ZGlmZiAtLWdpdCBhL0FuZHJvaWQuYnAgYi9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGYxMmM4Li4wMDAwMDAwCi0tLSBhL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLXN1YmRpcnMgPSBbCi0gICAgImNhbWVyYSIsCi0gICAgImRybS8qIiwKLSAgICAibWVkaWEvKiIsCi0gICAgInNlcnZpY2VzLyoiLAotICAgICJzb3VuZHRyaWdnZXIiLAotXQpkaWZmIC0tZ2l0IGEvQ2xlYW5TcGVjLm1rIGIvQ2xlYW5TcGVjLm1rCmluZGV4IDc5M2NiZjQuLmU1ODRmZmIgMTAwNjQ0Ci0tLSBhL0NsZWFuU3BlYy5taworKysgYi9DbGVhblNwZWMubWsKQEAgLTgxLDYgKzgxLDcgQEAKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyQDEuMC5zbykKICQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGlic3RhZ2VmcmlnaHRfc29mdF8qKQogJChjYWxsIGFkZC1jbGVhbi1zdGVwLCBybSAtcmYgJChQUk9EVUNUX09VVCkvc3lzdGVtL2xpYi92bmRrL2xpYnN0YWdlZnJpZ2h0X3NvZnRfKikKKyQoY2FsbCBhZGQtY2xlYW4tc3RlcCwgcm0gLXJmICQoUFJPRFVDVF9PVVQpL3N5c3RlbS9saWIvbGliYXVkaW9wb2xpY3llbmdpbmVjb25maWcqKQogCiAjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogIyBORVdFUiBDTEVBTiBTVEVQUyBNVVNUIEJFIEFUIFRIRSBFTkQgT0YgVEhFIExJU1QKZGlmZiAtLWdpdCBhL2FwZXgvQW5kcm9pZC5icCBiL2FwZXgvQW5kcm9pZC5icAppbmRleCA1NzU2MDNmLi5jNWRkNDIwIDEwMDY0NAotLS0gYS9hcGV4L0FuZHJvaWQuYnAKKysrIGIvYXBleC9BbmRyb2lkLmJwCkBAIC0xMiwyNSArMTIsMTA4IEBACiAvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAorYXBleF9kZWZhdWx0cyB7CisgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLWRlZmF1bHRzIiwKKyAgICBqYXZhX2xpYnM6IFsidXBkYXRhYmxlLW1lZGlhIl0sCisgICAgbXVsdGlsaWI6IHsKKyAgICAgICAgZmlyc3Q6IHsKKyAgICAgICAgICAgIC8vIEV4dHJhY3RvciBwcm9jZXNzIHJ1bnMgb25seSB3aXRoIHRoZSBwcmltYXJ5IEFCSS4KKyAgICAgICAgICAgIG5hdGl2ZV9zaGFyZWRfbGliczogWworICAgICAgICAgICAgICAgIC8vIEV4dHJhY3RvciBwbHVnaW5zCisgICAgICAgICAgICAgICAgImxpYmFhY2V4dHJhY3RvciIsCisgICAgICAgICAgICAgICAgImxpYmFtcmV4dHJhY3RvciIsCisgICAgICAgICAgICAgICAgImxpYmZsYWNleHRyYWN0b3IiLAorICAgICAgICAgICAgICAgICJsaWJtaWRpZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGlibWt2ZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGlibXAzZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGlibXA0ZXh0cmFjdG9yIiwKKyAgICAgICAgICAgICAgICAibGlibXBlZzJleHRyYWN0b3IiLAorICAgICAgICAgICAgICAgICJsaWJvZ2dleHRyYWN0b3IiLAorICAgICAgICAgICAgICAgICJsaWJ3YXZleHRyYWN0b3IiLAorICAgICAgICAgICAgXSwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIHByZWJ1aWx0czogWworICAgICAgICAibWVkaWFleHRyYWN0b3IucG9saWN5IiwKKyAgICBdLAorICAgIGtleTogImNvbS5hbmRyb2lkLm1lZGlhLmtleSIsCisgICAgY2VydGlmaWNhdGU6ICI6Y29tLmFuZHJvaWQubWVkaWEuY2VydGlmaWNhdGUiLAorCisgICAgLy8gVXNlIGEgY3VzdG9tIEFuZHJvaWRNYW5pZmVzdC54bWwgdXNlZCBmb3IgQVBJIHRhcmdldGluZy4KKyAgICBhbmRyb2lkTWFuaWZlc3Q6ICI6Y29tLmFuZHJvaWQubWVkaWEtYW5kcm9pZE1hbmlmZXN0IiwKKworICAgIC8vIElNUE9SVEFOVDogRm9yIHRoZSBBUEVYIHRvIGJlIGluc3RhbGxlZCBvbiBBbmRyb2lkIDEwIChBUEkgMjkpLAorICAgIC8vIG1pbl9zZGtfdmVyc2lvbiBzaG91bGQgYmUgMjkuIFRoaXMgZW5hYmxlcyB0aGUgYnVpbGQgc3lzdGVtIHRvIG1ha2UKKyAgICAvLyBzdXJlIHRoZSBwYWNrYWdlIGNvbXBhdGlibGUgdG8gQW5kcm9pZCAxMCBpbiB0d28gd2F5czoKKyAgICAvLyAtIGJ1aWxkIHRoZSBBUEVYIHBhY2thZ2UgY29tcGF0aWJsZSB0byBBbmRyb2lkIDEwCisgICAgLy8gICBzbyB0aGF0IHRoZSBwYWNrYWdlIGNhbiBiZSBpbnN0YWxsZWQuCisgICAgLy8gLSBidWlsZCBhcnRpZmFjdHMgKGxpYi9qYXZhbGliL2JpbikgYWdhaW5zdCBBbmRyb2lkIDEwIFNESworICAgIC8vICAgc28gdGhhdCB0aGUgYXJ0aWZhY3RzIGNhbiBydW4uCisgICAgbWluX3Nka192ZXJzaW9uOiAiMjkiLAorfQorCiBhcGV4IHsKICAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEiLAogICAgIG1hbmlmZXN0OiAibWFuaWZlc3QuanNvbiIsCi0gICAgbmF0aXZlX3NoYXJlZF9saWJzOiBbCi0gICAgICAgIC8vIEV4dHJhY3RvciBwbHVnaW5zCi0gICAgICAgICJsaWJhYWNleHRyYWN0b3IiLAotICAgICAgICAibGliYW1yZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYmZsYWNleHRyYWN0b3IiLAotICAgICAgICAibGlibWlkaWV4dHJhY3RvciIsCi0gICAgICAgICJsaWJta3ZleHRyYWN0b3IiLAotICAgICAgICAibGlibXAzZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYm1wNGV4dHJhY3RvciIsCi0gICAgICAgICJsaWJtcGVnMmV4dHJhY3RvciIsCi0gICAgICAgICJsaWJvZ2dleHRyYWN0b3IiLAotICAgICAgICAibGlid2F2ZXh0cmFjdG9yIiwKLSAgICAgICAgLy8gTWVkaWFQbGF5ZXIyCi0gICAgICAgICJsaWJtZWRpYTJfam5pIiwKKyAgICBkZWZhdWx0czogWyJjb20uYW5kcm9pZC5tZWRpYS1kZWZhdWx0cyJdLAorfQorCitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS1hbmRyb2lkTWFuaWZlc3QiLAorICAgIHNyY3M6IFsiQW5kcm9pZE1hbmlmZXN0LW1lZGlhLnhtbCJdLAorfQorCitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLWFuZHJvaWRNYW5pZmVzdCIsCisgICAgc3JjczogWyJBbmRyb2lkTWFuaWZlc3Qtc3djb2RlYy54bWwiXSwKK30KKworYXBleF9kZWZhdWx0cyB7CisgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtZGVmYXVsdHMiLAorICAgIGJpbmFyaWVzOiBbCisgICAgICAgICJtZWRpYXN3Y29kZWMiLAogICAgIF0sCi0gICAga2V5OiAiY29tLmFuZHJvaWQubWVkaWEua2V5IiwKKyAgICBwcmVidWlsdHM6IFsKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtbWVkaWFzd2NvZGVjLnJjIiwKKyAgICAgICAgImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtbGQuY29uZmlnLnR4dCIsCisgICAgICAgICJtZWRpYXN3Y29kZWMucG9saWN5IiwKKyAgICAgICAgIm1lZGlhc3djb2RlYy54bWwiLAorICAgIF0sCisgICAgdXNlX3ZlbmRvcjogdHJ1ZSwKKyAgICBrZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmtleSIsCisgICAgY2VydGlmaWNhdGU6ICI6Y29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5jZXJ0aWZpY2F0ZSIsCisKKyAgICAvLyBVc2UgYSBjdXN0b20gQW5kcm9pZE1hbmlmZXN0LnhtbCB1c2VkIGZvciBBUEkgdGFyZ2V0aW5nLgorICAgIGFuZHJvaWRNYW5pZmVzdDogIjpjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLWFuZHJvaWRNYW5pZmVzdCIsCisKKyAgICAvLyBJTVBPUlRBTlQ6IEZvciB0aGUgQVBFWCB0byBiZSBpbnN0YWxsZWQgb24gQW5kcm9pZCAxMCAoQVBJIDI5KSwKKyAgICAvLyBtaW5fc2RrX3ZlcnNpb24gc2hvdWxkIGJlIDI5LiBUaGlzIGVuYWJsZXMgdGhlIGJ1aWxkIHN5c3RlbSB0byBtYWtlCisgICAgLy8gc3VyZSB0aGUgcGFja2FnZSBjb21wYXRpYmxlIHRvIEFuZHJvaWQgMTAgaW4gdHdvIHdheXM6CisgICAgLy8gLSBidWlsZCB0aGUgQVBFWCBwYWNrYWdlIGNvbXBhdGlibGUgdG8gQW5kcm9pZCAxMAorICAgIC8vICAgc28gdGhhdCB0aGUgcGFja2FnZSBjYW4gYmUgaW5zdGFsbGVkLgorICAgIC8vIC0gYnVpbGQgYXJ0aWZhY3RzIChsaWIvamF2YWxpYi9iaW4pIGFnYWluc3QgQW5kcm9pZCAxMCBTREsKKyAgICAvLyAgIHNvIHRoYXQgdGhlIGFydGlmYWN0cyBjYW4gcnVuLgorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI5IiwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy1tZWRpYXN3Y29kZWMucmMiLAorICAgIHNyYzogIm1lZGlhc3djb2RlYy5yYyIsCisgICAgZmlsZW5hbWU6ICJpbml0LnJjIiwKKyAgICBpbnN0YWxsYWJsZTogZmFsc2UsCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtbGQuY29uZmlnLnR4dCIsCisgICAgc3JjOiAibGQuY29uZmlnLnR4dCIsCisgICAgZmlsZW5hbWU6ICJsZC5jb25maWcudHh0IiwKKyAgICBpbnN0YWxsYWJsZTogZmFsc2UsCit9CisKK2FwZXggeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBtYW5pZmVzdDogIm1hbmlmZXN0X2NvZGVjLmpzb24iLAorICAgIGRlZmF1bHRzOiBbImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtZGVmYXVsdHMiXSwKIH0KIAogYXBleF9rZXkgewpAQCAtMzgsMyArMTIxLDE5IEBACiAgICAgcHVibGljX2tleTogImNvbS5hbmRyb2lkLm1lZGlhLmF2YnB1YmtleSIsCiAgICAgcHJpdmF0ZV9rZXk6ICJjb20uYW5kcm9pZC5tZWRpYS5wZW0iLAogfQorCithcGV4X2tleSB7CisgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMua2V5IiwKKyAgICBwdWJsaWNfa2V5OiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5hdmJwdWJrZXkiLAorICAgIHByaXZhdGVfa2V5OiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5wZW0iLAorfQorCithbmRyb2lkX2FwcF9jZXJ0aWZpY2F0ZSB7CisgICAgbmFtZTogImNvbS5hbmRyb2lkLm1lZGlhLmNlcnRpZmljYXRlIiwKKyAgICBjZXJ0aWZpY2F0ZTogImNvbS5hbmRyb2lkLm1lZGlhIiwKK30KKworYW5kcm9pZF9hcHBfY2VydGlmaWNhdGUgeworICAgIG5hbWU6ICJjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmNlcnRpZmljYXRlIiwKKyAgICBjZXJ0aWZpY2F0ZTogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorfQpkaWZmIC0tZ2l0IGEvYXBleC9BbmRyb2lkTWFuaWZlc3QtbWVkaWEueG1sIGIvYXBleC9BbmRyb2lkTWFuaWZlc3QtbWVkaWEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZjQ1ODYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L0FuZHJvaWRNYW5pZmVzdC1tZWRpYS54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgcGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEiPgorICA8IS0tIEFQRVggZG9lcyBub3QgaGF2ZSBjbGFzc2VzLmRleCAtLT4KKyAgPGFwcGxpY2F0aW9uIGFuZHJvaWQ6aGFzQ29kZT0iZmFsc2UiIC8+CisgIDwhLS0gU2V0dGluZyBtYXhTZGsgdG8gbG9jayB0aGUgbW9kdWxlIHRvIFEuIG1pblNkayBpcyBhdXRvLXNldCBieSBidWlsZCBzeXN0ZW0gLS0+CisgIDx1c2VzLXNkaworICAgICAgYW5kcm9pZDptYXhTZGtWZXJzaW9uPSIyOSIKKyAgICAgIGFuZHJvaWQ6dGFyZ2V0U2RrVmVyc2lvbj0iMjkiCisgIC8+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvYXBleC9BbmRyb2lkTWFuaWZlc3Qtc3djb2RlYy54bWwgYi9hcGV4L0FuZHJvaWRNYW5pZmVzdC1zd2NvZGVjLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTUwODY0Ci0tLSAvZGV2L251bGwKKysrIGIvYXBleC9BbmRyb2lkTWFuaWZlc3Qtc3djb2RlYy54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0KKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIC0tPgorPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgcGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyI+CisgIDwhLS0gQVBFWCBkb2VzIG5vdCBoYXZlIGNsYXNzZXMuZGV4IC0tPgorICA8YXBwbGljYXRpb24gYW5kcm9pZDpoYXNDb2RlPSJmYWxzZSIgLz4KKyAgPCEtLSBTZXR0aW5nIG1heFNkayB0byBsb2NrIHRoZSBtb2R1bGUgdG8gUS4gbWluU2RrIGlzIGF1dG8tc2V0IGJ5IGJ1aWxkIHN5c3RlbSAtLT4KKyAgPHVzZXMtc2RrCisgICAgICBhbmRyb2lkOm1heFNka1ZlcnNpb249IjI5IgorICAgICAgYW5kcm9pZDp0YXJnZXRTZGtWZXJzaW9uPSIyOSIKKyAgLz4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9hcGV4L1RFU1RfTUFQUElORyBiL2FwZXgvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyZTk4Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDcgQEAKK3sKKyAgImltcG9ydHMiOiBbCisgICAgeworICAgICAgInBhdGgiOiAic3lzdGVtL2FwZXgvdGVzdHMiCisgICAgfQorICBdCit9CmRpZmYgLS1naXQgYS9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnBrOCBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEucGs4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkZjc0MWUKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnBrOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMuYXZicHVia2V5IGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmF2YnB1YmtleQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDU5NzIzCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmF2YnB1YmtleQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMucGVtIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLnBlbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzc5Y2QzCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLnBlbQpAQCAtMCwwICsxLDUxIEBACistLS0tLUJFR0lOIFJTQSBQUklWQVRFIEtFWS0tLS0tCitNSUlKS2dJQkFBS0NBZ0VBdkI2bE9FRU9SNThLTWNGbGF5RVpqc1h1UGdjZkhpL09QeGN2ZnBpR0xDcE9jSzNsCitPUENoV1V2RFJjSUhNQjdCTytDc2Z4czBIZ3NIdnZaZk55b05JbTk5V2NqRmJib2lPN1dyQkJBcklzelByMTRYCitjZlkyTnh6VDlMQmorRXFBbmJkTCs0T1FXMS9ucExITkUwcXREY3hMNzFpcGJqU3VLTmI1OEU5cUdMMEt3dmtTCitmd3d1ZVdqKytiZy9pejdkcTBtejdpS3BueFlzY05tNFJoSmpxY0cyVXNtZzRFamhyOGg1VW1PVW1USmJPYkMvCit2ekNsWFFxZWV1elM4TlR0R1ZnUS9DSTlnQzJXTjl1cHEycC8yVDdQNFUzbzNDV3ZCeXRVb0xLUjBVeUM4M2V5CitTOFhKZ09hNDJ1V1IzVC9lSk9JMVpTNEg2U3JnMW8yWEM4WWI4RXByRkkvTk02LysvNURYL0ZnRGltc3NsQVA2CitRcTQrcFN0ZTl2L0ZqV0dxeTdRQlFhZWZGUkdSdVM2M3hIY1NaaFhDOUoyQ0ZkbnhvOCs2NVFUOHI0eWZRRWVpCitBeC8wUTk0eUI3VklMMXBJSnhIRW9uS2p0ZDNpS2RGRUtRekFESjNlZHNtdEh5YkVSZEpLQ3hjbTlRSXJEQ3NDCis0WVZUOW5YME9vQzlSRDVkNUVWRDdXNUk2ZUVuUnU2aWdyS0lLZ1VWcHBlWUZRTlpEK28rZWlOSmE0eW9nZ1JsCitoOHNUMC94TEtqTVJ4QVE3ZmFmaTFqK0xCMk83VWdKbUlEREFuaWRxOEFvejdoM3BOaTEzOXJOV3JqTmZ3aHVzCituTWNadkw5ZFRWdjI2SldlRVNIUC96QWZBWDdqMXJma0R3UjAyb2NSTHF1d0VVczErVUhBMjdXaTFiTUNBd0VBCitBUUtDQWdBTzNQVDgzdGI3L2FyV2g0czF6YVd4VEI0b3RITlc5VHY4YkI2S2lBNkJ5czNyeFRHSk1DbnZYamNOCitlZWtMZWtLV01vZ3VlcjNCYWVtd3d0Si9EMGwrWVFTc1pWcUQ4dUxsaU5MOFBUTExTeGRWcWI5OGQ1R05CVEFSCis4eVhTNWtBSE5nWkExd0krMWZMOVpqYm53VXl1L0djN2YrdlRFMEozWTVUWDBjNTJLZW1Cd2lBZC9aNW1aVTlQCis5Nmk5bmJmeDRwN2V2OHBiRVd0dGR5WkNFdzNneWJkWUR5b3d6bEZXakNaWnhoaGxpajcrN2VJWWZ3Vnh0bmNUCitDMGNYVkJ0dmx5K3dYQnd6MW1ZNS81Y0dQaUhmemtDcWNuZGxmV3k0eWttamNMaG9xdnpsczUxWXMwWGFjMkJECittMFBORVZEQjVVV0d1djVSQTl4RDEyZ0p2QnRVM0Q3Z2dNdzZDNVJjWEpUK2pTWW1TRnREMmtsV2krSXQ4QS9OCitIdjQyc29Lc2t0NkpxWUFXRTFjdkozUEVxSDlBU0VKTnEyUjBaL1BtdU0wMDBVSnl6VTlLSWQzU053alhBMVhjCitLbjloUmdhNHVmOWVsSFRqa1REdDc5LzgrWHY3aGplcjlzRi9TL25wN2cwNHJVaklXa3VGa0MvN05LMnRRU2gxCittbGpWMXNEOVNGNERQZlZLNzVMd0pKYVFVbEk3VHRHZDVLSjdGelp3dmIrdzhPRHJwVzNoa3Q2RmNJNkt3RS9hCitRVDFUMlo5RGtuWEpTWU5kV0dyajZ2TUhzWU1peXo4SWRBSFNDck9CNmVYQ1F4cGl0Ym42VzcxUmF3N2Y5VWFaCitWREs1QWhUVTQ5M2hrR2oxbm80Y0p3ZWNYSW5NaWdnL2M0eXdrMkliaDZJVjhPMG5rUUtDQVFFQTIrZFFRMElGCit2dlZnbVEyV3hIQkQ3TTJtYk95ZjQzWUJZNkthNm9QQk5HUFZwWkU4WDhMb1RhdlFMVitTZ0NrSDhUNmdZN1hTCis1TDRaZTBKRnhmdWEwbzFybTYrTDJYck94NUYvQTJZNDBZY1BjbEVpazVoMXdvU3dIL0oxaUhHaUVoWThOcWV1Cis5R0N2alFvamtnWHgvUm4zTnorbHB2WjMyOU8zSDg1UldXR0YwbDYwUndMT2tpZzBad1ViNjE5dDhhZmZtR0lsCitzeGREdjJuZnk3T3RKWDhpR0R1YTdLZjY0ZHZWV1FLS3RBQ1drQVJybGtjV1gzdW9FU3hrcFNEeHVlK3o3bmRICitvN3VITGZNOFR4K1JuK1F2WVd1Ulc1VFBMYkVETWJJWXJYNjVJU3Qyci9UN3YvMDRYZEFDOFlwQ1FSeXRscVBJCitmcERtMTVodHlIQml6UUtDQVFFQTJ2KzVvdFJvWTU2SmR1SVNhVkdsc0ovSWJ2S3pEQUl5V21NMTRFcFJDUjVFCitsdStNcFRjUkFpRlFBYkhHWHIxdE1sVEZkVkZEMDkwV0F6SUthS3RBREZWTFhvYklIZUdzcG5SQ3E1T3BWcDlXCitSdkx0VndMeGZsSEFjMnlOOS9MTnRuQnFIVWd0K1MwMUxCUEVseWJkR0hRUlR0cUFLWGhrcDMxc00yMU8zNEdvCitQcmkvSXhndXBXeHlrTWFXNDRLaWcxQ3I1REt2Yzhjd1VzR3V5RGRKbThvQlFlTlBUTVdxU25YdHFvVFdTYVlnCisya3hpTVRGb2tya1NYZ3VmYjh3bmc2T1h0L1FlbHl3cmhHM2hBc2xkUE8zR2RLaWREU3hoV1pTZ3BVWFhGZEFYCit5NEdPMEljUkpCRi9XSnRZVFl0UitsODRuUUEyLzFZZTR1akZsVDBhZndLQ0FRRUFtWHJYcFNtMmN2STJDbnpXCitocUpJZGtXT2E2VzNibjFWT09JcnQ1UmZ5NTRHWm5sNHB1bVZVMmlnY3BxcTJISkt6ZERGQnZMSGo4a3laYm42CitrdFVwMk56Rmh6SzlxL3V2eU5BKzB2T01vb2plZWc0dzBNenZHK1dhTzZIdzhGdEhIOUtQRWlKMDFMR0t0U2luCitiT3BqWENDOFQ3NUhjc0hCSkJlZlR6Nmp2bnQzZUQyTEc2alUzbVBiTnkvMHJaRzhYWmFxVTJQbEpoc051TkkvCitWYUJCTDlPTXkxY0dxVGdRdllTK1lsS0kxbHMydXF1ckg0YmNFYVp2eGhTeTVpR1pOUW9kRGtvSUlUbm9mbVN1Cis2aGFCZ0JRMkVZdVBOMWtrUktLd05RWTFmUm5lUWsxZ21DeW5iUGRpV08rdXJrQ3VQMTJ4dGxyM3U0YU01MXJHCisvTWViM1FLQ0FRRUExMlN4Wm05WGhMT0hMSUJKNzRBNFlMR201MGlaeFhQYnBuN3huSG83bmFaQmU5cDhFSHRLCitwVGV5Z3hnZ3JVbk9QclNWeVQ5MllNaVFQL0JWd0lDK2ErTHdVRFpzV01kL2tlL0RLeEgrZVk0Wnc0cG0yUyt4Cis2YlhxZlJ3RnZocjNMVHIvZzNGY2xqbGFsTkdVaDczWHM1ZGs5cE45Zmt4RlkxNitydzRSaDA3MDlVdXI0bzZFCitRbnVaYXIrSDVKaTEwa1hqNm52WGlSNGVieWJFQzNRbFY2Nms4ZkxxS2U0NEFTaGY2MWpma214czM0aEZBM0UvCitFeUFuNm91djhydHZHZEFyQnVoNXRlSGhvMHlYQkxDY25iS1hnR0hlcGZoQ2YyTHBaZVI5R1owajZpcXhGblBoCis3Z0d2cUt5UmV5Tk9LOXkveDl0UVBHNnR6aXQzT2NOeGJRS0NBUUVBdURoZURPU2tYUG9wWE12TEFLT0hCSWRaCityYlE3b0ZUREh0NTlnYnVjTTdVOC9sMll0YXh1S09RRkJMbnpRYS9hbUlra3J0a2xZd09zejhFMjRkN05tMzl3Cit5a0xId1gwWHJtakFtNk00WEttRHY2NmEra1NuU1Y2TEViS1pkanZYUDAyRFYrdEdlWjVWc25OdkpEcXV4TXNECitmdlJUc3BCOGo4Q3BVOTZzemVreGwvdENSaHFiZHcvNGtWVFNqNUJGKytPYVJSY0pyQXlqMUIycWYxeW5BWkUxCitnVXZWUGtFWWE5MTR6Y3J4ZzlYSVhUNE03eXFCN2k4S0plZ090T3RjV2pKN3VUaVArNjM4QXZ5Z0pMTUpuU3JWCisrSGpGWldHNlA5YnRabUxIU0VCUnZ3R09BaWxwMHFlalhvODY2bDBmbW5sR3k3ZWhLejh1M1B6dm5sUFlqUT09CistLS0tLUVORCBSU0EgUFJJVkFURSBLRVktLS0tLQpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLnBrOCBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5wazgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVhNDIxNgotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5wazgKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLng1MDkucGVtIGIvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLng1MDkucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YjliNGYKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMueDUwOS5wZW0KQEAgLTAsMCArMSwzNCBAQAorLS0tLS1CRUdJTiBDRVJUSUZJQ0FURS0tLS0tCitNSUlGM2pDQ0E4YWdBd0lCQWdJSkFJTTcySnBENHY2WE1BMEdDU3FHU0liM0RRRUJDd1VBTUlHQ01Rc3dDUVlECitWUVFHRXdKVlV6RVRNQkVHQTFVRUNBd0tRMkZzYVdadmNtNXBZVEVXTUJRR0ExVUVCd3dOVFc5MWJuUmhhVzRnCitWbWxsZHpFUU1BNEdBMVVFQ2d3SFFXNWtjbTlwWkRFUU1BNEdBMVVFQ3d3SFFXNWtjbTlwWkRFaU1DQUdBMVVFCitBd3daWTI5dExtRnVaSEp2YVdRdWJXVmthV0V1YzNkamIyUmxZekFnRncweE9UQXlNVEV3TWpFeE1URmFHQTgwCitOelUzTURFd056QXlNVEV4TVZvd2dZSXhDekFKQmdOVkJBWVRBbFZUTVJNd0VRWURWUVFJREFwRFlXeHBabTl5CitibWxoTVJZd0ZBWURWUVFIREExTmIzVnVkR0ZwYmlCV2FXVjNNUkF3RGdZRFZRUUtEQWRCYm1SeWIybGtNUkF3CitEZ1lEVlFRTERBZEJibVJ5YjJsa01TSXdJQVlEVlFRRERCbGpiMjB1WVc1a2NtOXBaQzV0WldScFlTNXpkMk52CitaR1ZqTUlJQ0lqQU5CZ2txaGtpRzl3MEJBUUVGQUFPQ0FnOEFNSUlDQ2dLQ0FnRUFzcVhFMEFJV3BMVzlUZ3EyCituUUdwaDdLWjZMMlE5b3h2aXFDVkh4SWFQcWZoTTJTd1RieWNBRElRZXFycmxSeGhkZFZrakx1TVVrSmE3bWV2CitmRVJtZ3BpT2ZuUElsR0s2UFRzMmdsakNrc2taaEYzYmdmZXl1SHQwdHNZTytVYU44TVZvWkQ3L1FkaUU0NncyCitPTURDbEcxVXFnaXFPQmhMVEVOL2NIWE9iblVpaVZYVVlxTjhhWVpmNkw2RnMzeVFpMlpaZ2ZieFRWRmV3cWR2CithTExPcUNZblZZWFpIK1p4YlhFU0EwTStXWEtnUktzWVRqMkdZczNla28xckZpNFk2dUhWTHg0NXlhb1Q1dS9pCitTeFBFa29jeU1DS3ZHSld1NFhsU09kM0VqU09NYXFDT1lWeUdMeGRsblFXUVU3UFpEcUJTSjBTeXNXZ3BGSHBCCitJMTVjMmpoUmRYT0NmUTladERmUFprRTBhMkE4a0pEQW9GMW16VHA2SXZCQVdVc2w1bkhQdzVDV2tGcE5hZC9oCit0cXFHQ1NjV2JpS1p1dnJRNC9SUU5tM2YxSytteFg5VHJqRmlncHFOTzZkNHBHQW8xZmE2c0hSM3hXUHcvbXlxCitoNVpKalZuWFU1WXE2NFM0eFdPc3NmanBPZzdSZk51dnp1azNvazNNWXMxbWJ4M3ZoWk9qNWttMWYzcXJnWDljCittWGpZbnlYRDBqSkJtNHVBSldYTGRLOVBsWnZsWGJ6dE1DellqODMySW80cEZMQ3RTeGt6WDc1dDFlbTM2TnYwCittTnA2TnRTU3k2U0ZTcThsN0lzWFYyRk55VWl5SFd4Uy9VUW04cFlnNVE1ZFdIdkVFRjc4UDZsVjB3UmE2RlFsCitCQlNncHFUQUkwOTJLSWpERHRCN0dRQ2dWNUVDQXdFQUFhTlRNRkV3SFFZRFZSME9CQllFRkFGSWRGVERFRGZ0Citld1NTQVM3RmEzT1o1VFh6TUI4R0ExVWRJd1FZTUJhQUZBRklkRlRERURmdGV3U1NBUzdGYTNPWjVUWHpNQThHCitBMVVkRXdFQi93UUZNQU1CQWY4d0RRWUpLb1pJaHZjTkFRRUxCUUFEZ2dJQkFDNWUzelh5dGhKQ0dtejFGbUFWCis4WS9VSStHbGc2RzB4L2swNFdhUkcwRFBMTGpsSjFGMExNMS9JUmVCU2dYY1lBTDBDQWdQeWNmL3JHUE9nTUZtCit0UXhZeWpCVXhLZGpwSXFVNURKb1YxZmVhbkd2ZUlScHRvMVlSS05nSHV6RzlyWkdSNEFnUG50Nlg0WXhscTA0CitsSTdRcFdhZFhlMW15QVJKaGozbmlTTlk5KzJ3RUlua3g0WnVDTzFMdElHcW5iZGM4alE4WW9WcUlFNU40a3VNCitjY3lQWWdzZEFCdG9wYmpOOTJydWV1OHNmRjhSNlJPeSt0TmdiNk9qcEFBZXZ0bkJmWjJMWHFmT2JLaXJIQ0srCitrNnc0V1NCMVVVb1ozWGd6OHNKdFhnb2t2WWVJbmtOOHRIdVRhZ0hZVTJWUVRjQTByZEJHTU4vMU9sakpwV2xOCiswVVVxNGZBWVU2Y040bEh4cjJMTTlJZjRXdkF6ZExBV3ZhSVpyRHFhVTRpL3pZVDlsNnJSNGxDMktXM0VIV292CituUFhmZ0VKSjhBUDFpUkdpYnZldzNpM1NCNlhUV0ZRWVRVSUJlSmZEei9LRFhRYWJQK3l6WFdJU2RaQ1VNVXB4CitmK1JhcXNiNU1vS2FKZFZnblNMMG1CdW5qQ3lKRHp6ZzM0SjdvR3g2L0Jud29pT3J3TE40UWF6NVU4amJyUFN4CitwOUxmbGVDY083WmRlRThHS3F4MFgxVDRkN3RyYWR0bXhPUzhJd3I0bmlza2tIR1Jrem96dlZ2dXlHS21vTjJrCisxNjJWZmpxK2RkajdxRXBTaDNCUzZoSFUrdmxNYkM5TDB0ckd4UHhGRUFIRHJ3dTBLd0dOZHVUa2l1LzNqdmZCCitKVGdIOFA5bUQxbG9ZeFJkbyt2ZXQ4ZVEKKy0tLS0tRU5EIENFUlRJRklDQVRFLS0tLS0KZGlmZiAtLWdpdCBhL2FwZXgvY29tLmFuZHJvaWQubWVkaWEueDUwOS5wZW0gYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLng1MDkucGVtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OTA4ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhLng1MDkucGVtCkBAIC0wLDAgKzEsMzMgQEAKKy0tLS0tQkVHSU4gQ0VSVElGSUNBVEUtLS0tLQorTUlJRnpEQ0NBN1NnQXdJQkFnSUpBTzA1REJCdXNhYUxNQTBHQ1NxR1NJYjNEUUVCQ3dVQU1Ib3hDekFKQmdOVgorQkFZVEFsVlRNUk13RVFZRFZRUUlEQXBEWVd4cFptOXlibWxoTVJZd0ZBWURWUVFIREExTmIzVnVkR0ZwYmlCVworYVdWM01SQXdEZ1lEVlFRS0RBZEJibVJ5YjJsa01SQXdEZ1lEVlFRTERBZEJibVJ5YjJsa01Sb3dHQVlEVlFRRAorREJGamIyMHVZVzVrY205cFpDNXRaV1JwWVRBZ0Z3MHhPVEF4TWpVeE56RTNNVGRhR0E4ME56VTJNVEl5TVRFMworTVRjeE4xb3dlakVMTUFrR0ExVUVCaE1DVlZNeEV6QVJCZ05WQkFnTUNrTmhiR2xtYjNKdWFXRXhGakFVQmdOVgorQkFjTURVMXZkVzUwWVdsdUlGWnBaWGN4RURBT0JnTlZCQW9NQjBGdVpISnZhV1F4RURBT0JnTlZCQXNNQjBGdQorWkhKdmFXUXhHakFZQmdOVkJBTU1FV052YlM1aGJtUnliMmxrTG0xbFpHbGhNSUlDSWpBTkJna3Foa2lHOXcwQgorQVFFRkFBT0NBZzhBTUlJQ0NnS0NBZ0VBbU5rVnhVYnAvYkxiZUdidktxWVh6d0J5Y1NEcG1PaGgvLy9sTkdZUQorL0FNVUQwcTZFYVp6VTJiZDRhTDByT0dxZm9ZbGhLZDBrTVZtTVVtZmRFOU9EQWZLeGxlRWVFYVJsMkdKUzhhOQorQUJpNzcwbDNHSGJCMnhNSTJzRVdlT0Q5eHNQRkY2K0J5UFptb1V1TmhNcjRwVWJYc0RwRTNoOGxqcmdYSHRJZworYmg3b2ZidmRkcnV3QlYwbFMxazlPWjlqUFZHaEVLa0puaGdRYTY3Y3dnZGppekFNYkkwRGN6OWd0TU1hd3NEagorWjJhUWQxcit2eGdoMS9Ya0kvTk1tWENuRzJFUnl0WGNKZUM1UzRnRXRIZlRUUG9QMEZ1VmdTQjZ5NmRhbE11WgorRjBOQlp3OE12Z2R5M1FKaXAwdU5hMzZKNjNDTVpLVEpXYlRkbEZwUEwyaGswUGdhWXZqZThDNVh0azUyODJ3VAorZE1vY2M4bjJ6SVhiemJuU1hHdmpjTlppYjNQZnU1NVlVblg2ZVRxWjFCeGxKMEZIWkFzQzRxdUZGV1h4WUJZRAorTENSb05ORkV0SURRcHV2dUhGMkR1SE5EVUxwQVFqeTJ5Nis3ZW90MEtFc1ZvRG1aNEg4QnB1QVZWdTJTeFlOYgorZ1lmbFI5U21NMHRtWWVBY1JUNDhxM3hyb2NHeUVITXF2Z1FSVXBQZnZjdC84bDh4VmNEek9JL3NKVkRxbVl6TQordTBDajNma1N5cEdESk9NRi9lc0ZTbVZ2b0kwMXRTN2thTlM1dnZ0S1lpYi8veHFLUkM5ZjBkQ3NHZkZMbnVVSworbzRLWWJZV1l3TXlKcUVkLzUvWnZYeUtJUEFFZUpMMTc0TDkrd1RrYzNjUXBvQndKTjR0KzJFNU1uaE9FcTZkbworNUwwQ0F3RUFBYU5UTUZFd0hRWURWUjBPQkJZRUZIak5LL0daa28xUmRacCs4aWF2V1hMNXh6OXdNQjhHQTFVZAorSXdRWU1CYUFGSGpOSy9HWmtvMVJkWnArOGlhdldYTDV4ejl3TUE4R0ExVWRFd0VCL3dRRk1BTUJBZjh3RFFZSgorS29aSWh2Y05BUUVMQlFBRGdnSUJBQ21QUU1rc3VMck5WMXZiSTQ0UzFmNzBJMEZIZEJ4Y2hGR0IzOXp1TGJjbgorU3NZb20vTFB0WUppRDBEbDRiQjRlYitabnhrUVAyWGVQNnB5Y21VSDJqMUVXZXhGd3ZkVXZsZmU4UXord0FlYworYXA0QXhpWDRaMktlMml2WW90SVpGVUhkWk9Ma1gyMGpzOFdleDFtelk0M01MUW41QVBsOWdLMVZaVHhEZ2dlUgorRU9iSDFTK0pWakd3UXFZWmoyZTZnTlpIMzRRMjVOUTY5OFJMODVHRGtZdFNJU0FpZkp0YUpzVS9CM3ZLbTgySQorazl4TWlDb29DSDZiUmRHSEcxanplNFNScGlkanhFbThjeGtpYVFhZ2ZjdVhlQ0x6aVhKcjNxQU1LWWlFWTZicAorMCtiQXFDdDNTOE9yck4zUlFaZlFybmx3aXRzTTFqSkovK0MrV29EZzRlWTVBRnJYREx2TmVLaDFxTy9mOHh2KworZkNYa1FQY1ZWcGhMZlJIOW94TnJTZ09XQlA1L3FJREg0czFZVUw5bHVHVDZIKzA4ZGx1ZTNSa2J6RGJCcXNRdQorN2ZRL0JicklHL0d1VktneUVNK2E3Qzlndjd6Yzg2WWx1ZVZZSkV5eEtpZG5uN1J4T3F5REJxeXlmWEEzenZtZQorUnJvN3hJck1IUEw3TnUzQVdqd2pYemJwL3cweit0RUZQc2ZWQitPT0hLc1dQY1VHMEhVVEpHa3llTy91SFJqTgorcVBFa2tmN0JISFVPNFYyZ2pPSWRDc0VMeEt3SGY3dnNaVE9rNDBFVjc1MWZaN0ZESE1yMWVkZFFrZ0g0ZXFBYgorREI3OXVQK1NMZlVvKzQybjRxNmVNbW9xdzhkNzZiQlhSb1VoSW8vTXM0c2ViaFYwc1J0QVM2N09RaW9jOVVVZworLS0tLS1FTkQgQ0VSVElGSUNBVEUtLS0tLQpkaWZmIC0tZ2l0IGEvYXBleC9sZC5jb25maWcudHh0IGIvYXBleC9sZC5jb25maWcudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNmFmODMKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L2xkLmNvbmZpZy50eHQKQEAgLTAsMCArMSwxNDUgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgQmlvbmljIGxvYWRlciBjb25maWcgZmlsZSBmb3IgdGhlIG1lZGlhIHN3Y29kZWMgQVBFWC4KKyMKKyMgVGhlcmUgYXJlIG5vIHZlcnNpb25lZCBBUEVYIHBhdGhzIGhlcmUgLSB0aGlzIEFQRVggbW9kdWxlIGRvZXMgbm90IHN1cHBvcnQKKyMgaGF2aW5nIHNldmVyYWwgdmVyc2lvbnMgbW91bnRlZC4KKworZGlyLnN3Y29kZWMgPSAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjL2Jpbi8KKworW3N3Y29kZWNdCithZGRpdGlvbmFsLm5hbWVzcGFjZXMgPSBwbGF0Zm9ybSxzcGhhbAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICJkZWZhdWx0IiBuYW1lc3BhY2UKKyMKKyMgVGhpcyBuYW1lc3BhY2UgaXMgZm9yIHRoZSBiaW5hcmllcyBhbmQgbGlicmFyaWVzIG9uIHRoZSBzd2NvZGVjIEFQRVguCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKK25hbWVzcGFjZS5kZWZhdWx0Lmlzb2xhdGVkID0gdHJ1ZQorbmFtZXNwYWNlLmRlZmF1bHQudmlzaWJsZSA9IHRydWUKKworbmFtZXNwYWNlLmRlZmF1bHQuc2VhcmNoLnBhdGhzICAgICAgPSAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLyR7TElCfQorbmFtZXNwYWNlLmRlZmF1bHQuYXNhbi5zZWFyY2gucGF0aHMgPSAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLyR7TElCfQorCisjIEJlbG93IGxpbmVzIGFyZSByZXF1aXJlZCB0byBiZSBhYmxlIHRvIGFjY2VzcyBsaWJzIGluIEFQRVhlcyB3aGljaCBhcmUKKyMgYWN0dWFsbHkgc3ltbGlua3MgdG8gdGhlIGZpbGVzIHVuZGVyIC9zeXN0ZW0vbGliLiBUaGUgc3ltbGlua3MgZXhpc3QgZm9yCisjIGJ1bmRsZWQgQVBFWGVzIHRvIHJlZHVjZSBzcGFjZS4KK25hbWVzcGFjZS5kZWZhdWx0LnBlcm1pdHRlZC5wYXRocyAgID0gL3N5c3RlbS8ke0xJQn0KK25hbWVzcGFjZS5kZWZhdWx0LmFzYW4ucGVybWl0dGVkLnBhdGhzID0gL3N5c3RlbS8ke0xJQn0KKworbmFtZXNwYWNlLmRlZmF1bHQubGlua3MgPSBwbGF0Zm9ybQorCisjIFRPRE86IHJlcGxhY2UgdGhlIGZvbGxvd2luZyB3aGVuIGFwZXggaGFzIGEgd2F5IHRvIGF1dG8tZ2VuZXJhdGUgdGhpcyBsaXN0CisjIG5hbWVzcGFjZS5kZWZhdWx0LmxpbmsucGxhdGZvcm0uc2hhcmVkX2xpYnMgID0gJUxMTkRLX0xJQlJBUklFUyUKKyMgbmFtZXNwYWNlLmRlZmF1bHQubGluay5wbGF0Zm9ybS5zaGFyZWRfbGlicyArPSAlU0FOSVRJWkVSX1JVTlRJTUVfTElCUkFSSUVTJQorbmFtZXNwYWNlLmRlZmF1bHQubGluay5wbGF0Zm9ybS5zaGFyZWRfbGlicyA9IGxpYkVHTC5zbzpsaWJHTEVTdjFfQ00uc286bGliR0xFU3YyLnNvOmxpYkdMRVN2My5zbzpsaWJSUy5zbzpsaWJhbmRyb2lkX25ldC5zbzpsaWJjLnNvOmxpYmNncm91cHJjLnNvOmxpYmNsYW5nX3J0LmFzYW4tYWFyY2g2NC1hbmRyb2lkLnNvOmxpYmNsYW5nX3J0LmFzYW4tYXJtLWFuZHJvaWQuc286bGliY2xhbmdfcnQuaHdhc2FuLWFhcmNoNjQtYW5kcm9pZC5zbzpsaWJjbGFuZ19ydC5hc2FuLWk2ODYtYW5kcm9pZC5zbzpsaWJjbGFuZ19ydC5hc2FuLXg4Nl82NC1hbmRyb2lkLnNvOmxpYmRsLnNvOmxpYmZ0Mi5zbzpsaWJsb2cuc286bGlibS5zbzpsaWJtZWRpYW5kay5zbzpsaWJuYXRpdmV3aW5kb3cuc286bGlibmV1cmFsbmV0d29ya3Muc286bGlic3luYy5zbzpsaWJ2bmRrc3VwcG9ydC5zbzpsaWJkbF9hbmRyb2lkLnNvOmxpYnZ1bGthbi5zbworCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjICJwbGF0Zm9ybSIgbmFtZXNwYWNlCisjCisjIFRoaXMgbmFtZXNwYWNlIGlzIGZvciBsaW5raW5nIHRvIExMTkRLIGFuZCBBU0FOIGxpYnJhcmllcyBvbiB0aGUgc3lzdGVtLgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCituYW1lc3BhY2UucGxhdGZvcm0uaXNvbGF0ZWQgPSB0cnVlCisKK25hbWVzcGFjZS5wbGF0Zm9ybS5zZWFyY2gucGF0aHMgID0gL3N5c3RlbS8ke0xJQn0KK25hbWVzcGFjZS5wbGF0Zm9ybS5zZWFyY2gucGF0aHMgKz0gL2FwZXgvY29tLmFuZHJvaWQucnVudGltZS8ke0xJQn0KK25hbWVzcGFjZS5wbGF0Zm9ybS5hc2FuLnNlYXJjaC5wYXRocyAgPSAvZGF0YS9hc2FuL3N5c3RlbS8ke0xJQn0KK25hbWVzcGFjZS5wbGF0Zm9ybS5hc2FuLnNlYXJjaC5wYXRocyArPSAgICAgICAgICAgL3N5c3RlbS8ke0xJQn0KK25hbWVzcGFjZS5wbGF0Zm9ybS5hc2FuLnNlYXJjaC5wYXRocyArPSAvYXBleC9jb20uYW5kcm9pZC5ydW50aW1lLyR7TElCfQorCisjIC9zeXN0ZW0vbGliL2xpYmMuc28sIGV0YyBhcmUgc3ltbGlua3MgdG8gL2FwZXgvY29tLmFuZHJvaWQubGliL2xpYi9iaW9uaWMvbGliYy5zbywgZXRjLgorIyBBZGQgL2FwZXgvLi4uIHBhdGggdG8gdGhlIHBlcm1pdHRlZCBwYXRocyBiZWNhdXNlIGxpbmtlciB1c2VzIHJlYWxwYXRoKDMpCisjIHRvIGNoZWNrIHRoZSBhY2Nlc3NpYmlsaXR5IG9mIHRoZSBsaWIuIFdlIGNvdWxkIGFkZCB0aGlzIHRvIHNlYXJjaC5wYXRocworIyBpbnN0ZWFkIGJ1dCB0aGF0IG1ha2VzIHRoZSByZXNvbHV0aW9uIG9mIGJpb25pYyBsaWJzIGJlIGRlcGVuZGVudCBvbgorIyB0aGUgb3JkZXIgb2YgL3N5c3RlbS9saWIgYW5kIC9hcGV4Ly4uLiBpbiBzZWFyY2gucGF0aHMuIElmIC9hcGV4Ly4uLgorIyBpcyBhZnRlciAvc3lzdGVtL2xpYiwgdGhlbiAvYXBleC8uLi4gaXMgbmV2ZXIgdHJpZWQgYmVjYXVzZSBsaWJjLnNvCisjIGlzIGFsd2F5cyBmb3VuZCBpbiAvc3lzdGVtL2xpYiBidXQgZmFpbHMgdG8gcGFzcyB0aGUgYWNjZXNzaWJpbGl0eSB0ZXN0CisjIGJlY2F1c2Ugb2YgaXRzIHJlYWxwYXRoLiAgSXQncyBiZXR0ZXIgdG8gbm90IGRlcGVuZCBvbiB0aGUgb3JkZXJpbmcgaWYKKyMgcG9zc2libGUuCituYW1lc3BhY2UucGxhdGZvcm0ucGVybWl0dGVkLnBhdGhzID0gL2FwZXgvY29tLmFuZHJvaWQucnVudGltZS8ke0xJQn0vYmlvbmljCituYW1lc3BhY2UucGxhdGZvcm0uYXNhbi5wZXJtaXR0ZWQucGF0aHMgPSAvYXBleC9jb20uYW5kcm9pZC5ydW50aW1lLyR7TElCfS9iaW9uaWMKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAic3BoYWwiIG5hbWVzcGFjZQorIworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworbmFtZXNwYWNlLnNwaGFsLmlzb2xhdGVkID0gdHJ1ZQorbmFtZXNwYWNlLnNwaGFsLnZpc2libGUgPSB0cnVlCisKKyMgS2VlcCB0aGUgYmVsb3cgaW4gc3luYyB3aXRoICJzcGhhbCIgbmFtZXNwYWNlIGluIHN5c3RlbSdzIC9ldGMvbGQuY29uZmlnLnR4dAorIyBDb2RlYzIgaGFzIGRlcGVuZGVuY2llcyBvbiBzb21lIFNQLWhhbHMgKGVnLiBhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckAyLjApCisjIFRoZXNlIGFyZSBkbG9wZW4nZWQgYnkgbGlidm5ka3N1cHBvcnQuc28uCituYW1lc3BhY2Uuc3BoYWwuc2VhcmNoLnBhdGhzICA9IC9vZG0vJHtMSUJ9CituYW1lc3BhY2Uuc3BoYWwuc2VhcmNoLnBhdGhzICs9IC92ZW5kb3IvJHtMSUJ9CisKK25hbWVzcGFjZS5zcGhhbC5wZXJtaXR0ZWQucGF0aHMgID0gL29kbS8ke0xJQn0KK25hbWVzcGFjZS5zcGhhbC5wZXJtaXR0ZWQucGF0aHMgKz0gL3ZlbmRvci8ke0xJQn0KK25hbWVzcGFjZS5zcGhhbC5wZXJtaXR0ZWQucGF0aHMgKz0gL3ZlbmRvci8ke0xJQn0vaHcKK25hbWVzcGFjZS5zcGhhbC5wZXJtaXR0ZWQucGF0aHMgKz0gL3N5c3RlbS92ZW5kb3IvJHtMSUJ9CisKK25hbWVzcGFjZS5zcGhhbC5hc2FuLnNlYXJjaC5wYXRocyAgPSAvZGF0YS9hc2FuL29kbS8ke0xJQn0KK25hbWVzcGFjZS5zcGhhbC5hc2FuLnNlYXJjaC5wYXRocyArPSAgICAgICAgICAgL29kbS8ke0xJQn0KK25hbWVzcGFjZS5zcGhhbC5hc2FuLnNlYXJjaC5wYXRocyArPSAvZGF0YS9hc2FuL3ZlbmRvci8ke0xJQn0KK25hbWVzcGFjZS5zcGhhbC5hc2FuLnNlYXJjaC5wYXRocyArPSAgICAgICAgICAgL3ZlbmRvci8ke0xJQn0KKworbmFtZXNwYWNlLnNwaGFsLmFzYW4ucGVybWl0dGVkLnBhdGhzICA9IC9kYXRhL2FzYW4vb2RtLyR7TElCfQorbmFtZXNwYWNlLnNwaGFsLmFzYW4ucGVybWl0dGVkLnBhdGhzICs9ICAgICAgICAgICAvb2RtLyR7TElCfQorbmFtZXNwYWNlLnNwaGFsLmFzYW4ucGVybWl0dGVkLnBhdGhzICs9IC9kYXRhL2FzYW4vdmVuZG9yLyR7TElCfQorbmFtZXNwYWNlLnNwaGFsLmFzYW4ucGVybWl0dGVkLnBhdGhzICs9ICAgICAgICAgICAvdmVuZG9yLyR7TElCfQorCisjIEtlZXAgdGhlIGJlbG93IGluIHN5bmMgd2l0aCAidm5kayIgbmFtZXNwYWNlIGluIHN5c3RlbSdzIC9ldGMvbGQuY29uZmlnLnR4dAorIyBTeXN0ZW0ncyBzcGhhbCBuYW1lc3BhY2UgbGlua3MgdG8gdm5kayBuYW1lc3BhY2UgZm9yICVWTkRLX1NBTUVQUk9DRVNTX0xJQlJBUklFUyUsCisjIHNpbmNlIHdlIGRvbid0IGhhdmUgYSBnb29kIHdheSB0byBhdXRvLWV4cGFuZCAlVk5ES19TQU1FUFJPQ0VTU19MSUJSQVJJRVMlLAorIyB3ZSdsbCBhZGQgdGhlIHZuZGsgcGF0aHMgYmVsb3cuCisKK25hbWVzcGFjZS5zcGhhbC5zZWFyY2gucGF0aHMgKz0gL29kbS8ke0xJQn0vdm5kay1zcAorbmFtZXNwYWNlLnNwaGFsLnNlYXJjaC5wYXRocyArPSAvdmVuZG9yLyR7TElCfS92bmRrLXNwCituYW1lc3BhY2Uuc3BoYWwuc2VhcmNoLnBhdGhzICs9IC9zeXN0ZW0vJHtMSUJ9L3ZuZGstc3Ake1ZOREtfVkVSfQorCituYW1lc3BhY2Uuc3BoYWwucGVybWl0dGVkLnBhdGhzICs9IC9vZG0vJHtMSUJ9L2h3CituYW1lc3BhY2Uuc3BoYWwucGVybWl0dGVkLnBhdGhzICs9IC9vZG0vJHtMSUJ9L2VnbAorbmFtZXNwYWNlLnNwaGFsLnBlcm1pdHRlZC5wYXRocyArPSAvdmVuZG9yLyR7TElCfS9odworbmFtZXNwYWNlLnNwaGFsLnBlcm1pdHRlZC5wYXRocyArPSAvdmVuZG9yLyR7TElCfS9lZ2wKK25hbWVzcGFjZS5zcGhhbC5wZXJtaXR0ZWQucGF0aHMgKz0gL3N5c3RlbS92ZW5kb3IvJHtMSUJ9L2h3CituYW1lc3BhY2Uuc3BoYWwucGVybWl0dGVkLnBhdGhzICs9IC9zeXN0ZW0vdmVuZG9yLyR7TElCfS9lZ2wKKyMgVGhpcyBpcyBleGNlcHRpb25hbGx5IHJlcXVpcmVkIHNpbmNlIGFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wLWltcGwuc28gaXMgaGVyZQorbmFtZXNwYWNlLnNwaGFsLnBlcm1pdHRlZC5wYXRocyArPSAvc3lzdGVtLyR7TElCfS92bmRrLXNwJHtWTkRLX1ZFUn0vaHcKKworbmFtZXNwYWNlLnNwaGFsLmFzYW4uc2VhcmNoLnBhdGhzICs9IC9kYXRhL2FzYW4vb2RtLyR7TElCfS92bmRrLXNwCituYW1lc3BhY2Uuc3BoYWwuYXNhbi5zZWFyY2gucGF0aHMgKz0gICAgICAgICAgIC9vZG0vJHtMSUJ9L3ZuZGstc3AKK25hbWVzcGFjZS5zcGhhbC5hc2FuLnNlYXJjaC5wYXRocyArPSAvZGF0YS9hc2FuL3ZlbmRvci8ke0xJQn0vdm5kay1zcAorbmFtZXNwYWNlLnNwaGFsLmFzYW4uc2VhcmNoLnBhdGhzICs9ICAgICAgICAgICAvdmVuZG9yLyR7TElCfS92bmRrLXNwCituYW1lc3BhY2Uuc3BoYWwuYXNhbi5zZWFyY2gucGF0aHMgKz0gL2RhdGEvYXNhbi9zeXN0ZW0vJHtMSUJ9L3ZuZGstc3Ake1ZOREtfVkVSfQorbmFtZXNwYWNlLnNwaGFsLmFzYW4uc2VhcmNoLnBhdGhzICs9ICAgICAgICAgICAvc3lzdGVtLyR7TElCfS92bmRrLXNwJHtWTkRLX1ZFUn0KKworbmFtZXNwYWNlLnNwaGFsLmFzYW4ucGVybWl0dGVkLnBhdGhzICs9IC9kYXRhL2FzYW4vb2RtLyR7TElCfS9odworbmFtZXNwYWNlLnNwaGFsLmFzYW4ucGVybWl0dGVkLnBhdGhzICs9ICAgICAgICAgICAvb2RtLyR7TElCfS9odworbmFtZXNwYWNlLnNwaGFsLmFzYW4ucGVybWl0dGVkLnBhdGhzICs9IC9kYXRhL2FzYW4vb2RtLyR7TElCfS9lZ2wKK25hbWVzcGFjZS5zcGhhbC5hc2FuLnBlcm1pdHRlZC5wYXRocyArPSAgICAgICAgICAgL29kbS8ke0xJQn0vZWdsCituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gL2RhdGEvYXNhbi92ZW5kb3IvJHtMSUJ9L2h3CituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gICAgICAgICAgIC92ZW5kb3IvJHtMSUJ9L2h3CituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gL2RhdGEvYXNhbi92ZW5kb3IvJHtMSUJ9L2VnbAorbmFtZXNwYWNlLnNwaGFsLmFzYW4ucGVybWl0dGVkLnBhdGhzICs9ICAgICAgICAgICAvdmVuZG9yLyR7TElCfS9lZ2wKKworbmFtZXNwYWNlLnNwaGFsLmFzYW4ucGVybWl0dGVkLnBhdGhzICs9IC9kYXRhL2FzYW4vc3lzdGVtLyR7TElCfS92bmRrLXNwJHtWTkRLX1ZFUn0vaHcKK25hbWVzcGFjZS5zcGhhbC5hc2FuLnBlcm1pdHRlZC5wYXRocyArPSAgICAgICAgICAgL3N5c3RlbS8ke0xJQn0vdm5kay1zcCR7Vk5ES19WRVJ9L2h3CisKKyMgT25jZSBpbiB0aGlzIG5hbWVzcGFjZSwgYWNjZXNzIHRvIGxpYnJhcmllcyBpbiAvc3lzdGVtL2xpYiBpcyByZXN0cmljdGVkLiBPbmx5CisjIGxpYnMgbGlzdGVkIGhlcmUgY2FuIGJlIHVzZWQuCituYW1lc3BhY2Uuc3BoYWwubGlua3MgPSBwbGF0Zm9ybQorCisjIFRPRE86IHJlcGxhY2UgdGhlIGZvbGxvd2luZyB3aGVuIGFwZXggaGFzIGEgd2F5IHRvIGF1dG8tZ2VuZXJhdGUgdGhpcyBsaXN0CisjIG5hbWVzcGFjZS5zcGhhbC5saW5rLnBsYXRmb3JtLnNoYXJlZF9saWJzICA9ICVMTE5ES19MSUJSQVJJRVMlCisjIG5hbWVzcGFjZS5zcGhhbC5saW5rLnBsYXRmb3JtLnNoYXJlZF9saWJzICs9ICVTQU5JVElaRVJfUlVOVElNRV9MSUJSQVJJRVMlCituYW1lc3BhY2Uuc3BoYWwubGluay5wbGF0Zm9ybS5zaGFyZWRfbGlicyA9IGxpYkVHTC5zbzpsaWJHTEVTdjFfQ00uc286bGliR0xFU3YyLnNvOmxpYkdMRVN2My5zbzpsaWJSUy5zbzpsaWJhbmRyb2lkX25ldC5zbzpsaWJjLnNvOmxpYmNncm91cHJjLnNvOmxpYmNsYW5nX3J0LmFzYW4tYWFyY2g2NC1hbmRyb2lkLnNvOmxpYmNsYW5nX3J0LmFzYW4tYXJtLWFuZHJvaWQuc286bGliY2xhbmdfcnQuaHdhc2FuLWFhcmNoNjQtYW5kcm9pZC5zbzpsaWJjbGFuZ19ydC5hc2FuLWk2ODYtYW5kcm9pZC5zbzpsaWJjbGFuZ19ydC5hc2FuLXg4Nl82NC1hbmRyb2lkLnNvOmxpYmRsLnNvOmxpYmZ0Mi5zbzpsaWJsb2cuc286bGlibS5zbzpsaWJtZWRpYW5kay5zbzpsaWJuYXRpdmV3aW5kb3cuc286bGlibmV1cmFsbmV0d29ya3Muc286bGlic3luYy5zbzpsaWJ2bmRrc3VwcG9ydC5zbzpsaWJ2dWxrYW4uc28KKworIyBBZGQgYSBsaW5rIGZvciBsaWJ6LnNvIHdoaWNoIGlzIGxsbmRrIG9uIGRldmljZXMgd2hlcmUgVk5ESyBpcyBub3QgZW5mb3JjZWQuCituYW1lc3BhY2Uuc3BoYWwubGluay5wbGF0Zm9ybS5zaGFyZWRfbGlicyArPSBsaWJ6LnNvCisKKyMgV2l0aCBWTkRLIEFQRVgsIC9zeXN0ZW0vJHtMSUJ9L3ZuZGstc3Ake1ZOREtfVkVSfSBpcyBhIHN5bWxpbmsgdG8gdGhlIGZvbGxvd2luZy4KKyMgQWRkIC9hcGV4Ly4uLiBwYXRoIHRvIHRoZSBwZXJtaXR0ZWQgcGF0aHMgYmVjYXVzZSBsaW5rZXIgdXNlcyByZWFscGF0aCgzKQorIyB0byBjaGVjayB0aGUgYWNjZXNzaWJpbGl0eSBvZiB0aGUgbGliLgorbmFtZXNwYWNlLnNwaGFsLnBlcm1pdHRlZC5wYXRocyArPSAvYXBleC9jb20uYW5kcm9pZC52bmRrLiR7Vk5ES19BUEVYX1ZFUn0vJHtMSUJ9CituYW1lc3BhY2Uuc3BoYWwuYXNhbi5wZXJtaXR0ZWQucGF0aHMgKz0gL2FwZXgvY29tLmFuZHJvaWQudm5kay4ke1ZOREtfQVBFWF9WRVJ9LyR7TElCfQpkaWZmIC0tZ2l0IGEvYXBleC9tYW5pZmVzdC5qc29uIGIvYXBleC9tYW5pZmVzdC5qc29uCmluZGV4IGUyZGYzYTMuLjMwMTFlZTggMTAwNjQ0Ci0tLSBhL2FwZXgvbWFuaWZlc3QuanNvbgorKysgYi9hcGV4L21hbmlmZXN0Lmpzb24KQEAgLTEsNCArMSw0IEBACiB7CiAgICJuYW1lIjogImNvbS5hbmRyb2lkLm1lZGlhIiwKLSAgInZlcnNpb24iOiAxCisgICJ2ZXJzaW9uIjogMjkwMDAwMDAwCiB9CmRpZmYgLS1naXQgYS9hcGV4L21hbmlmZXN0X2NvZGVjLmpzb24gYi9hcGV4L21hbmlmZXN0X2NvZGVjLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNhNTE3OAotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvbWFuaWZlc3RfY29kZWMuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIm5hbWUiOiAiY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYyIsCisgICJ2ZXJzaW9uIjogMjkwMDAwMDAwCit9CmRpZmYgLS1naXQgYS9hcGV4L21lZGlhc3djb2RlYy5yYyBiL2FwZXgvbWVkaWFzd2NvZGVjLnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNzQ4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L21lZGlhc3djb2RlYy5yYwpAQCAtMCwwICsxLDcgQEAKK3NlcnZpY2UgbWVkaWEuc3djb2RlYyAvYXBleC9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjL2Jpbi9tZWRpYXN3Y29kZWMKKyAgICBjbGFzcyBtYWluCisgICAgdXNlciBtZWRpYWNvZGVjCisgICAgZ3JvdXAgY2FtZXJhIGRybXJwYyBtZWRpYWRybQorICAgIG92ZXJyaWRlCisgICAgaW9wcmlvIHJ0IDQKKyAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCmRpZmYgLS1naXQgYS9hcGV4L3Rlc3RpbmcvQW5kcm9pZC5icCBiL2FwZXgvdGVzdGluZy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3NmQzZTQKLS0tIC9kZXYvbnVsbAorKysgYi9hcGV4L3Rlc3RpbmcvQW5kcm9pZC5icApAQCAtMCwwICsxLDI5IEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCithcGV4X3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2NvbS5hbmRyb2lkLm1lZGlhIiwKKyAgICBtYW5pZmVzdDogInRlc3RfbWFuaWZlc3QuanNvbiIsCisgICAgZmlsZV9jb250ZXh0czogIjpjb20uYW5kcm9pZC5tZWRpYS1maWxlX2NvbnRleHRzIiwKKyAgICBkZWZhdWx0czogWyJjb20uYW5kcm9pZC5tZWRpYS1kZWZhdWx0cyJdLAorICAgIGluc3RhbGxhYmxlOiBmYWxzZSwKK30KKworYXBleF90ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjIiwKKyAgICBtYW5pZmVzdDogInRlc3RfbWFuaWZlc3RfY29kZWMuanNvbiIsCisgICAgZmlsZV9jb250ZXh0czogIjpjb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLWZpbGVfY29udGV4dHMiLAorICAgIGRlZmF1bHRzOiBbImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMtZGVmYXVsdHMiXSwKKyAgICBpbnN0YWxsYWJsZTogZmFsc2UsCit9CmRpZmYgLS1naXQgYS9hcGV4L3Rlc3RpbmcvdGVzdF9tYW5pZmVzdC5qc29uIGIvYXBleC90ZXN0aW5nL3Rlc3RfbWFuaWZlc3QuanNvbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGQ2NDJlCi0tLSAvZGV2L251bGwKKysrIGIvYXBleC90ZXN0aW5nL3Rlc3RfbWFuaWZlc3QuanNvbgpAQCAtMCwwICsxLDQgQEAKK3sKKyAgIm5hbWUiOiAiY29tLmFuZHJvaWQubWVkaWEiLAorICAidmVyc2lvbiI6IDMwMDAwMDAwMAorfQpkaWZmIC0tZ2l0IGEvYXBleC90ZXN0aW5nL3Rlc3RfbWFuaWZlc3RfY29kZWMuanNvbiBiL2FwZXgvdGVzdGluZy90ZXN0X21hbmlmZXN0X2NvZGVjLmpzb24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMyMGZkNwotLS0gL2Rldi9udWxsCisrKyBiL2FwZXgvdGVzdGluZy90ZXN0X21hbmlmZXN0X2NvZGVjLmpzb24KQEAgLTAsMCArMSw0IEBACit7CisgICJuYW1lIjogImNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMiLAorICAidmVyc2lvbiI6IDMwMDAwMDAwMAorfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL0FuZHJvaWQuYnAgYi9jYW1lcmEvQW5kcm9pZC5icAppbmRleCBlMmMxMjNjLi5iMjg4YmNmIDEwMDY0NAotLS0gYS9jYW1lcmEvQW5kcm9pZC5icAorKysgYi9jYW1lcmEvQW5kcm9pZC5icApAQCAtMTIsOCArMTIsNiBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKLXN1YmRpcnMgPSBbIm5kayJdCi0KIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGliY2FtZXJhX2NsaWVudCIsCiAKQEAgLTQzLDYgKzQxLDcgQEAKICAgICAgICAgIklDYW1lcmFSZWNvcmRpbmdQcm94eUxpc3RlbmVyLmNwcCIsCiAgICAgICAgICJjYW1lcmEyL0NhcHR1cmVSZXF1ZXN0LmNwcCIsCiAgICAgICAgICJjYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uY3BwIiwKKyAgICAgICAgImNhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uY3BwIiwKICAgICAgICAgImNhbWVyYTIvU3VibWl0SW5mby5jcHAiLAogICAgICAgICAiQ2FtZXJhQmFzZS5jcHAiLAogICAgICAgICAiQ2FtZXJhVXRpbHMuY3BwIiwKZGlmZiAtLWdpdCBhL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAgYi9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuY3BwCmluZGV4IGUxNDNlMDUuLjkyZmU4NGIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5jcHAKKysrIGIvY2FtZXJhL0NhbWVyYU1ldGFkYXRhLmNwcApAQCAtMjIsNyArMjIsNiBAQAogCiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFNZXRhZGF0YS5oPgotI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDA5LDYgKzQwOCw3OSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYU1ldGFkYXRhOjpyZW1vdmVQZXJtaXNzaW9uRW50cmllcyhtZXRhZGF0YV92ZW5kb3JfaWRfdCB2ZW5kb3JJZCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gKnRhZ3NSZW1vdmVkKSB7CisgICAgdWludDMyX3QgdGFnQ291bnQgPSAwOworICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiB0YWdzVG9SZW1vdmU7CisKKyAgICBpZiAodGFnc1JlbW92ZWQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHZUYWdzID0gVmVuZG9yVGFnRGVzY3JpcHRvcjo6Z2V0R2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOworICAgIGlmICgobnVsbHB0ciA9PSB2VGFncy5nZXQoKSkgfHwgKDAgPj0gdlRhZ3MtPmdldFRhZ0NvdW50KCkpKSB7CisgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZT4gY2FjaGUgPQorICAgICAgICAgICAgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOjpnZXRHbG9iYWxWZW5kb3JUYWdDYWNoZSgpOworICAgICAgICBpZiAoY2FjaGUuZ2V0KCkpIHsKKyAgICAgICAgICAgIGNhY2hlLT5nZXRWZW5kb3JUYWdEZXNjcmlwdG9yKHZlbmRvcklkLCAmdlRhZ3MpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChudWxscHRyICE9IHZUYWdzLmdldCgpKSAmJiAodlRhZ3MtPmdldFRhZ0NvdW50KCkgPiAwKSkgeworICAgICAgICB0YWdDb3VudCA9IHZUYWdzLT5nZXRUYWdDb3VudCgpOworICAgICAgICB1aW50MzJfdCAqdmVuZG9yVGFncyA9IG5ldyB1aW50MzJfdFt0YWdDb3VudF07CisgICAgICAgIGlmIChudWxscHRyID09IHZlbmRvclRhZ3MpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgdlRhZ3MtPmdldFRhZ0FycmF5KHZlbmRvclRhZ3MpOworCisgICAgICAgIHRhZ3NUb1JlbW92ZS5yZXNlcnZlKHRhZ0NvdW50KTsKKyAgICAgICAgdGFnc1RvUmVtb3ZlLmluc2VydCh0YWdzVG9SZW1vdmUuYmVnaW4oKSwgdmVuZG9yVGFncywgdmVuZG9yVGFncyArIHRhZ0NvdW50KTsKKworICAgICAgICBkZWxldGUgW10gdmVuZG9yVGFnczsKKyAgICAgICAgdGFnQ291bnQgPSAwOworICAgIH0KKworICAgIGF1dG8gdGFnc05lZWRpbmdQZXJtaXNzaW9uID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9wZXJtaXNzaW9uX25lZWRlZCgmdGFnQ291bnQpOworICAgIGlmICh0YWdDb3VudCA+IDApIHsKKyAgICAgICAgdGFnc1RvUmVtb3ZlLnJlc2VydmUodGFnc1RvUmVtb3ZlLmNhcGFjaXR5KCkgKyB0YWdDb3VudCk7CisgICAgICAgIHRhZ3NUb1JlbW92ZS5pbnNlcnQodGFnc1RvUmVtb3ZlLmVuZCgpLCB0YWdzTmVlZGluZ1Blcm1pc3Npb24sCisgICAgICAgICAgICAgICAgdGFnc05lZWRpbmdQZXJtaXNzaW9uICsgdGFnQ291bnQpOworICAgIH0KKworICAgIHRhZ3NSZW1vdmVkLT5yZXNlcnZlKHRhZ3NUb1JlbW92ZS5zaXplKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiB0YWdzVG9SZW1vdmUpIHsKKyAgICAgICAgaWYgKGV4aXN0cyhpdCkpIHsKKyAgICAgICAgICAgIGF1dG8gcmMgPSBlcmFzZShpdCk7CisgICAgICAgICAgICBpZiAoTk9fRVJST1IgIT0gcmMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBlcmFzZSB0YWc6ICV4IiwgX19mdW5jX18sIGl0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0YWdzUmVtb3ZlZC0+cHVzaF9iYWNrKGl0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFVwZGF0ZSB0aGUgYXZhaWxhYmxlIGNoYXJhY3RlcnN0aWNzIGFjY29yZGluZ2x5CisgICAgaWYgKGV4aXN0cyhBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTKSkgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gY3VycmVudEtleXM7CisKKyAgICAgICAgc3RkOjpzb3J0KHRhZ3NSZW1vdmVkLT5iZWdpbigpLCB0YWdzUmVtb3ZlZC0+ZW5kKCkpOworICAgICAgICBhdXRvIGtleXMgPSBmaW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0hBUkFDVEVSSVNUSUNTX0tFWVMpOworICAgICAgICBjdXJyZW50S2V5cy5yZXNlcnZlKGtleXMuY291bnQpOworICAgICAgICBjdXJyZW50S2V5cy5pbnNlcnQoY3VycmVudEtleXMuZW5kKCksIGtleXMuZGF0YS5pMzIsIGtleXMuZGF0YS5pMzIgKyBrZXlzLmNvdW50KTsKKyAgICAgICAgc3RkOjpzb3J0KGN1cnJlbnRLZXlzLmJlZ2luKCksIGN1cnJlbnRLZXlzLmVuZCgpKTsKKworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBuZXdLZXlzKGtleXMuY291bnQpOworICAgICAgICBhdXRvIGVuZCA9IHN0ZDo6c2V0X2RpZmZlcmVuY2UoY3VycmVudEtleXMuYmVnaW4oKSwgY3VycmVudEtleXMuZW5kKCksIHRhZ3NSZW1vdmVkLT5iZWdpbigpLAorICAgICAgICAgICAgICAgIHRhZ3NSZW1vdmVkLT5lbmQoKSwgbmV3S2V5cy5iZWdpbigpKTsKKyAgICAgICAgbmV3S2V5cy5yZXNpemUoZW5kIC0gbmV3S2V5cy5iZWdpbigpKTsKKworICAgICAgICB1cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUywgbmV3S2V5cy5kYXRhKCksIG5ld0tleXMuc2l6ZSgpKTsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIHZvaWQgQ2FtZXJhTWV0YWRhdGE6OmR1bXAoaW50IGZkLCBpbnQgdmVyYm9zaXR5LCBpbnQgaW5kZW50YXRpb24pIGNvbnN0IHsKICAgICBkdW1wX2luZGVudGVkX2NhbWVyYV9tZXRhZGF0YShtQnVmZmVyLCBmZCwgdmVyYm9zaXR5LCBpbmRlbnRhdGlvbik7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvQ2FwdHVyZVJlc3VsdC5jcHAgYi9jYW1lcmEvQ2FwdHVyZVJlc3VsdC5jcHAKaW5kZXggOTI4YTZiYy4uMWQ4ZThjNCAxMDA2NDQKLS0tIGEvY2FtZXJhL0NhcHR1cmVSZXN1bHQuY3BwCisrKyBiL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmNwcApAQCAtMzksNiArMzksMTYgQEAKICAgICBwYXJjZWwtPnJlYWRJbnQ2NCgmZnJhbWVOdW1iZXIpOwogICAgIHBhcmNlbC0+cmVhZEludDMyKCZwYXJ0aWFsUmVzdWx0Q291bnQpOwogICAgIHBhcmNlbC0+cmVhZEludDMyKCZlcnJvclN0cmVhbUlkKTsKKyAgICBhdXRvIHBoeXNpY2FsQ2FtZXJhSWRQcmVzZW50ID0gcGFyY2VsLT5yZWFkQm9vbCgpOworICAgIGlmIChwaHlzaWNhbENhbWVyYUlkUHJlc2VudCkgeworICAgICAgICBTdHJpbmcxNiBjYW1lcmFJZDsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgICAgIGlmICgocmVzID0gcGFyY2VsLT5yZWFkU3RyaW5nMTYoJmNhbWVyYUlkKSkgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgY2FtZXJhIGlkOiAlZCIsIF9fRlVOQ1RJT05fXywgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICAgICAgZXJyb3JQaHlzaWNhbENhbWVyYUlkID0gY2FtZXJhSWQ7CisgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNTYsNiArNjYsMTYgQEAKICAgICBwYXJjZWwtPndyaXRlSW50NjQoZnJhbWVOdW1iZXIpOwogICAgIHBhcmNlbC0+d3JpdGVJbnQzMihwYXJ0aWFsUmVzdWx0Q291bnQpOwogICAgIHBhcmNlbC0+d3JpdGVJbnQzMihlcnJvclN0cmVhbUlkKTsKKyAgICBpZiAoZXJyb3JQaHlzaWNhbENhbWVyYUlkLnNpemUoKSA+IDApIHsKKyAgICAgICAgcGFyY2VsLT53cml0ZUJvb2wodHJ1ZSk7CisgICAgICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgICAgICBpZiAoKHJlcyA9IHBhcmNlbC0+d3JpdGVTdHJpbmcxNihlcnJvclBoeXNpY2FsQ2FtZXJhSWQpKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgcGh5c2ljYWwgY2FtZXJhIElEIHRvIHBhcmNlbDogJWQiLCBfX0ZVTkNUSU9OX18sIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcGFyY2VsLT53cml0ZUJvb2woZmFsc2UpOworICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KZGlmZiAtLWdpdCBhL2NhbWVyYS9PV05FUlMgYi9jYW1lcmEvT1dORVJTCmluZGV4IDE4YWNmZWUuLmQ2Yjk1ZGEgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9PV05FUlMKKysrIGIvY2FtZXJhL09XTkVSUwpAQCAtMSw2ICsxLDggQEAKLWN5Y2hlbkBnb29nbGUuY29tCiBlcGVldkBnb29nbGUuY29tCiBldGFsdmFsYUBnb29nbGUuY29tCitqY2hvd2RoYXJ5QGdvb2dsZS5jb20KIHNodXpoZW53YW5nQGdvb2dsZS5jb20KIHlpbmNoaWF5ZWhAZ29vZ2xlLmNvbQorIyBiYWNrdXAgb3duZXIKK2N5Y2hlbkBnb29nbGUuY29tCiB6aGlqdW5oZUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAgYi9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5jcHAKaW5kZXggYTg2Y2M4Ny4uZDcxM2QyZCAxMDA2NDQKLS0tIGEvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuY3BwCisrKyBiL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmNwcApAQCAtMzE1LDYgKzMxNSwxMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3NpemVfdCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpnZXRTZWN0aW9uSW5kZXgodWludDMyX3QgdGFnKSBjb25zdCB7CisgICAgcmV0dXJuIG1UYWdUb1NlY3Rpb25NYXAudmFsdWVGb3IodGFnKTsKK30KKwogdm9pZCBWZW5kb3JUYWdEZXNjcmlwdG9yOjpkdW1wKGludCBmZCwgaW50IHZlcmJvc2l0eSwgaW50IGluZGVudGF0aW9uKSBjb25zdCB7CiAKICAgICBzaXplX3Qgc2l6ZSA9IG1UYWdUb05hbWVNYXAuc2l6ZSgpOwpAQCAtNDA3LDYgKzQxMSwxMSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK2NvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxtZXRhZGF0YV92ZW5kb3JfaWRfdCwgc3A8YW5kcm9pZDo6VmVuZG9yVGFnRGVzY3JpcHRvcj4+ICYKKyAgICAgICAgICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTo6Z2V0VmVuZG9ySWRzQW5kVGFnRGVzY3JpcHRvcnMoKSB7CisgICAgcmV0dXJuIG1WZW5kb3JNYXA7Cit9CisKIGludCBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU6OmdldFRhZ0NvdW50KG1ldGFkYXRhX3ZlbmRvcl9pZF90IGlkKSBjb25zdCB7CiAgICAgaW50IHJldCA9IDA7CiAgICAgYXV0byBkZXNjID0gbVZlbmRvck1hcC5maW5kKGlkKTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvSUNhbWVyYVNlcnZpY2UuYWlkbAppbmRleCA5YzBmMjhiLi4zZTg5OTJhIDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmFpZGwKKysrIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5haWRsCkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICAgKgogICAgICAqIEFsc28gcmV0dXJucyB0aGUgc2V0IG9mIGN1cnJlbnRseS1rbm93biBjYW1lcmEgSURzIGFuZCBzdGF0ZSBvZiBlYWNoIGRldmljZS4KICAgICAgKiBBZGRpbmcgYSBsaXN0ZW5lciB3aWxsIHRyaWdnZXIgdGhlIHRvcmNoIHN0YXR1cyBsaXN0ZW5lciB0byBmaXJlIGZvciBhbGwKLSAgICAgKiBkZXZpY2VzIHRoYXQgaGF2ZSBhIGZsYXNoIHVuaXQKKyAgICAgKiBkZXZpY2VzIHRoYXQgaGF2ZSBhIGZsYXNoIHVuaXQuCiAgICAgICovCiAgICAgQ2FtZXJhU3RhdHVzW10gYWRkTGlzdGVuZXIoSUNhbWVyYVNlcnZpY2VMaXN0ZW5lciBsaXN0ZW5lcik7CiAKQEAgLTE0OSw4ICsxNDksMTAgQEAKICAgICBjb25zdCBpbnQgQVBJX1ZFUlNJT05fMSA9IDE7CiAgICAgY29uc3QgaW50IEFQSV9WRVJTSU9OXzIgPSAyOwogCi0gICAgLy8gRGV0ZXJtaW5lcyBpZiBhIHBhcnRpY3VsYXIgQVBJIHZlcnNpb24gaXMgc3VwcG9ydGVkIGRpcmVjdGx5CisgICAgLy8gRGV0ZXJtaW5lcyBpZiBhIHBhcnRpY3VsYXIgQVBJIHZlcnNpb24gaXMgc3VwcG9ydGVkIGRpcmVjdGx5IGZvciBhIGNhbWVyYUlkLgogICAgIGJvb2xlYW4gc3VwcG9ydHNDYW1lcmFBcGkoU3RyaW5nIGNhbWVyYUlkLCBpbnQgYXBpVmVyc2lvbik7CisgICAgLy8gRGV0ZXJtaW5lcyBpZiBhIGNhbWVyYUlkIGlzIGEgaGlkZGVuIHBoeXNpY2FsIGNhbWVyYSBvZiBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICAgIGJvb2xlYW4gaXNIaWRkZW5QaHlzaWNhbENhbWVyYShTdHJpbmcgY2FtZXJhSWQpOwogCiAgICAgdm9pZCBzZXRUb3JjaE1vZGUoU3RyaW5nIGNhbWVyYUlkLCBib29sZWFuIGVuYWJsZWQsIElCaW5kZXIgY2xpZW50QmluZGVyKTsKIApAQCAtMTYwLDYgKzE2MiwyOCBAQAogICAgICAqIENhbGxlcnMgcmVxdWlyZSB0aGUgYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMgcGVybWlzc2lvbi4KICAgICAgKi8KICAgICBjb25zdCBpbnQgRVZFTlRfTk9ORSA9IDA7Ci0gICAgY29uc3QgaW50IEVWRU5UX1VTRVJfU1dJVENIRUQgPSAxOworICAgIGNvbnN0IGludCBFVkVOVF9VU0VSX1NXSVRDSEVEID0gMTsgLy8gVGhlIGFyZ3VtZW50IGlzIHRoZSBzZXQgb2YgbmV3IGZvcmVncm91bmQgdXNlciBJRHMuCiAgICAgb25ld2F5IHZvaWQgbm90aWZ5U3lzdGVtRXZlbnQoaW50IGV2ZW50SWQsIGluIGludFtdIGFyZ3MpOworCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoZSBjYW1lcmEgc2VydmljZSBvZiBhIGRldmljZSBwaHlzaWNhbCBzdGF0dXMgY2hhbmdlLiBNYXkgb25seSBiZSBjYWxsZWQgZnJvbQorICAgICAqIGEgcHJpdmlsZWdlZCBwcm9jZXNzLgorICAgICAqCisgICAgICogbmV3U3RhdGUgaXMgYSBiaXRmaWVsZCBjb25zaXN0aW5nIG9mIERFVklDRV9TVEFURV8qIHZhbHVlcyBjb21iaW5lZCB0b2dldGhlci4gVmFsaWQgc3RhdGUKKyAgICAgKiBjb21iaW5hdGlvbnMgYXJlIGRldmljZS1zcGVjaWZpYy4gQXQgZGV2aWNlIHN0YXJ0dXAsIHRoZSBjYW1lcmEgc2VydmljZSB3aWxsIGFzc3VtZSB0aGUgZGV2aWNlCisgICAgICogc3RhdGUgaXMgTk9STUFMIHVudGlsIG90aGVyd2lzZSBub3RpZmllZC4KKyAgICAgKgorICAgICAqIENhbGxlcnMgcmVxdWlyZSB0aGUgYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMgcGVybWlzc2lvbi4KKyAgICAgKi8KKyAgICBvbmV3YXkgdm9pZCBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShsb25nIG5ld1N0YXRlKTsKKworICAgIC8vIEJpdGZpZWxkIGNvbnN0YW50cyBmb3Igbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UKKyAgICAvLyBBbGwgYml0cyA+PSAzMiBhcmUgZm9yIGN1c3RvbSB2ZW5kb3Igc3RhdGVzCisgICAgLy8gV3JpdHRlbiBhcyBpbnRzIHNpbmNlIEFJREwgZG9lcyBub3Qgc3VwcG9ydCBsb25nIGNvbnN0YW50cy4KKyAgICBjb25zdCBpbnQgREVWSUNFX1NUQVRFX05PUk1BTCA9IDA7CisgICAgY29uc3QgaW50IERFVklDRV9TVEFURV9CQUNLX0NPVkVSRUQgPSAxOworICAgIGNvbnN0IGludCBERVZJQ0VfU1RBVEVfRlJPTlRfQ09WRVJFRCA9IDI7CisgICAgY29uc3QgaW50IERFVklDRV9TVEFURV9GT0xERUQgPSA0OworICAgIGNvbnN0IGludCBERVZJQ0VfU1RBVEVfTEFTVF9GUkFNRVdPUktfQklUID0gMHg4MDAwMDAwMDsgLy8gMSA8PCAzMTsKKwogfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmFpZGwgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuYWlkbAppbmRleCBmODcxY2U0Li5lOWRjYmRiIDEwMDY0NAotLS0gYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuYWlkbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuYWlkbApAQCAtNzYsNCArNzYsMTEgQEAKICAgICBjb25zdCBpbnQgVE9SQ0hfU1RBVFVTX1VOS05PV04gPSAtMTsKIAogICAgIG9uZXdheSB2b2lkIG9uVG9yY2hTdGF0dXNDaGFuZ2VkKGludCBzdGF0dXMsIFN0cmluZyBjYW1lcmFJZCk7CisKKyAgICAvKioKKyAgICAgKiBOb3RpZnkgcmVnaXN0ZXJlZCBjbGllbnRzIGFib3V0IGNhbWVyYSBhY2Nlc3MgcHJpb3JpdHkgY2hhbmdlcy4KKyAgICAgKiBDbGllbnRzIHdoaWNoIHdlcmUgcHJldmlvdXNseSB1bmFibGUgdG8gb3BlbiBhIGNlcnRhaW4gY2FtZXJhIGRldmljZQorICAgICAqIGNhbiByZXRyeSBhZnRlciByZWNlaXZpbmcgdGhpcyBjYWxsYmFjay4KKyAgICAgKi8KKyAgICBvbmV3YXkgdm9pZCBvbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkKCk7CiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZVVzZXIuYWlkbCBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5haWRsCmluZGV4IDRjZWQwOGMuLjQ5ZGZkZTggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5haWRsCisrKyBiL2NhbWVyYS9haWRsL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5haWRsCkBAIC0xOSw2ICsxOSw3IEBACiBpbXBvcnQgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLkNhcHR1cmVSZXF1ZXN0OwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5pbXBsLkNhbWVyYU1ldGFkYXRhTmF0aXZlOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi5wYXJhbXMuT3V0cHV0Q29uZmlndXJhdGlvbjsKK2ltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYTIucGFyYW1zLlNlc3Npb25Db25maWd1cmF0aW9uOwogaW1wb3J0IGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhMi51dGlscy5TdWJtaXRJbmZvOwogaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwogCkBAIC04Myw2ICs4NCwxNiBAQAogICAgICAqLwogICAgIHZvaWQgZW5kQ29uZmlndXJlKGludCBvcGVyYXRpbmdNb2RlLCBpbiBDYW1lcmFNZXRhZGF0YU5hdGl2ZSBzZXNzaW9uUGFyYW1zKTsKIAorICAgIC8qKgorICAgICAgKiBDaGVjayB3aGV0aGVyIGEgcGFydGljdWxhciBzZXNzaW9uIGNvbmZpZ3VyYXRpb24gaGFzIGNhbWVyYSBkZXZpY2UKKyAgICAgICogc3VwcG9ydC4KKyAgICAgICoKKyAgICAgICogQHBhcmFtIHNlc3Npb25Db25maWd1cmF0aW9uIFNwZWNpZmljIHNlc3Npb24gY29uZmlndXJhdGlvbiB0byBiZSB2ZXJpZmllZC4KKyAgICAgICogQHJldHVybiB0cnVlICAtIGluIGNhc2UgdGhlIHN0cmVhbSBjb21iaW5hdGlvbiBpcyBzdXBwb3J0ZWQuCisgICAgICAqICAgICAgICAgZmFsc2UgLSBpbiBjYXNlIHRoZXJlIGlzIG5vIGRldmljZSBzdXBwb3J0LgorICAgICAgKi8KKyAgICBib29sZWFuIGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoaW4gU2Vzc2lvbkNvbmZpZ3VyYXRpb24gc2Vzc2lvbkNvbmZpZ3VyYXRpb24pOworCiAgICAgdm9pZCBkZWxldGVTdHJlYW0oaW50IHN0cmVhbUlkKTsKIAogICAgIC8qKgpkaWZmIC0tZ2l0IGEvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL3BhcmFtcy9TZXNzaW9uQ29uZmlndXJhdGlvbi5haWRsIGIvY2FtZXJhL2FpZGwvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL3BhcmFtcy9TZXNzaW9uQ29uZmlndXJhdGlvbi5haWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZjE1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvYWlkbC9hbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvcGFyYW1zL1Nlc3Npb25Db25maWd1cmF0aW9uLmFpZGwKQEAgLTAsMCArMSwyMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEyLnBhcmFtczsKKworLyoqIEBoaWRlICovCitwYXJjZWxhYmxlIFNlc3Npb25Db25maWd1cmF0aW9uIGNwcF9oZWFkZXIgImNhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmgiOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5jcHAgYi9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcAppbmRleCBmZWIwNGMyLi40ZTliMjdkIDEwMDY0NAotLS0gYS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcAorKysgYi9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmNwcApAQCAtMTY3LDE0ICsxNjcsMjQgQEAKIH0KIAogT3V0cHV0Q29uZmlndXJhdGlvbjo6T3V0cHV0Q29uZmlndXJhdGlvbihzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZ2JwLCBpbnQgcm90YXRpb24sCisgICAgICAgIGNvbnN0IFN0cmluZzE2JiBwaHlzaWNhbElkLAogICAgICAgICBpbnQgc3VyZmFjZVNldElELCBib29sIGlzU2hhcmVkKSB7CiAgICAgbUdicHMucHVzaF9iYWNrKGdicCk7CiAgICAgbVJvdGF0aW9uID0gcm90YXRpb247CiAgICAgbVN1cmZhY2VTZXRJRCA9IHN1cmZhY2VTZXRJRDsKICAgICBtSXNEZWZlcnJlZCA9IGZhbHNlOwogICAgIG1Jc1NoYXJlZCA9IGlzU2hhcmVkOworICAgIG1QaHlzaWNhbENhbWVyYUlkID0gcGh5c2ljYWxJZDsKIH0KIAorT3V0cHV0Q29uZmlndXJhdGlvbjo6T3V0cHV0Q29uZmlndXJhdGlvbigKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+JiBnYnBzLAorICAgIGludCByb3RhdGlvbiwgY29uc3QgU3RyaW5nMTYmIHBoeXNpY2FsQ2FtZXJhSWQsIGludCBzdXJmYWNlU2V0SUQsICBpbnQgc3VyZmFjZVR5cGUsCisgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBib29sIGlzU2hhcmVkKQorICA6IG1HYnBzKGdicHMpLCBtUm90YXRpb24ocm90YXRpb24pLCBtU3VyZmFjZVNldElEKHN1cmZhY2VTZXRJRCksIG1TdXJmYWNlVHlwZShzdXJmYWNlVHlwZSksCisgICAgbVdpZHRoKHdpZHRoKSwgbUhlaWdodChoZWlnaHQpLCBtSXNEZWZlcnJlZChmYWxzZSksIG1Jc1NoYXJlZChpc1NoYXJlZCksCisgICAgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCkgeyB9CisKIHN0YXR1c190IE91dHB1dENvbmZpZ3VyYXRpb246OndyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIGNvbnN0IHsKIAogICAgIGlmIChwYXJjZWwgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmNwcCBiL2NhbWVyYS9jYW1lcmEyL1Nlc3Npb25Db25maWd1cmF0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDMxYTMzCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uY3BwCkBAIC0wLDAgKzEsMTMzIEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjZGVmaW5lIExPR19UQUcgIlNlc3Npb25Db25maWd1cmF0aW9uIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdHVzX3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb246OnJlYWRGcm9tUGFyY2VsKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSB7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisgICAgaW50IG9wZXJhdGluZ01vZGUgPSAwOworCisgICAgaWYgKHBhcmNlbCA9PSBudWxscHRyKSByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgaWYgKChlcnIgPSBwYXJjZWwtPnJlYWRJbnQzMigmb3BlcmF0aW5nTW9kZSkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgb3BlcmF0aW5nIG1vZGUgZnJvbSBwYXJjZWwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludCBpbnB1dFdpZHRoID0gMDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZpbnB1dFdpZHRoKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVhZCBpbnB1dCB3aWR0aCBmcm9tIHBhcmNlbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgaW50IGlucHV0SGVpZ2h0ID0gMDsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZpbnB1dEhlaWdodCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgaW5wdXQgaGVpZ2h0IGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBpbnQgaW5wdXRGb3JtYXQgPSAtMTsKKyAgICBpZiAoKGVyciA9IHBhcmNlbC0+cmVhZEludDMyKCZpbnB1dEZvcm1hdCkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgaW5wdXQgZm9ybWF0IGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxPdXRwdXRDb25maWd1cmF0aW9uPiBvdXRwdXRTdHJlYW1zOworICAgIGlmICgoZXJyID0gcGFyY2VsLT5yZWFkUGFyY2VsYWJsZVZlY3Rvcigmb3V0cHV0U3RyZWFtcykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlYWQgb3V0cHV0IGNvbmZpZ3VyYXRpb25zIGZyb20gcGFyY2VsIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBtT3BlcmF0aW5nTW9kZSA9IG9wZXJhdGluZ01vZGU7CisgICAgbUlucHV0V2lkdGggPSBpbnB1dFdpZHRoOworICAgIG1JbnB1dEhlaWdodCA9IGlucHV0SGVpZ2h0OworICAgIG1JbnB1dEZvcm1hdCA9IGlucHV0Rm9ybWF0OworICAgIGZvciAoYXV0byYgc3RyZWFtIDogb3V0cHV0U3RyZWFtcykgeworICAgICAgICBtT3V0cHV0U3RyZWFtcy5wdXNoX2JhY2soc3RyZWFtKTsKKyAgICB9CisKKworICAgIHJldHVybiBlcnI7Cit9CisKK3N0YXR1c190IFNlc3Npb25Db25maWd1cmF0aW9uOjp3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdCB7CisKKyAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CisKKyAgICBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobU9wZXJhdGluZ01vZGUpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobUlucHV0V2lkdGgpOworICAgIGlmIChlcnIgIT0gT0spIHJldHVybiBlcnI7CisKKyAgICBlcnIgPSBwYXJjZWwtPndyaXRlSW50MzIobUlucHV0SGVpZ2h0KTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgZXJyID0gcGFyY2VsLT53cml0ZUludDMyKG1JbnB1dEZvcm1hdCk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIGVyciA9IHBhcmNlbC0+d3JpdGVQYXJjZWxhYmxlVmVjdG9yKG1PdXRwdXRTdHJlYW1zKTsKKyAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOworCisgICAgcmV0dXJuIE9LOworfQorCitib29sIFNlc3Npb25Db25maWd1cmF0aW9uOjpvdXRwdXRzRXF1YWwoY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdCB7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8T3V0cHV0Q29uZmlndXJhdGlvbj4mIG90aGVyT3V0cHV0U3RyZWFtcyA9CisgICAgICAgICAgICBvdGhlci5nZXRPdXRwdXRDb25maWd1cmF0aW9ucygpOworCisgICAgaWYgKG1PdXRwdXRTdHJlYW1zLnNpemUoKSAhPSAgb3RoZXJPdXRwdXRTdHJlYW1zLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobU91dHB1dFN0cmVhbXNbaV0gIT0gb3RoZXJPdXRwdXRTdHJlYW1zW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTZXNzaW9uQ29uZmlndXJhdGlvbjo6b3V0cHV0c0xlc3NUaGFuKGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgeworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dENvbmZpZ3VyYXRpb24+JiBvdGhlck91dHB1dFN0cmVhbXMgPQorICAgICAgICAgICAgb3RoZXIuZ2V0T3V0cHV0Q29uZmlndXJhdGlvbnMoKTsKKworICAgIGlmIChtT3V0cHV0U3RyZWFtcy5zaXplKCkgIT0gIG90aGVyT3V0cHV0U3RyZWFtcy5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIG1PdXRwdXRTdHJlYW1zLnNpemUoKSA8IG90aGVyT3V0cHV0U3RyZWFtcy5zaXplKCk7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobU91dHB1dFN0cmVhbXNbaV0gIT0gb3RoZXJPdXRwdXRTdHJlYW1zW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gbU91dHB1dFN0cmVhbXNbaV0gPCBvdGhlck91dHB1dFN0cmVhbXNbaV07CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAgYi9jYW1lcmEvY2FtZXJhc2VydmVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzIwYzQ5OQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJjYW1lcmFzZXJ2ZXIiLAorCisgICAgc3JjczogWyJtYWluX2NhbWVyYXNlcnZlci5jcHAiXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNhbWVyYXNlcnZpY2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi41IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40IiwKKyAgICBdLAorICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICBdLAorCisgICAgaW5pdF9yYzogWyJjYW1lcmFzZXJ2ZXIucmMiXSwKKworICAgIHZpbnRmX2ZyYWdtZW50czogWworICAgICAgICAibWFuaWZlc3RfYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAyLjAueG1sIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLm1rIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGM5NGU2Li4wMDAwMDAwCi0tLSBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSMgQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0JbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotCWxpYmNhbWVyYXNlcnZpY2UgXAotCWxpYmxvZyBcCi0JbGlidXRpbHMgXAotCWxpYnVpIFwKLQlsaWJndWkgXAotCWxpYmJpbmRlciBcCi0JbGliaGlkbHRyYW5zcG9ydCBcCi0JYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMCBcCi0JYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IFwKLQlhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIFwKLQlhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yCi0KLUxPQ0FMX01PRFVMRTo9IGNhbWVyYXNlcnZlcgotTE9DQUxfMzJfQklUX09OTFkgOj0gdHJ1ZQotCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yIC1Xbm8tdW51c2VkLXBhcmFtZXRlcgotCi1MT0NBTF9JTklUX1JDIDo9IGNhbWVyYXNlcnZlci5yYwotCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKZGlmZiAtLWdpdCBhL2NhbWVyYS9jYW1lcmFzZXJ2ZXIvbWFpbl9jYW1lcmFzZXJ2ZXIuY3BwIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9tYWluX2NhbWVyYXNlcnZlci5jcHAKaW5kZXggMzk3MjQzNi4uY2VmOGVmNSAxMDA2NDQKLS0tIGEvY2FtZXJhL2NhbWVyYXNlcnZlci9tYWluX2NhbWVyYXNlcnZlci5jcHAKKysrIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9tYWluX2NhbWVyYXNlcnZlci5jcHAKQEAgLTI2LDEzICsyNiwxNSBAQAogewogICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKIAotICAgIC8vIFNldCAzIHRocmVhZHMgZm9yIEhJREwgY2FsbHMKLSAgICBoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCgzLCAvKndpbGxqb2luKi8gZmFsc2UpOworICAgIC8vIFNldCA1IHRocmVhZHMgZm9yIEhJREwgY2FsbHMuIE5vdyBjYW1lcmFzZXJ2ZXIgd2lsbCBzZXJ2ZSBISURMIGNhbGxzIGluCisgICAgLy8gYWRkaXRpb24gdG8gY29uc3VtaW5nIHRoZW0gZnJvbSB0aGUgQ2FtZXJhIEhBTCBhcyB3ZWxsLgorICAgIGhhcmR3YXJlOjpjb25maWd1cmVScGNUaHJlYWRwb29sKDUsIC8qd2lsbGpvaW4qLyBmYWxzZSk7CiAKICAgICBzcDxQcm9jZXNzU3RhdGU+IHByb2MoUHJvY2Vzc1N0YXRlOjpzZWxmKCkpOwogICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKICAgICBBTE9HSSgiU2VydmljZU1hbmFnZXI6ICVwIiwgc20uZ2V0KCkpOwogICAgIENhbWVyYVNlcnZpY2U6Omluc3RhbnRpYXRlKCk7CisgICAgQUxPR0koIlNlcnZpY2VNYW5hZ2VyOiAlcCBkb25lIGluc3RhbnRpYXRlIiwgc20uZ2V0KCkpOwogICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5qb2luVGhyZWFkUG9vbCgpOwogfQpkaWZmIC0tZ2l0IGEvY2FtZXJhL2NhbWVyYXNlcnZlci9tYW5pZmVzdF9hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMC54bWwgYi9jYW1lcmEvY2FtZXJhc2VydmVyL21hbmlmZXN0X2FuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLnNlcnZpY2VAMi4wLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDFjNzE3Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2NhbWVyYXNlcnZlci9tYW5pZmVzdF9hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMC54bWwKQEAgLTAsMCArMSwxMSBAQAorPG1hbmlmZXN0IHZlcnNpb249IjEuMCIgdHlwZT0iZnJhbWV3b3JrIj4KKyAgICA8aGFsPgorICAgICAgICA8bmFtZT5hbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlPC9uYW1lPgorICAgICAgICA8dHJhbnNwb3J0Pmh3YmluZGVyPC90cmFuc3BvcnQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KKyAgICAgICAgPGludGVyZmFjZT4KKyAgICAgICAgICAgIDxuYW1lPklDYW1lcmFTZXJ2aWNlPC9uYW1lPgorICAgICAgICAgICAgPGluc3RhbmNlPmRlZmF1bHQ8L2luc3RhbmNlPgorICAgICAgICA8L2ludGVyZmFjZT4KKyAgICA8L2hhbD4KKzwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCmluZGV4IGQyODQ0NzcuLjg0NGJiODAgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYW1lcmFNZXRhZGF0YS5oCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8Y2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0xNzAsNiArMTcxLDEyIEBACiAgICAgc3RhdHVzX3QgZXJhc2UodWludDMyX3QgdGFnKTsKIAogICAgIC8qKgorICAgICAqIFJlbW92ZSBtZXRhZGF0YSBlbnRyaWVzIHRoYXQgbmVlZCBhZGRpdGlvbmFsIHBlcm1pc3Npb25zLgorICAgICAqLworICAgIHN0YXR1c190IHJlbW92ZVBlcm1pc3Npb25FbnRyaWVzKG1ldGFkYXRhX3ZlbmRvcl9pZF90IHZlbmRvcklkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gKnRhZ3NSZW1vdmVkIC8qb3V0Ki8pOworCisgICAgLyoqCiAgICAgICogU3dhcCB0aGUgdW5kZXJseWluZyBjYW1lcmEgbWV0YWRhdGEgYmV0d2VlbiB0aGlzIGFuZCB0aGUgb3RoZXIKICAgICAgKiBtZXRhZGF0YSBvYmplY3QuCiAgICAgICovCmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FwdHVyZVJlc3VsdC5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL0NhcHR1cmVSZXN1bHQuaAppbmRleCA1NmZhMTc4Li5lZjgzMGI1IDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvQ2FwdHVyZVJlc3VsdC5oCisrKyBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9DYXB0dXJlUmVzdWx0LmgKQEAgLTcwLDYgKzcwLDEzIEBACiAgICAgaW50MzJfdCBlcnJvclN0cmVhbUlkOwogCiAgICAgLyoqCisgICAgICogRm9yIGNhcHR1cmUgcmVzdWx0IGVycm9ycywgdGhlIHBoeXNpY2FsIGNhbWVyYSBJRCBpbiBjYXNlIHRoZSByZXNwZWN0aXZlIHJlcXVlc3QgY29udGFpbnMKKyAgICAgKiBhIHJlZmVyZW5jZSB0byBwaHlzaWNhbCBjYW1lcmEgZGV2aWNlLgorICAgICAqIEVtcHR5IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBTdHJpbmcxNiAgZXJyb3JQaHlzaWNhbENhbWVyYUlkOworCisgICAgLyoqCiAgICAgICogQ29uc3RydWN0b3IgaW5pdGlhbGl6ZXMgb2JqZWN0IGFzIGludmFsaWQgYnkgc2V0dGluZyByZXF1ZXN0SWQgdG8gYmUgLTEuCiAgICAgICovCiAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcygpCkBAIC03OSw3ICs4Niw4IEBACiAgICAgICAgICAgcHJlY2FwdHVyZVRyaWdnZXJJZCgwKSwKICAgICAgICAgICBmcmFtZU51bWJlcigwKSwKICAgICAgICAgICBwYXJ0aWFsUmVzdWx0Q291bnQoMCksCi0gICAgICAgICAgZXJyb3JTdHJlYW1JZCgtMSkgeworICAgICAgICAgIGVycm9yU3RyZWFtSWQoLTEpLAorICAgICAgICAgIGVycm9yUGh5c2ljYWxDYW1lcmFJZCgpIHsKICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmggYi9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvVmVuZG9yVGFnRGVzY3JpcHRvci5oCmluZGV4IDkwNGZiYTIuLmIyZmJmM2EgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmgKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL1ZlbmRvclRhZ0Rlc2NyaXB0b3IuaApAQCAtOTksNiArOTksMTEgQEAKICAgICAgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHZlcmJvc2l0eSwgaW50IGluZGVudGF0aW9uKSBjb25zdDsKIAogICAgICAgICAvKioKKyAgICAgICAgICogR2V0IFNlY3Rpb24gZm9yIGNvcnJlc3BvbmRpbmcgdGFnLgorICAgICAgICAgKi8KKyAgICAgICAgc3NpemVfdCBnZXRTZWN0aW9uSW5kZXgodWludDMyX3QgdGFnKSBjb25zdDsKKworICAgICAgICAvKioKICAgICAgICAgICogUmVhZCB2YWx1ZXMgVmVuZG9yVGFnRGVzY3JpcHRvciBvYmplY3QgZnJvbSB0aGUgZ2l2ZW4gcGFyY2VsLgogICAgICAgICAgKgogICAgICAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KQEAgLTE4Myw4ICsxODgsOCBAQAogICAgICAgICAgICAgc3A8YW5kcm9pZDo6VmVuZG9yVGFnRGVzY3JpcHRvcj4gKmRlc2MgLypvdXQqLyk7CiAKICAgICAvLyBQYXJjZWxhYmxlIGludGVyZmFjZQotICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOwotICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBhbmRyb2lkOjpQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CiAKICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdmVuZG9yIHRhZ3MgZGVmaW5lZC4KICAgICBpbnQgZ2V0VGFnQ291bnQobWV0YWRhdGFfdmVuZG9yX2lkX3QgaWQpIGNvbnN0OwpAQCAtMjA2LDYgKzIxMSw5IEBACiAgICAgICovCiAgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHZlcmJvc2l0eSwgaW50IGluZGVudGF0aW9uKSBjb25zdDsKIAorICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxtZXRhZGF0YV92ZW5kb3JfaWRfdCwgc3A8YW5kcm9pZDo6VmVuZG9yVGFnRGVzY3JpcHRvcj4+ICYKKyAgICAgICAgICAgIGdldFZlbmRvcklkc0FuZFRhZ0Rlc2NyaXB0b3JzKCk7CisKICAgcHJvdGVjdGVkOgogICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxtZXRhZGF0YV92ZW5kb3JfaWRfdCwgc3A8YW5kcm9pZDo6VmVuZG9yVGFnRGVzY3JpcHRvcj4+IG1WZW5kb3JNYXA7CiAgICAgc3RydWN0IHZlbmRvcl90YWdfY2FjaGVfb3BzIG1WZW5kb3JDYWNoZU9wczsKZGlmZiAtLWdpdCBhL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaCBiL2NhbWVyYS9pbmNsdWRlL2NhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaAppbmRleCBhODBmNDRiLi45NWM0ZjM5IDEwMDY0NAotLS0gYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmgKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oCkBAIC02NSw4ICs2NSwxNSBAQAogICAgIE91dHB1dENvbmZpZ3VyYXRpb24oY29uc3QgYW5kcm9pZDo6UGFyY2VsJiBwYXJjZWwpOwogCiAgICAgT3V0cHV0Q29uZmlndXJhdGlvbihzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgZ2JwLCBpbnQgcm90YXRpb24sCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgcGh5c2ljYWxDYW1lcmFJZCwKICAgICAgICAgICAgIGludCBzdXJmYWNlU2V0SUQgPSBJTlZBTElEX1NFVF9JRCwgYm9vbCBpc1NoYXJlZCA9IGZhbHNlKTsKIAorICAgIE91dHB1dENvbmZpZ3VyYXRpb24oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+JiBnYnBzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJvdGF0aW9uLCBjb25zdCBTdHJpbmcxNiYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdXJmYWNlU2V0SUQgPSBJTlZBTElEX1NFVF9JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdXJmYWNlVHlwZSA9IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9VTktOT1dOLCBpbnQgd2lkdGggPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCA9IDAsIGJvb2wgaXNTaGFyZWQgPSBmYWxzZSk7CisKICAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uJiBvdGhlcikgY29uc3QgewogICAgICAgICByZXR1cm4gKCBtUm90YXRpb24gPT0gb3RoZXIubVJvdGF0aW9uICYmCiAgICAgICAgICAgICAgICAgbVN1cmZhY2VTZXRJRCA9PSBvdGhlci5tU3VyZmFjZVNldElEICYmCmRpZmYgLS1naXQgYS9jYW1lcmEvaW5jbHVkZS9jYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDI4OGVkCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL2luY2x1ZGUvY2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uaApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9DQU1FUkEyX1NFU1NJT05DT05GSUdVUkFUSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9DQU1FUkEyX1NFU1NJT05DT05GSUdVUkFUSU9OX0gKKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBjYW1lcmEyIHsKK25hbWVzcGFjZSBwYXJhbXMgeworCitjbGFzcyBPdXRwdXRDb25maWd1cmF0aW9uOworCitjbGFzcyBTZXNzaW9uQ29uZmlndXJhdGlvbiA6IHB1YmxpYyBhbmRyb2lkOjpQYXJjZWxhYmxlIHsKK3B1YmxpYzoKKworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPE91dHB1dENvbmZpZ3VyYXRpb24+JiBnZXRPdXRwdXRDb25maWd1cmF0aW9ucygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1PdXRwdXRTdHJlYW1zOworICAgIH0KKworICAgIGludCBnZXRJbnB1dFdpZHRoKCkgY29uc3QgeyByZXR1cm4gbUlucHV0V2lkdGg7IH0KKyAgICBpbnQgZ2V0SW5wdXRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBtSW5wdXRIZWlnaHQ7IH0KKyAgICBpbnQgZ2V0SW5wdXRGb3JtYXQoKSBjb25zdCB7IHJldHVybiBtSW5wdXRGb3JtYXQ7IH0KKyAgICBpbnQgZ2V0T3BlcmF0aW5nTW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1PcGVyYXRpbmdNb2RlOyB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgYW5kcm9pZDo6UGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOworCisgICAgU2Vzc2lvbkNvbmZpZ3VyYXRpb24oKSA6CisgICAgICAgICAgICBtSW5wdXRXaWR0aCgwKSwKKyAgICAgICAgICAgIG1JbnB1dEhlaWdodCgwKSwKKyAgICAgICAgICAgIG1JbnB1dEZvcm1hdCgtMSksCisgICAgICAgICAgICBtT3BlcmF0aW5nTW9kZSgtMSkge30KKworICAgIFNlc3Npb25Db25maWd1cmF0aW9uKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCYgcGFyY2VsKSB7CisgICAgICAgIHJlYWRGcm9tUGFyY2VsKCZwYXJjZWwpOworICAgIH0KKworICAgIFNlc3Npb25Db25maWd1cmF0aW9uKGludCBpbnB1dFdpZHRoLCBpbnQgaW5wdXRIZWlnaHQsIGludCBpbnB1dEZvcm1hdCwgaW50IG9wZXJhdGluZ01vZGUpIDoKKyAgICAgICAgbUlucHV0V2lkdGgoaW5wdXRXaWR0aCksIG1JbnB1dEhlaWdodChpbnB1dEhlaWdodCksIG1JbnB1dEZvcm1hdChpbnB1dEZvcm1hdCksCisgICAgICAgIG1PcGVyYXRpbmdNb2RlKG9wZXJhdGluZ01vZGUpIHt9CisKKyAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChvdXRwdXRzRXF1YWwob3RoZXIpICYmCisgICAgICAgICAgICAgICAgbUlucHV0V2lkdGggPT0gb3RoZXIubUlucHV0V2lkdGggJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRIZWlnaHQgPT0gb3RoZXIubUlucHV0SGVpZ2h0ICYmCisgICAgICAgICAgICAgICAgbUlucHV0Rm9ybWF0ID09IG90aGVyLm1JbnB1dEZvcm1hdCAmJgorICAgICAgICAgICAgICAgIG1PcGVyYXRpbmdNb2RlID09IG90aGVyLm1PcGVyYXRpbmdNb2RlKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikgcmV0dXJuIGZhbHNlOworCisgICAgICAgIGlmIChtSW5wdXRXaWR0aCAhPSBvdGhlci5tSW5wdXRXaWR0aCkgeworICAgICAgICAgICAgcmV0dXJuIG1JbnB1dFdpZHRoIDwgb3RoZXIubUlucHV0V2lkdGg7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUlucHV0SGVpZ2h0ICE9IG90aGVyLm1JbnB1dEhlaWdodCkgeworICAgICAgICAgICAgcmV0dXJuIG1JbnB1dEhlaWdodCA8IG90aGVyLm1JbnB1dEhlaWdodDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSW5wdXRGb3JtYXQgIT0gb3RoZXIubUlucHV0Rm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gbUlucHV0Rm9ybWF0IDwgb3RoZXIubUlucHV0Rm9ybWF0OworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1PcGVyYXRpbmdNb2RlICE9IG90aGVyLm1PcGVyYXRpbmdNb2RlKSB7CisgICAgICAgICAgICByZXR1cm4gbU9wZXJhdGluZ01vZGUgPCBvdGhlci5tT3BlcmF0aW5nTW9kZTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBvdXRwdXRzTGVzc1RoYW4ob3RoZXIpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAoKnRoaXMgIT0gb3RoZXIgJiYgISgqdGhpcyA8IG90aGVyKSk7CisgICAgfQorCisgICAgYm9vbCBvdXRwdXRzRXF1YWwoY29uc3QgU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIG90aGVyKSBjb25zdDsKKyAgICBib29sIG91dHB1dHNMZXNzVGhhbihjb25zdCBTZXNzaW9uQ29uZmlndXJhdGlvbiYgb3RoZXIpIGNvbnN0OworICAgIHZvaWQgYWRkT3V0cHV0Q29uZmlndXJhdGlvbihjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZjb25maWcpIHsKKyAgICAgICAgbU91dHB1dFN0cmVhbXMucHVzaF9iYWNrKGNvbmZpZyk7CisgICAgfQorCitwcml2YXRlOgorCisgICAgc3RkOjp2ZWN0b3I8T3V0cHV0Q29uZmlndXJhdGlvbj4gbU91dHB1dFN0cmVhbXM7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0V2lkdGgsIG1JbnB1dEhlaWdodCwgbUlucHV0Rm9ybWF0LCBtT3BlcmF0aW5nTW9kZTsKK307Cit9IC8vIG5hbWVzcGFjZSBwYXJhbXMKK30gLy8gbmFtZXNwYWNlIGNhbWVyYTIKK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCisKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6OlNlc3Npb25Db25maWd1cmF0aW9uOworCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvQW5kcm9pZC5icCBiL2NhbWVyYS9uZGsvQW5kcm9pZC5icAppbmRleCA3NTA3NWYxLi5kODIyMGViIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL0FuZHJvaWQuYnAKKysrIGIvY2FtZXJhL25kay9BbmRyb2lkLmJwCkBAIC01NSw2ICs1NSw3IEBACiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGliY2FtZXJhX21ldGFkYXRhIiwKICAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCiAgICAgXSwKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLApAQCAtNjMsMTEgKzY0LDk3IEBACiAgICAgICAgICItV2V4dHJhIiwKICAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCisgICAgLy8gVE9ETzogamNob3dkaGFyeUAsIHVzZSBoZWFkZXJfbGlicyBpbnN0ZWFkIGIvMTMxMTY1NzE4CisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSIsCisgICAgXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgIF0sCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJsaWJjYW1lcmEybmRrLm1hcC50eHQiLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNhbWVyYTJuZGtfdmVuZG9yIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwIiwKKyAgICAgICAgIm5ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAiLAorICAgICAgICAibmRrX3ZlbmRvci9pbXBsL3V0aWxzLmNwcCIsCisgICAgICAgICJpbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAiLAorICAgICAgICAiaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwIiwKKyAgICAgICAgIk5ka0NhbWVyYU1ldGFkYXRhLmNwcCIsCisgICAgICAgICJOZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAiLAorICAgICAgICAiTmRrQ2FtZXJhTWFuYWdlci5jcHAiLAorICAgICAgICAiTmRrQ2FtZXJhRGV2aWNlLmNwcCIsCisgICAgICAgICJOZGtDYXB0dXJlUmVxdWVzdC5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgIF0sCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICIuIiwKKyAgICAgICAgImluY2x1ZGUiLAorICAgICAgICAiaW1wbCIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgICAgICAiLURFWFBPUlQ9X19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eShcImRlZmF1bHRcIikpKSIsCisgICAgICAgICItRF9fQU5EUk9JRF9WTkRLX18iLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhhcmR3YXJlIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliY2FtZXJhX21ldGFkYXRhIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImFuZHJvaWQuZnJhbWV3b3Jrcy5jYW1lcmFzZXJ2aWNlLmRldmljZUAyLjAiLAorICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2UuY29tbW9uQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5jb21tb25AMS4wLWhlbHBlciIsCisgICAgICAgICJsaWJhcmVjdCIsCisgICAgXSwKKyAgICAvLyBUT0RPOiBqY2hvd2RoYXJ5QCwgdXNlIGhlYWRlcl9saWJzIGluc3RlYWQgYi8xMzExNjU3MTgKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgInN5c3RlbS9tZWRpYS9wcml2YXRlL2NhbWVyYS9pbmNsdWRlIiwKKyAgICBdLAogICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7CiAgICAgICAgIHBkazogewogICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCiAgICAgICAgIH0sCiAgICAgfSwKLSAgICB2ZXJzaW9uX3NjcmlwdDogImxpYmNhbWVyYTJuZGsubWFwLnR4dCIsCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJBSW1hZ2VSZWFkZXJWZW5kb3JUZXN0IiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjczogWyJuZGtfdmVuZG9yL3Rlc3RzL0FJbWFnZVJlYWRlclZlbmRvclRlc3QuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNhbWVyYTJuZGtfdmVuZG9yIiwKKyAgICAgICAgImxpYmNhbWVyYV9tZXRhZGF0YSIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMC1oZWxwZXIiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRF9fQU5EUk9JRF9WTkRLX18iLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcCBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCmluZGV4IGZkOTUyOTYuLjFhYzg0ODIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCisrKyBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uY3BwCkBAIC0yOCw2ICsyOCw4IEBACiAjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmg+CiAjaW5jbHVkZSAiaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKIAorI2luY2x1ZGUgImltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyIKKwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIEVYUE9SVApAQCAtNzgsMTEgKzgwLDM5IEBACiAKICAgICBpZiAoc2Vzc2lvbi0+aXNDbG9zZWQoKSkgewogICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gJXAgaXMgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb24pOwotICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBDQVBUVVJFX1NFUVVFTkNFX0lEX05PTkU7CisgICAgICAgIGlmIChjYXB0dXJlU2VxdWVuY2VJZCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBDQVBUVVJFX1NFUVVFTkNFX0lEX05PTkU7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CiAgICAgfQogCi0gICAgcmV0dXJuIHNlc3Npb24tPmNhcHR1cmUoY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKKyAgICByZXR1cm4gc2Vzc2lvbi0+Y2FwdHVyZSgKKyAgICAgICAgICAgIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7Cit9CisKK0VYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmUoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyogbGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0ciB8fCByZXF1ZXN0cyA9PSBudWxscHRyIHx8IG51bVJlcXVlc3RzIDwgMSkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBpbnZhbGlkIGlucHV0OiBzZXNzaW9uICVwLCBudW1SZXF1ZXN0ICVkLCByZXF1ZXN0cyAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzZXNzaW9uLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBpZiAoc2Vzc2lvbi0+aXNDbG9zZWQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gJXAgaXMgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb24pOworICAgICAgICBpZiAoY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICAgICAgICAgICpjYXB0dXJlU2VxdWVuY2VJZCA9IENBUFRVUkVfU0VRVUVOQ0VfSURfTk9ORTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKKyAgICB9CisKKyAgICByZXR1cm4gc2Vzc2lvbi0+Y2FwdHVyZSgKKyAgICAgICAgICAgIGxjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOwogfQogCiBFWFBPUlQKQEAgLTk5LDcgKzEyOSw5IEBACiAKICAgICBpZiAoc2Vzc2lvbi0+aXNDbG9zZWQoKSkgewogICAgICAgICBBTE9HRSgiJXM6IHNlc3Npb24gJXAgaXMgYWxyZWFkeSBjbG9zZWQiLCBfX0ZVTkNUSU9OX18sIHNlc3Npb24pOwotICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBDQVBUVVJFX1NFUVVFTkNFX0lEX05PTkU7CisgICAgICAgIGlmIChjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgICAgICAgICAgKmNhcHR1cmVTZXF1ZW5jZUlkID0gQ0FQVFVSRV9TRVFVRU5DRV9JRF9OT05FOworICAgICAgICB9CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwogICAgIH0KIApAQCAtMTA3LDYgKzEzOSwzMCBAQAogfQogCiBFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9zZXRSZXBlYXRpbmdSZXF1ZXN0KAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmIChzZXNzaW9uID09IG51bGxwdHIgfHwgcmVxdWVzdHMgPT0gbnVsbHB0ciB8fCBudW1SZXF1ZXN0cyA8IDEpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogaW52YWxpZCBpbnB1dDogc2Vzc2lvbiAlcCwgbnVtUmVxdWVzdCAlZCwgcmVxdWVzdHMgJXAiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2Vzc2lvbiwgbnVtUmVxdWVzdHMsIHJlcXVlc3RzKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgaWYgKHNlc3Npb24tPmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzZXNzaW9uICVwIGlzIGFscmVhZHkgY2xvc2VkIiwgX19GVU5DVElPTl9fLCBzZXNzaW9uKTsKKyAgICAgICAgaWYgKGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBDQVBUVVJFX1NFUVVFTkNFX0lEX05PTkU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CisgICAgfQorCisgICAgcmV0dXJuIHNlc3Npb24tPnNldFJlcGVhdGluZ1JlcXVlc3QobGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7Cit9CisKK0VYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdG9wUmVwZWF0aW5nKEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKHNlc3Npb24gPT0gbnVsbHB0cikgewpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9OZGtDYW1lcmFEZXZpY2UuY3BwIGIvY2FtZXJhL25kay9OZGtDYW1lcmFEZXZpY2UuY3BwCmluZGV4IDgxMmEzMTIuLjY5MTk5NmIgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhRGV2aWNlLmNwcAorKysgYi9jYW1lcmEvbmRrL05ka0NhbWVyYURldmljZS5jcHAKQEAgLTI0LDcgKzI0LDE1IEBACiAjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYURldmljZS5oPgogI2luY2x1ZGUgImltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmFjYW07CisKK2Jvb2wgYXJlV2luZG93VHlwZXNFcXVhbChBQ2FtZXJhV2luZG93VHlwZSAqYSwgQUNhbWVyYVdpbmRvd1R5cGUgKmIpIHsKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisgICAgcmV0dXJuIHV0aWxzOjppc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKGEsIGIpOworI2Vsc2UKKyAgICByZXR1cm4gYSA9PSBiOworI2VuZGlmCit9CiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFEZXZpY2VfY2xvc2UoQUNhbWVyYURldmljZSogZGV2aWNlKSB7CkBAIC03MCw3ICs3OCwzNCBAQAogICAgICAgICAgICAgQUxPR0UoIiVzOiB1bmtub3duIHRlbXBsYXRlIElEICVkIiwgX19GVU5DVElPTl9fLCB0ZW1wbGF0ZUlkKTsKICAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwogICAgIH0KLSAgICByZXR1cm4gZGV2aWNlLT5jcmVhdGVDYXB0dXJlUmVxdWVzdCh0ZW1wbGF0ZUlkLCByZXF1ZXN0KTsKKyAgICByZXR1cm4gZGV2aWNlLT5jcmVhdGVDYXB0dXJlUmVxdWVzdCh0ZW1wbGF0ZUlkLCBudWxscHRyIC8qcGh5c2ljYWxJZExpc3QqLywgcmVxdWVzdCk7Cit9CisKK0VYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzKAorICAgICAgICBjb25zdCBBQ2FtZXJhRGV2aWNlKiBkZXZpY2UsCisgICAgICAgIEFDYW1lcmFEZXZpY2VfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkLAorICAgICAgICBjb25zdCBBQ2FtZXJhSWRMaXN0KiBwaHlzaWNhbENhbWVyYUlkTGlzdCwKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKGRldmljZSA9PSBudWxscHRyIHx8IHJlcXVlc3QgPT0gbnVsbHB0ciB8fCBwaHlzaWNhbENhbWVyYUlkTGlzdCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBhcmd1bWVudCEgZGV2aWNlICVwIHJlcXVlc3QgJXAsIHBoeXNpY2FsQ2FtZXJhSWRMaXN0ICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZSwgcmVxdWVzdCwgcGh5c2ljYWxDYW1lcmFJZExpc3QpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgc3dpdGNoICh0ZW1wbGF0ZUlkKSB7CisgICAgICAgIGNhc2UgVEVNUExBVEVfUFJFVklFVzoKKyAgICAgICAgY2FzZSBURU1QTEFURV9TVElMTF9DQVBUVVJFOgorICAgICAgICBjYXNlIFRFTVBMQVRFX1JFQ09SRDoKKyAgICAgICAgY2FzZSBURU1QTEFURV9WSURFT19TTkFQU0hPVDoKKyAgICAgICAgY2FzZSBURU1QTEFURV9aRVJPX1NIVVRURVJfTEFHOgorICAgICAgICBjYXNlIFRFTVBMQVRFX01BTlVBTDoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiB1bmtub3duIHRlbXBsYXRlIElEICVkIiwgX19GVU5DVElPTl9fLCB0ZW1wbGF0ZUlkKTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlLT5jcmVhdGVDYXB0dXJlUmVxdWVzdCh0ZW1wbGF0ZUlkLCBwaHlzaWNhbENhbWVyYUlkTGlzdCwgcmVxdWVzdCk7CiB9CiAKIEVYUE9SVApAQCAtOTYsNyArMTMxLDcgQEAKIAogRVhQT1JUCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2NyZWF0ZSgKLSAgICAgICAgQU5hdGl2ZVdpbmRvdyogd2luZG93LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0KSB7CisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3csIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXQpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmICh3aW5kb3cgPT0gbnVsbHB0ciB8fCBvdXQgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgb3V0ICVwIiwKQEAgLTEwOSw3ICsxNDQsNyBAQAogCiBFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfY3JlYXRlKAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3csIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXQpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKHdpbmRvdyA9PSBudWxscHRyIHx8IG91dCA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGJhZCBhcmd1bWVudC4gd2luZG93ICVwLCBvdXQgJXAiLApAQCAtMTIxLDggKzE1NiwyMiBAQAogfQogCiBFWFBPUlQKK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25QaHlzaWNhbE91dHB1dF9jcmVhdGUoCisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3csIGNvbnN0IGNoYXIqIHBoeXNpY2FsSWQsCisgICAgICAgIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXQpIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworICAgIGlmICh3aW5kb3cgPT0gbnVsbHB0ciB8fCBwaHlzaWNhbElkID09IG51bGxwdHIgfHwgb3V0ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogYmFkIGFyZ3VtZW50LiB3aW5kb3cgJXAsIHBoeXNpY2FsSWQgJXAsIG91dCAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB3aW5kb3csIHBoeXNpY2FsSWQsIG91dCk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICAqb3V0ID0gbmV3IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCh3aW5kb3csIGZhbHNlLCBwaHlzaWNhbElkKTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworRVhQT1JUCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2FkZChBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dCwKLSAgICAgICAgQU5hdGl2ZVdpbmRvdyogd2luZG93KSB7CisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiB3aW5kb3cpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmICgod2luZG93ID09IG51bGxwdHIpIHx8IChvdXQgPT0gbnVsbHB0cikpIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogYmFkIGFyZ3VtZW50LiB3aW5kb3cgJXAsIG91dCAlcCIsCkBAIC0xMzQsNyArMTgzLDcgQEAKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgaWYgKG91dC0+bVdpbmRvdyA9PSB3aW5kb3cpIHsKKyAgICBpZiAoYXJlV2luZG93VHlwZXNFcXVhbChvdXQtPm1XaW5kb3csIHdpbmRvdykpIHsKICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciB0cnlpbmcgdG8gYWRkIHRoZSBzYW1lIHdpbmRvdyBhc3NvY2lhdGVkIHdpdGggdGhlIG91dHB1dCBjb25maWd1cmF0aW9uIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKQEAgLTE0Nyw3ICsxOTYsNyBAQAogCiBFWFBPUlQKIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfcmVtb3ZlKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0LAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3cpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKCh3aW5kb3cgPT0gbnVsbHB0cikgfHwgKG91dCA9PSBudWxscHRyKSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBiYWQgYXJndW1lbnQuIHdpbmRvdyAlcCwgb3V0ICVwIiwKQEAgLTE1OSw3ICsyMDgsNyBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBpZiAob3V0LT5tV2luZG93ID09IHdpbmRvdykgeworICAgIGlmIChhcmVXaW5kb3dUeXBlc0VxdWFsKG91dC0+bVdpbmRvdywgd2luZG93KSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHRyeWluZyB0byByZW1vdmUgdGhlIHNhbWUgd2luZG93IGFzc29jaWF0ZWQgd2l0aCB0aGUgb3V0cHV0IGNvbmZpZ3VyYXRpb24iLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwpAQCAtMjM4LDMgKzI4NywxNiBAQAogICAgIH0KICAgICByZXR1cm4gZGV2aWNlLT5jcmVhdGVDYXB0dXJlU2Vzc2lvbihvdXRwdXRzLCBzZXNzaW9uUGFyYW1ldGVycywgY2FsbGJhY2tzLCBzZXNzaW9uKTsKIH0KKworRVhQT1JUCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYURldmljZV9pc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICBjb25zdCBBQ2FtZXJhRGV2aWNlKiBkZXZpY2UsCisgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogc2Vzc2lvbk91dHB1dENvbnRhaW5lcikgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKGRldmljZSA9PSBudWxscHRyIHx8IHNlc3Npb25PdXRwdXRDb250YWluZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBpbnZhbGlkIGlucHV0OiBkZXZpY2UgJXAsIHNlc3Npb25PdXRwdXRDb250YWluZXIgJXAiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlLCBzZXNzaW9uT3V0cHV0Q29udGFpbmVyKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIHJldHVybiBkZXZpY2UtPmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoc2Vzc2lvbk91dHB1dENvbnRhaW5lcik7Cit9CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL05ka0NhbWVyYU1hbmFnZXIuY3BwIGIvY2FtZXJhL25kay9OZGtDYW1lcmFNYW5hZ2VyLmNwcAppbmRleCA2MGI0NzYzLi4zZDIzMWE4IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL05ka0NhbWVyYU1hbmFnZXIuY3BwCisrKyBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWFuYWdlci5jcHAKQEAgLTIyLDkgKzIyLDE1IEBACiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KIAogI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmg+Ci0jaW5jbHVkZSAiaW1wbC9BQ2FtZXJhTWFuYWdlci5oIgogCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmgiCisjZWxzZQorI2luY2x1ZGUgImltcGwvQUNhbWVyYU1hbmFnZXIuaCIKKyNlbmRpZgorI2luY2x1ZGUgImltcGwvQUNhbWVyYU1ldGFkYXRhLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjphY2FtOwogCiBFWFBPUlQKIEFDYW1lcmFNYW5hZ2VyKiBBQ2FtZXJhTWFuYWdlcl9jcmVhdGUoKSB7CkBAIC05OSw2ICsxMDUsNjAgQEAKIH0KIAogRVhQT1JUCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU1hbmFnZXJfcmVnaXN0ZXJFeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICBBQ2FtZXJhTWFuYWdlciogLyptYW5hZ2VyKi8sIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjaykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGFyZ3VtZW50ISBjYWxsYmFjayBpcyBudWxsISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBpZiAoKGNhbGxiYWNrLT5hdmFpbGFiaWxpdHlDYWxsYmFja3Mub25DYW1lcmFBdmFpbGFibGUgPT0gbnVsbHB0cikgfHwKKyAgICAgICAgICAgIChjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLm9uQ2FtZXJhVW5hdmFpbGFibGUgPT0gbnVsbHB0cikgfHwKKyAgICAgICAgICAgIChjYWxsYmFjay0+b25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCA9PSBudWxscHRyKSkgeworICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgYXJndW1lbnQhIGNhbGxiYWNrICVwLCAiCisgICAgICAgICAgICAgICAgIm9uQ2FtZXJhQXZhaWxhYmxlICVwLCBvbkNhbWVyYVVuYXZhaWxhYmxlICVwIG9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQgJXAiLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYWxsYmFjaywKKyAgICAgICAgICAgICAgIGNhbGxiYWNrLT5hdmFpbGFiaWxpdHlDYWxsYmFja3Mub25DYW1lcmFBdmFpbGFibGUsCisgICAgICAgICAgICAgICBjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLm9uQ2FtZXJhVW5hdmFpbGFibGUsCisgICAgICAgICAgICAgICBjYWxsYmFjay0+b25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBhdXRvIHJlc2VydmVkRW50cmllc0NvdW50ID0gc2l6ZW9mKGNhbGxiYWNrLT5yZXNlcnZlZCkgLyBzaXplb2YoY2FsbGJhY2stPnJlc2VydmVkWzBdKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc2VydmVkRW50cmllc0NvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKGNhbGxiYWNrLT5yZXNlcnZlZFtpXSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgYXJndW1lbnQhIGNhbGxiYWNrIHJlc2VydmVkIGVudHJpZXMgbXVzdCBiZSBzZXQgdG8gTlVMTCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgfQorICAgIH0KKyAgICBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpLnJlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjayhjYWxsYmFjayk7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK0VYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYW1lcmFNYW5hZ2VyX3VucmVnaXN0ZXJFeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICBBQ2FtZXJhTWFuYWdlciogLyptYW5hZ2VyKi8sIGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjaykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKGNhbGxiYWNrID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGFyZ3VtZW50ISBjYWxsYmFjayBpcyBudWxsISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBpZiAoKGNhbGxiYWNrLT5hdmFpbGFiaWxpdHlDYWxsYmFja3Mub25DYW1lcmFBdmFpbGFibGUgPT0gbnVsbHB0cikgfHwKKyAgICAgICAgICAgIChjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLm9uQ2FtZXJhVW5hdmFpbGFibGUgPT0gbnVsbHB0cikgfHwKKyAgICAgICAgICAgIChjYWxsYmFjay0+b25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCA9PSBudWxscHRyKSkgeworICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgYXJndW1lbnQhIGNhbGxiYWNrICVwLCAiCisgICAgICAgICAgICAgICAgIm9uQ2FtZXJhQXZhaWxhYmxlICVwLCBvbkNhbWVyYVVuYXZhaWxhYmxlICVwIG9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQgJXAiLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYWxsYmFjaywKKyAgICAgICAgICAgICAgIGNhbGxiYWNrLT5hdmFpbGFiaWxpdHlDYWxsYmFja3Mub25DYW1lcmFBdmFpbGFibGUsCisgICAgICAgICAgICAgICBjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLm9uQ2FtZXJhVW5hdmFpbGFibGUsCisgICAgICAgICAgICAgICBjYWxsYmFjay0+b25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpLnVucmVnaXN0ZXJFeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrKGNhbGxiYWNrKTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworRVhQT1JUCiBjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAogICAgICAgICBBQ2FtZXJhTWFuYWdlciogbWdyLCBjb25zdCBjaGFyKiBjYW1lcmFJZCwgQUNhbWVyYU1ldGFkYXRhKiogY2hhcnMpewogICAgIEFUUkFDRV9DQUxMKCk7CkBAIC0xMDcsNyArMTY3LDE0IEBACiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtZ3IsIGNhbWVyYUlkLCBjaGFycyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwogICAgIH0KLSAgICByZXR1cm4gbWdyLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWQsIGNoYXJzKTsKKyAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHNwQ2hhcnM7CisgICAgY2FtZXJhX3N0YXR1c190IHN0YXR1cyA9IG1nci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkLCAmc3BDaGFycyk7CisgICAgaWYgKHN0YXR1cyAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHNwQ2hhcnMtPmluY1N0cm9uZygodm9pZCopIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcyk7CisgICAgKmNoYXJzID0gc3BDaGFycy5nZXQoKTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKIH0KIAogRVhQT1JUCkBAIC0xMjMsMyArMTkwLDE3IEBACiAgICAgfQogICAgIHJldHVybiBtZ3ItPm9wZW5DYW1lcmEoY2FtZXJhSWQsIGNhbGxiYWNrLCBkZXZpY2UpOwogfQorCisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworRVhQT1JUCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU1hbmFnZXJfZ2V0VGFnRnJvbU5hbWUoQUNhbWVyYU1hbmFnZXIgKm1nciwgY29uc3QgY2hhciogY2FtZXJhSWQsCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIC8qb3V0Ki91aW50MzJfdCAqdGFnKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAobWdyID09IG51bGxwdHIgfHwgY2FtZXJhSWQgPT0gbnVsbHB0ciB8fCBuYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGFyZ3VtZW50ISBtZ3IgJXAgY2FtZXJhSWQgJXAgbmFtZSAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtZ3IsIGNhbWVyYUlkLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorICAgIHJldHVybiBtZ3ItPmdldFRhZ0Zyb21OYW1lKGNhbWVyYUlkLCBuYW1lLCB0YWcpOworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL05ka0NhbWVyYU1ldGFkYXRhLmNwcCBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWV0YWRhdGEuY3BwCmluZGV4IDY1ZGU4MWYuLjlhMzllZDggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWV0YWRhdGEuY3BwCisrKyBiL2NhbWVyYS9uZGsvTmRrQ2FtZXJhTWV0YWRhdGEuY3BwCkBAIC01NywxMyArNTcsMzIgQEAKICAgICAgICAgQUxPR0UoIiVzOiBzcmMgaXMgbnVsbCEiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9Ci0gICAgcmV0dXJuIG5ldyBBQ2FtZXJhTWV0YWRhdGEoKnNyYyk7CisgICAgQUNhbWVyYU1ldGFkYXRhKiBjb3B5ID0gbmV3IEFDYW1lcmFNZXRhZGF0YSgqc3JjKTsKKyAgICBjb3B5LT5pbmNTdHJvbmcoKHZvaWQqKSBBQ2FtZXJhTWV0YWRhdGFfY29weSk7CisgICAgcmV0dXJuIGNvcHk7CiB9CiAKIEVYUE9SVAogdm9pZCBBQ2FtZXJhTWV0YWRhdGFfZnJlZShBQ2FtZXJhTWV0YWRhdGEqIG1ldGFkYXRhKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbHB0cikgewotICAgICAgICBkZWxldGUgbWV0YWRhdGE7CisgICAgICAgIG1ldGFkYXRhLT5kZWNTdHJvbmcoKHZvaWQqKSBBQ2FtZXJhTWV0YWRhdGFfZnJlZSk7CiAgICAgfQogfQorCitFWFBPUlQKK2Jvb2wgQUNhbWVyYU1ldGFkYXRhX2lzTG9naWNhbE11bHRpQ2FtZXJhKGNvbnN0IEFDYW1lcmFNZXRhZGF0YSogc3RhdGljTWV0YWRhdGEsCisgICAgICAgIC8qb3V0Ki9zaXplX3QqIG51bVBoeXNpY2FsQ2FtZXJhcywgLypvdXQqL2NvbnN0IGNoYXIqY29uc3QqKiBwaHlzaWNhbENhbWVyYUlkcykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKG51bVBoeXNpY2FsQ2FtZXJhcyA9PSBudWxscHRyIHx8IHBoeXNpY2FsQ2FtZXJhSWRzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGlucHV0OiBudW1QaHlzaWNhbENhbWVyYXMgJXAsIHBoeXNpY2FsQ2FtZXJhSWRzICVwIiwKKyAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBudW1QaHlzaWNhbENhbWVyYXMsIHBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoc3RhdGljTWV0YWRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgaW5wdXQ6IHN0YXRpY01ldGFkYXRhIGlzIG51bGwuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBzdGF0aWNNZXRhZGF0YS0+aXNMb2dpY2FsTXVsdGlDYW1lcmEobnVtUGh5c2ljYWxDYW1lcmFzLCBwaHlzaWNhbENhbWVyYUlkcyk7Cit9CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL05ka0NhcHR1cmVSZXF1ZXN0LmNwcCBiL2NhbWVyYS9uZGsvTmRrQ2FwdHVyZVJlcXVlc3QuY3BwCmluZGV4IGFjMTg1NmIuLjg3ZGU0YTkgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvTmRrQ2FwdHVyZVJlcXVlc3QuY3BwCisrKyBiL2NhbWVyYS9uZGsvTmRrQ2FwdHVyZVJlcXVlc3QuY3BwCkBAIC0yNyw3ICsyNyw3IEBACiAKIEVYUE9SVAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlKAotICAgICAgICBBTmF0aXZlV2luZG93KiB3aW5kb3csIEFDYW1lcmFPdXRwdXRUYXJnZXQqKiBvdXQpIHsKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgQUNhbWVyYU91dHB1dFRhcmdldCoqIG91dCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKHdpbmRvdyA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IGlucHV0IHdpbmRvdyBpcyBudWxsIiwgX19GVU5DVElPTl9fKTsKQEAgLTk4LDYgKzk4LDI3IEBACiB9CiAKIEVYUE9SVAorY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9nZXRDb25zdEVudHJ5X3BoeXNpY2FsQ2FtZXJhKAorICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHJlcSwgY29uc3QgY2hhciogcGh5c2ljYWxJZCwKKyAgICAgICAgdWludDMyX3QgdGFnLCBBQ2FtZXJhTWV0YWRhdGFfY29uc3RfZW50cnkqIGVudHJ5KSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBpZiAocmVxID09IG51bGxwdHIgfHwgZW50cnkgPT0gbnVsbHB0ciB8fCBwaHlzaWNhbElkID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIGFyZ3VtZW50ISByZXEgJXAsIHRhZyAweCV4LCBlbnRyeSAlcCwgcGh5c2ljYWxJZCAlcCIsCisgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlcSwgdGFnLCBlbnRyeSwgcGh5c2ljYWxJZCk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIGNvbnN0IGF1dG8mIHBoeXNpY2FsU2V0dGluZ3MgPSByZXEtPnBoeXNpY2FsU2V0dGluZ3MuZmluZChwaHlzaWNhbElkKTsKKyAgICBpZiAocGh5c2ljYWxTZXR0aW5ncyA9PSByZXEtPnBoeXNpY2FsU2V0dGluZ3MuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZmluZCBtZXRhZGF0YSBmb3IgcGh5c2ljYWwgY2FtZXJhIGlkICAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwaHlzaWNhbElkKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgfQorCisgICAgcmV0dXJuIHBoeXNpY2FsU2V0dGluZ3MtPnNlY29uZC0+Z2V0Q29uc3RFbnRyeSh0YWcsIGVudHJ5KTsKK30KKworRVhQT1JUCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X2dldEFsbFRhZ3MoCiAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxLCAvKm91dCovaW50MzJfdCogbnVtVGFncywgLypvdXQqL2NvbnN0IHVpbnQzMl90KiogdGFncykgewogICAgIEFUUkFDRV9DQUxMKCk7CkBAIC0xMzEsMTMgKzE1Miw0MiBAQAogCiAjdW5kZWYgU0VUX0VOVFJZCiAKKyNkZWZpbmUgU0VUX1BIWVNJQ0FMX0VOVFJZKE5BTUUsTkRLX1RZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitFWFBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV8jI05BTUUoICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXEsIGNvbnN0IGNoYXIqIHBoeXNpY2FsSWQsIHVpbnQzMl90IHRhZywgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVpbnQzMl90IGNvdW50LCBjb25zdCBOREtfVFlQRSogZGF0YSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFUUkFDRV9DQUxMKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAocmVxID09IG51bGxwdHIgfHwgKGNvdW50ID4gMCAmJiBkYXRhID09IG51bGxwdHIpIHx8IHBoeXNpY2FsSWQgPT0gbnVsbHB0cikgeyAgICBcCisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBhcmd1bWVudCEgcmVxICVwLCB0YWcgMHgleCwgY291bnQgJWQsIGRhdGEgMHglcCwgcGh5c2ljYWxJZCAlcCIsIFwKKyAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVxLCB0YWcsIGNvdW50LCBkYXRhLCBwaHlzaWNhbElkKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAocmVxLT5waHlzaWNhbFNldHRpbmdzLmZpbmQocGh5c2ljYWxJZCkgPT0gcmVxLT5waHlzaWNhbFNldHRpbmdzLmVuZCgpKSB7ICAgICAgICBcCisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGZpbmQgbWV0YWRhdGEgZm9yIHBoeXNpY2FsIGNhbWVyYSBpZCAlcyIsICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwaHlzaWNhbElkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiByZXEtPnBoeXNpY2FsU2V0dGluZ3NbcGh5c2ljYWxJZF0tPnVwZGF0ZSh0YWcsIGNvdW50LCBkYXRhKTsgICAgICAgICAgICAgICAgIFwKK30KKworU0VUX1BIWVNJQ0FMX0VOVFJZKHU4LHVpbnQ4X3QpCitTRVRfUEhZU0lDQUxfRU5UUlkoaTMyLGludDMyX3QpCitTRVRfUEhZU0lDQUxfRU5UUlkoZmxvYXQsZmxvYXQpCitTRVRfUEhZU0lDQUxfRU5UUlkoZG91YmxlLGRvdWJsZSkKK1NFVF9QSFlTSUNBTF9FTlRSWShpNjQsaW50NjRfdCkKK1NFVF9QSFlTSUNBTF9FTlRSWShyYXRpb25hbCxBQ2FtZXJhTWV0YWRhdGFfcmF0aW9uYWwpCisKKyN1bmRlZiBTRVRfUEhZU0lDQUxfRU5UUlkKKwogRVhQT1JUCiB2b2lkIEFDYXB0dXJlUmVxdWVzdF9mcmVlKEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgaWYgKHJlcXVlc3QgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGRlbGV0ZSByZXF1ZXN0LT5zZXR0aW5nczsKKyAgICByZXF1ZXN0LT5zZXR0aW5ncy5jbGVhcigpOworICAgIHJlcXVlc3QtPnBoeXNpY2FsU2V0dGluZ3MuY2xlYXIoKTsKICAgICBkZWxldGUgcmVxdWVzdC0+dGFyZ2V0czsKICAgICBkZWxldGUgcmVxdWVzdDsKICAgICByZXR1cm47CkBAIC0xNzQsNiArMjI0LDkgQEAKIAogICAgIEFDYXB0dXJlUmVxdWVzdCogcFJlcXVlc3QgPSBuZXcgQUNhcHR1cmVSZXF1ZXN0KCk7CiAgICAgcFJlcXVlc3QtPnNldHRpbmdzID0gbmV3IEFDYW1lcmFNZXRhZGF0YSgqKHNyYy0+c2V0dGluZ3MpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGVudHJ5IDogc3JjLT5waHlzaWNhbFNldHRpbmdzKSB7CisgICAgICAgIHBSZXF1ZXN0LT5waHlzaWNhbFNldHRpbmdzW2VudHJ5LmZpcnN0XSA9IG5ldyBBQ2FtZXJhTWV0YWRhdGEoKihlbnRyeS5zZWNvbmQpKTsKKyAgICB9CiAgICAgcFJlcXVlc3QtPnRhcmdldHMgID0gbmV3IEFDYW1lcmFPdXRwdXRUYXJnZXRzKCk7CiAgICAgKihwUmVxdWVzdC0+dGFyZ2V0cykgID0gKihzcmMtPnRhcmdldHMpOwogICAgIHBSZXF1ZXN0LT5jb250ZXh0ID0gc3JjLT5jb250ZXh0OwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5jcHAgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcAppbmRleCBmNjBlNWZkLi42OGRiMjMzIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmNwcApAQCAtMjMsNyArMjMsNyBAQAogCiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb246On5BQ2FtZXJhQ2FwdHVyZVNlc3Npb24oKSB7CiAgICAgQUxPR1YoIn5BQ2FtZXJhQ2FwdHVyZVNlc3Npb246ICVwIG5vdGlmeSBkZXZpY2UgZW5kIG9mIGxpZmUiLCB0aGlzKTsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgIT0gbnVsbHB0ciAmJiAhZGV2LT5pc0Nsb3NlZCgpKSB7CiAgICAgICAgIGRldi0+bG9ja0RldmljZUZvclNlc3Npb25PcHMoKTsKICAgICAgICAgewpAQCAtMzMsNyArMzMsOSBAQAogICAgICAgICBkZXYtPnVubG9ja0RldmljZSgpOwogICAgIH0KICAgICAvLyBGaXJlIG9uQ2xvc2VkIGNhbGxiYWNrCi0gICAgKCptVXNlclNlc3Npb25DYWxsYmFjay5vbkNsb3NlZCkobVVzZXJTZXNzaW9uQ2FsbGJhY2suY29udGV4dCwgdGhpcyk7CisgICAgaWYgKG1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uQ2xvc2VkICE9IG51bGxwdHIpIHsKKyAgICAgICAgKCptVXNlclNlc3Npb25DYWxsYmFjay5vbkNsb3NlZCkobVVzZXJTZXNzaW9uQ2FsbGJhY2suY29udGV4dCwgdGhpcyk7CisgICAgfQogICAgIEFMT0dWKCJ+QUNhbWVyYUNhcHR1cmVTZXNzaW9uOiAlcCBpcyBkZWxldGVkIiwgdGhpcyk7CiB9CiAKQEAgLTQ4LDcgKzUwLDcgQEAKICAgICAgICAgbUNsb3NlZEJ5QXBwID0gdHJ1ZTsKICAgICB9CiAKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgIT0gbnVsbHB0cikgewogICAgICAgICBkZXYtPmxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCk7CiAgICAgfQpAQCAtNzMsNyArNzUsNyBAQAogCiBjYW1lcmFfc3RhdHVzX3QKIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6c3RvcFJlcGVhdGluZygpIHsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwpAQCAtOTEsNyArOTMsNyBAQAogCiBjYW1lcmFfc3RhdHVzX3QKIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6YWJvcnRDYXB0dXJlcygpIHsKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwogICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwpAQCAtMTA3LDQ5ICsxMDksOCBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWNhbWVyYV9zdGF0dXNfdAotQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjpzZXRSZXBlYXRpbmdSZXF1ZXN0KAotICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzLAotICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAotICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwotICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7Ci0gICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwotICAgIH0KLQotICAgIGNhbWVyYV9zdGF0dXNfdCByZXQ7Ci0gICAgZGV2LT5sb2NrRGV2aWNlRm9yU2Vzc2lvbk9wcygpOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZXNzaW9uTG9jayk7Ci0gICAgICAgIHJldCA9IGRldi0+c2V0UmVwZWF0aW5nUmVxdWVzdHNMb2NrZWQoCi0gICAgICAgICAgICAgICAgdGhpcywgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKLSAgICB9Ci0gICAgZGV2LT51bmxvY2tEZXZpY2UoKTsKLSAgICByZXR1cm4gcmV0OwotfQotCi1jYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjpjYXB0dXJlKAotICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzLAotICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAotICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOwotICAgIGlmIChkZXYgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiRXJyb3I6IERldmljZSBhc3NvY2lhdGVkIHdpdGggc2Vzc2lvbiAlcCBoYXMgYmVlbiBjbG9zZWQhIiwgdGhpcyk7Ci0gICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1NFU1NJT05fQ0xPU0VEOwotICAgIH0KLSAgICBjYW1lcmFfc3RhdHVzX3QgcmV0OwotICAgIGRldi0+bG9ja0RldmljZUZvclNlc3Npb25PcHMoKTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vzc2lvbkxvY2spOwotICAgICAgICByZXQgPSBkZXYtPmNhcHR1cmVMb2NrZWQodGhpcywgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkKTsKLSAgICB9Ci0gICAgZGV2LT51bmxvY2tEZXZpY2UoKTsKLSAgICByZXR1cm4gcmV0OwotfQotCiBjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjp1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0cHV0KSB7Ci0gICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBnZXREZXZpY2VTcCgpOworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKICAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOwogICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKQEAgLTE2OCw3ICsxMjksNyBAQAogQUNhbWVyYURldmljZSoKIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbjo6Z2V0RGV2aWNlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vzc2lvbkxvY2spOwotICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKKyAgICBzcDxhY2FtOjpDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CiAgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJFcnJvcjogRGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uICVwIGhhcyBiZWVuIGNsb3NlZCEiLCB0aGlzKTsKICAgICAgICAgcmV0dXJuIG51bGxwdHI7CkBAIC0xODIsOSArMTQzLDkgQEAKICAgICBtSXNDbG9zZWQgPSB0cnVlOwogfQogCi1zcDxDYW1lcmFEZXZpY2U+CitzcDxhY2FtOjpDYW1lcmFEZXZpY2U+CiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OmdldERldmljZVNwKCkgewotICAgIHNwPENhbWVyYURldmljZT4gZGV2aWNlID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgc3A8YWNhbTo6Q2FtZXJhRGV2aWNlPiBkZXZpY2UgPSBtRGV2aWNlLnByb21vdGUoKTsKICAgICBpZiAoZGV2aWNlID09IG51bGxwdHIgfHwgZGV2aWNlLT5pc0Nsb3NlZCgpKSB7CiAgICAgICAgIEFMT0dXKCJEZXZpY2UgaXMgY2xvc2VkIGJ1dCBzZXNzaW9uICVkIGlzIG5vdCBub3RpZmllZCIsIG1JZCk7CiAgICAgICAgIHJldHVybiBudWxscHRyOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCmluZGV4IGEyMDY4ZTcuLjA4YTkyMjYgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmgKQEAgLTE3LDE1ICsxNywyMiBAQAogI2RlZmluZSBfQUNBTUVSQV9DQVBUVVJFX1NFU1NJT05fSAogCiAjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEzLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYURldmljZS5oPgorCisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworI2luY2x1ZGUgIm5ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmgiCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFDYXB0dXJlU2Vzc2lvblZlbmRvci5oIgorI2Vsc2UKICNpbmNsdWRlICJBQ2FtZXJhRGV2aWNlLmgiCiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCiBzdHJ1Y3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0IHsKLSAgICBleHBsaWNpdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQoQU5hdGl2ZVdpbmRvdyogd2luZG93LCBib29sIGlzU2hhcmVkID0gZmFsc2UpIDoKLSAgICAgICAgICAgIG1XaW5kb3cod2luZG93KSwgbUlzU2hhcmVkKGlzU2hhcmVkKSB7fTsKKyAgICBleHBsaWNpdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQoQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdywgYm9vbCBpc1NoYXJlZCA9IGZhbHNlLAorICAgICAgICAgICAgY29uc3QgY2hhciogcGh5c2ljYWxDYW1lcmFJZCA9ICIiKSA6CisgICAgICAgICAgICBtV2luZG93KHdpbmRvdyksIG1Jc1NoYXJlZChpc1NoYXJlZCksIG1QaHlzaWNhbENhbWVyYUlkKHBoeXNpY2FsQ2FtZXJhSWQpIHt9OwogCiAgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0JiBvdGhlcikgY29uc3QgewogICAgICAgICByZXR1cm4gbVdpbmRvdyA9PSBvdGhlci5tV2luZG93OwpAQCAtNDAsMTEgKzQ3LDEzIEBACiAgICAgICAgIHJldHVybiBtV2luZG93ID4gb3RoZXIubVdpbmRvdzsKICAgICB9CiAKLSAgICBBTmF0aXZlV2luZG93KiBtV2luZG93OwotICAgIHN0ZDo6c2V0PEFOYXRpdmVXaW5kb3cgKj4gbVNoYXJlZFdpbmRvd3M7CisgICAgQUNhbWVyYVdpbmRvd1R5cGUqIG1XaW5kb3c7CisgICAgc3RkOjpzZXQ8QUNhbWVyYVdpbmRvd1R5cGUgKj4gbVNoYXJlZFdpbmRvd3M7CiAgICAgYm9vbCAgICAgICAgICAgbUlzU2hhcmVkOwogICAgIGludCAgICAgICAgICAgIG1Sb3RhdGlvbiA9IENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzA7CisgICAgc3RkOjpzdHJpbmcgbVBoeXNpY2FsQ2FtZXJhSWQ7CiB9OworI2VuZGlmCiAKIHN0cnVjdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIgewogICAgIHN0ZDo6c2V0PEFDYXB0dXJlU2Vzc2lvbk91dHB1dD4gbU91dHB1dHM7CkBAIC02MCw3ICs2OSw3IEBACiAgICAgICAgICAgICBpbnQgaWQsCiAgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIG91dHB1dHMsCiAgICAgICAgICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MqIGNiLAotICAgICAgICAgICAgQ2FtZXJhRGV2aWNlKiBkZXZpY2UpIDoKKyAgICAgICAgICAgIGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZSogZGV2aWNlKSA6CiAgICAgICAgICAgICBtSWQoaWQpLCBtT3V0cHV0KCpvdXRwdXRzKSwgbVVzZXJTZXNzaW9uQ2FsbGJhY2soKmNiKSwKICAgICAgICAgICAgIG1EZXZpY2UoZGV2aWNlKSB7fQogCkBAIC04MiwxMyArOTEsMTUgQEAKIAogICAgIGNhbWVyYV9zdGF0dXNfdCBhYm9ydENhcHR1cmVzKCk7CiAKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgIGNhbWVyYV9zdGF0dXNfdCBzZXRSZXBlYXRpbmdSZXF1ZXN0KAotICAgICAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKICAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCiAgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKIAorICAgIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICAgY2FtZXJhX3N0YXR1c190IGNhcHR1cmUoCi0gICAgICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzLAorICAgICAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAogICAgICAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKICAgICAgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpOwogCkBAIC05NywxOCArMTA4LDE4IEBACiAgICAgQUNhbWVyYURldmljZSogZ2V0RGV2aWNlKCk7CiAKICAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgQ2FtZXJhRGV2aWNlOworICAgIGZyaWVuZCBjbGFzcyBhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2U7CiAKICAgICAvLyBDbG9zZSBzZXNzaW9uIGJlY2F1c2UgYXBwIGNsb3NlIGNhbWVyYSBkZXZpY2UsIGNhbWVyYSBkZXZpY2UgZ290IEVSUk9SX0RJU0NPTk5FQ1RFRCwKICAgICAvLyBvciBhIG5ldyBzZXNzaW9uIGlzIHJlcGxhY2luZyB0aGlzIHNlc3Npb24uCiAgICAgdm9pZCBjbG9zZUJ5RGV2aWNlKCk7CiAKLSAgICBzcDxDYW1lcmFEZXZpY2U+IGdldERldmljZVNwKCk7CisgICAgc3A8YW5kcm9pZDo6YWNhbTo6Q2FtZXJhRGV2aWNlPiBnZXREZXZpY2VTcCgpOwogCiAgICAgY29uc3QgaW50IG1JZDsKICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIgbU91dHB1dDsKICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MgbVVzZXJTZXNzaW9uQ2FsbGJhY2s7Ci0gICAgY29uc3Qgd3A8Q2FtZXJhRGV2aWNlPiBtRGV2aWNlOworICAgIGNvbnN0IHdwPGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZT4gbURldmljZTsKICAgICBib29sICBtSXNDbG9zZWQgPSBmYWxzZTsKICAgICBib29sICBtQ2xvc2VkQnlBcHAgPSBmYWxzZTsKICAgICBNdXRleCBtU2Vzc2lvbkxvY2s7CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2YmY4YTUKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYwpAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgorCisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworI2luY2x1ZGUgIm5ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlVmVuZG9yLmluYyIKKyNlbHNlCisjaW5jbHVkZSAiQUNhbWVyYURldmljZS5pbmMiCisjZW5kaWYKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190CitBQ2FtZXJhQ2FwdHVyZVNlc3Npb246OnNldFJlcGVhdGluZ1JlcXVlc3QoCisgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgIHNwPGFjYW06OkNhbWVyYURldmljZT4gZGV2ID0gZ2V0RGV2aWNlU3AoKTsKKyAgICBpZiAoZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yOiBEZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHNlc3Npb24gJXAgaGFzIGJlZW4gY2xvc2VkISIsIHRoaXMpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9TRVNTSU9OX0NMT1NFRDsKKyAgICB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0OworICAgIGRldi0+bG9ja0RldmljZUZvclNlc3Npb25PcHMoKTsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vzc2lvbkxvY2spOworICAgICAgICByZXQgPSBkZXYtPnNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKAorICAgICAgICAgICAgICAgIHRoaXMsIGNicywgbnVtUmVxdWVzdHMsIHJlcXVlc3RzLCBjYXB0dXJlU2VxdWVuY2VJZCk7CisgICAgfQorICAgIGRldi0+dW5sb2NrRGV2aWNlKCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uOjpjYXB0dXJlKAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICBzcDxhY2FtOjpDYW1lcmFEZXZpY2U+IGRldiA9IGdldERldmljZVNwKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJFcnJvcjogRGV2aWNlIGFzc29jaWF0ZWQgd2l0aCBzZXNzaW9uICVwIGhhcyBiZWVuIGNsb3NlZCEiLCB0aGlzKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfU0VTU0lPTl9DTE9TRUQ7CisgICAgfQorICAgIGNhbWVyYV9zdGF0dXNfdCByZXQ7CisgICAgZGV2LT5sb2NrRGV2aWNlRm9yU2Vzc2lvbk9wcygpOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZXNzaW9uTG9jayk7CisgICAgICAgIHJldCA9IGRldi0+Y2FwdHVyZUxvY2tlZCh0aGlzLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQpOworICAgIH0KKyAgICBkZXYtPnVubG9ja0RldmljZSgpOworICAgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5jcHAKaW5kZXggZmZhYmY3Yi4uNDZhOGRhZSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcApAQCAtMjAsMTYgKzIwLDIxIEBACiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPGludHR5cGVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5oPgotI2luY2x1ZGUgPGNhbWVyYTIvU3VibWl0SW5mby5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSAiQUNhbWVyYURldmljZS5oIgogI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgogI2luY2x1ZGUgIkFDYXB0dXJlUmVxdWVzdC5oIgogI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgogCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKyNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaW5jIgorCitBQ2FtZXJhRGV2aWNlOjp+QUNhbWVyYURldmljZSgpIHsKKyAgICBtRGV2aWNlLT5zdG9wTG9vcGVyQW5kRGlzY29ubmVjdCgpOworfQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKIC8vIFN0YXRpYyBtZW1iZXIgZGVmaW5pdGlvbnMKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NvbnRleHRLZXkgICAgICAgID0gIkNvbnRleHQiOwogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprRGV2aWNlS2V5ICAgICAgICAgPSAiRGV2aWNlIjsKQEAgLTM5LDEwICs0NCwxMiBAQAogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ2FwdHVyZVJlcXVlc3RLZXkgPSAiQ2FwdHVyZVJlcXVlc3QiOwogY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprVGltZVN0YW1wS2V5ICAgICAgPSAiVGltZVN0YW1wIjsKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NhcHR1cmVSZXN1bHRLZXkgID0gIkNhcHR1cmVSZXN1bHQiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5ID0gIlBoeXNpY2FsQ2FwdHVyZVJlc3VsdCI7CiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDYXB0dXJlRmFpbHVyZUtleSA9ICJDYXB0dXJlRmFpbHVyZSI7CiBjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtTZXF1ZW5jZUlkS2V5ICAgICA9ICJTZXF1ZW5jZUlkIjsKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0ZyYW1lTnVtYmVyS2V5ICAgID0gIkZyYW1lTnVtYmVyIjsKIGNvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0Fud0tleSAgICAgICAgICAgID0gIkFudyI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtGYWlsaW5nUGh5c2ljYWxDYW1lcmFJZD0gIkZhaWxpbmdQaHlzaWNhbENhbWVyYUlkIjsKIAogLyoqCiAgKiBDYW1lcmFEZXZpY2UgSW1wbGVtZW50YXRpb24KQEAgLTUwLDExICs1NywxMSBAQAogQ2FtZXJhRGV2aWNlOjpDYW1lcmFEZXZpY2UoCiAgICAgICAgIGNvbnN0IGNoYXIqIGlkLAogICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYiwKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMsCisgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMsCiAgICAgICAgIEFDYW1lcmFEZXZpY2UqIHdyYXBwZXIpIDoKICAgICAgICAgbUNhbWVyYUlkKGlkKSwKICAgICAgICAgbUFwcENhbGxiYWNrcygqY2IpLAotICAgICAgICBtQ2hhcnMoc3RkOjptb3ZlKGNoYXJzKSksCisgICAgICAgIG1DaGFycyhjaGFycyksCiAgICAgICAgIG1TZXJ2aWNlQ2FsbGJhY2sobmV3IFNlcnZpY2VDYWxsYmFjayh0aGlzKSksCiAgICAgICAgIG1XcmFwcGVyKHdyYXBwZXIpLAogICAgICAgICBtSW5FcnJvcihmYWxzZSksCkBAIC03NCw3ICs4MSw3IEBACiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKICAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKICAgICB9Ci0gICAgbUhhbmRsZXIgPSBuZXcgQ2FsbGJhY2tIYW5kbGVyKCk7CisgICAgbUhhbmRsZXIgPSBuZXcgQ2FsbGJhY2tIYW5kbGVyKGlkKTsKICAgICBtQ2JMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CiAKICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEgPSBtQ2hhcnMtPmdldEludGVybmFsRGF0YSgpOwpAQCAtOTUsMjYgKzEwMiwxOCBAQAogICAgICAgICBtU2hhZGluZ01hcFNpemVbMF0gPSBlbnRyeS5kYXRhLmkzMlswXTsKICAgICAgICAgbVNoYWRpbmdNYXBTaXplWzFdID0gZW50cnkuZGF0YS5pMzJbMV07CiAgICAgfQotfQogCi0vLyBEZXZpY2UgY2xvc2UgaW1wbGVtZW50YWl0b24KLUNhbWVyYURldmljZTo6fkNhbWVyYURldmljZSgpIHsKLSAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBtQ3VycmVudFNlc3Npb24ucHJvbW90ZSgpOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKLSAgICAgICAgaWYgKCFpc0Nsb3NlZCgpKSB7Ci0gICAgICAgICAgICBkaXNjb25uZWN0TG9ja2VkKHNlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50U2Vzc2lvbiA9IG51bGxwdHI7Ci0gICAgICAgIGlmIChtQ2JMb29wZXIgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgbUNiTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlci0+aWQoKSk7Ci0gICAgICAgICAgICBtQ2JMb29wZXItPnN0b3AoKTsKKyAgICBzaXplX3QgcGh5c2ljYWxJZENudCA9IDA7CisgICAgY29uc3QgY2hhcipjb25zdCogcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgaWYgKG1DaGFycy0+aXNMb2dpY2FsTXVsdGlDYW1lcmEoJnBoeXNpY2FsSWRDbnQsICZwaHlzaWNhbENhbWVyYUlkcykpIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbElkQ250OyBpKyspIHsKKyAgICAgICAgICAgIG1QaHlzaWNhbElkcy5wdXNoX2JhY2socGh5c2ljYWxDYW1lcmFJZHNbaV0pOwogICAgICAgICB9CiAgICAgfQotICAgIG1DYkxvb3Blci5jbGVhcigpOwotICAgIG1IYW5kbGVyLmNsZWFyKCk7CiB9CiAKK0NhbWVyYURldmljZTo6fkNhbWVyYURldmljZSgpIHsgfQorCiB2b2lkCiBDYW1lcmFEZXZpY2U6OnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChzcDxBTWVzc2FnZT4mIG1zZykgewogICAgIG1zZy0+cG9zdCgpOwpAQCAtMTI3LDggKzEyNiwyOSBAQAogY2FtZXJhX3N0YXR1c190CiBDYW1lcmFEZXZpY2U6OmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KAogICAgICAgICBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgY29uc3QgQUNhbWVyYUlkTGlzdCogcGh5c2ljYWxJZExpc3QsCiAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3QpIGNvbnN0IHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURldmljZUxvY2spOworCisgICAgaWYgKHBoeXNpY2FsSWRMaXN0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKHBoeXNpY2FsSWRMaXN0LT5udW1DYW1lcmFzID4gc3RhdGljX2Nhc3Q8aW50PihtUGh5c2ljYWxJZHMuc2l6ZSgpKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBwaHlzaWNhbElkTGlzdCBzaXplICVkIGV4Y2VlZHMgbnVtYmVyIG9mIGF2YWlsYWJsZSBwaHlzaWNhbCBjYW1lcmFzICV6dSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcGh5c2ljYWxJZExpc3QtPm51bUNhbWVyYXMsIG1QaHlzaWNhbElkcy5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvIGkgPSAwOyBpIDwgcGh5c2ljYWxJZExpc3QtPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICAgICAgaWYgKHBoeXNpY2FsSWRMaXN0LT5jYW1lcmFJZHNbaV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogcGh5c2ljYWxJZCBpcyBudWxsISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVBoeXNpY2FsSWRzLmVuZCgpID09IHN0ZDo6ZmluZCgKKyAgICAgICAgICAgICAgICAgICAgbVBoeXNpY2FsSWRzLmJlZ2luKCksIG1QaHlzaWNhbElkcy5lbmQoKSwgcGh5c2ljYWxJZExpc3QtPmNhbWVyYUlkc1tpXSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcGh5c2ljYWxJZCAlcyEiLCBfX0ZVTkNUSU9OX18sIHBoeXNpY2FsSWRMaXN0LT5jYW1lcmFJZHNbaV0pOworICAgICAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCiAgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOwogICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewogICAgICAgICByZXR1cm4gcmV0OwpAQCAtMTQ5LDYgKzE2OSwxMiBAQAogICAgIH0KICAgICBBQ2FwdHVyZVJlcXVlc3QqIG91dFJlcSA9IG5ldyBBQ2FwdHVyZVJlcXVlc3QoKTsKICAgICBvdXRSZXEtPnNldHRpbmdzID0gbmV3IEFDYW1lcmFNZXRhZGF0YShyYXdSZXF1ZXN0LnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVRVUVTVCk7CisgICAgaWYgKHBoeXNpY2FsSWRMaXN0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgZm9yIChhdXRvIGkgPSAwOyBpIDwgcGh5c2ljYWxJZExpc3QtPm51bUNhbWVyYXM7IGkrKykgeworICAgICAgICAgICAgb3V0UmVxLT5waHlzaWNhbFNldHRpbmdzLmVtcGxhY2UocGh5c2ljYWxJZExpc3QtPmNhbWVyYUlkc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFDYW1lcmFNZXRhZGF0YSgqKG91dFJlcS0+c2V0dGluZ3MpKSk7CisgICAgICAgIH0KKyAgICB9CiAgICAgb3V0UmVxLT50YXJnZXRzICA9IG5ldyBBQ2FtZXJhT3V0cHV0VGFyZ2V0cygpOwogICAgICpyZXF1ZXN0ID0gb3V0UmVxOwogICAgIHJldHVybiBBQ0FNRVJBX09LOwpAQCAtMTkwLDEwNCArMjE2LDUzIEBACiAgICAgcmV0dXJuIEFDQU1FUkFfT0s7CiB9CiAKLWNhbWVyYV9zdGF0dXNfdAotQ2FtZXJhRGV2aWNlOjpjYXB0dXJlTG9ja2VkKAotICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCi0gICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCi0gICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCi0gICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKLSAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCi0gICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL2ZhbHNlKTsKLX0KLQotY2FtZXJhX3N0YXR1c190Ci1DYW1lcmFEZXZpY2U6OnNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKAotICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCi0gICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCi0gICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCi0gICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKLSAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCi0gICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL3RydWUpOwotfQotCi1jYW1lcmFfc3RhdHVzX3QKLUNhbWVyYURldmljZTo6c3VibWl0UmVxdWVzdHNMb2NrZWQoCi0gICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKLSAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicywKLSAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKLSAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKLSAgICAgICAgYm9vbCBpc1JlcGVhdGluZykgeworY2FtZXJhX3N0YXR1c190IENhbWVyYURldmljZTo6aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBzZXNzaW9uT3V0cHV0Q29udGFpbmVyKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKICAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CiAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7Ci0gICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgc3VibWl0IGNhcHR1cmUgcmVxdWVzdCBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQogCi0gICAgLy8gRm9ybSB0d28gdmVjdG9ycyBvZiBjYXB0dXJlIHJlcXVlc3QsIG9uZSBmb3IgaW50ZXJuYWwgdHJhY2tpbmcKLSAgICBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Y2FtZXJhMjo6Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3RMaXN0OwotICAgIFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiByZXF1ZXN0c1Y7Ci0gICAgcmVxdWVzdHNWLnNldENhcGFjaXR5KG51bVJlcXVlc3RzKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVJlcXVlc3RzOyBpKyspIHsKLSAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcTsKLSAgICAgICAgcmV0ID0gYWxsb2NhdGVDYXB0dXJlUmVxdWVzdChyZXF1ZXN0c1tpXSwgcmVxKTsKKyAgICBTZXNzaW9uQ29uZmlndXJhdGlvbiBzZXNzaW9uQ29uZmlndXJhdGlvbigwIC8qaW5wdXRXaWR0aCovLCAwIC8qaW5wdXRIZWlnaHQqLywKKyAgICAgICAgICAgIC0xIC8qaW5wdXRGb3JtYXQqLywgQ0FNRVJBM19TVFJFQU1fQ09ORklHVVJBVElPTl9OT1JNQUxfTU9ERSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBvdXRwdXQgOiBzZXNzaW9uT3V0cHV0Q29udGFpbmVyLT5tT3V0cHV0cykgeworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBpR0JQKG51bGxwdHIpOworICAgICAgICByZXQgPSBnZXRJR0JQZnJvbUFudyhvdXRwdXQubVdpbmRvdywgaUdCUCk7CiAgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewotICAgICAgICAgICAgQUxPR0UoIkNvbnZlcnQgY2FwdHVyZSByZXF1ZXN0IHRvIGludGVybmFsIGZvcm1hdCBmYWlsdXJlISByZXQgJWQiLCByZXQpOworICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgZmFpbGVkIHRvIGV4dHJhY3QgZ3JhcGhpYyBwcm9kdWNlciBmcm9tIG5hdGl2ZSB3aW5kb3ciLAorICAgICAgICAgICAgICAgICAgICBnZXRJZCgpKTsKICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKHJlcS0+bVN1cmZhY2VMaXN0LmVtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDYXB0dXJlIHJlcXVlc3Qgd2l0aG91dCBvdXRwdXQgdGFyZ2V0IGNhbm5vdCBiZSBzdWJtaXR0ZWQhIik7Ci0gICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKworICAgICAgICBTdHJpbmcxNiBwaHlzaWNhbElkMTYob3V0cHV0Lm1QaHlzaWNhbENhbWVyYUlkLmNfc3RyKCkpOworICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uIG91dENvbmZpZyhpR0JQLCBvdXRwdXQubVJvdGF0aW9uLCBwaHlzaWNhbElkMTYsCisgICAgICAgICAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbjo6SU5WQUxJRF9TRVRfSUQsIHRydWUpOworCisgICAgICAgIGZvciAoYXV0byYgYW53IDogb3V0cHV0Lm1TaGFyZWRXaW5kb3dzKSB7CisgICAgICAgICAgICByZXQgPSBnZXRJR0JQZnJvbUFudyhhbncsIGlHQlApOworICAgICAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgZmFpbGVkIHRvIGV4dHJhY3QgZ3JhcGhpYyBwcm9kdWNlciBmcm9tIG5hdGl2ZSB3aW5kb3ciLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dENvbmZpZy5hZGRHcmFwaGljUHJvZHVjZXIoaUdCUCk7CiAgICAgICAgIH0KLSAgICAgICAgcmVxdWVzdExpc3QucHVzaF9iYWNrKCoocmVxLmdldCgpKSk7Ci0gICAgICAgIHJlcXVlc3RzVi5wdXNoX2JhY2socmVxKTsKKworICAgICAgICBzZXNzaW9uQ29uZmlndXJhdGlvbi5hZGRPdXRwdXRDb25maWd1cmF0aW9uKG91dENvbmZpZyk7CiAgICAgfQogCi0gICAgaWYgKGlzUmVwZWF0aW5nKSB7Ci0gICAgICAgIHJldCA9IHN0b3BSZXBlYXRpbmdMb2NrZWQoKTsKLSAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN0b3AgcmVwZWF0aW5nIGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBiaW5kZXI6OlN0YXR1cyByZW1vdGVSZXQ7Ci0gICAgaGFyZHdhcmU6OmNhbWVyYTI6OnV0aWxzOjpTdWJtaXRJbmZvIGluZm87Ci0gICAgcmVtb3RlUmV0ID0gbVJlbW90ZS0+c3VibWl0UmVxdWVzdExpc3QocmVxdWVzdExpc3QsIGlzUmVwZWF0aW5nLCAmaW5mbyk7Ci0gICAgaW50IHNlcXVlbmNlSWQgPSBpbmZvLm1SZXF1ZXN0SWQ7Ci0gICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIgPSBpbmZvLm1MYXN0RnJhbWVOdW1iZXI7Ci0gICAgaWYgKHNlcXVlbmNlSWQgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgc3VibWl0IHJlcXVlc3QgcmVtb3RlIGZhaWx1cmU6IHJldCAlZCIsIGdldElkKCksIHNlcXVlbmNlSWQpOworICAgIGJvb2wgc3VwcG9ydGVkID0gZmFsc2U7CisgICAgYmluZGVyOjpTdGF0dXMgcmVtb3RlUmV0ID0gbVJlbW90ZS0+aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgICAgIHNlc3Npb25Db25maWd1cmF0aW9uLCAmc3VwcG9ydGVkKTsKKyAgICBpZiAocmVtb3RlUmV0LnNlcnZpY2VTcGVjaWZpY0Vycm9yQ29kZSgpID09CisgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OKSB7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1VOU1VQUE9SVEVEX09QRVJBVElPTjsKKyAgICB9IGVsc2UgaWYgKCFyZW1vdGVSZXQuaXNPaygpKSB7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX1VOS05PV047Ci0gICAgfQotCi0gICAgQ2FsbGJhY2tIb2xkZXIgY2JIb2xkZXIoc2Vzc2lvbiwgcmVxdWVzdHNWLCBpc1JlcGVhdGluZywgY2JzKTsKLSAgICBtU2VxdWVuY2VDYWxsYmFja01hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc2VxdWVuY2VJZCwgY2JIb2xkZXIpKTsKLQotICAgIGlmIChpc1JlcGVhdGluZykgewotICAgICAgICAvLyBzdG9wUmVwZWF0aW5nIGFib3ZlIHNob3VsZCBoYXZlIGNsZWFudXAgcmVwZWF0aW5nIHNlcXVlbmNlIGlkCi0gICAgICAgIGlmIChtUmVwZWF0aW5nU2VxdWVuY2VJZCAhPSBSRVFVRVNUX0lEX05PTkUpIHsKLSAgICAgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7Ci0gICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFOwotICAgICAgICB9Ci0gICAgICAgIG1SZXBlYXRpbmdTZXF1ZW5jZUlkID0gc2VxdWVuY2VJZDsKICAgICB9IGVsc2UgewotICAgICAgICBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHNlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcikpOworICAgICAgICByZXR1cm4gc3VwcG9ydGVkID8gQUNBTUVSQV9PSyA6IEFDQU1FUkFfRVJST1JfU1RSRUFNX0NPTkZJR1VSRV9GQUlMOwogICAgIH0KLQotICAgIGlmIChtSWRsZSkgewotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIG1IYW5kbGVyKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKLSAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vbkFjdGl2ZSk7Ci0gICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwotICAgIH0KLSAgICBtSWRsZSA9IGZhbHNlOwotICAgIG1CdXN5U2Vzc2lvbiA9IHNlc3Npb247Ci0KLSAgICBpZiAoY2FwdHVyZVNlcXVlbmNlSWQpIHsKLSAgICAgICAgKmNhcHR1cmVTZXF1ZW5jZUlkID0gc2VxdWVuY2VJZDsKLSAgICB9Ci0gICAgcmV0dXJuIEFDQU1FUkFfT0s7CiB9CiAKIGNhbWVyYV9zdGF0dXNfdCBDYW1lcmFEZXZpY2U6OnVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb25Mb2NrZWQoQUNhcHR1cmVTZXNzaW9uT3V0cHV0ICpvdXRwdXQpIHsKQEAgLTMyNSw4ICszMDAsOSBAQAogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIAotICAgIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0Q29uZmlnKGlHQlAsIG91dHB1dC0+bVJvdGF0aW9uLCBPdXRwdXRDb25maWd1cmF0aW9uOjpJTlZBTElEX1NFVF9JRCwKLSAgICAgICAgICAgIHRydWUpOworICAgIFN0cmluZzE2IHBoeXNpY2FsSWQxNihvdXRwdXQtPm1QaHlzaWNhbENhbWVyYUlkLmNfc3RyKCkpOworICAgIE91dHB1dENvbmZpZ3VyYXRpb24gb3V0Q29uZmlnKGlHQlAsIG91dHB1dC0+bVJvdGF0aW9uLCBwaHlzaWNhbElkMTYsCisgICAgICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uOjpJTlZBTElEX1NFVF9JRCwgdHJ1ZSk7CiAKICAgICBmb3IgKGF1dG8mIGFudyA6IG91dHB1dC0+bVNoYXJlZFdpbmRvd3MpIHsKICAgICAgICAgcmV0ID0gZ2V0SUdCUGZyb21BbncoYW53LCBpR0JQKTsKQEAgLTM3Miw4ICszNDgsMTIgQEAKICAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCAvKm91dCovc3A8Q2FwdHVyZVJlcXVlc3Q+JiBvdXRSZXEpIHsKICAgICBjYW1lcmFfc3RhdHVzX3QgcmV0OwogICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXEobmV3IENhcHR1cmVSZXF1ZXN0KCkpOwotICAgIHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucHVzaF9iYWNrKHtzdGQ6OnN0cmluZyhtQ2FtZXJhSWQuc3RyaW5nKCkpLAorICAgIHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MucHVzaF9iYWNrKHtnZXRJZCgpLAogICAgICAgICAgICAgcmVxdWVzdC0+c2V0dGluZ3MtPmdldEludGVybmFsRGF0YSgpfSk7CisgICAgZm9yIChhdXRvJiBlbnRyeSA6IHJlcXVlc3QtPnBoeXNpY2FsU2V0dGluZ3MpIHsKKyAgICAgICAgcmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5ncy5wdXNoX2JhY2soe2VudHJ5LmZpcnN0LAorICAgICAgICAgICAgICAgIGVudHJ5LnNlY29uZC0+Z2V0SW50ZXJuYWxEYXRhKCl9KTsKKyAgICB9CiAgICAgcmVxLT5tSXNSZXByb2Nlc3MgPSBmYWxzZTsgLy8gTkRLIGRvZXMgbm90IHN1cHBvcnQgcmVwcm9jZXNzaW5nIHlldAogICAgIHJlcS0+bUNvbnRleHQgPSByZXF1ZXN0LT5jb250ZXh0OwogICAgIHJlcS0+bVN1cmZhY2VDb252ZXJ0ZWQgPSB0cnVlOyAvLyBzZXQgdG8gdHJ1ZSwgYW5kIGZpbGwgaW4gc3RyZWFtL3N1cmZhY2UgaWR4IHRvIHNwZWVkIHVwIElQQwpAQCAtNDE3LDEwICszOTcsMTcgQEAKIH0KIAogQUNhcHR1cmVSZXF1ZXN0KgotQ2FtZXJhRGV2aWNlOjphbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4mIHJlcSkgeworQ2FtZXJhRGV2aWNlOjphbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChzcDxDYXB0dXJlUmVxdWVzdD4mIHJlcSwgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZUlkKSB7CiAgICAgQUNhcHR1cmVSZXF1ZXN0KiBwUmVxdWVzdCA9IG5ldyBBQ2FwdHVyZVJlcXVlc3QoKTsKLSAgICBDYW1lcmFNZXRhZGF0YSBjbG9uZSA9IHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MuYmVnaW4oKS0+c2V0dGluZ3M7Ci0gICAgcFJlcXVlc3QtPnNldHRpbmdzID0gbmV3IEFDYW1lcmFNZXRhZGF0YShjbG9uZS5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFUVVFU1QpOworICAgIGZvciAoYXV0byYgZW50cnkgOiByZXEtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzKSB7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIGNsb25lID0gZW50cnkuc2V0dGluZ3M7CisgICAgICAgIGlmIChlbnRyeS5pZCA9PSBkZXZpY2VJZCkgeworICAgICAgICAgICAgcFJlcXVlc3QtPnNldHRpbmdzID0gbmV3IEFDYW1lcmFNZXRhZGF0YShjbG9uZS5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFUVVFU1QpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcFJlcXVlc3QtPnBoeXNpY2FsU2V0dGluZ3MuZW1wbGFjZShlbnRyeS5pZCwKKyAgICAgICAgICAgICAgICAgICAgbmV3IEFDYW1lcmFNZXRhZGF0YShjbG9uZS5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFUVVFU1QpKTsKKyAgICAgICAgfQorICAgIH0KICAgICBwUmVxdWVzdC0+dGFyZ2V0cyAgPSBuZXcgQUNhbWVyYU91dHB1dFRhcmdldHMoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlcS0+bVN1cmZhY2VMaXN0LnNpemUoKTsgaSsrKSB7CiAgICAgICAgIEFOYXRpdmVXaW5kb3cqIGFudyA9IHN0YXRpY19jYXN0PEFOYXRpdmVXaW5kb3cqPihyZXEtPm1TdXJmYWNlTGlzdFtpXS5nZXQoKSk7CkBAIC00MzYsNyArNDIzLDggQEAKICAgICBpZiAocmVxID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBkZWxldGUgcmVxLT5zZXR0aW5nczsKKyAgICByZXEtPnNldHRpbmdzLmNsZWFyKCk7CisgICAgcmVxLT5waHlzaWNhbFNldHRpbmdzLmNsZWFyKCk7CiAgICAgZGVsZXRlIHJlcS0+dGFyZ2V0czsKICAgICBkZWxldGUgcmVxOwogfQpAQCAtNjQwLDggKzYyOCw5IEBACiAgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewogICAgICAgICAgICAgcmV0dXJuIHJldDsKICAgICAgICAgfQorICAgICAgICBTdHJpbmcxNiBwaHlzaWNhbElkMTYob3V0Q29uZmlnLm1QaHlzaWNhbENhbWVyYUlkLmNfc3RyKCkpOwogICAgICAgICBvdXRwdXRTZXQuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAotICAgICAgICAgICAgICAgIGFudywgT3V0cHV0Q29uZmlndXJhdGlvbihpR0JQLCBvdXRDb25maWcubVJvdGF0aW9uLAorICAgICAgICAgICAgICAgIGFudywgT3V0cHV0Q29uZmlndXJhdGlvbihpR0JQLCBvdXRDb25maWcubVJvdGF0aW9uLCBwaHlzaWNhbElkMTYsCiAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uOjpJTlZBTElEX1NFVF9JRCwgb3V0Q29uZmlnLm1Jc1NoYXJlZCkpKTsKICAgICB9CiAgICAgYXV0byBhZGRTZXQgPSBvdXRwdXRTZXQ7CkBAIC04MjksNyArODE4LDcgQEAKICAgICBpZiAoZXJyb3JDb2RlID09IGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfQlVGRkVSKSB7CiAgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSByZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZDsKICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0IG9uQnVmZmVyTG9zdCA9Ci0gICAgICAgICAgICAgICAgY2JoLm1DYWxsYmFja3Mub25DYXB0dXJlQnVmZmVyTG9zdDsKKyAgICAgICAgICAgICAgICBjYmgubU9uQ2FwdHVyZUJ1ZmZlckxvc3Q7CiAgICAgICAgIGF1dG8gb3V0cHV0UGFpckl0ID0gbUNvbmZpZ3VyZWRPdXRwdXRzLmZpbmQoc3RyZWFtSWQpOwogICAgICAgICBpZiAob3V0cHV0UGFpckl0ID09IG1Db25maWd1cmVkT3V0cHV0cy5lbmQoKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogc3RyZWFtIGlkICVkIGRvZXMgbm90IGV4aXN0IiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CkBAIC04NDYsNyArODM1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRJZCgpLCBhbncsIGZyYW1lTnVtYmVyKTsKIAogICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3QsIG1IYW5kbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOwogICAgICAgICAgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKICAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uQnVmZmVyTG9zdCk7CiAgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CkBAIC04NTgsNyArODQ3LDcgQEAKICAgICAgICAgfQogICAgIH0gZWxzZSB7IC8vIEhhbmRsZSBvdGhlciBjYXB0dXJlIGZhaWx1cmVzCiAgICAgICAgIC8vIEZpcmUgY2FwdHVyZSBmYWlsdXJlIGNhbGxiYWNrIGlmIHRoZXJlIGlzIG9uZSByZWdpc3RlcmVkCi0gICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG9uRXJyb3IgPSBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVGYWlsZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG9uRXJyb3IgPSBjYmgubU9uQ2FwdHVyZUZhaWxlZDsKICAgICAgICAgc3A8Q2FtZXJhQ2FwdHVyZUZhaWx1cmU+IGZhaWx1cmUobmV3IENhbWVyYUNhcHR1cmVGYWlsdXJlKCkpOwogICAgICAgICBmYWlsdXJlLT5mcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOwogICAgICAgICAvLyBUT0RPOiByZWZpbmUgdGhpcyB3aGVuIGltcGxlbWVudGluZyBmbHVzaApAQCAtODY3LDEwICs4NTYsMTkgQEAKICAgICAgICAgZmFpbHVyZS0+d2FzSW1hZ2VDYXB0dXJlZCA9IChlcnJvckNvZGUgPT0KICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFU1VMVCk7CiAKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVGYWlsLCBtSGFuZGxlcik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoY2JoLm1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayA/IGtXaGF0TG9naWNhbENhcHR1cmVGYWlsIDoKKyAgICAgICAgICAgICAgICBrV2hhdENhcHR1cmVGYWlsLCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvbkVycm9yKTsKKyAgICAgICAgaWYgKGNiaC5tSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIGlmIChyZXN1bHRFeHRyYXMuZXJyb3JQaHlzaWNhbENhbWVyYUlkLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IGNhbWVyYUlkKHJlc3VsdEV4dHJhcy5lcnJvclBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKGtGYWlsaW5nUGh5c2ljYWxDYW1lcmFJZCwgY2FtZXJhSWQuc3RyaW5nKCksIGNhbWVyYUlkLnNpemUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgY2JoLm1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbGVkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvbkVycm9yKTsKKyAgICAgICAgfQogICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZUZhaWx1cmVLZXksIGZhaWx1cmUpOwogICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKQEAgLTg4Miw2ICs4ODAsMjUgQEAKICAgICByZXR1cm47CiB9CiAKK3ZvaWQgQ2FtZXJhRGV2aWNlOjpzdG9wTG9vcGVyQW5kRGlzY29ubmVjdCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURldmljZUxvY2spOworICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiA9IG1DdXJyZW50U2Vzc2lvbi5wcm9tb3RlKCk7CisgICAgaWYgKCFpc0Nsb3NlZCgpKSB7CisgICAgICAgIGRpc2Nvbm5lY3RMb2NrZWQoc2Vzc2lvbik7CisgICAgfQorICAgIG1DdXJyZW50U2Vzc2lvbiA9IG51bGxwdHI7CisKKyAgICBpZiAobUNiTG9vcGVyICE9IG51bGxwdHIpIHsKKyAgICAgIG1DYkxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXItPmlkKCkpOworICAgICAgbUNiTG9vcGVyLT5zdG9wKCk7CisgICAgfQorICAgIG1DYkxvb3Blci5jbGVhcigpOworICAgIG1IYW5kbGVyLmNsZWFyKCk7Cit9CisKK0NhbWVyYURldmljZTo6Q2FsbGJhY2tIYW5kbGVyOjpDYWxsYmFja0hhbmRsZXIoY29uc3QgY2hhciogaWQpIDogbUlkKGlkKSB7Cit9CisKIHZvaWQgQ2FtZXJhRGV2aWNlOjpDYWxsYmFja0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewogICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKQEAgLTg5MCw3ICs5MDcsOSBAQAogICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKKyAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlRmFpbDoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFFbmQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxQWJvcnQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKQEAgLTk2MCw3ICs5NzksOSBAQAogICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvblN0YXRlQ2I6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKKyAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlRmFpbDoKICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFFbmQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxQWJvcnQ6CiAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKQEAgLTk3Nyw3ICs5OTgsOSBAQAogICAgICAgICAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU3RhcnQ6CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVSZXN1bHQ6CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0OgogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlRmFpbDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVGYWlsOgogICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlQnVmZmVyTG9zdDoKICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCAmb2JqKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgewpAQCAtMTAyMCw3ICsxMDQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgdGltZXN0YW1wISIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwKTsKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwLCBtSWQpOwogICAgICAgICAgICAgICAgICAgICAoKm9uU3RhcnQpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIHRpbWVzdGFtcCk7CiAgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTA0MywxMSArMTA2Niw2OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gcmVzdWx0KHN0YXRpY19jYXN0PEFDYW1lcmFNZXRhZGF0YSo+KG9iai5nZXQoKSkpOwotICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3ApOworICAgICAgICAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QgPSBhbGxvY2F0ZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0U3AsIG1JZCk7CiAgICAgICAgICAgICAgICAgICAgICgqb25SZXN1bHQpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIHJlc3VsdC5nZXQoKSk7CiAgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG9uUmVzdWx0OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblJlc3VsdCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgbG9naWNhbENhbWVyYSBjYXB0dXJlIHJlc3VsdCBjYWxsYmFjayEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZVJlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJlc3VsdChzdGF0aWNfY2FzdDxBQ2FtZXJhTWV0YWRhdGEqPihvYmouZ2V0KCkpKTsKKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5LCAmb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBwaHlzaWNhbCBjYXB0dXJlIHJlc3VsdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBwaHlzaWNhbFJlc3VsdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyo+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbFJlc3VsdC0+bVBoeXNpY2FsUmVzdWx0SW5mbzsKKworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPEFDYW1lcmFNZXRhZGF0YT4+IHBoeXNpY2FsTWV0YWRhdGFDb3B5OworICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBoeXNpY2FsUmVzdWx0SW5mby5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBwaHlzaWNhbElkOChwaHlzaWNhbFJlc3VsdEluZm9baV0ubVBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMucHVzaF9iYWNrKHBoeXNpY2FsSWQ4LmNfc3RyKCkpOworCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBjbG9uZSA9IHBoeXNpY2FsUmVzdWx0SW5mb1tpXS5tUGh5c2ljYWxDYW1lcmFNZXRhZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lLnVwZGF0ZShBTkRST0lEX1NZTkNfRlJBTUVfTlVNQkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGh5c2ljYWxSZXN1bHQtPm1GcmFtZU51bWJlciwgLypkYXRhX2NvdW50Ki8xKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gbWV0YWRhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQUNhbWVyYU1ldGFkYXRhKGNsb25lLnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVTVUxUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5LnB1c2hfYmFjayhtZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gcGh5c2ljYWxDYW1lcmFJZFB0cnM7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEFDYW1lcmFNZXRhZGF0YSo+IHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRyczsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdEluZm8uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRQdHJzLnB1c2hfYmFjayhwaHlzaWNhbENhbWVyYUlkc1tpXS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRycy5wdXNoX2JhY2socGh5c2ljYWxNZXRhZGF0YUNvcHlbaV0uZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwLCBtSWQpOworICAgICAgICAgICAgICAgICAgICAoKm9uUmVzdWx0KShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCByZXN1bHQuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxSZXN1bHRJbmZvLnNpemUoKSwgcGh5c2ljYWxDYW1lcmFJZFB0cnMuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRycy5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25GYWlsOwpAQCAtMTA2OSwxMSArMTE1MCw0NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYUNhcHR1cmVGYWlsdXJlKj4ob2JqLmdldCgpKSk7CiAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSogZmFpbHVyZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QUNhbWVyYUNhcHR1cmVGYWlsdXJlKj4oZmFpbHVyZVNwLmdldCgpKTsKLSAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwKTsKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwLCBtSWQpOwogICAgICAgICAgICAgICAgICAgICAoKm9uRmFpbCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgZmFpbHVyZSk7CiAgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0TG9naWNhbENhcHR1cmVGYWlsOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrX2ZhaWxlZCBvbkZhaWw7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uRmFpbCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSBmYWlsIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uRmFpbCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZUZhaWx1cmVLZXksICZvYmopOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgZmFpbHVyZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNwPENhbWVyYUNhcHR1cmVGYWlsdXJlPiBmYWlsdXJlU3AoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Q2FtZXJhQ2FwdHVyZUZhaWx1cmUqPihvYmouZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgQUxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbHVyZSBmYWlsdXJlOworICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIHBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kU3RyaW5nKGtGYWlsaW5nUGh5c2ljYWxDYW1lcmFJZCwgJnBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoZm91bmQgJiYgIXBoeXNpY2FsQ2FtZXJhSWQuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZS5waHlzaWNhbENhbWVyYUlkID0gcGh5c2ljYWxDYW1lcmFJZC5jX3N0cigpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZS5waHlzaWNhbENhbWVyYUlkID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmYWlsdXJlLmNhcHR1cmVGYWlsdXJlID0gKmZhaWx1cmVTcDsKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwLCBtSWQpOworICAgICAgICAgICAgICAgICAgICAoKm9uRmFpbCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgJmZhaWx1cmUpOworICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFFbmQ6CiAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlRW5kIG9uU2VxRW5kOwpAQCAtMTE0Niw3ICsxMjYwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCk7CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCwgbUlkKTsKICAgICAgICAgICAgICAgICAgICAgKCpvbkJ1ZmZlckxvc3QpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIGFudywgZnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTExNTgsMTIgKzEyNzIsMzYgQEAKIH0KIAogQ2FtZXJhRGV2aWNlOjpDYWxsYmFja0hvbGRlcjo6Q2FsbGJhY2tIb2xkZXIoCi0gICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAotICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCi0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKLSAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzKSA6Ci0gICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCi0gICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwgbUNhbGxiYWNrcyhmaWxsQ2IoY2JzKSkge30KKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgICAgICAgICBzZXNzaW9uLAorICAgICAgICBjb25zdCBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4mIHJlcXVlc3RzLAorICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUmVwZWF0aW5nLAorICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzKSA6CisgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLCBtUmVxdWVzdHMocmVxdWVzdHMpLAorICAgICAgICBtSXNSZXBlYXRpbmcoaXNSZXBlYXRpbmcpLAorICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2soZmFsc2UpIHsKKyAgICBpbml0Q2FwdHVyZUNhbGxiYWNrcyhjYnMpOworCisgICAgaWYgKGNicyAhPSBudWxscHRyKSB7CisgICAgICAgIG1PbkNhcHR1cmVDb21wbGV0ZWQgPSBjYnMtPm9uQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICAgICAgbU9uQ2FwdHVyZUZhaWxlZCA9IGNicy0+b25DYXB0dXJlRmFpbGVkOworICAgIH0KK30KKworQ2FtZXJhRGV2aWNlOjpDYWxsYmFja0hvbGRlcjo6Q2FsbGJhY2tIb2xkZXIoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyogbGNicykgOgorICAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwgbVJlcXVlc3RzKHJlcXVlc3RzKSwKKyAgICAgICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwKKyAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKHRydWUpIHsKKyAgICBpbml0Q2FwdHVyZUNhbGxiYWNrcyhsY2JzKTsKKworICAgIGlmIChsY2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQgPSBsY2JzLT5vbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkOworICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWxlZCA9IGxjYnMtPm9uTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsZWQ7CisgICAgfQorfQogCiB2b2lkCiBDYW1lcmFEZXZpY2U6OmNoZWNrUmVwZWF0aW5nU2VxdWVuY2VDb21wbGV0ZUxvY2tlZCgKQEAgLTExODAsOSArMTMxOCw5IEBACiAgICAgICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVyYXNlKGNiSXQpOwogICAgICAgICAvLyBzZW5kIHNlcSBhYm9ydGVkIGNhbGxiYWNrCiAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlU2VxQWJvcnQsIG1IYW5kbGVyKTsKLSAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOwogICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBjYmgubVNlc3Npb24pOwotICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgY2JoLm1DYWxsYmFja3Mub25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkKTsKICAgICAgICAgbXNnLT5zZXRJbnQzMihrU2VxdWVuY2VJZEtleSwgc2VxdWVuY2VJZCk7CiAgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOwogICAgIH0gZWxzZSB7CkBAIC0xMjMwLDkgKzEzNjgsOSBAQAogICAgICAgICAgICAgbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZXJhc2UoY2JJdCk7CiAgICAgICAgICAgICAvLyBzZW5kIHNlcSBjb21wbGV0ZSBjYWxsYmFjawogICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVTZXFFbmQsIG1IYW5kbGVyKTsKLSAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CiAgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBjYmgubVNlc3Npb24pOwotICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBjYmgubU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkKTsKICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoa1NlcXVlbmNlSWRLZXksIHNlcXVlbmNlSWQpOwogICAgICAgICAgICAgbXNnLT5zZXRJbnQ2NChrRnJhbWVOdW1iZXJLZXksIGxhc3RGcmFtZU51bWJlcik7CiAKQEAgLTEzODksNyArMTUyNyw3IEBACiAgICAgYXV0byBpdCA9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKICAgICBpZiAoaXQgIT0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgewogICAgICAgICBDYWxsYmFja0hvbGRlciBjYmggPSAoKml0KS5zZWNvbmQ7Ci0gICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgb25TdGFydCA9IGNiaC5tQ2FsbGJhY2tzLm9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc3RhcnQgb25TdGFydCA9IGNiaC5tT25DYXB0dXJlU3RhcnRlZDsKICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOwogICAgICAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogcmVxdWVzdCBpbmRleCAlZCBvdXQgb2YgYm91bmQgKHNpemUgJXp1KSIsCkBAIC0xMzk4LDcgKzE1MzYsNyBAQAogICAgICAgICB9CiAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0ID0gY2JoLm1SZXF1ZXN0c1tidXJzdElkXTsKICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENhcHR1cmVTdGFydCwgZGV2LT5tSGFuZGxlcik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CiAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvblN0YXJ0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKQEAgLTE0MTMsNyArMTU1MSw2IEBACiAgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSwKICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxSZXN1bHRJbmZvcykgewotICAgICh2b2lkKSBwaHlzaWNhbFJlc3VsdEluZm9zOwogICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IGJpbmRlcjo6U3RhdHVzOjpvaygpOwogCiAgICAgc3A8Q2FtZXJhRGV2aWNlPiBkZXYgPSBtRGV2aWNlLnByb21vdGUoKTsKQEAgLTE0NDksOSArMTU4Niw2IEBACiAgICAgYXV0byBpdCA9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKICAgICBpZiAoaXQgIT0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgewogICAgICAgICBDYWxsYmFja0hvbGRlciBjYmggPSAoKml0KS5zZWNvbmQ7Ci0gICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG9uUmVzdWx0ID0gaXNQYXJ0aWFsUmVzdWx0ID8KLSAgICAgICAgICAgICAgICBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVQcm9ncmVzc2VkIDoKLSAgICAgICAgICAgICAgICBjYmgubUNhbGxiYWNrcy5vbkNhcHR1cmVDb21wbGV0ZWQ7CiAgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiA9IGNiaC5tU2Vzc2lvbjsKICAgICAgICAgaWYgKChzaXplX3QpIGJ1cnN0SWQgPj0gY2JoLm1SZXF1ZXN0cy5zaXplKCkpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IHJlcXVlc3QgaW5kZXggJWQgb3V0IG9mIGJvdW5kIChzaXplICV6dSkiLApAQCAtMTQ2MSwxMyArMTU5NSwyNyBAQAogICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IGNiaC5tUmVxdWVzdHNbYnVyc3RJZF07CiAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gcmVzdWx0KG5ldyBBQ2FtZXJhTWV0YWRhdGEoCiAgICAgICAgICAgICAgICAgbWV0YWRhdGFDb3B5LnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVTVUxUKSk7CisgICAgICAgIHNwPEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBwaHlzaWNhbFJlc3VsdCgKKyAgICAgICAgICAgICAgICBuZXcgQUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8ocGh5c2ljYWxSZXN1bHRJbmZvcywgZnJhbWVOdW1iZXIpKTsKIAotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVJlc3VsdCwgZGV2LT5tSGFuZGxlcik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1DYWxsYmFja3MuY29udGV4dCk7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoCisgICAgICAgICAgICAgICAgY2JoLm1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayA/IGtXaGF0TG9naWNhbENhcHR1cmVSZXN1bHQgOiBrV2hhdENhcHR1cmVSZXN1bHQsCisgICAgICAgICAgICAgICAgZGV2LT5tSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvblJlc3VsdCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgcmVxdWVzdCk7CiAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtDYXB0dXJlUmVzdWx0S2V5LCByZXN1bHQpOworICAgICAgICBpZiAoaXNQYXJ0aWFsUmVzdWx0KSB7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopY2JoLm1PbkNhcHR1cmVQcm9ncmVzc2VkKTsKKyAgICAgICAgfSBlbHNlIGlmIChjYmgubUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKSB7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksCisgICAgICAgICAgICAgICAgICAgICh2b2lkICopY2JoLm1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkKTsKKyAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtQaHlzaWNhbENhcHR1cmVSZXN1bHRLZXksIHBoeXNpY2FsUmVzdWx0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYmgubU9uQ2FwdHVyZUNvbXBsZXRlZCk7CisgICAgICAgIH0KICAgICAgICAgZGV2LT5wb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKICAgICB9CiAKQEAgLTE1MTMsNSArMTY2MSw1IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotCit9IC8vIG5hbWVzcGFjZSBhY2FtCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaAppbmRleCAxMzY5MTQ4Li42YzJjZWIzIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYURldmljZS5oCisrKyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8YXRvbWljPgogI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KQEAgLTM0LDIxICszNSwzNCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FwdHVyZVJlc3VsdC5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL0NhcHR1cmVSZXF1ZXN0Lmg+CiAKICNpbmNsdWRlIDxjYW1lcmEvTmRrQ2FtZXJhTWFuYWdlci5oPgogI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oPgorCiAjaW5jbHVkZSAiQUNhbWVyYU1ldGFkYXRhLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKIAogLy8gV3JhcCBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgc28gaXQgY2FuIGJlIHJlZi1jb3VudGVkCiBzdHJ1Y3QgQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgOiBwdWJsaWMgUmVmQmFzZSwgcHVibGljIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSB7fTsKIAorLy8gV3JhcCBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIHNvIHRoYXQgaXQgY2FuIGJlIHJlZi1jb3VudGVkCitzdHJ1Y3QgQUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm86IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyhjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgaW5mbywKKyAgICAgICAgICAgIGludDY0X3QgZnJhbWVOdW1iZXIpIDoKKyAgICAgICAgbVBoeXNpY2FsUmVzdWx0SW5mbyhpbmZvKSwgbUZyYW1lTnVtYmVyKGZyYW1lTnVtYmVyKSB7fQorCisgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gbVBoeXNpY2FsUmVzdWx0SW5mbzsKKyAgICBpbnQ2NF90IG1GcmFtZU51bWJlcjsKK307CisKIGNsYXNzIENhbWVyYURldmljZSBmaW5hbCA6IHB1YmxpYyBSZWZCYXNlIHsKICAgcHVibGljOgogICAgIENhbWVyYURldmljZShjb25zdCBjaGFyKiBpZCwgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2IsCi0gICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKKyAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMsCiAgICAgICAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlKiB3cmFwcGVyKTsKICAgICB+Q2FtZXJhRGV2aWNlKCk7CiAKQEAgLTU2LDYgKzcwLDcgQEAKIAogICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlUmVxdWVzdCgKICAgICAgICAgICAgIEFDYW1lcmFEZXZpY2VfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkLAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYUlkTGlzdCogcGh5c2ljYWxJZExpc3QsCiAgICAgICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBjb25zdDsKIAogICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlU2Vzc2lvbigKQEAgLTY0LDYgKzc5LDkgQEAKICAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAogICAgICAgICAgICAgLypvdXQqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbioqIHNlc3Npb24pOwogCisgICAgY2FtZXJhX3N0YXR1c190IGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIHNlc3Npb25PdXRwdXRDb250YWluZXIpIGNvbnN0OworCiAgICAgLy8gQ2FsbGJhY2tzIGZyb20gY2FtZXJhIHNlcnZpY2UKICAgICBjbGFzcyBTZXJ2aWNlQ2FsbGJhY2sgOiBwdWJsaWMgaGFyZHdhcmU6OmNhbWVyYTI6OkJuQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzIHsKICAgICAgIHB1YmxpYzoKQEAgLTkyLDYgKzExMCw5IEBACiAKICAgICBpbmxpbmUgQUNhbWVyYURldmljZSogZ2V0V3JhcHBlcigpIGNvbnN0IHsgcmV0dXJuIG1XcmFwcGVyOyB9OwogCisgICAgLy8gU3RvcCB0aGUgbG9vcGVyIHRocmVhZCBhbmQgdW5yZWdpc3RlciB0aGUgaGFuZGxlcgorICAgIHZvaWQgc3RvcExvb3BlckFuZERpc2Nvbm5lY3QoKTsKKwogICBwcml2YXRlOgogICAgIGZyaWVuZCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb247CiAgICAgY2FtZXJhX3N0YXR1c190IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpIGNvbnN0OwpAQCAtMTA4LDE5ICsxMjksMjIgQEAKICAgICBjYW1lcmFfc3RhdHVzX3Qgd2FpdFVudGlsSWRsZUxvY2tlZCgpOwogCiAKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgIGNhbWVyYV9zdGF0dXNfdCBjYXB0dXJlTG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKLSAgICAgICAgICAgIC8qb3B0aW9uYWwqL0FDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMsCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCiAgICAgICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAogICAgICAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCk7CiAKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgIGNhbWVyYV9zdGF0dXNfdCBzZXRSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZChzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCi0gICAgICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzLAorICAgICAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAogICAgICAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKICAgICAgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpOwogCisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KICAgICBjYW1lcmFfc3RhdHVzX3Qgc3VibWl0UmVxdWVzdHNMb2NrZWQoCiAgICAgICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCi0gICAgICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzLAorICAgICAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAogICAgICAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKICAgICAgICAgICAgIC8qb3V0Ki9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkLAogICAgICAgICAgICAgYm9vbCBpc1JlcGVhdGluZyk7CkBAIC0xMzAsNyArMTU0LDggQEAKICAgICBjYW1lcmFfc3RhdHVzX3QgYWxsb2NhdGVDYXB0dXJlUmVxdWVzdCgKICAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgc3A8Q2FwdHVyZVJlcXVlc3Q+JiBvdXRSZXEpOwogCi0gICAgc3RhdGljIEFDYXB0dXJlUmVxdWVzdCogYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3Qoc3A8Q2FwdHVyZVJlcXVlc3Q+JiByZXEpOworICAgIHN0YXRpYyBBQ2FwdHVyZVJlcXVlc3QqIGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiYgcmVxLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGRldmljZUlkKTsKICAgICBzdGF0aWMgdm9pZCBmcmVlQUNhcHR1cmVSZXF1ZXN0KEFDYXB0dXJlUmVxdWVzdCopOwogCiAgICAgLy8gb25seSBGb3Igc2Vzc2lvbiB0byBob2xkIGRldmljZSBsb2NrCkBAIC0xNTYsNyArMTgxLDcgQEAKICAgICBtdXRhYmxlIE11dGV4IG1EZXZpY2VMb2NrOwogICAgIGNvbnN0IFN0cmluZzggbUNhbWVyYUlkOyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2FtZXJhIElECiAgICAgY29uc3QgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyBtQXBwQ2FsbGJhY2tzOyAvLyBDYWxsYmFjayB0byBhcHAKLSAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QUNhbWVyYU1ldGFkYXRhPiBtQ2hhcnM7ICAgIC8vIENhbWVyYSBjaGFyYWN0ZXJpc3RpY3MKKyAgICBjb25zdCBzcDxBQ2FtZXJhTWV0YWRhdGE+IG1DaGFyczsgICAgICAgICAgICAgICAgIC8vIENhbWVyYSBjaGFyYWN0ZXJpc3RpY3MKICAgICBjb25zdCBzcDxTZXJ2aWNlQ2FsbGJhY2s+IG1TZXJ2aWNlQ2FsbGJhY2s7CiAgICAgQUNhbWVyYURldmljZSogbVdyYXBwZXI7CiAKQEAgLTE5MSw3ICsyMTYsOSBAQAogICAgICAgICAvLyBDYXB0dXJlIGNhbGxiYWNrcwogICAgICAgICBrV2hhdENhcHR1cmVTdGFydCwgICAgIC8vIG9uQ2FwdHVyZVN0YXJ0ZWQKICAgICAgICAga1doYXRDYXB0dXJlUmVzdWx0LCAgICAvLyBvbkNhcHR1cmVQcm9ncmVzc2VkLCBvbkNhcHR1cmVDb21wbGV0ZWQKKyAgICAgICAga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdCwgLy8gb25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZAogICAgICAgICBrV2hhdENhcHR1cmVGYWlsLCAgICAgIC8vIG9uQ2FwdHVyZUZhaWxlZAorICAgICAgICBrV2hhdExvZ2ljYWxDYXB0dXJlRmFpbCwgLy8gb25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWxlZAogICAgICAgICBrV2hhdENhcHR1cmVTZXFFbmQsICAgIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkCiAgICAgICAgIGtXaGF0Q2FwdHVyZVNlcUFib3J0LCAgLy8gb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkCiAgICAgICAgIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3QsLy8gb25DYXB0dXJlQnVmZmVyTG9zdApAQCAtMjA2LDE2ICsyMzMsMjAgQEAKICAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhcHR1cmVSZXF1ZXN0S2V5OwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrVGltZVN0YW1wS2V5OwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FwdHVyZVJlc3VsdEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga1BoeXNpY2FsQ2FwdHVyZVJlc3VsdEtleTsKICAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhcHR1cmVGYWlsdXJlS2V5OwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrU2VxdWVuY2VJZEtleTsKICAgICBzdGF0aWMgY29uc3QgY2hhcioga0ZyYW1lTnVtYmVyS2V5OwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQW53S2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrRmFpbGluZ1BoeXNpY2FsQ2FtZXJhSWQ7CiAKICAgICBjbGFzcyBDYWxsYmFja0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgewogICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBDYWxsYmFja0hhbmRsZXIoY29uc3QgY2hhciogaWQpOwogICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKIAogICAgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcgbUlkOwogICAgICAgICAvLyBUaGlzIGhhbmRsZXIgd2lsbCBjYWNoZSBhbGwgY2FwdHVyZSBzZXNzaW9uIHNwIHVudGlsIGtXaGF0Q2xlYW5VcFNlc3Npb25zCiAgICAgICAgIC8vIGlzIHByb2Nlc3NlZC4gVGhpcyBpcyB1c2VkIHRvIGd1YXJhbnRlZSB0aGUgbGFzdCBzZXNzaW9uIHJlZmVyZW5jZSBpcyBhbHdheXMKICAgICAgICAgLy8gYmVpbmcgcmVtb3ZlZCBpbiBjYWxsYmFjayB0aHJlYWQgd2l0aG91dCBob2xkaW5nIGNhbWVyYSBkZXZpY2UgbG9jawpAQCAtMjQ0LDE5ICsyNzUsNDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKICAgICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicyk7CisgICAgICAgIENhbGxiYWNrSG9sZGVyKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyogbGNicyk7CiAKLSAgICAgICAgc3RhdGljIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzIGZpbGxDYigKLSAgICAgICAgICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyogY2JzKSB7CisgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgICAgICB2b2lkIGluaXRDYXB0dXJlQ2FsbGJhY2tzKFQqIGNicykgeworICAgICAgICAgICAgbUNvbnRleHQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVN0YXJ0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVByb2dyZXNzZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWxlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlRmFpbGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVCdWZmZXJMb3N0ID0gbnVsbHB0cjsKICAgICAgICAgICAgIGlmIChjYnMgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIHJldHVybiAqY2JzOworICAgICAgICAgICAgICAgIG1Db250ZXh0ID0gY2JzLT5jb250ZXh0OworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTdGFydGVkID0gY2JzLT5vbkNhcHR1cmVTdGFydGVkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVQcm9ncmVzc2VkID0gY2JzLT5vbkNhcHR1cmVQcm9ncmVzc2VkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZCA9IGNicy0+b25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZCA9IGNicy0+b25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVCdWZmZXJMb3N0ID0gY2JzLT5vbkNhcHR1cmVCdWZmZXJMb3N0OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHsgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0ciB9OwogICAgICAgICB9Ci0KICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgIG1TZXNzaW9uOwogICAgICAgICBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+ID4gbVJlcXVlc3RzOwogICAgICAgICBjb25zdCBib29sICAgICAgICAgICAgICAgICAgbUlzUmVwZWF0aW5nOwotICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyBtQ2FsbGJhY2tzOworICAgICAgICBjb25zdCBib29sICAgICAgICAgICAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrOworCisgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBtT25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgbU9uQ2FwdHVyZVByb2dyZXNzZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkNhcHR1cmVDb21wbGV0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG1PbkNhcHR1cmVGYWlsZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VFbmQgbU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlQWJvcnQgbU9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0IG1PbkNhcHR1cmVCdWZmZXJMb3N0OwogICAgIH07CiAgICAgLy8gc2VxdWVuY2UgaWQgLT4gY2FsbGJhY2tzIG1hcAogICAgIHN0ZDo6bWFwPGludCwgQ2FsbGJhY2tIb2xkZXI+IG1TZXF1ZW5jZUNhbGxiYWNrTWFwOwpAQCAtMjgzLDkgKzM0MiwxMSBAQAogICAgIC8vIE1pc2MgdmFyaWFibGVzCiAgICAgaW50MzJfdCBtU2hhZGluZ01hcFNpemVbMl07ICAgLy8gY29uc3QgYWZ0ZXIgY29uc3RydWN0b3IKICAgICBpbnQzMl90IG1QYXJ0aWFsUmVzdWx0Q291bnQ7ICAvLyBjb25zdCBhZnRlciBjb25zdHJ1Y3RvcgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtUGh5c2ljYWxJZHM7IC8vIGNvbnN0IGFmdGVyIGNvbnN0cnVjdG9yCiAKIH07CiAKK30gLy8gbmFtZXNwYWNlIGFjYW07CiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOwogCiAvKioKQEAgLTI5NCwxMCArMzU1LDEwIEBACiAgKi8KIHN0cnVjdCBBQ2FtZXJhRGV2aWNlIHsKICAgICBBQ2FtZXJhRGV2aWNlKGNvbnN0IGNoYXIqIGlkLCBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYiwKLSAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBQ2FtZXJhTWV0YWRhdGE+IGNoYXJzKSA6Ci0gICAgICAgICAgICBtRGV2aWNlKG5ldyBDYW1lcmFEZXZpY2UoaWQsIGNiLCBzdGQ6Om1vdmUoY2hhcnMpLCB0aGlzKSkge30KKyAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnMpIDoKKyAgICAgICAgICAgIG1EZXZpY2UobmV3IGFuZHJvaWQ6OmFjYW06OkNhbWVyYURldmljZShpZCwgY2IsIGNoYXJzLCB0aGlzKSkge30KIAotICAgIH5BQ2FtZXJhRGV2aWNlKCkge307CisgICAgfkFDYW1lcmFEZXZpY2UoKTsKIAogICAgIC8qKioqKioqKioqKioqKioqKioqCiAgICAgICogTkRLIHB1YmxpYyBBUElzICoKQEAgLTMwNiw4ICszNjcsOSBAQAogCiAgICAgY2FtZXJhX3N0YXR1c190IGNyZWF0ZUNhcHR1cmVSZXF1ZXN0KAogICAgICAgICAgICAgQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhSWRMaXN0KiBwaHlzaWNhbENhbWVyYUlkTGlzdCwKICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3QpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1EZXZpY2UtPmNyZWF0ZUNhcHR1cmVSZXF1ZXN0KHRlbXBsYXRlSWQsIHJlcXVlc3QpOworICAgICAgICByZXR1cm4gbURldmljZS0+Y3JlYXRlQ2FwdHVyZVJlcXVlc3QodGVtcGxhdGVJZCwgcGh5c2ljYWxDYW1lcmFJZExpc3QsIHJlcXVlc3QpOwogICAgIH0KIAogICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlU2Vzc2lvbigKQEAgLTMxOCw2ICszODAsMTEgQEAKICAgICAgICAgcmV0dXJuIG1EZXZpY2UtPmNyZWF0ZUNhcHR1cmVTZXNzaW9uKG91dHB1dHMsIHNlc3Npb25QYXJhbWV0ZXJzLCBjYWxsYmFja3MsIHNlc3Npb24pOwogICAgIH0KIAorICAgIGNhbWVyYV9zdGF0dXNfdCBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICAgICAgY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBzZXNzaW9uT3V0cHV0Q29udGFpbmVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5pc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKHNlc3Npb25PdXRwdXRDb250YWluZXIpOworICAgIH0KKwogICAgIC8qKioqKioqKioqKioqKioqKioqKioqKgogICAgICAqIERldmljZSBpbnRlcmFsIEFQSXMgKgogICAgICAqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTMzMSw3ICszOTgsNyBAQAogICAgIH0KIAogICBwcml2YXRlOgotICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkNhbWVyYURldmljZT4gbURldmljZTsKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2U+IG1EZXZpY2U7CiB9OwogCiAjZW5kaWYgLy8gX0FDQU1FUkFfREVWSUNFX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmluYyBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhRGV2aWNlLmluYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmM1MzUyCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFEZXZpY2UuaW5jCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgIkFDYW1lcmFEZXZpY2UuaCIKKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJBQ2FwdHVyZVJlcXVlc3QuaCIKKyNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmNhcHR1cmVMb2NrZWQoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgcmV0dXJuIHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICAgICAgc2Vzc2lvbiwgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkLCAvKmlzUmVwZWF0aW5nKi9mYWxzZSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6c2V0UmVwZWF0aW5nUmVxdWVzdHNMb2NrZWQoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSB7CisgICAgcmV0dXJuIHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICAgICAgc2Vzc2lvbiwgY2JzLCBudW1SZXF1ZXN0cywgcmVxdWVzdHMsIGNhcHR1cmVTZXF1ZW5jZUlkLCAvKmlzUmVwZWF0aW5nKi90cnVlKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NhbWVyYV9zdGF0dXNfdCBDYW1lcmFEZXZpY2U6OnN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24sCisgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgLypvcHRpb25hbCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKKyAgICAgICAgYm9vbCBpc1JlcGVhdGluZykgeworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdWJtaXQgY2FwdHVyZSByZXF1ZXN0IGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICAvLyBGb3JtIHR3byB2ZWN0b3JzIG9mIGNhcHR1cmUgcmVxdWVzdCwgb25lIGZvciBpbnRlcm5hbCB0cmFja2luZworICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpjYW1lcmEyOjpDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdExpc3Q7CisgICAgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+IHJlcXVlc3RzVjsKKyAgICByZXF1ZXN0c1Yuc2V0Q2FwYWNpdHkobnVtUmVxdWVzdHMpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVxdWVzdHM7IGkrKykgeworICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxOworICAgICAgICByZXQgPSBhbGxvY2F0ZUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RzW2ldLCByZXEpOworICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb252ZXJ0IGNhcHR1cmUgcmVxdWVzdCB0byBpbnRlcm5hbCBmb3JtYXQgZmFpbHVyZSEgcmV0ICVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcS0+bVN1cmZhY2VMaXN0LmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYXB0dXJlIHJlcXVlc3Qgd2l0aG91dCBvdXRwdXQgdGFyZ2V0IGNhbm5vdCBiZSBzdWJtaXR0ZWQhIik7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0TGlzdC5wdXNoX2JhY2soKihyZXEuZ2V0KCkpKTsKKyAgICAgICAgcmVxdWVzdHNWLnB1c2hfYmFjayhyZXEpOworICAgIH0KKworICAgIGlmIChpc1JlcGVhdGluZykgeworICAgICAgICByZXQgPSBzdG9wUmVwZWF0aW5nTG9ja2VkKCk7CisgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSAlcyBzdG9wIHJlcGVhdGluZyBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorCisgICAgYmluZGVyOjpTdGF0dXMgcmVtb3RlUmV0OworICAgIGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6U3VibWl0SW5mbyBpbmZvOworICAgIHJlbW90ZVJldCA9IG1SZW1vdGUtPnN1Ym1pdFJlcXVlc3RMaXN0KHJlcXVlc3RMaXN0LCBpc1JlcGVhdGluZywgJmluZm8pOworICAgIGludCBzZXF1ZW5jZUlkID0gaW5mby5tUmVxdWVzdElkOworICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gaW5mby5tTGFzdEZyYW1lTnVtYmVyOworICAgIGlmIChzZXF1ZW5jZUlkIDwgMCkgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN1Ym1pdCByZXF1ZXN0IHJlbW90ZSBmYWlsdXJlOiByZXQgJWQiLCBnZXRJZCgpLCBzZXF1ZW5jZUlkKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBDYWxsYmFja0hvbGRlciBjYkhvbGRlcihzZXNzaW9uLCByZXF1ZXN0c1YsIGlzUmVwZWF0aW5nLCBjYnMpOworICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBjYkhvbGRlcikpOworCisgICAgaWYgKGlzUmVwZWF0aW5nKSB7CisgICAgICAgIC8vIHN0b3BSZXBlYXRpbmcgYWJvdmUgc2hvdWxkIGhhdmUgY2xlYW51cCByZXBlYXRpbmcgc2VxdWVuY2UgaWQKKyAgICAgICAgaWYgKG1SZXBlYXRpbmdTZXF1ZW5jZUlkICE9IFJFUVVFU1RfSURfTk9ORSkgeworICAgICAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0U7CisgICAgICAgIH0KKyAgICAgICAgbVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBzZXF1ZW5jZUlkOworICAgIH0gZWxzZSB7CisgICAgICAgIG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoc2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKSk7CisgICAgfQorCisgICAgaWYgKG1JZGxlKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgbUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uQWN0aXZlKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfQorICAgIG1JZGxlID0gZmFsc2U7CisgICAgbUJ1c3lTZXNzaW9uID0gc2Vzc2lvbjsKKworICAgIGlmIChjYXB0dXJlU2VxdWVuY2VJZCkgeworICAgICAgICAqY2FwdHVyZVNlcXVlbmNlSWQgPSBzZXF1ZW5jZUlkOworICAgIH0KKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworfSAvLyBuYW1lc3BhY2UgYWNhbQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCBiL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWFuYWdlci5jcHAKaW5kZXggYzU5ZDBlNy4uNDU3ZGVhOSAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCkBAIC0yNiw5ICsyNiwxMCBAQAogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CiAKLXVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmFjYW07CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKIC8vIFN0YXRpYyBtZW1iZXIgZGVmaW5pdGlvbnMKIGNvbnN0IGNoYXIqIENhbWVyYU1hbmFnZXJHbG9iYWw6OmtDYW1lcmFJZEtleSAgID0gIkNhbWVyYUlkIjsKIGNvbnN0IGNoYXIqIENhbWVyYU1hbmFnZXJHbG9iYWw6OmtDYWxsYmFja0ZwS2V5ID0gIkNhbGxiYWNrRnAiOwpAQCAtNzUsNiArNzYsMTAgQEAKIAogc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlPiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRDYW1lcmFTZXJ2aWNlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIGdldENhbWVyYVNlcnZpY2VMb2NrZWQoKTsKK30KKworc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlPiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRDYW1lcmFTZXJ2aWNlTG9ja2VkKCkgewogICAgIGlmIChtQ2FtZXJhU2VydmljZS5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIGlmIChpc0NhbWVyYVNlcnZpY2VEaXNhYmxlZCgpKSB7CiAgICAgICAgICAgICByZXR1cm4gbUNhbWVyYVNlcnZpY2U7CkBAIC0xOTIsNiArMTk3LDIwIEBACiAgICAgfQogfQogCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OnJlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBDYWxsYmFjayBjYihjYWxsYmFjayk7CisgICAgbUNhbGxiYWNrcy5pbnNlcnQoY2IpOworfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OnVucmVnaXN0ZXJFeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIENhbGxiYWNrIGNiKGNhbGxiYWNrKTsKKyAgICBtQ2FsbGJhY2tzLmVyYXNlKGNiKTsKK30KKwogdm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpyZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrKAogICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTIwMSw4ICsyMjAsMTIgQEAKICAgICBpZiAocGFpci5zZWNvbmQpIHsKICAgICAgICAgZm9yIChhdXRvJiBwYWlyIDogbURldmljZVN0YXR1c01hcCkgewogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQgPSBwYWlyLmZpcnN0OwotICAgICAgICAgICAgaW50MzJfdCBzdGF0dXMgPSBwYWlyLnNlY29uZDsKLQorICAgICAgICAgICAgaW50MzJfdCBzdGF0dXMgPSBwYWlyLnNlY29uZC5zdGF0dXM7CisgICAgICAgICAgICAvLyBEb24ndCBzZW5kIGluaXRpYWwgY2FsbGJhY2tzIGZvciBjYW1lcmEgaWRzIHdoaWNoIGRvbid0IHN1cHBvcnQKKyAgICAgICAgICAgIC8vIGNhbWVyYTIKKyAgICAgICAgICAgIGlmICghcGFpci5zZWNvbmQuc3VwcG9ydHNIQUwzKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrLCBtSGFuZGxlcik7CiAgICAgICAgICAgICBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFjayBjYiA9IGlzU3RhdHVzQXZhaWxhYmxlKHN0YXR1cykgPwogICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay0+b25DYW1lcmFBdmFpbGFibGUgOiBjYWxsYmFjay0+b25DYW1lcmFVbmF2YWlsYWJsZTsKQEAgLTIyMSwyMCArMjQ0LDMyIEBACiAgICAgbUNhbGxiYWNrcy5lcmFzZShjYik7CiB9CiAKK2Jvb2wgQ2FtZXJhTWFuYWdlckdsb2JhbDo6c3VwcG9ydHNDYW1lcmEyQXBpTG9ja2VkKGNvbnN0IFN0cmluZzggJmNhbWVyYUlkKSB7CisgICAgYm9vbCBjYW1lcmEyU3VwcG9ydCA9IGZhbHNlOworICAgIGF1dG8gY3MgPSBnZXRDYW1lcmFTZXJ2aWNlTG9ja2VkKCk7CisgICAgYmluZGVyOjpTdGF0dXMgc2VydmljZVJldCA9CisgICAgICAgIGNzLT5zdXBwb3J0c0NhbWVyYUFwaShTdHJpbmcxNihjYW1lcmFJZCksCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpBUElfVkVSU0lPTl8yLCAmY2FtZXJhMlN1cHBvcnQpOworICAgIGlmICghc2VydmljZVJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzdXBwb3J0c0NhbWVyYUFwaTJMb2NrZWQoKSBjYWxsIGZhaWxlZCBmb3IgY2FtZXJhSWQgICVzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBjYW1lcmEyU3VwcG9ydDsKK30KKwogdm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRDYW1lcmFJZExpc3Qoc3RkOjp2ZWN0b3I8U3RyaW5nOD4qIGNhbWVyYUlkcykgewogICAgIC8vIEVuc3VyZSB0aGF0IHdlIGhhdmUgaW5pdGlhbGl6ZWQvcmVmcmVzaGVkIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBkZXZpY2VzCi0gICAgYXV0byBjcyA9IGdldENhbWVyYVNlcnZpY2UoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotCisgICAgLy8gTmVlZGVkIHRvIG1ha2Ugc3VyZSB3ZSdyZSBjb25uZWN0ZWQgdG8gY2FtZXJhc2VydmljZQorICAgIGdldENhbWVyYVNlcnZpY2VMb2NrZWQoKTsKICAgICBmb3IoYXV0byYgZGV2aWNlU3RhdHVzIDogbURldmljZVN0YXR1c01hcCkgewotICAgICAgICBpZiAoZGV2aWNlU3RhdHVzLnNlY29uZCA9PSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9QUkVTRU5UIHx8Ci0gICAgICAgICAgICAgICAgZGV2aWNlU3RhdHVzLnNlY29uZCA9PSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX0VOVU1FUkFUSU5HKSB7CisgICAgICAgIGlmIChkZXZpY2VTdGF0dXMuc2Vjb25kLnN0YXR1cyA9PSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9QUkVTRU5UIHx8CisgICAgICAgICAgICAgICAgZGV2aWNlU3RhdHVzLnNlY29uZC5zdGF0dXMgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfRU5VTUVSQVRJTkcpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIGJvb2wgY2FtZXJhMlN1cHBvcnQgPSBmYWxzZTsKLSAgICAgICAgYmluZGVyOjpTdGF0dXMgc2VydmljZVJldCA9IGNzLT5zdXBwb3J0c0NhbWVyYUFwaShTdHJpbmcxNihkZXZpY2VTdGF0dXMuZmlyc3QpLAotICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6QVBJX1ZFUlNJT05fMiwgJmNhbWVyYTJTdXBwb3J0KTsKLSAgICAgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSB8fCAhY2FtZXJhMlN1cHBvcnQpIHsKKyAgICAgICAgaWYgKCFkZXZpY2VTdGF0dXMuc2Vjb25kLnN1cHBvcnRzSEFMMykgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgY2FtZXJhSWRzLT5wdXNoX2JhY2soZGV2aWNlU3RhdHVzLmZpcnN0KTsKQEAgLTI4OCwxMiArMzIzLDQwIEBACiAgICAgICAgICAgICAoKmNiKShjb250ZXh0LCBjYW1lcmFJZC5jX3N0cigpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTZW5kU2luZ2xlQWNjZXNzQ2FsbGJhY2s6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0FjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkQ2FsbGJhY2sgY2I7CisgICAgICAgICAgICB2b2lkKiBjb250ZXh0OworICAgICAgICAgICAgQVN0cmluZyBjYW1lcmFJZDsKKyAgICAgICAgICAgIGJvb2wgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmY2IpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FtZXJhIGNhbGxiYWNrIGZwISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDb250ZXh0S2V5LCAmY29udGV4dCk7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYWxsYmFjayBjb250ZXh0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpjYikoY29udGV4dCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR0UoIiVzOiB1bmtub3duIG1lc3NhZ2UgdHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgbXNnLT53aGF0KCkpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogfQogCitiaW5kZXI6OlN0YXR1cyBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6Om9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQoKSB7CisgICAgc3A8Q2FtZXJhTWFuYWdlckdsb2JhbD4gY20gPSBtQ2FtZXJhTWFuYWdlci5wcm9tb3RlKCk7CisgICAgaWYgKGNtICE9IG51bGxwdHIpIHsKKyAgICAgICAgY20tPm9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGRlbGl2ZXIgY2FtZXJhIGFjY2VzcyBwcmlvcml0eSBjYWxsYmFjay4gR2xvYmFsIGNhbWVyYSBtYW5hZ2VyIGRpZWQiKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCiBiaW5kZXI6OlN0YXR1cyBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6Om9uU3RhdHVzQ2hhbmdlZCgKICAgICAgICAgaW50MzJfdCBzdGF0dXMsIGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCkgewogICAgIHNwPENhbWVyYU1hbmFnZXJHbG9iYWw+IGNtID0gbUNhbWVyYU1hbmFnZXIucHJvbW90ZSgpOwpAQCAtMzA1LDYgKzM2OCwxOSBAQAogICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKIH0KIAordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpvbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChhdXRvIGNiIDogbUNhbGxiYWNrcykgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZFNpbmdsZUFjY2Vzc0NhbGxiYWNrLCBtSGFuZGxlcik7CisgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0FjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkQ2FsbGJhY2sgY2JGcCA9IGNiLm1BY2Nlc3NQcmlvcml0eUNoYW5nZWQ7CisgICAgICAgIGlmIChjYkZwICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQgKikgY2JGcCk7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiLm1Db250ZXh0KTsKKyAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICB9CisgICAgfQorfQorCiB2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6Om9uU3RhdHVzQ2hhbmdlZCgKICAgICAgICAgaW50MzJfdCBzdGF0dXMsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTMyMSw3ICszOTcsNyBAQAogICAgIGJvb2wgZmlyc3RTdGF0dXMgPSAobURldmljZVN0YXR1c01hcC5jb3VudChjYW1lcmFJZCkgPT0gMCk7CiAgICAgaW50MzJfdCBvbGRTdGF0dXMgPSBmaXJzdFN0YXR1cyA/CiAgICAgICAgICAgICBzdGF0dXMgOiAvLyBmaXJzdCBzdGF0dXMKLSAgICAgICAgICAgIG1EZXZpY2VTdGF0dXNNYXBbY2FtZXJhSWRdOworICAgICAgICAgICAgbURldmljZVN0YXR1c01hcFtjYW1lcmFJZF0uc3RhdHVzOwogCiAgICAgaWYgKCFmaXJzdFN0YXR1cyAmJgogICAgICAgICAgICAgaXNTdGF0dXNBdmFpbGFibGUoc3RhdHVzKSA9PSBpc1N0YXR1c0F2YWlsYWJsZShvbGRTdGF0dXMpKSB7CkBAIC0zMjksMjIgKzQwNSwyNiBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgYm9vbCBzdXBwb3J0c0hBTDMgPSBzdXBwb3J0c0NhbWVyYTJBcGlMb2NrZWQoY2FtZXJhSWQpOwogICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgcmVnaXN0ZXJlZCBjYWxsYmFja3MKLSAgICBtRGV2aWNlU3RhdHVzTWFwW2NhbWVyYUlkXSA9IHN0YXR1czsKLSAgICBmb3IgKGF1dG8gY2IgOiBtQ2FsbGJhY2tzKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZW5kU2luZ2xlQ2FsbGJhY2ssIG1IYW5kbGVyKTsKLSAgICAgICAgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2sgY2JGcCA9IGlzU3RhdHVzQXZhaWxhYmxlKHN0YXR1cykgPwotICAgICAgICAgICAgICAgIGNiLm1BdmFpbGFibGUgOiBjYi5tVW5hdmFpbGFibGU7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQgKikgY2JGcCk7Ci0gICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2IubUNvbnRleHQpOwotICAgICAgICBtc2ctPnNldFN0cmluZyhrQ2FtZXJhSWRLZXksIEFTdHJpbmcoY2FtZXJhSWQpKTsKLSAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgbURldmljZVN0YXR1c01hcFtjYW1lcmFJZF0gPSBTdGF0dXNBbmRIQUwzU3VwcG9ydChzdGF0dXMsIHN1cHBvcnRzSEFMMyk7CisgICAgaWYgKHN1cHBvcnRzSEFMMykgeworICAgICAgICBmb3IgKGF1dG8gY2IgOiBtQ2FsbGJhY2tzKSB7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrLCBtSGFuZGxlcik7CisgICAgICAgICAgICBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFjayBjYkZwID0gaXNTdGF0dXNBdmFpbGFibGUoc3RhdHVzKSA/CisgICAgICAgICAgICAgICAgICAgIGNiLm1BdmFpbGFibGUgOiBjYi5tVW5hdmFpbGFibGU7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkICopIGNiRnApOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYi5tQ29udGV4dCk7CisgICAgICAgICAgICBtc2ctPnNldFN0cmluZyhrQ2FtZXJhSWRLZXksIEFTdHJpbmcoY2FtZXJhSWQpKTsKKyAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICB9CiAgICAgfQogICAgIGlmIChzdGF0dXMgPT0gaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI6OlNUQVRVU19OT1RfUFJFU0VOVCkgewogICAgICAgICBtRGV2aWNlU3RhdHVzTWFwLmVyYXNlKGNhbWVyYUlkKTsKICAgICB9CiB9CiAKK30gLy8gbmFtZXNwYWNlIGFjYW0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogLyoqCkBAIC00MDIsNyArNDgyLDcgQEAKIH0KIAogY2FtZXJhX3N0YXR1c190IEFDYW1lcmFNYW5hZ2VyOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCi0gICAgICAgIGNvbnN0IGNoYXIgKmNhbWVyYUlkU3RyLCBBQ2FtZXJhTWV0YWRhdGEgKipjaGFyYWN0ZXJpc3RpY3MpIHsKKyAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWRTdHIsIHNwPEFDYW1lcmFNZXRhZGF0YT4qIGNoYXJhY3RlcmlzdGljcykgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAKICAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U+IGNzID0gQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKS5nZXRDYW1lcmFTZXJ2aWNlKCk7CkBAIC00MzcsMTggKzUxNywxNiBAQAogICAgICAgICBjb25zdCBjaGFyKiBjYW1lcmFJZCwKICAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2ssCiAgICAgICAgIC8qb3V0Ki9BQ2FtZXJhRGV2aWNlKiogb3V0RGV2aWNlKSB7Ci0gICAgQUNhbWVyYU1ldGFkYXRhKiByYXdDaGFyczsKLSAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkLCAmcmF3Q2hhcnMpOworICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gY2hhcnM7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCwgJmNoYXJzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgewogICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBnZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmb3IgY2FtZXJhICVzLiBlcnIgJWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsIHJldCk7CiAgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOwogICAgIH0KLSAgICBzdGQ6OnVuaXF1ZV9wdHI8QUNhbWVyYU1ldGFkYXRhPiBjaGFycyhyYXdDaGFycyk7Ci0gICAgcmF3Q2hhcnMgPSBudWxscHRyOwogCi0gICAgQUNhbWVyYURldmljZSogZGV2aWNlID0gbmV3IEFDYW1lcmFEZXZpY2UoY2FtZXJhSWQsIGNhbGxiYWNrLCBzdGQ6Om1vdmUoY2hhcnMpKTsKKyAgICBBQ2FtZXJhRGV2aWNlKiBkZXZpY2UgPSBuZXcgQUNhbWVyYURldmljZShjYW1lcmFJZCwgY2FsbGJhY2ssIGNoYXJzKTsKIAogICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZT4gY3MgPSBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpLmdldENhbWVyYVNlcnZpY2UoKTsKICAgICBpZiAoY3MgPT0gbnVsbHB0cikgewpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNYW5hZ2VyLmggYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuaAppbmRleCBjYzQyZjc3Li5lOTQ1YmEwIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1hbmFnZXIuaApAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPG1hcD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0gewogCiAvKioKICAqIFBlci1wcm9jZXNzIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBDYW1lcmFNYW5nZXIuIFNoYXJlZCBieSBhbGwgQUNhbWVyYU1hbmFnZXIKQEAgLTUzLDYgKzU0LDExIEBACiAgICAgdm9pZCB1bnJlZ2lzdGVyQXZhaWxhYmlsaXR5Q2FsbGJhY2soCiAgICAgICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKTsKIAorICAgIHZvaWQgcmVnaXN0ZXJFeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFja3MqIGNhbGxiYWNrKTsKKyAgICB2b2lkIHVucmVnaXN0ZXJFeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFja3MqIGNhbGxiYWNrKTsKKwogICAgIC8qKgogICAgICAqIFJldHVybiBjYW1lcmEgSURzIHRoYXQgc3VwcG9ydCBjYW1lcmEyCiAgICAgICovCkBAIC02MCw5ICs2Niw5IEBACiAKICAgcHJpdmF0ZToKICAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U+IG1DYW1lcmFTZXJ2aWNlOwotICAgIGNvbnN0IGludCAgICAgICAgICBrQ2FtZXJhU2VydmljZVBvbGxEZWxheSA9IDUwMDAwMDsgLy8gMC41cwotICAgIGNvbnN0IGNoYXIqICAgICAgICBrQ2FtZXJhU2VydmljZU5hbWUgICAgICA9ICJtZWRpYS5jYW1lcmEiOwotICAgIE11dGV4ICAgICAgICAgICAgICBtTG9jazsKKyAgICBjb25zdCBpbnQgICAgICAgICAgICAgICAgICAgIGtDYW1lcmFTZXJ2aWNlUG9sbERlbGF5ID0gNTAwMDAwOyAvLyAwLjVzCisgICAgY29uc3QgY2hhciogICAgICAgICAgICAgICAgICBrQ2FtZXJhU2VydmljZU5hbWUgICAgICA9ICJtZWRpYS5jYW1lcmEiOworICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CiAKICAgICBjbGFzcyBEZWF0aE5vdGlmaWVyIDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKICAgICAgIHB1YmxpYzoKQEAgLTg1LDYgKzkxLDggQEAKICAgICAgICAgICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICAgICAgfQogCisgICAgICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCgpOworCiAgICAgICBwcml2YXRlOgogICAgICAgICBjb25zdCB3cDxDYW1lcmFNYW5hZ2VyR2xvYmFsPiBtQ2FtZXJhTWFuYWdlcjsKICAgICB9OwpAQCAtOTUsMTEgKzEwMywxOSBAQAogICAgICAgICBleHBsaWNpdCBDYWxsYmFjayhjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKSA6CiAgICAgICAgICAgICBtQXZhaWxhYmxlKGNhbGxiYWNrLT5vbkNhbWVyYUF2YWlsYWJsZSksCiAgICAgICAgICAgICBtVW5hdmFpbGFibGUoY2FsbGJhY2stPm9uQ2FtZXJhVW5hdmFpbGFibGUpLAorICAgICAgICAgICAgbUFjY2Vzc1ByaW9yaXR5Q2hhbmdlZChudWxscHRyKSwKICAgICAgICAgICAgIG1Db250ZXh0KGNhbGxiYWNrLT5jb250ZXh0KSB7fQogCisgICAgICAgIGV4cGxpY2l0IENhbGxiYWNrKGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjaykgOgorICAgICAgICAgICAgbUF2YWlsYWJsZShjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLm9uQ2FtZXJhQXZhaWxhYmxlKSwKKyAgICAgICAgICAgIG1VbmF2YWlsYWJsZShjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLm9uQ2FtZXJhVW5hdmFpbGFibGUpLAorICAgICAgICAgICAgbUFjY2Vzc1ByaW9yaXR5Q2hhbmdlZChjYWxsYmFjay0+b25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCksCisgICAgICAgICAgICBtQ29udGV4dChjYWxsYmFjay0+YXZhaWxhYmlsaXR5Q2FsbGJhY2tzLmNvbnRleHQpIHt9CisKICAgICAgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CiAgICAgICAgICAgICByZXR1cm4gKG1BdmFpbGFibGUgPT0gb3RoZXIubUF2YWlsYWJsZSAmJgogICAgICAgICAgICAgICAgICAgICBtVW5hdmFpbGFibGUgPT0gb3RoZXIubVVuYXZhaWxhYmxlICYmCisgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NQcmlvcml0eUNoYW5nZWQgPT0gb3RoZXIubUFjY2Vzc1ByaW9yaXR5Q2hhbmdlZCAmJgogICAgICAgICAgICAgICAgICAgICBtQ29udGV4dCA9PSBvdGhlci5tQ29udGV4dCk7CiAgICAgICAgIH0KICAgICAgICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CkBAIC0xMDgsNiArMTI0LDkgQEAKICAgICAgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKICAgICAgICAgICAgIGlmICgqdGhpcyA9PSBvdGhlcikgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgaWYgKG1Db250ZXh0ICE9IG90aGVyLm1Db250ZXh0KSByZXR1cm4gbUNvbnRleHQgPCBvdGhlci5tQ29udGV4dDsKKyAgICAgICAgICAgIGlmIChtQWNjZXNzUHJpb3JpdHlDaGFuZ2VkICE9IG90aGVyLm1BY2Nlc3NQcmlvcml0eUNoYW5nZWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUFjY2Vzc1ByaW9yaXR5Q2hhbmdlZCA8IG90aGVyLm1BY2Nlc3NQcmlvcml0eUNoYW5nZWQ7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobUF2YWlsYWJsZSAhPSBvdGhlci5tQXZhaWxhYmxlKSByZXR1cm4gbUF2YWlsYWJsZSA8IG90aGVyLm1BdmFpbGFibGU7CiAgICAgICAgICAgICByZXR1cm4gbVVuYXZhaWxhYmxlIDwgb3RoZXIubVVuYXZhaWxhYmxlOwogICAgICAgICB9CkBAIC0xMTYsMTMgKzEzNSwxNSBAQAogICAgICAgICB9CiAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIG1BdmFpbGFibGU7CiAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIG1VbmF2YWlsYWJsZTsKKyAgICAgICAgQUNhbWVyYU1hbmFnZXJfQWNjZXNzUHJpb3JpdGllc0NoYW5nZWRDYWxsYmFjayBtQWNjZXNzUHJpb3JpdHlDaGFuZ2VkOwogICAgICAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dDsKICAgICB9OwogICAgIHN0ZDo6c2V0PENhbGxiYWNrPiBtQ2FsbGJhY2tzOwogCiAgICAgLy8gZGVmaW5pdGlvbiBvZiBoYW5kbGVyIGFuZCBtZXNzYWdlCiAgICAgZW51bSB7Ci0gICAgICAgIGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrCisgICAgICAgIGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrLAorICAgICAgICBrV2hhdFNlbmRTaW5nbGVBY2Nlc3NDYWxsYmFjaywKICAgICB9OwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FtZXJhSWRLZXk7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYWxsYmFja0ZwS2V5OwpAQCAtMTM1LDExICsxNTYsMTQgQEAKICAgICBzcDxDYWxsYmFja0hhbmRsZXI+IG1IYW5kbGVyOwogICAgIHNwPEFMb29wZXI+ICAgICAgICAgbUNiTG9vcGVyOyAvLyBMb29wZXIgdGhyZWFkIHdoZXJlIGNhbGxiYWNrcyBhY3R1YWxseSBoYXBwZW4gb24KIAorICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZT4gZ2V0Q2FtZXJhU2VydmljZUxvY2tlZCgpOworICAgIHZvaWQgb25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCgpOwogICAgIHZvaWQgb25TdGF0dXNDaGFuZ2VkKGludDMyX3Qgc3RhdHVzLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCk7CiAgICAgdm9pZCBvblN0YXR1c0NoYW5nZWRMb2NrZWQoaW50MzJfdCBzdGF0dXMsIGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKTsKICAgICAvLyBVdGlscyBmb3Igc3RhdHVzCiAgICAgc3RhdGljIGJvb2wgdmFsaWRTdGF0dXMoaW50MzJfdCBzdGF0dXMpOwogICAgIHN0YXRpYyBib29sIGlzU3RhdHVzQXZhaWxhYmxlKGludDMyX3Qgc3RhdHVzKTsKKyAgICBib29sIHN1cHBvcnRzQ2FtZXJhMkFwaUxvY2tlZChjb25zdCBTdHJpbmc4ICZjYW1lcmFJZCk7CiAKICAgICAvLyBUaGUgc29ydCBsb2dpYyBtdXN0IG1hdGNoIHRoZSBsb2dpYyBpbgogICAgIC8vIGxpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5jcHA6OmdldEFQSTFDb21wYXRpYmxlQ2FtZXJhRGV2aWNlSWRzCkBAIC0xNjIsOCArMTg2LDE2IEBACiAgICAgICAgIH0KICAgICB9OwogCisgICAgc3RydWN0IFN0YXR1c0FuZEhBTDNTdXBwb3J0IHsKKyAgICAgICAgaW50MzJfdCBzdGF0dXMgPSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9QUkVTRU5UOworICAgICAgICBib29sIHN1cHBvcnRzSEFMMyA9IGZhbHNlOworICAgICAgICBTdGF0dXNBbmRIQUwzU3VwcG9ydChpbnQzMl90IHN0LCBib29sIEhBTDNzdXBwb3J0KToKKyAgICAgICAgICAgICAgICBzdGF0dXMoc3QpLCBzdXBwb3J0c0hBTDMoSEFMM3N1cHBvcnQpIHsgfTsKKyAgICAgICAgU3RhdHVzQW5kSEFMM1N1cHBvcnQoKSA9IGRlZmF1bHQ7CisgICAgfTsKKwogICAgIC8vIE1hcCBjYW1lcmFfaWQgLT4gc3RhdHVzCi0gICAgc3RkOjptYXA8U3RyaW5nOCwgaW50MzJfdCwgQ2FtZXJhSWRDb21wYXJhdG9yPiBtRGV2aWNlU3RhdHVzTWFwOworICAgIHN0ZDo6bWFwPFN0cmluZzgsIFN0YXR1c0FuZEhBTDNTdXBwb3J0LCBDYW1lcmFJZENvbXBhcmF0b3I+IG1EZXZpY2VTdGF0dXNNYXA7CiAKICAgICAvLyBGb3IgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZQogICAgIHN0YXRpYyBNdXRleCBzTG9jazsKQEAgLTE3Miw2ICsyMDQsNyBAQAogICAgIH5DYW1lcmFNYW5hZ2VyR2xvYmFsKCk7CiB9OwogCit9IC8vIG5hbWVzcGFjZSBhY2FtOwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogLyoqCkBAIC0xODAsMTMgKzIxMywxMyBAQAogICovCiBzdHJ1Y3QgQUNhbWVyYU1hbmFnZXIgewogICAgIEFDYW1lcmFNYW5hZ2VyKCkgOgotICAgICAgICAgICAgbUdsb2JhbE1hbmFnZXIoJihhbmRyb2lkOjpDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpKSkge30KKyAgICAgICAgICAgIG1HbG9iYWxNYW5hZ2VyKCYoYW5kcm9pZDo6YWNhbTo6Q2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKSkpIHt9CiAgICAgfkFDYW1lcmFNYW5hZ2VyKCk7CiAgICAgY2FtZXJhX3N0YXR1c190IGdldENhbWVyYUlkTGlzdChBQ2FtZXJhSWRMaXN0KiogY2FtZXJhSWRMaXN0KTsKICAgICBzdGF0aWMgdm9pZCAgICAgZGVsZXRlQ2FtZXJhSWRMaXN0KEFDYW1lcmFJZExpc3QqIGNhbWVyYUlkTGlzdCk7CiAKICAgICBjYW1lcmFfc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAotICAgICAgICAgICAgY29uc3QgY2hhciAqY2FtZXJhSWQsIEFDYW1lcmFNZXRhZGF0YSAqKmNoYXJhY3RlcmlzdGljcyk7CisgICAgICAgICAgICBjb25zdCBjaGFyKiBjYW1lcmFJZCwgYW5kcm9pZDo6c3A8QUNhbWVyYU1ldGFkYXRhPiogY2hhcmFjdGVyaXN0aWNzKTsKICAgICBjYW1lcmFfc3RhdHVzX3Qgb3BlbkNhbWVyYShjb25zdCBjaGFyKiBjYW1lcmFJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovQUNhbWVyYURldmljZSoqIGRldmljZSk7CkBAIC0xOTYsNyArMjI5LDcgQEAKICAgICAgICAga0NhbWVyYUlkTGlzdE5vdEluaXQgPSAtMQogICAgIH07CiAgICAgYW5kcm9pZDo6TXV0ZXggICAgICAgICBtTG9jazsKLSAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpDYW1lcmFNYW5hZ2VyR2xvYmFsPiBtR2xvYmFsTWFuYWdlcjsKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjphY2FtOjpDYW1lcmFNYW5hZ2VyR2xvYmFsPiBtR2xvYmFsTWFuYWdlcjsKIH07CiAKICNlbmRpZiAvL19BQ0FNRVJBX01BTkFHRVJfSApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5jcHAgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcAppbmRleCA5ZDM0MWFlLi43N2RjZDQ4IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmNwcApAQCAtMzYsNiArMzYsMTAgQEAKICAgICAgICAgZmlsdGVyRHVyYXRpb25zKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlMpOwogICAgICAgICBmaWx0ZXJEdXJhdGlvbnMoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUyk7CiAgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVEFMTF9EVVJBVElPTlMpOworICAgICAgICBmaWx0ZXJEdXJhdGlvbnMoQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX01JTl9GUkFNRV9EVVJBVElPTlMpOworICAgICAgICBmaWx0ZXJEdXJhdGlvbnMoQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUQUxMX0RVUkFUSU9OUyk7CisgICAgICAgIGZpbHRlckR1cmF0aW9ucyhBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlMpOworICAgICAgICBmaWx0ZXJEdXJhdGlvbnMoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVEFMTF9EVVJBVElPTlMpOwogICAgIH0KICAgICAvLyBUT0RPOiBmaWx0ZXIgcmVxdWVzdC9yZXN1bHQga2V5cwogfQpAQCAtNDMsMjMgKzQ3LDE0IEBACiBib29sCiBBQ2FtZXJhTWV0YWRhdGE6OmlzTmRrU3VwcG9ydGVkQ2FwYWJpbGl0eShpbnQzMl90IGNhcGFiaWxpdHkpIHsKICAgICBzd2l0Y2ggKGNhcGFiaWxpdHkpIHsKLSAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19CQUNLV0FSRF9DT01QQVRJQkxFOgotICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01BTlVBTF9TRU5TT1I6Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTUFOVUFMX1BPU1RfUFJPQ0VTU0lORzoKLSAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19SQVc6Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfUkVBRF9TRU5TT1JfU0VUVElOR1M6Ci0gICAgICAgIGNhc2UgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQlVSU1RfQ0FQVFVSRToKLSAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19ERVBUSF9PVVRQVVQ6Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgY2FzZSBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19ZVVZfUkVQUk9DRVNTSU5HOgogICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1BSSVZBVEVfUkVQUk9DRVNTSU5HOgogICAgICAgICBjYXNlIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0NPTlNUUkFJTkVEX0hJR0hfU1BFRURfVklERU86CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyBOZXdseSBkZWZpbmVkIGNhcGFiaWxpdGllcyB3aWxsIGJlIHVuc3VwcG9ydGVkIGJ5IGRlZmF1bHQgKGJsYWNrbGlzdCkKLSAgICAgICAgICAgIC8vIFRPRE86IFNob3VsZCB3ZSBkbyB3aGl0ZWxpc3Qgb3IgYmxhY2tsaXN0IGhlcmU/Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFVua25vbnduIGNhcGFiaWxpdHkgJWQiLCBfX0ZVTkNUSU9OX18sIGNhcGFiaWxpdHkpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgLy8gQXNzdW1pbmcgZXZlcnkgY2FwYWJpbGl0eSBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiBpcyBhY3R1YWxseSBhCisgICAgICAgICAgICAvLyB2YWxpZCBjYXBhYmlsaXR5LgorICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogfQogCkBAIC03OSwxMSArNzQsNDIgQEAKICAgICAgICAgdWludDhfdCBjYXBhYmlsaXR5ID0gZW50cnkuZGF0YS51OFtpXTsKICAgICAgICAgaWYgKGlzTmRrU3VwcG9ydGVkQ2FwYWJpbGl0eShjYXBhYmlsaXR5KSkgewogICAgICAgICAgICAgY2FwYWJpbGl0aWVzLnB1c2goY2FwYWJpbGl0eSk7CisKKyAgICAgICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0xPR0lDQUxfTVVMVElfQ0FNRVJBKSB7CisgICAgICAgICAgICAgICAgZGVyaXZlUGh5c2ljYWxDYW1lcmFJZHMoKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KICAgICBtRGF0YS51cGRhdGUoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMsIGNhcGFiaWxpdGllcyk7CiB9CiAKK3ZvaWQKK0FDYW1lcmFNZXRhZGF0YTo6ZGVyaXZlUGh5c2ljYWxDYW1lcmFJZHMoKSB7CisgICAgQUNhbWVyYU1ldGFkYXRhX2NvbnN0X2VudHJ5IGVudHJ5OworICAgIGF1dG8gcmV0ID0gZ2V0Q29uc3RFbnRyeShBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1BIWVNJQ0FMX0lEUywgJmVudHJ5KTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBHZXQgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9QSFlTSUNBTF9JRFMga2V5IGZhaWxlZC4gcmV0ICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJldCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90KiBpZHMgPSBlbnRyeS5kYXRhLnU4OworICAgIHNpemVfdCBzdGFydCA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgKytpKSB7CisgICAgICAgIGlmIChpZHNbaV0gPT0gJ1wwJykgeworICAgICAgICAgICAgaWYgKHN0YXJ0ICE9IGkpIHsKKyAgICAgICAgICAgICAgICBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZFZhbHVlcy5wdXNoX2JhY2soU3RyaW5nOCgoY29uc3QgY2hhciAqKWlkcytzdGFydCkpOworICAgICAgICAgICAgICAgIG1TdGF0aWNQaHlzaWNhbENhbWVyYUlkcy5wdXNoX2JhY2sobVN0YXRpY1BoeXNpY2FsQ2FtZXJhSWRWYWx1ZXMuYmFjaygpLnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXJ0ID0gaSsxOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1TdGF0aWNQaHlzaWNhbENhbWVyYUlkcy5zaXplKCkgPCAyKSB7CisgICAgICAgIEFMT0dXKCIlczogTG9naWNhbCBtdWx0aS1jYW1lcmEgZGV2aWNlIG9ubHkgaGFzICV6dSBwaHlzaWNhbCBjYW1lcmFzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1TdGF0aWNQaHlzaWNhbENhbWVyYUlkcy5zaXplKCkpOworICAgIH0KK30KIAogdm9pZAogQUNhbWVyYU1ldGFkYXRhOjpmaWx0ZXJEdXJhdGlvbnModWludDMyX3QgdGFnKSB7CkBAIC0xNDIsNiArMTY4LDI2IEBACiAgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhkdXJhdGlvbik7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfTUlOX0ZSQU1FX0RVUkFUSU9OUzoKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUQUxMX0RVUkFUSU9OUzoKKyAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXQgPSBBSU1BR0VfRk9STUFUX0hFSUM7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhmb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2sod2lkdGgpOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGR1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUzoKKyAgICAgICAgICAgIGNhc2UgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVEFMTF9EVVJBVElPTlM6CisgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9ERVBUSF9KUEVHOworICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZER1cmF0aW9ucy5wdXNoX2JhY2soZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKHdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgZmlsdGVyZWREdXJhdGlvbnMucHVzaF9iYWNrKGhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgIGZpbHRlcmVkRHVyYXRpb25zLnB1c2hfYmFjayhkdXJhdGlvbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAvLyBTaG91bGQgbm90IHJlYWNoIGhlcmUKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVua293biB0YWcgMHgleCIsIF9fRlVOQ1RJT05fXywgdGFnKTsKQEAgLTIyOCw2ICsyNzQsNTYgQEAKICAgICAgICAgICAgICAgICBmaWx0ZXJlZERlcHRoU3RyZWFtQ29uZmlncyk7CiAgICAgfQogCisgICAgZW50cnkgPSBtRGF0YS5maW5kKEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlMpOworICAgIFZlY3RvcjxpbnQzMl90PiBmaWx0ZXJlZEhlaWNTdHJlYW1Db25maWdzOworICAgIGZpbHRlcmVkSGVpY1N0cmVhbUNvbmZpZ3Muc2V0Q2FwYWNpdHkoZW50cnkuY291bnQpOworCisgICAgZm9yIChzaXplX3QgaT0wOyBpIDwgZW50cnkuY291bnQ7IGkgKz0gU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSkgeworICAgICAgICBpbnQzMl90IGZvcm1hdCA9IGVudHJ5LmRhdGEuaTMyW2kgKyBTVFJFQU1fRk9STUFUX09GRlNFVF07CisgICAgICAgIGludDMyX3Qgd2lkdGggPSBlbnRyeS5kYXRhLmkzMltpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CisgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gZW50cnkuZGF0YS5pMzJbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKKyAgICAgICAgaW50MzJfdCBpc0lucHV0ID0gZW50cnkuZGF0YS5pMzJbaSArIFNUUkVBTV9JU19JTlBVVF9PRkZTRVRdOworICAgICAgICBpZiAoaXNJbnB1dCA9PSBBQ0FNRVJBX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TX0lOUFVUKSB7CisgICAgICAgICAgICAvLyBIaWRlIGlucHV0IHN0cmVhbXMKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIFRyYW5zbGF0ZSBIQUwgZm9ybWF0cyB0byBOREsgZm9ybWF0CisgICAgICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSB7CisgICAgICAgICAgICBmb3JtYXQgPSBBSU1BR0VfRk9STUFUX0hFSUM7CisgICAgICAgIH0KKworICAgICAgICBmaWx0ZXJlZEhlaWNTdHJlYW1Db25maWdzLnB1c2hfYmFjayhmb3JtYXQpOworICAgICAgICBmaWx0ZXJlZEhlaWNTdHJlYW1Db25maWdzLnB1c2hfYmFjayh3aWR0aCk7CisgICAgICAgIGZpbHRlcmVkSGVpY1N0cmVhbUNvbmZpZ3MucHVzaF9iYWNrKGhlaWdodCk7CisgICAgICAgIGZpbHRlcmVkSGVpY1N0cmVhbUNvbmZpZ3MucHVzaF9iYWNrKGlzSW5wdXQpOworICAgIH0KKyAgICBtRGF0YS51cGRhdGUoQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OUywgZmlsdGVyZWRIZWljU3RyZWFtQ29uZmlncyk7CisKKyAgICBlbnRyeSA9IG1EYXRhLmZpbmQoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworICAgIFZlY3RvcjxpbnQzMl90PiBmaWx0ZXJlZER5bmFtaWNEZXB0aFN0cmVhbUNvbmZpZ3M7CisgICAgZmlsdGVyZWREeW5hbWljRGVwdGhTdHJlYW1Db25maWdzLnNldENhcGFjaXR5KGVudHJ5LmNvdW50KTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7IGkgKz0gU1RSRUFNX0NPTkZJR1VSQVRJT05fU0laRSkgeworICAgICAgICBpbnQzMl90IGZvcm1hdCA9IGVudHJ5LmRhdGEuaTMyW2kgKyBTVFJFQU1fRk9STUFUX09GRlNFVF07CisgICAgICAgIGludDMyX3Qgd2lkdGggPSBlbnRyeS5kYXRhLmkzMltpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CisgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gZW50cnkuZGF0YS5pMzJbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKKyAgICAgICAgaW50MzJfdCBpc0lucHV0ID0gZW50cnkuZGF0YS5pMzJbaSArIFNUUkVBTV9JU19JTlBVVF9PRkZTRVRdOworICAgICAgICBpZiAoaXNJbnB1dCA9PSBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OU19JTlBVVCkgeworICAgICAgICAgICAgLy8gSGlkZSBpbnB1dCBzdHJlYW1zCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICAvLyBUcmFuc2xhdGUgSEFMIGZvcm1hdHMgdG8gTkRLIGZvcm1hdAorICAgICAgICBpZiAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgeworICAgICAgICAgICAgZm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9ERVBUSF9KUEVHOworICAgICAgICB9CisKKyAgICAgICAgZmlsdGVyZWREeW5hbWljRGVwdGhTdHJlYW1Db25maWdzLnB1c2hfYmFjayhmb3JtYXQpOworICAgICAgICBmaWx0ZXJlZER5bmFtaWNEZXB0aFN0cmVhbUNvbmZpZ3MucHVzaF9iYWNrKHdpZHRoKTsKKyAgICAgICAgZmlsdGVyZWREeW5hbWljRGVwdGhTdHJlYW1Db25maWdzLnB1c2hfYmFjayhoZWlnaHQpOworICAgICAgICBmaWx0ZXJlZER5bmFtaWNEZXB0aFN0cmVhbUNvbmZpZ3MucHVzaF9iYWNrKGlzSW5wdXQpOworICAgIH0KKyAgICBtRGF0YS51cGRhdGUoQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMsCisgICAgICAgICAgICBmaWx0ZXJlZER5bmFtaWNEZXB0aFN0cmVhbUNvbmZpZ3MpOwogfQogCiBib29sCkBAIC0zMjIsNiArNDE4LDI3IEBACiAgICAgcmV0dXJuIG1EYXRhOwogfQogCitib29sCitBQ2FtZXJhTWV0YWRhdGE6OmlzTG9naWNhbE11bHRpQ2FtZXJhKHNpemVfdCogY291bnQsIGNvbnN0IGNoYXIqY29uc3QqKiBwaHlzaWNhbENhbWVyYUlkcykgY29uc3QgeworICAgIGlmIChtVHlwZSAhPSBBQ01fQ0hBUkFDVEVSSVNUSUNTKSB7CisgICAgICAgIEFMT0dFKCIlcyBtdXN0IGJlIGNhbGxlZCBmb3IgYSBzdGF0aWMgbWV0YWRhdGEhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoY291bnQgPT0gbnVsbHB0ciB8fCBwaHlzaWNhbENhbWVyYUlkcyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBpbnB1dCBjb3VudDogJXAsIHBoeXNpY2FsQ2FtZXJhSWRzOiAlcCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjb3VudCwgcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1TdGF0aWNQaHlzaWNhbENhbWVyYUlkcy5zaXplKCkgPj0gMikgeworICAgICAgICAqY291bnQgPSBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMuc2l6ZSgpOworICAgICAgICAqcGh5c2ljYWxDYW1lcmFJZHMgPSBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHMuZGF0YSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIC8vIFRPRE86IHNvbWUgb2Yga2V5IGJlbG93IHNob3VsZCBiZSBoaWRkZW4gZnJvbSB1c2VyCiAvLyBleDogQUNBTUVSQV9SRVFVRVNUX0lEIGFuZCBBQ0FNRVJBX1JFUFJPQ0VTU19FRkZFQ1RJVkVfRVhQT1NVUkVfRkFDVE9SCiAvKkBPfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfgpAQCAtNDQzLDcgKzU2MCwxMCBAQAogICAgIEFORFJPSURfU1RBVElTVElDU19JTkZPX01BWF9ISVNUT0dSQU1fQ09VTlQsCiAgICAgQU5EUk9JRF9TVEFUSVNUSUNTX0lORk9fTUFYX1NIQVJQTkVTU19NQVBfVkFMVUUsCiAgICAgQU5EUk9JRF9TVEFUSVNUSUNTX0lORk9fU0hBUlBORVNTX01BUF9TSVpFLAorICAgIEFORFJPSURfSU5GT19TVVBQT1JURURfQlVGRkVSX01BTkFHRU1FTlRfVkVSU0lPTiwKICAgICBBTkRST0lEX0RFUFRIX01BWF9ERVBUSF9TQU1QTEVTLAorICAgIEFORFJPSURfSEVJQ19JTkZPX1NVUFBPUlRFRCwKKyAgICBBTkRST0lEX0hFSUNfSU5GT19NQVhfSlBFR19BUFBfU0VHTUVOVFNfQ09VTlQsCiB9KTsKIAogLyp+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfkB+QH5AfgpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5oIGIvY2FtZXJhL25kay9pbXBsL0FDYW1lcmFNZXRhZGF0YS5oCmluZGV4IGU3NmI4MGMuLjk3ZjdmNDggMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FtZXJhTWV0YWRhdGEuaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhbWVyYU1ldGFkYXRhLmgKQEAgLTE3LDEyICsxNywxOSBAQAogI2RlZmluZSBfQUNBTUVSQV9NRVRBREFUQV9ICiAKICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworI2luY2x1ZGUgPENhbWVyYU1ldGFkYXRhLmg+Cit1c2luZyBDYW1lcmFNZXRhZGF0YSA9IGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6aGVscGVyOjpDYW1lcmFNZXRhZGF0YTsKKyNlbHNlCiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CisjZW5kaWYKIAogI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YS5oPgogCkBAIC01OSwxNSArNjYsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovY29uc3QgdWludDMyX3QqKiB0YWdzKSBjb25zdDsKIAogICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBnZXRJbnRlcm5hbERhdGEoKSBjb25zdDsKKyAgICBib29sIGlzTG9naWNhbE11bHRpQ2FtZXJhKHNpemVfdCogY291bnQsIGNvbnN0IGNoYXIqIGNvbnN0KiogcGh5c2ljYWxDYW1lcmFJZHMpIGNvbnN0OwogCiAgIHByaXZhdGU6CiAKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGNoZWNrIHdoZXRoZXIgdGhlIGNhcGFiaWxpdHkgcGFzc2VkIHRvIGl0IGlzIHZhbGlkLgorICAgIC8vIFRoZSBjYWxsZXIgbXVzdCBtYWtlIHN1cmUgdGhhdCBpdCBpcy4KICAgICBib29sIGlzTmRrU3VwcG9ydGVkQ2FwYWJpbGl0eShjb25zdCBpbnQzMl90IGNhcGFiaWxpdHkpOwogICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZlbmRvclRhZyhjb25zdCB1aW50MzJfdCB0YWcpOwogICAgIHN0YXRpYyBib29sIGlzQ2FwdHVyZVJlcXVlc3RUYWcoY29uc3QgdWludDMyX3QgdGFnKTsKICAgICB2b2lkIGZpbHRlclVuc3VwcG9ydGVkRmVhdHVyZXMoKTsgLy8gSGlkZSBmZWF0dXJlcyBub3QgeWV0IHN1cHBvcnRlZCBieSBOREsKICAgICB2b2lkIGZpbHRlclN0cmVhbUNvbmZpZ3VyYXRpb25zKCk7IC8vIEhpZGUgaW5wdXQgc3RyZWFtcywgdHJhbnNsYXRlIGhhbCBmb3JtYXQgdG8gTkRLIGZvcm1hdHMKICAgICB2b2lkIGZpbHRlckR1cmF0aW9ucyh1aW50MzJfdCB0YWcpOyAvLyB0cmFuc2xhdGUgaGFsIGZvcm1hdCB0byBOREsgZm9ybWF0cworICAgIHZvaWQgZGVyaXZlUGh5c2ljYWxDYW1lcmFJZHMoKTsgLy8gRGVyaXZlIGFycmF5IG9mIHBoeXNpY2FsIGlkcy4KIAogICAgIHRlbXBsYXRlPHR5cGVuYW1lIElOVEVSTkFMX1QsIHR5cGVuYW1lIE5ES19UPgogICAgIGNhbWVyYV9zdGF0dXNfdCB1cGRhdGVJbXBsKHVpbnQzMl90IHRhZywgdWludDMyX3QgY291bnQsIGNvbnN0IE5ES19UKiBkYXRhKSB7CkBAIC0xMDYsNiArMTE3LDkgQEAKICAgICBjb25zdCBBQ0FNRVJBX01FVEFEQVRBX1RZUEUgbVR5cGU7CiAKICAgICBzdGF0aWMgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQzMl90PiBzU3lzdGVtVGFnczsKKworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBtU3RhdGljUGh5c2ljYWxDYW1lcmFJZHM7CisgICAgc3RkOjp2ZWN0b3I8U3RyaW5nOD4gbVN0YXRpY1BoeXNpY2FsQ2FtZXJhSWRWYWx1ZXM7CiB9OwogCiAjZW5kaWYgLy8gX0FDQU1FUkFfTUVUQURBVEFfSApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbXBsL0FDYXB0dXJlUmVxdWVzdC5oIGIvY2FtZXJhL25kay9pbXBsL0FDYXB0dXJlUmVxdWVzdC5oCmluZGV4IDA2YjJjYzMuLjJmZmNhZmUgMTAwNjQ0Ci0tLSBhL2NhbWVyYS9uZGsvaW1wbC9BQ2FwdHVyZVJlcXVlc3QuaAorKysgYi9jYW1lcmEvbmRrL2ltcGwvQUNhcHR1cmVSZXF1ZXN0LmgKQEAgLTE4LDExICsxOCwxNSBAQAogCiAjaW5jbHVkZSA8Y2FtZXJhL05ka0NhcHR1cmVSZXF1ZXN0Lmg+CiAjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworI2luY2x1ZGUgIm5ka192ZW5kb3IvaW1wbC9BQ2FwdHVyZVJlcXVlc3RWZW5kb3IuaCIKKyNlbHNlCiBzdHJ1Y3QgQUNhbWVyYU91dHB1dFRhcmdldCB7Ci0gICAgZXhwbGljaXQgQUNhbWVyYU91dHB1dFRhcmdldChBTmF0aXZlV2luZG93KiB3aW5kb3cpIDogbVdpbmRvdyh3aW5kb3cpIHt9OworICAgIGV4cGxpY2l0IEFDYW1lcmFPdXRwdXRUYXJnZXQoQUNhbWVyYVdpbmRvd1R5cGUqIHdpbmRvdykgOiBtV2luZG93KHdpbmRvdykge307CiAKICAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgewogICAgICAgICByZXR1cm4gbVdpbmRvdyA9PSBvdGhlci5tV2luZG93OwpAQCAtMzcsOCArNDEsOSBAQAogICAgICAgICByZXR1cm4gbVdpbmRvdyA+IG90aGVyLm1XaW5kb3c7CiAgICAgfQogCi0gICAgQU5hdGl2ZVdpbmRvdyogbVdpbmRvdzsKKyAgICBBQ2FtZXJhV2luZG93VHlwZSogbVdpbmRvdzsKIH07CisjZW5kaWYKIAogc3RydWN0IEFDYW1lcmFPdXRwdXRUYXJnZXRzIHsKICAgICBzdGQ6OnNldDxBQ2FtZXJhT3V0cHV0VGFyZ2V0PiBtT3V0cHV0czsKQEAgLTU1LDcgKzYwLDggQEAKICAgICAgICAgcmV0dXJuIEFDQU1FUkFfT0s7CiAgICAgfQogCi0gICAgQUNhbWVyYU1ldGFkYXRhKiAgICAgIHNldHRpbmdzOworICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gc2V0dGluZ3M7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBzcDxBQ2FtZXJhTWV0YWRhdGE+PiBwaHlzaWNhbFNldHRpbmdzOwogICAgIEFDYW1lcmFPdXRwdXRUYXJnZXRzKiB0YXJnZXRzOwogICAgIHZvaWQqICAgICAgICAgICAgICAgICBjb250ZXh0OwogfTsKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaAppbmRleCA1ZTBkYjYwLi4wNzE3NmNmIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oCkBAIC0zNSwxMCArMzUsMTAgQEAKICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KICNpbmNsdWRlIDxzdGRib29sLmg+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KICNpbmNsdWRlICJOZGtDYW1lcmFFcnJvci5oIgogI2luY2x1ZGUgIk5ka0NhbWVyYU1ldGFkYXRhLmgiCiAjaW5jbHVkZSAiTmRrQ2FwdHVyZVJlcXVlc3QuaCIKKyNpbmNsdWRlICJOZGtDYW1lcmFXaW5kb3dUeXBlLmgiCiAKICNpZm5kZWYgX05ES19DQU1FUkFfQ0FQVFVSRV9TRVNTSU9OX0gKICNkZWZpbmUgX05ES19DQU1FUkFfQ0FQVFVSRV9TRVNTSU9OX0gKQEAgLTI0Niw3ICsyNDYsNyBAQAogICovCiB0eXBlZGVmIHZvaWQgKCpBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2J1ZmZlckxvc3QpKAogICAgICAgICB2b2lkKiBjb250ZXh0LCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCi0gICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgQU5hdGl2ZVdpbmRvdyogd2luZG93LCBpbnQ2NF90IGZyYW1lTnVtYmVyKTsKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBBQ2FtZXJhV2luZG93VHlwZSogd2luZG93LCBpbnQ2NF90IGZyYW1lTnVtYmVyKTsKIAogdHlwZWRlZiBzdHJ1Y3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MgewogICAgIC8vLyBvcHRpb25hbCBhcHBsaWNhdGlvbiBjb250ZXh0LgpAQCAtNjQzLDYgKzY0MywxNTMgQEAKICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKy8qKgorICogVGhlIGRlZmluaXRpb24gb2YgZmluYWwgY2FwdHVyZSByZXN1bHQgY2FsbGJhY2sgd2l0aCBsb2dpY2FsIG11bHRpLWNhbWVyYSBzdXBwb3J0LgorICoKKyAqIFRoaXMgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgZmluYWwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQsIHdpdGgKKyAqIGFkZGVkIGFiaWxpdHkgdG8gcmV0dXJuIHBoeXNpY2FsIGNhbWVyYSByZXN1bHQgbWV0YWRhdGEgd2l0aGluIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEuCisgKgorICogRm9yIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEsIHRoaXMgZnVuY3Rpb24gd2lsbCBiZSBjYWxsZWQgd2l0aCB0aGUgSWQgYW5kIHJlc3VsdCBtZXRhZGF0YQorICogb2YgdGhlIHVuZGVybHlpbmcgcGh5c2ljYWwgY2FtZXJhcywgd2hpY2ggdGhlIGNvcnJlc3BvbmRpbmcgY2FwdHVyZSByZXF1ZXN0IGNvbnRhaW5zIHRhcmdldHMgZm9yLgorICogSWYgdGhlIGNhcHR1cmUgcmVxdWVzdCBkb2Vzbid0IGNvbnRhaW4gdGFyZ2V0cyBzcGVjaWZpYyB0byBhbnkgcGh5c2ljYWwgY2FtZXJhLCBvciB0aGUgY3VycmVudAorICogY2FtZXJhIGRldmljZSBpc24ndCBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLCBwaHlzaWNhbFJlc3VsdENvdW50IHdpbGwgYmUgMC4KKyAqCisgKiBAcGFyYW0gY29udGV4dCBUaGUgb3B0aW9uYWwgYXBwbGljYXRpb24gY29udGV4dCBwcm92aWRlZCBieSB1c2VyIGluCisgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3N9LgorICogQHBhcmFtIHNlc3Npb24gVGhlIGNhbWVyYSBjYXB0dXJlIHNlc3Npb24gb2YgaW50ZXJlc3QuCisgKiBAcGFyYW0gcmVxdWVzdCBUaGUgY2FwdHVyZSByZXF1ZXN0IG9mIGludGVyZXN0LiBOb3RlIHRoYXQgdGhpcyBwb2ludGVyIHBvaW50cyB0byBhIGNvcHkgb2YKKyAqICAgICAgICAgICAgICAgIGNhcHR1cmUgcmVxdWVzdCBzZW50IGJ5IGFwcGxpY2F0aW9uLCBzbyB0aGUgYWRkcmVzcyBpcyBkaWZmZXJlbnQgdG8gd2hhdAorICogICAgICAgICAgICAgICAgYXBwbGljYXRpb24gc2VudCBidXQgdGhlIGNvbnRlbnQgd2lsbCBtYXRjaC4gVGhpcyByZXF1ZXN0IHdpbGwgYmUgZnJlZWQgYnkKKyAqICAgICAgICAgICAgICAgIGZyYW1ld29yayBpbW1lZGlhdGVseSBhZnRlciB0aGlzIGNhbGxiYWNrIHJldHVybnMuCisgKiBAcGFyYW0gcmVzdWx0IFRoZSBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSByZXBvcnRlZCBieSBjYW1lcmEgZGV2aWNlLiBUaGUgbWVtb3J5IGlzIG1hbmFnZWQgYnkKKyAqICAgICAgICAgICAgICAgIGNhbWVyYSBmcmFtZXdvcmsuIERvIG5vdCBhY2Nlc3MgdGhpcyBwb2ludGVyIGFmdGVyIHRoaXMgY2FsbGJhY2sgcmV0dXJucy4KKyAqIEBwYXJhbSBwaHlzaWNhbFJlc3VsdENvdW50IFRoZSBudW1iZXIgb2YgcGh5c2ljYWwgY2FtZXJhIHJlc3VsdCBtZXRhZGF0YQorICogQHBhcmFtIHBoeXNpY2FsQ2FtZXJhSWRzIFRoZSBhcnJheSBvZiBwaHlzaWNhbCBjYW1lcmEgSURzIG9uIHdoaWNoIHRoZQorICogICAgICAgICAgICAgICAgcGh5c2ljYWwgcmVzdWx0IG1ldGFkYXRhIGFyZSByZXBvcnRlZC4KKyAqIEBwYXJhbSBwaHlzaWNhbFJlc3VsdHMgVGhlIGFycmF5IG9mIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIHJlcG9ydGVkIGJ5IHRoZQorICogICAgICAgICAgICAgICAgcGh5c2ljYWwgY2FtZXJhIGRldmljZXMuCisgKi8KK3R5cGVkZWYgdm9pZCAoKkFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19yZXN1bHQpKAorICAgICAgICB2b2lkKiBjb250ZXh0LCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24sCisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgY29uc3QgQUNhbWVyYU1ldGFkYXRhKiByZXN1bHQsCisgICAgICAgIHNpemVfdCBwaHlzaWNhbFJlc3VsdENvdW50LCBjb25zdCBjaGFyKiogcGh5c2ljYWxDYW1lcmFJZHMsCisgICAgICAgIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSoqIHBoeXNpY2FsUmVzdWx0cyk7CisKKy8vLyBTdHJ1Y3QgdG8gZGVzY3JpYmUgYSBsb2dpY2FsIGNhbWVyYSBjYXB0dXJlIGZhaWx1cmUKK3R5cGVkZWYgc3RydWN0IEFMb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgeworICAgIC8qKgorICAgICAqIFRoZSB7QGxpbmsgQUNhbWVyYUNhcHR1cmVGYWlsdXJlfSBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCByZWd1bGFyIGxvZ2ljYWwgZGV2aWNlIGNhcHR1cmUKKyAgICAgKiBmYWlsdXJlLgorICAgICAqLworICAgIHN0cnVjdCBBQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgY2FwdHVyZUZhaWx1cmU7CisKKyAgICAvKioKKyAgICAgKiBUaGUgcGh5c2ljYWwgY2FtZXJhIGRldmljZSBJRCBpbiBjYXNlIHRoZSBjYXB0dXJlIGZhaWx1cmUgY29tZXMgZnJvbSBhIGNhcHR1cmUgcmVxdWVzdAorICAgICAqIHdpdGggY29uZmlndXJlZCBwaHlzaWNhbCBjYW1lcmEgc3RyZWFtcyBmb3IgYSBsb2dpY2FsIGNhbWVyYS4gcGh5c2ljYWxDYW1lcmFJZCB3aWxsIGJlIHNldAorICAgICAqIHRvIE5VTEwgaW4gY2FzZSB0aGUgY2FwdHVyZSByZXF1ZXN0IGhhcyBubyBhc3NvY2lhdGVkIHBoeXNpY2FsIGNhbWVyYSBkZXZpY2UuCisgICAgICoKKyAgICAgKi8KKyAgICBjb25zdCBjaGFyKiAgICBwaHlzaWNhbENhbWVyYUlkOworfSBBTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsdXJlOworCisvKioKKyAqIFRoZSBkZWZpbml0aW9uIG9mIGxvZ2ljYWwgY2FtZXJhIGNhcHR1cmUgZmFpbHVyZSBjYWxsYmFjay4KKyAqCisgKiBAcGFyYW0gY29udGV4dCBUaGUgb3B0aW9uYWwgYXBwbGljYXRpb24gY29udGV4dCBwcm92aWRlZCBieSB1c2VyIGluCisgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3N9LgorICogQHBhcmFtIHNlc3Npb24gVGhlIGNhbWVyYSBjYXB0dXJlIHNlc3Npb24gb2YgaW50ZXJlc3QuCisgKiBAcGFyYW0gcmVxdWVzdCBUaGUgY2FwdHVyZSByZXF1ZXN0IG9mIGludGVyZXN0LiBOb3RlIHRoYXQgdGhpcyBwb2ludGVyIHBvaW50cyB0byBhIGNvcHkgb2YKKyAqICAgICAgICAgICAgICAgIGNhcHR1cmUgcmVxdWVzdCBzZW50IGJ5IGFwcGxpY2F0aW9uLCBzbyB0aGUgYWRkcmVzcyBpcyBkaWZmZXJlbnQgdG8gd2hhdAorICogICAgICAgICAgICAgICAgYXBwbGljYXRpb24gc2VudCBidXQgdGhlIGNvbnRlbnQgd2lsbCBtYXRjaC4gVGhpcyByZXF1ZXN0IHdpbGwgYmUgZnJlZWQgYnkKKyAqICAgICAgICAgICAgICAgIGZyYW1ld29yayBpbW1lZGlhdGVseSBhZnRlciB0aGlzIGNhbGxiYWNrIHJldHVybnMuCisgKiBAcGFyYW0gZmFpbHVyZSBUaGUge0BsaW5rIEFMb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWx1cmV9IGRlc3JpYmVzIHRoZSBjYXB0dXJlIGZhaWx1cmUuIFRoZSBtZW1vcnkKKyAqICAgICAgICAgICAgICAgIGlzIG1hbmFnZWQgYnkgY2FtZXJhIGZyYW1ld29yay4gRG8gbm90IGFjY2VzcyB0aGlzIHBvaW50ZXIgYWZ0ZXIgdGhpcyBjYWxsYmFjaworICogICAgICAgICAgICAgICAgcmV0dXJucy4KKyAqLwordHlwZWRlZiB2b2lkICgqQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrX2ZhaWxlZCkoCisgICAgICAgIHZvaWQqIGNvbnRleHQsIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBBTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsdXJlKiBmYWlsdXJlKTsKKworLyoqCisgKiBUaGlzIGhhcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzLAorICogd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgYW4gb25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCBjYWxsYmFjayBpcworICogdXNlZCwgaW5zdGVhZCBvZiBvbkNhcHR1cmVDb21wbGV0ZWQsIHRvIHN1cHBvcnQgbG9naWNhbCBtdWx0aS1jYW1lcmEuCisgKi8KK3R5cGVkZWYgc3RydWN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MgeworICAgIC8qKgorICAgICAqIFNhbWUgYXMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MKKyAgICAgKi8KKyAgICB2b2lkKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0ICAgICAgICAgb25DYXB0dXJlU3RhcnRlZDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3Jlc3VsdCAgICAgICAgb25DYXB0dXJlUHJvZ3Jlc3NlZDsKKworICAgIC8qKgorICAgICAqIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIHdoZW4gYW4gaW1hZ2UgY2FwdHVyZSBoYXMgZnVsbHkgY29tcGxldGVkIGFuZCBhbGwgdGhlCisgICAgICogcmVzdWx0IG1ldGFkYXRhIGlzIGF2YWlsYWJsZS4gRm9yIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEsIHRoaXMgY2FsbGJhY2sKKyAgICAgKiBhbHNvIHJldHVybnMgdGhlIHJlc3VsdCBtZXRhZGF0YSBmb3IgYWxsIHBoeXNpY2FsIGNhbWVyYXMgYmVpbmcKKyAgICAgKiBleHBsaWNpdGx5IHJlcXVlc3RlZCBvbi4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgY2FsbGJhY2sgd2lsbCBhbHdheXMgZmlyZSBhZnRlciB0aGUgbGFzdCB7QGxpbmsgb25DYXB0dXJlUHJvZ3Jlc3NlZH07CisgICAgICogaW4gb3RoZXIgd29yZHMsIG5vIG1vcmUgcGFydGlhbCByZXN1bHRzIHdpbGwgYmUgZGVsaXZlcmVkIG9uY2UgdGhlIGNvbXBsZXRlZCByZXN1bHQKKyAgICAgKiBpcyBhdmFpbGFibGUuPC9wPgorICAgICAqCisgICAgICogPHA+Rm9yIHBlcmZvcm1hbmNlLWludGVuc2l2ZSB1c2UtY2FzZXMgd2hlcmUgbGF0ZW5jeSBpcyBhIGZhY3RvciwgY29uc2lkZXIKKyAgICAgKiB1c2luZyB7QGxpbmsgb25DYXB0dXJlUHJvZ3Jlc3NlZH0gaW5zdGVhZC48L3A+CisgICAgICoKKyAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIEFDYXB0dXJlUmVxdWVzdCBwb2ludGVyIGluIHRoZSBjYWxsYmFjayB3aWxsIG5vdCBtYXRjaCB3aGF0IGFwcGxpY2F0aW9uIGhhcworICAgICAqIHN1Ym1pdHRlZCwgYnV0IHRoZSBjb250ZW50cyB0aGUgQUNhcHR1cmVSZXF1ZXN0IHdpbGwgbWF0Y2ggd2hhdCBhcHBsaWNhdGlvbiBzdWJtaXR0ZWQuPC9wPgorICAgICAqLworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZDsKKworICAgIC8qKgorICAgICAqIFRoaXMgY2FsbGJhY2sgaXMgY2FsbGVkIGluc3RlYWQgb2Yge0BsaW5rIG9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWR9IHdoZW4gdGhlCisgICAgICogY2FtZXJhIGRldmljZSBmYWlsZWQgdG8gcHJvZHVjZSBhIGNhcHR1cmUgcmVzdWx0IGZvciB0aGUKKyAgICAgKiByZXF1ZXN0LgorICAgICAqCisgICAgICogPHA+T3RoZXIgcmVxdWVzdHMgYXJlIHVuYWZmZWN0ZWQsIGFuZCBzb21lIG9yIGFsbCBpbWFnZSBidWZmZXJzIGZyb20KKyAgICAgKiB0aGUgY2FwdHVyZSBtYXkgaGF2ZSBiZWVuIHB1c2hlZCB0byB0aGVpciByZXNwZWN0aXZlIG91dHB1dAorICAgICAqIHN0cmVhbXMuPC9wPgorICAgICAqCisgICAgICogPHA+Tm90ZSB0aGF0IHRoZSBBQ2FwdHVyZVJlcXVlc3QgcG9pbnRlciBpbiB0aGUgY2FsbGJhY2sgd2lsbCBub3QgbWF0Y2ggd2hhdCBhcHBsaWNhdGlvbiBoYXMKKyAgICAgKiBzdWJtaXR0ZWQsIGJ1dCB0aGUgY29udGVudHMgdGhlIEFDYXB0dXJlUmVxdWVzdCB3aWxsIG1hdGNoIHdoYXQgYXBwbGljYXRpb24gc3VibWl0dGVkLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbHVyZQorICAgICAqLworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWxlZDsKKworICAgIC8qKgorICAgICAqIFNhbWUgYXMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MKKyAgICAgKi8KKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlRW5kICAgb25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQ7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zZXF1ZW5jZUFib3J0IG9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX2J1ZmZlckxvc3QgICAgb25DYXB0dXJlQnVmZmVyTG9zdDsKK30gQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrczsKKworLyoqCisgKiBUaGlzIGhhcyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlLCB3aXRoIGFkZGVkCisgKiBzdXBwb3J0IGZvciBsb2dpY2FsIG11bHRpLWNhbWVyYSB3aGVyZSB0aGUgY2FwdHVyZSBjYWxsYmFja3Mgc3VwcG9ydHMgcmVzdWx0IG1ldGFkYXRhIGZvcgorICogcGh5c2ljYWwgY2FtZXJhcy4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmUoCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZUNhbGxiYWNrcyogY2FsbGJhY2tzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIFRoaXMgaGFzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3NldFJlcGVhdGluZ1JlcXVlc3QsIHdpdGggYWRkZWQKKyAqIHN1cHBvcnQgZm9yIGxvZ2ljYWwgbXVsdGktY2FtZXJhIHdoZXJlIHRoZSBjYXB0dXJlIGNhbGxiYWNrcyBzdXBwb3J0cyByZXN1bHQgbWV0YWRhdGEgZm9yCisgKiBwaHlzaWNhbCBjYW1lcmFzLgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfc2V0UmVwZWF0aW5nUmVxdWVzdCgKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzKiBjYWxsYmFja3MsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KKwogX19FTkRfREVDTFMKIAogI2VuZGlmIC8qIF9OREtfQ0FNRVJBX0NBUFRVUkVfU0VTU0lPTl9IICovCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYURldmljZS5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaAppbmRleCA3YzEzYjM0Li4xNTM3YmRlIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYURldmljZS5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRGV2aWNlLmgKQEAgLTM0LDEwICszNCwxMCBAQAogICovCiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CiAKLSNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KICNpbmNsdWRlICJOZGtDYW1lcmFFcnJvci5oIgogI2luY2x1ZGUgIk5ka0NhcHR1cmVSZXF1ZXN0LmgiCiAjaW5jbHVkZSAiTmRrQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKKyNpbmNsdWRlICJOZGtDYW1lcmFXaW5kb3dUeXBlLmgiCiAKICNpZm5kZWYgX05ES19DQU1FUkFfREVWSUNFX0gKICNkZWZpbmUgX05ES19DQU1FUkFfREVWSUNFX0gKQEAgLTUzLDYgKzUzLDE3IEBACiAgKi8KIHR5cGVkZWYgc3RydWN0IEFDYW1lcmFEZXZpY2UgQUNhbWVyYURldmljZTsKIAorLyoqCisgKiBTdHJ1Y3QgdG8gaG9sZCBsaXN0IG9mIGNhbWVyYSBkZXZpY2UgSWRzLiBUaGlzIGNhbiByZWZlciB0byBlaXRoZXIgdGhlIElkcworICogb2YgY29ubmVjdGVkIGNhbWVyYSBkZXZpY2VzIHJldHVybmVkIGZyb20ge0BsaW5rIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUlkTGlzdH0sCisgKiBvciB0aGUgcGh5c2ljYWwgY2FtZXJhIElkcyBwYXNzZWQgaW50bworICoge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgQUNhbWVyYUlkTGlzdCB7CisgICAgaW50IG51bUNhbWVyYXM7ICAgICAgICAgIC8vLzwgTnVtYmVyIG9mIGNhbWVyYSBkZXZpY2UgSWRzCisgICAgY29uc3QgY2hhcioqIGNhbWVyYUlkczsgIC8vLzwgbGlzdCBvZiBjYW1lcmEgZGV2aWNlIElkcworfSBBQ2FtZXJhSWRMaXN0OworCiAvLy8gRW51bSBmb3IgQUNhbWVyYURldmljZV9FcnJvclN0YXRlQ2FsbGJhY2sgZXJyb3IgY29kZQogZW51bSB7CiAgICAgLyoqCkBAIC0zNDUsNyArMzU2LDcgQEAKICAqIEBzZWUgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZAogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2NyZWF0ZSgKLSAgICAgICAgQU5hdGl2ZVdpbmRvdyogYW53LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjQpOworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogYW53LCAvKm91dCovQUNhcHR1cmVTZXNzaW9uT3V0cHV0Kiogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKICAqIEZyZWUgYSBBQ2FwdHVyZVNlc3Npb25PdXRwdXQgb2JqZWN0LgpAQCAtNjQ2LDYgKzY1NywxNCBAQAogICogdGFyZ2V0IGNvbWJpbmF0aW9ucyB3aXRoIHNpemVzIG91dHNpZGUgb2YgdGhlc2UgZ3VhcmFudGVlcywgYnV0IHRoaXMgY2FuIG9ubHkgYmUgdGVzdGVkIGZvcgogICogYnkgYXR0ZW1wdGluZyB0byBjcmVhdGUgYSBzZXNzaW9uIHdpdGggc3VjaCB0YXJnZXRzLjwvcD4KICAqCisgKiA8cD5FeGNlcHRpb24gb24gMTc2eDE0NCAoUUNJRikgcmVzb2x1dGlvbjoKKyAqIENhbWVyYSBkZXZpY2VzIHVzdWFsbHkgaGF2ZSBhIGZpeGVkIGNhcGFiaWxpdHkgZm9yIGRvd25zY2FsaW5nIGZyb20gbGFyZ2VyIHJlc29sdXRpb24gdG8KKyAqIHNtYWxsZXIsIGFuZCB0aGUgUUNJRiByZXNvbHV0aW9uIHNvbWV0aW1lcyBjYW5ub3QgYmUgZnVsbHkgc3VwcG9ydGVkIGR1ZSB0byB0aGlzCisgKiBsaW1pdGF0aW9uIG9uIGRldmljZXMgd2l0aCBoaWdoLXJlc29sdXRpb24gaW1hZ2Ugc2Vuc29ycy4gVGhlcmVmb3JlLCB0cnlpbmcgdG8gY29uZmlndXJlIGEKKyAqIFFDSUYgcmVzb2x1dGlvbiBzdHJlYW0gdG9nZXRoZXIgd2l0aCBhbnkgb3RoZXIgc3RyZWFtIGxhcmdlciB0aGFuIDE5MjB4MTA4MCByZXNvbHV0aW9uCisgKiAoZWl0aGVyIHdpZHRoIG9yIGhlaWdodCkgbWlnaHQgbm90IGJlIHN1cHBvcnRlZCwgYW5kIGNhcHR1cmUgc2Vzc2lvbiBjcmVhdGlvbiB3aWxsIGZhaWwgaWYgaXQKKyAqIGlzIG5vdC48L3A+CisgKgogICogQHBhcmFtIGRldmljZSB0aGUgY2FtZXJhIGRldmljZSBvZiBpbnRlcmVzdC4KICAqIEBwYXJhbSBvdXRwdXRzIHRoZSB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyfSBkZXNjcmliZXMgYWxsIG91dHB1dCBzdHJlYW1zLgogICogQHBhcmFtIGNhbGxiYWNrcyB0aGUge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyBjYXB0dXJlIHNlc3Npb24gc3RhdGUgY2FsbGJhY2tzfS4KQEAgLTY5NCw3ICs3MTMsNyBAQAogICogQHNlZSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkCiAgKi8KIGNhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfY3JlYXRlKAotICAgICAgICBBTmF0aXZlV2luZG93KiBhbncsIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyOCk7CisgICAgICAgIEFDYW1lcmFXaW5kb3dUeXBlKiBhbncsIC8qb3V0Ki9BQ2FwdHVyZVNlc3Npb25PdXRwdXQqKiBvdXRwdXQpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogQWRkIGEgbmF0aXZlIHdpbmRvdyB0byBzaGFyZWQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0LgpAQCAtNzEyLDcgKzczMSw3IEBACiAgKiAgICAgICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXQuPC9saT48L3VsPgogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X2FkZChBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dHB1dCwKLSAgICAgICAgQU5hdGl2ZVdpbmRvdyAqYW53KSBfX0lOVFJPRFVDRURfSU4oMjgpOworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSAqYW53KSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKICAqIFJlbW92ZSBhIG5hdGl2ZSB3aW5kb3cgZnJvbSBzaGFyZWQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0LgpAQCAtNzI4LDcgKzc0Nyw3IEBACiAgKiAgICAgICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXQuPC9saT48L3VsPgogICovCiBjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVTZXNzaW9uU2hhcmVkT3V0cHV0X3JlbW92ZShBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dHB1dCwKLSAgICAgICAgQU5hdGl2ZVdpbmRvdyogYW53KSBfX0lOVFJPRFVDRURfSU4oMjgpOworICAgICAgICBBQ2FtZXJhV2luZG93VHlwZSogYW53KSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKICAqIENyZWF0ZSBhIG5ldyBjYW1lcmEgY2FwdHVyZSBzZXNzaW9uIHNpbWlsYXIgdG8ge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb259LiBUaGlzCkBAIC03NjUsNiArNzg0LDExNCBAQAogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI4ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKworLyoqCisgKiBDcmVhdGUgYSBBQ2FwdHVyZVNlc3Npb25PdXRwdXQgb2JqZWN0IHVzZWQgZm9yIHN0cmVhbWluZyBmcm9tIGEgcGh5c2ljYWwKKyAqIGNhbWVyYSBhcyBwYXJ0IG9mIGEgbG9naWNhbCBjYW1lcmEgZGV2aWNlLgorICoKKyAqIDxwPlRoZSBBQ2FwdHVyZVNlc3Npb25PdXRwdXQgaXMgdXNlZCBpbiB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2FkZH0gbWV0aG9kIHRvIGFkZAorICogYW4gb3V0cHV0IHtAbGluayBBTmF0aXZlV2luZG93fSB0byBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIuIFVzZQorICoge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlfSB0byBmcmVlIHRoZSBvYmplY3QgYW5kIGl0cyBtZW1vcnkgYWZ0ZXIgYXBwbGljYXRpb24gbm8gbG9uZ2VyCisgKiBuZWVkcyB0aGUge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dH0uPC9wPgorICoKKyAqIEBwYXJhbSBhbncgdGhlIHtAbGluayBBTmF0aXZlV2luZG93fSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhlIHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXR9CisgKiBAcGFyYW0gcGh5c2ljYWxJZCB0aGUgSWQgb2YgdGhlIHBoeXNpY2FsIGNhbWVyYSB0aGlzIG91dHB1dCBpcyBhc3NvY2lhdGVkCisgKiAgICAgICAgICAgICAgICAgIHdpdGguCisgKiBAcGFyYW0gb3V0cHV0IHRoZSBvdXRwdXQge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dH0gd2lsbCBiZSBzdG9yZWQgaGVyZSBpZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgbWV0aG9kIGNhbGwgc3VjY2VlZHMuCisgKgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLiBUaGUgY3JlYXRlZCBjb250YWluZXIgd2lsbCBiZQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGxlZCBpbiB0aGUgb3V0cHV0IGFyZ3VtZW50LjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgYW53LCBwaHlzaWNhbElkIG9yIG91dHB1dCBpcyBOVUxMLjwvbGk+PC91bD4KKyAqCisgKiBAc2VlIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9hZGQKKyAqLworY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlU2Vzc2lvblBoeXNpY2FsT3V0cHV0X2NyZWF0ZSgKKyAgICAgICAgQUNhbWVyYVdpbmRvd1R5cGUqIGFudywgY29uc3QgY2hhciogcGh5c2ljYWxJZCwKKyAgICAgICAgLypvdXQqL0FDYXB0dXJlU2Vzc2lvbk91dHB1dCoqIG91dHB1dCkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBDcmVhdGUgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBBQ2FwdHVyZVJlcXVlc3QgZm9yIGNhcHR1cmluZyBpbWFnZXMsIGluaXRpYWxpemVkIHdpdGggdGVtcGxhdGUKKyAqIGZvciBhIHRhcmdldCB1c2UgY2FzZSwgd2l0aCB0aGUgYWJpbGl0eSB0byBzcGVjaWZ5IHBoeXNpY2FsIGNhbWVyYSBzZXR0aW5ncy4KKyAqCisgKiA8cD5UaGUgc2V0dGluZ3MgYXJlIGNob3NlbiB0byBiZSB0aGUgYmVzdCBvcHRpb25zIGZvciB0aGlzIGNhbWVyYSBkZXZpY2UsCisgKiBzbyBpdCBpcyBub3QgcmVjb21tZW5kZWQgdG8gcmV1c2UgdGhlIHNhbWUgcmVxdWVzdCBmb3IgYSBkaWZmZXJlbnQgY2FtZXJhIGRldmljZS48L3A+CisgKgorICogPHA+Tm90ZSB0aGF0IGZvciBhbGwga2V5cyBpbiBwaHlzaWNhbCBjYW1lcmEgc2V0dGluZ3MsIG9ubHkgdGhlIGtleXMKKyAqIGFkdmVydGlzZWQgaW4gQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTIGFyZQorICogYXBwbGljYWJsZS4gQWxsIG90aGVyIGtleXMgYXJlIGlnbm9yZWQgYnkgdGhlIGNhbWVyYSBkZXZpY2UuPC9wPgorICoKKyAqIEBwYXJhbSBkZXZpY2UgdGhlIGNhbWVyYSBkZXZpY2Ugb2YgaW50ZXJlc3QKKyAqIEBwYXJhbSB0ZW1wbGF0ZUlkIHRoZSB0eXBlIG9mIGNhcHR1cmUgcmVxdWVzdCB0byBiZSBjcmVhdGVkLgorICogICAgICAgIFNlZSB7QGxpbmsgQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlfS4KKyAqIEBwYXJhbSBwaHlzaWNhbElkTGlzdCBUaGUgbGlzdCBvZiBwaHlzaWNhbCBjYW1lcmEgSWRzIHRoYXQgY2FuIGJlIHVzZWQgdG8KKyAqICAgICAgICBjdXN0b21pemUgdGhlIHJlcXVlc3QgZm9yIGEgc3BlY2lmaWMgcGh5c2ljYWwgY2FtZXJhLgorICogQHBhcmFtIHJlcXVlc3QgdGhlIG91dHB1dCByZXF1ZXN0IHdpbGwgYmUgc3RvcmVkIGhlcmUgaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy4gVGhlIGNyZWF0ZWQgY2FwdHVyZSByZXF1ZXN0IHdpbGwgYmUKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxsZWQgaW4gcmVxdWVzdCBhcmd1bWVudC48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIGRldmljZSwgcGh5c2ljYWxJZExpc3QsIG9yIHJlcXVlc3QgaXMKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCB0ZW1wbGF0ZUlkIGlzIHVuZGVmaW5lZCBvciBjYW1lcmEgZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQgdGVtcGxhdGUsIG9yIGlmIHNvbWUgSWRzIGluIHBoeXNpY2FsSWRMaXN0IGlzbid0IGEKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCBwaHlzaWNhbCBjYW1lcmEgYmFja2luZyB0aGUgY3VycmVudCBjYW1lcmEgZGV2aWNlLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEfSBpZiB0aGUgY2FtZXJhIGRldmljZSBpcyBjbG9zZWQuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0V9IGlmIHRoZSBjYW1lcmEgZGV2aWNlIGVuY291bnRlcnMgZmF0YWwgZXJyb3IuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFfSBpZiB0aGUgY2FtZXJhIHNlcnZpY2UgZW5jb3VudGVycyBmYXRhbCBlcnJvci48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfVU5LTk9XTn0gaWYgdGhlIG1ldGhvZCBmYWlscyBmb3Igc29tZSBvdGhlciByZWFzb25zLjwvbGk+PC91bD4KKyAqCisgKiBAc2VlIFRFTVBMQVRFX1BSRVZJRVcKKyAqIEBzZWUgVEVNUExBVEVfUkVDT1JECisgKiBAc2VlIFRFTVBMQVRFX1NUSUxMX0NBUFRVUkUKKyAqIEBzZWUgVEVNUExBVEVfVklERU9fU05BUFNIT1QKKyAqIEBzZWUgVEVNUExBVEVfTUFOVUFMCisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkcygKKyAgICAgICAgY29uc3QgQUNhbWVyYURldmljZSogZGV2aWNlLCBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgY29uc3QgQUNhbWVyYUlkTGlzdCogcGh5c2ljYWxJZExpc3QsCisgICAgICAgIC8qb3V0Ki9BQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIENoZWNrIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIHtAQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyfSBpcyBzdXBwb3J0ZWQgYnkKKyAqIHRoZSBjYW1lcmEgZGV2aWNlLgorICoKKyAqIDxwPlRoaXMgbWV0aG9kIHBlcmZvcm1zIGEgcnVudGltZSBjaGVjayBvZiBhIGdpdmVuIHtAbGluaworICogQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyfS4gVGhlIHJlc3VsdCBjb25maXJtcyB3aGV0aGVyIG9yIG5vdCB0aGUKKyAqIHBhc3NlZCBDYXB0dXJlU2Vzc2lvbiBvdXRwdXRzIGNhbiBiZSBzdWNjZXNzZnVsbHkgdXNlZCB0byBjcmVhdGUgYSBjYW1lcmEKKyAqIGNhcHR1cmUgc2Vzc2lvbiB1c2luZyB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbn0uPC9wPgorICoKKyAqIDxwPlRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgYXQgYW55IHBvaW50IGJlZm9yZSwgZHVyaW5nIGFuZCBhZnRlciBhY3RpdmUKKyAqIGNhcHR1cmUgc2Vzc2lvbi4gSXQgbXVzdCBub3QgaW1wYWN0IG5vcm1hbCBjYW1lcmEgYmVoYXZpb3IgaW4gYW55IHdheSBhbmQKKyAqIG11c3QgY29tcGxldGUgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdGhhbiBjcmVhdGluZyBhIGNhcHR1cmUgc2Vzc2lvbi48L3A+CisgKgorICogPHA+QWx0aG91Z2ggdGhpcyBtZXRob2QgaXMgZmFzdGVyIHRoYW4gY3JlYXRpbmcgYSBuZXcgY2FwdHVyZSBzZXNzaW9uLCBpdCBpcyBub3QgaW50ZW5kZWQKKyAqIHRvIGJlIHVzZWQgZm9yIGV4cGxvcmluZyB0aGUgZW50aXJlIHNwYWNlIG9mIHN1cHBvcnRlZCBzdHJlYW0gY29tYmluYXRpb25zLjwvcD4KKyAqCisgKiBAcGFyYW0gZGV2aWNlIHRoZSBjYW1lcmEgZGV2aWNlIG9mIGludGVyZXN0CisgKiBAcGFyYW0gc2Vzc2lvbk91dHB1dENvbnRhaW5lciB0aGUge0BsaW5rIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcn0gb2YKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZXN0LgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBnaXZlbiB7QGxpbmsgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyfQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIHN1cHBvcnRlZCBieSB0aGUgY2FtZXJhIGRldmljZS48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIGRldmljZSwgb3Igc2Vzc2lvbk91dHB1dENvbnRhaW5lcgorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIE5VTEwuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX1NUUkVBTV9DT05GSUdVUkVfRkFJTH0gaWYgdGhlIGdpdmVuCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAbGluayBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJ9CisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG5vdCBzdXBwb3J0ZWQgYnkKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGNhbWVyYQorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UuPC9saT4KKyAqICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfVU5TVVBQT1JURURfT1BFUkFUSU9OfSBpZiB0aGUgcXVlcnkgb3BlcmF0aW9uIGlzIG5vdAorICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRlZCBieSB0aGUgY2FtZXJhIGRldmljZS48L2xpPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYURldmljZV9pc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICBjb25zdCBBQ2FtZXJhRGV2aWNlKiBkZXZpY2UsCisgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogc2Vzc2lvbk91dHB1dENvbnRhaW5lcikgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLyogX05ES19DQU1FUkFfREVWSUNFX0ggKi8KZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRXJyb3IuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhRXJyb3IuaAppbmRleCA2YjU4MTU1Li5mYzYxOGVlIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYUVycm9yLmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFFcnJvci5oCkBAIC0xMDYsNyArMTA2LDggQEAKIAogICAgIC8qKgogICAgICAqIENhbWVyYSBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgc3RyZWFtIGNvbmZpZ3VyYXRpb24gcHJvdmlkZWQgYnkgYXBwbGljYXRpb24gaW4KLSAgICAgKiB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbn0uCisgICAgICoge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb259IG9yIHtAbGluaworICAgICAqIEFDYW1lcmFEZXZpY2VfaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZH0uCiAgICAgICovCiAgICAgQUNBTUVSQV9FUlJPUl9TVFJFQU1fQ09ORklHVVJFX0ZBSUwgPSBBQ0FNRVJBX0VSUk9SX0JBU0UgLSA5LAogCkBAIC0xMzAsNiArMTMxLDExIEBACiAgICAgICogVGhlIGFwcGxpY2F0aW9uIGRvZXMgbm90IGhhdmUgcGVybWlzc2lvbiB0byBvcGVuIGNhbWVyYS4KICAgICAgKi8KICAgICBBQ0FNRVJBX0VSUk9SX1BFUk1JU1NJT05fREVOSUVEICAgICA9IEFDQU1FUkFfRVJST1JfQkFTRSAtIDEzLAorCisgICAgLyoqCisgICAgICogVGhlIG9wZXJhdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSBjYW1lcmEgZGV2aWNlLgorICAgICAqLworICAgIEFDQU1FUkFfRVJST1JfVU5TVVBQT1JURURfT1BFUkFUSU9OID0gQUNBTUVSQV9FUlJPUl9CQVNFIC0gMTQsCiB9IGNhbWVyYV9zdGF0dXNfdDsKIAogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaAppbmRleCBlYTc2NzM4Li4yY2M4YTk3IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaAorKysgYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaApAQCAtNzQsMTIgKzc0LDYgQEAKICAqLwogdm9pZCBBQ2FtZXJhTWFuYWdlcl9kZWxldGUoQUNhbWVyYU1hbmFnZXIqIG1hbmFnZXIpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKLS8vLyBTdHJ1Y3QgdG8gaG9sZCBsaXN0IG9mIGNhbWVyYSBkZXZpY2VzCi10eXBlZGVmIHN0cnVjdCBBQ2FtZXJhSWRMaXN0IHsKLSAgICBpbnQgbnVtQ2FtZXJhczsgICAgICAgICAgLy8vPCBOdW1iZXIgb2YgY29ubmVjdGVkIGNhbWVyYSBkZXZpY2VzCi0gICAgY29uc3QgY2hhcioqIGNhbWVyYUlkczsgIC8vLzwgbGlzdCBvZiBpZGVudGlmaWVyIG9mIGNvbm5lY3RlZCBjYW1lcmEgZGV2aWNlcwotfSBBQ2FtZXJhSWRMaXN0OwotCiAvKioKICAqIENyZWF0ZSBhIGxpc3Qgb2YgY3VycmVudGx5IGNvbm5lY3RlZCBjYW1lcmEgZGV2aWNlcywgaW5jbHVkaW5nCiAgKiBjYW1lcmFzIHRoYXQgbWF5IGJlIGluIHVzZSBieSBvdGhlciBjYW1lcmEgQVBJIGNsaWVudHMuCkBAIC05MSw2ICs4NSwxMSBAQAogICogPHA+QUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhSWRMaXN0IHdpbGwgYWxsb2NhdGUgYW5kIHJldHVybiBhbiB7QGxpbmsgQUNhbWVyYUlkTGlzdH0uCiAgKiBUaGUgY2FsbGVyIG11c3QgY2FsbCB7QGxpbmsgQUNhbWVyYU1hbmFnZXJfZGVsZXRlQ2FtZXJhSWRMaXN0fSB0byBmcmVlIHRoZSBtZW1vcnk8L3A+CiAgKgorICogPHA+Tm90ZTogdGhlIHJldHVybmVkIGNhbWVyYSBsaXN0IG1pZ2h0IGJlIGEgc3Vic2V0IHRvIHRoZSBvdXRwdXQgb2YgPGEgaHJlZj0KKyAqICJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1hbmFnZXIuaHRtbCNnZXRDYW1lcmFJZExpc3QoKSI+CisgKiBTREsgQ2FtZXJhTWFuYWdlciNnZXRDYW1lcmFJZExpc3QgQVBJPC9hPiBhcyB0aGUgTkRLIEFQSSBkb2VzIG5vdCBzdXBwb3J0IHNvbWUgbGVnYWN5IGNhbWVyYQorICogaGFyZHdhcmUuPC9wPgorICoKICAqIEBwYXJhbSBtYW5hZ2VyIHRoZSB7QGxpbmsgQUNhbWVyYU1hbmFnZXJ9IG9mIGludGVyZXN0CiAgKiBAcGFyYW0gY2FtZXJhSWRMaXN0IHRoZSBvdXRwdXQge0BsaW5rIEFDYW1lcmFJZExpc3R9IHdpbGwgYmUgZmlsbGVkIGluIGhlcmUgaWYgdGhlIG1ldGhvZCBjYWxsCiAgKiAgICAgICAgc3VjY2VlZHMuCkBAIC0yNzgsNiArMjc3LDEyMiBAQAogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI0ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKworLyoqCisgKiBEZWZpbml0aW9uIG9mIGNhbWVyYSBhY2Nlc3MgcGVybWlzc2lvbiBjaGFuZ2UgY2FsbGJhY2suCisgKgorICogPHA+Tm90aWZpY2F0aW9uIHRoYXQgY2FtZXJhIGFjY2VzcyBwcmlvcml0aWVzIGhhdmUgY2hhbmdlZCBhbmQgdGhlIGNhbWVyYSBtYXkKKyAqIG5vdyBiZSBvcGVuYWJsZS4gQW4gYXBwbGljYXRpb24gdGhhdCB3YXMgcHJldmlvdXNseSBkZW5pZWQgY2FtZXJhIGFjY2VzcyBkdWUgdG8KKyAqIGEgaGlnaGVyLXByaW9yaXR5IHVzZXIgYWxyZWFkeSB1c2luZyB0aGUgY2FtZXJhLCBvciB0aGF0IHdhcyBkaXNjb25uZWN0ZWQgZnJvbSBhbgorICogYWN0aXZlIGNhbWVyYSBzZXNzaW9uIGR1ZSB0byBhIGhpZ2hlci1wcmlvcml0eSB1c2VyIHRyeWluZyB0byBvcGVuIHRoZSBjYW1lcmEsCisgKiBzaG91bGQgdHJ5IHRvIG9wZW4gdGhlIGNhbWVyYSBhZ2FpbiBpZiBpdCBzdGlsbCB3YW50cyB0byB1c2UgaXQuICBOb3RlIHRoYXQKKyAqIG11bHRpcGxlIGFwcGxpY2F0aW9ucyBtYXkgcmVjZWl2ZSB0aGlzIGNhbGxiYWNrIGF0IHRoZSBzYW1lIHRpbWUsIGFuZCBvbmx5IG9uZSBvZgorICogdGhlbSB3aWxsIHN1Y2NlZWQgaW4gb3BlbmluZyB0aGUgY2FtZXJhIGluIHByYWN0aWNlLCBkZXBlbmRpbmcgb24gZXhhY3QgYWNjZXNzCisgKiBwcmlvcml0eSBsZXZlbHMgYW5kIHRpbWluZy4gVGhpcyBtZXRob2QgaXMgdXNlZnVsIGluIGNhc2VzIHdoZXJlIG11bHRpcGxlCisgKiBhcHBsaWNhdGlvbnMgbWF5IGJlIGluIHRoZSByZXN1bWVkIHN0YXRlIGF0IHRoZSBzYW1lIHRpbWUsIGFuZCB0aGUgdXNlciBzd2l0Y2hlcworICogZm9jdXMgYmV0d2VlbiB0aGVtLCBvciBpZiB0aGUgY3VycmVudCBjYW1lcmEtdXNpbmcgYXBwbGljYXRpb24gbW92ZXMgYmV0d2VlbgorICogZnVsbC1zY3JlZW4gYW5kIFBpY3R1cmUtaW4tUGljdHVyZSAoUGlQKSBzdGF0ZXMuIEluIHN1Y2ggY2FzZXMsIHRoZSBjYW1lcmEKKyAqIGF2YWlsYWJsZS91bmF2YWlsYWJsZSBjYWxsYmFja3Mgd2lsbCBub3QgYmUgaW52b2tlZCwgYnV0IGFub3RoZXIgYXBwbGljYXRpb24gbWF5CisgKiBub3cgaGF2ZSBoaWdoZXIgcHJpb3JpdHkgZm9yIGNhbWVyYSBhY2Nlc3MgdGhhbiB0aGUgY3VycmVudCBjYW1lcmEtdXNpbmcKKyAqIGFwcGxpY2F0aW9uLjwvcD4KKworICogQHBhcmFtIGNvbnRleHQgVGhlIG9wdGlvbmFsIGFwcGxpY2F0aW9uIGNvbnRleHQgcHJvdmlkZWQgYnkgdXNlciBpbgorICogICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUxpc3RlbmVyfS4KKyAqLwordHlwZWRlZiB2b2lkICgqQUNhbWVyYU1hbmFnZXJfQWNjZXNzUHJpb3JpdGllc0NoYW5nZWRDYWxsYmFjaykodm9pZCogY29udGV4dCk7CisKKy8qKgorICogQSBsaXN0ZW5lciBmb3IgY2FtZXJhIGRldmljZXMgYmVjb21pbmcgYXZhaWxhYmxlL3VuYXZhaWxhYmxlIHRvIG9wZW4gb3Igd2hlbgorICogdGhlIGNhbWVyYSBhY2Nlc3MgcGVybWlzc2lvbnMgY2hhbmdlLgorICoKKyAqIDxwPkNhbWVyYXMgYmVjb21lIGF2YWlsYWJsZSB3aGVuIHRoZXkgYXJlIG5vIGxvbmdlciBpbiB1c2UsIG9yIHdoZW4gYSBuZXcKKyAqIHJlbW92YWJsZSBjYW1lcmEgaXMgY29ubmVjdGVkLiBUaGV5IGJlY29tZSB1bmF2YWlsYWJsZSB3aGVuIHNvbWUKKyAqIGFwcGxpY2F0aW9uIG9yIHNlcnZpY2Ugc3RhcnRzIHVzaW5nIGEgY2FtZXJhLCBvciB3aGVuIGEgcmVtb3ZhYmxlIGNhbWVyYQorICogaXMgZGlzY29ubmVjdGVkLjwvcD4KKyAqCisgKiBAc2VlIEFDYW1lcmFNYW5hZ2VyX3JlZ2lzdGVyRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFjaworICovCit0eXBlZGVmIHN0cnVjdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUxpc3RlbmVyIHsKKyAgICAvLy8KKyAgICBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgYXZhaWxhYmlsaXR5Q2FsbGJhY2tzOworCisgICAgLy8vIENhbGxlZCB3aGVuIHRoZXJlIGlzIGNhbWVyYSBhY2Nlc3MgcGVybWlzc2lvbiBjaGFuZ2UKKyAgICBBQ2FtZXJhTWFuYWdlcl9BY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZENhbGxiYWNrIG9uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWQ7CisKKyAgICAvLy8gUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UsIHBsZWFzZSBlbnN1cmUgdGhhdCBhbGwgZW50cmllcyBhcmUgc2V0IHRvIE5VTEwKKyAgICB2b2lkICpyZXNlcnZlZFs2XTsKK30gQUNhbWVyYU1hbmFnZXJfRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFja3M7CisKKy8qKgorICogUmVnaXN0ZXIgY2FtZXJhIGV4dGVuZGVkIGF2YWlsYWJpbGl0eSBjYWxsYmFja3MuCisgKgorICogPHA+b25DYW1lcmFVbmF2YWlsYWJsZSB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciBhIGNhbWVyYSBkZXZpY2UgaXMgb3BlbmVkIGJ5IGFueSBjYW1lcmEgQVBJCisgKiBjbGllbnQuIE90aGVyIGNhbWVyYSBBUEkgY2xpZW50cyBtYXkgc3RpbGwgYmUgYWJsZSB0byBvcGVuIHN1Y2ggYSBjYW1lcmEgZGV2aWNlLCBldmljdGluZyB0aGUKKyAqIGV4aXN0aW5nIGNsaWVudCBpZiB0aGV5IGhhdmUgaGlnaGVyIHByaW9yaXR5IHRoYW4gdGhlIGV4aXN0aW5nIGNsaWVudCBvZiBhIGNhbWVyYSBkZXZpY2UuCisgKiBTZWUge0BsaW5rIEFDYW1lcmFNYW5hZ2VyX29wZW5DYW1lcmF9IGZvciBtb3JlIGRldGFpbHMuPC9wPgorICoKKyAqIDxwPlRoZSBjYWxsYmFja3Mgd2lsbCBiZSBjYWxsZWQgb24gYSBkZWRpY2F0ZWQgdGhyZWFkIHNoYXJlZCBhbW9uZyBhbGwgQUNhbWVyYU1hbmFnZXIKKyAqIGluc3RhbmNlcy48L3A+CisgKgorICogPHA+U2luY2UgdGhpcyBjYWxsYmFjayB3aWxsIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgY2FtZXJhIHNlcnZpY2UsIHJlbWVtYmVyIHRvIHVucmVnaXN0ZXIgaXQKKyAqIG9uY2UgaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZDsgb3RoZXJ3aXNlIHRoZSBjYWxsYmFjayB3aWxsIGNvbnRpbnVlIHRvIHJlY2VpdmUgZXZlbnRzCisgKiBpbmRlZmluaXRlbHkgYW5kIGl0IG1heSBwcmV2ZW50IG90aGVyIHJlc291cmNlcyBmcm9tIGJlaW5nIHJlbGVhc2VkLiBTcGVjaWZpY2FsbHksIHRoZQorICogY2FsbGJhY2tzIHdpbGwgYmUgaW52b2tlZCBpbmRlcGVuZGVudGx5IG9mIHRoZSBnZW5lcmFsIGFjdGl2aXR5IGxpZmVjeWNsZSBhbmQgaW5kZXBlbmRlbnRseQorICogb2YgdGhlIHN0YXRlIG9mIGluZGl2aWR1YWwgQUNhbWVyYU1hbmFnZXIgaW5zdGFuY2VzLjwvcD4KKyAqCisgKiBAcGFyYW0gbWFuYWdlciB0aGUge0BsaW5rIEFDYW1lcmFNYW5hZ2VyfSBvZiBpbnRlcmVzdC4KKyAqIEBwYXJhbSBjYWxsYmFjayB0aGUge0BsaW5rIEFDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzfSB0byBiZSByZWdpc3RlcmVkLgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIG1hbmFnZXIgb3IgY2FsbGJhY2sgaXMgTlVMTCwgb3IKKyAqICAgICAgICAgICAgICAgICAge0FDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzI29uQ2FtZXJhQWNjZXNzUHJpb3JpdGllc0NoYW5nZWR9CisgKiAgICAgICAgICAgICAgICAgIG9yIHtBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3Mjb25DYW1lcmFBdmFpbGFibGV9IG9yCisgKiAgICAgICAgICAgICAgICAgIHtBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3Mjb25DYW1lcmFVbmF2YWlsYWJsZX0gaXMgTlVMTC48L2xpPjwvdWw+CisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhTWFuYWdlcl9yZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgIEFDYW1lcmFNYW5hZ2VyKiBtYW5hZ2VyLAorICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyogY2FsbGJhY2spIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogVW5yZWdpc3RlciBjYW1lcmEgZXh0ZW5kZWQgYXZhaWxhYmlsaXR5IGNhbGxiYWNrcy4KKyAqCisgKiA8cD5SZW1vdmluZyBhIGNhbGxiYWNrIHRoYXQgaXNuJ3QgcmVnaXN0ZXJlZCBoYXMgbm8gZWZmZWN0LjwvcD4KKyAqCisgKiBAcGFyYW0gbWFuYWdlciB0aGUge0BsaW5rIEFDYW1lcmFNYW5hZ2VyfSBvZiBpbnRlcmVzdC4KKyAqIEBwYXJhbSBjYWxsYmFjayB0aGUge0BsaW5rIEFDYW1lcmFNYW5hZ2VyX0V4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2tzfSB0byBiZSB1bnJlZ2lzdGVyZWQuCisgKgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgY2FsbGJhY2ssCisgKiAgICAgICAgICAgICAgICAgIHtBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyNvbkNhbWVyYUFjY2Vzc1ByaW9yaXRpZXNDaGFuZ2VkfQorICogICAgICAgICAgICAgICAgICBvciB7QUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzI29uQ2FtZXJhQXZhaWxhYmxlfSBvcgorICogICAgICAgICAgICAgICAgICB7QUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzI29uQ2FtZXJhVW5hdmFpbGFibGV9IGlzIE5VTEwuPC9saT48L3VsPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhbWVyYU1hbmFnZXJfdW5yZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgIEFDYW1lcmFNYW5hZ2VyKiBtYW5hZ2VyLAorICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9FeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrcyogY2FsbGJhY2spIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNpZmRlZiBfX0FORFJPSURfVk5ES19fCisvKioKKyAqIFJldHJpZXZlIHRoZSB0YWcgdmFsdWUsIGdpdmVuIHRoZSB0YWcgbmFtZSBhbmQgY2FtZXJhIGlkLgorICogVGhpcyBtZXRob2QgaXMgZGV2aWNlIHNwZWNpZmljIHNpbmNlIHNvbWUgbWV0YWRhdGEgbWlnaHQgYmUgZGVmaW5lZCBieSBkZXZpY2UgbWFudWZhY3R1cmVycworICogYW5kIG1pZ2h0IG9ubHkgYmUgYWNjZXNzaWJsZSBmb3Igc3BlY2lmaWMgY2FtZXJhcy4KKyAqIEBwYXJhbSBtYW5hZ2VyIFRoZSB7QGxpbmsgQUNhbWVyYU1hbmFnZXJ9IG9mIGludGVyZXN0LgorICogQHBhcmFtIGNhbWVyYUlkIFRoZSBjYW1lcmFJZCwgd2hpY2ggaXMgdXNlZCB0byBxdWVyeSBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzLgorICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHRhZyBiZWluZyBxdWVyaWVkLgorICogQHBhcmFtIHRhZyBUaGUgb3V0cHV0IHRhZyBhc3NpZ25lZCBieSB0aGlzIG1ldGhvZC4KKyAqCisgKiBAcmV0dXJuIEFDQU1FUkFfT0sgb25seSBpZiB0aGUgZnVuY3Rpb24gY2FsbCB3YXMgc3VjY2Vzc2Z1bC4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYW1lcmFNYW5hZ2VyX2dldFRhZ0Zyb21OYW1lKEFDYW1lcmFNYW5hZ2VyICptYW5hZ2VyLCBjb25zdCBjaGFyKiBjYW1lcmFJZCwKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgLypvdXQqL3VpbnQzMl90ICp0YWcpCisgICAgICAgIF9fSU5UUk9EVUNFRF9JTigyOSk7CisjZW5kaWYKKworI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLyogX05ES19DQU1FUkFfTUFOQUdFUl9IICovCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhLmgKaW5kZXggNjExZTI3MC4uOWJiZmI4MyAxMDA2NDQKLS0tIGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YS5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGEuaApAQCAtMjMzLDYgKzIzMywyOCBAQAogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI0ICovCiAKKyNpZiBfX0FORFJPSURfQVBJX18gPj0gMjkKKworLyoqCisgKiBIZWxwZXIgZnVuY3Rpb24gdG8gY2hlY2sgaWYgYSBjYW1lcmEgaXMgbG9naWNhbCBtdWx0aS1jYW1lcmEuCisgKgorICogPHA+IENoZWNrIHdoZXRoZXIgYSBjYW1lcmEgZGV2aWNlIGlzIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEgYmFzZWQgb24gaXRzCisgKiBzdGF0aWMgbWV0YWRhdGEuIElmIGl0IGlzLCBhbHNvIHJldHVybnMgaXRzIHBoeXNpY2FsIHN1YiBjYW1lcmEgSWRzLjwvcD4KKyAqCisgKiBAcGFyYW0gc3RhdGljTWV0YWRhdGEgdGhlIHN0YXRpYyBtZXRhZGF0YSBvZiB0aGUgY2FtZXJhIGJlaW5nIGNoZWNrZWQuCisgKiBAcGFyYW0gbnVtUGh5c2ljYWxDYW1lcmFzIHJldHVybnMgdGhlIG51bWJlciBvZiBwaHlzaWNhbCBjYW1lcmFzLgorICogQHBhcmFtIHBoeXNpY2FsQ2FtZXJhSWRzIHJldHVybnMgdGhlIGFycmF5IG9mIHBoeXNpY2FsIGNhbWVyYSBJZHMgYmFja2luZyB0aGlzIGxvZ2ljYWwKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEgZGV2aWNlLiBOb3RlIHRoYXQgdGhpcyBwb2ludGVyIGlzIG9ubHkgdmFsaWQKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoZSBzdGF0aWNNZXRhZGF0YSBvYmplY3QuCisgKgorICogQHJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSwgZmFsc2Ugb3RoZXJ3aXNlLgorICovCitib29sIEFDYW1lcmFNZXRhZGF0YV9pc0xvZ2ljYWxNdWx0aUNhbWVyYShjb25zdCBBQ2FtZXJhTWV0YWRhdGEqIHN0YXRpY01ldGFkYXRhLAorICAgICAgICAvKm91dCovc2l6ZV90KiBudW1QaHlzaWNhbENhbWVyYXMsIC8qb3V0Ki9jb25zdCBjaGFyKiBjb25zdCoqIHBoeXNpY2FsQ2FtZXJhSWRzKQorICAgICAgICBfX0lOVFJPRFVDRURfSU4oMjkpOworCisjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDI5ICovCisKIF9fRU5EX0RFQ0xTCiAKICNlbmRpZiAvKiBfTkRLX0NBTUVSQV9NRVRBREFUQV9IICovCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFNZXRhZGF0YVRhZ3MuaAppbmRleCBhOWFmNzdlLi44ZGQ2ZTAwIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYU1ldGFkYXRhVGFncy5oCisrKyBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FtZXJhTWV0YWRhdGFUYWdzLmgKQEAgLTcxLDYgKzcxLDggQEAKICAgICBBQ0FNRVJBX0RFUFRILAogICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkEsCiAgICAgQUNBTUVSQV9ESVNUT1JUSU9OX0NPUlJFQ1RJT04sCisgICAgQUNBTUVSQV9IRUlDLAorICAgIEFDQU1FUkFfSEVJQ19JTkZPLAogICAgIEFDQU1FUkFfU0VDVElPTl9DT1VOVCwKIAogICAgIEFDQU1FUkFfVkVORE9SID0gMHg4MDAwCkBAIC0xMTIsNiArMTE0LDggQEAKICAgICBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTl9TVEFSVAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IEFDQU1FUkFfRElTVE9SVElPTl9DT1JSRUNUSU9OCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgMTYsCisgICAgQUNBTUVSQV9IRUlDX1NUQVJUICAgICAgICAgICAgID0gQUNBTUVSQV9IRUlDICAgICAgICAgICAgICA8PCAxNiwKKyAgICBBQ0FNRVJBX0hFSUNfSU5GT19TVEFSVCAgICAgICAgPSBBQ0FNRVJBX0hFSUNfSU5GTyAgICAgICAgIDw8IDE2LAogICAgIEFDQU1FUkFfVkVORE9SX1NUQVJUICAgICAgICAgICA9IEFDQU1FUkFfVkVORE9SICAgICAgICAgICAgPDwgMTYKIH0gYWNhbWVyYV9tZXRhZGF0YV9zZWN0aW9uX3N0YXJ0X3Q7CiAKQEAgLTE5MTIsNiArMTkxNiw3IEBACiAgICAgICogICA8bGk+QUNhcHR1cmVSZXF1ZXN0PC9saT4KICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIGlzIGFsc28gdXNlZCBmb3IgSEVJQyBpbWFnZSBjYXB0dXJlLjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX0pQRUdfR1BTX0NPT1JESU5BVEVTID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb3VibGVbM10KICAgICAgICAgICAgIEFDQU1FUkFfSlBFR19TVEFSVCwKQEAgLTE5MjcsNiArMTkzMiw3IEBACiAgICAgICogICA8bGk+QUNhcHR1cmVSZXF1ZXN0PC9saT4KICAgICAgKiA8L3VsPjwvcD4KICAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIGlzIGFsc28gdXNlZCBmb3IgSEVJQyBpbWFnZSBjYXB0dXJlLjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX0pQRUdfR1BTX1BST0NFU1NJTkdfTUVUSE9EID0gICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlCiAgICAgICAgICAgICBBQ0FNRVJBX0pQRUdfU1RBUlQgKyAxLApAQCAtMTk0Miw2ICsxOTQ4LDcgQEAKICAgICAgKiAgIDxsaT5BQ2FwdHVyZVJlcXVlc3Q8L2xpPgogICAgICAqIDwvdWw+PC9wPgogICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgaXMgYWxzbyB1c2VkIGZvciBIRUlDIGltYWdlIGNhcHR1cmUuPC9wPgogICAgICAqLwogICAgIEFDQU1FUkFfSlBFR19HUFNfVElNRVNUQU1QID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludDY0CiAgICAgICAgICAgICBBQ0FNRVJBX0pQRUdfU1RBUlQgKyAyLApAQCAtMTk4Niw2ICsxOTkzLDEwIEBACiAgICAgICogPC9jb2RlPjwvcHJlPgogICAgICAqIDxwPkZvciBFWFRFUk5BTCBjYW1lcmFzIHRoZSBzZW5zb3Igb3JpZW50YXRpb24gd2lsbCBhbHdheXMgYmUgc2V0IHRvIDAgYW5kIHRoZSBmYWNpbmcgd2lsbAogICAgICAqIGFsc28gYmUgc2V0IHRvIEVYVEVSTkFMLiBUaGUgYWJvdmUgY29kZSBpcyBub3QgcmVsZXZhbnQgaW4gc3VjaCBjYXNlLjwvcD4KKyAgICAgKiA8cD5UaGlzIHRhZyBpcyBhbHNvIHVzZWQgdG8gZGVzY3JpYmUgdGhlIG9yaWVudGF0aW9uIG9mIHRoZSBIRUlDIGltYWdlIGNhcHR1cmUsIGluIHdoaWNoCisgICAgICogY2FzZSB0aGUgcm90YXRpb24gaXMgcmVmbGVjdGVkIGJ5CisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvbWVkaWEvRXhpZkludGVyZmFjZS5odG1sI1RBR19PUklFTlRBVElPTiI+RVhJRiBvcmllbnRhdGlvbiBmbGFnPC9hPiwgYW5kIG5vdCBieQorICAgICAqIHJvdGF0aW5nIHRoZSBpbWFnZSBkYXRhIGl0c2VsZi48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX09SSUVOVEFUSU9OCiAgICAgICovCkBAIC0yMDAzLDcgKzIwMTQsOCBAQAogICAgICAqICAgPGxpPkFDYXB0dXJlUmVxdWVzdDwvbGk+CiAgICAgICogPC91bD48L3A+CiAgICAgICoKLSAgICAgKiA8cD44NS05NSBpcyB0eXBpY2FsIHVzYWdlIHJhbmdlLjwvcD4KKyAgICAgKiA8cD44NS05NSBpcyB0eXBpY2FsIHVzYWdlIHJhbmdlLiBUaGlzIHRhZyBpcyBhbHNvIHVzZWQgdG8gZGVzY3JpYmUgdGhlIHF1YWxpdHkKKyAgICAgKiBvZiB0aGUgSEVJQyBpbWFnZSBjYXB0dXJlLjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX0pQRUdfUVVBTElUWSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieXRlCiAgICAgICAgICAgICBBQ0FNRVJBX0pQRUdfU1RBUlQgKyA0LApAQCAtMjAxOSw2ICsyMDMxLDcgQEAKICAgICAgKiAgIDxsaT5BQ2FwdHVyZVJlcXVlc3Q8L2xpPgogICAgICAqIDwvdWw+PC9wPgogICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgaXMgYWxzbyB1c2VkIHRvIGRlc2NyaWJlIHRoZSBxdWFsaXR5IG9mIHRoZSBIRUlDIGltYWdlIGNhcHR1cmUuPC9wPgogICAgICAqLwogICAgIEFDQU1FUkFfSlBFR19USFVNQk5BSUxfUVVBTElUWSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUKICAgICAgICAgICAgIEFDQU1FUkFfSlBFR19TVEFSVCArIDUsCkBAIC0yMDU1LDYgKzIwNjgsMTAgQEAKICAgICAgKiAgIG9yaWVudGF0aW9uIGlzIHJlcXVlc3RlZC4gTEVHQUNZIGRldmljZSB3aWxsIGFsd2F5cyByZXBvcnQgdW5yb3RhdGVkIHRodW1ibmFpbAogICAgICAqICAgc2l6ZS48L2xpPgogICAgICAqIDwvdWw+CisgICAgICogPHA+VGhlIHRhZyBpcyBhbHNvIHVzZWQgYXMgdGh1bWJuYWlsIHNpemUgZm9yIEhFSUMgaW1hZ2UgZm9ybWF0IGNhcHR1cmUsIGluIHdoaWNoIGNhc2UgdGhlCisgICAgICogdGhlIHRodW1ibmFpbCByb3RhdGlvbiBpcyByZWZsZWN0ZWQgYnkKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9tZWRpYS9FeGlmSW50ZXJmYWNlLmh0bWwjVEFHX09SSUVOVEFUSU9OIj5FWElGIG9yaWVudGF0aW9uIGZsYWc8L2E+LCBhbmQgbm90IGJ5CisgICAgICogcm90YXRpbmcgdGhlIHRodW1ibmFpbCBkYXRhIGl0c2VsZi48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfSlBFR19PUklFTlRBVElPTgogICAgICAqLwpAQCAtMjA4OCw2ICsyMTA1LDcgQEAKICAgICAgKiBhbmQgdmljZSB2ZXJzYS48L2xpPgogICAgICAqIDxsaT5BbGwgbm9uLTxjb2RlPigwLCAwKTwvY29kZT4gc2l6ZXMgd2lsbCBoYXZlIG5vbi16ZXJvIHdpZHRocyBhbmQgaGVpZ2h0cy48L2xpPgogICAgICAqIDwvdWw+CisgICAgICogPHA+VGhpcyBsaXN0IGlzIGFsc28gdXNlZCBhcyBzdXBwb3J0ZWQgdGh1bWJuYWlsIHNpemVzIGZvciBIRUlDIGltYWdlIGZvcm1hdCBjYXB0dXJlLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUwogICAgICAqLwpAQCAtMjc4Myw3ICsyODAxLDcgQEAKICAgICAgKiAgIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEyIFJBVzEyfS48L2xpPgogICAgICAqIDxsaT5Qcm9jZXNzZWQgKGJ1dCBub3Qtc3RhbGxpbmcpOiBhbnkgbm9uLVJBVyBmb3JtYXQgd2l0aG91dCBhIHN0YWxsIGR1cmF0aW9uLiAgVHlwaWNhbGx5CiAgICAgICogICB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4OCBZVVZfNDIwXzg4OH0sCi0gICAgICogICA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI05WMjEiPk5WMjE8L2E+LCBvciA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI1lWMTIiPllWMTI8L2E+LjwvbGk+CisgICAgICogICA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI05WMjEiPk5WMjE8L2E+LCA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9ncmFwaGljcy9JbWFnZUZvcm1hdC5odG1sI1lWMTIiPllWMTI8L2E+LCBvciB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9ZOCBZOH0gLjwvbGk+CiAgICAgICogPC91bD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUwpAQCAtMzAyOCw2ICszMDQ2LDI4IEBACiAgICAgICovCiAgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9TRVNTSU9OX0tFWVMgPSAgICAgICAgICAgICAgICAgICAgLy8gaW50MzJbbl0KICAgICAgICAgICAgIEFDQU1FUkFfUkVRVUVTVF9TVEFSVCArIDE2LAorICAgIC8qKgorICAgICAqIDxwPkEgc3Vic2V0IG9mIHRoZSBhdmFpbGFibGUgcmVxdWVzdCBrZXlzIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4gZm9yCisgICAgICogcGh5c2ljYWwgZGV2aWNlcyBiYWNraW5nIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50MzJbbl08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyBpcyBhIHN1YnNldCBvZiBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUyB3aGljaCBjb250YWlucyBhIGxpc3QKKyAgICAgKiBvZiBrZXlzIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4gdXNpbmcgPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL0NhcHR1cmVSZXF1ZXN0L0J1aWxkZXIuaHRtbCNzZXRQaHlzaWNhbENhbWVyYUtleSI+QnVpbGRlciNzZXRQaHlzaWNhbENhbWVyYUtleTwvYT4uCisgICAgICogVGhlIHJlc3BlY3RpdmUgdmFsdWUgb2Ygc3VjaCByZXF1ZXN0IGtleSBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZworICAgICAqIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9DYXB0dXJlUmVxdWVzdC9CdWlsZGVyLmh0bWwjZ2V0UGh5c2ljYWxDYW1lcmFLZXkiPkJ1aWxkZXIjZ2V0UGh5c2ljYWxDYW1lcmFLZXk8L2E+LiBDYXB0dXJlIHJlcXVlc3RzIHRoYXQgY29udGFpbgorICAgICAqIGluZGl2aWR1YWwgcGh5c2ljYWwgZGV2aWNlIHJlcXVlc3RzIG11c3QgYmUgYnVpbHQgdmlhCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFEZXZpY2UuaHRtbCNjcmVhdGVDYXB0dXJlUmVxdWVzdChpbnQsIj5TZXQpPC9hPi48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUkVRVUVTVF9LRVlTCisgICAgICovCisgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTID0gICAgLy8gaW50MzJbbl0KKyAgICAgICAgICAgIEFDQU1FUkFfUkVRVUVTVF9TVEFSVCArIDE3LAogICAgIEFDQU1FUkFfUkVRVUVTVF9FTkQsCiAKICAgICAvKioKQEAgLTMxNTcsNiArMzE5NywxMiBAQAogICAgICAqIElNUExFTUVOVEFUSU9OX0RFRklORUQgfCBzYW1lIGFzIFlVVl80MjBfODg4ICAgICAgICAgICAgICAgICAgfCBBbnkgICAgICAgICAgICB8PC9wPgogICAgICAqIDxwPlJlZmVyIHRvIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTIGZvciBhZGRpdGlvbmFsCiAgICAgICogbWFuZGF0b3J5IHN0cmVhbSBjb25maWd1cmF0aW9ucyBvbiBhIHBlci1jYXBhYmlsaXR5IGJhc2lzLjwvcD4KKyAgICAgKiA8cD5FeGNlcHRpb24gb24gMTc2eDE0NCAoUUNJRikgcmVzb2x1dGlvbjogY2FtZXJhIGRldmljZXMgdXN1YWxseSBoYXZlIGEgZml4ZWQgY2FwYWJpbGl0eSBmb3IKKyAgICAgKiBkb3duc2NhbGluZyBmcm9tIGxhcmdlciByZXNvbHV0aW9uIHRvIHNtYWxsZXIsIGFuZCB0aGUgUUNJRiByZXNvbHV0aW9uIHNvbWV0aW1lcyBpcyBub3QKKyAgICAgKiBmdWxseSBzdXBwb3J0ZWQgZHVlIHRvIHRoaXMgbGltaXRhdGlvbiBvbiBkZXZpY2VzIHdpdGggaGlnaC1yZXNvbHV0aW9uIGltYWdlIHNlbnNvcnMuCisgICAgICogVGhlcmVmb3JlLCB0cnlpbmcgdG8gY29uZmlndXJlIGEgUUNJRiByZXNvbHV0aW9uIHN0cmVhbSB0b2dldGhlciB3aXRoIGFueSBvdGhlcgorICAgICAqIHN0cmVhbSBsYXJnZXIgdGhhbiAxOTIweDEwODAgcmVzb2x1dGlvbiAoZWl0aGVyIHdpZHRoIG9yIGhlaWdodCkgbWlnaHQgbm90IGJlIHN1cHBvcnRlZCwKKyAgICAgKiBhbmQgY2FwdHVyZSBzZXNzaW9uIGNyZWF0aW9uIHdpbGwgZmFpbCBpZiBpdCBpcyBub3QuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX0lORk9fU1VQUE9SVEVEX0hBUkRXQVJFX0xFVkVMCiAgICAgICogQHNlZSBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUwpAQCAtMzI1MSw2ICszMjk3LDcgQEAKICAgICAgKiA8bGk+e0BsaW5rIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODggfTwvbGk+CiAgICAgICogPGxpPntAbGluayBBSU1BR0VfRk9STUFUX1JBVzEwIH08L2xpPgogICAgICAqIDxsaT57QGxpbmsgQUlNQUdFX0ZPUk1BVF9SQVcxMiB9PC9saT4KKyAgICAgKiA8bGk+e0BsaW5rIEFJTUFHRV9GT1JNQVRfWTggfTwvbGk+CiAgICAgICogPC91bD4KICAgICAgKiA8cD5BbGwgb3RoZXIgZm9ybWF0cyBtYXkgb3IgbWF5IG5vdCBoYXZlIGFuIGFsbG93ZWQgc3RhbGwgZHVyYXRpb24gb24KICAgICAgKiBhIHBlci1jYXBhYmlsaXR5IGJhc2lzOyByZWZlciB0byBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUwpAQCAtMzI4OCw2ICszMzM1LDgxIEBACiAgICAgICovCiAgICAgQUNBTUVSQV9TQ0FMRVJfQ1JPUFBJTkdfVFlQRSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2Nyb3BwaW5nX3R5cGVfdCkKICAgICAgICAgICAgIEFDQU1FUkFfU0NBTEVSX1NUQVJUICsgMTMsCisgICAgLyoqCisgICAgICogPHA+UmVjb21tZW5kZWQgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIGZvciBjb21tb24gY2xpZW50IHVzZSBjYXNlcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQzMltuKjVdIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfYXZhaWxhYmxlX3JlY29tbWVuZGVkX3N0cmVhbV9jb25maWd1cmF0aW9uc190KTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5PcHRpb25hbCBzdWJzZXQgb2YgdGhlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMgdGhhdCBjb250YWlucworICAgICAqIHNpbWlsYXIgdHVwbGVzIGxpc3RlZCBhcworICAgICAqIChpLmUuIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgb3V0cHV0L2lucHV0IHN0cmVhbSwgdXNlY2FzZSBiaXQgZmllbGQpLgorICAgICAqIENhbWVyYSBkZXZpY2VzIHdpbGwgYmUgYWJsZSB0byBzdWdnZXN0IHBhcnRpY3VsYXIgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdoaWNoIGFyZQorICAgICAqIHBvd2VyIGFuZCBwZXJmb3JtYW5jZSBlZmZpY2llbnQgZm9yIHNwZWNpZmljIHVzZSBjYXNlcy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQKKyAgICAgKiByZXRyaWV2aW5nIHRoZSBzdWdnZXN0aW9ucyBzZWUKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5odG1sI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcCI+Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcDwvYT4uPC9wPgorICAgICAqIDxwPlRoZSBkYXRhIHJlcHJlc2VudGF0aW9uIGlzIGludFs1XSwgd2hpY2ggbWFwcyB0bworICAgICAqICh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIG91dHB1dC9pbnB1dCBzdHJlYW0sIHVzZWNhc2UgYml0IGZpZWxkKS4gVGhlIGFycmF5IGNhbiBiZQorICAgICAqIHBhcnNlZCB1c2luZyB0aGUgZm9sbG93aW5nIHBzZXVkbyBjb2RlOjwvcD4KKyAgICAgKiA8cD5zdHJ1Y3QgU3RyZWFtQ29uZmlndXJhdGlvbiB7CisgICAgICogaW50MzJfdCBmb3JtYXQ7CisgICAgICogaW50MzJfdCB3aWR0aDsKKyAgICAgKiBpbnQzMl90IGhlaWdodDsKKyAgICAgKiBpbnQzMl90IGlzSW5wdXQ7IH07PC9wPgorICAgICAqIDxwPnZvaWQgZ2V0UHJlZmVycmVkU3RyZWFtQ29uZmlndXJhdGlvbnMoCisgICAgICogICAgIGludDMyX3QgKmFycmF5LCBzaXplX3QgY291bnQsIGludDMyX3QgdXNlY2FzZUlkLAorICAgICAqICAgICBWZWN0b3IgJmx0OyBTdHJlYW1Db25maWd1cmF0aW9uICZndDsgKiBzY3MpIHsKKyAgICAgKiAgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUgPSA1OworICAgICAqICAgICBjb25zdCBzaXplX3QgU1RSRUFNX1dJRFRIX09GRlNFVCA9IDA7CisgICAgICogICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fSEVJR0hUX09GRlNFVCA9IDE7CisgICAgICogICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fRk9STUFUX09GRlNFVCA9IDI7CisgICAgICogICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUID0gMzsKKyAgICAgKiAgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9VU0VDQVNFX0JJVE1BUF9PRkZTRVQgPSA0OzwvcD4KKyAgICAgKiA8cHJlPjxjb2RlPmZvciAoc2l6ZV90IGkgPSAwOyBpICZsdDsgY291bnQ7IGkrPSBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFKSB7CisgICAgICogICAgIGludDMyX3Qgd2lkdGggPSBhcnJheVtpICsgU1RSRUFNX1dJRFRIX09GRlNFVF07CisgICAgICogICAgIGludDMyX3QgaGVpZ2h0ID0gYXJyYXlbaSArIFNUUkVBTV9IRUlHSFRfT0ZGU0VUXTsKKyAgICAgKiAgICAgaW50MzJfdCBmb3JtYXQgPSBhcnJheVtpICsgU1RSRUFNX0ZPUk1BVF9PRkZTRVRdOworICAgICAqICAgICBpbnQzMl90IGlzSW5wdXQgPSBhcnJheVtpICsgU1RSRUFNX0lTX0lOUFVUX09GRlNFVF07CisgICAgICogICAgIGludDMyX3Qgc3VwcG9ydGVkVXNlY2FzZXMgPSBhcnJheVtpICsgU1RSRUFNX1VTRUNBU0VfQklUTUFQX09GRlNFVF07CisgICAgICogICAgIGlmIChzdXBwb3J0ZWRVc2VjYXNlcyAmYW1wOyAoMSAmbHQ7Jmx0OyB1c2VjYXNlSWQpKSB7CisgICAgICogICAgICAgICBTdHJlYW1Db25maWd1cmF0aW9uIHNjID0ge2Zvcm1hdCwgd2lkdGgsIGhlaWdodCwgaXNJbnB1dH07CisgICAgICogICAgICAgICBzY3MtJmd0O2FkZChzYyk7CisgICAgICogICAgIH0KKyAgICAgKiB9CisgICAgICogPC9jb2RlPjwvcHJlPgorICAgICAqIDxwPn08L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TID0gCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50MzJbbio1XSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2F2YWlsYWJsZV9yZWNvbW1lbmRlZF9zdHJlYW1fY29uZmlndXJhdGlvbnNfdCkKKyAgICAgICAgICAgIEFDQU1FUkFfU0NBTEVSX1NUQVJUICsgMTQsCisgICAgLyoqCisgICAgICogPHA+UmVjb21tZW5kZWQgbWFwcGluZ3Mgb2YgaW1hZ2UgZm9ybWF0cyB0aGF0IGFyZSBzdXBwb3J0ZWQgYnkgdGhpcworICAgICAqIGNhbWVyYSBkZXZpY2UgZm9yIGlucHV0IHN0cmVhbXMsIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgb3V0cHV0IGZvcm1hdHMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50MzI8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyBpcyBhIHJlY29tbWVuZGVkIHN1YnNldCBvZiB0aGUgY29tcGxldGUgbGlzdCBvZiBtYXBwaW5ncyBmb3VuZCBpbgorICAgICAqIGFuZHJvaWQuc2NhbGVyLmF2YWlsYWJsZUlucHV0T3V0cHV0Rm9ybWF0c01hcC4gVGhlIHNhbWUgcmVxdWlyZW1lbnRzIGFwcGx5IGhlcmUgYXMgd2VsbC4KKyAgICAgKiBUaGUgbGlzdCBob3dldmVyIGRvZXNuJ3QgbmVlZCB0byBjb250YWluIGFsbCBhdmFpbGFibGUgYW5kIHN1cHBvcnRlZCBtYXBwaW5ncy4gSW5zdGVhZCBvZgorICAgICAqIHRoaXMgZGV2ZWxvcGVycyBtdXN0IGxpc3Qgb25seSByZWNvbW1lbmRlZCBhbmQgZWZmaWNpZW50IGVudHJpZXMuCisgICAgICogSWYgc2V0LCB0aGUgaW5mb3JtYXRpb24gd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIFpFUk9fU0hVVFRFUl9MQUcgcmVjb21tZW5kZWQgc3RyZWFtCisgICAgICogY29uZmlndXJhdGlvbiBzZWUKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYUNoYXJhY3RlcmlzdGljcy5odG1sI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcCI+Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzI2dldFJlY29tbWVuZGVkU3RyZWFtQ29uZmlndXJhdGlvbk1hcDwvYT4uPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9JTlBVVF9PVVRQVVRfRk9STUFUU19NQVAgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMgorICAgICAgICAgICAgQUNBTUVSQV9TQ0FMRVJfU1RBUlQgKyAxNSwKICAgICBBQ0FNRVJBX1NDQUxFUl9FTkQsCiAKICAgICAvKioKQEAgLTM0NDgsNiArMzU3MCw4IEBACiAgICAgICogPHA+U29tZSBkZXZpY2VzIG1heSBjaG9vc2UgdG8gcHJvdmlkZSBhIHNlY29uZCBzZXQgb2YgY2FsaWJyYXRpb24KICAgICAgKiBpbmZvcm1hdGlvbiBmb3IgaW1wcm92ZWQgcXVhbGl0eSwgaW5jbHVkaW5nCiAgICAgICogQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyIGFuZCBpdHMgY29ycmVzcG9uZGluZyBtYXRyaWNlcy48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgZm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGV2ZW4gaWYKKyAgICAgKiB0aGUgY2FtZXJhIGRldmljZSBoYXMgUkFXIGNhcGFiaWxpdHkuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0xCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0xCkBAIC0zNDc3LDYgKzM2MDEsOCBAQAogICAgICAqIDxwPklmIHRoaXMga2V5IGlzIHByZXNlbnQsIHRoZW4gQUNBTUVSQV9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMiwKICAgICAgKiBBQ0FNRVJBX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0yLCBhbmQKICAgICAgKiBBQ0FNRVJBX1NFTlNPUl9GT1JXQVJEX01BVFJJWDIgd2lsbCBhbHNvIGJlIHByZXNlbnQuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQ0FMSUJSQVRJT05fVFJBTlNGT1JNMgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMgpAQCAtMzUwNCw2ICszNjMwLDggQEAKICAgICAgKiBjb2xvcnNwYWNlKSBpbnRvIHRoaXMgY2FtZXJhIGRldmljZSdzIG5hdGl2ZSBzZW5zb3IgY29sb3IKICAgICAgKiBzcGFjZSB1bmRlciB0aGUgZmlyc3QgcmVmZXJlbmNlIGlsbHVtaW5hbnQKICAgICAgKiAoQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxKS48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBbmRyb2lkIFEsIHRoaXMga2V5IHdpbGwgbm90IGJlIHByZXNlbnQgZm9yIGEgTU9OT0NIUk9NRSBjYW1lcmEsIGV2ZW4gaWYKKyAgICAgKiB0aGUgY2FtZXJhIGRldmljZSBoYXMgUkFXIGNhcGFiaWxpdHkuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDEKICAgICAgKi8KQEAgLTM1MzEsNiArMzY1OSw4IEBACiAgICAgICogKEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMikuPC9wPgogICAgICAqIDxwPlRoaXMgbWF0cml4IHdpbGwgb25seSBiZSBwcmVzZW50IGlmIHRoZSBzZWNvbmQgcmVmZXJlbmNlCiAgICAgICogaWxsdW1pbmFudCBpcyBwcmVzZW50LjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMgogICAgICAqLwpAQCAtMzU1OSw2ICszNjg5LDggQEAKICAgICAgKiBhbmQgdGhlIENJRSBYWVogY29sb3JzcGFjZSB3aGVuIGNhbGN1bGF0aW5nIHRoaXMgdHJhbnNmb3JtIHdpbGwKICAgICAgKiBtYXRjaCB0aGUgc3RhbmRhcmQgd2hpdGUgcG9pbnQgZm9yIHRoZSBmaXJzdCByZWZlcmVuY2UgaWxsdW1pbmFudAogICAgICAqIChpLmUuIG5vIGNocm9tYXRpYyBhZGFwdGF0aW9uIHdpbGwgYmUgYXBwbGllZCBieSB0aGlzIHRyYW5zZm9ybSkuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxCiAgICAgICovCkBAIC0zNTg5LDYgKzM3MjEsOCBAQAogICAgICAqIChpLmUuIG5vIGNocm9tYXRpYyBhZGFwdGF0aW9uIHdpbGwgYmUgYXBwbGllZCBieSB0aGlzIHRyYW5zZm9ybSkuPC9wPgogICAgICAqIDxwPlRoaXMgbWF0cml4IHdpbGwgb25seSBiZSBwcmVzZW50IGlmIHRoZSBzZWNvbmQgcmVmZXJlbmNlCiAgICAgICogaWxsdW1pbmFudCBpcyBwcmVzZW50LjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMgogICAgICAqLwpAQCAtMzYxNSw2ICszNzQ5LDggQEAKICAgICAgKiB0aGlzIG1hdHJpeCBpcyBjaG9zZW4gc28gdGhhdCB0aGUgc3RhbmRhcmQgd2hpdGUgcG9pbnQgZm9yIHRoaXMgcmVmZXJlbmNlCiAgICAgICogaWxsdW1pbmFudCBpbiB0aGUgcmVmZXJlbmNlIHNlbnNvciBjb2xvcnNwYWNlIGlzIG1hcHBlZCB0byBENTAgaW4gdGhlCiAgICAgICogQ0lFIFhZWiBjb2xvcnNwYWNlLjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMQogICAgICAqLwpAQCAtMzY0Myw2ICszNzc5LDggQEAKICAgICAgKiBDSUUgWFlaIGNvbG9yc3BhY2UuPC9wPgogICAgICAqIDxwPlRoaXMgbWF0cml4IHdpbGwgb25seSBiZSBwcmVzZW50IGlmIHRoZSBzZWNvbmQgcmVmZXJlbmNlCiAgICAgICogaWxsdW1pbmFudCBpcyBwcmVzZW50LjwvcD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMgogICAgICAqLwpAQCAtMzY3NSw2ICszODEzLDcgQEAKICAgICAgKiBsZXZlbCB2YWx1ZXMuIEZvciByYXcgY2FwdHVyZSBpbiBwYXJ0aWN1bGFyLCBpdCBpcyByZWNvbW1lbmRlZCB0byB1c2UKICAgICAgKiBwaXhlbHMgZnJvbSBBQ0FNRVJBX1NFTlNPUl9PUFRJQ0FMX0JMQUNLX1JFR0lPTlMgdG8gY2FsY3VsYXRlIGJsYWNrCiAgICAgICogbGV2ZWwgdmFsdWVzIGZvciBlYWNoIGZyYW1lLjwvcD4KKyAgICAgKiA8cD5Gb3IgYSBNT05PQ0hST01FIGNhbWVyYSBkZXZpY2UsIGFsbCBvZiB0aGUgMngyIGNoYW5uZWxzIG11c3QgaGF2ZSB0aGUgc2FtZSB2YWx1ZXMuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9EWU5BTUlDX0JMQUNLX0xFVkVMCiAgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVApAQCAtMzc2OSw2ICszOTA4LDggQEAKICAgICAgKiB1c2VkIHRvIGludGVycG9sYXRlIGJldHdlZW4gdGhlIHByb3ZpZGVkIGNvbG9yIHRyYW5zZm9ybXMgd2hlbgogICAgICAqIHByb2Nlc3NpbmcgcmF3IHNlbnNvciBkYXRhLjwvcD4KICAgICAgKiA8cD5UaGUgb3JkZXIgb2YgdGhlIHZhbHVlcyBpcyBSLCBHLCBCOyB3aGVyZSBSIGlzIGluIHRoZSBsb3dlc3QgaW5kZXguPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGlzIGtleSB3aWxsIG5vdCBiZSBwcmVzZW50IGZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBldmVuIGlmCisgICAgICogdGhlIGNhbWVyYSBkZXZpY2UgaGFzIFJBVyBjYXBhYmlsaXR5LjwvcD4KICAgICAgKi8KICAgICBBQ0FNRVJBX1NFTlNPUl9ORVVUUkFMX0NPTE9SX1BPSU5UID0gICAgICAgICAgICAgICAgICAgICAgICAvLyByYXRpb25hbFszXQogICAgICAgICAgICAgQUNBTUVSQV9TRU5TT1JfU1RBUlQgKyAxOCwKQEAgLTM3OTksNiArMzk0MCw4IEBACiAgICAgICogdGhhdCBjaGFubmVsLjwvcD4KICAgICAgKiA8cD5BIG1vcmUgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIG5vaXNlIG1vZGVsIGNhbiBiZSBmb3VuZCBpbiB0aGUKICAgICAgKiBBZG9iZSBETkcgc3BlY2lmaWNhdGlvbiBmb3IgdGhlIE5vaXNlUHJvZmlsZSB0YWcuPC9wPgorICAgICAqIDxwPkZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCB0aGVyZSBpcyBvbmx5IG9uZSBjb2xvciBjaGFubmVsLiBTbyB0aGUgbm9pc2UgbW9kZWwgY29lZmZpY2llbnRzCisgICAgICogd2lsbCBvbmx5IGNvbnRhaW4gb25lIFMgYW5kIG9uZSBPLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlQKICAgICAgKi8KQEAgLTM4NDQsNiArMzk4Nyw4IEBACiAgICAgICogPGxpPlIgJmd0OyAxLjIwIHdpbGwgcmVxdWlyZSBzdHJvbmcgc29mdHdhcmUgY29ycmVjdGlvbiB0byBwcm9kdWNlCiAgICAgICogYSB1c3VhYmxlIGltYWdlICgmZ3Q7MjAlIGRpdmVyZ2VuY2UpLjwvbGk+CiAgICAgICogPC91bD4KKyAgICAgKiA8cD5TdGFydGluZyBmcm9tIEFuZHJvaWQgUSwgdGhpcyBrZXkgd2lsbCBub3QgYmUgcHJlc2VudCBmb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgZXZlbiBpZgorICAgICAqIHRoZSBjYW1lcmEgZGV2aWNlIGhhcyBSQVcgY2FwYWJpbGl0eS48L3A+CiAgICAgICovCiAgICAgQUNBTUVSQV9TRU5TT1JfR1JFRU5fU1BMSVQgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXQKICAgICAgICAgICAgIEFDQU1FUkFfU0VOU09SX1NUQVJUICsgMjIsCkBAIC0zOTk2LDYgKzQxNDEsNyBAQAogICAgICAqIGxheW91dCBrZXkgKHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVCksIGkuZS4gdGhlCiAgICAgICogbnRoIHZhbHVlIGdpdmVuIGNvcnJlc3BvbmRzIHRvIHRoZSBibGFjayBsZXZlbCBvZmZzZXQgZm9yIHRoZSBudGgKICAgICAgKiBjb2xvciBjaGFubmVsIGxpc3RlZCBpbiB0aGUgQ0ZBLjwvcD4KKyAgICAgKiA8cD5Gb3IgYSBNT05PQ0hST01FIGNhbWVyYSwgYWxsIG9mIHRoZSAyeDIgY2hhbm5lbHMgbXVzdCBoYXZlIHRoZSBzYW1lIHZhbHVlcy48L3A+CiAgICAgICogPHA+VGhpcyBrZXkgd2lsbCBiZSBhdmFpbGFibGUgaWYgQUNBTUVSQV9TRU5TT1JfT1BUSUNBTF9CTEFDS19SRUdJT05TIGlzIGF2YWlsYWJsZSBvciB0aGUKICAgICAgKiBjYW1lcmEgZGV2aWNlIGFkdmVydGlzZXMgdGhpcyBrZXkgdmlhIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1JFU1VMVF9LRVlTIH0uPC9wPgogICAgICAqCkBAIC00MDk4LDcgKzQyNDQsOCBAQAogICAgIC8qKgogICAgICAqIDxwPlRoZSBhcnJhbmdlbWVudCBvZiBjb2xvciBmaWx0ZXJzIG9uIHNlbnNvcjsKICAgICAgKiByZXByZXNlbnRzIHRoZSBjb2xvcnMgaW4gdGhlIHRvcC1sZWZ0IDJ4MiBzZWN0aW9uIG9mCi0gICAgICogdGhlIHNlbnNvciwgaW4gcmVhZGluZyBvcmRlci48L3A+CisgICAgICogdGhlIHNlbnNvciwgaW4gcmVhZGluZyBvcmRlciwgZm9yIGEgQmF5ZXIgY2FtZXJhLCBvciB0aGUKKyAgICAgKiBsaWdodCBzcGVjdHJ1bSBpdCBjYXB0dXJlcyBmb3IgTU9OT0NIUk9NRSBjYW1lcmEuPC9wPgogICAgICAqCiAgICAgICogPHA+VHlwZTogYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2Vuc29yX2luZm9fY29sb3JfZmlsdGVyX2FycmFuZ2VtZW50X3QpPC9wPgogICAgICAqCkBAIC00NTY3LDEzICs0NzE0LDEzIEBACiAgICAgICogKHgseSkgz7UgKDAgLi4uIE4tMSwgMCAuLi4gTS0xKSBpcyB0aGUgdmFsdWUgb2YgdGhlIHNoYWRpbmcgbWFwIGF0CiAgICAgICogcGl4ZWwgKCAoKFctMSkvKE4tMSkpICogeCwgKChILTEpLyhNLTEpKSAqIHkpIGZvciB0aGUgZm91ciBjb2xvciBjaGFubmVscy4KICAgICAgKiBUaGUgbWFwIGlzIGFzc3VtZWQgdG8gYmUgYmlsaW5lYXJseSBpbnRlcnBvbGF0ZWQgYmV0d2VlbiB0aGUgc2FtcGxlIHBvaW50cy48L3A+Ci0gICAgICogPHA+VGhlIGNoYW5uZWwgb3JkZXIgaXMgW1IsIEdldmVuLCBHb2RkLCBCXSwgd2hlcmUgR2V2ZW4gaXMgdGhlIGdyZWVuCi0gICAgICogY2hhbm5lbCBmb3IgdGhlIGV2ZW4gcm93cyBvZiBhIEJheWVyIHBhdHRlcm4sIGFuZCBHb2RkIGlzIHRoZSBvZGQgcm93cy4KKyAgICAgKiA8cD5Gb3IgYSBCYXllciBjYW1lcmEsIHRoZSBjaGFubmVsIG9yZGVyIGlzIFtSLCBHZXZlbiwgR29kZCwgQl0sIHdoZXJlIEdldmVuIGlzCisgICAgICogdGhlIGdyZWVuIGNoYW5uZWwgZm9yIHRoZSBldmVuIHJvd3Mgb2YgYSBCYXllciBwYXR0ZXJuLCBhbmQgR29kZCBpcyB0aGUgb2RkIHJvd3MuCiAgICAgICogVGhlIHNoYWRpbmcgbWFwIGlzIHN0b3JlZCBpbiBhIGZ1bGx5IGludGVybGVhdmVkIGZvcm1hdCwgYW5kIGl0cyBzaXplCiAgICAgICogaXMgcHJvdmlkZWQgaW4gdGhlIGNhbWVyYSBzdGF0aWMgbWV0YWRhdGEgYnkgQUNBTUVSQV9MRU5TX0lORk9fU0hBRElOR19NQVBfU0laRS48L3A+CiAgICAgICogPHA+VGhlIHNoYWRpbmcgbWFwIHdpbGwgZ2VuZXJhbGx5IGhhdmUgb24gdGhlIG9yZGVyIG9mIDMwLTQwIHJvd3MgYW5kIGNvbHVtbnMsCiAgICAgICogYW5kIHdpbGwgYmUgc21hbGxlciB0aGFuIDY0eDY0LjwvcD4KLSAgICAgKiA8cD5BcyBhbiBleGFtcGxlLCBnaXZlbiBhIHZlcnkgc21hbGwgbWFwIGRlZmluZWQgYXM6PC9wPgorICAgICAqIDxwPkFzIGFuIGV4YW1wbGUsIGdpdmVuIGEgdmVyeSBzbWFsbCBtYXAgZm9yIGEgQmF5ZXIgY2FtZXJhIGRlZmluZWQgYXM6PC9wPgogICAgICAqIDxwcmU+PGNvZGU+QUNBTUVSQV9MRU5TX0lORk9fU0hBRElOR19NQVBfU0laRSA9IFsgNCwgMyBdCiAgICAgICogQUNBTUVSQV9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVAgPQogICAgICAqIFsgMS4zLCAxLjIsIDEuMTUsIDEuMiwgIDEuMiwgMS4yLCAxLjE1LCAxLjIsCkBAIC00NTkzLDYgKzQ3NDAsMTcgQEAKICAgICAgKiBpbWFnZSBvZiBhIGdyYXkgd2FsbCAodXNpbmcgYmljdWJpYyBpbnRlcnBvbGF0aW9uIGZvciB2aXN1YWwgcXVhbGl0eSkKICAgICAgKiBhcyBjYXB0dXJlZCBieSB0aGUgc2Vuc29yIGdpdmVzOjwvcD4KICAgICAgKiA8cD48aW1nIGFsdD0iSW1hZ2Ugb2YgYSB1bmlmb3JtIHdoaXRlIHdhbGwgKGludmVyc2Ugc2hhZGluZyBtYXApIiBzcmM9Ii4uL2ltYWdlcy9jYW1lcmEyL21ldGFkYXRhL2FuZHJvaWQuc3RhdGlzdGljcy5sZW5zU2hhZGluZ01hcC9pbnZfc2hhZGluZy5wbmciIC8+PC9wPgorICAgICAqIDxwPkZvciBhIE1PTk9DSFJPTUUgY2FtZXJhLCBhbGwgb2YgdGhlIDJ4MiBjaGFubmVscyBtdXN0IGhhdmUgdGhlIHNhbWUgdmFsdWVzLiBBbiBleGFtcGxlCisgICAgICogc2hhZGluZyBtYXAgZm9yIHN1Y2ggYSBjYW1lcmEgaXMgZGVmaW5lZCBhczo8L3A+CisgICAgICogPHByZT48Y29kZT5BQ0FNRVJBX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFID0gWyA0LCAzIF0KKyAgICAgKiBBQ0FNRVJBX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUCA9CisgICAgICogWyAxLjMsIDEuMywgMS4zLCAxLjMsICAxLjIsIDEuMiwgMS4yLCAxLjIsCisgICAgICogICAgIDEuMSwgMS4xLCAxLjEsIDEuMSwgIDEuMywgMS4zLCAxLjMsIDEuMywKKyAgICAgKiAgIDEuMiwgMS4yLCAxLjIsIDEuMiwgIDEuMSwgMS4xLCAxLjEsIDEuMSwKKyAgICAgKiAgICAgMS4wLCAxLjAsIDEuMCwgMS4wLCAgMS4yLCAxLjIsIDEuMiwgMS4yLAorICAgICAqICAgMS4zLCAxLjMsIDEuMywgMS4zLCAgIDEuMiwgMS4yLCAxLjIsIDEuMiwKKyAgICAgKiAgICAgMS4yLCAxLjIsIDEuMiwgMS4yLCAgMS4zLCAxLjMsIDEuMywgMS4zIF0KKyAgICAgKiA8L2NvZGU+PC9wcmU+CiAgICAgICogPHA+Tm90ZSB0aGF0IHRoZSBSQVcgaW1hZ2UgZGF0YSBtaWdodCBiZSBzdWJqZWN0IHRvIGxlbnMgc2hhZGluZwogICAgICAqIGNvcnJlY3Rpb24gbm90IHJlcG9ydGVkIG9uIHRoaXMgbWFwLiBRdWVyeQogICAgICAqIEFDQU1FUkFfU0VOU09SX0lORk9fTEVOU19TSEFESU5HX0FQUExJRUQgdG8gc2VlIGlmIFJBVyBpbWFnZSBkYXRhIGhhcyBzdWJqZWN0CkBAIC00OTM2LDggKzUwOTQsOCBAQAogICAgICAqIG9mIHBvaW50cyBjYW4gYmUgbGVzcyB0aGFuIG1heCAodGhhdCBpcywgdGhlIHJlcXVlc3QgZG9lc24ndCBoYXZlIHRvCiAgICAgICogYWx3YXlzIHByb3ZpZGUgYSBjdXJ2ZSB3aXRoIG51bWJlciBvZiBwb2ludHMgZXF1aXZhbGVudCB0bwogICAgICAqIEFDQU1FUkFfVE9ORU1BUF9NQVhfQ1VSVkVfUE9JTlRTKS48L3A+Ci0gICAgICogPHA+Rm9yIGRldmljZXMgd2l0aCBNT05PQ0hST01FIGNhcGFiaWxpdHksIG9ubHkgcmVkIGNoYW5uZWwgaXMgdXNlZC4gR3JlZW4gYW5kIGJsdWUgY2hhbm5lbHMKLSAgICAgKiBhcmUgaWdub3JlZC48L3A+CisgICAgICogPHA+Rm9yIGRldmljZXMgd2l0aCBNT05PQ0hST01FIGNhcGFiaWxpdHksIGFsbCB0aHJlZSBjaGFubmVscyBtdXN0IGhhdmUgdGhlIHNhbWUgc2V0IG9mCisgICAgICogY29udHJvbCBwb2ludHMuPC9wPgogICAgICAqIDxwPkEgZmV3IGV4YW1wbGVzLCBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyBncmFwaGljYWwgbWFwcGluZ3M7IHRoZXNlCiAgICAgICogb25seSBzcGVjaWZ5IHRoZSByZWQgY2hhbm5lbCBhbmQgdGhlIHByZWNpc2lvbiBpcyBsaW1pdGVkIHRvIDQKICAgICAgKiBkaWdpdHMsIGZvciBjb25jaXNlbmVzcy48L3A+CkBAIC01MTU0LDcgKzUzMTIsNyBAQAogICAgICAqIDxsaT48Y29kZT5MRVZFTF8zPC9jb2RlPiBkZXZpY2VzIGFkZGl0aW9uYWxseSBzdXBwb3J0IFlVViByZXByb2Nlc3NpbmcgYW5kIFJBVyBpbWFnZSBjYXB0dXJlLCBhbG9uZwogICAgICAqICAgd2l0aCBhZGRpdGlvbmFsIG91dHB1dCBzdHJlYW0gY29uZmlndXJhdGlvbnMuPC9saT4KICAgICAgKiA8bGk+PGNvZGU+RVhURVJOQUw8L2NvZGU+IGRldmljZXMgYXJlIHNpbWlsYXIgdG8gPGNvZGU+TElNSVRFRDwvY29kZT4gZGV2aWNlcyB3aXRoIGV4Y2VwdGlvbnMgbGlrZSBzb21lIHNlbnNvciBvcgotICAgICAqICAgbGVucyBpbmZvcm1hdGlvbiBub3QgcmVvcnRlZCBvciBsZXNzIHN0YWJsZSBmcmFtZXJhdGVzLjwvbGk+CisgICAgICogICBsZW5zIGluZm9ybWF0aW9uIG5vdCByZXBvcnRlZCBvciBsZXNzIHN0YWJsZSBmcmFtZXJhdGVzLjwvbGk+CiAgICAgICogPC91bD4KICAgICAgKiA8cD5TZWUgdGhlIGluZGl2aWR1YWwgbGV2ZWwgZW51bXMgZm9yIGZ1bGwgZGVzY3JpcHRpb25zIG9mIHRoZSBzdXBwb3J0ZWQgY2FwYWJpbGl0aWVzLiAgVGhlCiAgICAgICogQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMgZW50cnkgZGVzY3JpYmVzIHRoZSBkZXZpY2UncyBjYXBhYmlsaXRpZXMgYXQgYQpAQCAtNTQxMSw5ICs1NTY5LDEyMSBAQAogICAgICAqLwogICAgIEFDQU1FUkFfREVQVEhfREVQVEhfSVNfRVhDTFVTSVZFID0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2RlcHRoX2RlcHRoX2lzX2V4Y2x1c2l2ZV90KQogICAgICAgICAgICAgQUNBTUVSQV9ERVBUSF9TVEFSVCArIDQsCisgICAgLyoqCisgICAgICogPHA+UmVjb21tZW5kZWQgZGVwdGggc3RyZWFtIGNvbmZpZ3VyYXRpb25zIGZvciBjb21tb24gY2xpZW50IHVzZSBjYXNlcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQzMltuKjVdPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPk9wdGlvbmFsIHN1YnNldCBvZiB0aGUgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TIHRoYXQKKyAgICAgKiBjb250YWlucyBzaW1pbGFyIHR1cGxlcyBsaXN0ZWQgYXMKKyAgICAgKiAoaS5lLiB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIG91dHB1dC9pbnB1dCBzdHJlYW0sIHVzZWNhc2UgYml0IGZpZWxkKS4KKyAgICAgKiBDYW1lcmEgZGV2aWNlcyB3aWxsIGJlIGFibGUgdG8gc3VnZ2VzdCBwYXJ0aWN1bGFyIGRlcHRoIHN0cmVhbSBjb25maWd1cmF0aW9ucyB3aGljaCBhcmUKKyAgICAgKiBwb3dlciBhbmQgcGVyZm9ybWFuY2UgZWZmaWNpZW50IGZvciBzcGVjaWZpYyB1c2UgY2FzZXMuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0CisgICAgICogcmV0cmlldmluZyB0aGUgc3VnZ2VzdGlvbnMgc2VlCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuaHRtbCNnZXRSZWNvbW1lbmRlZFN0cmVhbUNvbmZpZ3VyYXRpb25NYXAiPkNhbWVyYUNoYXJhY3RlcmlzdGljcyNnZXRSZWNvbW1lbmRlZFN0cmVhbUNvbmZpZ3VyYXRpb25NYXA8L2E+LjwvcD4KKyAgICAgKiA8cD5Gb3IgZGF0YSByZXByZXNlbnRhdGlvbiBwbGVhc2UgcmVmZXIgdG8KKyAgICAgKiBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlMKKyAgICAgKi8KKyAgICBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMgPSAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnQzMltuKjVdCisgICAgICAgICAgICBBQ0FNRVJBX0RFUFRIX1NUQVJUICsgNSwKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgYXZhaWxhYmxlIGR5bmFtaWMgZGVwdGggZGF0YXNwYWNlIHN0cmVhbQorICAgICAqIGNvbmZpZ3VyYXRpb25zIHRoYXQgdGhpcyBjYW1lcmEgZGV2aWNlIHN1cHBvcnRzCisgICAgICogKGkuZS4gZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBvdXRwdXQvaW5wdXQgc3RyZWFtKS48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQzMltuKjRdIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9kZXB0aF9hdmFpbGFibGVfZHluYW1pY19kZXB0aF9zdHJlYW1fY29uZmlndXJhdGlvbnNfdCk8L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhlc2UgYXJlIG91dHB1dCBzdHJlYW0gY29uZmlndXJhdGlvbnMgZm9yIHVzZSB3aXRoCisgICAgICogZGF0YVNwYWNlIERZTkFNSUNfREVQVEguIFRoZSBjb25maWd1cmF0aW9ucyBhcmUKKyAgICAgKiBsaXN0ZWQgYXMgPGNvZGU+KGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgaW5wdXQ/KTwvY29kZT4gdHVwbGVzLjwvcD4KKyAgICAgKiA8cD5Pbmx5IGRldmljZXMgdGhhdCBzdXBwb3J0IGRlcHRoIG91dHB1dCBmb3IgYXQgbGVhc3QKKyAgICAgKiB0aGUgSEFMX1BJWEVMX0ZPUk1BVF9ZMTYgZGVuc2UgZGVwdGggbWFwIGFsb25nIHdpdGgKKyAgICAgKiBIQUxfUElYRUxfRk9STUFUX0JMT0Igd2l0aCB0aGUgc2FtZSBzaXplIG9yIHNpemUgd2l0aAorICAgICAqIHRoZSBzYW1lIGFzcGVjdCByYXRpbyBjYW4gaGF2ZSBkeW5hbWljIGRlcHRoIGRhdGFzcGFjZQorICAgICAqIHN0cmVhbSBjb25maWd1cmF0aW9uLiBBQ0FNRVJBX0RFUFRIX0RFUFRIX0lTX0VYQ0xVU0lWRSBhbHNvCisgICAgICogbmVlZHMgdG8gYmUgc2V0IHRvIEZBTFNFLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9ERVBUSF9ERVBUSF9JU19FWENMVVNJVkUKKyAgICAgKi8KKyAgICBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUyA9IAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludDMyW24qNF0gKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2RlcHRoX2F2YWlsYWJsZV9keW5hbWljX2RlcHRoX3N0cmVhbV9jb25maWd1cmF0aW9uc190KQorICAgICAgICAgICAgQUNBTUVSQV9ERVBUSF9TVEFSVCArIDYsCisgICAgLyoqCisgICAgICogPHA+VGhpcyBsaXN0cyB0aGUgbWluaW11bSBmcmFtZSBkdXJhdGlvbiBmb3IgZWFjaAorICAgICAqIGZvcm1hdC9zaXplIGNvbWJpbmF0aW9uIGZvciBkeW5hbWljIGRlcHRoIG91dHB1dCBzdHJlYW1zLjwvcD4KKyAgICAgKgorICAgICAqIDxwPlR5cGU6IGludDY0WzQqbl08L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHRhZyBtYXkgYXBwZWFyIGluOgorICAgICAqIDx1bD4KKyAgICAgKiAgIDxsaT5BQ2FtZXJhTWV0YWRhdGEgZnJvbSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3M8L2xpPgorICAgICAqIDwvdWw+PC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyBzaG91bGQgY29ycmVzcG9uZCB0byB0aGUgZnJhbWUgZHVyYXRpb24gd2hlbiBvbmx5IHRoYXQKKyAgICAgKiBzdHJlYW0gaXMgYWN0aXZlLCB3aXRoIGFsbCBwcm9jZXNzaW5nICh0eXBpY2FsbHkgaW4gYW5kcm9pZC4qLm1vZGUpCisgICAgICogc2V0IHRvIGVpdGhlciBPRkYgb3IgRkFTVC48L3A+CisgICAgICogPHA+V2hlbiBtdWx0aXBsZSBzdHJlYW1zIGFyZSB1c2VkIGluIGEgcmVxdWVzdCwgdGhlIG1pbmltdW0gZnJhbWUKKyAgICAgKiBkdXJhdGlvbiB3aWxsIGJlIG1heChpbmRpdmlkdWFsIHN0cmVhbSBtaW4gZHVyYXRpb25zKS48L3A+CisgICAgICogPHA+VGhlIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gb2YgYSBzdHJlYW0gKG9mIGEgcGFydGljdWxhciBmb3JtYXQsIHNpemUpCisgICAgICogaXMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSBzdHJlYW0gaXMgaW5wdXQgb3Igb3V0cHV0LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX01JTl9GUkFNRV9EVVJBVElPTlMgPSAvLyBpbnQ2NFs0Km5dCisgICAgICAgICAgICBBQ0FNRVJBX0RFUFRIX1NUQVJUICsgNywKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGxpc3RzIHRoZSBtYXhpbXVtIHN0YWxsIGR1cmF0aW9uIGZvciBlYWNoCisgICAgICogb3V0cHV0IGZvcm1hdC9zaXplIGNvbWJpbmF0aW9uIGZvciBkeW5hbWljIGRlcHRoIHN0cmVhbXMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50NjRbNCpuXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5BIHN0YWxsIGR1cmF0aW9uIGlzIGhvdyBtdWNoIGV4dHJhIHRpbWUgd291bGQgZ2V0IGFkZGVkCisgICAgICogdG8gdGhlIG5vcm1hbCBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIGZvciBhIHJlcGVhdGluZyByZXF1ZXN0CisgICAgICogdGhhdCBoYXMgc3RyZWFtcyB3aXRoIG5vbi16ZXJvIHN0YWxsLjwvcD4KKyAgICAgKiA8cD5BbGwgZHluYW1pYyBkZXB0aCBvdXRwdXQgc3RyZWFtcyBtYXkgaGF2ZSBhIG5vbnplcm8gc3RhbGwKKyAgICAgKiBkdXJhdGlvbi48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVEFMTF9EVVJBVElPTlMgPSAgICAgLy8gaW50NjRbNCpuXQorICAgICAgICAgICAgQUNBTUVSQV9ERVBUSF9TVEFSVCArIDgsCiAgICAgQUNBTUVSQV9ERVBUSF9FTkQsCiAKICAgICAvKioKKyAgICAgKiA8cD5TdHJpbmcgY29udGFpbmluZyB0aGUgaWRzIG9mIHRoZSB1bmRlcmx5aW5nIHBoeXNpY2FsIGNhbWVyYXMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogYnl0ZVtuXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5Gb3IgYSBsb2dpY2FsIGNhbWVyYSwgdGhpcyBpcyBjb25jYXRlbmF0aW9uIG9mIGFsbCB1bmRlcmx5aW5nIHBoeXNpY2FsIGNhbWVyYSBJRHMuCisgICAgICogVGhlIG51bGwgdGVybWluYXRvciBmb3IgcGh5c2ljYWwgY2FtZXJhIElEIG11c3QgYmUgcHJlc2VydmVkIHNvIHRoYXQgdGhlIHdob2xlIHN0cmluZworICAgICAqIGNhbiBiZSB0b2tlbml6ZWQgdXNpbmcgJ1wwJyB0byBnZW5lcmF0ZSBsaXN0IG9mIHBoeXNpY2FsIGNhbWVyYSBJRHMuPC9wPgorICAgICAqIDxwPkZvciBleGFtcGxlLCBpZiB0aGUgcGh5c2ljYWwgY2FtZXJhIElEcyBvZiB0aGUgbG9naWNhbCBjYW1lcmEgYXJlICIyIiBhbmQgIjMiLCB0aGUKKyAgICAgKiB2YWx1ZSBvZiB0aGlzIHRhZyB3aWxsIGJlIFsnMicsICdcMCcsICczJywgJ1wwJ10uPC9wPgorICAgICAqIDxwPlRoZSBudW1iZXIgb2YgcGh5c2ljYWwgY2FtZXJhIElEcyBtdXN0IGJlIG5vIGxlc3MgdGhhbiAyLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1BIWVNJQ0FMX0lEUyA9ICAgICAgICAgICAgICAgICAvLyBieXRlW25dCisgICAgICAgICAgICBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1NUQVJULAorICAgIC8qKgogICAgICAqIDxwPlRoZSBhY2N1cmFjeSBvZiBmcmFtZSB0aW1lc3RhbXAgc3luY2hyb25pemF0aW9uIGJldHdlZW4gcGh5c2ljYWwgY2FtZXJhczwvcD4KICAgICAgKgogICAgICAqIDxwPlR5cGU6IGJ5dGUgKGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hbmRyb2lkX2xvZ2ljYWxfbXVsdGlfY2FtZXJhX3NlbnNvcl9zeW5jX3R5cGVfdCk8L3A+CkBAIC01NDMxLDkgKzU3MDEsMzcgQEAKICAgICAgKiA8cD5JbiBib3RoIGNhc2VzLCBhbGwgaW1hZ2VzIGdlbmVyYXRlZCBmb3IgYSBwYXJ0aWN1bGFyIGNhcHR1cmUgcmVxdWVzdCBzdGlsbCBjYXJyeSB0aGUgc2FtZQogICAgICAqIHRpbWVzdGFtcHMsIHNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCB0byBsb29rIHVwIHRoZSBtYXRjaGluZyBmcmFtZSBudW1iZXIgYW5kCiAgICAgICogb25DYXB0dXJlU3RhcnRlZCBjYWxsYmFjay48L3A+CisgICAgICogPHA+VGhpcyB0YWcgaXMgb25seSBhcHBsaWNhYmxlIGlmIHRoZSBsb2dpY2FsIGNhbWVyYSBkZXZpY2Ugc3VwcG9ydHMgY29uY3VycmVudCBwaHlzaWNhbAorICAgICAqIHN0cmVhbXMgZnJvbSBkaWZmZXJlbnQgcGh5c2ljYWwgY2FtZXJhcy48L3A+CiAgICAgICovCiAgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TRU5TT1JfU1lOQ19UWVBFID0gICAgICAgICAgICAgLy8gYnl0ZSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfbG9naWNhbF9tdWx0aV9jYW1lcmFfc2Vuc29yX3N5bmNfdHlwZV90KQogICAgICAgICAgICAgQUNBTUVSQV9MT0dJQ0FMX01VTFRJX0NBTUVSQV9TVEFSVCArIDEsCisgICAgLyoqCisgICAgICogPHA+U3RyaW5nIGNvbnRhaW5pbmcgdGhlIElEIG9mIHRoZSB1bmRlcmx5aW5nIGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogYnl0ZTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IGNhbGxiYWNrczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGUgSUQgb2YgdGhlIGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEgdGhhdCdzIGJhY2tpbmcgdGhlIGxvZ2ljYWwgY2FtZXJhLiBBbGwgY2FtZXJhCisgICAgICogc3RyZWFtcyBhbmQgbWV0YWRhdGEgdGhhdCBhcmUgbm90IHBoeXNpY2FsIGNhbWVyYSBzcGVjaWZpYyB3aWxsIGJlIG9yaWdpbmF0aW5nIGZyb20gdGhpcworICAgICAqIHBoeXNpY2FsIGNhbWVyYS48L3A+CisgICAgICogPHA+Rm9yIGEgbG9naWNhbCBjYW1lcmEgbWFkZSB1cCBvZiBwaHlzaWNhbCBjYW1lcmFzIHdoZXJlIGVhY2ggY2FtZXJhJ3MgbGVuc2VzIGhhdmUKKyAgICAgKiBkaWZmZXJlbnQgY2hhcmFjdGVyaXN0aWNzLCB0aGUgY2FtZXJhIGRldmljZSBtYXkgY2hvb3NlIHRvIHN3aXRjaCBiZXR3ZWVuIHRoZSBwaHlzaWNhbAorICAgICAqIGNhbWVyYXMgd2hlbiBhcHBsaWNhdGlvbiBjaGFuZ2VzIEZPQ0FMX0xFTkdUSCBvciBTQ0FMRVJfQ1JPUF9SRUdJT04uCisgICAgICogQXQgdGhlIHRpbWUgb2YgbGVucyBzd2l0Y2gsIHRoaXMgcmVzdWx0IG1ldGFkYXRhIHJlZmxlY3RzIHRoZSBuZXcgYWN0aXZlIHBoeXNpY2FsIGNhbWVyYQorICAgICAqIElELjwvcD4KKyAgICAgKiA8cD5UaGlzIGtleSB3aWxsIGJlIGF2YWlsYWJsZSBpZiB0aGUgY2FtZXJhIGRldmljZSBhZHZlcnRpc2VzIHRoaXMga2V5IHZpYSB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9SRVNVTFRfS0VZUyB9LgorICAgICAqIFdoZW4gYXZhaWxhYmxlLCB0aGlzIG11c3QgYmUgb25lIG9mIHZhbGlkIHBoeXNpY2FsIElEcyBiYWNraW5nIHRoaXMgbG9naWNhbCBtdWx0aS1jYW1lcmEuCisgICAgICogSWYgdGhpcyBrZXkgaXMgbm90IGF2YWlsYWJsZSBmb3IgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSwgdGhlIGNhbWVyYSBkZXZpY2UgaW1wbGVtZW50YXRpb24KKyAgICAgKiBtYXkgc3RpbGwgc3dpdGNoIGJldHdlZW4gZGlmZmVyZW50IGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmFzIGJhc2VkIG9uIHVzZSBjYXNlLCBidXQgdGhlCisgICAgICogY3VycmVudCBhY3RpdmUgcGh5c2ljYWwgY2FtZXJhIGluZm9ybWF0aW9uIHdvbid0IGJlIGF2YWlsYWJsZSB0byB0aGUgYXBwbGljYXRpb24uPC9wPgorICAgICAqLworICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfQUNUSVZFX1BIWVNJQ0FMX0lEID0gICAgICAgICAgIC8vIGJ5dGUKKyAgICAgICAgICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfU1RBUlQgKyAyLAogICAgIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfRU5ELAogCiAgICAgLyoqCkBAIC01NDU3LDggKzU3NTUsOCBAQAogICAgICAqIHdpbGwgbm90IHNsb3cgZG93biBjYXB0dXJlIHJhdGUgd2hlbiBhcHBseWluZyBjb3JyZWN0aW9uLiBGQVNUIG1heSBiZSB0aGUgc2FtZSBhcyBPRkYgaWYKICAgICAgKiBhbnkgY29ycmVjdGlvbiBhdCBhbGwgd291bGQgc2xvdyBkb3duIGNhcHR1cmUgcmF0ZS4gIEV2ZXJ5IG91dHB1dCBzdHJlYW0gd2lsbCBoYXZlIGEKICAgICAgKiBzaW1pbGFyIGFtb3VudCBvZiBlbmhhbmNlbWVudCBhcHBsaWVkLjwvcD4KLSAgICAgKiA8cD5UaGUgY29ycmVjdGlvbiBvbmx5IGFwcGxpZXMgdG8gcHJvY2Vzc2VkIG91dHB1dHMgc3VjaCBhcyBZVVYsIEpQRUcsIG9yIERFUFRIMTY7IGl0IGlzIG5vdAotICAgICAqIGFwcGxpZWQgdG8gYW55IFJBVyBvdXRwdXQuPC9wPgorICAgICAqIDxwPlRoZSBjb3JyZWN0aW9uIG9ubHkgYXBwbGllcyB0byBwcm9jZXNzZWQgb3V0cHV0cyBzdWNoIGFzIFlVViwgWTgsIEpQRUcsIG9yIERFUFRIMTY7IGl0IGlzCisgICAgICogbm90IGFwcGxpZWQgdG8gYW55IFJBVyBvdXRwdXQuPC9wPgogICAgICAqIDxwPlRoaXMgY29udHJvbCB3aWxsIGJlIG9uIGJ5IGRlZmF1bHQgb24gZGV2aWNlcyB0aGF0IHN1cHBvcnQgdGhpcyBjb250cm9sLiBBcHBsaWNhdGlvbnMKICAgICAgKiBkaXNhYmxpbmcgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIG5lZWQgdG8gcGF5IGV4dHJhIGF0dGVudGlvbiB3aXRoIHRoZSBjb29yZGluYXRlIHN5c3RlbSBvZgogICAgICAqIG1ldGVyaW5nIHJlZ2lvbnMsIGNyb3AgcmVnaW9uLCBhbmQgZmFjZSByZWN0YW5nbGVzLiBXaGVuIGRpc3RvcnRpb24gY29ycmVjdGlvbiBpcyBPRkYsCkBAIC01NTExLDYgKzU4MDksODAgQEAKICAgICAgICAgICAgIEFDQU1FUkFfRElTVE9SVElPTl9DT1JSRUNUSU9OX1NUQVJUICsgMSwKICAgICBBQ0FNRVJBX0RJU1RPUlRJT05fQ09SUkVDVElPTl9FTkQsCiAKKyAgICAvKioKKyAgICAgKiA8cD5UaGUgYXZhaWxhYmxlIEhFSUMgKElTTy9JRUMgMjMwMDgtMTIpIHN0cmVhbQorICAgICAqIGNvbmZpZ3VyYXRpb25zIHRoYXQgdGhpcyBjYW1lcmEgZGV2aWNlIHN1cHBvcnRzCisgICAgICogKGkuZS4gZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBvdXRwdXQvaW5wdXQgc3RyZWFtKS48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQzMltuKjRdIChhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9oZWljX2F2YWlsYWJsZV9oZWljX3N0cmVhbV9jb25maWd1cmF0aW9uc190KTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGUgY29uZmlndXJhdGlvbnMgYXJlIGxpc3RlZCBhcyA8Y29kZT4oZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCBpbnB1dD8pPC9jb2RlPiB0dXBsZXMuPC9wPgorICAgICAqIDxwPklmIHRoZSBjYW1lcmEgZGV2aWNlIHN1cHBvcnRzIEhFSUMgaW1hZ2UgZm9ybWF0LCBpdCB3aWxsIHN1cHBvcnQgaWRlbnRpY2FsIHNldCBvZiBzdHJlYW0KKyAgICAgKiBjb21iaW5hdGlvbnMgaW52b2x2aW5nIEhFSUMgaW1hZ2UgZm9ybWF0LCBjb21wYXJlZCB0byB0aGUgY29tYmluYXRpb25zIGludm9sdmluZyBKUEVHCisgICAgICogaW1hZ2UgZm9ybWF0IGFzIHJlcXVpcmVkIGJ5IHRoZSBkZXZpY2UncyBoYXJkd2FyZSBsZXZlbCBhbmQgY2FwYWJpbGl0aWVzLjwvcD4KKyAgICAgKiA8cD5BbGwgdGhlIHN0YXRpYywgY29udHJvbCwgYW5kIGR5bmFtaWMgbWV0YWRhdGEgdGFncyByZWxhdGVkIHRvIEpQRUcgYXBwbHkgdG8gSEVJQyBmb3JtYXRzLgorICAgICAqIENvbmZpZ3VyaW5nIEpQRUcgYW5kIEhFSUMgc3RyZWFtcyBhdCB0aGUgc2FtZSB0aW1lIGlzIG5vdCBzdXBwb3J0ZWQuPC9wPgorICAgICAqIDxwPkFsbCB0aGUgY29uZmlndXJhdGlvbiB0dXBsZXMgPGNvZGU+KGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgaW5wdXQ/KTwvY29kZT4gd2lsbCBjb250YWluCisgICAgICogQUlNQUdFX0ZPUk1BVF9IRUlDIGZvcm1hdCBhcyBPVVRQVVQgb25seS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OUyA9ICAgICAgICAgLy8gaW50MzJbbio0XSAoYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfaGVpY19hdmFpbGFibGVfaGVpY19zdHJlYW1fY29uZmlndXJhdGlvbnNfdCkKKyAgICAgICAgICAgIEFDQU1FUkFfSEVJQ19TVEFSVCwKKyAgICAvKioKKyAgICAgKiA8cD5UaGlzIGxpc3RzIHRoZSBtaW5pbXVtIGZyYW1lIGR1cmF0aW9uIGZvciBlYWNoCisgICAgICogZm9ybWF0L3NpemUgY29tYmluYXRpb24gZm9yIEhFSUMgb3V0cHV0IGZvcm1hdHMuPC9wPgorICAgICAqCisgICAgICogPHA+VHlwZTogaW50NjRbNCpuXTwvcD4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgdGFnIG1heSBhcHBlYXIgaW46CisgICAgICogPHVsPgorICAgICAqICAgPGxpPkFDYW1lcmFNZXRhZGF0YSBmcm9tIEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvbGk+CisgICAgICogPC91bD48L3A+CisgICAgICoKKyAgICAgKiA8cD5UaGlzIHNob3VsZCBjb3JyZXNwb25kIHRvIHRoZSBmcmFtZSBkdXJhdGlvbiB3aGVuIG9ubHkgdGhhdAorICAgICAqIHN0cmVhbSBpcyBhY3RpdmUsIHdpdGggYWxsIHByb2Nlc3NpbmcgKHR5cGljYWxseSBpbiBhbmRyb2lkLioubW9kZSkKKyAgICAgKiBzZXQgdG8gZWl0aGVyIE9GRiBvciBGQVNULjwvcD4KKyAgICAgKiA8cD5XaGVuIG11bHRpcGxlIHN0cmVhbXMgYXJlIHVzZWQgaW4gYSByZXF1ZXN0LCB0aGUgbWluaW11bSBmcmFtZQorICAgICAqIGR1cmF0aW9uIHdpbGwgYmUgbWF4KGluZGl2aWR1YWwgc3RyZWFtIG1pbiBkdXJhdGlvbnMpLjwvcD4KKyAgICAgKiA8cD5TZWUgQUNBTUVSQV9TRU5TT1JfRlJBTUVfRFVSQVRJT04gYW5kCisgICAgICogQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUyBmb3IgbW9yZSBkZXRhaWxzIGFib3V0CisgICAgICogY2FsY3VsYXRpbmcgdGhlIG1heCBmcmFtZSByYXRlLjwvcD4KKyAgICAgKgorICAgICAqIEBzZWUgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUworICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfRlJBTUVfRFVSQVRJT04KKyAgICAgKi8KKyAgICBBQ0FNRVJBX0hFSUNfQVZBSUxBQkxFX0hFSUNfTUlOX0ZSQU1FX0RVUkFUSU9OUyA9ICAgICAgICAgICAvLyBpbnQ2NFs0Km5dCisgICAgICAgICAgICBBQ0FNRVJBX0hFSUNfU1RBUlQgKyAxLAorICAgIC8qKgorICAgICAqIDxwPlRoaXMgbGlzdHMgdGhlIG1heGltdW0gc3RhbGwgZHVyYXRpb24gZm9yIGVhY2gKKyAgICAgKiBvdXRwdXQgZm9ybWF0L3NpemUgY29tYmluYXRpb24gZm9yIEhFSUMgc3RyZWFtcy48L3A+CisgICAgICoKKyAgICAgKiA8cD5UeXBlOiBpbnQ2NFs0Km5dPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyB0YWcgbWF5IGFwcGVhciBpbjoKKyAgICAgKiA8dWw+CisgICAgICogICA8bGk+QUNhbWVyYU1ldGFkYXRhIGZyb20gQUNhbWVyYU1hbmFnZXJfZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzPC9saT4KKyAgICAgKiA8L3VsPjwvcD4KKyAgICAgKgorICAgICAqIDxwPkEgc3RhbGwgZHVyYXRpb24gaXMgaG93IG11Y2ggZXh0cmEgdGltZSB3b3VsZCBnZXQgYWRkZWQKKyAgICAgKiB0byB0aGUgbm9ybWFsIG1pbmltdW0gZnJhbWUgZHVyYXRpb24gZm9yIGEgcmVwZWF0aW5nIHJlcXVlc3QKKyAgICAgKiB0aGF0IGhhcyBzdHJlYW1zIHdpdGggbm9uLXplcm8gc3RhbGwuPC9wPgorICAgICAqIDxwPlRoaXMgZnVuY3Rpb25zIHNpbWlsYXJseSB0bworICAgICAqIEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVEFMTF9EVVJBVElPTlMgZm9yIEhFSUMKKyAgICAgKiBzdHJlYW1zLjwvcD4KKyAgICAgKiA8cD5BbGwgSEVJQyBvdXRwdXQgc3RyZWFtIGZvcm1hdHMgbWF5IGhhdmUgYSBub256ZXJvIHN0YWxsCisgICAgICogZHVyYXRpb24uPC9wPgorICAgICAqCisgICAgICogQHNlZSBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RBTExfRFVSQVRJT05TCisgICAgICovCisgICAgQUNBTUVSQV9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUQUxMX0RVUkFUSU9OUyA9ICAgICAgICAgICAgICAgLy8gaW50NjRbNCpuXQorICAgICAgICAgICAgQUNBTUVSQV9IRUlDX1NUQVJUICsgMiwKKyAgICBBQ0FNRVJBX0hFSUNfRU5ELAorCiB9IGFjYW1lcmFfbWV0YWRhdGFfdGFnX3Q7CiAKIC8qKgpAQCAtNzAwNSw2ICs3Mzc3LDEwIEBACiAgICAgICogPHA+SWYgdGhpcyBpcyBzdXBwb3J0ZWQsIGFuZHJvaWQuc2NhbGVyLnN0cmVhbUNvbmZpZ3VyYXRpb25NYXAgd2lsbAogICAgICAqIGFkZGl0aW9uYWxseSByZXR1cm4gYSBtaW4gZnJhbWUgZHVyYXRpb24gdGhhdCBpcyBncmVhdGVyIHRoYW4KICAgICAgKiB6ZXJvIGZvciBlYWNoIHN1cHBvcnRlZCBzaXplLWZvcm1hdCBjb21iaW5hdGlvbi48L3A+CisgICAgICogPHA+Rm9yIGNhbWVyYSBkZXZpY2VzIHdpdGggTE9HSUNBTF9NVUxUSV9DQU1FUkEgY2FwYWJpbGl0eSwgd2hlbiB0aGUgdW5kZXJseWluZyBhY3RpdmUKKyAgICAgKiBwaHlzaWNhbCBjYW1lcmEgc3dpdGNoZXMsIGV4cG9zdXJlVGltZSwgc2Vuc2l0aXZpdHksIGFuZCBsZW5zIHByb3BlcnRpZXMgbWF5IGNoYW5nZQorICAgICAqIGV2ZW4gaWYgQUUvQUYgaXMgbG9ja2VkLiBIb3dldmVyLCB0aGUgb3ZlcmFsbCBhdXRvIGV4cG9zdXJlIGFuZCBhdXRvIGZvY3VzIGV4cGVyaWVuY2UKKyAgICAgKiBmb3IgdXNlcnMgd2lsbCBiZSBjb25zaXN0ZW50LiBSZWZlciB0byBMT0dJQ0FMX01VTFRJX0NBTUVSQSBjYXBhYmlsaXR5IGZvciBkZXRhaWxzLjwvcD4KICAgICAgKgogICAgICAqIEBzZWUgQUNBTUVSQV9CTEFDS19MRVZFTF9MT0NLCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfQUVfTE9DSwpAQCAtNzA2MCw2ICs3NDM2LDEwIEBACiAgICAgICogd2lsbCBhY2N1cmF0ZWx5IHJlcG9ydCB0aGUgdmFsdWVzIGFwcGxpZWQgYnkgQVdCIGluIHRoZSByZXN1bHQuPC9wPgogICAgICAqIDxwPkEgZ2l2ZW4gY2FtZXJhIGRldmljZSBtYXkgYWxzbyBzdXBwb3J0IGFkZGl0aW9uYWwgcG9zdC1wcm9jZXNzaW5nCiAgICAgICogY29udHJvbHMsIGJ1dCB0aGlzIGNhcGFiaWxpdHkgb25seSBjb3ZlcnMgdGhlIGFib3ZlIGxpc3Qgb2YgY29udHJvbHMuPC9wPgorICAgICAqIDxwPkZvciBjYW1lcmEgZGV2aWNlcyB3aXRoIExPR0lDQUxfTVVMVElfQ0FNRVJBIGNhcGFiaWxpdHksIHdoZW4gdW5kZXJseWluZyBhY3RpdmUKKyAgICAgKiBwaHlzaWNhbCBjYW1lcmEgc3dpdGNoZXMsIHRvbmVtYXAsIHdoaXRlIGJhbGFuY2UsIGFuZCBzaGFkaW5nIG1hcCBtYXkgY2hhbmdlIGV2ZW4gaWYKKyAgICAgKiBhd2IgaXMgbG9ja2VkLiBIb3dldmVyLCB0aGUgb3ZlcmFsbCBwb3N0LXByb2Nlc3NpbmcgZXhwZXJpZW5jZSBmb3IgdXNlcnMgd2lsbCBiZQorICAgICAqIGNvbnNpc3RlbnQuIFJlZmVyIHRvIExPR0lDQUxfTVVMVElfQ0FNRVJBIGNhcGFiaWxpdHkgZm9yIGRldGFpbHMuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTE9SX0NPUlJFQ1RJT05fQUJFUlJBVElPTl9NT0RFCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTE9SX0NPUlJFQ1RJT05fQVZBSUxBQkxFX0FCRVJSQVRJT05fTU9ERVMKQEAgLTcxMzEsMTkgKzc1MTEsMjAgQEAKIAogICAgIC8qKgogICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIHN1cHBvcnRzIGNhcHR1cmluZyBoaWdoLXJlc29sdXRpb24gaW1hZ2VzIGF0ICZndDs9IDIwIGZyYW1lcyBwZXIKLSAgICAgKiBzZWNvbmQsIGluIGF0IGxlYXN0IHRoZSB1bmNvbXByZXNzZWQgWVVWIGZvcm1hdCwgd2hlbiBwb3N0LXByb2Nlc3Npbmcgc2V0dGluZ3MgYXJlIHNldAotICAgICAqIHRvIEZBU1QuIEFkZGl0aW9uYWxseSwgbWF4aW11bS1yZXNvbHV0aW9uIGltYWdlcyBjYW4gYmUgY2FwdHVyZWQgYXQgJmd0Oz0gMTAgZnJhbWVzCi0gICAgICogcGVyIHNlY29uZC4gIEhlcmUsICdoaWdoIHJlc29sdXRpb24nIG1lYW5zIGF0IGxlYXN0IDggbWVnYXBpeGVscywgb3IgdGhlIG1heGltdW0KLSAgICAgKiByZXNvbHV0aW9uIG9mIHRoZSBkZXZpY2UsIHdoaWNoZXZlciBpcyBzbWFsbGVyLjwvcD4KKyAgICAgKiBzZWNvbmQsIGluIGF0IGxlYXN0IHRoZSB1bmNvbXByZXNzZWQgWVVWIGZvcm1hdCwgd2hlbiBwb3N0LXByb2Nlc3Npbmcgc2V0dGluZ3MgYXJlCisgICAgICogc2V0IHRvIEZBU1QuIEFkZGl0aW9uYWxseSwgYWxsIGltYWdlIHJlc29sdXRpb25zIGxlc3MgdGhhbiAyNCBtZWdhcGl4ZWxzIGNhbiBiZQorICAgICAqIGNhcHR1cmVkIGF0ICZndDs9IDEwIGZyYW1lcyBwZXIgc2Vjb25kLiBIZXJlLCAnaGlnaCByZXNvbHV0aW9uJyBtZWFucyBhdCBsZWFzdCA4CisgICAgICogbWVnYXBpeGVscywgb3IgdGhlIG1heGltdW0gcmVzb2x1dGlvbiBvZiB0aGUgZGV2aWNlLCB3aGljaGV2ZXIgaXMgc21hbGxlci48L3A+CiAgICAgICogPHA+TW9yZSBzcGVjaWZpY2FsbHksIHRoaXMgbWVhbnMgdGhhdCBhdCBsZWFzdCBvbmUgb3V0cHV0IHtAbGluayBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4IH0gc2l6ZSBsaXN0ZWQgaW4KICAgICAgKiB7QGxpbmsgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyB9CiAgICAgICogaXMgbGFyZ2VyIG9yIGVxdWFsIHRvIHRoZSAnaGlnaCByZXNvbHV0aW9uJyBkZWZpbmVkIGFib3ZlLCBhbmQgY2FuIGJlIGNhcHR1cmVkIGF0IGF0CiAgICAgICogbGVhc3QgMjAgZnBzLiAgRm9yIHRoZSBsYXJnZXN0IHtAbGluayBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4IH0gc2l6ZSBsaXN0ZWQgaW4KICAgICAgKiB7QGxpbmsgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OUyB9LAotICAgICAqIGNhbWVyYSBkZXZpY2UgY2FuIGNhcHR1cmUgdGhpcyBzaXplIGZvciBhdCBsZWFzdCAxMCBmcmFtZXMgcGVyIHNlY29uZC4gIEFsc28gdGhlCi0gICAgICogQUNBTUVSQV9DT05UUk9MX0FFX0FWQUlMQUJMRV9UQVJHRVRfRlBTX1JBTkdFUyBlbnRyeSBsaXN0cyBhdCBsZWFzdCBvbmUgRlBTIHJhbmdlIHdoZXJlCi0gICAgICogdGhlIG1pbmltdW0gRlBTIGlzICZndDs9IDEgLyBtaW5pbXVtRnJhbWVEdXJhdGlvbiBmb3IgdGhlIGxhcmdlc3QgWVVWXzQyMF84ODggc2l6ZS48L3A+Ci0gICAgICogPHA+SWYgdGhlIGRldmljZSBzdXBwb3J0cyB0aGUge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTAgfSwge0BsaW5rIEFJTUFHRV9GT1JNQVRfUkFXMTIgfSwgdGhlbiB0aG9zZSBjYW4gYWxzbyBiZQorICAgICAqIGNhbWVyYSBkZXZpY2UgY2FuIGNhcHR1cmUgdGhpcyBzaXplIGZvciBhdCBsZWFzdCAxMCBmcmFtZXMgcGVyIHNlY29uZCBpZiB0aGUgc2l6ZSBpcworICAgICAqIGxlc3MgdGhhbiAyNCBtZWdhcGl4ZWxzLiBBbHNvIHRoZSBBQ0FNRVJBX0NPTlRST0xfQUVfQVZBSUxBQkxFX1RBUkdFVF9GUFNfUkFOR0VTIGVudHJ5CisgICAgICogbGlzdHMgYXQgbGVhc3Qgb25lIEZQUyByYW5nZSB3aGVyZSB0aGUgbWluaW11bSBGUFMgaXMgJmd0Oz0gMSAvIG1pbmltdW1GcmFtZUR1cmF0aW9uCisgICAgICogZm9yIHRoZSBsYXJnZXN0IFlVVl80MjBfODg4IHNpemUuPC9wPgorICAgICAqIDxwPklmIHRoZSBkZXZpY2Ugc3VwcG9ydHMgdGhlIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEwIH0sIHtAbGluayBBSU1BR0VfRk9STUFUX1JBVzEyIH0sIHtAbGluayBBSU1BR0VfRk9STUFUX1k4IH0sIHRoZW4gdGhvc2UgY2FuIGFsc28gYmUKICAgICAgKiBjYXB0dXJlZCBhdCB0aGUgc2FtZSByYXRlIGFzIHRoZSBtYXhpbXVtLXNpemUgWVVWXzQyMF84ODggcmVzb2x1dGlvbiBpcy48L3A+CiAgICAgICogPHA+SW4gYWRkaXRpb24sIHRoZSBBQ0FNRVJBX1NZTkNfTUFYX0xBVEVOQ1kgZmllbGQgaXMgZ3VhcmFudGVkIHRvIGhhdmUgYSB2YWx1ZSBiZXR3ZWVuIDAKICAgICAgKiBhbmQgNCwgaW5jbHVzaXZlLiBBQ0FNRVJBX0NPTlRST0xfQUVfTE9DS19BVkFJTEFCTEUgYW5kIEFDQU1FUkFfQ09OVFJPTF9BV0JfTE9DS19BVkFJTEFCTEUKQEAgLTcxNzcsOCArNzU1OCw4IEBACiAgICAgICogPGxpPlRoZSBBQ0FNRVJBX0RFUFRIX0RFUFRIX0lTX0VYQ0xVU0lWRSBlbnRyeSBpcyBsaXN0ZWQgYnkgdGhpcyBkZXZpY2UuPC9saT4KICAgICAgKiA8bGk+QXMgb2YgQW5kcm9pZCBQLCB0aGUgQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFIGVudHJ5IGlzIGxpc3RlZCBieSB0aGlzIGRldmljZS48L2xpPgogICAgICAqIDxsaT5BIExJTUlURUQgY2FtZXJhIHdpdGggb25seSB0aGUgREVQVEhfT1VUUFVUIGNhcGFiaWxpdHkgZG9lcyBub3QgaGF2ZSB0byBzdXBwb3J0Ci0gICAgICogICBub3JtYWwgWVVWXzQyMF84ODgsIEpQRUcsIGFuZCBQUklWLWZvcm1hdCBvdXRwdXRzLiBJdCBvbmx5IGhhcyB0byBzdXBwb3J0IHRoZSBERVBUSDE2Ci0gICAgICogICBmb3JtYXQuPC9saT4KKyAgICAgKiAgIG5vcm1hbCBZVVZfNDIwXzg4OCwgWTgsIEpQRUcsIGFuZCBQUklWLWZvcm1hdCBvdXRwdXRzLiBJdCBvbmx5IGhhcyB0byBzdXBwb3J0IHRoZQorICAgICAqICAgREVQVEgxNiBmb3JtYXQuPC9saT4KICAgICAgKiA8L3VsPgogICAgICAqIDxwPkdlbmVyYWxseSwgZGVwdGggb3V0cHV0IG9wZXJhdGVzIGF0IGEgc2xvd2VyIGZyYW1lIHJhdGUgdGhhbiBzdGFuZGFyZCBjb2xvciBjYXB0dXJlLAogICAgICAqIHNvIHRoZSBERVBUSDE2IGFuZCBERVBUSF9QT0lOVF9DTE9VRCBmb3JtYXRzIHdpbGwgY29tbW9ubHkgaGF2ZSBhIHN0YWxsIGR1cmF0aW9uIHRoYXQKQEAgLTcyMDksOCArNzU5MCwyMyBAQAogICAgIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01PVElPTl9UUkFDS0lORyAgICAgICAgICAgPSAxMCwKIAogICAgIC8qKgotICAgICAqIDxwPlRoZSBjYW1lcmEgZGV2aWNlIGlzIGEgbG9naWNhbCBjYW1lcmEgYmFja2VkIGJ5IHR3byBvciBtb3JlIHBoeXNpY2FsIGNhbWVyYXMgdGhhdCBhcmUKLSAgICAgKiBhbHNvIGV4cG9zZWQgdG8gdGhlIGFwcGxpY2F0aW9uLjwvcD4KKyAgICAgKiA8cD5UaGUgY2FtZXJhIGRldmljZSBpcyBhIGxvZ2ljYWwgY2FtZXJhIGJhY2tlZCBieSB0d28gb3IgbW9yZSBwaHlzaWNhbCBjYW1lcmFzLjwvcD4KKyAgICAgKiA8cD5JbiBBUEkgbGV2ZWwgMjgsIHRoZSBwaHlzaWNhbCBjYW1lcmFzIG11c3QgYWxzbyBiZSBleHBvc2VkIHRvIHRoZSBhcHBsaWNhdGlvbiB2aWEKKyAgICAgKiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0NhbWVyYU1hbmFnZXIuaHRtbCNnZXRDYW1lcmFJZExpc3QiPkNhbWVyYU1hbmFnZXIjZ2V0Q2FtZXJhSWRMaXN0PC9hPi48L3A+CisgICAgICogPHA+U3RhcnRpbmcgZnJvbSBBUEkgbGV2ZWwgMjksIHNvbWUgb3IgYWxsIHBoeXNpY2FsIGNhbWVyYXMgbWF5IG5vdCBiZSBpbmRlcGVuZGVudGx5CisgICAgICogZXhwb3NlZCB0byB0aGUgYXBwbGljYXRpb24sIGluIHdoaWNoIGNhc2UgdGhlIHBoeXNpY2FsIGNhbWVyYSBJRHMgd2lsbCBub3QgYmUKKyAgICAgKiBhdmFpbGFibGUgaW4gPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNYW5hZ2VyLmh0bWwjZ2V0Q2FtZXJhSWRMaXN0Ij5DYW1lcmFNYW5hZ2VyI2dldENhbWVyYUlkTGlzdDwvYT4uIEJ1dCB0aGUKKyAgICAgKiBhcHBsaWNhdGlvbiBjYW4gc3RpbGwgcXVlcnkgdGhlIHBoeXNpY2FsIGNhbWVyYXMnIGNoYXJhY3RlcmlzdGljcyBieSBjYWxsaW5nCisgICAgICogPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9DYW1lcmFNYW5hZ2VyLmh0bWwjZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIj5DYW1lcmFNYW5hZ2VyI2dldENhbWVyYUNoYXJhY3RlcmlzdGljczwvYT4uIEFkZGl0aW9uYWxseSwKKyAgICAgKiBpZiBhIHBoeXNpY2FsIGNhbWVyYSBpcyBoaWRkZW4gZnJvbSBjYW1lcmEgSUQgbGlzdCwgdGhlIG1hbmRhdG9yeSBzdHJlYW0gY29tYmluYXRpb25zCisgICAgICogZm9yIHRoYXQgcGh5c2ljYWwgY2FtZXJhIG11c3QgYmUgc3VwcG9ydGVkIHRocm91Z2ggdGhlIGxvZ2ljYWwgY2FtZXJhIHVzaW5nIHBoeXNpY2FsCisgICAgICogc3RyZWFtcy48L3A+CisgICAgICogPHA+Q29tYmluYXRpb25zIG9mIGxvZ2ljYWwgYW5kIHBoeXNpY2FsIHN0cmVhbXMsIG9yIHBoeXNpY2FsIHN0cmVhbXMgZnJvbSBkaWZmZXJlbnQKKyAgICAgKiBwaHlzaWNhbCBjYW1lcmFzIGFyZSBub3QgZ3VhcmFudGVlZC4gSG93ZXZlciwgaWYgdGhlIGNhbWVyYSBkZXZpY2Ugc3VwcG9ydHMKKyAgICAgKiB7QGxpbmsgQUNhbWVyYURldmljZV9pc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkIH0sCisgICAgICogYXBwbGljYXRpb24gbXVzdCBiZSBhYmxlIHRvIHF1ZXJ5IHdoZXRoZXIgYSBzdHJlYW0gY29tYmluYXRpb24gaW52b2x2aW5nIHBoeXNpY2FsCisgICAgICogc3RyZWFtcyBpcyBzdXBwb3J0ZWQgYnkgY2FsbGluZworICAgICAqIHtAbGluayBBQ2FtZXJhRGV2aWNlX2lzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQgfS48L3A+CiAgICAgICogPHA+Q2FtZXJhIGFwcGxpY2F0aW9uIHNob3VsZG4ndCBhc3N1bWUgdGhhdCB0aGVyZSBhcmUgYXQgbW9zdCAxIHJlYXIgY2FtZXJhIGFuZCAxIGZyb250CiAgICAgICogY2FtZXJhIGluIHRoZSBzeXN0ZW0uIEZvciBhbiBhcHBsaWNhdGlvbiB0aGF0IHN3aXRjaGVzIGJldHdlZW4gZnJvbnQgYW5kIGJhY2sgY2FtZXJhcywKICAgICAgKiB0aGUgcmVjb21tZW5kYXRpb24gaXMgdG8gc3dpdGNoIGJldHdlZW4gdGhlIGZpcnN0IHJlYXIgY2FtZXJhIGFuZCB0aGUgZmlyc3QgZnJvbnQKQEAgLTcyMzMsNDIgKzc2MjksMTI4IEBACiAgICAgICogPC9saT4KICAgICAgKiA8bGk+VGhlIFNFTlNPUl9JTkZPX1RJTUVTVEFNUF9TT1VSQ0Ugb2YgdGhlIGxvZ2ljYWwgZGV2aWNlIGFuZCBwaHlzaWNhbCBkZXZpY2VzIG11c3QgYmUKICAgICAgKiAgIHRoZSBzYW1lLjwvbGk+Ci0gICAgICogPGxpPlRoZSBsb2dpY2FsIGNhbWVyYSBkZXZpY2UgbXVzdCBiZSBMSU1JVEVEIG9yIGhpZ2hlciBkZXZpY2UuPC9saT4KKyAgICAgKiA8bGk+VGhlIGxvZ2ljYWwgY2FtZXJhIG11c3QgYmUgTElNSVRFRCBvciBoaWdoZXIgZGV2aWNlLjwvbGk+CiAgICAgICogPC91bD4KLSAgICAgKiA8cD5Cb3RoIHRoZSBsb2dpY2FsIGNhbWVyYSBkZXZpY2UgYW5kIGl0cyB1bmRlcmx5aW5nIHBoeXNpY2FsIGRldmljZXMgc3VwcG9ydCB0aGUKLSAgICAgKiBtYW5kYXRvcnkgc3RyZWFtIGNvbWJpbmF0aW9ucyByZXF1aXJlZCBmb3IgdGhlaXIgZGV2aWNlIGxldmVscy48L3A+Ci0gICAgICogPHA+QWRkaXRpb25hbGx5LCBmb3IgZWFjaCBndWFyYW50ZWVkIHN0cmVhbSBjb21iaW5hdGlvbiwgdGhlIGxvZ2ljYWwgY2FtZXJhIHN1cHBvcnRzOjwvcD4KKyAgICAgKiA8cD5BIGxvZ2ljYWwgY2FtZXJhIGRldmljZSdzIGR5bmFtaWMgbWV0YWRhdGEgbWF5IGNvbnRhaW4KKyAgICAgKiBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX0FDVElWRV9QSFlTSUNBTF9JRCB0byBub3RpZnkgdGhlIGFwcGxpY2F0aW9uIG9mIHRoZSBjdXJyZW50CisgICAgICogYWN0aXZlIHBoeXNpY2FsIGNhbWVyYSBJZC4gQW4gYWN0aXZlIHBoeXNpY2FsIGNhbWVyYSBpcyB0aGUgcGh5c2ljYWwgY2FtZXJhIGZyb20gd2hpY2gKKyAgICAgKiB0aGUgbG9naWNhbCBjYW1lcmEncyBtYWluIGltYWdlIGRhdGEgb3V0cHV0cyAoWVVWIG9yIFJBVykgYW5kIG1ldGFkYXRhIGNvbWUgZnJvbS4KKyAgICAgKiBJbiBhZGRpdGlvbiwgdGhpcyBzZXJ2ZXMgYXMgYW4gaW5kaWNhdGlvbiB3aGljaCBwaHlzaWNhbCBjYW1lcmEgaXMgdXNlZCB0byBvdXRwdXQgdG8KKyAgICAgKiBhIFJBVyBzdHJlYW0sIG9yIGluIGNhc2Ugb25seSBwaHlzaWNhbCBjYW1lcmFzIHN1cHBvcnQgUkFXLCB3aGljaCBwaHlzaWNhbCBSQVcgc3RyZWFtCisgICAgICogdGhlIGFwcGxpY2F0aW9uIHNob3VsZCByZXF1ZXN0LjwvcD4KKyAgICAgKiA8cD5Mb2dpY2FsIGNhbWVyYSdzIHN0YXRpYyBtZXRhZGF0YSB0YWdzIGJlbG93IGRlc2NyaWJlIHRoZSBkZWZhdWx0IGFjdGl2ZSBwaHlzaWNhbAorICAgICAqIGNhbWVyYS4gQW4gYWN0aXZlIHBoeXNpY2FsIGNhbWVyYSBpcyBkZWZhdWx0IGlmIGl0J3MgdXNlZCB3aGVuIGFwcGxpY2F0aW9uIGRpcmVjdGx5CisgICAgICogdXNlcyByZXF1ZXN0cyBidWlsdCBmcm9tIGEgdGVtcGxhdGUuIEFsbCB0ZW1wbGF0ZXMgd2lsbCBkZWZhdWx0IHRvIHRoZSBzYW1lIGFjdGl2ZQorICAgICAqIHBoeXNpY2FsIGNhbWVyYS48L3A+CiAgICAgICogPHVsPgotICAgICAqIDxsaT5Gb3IgZWFjaCBndWFyYW50ZWVkIHN0cmVhbSBjb21iaW5hdGlvbiwgdGhlIGxvZ2ljYWwgY2FtZXJhIHN1cHBvcnRzIHJlcGxhY2luZyBvbmUKLSAgICAgKiAgIGxvZ2ljYWwge0BsaW5rIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODggWVVWXzQyMF84ODh9Ci0gICAgICogICBvciByYXcgc3RyZWFtIHdpdGggdHdvIHBoeXNpY2FsIHN0cmVhbXMgb2YgdGhlIHNhbWUgc2l6ZSBhbmQgZm9ybWF0LCBlYWNoIGZyb20gYQotICAgICAqICAgc2VwYXJhdGUgcGh5c2ljYWwgY2FtZXJhLCBnaXZlbiB0aGF0IHRoZSBzaXplIGFuZCBmb3JtYXQgYXJlIHN1cHBvcnRlZCBieSBib3RoCi0gICAgICogICBwaHlzaWNhbCBjYW1lcmFzLjwvbGk+Ci0gICAgICogPGxpPklmIHRoZSBsb2dpY2FsIGNhbWVyYSBkb2Vzbid0IGFkdmVydGlzZSBSQVcgY2FwYWJpbGl0eSwgYnV0IHRoZSB1bmRlcmx5aW5nIHBoeXNpY2FsCi0gICAgICogICBjYW1lcmFzIGRvLCB0aGUgbG9naWNhbCBjYW1lcmEgd2lsbCBzdXBwb3J0IGd1YXJhbnRlZWQgc3RyZWFtIGNvbWJpbmF0aW9ucyBmb3IgUkFXCi0gICAgICogICBjYXBhYmlsaXR5LCBleGNlcHQgdGhhdCB0aGUgUkFXIHN0cmVhbXMgd2lsbCBiZSBwaHlzaWNhbCBzdHJlYW1zLCBlYWNoIGZyb20gYSBzZXBhcmF0ZQotICAgICAqICAgcGh5c2ljYWwgY2FtZXJhLiBUaGlzIGlzIHVzdWFsbHkgdGhlIGNhc2Ugd2hlbiB0aGUgcGh5c2ljYWwgY2FtZXJhcyBoYXZlIGRpZmZlcmVudAotICAgICAqICAgc2Vuc29yIHNpemVzLjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0lORk9fU0VOU0lUSVZJVFlfUkFOR0U8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVDwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0lORk9fRVhQT1NVUkVfVElNRV9SQU5HRTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0lORk9fTUFYX0ZSQU1FX0RVUkFUSU9OPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfSU5GT19QSFlTSUNBTF9TSVpFPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfSU5GT19XSElURV9MRVZFTDwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0lORk9fTEVOU19TSEFESU5HX0FQUExJRUQ8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDE8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9SRUZFUkVOQ0VfSUxMVU1JTkFOVDI8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9DQUxJQlJBVElPTl9UUkFOU0ZPUk0xPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfQ0FMSUJSQVRJT05fVFJBTlNGT1JNMjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX0NPTE9SX1RSQU5TRk9STTE8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0yPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfRk9SV0FSRF9NQVRSSVgxPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfRk9SV0FSRF9NQVRSSVgyPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9TRU5TT1JfQkxBQ0tfTEVWRUxfUEFUVEVSTjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfU0VOU09SX01BWF9BTkFMT0dfU0VOU0lUSVZJVFk8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9PUFRJQ0FMX0JMQUNLX1JFR0lPTlM8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX1NFTlNPUl9BVkFJTEFCTEVfVEVTVF9QQVRURVJOX01PREVTPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX0lORk9fSFlQRVJGT0NBTF9ESVNUQU5DRTwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19JTkZPX01JTklNVU1fRk9DVVNfRElTVEFOQ0U8L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfSU5GT19GT0NVU19ESVNUQU5DRV9DQUxJQlJBVElPTjwvbGk+CisgICAgICogPGxpPkFDQU1FUkFfTEVOU19QT1NFX1JPVEFUSU9OPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT048L2xpPgorICAgICAqIDxsaT5BQ0FNRVJBX0xFTlNfSU5UUklOU0lDX0NBTElCUkFUSU9OPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFPC9saT4KKyAgICAgKiA8bGk+QUNBTUVSQV9MRU5TX0RJU1RPUlRJT048L2xpPgogICAgICAqIDwvdWw+Ci0gICAgICogPHA+VXNpbmcgcGh5c2ljYWwgc3RyZWFtcyBpbiBwbGFjZSBvZiBhIGxvZ2ljYWwgc3RyZWFtIG9mIHRoZSBzYW1lIHNpemUgYW5kIGZvcm1hdCB3aWxsCi0gICAgICogbm90IHNsb3cgZG93biB0aGUgZnJhbWUgcmF0ZSBvZiB0aGUgY2FwdHVyZSwgYXMgbG9uZyBhcyB0aGUgbWluaW11bSBmcmFtZSBkdXJhdGlvbgotICAgICAqIG9mIHRoZSBwaHlzaWNhbCBhbmQgbG9naWNhbCBzdHJlYW1zIGFyZSB0aGUgc2FtZS48L3A+CisgICAgICogPHA+VGhlIGZpZWxkIG9mIHZpZXcgb2YgYWxsIG5vbi1SQVcgcGh5c2ljYWwgc3RyZWFtcyBtdXN0IGJlIHRoZSBzYW1lIG9yIGFzIGNsb3NlIGFzCisgICAgICogcG9zc2libGUgdG8gdGhhdCBvZiBub24tUkFXIGxvZ2ljYWwgc3RyZWFtcy4gSWYgdGhlIHJlcXVlc3RlZCBGT1YgaXMgb3V0c2lkZSBvZiB0aGUKKyAgICAgKiByYW5nZSBzdXBwb3J0ZWQgYnkgdGhlIHBoeXNpY2FsIGNhbWVyYSwgdGhlIHBoeXNpY2FsIHN0cmVhbSBmb3IgdGhhdCBwaHlzaWNhbCBjYW1lcmEKKyAgICAgKiB3aWxsIHVzZSBlaXRoZXIgdGhlIG1heGltdW0gb3IgbWluaW11bSBzY2FsZXIgY3JvcCByZWdpb24sIGRlcGVuZGluZyBvbiB3aGljaCBvbmUgaXMKKyAgICAgKiBjbG9zZXIgdG8gdGhlIHJlcXVlc3RlZCBGT1YuIEZvciBleGFtcGxlLCBmb3IgYSBsb2dpY2FsIGNhbWVyYSB3aXRoIHdpZGUtdGVsZSBsZW5zCisgICAgICogY29uZmlndXJhdGlvbiB3aGVyZSB0aGUgd2lkZSBsZW5zIGlzIHRoZSBkZWZhdWx0LCBpZiB0aGUgbG9naWNhbCBjYW1lcmEncyBjcm9wIHJlZ2lvbgorICAgICAqIGlzIHNldCB0byBtYXhpbXVtLCB0aGUgcGh5c2ljYWwgc3RyZWFtIGZvciB0aGUgdGVsZSBsZW5zIHdpbGwgYmUgY29uZmlndXJlZCB0byBpdHMKKyAgICAgKiBtYXhpbXVtIGNyb3AgcmVnaW9uLiBPbiB0aGUgb3RoZXIgaGFuZCwgaWYgdGhlIGxvZ2ljYWwgY2FtZXJhIGhhcyBhIG5vcm1hbC13aWRlIGxlbnMKKyAgICAgKiBjb25maWd1cmF0aW9uIHdoZXJlIHRoZSBub3JtYWwgbGVucyBpcyB0aGUgZGVmYXVsdCwgd2hlbiB0aGUgbG9naWNhbCBjYW1lcmEncyBjcm9wCisgICAgICogcmVnaW9uIGlzIHNldCB0byBtYXhpbXVtLCB0aGUgRk9WIG9mIHRoZSBsb2dpY2FsIHN0cmVhbXMgd2lsbCBiZSB0aGF0IG9mIHRoZSBub3JtYWwKKyAgICAgKiBsZW5zLiBUaGUgRk9WIG9mIHRoZSBwaHlzaWNhbCBzdHJlYW1zIGZvciB0aGUgd2lkZSBsZW5zIHdpbGwgYmUgdGhlIHNhbWUgYXMgdGhlCisgICAgICogbG9naWNhbCBzdHJlYW0sIGJ5IG1ha2luZyB0aGUgY3JvcCByZWdpb24gc21hbGxlciB0aGFuIGl0cyBhY3RpdmUgYXJyYXkgc2l6ZSB0bworICAgICAqIGNvbXBlbnNhdGUgZm9yIHRoZSBzbWFsbGVyIGZvY2FsIGxlbmd0aC48L3A+CisgICAgICogPHA+RXZlbiBpZiB0aGUgdW5kZXJseWluZyBwaHlzaWNhbCBjYW1lcmFzIGhhdmUgZGlmZmVyZW50IFJBVyBjaGFyYWN0ZXJpc3RpY3MgKHN1Y2ggYXMKKyAgICAgKiBzaXplIG9yIENGQSBwYXR0ZXJuKSwgYSBsb2dpY2FsIGNhbWVyYSBjYW4gc3RpbGwgYWR2ZXJ0aXNlIFJBVyBjYXBhYmlsaXR5LiBJbiB0aGlzCisgICAgICogY2FzZSwgd2hlbiB0aGUgYXBwbGljYXRpb24gY29uZmlndXJlcyBhIFJBVyBzdHJlYW0sIHRoZSBjYW1lcmEgZGV2aWNlIHdpbGwgbWFrZSBzdXJlCisgICAgICogdGhlIGFjdGl2ZSBwaHlzaWNhbCBjYW1lcmEgd2lsbCByZW1haW4gYWN0aXZlIHRvIGVuc3VyZSBjb25zaXN0ZW50IFJBVyBvdXRwdXQKKyAgICAgKiBiZWhhdmlvciwgYW5kIG5vdCBzd2l0Y2ggdG8gb3RoZXIgcGh5c2ljYWwgY2FtZXJhcy48L3A+CisgICAgICogPHA+VGhlIGNhcHR1cmUgcmVxdWVzdCBhbmQgcmVzdWx0IG1ldGFkYXRhIHRhZ3MgcmVxdWlyZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGlibGUgY2FtZXJhCisgICAgICogZnVuY3Rpb25hbGl0aWVzIHdpbGwgYmUgc29sZWx5IGJhc2VkIG9uIHRoZSBsb2dpY2FsIGNhbWVyYSBjYXBhYmlsdGl0eS4gT24gdGhlIG90aGVyCisgICAgICogaGFuZCwgdGhlIHVzZSBvZiBtYW51YWwgY2FwdHVyZSBjb250cm9scyAoc2Vuc29yIG9yIHBvc3QtcHJvY2Vzc2luZykgd2l0aCBhCisgICAgICogbG9naWNhbCBjYW1lcmEgbWF5IHJlc3VsdCBpbiB1bmV4cGVjdGVkIGJlaGF2aW9yIHdoZW4gdGhlIEhBTCBkZWNpZGVzIHRvIHN3aXRjaAorICAgICAqIGJldHdlZW4gcGh5c2ljYWwgY2FtZXJhcyB3aXRoIGRpZmZlcmVudCBjaGFyYWN0ZXJpc3RpY3MgdW5kZXIgdGhlIGhvb2QuIEZvciBleGFtcGxlLAorICAgICAqIHdoZW4gdGhlIGFwcGxpY2F0aW9uIG1hbnVhbGx5IHNldHMgZXhwb3N1cmUgdGltZSBhbmQgc2Vuc2l0aXZpdHkgd2hpbGUgem9vbWluZyBpbiwKKyAgICAgKiB0aGUgYnJpZ2h0bmVzcyBvZiB0aGUgY2FtZXJhIGltYWdlcyBtYXkgc3VkZGVubHkgY2hhbmdlIGJlY2F1c2UgSEFMIHN3aXRjaGVzIGZyb20gb25lCisgICAgICogcGh5c2ljYWwgY2FtZXJhIHRvIHRoZSBvdGhlci48L3A+CiAgICAgICoKICAgICAgKiBAc2VlIEFDQU1FUkFfTEVOU19ESVNUT1JUSU9OCisgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfSU5GT19GT0NVU19ESVNUQU5DRV9DQUxJQlJBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0lORk9fSFlQRVJGT0NBTF9ESVNUQU5DRQorICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0lORk9fTUlOSU1VTV9GT0NVU19ESVNUQU5DRQogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTgogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfUkVGRVJFTkNFCiAgICAgICogQHNlZSBBQ0FNRVJBX0xFTlNfUE9TRV9ST1RBVElPTgogICAgICAqIEBzZWUgQUNBTUVSQV9MRU5TX1BPU0VfVFJBTlNMQVRJT04KKyAgICAgKiBAc2VlIEFDQU1FUkFfTE9HSUNBTF9NVUxUSV9DQU1FUkFfQUNUSVZFX1BIWVNJQ0FMX0lECiAgICAgICogQHNlZSBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1NFTlNPUl9TWU5DX1RZUEUKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0FWQUlMQUJMRV9URVNUX1BBVFRFUk5fTU9ERVMKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0JMQUNLX0xFVkVMX1BBVFRFUk4KKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTEKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTIKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NPTE9SX1RSQU5TRk9STTEKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0NPTE9SX1RSQU5TRk9STTIKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0ZPUldBUkRfTUFUUklYMQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfRk9SV0FSRF9NQVRSSVgyCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVAorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19FWFBPU1VSRV9USU1FX1JBTkdFCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX0xFTlNfU0hBRElOR19BUFBMSUVECisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX01BWF9GUkFNRV9EVVJBVElPTgorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfSU5GT19QSFlTSUNBTF9TSVpFCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1NFTlNJVElWSVRZX1JBTkdFCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9JTkZPX1dISVRFX0xFVkVMCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9NQVhfQU5BTE9HX1NFTlNJVElWSVRZCisgICAgICogQHNlZSBBQ0FNRVJBX1NFTlNPUl9PUFRJQ0FMX0JMQUNLX1JFR0lPTlMKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMQorICAgICAqIEBzZWUgQUNBTUVSQV9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyCiAgICAgICovCiAgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTE9HSUNBTF9NVUxUSV9DQU1FUkEgICAgICA9IDExLAogCiAgICAgLyoqCiAgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgaXMgYSBtb25vY2hyb21lIGNhbWVyYSB0aGF0IGRvZXNuJ3QgY29udGFpbiBhIGNvbG9yIGZpbHRlciBhcnJheSwKLSAgICAgKiBhbmQgdGhlIHBpeGVsIHZhbHVlcyBvbiBVIGFuZCBWIHBsYW5lcyBhcmUgYWxsIDEyOC48L3A+CisgICAgICogYW5kIGZvciBZVVZfNDIwXzg4OCBzdHJlYW0sIHRoZSBwaXhlbCB2YWx1ZXMgb24gVSBhbmQgViBwbGFuZXMgYXJlIGFsbCAxMjguPC9wPgorICAgICAqIDxwPkEgTU9OT0NIUk9NRSBjYW1lcmEgbXVzdCBzdXBwb3J0IHRoZSBndWFyYW50ZWVkIHN0cmVhbSBjb21iaW5hdGlvbnMgcmVxdWlyZWQgZm9yCisgICAgICogaXRzIGRldmljZSBsZXZlbCBhbmQgY2FwYWJpbGl0aWVzLiBBZGRpdGlvbmFsbHksIGlmIHRoZSBtb25vY2hyb21lIGNhbWVyYSBkZXZpY2UKKyAgICAgKiBzdXBwb3J0cyBZOCBmb3JtYXQsIGFsbCBtYW5kYXRvcnkgc3RyZWFtIGNvbWJpbmF0aW9uIHJlcXVpcmVtZW50cyByZWxhdGVkIHRvIHtAbGluayBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4IFlVVl80MjBfODg4fSBhcHBseQorICAgICAqIHRvIHtAbGluayBBSU1BR0VfRk9STUFUX1k4IFk4fSBhcyB3ZWxsLiBUaGVyZSBhcmUgbm8KKyAgICAgKiBtYW5kYXRvcnkgc3RyZWFtIGNvbWJpbmF0aW9uIHJlcXVpcmVtZW50cyB3aXRoIHJlZ2FyZCB0bworICAgICAqIHtAbGluayBBSU1BR0VfRk9STUFUX1k4IFk4fSBmb3IgQmF5ZXIgY2FtZXJhIGRldmljZXMuPC9wPgorICAgICAqIDxwPlN0YXJ0aW5nIGZyb20gQW5kcm9pZCBRLCB0aGUgU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UIG9mIGEgTU9OT0NIUk9NRQorICAgICAqIGNhbWVyYSB3aWxsIGJlIGVpdGhlciBNT05PIG9yIE5JUi48L3A+CiAgICAgICovCiAgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTU9OT0NIUk9NRSAgICAgICAgICAgICAgICA9IDEyLAogCisgICAgLyoqCisgICAgICogPHA+VGhlIGNhbWVyYSBkZXZpY2UgaXMgY2FwYWJsZSBvZiB3cml0aW5nIGltYWdlIGRhdGEgaW50byBhIHJlZ2lvbiBvZiBtZW1vcnkKKyAgICAgKiBpbmFjY2Vzc2libGUgdG8gQW5kcm9pZCB1c2Vyc3BhY2Ugb3IgdGhlIEFuZHJvaWQga2VybmVsLCBhbmQgb25seSBhY2Nlc3NpYmxlIHRvCisgICAgICogdHJ1c3RlZCBleGVjdXRpb24gZW52aXJvbm1lbnRzIChURUUpLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFU19TRUNVUkVfSU1BR0VfREFUQSAgICAgICAgID0gMTMsCisKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfcmVxdWVzdF9hdmFpbGFibGVfY2FwYWJpbGl0aWVzX3Q7CiAKIApAQCAtNzI5NCw2ICs3Nzc2LDgxIEBACiAKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfc2NhbGVyX2Nyb3BwaW5nX3R5cGVfdDsKIAorLy8gQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OUwordHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX3NjYWxlcl9hdmFpbGFibGVfcmVjb21tZW5kZWRfc3RyZWFtX2NvbmZpZ3VyYXRpb25zIHsKKyAgICAvKioKKyAgICAgKiA8cD5QcmV2aWV3IG11c3Qgb25seSBpbmNsdWRlIG5vbi1zdGFsbGluZyBwcm9jZXNzZWQgc3RyZWFtIGNvbmZpZ3VyYXRpb25zIHdpdGgKKyAgICAgKiBvdXRwdXQgZm9ybWF0cyBsaWtlCisgICAgICoge0BsaW5rIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODggfSwKKyAgICAgKiB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9QUklWQVRFIH0sIGV0Yy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19QUkVWSUVXCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAsCisKKyAgICAvKioKKyAgICAgKiA8cD5WaWRlbyByZWNvcmQgbXVzdCBpbmNsdWRlIHN0cmVhbSBjb25maWd1cmF0aW9ucyB0aGF0IG1hdGNoIHRoZSBhZHZlcnRpc2VkCisgICAgICogc3VwcG9ydGVkIG1lZGlhIHByb2ZpbGVzIDxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLmFuZHJvaWQuY29tL3JlZmVyZW5jZS9hbmRyb2lkL21lZGlhL0NhbWNvcmRlclByb2ZpbGUuaHRtbCI+Q2FtY29yZGVyUHJvZmlsZTwvYT4gd2l0aAorICAgICAqIElNUExFTUVOVEFUSU9OX0RFRklORUQgZm9ybWF0LjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1JFQ09SRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxLAorCisgICAgLyoqCisgICAgICogPHA+VmlkZW8gc25hcHNob3QgbXVzdCBpbmNsdWRlIHN0cmVhbSBjb25maWd1cmF0aW9ucyBhdCBsZWFzdCBhcyBiaWcgYXMKKyAgICAgKiB0aGUgbWF4aW11bSBSRUNPUkQgcmVzb2x1dGlvbnMgYW5kIG9ubHkgd2l0aAorICAgICAqIHtAbGluayBBSU1BR0VfRk9STUFUX0pQRUcgSlBFRyBvdXRwdXQgZm9ybWF0fS4KKyAgICAgKiBBZGRpdGlvbmFsbHkgdGhlIGNvbmZpZ3VyYXRpb25zIHNob3VsZG4ndCBjYXVzZSBwcmV2aWV3IGdsaXRjaGVzIGFuZCBhbHNvIGJlIGFibGUgdG8KKyAgICAgKiBydW4gYXQgMzAgZnBzLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1ZJREVPX1NOQVBTSE9UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDIsCisKKyAgICAvKioKKyAgICAgKiA8cD5SZWNvbW1lbmRlZCBzbmFwc2hvdCBzdHJlYW0gY29uZmlndXJhdGlvbnMgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IG9uZSB3aXRoCisgICAgICogc2l6ZSBjbG9zZSB0byBBQ0FNRVJBX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFIGFuZAorICAgICAqIHtAbGluayBBSU1BR0VfRk9STUFUX0pQRUcgSlBFRyBvdXRwdXQgZm9ybWF0fS4KKyAgICAgKiBUYWtpbmcgaW50byBhY2NvdW50IHJlc3RyaWN0aW9ucyBvbiBhc3BlY3QgcmF0aW8sIGFsaWdubWVudCBldGMuIHRoZSBhcmVhIG9mIHRoZQorICAgICAqIG1heGltdW0gc3VnZ2VzdGVkIHNpemUgc2hvdWxkbuKAmXQgYmUgbGVzcyB0aGFuIDk3JSBvZiB0aGUgc2Vuc29yIGFycmF5IHNpemUgYXJlYS48L3A+CisgICAgICoKKyAgICAgKiBAc2VlIEFDQU1FUkFfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUKKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1NOQVBTSE9UCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDMsCisKKyAgICAvKioKKyAgICAgKiA8cD5JZiBzdXBwb3J0ZWQsIHJlY29tbWVuZGVkIGlucHV0IHN0cmVhbSBjb25maWd1cmF0aW9ucyBtdXN0IG9ubHkgYmUgYWR2ZXJ0aXNlZCB3aXRoCisgICAgICogWlNMIGFsb25nIHdpdGggb3RoZXIgcHJvY2Vzc2VkIGFuZC9vciBzdGFsbGluZyBvdXRwdXQgZm9ybWF0cy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19aU0wgICA9IDB4NCwKKworICAgIC8qKgorICAgICAqIDxwPklmIHN1cHBvcnRlZCwgcmVjb21tZW5kZWQgcmF3IHN0cmVhbSBjb25maWd1cmF0aW9ucyBtdXN0IG9ubHkgaW5jbHVkZSBSQVcgYmFzZWQKKyAgICAgKiBvdXRwdXQgZm9ybWF0cy48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19SQVcgICA9IDB4NSwKKworICAgIC8qKgorICAgICAqIDxwPklmIHN1cHBvcnRlZCwgdGhlIHJlY29tbWVuZGVkIGxvdyBsYXRlbmN5IHN0cmVhbSBjb25maWd1cmF0aW9ucyBtdXN0IGhhdmUKKyAgICAgKiBlbmQtdG8tZW5kIGxhdGVuY3kgdGhhdCBkb2VzIG5vdCBleGNlZWQgMjAwIG1zLiB1bmRlciBzdGFuZGFyZCBvcGVyYXRpbmcgY29uZGl0aW9ucworICAgICAqIChyZWFzb25hYmxlIGxpZ2h0IGxldmVscywgbm90IGxvYWRlZCBzeXN0ZW0pIGFuZCB1c2luZyB0ZW1wbGF0ZQorICAgICAqIFRFTVBMQVRFX1NUSUxMX0NBUFRVUkUuIFRoaXMgaXMgcHJpbWFyaWx5IGZvciBsaXN0aW5nIGNvbmZpZ3VyYXRpb25zIGZvciB0aGUKKyAgICAgKiB7QGxpbmsgQUlNQUdFX0ZPUk1BVF9KUEVHIEpQRUcgb3V0cHV0IGZvcm1hdH0KKyAgICAgKiBob3dldmVyIG90aGVyIHN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0cyBjYW4gYmUgYWRkZWQgYXMgd2VsbC48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19MT1dfTEFURU5DWV9TTkFQU0hPVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg2LAorCisgICAgQUNBTUVSQV9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19QVUJMSUNfRU5ECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDcsCisKKyAgICAvKioKKyAgICAgKiA8cD5WZW5kb3IgZGVmaW5lZCB1c2UgY2FzZXMuIFRoZXNlIGRlcGVuZCBvbiB0aGUgdmVuZG9yIGltcGxlbWVudGF0aW9uLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1ZFTkRPUl9TVEFSVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxOCwKKworfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zY2FsZXJfYXZhaWxhYmxlX3JlY29tbWVuZGVkX3N0cmVhbV9jb25maWd1cmF0aW9uc190OworCiAKIC8vIEFDQU1FUkFfU0VOU09SX1JFRkVSRU5DRV9JTExVTUlOQU5UMQogdHlwZWRlZiBlbnVtIGFjYW1lcmFfbWV0YWRhdGFfZW51bV9hY2FtZXJhX3NlbnNvcl9yZWZlcmVuY2VfaWxsdW1pbmFudDEgewpAQCAtNzQ3MCw2ICs4MDI3LDIxIEBACiAgICAgICovCiAgICAgQUNBTUVSQV9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlRfUkdCICAgICAgICAgICAgICAgICA9IDQsCiAKKyAgICAvKioKKyAgICAgKiA8cD5TZW5zb3IgZG9lc24ndCBoYXZlIGFueSBCYXllciBjb2xvciBmaWx0ZXIuCisgICAgICogU3VjaCBzZW5zb3IgY2FwdHVyZXMgdmlzaWJsZSBsaWdodCBpbiBtb25vY2hyb21lLiBUaGUgZXhhY3Qgd2VpZ2h0aW5nIGFuZAorICAgICAqIHdhdmVsZW5ndGhzIGNhcHR1cmVkIGlzIG5vdCBzcGVjaWZpZWQsIGJ1dCBnZW5lcmFsbHkgb25seSBpbmNsdWRlcyB0aGUgdmlzaWJsZQorICAgICAqIGZyZXF1ZW5jaWVzLiBUaGlzIHZhbHVlIGltcGxpZXMgYSBNT05PQ0hST01FIGNhbWVyYS48L3A+CisgICAgICovCisgICAgQUNBTUVSQV9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlRfTU9OTyAgICAgICAgICAgICAgICA9IDUsCisKKyAgICAvKioKKyAgICAgKiA8cD5TZW5zb3IgaGFzIGEgbmVhciBpbmZyYXJlZCBmaWx0ZXIgY2FwdHVyaW5nIGxpZ2h0IHdpdGggd2F2ZWxlbmd0aCBiZXR3ZWVuCisgICAgICogcm91Z2hseSA3NTBubSBhbmQgMTQwMG5tLCBhbmQgdGhlIHNhbWUgZmlsdGVyIGNvdmVycyB0aGUgd2hvbGUgc2Vuc29yIGFycmF5LiBUaGlzCisgICAgICogdmFsdWUgaW1wbGllcyBhIE1PTk9DSFJPTUUgY2FtZXJhLjwvcD4KKyAgICAgKi8KKyAgICBBQ0FNRVJBX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVF9OSVIgICAgICAgICAgICAgICAgID0gNiwKKwogfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9zZW5zb3JfaW5mb19jb2xvcl9maWx0ZXJfYXJyYW5nZW1lbnRfdDsKIAogLy8gQUNBTUVSQV9TRU5TT1JfSU5GT19USU1FU1RBTVBfU09VUkNFCkBAIC03NzU4LDYgKzgzMzAsNyBAQAogICAgICAqIGZpcmUgdGhlIGZsYXNoIGZvciBmbGFzaCBwb3dlciBtZXRlcmluZyBkdXJpbmcgcHJlY2FwdHVyZSwgYW5kIHRoZW4gZmlyZSB0aGUgZmxhc2gKICAgICAgKiBmb3IgdGhlIGZpbmFsIGNhcHR1cmUsIGlmIGEgZmxhc2ggaXMgYXZhaWxhYmxlIG9uIHRoZSBkZXZpY2UgYW5kIHRoZSBBRSBtb2RlIGlzIHNldCB0bwogICAgICAqIGVuYWJsZSB0aGUgZmxhc2guPC9wPgorICAgICAqIDxwPkRldmljZXMgdGhhdCBpbml0aWFsbHkgc2hpcHBlZCB3aXRoIEFuZHJvaWQgdmVyc2lvbiA8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5hbmRyb2lkLmNvbS9yZWZlcmVuY2UvYW5kcm9pZC9vcy9CdWlsZC9WRVJTSU9OX0NPREVTLmh0bWwjUSI+UTwvYT4gb3IgbmV3ZXIgd2lsbCBub3QgaW5jbHVkZSBhbnkgTEVHQUNZLWxldmVsIGRldmljZXMuPC9wPgogICAgICAqCiAgICAgICogQHNlZSBBQ0FNRVJBX0NPTlRST0xfQUVfUFJFQ0FQVFVSRV9UUklHR0VSCiAgICAgICogQHNlZSBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUwpAQCAtNzg5OCw2ICs4NDcxLDE2IEBACiAKIH0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfZGVwdGhfZGVwdGhfaXNfZXhjbHVzaXZlX3Q7CiAKKy8vIEFDQU1FUkFfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TCit0eXBlZGVmIGVudW0gYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FjYW1lcmFfZGVwdGhfYXZhaWxhYmxlX2R5bmFtaWNfZGVwdGhfc3RyZWFtX2NvbmZpZ3VyYXRpb25zIHsKKyAgICBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAsCisKKyAgICBBQ0FNRVJBX0RFUFRIX0FWQUlMQUJMRV9EWU5BTUlDX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OU19JTlBVVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMSwKKworfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9kZXB0aF9hdmFpbGFibGVfZHluYW1pY19kZXB0aF9zdHJlYW1fY29uZmlndXJhdGlvbnNfdDsKKwogCiAvLyBBQ0FNRVJBX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1NFTlNPUl9TWU5DX1RZUEUKIHR5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9sb2dpY2FsX211bHRpX2NhbWVyYV9zZW5zb3Jfc3luY190eXBlIHsKQEAgLTc5NDEsNiArODUyNCwxNiBAQAogfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9kaXN0b3J0aW9uX2NvcnJlY3Rpb25fbW9kZV90OwogCiAKKy8vIEFDQU1FUkFfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVFJFQU1fQ09ORklHVVJBVElPTlMKK3R5cGVkZWYgZW51bSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYWNhbWVyYV9oZWljX2F2YWlsYWJsZV9oZWljX3N0cmVhbV9jb25maWd1cmF0aW9ucyB7CisgICAgQUNBTUVSQV9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQgICAgICAgICA9IDAsCisKKyAgICBBQ0FNRVJBX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TX0lOUFVUICAgICAgICAgID0gMSwKKworfSBhY2FtZXJhX21ldGFkYXRhX2VudW1fYW5kcm9pZF9oZWljX2F2YWlsYWJsZV9oZWljX3N0cmVhbV9jb25maWd1cmF0aW9uc190OworCisKKwogI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyNCAqLwogCiBfX0VORF9ERUNMUwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFXaW5kb3dUeXBlLmggYi9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhbWVyYVdpbmRvd1R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWY2N2U5Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYW1lcmFXaW5kb3dUeXBlLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX05ES19DQU1FUkFfV0lORE9XX1RZUEVfSAorI2RlZmluZSBfTkRLX0NBTUVSQV9XSU5ET1dfVFlQRV9ICisKKy8qKgorICogQGFkZHRvZ3JvdXAgQ2FtZXJhCisgKiBAeworICovCisKKy8qKgorICogQGZpbGUgTmRrQ2FtZXJhV2luZG93VHlwZS5oCisgKi8KKworLyoKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCisgKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCisgKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgorICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgorICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgorICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgorICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KKyAqLworCisvKioKKyAqIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB3aW5kb3cgdHlwZSB1c2VkIGJ5IE5ESyBhbmQgdGhlIFZOREsgdmFyaWFudHMgb2YgdGhlCisgKiBjYW1lcmEyIE5ESy4gVGhpcyBlbmFibGVzIHVzIHRvIHNoYXJlIHRoZSBhcGkgZGVmaW5pdGlvbiBoZWFkZXJzIGFuZCBhdm9pZAorICogY29kZSBkdXBsaWNhdGlvbiAoc2luY2UgdGhlIFZOREsgdmFyaWFudCBkb2Vzbid0IHVzZSBBTmF0aXZlV2luZG93IHVubGlrZSB0aGUKKyAqIE5ESyB2YXJpYW50KS4KKyAqLworI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgordHlwZWRlZiBuYXRpdmVfaGFuZGxlX3QgQUNhbWVyYVdpbmRvd1R5cGU7CisjZWxzZQorI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgordHlwZWRlZiBBTmF0aXZlV2luZG93IEFDYW1lcmFXaW5kb3dUeXBlOworI2VuZGlmCisKKyNlbmRpZiAvL19OREtfQ0FNRVJBX1dJTkRPV19UWVBFX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FwdHVyZVJlcXVlc3QuaCBiL2NhbWVyYS9uZGsvaW5jbHVkZS9jYW1lcmEvTmRrQ2FwdHVyZVJlcXVlc3QuaAppbmRleCA1MzQwZTc2Li5kM2Y4ODI2IDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2luY2x1ZGUvY2FtZXJhL05ka0NhcHR1cmVSZXF1ZXN0LmgKKysrIGIvY2FtZXJhL25kay9pbmNsdWRlL2NhbWVyYS9OZGtDYXB0dXJlUmVxdWVzdC5oCkBAIC0zNSw5ICszNSw5IEBACiAKICNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgogI2luY2x1ZGUgIk5ka0NhbWVyYUVycm9yLmgiCiAjaW5jbHVkZSAiTmRrQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJOZGtDYW1lcmFXaW5kb3dUeXBlLmgiCiAKICNpZm5kZWYgX05ES19DQVBUVVJFX1JFUVVFU1RfSAogI2RlZmluZSBfTkRLX0NBUFRVUkVfUkVRVUVTVF9ICkBAIC0xMDEsNyArMTAxLDcgQEAKICAqCiAgKiBAc2VlIEFDYXB0dXJlUmVxdWVzdF9hZGRUYXJnZXQKICAqLwotY2FtZXJhX3N0YXR1c190IEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlKEFOYXRpdmVXaW5kb3cqIHdpbmRvdywKK2NhbWVyYV9zdGF0dXNfdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZShBQ2FtZXJhV2luZG93VHlwZSogd2luZG93LAogICAgICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0Kiogb3V0cHV0KSBfX0lOVFJPRFVDRURfSU4oMjQpOwogCiAvKioKQEAgLTM1OCw2ICszNTgsMjE5IEBACiAKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjggKi8KIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQorCisvKioKKyAqIEdldCBhIG1ldGFkYXRhIGVudHJ5IGZyb20gaW5wdXQge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0gZm9yCisgKiBhIHBoeXNpY2FsIGNhbWVyYSBiYWNraW5nIGEgbG9naWNhbCBtdWx0aS1jYW1lcmEgZGV2aWNlLgorICoKKyAqIDxwPlNhbWUgYXMgQUNhcHR1cmVSZXF1ZXN0X2dldENvbnN0RW50cnksIGV4Y2VwdCB0aGF0IGlmIHRoZSBrZXkgaXMgY29udGFpbmVkCisgKiBpbiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhpcyBmdW5jdGlvbgorICogcmV0dXJucyB0aGUgZW50cnkgc2V0IGJ5IEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV8qIGNsYXNzIG9mCisgKiBmdW5jdGlvbnMgb24gdGhlIHBhcnRpY3VsYXIgcGh5c2ljYWwgY2FtZXJhLjwvcD4KKyAqCisgKiBAcGFyYW0gcmVxdWVzdCB0aGUge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0gb2YgaW50ZXJlc3QgY3JlYXRlZCBieQorICogICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSBwaHlzaWNhbElkIG9uZSBvZiB0aGUgcGh5c2ljYWwgSWRzIHVzZWQgd2hlbiByZXF1ZXN0IGlzIGNyZWF0ZWQgd2l0aAorICogICAgICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSB0YWcgdGhlIGNhcHR1cmUgcmVxdWVzdCBtZXRhZGF0YSB0YWcgaW4KKyAqICAgICAgICAgICAge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30KKyAqICAgICAgICAgICAgdGhhdCBpcyBzZXQgYnkgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhXyogY2xhc3Mgb2YgZnVuY3Rpb25zLgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIG1ldGFkYXRhLCBwaHlzaWNhbElkLCBvciBlbnRyeSBpcyBOVUxMLAorICogICAgICAgICBwaHlzaWNhbElkIGlzIG5vdCBvbmUgb2YgdGhlIElkcyB1c2VkIGluIGNyZWF0aW5nIHRoZSByZXF1ZXN0LCBvciBpZiB0aGUgY2FwdHVyZQorICogICAgICAgICByZXF1ZXN0IGlzIGEgcmVndWxhciByZXF1ZXN0IHdpdGggbm8gcGh5c2ljYWwgSWRzIGF0IGFsbC48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfTUVUQURBVEFfTk9UX0ZPVU5EfSBpZiB0aGUgY2FwdHVyZSByZXF1ZXN0IGRvZXMgbm90IGNvbnRhaW4gYW4KKyAqICAgICAgICAgICAgIGVudHJ5IG9mIGlucHV0IHRhZyB2YWx1ZS48L2xpPjwvdWw+CisgKi8KK2NhbWVyYV9zdGF0dXNfdCBBQ2FwdHVyZVJlcXVlc3RfZ2V0Q29uc3RFbnRyeV9waHlzaWNhbENhbWVyYSgKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBjb25zdCBjaGFyKiBwaHlzaWNhbElkLCB1aW50MzJfdCB0YWcsCisgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9jb25zdF9lbnRyeSogZW50cnkpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogU2V0L2NoYW5nZSBhIGNhbWVyYSBjYXB0dXJlIGNvbnRyb2wgZW50cnkgd2l0aCB1bnNpZ25lZCA4IGJpdHMgZGF0YSB0eXBlIGZvcgorICogYSBwaHlzaWNhbCBjYW1lcmEgYmFja2luZyBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGRldmljZS4KKyAqCisgKiA8cD5TYW1lIGFzIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV91OCwgZXhjZXB0IHRoYXQgaWYge0BsaW5rIHRhZ30gaXMgY29udGFpbmVkCisgKiBpbiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhpcyBmdW5jdGlvbgorICogc2V0cyB0aGUgZW50cnkgZm9yIGEgcGFydGljdWxhciBwaHlzaWNhbCBzdWItY2FtZXJhIGJhY2tpbmcgdGhlIGxvZ2ljYWwgbXVsdGktY2FtZXJhLgorICogSWYge0BsaW5rIHRhZ30gaXMgbm90IGNvbnRhaW5lZCBpbgorICoge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoZSBrZXkgd2lsbCBiZSBpZ25vcmVkCisgKiBieSB0aGUgY2FtZXJhIGRldmljZS48L3A+CisgKgorICogQHBhcmFtIHJlcXVlc3QgdGhlIHtAbGluayBBQ2FwdHVyZVJlcXVlc3R9IG9mIGludGVyZXN0IGNyZWF0ZWQgYnkKKyAqICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkc30uCisgKiBAcGFyYW0gcGh5c2ljYWxJZCBvbmUgb2YgdGhlIHBoeXNpY2FsIElkcyB1c2VkIHdoZW4gcmVxdWVzdCBpcyBjcmVhdGVkIHdpdGgKKyAqICAgICAgICAgICAgICAgICAgIHtAbGluayBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkc30uCisgKiBAcGFyYW0gdGFnIG9uZSBvZiB0aGUgY2FwdHVyZSByZXF1ZXN0IG1ldGFkYXRhIHRhZ3MgaW4KKyAqICAgICAgICAgICAge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30uCisgKgorICogQHJldHVybiA8dWw+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9PS30gaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWRzLjwvbGk+CisgKiAgICAgICAgIDxsaT57QGxpbmsgQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgcmVxdWVzdCBvciBwaHlzaWNhbElkIGlzIE5VTEwsIGNvdW50IGlzCisgKiAgICAgICAgICAgICBsYXJnZXIgdGhhbiB6ZXJvIHdoaWxlIGRhdGEgaXMgTlVMTCwgdGhlIGRhdGEgdHlwZSBvZiB0aGUgdGFnIGlzIG5vdCB1bnNpZ25lZCA4IGJpdHMsCisgKiAgICAgICAgICAgICB0aGUgdGFnIGlzIG5vdCBjb250cm9sbGFibGUgYnkgYXBwbGljYXRpb24sIHBoeXNpY2FsSWQgaXMgbm90IG9uZSBvZiB0aGUgSWRzIHVzZWQKKyAqICAgICAgICAgICAgIGluIGNyZWF0aW5nIHRoZSByZXF1ZXN0LCBvciBpZiB0aGUgY2FwdHVyZSByZXF1ZXN0IGlzIGEgcmVndWxhciByZXF1ZXN0IHdpdGggbm8KKyAqICAgICAgICAgICAgIHBoeXNpY2FsIElkcyBhdCBhbGwuPC9saT48L3VsPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX3U4KAorICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIGNvbnN0IGNoYXIqIHBoeXNpY2FsSWQsIHVpbnQzMl90IHRhZywKKyAgICAgICAgdWludDMyX3QgY291bnQsIGNvbnN0IHVpbnQ4X3QqIGRhdGEpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKy8qKgorICogU2V0L2NoYW5nZSBhIGNhbWVyYSBjYXB0dXJlIGNvbnRyb2wgZW50cnkgd2l0aCBzaWduZWQgMzIgYml0cyBkYXRhIHR5cGUgZm9yCisgKiBhIHBoeXNpY2FsIGNhbWVyYSBvZiBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGRldmljZS4KKyAqCisgKiA8cD5TYW1lIGFzIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9pMzIsIGV4Y2VwdCB0aGF0IGlmIHtAbGluayB0YWd9IGlzIGNvbnRhaW5lZAorICogaW4ge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoaXMgZnVuY3Rpb24KKyAqIHNldHMgdGhlIGVudHJ5IGZvciBhIHBhcnRpY3VsYXIgcGh5c2ljYWwgc3ViLWNhbWVyYSBiYWNraW5nIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAqIElmIHtAbGluayB0YWd9IGlzIG5vdCBjb250YWluZWQgaW4KKyAqIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGUga2V5IHdpbGwgYmUgaWdub3JlZAorICogYnkgdGhlIGNhbWVyYSBkZXZpY2UuPC9wPgorICoKKyAqIEBwYXJhbSByZXF1ZXN0IHRoZSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fSBvZiBpbnRlcmVzdCBjcmVhdGVkIGJ5CisgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHBoeXNpY2FsSWQgb25lIG9mIHRoZSBwaHlzaWNhbCBJZHMgdXNlZCB3aGVuIHJlcXVlc3QgaXMgY3JlYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHRhZyBvbmUgb2YgdGhlIGNhcHR1cmUgcmVxdWVzdCBtZXRhZGF0YSB0YWdzIGluCisgKiAgICAgICAgICAgIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlcXVlc3Qgb3IgcGh5c2ljYWxJZCBpcyBOVUxMLCBjb3VudCBpcworICogICAgICAgICAgICAgbGFyZ2VyIHRoYW4gemVybyB3aGlsZSBkYXRhIGlzIE5VTEwsIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHRhZyBpcyBub3Qgc2lnbmVkIDMyIGJpdHMsCisgKiAgICAgICAgICAgICB0aGUgdGFnIGlzIG5vdCBjb250cm9sbGFibGUgYnkgYXBwbGljYXRpb24sIHBoeXNpY2FsSWQgaXMgbm90IG9uZSBvZiB0aGUgSWRzIHVzZWQKKyAqICAgICAgICAgICAgIGluIGNyZWF0aW5nIHRoZSByZXF1ZXN0LCBvciBpZiB0aGUgY2FwdHVyZSByZXF1ZXN0IGlzIGEgcmVndWxhciByZXF1ZXN0IHdpdGggbm8KKyAqICAgICAgICAgICAgIHBoeXNpY2FsIElkcyBhdCBhbGwuPC9saT48L3VsPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX2kzMigKKyAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCBjb25zdCBjaGFyKiBwaHlzaWNhbElkLCB1aW50MzJfdCB0YWcsCisgICAgICAgIHVpbnQzMl90IGNvdW50LCBjb25zdCBpbnQzMl90KiBkYXRhKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIFNldC9jaGFuZ2UgYSBjYW1lcmEgY2FwdHVyZSBjb250cm9sIGVudHJ5IHdpdGggZmxvYXQgZGF0YSB0eXBlIGZvcgorICogYSBwaHlzaWNhbCBjYW1lcmEgb2YgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBkZXZpY2UuCisgKgorICogPHA+U2FtZSBhcyBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfZmxvYXQsIGV4Y2VwdCB0aGF0IGlmIHtAbGluayB0YWd9IGlzIGNvbnRhaW5lZAorICogaW4ge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoaXMgZnVuY3Rpb24KKyAqIHNldHMgdGhlIGVudHJ5IGZvciBhIHBhcnRpY3VsYXIgcGh5c2ljYWwgc3ViLWNhbWVyYSBiYWNraW5nIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAqIElmIHtAbGluayB0YWd9IGlzIG5vdCBjb250YWluZWQgaW4KKyAqIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGUga2V5IHdpbGwgYmUgaWdub3JlZAorICogYnkgdGhlIGNhbWVyYSBkZXZpY2UuPC9wPgorICoKKyAqIEBwYXJhbSByZXF1ZXN0IHRoZSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fSBvZiBpbnRlcmVzdCBjcmVhdGVkIGJ5CisgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHBoeXNpY2FsSWQgb25lIG9mIHRoZSBwaHlzaWNhbCBJZHMgdXNlZCB3aGVuIHJlcXVlc3QgaXMgY3JlYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHRhZyBvbmUgb2YgdGhlIGNhcHR1cmUgcmVxdWVzdCBtZXRhZGF0YSB0YWdzIGluCisgKiAgICAgICAgICAgIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlcXVlc3Qgb3IgcGh5c2ljYWxJZCBpcyBOVUxMLCBjb3VudCBpcworICogICAgICAgICAgICAgbGFyZ2VyIHRoYW4gemVybyB3aGlsZSBkYXRhIGlzIE5VTEwsIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHRhZyBpcyBub3QgZmxvYXQsCisgKiAgICAgICAgICAgICB0aGUgdGFnIGlzIG5vdCBjb250cm9sbGFibGUgYnkgYXBwbGljYXRpb24sIHBoeXNpY2FsSWQgaXMgbm90IG9uZSBvZiB0aGUgSWRzIHVzZWQKKyAqICAgICAgICAgICAgIGluIGNyZWF0aW5nIHRoZSByZXF1ZXN0LCBvciBpZiB0aGUgY2FwdHVyZSByZXF1ZXN0IGlzIGEgcmVndWxhciByZXF1ZXN0IHdpdGggbm8KKyAqICAgICAgICAgICAgIHBoeXNpY2FsIElkcyBhdCBhbGwuPC9saT48L3VsPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX2Zsb2F0KAorICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIGNvbnN0IGNoYXIqIHBoeXNpY2FsSWQsIHVpbnQzMl90IHRhZywKKyAgICAgICAgdWludDMyX3QgY291bnQsIGNvbnN0IGZsb2F0KiBkYXRhKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIFNldC9jaGFuZ2UgYSBjYW1lcmEgY2FwdHVyZSBjb250cm9sIGVudHJ5IHdpdGggc2lnbmVkIDY0IGJpdHMgZGF0YSB0eXBlIGZvcgorICogYSBwaHlzaWNhbCBjYW1lcmEgb2YgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBkZXZpY2UuCisgKgorICogPHA+U2FtZSBhcyBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfaTY0LCBleGNlcHQgdGhhdCBpZiB7QGxpbmsgdGFnfSBpcyBjb250YWluZWQKKyAqIGluIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGlzIGZ1bmN0aW9uCisgKiBzZXRzIHRoZSBlbnRyeSBmb3IgYSBwYXJ0aWN1bGFyIHBoeXNpY2FsIHN1Yi1jYW1lcmEgYmFja2luZyB0aGUgbG9naWNhbCBtdWx0aS1jYW1lcmEuCisgKiBJZiB7QGxpbmsgdGFnfSBpcyBub3QgY29udGFpbmVkIGluCisgKiB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfSwgdGhlIGtleSB3aWxsIGJlIGlnbm9yZWQKKyAqIGJ5IHRoZSBjYW1lcmEgZGV2aWNlLjwvcD4KKyAqCisgKiBAcGFyYW0gcmVxdWVzdCB0aGUge0BsaW5rIEFDYXB0dXJlUmVxdWVzdH0gb2YgaW50ZXJlc3QgY3JlYXRlZCBieQorICogICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSBwaHlzaWNhbElkIG9uZSBvZiB0aGUgcGh5c2ljYWwgSWRzIHVzZWQgd2hlbiByZXF1ZXN0IGlzIGNyZWF0ZWQgd2l0aAorICogICAgICAgICAgICAgICAgICAge0BsaW5rIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzfS4KKyAqIEBwYXJhbSB0YWcgb25lIG9mIHRoZSBjYXB0dXJlIHJlcXVlc3QgbWV0YWRhdGEgdGFncyBpbgorICogICAgICAgICAgICB7QGxpbmsgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9QSFlTSUNBTF9DQU1FUkFfUkVRVUVTVF9LRVlTfS4KKyAqCisgKiBAcmV0dXJuIDx1bD4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX09LfSBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZHMuPC9saT4KKyAqICAgICAgICAgPGxpPntAbGluayBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSfSBpZiByZXF1ZXN0IG9yIHBoeXNpY2FsSWQgaXMgTlVMTCwgY291bnQgaXMKKyAqICAgICAgICAgICAgIGxhcmdlciB0aGFuIHplcm8gd2hpbGUgZGF0YSBpcyBOVUxMLCB0aGUgZGF0YSB0eXBlIG9mIHRoZSB0YWcgaXMgbm90IHNpZ25lZCA2NCBiaXRzLAorICogICAgICAgICAgICAgdGhlIHRhZyBpcyBub3QgY29udHJvbGxhYmxlIGJ5IGFwcGxpY2F0aW9uLCBwaHlzaWNhbElkIGlzIG5vdCBvbmUgb2YgdGhlIElkcyB1c2VkCisgKiAgICAgICAgICAgICBpbiBjcmVhdGluZyB0aGUgcmVxdWVzdCwgb3IgaWYgdGhlIGNhcHR1cmUgcmVxdWVzdCBpcyBhIHJlZ3VsYXIgcmVxdWVzdCB3aXRoIG5vCisgKiAgICAgICAgICAgICBwaHlzaWNhbCBJZHMgYXQgYWxsLjwvbGk+PC91bD4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV9pNjQoCisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgY29uc3QgY2hhciogcGh5c2ljYWxJZCwgdWludDMyX3QgdGFnLAorICAgICAgICB1aW50MzJfdCBjb3VudCwgY29uc3QgaW50NjRfdCogZGF0YSkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBTZXQvY2hhbmdlIGEgY2FtZXJhIGNhcHR1cmUgY29udHJvbCBlbnRyeSB3aXRoIGRvdWJsZSBkYXRhIHR5cGUgZm9yCisgKiBhIHBoeXNpY2FsIGNhbWVyYSBvZiBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhIGRldmljZS4KKyAqCisgKiA8cD5TYW1lIGFzIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9kb3VibGUsIGV4Y2VwdCB0aGF0IGlmIHtAbGluayB0YWd9IGlzIGNvbnRhaW5lZAorICogaW4ge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoaXMgZnVuY3Rpb24KKyAqIHNldHMgdGhlIGVudHJ5IGZvciBhIHBhcnRpY3VsYXIgcGh5c2ljYWwgc3ViLWNhbWVyYSBiYWNraW5nIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAqIElmIHtAbGluayB0YWd9IGlzIG5vdCBjb250YWluZWQgaW4KKyAqIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGUga2V5IHdpbGwgYmUgaWdub3JlZAorICogYnkgdGhlIGNhbWVyYSBkZXZpY2UuPC9wPgorICoKKyAqIEBwYXJhbSByZXF1ZXN0IHRoZSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fSBvZiBpbnRlcmVzdCBjcmVhdGVkIGJ5CisgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHBoeXNpY2FsSWQgb25lIG9mIHRoZSBwaHlzaWNhbCBJZHMgdXNlZCB3aGVuIHJlcXVlc3QgaXMgY3JlYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHRhZyBvbmUgb2YgdGhlIGNhcHR1cmUgcmVxdWVzdCBtZXRhZGF0YSB0YWdzIGluCisgKiAgICAgICAgICAgIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlcXVlc3Qgb3IgcGh5c2ljYWxJZCBpcyBOVUxMLCBjb3VudCBpcworICogICAgICAgICAgICAgbGFyZ2VyIHRoYW4gemVybyB3aGlsZSBkYXRhIGlzIE5VTEwsIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHRhZyBpcyBub3QgZG91YmxlLAorICogICAgICAgICAgICAgdGhlIHRhZyBpcyBub3QgY29udHJvbGxhYmxlIGJ5IGFwcGxpY2F0aW9uLCBwaHlzaWNhbElkIGlzIG5vdCBvbmUgb2YgdGhlIElkcyB1c2VkCisgKiAgICAgICAgICAgICBpbiBjcmVhdGluZyB0aGUgcmVxdWVzdCwgb3IgaWYgdGhlIGNhcHR1cmUgcmVxdWVzdCBpcyBhIHJlZ3VsYXIgcmVxdWVzdCB3aXRoIG5vCisgKiAgICAgICAgICAgICBwaHlzaWNhbCBJZHMgYXQgYWxsLjwvbGk+PC91bD4KKyAqLworY2FtZXJhX3N0YXR1c190IEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV9kb3VibGUoCisgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgY29uc3QgY2hhciogcGh5c2ljYWxJZCwgdWludDMyX3QgdGFnLAorICAgICAgICB1aW50MzJfdCBjb3VudCwgY29uc3QgZG91YmxlKiBkYXRhKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCisvKioKKyAqIFNldC9jaGFuZ2UgYSBjYW1lcmEgY2FwdHVyZSBjb250cm9sIGVudHJ5IHdpdGggcmF0aW9uYWwgZGF0YSB0eXBlIGZvcgorICogYSBwaHlzaWNhbCBjYW1lcmEgb2YgYSBsb2dpY2FsIG11bHRpLWNhbWVyYSBkZXZpY2UuCisgKgorICogPHA+U2FtZSBhcyBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcmF0aW9uYWwsIGV4Y2VwdCB0aGF0IGlmIHtAbGluayB0YWd9IGlzIGNvbnRhaW5lZAorICogaW4ge0BsaW5rIEFDQU1FUkFfUkVRVUVTVF9BVkFJTEFCTEVfUEhZU0lDQUxfQ0FNRVJBX1JFUVVFU1RfS0VZU30sIHRoaXMgZnVuY3Rpb24KKyAqIHNldHMgdGhlIGVudHJ5IGZvciBhIHBhcnRpY3VsYXIgcGh5c2ljYWwgc3ViLWNhbWVyYSBiYWNraW5nIHRoZSBsb2dpY2FsIG11bHRpLWNhbWVyYS4KKyAqIElmIHtAbGluayB0YWd9IGlzIG5vdCBjb250YWluZWQgaW4KKyAqIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LCB0aGUga2V5IHdpbGwgYmUgaWdub3JlZAorICogYnkgdGhlIGNhbWVyYSBkZXZpY2UuPC9wPgorICoKKyAqIEBwYXJhbSByZXF1ZXN0IHRoZSB7QGxpbmsgQUNhcHR1cmVSZXF1ZXN0fSBvZiBpbnRlcmVzdCBjcmVhdGVkIGJ5CisgKiAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHBoeXNpY2FsSWQgb25lIG9mIHRoZSBwaHlzaWNhbCBJZHMgdXNlZCB3aGVuIHJlcXVlc3QgaXMgY3JlYXRlZCB3aXRoCisgKiAgICAgICAgICAgICAgICAgICB7QGxpbmsgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlUmVxdWVzdF93aXRoUGh5c2ljYWxJZHN9LgorICogQHBhcmFtIHRhZyBvbmUgb2YgdGhlIGNhcHR1cmUgcmVxdWVzdCBtZXRhZGF0YSB0YWdzIGluCisgKiAgICAgICAgICAgIHtAbGluayBBQ0FNRVJBX1JFUVVFU1RfQVZBSUxBQkxFX1BIWVNJQ0FMX0NBTUVSQV9SRVFVRVNUX0tFWVN9LgorICoKKyAqIEByZXR1cm4gPHVsPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgorICogICAgICAgICA8bGk+e0BsaW5rIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVJ9IGlmIHJlcXVlc3Qgb3IgcGh5c2ljYWxJZCBpcyBOVUxMLCBjb3VudCBpcworICogICAgICAgICAgICAgbGFyZ2VyIHRoYW4gemVybyB3aGlsZSBkYXRhIGlzIE5VTEwsIHRoZSBkYXRhIHR5cGUgb2YgdGhlIHRhZyBpcyBub3QgcmF0aW9uYWwsCisgKiAgICAgICAgICAgICB0aGUgdGFnIGlzIG5vdCBjb250cm9sbGFibGUgYnkgYXBwbGljYXRpb24sIHBoeXNpY2FsSWQgaXMgbm90IG9uZSBvZiB0aGUgSWRzIHVzZWQKKyAqICAgICAgICAgICAgIGluIGNyZWF0aW5nIHRoZSByZXF1ZXN0LCBvciBpZiB0aGUgY2FwdHVyZSByZXF1ZXN0IGlzIGEgcmVndWxhciByZXF1ZXN0IHdpdGggbm8KKyAqICAgICAgICAgICAgIHBoeXNpY2FsIElkcyBhdCBhbGwuPC9saT48L3VsPgorICovCitjYW1lcmFfc3RhdHVzX3QgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX3JhdGlvbmFsKAorICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqIHJlcXVlc3QsIGNvbnN0IGNoYXIqIHBoeXNpY2FsSWQsIHVpbnQzMl90IHRhZywKKyAgICAgICAgdWludDMyX3QgY291bnQsIGNvbnN0IEFDYW1lcmFNZXRhZGF0YV9yYXRpb25hbCogZGF0YSkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLyogX05ES19DQVBUVVJFX1JFUVVFU1RfSCAqLwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9saWJjYW1lcmEybmRrLm1hcC50eHQgYi9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dAppbmRleCBhMjllOTZkLi5iNmYxNTUzIDEwMDY0NAotLS0gYS9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dAorKysgYi9jYW1lcmEvbmRrL2xpYmNhbWVyYTJuZGsubWFwLnR4dApAQCAtMiwxNSArMiwxOSBAQAogICBnbG9iYWw6CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2Fib3J0Q2FwdHVyZXM7CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmU7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfY2FwdHVyZTsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2Nsb3NlOwogICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9nZXREZXZpY2U7CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3NldFJlcGVhdGluZ1JlcXVlc3Q7CisgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2xvZ2ljYWxDYW1lcmFfc2V0UmVwZWF0aW5nUmVxdWVzdDsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0b3BSZXBlYXRpbmc7CiAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3VwZGF0ZVNoYXJlZE91dHB1dDsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQUNhbWVyYURldmljZV9jbG9zZTsKICAgICBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0OworICAgIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3Rfd2l0aFBoeXNpY2FsSWRzOyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9uOwogICAgIEFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVNlc3Npb25XaXRoU2Vzc2lvblBhcmFtZXRlcnM7ICMgaW50cm9kdWNlZD0yOAorICAgIEFDYW1lcmFEZXZpY2VfaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZDsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhbWVyYURldmljZV9nZXRJZDsKICAgICBBQ2FtZXJhTWFuYWdlcl9jcmVhdGU7CiAgICAgQUNhbWVyYU1hbmFnZXJfZGVsZXRlOwpAQCAtMjAsMTAgKzI0LDEzIEBACiAgICAgQUNhbWVyYU1hbmFnZXJfb3BlbkNhbWVyYTsKICAgICBBQ2FtZXJhTWFuYWdlcl9yZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrOwogICAgIEFDYW1lcmFNYW5hZ2VyX3VucmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjazsKKyAgICBBQ2FtZXJhTWFuYWdlcl9yZWdpc3RlckV4dGVuZGVkQXZhaWxhYmlsaXR5Q2FsbGJhY2s7ICMgaW50cm9kdWNlZD0yOQorICAgIEFDYW1lcmFNYW5hZ2VyX3VucmVnaXN0ZXJFeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrOyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FtZXJhTWV0YWRhdGFfY29weTsKICAgICBBQ2FtZXJhTWV0YWRhdGFfZnJlZTsKICAgICBBQ2FtZXJhTWV0YWRhdGFfZ2V0QWxsVGFnczsKICAgICBBQ2FtZXJhTWV0YWRhdGFfZ2V0Q29uc3RFbnRyeTsKKyAgICBBQ2FtZXJhTWV0YWRhdGFfaXNMb2dpY2FsTXVsdGlDYW1lcmE7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYW1lcmFPdXRwdXRUYXJnZXRfY3JlYXRlOwogICAgIEFDYW1lcmFPdXRwdXRUYXJnZXRfZnJlZTsKICAgICBBQ2FwdHVyZVJlcXVlc3RfYWRkVGFyZ2V0OwpAQCAtMzEsMTQgKzM4LDIxIEBACiAgICAgQUNhcHR1cmVSZXF1ZXN0X2ZyZWU7CiAgICAgQUNhcHR1cmVSZXF1ZXN0X2dldEFsbFRhZ3M7CiAgICAgQUNhcHR1cmVSZXF1ZXN0X2dldENvbnN0RW50cnk7CisgICAgQUNhcHR1cmVSZXF1ZXN0X2dldENvbnN0RW50cnlfcGh5c2ljYWxDYW1lcmE7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYXB0dXJlUmVxdWVzdF9nZXRVc2VyQ29udGV4dDsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQUNhcHR1cmVSZXF1ZXN0X3JlbW92ZVRhcmdldDsKICAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfZG91YmxlOworICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9waHlzaWNhbENhbWVyYV9kb3VibGU7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9mbG9hdDsKKyAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcGh5c2ljYWxDYW1lcmFfZmxvYXQ7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYXB0dXJlUmVxdWVzdF9zZXRFbnRyeV9pMzI7CisgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX2kzMjsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X2k2NDsKKyAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcGh5c2ljYWxDYW1lcmFfaTY0OyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfcmF0aW9uYWw7CisgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX3JhdGlvbmFsOyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0RW50cnlfdTg7CisgICAgQUNhcHR1cmVSZXF1ZXN0X3NldEVudHJ5X3BoeXNpY2FsQ2FtZXJhX3U4OyAjIGludHJvZHVjZWQ9MjkKICAgICBBQ2FwdHVyZVJlcXVlc3Rfc2V0VXNlckNvbnRleHQ7ICMgaW50cm9kdWNlZD0yOAogICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9hZGQ7CiAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX2NyZWF0ZTsKQEAgLTQ4LDYgKzYyLDcgQEAKICAgICBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfY3JlYXRlOyAjIGludHJvZHVjZWQ9MjgKICAgICBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfYWRkOyAjIGludHJvZHVjZWQ9MjgKICAgICBBQ2FwdHVyZVNlc3Npb25TaGFyZWRPdXRwdXRfcmVtb3ZlOyAjIGludHJvZHVjZWQ9MjgKKyAgICBBQ2FwdHVyZVNlc3Npb25QaHlzaWNhbE91dHB1dF9jcmVhdGU7ICMgaW50cm9kdWNlZD0yOQogICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlOwogICBsb2NhbDoKICAgICAqOwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uVmVuZG9yLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhQ2FwdHVyZVNlc3Npb25WZW5kb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMWFmOGMxCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYUNhcHR1cmVTZXNzaW9uVmVuZG9yLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSAidXRpbHMuaCIKKworc3RydWN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCB7CisgICAgZXhwbGljaXQgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KG5hdGl2ZV9oYW5kbGVfdCogd2luZG93LCBib29sIGlzU2hhcmVkID0gZmFsc2UsCisgICAgICAgICAgICBjb25zdCBjaGFyKiBwaHlzaWNhbENhbWVyYUlkID0gIiIpIDoKKyAgICAgICAgICAgIG1XaW5kb3cod2luZG93KSwgbUlzU2hhcmVkKGlzU2hhcmVkKSwgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCkge307CisKKyAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAobVdpbmRvdyA9PSBvdGhlci5tV2luZG93KTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yICE9IChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtV2luZG93ICE9IG90aGVyLm1XaW5kb3c7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXQmIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtV2luZG93IDwgb3RoZXIubVdpbmRvdzsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yID4gKGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgPiBvdGhlci5tV2luZG93OworICAgIH0KKworICAgIGFuZHJvaWQ6OmFjYW06OnV0aWxzOjpuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIG1XaW5kb3c7CisgICAgc3RkOjpzZXQ8YW5kcm9pZDo6YWNhbTo6dXRpbHM6Om5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXI+IG1TaGFyZWRXaW5kb3dzOworICAgIGJvb2wgICAgICAgICAgIG1Jc1NoYXJlZDsKKyAgICBpbnQgICAgICAgICAgICBtUm90YXRpb24gPSBDQU1FUkEzX1NUUkVBTV9ST1RBVElPTl8wOworICAgIHN0ZDo6c3RyaW5nIG1QaHlzaWNhbENhbWVyYUlkOworfTsKKworCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MTFhM2YKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmNwcApAQCAtMCwwICsxLDE3MTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFDYW1lcmFEZXZpY2VWZW5kb3IiCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxDYW1lcmFNZXRhZGF0YS5oPgorCisjaW5jbHVkZSAibmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaCIKKyNpbmNsdWRlICJBQ2FtZXJhQ2FwdHVyZVNlc3Npb24uaCIKKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJBQ2FwdHVyZVJlcXVlc3QuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCisjaW5jbHVkZSAiQUNhbWVyYUNhcHR1cmVTZXNzaW9uLmluYyIKKworI2RlZmluZSBDSEVDS19UUkFOU0FDVElPTl9BTkRfUkVUKHJlbW90ZVJldCwgc3RhdHVzLCBjYWxsTmFtZSkgXAorICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSkgeyBcCisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZHVyaW5nICVzIGNhbGwgJXMiLCBfX0ZVTkNUSU9OX18sIGNhbGxOYW1lLCBcCisgICAgICAgICAgICAgICAgICByZW1vdGVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsgXAorICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOyBcCisgICAgfSBcCisgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7IFwKKyAgICAgICAgQUxPR0UoIiVzOiAlcyBjYWxsIGZhaWxlZCIsIF9fRlVOQ1RJT05fXywgY2FsbE5hbWUpOyBcCisgICAgICAgIHJldHVybiB1dGlsczo6Y29udmVydEZyb21IaWRsKHN0YXR1cyk7IFwKKyAgICB9CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitBQ2FtZXJhRGV2aWNlOjp+QUNhbWVyYURldmljZSgpIHsKKyAgICBtRGV2aWNlLT5zdG9wTG9vcGVyQW5kRGlzY29ubmVjdCgpOworfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKK3VzaW5nIEhDYW1lcmFNZXRhZGF0YSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBPdXRwdXRDb25maWd1cmF0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpPdXRwdXRDb25maWd1cmF0aW9uOwordXNpbmcgU2Vzc2lvbkNvbmZpZ3VyYXRpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlNlc3Npb25Db25maWd1cmF0aW9uOwordXNpbmcgaGFyZHdhcmU6OlZvaWQ7CisKKy8vIFN0YXRpYyBtZW1iZXIgZGVmaW5pdGlvbnMKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NvbnRleHRLZXkgICAgICAgID0gIkNvbnRleHQiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprRGV2aWNlS2V5ICAgICAgICAgPSAiRGV2aWNlIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0Vycm9yQ29kZUtleSAgICAgID0gIkVycm9yQ29kZSI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDYWxsYmFja0ZwS2V5ICAgICA9ICJDYWxsYmFjayI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtTZXNzaW9uU3BLZXkgICAgICA9ICJTZXNzaW9uU3AiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprQ2FwdHVyZVJlcXVlc3RLZXkgPSAiQ2FwdHVyZVJlcXVlc3QiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprVGltZVN0YW1wS2V5ICAgICAgPSAiVGltZVN0YW1wIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0NhcHR1cmVSZXN1bHRLZXkgID0gIkNhcHR1cmVSZXN1bHQiOworY29uc3QgY2hhciogQ2FtZXJhRGV2aWNlOjprUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5ID0gIlBoeXNpY2FsQ2FwdHVyZVJlc3VsdCI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtDYXB0dXJlRmFpbHVyZUtleSA9ICJDYXB0dXJlRmFpbHVyZSI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtTZXF1ZW5jZUlkS2V5ICAgICA9ICJTZXF1ZW5jZUlkIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0ZyYW1lTnVtYmVyS2V5ICAgID0gIkZyYW1lTnVtYmVyIjsKK2NvbnN0IGNoYXIqIENhbWVyYURldmljZTo6a0Fud0tleSAgICAgICAgICAgID0gIkFudyI7Citjb25zdCBjaGFyKiBDYW1lcmFEZXZpY2U6OmtGYWlsaW5nUGh5c2ljYWxDYW1lcmFJZD0gIkZhaWxpbmdQaHlzaWNhbENhbWVyYUlkIjsKKworLyoqCisgKiBDYW1lcmFEZXZpY2UgSW1wbGVtZW50YXRpb24KKyAqLworQ2FtZXJhRGV2aWNlOjpDYW1lcmFEZXZpY2UoCisgICAgICAgIGNvbnN0IGNoYXIqIGlkLAorICAgICAgICBBQ2FtZXJhRGV2aWNlX1N0YXRlQ2FsbGJhY2tzKiBjYiwKKyAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKKyAgICAgICAgQUNhbWVyYURldmljZSogd3JhcHBlcikgOgorICAgICAgICBtQ2FtZXJhSWQoaWQpLAorICAgICAgICBtQXBwQ2FsbGJhY2tzKCpjYiksCisgICAgICAgIG1DaGFycyhzdGQ6Om1vdmUoY2hhcnMpKSwKKyAgICAgICAgbVNlcnZpY2VDYWxsYmFjayhuZXcgU2VydmljZUNhbGxiYWNrKHRoaXMpKSwKKyAgICAgICAgbVdyYXBwZXIod3JhcHBlciksCisgICAgICAgIG1JbkVycm9yKGZhbHNlKSwKKyAgICAgICAgbUVycm9yKEFDQU1FUkFfT0spLAorICAgICAgICBtSWRsZSh0cnVlKSwKKyAgICAgICAgbUN1cnJlbnRTZXNzaW9uKG51bGxwdHIpIHsKKyAgICBtQ2xvc2luZyA9IGZhbHNlOworICAgIC8vIFNldHVwIGxvb3BlciB0aHJlYWQgdG8gcGVyZnJvbSBkZXZpY2UgY2FsbGJhY2tzIHRvIGFwcAorICAgIG1DYkxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1DYkxvb3Blci0+c2V0TmFtZSgiQzJOLWRldi1sb29wZXIiKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQ2JMb29wZXItPnN0YXJ0KAorICAgICAgICAgICAgLypydW5PbkNhbGxpbmdUaHJlYWQqL2ZhbHNlLAorICAgICAgICAgICAgLypjYW5DYWxsSmF2YSovICAgICAgIHRydWUsCisgICAgICAgICAgICBQUklPUklUWV9ERUZBVUxUKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHN0YXJ0IGNhbWVyYSBkZXZpY2UgY2FsbGJhY2sgbG9vcGVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1lcnIpLCBlcnIpOworICAgICAgICBzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgIH0KKyAgICBtSGFuZGxlciA9IG5ldyBDYWxsYmFja0hhbmRsZXIoaWQpOworICAgIG1DYkxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKKworICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSA9IG1DaGFycy0+Z2V0SW50ZXJuYWxEYXRhKCk7CisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX1JFUVVFU1RfUEFSVElBTF9SRVNVTFRfQ09VTlQpOworICAgIGlmIChlbnRyeS5jb3VudCAhPSAxKSB7CisgICAgICAgIEFMT0dXKCIlczogYmFkIGNvdW50ICV6dSBmb3IgcGFydGlhbCByZXN1bHQgY291bnQiLCBfX0ZVTkNUSU9OX18sIGVudHJ5LmNvdW50KTsKKyAgICAgICAgbVBhcnRpYWxSZXN1bHRDb3VudCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVBhcnRpYWxSZXN1bHRDb3VudCA9IGVudHJ5LmRhdGEuaTMyWzBdOworICAgIH0KKworICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFKTsKKyAgICBpZiAoZW50cnkuY291bnQgIT0gMikgeworICAgICAgICBBTE9HVygiJXM6IGJhZCBjb3VudCAlenUgZm9yIHNoYWRpbmcgbWFwIHNpemUiLCBfX0ZVTkNUSU9OX18sIGVudHJ5LmNvdW50KTsKKyAgICAgICAgbVNoYWRpbmdNYXBTaXplWzBdID0gMDsKKyAgICAgICAgbVNoYWRpbmdNYXBTaXplWzFdID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2hhZGluZ01hcFNpemVbMF0gPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICAgICAgbVNoYWRpbmdNYXBTaXplWzFdID0gZW50cnkuZGF0YS5pMzJbMV07CisgICAgfQorfQorCitDYW1lcmFEZXZpY2U6On5DYW1lcmFEZXZpY2UoKSB7IH0KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAoc3A8QU1lc3NhZ2U+JiBtc2cpIHsKKyAgICBtc2ctPnBvc3QoKTsKKyAgICBtc2cuY2xlYXIoKTsKKyAgICBzcDxBTWVzc2FnZT4gY2xlYW51cE1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENsZWFuVXBTZXNzaW9ucywgbUhhbmRsZXIpOworICAgIGNsZWFudXBNc2ctPnBvc3QoKTsKK30KKworLy8gVE9ETzogY2FjaGVkIGNyZWF0ZWQgcmVxdWVzdD8KK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpjcmVhdGVDYXB0dXJlUmVxdWVzdCgKKyAgICAgICAgQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQsCisgICAgICAgIGNvbnN0IEFDYW1lcmFJZExpc3QqIHBoeXNpY2FsQ2FtZXJhSWRMaXN0LAorICAgICAgICBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0KSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIGlmIChtUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisgICAgQ2FtZXJhTWV0YWRhdGEgcmF3UmVxdWVzdDsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpVTktOT1dOX0VSUk9SOworICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoCisgICAgICAgIHV0aWxzOjpjb252ZXJ0VG9IaWRsKHRlbXBsYXRlSWQpLAorICAgICAgICBbJnN0YXR1cywgJnJhd1JlcXVlc3RdKGF1dG8gcywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJm1ldGFkYXRhKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok5PX0VSUk9SICYmIHV0aWxzOjpjb252ZXJ0RnJvbUhpZGxDbG9uZWQobWV0YWRhdGEsICZyYXdSZXF1ZXN0KSkgeworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENvdWxkbid0IGNyZWF0ZSBkZWZhdWx0IHJlcXVlc3QiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICBDSEVDS19UUkFOU0FDVElPTl9BTkRfUkVUKHJlbW90ZVJldCwgc3RhdHVzLCAiY3JlYXRlRGVmYXVsdFJlcXVlc3QoKSIpCisgICAgQUNhcHR1cmVSZXF1ZXN0KiBvdXRSZXEgPSBuZXcgQUNhcHR1cmVSZXF1ZXN0KCk7CisgICAgb3V0UmVxLT5zZXR0aW5ncyA9IG5ldyBBQ2FtZXJhTWV0YWRhdGEocmF3UmVxdWVzdC5yZWxlYXNlKCksIEFDYW1lcmFNZXRhZGF0YTo6QUNNX1JFUVVFU1QpOworICAgIGlmIChwaHlzaWNhbENhbWVyYUlkTGlzdCAhPSBudWxscHRyKSB7CisgICAgICAgIGZvciAoYXV0byBpID0gMDsgaSA8IHBoeXNpY2FsQ2FtZXJhSWRMaXN0LT5udW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgICAgIG91dFJlcS0+cGh5c2ljYWxTZXR0aW5ncy5lbXBsYWNlKHBoeXNpY2FsQ2FtZXJhSWRMaXN0LT5jYW1lcmFJZHNbaV0sCisgICAgICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhTWV0YWRhdGEoKihvdXRSZXEtPnNldHRpbmdzKSkpOworICAgICAgICB9CisgICAgfQorICAgIG91dFJlcS0+dGFyZ2V0cyAgPSBuZXcgQUNhbWVyYU91dHB1dFRhcmdldHMoKTsKKyAgICAqcmVxdWVzdCA9IG91dFJlcTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmNyZWF0ZUNhcHR1cmVTZXNzaW9uKAorICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqICAgICAgIG91dHB1dHMsCisgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCisgICAgICAgIGNvbnN0IEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyogY2FsbGJhY2tzLAorICAgICAgICAvKm91dCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiogc2Vzc2lvbikgeworICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gY3VycmVudFNlc3Npb24gPSBtQ3VycmVudFNlc3Npb24ucHJvbW90ZSgpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGV2aWNlTG9jayk7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChjdXJyZW50U2Vzc2lvbiAhPSBudWxscHRyKSB7CisgICAgICAgIGN1cnJlbnRTZXNzaW9uLT5jbG9zZUJ5RGV2aWNlKCk7CisgICAgICAgIHN0b3BSZXBlYXRpbmdMb2NrZWQoKTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgbmV3IHNlc3Npb24KKyAgICByZXQgPSBjb25maWd1cmVTdHJlYW1zTG9ja2VkKG91dHB1dHMsIHNlc3Npb25QYXJhbWV0ZXJzKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIkZhaWwgdG8gY3JlYXRlIG5ldyBzZXNzaW9uLiBjYW5ub3QgY29uZmlndXJlIHN0cmVhbXMiKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIG5ld1Nlc3Npb24gPSBuZXcgQUNhbWVyYUNhcHR1cmVTZXNzaW9uKAorICAgICAgICAgICAgbU5leHRTZXNzaW9uSWQrKywgb3V0cHV0cywgY2FsbGJhY2tzLCB0aGlzKTsKKworICAgIC8vIHNldCBuZXcgc2Vzc2lvbiBhcyBjdXJyZW50IHNlc3Npb24KKyAgICBuZXdTZXNzaW9uLT5pbmNTdHJvbmcoKHZvaWQgKikgQUNhbWVyYURldmljZV9jcmVhdGVDYXB0dXJlU2Vzc2lvbik7CisgICAgbUN1cnJlbnRTZXNzaW9uID0gbmV3U2Vzc2lvbjsKKyAgICBtRmx1c2hpbmcgPSBmYWxzZTsKKyAgICAqc2Vzc2lvbiA9IG5ld1Nlc3Npb247CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdCBDYW1lcmFEZXZpY2U6OmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogc2Vzc2lvbk91dHB1dENvbnRhaW5lcikgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGV2aWNlTG9jayk7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIFNlc3Npb25Db25maWd1cmF0aW9uIHNlc3Npb25Db25maWc7CisgICAgc2Vzc2lvbkNvbmZpZy5pbnB1dFdpZHRoID0gMDsKKyAgICBzZXNzaW9uQ29uZmlnLmlucHV0SGVpZ2h0ID0gMDsKKyAgICBzZXNzaW9uQ29uZmlnLmlucHV0Rm9ybWF0ID0gLTE7CisgICAgc2Vzc2lvbkNvbmZpZy5vcGVyYXRpb25Nb2RlID0gU3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6Ok5PUk1BTF9NT0RFOworICAgIHNlc3Npb25Db25maWcub3V0cHV0U3RyZWFtcy5yZXNpemUoc2Vzc2lvbk91dHB1dENvbnRhaW5lci0+bU91dHB1dHMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaW5kZXggPSAwOworICAgIGZvciAoY29uc3QgYXV0byYgb3V0cHV0IDogc2Vzc2lvbk91dHB1dENvbnRhaW5lci0+bU91dHB1dHMpIHsKKyAgICAgICAgc2Vzc2lvbkNvbmZpZy5vdXRwdXRTdHJlYW1zW2luZGV4XS5yb3RhdGlvbiA9IHV0aWxzOjpjb252ZXJ0VG9IaWRsKG91dHB1dC5tUm90YXRpb24pOworICAgICAgICBzZXNzaW9uQ29uZmlnLm91dHB1dFN0cmVhbXNbaW5kZXhdLndpbmRvd0dyb3VwSWQgPSAtMTsKKyAgICAgICAgc2Vzc2lvbkNvbmZpZy5vdXRwdXRTdHJlYW1zW2luZGV4XS53aW5kb3dIYW5kbGVzLnJlc2l6ZShvdXRwdXQubVNoYXJlZFdpbmRvd3Muc2l6ZSgpICsgMSk7CisgICAgICAgIHNlc3Npb25Db25maWcub3V0cHV0U3RyZWFtc1tpbmRleF0ud2luZG93SGFuZGxlc1swXSA9IG91dHB1dC5tV2luZG93OworICAgICAgICBzZXNzaW9uQ29uZmlnLm91dHB1dFN0cmVhbXNbaW5kZXhdLnBoeXNpY2FsQ2FtZXJhSWQgPSBvdXRwdXQubVBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgIGluZGV4Kys7CisgICAgfQorCisgICAgYm9vbCBjb25maWdTdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpVTktOT1dOX0VSUk9SOworICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChzZXNzaW9uQ29uZmlnLAorICAgICAgICBbJnN0YXR1cywgJmNvbmZpZ1N1cHBvcnRlZF0oYXV0byBzLCBhdXRvIHN1cHBvcnRlZCkgeworICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgIGNvbmZpZ1N1cHBvcnRlZCA9IHN1cHBvcnRlZDsKKyAgICAgICAgfSk7CisKKyAgICBDSEVDS19UUkFOU0FDVElPTl9BTkRfUkVUKHJlbW90ZVJldCwgc3RhdHVzLCAiaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgpIik7CisgICAgcmV0dXJuIGNvbmZpZ1N1cHBvcnRlZCA/IEFDQU1FUkFfT0sgOiBBQ0FNRVJBX0VSUk9SX1NUUkVBTV9DT05GSUdVUkVfRkFJTDsKK30KKworc3RhdGljIHZvaWQgYWRkTWV0YWRhdGFUb1BoeXNpY2FsQ2FtZXJhU2V0dGluZ3MoY29uc3QgQ2FtZXJhTWV0YWRhdGEgKm1ldGFkYXRhLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQsIFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgKnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MpIHsKKyAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YUNvcHkgPSAqbWV0YWRhdGE7CisgICAgY2FtZXJhX21ldGFkYXRhX3QgKmNhbWVyYV9tZXRhZGF0YSA9IG1ldGFkYXRhQ29weS5yZWxlYXNlKCk7CisgICAgSENhbWVyYU1ldGFkYXRhIGhDYW1lcmFNZXRhZGF0YTsKKyAgICB1dGlsczo6Y29udmVydFRvSGlkbChjYW1lcmFfbWV0YWRhdGEsICZoQ2FtZXJhTWV0YWRhdGEsIC8qc2hvdWxkT3duKi8gdHJ1ZSk7CisgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5ncy0+c2V0dGluZ3MubWV0YWRhdGEoc3RkOjptb3ZlKGhDYW1lcmFNZXRhZGF0YSkpOworICAgIHBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MtPmlkID0gY2FtZXJhSWQ7Cit9CisKK3ZvaWQgQ2FtZXJhRGV2aWNlOjphZGRSZXF1ZXN0U2V0dGluZ3NNZXRhZGF0YShBQ2FwdHVyZVJlcXVlc3QgKmFDYXB0dXJlUmVxdWVzdCwKKyAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+ICZyZXEpIHsKKyAgICByZXEtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzLnJlc2l6ZSgxICsgYUNhcHR1cmVSZXF1ZXN0LT5waHlzaWNhbFNldHRpbmdzLnNpemUoKSk7CisgICAgYWRkTWV0YWRhdGFUb1BoeXNpY2FsQ2FtZXJhU2V0dGluZ3MoJihhQ2FwdHVyZVJlcXVlc3QtPnNldHRpbmdzLT5nZXRJbnRlcm5hbERhdGEoKSksIGdldElkKCksCisgICAgICAgICAgICAgICAgICAgICYocmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5nc1swXSkpOworICAgIHNpemVfdCBpID0gMTsKKyAgICBmb3IgKGF1dG8gJnBoeXNpY2FsU2V0dGluZyA6IGFDYXB0dXJlUmVxdWVzdC0+cGh5c2ljYWxTZXR0aW5ncykgeworICAgICAgICBhZGRNZXRhZGF0YVRvUGh5c2ljYWxDYW1lcmFTZXR0aW5ncygmKHBoeXNpY2FsU2V0dGluZy5zZWNvbmQtPmdldEludGVybmFsRGF0YSgpKSwKKyAgICAgICAgICAgICAgICBwaHlzaWNhbFNldHRpbmcuZmlyc3QsICYocmVxLT5tUGh5c2ljYWxDYW1lcmFTZXR0aW5nc1tpXSkpOworICAgICAgICBpKys7CisgICAgfQorfQorCitjYW1lcmFfc3RhdHVzX3QgQ2FtZXJhRGV2aWNlOjp1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uTG9ja2VkKEFDYXB0dXJlU2Vzc2lvbk91dHB1dCAqb3V0cHV0KSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChvdXRwdXQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBpZiAoIW91dHB1dC0+bUlzU2hhcmVkKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBvdXRwdXQgY29uZmlndXJhdGlvbiBpcyBub3Qgc2hhcmVkIik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGludDMyX3Qgc3RyZWFtSWQgPSAtMTsKKyAgICBmb3IgKGF1dG8mIGt2UGFpciA6IG1Db25maWd1cmVkT3V0cHV0cykgeworICAgICAgICBpZiAodXRpbHM6OmlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwoa3ZQYWlyLnNlY29uZC5maXJzdCwgb3V0cHV0LT5tV2luZG93KSkgeworICAgICAgICAgICAgc3RyZWFtSWQgPSBrdlBhaXIuZmlyc3Q7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3RyZWFtSWQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJFcnJvcjogSW52YWxpZCBvdXRwdXQgY29uZmlndXJhdGlvbiIpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlciBvdXRDb25maWdXOworICAgIE91dHB1dENvbmZpZ3VyYXRpb24gJm91dENvbmZpZyA9IG91dENvbmZpZ1cubU91dHB1dENvbmZpZ3VyYXRpb247CisgICAgb3V0Q29uZmlnLnJvdGF0aW9uID0gdXRpbHM6OmNvbnZlcnRUb0hpZGwob3V0cHV0LT5tUm90YXRpb24pOworICAgIG91dENvbmZpZy53aW5kb3dIYW5kbGVzLnJlc2l6ZShvdXRwdXQtPm1TaGFyZWRXaW5kb3dzLnNpemUoKSArIDEpOworICAgIG91dENvbmZpZy53aW5kb3dIYW5kbGVzWzBdID0gb3V0cHV0LT5tV2luZG93OworICAgIG91dENvbmZpZy5waHlzaWNhbENhbWVyYUlkID0gb3V0cHV0LT5tUGh5c2ljYWxDYW1lcmFJZDsKKyAgICBpbnQgaSA9IDE7CisgICAgZm9yIChhdXRvJiBhbncgOiBvdXRwdXQtPm1TaGFyZWRXaW5kb3dzKSB7CisgICAgICAgIG91dENvbmZpZy53aW5kb3dIYW5kbGVzW2krK10gPSBhbnc7CisgICAgfQorCisgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT51cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKHN0cmVhbUlkLCBvdXRDb25maWcpOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIHVwZGF0aW5nIE91dHB1dENvbmZpZ3VyYXRpb246ICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICByZW1vdGVSZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHJlbW90ZVJldCkgeworICAgICAgICAgICAgY2FzZSBTdGF0dXM6Ok5PX0VSUk9SOgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTdGF0dXM6OklOVkFMSURfT1BFUkFUSU9OOgorICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGludmFsaWQgb3BlcmF0aW9uIiwgZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICBjYXNlIFN0YXR1czo6QUxSRUFEWV9FWElTVFM6CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgb3V0cHV0IHN1cmZhY2UgYWxyZWFkeSBleGlzdHMiLCBnZXRJZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgICAgIEFMT0dFKCJDYW1lcmEgZGV2aWNlICVzIGludmFsaWQgaW5wdXQgYXJndW1lbnQiLCBnZXRJZCgpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgZmFpbGVkIHRvIGFkZCBzaGFyZWQgb3V0cHV0IiwgZ2V0SWQoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBtQ29uZmlndXJlZE91dHB1dHNbc3RyZWFtSWRdID0gc3RkOjptYWtlX3BhaXIob3V0cHV0LT5tV2luZG93LCBvdXRDb25maWdXKTsKKworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6YWxsb2NhdGVDYXB0dXJlUmVxdWVzdExvY2tlZCgKKyAgICAgICAgY29uc3QgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0LCAvKm91dCovc3A8Q2FwdHVyZVJlcXVlc3Q+ICZvdXRSZXEpIHsKKyAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxKG5ldyBDYXB0dXJlUmVxdWVzdCgpKTsKKyAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzLnJlc2l6ZSgxICsgcmVxdWVzdC0+cGh5c2ljYWxTZXR0aW5ncy5zaXplKCkpOworCisgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICBhbGxvY2F0ZU9uZUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGEoCisgICAgICAgICAgICByZXEtPm1DYXB0dXJlUmVxdWVzdC5waHlzaWNhbENhbWVyYVNldHRpbmdzW2luZGV4KytdLCBtQ2FtZXJhSWQsIHJlcXVlc3QtPnNldHRpbmdzKTsKKworICAgIGZvciAoYXV0byYgcGh5c2ljYWxFbnRyeSA6IHJlcXVlc3QtPnBoeXNpY2FsU2V0dGluZ3MpIHsKKyAgICAgICAgYWxsb2NhdGVPbmVDYXB0dXJlUmVxdWVzdE1ldGFkYXRhKAorICAgICAgICAgICAgICAgIHJlcS0+bUNhcHR1cmVSZXF1ZXN0LnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NbaW5kZXgrK10sCisgICAgICAgICAgICAgICAgcGh5c2ljYWxFbnRyeS5maXJzdCwgcGh5c2ljYWxFbnRyeS5zZWNvbmQpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHJlcXVlc3RTdHJlYW1JZHhMaXN0OworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IHJlcXVlc3RTdXJmYWNlSWR4TGlzdDsKKyAgICBmb3IgKGF1dG8gb3V0cHV0VGFyZ2V0IDogcmVxdWVzdC0+dGFyZ2V0cy0+bU91dHB1dHMpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBhbncgPSBvdXRwdXRUYXJnZXQubVdpbmRvdzsKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICByZXEtPm1TdXJmYWNlTGlzdC5wdXNoX2JhY2soYW53KTsKKyAgICAgICAgLy8gbG9va3VwIHN0cmVhbS9zdXJmYWNlIElECisgICAgICAgIGZvciAoY29uc3QgYXV0byYga3ZQYWlyIDogbUNvbmZpZ3VyZWRPdXRwdXRzKSB7CisgICAgICAgICAgICBpbnQgc3RyZWFtSWQgPSBrdlBhaXIuZmlyc3Q7CisgICAgICAgICAgICBjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlciYgb3V0Q29uZmlnID0ga3ZQYWlyLnNlY29uZC5zZWNvbmQ7CisgICAgICAgICAgICBjb25zdCBhdXRvJiB3aW5kb3dIYW5kbGVzID0gb3V0Q29uZmlnLm1PdXRwdXRDb25maWd1cmF0aW9uLndpbmRvd0hhbmRsZXM7CisgICAgICAgICAgICBmb3IgKGludCBzdXJmYWNlSWQgPSAwOyBzdXJmYWNlSWQgPCAoaW50KSB3aW5kb3dIYW5kbGVzLnNpemUoKTsgc3VyZmFjZUlkKyspIHsKKyAgICAgICAgICAgICAgICAvLyBJZiB0d28gbmF0aXZlIGhhbmRsZXMgYXJlIGVxdWl2YWxlbnQsIHNvIGFyZSB0aGVpciBzdXJmYWNlcy4KKyAgICAgICAgICAgICAgICBpZiAodXRpbHM6OmlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwod2luZG93SGFuZGxlc1tzdXJmYWNlSWRdLmdldE5hdGl2ZUhhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW53KSkgeworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTdHJlYW1JZHhMaXN0LnB1c2hfYmFjayhzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RTdXJmYWNlSWR4TGlzdC5wdXNoX2JhY2soc3VyZmFjZUlkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZvdW5kKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgQUxPR0UoIlVuY29uZmlndXJlZCBvdXRwdXQgdGFyZ2V0ICVwIGluIGNhcHR1cmUgcmVxdWVzdCEiLCBhbncpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfSU5WQUxJRF9QQVJBTUVURVI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVxLT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzLnJlc2l6ZShyZXF1ZXN0U3RyZWFtSWR4TGlzdC5zaXplKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWVzdFN0cmVhbUlkeExpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgcmVxLT5tQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzW2ldLnN0cmVhbUlkID0gcmVxdWVzdFN0cmVhbUlkeExpc3RbaV07CisgICAgICAgIHJlcS0+bUNhcHR1cmVSZXF1ZXN0LnN0cmVhbUFuZFdpbmRvd0lkc1tpXS53aW5kb3dJZCA9IHJlcXVlc3RTdXJmYWNlSWR4TGlzdFtpXTsKKyAgICB9CisgICAgb3V0UmVxID0gcmVxOworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCit2b2lkIENhbWVyYURldmljZTo6YWxsb2NhdGVPbmVDYXB0dXJlUmVxdWVzdE1ldGFkYXRhKAorICAgICAgICBQaHlzaWNhbENhbWVyYVNldHRpbmdzJiBjYW1lcmFTZXR0aW5ncywKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGlkLCBjb25zdCBzcDxBQ2FtZXJhTWV0YWRhdGE+JiBtZXRhZGF0YSkgeworICAgIGNhbWVyYVNldHRpbmdzLmlkID0gaWQ7CisgICAgLy8gVE9ETzogRG8gd2UgcmVhbGx5IG5lZWQgdG8gY29weSB0aGUgbWV0YWRhdGEgaGVyZSA/CisgICAgQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGFDb3B5ID0gbWV0YWRhdGEtPmdldEludGVybmFsRGF0YSgpOworICAgIGNhbWVyYV9tZXRhZGF0YV90ICpjYW1lcmFNZXRhZGF0YSA9IG1ldGFkYXRhQ29weS5yZWxlYXNlKCk7CisgICAgSENhbWVyYU1ldGFkYXRhIGhDYW1lcmFNZXRhZGF0YTsKKyAgICB1dGlsczo6Y29udmVydFRvSGlkbChjYW1lcmFNZXRhZGF0YSwgJmhDYW1lcmFNZXRhZGF0YSwgdHJ1ZSk7CisgICAgaWYgKG1ldGFkYXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGhDYW1lcmFNZXRhZGF0YS5kYXRhKCkgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZSAhPSBudWxscHRyICYmCisgICAgICAgICAgICBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlLT53cml0ZSgKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oaENhbWVyYU1ldGFkYXRhLmRhdGEoKSksCisgICAgICAgICAgICAgICAgaENhbWVyYU1ldGFkYXRhLnNpemUoKSkpIHsKKyAgICAgICAgICAgIC8vIFRoZSBtZXRhZGF0YSBmaWVsZCBvZiB0aGUgdW5pb24gd291bGQndmUgYmVlbiBkZXN0cnVjdHVlZCwgc28gbm8gbmVlZAorICAgICAgICAgICAgLy8gdG8gcmUtc2l6ZSBpdC4KKyAgICAgICAgICAgIGNhbWVyYVNldHRpbmdzLnNldHRpbmdzLmZtcU1ldGFkYXRhU2l6ZShoQ2FtZXJhTWV0YWRhdGEuc2l6ZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJGbXEgd3JpdGUgY2FwdHVyZSByZXN1bHQgZmFpbGVkLCBmYWxsaW5nIGJhY2sgdG8gaHdiaW5kZXIiKTsKKyAgICAgICAgICAgIGNhbWVyYVNldHRpbmdzLnNldHRpbmdzLm1ldGFkYXRhKHN0ZDo6bW92ZShoQ2FtZXJhTWV0YWRhdGEpKTsKKyAgICAgICAgfQorICAgIH0KK30KKworCitBQ2FwdHVyZVJlcXVlc3QqCitDYW1lcmFEZXZpY2U6OmFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiYgcmVxLCBjb25zdCBjaGFyKiBkZXZpY2VJZCkgeworICAgIEFDYXB0dXJlUmVxdWVzdCogcFJlcXVlc3QgPSBuZXcgQUNhcHR1cmVSZXF1ZXN0KCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXEtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCA9IHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NbaV0uaWQ7CisgICAgICAgIENhbWVyYU1ldGFkYXRhIGNsb25lOworICAgICAgICB1dGlsczo6Y29udmVydEZyb21IaWRsQ2xvbmVkKHJlcS0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3NbaV0uc2V0dGluZ3MubWV0YWRhdGEoKSwgJmNsb25lKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKmNsb25lcCA9IGNsb25lLnJlbGVhc2UoKTsKKyAgICAgICAgaWYgKGlkID09IGRldmljZUlkKSB7CisgICAgICAgICAgICBwUmVxdWVzdC0+c2V0dGluZ3MgPSBuZXcgQUNhbWVyYU1ldGFkYXRhKGNsb25lcCwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVRVUVTVCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwUmVxdWVzdC0+cGh5c2ljYWxTZXR0aW5nc1tyZXEtPm1QaHlzaWNhbENhbWVyYVNldHRpbmdzW2ldLmlkXSA9CisgICAgICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhTWV0YWRhdGEoY2xvbmVwLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVFVRVNUKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwUmVxdWVzdC0+dGFyZ2V0cyA9IG5ldyBBQ2FtZXJhT3V0cHV0VGFyZ2V0cygpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVxLT5tU3VyZmFjZUxpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBhbncgPSByZXEtPm1TdXJmYWNlTGlzdFtpXTsKKyAgICAgICAgQUNhbWVyYU91dHB1dFRhcmdldCBvdXRwdXRUYXJnZXQoYW53KTsKKyAgICAgICAgcFJlcXVlc3QtPnRhcmdldHMtPm1PdXRwdXRzLmluc2VydChvdXRwdXRUYXJnZXQpOworICAgIH0KKyAgICByZXR1cm4gcFJlcXVlc3Q7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6ZnJlZUFDYXB0dXJlUmVxdWVzdChBQ2FwdHVyZVJlcXVlc3QqIHJlcSkgeworICAgIGlmIChyZXEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHJlcS0+c2V0dGluZ3MuY2xlYXIoKTsKKyAgICBkZWxldGUgcmVxLT50YXJnZXRzOworICAgIGRlbGV0ZSByZXE7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6bm90aWZ5U2Vzc2lvbkVuZE9mTGlmZUxvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24pIHsKKyAgICBpZiAoaXNDbG9zZWQoKSkgeworICAgICAgICAvLyBEZXZpY2UgaXMgY2xvc2luZyBhbHJlYWR5LiBkbyBub3RoaW5nCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUN1cnJlbnRTZXNzaW9uICE9IHNlc3Npb24pIHsKKyAgICAgICAgLy8gU2Vzc2lvbiBoYXMgYmVlbiByZXBsYWNlZCBieSBvdGhlciBzZWVzaW9uIG9yIGRldmljZSBpcyBjbG9zZWQKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ3VycmVudFNlc3Npb24gPSBudWxscHRyOworCisgICAgLy8gU2hvdWxkIG5vdCBoYXBwZW4KKyAgICBpZiAoIXNlc3Npb24tPm1Jc0Nsb3NlZCkgeworICAgICAgICBBTE9HRSgiRXJyb3I6IHVuY2xvc2VkIHNlc3Npb24gJXAgcmVhY2hlcyBlbmQgb2YgbGlmZSEiLCBzZXNzaW9uKTsKKyAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIE5vIG5ldyBzZXNzaW9uLCB1bmNvbmZpZ3VyZSBub3cKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY29uZmlndXJlU3RyZWFtc0xvY2tlZChudWxscHRyLCBudWxscHRyKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIlVuY29uZmlndXJlIHN0cmVhbSBmYWlsZWQuIERldmljZSBtaWdodCBzdGlsbCBiZSBjb25maWd1cmVkISByZXQgJWQiLCByZXQpOworICAgIH0KK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpkaXNjb25uZWN0TG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4mIHNlc3Npb24pIHsKKyAgICBpZiAobUNsb3NpbmcuZXhjaGFuZ2UodHJ1ZSkpIHsKKyAgICAgICAgLy8gQWxyZWFkeSBjbG9zaW5nLCBqdXN0IHJldHVybgorICAgICAgICBBTE9HVygiQ2FtZXJhIGRldmljZSAlcyBpcyBhbHJlYWR5IGNsb3NpbmcuIiwgZ2V0SWQoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobVJlbW90ZSAhPSBudWxscHRyKSB7CisgICAgICAgIGF1dG8gcmV0ID0gbVJlbW90ZS0+ZGlzY29ubmVjdCgpOworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igd2hpbGUgZGlzY29ubmVjdGluZyBkZXZpY2UgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtUmVtb3RlID0gbnVsbHB0cjsKKworICAgIGlmIChzZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgc2Vzc2lvbi0+Y2xvc2VCeURldmljZSgpOworICAgIH0KK30KKworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OnN0b3BSZXBlYXRpbmdMb2NrZWQoKSB7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGNoZWNrQ2FtZXJhQ2xvc2VkT3JFcnJvckxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN0b3AgcmVwZWF0aW5nIGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKG1SZXBlYXRpbmdTZXF1ZW5jZUlkICE9IFJFUVVFU1RfSURfTk9ORSkgeworICAgICAgICBpbnQgcmVwZWF0aW5nU2VxdWVuY2VJZCA9IG1SZXBlYXRpbmdTZXF1ZW5jZUlkOworICAgICAgICBtUmVwZWF0aW5nU2VxdWVuY2VJZCA9IFJFUVVFU1RfSURfTk9ORTsKKworICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlcjsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6VU5LTk9XTl9FUlJPUjsKKyAgICAgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT5jYW5jZWxSZXBlYXRpbmdSZXF1ZXN0KAorICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmbGFzdEZyYW1lTnVtYmVyXShTdGF0dXMgcywgYXV0byBmcmFtZU51bWJlcikgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICAgICBsYXN0RnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgQ0hFQ0tfVFJBTlNBQ1RJT05fQU5EX1JFVChyZW1vdGVSZXQsIHN0YXR1cywgImNhbmNlbFJlcGVhdGluZ1JlcXVlc3QoKSIpOworICAgICAgICBjaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQocmVwZWF0aW5nU2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB9CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpmbHVzaExvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qIHNlc3Npb24pIHsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgYWJvcnQgY2FwdHVyZXMgZmFpbGVkISByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBiZWNhdXNlIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24gd2lsbCBjbG9zZQorICAgIC8vIHByZXZpb3VzIG9uZSBhbmQgdGh1cyByZWplY3QgYW55IEFQSSBjYWxsIGZyb20gcHJldmlvdXMgc2Vzc2lvbi4KKyAgICAvLyBCdXQgc3RpbGwgZ29vZCB0byBjaGVjayBoZXJlIGluIGNhc2Ugc29tZXRoaW5nIHVuZXhwZWN0ZWQgaGFwcGVuLgorICAgIGlmIChtQ3VycmVudFNlc3Npb24gIT0gc2Vzc2lvbikgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHNlc3Npb24gJXAgaXMgbm90IGN1cnJlbnQgYWN0aXZlIHNlc3Npb24hIiwgZ2V0SWQoKSwgc2Vzc2lvbik7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIGlmIChtRmx1c2hpbmcpIHsKKyAgICAgICAgQUxPR1coIkNhbWVyYSAlcyBpcyBhbHJlYWR5IGFib3J0aW5nIGNhcHR1cmVzIiwgZ2V0SWQoKSk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX09LOworICAgIH0KKworICAgIG1GbHVzaGluZyA9IHRydWU7CisKKyAgICAvLyBTZW5kIG9uQWN0aXZlIGNhbGxiYWNrIHRvIGd1YXJhbnRlZSB0aGVyZSBpcyBhbHdheXMgYWN0aXZlLT5yZWFkeSB0cmFuc2l0aW9uCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlc3Npb25TdGF0ZUNiLCBtSGFuZGxlcik7CisgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKKyAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgc2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2sub25BY3RpdmUpOworICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworCisgICAgLy8gSWYgZGV2aWNlIGlzIGFscmVhZHkgaWRsaW5nLCBzZW5kIGNhbGxiYWNrIGFuZCBleGl0IGVhcmx5CisgICAgaWYgKG1JZGxlKSB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgbUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLmNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIHNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uUmVhZHkpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKyAgICAgICAgbUZsdXNoaW5nID0gZmFsc2U7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX09LOworICAgIH0KKworICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyOworICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6OlVOS05PV05fRVJST1I7CisgICAgYXV0byByZW1vdGVSZXQgPSBtUmVtb3RlLT5mbHVzaChbJnN0YXR1cywgJmxhc3RGcmFtZU51bWJlcl0oYXV0byBzLCBhdXRvIGZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIENIRUNLX1RSQU5TQUNUSU9OX0FORF9SRVQocmVtb3RlUmV0LCBzdGF0dXMsICJmbHVzaCgpIikKKyAgICBpZiAobVJlcGVhdGluZ1NlcXVlbmNlSWQgIT0gUkVRVUVTVF9JRF9OT05FKSB7CisgICAgICAgIGNoZWNrUmVwZWF0aW5nU2VxdWVuY2VDb21wbGV0ZUxvY2tlZChtUmVwZWF0aW5nU2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyKTsKKyAgICB9CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjp3YWl0VW50aWxJZGxlTG9ja2VkKCkgeworICAgIGNhbWVyYV9zdGF0dXNfdCByZXQgPSBjaGVja0NhbWVyYUNsb3NlZE9yRXJyb3JMb2NrZWQoKTsKKyAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgQUxPR0UoIldhaXQgdW50aWwgY2FtZXJhICVzIGlkbGUgZmFpbGVkISByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChtUmVwZWF0aW5nU2VxdWVuY2VJZCAhPSBSRVFVRVNUX0lEX05PTkUpIHsKKyAgICAgICAgQUxPR0UoIkNhbWVyYSBkZXZpY2UgJXMgd29uJ3QgZ28gdG8gaWRsZSB3aGVuIHRoZXJlIGlzIHJlcGVhdGluZyByZXF1ZXN0ISIsIGdldElkKCkpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1SZW1vdGUtPndhaXRVbnRpbElkbGUoKTsKKyAgICBDSEVDS19UUkFOU0FDVElPTl9BTkRfUkVUKHJlbW90ZVJldCwgcmVtb3RlUmV0LCAid2FpdFVudGlsSWRsZSgpIikKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworY2FtZXJhX3N0YXR1c190CitDYW1lcmFEZXZpY2U6OmNvbmZpZ3VyZVN0cmVhbXNMb2NrZWQoY29uc3QgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBvdXRwdXRzLAorICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzKSB7CisgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyIGVtcHR5T3V0cHV0OworICAgIGlmIChvdXRwdXRzID09IG51bGxwdHIpIHsKKyAgICAgICAgb3V0cHV0cyA9ICZlbXB0eU91dHB1dDsKKyAgICB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgc3RkOjpzZXQ8c3RkOjpwYWlyPG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIsIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyPj4gb3V0cHV0U2V0OworICAgIGZvciAoYXV0byBvdXRDb25maWcgOiBvdXRwdXRzLT5tT3V0cHV0cykgeworICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudyA9IG91dENvbmZpZy5tV2luZG93OworICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlciBvdXRDb25maWdJbnNlcnRXOworICAgICAgICBPdXRwdXRDb25maWd1cmF0aW9uICZvdXRDb25maWdJbnNlcnQgPSBvdXRDb25maWdJbnNlcnRXLm1PdXRwdXRDb25maWd1cmF0aW9uOworICAgICAgICBvdXRDb25maWdJbnNlcnQucm90YXRpb24gPSB1dGlsczo6Y29udmVydFRvSGlkbChvdXRDb25maWcubVJvdGF0aW9uKTsKKyAgICAgICAgb3V0Q29uZmlnSW5zZXJ0LndpbmRvd0dyb3VwSWQgPSAtMTsKKyAgICAgICAgb3V0Q29uZmlnSW5zZXJ0LndpbmRvd0hhbmRsZXMucmVzaXplKG91dENvbmZpZy5tU2hhcmVkV2luZG93cy5zaXplKCkgKyAxKTsKKyAgICAgICAgb3V0Q29uZmlnSW5zZXJ0LndpbmRvd0hhbmRsZXNbMF0gPSBhbnc7CisgICAgICAgIG91dENvbmZpZ0luc2VydC5waHlzaWNhbENhbWVyYUlkID0gb3V0Q29uZmlnLm1QaHlzaWNhbENhbWVyYUlkOworICAgICAgICBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIHdyYXAoYW53KTsKKyAgICAgICAgb3V0cHV0U2V0Lmluc2VydChzdGQ6Om1ha2VfcGFpcihhbncsIG91dENvbmZpZ0luc2VydFcpKTsKKyAgICB9CisgICAgc3RkOjpzZXQ8c3RkOjpwYWlyPG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIsIE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyPj4gYWRkU2V0ID0gb3V0cHV0U2V0OworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IGRlbGV0ZUxpc3Q7CisKKyAgICAvLyBEZXRlcm1pbmUgd2hpY2ggc3RyZWFtcyBuZWVkIHRvIGJlIGNyZWF0ZWQsIHdoaWNoIHRvIGJlIGRlbGV0ZWQKKyAgICBmb3IgKGF1dG8mIGt2UGFpciA6IG1Db25maWd1cmVkT3V0cHV0cykgeworICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0ga3ZQYWlyLmZpcnN0OworICAgICAgICBhdXRvJiBvdXRwdXRQYWlyID0ga3ZQYWlyLnNlY29uZDsKKyAgICAgICAgaWYgKG91dHB1dFNldC5jb3VudChvdXRwdXRQYWlyKSkgeworICAgICAgICAgICAgZGVsZXRlTGlzdC5wdXNoX2JhY2soc3RyZWFtSWQpOyAvLyBOZWVkIHRvIGRlbGV0ZSBhIG5vIGxvbmdlciBuZWVkZWQgc3RyZWFtCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhZGRTZXQuZXJhc2Uob3V0cHV0UGFpcik7ICAgICAgICAvLyBObyBuZWVkIHRvIGFkZCBhbHJlYWR5IGV4aXN0aW5nIHN0cmVhbQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0ID0gc3RvcFJlcGVhdGluZ0xvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyBzdG9wIHJlcGVhdGluZyBmYWlsZWQsIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgcmV0ID0gd2FpdFVudGlsSWRsZUxvY2tlZCgpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiQ2FtZXJhIGRldmljZSAlcyB3YWl0IHVudGlsIGlkbGUgZmFpbGVkLCByZXQgJWQiLCBnZXRJZCgpLCByZXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIFNlbmQgb25SZWFkeSB0byBwcmV2aW91cyBzZXNzaW9uCisgICAgLy8gQ3VycmVudFNlc3Npb24gd2lsbCBiZSB1cGRhdGVkIGFmdGVyIGNvbmZpZ3VyZVN0cmVhbUxvY2tlZCwgc28gaGVyZQorICAgIC8vIG1DdXJyZW50U2Vzc2lvbiBpcyB0aGUgc2Vzc2lvbiB0byBiZSByZXBsYWNlZCBieSBhIG5ldyBzZXNzaW9uCisgICAgaWYgKCFtSWRsZSAmJiBtQ3VycmVudFNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgICBpZiAobUJ1c3lTZXNzaW9uICE9IG1DdXJyZW50U2Vzc2lvbikgeworICAgICAgICAgICAgQUxPR0UoIkN1cnJlbnQgc2Vzc2lvbiAhPSBidXN5IHNlc3Npb24iKTsKKyAgICAgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFOworICAgICAgICB9CisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXNzaW9uU3RhdGVDYiwgbUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIG1CdXN5U2Vzc2lvbi0+bVVzZXJTZXNzaW9uQ2FsbGJhY2suY29udGV4dCk7CisgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIG1CdXN5U2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBtQnVzeVNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uUmVhZHkpOworICAgICAgICBtQnVzeVNlc3Npb24uY2xlYXIoKTsKKyAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfQorICAgIG1JZGxlID0gdHJ1ZTsKKworICAgIGF1dG8gcmVtb3RlUmV0ID0gbVJlbW90ZS0+YmVnaW5Db25maWd1cmUoKTsKKyAgICBDSEVDS19UUkFOU0FDVElPTl9BTkRfUkVUKHJlbW90ZVJldCwgcmVtb3RlUmV0LCAiYmVnaW5Db25maWd1cmUoKSIpCisKKyAgICAvLyBkZWxldGUgdG8tYmUtZGVsZXRlZCBzdHJlYW1zCisgICAgZm9yIChhdXRvIHN0cmVhbUlkIDogZGVsZXRlTGlzdCkgeworICAgICAgICByZW1vdGVSZXQgPSBtUmVtb3RlLT5kZWxldGVTdHJlYW0oc3RyZWFtSWQpOworICAgICAgICBDSEVDS19UUkFOU0FDVElPTl9BTkRfUkVUKHJlbW90ZVJldCwgcmVtb3RlUmV0LCAiZGVsZXRlU3RyZWFtKCkiKQorICAgICAgICBtQ29uZmlndXJlZE91dHB1dHMuZXJhc2Uoc3RyZWFtSWQpOworICAgIH0KKworICAgIC8vIGFkZCBuZXcgc3RyZWFtcworICAgIGZvciAoYXV0byBvdXRwdXRQYWlyIDogYWRkU2V0KSB7CisgICAgICAgIGludCBzdHJlYW1JZDsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6VU5LTk9XTl9FUlJPUjsKKyAgICAgICAgYXV0byByZXQgPSBtUmVtb3RlLT5jcmVhdGVTdHJlYW0ob3V0cHV0UGFpci5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmc3RyZWFtSWRdKFN0YXR1cyBzLCBhdXRvIHN0cmVhbV9pZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkID0gc3RyZWFtX2lkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgQ0hFQ0tfVFJBTlNBQ1RJT05fQU5EX1JFVChyZXQsIHN0YXR1cywgImNyZWF0ZVN0cmVhbSgpIikKKyAgICAgICAgbUNvbmZpZ3VyZWRPdXRwdXRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihzdHJlYW1JZCwgb3V0cHV0UGFpcikpOworICAgIH0KKworICAgIENhbWVyYU1ldGFkYXRhIHBhcmFtczsKKyAgICBIQ2FtZXJhTWV0YWRhdGEgaGlkbFBhcmFtczsKKyAgICBpZiAoKHNlc3Npb25QYXJhbWV0ZXJzICE9IG51bGxwdHIpICYmIChzZXNzaW9uUGFyYW1ldGVycy0+c2V0dGluZ3MgIT0gbnVsbHB0cikpIHsKKyAgICAgICAgcGFyYW1zLmFwcGVuZChzZXNzaW9uUGFyYW1ldGVycy0+c2V0dGluZ3MtPmdldEludGVybmFsRGF0YSgpKTsKKyAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnBhcmFtc19tZXRhZGF0YSA9IHBhcmFtcy5nZXRBbmRMb2NrKCk7CisgICAgICAgIHV0aWxzOjpjb252ZXJ0VG9IaWRsKHBhcmFtc19tZXRhZGF0YSwgJmhpZGxQYXJhbXMpOworICAgICAgICBwYXJhbXMudW5sb2NrKHBhcmFtc19tZXRhZGF0YSk7CisgICAgfQorICAgIHJlbW90ZVJldCA9IG1SZW1vdGUtPmVuZENvbmZpZ3VyZShTdHJlYW1Db25maWd1cmF0aW9uTW9kZTo6Tk9STUFMX01PREUsIGhpZGxQYXJhbXMpOworICAgIENIRUNLX1RSQU5TQUNUSU9OX0FORF9SRVQocmVtb3RlUmV0LCByZW1vdGVSZXQsICJlbmRDb25maWd1cmUoKSIpCisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6c2V0UmVtb3RlRGV2aWNlKHNwPElDYW1lcmFEZXZpY2VVc2VyPiByZW1vdGUpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobURldmljZUxvY2spOworICAgIG1SZW1vdGUgPSByZW1vdGU7Cit9CisKK2Jvb2wKK0NhbWVyYURldmljZTo6c2V0RGV2aWNlTWV0YWRhdGFRdWV1ZXMoKSB7CisgICAgICAgIGlmIChtUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgICBBTE9HRSgibVJlbW90ZSBtdXN0IG5vdCBiZSBudWxsIHdoaWxlIHRyeWluZyB0byBmZXRjaCBtZXRhZGF0YSBxdWV1ZXMiKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiAmcmVxUXVldWUgPSBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlOworICAgICAgICBhdXRvIHJldCA9CisgICAgICAgICAgICBtUmVtb3RlLT5nZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUoCisgICAgICAgICAgICAgICAgWyZyZXFRdWV1ZV0oY29uc3QgYXV0byAmbXFEZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcVF1ZXVlID0gc3RkOjptYWtlX3NoYXJlZDxSZXF1ZXN0TWV0YWRhdGFRdWV1ZT4obXFEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXFRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlcVF1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRW1wdHkgZm1xIGZyb20gY2FtZXJhc2VydmVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXFRdWV1ZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3IgdHJ5aW5nIHRvIGdldCBjYXB0dXJlIHJlcXVlc3QgbWV0YWRhdGEgcXVldWUiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVzdWx0TWV0YWRhdGFRdWV1ZT4gJnJlc1F1ZXVlID0gbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlOworICAgICAgICByZXQgPQorICAgICAgICAgICAgICAgIG1SZW1vdGUtPmdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgWyZyZXNRdWV1ZV0oY29uc3QgYXV0byAmbXFEZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzUXVldWUgPSBzdGQ6Om1ha2Vfc2hhcmVkPFJlc3VsdE1ldGFkYXRhUXVldWU+KG1xRGVzY3JpcHRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFyZXNRdWV1ZS0+aXNWYWxpZCgpIHx8IHJlc1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPD0wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJFbXB0eSBmbXEgZnJvbSBjYW1lcmFzZXJ2ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiVHJhbnNhY3Rpb24gZXJyb3IgdHJ5aW5nIHRvIGdldCBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSBxdWV1ZSIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworfQorCitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Y2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCkgY29uc3QgeworICAgIGlmIChtUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW1lcmEgZGV2aWNlIGFscmVhZHkgY2xvc2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisgICAgaWYgKG1JbkVycm9yKSB7Ly8gdHJpZ2dlcmVkIGJ5IG9uRGV2aWNlRXJyb3IKKyAgICAgICAgQUxPR0UoIiVzOiBjYW1lcmEgZGV2aWNlIGhhcyBlbmNvdW50ZXJlZCBhIHNlcmlvdXMgZXJyb3IiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gbUVycm9yOworICAgIH0KKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpzZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChjYW1lcmFfc3RhdHVzX3QgZXJyb3IpIHsKKyAgICBtSW5FcnJvciA9IHRydWU7CisgICAgbUVycm9yID0gZXJyb3I7CisgICAgcmV0dXJuOworfQorCit2b2lkCitDYW1lcmFEZXZpY2U6OkZyYW1lTnVtYmVyVHJhY2tlcjo6dXBkYXRlVHJhY2tlcihpbnQ2NF90IGZyYW1lTnVtYmVyLCBib29sIGlzRXJyb3IpIHsKKyAgICBBTE9HVigidXBkYXRlVHJhY2tlciBmcmFtZSAlIiBQUklkNjQgIiBpc0Vycm9yICVkIiwgZnJhbWVOdW1iZXIsIGlzRXJyb3IpOworICAgIGlmIChpc0Vycm9yKSB7CisgICAgICAgIG1GdXR1cmVFcnJvclNldC5pbnNlcnQoZnJhbWVOdW1iZXIpOworICAgIH0gZWxzZSBpZiAoZnJhbWVOdW1iZXIgPD0gbUNvbXBsZXRlZEZyYW1lTnVtYmVyKSB7CisgICAgICAgIEFMT0dFKCJGcmFtZSBudW1iZXIgJSIgUFJJZDY0ICIgZGVjcmVhc2VkISBjdXJyZW50IGZuICUiIFBSSWQ2NCwKKyAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgbUNvbXBsZXRlZEZyYW1lTnVtYmVyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChmcmFtZU51bWJlciAhPSBtQ29tcGxldGVkRnJhbWVOdW1iZXIgKyAxKSB7CisgICAgICAgICAgICBBTE9HRSgiRnJhbWUgbnVtYmVyIG91dCBvZiBvcmRlci4gRXhwZWN0ICUiIFBSSWQ2NCAiIGJ1dCBnZXQgJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgICBtQ29tcGxldGVkRnJhbWVOdW1iZXIgKyAxLCBmcmFtZU51bWJlcik7CisgICAgICAgICAgICAvLyBEbyBub3QgYXNzZXJ0IGFzIGluIGphdmEgaW1wbGVtZW50YXRpb24KKyAgICAgICAgfQorICAgICAgICBtQ29tcGxldGVkRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICB9CisgICAgdXBkYXRlKCk7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6RnJhbWVOdW1iZXJUcmFja2VyOjp1cGRhdGUoKSB7CisgICAgZm9yIChhdXRvIGl0ID0gbUZ1dHVyZUVycm9yU2V0LmJlZ2luKCk7IGl0ICE9IG1GdXR1cmVFcnJvclNldC5lbmQoKTspIHsKKyAgICAgICAgaW50NjRfdCBlcnJvckZyYW1lTnVtYmVyID0gKml0OworICAgICAgICBpZiAoZXJyb3JGcmFtZU51bWJlciA9PSBtQ29tcGxldGVkRnJhbWVOdW1iZXIgKyAxKSB7CisgICAgICAgICAgICBtQ29tcGxldGVkRnJhbWVOdW1iZXIrKzsKKyAgICAgICAgICAgIGl0ID0gbUZ1dHVyZUVycm9yU2V0LmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIGlmIChlcnJvckZyYW1lTnVtYmVyIDw9IG1Db21wbGV0ZWRGcmFtZU51bWJlcikgeworICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IGRlYWwgd2l0aCBpdCBhbnl3YXkKKyAgICAgICAgICAgIEFMT0dFKCJDb21wbGV0ZCBmcmFtZSBudW1iZXIgcGFzc2VkIHRocm91Z2ggY3VycmVudCBmcmFtZSBudW1iZXIhIik7CisgICAgICAgICAgICAvLyBlcmFzZSB0aGUgb2xkIGVycm9yIHNpbmNlIGl0J3Mgbm8gbG9uZ2VyIHVzZWZ1bAorICAgICAgICAgICAgaXQgPSBtRnV0dXJlRXJyb3JTZXQuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gTm9ybWFsIHJlcXVlc3RzIGhhc24ndCBjYXRjaGVkIHVwIGVycm9yIGZyYW1lcywganVzdCBicmVhaworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIlVwZGF0ZSBjb21wbGV0ZSBmcmFtZSAlIiBQUklkNjQsIG1Db21wbGV0ZWRGcmFtZU51bWJlcik7Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6b25DYXB0dXJlRXJyb3JMb2NrZWQoCisgICAgICAgIEVycm9yQ29kZSBlcnJvckNvZGUsCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIGludCBzZXF1ZW5jZUlkID0gcmVzdWx0RXh0cmFzLnJlcXVlc3RJZDsKKyAgICBpbnQ2NF90IGZyYW1lTnVtYmVyID0gcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyOworICAgIGludDMyX3QgYnVyc3RJZCA9IHJlc3VsdEV4dHJhcy5idXJzdElkOworICAgIGF1dG8gaXQgPSBtU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOworICAgIGlmIChpdCA9PSBtU2VxdWVuY2VDYWxsYmFja01hcC5lbmQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiBjYXB0dXJlIHNlcXVlbmNlIGluZGV4ICVkIG5vdCBmb3VuZCEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2VxdWVuY2VJZCk7CisgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX1NFUlZJQ0UpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQ2FsbGJhY2tIb2xkZXIgY2JoID0gKCppdCkuc2Vjb25kOworICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiA9IGNiaC5tU2Vzc2lvbjsKKyAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiJXM6IEVycm9yOiByZXF1ZXN0IGluZGV4ICVkIG91dCBvZiBib3VuZCAoc2l6ZSAlenUpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1cnN0SWQsIGNiaC5tUmVxdWVzdHMuc2l6ZSgpKTsKKyAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QgPSBjYmgubVJlcXVlc3RzW2J1cnN0SWRdOworCisgICAgLy8gSGFuZGxlIGJ1ZmZlciBlcnJvcgorICAgIGlmIChlcnJvckNvZGUgPT0gRXJyb3JDb2RlOjpDQU1FUkFfQlVGRkVSKSB7CisgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSByZXN1bHRFeHRyYXMuZXJyb3JTdHJlYW1JZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0IG9uQnVmZmVyTG9zdCA9CisgICAgICAgICAgICAgICAgY2JoLm1PbkNhcHR1cmVCdWZmZXJMb3N0OworICAgICAgICBhdXRvIG91dHB1dFBhaXJJdCA9IG1Db25maWd1cmVkT3V0cHV0cy5maW5kKHN0cmVhbUlkKTsKKyAgICAgICAgaWYgKG91dHB1dFBhaXJJdCA9PSBtQ29uZmlndXJlZE91dHB1dHMuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IHN0cmVhbSBpZCAlZCBkb2VzIG5vdCBleGlzdCIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICAgICAgc2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBhdXRvJiB3aW5kb3dIYW5kbGVzID0gb3V0cHV0UGFpckl0LT5zZWNvbmQuc2Vjb25kLm1PdXRwdXRDb25maWd1cmF0aW9uLndpbmRvd0hhbmRsZXM7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgb3V0SGFuZGxlIDogd2luZG93SGFuZGxlcykgeworICAgICAgICAgICAgZm9yIChhdXRvIHN0cmVhbUFuZFdpbmRvd0lkIDogcmVxdWVzdC0+bUNhcHR1cmVSZXF1ZXN0LnN0cmVhbUFuZFdpbmRvd0lkcykgeworICAgICAgICAgICAgICAgIGludDMyX3Qgd2luZG93SWQgPSBzdHJlYW1BbmRXaW5kb3dJZC53aW5kb3dJZDsKKyAgICAgICAgICAgICAgICBpZiAodXRpbHM6OmlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwod2luZG93SGFuZGxlc1t3aW5kb3dJZF0sb3V0SGFuZGxlKSkgeworICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGFudyA9CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPih3aW5kb3dIYW5kbGVzW3dpbmRvd0lkXS5nZXROYXRpdmVIYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJDYW1lcmEgJXMgTG9zdCBvdXRwdXQgYnVmZmVyIGZvciBBTlcgJXAgZnJhbWUgJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldElkKCksIGFudywgZnJhbWVOdW1iZXIpOworCisgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlQnVmZmVyTG9zdCwgbUhhbmRsZXIpOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CisgICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0T2JqZWN0KGtTZXNzaW9uU3BLZXksIHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgb25CdWZmZXJMb3N0KTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtBbndLZXksICh2b2lkKikgYW53KTsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQ2NChrRnJhbWVOdW1iZXJLZXksIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gSGFuZGxlIG90aGVyIGNhcHR1cmUgZmFpbHVyZXMKKyAgICAgICAgLy8gRmlyZSBjYXB0dXJlIGZhaWx1cmUgY2FsbGJhY2sgaWYgdGhlcmUgaXMgb25lIHJlZ2lzdGVyZWQKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25FcnJvciA9IGNiaC5tT25DYXB0dXJlRmFpbGVkOworICAgICAgICBzcDxDYW1lcmFDYXB0dXJlRmFpbHVyZT4gZmFpbHVyZShuZXcgQ2FtZXJhQ2FwdHVyZUZhaWx1cmUoKSk7CisgICAgICAgIGZhaWx1cmUtPmZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgICAgIC8vIFRPRE86IHJlZmluZSB0aGlzIHdoZW4gaW1wbGVtZW50aW5nIGZsdXNoCisgICAgICAgIGZhaWx1cmUtPnJlYXNvbiAgICAgID0gQ0FQVFVSRV9GQUlMVVJFX1JFQVNPTl9FUlJPUjsKKyAgICAgICAgZmFpbHVyZS0+c2VxdWVuY2VJZCAgPSBzZXF1ZW5jZUlkOworICAgICAgICBmYWlsdXJlLT53YXNJbWFnZUNhcHR1cmVkID0gKGVycm9yQ29kZSA9PSBFcnJvckNvZGU6OkNBTUVSQV9SRVNVTFQpOworCisgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoY2JoLm1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayA/IGtXaGF0TG9naWNhbENhcHR1cmVGYWlsIDoKKyAgICAgICAgICAgICAgICBrV2hhdENhcHR1cmVGYWlsLCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgIGlmIChjYmgubUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKSB7CisgICAgICAgICAgICBpZiAocmVzdWx0RXh0cmFzLmVycm9yUGh5c2ljYWxDYW1lcmFJZC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoa0ZhaWxpbmdQaHlzaWNhbENhbWVyYUlkLCByZXN1bHRFeHRyYXMuZXJyb3JQaHlzaWNhbENhbWVyYUlkLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRFeHRyYXMuZXJyb3JQaHlzaWNhbENhbWVyYUlkLnNpemUoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgY2JoLm1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbGVkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBvbkVycm9yKTsKKyAgICAgICAgfQorICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOworICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZUZhaWx1cmVLZXksIGZhaWx1cmUpOworICAgICAgICBwb3N0U2Vzc2lvbk1zZ0FuZENsZWFudXAobXNnKTsKKworICAgICAgICAvLyBVcGRhdGUgdHJhY2tlcgorICAgICAgICBtRnJhbWVOdW1iZXJUcmFja2VyLnVwZGF0ZVRyYWNrZXIoZnJhbWVOdW1iZXIsIC8qaXNFcnJvciovdHJ1ZSk7CisgICAgICAgIGNoZWNrQW5kRmlyZVNlcXVlbmNlQ29tcGxldGVMb2NrZWQoKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCitDYW1lcmFEZXZpY2U6OkNhbGxiYWNrSGFuZGxlcjo6Q2FsbGJhY2tIYW5kbGVyKGNvbnN0IGNoYXIgKmlkKSA6IG1JZChpZCkgeyB9CisKK3ZvaWQgQ2FtZXJhRGV2aWNlOjpDYWxsYmFja0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdE9uRGlzY29ubmVjdGVkOgorICAgICAgICBjYXNlIGtXaGF0T25FcnJvcjoKKyAgICAgICAgY2FzZSBrV2hhdFNlc3Npb25TdGF0ZUNiOgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CisgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZUZhaWw6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxRW5kOgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUFib3J0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3Q6CisgICAgICAgICAgICBBTE9HVigiJXM6IFJlY2VpdmVkIG1zZyAlZCIsIF9fRlVOQ1RJT05fXywgbXNnLT53aGF0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Uga1doYXRDbGVhblVwU2Vzc2lvbnM6CisgICAgICAgICAgICBtQ2FjaGVkU2Vzc2lvbnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczpFcnJvcjogdW5rbm93biBkZXZpY2UgY2FsbGJhY2sgJWQiLCBfX0ZVTkNUSU9OX18sIG1zZy0+d2hhdCgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gQ2hlY2sgdGhlIGNvbW1vbiBwYXJ0IG9mIGFsbCBtZXNzYWdlCisgICAgdm9pZCogY29udGV4dDsKKyAgICBib29sIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ29udGV4dEtleSwgJmNvbnRleHQpOworICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYWxsYmFjayBjb250ZXh0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0T25EaXNjb25uZWN0ZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIEFDYW1lcmFEZXZpY2UqIGRldjsKKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrRGV2aWNlS2V5LCAodm9pZCoqKSAmZGV2KTsKKyAgICAgICAgICAgIGlmICghZm91bmQgfHwgZGV2ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGRldmljZSBwb2ludGVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUNhbWVyYURldmljZV9TdGF0ZUNhbGxiYWNrIG9uRGlzY29ubmVjdGVkOworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25EaXNjb25uZWN0ZWQpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgb25EaXNjb25uZWN0ZWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAob25EaXNjb25uZWN0ZWQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqb25EaXNjb25uZWN0ZWQpKGNvbnRleHQsIGRldik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0T25FcnJvcjoKKyAgICAgICAgeworICAgICAgICAgICAgQUNhbWVyYURldmljZSogZGV2OworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtEZXZpY2VLZXksICh2b2lkKiopICZkZXYpOworICAgICAgICAgICAgaWYgKCFmb3VuZCB8fCBkZXYgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgZGV2aWNlIHBvaW50ZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX0Vycm9yU3RhdGVDYWxsYmFjayBvbkVycm9yOworICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25FcnJvcik7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBvbkVycm9yISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGVycm9yQ29kZTsKKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kSW50MzIoa0Vycm9yQ29kZUtleSwgJmVycm9yQ29kZSk7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBlcnJvciBjb2RlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG9uRXJyb3IgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqb25FcnJvcikoY29udGV4dCwgZGV2LCBlcnJvckNvZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFNlc3Npb25TdGF0ZUNiOgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVJlc3VsdDoKKyAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlUmVzdWx0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CisgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZUZhaWw6CisgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlU2VxRW5kOgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUFib3J0OgorICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3Q6CisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kT2JqZWN0KGtTZXNzaW9uU3BLZXksICZvYmopOworICAgICAgICAgICAgaWYgKCFmb3VuZCB8fCBvYmogPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgc2Vzc2lvbiBwb2ludGVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uKHN0YXRpY19jYXN0PEFDYW1lcmFDYXB0dXJlU2Vzc2lvbio+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgbUNhY2hlZFNlc3Npb25zLnB1c2goc2Vzc2lvbik7CisgICAgICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdFNwID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmlkX2NzdHIgPSBtSWQuY19zdHIoKTsKKyAgICAgICAgICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUZhaWw6CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlRmFpbDoKKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3Q6CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kT2JqZWN0KGtDYXB0dXJlUmVxdWVzdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXF1ZXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFNwID0gc3RhdGljX2Nhc3Q8Q2FwdHVyZVJlcXVlc3QqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICAgICAgICAgIGNhc2Uga1doYXRTZXNzaW9uU3RhdGVDYjoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrIG9uU3RhdGU7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHN0YXRlIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3RhdGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICgqb25TdGF0ZSkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVN0YXJ0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBvblN0YXJ0OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblN0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIHN0YXJ0IGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG9uU3RhcnQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZEludDY0KGtUaW1lU3RhbXBLZXksICZ0aW1lc3RhbXApOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIHRpbWVzdGFtcCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCwgaWRfY3N0cik7CisgICAgICAgICAgICAgICAgICAgICgqb25TdGFydCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgdGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRDYXB0dXJlUmVzdWx0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25SZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIHJlc3VsdCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZVJlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJlc3VsdChzdGF0aWNfY2FzdDxBQ2FtZXJhTWV0YWRhdGEqPihvYmouZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwLCBpZF9jc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvblJlc3VsdCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgcmVzdWx0LmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNhc2Uga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgb25SZXN1bHQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uUmVzdWx0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIHJlc3VsdCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvblJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrQ2FwdHVyZVJlc3VsdEtleSwgJm9iaik7CisgICAgICAgICAgICAgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FwdHVyZSByZXN1bHQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxBQ2FtZXJhTWV0YWRhdGE+IHJlc3VsdChzdGF0aWNfY2FzdDxBQ2FtZXJhTWV0YWRhdGEqPihvYmouZ2V0KCkpKTsKKworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrUGh5c2ljYWxDYXB0dXJlUmVzdWx0S2V5LCAmb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBwaHlzaWNhbCBjYXB0dXJlIHJlc3VsdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNwPEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBwaHlzaWNhbFJlc3VsdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyo+KG9iai5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvTG9jYWw+JiBwaHlzaWNhbFJlc3VsdEluZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsUmVzdWx0LT5tUGh5c2ljYWxSZXN1bHRJbmZvOworCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3A8QUNhbWVyYU1ldGFkYXRhPj4gcGh5c2ljYWxNZXRhZGF0YUNvcHk7CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGh5c2ljYWxSZXN1bHRJbmZvLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcy5wdXNoX2JhY2socGh5c2ljYWxSZXN1bHRJbmZvW2ldLnBoeXNpY2FsQ2FtZXJhSWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBjbG9uZSA9IHBoeXNpY2FsUmVzdWx0SW5mb1tpXS5waHlzaWNhbE1ldGFkYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUudXBkYXRlKEFORFJPSURfU1lOQ19GUkFNRV9OVU1CRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlzaWNhbFJlc3VsdC0+bUZyYW1lTnVtYmVyLCAvKmRhdGFfY291bnQqLzEpOworICAgICAgICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBtZXRhZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBQ2FtZXJhTWV0YWRhdGEoY2xvbmUucmVsZWFzZSgpLCBBQ2FtZXJhTWV0YWRhdGE6OkFDTV9SRVNVTFQpOworICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxNZXRhZGF0YUNvcHkucHVzaF9iYWNrKG1ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyKj4gcGh5c2ljYWxDYW1lcmFJZFB0cnM7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEFDYW1lcmFNZXRhZGF0YSo+IHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRyczsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdEluZm8uc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWRQdHJzLnB1c2hfYmFjayhwaHlzaWNhbENhbWVyYUlkc1tpXS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGFDb3B5UHRycy5wdXNoX2JhY2socGh5c2ljYWxNZXRhZGF0YUNvcHlbaV0uZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwLCBpZF9jc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvblJlc3VsdCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgcmVxdWVzdCwgcmVzdWx0LmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsUmVzdWx0SW5mby5zaXplKCksIHBoeXNpY2FsQ2FtZXJhSWRQdHJzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhQ29weVB0cnMuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZUFDYXB0dXJlUmVxdWVzdChyZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVGYWlsOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25GYWlsOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvbkZhaWwpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgZmFpbCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvbkZhaWwgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa0NhcHR1cmVGYWlsdXJlS2V5LCAmb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIGZhaWx1cmUhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxDYW1lcmFDYXB0dXJlRmFpbHVyZT4gZmFpbHVyZVNwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYUNhcHR1cmVGYWlsdXJlKj4ob2JqLmdldCgpKSk7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSogZmFpbHVyZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QUNhbWVyYUNhcHR1cmVGYWlsdXJlKj4oZmFpbHVyZVNwLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwLCBpZF9jc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvbkZhaWwpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIGZhaWx1cmUpOworICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdExvZ2ljYWxDYXB0dXJlRmFpbDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgb25GYWlsOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvbkZhaWwpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGNhcHR1cmUgZmFpbCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvbkZhaWwgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRPYmplY3Qoa0NhcHR1cmVGYWlsdXJlS2V5LCAmb2JqKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYXB0dXJlIGZhaWx1cmUhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzcDxDYW1lcmFDYXB0dXJlRmFpbHVyZT4gZmFpbHVyZVNwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PENhbWVyYUNhcHR1cmVGYWlsdXJlKj4ob2JqLmdldCgpKSk7CisgICAgICAgICAgICAgICAgICAgIEFMb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWx1cmUgZmFpbHVyZTsKKyAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBwaHlzaWNhbENhbWVyYUlkOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFN0cmluZyhrRmFpbGluZ1BoeXNpY2FsQ2FtZXJhSWQsICZwaHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGZvdW5kICYmICFwaHlzaWNhbENhbWVyYUlkLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUucGh5c2ljYWxDYW1lcmFJZCA9IHBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmUucGh5c2ljYWxDYW1lcmFJZCA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZmFpbHVyZS5jYXB0dXJlRmFpbHVyZSA9ICpmYWlsdXJlU3A7CisgICAgICAgICAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCA9IGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3RTcCwgaWRfY3N0cik7CisgICAgICAgICAgICAgICAgICAgICgqb25GYWlsKShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCByZXF1ZXN0LCAmZmFpbHVyZSk7CisgICAgICAgICAgICAgICAgICAgIGZyZWVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q2FwdHVyZVNlcUVuZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VFbmQgb25TZXFFbmQ7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKikgJm9uU2VxRW5kKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBzZXF1ZW5jZSBlbmQgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob25TZXFFbmQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGludCBzZXFJZDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRJbnQzMihrU2VxdWVuY2VJZEtleSwgJnNlcUlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBmcmFtZSBudW1iZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lTnVtYmVyOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZEludDY0KGtGcmFtZU51bWJlcktleSwgJmZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBmcmFtZSBudW1iZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAoKm9uU2VxRW5kKShjb250ZXh0LCBzZXNzaW9uLmdldCgpLCBzZXFJZCwgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVTZXFBYm9ydDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VBYm9ydCBvblNlcUFib3J0OworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKiopICZvblNlcUFib3J0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBzZXF1ZW5jZSBlbmQgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob25TZXFBYm9ydCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW50IHNlcUlkOworICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZEludDMyKGtTZXF1ZW5jZUlkS2V5LCAmc2VxSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGZyYW1lIG51bWJlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICgqb25TZXFBYm9ydCkoY29udGV4dCwgc2Vzc2lvbi5nZXQoKSwgc2VxSWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENhcHR1cmVCdWZmZXJMb3N0OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0IG9uQnVmZmVyTG9zdDsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmb25CdWZmZXJMb3N0KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBidWZmZXIgbG9zdCBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChvbkJ1ZmZlckxvc3QgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBhbnc7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kUG9pbnRlcihrQW53S2V5LCAodm9pZCoqKSAmYW53KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBuYXRpdmVfaGFuZGxlX3QhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZnJhbWVOdW1iZXI7CisgICAgICAgICAgICAgICAgICAgIGZvdW5kID0gbXNnLT5maW5kSW50NjQoa0ZyYW1lTnVtYmVyS2V5LCAmZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCBmaW5kIGZyYW1lIG51bWJlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiByZXF1ZXN0ID0gYWxsb2NhdGVBQ2FwdHVyZVJlcXVlc3QocmVxdWVzdFNwLCBpZF9jc3RyKTsKKyAgICAgICAgICAgICAgICAgICAgKCpvbkJ1ZmZlckxvc3QpKGNvbnRleHQsIHNlc3Npb24uZ2V0KCksIHJlcXVlc3QsIGFudywgZnJhbWVOdW1iZXIpOworICAgICAgICAgICAgICAgICAgICBmcmVlQUNhcHR1cmVSZXF1ZXN0KHJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworQ2FtZXJhRGV2aWNlOjpDYWxsYmFja0hvbGRlcjo6Q2FsbGJhY2tIb2xkZXIoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gICAgICAgICAgc2Vzc2lvbiwKKyAgICAgICAgY29uc3QgVmVjdG9yPHNwPENhcHR1cmVSZXF1ZXN0PiA+JiByZXF1ZXN0cywKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1JlcGVhdGluZywKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja3MqIGNicykgOgorICAgICAgICBtU2Vzc2lvbihzZXNzaW9uKSwgbVJlcXVlc3RzKHJlcXVlc3RzKSwKKyAgICAgICAgbUlzUmVwZWF0aW5nKGlzUmVwZWF0aW5nKSwKKyAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrKGZhbHNlKSB7CisgICAgaW5pdENhcHR1cmVDYWxsYmFja3MoY2JzKTsKKworICAgIGlmIChjYnMgIT0gbnVsbHB0cikgeworICAgICAgICBtT25DYXB0dXJlQ29tcGxldGVkID0gY2JzLT5vbkNhcHR1cmVDb21wbGV0ZWQ7CisgICAgICAgIG1PbkNhcHR1cmVGYWlsZWQgPSBjYnMtPm9uQ2FwdHVyZUZhaWxlZDsKKyAgICB9Cit9CisKK0NhbWVyYURldmljZTo6Q2FsbGJhY2tIb2xkZXI6OkNhbGxiYWNrSG9sZGVyKAorICAgICAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4gPiYgcmVxdWVzdHMsCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMpIDoKKyAgICAgICAgbVNlc3Npb24oc2Vzc2lvbiksIG1SZXF1ZXN0cyhyZXF1ZXN0cyksCisgICAgICAgIG1Jc1JlcGVhdGluZyhpc1JlcGVhdGluZyksCisgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmFDYWxsYmFjayh0cnVlKSB7CisgICAgaW5pdENhcHR1cmVDYWxsYmFja3MobGNicyk7CisKKyAgICBpZiAobGNicyAhPSBudWxscHRyKSB7CisgICAgICAgIG1PbkxvZ2ljYWxDYW1lcmFDYXB0dXJlQ29tcGxldGVkID0gbGNicy0+b25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZDsKKyAgICAgICAgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsZWQgPSBsY2JzLT5vbkxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbGVkOworICAgIH0KK30KKwordm9pZAorQ2FtZXJhRGV2aWNlOjpjaGVja1JlcGVhdGluZ1NlcXVlbmNlQ29tcGxldGVMb2NrZWQoCisgICAgY29uc3QgaW50IHNlcXVlbmNlSWQsIGNvbnN0IGludDY0X3QgbGFzdEZyYW1lTnVtYmVyKSB7CisgICAgQUxPR1YoIlJlcGVhdGluZyBzZXFJZCAlZCBsYXN0RnJhbWVOdW1lciAlIiBQUklkNjQsIHNlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcik7CisgICAgaWYgKGxhc3RGcmFtZU51bWJlciA9PSBOT19GUkFNRVNfQ0FQVFVSRUQpIHsKKyAgICAgICAgaWYgKG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmNvdW50KHNlcXVlbmNlSWQpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJObyBjYWxsYmFjayBmb3VuZCBmb3Igc2VxdWVuY2VJZCAlZCIsIHNlcXVlbmNlSWQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIHJlbW92ZSBjYWxsYmFjayBob2xkZXIgZnJvbSBjYWxsYmFjayBtYXAKKyAgICAgICAgYXV0byBjYkl0ID0gbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIgY2JoID0gY2JJdC0+c2Vjb25kOworICAgICAgICBtU2VxdWVuY2VDYWxsYmFja01hcC5lcmFzZShjYkl0KTsKKyAgICAgICAgLy8gc2VuZCBzZXEgYWJvcnRlZCBjYWxsYmFjaworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVNlcUFib3J0LCBtSGFuZGxlcik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2JoLm1Db250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgY2JoLm1TZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMihrU2VxdWVuY2VJZEtleSwgc2VxdWVuY2VJZCk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVzZSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAgdG8gdHJhY2sKKyAgICAgICAgbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpKTsKKworICAgICAgICAvLyBMYXN0IGZyYW1lIG1pZ2h0IGhhdmUgYXJyaXZlZC4gQ2hlY2sgbm93CisgICAgICAgIGNoZWNrQW5kRmlyZVNlcXVlbmNlQ29tcGxldGVMb2NrZWQoKTsKKyAgICB9Cit9CisKK3ZvaWQKK0NhbWVyYURldmljZTo6Y2hlY2tBbmRGaXJlU2VxdWVuY2VDb21wbGV0ZUxvY2tlZCgpIHsKKyAgICBpbnQ2NF90IGNvbXBsZXRlZEZyYW1lTnVtYmVyID0gbUZyYW1lTnVtYmVyVHJhY2tlci5nZXRDb21wbGV0ZWRGcmFtZU51bWJlcigpOworICAgIGF1dG8gaXQgPSBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbVNlcXVlbmNlTGFzdEZyYW1lTnVtYmVyTWFwLmVuZCgpKSB7CisgICAgICAgIGludCBzZXF1ZW5jZUlkID0gaXQtPmZpcnN0OworICAgICAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGJvb2wgc2VxQ29tcGxldGVkID0gZmFsc2U7CisgICAgICAgIGJvb2wgaGFzQ2FsbGJhY2sgID0gdHJ1ZTsKKworICAgICAgICBpZiAobVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVygiQ2FtZXJhICVzIGNsb3NlZCB3aGlsZSBjaGVja2luZyBzZXF1ZW5jZSBjb21wbGV0ZSIsIGdldElkKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlcmUgaXMgY2FsbGJhY2sgZm9yIHRoaXMgc2VxdWVuY2UKKyAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiBiZWNhdXNlIHdlIGFsd2F5cyByZWdpc3RlciBjYWxsYmFjayAod2l0aCBudWxscHRyIGluc2lkZSkKKyAgICAgICAgaWYgKG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmNvdW50KHNlcXVlbmNlSWQpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJObyBjYWxsYmFjayBmb3VuZCBmb3Igc2VxdWVuY2VJZCAlZCIsIHNlcXVlbmNlSWQpOworICAgICAgICAgICAgaGFzQ2FsbGJhY2sgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChsYXN0RnJhbWVOdW1iZXIgPD0gY29tcGxldGVkRnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJzZXEgJWQgcmVhY2hlZCBsYXN0IGZyYW1lICUiIFBSSWQ2NCAiLCBjb21wbGV0ZWQgJSIgUFJJZDY0LAorICAgICAgICAgICAgICAgICAgc2VxdWVuY2VJZCwgbGFzdEZyYW1lTnVtYmVyLCBjb21wbGV0ZWRGcmFtZU51bWJlcik7CisgICAgICAgICAgICBzZXFDb21wbGV0ZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlcUNvbXBsZXRlZCAmJiBoYXNDYWxsYmFjaykgeworICAgICAgICAgICAgLy8gcmVtb3ZlIGNhbGxiYWNrIGhvbGRlciBmcm9tIGNhbGxiYWNrIG1hcAorICAgICAgICAgICAgYXV0byBjYkl0ID0gbVNlcXVlbmNlQ2FsbGJhY2tNYXAuZmluZChzZXF1ZW5jZUlkKTsKKyAgICAgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9IGNiSXQtPnNlY29uZDsKKyAgICAgICAgICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVyYXNlKGNiSXQpOworICAgICAgICAgICAgLy8gc2VuZCBzZXEgY29tcGxldGUgY2FsbGJhY2sKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDYXB0dXJlU2VxRW5kLCBtSGFuZGxlcik7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiaC5tQ29udGV4dCk7CisgICAgICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBjYmgubVNlc3Npb24pOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGNiaC5tT25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQpOworICAgICAgICAgICAgbXNnLT5zZXRJbnQzMihrU2VxdWVuY2VJZEtleSwgc2VxdWVuY2VJZCk7CisgICAgICAgICAgICBtc2ctPnNldEludDY0KGtGcmFtZU51bWJlcktleSwgbGFzdEZyYW1lTnVtYmVyKTsKKworICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHNlc3Npb24gc3AgYmVmb3JlIHdlIHNlbmQgb3V0IHRoZSBtZXNzYWdlCisgICAgICAgICAgICAvLyBUaGlzIHdpbGwgZ3VhcmFudGVlIHRoZSByYXJlIGNhc2Ugd2hlcmUgdGhlIG1lc3NhZ2UgaXMgcHJvY2Vzc2VkCisgICAgICAgICAgICAvLyBiZWZvcmUgY2JoIGdvZXMgb3V0IG9mIHNjb3BlIGFuZCBjYXVzaW5nIHdlIGNhbGwgdGhlIHNlc3Npb24KKyAgICAgICAgICAgIC8vIGRlc3RydWN0b3Igd2hpbGUgaG9sZGluZyBkZXZpY2UgbG9jaworICAgICAgICAgICAgY2JoLm1TZXNzaW9uLmNsZWFyKCk7CisKKyAgICAgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTm8gbmVlZCB0byB0cmFjayBzZXF1ZW5jZSBjb21wbGV0ZSBpZiB0aGVyZSBpcyBubyBjYWxsYmFjayByZWdpc3RlcmVkCisgICAgICAgIGlmIChzZXFDb21wbGV0ZWQgfHwgIWhhc0NhbGxiYWNrKSB7CisgICAgICAgICAgICBpdCA9IG1TZXF1ZW5jZUxhc3RGcmFtZU51bWJlck1hcC5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENhbWVyYURldmljZTo6c3RvcExvb3BlckFuZERpc2Nvbm5lY3QoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZXZpY2VMb2NrKTsKKyAgICBzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+IHNlc3Npb24gPSBtQ3VycmVudFNlc3Npb24ucHJvbW90ZSgpOworICAgIGlmICghaXNDbG9zZWQoKSkgeworICAgICAgICBkaXNjb25uZWN0TG9ja2VkKHNlc3Npb24pOworICAgIH0KKyAgICBtQ3VycmVudFNlc3Npb24gPSBudWxscHRyOworICAgIGlmIChtQ2JMb29wZXIgIT0gbnVsbHB0cikgeworICAgICAgbUNiTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlci0+aWQoKSk7CisgICAgICBtQ2JMb29wZXItPnN0b3AoKTsKKyAgICB9CisgICAgbUNiTG9vcGVyLmNsZWFyKCk7CisgICAgbUhhbmRsZXIuY2xlYXIoKTsKK30KKworLyoqCisgICogQ2FtZXJhIHNlcnZpY2UgY2FsbGJhY2sgaW1wbGVtZW50YXRpb24KKyAgKi8KK2FuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4KK0NhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpvbkRldmljZUVycm9yKAorICAgICAgICBFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICBBTE9HRCgiRGV2aWNlIGVycm9yIHJlY2VpdmVkLCBjb2RlICVkLCBmcmFtZSBudW1iZXIgJSIgUFJJZDY0ICIsIHJlcXVlc3QgSUQgJWQsIHN1YnNlcSBJRCAlZCIKKyAgICAgICAgICAgICIgcGh5c2ljYWwgY2FtZXJhIElEICVzIiwgZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIsIHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQsCisgICAgICAgICAgICByZXN1bHRFeHRyYXMuYnVyc3RJZCwgcmVzdWx0RXh0cmFzLmVycm9yUGh5c2ljYWxDYW1lcmFJZC5jX3N0cigpKTsKKyAgICBhdXRvIHJldCA9IFZvaWQoKTsKKyAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChkZXYgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCisgICAgfQorCisgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gZGV2LT5tQ3VycmVudFNlc3Npb24ucHJvbW90ZSgpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChkZXYtPm1EZXZpY2VMb2NrKTsKKyAgICBpZiAoZGV2LT5tUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGNsb3NlZAorICAgIH0KKyAgICBzd2l0Y2ggKGVycm9yQ29kZSkgeworICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgeworICAgICAgICAgICAgLy8gQ2FtZXJhIGlzIGRpc2Nvbm5lY3RlZCwgY2xvc2UgdGhlIHNlc3Npb24gYW5kIGV4cGVjdCBubyBtb3JlIGNhbGxiYWNrcworICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHNlc3Npb24tPmNsb3NlQnlEZXZpY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldi0+bUN1cnJlbnRTZXNzaW9uID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPbkRpc2Nvbm5lY3RlZCwgZGV2LT5tSGFuZGxlcik7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGRldi0+bUFwcENhbGxiYWNrcy5jb250ZXh0KTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrRGV2aWNlS2V5LCAodm9pZCopIGRldi0+Z2V0V3JhcHBlcigpKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBkZXYtPm1BcHBDYWxsYmFja3Mub25EaXNjb25uZWN0ZWQpOworICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVua25vd24gZXJyb3IgZnJvbSBjYW1lcmEgZGV2aWNlOiAlZCIsIGVycm9yQ29kZSk7CisgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfREVWSUNFOgorICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX1NFUlZJQ0U6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgZXJyb3JWYWwgPSA6OkVSUk9SX0NBTUVSQV9ERVZJQ0U7CisgICAgICAgICAgICAvLyBXZSBrZWVwIHRoaXMgc3dpdGNoIHNpbmNlIHRoaXMgYmxvY2sgbWlnaHQgYmUgZW5jb3VudGVyZWQgd2l0aAorICAgICAgICAgICAgLy8gbW9yZSB0aGFuIGp1c3QgMiBzdGF0ZXMuIFRoZSBkZWZhdWx0IGZhbGx0aHJvdWdoIGNvdWxkIGhhdmUgdXMKKyAgICAgICAgICAgIC8vIGhhbmRsaW5nIG1vcmUgdW5tYXRjaGVkIGVycm9yIGNhc2VzLgorICAgICAgICAgICAgc3dpdGNoIChlcnJvckNvZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX0RFVklDRToKKyAgICAgICAgICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ERVZJQ0UpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX1NFUlZJQ0U6CisgICAgICAgICAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgICAgICAgICAgICAgIGVycm9yVmFsID0gOjpFUlJPUl9DQU1FUkFfU0VSVklDRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX1VOS05PV04pOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPbkVycm9yLCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgZGV2LT5tQXBwQ2FsbGJhY2tzLmNvbnRleHQpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtEZXZpY2VLZXksICh2b2lkKikgZGV2LT5nZXRXcmFwcGVyKCkpOworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIGRldi0+bUFwcENhbGxiYWNrcy5vbkVycm9yKTsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoa0Vycm9yQ29kZUtleSwgZXJyb3JWYWwpOworICAgICAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX1JFUVVFU1Q6CisgICAgICAgIGNhc2UgRXJyb3JDb2RlOjpDQU1FUkFfUkVTVUxUOgorICAgICAgICBjYXNlIEVycm9yQ29kZTo6Q0FNRVJBX0JVRkZFUjoKKyAgICAgICAgICAgIGRldi0+b25DYXB0dXJlRXJyb3JMb2NrZWQoZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2FuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4KK0NhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpvbkRldmljZUlkbGUoKSB7CisgICAgQUxPR1YoIkNhbWVyYSBpcyBub3cgaWRsZSIpOworICAgIGF1dG8gcmV0ID0gVm9pZCgpOworICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZGV2LT5tRGV2aWNlTG9jayk7CisgICAgaWYgKGRldi0+aXNDbG9zZWQoKSB8fCBkZXYtPm1SZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIGlmIChkZXYtPm1JZGxlKSB7CisgICAgICAgIC8vIEFscmVhZHkgaW4gaWRsZSBzdGF0ZS4gUG9zc2libHkgb3RoZXIgdGhyZWFkIGRpZCB3YWl0VW50aWxJZGxlCisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaWYgKGRldi0+bUN1cnJlbnRTZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIm9uRGV2aWNlSWRsZSBzZW5kaW5nIHN0YXRlIGNiIik7CisgICAgICAgIGlmIChkZXYtPm1CdXN5U2Vzc2lvbiAhPSBkZXYtPm1DdXJyZW50U2Vzc2lvbikgeworICAgICAgICAgICAgQUxPR0UoIkN1cnJlbnQgc2Vzc2lvbiAhPSBidXN5IHNlc3Npb24iKTsKKyAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIGRldi0+bUhhbmRsZXIpOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGRldi0+bUJ1c3lTZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgZGV2LT5tQnVzeVNlc3Npb24pOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkKikgZGV2LT5tQnVzeVNlc3Npb24tPm1Vc2VyU2Vzc2lvbkNhbGxiYWNrLm9uUmVhZHkpOworICAgICAgICAvLyBNYWtlIHN1cmUgd2UgY2xlYXIgdGhlIHNwIGZpcnN0IHNvIHRoZSBzZXNzaW9uIGRlc3RydWN0b3IgY2FuCisgICAgICAgIC8vIG9ubHkgaGFwcGVuIG9uIGhhbmRsZXIgdGhyZWFkICh3aGVyZSB3ZSBkb24ndCBob2xkIGRldmljZS9zZXNzaW9uIGxvY2spCisgICAgICAgIGRldi0+bUJ1c3lTZXNzaW9uLmNsZWFyKCk7CisgICAgICAgIGRldi0+cG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfQorICAgIGRldi0+bUlkbGUgPSB0cnVlOworICAgIGRldi0+bUZsdXNoaW5nID0gZmFsc2U7CisgICAgcmV0dXJuIHJldDsKK30KKworYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPgorQ2FtZXJhRGV2aWNlOjpTZXJ2aWNlQ2FsbGJhY2s6Om9uQ2FwdHVyZVN0YXJ0ZWQoCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgdWludDY0X3QgdGltZXN0YW1wKSB7CisgICAgYXV0byByZXQgPSBWb2lkKCk7CisKKyAgICBzcDxDYW1lcmFEZXZpY2U+IGRldiA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChkZXYgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmV0OyAvLyBkZXZpY2UgaGFzIGJlZW4gY2xvc2VkCisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChkZXYtPm1EZXZpY2VMb2NrKTsKKyAgICBpZiAoZGV2LT5pc0Nsb3NlZCgpIHx8IGRldi0+bVJlbW90ZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgaW50MzJfdCBzZXF1ZW5jZUlkID0gcmVzdWx0RXh0cmFzLnJlcXVlc3RJZDsKKyAgICBpbnQzMl90IGJ1cnN0SWQgPSByZXN1bHRFeHRyYXMuYnVyc3RJZDsKKworICAgIGF1dG8gaXQgPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmZpbmQoc2VxdWVuY2VJZCk7CisgICAgaWYgKGl0ICE9IGRldi0+bVNlcXVlbmNlQ2FsbGJhY2tNYXAuZW5kKCkpIHsKKyAgICAgICAgQ2FsbGJhY2tIb2xkZXIgY2JoID0gKCppdCkuc2Vjb25kOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3N0YXJ0IG9uU3RhcnQgPSBjYmgubU9uQ2FwdHVyZVN0YXJ0ZWQ7CisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiA9IGNiaC5tU2Vzc2lvbjsKKyAgICAgICAgaWYgKChzaXplX3QpIGJ1cnN0SWQgPj0gY2JoLm1SZXF1ZXN0cy5zaXplKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IHJlcXVlc3QgaW5kZXggJWQgb3V0IG9mIGJvdW5kIChzaXplICV6dSkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1cnN0SWQsIGNiaC5tUmVxdWVzdHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIGRldi0+c2V0Q2FtZXJhRGV2aWNlRXJyb3JMb2NrZWQoQUNBTUVSQV9FUlJPUl9DQU1FUkFfU0VSVklDRSk7CisgICAgICAgIH0KKyAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcXVlc3QgPSBjYmgubVJlcXVlc3RzW2J1cnN0SWRdOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FwdHVyZVN0YXJ0LCBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCopIG9uU3RhcnQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrQ2FwdHVyZVJlcXVlc3RLZXksIHJlcXVlc3QpOworICAgICAgICBtc2ctPnNldEludDY0KGtUaW1lU3RhbXBLZXksIHRpbWVzdGFtcCk7CisgICAgICAgIGRldi0+cG9zdFNlc3Npb25Nc2dBbmRDbGVhbnVwKG1zZyk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK2FuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4KK0NhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpvblJlc3VsdFJlY2VpdmVkKAorICAgICAgICBjb25zdCBGbXFTaXplT3JNZXRhZGF0YSYgcmVzdWx0TWV0YWRhdGEsCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4mIHBoeXNpY2FsUmVzdWx0SW5mb3MpIHsKKyAgICBhdXRvIHJldCA9IFZvaWQoKTsKKworICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKKyAgICB9CisgICAgaW50MzJfdCBzZXF1ZW5jZUlkID0gcmVzdWx0RXh0cmFzLnJlcXVlc3RJZDsKKyAgICBpbnQ2NF90IGZyYW1lTnVtYmVyID0gcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyOworICAgIGludDMyX3QgYnVyc3RJZCA9IHJlc3VsdEV4dHJhcy5idXJzdElkOworICAgIGJvb2wgICAgaXNQYXJ0aWFsUmVzdWx0ID0gKHJlc3VsdEV4dHJhcy5wYXJ0aWFsUmVzdWx0Q291bnQgPCBkZXYtPm1QYXJ0aWFsUmVzdWx0Q291bnQpOworCisgICAgaWYgKCFpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgQUxPR1YoIlNlcUlkICVkIGZyYW1lICUiIFBSSWQ2NCAiIHJlc3VsdCBhcnJpdmUuIiwgc2VxdWVuY2VJZCwgZnJhbWVOdW1iZXIpOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChkZXYtPm1EZXZpY2VMb2NrKTsKKyAgICBpZiAoZGV2LT5tUmVtb3RlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJldDsgLy8gZGV2aWNlIGhhcyBiZWVuIGRpc2Nvbm5lY3RlZAorICAgIH0KKworICAgIGlmIChkZXYtPmlzQ2xvc2VkKCkpIHsKKyAgICAgICAgaWYgKCFpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgICAgIGRldi0+bUZyYW1lTnVtYmVyVHJhY2tlci51cGRhdGVUcmFja2VyKGZyYW1lTnVtYmVyLCAvKmlzRXJyb3IqL2ZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBlYXJseSByZXR1cm4gdG8gYXZvaWQgY2FsbGJhY2sgc2VudCB0byBjbG9zZWQgZGV2aWNlcworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIENhbWVyYU1ldGFkYXRhIG1ldGFkYXRhQ29weTsKKyAgICBjYW1lcmFfc3RhdHVzX3Qgc3RhdHVzID0gcmVhZE9uZVJlc3VsdE1ldGFkYXRhKHJlc3VsdE1ldGFkYXRhLAorICAgICAgICAgICAgZGV2LT5tQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUuZ2V0KCksICZtZXRhZGF0YUNvcHkpOworICAgIGlmIChzdGF0dXMgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiJXM6IHJlc3VsdCBtZXRhZGF0YSBjb3VsZG4ndCBiZSBjb252ZXJ0ZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIG1ldGFkYXRhQ29weS51cGRhdGUoQU5EUk9JRF9MRU5TX0lORk9fU0hBRElOR19NQVBfU0laRSwgZGV2LT5tU2hhZGluZ01hcFNpemUsIC8qZGF0YV9jb3VudCovMik7CisgICAgbWV0YWRhdGFDb3B5LnVwZGF0ZShBTkRST0lEX1NZTkNfRlJBTUVfTlVNQkVSLCAmZnJhbWVOdW1iZXIsIC8qZGF0YV9jb3VudCovMSk7CisKKyAgICBhdXRvIGl0ID0gZGV2LT5tU2VxdWVuY2VDYWxsYmFja01hcC5maW5kKHNlcXVlbmNlSWQpOworICAgIGlmIChpdCAhPSBkZXYtPm1TZXF1ZW5jZUNhbGxiYWNrTWFwLmVuZCgpKSB7CisgICAgICAgIENhbGxiYWNrSG9sZGVyIGNiaCA9ICgqaXQpLnNlY29uZDsKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uID0gY2JoLm1TZXNzaW9uOworICAgICAgICBpZiAoKHNpemVfdCkgYnVyc3RJZCA+PSBjYmgubVJlcXVlc3RzLnNpemUoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvcjogcmVxdWVzdCBpbmRleCAlZCBvdXQgb2YgYm91bmQgKHNpemUgJXp1KSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVyc3RJZCwgY2JoLm1SZXF1ZXN0cy5zaXplKCkpOworICAgICAgICAgICAgZGV2LT5zZXRDYW1lcmFEZXZpY2VFcnJvckxvY2tlZChBQ0FNRVJBX0VSUk9SX0NBTUVSQV9TRVJWSUNFKTsKKyAgICAgICAgfQorICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gcmVxdWVzdCA9IGNiaC5tUmVxdWVzdHNbYnVyc3RJZF07CisgICAgICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gcmVzdWx0KG5ldyBBQ2FtZXJhTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgbWV0YWRhdGFDb3B5LnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fUkVTVUxUKSk7CisKKyAgICAgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb0xvY2FsPiBsb2NhbFBoeXNpY2FsUmVzdWx0OworICAgICAgICBsb2NhbFBoeXNpY2FsUmVzdWx0LnJlc2l6ZShwaHlzaWNhbFJlc3VsdEluZm9zLnNpemUoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGh5c2ljYWxSZXN1bHRJbmZvcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgbG9jYWxQaHlzaWNhbFJlc3VsdFtpXS5waHlzaWNhbENhbWVyYUlkID0gcGh5c2ljYWxSZXN1bHRJbmZvc1tpXS5waHlzaWNhbENhbWVyYUlkOworICAgICAgICAgICAgc3RhdHVzID0gcmVhZE9uZVJlc3VsdE1ldGFkYXRhKHBoeXNpY2FsUmVzdWx0SW5mb3NbaV0ucGh5c2ljYWxDYW1lcmFNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgZGV2LT5tQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICZsb2NhbFBoeXNpY2FsUmVzdWx0W2ldLnBoeXNpY2FsTWV0YWRhdGEpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBwaHlzaWNhbCBjYW1lcmEgcmVzdWx0IG1ldGFkYXRhIGNvdWxkbid0IGJlIGNvbnZlcnRlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzcDxBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gcGh5c2ljYWxSZXN1bHQoCisgICAgICAgICAgICAgICAgbmV3IEFDYW1lcmFQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvKGxvY2FsUGh5c2ljYWxSZXN1bHQsIGZyYW1lTnVtYmVyKSk7CisKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgKKyAgICAgICAgICAgICAgICBjYmgubUlzTG9naWNhbENhbWVyYUNhbGxiYWNrID8ga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdCA6IGtXaGF0Q2FwdHVyZVJlc3VsdCwKKyAgICAgICAgICAgICAgICBkZXYtPm1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBjYmgubUNvbnRleHQpOworICAgICAgICBtc2ctPnNldE9iamVjdChrU2Vzc2lvblNwS2V5LCBzZXNzaW9uKTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXF1ZXN0S2V5LCByZXF1ZXN0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa0NhcHR1cmVSZXN1bHRLZXksIHJlc3VsdCk7CisgICAgICAgIGlmIChpc1BhcnRpYWxSZXN1bHQpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYmgubU9uQ2FwdHVyZVByb2dyZXNzZWQpOworICAgICAgICB9IGVsc2UgaWYgKGNiaC5tSXNMb2dpY2FsQ2FtZXJhQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiljYmgubU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQpOworICAgICAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1BoeXNpY2FsQ2FwdHVyZVJlc3VsdEtleSwgcGh5c2ljYWxSZXN1bHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LAorICAgICAgICAgICAgICAgICAgICAodm9pZCAqKWNiaC5tT25DYXB0dXJlQ29tcGxldGVkKTsKKyAgICAgICAgfQorICAgICAgICBkZXYtPnBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0KKworICAgIGlmICghaXNQYXJ0aWFsUmVzdWx0KSB7CisgICAgICAgIGRldi0+bUZyYW1lTnVtYmVyVHJhY2tlci51cGRhdGVUcmFja2VyKGZyYW1lTnVtYmVyLCAvKmlzRXJyb3IqL2ZhbHNlKTsKKyAgICAgICAgZGV2LT5jaGVja0FuZEZpcmVTZXF1ZW5jZUNvbXBsZXRlTG9ja2VkKCk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPgorQ2FtZXJhRGV2aWNlOjpTZXJ2aWNlQ2FsbGJhY2s6Om9uUmVwZWF0aW5nUmVxdWVzdEVycm9yKAorICAgICAgICB1aW50NjRfdCBsYXN0RnJhbWVOdW1iZXIsIGludDMyX3Qgc3RvcHBlZFNlcXVlbmNlSWQpIHsKKyAgICBhdXRvIHJldCA9IFZvaWQoKTsKKworICAgIHNwPENhbWVyYURldmljZT4gZGV2ID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7IC8vIGRldmljZSBoYXMgYmVlbiBjbG9zZWQKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2woZGV2LT5tRGV2aWNlTG9jayk7CisKKyAgICBpbnQgcmVwZWF0aW5nU2VxdWVuY2VJZCA9IGRldi0+bVJlcGVhdGluZ1NlcXVlbmNlSWQ7CisgICAgaWYgKHN0b3BwZWRTZXF1ZW5jZUlkID09IHJlcGVhdGluZ1NlcXVlbmNlSWQpIHsKKyAgICAgICAgZGV2LT5tUmVwZWF0aW5nU2VxdWVuY2VJZCA9IFJFUVVFU1RfSURfTk9ORTsKKyAgICB9CisKKyAgICBkZXYtPmNoZWNrUmVwZWF0aW5nU2VxdWVuY2VDb21wbGV0ZUxvY2tlZChyZXBlYXRpbmdTZXF1ZW5jZUlkLCBsYXN0RnJhbWVOdW1iZXIpOworCisgICAgcmV0dXJuIHJldDsKK30KKworY2FtZXJhX3N0YXR1c190IENhbWVyYURldmljZTo6U2VydmljZUNhbGxiYWNrOjpyZWFkT25lUmVzdWx0TWV0YWRhdGEoCisgICAgICAgIGNvbnN0IEZtcVNpemVPck1ldGFkYXRhJiBmbXFTaXplT3JNZXRhZGF0YSwgUmVzdWx0TWV0YWRhdGFRdWV1ZSogbWV0YWRhdGFRdWV1ZSwKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEqIG1ldGFkYXRhKSB7CisgICAgaWYgKG1ldGFkYXRhUXVldWUgPT0gbnVsbHB0ciB8fCBtZXRhZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKyAgICBib29sIGNvbnZlcnRlZDsKKyAgICBIQ2FtZXJhTWV0YWRhdGEgaENhbWVyYU1ldGFkYXRhOworICAgIGlmIChmbXFTaXplT3JNZXRhZGF0YS5nZXREaXNjcmltaW5hdG9yKCkgPT0KKyAgICAgICAgICAgIEZtcVNpemVPck1ldGFkYXRhOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmZtcU1ldGFkYXRhU2l6ZSkgeworICAgICAgICBoQ2FtZXJhTWV0YWRhdGEucmVzaXplKGZtcVNpemVPck1ldGFkYXRhLmZtcU1ldGFkYXRhU2l6ZSgpKTsKKyAgICAgICAgYm9vbCByZWFkID0gbWV0YWRhdGFRdWV1ZS0+cmVhZCgKKyAgICAgICAgICAgICAgICBoQ2FtZXJhTWV0YWRhdGEuZGF0YSgpLCBmbXFTaXplT3JNZXRhZGF0YS5mbXFNZXRhZGF0YVNpemUoKSk7CisgICAgICAgIGlmICghcmVhZCkgeworICAgICAgICAgICAgQUxPR0UoIiVzIGNhcHR1cmUgcmVxdWVzdCBzZXR0aW5ncyBjb3VsZCd0IGJlIHJlYWQgZnJvbSBmbXEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBEbyB3ZSBhY3R1YWxseSBuZWVkIHRvIGNsb25lIGhlcmUgPworICAgICAgICBjb252ZXJ0ZWQgPSB1dGlsczo6Y29udmVydEZyb21IaWRsQ2xvbmVkKGhDYW1lcmFNZXRhZGF0YSwgbWV0YWRhdGEpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnZlcnRlZCA9IHV0aWxzOjpjb252ZXJ0RnJvbUhpZGxDbG9uZWQoZm1xU2l6ZU9yTWV0YWRhdGEubWV0YWRhdGEoKSwgbWV0YWRhdGEpOworICAgIH0KKworICAgIHJldHVybiBjb252ZXJ0ZWQgPyBBQ0FNRVJBX09LIDogQUNBTUVSQV9FUlJPUl9VTktOT1dOOworfQorCit9IC8vIG5hbWVzcGFjZSBhY2FtCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmggYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhRGV2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZjNjk5ZQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2UuaApAQCAtMCwwICsxLDQzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaWZuZGVmIF9BQ0FNRVJBX0RFVklDRV9ICisjZGVmaW5lIF9BQ0FNRVJBX0RFVklDRV9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvSUNhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYUNhcHR1cmVTZXNzaW9uLmg+CisKKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJ1dGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKK3VzaW5nIElDYW1lcmFEZXZpY2VDYWxsYmFjayA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrOwordXNpbmcgSUNhbWVyYURldmljZVVzZXIgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VVc2VyOwordXNpbmcgQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKK3VzaW5nIFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87Cit1c2luZyBQaHlzaWNhbENhbWVyYVNldHRpbmdzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhbWVyYVNldHRpbmdzOwordXNpbmcgU3VibWl0SW5mbyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6U3VibWl0SW5mbzsKK3VzaW5nIENhcHR1cmVSZXN1bHRFeHRyYXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXN1bHRFeHRyYXM7Cit1c2luZyBFcnJvckNvZGUgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkVycm9yQ29kZTsKK3VzaW5nIEZtcVNpemVPck1ldGFkYXRhID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpGbXFTaXplT3JNZXRhZGF0YTsKK3VzaW5nIFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZTsKK3VzaW5nIFN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6U3RhdHVzOwordXNpbmcgUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IGhhcmR3YXJlOjpNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwordXNpbmcgUmVxdWVzdE1ldGFkYXRhUXVldWUgPSBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPjsKK3VzaW5nIENhbWVyYVN0YXR1c0FuZElkID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhU3RhdHVzQW5kSWQ7CisKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIHV0aWxzOjpuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyOwordXNpbmcgdXRpbHM6OkNhcHR1cmVSZXF1ZXN0OwordXNpbmcgdXRpbHM6Ok91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyOworCisvLyBXcmFwIEFDYW1lcmFDYXB0dXJlRmFpbHVyZSBzbyBpdCBjYW4gYmUgcmVmLWNvdW50ZWQKK3N0cnVjdCBDYW1lcmFDYXB0dXJlRmFpbHVyZSA6IHB1YmxpYyBSZWZCYXNlLCBwdWJsaWMgQUNhbWVyYUNhcHR1cmVGYWlsdXJlIHsgfTsKKworLy8gV3JhcCBQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIHNvIHRoYXQgaXQgY2FuIGJlIHJlZi1jb3VudGVkCitzdHJ1Y3QgUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb0xvY2FsIHsKKyAgICBzdGQ6OnN0cmluZyBwaHlzaWNhbENhbWVyYUlkOworICAgIENhbWVyYU1ldGFkYXRhIHBoeXNpY2FsTWV0YWRhdGE7Cit9OworCitzdHJ1Y3QgQUNhbWVyYVBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm86IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBBQ2FtZXJhUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyhjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvTG9jYWw+JiBpbmZvLAorICAgICAgICAgICAgaW50NjRfdCBmcmFtZU51bWJlcikgOgorICAgICAgICBtUGh5c2ljYWxSZXN1bHRJbmZvKGluZm8pLCBtRnJhbWVOdW1iZXIoZnJhbWVOdW1iZXIpIHt9CisKKyAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvTG9jYWw+IG1QaHlzaWNhbFJlc3VsdEluZm87CisgICAgaW50NjRfdCBtRnJhbWVOdW1iZXI7Cit9OworCitjbGFzcyBDYW1lcmFEZXZpY2UgZmluYWwgOiBwdWJsaWMgUmVmQmFzZSB7CisgIHB1YmxpYzoKKyAgICBDYW1lcmFEZXZpY2UoY29uc3QgY2hhciogaWQsIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNiLAorICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFycywKKyAgICAgICAgICAgICAgICAgIEFDYW1lcmFEZXZpY2UqIHdyYXBwZXIpOworICAgIH5DYW1lcmFEZXZpY2UoKTsKKworICAgIGlubGluZSBjb25zdCBjaGFyKiBnZXRJZCgpIGNvbnN0IHsgcmV0dXJuIG1DYW1lcmFJZC5jX3N0cigpOyB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVJlcXVlc3QoCisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFJZExpc3QqIHBoeXNpY2FsQ2FtZXJhSWRMaXN0LAorICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdCkgY29uc3Q7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVNlc3Npb24oCisgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqICAgICAgIG91dHB1dHMsCisgICAgICAgICAgICBjb25zdCBBQ2FwdHVyZVJlcXVlc3QqIHNlc3Npb25QYXJhbWV0ZXJzLAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX3N0YXRlQ2FsbGJhY2tzKiBjYWxsYmFja3MsCisgICAgICAgICAgICAvKm91dCovQUNhbWVyYUNhcHR1cmVTZXNzaW9uKiogc2Vzc2lvbik7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogc2Vzc2lvbk91dHB1dENvbnRhaW5lcikgY29uc3Q7CisKKyAgICAvLyBDYWxsYmFja3MgZnJvbSBjYW1lcmEgc2VydmljZQorICAgIGNsYXNzIFNlcnZpY2VDYWxsYmFjayA6IHB1YmxpYyBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgeworICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBTZXJ2aWNlQ2FsbGJhY2soQ2FtZXJhRGV2aWNlKiBkZXZpY2UpIDogbURldmljZShkZXZpY2UpIHt9CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gb25EZXZpY2VFcnJvcihFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSBvdmVycmlkZTsKKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBvbkRldmljZUlkbGUoKSBvdmVycmlkZTsKKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBvbkNhcHR1cmVTdGFydGVkKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHRpbWVzdGFtcCkgb3ZlcnJpZGU7CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gb25SZXN1bHRSZWNlaXZlZChjb25zdCBGbXFTaXplT3JNZXRhZGF0YSYgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4mIHBoeXNpY2FsUmVzdWx0SW5mb3MpIG92ZXJyaWRlOworICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG9uUmVwZWF0aW5nUmVxdWVzdEVycm9yKHVpbnQ2NF90IGxhc3RGcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICBpbnQzMl90IHN0b3BwZWRTZXF1ZW5jZUlkKSBvdmVycmlkZTsKKyAgICAgIHByaXZhdGU6CisgICAgICAgIGNhbWVyYV9zdGF0dXNfdCByZWFkT25lUmVzdWx0TWV0YWRhdGEoY29uc3QgRm1xU2l6ZU9yTWV0YWRhdGEmIGZtcVNpemVPck1ldGFkYXRhLAorICAgICAgICAgICAgICAgIFJlc3VsdE1ldGFkYXRhUXVldWUqIG1ldGFkYXRhUXVldWUsIENhbWVyYU1ldGFkYXRhKiBtZXRhZGF0YSk7CisgICAgICAgIGNvbnN0IHdwPENhbWVyYURldmljZT4gbURldmljZTsKKyAgICB9OworICAgIGlubGluZSBzcDxJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+IGdldFNlcnZpY2VDYWxsYmFjaygpIHsKKyAgICAgICAgcmV0dXJuIG1TZXJ2aWNlQ2FsbGJhY2s7CisgICAgfTsKKworICAgIC8vIENhbWVyYSBkZXZpY2UgaXMgb25seSBmdW5jdGlvbmFsIGFmdGVyIHJlbW90ZSBiZWluZyBzZXQKKyAgICB2b2lkIHNldFJlbW90ZURldmljZShzcDxJQ2FtZXJhRGV2aWNlVXNlcj4gcmVtb3RlKTsKKworICAgIGJvb2wgc2V0RGV2aWNlTWV0YWRhdGFRdWV1ZXMoKTsKKyAgICBpbmxpbmUgQUNhbWVyYURldmljZSogZ2V0V3JhcHBlcigpIGNvbnN0IHsgcmV0dXJuIG1XcmFwcGVyOyB9OworCisgICAgLy8gU3RvcCB0aGUgbG9vcGVyIHRocmVhZCBhbmQgdW5yZWdpc3RlciB0aGUgaGFuZGxlcgorICAgIHZvaWQgc3RvcExvb3BlckFuZERpc2Nvbm5lY3QoKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb247CisgICAgZnJpZW5kIEFDYW1lcmFEZXZpY2U7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCkgY29uc3Q7CisKKyAgICAvLyBkZXZpY2UgZ29lcyBpbnRvIGZhdGFsIGVycm9yIHN0YXRlIGFmdGVyIHRoaXMKKyAgICB2b2lkIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKGNhbWVyYV9zdGF0dXNfdCBlcnJvcik7CisKKyAgICB2b2lkIGRpc2Nvbm5lY3RMb2NrZWQoc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiYgc2Vzc2lvbik7IC8vIGRpc2Nvbm5lY3QgZnJvbSBjYW1lcmEgc2VydmljZQorCisgICAgY2FtZXJhX3N0YXR1c190IHN0b3BSZXBlYXRpbmdMb2NrZWQoKTsKKworICAgIGNhbWVyYV9zdGF0dXNfdCBmbHVzaExvY2tlZChBQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKTsKKworICAgIGNhbWVyYV9zdGF0dXNfdCB3YWl0VW50aWxJZGxlTG9ja2VkKCk7CisKKyAgICB0ZW1wbGF0ZTxjbGFzcyBUPgorICAgIGNhbWVyYV9zdGF0dXNfdCBjYXB0dXJlTG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKKworICAgIHRlbXBsYXRlPGNsYXNzIFQ+CisgICAgY2FtZXJhX3N0YXR1c190IHNldFJlcGVhdGluZ1JlcXVlc3RzTG9ja2VkKHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgICAgIC8qb3B0aW9uYWwqL1QqIGNicywKKyAgICAgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgICAgICAvKm9wdGlvbmFsKi9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkKTsKKworICAgIHRlbXBsYXRlPGNsYXNzIFQ+CisgICAgY2FtZXJhX3N0YXR1c190IHN1Ym1pdFJlcXVlc3RzTG9ja2VkKAorICAgICAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICAgICAgaW50IG51bVJlcXVlc3RzLCBBQ2FwdHVyZVJlcXVlc3QqKiByZXF1ZXN0cywKKyAgICAgICAgICAgIC8qb3V0Ki9pbnQqIGNhcHR1cmVTZXF1ZW5jZUlkLAorICAgICAgICAgICAgYm9vbCBpc1JlcGVhdGluZyk7CisKKyAgICB2b2lkIGFkZFJlcXVlc3RTZXR0aW5nc01ldGFkYXRhKEFDYXB0dXJlUmVxdWVzdCAqYUNhcHR1cmVSZXF1ZXN0LCBzcDxDYXB0dXJlUmVxdWVzdD4gJnJlcSk7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgdXBkYXRlT3V0cHV0Q29uZmlndXJhdGlvbkxvY2tlZChBQ2FwdHVyZVNlc3Npb25PdXRwdXQgKm91dHB1dCk7CisKKyAgICAvLyBTaW5jZSB0aGlzIHdyaXRlcyB0byBJQ2FtZXJhRGV2aWNlVXNlcidzIGZtcSwgY2xpZW50cyBtdXN0IHRha2UgY2FyZSB0aGF0OgorICAgIC8vICAgYSkgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgc2VyaWFsbHkuCisgICAgLy8gICBiKSBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiBhY2NvcmRhbmNlIHdpdGggSUNhbWVyYURldmljZVVzZXIuc3VibWl0UmVxdWVzdExpc3QsCisgICAgLy8gICAgICBvdGhlcndpc2UsIHRoZSB3cm9uZyBjYXB0dXJlIHJlcXVlc3QgbWlnaHQgaGF2ZSB0aGUgd3Jvbmcgc2V0dGluZ3MKKyAgICAvLyAgICAgIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgICBjYW1lcmFfc3RhdHVzX3QgYWxsb2NhdGVDYXB0dXJlUmVxdWVzdExvY2tlZCgKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogcmVxdWVzdCwgc3A8Q2FwdHVyZVJlcXVlc3Q+JiBvdXRSZXEpOworICAgIHZvaWQgYWxsb2NhdGVPbmVDYXB0dXJlUmVxdWVzdE1ldGFkYXRhKAorICAgICAgICAgICAgUGh5c2ljYWxDYW1lcmFTZXR0aW5ncyYgY2FtZXJhU2V0dGluZ3MsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaWQsIGNvbnN0IHNwPEFDYW1lcmFNZXRhZGF0YT4mIG1ldGFkYXRhKTsKKworICAgIHN0YXRpYyBBQ2FwdHVyZVJlcXVlc3QqIGFsbG9jYXRlQUNhcHR1cmVSZXF1ZXN0KHNwPENhcHR1cmVSZXF1ZXN0PiYgcmVxLCBjb25zdCBjaGFyKiBkZXZpY2VJZCk7CisgICAgc3RhdGljIHZvaWQgZnJlZUFDYXB0dXJlUmVxdWVzdChBQ2FwdHVyZVJlcXVlc3QqKTsKKworICAgIC8vIG9ubHkgRm9yIHNlc3Npb24gdG8gaG9sZCBkZXZpY2UgbG9jaworICAgIC8vIEFsd2F5cyBncmFiIGRldmljZSBsb2NrIGJlZm9yZSBncmFiYmluZyBzZXNzaW9uIGxvY2sKKyAgICB2b2lkIGxvY2tEZXZpY2VGb3JTZXNzaW9uT3BzKCkgY29uc3QgeyBtRGV2aWNlTG9jay5sb2NrKCk7IH07CisgICAgdm9pZCB1bmxvY2tEZXZpY2UoKSBjb25zdCB7IG1EZXZpY2VMb2NrLnVubG9jaygpOyB9OworCisgICAgLy8gRm9yIGNhcHR1cmUgc2Vzc2lvbiB0byBub3RpZnkgaXRzIGVuZCBvZiBsaWZlCisgICAgdm9pZCBub3RpZnlTZXNzaW9uRW5kT2ZMaWZlTG9ja2VkKEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogc2Vzc2lvbik7CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtc0xvY2tlZChjb25zdCBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXIqIG91dHB1dHMsCisgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMpOworCisgICAgLy8gSW5wdXQgbWVzc2FnZSB3aWxsIGJlIHBvc3RlZCBhbmQgY2xlYXJlZCBhZnRlciB0aGlzIHJldHVybnMKKyAgICB2b2lkIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChzcDxBTWVzc2FnZT4mIG1zZyk7CisKKyAgICBtdXRhYmxlIE11dGV4IG1EZXZpY2VMb2NrOworICAgIGNvbnN0IGhpZGxfc3RyaW5nIG1DYW1lcmFJZDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENhbWVyYSBJRAorICAgIGNvbnN0IEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MgbUFwcENhbGxiYWNrczsgLy8gQ2FsbGJhY2sgdG8gYXBwCisgICAgY29uc3Qgc3A8QUNhbWVyYU1ldGFkYXRhPiBtQ2hhcnM7ICAgIC8vIENhbWVyYSBjaGFyYWN0ZXJpc3RpY3MKKyAgICBjb25zdCBzcDxTZXJ2aWNlQ2FsbGJhY2s+IG1TZXJ2aWNlQ2FsbGJhY2s7CisgICAgQUNhbWVyYURldmljZSogbVdyYXBwZXI7CisKKyAgICAvLyBzdHJlYW0gaWQgLT4gcGFpciBvZiAoQUNhbWVyYVdpbmRvd1R5cGUqIGZyb20gYXBwbGljYXRpb24sIE91dHB1dENvbmZpZ3VyYXRpb24gdXNlZCBmb3IKKyAgICAvLyBjYW1lcmEgc2VydmljZSkKKyAgICBzdGQ6Om1hcDxpbnQsIHN0ZDo6cGFpcjxuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyLCBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlcj4+IG1Db25maWd1cmVkT3V0cHV0czsKKworICAgIC8vIFRPRE86IG1heWJlIGEgYm9vbCB3aWxsIHN1ZmZpY2UgZm9yIHN5bmNocm9ub3VzIGltcGxlbWVudGF0aW9uPworICAgIHN0ZDo6YXRvbWljX2Jvb2wgbUNsb3Npbmc7CisgICAgaW5saW5lIGJvb2wgaXNDbG9zZWQoKSB7IHJldHVybiBtQ2xvc2luZzsgfQorCisgICAgYm9vbCBtSW5FcnJvciA9IGZhbHNlOworICAgIGNhbWVyYV9zdGF0dXNfdCBtRXJyb3IgPSBBQ0FNRVJBX09LOworICAgIHZvaWQgb25DYXB0dXJlRXJyb3JMb2NrZWQoCisgICAgICAgICAgICBFcnJvckNvZGUgZXJyb3JDb2RlLAorICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKKworICAgIGJvb2wgbUlkbGUgPSB0cnVlOworICAgIC8vIFRoaXMgd2lsbCBhdm9pZCBhIGJ1c3kgc2Vzc2lvbiBiZWluZyBkZWxldGVkIGJlZm9yZSBpdCdzIGJhY2sgdG8gaWRsZSBzdGF0ZQorICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gbUJ1c3lTZXNzaW9uOworCisgICAgc3A8SUNhbWVyYURldmljZVVzZXI+IG1SZW1vdGU7CisKKyAgICAvLyBMb29wZXIgdGhyZWFkIHRvIGhhbmRsZSBjYWxsYmFjayB0byBhcHAKKyAgICBzcDxBTG9vcGVyPiBtQ2JMb29wZXI7CisgICAgLy8gZGVmaW5pdGlvbiBvZiBoYW5kbGVyIGFuZCBtZXNzYWdlCisgICAgZW51bSB7CisgICAgICAgIC8vIERldmljZSBzdGF0ZSBjYWxsYmFja3MKKyAgICAgICAga1doYXRPbkRpc2Nvbm5lY3RlZCwgICAvLyBvbkRpc2Nvbm5lY3RlZAorICAgICAgICBrV2hhdE9uRXJyb3IsICAgICAgICAgIC8vIG9uRXJyb3IKKyAgICAgICAgLy8gU2Vzc2lvbiBzdGF0ZSBjYWxsYmFja3MKKyAgICAgICAga1doYXRTZXNzaW9uU3RhdGVDYiwgICAvLyBvblJlYWR5LCBvbkFjdGl2ZQorICAgICAgICAvLyBDYXB0dXJlIGNhbGxiYWNrcworICAgICAgICBrV2hhdENhcHR1cmVTdGFydCwgICAgIC8vIG9uQ2FwdHVyZVN0YXJ0ZWQKKyAgICAgICAga1doYXRDYXB0dXJlUmVzdWx0LCAgICAvLyBvbkNhcHR1cmVQcm9ncmVzc2VkLCBvbkNhcHR1cmVDb21wbGV0ZWQKKyAgICAgICAga1doYXRMb2dpY2FsQ2FwdHVyZVJlc3VsdCwgLy8gb25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZAorICAgICAgICBrV2hhdENhcHR1cmVGYWlsLCAgICAgIC8vIG9uQ2FwdHVyZUZhaWxlZAorICAgICAgICBrV2hhdExvZ2ljYWxDYXB0dXJlRmFpbCwgLy8gb25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWxlZAorICAgICAgICBrV2hhdENhcHR1cmVTZXFFbmQsICAgIC8vIG9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkCisgICAgICAgIGtXaGF0Q2FwdHVyZVNlcUFib3J0LCAgLy8gb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkCisgICAgICAgIGtXaGF0Q2FwdHVyZUJ1ZmZlckxvc3QsLy8gb25DYXB0dXJlQnVmZmVyTG9zdAorICAgICAgICAvLyBJbnRlcm5hbCBjbGVhbnVwCisgICAgICAgIGtXaGF0Q2xlYW5VcFNlc3Npb25zICAgLy8gQ2xlYW51cCBjYWNoZWQgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPgorICAgIH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDb250ZXh0S2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrRGV2aWNlS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrRXJyb3JDb2RlS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FsbGJhY2tGcEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga1Nlc3Npb25TcEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhcHR1cmVSZXF1ZXN0S2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrVGltZVN0YW1wS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQ2FwdHVyZVJlc3VsdEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga1BoeXNpY2FsQ2FwdHVyZVJlc3VsdEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhcHR1cmVGYWlsdXJlS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrU2VxdWVuY2VJZEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0ZyYW1lTnVtYmVyS2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrQW53S2V5OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBrRmFpbGluZ1BoeXNpY2FsQ2FtZXJhSWQ7CisKKyAgICBjbGFzcyBDYWxsYmFja0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBDYWxsYmFja0hhbmRsZXIoY29uc3QgY2hhciAqaWQpOworICAgICAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzdHJpbmcgbUlkOworICAgICAgICAvLyBUaGlzIGhhbmRsZXIgd2lsbCBjYWNoZSBhbGwgY2FwdHVyZSBzZXNzaW9uIHNwIHVudGlsIGtXaGF0Q2xlYW5VcFNlc3Npb25zCisgICAgICAgIC8vIGlzIHByb2Nlc3NlZC4gVGhpcyBpcyB1c2VkIHRvIGd1YXJhbnRlZSB0aGUgbGFzdCBzZXNzaW9uIHJlZmVyZW5jZSBpcyBhbHdheXMKKyAgICAgICAgLy8gYmVpbmcgcmVtb3ZlZCBpbiBjYWxsYmFjayB0aHJlYWQgd2l0aG91dCBob2xkaW5nIGNhbWVyYSBkZXZpY2UgbG9jaworICAgICAgICBWZWN0b3I8c3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPj4gbUNhY2hlZFNlc3Npb25zOworICAgIH07CisgICAgc3A8Q2FsbGJhY2tIYW5kbGVyPiBtSGFuZGxlcjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAqIENhcHR1cmUgc2Vzc2lvbiByZWxhdGVkIG1lbWJlcnMgKgorICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvLyBUaGUgY3VycmVudCBhY3RpdmUgc2Vzc2lvbgorICAgIHdwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gbUN1cnJlbnRTZXNzaW9uOworICAgIGJvb2wgbUZsdXNoaW5nID0gZmFsc2U7CisKKyAgICBpbnQgbU5leHRTZXNzaW9uSWQgPSAwOworICAgIC8vIFRPRE86IG1pZ2h0IG5lZWQgYW5vdGhlciBsb29wZXIvaGFuZGxlciB0byBoYW5kbGUgY2FsbGJhY2tzIGZyb20gc2VydmljZQorCisgICAgc3RhdGljIGNvbnN0IGludCBSRVFVRVNUX0lEX05PTkUgPSAtMTsKKyAgICBpbnQgbVJlcGVhdGluZ1NlcXVlbmNlSWQgPSBSRVFVRVNUX0lEX05PTkU7CisKKyAgICAvLyBzZXF1ZW5jZSBpZCAtPiBsYXN0IGZyYW1lIG51bWJlciBtYXAKKyAgICBzdGQ6Om1hcDxpbnQzMl90LCBpbnQ2NF90PiBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXA7CisKKyAgICBzdHJ1Y3QgQ2FsbGJhY2tIb2xkZXIgeworICAgICAgICBDYWxsYmFja0hvbGRlcihzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4+JiAgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzKiBjYnMpOworICAgICAgICBDYWxsYmFja0hvbGRlcihzcDxBQ2FtZXJhQ2FwdHVyZVNlc3Npb24+ICAgICAgICAgIHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxzcDxDYXB0dXJlUmVxdWVzdD4+JiAgcmVxdWVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNSZXBlYXRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja3MqIGxjYnMpOworCisgICAgICAgIHRlbXBsYXRlIDxjbGFzcyBUPgorICAgICAgICB2b2lkIGluaXRDYXB0dXJlQ2FsbGJhY2tzKFQqIGNicykgeworICAgICAgICAgICAgbUNvbnRleHQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVN0YXJ0ZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZVByb2dyZXNzZWQgPSBudWxscHRyOworICAgICAgICAgICAgbU9uQ2FwdHVyZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25Mb2dpY2FsQ2FtZXJhQ2FwdHVyZUZhaWxlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlRmFpbGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZCA9IG51bGxwdHI7CisgICAgICAgICAgICBtT25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1PbkNhcHR1cmVCdWZmZXJMb3N0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGlmIChjYnMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1Db250ZXh0ID0gY2JzLT5jb250ZXh0OworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTdGFydGVkID0gY2JzLT5vbkNhcHR1cmVTdGFydGVkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVQcm9ncmVzc2VkID0gY2JzLT5vbkNhcHR1cmVQcm9ncmVzc2VkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVTZXF1ZW5jZUNvbXBsZXRlZCA9IGNicy0+b25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQ7CisgICAgICAgICAgICAgICAgbU9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZCA9IGNicy0+b25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkOworICAgICAgICAgICAgICAgIG1PbkNhcHR1cmVCdWZmZXJMb3N0ID0gY2JzLT5vbkNhcHR1cmVCdWZmZXJMb3N0OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiAgIG1TZXNzaW9uOworICAgICAgICBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+PiAgbVJlcXVlc3RzOworICAgICAgICBjb25zdCBib29sICAgICAgICAgICAgICAgICAgbUlzUmVwZWF0aW5nOworICAgICAgICBjb25zdCBib29sICAgICAgICAgICAgICAgICAgbUlzTG9naWNhbENhbWVyYUNhbGxiYWNrOworCisgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgICAgICAgICBtQ29udGV4dDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19zdGFydCBtT25DYXB0dXJlU3RhcnRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgbU9uQ2FwdHVyZVByb2dyZXNzZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfcmVzdWx0IG1PbkNhcHR1cmVDb21wbGV0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19yZXN1bHQgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVDb21wbGV0ZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9sb2dpY2FsQ2FtZXJhX2NhcHR1cmVDYWxsYmFja19mYWlsZWQgbU9uTG9naWNhbENhbWVyYUNhcHR1cmVGYWlsZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfZmFpbGVkIG1PbkNhcHR1cmVGYWlsZWQ7CisgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tfc2VxdWVuY2VFbmQgbU9uQ2FwdHVyZVNlcXVlbmNlQ29tcGxldGVkOworICAgICAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrX3NlcXVlbmNlQWJvcnQgbU9uQ2FwdHVyZVNlcXVlbmNlQWJvcnRlZDsKKyAgICAgICAgQUNhbWVyYUNhcHR1cmVTZXNzaW9uX2NhcHR1cmVDYWxsYmFja19idWZmZXJMb3N0IG1PbkNhcHR1cmVCdWZmZXJMb3N0OworICAgIH07CisgICAgLy8gc2VxdWVuY2UgaWQgLT4gY2FsbGJhY2tzIG1hcAorICAgIHN0ZDo6bWFwPGludCwgQ2FsbGJhY2tIb2xkZXI+IG1TZXF1ZW5jZUNhbGxiYWNrTWFwOworCisgICAgc3RhdGljIGNvbnN0IGludDY0X3QgTk9fRlJBTUVTX0NBUFRVUkVEID0gLTE7CisgICAgY2xhc3MgRnJhbWVOdW1iZXJUcmFja2VyIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgLy8gVE9ETzogQ2FsbGVkIGluIG9uUmVzdWx0UmVjZWl2ZWQgYW5kIG9uQ2FwdHVyZUVycm9yTG9ja2VkCisgICAgICAgIHZvaWQgdXBkYXRlVHJhY2tlcihpbnQ2NF90IGZyYW1lTnVtYmVyLCBib29sIGlzRXJyb3IpOworICAgICAgICBpbmxpbmUgaW50NjRfdCBnZXRDb21wbGV0ZWRGcmFtZU51bWJlcigpIHsgcmV0dXJuIG1Db21wbGV0ZWRGcmFtZU51bWJlcjsgfQorICAgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCB1cGRhdGUoKTsKKyAgICAgICAgdm9pZCB1cGRhdGVDb21wbGV0ZWRGcmFtZU51bWJlcihpbnQ2NF90IGZyYW1lTnVtYmVyKTsKKworICAgICAgICBpbnQ2NF90IG1Db21wbGV0ZWRGcmFtZU51bWJlciA9IE5PX0ZSQU1FU19DQVBUVVJFRDsKKyAgICAgICAgTGlzdDxpbnQ2NF90PiBtU2tpcHBlZEZyYW1lTnVtYmVyczsKKyAgICAgICAgc3RkOjpzZXQ8aW50NjRfdD4gbUZ1dHVyZUVycm9yU2V0OworICAgIH07CisgICAgRnJhbWVOdW1iZXJUcmFja2VyIG1GcmFtZU51bWJlclRyYWNrZXI7CisKKyAgICB2b2lkIGNoZWNrUmVwZWF0aW5nU2VxdWVuY2VDb21wbGV0ZUxvY2tlZChjb25zdCBpbnQgc2VxdWVuY2VJZCwgY29uc3QgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIpOworICAgIHZvaWQgY2hlY2tBbmRGaXJlU2VxdWVuY2VDb21wbGV0ZUxvY2tlZCgpOworCisgICAgLy8gTWlzYyB2YXJpYWJsZXMKKyAgICBpbnQzMl90IG1TaGFkaW5nTWFwU2l6ZVsyXTsgICAvLyBjb25zdCBhZnRlciBjb25zdHJ1Y3RvcgorICAgIGludDMyX3QgbVBhcnRpYWxSZXN1bHRDb3VudDsgIC8vIGNvbnN0IGFmdGVyIGNvbnN0cnVjdG9yCisgICAgc3RkOjpzaGFyZWRfcHRyPFJlc3VsdE1ldGFkYXRhUXVldWU+IG1DYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUgPSBudWxscHRyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxSZXN1bHRNZXRhZGF0YVF1ZXVlPiBtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPSBudWxscHRyOworfTsKKworfSAvLyBuYW1lc3BhY2UgYWNhbTsKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQ7CisKKy8qKgorICogQUNhbWVyYURldmljZSBvcGFxdWUgc3RydWN0IGRlZmluaXRpb24KKyAqIExlYXZlIG91dHNpZGUgb2YgYW5kcm9pZCBuYW1lc3BhY2UgYmVjYXVzZSBpdCdzIE5ESyBzdHJ1Y3QKKyAqLworc3RydWN0IEFDYW1lcmFEZXZpY2UgeworICAgIEFDYW1lcmFEZXZpY2UoY29uc3QgY2hhciogaWQsIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNiLAorICAgICAgICAgICAgICAgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiBjaGFycykgOgorICAgICAgICAgICAgbURldmljZShuZXcgYW5kcm9pZDo6YWNhbTo6Q2FtZXJhRGV2aWNlKGlkLCBjYiwgc3RkOjptb3ZlKGNoYXJzKSwgdGhpcykpIHt9CisKKyAgICB+QUNhbWVyYURldmljZSgpOworICAgIC8qKioqKioqKioqKioqKioqKioqCisgICAgICogTkRLIHB1YmxpYyBBUElzICoKKyAgICAgKioqKioqKioqKioqKioqKioqKi8KKyAgICBpbmxpbmUgY29uc3QgY2hhciogZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlLT5nZXRJZCgpOyB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgY3JlYXRlQ2FwdHVyZVJlcXVlc3QoCisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX3JlcXVlc3RfdGVtcGxhdGUgdGVtcGxhdGVJZCwKKyAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFJZExpc3QqIHBoeXNpY2FsQ2FtZXJhSWRMaXN0LAorICAgICAgICAgICAgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURldmljZS0+Y3JlYXRlQ2FwdHVyZVJlcXVlc3QodGVtcGxhdGVJZCwgcGh5c2ljYWxDYW1lcmFJZExpc3QsIHJlcXVlc3QpOworICAgIH0KKworICAgIGNhbWVyYV9zdGF0dXNfdCBjcmVhdGVDYXB0dXJlU2Vzc2lvbigKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogICAgICAgb3V0cHV0cywKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlUmVxdWVzdCogc2Vzc2lvblBhcmFtZXRlcnMsCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fc3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrcywKKyAgICAgICAgICAgIC8qb3V0Ki9BQ2FtZXJhQ2FwdHVyZVNlc3Npb24qKiBzZXNzaW9uKSB7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5jcmVhdGVDYXB0dXJlU2Vzc2lvbihvdXRwdXRzLCBzZXNzaW9uUGFyYW1ldGVycywgY2FsbGJhY2tzLCBzZXNzaW9uKTsKKyAgICB9CisKKyAgICBjYW1lcmFfc3RhdHVzX3QgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgICAgIGNvbnN0IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lciogc2Vzc2lvbk91dHB1dENvbnRhaW5lcikgY29uc3QgeworICAgICAgICByZXR1cm4gbURldmljZS0+aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChzZXNzaW9uT3V0cHV0Q29udGFpbmVyKTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgKiBEZXZpY2UgaW50ZXJhbCBBUElzICoKKyAgICAgKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaW5saW5lIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OmFjYW06OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4gZ2V0U2VydmljZUNhbGxiYWNrKCkgeworICAgICAgICByZXR1cm4gbURldmljZS0+Z2V0U2VydmljZUNhbGxiYWNrKCk7CisgICAgfTsKKworICAgIC8vIENhbWVyYSBkZXZpY2UgaXMgb25seSBmdW5jdGlvbmFsIGFmdGVyIHJlbW90ZSBiZWluZyBzZXQKKyAgICBpbmxpbmUgdm9pZCBzZXRSZW1vdGVEZXZpY2UoYW5kcm9pZDo6c3A8YW5kcm9pZDo6YWNhbTo6SUNhbWVyYURldmljZVVzZXI+IHJlbW90ZSkgeworICAgICAgICBtRGV2aWNlLT5zZXRSZW1vdGVEZXZpY2UocmVtb3RlKTsKKyAgICB9CisgICAgaW5saW5lIGJvb2wgc2V0RGV2aWNlTWV0YWRhdGFRdWV1ZXMoKSB7CisgICAgICAgIHJldHVybiBtRGV2aWNlLT5zZXREZXZpY2VNZXRhZGF0YVF1ZXVlcygpOworICAgIH0KKyAgcHJpdmF0ZToKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjphY2FtOjpDYW1lcmFEZXZpY2U+IG1EZXZpY2U7Cit9OworCisjZW5kaWYgLy8gX0FDQU1FUkFfREVWSUNFX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2VWZW5kb3IuaW5jIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZVZlbmRvci5pbmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJkNWE1MgotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFEZXZpY2VWZW5kb3IuaW5jCkBAIC0wLDAgKzEsMTUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPENhbWVyYU1ldGFkYXRhLmg+CisKKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oIgorI2luY2x1ZGUgIkFDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oIgorI2luY2x1ZGUgIkFDYW1lcmFNZXRhZGF0YS5oIgorI2luY2x1ZGUgIkFDYXB0dXJlUmVxdWVzdC5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CisKK3RlbXBsYXRlPGNsYXNzIFQ+CitjYW1lcmFfc3RhdHVzX3QKK0NhbWVyYURldmljZTo6Y2FwdHVyZUxvY2tlZCgKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL2ZhbHNlKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVD4KK2NhbWVyYV9zdGF0dXNfdAorQ2FtZXJhRGV2aWNlOjpzZXRSZXBlYXRpbmdSZXF1ZXN0c0xvY2tlZCgKKyAgICAgICAgc3A8QUNhbWVyYUNhcHR1cmVTZXNzaW9uPiBzZXNzaW9uLAorICAgICAgICAvKm9wdGlvbmFsKi9UKiBjYnMsCisgICAgICAgIGludCBudW1SZXF1ZXN0cywgQUNhcHR1cmVSZXF1ZXN0KiogcmVxdWVzdHMsCisgICAgICAgIC8qb3B0aW9uYWwqL2ludCogY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICByZXR1cm4gc3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgICAgICBzZXNzaW9uLCBjYnMsIG51bVJlcXVlc3RzLCByZXF1ZXN0cywgY2FwdHVyZVNlcXVlbmNlSWQsIC8qaXNSZXBlYXRpbmcqL3RydWUpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2FtZXJhX3N0YXR1c190IENhbWVyYURldmljZTo6c3VibWl0UmVxdWVzdHNMb2NrZWQoCisgICAgICAgIHNwPEFDYW1lcmFDYXB0dXJlU2Vzc2lvbj4gc2Vzc2lvbiwKKyAgICAgICAgLypvcHRpb25hbCovVCogY2JzLAorICAgICAgICBpbnQgbnVtUmVxdWVzdHMsIEFDYXB0dXJlUmVxdWVzdCoqIHJlcXVlc3RzLAorICAgICAgICAvKm91dCovaW50KiBjYXB0dXJlU2VxdWVuY2VJZCwKKyAgICAgICAgYm9vbCBpc1JlcGVhdGluZykKK3sKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gY2hlY2tDYW1lcmFDbG9zZWRPckVycm9yTG9ja2VkKCk7CisgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgIEFMT0dFKCJDYW1lcmEgJXMgc3VibWl0IGNhcHR1cmUgcmVxdWVzdCBmYWlsZWQhIHJldCAlZCIsIGdldElkKCksIHJldCk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gRm9ybSB0d28gdmVjdG9ycyBvZiBjYXB0dXJlIHJlcXVlc3QsIG9uZSBmb3IgaW50ZXJuYWwgdHJhY2tpbmcKKyAgICBzdGQ6OnZlY3RvcjxmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0TGlzdDsKKyAgICBWZWN0b3I8c3A8Q2FwdHVyZVJlcXVlc3Q+PiByZXF1ZXN0c1Y7CisgICAgcmVxdWVzdHNWLnNldENhcGFjaXR5KG51bVJlcXVlc3RzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVJlcXVlc3RzOyBpKyspIHsKKyAgICAgICAgc3A8Q2FwdHVyZVJlcXVlc3Q+IHJlcTsKKyAgICAgICAgcmV0ID0gYWxsb2NhdGVDYXB0dXJlUmVxdWVzdExvY2tlZChyZXF1ZXN0c1tpXSwgcmVxKTsKKyAgICAgICAgLy8gV2UgbmVlZCB0byBjYWxsIHRoaXMgbWV0aG9kIHNpbmNlIGFmdGVyIHN1Ym1pdFJlcXVlc3RMaXN0IGlzIGNhbGxlZCwKKyAgICAgICAgLy8gdGhlIHJlcXVlc3QgbWV0YWRhdGEgcXVldWUgbWlnaHQgaGF2ZSByZW1vdmVkIHRoZSBjYXB0dXJlIHJlcXVlc3QKKyAgICAgICAgLy8gbWV0YWRhdGEuIFRoZXJlZm9yZSB3ZSBzaW1wbHkgYWRkIHRoZSBtZXRhZGF0YSB0byBpdHMgd3JhcHBlciBjbGFzcywKKyAgICAgICAgLy8gc28gdGhhdCBpdCBjYW4gYmUgcmV0cmlldmVkIGxhdGVyLgorICAgICAgICBhZGRSZXF1ZXN0U2V0dGluZ3NNZXRhZGF0YShyZXF1ZXN0c1tpXSwgcmVxKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ29udmVydCBjYXB0dXJlIHJlcXVlc3QgdG8gaW50ZXJuYWwgZm9ybWF0IGZhaWx1cmUhIHJldCAlZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIGlmIChyZXEtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYXB0dXJlIHJlcXVlc3Qgd2l0aG91dCBvdXRwdXQgdGFyZ2V0IGNhbm5vdCBiZSBzdWJtaXR0ZWQhIik7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgfQorICAgICAgICByZXF1ZXN0TGlzdC5wdXNoX2JhY2sodXRpbHM6OmNvbnZlcnRUb0hpZGwocmVxLmdldCgpKSk7CisgICAgICAgIHJlcXVlc3RzVi5wdXNoX2JhY2socmVxKTsKKyAgICB9CisgICAgaWYgKGlzUmVwZWF0aW5nKSB7CisgICAgICAgIHJldCA9IHN0b3BSZXBlYXRpbmdMb2NrZWQoKTsKKyAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN0b3AgcmVwZWF0aW5nIGZhaWxlZCEgcmV0ICVkIiwgZ2V0SWQoKSwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBTdWJtaXRJbmZvIGluZm87CisgICAgU3RhdHVzIHN0YXR1czsKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1SZW1vdGUtPnN1Ym1pdFJlcXVlc3RMaXN0KHJlcXVlc3RMaXN0LCBpc1JlcGVhdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmaW5mb10oYXV0byBzLCBhdXRvICZzdWJtaXRJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gc3VibWl0SW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgIGlmICghcmVtb3RlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGZvciBzdWJtaXRSZXF1ZXN0TGlzdCBjYWxsOiAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgcmVtb3RlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpOT19FUlJPUikgeworICAgICAgICByZXR1cm4gdXRpbHM6OmNvbnZlcnRGcm9tSGlkbChzdGF0dXMpOworICAgIH0KKyAgICBpbnQzMl90IHNlcXVlbmNlSWQgPSBpbmZvLnJlcXVlc3RJZDsKKyAgICBpbnQ2NF90IGxhc3RGcmFtZU51bWJlciA9IGluZm8ubGFzdEZyYW1lTnVtYmVyOworICAgIGlmIChzZXF1ZW5jZUlkIDwgMCkgeworICAgICAgICBBTE9HRSgiQ2FtZXJhICVzIHN1Ym1pdCByZXF1ZXN0IHJlbW90ZSBmYWlsdXJlOiByZXQgJWQiLCBnZXRJZCgpLCBzZXF1ZW5jZUlkKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBDYWxsYmFja0hvbGRlciBjYkhvbGRlcihzZXNzaW9uLCByZXF1ZXN0c1YsIGlzUmVwZWF0aW5nLCBjYnMpOworICAgIG1TZXF1ZW5jZUNhbGxiYWNrTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihzZXF1ZW5jZUlkLCBjYkhvbGRlcikpOworICAgIGlmIChpc1JlcGVhdGluZykgeworICAgICAgICAvLyBzdG9wUmVwZWF0aW5nIGFib3ZlIHNob3VsZCBoYXZlIGNsZWFudXAgcmVwZWF0aW5nIHNlcXVlbmNlIGlkCisgICAgICAgIGlmIChtUmVwZWF0aW5nU2VxdWVuY2VJZCAhPSBSRVFVRVNUX0lEX05PTkUpIHsKKyAgICAgICAgICAgIHNldENhbWVyYURldmljZUVycm9yTG9ja2VkKEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RFVklDRSk7CisgICAgICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfREVWSUNFOworICAgICAgICB9CisgICAgICAgIG1SZXBlYXRpbmdTZXF1ZW5jZUlkID0gc2VxdWVuY2VJZDsKKyAgICB9IGVsc2UgeworICAgICAgICBtU2VxdWVuY2VMYXN0RnJhbWVOdW1iZXJNYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHNlcXVlbmNlSWQsIGxhc3RGcmFtZU51bWJlcikpOworICAgIH0KKworICAgIGlmIChtSWRsZSkgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvblN0YXRlQ2IsIG1IYW5kbGVyKTsKKyAgICAgICAgbXNnLT5zZXRQb2ludGVyKGtDb250ZXh0S2V5LCBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5jb250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRPYmplY3Qoa1Nlc3Npb25TcEtleSwgc2Vzc2lvbik7CisgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ2FsbGJhY2tGcEtleSwgKHZvaWQqKSBzZXNzaW9uLT5tVXNlclNlc3Npb25DYWxsYmFjay5vbkFjdGl2ZSk7CisgICAgICAgIHBvc3RTZXNzaW9uTXNnQW5kQ2xlYW51cChtc2cpOworICAgIH0KKyAgICBtSWRsZSA9IGZhbHNlOworICAgIG1CdXN5U2Vzc2lvbiA9IHNlc3Npb247CisKKyAgICBpZiAoY2FwdHVyZVNlcXVlbmNlSWQpIHsKKyAgICAgICAgKmNhcHR1cmVTZXF1ZW5jZUlkID0gc2VxdWVuY2VJZDsKKyAgICB9CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFjYW0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYW1lcmFNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWFiMjlhCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNjEzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBQ2FtZXJhTWFuYWdlclZlbmRvciIKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaCIKKyNpbmNsdWRlICJBQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJuZGtfdmVuZG9yL2ltcGwvQUNhbWVyYURldmljZS5oIgorI2luY2x1ZGUgInV0aWxzLmgiCisjaW5jbHVkZSA8Q2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxjYW1lcmFfbWV0YWRhdGFfaGlkZGVuLmg+CisKKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSA8VmVuZG9yVGFnRGVzY3JpcHRvci5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YWNhbTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworCit1c2luZyBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFTdGF0dXNBbmRJZDsKK3VzaW5nIGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6UHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpoZWxwZXI6OlZlbmRvclRhZ0Rlc2NyaXB0b3I7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OmhlbHBlcjo6VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlOworCisvLyBTdGF0aWMgbWVtYmVyIGRlZmluaXRpb25zCitjb25zdCBjaGFyKiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjprQ2FtZXJhSWRLZXkgICA9ICJDYW1lcmFJZCI7Citjb25zdCBjaGFyKiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjprQ2FsbGJhY2tGcEtleSA9ICJDYWxsYmFja0ZwIjsKK2NvbnN0IGNoYXIqIENhbWVyYU1hbmFnZXJHbG9iYWw6OmtDb250ZXh0S2V5ICAgID0gIkNhbGxiYWNrQ29udGV4dCI7CitNdXRleCAgICAgICAgICAgICAgICBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpzTG9jazsKK0NhbWVyYU1hbmFnZXJHbG9iYWwqIENhbWVyYU1hbmFnZXJHbG9iYWw6OnNJbnN0YW5jZSA9IG51bGxwdHI7CisKKy8qKgorICogVGhlIHZlbmRvciB0YWcgZGVzY3JpcHRvciBjbGFzcyB0aGF0IHRha2VzIEhJREwgdmVuZG9yIHRhZyBpbmZvcm1hdGlvbiBhcworICogaW5wdXQuIE5vdCBwYXJ0IG9mIHZlbmRvciBhdmFpbGFibGUgVmVuZG9yVGFnRGVzY3JpcHRvciBjbGFzcyBiZWNhdXNlIHRoYXQgY2xhc3MgaXMgdXNlZCBieQorICogZGVmYXVsdCBIQUwgaW1wbGVtZW50YXRpb24gY29kZSBhcyB3ZWxsLgorICovCitjbGFzcyBIaWRsVmVuZG9yVGFnRGVzY3JpcHRvciA6IHB1YmxpYyBWZW5kb3JUYWdEZXNjcmlwdG9yIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBWZW5kb3JUYWdEZXNjcmlwdG9yIG9iamVjdCBmcm9tIHRoZSBISURMIFZlbmRvclRhZ1NlY3Rpb24KKyAgICAgKiB2ZWN0b3IuCisgICAgICoKKyAgICAgKiBSZXR1cm5zIE9LIG9uIHN1Y2Nlc3MsIG9yIGEgbmVnYXRpdmUgZXJyb3IgY29kZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgY3JlYXRlRGVzY3JpcHRvckZyb21IaWRsKGNvbnN0IGhpZGxfdmVjPFZlbmRvclRhZ1NlY3Rpb24+JiB2dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm91dCovIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+ICpkZXNjcmlwdG9yKTsKK307CisKK3N0YXR1c190IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwoY29uc3QgaGlkbF92ZWM8VmVuZG9yVGFnU2VjdGlvbj4gJnZ0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gKmRlc2NyaXB0b3IpIHsKKyAgICBpbnQgdGFnQ291bnQgPSAwOworCisgICAgZm9yIChzaXplX3QgcyA9IDA7IHMgPCB2dHMuc2l6ZSgpOyBzKyspIHsKKyAgICAgICAgdGFnQ291bnQgKz0gdnRzW3NdLnRhZ3Muc2l6ZSgpOworICAgIH0KKworICAgIGlmICh0YWdDb3VudCA8IDAgfHwgdGFnQ291bnQgPiBJTlQzMl9NQVgpIHsKKyAgICAgICAgQUxPR0UoIiVzOiB0YWcgY291bnQgJWQgZnJvbSB2ZW5kb3IgdGFnIHNlY3Rpb25zIGlzIGludmFsaWQuIiwgX19GVU5DVElPTl9fLCB0YWdDb3VudCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgVmVjdG9yPHVpbnQzMl90PiB0YWdBcnJheTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHRhZ0FycmF5LnJlc2l6ZSh0YWdDb3VudCkgIT0gdGFnQ291bnQsCisgICAgICAgICAgICAiJXM6IHRvbyBtYW55ICgldSkgdmVuZG9yIHRhZ3MgZGVmaW5lZC4iLCBfX0ZVTkNUSU9OX18sIHRhZ0NvdW50KTsKKworICAgIHNwPEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yPiBkZXNjID0gbmV3IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yKCk7CisgICAgZGVzYy0+bVRhZ0NvdW50ID0gdGFnQ291bnQ7CisKKyAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgU3RyaW5nOD4gdGFnVG9TZWN0aW9uTWFwOworCisgICAgaW50IGlkeCA9IDA7CisgICAgZm9yIChzaXplX3QgcyA9IDA7IHMgPCB2dHMuc2l6ZSgpOyBzKyspIHsKKyAgICAgICAgY29uc3QgVmVuZG9yVGFnU2VjdGlvbiYgc2VjdGlvbiA9IHZ0c1tzXTsKKyAgICAgICAgY29uc3QgY2hhciAqc2VjdGlvbk5hbWUgPSBzZWN0aW9uLnNlY3Rpb25OYW1lLmNfc3RyKCk7CisgICAgICAgIGlmIChzZWN0aW9uTmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IG5vIHNlY3Rpb24gbmFtZSBkZWZpbmVkIGZvciB2ZW5kb3IgdGFnIHNlY3Rpb24gJXp1LiIsIF9fRlVOQ1RJT05fXywgcyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIFN0cmluZzggc2VjdGlvblN0cmluZyhzZWN0aW9uTmFtZSk7CisgICAgICAgIGRlc2MtPm1TZWN0aW9ucy5hZGQoc2VjdGlvblN0cmluZyk7CisKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzZWN0aW9uLnRhZ3Muc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRhZyA9IHNlY3Rpb24udGFnc1tqXS50YWdJZDsKKyAgICAgICAgICAgIGlmICh0YWcgPCBDQU1FUkFfTUVUQURBVEFfVkVORE9SX1RBR19CT1VOREFSWSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogdmVuZG9yIHRhZyAlZCBub3QgaW4gdmVuZG9yIHRhZyBzZWN0aW9uLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB0YWdBcnJheS5lZGl0SXRlbUF0KGlkeCsrKSA9IHNlY3Rpb24udGFnc1tqXS50YWdJZDsKKworICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnTmFtZSA9IHNlY3Rpb24udGFnc1tqXS50YWdOYW1lLmNfc3RyKCk7CisgICAgICAgICAgICBpZiAodGFnTmFtZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBubyB0YWcgbmFtZSBkZWZpbmVkIGZvciB2ZW5kb3IgdGFnICVkLiIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVzYy0+bVRhZ1RvTmFtZU1hcC5hZGQodGFnLCBTdHJpbmc4KHRhZ05hbWUpKTsKKyAgICAgICAgICAgIHRhZ1RvU2VjdGlvbk1hcC5hZGQodGFnLCBzZWN0aW9uU3RyaW5nKTsKKworICAgICAgICAgICAgaW50IHRhZ1R5cGUgPSAoaW50KSBzZWN0aW9uLnRhZ3Nbal0udGFnVHlwZTsKKyAgICAgICAgICAgIGlmICh0YWdUeXBlIDwgMCB8fCB0YWdUeXBlID49IE5VTV9UWVBFUykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogdGFnIHR5cGUgJWQgZnJvbSB2ZW5kb3Igb3BzIGRvZXMgbm90IGV4aXN0LiIsIF9fRlVOQ1RJT05fXywgdGFnVHlwZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlc2MtPm1UYWdUb1R5cGVNYXAuZW1wbGFjZSh0YWcsIHRhZ1R5cGUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0YWdBcnJheS5zaXplKCk7ICsraSkgeworICAgICAgICB1aW50MzJfdCB0YWcgPSB0YWdBcnJheVtpXTsKKyAgICAgICAgU3RyaW5nOCBzZWN0aW9uU3RyaW5nID0gdGFnVG9TZWN0aW9uTWFwLnZhbHVlRm9yKHRhZyk7CisKKyAgICAgICAgLy8gU2V0IHVwIHRhZyB0byBzZWN0aW9uIGluZGV4IG1hcAorICAgICAgICBzc2l6ZV90IGluZGV4ID0gZGVzYy0+bVNlY3Rpb25zLmluZGV4T2Yoc2VjdGlvblN0cmluZyk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaW5kZXggPCAwLCAiaW5kZXggJXpkIG11c3QgYmUgbm9uLW5lZ2F0aXZlIiwgaW5kZXgpOworICAgICAgICBkZXNjLT5tVGFnVG9TZWN0aW9uTWFwLmFkZCh0YWcsIHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmRleCkpOworCisgICAgICAgIC8vIFNldCB1cCByZXZlcnNlIG1hcHBpbmcKKyAgICAgICAgc3NpemVfdCByZXZlcnNlSW5kZXggPSAtMTsKKyAgICAgICAgaWYgKChyZXZlcnNlSW5kZXggPSBkZXNjLT5tUmV2ZXJzZU1hcHBpbmcuaW5kZXhPZktleShzZWN0aW9uU3RyaW5nKSkgPCAwKSB7CisgICAgICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCB1aW50MzJfdD4qIG5hbWVNYXBwZXIgPSBuZXcgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgdWludDMyX3Q+KCk7CisgICAgICAgICAgICByZXZlcnNlSW5kZXggPSBkZXNjLT5tUmV2ZXJzZU1hcHBpbmcuYWRkKHNlY3Rpb25TdHJpbmcsIG5hbWVNYXBwZXIpOworICAgICAgICB9CisgICAgICAgIGRlc2MtPm1SZXZlcnNlTWFwcGluZ1tyZXZlcnNlSW5kZXhdLT5hZGQoZGVzYy0+bVRhZ1RvTmFtZU1hcC52YWx1ZUZvcih0YWcpLCB0YWcpOworICAgIH0KKworICAgICpkZXNjcmlwdG9yID0gc3RkOjptb3ZlKGRlc2MpOworICAgIHJldHVybiBPSzsKK30KKworQ2FtZXJhTWFuYWdlckdsb2JhbCYKK0NhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChzTG9jayk7CisgICAgQ2FtZXJhTWFuYWdlckdsb2JhbCogaW5zdGFuY2UgPSBzSW5zdGFuY2U7CisgICAgaWYgKGluc3RhbmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgaW5zdGFuY2UgPSBuZXcgQ2FtZXJhTWFuYWdlckdsb2JhbCgpOworICAgICAgICBzSW5zdGFuY2UgPSBpbnN0YW5jZTsKKyAgICB9CisgICAgcmV0dXJuICppbnN0YW5jZTsKK30KKworQ2FtZXJhTWFuYWdlckdsb2JhbDo6fkNhbWVyYU1hbmFnZXJHbG9iYWwoKSB7CisgICAgLy8gY2xlYXIgc0luc3RhbmNlIHNvIG5leHQgZ2V0SW5zdGFuY2UgY2FsbCBrbm93cyB0byBjcmVhdGUgYSBuZXcgb25lCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9zbChzTG9jayk7CisgICAgc0luc3RhbmNlID0gbnVsbHB0cjsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtQ2FtZXJhU2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIG1DYW1lcmFTZXJ2aWNlLT51bmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyKTsKKyAgICAgICAgbUNhbWVyYVNlcnZpY2UtPnJlbW92ZUxpc3RlbmVyKG1DYW1lcmFTZXJ2aWNlTGlzdGVuZXIpOworICAgIH0KKyAgICBtRGVhdGhOb3RpZmllci5jbGVhcigpOworICAgIGlmIChtQ2JMb29wZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtQ2JMb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyLT5pZCgpKTsKKyAgICAgICAgbUNiTG9vcGVyLT5zdG9wKCk7CisgICAgfQorICAgIG1DYkxvb3Blci5jbGVhcigpOworICAgIG1IYW5kbGVyLmNsZWFyKCk7CisgICAgbUNhbWVyYVNlcnZpY2VMaXN0ZW5lci5jbGVhcigpOworICAgIG1DYW1lcmFTZXJ2aWNlLmNsZWFyKCk7Cit9CisKK3N0YXRpYyBib29sIGlzQ2FtZXJhU2VydmljZURpc2FibGVkKCkgeworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBwcm9wZXJ0eV9nZXQoImNvbmZpZy5kaXNhYmxlX2NhbWVyYXNlcnZpY2UiLCB2YWx1ZSwgIjAiKTsKKyAgICByZXR1cm4gKHN0cm5jbXAodmFsdWUsICIwIiwgMikgIT0gMCAmJiBzdHJuY2FzZWNtcCh2YWx1ZSwgImZhbHNlIiwgNikgIT0gMCk7Cit9CisKK2Jvb2wgQ2FtZXJhTWFuYWdlckdsb2JhbDo6c2V0dXBWZW5kb3JUYWdzKCkgeworICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZT4gdGFnQ2FjaGUgPSBuZXcgVmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlKCk7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgc3RkOjp2ZWN0b3I8UHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zPiBwcm92aWRlcklkc0FuZFZ0czsKKyAgICBhdXRvIHJlbW90ZVJldCA9IG1DYW1lcmFTZXJ2aWNlLT5nZXRDYW1lcmFWZW5kb3JUYWdTZWN0aW9ucyhbJnN0YXR1cywgJnByb3ZpZGVySWRzQW5kVnRzXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvICZJZHNBbmRWdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcklkc0FuZFZ0cyA9IElkc0FuZFZ0czsgfSk7CisKKyAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXRyaWV2ZSBWZW5kb3JUYWdTZWN0aW9ucyAlcyIsIHJlbW90ZVJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIENvbnZlcnQgZWFjaCBwcm92aWRlcnMgVmVuZG9yVGFnU2VjdGlvbnMgaW50byBhIFZlbmRvclRhZ0Rlc2NyaXB0b3IgYW5kCisgICAgLy8gYWRkIGl0IHRvIHRoZSBjYWNoZQorICAgIGZvciAoYXV0byAmcHJvdmlkZXJJZEFuZFZ0cyA6IHByb3ZpZGVySWRzQW5kVnRzKSB7CisgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IHZlbmRvclRhZ0Rlc2NyaXB0b3I7CisgICAgICAgIGlmIChIaWRsVmVuZG9yVGFnRGVzY3JpcHRvcjo6Y3JlYXRlRGVzY3JpcHRvckZyb21IaWRsKHByb3ZpZGVySWRBbmRWdHMudmVuZG9yVGFnU2VjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZW5kb3JUYWdEZXNjcmlwdG9yKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjb252ZXJ0IGZyb20gSGlkbDogVmVuZG9yVGFnRGVzY3JpcHRvciIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHRhZ0NhY2hlLT5hZGRWZW5kb3JEZXNjcmlwdG9yKHByb3ZpZGVySWRBbmRWdHMucHJvdmlkZXJJZCwgdmVuZG9yVGFnRGVzY3JpcHRvcik7CisgICAgfQorICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTo6c2V0QXNHbG9iYWxWZW5kb3JUYWdDYWNoZSh0YWdDYWNoZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3NwPElDYW1lcmFTZXJ2aWNlPiBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRDYW1lcmFTZXJ2aWNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1DYW1lcmFTZXJ2aWNlLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGlzQ2FtZXJhU2VydmljZURpc2FibGVkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ2FtZXJhU2VydmljZTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBjYW1lcmFTZXJ2aWNlQmluZGVyOworICAgICAgICBkbyB7CisgICAgICAgICAgICBjYW1lcmFTZXJ2aWNlQmluZGVyID0gSUNhbWVyYVNlcnZpY2U6OmdldFNlcnZpY2UoKTsKKyAgICAgICAgICAgIGlmIChjYW1lcmFTZXJ2aWNlQmluZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dXKCJDYW1lcmFTZXJ2aWNlIG5vdCBwdWJsaXNoZWQsIHdhaXRpbmcuLi4iKTsKKyAgICAgICAgICAgIHVzbGVlcChrQ2FtZXJhU2VydmljZVBvbGxEZWxheSk7CisgICAgICAgIH0gd2hpbGUodHJ1ZSk7CisgICAgICAgIGlmIChtRGVhdGhOb3RpZmllciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKHRoaXMpOworICAgICAgICB9CisgICAgICAgIGNhbWVyYVNlcnZpY2VCaW5kZXItPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCAwKTsKKyAgICAgICAgbUNhbWVyYVNlcnZpY2UgPSBjYW1lcmFTZXJ2aWNlQmluZGVyOworCisgICAgICAgIC8vIFNldHVwIGxvb3BlciB0aHJlYWQgdG8gcGVyZnJvbSBhdmFpbGlhYmlsaXR5IGNhbGxiYWNrcworICAgICAgICBpZiAobUNiTG9vcGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1DYkxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgICAgICAgICAgbUNiTG9vcGVyLT5zZXROYW1lKCJDMk4tbWdyLWxvb3BlciIpOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbUNiTG9vcGVyLT5zdGFydCgKKyAgICAgICAgICAgICAgICAgICAgLypydW5PbkNhbGxpbmdUaHJlYWQqL2ZhbHNlLAorICAgICAgICAgICAgICAgICAgICAvKmNhbkNhbGxKYXZhKi8gICAgICAgdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgUFJJT1JJVFlfREVGQVVMVCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc3RhcnQgY2FtZXJhIHNlcnZpY2UgbGlzdGVuZXIgbG9vcGVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgICAgICAgICAgbUNiTG9vcGVyLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobUhhbmRsZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1IYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcigpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNiTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVnaXN0ZXIgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lcgorICAgICAgICBpZiAobUNhbWVyYVNlcnZpY2VMaXN0ZW5lciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtQ2FtZXJhU2VydmljZUxpc3RlbmVyID0gbmV3IENhbWVyYVNlcnZpY2VMaXN0ZW5lcih0aGlzKTsKKyAgICAgICAgfQorICAgICAgICBoaWRsX3ZlYzxDYW1lcmFTdGF0dXNBbmRJZD4gY2FtZXJhU3RhdHVzZXN7fTsKKyAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgICAgIGF1dG8gcmVtb3RlUmV0ID0gbUNhbWVyYVNlcnZpY2UtPmFkZExpc3RlbmVyKG1DYW1lcmFTZXJ2aWNlTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmY2FtZXJhU3RhdHVzZXNdKFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvICZyZXRTdGF0dXNlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYVN0YXR1c2VzID0gcmV0U3RhdHVzZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXJlbW90ZVJldC5pc09rKCkgfHwgc3RhdHVzICE9IFN0YXR1czo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWRkIGxpc3RlbmVyIHRvIGNhbWVyYSBzZXJ2aWNlICVzIiwgcmVtb3RlUmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBTZXR1cCB2ZW5kb3IgdGFncworICAgICAgICBpZiAoIXNldHVwVmVuZG9yVGFncygpKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCB1cCB2ZW5kb3IgdGFncyIpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8mIGMgOiBjYW1lcmFTdGF0dXNlcykgeworICAgICAgICAgICAgb25TdGF0dXNDaGFuZ2VkTG9ja2VkKGMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtQ2FtZXJhU2VydmljZTsKK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpEZWF0aE5vdGlmaWVyOjpzZXJ2aWNlRGllZCh1aW50NjRfdCBjb29raWUsIGNvbnN0IHdwPElCYXNlPiAmd2hvKSB7CisgICAgKHZvaWQpIGNvb2tpZTsKKyAgICAodm9pZCkgd2hvOworICAgIEFMT0dFKCJDYW1lcmEgc2VydmljZSBiaW5kZXJEaWVkISIpOworICAgIHNwPENhbWVyYU1hbmFnZXJHbG9iYWw+IGNtID0gbUNhbWVyYU1hbmFnZXIucHJvbW90ZSgpOworICAgIGlmIChjbSAhPSBudWxscHRyKSB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKGNtLT5tTG9jayk7CisgICAgICAgIGZvciAoYXV0byYgcGFpciA6IGNtLT5tRGV2aWNlU3RhdHVzTWFwKSB7CisgICAgICAgICAgICBDYW1lcmFTdGF0dXNBbmRJZCBjYW1lcmFTdGF0dXNBbmRJZDsKKyAgICAgICAgICAgIGNhbWVyYVN0YXR1c0FuZElkLmNhbWVyYUlkID0gcGFpci5maXJzdDsKKyAgICAgICAgICAgIGNhbWVyYVN0YXR1c0FuZElkLmRldmljZVN0YXR1cyA9IHBhaXIuc2Vjb25kOworICAgICAgICAgICAgY20tPm9uU3RhdHVzQ2hhbmdlZExvY2tlZChjYW1lcmFTdGF0dXNBbmRJZCk7CisgICAgICAgIH0KKyAgICAgICAgY20tPm1DYW1lcmFTZXJ2aWNlLmNsZWFyKCk7CisgICAgICAgIC8vIFRPRE86IGNvbnNpZGVyIGFkZGluZyByZS1jb25uZWN0IGNhbGwgaGVyZT8KKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhTWFuYWdlckdsb2JhbDo6cmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjaykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQ2FsbGJhY2sgY2IoY2FsbGJhY2spOworICAgIGF1dG8gcGFpciA9IG1DYWxsYmFja3MuaW5zZXJ0KGNiKTsKKyAgICAvLyBTZW5kIGluaXRpYWwgY2FsbGJhY2tzIGlmIGNhbGxiYWNrIGlzIG5ld2x5IHJlZ2lzdGVyZWQKKyAgICBpZiAocGFpci5zZWNvbmQpIHsKKyAgICAgICAgZm9yIChhdXRvJiBwYWlyIDogbURldmljZVN0YXR1c01hcCkgeworICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGNhbWVyYUlkID0gcGFpci5maXJzdDsKKyAgICAgICAgICAgIENhbWVyYURldmljZVN0YXR1cyBzdGF0dXMgPSBwYWlyLnNlY29uZDsKKworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlbmRTaW5nbGVDYWxsYmFjaywgbUhhbmRsZXIpOworICAgICAgICAgICAgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2sgY2IgPSBpc1N0YXR1c0F2YWlsYWJsZShzdGF0dXMpID8KKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2stPm9uQ2FtZXJhQXZhaWxhYmxlIDogY2FsbGJhY2stPm9uQ2FtZXJhVW5hdmFpbGFibGU7CisgICAgICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkICopIGNiKTsKKyAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcihrQ29udGV4dEtleSwgY2FsbGJhY2stPmNvbnRleHQpOworICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoa0NhbWVyYUlkS2V5LCBBU3RyaW5nKGNhbWVyYUlkLmNfc3RyKCkpKTsKKyAgICAgICAgICAgIG1zZy0+cG9zdCgpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OnVucmVnaXN0ZXJBdmFpbGFiaWxpdHlDYWxsYmFjaygKKyAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjaykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgQ2FsbGJhY2sgY2IoY2FsbGJhY2spOworICAgIG1DYWxsYmFja3MuZXJhc2UoY2IpOworfQorCit2b2lkIENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldENhbWVyYUlkTGlzdChzdGQ6OnZlY3RvcjxoaWRsX3N0cmluZz4qIGNhbWVyYUlkcykgeworICAgIC8vIEVuc3VyZSB0aGF0IHdlIGhhdmUgaW5pdGlhbGl6ZWQvcmVmcmVzaGVkIHRoZSBsaXN0IG9mIGF2YWlsYWJsZSBkZXZpY2VzCisgICAgYXV0byBjcyA9IGdldENhbWVyYVNlcnZpY2UoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgZm9yKGF1dG8mIGRldmljZVN0YXR1cyA6IG1EZXZpY2VTdGF0dXNNYXApIHsKKyAgICAgICAgaWYgKGRldmljZVN0YXR1cy5zZWNvbmQgPT0gQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX1BSRVNFTlQgfHwKKyAgICAgICAgICAgICAgICBkZXZpY2VTdGF0dXMuc2Vjb25kID09IENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX0VOVU1FUkFUSU5HKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjYW1lcmFJZHMtPnB1c2hfYmFjayhkZXZpY2VTdGF0dXMuZmlyc3QpOworICAgIH0KK30KKworYm9vbCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjp2YWxpZFN0YXR1cyhDYW1lcmFEZXZpY2VTdGF0dXMgc3RhdHVzKSB7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19OT1RfUFJFU0VOVDoKKyAgICAgICAgY2FzZSBDYW1lcmFEZXZpY2VTdGF0dXM6OlNUQVRVU19QUkVTRU5UOgorICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX0VOVU1FUkFUSU5HOgorICAgICAgICBjYXNlIENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX05PVF9BVkFJTEFCTEU6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgQ2FtZXJhTWFuYWdlckdsb2JhbDo6aXNTdGF0dXNBdmFpbGFibGUoQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cykgeworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgICAgIGNhc2UgQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfUFJFU0VOVDoKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpDYWxsYmFja0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFNlbmRTaW5nbGVDYWxsYmFjazoKKyAgICAgICAgeworICAgICAgICAgICAgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2sgY2I7CisgICAgICAgICAgICB2b2lkKiBjb250ZXh0OworICAgICAgICAgICAgQVN0cmluZyBjYW1lcmFJZDsKKyAgICAgICAgICAgIGJvb2wgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDYWxsYmFja0ZwS2V5LCAodm9pZCoqKSAmY2IpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FtZXJhIGNhbGxiYWNrIGZwISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRQb2ludGVyKGtDb250ZXh0S2V5LCAmY29udGV4dCk7CisgICAgICAgICAgICBpZiAoIWZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgZmluZCBjYWxsYmFjayBjb250ZXh0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm91bmQgPSBtc2ctPmZpbmRTdHJpbmcoa0NhbWVyYUlkS2V5LCAmY2FtZXJhSWQpOworICAgICAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2Fubm90IGZpbmQgY2FtZXJhIElEISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKCpjYikoY29udGV4dCwgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIiVzOiB1bmtub3duIG1lc3NhZ2UgdHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgbXNnLT53aGF0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCitoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYU1hbmFnZXJHbG9iYWw6OkNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6b25TdGF0dXNDaGFuZ2VkKAorICAgICAgICBjb25zdCBDYW1lcmFTdGF0dXNBbmRJZCAmc3RhdHVzQW5kSWQpIHsKKyAgICBzcDxDYW1lcmFNYW5hZ2VyR2xvYmFsPiBjbSA9IG1DYW1lcmFNYW5hZ2VyLnByb21vdGUoKTsKKyAgICBpZiAoY20gIT0gbnVsbHB0cikgeworICAgICAgICBjbS0+b25TdGF0dXNDaGFuZ2VkKHN0YXR1c0FuZElkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGRlbGl2ZXIgc3RhdHVzIGNoYW5nZS4gR2xvYmFsIGNhbWVyYSBtYW5hZ2VyIGRpZWQiKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpvblN0YXR1c0NoYW5nZWQoCisgICAgICAgIGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgb25TdGF0dXNDaGFuZ2VkTG9ja2VkKHN0YXR1c0FuZElkKTsKK30KKwordm9pZCBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpvblN0YXR1c0NoYW5nZWRMb2NrZWQoCisgICAgICAgIGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCkgeworICAgIGhpZGxfc3RyaW5nIGNhbWVyYUlkID0gc3RhdHVzQW5kSWQuY2FtZXJhSWQ7CisgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIHN0YXR1cyA9IHN0YXR1c0FuZElkLmRldmljZVN0YXR1czsKKyAgICBpZiAoIXZhbGlkU3RhdHVzKHN0YXR1cykpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHN0YXR1cyAlZCIsIF9fRlVOQ1RJT05fXywgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZmlyc3RTdGF0dXMgPSAobURldmljZVN0YXR1c01hcC5jb3VudChjYW1lcmFJZCkgPT0gMCk7CisgICAgQ2FtZXJhRGV2aWNlU3RhdHVzIG9sZFN0YXR1cyA9IGZpcnN0U3RhdHVzID8KKyAgICAgICAgICAgIHN0YXR1cyA6IC8vIGZpcnN0IHN0YXR1cworICAgICAgICAgICAgbURldmljZVN0YXR1c01hcFtjYW1lcmFJZF07CisKKyAgICBpZiAoIWZpcnN0U3RhdHVzICYmCisgICAgICAgICAgICBpc1N0YXR1c0F2YWlsYWJsZShzdGF0dXMpID09IGlzU3RhdHVzQXZhaWxhYmxlKG9sZFN0YXR1cykpIHsKKyAgICAgICAgLy8gTm8gc3RhdHVzIHVwZGF0ZS4gTm8gbmVlZCB0byBzZW5kIGNhbGxiYWNrCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJdGVyYXRlIHRocm91Z2ggYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2tzCisgICAgbURldmljZVN0YXR1c01hcFtjYW1lcmFJZF0gPSBzdGF0dXM7CisgICAgZm9yIChhdXRvIGNiIDogbUNhbGxiYWNrcykgeworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZFNpbmdsZUNhbGxiYWNrLCBtSGFuZGxlcik7CisgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIGNiRnAgPSBpc1N0YXR1c0F2YWlsYWJsZShzdGF0dXMpID8KKyAgICAgICAgICAgICAgICBjYi5tQXZhaWxhYmxlIDogY2IubVVuYXZhaWxhYmxlOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NhbGxiYWNrRnBLZXksICh2b2lkICopIGNiRnApOworICAgICAgICBtc2ctPnNldFBvaW50ZXIoa0NvbnRleHRLZXksIGNiLm1Db250ZXh0KTsKKyAgICAgICAgbXNnLT5zZXRTdHJpbmcoa0NhbWVyYUlkS2V5LCBBU3RyaW5nKGNhbWVyYUlkLmNfc3RyKCkpKTsKKyAgICAgICAgbXNnLT5wb3N0KCk7CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX1BSRVNFTlQpIHsKKyAgICAgICAgbURldmljZVN0YXR1c01hcC5lcmFzZShjYW1lcmFJZCk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBhY2FtCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKy8qKgorICogQUNhbWVyYU1hbmdlciBJbXBsZW1lbnRhdGlvbgorICovCitjYW1lcmFfc3RhdHVzX3QKK0FDYW1lcmFNYW5hZ2VyOjpnZXRDYW1lcmFJZExpc3QoQUNhbWVyYUlkTGlzdCoqIGNhbWVyYUlkTGlzdCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBzdGQ6OnZlY3RvcjxoaWRsX3N0cmluZz4gaWRMaXN0OworICAgIENhbWVyYU1hbmFnZXJHbG9iYWw6OmdldEluc3RhbmNlKCkuZ2V0Q2FtZXJhSWRMaXN0KCZpZExpc3QpOworCisgICAgaW50IG51bUNhbWVyYXMgPSBpZExpc3Quc2l6ZSgpOworICAgIEFDYW1lcmFJZExpc3QgKm91dCA9IG5ldyBBQ2FtZXJhSWRMaXN0OworICAgIGlmICghb3V0KSB7CisgICAgICAgIEFMT0dFKCJBbGxvY2F0ZSBtZW1vcnkgZm9yIEFDYW1lcmFJZExpc3QgZmFpbGVkISIpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9OT1RfRU5PVUdIX01FTU9SWTsKKyAgICB9CisgICAgb3V0LT5udW1DYW1lcmFzID0gbnVtQ2FtZXJhczsKKyAgICBvdXQtPmNhbWVyYUlkcyA9IG5ldyBjb25zdCBjaGFyKltudW1DYW1lcmFzXTsKKyAgICBpZiAoIW91dC0+Y2FtZXJhSWRzKSB7CisgICAgICAgIEFMT0dFKCJBbGxvY2F0ZSBtZW1vcnkgZm9yIEFDYW1lcmFJZExpc3QgZmFpbGVkISIpOworICAgICAgICBkZWxldGVDYW1lcmFJZExpc3Qob3V0KTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfTk9UX0VOT1VHSF9NRU1PUlk7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQ2FtZXJhczsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIqIHNyYyA9IGlkTGlzdFtpXS5jX3N0cigpOworICAgICAgICBzaXplX3QgZHN0U2l6ZSA9IHN0cmxlbihzcmMpICsgMTsKKyAgICAgICAgY2hhciogZHN0ID0gbmV3IGNoYXJbZHN0U2l6ZV07CisgICAgICAgIGlmICghZHN0KSB7CisgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGUgbWVtb3J5IGZvciBBQ2FtZXJhSWRMaXN0IGZhaWxlZCEiKTsKKyAgICAgICAgICAgIGRlbGV0ZUNhbWVyYUlkTGlzdChvdXQpOworICAgICAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfTk9UX0VOT1VHSF9NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgc3RybGNweShkc3QsIHNyYywgZHN0U2l6ZSk7CisgICAgICAgIG91dC0+Y2FtZXJhSWRzW2ldID0gZHN0OworICAgIH0KKyAgICAqY2FtZXJhSWRMaXN0ID0gb3V0OworICAgIHJldHVybiBBQ0FNRVJBX09LOworfQorCit2b2lkCitBQ2FtZXJhTWFuYWdlcjo6ZGVsZXRlQ2FtZXJhSWRMaXN0KEFDYW1lcmFJZExpc3QqIGNhbWVyYUlkTGlzdCkgeworICAgIGlmIChjYW1lcmFJZExpc3QgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAoY2FtZXJhSWRMaXN0LT5jYW1lcmFJZHMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYW1lcmFJZExpc3QtPm51bUNhbWVyYXM7IGkgKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoY2FtZXJhSWRMaXN0LT5jYW1lcmFJZHNbaV0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBkZWxldGVbXSBjYW1lcmFJZExpc3QtPmNhbWVyYUlkc1tpXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWxldGVbXSBjYW1lcmFJZExpc3QtPmNhbWVyYUlkczsKKyAgICAgICAgfQorICAgICAgICBkZWxldGUgY2FtZXJhSWRMaXN0OworICAgIH0KK30KKworY2FtZXJhX3N0YXR1c190IEFDYW1lcmFNYW5hZ2VyOjpnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCisgICAgICAgIGNvbnN0IGNoYXIgKmNhbWVyYUlkU3RyLCBzcDxBQ2FtZXJhTWV0YWRhdGE+ICpjaGFyYWN0ZXJpc3RpY3MpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IGNzID0gQ2FtZXJhTWFuYWdlckdsb2JhbDo6Z2V0SW5zdGFuY2UoKS5nZXRDYW1lcmFTZXJ2aWNlKCk7CisgICAgaWYgKGNzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDYW5ub3QgcmVhY2ggY2FtZXJhIHNlcnZpY2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEFDQU1FUkFfRVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDsKKyAgICB9CisgICAgQ2FtZXJhTWV0YWRhdGEgcmF3TWV0YWRhdGE7CisgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6Tk9fRVJST1I7CisgICAgYXV0byBzZXJ2aWNlUmV0ID0KKyAgICAgICAgY3MtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnJhd01ldGFkYXRhXSAoYXV0byBzICwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJm1ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHM6OmNvbnZlcnRGcm9tSGlkbENsb25lZChtZXRhZGF0YSwgJnJhd01ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXNlcnZpY2VSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJHZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmcm9tIGNhbWVyYSBzZXJ2aWNlIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9VTktOT1dOOyAvLyBzaG91bGQgbm90IHJlYWNoIGhlcmUKKyAgICB9CisKKyAgICAqY2hhcmFjdGVyaXN0aWNzID0gbmV3IEFDYW1lcmFNZXRhZGF0YSgKKyAgICAgICAgICAgIHJhd01ldGFkYXRhLnJlbGVhc2UoKSwgQUNhbWVyYU1ldGFkYXRhOjpBQ01fQ0hBUkFDVEVSSVNUSUNTKTsKKyAgICByZXR1cm4gQUNBTUVSQV9PSzsKK30KKworY2FtZXJhX3N0YXR1c190CitBQ2FtZXJhTWFuYWdlcjo6b3BlbkNhbWVyYSgKKyAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWQsCisgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrLAorICAgICAgICAvKm91dCovQUNhbWVyYURldmljZSoqIG91dERldmljZSkgeworICAgIHNwPEFDYW1lcmFNZXRhZGF0YT4gcmF3Q2hhcnM7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjYW1lcmFJZCwgJnJhd0NoYXJzKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBnZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmb3IgY2FtZXJhICVzLiBlcnIgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsIHJldCk7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0lOVkFMSURfUEFSQU1FVEVSOworICAgIH0KKworICAgIEFDYW1lcmFEZXZpY2UqIGRldmljZSA9IG5ldyBBQ2FtZXJhRGV2aWNlKGNhbWVyYUlkLCBjYWxsYmFjaywgc3RkOjptb3ZlKHJhd0NoYXJzKSk7CisKKyAgICBzcDxJQ2FtZXJhU2VydmljZT4gY3MgPSBDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpLmdldENhbWVyYVNlcnZpY2UoKTsKKyAgICBpZiAoY3MgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IENhbm5vdCByZWFjaCBjYW1lcmEgc2VydmljZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBkZWxldGUgZGV2aWNlOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOworICAgIH0KKworICAgIHNwPElDYW1lcmFEZXZpY2VDYWxsYmFjaz4gY2FsbGJhY2tzID0gZGV2aWNlLT5nZXRTZXJ2aWNlQ2FsbGJhY2soKTsKKyAgICBzcDxJQ2FtZXJhRGV2aWNlVXNlcj4gZGV2aWNlUmVtb3RlOworCisgICAgLy8gTm8gd2F5IHRvIGdldCBwYWNrYWdlIG5hbWUgZnJvbSBuYXRpdmUuCisgICAgLy8gU2VuZCBhIHplcm8gbGVuZ3RoIHBhY2thZ2UgbmFtZSBhbmQgbGV0IGNhbWVyYSBzZXJ2aWNlIGZpZ3VyZSBpdCBvdXQgZnJvbSBVSUQKKyAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpOT19FUlJPUjsKKyAgICBhdXRvIHNlcnZpY2VSZXQgPSBjcy0+Y29ubmVjdERldmljZSgKKyAgICAgICAgICAgIGNhbGxiYWNrcywgY2FtZXJhSWQsIFsmc3RhdHVzLCAmZGV2aWNlUmVtb3RlXShhdXRvIHMsIGF1dG8gJmRldmljZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlUmVtb3RlID0gZGV2aWNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisKKyAgICBpZiAoIXNlcnZpY2VSZXQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCIlczogY29ubmVjdCBjYW1lcmEgZGV2aWNlIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGRlbGV0ZSBkZXZpY2U7CisgICAgICAgIHJldHVybiB1dGlsczo6Y29udmVydEZyb21IaWRsKHN0YXR1cyk7CisgICAgfQorICAgIGlmIChkZXZpY2VSZW1vdGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGNvbm5lY3QgY2FtZXJhIGRldmljZSBmYWlsZWQhIHJlbW90ZSBkZXZpY2UgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGRlbGV0ZSBkZXZpY2U7CisgICAgICAgIHJldHVybiBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQ7CisgICAgfQorICAgIGRldmljZS0+c2V0UmVtb3RlRGV2aWNlKGRldmljZVJlbW90ZSk7CisgICAgZGV2aWNlLT5zZXREZXZpY2VNZXRhZGF0YVF1ZXVlcygpOworICAgICpvdXREZXZpY2UgPSBkZXZpY2U7CisgICAgcmV0dXJuIEFDQU1FUkFfT0s7Cit9CisKK2NhbWVyYV9zdGF0dXNfdAorQUNhbWVyYU1hbmFnZXI6OmdldFRhZ0Zyb21OYW1lKGNvbnN0IGNoYXIgKmNhbWVyYUlkLCBjb25zdCBjaGFyICpuYW1lLCB1aW50MzJfdCAqdGFnKSB7CisgICAgc3A8QUNhbWVyYU1ldGFkYXRhPiByYXdDaGFyczsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNhbWVyYUlkLCAmcmF3Q2hhcnMpOworICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICBBTE9HRSgiJXMsIENhbm5vdCByZXRyaWV2ZSBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBjYW1lcmEgaWQgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY2FtZXJhSWQpOworICAgICAgICByZXR1cm4gQUNBTUVSQV9FUlJPUl9NRVRBREFUQV9OT1RfRk9VTkQ7CisgICAgfQorICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSA9IHJhd0NoYXJzLT5nZXRJbnRlcm5hbERhdGEoKTsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3TWV0YWRhdGEgPSBtZXRhZGF0YS5nZXRBbmRMb2NrKCk7CisgICAgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdmVuZG9yVGFnSWQgPSBnZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl9pZChyYXdNZXRhZGF0YSk7CisgICAgbWV0YWRhdGEudW5sb2NrKHJhd01ldGFkYXRhKTsKKyAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU+IHZ0Q2FjaGUgPSBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU6OmdldEdsb2JhbFZlbmRvclRhZ0NhY2hlKCk7CisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gdlRhZ3MgPSBudWxscHRyOworICAgIHZ0Q2FjaGUtPmdldFZlbmRvclRhZ0Rlc2NyaXB0b3IodmVuZG9yVGFnSWQsICZ2VGFncyk7CisgICAgc3RhdHVzX3Qgc3RhdHVzPSBtZXRhZGF0YS5nZXRUYWdGcm9tTmFtZShuYW1lLCB2VGFncy5nZXQoKSwgdGFnKTsKKyAgICByZXR1cm4gc3RhdHVzID09IE9LID8gQUNBTUVSQV9PSyA6IEFDQU1FUkFfRVJST1JfTUVUQURBVEFfTk9UX0ZPVU5EOworfQorCitBQ2FtZXJhTWFuYWdlcjo6fkFDYW1lcmFNYW5hZ2VyKCkgeworCit9CmRpZmYgLS1naXQgYS9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC9BQ2FtZXJhTWFuYWdlci5oIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYzYyZDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhbWVyYU1hbmFnZXIuaApAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX0FDQU1FUkFfTUFOQUdFUl9ICisjZGVmaW5lIF9BQ0FNRVJBX01BTkFHRVJfSAorCisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYU1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wYXJzZWludC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisKKyNpbmNsdWRlIDxDYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhY2FtIHsKKwordXNpbmcgSUNhbWVyYVNlcnZpY2UgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpJQ2FtZXJhU2VydmljZTsKK3VzaW5nIENhbWVyYURldmljZVN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYURldmljZVN0YXR1czsKK3VzaW5nIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOwordXNpbmcgQ2FtZXJhU3RhdHVzQW5kSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFTdGF0dXNBbmRJZDsKK3VzaW5nIFN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6U3RhdHVzOwordXNpbmcgVmVuZG9yVGFnU2VjdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6VmVuZG9yVGFnU2VjdGlvbjsKK3VzaW5nIFZlbmRvclRhZyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6VmVuZG9yVGFnOwordXNpbmcgSUJhc2UgPSBhbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIGhhcmR3YXJlOjpWb2lkOworCisvKioKKyAqIFBlci1wcm9jZXNzIHNpbmdsZXRvbiBpbnN0YW5jZSBvZiBDYW1lcmFNYW5nZXIuIFNoYXJlZCBieSBhbGwgQUNhbWVyYU1hbmFnZXIKKyAqIGluc3RhbmNlcy4gQ3JlYXRlZCB3aGVuIGZpcnN0IEFDYW1lcmFNYW5hZ2VyIGlzIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZCB3aGVuCisgKiBhbGwgQUNhbWVyYU1hbmFnZXIgaW5zdGFuY2VzIGFyZSBkZWxldGVkLgorICoKKyAqIFRPRE86IG1heWJlIENhbWVyYU1hbmFnZXJHbG9iYWwgaXMgYmV0dGVyIHN1aXRlZCBpbiBsaWJjYW1lcmFjbGllbnQ/CisgKi8KK2NsYXNzIENhbWVyYU1hbmFnZXJHbG9iYWwgZmluYWwgOiBwdWJsaWMgUmVmQmFzZSB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgQ2FtZXJhTWFuYWdlckdsb2JhbCYgZ2V0SW5zdGFuY2UoKTsKKyAgICBzcDxJQ2FtZXJhU2VydmljZT4gZ2V0Q2FtZXJhU2VydmljZSgpOworCisgICAgdm9pZCByZWdpc3RlckF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzICpjYWxsYmFjayk7CisgICAgdm9pZCB1bnJlZ2lzdGVyQXZhaWxhYmlsaXR5Q2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBBQ2FtZXJhTWFuYWdlcl9BdmFpbGFiaWxpdHlDYWxsYmFja3MgKmNhbGxiYWNrKTsKKworICAgIHZvaWQgcmVnaXN0ZXJFeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFja3MqIC8qY2FsbGJhY2sqLykge30KKyAgICB2b2lkIHVucmVnaXN0ZXJFeHRlbmRlZEF2YWlsYWJpbGl0eUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgQUNhbWVyYU1hbmFnZXJfRXh0ZW5kZWRBdmFpbGFiaWxpdHlDYWxsYmFja3MqIC8qY2FsbGJhY2sqLykge30KKworICAgIC8qKgorICAgICAqIFJldHVybiBjYW1lcmEgSURzIHRoYXQgc3VwcG9ydCBjYW1lcmEyCisgICAgICovCisgICAgdm9pZCBnZXRDYW1lcmFJZExpc3Qoc3RkOjp2ZWN0b3I8aGlkbF9zdHJpbmc+ICpjYW1lcmFJZHMpOworCisgIHByaXZhdGU6CisgICAgc3A8SUNhbWVyYVNlcnZpY2U+IG1DYW1lcmFTZXJ2aWNlOworICAgIGNvbnN0IGludCAgICAgICAgICBrQ2FtZXJhU2VydmljZVBvbGxEZWxheSA9IDUwMDAwMDsgLy8gMC41cworICAgIE11dGV4ICAgICAgICAgICAgICBtTG9jazsKKyAgICBjbGFzcyBEZWF0aE5vdGlmaWVyIDogcHVibGljIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2RlYXRoX3JlY2lwaWVudCB7CisgICAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IERlYXRoTm90aWZpZXIoQ2FtZXJhTWFuYWdlckdsb2JhbCogY20pIDogbUNhbWVyYU1hbmFnZXIoY20pIHt9CisgICAgICBwcm90ZWN0ZWQ6CisgICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IGltcGxlbWVudGF0aW9uCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCh1aW50NjRfdCBjb29raWUsIGNvbnN0IHdwPElCYXNlPiAmd2hvKTsKKyAgICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IHdwPENhbWVyYU1hbmFnZXJHbG9iYWw+IG1DYW1lcmFNYW5hZ2VyOworICAgIH07CisgICAgc3A8RGVhdGhOb3RpZmllcj4gbURlYXRoTm90aWZpZXI7CisKKyAgICBjbGFzcyBDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgZmluYWwgOiBwdWJsaWMgSUNhbWVyYVNlcnZpY2VMaXN0ZW5lciB7CisgICAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IENhbWVyYVNlcnZpY2VMaXN0ZW5lcihDYW1lcmFNYW5hZ2VyR2xvYmFsKiBjbSkgOiBtQ2FtZXJhTWFuYWdlcihjbSkge30KKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjx2b2lkPiBvblN0YXR1c0NoYW5nZWQoCisgICAgICAgICAgICBjb25zdCBDYW1lcmFTdGF0dXNBbmRJZCAmc3RhdHVzQW5kSWQpIG92ZXJyaWRlOworCisgICAgICBwcml2YXRlOgorICAgICAgICBjb25zdCB3cDxDYW1lcmFNYW5hZ2VyR2xvYmFsPiBtQ2FtZXJhTWFuYWdlcjsKKyAgICB9OworICAgIHNwPENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gbUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKKworICAgIC8vIFdyYXBwZXIgb2YgQUNhbWVyYU1hbmFnZXJfQXZhaWxhYmlsaXR5Q2FsbGJhY2tzIHNvIHdlIGNhbiBzdG9yZSBpdCBpbiBzdGQ6OnNldAorICAgIHN0cnVjdCBDYWxsYmFjayB7CisgICAgICAgIGV4cGxpY2l0IENhbGxiYWNrKGNvbnN0IEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrcyAqY2FsbGJhY2spIDoKKyAgICAgICAgICAgIG1BdmFpbGFibGUoY2FsbGJhY2stPm9uQ2FtZXJhQXZhaWxhYmxlKSwKKyAgICAgICAgICAgIG1VbmF2YWlsYWJsZShjYWxsYmFjay0+b25DYW1lcmFVbmF2YWlsYWJsZSksCisgICAgICAgICAgICBtQ29udGV4dChjYWxsYmFjay0+Y29udGV4dCkge30KKworICAgICAgICBib29sIG9wZXJhdG9yID09IChjb25zdCBDYWxsYmFjayYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAobUF2YWlsYWJsZSA9PSBvdGhlci5tQXZhaWxhYmxlICYmCisgICAgICAgICAgICAgICAgICAgIG1VbmF2YWlsYWJsZSA9PSBvdGhlci5tVW5hdmFpbGFibGUgJiYKKyAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQgPT0gb3RoZXIubUNvbnRleHQpOworICAgICAgICB9CisgICAgICAgIGJvb2wgb3BlcmF0b3IgIT0gKGNvbnN0IENhbGxiYWNrJiBvdGhlcikgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgICAgICB9CisgICAgICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CisgICAgICAgICAgICBpZiAoKnRoaXMgPT0gb3RoZXIpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtQ29udGV4dCAhPSBvdGhlci5tQ29udGV4dCkgcmV0dXJuIG1Db250ZXh0IDwgb3RoZXIubUNvbnRleHQ7CisgICAgICAgICAgICBpZiAobUF2YWlsYWJsZSAhPSBvdGhlci5tQXZhaWxhYmxlKSByZXR1cm4gbUF2YWlsYWJsZSA8IG90aGVyLm1BdmFpbGFibGU7CisgICAgICAgICAgICByZXR1cm4gbVVuYXZhaWxhYmxlIDwgb3RoZXIubVVuYXZhaWxhYmxlOworICAgICAgICB9CisgICAgICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgQ2FsbGJhY2smIG90aGVyKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKCp0aGlzICE9IG90aGVyICYmICEoKnRoaXMgPCBvdGhlcikpOworICAgICAgICB9CisgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIG1BdmFpbGFibGU7CisgICAgICAgIEFDYW1lcmFNYW5hZ2VyX0F2YWlsYWJpbGl0eUNhbGxiYWNrIG1VbmF2YWlsYWJsZTsKKyAgICAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQ7CisgICAgfTsKKyAgICBzdGQ6OnNldDxDYWxsYmFjaz4gbUNhbGxiYWNrczsKKworICAgIC8vIGRlZmluaXRpb24gb2YgaGFuZGxlciBhbmQgbWVzc2FnZQorICAgIGVudW0geworICAgICAgICBrV2hhdFNlbmRTaW5nbGVDYWxsYmFjaworICAgIH07CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDYW1lcmFJZEtleTsKKyAgICBzdGF0aWMgY29uc3QgY2hhcioga0NhbGxiYWNrRnBLZXk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIGtDb250ZXh0S2V5OworICAgIGNsYXNzIENhbGxiYWNrSGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgICBwdWJsaWM6CisgICAgICAgIENhbGxiYWNrSGFuZGxlcigpIHt9CisgICAgICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworICAgIH07CisgICAgc3A8Q2FsbGJhY2tIYW5kbGVyPiBtSGFuZGxlcjsKKyAgICBzcDxBTG9vcGVyPiAgICAgICAgIG1DYkxvb3BlcjsgLy8gTG9vcGVyIHRocmVhZCB3aGVyZSBjYWxsYmFja3MgYWN0dWFsbHkgaGFwcGVuIG9uCisKKyAgICB2b2lkIG9uU3RhdHVzQ2hhbmdlZChjb25zdCBDYW1lcmFTdGF0dXNBbmRJZCAmc3RhdHVzQW5kSWQpOworICAgIHZvaWQgb25TdGF0dXNDaGFuZ2VkTG9ja2VkKGNvbnN0IENhbWVyYVN0YXR1c0FuZElkICZzdGF0dXNBbmRJZCk7CisgICAgYm9vbCBzZXR1cFZlbmRvclRhZ3MoKTsKKworICAgIC8vIFV0aWxzIGZvciBzdGF0dXMKKyAgICBzdGF0aWMgYm9vbCB2YWxpZFN0YXR1cyhDYW1lcmFEZXZpY2VTdGF0dXMgc3RhdHVzKTsKKyAgICBzdGF0aWMgYm9vbCBpc1N0YXR1c0F2YWlsYWJsZShDYW1lcmFEZXZpY2VTdGF0dXMgc3RhdHVzKTsKKworICAgIC8vIFRoZSBzb3J0IGxvZ2ljIG11c3QgbWF0Y2ggdGhlIGxvZ2ljIGluCisgICAgLy8gbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcDo6Z2V0QVBJMUNvbXBhdGlibGVDYW1lcmFEZXZpY2VJZHMKKyAgICBzdHJ1Y3QgQ2FtZXJhSWRDb21wYXJhdG9yIHsKKyAgICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGhpZGxfc3RyaW5nJiBhLCBjb25zdCBoaWRsX3N0cmluZyYgYikgY29uc3QgeworICAgICAgICAgICAgdWludDMyX3QgYVVpbnQgPSAwLCBiVWludCA9IDA7CisgICAgICAgICAgICBib29sIGFJc1VpbnQgPSBiYXNlOjpQYXJzZVVpbnQoYS5jX3N0cigpLCAmYVVpbnQpOworICAgICAgICAgICAgYm9vbCBiSXNVaW50ID0gYmFzZTo6UGFyc2VVaW50KGIuY19zdHIoKSwgJmJVaW50KTsKKworICAgICAgICAgICAgLy8gVWludCBkZXZpY2UgSURzIGZpcnN0CisgICAgICAgICAgICBpZiAoYUlzVWludCAmJiBiSXNVaW50KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGFVaW50IDwgYlVpbnQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFJc1VpbnQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoYklzVWludCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFNpbXBsZSBzdHJpbmcgY29tcGFyZSBpZiBib3RoIGlkIGFyZSBub3QgdWludAorICAgICAgICAgICAgcmV0dXJuIGEgPCBiOworICAgICAgICB9CisgICAgfTsKKworICAgIC8vIE1hcCBjYW1lcmFfaWQgLT4gc3RhdHVzCisgICAgc3RkOjptYXA8aGlkbF9zdHJpbmcsIENhbWVyYURldmljZVN0YXR1cywgQ2FtZXJhSWRDb21wYXJhdG9yPiBtRGV2aWNlU3RhdHVzTWFwOworCisgICAgLy8gRm9yIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UKKyAgICBzdGF0aWMgTXV0ZXggc0xvY2s7CisgICAgc3RhdGljIENhbWVyYU1hbmFnZXJHbG9iYWwqIHNJbnN0YW5jZTsKKyAgICBDYW1lcmFNYW5hZ2VyR2xvYmFsKCkge307CisgICAgfkNhbWVyYU1hbmFnZXJHbG9iYWwoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFjYW07Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkOworCisvKioKKyAqIEFDYW1lcmFNYW5hZ2VyIG9wYXF1ZSBzdHJ1Y3QgZGVmaW5pdGlvbgorICogTGVhdmUgb3V0c2lkZSBvZiBhbmRyb2lkIG5hbWVzcGFjZSBiZWNhdXNlIGl0J3MgTkRLIHN0cnVjdAorICovCitzdHJ1Y3QgQUNhbWVyYU1hbmFnZXIgeworICAgIEFDYW1lcmFNYW5hZ2VyKCkgOgorICAgICAgICAgICAgbUdsb2JhbE1hbmFnZXIoJihhbmRyb2lkOjphY2FtOjpDYW1lcmFNYW5hZ2VyR2xvYmFsOjpnZXRJbnN0YW5jZSgpKSkge30KKyAgICB+QUNhbWVyYU1hbmFnZXIoKTsKKyAgICBjYW1lcmFfc3RhdHVzX3QgZ2V0Q2FtZXJhSWRMaXN0KEFDYW1lcmFJZExpc3QqKiBjYW1lcmFJZExpc3QpOworICAgIHN0YXRpYyB2b2lkICAgICBkZWxldGVDYW1lcmFJZExpc3QoQUNhbWVyYUlkTGlzdCogY2FtZXJhSWRMaXN0KTsKKworICAgIGNhbWVyYV9zdGF0dXNfdCBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCisgICAgICAgICAgICBjb25zdCBjaGFyKiBjYW1lcmFJZCwgYW5kcm9pZDo6c3A8QUNhbWVyYU1ldGFkYXRhPiogY2hhcmFjdGVyaXN0aWNzKTsKKworICAgIGNhbWVyYV9zdGF0dXNfdCBvcGVuQ2FtZXJhKGNvbnN0IGNoYXIqIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MqIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qb3V0Ki9BQ2FtZXJhRGV2aWNlKiogZGV2aWNlKTsKKyAgICBjYW1lcmFfc3RhdHVzX3QgZ2V0VGFnRnJvbU5hbWUoY29uc3QgY2hhciAqY2FtZXJhSWQsIGNvbnN0IGNoYXIgKm5hbWUsIHVpbnQzMl90ICp0YWcpOworCisgIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtDYW1lcmFJZExpc3ROb3RJbml0ID0gLTEKKyAgICB9OworICAgIGFuZHJvaWQ6Ok11dGV4ICAgICAgICAgbUxvY2s7CisgICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6YWNhbTo6Q2FtZXJhTWFuYWdlckdsb2JhbD4gbUdsb2JhbE1hbmFnZXI7Cit9OworCisjZW5kaWYgLy9fQUNBTUVSQV9NQU5BR0VSX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYXB0dXJlUmVxdWVzdFZlbmRvci5oIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvQUNhcHR1cmVSZXF1ZXN0VmVuZG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2NzYxNQotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL0FDYXB0dXJlUmVxdWVzdFZlbmRvci5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAidXRpbHMuaCIKKworc3RydWN0IEFDYW1lcmFPdXRwdXRUYXJnZXQgeworICAgIGV4cGxpY2l0IEFDYW1lcmFPdXRwdXRUYXJnZXQobmF0aXZlX2hhbmRsZV90KiB3aW5kb3cpIDogbVdpbmRvdyh3aW5kb3cpIHt9OworCisgICAgYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQUNhbWVyYU91dHB1dFRhcmdldCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgPT0gb3RoZXIubVdpbmRvdzsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgQUNhbWVyYU91dHB1dFRhcmdldCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgIT0gb3RoZXIubVdpbmRvdzsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciA8IChjb25zdCBBQ2FtZXJhT3V0cHV0VGFyZ2V0JiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gbVdpbmRvdyA8IG90aGVyLm1XaW5kb3c7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgQUNhbWVyYU91dHB1dFRhcmdldCYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1XaW5kb3cgPiBvdGhlci5tV2luZG93OworICAgIH0KKworICAgIGFuZHJvaWQ6OmFjYW06OnV0aWxzOjpuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyIG1XaW5kb3c7Cit9OwpkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuY3BwIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZmIyMDQKLS0tIC9kZXYvbnVsbAorKysgYi9jYW1lcmEvbmRrL25ka192ZW5kb3IvaW1wbC91dGlscy5jcHAKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFDYW1lcmFWZW5kb3JVdGlscyIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAidXRpbHMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGFjYW0geworbmFtZXNwYWNlIHV0aWxzIHsKKworLy8gQ29udmVydCBDYXB0dXJlUmVxdWVzdCB3cmFwcGFibGUgYnkgc3A8PiB0byBoaWRsIENhcHR1cmVSZXF1ZXN0LgorZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVxdWVzdAorY29udmVydFRvSGlkbChjb25zdCBDYXB0dXJlUmVxdWVzdCAqY2FwdHVyZVJlcXVlc3QpIHsKKyAgICBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0IGhDYXB0dXJlUmVxdWVzdDsKKyAgICBoQ2FwdHVyZVJlcXVlc3QucGh5c2ljYWxDYW1lcmFTZXR0aW5ncyA9IGNhcHR1cmVSZXF1ZXN0LT5tQ2FwdHVyZVJlcXVlc3QucGh5c2ljYWxDYW1lcmFTZXR0aW5nczsKKyAgICBoQ2FwdHVyZVJlcXVlc3Quc3RyZWFtQW5kV2luZG93SWRzID0gY2FwdHVyZVJlcXVlc3QtPm1DYXB0dXJlUmVxdWVzdC5zdHJlYW1BbmRXaW5kb3dJZHM7CisgICAgcmV0dXJuIGhDYXB0dXJlUmVxdWVzdDsKK30KKworSFJvdGF0aW9uIGNvbnZlcnRUb0hpZGwoaW50IHJvdGF0aW9uKSB7CisgICAgSFJvdGF0aW9uIGhSb3RhdGlvbiA9IEhSb3RhdGlvbjo6UjA7CisgICAgc3dpdGNoKHJvdGF0aW9uKSB7CisgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fOTA6CisgICAgICAgICAgICBoUm90YXRpb24gPSBIUm90YXRpb246OlI5MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzE4MDoKKyAgICAgICAgICAgIGhSb3RhdGlvbiA9IEhSb3RhdGlvbjo6UjE4MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIENBTUVSQTNfU1RSRUFNX1JPVEFUSU9OXzI3MDoKKyAgICAgICAgICAgIGhSb3RhdGlvbiA9IEhSb3RhdGlvbjo6UjI3MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBoUm90YXRpb247Cit9CisKK2Jvb2wgY29udmVydEZyb21IaWRsQ2xvbmVkKGNvbnN0IEhDYW1lcmFNZXRhZGF0YSAmbWV0YWRhdGEsIENhbWVyYU1ldGFkYXRhICpyYXdNZXRhZGF0YSkgeworICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YSAqYnVmZmVyID0gKGNhbWVyYV9tZXRhZGF0YV90KikobWV0YWRhdGEuZGF0YSgpKTsKKyAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gbWV0YWRhdGEuc2l6ZSgpOworICAgIGludCByZXQgPSB2YWxpZGF0ZV9jYW1lcmFfbWV0YWRhdGFfc3RydWN0dXJlKGJ1ZmZlciwgJmV4cGVjdGVkU2l6ZSk7CisgICAgaWYgKHJldCA9PSBPSyB8fCByZXQgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgeworICAgICAgICAqcmF3TWV0YWRhdGEgPSBidWZmZXI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBNYWxmb3JtZWQgY2FtZXJhIG1ldGFkYXRhIHJlY2VpdmVkIGZyb20gY2FsbGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gTm90ZTogZXhpc3RpbmcgZGF0YSBpbiBkc3Qgd2lsbCBiZSBnb25lLiBkc3Qgb3ducyBtZW1vcnkgaWYgc2hvdWxkT3duIGlzIHNldAorLy8gICAgICAgdG8gdHJ1ZS4KK3ZvaWQgY29udmVydFRvSGlkbChjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc3JjLCBIQ2FtZXJhTWV0YWRhdGEqIGRzdCwgYm9vbCBzaG91bGRPd24pIHsKKyAgICBpZiAoc3JjID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzaXplX3Qgc2l6ZSA9IGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShzcmMpOworICAgIGRzdC0+c2V0VG9FeHRlcm5hbCgodWludDhfdCAqKSBzcmMsIHNpemUsIHNob3VsZE93bik7CisgICAgcmV0dXJuOworfQorCitUZW1wbGF0ZUlkIGNvbnZlcnRUb0hpZGwoQUNhbWVyYURldmljZV9yZXF1ZXN0X3RlbXBsYXRlIHRlbXBsYXRlSWQpIHsKKyAgICBzd2l0Y2godGVtcGxhdGVJZCkgeworICAgICAgICBjYXNlIFRFTVBMQVRFX1NUSUxMX0NBUFRVUkU6CisgICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVJZDo6U1RJTExfQ0FQVFVSRTsKKyAgICAgICAgY2FzZSBURU1QTEFURV9SRUNPUkQ6CisgICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVJZDo6UkVDT1JEOworICAgICAgICBjYXNlIFRFTVBMQVRFX1ZJREVPX1NOQVBTSE9UOgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6OlZJREVPX1NOQVBTSE9UOworICAgICAgICBjYXNlIFRFTVBMQVRFX1pFUk9fU0hVVFRFUl9MQUc6CisgICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVJZDo6WkVST19TSFVUVEVSX0xBRzsKKyAgICAgICAgY2FzZSBURU1QTEFURV9NQU5VQUw6CisgICAgICAgICAgICByZXR1cm4gVGVtcGxhdGVJZDo6TUFOVUFMOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFRlbXBsYXRlSWQ6OlBSRVZJRVc7CisgICAgfQorfQorCitjYW1lcmFfc3RhdHVzX3QgY29udmVydEZyb21IaWRsKFN0YXR1cyBzdGF0dXMpIHsKKyAgICBjYW1lcmFfc3RhdHVzX3QgcmV0ID0gQUNBTUVSQV9PSzsKKyAgICBzd2l0Y2goc3RhdHVzKSB7CisgICAgICAgIGNhc2UgU3RhdHVzOjpOT19FUlJPUjoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6RElTQ09OTkVDVEVEOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9DQU1FUkFfRElTQ09OTkVDVEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpDQU1FUkFfSU5fVVNFOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9DQU1FUkFfSU5fVVNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpNQVhfQ0FNRVJBU19JTl9VU0U6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX01BWF9DQU1FUkFfSU5fVVNFOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6REVQUkVDQVRFRF9IQUw6CisgICAgICAgICAgICAvLyBTaG91bGQgbm90IHJlYWNoIGhlcmUgc2luY2Ugd2UgZmlsdGVyZWQgbGVnYWN5IEhBTHMgZWFybGllcgorICAgICAgICAgICAgcmV0ID0gQUNBTUVSQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6RElTQUJMRUQ6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX0NBTUVSQV9ESVNBQkxFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFN0YXR1czo6UEVSTUlTU0lPTl9ERU5JRUQ6CisgICAgICAgICAgICByZXQgPSBBQ0FNRVJBX0VSUk9SX1BFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU3RhdHVzOjpJTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldCA9IEFDQU1FUkFfRVJST1JfVU5LTk9XTjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIGlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDEsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgyKSB7CisgICAgaWYgKG5oMS0+bnVtRmRzICE9MCB8fCBuaDItPm51bUZkcyAhPTApIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgd2luZG93IG5hdGl2ZSBoYW5kbGVzIGJlaW5nIGNvbXBhcmVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG5oMS0+dmVyc2lvbiAhPSBuaDItPnZlcnNpb24gfHwgbmgxLT5udW1GZHMgIT0gbmgyLT5udW1GZHMgfHwKKyAgICAgICAgbmgxLT5udW1JbnRzICE9IG5oMi0+bnVtSW50cykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmgxLT5udW1JbnRzOyBpKyspIHsKKyAgICAgICAgaWYobmgxLT5kYXRhW2ldICE9IG5oMi0+ZGF0YVtpXSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGlzV2luZG93TmF0aXZlSGFuZGxlTGVzc1RoYW4oY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDEsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgyKSB7CisgICAgaWYgKGlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwobmgxLCBuaDIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG5oMS0+bnVtSW50cyAhPSBuaDItPm51bUludHMpIHsKKyAgICAgICAgcmV0dXJuIG5oMS0+bnVtSW50cyA8IG5oMi0+bnVtSW50czsKKyAgICB9CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5oMS0+bnVtSW50czsgaSsrKSB7CisgICAgICAgIGlmIChuaDEtPmRhdGFbaV0gIT0gbmgyLT5kYXRhW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gbmgxLT5kYXRhW2ldIDwgbmgyLT5kYXRhW2ldOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBpc1dpbmRvd05hdGl2ZUhhbmRsZUdyZWF0ZXJUaGFuKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgxLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMikgeworICAgIHJldHVybiAhaXNXaW5kb3dOYXRpdmVIYW5kbGVMZXNzVGhhbihuaDEsIG5oMikgJiYgIWlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwobmgxLCBuaDIpOworfQorCitib29sIGFyZVdpbmRvd05hdGl2ZUhhbmRsZXNFcXVhbChoaWRsX3ZlYzxoaWRsX2hhbmRsZT4gaGFuZGxlczEsIGhpZGxfdmVjPGhpZGxfaGFuZGxlPiBoYW5kbGVzMikgeworICAgIGlmIChoYW5kbGVzMS5zaXplKCkgIT0gaGFuZGxlczIuc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVzMS5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoIWlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwoaGFuZGxlczFbaV0sIGhhbmRsZXMyW2ldKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGFyZVdpbmRvd05hdGl2ZUhhbmRsZXNMZXNzVGhhbihoaWRsX3ZlYzxoaWRsX2hhbmRsZT4gaGFuZGxlczEsIGhpZGxfdmVjPGhpZGxfaGFuZGxlPmhhbmRsZXMyKSB7CisgICAgaWYgKGhhbmRsZXMxLnNpemUoKSAhPSBoYW5kbGVzMi5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIGhhbmRsZXMxLnNpemUoKSA8IGhhbmRsZXMyLnNpemUoKTsKKyAgICB9CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYW5kbGVzMS5zaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZTEgPSBoYW5kbGVzMVtpXS5nZXROYXRpdmVIYW5kbGUoKTsKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUyID0gaGFuZGxlczJbaV0uZ2V0TmF0aXZlSGFuZGxlKCk7CisgICAgICAgIGlmICghaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChoYW5kbGUxLCBoYW5kbGUyKSkgeworICAgICAgICAgICAgcmV0dXJuIGlzV2luZG93TmF0aXZlSGFuZGxlTGVzc1RoYW4oaGFuZGxlMSwgaGFuZGxlMik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9IC8vIG5hbWVzcGFjZSB1dGlscworfSAvLyBuYW1lc3BhY2UgYWNhbQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvY2FtZXJhL25kay9uZGtfdmVuZG9yL2ltcGwvdXRpbHMuaCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM4OWYwMwotLS0gL2Rldi9udWxsCisrKyBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci9pbXBsL3V0aWxzLmgKQEAgLTAsMCArMSwxODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvSUNhbWVyYVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL0lDYW1lcmFEZXZpY2VVc2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFEZXZpY2UuaD4KKyNpbmNsdWRlIDxDYW1lcmFNZXRhZGF0YS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYTMuaD4KKworI2lmbmRlZiBDQU1FUkFfTkRLX1ZFTkRPUl9ICisjZGVmaW5lIENBTUVSQV9OREtfVkVORE9SX0gKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYWNhbSB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBDYW1lcmFNZXRhZGF0YSA9IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6aGVscGVyOjpDYW1lcmFNZXRhZGF0YTsKK3VzaW5nIEhDYW1lcmFNZXRhZGF0YSAgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFNZXRhZGF0YTsKK3VzaW5nIFN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6U3RhdHVzOwordXNpbmcgVGVtcGxhdGVJZCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6VGVtcGxhdGVJZDsKK3VzaW5nIFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M7Cit1c2luZyBIUm90YXRpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6Ok91dHB1dENvbmZpZ3VyYXRpb246OlJvdGF0aW9uOwordXNpbmcgT3V0cHV0Q29uZmlndXJhdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6T3V0cHV0Q29uZmlndXJhdGlvbjsKKworLy8gVXRpbGl0eSBjbGFzcyBzbyB0aGF0IENhcHR1cmVSZXF1ZXN0IGNhbiBiZSBzdG9yZWQgYnkgc3A8Pgorc3RydWN0IENhcHR1cmVSZXF1ZXN0IDogcHVibGljIFJlZkJhc2UgeworICBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0IG1DYXB0dXJlUmVxdWVzdDsKKyAgc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90ICo+IG1TdXJmYWNlTGlzdDsKKyAgLy9QaHlzaWNhbCBjYW1lcmEgc2V0dGluZ3MgbWV0YWRhdGEgaXMgc3RvcmVkIGhlcmUsIHNpbmNlIHRoZSBjYXB0dXJlIHJlcXVlc3QKKyAgLy9taWdodCBub3QgY29udGFpbiBpdC4gVGhhdCdzIHNpbmNlLCBmbXEgbWlnaHQgaGF2ZSBjb25zdW1lZCBpdC4KKyAgaGlkbF92ZWM8UGh5c2ljYWxDYW1lcmFTZXR0aW5ncz4gbVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M7Cit9OworCitib29sIGFyZVdpbmRvd05hdGl2ZUhhbmRsZXNFcXVhbChoaWRsX3ZlYzxoaWRsX2hhbmRsZT4gaGFuZGxlczEsIGhpZGxfdmVjPGhpZGxfaGFuZGxlPmhhbmRsZXMyKTsKKworYm9vbCBhcmVXaW5kb3dOYXRpdmVIYW5kbGVzTGVzc1RoYW4oaGlkbF92ZWM8aGlkbF9oYW5kbGU+IGhhbmRsZXMxLCBoaWRsX3ZlYzxoaWRsX2hhbmRsZT5oYW5kbGVzMik7CisKK2Jvb2wgaXNXaW5kb3dOYXRpdmVIYW5kbGVFcXVhbChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMSwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDIpOworCitib29sIGlzV2luZG93TmF0aXZlSGFuZGxlTGVzc1RoYW4oY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDEsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmgyKTsKKworLy8gQ29udmVuaWVuY2Ugd3JhcHBlciBvdmVyIGlzV2luZG93TmF0aXZlSGFuZGxlTGVzc1RoYW4gYW5kIGlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwKK2Jvb2wgaXNXaW5kb3dOYXRpdmVIYW5kbGVHcmVhdGVyVGhhbihjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm5oMSwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpuaDIpOworCisvLyBVdGlsaXR5IGNsYXNzIHNvIHRoZSBuYXRpdmVfaGFuZGxlX3QgY2FuIGJlIGNvbXBhcmVkIHdpdGggIGl0cyBjb250ZW50cyBpbnN0ZWFkCisvLyBvZiBqdXN0IHJhdyBwb2ludGVyIGNvbXBhcmlzb25zLgorc3RydWN0IG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgeworICAgIG5hdGl2ZV9oYW5kbGVfdCAqbVdpbmRvdyA9IG51bGxwdHI7CisKKyAgICBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyKG5hdGl2ZV9oYW5kbGVfdCAqbmgpIDogbVdpbmRvdyhuaCkgeyB9CisKKyAgICBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyKCkgPSBkZWZhdWx0OworCisgICAgb3BlcmF0b3IgbmF0aXZlX2hhbmRsZV90ICooKSBjb25zdCB7IHJldHVybiBtV2luZG93OyB9CisKKyAgICBib29sIG9wZXJhdG9yID09KGNvbnN0IG5hdGl2ZV9oYW5kbGVfcHRyX3dyYXBwZXIgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGlzV2luZG93TmF0aXZlSGFuZGxlRXF1YWwobVdpbmRvdywgb3RoZXIubVdpbmRvdyk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFpc1dpbmRvd05hdGl2ZUhhbmRsZUVxdWFsKG1XaW5kb3csIG90aGVyLm1XaW5kb3cpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgbmF0aXZlX2hhbmRsZV9wdHJfd3JhcHBlciYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGlzV2luZG93TmF0aXZlSGFuZGxlTGVzc1RoYW4obVdpbmRvdywgb3RoZXIubVdpbmRvdyk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciA+IChjb25zdCBuYXRpdmVfaGFuZGxlX3B0cl93cmFwcGVyJiBvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gIWlzV2luZG93TmF0aXZlSGFuZGxlR3JlYXRlclRoYW4obVdpbmRvdywgb3RoZXIubVdpbmRvdyk7CisgICAgfQorCit9OworCisvLyBXcmFwcGVyIGFyb3VuZCBPdXRwdXRDb25maWd1cmF0aW9uLiBUaGlzIGlzIG5lZWRlZCBzaW5jZSBISURMCisvLyBPdXRwdXRDb25maWd1cmF0aW9uIGlzIGF1dG8tZ2VuZXJhdGVkIGFuZCBtYXJrZWQgZmluYWwuIFRoZXJlZm9yZSwgb3BlcmF0b3IKKy8vIG92ZXJsb2FkcyBvdXRzaWRlIHRoZSBjbGFzcywgd2lsbCBub3QgZ2V0IHBpY2tlZCBieSBjbGFuZyB3aGlsZSB0cnlpbmcgdG8KKy8vIHN0b3JlIE91dHB1dENvbmZpZ3VyYXRpb24gaW4gbWFwcy9zZXRzLgorc3RydWN0IE91dHB1dENvbmZpZ3VyYXRpb25XcmFwcGVyIHsKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uIG1PdXRwdXRDb25maWd1cmF0aW9uOworCisgICAgb3BlcmF0b3IgY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU91dHB1dENvbmZpZ3VyYXRpb247CisgICAgfQorCisgICAgT3V0cHV0Q29uZmlndXJhdGlvbldyYXBwZXIoKSB7CisgICAgICAgIG1PdXRwdXRDb25maWd1cmF0aW9uLnJvdGF0aW9uID0gT3V0cHV0Q29uZmlndXJhdGlvbjo6Um90YXRpb246OlIwOworICAgICAgICAvLyBUaGUgbmRrIGN1cnJlbnRseSBkb2Vzbid0IHN1cHBvcnQgZGVmZXJyZWQgc3VyZmFjZXMKKyAgICAgICAgbU91dHB1dENvbmZpZ3VyYXRpb24uaXNEZWZlcnJlZCA9IGZhbHNlOworICAgICAgICBtT3V0cHV0Q29uZmlndXJhdGlvbi53aWR0aCA9IDA7CisgICAgICAgIG1PdXRwdXRDb25maWd1cmF0aW9uLmhlaWdodCA9IDA7CisgICAgICAgIC8vIG5kayBkb2Vzbid0IHN1cHBvcnQgaW50ZXIgT3V0cHV0Q29uZmlndXJhdGlvbiBidWZmZXIgc2hhcmluZy4KKyAgICAgICAgbU91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93R3JvdXBJZCA9IC0xOworICAgIH07CisKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uV3JhcHBlcihPdXRwdXRDb25maWd1cmF0aW9uICZvdXRwdXRDb25maWd1cmF0aW9uKQorICAgICAgICAgICAgOiBtT3V0cHV0Q29uZmlndXJhdGlvbigob3V0cHV0Q29uZmlndXJhdGlvbikpIHsgfQorCisgICAgYm9vbCBvcGVyYXRvciA9PShjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZvdGhlcikgY29uc3QgeworICAgICAgICBjb25zdCBPdXRwdXRDb25maWd1cmF0aW9uICZzZWxmID0gbU91dHB1dENvbmZpZ3VyYXRpb247CisgICAgICAgIHJldHVybiBzZWxmLnJvdGF0aW9uID09IG90aGVyLnJvdGF0aW9uICYmIHNlbGYud2luZG93R3JvdXBJZCA9PSBvdGhlci53aW5kb3dHcm91cElkICYmCisgICAgICAgICAgICAgICAgc2VsZi5waHlzaWNhbENhbWVyYUlkID09IG90aGVyLnBoeXNpY2FsQ2FtZXJhSWQgJiYgc2VsZi53aWR0aCA9PSBvdGhlci53aWR0aCAmJgorICAgICAgICAgICAgICAgIHNlbGYuaGVpZ2h0ID09IG90aGVyLmhlaWdodCAmJiBzZWxmLmlzRGVmZXJyZWQgPT0gb3RoZXIuaXNEZWZlcnJlZCAmJgorICAgICAgICAgICAgICAgIGFyZVdpbmRvd05hdGl2ZUhhbmRsZXNFcXVhbChzZWxmLndpbmRvd0hhbmRsZXMsIG90aGVyLndpbmRvd0hhbmRsZXMpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgPCAoY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKCp0aGlzID09IG90aGVyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmc2VsZiA9IG1PdXRwdXRDb25maWd1cmF0aW9uOworICAgICAgICBpZiAoc2VsZi53aW5kb3dHcm91cElkICE9IG90aGVyLndpbmRvd0dyb3VwSWQpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWxmLndpbmRvd0dyb3VwSWQgPCBvdGhlci53aW5kb3dHcm91cElkOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYud2lkdGggIT0gb3RoZXIud2lkdGgpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWxmLndpZHRoIDwgb3RoZXIud2lkdGg7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZi5oZWlnaHQgIT0gb3RoZXIuaGVpZ2h0KSB7CisgICAgICAgICAgICByZXR1cm4gc2VsZi5oZWlnaHQgPCBvdGhlci5oZWlnaHQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZi5yb3RhdGlvbiAhPSBvdGhlci5yb3RhdGlvbikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihzZWxmLnJvdGF0aW9uKSA8IHN0YXRpY19jYXN0PHVpbnQzMl90PihvdGhlci5yb3RhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBpZiAoc2VsZi5pc0RlZmVycmVkICE9IG90aGVyLmlzRGVmZXJyZWQpIHsKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmlzRGVmZXJyZWQgPCBvdGhlci5pc0RlZmVycmVkOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHNlbGYucGh5c2ljYWxDYW1lcmFJZCAhPSBvdGhlci5waHlzaWNhbENhbWVyYUlkKSB7CisgICAgICAgICAgICByZXR1cm4gc2VsZi5waHlzaWNhbENhbWVyYUlkIDwgb3RoZXIucGh5c2ljYWxDYW1lcmFJZDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gYXJlV2luZG93TmF0aXZlSGFuZGxlc0xlc3NUaGFuKHNlbGYud2luZG93SGFuZGxlcywgb3RoZXIud2luZG93SGFuZGxlcyk7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciAhPSAoY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IgPiAoY29uc3QgT3V0cHV0Q29uZmlndXJhdGlvbiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICgqdGhpcyAhPSBvdGhlcikgJiYgISgqdGhpcyA8IG90aGVyKTsKKyAgICB9Cit9OworCisvLyBDb252ZXJ0IENhcHR1cmVSZXF1ZXN0IHdyYXBwYWJsZSBieSBzcDw+IHRvIGhpZGwgQ2FwdHVyZVJlcXVlc3QuCitmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0IGNvbnZlcnRUb0hpZGwoCisgICAgY29uc3QgQ2FwdHVyZVJlcXVlc3QgKmNhcHR1cmVSZXF1ZXN0KTsKKworSFJvdGF0aW9uIGNvbnZlcnRUb0hpZGwoaW50IHJvdGF0aW9uKTsKKworYm9vbCBjb252ZXJ0RnJvbUhpZGxDbG9uZWQoY29uc3QgSENhbWVyYU1ldGFkYXRhICZtZXRhZGF0YSwgQ2FtZXJhTWV0YWRhdGEgKnJhd01ldGFkYXRhKTsKKworLy8gTm90ZTogZXhpc3RpbmcgZGF0YSBpbiBkc3Qgd2lsbCBiZSBnb25lLgordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzcmMsIEhDYW1lcmFNZXRhZGF0YSogZHN0LCBib29sIHNob3VsZE93biA9IGZhbHNlKTsKKworVGVtcGxhdGVJZCBjb252ZXJ0VG9IaWRsKEFDYW1lcmFEZXZpY2VfcmVxdWVzdF90ZW1wbGF0ZSB0ZW1wbGF0ZUlkKTsKKworY2FtZXJhX3N0YXR1c190IGNvbnZlcnRGcm9tSGlkbChTdGF0dXMgc3RhdHVzKTsKKworfSAvLyBuYW1lc3BhY2UgdXRpbHMKK30gLy8gbmFtZXNwYWNlIGFjYW0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIENBTUVSQV9OREtfVkVORE9SX0gKZGlmZiAtLWdpdCBhL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci90ZXN0cy9BSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LmNwcCBiL2NhbWVyYS9uZGsvbmRrX3ZlbmRvci90ZXN0cy9BSW1hZ2VSZWFkZXJWZW5kb3JUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzhiNWY1Ci0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL25kay9uZGtfdmVuZG9yL3Rlc3RzL0FJbWFnZVJlYWRlclZlbmRvclRlc3QuY3BwCkBAIC0wLDAgKzEsODQxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBSW1hZ2VSZWFkZXJWZW5kb3JUZXN0IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmFyaWFudD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFFcnJvci5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFNYW5hZ2VyLmg+CisjaW5jbHVkZSA8Y2FtZXJhL05ka0NhbWVyYURldmljZS5oPgorI2luY2x1ZGUgPGNhbWVyYS9OZGtDYW1lcmFDYXB0dXJlU2Vzc2lvbi5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0ltYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrSW1hZ2VSZWFkZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPFZlbmRvclRhZ0Rlc2NyaXB0b3IuaD4KKworbmFtZXNwYWNlIHsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQga0R1bW15RmVuY2VGZCA9IC0xOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0NhcHR1cmVXYWl0VXMgPSAxMDAgKiAxMDAwOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0NhcHR1cmVXYWl0UmV0cnkgPSAxMDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtUZXN0SW1hZ2VXaWR0aCA9IDY0MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtUZXN0SW1hZ2VIZWlnaHQgPSA0ODA7CitzdGF0aWMgY29uc3RleHByIGludCBrVGVzdEltYWdlRm9ybWF0ID0gQUlNQUdFX0ZPUk1BVF9ZVVZfNDIwXzg4ODsKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpoZWxwZXI6OlZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTsKK3VzaW5nIENvbmZpZ3VyZWRXaW5kb3dzID0gc3RkOjpzZXQ8bmF0aXZlX2hhbmRsZV90ICo+OworCitjbGFzcyBDYW1lcmFIZWxwZXIgeworICAgcHVibGljOgorICAgIENhbWVyYUhlbHBlcihjb25zdCBjaGFyKiBpZCwgQUNhbWVyYU1hbmFnZXIgKm1hbmFnZXIpIDoKKyAgICAgICAgICAgIG1JbWdSZWFkZXJBbncobnVsbHB0ciksIG1DYW1lcmFJZChpZCksIG1DYW1lcmFNYW5hZ2VyKG1hbmFnZXIpIHt9CisgICAgfkNhbWVyYUhlbHBlcigpIHsgY2xvc2VDYW1lcmEoKTsgfQorCisgICAgc3RydWN0IFBoeXNpY2FsSW1nUmVhZGVySW5mbyB7CisgICAgICAgIGNvbnN0IGNoYXIqIHBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogYW53OworICAgIH07CisKKyAgICAvLyBSZXRhaW5pbmcgdGhlIGVycm9yIGNvZGUgaW4gY2FzZSB0aGUgY2FsbGVyIG5lZWRzIHRvIGFuYWx5emUgaXQuCisgICAgc3RkOjp2YXJpYW50PGludCwgQ29uZmlndXJlZFdpbmRvd3M+IGluaXRDYW1lcmEobmF0aXZlX2hhbmRsZV90KiBpbWdSZWFkZXJBbncsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbEltZ1JlYWRlckluZm8+JiBwaHlzaWNhbEltZ1JlYWRlcnMsCisgICAgICAgICAgICBib29sIHVzZVBoeXNpY2FsU2V0dGluZ3MpIHsKKyAgICAgICAgQ29uZmlndXJlZFdpbmRvd3MgY29uZmlndXJlZFdpbmRvd3M7CisgICAgICAgIGlmIChpbWdSZWFkZXJBbncgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBpbml0aWFsaXplIGNhbWVyYSBiZWZvcmUgaW1hZ2UgcmVhZGVyIGdldCBpbml0aWFsaXplZC4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUlzQ2FtZXJhUmVhZHkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJpbml0Q2FtZXJhIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlLiIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaW50IHJldDsKKyAgICAgICAgbUltZ1JlYWRlckFudyA9IGltZ1JlYWRlckFudzsKKworICAgICAgICByZXQgPSBBQ2FtZXJhTWFuYWdlcl9vcGVuQ2FtZXJhKG1DYW1lcmFNYW5hZ2VyLCBtQ2FtZXJhSWQsICZtRGV2aWNlQ2IsICZtRGV2aWNlKTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgbURldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gY2FtZXJhLCByZXQ9JWQsIG1EZXZpY2U9JXAuIiwgcmV0LCBtRGV2aWNlKTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgY2FwdHVyZSBzZXNzaW9uCisgICAgICAgIHJldCA9IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9jcmVhdGUoJm1PdXRwdXRzKTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfY3JlYXRlIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0ID0gQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2NyZWF0ZShtSW1nUmVhZGVyQW53LCAmbUltZ1JlYWRlck91dHB1dCk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2NyZWF0ZSBmYWlsZWQsIHJldD0lZCIsIHJldCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIHJldCA9IEFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9hZGQobU91dHB1dHMsIG1JbWdSZWFkZXJPdXRwdXQpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9hZGQgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBjb25maWd1cmVkV2luZG93cy5pbnNlcnQobUltZ1JlYWRlckFudyk7CisgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiBpZFBvaW50ZXJMaXN0OworICAgICAgICBzdGQ6OnNldDxjb25zdCBuYXRpdmVfaGFuZGxlX3QqPiBwaHlzaWNhbFN0cmVhbU1hcDsKKyAgICAgICAgZm9yIChhdXRvJiBwaHlzaWNhbFN0cmVhbSA6IHBoeXNpY2FsSW1nUmVhZGVycykgeworICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KiBzZXNzaW9uT3V0cHV0ID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHJldCA9IEFDYXB0dXJlU2Vzc2lvblBoeXNpY2FsT3V0cHV0X2NyZWF0ZShwaHlzaWNhbFN0cmVhbS5hbncsCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsU3RyZWFtLnBoeXNpY2FsQ2FtZXJhSWQsICZzZXNzaW9uT3V0cHV0KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQUNBTUVSQV9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVNlc3Npb25QaHlzaWNhbE91dHB1dF9jcmVhdGUgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfYWRkKG1PdXRwdXRzLCBzZXNzaW9uT3V0cHV0KTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFDYXB0dXJlU2Vzc2lvbk91dHB1dENvbnRhaW5lcl9hZGQgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBBQ2FtZXJhRGV2aWNlX2lzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQobURldmljZSwgbU91dHB1dHMpOworICAgICAgICAgICAgaWYgKHJldCAhPSBBQ0FNRVJBX09LICYmIHJldCAhPSBBQ0FNRVJBX0VSUk9SX1VOU1VQUE9SVEVEX09QRVJBVElPTikgeworICAgICAgICAgICAgICAgIEFMT0dXKCJBQ2FtZXJhRGV2aWNlX2lzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQgZmFpbGVkLCByZXQ9JWQgY2FtZXJhIGlkICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICByZXQsIG1DYW1lcmFJZCk7CisgICAgICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyX3JlbW92ZShtT3V0cHV0cywgc2Vzc2lvbk91dHB1dCk7CisgICAgICAgICAgICAgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0X2ZyZWUoc2Vzc2lvbk91dHB1dCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25maWd1cmVkV2luZG93cy5pbnNlcnQocGh5c2ljYWxTdHJlYW0uYW53KTsKKyAgICAgICAgICAgIC8vIEFzc3VtZSB0aGF0IGF0IG1vc3Qgb25lIHBoeXNpY2FsIHN0cmVhbSBwZXIgcGh5c2ljYWwgY2FtZXJhLgorICAgICAgICAgICAgbVBoeXNpY2FsQ2FtZXJhSWRzLnB1c2hfYmFjayhwaHlzaWNhbFN0cmVhbS5waHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgICAgIGlkUG9pbnRlckxpc3QucHVzaF9iYWNrKHBoeXNpY2FsU3RyZWFtLnBoeXNpY2FsQ2FtZXJhSWQpOworICAgICAgICAgICAgcGh5c2ljYWxTdHJlYW1NYXAuaW5zZXJ0KHBoeXNpY2FsU3RyZWFtLmFudyk7CisgICAgICAgICAgICBtU2Vzc2lvblBoeXNpY2FsT3V0cHV0cy5wdXNoX2JhY2soc2Vzc2lvbk91dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgQUNhbWVyYUlkTGlzdCBjYW1lcmFJZExpc3Q7CisgICAgICAgIGNhbWVyYUlkTGlzdC5udW1DYW1lcmFzID0gaWRQb2ludGVyTGlzdC5zaXplKCk7CisgICAgICAgIGNhbWVyYUlkTGlzdC5jYW1lcmFJZHMgPSBpZFBvaW50ZXJMaXN0LmRhdGEoKTsKKworICAgICAgICByZXQgPSBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9uKG1EZXZpY2UsIG1PdXRwdXRzLCAmbVNlc3Npb25DYiwgJm1TZXNzaW9uKTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVTZXNzaW9uIGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBDcmVhdGUgY2FwdHVyZSByZXF1ZXN0CisgICAgICAgIGlmICh1c2VQaHlzaWNhbFNldHRpbmdzKSB7CisgICAgICAgICAgICByZXQgPSBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0X3dpdGhQaHlzaWNhbElkcyhtRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICBURU1QTEFURV9TVElMTF9DQVBUVVJFLCAmY2FtZXJhSWRMaXN0LCAmbVN0aWxsUmVxdWVzdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBBQ2FtZXJhRGV2aWNlX2NyZWF0ZUNhcHR1cmVSZXF1ZXN0KG1EZXZpY2UsCisgICAgICAgICAgICAgICAgICAgIFRFTVBMQVRFX1NUSUxMX0NBUFRVUkUsICZtU3RpbGxSZXF1ZXN0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkFDYW1lcmFEZXZpY2VfY3JlYXRlQ2FwdHVyZVJlcXVlc3QgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZShtSW1nUmVhZGVyQW53LCAmbVJlcUltZ1JlYWRlck91dHB1dCk7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGUgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICByZXQgPSBBQ2FwdHVyZVJlcXVlc3RfYWRkVGFyZ2V0KG1TdGlsbFJlcXVlc3QsIG1SZXFJbWdSZWFkZXJPdXRwdXQpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkFDYXB0dXJlUmVxdWVzdF9hZGRUYXJnZXQgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoYXV0byYgcGh5c2ljYWxTdHJlYW0gOiBwaHlzaWNhbEltZ1JlYWRlcnMpIHsKKyAgICAgICAgICAgIGlmIChwaHlzaWNhbFN0cmVhbU1hcC5maW5kKHBoeXNpY2FsU3RyZWFtLmFudykgPT0gcGh5c2ljYWxTdHJlYW1NYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiU2tpcHBpbmcgcGh5c2ljYWxTdHJlYW0gYW53PSVwIiwgcGh5c2ljYWxTdHJlYW0uYW53KTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFDYW1lcmFPdXRwdXRUYXJnZXQqIG91dHB1dFRhcmdldCA9IG51bGxwdHI7CisgICAgICAgICAgICByZXQgPSBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2NyZWF0ZShwaHlzaWNhbFN0cmVhbS5hbncsICZvdXRwdXRUYXJnZXQpOworICAgICAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQUNhbWVyYU91dHB1dFRhcmdldF9jcmVhdGUgZmFpbGVkLCByZXQ9JWQiLCByZXQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXQgPSBBQ2FwdHVyZVJlcXVlc3RfYWRkVGFyZ2V0KG1TdGlsbFJlcXVlc3QsIG91dHB1dFRhcmdldCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBQ2FwdHVyZVJlcXVlc3RfYWRkVGFyZ2V0IGZhaWxlZCwgcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJlcVBoeXNpY2FsT3V0cHV0cy5wdXNoX2JhY2sob3V0cHV0VGFyZ2V0KTsKKyAgICAgICAgfQorCisgICAgICAgIG1Jc0NhbWVyYVJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGNvbmZpZ3VyZWRXaW5kb3dzOworICAgIH0KKworCisgICAgYm9vbCBpc0NhbWVyYVJlYWR5KCkgeyByZXR1cm4gbUlzQ2FtZXJhUmVhZHk7IH0KKworICAgIHZvaWQgY2xvc2VDYW1lcmEoKSB7CisgICAgICAgIC8vIERlc3Ryb3kgY2FwdHVyZSByZXF1ZXN0CisgICAgICAgIGlmIChtUmVxSW1nUmVhZGVyT3V0cHV0KSB7CisgICAgICAgICAgICBBQ2FtZXJhT3V0cHV0VGFyZ2V0X2ZyZWUobVJlcUltZ1JlYWRlck91dHB1dCk7CisgICAgICAgICAgICBtUmVxSW1nUmVhZGVyT3V0cHV0ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8mIG91dHB1dFRhcmdldCA6IG1SZXFQaHlzaWNhbE91dHB1dHMpIHsKKyAgICAgICAgICAgIEFDYW1lcmFPdXRwdXRUYXJnZXRfZnJlZShvdXRwdXRUYXJnZXQpOworICAgICAgICB9CisgICAgICAgIG1SZXFQaHlzaWNhbE91dHB1dHMuY2xlYXIoKTsKKyAgICAgICAgaWYgKG1TdGlsbFJlcXVlc3QpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlUmVxdWVzdF9mcmVlKG1TdGlsbFJlcXVlc3QpOworICAgICAgICAgICAgbVN0aWxsUmVxdWVzdCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgLy8gRGVzdHJveSBjYXB0dXJlIHNlc3Npb24KKyAgICAgICAgaWYgKG1TZXNzaW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jbG9zZShtU2Vzc2lvbik7CisgICAgICAgICAgICBtU2Vzc2lvbiA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1JbWdSZWFkZXJPdXRwdXQpIHsKKyAgICAgICAgICAgIEFDYXB0dXJlU2Vzc2lvbk91dHB1dF9mcmVlKG1JbWdSZWFkZXJPdXRwdXQpOworICAgICAgICAgICAgbUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvJiBleHRyYU91dHB1dCA6IG1TZXNzaW9uUGh5c2ljYWxPdXRwdXRzKSB7CisgICAgICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRfZnJlZShleHRyYU91dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgbVNlc3Npb25QaHlzaWNhbE91dHB1dHMuY2xlYXIoKTsKKyAgICAgICAgaWYgKG1PdXRwdXRzKSB7CisgICAgICAgICAgICBBQ2FwdHVyZVNlc3Npb25PdXRwdXRDb250YWluZXJfZnJlZShtT3V0cHV0cyk7CisgICAgICAgICAgICBtT3V0cHV0cyA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgLy8gRGVzdHJveSBjYW1lcmEgZGV2aWNlCisgICAgICAgIGlmIChtRGV2aWNlKSB7CisgICAgICAgICAgICBBQ2FtZXJhRGV2aWNlX2Nsb3NlKG1EZXZpY2UpOworICAgICAgICAgICAgbURldmljZSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgbUlzQ2FtZXJhUmVhZHkgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQgdGFrZVBpY3R1cmUoKSB7CisgICAgICAgIGludCBzZXFJZDsKKyAgICAgICAgcmV0dXJuIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlKG1TZXNzaW9uLCAmbUNhcHR1cmVDYWxsYmFja3MsIDEsICZtU3RpbGxSZXF1ZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlcUlkKTsKKyAgICB9CisKKyAgICBpbnQgdGFrZUxvZ2ljYWxDYW1lcmFQaWN0dXJlKCkgeworICAgICAgICBpbnQgc2VxSWQ7CisgICAgICAgIHJldHVybiBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlKG1TZXNzaW9uLCAmbUxvZ2ljYWxDYXB0dXJlQ2FsbGJhY2tzLAorICAgICAgICAgICAgICAgIDEsICZtU3RpbGxSZXF1ZXN0LCAmc2VxSWQpOworICAgIH0KKworICAgIGJvb2wgY2hlY2tDYWxsYmFja3MoaW50IHBpY3R1cmVDb3VudCkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBpZiAobUNvbXBsZXRlZENhcHR1cmVDYWxsYmFja0NvdW50ICE9IHBpY3R1cmVDb3VudCkgeworICAgICAgICAgICAgQUxPR0UoIkNvbXBsZXRlZCBjYXB0dXJlIGNhbGxhYmFjayBjb3VudCBub3QgYXMgZXhwZWN0ZWQuIGV4cGVjdGVkICVkIGFjdHVhbCAlZCIsCisgICAgICAgICAgICAgICAgICBwaWN0dXJlQ291bnQsIG1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIEFDYW1lcmFEZXZpY2VfU3RhdGVDYWxsYmFja3MgbURldmljZUNie3RoaXMsIG51bGxwdHIsIG51bGxwdHJ9OworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9zdGF0ZUNhbGxiYWNrcyBtU2Vzc2lvbkNieyB0aGlzLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyfTsKKworICAgIG5hdGl2ZV9oYW5kbGVfdCogbUltZ1JlYWRlckFudyA9IG51bGxwdHI7ICAvLyBub3Qgb3duZWQgYnkgdXMuCisKKyAgICAvLyBDYW1lcmEgZGV2aWNlCisgICAgQUNhbWVyYURldmljZSogbURldmljZSA9IG51bGxwdHI7CisgICAgLy8gQ2FwdHVyZSBzZXNzaW9uCisgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0Q29udGFpbmVyKiBtT3V0cHV0cyA9IG51bGxwdHI7CisgICAgQUNhcHR1cmVTZXNzaW9uT3V0cHV0KiBtSW1nUmVhZGVyT3V0cHV0ID0gbnVsbHB0cjsKKyAgICBzdGQ6OnZlY3RvcjxBQ2FwdHVyZVNlc3Npb25PdXRwdXQqPiBtU2Vzc2lvblBoeXNpY2FsT3V0cHV0czsKKworICAgIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogbVNlc3Npb24gPSBudWxscHRyOworICAgIC8vIENhcHR1cmUgcmVxdWVzdAorICAgIEFDYXB0dXJlUmVxdWVzdCogbVN0aWxsUmVxdWVzdCA9IG51bGxwdHI7CisgICAgQUNhbWVyYU91dHB1dFRhcmdldCogbVJlcUltZ1JlYWRlck91dHB1dCA9IG51bGxwdHI7CisgICAgc3RkOjp2ZWN0b3I8QUNhbWVyYU91dHB1dFRhcmdldCo+IG1SZXFQaHlzaWNhbE91dHB1dHM7CisKKyAgICBib29sIG1Jc0NhbWVyYVJlYWR5ID0gZmFsc2U7CisgICAgY29uc3QgY2hhciogbUNhbWVyYUlkOworICAgIEFDYW1lcmFNYW5hZ2VyKiBtQ2FtZXJhTWFuYWdlcjsKKyAgICBpbnQgbUNvbXBsZXRlZENhcHR1cmVDYWxsYmFja0NvdW50ID0gMDsKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fY2FwdHVyZUNhbGxiYWNrcyBtQ2FwdHVyZUNhbGxiYWNrcyA9IHsKKyAgICAgICAgLy8gVE9ETzogQWRkIHRlc3RzIGZvciBvdGhlciBjYWxsYmFja3MKKyAgICAgICAgdGhpcywgLy8gY29udGV4dAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTdGFydGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVByb2dyZXNzZWQKKyAgICAgICAgW10odm9pZCogY3R4ICwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uICosIEFDYXB0dXJlUmVxdWVzdCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUNhbWVyYU1ldGFkYXRhICopIHsKKyAgICAgICAgICAgIENhbWVyYUhlbHBlciAqY2ggPSBzdGF0aWNfY2FzdDxDYW1lcmFIZWxwZXIgKj4oY3R4KTsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGNoLT5tTXV0ZXgpOworICAgICAgICAgICAgY2gtPm1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCsrOworICAgICAgICB9LAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVGYWlsZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKKyAgICB9OworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1QaHlzaWNhbENhbWVyYUlkczsKKyAgICBBQ2FtZXJhQ2FwdHVyZVNlc3Npb25fbG9naWNhbENhbWVyYV9jYXB0dXJlQ2FsbGJhY2tzIG1Mb2dpY2FsQ2FwdHVyZUNhbGxiYWNrcyA9IHsKKyAgICAgICAgLy8gVE9ETzogQWRkIHRlc3RzIGZvciBvdGhlciBjYWxsYmFja3MKKyAgICAgICAgdGhpcywgLy8gY29udGV4dAorICAgICAgICBudWxscHRyLCAvLyBvbkNhcHR1cmVTdGFydGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZVByb2dyZXNzZWQKKyAgICAgICAgW10odm9pZCogY3R4ICwgQUNhbWVyYUNhcHR1cmVTZXNzaW9uICosIEFDYXB0dXJlUmVxdWVzdCAqLAorICAgICAgICAgICAgICAgIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSAqLCBzaXplX3QgcGh5c2ljYWxSZXN1bHRDb3VudCwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogcGh5c2ljYWxDYW1lcmFJZHMsIGNvbnN0IEFDYW1lcmFNZXRhZGF0YSoqIHBoeXNpY2FsUmVzdWx0cykgeworICAgICAgICAgICAgQ2FtZXJhSGVscGVyICpjaCA9IHN0YXRpY19jYXN0PENhbWVyYUhlbHBlciAqPihjdHgpOworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soY2gtPm1NdXRleCk7CisgICAgICAgICAgICBBU1NFUlRfRVEocGh5c2ljYWxSZXN1bHRDb3VudCwgY2gtPm1QaHlzaWNhbENhbWVyYUlkcy5zaXplKCkpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwaHlzaWNhbFJlc3VsdENvdW50OyBpKyspIHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShwaHlzaWNhbENhbWVyYUlkc1tpXSAhPSBudWxscHRyKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfVFJVRShwaHlzaWNhbFJlc3VsdHNbaV0gIT0gbnVsbHB0cik7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKHN0ZDo6ZmluZChjaC0+bVBoeXNpY2FsQ2FtZXJhSWRzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICBjaC0+bVBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpLCBwaHlzaWNhbENhbWVyYUlkc1tpXSksCisgICAgICAgICAgICAgICAgICAgICAgICBjaC0+bVBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpKTsKKworICAgICAgICAgICAgICAgIC8vIFZlcmlmeSBmcmFtZU51bWJlciBhbmQgc2Vuc29yVGltZXN0YW1wIGV4aXN0IGluIHBoeXNpY2FsCisgICAgICAgICAgICAgICAgLy8gcmVzdWx0IG1ldGFkYXRhCisgICAgICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2NvbnN0X2VudHJ5IGVudHJ5OworICAgICAgICAgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9nZXRDb25zdEVudHJ5KAorICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxSZXN1bHRzW2ldLCBBQ0FNRVJBX1NZTkNfRlJBTUVfTlVNQkVSLCAmZW50cnkpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShlbnRyeS5jb3VudCwgMSk7CisgICAgICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2dldENvbnN0RW50cnkoCisgICAgICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbFJlc3VsdHNbaV0sIEFDQU1FUkFfU0VOU09SX1RJTUVTVEFNUCwgJmVudHJ5KTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoZW50cnkuY291bnQsIDEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2gtPm1Db21wbGV0ZWRDYXB0dXJlQ2FsbGJhY2tDb3VudCsrOworICAgICAgICB9LAorICAgICAgICBbXSAodm9pZCAqIC8qY3R4Ki8sIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbiogLypzZXNzaW9uKi8sIEFDYXB0dXJlUmVxdWVzdCogLypyZXF1ZXN0Ki8sCisgICAgICAgICAgICAgICAgQUxvZ2ljYWxDYW1lcmFDYXB0dXJlRmFpbHVyZSogZmFpbHVyZSkgeworICAgICAgICAgICAgaWYgKGZhaWx1cmUtPnBoeXNpY2FsQ2FtZXJhSWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiJXM6IFBoeXNpY2FsIGNhbWVyYSBpZDogJXMgcmVzdWx0IGZhaWx1cmUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlLT5waHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VDb21wbGV0ZWQKKyAgICAgICAgbnVsbHB0ciwgLy8gb25DYXB0dXJlU2VxdWVuY2VBYm9ydGVkCisgICAgICAgIG51bGxwdHIsIC8vIG9uQ2FwdHVyZUJ1ZmZlckxvc3QKKyAgICB9OworfTsKKworY2xhc3MgSW1hZ2VSZWFkZXJUZXN0Q2FzZSB7CisgICBwdWJsaWM6CisgICAgSW1hZ2VSZWFkZXJUZXN0Q2FzZShpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBtYXhJbWFnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFzeW5jKQorICAgICAgICA6IG1XaWR0aCh3aWR0aCksCisgICAgICAgICAgbUhlaWdodChoZWlnaHQpLAorICAgICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKKyAgICAgICAgICBtVXNhZ2UodXNhZ2UpLAorICAgICAgICAgIG1NYXhJbWFnZXMobWF4SW1hZ2VzKSwKKyAgICAgICAgICBtQXN5bmMoYXN5bmMpIHt9CisKKyAgICB+SW1hZ2VSZWFkZXJUZXN0Q2FzZSgpIHsKKyAgICAgICAgaWYgKG1JbWdSZWFkZXJBbncpIHsKKyAgICAgICAgICAgIEFJbWFnZVJlYWRlcl9kZWxldGUobUltZ1JlYWRlcik7CisgICAgICAgICAgICAvLyBObyBuZWVkIHRvIGNhbGwgbmF0aXZlX2hhbmRsZV90X3JlbGVhc2Ugb24gaW1hZ2VSZWFkZXJBbncKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBpbml0SW1hZ2VSZWFkZXIoKSB7CisgICAgICAgIGlmIChtSW1nUmVhZGVyICE9IG51bGxwdHIgfHwgbUltZ1JlYWRlckFudyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHJlLWluaXRhbGl6ZSBpbWFnZSByZWFkZXIsIG1JbWdSZWFkZXI9JXAsIG1JbWdSZWFkZXJBbnc9JXAiLCBtSW1nUmVhZGVyLAorICAgICAgICAgICAgICAgICAgbUltZ1JlYWRlckFudyk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSBBSW1hZ2VSZWFkZXJfbmV3V2l0aFVzYWdlKAorICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwgbUZvcm1hdCwgbVVzYWdlLCBtTWF4SW1hZ2VzLCAmbUltZ1JlYWRlcik7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IG1JbWdSZWFkZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgbmV3IEFJbWFnZVJlYWRlciwgcmV0PSVkLCBtSW1nUmVhZGVyPSVwIiwgcmV0LCBtSW1nUmVhZGVyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldCA9IEFJbWFnZVJlYWRlcl9zZXRJbWFnZUxpc3RlbmVyKG1JbWdSZWFkZXIsICZtUmVhZGVyQXZhaWxhYmxlQ2IpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgaW1hZ2UgYXZhaWxhYmxlIGxpc3RlbmVyLCByZXQ9JWQuIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfc2V0QnVmZmVyUmVtb3ZlZExpc3RlbmVyKG1JbWdSZWFkZXIsICZtUmVhZGVyRGV0YWNoZWRDYik7CisgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBidWZmZXIgZGV0YWNoaW5nIGxpc3RlbmVyLCByZXQ9JWQuIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93TmF0aXZlSGFuZGxlKG1JbWdSZWFkZXIsICZtSW1nUmVhZGVyQW53KTsKKyAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfT0sgfHwgbUltZ1JlYWRlckFudyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBuYXRpdmVfaGFuZGxlX3QgZnJvbSBBSW1hZ2VSZWFkZXIsIHJldD0lZCwgbUltZ1JlYWRlckFudz0lcC4iLCByZXQsCisgICAgICAgICAgICAgICAgICBtSW1nUmVhZGVyQW53KTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIG5hdGl2ZV9oYW5kbGVfdCogZ2V0TmF0aXZlV2luZG93KCkgeyByZXR1cm4gbUltZ1JlYWRlckFudzsgfQorCisgICAgaW50IGdldEFjcXVpcmVkSW1hZ2VDb3VudCgpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgcmV0dXJuIG1BY3F1aXJlZEltYWdlQ291bnQ7CisgICAgfQorCisgICAgdm9pZCBIYW5kbGVJbWFnZUF2YWlsYWJsZShBSW1hZ2VSZWFkZXIqIHJlYWRlcikgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgICAgIEFJbWFnZSogb3V0SW1hZ2UgPSBudWxscHRyOworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQ7CisKKyAgICAgICAgLy8gTWFrZSBzdXJlIEFJbWFnZSB3aWxsIGJlIGRlbGV0ZWQgYXV0b21hdGljYWxseSB3aGVuIGl0IGdvZXMgb3V0IG9mCisgICAgICAgIC8vIHNjb3BlLgorICAgICAgICBhdXRvIGltYWdlRGVsZXRlciA9IFt0aGlzXShBSW1hZ2UqIGltZykgeworICAgICAgICAgICAgaWYgKG1Bc3luYykgeworICAgICAgICAgICAgICAgIEFJbWFnZV9kZWxldGVBc3luYyhpbWcsIGtEdW1teUZlbmNlRmQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBSW1hZ2VfZGVsZXRlKGltZyk7CisgICAgICAgICAgICB9CisgICAgICAgIH07CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBSW1hZ2UsIGRlY2x0eXBlKGltYWdlRGVsZXRlcik+IGltZyhudWxscHRyLCBpbWFnZURlbGV0ZXIpOworCisgICAgICAgIGlmIChtQXN5bmMpIHsKKyAgICAgICAgICAgIGludCBvdXRGZW5jZUZkID0gMDsKKyAgICAgICAgICAgIC8vIFZlcml0eSB0aGF0IG91dEZlbmNlRmQncyB2YWx1ZSB3aWxsIGJlIGNoYW5nZWQgYnkKKyAgICAgICAgICAgIC8vIEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlQXN5bmMuCisgICAgICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZUFzeW5jKHJlYWRlciwgJm91dEltYWdlLCAmb3V0RmVuY2VGZCk7CisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBvdXRJbWFnZSA9PSBudWxscHRyIHx8IG91dEZlbmNlRmQgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWNxdWlyZSBpbWFnZSwgcmV0PSVkLCBvdXRJYW1nZT0lcCwgb3V0RmVuY2VGZD0lZC4iLCByZXQsIG91dEltYWdlLAorICAgICAgICAgICAgICAgICAgICAgIG91dEZlbmNlRmQpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGltZy5yZXNldChvdXRJbWFnZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfYWNxdWlyZU5leHRJbWFnZShyZWFkZXIsICZvdXRJbWFnZSk7CisgICAgICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBvdXRJbWFnZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhY3F1aXJlIGltYWdlLCByZXQ9JWQsIG91dElhbWdlPSVwLiIsIHJldCwgb3V0SW1hZ2UpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGltZy5yZXNldChvdXRJbWFnZSk7CisgICAgICAgIH0KKworICAgICAgICBBSGFyZHdhcmVCdWZmZXIqIG91dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHJldCA9IEFJbWFnZV9nZXRIYXJkd2FyZUJ1ZmZlcihpbWcuZ2V0KCksICZvdXRCdWZmZXIpOworICAgICAgICBpZiAocmV0ICE9IEFNRURJQV9PSyB8fCBvdXRCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxkIHRvIGdldCBoYXJkd2FyZSBidWZmZXIsIHJldD0lZCwgb3V0QnVmZmVyPSVwLiIsIHJldCwgb3V0QnVmZmVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5vIG5lZWQgdG8gcmVsZWFzZSBBSGFyZHdhcmVCdWZmZXIsIHNpbmNlIHdlIGRvbid0IGFjcXVpcmUgYWRkaXRpb25hbAorICAgICAgICAvLyByZWZlcmVuY2UgdG8gaXQuCisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIG91dERlc2M7CisgICAgICAgIEFIYXJkd2FyZUJ1ZmZlcl9kZXNjcmliZShvdXRCdWZmZXIsICZvdXREZXNjKTsKKyAgICAgICAgaW50MzJfdCBpbWFnZVdpZHRoID0gMDsKKyAgICAgICAgaW50MzJfdCBpbWFnZUhlaWdodCA9IDA7CisgICAgICAgIGludDMyX3QgYnVmZmVyV2lkdGggPSBzdGF0aWNfY2FzdDxpbnQzMl90PihvdXREZXNjLndpZHRoKTsKKyAgICAgICAgaW50MzJfdCBidWZmZXJIZWlnaHQgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihvdXREZXNjLmhlaWdodCk7CisKKyAgICAgICAgQUltYWdlX2dldFdpZHRoKG91dEltYWdlLCAmaW1hZ2VXaWR0aCk7CisgICAgICAgIEFJbWFnZV9nZXRIZWlnaHQob3V0SW1hZ2UsICZpbWFnZUhlaWdodCk7CisgICAgICAgIGlmIChpbWFnZVdpZHRoICE9IG1XaWR0aCB8fCBpbWFnZUhlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgICAgICAgICBBTE9HRSgiTWlzbWF0Y2hlZCBvdXRwdXQgaW1hZ2UgZGltZW5zaW9uOiBleHBlY3RlZD0lZHglZCwgYWN0dWFsPSVkeCVkIiwgbVdpZHRoLAorICAgICAgICAgICAgICAgICAgbUhlaWdodCwgaW1hZ2VXaWR0aCwgaW1hZ2VIZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9SR0JBXzg4ODggfHwKKyAgICAgICAgICAgIG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9SR0JYXzg4ODggfHwKKyAgICAgICAgICAgIG1Gb3JtYXQgPT0gQUlNQUdFX0ZPUk1BVF9SR0JfODg4IHx8CisgICAgICAgICAgICBtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfUkdCXzU2NSB8fAorICAgICAgICAgICAgbUZvcm1hdCA9PSBBSU1BR0VfRk9STUFUX1JHQkFfRlAxNiB8fAorICAgICAgICAgICAgbUZvcm1hdCA9PSBBSU1BR0VfRk9STUFUX1lVVl80MjBfODg4IHx8CisgICAgICAgICAgICBtRm9ybWF0ID09IEFJTUFHRV9GT1JNQVRfWTgpIHsKKyAgICAgICAgICAgIC8vIENoZWNrIG91dHB1dCBidWZmZXIgZGltZW5zaW9uIGZvciBjZXJ0YWluIGZvcm1hdHMuIERvbid0IGRvIHRoaXMgZm9yIGJsb2IgYmFzZWQKKyAgICAgICAgICAgIC8vIGZvcm1hdHMuCisgICAgICAgICAgICBpZiAoYnVmZmVyV2lkdGggIT0gbVdpZHRoIHx8IGJ1ZmZlckhlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIk1pc21hdGNoZWQgb3V0cHV0IGJ1ZmZlciBkaW1lbnNpb246IGV4cGVjdGVkPSVkeCVkLCBhY3R1YWw9JWR4JWQiLCBtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgbUhlaWdodCwgYnVmZmVyV2lkdGgsIGJ1ZmZlckhlaWdodCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKChvdXREZXNjLnVzYWdlICYgbVVzYWdlKSAhPSBtVXNhZ2UpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNaXNtYXRjaGVkIG91dHB1dCBidWZmZXIgdXNhZ2U6IGFjdHVhbCAoJSIgUFJJdTY0ICIpLCBleHBlY3RlZCAoJSIgUFJJdTY0ICIpIiwKKyAgICAgICAgICAgICAgICAgIG91dERlc2MudXNhZ2UsIG1Vc2FnZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90KiBkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgaW50IGRhdGFMZW5ndGggPSAwOworICAgICAgICByZXQgPSBBSW1hZ2VfZ2V0UGxhbmVEYXRhKGltZy5nZXQoKSwgMCwgJmRhdGEsICZkYXRhTGVuZ3RoKTsKKyAgICAgICAgaWYgKG1Vc2FnZSAmIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfUkVBRF9PRlRFTikgeworICAgICAgICAgICAgLy8gV2hlbiB3ZSBoYXZlIENQVV9SRUFEX09GVEVOIHVzYWdlIGJpdHMsIHdlIGNhbiBsb2NrIHRoZSBpbWFnZS4KKyAgICAgICAgICAgIGlmIChyZXQgIT0gQU1FRElBX09LIHx8IGRhdGEgPT0gbnVsbHB0ciB8fCBkYXRhTGVuZ3RoIDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWNjZXNzIENQVSBkYXRhLCByZXQ9JWQsIGRhdGE9JXAsIGRhdGFMZW5ndGg9JWQiLCByZXQsIGRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgZGF0YUxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKHJldCAhPSBBTUVESUFfSU1HUkVBREVSX0NBTk5PVF9MT0NLX0lNQUdFIHx8IGRhdGEgIT0gbnVsbHB0ciB8fCBkYXRhTGVuZ3RoICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiU2hvdWxkbid0IGJlIGFibGUgdG8gYWNjZXNzIENQVSBkYXRhLCByZXQ9JWQsIGRhdGE9JXAsIGRhdGFMZW5ndGg9JWQiLCByZXQsCisgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgZGF0YUxlbmd0aCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIE9ubHkgaW5jcmVhc2UgbUFjcXVpcmVkSW1hZ2VDb3VudCBpZiBhbGwgY2hlY2tzIHBhc3MuCisgICAgICAgIG1BY3F1aXJlZEltYWdlQ291bnQrKzsKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBvbkltYWdlQXZhaWxhYmxlKHZvaWQqIG9iaiwgQUltYWdlUmVhZGVyKiByZWFkZXIpIHsKKyAgICAgICAgSW1hZ2VSZWFkZXJUZXN0Q2FzZSogdGhpeiA9IHJlaW50ZXJwcmV0X2Nhc3Q8SW1hZ2VSZWFkZXJUZXN0Q2FzZSo+KG9iaik7CisgICAgICAgIHRoaXotPkhhbmRsZUltYWdlQXZhaWxhYmxlKHJlYWRlcik7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQKKyAgICBvbkJ1ZmZlclJlbW92ZWQodm9pZCogLypvYmoqLywgQUltYWdlUmVhZGVyKiAvKnJlYWRlciovLCBBSGFyZHdhcmVCdWZmZXIqIC8qYnVmZmVyKi8pIHsKKyAgICAgICAgLy8gTm8tb3AsIGp1c3QgdG8gY2hlY2sgdGhlIGxpc3RlbmVyIGNhbiBiZSBzZXQgcHJvcGVybHkuCisgICAgfQorCisgICBwcml2YXRlOgorICAgIGludDMyX3QgbVdpZHRoOworICAgIGludDMyX3QgbUhlaWdodDsKKyAgICBpbnQzMl90IG1Gb3JtYXQ7CisgICAgdWludDY0X3QgbVVzYWdlOworICAgIGludDMyX3QgbU1heEltYWdlczsKKyAgICBib29sIG1Bc3luYzsKKworICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIGludCBtQWNxdWlyZWRJbWFnZUNvdW50ezB9OworCisgICAgQUltYWdlUmVhZGVyKiBtSW1nUmVhZGVyID0gbnVsbHB0cjsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIG1JbWdSZWFkZXJBbncgPSBudWxscHRyOworCisgICAgQUltYWdlUmVhZGVyX0ltYWdlTGlzdGVuZXIgbVJlYWRlckF2YWlsYWJsZUNie3RoaXMsIG9uSW1hZ2VBdmFpbGFibGV9OworICAgIEFJbWFnZVJlYWRlcl9CdWZmZXJSZW1vdmVkTGlzdGVuZXIgbVJlYWRlckRldGFjaGVkQ2J7dGhpcywgb25CdWZmZXJSZW1vdmVkfTsKK307CisKKworY2xhc3MgQUltYWdlUmVhZGVyVmVuZG9yVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICBwdWJsaWM6CisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbWVyYU1hbmFnZXIgPSBBQ2FtZXJhTWFuYWdlcl9jcmVhdGUoKTsKKyAgICAgICAgaWYgKG1DYW1lcmFNYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIEFDYW1lcmFNYW5hZ2VyLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUlkTGlzdChtQ2FtZXJhTWFuYWdlciwgJm1DYW1lcmFJZExpc3QpOworICAgICAgICBpZiAocmV0ICE9IEFDQU1FUkFfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGNhbWVyYUlkTGlzdDogcmV0PSVkIiwgcmV0KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBBZGQgbW9yZSByaWdvcm91cyB0ZXN0cyBmb3IgdmVuZG9yIHRhZ3MKKyAgICAgICAgQVNTRVJUX05FKFZlbmRvclRhZ0Rlc2NyaXB0b3JDYWNoZTo6Z2V0R2xvYmFsVmVuZG9yVGFnQ2FjaGUoKSwgbnVsbHB0cik7CisgICAgICAgIGlmIChtQ2FtZXJhSWRMaXN0LT5udW1DYW1lcmFzIDwgMSkgeworICAgICAgICAgICAgQUxPR1coIkRldmljZSBoYXMgbm8gY2FtZXJhIG9uIGJvYXJkLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIC8vIERlc3Ryb3kgY2FtZXJhIG1hbmFnZXIKKyAgICAgICAgaWYgKG1DYW1lcmFJZExpc3QpIHsKKyAgICAgICAgICAgIEFDYW1lcmFNYW5hZ2VyX2RlbGV0ZUNhbWVyYUlkTGlzdChtQ2FtZXJhSWRMaXN0KTsKKyAgICAgICAgICAgIG1DYW1lcmFJZExpc3QgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGlmIChtQ2FtZXJhTWFuYWdlcikgeworICAgICAgICAgICAgQUNhbWVyYU1hbmFnZXJfZGVsZXRlKG1DYW1lcmFNYW5hZ2VyKTsKKyAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgdGFrZVBpY3R1cmVzKGNvbnN0IGNoYXIqIGlkLCB1aW50NjRfdCByZWFkZXJVc2FnZSwgaW50IHJlYWRlck1heEltYWdlcywKKyAgICAgICAgICAgIGJvb2wgcmVhZGVyQXN5bmMsIGludCBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgaW50IHJldCA9IDA7CisKKyAgICAgICAgSW1hZ2VSZWFkZXJUZXN0Q2FzZSB0ZXN0Q2FzZSgKKyAgICAgICAgICAgICAgICBrVGVzdEltYWdlV2lkdGgsIGtUZXN0SW1hZ2VIZWlnaHQsIGtUZXN0SW1hZ2VGb3JtYXQsIHJlYWRlclVzYWdlLCByZWFkZXJNYXhJbWFnZXMsCisgICAgICAgICAgICAgICAgcmVhZGVyQXN5bmMpOworICAgICAgICByZXQgPSB0ZXN0Q2FzZS5pbml0SW1hZ2VSZWFkZXIoKTsKKyAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBJbWFnZVJlYWRlciIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgQ2FtZXJhSGVscGVyIGNhbWVyYUhlbHBlcihpZCwgbUNhbWVyYU1hbmFnZXIpOworICAgICAgICBzdGQ6OnZhcmlhbnQ8aW50LCBDb25maWd1cmVkV2luZG93cz4gcmV0SW5pdCA9CisgICAgICAgICAgICAgICAgY2FtZXJhSGVscGVyLmluaXRDYW1lcmEodGVzdENhc2UuZ2V0TmF0aXZlV2luZG93KCksIHt9LypwaHlzaWNhbEltYWdlUmVhZGVycyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLyp1c2VQaHlzaWNhbFNldHRpbmdzKi8pOworICAgICAgICBpbnQgKnJldHAgPSBzdGQ6OmdldF9pZjxpbnQ+KCZyZXRJbml0KTsKKyAgICAgICAgaWYgKHJldHApIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gaW5pdGlhbGl6ZSBjYW1lcmEgaGVscGVyIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIWNhbWVyYUhlbHBlci5pc0NhbWVyYVJlYWR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJDYW1lcmEgaXMgbm90IHJlYWR5IGFmdGVyIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24uIEl0J3MgZWl0aGVyIGR1ZSB0byBjYW1lcmEgIgorICAgICAgICAgICAgICAgICAgIm9uIGJvYXJkIGxhY2tzIEJBQ0tXQVJEU19DT01QQVRJQkxFIGNhcGFiaWxpdHkgb3IgdGhlIGRldmljZSBkb2VzIG5vdCBoYXZlICIKKyAgICAgICAgICAgICAgICAgICJjYW1lcmEgb24gYm9hcmQuIik7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGljdHVyZUNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIHJldCA9IGNhbWVyYUhlbHBlci50YWtlUGljdHVyZSgpOworICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHRha2UgcGljdHVyZSIpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFNsZWVwIHVudGlsIGFsbCBjYXB0dXJlIGZpbmlzaGVkCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0NhcHR1cmVXYWl0UmV0cnkgKiBwaWN0dXJlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgdXNsZWVwKGtDYXB0dXJlV2FpdFVzKTsKKyAgICAgICAgICAgIGlmICh0ZXN0Q2FzZS5nZXRBY3F1aXJlZEltYWdlQ291bnQoKSA9PSBwaWN0dXJlQ291bnQpIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiU2Vzc2lvbiB0YWtlIH4lZCBtcyB0byBjYXB0dXJlICVkIGltYWdlcyIsIGkgKiBrQ2FwdHVyZVdhaXRVcyAvIDEwMDAsCisgICAgICAgICAgICAgICAgICAgICAgcGljdHVyZUNvdW50KTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdGVzdENhc2UuZ2V0QWNxdWlyZWRJbWFnZUNvdW50KCkgPT0gcGljdHVyZUNvdW50ICYmCisgICAgICAgICAgICAgICAgY2FtZXJhSGVscGVyLmNoZWNrQ2FsbGJhY2tzKHBpY3R1cmVDb3VudCk7CisgICAgfQorCisgICAgYm9vbCB0ZXN0VGFrZVBpY3R1cmVzTmF0aXZlKGNvbnN0IGNoYXIqIGlkKSB7CisgICAgICAgIGZvciAoYXV0byYgcmVhZGVyVXNhZ2UgOgorICAgICAgICAgICAgIHtBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQURfT0ZURU59KSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIHJlYWRlck1heEltYWdlcyA6IHsxLCA0LCA4fSkgeworICAgICAgICAgICAgICAgIGZvciAoYXV0byYgcmVhZGVyQXN5bmMgOiB7dHJ1ZSwgZmFsc2V9KSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoYXV0byYgcGljdHVyZUNvdW50IDogezEsIDQsIDh9KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXRha2VQaWN0dXJlcyhpZCwgcmVhZGVyVXNhZ2UsIHJlYWRlck1heEltYWdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZGVyQXN5bmMsIHBpY3R1cmVDb3VudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVGVzdCB0YWtlUGljdHVyZXMgZmFpbGVkIGZvciB0ZXN0IGNhc2UgdXNhZ2U9JSIgUFJJdTY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiwgbWF4SW1hZ2VzPSVkLCBhc3luYz0lZCwgcGljdHVyZUNvdW50PSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXJVc2FnZSwgcmVhZGVyTWF4SW1hZ2VzLCByZWFkZXJBc3luYywgcGljdHVyZUNvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gQ2FtZXJhIG1hbmFnZXIKKyAgICBBQ2FtZXJhTWFuYWdlciogbUNhbWVyYU1hbmFnZXIgPSBudWxscHRyOworICAgIEFDYW1lcmFJZExpc3QqIG1DYW1lcmFJZExpc3QgPSBudWxscHRyOworCisgICAgYm9vbCBpc0NhcGFiaWxpdHlTdXBwb3J0ZWQoQUNhbWVyYU1ldGFkYXRhKiBzdGF0aWNJbmZvLAorICAgICAgICAgICAgYWNhbWVyYV9tZXRhZGF0YV9lbnVtX2FuZHJvaWRfcmVxdWVzdF9hdmFpbGFibGVfY2FwYWJpbGl0aWVzX3QgY2FwKSB7CisgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9jb25zdF9lbnRyeSBlbnRyeTsKKyAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2dldENvbnN0RW50cnkoCisgICAgICAgICAgICAgICAgc3RhdGljSW5mbywgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMsICZlbnRyeSk7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZW50cnkuZGF0YS51OFtpXSA9PSBjYXApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBpc1NpemVTdXBwb3J0ZWRGb3JGb3JtYXQoQUNhbWVyYU1ldGFkYXRhKiBzdGF0aWNJbmZvLAorICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSB7CisgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9jb25zdF9lbnRyeSBlbnRyeTsKKyAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2dldENvbnN0RW50cnkoc3RhdGljSW5mbywKKyAgICAgICAgICAgICAgICBBQ0FNRVJBX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TLCAmZW50cnkpOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgZW50cnkuY291bnQ7IGkgKz0gNCkgeworICAgICAgICAgICAgaWYgKGVudHJ5LmRhdGEuaTMyW2ldID09IGZvcm1hdCAmJgorICAgICAgICAgICAgICAgICAgICBlbnRyeS5kYXRhLmkzMltpKzNdID09IEFDQU1FUkFfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlNfT1VUUFVUICYmCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEuaTMyW2krMV0gPT0gd2lkdGggJiYKKyAgICAgICAgICAgICAgICAgICAgZW50cnkuZGF0YS5pMzJbaSsyXSA9PSBoZWlnaHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdm9pZCBmaW5kQ2FuZGlkYXRlTG9naWNhbENhbWVyYShjb25zdCBjaGFyICoqY2FtZXJhSWQsCisgICAgICAgICAgICBBQ2FtZXJhTWV0YWRhdGEqKiBzdGF0aWNNZXRhZGF0YSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IGNoYXIqPiogY2FuZGlkYXRlUGh5c2ljYWxJZHMpIHsKKyAgICAgICAgLy8gRmluZCBmaXJzdCBhdmFpbGFibGUgbG9naWNhbCBjYW1lcmEKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ2FtZXJhSWRMaXN0LT5udW1DYW1lcmFzOyBpKyspIHsKKyAgICAgICAgICAgIGNhbWVyYV9zdGF0dXNfdCByZXQ7CisgICAgICAgICAgICByZXQgPSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLCBtQ2FtZXJhSWRMaXN0LT5jYW1lcmFJZHNbaV0sIHN0YXRpY01ldGFkYXRhKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShyZXQsIEFDQU1FUkFfT0spOworICAgICAgICAgICAgQVNTRVJUX05FKCpzdGF0aWNNZXRhZGF0YSwgbnVsbHB0cik7CisKKyAgICAgICAgICAgIGlmICghaXNDYXBhYmlsaXR5U3VwcG9ydGVkKCpzdGF0aWNNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTE9HSUNBTF9NVUxUSV9DQU1FUkEpKSB7CisgICAgICAgICAgICAgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWUoKnN0YXRpY01ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICAqc3RhdGljTWV0YWRhdGEgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDaGVjayByZXR1cm5lZCBwaHlzaWNhbCBjYW1lcmEgSWRzIGFyZSB2YWxpZAorICAgICAgICAgICAgc2l6ZV90IHBoeXNpY2FsQ2FtZXJhSWRDbnQgPSAwOworICAgICAgICAgICAgY29uc3QgY2hhcipjb25zdCogcGh5c2ljYWxDYW1lcmFJZHMgPSBudWxscHRyOworICAgICAgICAgICAgYm9vbCBpc0xvZ2ljYWxDYW1lcmEgPSBBQ2FtZXJhTWV0YWRhdGFfaXNMb2dpY2FsTXVsdGlDYW1lcmEoKnN0YXRpY01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAmcGh5c2ljYWxDYW1lcmFJZENudCwgJnBoeXNpY2FsQ2FtZXJhSWRzKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGlzTG9naWNhbENhbWVyYSk7CisgICAgICAgICAgICBBU1NFUlRfR0UocGh5c2ljYWxDYW1lcmFJZENudCwgMik7CisgICAgICAgICAgICBBQ2FtZXJhTWV0YWRhdGEqIHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEgPSBudWxscHRyOworICAgICAgICAgICAgY2FuZGlkYXRlUGh5c2ljYWxJZHMtPmNsZWFyKCk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHBoeXNpY2FsQ2FtZXJhSWRDbnQgJiYgY2FuZGlkYXRlUGh5c2ljYWxJZHMtPnNpemUoKSA8IDI7IGorKykgeworICAgICAgICAgICAgICAgIEFTU0VSVF9HVChzdHJsZW4ocGh5c2ljYWxDYW1lcmFJZHNbal0pLCAwKTsKKyAgICAgICAgICAgICAgICByZXQgPSBBQ2FtZXJhTWFuYWdlcl9nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FtZXJhTWFuYWdlciwgcGh5c2ljYWxDYW1lcmFJZHNbal0sICZwaHlzaWNhbENhbWVyYU1ldGFkYXRhKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEocmV0LCBBQ0FNRVJBX09LKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfTkUocGh5c2ljYWxDYW1lcmFNZXRhZGF0YSwgbnVsbHB0cik7CisKKyAgICAgICAgICAgICAgICBpZiAoaXNTaXplU3VwcG9ydGVkRm9yRm9ybWF0KHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEsIGtUZXN0SW1hZ2VGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBrVGVzdEltYWdlV2lkdGgsIGtUZXN0SW1hZ2VIZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbmRpZGF0ZVBoeXNpY2FsSWRzLT5wdXNoX2JhY2socGh5c2ljYWxDYW1lcmFJZHNbal0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZnJlZShwaHlzaWNhbENhbWVyYU1ldGFkYXRhKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjYW5kaWRhdGVQaHlzaWNhbElkcy0+c2l6ZSgpID09IDIpIHsKKyAgICAgICAgICAgICAgICAqY2FtZXJhSWQgPSBtQ2FtZXJhSWRMaXN0LT5jYW1lcmFJZHNbaV07CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBQ2FtZXJhTWV0YWRhdGFfZnJlZSgqc3RhdGljTWV0YWRhdGEpOworICAgICAgICAgICAgICAgICpzdGF0aWNNZXRhZGF0YSA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKmNhbWVyYUlkID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZvaWQgdGVzdExvZ2ljYWxDYW1lcmFQaHlzaWNhbFN0cmVhbShib29sIHVzZVBoeXNpY2FsU2V0dGluZ3MpIHsKKyAgICAgICAgY29uc3QgY2hhciogY2FtZXJhSWQgPSBudWxscHRyOworICAgICAgICBBQ2FtZXJhTWV0YWRhdGEqIHN0YXRpY01ldGFkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IHBoeXNpY2FsQ2FtZXJhSWRzOworCisgICAgICAgIGZpbmRDYW5kaWRhdGVMb2dpY2FsQ2FtZXJhKCZjYW1lcmFJZCwgJnN0YXRpY01ldGFkYXRhLCAmcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICBpZiAoY2FtZXJhSWQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gQ291bGRuJ3QgZmluZCBsb2dpY2FsIGNhbWVyYSB0byB0ZXN0CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvLyBUZXN0IHN0cmVhbWluZyB0aGUgbG9naWNhbCBtdWx0aS1jYW1lcmEKKyAgICAgICAgdWludDY0X3QgcmVhZGVyVXNhZ2UgPSBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQURfT0ZURU47CisgICAgICAgIGludDMyX3QgcmVhZGVyTWF4SW1hZ2VzID0gODsKKyAgICAgICAgYm9vbCByZWFkZXJBc3luYyA9IGZhbHNlOworICAgICAgICBjb25zdCBpbnQgcGljdHVyZUNvdW50ID0gNjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8SW1hZ2VSZWFkZXJUZXN0Q2FzZSo+IHRlc3RDYXNlczsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAzOyBpKyspIHsKKyAgICAgICAgICAgIEltYWdlUmVhZGVyVGVzdENhc2UqIHRlc3RDYXNlID0gbmV3IEltYWdlUmVhZGVyVGVzdENhc2UoCisgICAgICAgICAgICAgICAgICAgIGtUZXN0SW1hZ2VXaWR0aCwga1Rlc3RJbWFnZUhlaWdodCwga1Rlc3RJbWFnZUZvcm1hdCwgcmVhZGVyVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgIHJlYWRlck1heEltYWdlcywgcmVhZGVyQXN5bmMpOworICAgICAgICAgICAgQVNTRVJUX0VRKHRlc3RDYXNlLT5pbml0SW1hZ2VSZWFkZXIoKSwgMCk7CisgICAgICAgICAgICB0ZXN0Q2FzZXMucHVzaF9iYWNrKHRlc3RDYXNlKTsKKyAgICAgICAgfQorCisgICAgICAgIENhbWVyYUhlbHBlciBjYW1lcmFIZWxwZXIoY2FtZXJhSWQsIG1DYW1lcmFNYW5hZ2VyKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Q2FtZXJhSGVscGVyOjpQaHlzaWNhbEltZ1JlYWRlckluZm8+IHBoeXNpY2FsSW1nUmVhZGVySW5mbzsKKyAgICAgICAgcGh5c2ljYWxJbWdSZWFkZXJJbmZvLnB1c2hfYmFjayh7cGh5c2ljYWxDYW1lcmFJZHNbMF0sIHRlc3RDYXNlc1sxXS0+Z2V0TmF0aXZlV2luZG93KCl9KTsKKyAgICAgICAgcGh5c2ljYWxJbWdSZWFkZXJJbmZvLnB1c2hfYmFjayh7cGh5c2ljYWxDYW1lcmFJZHNbMV0sIHRlc3RDYXNlc1syXS0+Z2V0TmF0aXZlV2luZG93KCl9KTsKKworICAgICAgICBzdGQ6OnZhcmlhbnQ8aW50LCBDb25maWd1cmVkV2luZG93cz4gcmV0SW5pdCA9CisgICAgICAgICAgICAgICAgY2FtZXJhSGVscGVyLmluaXRDYW1lcmEodGVzdENhc2VzWzBdLT5nZXROYXRpdmVXaW5kb3coKSwgcGh5c2ljYWxJbWdSZWFkZXJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzZVBoeXNpY2FsU2V0dGluZ3MpOworICAgICAgICBpbnQgKnJldHAgPSBzdGQ6OmdldF9pZjxpbnQ+KCZyZXRJbml0KTsKKyAgICAgICAgQVNTRVJUX0VRKHJldHAsIG51bGxwdHIpOworICAgICAgICBDb25maWd1cmVkV2luZG93cyAqY29uZmlndXJlZFdpbmRvd3NwID0gc3RkOjpnZXRfaWY8Q29uZmlndXJlZFdpbmRvd3M+KCZyZXRJbml0KTsKKyAgICAgICAgQVNTRVJUX05FKGNvbmZpZ3VyZWRXaW5kb3dzcCwgbnVsbHB0cik7CisgICAgICAgIEFTU0VSVF9MRShjb25maWd1cmVkV2luZG93c3AtPnNpemUoKSwgdGVzdENhc2VzLnNpemUoKSk7CisgICAgICAgIGludCByZXQgPSAwOworICAgICAgICBpZiAoIWNhbWVyYUhlbHBlci5pc0NhbWVyYVJlYWR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dXKCJDYW1lcmEgaXMgbm90IHJlYWR5IGFmdGVyIHN1Y2Nlc3NmdWwgaW5pdGlhbGl6YXRpb24uIEl0J3MgZWl0aGVyIGR1ZSB0byBjYW1lcmEgIgorICAgICAgICAgICAgICAgICAgIm9uIGJvYXJkIGxhY2tzIEJBQ0tXQVJEU19DT01QQVRJQkxFIGNhcGFiaWxpdHkgb3IgdGhlIGRldmljZSBkb2VzIG5vdCBoYXZlICIKKyAgICAgICAgICAgICAgICAgICJjYW1lcmEgb24gYm9hcmQuIik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBpY3R1cmVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICByZXQgPSBjYW1lcmFIZWxwZXIudGFrZUxvZ2ljYWxDYW1lcmFQaWN0dXJlKCk7CisgICAgICAgICAgICBBU1NFUlRfRVEocmV0LCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNsZWVwIHVudGlsIGFsbCBjYXB0dXJlIGZpbmlzaGVkCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0NhcHR1cmVXYWl0UmV0cnkgKiBwaWN0dXJlQ291bnQ7IGkrKykgeworICAgICAgICAgICAgdXNsZWVwKGtDYXB0dXJlV2FpdFVzKTsKKyAgICAgICAgICAgIGlmICh0ZXN0Q2FzZXNbMF0tPmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpID09IHBpY3R1cmVDb3VudCkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJTZXNzaW9uIHRha2UgfiVkIG1zIHRvIGNhcHR1cmUgJWQgaW1hZ2VzIiwgaSAqIGtDYXB0dXJlV2FpdFVzIC8gMTAwMCwKKyAgICAgICAgICAgICAgICAgICAgICBwaWN0dXJlQ291bnQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvcihhdXRvICZ0ZXN0Q2FzZSA6IHRlc3RDYXNlcykgeworICAgICAgICAgICAgYXV0byBpdCA9IGNvbmZpZ3VyZWRXaW5kb3dzcC0+ZmluZCh0ZXN0Q2FzZS0+Z2V0TmF0aXZlV2luZG93KCkpOworICAgICAgICAgICAgaWYgKGl0ID09IGNvbmZpZ3VyZWRXaW5kb3dzcC0+ZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dJKCJUZXN0aW5nIHdpbmRvdyAlcCIsIHRlc3RDYXNlLT5nZXROYXRpdmVXaW5kb3coKSk7CisgICAgICAgICAgICBBU1NFUlRfRVEodGVzdENhc2UtPmdldEFjcXVpcmVkSW1hZ2VDb3VudCgpLCBwaWN0dXJlQ291bnQpOworICAgICAgICB9CisKKyAgICAgICAgQVNTRVJUX1RSVUUoY2FtZXJhSGVscGVyLmNoZWNrQ2FsbGJhY2tzKHBpY3R1cmVDb3VudCkpOworCisgICAgICAgIEFDYW1lcmFNZXRhZGF0YV9mcmVlKHN0YXRpY01ldGFkYXRhKTsKKyAgICB9Cit9OworCitURVNUX0YoQUltYWdlUmVhZGVyVmVuZG9yVGVzdCwgQ3JlYXRlV2luZG93TmF0aXZlSGFuZGxlKSB7CisgICAgLy8gV2UgYWx3YXlzIHVzZSB0aGUgZmlyc3QgY2FtZXJhLgorICAgIGNvbnN0IGNoYXIqIGNhbWVyYUlkID0gbUNhbWVyYUlkTGlzdC0+Y2FtZXJhSWRzWzBdOworICAgIEFTU0VSVF9UUlVFKGNhbWVyYUlkICE9IG51bGxwdHIpOworCisgICAgQUNhbWVyYU1ldGFkYXRhKiBzdGF0aWNNZXRhZGF0YSA9IG51bGxwdHI7CisgICAgY2FtZXJhX3N0YXR1c190IHJldCA9IEFDYW1lcmFNYW5hZ2VyX2dldENhbWVyYUNoYXJhY3RlcmlzdGljcygKKyAgICAgICAgICAgIG1DYW1lcmFNYW5hZ2VyLCBjYW1lcmFJZCwgJnN0YXRpY01ldGFkYXRhKTsKKyAgICBBU1NFUlRfRVEocmV0LCBBQ0FNRVJBX09LKTsKKyAgICBBU1NFUlRfTkUoc3RhdGljTWV0YWRhdGEsIG51bGxwdHIpOworCisgICAgYm9vbCBpc0JDID0gaXNDYXBhYmlsaXR5U3VwcG9ydGVkKHN0YXRpY01ldGFkYXRhLAorICAgICAgICAgICAgQUNBTUVSQV9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfQkFDS1dBUkRfQ09NUEFUSUJMRSk7CisKKyAgICB1aW50MzJfdCBuYW1lZFRhZyA9IDA7CisgICAgLy8gVGVzdCB0aGF0IEFDYW1lcmFNZXRhZGF0YV9nZXRUYWdGcm9tTmFtZSB3b3JrcyBhcyBleHBlY3RlZCBmb3IgcHVibGljIHRhZworICAgIC8vIG5hbWVzCisgICAgY2FtZXJhX3N0YXR1c190IHN0YXR1cyA9IEFDYW1lcmFNYW5hZ2VyX2dldFRhZ0Zyb21OYW1lKG1DYW1lcmFNYW5hZ2VyLCBjYW1lcmFJZCwKKyAgICAgICAgICAgICJhbmRyb2lkLmNvbnRyb2wuYWVNb2RlIiwgJm5hbWVkVGFnKTsKKworICAgIEFTU0VSVF9FUShzdGF0dXMsIEFDQU1FUkFfT0spOworICAgIEFTU0VSVF9FUShuYW1lZFRhZywgQUNBTUVSQV9DT05UUk9MX0FFX01PREUpOworCisgICAgQUNhbWVyYU1ldGFkYXRhX2ZyZWUoc3RhdGljTWV0YWRhdGEpOworCisgICAgaWYgKCFpc0JDKSB7CisgICAgICAgIEFMT0dXKCJDYW1lcmEgZG9lcyBub3Qgc3VwcG9ydCBCQUNLV0FSRF9DT01QQVRJQkxFLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRVhQRUNUX1RSVUUodGVzdFRha2VQaWN0dXJlc05hdGl2ZShjYW1lcmFJZCkpOworfQorCitURVNUX0YoQUltYWdlUmVhZGVyVmVuZG9yVGVzdCwgTG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKSB7CisgICAgdGVzdExvZ2ljYWxDYW1lcmFQaHlzaWNhbFN0cmVhbShmYWxzZS8qdXNlUGh5c2ljYWxTZXR0aW5ncyovKTsKKyAgICB0ZXN0TG9naWNhbENhbWVyYVBoeXNpY2FsU3RyZWFtKHRydWUvKnVzZVBoeXNpY2FsU2V0dGluZ3MqLyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvY2FtZXJhL3Rlc3RzL0FuZHJvaWQubWsgYi9jYW1lcmEvdGVzdHMvQW5kcm9pZC5tawppbmRleCA2NTk0ODRmLi5lNWMxNjMxIDEwMDY0NAotLS0gYS9jYW1lcmEvdGVzdHMvQW5kcm9pZC5taworKysgYi9jYW1lcmEvdGVzdHMvQW5kcm9pZC5tawpAQCAtMTksNyArMTksOCBAQAogTE9DQUxfU1JDX0ZJTEVTOj0gXAogCVZlbmRvclRhZ0Rlc2NyaXB0b3JUZXN0cy5jcHAgXAogCUNhbWVyYUJpbmRlclRlc3RzLmNwcCBcCi0JQ2FtZXJhWlNMVGVzdHMuY3BwCisJQ2FtZXJhWlNMVGVzdHMuY3BwIFwKKwlDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJsb2cgXApkaWZmIC0tZ2l0IGEvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcCBiL2NhbWVyYS90ZXN0cy9DYW1lcmFCaW5kZXJUZXN0cy5jcHAKaW5kZXggMWRlNzAxMy4uOGZlMDI5YSAxMDA2NDQKLS0tIGEvY2FtZXJhL3Rlc3RzL0NhbWVyYUJpbmRlclRlc3RzLmNwcAorKysgYi9jYW1lcmEvdGVzdHMvQ2FtZXJhQmluZGVyVGVzdHMuY3BwCkBAIC0yOSw2ICsyOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvQ29uZGl0aW9uLmg+CiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KICNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEzLmg+CiAjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgogCiAjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CkBAIC00MCw2ICs0MSw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEyL0JuQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CiAjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvQ2FwdHVyZVJlcXVlc3QuaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9PdXRwdXRDb25maWd1cmF0aW9uLmg+CisjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvU2Vzc2lvbkNvbmZpZ3VyYXRpb24uaD4KICNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TdWJtaXRJbmZvLmg+CiAKICNpbmNsdWRlIDxndWkvQnVmZmVySXRlbUNvbnN1bWVyLmg+CkBAIC01NSw2ICs1Nyw4IEBACiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlRGVmYXVsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOwogCiAjZGVmaW5lIEFTU0VSVF9OT1RfTlVMTCh4KSBcCiAgICAgQVNTRVJUX1RSVUUoKHgpICE9IG51bGxwdHIpCkBAIC04Niw2ICs5MCwxMSBAQAogICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiAgICAgfTsKIAorICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCgpIHsKKyAgICAgICAgLy8gTm8gb3AKKyAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworICAgIH0KKwogICAgIGJvb2wgd2FpdEZvck51bUNhbWVyYXMoc2l6ZV90IG51bSkgY29uc3QgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKQEAgLTQ3Niw3ICs0ODUsOCBAQAogCiAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2UobmV3IFN1cmZhY2UoZ2JQcm9kdWNlciwgLypjb250cm9sbGVkQnlBcHAqL2ZhbHNlKSk7CiAKLSAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBvdXRwdXQoZ2JQcm9kdWNlciwgLypyb3RhdGlvbiovMCk7CisgICAgICAgIFN0cmluZzE2IG5vUGh5c2ljYWxJZDsKKyAgICAgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBvdXRwdXQoZ2JQcm9kdWNlciwgLypyb3RhdGlvbiovMCwgbm9QaHlzaWNhbElkKTsKIAogICAgICAgICAvLyBDYW4gd2UgY29uZmlndXJlPwogICAgICAgICByZXMgPSBkZXZpY2UtPmJlZ2luQ29uZmlndXJlKCk7CkBAIC00OTAsNiArNTAwLDE5IEBACiAgICAgICAgIEVYUEVDVF9UUlVFKHJlcy5pc09rKCkpIDw8IHJlczsKICAgICAgICAgRVhQRUNUX0ZBTFNFKGNhbGxiYWNrcy0+aGFkRXJyb3IoKSk7CiAKKyAgICAgICAgLy8gU2Vzc2lvbiBjb25maWd1cmF0aW9uIG11c3QgYWxzbyBiZSBzdXBwb3J0ZWQgaW4gdGhpcyBjYXNlCisgICAgICAgIFNlc3Npb25Db25maWd1cmF0aW9uIHNlc3Npb25Db25maWd1cmF0aW9uID0geyAvKmlucHV0V2lkdGgqLyAwLCAvKmlucHV0SGVpZ2h0Ki8wLAorICAgICAgICAgICAgICAgIC8qaW5wdXRGb3JtYXQqLyAtMSwgQ0FNRVJBM19TVFJFQU1fQ09ORklHVVJBVElPTl9OT1JNQUxfTU9ERX07CisgICAgICAgIHNlc3Npb25Db25maWd1cmF0aW9uLmFkZE91dHB1dENvbmZpZ3VyYXRpb24ob3V0cHV0KTsKKyAgICAgICAgYm9vbCBxdWVyeVN0YXR1czsKKyAgICAgICAgcmVzID0gZGV2aWNlLT5pc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKHNlc3Npb25Db25maWd1cmF0aW9uLCAmcXVlcnlTdGF0dXMpOworICAgICAgICBFWFBFQ1RfVFJVRShyZXMuaXNPaygpIHx8CisgICAgICAgICAgICAgICAgKHJlcy5zZXJ2aWNlU3BlY2lmaWNFcnJvckNvZGUoKSA9PSBJQ2FtZXJhU2VydmljZURlZmF1bHQ6OkVSUk9SX0lOVkFMSURfT1BFUkFUSU9OKSkKKyAgICAgICAgICAgICAgICA8PCByZXM7CisgICAgICAgIGlmIChyZXMuaXNPaygpKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShxdWVyeVN0YXR1cyk7CisgICAgICAgIH0KKwogICAgICAgICAvLyBDYW4gd2UgbWFrZSByZXF1ZXN0cz8KICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgcmVxdWVzdFRlbXBsYXRlOwogICAgICAgICByZXMgPSBkZXZpY2UtPmNyZWF0ZURlZmF1bHRSZXF1ZXN0KC8qcHJldmlldyB0ZW1wbGF0ZSovMSwKZGlmZiAtLWdpdCBhL2NhbWVyYS90ZXN0cy9DYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uLmNwcCBiL2NhbWVyYS90ZXN0cy9DYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzVkMmEzCi0tLSAvZGV2L251bGwKKysrIGIvY2FtZXJhL3Rlc3RzL0NhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24uY3BwCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDYW1lcmFDaGFyYWN0ZXJpc3RpY3NQZXJtaXNzaW9uIgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhU2VydmljZS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTsKKworY2xhc3MgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbiA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHJvdGVjdGVkOgorCisgICAgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbigpIDogbnVtQ2FtZXJhcygwKXt9CisgICAgLy9HdGVzdCBpbnRlcmZhY2UKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlOworCisgICAgaW50MzJfdCBudW1DYW1lcmFzOworICAgIHNwPElDYW1lcmFTZXJ2aWNlPiBtQ2FtZXJhU2VydmljZTsKK307CisKK3ZvaWQgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbjo6U2V0VXAoKSB7CisgICAgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyByYzsKKyAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5jYW1lcmEiKSk7CisgICAgbUNhbWVyYVNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhU2VydmljZT4oYmluZGVyKTsKKyAgICByYyA9IG1DYW1lcmFTZXJ2aWNlLT5nZXROdW1iZXJPZkNhbWVyYXMoCisgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkNBTUVSQV9UWVBFX0FMTCwgJm51bUNhbWVyYXMpOworICAgIEVYUEVDVF9UUlVFKHJjLmlzT2soKSk7Cit9CisKK3ZvaWQgQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzUGVybWlzc2lvbjo6VGVhckRvd24oKSB7CisgICAgbUNhbWVyYVNlcnZpY2UuY2xlYXIoKTsKK30KKworLy8gUmV2b2tpbmcgYW5kIGFjcXVpcmluZyBwZXJtaXNzaW9ucyBhdXRvbWF0aWNhbGx5IG1pZ2h0IG5vdCBiZSBwb3NzaWJsZS4KKy8vIFRlc3QgdGhlIGZ1bmN0aW9uYWxpdHkgZm9yIHJlbW92YWwgb2YgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBuZWVkaW5nCisvLyBhIGNhbWVyYSBwZXJtaXNzaW9uLgorVEVTVF9GKENhbWVyYUNoYXJhY3RlcmlzdGljc1Blcm1pc3Npb24sIFRlc3RDYW1lcmFQZXJtaXNzaW9uKSB7CisgICAgZm9yIChpbnQzMl90IGNhbWVyYUlkID0gMDsgY2FtZXJhSWQgPCBudW1DYW1lcmFzOyBjYW1lcmFJZCsrKSB7CisKKyAgICAgICAgU3RyaW5nMTYgY2FtZXJhSWRTdHIgPSBTdHJpbmcxNihTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgY2FtZXJhSWQpKTsKKyAgICAgICAgYm9vbCBpc1N1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICBhdXRvIHJjID0gbUNhbWVyYVNlcnZpY2UtPnN1cHBvcnRzQ2FtZXJhQXBpKGNhbWVyYUlkU3RyLAorICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6QVBJX1ZFUlNJT05fMiwgJmlzU3VwcG9ydGVkKTsKKyAgICAgICAgRVhQRUNUX1RSVUUocmMuaXNPaygpKTsKKyAgICAgICAgaWYgKCFpc1N1cHBvcnRlZCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gdGFnc05lZWRpbmdQZXJtaXNzaW9uOworICAgICAgICByYyA9IG1DYW1lcmFTZXJ2aWNlLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY2FtZXJhSWRTdHIsICZtZXRhZGF0YSk7CisgICAgICAgIEFTU0VSVF9UUlVFKHJjLmlzT2soKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShtZXRhZGF0YS5pc0VtcHR5KCkpOworICAgICAgICBFWFBFQ1RfRVEobWV0YWRhdGEucmVtb3ZlUGVybWlzc2lvbkVudHJpZXMoQ0FNRVJBX01FVEFEQVRBX0lOVkFMSURfVkVORE9SX0lELAorICAgICAgICAgICAgICAgICAgICAmdGFnc05lZWRpbmdQZXJtaXNzaW9uKSwgTk9fRVJST1IpOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MgPQorICAgICAgICAgICAgICAgIG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUyk7CisgICAgICAgIEVYUEVDVF9UUlVFKDAgPCBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuY291bnQpOworCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBhdmFpbGFibGVLZXlzOworICAgICAgICBhdmFpbGFibGVLZXlzLnJlc2VydmUoYXZhaWxhYmxlQ2hhcmFjdGVyaXN0aWNzLmNvdW50KTsKKyAgICAgICAgYXZhaWxhYmxlS2V5cy5pbnNlcnQoYXZhaWxhYmxlS2V5cy5iZWdpbigpLCBhdmFpbGFibGVDaGFyYWN0ZXJpc3RpY3MuZGF0YS5pMzIsCisgICAgICAgICAgICAgICAgYXZhaWxhYmxlQ2hhcmFjdGVyaXN0aWNzLmRhdGEuaTMyICsgYXZhaWxhYmxlQ2hhcmFjdGVyaXN0aWNzLmNvdW50KTsKKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmtleSA6IHRhZ3NOZWVkaW5nUGVybWlzc2lvbikgeworICAgICAgICAgICAgQVNTRVJUX0ZBTFNFKG1ldGFkYXRhLmV4aXN0cyhrZXkpKTsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBzdGQ6OmZpbmQoYXZhaWxhYmxlS2V5cy5iZWdpbigpLCBhdmFpbGFibGVLZXlzLmVuZCgpLCBrZXkpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoaXQgPT0gYXZhaWxhYmxlS2V5cy5lbmQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CmRpZmYgLS1naXQgYS9jbWRzL3NjcmVlbnJlY29yZC9BbmRyb2lkLmJwIGIvY21kcy9zY3JlZW5yZWNvcmQvQW5kcm9pZC5icAppbmRleCA4NjQ3NmNkLi42YmRiYWIxIDEwMDY0NAotLS0gYS9jbWRzL3NjcmVlbnJlY29yZC9BbmRyb2lkLmJwCisrKyBiL2NtZHMvc2NyZWVucmVjb3JkL0FuZHJvaWQuYnAKQEAgLTI0LDYgKzI0LDEwIEBACiAgICAgICAgICJQcm9ncmFtLmNwcCIsCiAgICAgXSwKIAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYWRybV9oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImxpYm1lZGlhIiwKZGlmZiAtLWdpdCBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAgYi9jbWRzL3NjcmVlbnJlY29yZC9zY3JlZW5yZWNvcmQuY3BwCmluZGV4IGI3Mzk1MWYuLmYyYTcxYjMgMTAwNjQ0Ci0tLSBhL2NtZHMvc2NyZWVucmVjb3JkL3NjcmVlbnJlY29yZC5jcHAKKysrIGIvY21kcy9zY3JlZW5yZWNvcmQvc2NyZWVucmVjb3JkLmNwcApAQCAtNDgsMTAgKzQ4LDExIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUGVyc2lzdGVudFN1cmZhY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vSUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KIAogI2luY2x1ZGUgInNjcmVlbnJlY29yZC5oIgpAQCAtODMsOSArODQsOCBAQAogdXNpbmcgYW5kcm9pZDo6RElTUExBWV9PUklFTlRBVElPTl8wOwogdXNpbmcgYW5kcm9pZDo6RElTUExBWV9PUklFTlRBVElPTl8xODA7CiB1c2luZyBhbmRyb2lkOjpESVNQTEFZX09SSUVOVEFUSU9OXzkwOwotdXNpbmcgYW5kcm9pZDo6SU5GT19GT1JNQVRfQ0hBTkdFRDsKLXVzaW5nIGFuZHJvaWQ6OklORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRDsKIHVzaW5nIGFuZHJvaWQ6OklOVkFMSURfT1BFUkFUSU9OOwordXNpbmcgYW5kcm9pZDo6TkFNRV9OT1RfRk9VTkQ7CiB1c2luZyBhbmRyb2lkOjpOT19FUlJPUjsKIHVzaW5nIGFuZHJvaWQ6OlVOS05PV05fRVJST1I7CiAKQEAgLTEwMiw3ICsxMDIsNyBAQAogc3RhdGljIGJvb2wgZ01vbm90b25pY1RpbWUgPSBmYWxzZTsgICAgIC8vIHVzZSBzeXN0ZW0gbW9ub3RvbmljIHRpbWUgZm9yIHRpbWVzdGFtcHMKIHN0YXRpYyBib29sIGdQZXJzaXN0ZW50U3VyZmFjZSA9IGZhbHNlOyAvLyB1c2UgcGVyc2lzdGVudCBzdXJmYWNlCiBzdGF0aWMgZW51bSB7Ci0gICAgRk9STUFUX01QNCwgRk9STUFUX0gyNjQsIEZPUk1BVF9GUkFNRVMsIEZPUk1BVF9SQVdfRlJBTUVTCisgICAgRk9STUFUX01QNCwgRk9STUFUX0gyNjQsIEZPUk1BVF9XRUJNLCBGT1JNQVRfM0dQUCwgRk9STUFUX0ZSQU1FUywgRk9STUFUX1JBV19GUkFNRVMKIH0gZ091dHB1dEZvcm1hdCA9IEZPUk1BVF9NUDQ7ICAgICAgICAgICAvLyBkYXRhIGZvcm1hdCBmb3Igb3V0cHV0CiBzdGF0aWMgQVN0cmluZyBnQ29kZWNOYW1lID0gIiI7ICAgICAgICAgLy8gY29kZWMgbmFtZSBvdmVycmlkZQogc3RhdGljIGJvb2wgZ1NpemVTcGVjaWZpZWQgPSBmYWxzZTsgICAgIC8vIHdhcyBzaXplIGV4cGxpY2l0bHkgcmVxdWVzdGVkPwpAQCAtMTEyLDYgKzExMiw3IEBACiBzdGF0aWMgdWludDMyX3QgZ1ZpZGVvSGVpZ2h0ID0gMDsKIHN0YXRpYyB1aW50MzJfdCBnQml0UmF0ZSA9IDIwMDAwMDAwOyAgICAgLy8gMjBNYnBzCiBzdGF0aWMgdWludDMyX3QgZ1RpbWVMaW1pdFNlYyA9IGtNYXhUaW1lTGltaXRTZWM7CitzdGF0aWMgdWludDMyX3QgZ0JmcmFtZXMgPSAwOwogCiAvLyBTZXQgYnkgc2lnbmFsIGhhbmRsZXIgdG8gc3RvcCByZWNvcmRpbmcuCiBzdGF0aWMgdm9sYXRpbGUgYm9vbCBnU3RvcFJlcXVlc3RlZCA9IGZhbHNlOwpAQCAtMTgzLDE1ICsxODQsMjAgQEAKICAgICB9CiAKICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlOwotICAgIGZvcm1hdC0+c2V0SW50MzIoIndpZHRoIiwgZ1ZpZGVvV2lkdGgpOwotICAgIGZvcm1hdC0+c2V0SW50MzIoImhlaWdodCIsIGdWaWRlb0hlaWdodCk7Ci0gICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBrTWltZVR5cGVBdmMpOwotICAgIGZvcm1hdC0+c2V0SW50MzIoImNvbG9yLWZvcm1hdCIsIE9NWF9DT0xPUl9Gb3JtYXRBbmRyb2lkT3BhcXVlKTsKLSAgICBmb3JtYXQtPnNldEludDMyKCJiaXRyYXRlIiwgZ0JpdFJhdGUpOwotICAgIGZvcm1hdC0+c2V0RmxvYXQoImZyYW1lLXJhdGUiLCBkaXNwbGF5RnBzKTsKLSAgICBmb3JtYXQtPnNldEludDMyKCJpLWZyYW1lLWludGVydmFsIiwgMTApOworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX1dJRFRILCBnVmlkZW9XaWR0aCk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfSEVJR0hULCBnVmlkZW9IZWlnaHQpOworICAgIGZvcm1hdC0+c2V0U3RyaW5nKEtFWV9NSU1FLCBrTWltZVR5cGVBdmMpOworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX0ZPUk1BVCwgT01YX0NPTE9SX0Zvcm1hdEFuZHJvaWRPcGFxdWUpOworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX0JJVF9SQVRFLCBnQml0UmF0ZSk7CisgICAgZm9ybWF0LT5zZXRGbG9hdChLRVlfRlJBTUVfUkFURSwgZGlzcGxheUZwcyk7CisgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfSV9GUkFNRV9JTlRFUlZBTCwgMTApOworICAgIGZvcm1hdC0+c2V0SW50MzIoS0VZX01BWF9CX0ZSQU1FUywgZ0JmcmFtZXMpOworICAgIGlmIChnQmZyYW1lcyA+IDApIHsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMihLRVlfUFJPRklMRSwgQVZDUHJvZmlsZU1haW4pOworICAgICAgICBmb3JtYXQtPnNldEludDMyKEtFWV9MRVZFTCwgQVZDTGV2ZWw0MSk7CisgICAgfQogCi0gICAgc3A8QUxvb3Blcj4gbG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgc3A8YW5kcm9pZDo6QUxvb3Blcj4gbG9vcGVyID0gbmV3IGFuZHJvaWQ6OkFMb29wZXI7CiAgICAgbG9vcGVyLT5zZXROYW1lKCJzY3JlZW5yZWNvcmRfbG9vcGVyIik7CiAgICAgbG9vcGVyLT5zdGFydCgpOwogICAgIEFMT0dWKCJDcmVhdGluZyBjb2RlYyIpOwpAQCAtMjY0LDEwICsyNzAsMTAgQEAKIAogICAgIC8vIFNldCB0aGUgcmVnaW9uIG9mIHRoZSBsYXllciBzdGFjayB3ZSdyZSBpbnRlcmVzdGVkIGluLCB3aGljaCBpbiBvdXIKICAgICAvLyBjYXNlIGlzICJhbGwgb2YgaXQiLgotICAgIFJlY3QgbGF5ZXJTdGFja1JlY3QobWFpbkRweUluZm8udywgbWFpbkRweUluZm8uaCk7CisgICAgUmVjdCBsYXllclN0YWNrUmVjdChtYWluRHB5SW5mby52aWV3cG9ydFcsIG1haW5EcHlJbmZvLnZpZXdwb3J0SCk7CiAKICAgICAvLyBXZSBuZWVkIHRvIHByZXNlcnZlIHRoZSBhc3BlY3QgcmF0aW8gb2YgdGhlIGRpc3BsYXkuCi0gICAgZmxvYXQgZGlzcGxheUFzcGVjdCA9IChmbG9hdCkgbWFpbkRweUluZm8uaCAvIChmbG9hdCkgbWFpbkRweUluZm8udzsKKyAgICBmbG9hdCBkaXNwbGF5QXNwZWN0ID0gKGZsb2F0KSBtYWluRHB5SW5mby52aWV3cG9ydEggLyAoZmxvYXQpIG1haW5EcHlJbmZvLnZpZXdwb3J0VzsKIAogCiAgICAgLy8gU2V0IHRoZSB3YXkgd2UgbWFwIHRoZSBvdXRwdXQgb250byB0aGUgZGlzcGxheSBzdXJmYWNlICh3aGljaCB3aWxsCkBAIC0zNDQsMjIgKzM1MCw2IEBACiB9CiAKIC8qCi0gKiBTZXQgdGhlIG1haW4gZGlzcGxheSB3aWR0aCBhbmQgaGVpZ2h0IHRvIHRoZSBhY3R1YWwgd2lkdGggYW5kIGhlaWdodAotICovCi1zdGF0aWMgc3RhdHVzX3QgZ2V0QWN0dWFsRGlzcGxheVNpemUoY29uc3Qgc3A8SUJpbmRlcj4mIG1haW5EcHksIERpc3BsYXlJbmZvKiBtYWluRHB5SW5mbykgewotICAgIFJlY3Qgdmlld3BvcnQ7Ci0gICAgc3RhdHVzX3QgZXJyID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5Vmlld3BvcnQobWFpbkRweSwgJnZpZXdwb3J0KTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IHVuYWJsZSB0byBnZXQgZGlzcGxheSB2aWV3cG9ydFxuIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotICAgIG1haW5EcHlJbmZvLT53ID0gdmlld3BvcnQud2lkdGgoKTsKLSAgICBtYWluRHB5SW5mby0+aCA9IHZpZXdwb3J0LmhlaWdodCgpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKgogICogUnVucyB0aGUgTWVkaWFDb2RlYyBlbmNvZGVyLCBzZW5kaW5nIHRoZSBvdXRwdXQgdG8gdGhlIE1lZGlhTXV4ZXIuICBUaGUKICAqIGlucHV0IGZyYW1lcyBhcmUgY29taW5nIGZyb20gdGhlIHZpcnR1YWwgZGlzcGxheSBhcyBmYXN0IGFzIFN1cmZhY2VGbGluZ2VyCiAgKiB3YW50cyB0byBzZW5kIHRoZW0uCkBAIC0zNzgsNiArMzY4LDcgQEAKICAgICBpbnQ2NF90IHN0YXJ0V2hlbk5zZWMgPSBzeXN0ZW1UaW1lKENMT0NLX01PTk9UT05JQyk7CiAgICAgaW50NjRfdCBlbmRXaGVuTnNlYyA9IHN0YXJ0V2hlbk5zZWMgKyBzZWNvbmRzX3RvX25hbm9zZWNvbmRzKGdUaW1lTGltaXRTZWMpOwogICAgIERpc3BsYXlJbmZvIG1haW5EcHlJbmZvOworICAgIGJvb2wgZmlyc3RGcmFtZSA9IHRydWU7CiAKICAgICBhc3NlcnQoKHJhd0ZwID09IE5VTEwgJiYgbXV4ZXIgIT0gTlVMTCkgfHwgKHJhd0ZwICE9IE5VTEwgJiYgbXV4ZXIgPT0gTlVMTCkpOwogCkBAIC0zOTQsNiArMzg1LDExIEBACiAgICAgICAgIGludDY0X3QgcHRzVXNlYzsKICAgICAgICAgdWludDMyX3QgZmxhZ3M7CiAKKyAgICAgICAgaWYgKGZpcnN0RnJhbWUpIHsKKyAgICAgICAgICAgIEFUUkFDRV9OQU1FKCJmaXJzdF9mcmFtZSIpOworICAgICAgICAgICAgZmlyc3RGcmFtZSA9IGZhbHNlOworICAgICAgICB9CisKICAgICAgICAgaWYgKHN5c3RlbVRpbWUoQ0xPQ0tfTU9OT1RPTklDKSA+IGVuZFdoZW5Oc2VjKSB7CiAgICAgICAgICAgICBpZiAoZ1ZlcmJvc2UpIHsKICAgICAgICAgICAgICAgICBwcmludGYoIlRpbWUgbGltaXQgcmVhY2hlZFxuIik7CkBAIC00MjksMjIgKzQyNSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAvLyB1c2VmdWwgc3R1ZmYgaXMgaGFyZCB0byBnZXQgYXQgd2l0aG91dCBhIERhbHZpayBWTS4KICAgICAgICAgICAgICAgICAgICAgZXJyID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhtYWluRHB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYWluRHB5SW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IGdldEFjdHVhbERpc3BsYXlTaXplKG1haW5EcHksICZtYWluRHB5SW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogdW5hYmxlIHRvIHNldCBhY3R1YWwgZGlzcGxheSBzaXplXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAob3JpZW50YXRpb24gIT0gbWFpbkRweUluZm8ub3JpZW50YXRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgib3JpZW50YXRpb24gY2hhbmdlZCwgbm93ICVkIiwgbWFpbkRweUluZm8ub3JpZW50YXRpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6VHJhbnNhY3Rpb24gdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXREaXNwbGF5UHJvamVjdGlvbih0LCB2aXJ0dWFsRHB5LCBtYWluRHB5SW5mbyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC5hcHBseSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gbWFpbkRweUluZm8ub3JpZW50YXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJnZXREaXNwbGF5SW5mbyhtYWluKSBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChvcmllbnRhdGlvbiAhPSBtYWluRHB5SW5mby5vcmllbnRhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm9yaWVudGF0aW9uIGNoYW5nZWQsIG5vdyAlZCIsIG1haW5EcHlJbmZvLm9yaWVudGF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN1cmZhY2VDb21wb3NlckNsaWVudDo6VHJhbnNhY3Rpb24gdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNldERpc3BsYXlQcm9qZWN0aW9uKHQsIHZpcnR1YWxEcHksIG1haW5EcHlJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQuYXBwbHkoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9yaWVudGF0aW9uID0gbWFpbkRweUluZm8ub3JpZW50YXRpb247CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKQEAgLTUwMSw3ICs0ODksNyBAQAogICAgICAgICBjYXNlIC1FQUdBSU46ICAgICAgICAgICAgICAgICAgICAgICAvLyBJTkZPX1RSWV9BR0FJTl9MQVRFUgogICAgICAgICAgICAgQUxPR1YoIkdvdCAtRUFHQUlOLCBsb29waW5nIik7CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJTkZPX0ZPUk1BVF9DSEFOR0VEOiAgICAgICAgICAgLy8gSU5GT19PVVRQVVRfRk9STUFUX0NIQU5HRUQKKyAgICAgICAgY2FzZSBhbmRyb2lkOjpJTkZPX0ZPUk1BVF9DSEFOR0VEOiAgICAvLyBJTkZPX09VVFBVVF9GT1JNQVRfQ0hBTkdFRAogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8vIEZvcm1hdCBpbmNsdWRlcyBDU0QsIHdoaWNoIHdlIG11c3QgcHJvdmlkZSB0byBtdXhlci4KICAgICAgICAgICAgICAgICBBTE9HVigiRW5jb2RlciBmb3JtYXQgY2hhbmdlZCIpOwpAQCAtNTE4LDcgKzUwNiw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEOiAgIC8vIElORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRAorICAgICAgICBjYXNlIGFuZHJvaWQ6OklORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRDogICAvLyBJTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQKICAgICAgICAgICAgIC8vIE5vdCBleHBlY3RlZCBmb3IgYW4gZW5jb2RlcjsgaGFuZGxlIGl0IGFueXdheS4KICAgICAgICAgICAgIEFMT0dWKCJFbmNvZGVyIGJ1ZmZlcnMgY2hhbmdlZCIpOwogICAgICAgICAgICAgZXJyID0gZW5jb2Rlci0+Z2V0T3V0cHV0QnVmZmVycygmYnVmZmVycyk7CkBAIC02MDksOCArNTk3LDEyIEBACiAgICAgc2VsZi0+c3RhcnRUaHJlYWRQb29sKCk7CiAKICAgICAvLyBHZXQgbWFpbiBkaXNwbGF5IHBhcmFtZXRlcnMuCi0gICAgc3A8SUJpbmRlcj4gbWFpbkRweSA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0QnVpbHRJbkRpc3BsYXkoCi0gICAgICAgICAgICBJU3VyZmFjZUNvbXBvc2VyOjplRGlzcGxheUlkTWFpbik7CisgICAgY29uc3Qgc3A8SUJpbmRlcj4gbWFpbkRweSA9IFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0SW50ZXJuYWxEaXNwbGF5VG9rZW4oKTsKKyAgICBpZiAobWFpbkRweSA9PSBudWxscHRyKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IG5vIGRpc3BsYXlcbiIpOworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCiAgICAgRGlzcGxheUluZm8gbWFpbkRweUluZm87CiAgICAgZXJyID0gU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhtYWluRHB5LCAmbWFpbkRweUluZm8pOwogICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKQEAgLTYxOCwyNSArNjEwLDE5IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgZXJyID0gZ2V0QWN0dWFsRGlzcGxheVNpemUobWFpbkRweSwgJm1haW5EcHlJbmZvKTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IHVuYWJsZSB0byBzZXQgYWN0dWFsIGRpc3BsYXkgc2l6ZVxuIik7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCiAgICAgaWYgKGdWZXJib3NlKSB7CiAgICAgICAgIHByaW50ZigiTWFpbiBkaXNwbGF5IGlzICVkeCVkIEAlLjJmZnBzIChvcmllbnRhdGlvbj0ldSlcbiIsCi0gICAgICAgICAgICAgICAgbWFpbkRweUluZm8udywgbWFpbkRweUluZm8uaCwgbWFpbkRweUluZm8uZnBzLAorICAgICAgICAgICAgICAgIG1haW5EcHlJbmZvLnZpZXdwb3J0VywgbWFpbkRweUluZm8udmlld3BvcnRILCBtYWluRHB5SW5mby5mcHMsCiAgICAgICAgICAgICAgICAgbWFpbkRweUluZm8ub3JpZW50YXRpb24pOwogICAgICAgICBmZmx1c2goc3Rkb3V0KTsKICAgICB9CiAKICAgICAvLyBFbmNvZGVyIGNhbid0IHRha2Ugb2RkIG51bWJlciBhcyBjb25maWcKICAgICBpZiAoZ1ZpZGVvV2lkdGggPT0gMCkgewotICAgICAgICBnVmlkZW9XaWR0aCA9IGZsb29yVG9FdmVuKG1haW5EcHlJbmZvLncpOworICAgICAgICBnVmlkZW9XaWR0aCA9IGZsb29yVG9FdmVuKG1haW5EcHlJbmZvLnZpZXdwb3J0Vyk7CiAgICAgfQogICAgIGlmIChnVmlkZW9IZWlnaHQgPT0gMCkgewotICAgICAgICBnVmlkZW9IZWlnaHQgPSBmbG9vclRvRXZlbihtYWluRHB5SW5mby5oKTsKKyAgICAgICAgZ1ZpZGVvSGVpZ2h0ID0gZmxvb3JUb0V2ZW4obWFpbkRweUluZm8udmlld3BvcnRIKTsKICAgICB9CiAKICAgICAvLyBDb25maWd1cmUgYW5kIHN0YXJ0IHRoZSBlbmNvZGVyLgpAQCAtNzE0LDcgKzcwMCw5IEBACiAgICAgc3A8TWVkaWFNdXhlcj4gbXV4ZXIgPSBOVUxMOwogICAgIEZJTEUqIHJhd0ZwID0gTlVMTDsKICAgICBzd2l0Y2ggKGdPdXRwdXRGb3JtYXQpIHsKLSAgICAgICAgY2FzZSBGT1JNQVRfTVA0OiB7CisgICAgICAgIGNhc2UgRk9STUFUX01QNDoKKyAgICAgICAgY2FzZSBGT1JNQVRfV0VCTToKKyAgICAgICAgY2FzZSBGT1JNQVRfM0dQUDogewogICAgICAgICAgICAgLy8gQ29uZmlndXJlIG11eGVyLiAgV2UgaGF2ZSB0byB3YWl0IGZvciB0aGUgQ1NEIGJsb2IgZnJvbSB0aGUgZW5jb2RlcgogICAgICAgICAgICAgLy8gYmVmb3JlIHdlIGNhbiBzdGFydCBpdC4KICAgICAgICAgICAgIGVyciA9IHVubGluayhmaWxlTmFtZSk7CkBAIC03MjcsNyArNzE1LDEzIEBACiAgICAgICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJFUlJPUjogY291bGRuJ3Qgb3BlbiBmaWxlXG4iKTsKICAgICAgICAgICAgICAgICBhYm9ydCgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbXV4ZXIgPSBuZXcgTWVkaWFNdXhlcihmZCwgTWVkaWFNdXhlcjo6T1VUUFVUX0ZPUk1BVF9NUEVHXzQpOworICAgICAgICAgICAgaWYgKGdPdXRwdXRGb3JtYXQgPT0gRk9STUFUX01QNCkgeworICAgICAgICAgICAgICAgIG11eGVyID0gbmV3IE1lZGlhTXV4ZXIoZmQsIE1lZGlhTXV4ZXI6Ok9VVFBVVF9GT1JNQVRfTVBFR180KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoZ091dHB1dEZvcm1hdCA9PSBGT1JNQVRfV0VCTSkgeworICAgICAgICAgICAgICAgIG11eGVyID0gbmV3IE1lZGlhTXV4ZXIoZmQsIE1lZGlhTXV4ZXI6Ok9VVFBVVF9GT1JNQVRfV0VCTSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG11eGVyID0gbmV3IE1lZGlhTXV4ZXIoZmQsIE1lZGlhTXV4ZXI6Ok9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGNsb3NlKGZkKTsKICAgICAgICAgICAgIGlmIChnUm90YXRlKSB7CiAgICAgICAgICAgICAgICAgbXV4ZXItPnNldE9yaWVudGF0aW9uSGludCg5MCk7ICAvLyBUT0RPOiBkb2VzIHRoaXMgZG8gYW55dGhpbmc/CkBAIC05NzcsNiArOTcxLDcgQEAKICAgICAgICAgeyAiY29kZWMtbmFtZSIsICAgICAgICAgcmVxdWlyZWRfYXJndW1lbnQsICBOVUxMLCAnTicgfSwKICAgICAgICAgeyAibW9ub3RvbmljLXRpbWUiLCAgICAgbm9fYXJndW1lbnQsICAgICAgICBOVUxMLCAnbScgfSwKICAgICAgICAgeyAicGVyc2lzdGVudC1zdXJmYWNlIiwgbm9fYXJndW1lbnQsICAgICAgICBOVUxMLCAncCcgfSwKKyAgICAgICAgeyAiYmZyYW1lcyIsICAgICAgICAgICAgcmVxdWlyZWRfYXJndW1lbnQsICBOVUxMLCAnQicgfSwKICAgICAgICAgeyBOVUxMLCAgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICBOVUxMLCAwIH0KICAgICB9OwogCkBAIC0xMDQ3LDYgKzEwNDIsMTAgQEAKICAgICAgICAgICAgICAgICBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUX01QNDsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgImgyNjQiKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgZ091dHB1dEZvcm1hdCA9IEZPUk1BVF9IMjY0OworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAob3B0YXJnLCAid2VibSIpID09IDApIHsKKyAgICAgICAgICAgICAgICBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUX1dFQk07CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChvcHRhcmcsICIzZ3BwIikgPT0gMCkgeworICAgICAgICAgICAgICAgIGdPdXRwdXRGb3JtYXQgPSBGT1JNQVRfM0dQUDsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgImZyYW1lcyIpID09IDApIHsKICAgICAgICAgICAgICAgICBnT3V0cHV0Rm9ybWF0ID0gRk9STUFUX0ZSQU1FUzsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG9wdGFyZywgInJhdy1mcmFtZXMiKSA9PSAwKSB7CkBAIC0xMDY1LDYgKzEwNjQsMTEgQEAKICAgICAgICAgY2FzZSAncCc6CiAgICAgICAgICAgICBnUGVyc2lzdGVudFN1cmZhY2UgPSB0cnVlOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgaWYgKHBhcnNlVmFsdWVXaXRoVW5pdChvcHRhcmcsICZnQmZyYW1lcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaWYgKGljICE9ICc/JykgewogICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZ2V0b3B0X2xvbmcgcmV0dXJuZWQgdW5leHBlY3RlZCB2YWx1ZSAweCV4XG4iLCBpYyk7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsgYi9jbWRzL3N0YWdlZnJpZ2h0L0FuZHJvaWQubWsKaW5kZXggMTY0YjMxMy4uN2I0NDdkMyAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9BbmRyb2lkLm1rCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvQW5kcm9pZC5tawpAQCAtMywxNCArMywxNSBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgIFwKKyAgICAgICAgQXVkaW9QbGF5ZXIuY3BwIFwKICAgICAgICAgc3RhZ2VmcmlnaHQuY3BwIFwKICAgICAgICAganBlZy5jcHAgICAgICAgIFwKICAgICAgICAgU2luZVNvdXJjZS5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYm1lZGlhX29teCBsaWJtZWRpYWV4dHJhY3RvciBsaWJ1dGlscyBsaWJiaW5kZXIgXAorICAgICAgICBsaWJzdGFnZWZyaWdodCBsaWJtZWRpYSBsaWJtZWRpYV9jb2RlY2xpc3QgbGlidXRpbHMgbGliYmluZGVyIFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJqcGVnIGxpYnVpIGxpYmd1aSBsaWJjdXRpbHMgbGlibG9nIFwKLSAgICAgICAgbGliaGlkbGJhc2UgXAorICAgICAgICBsaWJoaWRsYmFzZSBsaWJkYXRhc291cmNlIGxpYmF1ZGlvY2xpZW50IFwKICAgICAgICAgYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIFwKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKQEAgLTIyLDYgKzIzLDcgQEAKIAogTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKIAorTE9DQUxfU1lTVEVNX0VYVF9NT0RVTEU6PSB0cnVlCiBMT0NBTF9NT0RVTEU6PSBzdGFnZWZyaWdodAogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKQEAgLTMxLDE0ICszMywxNiBAQAogaW5jbHVkZSAkKENMRUFSX1ZBUlMpCiAKIExPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgXAorICAgICAgICBBdWRpb1BsYXllci5jcHAgXAogICAgICAgICBTaW5lU291cmNlLmNwcCAgICBcCiAgICAgICAgIHJlY29yZC5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYm1lZGlhZXh0cmFjdG9yIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAotICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYmRhdGFzb3VyY2UgbGliYXVkaW9jbGllbnQKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKKyAgICAgICAgZnJhbWV3b3Jrcy9hdi9jYW1lcmEvaW5jbHVkZSBcCiAgICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXAogICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXggXAogICAgICAgICBmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlCkBAIC01NiwxMiArNjAsMTIgQEAKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogCiBMT0NBTF9TUkNfRklMRVM6PSAgICAgICAgIFwKLSAgICAgICAgU2luZVNvdXJjZS5jcHAgICAgXAorICAgICAgICBBdWRpb1BsYXllci5jcHAgXAogICAgICAgICByZWNvcmR2aWRlby5jcHAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYm1lZGlhZXh0cmFjdG9yIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAotICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYm1lZGlhIGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgXAorICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIGxpYmF1ZGlvY2xpZW50CiAKIExPQ0FMX0NfSU5DTFVERVM6PSBcCiAgICAgICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQgXApAQCAtODIsMTIgKzg2LDEzIEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICBcCisgICAgICAgIEF1ZGlvUGxheWVyLmNwcCBcCiAgICAgICAgIFNpbmVTb3VyY2UuY3BwICAgIFwKICAgICAgICAgYXVkaW9sb29wLmNwcAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibWVkaWFleHRyYWN0b3IgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBcCi0gICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24KKyAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibWVkaWEgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBcCisgICAgICAgIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGliYXVkaW9jbGllbnQKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKICAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCkBAIC0xMTAsNyArMTE1LDcgQEAKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0IGxpYmxvZyBsaWJ1dGlscyBsaWJiaW5kZXIgbGlidWkgbGliZ3VpIFwKLSAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJtZWRpYSBsaWJjdXRpbHMgbGlibWVkaWFleHRyYWN0b3IKKyAgICAgICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBsaWJtZWRpYSBsaWJjdXRpbHMgbGliZGF0YXNvdXJjZQogCiBMT0NBTF9DX0lOQ0xVREVTOj0gXAogICAgICAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IFwKQEAgLTEzMiw2ICsxMzcsOSBAQAogICAgICAgICBjb2RlYy5jcHAgICAgICAgICAgICAgICBcCiAgICAgICAgIFNpbXBsZVBsYXllci5jcHAgICAgICAgIFwKIAorTE9DQUxfSEVBREVSX0xJQlJBUklFUyA6PSBcCisgICAgICAgIGxpYm1lZGlhZHJtX2hlYWRlcnMgXAorCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKICAgICAgICAgbGlibWVkaWEgbGlibWVkaWFfb214IGxpYmF1ZGlvY2xpZW50IGxpYnVpIGxpYmd1aSBsaWJjdXRpbHMKQEAgLTE1MywyMiArMTYxLDIzIEBACiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAogTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgICAgICBmaWx0ZXJzL2FyZ2J0b3JnYmEucnMgXAotICAgICAgICBmaWx0ZXJzL25pZ2h0dmlzaW9uLnJzIFwKLSAgICAgICAgZmlsdGVycy9zYXR1cmF0aW9uLnJzIFwKKyAgICAgICAgZmlsdGVycy9hcmdidG9yZ2JhLnJzY3JpcHQgXAorICAgICAgICBmaWx0ZXJzL25pZ2h0dmlzaW9uLnJzY3JpcHQgXAorICAgICAgICBmaWx0ZXJzL3NhdHVyYXRpb24ucnNjcmlwdCBcCiAgICAgICAgIG1lZGlhZmlsdGVyLmNwcCBcCiAKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAorICAgICAgICBsaWJtZWRpYWRybV9oZWFkZXJzIFwKKwogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCiAgICAgICAgIGxpYnN0YWdlZnJpZ2h0IFwKICAgICAgICAgbGlibG9nIFwKICAgICAgICAgbGlidXRpbHMgXAogICAgICAgICBsaWJiaW5kZXIgXAogICAgICAgICBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICAgICAgbGlibWVkaWEgXAogICAgICAgICBsaWJtZWRpYV9vbXggXAogICAgICAgICBsaWJ1aSBcCiAgICAgICAgIGxpYmd1aSBcCi0gICAgICAgIGxpYmN1dGlscyBcCiAgICAgICAgIGxpYlJTY3BwIFwKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKQEAgLTIwMiw3ICsyMTEsNyBAQAogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKICAgICAgICAgbGlic3RhZ2VmcmlnaHQgbGlibG9nIGxpYnV0aWxzIGxpYmJpbmRlciBsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLSAgICAgICAgbGliY3V0aWxzIGxpYmMgbGlibWVkaWFleHRyYWN0b3IKKyAgICAgICAgbGliY3V0aWxzIGxpYmMKIAogTE9DQUxfQ19JTkNMVURFUzo9IFwKICAgICAgICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCBcCmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcCBiL2NtZHMvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwODcxM2QKLS0tIC9kZXYvbnVsbAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcApAQCAtMCwwICsxLDY4OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUGxheWVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQXVkaW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb2t1cC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCisjaW5jbHVkZSAiQXVkaW9QbGF5ZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBdWRpb1BsYXllcjo6QXVkaW9QbGF5ZXIoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiAmYXVkaW9TaW5rLAorICAgICAgICB1aW50MzJfdCBmbGFncykKKyAgICA6IG1JbnB1dEJ1ZmZlcihOVUxMKSwKKyAgICAgIG1TYW1wbGVSYXRlKDApLAorICAgICAgbUxhdGVuY3lVcygwKSwKKyAgICAgIG1GcmFtZVNpemUoMCksCisgICAgICBtTnVtRnJhbWVzUGxheWVkKDApLAorICAgICAgbU51bUZyYW1lc1BsYXllZFN5c1RpbWVVcyhBTG9vcGVyOjpHZXROb3dVcygpKSwKKyAgICAgIG1Qb3NpdGlvblRpbWVNZWRpYVVzKC0xKSwKKyAgICAgIG1Qb3NpdGlvblRpbWVSZWFsVXMoLTEpLAorICAgICAgbVNlZWtpbmcoZmFsc2UpLAorICAgICAgbVJlYWNoZWRFT1MoZmFsc2UpLAorICAgICAgbUZpbmFsU3RhdHVzKE9LKSwKKyAgICAgIG1TZWVrVGltZVVzKDApLAorICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAorICAgICAgbUlzRmlyc3RCdWZmZXIoZmFsc2UpLAorICAgICAgbUZpcnN0QnVmZmVyUmVzdWx0KE9LKSwKKyAgICAgIG1GaXJzdEJ1ZmZlcihOVUxMKSwKKyAgICAgIG1BdWRpb1NpbmsoYXVkaW9TaW5rKSwKKyAgICAgIG1QbGF5aW5nKGZhbHNlKSwKKyAgICAgIG1TdGFydFBvc1VzKDApLAorICAgICAgbUNyZWF0ZUZsYWdzKGZsYWdzKSB7Cit9CisKK0F1ZGlvUGxheWVyOjp+QXVkaW9QbGF5ZXIoKSB7CisgICAgaWYgKG1TdGFydGVkKSB7CisgICAgICAgIHJlc2V0KCk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvUGxheWVyOjpzZXRTb3VyY2UoY29uc3Qgc3A8TWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBDSEVDSyhtU291cmNlID09IE5VTEwpOworICAgIG1Tb3VyY2UgPSBzb3VyY2U7Cit9CisKK0FMb29rdXA8YXVkaW9fZm9ybWF0X3QsIGludDMyX3Q+IHNBdWRpb0Zvcm1hdFRvUGNtRW5jb2RpbmcgeworICAgIHsKKyAgICAgICAgeyBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCB9LAorICAgICAgICB7IEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQsICBrQXVkaW9FbmNvZGluZ1BjbThiaXQgIH0sCisgICAgICAgIHsgQVVESU9fRk9STUFUX1BDTV9GTE9BVCwgIGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgfSwKKyAgICB9Cit9OworCitzdGF0dXNfdCBBdWRpb1BsYXllcjo6c3RhcnQoYm9vbCBzb3VyY2VBbHJlYWR5U3RhcnRlZCkgeworICAgIENIRUNLKCFtU3RhcnRlZCk7CisgICAgQ0hFQ0sobVNvdXJjZSAhPSBOVUxMKTsKKworICAgIHN0YXR1c190IGVycjsKKyAgICBpZiAoIXNvdXJjZUFscmVhZHlTdGFydGVkKSB7CisgICAgICAgIGVyciA9IG1Tb3VyY2UtPnN0YXJ0KCk7CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFdlIGFsbG93IGFuIG9wdGlvbmFsIElORk9fRk9STUFUX0NIQU5HRUQgYXQgdGhlIHZlcnkgYmVnaW5uaW5nCisgICAgLy8gb2YgcGxheWJhY2ssIGlmIHRoZXJlIGlzIG9uZSwgZ2V0Rm9ybWF0IGJlbG93IHdpbGwgcmV0cmlldmUgdGhlCisgICAgLy8gdXBkYXRlZCBmb3JtYXQsIGlmIHRoZXJlIGlzbid0LCB3ZSdsbCBzdGFzaCBhd2F5IHRoZSB2YWxpZCBidWZmZXIKKyAgICAvLyBvZiBkYXRhIHRvIGJlIHVzZWQgb24gdGhlIGZpcnN0IGF1ZGlvIGNhbGxiYWNrLgorCisgICAgQ0hFQ0sobUZpcnN0QnVmZmVyID09IE5VTEwpOworCisgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7CisgICAgaWYgKG1TZWVraW5nKSB7CisgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKG1TZWVrVGltZVVzKTsKKyAgICAgICAgbVNlZWtpbmcgPSBmYWxzZTsKKyAgICB9CisKKyAgICBtRmlyc3RCdWZmZXJSZXN1bHQgPSBtU291cmNlLT5yZWFkKCZtRmlyc3RCdWZmZXIsICZvcHRpb25zKTsKKyAgICBpZiAobUZpcnN0QnVmZmVyUmVzdWx0ID09IElORk9fRk9STUFUX0NIQU5HRUQpIHsKKyAgICAgICAgQUxPR1YoIklORk9fRk9STUFUX0NIQU5HRUQhISEiKTsKKworICAgICAgICBDSEVDSyhtRmlyc3RCdWZmZXIgPT0gTlVMTCk7CisgICAgICAgIG1GaXJzdEJ1ZmZlclJlc3VsdCA9IE9LOworICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IGZhbHNlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jc0ZpcnN0QnVmZmVyID0gdHJ1ZTsKKyAgICB9CisKKyAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisKKyAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIk5vIG1ldGFkYXRhIGIvMTE4NjIwODcxIik7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTE4NjIwODcxIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBib29sIHN1Y2Nlc3MgPSBmb3JtYXQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOworICAgIENIRUNLKHN1Y2Nlc3MpOworICAgIENIRUNLKHVzZU9mZmxvYWQoKSB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpKTsKKworICAgIHN1Y2Nlc3MgPSBmb3JtYXQtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJm1TYW1wbGVSYXRlKTsKKyAgICBDSEVDSyhzdWNjZXNzKTsKKworICAgIGludDMyX3QgbnVtQ2hhbm5lbHMsIGNoYW5uZWxNYXNrOworICAgIHN1Y2Nlc3MgPSBmb3JtYXQtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbnVtQ2hhbm5lbHMpOworICAgIENIRUNLKHN1Y2Nlc3MpOworCisgICAgaWYoIWZvcm1hdC0+ZmluZEludDMyKGtLZXlDaGFubmVsTWFzaywgJmNoYW5uZWxNYXNrKSkgeworICAgICAgICAvLyBsb2cgb25seSB3aGVuIHRoZXJlJ3MgYSByaXNrIG9mIGFtYmlndWl0eSBvZiBjaGFubmVsIG1hc2sgc2VsZWN0aW9uCisgICAgICAgIEFMT0dJX0lGKG51bUNoYW5uZWxzID4gMiwKKyAgICAgICAgICAgICAgICAic291cmNlIGZvcm1hdCBkaWRuJ3Qgc3BlY2lmeSBjaGFubmVsIG1hc2ssIHVzaW5nICglZCkgY2hhbm5lbCBvcmRlciIsIG51bUNoYW5uZWxzKTsKKyAgICAgICAgY2hhbm5lbE1hc2sgPSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVI7CisgICAgfQorCisgICAgYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBpbnQzMl90IHBjbUVuY29kaW5nOworICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMihrS2V5UGNtRW5jb2RpbmcsICZwY21FbmNvZGluZykpIHsKKyAgICAgICAgc0F1ZGlvRm9ybWF0VG9QY21FbmNvZGluZy5tYXAocGNtRW5jb2RpbmcsICZhdWRpb0Zvcm1hdCk7CisgICAgfQorCisgICAgaWYgKHVzZU9mZmxvYWQoKSkgeworICAgICAgICBpZiAobWFwTWltZVRvQXVkaW9Gb3JtYXQoYXVkaW9Gb3JtYXQsIG1pbWUpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiQ291bGRuJ3QgbWFwIG1pbWUgdHlwZSBcIiVzXCIgdG8gYSB2YWxpZCBBdWRpb1N5c3RlbTo6YXVkaW9fZm9ybWF0IiwgbWltZSk7CisgICAgICAgICAgICBhdWRpb0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIk1pbWUgdHlwZSBcIiVzXCIgbWFwcGVkIHRvIGF1ZGlvX2Zvcm1hdCAweCV4IiwgbWltZSwgYXVkaW9Gb3JtYXQpOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBhYWNhb3QgPSAtMTsKKyAgICAgICAgaWYgKChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfQUFDKSAmJiBmb3JtYXQtPmZpbmRJbnQzMihrS2V5QUFDQU9ULCAmYWFjYW90KSkgeworICAgICAgICAgICAgLy8gUmVkZWZpbmUgQUFDIGZvcm1hdCBjb3Jyb3Nwb25kaW5nIHRvIGFhYyBwcm9maWxlCisgICAgICAgICAgICBtYXBBQUNQcm9maWxlVG9BdWRpb0Zvcm1hdChhdWRpb0Zvcm1hdCwoT01YX0FVRElPX0FBQ1BST0ZJTEVUWVBFKSBhYWNhb3QpOworICAgICAgICB9CisgICAgfQorCisgICAgaW50IGF2Z0JpdFJhdGUgPSAtMTsKKyAgICBmb3JtYXQtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmF2Z0JpdFJhdGUpOworCisgICAgaWYgKG1BdWRpb1NpbmsuZ2V0KCkgIT0gTlVMTCkgeworCisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKKyAgICAgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3Qgb2ZmbG9hZEluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOworCisgICAgICAgIGlmIChhbGxvd0RlZXBCdWZmZXJpbmcoKSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gQVVESU9fT1VUUFVUX0ZMQUdfREVFUF9CVUZGRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHVzZU9mZmxvYWQoKSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRDsKKworICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOworICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPSBkdXJhdGlvblVzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBvZmZsb2FkSW5mby5kdXJhdGlvbl91cyA9IC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBvZmZsb2FkSW5mby5zYW1wbGVfcmF0ZSA9IG1TYW1wbGVSYXRlOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CisgICAgICAgICAgICBvZmZsb2FkSW5mby5mb3JtYXQgPSBhdWRpb0Zvcm1hdDsKKyAgICAgICAgICAgIG9mZmxvYWRJbmZvLnN0cmVhbV90eXBlID0gQVVESU9fU1RSRUFNX01VU0lDOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uYml0X3JhdGUgPSBhdmdCaXRSYXRlOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uaGFzX3ZpZGVvID0gKChtQ3JlYXRlRmxhZ3MgJiBIQVNfVklERU8pICE9IDApOworICAgICAgICAgICAgb2ZmbG9hZEluZm8uaXNfc3RyZWFtaW5nID0gKChtQ3JlYXRlRmxhZ3MgJiBJU19TVFJFQU1JTkcpICE9IDApOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvU2luay0+b3BlbigKKyAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMsIGNoYW5uZWxNYXNrLCBhdWRpb0Zvcm1hdCwKKyAgICAgICAgICAgICAgICBERUZBVUxUX0FVRElPU0lOS19CVUZGRVJDT1VOVCwKKyAgICAgICAgICAgICAgICAmQXVkaW9QbGF5ZXI6OkF1ZGlvU2lua0NhbGxiYWNrLAorICAgICAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KWZsYWdzLAorICAgICAgICAgICAgICAgIHVzZU9mZmxvYWQoKSA/ICZvZmZsb2FkSW5mbyA6IE5VTEwpOworCisgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgIG1MYXRlbmN5VXMgPSAoaW50NjRfdCltQXVkaW9TaW5rLT5sYXRlbmN5KCkgKiAxMDAwOworICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IG1BdWRpb1NpbmstPmZyYW1lU2l6ZSgpOworCisgICAgICAgICAgICBpZiAodXNlT2ZmbG9hZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gSWYgdGhlIHBsYXliYWNrIGlzIG9mZmxvYWRlZCB0byBoL3cgd2UgcGFzcyB0aGUKKyAgICAgICAgICAgICAgICAvLyBIQUwgc29tZSBtZXRhZGF0YSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcyBmb3IgUENNIGJlY2F1c2UgaXQgd2lsbCBiZSBnb2luZworICAgICAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIEF1ZGlvRmxpbmdlciBtaXhlciBiZWZvcmUgcmVhY2hpbmcgdGhlIGhhcmR3YXJlCisgICAgICAgICAgICAgICAgc2VuZE1ldGFEYXRhVG9IYWwobUF1ZGlvU2luaywgZm9ybWF0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZXJyID0gbUF1ZGlvU2luay0+c3RhcnQoKTsKKyAgICAgICAgICAgIC8vIGRvIG5vdCBhbHRlciBiZWhhdmlvciBmb3Igbm9uIG9mZmxvYWRlZCB0cmFja3M6IGlnbm9yZSBzdGFydCBzdGF0dXMuCisgICAgICAgICAgICBpZiAoIXVzZU9mZmxvYWQoKSkgeworICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgaWYgKG1GaXJzdEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFzb3VyY2VBbHJlYWR5U3RhcnRlZCkgeworICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gcGxheWluZyB0byBhbiBBdWRpb1RyYWNrLCBzZXQgdXAgbWFzayBpZiBuZWNlc3NhcnkKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgYXVkaW9NYXNrID0gY2hhbm5lbE1hc2sgPT0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSID8KKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQobnVtQ2hhbm5lbHMpIDogY2hhbm5lbE1hc2s7CisgICAgICAgIGlmICgwID09IGF1ZGlvTWFzaykgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIG1BdWRpb1RyYWNrID0gbmV3IEF1ZGlvVHJhY2soCisgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX01VU0lDLCBtU2FtcGxlUmF0ZSwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIGF1ZGlvTWFzaywKKyAgICAgICAgICAgICAgICAwIC8qZnJhbWVDb3VudCovLCBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmQXVkaW9DYWxsYmFjaywgdGhpcywKKyAgICAgICAgICAgICAgICAwIC8qbm90aWZpY2F0aW9uRnJhbWVzKi8pOworCisgICAgICAgIGlmICgoZXJyID0gbUF1ZGlvVHJhY2stPmluaXRDaGVjaygpKSAhPSBPSykgeworICAgICAgICAgICAgbUF1ZGlvVHJhY2suY2xlYXIoKTsKKworICAgICAgICAgICAgaWYgKG1GaXJzdEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFzb3VyY2VBbHJlYWR5U3RhcnRlZCkgeworICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIG1MYXRlbmN5VXMgPSAoaW50NjRfdCltQXVkaW9UcmFjay0+bGF0ZW5jeSgpICogMTAwMDsKKyAgICAgICAgbUZyYW1lU2l6ZSA9IG1BdWRpb1RyYWNrLT5mcmFtZVNpemUoKTsKKworICAgICAgICBtQXVkaW9UcmFjay0+c3RhcnQoKTsKKyAgICB9CisKKyAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgbVBsYXlpbmcgPSB0cnVlOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEF1ZGlvUGxheWVyOjpwYXVzZShib29sIHBsYXlQZW5kaW5nU2FtcGxlcykgeworICAgIENIRUNLKG1TdGFydGVkKTsKKworICAgIGlmIChwbGF5UGVuZGluZ1NhbXBsZXMpIHsKKyAgICAgICAgaWYgKG1BdWRpb1NpbmsuZ2V0KCkgIT0gTlVMTCkgeworICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUF1ZGlvVHJhY2stPnN0b3AoKTsKKyAgICAgICAgfQorCisgICAgICAgIG1OdW1GcmFtZXNQbGF5ZWQgPSAwOworICAgICAgICBtTnVtRnJhbWVzUGxheWVkU3lzVGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobUF1ZGlvU2luay5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5wYXVzZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUF1ZGlvVHJhY2stPnBhdXNlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtUGxheWluZyA9IGZhbHNlOworfQorCitzdGF0dXNfdCBBdWRpb1BsYXllcjo6cmVzdW1lKCkgeworICAgIENIRUNLKG1TdGFydGVkKTsKKyAgICBzdGF0dXNfdCBlcnI7CisKKyAgICBpZiAobUF1ZGlvU2luay5nZXQoKSAhPSBOVUxMKSB7CisgICAgICAgIGVyciA9IG1BdWRpb1NpbmstPnN0YXJ0KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZXJyID0gbUF1ZGlvVHJhY2stPnN0YXJ0KCk7CisgICAgfQorCisgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICBtUGxheWluZyA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGVycjsKK30KKwordm9pZCBBdWRpb1BsYXllcjo6cmVzZXQoKSB7CisgICAgQ0hFQ0sobVN0YXJ0ZWQpOworCisgICAgQUxPR1YoInJlc2V0OiBtUGxheWluZz0lZCBtUmVhY2hlZEVPUz0lZCB1c2VPZmZsb2FkPSVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXlpbmcsIG1SZWFjaGVkRU9TLCB1c2VPZmZsb2FkKCkgKTsKKworICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKKyAgICAgICAgbUF1ZGlvU2luay0+c3RvcCgpOworICAgICAgICAvLyBJZiB3ZSdyZSBjbG9zaW5nIGFuZCBoYXZlIHJlYWNoZWQgRU9TLCB3ZSBkb24ndCB3YW50IHRvIGZsdXNoCisgICAgICAgIC8vIHRoZSB0cmFjayBiZWNhdXNlIGlmIGl0IGlzIG9mZmxvYWRlZCB0aGVyZSBjb3VsZCBiZSBhIHNtYWxsCisgICAgICAgIC8vIGFtb3VudCBvZiByZXNpZHVhbCBkYXRhIGluIHRoZSBoYXJkd2FyZSBidWZmZXIgd2hpY2ggd2UgbXVzdAorICAgICAgICAvLyBwbGF5IHRvIGdpdmUgZ2FwbGVzcyBwbGF5YmFjay4KKyAgICAgICAgLy8gQnV0IGlmIHdlJ3JlIHJlc2V0dGluZyB3aGVuIHBhdXNlZCBvciBiZWZvcmUgd2UndmUgcmVhY2hlZCBFT1MKKyAgICAgICAgLy8gd2UgY2FuJ3QgYmUgZG9pbmcgYSBnYXBsZXNzIHBsYXliYWNrIGFuZCB0aGVyZSBjb3VsZCBiZSBhIGxhcmdlCisgICAgICAgIC8vIGFtb3VudCBvZiBkYXRhIHF1ZXVlZCBpbiB0aGUgaGFyZHdhcmUgaWYgdGhlIHRyYWNrIGlzIG9mZmxvYWRlZCwKKyAgICAgICAgLy8gc28gd2UgbXVzdCBmbHVzaCB0byBwcmV2ZW50IGEgdHJhY2sgc3dpdGNoIGJlaW5nIGRlbGF5ZWQgcGxheWluZworICAgICAgICAvLyB0aGUgYnVmZmVyZWQgZGF0YSB0aGF0IHdlIGRvbid0IHdhbnQgbm93CisgICAgICAgIGlmICghbVBsYXlpbmcgfHwgIW1SZWFjaGVkRU9TKSB7CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOworICAgICAgICB9CisKKyAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQXVkaW9UcmFjay0+c3RvcCgpOworCisgICAgICAgIGlmICghbVBsYXlpbmcgfHwgIW1SZWFjaGVkRU9TKSB7CisgICAgICAgICAgICBtQXVkaW9UcmFjay0+Zmx1c2goKTsKKyAgICAgICAgfQorCisgICAgICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7CisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIHRvIHJlbGVhc2UgYW55IGJ1ZmZlciB3ZSBob2xkIG9udG8gc28gdGhhdCB0aGUKKyAgICAvLyBzb3VyY2UgaXMgYWJsZSB0byBzdG9wKCkuCisKKyAgICBpZiAobUZpcnN0QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgbUZpcnN0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7CisgICAgfQorCisgICAgaWYgKG1JbnB1dEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJBdWRpb1BsYXllciByZWxlYXNpbmcgaW5wdXQgYnVmZmVyLiIpOworCisgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOworICAgIH0KKworICAgIG1Tb3VyY2UtPnN0b3AoKTsKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgaGFjayBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoYXQgdGhlIE9NWAorICAgIC8vIGNvbXBvbmVudCBpcyBjb21wbGV0ZWx5IHJlbGVhc2VkIGJ5IHRoZSB0aW1lIHdlIG1heSB0cnkKKyAgICAvLyB0byBpbnN0YW50aWF0ZSBpdCBhZ2Fpbi4KKyAgICAvLyBXaGVuIG9mZmxvYWRpbmcsIHRoZSBPTVggY29tcG9uZW50IGlzIG5vdCB1c2VkIHNvIHRoaXMgaGFjaworICAgIC8vIGlzIG5vdCBuZWVkZWQKKyAgICBpZiAoIXVzZU9mZmxvYWQoKSkgeworICAgICAgICB3cDxNZWRpYVNvdXJjZT4gdG1wID0gbVNvdXJjZTsKKyAgICAgICAgbVNvdXJjZS5jbGVhcigpOworICAgICAgICB3aGlsZSAodG1wLnByb21vdGUoKSAhPSBOVUxMKSB7CisgICAgICAgICAgICB1c2xlZXAoMTAwMCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBtU291cmNlLmNsZWFyKCk7CisgICAgfQorICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKKworICAgIG1OdW1GcmFtZXNQbGF5ZWQgPSAwOworICAgIG1OdW1GcmFtZXNQbGF5ZWRTeXNUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIG1Qb3NpdGlvblRpbWVNZWRpYVVzID0gLTE7CisgICAgbVBvc2l0aW9uVGltZVJlYWxVcyA9IC0xOworICAgIG1TZWVraW5nID0gZmFsc2U7CisgICAgbVNlZWtUaW1lVXMgPSAwOworICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7CisgICAgbUZpbmFsU3RhdHVzID0gT0s7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBtUGxheWluZyA9IGZhbHNlOworICAgIG1TdGFydFBvc1VzID0gMDsKK30KKworLy8gc3RhdGljCit2b2lkIEF1ZGlvUGxheWVyOjpBdWRpb0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqdXNlciwgdm9pZCAqaW5mbykgeworICAgIHN0YXRpY19jYXN0PEF1ZGlvUGxheWVyICo+KHVzZXIpLT5BdWRpb0NhbGxiYWNrKGV2ZW50LCBpbmZvKTsKK30KKworYm9vbCBBdWRpb1BsYXllcjo6cmVhY2hlZEVPUyhzdGF0dXNfdCAqZmluYWxTdGF0dXMpIHsKKyAgICAqZmluYWxTdGF0dXMgPSBPSzsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgKmZpbmFsU3RhdHVzID0gbUZpbmFsU3RhdHVzOworICAgIHJldHVybiBtUmVhY2hlZEVPUzsKK30KKworc3RhdHVzX3QgQXVkaW9QbGF5ZXI6OnNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSkgeworICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb1NpbmstPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKKyAgICB9IGVsc2UgaWYgKG1BdWRpb1RyYWNrICE9IDApeworICAgICAgICByZXR1cm4gbUF1ZGlvVHJhY2stPnNldFBsYXliYWNrUmF0ZShyYXRlKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUGxheWVyOjpnZXRQbGF5YmFja1JhdGUoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUgLyogbm9ubnVsbCAqLykgeworICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb1NpbmstPmdldFBsYXliYWNrUmF0ZShyYXRlKTsKKyAgICB9IGVsc2UgaWYgKG1BdWRpb1RyYWNrICE9IDApIHsKKyAgICAgICAgKnJhdGUgPSBtQXVkaW9UcmFjay0+Z2V0UGxheWJhY2tSYXRlKCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9Cit9CisKKy8vIHN0YXRpYworc2l6ZV90IEF1ZGlvUGxheWVyOjpBdWRpb1NpbmtDYWxsYmFjaygKKyAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1NpbmsgKiAvKiBhdWRpb1NpbmsgKi8sCisgICAgICAgIHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUsIHZvaWQgKmNvb2tpZSwKKyAgICAgICAgTWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms6OmNiX2V2ZW50X3QgZXZlbnQpIHsKKyAgICBBdWRpb1BsYXllciAqbWUgPSAoQXVkaW9QbGF5ZXIgKiljb29raWU7CisKKyAgICBzd2l0Y2goZXZlbnQpIHsKKyAgICBjYXNlIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpDQl9FVkVOVF9GSUxMX0JVRkZFUjoKKyAgICAgICAgcmV0dXJuIG1lLT5maWxsQnVmZmVyKGJ1ZmZlciwgc2l6ZSk7CisKKyAgICBjYXNlIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpDQl9FVkVOVF9TVFJFQU1fRU5EOgorICAgICAgICBBTE9HVigiQXVkaW9TaW5rQ2FsbGJhY2s6IHN0cmVhbSBlbmQiKTsKKyAgICAgICAgbWUtPm1SZWFjaGVkRU9TID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpDQl9FVkVOVF9URUFSX0RPV046CisgICAgICAgIEFMT0dWKCJBdWRpb1NpbmtDYWxsYmFjazogVGVhciBkb3duIGV2ZW50Iik7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiAwOworfQorCit2b2lkIEF1ZGlvUGxheWVyOjpBdWRpb0NhbGxiYWNrKGludCBldmVudCwgdm9pZCAqaW5mbykgeworICAgIHN3aXRjaCAoZXZlbnQpIHsKKyAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX01PUkVfREFUQToKKyAgICAgICAgeworICAgICAgICBBdWRpb1RyYWNrOjpCdWZmZXIgKmJ1ZmZlciA9IChBdWRpb1RyYWNrOjpCdWZmZXIgKilpbmZvOworICAgICAgICBzaXplX3QgbnVtQnl0ZXNXcml0dGVuID0gZmlsbEJ1ZmZlcihidWZmZXItPnJhdywgYnVmZmVyLT5zaXplKTsKKyAgICAgICAgYnVmZmVyLT5zaXplID0gbnVtQnl0ZXNXcml0dGVuOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9TVFJFQU1fRU5EOgorICAgICAgICBtUmVhY2hlZEVPUyA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworc2l6ZV90IEF1ZGlvUGxheWVyOjpmaWxsQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKG1OdW1GcmFtZXNQbGF5ZWQgPT0gMCkgeworICAgICAgICBBTE9HVigiQXVkaW9DYWxsYmFjayIpOworICAgIH0KKworICAgIGlmIChtUmVhY2hlZEVPUykgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZV9kb25lID0gMDsKKyAgICBzaXplX3Qgc2l6ZV9yZW1haW5pbmcgPSBzaXplOworICAgIHdoaWxlIChzaXplX3JlbWFpbmluZyA+IDApIHsKKyAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zIG9wdGlvbnM7CisgICAgICAgIGJvb2wgcmVmcmVzaFNlZWtUaW1lID0gZmFsc2U7CisKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgICAgICAgICAgaWYgKG1TZWVraW5nKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Jc0ZpcnN0QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRmlyc3RCdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Jc0ZpcnN0QnVmZmVyID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8obVNlZWtUaW1lVXMpOworICAgICAgICAgICAgICAgIHJlZnJlc2hTZWVrVGltZSA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlciA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgbVNlZWtpbmcgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSW5wdXRCdWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworCisgICAgICAgICAgICBpZiAobUlzRmlyc3RCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBtRmlyc3RCdWZmZXI7CisgICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKKyAgICAgICAgICAgICAgICBlcnIgPSBtRmlyc3RCdWZmZXJSZXN1bHQ7CisKKyAgICAgICAgICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IGZhbHNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBtU291cmNlLT5yZWFkKCZtSW5wdXRCdWZmZXIsICZvcHRpb25zKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQ0hFQ0soKGVyciA9PSBPSyAmJiBtSW5wdXRCdWZmZXIgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICB8fCAoZXJyICE9IE9LICYmIG1JbnB1dEJ1ZmZlciA9PSBOVUxMKSk7CisKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1SZWFjaGVkRU9TKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICh1c2VPZmZsb2FkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIG1vcmUgYnVmZmVycyB0byBwdXNoIC0gc3RvcCgpIGFuZCB3YWl0IGZvciBTVFJFQU1fRU5ECisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBzZXQgbVJlYWNoZWRFT1MgdW50aWwgc3RyZWFtIGVuZCByZWNlaXZlZAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2stPnN0b3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1GaW5hbFN0YXR1cyA9IGVycjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1MYXRlbmN5VXMgPSAoaW50NjRfdCltQXVkaW9TaW5rLT5sYXRlbmN5KCkgKiAxMDAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtTGF0ZW5jeVVzID0gKGludDY0X3QpbUF1ZGlvVHJhY2stPmxhdGVuY3koKSAqIDEwMDA7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIENIRUNLKG1JbnB1dEJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAga0tleVRpbWUsICZtUG9zaXRpb25UaW1lTWVkaWFVcykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBuZWVkIHRvIGFkanVzdCB0aGUgbVN0YXJ0UG9zVXMgZm9yIG9mZmxvYWQgZGVjb2Rpbmcgc2luY2UgcGFyc2VyCisgICAgICAgICAgICAvLyBtaWdodCBub3QgYmUgYWJsZSB0byBnZXQgdGhlIGV4YWN0IHNlZWsgdGltZSByZXF1ZXN0ZWQuCisgICAgICAgICAgICBpZiAocmVmcmVzaFNlZWtUaW1lKSB7CisgICAgICAgICAgICAgICAgaWYgKHVzZU9mZmxvYWQoKSkgeworICAgICAgICAgICAgICAgICAgICBtU3RhcnRQb3NVcyA9IG1Qb3NpdGlvblRpbWVNZWRpYVVzOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiYWRqdXN0IHNlZWsgdGltZSB0bzogJS4yZiIsIG1TdGFydFBvc1VzLyAxRTYpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBjbGVhciBzZWVrIHRpbWUgd2l0aCBtTG9jayBsb2NrZWQgYW5kIG9uY2Ugd2UgaGF2ZSB2YWxpZCBtUG9zaXRpb25UaW1lTWVkaWFVcworICAgICAgICAgICAgICAgIC8vIGFuZCBtUG9zaXRpb25UaW1lUmVhbFVzCisgICAgICAgICAgICAgICAgLy8gYmVmb3JlIGNsZWFyaW5nIG1TZWVrVGltZVVzIGNoZWNrIGlmIGEgbmV3IHNlZWsgcmVxdWVzdCBoYXMgYmVlbiByZWNlaXZlZCB3aGlsZQorICAgICAgICAgICAgICAgIC8vIHdlIHdlcmUgcmVhZGluZyBmcm9tIHRoZSBzb3VyY2Ugd2l0aCBtTG9jayByZWxlYXNlZC4KKyAgICAgICAgICAgICAgICBpZiAoIW1TZWVraW5nKSB7CisgICAgICAgICAgICAgICAgICAgIG1TZWVrVGltZVVzID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICghdXNlT2ZmbG9hZCgpKSB7CisgICAgICAgICAgICAgICAgbVBvc2l0aW9uVGltZVJlYWxVcyA9CisgICAgICAgICAgICAgICAgICAgICgobU51bUZyYW1lc1BsYXllZCArIHNpemVfZG9uZSAvIG1GcmFtZVNpemUpICogMTAwMDAwMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gbVNhbXBsZVJhdGU7CisgICAgICAgICAgICAgICAgQUxPR1YoImJ1ZmZlci0+c2l6ZSgpID0gJXp1LCAiCisgICAgICAgICAgICAgICAgICAgICAibVBvc2l0aW9uVGltZU1lZGlhVXM9JS4yZiBtUG9zaXRpb25UaW1lUmVhbFVzPSUuMmYiLAorICAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwKKyAgICAgICAgICAgICAgICAgICAgIG1Qb3NpdGlvblRpbWVNZWRpYVVzIC8gMUU2LCBtUG9zaXRpb25UaW1lUmVhbFVzIC8gMUU2KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgeworICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOworCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBjb3B5ID0gc2l6ZV9yZW1haW5pbmc7CisgICAgICAgIGlmIChjb3B5ID4gbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSkgeworICAgICAgICAgICAgY29weSA9IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgIH0KKworICAgICAgICBtZW1jcHkoKGNoYXIgKilkYXRhICsgc2l6ZV9kb25lLAorICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKiltSW5wdXRCdWZmZXItPmRhdGEoKSArIG1JbnB1dEJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICAgICBjb3B5KTsKKworICAgICAgICBtSW5wdXRCdWZmZXItPnNldF9yYW5nZShtSW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpICsgY29weSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyLT5yYW5nZV9sZW5ndGgoKSAtIGNvcHkpOworCisgICAgICAgIHNpemVfZG9uZSArPSBjb3B5OworICAgICAgICBzaXplX3JlbWFpbmluZyAtPSBjb3B5OworICAgIH0KKworICAgIGlmICh1c2VPZmZsb2FkKCkpIHsKKyAgICAgICAgLy8gV2UgbXVzdCBhc2sgdGhlIGhhcmR3YXJlIHdoYXQgaXQgaGFzIHBsYXllZAorICAgICAgICBtUG9zaXRpb25UaW1lUmVhbFVzID0gZ2V0T3V0cHV0UGxheVBvc2l0aW9uVXNfbCgpOworICAgICAgICBBTE9HVigibVBvc2l0aW9uVGltZU1lZGlhVXM9JS4yZiBtUG9zaXRpb25UaW1lUmVhbFVzPSUuMmYiLAorICAgICAgICAgICAgIG1Qb3NpdGlvblRpbWVNZWRpYVVzIC8gMUU2LCBtUG9zaXRpb25UaW1lUmVhbFVzIC8gMUU2KTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIG1OdW1GcmFtZXNQbGF5ZWQgKz0gc2l6ZV9kb25lIC8gbUZyYW1lU2l6ZTsKKyAgICAgICAgbU51bUZyYW1lc1BsYXllZFN5c1RpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgfQorCisgICAgcmV0dXJuIHNpemVfZG9uZTsKK30KKworaW50NjRfdCBBdWRpb1BsYXllcjo6Z2V0T3V0cHV0UGxheVBvc2l0aW9uVXNfbCgpCit7CisgICAgdWludDMyX3QgcGxheWVkU2FtcGxlcyA9IDA7CisgICAgdWludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7CisgICAgICAgIG1BdWRpb1NpbmstPmdldFBvc2l0aW9uKCZwbGF5ZWRTYW1wbGVzKTsKKyAgICAgICAgc2FtcGxlUmF0ZSA9IG1BdWRpb1NpbmstPmdldFNhbXBsZVJhdGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQXVkaW9UcmFjay0+Z2V0UG9zaXRpb24oJnBsYXllZFNhbXBsZXMpOworICAgICAgICBzYW1wbGVSYXRlID0gbUF1ZGlvVHJhY2stPmdldFNhbXBsZVJhdGUoKTsKKyAgICB9CisgICAgaWYgKHNhbXBsZVJhdGUgIT0gMCkgeworICAgICAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgfQorCisgICAgaW50NjRfdCBwbGF5ZWRVczsKKyAgICBpZiAobVNhbXBsZVJhdGUgIT0gMCkgeworICAgICAgICBwbGF5ZWRVcyA9IChzdGF0aWNfY2FzdDxpbnQ2NF90PihwbGF5ZWRTYW1wbGVzKSAqIDEwMDAwMDAgKSAvIG1TYW1wbGVSYXRlOworICAgIH0gZWxzZSB7CisgICAgICAgIHBsYXllZFVzID0gMDsKKyAgICB9CisKKyAgICAvLyBIQUwgcG9zaXRpb24gaXMgcmVsYXRpdmUgdG8gdGhlIGZpcnN0IGJ1ZmZlciB3ZSBzZW50IGF0IG1TdGFydFBvc1VzCisgICAgY29uc3QgaW50NjRfdCByZW5kZXJlZER1cmF0aW9uID0gbVN0YXJ0UG9zVXMgKyBwbGF5ZWRVczsKKyAgICBBTE9HVigiZ2V0T3V0cHV0UGxheVBvc2l0aW9uVXNfbCAlIiBQUklkNjQsIHJlbmRlcmVkRHVyYXRpb24pOworICAgIHJldHVybiByZW5kZXJlZER1cmF0aW9uOworfQorCitzdGF0dXNfdCBBdWRpb1BsYXllcjo6c2Vla1RvKGludDY0X3QgdGltZV91cykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBBTE9HVigic2Vla1RvKCAlIiBQUklkNjQgIiApIiwgdGltZV91cyk7CisKKyAgICBtU2Vla2luZyA9IHRydWU7CisgICAgbVBvc2l0aW9uVGltZVJlYWxVcyA9IG1Qb3NpdGlvblRpbWVNZWRpYVVzID0gLTE7CisgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKKyAgICBtU2Vla1RpbWVVcyA9IHRpbWVfdXM7CisgICAgbVN0YXJ0UG9zVXMgPSB0aW1lX3VzOworCisgICAgLy8gRmx1c2ggcmVzZXRzIHRoZSBudW1iZXIgb2YgcGxheWVkIGZyYW1lcworICAgIG1OdW1GcmFtZXNQbGF5ZWQgPSAwOworICAgIG1OdW1GcmFtZXNQbGF5ZWRTeXNUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworCisgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgeworICAgICAgICBpZiAobVBsYXlpbmcpIHsKKyAgICAgICAgICAgIG1BdWRpb1NpbmstPnBhdXNlKCk7CisgICAgICAgIH0KKyAgICAgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKKyAgICAgICAgaWYgKG1QbGF5aW5nKSB7CisgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdGFydCgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1QbGF5aW5nKSB7CisgICAgICAgICAgICBtQXVkaW9UcmFjay0+cGF1c2UoKTsKKyAgICAgICAgfQorICAgICAgICBtQXVkaW9UcmFjay0+Zmx1c2goKTsKKyAgICAgICAgaWYgKG1QbGF5aW5nKSB7CisgICAgICAgICAgICBtQXVkaW9UcmFjay0+c3RhcnQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oIGIvY21kcy9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmgKcmVuYW1lIHRvIGNtZHMvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaApkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9TaW1wbGVQbGF5ZXIuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9TaW1wbGVQbGF5ZXIuY3BwCmluZGV4IGFmYjdkYjMuLmY0YjgxNjQgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvU2ltcGxlUGxheWVyLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L1NpbXBsZVBsYXllci5jcHAKQEAgLTIzLDcgKzIzLDcgQEAKICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogCiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgotI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L2F1ZGlvbG9vcC5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L2F1ZGlvbG9vcC5jcHAKaW5kZXggZDRmMmU4ZC4uYmQyNzRkOCAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9hdWRpb2xvb3AuY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvYXVkaW9sb29wLmNwcApAQCAtMjksMTEgKzI5LDExIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5oPgorI2luY2x1ZGUgIkF1ZGlvUGxheWVyLmgiCiAjaW5jbHVkZSAiU2luZVNvdXJjZS5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvY29kZWMuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAKaW5kZXggOTgwZDFkMi4uZjJkMWMyOSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9jb2RlYy5jcHAKQEAgLTIzLDcgKzIzLDcgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CkBAIC0xMzgsNyArMTM4LDcgQEAKIAogICAgIENIRUNLKCFzdGF0ZUJ5VHJhY2suaXNFbXB0eSgpKTsKIAotICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBhbmRyb2lkOjpBTG9vcGVyOjpHZXROb3dVcygpOwogICAgIGludDY0X3Qgc3RhcnRUaW1lUmVuZGVyID0gLTE7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlQnlUcmFjay5zaXplKCk7ICsraSkgewpAQCAtMzA3LDcgKzMwNyw3IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpbnQ2NF90IGVsYXBzZWRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7CisgICAgaW50NjRfdCBlbGFwc2VkVGltZVVzID0gYW5kcm9pZDo6QUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0ZUJ5VHJhY2suc2l6ZSgpOyArK2kpIHsKICAgICAgICAgQ29kZWNTdGF0ZSAqc3RhdGUgPSAmc3RhdGVCeVRyYWNrLmVkaXRWYWx1ZUF0KGkpOwpAQCAtNDAwLDcgKzQwMCw3IEBACiAKICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAKLSAgICBzcDxBTG9vcGVyPiBsb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBzcDxhbmRyb2lkOjpBTG9vcGVyPiBsb29wZXIgPSBuZXcgYW5kcm9pZDo6QUxvb3BlcjsKICAgICBsb29wZXItPnN0YXJ0KCk7CiAKICAgICBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGNvbXBvc2VyQ2xpZW50OwpAQCAtNDExLDEwICs0MTEsMTIgQEAKICAgICAgICAgY29tcG9zZXJDbGllbnQgPSBuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OwogICAgICAgICBDSEVDS19FUShjb21wb3NlckNsaWVudC0+aW5pdENoZWNrKCksIChzdGF0dXNfdClPSyk7CiAKLSAgICAgICAgc3A8SUJpbmRlcj4gZGlzcGxheShTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEJ1aWx0SW5EaXNwbGF5KAotICAgICAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmVEaXNwbGF5SWRNYWluKSk7CisgICAgICAgIGNvbnN0IHNwPElCaW5kZXI+IGRpc3BsYXkgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEludGVybmFsRGlzcGxheVRva2VuKCk7CisgICAgICAgIENIRUNLKGRpc3BsYXkgIT0gbnVsbHB0cik7CisKICAgICAgICAgRGlzcGxheUluZm8gaW5mbzsKLSAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhkaXNwbGF5LCAmaW5mbyk7CisgICAgICAgIENIRUNLX0VRKFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8oZGlzcGxheSwgJmluZm8pLCBOT19FUlJPUik7CisKICAgICAgICAgc3NpemVfdCBkaXNwbGF5V2lkdGggPSBpbmZvLnc7CiAgICAgICAgIHNzaXplX3QgZGlzcGxheUhlaWdodCA9IGluZm8uaDsKIApkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9maWx0ZXJzL2FyZ2J0b3JnYmEucnMgYi9jbWRzL3N0YWdlZnJpZ2h0L2ZpbHRlcnMvYXJnYnRvcmdiYS5yc2NyaXB0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBjbWRzL3N0YWdlZnJpZ2h0L2ZpbHRlcnMvYXJnYnRvcmdiYS5ycwpyZW5hbWUgdG8gY21kcy9zdGFnZWZyaWdodC9maWx0ZXJzL2FyZ2J0b3JnYmEucnNjcmlwdApkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9maWx0ZXJzL25pZ2h0dmlzaW9uLnJzIGIvY21kcy9zdGFnZWZyaWdodC9maWx0ZXJzL25pZ2h0dmlzaW9uLnJzY3JpcHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNtZHMvc3RhZ2VmcmlnaHQvZmlsdGVycy9uaWdodHZpc2lvbi5ycwpyZW5hbWUgdG8gY21kcy9zdGFnZWZyaWdodC9maWx0ZXJzL25pZ2h0dmlzaW9uLnJzY3JpcHQKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvZmlsdGVycy9zYXR1cmF0aW9uLnJzIGIvY21kcy9zdGFnZWZyaWdodC9maWx0ZXJzL3NhdHVyYXRpb24ucnNjcmlwdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gY21kcy9zdGFnZWZyaWdodC9maWx0ZXJzL3NhdHVyYXRpb24ucnMKcmVuYW1lIHRvIGNtZHMvc3RhZ2VmcmlnaHQvZmlsdGVycy9zYXR1cmF0aW9uLnJzY3JpcHQKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvbWVkaWFmaWx0ZXIuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKaW5kZXggNjMwZGUyNS4uNjYzMDJiMCAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9tZWRpYWZpbHRlci5jcHAKQEAgLTI0LDkgKzI0LDkgQEAKICNpbmNsdWRlIDxndWkvSVN1cmZhY2VDb21wb3Nlci5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CkBAIC0zMTAsNyArMzEwLDcgQEAKIH0KIAogc3RhdGljIGludCBkZWNvZGUoCi0gICAgICAgIGNvbnN0IHNwPEFMb29wZXI+ICZsb29wZXIsCisgICAgICAgIGNvbnN0IHNwPGFuZHJvaWQ6OkFMb29wZXI+ICZsb29wZXIsCiAgICAgICAgIGNvbnN0IGNoYXIgKnBhdGgsCiAgICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlLAogICAgICAgICBib29sIHJlbmRlclN1cmZhY2UsCkBAIC00NjUsNyArNDY1LDcgQEAKICAgICBmaWx0ZXJTdGF0ZS0+bVNpZ25hbGxlZElucHV0RU9TID0gZmFsc2U7CiAgICAgZmlsdGVyU3RhdGUtPm1TYXdPdXRwdXRFT1MgPSBmYWxzZTsKIAotICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBhbmRyb2lkOjpBTG9vcGVyOjpHZXROb3dVcygpOwogICAgIGludDY0X3Qgc3RhcnRUaW1lUmVuZGVyID0gLTE7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHN0YXRlQnlUcmFjay5zaXplKCk7ICsraSkgewpAQCAtNjQzLDcgKzY0Myw3IEBACiAgICAgICAgICAgICAgICAgdXNlVGltZXN0YW1wLCAmc3RhcnRUaW1lUmVuZGVyKTsKICAgICB9CiAKLSAgICBpbnQ2NF90IGVsYXBzZWRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7CisgICAgaW50NjRfdCBlbGFwc2VkVGltZVVzID0gYW5kcm9pZDo6QUxvb3Blcjo6R2V0Tm93VXMoKSAtIHN0YXJ0VGltZVVzOwogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdGF0ZUJ5VHJhY2suc2l6ZSgpOyArK2kpIHsKICAgICAgICAgQ29kZWNTdGF0ZSAqc3RhdGUgPSAmc3RhdGVCeVRyYWNrLmVkaXRWYWx1ZUF0KGkpOwpAQCAtNzM3LDcgKzczNyw3IEBACiAKICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CiAKLSAgICBhbmRyb2lkOjpzcDxBTG9vcGVyPiBsb29wZXIgPSBuZXcgQUxvb3BlcjsKKyAgICBhbmRyb2lkOjpzcDxhbmRyb2lkOjpBTG9vcGVyPiBsb29wZXIgPSBuZXcgYW5kcm9pZDo6QUxvb3BlcjsKICAgICBsb29wZXItPnN0YXJ0KCk7CiAKICAgICBhbmRyb2lkOjpzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGNvbXBvc2VyQ2xpZW50OwpAQCAtNzQ4LDEwICs3NDgsMTIgQEAKICAgICAgICAgY29tcG9zZXJDbGllbnQgPSBuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OwogICAgICAgICBDSEVDS19FUSgoc3RhdHVzX3QpT0ssIGNvbXBvc2VyQ2xpZW50LT5pbml0Q2hlY2soKSk7CiAKLSAgICAgICAgYW5kcm9pZDo6c3A8SUJpbmRlcj4gZGlzcGxheShTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEJ1aWx0SW5EaXNwbGF5KAotICAgICAgICAgICAgICAgIElTdXJmYWNlQ29tcG9zZXI6OmVEaXNwbGF5SWRNYWluKSk7CisgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPElCaW5kZXI+IGRpc3BsYXkgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEludGVybmFsRGlzcGxheVRva2VuKCk7CisgICAgICAgIENIRUNLKGRpc3BsYXkgIT0gbnVsbHB0cik7CisKICAgICAgICAgRGlzcGxheUluZm8gaW5mbzsKLSAgICAgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhkaXNwbGF5LCAmaW5mbyk7CisgICAgICAgIENIRUNLX0VRKFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0RGlzcGxheUluZm8oZGlzcGxheSwgJmluZm8pLCBOT19FUlJPUik7CisKICAgICAgICAgc3NpemVfdCBkaXNwbGF5V2lkdGggPSBpbmZvLnc7CiAgICAgICAgIHNzaXplX3QgZGlzcGxheUhlaWdodCA9IGluZm8uaDsKIApkaWZmIC0tZ2l0IGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9yZWNvcmQuY3BwCmluZGV4IDQ0YjAwMTUuLjM3MDkxYzQgMTAwNjQ0Ci0tLSBhL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkLmNwcAorKysgYi9jbWRzL3N0YWdlZnJpZ2h0L3JlY29yZC5jcHAKQEAgLTE3LDIyICsxNywyMyBAQAogI2luY2x1ZGUgIlNpbmVTb3VyY2UuaCIKIAogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPGRhdGFzb3VyY2UvRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ2FtZXJhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgogCisjaW5jbHVkZSAiQXVkaW9QbGF5ZXIuaCIKKwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIHN0YXRpYyBjb25zdCBpbnQzMl90IGtBdWRpb0JpdFJhdGUgPSAxMjIwMDsKZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvcmVjb3JkdmlkZW8uY3BwIGIvY21kcy9zdGFnZWZyaWdodC9yZWNvcmR2aWRlby5jcHAKaW5kZXggYTYzYjliOS4uMDFhMTc4ZSAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9yZWNvcmR2aWRlby5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9yZWNvcmR2aWRlby5jcHAKQEAgLTE0LDggKzE0LDYgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlICJTaW5lU291cmNlLmgiCi0KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CkBAIC0yNSw4ICsyMyw4IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9QbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KZGlmZiAtLWdpdCBhL2NtZHMvc3RhZ2VmcmlnaHQvc3RhZ2VmcmlnaHQuY3BwIGIvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAKaW5kZXggMDMxMTY3Ny4uMDJhZGU5NCAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAKKysrIGIvY21kcy9zdGFnZWZyaWdodC9zdGFnZWZyaWdodC5jcHAKQEAgLTMxLDI1ICszMSwyMyBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxkYXRhc291cmNlL0RhdGFTb3VyY2VGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+Ci0jaW5jbHVkZSAiaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BdWRpb1BsYXllci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSlBFR1NvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmg+CkBAIC02OCw2ICs2Niw4IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL29teC8xLjAvSU9teC5oPgogCisjaW5jbHVkZSAiQXVkaW9QbGF5ZXIuaCIKKwogdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CiAKIHN0YXRpYyBsb25nIGdOdW1SZXBldGl0aW9uczsKQEAgLTc4LDYgKzc4LDcgQEAKIHN0YXRpYyBib29sIGdQbGF5YmFja0F1ZGlvOwogc3RhdGljIGJvb2wgZ1dyaXRlTVA0Owogc3RhdGljIGJvb2wgZ0Rpc3BsYXlIaXN0b2dyYW07CitzdGF0aWMgYm9vbCBnVmVyYm9zZSA9IGZhbHNlOwogc3RhdGljIGJvb2wgc2hvd1Byb2dyZXNzID0gdHJ1ZTsKIHN0YXRpYyBTdHJpbmc4IGdXcml0ZU1QNEZpbGVuYW1lOwogc3RhdGljIFN0cmluZzggZ0NvbXBvbmVudE5hbWVPdmVycmlkZTsKQEAgLTE1OSw2ICsxNjAsMTEgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGdWZXJib3NlKSB7CisgICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEgPSBtYnVmLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgIGZwcmludGYoc3Rkb3V0LCAic2FtcGxlIGZvcm1hdDogJXNcbiIsIG1ldGEudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgfQorCiAgICAgICAgIENIRUNLX0VRKAogICAgICAgICAgICAgICAgIGZ3cml0ZSgoY29uc3QgdWludDhfdCAqKW1idWYtPmRhdGEoKSArIG1idWYtPnJhbmdlX29mZnNldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAxLApAQCAtMjE4LDExICsyMjQsMTUgQEAKICAgICAgICAgcGxheWVyLT5zZXRTb3VyY2UocmF3U291cmNlKTsKICAgICAgICAgcmF3U291cmNlLmNsZWFyKCk7CiAKLSAgICAgICAgcGxheWVyLT5zdGFydCh0cnVlIC8qIHNvdXJjZUFscmVhZHlTdGFydGVkICovKTsKKyAgICAgICAgZXJyID0gcGxheWVyLT5zdGFydCh0cnVlIC8qIHNvdXJjZUFscmVhZHlTdGFydGVkICovKTsKIAotICAgICAgICBzdGF0dXNfdCBmaW5hbFN0YXR1czsKLSAgICAgICAgd2hpbGUgKCFwbGF5ZXItPnJlYWNoZWRFT1MoJmZpbmFsU3RhdHVzKSkgewotICAgICAgICAgICAgdXNsZWVwKDEwMDAwMGxsKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgc3RhdHVzX3QgZmluYWxTdGF0dXM7CisgICAgICAgICAgICB3aGlsZSAoIXBsYXllci0+cmVhY2hlZEVPUygmZmluYWxTdGF0dXMpKSB7CisgICAgICAgICAgICAgICAgdXNsZWVwKDEwMDAwMGxsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAidW5hYmxlIHRvIHN0YXJ0IHBsYXliYWNrIGVycj0lZCAoMHglMDh4KVxuIiwgZXJyLCBlcnIpOwogICAgICAgICB9CiAKICAgICAgICAgZGVsZXRlIHBsYXllcjsKQEAgLTI5NCw3ICszMDQsNyBAQAogICAgICAgICAgICAgc2Vla1RpbWVVcyA9IC0xOwogCiAgICAgICAgICAgICBpZiAoc2hvdWxkU2VlaykgewotICAgICAgICAgICAgICAgIHNlZWtUaW1lVXMgPSAocmFuZCgpICogKGZsb2F0KWR1cmF0aW9uVXMpIC8gUkFORF9NQVg7CisgICAgICAgICAgICAgICAgc2Vla1RpbWVVcyA9IChyYW5kKCkgKiAoZmxvYXQpZHVyYXRpb25VcykgLyAoZmxvYXQpUkFORF9NQVg7CiAgICAgICAgICAgICAgICAgb3B0aW9ucy5zZXRTZWVrVG8oc2Vla1RpbWVVcyk7CiAKICAgICAgICAgICAgICAgICBwcmludGYoInNlZWtpbmcgdG8gJSIgUFJJZDY0ICIgdXMgKCUuMmYgc2VjcylcbiIsCkBAIC0zNDgsNyArMzU4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIGRlY29kZVRpbWVzVXMucHVzaChkZWxheURlY29kZVVzKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoc2hvd1Byb2dyZXNzICYmIChuKysgJSAxNikgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChnVmVyYm9zZSkgeworICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZG91dCwgIiVsZCBzYW1wbGUgZm9ybWF0OiAlc1xuIiwgbnVtRnJhbWVzLCBtZXRhLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzaG93UHJvZ3Jlc3MgJiYgKG4rKyAlIDE2KSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiLiIpOwogICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3Rkb3V0KTsKICAgICAgICAgICAgICAgICB9CkBAIC01NzksMTIgKzU5MiwxMiBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBDSEVDSyhidWZmZXIgIT0gTlVMTCk7CisKICAgICAgICAgICAgIGlmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpID4gMCkgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBDSEVDSyhidWZmZXIgIT0gTlVMTCk7Ci0KICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKICAgICAgICAgfQpAQCAtNjE1LDcgKzYyOCw3IEBACiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWwoaXN0KSBjb21wb25lbnRzXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtbSBtYXgtbnVtYmVyLW9mLWZyYW1lcy10by1kZWNvZGUgaW4gZWFjaCBwYXNzXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtYiBidWcgdG8gcmVwcm9kdWNlXG4iKTsKLSAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtcChyb2ZpbGVzKSBkdW1wIGRlY29kZXIgcHJvZmlsZXMgc3VwcG9ydGVkXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtaShuZm8pIGR1bXAgY29kZWMgaW5mbyAocHJvZmlsZXMgYW5kIGNvbG9yIGZvcm1hdHMgc3VwcG9ydGVkLCBkZXRhaWxzKVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXQoaHVtYm5haWwpIGV4dHJhY3QgdmlkZW8gdGh1bWJuYWlsIG9yIGFsYnVtIGFydFxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLXMob2Z0d2FyZSkgcHJlZmVyIHNvZnR3YXJlIGNvZGVjXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtcihoYXJkd2FyZSkgZm9yY2UgdG8gdXNlIGhhcmR3YXJlIGNvZGVjXG4iKTsKQEAgLTYzMCw1NSArNjQzLDEzNCBAQAogICAgIGZwcmludGYoc3RkZXJyLCAiICAgICAgIC1UIGFsbG9jYXRlIGJ1ZmZlcnMgZnJvbSBhIHN1cmZhY2UgdGV4dHVyZVxuIik7CiAgICAgZnByaW50ZihzdGRlcnIsICIgICAgICAgLWQodW1wKSBvdXRwdXRfZmlsZW5hbWUgKHJhdyBzdHJlYW0gZGF0YSB0byBhIGZpbGUpXG4iKTsKICAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtRCh1bXApIG91dHB1dF9maWxlbmFtZSAoZGVjb2RlZCBQQ00gZGF0YSB0byBhIGZpbGUpXG4iKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtdiBiZSBtb3JlIHZlcmJvc2VcbiIpOwogfQogCi1zdGF0aWMgdm9pZCBkdW1wQ29kZWNQcm9maWxlcyhib29sIHF1ZXJ5RGVjb2RlcnMpIHsKLSAgICBjb25zdCBjaGFyICprTWltZVR5cGVzW10gPSB7Ci0gICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsCi0gICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQywKLSAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CLCBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsCi0gICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcsIE1FRElBX01JTUVUWVBFX0FVRElPX0c3MTFfTUxBVywKLSAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsCi0gICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA5LAotICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04sIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMKLSAgICB9OwotCi0gICAgY29uc3QgY2hhciAqY29kZWNUeXBlID0gcXVlcnlEZWNvZGVycz8gImRlY29kZXIiIDogImVuY29kZXIiOwotICAgIHByaW50ZigiJXMgcHJvZmlsZXM6XG4iLCBjb2RlY1R5cGUpOworc3RhdGljIHZvaWQgZHVtcENvZGVjRGV0YWlscyhib29sIHF1ZXJ5RGVjb2RlcnMpIHsKKyAgICBjb25zdCBjaGFyICpjb2RlY1R5cGUgPSBxdWVyeURlY29kZXJzPyAiRGVjb2RlciIgOiAiRW5jb2RlciI7CisgICAgcHJpbnRmKCJcbiVzIGluZm9zIGJ5IG1lZGlhIHR5cGVzOlxuIgorICAgICAgICAgICAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIsIGNvZGVjVHlwZSk7CiAKICAgICBzcDxJTWVkaWFDb2RlY0xpc3Q+IGxpc3QgPSBNZWRpYUNvZGVjTGlzdDo6Z2V0SW5zdGFuY2UoKTsKICAgICBzaXplX3QgbnVtQ29kZWNzID0gbGlzdC0+Y291bnRDb2RlY3MoKTsKIAotICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgc2l6ZW9mKGtNaW1lVHlwZXMpIC8gc2l6ZW9mKGtNaW1lVHlwZXNbMF0pOyArK2spIHsKLSAgICAgICAgcHJpbnRmKCJ0eXBlICclcyc6XG4iLCBrTWltZVR5cGVzW2tdKTsKKyAgICAvLyBnYXRoZXIgYWxsIG1lZGlhIHR5cGVzIHN1cHBvcnRlZCBieSBjb2RlYyBjbGFzcywgYW5kIGxpbmsgdG8gY29kZWNzIHRoYXQgc3VwcG9ydCB0aGVtCisgICAgS2V5ZWRWZWN0b3I8QVN0cmluZywgVmVjdG9yPHNwPE1lZGlhQ29kZWNJbmZvPj4+IGFsbE1lZGlhVHlwZXM7CisgICAgZm9yIChzaXplX3QgY29kZWNfaXggPSAwOyBjb2RlY19peCA8IG51bUNvZGVjczsgKytjb2RlY19peCkgeworICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbz4gaW5mbyA9IGxpc3QtPmdldENvZGVjSW5mbyhjb2RlY19peCk7CisgICAgICAgIGlmIChpbmZvLT5pc0VuY29kZXIoKSA9PSAhcXVlcnlEZWNvZGVycykgeworICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+IHN1cHBvcnRlZE1lZGlhVHlwZXM7CisgICAgICAgICAgICBpbmZvLT5nZXRTdXBwb3J0ZWRNZWRpYVR5cGVzKCZzdXBwb3J0ZWRNZWRpYVR5cGVzKTsKKyAgICAgICAgICAgIGlmICghc3VwcG9ydGVkTWVkaWFUeXBlcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIndhcm5pbmc6ICVzIGRvZXMgbm90IHN1cHBvcnQgYW55IG1lZGlhIHR5cGVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+Z2V0Q29kZWNOYW1lKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IEFTdHJpbmcgJm1lZGlhVHlwZSA6IHN1cHBvcnRlZE1lZGlhVHlwZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFsbE1lZGlhVHlwZXMuaW5kZXhPZktleShtZWRpYVR5cGUpIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWxsTWVkaWFUeXBlcy5hZGQobWVkaWFUeXBlLCBWZWN0b3I8c3A8TWVkaWFDb2RlY0luZm8+PigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBhbGxNZWRpYVR5cGVzLmVkaXRWYWx1ZUZvcihtZWRpYVR5cGUpLmFkZChpbmZvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiAKLSAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IG51bUNvZGVjczsgKytpbmRleCkgewotICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBsaXN0LT5nZXRDb2RlY0luZm8oaW5kZXgpOwotICAgICAgICAgICAgaWYgKGluZm8gPT0gTlVMTCB8fCBpbmZvLT5pc0VuY29kZXIoKSAhPSAhcXVlcnlEZWNvZGVycykgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gY2FwcyA9IGluZm8tPmdldENhcGFiaWxpdGllc0ZvcihrTWltZVR5cGVzW2tdKTsKKyAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBib29sPiB2aXNpdGVkQ29kZWNzOworICAgIGZvciAoc2l6ZV90IHR5cGVfaXggPSAwOyB0eXBlX2l4IDwgYWxsTWVkaWFUeXBlcy5zaXplKCk7ICsrdHlwZV9peCkgeworICAgICAgICBjb25zdCBBU3RyaW5nICZtZWRpYVR5cGUgPSBhbGxNZWRpYVR5cGVzLmtleUF0KHR5cGVfaXgpOworICAgICAgICBwcmludGYoIlxuTWVkaWEgdHlwZSAnJXMnOlxuIiwgbWVkaWFUeXBlLmNfc3RyKCkpOworCisgICAgICAgIGZvciAoY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+ICZpbmZvIDogYWxsTWVkaWFUeXBlcy52YWx1ZUF0KHR5cGVfaXgpKSB7CisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBjYXBzID0gaW5mby0+Z2V0Q2FwYWJpbGl0aWVzRm9yKG1lZGlhVHlwZS5jX3N0cigpKTsKICAgICAgICAgICAgIGlmIChjYXBzID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIndhcm5pbmc6ICVzIGRvZXMgbm90IGhhdmUgY2FwYWJpbGl0aWVzIGZvciB0eXBlICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+Z2V0Q29kZWNOYW1lKCksIG1lZGlhVHlwZS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByaW50ZigiICAlcyAnJXMnIHN1cHBvcnRzICIsCisgICAgICAgICAgICBwcmludGYoIiAgJXMgXCIlc1wiIHN1cHBvcnRzXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1R5cGUsIGluZm8tPmdldENvZGVjTmFtZSgpKTsKIAotICAgICAgICAgICAgVmVjdG9yPE1lZGlhQ29kZWNJbmZvOjpQcm9maWxlTGV2ZWw+IHByb2ZpbGVMZXZlbHM7Ci0gICAgICAgICAgICBjYXBzLT5nZXRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKCZwcm9maWxlTGV2ZWxzKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlTGV2ZWxzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcHJpbnRmKCJOT1RISU5HLlxuIik7Ci0gICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBhdXRvIHByaW50TGlzdCA9IFtdKGNvbnN0IGNoYXIgKnR5cGUsIGNvbnN0IFZlY3RvcjxBU3RyaW5nPiAmdmFsdWVzKXsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgICAlczogWyIsIHR5cGUpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgdmFsdWVzLnNpemUoKTsgKytqKSB7CisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4gICAgICAlcyVzIiwgdmFsdWVzW2pdLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiA9PSB2YWx1ZXMuc2l6ZSgpIC0gMSA/ICIgIiA6ICIsIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50ZigiXVxuIik7CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBpZiAodmlzaXRlZENvZGVjcy5pbmRleE9mS2V5KGluZm8tPmdldENvZGVjTmFtZSgpKSA8IDApIHsKKyAgICAgICAgICAgICAgICB2aXNpdGVkQ29kZWNzLmFkZChpbmZvLT5nZXRDb2RlY05hbWUoKSwgdHJ1ZSk7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBWZWN0b3I8QVN0cmluZz4gYWxpYXNlczsKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Z2V0QWxpYXNlcygmYWxpYXNlcyk7CisgICAgICAgICAgICAgICAgICAgIC8vIHF1b3RlIGFsaWFzCisgICAgICAgICAgICAgICAgICAgIGZvciAoQVN0cmluZyAmYWxpYXMgOiBhbGlhc2VzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcy5pbnNlcnQoIlwiIiwgMSwgMCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhbGlhcy5hcHBlbmQoJyInKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwcmludExpc3QoImFsaWFzZXMiLCBhbGlhc2VzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhdHRycyA9IGluZm8tPmdldEF0dHJpYnV0ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+IGxpc3Q7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKEFTdHJpbmdQcmludGYoImVuY29kZXI6ICVkIiwgISEoYXR0cnMgJiBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc0VuY29kZXIpKSk7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKEFTdHJpbmdQcmludGYoInZlbmRvcjogJWQiLCAhIShhdHRycyAmIE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzVmVuZG9yKSkpOworICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZChBU3RyaW5nUHJpbnRmKCJzb2Z0d2FyZS1vbmx5OiAlZCIsICEhKGF0dHJzICYgTWVkaWFDb2RlY0luZm86OmtGbGFnSXNTb2Z0d2FyZU9ubHkpKSk7CisgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKEFTdHJpbmdQcmludGYoImh3LWFjY2VsZXJhdGVkOiAlZCIsICEhKGF0dHJzICYgTWVkaWFDb2RlY0luZm86OmtGbGFnSXNIYXJkd2FyZUFjY2VsZXJhdGVkKSkpOworICAgICAgICAgICAgICAgICAgICBwcmludExpc3QoQVN0cmluZ1ByaW50ZigiYXR0cmlidXRlczogJSN4IiwgYXR0cnMpLmNfc3RyKCksIGxpc3QpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHByaW50ZigiICAgIG93bmVyOiBcIiVzXCJcbiIsIGluZm8tPmdldE93bmVyTmFtZSgpKTsKKyAgICAgICAgICAgICAgICBwcmludGYoIiAgICByYW5rOiAldVxuIiwgaW5mby0+Z2V0UmFuaygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCIgICAgYWxpYXNlcywgYXR0cmlidXRlcywgb3duZXIsIHJhbms6IHNlZSBhYm92ZVxuIik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgcHJvZmlsZUxldmVscy5zaXplKCk7ICsraikgewotICAgICAgICAgICAgICAgIGNvbnN0IE1lZGlhQ29kZWNJbmZvOjpQcm9maWxlTGV2ZWwgJnByb2ZpbGVMZXZlbCA9IHByb2ZpbGVMZXZlbHNbal07CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+IGxpc3Q7CisgICAgICAgICAgICAgICAgVmVjdG9yPE1lZGlhQ29kZWNJbmZvOjpQcm9maWxlTGV2ZWw+IHByb2ZpbGVMZXZlbHM7CisgICAgICAgICAgICAgICAgY2Fwcy0+Z2V0U3VwcG9ydGVkUHJvZmlsZUxldmVscygmcHJvZmlsZUxldmVscyk7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBNZWRpYUNvZGVjSW5mbzo6UHJvZmlsZUxldmVsICZwbCA6IHByb2ZpbGVMZXZlbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmljZVByb2ZpbGUgPQorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfQVVESU9fQUFDKSAgID8gYXNTdHJpbmdfQUFDT2JqZWN0KHBsLm1Qcm9maWxlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19NUEVHMikgPyBhc1N0cmluZ19NUEVHMlByb2ZpbGUocGwubVByb2ZpbGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX0gyNjMpICA/IGFzU3RyaW5nX0gyNjNQcm9maWxlKHBsLm1Qcm9maWxlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19NUEVHNCkgPyBhc1N0cmluZ19NUEVHNFByb2ZpbGUocGwubVByb2ZpbGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX0FWQykgICA/IGFzU3RyaW5nX0FWQ1Byb2ZpbGUocGwubVByb2ZpbGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX1ZQOCkgICA/IGFzU3RyaW5nX1ZQOFByb2ZpbGUocGwubVByb2ZpbGUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX0hFVkMpICA/IGFzU3RyaW5nX0hFVkNQcm9maWxlKHBsLm1Qcm9maWxlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19WUDkpICAgPyBhc1N0cmluZ19WUDlQcm9maWxlKHBsLm1Qcm9maWxlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19BVjEpICAgPyBhc1N0cmluZ19BVjFQcm9maWxlKHBsLm1Qcm9maWxlKSA6Ij8/IjsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmljZUxldmVsID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX01QRUcyKSA/IGFzU3RyaW5nX01QRUcyTGV2ZWwocGwubUxldmVsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19IMjYzKSAgPyBhc1N0cmluZ19IMjYzTGV2ZWwocGwubUxldmVsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19NUEVHNCkgPyBhc1N0cmluZ19NUEVHNExldmVsKHBsLm1MZXZlbCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFUeXBlLmVxdWFsc0lnbm9yZUNhc2UoTUlNRVRZUEVfVklERU9fQVZDKSAgID8gYXNTdHJpbmdfQVZDTGV2ZWwocGwubUxldmVsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19WUDgpICAgPyBhc1N0cmluZ19WUDhMZXZlbChwbC5tTGV2ZWwpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX0hFVkMpICA/IGFzU3RyaW5nX0hFVkNUaWVyTGV2ZWwocGwubUxldmVsKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYVR5cGUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19WUDkpICAgPyBhc1N0cmluZ19WUDlMZXZlbChwbC5tTGV2ZWwpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5lcXVhbHNJZ25vcmVDYXNlKE1JTUVUWVBFX1ZJREVPX0FWMSkgICA/IGFzU3RyaW5nX0FWMUxldmVsKHBsLm1MZXZlbCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgIj8/IjsKIAotICAgICAgICAgICAgICAgIHByaW50ZigiJXMldS8ldSIsIGogPiAwID8gIiwgIiA6ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZUxldmVsLm1Qcm9maWxlLCBwcm9maWxlTGV2ZWwubUxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoQVN0cmluZ1ByaW50ZigiJSA1dS8lIDV1ICglcy8lcykiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsLm1Qcm9maWxlLCBwbC5tTGV2ZWwsIG5pY2VQcm9maWxlLCBuaWNlTGV2ZWwpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRMaXN0KCJwcm9maWxlL2xldmVscyIsIGxpc3QpOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBwcmludGYoIlxuIik7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVmVjdG9yPEFTdHJpbmc+IGxpc3Q7CisgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQzMl90PiBjb2xvcnM7CisgICAgICAgICAgICAgICAgY2Fwcy0+Z2V0U3VwcG9ydGVkQ29sb3JGb3JtYXRzKCZjb2xvcnMpOworICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgY29sb3IgOiBjb2xvcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoQVN0cmluZ1ByaW50ZigiJSN4ICglcykiLCBjb2xvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZ19Db2xvckZvcm1hdCgoaW50MzJfdCljb2xvcikpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHJpbnRMaXN0KCJjb2xvcnMiLCBsaXN0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcHJpbnRmKCIgICAgZGV0YWlsczogJXNcbiIsIGNhcHMtPmdldERldGFpbHMoKS0+ZGVidWdTdHJpbmcoNikuY19zdHIoKSk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC02ODgsNyArNzgwLDcgQEAKIAogICAgIGJvb2wgYXVkaW9Pbmx5ID0gZmFsc2U7CiAgICAgYm9vbCBsaXN0Q29tcG9uZW50cyA9IGZhbHNlOwotICAgIGJvb2wgZHVtcFByb2ZpbGVzID0gZmFsc2U7CisgICAgYm9vbCBkdW1wQ29kZWNJbmZvID0gZmFsc2U7CiAgICAgYm9vbCBleHRyYWN0VGh1bWJuYWlsID0gZmFsc2U7CiAgICAgYm9vbCBzZWVrVGVzdCA9IGZhbHNlOwogICAgIGJvb2wgdXNlU3VyZmFjZUFsbG9jID0gZmFsc2U7CkBAIC03MDUsMTAgKzc5NywxMCBAQAogICAgIGdXcml0ZU1QNCA9IGZhbHNlOwogICAgIGdEaXNwbGF5SGlzdG9ncmFtID0gZmFsc2U7CiAKLSAgICBzcDxBTG9vcGVyPiBsb29wZXI7CisgICAgc3A8YW5kcm9pZDo6QUxvb3Blcj4gbG9vcGVyOwogCiAgICAgaW50IHJlczsKLSAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaGFxbjpsbTpiOnB0c3JvdzprTjp4U1RkOkQ6IikpID49IDApIHsKKyAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAidmhhcW46bG06YjppdHNyb3c6a046eFNUZDpEOiIpKSA+PSAwKSB7CiAgICAgICAgIHN3aXRjaCAocmVzKSB7CiAgICAgICAgICAgICBjYXNlICdhJzoKICAgICAgICAgICAgIHsKQEAgLTc3OCw5ICs4NzAsOSBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBjYXNlICdwJzoKKyAgICAgICAgICAgIGNhc2UgJ2knOgogICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGR1bXBQcm9maWxlcyA9IHRydWU7CisgICAgICAgICAgICAgICAgZHVtcENvZGVjSW5mbyA9IHRydWU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKQEAgLTgzMiw2ICs5MjQsMTIgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgY2FzZSAndic6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZ1ZlcmJvc2UgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBjYXNlICc/JzoKICAgICAgICAgICAgIGNhc2UgJ2gnOgogICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTkxNSw5ICsxMDEzLDkgQEAKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQogCi0gICAgaWYgKGR1bXBQcm9maWxlcykgewotICAgICAgICBkdW1wQ29kZWNQcm9maWxlcyh0cnVlIC8qIHF1ZXJ5RGVjb2RlcnMgKi8pOwotICAgICAgICBkdW1wQ29kZWNQcm9maWxlcyhmYWxzZSAvKiBxdWVyeURlY29kZXJzICovKTsKKyAgICBpZiAoZHVtcENvZGVjSW5mbykgeworICAgICAgICBkdW1wQ29kZWNEZXRhaWxzKHRydWUgLyogcXVlcnlEZWNvZGVycyAqLyk7CisgICAgICAgIGR1bXBDb2RlY0RldGFpbHMoZmFsc2UgLyogcXVlcnlEZWNvZGVycyAqLyk7CiAgICAgfQogCiAgICAgaWYgKGxpc3RDb21wb25lbnRzKSB7CkBAIC05ODcsNyArMTA4NSw3IEBACiAgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gYXJndltrXTsKIAogICAgICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0KLSAgICAgICAgICAgIERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVGcm9tVVJJKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIGZpbGVuYW1lKTsKKyAgICAgICAgICAgIERhdGFTb3VyY2VGYWN0b3J5OjpnZXRJbnN0YW5jZSgpLT5DcmVhdGVGcm9tVVJJKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIGZpbGVuYW1lKTsKIAogICAgICAgICBpZiAoc3RybmNhc2VjbXAoZmlsZW5hbWUsICJzaW5lOiIsIDUpICYmIGRhdGFTb3VyY2UgPT0gTlVMTCkgewogICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gY3JlYXRlIGRhdGEgc291cmNlLlxuIik7CmRpZmYgLS1naXQgYS9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAgYi9jbWRzL3N0YWdlZnJpZ2h0L3N0cmVhbS5jcHAKaW5kZXggYjAxOTlkOC4uMjJlMmVmMyAxMDA2NDQKLS0tIGEvY21kcy9zdGFnZWZyaWdodC9zdHJlYW0uY3BwCisrKyBiL2NtZHMvc3RhZ2VmcmlnaHQvc3RyZWFtLmNwcApAQCAtMjEsMTcgKzIxLDE3IEBACiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+IC8vIGZvciBwcm9wZXJ0eV9nZXQKIAorI2luY2x1ZGUgPGRhdGFzb3VyY2UvRGF0YVNvdXJjZUZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JU3RyZWFtU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9tZWRpYXBsYXllci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUcyVFNXcml0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAKQEAgLTE2NCw3ICsxNjQsNyBAQAogICAgIDogbUN1cnJlbnRCdWZmZXJJbmRleCgtMSksCiAgICAgICBtQ3VycmVudEJ1ZmZlck9mZnNldCgwKSB7CiAgICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSA9Ci0gICAgICAgIERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVGcm9tVVJJKE5VTEwgLyogaHR0cFNlcnZpY2UgKi8sIGZpbGVuYW1lKTsKKyAgICAgICAgRGF0YVNvdXJjZUZhY3Rvcnk6OmdldEluc3RhbmNlKCktPkNyZWF0ZUZyb21VUkkoTlVMTCAvKiBodHRwU2VydmljZSAqLywgZmlsZW5hbWUpOwogCiAgICAgQ0hFQ0soZGF0YVNvdXJjZSAhPSBOVUxMKTsKIApAQCAtMzE4LDEwICszMTgsMTIgQEAKICAgICBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IGNvbXBvc2VyQ2xpZW50ID0gbmV3IFN1cmZhY2VDb21wb3NlckNsaWVudDsKICAgICBDSEVDS19FUShjb21wb3NlckNsaWVudC0+aW5pdENoZWNrKCksIChzdGF0dXNfdClPSyk7CiAKLSAgICBzcDxJQmluZGVyPiBkaXNwbGF5KFN1cmZhY2VDb21wb3NlckNsaWVudDo6Z2V0QnVpbHRJbkRpc3BsYXkoCi0gICAgICAgICAgICBJU3VyZmFjZUNvbXBvc2VyOjplRGlzcGxheUlkTWFpbikpOworICAgIGNvbnN0IHNwPElCaW5kZXI+IGRpc3BsYXkgPSBTdXJmYWNlQ29tcG9zZXJDbGllbnQ6OmdldEludGVybmFsRGlzcGxheVRva2VuKCk7CisgICAgQ0hFQ0soZGlzcGxheSAhPSBudWxscHRyKTsKKwogICAgIERpc3BsYXlJbmZvIGluZm87Ci0gICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhkaXNwbGF5LCAmaW5mbyk7CisgICAgQ0hFQ0tfRVEoU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpnZXREaXNwbGF5SW5mbyhkaXNwbGF5LCAmaW5mbyksIE5PX0VSUk9SKTsKKwogICAgIHNzaXplX3QgZGlzcGxheVdpZHRoID0gaW5mby53OwogICAgIHNzaXplX3QgZGlzcGxheUhlaWdodCA9IGluZm8uaDsKIApkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9Ecm1FbmdpbmVCYXNlLmNwcCBiL2RybS9jb21tb24vRHJtRW5naW5lQmFzZS5jcHAKaW5kZXggZjczNDkwNS4uYWVjNTk1OSAxMDA2NDQKLS0tIGEvZHJtL2NvbW1vbi9Ecm1FbmdpbmVCYXNlLmNwcAorKysgYi9kcm0vY29tbW9uL0RybUVuZ2luZUJhc2UuY3BwCkBAIC03OSwxMiArNzksMTIgQEAKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6Y29uc3VtZVJpZ2h0cygKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgeworICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgewogICAgIHJldHVybiBvbkNvbnN1bWVSaWdodHModW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGFjdGlvbiwgcmVzZXJ2ZSk7CiB9CiAKIHN0YXR1c190IERybUVuZ2luZUJhc2U6OnNldFBsYXliYWNrU3RhdHVzKAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CiAgICAgcmV0dXJuIG9uU2V0UGxheWJhY2tTdGF0dXModW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CiB9CiAKQEAgLTEyMCw3ICsxMjAsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIqIG1pbWUpIHsKIAogICAgIGlmICghbWltZSB8fCBtaW1lWzBdID09ICdcMCcpIHsKQEAgLTEzMSw3ICsxMzEsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAgICAgaWYgKCFtaW1lIHx8IG1pbWVbMF0gPT0gJ1wwJykgewogICAgICAgICByZXR1cm4gb25PcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIHVyaSk7CkBAIC0xMzksMzMgKzEzOSwzMyBAQAogICAgIHJldHVybiBvbk9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgdXJpLCBtaW1lKTsKIH0KIAotc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6b3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK3N0YXR1c190IERybUVuZ2luZUJhc2U6Om9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpIHsKICAgICByZXR1cm4gb25PcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGJ1ZiwgbWltZVR5cGUpOwogfQogCi1zdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgcmV0dXJuIG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSk7CiB9CiAKIHN0YXR1c190IERybUVuZ2luZUJhc2U6OmluaXRpYWxpemVEZWNyeXB0VW5pdCgKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSB7CiAgICAgcmV0dXJuIG9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBoZWFkZXJJbmZvKTsKIH0KIAogc3RhdHVzX3QgRHJtRW5naW5lQmFzZTo6ZGVjcnlwdCgKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpIHsKICAgICByZXR1cm4gb25EZWNyeXB0KHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLCBlbmNCdWZmZXIsIGRlY0J1ZmZlciwgSVYpOwogfQogCiBzdGF0dXNfdCBEcm1FbmdpbmVCYXNlOjpmaW5hbGl6ZURlY3J5cHRVbml0KAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKKyAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgewogICAgIHJldHVybiBvbkZpbmFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQpOwogfQogCiBzc2l6ZV90IERybUVuZ2luZUJhc2U6OnByZWFkKAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgeworICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpIHsKICAgICByZXR1cm4gb25QcmVhZCh1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYnVmZmVyLCBudW1CeXRlcywgb2Zmc2V0KTsKIH0KIApkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9JRHJtTWFuYWdlclNlcnZpY2UuY3BwIGIvZHJtL2NvbW1vbi9JRHJtTWFuYWdlclNlcnZpY2UuY3BwCmluZGV4IDQ0Zjk4ZGQuLmE2ZDMzYjAgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vSURybU1hbmFnZXJTZXJ2aWNlLmNwcAorKysgYi9kcm0vY29tbW9uL0lEcm1NYW5hZ2VyU2VydmljZS5jcHAKQEAgLTM5LDcgKzM5LDcgQEAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCiBzdGF0aWMgdm9pZCB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoCi0gICAgICAgIGNvbnN0IERlY3J5cHRIYW5kbGUqIGhhbmRsZSwgUGFyY2VsKiBkYXRhKSB7CisgICAgICAgIGNvbnN0IHNwPERlY3J5cHRIYW5kbGU+JiBoYW5kbGUsIFBhcmNlbCogZGF0YSkgewogICAgIGRhdGEtPndyaXRlSW50MzIoaGFuZGxlLT5kZWNyeXB0SWQpOwogICAgIGRhdGEtPndyaXRlU3RyaW5nOChoYW5kbGUtPm1pbWVUeXBlKTsKICAgICBkYXRhLT53cml0ZUludDMyKGhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUpOwpAQCAtNjcsNyArNjcsNyBAQAogfQogCiBzdGF0aWMgdm9pZCByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKAotICAgICAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUsIGNvbnN0IFBhcmNlbCYgZGF0YSkgeworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgaGFuZGxlLCBjb25zdCBQYXJjZWwmIGRhdGEpIHsKICAgICBpZiAoMCA9PSBkYXRhLmRhdGFBdmFpbCgpKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC05OSw3ICs5OSw3IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjbGVhckRlY3J5cHRIYW5kbGUoRGVjcnlwdEhhbmRsZSogaGFuZGxlKSB7CitzdGF0aWMgdm9pZCBjbGVhckRlY3J5cHRIYW5kbGUoc3A8RGVjcnlwdEhhbmRsZT4gJmhhbmRsZSkgewogICAgIGlmIChoYW5kbGUgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNDE0LDcgKzQxNCw3IEBACiB9CiAKIHN0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmNvbnN1bWVSaWdodHMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CiAgICAgQUxPR1YoImNvbnN1bWVSaWdodHMiKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAKQEAgLTQzMSw3ICs0MzEsNyBAQAogfQogCiBzdGF0dXNfdCBCcERybU1hbmFnZXJTZXJ2aWNlOjpzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pIHsKICAgICBBTE9HVigic2V0UGxheWJhY2tTdGF0dXMiKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAKQEAgLTYwMyw3ICs2MDMsNyBAQAogICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKIH0KIAotRGVjcnlwdEhhbmRsZSogQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24iKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC02MjEsNyArNjIxLDcgQEAKIAogICAgIHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX0RFQ1JZUFRfU0VTU0lPTiwgZGF0YSwgJnJlcGx5KTsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IE5VTEw7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlOwogICAgIGlmICgwICE9IHJlcGx5LmRhdGFBdmFpbCgpKSB7CiAgICAgICAgIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CiAgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCByZXBseSk7CkBAIC02MjksNyArNjI5LDcgQEAKICAgICByZXR1cm4gaGFuZGxlOwogfQogCi1EZWNyeXB0SGFuZGxlKiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBCcERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAKICAgICBBTE9HVigiRW50ZXJpbmcgQnBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uOiBtaW1lPSVzIiwgbWltZT8gbWltZTogIk5VTEwiKTsKQEAgLTY0Niw3ICs2NDYsNyBAQAogCiAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fREVDUllQVF9TRVNTSU9OX0ZST01fVVJJLCBkYXRhLCAmcmVwbHkpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gTlVMTDsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGU7CiAgICAgaWYgKDAgIT0gcmVwbHkuZGF0YUF2YWlsKCkpIHsKICAgICAgICAgaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKICAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIHJlcGx5KTsKQEAgLTY1Niw3ICs2NTYsNyBAQAogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKLURlY3J5cHRIYW5kbGUqIEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIEJwRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbiIpOwogICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTY3Myw3ICs2NzMsNyBAQAogCiAgICAgcmVtb3RlKCktPnRyYW5zYWN0KE9QRU5fREVDUllQVF9TRVNTSU9OX0ZPUl9TVFJFQU1JTkcsIGRhdGEsICZyZXBseSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBOVUxMOworICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZTsKICAgICBpZiAoMCAhPSByZXBseS5kYXRhQXZhaWwoKSkgewogICAgICAgICBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOwogICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgcmVwbHkpOwpAQCAtNjgzLDcgKzY4Myw3IEBACiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKK3N0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgewogICAgIEFMT0dWKCJjbG9zZURlY3J5cHRTZXNzaW9uIik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogCkBAIC02OTgsNyArNjk4LDcgQEAKIH0KIAogc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6aW5pdGlhbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKICAgICBBTE9HVigiaW5pdGlhbGl6ZURlY3J5cHRVbml0Iik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtNzE4LDcgKzcxOCw3IEBACiB9CiAKIHN0YXR1c190IEJwRHJtTWFuYWdlclNlcnZpY2U6OmRlY3J5cHQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSB7CiAgICAgQUxPR1YoImRlY3J5cHQiKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CkBAIC03NTQsNyArNzU0LDcgQEAKIH0KIAogc3RhdHVzX3QgQnBEcm1NYW5hZ2VyU2VydmljZTo6ZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CiAgICAgQUxPR1YoImZpbmFsaXplRGVjcnlwdFVuaXQiKTsKICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAKQEAgLTc3MCw3ICs3NzAsNyBAQAogfQogCiBzc2l6ZV90IEJwRHJtTWFuYWdlclNlcnZpY2U6OnByZWFkKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCB2b2lkKiBidWZmZXIsCisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCB2b2lkKiBidWZmZXIsCiAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgewogICAgIEFMT0dWKCJyZWFkIik7CiAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtMTEyOCwxNiArMTEyOCwxNiBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7Ci0gICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoJmhhbmRsZSwgZGF0YSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAogICAgICAgICBjb25zdCBpbnQgYWN0aW9uID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgY29uc3QgYm9vbCByZXNlcnZlID0gc3RhdGljX2Nhc3Q8Ym9vbD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cwotICAgICAgICAgICAgPSBjb25zdW1lUmlnaHRzKHVuaXF1ZUlkLCAmaGFuZGxlLCBhY3Rpb24sIHJlc2VydmUpOworICAgICAgICAgICAgPSBjb25zdW1lUmlnaHRzKHVuaXF1ZUlkLCBoYW5kbGUsIGFjdGlvbiwgcmVzZXJ2ZSk7CiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAKLSAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKCZoYW5kbGUpOworICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICB9CiAKQEAgLTExNDgsMTYgKzExNDgsMTYgQEAKIAogICAgICAgICBjb25zdCBpbnQgdW5pcXVlSWQgPSBkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgIERlY3J5cHRIYW5kbGUgaGFuZGxlOwotICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKCZoYW5kbGUsIGRhdGEpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgICAgICByZWFkRGVjcnlwdEhhbmRsZUZyb21QYXJjZWxEYXRhKGhhbmRsZSwgZGF0YSk7CiAKICAgICAgICAgY29uc3QgaW50IHBsYXliYWNrU3RhdHVzID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgY29uc3QgaW50NjRfdCBwb3NpdGlvbiA9IGRhdGEucmVhZEludDY0KCk7CiAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cwotICAgICAgICAgICAgPSBzZXRQbGF5YmFja1N0YXR1cyh1bmlxdWVJZCwgJmhhbmRsZSwgcGxheWJhY2tTdGF0dXMsIHBvc2l0aW9uKTsKKyAgICAgICAgICAgID0gc2V0UGxheWJhY2tTdGF0dXModW5pcXVlSWQsIGhhbmRsZSwgcGxheWJhY2tTdGF0dXMsIHBvc2l0aW9uKTsKICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKIAotICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoJmhhbmRsZSk7CisgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogICAgIH0KIApAQCAtMTMyOSwxMyArMTMyOSwxMyBAQAogICAgICAgICBjb25zdCBvZmY2NF90IGxlbmd0aCA9IGRhdGEucmVhZEludDY0KCk7CiAgICAgICAgIGNvbnN0IFN0cmluZzggbWltZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlCiAgICAgICAgICAgICA9IG9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZmQsIG9mZnNldCwgbGVuZ3RoLCBtaW1lLnN0cmluZygpKTsKIAotICAgICAgICBpZiAoTlVMTCAhPSBoYW5kbGUpIHsKLSAgICAgICAgICAgIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YShoYW5kbGUsIHJlcGx5KTsKKyAgICAgICAgaWYgKE5VTEwgIT0gaGFuZGxlLmdldCgpKSB7CisgICAgICAgICAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoaGFuZGxlLmdldCgpLCByZXBseSk7CiAgICAgICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKLSAgICAgICAgICAgIGRlbGV0ZSBoYW5kbGU7IGhhbmRsZSA9IE5VTEw7CisgICAgICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICAgICAgfQogICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogICAgIH0KQEAgLTEzNDksMTMgKzEzNDksMTMgQEAKICAgICAgICAgY29uc3QgU3RyaW5nOCB1cmkgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CiAgICAgICAgIGNvbnN0IFN0cmluZzggbWltZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBvcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIHVyaS5zdHJpbmcoKSwgbWltZS5zdHJpbmcoKSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG9wZW5EZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgdXJpLnN0cmluZygpLCBtaW1lLnN0cmluZygpKTsKIAotICAgICAgICBpZiAoTlVMTCAhPSBoYW5kbGUpIHsKLSAgICAgICAgICAgIHdyaXRlRGVjcnlwdEhhbmRsZVRvUGFyY2VsRGF0YShoYW5kbGUsIHJlcGx5KTsKKyAgICAgICAgaWYgKE5VTEwgIT0gaGFuZGxlLmdldCgpKSB7CisgICAgICAgICAgICB3cml0ZURlY3J5cHRIYW5kbGVUb1BhcmNlbERhdGEoaGFuZGxlLmdldCgpLCByZXBseSk7CiAKICAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwotICAgICAgICAgICAgZGVsZXRlIGhhbmRsZTsgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgICAgIGhhbmRsZS5jbGVhcigpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR1YoIk5VTEwgZGVjcnlwdEhhbmRsZSBpcyByZXR1cm5lZCIpOwogICAgICAgICB9CkBAIC0xMzczLDEzICsxMzczLDEyIEBACiAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSk7CiAgICAgICAgIGNvbnN0IFN0cmluZzggbWltZVR5cGUoZGF0YS5yZWFkU3RyaW5nOCgpKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBvcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGJ1ZiwgbWltZVR5cGUpOworICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBvcGVuRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGJ1ZiwgbWltZVR5cGUpOwogCiAgICAgICAgIGlmIChoYW5kbGUgIT0gTlVMTCkgewogICAgICAgICAgICAgd3JpdGVEZWNyeXB0SGFuZGxlVG9QYXJjZWxEYXRhKGhhbmRsZSwgcmVwbHkpOwogICAgICAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7Ci0gICAgICAgICAgICBkZWxldGUgaGFuZGxlOwotICAgICAgICAgICAgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgICAgIGhhbmRsZS5jbGVhcigpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR1YoIk5VTEwgZGVjcnlwdEhhbmRsZSBpcyByZXR1cm5lZCIpOwogICAgICAgICB9CkBAIC0xMzkzLDcgKzEzOTIsNyBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKICAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIGRhdGEpOwogCiAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IGNsb3NlRGVjcnlwdFNlc3Npb24odW5pcXVlSWQsIGhhbmRsZSk7CkBAIC0xNDA4LDggKzE0MDcsOCBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7Ci0gICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoJmhhbmRsZSwgZGF0YSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAogICAgICAgICBjb25zdCBpbnQgZGVjcnlwdFVuaXRJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKQEAgLTE0MTcsMTcgKzE0MTYsMTcgQEAKICAgICAgICAgY29uc3QgdWludDMyX3QgYnVmZmVyU2l6ZSA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgIGlmIChidWZmZXJTaXplID4gZGF0YS5kYXRhQXZhaWwoKSkgewogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoQkFEX1ZBTFVFKTsKLSAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICAgICAgfQogICAgICAgICBEcm1CdWZmZXIqIGhlYWRlckluZm8gPSBOVUxMOwogICAgICAgICBoZWFkZXJJbmZvID0gbmV3IERybUJ1ZmZlcigoY2hhciAqKWRhdGEucmVhZElucGxhY2UoYnVmZmVyU2l6ZSksIGJ1ZmZlclNpemUpOwogCiAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cwotICAgICAgICAgICAgPSBpbml0aWFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsICZoYW5kbGUsIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOworICAgICAgICAgICAgPSBpbml0aWFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsIGhhbmRsZSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7CiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAKLSAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKCZoYW5kbGUpOworICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgZGVsZXRlIGhlYWRlckluZm87IGhlYWRlckluZm8gPSBOVUxMOwogICAgICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogICAgIH0KQEAgLTE0MzksOCArMTQzOCw4IEBACiAKICAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlIGhhbmRsZTsKLSAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YSgmaGFuZGxlLCBkYXRhKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGU7CisgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAogICAgICAgICBjb25zdCBpbnQgZGVjcnlwdFVuaXRJZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgIGNvbnN0IHVpbnQzMl90IGRlY0J1ZmZlclNpemUgPSBkYXRhLnJlYWRJbnQzMigpOwpAQCAtMTQ1MCw3ICsxNDQ5LDcgQEAKICAgICAgICAgICAgIGRlY0J1ZmZlclNpemUgPiBNQVhfQklOREVSX1RSQU5TQUNUSU9OX1NJWkUpIHsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKEJBRF9WQUxVRSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMigwKTsKLSAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZShoYW5kbGUpOwogICAgICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICAgICAgfQogCkBAIC0xNDcwLDcgKzE0NjksNyBAQAogICAgICAgICB9CiAKICAgICAgICAgY29uc3Qgc3RhdHVzX3Qgc3RhdHVzCi0gICAgICAgICAgICA9IGRlY3J5cHQodW5pcXVlSWQsICZoYW5kbGUsIGRlY3J5cHRVbml0SWQsIGVuY0J1ZmZlciwgJmRlY0J1ZmZlciwgSVYpOworICAgICAgICAgICAgPSBkZWNyeXB0KHVuaXF1ZUlkLCBoYW5kbGUsIGRlY3J5cHRVbml0SWQsIGVuY0J1ZmZlciwgJmRlY0J1ZmZlciwgSVYpOwogCiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAKQEAgLTE0ODAsNyArMTQ3OSw3IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGUoZGVjQnVmZmVyLT5kYXRhLCBzaXplKTsKICAgICAgICAgfQogCi0gICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIGRlbGV0ZSBlbmNCdWZmZXI7IGVuY0J1ZmZlciA9IE5VTEw7CiAgICAgICAgIGRlbGV0ZSBkZWNCdWZmZXI7IGRlY0J1ZmZlciA9IE5VTEw7CiAgICAgICAgIGRlbGV0ZSBbXSBidWZmZXI7IGJ1ZmZlciA9IE5VTEw7CkBAIC0xNDk1LDEzICsxNDk0LDEzIEBACiAKICAgICAgICAgY29uc3QgaW50IHVuaXF1ZUlkID0gZGF0YS5yZWFkSW50MzIoKTsKIAotICAgICAgICBEZWNyeXB0SGFuZGxlIGhhbmRsZTsKLSAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YSgmaGFuZGxlLCBkYXRhKTsKKyAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICAgICAgcmVhZERlY3J5cHRIYW5kbGVGcm9tUGFyY2VsRGF0YShoYW5kbGUsIGRhdGEpOwogCi0gICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IGZpbmFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsICZoYW5kbGUsIGRhdGEucmVhZEludDMyKCkpOworICAgICAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBmaW5hbGl6ZURlY3J5cHRVbml0KHVuaXF1ZUlkLCBoYW5kbGUsIGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogCi0gICAgICAgIGNsZWFyRGVjcnlwdEhhbmRsZSgmaGFuZGxlKTsKKyAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAgICAgfQogCkBAIC0xNTEyLDggKzE1MTEsOCBAQAogCiAgICAgICAgIGNvbnN0IGludCB1bmlxdWVJZCA9IGRhdGEucmVhZEludDMyKCk7CiAKLSAgICAgICAgRGVjcnlwdEhhbmRsZSBoYW5kbGU7Ci0gICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoJmhhbmRsZSwgZGF0YSk7CisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7CisgICAgICAgIHJlYWREZWNyeXB0SGFuZGxlRnJvbVBhcmNlbERhdGEoaGFuZGxlLCBkYXRhKTsKIAogICAgICAgICBjb25zdCB1aW50MzJfdCBudW1CeXRlcyA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgIGlmIChudW1CeXRlcyA+IE1BWF9CSU5ERVJfVFJBTlNBQ1RJT05fU0laRSkgewpAQCAtMTUyNCwxMyArMTUyMywxMyBAQAogCiAgICAgICAgIGNvbnN0IG9mZjY0X3Qgb2Zmc2V0ID0gZGF0YS5yZWFkSW50NjQoKTsKIAotICAgICAgICBzc2l6ZV90IHJlc3VsdCA9IHByZWFkKHVuaXF1ZUlkLCAmaGFuZGxlLCBidWZmZXIsIG51bUJ5dGVzLCBvZmZzZXQpOworICAgICAgICBzc2l6ZV90IHJlc3VsdCA9IHByZWFkKHVuaXF1ZUlkLCBoYW5kbGUsIGJ1ZmZlciwgbnVtQnl0ZXMsIG9mZnNldCk7CiAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHJlc3VsdCk7CiAgICAgICAgIGlmICgwIDwgcmVzdWx0KSB7CiAgICAgICAgICAgICByZXBseS0+d3JpdGUoYnVmZmVyLCByZXN1bHQpOwogICAgICAgICB9CiAKLSAgICAgICAgY2xlYXJEZWNyeXB0SGFuZGxlKCZoYW5kbGUpOworICAgICAgICBjbGVhckRlY3J5cHRIYW5kbGUoaGFuZGxlKTsKICAgICAgICAgZGVsZXRlIFtdIGJ1ZmZlciwgYnVmZmVyID0gTlVMTDsKICAgICAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKICAgICB9CmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0RybUVuZ2luZUJhc2UuaAppbmRleCA0MTcxMDdmLi43M2YxMWE0IDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL2luY2x1ZGUvRHJtRW5naW5lQmFzZS5oCisrKyBiL2RybS9jb21tb24vaW5jbHVkZS9Ecm1FbmdpbmVCYXNlLmgKQEAgLTU5LDEwICs1OSwxMSBAQAogCiAgICAgaW50IGNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbik7CiAKLSAgICBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKKyAgICBzdGF0dXNfdCBjb25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sCisgICAgICAgICAgICBib29sIHJlc2VydmUpOwogCiAgICAgc3RhdHVzX3Qgc2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOwogCiAgICAgYm9vbCB2YWxpZGF0ZUFjdGlvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKQEAgLTgwLDI3ICs4MSwyOCBAQAogICAgIERybVN1cHBvcnRJbmZvKiBnZXRTdXBwb3J0SW5mbyhpbnQgdW5pcXVlSWQpOwogCiAgICAgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKTsKIAogICAgIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmksIGNvbnN0IGNoYXIqIG1pbWUpOwogCi0gICAgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSk7CiAKLSAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisgICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAotICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKIAotICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVik7CiAKLSAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpOworICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkKTsKIAotICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwgc3NpemVfdCBudW1CeXRlcywgb2ZmNjRfdCBvZmZzZXQpOwogCiBwcm90ZWN0ZWQ6CkBAIC0yNjUsNyArMjY3LDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSA9IDA7CiAKICAgICAvKioKQEAgLTI4MCw3ICsyODIsOCBAQAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9uU2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgPSAwOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLAorICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvbikgPSAwOwogCiAgICAgLyoqCiAgICAgICogVmFsaWRhdGVzIHdoZXRoZXIgYW4gYWN0aW9uIG9uIHRoZSBEUk0gY29udGVudCBpcyBhbGxvd2VkIG9yIG5vdC4KQEAgLTM4MSw3ICszODQsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCkgPSAwOwogCiAgICAgLyoqCkBAIC0zOTgsNyArNDAxLDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgLyogdW5pcXVlSWQgKi8sIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICBpbnQgLyogdW5pcXVlSWQgKi8sIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLAogICAgICAgICAgICAgaW50IC8qIGZkICovLCBvZmY2NF90IC8qIG9mZnNldCAqLywgb2ZmNjRfdCAvKiBsZW5ndGggKi8sCiAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiBtaW1lICovKSB7CiAKQEAgLTQxNSw3ICs0MTgsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBjb25zdCBjaGFyKiB1cmkpID0gMDsKIAogICAgIC8qKgpAQCAtNDMwLDcgKzQzMyw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IC8qIHVuaXF1ZUlkICovLCBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgaW50IC8qIHVuaXF1ZUlkICovLCBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIC8qIHVyaSAqLywgY29uc3QgY2hhciogLyogbWltZSAqLykgewogCiAgICAgICAgIHJldHVybiBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKQEAgLTQ0Nyw3ICs0NTAsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXImIC8qIGJ1ZiAqLywKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIC8qIG1pbWVUeXBlICovKSB7CiAgICAgICAgIHJldHVybiBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRTsKQEAgLTQ2MSw3ICs0NjQsNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgPSAwOwogCiAgICAgLyoqCiAgICAgICogSW5pdGlhbGl6ZSBkZWNyeXB0aW9uIGZvciB0aGUgZ2l2ZW4gdW5pdCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKQEAgLTQ3Myw3ICs0NzYsNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgPSAwOwogCiAgICAgLyoqCkBAIC00OTMsNyArNDk2LDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX1NFU1NJT05fTk9UX09QRU5FRCwgRFJNX0VSUk9SX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQsCiAgICAgICogICAgIERSTV9FUlJPUl9ERUNSWVBUIGZvciBmYWlsdXJlLgogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25EZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgdmlydHVhbCBzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSA9IDA7CiAKICAgICAvKioKQEAgLTUwNiw3ICs1MDksNyBAQAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9uRmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBSZWFkcyB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmcm9tIGFuIG9wZW4gRFJNIGZpbGUuCkBAIC01MTksNyArNTIyLDcgQEAKICAgICAgKgogICAgICAqIEByZXR1cm4gTnVtYmVyIG9mIGJ5dGVzIHJlYWQuIFJldHVybnMgLTEgZm9yIEZhaWx1cmUuCiAgICAgICovCi0gICAgdmlydHVhbCBzc2l6ZV90IG9uUHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KSA9IDA7CiB9OwogCmRpZmYgLS1naXQgYS9kcm0vY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1FbmdpbmUuaAppbmRleCBhY2M4ZWQ5Li4xODM3YTExIDEwMDY0NAotLS0gYS9kcm0vY29tbW9uL2luY2x1ZGUvSURybUVuZ2luZS5oCisrKyBiL2RybS9jb21tb24vaW5jbHVkZS9JRHJtRW5naW5lLmgKQEAgLTIxMCw3ICsyMTAsNyBAQAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbnN1bWVSaWdodHMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgPSAwOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBJbmZvcm1zIHRoZSBEUk0gRW5naW5lIGFib3V0IHRoZSBwbGF5YmFjayBhY3Rpb25zIHBlcmZvcm1lZCBvbiB0aGUgRFJNIGZpbGVzLgpAQCAtMjIzLDcgKzIyMyw3IEBACiAgICAgICogQHJldHVybiBzdGF0dXNfdAogICAgICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pID0gMDsKIAogICAgIC8qKgpAQCAtMzI3LDcgKzMyNyw3IEBACiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSkgPSAwOwogCiAgICAgLyoqCkBAIC0zNDIsNyArMzQyLDcgQEAKICAgICAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgPSAwOwogCiAgICAgLyoqCkBAIC0zNTUsNyArMzU1LDcgQEAKICAgICAgKiBAcmV0dXJuCiAgICAgICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAgICAgKi8KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgPSAwOwogCiAgICAgLyoqCkBAIC0zNjYsNyArMzY2LDcgQEAKICAgICAgKiBAcmV0dXJuIHN0YXR1c190CiAgICAgICogICAgIFJldHVybnMgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzLCBEUk1fRVJST1JfVU5LTk9XTiBmb3IgZmFpbHVyZQogICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgPSAwOwogCiAgICAgLyoqCiAgICAgICogSW5pdGlhbGl6ZSBkZWNyeXB0aW9uIGZvciB0aGUgZ2l2ZW4gdW5pdCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQKQEAgLTM3OCw3ICszNzgsNyBAQAogICAgICAqIEByZXR1cm4gc3RhdHVzX3QKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKSA9IDA7CiAKICAgICAvKioKQEAgLTM5OCw3ICszOTgsNyBAQAogICAgICAqICAgICBEUk1fRVJST1JfU0VTU0lPTl9OT1RfT1BFTkVELCBEUk1fRVJST1JfREVDUllQVF9VTklUX05PVF9JTklUSUFMSVpFRCwKICAgICAgKiAgICAgRFJNX0VSUk9SX0RFQ1JZUFQgZm9yIGZhaWx1cmUuCiAgICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgPSAwOwogCiAgICAgLyoqCkBAIC00MTEsNyArNDExLDcgQEAKICAgICAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgICAgICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCkgPSAwOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpID0gMDsKIAogICAgIC8qKgogICAgICAqIFJlYWRzIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYW4gb3BlbiBEUk0gZmlsZS4KQEAgLTQyNCw3ICs0MjQsNyBAQAogICAgICAqCiAgICAgICogQHJldHVybiBOdW1iZXIgb2YgYnl0ZXMgcmVhZC4gUmV0dXJucyAtMSBmb3IgRmFpbHVyZS4KICAgICAgKi8KLSAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgPSAwOwogfTsKIApkaWZmIC0tZ2l0IGEvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1NYW5hZ2VyU2VydmljZS5oIGIvZHJtL2NvbW1vbi9pbmNsdWRlL0lEcm1NYW5hZ2VyU2VydmljZS5oCmluZGV4IDAzNzZiNDkuLjgzNmFlMGEgMTAwNjQ0Ci0tLSBhL2RybS9jb21tb24vaW5jbHVkZS9JRHJtTWFuYWdlclNlcnZpY2UuaAorKysgYi9kcm0vY29tbW9uL2luY2x1ZGUvSURybU1hbmFnZXJTZXJ2aWNlLmgKQEAgLTExNSwxMCArMTE1LDExIEBACiAgICAgdmlydHVhbCBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLCBpbnQgYWN0aW9uKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbnN1bWVSaWdodHMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgPSAwOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywKKyAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb24pID0gMDsKIAogICAgIHZpcnR1YWwgYm9vbCB2YWxpZGF0ZUFjdGlvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwKQEAgLTEzOCwyOCArMTM5LDI4IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBbGxTdXBwb3J0SW5mbygKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgaW50KiBsZW5ndGgsIERybVN1cHBvcnRJbmZvKiogZHJtU3VwcG9ydEluZm9BcnJheSkgPSAwOwogCi0gICAgdmlydHVhbCBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LAogICAgICAgICAgICAgICAgIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKSA9IDA7CiAKLSAgICB2aXJ0dWFsIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgPSAwOwogCi0gICAgdmlydHVhbCBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pID0gMDsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpID0gMDsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSA9IDA7CiAKLSAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLG9mZjY0X3Qgb2Zmc2V0KSA9IDA7CiB9OwogCkBAIC0yMDMsMTAgKzIwNCwxMCBAQAogICAgIHZpcnR1YWwgaW50IGNoZWNrUmlnaHRzU3RhdHVzKGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbik7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbnN1bWVSaWdodHMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLCBib29sIHJlc2VydmUpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQbGF5YmFja1N0YXR1cygKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbik7CiAKICAgICB2aXJ0dWFsIGJvb2wgdmFsaWRhdGVBY3Rpb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CkBAIC0yMjUsMjggKzIyNiwyOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWxsU3VwcG9ydEluZm8oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCogbGVuZ3RoLCBEcm1TdXBwb3J0SW5mbyoqIGRybVN1cHBvcnRJbmZvQXJyYXkpOwogCi0gICAgdmlydHVhbCBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwKICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBtaW1lKTsKIAotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKTsKIAotICAgIHZpcnR1YWwgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CisgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CiAKLSAgICB2aXJ0dWFsIHNzaXplX3QgcHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHZpcnR1YWwgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCk7CiB9OwogCmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyLmNwcAppbmRleCBiZjA0YTg5Li5hZmJjYjM5IDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuY3BwCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5jcHAKQEAgLTI2Nyw3ICsyNjcsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyOjpjb25zdW1lUmlnaHRzKAotICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CisgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgaWYgKG1EZWNyeXB0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKQEAgLTI3OCw3ICsyNzgsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyOjpzZXRQbGF5YmFja1N0YXR1cygKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgeworICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CkBAIC0zOTYsMTUgKzM5NiwxNSBAQAogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiB9CiAKLURlY3J5cHRIYW5kbGUqIERybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSkgewogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CiAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKLSAgICBpZiAoTlVMTCAhPSBoYW5kbGUpIHsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgIGlmIChOVUxMICE9IGhhbmRsZS5nZXQoKSkgewogICAgICAgICBoYW5kbGUtPmRlY3J5cHRJZCA9IG1EZWNyeXB0U2Vzc2lvbklkICsgMTsKIAogICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgewpAQCAtNDIwLDE5ICs0MjAsMTkgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoRFJNX05PX0VSUk9SICE9IHJlc3VsdCkgewotICAgICAgICBkZWxldGUgaGFuZGxlOyBoYW5kbGUgPSBOVUxMOworICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICB9CiAgICAgcmV0dXJuIGhhbmRsZTsKIH0KIAotRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uKAorc3A8RGVjcnlwdEhhbmRsZT4gRHJtTWFuYWdlcjo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogICAgIFZlY3RvcjxTdHJpbmc4PiBwbHVnSW5JZExpc3QgPSBtUGx1Z0luTWFuYWdlci5nZXRQbHVnSW5JZExpc3QoKTsKIAotICAgIERlY3J5cHRIYW5kbGUqIGhhbmRsZSA9IG5ldyBEZWNyeXB0SGFuZGxlKCk7Ci0gICAgaWYgKE5VTEwgIT0gaGFuZGxlKSB7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKKyAgICBpZiAoTlVMTCAhPSBoYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgaGFuZGxlLT5kZWNyeXB0SWQgPSBtRGVjcnlwdFNlc3Npb25JZCArIDE7CiAKICAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHBsdWdJbklkTGlzdC5zaXplKCk7IGluZGV4KyspIHsKQEAgLTQ0OCwyMCArNDQ4LDIwIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKERSTV9OT19FUlJPUiAhPSByZXN1bHQpIHsKLSAgICAgICAgZGVsZXRlIGhhbmRsZTsgaGFuZGxlID0gTlVMTDsKKyAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgICAgIEFMT0dWKCJEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb246IG5vIGNhcGFibGUgcGx1Zy1pbiBmb3VuZCIpOwogICAgIH0KICAgICByZXR1cm4gaGFuZGxlOwogfQogCi1EZWNyeXB0SGFuZGxlKiBEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgRHJtQnVmZmVyJiBidWYsIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEU7CiAgICAgVmVjdG9yPFN0cmluZzg+IHBsdWdJbklkTGlzdCA9IG1QbHVnSW5NYW5hZ2VyLmdldFBsdWdJbklkTGlzdCgpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKLSAgICBpZiAoTlVMTCAhPSBoYW5kbGUpIHsKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBuZXcgRGVjcnlwdEhhbmRsZSgpOworICAgIGlmIChOVUxMICE9IGhhbmRsZS5nZXQoKSkgewogICAgICAgICBoYW5kbGUtPmRlY3J5cHRJZCA9IG1EZWNyeXB0U2Vzc2lvbklkICsgMTsKIAogICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcGx1Z0luSWRMaXN0LnNpemUoKTsgaW5kZXgrKykgewpAQCAtNDc3LDIwICs0NzcsMTkgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAoRFJNX05PX0VSUk9SICE9IHJlc3VsdCkgewotICAgICAgICBkZWxldGUgaGFuZGxlOwotICAgICAgICBoYW5kbGUgPSBOVUxMOworICAgICAgICBoYW5kbGUuY2xlYXIoKTsKICAgICAgICAgQUxPR1YoIkRybU1hbmFnZXI6Om9wZW5EZWNyeXB0U2Vzc2lvbjogbm8gY2FwYWJsZSBwbHVnLWluIGZvdW5kIik7CiAgICAgfQogICAgIHJldHVybiBoYW5kbGU7CiB9CiAKLXN0YXR1c190IERybU1hbmFnZXI6OmNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKSB7CitzdGF0dXNfdCBEcm1NYW5hZ2VyOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobURlY3J5cHRMb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBpZiAobURlY3J5cHRTZXNzaW9uTWFwLmluZGV4T2ZLZXkoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSAhPSBOQU1FX05PVF9GT1VORCkgewogICAgICAgICBJRHJtRW5naW5lKiBkcm1FbmdpbmUgPSBtRGVjcnlwdFNlc3Npb25NYXAudmFsdWVGb3IoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKTsKICAgICAgICAgcmVzdWx0ID0gZHJtRW5naW5lLT5jbG9zZURlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlKTsKLSAgICAgICAgaWYgKERSTV9OT19FUlJPUiA9PSByZXN1bHQpIHsKKyAgICAgICAgaWYgKERSTV9OT19FUlJPUiA9PSByZXN1bHQgJiYgTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgICAgICBtRGVjcnlwdFNlc3Npb25NYXAucmVtb3ZlSXRlbShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOwogICAgICAgICB9CiAgICAgfQpAQCAtNDk4LDcgKzQ5Nyw4IEBACiB9CiAKIHN0YXR1c190IERybU1hbmFnZXI6OmluaXRpYWxpemVEZWNyeXB0VW5pdCgKLSAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pIHsKKyAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgICAgIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtRGVjcnlwdExvY2spOwogICAgIGlmIChtRGVjcnlwdFNlc3Npb25NYXAuaW5kZXhPZktleShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpICE9IE5BTUVfTk9UX0ZPVU5EKSB7CkBAIC01MDgsNyArNTA4LDcgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0dXNfdCBEcm1NYW5hZ2VyOjpkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCitzdGF0dXNfdCBEcm1NYW5hZ2VyOjpkZWNyeXB0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsIERybUJ1ZmZlcioqIGRlY0J1ZmZlciwgRHJtQnVmZmVyKiBJVikgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwogCkBAIC01MjIsNyArNTIyLDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlcjo6ZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1EZWNyeXB0TG9jayk7CiAgICAgaWYgKG1EZWNyeXB0U2Vzc2lvbk1hcC5pbmRleE9mS2V5KGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgIT0gTkFNRV9OT1RfRk9VTkQpIHsKQEAgLTUzMiw3ICs1MzIsNyBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXNzaXplX3QgRHJtTWFuYWdlcjo6cHJlYWQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorc3NpemVfdCBEcm1NYW5hZ2VyOjpwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgewogICAgIHNzaXplX3QgcmVzdWx0ID0gREVDUllQVF9GSUxFX0VSUk9SOwogCmRpZmYgLS1naXQgYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXIuaCBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5oCmluZGV4IGU3Y2RkMzYuLjI2MjIyYmMgMTAwNjQ0Ci0tLSBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5oCisrKyBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlci5oCkBAIC04OSwxMCArODksMTEgQEAKIAogICAgIGludCBjaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pOwogCi0gICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisgICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLAorICAgICAgICAgICAgYm9vbCByZXNlcnZlKTsKIAogICAgIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKIAogICAgIGJvb2wgdmFsaWRhdGVBY3Rpb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24sIGNvbnN0IEFjdGlvbkRlc2NyaXB0aW9uJiBkZXNjcmlwdGlvbik7CkBAIC0xMDksMjUgKzExMCwyNiBAQAogCiAgICAgc3RhdHVzX3QgZ2V0QWxsU3VwcG9ydEluZm8oaW50IHVuaXF1ZUlkLCBpbnQqIGxlbmd0aCwgRHJtU3VwcG9ydEluZm8qKiBkcm1TdXBwb3J0SW5mb0FycmF5KTsKIAotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyKiBtaW1lKTsKIAotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSk7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKTsKIAotICAgIERlY3J5cHRIYW5kbGUqIG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLAorICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLAogICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgbWltZVR5cGUpOwogCi0gICAgc3RhdHVzX3QgY2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSk7CiAKLSAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgIHN0YXR1c190IGluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKLSAgICBzdGF0dXNfdCBkZWNyeXB0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCisgICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogZW5jQnVmZmVyLCBEcm1CdWZmZXIqKiBkZWNCdWZmZXIsIERybUJ1ZmZlciogSVYpOwogCi0gICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKyAgICBzdGF0dXNfdCBmaW5hbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCk7CiAKLSAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzc2l6ZV90IHByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KTsKIAogICAgIHZvaWQgb25JbmZvKGNvbnN0IERybUluZm9FdmVudCYgZXZlbnQpOwpkaWZmIC0tZ2l0IGEvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5jcHAgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcAppbmRleCBkYWQ1OTliLi4yNjAwYTJjIDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcAorKysgYi9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmNwcApAQCAtNTgsMjIgKzU4LDI2IEBACiAgICAgcmV0dXJuIGRybV9wZXJtX2xhYmVsc1tpbmRleF07CiB9CiAKLWJvb2wgRHJtTWFuYWdlclNlcnZpY2U6OnNlbGludXhJc1Byb3RlY3RlZENhbGxBbGxvd2VkKHBpZF90IHNwaWQsIGRybV9wZXJtX3QgcGVybSkgeworYm9vbCBEcm1NYW5hZ2VyU2VydmljZTo6c2VsaW51eElzUHJvdGVjdGVkQ2FsbEFsbG93ZWQocGlkX3Qgc3BpZCwgY29uc3QgY2hhciogc3NpZCwgZHJtX3Blcm1fdCBwZXJtKSB7CiAgICAgaWYgKHNlbGludXhfZW5hYmxlZCA8PSAwKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KIAotICAgIGNoYXIgKnNjdHg7CisgICAgY2hhciAqc2N0eCA9IE5VTEw7CiAgICAgY29uc3QgY2hhciAqc2VsaW51eF9jbGFzcyA9ICJkcm1zZXJ2aWNlIjsKICAgICBjb25zdCBjaGFyICpzdHJfcGVybSA9IGdldF9wZXJtX2xhYmVsKHBlcm0pOwogCi0gICAgaWYgKGdldHBpZGNvbihzcGlkLCAmc2N0eCkgIT0gMCkgewotICAgICAgICBBTE9HRSgiU0VMaW51eDogZ2V0cGlkY29uKHBpZD0lZCkgZmFpbGVkLlxuIiwgc3BpZCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoc3NpZCA9PSBOVUxMKSB7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTIxMDM1MDQyIik7CisKKyAgICAgICAgaWYgKGdldHBpZGNvbihzcGlkLCAmc2N0eCkgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIlNFTGludXg6IGdldHBpZGNvbihwaWQ9JWQpIGZhaWxlZC5cbiIsIHNwaWQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CiAgICAgfQogCi0gICAgYm9vbCBhbGxvd2VkID0gKHNlbGludXhfY2hlY2tfYWNjZXNzKHNjdHgsIGRybXNlcnZlcl9jb250ZXh0LCBzZWxpbnV4X2NsYXNzLAotICAgICAgICAgICAgc3RyX3Blcm0sIE5VTEwpID09IDApOworICAgIGJvb2wgYWxsb3dlZCA9IChzZWxpbnV4X2NoZWNrX2FjY2Vzcyhzc2lkID8gc3NpZCA6IHNjdHgsIGRybXNlcnZlcl9jb250ZXh0LAorICAgICAgICAgICAgc2VsaW51eF9jbGFzcywgc3RyX3Blcm0sIE5VTEwpID09IDApOwogICAgIGZyZWVjb24oc2N0eCk7CiAKICAgICByZXR1cm4gYWxsb3dlZDsKQEAgLTg2LDEwICs5MCwxMSBAQAogICAgIElQQ1RocmVhZFN0YXRlKiBpcGNTdGF0ZSA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCk7CiAgICAgdWlkX3QgdWlkID0gaXBjU3RhdGUtPmdldENhbGxpbmdVaWQoKTsKICAgICBwaWRfdCBzcGlkID0gaXBjU3RhdGUtPmdldENhbGxpbmdQaWQoKTsKKyAgICBjb25zdCBjaGFyKiBzc2lkID0gaXBjU3RhdGUtPmdldENhbGxpbmdTaWQoKTsKIAogICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgdHJ1c3RlZFVpZHMuc2l6ZSgpOyArK2kpIHsKICAgICAgICAgaWYgKHRydXN0ZWRVaWRzW2ldID09IHVpZCkgewotICAgICAgICAgICAgcmV0dXJuIHNlbGludXhJc1Byb3RlY3RlZENhbGxBbGxvd2VkKHNwaWQsIHBlcm0pOworICAgICAgICAgICAgcmV0dXJuIHNlbGludXhJc1Byb3RlY3RlZENhbGxBbGxvd2VkKHNwaWQsIHNzaWQsIHBlcm0pOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKQEAgLTk3LDcgKzEwMiw5IEBACiAKIHZvaWQgRHJtTWFuYWdlclNlcnZpY2U6Omluc3RhbnRpYXRlKCkgewogICAgIEFMT0dWKCJpbnN0YW50aWF0ZSIpOwotICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5hZGRTZXJ2aWNlKFN0cmluZzE2KCJkcm0uZHJtTWFuYWdlciIpLCBuZXcgRHJtTWFuYWdlclNlcnZpY2UoKSk7CisgICAgc3A8RHJtTWFuYWdlclNlcnZpY2U+IHNlcnZpY2UgPSBuZXcgRHJtTWFuYWdlclNlcnZpY2UoKTsKKyAgICBzZXJ2aWNlLT5zZXRSZXF1ZXN0aW5nU2lkKHRydWUpOworICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5hZGRTZXJ2aWNlKFN0cmluZzE2KCJkcm0uZHJtTWFuYWdlciIpLCBzZXJ2aWNlKTsKIAogICAgIGlmICgwID49IHRydXN0ZWRVaWRzLnNpemUoKSkgewogICAgICAgICAvLyBUT0RPCkBAIC0yMDYsNyArMjEzLDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmNvbnN1bWVSaWdodHMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSkgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIGNvbnN1bWVSaWdodHMiKTsKICAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoQ09OU1VNRV9SSUdIVFMpKSB7CiAgICAgICAgIHJldHVybiBEUk1fRVJST1JfTk9fUEVSTUlTU0lPTjsKQEAgLTIxNSw3ICsyMjIsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6c2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBwbGF5YmFja1N0YXR1cywgaW50NjRfdCBwb3NpdGlvbikgeworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIHNldFBsYXliYWNrU3RhdHVzIik7CiAgICAgaWYgKCFpc1Byb3RlY3RlZENhbGxBbGxvd2VkKFNFVF9QTEFZQkFDS19TVEFUVVMpKSB7CiAgICAgICAgIHJldHVybiBEUk1fRVJST1JfTk9fUEVSTUlTU0lPTjsKQEAgLTI2Miw3ICsyNjksNyBAQAogICAgIHJldHVybiBtRHJtTWFuYWdlci0+Z2V0QWxsU3VwcG9ydEluZm8odW5pcXVlSWQsIGxlbmd0aCwgZHJtU3VwcG9ydEluZm9BcnJheSk7CiB9CiAKLURlY3J5cHRIYW5kbGUqIERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCitzcDxEZWNyeXB0SGFuZGxlPiBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciogbWltZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uIik7CiAgICAgaWYgKGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoT1BFTl9ERUNSWVBUX1NFU1NJT04pKSB7CkBAIC0yNzIsNyArMjc5LDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uIHdpdGggdXJpIik7CiAgICAgaWYgKGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoT1BFTl9ERUNSWVBUX1NFU1NJT04pKSB7CkBAIC0yODIsNyArMjg5LDcgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotRGVjcnlwdEhhbmRsZSogRHJtTWFuYWdlclNlcnZpY2U6Om9wZW5EZWNyeXB0U2Vzc2lvbigKK3NwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXJTZXJ2aWNlOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IERybUJ1ZmZlciYgYnVmLCBjb25zdCBTdHJpbmc4JiBtaW1lVHlwZSkgewogICAgIEFMT0dWKCJFbnRlcmluZyBEcm1NYW5hZ2VyU2VydmljZTo6b3BlbkRlY3J5cHRTZXNzaW9uIGZvciBzdHJlYW1pbmciKTsKICAgICBpZiAoaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChPUEVOX0RFQ1JZUFRfU0VTU0lPTikpIHsKQEAgLTI5Miw3ICsyOTksNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6Y2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKK3N0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjpjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpIHsKICAgICBBTE9HVigiRW50ZXJpbmcgY2xvc2VEZWNyeXB0U2Vzc2lvbiIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChDTE9TRV9ERUNSWVBUX1NFU1NJT04pKSB7CiAgICAgICAgIHJldHVybiBEUk1fRVJST1JfTk9fUEVSTUlTU0lPTjsKQEAgLTMwMCw3ICszMDcsNyBAQAogICAgIHJldHVybiBtRHJtTWFuYWdlci0+Y2xvc2VEZWNyeXB0U2Vzc2lvbih1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSk7CiB9CiAKLXN0YXR1c190IERybU1hbmFnZXJTZXJ2aWNlOjppbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbykgewogICAgIEFMT0dWKCJFbnRlcmluZyBpbml0aWFsaXplRGVjcnlwdFVuaXQiKTsKICAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoSU5JVElBTElaRV9ERUNSWVBUX1VOSVQpKSB7CkBAIC0zMTAsNyArMzE3LDcgQEAKIH0KIAogc3RhdHVzX3QgRHJtTWFuYWdlclNlcnZpY2U6OmRlY3J5cHQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIGRlY3J5cHQiKTsKICAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoREVDUllQVCkpIHsKQEAgLTMyMCw3ICszMjcsNyBAQAogfQogCiBzdGF0dXNfdCBEcm1NYW5hZ2VyU2VydmljZTo6ZmluYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQpIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKSB7CiAgICAgQUxPR1YoIkVudGVyaW5nIGZpbmFsaXplRGVjcnlwdFVuaXQiKTsKICAgICBpZiAoIWlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoRklOQUxJWkVfREVDUllQVF9VTklUKSkgewogICAgICAgICByZXR1cm4gRFJNX0VSUk9SX05PX1BFUk1JU1NJT047CkBAIC0zMjgsNyArMzM1LDcgQEAKICAgICByZXR1cm4gbURybU1hbmFnZXItPmZpbmFsaXplRGVjcnlwdFVuaXQodW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQpOwogfQogCi1zc2l6ZV90IERybU1hbmFnZXJTZXJ2aWNlOjpwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitzc2l6ZV90IERybU1hbmFnZXJTZXJ2aWNlOjpwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCkgewogICAgIEFMT0dWKCJFbnRlcmluZyBwcmVhZCIpOwogICAgIGlmICghaXNQcm90ZWN0ZWRDYWxsQWxsb3dlZChQUkVBRCkpIHsKZGlmZiAtLWdpdCBhL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuaCBiL2RybS9kcm1zZXJ2ZXIvRHJtTWFuYWdlclNlcnZpY2UuaAppbmRleCA0NWNlZTJlLi4yZTI3YTNjIDEwMDY0NAotLS0gYS9kcm0vZHJtc2VydmVyL0RybU1hbmFnZXJTZXJ2aWNlLmgKKysrIGIvZHJtL2RybXNlcnZlci9Ecm1NYW5hZ2VyU2VydmljZS5oCkBAIC02MCw3ICs2MCw3IEBACiAKICAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0X3Blcm1fbGFiZWwoZHJtX3Blcm1fdCBwZXJtKTsKIAotICAgIHN0YXRpYyBib29sIHNlbGludXhJc1Byb3RlY3RlZENhbGxBbGxvd2VkKHBpZF90IHNwaWQsIGRybV9wZXJtX3QgcGVybSk7CisgICAgc3RhdGljIGJvb2wgc2VsaW51eElzUHJvdGVjdGVkQ2FsbEFsbG93ZWQocGlkX3Qgc3BpZCwgY29uc3QgY2hhciogc3NpZCwgZHJtX3Blcm1fdCBwZXJtKTsKIAogICAgIHN0YXRpYyBib29sIGlzUHJvdGVjdGVkQ2FsbEFsbG93ZWQoZHJtX3Blcm1fdCBwZXJtKTsKIApAQCAtOTUsMTAgKzk1LDExIEBACiAKICAgICBpbnQgY2hlY2tSaWdodHNTdGF0dXMoaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLGludCBhY3Rpb24pOwogCi0gICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CisgICAgc3RhdHVzX3QgY29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLCBpbnQgYWN0aW9uLAorICAgICAgICAgICAgYm9vbCByZXNlcnZlKTsKIAogICAgIHN0YXR1c190IHNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKIAogICAgIGJvb2wgdmFsaWRhdGVBY3Rpb24oaW50IHVuaXF1ZUlkLCBjb25zdCBTdHJpbmc4JiBwYXRoLAogICAgICAgICAgICAgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKQEAgLTExNSwyNiArMTE2LDI3IEBACiAKICAgICBzdGF0dXNfdCBnZXRBbGxTdXBwb3J0SW5mbyhpbnQgdW5pcXVlSWQsIGludCogbGVuZ3RoLCBEcm1TdXBwb3J0SW5mbyoqIGRybVN1cHBvcnRJbmZvQXJyYXkpOwogCi0gICAgRGVjcnlwdEhhbmRsZSogb3BlbkRlY3J5cHRTZXNzaW9uKAorICAgIHNwPERlY3J5cHRIYW5kbGU+IG9wZW5EZWNyeXB0U2Vzc2lvbigKICAgICAgICAgaW50IHVuaXF1ZUlkLCBpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCwgY29uc3QgY2hhciAqbWltZSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oCisgICAgc3A8RGVjcnlwdEhhbmRsZT4gb3BlbkRlY3J5cHRTZXNzaW9uKAogICAgICAgICBpbnQgdW5pcXVlSWQsIGNvbnN0IGNoYXIqIHVyaSwgY29uc3QgY2hhciogbWltZSk7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBvcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBjb25zdCBEcm1CdWZmZXImIGJ1ZiwKICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlKTsKIAotICAgIHN0YXR1c190IGNsb3NlRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKyAgICBzdGF0dXNfdCBjbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUpOwogCi0gICAgc3RhdHVzX3QgaW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzdGF0dXNfdCBpbml0aWFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLCBjb25zdCBEcm1CdWZmZXIqIGhlYWRlckluZm8pOwogCi0gICAgc3RhdHVzX3QgZGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkLAorICAgIHN0YXR1c190IGRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKIAotICAgIHN0YXR1c190IGZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCk7CisgICAgc3RhdHVzX3QgZmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQpOwogCi0gICAgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3NpemVfdCBwcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgdm9pZCogYnVmZmVyLCBzc2l6ZV90IG51bUJ5dGVzLCBvZmY2NF90IG9mZnNldCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvQW5kcm9pZC5icCBiL2RybS9saWJkcm1mcmFtZXdvcmsvQW5kcm9pZC5icAppbmRleCA0M2JhNzJiLi45NDBjMTdkIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9BbmRyb2lkLmJwCkBAIC0zOSw0ICszOSwzIEBACiAgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKIH0KIAotc3ViZGlycyA9IFsicGx1Z2lucy8qIl0KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvRHJtTWFuYWdlckNsaWVudEltcGwuY3BwIGIvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAKaW5kZXggYzA0N2ViMS4uYjBhNDQxYiAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9Ecm1NYW5hZ2VyQ2xpZW50SW1wbC5jcHAKQEAgLTE4Myw3ICsxODMsNyBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y29uc3VtZVJpZ2h0cygKLSAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSwgYWN0aW9uLCByZXNlcnZlKTsKKyAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZSwgYWN0aW9uLCByZXNlcnZlKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE5NCw3ICsxOTQsNyBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+c2V0UGxheWJhY2tTdGF0dXMoCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIHBsYXliYWNrU3RhdHVzLCBwb3NpdGlvbik7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC0yNjcsNyArMjY3LDcgQEAKIHNwPERlY3J5cHRIYW5kbGU+IERybU1hbmFnZXJDbGllbnRJbXBsOjpvcGVuRGVjcnlwdFNlc3Npb24oCiAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgY2hhciogdXJpLCBjb25zdCBjaGFyKiBtaW1lKSB7CiAKLSAgICBEZWNyeXB0SGFuZGxlKiBoYW5kbGUgPSBOVUxMOworICAgIHNwPERlY3J5cHRIYW5kbGU+IGhhbmRsZTsKICAgICBpZiAoTlVMTCAhPSB1cmkpIHsKICAgICAgICAgaGFuZGxlID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+b3BlbkRlY3J5cHRTZXNzaW9uKHVuaXF1ZUlkLCB1cmksIG1pbWUpOwogICAgIH0KQEAgLTI4NCw3ICsyODQsNyBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpIHsKICAgICAgICAgc3RhdHVzID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+Y2xvc2VEZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSk7CisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMjk1LDcgKzI5NSw3IEBACiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gRFJNX0VSUk9SX1VOS05PV047CiAgICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpICYmIChOVUxMICE9IGhlYWRlckluZm8pKSB7CiAgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmluaXRpYWxpemVEZWNyeXB0VW5pdCgKLSAgICAgICAgICAgICAgICB1bmlxdWVJZCwgZGVjcnlwdEhhbmRsZS5nZXQoKSwgZGVjcnlwdFVuaXRJZCwgaGVhZGVySW5mbyk7CisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQsIGhlYWRlckluZm8pOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMzA4LDcgKzMwOCw3IEBACiAgICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpICYmIChOVUxMICE9IGVuY0J1ZmZlcikKICAgICAgICAgJiYgKE5VTEwgIT0gZGVjQnVmZmVyKSAmJiAoTlVMTCAhPSAqZGVjQnVmZmVyKSkgewogICAgICAgICBzdGF0dXMgPSBnZXREcm1NYW5hZ2VyU2VydmljZSgpLT5kZWNyeXB0KAotICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBkZWNyeXB0VW5pdElkLAorICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgICAgIGVuY0J1ZmZlciwgZGVjQnVmZmVyLCBJVik7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CkBAIC0zMTksNyArMzE5LDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBEUk1fRVJST1JfVU5LTk9XTjsKICAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIHN0YXR1cyA9IGdldERybU1hbmFnZXJTZXJ2aWNlKCktPmZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICAgICAgICAgIHVuaXF1ZUlkLCBkZWNyeXB0SGFuZGxlLmdldCgpLCBkZWNyeXB0VW5pdElkKTsKKyAgICAgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGRlY3J5cHRVbml0SWQpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMzI5LDcgKzMyOSw3IEBACiAgICAgc3NpemVfdCByZXRDb2RlID0gSU5WQUxJRF9WQUxVRTsKICAgICBpZiAoKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgJiYgKE5VTEwgIT0gYnVmZmVyKSAmJiAoMCA8IG51bUJ5dGVzKSkgewogICAgICAgICByZXRDb2RlID0gZ2V0RHJtTWFuYWdlclNlcnZpY2UoKS0+cHJlYWQoCi0gICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUuZ2V0KCksIGJ1ZmZlciwgbnVtQnl0ZXMsIG9mZnNldCk7CisgICAgICAgICAgICAgICAgdW5pcXVlSWQsIGRlY3J5cHRIYW5kbGUsIGJ1ZmZlciwgbnVtQnl0ZXMsIG9mZnNldCk7CiAgICAgfQogICAgIHJldHVybiByZXRDb2RlOwogfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2NvbW1vbi9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTNlNTdmLi4wMDAwMDAwCi0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9jb21tb24vQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXN1YmRpcnMgPSBbInV0aWwiXQpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODg0YzE0Li4wMDAwMDAwCi0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotc3ViZGlycyA9IFsKLSAgICAiRndkTG9ja0VuZ2luZSIsCi0gICAgImludGVybmFsLWZvcm1hdCIsCi1dCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvaW5jbHVkZS9Gd2RMb2NrRW5naW5lLmgKaW5kZXggYTU3MWIzYS4uYjYyZGRiOSAxMDA2NDQKLS0tIGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL2luY2x1ZGUvRndkTG9ja0VuZ2luZS5oCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9pbmNsdWRlL0Z3ZExvY2tFbmdpbmUuaApAQCAtMTk4LDcgKzE5OCw3IEBACiAgKiAgICAgUmV0dXJucyBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MsIERSTV9FUlJPUl9VTktOT1dOIGZvciBmYWlsdXJlCiAgKi8KIHN0YXR1c190IG9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVzZXJ2ZSk7CiAKQEAgLTIxNSwxMiArMjE1LDEyIEBACiAgKi8KICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQogc3RhdHVzX3Qgb25TZXRQbGF5YmFja1N0YXR1cyhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGxheWJhY2tTdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb24pOwogI2Vsc2UKIHN0YXR1c190IG9uU2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYXliYWNrU3RhdHVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcG9zaXRpb24pOwogI2VuZGlmCkBAIC0zMzAsMTEgKzMzMCwxMSBAQAogICovCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKTsKICNlbHNlCiBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOwogI2VuZGlmCiAKQEAgLTM0OCw3ICszNDgsNyBAQAogICogICAgIERSTV9FUlJPUl9DQU5OT1RfSEFORExFIGZvciBmYWlsdXJlIGFuZCBEUk1fTk9fRVJST1IgZm9yIHN1Y2Nlc3MKICAqLwogc3RhdHVzX3Qgb25PcGVuRGVjcnlwdFNlc3Npb24oaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXJpKTsKIAogLyoqCkBAIC0zNjAsNyArMzYwLDcgQEAKICAqICAgICBSZXR1cm5zIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcywgRFJNX0VSUk9SX1VOS05PV04gZm9yIGZhaWx1cmUKICAqLwogc3RhdHVzX3Qgb25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSk7CiAKIC8qKgogICogSW5pdGlhbGl6ZSBkZWNyeXB0aW9uIGZvciB0aGUgZ2l2ZW4gdW5pdCBvZiB0aGUgcHJvdGVjdGVkIGNvbnRlbnQuCkBAIC0zNzMsNyArMzczLDcgQEAKICAqICAgICBEUk1fRVJST1JfQ0FOTk9UX0hBTkRMRSBmb3IgZmFpbHVyZSBhbmQgRFJNX05PX0VSUk9SIGZvciBzdWNjZXNzCiAgKi8KIHN0YXR1c190IG9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRHJtQnVmZmVyKiBoZWFkZXJJbmZvKTsKIApAQCAtMzk0LDcgKzM5NCw3IEBACiAgKiAgICAgRFJNX0VSUk9SX0RFQ1JZUFQgZm9yIGZhaWx1cmUuCiAgKi8KIHN0YXR1c190IG9uRGVjcnlwdChpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwKICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwKICAgICAgICAgICAgICAgICAgICBEcm1CdWZmZXIqKiBkZWNCdWZmZXIpOwpAQCAtNDE2LDcgKzQxNiw3IEBACiAgKiAgICAgRFJNX0VSUk9SX1NFU1NJT05fTk9UX09QRU5FRCwgRFJNX0VSUk9SX0RFQ1JZUFRfVU5JVF9OT1RfSU5JVElBTElaRUQsCiAgKiAgICAgRFJNX0VSUk9SX0RFQ1JZUFQgZm9yIGZhaWx1cmUuCiAgKi8KLXN0YXR1c190IG9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCitzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICBpbnQgZGVjcnlwdFVuaXRJZCwgY29uc3QgRHJtQnVmZmVyKiBlbmNCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKIApAQCAtNDMwLDcgKzQzMCw3IEBACiAgKiAgICAgRFJNX0VSUk9SX0NBTk5PVF9IQU5ETEUgZm9yIGZhaWx1cmUgYW5kIERSTV9OT19FUlJPUiBmb3Igc3VjY2VzcwogICovCiBzdGF0dXNfdCBvbkZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQpOwogCiAvKioKQEAgLTQ0NSw3ICs0NDUsNyBAQAogICogQHJldHZhbCAtMSBGYWlsdXJlLgogICovCiBzc2l6ZV90IG9uUmVhZChpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICB2b2lkKiBwQnVmZmVyLAogICAgICAgICAgICAgICAgaW50IG51bUJ5dGVzKTsKIApAQCAtNDYzLDEyICs0NjMsMTIgQEAKICAqLwogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCiBvZmY2NF90IG9uTHNlZWsoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgaW50IHdoZW5jZSk7CiAjZWxzZQogb2ZmX3Qgb25Mc2VlayhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICBvZmZfdCBvZmZzZXQsCiAgICAgICAgICAgICAgIGludCB3aGVuY2UpOwogI2VuZGlmCkBAIC00ODYsMTMgKzQ4NiwxMyBAQAogICovCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKIHNzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCiAgICAgICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlcywKICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCk7CiAjZWxzZQogc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgIHZvaWQqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICBzc2l6ZV90IG51bUJ5dGVzLAogICAgICAgICAgICAgICAgIG9mZl90IG9mZnNldCk7CmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9Gd2RMb2NrRW5naW5lL3NyYy9Gd2RMb2NrRW5naW5lLmNwcAppbmRleCA3M2VlYTg5Li43NjlkZTBjIDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL0Z3ZExvY2tFbmdpbmUvc3JjL0Z3ZExvY2tFbmdpbmUuY3BwCisrKyBiL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9mb3J3YXJkLWxvY2svRndkTG9ja0VuZ2luZS9zcmMvRndkTG9ja0VuZ2luZS5jcHAKQEAgLTI5NCw3ICsyOTQsNyBAQAogfQogCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkNvbnN1bWVSaWdodHMoaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIGFjdGlvbiAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIC8qIHJlc2VydmUgKi8pIHsKICAgICAvLyBObyByaWdodHMgY29uc3VtcHRpb24KQEAgLTM3MiwxMSArMzcyLDEzIEBACiB9CiAKICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQotc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyhpbnQgLyogdW5pcXVlSWQgKi8sIERlY3J5cHRIYW5kbGUqIC8qIGRlY3J5cHRIYW5kbGUgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKiBwbGF5YmFja1N0YXR1cyAqLywgaW50NjRfdCAvKiBwb3NpdGlvbiAqLykgeworc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25TZXRQbGF5YmFja1N0YXR1cyhpbnQgLyogdW5pcXVlSWQgKi8sCisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKiBkZWNyeXB0SGFuZGxlICovLCBpbnQgLyogcGxheWJhY2tTdGF0dXMgKi8sCisgICAgICAgIGludDY0X3QgLyogcG9zaXRpb24gKi8pIHsKICNlbHNlCi1zdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvblNldFBsYXliYWNrU3RhdHVzKGludCAvKiB1bmlxdWVJZCAqLywgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qIHBsYXliYWNrU3RhdHVzICovLCBpbnQgLyogcG9zaXRpb24gKi8pIHsKK3N0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uU2V0UGxheWJhY2tTdGF0dXMoaW50IC8qIHVuaXF1ZUlkICovLAorICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgaW50IC8qIHBsYXliYWNrU3RhdHVzICovLCBpbnQgLyogcG9zaXRpb24gKi8pIHsKICNlbmRpZgogICAgIC8vIE5vdCB1c2VkCiAgICAgTE9HX1ZFUkJPU0UoIkZ3ZExvY2tFbmdpbmU6Om9uU2V0UGxheWJhY2tTdGF0dXMiKTsKQEAgLTQ3MCwxMyArNDcyLDEzIEBACiAKICNpZmRlZiBVU0VfNjRCSVRfRFJNX0FQSQogc3RhdHVzX3QgRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24oaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IC8qIGxlbmd0aCAqLykgewogI2Vsc2UKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCAvKiB1bmlxdWVJZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogbGVuZ3RoICovKSB7CkBAIC00ODcsNyArNDg5LDcgQEAKICAgICBMT0dfVkVSQk9TRSgiRndkTG9ja0VuZ2luZTo6b25PcGVuRGVjcnlwdFNlc3Npb24iKTsKIAogICAgIGlmICgoLTEgPCBmZCkgJiYKLSAgICAgICAgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZSkgJiYKKyAgICAgICAgKE5VTEwgIT0gZGVjcnlwdEhhbmRsZS5nZXQoKSkgJiYKICAgICAgICAgKCFkZWNvZGVTZXNzaW9uTWFwLmlzQ3JlYXRlZChkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpKSkgewogICAgICAgICBmaWxlRGVzYyA9IGR1cChmZCk7CiAgICAgfSBlbHNlIHsKQEAgLTUzMywxMiArNTM1LDEyIEBACiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uT3BlbkRlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHVyaSkgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogICAgIGNvbnN0IGNoYXIgZmlsZVRhZyBbXSA9ICJmaWxlOi8vIjsKIAotICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUgJiYgTlVMTCAhPSB1cmkgJiYgc3RybGVuKHVyaSkgPiBzaXplb2YoZmlsZVRhZykpIHsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpICYmIE5VTEwgIT0gdXJpICYmIHN0cmxlbih1cmkpID4gc2l6ZW9mKGZpbGVUYWcpKSB7CiAgICAgICAgIFN0cmluZzggdXJpVGFnID0gU3RyaW5nOCh1cmkpOwogICAgICAgICB1cmlUYWcudG9Mb3dlcigpOwogCkBAIC01NjIsMTEgKzU2NCwxMSBAQAogfQogCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24oaW50IC8qIHVuaXF1ZUlkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSkgewogICAgIHN0YXR1c190IHJlc3VsdCA9IERSTV9FUlJPUl9VTktOT1dOOwogICAgIExPR19WRVJCT1NFKCJGd2RMb2NrRW5naW5lOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24iKTsKIAotICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUgJiYgZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSkgeworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkgJiYgZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSkgewogICAgICAgICBEZWNvZGVTZXNzaW9uKiBzZXNzaW9uID0gZGVjb2RlU2Vzc2lvbk1hcC5nZXRWYWx1ZShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOwogICAgICAgICBpZiAoTlVMTCAhPSBzZXNzaW9uICYmIHNlc3Npb24tPmZpbGVEZXNjID4gLTEpIHsKICAgICAgICAgICAgIEZ3ZExvY2tGaWxlX2RldGFjaChzZXNzaW9uLT5maWxlRGVzYyk7CkBAIC01NzYsNyArNTc4LDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUpIHsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvKSB7CiAgICAgICAgICAgICBkZWxldGUgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm87CiAgICAgICAgICAgICBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SW5mbyA9IE5VTEw7CkBAIC01ODQsOSArNTg2LDcgQEAKIAogICAgICAgICBkZWNyeXB0SGFuZGxlLT5jb3B5Q29udHJvbFZlY3Rvci5jbGVhcigpOwogICAgICAgICBkZWNyeXB0SGFuZGxlLT5leHRlbmRlZERhdGEuY2xlYXIoKTsKLQotICAgICAgICBkZWxldGUgZGVjcnlwdEhhbmRsZTsKLSAgICAgICAgZGVjcnlwdEhhbmRsZSA9IE5VTEw7CisgICAgICAgIGRlY3J5cHRIYW5kbGUuY2xlYXIoKTsKICAgICB9CiAKICAgICBMT0dfVkVSQk9TRSgiRndkTG9ja0VuZ2luZTo6b25DbG9zZURlY3J5cHRTZXNzaW9uIEV4aXQiKTsKQEAgLTU5NCw3ICs1OTQsNyBAQAogfQogCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogZGVjcnlwdFVuaXRJZCAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogLyogaGVhZGVySW5mbyAqLykgewogICAgIEFMT0dFKCJGd2RMb2NrRW5naW5lOjpvbkluaXRpYWxpemVEZWNyeXB0VW5pdCBpcyBub3Qgc3VwcG9ydGVkIGZvciB0aGlzIERSTSBzY2hlbWUiKTsKQEAgLTYwMyw3ICs2MDMsNyBAQAogCiBzdGF0dXNfdCBGd2RMb2NrRW5naW5lOjpvbkRlY3J5cHQoCiAgICAgICAgICAgICBpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKiBkZWNyeXB0SGFuZGxlICovLAorICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIC8qIGRlY3J5cHRIYW5kbGUgKi8sCiAgICAgICAgICAgICBpbnQgLyogZGVjcnlwdFVuaXRJZCAqLywKICAgICAgICAgICAgIGNvbnN0IERybUJ1ZmZlciogLyogZW5jQnVmZmVyICovLAogICAgICAgICAgICAgRHJtQnVmZmVyKiogLyogZGVjQnVmZmVyICovLApAQCAtNjEzLDcgKzYxMyw3IEBACiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uRGVjcnlwdChpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogZGVjcnlwdFVuaXRJZCAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIC8qIGVuY0J1ZmZlciAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1CdWZmZXIqKiAvKiBkZWNCdWZmZXIgKi8pIHsKQEAgLTYyMiwxOSArNjIyLDE5IEBACiB9CiAKIHN0YXR1c190IEZ3ZExvY2tFbmdpbmU6Om9uRmluYWxpemVEZWNyeXB0VW5pdChpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLyogZGVjcnlwdEhhbmRsZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLyogZGVjcnlwdEhhbmRsZSAqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogZGVjcnlwdFVuaXRJZCAqLykgewogICAgIEFMT0dFKCJGd2RMb2NrRW5naW5lOjpvbkZpbmFsaXplRGVjcnlwdFVuaXQgaXMgbm90IHN1cHBvcnRlZCBmb3IgdGhpcyBEUk0gc2NoZW1lIik7CiAgICAgcmV0dXJuIERSTV9FUlJPUl9VTktOT1dOOwogfQogCiBzc2l6ZV90IEZ3ZExvY2tFbmdpbmU6Om9uUmVhZChpbnQgLyogdW5pcXVlSWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtQnl0ZXMpIHsKICAgICBzc2l6ZV90IHNpemUgPSAtMTsKIAotICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUgJiYKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpICYmCiAgICAgICAgIGRlY29kZVNlc3Npb25NYXAuaXNDcmVhdGVkKGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJZCkgJiYKICAgICAgICAgTlVMTCAhPSBidWZmZXIgJiYKICAgICAgICAgbnVtQnl0ZXMgPiAtMSkgewpAQCAtNjU0LDE1ICs2NTQsMTUgQEAKIH0KIAogI2lmZGVmIFVTRV82NEJJVF9EUk1fQVBJCi1vZmY2NF90IEZ3ZExvY2tFbmdpbmU6Om9uTHNlZWsoaW50IC8qIHVuaXF1ZUlkICovLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLAorb2ZmNjRfdCBGd2RMb2NrRW5naW5lOjpvbkxzZWVrKGludCAvKiB1bmlxdWVJZCAqLywgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQsIGludCB3aGVuY2UpIHsKICNlbHNlCi1vZmZfdCBGd2RMb2NrRW5naW5lOjpvbkxzZWVrKGludCAvKiB1bmlxdWVJZCAqLywgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKK29mZl90IEZ3ZExvY2tFbmdpbmU6Om9uTHNlZWsoaW50IC8qIHVuaXF1ZUlkICovLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX3Qgb2Zmc2V0LCBpbnQgd2hlbmNlKSB7CiAjZW5kaWYKICAgICBvZmZfdCBvZmZ2YWwgPSAtMTsKIAotICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUgJiYgZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSkgeworICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkgJiYgZGVjb2RlU2Vzc2lvbk1hcC5pc0NyZWF0ZWQoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSkgewogICAgICAgICBEZWNvZGVTZXNzaW9uKiBzZXNzaW9uID0gZGVjb2RlU2Vzc2lvbk1hcC5nZXRWYWx1ZShkZWNyeXB0SGFuZGxlLT5kZWNyeXB0SWQpOwogICAgICAgICBpZiAoTlVMTCAhPSBzZXNzaW9uICYmIHNlc3Npb24tPmZpbGVEZXNjID4gLTEpIHsKICAgICAgICAgICAgIG9mZnZhbCA9IEZ3ZExvY2tGaWxlX2xzZWVrKHNlc3Npb24tPmZpbGVEZXNjLCBvZmZzZXQsIHdoZW5jZSk7CkBAIC02NzUsMTMgKzY3NSwxMyBAQAogCiAjaWZkZWYgVVNFXzY0QklUX0RSTV9BUEkKIHNzaXplX3QgRndkTG9ja0VuZ2luZTo6b25QcmVhZChpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCkgewogI2Vsc2UKIHNzaXplX3QgRndkTG9ja0VuZ2luZTo6b25QcmVhZChpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBudW1CeXRlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfdCBvZmZzZXQpIHsKQEAgLTY5MCw3ICs2OTAsNyBAQAogCiAgICAgRGVjb2RlU2Vzc2lvbiogZGVjb2RlclNlc3Npb24gPSBOVUxMOwogCi0gICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUpICYmCisgICAgaWYgKChOVUxMICE9IGRlY3J5cHRIYW5kbGUuZ2V0KCkpICYmCiAgICAgICAgIChOVUxMICE9IChkZWNvZGVyU2Vzc2lvbiA9IGRlY29kZVNlc3Npb25NYXAuZ2V0VmFsdWUoZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdElkKSkpICYmCiAgICAgICAgIChOVUxMICE9IGJ1ZmZlcikgJiYKICAgICAgICAgKG51bUJ5dGVzID4gLTEpICYmCmRpZmYgLS1naXQgYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9BbmRyb2lkLmJwIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL2ZvcndhcmQtbG9jay9pbnRlcm5hbC1mb3JtYXQvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWY1OGUyNi4uMDAwMDAwMAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvZm9yd2FyZC1sb2NrL2ludGVybmFsLWZvcm1hdC9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNSArMCwwIEBACi1zdWJkaXJzID0gWwotICAgICJjb21tb24iLAotICAgICJjb252ZXJ0ZXIiLAotICAgICJkZWNvZGVyIiwKLV0KZGlmZiAtLWdpdCBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9pbmNsdWRlL0RybVBhc3N0aHJ1UGx1Z0luLmggYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvaW5jbHVkZS9Ecm1QYXNzdGhydVBsdWdJbi5oCmluZGV4IDdiNjZkYzcuLjRhYjUyNzIgMTAwNjQ0Ci0tLSBhL2RybS9saWJkcm1mcmFtZXdvcmsvcGx1Z2lucy9wYXNzdGhydS9pbmNsdWRlL0RybVBhc3N0aHJ1UGx1Z0luLmgKKysrIGIvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L2luY2x1ZGUvRHJtUGFzc3RocnVQbHVnSW4uaApAQCAtNTMsMTAgKzUzLDExIEBACiAKICAgICBpbnQgb25DaGVja1JpZ2h0c1N0YXR1cyhpbnQgdW5pcXVlSWQsIGNvbnN0IFN0cmluZzgmIHBhdGgsIGludCBhY3Rpb24pOwogCi0gICAgc3RhdHVzX3Qgb25Db25zdW1lUmlnaHRzKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGFjdGlvbiwgYm9vbCByZXNlcnZlKTsKKyAgICBzdGF0dXNfdCBvbkNvbnN1bWVSaWdodHMoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBhY3Rpb24sIGJvb2wgcmVzZXJ2ZSk7CiAKICAgICBzdGF0dXNfdCBvblNldFBsYXliYWNrU3RhdHVzKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgcGxheWJhY2tTdGF0dXMsIGludDY0X3QgcG9zaXRpb24pOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IHBsYXliYWNrU3RhdHVzLCBpbnQ2NF90IHBvc2l0aW9uKTsKIAogICAgIGJvb2wgb25WYWxpZGF0ZUFjdGlvbigKICAgICAgICAgICAgIGludCB1bmlxdWVJZCwgY29uc3QgU3RyaW5nOCYgcGF0aCwgaW50IGFjdGlvbiwgY29uc3QgQWN0aW9uRGVzY3JpcHRpb24mIGRlc2NyaXB0aW9uKTsKQEAgLTc0LDI2ICs3NSwyNSBAQAogICAgIERybVN1cHBvcnRJbmZvKiBvbkdldFN1cHBvcnRJbmZvKGludCB1bmlxdWVJZCk7CiAKICAgICBzdGF0dXNfdCBvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBsZW5ndGgpOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGZkLCBvZmY2NF90IG9mZnNldCwKKyAgICAgICAgICAgIG9mZjY0X3QgbGVuZ3RoKTsKIAogICAgIHN0YXR1c190IG9uT3BlbkRlY3J5cHRTZXNzaW9uKAotICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBjb25zdCBjaGFyKiB1cmkpOworICAgICAgICAgICAgaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgY29uc3QgY2hhciogdXJpKTsKIAotICAgIHN0YXR1c190IG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUpOworICAgIHN0YXR1c190IG9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKTsKIAotICAgIHN0YXR1c190IG9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwKKyAgICBzdGF0dXNfdCBvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlLAogICAgICAgICAgICAgaW50IGRlY3J5cHRVbml0SWQsIGNvbnN0IERybUJ1ZmZlciogaGVhZGVySW5mbyk7CiAKLSAgICBzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBEZWNyeXB0SGFuZGxlKiBkZWNyeXB0SGFuZGxlLCBpbnQgZGVjcnlwdFVuaXRJZCwKKyAgICBzdGF0dXNfdCBvbkRlY3J5cHQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwgaW50IGRlY3J5cHRVbml0SWQsCiAgICAgICAgICAgICBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIElWKTsKIAotICAgIHN0YXR1c190IG9uRmluYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsIGludCBkZWNyeXB0VW5pdElkKTsKKyAgICBzdGF0dXNfdCBvbkZpbmFsaXplRGVjcnlwdFVuaXQoaW50IHVuaXF1ZUlkLCBzcDxEZWNyeXB0SGFuZGxlPiYgZGVjcnlwdEhhbmRsZSwKKyAgICAgICAgICAgIGludCBkZWNyeXB0VW5pdElkKTsKIAotICAgIHNzaXplX3Qgb25QcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIGRlY3J5cHRIYW5kbGUsCisgICAgc3NpemVfdCBvblByZWFkKGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsCiAgICAgICAgICAgICB2b2lkKiBidWZmZXIsIHNzaXplX3QgbnVtQnl0ZXMsIG9mZjY0X3Qgb2Zmc2V0KTsKLQotcHJpdmF0ZToKLSAgICBEZWNyeXB0SGFuZGxlKiBvcGVuRGVjcnlwdFNlc3Npb25JbXBsKCk7CiB9OwogCiB9OwpkaWZmIC0tZ2l0IGEvZHJtL2xpYmRybWZyYW1ld29yay9wbHVnaW5zL3Bhc3N0aHJ1L3NyYy9Ecm1QYXNzdGhydVBsdWdJbi5jcHAgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcAppbmRleCBkN2YyZDI4Li4wZmEzNDc4IDEwMDY0NAotLS0gYS9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcAorKysgYi9kcm0vbGliZHJtZnJhbWV3b3JrL3BsdWdpbnMvcGFzc3RocnUvc3JjL0RybVBhc3N0aHJ1UGx1Z0luLmNwcApAQCAtMTgzLDEzICsxODMsMTMgQEAKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uQ29uc3VtZVJpZ2h0cyhpbnQgdW5pcXVlSWQsCi0gICAgICAgICAgICBEZWNyeXB0SGFuZGxlKiAvKmRlY3J5cHRIYW5kbGUqLywgaW50IC8qYWN0aW9uKi8sIGJvb2wgLypyZXNlcnZlKi8pIHsKKyAgICAgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywgaW50IC8qYWN0aW9uKi8sIGJvb2wgLypyZXNlcnZlKi8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uQ29uc3VtZVJpZ2h0cygpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uU2V0UGxheWJhY2tTdGF0dXMoaW50IHVuaXF1ZUlkLAotICAgICAgICAgICAgRGVjcnlwdEhhbmRsZSogLypkZWNyeXB0SGFuZGxlKi8sIGludCAvKnBsYXliYWNrU3RhdHVzKi8sIGludDY0X3QgLypwb3NpdGlvbiovKSB7CisgICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiYgLypkZWNyeXB0SGFuZGxlKi8sIGludCAvKnBsYXliYWNrU3RhdHVzKi8sIGludDY0X3QgLypwb3NpdGlvbiovKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvblNldFBsYXliYWNrU3RhdHVzKCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICByZXR1cm4gRFJNX05PX0VSUk9SOwogfQpAQCAtMjM2LDcgKzIzNiw4IEBACiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbk9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgIGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSwgaW50IC8qZmQqLywgb2ZmNjRfdCAvKm9mZnNldCovLCBvZmY2NF90IC8qbGVuZ3RoKi8pIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIGRlY3J5cHRIYW5kbGUsIGludCAvKmZkKi8sIG9mZjY0X3QgLypvZmZzZXQqLywKKyAgICAgICAgICAgIG9mZjY0X3QgLypsZW5ndGgqLykgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25PcGVuRGVjcnlwdFNlc3Npb24oKSA6ICVkIiwgdW5pcXVlSWQpOwogCiAjaWZkZWYgRU5BQkxFX1BBU1NUSFJVX0RFQ1JZUFRJT04KQEAgLTI0NiwzNiArMjQ3LDM4IEBACiAgICAgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm8gPSBOVUxMOwogICAgIHJldHVybiBEUk1fTk9fRVJST1I7CiAjZWxzZQotICAgICh2b2lkKShkZWNyeXB0SGFuZGxlKTsgLy8gdW51c2VkCisgICAgKHZvaWQpKGRlY3J5cHRIYW5kbGUuZ2V0KCkpOyAvLyB1bnVzZWQKICNlbmRpZgogCiAgICAgcmV0dXJuIERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogfQogCiBzdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25PcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICBpbnQgLyp1bmlxdWVJZCovLCBEZWNyeXB0SGFuZGxlKiAvKmRlY3J5cHRIYW5kbGUqLywgY29uc3QgY2hhciogLyp1cmkqLykgeworICAgICAgICAgICAgaW50IC8qdW5pcXVlSWQqLywgc3A8RGVjcnlwdEhhbmRsZT4mIC8qZGVjcnlwdEhhbmRsZSovLCBjb25zdCBjaGFyKiAvKnVyaSovKSB7CiAgICAgcmV0dXJuIERSTV9FUlJPUl9DQU5OT1RfSEFORExFOwogfQogCi1zdGF0dXNfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25DbG9zZURlY3J5cHRTZXNzaW9uKGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogZGVjcnlwdEhhbmRsZSkgeworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uQ2xvc2VEZWNyeXB0U2Vzc2lvbihpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiBkZWNyeXB0SGFuZGxlKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkNsb3NlRGVjcnlwdFNlc3Npb24oKSA6ICVkIiwgdW5pcXVlSWQpOwotICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUpIHsKKyAgICBpZiAoTlVMTCAhPSBkZWNyeXB0SGFuZGxlLmdldCgpKSB7CiAgICAgICAgIGlmIChOVUxMICE9IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvKSB7CiAgICAgICAgICAgICBkZWxldGUgZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEluZm87IGRlY3J5cHRIYW5kbGUtPmRlY3J5cHRJbmZvID0gTlVMTDsKICAgICAgICAgfQotICAgICAgICBkZWxldGUgZGVjcnlwdEhhbmRsZTsgZGVjcnlwdEhhbmRsZSA9IE5VTEw7CisgICAgICAgIGRlY3J5cHRIYW5kbGUuY2xlYXIoKTsKICAgICB9CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uSW5pdGlhbGl6ZURlY3J5cHRVbml0KGludCB1bmlxdWVJZCwgRGVjcnlwdEhhbmRsZSogLypkZWNyeXB0SGFuZGxlKi8sCi0gICAgICAgICAgICBpbnQgLypkZWNyeXB0VW5pdElkKi8sIGNvbnN0IERybUJ1ZmZlciogLypoZWFkZXJJbmZvKi8pIHsKK3N0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkluaXRpYWxpemVEZWNyeXB0VW5pdChpbnQgdW5pcXVlSWQsCisgICAgICAgIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywKKyAgICAgICAgaW50IC8qZGVjcnlwdFVuaXRJZCovLCBjb25zdCBEcm1CdWZmZXIqIC8qaGVhZGVySW5mbyovKSB7CiAgICAgQUxPR1YoIkRybVBhc3N0aHJ1UGx1Z0luOjpvbkluaXRpYWxpemVEZWNyeXB0VW5pdCgpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLAotICAgICAgICAgICAgaW50IC8qZGVjcnlwdFVuaXRJZCovLCBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLCBEcm1CdWZmZXIqIC8qSVYqLykgeworc3RhdHVzX3QgRHJtUGFzc3RocnVQbHVnSW46Om9uRGVjcnlwdChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywKKyAgICAgICAgaW50IC8qZGVjcnlwdFVuaXRJZCovLCBjb25zdCBEcm1CdWZmZXIqIGVuY0J1ZmZlciwgRHJtQnVmZmVyKiogZGVjQnVmZmVyLAorICAgICAgICBEcm1CdWZmZXIqIC8qSVYqLykgewogICAgIEFMT0dWKCJEcm1QYXNzdGhydVBsdWdJbjo6b25EZWNyeXB0KCkgOiAlZCIsIHVuaXF1ZUlkKTsKICAgICAvKioKICAgICAgKiBBcyBhIHdvcmthcm91bmQgaW1wbGVtZW50YXRpb24gcGFzc3RocnUgd291bGQgY29weSB0aGUgZ2l2ZW4KQEAgLTI5NiwxMiArMjk5LDEyIEBACiB9CiAKIHN0YXR1c190IERybVBhc3N0aHJ1UGx1Z0luOjpvbkZpbmFsaXplRGVjcnlwdFVuaXQoCi0gICAgICAgICAgICBpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLCBpbnQgLypkZWNyeXB0VW5pdElkKi8pIHsKKyAgICAgICAgICAgIGludCB1bmlxdWVJZCwgc3A8RGVjcnlwdEhhbmRsZT4mIC8qZGVjcnlwdEhhbmRsZSovLCBpbnQgLypkZWNyeXB0VW5pdElkKi8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uRmluYWxpemVEZWNyeXB0VW5pdCgpIDogJWQiLCB1bmlxdWVJZCk7CiAgICAgcmV0dXJuIERSTV9OT19FUlJPUjsKIH0KIAotc3NpemVfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25QcmVhZChpbnQgdW5pcXVlSWQsIERlY3J5cHRIYW5kbGUqIC8qZGVjcnlwdEhhbmRsZSovLAorc3NpemVfdCBEcm1QYXNzdGhydVBsdWdJbjo6b25QcmVhZChpbnQgdW5pcXVlSWQsIHNwPERlY3J5cHRIYW5kbGU+JiAvKmRlY3J5cHRIYW5kbGUqLywKICAgICAgICAgICAgIHZvaWQqIC8qYnVmZmVyKi8sIHNzaXplX3QgLypudW1CeXRlcyovLCBvZmY2NF90IC8qb2Zmc2V0Ki8pIHsKICAgICBBTE9HVigiRHJtUGFzc3RocnVQbHVnSW46Om9uUHJlYWQoKSA6ICVkIiwgdW5pcXVlSWQpOwogICAgIHJldHVybiAwOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0FuZHJvaWQuYnAgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAppbmRleCA5MWQxZjdlLi41MmM3NDM4IDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icAorKysgYi9kcm0vbGlibWVkaWFkcm0vQW5kcm9pZC5icApAQCAtMiw5ICsyLDE2IEBACiAvLyBsaWJtZWRpYWRybQogLy8KIAotLy8gVE9ETzogY2hhbmdlIGl0IGJhY2sgdG8gY2NfbGlicmFyeV9zaGFyZWQgd2hlbiBNZWRpYVBsYXllcjIgc3dpdGNoZXMgdG8KLS8vIHVzaW5nIE5ka01lZGlhRHJtLCBpbnN0ZWFkIG9mIE1lZGlhRHJtLmphdmEuCi1jY19saWJyYXJ5IHsKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYm1lZGlhZHJtX2hlYWRlcnMiLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW50ZXJmYWNlIgorICAgIF0sCisKK30KKworY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtZWRpYWRybSIsCiAKICAgICBzcmNzOiBbCkBAIC0xOSwyMiArMjYsMzYgQEAKICAgICAgICAgIkNyeXB0b0hhbC5jcHAiLAogICAgIF0sCiAKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgICAgICAiaW50ZXJmYWNlIgorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIgorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKKwogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmRsIiwKICAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCiAgICAgICAgICJsaWJtZWRpYWRybW1ldHJpY3NfbGl0ZSIsCiAgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAogICAgICAgICAibGlibWVkaWF1dGlscyIsCi0gICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCisgICAgICAgICJsaWJyZXNvdXJjZW1hbmFnZXJzZXJ2aWNlIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAogICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgImxpYmhpZGx0cmFuc3BvcnQiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTUyLDIwICs3MywyNiBAQAogICAgICAgICAicHJvdG9zL21ldHJpY3MucHJvdG8iLAogICAgIF0sCiAKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiCisgICAgXSwKKwogICAgIHByb3RvOiB7CiAgICAgICAgIGV4cG9ydF9wcm90b19oZWFkZXJzOiB0cnVlLAogICAgICAgICB0eXBlOiAibGl0ZSIsCiAgICAgfSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCi0gICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMiIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogICAgIGNmbGFnczogWwpAQCAtODQsMTMgKzExMSwyMSBAQAogICAgICAgICAicHJvdG9zL21ldHJpY3MucHJvdG8iLAogICAgIF0sCiAKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiCisgICAgXSwKKwogICAgIHByb3RvOiB7CiAgICAgICAgIGV4cG9ydF9wcm90b19oZWFkZXJzOiB0cnVlLAogICAgICAgICB0eXBlOiAiZnVsbCIsCiAgICAgfSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjIiLAogICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliaGlkbGJhc2UiLApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0NyeXB0b0hhbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsLmNwcAppbmRleCAzMDM1YzVhLi5kNjJjY2Q2IDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vQ3J5cHRvSGFsLmNwcApAQCAtMzAsMTYgKzMwLDE2IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYWRybS9DcnlwdG9IYWwuaD4KIAordXNpbmcgZHJtOjpWMV8wOjpCdWZmZXJUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKK3VzaW5nIGRybTo6VjFfMDo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyBkcm06OlYxXzA6OklDcnlwdG9QbHVnaW47Cit1c2luZyBkcm06OlYxXzA6Ok1vZGU7Cit1c2luZyBkcm06OlYxXzA6OlBhdHRlcm47Cit1c2luZyBkcm06OlYxXzA6OlNoYXJlZEJ1ZmZlcjsKK3VzaW5nIGRybTo6VjFfMDo6U3RhdHVzOwordXNpbmcgZHJtOjpWMV8wOjpTdWJTYW1wbGU7CiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6QnVmZmVyVHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6RGVzdGluYXRpb25CdWZmZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OklDcnlwdG9GYWN0b3J5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpJQ3J5cHRvUGx1Z2luOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpNb2RlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpQYXR0ZXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3ViU2FtcGxlOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7CkBAIC01MCw2ICs1MCw3IEBACiB1c2luZyA6OmFuZHJvaWQ6OmhpZGw6Om1hbmFnZXI6OlYxXzA6OklTZXJ2aWNlTWFuYWdlcjsKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CiAKK3R5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNzYsNiArNzcsMTggQEAKICAgICB9CiB9CiAKK3N0YXRpYyBzdGF0dXNfdCB0b1N0YXR1c1RfMV8yKFN0YXR1c19WMV8yIHN0YXR1cykgeworICAgIHN3aXRjaCAoc3RhdHVzKSB7CisgICAgY2FzZSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX1NFU1NJT05fTE9TVF9TVEFURToKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9TRVNTSU9OX0xPU1RfU1RBVEU7OworICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOworICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiB0b1N0YXR1c1Qoc3RhdGljX2Nhc3Q8U3RhdHVzPihzdGF0dXMpKTsKKyAgICB9Cit9CiAKIHN0YXRpYyBoaWRsX3ZlYzx1aW50OF90PiB0b0hpZGxWZWMoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZ2ZWN0b3IpIHsKICAgICBoaWRsX3ZlYzx1aW50OF90PiB2ZWM7CkBAIC0xOTYsNiArMjA5LDkgQEAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1GYWN0b3JpZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgaWYgKG1GYWN0b3JpZXNbaV0tPmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpKSB7CiAgICAgICAgICAgICBtUGx1Z2luID0gbWFrZUNyeXB0b1BsdWdpbihtRmFjdG9yaWVzW2ldLCB1dWlkLCBkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIGlmIChtUGx1Z2luICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtUGx1Z2luVjFfMiA9IGRybTo6VjFfMjo6SUNyeXB0b1BsdWdpbjo6Y2FzdEZyb20obVBsdWdpbik7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTIxNiw2ICsyMzIsNyBAQAogICAgIH0KIAogICAgIG1QbHVnaW4uY2xlYXIoKTsKKyAgICBtUGx1Z2luVjFfMi5jbGVhcigpOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMjg0LDcgKzMwMSw3IEBACiAgICAgc3NpemVfdCBvZmZzZXQ7CiAgICAgc2l6ZV90IHNpemU7CiAKLSAgICBpZiAobWVtb3J5ID09IE5VTEwgJiYgYnVmZmVyID09IE5VTEwpIHsKKyAgICBpZiAobWVtb3J5ID09IE5VTEwgfHwgYnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIFVORVhQRUNURURfTlVMTDsKICAgICB9CiAKQEAgLTM4OSwyMSArNDA2LDMzIEBACiAgICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKICAgICB1aW50MzJfdCBieXRlc1dyaXR0ZW4gPSAwOwogCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5kZWNyeXB0KHNlY3VyZSwgdG9IaWRsQXJyYXkxNihrZXlJZCksIHRvSGlkbEFycmF5MTYoaXYpLCBoTW9kZSwKLSAgICAgICAgICAgIGhQYXR0ZXJuLCBoU3ViU2FtcGxlcywgaFNvdXJjZSwgb2Zmc2V0LCBoRGVzdGluYXRpb24sCi0gICAgICAgICAgICBbJl0oU3RhdHVzIHN0YXR1cywgdWludDMyX3QgaEJ5dGVzV3JpdHRlbiwgaGlkbF9zdHJpbmcgaERldGFpbGVkRXJyb3IpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gaEJ5dGVzV3JpdHRlbjsKLSAgICAgICAgICAgICAgICAgICAgKmVycm9yRGV0YWlsTXNnID0gdG9TdHJpbmc4KGhEZXRhaWxlZEVycm9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICk7CisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQ7CiAKLSAgICBpZiAoIWhSZXN1bHQuaXNPaygpKSB7Ci0gICAgICAgIGVyciA9IERFQURfT0JKRUNUOworICAgIGlmIChtUGx1Z2luVjFfMiAhPSBOVUxMKSB7CisgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luVjFfMi0+ZGVjcnlwdF8xXzIoc2VjdXJlLCB0b0hpZGxBcnJheTE2KGtleUlkKSwgdG9IaWRsQXJyYXkxNihpdiksCisgICAgICAgICAgICAgICAgaE1vZGUsIGhQYXR0ZXJuLCBoU3ViU2FtcGxlcywgaFNvdXJjZSwgb2Zmc2V0LCBoRGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1c19WMV8yIHN0YXR1cywgdWludDMyX3QgaEJ5dGVzV3JpdHRlbiwgaGlkbF9zdHJpbmcgaERldGFpbGVkRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGhCeXRlc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgICAgICAqZXJyb3JEZXRhaWxNc2cgPSB0b1N0cmluZzgoaERldGFpbGVkRXJyb3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVF8xXzIoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworICAgIH0gZWxzZSB7CisgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luLT5kZWNyeXB0KHNlY3VyZSwgdG9IaWRsQXJyYXkxNihrZXlJZCksIHRvSGlkbEFycmF5MTYoaXYpLAorICAgICAgICAgICAgICAgIGhNb2RlLCBoUGF0dGVybiwgaFN1YlNhbXBsZXMsIGhTb3VyY2UsIG9mZnNldCwgaERlc3RpbmF0aW9uLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCB1aW50MzJfdCBoQnl0ZXNXcml0dGVuLCBoaWRsX3N0cmluZyBoRGV0YWlsZWRFcnJvcikgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzV3JpdHRlbiA9IGhCeXRlc1dyaXR0ZW47CisgICAgICAgICAgICAgICAgICAgICAgICAqZXJyb3JEZXRhaWxNc2cgPSB0b1N0cmluZzgoaERldGFpbGVkRXJyb3IpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICk7CiAgICAgfQogCisgICAgZXJyID0gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgIHJldHVybiBieXRlc1dyaXR0ZW47CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0RybUhhbC5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAppbmRleCBjZjA4NjEwLi5hMjIzNGU2IDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vRHJtSGFsLmNwcApAQCAtMjMsOCArMjMsOCBAQAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC90eXBlcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tYW5hZ2VyLzEuMC9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWFuYWdlci8xLjIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8aGlkbC9TZXJ2aWNlTWFuYWdlbWVudC5oPgogCiAjaW5jbHVkZSA8bWVkaWEvRXZlbnRNZXRyaWMuaD4KQEAgLTQwLDE1ICs0MCwxNyBAQAogI2luY2x1ZGUgPG1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmg+CiAKIHVzaW5nIGRybTo6VjFfMDo6S2V5ZWRWZWN0b3I7Ci11c2luZyBkcm06OlYxXzA6OktleVN0YXR1c1R5cGU7Cit1c2luZyBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlOwogdXNpbmcgZHJtOjpWMV8wOjpLZXlUeXBlOwogdXNpbmcgZHJtOjpWMV8wOjpLZXlWYWx1ZTsKLXVzaW5nIGRybTo6VjFfMTo6SGRjcExldmVsOzsKIHVzaW5nIGRybTo6VjFfMDo6U2VjdXJlU3RvcDsKLXVzaW5nIGRybTo6VjFfMTo6U2VjdXJlU3RvcFJlbGVhc2U7CiB1c2luZyBkcm06OlYxXzA6OlNlY3VyZVN0b3BJZDsKLXVzaW5nIGRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKIHVzaW5nIGRybTo6VjFfMDo6U3RhdHVzOwordXNpbmcgZHJtOjpWMV8xOjpIZGNwTGV2ZWw7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyZVN0b3BSZWxlYXNlOwordXNpbmcgZHJtOjpWMV8xOjpTZWN1cml0eUxldmVsOwordXNpbmcgZHJtOjpWMV8yOjpLZXlTZXRJZDsKK3VzaW5nIGRybTo6VjFfMjo6S2V5U3RhdHVzVHlwZTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CkBAIC01OSw2ICs2MSwxMCBAQAogdXNpbmcgOjphbmRyb2lkOjpvczo6UGVyc2lzdGFibGVCdW5kbGU7CiB1c2luZyA6OmFuZHJvaWQ6OnNwOwogCit0eXBlZGVmIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGUgS2V5UmVxdWVzdFR5cGVfVjFfMTsKK3R5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7Cit0eXBlZGVmIGRybTo6VjFfMjo6SGRjcExldmVsIEhkY3BMZXZlbF9WMV8yOworCiBuYW1lc3BhY2UgewogCiAvLyBUaGlzIGNvbnN0YW50IGNvcnJlc3BvbmRzIHRvIHRoZSBQUk9QRVJUWV9ERVZJQ0VfVU5JUVVFX0lEIGNvbnN0YW50CkBAIC0xMzksMjYgKzE0NSw1NSBAQAogICAgIH0KIH0KIAotc3RhdGljIERybVBsdWdpbjo6SGRjcExldmVsIHRvSGRjcExldmVsKEhkY3BMZXZlbCBsZXZlbCkgeworc3RhdGljIFNlY3VyaXR5TGV2ZWwgdG9IaWRsU2VjdXJpdHlMZXZlbChEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwpIHsKICAgICBzd2l0Y2gobGV2ZWwpIHsKLSAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9OT05FOgorICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFN3U2VjdXJlQ3J5cHRvOgorICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0NSWVBUTzsKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxTd1NlY3VyZURlY29kZToKKyAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9ERUNPREU7CisgICAgY2FzZSBEcm1QbHVnaW46OmtTZWN1cml0eUxldmVsSHdTZWN1cmVDcnlwdG86CisgICAgICAgIHJldHVybiBTZWN1cml0eUxldmVsOjpIV19TRUNVUkVfQ1JZUFRPOworICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlRGVjb2RlOgorICAgICAgICByZXR1cm4gU2VjdXJpdHlMZXZlbDo6SFdfU0VDVVJFX0RFQ09ERTsKKyAgICBjYXNlIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxId1NlY3VyZUFsbDoKKyAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9BTEw7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIFNlY3VyaXR5TGV2ZWw6OlVOS05PV047CisgICAgfQorfQorCitzdGF0aWMgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlIHRvT2ZmbGluZUxpY2Vuc2VTdGF0ZSgKKyAgICAgICAgT2ZmbGluZUxpY2Vuc2VTdGF0ZSBsaWNlbnNlU3RhdGUpIHsKKyAgICBzd2l0Y2gobGljZW5zZVN0YXRlKSB7CisgICAgY2FzZSBPZmZsaW5lTGljZW5zZVN0YXRlOjpVU0FCTEU6CisgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlVXNhYmxlOworICAgIGNhc2UgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6SU5BQ1RJVkU6CisgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtPZmZsaW5lTGljZW5zZVN0YXRlUmVsZWFzZWQ7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a09mZmxpbmVMaWNlbnNlU3RhdGVVbmtub3duOworICAgIH0KK30KKworc3RhdGljIERybVBsdWdpbjo6SGRjcExldmVsIHRvSGRjcExldmVsKEhkY3BMZXZlbF9WMV8yIGxldmVsKSB7CisgICAgc3dpdGNoKGxldmVsKSB7CisgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9OT05FOgogICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcE5vbmU7Ci0gICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfVjE6CisgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9WMToKICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BWMTsKLSAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9WMjoKKyAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX1YyOgogICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYyOwotICAgIGNhc2UgSGRjcExldmVsOjpIRENQX1YyXzE6CisgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9WMl8xOgogICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYyXzE7Ci0gICAgY2FzZSBIZGNwTGV2ZWw6OkhEQ1BfVjJfMjoKKyAgICBjYXNlIEhkY3BMZXZlbF9WMV8yOjpIRENQX1YyXzI6CiAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwVjJfMjsKLSAgICBjYXNlIEhkY3BMZXZlbDo6SERDUF9OT19PVVRQVVQ6CisgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9WMl8zOgorICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprSGRjcFYyXzM7CisgICAgY2FzZSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9OT19PVVRQVVQ6CiAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtIZGNwTm9PdXRwdXQ7CiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0hkY3BMZXZlbFVua25vd247CiAgICAgfQogfQotCi0KIHN0YXRpYyA6OktleWVkVmVjdG9yIHRvSGlkbEtleWVkVmVjdG9yKGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+JgogICAgICAgICBrZXllZFZlY3RvcikgewogICAgIHN0ZDo6dmVjdG9yPEtleVZhbHVlPiBzdGRLZXllZFZlY3RvcjsKQEAgLTE5OSw2ICsyMzQsMTUgQEAKICAgICByZXR1cm4gc2VjdXJlU3RvcElkczsKIH0KIAorc3RhdGljIExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiB0b0tleVNldElkcyhjb25zdCBoaWRsX3ZlYzxLZXlTZXRJZD4mCisgICAgICAgIGhLZXlTZXRJZHMpIHsKKyAgICBMaXN0PFZlY3Rvcjx1aW50OF90Pj4ga2V5U2V0SWRzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaEtleVNldElkcy5zaXplKCk7IGkrKykgeworICAgICAgICBrZXlTZXRJZHMucHVzaF9iYWNrKHRvVmVjdG9yKGhLZXlTZXRJZHNbaV0pKTsKKyAgICB9CisgICAgcmV0dXJuIGtleVNldElkczsKK30KKwogc3RhdGljIHN0YXR1c190IHRvU3RhdHVzVChTdGF0dXMgc3RhdHVzKSB7CiAgICAgc3dpdGNoIChzdGF0dXMpIHsKICAgICBjYXNlIFN0YXR1czo6T0s6CkBAIC0yMTcsNyArMjYxLDcgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwogICAgICAgICBicmVhazsKICAgICBjYXNlIFN0YXR1czo6RVJST1JfRFJNX0lOVkFMSURfU1RBVEU6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fVEFNUEVSX0RFVEVDVEVEOworICAgICAgICByZXR1cm4gRVJST1JfRFJNX0lOVkFMSURfU1RBVEU7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgU3RhdHVzOjpCQURfVkFMVUU6CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0yMzgsMzggKzI4Miw1OCBAQAogICAgIH0KIH0KIAorc3RhdGljIHN0YXR1c190IHRvU3RhdHVzVF8xXzIoU3RhdHVzX1YxXzIgc3RhdHVzKSB7CisgICAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTjoKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9SRVNPVVJDRV9DT05URU5USU9OOworICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFOworICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk6CisgICAgICAgIHJldHVybiBFUlJPUl9EUk1fSU5TVUZGSUNJRU5UX1NFQ1VSSVRZOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiB0b1N0YXR1c1Qoc3RhdGljX2Nhc3Q8U3RhdHVzPihzdGF0dXMpKTsKKyAgICB9Cit9CiAKIE11dGV4IERybUhhbDo6bUxvY2s7CiAKLXN0cnVjdCBEcm1TZXNzaW9uQ2xpZW50IDogcHVibGljIERybVNlc3Npb25DbGllbnRJbnRlcmZhY2UgewotICAgIGV4cGxpY2l0IERybVNlc3Npb25DbGllbnQoRHJtSGFsKiBkcm0pIDogbURybShkcm0pIHt9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgcmVjbGFpbVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpIHsKLSAgICAgICAgc3A8RHJtSGFsPiBkcm0gPSBtRHJtLnByb21vdGUoKTsKLSAgICAgICAgaWYgKGRybSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXNfdCBlcnIgPSBkcm0tPmNsb3NlU2Vzc2lvbihzZXNzaW9uSWQpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZHJtLT5zZW5kRXZlbnQoRXZlbnRUeXBlOjpTRVNTSU9OX1JFQ0xBSU1FRCwKLSAgICAgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgaGlkbF92ZWM8dWludDhfdD4oKSk7Citib29sIERybUhhbDo6RHJtU2Vzc2lvbkNsaWVudDo6cmVjbGFpbVJlc291cmNlKCkgeworICAgIHNwPERybUhhbD4gZHJtID0gbURybS5wcm9tb3RlKCk7CisgICAgaWYgKGRybSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KKyAgICBzdGF0dXNfdCBlcnIgPSBkcm0tPmNsb3NlU2Vzc2lvbihtU2Vzc2lvbklkKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZHJtLT5zZW5kRXZlbnQoRXZlbnRUeXBlOjpTRVNTSU9OX1JFQ0xBSU1FRCwKKyAgICAgICAgICAgIHRvSGlkbFZlYyhtU2Vzc2lvbklkKSwgaGlkbF92ZWM8dWludDhfdD4oKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CiAKLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5Ecm1TZXNzaW9uQ2xpZW50KCkge30KK1N0cmluZzggRHJtSGFsOjpEcm1TZXNzaW9uQ2xpZW50OjpnZXROYW1lKCkgeworICAgIFN0cmluZzggbmFtZTsKKyAgICBzcDxEcm1IYWw+IGRybSA9IG1Ecm0ucHJvbW90ZSgpOworICAgIGlmIChkcm0gPT0gTlVMTCkgeworICAgICAgICBuYW1lLmFwcGVuZCgiPGRlbGV0ZWQ+Iik7CisgICAgfSBlbHNlIGlmIChkcm0tPmdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgidmVuZG9yIiksIG5hbWUpICE9IE9LCisgICAgICAgIHx8IG5hbWUuaXNFbXB0eSgpKSB7CisgICAgICBuYW1lLmFwcGVuZCgiPEdldCB2ZW5kb3IgZmFpbGVkIG9yIGlzIGVtcHR5PiIpOworICAgIH0KKyAgICBuYW1lLmFwcGVuZCgiWyIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNlc3Npb25JZC5zaXplKCk7ICsraSkgeworICAgICAgICBuYW1lLmFwcGVuZEZvcm1hdCgiJTAyeCIsIG1TZXNzaW9uSWRbaV0pOworICAgIH0KKyAgICBuYW1lLmFwcGVuZCgiXSIpOworICAgIHJldHVybiBuYW1lOworfQogCi1wcml2YXRlOgotICAgIHdwPERybUhhbD4gbURybTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERybVNlc3Npb25DbGllbnQpOwotfTsKK0RybUhhbDo6RHJtU2Vzc2lvbkNsaWVudDo6fkRybVNlc3Npb25DbGllbnQoKSB7CisgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnJlbW92ZVNlc3Npb24obVNlc3Npb25JZCk7Cit9CiAKIERybUhhbDo6RHJtSGFsKCkKLSAgIDogbURybVNlc3Npb25DbGllbnQobmV3IERybVNlc3Npb25DbGllbnQodGhpcykpLAotICAgICBtRmFjdG9yaWVzKG1ha2VEcm1GYWN0b3JpZXMoKSksCisgICA6IG1GYWN0b3JpZXMobWFrZURybUZhY3RvcmllcygpKSwKICAgICAgbUluaXRDaGVjaygobUZhY3Rvcmllcy5zaXplKCkgPT0gMCkgPyBFUlJPUl9VTlNVUFBPUlRFRCA6IE5PX0lOSVQpIHsKIH0KIApAQCAtMjc4LDE0ICszNDIsMTMgQEAKICAgICBhdXRvIG9wZW5TZXNzaW9ucyA9IG1PcGVuU2Vzc2lvbnM7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvcGVuU2Vzc2lvbnMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIGNsb3NlU2Vzc2lvbihvcGVuU2Vzc2lvbnNbaV0pOworICAgICAgICBjbG9zZVNlc3Npb24ob3BlblNlc3Npb25zW2ldLT5tU2Vzc2lvbklkKTsKICAgICAgICAgbUxvY2subG9jaygpOwogICAgIH0KICAgICBtT3BlblNlc3Npb25zLmNsZWFyKCk7CiB9CiAKIERybUhhbDo6fkRybUhhbCgpIHsKLSAgICBEcm1TZXNzaW9uTWFuYWdlcjo6SW5zdGFuY2UoKS0+cmVtb3ZlRHJtKG1Ecm1TZXNzaW9uQ2xpZW50KTsKIH0KIAogdm9pZCBEcm1IYWw6OmNsZWFudXAoKSB7CkBAIC0yOTcsMzkgKzM2MCw1MSBAQAogCiAgICAgc2V0TGlzdGVuZXIoTlVMTCk7CiAgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7Ci0KLSAgICBpZiAobVBsdWdpbiAhPSBOVUxMKSB7CisgICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKCFtUGx1Z2luVjFfMi0+c2V0TGlzdGVuZXIoTlVMTCkuaXNPaygpKSB7CisgICAgICAgICAgICBtSW5pdENoZWNrID0gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKG1QbHVnaW4gIT0gTlVMTCkgewogICAgICAgICBpZiAoIW1QbHVnaW4tPnNldExpc3RlbmVyKE5VTEwpLmlzT2soKSkgewogICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOwogICAgICAgICB9CiAgICAgfQogICAgIG1QbHVnaW4uY2xlYXIoKTsKICAgICBtUGx1Z2luVjFfMS5jbGVhcigpOworICAgIG1QbHVnaW5WMV8yLmNsZWFyKCk7CiB9CiAKIFZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IERybUhhbDo6bWFrZURybUZhY3RvcmllcygpIHsKICAgICBWZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBmYWN0b3JpZXM7CiAKLSAgICBhdXRvIG1hbmFnZXIgPSBoYXJkd2FyZTo6ZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgYXV0byBtYW5hZ2VyID0gaGFyZHdhcmU6OmRlZmF1bHRTZXJ2aWNlTWFuYWdlcjFfMigpOwogCiAgICAgaWYgKG1hbmFnZXIgIT0gTlVMTCkgewotICAgICAgICBtYW5hZ2VyLT5saXN0QnlJbnRlcmZhY2UoZHJtOjpWMV8wOjpJRHJtRmFjdG9yeTo6ZGVzY3JpcHRvciwKKyAgICAgICAgbWFuYWdlci0+bGlzdE1hbmlmZXN0QnlJbnRlcmZhY2UoZHJtOjpWMV8wOjpJRHJtRmFjdG9yeTo6ZGVzY3JpcHRvciwKICAgICAgICAgICAgICAgICBbJmZhY3Rvcmllc10oY29uc3QgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICZyZWdpc3RlcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmaW5zdGFuY2UgOiByZWdpc3RlcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGZhY3RvcnkgPSBkcm06OlYxXzA6OklEcm1GYWN0b3J5OjpnZXRTZXJ2aWNlKGluc3RhbmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZm91bmQgZHJtQDEuMCBJRHJtRmFjdG9yeSAlcyIsIGluc3RhbmNlLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2soZmFjdG9yeSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICApOwotICAgICAgICBtYW5hZ2VyLT5saXN0QnlJbnRlcmZhY2UoZHJtOjpWMV8xOjpJRHJtRmFjdG9yeTo6ZGVzY3JpcHRvciwKKyAgICAgICAgbWFuYWdlci0+bGlzdE1hbmlmZXN0QnlJbnRlcmZhY2UoZHJtOjpWMV8xOjpJRHJtRmFjdG9yeTo6ZGVzY3JpcHRvciwKICAgICAgICAgICAgICAgICBbJmZhY3Rvcmllc10oY29uc3QgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICZyZWdpc3RlcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmaW5zdGFuY2UgOiByZWdpc3RlcmVkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGZhY3RvcnkgPSBkcm06OlYxXzE6OklEcm1GYWN0b3J5OjpnZXRTZXJ2aWNlKGluc3RhbmNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZm91bmQgZHJtQDEuMSBJRHJtRmFjdG9yeSAlcyIsIGluc3RhbmNlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhY3Rvcmllcy5wdXNoX2JhY2soZmFjdG9yeSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICApOworICAgICAgICBtYW5hZ2VyLT5saXN0QnlJbnRlcmZhY2UoZHJtOjpWMV8yOjpJRHJtRmFjdG9yeTo6ZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICBbJmZhY3Rvcmllc10oY29uc3QgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICZyZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmaW5zdGFuY2UgOiByZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGZhY3RvcnkgPSBkcm06OlYxXzI6OklEcm1GYWN0b3J5OjpnZXRTZXJ2aWNlKGluc3RhbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmYWN0b3J5ICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWN0b3JpZXMucHVzaF9iYWNrKGZhY3RvcnkpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CkBAIC00NDgsNiArNTIzLDE3IEBACiB9CiAKIFJldHVybjx2b2lkPiBEcm1IYWw6OnNlbmRLZXlzQ2hhbmdlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVN0YXR1c19WMV8wPiYga2V5U3RhdHVzTGlzdF9WMV8wLCBib29sIGhhc05ld1VzYWJsZUtleSkgeworICAgIHN0ZDo6dmVjdG9yPEtleVN0YXR1cz4ga2V5U3RhdHVzVmVjOworICAgIGZvciAoY29uc3QgYXV0byAma2V5U3RhdHVzX1YxXzAgOiBrZXlTdGF0dXNMaXN0X1YxXzApIHsKKyAgICAgICAga2V5U3RhdHVzVmVjLnB1c2hfYmFjayh7a2V5U3RhdHVzX1YxXzAua2V5SWQsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8S2V5U3RhdHVzVHlwZT4oa2V5U3RhdHVzX1YxXzAudHlwZSl9KTsKKyAgICB9CisgICAgaGlkbF92ZWM8S2V5U3RhdHVzPiBrZXlTdGF0dXNMaXN0X1YxXzIoa2V5U3RhdHVzVmVjKTsKKyAgICByZXR1cm4gc2VuZEtleXNDaGFuZ2VfMV8yKHNlc3Npb25JZCwga2V5U3RhdHVzTGlzdF9WMV8yLCBoYXNOZXdVc2FibGVLZXkpOworfQorCitSZXR1cm48dm9pZD4gRHJtSGFsOjpzZW5kS2V5c0NoYW5nZV8xXzIoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKICAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5U3RhdHVzPiYga2V5U3RhdHVzTGlzdCwgYm9vbCBoYXNOZXdVc2FibGVLZXkpIHsKIAogICAgIG1FdmVudExvY2subG9jaygpOwpAQCAtNDc3LDYgKzU2Myw5IEBACiAgICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6OlNUQVRVU1BFTkRJTkc6CiAgICAgICAgICAgICAgICAgdHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfU3RhdHVzUGVuZGluZzsKICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgS2V5U3RhdHVzVHlwZTo6VVNBQkxFSU5GVVRVUkU6CisgICAgICAgICAgICAgICAgdHlwZSA9IERybVBsdWdpbjo6a0tleVN0YXR1c1R5cGVfVXNhYmxlSW5GdXR1cmU7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIEtleVN0YXR1c1R5cGU6OklOVEVSTkFMRVJST1I6CiAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgIHR5cGUgPSBEcm1QbHVnaW46OmtLZXlTdGF0dXNUeXBlX0ludGVybmFsRXJyb3I7CkBAIC01MDEsMzIgKzU5MCw4MCBAQAogICAgIHJldHVybiBWb2lkKCk7CiB9CiAKLWJvb2wgRHJtSGFsOjppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CitSZXR1cm48dm9pZD4gRHJtSGFsOjpzZW5kU2Vzc2lvbkxvc3RTdGF0ZSgKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCkgewogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmFjdG9yaWVzLnNpemUoKTsgaSsrKSB7CisgICAgbUV2ZW50TG9jay5sb2NrKCk7CisgICAgc3A8SURybUNsaWVudD4gbGlzdGVuZXIgPSBtTGlzdGVuZXI7CisgICAgbUV2ZW50TG9jay51bmxvY2soKTsKKworICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7CisgICAgICAgIFBhcmNlbCBvYmo7CisgICAgICAgIHdyaXRlQnl0ZUFycmF5KG9iaiwgc2Vzc2lvbklkKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU5vdGlmeUxvY2spOworICAgICAgICBsaXN0ZW5lci0+bm90aWZ5KERybVBsdWdpbjo6a0RybVBsdWdpbkV2ZW50U2Vzc2lvbkxvc3RTdGF0ZSwgMCwgJm9iaik7CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK3N0YXR1c190IERybUhhbDo6bWF0Y2hNaW1lVHlwZUFuZFNlY3VyaXR5TGV2ZWwoY29uc3Qgc3A8SURybUZhY3Rvcnk+ICZmYWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCkgeworICAgICppc1N1cHBvcnRlZCA9IGZhbHNlOworCisgICAgLy8gaGFuZGxlIGRlZmF1bHQgdmFsdWUgY2FzZXMKKyAgICBpZiAobGV2ZWwgPT0gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFVua25vd24pIHsKKyAgICAgICAgaWYgKG1pbWVUeXBlID09ICIiKSB7CisgICAgICAgICAgICAvLyBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKQorICAgICAgICAgICAgKmlzU3VwcG9ydGVkID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQsIG1pbWVUeXBlKQorICAgICAgICAgICAgKmlzU3VwcG9ydGVkID0gZmFjdG9yeS0+aXNDb250ZW50VHlwZVN1cHBvcnRlZChtaW1lVHlwZS5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZiAobWltZVR5cGUgPT0gIiIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxkcm06OlYxXzI6OklEcm1GYWN0b3J5PiBmYWN0b3J5VjFfMiA9IGRybTo6VjFfMjo6SURybUZhY3Rvcnk6OmNhc3RGcm9tKGZhY3RvcnkpOworICAgIGlmIChmYWN0b3J5VjFfMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9IGVsc2UgeworICAgICAgICAqaXNTdXBwb3J0ZWQgPSBmYWN0b3J5VjFfMi0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWRfMV8yKHV1aWQsCisgICAgICAgICAgICAgICAgbWltZVR5cGUuc3RyaW5nKCksIHRvSGlkbFNlY3VyaXR5TGV2ZWwobGV2ZWwpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KK30KKworc3RhdHVzX3QgRHJtSGFsOjppc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgKmlzU3VwcG9ydGVkID0gZmFsc2U7CisgICAgZm9yIChzc2l6ZV90IGkgPSBtRmFjdG9yaWVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgIGlmIChtRmFjdG9yaWVzW2ldLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKSkgewotICAgICAgICAgICAgaWYgKG1pbWVUeXBlICE9ICIiKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1GYWN0b3JpZXNbaV0tPmlzQ29udGVudFR5cGVTdXBwb3J0ZWQobWltZVR5cGUuc3RyaW5nKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hNaW1lVHlwZUFuZFNlY3VyaXR5TGV2ZWwobUZhY3Rvcmllc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgdXVpZCwgbWltZVR5cGUsIGxldmVsLCBpc1N1cHBvcnRlZCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgRHJtSGFsOjpjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwKICAgICAgICAgY29uc3QgU3RyaW5nOCYgYXBwUGFja2FnZU5hbWUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRmFjdG9yaWVzLnNpemUoKTsgaSsrKSB7CisgICAgZm9yIChzc2l6ZV90IGkgPSBtRmFjdG9yaWVzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgIGlmIChtRmFjdG9yaWVzW2ldLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkKSkgewotICAgICAgICAgICAgbVBsdWdpbiA9IG1ha2VEcm1QbHVnaW4obUZhY3Rvcmllc1tpXSwgdXVpZCwgYXBwUGFja2FnZU5hbWUpOwotICAgICAgICAgICAgaWYgKG1QbHVnaW4gIT0gTlVMTCkgeworICAgICAgICAgICAgYXV0byBwbHVnaW4gPSBtYWtlRHJtUGx1Z2luKG1GYWN0b3JpZXNbaV0sIHV1aWQsIGFwcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIGlmIChwbHVnaW4gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1QbHVnaW4gPSBwbHVnaW47CiAgICAgICAgICAgICAgICAgbVBsdWdpblYxXzEgPSBkcm06OlYxXzE6OklEcm1QbHVnaW46OmNhc3RGcm9tKG1QbHVnaW4pOworICAgICAgICAgICAgICAgIG1QbHVnaW5WMV8yID0gZHJtOjpWMV8yOjpJRHJtUGx1Z2luOjpjYXN0RnJvbShtUGx1Z2luKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTUzNCwxMyArNjcxLDIyIEBACiAgICAgaWYgKG1QbHVnaW4gPT0gTlVMTCkgewogICAgICAgICBtSW5pdENoZWNrID0gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCFtUGx1Z2luLT5zZXRMaXN0ZW5lcih0aGlzKS5pc09rKCkpIHsKKyAgICAgICAgbUluaXRDaGVjayA9IE9LOworICAgICAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKCFtUGx1Z2luVjFfMi0+c2V0TGlzdGVuZXIodGhpcykuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IERFQURfT0JKRUNUOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFtUGx1Z2luLT5zZXRMaXN0ZW5lcih0aGlzKS5pc09rKCkpIHsKICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBERUFEX09CSkVDVDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKKyAgICAgICAgfQorICAgICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICAgICAgbVBsdWdpbi5jbGVhcigpOworICAgICAgICAgICAgbVBsdWdpblYxXzEuY2xlYXIoKTsKKyAgICAgICAgICAgIG1QbHVnaW5WMV8yLmNsZWFyKCk7CiAgICAgICAgIH0KICAgICB9CiAKKwogICAgIHJldHVybiBtSW5pdENoZWNrOwogfQogCkBAIC01NTQsMzAgKzcwMCwxNSBAQAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAgICAgSU5JVF9DSEVDSygpOwogCi0gICAgU2VjdXJpdHlMZXZlbCBoU2VjdXJpdHlMZXZlbDsKKyAgICBTZWN1cml0eUxldmVsIGhTZWN1cml0eUxldmVsID0gdG9IaWRsU2VjdXJpdHlMZXZlbChsZXZlbCk7CiAgICAgYm9vbCBzZXRTZWN1cml0eUxldmVsID0gdHJ1ZTsKIAotICAgIHN3aXRjaChsZXZlbCkgewotICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFN3U2VjdXJlQ3J5cHRvOgotICAgICAgICBoU2VjdXJpdHlMZXZlbCA9IFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9DUllQVE87Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbFN3U2VjdXJlRGVjb2RlOgotICAgICAgICBoU2VjdXJpdHlMZXZlbCA9IFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9ERUNPREU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlQ3J5cHRvOgotICAgICAgICBoU2VjdXJpdHlMZXZlbCA9IFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9DUllQVE87Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlRGVjb2RlOgotICAgICAgICBoU2VjdXJpdHlMZXZlbCA9IFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9ERUNPREU7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbEh3U2VjdXJlQWxsOgotICAgICAgICBoU2VjdXJpdHlMZXZlbCA9IFNlY3VyaXR5TGV2ZWw6OkhXX1NFQ1VSRV9BTEw7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbE1heDoKKyAgICBpZiAobGV2ZWwgPT0gRHJtUGx1Z2luOjprU2VjdXJpdHlMZXZlbE1heCkgewogICAgICAgICBzZXRTZWN1cml0eUxldmVsID0gZmFsc2U7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaFNlY3VyaXR5TGV2ZWwgPT0gU2VjdXJpdHlMZXZlbDo6VU5LTk9XTikgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgICAgICB9CiAgICAgfQogCiAgICAgc3RhdHVzX3QgIGVyciA9IFVOS05PV05fRVJST1I7CkBAIC02MjMsOSArNzU0LDkgQEAKICAgICB9IHdoaWxlIChyZXRyeSk7CiAKICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT5hZGRTZXNzaW9uKGdldENhbGxpbmdQaWQoKSwKLSAgICAgICAgICAgICAgICBtRHJtU2Vzc2lvbkNsaWVudCwgc2Vzc2lvbklkKTsKLSAgICAgICAgbU9wZW5TZXNzaW9ucy5wdXNoKHNlc3Npb25JZCk7CisgICAgICAgIHNwPERybVNlc3Npb25DbGllbnQ+IGNsaWVudChuZXcgRHJtU2Vzc2lvbkNsaWVudCh0aGlzLCBzZXNzaW9uSWQpKTsKKyAgICAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPmFkZFNlc3Npb24oZ2V0Q2FsbGluZ1BpZCgpLCBjbGllbnQsIHNlc3Npb25JZCk7CisgICAgICAgIG1PcGVuU2Vzc2lvbnMucHVzaChjbGllbnQpOwogICAgICAgICBtTWV0cmljcy5TZXRTZXNzaW9uU3RhcnQoc2Vzc2lvbklkKTsKICAgICB9CiAKQEAgLTY0Miw3ICs3NzMsNyBAQAogICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKICAgICAgICAgICAgIERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpLT5yZW1vdmVTZXNzaW9uKHNlc3Npb25JZCk7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PcGVuU2Vzc2lvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobU9wZW5TZXNzaW9uc1tpXSA9PSBzZXNzaW9uSWQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNFcXVhbFNlc3Npb25JZChtT3BlblNlc3Npb25zW2ldLT5tU2Vzc2lvbklkLCBzZXNzaW9uSWQpKSB7CiAgICAgICAgICAgICAgICAgICAgIG1PcGVuU2Vzc2lvbnMucmVtb3ZlQXQoaSk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KQEAgLTY1Nyw2ICs3ODgsMzkgQEAKICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CiB9CiAKK3N0YXRpYyBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlIHRvS2V5UmVxdWVzdFR5cGUoCisgICAgICAgIEtleVJlcXVlc3RUeXBlIGtleVJlcXVlc3RUeXBlKSB7CisgICAgc3dpdGNoIChrZXlSZXF1ZXN0VHlwZSkgeworICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlOjpJTklUSUFMOgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX0luaXRpYWw7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZTo6UkVORVdBTDoKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZW5ld2FsOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgS2V5UmVxdWVzdFR5cGU6OlJFTEVBU0U6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVsZWFzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1Vua25vd247CisgICAgICAgICAgICBicmVhazsKKyAgICB9Cit9CisKK3N0YXRpYyBEcm1QbHVnaW46OktleVJlcXVlc3RUeXBlIHRvS2V5UmVxdWVzdFR5cGVfMV8xKAorICAgICAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xIGtleVJlcXVlc3RUeXBlKSB7CisgICAgc3dpdGNoIChrZXlSZXF1ZXN0VHlwZSkgeworICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlX1YxXzE6Ok5PTkU6CisgICAgICAgICAgICByZXR1cm4gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfTm9uZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEtleVJlcXVlc3RUeXBlX1YxXzE6OlVQREFURToKKyAgICAgICAgICAgIHJldHVybiBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9VcGRhdGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiB0b0tleVJlcXVlc3RUeXBlKHN0YXRpY19jYXN0PEtleVJlcXVlc3RUeXBlPihrZXlSZXF1ZXN0VHlwZSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorfQorCiBzdGF0dXNfdCBEcm1IYWw6OmdldEtleVJlcXVlc3QoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5pdERhdGEsIFN0cmluZzggY29uc3QgJm1pbWVUeXBlLAogICAgICAgICBEcm1QbHVnaW46OktleVR5cGUga2V5VHlwZSwgS2V5ZWRWZWN0b3I8U3RyaW5nOCwKQEAgLTY4Myw3MyArODQ3LDUxIEBACiAgICAgOjpLZXllZFZlY3RvciBoT3B0aW9uYWxQYXJhbWV0ZXJzID0gdG9IaWRsS2V5ZWRWZWN0b3Iob3B0aW9uYWxQYXJhbWV0ZXJzKTsKIAogICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQ7CiAKLSAgICBpZiAobVBsdWdpblYxXzEgIT0gTlVMTCkgewotICAgICAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9Ci0gICAgICAgICAgICBtUGx1Z2luVjFfMS0+Z2V0S2V5UmVxdWVzdF8xXzEoCisgICAgaWYgKG1QbHVnaW5WMV8yICE9IE5VTEwpIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRLZXlSZXF1ZXN0XzFfMigKKyAgICAgICAgICAgICAgICB0b0hpZGxWZWMoc2Vzc2lvbklkKSwgdG9IaWRsVmVjKGluaXREYXRhKSwKKyAgICAgICAgICAgICAgICB0b0hpZGxTdHJpbmcobWltZVR5cGUpLCBoS2V5VHlwZSwgaE9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzX1YxXzIgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xIGhLZXlSZXF1ZXN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCA9IHRvVmVjdG9yKGhSZXF1ZXN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOworICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gdG9LZXlSZXF1ZXN0VHlwZV8xXzEoaEtleVJlcXVlc3RUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1RfMV8yKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIGlmIChtUGx1Z2luVjFfMSAhPSBOVUxMKSB7CisgICAgICAgIGhSZXN1bHQgPSBtUGx1Z2luVjFfMS0+Z2V0S2V5UmVxdWVzdF8xXzEoCiAgICAgICAgICAgICAgICAgdG9IaWRsVmVjKHNlc3Npb25JZCksIHRvSGlkbFZlYyhpbml0RGF0YSksCiAgICAgICAgICAgICAgICAgdG9IaWRsU3RyaW5nKG1pbWVUeXBlKSwgaEtleVR5cGUsIGhPcHRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZSBoS2V5UmVxdWVzdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgewotCi0gICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOwotICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOwotCi0gICAgICAgICAgICAgICAgc3dpdGNoIChoS2V5UmVxdWVzdFR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlOjpJTklUSUFMOgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfSW5pdGlhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGU6OlJFTkVXQUw6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZW5ld2FsOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZTo6UkVMRUFTRToKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1JlbGVhc2U7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzE6OktleVJlcXVlc3RUeXBlOjpOT05FOgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfTm9uZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGU6OlVQREFURToKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX1VwZGF0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfVW5rbm93bjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpbi0+Z2V0S2V5UmVxdWVzdCh0b0hpZGxWZWMoc2Vzc2lvbklkKSwKLSAgICAgICAgICAgIHRvSGlkbFZlYyhpbml0RGF0YSksIHRvSGlkbFN0cmluZyhtaW1lVHlwZSksIGhLZXlUeXBlLCBoT3B0aW9uYWxQYXJhbWV0ZXJzLAotICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgZHJtOjpWMV8wOjpLZXlSZXF1ZXN0VHlwZSBoS2V5UmVxdWVzdFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgewotCi0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOwotCi0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoaEtleVJlcXVlc3RUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgZHJtOjpWMV8wOjpLZXlSZXF1ZXN0VHlwZTo6SU5JVElBTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IERybVBsdWdpbjo6a0tleVJlcXVlc3RUeXBlX0luaXRpYWw7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBkcm06OlYxXzA6OktleVJlcXVlc3RUeXBlOjpSRU5FV0FMOgotICAgICAgICAgICAgICAgICAgICAgICAgKmtleVJlcXVlc3RUeXBlID0gRHJtUGx1Z2luOjprS2V5UmVxdWVzdFR5cGVfUmVuZXdhbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIGRybTo6VjFfMDo6S2V5UmVxdWVzdFR5cGU6OlJFTEVBU0U6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9SZWxlYXNlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBEcm1QbHVnaW46OmtLZXlSZXF1ZXN0VHlwZV9Vbmtub3duOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xIGhLZXlSZXF1ZXN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IHRvS2V5UmVxdWVzdFR5cGVfMV8xKGhLZXlSZXF1ZXN0VHlwZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW4tPmdldEtleVJlcXVlc3QoCisgICAgICAgICAgICAgICAgdG9IaWRsVmVjKHNlc3Npb25JZCksIHRvSGlkbFZlYyhpbml0RGF0YSksCisgICAgICAgICAgICAgICAgdG9IaWRsU3RyaW5nKG1pbWVUeXBlKSwgaEtleVR5cGUsIGhPcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtleVJlcXVlc3RUeXBlIGhLZXlSZXF1ZXN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBoRGVmYXVsdFVybCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICprZXlSZXF1ZXN0VHlwZSA9IHRvS2V5UmVxdWVzdFR5cGUoaEtleVJlcXVlc3RUeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CiAKICAgICBlcnIgPSBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOwogICAgIGtleVJlcXVlc3RUaW1lci5TZXRBdHRyaWJ1dGUoZXJyKTsKQEAgLTc1OSw5ICs5MDEsOCBAQAogc3RhdHVzX3QgRHJtSGFsOjpwcm92aWRlS2V5UmVzcG9uc2UoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCiAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmcmVzcG9uc2UsIFZlY3Rvcjx1aW50OF90PiAma2V5U2V0SWQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IGtleVJlc3BvbnNlVGltZXIoJm1NZXRyaWNzLm1Qcm92aWRlS2V5UmVzcG9uc2VUaW1lVXMpOwotCiAgICAgSU5JVF9DSEVDSygpOworICAgIEV2ZW50VGltZXI8c3RhdHVzX3Q+IGtleVJlc3BvbnNlVGltZXIoJm1NZXRyaWNzLm1Qcm92aWRlS2V5UmVzcG9uc2VUaW1lVXMpOwogCiAgICAgRHJtU2Vzc2lvbk1hbmFnZXI6Okluc3RhbmNlKCktPnVzZVNlc3Npb24oc2Vzc2lvbklkKTsKIApAQCAtODMxLDE4ICs5NzIsMzMgQEAKICAgICBJTklUX0NIRUNLKCk7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworICAgIFJldHVybjx2b2lkPiBoUmVzdWx0OwogCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luLT5nZXRQcm92aXNpb25SZXF1ZXN0KAotICAgICAgICAgICAgdG9IaWRsU3RyaW5nKGNlcnRUeXBlKSwgdG9IaWRsU3RyaW5nKGNlcnRBdXRob3JpdHkpLAotICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBoUmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGhEZWZhdWx0VXJsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHRVcmwgPSB0b1N0cmluZzgoaERlZmF1bHRVcmwpOworICAgIGlmIChtUGx1Z2luVjFfMiAhPSBOVUxMKSB7CisgICAgICAgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmdldFByb3Zpc2lvblJlcXVlc3RfMV8yKAorICAgICAgICAgICAgICAgIHRvSGlkbFN0cmluZyhjZXJ0VHlwZSksIHRvSGlkbFN0cmluZyhjZXJ0QXV0aG9yaXR5KSwKKyAgICAgICAgICAgICAgICBbJl0oU3RhdHVzX1YxXzIgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QgPSB0b1ZlY3RvcihoUmVxdWVzdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0VXJsID0gdG9TdHJpbmc4KGhEZWZhdWx0VXJsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1RfMV8yKHN0YXR1cyk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICApOworICAgICAgICAgICAgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW4tPmdldFByb3Zpc2lvblJlcXVlc3QoCisgICAgICAgICAgICAgICAgdG9IaWRsU3RyaW5nKGNlcnRUeXBlKSwgdG9IaWRsU3RyaW5nKGNlcnRBdXRob3JpdHkpLAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaERlZmF1bHRVcmwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ID0gdG9WZWN0b3IoaFJlcXVlc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdFVybCA9IHRvU3RyaW5nOChoRGVmYXVsdFVybCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgKTsKKyAgICB9CiAKICAgICBlcnIgPSBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOwogICAgIG1NZXRyaWNzLm1HZXRQcm92aXNpb25SZXF1ZXN0Q291bnRlci5JbmNyZW1lbnQoZXJyKTsKQEAgLTk4OCwyMiArMTE0NCwzMSBAQAogICAgIH0KICAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOwogCi0gICAgaWYgKG1QbHVnaW5WMV8xID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwotICAgIH0KLQogICAgICpjb25uZWN0ZWQgPSBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOwogICAgICptYXggPSBEcm1QbHVnaW46OmtIZGNwTGV2ZWxVbmtub3duOwogCi0gICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMS0+Z2V0SGRjcExldmVscygKLSAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBIZGNwTGV2ZWwmIGhDb25uZWN0ZWQsIGNvbnN0IEhkY3BMZXZlbCYgaE1heCkgewotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICAqY29ubmVjdGVkID0gdG9IZGNwTGV2ZWwoaENvbm5lY3RlZCk7Ci0gICAgICAgICAgICAgICAgICAgICptYXggPSB0b0hkY3BMZXZlbChoTWF4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgKTsKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdDsKKyAgICBpZiAobVBsdWdpblYxXzIgIT0gTlVMTCkgeworICAgICAgICBoUmVzdWx0ID0gbVBsdWdpblYxXzItPmdldEhkY3BMZXZlbHNfMV8yKAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXNfVjFfMiBzdGF0dXMsIGNvbnN0IEhkY3BMZXZlbF9WMV8yJiBoQ29ubmVjdGVkLCBjb25zdCBIZGNwTGV2ZWxfVjFfMiYgaE1heCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmNvbm5lY3RlZCA9IHRvSGRjcExldmVsKGhDb25uZWN0ZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgKm1heCA9IHRvSGRjcExldmVsKGhNYXgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVF8xXzIoc3RhdHVzKTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9IGVsc2UgaWYgKG1QbHVnaW5WMV8xICE9IE5VTEwpIHsKKyAgICAgICAgaFJlc3VsdCA9IG1QbHVnaW5WMV8xLT5nZXRIZGNwTGV2ZWxzKAorICAgICAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBIZGNwTGV2ZWwmIGhDb25uZWN0ZWQsIGNvbnN0IEhkY3BMZXZlbCYgaE1heCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpjb25uZWN0ZWQgPSB0b0hkY3BMZXZlbChzdGF0aWNfY2FzdDxIZGNwTGV2ZWxfVjFfMj4oaENvbm5lY3RlZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKm1heCA9IHRvSGRjcExldmVsKHN0YXRpY19jYXN0PEhkY3BMZXZlbF9WMV8yPihoTWF4KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZXJyID0gdG9TdGF0dXNUKHN0YXR1cyk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICAgIH0KIAogICAgIHJldHVybiBoUmVzdWx0LmlzT2soKSA/IGVyciA6IERFQURfT0JKRUNUOwogfQpAQCAtMTA2NSw2ICsxMjMwLDczIEBACiAgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7CiB9CiAKK3N0YXR1c190IERybUhhbDo6Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZrZXlTZXRJZHMpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1QbHVnaW5WMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IFVOS05PV05fRVJST1I7CisKKyAgICBSZXR1cm48dm9pZD4gaFJlc3VsdCA9IG1QbHVnaW5WMV8yLT5nZXRPZmZsaW5lTGljZW5zZUtleVNldElkcygKKyAgICAgICAgICAgIFsmXShTdGF0dXMgc3RhdHVzLCBjb25zdCBoaWRsX3ZlYzxLZXlTZXRJZD4mIGhLZXlTZXRJZHMpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAga2V5U2V0SWRzID0gdG9LZXlTZXRJZHMoaEtleVNldElkcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVyciA9IHRvU3RhdHVzVChzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICk7CisKKyAgICByZXR1cm4gaFJlc3VsdC5pc09rKCkgPyBlcnIgOiBERUFEX09CSkVDVDsKK30KKworc3RhdHVzX3QgRHJtSGFsOjpyZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgIHJldHVybiBtSW5pdENoZWNrOworICAgIH0KKworICAgIGlmIChtUGx1Z2luVjFfMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICBSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBtUGx1Z2luVjFfMi0+cmVtb3ZlT2ZmbGluZUxpY2Vuc2UodG9IaWRsVmVjKGtleVNldElkKSk7CisgICAgcmV0dXJuIHN0YXR1cy5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdHVzKSA6IERFQURfT0JKRUNUOworfQorCitzdGF0dXNfdCBEcm1IYWw6OmdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlICpsaWNlbnNlU3RhdGUpIGNvbnN0IHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1QbHVnaW5WMV8yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICAqbGljZW5zZVN0YXRlID0gRHJtUGx1Z2luOjprT2ZmbGluZUxpY2Vuc2VTdGF0ZVVua25vd247CisKKyAgICBzdGF0dXNfdCBlcnIgPSBVTktOT1dOX0VSUk9SOworCisgICAgUmV0dXJuPHZvaWQ+IGhSZXN1bHQgPSBtUGx1Z2luVjFfMi0+Z2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZSh0b0hpZGxWZWMoa2V5U2V0SWQpLAorICAgICAgICAgICAgWyZdKFN0YXR1cyBzdGF0dXMsIE9mZmxpbmVMaWNlbnNlU3RhdGUgaExpY2Vuc2VTdGF0ZSkgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAqbGljZW5zZVN0YXRlID0gdG9PZmZsaW5lTGljZW5zZVN0YXRlKGhMaWNlbnNlU3RhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlcnIgPSB0b1N0YXR1c1Qoc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICApOworCisgICAgcmV0dXJuIGhSZXN1bHQuaXNPaygpID8gZXJyIDogREVBRF9PQkpFQ1Q7Cit9CisKIHN0YXR1c190IERybUhhbDo6Z2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCAmdmFsdWUgKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKICAgICByZXR1cm4gZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChuYW1lLCB2YWx1ZSk7CkBAIC0xMzQzLDIyICsxNTc1LDIyIEBACiAKIHZvaWQgRHJtSGFsOjpyZXBvcnRGcmFtZXdvcmtNZXRyaWNzKCkgY29uc3QKIHsKLSAgICBNZWRpYUFuYWx5dGljc0l0ZW0gaXRlbSgibWVkaWFkcm0iKTsKLSAgICBpdGVtLmdlbmVyYXRlU2Vzc2lvbklEKCk7Ci0gICAgaXRlbS5zZXRQa2dOYW1lKG1NZXRyaWNzLkdldEFwcFBhY2thZ2VOYW1lKCkuY19zdHIoKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQW5hbHl0aWNzSXRlbT4gaXRlbShNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZSgibWVkaWFkcm0iKSk7CisgICAgaXRlbS0+Z2VuZXJhdGVTZXNzaW9uSUQoKTsKKyAgICBpdGVtLT5zZXRQa2dOYW1lKG1NZXRyaWNzLkdldEFwcFBhY2thZ2VOYW1lKCkuY19zdHIoKSk7CiAgICAgU3RyaW5nOCB2ZW5kb3I7CiAgICAgU3RyaW5nOCBkZXNjcmlwdGlvbjsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzgoInZlbmRvciIpLCB2ZW5kb3IpOwogICAgIGlmIChyZXN1bHQgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdmVuZG9yIGZyb20gZHJtIHBsdWdpbjogJWQiLCByZXN1bHQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGl0ZW0uc2V0Q1N0cmluZygidmVuZG9yIiwgdmVuZG9yLmNfc3RyKCkpOworICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKCJ2ZW5kb3IiLCB2ZW5kb3IuY19zdHIoKSk7CiAgICAgfQogICAgIHJlc3VsdCA9IGdldFByb3BlcnR5U3RyaW5nSW50ZXJuYWwoU3RyaW5nOCgiZGVzY3JpcHRpb24iKSwgZGVzY3JpcHRpb24pOwogICAgIGlmIChyZXN1bHQgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgZGVzY3JpcHRpb24gZnJvbSBkcm0gcGx1Z2luOiAlZCIsIHJlc3VsdCk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaXRlbS5zZXRDU3RyaW5nKCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uLmNfc3RyKCkpOworICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uLmNfc3RyKCkpOwogICAgIH0KIAogICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRNZXRyaWNzOwpAQCAtMTM2OSw5ICsxNjAxLDkgQEAKICAgICBzdGQ6OnN0cmluZyBiNjRFbmNvZGVkTWV0cmljcyA9IHRvQmFzZTY0U3RyaW5nTm9QYWQoc2VyaWFsaXplZE1ldHJpY3MuZGF0YSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJpYWxpemVkTWV0cmljcy5zaXplKCkpOwogICAgIGlmICghYjY0RW5jb2RlZE1ldHJpY3MuZW1wdHkoKSkgewotICAgICAgICBpdGVtLnNldENTdHJpbmcoInNlcmlhbGl6ZWRfbWV0cmljcyIsIGI2NEVuY29kZWRNZXRyaWNzLmNfc3RyKCkpOworICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKCJzZXJpYWxpemVkX21ldHJpY3MiLCBiNjRFbmNvZGVkTWV0cmljcy5jX3N0cigpKTsKICAgICB9Ci0gICAgaWYgKCFpdGVtLnNlbGZyZWNvcmQoKSkgeworICAgIGlmICghaXRlbS0+c2VsZnJlY29yZCgpKSB7CiAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2VsZiByZWNvcmQgZnJhbWV3b3JrIG1ldHJpY3MiKTsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljcy5jcHAgYi9kcm0vbGlibWVkaWFkcm0vRHJtTWV0cmljcy5jcHAKaW5kZXggNGZlZDcwNy4uMzA4MDgwMiAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL0RybU1ldHJpY3MuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9Ecm1NZXRyaWNzLmNwcApAQCAtMzIsNyArMzIsNyBAQAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6RXZlbnRUeXBlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlTdGF0dXNUeXBlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpLZXlTdGF0dXNUeXBlOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpEcm1NZXRyaWNHcm91cDsKIHVzaW5nIDo6YW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlOwogCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmNwcAppbmRleCAzNzU2NDRjLi4wYjkyN2VmIDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5jcHAKQEAgLTIxLDEyICsyMSwxNyBAQAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JUHJvY2Vzc0luZm9TZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1Byb2Nlc3NJbmZvLmg+Ci0jaW5jbHVkZSA8bWVkaWFkcm0vRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvSVJlc291cmNlTWFuYWdlckNsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhUmVzb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIlJlc291cmNlTWFuYWdlclNlcnZpY2UuaCIKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdGF0aWMgU3RyaW5nOCBHZXRTZXNzaW9uSWRTdHJpbmcoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpIHsKQEAgLTM3LDYgKzQyLDM1IEBACiAgICAgcmV0dXJuIHNlc3Npb25JZFN0cjsKIH0KIAorc3RhdGljIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHRvU3RkVmVjKGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmdmVjdG9yKSB7CisgICAgY29uc3QgdWludDhfdCAqdiA9IHZlY3Rvci5hcnJheSgpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlYyh2LCB2ICsgdmVjdG9yLnNpemUoKSk7CisgICAgcmV0dXJuIHZlYzsKK30KKworc3RhdGljIHVpbnQ2NF90IHRvQ2xpZW50SWQoY29uc3Qgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGRybSkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGludDY0X3Q+KGRybS5nZXQoKSk7Cit9CisKK3N0YXRpYyBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gdG9SZXNvdXJjZVZlYyhjb25zdCBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCkgeworICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXM7CisgICAgLy8gdXNlIFVJTlQ2NF9NQVggdG8gZGVjcmVtZW50IHRocm91Z2ggYWRkaXRpb24gb3ZlcmZsb3cKKyAgICByZXNvdXJjZXMucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6a0RybVNlc3Npb24sIHRvU3RkVmVjKHNlc3Npb25JZCksIFVJTlQ2NF9NQVgpKTsKKyAgICByZXR1cm4gcmVzb3VyY2VzOworfQorCitzdGF0aWMgc3A8SVJlc291cmNlTWFuYWdlclNlcnZpY2U+IGdldFJlc291cmNlTWFuYWdlclNlcnZpY2UoKSB7CisgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LmRldmljZV9jb25maWcubWVkaWFfbmF0aXZlLm1lZGlhZHJtc2VydmVyIiwgMSkpIHsKKyAgICAgICAgcmV0dXJuIG5ldyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKCk7CisgICAgfQorICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICBpZiAoc20gPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmdldFNlcnZpY2UoU3RyaW5nMTYoIm1lZGlhLnJlc291cmNlX21hbmFnZXIiKSk7CisgICAgcmV0dXJuIGludGVyZmFjZV9jYXN0PElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPihiaW5kZXIpOworfQorCiBib29sIGlzRXF1YWxTZXNzaW9uSWQoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQxLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZDIpIHsKICAgICBpZiAoc2Vzc2lvbklkMS5zaXplKCkgIT0gc2Vzc2lvbklkMi5zaXplKCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNTEsMTg5ICs4NSwxMTQgQEAKIAogc3A8RHJtU2Vzc2lvbk1hbmFnZXI+IERybVNlc3Npb25NYW5hZ2VyOjpJbnN0YW5jZSgpIHsKICAgICBzdGF0aWMgc3A8RHJtU2Vzc2lvbk1hbmFnZXI+IGRybVNlc3Npb25NYW5hZ2VyID0gbmV3IERybVNlc3Npb25NYW5hZ2VyKCk7CisgICAgZHJtU2Vzc2lvbk1hbmFnZXItPmluaXQoKTsKICAgICByZXR1cm4gZHJtU2Vzc2lvbk1hbmFnZXI7CiB9CiAKIERybVNlc3Npb25NYW5hZ2VyOjpEcm1TZXNzaW9uTWFuYWdlcigpCi0gICAgOiBtUHJvY2Vzc0luZm8obmV3IFByb2Nlc3NJbmZvKCkpLAotICAgICAgbVRpbWUoMCkge30KKyAgICA6IERybVNlc3Npb25NYW5hZ2VyKGdldFJlc291cmNlTWFuYWdlclNlcnZpY2UoKSkgeworfQogCi1Ecm1TZXNzaW9uTWFuYWdlcjo6RHJtU2Vzc2lvbk1hbmFnZXIoc3A8UHJvY2Vzc0luZm9JbnRlcmZhY2U+IHByb2Nlc3NJbmZvKQotICAgIDogbVByb2Nlc3NJbmZvKHByb2Nlc3NJbmZvKSwKLSAgICAgIG1UaW1lKDApIHt9CitEcm1TZXNzaW9uTWFuYWdlcjo6RHJtU2Vzc2lvbk1hbmFnZXIoY29uc3Qgc3A8SVJlc291cmNlTWFuYWdlclNlcnZpY2U+ICZzZXJ2aWNlKQorICAgIDogbVNlcnZpY2Uoc2VydmljZSksCisgICAgICBtSW5pdGlhbGl6ZWQoZmFsc2UpIHsKKyAgICBpZiAobVNlcnZpY2UgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZSIpOworICAgIH0KK30KIAotRHJtU2Vzc2lvbk1hbmFnZXI6On5Ecm1TZXNzaW9uTWFuYWdlcigpIHt9CitEcm1TZXNzaW9uTWFuYWdlcjo6fkRybVNlc3Npb25NYW5hZ2VyKCkgeworICAgIGlmIChtU2VydmljZSAhPSBOVUxMKSB7CisgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1TZXJ2aWNlKS0+dW5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICB9Cit9CiAKLXZvaWQgRHJtU2Vzc2lvbk1hbmFnZXI6OmFkZFNlc3Npb24oCi0gICAgICAgIGludCBwaWQsIGNvbnN0IHNwPERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U+JiBkcm0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKSB7Ci0gICAgQUxPR1YoImFkZFNlc3Npb24ocGlkICVkLCBkcm0gJXAsIHNlc3Npb25JZCAlcykiLCBwaWQsIGRybS5nZXQoKSwKK3ZvaWQgRHJtU2Vzc2lvbk1hbmFnZXI6OmluaXQoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIGlmIChtU2VydmljZSAhPSBOVUxMKSB7CisgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKG1TZXJ2aWNlKS0+bGlua1RvRGVhdGgodGhpcyk7CisgICAgfQorfQorCit2b2lkIERybVNlc3Npb25NYW5hZ2VyOjphZGRTZXNzaW9uKGludCBwaWQsCisgICAgICAgIGNvbnN0IHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+JiBkcm0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKSB7CisgICAgdWlkX3QgdWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIEFMT0dWKCJhZGRTZXNzaW9uKHBpZCAlZCwgdWlkICVkLCBkcm0gJXAsIHNlc3Npb25JZCAlcykiLCBwaWQsIHVpZCwgZHJtLmdldCgpLAogICAgICAgICAgICAgR2V0U2Vzc2lvbklkU3RyaW5nKHNlc3Npb25JZCkuc3RyaW5nKCkpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIFNlc3Npb25JbmZvIGluZm87Ci0gICAgaW5mby5kcm0gPSBkcm07Ci0gICAgaW5mby5zZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0gICAgaW5mby50aW1lU3RhbXAgPSBnZXRUaW1lX2woKTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbVNlc3Npb25NYXAuaW5kZXhPZktleShwaWQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgLy8gbmV3IHBpZAotICAgICAgICBTZXNzaW9uSW5mb3MgaW5mb3NGb3JQaWQ7Ci0gICAgICAgIGluZm9zRm9yUGlkLnB1c2hfYmFjayhpbmZvKTsKLSAgICAgICAgbVNlc3Npb25NYXAuYWRkKHBpZCwgaW5mb3NGb3JQaWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1TZXNzaW9uTWFwLmVkaXRWYWx1ZUF0KGluZGV4KS5wdXNoX2JhY2soaW5mbyk7CisgICAgaWYgKG1TZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIGludDY0X3QgY2xpZW50SWQgPSB0b0NsaWVudElkKGRybSk7CisgICAgbVNlc3Npb25NYXBbdG9TdGRWZWMoc2Vzc2lvbklkKV0gPSAoU2Vzc2lvbkluZm8pe3BpZCwgdWlkLCBjbGllbnRJZH07CisgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKHBpZCwgdWlkLCBjbGllbnRJZCwgZHJtLCB0b1Jlc291cmNlVmVjKHNlc3Npb25JZCkpOwogfQogCiB2b2lkIERybVNlc3Npb25NYW5hZ2VyOjp1c2VTZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKSB7CiAgICAgQUxPR1YoInVzZVNlc3Npb24oJXMpIiwgR2V0U2Vzc2lvbklkU3RyaW5nKHNlc3Npb25JZCkuc3RyaW5nKCkpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNlc3Npb25NYXAuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgU2Vzc2lvbkluZm9zJiBpbmZvcyA9IG1TZXNzaW9uTWFwLmVkaXRWYWx1ZUF0KGkpOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGluZm9zLnNpemUoKTsgKytqKSB7Ci0gICAgICAgICAgICBTZXNzaW9uSW5mbyYgaW5mbyA9IGluZm9zLmVkaXRJdGVtQXQoaik7Ci0gICAgICAgICAgICBpZiAoaXNFcXVhbFNlc3Npb25JZChzZXNzaW9uSWQsIGluZm8uc2Vzc2lvbklkKSkgewotICAgICAgICAgICAgICAgIGluZm8udGltZVN0YW1wID0gZ2V0VGltZV9sKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgYXV0byBpdCA9IG1TZXNzaW9uTWFwLmZpbmQodG9TdGRWZWMoc2Vzc2lvbklkKSk7CisgICAgaWYgKG1TZXJ2aWNlID09IE5VTEwgfHwgaXQgPT0gbVNlc3Npb25NYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIGF1dG8gaW5mbyA9IGl0LT5zZWNvbmQ7CisgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGluZm8ucGlkLCBpbmZvLnVpZCwgaW5mby5jbGllbnRJZCwgTlVMTCwgdG9SZXNvdXJjZVZlYyhzZXNzaW9uSWQpKTsKIH0KIAogdm9pZCBEcm1TZXNzaW9uTWFuYWdlcjo6cmVtb3ZlU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCkgewogICAgIEFMT0dWKCJyZW1vdmVTZXNzaW9uKCVzKSIsIEdldFNlc3Npb25JZFN0cmluZyhzZXNzaW9uSWQpLnN0cmluZygpKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TZXNzaW9uTWFwLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFNlc3Npb25JbmZvcyYgaW5mb3MgPSBtU2Vzc2lvbk1hcC5lZGl0VmFsdWVBdChpKTsKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpbmZvcy5zaXplKCk7ICsraikgewotICAgICAgICAgICAgaWYgKGlzRXF1YWxTZXNzaW9uSWQoc2Vzc2lvbklkLCBpbmZvc1tqXS5zZXNzaW9uSWQpKSB7Ci0gICAgICAgICAgICAgICAgaW5mb3MucmVtb3ZlQXQoaik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgYXV0byBpdCA9IG1TZXNzaW9uTWFwLmZpbmQodG9TdGRWZWMoc2Vzc2lvbklkKSk7CisgICAgaWYgKG1TZXJ2aWNlID09IE5VTEwgfHwgaXQgPT0gbVNlc3Npb25NYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLX0KIAotdm9pZCBEcm1TZXNzaW9uTWFuYWdlcjo6cmVtb3ZlRHJtKGNvbnN0IHNwPERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U+JiBkcm0pIHsKLSAgICBBTE9HVigicmVtb3ZlRHJtKCVwKSIsIGRybS5nZXQoKSk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgYm9vbCBmb3VuZCA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNlc3Npb25NYXAuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgU2Vzc2lvbkluZm9zJiBpbmZvcyA9IG1TZXNzaW9uTWFwLmVkaXRWYWx1ZUF0KGkpOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGluZm9zLnNpemUoKTspIHsKLSAgICAgICAgICAgIGlmIChpbmZvc1tqXS5kcm0gPT0gZHJtKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInJlbW92ZWQgc2Vzc2lvbiAoJXMpIiwgR2V0U2Vzc2lvbklkU3RyaW5nKGluZm9zW2pdLnNlc3Npb25JZCkuc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgIGogPSBpbmZvcy5yZW1vdmVBdChqKTsKLSAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICsrajsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoZm91bmQpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQorICAgIGF1dG8gaW5mbyA9IGl0LT5zZWNvbmQ7CisgICAgbVNlcnZpY2UtPnJlbW92ZVJlc291cmNlKGluZm8ucGlkLCBpbmZvLmNsaWVudElkLCB0b1Jlc291cmNlVmVjKHNlc3Npb25JZCkpOworICAgIG1TZXNzaW9uTWFwLmVyYXNlKGl0KTsKIH0KIAogYm9vbCBEcm1TZXNzaW9uTWFuYWdlcjo6cmVjbGFpbVNlc3Npb24oaW50IGNhbGxpbmdQaWQpIHsKICAgICBBTE9HVigicmVjbGFpbVNlc3Npb24oJWQpIiwgY2FsbGluZ1BpZCk7CiAKLSAgICBzcDxEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlPiBkcm07Ci0gICAgVmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKLSAgICBpbnQgbG93ZXN0UHJpb3JpdHlQaWQ7Ci0gICAgaW50IGxvd2VzdFByaW9yaXR5OwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgICAgICBpbnQgY2FsbGluZ1ByaW9yaXR5OwotICAgICAgICBpZiAoIW1Qcm9jZXNzSW5mby0+Z2V0UHJpb3JpdHkoY2FsbGluZ1BpZCwgJmNhbGxpbmdQcmlvcml0eSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIWdldExvd2VzdFByaW9yaXR5X2woJmxvd2VzdFByaW9yaXR5UGlkLCAmbG93ZXN0UHJpb3JpdHkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxvd2VzdFByaW9yaXR5IDw9IGNhbGxpbmdQcmlvcml0eSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAgLy8gdW5sb2NrIGVhcmx5IGJlY2F1c2UgcmVjbGFpbVJlc291cmNlIG1pZ2h0IGNhbGxiYWNrIGludG8gcmVtb3ZlU2Vzc2lvbgorICAgIG1Mb2NrLmxvY2soKTsKKyAgICBzcDxJUmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gc2VydmljZShtU2VydmljZSk7CisgICAgbUxvY2sudW5sb2NrKCk7CiAKLSAgICAgICAgaWYgKCFnZXRMZWFzdFVzZWRTZXNzaW9uX2wobG93ZXN0UHJpb3JpdHlQaWQsICZkcm0sICZzZXNzaW9uSWQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZHJtID09IE5VTEwpIHsKKyAgICBpZiAoc2VydmljZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBBTE9HVigicmVjbGFpbSBzZXNzaW9uKCVzKSBvcGVuZWQgYnkgcGlkICVkIiwKLSAgICAgICAgICAgIEdldFNlc3Npb25JZFN0cmluZyhzZXNzaW9uSWQpLnN0cmluZygpLCBsb3dlc3RQcmlvcml0eVBpZCk7Ci0KLSAgICByZXR1cm4gZHJtLT5yZWNsYWltU2Vzc2lvbihzZXNzaW9uSWQpOworICAgIC8vIGNhbm5vdCB1cGRhdGUgbVNlc3Npb25NYXAgYmVjYXVzZSB3ZSBkbyBub3Qga25vdyB3aGljaCBzZXNzaW9uSWQgaXMgcmVjbGFpbWVkOworICAgIC8vIHdlIHJlbHkgb24gSVJlc291cmNlTWFuYWdlckNsaWVudCB0byByZW1vdmVTZXNzaW9uIGluIHJlY2xhaW1SZXNvdXJjZQorICAgIFZlY3Rvcjx1aW50OF90PiBkdW1teTsKKyAgICByZXR1cm4gc2VydmljZS0+cmVjbGFpbVJlc291cmNlKGNhbGxpbmdQaWQsIHRvUmVzb3VyY2VWZWMoZHVtbXkpKTsKIH0KIAotaW50NjRfdCBEcm1TZXNzaW9uTWFuYWdlcjo6Z2V0VGltZV9sKCkgewotICAgIHJldHVybiBtVGltZSsrOworc2l6ZV90IERybVNlc3Npb25NYW5hZ2VyOjpnZXRTZXNzaW9uQ291bnQoKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIHJldHVybiBtU2Vzc2lvbk1hcC5zaXplKCk7CiB9CiAKLWJvb2wgRHJtU2Vzc2lvbk1hbmFnZXI6OmdldExvd2VzdFByaW9yaXR5X2woaW50KiBsb3dlc3RQcmlvcml0eVBpZCwgaW50KiBsb3dlc3RQcmlvcml0eSkgewotICAgIGludCBwaWQgPSAtMTsKLSAgICBpbnQgcHJpb3JpdHkgPSAtMTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TZXNzaW9uTWFwLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGlmIChtU2Vzc2lvbk1hcC52YWx1ZUF0KGkpLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAvLyBubyBvcGVuZWQgc2Vzc2lvbiBieSB0aGlzIHByb2Nlc3MuCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBpbnQgdGVtcFBpZCA9IG1TZXNzaW9uTWFwLmtleUF0KGkpOwotICAgICAgICBpbnQgdGVtcFByaW9yaXR5OwotICAgICAgICBpZiAoIW1Qcm9jZXNzSW5mby0+Z2V0UHJpb3JpdHkodGVtcFBpZCwgJnRlbXBQcmlvcml0eSkpIHsKLSAgICAgICAgICAgIC8vIHNob3VsZG4ndCBoYXBwZW4uCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBpZCA9PSAtMSkgewotICAgICAgICAgICAgcGlkID0gdGVtcFBpZDsKLSAgICAgICAgICAgIHByaW9yaXR5ID0gdGVtcFByaW9yaXR5OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKHRlbXBQcmlvcml0eSA+IHByaW9yaXR5KSB7Ci0gICAgICAgICAgICAgICAgcGlkID0gdGVtcFBpZDsKLSAgICAgICAgICAgICAgICBwcmlvcml0eSA9IHRlbXBQcmlvcml0eTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocGlkICE9IC0xKSB7Ci0gICAgICAgICpsb3dlc3RQcmlvcml0eVBpZCA9IHBpZDsKLSAgICAgICAgKmxvd2VzdFByaW9yaXR5ID0gcHJpb3JpdHk7Ci0gICAgfQotICAgIHJldHVybiAocGlkICE9IC0xKTsKK2Jvb2wgRHJtU2Vzc2lvbk1hbmFnZXI6OmNvbnRhaW5zU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgY29uc3QgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbVNlc3Npb25NYXAuY291bnQodG9TdGRWZWMoc2Vzc2lvbklkKSk7CiB9CiAKLWJvb2wgRHJtU2Vzc2lvbk1hbmFnZXI6OmdldExlYXN0VXNlZFNlc3Npb25fbCgKLSAgICAgICAgaW50IHBpZCwgc3A8RHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZT4qIGRybSwgVmVjdG9yPHVpbnQ4X3Q+KiBzZXNzaW9uSWQpIHsKLSAgICBzc2l6ZV90IGluZGV4ID0gbVNlc3Npb25NYXAuaW5kZXhPZktleShwaWQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGludCBsZWFzdFVzZWRJbmRleCA9IC0xOwotICAgIGludDY0X3QgbWluVHMgPSBMTE9OR19NQVg7Ci0gICAgY29uc3QgU2Vzc2lvbkluZm9zJiBpbmZvcyA9IG1TZXNzaW9uTWFwLnZhbHVlQXQoaW5kZXgpOwotICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5mb3Muc2l6ZSgpOyArK2opIHsKLSAgICAgICAgaWYgKGxlYXN0VXNlZEluZGV4ID09IC0xKSB7Ci0gICAgICAgICAgICBsZWFzdFVzZWRJbmRleCA9IGo7Ci0gICAgICAgICAgICBtaW5UcyA9IGluZm9zW2pdLnRpbWVTdGFtcDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChpbmZvc1tqXS50aW1lU3RhbXAgPCBtaW5UcykgewotICAgICAgICAgICAgICAgIGxlYXN0VXNlZEluZGV4ID0gajsKLSAgICAgICAgICAgICAgICBtaW5UcyA9IGluZm9zW2pdLnRpbWVTdGFtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobGVhc3RVc2VkSW5kZXggIT0gLTEpIHsKLSAgICAgICAgKmRybSA9IGluZm9zW2xlYXN0VXNlZEluZGV4XS5kcm07Ci0gICAgICAgICpzZXNzaW9uSWQgPSBpbmZvc1tsZWFzdFVzZWRJbmRleF0uc2Vzc2lvbklkOwotICAgIH0KLSAgICByZXR1cm4gKGxlYXN0VXNlZEluZGV4ICE9IC0xKTsKK3ZvaWQgRHJtU2Vzc2lvbk1hbmFnZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIC8qd2hvKi8pIHsKKyAgICBBTE9HVygiUmVzb3VyY2VNYW5hZ2VyU2VydmljZSBkaWVkLiIpOworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKKyAgICBtU2VydmljZS5jbGVhcigpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL0lEcm0uY3BwIGIvZHJtL2xpYm1lZGlhZHJtL0lEcm0uY3BwCmluZGV4IDUwOTk2MWYuLjUxMjc0ZDEgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS9JRHJtLmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vSURybS5jcHAKQEAgLTYxLDcgKzYxLDEwIEBACiAgICAgR0VUX05VTUJFUl9PRl9TRVNTSU9OUywKICAgICBHRVRfU0VDVVJJVFlfTEVWRUwsCiAgICAgUkVNT1ZFX1NFQ1VSRV9TVE9QLAotICAgIEdFVF9TRUNVUkVfU1RPUF9JRFMKKyAgICBHRVRfU0VDVVJFX1NUT1BfSURTLAorICAgIEdFVF9PRkZMSU5FX0xJQ0VOU0VfS0VZU0VUX0lEUywKKyAgICBSRU1PVkVfT0ZGTElORV9MSUNFTlNFLAorICAgIEdFVF9PRkZMSU5FX0xJQ0VOU0VfU1RBVEUKIH07CiAKIHN0cnVjdCBCcERybSA6IHB1YmxpYyBCcEludGVyZmFjZTxJRHJtPiB7CkBAIC04MCwxOCArODMsMjIgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAotICAgIHZpcnR1YWwgYm9vbCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSkgeworICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCisgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsIGJvb2wgKmlzU3VwcG9ydGVkKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGUodXVpZCwgMTYpOwogICAgICAgICBkYXRhLndyaXRlU3RyaW5nOChtaW1lVHlwZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihsZXZlbCk7CisKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KElTX0NSWVBUT19TVVBQT1JURUQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCJpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZDogYmluZGVyIGNhbGwgZmFpbGVkOiAlZCIsIHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICB9CisgICAgICAgICppc1N1cHBvcnRlZCA9IHN0YXRpY19jYXN0PGJvb2w+KHJlcGx5LnJlYWRJbnQzMigpKTsKIAotICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCkgIT0gMDsKKyAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlUGx1Z2luKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sCkBAIC0xMjAsMTEgKzEyNywxMSBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuU2Vzc2lvbihEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCBsZXZlbCwKICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihzZWN1cml0eUxldmVsKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGxldmVsKTsKIAogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoT1BFTl9TRVNTSU9OLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CkBAIC0zNzYsNiArMzgzLDUyIEBACiAgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJmtleVNldElkcykgY29uc3QgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfT0ZGTElORV9MSUNFTlNFX0tFWVNFVF9JRFMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBrZXlTZXRJZHMuY2xlYXIoKTsKKyAgICAgICAgdWludDMyX3QgY291bnQgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4ga2V5U2V0SWQ7CisgICAgICAgICAgICByZWFkVmVjdG9yKHJlcGx5LCBrZXlTZXRJZCk7CisgICAgICAgICAgICBrZXlTZXRJZHMucHVzaF9iYWNrKGtleVNldElkKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVPZmZsaW5lTGljZW5zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElEcm06OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgd3JpdGVWZWN0b3IoZGF0YSwga2V5U2V0SWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX09GRkxJTkVfTElDRU5TRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPZmZsaW5lTGljZW5zZVN0YXRlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQsCisgICAgICAgICAgICBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUgKmxpY2Vuc2VTdGF0ZSkgY29uc3QgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworCisgICAgICAgIHdyaXRlVmVjdG9yKGRhdGEsIGtleVNldElkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9PRkZMSU5FX0xJQ0VOU0VfU1RBVEUsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgICpsaWNlbnNlU3RhdGUgPSBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGU6OmtPZmZsaW5lTGljZW5zZVN0YXRlVW5rbm93bjsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgKmxpY2Vuc2VTdGF0ZSA9IHN0YXRpY19jYXN0PERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZT4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSkgY29uc3QgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRHJtOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtNzE5LDcgKzc3MiwxMiBAQAogICAgICAgICAgICAgdWludDhfdCB1dWlkWzE2XTsKICAgICAgICAgICAgIGRhdGEucmVhZCh1dWlkLCBzaXplb2YodXVpZCkpOwogICAgICAgICAgICAgU3RyaW5nOCBtaW1lVHlwZSA9IGRhdGEucmVhZFN0cmluZzgoKTsKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQsIG1pbWVUeXBlKSk7CisgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwgPQorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWw+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgYm9vbCBpc1N1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVR5cGUsIGxldmVsLCAmaXNTdXBwb3J0ZWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNTdXBwb3J0ZWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogCkBAIC05ODAsNiArMTAzOCw0NSBAQAogICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBHRVRfT0ZGTElORV9MSUNFTlNFX0tFWVNFVF9JRFM6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRHJtLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBMaXN0PFZlY3Rvcjx1aW50OF90PiA+IGtleVNldElkczsKKyAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKGtleVNldElkcyk7CisgICAgICAgICAgICBzaXplX3QgY291bnQgPSBrZXlTZXRJZHMuc2l6ZSgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoY291bnQpOworICAgICAgICAgICAgTGlzdDxWZWN0b3I8dWludDhfdD4gPjo6aXRlcmF0b3IgaXRlciA9IGtleVNldElkcy5iZWdpbigpOworICAgICAgICAgICAgd2hpbGUoaXRlciAhPSBrZXlTZXRJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGl0ZXItPnNpemUoKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzaXplKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoaXRlci0+YXJyYXkoKSwgaXRlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBpdGVyKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBSRU1PVkVfT0ZGTElORV9MSUNFTlNFOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleVNldElkOworICAgICAgICAgICAgcmVhZFZlY3RvcihkYXRhLCBrZXlTZXRJZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihyZW1vdmVPZmZsaW5lTGljZW5zZShrZXlTZXRJZCkpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBHRVRfT0ZGTElORV9MSUNFTlNFX1NUQVRFOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSURybSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGtleVNldElkOworICAgICAgICAgICAgcmVhZFZlY3RvcihkYXRhLCBrZXlTZXRJZCk7CisgICAgICAgICAgICBEcm1QbHVnaW46Ok9mZmxpbmVMaWNlbnNlU3RhdGUgc3RhdGU7CisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXRPZmZsaW5lTGljZW5zZVN0YXRlKGtleVNldElkLCAmc3RhdGUpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8RHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlPihzdGF0ZSkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIocmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCiAgICAgICAgIGNhc2UgR0VUX1BST1BFUlRZX1NUUklORzoKICAgICAgICAgewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElEcm0sIGRhdGEsIHJlcGx5KTsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmNwcCBiL2RybS9saWJtZWRpYWRybS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmNwcAppbmRleCA1Y2I0OGJmLi44Y2Q2Zjk2IDEwMDY0NAotLS0gYS9kcm0vbGlibWVkaWFkcm0vUGx1Z2luTWV0cmljc1JlcG9ydGluZy5jcHAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuY3BwCkBAIC0zNCwxNyArMzQsMTcgQEAKIHN0YXR1c190IHJlcG9ydFZlbmRvck1ldHJpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldHJpY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKSB7Ci0gICAgTWVkaWFBbmFseXRpY3NJdGVtIGFuYWx5dGljc0l0ZW0obmFtZS5jX3N0cigpKTsKLSAgICBhbmFseXRpY3NJdGVtLmdlbmVyYXRlU2Vzc2lvbklEKCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQW5hbHl0aWNzSXRlbT4gYW5hbHl0aWNzSXRlbShNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShuYW1lLmNfc3RyKCkpKTsKKyAgICBhbmFseXRpY3NJdGVtLT5nZW5lcmF0ZVNlc3Npb25JRCgpOwogCiAgICAgc3RkOjpzdHJpbmcgYXBwX3BhY2thZ2VfbmFtZShhcHBQYWNrYWdlTmFtZS5jX3N0cigpLCBhcHBQYWNrYWdlTmFtZS5zaXplKCkpOwotICAgIGFuYWx5dGljc0l0ZW0uc2V0UGtnTmFtZShhcHBfcGFja2FnZV9uYW1lKTsKKyAgICBhbmFseXRpY3NJdGVtLT5zZXRQa2dOYW1lKGFwcF9wYWNrYWdlX25hbWUpOwogICAgIGlmIChtZXRyaWNzLnNpemUoKSA+IDApIHsKLSAgICAgICAgYW5hbHl0aWNzSXRlbS5zZXRDU3RyaW5nKGtTZXJpYWxpemVkTWV0cmljc0ZpZWxkLCBtZXRyaWNzLmNfc3RyKCkpOworICAgICAgICBhbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtTZXJpYWxpemVkTWV0cmljc0ZpZWxkLCBtZXRyaWNzLmNfc3RyKCkpOwogICAgIH0KIAotICAgIGlmICghYW5hbHl0aWNzSXRlbS5zZWxmcmVjb3JkKCkpIHsKLSAgICAgIEFMT0dFKCJzZWxmcmVjb3JkKCkgcmV0dXJuZWQgZmFsc2UuIHNlc3Npb0lkICUiIFBSSWQ2NCwgYW5hbHl0aWNzSXRlbS5nZXRTZXNzaW9uSUQoKSk7CisgICAgaWYgKCFhbmFseXRpY3NJdGVtLT5zZWxmcmVjb3JkKCkpIHsKKyAgICAgIEFMT0dFKCJzZWxmcmVjb3JkKCkgcmV0dXJuZWQgZmFsc2UuIHNlc3Npb0lkICUiIFBSSWQ2NCwgYW5hbHl0aWNzSXRlbS0+Z2V0U2Vzc2lvbklEKCkpOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0NyeXB0b0hhbC5oIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvSGFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNjMDI5ZgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0NyeXB0b0hhbC5oCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDUllQVE9fSEFMX0hfCisKKyNkZWZpbmUgQ1JZUFRPX0hBTF9IXworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lDcnlwdG9GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lDcnlwdG9QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSUNyeXB0b0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSUNyeXB0b1BsdWdpbi5oPgorCisjaW5jbHVkZSA8bWVkaWFkcm0vSUNyeXB0by5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwordXNpbmcgZHJtOjpWMV8wOjpJQ3J5cHRvRmFjdG9yeTsKK3VzaW5nIGRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKK3VzaW5nIGRybTo6VjFfMDo6U2hhcmVkQnVmZmVyOworCitjbGFzcyBJTWVtb3J5SGVhcDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQ3J5cHRvSGFsIDogcHVibGljIEJuQ3J5cHRvIHsKKyAgICBDcnlwdG9IYWwoKTsKKyAgICB2aXJ0dWFsIH5DcnlwdG9IYWwoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBsdWdpbigKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVzdHJveVBsdWdpbigpOworCisgICAgdmlydHVhbCBib29sIHJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWUpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIG5vdGlmeVJlc29sdXRpb24odWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhRHJtU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZCk7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgZGVjcnlwdChjb25zdCB1aW50OF90IGtleVsxNl0sIGNvbnN0IHVpbnQ4X3QgaXZbMTZdLAorICAgICAgICAgICAgQ3J5cHRvUGx1Z2luOjpNb2RlIG1vZGUsIGNvbnN0IENyeXB0b1BsdWdpbjo6UGF0dGVybiAmcGF0dGVybiwKKyAgICAgICAgICAgIGNvbnN0IElDcnlwdG86OlNvdXJjZUJ1ZmZlciAmc291cmNlLCBzaXplX3Qgb2Zmc2V0LAorICAgICAgICAgICAgY29uc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgKnN1YlNhbXBsZXMsIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICAgICAgY29uc3QgSUNyeXB0bzo6RGVzdGluYXRpb25CdWZmZXIgJmRlc3RpbmF0aW9uLAorICAgICAgICAgICAgQVN0cmluZyAqZXJyb3JEZXRhaWxNc2cpOworCisgICAgdmlydHVhbCBpbnQzMl90IHNldEhlYXAoY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwKSB7CisgICAgICAgIHJldHVybiBzZXRIZWFwQmFzZShoZWFwKTsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIHVuc2V0SGVhcChpbnQzMl90IHNlcU51bSkgeyBjbGVhckhlYXBCYXNlKHNlcU51bSk7IH0KKworcHJpdmF0ZToKKyAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOworCisgICAgY29uc3QgVmVjdG9yPHNwPElDcnlwdG9GYWN0b3J5Pj4gbUZhY3RvcmllczsKKyAgICBzcDxJQ3J5cHRvUGx1Z2luPiBtUGx1Z2luOworICAgIHNwPGRybTo6VjFfMjo6SUNyeXB0b1BsdWdpbj4gbVBsdWdpblYxXzI7CisKKyAgICAvKioKKyAgICAgKiBtSW5pdENoZWNrIGlzOgorICAgICAqICAgTk9fSU5JVCBpZiBhIHBsdWdpbiBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldAorICAgICAqICAgRVJST1JfVU5TVVBQT1JURUQgaWYgYSBwbHVnaW4gY2FuJ3QgYmUgY3JlYXRlZCBmb3IgdGhlIHV1aWQKKyAgICAgKiAgIE9LIGFmdGVyIGEgcGx1Z2luIGhhcyBiZWVuIGNyZWF0ZWQgYW5kIG1QbHVnaW4gaXMgdmFsaWQKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBtSW5pdENoZWNrOworCisgICAgc3RydWN0IEhlYXBCYXNlIHsKKyAgICAgICAgSGVhcEJhc2UoKSA6IG1CdWZmZXJJZCgwKSwgbVNpemUoMCkge30KKyAgICAgICAgSGVhcEJhc2UodWludDMyX3QgYnVmZmVySWQsIHNpemVfdCBzaXplKSA6CisgICAgICAgICAgICBtQnVmZmVySWQoYnVmZmVySWQpLCBtU2l6ZShzaXplKSB7fQorCisgICAgICAgIHVpbnQzMl90IGdldEJ1ZmZlcklkKCkgY29uc3Qge3JldHVybiBtQnVmZmVySWQ7fQorICAgICAgICBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0IHtyZXR1cm4gbVNpemU7fQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdWludDMyX3QgbUJ1ZmZlcklkOworICAgICAgICBzaXplX3QgbVNpemU7CisgICAgfTsKKworICAgIEtleWVkVmVjdG9yPGludDMyX3QsIEhlYXBCYXNlPiBtSGVhcEJhc2VzOworICAgIHVpbnQzMl90IG1OZXh0QnVmZmVySWQ7CisgICAgaW50MzJfdCBtSGVhcFNlcU51bTsKKworICAgIFZlY3RvcjxzcDxJQ3J5cHRvRmFjdG9yeT4+IG1ha2VDcnlwdG9GYWN0b3JpZXMoKTsKKyAgICBzcDxJQ3J5cHRvUGx1Z2luPiBtYWtlQ3J5cHRvUGx1Z2luKGNvbnN0IHNwPElDcnlwdG9GYWN0b3J5PiYgZmFjdG9yeSwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IHZvaWQgKmluaXREYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICBpbnQzMl90IHNldEhlYXBCYXNlKGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCk7CisgICAgdm9pZCBjbGVhckhlYXBCYXNlKGludDMyX3Qgc2VxTnVtKTsKKworICAgIHN0YXR1c190IHRvU2hhcmVkQnVmZmVyKGNvbnN0IHNwPElNZW1vcnk+JiBtZW1vcnksIGludDMyX3Qgc2VxTnVtLCA6OlNoYXJlZEJ1ZmZlciogYnVmZmVyKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENyeXB0b0hhbCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENSWVBUT19IQUxfSF8KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybUhhbC5oIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtSGFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQyZDMwMAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybUhhbC5oCkBAIC0wLDAgKzEsMjY1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBEUk1fSEFMX0hfCisKKyNkZWZpbmUgRFJNX0hBTF9IXworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lEcm1GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lEcm1QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybVBsdWdpbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW5MaXN0ZW5lci5oPgorCisjaW5jbHVkZSA8bWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9Ecm1NZXRyaWNzLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JRHJtLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vSURybUNsaWVudC5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworbmFtZXNwYWNlIGRybSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTsKK3VzaW5nIGRybTo6VjFfMDo6RXZlbnRUeXBlOwordXNpbmcgZHJtOjpWMV8wOjpJRHJtRmFjdG9yeTsKK3VzaW5nIGRybTo6VjFfMDo6SURybVBsdWdpbjsKK3VzaW5nIGRybTo6VjFfMDo6SURybVBsdWdpbkxpc3RlbmVyOwordXNpbmcgZHJtOjpWMV8xOjpTZWN1cml0eUxldmVsOwordXNpbmcgZHJtOjpWMV8yOjpLZXlTdGF0dXM7Cit1c2luZyBkcm06OlYxXzI6Ok9mZmxpbmVMaWNlbnNlU3RhdGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7CisKK3R5cGVkZWYgZHJtOjpWMV8yOjpJRHJtUGx1Z2luTGlzdGVuZXIgSURybVBsdWdpbkxpc3RlbmVyX1YxXzI7Cit0eXBlZGVmIGRybTo6VjFfMDo6S2V5U3RhdHVzIEtleVN0YXR1c19WMV8wOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlOworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmbCwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZyKSB7CisgICAgaWYgKGwuc2l6ZSgpICE9IHIuc2l6ZSgpKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIG1lbWNtcChsLmFycmF5KCksIHIuYXJyYXkoKSwgbC5zaXplKCkpID09IDA7Cit9CisKK3N0cnVjdCBEcm1IYWwgOiBwdWJsaWMgQm5Ecm0sCisgICAgICAgICAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LAorICAgICAgICAgICAgICAgIHB1YmxpYyBJRHJtUGx1Z2luTGlzdGVuZXJfVjFfMiB7CisKKyAgICBzdHJ1Y3QgRHJtU2Vzc2lvbkNsaWVudCA6IHB1YmxpYyBCblJlc291cmNlTWFuYWdlckNsaWVudCB7CisgICAgICAgIGV4cGxpY2l0IERybVNlc3Npb25DbGllbnQoRHJtSGFsKiBkcm0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKQorICAgICAgICAgIDogbVNlc3Npb25JZChzZXNzaW9uSWQpLAorICAgICAgICAgICAgbURybShkcm0pIHt9CisKKyAgICAgICAgdmlydHVhbCBib29sIHJlY2xhaW1SZXNvdXJjZSgpOworICAgICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TmFtZSgpOworCisgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiBtU2Vzc2lvbklkOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICB2aXJ0dWFsIH5Ecm1TZXNzaW9uQ2xpZW50KCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICB3cDxEcm1IYWw+IG1Ecm07CisKKyAgICAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtU2Vzc2lvbkNsaWVudCk7CisgICAgfTsKKworICAgIERybUhhbCgpOworICAgIHZpcnR1YWwgfkRybUhhbCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZhcHBQYWNrYWdlTmFtZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlc3Ryb3lQbHVnaW4oKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlblNlc3Npb24oRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAorICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZVNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdAorICAgICAgICBnZXRLZXlSZXF1ZXN0KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5pdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmbWltZVR5cGUsIERybVBsdWdpbjo6S2V5VHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGNvbnN0ICZvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZyZXF1ZXN0LCBTdHJpbmc4ICZkZWZhdWx0VXJsLAorICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgKmtleVJlcXVlc3RUeXBlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlkZUtleVJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmcmVzcG9uc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUtleXMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5S2V5U3RhdHVzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gJmluZm9NYXApIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm92aXNpb25SZXF1ZXN0KFN0cmluZzggY29uc3QgJmNlcnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZjZXJ0QXV0aG9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggJmRlZmF1bFVybCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVQcm92aXNpb25SZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJnJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmY2VydGlmaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ3cmFwcGVkS2V5KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZzZWN1cmVTdG9wcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wSWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcElkcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NpZCwgVmVjdG9yPHVpbnQ4X3Q+ICZzZWN1cmVTdG9wKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVNlY3VyZVN0b3AoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc2lkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUFsbFNlY3VyZVN0b3BzKCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEhkY3BMZXZlbHMoRHJtUGx1Z2luOjpIZGNwTGV2ZWwgKmNvbm5lY3RlZExldmVsLAorICAgICAgICAgICAgRHJtUGx1Z2luOjpIZGNwTGV2ZWwgKm1heExldmVsKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE51bWJlck9mU2Vzc2lvbnModWludDMyX3QgKmN1cnJlbnRTZXNzaW9ucywKKyAgICAgICAgICAgIHVpbnQzMl90ICptYXhTZXNzaW9ucykgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsICpsZXZlbCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlS2V5U2V0SWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAma2V5U2V0SWRzKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZShWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkLAorICAgICAgICAgICAgRHJtUGx1Z2luOjpPZmZsaW5lTGljZW5zZVN0YXRlICpsaWNlbnNlU3RhdGUpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSApIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUgKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggY29uc3QgJnZhbHVlICkgY29uc3Q7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZ2YWx1ZSApIGNvbnN0OworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0cmljcyhvczo6UGVyc2lzdGFibGVCdW5kbGUgKm1ldHJpY3MpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDaXBoZXJBbGdvcml0aG0oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmYWxnb3JpdGhtKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFjQWxnb3JpdGhtKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmFsZ29yaXRobSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGVuY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmb3V0cHV0KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZGVjcnlwdChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZvdXRwdXQpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzaWduKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2lnbmF0dXJlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJm1hdGNoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2lnblJTQShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmYWxnb3JpdGhtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmd3JhcHBlZEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZzaWduYXR1cmUpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMaXN0ZW5lcihjb25zdCBzcDxJRHJtQ2xpZW50PiYgbGlzdGVuZXIpOworCisgICAgLy8gTWV0aG9kcyBvZiBJRHJtUGx1Z2luTGlzdGVuZXIKKyAgICBSZXR1cm48dm9pZD4gc2VuZEV2ZW50KEV2ZW50VHlwZSBldmVudFR5cGUsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgZGF0YSk7CisKKyAgICBSZXR1cm48dm9pZD4gc2VuZEV4cGlyYXRpb25VcGRhdGUoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGludDY0X3QgZXhwaXJ5VGltZUluTVMpOworCisgICAgUmV0dXJuPHZvaWQ+IHNlbmRLZXlzQ2hhbmdlKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXNfVjFfMD4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KTsKKworICAgIFJldHVybjx2b2lkPiBzZW5kS2V5c0NoYW5nZV8xXzIoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVN0YXR1cz4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KTsKKworICAgIFJldHVybjx2b2lkPiBzZW5kU2Vzc2lvbkxvc3RTdGF0ZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKTsKKworICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ0aGVfbGF0ZV93aG8pOworCitwcml2YXRlOgorICAgIHN0YXRpYyBNdXRleCBtTG9jazsKKworICAgIHNwPElEcm1DbGllbnQ+IG1MaXN0ZW5lcjsKKyAgICBtdXRhYmxlIE11dGV4IG1FdmVudExvY2s7CisgICAgbXV0YWJsZSBNdXRleCBtTm90aWZ5TG9jazsKKworICAgIGNvbnN0IFZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IG1GYWN0b3JpZXM7CisgICAgc3A8SURybVBsdWdpbj4gbVBsdWdpbjsKKyAgICBzcDxkcm06OlYxXzE6OklEcm1QbHVnaW4+IG1QbHVnaW5WMV8xOworICAgIHNwPGRybTo6VjFfMjo6SURybVBsdWdpbj4gbVBsdWdpblYxXzI7CisgICAgU3RyaW5nOCBtQXBwUGFja2FnZU5hbWU7CisKKyAgICAvLyBNdXRhYmxlIHRvIGFsbG93IG1vZGlmaWNhdGlvbiB3aXRoaW4gR2V0UHJvcGVydHlCeXRlQXJyYXkuCisgICAgbXV0YWJsZSBNZWRpYURybU1ldHJpY3MgbU1ldHJpY3M7CisKKyAgICBWZWN0b3I8c3A8RHJtU2Vzc2lvbkNsaWVudD4+IG1PcGVuU2Vzc2lvbnM7CisgICAgdm9pZCBjbG9zZU9wZW5TZXNzaW9ucygpOworICAgIHZvaWQgY2xlYW51cCgpOworCisgICAgLyoqCisgICAgICogbUluaXRDaGVjayBpczoKKyAgICAgKiAgIE5PX0lOSVQgaWYgYSBwbHVnaW4gaGFzbid0IGJlZW4gY3JlYXRlZCB5ZXQKKyAgICAgKiAgIEVSUk9SX1VOU1VQUE9SVEVEIGlmIGEgcGx1Z2luIGNhbid0IGJlIGNyZWF0ZWQgZm9yIHRoZSB1dWlkCisgICAgICogICBPSyBhZnRlciBhIHBsdWdpbiBoYXMgYmVlbiBjcmVhdGVkIGFuZCBtUGx1Z2luIGlzIHZhbGlkCisgICAgICovCisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKworICAgIFZlY3RvcjxzcDxJRHJtRmFjdG9yeT4+IG1ha2VEcm1GYWN0b3JpZXMoKTsKKyAgICBzcDxJRHJtUGx1Z2luPiBtYWtlRHJtUGx1Z2luKGNvbnN0IHNwPElEcm1GYWN0b3J5PiYgZmFjdG9yeSwKKyAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKTsKKworICAgIHZvaWQgd3JpdGVCeXRlQXJyYXkoUGFyY2VsICZvYmosIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBhcnJheSk7CisKKyAgICB2b2lkIHJlcG9ydFBsdWdpbk1ldHJpY3MoKSBjb25zdDsKKyAgICB2b2lkIHJlcG9ydEZyYW1ld29ya01ldHJpY3MoKSBjb25zdDsKKyAgICBzdGF0dXNfdCBnZXRQcm9wZXJ0eVN0cmluZ0ludGVybmFsKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlKSBjb25zdDsKKyAgICBzdGF0dXNfdCBnZXRQcm9wZXJ0eUJ5dGVBcnJheUludGVybmFsKFN0cmluZzggY29uc3QgJm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnZhbHVlKSBjb25zdDsKKyAgICBzdGF0dXNfdCBtYXRjaE1pbWVUeXBlQW5kU2VjdXJpdHlMZXZlbChjb25zdCBzcDxJRHJtRmFjdG9yeT4gJmZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgbGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqaXNTdXBwb3J0ZWQpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtSGFsKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gRFJNX0hBTF9IXwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtTWV0cmljcy5oIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vRHJtTWV0cmljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmMTMyYmYKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1NZXRyaWNzLmgKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIERSTV9NRVRSSUNTX0hfCisjZGVmaW5lIERSTV9NRVRSSUNTX0hfCisKKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGVyc2lzdGFibGVCdW5kbGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9Db3VudGVyTWV0cmljLmg+CisjaW5jbHVkZSA8bWVkaWEvRXZlbnRNZXRyaWMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoaXMgY2xhc3MgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgbWV0cmljcyBjYXB0dXJlZCB3aXRoaW4gTWVkaWFEcm0uCisgKiBJdCBhbHNvIGNvbnRhaW5zIGEgbWV0aG9kIGZvciBleHBvcnRpbmcgYWxsIG9mIHRoZSBtZXRyaWNzIHRvIGEKKyAqIFBlcnNpc3RhYmxlQnVuZGxlLgorICovCitjbGFzcyBNZWRpYURybU1ldHJpY3MgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgTWVkaWFEcm1NZXRyaWNzKCk7CisgIHZpcnR1YWwgfk1lZGlhRHJtTWV0cmljcygpIHt9OworICAvLyBDb3VudCBvZiBvcGVuU2Vzc2lvbiBjYWxscy4KKyAgQ291bnRlck1ldHJpYzxzdGF0dXNfdD4gbU9wZW5TZXNzaW9uQ291bnRlcjsKKyAgLy8gQ291bnQgb2YgY2xvc2VTZXNzaW9uIGNhbGxzLgorICBDb3VudGVyTWV0cmljPHN0YXR1c190PiBtQ2xvc2VTZXNzaW9uQ291bnRlcjsKKyAgLy8gQ291bnQgYW5kIHRpbWluZyBvZiBnZXRLZXlSZXF1ZXN0IGNhbGxzLgorICBFdmVudE1ldHJpYzxzdGF0dXNfdD4gbUdldEtleVJlcXVlc3RUaW1lVXM7CisgIC8vIENvdW50IGFuZCB0aW1pbmcgb2YgcHJvdmlkZUtleVJlc3BvbnNlIGNhbGxzLgorICBFdmVudE1ldHJpYzxzdGF0dXNfdD4gbVByb3ZpZGVLZXlSZXNwb25zZVRpbWVVczsKKyAgLy8gQ291bnQgb2YgZ2V0UHJvdmlzaW9uUmVxdWVzdCBjYWxscy4KKyAgQ291bnRlck1ldHJpYzxzdGF0dXNfdD4gbUdldFByb3Zpc2lvblJlcXVlc3RDb3VudGVyOworICAvLyBDb3VudCBvZiBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UgY2FsbHMuCisgIENvdW50ZXJNZXRyaWM8c3RhdHVzX3Q+IG1Qcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VDb3VudGVyOworCisgIC8vIENvdW50IG9mIGtleSBzdGF0dXMgZXZlbnRzIGJyb2tlbiBvdXQgYnkgc3RhdHVzIHR5cGUuCisgIENvdW50ZXJNZXRyaWM8OjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpLZXlTdGF0dXNUeXBlPgorICAgICAgbUtleVN0YXR1c0NoYW5nZUNvdW50ZXI7CisgIC8vIENvdW50IG9mIGV2ZW50cyBicm9rZW4gb3V0IGJ5IGV2ZW50IHR5cGUKKyAgQ291bnRlck1ldHJpYzw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkV2ZW50VHlwZT4gbUV2ZW50Q291bnRlcjsKKworICAvLyBDb3VudCBnZXRQcm9wZXJ0eUJ5dGVBcnJheSBjYWxscyB0byByZXRyaWV2ZSB0aGUgZGV2aWNlIHVuaXF1ZSBpZC4KKyAgQ291bnRlck1ldHJpYzxzdGF0dXNfdD4gbUdldERldmljZVVuaXF1ZUlkQ291bnRlcjsKKworICAvLyBBZGRzIGEgc2Vzc2lvbiBzdGFydCB0aW1lIHJlY29yZC4KKyAgdm9pZCBTZXRTZXNzaW9uU3RhcnQoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworCisgIC8vIEFkZHMgYSBzZXNzaW9uIGVuZCB0aW1lIHJlY29yZC4KKyAgdm9pZCBTZXRTZXNzaW9uRW5kKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKKworICAvLyBUaGUgYXBwIHBhY2thZ2UgbmFtZSBpcyB0aGUgYXBwbGljYXRpb24gcGFja2FnZSBuYW1lIHRoYXQgaXMgdXNpbmcgdGhlCisgIC8vIGluc3RhbmNlLiBUaGUgYXBwIHBhY2thZ2UgbmFtZSBpcyBoZWxkIGhlcmUgZm9yIGNvbnZlbmllbmNlLiBJdCBpcyBub3QKKyAgLy8gc2VyaWFsaXplZCBvciBleHBvcnRlZCB3aXRoIHRoZSBtZXRyaWNzLgorICB2b2lkIFNldEFwcFBhY2thZ2VOYW1lKGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKSB7IG1BcHBQYWNrYWdlTmFtZSA9IGFwcFBhY2thZ2VOYW1lOyB9CisgIGNvbnN0IFN0cmluZzgmIEdldEFwcFBhY2thZ2VOYW1lKCkgeyByZXR1cm4gbUFwcFBhY2thZ2VOYW1lOyB9CisKKyAgLy8gRXhwb3J0IHRoZSBtZXRyaWNzIHRvIGEgUGVyc2lzdGFibGVCdW5kbGUuCisgIHZvaWQgRXhwb3J0KG9zOjpQZXJzaXN0YWJsZUJ1bmRsZSogbWV0cmljc0J1bmRsZSk7CisKKyAgLy8gR2V0IHRoZSBzZXJpYWxpemVkIG1ldHJpY3MuIE1ldHJpY3MgYXJlIGZvcm1hdHRlZCBhcyBhIHNlcmlhbGl6ZWQKKyAgLy8gRHJtRnJhbWV3b3JrTWV0cmljcyBwcm90by4gSWYgdGhlcmUgaXMgYSBmYWlsdXJlIHNlcmlhbGl6aW5nIHRoZSBtZXRyaWNzLAorICAvLyB0aGlzIHJldHVybnMgYW4gZXJyb3IuIFRoZSBwYXJhbWV0ZXIgfHNlcmxpYWxpemVkTWV0cmljc3wgaXMgb3duZWQgYnkgdGhlCisgIC8vIGNhbGxlciBhbmQgbXVzdCBub3QgYmUgbnVsbC4KKyAgc3RhdHVzX3QgR2V0U2VyaWFsaXplZE1ldHJpY3Moc3RkOjpzdHJpbmcqIHNlcmlhbGl6ZWRNZXRyaWNzKTsKKworICAvLyBDb252ZXJ0cyB0aGUgRFJNIHBsdWdpbiBtZXRyaWNzIHRvIGEgUGVyc2lzdGFibGVCdW5kbGUuIEFsbCBvZiB0aGUgbWV0cmljcworICAvLyBmb3VuZCBpbiB8cGx1Z2luTWV0cmljc3wgYXJlIGFkZGVkIHRvIHRoZSB8bWV0cmljc0J1bmRsZXwgcGFyYW1ldGVyLgorICAvLyB8cGx1Z2luQnVuZGxlfCBpcyBvd25lZCBieSB0aGUgY2FsbGVyIGFuZCBtdXN0IG5vdCBiZSBudWxsLgorICAvLworICAvLyBFYWNoIGl0ZW0gaW4gdGhlIHBsdWdpbk1ldHJpY3MgdmVjdG9yIGlzIGFkZGVkIGFzIGEgbmV3IFBlcnNpc3RhYmxlQnVuZGxlLiBFLmcuCisgIC8vIERybU1ldHJpY0dyb3VwIHsKKyAgLy8gICBtZXRyaWNzWzBdIHsKKyAgLy8gICAgIG5hbWU6ICJidWZfY29weSIKKyAgLy8gICAgIGF0dHJpYnV0ZXNbMF0geworICAvLyAgICAgICBuYW1lOiAic2l6ZSIKKyAgLy8gICAgICAgdHlwZTogSU5UNjRfVFlQRQorICAvLyAgICAgICBpbnQ2NFZhbHVlOiAxMDI0CisgIC8vICAgICB9CisgIC8vICAgICB2YWx1ZXNbMF0geworICAvLyAgICAgICBjb21wb25lbnROYW1lOiAib3BlcmF0aW9uX2NvdW50IgorICAvLyAgICAgICB0eXBlOiBJTlQ2NF9UWVBFCisgIC8vICAgICAgIGludDY0VmFsdWU6IDc1CisgIC8vICAgICB9CisgIC8vICAgICB2YWx1ZXNbMV0geworICAvLyAgICAgICBjb21wb25lbnRfbmFtZTogImF2ZXJhZ2VfdGltZV9zZWNvbmRzIgorICAvLyAgICAgICB0eXBlOiBET1VCTEVfVFlQRQorICAvLyAgICAgICBkb3VibGVWYWx1ZTogMC4wMDAwMDA0MgorICAvLyAgICAgfQorICAvLyAgIH0KKyAgLy8gfQorICAvLworICAvLyBiZWNvbWVzCisgIC8vCisgIC8vIG1ldHJpY3NCdW5kbGUgeworICAvLyAgICIwIjogKFBlcnNpc3RhYmxlQnVuZGxlKSB7CisgIC8vICAgICAiYXR0cmlidXRlcyIgOiAoUGVyc2lzdGFibGVCdW5kbGUpIHsKKyAgLy8gICAgICAgInNpemUiIDogKGludDY0KSAxMDI0CisgIC8vICAgICB9CisgIC8vICAgICAib3BlcmF0aW9uX2NvdW50IiA6IChpbnQ2NCkgNzUKKyAgLy8gICAgICJhdmVyYWdlX3RpbWVfc2Vjb25kcyIgOiAoZG91YmxlKSAwLjAwMDAwMDQyCisgIC8vICAgfQorICAvLworICBzdGF0aWMgc3RhdHVzX3QgSGlkbE1ldHJpY3NUb0J1bmRsZSgKKyAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA+JiBwbHVnaW5NZXRyaWNzLAorICAgICAgICAgIG9zOjpQZXJzaXN0YWJsZUJ1bmRsZSogbWV0cmljc0J1bmRsZSk7CisKKyBwcm90ZWN0ZWQ6CisgIC8vIFRoaXMgaXMgdmlzaWJsZSBmb3IgdGVzdGluZyBvbmx5LgorICB2aXJ0dWFsIGludDY0X3QgR2V0Q3VycmVudFRpbWVNcygpOworCisgcHJpdmF0ZToKKyAgLy8gU2Vzc2lvbiBsaWZldGltZXMuIEEgcGFpciBvZiB2YWx1ZXMgcmVwcmVzZW50aW5nIHRoZSBtaWxsaXNlY29uZHMgc2luY2UKKyAgLy8gZXBvY2gsIFVUQy4gVGhlIGZpcnN0IHZhbHVlIGlzIHRoZSBzdGFydCB0aW1lLCB0aGUgc2Vjb25kIGlzIHRoZSBlbmQgdGltZS4KKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6cGFpcjxpbnQ2NF90LCBpbnQ2NF90Pj4gbVNlc3Npb25MaWZlc3BhbnM7CisKKyAgU3RyaW5nOCBtQXBwUGFja2FnZU5hbWU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIERSTV9NRVRSSUNTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybVBsdWdpblBhdGguaCBiL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybVBsdWdpblBhdGguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1QbHVnaW5QYXRoLmgKcmVuYW1lIHRvIGRybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybVBsdWdpblBhdGguaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlLmggYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZS5oCnJlbmFtZSB0byBkcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlLmgKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmggYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYWQ1ODAKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIERSTV9TRVNTSU9OX01BTkFHRVJfSF8KKworI2RlZmluZSBEUk1fU0VTU0lPTl9NQU5BR0VSX0hfCisKKyNpbmNsdWRlIDxiaW5kZXIvSUJpbmRlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEcm1TZXNzaW9uTWFuYWdlclRlc3Q7CitjbGFzcyBJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50OworCitib29sIGlzRXF1YWxTZXNzaW9uSWQoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQxLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZDIpOworCitzdHJ1Y3QgU2Vzc2lvbkluZm8geworICAgIHBpZF90IHBpZDsKKyAgICB1aWRfdCB1aWQ7CisgICAgaW50NjRfdCBjbGllbnRJZDsKK307CisKK3R5cGVkZWYgc3RkOjptYXA8c3RkOjp2ZWN0b3I8dWludDhfdD4sIFNlc3Npb25JbmZvPiBTZXNzaW9uSW5mb01hcDsKKworc3RydWN0IERybVNlc3Npb25NYW5hZ2VyIDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKKyAgICBzdGF0aWMgc3A8RHJtU2Vzc2lvbk1hbmFnZXI+IEluc3RhbmNlKCk7CisKKyAgICBEcm1TZXNzaW9uTWFuYWdlcigpOworICAgIGV4cGxpY2l0IERybVNlc3Npb25NYW5hZ2VyKGNvbnN0IHNwPElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiAmc2VydmljZSk7CisKKyAgICB2b2lkIGFkZFNlc3Npb24oaW50IHBpZCwgY29uc3Qgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4mIGRybSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOworICAgIHZvaWQgdXNlU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCk7CisgICAgdm9pZCByZW1vdmVTZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKKyAgICBib29sIHJlY2xhaW1TZXNzaW9uKGludCBjYWxsaW5nUGlkKTsKKworICAgIC8vIHNhbml0eSBjaGVjayBBUElzCisgICAgc2l6ZV90IGdldFNlc3Npb25Db3VudCgpIGNvbnN0OworICAgIGJvb2wgY29udGFpbnNTZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSBjb25zdDsKKworICAgIC8vIGltcGxlbWVudHMgRGVhdGhSZWNpcGllbnQKKyAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgLyp3aG8qLyk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5Ecm1TZXNzaW9uTWFuYWdlcigpOworCitwcml2YXRlOgorICAgIHZvaWQgaW5pdCgpOworCisgICAgc3A8SVJlc291cmNlTWFuYWdlclNlcnZpY2U+IG1TZXJ2aWNlOworICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CisgICAgU2Vzc2lvbkluZm9NYXAgbVNlc3Npb25NYXA7CisgICAgYm9vbCBtSW5pdGlhbGl6ZWQ7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEcm1TZXNzaW9uTWFuYWdlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIERSTV9TRVNTSU9OX01BTkFHRVJfSF8KZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0lEcm0uaCBiL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0lEcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYmU4MGM2Ci0tLSAvZGV2L251bGwKKysrIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vSURybS5oCkBAIC0wLDAgKzEsMTY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YmluZGVyL1BlcnNpc3RhYmxlQnVuZGxlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL2RybS9Ecm1BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JRHJtQ2xpZW50Lmg+CisKKyNpZm5kZWYgQU5EUk9JRF9JRFJNX0hfCisKKyNkZWZpbmUgQU5EUk9JRF9JRFJNX0hfCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEFTdHJpbmc7CisKK3N0cnVjdCBJRHJtIDogcHVibGljIElJbnRlcmZhY2UgeworICAgIERFQ0xBUkVfTUVUQV9JTlRFUkZBQ0UoRHJtKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnJlc3VsdCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZhcHBQYWNrYWdlTmFtZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZXN0cm95UGx1Z2luKCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuU2Vzc2lvbihEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKKyAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlU2Vzc2lvbihWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdAorICAgICAgICBnZXRLZXlSZXF1ZXN0KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5pdERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmbWltZVR5cGUsIERybVBsdWdpbjo6S2V5VHlwZSBrZXlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGNvbnN0ICZvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZyZXF1ZXN0LCBTdHJpbmc4ICZkZWZhdWx0VXJsLAorICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgKmtleVJlcXVlc3RUeXBlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVLZXlSZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJnJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAma2V5U2V0SWQpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlS2V5cyhWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeUtleVN0YXR1cyhWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICZpbmZvTWFwKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3Zpc2lvblJlcXVlc3QoU3RyaW5nOCBjb25zdCAmY2VydFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmNlcnRBdXRob3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmcmVxdWVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAmZGVmYXVsVXJsKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVQcm92aXNpb25SZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJnJlc3BvbnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmY2VydGlmaWNhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ3cmFwcGVkS2V5KSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcHMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZzZWN1cmVTdG9wSWRzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NpZCwgVmVjdG9yPHVpbnQ4X3Q+ICZzZWN1cmVTdG9wKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VTZWN1cmVTdG9wcyhWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzUmVsZWFzZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU2VjdXJlU3RvcChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNzaWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUFsbFNlY3VyZVN0b3BzKCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRIZGNwTGV2ZWxzKERybVBsdWdpbjo6SGRjcExldmVsICpjb25uZWN0ZWRMZXZlbCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6SGRjcExldmVsICptYXhMZXZlbCkKKyAgICAgICAgICAgIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE51bWJlck9mU2Vzc2lvbnModWludDMyX3QgKmN1cnJlbnRTZXNzaW9ucywKKyAgICAgICAgICAgIHVpbnQzMl90ICptYXhTZXNzaW9ucykgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJpdHlMZXZlbChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6U2VjdXJpdHlMZXZlbCAqbGV2ZWwpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZrZXlTZXRJZHMpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZU9mZmxpbmVMaWNlbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5U2V0SWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCwKKyAgICAgICAgICAgIERybVBsdWdpbjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZSAqbGljZW5zZVN0YXRlKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJnZhbHVlICkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmdmFsdWUpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0cmljcyhvczo6UGVyc2lzdGFibGVCdW5kbGUgKm1ldHJpY3MpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2lwaGVyQWxnb3JpdGhtKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmFsZ29yaXRobSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYWNBbGdvcml0aG0oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmYWxnb3JpdGhtKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGVuY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmb3V0cHV0KSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGRlY3J5cHQoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaXYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmb3V0cHV0KSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZzaWduYXR1cmUpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2lnbmF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJm1hdGNoKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ25SU0EoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmFsZ29yaXRobSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJndyYXBwZWRLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2lnbmF0dXJlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldExpc3RlbmVyKGNvbnN0IHNwPElEcm1DbGllbnQ+JiBsaXN0ZW5lcikgPSAwOworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKElEcm0pOworfTsKKworc3RydWN0IEJuRHJtIDogcHVibGljIEJuSW50ZXJmYWNlPElEcm0+IHsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9uVHJhbnNhY3QoCisgICAgICAgICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwgJmRhdGEsIFBhcmNlbCAqcmVwbHksCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDApOworcHJpdmF0ZToKKyAgICB2b2lkIHJlYWRWZWN0b3IoY29uc3QgUGFyY2VsICZkYXRhLCBWZWN0b3I8dWludDhfdD4gJnZlY3RvcikgY29uc3Q7CisgICAgdm9pZCB3cml0ZVZlY3RvcihQYXJjZWwgKnJlcGx5LCBWZWN0b3I8dWludDhfdD4gY29uc3QgJnZlY3RvcikgY29uc3Q7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9JRFJNX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEcm1DbGllbnQuaCBiL2RybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0lEcm1DbGllbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRHJtQ2xpZW50LmgKcmVuYW1lIHRvIGRybS9saWJtZWRpYWRybS9pbmNsdWRlL21lZGlhZHJtL0lEcm1DbGllbnQuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFEcm1TZXJ2aWNlLmggYi9kcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9JTWVkaWFEcm1TZXJ2aWNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRHJtU2VydmljZS5oCnJlbmFtZSB0byBkcm0vbGlibWVkaWFkcm0vaW5jbHVkZS9tZWRpYWRybS9JTWVkaWFEcm1TZXJ2aWNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvU2hhcmVkTGlicmFyeS5oIGIvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vU2hhcmVkTGlicmFyeS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1NoYXJlZExpYnJhcnkuaApyZW5hbWUgdG8gZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUvbWVkaWFkcm0vU2hhcmVkTGlicmFyeS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lDcnlwdG8uaCBiL2RybS9saWJtZWRpYWRybS9pbnRlcmZhY2UvbWVkaWFkcm0vSUNyeXB0by5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lDcnlwdG8uaApyZW5hbWUgdG8gZHJtL2xpYm1lZGlhZHJtL2ludGVyZmFjZS9tZWRpYWRybS9JQ3J5cHRvLmgKZGlmZiAtLWdpdCBhL2RybS9saWJtZWRpYWRybS90ZXN0cy9BbmRyb2lkLmJwIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggNzYyODk2OC4uMmUzOTk0MyAxMDA2NDQKLS0tIGEvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTMsOCArMyw4IEBACiBjY190ZXN0IHsKICAgICBuYW1lOiAiQ291bnRlck1ldHJpY190ZXN0IiwKICAgICBzcmNzOiBbIkNvdW50ZXJNZXRyaWNfdGVzdC5jcHAiXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJtZWRpYV9oZWFkZXJzIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsibGlibWVkaWFkcm0iXSwKLSAgICBpbmNsdWRlX2RpcnM6IFsiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL21lZGlhIl0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAiLVdlcnJvciIsCiAgICAgICAiLVdhbGwiLApAQCAtMTQsOSArMTQsMTMgQEAKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJEcm1NZXRyaWNzX3Rlc3QiLAogICAgIHNyY3M6IFsiRHJtTWV0cmljc190ZXN0LmNwcCJdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIgorICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAogICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMSIsCisgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yIiwKICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICJsaWJsb2ciLApAQCAtMjcsNyArMzEsNyBAQAogICAgIF0sCiAgICAgc3RhdGljX2xpYnM6IFsibGliZ21vY2siXSwKICAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUvbWVkaWEiLAorICAgICAgImZyYW1ld29ya3MvYXYvZHJtL2xpYm1lZGlhZHJtL2luY2x1ZGUiLAogICAgIF0sCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgIC8vIFN1cHByZXNzIHVudXNlZCBwYXJhbWV0ZXIgYW5kIG5vIGVycm9yIG9wdGlvbnMuIFRoZXNlIGNhdXNlIHByb2JsZW1zCkBAIC0zOSwxMiArNDMsMTQgQEAKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJFdmVudE1ldHJpY190ZXN0IiwKICAgICBzcmNzOiBbIkV2ZW50TWV0cmljX3Rlc3QuY3BwIl0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiCisgICAgXSwKICAgICBzaGFyZWRfbGliczogWwogICAgICAgImxpYmxvZyIsCiAgICAgICAibGlibWVkaWFkcm0iLAogICAgICAgImxpYnV0aWxzIiwKICAgICBdLAotICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L2luY2x1ZGUvbWVkaWEiXSwKICAgICBjZmxhZ3M6IFsKICAgICAgICItV2Vycm9yIiwKICAgICAgICItV2FsbCIsCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vdGVzdHMvQ291bnRlck1ldHJpY190ZXN0LmNwcCBiL2RybS9saWJtZWRpYWRybS90ZXN0cy9Db3VudGVyTWV0cmljX3Rlc3QuY3BwCmluZGV4IDZiY2EwZGEuLmMyYmVjYjQgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS90ZXN0cy9Db3VudGVyTWV0cmljX3Rlc3QuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS90ZXN0cy9Db3VudGVyTWV0cmljX3Rlc3QuY3BwCkBAIC0xNiw3ICsxNiw3IEBACiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCi0jaW5jbHVkZSAiQ291bnRlck1ldHJpYy5oIgorI2luY2x1ZGUgPG1lZGlhL0NvdW50ZXJNZXRyaWMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9kcm0vbGlibWVkaWFkcm0vdGVzdHMvRHJtTWV0cmljc190ZXN0LmNwcCBiL2RybS9saWJtZWRpYWRybS90ZXN0cy9Ecm1NZXRyaWNzX3Rlc3QuY3BwCmluZGV4IDY0YWE5ZDAuLjVjOGExYjAgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS90ZXN0cy9Ecm1NZXRyaWNzX3Rlc3QuY3BwCisrKyBiL2RybS9saWJtZWRpYWRybS90ZXN0cy9Ecm1NZXRyaWNzX3Rlc3QuY3BwCkBAIC0zMCw3ICszMCw3IEBACiB1c2luZyA6OmFuZHJvaWQ6OmRybV9tZXRyaWNzOjpEcm1GcmFtZXdvcmtNZXRyaWNzOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkV2ZW50VHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6S2V5U3RhdHVzVHlwZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6S2V5U3RhdHVzVHlwZTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpEcm1NZXRyaWNHcm91cDsKIHVzaW5nIDo6YW5kcm9pZDo6b3M6OlBlcnNpc3RhYmxlQnVuZGxlOwpkaWZmIC0tZ2l0IGEvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0V2ZW50TWV0cmljX3Rlc3QuY3BwIGIvZHJtL2xpYm1lZGlhZHJtL3Rlc3RzL0V2ZW50TWV0cmljX3Rlc3QuY3BwCmluZGV4IGViNmM0ZjYuLmIzYzNmNjIgMTAwNjQ0Ci0tLSBhL2RybS9saWJtZWRpYWRybS90ZXN0cy9FdmVudE1ldHJpY190ZXN0LmNwcAorKysgYi9kcm0vbGlibWVkaWFkcm0vdGVzdHMvRXZlbnRNZXRyaWNfdGVzdC5jcHAKQEAgLTE2LDcgKzE2LDcgQEAKIAogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKLSNpbmNsdWRlICJFdmVudE1ldHJpYy5oIgorI2luY2x1ZGUgPG1lZGlhL0V2ZW50TWV0cmljLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5icCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDExM2NiOAotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1NSBAQAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjbGVhcmtleWNhc3BsdWdpbiIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDbGVhcktleUNhc1BsdWdpbi5jcHAiLAorICAgICAgICAiQ2xlYXJLZXlGZXRjaGVyLmNwcCIsCisgICAgICAgICJDbGVhcktleUxpY2Vuc2VGZXRjaGVyLmNwcCIsCisgICAgICAgICJDbGVhcktleVNlc3Npb25MaWJyYXJ5LmNwcCIsCisgICAgICAgICJlY20uY3BwIiwKKyAgICAgICAgImVjbV9nZW5lcmF0b3IuY3BwIiwKKyAgICAgICAgIkpzb25Bc3NldExvYWRlci5jcHAiLAorICAgICAgICAicHJvdG9zL2xpY2Vuc2VfcHJvdG9zLnByb3RvIiwKKyAgICBdLAorCisgICAgcHJvcHJpZXRhcnk6IHRydWUsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAibWVkaWFjYXMiLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbIm1lZGlhX3BsdWdpbl9oZWFkZXJzIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJqc21uIl0sCisKKyAgICBwcm90bzogeworICAgICAgICB0eXBlOiAiZnVsbCIsCisgICAgICAgIGV4cG9ydF9wcm90b19oZWFkZXJzOiB0cnVlLAorICAgIH0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5tayBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiMTM5YTguLjAwMDAwMDAKLS0tIGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgQ2xlYXJLZXlDYXNQbHVnaW4uY3BwIFwKLSAgICBDbGVhcktleUZldGNoZXIuY3BwIFwKLSAgICBDbGVhcktleUxpY2Vuc2VGZXRjaGVyLmNwcCBcCi0gICAgQ2xlYXJLZXlTZXNzaW9uTGlicmFyeS5jcHAgXAotICAgIGVjbS5jcHAgXAotICAgIGVjbV9nZW5lcmF0b3IuY3BwIFwKLSAgICBKc29uQXNzZXRMb2FkZXIuY3BwIFwKLSAgICBwcm90b3MvbGljZW5zZV9wcm90b3MucHJvdG8gXAotCi1MT0NBTF9NT0RVTEUgOj0gbGliY2xlYXJrZXljYXNwbHVnaW4KLQotTE9DQUxfUFJPUFJJRVRBUllfTU9EVUxFIDo9IHRydWUKLUxPQ0FMX01PRFVMRV9SRUxBVElWRV9QQVRIIDo9IG1lZGlhY2FzCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJsb2cgXAotICAgIGxpYmNyeXB0byBcCi0gICAgbGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiBcCi0gICAgbGlicHJvdG9idWYtY3BwLWxpdGUgXAotCi1MT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKLSAgICBtZWRpYV9wbHVnaW5faGVhZGVycwotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJqc21uIFwKLQotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IFNIQVJFRF9MSUJSQVJJRVMKLQotTE9DQUxfUFJPVE9DX09QVElNSVpFX1RZUEUgOj0gZnVsbAotCi1kZWZpbmUgcHJvdG9faW5jbHVkZXMKLSQoY2FsbCBsb2NhbC1nZW5lcmF0ZWQtc291cmNlcy1kaXIpL3Byb3RvLyQoTE9DQUxfUEFUSCkKLWVuZGVmCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgIGV4dGVybmFsL2pzbW4gXAotICAgIGZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYSBcCi0gICAgJChjYWxsIHByb3RvX2luY2x1ZGVzKQotCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gXAotICAgICQoY2FsbCBwcm90b19pbmNsdWRlcykKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIEJ1aWxkIHVuaXQgdGVzdHMKLQotaW5jbHVkZSAkKExPQ0FMX1BBVEgpL3Rlc3RzL0FuZHJvaWQubWsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmNwcAppbmRleCAxNTU4ZThiLi5hZjdjMzY3IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uY3BwCkBAIC02NSw3ICs2NSwyMCBAQAogICAgICpwbHVnaW4gPSBuZXcgQ2xlYXJLZXlDYXNQbHVnaW4oYXBwRGF0YSwgY2FsbGJhY2spOwogICAgIHJldHVybiBPSzsKIH0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworc3RhdHVzX3QgQ2xlYXJLZXlDYXNGYWN0b3J5OjpjcmVhdGVQbHVnaW4oCisgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAorICAgICAgICB2b2lkICphcHBEYXRhLAorICAgICAgICBDYXNQbHVnaW5DYWxsYmFja0V4dCBjYWxsYmFjaywKKyAgICAgICAgQ2FzUGx1Z2luICoqcGx1Z2luKSB7CisgICAgaWYgKCFpc1N5c3RlbUlkU3VwcG9ydGVkKENBX3N5c3RlbV9pZCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAqcGx1Z2luID0gbmV3IENsZWFyS2V5Q2FzUGx1Z2luKGFwcERhdGEsIGNhbGxiYWNrKTsKKyAgICByZXR1cm4gT0s7Cit9CisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogYm9vbCBDbGVhcktleURlc2NyYW1ibGVyRmFjdG9yeTo6aXNTeXN0ZW1JZFN1cHBvcnRlZCgKICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1faWQpIGNvbnN0IHsKICAgICByZXR1cm4gQ0Ffc3lzdGVtX2lkID09IHNDbGVhcktleVN5c3RlbUlkOwpAQCAtODQsNyArOTcsMTQgQEAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIENsZWFyS2V5Q2FzUGx1Z2luOjpDbGVhcktleUNhc1BsdWdpbigKICAgICAgICAgdm9pZCAqYXBwRGF0YSwgQ2FzUGx1Z2luQ2FsbGJhY2sgY2FsbGJhY2spCi0gICAgOiBtQ2FsbGJhY2soY2FsbGJhY2spLCBtQXBwRGF0YShhcHBEYXRhKSB7CisgICAgOiBtQ2FsbGJhY2soY2FsbGJhY2spLCBtQ2FsbGJhY2tFeHQoTlVMTCksIG1TdGF0dXNDYWxsYmFjayhOVUxMKSwKKyAgICBtQXBwRGF0YShhcHBEYXRhKSB7CisgICAgQUxPR1YoIkNUT1IiKTsKK30KKworQ2xlYXJLZXlDYXNQbHVnaW46OkNsZWFyS2V5Q2FzUGx1Z2luKAorICAgICAgICB2b2lkICphcHBEYXRhLCBDYXNQbHVnaW5DYWxsYmFja0V4dCBjYWxsYmFjaykKKyAgICA6IG1DYWxsYmFjayhOVUxMKSwgbUNhbGxiYWNrRXh0KGNhbGxiYWNrKSwgbUFwcERhdGEoYXBwRGF0YSkgewogICAgIEFMT0dWKCJDVE9SIik7CiB9CiAKQEAgLTkzLDYgKzExMywxMyBAQAogICAgIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5kZXN0cm95UGx1Z2luKHRoaXMpOwogfQogCitzdGF0dXNfdCBDbGVhcktleUNhc1BsdWdpbjo6c2V0U3RhdHVzQ2FsbGJhY2soCisgICAgQ2FzUGx1Z2luU3RhdHVzQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICBBTE9HVigic2V0U3RhdHVzQ2FsbGJhY2siKTsKKyAgICBtU3RhdHVzQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IENsZWFyS2V5Q2FzUGx1Z2luOjpzZXRQcml2YXRlRGF0YShjb25zdCBDYXNEYXRhICYvKmRhdGEqLykgewogICAgIEFMT0dWKCJzZXRQcml2YXRlRGF0YSIpOwogCkBAIC0xMTYsNiArMTQzLDE5IEBACiAgICAgcmV0dXJuIENsZWFyS2V5U2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5hZGRTZXNzaW9uKHRoaXMsIHNlc3Npb25JZCk7CiB9CiAKK3N0YXR1c190IENsZWFyS2V5Q2FzUGx1Z2luOjpvcGVuU2Vzc2lvbih1aW50MzJfdCBpbnRlbnQsIHVpbnQzMl90IG1vZGUsCisgICAgQ2FzU2Vzc2lvbklkKiBzZXNzaW9uSWQpIHsKKyAgICBBTE9HVigib3BlblNlc3Npb24gd2l0aCBpbnRlbnQ9JWQsIG1vZGU9JWQiLCBpbnRlbnQsIG1vZGUpOworICAgIC8vIEVjaG8gdGhlIHJlY2VpdmVkIGluZm9ybWF0aW9uIHRvIHRoZSBjYWxsYmFjay4KKyAgICAvLyBDbGVhciBrZXkgcGx1Z2luIGRvZXNuJ3QgdXNlIGFueSBldmVudCwgZWNobydpbmcgZm9yIHRlc3Rpbmcgb25seS4KKyAgICBpZiAobVN0YXR1c0NhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgICAgbVN0YXR1c0NhbGxiYWNrKCh2b2lkKiltQXBwRGF0YSwgaW50ZW50LCBtb2RlKTsKKyAgICB9CisKKyAgICAvLyBDbGVhciBrZXkgcGx1Z2luIGRvZXNuJ3QgdXNlIGludGVudCBhbmQgbW9kZS4KKyAgICByZXR1cm4gQ2xlYXJLZXlTZXNzaW9uTGlicmFyeTo6Z2V0KCktPmFkZFNlc3Npb24odGhpcywgc2Vzc2lvbklkKTsKK30KKwogc3RhdHVzX3QgQ2xlYXJLZXlDYXNQbHVnaW46OmNsb3NlU2Vzc2lvbihjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCkgewogICAgIEFMT0dWKCJjbG9zZVNlc3Npb246IHNlc3Npb25JZD0lcyIsIHNlc3Npb25JZFRvU3RyaW5nKHNlc3Npb25JZCkuc3RyaW5nKCkpOwogICAgIHN0ZDo6c2hhcmVkX3B0cjxDbGVhcktleUNhc1Nlc3Npb24+IHNlc3Npb24gPQpAQCAtMTY3LDExICsyMDcsMzAgQEAKICAgICAvLyBFY2hvIHRoZSByZWNlaXZlZCBldmVudCB0byB0aGUgY2FsbGJhY2suCiAgICAgLy8gQ2xlYXIga2V5IHBsdWdpbiBkb2Vzbid0IHVzZSBhbnkgZXZlbnQsIGVjaG8naW5nIGZvciB0ZXN0aW5nIG9ubHkuCiAgICAgaWYgKG1DYWxsYmFjayAhPSBOVUxMKSB7Ci0gICAgICAgIG1DYWxsYmFjaygodm9pZCopbUFwcERhdGEsIGV2ZW50LCBhcmcsICh1aW50OF90KilldmVudERhdGEuZGF0YSgpLCBldmVudERhdGEuc2l6ZSgpKTsKKyAgICAgICAgbUNhbGxiYWNrKCh2b2lkKiltQXBwRGF0YSwgZXZlbnQsIGFyZywgKHVpbnQ4X3QqKWV2ZW50RGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YS5zaXplKCkpOworICAgIH0gZWxzZSBpZiAobUNhbGxiYWNrRXh0ICE9IE5VTEwpIHsKKyAgICAgICAgbUNhbGxiYWNrRXh0KCh2b2lkKiltQXBwRGF0YSwgZXZlbnQsIGFyZywgKHVpbnQ4X3QqKWV2ZW50RGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIGV2ZW50RGF0YS5zaXplKCksIE5VTEwpOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENsZWFyS2V5Q2FzUGx1Z2luOjpzZW5kU2Vzc2lvbkV2ZW50KAorICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCwgaW50MzJfdCBldmVudCwKKyAgICAgICAgaW50IGFyZywgY29uc3QgQ2FzRGF0YSAmZXZlbnREYXRhKSB7CisgICAgQUxPR1YoInNlbmRTZXNzaW9uRXZlbnQ6IHNlc3Npb25JZD0lcywgZXZlbnQ9JWQsIGFyZz0lZCIsCisgICAgICAgICAgc2Vzc2lvbklkVG9TdHJpbmcoc2Vzc2lvbklkKS5zdHJpbmcoKSwgZXZlbnQsIGFyZyk7CisgICAgLy8gRWNobyB0aGUgcmVjZWl2ZWQgZXZlbnQgdG8gdGhlIGNhbGxiYWNrLgorICAgIC8vIENsZWFyIGtleSBwbHVnaW4gZG9lc24ndCB1c2UgYW55IGV2ZW50LCBlY2hvJ2luZyBmb3IgdGVzdGluZyBvbmx5LgorICAgIGlmIChtQ2FsbGJhY2tFeHQgIT0gTlVMTCkgeworICAgICAgICBtQ2FsbGJhY2tFeHQoKHZvaWQqKW1BcHBEYXRhLCBldmVudCwgYXJnLCAodWludDhfdCopZXZlbnREYXRhLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgZXZlbnREYXRhLnNpemUoKSwgJnNlc3Npb25JZCk7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBDbGVhcktleUNhc1BsdWdpbjo6cHJvdmlzaW9uKGNvbnN0IFN0cmluZzggJnN0cikgewogICAgIEFMT0dWKCJwcm92aXNpb246IHByb3Zpc2lvblN0cmluZz0lcyIsIHN0ci5zdHJpbmcoKSk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUtleUZldGNoZXJMb2NrKTsKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmggYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUNhc1BsdWdpbi5oCmluZGV4IDM4OWUxNzIuLmM2OTM4ZTYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5Q2FzUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlDYXNQbHVnaW4uaApAQCAtNDcsNiArNDcsMTEgQEAKICAgICAgICAgICAgIHZvaWQgKmFwcERhdGEsCiAgICAgICAgICAgICBDYXNQbHVnaW5DYWxsYmFjayBjYWxsYmFjaywKICAgICAgICAgICAgIENhc1BsdWdpbiAqKnBsdWdpbikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oCisgICAgICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwKKyAgICAgICAgICAgIHZvaWQgKmFwcERhdGEsCisgICAgICAgICAgICBDYXNQbHVnaW5DYWxsYmFja0V4dCBjYWxsYmFjaywKKyAgICAgICAgICAgIENhc1BsdWdpbiAqKnBsdWdpbikgb3ZlcnJpZGU7CiB9OwogCiBjbGFzcyBDbGVhcktleURlc2NyYW1ibGVyRmFjdG9yeSA6IHB1YmxpYyBEZXNjcmFtYmxlckZhY3RvcnkgewpAQCAtNjMsMTMgKzY4LDIwIEBACiBjbGFzcyBDbGVhcktleUNhc1BsdWdpbiA6IHB1YmxpYyBDYXNQbHVnaW4gewogcHVibGljOgogICAgIENsZWFyS2V5Q2FzUGx1Z2luKHZvaWQgKmFwcERhdGEsIENhc1BsdWdpbkNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICBDbGVhcktleUNhc1BsdWdpbih2b2lkICphcHBEYXRhLCBDYXNQbHVnaW5DYWxsYmFja0V4dCBjYWxsYmFjayk7CiAgICAgdmlydHVhbCB+Q2xlYXJLZXlDYXNQbHVnaW4oKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RhdHVzQ2FsbGJhY2soCisgICAgICAgICAgICBDYXNQbHVnaW5TdGF0dXNDYWxsYmFjayBjYWxsYmFjaykgb3ZlcnJpZGU7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByaXZhdGVEYXRhKAogICAgICAgICAgICAgY29uc3QgQ2FzRGF0YSAmZGF0YSkgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKENhc1Nlc3Npb25JZCAqc2Vzc2lvbklkKSBvdmVycmlkZTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlblNlc3Npb24odWludDMyX3QgaW50ZW50LCB1aW50MzJfdCBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc1Nlc3Npb25JZCAqc2Vzc2lvbklkKSBvdmVycmlkZTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2VTZXNzaW9uKAogICAgICAgICAgICAgY29uc3QgQ2FzU2Vzc2lvbklkICZzZXNzaW9uSWQpIG92ZXJyaWRlOwogCkBAIC04NSw2ICs5NywxMCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VuZEV2ZW50KAogICAgICAgICAgICAgaW50MzJfdCBldmVudCwgaW50MzJfdCBhcmcsIGNvbnN0IENhc0RhdGEgJmV2ZW50RGF0YSkgb3ZlcnJpZGU7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbmRTZXNzaW9uRXZlbnQoCisgICAgICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCwKKyAgICAgICAgICAgIGludDMyX3QgZXZlbnQsIGludDMyX3QgYXJnLCBjb25zdCBDYXNEYXRhICZldmVudERhdGEpIG92ZXJyaWRlOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aXNpb24oY29uc3QgU3RyaW5nOCAmc3RyKSBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVmcmVzaEVudGl0bGVtZW50cygKQEAgLTk0LDYgKzExMCw4IEBACiAgICAgTXV0ZXggbUtleUZldGNoZXJMb2NrOwogICAgIHN0ZDo6dW5pcXVlX3B0cjxLZXlGZXRjaGVyPiBtS2V5RmV0Y2hlcjsKICAgICBDYXNQbHVnaW5DYWxsYmFjayBtQ2FsbGJhY2s7CisgICAgQ2FzUGx1Z2luQ2FsbGJhY2tFeHQgbUNhbGxiYWNrRXh0OworICAgIENhc1BsdWdpblN0YXR1c0NhbGxiYWNrIG1TdGF0dXNDYWxsYmFjazsKICAgICB2b2lkKiBtQXBwRGF0YTsKIH07CiAKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5RmV0Y2hlci5jcHAgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9DbGVhcktleUZldGNoZXIuY3BwCmluZGV4IGVhYTMzOTAuLmNiNjlmOTEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L0NsZWFyS2V5RmV0Y2hlci5jcHAKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvQ2xlYXJLZXlGZXRjaGVyLmNwcApAQCAtODksNyArODksNyBAQAogICAgIC8vIGFzc2V0X2lkIGNoYW5nZS4gSWYgaXQgc2VuZHMgYW4gRWNtQ29udGFpbmVyIHdpdGggMiBFY21zIHdpdGggZGlmZmVyZW50CiAgICAgLy8gYXNzZXRfaWRzIChvbGQgYW5kIG5ldykgdGhlbiBpdCBtaWdodCBiZSBiZXN0IHRvIHByZWZldGNoIHRoZSBFbW0uCiAgICAgaWYgKChhc3NldF8uaWQoKSAhPSAwKSAmJiAoKmFzc2V0X2lkICE9IGFzc2V0Xy5pZCgpKSkgewotICAgICAgICBBTE9HVygiQXNzZXRfaWQgY2hhbmdlIGZyb20gJWxsdSB0byAlIiBQUkl1NjQsIGFzc2V0Xy5pZCgpLCAqYXNzZXRfaWQpOworICAgICAgICBBTE9HVygiQXNzZXRfaWQgY2hhbmdlIGZyb20gJSIgUFJJdTY0ICIgdG8gJSIgUFJJdTY0LCBhc3NldF8uaWQoKSwgKmFzc2V0X2lkKTsKICAgICAgICAgYXNzZXRfLkNsZWFyKCk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9lY20uY3BwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvZWNtLmNwcAppbmRleCA5ZmRlMTNhLi5iM2I1MjE4IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS9lY20uY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L2VjbS5jcHAKQEAgLTE3LDYgKzE3LDggQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiZWNtIgogCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKwogI2luY2x1ZGUgImVjbS5oIgogI2luY2x1ZGUgImVjbV9nZW5lcmF0b3IuaCIKICNpbmNsdWRlICJwcm90b3MvbGljZW5zZV9wcm90b3MucGIuaCIKQEAgLTc2LDcgKzc4LDcgQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAgICAgaWYgKGFzc2V0LmlkKCkgIT0gYXNzZXRfZnJvbV9lbW0uaWQoKSkgewotICAgICAgICBBTE9HRSgiQXNzZXRfaWQgZnJvbSBFbW0gKCVsbHUpIGRvZXMgbm90IG1hdGNoIGFzc2V0X2lkIGZyb20gRWNtICglbGx1KS4iLAorICAgICAgICBBTE9HRSgiQXNzZXRfaWQgZnJvbSBFbW0gKCUiIFBSSXU2NCAiKSBkb2VzIG5vdCBtYXRjaCBhc3NldF9pZCBmcm9tIEVjbSAoJSIgUFJJdTY0ICIpLiIsCiAgICAgICAgICAgICAgICAgYXNzZXRfZnJvbV9lbW0uaWQoKSwgYXNzZXQuaWQoKSk7CiAgICAgICAgIHJldHVybiBDTEVBUktFWV9TVEFUVVNfSU5WQUxJRF9QQVJBTUVURVI7CiAgICAgfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvY2xlYXJrZXkvdGVzdHMvQW5kcm9pZC5icCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc1ODYzYwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0NSBAQAorLy8KKy8vIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLy8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkNsZWFyS2V5RmV0Y2hlclRlc3QiLAorCisgICAgc3JjczogWyJDbGVhcktleUZldGNoZXJUZXN0LmNwcCJdLAorCisgICAgdmVuZG9yOiB0cnVlLAorCisgICAgLy8gTE9DQUxfTERGTEFHUyBpcyBuZWVkZWQgaGVyZSBmb3IgdGhlIHRlc3QgdG8gdXNlIHRoZSBwbHVnaW4sIGJlY2F1c2UKKyAgICAvLyB0aGUgcGx1Z2luIGlzIG5vdCBpbiBzdGFuZGFyZCBsaWJyYXJ5IHNlYXJjaCBwYXRoLiBXaXRob3V0IHRoaXMgLnNvCisgICAgLy8gbG9hZGluZyBmYWlscyBhdCBydW4tdGltZSAobGlua2luZyBpcyBva2F5KS4KKyAgICBsZGZsYWdzOiBbCisgICAgICAgICItV2wsLS1ycGF0aCwke09SSUdJTn0vLi4vLi4vLi4vc3lzdGVtL3ZlbmRvci9saWIvbWVkaWFjYXMiLAorICAgICAgICAiLVdsLC0tZW5hYmxlLW5ldy1kdGFncyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJjbGVhcmtleWNhc3BsdWdpbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYSIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQubWsgYi9kcm0vbWVkaWFjYXMvcGx1Z2lucy9jbGVhcmtleS90ZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTU0NWFmLi4wMDAwMDAwCi0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5L3Rlc3RzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0jCi0jIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotICAgIENsZWFyS2V5RmV0Y2hlclRlc3QuY3BwCi0KLUxPQ0FMX01PRFVMRSA6PSBDbGVhcktleUZldGNoZXJUZXN0Ci1MT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKLQotIyBMT0NBTF9MREZMQUdTIGlzIG5lZWRlZCBoZXJlIGZvciB0aGUgdGVzdCB0byB1c2UgdGhlIHBsdWdpbiwgYmVjYXVzZQotIyB0aGUgcGx1Z2luIGlzIG5vdCBpbiBzdGFuZGFyZCBsaWJyYXJ5IHNlYXJjaCBwYXRoLiBXaXRob3V0IHRoaXMgLnNvCi0jIGxvYWRpbmcgZmFpbHMgYXQgcnVuLXRpbWUgKGxpbmtpbmcgaXMgb2theSkuCi1MT0NBTF9MREZMQUdTIDo9IFwKLSAgICAtV2wsLS1ycGF0aCxcJCR7T1JJR0lOfS8uLi8uLi8uLi9zeXN0ZW0vdmVuZG9yL2xpYi9tZWRpYWNhcyAtV2wsLS1lbmFibGUtbmV3LWR0YWdzCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYnV0aWxzIGxpYmNsZWFya2V5Y2FzcGx1Z2luIGxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24gbGlicHJvdG9idWYtY3BwLWxpdGUgbGlibG9nCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgICQoVE9QKS9mcmFtZXdvcmtzL2F2L2RybS9tZWRpYWNhcy9wbHVnaW5zL2NsZWFya2V5IFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIFwKLSAgICAkKFRPUCkvZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYSBcCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLWluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKLQotCi0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svQW5kcm9pZC5icCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGEzYzZmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzkgQEAKKy8vCisvLyBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy8vCisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlibW9ja2Nhc3BsdWdpbiIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJNb2NrQ2FzUGx1Z2luLmNwcCIsCisgICAgICAgICJNb2NrU2Vzc2lvbkxpYnJhcnkuY3BwIiwKKyAgICBdLAorCisgICAgcHJvcHJpZXRhcnk6IHRydWUsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAibWVkaWFjYXMiLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbIm1lZGlhX3BsdWdpbl9oZWFkZXJzIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9BbmRyb2lkLm1rIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWQ2MWRhLi4wMDAwMDAwCi0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDM5ICswLDAgQEAKLSMKLSMgQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9TUkNfRklMRVM6PSBcCi0gICAgTW9ja0Nhc1BsdWdpbi5jcHAgXAotICAgIE1vY2tTZXNzaW9uTGlicmFyeS5jcHAgXAotCi1MT0NBTF9NT0RVTEUgOj0gbGlibW9ja2Nhc3BsdWdpbgotCi1MT0NBTF9QUk9QUklFVEFSWV9NT0RVTEUgOj0gdHJ1ZQotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gbWVkaWFjYXMKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGlidXRpbHMgbGlibG9nCi0KLUxPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gbWVkaWFfcGx1Z2luX2hlYWRlcnMKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCi0gICAgJChUT1ApL2ZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEgXAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uY3BwIGIvZHJtL21lZGlhY2FzL3BsdWdpbnMvbW9jay9Nb2NrQ2FzUGx1Z2luLmNwcAppbmRleCA4NDA0YTgzLi5mOGJhYjBhIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uY3BwCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5jcHAKQEAgLTYwLDYgKzYwLDE5IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNb2NrQ2FzRmFjdG9yeTo6Y3JlYXRlUGx1Z2luKAorICAgICAgICBpbnQzMl90IENBX3N5c3RlbV9pZCwKKyAgICAgICAgdm9pZCogLyphcHBEYXRhKi8sCisgICAgICAgIENhc1BsdWdpbkNhbGxiYWNrRXh0IC8qY2FsbGJhY2sqLywKKyAgICAgICAgQ2FzUGx1Z2luICoqcGx1Z2luKSB7CisgICAgaWYgKCFpc1N5c3RlbUlkU3VwcG9ydGVkKENBX3N5c3RlbV9pZCkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAqcGx1Z2luID0gbmV3IE1vY2tDYXNQbHVnaW4oKTsKKyAgICByZXR1cm4gT0s7Cit9CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogYm9vbCBNb2NrRGVzY3JhbWJsZXJGYWN0b3J5Ojppc1N5c3RlbUlkU3VwcG9ydGVkKGludDMyX3QgQ0Ffc3lzdGVtX2lkKSBjb25zdCB7CkBAIC05OCw2ICsxMTEsMTIgQEAKICAgICBNb2NrU2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5kZXN0cm95UGx1Z2luKHRoaXMpOwogfQogCitzdGF0dXNfdCBNb2NrQ2FzUGx1Z2luOjpzZXRTdGF0dXNDYWxsYmFjaygKKyAgICBDYXNQbHVnaW5TdGF0dXNDYWxsYmFjayAvKmNhbGxiYWNrKi8pIHsKKyAgICBBTE9HVigic2V0U3RhdHVzQ2FsbGJhY2siKTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXR1c190IE1vY2tDYXNQbHVnaW46OnNldFByaXZhdGVEYXRhKGNvbnN0IENhc0RhdGEmIC8qZGF0YSovKSB7CiAgICAgQUxPR1YoInNldFByaXZhdGVEYXRhIik7CiAgICAgcmV0dXJuIE9LOwpAQCAtMTA4LDYgKzEyNywxMyBAQAogICAgIHJldHVybiBNb2NrU2Vzc2lvbkxpYnJhcnk6OmdldCgpLT5hZGRTZXNzaW9uKHRoaXMsIHNlc3Npb25JZCk7CiB9CiAKK3N0YXR1c190IE1vY2tDYXNQbHVnaW46Om9wZW5TZXNzaW9uKHVpbnQzMl90IGludGVudCwgdWludDMyX3QgbW9kZSwKKyAgICBDYXNTZXNzaW9uSWQqIHNlc3Npb25JZCkgeworICAgIEFMT0dWKCJvcGVuU2Vzc2lvbiB3aXRoIGludGVudD0lZCwgbW9kZT0lZCIsIGludGVudCwgbW9kZSk7CisgICAgLy8gQ2xlYXIga2V5IHBsdWdpbiBkb2Vzbid0IHVzZSBpbnRlbnQgYW5kIG1vZGUuCisgICAgcmV0dXJuIE1vY2tTZXNzaW9uTGlicmFyeTo6Z2V0KCktPmFkZFNlc3Npb24odGhpcywgc2Vzc2lvbklkKTsKK30KKwogc3RhdHVzX3QgTW9ja0Nhc1BsdWdpbjo6Y2xvc2VTZXNzaW9uKGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkKSB7CiAgICAgQUxPR1YoImNsb3NlU2Vzc2lvbjogc2Vzc2lvbklkPSVzIiwgYXJyYXlUb1N0cmluZyhzZXNzaW9uSWQpLnN0cmluZygpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CkBAIC0xNzAsNiArMTk2LDE2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBNb2NrQ2FzUGx1Z2luOjpzZW5kU2Vzc2lvbkV2ZW50KAorICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCwgaW50MzJfdCBldmVudCwKKyAgICAgICAgaW50IC8qYXJnKi8sIGNvbnN0IENhc0RhdGEmIC8qZXZlbnREYXRhKi8pIHsKKyAgICBBTE9HVigic2VuZFNlc3Npb25FdmVudDogc2Vzc2lvbklkPSVzLCBldmVudD0lZCIsCisgICAgICAgICAgYXJyYXlUb1N0cmluZyhzZXNzaW9uSWQpLnN0cmluZygpLCBldmVudCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworCisgICAgcmV0dXJuIE9LOworfQorCiBzdGF0dXNfdCBNb2NrQ2FzUGx1Z2luOjpwcm92aXNpb24oY29uc3QgU3RyaW5nOCAmc3RyKSB7CiAgICAgQUxPR1YoInByb3Zpc2lvbjogcHJvdmlzaW9uU3RyaW5nPSVzIiwgc3RyLnN0cmluZygpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFjYXMvcGx1Z2lucy9tb2NrL01vY2tDYXNQbHVnaW4uaCBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5oCmluZGV4IDgxMDY5OTAuLjY2MGZkNDQgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5oCisrKyBiL2RybS9tZWRpYWNhcy9wbHVnaW5zL21vY2svTW9ja0Nhc1BsdWdpbi5oCkBAIC00Miw2ICs0MiwxMSBAQAogICAgICAgICAgICAgdm9pZCAqYXBwRGF0YSwKICAgICAgICAgICAgIENhc1BsdWdpbkNhbGxiYWNrIGNhbGxiYWNrLAogICAgICAgICAgICAgQ2FzUGx1Z2luICoqcGx1Z2luKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZVBsdWdpbigKKyAgICAgICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX2lkLAorICAgICAgICAgICAgdm9pZCAqYXBwRGF0YSwKKyAgICAgICAgICAgIENhc1BsdWdpbkNhbGxiYWNrRXh0IGNhbGxiYWNrLAorICAgICAgICAgICAgQ2FzUGx1Z2luICoqcGx1Z2luKSBvdmVycmlkZTsKIH07CiAKIGNsYXNzIE1vY2tEZXNjcmFtYmxlckZhY3RvcnkgOiBwdWJsaWMgRGVzY3JhbWJsZXJGYWN0b3J5IHsKQEAgLTYwLDExICs2NSwxNyBAQAogICAgIE1vY2tDYXNQbHVnaW4oKTsKICAgICB2aXJ0dWFsIH5Nb2NrQ2FzUGx1Z2luKCk7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN0YXR1c0NhbGxiYWNrKAorICAgICAgICAgICAgQ2FzUGx1Z2luU3RhdHVzQ2FsbGJhY2sgY2FsbGJhY2spIG92ZXJyaWRlOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcml2YXRlRGF0YSgKICAgICAgICAgICAgIGNvbnN0IENhc0RhdGEgJmRhdGEpIG92ZXJyaWRlOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuU2Vzc2lvbihDYXNTZXNzaW9uSWQgKnNlc3Npb25JZCkgb3ZlcnJpZGU7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5TZXNzaW9uKHVpbnQzMl90IGludGVudCwgdWludDMyX3QgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXNTZXNzaW9uSWQgKnNlc3Npb25JZCkgb3ZlcnJpZGU7CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlU2Vzc2lvbigKICAgICAgICAgICAgIGNvbnN0IENhc1Nlc3Npb25JZCAmc2Vzc2lvbklkKSBvdmVycmlkZTsKIApAQCAtODAsNyArOTEsMTEgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNlbmRFdmVudCgKICAgICAgICAgICAgIGludDMyX3QgZXZlbnQsIGludDMyX3QgYXJnLCBjb25zdCBDYXNEYXRhICZldmVudERhdGEpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcm92aXNpb24oY29uc3QgU3RyaW5nOCAmc3RyKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbmRTZXNzaW9uRXZlbnQoCisgICAgICAgICAgICBjb25zdCBDYXNTZXNzaW9uSWQgJnNlc3Npb25JZCwKKyAgICAgICAgICAgIGludDMyX3QgZXZlbnQsIGludDMyX3QgYXJnLCBjb25zdCBDYXNEYXRhICZldmVudERhdGEpIG92ZXJyaWRlOworCisgICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlzaW9uKGNvbnN0IFN0cmluZzggJnN0cikgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZnJlc2hFbnRpdGxlbWVudHMoCiAgICAgICAgICAgICBpbnQzMl90IHJlZnJlc2hUeXBlLCBjb25zdCBDYXNEYXRhICZyZWZyZXNoRGF0YSkgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vQW5kcm9pZC5icCBiL2RybS9tZWRpYWRybS9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOWYwN2YxLi4wMDAwMDAwCi0tLSBhL2RybS9tZWRpYWRybS9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc3ViZGlycyA9IFsicGx1Z2lucy8qIl0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9VdGlscy5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vVXRpbHMuY3BwCmluZGV4IDkzYzY0M2IuLmQ0OGIwYTggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9VdGlscy5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL1V0aWxzLmNwcApAQCAtMjcsNCArMjcsMTggQEAKICAgICByZXR1cm4gbWVtY21wKCh2b2lkICopbGhzLmFycmF5KCksICh2b2lkICopcmhzLmFycmF5KCksIHJocy5zaXplKCkpIDwgMDsKIH0KIAorc3RkOjpzdHJpbmcgQnl0ZUFycmF5VG9IZXhTdHJpbmcoY29uc3QgdWludDhfdCogaW5fYnVmZmVyLCBzaXplX3QgbGVuZ3RoKSB7CisgICAgc3RhdGljIGNvbnN0IGNoYXIga0hleENoYXJzW10gPSAiMDEyMzQ1Njc4OUFCQ0RFRiI7CisKKyAgICAvLyBFYWNoIGlucHV0IGJ5dGUgY3JlYXRlcyB0d28gb3V0cHV0IGhleCBjaGFyYWN0ZXJzLgorICAgIHN0ZDo6c3RyaW5nIG91dF9idWZmZXIobGVuZ3RoICogMiwgJ1wwJyk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgICAgIGNoYXIgYnl0ZSA9IGluX2J1ZmZlcltpXTsKKyAgICAgICAgb3V0X2J1ZmZlclsoaSAqIDIpXSA9IGtIZXhDaGFyc1soYnl0ZSA+PiA0KSAmIDB4Zl07CisgICAgICAgIG91dF9idWZmZXJbKGkgKiAyKSArIDFdID0ga0hleENoYXJzW2J5dGUgJiAweGZdOworICAgIH0KKyAgICByZXR1cm4gb3V0X2J1ZmZlcjsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvVXRpbHMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2NvbW1vbi9pbmNsdWRlL1V0aWxzLmgKaW5kZXggMjU0MzEyNC4uYWE1NzFjMCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvY29tbW9uL2luY2x1ZGUvVXRpbHMuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9jb21tb24vaW5jbHVkZS9VdGlscy5oCkBAIC0xNywxNCArMTcsMTYgQEAKICNpZm5kZWYgQ0xFQVJLRVlfVVRJTFNfSF8KICNkZWZpbmUgQ0xFQVJLRVlfVVRJTFNfSF8KIAorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAorbmFtZXNwYWNlIGFuZHJvaWQgewogLy8gQWRkIGEgY29tcGFyaXNvbiBvcGVyYXRvciBmb3IgdGhpcyBWZWN0b3Igc3BlY2lhbGl6YXRpb24gc28gdGhhdCBpdCBjYW4gYmUKIC8vIHVzZWQgYXMgYSBrZXkgaW4gYSBLZXllZFZlY3Rvci4KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQogYm9vbCBvcGVyYXRvcjwoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZsaHMsIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmcmhzKTsKIAorc3RkOjpzdHJpbmcgQnl0ZUFycmF5VG9IZXhTdHJpbmcoY29uc3QgdWludDhfdCogaW5fYnVmZmVyLCBzaXplX3QgbGVuZ3RoKTsKKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZGVmaW5lIFVOVVNFRCh4KSAodm9pZCkoeCk7CmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9kZWZhdWx0L0FuZHJvaWQuYnAKaW5kZXggN2JhNTcwOC4uOTgwM2QzMiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvZGVmYXVsdC9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2RlZmF1bHQvQW5kcm9pZC5icApAQCAtNjEsNyArNjEsMyBAQAogICAgIH0sCiB9CiAKLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0vLyBCdWlsZCB1bml0IHRlc3RzCi0KLXN1YmRpcnMgPSBbInRlc3RzIl0KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQWVzQ3RyRGVjcnlwdG9yLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQWVzQ3RyRGVjcnlwdG9yLmNwcAppbmRleCAyZmNlMDc5MC4uMGFjODc5YyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BZXNDdHJEZWNyeXB0b3IuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQWVzQ3RyRGVjcnlwdG9yLmNwcApAQCAtMjYsNyArMjYsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdWJTYW1wbGU7CkBAIC03OSw3ICs3OSw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0FuZHJvaWQuYnAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0FuZHJvaWQuYnAKaW5kZXggMzQxZDRmNi4uYTE1M2NlMiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9BbmRyb2lkLmJwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQW5kcm9pZC5icApAQCAtMTQsOCArMTQsOCBAQAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAvLwogCi1jY19iaW5hcnkgewotICAgIG5hbWU6ICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleSIsCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImNsZWFya2V5X3NlcnZpY2VfZGVmYXVsdHMiLAogICAgIHZlbmRvcjogdHJ1ZSwKIAogICAgIHNyY3M6IFsKQEAgLTI1LDM1ICsyNSwzNyBAQAogICAgICAgICAiQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcCIsCiAgICAgICAgICJDcnlwdG9GYWN0b3J5LmNwcCIsCiAgICAgICAgICJDcnlwdG9QbHVnaW4uY3BwIiwKKyAgICAgICAgIkRldmljZUZpbGVzLmNwcCIsCiAgICAgICAgICJEcm1GYWN0b3J5LmNwcCIsCiAgICAgICAgICJEcm1QbHVnaW4uY3BwIiwKICAgICAgICAgIkluaXREYXRhUGFyc2VyLmNwcCIsCiAgICAgICAgICJKc29uV2ViS2V5LmNwcCIsCisgICAgICAgICJNZW1vcnlGaWxlU3lzdGVtLmNwcCIsCiAgICAgICAgICJTZXNzaW9uLmNwcCIsCiAgICAgICAgICJTZXNzaW9uTGlicmFyeS5jcHAiLAotICAgICAgICAic2VydmljZS5jcHAiLAogICAgIF0sCiAKICAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJodyIsCiAKICAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAotICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkucmMiXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMiIsCiAgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJjcnlwdG8iLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGliaGlkbG1lbW9yeSIsCi0gICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKICAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJwcm90b2J1Zi1jcHAtbGl0ZSIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJjbGVhcmtleWNvbW1vbiIsCisgICAgICAgICJsaWJjbGVhcmtleWRldmljZWZpbGVzLXByb3RvcyIsCiAgICAgICAgICJsaWJqc21uIiwKICAgICBdLAogCkBAIC02NSw0ICs2NywyNiBAQAogICAgICAgICBpbnRlZ2VyX292ZXJmbG93OiB0cnVlLAogICAgIH0sCiB9CitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmNsZWFya2V5ZGV2aWNlZmlsZXMtcHJvdG9zIiwKKyAgICB2ZW5kb3I6IHRydWUsCiAKKyAgICBwcm90bzogeworICAgICAgICBleHBvcnRfcHJvdG9faGVhZGVyczogdHJ1ZSwKKyAgICAgICAgdHlwZTogImxpdGUiLAorICAgIH0sCisgICAgc3JjczogWyJwcm90b3MvRGV2aWNlRmlsZXMucHJvdG8iXSwKK30KK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5IiwKKyAgICBkZWZhdWx0czogWyJjbGVhcmtleV9zZXJ2aWNlX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJzZXJ2aWNlLmNwcCJdLAorICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UuY2xlYXJrZXkucmMiXSwKK30KK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLWxhenkuY2xlYXJrZXkiLAorICAgIG92ZXJyaWRlczogWyJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleSJdLAorICAgIGRlZmF1bHRzOiBbImNsZWFya2V5X3NlcnZpY2VfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInNlcnZpY2VMYXp5LmNwcCJdLAorICAgIGluaXRfcmM6IFsiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYyJdLAorfQpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CYXNlNjQuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CYXNlNjQuY3BwCmluZGV4IGMyZWQ3NTEuLjY1N2E0MmYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQmFzZTY0LmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0Jhc2U2NC5jcHAKQEAgLTIxLDcgKzIxLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHNwPEJ1ZmZlcj4gZGVjb2RlQmFzZTY0KGNvbnN0IHN0ZDo6c3RyaW5nICZzKSB7CkBAIC0xNjksNyArMTY5LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQnVmZmVyLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQnVmZmVyLmNwcAppbmRleCBlNThmNThhLi43NWY4Mzk1IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0J1ZmZlci5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9CdWZmZXIuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBCdWZmZXI6OkJ1ZmZlcihzaXplX3QgY2FwYWNpdHkpCkBAIC00Nyw3ICs0Nyw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5jcHAKaW5kZXggMWJhNWM2YS4uMTQxMGQ3NyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmNwcApAQCAtMjIsNyArMjIsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogZXh0ZXJuICJDIiB7CkBAIC0zOCw3ICszOCw3IEBACiB9IC8vIGV4dGVybiAiQyIKIAogfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19ICAvLyBuYW1lc3BhY2UgVjFfMQorfSAgLy8gbmFtZXNwYWNlIFYxXzIKIH0gIC8vIG5hbWVzcGFjZSBkcm0KIH0gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvRmFjdG9yeS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b0ZhY3RvcnkuY3BwCmluZGV4IDA4NDhjZWYuLjJhNDhkYjYgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvRmFjdG9yeS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9GYWN0b3J5LmNwcApAQCAtMjcsNyArMjcsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogUmV0dXJuPGJvb2w+IENyeXB0b0ZhY3Rvcnk6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKApAQCAtNjAsNyArNjAsNyBAQAogfQogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9QbHVnaW4uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9DcnlwdG9QbHVnaW4uY3BwCmluZGV4IGYzM2Y5NGUuLmYxNjRmMjggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvQ3J5cHRvUGx1Z2luLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0NyeXB0b1BsdWdpbi5jcHAKQEAgLTI3LDcgKzI3LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6QnVmZmVyVHlwZTsKQEAgLTQyLDEwICs0Miw0MCBAQAogICAgIHJldHVybiBWb2lkKCk7CiB9CiAKK1JldHVybjx2b2lkPiBDcnlwdG9QbHVnaW46OmRlY3J5cHQoCisgICAgYm9vbCBzZWN1cmUsCisgICAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCAxNj4mIGtleUlkLAorICAgIGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+JiBpdiwKKyAgICBNb2RlIG1vZGUsCisgICAgY29uc3QgUGF0dGVybiYgcGF0dGVybiwKKyAgICBjb25zdCBoaWRsX3ZlYzxTdWJTYW1wbGU+JiBzdWJTYW1wbGVzLAorICAgIGNvbnN0IFNoYXJlZEJ1ZmZlciYgc291cmNlLAorICAgIHVpbnQ2NF90IG9mZnNldCwKKyAgICBjb25zdCBEZXN0aW5hdGlvbkJ1ZmZlciYgZGVzdGluYXRpb24sCisgICAgZGVjcnlwdF9jYiBfaGlkbF9jYikgeworCisgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6OkVSUk9SX0RSTV9VTktOT1dOOworICBoaWRsX3N0cmluZyBkZXRhaWxlZEVycm9yOworICB1aW50MzJfdCBieXRlc1dyaXR0ZW4gPSAwOworCisgIFJldHVybjx2b2lkPiBoUmVzdWx0ID0gZGVjcnlwdF8xXzIoCisgICAgICBzZWN1cmUsIGtleUlkLCBpdiwgbW9kZSwgcGF0dGVybiwgc3ViU2FtcGxlcywgc291cmNlLCBvZmZzZXQsIGRlc3RpbmF0aW9uLAorICAgICAgWyZdKFN0YXR1c19WMV8yIGhTdGF0dXMsIHVpbnQzMl90IGhCeXRlc1dyaXR0ZW4sIGhpZGxfc3RyaW5nIGhEZXRhaWxlZEVycm9yKSB7CisgICAgICAgIHN0YXR1cyA9IHRvU3RhdHVzXzFfMChoU3RhdHVzKTsKKyAgICAgICAgYnl0ZXNXcml0dGVuID0gaEJ5dGVzV3JpdHRlbjsKKyAgICAgICAgZGV0YWlsZWRFcnJvciA9IGhEZXRhaWxlZEVycm9yOworICAgICAgfQorICAgICk7CisKKyAgc3RhdHVzID0gaFJlc3VsdC5pc09rKCkgPyBzdGF0dXMgOiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOworICBfaGlkbF9jYihzdGF0dXMsIGJ5dGVzV3JpdHRlbiwgZGV0YWlsZWRFcnJvcik7CisgIHJldHVybiBWb2lkKCk7Cit9CisKIC8vIFJldHVybnMgbmVnYXRpdmUgdmFsdWVzIGZvciBlcnJvciBjb2RlIGFuZCBwb3NpdGl2ZSB2YWx1ZXMgZm9yIHRoZSBzaXplIG9mCiAvLyBkZWNyeXB0ZWQgZGF0YS4gIEluIHRoZW9yeSwgdGhlIG91dHB1dCBzaXplIGNhbiBiZSBsYXJnZXIgdGhhbiB0aGUgaW5wdXQKIC8vIHNpemUsIGJ1dCBpbiBwcmFjdGljZSB0aGlzIHdpbGwgbmV2ZXIgaGFwcGVuIGZvciBBRVMtQ1RSLgotUmV0dXJuPHZvaWQ+IENyeXB0b1BsdWdpbjo6ZGVjcnlwdCgKK1JldHVybjx2b2lkPiBDcnlwdG9QbHVnaW46OmRlY3J5cHRfMV8yKAogICAgICAgICBib29sIHNlY3VyZSwKICAgICAgICAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCBLRVlfSURfU0laRT4mIGtleUlkLAogICAgICAgICBjb25zdCBoaWRsX2FycmF5PHVpbnQ4X3QsIEtFWV9JVl9TSVpFPiYgaXYsCkBAIC01NSwxNyArODUsMTcgQEAKICAgICAgICAgY29uc3QgU2hhcmVkQnVmZmVyJiBzb3VyY2UsCiAgICAgICAgIHVpbnQ2NF90IG9mZnNldCwKICAgICAgICAgY29uc3QgRGVzdGluYXRpb25CdWZmZXImIGRlc3RpbmF0aW9uLAotICAgICAgICBkZWNyeXB0X2NiIF9oaWRsX2NiKSB7CisgICAgICAgIGRlY3J5cHRfMV8yX2NiIF9oaWRsX2NiKSB7CiAgICAgVU5VU0VEKHBhdHRlcm4pOwogCiAgICAgaWYgKHNlY3VyZSkgewotICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAorICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCiAgICAgICAgICAgICAiU2VjdXJlIGRlY3J5cHRpb24gaXMgbm90IHN1cHBvcnRlZCB3aXRoIENsZWFyS2V5LiIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAogICAgIGlmIChtU2hhcmVkQnVmZmVyTWFwLmZpbmQoc291cmNlLmJ1ZmZlcklkKSA9PSBtU2hhcmVkQnVmZmVyTWFwLmVuZCgpKSB7Ci0gICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAorICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAogICAgICAgICAgICAgICAgInNvdXJjZSBkZWNyeXB0IGJ1ZmZlciBiYXNlIG5vdCBzZXQiKTsKICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQpAQCAtNzMsMjAgKzEwMywyNCBAQAogICAgIGlmIChkZXN0aW5hdGlvbi50eXBlID09IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlkpIHsKICAgICAgIGNvbnN0IFNoYXJlZEJ1ZmZlciYgZGVzdCA9IGRlc3RpbmF0aW9uLm5vbnNlY3VyZU1lbW9yeTsKICAgICAgIGlmIChtU2hhcmVkQnVmZmVyTWFwLmZpbmQoZGVzdC5idWZmZXJJZCkgPT0gbVNoYXJlZEJ1ZmZlck1hcC5lbmQoKSkgewotICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAorICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCiAgICAgICAgICAgICAgICAgICJkZXN0aW5hdGlvbiBkZWNyeXB0IGJ1ZmZlciBiYXNlIG5vdCBzZXQiKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsCisgICAgICAgICAgICAgICAgICJkZXN0aW5hdGlvbiB0eXBlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CiAKICAgICBzcDxJTWVtb3J5PiBzb3VyY2VCYXNlID0gbVNoYXJlZEJ1ZmZlck1hcFtzb3VyY2UuYnVmZmVySWRdOwogICAgIGlmIChzb3VyY2VCYXNlID09IG51bGxwdHIpIHsKLSAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgInNvdXJjZSBpcyBhIG51bGxwdHIiKTsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLCAic291cmNlIGlzIGEgbnVsbHB0ciIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAogICAgIGlmIChzb3VyY2Uub2Zmc2V0ICsgb2Zmc2V0ICsgc291cmNlLnNpemUgPiBzb3VyY2VCYXNlLT5nZXRTaXplKCkpIHsKLSAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgImludmFsaWQgYnVmZmVyIHNpemUiKTsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLCAiaW52YWxpZCBidWZmZXIgc2l6ZSIpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIApAQCAtOTQsNDEgKzEyOCw0OCBAQAogICAgICAgICAgICAgKHN0YXRpY19jYXN0PHZvaWQgKj4oc291cmNlQmFzZS0+Z2V0UG9pbnRlcigpKSk7CiAgICAgdWludDhfdCogc3JjUHRyID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPihiYXNlICsgc291cmNlLm9mZnNldCArIG9mZnNldCk7CiAgICAgdm9pZCogZGVzdFB0ciA9IE5VTEw7Ci0gICAgaWYgKGRlc3RpbmF0aW9uLnR5cGUgPT0gQnVmZmVyVHlwZTo6U0hBUkVEX01FTU9SWSkgewotICAgICAgICBjb25zdCBTaGFyZWRCdWZmZXImIGRlc3RCdWZmZXIgPSBkZXN0aW5hdGlvbi5ub25zZWN1cmVNZW1vcnk7Ci0gICAgICAgIHNwPElNZW1vcnk+IGRlc3RCYXNlID0gbVNoYXJlZEJ1ZmZlck1hcFtkZXN0QnVmZmVyLmJ1ZmZlcklkXTsKLSAgICAgICAgaWYgKGRlc3RCYXNlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIDAsICJkZXN0aW5hdGlvbiBpcyBhIG51bGxwdHIiKTsKLSAgICAgICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZGVzdEJ1ZmZlci5vZmZzZXQgKyBkZXN0QnVmZmVyLnNpemUgPiBkZXN0QmFzZS0+Z2V0U2l6ZSgpKSB7Ci0gICAgICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLCAiaW52YWxpZCBidWZmZXIgc2l6ZSIpOwotICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICAgICAgfQotICAgICAgICBkZXN0UHRyID0gc3RhdGljX2Nhc3Q8dm9pZCAqPihiYXNlICsgZGVzdGluYXRpb24ubm9uc2VjdXJlTWVtb3J5Lm9mZnNldCk7Ci0gICAgfSBlbHNlIGlmIChkZXN0aW5hdGlvbi50eXBlID09IEJ1ZmZlclR5cGU6Ok5BVElWRV9IQU5ETEUpIHsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPigKLSAgICAgICAgZGVzdGluYXRpb24uc2VjdXJlTWVtb3J5LmdldE5hdGl2ZUhhbmRsZSgpKTsKLSAgICAgICAgZGVzdFB0ciA9IHN0YXRpY19jYXN0PHZvaWQgKj4oaGFuZGxlKTsKKyAgICAvLyBkZXN0aW5hdGlvbi50eXBlID09IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlkKKyAgICBjb25zdCBTaGFyZWRCdWZmZXImIGRlc3RCdWZmZXIgPSBkZXN0aW5hdGlvbi5ub25zZWN1cmVNZW1vcnk7CisgICAgc3A8SU1lbW9yeT4gZGVzdEJhc2UgPSBtU2hhcmVkQnVmZmVyTWFwW2Rlc3RCdWZmZXIuYnVmZmVySWRdOworICAgIGlmIChkZXN0QmFzZSA9PSBudWxscHRyKSB7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwgImRlc3RpbmF0aW9uIGlzIGEgbnVsbHB0ciIpOworICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAorICAgIGlmIChkZXN0QnVmZmVyLm9mZnNldCArIGRlc3RCdWZmZXIuc2l6ZSA+IGRlc3RCYXNlLT5nZXRTaXplKCkpIHsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0UsIDAsICJpbnZhbGlkIGJ1ZmZlciBzaXplIik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIGRlc3RQdHIgPSBzdGF0aWNfY2FzdDx2b2lkICo+KGJhc2UgKyBkZXN0aW5hdGlvbi5ub25zZWN1cmVNZW1vcnkub2Zmc2V0KTsKKworCiAgICAgLy8gQ2FsY3VsYXRlIHRoZSBvdXRwdXQgYnVmZmVyIHNpemUgYW5kIGRldGVybWluZSBpZiBhbnkgc3Vic2FtcGxlcyBhcmUKICAgICAvLyBlbmNyeXB0ZWQuCiAgICAgc2l6ZV90IGRlc3RTaXplID0gMDsKICAgICBib29sIGhhdmVFbmNyeXB0ZWRTdWJzYW1wbGVzID0gZmFsc2U7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzdWJTYW1wbGVzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IFN1YlNhbXBsZSAmc3ViU2FtcGxlID0gc3ViU2FtcGxlc1tpXTsKLSAgICAgICAgZGVzdFNpemUgKz0gc3ViU2FtcGxlLm51bUJ5dGVzT2ZDbGVhckRhdGE7Ci0gICAgICAgIGRlc3RTaXplICs9IHN1YlNhbXBsZS5udW1CeXRlc09mRW5jcnlwdGVkRGF0YTsKKyAgICAgICAgaWYgKF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coZGVzdFNpemUsIHN1YlNhbXBsZS5udW1CeXRlc09mQ2xlYXJEYXRhLCAmZGVzdFNpemUpKSB7CisgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRSwgMCwgInN1YnNhbXBsZSBjbGVhciBzaXplIG92ZXJmbG93Iik7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KGRlc3RTaXplLCBzdWJTYW1wbGUubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEsICZkZXN0U2l6ZSkpIHsKKyAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fRlJBTUVfVE9PX0xBUkdFLCAwLCAic3Vic2FtcGxlIGVuY3J5cHRlZCBzaXplIG92ZXJmbG93Iik7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CiAgICAgICAgIGlmIChzdWJTYW1wbGUubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgPiAwKSB7CiAgICAgICAgIGhhdmVFbmNyeXB0ZWRTdWJzYW1wbGVzID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KIAorICAgIGlmIChkZXN0U2l6ZSA+IGRlc3RCdWZmZXIuc2l6ZSkgeworICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRSwgMCwgInN1YnNhbXBsZSBzdW0gdG9vIGxhcmdlIik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCiAgICAgaWYgKG1vZGUgPT0gTW9kZTo6VU5FTkNSWVBURUQpIHsKICAgICAgICAgaWYgKGhhdmVFbmNyeXB0ZWRTdWJzYW1wbGVzKSB7Ci0gICAgICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAorICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAogICAgICAgICAgICAgICAgICAgICAiRW5jcnlwdGVkIHN1YnNhbXBsZXMgZm91bmQgaW4gYWxsZWdlZGx5IHVuZW5jcnlwdGVkIGRhdGEuIik7CiAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgICAgICB9CkBAIC0xNDQsMjIgKzE4NSwyMSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKLSAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgc3RhdGljX2Nhc3Q8c3NpemVfdD4ob2Zmc2V0KSwgIiIpOworICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6T0ssIHN0YXRpY19jYXN0PHNzaXplX3Q+KG9mZnNldCksICIiKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9IGVsc2UgaWYgKG1vZGUgPT0gTW9kZTo6QUVTX0NUUikgewogICAgICAgICBzaXplX3QgYnl0ZXNEZWNyeXB0ZWQ7Ci0gICAgICAgIFN0YXR1cyByZXMgPSBtU2Vzc2lvbi0+ZGVjcnlwdChrZXlJZC5kYXRhKCksIGl2LmRhdGEoKSwgc3JjUHRyLAorICAgICAgICBTdGF0dXNfVjFfMiByZXMgPSBtU2Vzc2lvbi0+ZGVjcnlwdChrZXlJZC5kYXRhKCksIGl2LmRhdGEoKSwgc3JjUHRyLAogICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ4X3QqPihkZXN0UHRyKSwgdG9WZWN0b3Ioc3ViU2FtcGxlcyksICZieXRlc0RlY3J5cHRlZCk7Ci0gICAgICAgIGlmIChyZXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgc3RhdGljX2Nhc3Q8c3NpemVfdD4oYnl0ZXNEZWNyeXB0ZWQpLCAiIik7CisgICAgICAgIGlmIChyZXMgPT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6T0ssIHN0YXRpY19jYXN0PHNzaXplX3Q+KGJ5dGVzRGVjcnlwdGVkKSwgIiIpOwogICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0RFQ1JZUFQsIHN0YXRpY19jYXN0PHNzaXplX3Q+KHJlcyksCi0gICAgICAgICAgICAgICAgICAgICJEZWNyeXB0aW9uIEVycm9yIik7CisgICAgICAgICAgICBfaGlkbF9jYihyZXMsIDAsICJEZWNyeXB0aW9uIEVycm9yIik7CiAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSwgMCwKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFLCAwLAogICAgICAgICAgICAgICAgICJTZWxlY3RlZCBlbmNyeXB0aW9uIG1vZGUgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgQ2xlYXJLZXkgRFJNIFBsdWdpbi4iKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CkBAIC0xNzksNyArMjE5LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRGV2aWNlRmlsZXMuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9EZXZpY2VGaWxlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxNWI2ZgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRGV2aWNlRmlsZXMuY3BwCkBAIC0wLDAgKzEsMjUyIEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIGZpbGUgYW5kIHByb3ByaWV0YXJ5CisvLyBzb3VyY2UgY29kZSBtYXkgb25seSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgV2lkZXZpbmUgTWFzdGVyCisvLyBMaWNlbnNlIEFncmVlbWVudC4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlICJEZXZpY2VGaWxlcy5oIgorI2luY2x1ZGUgIlV0aWxzLmgiCisKKyNpbmNsdWRlIDxvcGVuc3NsL3NoYS5oPgorCisvLyBQcm90b2J1ZiBnZW5lcmF0ZWQgY2xhc3Nlcy4KK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpPZmZsaW5lRmlsZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpIYXNoZWRGaWxlOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6OkxpY2Vuc2U7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6TGljZW5zZV9MaWNlbnNlU3RhdGVfQUNUSVZFOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6OkxpY2Vuc2VfTGljZW5zZVN0YXRlX1JFTEVBU0lORzsKKworbmFtZXNwYWNlIHsKK2NvbnN0IGNoYXIga0xpY2Vuc2VGaWxlTmFtZUV4dFtdID0gIi5saWMiOworCitib29sIEhhc2goY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGEsIHN0ZDo6c3RyaW5nKiBoYXNoKSB7CisgICAgaWYgKCFoYXNoKSByZXR1cm4gZmFsc2U7CisKKyAgICBoYXNoLT5yZXNpemUoU0hBMjU2X0RJR0VTVF9MRU5HVEgpOworCisgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW5wdXQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihkYXRhLmRhdGEoKSk7CisgICAgdW5zaWduZWQgY2hhciogb3V0cHV0ID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCBjaGFyKj4oJigqaGFzaClbMF0pOworICAgIFNIQTI1NihpbnB1dCwgZGF0YS5zaXplKCksIG91dHB1dCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCitib29sIERldmljZUZpbGVzOjpTdG9yZUxpY2Vuc2UoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlTZXRJZCwgTGljZW5zZVN0YXRlIHN0YXRlLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGljZW5zZVJlc3BvbnNlKSB7CisKKyAgICBPZmZsaW5lRmlsZSBmaWxlOworICAgIGZpbGUuc2V0X3R5cGUoT2ZmbGluZUZpbGU6OkxJQ0VOU0UpOworICAgIGZpbGUuc2V0X3ZlcnNpb24oT2ZmbGluZUZpbGU6OlZFUlNJT05fMSk7CisKKyAgICBMaWNlbnNlKiBsaWNlbnNlID0gZmlsZS5tdXRhYmxlX2xpY2Vuc2UoKTsKKyAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIGNhc2Uga0xpY2Vuc2VTdGF0ZUFjdGl2ZToKKyAgICAgICAgICAgIGxpY2Vuc2UtPnNldF9zdGF0ZShMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9BQ1RJVkUpOworICAgICAgICAgICAgbGljZW5zZS0+c2V0X2xpY2Vuc2UobGljZW5zZVJlc3BvbnNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGtMaWNlbnNlU3RhdGVSZWxlYXNpbmc6CisgICAgICAgICAgICBsaWNlbnNlLT5zZXRfc3RhdGUoTGljZW5zZV9MaWNlbnNlU3RhdGVfUkVMRUFTSU5HKTsKKyAgICAgICAgICAgIGxpY2Vuc2UtPnNldF9saWNlbnNlKGxpY2Vuc2VSZXNwb25zZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJTdG9yZUxpY2Vuc2U6IFVua25vd24gbGljZW5zZSBzdGF0ZTogJXUiLCBzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZEZpbGU7CisgICAgZmlsZS5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZEZpbGUpOworCisgICAgcmV0dXJuIFN0b3JlRmlsZVdpdGhIYXNoKGtleVNldElkICsga0xpY2Vuc2VGaWxlTmFtZUV4dCwgc2VyaWFsaXplZEZpbGUpOworfQorCitib29sIERldmljZUZpbGVzOjpTdG9yZUZpbGVXaXRoSGFzaChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJpYWxpemVkRmlsZSkgeworICAgIHN0ZDo6c3RyaW5nIGhhc2g7CisgICAgaWYgKCFIYXNoKHNlcmlhbGl6ZWRGaWxlLCAmaGFzaCkpIHsKKyAgICAgICAgQUxPR0UoIlN0b3JlRmlsZVdpdGhIYXNoOiBGYWlsZWQgdG8gY29tcHV0ZSBoYXNoIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBIYXNoZWRGaWxlIGhhc2hGaWxlOworICAgIGhhc2hGaWxlLnNldF9maWxlKHNlcmlhbGl6ZWRGaWxlKTsKKyAgICBoYXNoRmlsZS5zZXRfaGFzaChoYXNoKTsKKworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWRIYXNoRmlsZTsKKyAgICBoYXNoRmlsZS5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZEhhc2hGaWxlKTsKKworICAgIHJldHVybiBTdG9yZUZpbGVSYXcoZmlsZU5hbWUsIHNlcmlhbGl6ZWRIYXNoRmlsZSk7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlN0b3JlRmlsZVJhdyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXJpYWxpemVkSGFzaEZpbGUpIHsKKyAgICBNZW1vcnlGaWxlU3lzdGVtOjpNZW1vcnlGaWxlIG1lbUZpbGU7CisgICAgbWVtRmlsZS5zZXRGaWxlTmFtZShmaWxlTmFtZSk7CisgICAgbWVtRmlsZS5zZXRDb250ZW50KHNlcmlhbGl6ZWRIYXNoRmlsZSk7CisgICAgbWVtRmlsZS5zZXRGaWxlU2l6ZShzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpKTsKKyAgICBzaXplX3QgbGVuID0gbUZpbGVIYW5kbGUuV3JpdGUoZmlsZU5hbWUsIG1lbUZpbGUpOworCisgICAgaWYgKGxlbiAhPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHNlcmlhbGl6ZWRIYXNoRmlsZS5zaXplKCkpKSB7CisgICAgICAgIEFMT0dFKCJTdG9yZUZpbGVSYXc6IEZhaWxlZCB0byB3cml0ZSAlcyIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICBBTE9HRCgiU3RvcmVGaWxlUmF3OiBleHBlY3RlZD0lemQsIGFjdHVhbD0lenUiLCBzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpLCBsZW4pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR0QoIlN0b3JlRmlsZVJhdzogd3JvdGUgJXp1IGJ5dGVzIHRvICVzIiwgc2VyaWFsaXplZEhhc2hGaWxlLnNpemUoKSwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlJldHJpZXZlTGljZW5zZSgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQsIExpY2Vuc2VTdGF0ZSogc3RhdGUsIHN0ZDo6c3RyaW5nKiBvZmZsaW5lTGljZW5zZSkgeworCisgICAgT2ZmbGluZUZpbGUgZmlsZTsKKyAgICBpZiAoIVJldHJpZXZlSGFzaGVkRmlsZShrZXlTZXRJZCArIGtMaWNlbnNlRmlsZU5hbWVFeHQsICZmaWxlKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGZpbGUudHlwZSgpICE9IE9mZmxpbmVGaWxlOjpMSUNFTlNFKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUxpY2Vuc2U6IEludmFsaWQgZmlsZSB0eXBlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZmlsZS52ZXJzaW9uKCkgIT0gT2ZmbGluZUZpbGU6OlZFUlNJT05fMSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVMaWNlbnNlOiBJbnZhbGlkIGZpbGUgdmVyc2lvbiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFmaWxlLmhhc19saWNlbnNlKCkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlTGljZW5zZTogTGljZW5zZSBub3QgcHJlc2VudCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgTGljZW5zZSBsaWNlbnNlID0gZmlsZS5saWNlbnNlKCk7CisgICAgc3dpdGNoIChsaWNlbnNlLnN0YXRlKCkpIHsKKyAgICAgICAgY2FzZSBMaWNlbnNlX0xpY2Vuc2VTdGF0ZV9BQ1RJVkU6CisgICAgICAgICAgICAqc3RhdGUgPSBrTGljZW5zZVN0YXRlQWN0aXZlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTGljZW5zZV9MaWNlbnNlU3RhdGVfUkVMRUFTSU5HOgorICAgICAgICAgICAgKnN0YXRlID0ga0xpY2Vuc2VTdGF0ZVJlbGVhc2luZzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR1coIlJldHJpZXZlTGljZW5zZTogVW5yZWNvZ25pemVkIGxpY2Vuc2Ugc3RhdGU6ICV1IiwKKyAgICAgICAgICAgICAgICAgICAga0xpY2Vuc2VTdGF0ZVVua25vd24pOworICAgICAgICAgICAgKnN0YXRlID0ga0xpY2Vuc2VTdGF0ZVVua25vd247CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgKm9mZmxpbmVMaWNlbnNlID0gbGljZW5zZS5saWNlbnNlKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OkRlbGV0ZUxpY2Vuc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkKSB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLlJlbW92ZUZpbGUoa2V5U2V0SWQgKyBrTGljZW5zZUZpbGVOYW1lRXh0KTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6RGVsZXRlQWxsTGljZW5zZXMoKSB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLlJlbW92ZUFsbEZpbGVzKCk7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OkxpY2Vuc2VFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGtleVNldElkKSB7CisgICAgcmV0dXJuIG1GaWxlSGFuZGxlLkZpbGVFeGlzdHMoa2V5U2V0SWQgKyBrTGljZW5zZUZpbGVOYW1lRXh0KTsKK30KKworc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IERldmljZUZpbGVzOjpMaXN0TGljZW5zZXMoKSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGxpY2Vuc2VzID0gbUZpbGVIYW5kbGUuTGlzdEZpbGVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaWNlbnNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBzdGQ6OnN0cmluZyYgbGljZW5zZSA9IGxpY2Vuc2VzW2ldOworICAgICAgICBsaWNlbnNlID0gbGljZW5zZS5zdWJzdHIoMCwgbGljZW5zZS5zaXplKCkgLSBzdHJsZW4oa0xpY2Vuc2VGaWxlTmFtZUV4dCkpOworICAgIH0KKyAgICByZXR1cm4gbGljZW5zZXM7Cit9CisKK2Jvb2wgRGV2aWNlRmlsZXM6OlJldHJpZXZlSGFzaGVkRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUsIE9mZmxpbmVGaWxlKiBkZVNlcmlhbGl6ZWRGaWxlKSB7CisgICAgaWYgKCFkZVNlcmlhbGl6ZWRGaWxlKSB7CisgICAgICAgIEFMT0dFKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IGludmFsaWQgZmlsZSBwYXJhbWV0ZXIiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICghRmlsZUV4aXN0cyhmaWxlTmFtZSkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogJXMgZG9lcyBub3QgZXhpc3QiLCBmaWxlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNzaXplX3QgYnl0ZXMgPSBHZXRGaWxlU2l6ZShmaWxlTmFtZSk7CisgICAgaWYgKGJ5dGVzIDw9IDApIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogaW52YWxpZCBmaWxlIHNpemU6ICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIC8vIFJlbW92ZSB0aGUgY29ycnVwdGVkIGZpbGUgc28gdGhlIGNhbGxlciB3aWxsIG5vdCBnZXQgdGhlIHNhbWUgZXJyb3IKKyAgICAgICAgLy8gd2hlbiB0cnlpbmcgdG8gYWNjZXNzIHRoZSBmaWxlIHJlcGVhdGVkbHksIGNhdXNpbmcgdGhlIHN5c3RlbSB0byBzdGFsbC4KKyAgICAgICAgUmVtb3ZlRmlsZShmaWxlTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBzZXJpYWxpemVkSGFzaEZpbGU7CisgICAgc2VyaWFsaXplZEhhc2hGaWxlLnJlc2l6ZShieXRlcyk7CisgICAgYnl0ZXMgPSBtRmlsZUhhbmRsZS5SZWFkKGZpbGVOYW1lLCAmc2VyaWFsaXplZEhhc2hGaWxlKTsKKworICAgIGlmIChieXRlcyAhPSBzdGF0aWNfY2FzdDxzc2l6ZV90PihzZXJpYWxpemVkSGFzaEZpbGUuc2l6ZSgpKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBGYWlsZWQgdG8gcmVhZCBmcm9tICVzIiwgZmlsZU5hbWUuY19zdHIoKSk7CisgICAgICAgIEFMT0dWKCJSZXRyaWV2ZUhhc2hlZEZpbGU6IGV4cGVjdGVkOiAlemQsIGFjdHVhbDogJXpkIiwgc2VyaWFsaXplZEhhc2hGaWxlLnNpemUoKSwgYnl0ZXMpOworICAgICAgICAvLyBSZW1vdmUgdGhlIGNvcnJ1cHRlZCBmaWxlIHNvIHRoZSBjYWxsZXIgd2lsbCBub3QgZ2V0IHRoZSBzYW1lIGVycm9yCisgICAgICAgIC8vIHdoZW4gdHJ5aW5nIHRvIGFjY2VzcyB0aGUgZmlsZSByZXBlYXRlZGx5LCBjYXVzaW5nIHRoZSBzeXN0ZW0gdG8gc3RhbGwuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR1YoIlJldHJpZXZlSGFzaGVkRmlsZTogcmVhZCAlemQgZnJvbSAlcyIsIGJ5dGVzLCBmaWxlTmFtZS5jX3N0cigpKTsKKworICAgIEhhc2hlZEZpbGUgaGFzaEZpbGU7CisgICAgaWYgKCFoYXNoRmlsZS5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZEhhc2hGaWxlKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBVbmFibGUgdG8gcGFyc2UgaGFzaCBmaWxlIik7CisgICAgICAgIC8vIFJlbW92ZSBjb3JydXB0IGZpbGUuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgaGFzaDsKKyAgICBpZiAoIUhhc2goaGFzaEZpbGUuZmlsZSgpLCAmaGFzaCkpIHsKKyAgICAgICAgQUxPR0UoIlJldHJpZXZlSGFzaGVkRmlsZTogSGFzaCBjb21wdXRhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChoYXNoICE9IGhhc2hGaWxlLmhhc2goKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBIYXNoIG1pc21hdGNoIik7CisgICAgICAgIC8vIFJlbW92ZSBjb3JydXB0IGZpbGUuCisgICAgICAgIFJlbW92ZUZpbGUoZmlsZU5hbWUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFkZVNlcmlhbGl6ZWRGaWxlLT5QYXJzZUZyb21TdHJpbmcoaGFzaEZpbGUuZmlsZSgpKSkgeworICAgICAgICBBTE9HRSgiUmV0cmlldmVIYXNoZWRGaWxlOiBVbmFibGUgdG8gcGFyc2UgZmlsZSIpOworICAgICAgICAvLyBSZW1vdmUgY29ycnVwdCBmaWxlLgorICAgICAgICBSZW1vdmVGaWxlKGZpbGVOYW1lKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIERldmljZUZpbGVzOjpGaWxlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3QgeworICAgIHJldHVybiBtRmlsZUhhbmRsZS5GaWxlRXhpc3RzKGZpbGVOYW1lKTsKK30KKworYm9vbCBEZXZpY2VGaWxlczo6UmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIHsKKyAgICByZXR1cm4gbUZpbGVIYW5kbGUuUmVtb3ZlRmlsZShmaWxlTmFtZSk7Cit9CisKK3NzaXplX3QgRGV2aWNlRmlsZXM6OkdldEZpbGVTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3QgeworICAgIHJldHVybiBtRmlsZUhhbmRsZS5HZXRGaWxlU2l6ZShmaWxlTmFtZSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8yCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybUZhY3RvcnkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1GYWN0b3J5LmNwcAppbmRleCA3NzU1N2Y5Li45ZmI1YmJlIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybUZhY3RvcnkuY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtRmFjdG9yeS5jcHAKQEAgLTMwLDEwICszMCwxMSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OlNlY3VyaXR5TGV2ZWw7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwogCiBSZXR1cm48Ym9vbD4gRHJtRmFjdG9yeTo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoCkBAIC00MSw2ICs0MiwxMyBAQAogICAgIHJldHVybiBjbGVhcmtleWRybTo6aXNDbGVhcktleVVVSUQodXVpZC5kYXRhKCkpOwogfQogCitSZXR1cm48Ym9vbD4gRHJtRmFjdG9yeTo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWRfMV8yKGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+JiB1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyAmbWltZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3VyaXR5TGV2ZWwgbGV2ZWwpIHsKKyAgICByZXR1cm4gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCkgJiYgaXNDb250ZW50VHlwZVN1cHBvcnRlZChtaW1lVHlwZSkgJiYKKyAgICAgICAgICAgIGxldmVsID09IFNlY3VyaXR5TGV2ZWw6OlNXX1NFQ1VSRV9DUllQVE87Cit9CisKIFJldHVybjxib29sPiBEcm1GYWN0b3J5Ojppc0NvbnRlbnRUeXBlU3VwcG9ydGVkKGNvbnN0IGhpZGxfc3RyaW5nICZtaW1lVHlwZSkgewogICAgIC8vIFRoaXMgc2hvdWxkIG1hdGNoIHRoZSBtaW1lVHlwZXMgaGFuZGVkIGJ5IEluaXREYXRhUGFyc2VyLgogICAgIHJldHVybiBtaW1lVHlwZSA9PSBrSXNvQm1mZlZpZGVvTWltZVR5cGUgfHwKQEAgLTcxLDcgKzc5LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtUGx1Z2luLmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvRHJtUGx1Z2luLmNwcAppbmRleCAzYjYxMDg1Li5kNzRiYzUzIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0RybVBsdWdpbi5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Ecm1QbHVnaW4uY3BwCkBAIC0yNSwxMSArMjUsMTUgQEAKICNpbmNsdWRlICJDbGVhcktleURybVByb3BlcnRpZXMuaCIKICNpbmNsdWRlICJTZXNzaW9uLmgiCiAjaW5jbHVkZSAiVHlwZUNvbnZlcnQuaCIKKyNpbmNsdWRlICJVdGlscy5oIgogCiBuYW1lc3BhY2UgeworY29uc3Qgc3RkOjpzdHJpbmcga0tleVNldElkUHJlZml4KCJja2lkIik7Citjb25zdCBpbnQga0tleVNldElkTGVuZ3RoID0gMTY7CiBjb25zdCBpbnQga1NlY3VyZVN0b3BJZFN0YXJ0ID0gMTAwOworY29uc3Qgc3RkOjpzdHJpbmcga09mZmxpbmVMaWNlbnNlKCJcInR5cGVcIjpcInBlcnNpc3RlbnQtbGljZW5zZVwiIik7CiBjb25zdCBzdGQ6OnN0cmluZyBrU3RyZWFtaW5nKCJTdHJlYW1pbmciKTsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtPZmZsaW5lKCJPZmZsaW5lIik7Citjb25zdCBzdGQ6OnN0cmluZyBrVGVtcG9yYXJ5TGljZW5zZSgiXCJ0eXBlXCI6XCJ0ZW1wb3JhcnlcIiIpOwogY29uc3Qgc3RkOjpzdHJpbmcga1RydWUoIlRydWUiKTsKIAogY29uc3Qgc3RkOjpzdHJpbmcga1F1ZXJ5S2V5TGljZW5zZVR5cGUoIkxpY2Vuc2VUeXBlIik7CkBAIC01NCwxOCArNTgsMzEgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKK0tleVJlcXVlc3RUeXBlIHRvS2V5UmVxdWVzdFR5cGVfVjFfMChLZXlSZXF1ZXN0VHlwZV9WMV8xIGtleVJlcXVlc3RUeXBlKSB7CisgIHN3aXRjaCAoa2V5UmVxdWVzdFR5cGUpIHsKKyAgICBjYXNlIEtleVJlcXVlc3RUeXBlX1YxXzE6Ok5PTkU6CisgICAgY2FzZSBLZXlSZXF1ZXN0VHlwZV9WMV8xOjpVUERBVEU6CisgICAgICByZXR1cm4gS2V5UmVxdWVzdFR5cGU6OlVOS05PV047CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxLZXlSZXF1ZXN0VHlwZT4oa2V5UmVxdWVzdFR5cGUpOworICB9Cit9CisKIERybVBsdWdpbjo6RHJtUGx1Z2luKFNlc3Npb25MaWJyYXJ5KiBzZXNzaW9uTGlicmFyeSkKICAgICAgICAgOiBtU2Vzc2lvbkxpYnJhcnkoc2Vzc2lvbkxpYnJhcnkpLAogICAgICAgICAgIG1PcGVuU2Vzc2lvbk9rQ291bnQoMCksCiAgICAgICAgICAgbUNsb3NlU2Vzc2lvbk9rQ291bnQoMCksCiAgICAgICAgICAgbUNsb3NlU2Vzc2lvbk5vdE9wZW5lZENvdW50KDApLAotICAgICAgICAgIG1OZXh0U2VjdXJlU3RvcElkKGtTZWN1cmVTdG9wSWRTdGFydCkgeworICAgICAgICAgIG1OZXh0U2VjdXJlU3RvcElkKGtTZWN1cmVTdG9wSWRTdGFydCksCisgICAgICAgICAgbU1vY2tFcnJvcihTdGF0dXNfVjFfMjo6T0spIHsKICAgICBtUGxheVBvbGljeS5jbGVhcigpOwogICAgIGluaXRQcm9wZXJ0aWVzKCk7CiAgICAgbVNlY3VyZVN0b3BzLmNsZWFyKCk7CisgICAgbVJlbGVhc2VLZXlzTWFwLmNsZWFyKCk7CisgICAgc3RkOjpzcmFuZChzdGQ6OnRpbWUobnVsbHB0cikpOwogfQogCiB2b2lkIERybVBsdWdpbjo6aW5pdFByb3BlcnRpZXMoKSB7CkBAIC03NSw2ICs5Miw3IEBACiAgICAgbVN0cmluZ1Byb3BlcnRpZXNba1BsdWdpbkRlc2NyaXB0aW9uS2V5XSA9IGtQbHVnaW5EZXNjcmlwdGlvblZhbHVlOwogICAgIG1TdHJpbmdQcm9wZXJ0aWVzW2tBbGdvcml0aG1zS2V5XSA9IGtBbGdvcml0aG1zVmFsdWU7CiAgICAgbVN0cmluZ1Byb3BlcnRpZXNba0xpc3RlbmVyVGVzdFN1cHBvcnRLZXldID0ga0xpc3RlbmVyVGVzdFN1cHBvcnRWYWx1ZTsKKyAgICBtU3RyaW5nUHJvcGVydGllc1trRHJtRXJyb3JUZXN0S2V5XSA9IGtEcm1FcnJvclRlc3RWYWx1ZTsKIAogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZhbHVlVmVjdG9yOwogICAgIHZhbHVlVmVjdG9yLmNsZWFyKCk7CkBAIC0xMDMsNiArMTIxLDcgQEAKIAogUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6b3BlblNlc3Npb24ob3BlblNlc3Npb25fY2IgX2hpZGxfY2IpIHsKICAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5jcmVhdGVTZXNzaW9uKCk7CisgICAgcHJvY2Vzc01vY2tFcnJvcihzZXNzaW9uKTsKICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQgPSBzZXNzaW9uLT5zZXNzaW9uSWQoKTsKIAogICAgIFN0YXR1cyBzdGF0dXMgPSBzZXRTZWN1cml0eUxldmVsKHNlc3Npb25JZCwgU2VjdXJpdHlMZXZlbDo6U1dfU0VDVVJFX0NSWVBUTyk7CkBAIC0xMTQsNiArMTMzLDcgQEAKIFJldHVybjx2b2lkPiBEcm1QbHVnaW46Om9wZW5TZXNzaW9uXzFfMShTZWN1cml0eUxldmVsIHNlY3VyaXR5TGV2ZWwsCiAgICAgICAgIG9wZW5TZXNzaW9uXzFfMV9jYiBfaGlkbF9jYikgewogICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmNyZWF0ZVNlc3Npb24oKTsKKyAgICBwcm9jZXNzTW9ja0Vycm9yKHNlc3Npb24pOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZCA9IHNlc3Npb24tPnNlc3Npb25JZCgpOwogCiAgICAgU3RhdHVzIHN0YXR1cyA9IHNldFNlY3VyaXR5TGV2ZWwoc2Vzc2lvbklkLCBzZWN1cml0eUxldmVsKTsKQEAgLTEyOSw2ICsxNDksMTAgQEAKIAogICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHRvVmVjdG9yKHNlc3Npb25JZCkpOwogICAgIGlmIChzZXNzaW9uLmdldCgpKSB7CisgICAgICAgIGlmIChzZXNzaW9uLT5nZXRNb2NrRXJyb3IoKSAhPSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgICAgIHNlbmRTZXNzaW9uTG9zdFN0YXRlKHNlc3Npb25JZCk7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fSU5WQUxJRF9TVEFURTsKKyAgICAgICAgfQogICAgICAgICBtQ2xvc2VTZXNzaW9uT2tDb3VudCsrOwogICAgICAgICBtU2Vzc2lvbkxpYnJhcnktPmRlc3Ryb3lTZXNzaW9uKHNlc3Npb24pOwogICAgICAgICByZXR1cm4gU3RhdHVzOjpPSzsKQEAgLTEzNywzNSArMTYxLDc1IEBACiAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX1NFU1NJT05fTk9UX09QRU5FRDsKIH0KIAotU3RhdHVzIERybVBsdWdpbjo6Z2V0S2V5UmVxdWVzdENvbW1vbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCitTdGF0dXNfVjFfMiBEcm1QbHVnaW46OmdldEtleVJlcXVlc3RDb21tb24oY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5pdERhdGEsCiAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBtaW1lVHlwZSwKICAgICAgICAgS2V5VHlwZSBrZXlUeXBlLAogICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gKnJlcXVlc3QsCi0gICAgICAgIEtleVJlcXVlc3RUeXBlICprZXlSZXF1ZXN0VHlwZSwKKyAgICAgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSAqa2V5UmVxdWVzdFR5cGUsCiAgICAgICAgIHN0ZDo6c3RyaW5nICpkZWZhdWx0VXJsKSB7CiAgICAgICAgIFVOVVNFRChvcHRpb25hbFBhcmFtZXRlcnMpOwogCisgICAgLy8gR2V0S2V5UmVxdWVzdE9mZmxpbmVLZXlUeXBlTm90U3VwcG9ydGVkKCkgaW4gdnRzIDEuMCBhbmQgMS4xIGV4cGVjdHMKKyAgICAvLyBLZXlUeXBlOjpPRkZMSU5FIHRvIHJldHVybiBFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRSBpbiBjbGVhcmtleSBwbHVnaW4uCisgICAgLy8gVGhvc2UgdGVzdHMgcGFzcyBpbiBhbiBlbXB0eSBpbml0RGF0YSwgd2UgdXNlIHRoZSBlbXB0eSBpbml0RGF0YSB0bworICAgIC8vIHNpZ25hbCBzdWNoIHNwZWNpZmljIHVzZSBjYXNlLgorICAgIGlmIChrZXlUeXBlID09IEtleVR5cGU6Ok9GRkxJTkUgJiYgMCA9PSBpbml0RGF0YS5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICB9CisKICAgICAqZGVmYXVsdFVybCA9ICIiOwotICAgICprZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpVTktOT1dOOworICAgICprZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlX1YxXzE6OlVOS05PV047CiAgICAgKnJlcXVlc3QgPSBzdGQ6OnZlY3Rvcjx1aW50OF90PigpOwogCi0gICAgaWYgKHNjb3BlLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OkJBRF9WQUxVRTsKKyAgICBpZiAoc2NvcGUuc2l6ZSgpID09IDAgfHwKKyAgICAgICAgICAgIChrZXlUeXBlICE9IEtleVR5cGU6OlNUUkVBTUlORyAmJgorICAgICAgICAgICAga2V5VHlwZSAhPSBLZXlUeXBlOjpPRkZMSU5FICYmCisgICAgICAgICAgICBrZXlUeXBlICE9IEtleVR5cGU6OlJFTEVBU0UpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXNfVjFfMjo6QkFEX1ZBTFVFOwogICAgIH0KIAotICAgIGlmIChrZXlUeXBlICE9IEtleVR5cGU6OlNUUkVBTUlORykgewotICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fQ0FOTk9UX0hBTkRMRTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzY29wZUlkID0gdG9WZWN0b3Ioc2NvcGUpOworICAgIHNwPFNlc3Npb24+IHNlc3Npb247CisgICAgaWYgKGtleVR5cGUgPT0gS2V5VHlwZTo6U1RSRUFNSU5HIHx8IGtleVR5cGUgPT0gS2V5VHlwZTo6T0ZGTElORSkgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQoc2NvcGVJZC5iZWdpbigpLCBzY29wZUlkLmVuZCgpKTsKKyAgICAgICAgc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+ZmluZFNlc3Npb24oc2Vzc2lvbklkKTsKKyAgICAgICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7CisgICAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvbi0+Z2V0TW9ja0Vycm9yKCkgIT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgICAgICByZXR1cm4gc2Vzc2lvbi0+Z2V0TW9ja0Vycm9yKCk7CisgICAgICAgIH0KKworICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZV9WMV8xOjpJTklUSUFMOwogICAgIH0KIAotICAgIHNwPFNlc3Npb24+IHNlc3Npb24gPSBtU2Vzc2lvbkxpYnJhcnktPmZpbmRTZXNzaW9uKHRvVmVjdG9yKHNjb3BlKSk7Ci0gICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQ7Ci0gICAgfQorICAgIFN0YXR1c19WMV8yIHN0YXR1cyA9IHN0YXRpY19jYXN0PFN0YXR1c19WMV8yPigKKyAgICAgICAgICAgIHNlc3Npb24tPmdldEtleVJlcXVlc3QoaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLCByZXF1ZXN0KSk7CiAKLSAgICBTdGF0dXMgc3RhdHVzID0gc2Vzc2lvbi0+Z2V0S2V5UmVxdWVzdChpbml0RGF0YSwgbWltZVR5cGUsIHJlcXVlc3QpOwotICAgICprZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpJTklUSUFMOworICAgIGlmIChrZXlUeXBlID09IEtleVR5cGU6OlJFTEVBU0UpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5U2V0SWQoc2NvcGVJZC5iZWdpbigpLCBzY29wZUlkLmVuZCgpKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcmVxdWVzdFN0cmluZyhyZXF1ZXN0LT5iZWdpbigpLCByZXF1ZXN0LT5lbmQoKSk7CisgICAgICAgIGlmIChyZXF1ZXN0U3RyaW5nLmZpbmQoa09mZmxpbmVMaWNlbnNlKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZW1wdHlSZXNwb25zZTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGtleVNldElkU3RyaW5nKGtleVNldElkLmJlZ2luKCksIGtleVNldElkLmVuZCgpKTsKKyAgICAgICAgICAgIGlmICghbUZpbGVIYW5kbGUuU3RvcmVMaWNlbnNlKGtleVNldElkU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVJlbGVhc2luZywKKyAgICAgICAgICAgICAgICAgICAgZW1wdHlSZXNwb25zZSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiUHJvYmxlbSByZWxlYXNpbmcgb2ZmbGluZSBsaWNlbnNlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fVU5LTk9XTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUmVsZWFzZUtleXNNYXAuZmluZChrZXlTZXRJZFN0cmluZykgPT0gbVJlbGVhc2VLZXlzTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9uTGlicmFyeS0+Y3JlYXRlU2Vzc2lvbigpOworICAgICAgICAgICAgICAgIG1SZWxlYXNlS2V5c01hcFtrZXlTZXRJZFN0cmluZ10gPSBzZXNzaW9uLT5zZXNzaW9uSWQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0koImtleSBpcyBpbiB1c2UsIGlnbm9yZSByZWxlYXNlIHJlcXVlc3QiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJPZmZsaW5lIGxpY2Vuc2Ugbm90IGZvdW5kLCBub3RoaW5nIHRvIHJlbGVhc2UiKTsKKyAgICAgICAgfQorICAgICAgICAqa2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZV9WMV8xOjpSRUxFQVNFOworICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC0xNzgsMTUgKzI0MiwxNSBAQAogICAgICAgICBnZXRLZXlSZXF1ZXN0X2NiIF9oaWRsX2NiKSB7CiAgICAgVU5VU0VEKG9wdGlvbmFsUGFyYW1ldGVycyk7CiAKLSAgICBLZXlSZXF1ZXN0VHlwZSBrZXlSZXF1ZXN0VHlwZSA9IEtleVJlcXVlc3RUeXBlOjpVTktOT1dOOworICAgIEtleVJlcXVlc3RUeXBlX1YxXzEga2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZV9WMV8xOjpVTktOT1dOOwogICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRVcmwoIiIpOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3Q7Ci0gICAgU3RhdHVzIHN0YXR1cyA9IGdldEtleVJlcXVlc3RDb21tb24oCisgICAgU3RhdHVzX1YxXzIgc3RhdHVzID0gZ2V0S2V5UmVxdWVzdENvbW1vbigKICAgICAgICAgICAgIHNjb3BlLCBpbml0RGF0YSwgbWltZVR5cGUsIGtleVR5cGUsIG9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgICAgICZyZXF1ZXN0LCAma2V5UmVxdWVzdFR5cGUsICZkZWZhdWx0VXJsKTsKIAotICAgIF9oaWRsX2NiKHN0YXR1cywgdG9IaWRsVmVjKHJlcXVlc3QpLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZHJtOjpWMV8wOjpLZXlSZXF1ZXN0VHlwZT4oa2V5UmVxdWVzdFR5cGUpLAorICAgIF9oaWRsX2NiKHRvU3RhdHVzXzFfMChzdGF0dXMpLCB0b0hpZGxWZWMocmVxdWVzdCksCisgICAgICAgICAgICB0b0tleVJlcXVlc3RUeXBlX1YxXzAoa2V5UmVxdWVzdFR5cGUpLAogICAgICAgICAgICAgaGlkbF9zdHJpbmcoZGVmYXVsdFVybCkpOwogICAgIHJldHVybiBWb2lkKCk7CiB9CkBAIC0yMDAsMTAgKzI2NCwzMSBAQAogICAgICAgICBnZXRLZXlSZXF1ZXN0XzFfMV9jYiBfaGlkbF9jYikgewogICAgIFVOVVNFRChvcHRpb25hbFBhcmFtZXRlcnMpOwogCi0gICAgS2V5UmVxdWVzdFR5cGUga2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZTo6VU5LTk9XTjsKKyAgICBLZXlSZXF1ZXN0VHlwZV9WMV8xIGtleVJlcXVlc3RUeXBlID0gS2V5UmVxdWVzdFR5cGVfVjFfMTo6VU5LTk9XTjsKICAgICBzdGQ6OnN0cmluZyBkZWZhdWx0VXJsKCIiKTsKICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByZXF1ZXN0OwotICAgIFN0YXR1cyBzdGF0dXMgPSBnZXRLZXlSZXF1ZXN0Q29tbW9uKAorICAgIFN0YXR1c19WMV8yIHN0YXR1cyA9IGdldEtleVJlcXVlc3RDb21tb24oCisgICAgICAgICAgICBzY29wZSwgaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlUeXBlLCBvcHRpb25hbFBhcmFtZXRlcnMsCisgICAgICAgICAgICAmcmVxdWVzdCwgJmtleVJlcXVlc3RUeXBlLCAmZGVmYXVsdFVybCk7CisKKyAgICBfaGlkbF9jYih0b1N0YXR1c18xXzAoc3RhdHVzKSwgdG9IaWRsVmVjKHJlcXVlc3QpLAorICAgICAgICAgICAga2V5UmVxdWVzdFR5cGUsIGhpZGxfc3RyaW5nKGRlZmF1bHRVcmwpKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXRLZXlSZXF1ZXN0XzFfMigKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgS2V5VHlwZSBrZXlUeXBlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgZ2V0S2V5UmVxdWVzdF8xXzJfY2IgX2hpZGxfY2IpIHsKKyAgICBVTlVTRUQob3B0aW9uYWxQYXJhbWV0ZXJzKTsKKworICAgIEtleVJlcXVlc3RUeXBlX1YxXzEga2V5UmVxdWVzdFR5cGUgPSBLZXlSZXF1ZXN0VHlwZV9WMV8xOjpVTktOT1dOOworICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRVcmwoIiIpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3Q7CisgICAgU3RhdHVzX1YxXzIgc3RhdHVzID0gZ2V0S2V5UmVxdWVzdENvbW1vbigKICAgICAgICAgICAgIHNjb3BlLCBpbml0RGF0YSwgbWltZVR5cGUsIGtleVR5cGUsIG9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgICAgICZyZXF1ZXN0LCAma2V5UmVxdWVzdFR5cGUsICZkZWZhdWx0VXJsKTsKIApAQCAtMjI3LDYgKzMxMiwzMCBAQAogICAgIG1QbGF5UG9saWN5LnB1c2hfYmFjayhwb2xpY3kpOwogfQogCitib29sIERybVBsdWdpbjo6bWFrZUtleVNldElkKHN0ZDo6c3RyaW5nKiBrZXlTZXRJZCkgeworICAgIGlmICgha2V5U2V0SWQpIHsKKyAgICAgICAgQUxPR0UoImtleVNldElkIGRlc3RpbmF0aW9uIG5vdCBwcm92aWRlZCIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtzaWQoa0tleVNldElkUHJlZml4LmJlZ2luKCksIGtLZXlTZXRJZFByZWZpeC5lbmQoKSk7CisgICAga3NpZC5yZXNpemUoa0tleVNldElkTGVuZ3RoKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiByYW5kb21EYXRhKChrS2V5U2V0SWRMZW5ndGggLSBrS2V5U2V0SWRQcmVmaXguc2l6ZSgpKSAvIDIsIDApOworCisgICAgd2hpbGUgKGtleVNldElkLT5lbXB0eSgpKSB7CisgICAgICAgIGZvciAoYXV0byBpdHIgPSByYW5kb21EYXRhLmJlZ2luKCk7IGl0ciAhPSByYW5kb21EYXRhLmVuZCgpOyArK2l0cikgeworICAgICAgICAgICAgKml0ciA9IHN0ZDo6cmFuZCgpICUgMHhmZjsKKyAgICAgICAgfQorICAgICAgICAqa2V5U2V0SWQgPSBrS2V5U2V0SWRQcmVmaXggKyBCeXRlQXJyYXlUb0hleFN0cmluZygKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPihyYW5kb21EYXRhLmRhdGEoKSksIHJhbmRvbURhdGEuc2l6ZSgpKTsKKyAgICAgICAgaWYgKG1GaWxlSGFuZGxlLkxpY2Vuc2VFeGlzdHMoKmtleVNldElkKSkgeworICAgICAgICAgICAgLy8gY29sbGlzaW9uLCByZWdlbmVyYXRlCisgICAgICAgICAgICBBTE9HVigiUmV0cnkgZ2VuZXJhdGluZyBLZXlTZXRJZCIpOworICAgICAgICAgICAga2V5U2V0SWQtPmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKIFJldHVybjx2b2lkPiBEcm1QbHVnaW46OnByb3ZpZGVLZXlSZXNwb25zZSgKICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgcmVzcG9uc2UsCkBAIC0yMzcsNDYgKzM0NiwxMjQgQEAKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CiAKLSAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbih0b1ZlY3RvcihzY29wZSkpOworICAgIHN0ZDo6c3RyaW5nIHJlc3BvbnNlU3RyaW5nKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocmVzcG9uc2UuZGF0YSgpKSwgcmVzcG9uc2Uuc2l6ZSgpKTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzY29wZUlkID0gdG9WZWN0b3Ioc2NvcGUpOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKKyAgICBzdGQ6OnN0cmluZyBrZXlTZXRJZDsKKworICAgIFN0YXR1cyBzdGF0dXMgPSBTdGF0dXM6Ok9LOworICAgIGJvb2wgaXNPZmZsaW5lTGljZW5zZSA9IHJlc3BvbnNlU3RyaW5nLmZpbmQoa09mZmxpbmVMaWNlbnNlKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgICBib29sIGlzUmVsZWFzZSA9IChtZW1jbXAoc2NvcGVJZC5kYXRhKCksIGtLZXlTZXRJZFByZWZpeC5kYXRhKCksIGtLZXlTZXRJZFByZWZpeC5zaXplKCkpID09IDApOworICAgIGlmIChpc1JlbGVhc2UpIHsKKyAgICAgICAga2V5U2V0SWQuYXNzaWduKHNjb3BlSWQuYmVnaW4oKSwgc2NvcGVJZC5lbmQoKSk7CisKKyAgICAgICAgYXV0byBpdGVyID0gbVJlbGVhc2VLZXlzTWFwLmZpbmQoc3RkOjpzdHJpbmcoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpKTsKKyAgICAgICAgaWYgKGl0ZXIgIT0gbVJlbGVhc2VLZXlzTWFwLmVuZCgpKSB7CisgICAgICAgICAgICBzZXNzaW9uSWQuYXNzaWduKGl0ZXItPnNlY29uZC5iZWdpbigpLCBpdGVyLT5zZWNvbmQuZW5kKCkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2Vzc2lvbklkLmFzc2lnbihzY29wZUlkLmJlZ2luKCksIHNjb3BlSWQuZW5kKCkpOworICAgICAgICAvLyBub24gb2ZmbGluZSBsaWNlbnNlIHJldHVybnMgZW1wdHkga2V5U2V0SWQKKyAgICAgICAga2V5U2V0SWQuY2xlYXIoKTsKKyAgICB9CisKKyAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgIGlmICghc2Vzc2lvbi5nZXQoKSkgewogICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9TRVNTSU9OX05PVF9PUEVORUQsIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOwogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KLQogICAgIHNldFBsYXlQb2xpY3koKTsKLSAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZDsKLSAgICBrZXlTZXRJZC5jbGVhcigpOwogCi0gICAgU3RhdHVzIHN0YXR1cyA9IHNlc3Npb24tPnByb3ZpZGVLZXlSZXNwb25zZShyZXNwb25zZSk7CisgICAgc3RhdHVzID0gc2Vzc2lvbi0+cHJvdmlkZUtleVJlc3BvbnNlKHJlc3BvbnNlKTsKICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgaWYgKGlzT2ZmbGluZUxpY2Vuc2UpIHsKKyAgICAgICAgICAgIGlmIChpc1JlbGVhc2UpIHsKKyAgICAgICAgICAgICAgICBtRmlsZUhhbmRsZS5EZWxldGVMaWNlbnNlKGtleVNldElkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFtYWtlS2V5U2V0SWQoJmtleVNldElkKSkgeworICAgICAgICAgICAgICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkVSUk9SX0RSTV9VTktOT1dOLCBoaWRsX3ZlYzx1aW50OF90PigpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBib29sIG9rID0gbUZpbGVIYW5kbGUuU3RvcmVMaWNlbnNlKAorICAgICAgICAgICAgICAgICAgICAgICAga2V5U2V0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZUFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKHJlc3BvbnNlLmJlZ2luKCksIHJlc3BvbnNlLmVuZCgpKSk7CisgICAgICAgICAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHN0b3JlIG9mZmxpbmUgbGljZW5zZSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIC8vIFRlc3QgY2FsbGluZyBBTWVkaWFEcm0gbGlzdGVuZXJzLgotICAgICAgICBzZW5kRXZlbnQoRXZlbnRUeXBlOjpWRU5ET1JfREVGSU5FRCwgdG9WZWN0b3Ioc2NvcGUpLCB0b1ZlY3RvcihzY29wZSkpOworICAgICAgICBzZW5kRXZlbnQoRXZlbnRUeXBlOjpWRU5ET1JfREVGSU5FRCwgc2Vzc2lvbklkLCBzZXNzaW9uSWQpOwogCi0gICAgICAgIHNlbmRFeHBpcmF0aW9uVXBkYXRlKHRvVmVjdG9yKHNjb3BlKSwgMTAwKTsKKyAgICAgICAgc2VuZEV4cGlyYXRpb25VcGRhdGUoc2Vzc2lvbklkLCAxMDApOwogCi0gICAgICAgIHN0ZDo6dmVjdG9yPEtleVN0YXR1cz4ga2V5c1N0YXR1czsKLSAgICAgICAgS2V5U3RhdHVzIGtleVN0YXR1czsKKyAgICAgICAgc3RkOjp2ZWN0b3I8S2V5U3RhdHVzX1YxXzI+IGtleXNTdGF0dXM7CisgICAgICAgIEtleVN0YXR1c19WMV8yIGtleVN0YXR1czsKIAogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlJZDEgPSB7IDB4QSwgMHhCLCAweEMgfTsKICAgICAgICAga2V5U3RhdHVzLmtleUlkID0ga2V5SWQxOwotICAgICAgICBrZXlTdGF0dXMudHlwZSA9IFYxXzA6OktleVN0YXR1c1R5cGU6OlVTQUJMRTsKKyAgICAgICAga2V5U3RhdHVzLnR5cGUgPSBWMV8yOjpLZXlTdGF0dXNUeXBlOjpVU0FCTEU7CiAgICAgICAgIGtleXNTdGF0dXMucHVzaF9iYWNrKGtleVN0YXR1cyk7CiAKICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5SWQyID0geyAweEQsIDB4RSwgMHhGIH07CiAgICAgICAgIGtleVN0YXR1cy5rZXlJZCA9IGtleUlkMjsKLSAgICAgICAga2V5U3RhdHVzLnR5cGUgPSBWMV8wOjpLZXlTdGF0dXNUeXBlOjpFWFBJUkVEOworICAgICAgICBrZXlTdGF0dXMudHlwZSA9IFYxXzI6OktleVN0YXR1c1R5cGU6OkVYUElSRUQ7CiAgICAgICAgIGtleXNTdGF0dXMucHVzaF9iYWNrKGtleVN0YXR1cyk7CiAKLSAgICAgICAgc2VuZEtleXNDaGFuZ2UodG9WZWN0b3Ioc2NvcGUpLCBrZXlzU3RhdHVzLCB0cnVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5SWQzID0geyAweDAsIDB4MSwgMHgyIH07CisgICAgICAgIGtleVN0YXR1cy5rZXlJZCA9IGtleUlkMzsKKyAgICAgICAga2V5U3RhdHVzLnR5cGUgPSBWMV8yOjpLZXlTdGF0dXNUeXBlOjpVU0FCTEVJTkZVVFVSRTsKKyAgICAgICAga2V5c1N0YXR1cy5wdXNoX2JhY2soa2V5U3RhdHVzKTsKKworICAgICAgICBzZW5kS2V5c0NoYW5nZV8xXzIoc2Vzc2lvbklkLCBrZXlzU3RhdHVzLCB0cnVlKTsKKworICAgICAgICBpbnN0YWxsU2VjdXJlU3RvcChzZXNzaW9uSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJwcm92aWRlS2V5UmVzcG9uc2UgcmV0dXJucyBlcnJvcj0lZCIsIHN0YXR1cyk7CiAgICAgfQogCi0gICAgaW5zdGFsbFNlY3VyZVN0b3Aoc2NvcGUpOwotCi0gICAgLy8gUmV0dXJucyBzdGF0dXMgYW5kIGVtcHR5IGtleVNldElkCi0gICAgX2hpZGxfY2Ioc3RhdHVzLCB0b0hpZGxWZWMoa2V5U2V0SWQpKTsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrZXlTZXRJZFZlYyhrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSk7CisgICAgX2hpZGxfY2Ioc3RhdHVzLCB0b0hpZGxWZWMoa2V5U2V0SWRWZWMpKTsKICAgICByZXR1cm4gVm9pZCgpOwogfQogCitSZXR1cm48U3RhdHVzPiBEcm1QbHVnaW46OnJlc3RvcmVLZXlzKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5U2V0SWQpIHsKKyAgICAgICAgaWYgKHNlc3Npb25JZC5zaXplKCkgPT0gMCB8fCBrZXlTZXRJZC5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgRGV2aWNlRmlsZXM6OkxpY2Vuc2VTdGF0ZSBsaWNlbnNlU3RhdGU7CisgICAgICAgIHN0ZDo6c3RyaW5nIG9mZmxpbmVMaWNlbnNlOworICAgICAgICBTdGF0dXMgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICAgICAgaWYgKCFtRmlsZUhhbmRsZS5SZXRyaWV2ZUxpY2Vuc2Uoc3RkOjpzdHJpbmcoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpLAorICAgICAgICAgICAgICAgICZsaWNlbnNlU3RhdGUsICZvZmZsaW5lTGljZW5zZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVzdG9yZSBvZmZsaW5lIGxpY2Vuc2UiKTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlVW5rbm93biA9PSBsaWNlbnNlU3RhdGUgfHwKKyAgICAgICAgICAgICAgICBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVJlbGVhc2luZyA9PSBsaWNlbnNlU3RhdGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGxpY2Vuc2Ugc3RhdGU9JWQiLCBsaWNlbnNlU3RhdGUpOworICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX05PX0xJQ0VOU0U7CisgICAgICAgIH0KKworICAgICAgICBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25MaWJyYXJ5LT5maW5kU2Vzc2lvbih0b1ZlY3RvcihzZXNzaW9uSWQpKTsKKyAgICAgICAgaWYgKCFzZXNzaW9uLmdldCgpKSB7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpFUlJPUl9EUk1fU0VTU0lPTl9OT1RfT1BFTkVEOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHNlc3Npb24tPnByb3ZpZGVLZXlSZXNwb25zZShzdGQ6OnZlY3Rvcjx1aW50OF90PihvZmZsaW5lTGljZW5zZS5iZWdpbigpLAorICAgICAgICAgICAgICAgIG9mZmxpbmVMaWNlbnNlLmVuZCgpKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXN0b3JlIGtleXMiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdHVzOworfQorCiBSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXRQcm9wZXJ0eVN0cmluZygKICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIHByb3BlcnR5TmFtZSwgZ2V0UHJvcGVydHlTdHJpbmdfY2IgX2hpZGxfY2IpIHsKICAgICBzdGQ6OnN0cmluZyBuYW1lKHByb3BlcnR5TmFtZS5jX3N0cigpKTsKQEAgLTI5Miw2ICs0NzksOCBAQAogICAgICAgICB2YWx1ZSA9IG1TdHJpbmdQcm9wZXJ0aWVzW2tBbGdvcml0aG1zS2V5XTsKICAgICB9IGVsc2UgaWYgKG5hbWUgPT0ga0xpc3RlbmVyVGVzdFN1cHBvcnRLZXkpIHsKICAgICAgICAgdmFsdWUgPSBtU3RyaW5nUHJvcGVydGllc1trTGlzdGVuZXJUZXN0U3VwcG9ydEtleV07CisgICAgfSBlbHNlIGlmIChuYW1lID09IGtEcm1FcnJvclRlc3RLZXkpIHsKKyAgICAgICAgdmFsdWUgPSBtU3RyaW5nUHJvcGVydGllc1trRHJtRXJyb3JUZXN0S2V5XTsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HRSgiQXBwIHJlcXVlc3RlZCB1bmtub3duIHN0cmluZyBwcm9wZXJ0eSAlcyIsIG5hbWUuY19zdHIoKSk7CiAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsICIiKTsKQEAgLTMzNiw2ICs1MjUsMjAgQEAKICAgICAgICAgcmV0dXJuIFN0YXR1czo6QkFEX1ZBTFVFOwogICAgIH0KIAorICAgIGlmIChuYW1lID09IGtEcm1FcnJvclRlc3RLZXkpIHsKKyAgICAgICAgaWYgKHZhbHVlID09IGtSZXNvdXJjZUNvbnRlbnRpb25WYWx1ZSkgeworICAgICAgICAgICAgbU1vY2tFcnJvciA9IFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fUkVTT1VSQ0VfQ09OVEVOVElPTjsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBrTG9zdFN0YXRlVmFsdWUpIHsKKyAgICAgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX1NFU1NJT05fTE9TVF9TVEFURTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBrRnJhbWVUb29MYXJnZVZhbHVlKSB7CisgICAgICAgICAgICBtTW9ja0Vycm9yID0gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0U7CisgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0ga0ludmFsaWRTdGF0ZVZhbHVlKSAgeworICAgICAgICAgICAgbU1vY2tFcnJvciA9IFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fSU5WQUxJRF9TVEFURTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX1VOS05PV047CisgICAgICAgIH0KKyAgICB9CisKICAgICBtU3RyaW5nUHJvcGVydGllc1trZXldID0gc3RkOjpzdHJpbmcodmFsdWUuY19zdHIoKSk7CiAgICAgcmV0dXJuIFN0YXR1czo6T0s7CiB9CkBAIC0zNDYsNiArNTQ5LDkgQEAKICAgIGlmIChuYW1lID09IGtEZXZpY2VJZEtleSkgewogICAgICAgQUxPR0QoIkNhbm5vdCBzZXQgaW1tdXRhYmxlIHByb3BlcnR5OiAlcyIsIG5hbWUuY19zdHIoKSk7CiAgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7CisgICB9IGVsc2UgaWYgKG5hbWUgPT0ga0NsaWVudElkS2V5KSB7CisgICAgICAgbUJ5dGVBcnJheVByb3BlcnRpZXNba0NsaWVudElkS2V5XSA9IHRvVmVjdG9yKHZhbHVlKTsKKyAgICAgICByZXR1cm4gU3RhdHVzOjpPSzsKICAgIH0KIAogICAgLy8gU2V0dGluZyBvZiB1bmRlZmluZWQgcHJvcGVydGllcyBpcyBub3Qgc3VwcG9ydGVkCkBAIC00ODMsNiArNjg5LDYwIEBACiAgICAgcmV0dXJuIFZvaWQoKTsKIH0KIAorUmV0dXJuPHZvaWQ+IERybVBsdWdpbjo6Z2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHMoZ2V0T2ZmbGluZUxpY2Vuc2VLZXlTZXRJZHNfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbGljZW5zZU5hbWVzID0gbUZpbGVIYW5kbGUuTGlzdExpY2Vuc2VzKCk7CisgICAgc3RkOjp2ZWN0b3I8S2V5U2V0SWQ+IGtleVNldElkczsKKyAgICBpZiAobU1vY2tFcnJvciAhPSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgX2hpZGxfY2IodG9TdGF0dXNfMV8wKG1Nb2NrRXJyb3IpLCBrZXlTZXRJZHMpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIG5hbWUgOiBsaWNlbnNlTmFtZXMpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4ga2V5U2V0SWQobmFtZS5iZWdpbigpLCBuYW1lLmVuZCgpKTsKKyAgICAgICAga2V5U2V0SWRzLnB1c2hfYmFjayhrZXlTZXRJZCk7CisgICAgfQorICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIGtleVNldElkcyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworCitSZXR1cm48U3RhdHVzPiBEcm1QbHVnaW46OnJlbW92ZU9mZmxpbmVMaWNlbnNlKGNvbnN0IEtleVNldElkJiBrZXlTZXRJZCkgeworICAgIGlmIChtTW9ja0Vycm9yICE9IFN0YXR1c19WMV8yOjpPSykgeworICAgICAgICByZXR1cm4gdG9TdGF0dXNfMV8wKG1Nb2NrRXJyb3IpOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBsaWNlbnNlTmFtZShrZXlTZXRJZC5iZWdpbigpLCBrZXlTZXRJZC5lbmQoKSk7CisgICAgaWYgKG1GaWxlSGFuZGxlLkRlbGV0ZUxpY2Vuc2UobGljZW5zZU5hbWUpKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7Cit9CisKK1JldHVybjx2b2lkPiBEcm1QbHVnaW46OmdldE9mZmxpbmVMaWNlbnNlU3RhdGUoY29uc3QgS2V5U2V0SWQmIGtleVNldElkLAorICAgICAgICBnZXRPZmZsaW5lTGljZW5zZVN0YXRlX2NiIF9oaWRsX2NiKSB7CisgICAgc3RkOjpzdHJpbmcgbGljZW5zZU5hbWUoa2V5U2V0SWQuYmVnaW4oKSwga2V5U2V0SWQuZW5kKCkpOworICAgIERldmljZUZpbGVzOjpMaWNlbnNlU3RhdGUgc3RhdGU7CisgICAgc3RkOjpzdHJpbmcgbGljZW5zZTsKKyAgICBPZmZsaW5lTGljZW5zZVN0YXRlIGhMaWNlbnNlU3RhdGU7CisgICAgaWYgKG1Nb2NrRXJyb3IgIT0gU3RhdHVzX1YxXzI6Ok9LKSB7CisgICAgICAgIF9oaWRsX2NiKHRvU3RhdHVzXzFfMChtTW9ja0Vycm9yKSwgT2ZmbGluZUxpY2Vuc2VTdGF0ZTo6VU5LTk9XTik7CisgICAgfSBlbHNlIGlmIChtRmlsZUhhbmRsZS5SZXRyaWV2ZUxpY2Vuc2UobGljZW5zZU5hbWUsICZzdGF0ZSwgJmxpY2Vuc2UpKSB7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZUFjdGl2ZToKKyAgICAgICAgICAgIGhMaWNlbnNlU3RhdGUgPSBPZmZsaW5lTGljZW5zZVN0YXRlOjpVU0FCTEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBEZXZpY2VGaWxlczo6a0xpY2Vuc2VTdGF0ZVJlbGVhc2luZzoKKyAgICAgICAgICAgIGhMaWNlbnNlU3RhdGUgPSBPZmZsaW5lTGljZW5zZVN0YXRlOjpJTkFDVElWRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERldmljZUZpbGVzOjprTGljZW5zZVN0YXRlVW5rbm93bjoKKyAgICAgICAgICAgIGhMaWNlbnNlU3RhdGUgPSBPZmZsaW5lTGljZW5zZVN0YXRlOjpVTktOT1dOOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgaExpY2Vuc2VTdGF0ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpCQURfVkFMVUUsIE9mZmxpbmVMaWNlbnNlU3RhdGU6OlVOS05PV04pOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCiBSZXR1cm48dm9pZD4gRHJtUGx1Z2luOjpnZXRTZWN1cmVTdG9wcyhnZXRTZWN1cmVTdG9wc19jYiBfaGlkbF9jYikgewogICAgIHN0ZDo6dmVjdG9yPFNlY3VyZVN0b3A+IHN0b3BzOwogICAgIGZvciAoYXV0byBpdHIgPSBtU2VjdXJlU3RvcHMuYmVnaW4oKTsgaXRyICE9IG1TZWN1cmVTdG9wcy5lbmQoKTsgKytpdHIpIHsKQEAgLTU4NSw3ICs4NDUsNyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gIC8vIG5hbWVzcGFjZSBWMV8xCit9ICAvLyBuYW1lc3BhY2UgVjFfMgogfSAgLy8gbmFtZXNwYWNlIGRybQogfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Jbml0RGF0YVBhcnNlci5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0luaXREYXRhUGFyc2VyLmNwcAppbmRleCBlMmJiNjUxLi5iOTg4Y2UwIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0luaXREYXRhUGFyc2VyLmNwcAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0luaXREYXRhUGFyc2VyLmNwcApAQCAtMzEsNyArMzEsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogbmFtZXNwYWNlIHsKQEAgLTQ1LDIxICs0NSwyMiBAQAogfQogCiBTdGF0dXMgSW5pdERhdGFQYXJzZXI6OnBhcnNlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgVjFfMDo6S2V5VHlwZSBrZXlUeXBlLAogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogbGljZW5zZVJlcXVlc3QpIHsKICAgICAvLyBCdWlsZCBhIGxpc3Qgb2YgdGhlIGtleSBJRHMKICAgICBzdGQ6OnZlY3Rvcjxjb25zdCB1aW50OF90Kj4ga2V5SWRzOwogCi0gICAgaWYgKHR5cGUgPT0ga0lzb0JtZmZWaWRlb01pbWVUeXBlIHx8Ci0gICAgICAgIHR5cGUgPT0ga0lzb0JtZmZBdWRpb01pbWVUeXBlIHx8Ci0gICAgICAgIHR5cGUgPT0ga0NlbmNJbml0RGF0YUZvcm1hdCkgeworICAgIGlmIChtaW1lVHlwZSA9PSBrSXNvQm1mZlZpZGVvTWltZVR5cGUuY19zdHIoKSB8fAorICAgICAgICBtaW1lVHlwZSA9PSBrSXNvQm1mZkF1ZGlvTWltZVR5cGUuY19zdHIoKSB8fAorICAgICAgICBtaW1lVHlwZSA9PSBrQ2VuY0luaXREYXRhRm9ybWF0LmNfc3RyKCkpIHsKICAgICAgICAgU3RhdHVzIHJlcyA9IHBhcnNlUHNzaChpbml0RGF0YSwgJmtleUlkcyk7CiAgICAgICAgIGlmIChyZXMgIT0gU3RhdHVzOjpPSykgewogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZSA9PSBrV2VibVZpZGVvTWltZVR5cGUgfHwKLSAgICAgICAgdHlwZSA9PSBrV2VibUF1ZGlvTWltZVR5cGUgfHwKLSAgICAgICAgdHlwZSA9PSBrV2VibUluaXREYXRhRm9ybWF0KSB7CisgICAgfSBlbHNlIGlmIChtaW1lVHlwZSA9PSBrV2VibVZpZGVvTWltZVR5cGUuY19zdHIoKSB8fAorICAgICAgICBtaW1lVHlwZSA9PSBrV2VibUF1ZGlvTWltZVR5cGUuY19zdHIoKSB8fAorICAgICAgICBtaW1lVHlwZSA9PSBrV2VibUluaXREYXRhRm9ybWF0LmNfc3RyKCkpIHsKICAgICAgICAgLy8gV2ViTSAiaW5pdCBkYXRhIiBpcyBqdXN0IGEgc2luZ2xlIGtleSBJRAogICAgICAgICBpZiAoaW5pdERhdGEuc2l6ZSgpICE9IGtLZXlJZFNpemUpIHsKICAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9DQU5OT1RfSEFORExFOwpAQCAtNjksOCArNzAsMTIgQEAKICAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7CiAgICAgfQogCisgICAgaWYgKGtleVR5cGUgPT0gVjFfMDo6S2V5VHlwZTo6UkVMRUFTRSkgeworICAgICAgICAvLyByZXN0b3JlIGtleQorICAgIH0KKwogICAgIC8vIEJ1aWxkIHRoZSByZXF1ZXN0Ci0gICAgc3RkOjpzdHJpbmcgcmVxdWVzdEpzb24gPSBnZW5lcmF0ZVJlcXVlc3Qoa2V5SWRzKTsKKyAgICBzdGQ6OnN0cmluZyByZXF1ZXN0SnNvbiA9IGdlbmVyYXRlUmVxdWVzdChrZXlUeXBlLCBrZXlJZHMpOwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlcXVlc3RKc29uVmVjID0gU3RyVG9WZWN0b3IocmVxdWVzdEpzb24pOwogCiAgICAgbGljZW5zZVJlcXVlc3QtPmNsZWFyKCk7CkBAIC0xMzEsOSArMTM2LDExIEBACiAgICAgcmV0dXJuIFN0YXR1czo6T0s7CiB9CiAKLXN0ZDo6c3RyaW5nIEluaXREYXRhUGFyc2VyOjpnZW5lcmF0ZVJlcXVlc3QoY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+JiBrZXlJZHMpIHsKK3N0ZDo6c3RyaW5nIEluaXREYXRhUGFyc2VyOjpnZW5lcmF0ZVJlcXVlc3QoVjFfMDo6S2V5VHlwZSBrZXlUeXBlLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCB1aW50OF90Kj4mIGtleUlkcykgewogICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtSZXF1ZXN0UHJlZml4KCJ7XCJraWRzXCI6WyIpOwotICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGtSZXF1ZXN0U3VmZml4KCJdLFwidHlwZVwiOlwidGVtcG9yYXJ5XCJ9Iik7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcga1RlbXBvcmFyeVNlc3Npb24oIl0sXCJ0eXBlXCI6XCJ0ZW1wb3JhcnlcIn0iKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBrUGVyc2lzdGVudFNlc3Npb24oIl0sXCJ0eXBlXCI6XCJwZXJzaXN0ZW50LWxpY2Vuc2VcIn0iKTsKIAogICAgIHN0ZDo6c3RyaW5nIHJlcXVlc3Qoa1JlcXVlc3RQcmVmaXgpOwogICAgIHN0ZDo6c3RyaW5nIGVuY29kZWRJZDsKQEAgLTE0Nyw3ICsxNTQsMTIgQEAKICAgICAgICAgcmVxdWVzdC5hcHBlbmQoZW5jb2RlZElkKTsKICAgICAgICAgcmVxdWVzdC5wdXNoX2JhY2soJ1wiJyk7CiAgICAgfQotICAgIHJlcXVlc3QuYXBwZW5kKGtSZXF1ZXN0U3VmZml4KTsKKyAgICBpZiAoa2V5VHlwZSA9PSBWMV8wOjpLZXlUeXBlOjpTVFJFQU1JTkcpIHsKKyAgICAgICAgcmVxdWVzdC5hcHBlbmQoa1RlbXBvcmFyeVNlc3Npb24pOworICAgIH0gZWxzZSBpZiAoa2V5VHlwZSA9PSBWMV8wOjpLZXlUeXBlOjpPRkZMSU5FIHx8CisgICAgICAgICAgICAgICAgICAga2V5VHlwZSA9PSBWMV8wOjpLZXlUeXBlOjpSRUxFQVNFKSB7CisgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZChrUGVyc2lzdGVudFNlc3Npb24pOworICAgIH0KIAogICAgIC8vIEFuZHJvaWQncyBCYXNlNjQgZW5jb2RlciBwcm9kdWNlcyBwYWRkaW5nLiBFTUUgZm9yYmlkcyBwYWRkaW5nLgogICAgIGNvbnN0IGNoYXIga0Jhc2U2NFBhZGRpbmcgPSAnPSc7CkBAIC0xNTcsNyArMTY5LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSnNvbldlYktleS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL0pzb25XZWJLZXkuY3BwCmluZGV4IGNjY2I0MWUuLmQ5Mzc3N2QgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvSnNvbldlYktleS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9Kc29uV2ViS2V5LmNwcApAQCAtMjIsMTggKzIyLDIxIEBACiAjaW5jbHVkZSAiQmFzZTY0LmgiCiAKIG5hbWVzcGFjZSB7Citjb25zdCBzdGQ6OnN0cmluZyBrQmFzZTY0UGFkZGluZygiPSIpOwogY29uc3Qgc3RkOjpzdHJpbmcga0tleXNUYWcoImtleXMiKTsKIGNvbnN0IHN0ZDo6c3RyaW5nIGtLZXlUeXBlVGFnKCJrdHkiKTsKLWNvbnN0IHN0ZDo6c3RyaW5nIGtTeW1tZXRyaWNLZXlWYWx1ZSgib2N0Iik7CiBjb25zdCBzdGQ6OnN0cmluZyBrS2V5VGFnKCJrIik7CiBjb25zdCBzdGQ6OnN0cmluZyBrS2V5SWRUYWcoImtpZCIpOwotY29uc3Qgc3RkOjpzdHJpbmcga0Jhc2U2NFBhZGRpbmcoIj0iKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtNZWRpYVNlc3Npb25UeXBlKCJ0eXBlIik7Citjb25zdCBzdGQ6OnN0cmluZyBrUGVyc2lzdGVudExpY2Vuc2VTZXNzaW9uKCJwZXJzaXN0ZW50LWxpY2Vuc2UiKTsKK2NvbnN0IHN0ZDo6c3RyaW5nIGtTeW1tZXRyaWNLZXlWYWx1ZSgib2N0Iik7Citjb25zdCBzdGQ6OnN0cmluZyBrVGVtcG9yYXJ5TGljZW5zZVNlc3Npb24oInRlbXBvcmFyeSIpOwogfQogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiBKc29uV2ViS2V5OjpKc29uV2ViS2V5KCkgewpAQCAtMjY4LDcgKzI3MSw3IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL01lbW9yeUZpbGVTeXN0ZW0uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9NZW1vcnlGaWxlU3lzdGVtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZGNkMDBmCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9NZW1vcnlGaWxlU3lzdGVtLmNwcApAQCAtMCwwICsxLDkyIEBACisvLyBDb3B5cmlnaHQgMjAxOCBHb29nbGUgTExDLiBBbGwgUmlnaHRzIFJlc2VydmVkLiBUaGlzIGZpbGUgYW5kIHByb3ByaWV0YXJ5CisvLyBzb3VyY2UgY29kZSBtYXkgb25seSBiZSB1c2VkIGFuZCBkaXN0cmlidXRlZCB1bmRlciB0aGUgV2lkZXZpbmUgTWFzdGVyCisvLyBMaWNlbnNlIEFncmVlbWVudC4KKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgIk1lbW9yeUZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRlICJVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCitzdGQ6OnN0cmluZyBNZW1vcnlGaWxlU3lzdGVtOjpHZXRGaWxlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgeworICAgIHNpemVfdCBpbmRleCA9IHBhdGguZmluZF9sYXN0X29mKCIvIik7CisgICAgaWYgKGluZGV4ICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIHJldHVybiBwYXRoLnN1YnN0cihpbmRleCsxKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcGF0aDsKKyAgICB9Cit9CisKK2Jvb2wgTWVtb3J5RmlsZVN5c3RlbTo6RmlsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0IHsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoZmlsZU5hbWUpOworICAgIHJldHVybiByZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCk7Cit9CisKK3NzaXplX3QgTWVtb3J5RmlsZVN5c3RlbTo6R2V0RmlsZVNpemUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdCB7CisgICAgYXV0byByZXN1bHQgPSBtTWVtb3J5RmlsZVN5c3RlbS5maW5kKGZpbGVOYW1lKTsKKyAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzc2l6ZV90PihyZXN1bHQtPnNlY29uZC5nZXRGaWxlU2l6ZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBzaXplIGZvciAlcyIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTWVtb3J5RmlsZVN5c3RlbTo6TGlzdEZpbGVzKCkgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBsaXN0OworICAgIGZvciAoY29uc3QgYXV0byYgZmlsZW5hbWUgOiBtTWVtb3J5RmlsZVN5c3RlbSkgeworICAgICAgICBsaXN0LnB1c2hfYmFjayhmaWxlbmFtZS5maXJzdCk7CisgICAgfQorICAgIHJldHVybiBsaXN0OworfQorCitzaXplX3QgTWVtb3J5RmlsZVN5c3RlbTo6UmVhZChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwgc3RkOjpzdHJpbmcqIGJ1ZmZlcikgeworICAgIHN0ZDo6c3RyaW5nIGtleSA9IEdldEZpbGVOYW1lKHBhdGgpOworICAgIGF1dG8gcmVzdWx0ID0gbU1lbW9yeUZpbGVTeXN0ZW0uZmluZChrZXkpOworICAgIGlmIChyZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZEhhc2hGaWxlID0gcmVzdWx0LT5zZWNvbmQuZ2V0Q29udGVudCgpOworICAgICAgICBidWZmZXItPmFzc2lnbihzZXJpYWxpemVkSGFzaEZpbGUpOworICAgICAgICByZXR1cm4gYnVmZmVyLT5zaXplKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIGZyb20gJXMiLCBwYXRoLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitzaXplX3QgTWVtb3J5RmlsZVN5c3RlbTo6V3JpdGUoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsIGNvbnN0IE1lbW9yeUZpbGUmIG1lbW9yeUZpbGUpIHsKKyAgICBzdGQ6OnN0cmluZyBrZXkgPSBHZXRGaWxlTmFtZShwYXRoKTsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoa2V5KTsKKyAgICBpZiAocmVzdWx0ICE9IG1NZW1vcnlGaWxlU3lzdGVtLmVuZCgpKSB7CisgICAgICAgIG1NZW1vcnlGaWxlU3lzdGVtLmVyYXNlKGtleSk7CisgICAgfQorICAgIG1NZW1vcnlGaWxlU3lzdGVtLmluc2VydChzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIE1lbW9yeUZpbGU+KGtleSwgbWVtb3J5RmlsZSkpOworICAgIHJldHVybiBtZW1vcnlGaWxlLmdldEZpbGVTaXplKCk7Cit9CisKK2Jvb2wgTWVtb3J5RmlsZVN5c3RlbTo6UmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIHsKKyAgICBhdXRvIHJlc3VsdCA9IG1NZW1vcnlGaWxlU3lzdGVtLmZpbmQoZmlsZU5hbWUpOworICAgIGlmIChyZXN1bHQgIT0gbU1lbW9yeUZpbGVTeXN0ZW0uZW5kKCkpIHsKKyAgICAgICAgbU1lbW9yeUZpbGVTeXN0ZW0uZXJhc2UocmVzdWx0KTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkNhbm5vdCBmaW5kIGxpY2Vuc2UgdG8gcmVtb3ZlOiAlcyIsIGZpbGVOYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIE1lbW9yeUZpbGVTeXN0ZW06OlJlbW92ZUFsbEZpbGVzKCkgeworICAgIG1NZW1vcnlGaWxlU3lzdGVtLmNsZWFyKCk7CisgICAgcmV0dXJuIG1NZW1vcnlGaWxlU3lzdGVtLmVtcHR5KCk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNsZWFya2V5Cit9IC8vIG5hbWVzcGFjZSBWMV8yCit9IC8vIG5hbWVzcGFjZSBkcm0KK30gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb24uY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uLmNwcAppbmRleCAwN2M5MjY5Li5hOWQ3MDE2IDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL1Nlc3Npb24uY3BwCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbi5jcHAKQEAgLTI4LDcgKzI4LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6S2V5VmFsdWU7CkBAIC00Miw5ICs0MiwxMCBAQAogU3RhdHVzIFNlc3Npb246OmdldEtleVJlcXVlc3QoCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICBWMV8wOjpLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBrZXlSZXF1ZXN0KSBjb25zdCB7CiAgICAgSW5pdERhdGFQYXJzZXIgcGFyc2VyOwotICAgIHJldHVybiBwYXJzZXIucGFyc2UoaW5pdERhdGEsIG1pbWVUeXBlLCBrZXlSZXF1ZXN0KTsKKyAgICByZXR1cm4gcGFyc2VyLnBhcnNlKGluaXREYXRhLCBtaW1lVHlwZSwga2V5VHlwZSwga2V5UmVxdWVzdCk7CiB9CiAKIFN0YXR1cyBTZXNzaW9uOjpwcm92aWRlS2V5UmVzcG9uc2UoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHJlc3BvbnNlKSB7CkBAIC02NywyOSArNjgsMzQgQEAKICAgICB9CiB9CiAKLVN0YXR1cyBTZXNzaW9uOjpkZWNyeXB0KAorU3RhdHVzX1YxXzIgU2Vzc2lvbjo6ZGVjcnlwdCgKICAgICAgICAgY29uc3QgS2V5SWQga2V5SWQsIGNvbnN0IEl2IGl2LCBjb25zdCB1aW50OF90KiBzcmNQdHIsCiAgICAgICAgIHVpbnQ4X3QqIGRlc3RQdHIsIGNvbnN0IHN0ZDo6dmVjdG9yPFN1YlNhbXBsZT4gc3ViU2FtcGxlcywKICAgICAgICAgc2l6ZV90KiBieXRlc0RlY3J5cHRlZE91dCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NYXBMb2NrKTsKIAorICAgIGlmIChnZXRNb2NrRXJyb3IoKSAhPSBTdGF0dXNfVjFfMjo6T0spIHsKKyAgICAgICAgcmV0dXJuIGdldE1vY2tFcnJvcigpOworICAgIH0KKwogICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtleUlkVmVjdG9yOwogICAgIGtleUlkVmVjdG9yLmNsZWFyKCk7CiAgICAga2V5SWRWZWN0b3IuaW5zZXJ0KGtleUlkVmVjdG9yLmVuZCgpLCBrZXlJZCwga2V5SWQgKyBrQmxvY2tTaXplKTsKICAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50OF90Piwgc3RkOjp2ZWN0b3I8dWludDhfdD4gPjo6aXRlcmF0b3IgaXRyOwogICAgIGl0ciA9IG1LZXlNYXAuZmluZChrZXlJZFZlY3Rvcik7CiAgICAgaWYgKGl0ciA9PSBtS2V5TWFwLmVuZCgpKSB7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OkVSUk9SX0RSTV9OT19MSUNFTlNFOworICAgICAgICByZXR1cm4gU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9OT19MSUNFTlNFOwogICAgIH0KIAogICAgIEFlc0N0ckRlY3J5cHRvciBkZWNyeXB0b3I7Ci0gICAgcmV0dXJuIGRlY3J5cHRvci5kZWNyeXB0KAorICAgIFN0YXR1cyBzdGF0dXMgPSBkZWNyeXB0b3IuZGVjcnlwdCgKICAgICAgICAgICAgIGl0ci0+c2Vjb25kIC8qa2V5Ki8sIGl2LCBzcmNQdHIsIGRlc3RQdHIsIHN1YlNhbXBsZXMsCiAgICAgICAgICAgICBzdWJTYW1wbGVzLnNpemUoKSwgYnl0ZXNEZWNyeXB0ZWRPdXQpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXNfVjFfMj4oc3RhdHVzKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvU2Vzc2lvbkxpYnJhcnkuY3BwIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uTGlicmFyeS5jcHAKaW5kZXggYjQzMTllNi4uOTlmYjMwZiAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uTGlicmFyeS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9TZXNzaW9uTGlicmFyeS5jcHAKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwpAQCAtNTksNyArNTksOCBAQAogCiAgICAgbVNlc3Npb25zLmluc2VydChzdGQ6OnBhaXI8c3RkOjp2ZWN0b3I8dWludDhfdD4sCiAgICAgICAgICAgICBzcDxTZXNzaW9uPiA+KHNlc3Npb25JZCwgbmV3IFNlc3Npb24oc2Vzc2lvbklkKSkpOwotICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzcDxTZXNzaW9uPiA+OjppdGVyYXRvciBpdHIgPSBtU2Vzc2lvbnMuZmluZChzZXNzaW9uSWQpOworICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzcDxTZXNzaW9uPiA+OjppdGVyYXRvciBpdHIgPQorICAgICAgICAgICAgbVNlc3Npb25zLmZpbmQoc2Vzc2lvbklkKTsKICAgICBpZiAoaXRyICE9IG1TZXNzaW9ucy5lbmQoKSkgewogICAgICAgICByZXR1cm4gaXRyLT5zZWNvbmQ7CiAgICAgfSBlbHNlIHsKQEAgLTcwLDcgKzcxLDggQEAKIHNwPFNlc3Npb24+IFNlc3Npb25MaWJyYXJ5OjpmaW5kU2Vzc2lvbigKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TZXNzaW9uc0xvY2spOwotICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzcDxTZXNzaW9uPiA+OjppdGVyYXRvciBpdHIgPSBtU2Vzc2lvbnMuZmluZChzZXNzaW9uSWQpOworICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBzcDxTZXNzaW9uPiA+OjppdGVyYXRvciBpdHIgPQorICAgICAgICAgICAgbVNlc3Npb25zLmZpbmQoc2Vzc2lvbklkKTsKICAgICBpZiAoaXRyICE9IG1TZXNzaW9ucy5lbmQoKSkgewogICAgICAgICByZXR1cm4gaXRyLT5zZWNvbmQ7CiAgICAgfSBlbHNlIHsKQEAgLTg0LDcgKzg2LDcgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5LnJjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmU4NTZhLi4wMDAwMDAwCi0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xLXNlcnZpY2UuY2xlYXJrZXkucmMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLXNlcnZpY2UgdmVuZG9yLmRybS1jbGVhcmtleS1oYWwtMS0xIC92ZW5kb3IvYmluL2h3L2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5Ci0gICAgY2xhc3MgaGFsCi0gICAgdXNlciBtZWRpYQotICAgIGdyb3VwIG1lZGlhIG1lZGlhZHJtCi0gICAgaW9wcmlvIHJ0IDQKLSAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLWxhenkuY2xlYXJrZXkucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmZDNkNwotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yLXNlcnZpY2UtbGF6eS5jbGVhcmtleS5yYwpAQCAtMCwwICsxLDE0IEBACitzZXJ2aWNlIHZlbmRvci5kcm0tY2xlYXJrZXktaGFsLTEtMiAvdmVuZG9yL2Jpbi9ody9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS1sYXp5LmNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMDo6SUNyeXB0b0ZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wOjpJRHJtRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjE6OklDcnlwdG9GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMTo6SURybUZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yOjpJQ3J5cHRvRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjI6OklEcm1GYWN0b3J5IGNsZWFya2V5CisgICAgZGlzYWJsZWQKKyAgICBvbmVzaG90CisgICAgY2xhc3MgaGFsCisgICAgdXNlciBtZWRpYQorICAgIGdyb3VwIG1lZGlhIG1lZGlhZHJtCisgICAgaW9wcmlvIHJ0IDQKKyAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2FuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMi1zZXJ2aWNlLmNsZWFya2V5LnJjIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmE2NjlkCi0tLSAvZGV2L251bGwKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleS5yYwpAQCAtMCwwICsxLDEyIEBACitzZXJ2aWNlIHZlbmRvci5kcm0tY2xlYXJrZXktaGFsLTEtMiAvdmVuZG9yL2Jpbi9ody9hbmRyb2lkLmhhcmR3YXJlLmRybUAxLjItc2VydmljZS5jbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjA6OklDcnlwdG9GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMDo6SURybUZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xOjpJQ3J5cHRvRmFjdG9yeSBjbGVhcmtleQorICAgIGludGVyZmFjZSBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjE6OklEcm1GYWN0b3J5IGNsZWFya2V5CisgICAgaW50ZXJmYWNlIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMjo6SUNyeXB0b0ZhY3RvcnkgY2xlYXJrZXkKKyAgICBpbnRlcmZhY2UgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4yOjpJRHJtRmFjdG9yeSBjbGVhcmtleQorICAgIGNsYXNzIGhhbAorICAgIHVzZXIgbWVkaWEKKyAgICBncm91cCBtZWRpYSBtZWRpYWRybQorICAgIGlvcHJpbyBydCA0CisgICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Flc0N0ckRlY3J5cHRvci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Flc0N0ckRlY3J5cHRvci5oCmluZGV4IDBjN2VmMjAuLjcyMWY0YzAgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9BZXNDdHJEZWNyeXB0b3IuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQWVzQ3RyRGVjcnlwdG9yLmgKQEAgLTIyLDcgKzIyLDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwpAQCAtNDIsNyArNDIsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CYXNlNjQuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CYXNlNjQuaAppbmRleCA0YTM4NWJkLi5lYzMwY2MxIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQmFzZTY0LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0Jhc2U2NC5oCkBAIC0yNSw3ICsyNSw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OnNwOwpAQCAtMzgsNyArMzgsNyBAQAogdm9pZCBlbmNvZGVCYXNlNjRVcmwoY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHN0ZDo6c3RyaW5nICpvdXQpOwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0J1ZmZlci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0J1ZmZlci5oCmluZGV4IDViYmIyOGEuLmM0OTdlMzcgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9CdWZmZXIuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQnVmZmVyLmgKQEAgLTI1LDcgKzI1LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CkBAIC01NCw3ICs1NCw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5RHJtUHJvcGVydGllcy5oCmluZGV4IGQ2NWIyNWMuLmI4M2NlNjkgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleURybVByb3BlcnRpZXMuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlEcm1Qcm9wZXJ0aWVzLmgKQEAgLTIyLDMwICsyMiw0MCBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZW5kb3JLZXkoInZlbmRvciIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtWZW5kb3JWYWx1ZSgiR29vZ2xlIik7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1ZlcnNpb25LZXkoInZlcnNpb24iKTsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVmVyc2lvblZhbHVlKCIxLjEiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrVmVyc2lvblZhbHVlKCIxLjIiKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrUGx1Z2luRGVzY3JpcHRpb25LZXkoImRlc2NyaXB0aW9uIik7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1BsdWdpbkRlc2NyaXB0aW9uVmFsdWUoIkNsZWFyS2V5IENETSIpOwogc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtBbGdvcml0aG1zS2V5KCJhbGdvcml0aG1zIik7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0FsZ29yaXRobXNWYWx1ZSgiIik7CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0xpc3RlbmVyVGVzdFN1cHBvcnRLZXkoImxpc3RlbmVyVGVzdFN1cHBvcnQiKTsKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrTGlzdGVuZXJUZXN0U3VwcG9ydFZhbHVlKCJ0cnVlIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0RybUVycm9yVGVzdEtleSgiZHJtRXJyb3JUZXN0Iik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0RybUVycm9yVGVzdFZhbHVlKCIiKTsKK3N0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrUmVzb3VyY2VDb250ZW50aW9uVmFsdWUoInJlc291cmNlQ29udGVudGlvbiIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtMb3N0U3RhdGVWYWx1ZSgibG9zdFN0YXRlIik7CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0ZyYW1lVG9vTGFyZ2VWYWx1ZSgiZnJhbWVUb29MYXJnZSIpOworc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nIGtJbnZhbGlkU3RhdGVWYWx1ZSgiaW52YWxpZFN0YXRlIik7CiAKIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrRGV2aWNlSWRLZXkoImRldmljZUlkIik7CiBzdGF0aWMgY29uc3QgdWludDhfdCBrVGVzdERldmljZUlkRGF0YVtdID0KICAgICAgICAgezB4MCwgMHgxLCAweDIsIDB4MywgMHg0LCAweDUsIDB4NiwgMHg3LAogICAgICAgICAgMHg4LCAweDksIDB4YSwgMHhiLCAweGMsIDB4ZCwgMHhlLCAweGZ9OworCisvLyBzZXR0YWJsZSBieXRlIGFycmF5IHByb3BlcnR5CitzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga0NsaWVudElkS2V5KCJjbGllbnRJZCIpOworCiAvLyBUT0RPIHN0dWIgb3V0IG1ldHJpY3MgZm9yIG53CiBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga01ldHJpY3NLZXkoIm1ldHJpY3MiKTsKIHN0YXRpYyBjb25zdCB1aW50OF90IGtNZXRyaWNzRGF0YVtdID0geyAwIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlUeXBlcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NsZWFyS2V5VHlwZXMuaAppbmRleCA0NmNiNWU0Li4wM2M0MzRlIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ2xlYXJLZXlUeXBlcy5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DbGVhcktleVR5cGVzLmgKQEAgLTE3LDE3ICsxNywxOCBAQAogI2lmbmRlZiBDTEVBUktFWV9NQUNST1NfSF8KICNkZWZpbmUgQ0xFQVJLRVlfTUFDUk9TX0hfCiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvdHlwZXMuaD4KIAogI2luY2x1ZGUgPG1hcD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlWYWx1ZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6U2VjdXJpdHlMZXZlbDsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwogCiBjb25zdCB1aW50OF90IGtCbG9ja1NpemUgPSAxNjsgLy9BRVNfQkxPQ0tfU0laRTsKQEAgLTQ3LDcgKzQ4LDcgQEAKICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgVHlwZU5hbWUmKSA9IGRlbGV0ZTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcmVhdGVQbHVnaW5GYWN0b3JpZXMuaAppbmRleCA5OTUyMDI3Li42MzY4ZjNkIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3JlYXRlUGx1Z2luRmFjdG9yaWVzLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyZWF0ZVBsdWdpbkZhY3Rvcmllcy5oCkBAIC0xNywxNyArMTcsMTcgQEAKICNpZm5kZWYgQ0xFQVJLRVlfQ1JFQVRFX1BMVUdJTl9GQUNUT1JJRVNfSF8KICNkZWZpbmUgQ0xFQVJLRVlfQ1JFQVRFX1BMVUdJTl9GQUNUT1JJRVNfSF8KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JQ3J5cHRvRmFjdG9yeS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JQ3J5cHRvRmFjdG9yeS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtRmFjdG9yeS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklDcnlwdG9GYWN0b3J5OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpJRHJtRmFjdG9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklEcm1GYWN0b3J5OwogCiBleHRlcm4gIkMiIHsKICAgICBJRHJtRmFjdG9yeSogY3JlYXRlRHJtRmFjdG9yeSgpOwpAQCAtMzUsNyArMzUsNyBAQAogfQogCiB9ICAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gIC8vIG5hbWVzcGFjZSBWMV8xCit9ICAvLyBuYW1lc3BhY2UgVjFfMgogfSAgLy8gbmFtZXNwYWNlIGRybQogfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b0ZhY3RvcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9GYWN0b3J5LmgKaW5kZXggMTc1YWI3Ni4uMjAzYmIyZCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b0ZhY3RvcnkuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvRmFjdG9yeS5oCkBAIC0xOCwxNyArMTgsMTcgQEAKICNkZWZpbmUgQ0xFQVJLRVlfQ1JZUFRPX0ZBQ1RPUllfSF8KIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JQ3J5cHRvUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lDcnlwdG9GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lDcnlwdG9GYWN0b3J5Lmg+CiAKICNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SUNyeXB0b0ZhY3Rvcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklDcnlwdG9GYWN0b3J5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpJQ3J5cHRvUGx1Z2luOwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwpAQCAtNTIsNyArNTIsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9DcnlwdG9QbHVnaW4uaAppbmRleCA2YTczODA2Li44NjgwZjBjIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvQ3J5cHRvUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0NyeXB0b1BsdWdpbi5oCkBAIC0xNyw3ICsxNyw3IEBACiAjaWZuZGVmIENMRUFSS0VZX0NSWVBUT19QTFVHSU5fSF8KICNkZWZpbmUgQ0xFQVJLRVlfQ1JZUFRPX1BMVUdJTl9IXwogCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lDcnlwdG9QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSUNyeXB0b1BsdWdpbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tZW1vcnkvMS4wL0lNZW1vcnkuaD4KIAogI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKQEAgLTMyLDE2ICszMiwxNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpEZXN0aW5hdGlvbkJ1ZmZlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SUNyeXB0b1BsdWdpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6TW9kZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6UGF0dGVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U2hhcmVkQnVmZmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdGF0dXM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlN1YlNhbXBsZTsKK25hbWVzcGFjZSBkcm0gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm07Cit1c2luZyBkcm06OlYxXzA6OkRlc3RpbmF0aW9uQnVmZmVyOwordXNpbmcgZHJtOjpWMV8wOjpNb2RlOwordXNpbmcgZHJtOjpWMV8wOjpQYXR0ZXJuOwordXNpbmcgZHJtOjpWMV8wOjpTaGFyZWRCdWZmZXI7Cit1c2luZyBkcm06OlYxXzA6OlN0YXR1czsKK3VzaW5nIGRybTo6VjFfMDo6U3ViU2FtcGxlOworCiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKQEAgLTUxLDcgKzUyLDkgQEAKIHVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OwogdXNpbmcgOjphbmRyb2lkOjpzcDsKIAotc3RydWN0IENyeXB0b1BsdWdpbiA6IHB1YmxpYyBJQ3J5cHRvUGx1Z2luIHsKK3R5cGVkZWYgZHJtOjpWMV8yOjpTdGF0dXMgU3RhdHVzX1YxXzI7CisKK3N0cnVjdCBDcnlwdG9QbHVnaW4gOiBwdWJsaWMgZHJtOjpWMV8yOjpJQ3J5cHRvUGx1Z2luIHsKICAgICBleHBsaWNpdCBDcnlwdG9QbHVnaW4oY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCkgewogICAgICAgICBtSW5pdFN0YXR1cyA9IHNldE1lZGlhRHJtU2Vzc2lvbihzZXNzaW9uSWQpOwogICAgIH0KQEAgLTgwLDYgKzgzLDE4IEBACiAgICAgICAgICAgICBjb25zdCBEZXN0aW5hdGlvbkJ1ZmZlciYgZGVzdGluYXRpb24sCiAgICAgICAgICAgICBkZWNyeXB0X2NiIF9oaWRsX2NiKTsKIAorICAgIFJldHVybjx2b2lkPiBkZWNyeXB0XzFfMigKKyAgICAgICAgICAgIGJvb2wgc2VjdXJlLAorICAgICAgICAgICAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCBLRVlfSURfU0laRT4mIGtleUlkLAorICAgICAgICAgICAgY29uc3QgaGlkbF9hcnJheTx1aW50OF90LCBLRVlfSVZfU0laRT4mIGl2LAorICAgICAgICAgICAgTW9kZSBtb2RlLAorICAgICAgICAgICAgY29uc3QgUGF0dGVybiYgcGF0dGVybiwKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFN1YlNhbXBsZT4mIHN1YlNhbXBsZXMsCisgICAgICAgICAgICBjb25zdCBTaGFyZWRCdWZmZXImIHNvdXJjZSwKKyAgICAgICAgICAgIHVpbnQ2NF90IG9mZnNldCwKKyAgICAgICAgICAgIGNvbnN0IERlc3RpbmF0aW9uQnVmZmVyJiBkZXN0aW5hdGlvbiwKKyAgICAgICAgICAgIGRlY3J5cHRfMV8yX2NiIF9oaWRsX2NiKTsKKwogICAgIFJldHVybjx2b2lkPiBzZXRTaGFyZWRCdWZmZXJCYXNlKGNvbnN0IGhpZGxfbWVtb3J5JiBiYXNlLAogICAgICAgICAgICAgdWludDMyX3QgYnVmZmVySWQpOwogCkBAIC05Niw3ICsxMTEsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9EZXZpY2VGaWxlcy5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RldmljZUZpbGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0YWU1OQotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9EZXZpY2VGaWxlcy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8vIENvcHlyaWdodCAyMDE4IEdvb2dsZSBMTEMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuIFRoaXMgZmlsZSBhbmQgcHJvcHJpZXRhcnkKKy8vIHNvdXJjZSBjb2RlIG1heSBvbmx5IGJlIHVzZWQgYW5kIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXaWRldmluZSBNYXN0ZXIKKy8vIExpY2Vuc2UgQWdyZWVtZW50LgorLy8KKyNpZm5kZWYgQ0xFQVJLRVlfREVWSUNFX0ZJTEVTX0hfCisjZGVmaW5lIENMRUFSS0VZX0RFVklDRV9GSUxFU19IXworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJwcm90b3MvRGV2aWNlRmlsZXMucGIuaCIKKyNpbmNsdWRlICJDbGVhcktleVR5cGVzLmgiCisjaW5jbHVkZSAiTWVtb3J5RmlsZVN5c3RlbS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCitjbGFzcyBEZXZpY2VGaWxlcyB7CisgcHVibGljOgorICAgIHR5cGVkZWYgZW51bSB7CisgICAgICAgIGtMaWNlbnNlU3RhdGVVbmtub3duLAorICAgICAgICBrTGljZW5zZVN0YXRlQWN0aXZlLAorICAgICAgICBrTGljZW5zZVN0YXRlUmVsZWFzaW5nLAorICAgIH0gTGljZW5zZVN0YXRlOworCisgICAgRGV2aWNlRmlsZXMoKSB7fTsKKyAgICB2aXJ0dWFsIH5EZXZpY2VGaWxlcygpIHt9OworCisgICAgdmlydHVhbCBib29sIFN0b3JlTGljZW5zZShjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQsIExpY2Vuc2VTdGF0ZSBzdGF0ZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlSZXNwb25zZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgUmV0cmlldmVMaWNlbnNlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zZXRfaWQsIExpY2Vuc2VTdGF0ZSogc3RhdGUsIHN0ZDo6c3RyaW5nKiBvZmZsaW5lTGljZW5zZSk7CisKKyAgICB2aXJ0dWFsIGJvb2wgTGljZW5zZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpOworCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTGlzdExpY2Vuc2VzKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIGJvb2wgRGVsZXRlTGljZW5zZShjb25zdCBzdGQ6OnN0cmluZyYga2V5U2V0SWQpOworCisgICAgdmlydHVhbCBib29sIERlbGV0ZUFsbExpY2Vuc2VzKCk7CisKKyBwcml2YXRlOgorICAgIGJvb2wgRmlsZUV4aXN0cyhjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCkgY29uc3Q7CisgICAgc3NpemVfdCBHZXRGaWxlU2l6ZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpIGNvbnN0OworICAgIGJvb2wgUmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpOworCisgICAgYm9vbCBSZXRyaWV2ZUhhc2hlZEZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBPZmZsaW5lRmlsZSogZGVTZXJpYWxpemVkRmlsZSk7CisgICAgYm9vbCBTdG9yZUZpbGVSYXcoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VyaWFsaXplZEZpbGUpOworICAgIGJvb2wgU3RvcmVGaWxlV2l0aEhhc2goY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lLCBjb25zdCBzdGQ6OnN0cmluZyYgc2VyaWFsaXplZEZpbGUpOworCisgICAgTWVtb3J5RmlsZVN5c3RlbSBtRmlsZUhhbmRsZTsKKworICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihEZXZpY2VGaWxlcyk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENMRUFSS0VZX0RFVklDRV9GSUxFU19IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybUZhY3RvcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1GYWN0b3J5LmgKaW5kZXggNmY1ODE5NS4uNGNhODU2ZCAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybUZhY3RvcnkuaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtRmFjdG9yeS5oCkBAIC0xNywxNSArMTcsMTUgQEAKICNpZm5kZWYgQ0xFQVJLRVlfRFJNX0ZBQ1RPUllfSF8KICNkZWZpbmUgQ0xFQVJLRVlfRFJNX0ZBQ1RPUllfSF8KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMS9JRHJtUGx1Z2luLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4xL0lEcm1GYWN0b3J5Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW4uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjIvSURybUZhY3RvcnkuaD4KIAogI2luY2x1ZGUgIkNsZWFyS2V5VHlwZXMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKQEAgLTM5LDYgKzM5LDEwIEBACiAgICAgUmV0dXJuPGJvb2w+IGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+JiB1dWlkKQogICAgICAgICAgICAgb3ZlcnJpZGU7CiAKKyAgICBSZXR1cm48Ym9vbD4gaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWRfMV8yKGNvbnN0IGhpZGxfYXJyYXk8dWludDhfdCwgMTY+JiB1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG1pbWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdXJpdHlMZXZlbCBsZXZlbCkgb3ZlcnJpZGU7CisKICAgICBSZXR1cm48Ym9vbD4gaXNDb250ZW50VHlwZVN1cHBvcnRlZChjb25zdCBoaWRsX3N0cmluZyAmbWltZVR5cGUpCiAgICAgICAgICAgICBvdmVycmlkZTsKIApAQCAtNTIsNyArNTYsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Ecm1QbHVnaW4uaAppbmRleCBmYjA2OTVhLi5mMjk0ZDRkIDEwMDY0NAotLS0gYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvRHJtUGx1Z2luLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0RybVBsdWdpbi5oCkBAIC0xNywzMiArMTcsNDIgQEAKICNpZm5kZWYgQ0xFQVJLRVlfRFJNX1BMVUdJTl9IXwogI2RlZmluZSBDTEVBUktFWV9EUk1fUExVR0lOX0hfCiAKLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybVBsdWdpbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMi9JRHJtUGx1Z2luLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4yL0lEcm1QbHVnaW5MaXN0ZW5lci5oPgogCi0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RkaW8uaD4KIAorI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KKworI2luY2x1ZGUgIkRldmljZUZpbGVzLmgiCiAjaW5jbHVkZSAiU2Vzc2lvbkxpYnJhcnkuaCIKICNpbmNsdWRlICJVdGlscy5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkV2ZW50VHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6SURybVBsdWdpbkxpc3RlbmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlTdGF0dXM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVR5cGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OktleVZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTZWN1cmVTdG9wOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTZWN1cmVTdG9wSWQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OlNlc3Npb25JZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpEcm1NZXRyaWNHcm91cDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SURybVBsdWdpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6S2V5UmVxdWVzdFR5cGU7CituYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwordXNpbmcgZHJtOjpWMV8wOjpFdmVudFR5cGU7Cit1c2luZyBkcm06OlYxXzA6OklEcm1QbHVnaW5MaXN0ZW5lcjsKK3VzaW5nIGRybTo6VjFfMDo6S2V5UmVxdWVzdFR5cGU7Cit1c2luZyBkcm06OlYxXzA6OktleVN0YXR1czsKK3VzaW5nIGRybTo6VjFfMDo6S2V5VHlwZTsKK3VzaW5nIGRybTo6VjFfMDo6S2V5VmFsdWU7Cit1c2luZyBkcm06OlYxXzA6OlNlY3VyZVN0b3A7Cit1c2luZyBkcm06OlYxXzA6OlNlY3VyZVN0b3BJZDsKK3VzaW5nIGRybTo6VjFfMDo6U2Vzc2lvbklkOwordXNpbmcgZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyBkcm06OlYxXzE6OkRybU1ldHJpY0dyb3VwOwordXNpbmcgZHJtOjpWMV8xOjpIZGNwTGV2ZWw7Cit1c2luZyBkcm06OlYxXzE6OlNlY3VyZVN0b3BSZWxlYXNlOwordXNpbmcgZHJtOjpWMV8xOjpTZWN1cml0eUxldmVsOwordXNpbmcgZHJtOjpWMV8yOjpJRHJtUGx1Z2luOwordXNpbmcgZHJtOjpWMV8yOjpLZXlTZXRJZDsKK3VzaW5nIGRybTo6VjFfMjo6T2ZmbGluZUxpY2Vuc2VTdGF0ZTsKIAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKQEAgLTUwLDEwICs2MCwxNiBAQAogdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CiAKK3R5cGVkZWYgZHJtOjpWMV8xOjpLZXlSZXF1ZXN0VHlwZSBLZXlSZXF1ZXN0VHlwZV9WMV8xOwordHlwZWRlZiBkcm06OlYxXzI6OklEcm1QbHVnaW5MaXN0ZW5lciBJRHJtUGx1Z2luTGlzdGVuZXJfVjFfMjsKK3R5cGVkZWYgZHJtOjpWMV8yOjpLZXlTdGF0dXMgS2V5U3RhdHVzX1YxXzI7Cit0eXBlZGVmIGRybTo6VjFfMjo6U3RhdHVzIFN0YXR1c19WMV8yOwordHlwZWRlZiBkcm06OlYxXzI6OkhkY3BMZXZlbCBIZGNwTGV2ZWxfVjFfMjsKKwogc3RydWN0IERybVBsdWdpbiA6IHB1YmxpYyBJRHJtUGx1Z2luIHsKICAgICBleHBsaWNpdCBEcm1QbHVnaW4oU2Vzc2lvbkxpYnJhcnkqIHNlc3Npb25MaWJyYXJ5KTsKIAotICAgIHZpcnR1YWwgfkRybVBsdWdpbigpIHt9CisgICAgdmlydHVhbCB+RHJtUGx1Z2luKCkgeyBtRmlsZUhhbmRsZS5EZWxldGVBbGxMaWNlbnNlcygpOyB9CiAKICAgICBSZXR1cm48dm9pZD4gb3BlblNlc3Npb24ob3BlblNlc3Npb25fY2IgX2hpZGxfY2IpIG92ZXJyaWRlOwogICAgIFJldHVybjx2b2lkPiBvcGVuU2Vzc2lvbl8xXzEoU2VjdXJpdHlMZXZlbCBzZWN1cml0eUxldmVsLApAQCAtNzcsNiArOTMsMTQgQEAKICAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5VmFsdWU+JiBvcHRpb25hbFBhcmFtZXRlcnMsCiAgICAgICAgIGdldEtleVJlcXVlc3RfMV8xX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKIAorICAgIFJldHVybjx2b2lkPiBnZXRLZXlSZXF1ZXN0XzFfMigKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5pdERhdGEsCisgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgS2V5VHlwZSBrZXlUeXBlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG9wdGlvbmFsUGFyYW1ldGVycywKKyAgICAgICAgZ2V0S2V5UmVxdWVzdF8xXzJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCiAgICAgUmV0dXJuPHZvaWQ+IHByb3ZpZGVLZXlSZXNwb25zZSgKICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNjb3BlLAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgcmVzcG9uc2UsCkBAIC05MSwxMyArMTE1LDcgQEAKIAogICAgIFJldHVybjxTdGF0dXM+IHJlc3RvcmVLZXlzKAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAotICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5U2V0SWQpIHsKLQotICAgICAgICBpZiAoc2Vzc2lvbklkLnNpemUoKSA9PSAwIHx8IGtleVNldElkLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RhdHVzOjpCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEU7Ci0gICAgfQorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYga2V5U2V0SWQpIG92ZXJyaWRlOwogCiAgICAgUmV0dXJuPHZvaWQ+IHF1ZXJ5S2V5U3RhdHVzKAogICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLApAQCAtMTE1LDYgKzEzMywxOCBAQAogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAorICAgIFJldHVybjx2b2lkPiBnZXRQcm92aXNpb25SZXF1ZXN0XzFfMigKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGNlcnRpZmljYXRlVHlwZSwKKyAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIGNlcnRpZmljYXRlQXV0aG9yaXR5LAorICAgICAgICBnZXRQcm92aXNpb25SZXF1ZXN0XzFfMl9jYiBfaGlkbF9jYikgeworICAgICAgICBVTlVTRUQoY2VydGlmaWNhdGVUeXBlKTsKKyAgICAgICAgVU5VU0VEKGNlcnRpZmljYXRlQXV0aG9yaXR5KTsKKworICAgICAgICBoaWRsX3N0cmluZyBkZWZhdWx0VXJsOworICAgICAgICBfaGlkbF9jYihTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0NBTk5PVF9IQU5ETEUsIGhpZGxfdmVjPHVpbnQ4X3Q+KCksIGRlZmF1bHRVcmwpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKwogICAgIFJldHVybjx2b2lkPiBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoCiAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiByZXNwb25zZSwKICAgICAgICAgcHJvdmlkZVByb3Zpc2lvblJlc3BvbnNlX2NiIF9oaWRsX2NiKSB7CkBAIC0xMzQsNiArMTY0LDEzIEBACiAgICAgICAgIHJldHVybiBWb2lkKCk7CiAgICAgfQogCisgICAgUmV0dXJuPHZvaWQ+IGdldEhkY3BMZXZlbHNfMV8yKGdldEhkY3BMZXZlbHNfMV8yX2NiIF9oaWRsX2NiKSB7CisgICAgICAgIEhkY3BMZXZlbF9WMV8yIGNvbm5lY3RlZExldmVsID0gSGRjcExldmVsX1YxXzI6OkhEQ1BfTk9ORTsKKyAgICAgICAgSGRjcExldmVsX1YxXzIgbWF4TGV2ZWwgPSBIZGNwTGV2ZWxfVjFfMjo6SERDUF9OT19PVVRQVVQ7CisgICAgICAgIF9oaWRsX2NiKFN0YXR1c19WMV8yOjpPSywgY29ubmVjdGVkTGV2ZWwsIG1heExldmVsKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKICAgICBSZXR1cm48dm9pZD4gZ2V0TnVtYmVyT2ZTZXNzaW9ucyhnZXROdW1iZXJPZlNlc3Npb25zX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKIAogICAgIFJldHVybjx2b2lkPiBnZXRTZWN1cml0eUxldmVsKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCkBAIC0xNDEsNiArMTc4LDEzIEBACiAKICAgICBSZXR1cm48dm9pZD4gZ2V0TWV0cmljcyhnZXRNZXRyaWNzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKIAorICAgIFJldHVybjx2b2lkPiBnZXRPZmZsaW5lTGljZW5zZUtleVNldElkcyhnZXRPZmZsaW5lTGljZW5zZUtleVNldElkc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48U3RhdHVzPiByZW1vdmVPZmZsaW5lTGljZW5zZShjb25zdCBLZXlTZXRJZCAma2V5U2V0SWQpIG92ZXJyaWRlOworCisgICAgUmV0dXJuPHZvaWQ+IGdldE9mZmxpbmVMaWNlbnNlU3RhdGUoY29uc3QgS2V5U2V0SWQgJmtleVNldElkLAorICAgICAgICAgICAgZ2V0T2ZmbGluZUxpY2Vuc2VTdGF0ZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKICAgICBSZXR1cm48dm9pZD4gZ2V0UHJvcGVydHlTdHJpbmcoCiAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lLAogICAgICAgICBnZXRQcm9wZXJ0eVN0cmluZ19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CkBAIC0yNDgsMTIgKzI5MiwxNyBAQAogCiAgICAgUmV0dXJuPHZvaWQ+IHNldExpc3RlbmVyKGNvbnN0IHNwPElEcm1QbHVnaW5MaXN0ZW5lcj4mIGxpc3RlbmVyKSB7CiAgICAgICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOworICAgICAgICBtTGlzdGVuZXJWMV8yID0gSURybVBsdWdpbkxpc3RlbmVyX1YxXzI6OmNhc3RGcm9tKGxpc3RlbmVyKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9OwogCi0gICAgUmV0dXJuPHZvaWQ+IHNlbmRFdmVudChFdmVudFR5cGUgZXZlbnRUeXBlLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgIFJldHVybjx2b2lkPiBzZW5kRXZlbnQoCisgICAgICAgICAgICBFdmVudFR5cGUgZXZlbnRUeXBlLAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkYXRhKSB7Ci0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgeworICAgICAgICBpZiAobUxpc3RlbmVyVjFfMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJWMV8yLT5zZW5kRXZlbnQoZXZlbnRUeXBlLCBzZXNzaW9uSWQsIGRhdGEpOworICAgICAgICB9IGVsc2UgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBtTGlzdGVuZXItPnNlbmRFdmVudChldmVudFR5cGUsIHNlc3Npb25JZCwgZGF0YSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HRSgiTnVsbCBldmVudCBsaXN0ZW5lciwgZXZlbnQgbm90IHNlbnQiKTsKQEAgLTI2MSw4ICszMTAsMTIgQEAKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9CiAKLSAgICBSZXR1cm48dm9pZD4gc2VuZEV4cGlyYXRpb25VcGRhdGUoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwgaW50NjRfdCBleHBpcnlUaW1lSW5NUykgewotICAgICAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICBSZXR1cm48dm9pZD4gc2VuZEV4cGlyYXRpb25VcGRhdGUoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgaW50NjRfdCBleHBpcnlUaW1lSW5NUykgeworICAgICAgICBpZiAobUxpc3RlbmVyVjFfMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJWMV8yLT5zZW5kRXhwaXJhdGlvblVwZGF0ZShzZXNzaW9uSWQsIGV4cGlyeVRpbWVJbk1TKTsKKyAgICAgICAgfSBlbHNlIGlmIChtTGlzdGVuZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgbUxpc3RlbmVyLT5zZW5kRXhwaXJhdGlvblVwZGF0ZShzZXNzaW9uSWQsIGV4cGlyeVRpbWVJbk1TKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCJOdWxsIGV2ZW50IGxpc3RlbmVyLCBldmVudCBub3Qgc2VudCIpOwpAQCAtMjcwLDkgKzMyMywxMiBAQAogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAotICAgIFJldHVybjx2b2lkPiBzZW5kS2V5c0NoYW5nZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgIFJldHVybjx2b2lkPiBzZW5kS2V5c0NoYW5nZSgKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsCiAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlTdGF0dXM+JiBrZXlTdGF0dXNMaXN0LCBib29sIGhhc05ld1VzYWJsZUtleSkgewotICAgICAgICBpZiAobUxpc3RlbmVyICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKG1MaXN0ZW5lclYxXzIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUxpc3RlbmVyVjFfMi0+c2VuZEtleXNDaGFuZ2Uoc2Vzc2lvbklkLCBrZXlTdGF0dXNMaXN0LCBoYXNOZXdVc2FibGVLZXkpOworICAgICAgICB9IGVsc2UgaWYgKG1MaXN0ZW5lciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBtTGlzdGVuZXItPnNlbmRLZXlzQ2hhbmdlKHNlc3Npb25JZCwga2V5U3RhdHVzTGlzdCwgaGFzTmV3VXNhYmxlS2V5KTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dFKCJOdWxsIGV2ZW50IGxpc3RlbmVyLCBldmVudCBub3Qgc2VudCIpOwpAQCAtMjgwLDYgKzMzNiwyMyBAQAogICAgICAgICByZXR1cm4gVm9pZCgpOwogICAgIH0KIAorICAgIFJldHVybjx2b2lkPiBzZW5kS2V5c0NoYW5nZV8xXzIoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8S2V5U3RhdHVzX1YxXzI+JiBrZXlTdGF0dXNMaXN0LCBib29sIGhhc05ld1VzYWJsZUtleSkgeworICAgICAgICBpZiAobUxpc3RlbmVyVjFfMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJWMV8yLT5zZW5kS2V5c0NoYW5nZV8xXzIoc2Vzc2lvbklkLCBrZXlTdGF0dXNMaXN0LCBoYXNOZXdVc2FibGVLZXkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgUmV0dXJuPHZvaWQ+IHNlbmRTZXNzaW9uTG9zdFN0YXRlKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCkgeworICAgICAgICBpZiAobUxpc3RlbmVyVjFfMiAhPSBOVUxMKSB7CisgICAgICAgICAgICBtTGlzdGVuZXJWMV8yLT5zZW5kU2Vzc2lvbkxvc3RTdGF0ZShzZXNzaW9uSWQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCiAgICAgUmV0dXJuPHZvaWQ+IGdldFNlY3VyZVN0b3BzKGdldFNlY3VyZVN0b3BzX2NiIF9oaWRsX2NiKTsKIAogICAgIFJldHVybjx2b2lkPiBnZXRTZWN1cmVTdG9wKGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZWN1cmVTdG9wSWQsCkBAIC0zMDAsMTggKzM3MywxOSBAQAogcHJpdmF0ZToKICAgICB2b2lkIGluaXRQcm9wZXJ0aWVzKCk7CiAgICAgdm9pZCBpbnN0YWxsU2VjdXJlU3RvcChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkKTsKKyAgICBib29sIG1ha2VLZXlTZXRJZChzdGQ6OnN0cmluZyoga2V5U2V0SWQpOwogICAgIHZvaWQgc2V0UGxheVBvbGljeSgpOwogCiAgICAgUmV0dXJuPFN0YXR1cz4gc2V0U2VjdXJpdHlMZXZlbChjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAogICAgICAgICAgICAgU2VjdXJpdHlMZXZlbCBsZXZlbCk7CiAKLSAgICBTdGF0dXMgZ2V0S2V5UmVxdWVzdENvbW1vbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCisgICAgU3RhdHVzX1YxXzIgZ2V0S2V5UmVxdWVzdENvbW1vbihjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2NvcGUsCiAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgaW5pdERhdGEsCiAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbWltZVR5cGUsCiAgICAgICAgICAgICBLZXlUeXBlIGtleVR5cGUsCiAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxLZXlWYWx1ZT4mIG9wdGlvbmFsUGFyYW1ldGVycywKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpyZXF1ZXN0LAotICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGUgKmdldEtleVJlcXVlc3RUeXBlLAorICAgICAgICAgICAgS2V5UmVxdWVzdFR5cGVfVjFfMSAqZ2V0S2V5UmVxdWVzdFR5cGUsCiAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqZGVmYXVsdFVybCk7CiAKICAgICBzdHJ1Y3QgQ2xlYXJrZXlTZWN1cmVTdG9wIHsKQEAgLTMyMywxOSArMzk3LDMxIEBACiAgICAgc3RkOjp2ZWN0b3I8S2V5VmFsdWU+IG1QbGF5UG9saWN5OwogICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gbVN0cmluZ1Byb3BlcnRpZXM7CiAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ID4gbUJ5dGVBcnJheVByb3BlcnRpZXM7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ID4gbVJlbGVhc2VLZXlzTWFwOwogICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+LCBTZWN1cml0eUxldmVsPiBtU2VjdXJpdHlMZXZlbDsKICAgICBzcDxJRHJtUGx1Z2luTGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzcDxJRHJtUGx1Z2luTGlzdGVuZXJfVjFfMj4gbUxpc3RlbmVyVjFfMjsKICAgICBTZXNzaW9uTGlicmFyeSAqbVNlc3Npb25MaWJyYXJ5OwogICAgIGludDY0X3QgbU9wZW5TZXNzaW9uT2tDb3VudDsKICAgICBpbnQ2NF90IG1DbG9zZVNlc3Npb25Pa0NvdW50OwogICAgIGludDY0X3QgbUNsb3NlU2Vzc2lvbk5vdE9wZW5lZENvdW50OwogICAgIHVpbnQzMl90IG1OZXh0U2VjdXJlU3RvcElkOwogCisgICAgLy8gc2V0IGJ5IHByb3BlcnR5IHRvIG1vY2sgZXJyb3Igc2NlbmFyaW9zCisgICAgU3RhdHVzX1YxXzIgbU1vY2tFcnJvcjsKKworICAgIHZvaWQgcHJvY2Vzc01vY2tFcnJvcihjb25zdCBzcDxTZXNzaW9uPiAmc2Vzc2lvbikgeworICAgICAgICBzZXNzaW9uLT5zZXRNb2NrRXJyb3IobU1vY2tFcnJvcik7CisgICAgICAgIG1Nb2NrRXJyb3IgPSBTdGF0dXNfVjFfMjo6T0s7CisgICAgfQorCisgICAgRGV2aWNlRmlsZXMgbUZpbGVIYW5kbGU7CisKICAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR05fQU5EX05FVyhEcm1QbHVnaW4pOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Jbml0RGF0YVBhcnNlci5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0luaXREYXRhUGFyc2VyLmgKaW5kZXggMzE4OWM0YS4uODg5ZjUxMSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0luaXREYXRhUGFyc2VyLmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0luaXREYXRhUGFyc2VyLmgKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwpAQCAtMzQsNyArMzQsOCBAQAogICAgIEluaXREYXRhUGFyc2VyKCkge30KIAogICAgIFN0YXR1cyBwYXJzZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgaW5pdERhdGEsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgICAgIFYxXzA6OktleVR5cGUga2V5VHlwZSwKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBsaWNlbnNlUmVxdWVzdCk7CiAKIHByaXZhdGU6CkBAIC00MywxMiArNDQsMTIgQEAKICAgICBTdGF0dXMgcGFyc2VQc3NoKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0RGF0YSwKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IHVpbnQ4X3QqPioga2V5SWRzKTsKIAotICAgIHN0ZDo6c3RyaW5nIGdlbmVyYXRlUmVxdWVzdCgKKyAgICBzdGQ6OnN0cmluZyBnZW5lcmF0ZVJlcXVlc3QoVjFfMDo6S2V5VHlwZSBrZXlUeXBlLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgdWludDhfdCo+JiBrZXlJZHMpOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Kc29uV2ViS2V5LmggYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvSnNvbldlYktleS5oCmluZGV4IDRhYjAzNGMuLmU1NzQ3MGMgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9Kc29uV2ViS2V5LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL0pzb25XZWJLZXkuaApAQCAtMjMsNyArMjMsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogbmFtZXNwYWNlIGhhcmR3YXJlIHsKIG5hbWVzcGFjZSBkcm0gewotbmFtZXNwYWNlIFYxXzEgeworbmFtZXNwYWNlIFYxXzIgewogbmFtZXNwYWNlIGNsZWFya2V5IHsKIAogY2xhc3MgSnNvbldlYktleSB7CkBAIC01NCw3ICs1NCw3IEBACiB9OwogCiB9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQotfSAvLyBuYW1lc3BhY2UgVjFfMQorfSAvLyBuYW1lc3BhY2UgVjFfMgogfSAvLyBuYW1lc3BhY2UgZHJtCiB9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL01lbW9yeUZpbGVTeXN0ZW0uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNkOWZkNgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9NZW1vcnlGaWxlU3lzdGVtLmgKQEAgLTAsMCArMSw2OCBAQAorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBmaWxlIGFuZCBwcm9wcmlldGFyeQorLy8gc291cmNlIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFdpZGV2aW5lIE1hc3RlcgorLy8gTGljZW5zZSBBZ3JlZW1lbnQuCisvLworI2lmbmRlZiBDTEVBUktFWV9NRU1PUllfRklMRV9TWVNURU1fSF8KKyNkZWZpbmUgQ0xFQVJLRVlfTUVNT1JZX0ZJTEVfU1lTVEVNX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiQ2xlYXJLZXlUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIGRybSB7CituYW1lc3BhY2UgVjFfMiB7CituYW1lc3BhY2UgY2xlYXJrZXkgeworCisvLyBVc2luZyBhbmRyb2lkIGZpbGUgc3lzdGVtIHJlcXVpcmVzIGNsZWFya2V5IHBsdWdpbiB0byB1cGRhdGUKKy8vIGl0cyBzZXBvbGljeS4gSG93ZXZlciwgd2UgYXJlIHVuYWJsZSB0byB1cGRhdGUgc2Vwb2xpY3kgZm9yCisvLyBvbGRlciB2ZW5kb3IgcGFydGl0aW9ucy4gVG8gcHJvdmlkZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LAorLy8gY2xlYXJrZXkgcGx1Z2luIGltcGxlbWVudHMgYSB2ZXJ5IHNpbXBsZSBmaWxlIHN5c3RlbSBpbiBtZW1vcnkuCisvLyBUaGlzIG1lbW9yeSBmaWxlIHN5c3RlbSBkb2VzIG5vdCBzdXBwb3J0IGRpcmVjdG9yeSBzdHJ1Y3R1cmUuCitjbGFzcyBNZW1vcnlGaWxlU3lzdGVtIHsKKyBwdWJsaWM6CisgICAgc3RydWN0IE1lbW9yeUZpbGUgeworICAgICAgICBzdGQ6OnN0cmluZyBmaWxlTmFtZTsgIC8vIGV4Y2x1ZGVzIHBhdGgKKyAgICAgICAgc3RkOjpzdHJpbmcgY29udGVudDsKKyAgICAgICAgc2l6ZV90IGZpbGVTaXplOworCisgICAgICAgIHN0ZDo6c3RyaW5nIGdldENvbnRlbnQoKSBjb25zdCB7IHJldHVybiBjb250ZW50OyB9CisgICAgICAgIHNpemVfdCBnZXRGaWxlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGZpbGVTaXplOyB9CisgICAgICAgIHZvaWQgc2V0Q29udGVudChjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSkgeyBjb250ZW50ID0gZmlsZTsgfQorICAgICAgICB2b2lkIHNldEZpbGVOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKSB7IGZpbGVOYW1lID0gbmFtZTsgfQorICAgICAgICB2b2lkIHNldEZpbGVTaXplKHNpemVfdCBzaXplKSB7CisgICAgICAgICAgICBjb250ZW50LnJlc2l6ZShzaXplKTsgZmlsZVNpemUgPSBzaXplOworICAgICAgICB9CisgICAgfTsKKworICAgIE1lbW9yeUZpbGVTeXN0ZW0oKSB7fTsKKyAgICB2aXJ0dWFsIH5NZW1vcnlGaWxlU3lzdGVtKCkge307CisKKyAgICBib29sIEZpbGVFeGlzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIGZpbGVOYW1lKSBjb25zdDsKKyAgICBzc2l6ZV90IEdldEZpbGVTaXplKGNvbnN0IHN0ZDo6c3RyaW5nJiBmaWxlTmFtZSkgY29uc3Q7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IExpc3RGaWxlcygpIGNvbnN0OworICAgIHNpemVfdCBSZWFkKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoTmFtZSwgc3RkOjpzdHJpbmcqIGJ1ZmZlcik7CisgICAgYm9vbCBSZW1vdmVBbGxGaWxlcygpOworICAgIGJvb2wgUmVtb3ZlRmlsZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZU5hbWUpOworICAgIHNpemVfdCBXcml0ZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aE5hbWUsIGNvbnN0IE1lbW9yeUZpbGUmIG1lbW9yeUZpbGUpOworCisgcHJpdmF0ZToKKyAgICAvLyBMaWNlbnNlIGZpbGUgbmFtZSBpcyBtYWRlIHVwIG9mIGEgdW5pcXVlIGtleVNldElkLCB0aGVyZWZvcmUsCisgICAgLy8gdGhlIGZpbGVuYW1lIGNhbiBiZSB1c2VkIGFzIHRoZSBrZXkgdG8gbG9jYXRlIGxpY2Vuc2VzIGluIHRoZQorICAgIC8vIG1lbW9yeSBmaWxlIHN5c3RlbS4KKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgTWVtb3J5RmlsZT4gbU1lbW9yeUZpbGVTeXN0ZW07CisKKyAgICBzdGQ6OnN0cmluZyBHZXRGaWxlTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCk7CisKKyAgICBDTEVBUktFWV9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oTWVtb3J5RmlsZVN5c3RlbSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjbGVhcmtleQorfSAvLyBuYW1lc3BhY2UgVjFfMgorfSAvLyBuYW1lc3BhY2UgZHJtCit9IC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENMRUFSS0VZX01FTU9SWV9GSUxFX1NZU1RFTV9IXwpkaWZmIC0tZ2l0IGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb24uaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uLmgKaW5kZXggY2RkZmNhNS4uYTE1OWU1YSAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1Nlc3Npb24uaAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbi5oCkBAIC0yNyw0MyArMjcsNTMgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMDo6U3RhdHVzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpTdWJTYW1wbGU7CituYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwordXNpbmcgZHJtOjpWMV8wOjpTdGF0dXM7Cit1c2luZyBkcm06OlYxXzA6OlN1YlNhbXBsZTsKKwordHlwZWRlZiBkcm06OlYxXzI6OlN0YXR1cyBTdGF0dXNfVjFfMjsKIAogY2xhc3MgU2Vzc2lvbiA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBTZXNzaW9uKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpCi0gICAgICAgICAgICA6IG1TZXNzaW9uSWQoc2Vzc2lvbklkKSB7fQorICAgICAgICA6IG1TZXNzaW9uSWQoc2Vzc2lvbklkKSwgbU1vY2tFcnJvcihTdGF0dXNfVjFfMjo6T0spIHt9CiAgICAgdmlydHVhbCB+U2Vzc2lvbigpIHt9CiAKICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKCkgY29uc3QgeyByZXR1cm4gbVNlc3Npb25JZDsgfQogCiAgICAgU3RhdHVzIGdldEtleVJlcXVlc3QoCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgbWltZVR5cGUsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaW5pdERhdGFUeXBlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXREYXRhVHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lVHlwZSwKKyAgICAgICAgICAgIFYxXzA6OktleVR5cGUga2V5VHlwZSwKICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBrZXlSZXF1ZXN0KSBjb25zdDsKIAogICAgIFN0YXR1cyBwcm92aWRlS2V5UmVzcG9uc2UoCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcmVzcG9uc2UpOwogCi0gICAgU3RhdHVzIGRlY3J5cHQoCisgICAgU3RhdHVzX1YxXzIgZGVjcnlwdCgKICAgICAgICAgICAgIGNvbnN0IEtleUlkIGtleUlkLCBjb25zdCBJdiBpdiwgY29uc3QgdWludDhfdCogc3JjUHRyLAogICAgICAgICAgICAgdWludDhfdCogZHN0UHRyLCBjb25zdCBzdGQ6OnZlY3RvcjxTdWJTYW1wbGU+IHN1YlNhbXBsZXMsCiAgICAgICAgICAgICBzaXplX3QqIGJ5dGVzRGVjcnlwdGVkT3V0KTsKIAorICAgIHZvaWQgc2V0TW9ja0Vycm9yKFN0YXR1c19WMV8yIGVycm9yKSB7bU1vY2tFcnJvciA9IGVycm9yO30KKyAgICBTdGF0dXNfVjFfMiBnZXRNb2NrRXJyb3IoKSBjb25zdCB7cmV0dXJuIG1Nb2NrRXJyb3I7fQorCiBwcml2YXRlOgogICAgIENMRUFSS0VZX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTZXNzaW9uKTsKIAogICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1TZXNzaW9uSWQ7CiAgICAgS2V5TWFwIG1LZXlNYXA7CiAgICAgTXV0ZXggbU1hcExvY2s7CisKKyAgICAvLyBGb3IgbW9ja2luZyBlcnJvciByZXR1cm4gc2NlbmFyaW9zCisgICAgU3RhdHVzX1YxXzIgbU1vY2tFcnJvcjsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19IC8vIG5hbWVzcGFjZSBWMV8xCit9IC8vIG5hbWVzcGFjZSBWMV8yCiB9IC8vIG5hbWVzcGFjZSBkcm0KIH0gLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL2luY2x1ZGUvU2Vzc2lvbkxpYnJhcnkuaCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uTGlicmFyeS5oCmluZGV4IDMyNmEwYzEuLjFlNTY3YjggMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uTGlicmFyeS5oCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9TZXNzaW9uTGlicmFyeS5oCkBAIC0yNiw3ICsyNiw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBuYW1lc3BhY2UgaGFyZHdhcmUgewogbmFtZXNwYWNlIGRybSB7Ci1uYW1lc3BhY2UgVjFfMSB7CituYW1lc3BhY2UgVjFfMiB7CiBuYW1lc3BhY2UgY2xlYXJrZXkgewogCiB1c2luZyA6OmFuZHJvaWQ6OnNwOwpAQCAtNTgsNyArNTgsNyBAQAogfTsKIAogfSAvLyBuYW1lc3BhY2UgY2xlYXJrZXkKLX0gLy8gbmFtZXNwYWNlIFYxXzEKK30gLy8gbmFtZXNwYWNlIFYxXzIKIH0gLy8gbmFtZXNwYWNlIGRybQogfSAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvaW5jbHVkZS9UeXBlQ29udmVydC5oIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1R5cGVDb252ZXJ0LmgKaW5kZXggY2MwNjMyOS4uYjBmODYwNyAxMDA2NDQKLS0tIGEvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1R5cGVDb252ZXJ0LmgKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9pbmNsdWRlL1R5cGVDb252ZXJ0LmgKQEAgLTI0LDcgKzI0LDcgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIG5hbWVzcGFjZSBoYXJkd2FyZSB7CiBuYW1lc3BhY2UgZHJtIHsKLW5hbWVzcGFjZSBWMV8xIHsKK25hbWVzcGFjZSBWMV8yIHsKIG5hbWVzcGFjZSBjbGVhcmtleSB7CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7CkBAIC02OCw4ICs2OCwxOSBAQAogICAgIHJldHVybiB2ZWM7CiB9CiAKK2lubGluZSBTdGF0dXMgdG9TdGF0dXNfMV8wKFN0YXR1c19WMV8yIHN0YXR1cykgeworICBzd2l0Y2ggKHN0YXR1cykgeworICAgIGNhc2UgU3RhdHVzX1YxXzI6OkVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFk6CisgICAgY2FzZSBTdGF0dXNfVjFfMjo6RVJST1JfRFJNX0ZSQU1FX1RPT19MQVJHRToKKyAgICBjYXNlIFN0YXR1c19WMV8yOjpFUlJPUl9EUk1fU0VTU0lPTl9MT1NUX1NUQVRFOgorICAgICAgcmV0dXJuIFN0YXR1czo6RVJST1JfRFJNX1VOS05PV047CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KHN0YXR1cyk7CisgIH0KK30KKwogfSAgLy8gbmFtZXNwYWNlIGNsZWFya2V5Ci19ICAvLyBuYW1lc3BhY2UgVjFfMQorfSAgLy8gbmFtZXNwYWNlIFYxXzIKIH0gIC8vIG5hbWVzcGFjZSBkcm0KIH0gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvcHJvdG9zL0RldmljZUZpbGVzLnByb3RvIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9wcm90b3MvRGV2aWNlRmlsZXMucHJvdG8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2UxMWYwYgotLS0gL2Rldi9udWxsCisrKyBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvcHJvdG9zL0RldmljZUZpbGVzLnByb3RvCkBAIC0wLDAgKzEsNDcgQEAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGRldmljZV9maWxlcy5wcm90bworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29weXJpZ2h0IDIwMTggR29vZ2xlIExMQy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBmaWxlIGFuZCBwcm9wcmlldGFyeQorLy8gc291cmNlIGNvZGUgbWF5IG9ubHkgYmUgdXNlZCBhbmQgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFdpZGV2aW5lIE1hc3RlcgorLy8gTGljZW5zZSBBZ3JlZW1lbnQuCisvLworLy8gRGVzY3JpcHRpb246CisvLyAgIEZvcm1hdCBvZiB2YXJpb3VzIGZpbGVzIHN0b3JlZCBhdCB0aGUgZGV2aWNlLgorLy8KK3N5bnRheCA9ICJwcm90bzIiOworCitwYWNrYWdlIGFuZHJvaWQuaGFyZHdhcmUuZHJtLlYxXzIuY2xlYXJrZXk7CisKKy8vIG5lZWQgdGhpcyBpZiB3ZSBhcmUgdXNpbmcgbGlicHJvdG9idWYtY3BwLTIuMy4wLWxpdGUKK29wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7CisKK21lc3NhZ2UgTGljZW5zZSB7CisgIGVudW0gTGljZW5zZVN0YXRlIHsKKyAgICBBQ1RJVkUgPSAxOworICAgIFJFTEVBU0lORyA9IDI7CisgIH0KKworICBvcHRpb25hbCBMaWNlbnNlU3RhdGUgc3RhdGUgPSAxOworICBvcHRpb25hbCBieXRlcyBsaWNlbnNlID0gMjsKK30KKworbWVzc2FnZSBPZmZsaW5lRmlsZSB7CisgIGVudW0gRmlsZVR5cGUgeworICAgIExJQ0VOU0UgPSAxOworICB9CisKKyAgZW51bSBGaWxlVmVyc2lvbiB7CisgICAgVkVSU0lPTl8xID0gMTsKKyAgfQorCisgIG9wdGlvbmFsIEZpbGVUeXBlIHR5cGUgPSAxOworICBvcHRpb25hbCBGaWxlVmVyc2lvbiB2ZXJzaW9uID0gMiBbZGVmYXVsdCA9IFZFUlNJT05fMV07CisgIG9wdGlvbmFsIExpY2Vuc2UgbGljZW5zZSA9IDM7CisKK30KKworbWVzc2FnZSBIYXNoZWRGaWxlIHsKKyAgb3B0aW9uYWwgYnl0ZXMgZmlsZSA9IDE7CisgIC8vIEEgcmF3IChub3QgaGV4LWVuY29kZWQpIFNIQTI1NiwgdGFrZW4gb3ZlciB0aGUgYnl0ZXMgb2YgJ2ZpbGUnLgorICBvcHRpb25hbCBieXRlcyBoYXNoID0gMjsKK30KZGlmZiAtLWdpdCBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZS5jcHAgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2UuY3BwCmluZGV4IDZhOTdiNzIuLmIzOWVhMDEgMTAwNjQ0Ci0tLSBhL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZS5jcHAKKysrIGIvZHJtL21lZGlhZHJtL3BsdWdpbnMvY2xlYXJrZXkvaGlkbC9zZXJ2aWNlLmNwcApAQCAtMTMsMzIgKzEzLDI0IEBACiAgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwotI2RlZmluZSBMT0dfVEFHICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEtc2VydmljZS5jbGVhcmtleSIKLQogI2luY2x1ZGUgPENyeXB0b0ZhY3RvcnkuaD4KICNpbmNsdWRlIDxEcm1GYWN0b3J5Lmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxMYXp5VXRpbHMuaD4KICNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CiAKIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2w7CiB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbDsKIHVzaW5nIDo6YW5kcm9pZDo6c3A7CiAKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OklDcnlwdG9GYWN0b3J5OwotdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMTo6SURybUZhY3Rvcnk7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8xOjpjbGVhcmtleTo6Q3J5cHRvRmFjdG9yeTsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzE6OmNsZWFya2V5OjpEcm1GYWN0b3J5OwotCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpJQ3J5cHRvRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklEcm1GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6Y2xlYXJrZXk6OkNyeXB0b0ZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6RHJtRmFjdG9yeTsKIAogaW50IG1haW4oaW50IC8qIGFyZ2MgKi8sIGNoYXIqKiAvKiBhcmd2ICovKSB7Ci0gICAgQUxPR0QoImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMS1zZXJ2aWNlLmNsZWFya2V5IHN0YXJ0aW5nLi4uIik7Ci0KLSAgICAvLyBUaGUgRFJNIEhBTCBtYXkgY29tbXVuaWNhdGUgdG8gb3RoZXIgdmVuZG9yIGNvbXBvbmVudHMgdmlhCi0gICAgLy8gL2Rldi92bmRiaW5kZXIKLSAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OmluaXRXaXRoRHJpdmVyKCIvZGV2L3ZuZGJpbmRlciIpOwotCiAgICAgc3A8SURybUZhY3Rvcnk+IGRybUZhY3RvcnkgPSBuZXcgRHJtRmFjdG9yeTsKICAgICBzcDxJQ3J5cHRvRmFjdG9yeT4gY3J5cHRvRmFjdG9yeSA9IG5ldyBDcnlwdG9GYWN0b3J5OwogCmRpZmYgLS1naXQgYS9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2VMYXp5LmNwcCBiL2RybS9tZWRpYWRybS9wbHVnaW5zL2NsZWFya2V5L2hpZGwvc2VydmljZUxhenkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MTA0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9kcm0vbWVkaWFkcm0vcGx1Z2lucy9jbGVhcmtleS9oaWRsL3NlcnZpY2VMYXp5LmNwcApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPENyeXB0b0ZhY3RvcnkuaD4KKyNpbmNsdWRlIDxEcm1GYWN0b3J5Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxMYXp5VXRpbHMuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2w7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpqb2luUnBjVGhyZWFkcG9vbDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OklDcnlwdG9GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmRybTo6VjFfMjo6SURybUZhY3Rvcnk7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8yOjpjbGVhcmtleTo6Q3J5cHRvRmFjdG9yeTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzI6OmNsZWFya2V5OjpEcm1GYWN0b3J5OwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OkxhenlTZXJ2aWNlUmVnaXN0cmFyOworCitpbnQgbWFpbihpbnQgLyogYXJnYyAqLywgY2hhcioqIC8qIGFyZ3YgKi8pIHsKKyAgICBzcDxJRHJtRmFjdG9yeT4gZHJtRmFjdG9yeSA9IG5ldyBEcm1GYWN0b3J5OworICAgIHNwPElDcnlwdG9GYWN0b3J5PiBjcnlwdG9GYWN0b3J5ID0gbmV3IENyeXB0b0ZhY3Rvcnk7CisKKyAgICBjb25maWd1cmVScGNUaHJlYWRwb29sKDgsIHRydWUgLyogY2FsbGVyV2lsbEpvaW4gKi8pOworCisgICAgLy8gU2V0dXAgaHdiaW5kZXIgc2VydmljZQorICAgIGF1dG8gc2VydmljZVJlZ2lzdHJhciA9IExhenlTZXJ2aWNlUmVnaXN0cmFyOjpnZXRJbnN0YW5jZSgpOworCisgICAgLy8gU2V0dXAgaHdiaW5kZXIgc2VydmljZQorICAgIENIRUNLX0VRKHNlcnZpY2VSZWdpc3RyYXIucmVnaXN0ZXJTZXJ2aWNlKGRybUZhY3RvcnksICJjbGVhcmtleSIpLCBhbmRyb2lkOjpOT19FUlJPUikKKyAgICAgICAgPDwgIkZhaWxlZCB0byByZWdpc3RlciBDbGVhcmtleSBGYWN0b3J5IEhBTCI7CisgICAgQ0hFQ0tfRVEoc2VydmljZVJlZ2lzdHJhci5yZWdpc3RlclNlcnZpY2UoY3J5cHRvRmFjdG9yeSwgImNsZWFya2V5IiksIGFuZHJvaWQ6Ok5PX0VSUk9SKQorICAgICAgICA8PCAiRmFpbGVkIHRvIHJlZ2lzdGVyIENsZWFya2V5IENyeXB0byAgSEFMIjsKKworICAgIGpvaW5ScGNUaHJlYWRwb29sKCk7Cit9CmRpZmYgLS1naXQgYS9pbmNsdWRlL2NhbWVyYSBiL2luY2x1ZGUvY2FtZXJhCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDg0OGUzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY2FtZXJhCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vY2FtZXJhL2luY2x1ZGUvY2FtZXJhLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvY3B1c3RhdHMgYi9pbmNsdWRlL2NwdXN0YXRzCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA0YTAyZDQxLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvY3B1c3RhdHMKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi9tZWRpYS9saWJjcHVzdGF0cy9pbmNsdWRlL2NwdXN0YXRzLwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmggYi9pbmNsdWRlL2RybS9kcm1fZnJhbWV3b3JrX2NvbW1vbi5oCmluZGV4IGQ3NWY3MWMuLmQ1ZjNiYTIgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvZHJtL2RybV9mcmFtZXdvcmtfY29tbW9uLmgKKysrIGIvaW5jbHVkZS9kcm0vZHJtX2ZyYW1ld29ya19jb21tb24uaApAQCAtMzE3LDE0ICszMTcsNiBAQAogICAgIH5EZWNyeXB0SGFuZGxlKCkgewogICAgICAgICBkZWxldGUgZGVjcnlwdEluZm87IGRlY3J5cHRJbmZvID0gTlVMTDsKICAgICB9Ci0KLSAgICBib29sIG9wZXJhdG9yPChjb25zdCBEZWNyeXB0SGFuZGxlJiBoYW5kbGUpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIChkZWNyeXB0SWQgPCBoYW5kbGUuZGVjcnlwdElkKTsKLSAgICB9Ci0KLSAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgRGVjcnlwdEhhbmRsZSYgaGFuZGxlKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAoZGVjcnlwdElkID09IGhhbmRsZS5kZWNyeXB0SWQpOwotICAgIH0KIH07CiAKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0FWU3luY1NldHRpbmdzLmggYi9pbmNsdWRlL21lZGlhL0FWU3luY1NldHRpbmdzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGJiZTIxMWYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9BVlN5bmNTZXR0aW5ncy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9BVlN5bmNTZXR0aW5ncy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggYzRkNmU3OS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb0NsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBhMDUzMGU0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9DbGllbnQuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggYmY1Mjk1NS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDY4ZjU0YzkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggZGU4MzljNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBhNTg4OWU1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9QYXJhbWV0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9QYXJhbWV0ZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3kuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3kuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggZGQ0Y2Q1My4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5LmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDU1ODY1N2UuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9QcmVzZW50YXRpb25JbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5MWE5OTIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCi0jZGVmaW5lIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCi0KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWVudW0gbWFzdGVyaW5nX2luZGljYXRpb24gewotICAgIE1BU1RFUklOR19OT1RfSU5ESUNBVEVELAotICAgIE1BU1RFUkVEX0ZPUl9TVEVSRU8sCi0gICAgTUFTVEVSRURfRk9SX1NVUlJPVU5ELAotICAgIE1BU1RFUkVEX0ZPUl8zRCwKLSAgICBNQVNURVJFRF9GT1JfSEVBRFBIT05FLAotfTsKLQotc3RydWN0IEF1ZGlvUHJlc2VudGF0aW9uIDogcHVibGljIFJlZkJhc2UgewotICAgIGludDMyX3QgbVByZXNlbnRhdGlvbklkOwotICAgIGludDMyX3QgbVByb2dyYW1JZDsKLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtTGFiZWxzOwotICAgIFN0cmluZzggbUxhbmd1YWdlOwotICAgIGludDMyX3QgbU1hc3RlcmluZ0luZGljYXRpb247Ci0gICAgYm9vbCBtQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZTsKLSAgICBib29sIG1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGU7Ci0gICAgYm9vbCBtRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZTsKLQotICAgIEF1ZGlvUHJlc2VudGF0aW9uKCkgewotICAgICAgICBtUHJlc2VudGF0aW9uSWQgPSAtMTsKLSAgICAgICAgbVByb2dyYW1JZCA9IC0xOwotICAgICAgICBtTGFuZ3VhZ2UgPSAiIjsKLSAgICAgICAgbU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJJTkdfTk9UX0lORElDQVRFRDsKLSAgICAgICAgbUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUgPSBmYWxzZTsKLSAgICAgICAgbVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSA9IGZhbHNlOwotICAgICAgICBtRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSA9IGZhbHNlOwotICAgIH0KLX07Ci0KLXR5cGVkZWYgVmVjdG9yPHNwPEF1ZGlvUHJlc2VudGF0aW9uPj4gQXVkaW9QcmVzZW50YXRpb25zOwotCi1jbGFzcyBBdWRpb1ByZXNlbnRhdGlvbkluZm8gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gcHVibGljOgotICAgIEF1ZGlvUHJlc2VudGF0aW9uSW5mbygpOwotCi0gICAgfkF1ZGlvUHJlc2VudGF0aW9uSW5mbygpOwotCi0gICAgdm9pZCBhZGRQcmVzZW50YXRpb24oc3A8QXVkaW9QcmVzZW50YXRpb24+IHByZXNlbnRhdGlvbik7Ci0KLSAgICBzaXplX3QgY291bnRQcmVzZW50YXRpb25zKCkgY29uc3Q7Ci0KLSAgICBjb25zdCBzcDxBdWRpb1ByZXNlbnRhdGlvbj4gZ2V0UHJlc2VudGF0aW9uKHNpemVfdCBpbmRleCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICAgIEF1ZGlvUHJlc2VudGF0aW9ucyBtUHJlc2VudGF0aW9uczsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQVVESU9fUFJFU0VOVEFUSU9OX0lORk9fSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaCBiL2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggNzkzOWRkMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmggYi9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDlmYWQyYjcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBiNmI5Mjc4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvQXVkaW9UaW1lc3RhbXAuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UaW1lc3RhbXAuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQXVkaW9UcmFjay5oIGIvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDMwM2JmY2QuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQnVmZmVyUHJvdmlkZXJzLmggYi9pbmNsdWRlL21lZGlhL0J1ZmZlclByb3ZpZGVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA3NzliYjE1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvQnVmZmVyUHJvdmlkZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlclByb3ZpZGVycy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oIGIvaW5jbHVkZS9tZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA0MDkyMDNmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5oIGIvaW5jbHVkZS9tZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDJiMjgzODcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvQ291bnRlck1ldHJpYy5oIGIvaW5jbHVkZS9tZWRpYS9Db3VudGVyTWV0cmljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGJhYmEwNDMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9Db3VudGVyTWV0cmljLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0NvdW50ZXJNZXRyaWMuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmgKaW5kZXggOTA1YmVjMS4uMTk4YjI3ZSAxMjAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmgKQEAgLTEgKzEgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oIGIvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oCmluZGV4IDU0YzgwNDcuLmQyYWIyZjEgMTIwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZUJhc2UuaAorKysgYi9pbmNsdWRlL21lZGlhL0RhdGFTb3VyY2VCYXNlLmgKQEAgLTEgKzEgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZUJhc2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKK3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VCYXNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0V2ZW50TWV0cmljLmggYi9pbmNsdWRlL21lZGlhL0V2ZW50TWV0cmljLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDU3MDdkOWEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9FdmVudE1ldHJpYy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9FdmVudE1ldHJpYy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9FeHRlbmRlZEF1ZGlvQnVmZmVyUHJvdmlkZXIuaCBiL2luY2x1ZGUvbWVkaWEvRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGQ2NTNjYzMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9FeHRlbmRlZEF1ZGlvQnVmZmVyUHJvdmlkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0V4dHJhY3RvclV0aWxzLmggYi9pbmNsdWRlL21lZGlhL0V4dHJhY3RvclV0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGUyZGQwODIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oIGIvaW5jbHVkZS9tZWRpYS9FeHRyYWN0b3JVdGlscy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL0V4dHJhY3RvclV0aWxzLmgKcmVuYW1lIHRvIGluY2x1ZGUvbWVkaWEvRXh0cmFjdG9yVXRpbHMuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmggYi9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggZWY2ZjViZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50LmggYi9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggZGM0ODFlOC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlckNsaWVudC5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmggYi9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMDgxMDFmYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmggYi9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMGQ0YjNlNy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oIGIvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA3YmFiMWZkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSURhdGFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvSURhdGFTb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggNDFjZGQ4Yi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0lEYXRhU291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEYXRhU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lFZmZlY3QuaCBiL2luY2x1ZGUvbWVkaWEvSUVmZmVjdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAyZmI4YmZiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvSUVmZmVjdC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JRWZmZWN0LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lFZmZlY3RDbGllbnQuaCBiL2luY2x1ZGUvbWVkaWEvSUVmZmVjdENsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBiNGUzOWNmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvSUVmZmVjdENsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JRWZmZWN0Q2xpZW50LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYUNvZGVjTGlzdC5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFDb2RlY0xpc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMjE4NjMxMi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYUNvZGVjTGlzdC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFDb2RlY0xpc3QuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRGVhdGhOb3RpZmllci5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFEZWF0aE5vdGlmaWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGNlM2I4ZjAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFEZWF0aE5vdGlmaWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYURlYXRoTm90aWZpZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3Rvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA4NzA4YzhjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3Rvci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggM2VlOWYxZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFIVFRQQ29ubmVjdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwOTcwYzE1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUENvbm5lY3Rpb24uaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggYjkwYzM0Zi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYUxvZ1NlcnZpY2UuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhTG9nU2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAyNDVhMjlkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhTG9nU2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFMb2dTZXJ2aWNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDk1OWRmMWEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDk0MTRkMzcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllckNsaWVudC5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJDbGllbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggYjY1NDdjZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllckNsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJDbGllbnQuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5oIGIvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDg5Yzk2Y2QuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggNTdkMTkyYy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50LmggYi9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDg5ZjQzNTkuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlckNsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlckNsaWVudC5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvSU1lZGlhU291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDEzMzBhZDMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9JTWVkaWFTb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lPTVguaCBiL2luY2x1ZGUvbWVkaWEvSU9NWC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA2ZDViMzc1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvSU9NWC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JT01YLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lSZW1vdGVEaXNwbGF5LmggYi9pbmNsdWRlL21lZGlhL0lSZW1vdGVEaXNwbGF5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDRiMGNmMTAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9JUmVtb3RlRGlzcGxheS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JUmVtb3RlRGlzcGxheS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9JUmVtb3RlRGlzcGxheUNsaWVudC5oIGIvaW5jbHVkZS9tZWRpYS9JUmVtb3RlRGlzcGxheUNsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBmMjlhMmVlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvSVJlbW90ZURpc3BsYXlDbGllbnQuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSVJlbW90ZURpc3BsYXlDbGllbnQuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSVJlc291cmNlTWFuYWdlckNsaWVudC5oIGIvaW5jbHVkZS9tZWRpYS9JUmVzb3VyY2VNYW5hZ2VyQ2xpZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDEwMGFmOWIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9JUmVzb3VyY2VNYW5hZ2VyQ2xpZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lSZXNvdXJjZU1hbmFnZXJDbGllbnQuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuaCBiL2luY2x1ZGUvbWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggOWIzODljNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0lTdHJlYW1Tb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvSVN0cmVhbVNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA0OTQzYWY5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvSVN0cmVhbVNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JU3RyZWFtU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL0pldFBsYXllci5oIGIvaW5jbHVkZS9tZWRpYS9KZXRQbGF5ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggNTQ4M2ZkYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL0pldFBsYXllci5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KZXRQbGF5ZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTGluZWFyTWFwLmggYi9pbmNsdWRlL21lZGlhL0xpbmVhck1hcC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAzMGQ0Y2E4Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvTGluZWFyTWFwLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0xpbmVhck1hcC5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmggYi9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNCdWZmZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggOGM5YWE3Ni4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNCdWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBmZjQ0Y2U0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggNGIzNWZlMS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmggYi9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE2NDcyYwotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaApAQCAtMCwwICsxLDE2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9BUElfSF8KKyNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9BUElfSF8KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPiAvLyBmb3Igc3RhdHVzX3QKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yLmg+CitzdHJ1Y3QgQU1lZGlhRm9ybWF0OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBNZWRpYVRyYWNrOworY2xhc3MgTWV0YURhdGFCYXNlOworY2xhc3MgTWVkaWFCdWZmZXJCYXNlOworCitleHRlcm4gIkMiIHsKKworc3RydWN0IENEYXRhU291cmNlIHsKKyAgICBzc2l6ZV90ICgqcmVhZEF0KSh2b2lkICpoYW5kbGUsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3QgKCpnZXRTaXplKSh2b2lkICpoYW5kbGUsIG9mZjY0X3QgKnNpemUpOworICAgIHVpbnQzMl90ICgqZmxhZ3MpKHZvaWQgKmhhbmRsZSApOworICAgIGJvb2wgKCpnZXRVcmkpKHZvaWQgKmhhbmRsZSwgY2hhciAqdXJpU3RyaW5nLCBzaXplX3QgYnVmZmVyU2l6ZSk7CisgICAgdm9pZCAqaGFuZGxlOworfTsKKworZW51bSBDTWVkaWFUcmFja1JlYWRPcHRpb25zIDogdWludDMyX3QgeworICAgIFNFRUtfUFJFVklPVVNfU1lOQyA9IDAsCisgICAgU0VFS19ORVhUX1NZTkMgPSAxLAorICAgIFNFRUtfQ0xPU0VTVF9TWU5DID0gMiwKKyAgICBTRUVLX0NMT1NFU1QgPSAzLAorICAgIFNFRUtfRlJBTUVfSU5ERVggPSA0LAorICAgIFNFRUsgPSA4LAorICAgIE5PTkJMT0NLSU5HID0gMTYKK307CisKKy8qKgorICogb25seSB1c2UgQ01lZGlhQnVmZmVyIGFsbG9jYXRlZCBmcm9tIHRoZSBDTWVkaWFCdWZmZXJHcm91cCB0aGF0IGlzCisgKiBwcm92aWRlZCB0byBDTWVkaWFUcmFjazo6c3RhcnQoKQorICovCitzdHJ1Y3QgQ01lZGlhQnVmZmVyIHsKKyAgICB2b2lkICpoYW5kbGU7CisgICAgdm9pZCAoKnJlbGVhc2UpKHZvaWQgKmhhbmRsZSk7CisgICAgdm9pZCogKCpkYXRhKSh2b2lkICpoYW5kbGUpOworICAgIHNpemVfdCAoKnNpemUpKHZvaWQgKmhhbmRsZSk7CisgICAgc2l6ZV90ICgqcmFuZ2Vfb2Zmc2V0KSh2b2lkICpoYW5kbGUpOworICAgIHNpemVfdCAoKnJhbmdlX2xlbmd0aCkodm9pZCAqaGFuZGxlKTsKKyAgICB2b2lkICgqc2V0X3JhbmdlKSh2b2lkICpoYW5kbGUsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpOworICAgIEFNZWRpYUZvcm1hdCogKCptZXRhX2RhdGEpKHZvaWQgKmhhbmRsZSk7Cit9OworCitzdHJ1Y3QgQ01lZGlhQnVmZmVyR3JvdXAgeworICAgIHZvaWQgKmhhbmRsZTsKKyAgICBib29sICgqaW5pdCkodm9pZCAqaGFuZGxlLCBzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpOworICAgIHZvaWQgKCphZGRfYnVmZmVyKSh2b2lkICpoYW5kbGUsIHNpemVfdCBzaXplKTsKKyAgICBtZWRpYV9zdGF0dXNfdCAoKmFjcXVpcmVfYnVmZmVyKSh2b2lkICpoYW5kbGUsCisgICAgICAgICAgICBDTWVkaWFCdWZmZXIgKipidWZmZXIsIGJvb2wgbm9uQmxvY2tpbmcsIHNpemVfdCByZXF1ZXN0ZWRTaXplKTsKKyAgICBib29sICgqaGFzX2J1ZmZlcnMpKHZvaWQgKmhhbmRsZSk7Cit9OworCitzdHJ1Y3QgQ01lZGlhVHJhY2sgeworICAgIHZvaWQgKmRhdGE7CisgICAgdm9pZCAoKmZyZWUpKHZvaWQgKmRhdGEpOworCisgICAgbWVkaWFfc3RhdHVzX3QgKCpzdGFydCkodm9pZCAqZGF0YSwgQ01lZGlhQnVmZmVyR3JvdXAgKmJ1ZmZlckdyb3VwKTsKKyAgICBtZWRpYV9zdGF0dXNfdCAoKnN0b3ApKHZvaWQgKmRhdGEpOworICAgIG1lZGlhX3N0YXR1c190ICgqZ2V0Rm9ybWF0KSh2b2lkICpkYXRhLCBBTWVkaWFGb3JtYXQgKmZvcm1hdCk7CisgICAgbWVkaWFfc3RhdHVzX3QgKCpyZWFkKSh2b2lkICpkYXRhLCBDTWVkaWFCdWZmZXIgKipidWZmZXIsIHVpbnQzMl90IG9wdGlvbnMsIGludDY0X3Qgc2Vla1Bvc1VzKTsKKyAgICBib29sICAgICAoKnN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkKSh2b2lkICpkYXRhKTsKK307CisKK3N0cnVjdCBDTWVkaWFFeHRyYWN0b3IgeworICAgIHZvaWQgKmRhdGE7CisKKyAgICB2b2lkICgqZnJlZSkodm9pZCAqZGF0YSk7CisgICAgc2l6ZV90ICgqY291bnRUcmFja3MpKHZvaWQgKmRhdGEpOworICAgIENNZWRpYVRyYWNrKiAoKmdldFRyYWNrKSh2b2lkICpkYXRhLCBzaXplX3QgaW5kZXgpOworICAgIG1lZGlhX3N0YXR1c190ICgqZ2V0VHJhY2tNZXRhRGF0YSkoCisgICAgICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisKKyAgICBtZWRpYV9zdGF0dXNfdCAoKmdldE1ldGFEYXRhKSh2b2lkICpkYXRhLCBBTWVkaWFGb3JtYXQgKm1ldGEpOworICAgIHVpbnQzMl90ICgqZmxhZ3MpKHZvaWQgKmRhdGEpOworICAgIG1lZGlhX3N0YXR1c190ICgqc2V0TWVkaWFDYXMpKHZvaWQgKmRhdGEsIGNvbnN0IHVpbnQ4X3QqIGNhc1Rva2VuLCBzaXplX3Qgc2l6ZSk7CisgICAgY29uc3QgY2hhciAqICgqbmFtZSkodm9pZCAqZGF0YSk7Cit9OworCit0eXBlZGVmIENNZWRpYUV4dHJhY3RvciogKCpDcmVhdG9yRnVuYykoQ0RhdGFTb3VyY2UgKnNvdXJjZSwgdm9pZCAqbWV0YSk7Cit0eXBlZGVmIHZvaWQgKCpGcmVlTWV0YUZ1bmMpKHZvaWQgKm1ldGEpOworCisvLyBUaGUgc25pZmZlciBjYW4gb3B0aW9uYWxseSBmaWxsIGluIGFuIG9wYXF1ZSBvYmplY3QsICJtZXRhIiwgdGhhdCBoZWxwcworLy8gdGhlIGNvcnJlc3BvbmRpbmcgZXh0cmFjdG9yIGluaXRpYWxpemUgaXRzIHN0YXRlIHdpdGhvdXQgZHVwbGljYXRpbmcKKy8vIGVmZm9ydCBhbHJlYWR5IGV4ZXJ0ZWQgYnkgdGhlIHNuaWZmZXIuIElmICJmcmVlTWV0YSIgaXMgZ2l2ZW4sIGl0IHdpbGwgYmUKKy8vIGNhbGxlZCBhZ2FpbnN0IHRoZSBvcGFxdWUgb2JqZWN0IHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHVzZWQuCit0eXBlZGVmIENyZWF0b3JGdW5jICgqU25pZmZlckZ1bmMpKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgdm9pZCAqKm1ldGEsIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEpOworCit0eXBlZGVmIENNZWRpYUV4dHJhY3RvciBDTWVkaWFFeHRyYWN0b3I7Cit0eXBlZGVmIENyZWF0b3JGdW5jIENyZWF0b3JGdW5jOworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCB1aW50OF90IGJbMTZdOworfSBtZWRpYV91dWlkX3Q7CisKK3N0cnVjdCBFeHRyYWN0b3JEZWYgeworICAgIC8vIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgc3RydWN0dXJlCisgICAgY29uc3QgdWludDMyX3QgZGVmX3ZlcnNpb247CisKKyAgICAvLyBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGlzIGV4dHJhY3Rvci4KKyAgICAvLyBTZWUgYmVsb3cgZm9yIGEgY29udmVuaWVuY2UgbWFjcm8gdG8gY3JlYXRlIHRoaXMgZnJvbSBhIHN0cmluZy4KKyAgICBtZWRpYV91dWlkX3QgZXh0cmFjdG9yX3V1aWQ7CisKKyAgICAvLyBWZXJzaW9uIG51bWJlciBvZiB0aGlzIGV4dHJhY3Rvci4gV2hlbiB0d28gZXh0cmFjdG9ycyB3aXRoIHRoZSBzYW1lCisgICAgLy8gdXVpZCBhcmUgZW5jb3VudGVyZWQsIHRoZSBvbmUgd2l0aCB0aGUgbGFyZ2VzdCB2ZXJzaW9uIG51bWJlciB3aWxsCisgICAgLy8gYmUgdXNlZC4KKyAgICBjb25zdCB1aW50MzJfdCBleHRyYWN0b3JfdmVyc2lvbjsKKworICAgIC8vIGEgaHVtYW4gcmVhZGFibGUgbmFtZQorICAgIGNvbnN0IGNoYXIgKmV4dHJhY3Rvcl9uYW1lOworCisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgU25pZmZlckZ1bmMgc25pZmY7CisgICAgICAgIH0gdjI7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICBTbmlmZmVyRnVuYyBzbmlmZjsKKyAgICAgICAgICAgIC8vIGEgTlVMTCB0ZXJtaW5hdGVkIGxpc3Qgb2YgY29udGFpbmVyIG1pbWUgdHlwZXMgYW5kL29yIGZpbGUgZXh0ZW5zaW9ucworICAgICAgICAgICAgLy8gdGhhdCB0aGlzIGV4dHJhY3RvciBzdXBwb3J0cworICAgICAgICAgICAgY29uc3QgY2hhciAqKnN1cHBvcnRlZF90eXBlczsKKyAgICAgICAgfSB2MzsKKyAgICB9IHU7Cit9OworCisvLyB0aGUgQysrIGJhc2VkIEFQSSB3aGljaCBmaXJzdCBzaGlwcGVkIGluIFAgYW5kIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQKK2NvbnN0IHVpbnQzMl90IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX0xFR0FDWSA9IDE7CisKKy8vIHRoZSBmaXJzdCBDL05ESyBiYXNlZCBBUEkKK2NvbnN0IHVpbnQzMl90IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMSA9IDI7CisKKy8vIHRoZSBzZWNvbmQgQy9OREsgYmFzZWQgQVBJCitjb25zdCB1aW50MzJfdCBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIgPSAzOworCitjb25zdCB1aW50MzJfdCBFWFRSQUNUT1JERUZfVkVSU0lPTiA9IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMjsKKworLy8gZWFjaCBwbHVnaW4gbGlicmFyeSBleHBvcnRzIG9uZSBmdW5jdGlvbiBvZiB0aGlzIHR5cGUKK3R5cGVkZWYgRXh0cmFjdG9yRGVmICgqR2V0RXh0cmFjdG9yRGVmKSgpOworCit9IC8vIGV4dGVybiAiQyIKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9FWFRSQUNUT1JfUExVR0lOX0FQSV9IXwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4NmYxNzcKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmgKQEAgLTAsMCArMSw0OTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX0VYVFJBQ1RPUl9QTFVHSU5fSEVMUEVSX0hfCisKKyNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9IRUxQRVJfSF8KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWFwPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEYXRhU291cmNlQmFzZTsKK2NsYXNzIE1ldGFEYXRhQmFzZTsKK3N0cnVjdCBNZWRpYVRyYWNrOworCisKK2NsYXNzIE1lZGlhVHJhY2tIZWxwZXI7CisKK2NsYXNzIE1lZGlhQnVmZmVySGVscGVyIHsKK3ByaXZhdGU6CisgICAgZnJpZW5kIENNZWRpYVRyYWNrICp3cmFwKE1lZGlhVHJhY2tIZWxwZXIgKik7CisgICAgQ01lZGlhQnVmZmVyICptQnVmZmVyOworcHVibGljOgorICAgIE1lZGlhQnVmZmVySGVscGVyKENNZWRpYUJ1ZmZlciAqYnVmKSB7CisgICAgICAgIG1CdWZmZXIgPSBidWY7CisgICAgfQorCisgICAgdmlydHVhbCB+TWVkaWFCdWZmZXJIZWxwZXIoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2UoKSB7CisgICAgICAgIG1CdWZmZXItPnJlbGVhc2UobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQqIGRhdGEoKSB7CisgICAgICAgIHJldHVybiBtQnVmZmVyLT5kYXRhKG1CdWZmZXItPmhhbmRsZSk7CisgICAgfQorCisgICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1CdWZmZXItPnNpemUobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9vZmZzZXQoKSB7CisgICAgICAgIHJldHVybiBtQnVmZmVyLT5yYW5nZV9vZmZzZXQobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9sZW5ndGgoKSB7CisgICAgICAgIHJldHVybiBtQnVmZmVyLT5yYW5nZV9sZW5ndGgobUJ1ZmZlci0+aGFuZGxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpIHsKKyAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKG1CdWZmZXItPmhhbmRsZSwgb2Zmc2V0LCBsZW5ndGgpOworICAgIH0KKyAgICB2aXJ0dWFsIEFNZWRpYUZvcm1hdCAqbWV0YV9kYXRhKCkgeworICAgICAgICByZXR1cm4gbUJ1ZmZlci0+bWV0YV9kYXRhKG1CdWZmZXItPmhhbmRsZSk7CisgICAgfQorfTsKKworY2xhc3MgTWVkaWFCdWZmZXJHcm91cEhlbHBlciB7Citwcml2YXRlOgorICAgIENNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CisgICAgc3RkOjptYXA8Q01lZGlhQnVmZmVyKiwgTWVkaWFCdWZmZXJIZWxwZXIqPiBtQnVmZmVySGVscGVyczsKK3B1YmxpYzoKKyAgICBNZWRpYUJ1ZmZlckdyb3VwSGVscGVyKENNZWRpYUJ1ZmZlckdyb3VwICpncm91cCkgeworICAgICAgICBtR3JvdXAgPSBncm91cDsKKyAgICB9CisgICAgfk1lZGlhQnVmZmVyR3JvdXBIZWxwZXIoKSB7CisgICAgICAgIC8vIGRlbGV0ZSBhbGwgZW50cmllcyBpbiBtYXAKKyAgICAgICAgQUxPR1YoImJ1ZmZlcmdyb3VwICVwIG1hcCBoYXMgJXp1IGVudHJpZXMiLCB0aGlzLCBtQnVmZmVySGVscGVycy5zaXplKCkpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQnVmZmVySGVscGVycy5iZWdpbigpOyBpdCAhPSBtQnVmZmVySGVscGVycy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgZGVsZXRlIGl0LT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBpbml0KHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCA9IDApIHsKKyAgICAgICAgcmV0dXJuIG1Hcm91cC0+aW5pdChtR3JvdXAtPmhhbmRsZSwgYnVmZmVycywgYnVmZmVyX3NpemUsIGdyb3d0aExpbWl0KTsKKyAgICB9CisgICAgdm9pZCBhZGRfYnVmZmVyKHNpemVfdCBzaXplKSB7CisgICAgICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihtR3JvdXAtPmhhbmRsZSwgc2l6ZSk7CisgICAgfQorICAgIG1lZGlhX3N0YXR1c190IGFjcXVpcmVfYnVmZmVyKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGJvb2wgbm9uQmxvY2tpbmcgPSBmYWxzZSwgc2l6ZV90IHJlcXVlc3RlZFNpemUgPSAwKSB7CisgICAgICAgIENNZWRpYUJ1ZmZlciAqYnVmID0gbnVsbHB0cjsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0KKyAgICAgICAgICAgICAgICBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKG1Hcm91cC0+aGFuZGxlLCAmYnVmLCBub25CbG9ja2luZywgcmVxdWVzdGVkU2l6ZSk7CisgICAgICAgIGlmIChyZXQgPT0gQU1FRElBX09LICYmIGJ1ZiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBhdXRvIGhlbHBlciA9IG1CdWZmZXJIZWxwZXJzLmZpbmQoYnVmKTsKKyAgICAgICAgICAgIGlmIChoZWxwZXIgPT0gbUJ1ZmZlckhlbHBlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciogbmV3SGVscGVyID0gbmV3IE1lZGlhQnVmZmVySGVscGVyKGJ1Zik7CisgICAgICAgICAgICAgICAgbUJ1ZmZlckhlbHBlcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGJ1ZiwgbmV3SGVscGVyKSk7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IG5ld0hlbHBlcjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmJ1ZmZlciA9IGhlbHBlci0+c2Vjb25kOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgYm9vbCBoYXNfYnVmZmVycygpIHsKKyAgICAgICAgcmV0dXJuIG1Hcm91cC0+aGFzX2J1ZmZlcnMobUdyb3VwLT5oYW5kbGUpOworICAgIH0KK307CisKK2NsYXNzIE1lZGlhVHJhY2tIZWxwZXIgeworcHVibGljOgorICAgIE1lZGlhVHJhY2tIZWxwZXIoKSA6IG1CdWZmZXJHcm91cChudWxscHRyKSB7CisgICAgfQorICAgIHZpcnR1YWwgfk1lZGlhVHJhY2tIZWxwZXIoKSB7CisgICAgICAgIGRlbGV0ZSBtQnVmZmVyR3JvdXA7CisgICAgfQorICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCkgPSAwOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqZm9ybWF0KSA9IDA7CisKKyAgICBjbGFzcyBSZWFkT3B0aW9ucyB7CisgICAgcHVibGljOgorICAgICAgICBlbnVtIFNlZWtNb2RlIDogaW50MzJfdCB7CisgICAgICAgICAgICBTRUVLX1BSRVZJT1VTX1NZTkMsCisgICAgICAgICAgICBTRUVLX05FWFRfU1lOQywKKyAgICAgICAgICAgIFNFRUtfQ0xPU0VTVF9TWU5DLAorICAgICAgICAgICAgU0VFS19DTE9TRVNULAorICAgICAgICAgICAgU0VFS19GUkFNRV9JTkRFWCwKKyAgICAgICAgfTsKKworICAgICAgICBSZWFkT3B0aW9ucyh1aW50MzJfdCBvcHRpb25zLCBpbnQ2NF90IHNlZWtQb3NVcykgeworICAgICAgICAgICAgbU9wdGlvbnMgPSBvcHRpb25zOworICAgICAgICAgICAgbVNlZWtQb3NVcyA9IHNlZWtQb3NVczsKKyAgICAgICAgfQorICAgICAgICBib29sIGdldFNlZWtUbyhpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3QgeworICAgICAgICAgICAgaWYgKChtT3B0aW9ucyAmIENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUspID09IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqdGltZV91cyA9IG1TZWVrUG9zVXM7CisgICAgICAgICAgICAqbW9kZSA9IChTZWVrTW9kZSkgKG1PcHRpb25zICYgNyk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBib29sIGdldE5vbkJsb2NraW5nKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1PcHRpb25zICYgQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6Tk9OQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICBwcml2YXRlOgorICAgICAgICB1aW50MzJfdCBtT3B0aW9uczsKKyAgICAgICAgaW50NjRfdCBtU2Vla1Bvc1VzOworICAgIH07CisKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKSA9IDA7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkKCkgeyByZXR1cm4gZmFsc2U7IH0KK3Byb3RlY3RlZDoKKyAgICBmcmllbmQgQ01lZGlhVHJhY2sgKndyYXAoTWVkaWFUcmFja0hlbHBlciAqdHJhY2spOworICAgIE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKm1CdWZmZXJHcm91cDsKK307CisKK2lubGluZSBDTWVkaWFUcmFjayAqd3JhcChNZWRpYVRyYWNrSGVscGVyICp0cmFjaykgeworICAgIGlmICh0cmFjayA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBDTWVkaWFUcmFjayAqd3JhcHBlciA9IChDTWVkaWFUcmFjayopIG1hbGxvYyhzaXplb2YoQ01lZGlhVHJhY2spKTsKKyAgICB3cmFwcGVyLT5kYXRhID0gdHJhY2s7CisgICAgd3JhcHBlci0+ZnJlZSA9IFtdKHZvaWQgKmRhdGEpIC0+IHZvaWQgeworICAgICAgICBkZWxldGUgKE1lZGlhVHJhY2tIZWxwZXIqKShkYXRhKTsKKyAgICB9OworICAgIHdyYXBwZXItPnN0YXJ0ID0gW10odm9pZCAqZGF0YSwgQ01lZGlhQnVmZmVyR3JvdXAgKmJ1ZmZlckdyb3VwKSAtPiBtZWRpYV9zdGF0dXNfdCB7CisgICAgICAgIGlmICgoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5tQnVmZmVyR3JvdXApIHsKKyAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkbid0IGhhcHBlbiwgYnV0IGhhbmRsZSBpdCBhbnl3YXkKKyAgICAgICAgICAgIGRlbGV0ZSAoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5tQnVmZmVyR3JvdXA7CisgICAgICAgIH0KKyAgICAgICAgKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+bUJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIoYnVmZmVyR3JvdXApOworICAgICAgICByZXR1cm4gKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+c3RhcnQoKTsKKyAgICB9OworICAgIHdyYXBwZXItPnN0b3AgPSBbXSh2b2lkICpkYXRhKSAtPiBtZWRpYV9zdGF0dXNfdCB7CisgICAgICAgIHJldHVybiAoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5zdG9wKCk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5nZXRGb3JtYXQgPSBbXSh2b2lkICpkYXRhLCBBTWVkaWFGb3JtYXQgKm1ldGEpIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFUcmFja0hlbHBlciopZGF0YSktPmdldEZvcm1hdChtZXRhKTsKKyAgICB9OworICAgIHdyYXBwZXItPnJlYWQgPSBbXSh2b2lkICpkYXRhLCBDTWVkaWFCdWZmZXIgKipidWZmZXIsICB1aW50MzJfdCBvcHRpb25zLCBpbnQ2NF90IHNlZWtQb3NVcykKKyAgICAgICAgICAgIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnMgb3B0cyhvcHRpb25zLCBzZWVrUG9zVXMpOworICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmID0gTlVMTDsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gKChNZWRpYVRyYWNrSGVscGVyKilkYXRhKS0+cmVhZCgmYnVmLCAmb3B0cyk7CisgICAgICAgIGlmIChyZXQgPT0gQU1FRElBX09LICYmIGJ1ZiAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAqYnVmZmVyID0gYnVmLT5tQnVmZmVyOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfTsKKyAgICB3cmFwcGVyLT5zdXBwb3J0c05vbkJsb2NraW5nUmVhZCA9IFtdKHZvaWQgKmRhdGEpIC0+IGJvb2wgeworICAgICAgICAgICAgICAgIHJldHVybiAoKE1lZGlhVHJhY2tIZWxwZXIqKWRhdGEpLT5zdXBwb3J0c05vbkJsb2NraW5nUmVhZCgpOworICAgIH07CisgICAgcmV0dXJuIHdyYXBwZXI7Cit9CisKKworLy8gZXh0cmFjdG9yIHBsdWdpbnMgY2FuIGRlcml2ZSBmcm9tIHRoaXMgY2xhc3Mgd2hpY2ggbG9va3MgcmVtYXJrYWJseQorLy8gbGlrZSBNZWRpYUV4dHJhY3RvciBhbmQgY2FuIGJlIGVhc2lseSB3cmFwcGVkIGluIHRoZSByZXF1aXJlZCBDIEFQSQorY2xhc3MgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcigpIHt9CisgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKSA9IDA7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpID0gMDsKKworICAgIGVudW0gR2V0VHJhY2tNZXRhRGF0YUZsYWdzIHsKKyAgICAgICAga0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSA9IDEKKyAgICB9OworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKSA9IDA7CisKKyAgICAvLyBSZXR1cm4gY29udGFpbmVyIHNwZWNpZmljIG1ldGEtZGF0YS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgICAvLyByZXR1cm5zIGFuIGVtcHR5IG1ldGFkYXRhIG9iamVjdC4KKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgPSAwOworCisgICAgZW51bSBGbGFncyB7CisgICAgICAgIENBTl9TRUVLX0JBQ0tXQVJEICA9IDEsICAvLyB0aGUgInNlZWsgMTBzZWNzIGJhY2sgYnV0dG9uIgorICAgICAgICBDQU5fU0VFS19GT1JXQVJEICAgPSAyLCAgLy8gdGhlICJzZWVrIDEwc2VjcyBmb3J3YXJkIGJ1dHRvbiIKKyAgICAgICAgQ0FOX1BBVVNFICAgICAgICAgID0gNCwKKyAgICAgICAgQ0FOX1NFRUsgICAgICAgICAgID0gOCwgIC8vIHRoZSAic2VlayBiYXIiCisgICAgfTsKKworICAgIC8vIElmIHN1YmNsYXNzZXMgZG8gX25vdF8gb3ZlcnJpZGUgdGhpcywgdGhlIGRlZmF1bHQgaXMKKyAgICAvLyBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSyB8IENBTl9QQVVTRQorICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSyB8IENBTl9QQVVTRTsKKyAgICB9OworCisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiPHVuc3BlY2lmaWVkPiI7IH0KKworcHJvdGVjdGVkOgorICAgIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKCkge30KKworcHJpdmF0ZToKKyAgICBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlcihjb25zdCBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciAmKTsKKyAgICBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyICYpOworfTsKKworaW5saW5lIENNZWRpYUV4dHJhY3RvciAqd3JhcChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciAqZXh0cmFjdG9yKSB7CisgICAgQ01lZGlhRXh0cmFjdG9yICp3cmFwcGVyID0gKENNZWRpYUV4dHJhY3RvciopIG1hbGxvYyhzaXplb2YoQ01lZGlhRXh0cmFjdG9yKSk7CisgICAgd3JhcHBlci0+ZGF0YSA9IGV4dHJhY3RvcjsKKyAgICB3cmFwcGVyLT5mcmVlID0gW10odm9pZCAqZGF0YSkgLT4gdm9pZCB7CisgICAgICAgIGRlbGV0ZSAoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKShkYXRhKTsKKyAgICB9OworICAgIHdyYXBwZXItPmNvdW50VHJhY2tzID0gW10odm9pZCAqZGF0YSkgLT4gc2l6ZV90IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5jb3VudFRyYWNrcygpOworICAgIH07CisgICAgd3JhcHBlci0+Z2V0VHJhY2sgPSBbXSh2b2lkICpkYXRhLCBzaXplX3QgaW5kZXgpIC0+IENNZWRpYVRyYWNrKiB7CisgICAgICAgIHJldHVybiB3cmFwKCgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5nZXRUcmFjayhpbmRleCkpOworICAgIH07CisgICAgd3JhcHBlci0+Z2V0VHJhY2tNZXRhRGF0YSA9IFtdKAorICAgICAgICAgICAgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKKyAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5nZXRUcmFja01ldGFEYXRhKG1ldGEsIGluZGV4LCBmbGFncyk7CisgICAgfTsKKyAgICB3cmFwcGVyLT5nZXRNZXRhRGF0YSA9IFtdKAorICAgICAgICAgICAgdm9pZCAqZGF0YSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSkgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPmdldE1ldGFEYXRhKG1ldGEpOworICAgIH07CisgICAgd3JhcHBlci0+ZmxhZ3MgPSBbXSgKKyAgICAgICAgICAgIHZvaWQgKmRhdGEpIC0+IHVpbnQzMl90IHsKKyAgICAgICAgcmV0dXJuICgoTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIqKWRhdGEpLT5mbGFncygpOworICAgIH07CisgICAgd3JhcHBlci0+c2V0TWVkaWFDYXMgPSBbXSgKKyAgICAgICAgICAgIHZvaWQgKmRhdGEsIGNvbnN0IHVpbnQ4X3QgKmNhc1Rva2VuLCBzaXplX3Qgc2l6ZSkgLT4gbWVkaWFfc3RhdHVzX3QgeworICAgICAgICByZXR1cm4gKChNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciopZGF0YSktPnNldE1lZGlhQ2FzKGNhc1Rva2VuLCBzaXplKTsKKyAgICB9OworICAgIHdyYXBwZXItPm5hbWUgPSBbXSgKKyAgICAgICAgICAgIHZvaWQgKmRhdGEpIC0+IGNvbnN0IGNoYXIgKiB7CisgICAgICAgIHJldHVybiAoKE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyKilkYXRhKS0+bmFtZSgpOworICAgIH07CisgICAgcmV0dXJuIHdyYXBwZXI7Cit9CisKKy8qIGFkZHMgc29tZSBjb252aWVuY2UgbWV0aG9kcyAqLworY2xhc3MgRGF0YVNvdXJjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgRGF0YVNvdXJjZUhlbHBlcihDRGF0YVNvdXJjZSAqY3NvdXJjZSkgeworICAgICAgICBtU291cmNlID0gY3NvdXJjZTsKKyAgICB9CisKKyAgICBleHBsaWNpdCBEYXRhU291cmNlSGVscGVyKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgeworICAgICAgICBtU291cmNlID0gc291cmNlLT5tU291cmNlOworICAgIH0KKworICAgIHZpcnR1YWwgfkRhdGFTb3VyY2VIZWxwZXIoKSB7fQorCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWRBdChtU291cmNlLT5oYW5kbGUsIG9mZnNldCwgZGF0YSwgc2l6ZSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPmdldFNpemUobVNvdXJjZS0+aGFuZGxlLCBzaXplKTsKKyAgICB9CisKKyAgICBib29sIGdldFVyaShjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5nZXRVcmkobVNvdXJjZS0+aGFuZGxlLCB1cmlTdHJpbmcsIGJ1ZmZlclNpemUpOworICAgIH0KKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7CisgICAgICAgIHJldHVybiBtU291cmNlLT5mbGFncyhtU291cmNlLT5oYW5kbGUpOworICAgIH0KKworICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZHM6CisgICAgYm9vbCBnZXRVSW50MTYob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4KSB7CisgICAgICAgICp4ID0gMDsKKworICAgICAgICB1aW50OF90IGJ5dGVbMl07CisgICAgICAgIGlmIChyZWFkQXQob2Zmc2V0LCBieXRlLCAyKSAhPSAyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAqeCA9IChieXRlWzBdIDw8IDgpIHwgYnl0ZVsxXTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyAzIGJ5dGUgaW50LCByZXR1cm5lZCBhcyBhIDMyLWJpdCBpbnQKKyAgICBib29sIGdldFVJbnQyNChvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngpIHsKKyAgICAgICAgKnggPSAwOworCisgICAgICAgIHVpbnQ4X3QgYnl0ZVszXTsKKyAgICAgICAgaWYgKHJlYWRBdChvZmZzZXQsIGJ5dGUsIDMpICE9IDMpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgICp4ID0gKGJ5dGVbMF0gPDwgMTYpIHwgKGJ5dGVbMV0gPDwgOCkgfCBieXRlWzJdOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgZ2V0VUludDMyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCkgeworICAgICAgICAqeCA9IDA7CisKKyAgICAgICAgdWludDMyX3QgdG1wOworICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgNCkgIT0gNCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgKnggPSBudG9obCh0bXApOworCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGJvb2wgZ2V0VUludDY0KG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCkgeworICAgICAgICAqeCA9IDA7CisKKyAgICAgICAgdWludDY0X3QgdG1wOworICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgOCkgIT0gOCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgKnggPSAoKHVpbnQ2NF90KW50b2hsKHRtcCAmIDB4ZmZmZmZmZmYpIDw8IDMyKSB8IG50b2hsKHRtcCA+PiAzMik7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gcmVhZCBlaXRoZXIgaW50PE4+IG9yIGludDwyTj4gaW50byBhIHVpbnQ8Mk4+X3QsIHNpemUgaXMgdGhlIGludCBzaXplIGluIGJ5dGVzLgorICAgIGJvb2wgZ2V0VUludDE2VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCAqeCwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPT0gMikgeworICAgICAgICAgICAgcmV0dXJuIGdldFVJbnQxNihvZmZzZXQsIHgpOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID09IDEpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgdG1wOworICAgICAgICAgICAgaWYgKHJlYWRBdChvZmZzZXQsICZ0bXAsIDEpID09IDEpIHsKKyAgICAgICAgICAgICAgICAqeCA9IHRtcDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBnZXRVSW50MzJWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4LCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA9PSA0KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VUludDMyKG9mZnNldCwgeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPT0gMikgeworICAgICAgICAgICAgdWludDE2X3QgdG1wOworICAgICAgICAgICAgaWYgKGdldFVJbnQxNihvZmZzZXQsICZ0bXApKSB7CisgICAgICAgICAgICAgICAgKnggPSB0bXA7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgZ2V0VUludDY0VmFyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgaWYgKHNpemUgPT0gOCkgeworICAgICAgICAgICAgcmV0dXJuIGdldFVJbnQ2NChvZmZzZXQsIHgpOworICAgICAgICB9CisgICAgICAgIGlmIChzaXplID09IDQpIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHRtcDsKKyAgICAgICAgICAgIGlmIChnZXRVSW50MzIob2Zmc2V0LCAmdG1wKSkgeworICAgICAgICAgICAgICAgICp4ID0gdG1wOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBDRGF0YVNvdXJjZSAqbVNvdXJjZTsKK307CisKKworCisvLyBoZWxwZXJzIHRvIGNyZWF0ZSBhIG1lZGlhX3V1aWRfdCBmcm9tIGEgc3RyaW5nIGxpdGVyYWwKKworLy8gcHVycG9zZWx5IG5vdCBkZWZpbmVkIGFueXdoZXJlIHNvIHRoYXQgdGhpcyB3aWxsIGZhaWwgdG8gbGluayBpZgorLy8gZXhwcmVzc2lvbnMgYmVsb3cgYXJlIG5vdCBldmFsdWF0ZWQgYXQgY29tcGlsZSB0aW1lCitpbnQgaW52YWxpZF91dWlkX3N0cmluZyhjb25zdCBjaGFyICopOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Citjb25zdGV4cHIgdWludDhfdCBfZGlnaXRBdF8oY29uc3QgVCAoJnMpW05dLCBjb25zdCBzaXplX3QgbikgeworICAgIHJldHVybiBzW25dID49ICcwJyAmJiBzW25dIDw9ICc5JyA/IHNbbl0gLSAnMCcKKyAgICAgICAgICAgIDogc1tuXSA+PSAnYScgJiYgc1tuXSA8PSAnZicgPyBzW25dIC0gJ2EnICsgMTAKKyAgICAgICAgICAgICAgICAgICAgOiBzW25dID49ICdBJyAmJiBzW25dIDw9ICdGJyA/IHNbbl0gLSAnQScgKyAxMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogaW52YWxpZF91dWlkX3N0cmluZygidXVpZDogYmFkIGRpZ2l0cyIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc2l6ZV90IE4+Citjb25zdGV4cHIgdWludDhfdCBfaGV4Qnl0ZUF0Xyhjb25zdCBUICgmcylbTl0sIHNpemVfdCBuKSB7CisgICAgcmV0dXJuIChfZGlnaXRBdF8ocywgbikgPDwgNCkgKyBfZGlnaXRBdF8ocywgbiArIDEpOworfQorCitjb25zdGV4cHIgYm9vbCBfYXNzZXJ0SXNEYXNoXyhjaGFyIGMpIHsKKyAgICByZXR1cm4gYyA9PSAnLScgPyB0cnVlIDogaW52YWxpZF91dWlkX3N0cmluZygiV3JvbmcgZm9ybWF0Iik7Cit9CisKK3RlbXBsYXRlIDxzaXplX3QgTj4KK2NvbnN0ZXhwciBtZWRpYV91dWlkX3QgY29uc3RVVUlEKGNvbnN0IGNoYXIgKCZzKSBbTl0pIHsKKyAgICBzdGF0aWNfYXNzZXJ0KE4gPT0gMzcsICJ1dWlkOiB3cm9uZyBsZW5ndGgiKTsKKyAgICByZXR1cm4KKyAgICAgICAgICAgIF9hc3NlcnRJc0Rhc2hfKHNbOF0pLAorICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1sxM10pLAorICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1sxOF0pLAorICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1syM10pLAorICAgICAgICAgICAgbWVkaWFfdXVpZF90IHt7CisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgNCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgNiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgOSksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTEpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDE0KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxNiksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTkpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDIxKSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyNCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjYpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDI4KSwKKyAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAzMCksCisgICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMzIpLAorICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDM0KSwKKyAgICAgICAgICAgIH19OworfQorLy8gQ29udmVuaWVuY2UgbWFjcm8gdG8gY3JlYXRlIGEgbWVkaWFfdXVpZF90IGZyb20gYSBzdHJpbmcgbGl0ZXJhbCwgd2hpY2ggc2hvdWxkCisvLyBiZSBmb3JtYXR0ZWQgYXMgIjEyMzQ1Njc4LTEyMzQtMTIzNC0xMjM0LTEyMzQ1Njc4OWFiYyIsIGFzIGdlbmVyYXRlZCBieQorLy8gZS5nLiBodHRwczovL3d3dy51dWlkZ2VuZXJhdG9yLm5ldC8gb3IgdGhlICd1dWlkZ2VuJyBsaW51eCBjb21tYW5kLgorLy8gSGV4IGRpZ2l0cyBtYXkgYmUgdXBwZXIgb3IgbG93ZXIgY2FzZS4KKy8vCisvLyBUaGUgbWFjcm8gY2FsbCBpcyBvdGhlcndpc2UgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nIHRoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkKKy8vIChlLmcuIFVVSUQoIjdkNjEzODU4LTU4MzctNGEzOC04NGM1LTMzMmQxY2RkZWUyNyIpIGlzIHRoZSBzYW1lIGFzCisvLyAgICAgICB7ezB4N2QsIDB4NjEsIDB4MzgsIDB4NTgsIDB4NTgsIDB4MzcsIDB4NGEsIDB4MzgsCisvLyAgICAgICAgIDB4ODQsIDB4YzUsIDB4MzMsIDB4MmQsIDB4MWMsIDB4ZGQsIDB4ZWUsIDB4Mjd9fSkKKworI2RlZmluZSBVVUlEKHN0cikgW117IGNvbnN0ZXhwciBtZWRpYV91dWlkX3QgdXVpZCA9IGNvbnN0VVVJRChzdHIpOyByZXR1cm4gdXVpZDsgfSgpCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfRVhUUkFDVE9SX1BMVUdJTl9IRUxQRVJfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRhZGF0YVJldHJpZXZlckludGVyZmFjZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDFjNTM1MTEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFNZXRyaWNzLmggYi9pbmNsdWRlL21lZGlhL01lZGlhTWV0cmljcy5oCm5ldyBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwMDAwMDAuLjVmNzU3ZTQKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL21lZGlhL01lZGlhTWV0cmljcy5oCkBAIC0wLDAgKzEgQEAKKy4uLy4uL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhTWV0cmljcy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVByb2ZpbGVzLmggYi9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggNjUxYzZlNi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBlNDBmOTkyLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZXNvdXJjZS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDkxMzQ2YWEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVzb3VyY2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZXNvdXJjZVBvbGljeS5oIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlUG9saWN5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDVkMTY1ZWUuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlc291cmNlUG9saWN5LmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVzb3VyY2VQb2xpY3kuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaAppbmRleCAyZTE0N2M0Li4zNGJmNjVkIDEyMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhU291cmNlLmgKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVNvdXJjZS5oCkBAIC0xICsxIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisuLi8uLi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaCBiL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA1YTYzMjg3YS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmggYi9pbmNsdWRlL21lZGlhL01lZGlhVHJhY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTNlYmEzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE1FRElBX1NPVVJDRV9CQVNFX0hfCisKKyNkZWZpbmUgTUVESUFfU09VUkNFX0JBU0VfSF8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhQnVmZmVyQmFzZTsKK3N0cnVjdCBDTWVkaWFUcmFjazsKKworY2xhc3MgU291cmNlQmFzZUFsbG9jVHJhY2tlciB7CitwdWJsaWM6CisgICAgU291cmNlQmFzZUFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoInNvdXJjZWJhc2UgYWxsb2NhdGVkOiAlcCIsIHRoaXMpOworICAgIH0KKyAgICB2aXJ0dWFsIH5Tb3VyY2VCYXNlQWxsb2NUcmFja2VyKCkgeworICAgICAgICBBTE9HRCgic291cmNlYmFzZSBmcmVlZDogJXAiLCB0aGlzKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgTWVkaWFUcmFjaworLy8gICAgOiBwdWJsaWMgU291cmNlQmFzZUFsbG9jVHJhY2tlcgoreworICAgIE1lZGlhVHJhY2soKTsKKworICAgIC8vIFRvIGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIG1ldGhvZHMgb24gdGhpcyBvYmplY3QsIGV4Y2VwdAorICAgIC8vIGdldEZvcm1hdCgpLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7CisKKyAgICAvLyBBbnkgYmxvY2tpbmcgcmVhZCBjYWxsIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCBhIHJlc3VsdCBvZiBOT19JTklULgorICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgYW55IG1ldGhvZHMgb3RoZXIgdGhhbiBzdGFydCBhZnRlciB0aGlzIGNhbGwKKyAgICAvLyByZXR1cm5zLiBBbnkgYnVmZmVycyB0aGUgb2JqZWN0IG1heSBiZSBob2xkaW5nIG9udG8gYXQgdGhlIHRpbWUgb2YKKyAgICAvLyB0aGUgc3RvcCgpIGNhbGwgYXJlIHJlbGVhc2VkLgorICAgIC8vIEFsc28sIGl0IGlzIGltcGVyYXRpdmUgdGhhdCBhbnkgYnVmZmVycyBvdXRwdXQgYnkgdGhpcyBvYmplY3QgYW5kCisgICAgLy8gaGVsZCBvbnRvIGJ5IGNhbGxlcnMgYmUgcmVsZWFzZWQgYmVmb3JlIGEgY2FsbCB0byBzdG9wKCkgISEhCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOworCisgICAgLy8gUmV0dXJucyB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIG91dHB1dCBieSB0aGlzIG1lZGlhIHRyYWNrLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYgZm9ybWF0KSA9IDA7CisKKyAgICAvLyBPcHRpb25zIHRoYXQgbW9kaWZ5IHJlYWQoKSBiZWhhdmlvdXIuIFRoZSBkZWZhdWx0IGlzIHRvCisgICAgLy8gYSkgbm90IHJlcXVlc3QgYSBzZWVrCisgICAgLy8gYikgbm90IGJlIGxhdGUsIGkuZS4gbGF0ZW5lc3NfdXMgPSAwCisgICAgc3RydWN0IFJlYWRPcHRpb25zIHsKKyAgICAgICAgZW51bSBTZWVrTW9kZSA6IGludDMyX3QgeworICAgICAgICAgICAgU0VFS19QUkVWSU9VU19TWU5DID0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DLAorICAgICAgICAgICAgU0VFS19ORVhUX1NZTkMgPSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQywKKyAgICAgICAgICAgIFNFRUtfQ0xPU0VTVF9TWU5DID0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkMsCisgICAgICAgICAgICBTRUVLX0NMT1NFU1QgPSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QsCisgICAgICAgICAgICBTRUVLX0ZSQU1FX0lOREVYID0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19GUkFNRV9JTkRFWCwKKyAgICAgICAgfTsKKworICAgICAgICBSZWFkT3B0aW9ucygpIHsKKyAgICAgICAgICAgIHJlc2V0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZXNldCBldmVyeXRoaW5nIGJhY2sgdG8gZGVmYXVsdHMuCisgICAgICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgICAgICBtT3B0aW9ucyA9IDA7CisgICAgICAgICAgICBtU2Vla1RpbWVVcyA9IDA7CisgICAgICAgICAgICBtTm9uQmxvY2tpbmcgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgc2V0U2Vla1RvKGludDY0X3QgdGltZV91cywgU2Vla01vZGUgbW9kZSA9IFNFRUtfQ0xPU0VTVF9TWU5DKTsKKyAgICAgICAgdm9pZCBjbGVhclNlZWtUbygpIHsKKyAgICAgICAgICAgIG1PcHRpb25zICY9IH5rU2Vla1RvX09wdGlvbjsKKyAgICAgICAgICAgIG1TZWVrVGltZVVzID0gMDsKKyAgICAgICAgICAgIG1TZWVrTW9kZSA9IFNFRUtfQ0xPU0VTVF9TWU5DOworICAgICAgICB9CisgICAgICAgIGJvb2wgZ2V0U2Vla1RvKGludDY0X3QgKnRpbWVfdXMsIFNlZWtNb2RlICptb2RlKSBjb25zdDsKKworICAgICAgICB2b2lkIHNldE5vbkJsb2NraW5nKCk7CisgICAgICAgIHZvaWQgY2xlYXJOb25CbG9ja2luZygpOworICAgICAgICBib29sIGdldE5vbkJsb2NraW5nKCkgY29uc3Q7CisKKyAgICAgICAgLy8gVXNlZCB0byBjbGVhciBhbGwgbm9uLXBlcnNpc3RlbnQgb3B0aW9ucyBmb3IgbXVsdGlwbGUgYnVmZmVyIHJlYWRzLgorICAgICAgICB2b2lkIGNsZWFyTm9uUGVyc2lzdGVudCgpIHsKKyAgICAgICAgICAgIGNsZWFyU2Vla1RvKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGVudW0gT3B0aW9ucyB7CisgICAgICAgICAgICBrU2Vla1RvX09wdGlvbiAgICAgID0gMSwKKyAgICAgICAgfTsKKworICAgICAgICB1aW50MzJfdCBtT3B0aW9uczsKKyAgICAgICAgaW50NjRfdCBtU2Vla1RpbWVVczsKKyAgICAgICAgU2Vla01vZGUgbVNlZWtNb2RlOworICAgICAgICBib29sIG1Ob25CbG9ja2luZzsKKyAgICB9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOyAvLyBzZW50IHRocm91Z2ggQmluZGVyCisKKyAgICAvLyBSZXR1cm5zIGEgbmV3IGJ1ZmZlciBvZiBkYXRhLiBDYWxsIGJsb2NrcyB1bnRpbCBhCisgICAgLy8gYnVmZmVyIGlzIGF2YWlsYWJsZSwgYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgb2YgdGhlIGVuZCBvZiB0aGUgc3RyZWFtCisgICAgLy8gaXMgcmVhY2hlZC4KKyAgICAvLyBFbmQgb2Ygc3RyZWFtIGlzIHNpZ25hbGxlZCBieSBhIHJlc3VsdCBvZiBFUlJPUl9FTkRfT0ZfU1RSRUFNLgorICAgIC8vIEEgcmVzdWx0IG9mIElORk9fRk9STUFUX0NIQU5HRUQgaW5kaWNhdGVzIHRoYXQgdGhlIGZvcm1hdCBvZiB0aGlzCisgICAgLy8gTWVkaWFTb3VyY2UgaGFzIGNoYW5nZWQgbWlkLXN0cmVhbSwgdGhlIGNsaWVudCBjYW4gY29udGludWUgcmVhZGluZworICAgIC8vIGJ1dCBzaG91bGQgYmUgcHJlcGFyZWQgZm9yIGJ1ZmZlcnMgb2YgdGhlIG5ldyBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKSA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgfHJlYWR8IHN1cHBvcnRzIG5vbmJsb2NraW5nIG9wdGlvbiwgb3RoZXJ3aXNlIGZhbHNlLgorICAgIC8vIHxyZWFkTXVsdGlwbGV8IGlmIHN1cHBvcnRlZCwgYWx3YXlzIGFsbG93cyB0aGUgbm9uYmxvY2tpbmcgb3B0aW9uLgorICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdmlydHVhbCB+TWVkaWFUcmFjaygpOworCitwcml2YXRlOgorICAgIE1lZGlhVHJhY2soY29uc3QgTWVkaWFUcmFjayAmKTsKKyAgICBNZWRpYVRyYWNrICZvcGVyYXRvcj0oY29uc3QgTWVkaWFUcmFjayAmKTsKK307CisKK2NsYXNzIE1lZGlhVHJhY2tDVW53cmFwcGVyIDogcHVibGljIE1lZGlhVHJhY2sgeworcHVibGljOgorICAgIHN0YXRpYyBNZWRpYVRyYWNrQ1Vud3JhcHBlciAqY3JlYXRlKENNZWRpYVRyYWNrICp3cmFwcGVyKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UmIGZvcm1hdCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCk7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NZWRpYVRyYWNrQ1Vud3JhcHBlcigpOworCitwcml2YXRlOgorICAgIGV4cGxpY2l0IE1lZGlhVHJhY2tDVW53cmFwcGVyKENNZWRpYVRyYWNrICp3cmFwcGVyKTsKKyAgICBDTWVkaWFUcmFjayAqd3JhcHBlcjsKKyAgICBNZWRpYUJ1ZmZlckdyb3VwICpidWZmZXJHcm91cDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfU09VUkNFX0JBU0VfSF8KZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5oIGIvaW5jbHVkZS9tZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDUwNDE3M2UuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9NZW1vcnlMZWFrVHJhY2tVdGlsLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvTWV0YWRhdGEuaCBiL2luY2x1ZGUvbWVkaWEvTWV0YWRhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggZTQyMTE2OC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL01ldGFkYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01ldGFkYXRhLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL01pZGlEZXZpY2VJbmZvLmggYi9pbmNsdWRlL21lZGlhL01pZGlEZXZpY2VJbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDk1ZGE3Y2YuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9NaWRpRGV2aWNlSW5mby5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NaWRpRGV2aWNlSW5mby5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9NaWRpSW9XcmFwcGVyLmggYi9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggNzg2ZWMzZC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWlkaUlvV3JhcHBlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9Nb2R1bG8uaCBiL2luY2x1ZGUvbWVkaWEvTW9kdWxvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDk4OWM0Y2IuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9Nb2R1bG8uaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTW9kdWxvLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3JQcml2LmggYi9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3JQcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JiYmE3OQotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfTkRLX01FRElBX0VSUk9SX1BSSVZfSAorI2RlZmluZSBfTkRLX01FRElBX0VSUk9SX1BSSVZfSAorCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCittZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3IoYW5kcm9pZDo6c3RhdHVzX3QpOworCithbmRyb2lkOjpzdGF0dXNfdCByZXZlcnNlX3RyYW5zbGF0ZV9lcnJvcihtZWRpYV9zdGF0dXNfdCk7CisKKyNlbmRpZiAvLyBfTkRLX01FRElBX0VSUk9SX1BSSVZfSApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaCBiL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZkYTRhOAotLS0gL2Rldi9udWxsCisrKyBiL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qCisgKiBUaGlzIGZpbGUgZGVmaW5lcyBhbiBOREsgQVBJLgorICogRG8gbm90IHJlbW92ZSBtZXRob2RzLgorICogRG8gbm90IGNoYW5nZSBtZXRob2Qgc2lnbmF0dXJlcy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHZhbHVlIG9mIGNvbnN0YW50cy4KKyAqIERvIG5vdCBjaGFuZ2UgdGhlIHNpemUgb2YgYW55IG9mIHRoZSBjbGFzc2VzIGRlZmluZWQgaW4gaGVyZS4KKyAqIERvIG5vdCByZWZlcmVuY2UgdHlwZXMgdGhhdCBhcmUgbm90IHBhcnQgb2YgdGhlIE5ESy4KKyAqIERvIG5vdCAjaW5jbHVkZSBmaWxlcyB0aGF0IGFyZW4ndCBwYXJ0IG9mIHRoZSBOREsuCisgKi8KKworI2lmbmRlZiBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKKyNkZWZpbmUgX05ES19NRURJQV9GT1JNQVRfUFJJVl9ICisKKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKK3N0cnVjdCBBTWVkaWFGb3JtYXQgeworICAgIGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkFNZXNzYWdlPiBtRm9ybWF0OworICAgIGFuZHJvaWQ6OlN0cmluZzggbURlYnVnOworICAgIGFuZHJvaWQ6OktleWVkVmVjdG9yPGFuZHJvaWQ6OlN0cmluZzgsIGFuZHJvaWQ6OlN0cmluZzg+IG1TdHJpbmdDYWNoZTsKK307CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBTWVkaWFGb3JtYXQqIEFNZWRpYUZvcm1hdF9mcm9tTXNnKHNwPEFNZXNzYWdlPiAqKTsKK3ZvaWQgQU1lZGlhRm9ybWF0X2dldEZvcm1hdChjb25zdCBBTWVkaWFGb3JtYXQqIG1EYXRhLCBzcDxBTWVzc2FnZT4gKmRlc3QpOworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKKwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9PTVhCdWZmZXIuaCBiL2luY2x1ZGUvbWVkaWEvT01YQnVmZmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwZGIyMDcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9PTVhCdWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvT01YQnVmZmVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL09NWEZlbmNlUGFyY2VsYWJsZS5oIGIvaW5jbHVkZS9tZWRpYS9PTVhGZW5jZVBhcmNlbGFibGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggYzRjMWIwYS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL09NWEZlbmNlUGFyY2VsYWJsZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9PTVhGZW5jZVBhcmNlbGFibGUuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvUGx1Z2luTG9hZGVyLmggYi9pbmNsdWRlL21lZGlhL1BsdWdpbkxvYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA5MTAxNzM1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvUGx1Z2luTG9hZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BsdWdpbkxvYWRlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9QbHVnaW5NZXRyaWNzUmVwb3J0aW5nLmggYi9pbmNsdWRlL21lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggN2Q5YTdhMC4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL1BsdWdpbk1ldHJpY3NSZXBvcnRpbmcuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUGx1Z2luTWV0cmljc1JlcG9ydGluZy5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9SZWNvcmRCdWZmZXJDb252ZXJ0ZXIuaCBiL2luY2x1ZGUvbWVkaWEvUmVjb3JkQnVmZmVyQ29udmVydGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDJkN2JjMGMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9SZWNvcmRCdWZmZXJDb252ZXJ0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUmVjb3JkQnVmZmVyQ29udmVydGVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1JpbmdCdWZmZXIuaCBiL2luY2x1ZGUvbWVkaWEvUmluZ0J1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA5YWYyOGQ1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvUmluZ0J1ZmZlci5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9SaW5nQnVmZmVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1NpbmdsZVN0YXRlUXVldWUuaCBiL2luY2x1ZGUvbWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA2MTlmNmVlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1N0cmluZ0FycmF5LmggYi9pbmNsdWRlL21lZGlhL1N0cmluZ0FycmF5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDYxNmNlNmMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9TdHJpbmdBcnJheS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9TdHJpbmdBcnJheS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaCBiL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGUzZWYxMzQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9UaW1lQ2hlY2suaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1RvbmVHZW5lcmF0b3IuaCBiL2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAzM2RmMGUzLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvVG9uZUdlbmVyYXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9Ub25lR2VuZXJhdG9yLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaCBiL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA4MzdhZjQ0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9UeXBlQ29udmVydGVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1Zpc3VhbGl6ZXIuaCBiL2luY2x1ZGUvbWVkaWEvVmlzdWFsaXplci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBlZDJlYzE1Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvVmlzdWFsaXplci5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9WaXN1YWxpemVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaCBiL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBhZGFhNDg5Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9Wb3JiaXNDb21tZW50LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL2NvbnZlcnQuaCBiL2luY2x1ZGUvbWVkaWEvY29udmVydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBjYjBkMDBkLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvY29udmVydC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9jb252ZXJ0LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL21lZGlhbWV0YWRhdGFyZXRyaWV2ZXIuaCBiL2luY2x1ZGUvbWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBiNDAxYmFiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvbWVkaWFtZXRhZGF0YXJldHJpZXZlci5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYW1ldGFkYXRhcmV0cmlldmVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmggYi9pbmNsdWRlL21lZGlhL21lZGlhcGxheWVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDA2ZDUzN2IuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXBsYXllci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmggYi9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggYTI0ZGViMy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFyZWNvcmRlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9tZWRpYXNjYW5uZXIuaCBiL2luY2x1ZGUvbWVkaWEvbWVkaWFzY2FubmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDkxNDc5ZTAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9tZWRpYXNjYW5uZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvbWVkaWFzY2FubmVyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvQnVmZmVyUHJvdmlkZXJTb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA1NTg0MWU3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9CdWZmZXJQcm92aWRlclNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb0J1ZmZlclByb3ZpZGVyU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0F1ZGlvU3RyZWFtSW5Tb3VyY2UuaCBiL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBmNWJjYzc2Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vQXVkaW9TdHJlYW1JblNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9BdWRpb1N0cmVhbUluU291cmNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTaW5rLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDhhMTNiNmMuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU2luay5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU2luay5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9MaWJzbmRmaWxlU291cmNlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTb3VyY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMjc1MGZkZS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL0xpYnNuZGZpbGVTb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vTGlic25kZmlsZVNvdXJjZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZS5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA0ZWE0M2JlLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGUuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAzMGY0MjZjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vTW9ub1BpcGVSZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9Nb25vUGlwZVJlYWRlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggYTRiYmJjOS4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGUuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9QaXBlUmVhZGVyLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGVSZWFkZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggNjRiMjFjZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL25iYWlvL1BpcGVSZWFkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uLy4uL21lZGlhL2xpYm5iYWlvL2luY2x1ZGUvbWVkaWEvbmJhaW8vUGlwZVJlYWRlci5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYS9uYmFpby9TaW5nbGVTdGF0ZVF1ZXVlLmggYi9pbmNsdWRlL21lZGlhL25iYWlvL1NpbmdsZVN0YXRlUXVldWUuaApuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5kM2UwNTUzCi0tLSAvZGV2L251bGwKKysrIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9TaW5nbGVTdGF0ZVF1ZXVlLmgKQEAgLTAsMCArMSBAQAorLi4vLi4vLi4vbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL1NpbmdsZVN0YXRlUXVldWUuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oIGIvaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDc0YTNiMDYuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmFpby9Tb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi8uLi9tZWRpYS9saWJuYmFpby9pbmNsdWRlL21lZGlhL25iYWlvL1NvdXJjZUF1ZGlvQnVmZmVyUHJvdmlkZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWEvbmJsb2cvTkJMb2cuaCBiL2luY2x1ZGUvbWVkaWEvbmJsb2cvTkJMb2cuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggM2NjMzY2Yy4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhL25ibG9nL05CTG9nLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi8uLi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL05CTG9nLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaCBiL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA2ZWFkM2JjLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vLi4vbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmggYi9pbmNsdWRlL21lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGU5YjhlODAuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vLi4vbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9tZWRpYWRybS9DcnlwdG9IYWwuaCBiL2luY2x1ZGUvbWVkaWFkcm0vQ3J5cHRvSGFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDkyZjMxMzcuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYWRybS9DcnlwdG9IYWwuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ3J5cHRvSGFsLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhZHJtL0RybUhhbC5oIGIvaW5jbHVkZS9tZWRpYWRybS9Ecm1IYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMTdiYjY2Ny4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhZHJtL0RybUhhbC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWFkcm0vRHJtTWV0cmljcy5oIGIvaW5jbHVkZS9tZWRpYWRybS9Ecm1NZXRyaWNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGFiYzk2NmIuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYWRybS9Ecm1NZXRyaWNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybU1ldHJpY3MuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWFkcm0vRHJtUGx1Z2luUGF0aC5oIGIvaW5jbHVkZS9tZWRpYWRybS9Ecm1QbHVnaW5QYXRoLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDllMDUxOTQuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYWRybS9Ecm1QbHVnaW5QYXRoLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybVBsdWdpblBhdGguaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWFkcm0vRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZS5oIGIvaW5jbHVkZS9tZWRpYWRybS9Ecm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IGY0ZTMyMTEuLjAwMDAwMDAKLS0tIGEvaW5jbHVkZS9tZWRpYWRybS9Ecm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybVNlc3Npb25DbGllbnRJbnRlcmZhY2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2luY2x1ZGUvbWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuaCBiL2luY2x1ZGUvbWVkaWFkcm0vRHJtU2Vzc2lvbk1hbmFnZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggZjBhNDdiZi4uMDAwMDAwMAotLS0gYS9pbmNsdWRlL21lZGlhZHJtL0RybVNlc3Npb25NYW5hZ2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybVNlc3Npb25NYW5hZ2VyLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhZHJtL0lDcnlwdG8uaCBiL2luY2x1ZGUvbWVkaWFkcm0vSUNyeXB0by5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBiMjUwZTA3Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWFkcm0vSUNyeXB0by5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JQ3J5cHRvLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhZHJtL0lEcm0uaCBiL2luY2x1ZGUvbWVkaWFkcm0vSURybS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA4NDFiYjFiLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWFkcm0vSURybS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRHJtLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhZHJtL0lEcm1DbGllbnQuaCBiL2luY2x1ZGUvbWVkaWFkcm0vSURybUNsaWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAxMGFhNWMwLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWFkcm0vSURybUNsaWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRHJtQ2xpZW50LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhZHJtL0lNZWRpYURybVNlcnZpY2UuaCBiL2luY2x1ZGUvbWVkaWFkcm0vSU1lZGlhRHJtU2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCBmM2MyNjBmLi4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWFkcm0vSU1lZGlhRHJtU2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFEcm1TZXJ2aWNlLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL21lZGlhZHJtL1NoYXJlZExpYnJhcnkuaCBiL2luY2x1ZGUvbWVkaWFkcm0vU2hhcmVkTGlicmFyeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCA5ZjhmNWE0Li4wMDAwMDAwCi0tLSBhL2luY2x1ZGUvbWVkaWFkcm0vU2hhcmVkTGlicmFyeS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9TaGFyZWRMaWJyYXJ5LmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oIGIvaW5jbHVkZS9wcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaAppbmRleCBjYTExOWQ1Li4xYjFmMTQ5IDEwMDY0NAotLS0gYS9pbmNsdWRlL3ByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oCisrKyBiL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmgKQEAgLTI4LDcgKzI4LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVGltZXN0YW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvTW9kdWxvLmg+Ci0jaW5jbHVkZSA8bWVkaWEvU2luZ2xlU3RhdGVRdWV1ZS5oPgorI2luY2x1ZGUgPG1lZGlhL25iYWlvL1NpbmdsZVN0YXRlUXVldWUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC01MzgsNiArNTM4LDEwIEBACiAgICAgICAgIG1UaW1lc3RhbXBNdXRhdG9yLnB1c2godGltZXN0YW1wKTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIEV4dGVuZGVkVGltZXN0YW1wIGdldFRpbWVzdGFtcCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UaW1lc3RhbXBNdXRhdG9yLmxhc3QoKTsKKyAgICB9CisKICAgICAvLyBGbHVzaGVzIHRoZSBzaGFyZWQgcmluZyBidWZmZXIgaWYgdGhlIGNsaWVudCBoYWQgcmVxdWVzdGVkIGl0IHVzaW5nIG1TdHJlYW1pbmcubUZsdXNoLgogICAgIC8vIElmIGZsdXNoIG9jY3VycyB0aGVuOgogICAgIC8vICAgY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udCwgU2VydmVyUHJveHk6Om1GbHVzaCBhbmQgU2VydmVyUHJveHk6Om1GbHVzaGVkIHdpbGwgYmUgbW9kaWZpZWQKQEAgLTU1MSw2ICs1NTUsOSBAQAogICAgIC8vIFRvdGFsIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgZmx1c2hlZCBmcmFtZXMgc2luY2UgY3JlYXRpb24gKG5ldmVyIHJlc2V0KS4KICAgICB2aXJ0dWFsIGludDY0X3QgICAgIGZyYW1lc0ZsdXNoZWQoKSBjb25zdCB7IHJldHVybiBtRmx1c2hlZDsgfQogCisgICAgLy8gU2FmZSBmcmFtZXMgcmVhZHkgcXVlcnkgd2l0aCBubyBzaWRlIGVmZmVjdHMuCisgICAgdmlydHVhbCBzaXplX3QgICAgICBmcmFtZXNSZWFkeVNhZmUoKSBjb25zdCA9IDA7CisKICAgICAvLyBHZXQgZHluYW1pYyBidWZmZXIgc2l6ZSBmcm9tIHRoZSBzaGFyZWQgY29udHJvbCBibG9jay4KICAgICB1aW50MzJfdCAgICAgICAgICAgIGdldEJ1ZmZlclNpemVJbkZyYW1lcygpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgoaW50MzJfdCAqKSZtQ2Jsay0+bUJ1ZmZlclNpemVJbkZyYW1lcyk7CkBAIC01ODgsOCArNTk1LDcgQEAKICAgICAvLyB3aGljaCBtYXkgaW5jbHVkZSBub24tY29udGlndW91cyBmcmFtZXMKICAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lc1JlYWR5KCk7CiAKLSAgICAvLyBTYWZlIGZyYW1lcyByZWFkeSBxdWVyeSB1c2VkIGJ5IGR1bXAoKSAtIHRoaXMgaGFzIG5vIHNpZGUgZWZmZWN0cy4KLSAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lc1JlYWR5U2FmZSgpIGNvbnN0OworICAgIHNpemVfdCAgICAgICAgICAgICAgZnJhbWVzUmVhZHlTYWZlKCkgY29uc3Qgb3ZlcnJpZGU7IC8vIGZyYW1lcyBhdmFpbGFibGUgdG8gcmVhZCBieSBzZXJ2ZXIuCiAKICAgICAvLyBDdXJyZW50bHkgQXVkaW9GbGluZ2VyIHdpbGwgY2FsbCBmcmFtZXNSZWFkeSgpIGZvciBhIGZhc3QgdHJhY2sgZnJvbSB0d28gdGhyZWFkczoKICAgICAvLyBGYXN0TWl4ZXIgdGhyZWFkLCBhbmQgbm9ybWFsIG1peGVyIHRocmVhZC4gIFRoaXMgaXMgZGFuZ2Vyb3VzLCBhcyB0aGUgcHJveHkgaXMgaW50ZW5kZWQKQEAgLTY5Myw2ICs2OTksOCBAQAogICAgICAgICByZXR1cm4gbUNibGstPnUubVN0cmVhbWluZy5tUmVhcjsgLy8gRm9yIGNvbXBsZXRlbmVzcyBvbmx5OyBtUmVhciB3cml0dGVuIGJ5IHNlcnZlci4KICAgICB9CiAKKyAgICBzaXplX3QgZnJhbWVzUmVhZHlTYWZlKCkgY29uc3Qgb3ZlcnJpZGU7IC8vIGZyYW1lcyBhdmFpbGFibGUgdG8gcmVhZCBieSBjbGllbnQuCisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BdWRpb1JlY29yZFNlcnZlclByb3h5KCkgeyB9CiB9OwpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5oCmluZGV4IDVmZDhlYjIuLmMzNTdjYWEgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuaAorKysgYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmgKQEAgLTQwLDYgKzQwLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFJlY29nbml0aW9uKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKIAogfTsKIApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5oIGIvaW5jbHVkZS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5oCmluZGV4IGFlMGNiMDEuLjFmYWViMGYgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuaAorKysgYi9pbmNsdWRlL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgKQEAgLTMzLDEyICszMywxNCBAQAogCiAgICAgREVDTEFSRV9NRVRBX0lOVEVSRkFDRShTb3VuZFRyaWdnZXJId1NlcnZpY2UpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RNb2R1bGVzKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykgPSAwOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhdHRhY2goY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyPiYgbW9kdWxlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhdHRhY2goY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVNvdW5kVHJpZ2dlcj4mIG1vZHVsZSkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYXB0dXJlU3RhdGUoYm9vbCBhY3RpdmUpID0gMDsKIH07CmRpZmYgLS1naXQgYS9pbmNsdWRlL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuaCBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oCmluZGV4IDdhMjllMzEuLmNjYzYxZGMgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oCisrKyBiL2luY2x1ZGUvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oCkBAIC0zNiwxMCArMzYsMTIgQEAKIAogICAgIHZpcnR1YWwgflNvdW5kVHJpZ2dlcigpOwogCi0gICAgc3RhdGljICBzdGF0dXNfdCBsaXN0TW9kdWxlcyhzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKKyAgICBzdGF0aWMgIHN0YXR1c190IGxpc3RNb2R1bGVzKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcyk7Ci0gICAgc3RhdGljICBzcDxTb3VuZFRyaWdnZXI+IGF0dGFjaChjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VuZFRyaWdnZXJDYWxsYmFjaz4mIGNhbGxiYWNrKTsKKyAgICBzdGF0aWMgIHNwPFNvdW5kVHJpZ2dlcj4gYXR0YWNoKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U291bmRUcmlnZ2VyQ2FsbGJhY2s+JiBjYWxsYmFjayk7CiAKICAgICBzdGF0aWMgIHN0YXR1c190IHNldENhcHR1cmVTdGF0ZShib29sIGFjdGl2ZSk7CiAKQEAgLTUyLDYgKzU0LDcgQEAKIAogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhcnRSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUsIGNvbnN0IHNwPElNZW1vcnk+JiBkYXRhTWVtb3J5KTsKICAgICAgICAgICAgIHN0YXR1c190IHN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgICAgICAgc3RhdHVzX3QgZ2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpOwogCiAgICAgICAgICAgICAvLyBCcFNvdW5kVHJpZ2dlckNsaWVudAogICAgICAgICAgICAgdmlydHVhbCB2b2lkIG9uUmVjb2duaXRpb25FdmVudChjb25zdCBzcDxJTWVtb3J5PiYgZXZlbnRNZW1vcnkpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvT1dORVJTIGIvbWVkaWEvT1dORVJTCmluZGV4IDFmNjg3YTIuLjFhZmMyNTMgMTAwNjQ0Ci0tLSBhL21lZGlhL09XTkVSUworKysgYi9tZWRpYS9PV05FUlMKQEAgLTEsOSArMSwxMiBAQAorYW5kcmV3bGV3aXNAZ29vZ2xlLmNvbQogY2h6QGdvb2dsZS5jb20KIGR3a2FuZ0Bnb29nbGUuY29tCiBlbGF1cmVudEBnb29nbGUuY29tCiBlc3NpY2tAZ29vZ2xlLmNvbQorZ2thc3RlbkBnb29nbGUuY29tCiBoa3VhbmdAZ29vZ2xlLmNvbQogaHVuZ2FAZ29vZ2xlLmNvbQoramlhYmluQGdvb2dsZS5jb20KIGptdHJpdmlAZ29vZ2xlLmNvbQoga3JvY2FyZEBnb29nbGUuY29tCiBsYWpvc0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvQW5kcm9pZC5tawppbmRleCA3YjYwZmYyLi5lMzM4MDRkIDEwMDY0NAotLS0gYS9tZWRpYS9hdWRpb3NlcnZlci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2F1ZGlvc2VydmVyL0FuZHJvaWQubWsKQEAgLTksMTYgKzksMTkgQEAKIAlsaWJhYXVkaW9zZXJ2aWNlIFwKIAlsaWJhdWRpb2ZsaW5nZXIgXAogCWxpYmF1ZGlvcG9saWN5c2VydmljZSBcCisJbGliYXVkaW9wcm9jZXNzaW5nIFwKIAlsaWJiaW5kZXIgXAogCWxpYmN1dGlscyBcCiAJbGlibG9nIFwKLQlsaWJoaWRsdHJhbnNwb3J0IFwKLQlsaWJod2JpbmRlciBcCisJbGliaGlkbGJhc2UgXAogCWxpYm1lZGlhIFwKIAlsaWJtZWRpYWxvZ3NlcnZpY2UgXAorCWxpYm1lZGlhdXRpbHMgXAogCWxpYm5iYWlvIFwKKwlsaWJuYmxvZyBcCiAJbGlic291bmR0cmlnZ2Vyc2VydmljZSBcCi0JbGlidXRpbHMKKwlsaWJ1dGlscyBcCisJbGlidmlicmF0b3IKIAogIyBUT0RPIG9ib2VzZXJ2aWNlIGlzIHRoZSBvbGQgZm9sZGVyIG5hbWUgZm9yIGFhdWRpb3NlcnZpY2UuIEl0IHdpbGwgYmUgY2hhbmdlZC4KIExPQ0FMX0NfSU5DTFVERVMgOj0gXApAQCAtMzUsMjggKzM4LDggQEAKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMgXAogCWZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nIFwKIAlmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhIFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKIAlleHRlcm5hbC9zb25pYyBcCiAKLSMgSWYgQVVESU9TRVJWRVJfTVVMVElMSUIgaW4gZGV2aWNlLm1rIGlzIG5vbi1lbXB0eSB0aGVuIGl0IGlzIHVzZWQgdG8gY29udHJvbAotIyB0aGUgTE9DQUxfTVVMVElMSUIgZm9yIGFsbCBhdWRpb3NlcnZlciBleGNsdXNpdmUgbGlicmFyaWVzLgotIyBUaGlzIGlzIHJlbGV2YW50IGZvciA2NCBiaXQgYXJjaGl0ZWN0dXJlcyB3aGVyZSBlaXRoZXIgb3IgYm90aAotIyAzMiBhbmQgNjQgYml0IGxpYnJhcmllcyBtYXkgYmUgYnVpbHQuCi0jCi0jIEFVRElPU0VSVkVSX01VTFRJTElCIG1heSBiZSBzZXQgYXMgZm9sbG93czoKLSMgICAzMiAgICAgIHRvIGJ1aWxkIDMyIGJpdCBhdWRpb3NlcnZlciBsaWJyYXJpZXMgYW5kIDMyIGJpdCBhdWRpb3NlcnZlci4KLSMgICA2NCAgICAgIHRvIGJ1aWxkIDY0IGJpdCBhdWRpb3NlcnZlciBsaWJyYXJpZXMgYW5kIDY0IGJpdCBhdWRpb3NlcnZlci4KLSMgICBib3RoICAgIHRvIGJ1aWxkIGJvdGggMzIgYml0IGFuZCA2NCBiaXQgbGlicmFyaWVzLAotIyAgICAgICAgICAgYW5kIHVzZSBwcmltYXJ5IHRhcmdldCBhcmNoaXRlY3R1cmUgKDMyIG9yIDY0KSBmb3IgYXVkaW9zZXJ2ZXIuCi0jICAgZmlyc3QgICB0byBidWlsZCBsaWJyYXJpZXMgYW5kIGF1ZGlvc2VydmVyIGZvciB0aGUgcHJpbWFyeSB0YXJnZXQgYXJjaGl0ZWN0dXJlIG9ubHkuCi0jICAgPGVtcHR5PiB0byBidWlsZCBib3RoIDMyIGFuZCA2NCBiaXQgbGlicmFyaWVzIGFuZCAzMiBiaXQgYXVkaW9zZXJ2ZXIuCi0KLWlmZXEgKCQoc3RyaXAgJChBVURJT1NFUlZFUl9NVUxUSUxJQikpLCkKLUxPQ0FMX01VTFRJTElCIDo9IDMyCi1lbHNlCi1MT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotZW5kaWYKLQogTE9DQUxfTU9EVUxFIDo9IGF1ZGlvc2VydmVyCiAKIExPQ0FMX0lOSVRfUkMgOj0gYXVkaW9zZXJ2ZXIucmMKZGlmZiAtLWdpdCBhL21lZGlhL2F1ZGlvc2VydmVyL2F1ZGlvc2VydmVyLnJjIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMKaW5kZXggZDI4ZjdhNi4uNTQ4NDYxMyAxMDA2NDQKLS0tIGEvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMKKysrIGIvbWVkaWEvYXVkaW9zZXJ2ZXIvYXVkaW9zZXJ2ZXIucmMKQEAgLTYsMTIgKzYsMTYgQEAKICAgICBjYXBhYmlsaXRpZXMgQkxPQ0tfU1VTUEVORAogICAgIGlvcHJpbyBydCA0CiAgICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcyAvZGV2L3N0dW5lL2ZvcmVncm91bmQvdGFza3MKKyAgICBvbnJlc3RhcnQgcmVzdGFydCB2ZW5kb3IuYXVkaW8taGFsCisgICAgb25yZXN0YXJ0IHJlc3RhcnQgdmVuZG9yLmF1ZGlvLWhhbC00LTAtbXNkCisgICAgIyBLZWVwIHRoZSBvcmlnaW5hbCBzZXJ2aWNlIG5hbWVzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5CiAgICAgb25yZXN0YXJ0IHJlc3RhcnQgdmVuZG9yLmF1ZGlvLWhhbC0yLTAKLSAgICAjIEtlZXAgdGhlIG9yaWdpbmFsIHNlcnZpY2UgbmFtZSBmb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aGVuIHVwZ3JhZGluZwotICAgICMgTy1NUjEgZGV2aWNlcyB3aXRoIGZyYW1ld29yay1vbmx5LgogICAgIG9ucmVzdGFydCByZXN0YXJ0IGF1ZGlvLWhhbC0yLTAKIAogb24gcHJvcGVydHk6dnRzLm5hdGl2ZV9zZXJ2ZXIub249MQogICAgIHN0b3AgYXVkaW9zZXJ2ZXIKIG9uIHByb3BlcnR5OnZ0cy5uYXRpdmVfc2VydmVyLm9uPTAKICAgICBzdGFydCBhdWRpb3NlcnZlcgorCitvbiBpbml0CisgICAgbWtkaXIgL2Rldi9zb2NrZXQvYXVkaW9zZXJ2ZXIgMDc3NSBhdWRpb3NlcnZlciBhdWRpb3NlcnZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3IuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZGZjMDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5jcHAKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQ29ubmVjdGlvbiIKKworI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisjaW5jbHVkZSAiQWNjZXNzb3JJbXBsLmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjphZGQoCisgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkLAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoY29ubmVjdGlvbklkKSA9PSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgIG1BY2Nlc3NvcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbm5lY3Rpb25JZCwgYWNjZXNzb3IpKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjpyZW1vdmUoaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgbUFjY2Vzc29ycy5lcmFzZShjb25uZWN0aW9uSWQpOworICAgIGF1dG8gaXQgPSBtQ29ubmVjdGlvblRvQ29va2llLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoaXQgIT0gbUNvbm5lY3Rpb25Ub0Nvb2tpZS5lbmQoKSkgeworICAgICAgICB1aW50NjRfdCBjb29raWUgPSBpdC0+c2Vjb25kOworICAgICAgICBtQ29ubmVjdGlvblRvQ29va2llLmVyYXNlKGl0KTsKKyAgICAgICAgYXV0byBjaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgICAgIGlmIChjaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNpdC0+c2Vjb25kLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoY2l0LT5zZWNvbmQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5lcmFzZShjaXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6YWRkQ29va2llVG9Db25uZWN0aW9uKAorICAgICAgICB1aW50NjRfdCBjb29raWUsCisgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoY29ubmVjdGlvbklkKSA9PSBtQWNjZXNzb3JzLmVuZCgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUNvbm5lY3Rpb25Ub0Nvb2tpZS5pbnNlcnQoc3RkOjptYWtlX3BhaXIoY29ubmVjdGlvbklkLCBjb29raWUpKTsKKyAgICBhdXRvIGl0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgIGlmIChpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICBpdC0+c2Vjb25kLmluc2VydChjb25uZWN0aW9uSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBjb29raWUsIHN0ZDo6c2V0PGludDY0X3Q+e2Nvbm5lY3Rpb25JZH0pKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OjpzZXJ2aWNlRGllZCgKKyAgICAgICAgdWludDY0X3QgY29va2llLAorICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICkgeworICAgIHN0ZDo6bWFwPGludDY0X3QsIGNvbnN0IHdwPEFjY2Vzc29yPj4gY29ubmVjdGlvbnNUb0Nsb3NlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworCisgICAgICAgIGF1dG8gaXQgPSBtQ29va2llVG9Db25uZWN0aW9ucy5maW5kKGNvb2tpZSk7CisgICAgICAgIGlmIChpdCAhPSBtQ29va2llVG9Db25uZWN0aW9ucy5lbmQoKSkgeworICAgICAgICAgICAgZm9yIChhdXRvIGNvbkl0ID0gaXQtPnNlY29uZC5iZWdpbigpOyBjb25JdCAhPSBpdC0+c2Vjb25kLmVuZCgpOyArK2Nvbkl0KSB7CisgICAgICAgICAgICAgICAgYXV0byBhY2Nlc3Nvckl0ID0gbUFjY2Vzc29ycy5maW5kKCpjb25JdCk7CisgICAgICAgICAgICAgICAgaWYgKGFjY2Vzc29ySXQgIT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uc1RvQ2xvc2UuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKCpjb25JdCwgYWNjZXNzb3JJdC0+c2Vjb25kKSk7CisgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NvcnMuZXJhc2UoYWNjZXNzb3JJdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uVG9Db29raWUuZXJhc2UoKmNvbkl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db29raWVUb0Nvbm5lY3Rpb25zLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChjb25uZWN0aW9uc1RvQ2xvc2Uuc2l6ZSgpID4gMCkgeworICAgICAgICBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgIGZvciAoYXV0byBpdCA9IGNvbm5lY3Rpb25zVG9DbG9zZS5iZWdpbigpOyBpdCAhPSBjb25uZWN0aW9uc1RvQ2xvc2UuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGFjY2Vzc29yID0gaXQtPnNlY29uZC5wcm9tb3RlKCk7CisKKyAgICAgICAgICAgIGlmIChhY2Nlc3NvcikgeworICAgICAgICAgICAgICAgIGFjY2Vzc29yLT5jbG9zZShpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgIEFMT0dEKCJjb25uZWN0aW9uICVsbGQgY2xvc2VkIG9uIGRlYXRoIiwgKGxvbmcgbG9uZylpdC0+Zmlyc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCituYW1lc3BhY2Ugeworc3RhdGljIHNwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCA9CisgICAgICAgIG5ldyBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKTsKK30KKworc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiBBY2Nlc3Nvcjo6Z2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCkgeworICAgIHJldHVybiBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50OworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklBY2Nlc3NvciBmb2xsb3cuCitSZXR1cm48dm9pZD4gQWNjZXNzb3I6OmNvbm5lY3QoY29ubmVjdF9jYiBfaGlkbF9jYikgeworICAgIHNwPENvbm5lY3Rpb24+IGNvbm5lY3Rpb247CisgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZDsKKyAgICBjb25zdCBRdWV1ZURlc2NyaXB0b3IqIGZtcURlc2M7CisKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gY29ubmVjdCgmY29ubmVjdGlvbiwgJmNvbm5lY3Rpb25JZCwgJmZtcURlc2MsIGZhbHNlKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb25uZWN0aW9uLCBjb25uZWN0aW9uSWQsICpmbXFEZXNjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIG51bGxwdHIsIC0xTEwsCisgICAgICAgICAgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jPEJ1ZmZlclN0YXR1c01lc3NhZ2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmhhcmR3YXJlOjpHcmFudG9yRGVzY3JpcHRvcj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIG5oYW5kbGUgKi8sIDAgLyogc2l6ZSAqLykpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitBY2Nlc3Nvcjo6QWNjZXNzb3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgOiBtSW1wbChuZXcgSW1wbChhbGxvY2F0b3IpKSB7fQorCitBY2Nlc3Nvcjo6fkFjY2Vzc29yKCkgeworfQorCitib29sIEFjY2Vzc29yOjppc1ZhbGlkKCkgeworICAgIHJldHVybiAoYm9vbCltSW1wbDsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShjb25uZWN0aW9uSWQsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmZldGNoKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mZXRjaChjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpjb25uZWN0KAorICAgICAgICBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLAorICAgICAgICBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyLCBib29sIGxvY2FsKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtSW1wbC0+Y29ubmVjdCh0aGlzLCBjb25uZWN0aW9uLCBwQ29ubmVjdGlvbklkLCBmbXFEZXNjUHRyKTsKKyAgICAgICAgaWYgKCFsb2NhbCAmJiBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3A8QWNjZXNzb3I+IGFjY2Vzc29yKHRoaXMpOworICAgICAgICAgICAgc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudC0+YWRkKCpwQ29ubmVjdGlvbklkLCBhY2Nlc3Nvcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPmNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQtPnJlbW92ZShjb25uZWN0aW9uSWQpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBBY2Nlc3Nvcjo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgbUltcGwtPmNsZWFuVXAoY2xlYXJDYWNoZSk7CisgICAgfQorfQorCisvL0lBY2Nlc3NvciogSElETF9GRVRDSF9JQWNjZXNzb3IoY29uc3QgY2hhciogLyogbmFtZSAqLykgeworLy8gICAgcmV0dXJuIG5ldyBBY2Nlc3NvcigpOworLy99CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29yLmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmODZmN2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3Nvci5oCkBAIC0wLDAgKzEsMTg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0FDQ0VTU09SX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUFjY2Vzc29yLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSAiQnVmZmVyU3RhdHVzLmgiCisKKyNpbmNsdWRlIDxzZXQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQWNjZXNzb3I7CitzdHJ1Y3QgQ29ubmVjdGlvbjsKKworLyoqCisgKiBSZWNlaXZlcyBkZWF0aCBub3RpZmljYXRpb25zIGZyb20gcmVtb3RlIGNvbm5lY3Rpb25zLgorICogT24gZGVhdGggbm90aWZpY2F0aW9ucywgdGhlIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWQgYW5kIHVzZWQgcmVzb3VyY2VzCisgKiBhcmUgcmVsZWFzZWQuCisgKi8KK3N0cnVjdCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQgOiBwdWJsaWMgaGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50IHsKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBuZXdseSBjb25uZWN0ZWQgY29ubmVjdGlvbiBmcm9tIHJlbW90ZSBwcm9jZXNzZXMuCisgICAgICovCisgICAgdm9pZCBhZGQoaW50NjRfdCBjb25uZWN0aW9uSWQsIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgdm9pZCByZW1vdmUoaW50NjRfdCBjb25uZWN0aW9uSWQpOworCisgICAgdm9pZCBhZGRDb29raWVUb0Nvbm5lY3Rpb24odWludDY0X3QgY29va2llLCBpbnQ2NF90IGNvbm5lY3Rpb25JZCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQoCisgICAgICAgICAgICB1aW50NjRfdCAvKiBjb29raWUgKi8sCisgICAgICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICAgICApIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PGludDY0X3Q+PiAgbUNvb2tpZVRvQ29ubmVjdGlvbnM7CisgICAgc3RkOjptYXA8aW50NjRfdCwgdWludDY0X3Q+IG1Db25uZWN0aW9uVG9Db29raWU7CisgICAgc3RkOjptYXA8aW50NjRfdCwgY29uc3Qgd3A8QWNjZXNzb3I+PiBtQWNjZXNzb3JzOworfTsKKworLyoqCisgKiBBIGJ1ZmZlciBwb29sIGFjY2Vzc29yIHdoaWNoIGVuYWJsZXMgYSBidWZmZXIgcG9vbCB0byBjb21tdW5pY2F0ZSB3aXRoIGJ1ZmZlcgorICogcG9vbCBjbGllbnRzLiAxOjEgY29ycmVzcG9uZGVuc2UgaG9sZHMgYmV0d2VlbiBhIGJ1ZmZlciBwb29sIGFuZCBhbiBhY2Nlc3Nvci4KKyAqLworc3RydWN0IEFjY2Vzc29yIDogcHVibGljIElBY2Nlc3NvciB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3IgZm9sbG93LgorICAgIFJldHVybjx2b2lkPiBjb25uZWN0KGNvbm5lY3RfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yIHdoaWNoIHVzZXMgdGhlIHNwZWNpZmllZCBhbGxvY2F0b3IuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxsb2NhdG9yIGJ1ZmZlciBhbGxvY2F0b3IuCisgICAgICovCisgICAgZXhwbGljaXQgQWNjZXNzb3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgLyoqIERlc3RydWN0cyBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yLiAqLworICAgIH5BY2Nlc3NvcigpOworCisgICAgLyoqIFJldHVybnMgd2hldGhlciB0aGUgYWNjZXNzb3IgaXMgdmFsaWQuICovCisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICAvKiogQWxsb2NhdGVzIGEgYnVmZmVyIGZyb20gYSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBjb25uZWN0aW9uIGlkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHBhcmFtcyAgICAgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGFsbG9jYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywKKyAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBGZXRjaGVzIGEgYnVmZmVyIGZvciB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgdGhlIGlkIG9mIHJlY2VpdmluZyBjb25uZWN0aW9uKGNsaWVudCkuCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgdGhlIGlkIG9mIHRoZSB0cmFuc2ZlciB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciB0byBiZSBmZXRjaGVkLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSBmZXRjaGVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgZmV0Y2hlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgZmV0Y2goCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgLyoqCisgICAgICogTWFrZXMgYSBjb25uZWN0aW9uIHRvIHRoZSBidWZmZXIgcG9vbC4gVGhlIGJ1ZmZlciBwb29sIGNsaWVudCB1c2VzIHRoZQorICAgICAqIGNyZWF0ZWQgY29ubmVjdGlvbiBpbiBvcmRlciB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBidWZmZXIgcG9vbC4gQW4KKyAgICAgKiBGTVEgZm9yIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBpcyBhbHNvIGNyZWF0ZWQgZm9yIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbiAgICBjcmVhdGVkIGNvbm5lY3Rpb24KKyAgICAgKiBAcGFyYW0gcENvbm5lY3Rpb25JZCB0aGUgaWQgb2YgdGhlIGNyZWF0ZWQgY29ubmVjdGlvbgorICAgICAqIEBwYXJhbSBmbXFEZXNjUHRyICAgIEZNUSBkZXNjcmlwdG9yIGZvciBzaGFyZWQgYnVmZmVyIHN0YXR1cyBtZXNzYWdlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcXVldWUgYmV0d2VlbiBhIGJ1ZmZlciBwb29sIGFuZCB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBsb2NhbCAgICAgICAgIHRydWUgd2hlbiBhIGNvbm5lY3Rpb24gcmVxdWVzdCBjb21lcyBmcm9tIGxvY2FsIHByb2Nlc3MsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkgbWFkZS4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY29ubmVjdCgKKyAgICAgICAgICAgIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLCBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsCisgICAgICAgICAgICBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyLCBib29sIGxvY2FsKTsKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gdG8gdGhlIGNsaWVudC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgY29ubmVjdGlvbiBpcyBjbG9zZWQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9tcyBwZXJpb2RpYyBjYWNoZQorICAgICAqIGNsZWFuaW5nLgorICAgICAqCisgICAgICogQHBhcmFtIGNsZWFyQ2FjaGUgICAgaWYgY2xlYXJDYWNoZSBpcyB0cnVlLCBpdCBmcmVlcyBhbGwgYnVmZmVycyB3YWl0aW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdG8gYmUgcmVjeWNsZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgaGlkbF9kZWF0aF9yZWNpcGllbnQgZm9yIHJlbW90ZSBjb25uZWN0aW9uIGRlYXRoLgorICAgICAqLworICAgIHN0YXRpYyBzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IGdldENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpOworCitwcml2YXRlOgorICAgIGNsYXNzIEltcGw7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltcGw+IG1JbXBsOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0FDQ0VTU09SX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3NvckltcGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MzY2ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9BY2Nlc3NvckltcGwuY3BwCkBAIC0wLDAgKzEsNTUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQWNjZXNzb3IiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQWNjZXNzb3JJbXBsLmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK25hbWVzcGFjZSB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtDbGVhblVwRHVyYXRpb25VcyA9IDUwMDAwMDsgLy8gVE9ETyB0dW5lIDAuNSBzZWMKKyAgICBzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0xvZ0R1cmF0aW9uVXMgPSA1MDAwMDAwOyAvLyA1IHNlY3MKKworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNaW5BbGxvY0J5dGVzRm9yRXZpY3Rpb24gPSAxMDI0KjEwMjQqMTU7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pbkJ1ZmZlckNvdW50Rm9yRXZpY3Rpb24gPSA0MDsKK30KKworLy8gQnVmZmVyIHN0cnVjdHVyZSBpbiBidWZmZXJwb29sIHByb2Nlc3MKK3N0cnVjdCBJbnRlcm5hbEJ1ZmZlciB7CisgICAgQnVmZmVySWQgbUlkOworICAgIHNpemVfdCBtT3duZXJDb3VudDsKKyAgICBzaXplX3QgbVRyYW5zYWN0aW9uQ291bnQ7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKKyAgICBjb25zdCBzaXplX3QgbUFsbG9jU2l6ZTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtQ29uZmlnOworCisgICAgSW50ZXJuYWxCdWZmZXIoCisgICAgICAgICAgICBCdWZmZXJJZCBpZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZhbGxvY0NvbmZpZykKKyAgICAgICAgICAgIDogbUlkKGlkKSwgbU93bmVyQ291bnQoMCksIG1UcmFuc2FjdGlvbkNvdW50KDApLAorICAgICAgICAgICAgbUFsbG9jYXRpb24oYWxsb2MpLCBtQWxsb2NTaXplKGFsbG9jU2l6ZSksIG1Db25maWcoYWxsb2NDb25maWcpIHt9CisKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uLT5oYW5kbGUoKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgVHJhbnNhY3Rpb25TdGF0dXMgeworICAgIFRyYW5zYWN0aW9uSWQgbUlkOworICAgIEJ1ZmZlcklkIG1CdWZmZXJJZDsKKyAgICBDb25uZWN0aW9uSWQgbVNlbmRlcjsKKyAgICBDb25uZWN0aW9uSWQgbVJlY2VpdmVyOworICAgIEJ1ZmZlclN0YXR1cyBtU3RhdHVzOworICAgIGludDY0X3QgbVRpbWVzdGFtcFVzOworICAgIGJvb2wgbVNlbmRlclZhbGlkYXRlZDsKKworICAgIFRyYW5zYWN0aW9uU3RhdHVzKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UsIGludDY0X3QgdGltZXN0YW1wVXMpIHsKKyAgICAgICAgbUlkID0gbWVzc2FnZS50cmFuc2FjdGlvbklkOworICAgICAgICBtQnVmZmVySWQgPSBtZXNzYWdlLmJ1ZmZlcklkOworICAgICAgICBtU3RhdHVzID0gbWVzc2FnZS5uZXdTdGF0dXM7CisgICAgICAgIG1UaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgICAgICBpZiAobVN0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RPKSB7CisgICAgICAgICAgICBtU2VuZGVyID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtUmVjZWl2ZXIgPSBtZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1TZW5kZXJWYWxpZGF0ZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNlbmRlciA9IC0xTEw7CisgICAgICAgICAgICBtUmVjZWl2ZXIgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1TZW5kZXJWYWxpZGF0ZWQgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KK307CisKKy8vIEhlbHBlciB0ZW1wbGF0ZSBtZXRob2RzIGZvciBoYW5kbGluZyBtYXAgb2Ygc2V0LgordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgaW5zZXJ0KHN0ZDo6bWFwPFQsIHN0ZDo6c2V0PFU+PiAqbWFwT2ZTZXQsIFQga2V5LCBVIHZhbHVlKSB7CisgICAgYXV0byBpdGVyID0gbWFwT2ZTZXQtPmZpbmQoa2V5KTsKKyAgICBpZiAoaXRlciA9PSBtYXBPZlNldC0+ZW5kKCkpIHsKKyAgICAgICAgc3RkOjpzZXQ8VT4gdmFsdWVTZXR7dmFsdWV9OworICAgICAgICBtYXBPZlNldC0+aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGtleSwgdmFsdWVTZXQpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChpdGVyLT5zZWNvbmQuZmluZCh2YWx1ZSkgID09IGl0ZXItPnNlY29uZC5lbmQoKSkgeworICAgICAgICBpdGVyLT5zZWNvbmQuaW5zZXJ0KHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgZXJhc2Uoc3RkOjptYXA8VCwgc3RkOjpzZXQ8VT4+ICptYXBPZlNldCwgVCBrZXksIFUgdmFsdWUpIHsKKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIGF1dG8gaXRlciA9IG1hcE9mU2V0LT5maW5kKGtleSk7CisgICAgaWYgKGl0ZXIgIT0gbWFwT2ZTZXQtPmVuZCgpKSB7CisgICAgICAgIGlmIChpdGVyLT5zZWNvbmQuZXJhc2UodmFsdWUpID4gMCkgeworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXRlci0+c2Vjb25kLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBtYXBPZlNldC0+ZXJhc2UoaXRlcik7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KK2Jvb2wgY29udGFpbnMoc3RkOjptYXA8VCwgc3RkOjpzZXQ8VT4+ICptYXBPZlNldCwgVCBrZXksIFUgdmFsdWUpIHsKKyAgICBhdXRvIGl0ZXIgPSBtYXBPZlNldC0+ZmluZChrZXkpOworICAgIGlmIChpdGVyICE9IG1hcE9mU2V0LT5lbmQoKSkgeworICAgICAgICBhdXRvIHNldEl0ZXIgPSBpdGVyLT5zZWNvbmQuZmluZCh2YWx1ZSk7CisgICAgICAgIHJldHVybiBzZXRJdGVyICE9IGl0ZXItPnNlY29uZC5lbmQoKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitpbnQzMl90IEFjY2Vzc29yOjpJbXBsOjpzUGlkID0gZ2V0cGlkKCk7Cit1aW50MzJfdCBBY2Nlc3Nvcjo6SW1wbDo6c1NlcUlkID0gdGltZShudWxscHRyKTsKKworQWNjZXNzb3I6OkltcGw6OkltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgICAgICA6IG1BbGxvY2F0b3IoYWxsb2NhdG9yKSB7fQorCitBY2Nlc3Nvcjo6SW1wbDo6fkltcGwoKSB7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6Y29ubmVjdCgKKyAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3Nvciwgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sCisgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwgY29uc3QgUXVldWVEZXNjcmlwdG9yKiogZm1xRGVzY1B0cikgeworICAgIHNwPENvbm5lY3Rpb24+IG5ld0Nvbm5lY3Rpb24gPSBuZXcgQ29ubmVjdGlvbigpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICAgICAgaWYgKG5ld0Nvbm5lY3Rpb24pIHsKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBpZCA9IChpbnQ2NF90KXNQaWQgPDwgMzIgfCBzU2VxSWQ7CisgICAgICAgICAgICBzdGF0dXMgPSBtQnVmZmVyUG9vbC5tT2JzZXJ2ZXIub3BlbihpZCwgZm1xRGVzY1B0cik7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBuZXdDb25uZWN0aW9uLT5pbml0aWFsaXplKGFjY2Vzc29yLCBpZCk7CisgICAgICAgICAgICAgICAgKmNvbm5lY3Rpb24gPSBuZXdDb25uZWN0aW9uOworICAgICAgICAgICAgICAgICpwQ29ubmVjdGlvbklkID0gaWQ7CisgICAgICAgICAgICAgICAgbUJ1ZmZlclBvb2wubUNvbm5lY3Rpb25JZHMuaW5zZXJ0KGlkKTsKKyAgICAgICAgICAgICAgICArK3NTZXFJZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICAgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIG1CdWZmZXJQb29sLmhhbmRsZUNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgbUJ1ZmZlclBvb2wubU9ic2VydmVyLmNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgLy8gU2luY2UgY2xvc2UjIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGFsbCB3b3JrcyBhcmUgZmluaXNoZWQsIGl0IGlzIE9LIHRvCisgICAgLy8gZXZpY3QgdW51c2VkIGJ1ZmZlcnMuCisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCh0cnVlKTsKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywKKyAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICBpZiAoIW1CdWZmZXJQb29sLmdldEZyZWVCdWZmZXIobUFsbG9jYXRvciwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKSkgeworICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+IGFsbG9jOworICAgICAgICBzaXplX3QgYWxsb2NTaXplOworICAgICAgICBzdGF0dXMgPSBtQWxsb2NhdG9yLT5hbGxvY2F0ZShwYXJhbXMsICZhbGxvYywgJmFsbG9jU2l6ZSk7CisgICAgICAgIGxvY2subG9jaygpOworICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CdWZmZXJQb29sLmFkZE5ld0J1ZmZlcihhbGxvYywgYWxsb2NTaXplLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJjcmVhdGUgYSBidWZmZXIgJWQgOiAldSAlcCIsCisgICAgICAgICAgICAgIHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LLCAqYnVmZmVySWQsICpoYW5kbGUpOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgLy8gVE9ETzogaGFuZGxlIG93bkJ1ZmZlciBmYWlsdXJlCisgICAgICAgIG1CdWZmZXJQb29sLmhhbmRsZU93bkJ1ZmZlcihjb25uZWN0aW9uSWQsICpidWZmZXJJZCk7CisgICAgfQorICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmZldGNoKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIG1CdWZmZXJQb29sLnByb2Nlc3NTdGF0dXNNZXNzYWdlcygpOworICAgIGF1dG8gZm91bmQgPSBtQnVmZmVyUG9vbC5tVHJhbnNhY3Rpb25zLmZpbmQodHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kICE9IG1CdWZmZXJQb29sLm1UcmFuc2FjdGlvbnMuZW5kKCkgJiYKKyAgICAgICAgICAgIGNvbnRhaW5zKCZtQnVmZmVyUG9vbC5tUGVuZGluZ1RyYW5zYWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCkpIHsKKyAgICAgICAgaWYgKGZvdW5kLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQgJiYKKyAgICAgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU3RhdHVzID09IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTSAmJgorICAgICAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1CdWZmZXJJZCA9PSBidWZmZXJJZCkgeworICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bVN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRkVUQ0g7CisgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ID0gbUJ1ZmZlclBvb2wubUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgICAgICBpZiAoYnVmZmVySXQgIT0gbUJ1ZmZlclBvb2wubUJ1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyUG9vbC5tU3RhdHMub25CdWZmZXJGZXRjaGVkKCk7CisgICAgICAgICAgICAgICAgKmhhbmRsZSA9IGJ1ZmZlckl0LT5zZWNvbmQtPmhhbmRsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1CdWZmZXJQb29sLmNsZWFuVXAoKTsKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICAvLyB0cmFuc2FjdGlvbiB0aW1lb3V0LCBidWZmZXIgY2FjaGVpbmcgVFRMIGhhbmRsaW5nCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKGNsZWFyQ2FjaGUpOworfQorCitBY2Nlc3Nvcjo6SW1wbDo6SW1wbDo6QnVmZmVyUG9vbDo6QnVmZmVyUG9vbCgpCisgICAgOiBtVGltZXN0YW1wVXMoZ2V0VGltZXN0YW1wTm93KCkpLAorICAgICAgbUxhc3RDbGVhblVwVXMobVRpbWVzdGFtcFVzKSwKKyAgICAgIG1MYXN0TG9nVXMobVRpbWVzdGFtcFVzKSwKKyAgICAgIG1TZXEoMCkge30KKworCisvLyBTdGF0aXN0aWNzIGhlbHBlcgordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUz4KK2ludCBwZXJjZW50YWdlKFQgYmFzZSwgUyB0b3RhbCkgeworICAgIHJldHVybiBpbnQodG90YWwgPyAwLjUgKyAxMDAuICogc3RhdGljX2Nhc3Q8Uz4oYmFzZSkgLyB0b3RhbCA6IDApOworfQorCitBY2Nlc3Nvcjo6SW1wbDo6SW1wbDo6QnVmZmVyUG9vbDo6fkJ1ZmZlclBvb2woKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBBTE9HRCgiRGVzdHJ1Y3Rpb24gLSBidWZmZXJwb29sICVwICIKKyAgICAgICAgICAiY2FjaGVkOiAlenUvJXp1TSwgJXp1LyVkJSUgaW4gdXNlOyAiCisgICAgICAgICAgImFsbG9jczogJXp1LCAlZCUlIHJlY3ljbGVkOyAiCisgICAgICAgICAgInRyYW5zZmVyczogJXp1LCAlZCUlIHVuZmV0Y2VkIiwKKyAgICAgICAgICB0aGlzLCBtU3RhdHMubUJ1ZmZlcnNDYWNoZWQsIG1TdGF0cy5tU2l6ZUNhY2hlZCA+PiAyMCwKKyAgICAgICAgICBtU3RhdHMubUJ1ZmZlcnNJblVzZSwgcGVyY2VudGFnZShtU3RhdHMubUJ1ZmZlcnNJblVzZSwgbVN0YXRzLm1CdWZmZXJzQ2FjaGVkKSwKKyAgICAgICAgICBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMsIHBlcmNlbnRhZ2UobVN0YXRzLm1Ub3RhbFJlY3ljbGVzLCBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMpLAorICAgICAgICAgIG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMsCisgICAgICAgICAgcGVyY2VudGFnZShtU3RhdHMubVRvdGFsVHJhbnNmZXJzIC0gbVN0YXRzLm1Ub3RhbEZldGNoZXMsIG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMpKTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlT3duQnVmZmVyKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCkgeworCisgICAgYm9vbCBhZGRlZCA9IGluc2VydCgmbVVzaW5nQnVmZmVycywgY29ubmVjdGlvbklkLCBidWZmZXJJZCk7CisgICAgaWYgKGFkZGVkKSB7CisgICAgICAgIGF1dG8gaXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICBpdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50Kys7CisgICAgfQorICAgIGluc2VydCgmbVVzaW5nQ29ubmVjdGlvbnMsIGJ1ZmZlcklkLCBjb25uZWN0aW9uSWQpOworICAgIHJldHVybiBhZGRlZDsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlUmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQpIHsKKyAgICBib29sIGRlbGV0ZWQgPSBlcmFzZSgmbVVzaW5nQnVmZmVycywgY29ubmVjdGlvbklkLCBidWZmZXJJZCk7CisgICAgaWYgKGRlbGV0ZWQpIHsKKyAgICAgICAgYXV0byBpdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgIGl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQtLTsKKyAgICAgICAgaWYgKGl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgIGl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KGJ1ZmZlcklkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlcmFzZSgmbVVzaW5nQ29ubmVjdGlvbnMsIGJ1ZmZlcklkLCBjb25uZWN0aW9uSWQpOworICAgIEFMT0dWKCJyZWxlYXNlIGJ1ZmZlciAldSA6ICVkIiwgYnVmZmVySWQsIGRlbGV0ZWQpOworICAgIHJldHVybiBkZWxldGVkOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVUcmFuc2ZlclRvKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBhdXRvIGNvbXBsZXRlZCA9IG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuZmluZCgKKyAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGNvbXBsZXRlZCAhPSBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIC8vIGFscmVhZHkgY29tcGxldGVkCisgICAgICAgIG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuZXJhc2UoY29tcGxldGVkKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vIHRoZSBidWZmZXIgc2hvdWxkIGV4aXN0IGFuZCBiZSBvd25lZC4KKyAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKG1lc3NhZ2UuYnVmZmVySWQpOworICAgIGlmIChidWZmZXJJdGVyID09IG1CdWZmZXJzLmVuZCgpIHx8CisgICAgICAgICAgICAhY29udGFpbnMoJm1Vc2luZ0J1ZmZlcnMsIG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gZm91bmQgPSBtVHJhbnNhY3Rpb25zLmZpbmQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgIT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAvLyB0cmFuc2Zlcl9mcm9tIHdhcyByZWNlaXZlZCBlYXJsaWVyLgorICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU2VuZGVyID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKG1Db25uZWN0aW9uSWRzLmZpbmQobWVzc2FnZS50YXJnZXRDb25uZWN0aW9uSWQpID09IG1Db25uZWN0aW9uSWRzLmVuZCgpKSB7CisgICAgICAgIC8vIE4uQjogaXQgY291bGQgYmUgZmFrZSBvciByZWNlaXZlIGNvbm5lY3Rpb24gYWxyZWFkeSBjbG9zZWQuCisgICAgICAgIEFMT0dEKCJidWZmZXJwb29sICVwIHJlY2VpdmVyIGNvbm5lY3Rpb24gJWxsZCBpcyBubyBsb25nZXIgdmFsaWQiLAorICAgICAgICAgICAgICB0aGlzLCAobG9uZyBsb25nKW1lc3NhZ2UudGFyZ2V0Q29ubmVjdGlvbklkKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtU3RhdHMub25CdWZmZXJTZW50KCk7CisgICAgbVRyYW5zYWN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPFRyYW5zYWN0aW9uU3RhdHVzPihtZXNzYWdlLCBtVGltZXN0YW1wVXMpKSk7CisgICAgaW5zZXJ0KCZtUGVuZGluZ1RyYW5zYWN0aW9ucywgbWVzc2FnZS50YXJnZXRDb25uZWN0aW9uSWQsCisgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCsrOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVUcmFuc2ZlckZyb20oY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGF1dG8gZm91bmQgPSBtVHJhbnNhY3Rpb25zLmZpbmQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgPT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAvLyBUT0RPOiBpcyBpdCBmZWFzaWJsZSB0byBjaGVjayBvd25lcnNoaXAgaGVyZT8KKyAgICAgICAgbVN0YXRzLm9uQnVmZmVyU2VudCgpOworICAgICAgICBtVHJhbnNhY3Rpb25zLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2FjdGlvblN0YXR1cz4obWVzc2FnZSwgbVRpbWVzdGFtcFVzKSkpOworICAgICAgICBpbnNlcnQoJm1QZW5kaW5nVHJhbnNhY3Rpb25zLCBtZXNzYWdlLmNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQrKzsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobWVzc2FnZS5jb25uZWN0aW9uSWQgPT0gZm91bmQtPnNlY29uZC0+bVJlY2VpdmVyKSB7CisgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU3RhdHVzID0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVUcmFuc2ZlclJlc3VsdChjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgYXV0byBmb3VuZCA9IG1UcmFuc2FjdGlvbnMuZmluZChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtUGVuZGluZ1RyYW5zYWN0aW9ucywgbWVzc2FnZS5jb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgICAgIGlmIChkZWxldGVkKSB7CisgICAgICAgICAgICBpZiAoIWZvdW5kLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQpIHsKKyAgICAgICAgICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmluc2VydChtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXV0byBidWZmZXJJdGVyID0gbUJ1ZmZlcnMuZmluZChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgIGlmIChtZXNzYWdlLm5ld1N0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX09LKSB7CisgICAgICAgICAgICAgICAgaGFuZGxlT3duQnVmZmVyKG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQtLTsKKyAgICAgICAgICAgIGlmIChidWZmZXJJdGVyLT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAKKyAgICAgICAgICAgICAgICAmJiBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVRyYW5zYWN0aW9ucy5lcmFzZShmb3VuZCk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInRyYW5zZmVyIGZpbmlzaGVkICVsbHUgJXUgLSAlZCIsICh1bnNpZ25lZCBsb25nIGxvbmcpbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICBtZXNzYWdlLmJ1ZmZlcklkLCBkZWxldGVkKTsKKyAgICAgICAgcmV0dXJuIGRlbGV0ZWQ7CisgICAgfQorICAgIEFMT0dWKCJ0cmFuc2ZlciBub3QgZm91bmQgJWxsdSAldSIsICh1bnNpZ25lZCBsb25nIGxvbmcpbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQpOworICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6cHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCkgeworICAgIHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+IG1lc3NhZ2VzOworICAgIG1PYnNlcnZlci5nZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKG1lc3NhZ2VzKTsKKyAgICBtVGltZXN0YW1wVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBmb3IgKEJ1ZmZlclN0YXR1c01lc3NhZ2UmIG1lc3NhZ2U6IG1lc3NhZ2VzKSB7CisgICAgICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgICAgIHN3aXRjaCAobWVzc2FnZS5uZXdTdGF0dXMpIHsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpOT1RfVVNFRDoKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVSZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlVTRUQ6CisgICAgICAgICAgICAgICAgLy8gbm90IGhhcHBlbmluZworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RPOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyVG8obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTToKKyAgICAgICAgICAgICAgICByZXQgPSBoYW5kbGVUcmFuc2ZlckZyb20obWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVElNRU9VVDoKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfTE9TVDoKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRkVUQ0g6CisgICAgICAgICAgICAgICAgLy8gbm90IGhhcHBlbmluZworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX09LOgorICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0VSUk9SOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyUmVzdWx0KG1lc3NhZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIEFMT0dXKCJidWZmZXIgc3RhdHVzIG1lc3NhZ2UgcHJvY2Vzc2luZyBmYWlsdXJlIC0gbWVzc2FnZSA6ICVkIGNvbm5lY3Rpb24gOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzLCAobG9uZyBsb25nKW1lc3NhZ2UuY29ubmVjdGlvbklkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtZXNzYWdlcy5jbGVhcigpOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVDbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgLy8gQ2xlYW5pbmcgYnVmZmVycworICAgIGF1dG8gYnVmZmVycyA9IG1Vc2luZ0J1ZmZlcnMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChidWZmZXJzICE9IG1Vc2luZ0J1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBCdWZmZXJJZCYgYnVmZmVySWQgOiBidWZmZXJzLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtVXNpbmdDb25uZWN0aW9ucywgYnVmZmVySWQsIGNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQtLTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGZyZWVidWZmZXIgaW5zZXJ0IGZhaWwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtVXNpbmdCdWZmZXJzLmVyYXNlKGJ1ZmZlcnMpOworICAgIH0KKworICAgIC8vIENsZWFuaW5nIHRyYW5zYWN0aW9ucworICAgIGF1dG8gcGVuZGluZyA9IG1QZW5kaW5nVHJhbnNhY3Rpb25zLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAocGVuZGluZyAhPSBtUGVuZGluZ1RyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICBmb3IgKGNvbnN0IFRyYW5zYWN0aW9uSWQmIHRyYW5zYWN0aW9uSWQgOiBwZW5kaW5nLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIGF1dG8gaXRlciA9IG1UcmFuc2FjdGlvbnMuZmluZCh0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgIGlmIChpdGVyICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWl0ZXItPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmluc2VydCh0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQgPSBpdGVyLT5zZWNvbmQtPm1CdWZmZXJJZDsKKyAgICAgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50LS07CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGZyZWVidWZmZXIgaW5zZXJ0IGZhaWwKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIG1GcmVlQnVmZmVycy5pbnNlcnQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVHJhbnNhY3Rpb25zLmVyYXNlKGl0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1Db25uZWN0aW9uSWRzLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmdldEZyZWVCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLCBCdWZmZXJJZCAqcElkLAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBhdXRvIGJ1ZmZlckl0ID0gbUZyZWVCdWZmZXJzLmJlZ2luKCk7CisgICAgZm9yICg7YnVmZmVySXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOyArK2J1ZmZlckl0KSB7CisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gKmJ1ZmZlckl0OworICAgICAgICBpZiAoYWxsb2NhdG9yLT5jb21wYXRpYmxlKHBhcmFtcywgbUJ1ZmZlcnNbYnVmZmVySWRdLT5tQ29uZmlnKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJ1ZmZlckl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKSkgeworICAgICAgICBCdWZmZXJJZCBpZCA9ICpidWZmZXJJdDsKKyAgICAgICAgbUZyZWVCdWZmZXJzLmVyYXNlKGJ1ZmZlckl0KTsKKyAgICAgICAgbVN0YXRzLm9uQnVmZmVyUmVjeWNsZWQobUJ1ZmZlcnNbaWRdLT5tQWxsb2NTaXplKTsKKyAgICAgICAgKmhhbmRsZSA9IG1CdWZmZXJzW2lkXS0+aGFuZGxlKCk7CisgICAgICAgICpwSWQgPSBpZDsKKyAgICAgICAgQUxPR1YoInJlY3ljbGUgYSBidWZmZXIgJXUgJXAiLCBpZCwgKmhhbmRsZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6YWRkTmV3QnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgQnVmZmVySWQgKnBJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisKKyAgICBCdWZmZXJJZCBidWZmZXJJZCA9IG1TZXErKzsKKyAgICBpZiAobVNlcSA9PSBDb25uZWN0aW9uOjpTWU5DX0JVRkZFUklEKSB7CisgICAgICAgIG1TZXEgPSAwOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW50ZXJuYWxCdWZmZXI+IGJ1ZmZlciA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEludGVybmFsQnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVySWQsIGFsbG9jLCBhbGxvY1NpemUsIHBhcmFtcyk7CisgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICBhdXRvIHJlcyA9IG1CdWZmZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBidWZmZXJJZCwgc3RkOjptb3ZlKGJ1ZmZlcikpKTsKKyAgICAgICAgaWYgKHJlcy5zZWNvbmQpIHsKKyAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckFsbG9jYXRlZChhbGxvY1NpemUpOworICAgICAgICAgICAgKmhhbmRsZSA9IGFsbG9jLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICpwSWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAoY2xlYXJDYWNoZSB8fCBtVGltZXN0YW1wVXMgPiBtTGFzdENsZWFuVXBVcyArIGtDbGVhblVwRHVyYXRpb25VcykgeworICAgICAgICBtTGFzdENsZWFuVXBVcyA9IG1UaW1lc3RhbXBVczsKKyAgICAgICAgaWYgKG1UaW1lc3RhbXBVcyA+IG1MYXN0TG9nVXMgKyBrTG9nRHVyYXRpb25VcykgeworICAgICAgICAgICAgbUxhc3RMb2dVcyA9IG1UaW1lc3RhbXBVczsKKyAgICAgICAgICAgIEFMT0dEKCJidWZmZXJwb29sICVwIDogJXp1KCV6dSBzaXplKSB0b3RhbCBidWZmZXJzIC0gIgorICAgICAgICAgICAgICAgICAgIiV6dSglenUgc2l6ZSkgdXNlZCBidWZmZXJzIC0gJXp1LyV6dSAocmVjeWNsZS9hbGxvYykgLSAiCisgICAgICAgICAgICAgICAgICAiJXp1LyV6dSAoZmV0Y2gvdHJhbnNmZXIpIiwKKyAgICAgICAgICAgICAgICAgIHRoaXMsIG1TdGF0cy5tQnVmZmVyc0NhY2hlZCwgbVN0YXRzLm1TaXplQ2FjaGVkLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1CdWZmZXJzSW5Vc2UsIG1TdGF0cy5tU2l6ZUluVXNlLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1Ub3RhbFJlY3ljbGVzLCBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMsCisgICAgICAgICAgICAgICAgICBtU3RhdHMubVRvdGFsRmV0Y2hlcywgbVN0YXRzLm1Ub3RhbFRyYW5zZmVycyk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5iZWdpbigpOyBmcmVlSXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOykgeworICAgICAgICAgICAgaWYgKCFjbGVhckNhY2hlICYmIG1TdGF0cy5tU2l6ZUNhY2hlZCA8IGtNaW5BbGxvY0J5dGVzRm9yRXZpY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgJiYgbUJ1ZmZlcnMuc2l6ZSgpIDwga01pbkJ1ZmZlckNvdW50Rm9yRXZpY3Rpb24pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gaXQgPSBtQnVmZmVycy5maW5kKCpmcmVlSXQpOworICAgICAgICAgICAgaWYgKGl0ICE9IG1CdWZmZXJzLmVuZCgpICYmCisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYgaXQtPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoaXQtPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5lcmFzZShmcmVlSXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2ZyZWVJdDsKKyAgICAgICAgICAgICAgICBBTE9HVygiYnVmZmVycG9vbCBpbmNvbnNpc3RlbnQhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5oIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQWNjZXNzb3JJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjYjY4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FjY2Vzc29ySW1wbC5oCkBAIC0wLDAgKzEsMzAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUklNUExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUklNUExfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3N0cnVjdCBJbnRlcm5hbEJ1ZmZlcjsKK3N0cnVjdCBUcmFuc2FjdGlvblN0YXR1czsKKworLyoqCisgKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBhIGJ1ZmZlciBwb29sIGFjY2Vzc29yKG9yIGEgYnVmZmVyIHBvb2wgaW1wbGVtZW50YXRpb24uKSAqLworY2xhc3MgQWNjZXNzb3I6OkltcGwgeworcHVibGljOgorICAgIEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgfkltcGwoKTsKKworICAgIFJlc3VsdFN0YXR1cyBjb25uZWN0KAorICAgICAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3Nvciwgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsIGNvbnN0IFF1ZXVlRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpOworCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIFJlc3VsdFN0YXR1cyBmZXRjaChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKK3ByaXZhdGU6CisgICAgLy8gQ29ubmVjdGlvbklkID0gcGlkIDogKHRpbWVzdGFtcF9jcmVhdGVkICsgc2VxSWQpCisgICAgLy8gaW4gb3JkZXIgdG8gZ3VhcmFudGVlIHVuaXF1ZW5lc3MgZm9yIGVhY2ggY29ubmVjdGlvbgorICAgIHN0YXRpYyB1aW50MzJfdCBzU2VxSWQ7CisgICAgc3RhdGljIGludDMyX3Qgc1BpZDsKKworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworCisgICAgLyoqCisgICAgICogQnVmZmVyIHBvb2wgaW1wbGVtZW50YXRpb24uCisgICAgICoKKyAgICAgKiBIYW5kbGVzIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMuIEhhbmRsZXMgYnVmZmVyIGFsbG9jYXRpb24vcmVjeWNsaW5nLgorICAgICAqIEhhbmRsZXMgYnVmZmVyIHRyYW5zZmVyIGJldHdlZW4gYnVmZmVyIHBvb2wgY2xpZW50cy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgQnVmZmVyUG9vbCB7CisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIGludDY0X3QgbVRpbWVzdGFtcFVzOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2xlYW5VcFVzOworICAgICAgICBpbnQ2NF90IG1MYXN0TG9nVXM7CisgICAgICAgIEJ1ZmZlcklkIG1TZXE7CisgICAgICAgIEJ1ZmZlclN0YXR1c09ic2VydmVyIG1PYnNlcnZlcjsKKworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6c2V0PEJ1ZmZlcklkPj4gbVVzaW5nQnVmZmVyczsKKyAgICAgICAgc3RkOjptYXA8QnVmZmVySWQsIHN0ZDo6c2V0PENvbm5lY3Rpb25JZD4+IG1Vc2luZ0Nvbm5lY3Rpb25zOworCisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgc3RkOjpzZXQ8VHJhbnNhY3Rpb25JZD4+IG1QZW5kaW5nVHJhbnNhY3Rpb25zOworICAgICAgICAvLyBUcmFuc2FjdGlvbnMgY29tcGxldGVkIGJlZm9yZSBUUkFOU0ZFUl9UTyBtZXNzYWdlIGFycml2YWwuCisgICAgICAgIC8vIEZldGNoIGRvZXMgbm90IG9jY3VyIGZvciB0aGUgdHJhbnNhY3Rpb25zLgorICAgICAgICAvLyBPbmx5IHRyYW5zYWN0aW9uIGlkIGlzIGtlcHQgZm9yIHRoZSB0cmFuc2FjdGlvbnMgaW4gc2hvcnQgZHVyYXRpb24uCisgICAgICAgIHN0ZDo6c2V0PFRyYW5zYWN0aW9uSWQ+IG1Db21wbGV0ZWRUcmFuc2FjdGlvbnM7CisgICAgICAgIC8vIEN1cnJlbnRseSBhY3RpdmUocGVuZGluZykgdHJhbnNhdGlvbnMnIHN0YXR1cyAmIGluZm9ybWF0aW9uLgorICAgICAgICBzdGQ6Om1hcDxUcmFuc2FjdGlvbklkLCBzdGQ6OnVuaXF1ZV9wdHI8VHJhbnNhY3Rpb25TdGF0dXM+PgorICAgICAgICAgICAgICAgIG1UcmFuc2FjdGlvbnM7CisKKyAgICAgICAgc3RkOjptYXA8QnVmZmVySWQsIHN0ZDo6dW5pcXVlX3B0cjxJbnRlcm5hbEJ1ZmZlcj4+IG1CdWZmZXJzOworICAgICAgICBzdGQ6OnNldDxCdWZmZXJJZD4gbUZyZWVCdWZmZXJzOworICAgICAgICBzdGQ6OnNldDxDb25uZWN0aW9uSWQ+IG1Db25uZWN0aW9uSWRzOworCisgICAgICAgIC8vLyBCdWZmZXIgcG9vbCBzdGF0aXN0aWNzIHdoaWNoIHRyYWNrcyBhbGxvY2F0aW9uIGFuZCB0cmFuc2ZlciBzdGF0aXN0aWNzLgorICAgICAgICBzdHJ1Y3QgU3RhdHMgeworICAgICAgICAgICAgLy8vIFRvdGFsIHNpemUgb2YgYWxsb2NhdGlvbnMgd2hpY2ggYXJlIHVzZWQgb3IgYXZhaWxhYmxlIHRvIHVzZS4KKyAgICAgICAgICAgIC8vLyAoYnl0ZXMgb3IgcGl4ZWxzKQorICAgICAgICAgICAgc2l6ZV90IG1TaXplQ2FjaGVkOworICAgICAgICAgICAgLy8vICMgb2YgY2FjaGVkIGJ1ZmZlcnMgd2hpY2ggYXJlIHVzZWQgb3IgYXZhaWxhYmxlIHRvIHVzZS4KKyAgICAgICAgICAgIHNpemVfdCBtQnVmZmVyc0NhY2hlZDsKKyAgICAgICAgICAgIC8vLyBUb3RhbCBzaXplIG9mIGFsbG9jYXRpb25zIHdoaWNoIGFyZSBjdXJyZW50bHkgdXNlZC4gKGJ5dGVzIG9yIHBpeGVscykKKyAgICAgICAgICAgIHNpemVfdCBtU2l6ZUluVXNlOworICAgICAgICAgICAgLy8vICMgb2YgY3VycmVudGx5IHVzZWQgYnVmZmVycworICAgICAgICAgICAgc2l6ZV90IG1CdWZmZXJzSW5Vc2U7CisKKyAgICAgICAgICAgIC8vLyAjIG9mIGFsbG9jYXRpb25zIGNhbGxlZCBvbiBidWZmZXJwb29sLiAoIyBvZiBmZXRjaGVkIGZyb20gQmxvY2tQb29sKQorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbEFsbG9jYXRpb25zOworICAgICAgICAgICAgLy8vICMgb2YgYWxsb2NhdGlvbnMgdGhhdCB3ZXJlIHNlcnZlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgICAgICAgIC8vLyAoIyBvZiBhbGxvY2F0b3IgYWxsb2MgcHJldmVudGVkKQorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbFJlY3ljbGVzOworICAgICAgICAgICAgLy8vICMgb2YgYnVmZmVyIHRyYW5zZmVycyBpbml0aWF0ZWQuCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsVHJhbnNmZXJzOworICAgICAgICAgICAgLy8vICMgb2YgdHJhbnNmZXJzIHRoYXQgaGFkIHRvIGJlIGZldGNoZWQuCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsRmV0Y2hlczsKKworICAgICAgICAgICAgU3RhdHMoKQorICAgICAgICAgICAgICAgIDogbVNpemVDYWNoZWQoMCksIG1CdWZmZXJzQ2FjaGVkKDApLCBtU2l6ZUluVXNlKDApLCBtQnVmZmVyc0luVXNlKDApLAorICAgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMoMCksIG1Ub3RhbFJlY3ljbGVzKDApLCBtVG90YWxUcmFuc2ZlcnMoMCksIG1Ub3RhbEZldGNoZXMoMCkge30KKworICAgICAgICAgICAgLy8vIEEgbmV3IGJ1ZmZlciBpcyBhbGxvY2F0ZWQgb24gYW4gYWxsb2NhdGlvbiByZXF1ZXN0LgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckFsbG9jYXRlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVDYWNoZWQgKz0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzQ2FjaGVkKys7CisKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlKys7CisKKyAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgZXZpY3RlZCBhbmQgZGVzdHJveWVkLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckV2aWN0ZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplQ2FjaGVkIC09IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0NhY2hlZC0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgcmVjeWNsZWQgb24gYW4gYWxsb2NhdGlvbiByZXF1ZXN0LgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlclJlY3ljbGVkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlKys7CisKKyAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucysrOworICAgICAgICAgICAgICAgIG1Ub3RhbFJlY3ljbGVzKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBpcyBhdmFpbGFibGUgdG8gYmUgcmVjeWNsZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyVW51c2VkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlIC09IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciB0cmFuc2ZlciBpcyBpbml0aWF0ZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyU2VudCgpIHsKKyAgICAgICAgICAgICAgICBtVG90YWxUcmFuc2ZlcnMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGZldGNoIGlzIGludm9rZWQgYnkgYSBidWZmZXIgdHJhbnNmZXIuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyRmV0Y2hlZCgpIHsKKyAgICAgICAgICAgICAgICBtVG90YWxGZXRjaGVzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gbVN0YXRzOworCisgICAgcHVibGljOgorICAgICAgICAvKiogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sLiAqLworICAgICAgICBCdWZmZXJQb29sKCk7CisKKyAgICAgICAgLyoqIERlc3Ryb3lzIGEgYnVmZmVyIHBvb2wuICovCisgICAgICAgIH5CdWZmZXJQb29sKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyBhbGwgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAgICAgICAgKiBFYWNoIHN0YXR1cyBtZXNzYWdlIGlzIGhhbmRsZWQgYnkgbWV0aG9kcyB3aXRoICdoYW5kbGUnIHByZWZpeC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgcHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSBidWZmZXIgYmVpbmcgb3duZWQgYnkgYSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciBvd25pbmcgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGJ1ZmZlciBpcyBvd25lZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlT3duQnVmZmVyKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIGJ1ZmZlciBiZWluZyByZWxlYXNlZCBieSBhIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgYnVmZmVyIG93bmluZyBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgYnVmZmVyIG93bmVyc2hpcCBpcyByZWxlYXNlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlUmVsZWFzZUJ1ZmZlcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBzdGFydCBtZXNzYWdlIGZyb20gdGhlIHNlbmRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgICBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRyYW5zZmVyX3RvIG1lc3NhZ2UgaXMgYWNrbm93bGVkZ2VkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVUcmFuc2ZlclRvKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gYmVpbmcgYWNrZWQgYnkgdGhlIHJlY2VpdmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdHJhbnNmZXJfZnJvbSBtZXNzYWdlIGlzIGFja25vd2xlZGdlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlVHJhbnNmZXJGcm9tKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gcmVzdWx0IG1lc3NhZ2UgZnJvbSB0aGUgcmVjZWl2ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlICAgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgZXhpc2l0bmcgdHJhbnNhY3Rpb24gaXMgZmluaXNoZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVRyYW5zZmVyUmVzdWx0KGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgY29ubmVjdGlvbiBiZWluZyBjbG9zZWQsIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuIEFsbCB0aGUKKyAgICAgICAgICogYnVmZmVycyBhbmQgdHJhbnNhY3Rpb25zIG93bmVkIGJ5IHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgY2xlYW5lZCB1cC4KKyAgICAgICAgICogVGhlIHJlbGF0ZWQgRk1RIHdpbGwgYmUgY2xlYW5lZCB1cCB0b28uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgY29ubmVjdGlvbiBleGlzdGVkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVDbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVjeWNsZXMgYSBleGlzdGluZyBmcmVlIGJ1ZmZlciBpZiBpdCBpcyBwb3NzaWJsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFsbG9jYXRvciB0aGUgYnVmZmVyIGFsbG9jYXRvcgorICAgICAgICAgKiBAcGFyYW0gcGFyYW1zICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgICAqIEBwYXJhbSBwSWQgICAgICAgdGhlIGlkIG9mIHRoZSByZWN5Y2xlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGUgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIHJlY3ljbGVkIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiBhIGJ1ZmZlciBpcyByZWN5Y2xlZCwge0Bjb2RlIGZhbHNlfQorICAgICAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgZ2V0RnJlZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpwSWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHRvIGJ1ZmZlcnBvb2wuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbGxvYyAgICAgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBhbGxvY1NpemUgdGhlIHNpemUgb2YgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBwYXJhbXMgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgICAgICogQHBhcmFtIHBJZCAgICAgICB0aGUgYnVmZmVyIGlkIGZvciB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIGhhbmRsZSAgICB0aGUgbmF0aXZlIGhhbmRsZSBmb3IgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gT0sgd2hlbiBhbiBhbGxvY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIFJlc3VsdFN0YXR1cyBhZGROZXdCdWZmZXIoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpwSWQsCisgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9ybXMgcGVyaW9kaWMgY2FjaGUKKyAgICAgICAgICogY2xlYW5pbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjbGVhckNhY2hlICAgIGlmIGNsZWFyQ2FjaGUgaXMgdHJ1ZSwgaXQgZnJlZXMgYWxsIGJ1ZmZlcnMKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgd2FpdGluZyB0byBiZSByZWN5Y2xlZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIEFjY2Vzc29yOjpJbXBsOworICAgIH0gbUJ1ZmZlclBvb2w7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgdWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9BQ0NFU1NPUklNUExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQW5kcm9pZC5icCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgxN2M3NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyNyBAQAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMS4wIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkFjY2Vzc29yLmNwcCIsCisgICAgICAgICJBY2Nlc3NvckltcGwuY3BwIiwKKyAgICAgICAgIkJ1ZmZlclBvb2xDbGllbnQuY3BwIiwKKyAgICAgICAgIkJ1ZmZlclN0YXR1cy5jcHAiLAorICAgICAgICAiQ2xpZW50TWFuYWdlci5jcHAiLAorICAgICAgICAiQ29ubmVjdGlvbi5jcHAiLAorICAgIF0sCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDEuMCIsCisgICAgXSwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDEuMCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclBvb2xDbGllbnQuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyUG9vbENsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDcxMjM5OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclBvb2xDbGllbnQuY3BwCkBAIC0wLDAgKzEsNzEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJCdWZmZXJQb29sQ2xpZW50IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xDbGllbnQuaCIKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtSZWNlaXZlVGltZW91dFVzID0gMTAwMDAwMDsgLy8gMTAwbXMKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtQb3N0TWF4UmV0cnkgPSAzOworc3RhdGljIGNvbnN0ZXhwciBpbnQga0NhY2hlVHRsVXMgPSAxMDAwMDAwOyAvLyBUT0RPOiB0dW5lCisKK2NsYXNzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGwKKyAgICAgICAgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW1wbChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yKTsKKworICAgIGV4cGxpY2l0IEltcGwoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgYm9vbCBpc1ZhbGlkKCkgeworICAgICAgICByZXR1cm4gbVZhbGlkOworICAgIH0KKworICAgIGJvb2wgaXNMb2NhbCgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWxpZCAmJiBtTG9jYWw7CisgICAgfQorCisgICAgQ29ubmVjdGlvbklkIGdldENvbm5lY3Rpb25JZCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db25uZWN0aW9uSWQ7CisgICAgfQorCisgICAgc3A8SUFjY2Vzc29yPiAmZ2V0QWNjZXNzb3IoKSB7CisgICAgICAgIHJldHVybiBtQWNjZXNzb3I7CisgICAgfQorCisgICAgYm9vbCBpc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZSgKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgdm9pZCBwb3N0QnVmZmVyUmVsZWFzZShCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICBib29sIHBvc3RTZW5kKAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIENvbm5lY3Rpb25JZCByZWNlaXZlciwKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKK3ByaXZhdGU6CisKKyAgICBib29sIHBvc3RSZWNlaXZlKAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMpOworCisgICAgYm9vbCBwb3N0UmVjZWl2ZVJlc3VsdCgKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIGJvb2wgcmVzdWx0LCBib29sICpuZWVkc1N5bmMpOworCisgICAgdm9pZCB0cnlTeW5jRnJvbVJlbW90ZSgpOworCisgICAgYm9vbCBzeW5jUmVsZWFzZWQoKTsKKworICAgIHZvaWQgZXZpY3RDYWNoZXMoYm9vbCBjbGVhckNhY2hlID0gZmFsc2UpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlQnVmZmVySGFuZGxlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgIFJlc3VsdFN0YXR1cyBmZXRjaEJ1ZmZlckhhbmRsZSgKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgc3RydWN0IEJsb2NrUG9vbERhdGFEdG9yOworICAgIHN0cnVjdCBDbGllbnRCdWZmZXI7CisKKyAgICBib29sIG1Mb2NhbDsKKyAgICBib29sIG1WYWxpZDsKKyAgICBzcDxJQWNjZXNzb3I+IG1BY2Nlc3NvcjsKKyAgICBzcDxDb25uZWN0aW9uPiBtTG9jYWxDb25uZWN0aW9uOworICAgIHNwPElDb25uZWN0aW9uPiBtUmVtb3RlQ29ubmVjdGlvbjsKKyAgICB1aW50MzJfdCBtU2VxSWQ7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgICAgaW50NjRfdCBtTGFzdEV2aWN0Q2FjaGVVczsKKworICAgIC8vIENhY2hlZEJ1ZmZlcnMKKyAgICBzdHJ1Y3QgQnVmZmVyQ2FjaGUgeworICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBib29sIG1DcmVhdGluZzsKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUNyZWF0ZUN2OworICAgICAgICBzdGQ6Om1hcDxCdWZmZXJJZCwgc3RkOjp1bmlxdWVfcHRyPENsaWVudEJ1ZmZlcj4+IG1CdWZmZXJzOworICAgICAgICBpbnQgbUFjdGl2ZTsKKyAgICAgICAgaW50NjRfdCBtTGFzdENoYW5nZVVzOworCisgICAgICAgIEJ1ZmZlckNhY2hlKCkgOiBtQ3JlYXRpbmcoZmFsc2UpLCBtQWN0aXZlKDApLCBtTGFzdENoYW5nZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7fQorCisgICAgICAgIHZvaWQgaW5jQWN0aXZlX2woKSB7CisgICAgICAgICAgICArK21BY3RpdmU7CisgICAgICAgICAgICBtTGFzdENoYW5nZVVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGRlY0FjdGl2ZV9sKCkgeworICAgICAgICAgICAgLS1tQWN0aXZlOworICAgICAgICAgICAgbUxhc3RDaGFuZ2VVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICB9CisgICAgfSBtQ2FjaGU7CisKKyAgICAvLyBGTVEgLSByZWxlYXNlIG5vdGlmaWVyCisgICAgc3RydWN0IHsKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgLy8gVE9ETzogdXNlIG9ubHkgb25lIGxpc3Q/KHVzaW5nIG9uZSBsaXN0IG1heSBkZWFseSBzZW5kaW5nIG1lc3NhZ2VzPykKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiBtUmVsZWFzaW5nSWRzOworICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+IG1SZWxlYXNlZElkczsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c0NoYW5uZWw+IG1TdGF0dXNDaGFubmVsOworICAgIH0gbVJlbGVhc2luZzsKKworICAgIC8vIFRoaXMgbG9jayBpcyBoZWxkIGR1cmluZyBzeW5jaHJvbml6YXRpb24gZnJvbSByZW1vdGUgc2lkZS4KKyAgICAvLyBJbiBvcmRlciB0byBtaW5pbWl6ZSByZW1vdGUgY2FsbHMgYW5kIGxvY2tpbmcgZHVydGFpb24sIHRoaXMgbG9jayBpcyBoZWxkCisgICAgLy8gYnkgYmVzdCBlZmZvcnQgYXBwcm9hY2ggdXNpbmcgdHJ5X2xvY2soKS4KKyAgICBzdGQ6Om11dGV4IG1SZW1vdGVTeW5jTG9jazsKK307CisKK3N0cnVjdCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpCbG9ja1Bvb2xEYXRhRHRvciB7CisgICAgQmxvY2tQb29sRGF0YUR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+ICZpbXBsKQorICAgICAgICAgICAgOiBtSW1wbChpbXBsKSB7fQorCisgICAgdm9pZCBvcGVyYXRvcigpKEJ1ZmZlclBvb2xEYXRhICpidWZmZXIpIHsKKyAgICAgICAgQnVmZmVySWQgaWQgPSBidWZmZXItPm1JZDsKKyAgICAgICAgZGVsZXRlIGJ1ZmZlcjsKKworICAgICAgICBhdXRvIGltcGwgPSBtSW1wbC5sb2NrKCk7CisgICAgICAgIGlmIChpbXBsICYmIGltcGwtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgaW1wbC0+cG9zdEJ1ZmZlclJlbGVhc2UoaWQpOworICAgICAgICB9CisgICAgfQorICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gbUltcGw7Cit9OworCitzdHJ1Y3QgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6Q2xpZW50QnVmZmVyIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtSW52YWxpZGF0ZWQ7IC8vIFRPRE86IGltcGxlbWVudAorICAgIGludDY0X3QgbUV4cGlyZVVzOworICAgIGJvb2wgbUhhc0NhY2hlOworICAgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICAgIEJ1ZmZlcklkIG1JZDsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKm1IYW5kbGU7CisgICAgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sRGF0YT4gbUNhY2hlOworCisgICAgdm9pZCB1cGRhdGVFeHBpcmUoKSB7CisgICAgICAgIG1FeHBpcmVVcyA9IGdldFRpbWVzdGFtcE5vdygpICsga0NhY2hlVHRsVXM7CisgICAgfQorCitwdWJsaWM6CisgICAgQ2xpZW50QnVmZmVyKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQnVmZmVySWQgaWQsIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKQorICAgICAgICAgICAgOiBtSW52YWxpZGF0ZWQoZmFsc2UpLCBtSGFzQ2FjaGUoZmFsc2UpLAorICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkKGNvbm5lY3Rpb25JZCksIG1JZChpZCksIG1IYW5kbGUoaGFuZGxlKSB7CisgICAgICAgICh2b2lkKW1JbnZhbGlkYXRlZDsKKyAgICAgICAgbUV4cGlyZVVzID0gZ2V0VGltZXN0YW1wTm93KCkgKyBrQ2FjaGVUdGxVczsKKyAgICB9CisKKyAgICB+Q2xpZW50QnVmZmVyKCkgeworICAgICAgICBpZiAobUhhbmRsZSkgeworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShtSGFuZGxlKTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG1IYW5kbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBleHBpcmUoKSBjb25zdCB7CisgICAgICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIHJldHVybiBub3cgPj0gbUV4cGlyZVVzOworICAgIH0KKworICAgIGJvb2wgaGFzQ2FjaGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSGFzQ2FjaGU7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBmZXRjaENhY2hlKG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUpIHsKKyAgICAgICAgaWYgKG1IYXNDYWNoZSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBjYWNoZSA9IG1DYWNoZS5sb2NrKCk7CisgICAgICAgICAgICBpZiAoY2FjaGUpIHsKKyAgICAgICAgICAgICAgICAqcEhhbmRsZSA9IG1IYW5kbGU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2FjaGU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBjcmVhdGVDYWNoZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiAmaW1wbCwKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKnBIYW5kbGUpIHsKKyAgICAgICAgaWYgKCFtSGFzQ2FjaGUpIHsKKyAgICAgICAgICAgIC8vIEFsbG9jYXRlcyBhIHJhdyBwdHIgaW4gb3JkZXIgdG8gYXZvaWQgc2VuZGluZyAjcG9zdEJ1ZmZlclJlbGVhc2UKKyAgICAgICAgICAgIC8vIGZyb20gZGVsZXRlciwgaW4gY2FzZSBvZiBuYXRpdmVfaGFuZGxlX2Nsb25lIGZhaWx1cmUuCisgICAgICAgICAgICBCdWZmZXJQb29sRGF0YSAqcHRyID0gbmV3IEJ1ZmZlclBvb2xEYXRhKG1Db25uZWN0aW9uSWQsIG1JZCk7CisgICAgICAgICAgICBpZiAocHRyKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBjYWNoZShwdHIsIEJsb2NrUG9vbERhdGFEdG9yKGltcGwpKTsKKyAgICAgICAgICAgICAgICBpZiAoY2FjaGUpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhY2hlID0gY2FjaGU7CisgICAgICAgICAgICAgICAgICAgIG1IYXNDYWNoZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICpwSGFuZGxlID0gbUhhbmRsZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICAgICBkZWxldGUgcHRyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGJvb2wgb25DYWNoZVJlbGVhc2UoKSB7CisgICAgICAgIGlmIChtSGFzQ2FjaGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHZlcmlmeSBtQ2FjaGUgaXMgbm90IHZhbGlkOworICAgICAgICAgICAgdXBkYXRlRXhwaXJlKCk7CisgICAgICAgICAgICBtSGFzQ2FjaGUgPSBmYWxzZTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9OworCitCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpJbXBsKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpCisgICAgOiBtTG9jYWwodHJ1ZSksIG1WYWxpZChmYWxzZSksIG1BY2Nlc3NvcihhY2Nlc3NvciksIG1TZXFJZCgwKSwKKyAgICAgIG1MYXN0RXZpY3RDYWNoZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7CisgICAgY29uc3QgUXVldWVEZXNjcmlwdG9yICpmbXFEZXNjOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBhY2Nlc3Nvci0+Y29ubmVjdCgKKyAgICAgICAgICAgICZtTG9jYWxDb25uZWN0aW9uLCAmbUNvbm5lY3Rpb25JZCwgJmZtcURlc2MsIHRydWUpOworICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c0NoYW5uZWw+KCpmbXFEZXNjKTsKKyAgICAgICAgbVZhbGlkID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbCAmJgorICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPmlzVmFsaWQoKTsKKyAgICB9Cit9CisKK0J1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkltcGwoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IpCisgICAgOiBtTG9jYWwoZmFsc2UpLCBtVmFsaWQoZmFsc2UpLCBtQWNjZXNzb3IoYWNjZXNzb3IpLCBtU2VxSWQoMCksCisgICAgICBtTGFzdEV2aWN0Q2FjaGVVcyhnZXRUaW1lc3RhbXBOb3coKSkgeworICAgIGJvb2wgdmFsaWQgPSBmYWxzZTsKKyAgICBzcDxJQ29ubmVjdGlvbj4mIG91dENvbm5lY3Rpb24gPSBtUmVtb3RlQ29ubmVjdGlvbjsKKyAgICBDb25uZWN0aW9uSWQmIGlkID0gbUNvbm5lY3Rpb25JZDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzQ2hhbm5lbD4mIG91dENoYW5uZWwgPQorICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbDsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBhY2Nlc3Nvci0+Y29ubmVjdCgKKyAgICAgICAgICAgIFsmdmFsaWQsICZvdXRDb25uZWN0aW9uLCAmaWQsICZvdXRDaGFubmVsXQorICAgICAgICAgICAgKFJlc3VsdFN0YXR1cyBzdGF0dXMsIHNwPElDb25uZWN0aW9uPiBjb25uZWN0aW9uLAorICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IFF1ZXVlRGVzY3JpcHRvciYgZGVzYykgeworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBvdXRDb25uZWN0aW9uID0gY29ubmVjdGlvbjsKKyAgICAgICAgICAgICAgICAgICAgaWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgICAgIG91dENoYW5uZWwgPSBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c0NoYW5uZWw+KGRlc2MpOworICAgICAgICAgICAgICAgICAgICBpZiAob3V0Q2hhbm5lbCAmJiBvdXRDaGFubmVsLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIG1WYWxpZCA9IHRyYW5zUmVzdWx0LmlzT2soKSAmJiB2YWxpZDsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjppc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKSB7CisgICAgYm9vbCBhY3RpdmUgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICBldmljdENhY2hlcyhjbGVhckNhY2hlKTsKKyAgICAgICAgKmxhc3RUcmFuc2FjdGlvblVzID0gbUNhY2hlLm1MYXN0Q2hhbmdlVXM7CisgICAgICAgIGFjdGl2ZSA9IG1DYWNoZS5tQWN0aXZlID4gMDsKKyAgICB9CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGNsZWFyQ2FjaGUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGFjdGl2ZTsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoIW1Mb2NhbCB8fCAhbUxvY2FsQ29ubmVjdGlvbiB8fCAhbVZhbGlkKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBCdWZmZXJJZCBidWZmZXJJZDsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG51bGxwdHI7CisgICAgYnVmZmVyLT5yZXNldCgpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBhbGxvY2F0ZUJ1ZmZlckhhbmRsZShwYXJhbXMsICZidWZmZXJJZCwgJmhhbmRsZSk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgICAgICBldmljdENhY2hlcygpOworICAgICAgICAgICAgYXV0byBjYWNoZUl0ID0gbUNhY2hlLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKGNhY2hlSXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogdmVyaWZ5IGl0IGlzIHJlY3ljbGVkLiAobm90IGhhdmluZyBhY3RpdmUgcmVmKQorICAgICAgICAgICAgICAgIG1DYWNoZS5tQnVmZmVycy5lcmFzZShjYWNoZUl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gY2xpZW50QnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTxDbGllbnRCdWZmZXI+KAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChjbGllbnRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IG1DYWNoZS5tQnVmZmVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJZCwgc3RkOjptb3ZlKGNsaWVudEJ1ZmZlcikpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnNlY29uZCkgeworICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gcmVzdWx0LmZpcnN0LT5zZWNvbmQtPmNyZWF0ZUNhY2hlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSwgcEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuaW5jQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoISpidWZmZXIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgY2FjaGUgY3JlYXRpb24gZmFpbHVyZSAlZDogJWxsZCIsCisgICAgICAgICAgICAgICAgICBoYW5kbGUgIT0gbnVsbHB0ciwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgcG9zdEJ1ZmZlclJlbGVhc2UoYnVmZmVySWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpyZWNlaXZlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoIW1WYWxpZCkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgaWYgKHRpbWVzdGFtcFVzICE9IDApIHsKKyAgICAgICAgdGltZXN0YW1wVXMgKz0ga1JlY2VpdmVUaW1lb3V0VXM7CisgICAgfQorICAgIGlmICghcG9zdFJlY2VpdmUoYnVmZmVySWQsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgYnVmZmVyLT5yZXNldCgpOworICAgIHdoaWxlKDEpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICBldmljdENhY2hlcygpOworICAgICAgICBhdXRvIGNhY2hlSXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgIGlmIChjYWNoZUl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgaWYgKGNhY2hlSXQtPnNlY29uZC0+aGFzQ2FjaGUoKSkgeworICAgICAgICAgICAgICAgICpidWZmZXIgPSBjYWNoZUl0LT5zZWNvbmQtPmZldGNoQ2FjaGUocEhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKCEqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRyYW5zZmVyIHRpbWVfb3V0CisgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiY2xpZW50IHJlY2VpdmUgZnJvbSByZWZlcmVuY2UgJWxsZCIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpidWZmZXIgPSBjYWNoZUl0LT5zZWNvbmQtPmNyZWF0ZUNhY2hlKHNoYXJlZF9mcm9tX3RoaXMoKSwgcEhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmluY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSBmcm9tIGNhY2hlICVsbGQiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFtQ2FjaGUubUNyZWF0aW5nKSB7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZmV0Y2hCdWZmZXJIYW5kbGUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsICZoYW5kbGUpOworICAgICAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGNsaWVudEJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q2xpZW50QnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSBtQ2FjaGUubUJ1ZmZlcnMuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoYnVmZmVySWQsIHN0ZDo6bW92ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50QnVmZmVyKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSByZXN1bHQuZmlyc3QtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5pbmNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGVDdi5ub3RpZnlfYWxsKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FjaGUubUNyZWF0ZUN2LndhaXQobG9jayk7CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBuZWVkc1N5bmMgPSBmYWxzZTsKKyAgICBib29sIHBvc3RlZCA9IHBvc3RSZWNlaXZlUmVzdWx0KGJ1ZmZlcklkLCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID8gdHJ1ZSA6IGZhbHNlLCAmbmVlZHNTeW5jKTsKKyAgICBBTE9HVigiY2xpZW50IHJlY2VpdmUgJWxsZCAtICV1IDogJXMgKCVkKSIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgKmJ1ZmZlciA/ICJvayIgOiAiZmFpbCIsIHBvc3RlZCk7CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGZhbHNlKTsKKyAgICB9CisgICAgaWYgKG5lZWRzU3luYyAmJiBtUmVtb3RlQ29ubmVjdGlvbikgeworICAgICAgICB0cnlTeW5jRnJvbVJlbW90ZSgpOworICAgIH0KKyAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICBpZiAoIXBvc3RlZCkgeworICAgICAgICAgICAgYnVmZmVyLT5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKwordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0QnVmZmVyUmVsZWFzZShCdWZmZXJJZCBidWZmZXJJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcy5wdXNoX2JhY2soYnVmZmVySWQpOworICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLCBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7Cit9CisKKy8vIFRPRE86IHJldmlzZSBhZC1ob2MgcG9zdGluZyBkYXRhIHN0cnVjdHVyZQorYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0U2VuZCgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIENvbm5lY3Rpb25JZCByZWNlaXZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCAqdGltZXN0YW1wVXMpIHsKKyAgICBib29sIHJldCA9IGZhbHNlOworICAgIGJvb2wgbmVlZHNTeW5jID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgKnRpbWVzdGFtcFVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgICp0cmFuc2FjdGlvbklkID0gKG1Db25uZWN0aW9uSWQgPDwgMzIpIHwgbVNlcUlkKys7CisgICAgICAgIC8vIFRPRE86IHJldHJ5LCBhZGQgdGltZW91dCwgdGFyZ2V0PworICAgICAgICByZXQgPSAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICAgICAgKnRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RPLCBtQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgIHJlY2VpdmVyLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgbmVlZHNTeW5jID0gIW1Mb2NhbCAmJiBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5uZWVkc1N5bmMoKTsKKyAgICB9CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGZhbHNlKTsKKyAgICB9CisgICAgaWYgKG5lZWRzU3luYyAmJiBtUmVtb3RlQ29ubmVjdGlvbikgeworICAgICAgICB0cnlTeW5jRnJvbVJlbW90ZSgpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnBvc3RSZWNlaXZlKAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrUG9zdE1heFJldHJ5OyArK2kpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgICAgICBpbnQ2NF90IG5vdyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICBpZiAodGltZXN0YW1wVXMgPT0gMCB8fCBub3cgPCB0aW1lc3RhbXBVcykgeworICAgICAgICAgICAgYm9vbCByZXN1bHQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTSwKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgLTEsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICAgICAgaWYgKHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVElNRU9VVCwKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgLTEsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0UmVjZWl2ZVJlc3VsdCgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgYm9vbCByZXN1bHQsIGJvb2wgKm5lZWRzU3luYykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgIC8vIFRPRE86IHJldHJ5LCBhZGQgdGltZW91dAorICAgIGJvb2wgcmV0ID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgIHJlc3VsdCA/IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0sgOiBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0VSUk9SLAorICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgLTEsIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcywKKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAqbmVlZHNTeW5jID0gIW1Mb2NhbCAmJiBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5uZWVkc1N5bmMoKTsKKyAgICByZXR1cm4gcmV0OworfQorCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OnRyeVN5bmNGcm9tUmVtb3RlKCkgeworICAgIGlmIChtUmVtb3RlU3luY0xvY2sudHJ5X2xvY2soKSkgeworICAgICAgICBib29sIG5lZWRzU3luYyA9IGZhbHNlOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgICAgIG5lZWRzU3luYyA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPm5lZWRzU3luYygpOworICAgICAgICB9CisgICAgICAgIGlmIChuZWVkc1N5bmMpIHsKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCA9IChtQ29ubmVjdGlvbklkIDw8IDMyKTsKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gQ29ubmVjdGlvbjo6U1lOQ19CVUZGRVJJRDsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IG1SZW1vdGVDb25uZWN0aW9uLT5mZXRjaCgKKyAgICAgICAgICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgIFtdCisgICAgICAgICAgICAgICAgICAgIChSZXN1bHRTdGF0dXMgb3V0U3RhdHVzLCBCdWZmZXIgb3V0QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgb3V0U3RhdHVzOworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIG91dEJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZighdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoInN5bmMgZnJvbSBjbGllbnQgJWxsZCBmYWlsZWQ6IGJ1ZmZlcnBvb2wgcHJvY2VzcyBkaWVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtUmVtb3RlU3luY0xvY2sudW5sb2NrKCk7CisgICAgfQorfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6c3luY1JlbGVhc2VkKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgIGlmIChtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMuc2l6ZSgpID4gMCkgeworICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpOworICAgIH0KKyAgICBpZiAobVJlbGVhc2luZy5tUmVsZWFzZWRJZHMuc2l6ZSgpID4gMCkgeworICAgICAgICBmb3IgKEJ1ZmZlcklkJiBpZDogbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMpIHsKKyAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVsZWFzZSBidWZmZXIgJWxsZCAtICV1IiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBpZCk7CisgICAgICAgICAgICBhdXRvIGZvdW5kID0gbUNhY2hlLm1CdWZmZXJzLmZpbmQoaWQpOworICAgICAgICAgICAgaWYgKGZvdW5kICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgIGlmIChmb3VuZC0+c2Vjb25kLT5vbkNhY2hlUmVsZWFzZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5kZWNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIQorICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2xpZW50ICVsbGQgY2FjaGUgcmVsZWFzZSBzdGF0dXMgaW5jb25zaXRlbnQhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIQorICAgICAgICAgICAgICAgIEFMT0dXKCJjbGllbnQgJWxsZCBjYWNoZSBzdGF0dXMgaW5jb25zaXRlbnQhIiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcy5jbGVhcigpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6ZXZpY3RDYWNoZXMoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBpZiAobm93ID49IG1MYXN0RXZpY3RDYWNoZVVzICsga0NhY2hlVHRsVXMgfHwgY2xlYXJDYWNoZSkgeworICAgICAgICBzaXplX3QgZXZpY3RlZCA9IDA7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmhhc0NhY2hlKCkgJiYgKGl0LT5zZWNvbmQtPmV4cGlyZSgpIHx8IGNsZWFyQ2FjaGUpKSB7CisgICAgICAgICAgICAgICAgaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICsrZXZpY3RlZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY2FjaGUgY291bnQgJWxsZCA6IHRvdGFsICV6dSwgYWN0aXZlICVkLCBldmljdGVkICV6dSIsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgbUNhY2hlLm1CdWZmZXJzLnNpemUoKSwgbUNhY2hlLm1BY3RpdmUsIGV2aWN0ZWQpOworICAgICAgICBtTGFzdEV2aWN0Q2FjaGVVcyA9IG5vdzsKKyAgICB9Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjphbGxvY2F0ZUJ1ZmZlckhhbmRsZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBpZiAobUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqIGFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1Mb2NhbENvbm5lY3Rpb24tPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgIHBhcmFtcywgYnVmZmVySWQsICZhbGxvY0hhbmRsZSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgKmhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUoYWxsb2NIYW5kbGUpOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJjbGllbnQgYWxsb2NhdGUgcmVzdWx0ICVsbGQgJWQgOiAldSBjbG9uZSAlcCIsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0ssCisgICAgICAgICAgICAgICpoYW5kbGUgPyAqYnVmZmVySWQgOiAwICwgKmhhbmRsZSk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6ZmV0Y2hCdWZmZXJIYW5kbGUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSkgeworICAgIHNwPElDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIGlmIChtTG9jYWwpIHsKKyAgICAgICAgY29ubmVjdGlvbiA9IG1Mb2NhbENvbm5lY3Rpb247CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29ubmVjdGlvbiA9IG1SZW1vdGVDb25uZWN0aW9uOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IGNvbm5lY3Rpb24tPmZldGNoKAorICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICBbJnN0YXR1cywgJmhhbmRsZV0KKyAgICAgICAgICAgIChSZXN1bHRTdGF0dXMgb3V0U3RhdHVzLCBCdWZmZXIgb3V0QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gb3V0U3RhdHVzOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIuYnVmZmVyLmdldE5hdGl2ZUhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gdHJhbnNSZXN1bHQuaXNPaygpID8gc3RhdHVzIDogUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworCitCdWZmZXJQb29sQ2xpZW50OjpCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpIHsKKyAgICBtSW1wbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oYWNjZXNzb3IpOworfQorCitCdWZmZXJQb29sQ2xpZW50OjpCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yKSB7CisgICAgbUltcGwgPSBzdGQ6Om1ha2Vfc2hhcmVkPEltcGw+KGFjY2Vzc29yKTsKK30KKworQnVmZmVyUG9vbENsaWVudDo6fkJ1ZmZlclBvb2xDbGllbnQoKSB7CisgICAgLy8gVE9ETzogaG93IHRvIGhhbmRsZSBvcnBoYW5lZCBidWZmZXJzPworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1JbXBsICYmIG1JbXBsLT5pc1ZhbGlkKCk7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6aXNMb2NhbCgpIHsKKyAgICByZXR1cm4gbUltcGwgJiYgbUltcGwtPmlzTG9jYWwoKTsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50Ojppc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKCFpc1ZhbGlkKCkpIHsKKyAgICAgICAgKmxhc3RUcmFuc2FjdGlvblVzID0gMDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbUltcGwtPmlzQWN0aXZlKGxhc3RUcmFuc2FjdGlvblVzLCBjbGVhckNhY2hlKTsKK30KKworQ29ubmVjdGlvbklkIEJ1ZmZlclBvb2xDbGllbnQ6OmdldENvbm5lY3Rpb25JZCgpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OmdldEFjY2Vzc29yKHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICAqYWNjZXNzb3IgPSBtSW1wbC0+Z2V0QWNjZXNzb3IoKTsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6YWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPmFsbG9jYXRlKHBhcmFtcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OnJlY2VpdmUoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gbUltcGwtPnJlY2VpdmUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIHRpbWVzdGFtcFVzLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6cG9zdFNlbmQoCisgICAgICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICBib29sIHJlc3VsdCA9IG1JbXBsLT5wb3N0U2VuZCgKKyAgICAgICAgICAgICAgICBidWZmZXItPm1JZCwgcmVjZWl2ZXJJZCwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpOworICAgICAgICByZXR1cm4gcmVzdWx0ID8gUmVzdWx0U3RhdHVzOjpPSyA6IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJQb29sQ2xpZW50LmggYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJQb29sQ2xpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc3ZWZlZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclBvb2xDbGllbnQuaApAQCAtMCwwICsxLDEwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSUE9PTENMSUVOVF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0JVRkZFUlBPT0xDTElFTlRfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUFjY2Vzc29yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC9JQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUNvbm5lY3Rpb247Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworLyoqCisgKiBBIGJ1ZmZlciBwb29sIGNsaWVudCBmb3IgYSBidWZmZXIgcG9vbC4gRm9yIGEgc3BlY2lmaWMgYnVmZmVyIHBvb2wsIGF0IG1vc3QKKyAqIG9uZSBidWZmZXIgcG9vbCBjbGllbnQgZXhpc3RzIHBlciBwcm9jZXNzLiBUaGlzIGNsYXNzIHdpbGwgbm90IGJlIGV4cG9zZWQKKyAqIG91dHNpZGUuIEEgYnVmZmVyIHBvb2wgY2xpZW50IHdpbGwgYmUgdXNlZCB2aWEgQ2xpZW50TWFuYWdlci4KKyAqLworY2xhc3MgQnVmZmVyUG9vbENsaWVudCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGNsaWVudCBmcm9tIGEgbG9jYWwgYnVmZmVyIHBvb2wKKyAgICAgKiAodmlhIENsaWVudE1hbmFnZXIjY3JlYXRlKS4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBCdWZmZXJQb29sQ2xpZW50KGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGNsaWVudCBmcm9tIGEgcmVtb3RlIGJ1ZmZlciBwb29sCisgICAgICogKHZpYSBDbGllbnRNYW5hZ2VyI3JlZ2lzdGVyU2VuZGVyKS4KKyAgICAgKiBOb3RlOiBBIGJ1ZmZlciBwb29sIGNsaWVudCBjcmVhdGVkIHdpdGggcmVtb3RlIGJ1ZmZlciBwb29sIGNhbm5vdAorICAgICAqIGFsbG9jYXRlIGEgYnVmZmVyLgorICAgICAqLworICAgIGV4cGxpY2l0IEJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgLyoqIERlc3RydWN0cyBhIGJ1ZmZlciBwb29sIGNsaWVudC4gKi8KKyAgICB+QnVmZmVyUG9vbENsaWVudCgpOworCitwcml2YXRlOgorICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgYm9vbCBpc0xvY2FsKCk7CisKKyAgICBib29sIGlzQWN0aXZlKGludDY0X3QgKmxhc3RUcmFuc2FjdGlvblVzLCBib29sIGNsZWFyQ2FjaGUpOworCisgICAgQ29ubmVjdGlvbklkIGdldENvbm5lY3Rpb25JZCgpOworCisgICAgUmVzdWx0U3RhdHVzIGdldEFjY2Vzc29yKHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZShUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyBwb3N0U2VuZChDb25uZWN0aW9uSWQgcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpOworCisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisKKyAgICBmcmllbmQgc3RydWN0IENsaWVudE1hbmFnZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSUE9PTENMSUVOVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJTdGF0dXMuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyU3RhdHVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjlhYmNlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQnVmZmVyU3RhdHVzLmNwcApAQCAtMCwwICsxLDE5MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbFN0YXR1cyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlICJCdWZmZXJTdGF0dXMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitpbnQ2NF90IGdldFRpbWVzdGFtcE5vdygpIHsKKyAgICBpbnQ2NF90IHN0YW1wOworICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKyAgICAvLyBUT0RPOiBDTE9DS19NT05PVE9OSUNfQ09BUlNFPworICAgIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpOworICAgIHN0YW1wID0gdHMudHZfbnNlYyAvIDEwMDA7CisgICAgc3RhbXAgKz0gKHRzLnR2X3NlYyAqIDEwMDAwMDBMTCk7CisgICAgcmV0dXJuIHN0YW1wOworfQorCitzdGF0aWMgY29uc3RleHByIGludCBrTnVtRWxlbWVudHNJblF1ZXVlID0gMTAyNCoxNjsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtNaW5FbGVtZW50c1RvU3luY0luUXVldWUgPSAxMjg7CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJTdGF0dXNPYnNlcnZlcjo6b3BlbigKKyAgICAgICAgQ29ubmVjdGlvbklkIGlkLCBjb25zdCBRdWV1ZURlc2NyaXB0b3IqKiBmbXFEZXNjUHRyKSB7CisgICAgaWYgKG1CdWZmZXJTdGF0dXNRdWV1ZXMuZmluZChpZCkgIT0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lbmQoKSkgeworICAgICAgICAvLyBUT0RPOiBpZCBjb2xsaXNpb24gbG9nPworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPiBxdWV1ZSA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlclN0YXR1c1F1ZXVlPihrTnVtRWxlbWVudHNJblF1ZXVlKTsKKyAgICBpZiAoIXF1ZXVlIHx8IHF1ZXVlLT5pc1ZhbGlkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBudWxscHRyOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBxdWV1ZS0+Z2V0RGVzYygpOworICAgIH0KKyAgICBhdXRvIHJlc3VsdCA9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuaW5zZXJ0KAorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoaWQsIHN0ZDo6bW92ZShxdWV1ZSkpKTsKKyAgICBpZiAoIXJlc3VsdC5zZWNvbmQpIHsKKyAgICAgICAgKmZtcURlc2NQdHIgPSBudWxscHRyOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyU3RhdHVzT2JzZXJ2ZXI6OmNsb3NlKENvbm5lY3Rpb25JZCBpZCkgeworICAgIGlmIChtQnVmZmVyU3RhdHVzUXVldWVzLmZpbmQoaWQpID09IG1CdWZmZXJTdGF0dXNRdWV1ZXMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIG1CdWZmZXJTdGF0dXNRdWV1ZXMuZXJhc2UoaWQpOworICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCit2b2lkIEJ1ZmZlclN0YXR1c09ic2VydmVyOjpnZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+ICZtZXNzYWdlcykgeworICAgIGZvciAoYXV0byBpdCA9IG1CdWZmZXJTdGF0dXNRdWV1ZXMuYmVnaW4oKTsgaXQgIT0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lbmQoKTsgKytpdCkgeworICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IGl0LT5zZWNvbmQtPmF2YWlsYWJsZVRvUmVhZCgpOworICAgICAgICB3aGlsZSAoYXZhaWwgPiAwKSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPnJlYWQoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2YgcmVhZHMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcgKHNwdXJpb3VzIGNsaWVudD8pCisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSByZWFkIGZyb20gJWxsZCIsIChsb25nIGxvbmcpaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCA9IGl0LT5maXJzdDsKKyAgICAgICAgICAgIG1lc3NhZ2VzLnB1c2hfYmFjayhtZXNzYWdlKTsKKyAgICAgICAgICAgIC0tYXZhaWw7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0J1ZmZlclN0YXR1c0NoYW5uZWw6OkJ1ZmZlclN0YXR1c0NoYW5uZWwoCisgICAgICAgIGNvbnN0IFF1ZXVlRGVzY3JpcHRvciAmZm1xRGVzYykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4gcXVldWUgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNRdWV1ZT4oZm1xRGVzYyk7CisgICAgaWYgKCFxdWV1ZSB8fCBxdWV1ZS0+aXNWYWxpZCgpID09IGZhbHNlKSB7CisgICAgICAgIG1WYWxpZCA9IGZhbHNlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1WYWxpZCAgPSB0cnVlOworICAgIG1CdWZmZXJTdGF0dXNRdWV1ZSA9IHN0ZDo6bW92ZShxdWV1ZSk7Cit9CisKK2Jvb2wgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbVZhbGlkOworfQorCitib29sIEJ1ZmZlclN0YXR1c0NoYW5uZWw6Om5lZWRzU3luYygpIHsKKyAgICBpZiAobVZhbGlkKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICByZXR1cm4gYXZhaWwgKyBrTWluRWxlbWVudHNUb1N5bmNJblF1ZXVlIDwga051bUVsZW1lbnRzSW5RdWV1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEJ1ZmZlclN0YXR1c0NoYW5uZWw6OnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpIHsKKyAgICBpZiAobVZhbGlkICYmIHBlbmRpbmcuc2l6ZSgpID4gMCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgYXZhaWwgPSBzdGQ6Om1pbihhdmFpbCwgcGVuZGluZy5zaXplKCkpOworICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IGF2YWlsOyArK2kpIHsKKyAgICAgICAgICAgIEJ1ZmZlcklkIGlkID0gcGVuZGluZy5mcm9udCgpOworICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOworICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCA9IGlkOworICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRpbmc/CisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwZW5kaW5nLnBvcF9mcm9udCgpOworICAgICAgICAgICAgcG9zdGVkLnB1c2hfYmFjayhpZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgIEJ1ZmZlclN0YXR1cyBzdGF0dXMsIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIENvbm5lY3Rpb25JZCB0YXJnZXRJZCwKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcGVuZGluZywgc3RkOjpsaXN0PEJ1ZmZlcklkPiAmcG9zdGVkKSB7CisgICAgaWYgKG1WYWxpZCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgc2l6ZV90IG51bVBlbmRpbmcgPSBwZW5kaW5nLnNpemUoKTsKKyAgICAgICAgaWYgKGF2YWlsID49IG51bVBlbmRpbmcgKyAxKSB7CisgICAgICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIHJlbGVhc2UsIG1lc3NhZ2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVBlbmRpbmc7ICsraSkgeworICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGlkID0gcGVuZGluZy5mcm9udCgpOworICAgICAgICAgICAgICAgIHJlbGVhc2UubmV3U3RhdHVzID0gQnVmZmVyU3RhdHVzOjpOT1RfVVNFRDsKKyAgICAgICAgICAgICAgICByZWxlYXNlLmJ1ZmZlcklkID0gaWQ7CisgICAgICAgICAgICAgICAgcmVsZWFzZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZyZWxlYXNlLCAxKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiB3cml0ZXMgYXJlIGFscmVhZHkgY29uZmlybWVkLAorICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZz8KKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwZW5kaW5nLnBvcF9mcm9udCgpOworICAgICAgICAgICAgICAgIHBvc3RlZC5wdXNoX2JhY2soaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKyAgICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzID0gc3RhdHVzOworICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBtZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZCA9IHRhcmdldElkOworICAgICAgICAgICAgLy8gVE9ETyA6IHRpbWVzYXRhbXAKKyAgICAgICAgICAgIG1lc3NhZ2UudGltZXN0YW1wVXMgPSAwOworICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZtZXNzYWdlLCAxKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHdyaXRlcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHNlbnQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJTdGF0dXMuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0J1ZmZlclN0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExOGE5MjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9CdWZmZXJTdGF0dXMuaApAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSU1RBVFVTX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSU1RBVFVTX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKKy8qKiBSZXR1cm5zIG1vbm90b25pYyB0aW1lc3RhbXAgaW4gVXMgc2luY2UgZml4ZWQgcG9pbnQgaW4gdGltZS4gKi8KK2ludDY0X3QgZ2V0VGltZXN0YW1wTm93KCk7CisKKy8qKgorICogQSBjb2xsZWN0aW9uIG9mIEZNUSBmb3IgYSBidWZmZXIgcG9vbC4gYnVmZmVyIG93bmVyc2hpcC9zdGF0dXMgY2hhbmdlCisgKiBtZXNzYWdlcyBhcmUgc2VudCB2aWEgdGhlIEZNUXMgZnJvbSB0aGUgY2xpZW50cy4KKyAqLworY2xhc3MgQnVmZmVyU3RhdHVzT2JzZXJ2ZXIgeworcHJpdmF0ZToKKyAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4+CisgICAgICAgICAgICBtQnVmZmVyU3RhdHVzUXVldWVzOworCitwdWJsaWM6CisgICAgLyoqIENyZWF0ZXMgYW4gRk1RIGZvciB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24oY2xpZW50KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIHNwZWNpZmllZCBjbGllbnQuCisgICAgICogQHBhcmFtIGZtcURlc2NQdHIgICAgZG91YmxlIHB0ciBvZiBjcmVhdGVkIEZNUSdzIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIGlmIEZNUSBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgb3BlbihDb25uZWN0aW9uSWQgaWQsIGNvbnN0IFF1ZXVlRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpOworCisgICAgLyoqIENsb3NlcyBhbiBGTVEgZm9yIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbihjbGllbnQpLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgc3BlY2lmaWVkIGNsaWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgaWYgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIGlzIGNsb3NlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBpZCk7CisKKyAgICAvKiogUmV0cmlldmVzIGFsbCBwZW5kaW5nIEZNUSBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGZyb20gY2xpZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlcyAgcmV0cmlldmVkIHBlbmRpbmcgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCBnZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+ICZtZXNzYWdlcyk7Cit9OworCisvKioKKyAqIEFuIEZNUSBmb3IgYSBidWZmZXIgcG9vbCBjbGllbnQuIEJ1ZmZlciBvd25lcnNoaXAvc3RhdHVzIGNoYW5nZSBtZXNzYWdlcworICogYXJlIHNlbnQgdmlhIHRoZSBmbXEgdG8gdGhlIGJ1ZmZlciBwb29sLgorICovCitjbGFzcyBCdWZmZXJTdGF0dXNDaGFubmVsIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtVmFsaWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPiBtQnVmZmVyU3RhdHVzUXVldWU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0byBhbiBGTVEgZnJvbSBhIGRlc2NyaXB0b3Igb2YgdGhlIGNyZWF0ZWQgRk1RLgorICAgICAqCisgICAgICogQHBhcmFtIGZtcURlc2MgICBEZXNjcmlwdG9yIG9mIHRoZSBjcmVhdGVkIEZNUS4KKyAgICAgKi8KKyAgICBCdWZmZXJTdGF0dXNDaGFubmVsKGNvbnN0IFF1ZXVlRGVzY3JpcHRvciAmZm1xRGVzYyk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBGTVEgaXMgY29ubmVjdGVkIHN1Y2Nlc3NmdWxseS4gKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBuZWVkcyB0byBiZSBzeW5jZWQgZnJvbSB0aGUgYnVmZmVyIHBvb2wgKi8KKyAgICBib29sIG5lZWRzU3luYygpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgcmVsZWFzZSBtZXNzYWdlIHRvIHRoZSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gcGVuZGluZyAgICAgICBjdXJyZW50bHkgcGVuZGluZyBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKiBAcGFyYW0gcG9zdGVkICAgICAgICBwb3N0ZWQgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCBwb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgcmVnYXJkaW5nIHRoZSBzcGVjaWZpZWQgYnVmZmVyCisgICAgICogdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBJZCBvZiB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIGJ1ZmZlciBJZCBvZiB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBzdGF0dXMgICAgICAgIG5ldyBzdGF0dXMgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHRhcmdldElkICAgICAgY29ubmVjdGlvbiBJZCBvZiB0aGUgcmVjZWl2ZXIob25seSB3aGVuIHRoZSBzZW5kZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0cyBhIHN0YXR1cyBtZXNzYWdlKS4KKyAgICAgKiBAcGFyYW0gcGVuZGluZyAgICAgICBjdXJyZW50bHkgcGVuZGluZyBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKiBAcGFyYW0gcG9zdGVkICAgICAgICBwb3N0ZWQgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBpcyBwb3N0ZWQsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIHBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBCdWZmZXJTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCB0YXJnZXRJZCwKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQlVGRkVSU1RBVFVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0NsaWVudE1hbmFnZXIuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ2xpZW50TWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNlYTBhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0NsaWVudE1hbmFnZXIuY3BwCkBAIC0wLDAgKzEsNTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbE1hbmFnZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xDbGllbnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1JlZ2lzdGVyVGltZW91dFVzID0gNTAwMDAwOyAvLyAwLjUgc2VjCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0NsZWFuVXBEdXJhdGlvblVzID0gMTAwMDAwMDsgLy8gVE9ETzogMSBzZWMgdHVuZQorc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtDbGllbnRUaW1lb3V0VXMgPSA1MDAwMDAwOyAvLyBUT0RPOiA1IHNlY3MgdHVuZQorCisvKioKKyAqIFRoZSBob2xkZXIgb2YgdGhlIGNvb2tpZSBvZiByZW1vdGUgSUNsaWVudE1hbmFnZXIuCisgKiBUaGUgY29va2llIGlzIHByb2Nlc3MgbG9jYWxseSB1bmlxdWUgZm9yIGVhY2ggSUNsaWVudE1hbmFnZXIuCisgKiAoVGhlIGNvb2tpZSBpcyB1c2VkIHRvIG5vdGlmeSBkZWF0aCBvZiBjbGllbnRzIHRvIGJ1ZmZlcnBvb2wgcHJvY2Vzcy4pCisgKi8KK2NsYXNzIENsaWVudE1hbmFnZXJDb29raWVIb2xkZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb29raWUgaG9sZGVyIGZvciByZW1vdGUgSUNsaWVudE1hbmFnZXIocykuCisgICAgICovCisgICAgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcigpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIGNvb2tpZSBmb3IgYSByZW1vdGUgSUNsaWVudE1hbmFnZXIuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbWFuYWdlciAgIHRoZSBzcGVjaWZpZWQgcmVtb3RlIElDbGllbnRNYW5hZ2VyLgorICAgICAqIEBwYXJhbSBhZGRlZCAgICAgdHJ1ZSB3aGVuIHRoZSBzcGVjaWZpZWQgcmVtb3RlIElDbGllbnRNYW5hZ2VyIGlzIGFkZGVkCisgICAgICogICAgICAgICAgICAgICAgICBuZXdseSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqCisgICAgICogQHJldHVybiB0aGUgcHJvY2VzcyBsb2NhbGx5IHVuaXF1ZSBjb29raWUgZm9yIHRoZSBzcGVjaWZpZWQgSUNsaWVudE1hbmFnZXIuCisgICAgICovCisgICAgdWludDY0X3QgZ2V0Q29va2llKGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmbWFuYWdlciwgYm9vbCAqYWRkZWQpOworCitwcml2YXRlOgorICAgIHVpbnQ2NF90IG1TZXFJZDsKKyAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8Y29uc3Qgd3A8SUNsaWVudE1hbmFnZXI+LCB1aW50NjRfdD4+IG1NYW5hZ2VyczsKK307CisKK0NsaWVudE1hbmFnZXJDb29raWVIb2xkZXI6OkNsaWVudE1hbmFnZXJDb29raWVIb2xkZXIoKSA6IG1TZXFJZCgwKXt9CisKK3VpbnQ2NF90IENsaWVudE1hbmFnZXJDb29raWVIb2xkZXI6OmdldENvb2tpZSgKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZtYW5hZ2VyLAorICAgICAgICBib29sICphZGRlZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBmb3IgKGF1dG8gaXQgPSBtTWFuYWdlcnMuYmVnaW4oKTsgaXQgIT0gbU1hbmFnZXJzLmVuZCgpOykgeworICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4ga2V5ID0gaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgaWYgKGtleSkgeworICAgICAgICAgICAgaWYgKGludGVyZmFjZXNFcXVhbChrZXksIG1hbmFnZXIpKSB7CisgICAgICAgICAgICAgICAgKmFkZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK2l0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXQgPSBtTWFuYWdlcnMuZXJhc2UoaXQpOworICAgICAgICB9CisgICAgfQorICAgIHVpbnQ2NF90IGlkID0gbVNlcUlkKys7CisgICAgKmFkZGVkID0gdHJ1ZTsKKyAgICBtTWFuYWdlcnMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKG1hbmFnZXIsIGlkKSk7CisgICAgcmV0dXJuIGlkOworfQorCitjbGFzcyBDbGllbnRNYW5hZ2VyOjpJbXBsIHsKK3B1YmxpYzoKKyAgICBJbXBsKCk7CisKKyAgICAvLyBCblJlZ2lzdGVyU2VuZGVyCisgICAgUmVzdWx0U3RhdHVzIHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpOworCisgICAgLy8gQnBSZWdpc3RlclNlbmRlcgorICAgIFJlc3VsdFN0YXR1cyByZWdpc3RlclNlbmRlcihjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgY3JlYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHBvc3RTZW5kKENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKKworICAgIFJlc3VsdFN0YXR1cyBnZXRBY2Nlc3NvcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJQWNjZXNzb3I+ICphY2Nlc3Nvcik7CisKKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlID0gZmFsc2UpOworCitwcml2YXRlOgorICAgIC8vIEluIG9yZGVyIHRvIHByZXZlbnQgZGVhZGxvY2sgYmV0d2VlbiBtdWx0aXBsZSBsb2NrcywKKyAgICAvLyBhbHdheXMgbG9jayBDbGllbnRDYWNoZS5sb2NrIGJlZm9yZSBsb2NraW5nIEFjdGl2ZUNsaWVudHMubG9jay4KKyAgICBzdHJ1Y3QgQ2xpZW50Q2FjaGUgeworICAgICAgICAvLyBUaGlzIGxvY2sgaXMgaGVsZCBmb3IgYnJpZWYgZHVyYXRpb24uCisgICAgICAgIC8vIEJsb2NraW5nIG9wZXJhdGlvbiBpcyBub3QgcGVyZm9ybWVkIHdoaWxlIGhvbGRpbmcgdGhlIGxvY2suCisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjpwYWlyPGNvbnN0IHdwPElBY2Nlc3Nvcj4sIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4+PgorICAgICAgICAgICAgICAgIG1DbGllbnRzOworICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ29ubmVjdEN2OworICAgICAgICBib29sIG1Db25uZWN0aW5nOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2xlYW5VcFVzOworCisgICAgICAgIENsaWVudENhY2hlKCkgOiBtQ29ubmVjdGluZyhmYWxzZSksIG1MYXN0Q2xlYW5VcFVzKGdldFRpbWVzdGFtcE5vdygpKSB7fQorICAgIH0gbUNhY2hlOworCisgICAgLy8gQWN0aXZlIGNsaWVudHMgd2hpY2ggY2FuIGJlIHJldHJpZXZlZCB2aWEgQ29ubmVjdGlvbklkCisgICAgc3RydWN0IEFjdGl2ZUNsaWVudHMgeworICAgICAgICAvLyBUaGlzIGxvY2sgaXMgaGVsZCBmb3IgYnJpZWYgZHVyYXRpb24uCisgICAgICAgIC8vIEJsb2NraW5nIG9wZXJhdGlvbiBpcyBub3QgcGVyZm9ybWVkIGhvbGRpbmcgdGhlIGxvY2suCisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50Pj4KKyAgICAgICAgICAgICAgICBtQ2xpZW50czsKKyAgICB9IG1BY3RpdmU7CisKKyAgICBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyIG1SZW1vdGVDbGllbnRDb29raWVzOworfTsKKworQ2xpZW50TWFuYWdlcjo6SW1wbDo6SW1wbCgpIHt9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWdpc3RlclNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCkgeworICAgIGNsZWFuVXAoKTsKKyAgICBpbnQ2NF90IHRpbWVvdXRVcyA9IGdldFRpbWVzdGFtcE5vdygpICsga1JlZ2lzdGVyVGltZW91dFVzOworICAgIGRvIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTXV0ZXgpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgaXQgIT0gbUNhY2hlLm1DbGllbnRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IHNBY2Nlc3NvciA9IGl0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoc0FjY2Vzc29yICYmIGludGVyZmFjZXNFcXVhbChzQWNjZXNzb3IsIGFjY2Vzc29yKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPSBpdC0+c2Vjb25kLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZS5tQ2xpZW50cy5maW5kKCpwQ29ubmVjdGlvbklkKSAhPSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXIgZXhpc3RpbmcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpBTFJFQURZX0VYSVNUUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNsaWVudHMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbUNhY2hlLm1Db25uZWN0aW5nKSB7CisgICAgICAgICAgICBtQ2FjaGUubUNvbm5lY3RpbmcgPSB0cnVlOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIFJlc3VsdFN0YXR1cyByZXN1bHQgPSBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QnVmZmVyUG9vbENsaWVudD4oYWNjZXNzb3IpOworICAgICAgICAgICAgbG9jay5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIWNsaWVudCkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgfSBlbHNlIGlmICghY2xpZW50LT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGluc2VydCBmYWlsLiAobWFsbG9jIGZhaWwpCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50PiB3Y2xpZW50ID0gY2xpZW50OworICAgICAgICAgICAgICAgIG1DYWNoZS5tQ2xpZW50cy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYWNjZXNzb3IsIHdjbGllbnQpKTsKKyAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgY2xpZW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpwQ29ubmVjdGlvbklkID0gY29uSWQ7CisgICAgICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyIG5ldyBjb25uZWN0aW9uICVsbGQiLCAobG9uZyBsb25nKSpwQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdGluZyA9IGZhbHNlOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdEN2Lm5vdGlmeV9hbGwoKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgbUNhY2hlLm1Db25uZWN0Q3Yud2FpdF9mb3IoCisgICAgICAgICAgICAgICAgbG9jaywgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyhrUmVnaXN0ZXJUaW1lb3V0VXMpKTsKKyAgICB9IHdoaWxlIChnZXRUaW1lc3RhbXBOb3coKSA8IHRpbWVvdXRVcyk7CisgICAgLy8gVE9ETzogcmV0dXJuIHRpbWVvdXQgZXJyb3IKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCkgeworICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgYm9vbCBsb2NhbCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKHNlbmRlcklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBpdC0+c2Vjb25kLT5nZXRBY2Nlc3NvcigmYWNjZXNzb3IpOworICAgICAgICBsb2NhbCA9IGl0LT5zZWNvbmQtPmlzTG9jYWwoKTsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHJzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBpZiAoYWNjZXNzb3IpIHsKKyAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSByZWNlaXZlci0+cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgICAgICAgICAgYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgWyZycywgcmVjZWl2ZXJJZF0oCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcnMgPSBzdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICpyZWNlaXZlcklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWwgJiYgcnMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiByZWNpcGllbnQgPSBBY2Nlc3Nvcjo6Z2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCk7CisgICAgICAgICAgICBpZiAocmVjaXBpZW50KSAgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgZGVhdGggcmVjaXBpZW50IHJlZ2lzdGVyZWQgJWxsZCIsIChsb25nIGxvbmcpKnJlY2VpdmVySWQpOworICAgICAgICAgICAgICAgIGJvb2wgYWRkZWQ7CisgICAgICAgICAgICAgICAgdWludDY0X3QgY29va2llID0gbVJlbW90ZUNsaWVudENvb2tpZXMuZ2V0Q29va2llKHJlY2VpdmVyLCAmYWRkZWQpOworICAgICAgICAgICAgICAgIHJlY2lwaWVudC0+YWRkQ29va2llVG9Db25uZWN0aW9uKGNvb2tpZSwgKnJlY2VpdmVySWQpOworICAgICAgICAgICAgICAgIGlmIChhZGRlZCkgeworICAgICAgICAgICAgICAgICAgICBSZXR1cm48Ym9vbD4gdHJhbnNSZXN1bHQgPSByZWNlaXZlci0+bGlua1RvRGVhdGgocmVjaXBpZW50LCBjb29raWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcnM7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpjcmVhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpIHsKKyAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3IgPSBuZXcgQWNjZXNzb3IoYWxsb2NhdG9yKTsKKyAgICBpZiAoIWFjY2Vzc29yIHx8ICFhY2Nlc3Nvci0+aXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50ID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QnVmZmVyUG9vbENsaWVudD4oYWNjZXNzb3IpOworICAgIGlmICghY2xpZW50IHx8ICFjbGllbnQtPmlzVmFsaWQoKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgLy8gU2luY2UgYSBuZXcgYnVmZmVycG9vbCBpcyBjcmVhdGVkLCBldmljdCBtZW1vcmllcyB3aGljaCBhcmUgdXNlZCBieQorICAgIC8vIGV4aXN0aW5nIGJ1ZmZlcnBvb2xzIGFuZCBjbGllbnRzLgorICAgIGNsZWFuVXAodHJ1ZSk7CisgICAgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgaW5zZXJ0IGZhaWwuIChtYWxsb2MgZmFpbCkKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1NdXRleCk7CisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4gd2NsaWVudCA9IGNsaWVudDsKKyAgICAgICAgbUNhY2hlLm1DbGllbnRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhY2Nlc3Nvciwgd2NsaWVudCkpOworICAgICAgICBDb25uZWN0aW9uSWQgY29uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgY2xpZW50KSk7CisgICAgICAgIH0KKyAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjb25JZDsKKyAgICAgICAgQUxPR1YoImNyZWF0ZSBuZXcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrMShtQ2FjaGUubU11dGV4KTsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jazIobUFjdGl2ZS5tTXV0ZXgpOworICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAoaXQgIT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICBzcDxJQWNjZXNzb3I+IGFjY2Vzc29yOworICAgICAgICBpdC0+c2Vjb25kLT5nZXRBY2Nlc3NvcigmYWNjZXNzb3IpOworICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGZvciAoYXV0byBjaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgY2l0ICE9IG1DYWNoZS5tQ2xpZW50cy5lbmQoKTspIHsKKyAgICAgICAgICAgIC8vIGNsZWFuIHVwIGRlYWQgY2xpZW50IGNhY2hlcworICAgICAgICAgICAgc3A8SUFjY2Vzc29yPiBjQWNjZXNzb3IgPSBjaXQtPmZpcnN0LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmICghY0FjY2Vzc29yIHx8IChhY2Nlc3NvciAmJiBpbnRlcmZhY2VzRXF1YWwoY0FjY2Vzc29yLCBhY2Nlc3NvcikpKSB7CisgICAgICAgICAgICAgICAgY2l0ID0gbUNhY2hlLm1DbGllbnRzLmVyYXNlKGNpdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNpdCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+YWxsb2NhdGUocGFyYW1zLCBoYW5kbGUsIGJ1ZmZlcik7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWNlaXZlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyAgICByZXR1cm4gY2xpZW50LT5yZWNlaXZlKHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCB0aW1lc3RhbXBVcywgaGFuZGxlLCBidWZmZXIpOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6cG9zdFNlbmQoCisgICAgICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QgKnRpbWVzdGFtcFVzKSB7CisgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCA9IGJ1ZmZlci0+bUNvbm5lY3Rpb25JZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgYnVmZmVyLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcyk7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpnZXRBY2Nlc3NvcigKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudC0+Z2V0QWNjZXNzb3IoYWNjZXNzb3IpOworfQorCit2b2lkIENsaWVudE1hbmFnZXI6OkltcGw6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICBpbnQ2NF90IGxhc3RUcmFuc2FjdGlvblVzOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrMShtQ2FjaGUubU11dGV4KTsKKyAgICBpZiAoY2xlYXJDYWNoZSB8fCBtQ2FjaGUubUxhc3RDbGVhblVwVXMgKyBrQ2xlYW5VcER1cmF0aW9uVXMgPCBub3cpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2syKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgaW50IGNsZWFuZWQgPSAwOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmJlZ2luKCk7IGl0ICE9IG1BY3RpdmUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICBpZiAoIWl0LT5zZWNvbmQtPmlzQWN0aXZlKCZsYXN0VHJhbnNhY3Rpb25VcywgY2xlYXJDYWNoZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAobGFzdFRyYW5zYWN0aW9uVXMgKyBrQ2xpZW50VGltZW91dFVzIDwgbm93KSB7CisgICAgICAgICAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQtPmdldEFjY2Vzc29yKCZhY2Nlc3Nvcik7CisgICAgICAgICAgICAgICAgICAgIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgICsrY2xlYW5lZDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGF1dG8gY2l0ID0gbUNhY2hlLm1DbGllbnRzLmJlZ2luKCk7IGNpdCAhPSBtQ2FjaGUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkZWFkIGNsaWVudCBjYWNoZXMKKyAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gY0FjY2Vzc29yID0gY2l0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoIWNBY2Nlc3NvcikgeworICAgICAgICAgICAgICAgIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5lcmFzZShjaXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2NpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiIyBvZiBjbGVhbmVkIGNvbm5lY3Rpb25zOiAlZCIsIGNsZWFuZWQpOworICAgICAgICBtQ2FjaGUubUxhc3RDbGVhblVwVXMgPSBub3c7CisgICAgfQorfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDbGllbnRNYW5hZ2VyIGZvbGxvdy4KK1JldHVybjx2b2lkPiBDbGllbnRNYW5hZ2VyOjpyZWdpc3RlclNlbmRlcihjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUFjY2Vzc29yPiYgYnVmZmVyUG9vbCwgcmVnaXN0ZXJTZW5kZXJfY2IgX2hpZGxfY2IpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCA9IC0xOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUltcGwtPnJlZ2lzdGVyU2VuZGVyKGJ1ZmZlclBvb2wsICZjb25uZWN0aW9uSWQpOworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIGNvbm5lY3Rpb25JZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2IoUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUiwgLTEpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCisvLyBNZXRob2RzIGZvciBsb2NhbCB1c2UuCitzcDxDbGllbnRNYW5hZ2VyPiBDbGllbnRNYW5hZ2VyOjpzSW5zdGFuY2U7CitzdGQ6Om11dGV4IENsaWVudE1hbmFnZXI6OnNJbnN0YW5jZUxvY2s7CisKK3NwPENsaWVudE1hbmFnZXI+IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNJbnN0YW5jZUxvY2spOworICAgIGlmICghc0luc3RhbmNlKSB7CisgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBDbGllbnRNYW5hZ2VyKCk7CisgICAgfQorICAgIHJldHVybiBzSW5zdGFuY2U7Cit9CisKK0NsaWVudE1hbmFnZXI6OkNsaWVudE1hbmFnZXIoKSA6IG1JbXBsKG5ldyBJbXBsKCkpIHt9CisKK0NsaWVudE1hbmFnZXI6On5DbGllbnRNYW5hZ2VyKCkgeworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6Y3JlYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Y3JlYXRlKGFsbG9jYXRvciwgcENvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cmVnaXN0ZXJTZW5kZXIocmVjZWl2ZXIsIHNlbmRlcklkLCByZWNlaXZlcklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Y2xvc2UoY29ubmVjdGlvbklkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShjb25uZWN0aW9uSWQsIHBhcmFtcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OnJlY2VpdmUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cmVjZWl2ZShjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wVXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpwb3N0U2VuZCgKKyAgICAgICAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCogdGltZXN0YW1wVXMpIHsKKyAgICBpZiAobUltcGwgJiYgYnVmZmVyKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgYnVmZmVyLCB0cmFuc2FjdGlvbklkLCB0aW1lc3RhbXBVcyk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIENsaWVudE1hbmFnZXI6OmNsZWFuVXAoKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5jbGVhblVwKHRydWUpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC9Db25uZWN0aW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTg5NzAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5jcHAKQEAgLTAsMCArMSw5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJDb25uZWN0aW9uLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQ29ubmVjdGlvbiBmb2xsb3cuCitSZXR1cm48dm9pZD4gQ29ubmVjdGlvbjo6ZmV0Y2godWludDY0X3QgdHJhbnNhY3Rpb25JZCwgdWludDMyX3QgYnVmZmVySWQsIGZldGNoX2NiIF9oaWRsX2NiKSB7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgaWYgKGJ1ZmZlcklkICE9IFNZTkNfQlVGRkVSSUQpIHsKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1BY2Nlc3Nvci0+ZmV0Y2goCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCAmaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIEJ1ZmZlciBidWZmZXIgPSB7fTsKKyAgICAgICAgICAgICAgICBidWZmZXIuaWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgICAgICBidWZmZXIuYnVmZmVyID0gaGFuZGxlOworICAgICAgICAgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUFjY2Vzc29yLT5jbGVhblVwKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEJ1ZmZlciBidWZmZXIgPSB7fTsKKyAgICBidWZmZXIuaWQgPSAwOworICAgIGJ1ZmZlci5idWZmZXIgPSBudWxscHRyOworCisgICAgX2hpZGxfY2Ioc3RhdHVzLCBidWZmZXIpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK0Nvbm5lY3Rpb246OkNvbm5lY3Rpb24oKSA6IG1Jbml0aWFsaXplZChmYWxzZSksIG1Db25uZWN0aW9uSWQoLTFMTCkge30KKworQ29ubmVjdGlvbjo6fkNvbm5lY3Rpb24oKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgbUFjY2Vzc29yLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICB9Cit9CisKK3ZvaWQgQ29ubmVjdGlvbjo6aW5pdGlhbGl6ZSgKKyAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+JiBhY2Nlc3NvciwgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgICAgIG1BY2Nlc3NvciA9IGFjY2Vzc29yOworICAgICAgICBtQ29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KK30KKworUmVzdWx0U3RhdHVzIENvbm5lY3Rpb246OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLCBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIHJldHVybiBtQWNjZXNzb3ItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIENvbm5lY3Rpb246OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgbUFjY2Vzc29yLT5jbGVhblVwKGNsZWFyQ2FjaGUpOworICAgIH0KK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2UgZm9sbG93LgorCisvL0lDb25uZWN0aW9uKiBISURMX0ZFVENIX0lDb25uZWN0aW9uKGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8pIHsKKy8vICAgIHJldHVybiBuZXcgQ29ubmVjdGlvbigpOworLy99CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0Nvbm5lY3Rpb24uaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0Nvbm5lY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTljYjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvQ29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DT05ORUNUSU9OX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQ09OTkVDVElPTl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMS4wL0lDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSAiQWNjZXNzb3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2FycmF5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpBY2Nlc3NvcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ29ubmVjdGlvbiA6IHB1YmxpYyBJQ29ubmVjdGlvbiB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQ29ubmVjdGlvbiBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IGZldGNoKHVpbnQ2NF90IHRyYW5zYWN0aW9uSWQsIHVpbnQzMl90IGJ1ZmZlcklkLCBmZXRjaF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZXMgYSBidWZmZXIgdXNpbmcgdGhlIHNwZWNpZmllZCBwYXJhbWV0ZXJzLiBSZWN5Y2xlcyBhIGJ1ZmZlciBpZgorICAgICAqIGl0IGlzIHBvc3NpYmxlLiBUaGUgcmV0dXJuZWQgYnVmZmVyIGNhbiBiZSB0cmFuc2ZlcnJlZCB0byBvdGhlciByZW1vdGUKKyAgICAgKiBjbGllbnRzKENvbm5lY3Rpb24pLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtcyAgICBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICBJZCBvZiB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIGlmIGEgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIHBlcmZvcm1zIHBlcmlvZGljIGNhY2hlIGNsZWFuaW5nCisgICAgICogZnJvbSBidWZmZXJwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGNsZWFyQ2FjaGUgICAgaWYgY2xlYXJDYWNoZSBpcyB0cnVlLCBidWZmZXJwb29sIGZyZWVzIGFsbCBidWZmZXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2FpdGluZyB0byBiZSByZWN5Y2xlZC4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKTsKKworICAgIC8qKiBEZXN0cnVjdHMgYSBjb25uZWN0aW9uLiAqLworICAgIH5Db25uZWN0aW9uKCk7CisKKyAgICAvKiogQ3JlYXRlcyBhIGNvbm5lY3Rpb24uICovCisgICAgQ29ubmVjdGlvbigpOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZXMgd2l0aCB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBwb29sIGFuZCB0aGUgY29ubmVjdGlvbiBpZC4KKyAgICAgKiBUaGUgY29ubmVjdGlvbiBpZCBzaG91bGQgYmUgdW5pcXVlIGluIHRoZSB3aG9sZSBzeXN0ZW0uCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWNjZXNzb3IgICAgICB0aGUgc3BlY2lmaWVkIGJ1ZmZlciBwb29sLgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIElkLgorICAgICAqLworICAgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgIFNZTkNfQlVGRkVSSUQgPSBVSU5UMzJfTUFYLAorICAgIH07CisKK3ByaXZhdGU6CisgICAgYm9vbCBtSW5pdGlhbGl6ZWQ7CisgICAgc3A8QWNjZXNzb3I+IG1BY2Nlc3NvcjsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DT05ORUNUSU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL2luY2x1ZGUvYnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL2luY2x1ZGUvYnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTBmMDE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJQT09MVFlQRVNfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJQT09MVFlQRVNfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CisKK3N0cnVjdCBCdWZmZXJQb29sRGF0YSB7CisgICAgLy8gRm9yIGxvY2FsIHVzZSwgdG8gc3BlY2lmeSBhIGJ1ZmZlcnBvb2wgKGNsaWVudCBjb25uZWN0aW9uKSBmb3IgYnVmZmVycy4KKyAgICAvLyBSZXR1cm4gdmFsdWUgZnJvbSBjb25uZWN0I0lBY2Nlc3NvcihhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMS4wKS4KKyAgICBpbnQ2NF90IG1Db25uZWN0aW9uSWQ7CisgICAgLy8gQnVmZmVySWQKKyAgICB1aW50MzJfdCBtSWQ7CisKKyAgICBCdWZmZXJQb29sRGF0YSgpIDogbUNvbm5lY3Rpb25JZCgwKSwgbUlkKDApIHt9CisKKyAgICBCdWZmZXJQb29sRGF0YSgKKyAgICAgICAgICAgIGludDY0X3QgY29ubmVjdGlvbklkLCB1aW50MzJfdCBpZCkKKyAgICAgICAgICAgIDogbUNvbm5lY3Rpb25JZChjb25uZWN0aW9uSWQpLCBtSWQoaWQpIHt9CisKKyAgICB+QnVmZmVyUG9vbERhdGEoKSB7fQorfTsKKworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZTsKKwordHlwZWRlZiB1aW50MzJfdCBCdWZmZXJJZDsKK3R5cGVkZWYgdWludDY0X3QgVHJhbnNhY3Rpb25JZDsKK3R5cGVkZWYgaW50NjRfdCBDb25uZWN0aW9uSWQ7CisKK2VudW0gOiBDb25uZWN0aW9uSWQgeworICAgIElOVkFMSURfQ09OTkVDVElPTklEID0gMCwKK307CisKK3R5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTxCdWZmZXJTdGF0dXNNZXNzYWdlLCBrU3luY2hyb25pemVkUmVhZFdyaXRlPiBCdWZmZXJTdGF0dXNRdWV1ZTsKK3R5cGVkZWYgQnVmZmVyU3RhdHVzUXVldWU6OkRlc2NyaXB0b3IgUXVldWVEZXNjcmlwdG9yOworCisvKioKKyAqIEFsbG9jYXRpb24gd3JhcHBlciBjbGFzcyBmb3IgYnVmZmVyIHBvb2wuCisgKi8KK3N0cnVjdCBCdWZmZXJQb29sQWxsb2NhdGlvbiB7CisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICptSGFuZGxlOworCisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUoKSB7CisgICAgICAgIHJldHVybiBtSGFuZGxlOworICAgIH0KKworICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKSA6IG1IYW5kbGUoaGFuZGxlKSB7fQorCisgICAgfkJ1ZmZlclBvb2xBbGxvY2F0aW9uKCkge307Cit9OworCisvKioKKyAqIEFsbG9jYXRvciB3cmFwcGVyIGNsYXNzIGZvciBidWZmZXIgcG9vbC4KKyAqLworY2xhc3MgQnVmZmVyUG9vbEFsbG9jYXRvciB7CitwdWJsaWM6CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhbiBhbGxvY2F0aW9uKGJ1ZmZlcikgZm9yIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIHBhcmFtcyAgICBhbGxvY2F0aW9uIHBhcmFtZXRlcnMKKyAgICAgKiBAcGFyYW0gYWxsb2MgICAgIGNyZWF0ZWQgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSBhbGxvY1NpemUgc2l6ZSBvZiBjcmVhdGVkIGFsbG9jYXRpb24KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhbiBhbGxvY2F0aW9uIGlzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHZpcnR1YWwgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgICAgICAgICAgc2l6ZV90ICphbGxvY1NpemUpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgb2YgYW4gb2xkIGFsbG9jYXRpb24gYXJlCisgICAgICogY29tcGF0aWJsZSB3aXRoIG5ldyBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGNvbXBhdGlibGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm5ld1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmb2xkUGFyYW1zKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICBCdWZmZXJQb29sQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB+QnVmZmVyUG9vbEFsbG9jYXRvcigpID0gZGVmYXVsdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9CVUZGRVJQT09MVFlQRVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvaW5jbHVkZS9idWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL2luY2x1ZGUvYnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmU1Nzc5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL2luY2x1ZGUvYnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmgKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMV8wX0NMSUVOVE1BTkFHRVJfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjFfMF9DTElFTlRNQU5BR0VSX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8xLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgIkJ1ZmZlclBvb2xUeXBlcy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6SUFjY2Vzc29yOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ2xpZW50TWFuYWdlciA6IHB1YmxpYyBJQ2xpZW50TWFuYWdlciB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQ2xpZW50TWFuYWdlciBmb2xsb3cuCisgICAgUmV0dXJuPHZvaWQ+IHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpJQWNjZXNzb3I+JiBidWZmZXJQb29sLCByZWdpc3RlclNlbmRlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvKiogR2V0cyBhbiBpbnN0YW5jZS4gKi8KKyAgICBzdGF0aWMgc3A8Q2xpZW50TWFuYWdlcj4gZ2V0SW5zdGFuY2UoKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBsb2NhbCBjb25uZWN0aW9uIHdpdGggYSBuZXdseSBjcmVhdGVkIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIGFsbG9jYXRvciAgICAgZm9yIG5ldyBidWZmZXIgYWxsb2NhdGlvbi4KKyAgICAgKiBAcGFyYW0gcENvbm5lY3Rpb25JZCBJZCBvZiB0aGUgY3JlYXRlZCBjb25uZWN0aW9uLiBUaGlzIGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc3lzdGVtLXdpZGUgdW5pcXVlLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHBvb2wgYW5kIGEgbG9jYWwgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkKKyAgICAgKiAgICAgICAgIGNyZWF0ZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNyZWF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCk7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBhIGNyZWF0ZWQgY29ubmVjdGlvbiBhcyBzZW5kZXIgZm9yIHJlbW90ZSBwcm9jZXNzLgorICAgICAqCisgICAgICogQHBhcmFtIHJlY2VpdmVyICAgICAgVGhlIHJlbW90ZSByZWNlaXZpbmcgcHJvY2Vzcy4KKyAgICAgKiBAcGFyYW0gc2VuZGVySWQgICAgICBBIGxvY2FsIGNvbm5lY3Rpb24gd2hpY2ggd2lsbCBzZW5kIGJ1ZmZlcnMgdG8uCisgICAgICogQHBhcmFtIHJlY2VpdmVySWQgICAgSWQgb2YgdGhlIGNyZWF0ZWQgcmVjZWl2aW5nIGNvbm5lY3Rpb24gb24gdGhlIHJlY2VpdmVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24gaXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgb24gdGhlCisgICAgICogICAgICAgICByZWNlaXZlciBwcm9jZXNzLgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNlbmRlciBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBBTFJFQURZX0VYSVNUUyB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBtYWRlLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyByZWdpc3RlclNlbmRlcihjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCk7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgVGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC4KKyAgICAgKiAgICAgICAgIE5PVF9GT1VORCB3aGVuIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIGJ1ZmZlciBmcm9tIHRoZSBzcGVjaWZpZWQgY29ubmVjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIFRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgICAgICBUaGUgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIFRoZSBuYXRpdmUgaGFuZGxlIHRvIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLiBoYW5kbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgY2xvbmVkIGJlZm9yZSB1c2UuCisgICAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgVGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgd2FzIGFsbG9jYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgLyoqCisgICAgICogUmVjZWl2ZXMgYSBidWZmZXIgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIFRoZSBpZCBvZiB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIHRyYW5zYWN0aW9uSWQgVGhlIGlkIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgVGhlIGlkIGZvciB0aGUgYnVmZmVyLgorICAgICAqIEBwYXJhbSB0aW1lc3RhbXBVcyAgIFRoZSB0aW1lc3RhbXAgb2YgdGhlIGJ1ZmZlciBpcyBiZWluZyBzZW50LgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIFRoZSBuYXRpdmUgaGFuZGxlIHRvIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLiBoYW5kbGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzaG91bGQgYmUgY2xvbmVkIGJlZm9yZSB1c2UuCisgICAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgVGhlIHJlY2VpdmVkIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgd2hlbiBhIGJ1ZmZlciB3YXMgcmVjZWl2ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBQb3N0cyBhIGJ1ZmZlciB0cmFuc2ZlciB0cmFuc2FjdGlvbiB0byB0aGUgYnVmZmVyIHBvb2wuIFNlbmRzIGEgYnVmZmVyCisgICAgICogdG8gb3RoZXIgcmVtb3RlIGNsaWVudHMoY29ubmVjdGlvbikgYWZ0ZXIgdGhpcyBjYWxsIGhhcyBiZWVuIHN1Y2NlZWRlZC4KKyAgICAgKgorICAgICAqIEBwYXJhbSByZWNlaXZlcklkICAgIFRoZSBpZCBvZiB0aGUgcmVjZWl2aW5nIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlciAgICAgICAgdG8gdHJhbnNmZXIKKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBJZCBvZiB0aGUgdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIHRpbWVzdGFtcFVzICAgVGhlIHRpbWVzdGFtcCBvZiB0aGUgYnVmZmVyIHRyYW5zYWN0aW9uIGlzIGJlaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcG9zdGVkLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHRyYW5zYWN0aW9uIHdhcyBwb3N0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNlbmRpbmcgY29ubmVjdGlvbiB3YXMgbm90IGZvdW5kLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBwb3N0U2VuZChDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICAvKioKKyAgICAgKiAgVGltZSBvdXQgaW5hY3RpdmUgbGluZ2VyaW5nIGNvbm5lY3Rpb25zIGFuZCBjbG9zZS4KKyAgICAgKi8KKyAgICB2b2lkIGNsZWFuVXAoKTsKKworICAgIC8qKiBEZXN0cnVjdHMgdGhlIG1hbmFnZXIgb2YgYnVmZmVyIHBvb2wgY2xpZW50cy4gICovCisgICAgfkNsaWVudE1hbmFnZXIoKTsKK3ByaXZhdGU6CisgICAgc3RhdGljIHNwPENsaWVudE1hbmFnZXI+IHNJbnN0YW5jZTsKKyAgICBzdGF0aWMgc3RkOjptdXRleCBzSW5zdGFuY2VMb2NrOworCisgICAgY2xhc3MgSW1wbDsKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gbUltcGw7CisKKyAgICBDbGllbnRNYW5hZ2VyKCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YxXzBfQ0xJRU5UTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvQW5kcm9pZC5icCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNWE3NTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDUxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c1ZuZGtIaWRsQnVmZmVycG9vbFYxXzBUYXJnZXRTaW5nbGVUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhbGxvY2F0b3IuY3BwIiwKKyAgICAgICAgInNpbmdsZS5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAxLjAiLAorICAgICAgICAibGliaW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMS4wIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzVm5ka0hpZGxCdWZmZXJwb29sVjFfMFRhcmdldE11bHRpVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzSGFsVGFyZ2V0VGVzdERlZmF1bHRzIl0sCisgICAgc3JjczogWworICAgICAgICAiYWxsb2NhdG9yLmNwcCIsCisgICAgICAgICJtdWx0aS5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAxLjAiLAorICAgICAgICAibGliaW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMS4wIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJmbXEiLAorICAgIF0sCisgICAgY29tcGlsZV9tdWx0aWxpYjogImJvdGgiLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL09XTkVSUyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczM2UwYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9PV05FUlMKQEAgLTAsMCArMSw5IEBACisjIE1lZGlhIHRlYW0KK2xham9zQGdvb2dsZS5jb20KK3Bhd2luQGdvb2dsZS5jb20KK3Rha2xlZUBnb29nbGUuY29tCit3b25zaWtAZ29vZ2xlLmNvbQorCisjIFZUUyB0ZWFtCit5aW1AZ29vZ2xlLmNvbQoremh1b3lhb0Bnb29nbGUuY29tCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvYWxsb2NhdG9yLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0M2Y3ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvYWxsb2NhdG9yLmNwcApAQCAtMCwwICsxLDIwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjdXRpbHMvYXNobWVtLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlICJhbGxvY2F0b3IuaCIKKwordW5pb24gUGFyYW1zIHsKKyAgc3RydWN0IHsKKyAgICB1aW50MzJfdCBjYXBhY2l0eTsKKyAgfSBkYXRhOworICB1aW50OF90IGFycmF5WzBdOworICBQYXJhbXMoKSA6IGRhdGF7MH0ge30KKyAgUGFyYW1zKHVpbnQzMl90IHNpemUpCisgICAgICA6IGRhdGF7c2l6ZX0ge30KK307CisKKworbmFtZXNwYWNlIHsKKworc3RydWN0IEhhbmRsZUFzaG1lbSA6IHB1YmxpYyBuYXRpdmVfaGFuZGxlX3QgeworICBIYW5kbGVBc2htZW0oaW50IGFzaG1lbUZkLCBzaXplX3Qgc2l6ZSkKKyAgICA6IG5hdGl2ZV9oYW5kbGVfdChjSGVhZGVyKSwKKyAgICBtRmRzeyBhc2htZW1GZCB9LAorICAgIG1JbnRzeyBpbnQgKHNpemUgJiAweEZGRkZGRkZGKSwgaW50KCh1aW50NjRfdChzaXplKSA+PiAzMikgJiAweEZGRkZGRkZGKSwga01hZ2ljIH0ge30KKworICBpbnQgYXNobWVtRmQoKSBjb25zdCB7IHJldHVybiBtRmRzLm1Bc2htZW07IH0KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIHNpemVfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUxvKSkKKyAgICAgICAgfCBzaXplX3QodWludDY0X3QodW5zaWduZWQobUludHMubVNpemVIaSkpIDw8IDMyKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgbmF0aXZlX2hhbmRsZV90ICogY29uc3Qgbyk7CisKK3Byb3RlY3RlZDoKKyAgc3RydWN0IHsKKyAgICBpbnQgbUFzaG1lbTsKKyAgfSBtRmRzOworICBzdHJ1Y3QgeworICAgIGludCBtU2l6ZUxvOworICAgIGludCBtU2l6ZUhpOworICAgIGludCBtTWFnaWM7CisgIH0gbUludHM7CisKK3ByaXZhdGU6CisgIGVudW0geworICAgIGtNYWdpYyA9ICdhaG1ceDAwJywKKyAgICBudW1GZHMgPSBzaXplb2YobUZkcykgLyBzaXplb2YoaW50KSwKKyAgICBudW1JbnRzID0gc2l6ZW9mKG1JbnRzKSAvIHNpemVvZihpbnQpLAorICAgIHZlcnNpb24gPSBzaXplb2YobmF0aXZlX2hhbmRsZV90KQorICB9OworICBjb25zdCBzdGF0aWMgbmF0aXZlX2hhbmRsZV90IGNIZWFkZXI7Cit9OworCitjb25zdCBuYXRpdmVfaGFuZGxlX3QgSGFuZGxlQXNobWVtOjpjSGVhZGVyID0geworICBIYW5kbGVBc2htZW06OnZlcnNpb24sCisgIEhhbmRsZUFzaG1lbTo6bnVtRmRzLAorICBIYW5kbGVBc2htZW06Om51bUludHMsCisgIHt9Cit9OworCitib29sIEhhbmRsZUFzaG1lbTo6aXNWYWxpZChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKiBjb25zdCBvKSB7CisgIGlmICghbyB8fCBtZW1jbXAobywgJmNIZWFkZXIsIHNpemVvZihjSGVhZGVyKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSGFuZGxlQXNobWVtICpvdGhlciA9IHN0YXRpY19jYXN0PGNvbnN0IEhhbmRsZUFzaG1lbSo+KG8pOworICByZXR1cm4gb3RoZXItPm1JbnRzLm1NYWdpYyA9PSBrTWFnaWM7Cit9CisKK2NsYXNzIEFsbG9jYXRpb25Bc2htZW0geworcHJpdmF0ZToKKyAgQWxsb2NhdGlvbkFzaG1lbShpbnQgYXNobWVtRmQsIHNpemVfdCBjYXBhY2l0eSwgYm9vbCByZXMpCisgICAgOiBtSGFuZGxlKGFzaG1lbUZkLCBjYXBhY2l0eSksCisgICAgICBtSW5pdChyZXMpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIEFsbG9jYXRpb25Bc2htZW0gKkFsbG9jKHNpemVfdCBzaXplKSB7CisgICAgY29uc3RleHByIHN0YXRpYyBjb25zdCBjaGFyICprQWxsb2NhdGlvblRhZyA9ICJidWZmZXJwb29sX3Rlc3QiOworICAgIGludCBhc2htZW1GZCA9IGFzaG1lbV9jcmVhdGVfcmVnaW9uKGtBbGxvY2F0aW9uVGFnLCBzaXplKTsKKyAgICByZXR1cm4gbmV3IEFsbG9jYXRpb25Bc2htZW0oYXNobWVtRmQsIHNpemUsIGFzaG1lbUZkID49IDApOworICB9CisKKyAgfkFsbG9jYXRpb25Bc2htZW0oKSB7CisgICAgaWYgKG1Jbml0KSB7CisgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKCZtSGFuZGxlKTsKKyAgICB9CisgIH0KKworICBjb25zdCBIYW5kbGVBc2htZW0gKmhhbmRsZSgpIHsKKyAgICByZXR1cm4gJm1IYW5kbGU7CisgIH0KKworcHJpdmF0ZToKKyAgSGFuZGxlQXNobWVtIG1IYW5kbGU7CisgIGJvb2wgbUluaXQ7CisgIC8vIFRPRE86IG1hcHBpbmcgYW5kIG1hcCBmZAorfTsKKworc3RydWN0IEFsbG9jYXRpb25EdG9yIHsKKyAgQWxsb2NhdGlvbkR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+ICZhbGxvYykKKyAgICAgIDogbUFsbG9jKGFsbG9jKSB7fQorCisgIHZvaWQgb3BlcmF0b3IoKShCdWZmZXJQb29sQWxsb2NhdGlvbiAqcG9vbEFsbG9jKSB7IGRlbGV0ZSBwb29sQWxsb2M7IH0KKworICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4gbUFsbG9jOworfTsKKworfQorCisKK1Jlc3VsdFN0YXR1cyBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6YWxsb2NhdGUoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICBzaXplX3QgKmFsbG9jU2l6ZSkgeworICBQYXJhbXMgYXNobWVtUGFyYW1zOworICBtZW1jcHkoJmFzaG1lbVBhcmFtcywgcGFyYW1zLmRhdGEoKSwgc3RkOjptaW4oc2l6ZW9mKFBhcmFtcyksIHBhcmFtcy5zaXplKCkpKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4gYXNobWVtQWxsb2MgPQorICAgICAgc3RkOjpzaGFyZWRfcHRyPEFsbG9jYXRpb25Bc2htZW0+KAorICAgICAgICAgIEFsbG9jYXRpb25Bc2htZW06OkFsbG9jKGFzaG1lbVBhcmFtcy5kYXRhLmNhcGFjaXR5KSk7CisgIGlmIChhc2htZW1BbGxvYykgeworICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwdHIgPSBuZXcgQnVmZmVyUG9vbEFsbG9jYXRpb24oYXNobWVtQWxsb2MtPmhhbmRsZSgpKTsKKyAgICBpZiAocHRyKSB7CisgICAgICAqYWxsb2MgPSBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+KHB0ciwgQWxsb2NhdGlvbkR0b3IoYXNobWVtQWxsb2MpKTsKKyAgICAgIGlmICgqYWxsb2MpIHsKKyAgICAgICAgICAqYWxsb2NTaXplID0gYXNobWVtUGFyYW1zLmRhdGEuY2FwYWNpdHk7CisgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgICB9CisgICAgICBkZWxldGUgcHRyOworICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgIH0KKyAgfQorICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworYm9vbCBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6Y29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpIHsKKyAgc2l6ZV90IG5ld1NpemUgPSBuZXdQYXJhbXMuc2l6ZSgpOworICBzaXplX3Qgb2xkU2l6ZSA9IG9sZFBhcmFtcy5zaXplKCk7CisgIGlmIChuZXdTaXplID09IG9sZFNpemUpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5ld1NpemU7ICsraSkgeworICAgICAgaWYgKG5ld1BhcmFtc1tpXSAhPSBvbGRQYXJhbXNbaV0pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKSB7CisgIGlmICghSGFuZGxlQXNobWVtOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSGFuZGxlQXNobWVtICpvID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlQXNobWVtKj4oaGFuZGxlKTsKKyAgdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKiltbWFwKAorICAgICAgTlVMTCwgby0+c2l6ZSgpLCBQUk9UX1JFQUR8UFJPVF9XUklURSwgTUFQX1NIQVJFRCwgby0+YXNobWVtRmQoKSwgMCk7CisKKyAgaWYgKHB0ciAhPSBNQVBfRkFJTEVEKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvLT5zaXplKCk7ICsraSkgeworICAgICAgcHRyW2ldID0gdmFsOworICAgIH0KKyAgICBtdW5tYXAocHRyLCBvLT5zaXplKCkpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VmVyaWZ5KGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCkgeworICBpZiAoIUhhbmRsZUFzaG1lbTo6aXNWYWxpZChoYW5kbGUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqbyA9IHN0YXRpY19jYXN0PGNvbnN0IEhhbmRsZUFzaG1lbSo+KGhhbmRsZSk7CisgIHVuc2lnbmVkIGNoYXIgKnB0ciA9ICh1bnNpZ25lZCBjaGFyICopbW1hcCgKKyAgICAgIE5VTEwsIG8tPnNpemUoKSwgUFJPVF9SRUFELCBNQVBfU0hBUkVELCBvLT5hc2htZW1GZCgpLCAwKTsKKworICBpZiAocHRyICE9IE1BUF9GQUlMRUQpIHsKKyAgICBib29sIHJlcyA9IHRydWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvLT5zaXplKCk7ICsraSkgeworICAgICAgaWYgKHB0cltpXSAhPSB2YWwpIHsKKyAgICAgICAgcmVzID0gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBtdW5tYXAocHRyLCBvLT5zaXplKCkpOworICAgIHJldHVybiByZXM7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcykgeworICBjb25zdGV4cHIgc3RhdGljIGludCBrQWxsb2NhdGlvblNpemUgPSAxMDI0ICogMTA7CisgIFBhcmFtcyBhc2htZW1QYXJhbXMoa0FsbG9jYXRpb25TaXplKTsKKworICBwYXJhbXMtPmFzc2lnbihhc2htZW1QYXJhbXMuYXJyYXksIGFzaG1lbVBhcmFtcy5hcnJheSArIHNpemVvZihhc2htZW1QYXJhbXMpKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9hbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODZlNWYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8xLjAvdnRzL2FsbG9jYXRvci5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFZOREtfSElETF9CVUZGRVJQT09MX1YxXzBfQUxMT0NBVE9SX0gKKyNkZWZpbmUgVk5ES19ISURMX0JVRkZFUlBPT0xfVjFfMF9BTExPQ0FUT1JfSAorCisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICBCdWZmZXJQb29sQWxsb2NhdGlvbjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OgorICAgIEJ1ZmZlclBvb2xBbGxvY2F0b3I7CisKKy8vIGJ1ZmZlciBhbGxvY2F0b3IgZm9yIHRoZSB0ZXN0cworY2xhc3MgVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3IgOiBwdWJsaWMgQnVmZmVyUG9vbEFsbG9jYXRvciB7CisgcHVibGljOgorICBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcigpIHt9CisKKyAgflRlc3RCdWZmZXJQb29sQWxsb2NhdG9yKCkgb3ZlcnJpZGUge30KKworICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICphbGxvY1NpemUpIG92ZXJyaWRlOworCisgIGJvb2wgY29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgRmlsbChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpOworCisgIHN0YXRpYyBib29sIFZlcmlmeShjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpOworCit9OworCisvLyByZXRyaWV2ZSBidWZmZXIgYWxsb2NhdG9yIHBhcmFtdGVycwordm9pZCBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpwYXJhbXMpOworCisjZW5kaWYgIC8vIFZOREtfSElETF9CVUZGRVJQT09MX1YxXzBfQUxMT0NBVE9SX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9tdWx0aS5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvbXVsdGkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OTY4MTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvbXVsdGkuY3BwCkBAIC0wLDAgKzEsMjIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJidWZmZmVycG9vbF91bml0X3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0xlZ2FjeVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy93YWl0Lmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlICJhbGxvY2F0b3IuaCIKKwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2w7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OklDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpCdWZmZXJJZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpDb25uZWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OmltcGxlbWVudGF0aW9uOjpUcmFuc2FjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YTsKKworbmFtZXNwYWNlIHsKKworLy8gY29tbXVuaWNhdGlvbiBtZXNzYWdlIHR5cGVzIGJldHdlZW4gcHJvY2Vzc2VzLgorZW51bSBQaXBlQ29tbWFuZCA6IGludDMyX3QgeworICAgIElOSVRfT0sgPSAwLAorICAgIElOSVRfRVJST1IsCisgICAgU0VORCwKKyAgICBSRUNFSVZFX09LLAorICAgIFJFQ0VJVkVfRVJST1IsCit9OworCisvLyBjb21tdW5pY2F0aW9uIG1lc3NhZ2UgYmV0d2VlbiBwcm9jZXNzZXMuCit1bmlvbiBQaXBlTWVzc2FnZSB7CisgICAgc3RydWN0ICB7CisgICAgICAgIGludDMyX3QgY29tbWFuZDsKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQ7CisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQ7CisgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgICAgICAgaW50NjRfdCAgdGltZXN0YW1wVXM7CisgICAgfSBkYXRhOworICAgIGNoYXIgYXJyYXlbMF07Cit9OworCisvLyBtZWRpYS5idWZmZXJwb29sIHRlc3Qgc2V0dXAKK2NsYXNzIEJ1ZmZlcnBvb2xNdWx0aVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICAgIG1SZWNlaXZlclBpZCA9IC0xOworICAgIG1Db25uZWN0aW9uVmFsaWQgPSBmYWxzZTsKKworICAgIEFTU0VSVF9UUlVFKHBpcGUobUNvbW1hbmRQaXBlRmRzKSA9PSAwKTsKKyAgICBBU1NFUlRfVFJVRShwaXBlKG1SZXN1bHRQaXBlRmRzKSA9PSAwKTsKKworICAgIG1SZWNlaXZlclBpZCA9IGZvcmsoKTsKKyAgICBBU1NFUlRfVFJVRShtUmVjZWl2ZXJQaWQgPj0gMCk7CisKKyAgICBpZiAobVJlY2VpdmVyUGlkID09IDApIHsKKyAgICAgIGRvUmVjZWl2ZXIoKTsKKyAgICAgIC8vIEluIG9yZGVyIHRvIGlnbm9yZSBndGVzdCBiZWhhdmlvdXIsIHdhaXQgZm9yIGJlaW5nIGtpbGxlZCBmcm9tCisgICAgICAvLyB0ZWFyRG93bgorICAgICAgcGF1c2UoKTsKKyAgICB9CisKKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKG1NYW5hZ2VyLCBudWxscHRyKTsKKworICAgIG1BbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yPigpOworICAgIEFTU0VSVF9UUlVFKChib29sKW1BbGxvY2F0b3IpOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPmNyZWF0ZShtQWxsb2NhdG9yLCAmbUNvbm5lY3Rpb25JZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICAgIG1Db25uZWN0aW9uVmFsaWQgPSB0cnVlOworICB9CisKKyAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGUgeworICAgIGlmIChtUmVjZWl2ZXJQaWQgPiAwKSB7CisgICAgICBraWxsKG1SZWNlaXZlclBpZCwgU0lHS0lMTCk7CisgICAgICBpbnQgd3N0YXR1czsKKyAgICAgIHdhaXQoJndzdGF0dXMpOworICAgIH0KKworICAgIGlmIChtQ29ubmVjdGlvblZhbGlkKSB7CisgICAgICBtTWFuYWdlci0+Y2xvc2UobUNvbm5lY3Rpb25JZCk7CisgICAgfQorICB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgfQorCisgIGFuZHJvaWQ6OnNwPENsaWVudE1hbmFnZXI+IG1NYW5hZ2VyOworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgYm9vbCBtQ29ubmVjdGlvblZhbGlkOworICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgcGlkX3QgbVJlY2VpdmVyUGlkOworICBpbnQgbUNvbW1hbmRQaXBlRmRzWzJdOworICBpbnQgbVJlc3VsdFBpcGVGZHNbMl07CisKKyAgYm9vbCBzZW5kTWVzc2FnZShpbnQgKnBpcGVzLCBjb25zdCBQaXBlTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGludCByZXQgPSB3cml0ZShwaXBlc1sxXSwgbWVzc2FnZS5hcnJheSwgc2l6ZW9mKFBpcGVNZXNzYWdlKSk7CisgICAgcmV0dXJuIHJldCA9PSBzaXplb2YoUGlwZU1lc3NhZ2UpOworICB9CisKKyAgYm9vbCByZWNlaXZlTWVzc2FnZShpbnQgKnBpcGVzLCBQaXBlTWVzc2FnZSAqbWVzc2FnZSkgeworICAgIGludCByZXQgPSByZWFkKHBpcGVzWzBdLCBtZXNzYWdlLT5hcnJheSwgc2l6ZW9mKFBpcGVNZXNzYWdlKSk7CisgICAgcmV0dXJuIHJldCA9PSBzaXplb2YoUGlwZU1lc3NhZ2UpOworICB9CisKKyAgdm9pZCBkb1JlY2VpdmVyKCkgeworICAgIGNvbmZpZ3VyZVJwY1RocmVhZHBvb2woMSwgZmFsc2UpOworICAgIFBpcGVNZXNzYWdlIG1lc3NhZ2U7CisgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIGlmICghbU1hbmFnZXIpIHsKKyAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfRVJST1I7CisgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGFuZHJvaWQ6OnN0YXR1c190IHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlckFzU2VydmljZSgpOworICAgIGlmIChzdGF0dXMgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfRVJST1I7CisgICAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OklOSVRfT0s7CisgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworCisgICAgcmVjZWl2ZU1lc3NhZ2UobUNvbW1hbmRQaXBlRmRzLCAmbWVzc2FnZSk7CisgICAgeworICAgICAgbmF0aXZlX2hhbmRsZV90ICpyaGFuZGxlID0gbnVsbHB0cjsKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gcmJ1ZmZlcjsKKyAgICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBtTWFuYWdlci0+cmVjZWl2ZSgKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkLCBtZXNzYWdlLmRhdGEudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuYnVmZmVySWQsIG1lc3NhZ2UuZGF0YS50aW1lc3RhbXBVcywgJnJoYW5kbGUsICZyYnVmZmVyKTsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtZXNzYWdlLmRhdGEuY29ubmVjdGlvbklkKTsKKyAgICAgIGlmIChzdGF0dXMgIT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBpZiAoIVRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkocmhhbmRsZSwgMHg3NykpIHsKKyAgICAgICAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpSRUNFSVZFX0VSUk9SOworICAgICAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6UkVDRUlWRV9PSzsKKyAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisgIH0KK307CisKKy8vIEJ1ZmZlciB0cmFuc2ZlciB0ZXN0IGJldHdlZW4gcHJvY2Vzc2VzLgorVEVTVF9GKEJ1ZmZlcnBvb2xNdWx0aVRlc3QsIFRyYW5zZmVyQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIFBpcGVNZXNzYWdlIG1lc3NhZ2U7CisKKyAgQVNTRVJUX1RSVUUocmVjZWl2ZU1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsICZtZXNzYWdlKSk7CisKKyAgYW5kcm9pZDo6c3A8SUNsaWVudE1hbmFnZXI+IHJlY2VpdmVyID0gSUNsaWVudE1hbmFnZXI6OmdldFNlcnZpY2UoKTsKKyAgQ29ubmVjdGlvbklkIHJlY2VpdmVySWQ7CisgIEFTU0VSVF9UUlVFKChib29sKXJlY2VpdmVyKTsKKworICBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIocmVjZWl2ZXIsIG1Db25uZWN0aW9uSWQsICZyZWNlaXZlcklkKTsKKyAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICB7CisgICAgbmF0aXZlX2hhbmRsZV90ICpzaGFuZGxlID0gbnVsbHB0cjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHNidWZmZXI7CisgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICAgIGludDY0X3QgcG9zdFVzOworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKworICAgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJnNoYW5kbGUsICZzYnVmZmVyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisKKyAgICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChzaGFuZGxlLCAweDc3KSk7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+cG9zdFNlbmQocmVjZWl2ZXJJZCwgc2J1ZmZlciwgJnRyYW5zYWN0aW9uSWQsICZwb3N0VXMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKworICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlNFTkQ7CisgICAgbWVzc2FnZS5kYXRhLmJ1ZmZlcklkID0gc2J1ZmZlci0+bUlkOworICAgIG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQgPSByZWNlaXZlcklkOworICAgIG1lc3NhZ2UuZGF0YS50cmFuc2FjdGlvbklkID0gdHJhbnNhY3Rpb25JZDsKKyAgICBtZXNzYWdlLmRhdGEudGltZXN0YW1wVXMgPSBwb3N0VXM7CisgICAgc2VuZE1lc3NhZ2UobUNvbW1hbmRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgfQorICBFWFBFQ1RfVFJVRShyZWNlaXZlTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgJm1lc3NhZ2UpKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgc2V0ZW52KCJUUkVCTEVfVEVTVElOR19PVkVSUklERSIsICJ0cnVlIiwgdHJ1ZSk7CisgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICBMT0coSU5GTykgPDwgIlRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvc2luZ2xlLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMS4wL3Z0cy9zaW5nbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3M2ViNjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzEuMC92dHMvc2luZ2xlLmNwcApAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiYnVmZmZlcnBvb2xfdW5pdF90ZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NTdGF0ZS5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9MZWdhY3lTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYxXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkJ1ZmZlcklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMV8wOjppbXBsZW1lbnRhdGlvbjo6Q2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OkNvbm5lY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjFfMDo6aW1wbGVtZW50YXRpb246OlRyYW5zYWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOworCituYW1lc3BhY2UgeworCisvLyBOdW1iZXIgb2YgaXRlcmF0aW9uIGZvciBidWZmZXIgYWxsb2NhdGlvbiB0ZXN0LgorY29uc3RleHByIHN0YXRpYyBpbnQga051bUFsbG9jYXRpb25UZXN0ID0gMzsKKworLy8gTnVtYmVyIG9mIGl0ZXJhdGlvbiBmb3IgYnVmZmVyIHJlY3ljbGluZyB0ZXN0LgorY29uc3RleHByIHN0YXRpYyBpbnQga051bVJlY3ljbGVUZXN0ID0gMzsKKworLy8gbWVkaWEuYnVmZmVycG9vbCB0ZXN0IHNldHVwCitjbGFzcyBCdWZmZXJwb29sU2luZ2xlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IGZhbHNlOworCisgICAgbU1hbmFnZXIgPSBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworICAgIEFTU0VSVF9ORShtTWFuYWdlciwgbnVsbHB0cik7CisKKyAgICBtQWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcj4oKTsKKyAgICBBU1NFUlRfVFJVRSgoYm9vbCltQWxsb2NhdG9yKTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5jcmVhdGUobUFsbG9jYXRvciwgJm1Db25uZWN0aW9uSWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKworICAgIG1Db25uZWN0aW9uVmFsaWQgPSB0cnVlOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyU2VuZGVyKG1NYW5hZ2VyLCBtQ29ubmVjdGlvbklkLCAmbVJlY2VpdmVySWQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTICYmCisgICAgICAgICAgICAgICAgbVJlY2VpdmVySWQgPT0gbUNvbm5lY3Rpb25JZCk7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgaWYgKG1Db25uZWN0aW9uVmFsaWQpIHsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICB9CisgIH0KKworIHByb3RlY3RlZDoKKyAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICB9CisKKyAgYW5kcm9pZDo6c3A8Q2xpZW50TWFuYWdlcj4gbU1hbmFnZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICBib29sIG1Db25uZWN0aW9uVmFsaWQ7CisgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICBDb25uZWN0aW9uSWQgbVJlY2VpdmVySWQ7CisKK307CisKKy8vIEJ1ZmZlciBhbGxvY2F0aW9uIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGVhY2ggYnVmZmVyIGFsbG9jYXRpb24gaXMgZG9uZSBzdWNjZXNzZnVsbHkgd2l0aAorLy8gdW5pcXVlIGJ1ZmZlciBpZC4KK1RFU1RfRihCdWZmZXJwb29sU2luZ2xlVGVzdCwgQWxsb2NhdGVCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnVmZmVyW2tOdW1BbGxvY2F0aW9uVGVzdF07CisgIG5hdGl2ZV9oYW5kbGVfdCAqYWxsb2NIYW5kbGUgPSBudWxscHRyOworICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1BbGxvY2F0aW9uVGVzdDsgKytpKSB7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmYnVmZmVyW2ldKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtQWxsb2NhdGlvblRlc3Q7ICsraSkgeworICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IGtOdW1BbGxvY2F0aW9uVGVzdDsgKytqKSB7CisgICAgICBBU1NFUlRfVFJVRShidWZmZXJbaV0tPm1JZCAhPSBidWZmZXJbal0tPm1JZCk7CisgICAgfQorICB9CisgIEVYUEVDVF9UUlVFKGtOdW1BbGxvY2F0aW9uVGVzdCA+IDEpOworfQorCisvLyBCdWZmZXIgcmVjeWNsZSB0ZXN0LgorLy8gQ2hlY2sgd2hldGhlciBkZS1hbGxvY2F0ZWQgYnVmZmVycyBhcmUgcmVjeWNsZWQuCitURVNUX0YoQnVmZmVycG9vbFNpbmdsZVRlc3QsIFJlY3ljbGVCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworCisgIEJ1ZmZlcklkIGJpZFtrTnVtUmVjeWNsZVRlc3RdOworICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1SZWN5Y2xlVGVzdDsgKytpKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXI7CisgICAgbmF0aXZlX2hhbmRsZV90ICphbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgICAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmYnVmZmVyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgICAgYmlkW2ldID0gYnVmZmVyLT5tSWQ7CisgIH0KKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBrTnVtUmVjeWNsZVRlc3Q7ICsraSkgeworICAgIEFTU0VSVF9UUlVFKGJpZFtpIC0gMV0gPT0gYmlkW2ldKTsKKyAgfQorICBFWFBFQ1RfVFJVRShrTnVtUmVjeWNsZVRlc3QgPiAxKTsKK30KKworLy8gQnVmZmVyIHRyYW5zZmVyIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGJ1ZmZlciBpcyB0cmFuc2ZlcnJlZCB0byBhbm90aGVyIGNsaWVudCBzdWNjZXNzZnVsbHkuCitURVNUX0YoQnVmZmVycG9vbFNpbmdsZVRlc3QsIFRyYW5zZmVyQnVmZmVyKSB7CisgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlY1BhcmFtczsKKyAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBzYnVmZmVyLCByYnVmZmVyOworICBuYXRpdmVfaGFuZGxlX3QgKmFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgbmF0aXZlX2hhbmRsZV90ICpyZWN2SGFuZGxlID0gbnVsbHB0cjsKKworICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgIGludDY0X3QgcG9zdFVzOworCisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCB2ZWNQYXJhbXMsICZhbGxvY0hhbmRsZSwgJnNidWZmZXIpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKGFsbG9jSGFuZGxlLCAweDc3KSk7CisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5wb3N0U2VuZChtUmVjZWl2ZXJJZCwgc2J1ZmZlciwgJnRyYW5zYWN0aW9uSWQsICZwb3N0VXMpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWNlaXZlKG1SZWNlaXZlcklkLCB0cmFuc2FjdGlvbklkLCBzYnVmZmVyLT5tSWQsIHBvc3RVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlY3ZIYW5kbGUsICZyYnVmZmVyKTsKKyAgRVhQRUNUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworICBBU1NFUlRfVFJVRShUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6VmVyaWZ5KHJlY3ZIYW5kbGUsIDB4NzcpKTsKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgIExPRyhJTkZPKSA8PCAiVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29yLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41N2I0NjA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuY3BwCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUG9vbENvbm5lY3Rpb24iCisKKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorI2luY2x1ZGUgIkFjY2Vzc29ySW1wbC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6YWRkKAorICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCwKKyAgICAgICAgY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvcikgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUFjY2Vzc29ycy5maW5kKGNvbm5lY3Rpb25JZCkgPT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICBtQWNjZXNzb3JzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25uZWN0aW9uSWQsIGFjY2Vzc29yKSk7CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6cmVtb3ZlKGludDY0X3QgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1BY2Nlc3NvcnMuZXJhc2UoY29ubmVjdGlvbklkKTsKKyAgICBhdXRvIGl0ID0gbUNvbm5lY3Rpb25Ub0Nvb2tpZS5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGl0ICE9IG1Db25uZWN0aW9uVG9Db29raWUuZW5kKCkpIHsKKyAgICAgICAgdWludDY0X3QgY29va2llID0gaXQtPnNlY29uZDsKKyAgICAgICAgbUNvbm5lY3Rpb25Ub0Nvb2tpZS5lcmFzZShpdCk7CisgICAgICAgIGF1dG8gY2l0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgICAgICBpZiAoY2l0ICE9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmVuZCgpKSB7CisgICAgICAgICAgICBjaXQtPnNlY29uZC5lcmFzZShjb25uZWN0aW9uSWQpOworICAgICAgICAgICAgaWYgKGNpdC0+c2Vjb25kLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbUNvb2tpZVRvQ29ubmVjdGlvbnMuZXJhc2UoY2l0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ6OmFkZENvb2tpZVRvQ29ubmVjdGlvbigKKyAgICAgICAgdWludDY0X3QgY29va2llLAorICAgICAgICBpbnQ2NF90IGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBpZiAobUFjY2Vzc29ycy5maW5kKGNvbm5lY3Rpb25JZCkgPT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1Db25uZWN0aW9uVG9Db29raWUuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGNvbm5lY3Rpb25JZCwgY29va2llKSk7CisgICAgYXV0byBpdCA9IG1Db29raWVUb0Nvbm5lY3Rpb25zLmZpbmQoY29va2llKTsKKyAgICBpZiAoaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgaXQtPnNlY29uZC5pbnNlcnQoY29ubmVjdGlvbklkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgY29va2llLCBzdGQ6OnNldDxpbnQ2NF90Pntjb25uZWN0aW9uSWR9KSk7CisgICAgfQorfQorCit2b2lkIENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDo6c2VydmljZURpZWQoCisgICAgICAgIHVpbnQ2NF90IGNvb2tpZSwKKyAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICApIHsKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBjb25zdCB3cDxBY2Nlc3Nvcj4+IGNvbm5lY3Rpb25zVG9DbG9zZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKworICAgICAgICBhdXRvIGl0ID0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZmluZChjb29raWUpOworICAgICAgICBpZiAoaXQgIT0gbUNvb2tpZVRvQ29ubmVjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGZvciAoYXV0byBjb25JdCA9IGl0LT5zZWNvbmQuYmVnaW4oKTsgY29uSXQgIT0gaXQtPnNlY29uZC5lbmQoKTsgKytjb25JdCkgeworICAgICAgICAgICAgICAgIGF1dG8gYWNjZXNzb3JJdCA9IG1BY2Nlc3NvcnMuZmluZCgqY29uSXQpOworICAgICAgICAgICAgICAgIGlmIChhY2Nlc3Nvckl0ICE9IG1BY2Nlc3NvcnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbnNUb0Nsb3NlLmluc2VydChzdGQ6Om1ha2VfcGFpcigqY29uSXQsIGFjY2Vzc29ySXQtPnNlY29uZCkpOworICAgICAgICAgICAgICAgICAgICBtQWNjZXNzb3JzLmVyYXNlKGFjY2Vzc29ySXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvblRvQ29va2llLmVyYXNlKCpjb25JdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29va2llVG9Db25uZWN0aW9ucy5lcmFzZShpdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoY29ubmVjdGlvbnNUb0Nsb3NlLnNpemUoKSA+IDApIHsKKyAgICAgICAgc3A8QWNjZXNzb3I+IGFjY2Vzc29yOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBjb25uZWN0aW9uc1RvQ2xvc2UuYmVnaW4oKTsgaXQgIT0gY29ubmVjdGlvbnNUb0Nsb3NlLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBhY2Nlc3NvciA9IGl0LT5zZWNvbmQucHJvbW90ZSgpOworCisgICAgICAgICAgICBpZiAoYWNjZXNzb3IpIHsKKyAgICAgICAgICAgICAgICBhY2Nlc3Nvci0+Y2xvc2UoaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiY29ubmVjdGlvbiAlbGxkIGNsb3NlZCBvbiBkZWF0aCIsIChsb25nIGxvbmcpaXQtPmZpcnN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworbmFtZXNwYWNlIHsKK3N0YXRpYyBzcDxDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQ+IHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQgPQorICAgICAgICBuZXcgQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCk7Cit9CisKK3NwPENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudD4gQWNjZXNzb3I6OmdldENvbm5lY3Rpb25EZWF0aFJlY2lwaWVudCgpIHsKKyAgICByZXR1cm4gc0Nvbm5lY3Rpb25EZWF0aFJlY2lwaWVudDsKK30KKwordm9pZCBBY2Nlc3Nvcjo6Y3JlYXRlSW52YWxpZGF0b3IoKSB7CisgICAgQWNjZXNzb3I6OkltcGw6OmNyZWF0ZUludmFsaWRhdG9yKCk7Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUFjY2Vzc29yIGZvbGxvdy4KK1JldHVybjx2b2lkPiBBY2Nlc3Nvcjo6Y29ubmVjdCgKKyAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklPYnNlcnZlcj4mIG9ic2VydmVyLAorICAgICAgICBjb25uZWN0X2NiIF9oaWRsX2NiKSB7CisgICAgc3A8Q29ubmVjdGlvbj4gY29ubmVjdGlvbjsKKyAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkOworICAgIHVpbnQzMl90IG1zZ0lkOworICAgIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IqIGZtcURlc2M7CisgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciogaW52RGVzYzsKKworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBjb25uZWN0KAorICAgICAgICAgICAgb2JzZXJ2ZXIsIGZhbHNlLCAmY29ubmVjdGlvbiwgJmNvbm5lY3Rpb25JZCwgJm1zZ0lkLCAmZm1xRGVzYywgJmludkRlc2MpOworICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICBfaGlkbF9jYihzdGF0dXMsIGNvbm5lY3Rpb24sIGNvbm5lY3Rpb25JZCwgbXNnSWQsICpmbXFEZXNjLCAqaW52RGVzYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBudWxscHRyLCAtMUxMLCAwLAorICAgICAgICAgICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzxCdWZmZXJTdGF0dXNNZXNzYWdlPigKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhbmRyb2lkOjpoYXJkd2FyZTo6R3JhbnRvckRlc2NyaXB0b3I+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBuaGFuZGxlICovLCAwIC8qIHNpemUgKi8pLAorICAgICAgICAgICAgICAgICBhbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yVW5zeW5jPEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2U+KAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGFuZHJvaWQ6OmhhcmR3YXJlOjpHcmFudG9yRGVzY3JpcHRvcj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIG5oYW5kbGUgKi8sIDAgLyogc2l6ZSAqLykpOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCitBY2Nlc3Nvcjo6QWNjZXNzb3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgOiBtSW1wbChuZXcgSW1wbChhbGxvY2F0b3IpKSB7fQorCitBY2Nlc3Nvcjo6fkFjY2Vzc29yKCkgeworfQorCitib29sIEFjY2Vzc29yOjppc1ZhbGlkKCkgeworICAgIHJldHVybiAoYm9vbCltSW1wbCAmJiBtSW1wbC0+aXNWYWxpZCgpOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmZsdXNoKCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBtSW1wbC0+Zmx1c2goKTsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmFsbG9jYXRlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmFsbG9jYXRlKGNvbm5lY3Rpb25JZCwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6ZmV0Y2goCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZldGNoKGNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyLCBib29sIGxvY2FsLAorICAgICAgICBzcDxDb25uZWN0aW9uPiAqY29ubmVjdGlvbiwgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkLAorICAgICAgICB1aW50MzJfdCAqcE1zZ0lkLAorICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yKiogc3RhdHVzRGVzY1B0ciwKKyAgICAgICAgY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvcioqIGludkRlc2NQdHIpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1JbXBsLT5jb25uZWN0KAorICAgICAgICAgICAgICAgIHRoaXMsIG9ic2VydmVyLCBjb25uZWN0aW9uLCBwQ29ubmVjdGlvbklkLCBwTXNnSWQsCisgICAgICAgICAgICAgICAgc3RhdHVzRGVzY1B0ciwgaW52RGVzY1B0cik7CisgICAgICAgIGlmICghbG9jYWwgJiYgc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHNwPEFjY2Vzc29yPiBhY2Nlc3Nvcih0aGlzKTsKKyAgICAgICAgICAgIHNDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQtPmFkZCgqcENvbm5lY3Rpb25JZCwgYWNjZXNzb3IpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1JbXBsLT5jbG9zZShjb25uZWN0aW9uSWQpOworICAgICAgICBzQ29ubmVjdGlvbkRlYXRoUmVjaXBpZW50LT5yZW1vdmUoY29ubmVjdGlvbklkKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5jbGVhblVwKGNsZWFyQ2FjaGUpOworICAgIH0KK30KKworLy9JQWNjZXNzb3IqIEhJRExfRkVUQ0hfSUFjY2Vzc29yKGNvbnN0IGNoYXIqIC8qIG5hbWUgKi8pIHsKKy8vICAgIHJldHVybiBuZXcgQWNjZXNzb3IoKTsKKy8vfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3Nvci5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDAyNTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3IuaApAQCAtMCwwICsxLDIwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQUNDRVNTT1JfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9BQ0NFU1NPUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lBY2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSU9ic2VydmVyLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9CdWZmZXJQb29sVHlwZXMuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSAiQnVmZmVyU3RhdHVzLmgiCisKKyNpbmNsdWRlIDxzZXQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQWNjZXNzb3I7CitzdHJ1Y3QgQ29ubmVjdGlvbjsKKworLyoqCisgKiBSZWNlaXZlcyBkZWF0aCBub3RpZmljYXRpb25zIGZyb20gcmVtb3RlIGNvbm5lY3Rpb25zLgorICogT24gZGVhdGggbm90aWZpY2F0aW9ucywgdGhlIGNvbm5lY3Rpb25zIGFyZSBjbG9zZWQgYW5kIHVzZWQgcmVzb3VyY2VzCisgKiBhcmUgcmVsZWFzZWQuCisgKi8KK3N0cnVjdCBDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQgOiBwdWJsaWMgaGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50IHsKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlcnMgYSBuZXdseSBjb25uZWN0ZWQgY29ubmVjdGlvbiBmcm9tIHJlbW90ZSBwcm9jZXNzZXMuCisgICAgICovCisgICAgdm9pZCBhZGQoaW50NjRfdCBjb25uZWN0aW9uSWQsIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IpOworCisgICAgLyoqCisgICAgICogUmVtb3ZlcyBhIGNvbm5lY3Rpb24uCisgICAgICovCisgICAgdm9pZCByZW1vdmUoaW50NjRfdCBjb25uZWN0aW9uSWQpOworCisgICAgdm9pZCBhZGRDb29raWVUb0Nvbm5lY3Rpb24odWludDY0X3QgY29va2llLCBpbnQ2NF90IGNvbm5lY3Rpb25JZCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQoCisgICAgICAgICAgICB1aW50NjRfdCAvKiBjb29raWUgKi8sCisgICAgICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovCisgICAgICAgICAgICApIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PGludDY0X3Q+PiAgbUNvb2tpZVRvQ29ubmVjdGlvbnM7CisgICAgc3RkOjptYXA8aW50NjRfdCwgdWludDY0X3Q+IG1Db25uZWN0aW9uVG9Db29raWU7CisgICAgc3RkOjptYXA8aW50NjRfdCwgY29uc3Qgd3A8QWNjZXNzb3I+PiBtQWNjZXNzb3JzOworfTsKKworLyoqCisgKiBBIGJ1ZmZlciBwb29sIGFjY2Vzc29yIHdoaWNoIGVuYWJsZXMgYSBidWZmZXIgcG9vbCB0byBjb21tdW5pY2F0ZSB3aXRoIGJ1ZmZlcgorICogcG9vbCBjbGllbnRzLiAxOjEgY29ycmVzcG9uZGVuc2UgaG9sZHMgYmV0d2VlbiBhIGJ1ZmZlciBwb29sIGFuZCBhbiBhY2Nlc3Nvci4KKyAqLworc3RydWN0IEFjY2Vzc29yIDogcHVibGljIElBY2Nlc3NvciB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3IgZm9sbG93LgorICAgIFJldHVybjx2b2lkPiBjb25uZWN0KGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJT2JzZXJ2ZXI+JiBvYnNlcnZlciwgY29ubmVjdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYnVmZmVyIHBvb2wgYWNjZXNzb3Igd2hpY2ggdXNlcyB0aGUgc3BlY2lmaWVkIGFsbG9jYXRvci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBhbGxvY2F0b3IgYnVmZmVyIGFsbG9jYXRvci4KKyAgICAgKi8KKyAgICBleHBsaWNpdCBBY2Nlc3Nvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvcik7CisKKyAgICAvKiogRGVzdHJ1Y3RzIGEgYnVmZmVyIHBvb2wgYWNjZXNzb3IuICovCisgICAgfkFjY2Vzc29yKCk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBhY2Nlc3NvciBpcyB2YWxpZC4gKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIC8qKiBJbnZhbGlkYXRlcyBhbGwgYnVmZmVycyB3aGljaCBhcmUgb3duZWQgYnkgYnVmZmVycG9vbCAqLworICAgIFJlc3VsdFN0YXR1cyBmbHVzaCgpOworCisgICAgLyoqIEFsbG9jYXRlcyBhIGJ1ZmZlciBmcm9tIGEgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgY29ubmVjdGlvbiBpZCBvZiB0aGUgY2xpZW50LgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqIEBwYXJhbSBoYW5kbGUgICAgICAgIHRoZSBuYXRpdmUgaGFuZGxlIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgLyoqCisgICAgICogRmV0Y2hlcyBhIGJ1ZmZlciBmb3IgdGhlIHNwZWNpZmllZCB0cmFuc2FjdGlvbi4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiByZWNlaXZpbmcgY29ubmVjdGlvbihjbGllbnQpLgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIHRoZSBpZCBvZiB0aGUgdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIgdG8gYmUgZmV0Y2hlZC4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICB0aGUgbmF0aXZlIGhhbmRsZSBvZiB0aGUgZmV0Y2hlZCBidWZmZXIuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IGZldGNoZWQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGZldGNoKAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIE1ha2VzIGEgY29ubmVjdGlvbiB0byB0aGUgYnVmZmVyIHBvb2wuIFRoZSBidWZmZXIgcG9vbCBjbGllbnQgdXNlcyB0aGUKKyAgICAgKiBjcmVhdGVkIGNvbm5lY3Rpb24gaW4gb3JkZXIgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgYnVmZmVyIHBvb2wuIEFuCisgICAgICogRk1RIGZvciBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgaXMgYWxzbyBjcmVhdGVkIGZvciB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogQHBhcmFtIG9ic2VydmVyICAgICAgY2xpZW50IG9ic2VydmVyIGZvciBidWZmZXIgaW52YWxpZGF0aW9uCisgICAgICogQHBhcmFtIGxvY2FsICAgICAgICAgdHJ1ZSB3aGVuIGEgY29ubmVjdGlvbiByZXF1ZXN0IGNvbWVzIGZyb20gbG9jYWwgcHJvY2VzcywKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb24gICAgY3JlYXRlZCBjb25uZWN0aW9uCisgICAgICogQHBhcmFtIHBDb25uZWN0aW9uSWQgdGhlIGlkIG9mIHRoZSBjcmVhdGVkIGNvbm5lY3Rpb24KKyAgICAgKiBAcGFyYW0gcE1zZ0lkICAgICAgICB0aGUgaWQgb2YgdGhlIHJlY2VudCBidWZmZXIgcG9vbCBtZXNzYWdlCisgICAgICogQHBhcmFtIHN0YXR1c0Rlc2NQdHIgRk1RIGRlc2NyaXB0b3IgZm9yIHNoYXJlZCBidWZmZXIgc3RhdHVzIG1lc3NhZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBxdWV1ZSBiZXR3ZWVuIGEgYnVmZmVyIHBvb2wgYW5kIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIGludkRlc2NQdHIgICAgRk1RIGRlc2NyaXB0b3IgZm9yIGJ1ZmZlciBpbnZhbGlkYXRpb24gbWVzc2FnZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHF1ZXVlIGZyb20gYSBidWZmZXIgcG9vbCB0byB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkgbWFkZS4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4mIG9ic2VydmVyLAorICAgICAgICAgICAgYm9vbCBsb2NhbCwKKyAgICAgICAgICAgIHNwPENvbm5lY3Rpb24+ICpjb25uZWN0aW9uLCBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsCisgICAgICAgICAgICB1aW50MzJfdCAqcE1zZ0lkLAorICAgICAgICAgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvcioqIHN0YXR1c0Rlc2NQdHIsCisgICAgICAgICAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yKiogaW52RGVzY1B0cik7CisKKyAgICAvKioKKyAgICAgKiBDbG9zZXMgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHRvIHRoZSBjbGllbnQuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBjbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIHBlcmZvbXMgcGVyaW9kaWMgY2FjaGUKKyAgICAgKiBjbGVhbmluZy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGVhckNhY2hlICAgIGlmIGNsZWFyQ2FjaGUgaXMgdHJ1ZSwgaXQgZnJlZXMgYWxsIGJ1ZmZlcnMgd2FpdGluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRvIGJlIHJlY3ljbGVkLgorICAgICAqLworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUpOworCisgICAgLyoqCisgICAgICogR2V0cyBhIGhpZGxfZGVhdGhfcmVjaXBpZW50IGZvciByZW1vdGUgY29ubmVjdGlvbiBkZWF0aC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiBnZXRDb25uZWN0aW9uRGVhdGhSZWNpcGllbnQoKTsKKworICAgIHN0YXRpYyB2b2lkIGNyZWF0ZUludmFsaWRhdG9yKCk7CisKK3ByaXZhdGU6CisgICAgY2xhc3MgSW1wbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQUNDRVNTT1JfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQWNjZXNzb3JJbXBsLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ1OTFkNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5jcHAKQEAgLTAsMCArMSw4ODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xBY2Nlc3NvciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSAiQWNjZXNzb3JJbXBsLmgiCisjaW5jbHVkZSAiQ29ubmVjdGlvbi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK25hbWVzcGFjZSB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQ2NF90IGtDbGVhblVwRHVyYXRpb25VcyA9IDUwMDAwMDsgLy8gVE9ETyB0dW5lIDAuNSBzZWMKKyAgICBzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0xvZ0R1cmF0aW9uVXMgPSA1MDAwMDAwOyAvLyA1IHNlY3MKKworICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNaW5BbGxvY0J5dGVzRm9yRXZpY3Rpb24gPSAxMDI0KjEwMjQqMTU7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3Qga01pbkJ1ZmZlckNvdW50Rm9yRXZpY3Rpb24gPSAyNTsKK30KKworLy8gQnVmZmVyIHN0cnVjdHVyZSBpbiBidWZmZXJwb29sIHByb2Nlc3MKK3N0cnVjdCBJbnRlcm5hbEJ1ZmZlciB7CisgICAgQnVmZmVySWQgbUlkOworICAgIHNpemVfdCBtT3duZXJDb3VudDsKKyAgICBzaXplX3QgbVRyYW5zYWN0aW9uQ291bnQ7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKKyAgICBjb25zdCBzaXplX3QgbUFsbG9jU2l6ZTsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtQ29uZmlnOworICAgIGJvb2wgbUludmFsaWRhdGVkOworCisgICAgSW50ZXJuYWxCdWZmZXIoCisgICAgICAgICAgICBCdWZmZXJJZCBpZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZhbGxvY0NvbmZpZykKKyAgICAgICAgICAgIDogbUlkKGlkKSwgbU93bmVyQ291bnQoMCksIG1UcmFuc2FjdGlvbkNvdW50KDApLAorICAgICAgICAgICAgbUFsbG9jYXRpb24oYWxsb2MpLCBtQWxsb2NTaXplKGFsbG9jU2l6ZSksIG1Db25maWcoYWxsb2NDb25maWcpLAorICAgICAgICAgICAgbUludmFsaWRhdGVkKGZhbHNlKSB7fQorCisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUoKSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbi0+aGFuZGxlKCk7CisgICAgfQorCisgICAgdm9pZCBpbnZhbGlkYXRlKCkgeworICAgICAgICBtSW52YWxpZGF0ZWQgPSB0cnVlOworICAgIH0KK307CisKK3N0cnVjdCBUcmFuc2FjdGlvblN0YXR1cyB7CisgICAgVHJhbnNhY3Rpb25JZCBtSWQ7CisgICAgQnVmZmVySWQgbUJ1ZmZlcklkOworICAgIENvbm5lY3Rpb25JZCBtU2VuZGVyOworICAgIENvbm5lY3Rpb25JZCBtUmVjZWl2ZXI7CisgICAgQnVmZmVyU3RhdHVzIG1TdGF0dXM7CisgICAgaW50NjRfdCBtVGltZXN0YW1wVXM7CisgICAgYm9vbCBtU2VuZGVyVmFsaWRhdGVkOworCisgICAgVHJhbnNhY3Rpb25TdGF0dXMoY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSwgaW50NjRfdCB0aW1lc3RhbXBVcykgeworICAgICAgICBtSWQgPSBtZXNzYWdlLnRyYW5zYWN0aW9uSWQ7CisgICAgICAgIG1CdWZmZXJJZCA9IG1lc3NhZ2UuYnVmZmVySWQ7CisgICAgICAgIG1TdGF0dXMgPSBtZXNzYWdlLm5ld1N0YXR1czsKKyAgICAgICAgbVRpbWVzdGFtcFVzID0gdGltZXN0YW1wVXM7CisgICAgICAgIGlmIChtU3RhdHVzID09IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVE8pIHsKKyAgICAgICAgICAgIG1TZW5kZXIgPSBtZXNzYWdlLmNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1SZWNlaXZlciA9IG1lc3NhZ2UudGFyZ2V0Q29ubmVjdGlvbklkOworICAgICAgICAgICAgbVNlbmRlclZhbGlkYXRlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2VuZGVyID0gLTFMTDsKKyAgICAgICAgICAgIG1SZWNlaXZlciA9IG1lc3NhZ2UuY29ubmVjdGlvbklkOworICAgICAgICAgICAgbVNlbmRlclZhbGlkYXRlZCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorfTsKKworLy8gSGVscGVyIHRlbXBsYXRlIG1ldGhvZHMgZm9yIGhhbmRsaW5nIG1hcCBvZiBzZXQuCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorYm9vbCBpbnNlcnQoc3RkOjptYXA8VCwgc3RkOjpzZXQ8VT4+ICptYXBPZlNldCwgVCBrZXksIFUgdmFsdWUpIHsKKyAgICBhdXRvIGl0ZXIgPSBtYXBPZlNldC0+ZmluZChrZXkpOworICAgIGlmIChpdGVyID09IG1hcE9mU2V0LT5lbmQoKSkgeworICAgICAgICBzdGQ6OnNldDxVPiB2YWx1ZVNldHt2YWx1ZX07CisgICAgICAgIG1hcE9mU2V0LT5pbnNlcnQoc3RkOjptYWtlX3BhaXIoa2V5LCB2YWx1ZVNldCkpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKGl0ZXItPnNlY29uZC5maW5kKHZhbHVlKSAgPT0gaXRlci0+c2Vjb25kLmVuZCgpKSB7CisgICAgICAgIGl0ZXItPnNlY29uZC5pbnNlcnQodmFsdWUpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorYm9vbCBlcmFzZShzdGQ6Om1hcDxULCBzdGQ6OnNldDxVPj4gKm1hcE9mU2V0LCBUIGtleSwgVSB2YWx1ZSkgeworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgYXV0byBpdGVyID0gbWFwT2ZTZXQtPmZpbmQoa2V5KTsKKyAgICBpZiAoaXRlciAhPSBtYXBPZlNldC0+ZW5kKCkpIHsKKyAgICAgICAgaWYgKGl0ZXItPnNlY29uZC5lcmFzZSh2YWx1ZSkgPiAwKSB7CisgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpdGVyLT5zZWNvbmQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIG1hcE9mU2V0LT5lcmFzZShpdGVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgorYm9vbCBjb250YWlucyhzdGQ6Om1hcDxULCBzdGQ6OnNldDxVPj4gKm1hcE9mU2V0LCBUIGtleSwgVSB2YWx1ZSkgeworICAgIGF1dG8gaXRlciA9IG1hcE9mU2V0LT5maW5kKGtleSk7CisgICAgaWYgKGl0ZXIgIT0gbWFwT2ZTZXQtPmVuZCgpKSB7CisgICAgICAgIGF1dG8gc2V0SXRlciA9IGl0ZXItPnNlY29uZC5maW5kKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuIHNldEl0ZXIgIT0gaXRlci0+c2Vjb25kLmVuZCgpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2ludDMyX3QgQWNjZXNzb3I6OkltcGw6OnNQaWQgPSBnZXRwaWQoKTsKK3VpbnQzMl90IEFjY2Vzc29yOjpJbXBsOjpzU2VxSWQgPSB0aW1lKG51bGxwdHIpOworCitBY2Nlc3Nvcjo6SW1wbDo6SW1wbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgICAgICAgIDogbUFsbG9jYXRvcihhbGxvY2F0b3IpIHt9CisKK0FjY2Vzc29yOjpJbXBsOjp+SW1wbCgpIHsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpjb25uZWN0KAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlciwKKyAgICAgICAgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sCisgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCwKKyAgICAgICAgdWludDMyX3QgKnBNc2dJZCwKKyAgICAgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvcioqIHN0YXR1c0Rlc2NQdHIsCisgICAgICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IqKiBpbnZEZXNjUHRyKSB7CisgICAgc3A8Q29ubmVjdGlvbj4gbmV3Q29ubmVjdGlvbiA9IG5ldyBDb25uZWN0aW9uKCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgICAgICBpZiAobmV3Q29ubmVjdGlvbikgeworICAgICAgICAgICAgQ29ubmVjdGlvbklkIGlkID0gKGludDY0X3Qpc1BpZCA8PCAzMiB8IHNTZXFJZDsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CdWZmZXJQb29sLm1PYnNlcnZlci5vcGVuKGlkLCBzdGF0dXNEZXNjUHRyKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIG5ld0Nvbm5lY3Rpb24tPmluaXRpYWxpemUoYWNjZXNzb3IsIGlkKTsKKyAgICAgICAgICAgICAgICAqY29ubmVjdGlvbiA9IG5ld0Nvbm5lY3Rpb247CisgICAgICAgICAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBpZDsKKyAgICAgICAgICAgICAgICAqcE1zZ0lkID0gbUJ1ZmZlclBvb2wubUludmFsaWRhdGlvbi5tSW52YWxpZGF0aW9uSWQ7CisgICAgICAgICAgICAgICAgbUJ1ZmZlclBvb2wubUNvbm5lY3Rpb25JZHMuaW5zZXJ0KGlkKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyUG9vbC5tSW52YWxpZGF0aW9uQ2hhbm5lbC5nZXREZXNjKGludkRlc2NQdHIpOworICAgICAgICAgICAgICAgIG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb24ub25Db25uZWN0KGlkLCBvYnNlcnZlcik7CisgICAgICAgICAgICAgICAgKytzU2VxSWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorICAgICAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICAgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcCgpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitSZXN1bHRTdGF0dXMgQWNjZXNzb3I6OkltcGw6OmNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQnVmZmVyUG9vbC5tTXV0ZXgpOworICAgIEFMT0dWKCJjb25uZWN0aW9uIGNsb3NlICVsbGQ6ICV1IiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQsIG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb24ubUlkKTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBtQnVmZmVyUG9vbC5oYW5kbGVDbG9zZShjb25uZWN0aW9uSWQpOworICAgIG1CdWZmZXJQb29sLm1PYnNlcnZlci5jbG9zZShjb25uZWN0aW9uSWQpOworICAgIG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb24ub25DbG9zZShjb25uZWN0aW9uSWQpOworICAgIC8vIFNpbmNlIGNsb3NlIyB3aWxsIGJlIGNhbGxlZCBhZnRlciBhbGwgd29ya3MgYXJlIGZpbmlzaGVkLCBpdCBpcyBPSyB0bworICAgIC8vIGV2aWN0IHVudXNlZCBidWZmZXJzLgorICAgIG1CdWZmZXJQb29sLmNsZWFuVXAodHJ1ZSk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBwYXJhbXMsCisgICAgICAgIEJ1ZmZlcklkICpidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6T0s7CisgICAgaWYgKCFtQnVmZmVyUG9vbC5nZXRGcmVlQnVmZmVyKG1BbGxvY2F0b3IsIHBhcmFtcywgYnVmZmVySWQsIGhhbmRsZSkpIHsKKyAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgc2l6ZV90IGFsbG9jU2l6ZTsKKyAgICAgICAgc3RhdHVzID0gbUFsbG9jYXRvci0+YWxsb2NhdGUocGFyYW1zLCAmYWxsb2MsICZhbGxvY1NpemUpOworICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtQnVmZmVyUG9vbC5hZGROZXdCdWZmZXIoYWxsb2MsIGFsbG9jU2l6ZSwgcGFyYW1zLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiY3JlYXRlIGEgYnVmZmVyICVkIDogJXUgJXAiLAorICAgICAgICAgICAgICBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSywgKmJ1ZmZlcklkLCAqaGFuZGxlKTsKKyAgICB9CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIC8vIFRPRE86IGhhbmRsZSBvd25CdWZmZXIgZmFpbHVyZQorICAgICAgICBtQnVmZmVyUG9vbC5oYW5kbGVPd25CdWZmZXIoY29ubmVjdGlvbklkLCAqYnVmZmVySWQpOworICAgIH0KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworUmVzdWx0U3RhdHVzIEFjY2Vzc29yOjpJbXBsOjpmZXRjaCgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBhdXRvIGZvdW5kID0gbUJ1ZmZlclBvb2wubVRyYW5zYWN0aW9ucy5maW5kKHRyYW5zYWN0aW9uSWQpOworICAgIGlmIChmb3VuZCAhPSBtQnVmZmVyUG9vbC5tVHJhbnNhY3Rpb25zLmVuZCgpICYmCisgICAgICAgICAgICBjb250YWlucygmbUJ1ZmZlclBvb2wubVBlbmRpbmdUcmFuc2FjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uSWQsIHRyYW5zYWN0aW9uSWQpKSB7CisgICAgICAgIGlmIChmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkICYmCisgICAgICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bVN0YXR1cyA9PSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST00gJiYKKyAgICAgICAgICAgICAgICBmb3VuZC0+c2Vjb25kLT5tQnVmZmVySWQgPT0gYnVmZmVySWQpIHsKKyAgICAgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TdGF0dXMgPSBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZFVENIOworICAgICAgICAgICAgYXV0byBidWZmZXJJdCA9IG1CdWZmZXJQb29sLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ICE9IG1CdWZmZXJQb29sLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlclBvb2wubVN0YXRzLm9uQnVmZmVyRmV0Y2hlZCgpOworICAgICAgICAgICAgICAgICpoYW5kbGUgPSBidWZmZXJJdC0+c2Vjb25kLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtQnVmZmVyUG9vbC5jbGVhblVwKCk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OmNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKSB7CisgICAgLy8gdHJhbnNhY3Rpb24gdGltZW91dCwgYnVmZmVyIGNhY2hlaW5nIFRUTCBoYW5kbGluZworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CdWZmZXJQb29sLm1NdXRleCk7CisgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgbUJ1ZmZlclBvb2wuY2xlYW5VcChjbGVhckNhY2hlKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6Zmx1c2goKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICBtQnVmZmVyUG9vbC5wcm9jZXNzU3RhdHVzTWVzc2FnZXMoKTsKKyAgICBtQnVmZmVyUG9vbC5mbHVzaChzaGFyZWRfZnJvbV90aGlzKCkpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpoYW5kbGVJbnZhbGlkYXRlQWNrKCkgeworICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3A8SU9ic2VydmVyPj4gb2JzZXJ2ZXJzOworICAgIHVpbnQzMl90IGludmFsaWRhdGlvbklkOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlclBvb2wubU11dGV4KTsKKyAgICAgICAgbUJ1ZmZlclBvb2wucHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisgICAgICAgIG1CdWZmZXJQb29sLm1JbnZhbGlkYXRpb24ub25IYW5kbGVBY2soJm9ic2VydmVycywgJmludmFsaWRhdGlvbklkKTsKKyAgICB9CisgICAgLy8gRG8gbm90IGhvbGQgbG9jayBmb3Igc2VuZCBpbnZhbGlkYXRpb25zCisgICAgc2l6ZV90IGRlYWRDbGllbnRzID0gMDsKKyAgICBmb3IgKGF1dG8gaXQgPSBvYnNlcnZlcnMuYmVnaW4oKTsgaXQgIT0gb2JzZXJ2ZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBpdC0+c2Vjb25kOworICAgICAgICBpZiAob2JzZXJ2ZXIpIHsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1Jlc3VsdCA9IG9ic2VydmVyLT5vbk1lc3NhZ2UoaXQtPmZpcnN0LCBpbnZhbGlkYXRpb25JZCk7CisgICAgICAgICAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgICAgICsrZGVhZENsaWVudHM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGRlYWRDbGllbnRzID4gMCkgeworICAgICAgICBBTE9HRCgiRHVyaW5nIGludmFsaWRhdGlvbiBmb3VuZCAlenUgZGVhZCBjbGllbnRzIiwgZGVhZENsaWVudHMpOworICAgIH0KK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbUJ1ZmZlclBvb2wuaXNWYWxpZCgpOworfQorCitBY2Nlc3Nvcjo6SW1wbDo6SW1wbDo6QnVmZmVyUG9vbDo6QnVmZmVyUG9vbCgpCisgICAgOiBtVGltZXN0YW1wVXMoZ2V0VGltZXN0YW1wTm93KCkpLAorICAgICAgbUxhc3RDbGVhblVwVXMobVRpbWVzdGFtcFVzKSwKKyAgICAgIG1MYXN0TG9nVXMobVRpbWVzdGFtcFVzKSwKKyAgICAgIG1TZXEoMCksCisgICAgICBtU3RhcnRTZXEoMCkgeworICAgIG1WYWxpZCA9IG1JbnZhbGlkYXRpb25DaGFubmVsLmlzVmFsaWQoKTsKK30KKworCisvLyBTdGF0aXN0aWNzIGhlbHBlcgordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUz4KK2ludCBwZXJjZW50YWdlKFQgYmFzZSwgUyB0b3RhbCkgeworICAgIHJldHVybiBpbnQodG90YWwgPyAwLjUgKyAxMDAuICogc3RhdGljX2Nhc3Q8Uz4oYmFzZSkgLyB0b3RhbCA6IDApOworfQorCitzdGQ6OmF0b21pYzxzdGQ6OnVpbnQzMl90PiBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpzSW52U2VxSWQoMCk7CisKK0FjY2Vzc29yOjpJbXBsOjpJbXBsOjpCdWZmZXJQb29sOjp+QnVmZmVyUG9vbCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIEFMT0dEKCJEZXN0cnVjdGlvbiAtIGJ1ZmZlcnBvb2wyICVwICIKKyAgICAgICAgICAiY2FjaGVkOiAlenUvJXp1TSwgJXp1LyVkJSUgaW4gdXNlOyAiCisgICAgICAgICAgImFsbG9jczogJXp1LCAlZCUlIHJlY3ljbGVkOyAiCisgICAgICAgICAgInRyYW5zZmVyczogJXp1LCAlZCUlIHVuZmV0Y2VkIiwKKyAgICAgICAgICB0aGlzLCBtU3RhdHMubUJ1ZmZlcnNDYWNoZWQsIG1TdGF0cy5tU2l6ZUNhY2hlZCA+PiAyMCwKKyAgICAgICAgICBtU3RhdHMubUJ1ZmZlcnNJblVzZSwgcGVyY2VudGFnZShtU3RhdHMubUJ1ZmZlcnNJblVzZSwgbVN0YXRzLm1CdWZmZXJzQ2FjaGVkKSwKKyAgICAgICAgICBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMsIHBlcmNlbnRhZ2UobVN0YXRzLm1Ub3RhbFJlY3ljbGVzLCBtU3RhdHMubVRvdGFsQWxsb2NhdGlvbnMpLAorICAgICAgICAgIG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMsCisgICAgICAgICAgcGVyY2VudGFnZShtU3RhdHMubVRvdGFsVHJhbnNmZXJzIC0gbVN0YXRzLm1Ub3RhbEZldGNoZXMsIG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMpKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpvbkNvbm5lY3QoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25JZCwgY29uc3Qgc3A8SU9ic2VydmVyPiYgb2JzZXJ2ZXIpIHsKKyAgICBtQWNrc1tjb25JZF0gPSBtSW52YWxpZGF0aW9uSWQ7IC8vIHN0YXJ0cyBmcm9tIGN1cnJlbnQgaW52YWxpZGF0aW9uSWQKKyAgICBtT2JzZXJ2ZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgb2JzZXJ2ZXIpKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpvbkNsb3NlKENvbm5lY3Rpb25JZCBjb25JZCkgeworICAgIG1BY2tzLmVyYXNlKGNvbklkKTsKKyAgICBtT2JzZXJ2ZXJzLmVyYXNlKGNvbklkKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6SW52YWxpZGF0aW9uOjpvbkFjaygKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbklkLAorICAgICAgICB1aW50MzJfdCBtc2dJZCkgeworICAgIGF1dG8gaXQgPSBtQWNrcy5maW5kKGNvbklkKTsKKyAgICBpZiAoaXQgPT0gbUFja3MuZW5kKCkpIHsKKyAgICAgICAgQUxPR1coIkFDSyBmcm9tIGluY29uc2lzdGVudCBjb25uZWN0aW9uISAlbGxkIiwgKGxvbmcgbG9uZyljb25JZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGlzTWVzc2FnZUxhdGVyKG1zZ0lkLCBpdC0+c2Vjb25kKSkgeworICAgICAgICBtQWNrc1tjb25JZF0gPSBtc2dJZDsKKyAgICB9Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25CdWZmZXJJbnZhbGlkYXRlZCgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwgJmNoYW5uZWwpIHsKKyAgICBmb3IgKGF1dG8gaXQgPSBtUGVuZGluZ3MuYmVnaW4oKTsgaXQgIT0gbVBlbmRpbmdzLmVuZCgpOykgeworICAgICAgICBpZiAoaXQtPmlzSW52YWxpZGF0ZWQoYnVmZmVySWQpKSB7CisgICAgICAgICAgICB1aW50MzJfdCBtc2dJZCA9IDA7CisgICAgICAgICAgICBpZiAoaXQtPm1OZWVkc0FjaykgeworICAgICAgICAgICAgICAgIG1zZ0lkID0gKyttSW52YWxpZGF0aW9uSWQ7CisgICAgICAgICAgICAgICAgaWYgKG1zZ0lkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd3JhcCBoYXBwZW5zCisgICAgICAgICAgICAgICAgICAgIG1zZ0lkID0gKyttSW52YWxpZGF0aW9uSWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhbm5lbC5wb3N0SW52YWxpZGF0aW9uKG1zZ0lkLCBpdC0+bUZyb20sIGl0LT5tVG8pOworICAgICAgICAgICAgaXQgPSBtUGVuZGluZ3MuZXJhc2UoaXQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgKytpdDsKKyAgICB9Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25JbnZhbGlkYXRpb25SZXF1ZXN0KAorICAgICAgICBib29sIG5lZWRzQWNrLAorICAgICAgICB1aW50MzJfdCBmcm9tLAorICAgICAgICB1aW50MzJfdCB0bywKKyAgICAgICAgc2l6ZV90IGxlZnQsCisgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwgJmNoYW5uZWwsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpIHsKKyAgICAgICAgdWludDMyX3QgbXNnSWQgPSAwOworICAgIGlmIChuZWVkc0FjaykgeworICAgICAgICBtc2dJZCA9ICsrbUludmFsaWRhdGlvbklkOworICAgICAgICBpZiAobXNnSWQgPT0gMCkgeworICAgICAgICAgICAgLy8gd3JhcCBoYXBwZW5zCisgICAgICAgICAgICBtc2dJZCA9ICsrbUludmFsaWRhdGlvbklkOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJidWZmZXJwb29sMiBpbnZhbGlkYXRpb24gcmVxdWVzdGVkIGFuZCBxdWV1ZWQiKTsKKyAgICBpZiAobGVmdCA9PSAwKSB7CisgICAgICAgIGNoYW5uZWwucG9zdEludmFsaWRhdGlvbihtc2dJZCwgZnJvbSwgdG8pOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFRPRE86IHNlbmRpbmcgaGludCBtZXNzYWdlPworICAgICAgICBBTE9HVigiYnVmZmVycG9vMiBpbnZhbGlkYXRpb24gcmVxdWVzdGVkIGFuZCBwZW5kaW5nIik7CisgICAgICAgIFBlbmRpbmcgcGVuZGluZyhuZWVkc0FjaywgZnJvbSwgdG8sIGxlZnQsIGltcGwpOworICAgICAgICBtUGVuZGluZ3MucHVzaF9iYWNrKHBlbmRpbmcpOworICAgIH0KKyAgICBzSW52YWxpZGF0b3ItPmFkZEFjY2Vzc29yKG1JZCwgaW1wbCk7Cit9CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OkludmFsaWRhdGlvbjo6b25IYW5kbGVBY2soCisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3A8SU9ic2VydmVyPj4gKm9ic2VydmVycywKKyAgICAgICAgdWludDMyX3QgKmludmFsaWRhdGlvbklkKSB7CisgICAgaWYgKG1JbnZhbGlkYXRpb25JZCAhPSAwKSB7CisgICAgICAgICppbnZhbGlkYXRpb25JZCA9IG1JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgc3RkOjpzZXQ8aW50PiBkZWFkczsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUFja3MuYmVnaW4oKTsgaXQgIT0gbUFja3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGlmIChpdC0+c2Vjb25kICE9IG1JbnZhbGlkYXRpb25JZCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHNwPElPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBtT2JzZXJ2ZXJzW2l0LT5maXJzdF07CisgICAgICAgICAgICAgICAgaWYgKG9ic2VydmVyKSB7CisgICAgICAgICAgICAgICAgICAgIG9ic2VydmVycy0+ZW1wbGFjZShpdC0+Zmlyc3QsIG9ic2VydmVyKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNvbm5lY3Rpb24gJWxsZCB3aWxsIGNhbGwgb2JzZXJ2ZXIgKCV1OiAldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWl0LT5maXJzdCwgaXQtPnNlY29uZCwgbUludmFsaWRhdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gTi5COiBvbk1lc3NhZ2Ugd2lsbCBiZSBjYWxsZWQgbGF0ZXIuIGlnbm9yZSBwb3NzaWJpbGl0eSBvZgorICAgICAgICAgICAgICAgICAgICAvLyBvbk1lc3NhZ2UjIG9uZXdheSBjYWxsIGJlaW5nIGxvc3QuCisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQgPSBtSW52YWxpZGF0aW9uSWQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImJ1ZmZlcnBvb2wyIG9ic2VydmVyIGRpZWQgJWxsZCIsIChsb25nIGxvbmcpaXQtPmZpcnN0KTsKKyAgICAgICAgICAgICAgICAgICAgZGVhZHMuaW5zZXJ0KGl0LT5maXJzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkZWFkcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBkZWFkcy5iZWdpbigpOyBpdCAhPSBkZWFkcy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgIG9uQ2xvc2UoKml0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobVBlbmRpbmdzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIC8vIEFsbCBpbnZhbGlkYXRpb24gSWRzIGFyZSBzeW5jZWQgYW5kIG5vIG1vcmUgcGVuZGluZyBpbnZhbGlkYXRpb25zLgorICAgICAgICBzSW52YWxpZGF0b3ItPmRlbEFjY2Vzc29yKG1JZCk7CisgICAgfQorfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVPd25CdWZmZXIoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisKKyAgICBib29sIGFkZGVkID0gaW5zZXJ0KCZtVXNpbmdCdWZmZXJzLCBjb25uZWN0aW9uSWQsIGJ1ZmZlcklkKTsKKyAgICBpZiAoYWRkZWQpIHsKKyAgICAgICAgYXV0byBpdGVyID0gbUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgIGl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQrKzsKKyAgICB9CisgICAgaW5zZXJ0KCZtVXNpbmdDb25uZWN0aW9ucywgYnVmZmVySWQsIGNvbm5lY3Rpb25JZCk7CisgICAgcmV0dXJuIGFkZGVkOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVSZWxlYXNlQnVmZmVyKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCkgeworICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtVXNpbmdCdWZmZXJzLCBjb25uZWN0aW9uSWQsIGJ1ZmZlcklkKTsKKyAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICBhdXRvIGl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgaXRlci0+c2Vjb25kLT5tT3duZXJDb3VudC0tOworICAgICAgICBpZiAoaXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICBpZiAoIWl0ZXItPnNlY29uZC0+bUludmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChidWZmZXJJZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChpdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoaXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShpdGVyKTsKKyAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uLm9uQnVmZmVySW52YWxpZGF0ZWQoYnVmZmVySWQsIG1JbnZhbGlkYXRpb25DaGFubmVsKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlcmFzZSgmbVVzaW5nQ29ubmVjdGlvbnMsIGJ1ZmZlcklkLCBjb25uZWN0aW9uSWQpOworICAgIEFMT0dWKCJyZWxlYXNlIGJ1ZmZlciAldSA6ICVkIiwgYnVmZmVySWQsIGRlbGV0ZWQpOworICAgIHJldHVybiBkZWxldGVkOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVUcmFuc2ZlclRvKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBhdXRvIGNvbXBsZXRlZCA9IG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuZmluZCgKKyAgICAgICAgICAgIG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGNvbXBsZXRlZCAhPSBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmVuZCgpKSB7CisgICAgICAgIC8vIGFscmVhZHkgY29tcGxldGVkCisgICAgICAgIG1Db21wbGV0ZWRUcmFuc2FjdGlvbnMuZXJhc2UoY29tcGxldGVkKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIC8vIHRoZSBidWZmZXIgc2hvdWxkIGV4aXN0IGFuZCBiZSBvd25lZC4KKyAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKG1lc3NhZ2UuYnVmZmVySWQpOworICAgIGlmIChidWZmZXJJdGVyID09IG1CdWZmZXJzLmVuZCgpIHx8CisgICAgICAgICAgICAhY29udGFpbnMoJm1Vc2luZ0J1ZmZlcnMsIG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGF1dG8gZm91bmQgPSBtVHJhbnNhY3Rpb25zLmZpbmQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgIT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICAvLyB0cmFuc2Zlcl9mcm9tIHdhcyByZWNlaXZlZCBlYXJsaWVyLgorICAgICAgICBmb3VuZC0+c2Vjb25kLT5tU2VuZGVyID0gbWVzc2FnZS5jb25uZWN0aW9uSWQ7CisgICAgICAgIGZvdW5kLT5zZWNvbmQtPm1TZW5kZXJWYWxpZGF0ZWQgPSB0cnVlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKG1Db25uZWN0aW9uSWRzLmZpbmQobWVzc2FnZS50YXJnZXRDb25uZWN0aW9uSWQpID09IG1Db25uZWN0aW9uSWRzLmVuZCgpKSB7CisgICAgICAgIC8vIE4uQjogaXQgY291bGQgYmUgZmFrZSBvciByZWNlaXZlIGNvbm5lY3Rpb24gYWxyZWFkeSBjbG9zZWQuCisgICAgICAgIEFMT0dEKCJidWZmZXJwb29sMiAlcCByZWNlaXZlciBjb25uZWN0aW9uICVsbGQgaXMgbm8gbG9uZ2VyIHZhbGlkIiwKKyAgICAgICAgICAgICAgdGhpcywgKGxvbmcgbG9uZyltZXNzYWdlLnRhcmdldENvbm5lY3Rpb25JZCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbVN0YXRzLm9uQnVmZmVyU2VudCgpOworICAgIG1UcmFuc2FjdGlvbnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxUcmFuc2FjdGlvblN0YXR1cz4obWVzc2FnZSwgbVRpbWVzdGFtcFVzKSkpOworICAgIGluc2VydCgmbVBlbmRpbmdUcmFuc2FjdGlvbnMsIG1lc3NhZ2UudGFyZ2V0Q29ubmVjdGlvbklkLAorICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQrKzsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlVHJhbnNmZXJGcm9tKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpIHsKKyAgICBhdXRvIGZvdW5kID0gbVRyYW5zYWN0aW9ucy5maW5kKG1lc3NhZ2UudHJhbnNhY3Rpb25JZCk7CisgICAgaWYgKGZvdW5kID09IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgLy8gVE9ETzogaXMgaXQgZmVhc2libGUgdG8gY2hlY2sgb3duZXJzaGlwIGhlcmU/CisgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclNlbnQoKTsKKyAgICAgICAgbVRyYW5zYWN0aW9ucy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgbWVzc2FnZS50cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8VHJhbnNhY3Rpb25TdGF0dXM+KG1lc3NhZ2UsIG1UaW1lc3RhbXBVcykpKTsKKyAgICAgICAgaW5zZXJ0KCZtUGVuZGluZ1RyYW5zYWN0aW9ucywgbWVzc2FnZS5jb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKG1lc3NhZ2UuYnVmZmVySWQpOworICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50Kys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKG1lc3NhZ2UuY29ubmVjdGlvbklkID09IGZvdW5kLT5zZWNvbmQtPm1SZWNlaXZlcikgeworICAgICAgICAgICAgZm91bmQtPnNlY29uZC0+bVN0YXR1cyA9IEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRlJPTTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6aGFuZGxlVHJhbnNmZXJSZXN1bHQoY29uc3QgQnVmZmVyU3RhdHVzTWVzc2FnZSAmbWVzc2FnZSkgeworICAgIGF1dG8gZm91bmQgPSBtVHJhbnNhY3Rpb25zLmZpbmQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICBpZiAoZm91bmQgIT0gbVRyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICBib29sIGRlbGV0ZWQgPSBlcmFzZSgmbVBlbmRpbmdUcmFuc2FjdGlvbnMsIG1lc3NhZ2UuY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQpOworICAgICAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICAgICAgaWYgKCFmb3VuZC0+c2Vjb25kLT5tU2VuZGVyVmFsaWRhdGVkKSB7CisgICAgICAgICAgICAgICAgbUNvbXBsZXRlZFRyYW5zYWN0aW9ucy5pbnNlcnQobWVzc2FnZS50cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQobWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICBpZiAobWVzc2FnZS5uZXdTdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9PSykgeworICAgICAgICAgICAgICAgIGhhbmRsZU93bkJ1ZmZlcihtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50LS07CisgICAgICAgICAgICBpZiAoYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwCisgICAgICAgICAgICAgICAgJiYgYnVmZmVySXRlci0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKCFidWZmZXJJdGVyLT5zZWNvbmQtPm1JbnZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbUZyZWVCdWZmZXJzLmluc2VydChtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtU3RhdHMub25CdWZmZXJVbnVzZWQoYnVmZmVySXRlci0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShidWZmZXJJdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbi5vbkJ1ZmZlckludmFsaWRhdGVkKG1lc3NhZ2UuYnVmZmVySWQsIG1JbnZhbGlkYXRpb25DaGFubmVsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtVHJhbnNhY3Rpb25zLmVyYXNlKGZvdW5kKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigidHJhbnNmZXIgZmluaXNoZWQgJWxsdSAldSAtICVkIiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgIG1lc3NhZ2UuYnVmZmVySWQsIGRlbGV0ZWQpOworICAgICAgICByZXR1cm4gZGVsZXRlZDsKKyAgICB9CisgICAgQUxPR1YoInRyYW5zZmVyIG5vdCBmb3VuZCAlbGx1ICV1IiwgKHVuc2lnbmVkIGxvbmcgbG9uZyltZXNzYWdlLnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpwcm9jZXNzU3RhdHVzTWVzc2FnZXMoKSB7CisgICAgc3RkOjp2ZWN0b3I8QnVmZmVyU3RhdHVzTWVzc2FnZT4gbWVzc2FnZXM7CisgICAgbU9ic2VydmVyLmdldEJ1ZmZlclN0YXR1c0NoYW5nZXMobWVzc2FnZXMpOworICAgIG1UaW1lc3RhbXBVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgIGZvciAoQnVmZmVyU3RhdHVzTWVzc2FnZSYgbWVzc2FnZTogbWVzc2FnZXMpIHsKKyAgICAgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICAgICAgc3dpdGNoIChtZXNzYWdlLm5ld1N0YXR1cykgeworICAgICAgICAgICAgY2FzZSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCwgbWVzc2FnZS5idWZmZXJJZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VVNFRDoKKyAgICAgICAgICAgICAgICAvLyBub3QgaGFwcGVuaW5nCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfVE86CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlVHJhbnNmZXJUbyhtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GUk9NOgorICAgICAgICAgICAgICAgIHJldCA9IGhhbmRsZVRyYW5zZmVyRnJvbShtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9USU1FT1VUOgorICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9MT1NUOgorICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9GRVRDSDoKKyAgICAgICAgICAgICAgICAvLyBub3QgaGFwcGVuaW5nCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfT0s6CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6VFJBTlNGRVJfRVJST1I6CisgICAgICAgICAgICAgICAgcmV0ID0gaGFuZGxlVHJhbnNmZXJSZXN1bHQobWVzc2FnZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEJ1ZmZlclN0YXR1czo6SU5WQUxJREFUSU9OX0FDSzoKKyAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uLm9uQWNrKG1lc3NhZ2UuY29ubmVjdGlvbklkLCBtZXNzYWdlLmJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgIEFMT0dXKCJidWZmZXIgc3RhdHVzIG1lc3NhZ2UgcHJvY2Vzc2luZyBmYWlsdXJlIC0gbWVzc2FnZSA6ICVkIGNvbm5lY3Rpb24gOiAlbGxkIiwKKyAgICAgICAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzLCAobG9uZyBsb25nKW1lc3NhZ2UuY29ubmVjdGlvbklkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtZXNzYWdlcy5jbGVhcigpOworfQorCitib29sIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjpoYW5kbGVDbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgLy8gQ2xlYW5pbmcgYnVmZmVycworICAgIGF1dG8gYnVmZmVycyA9IG1Vc2luZ0J1ZmZlcnMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChidWZmZXJzICE9IG1Vc2luZ0J1ZmZlcnMuZW5kKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBCdWZmZXJJZCYgYnVmZmVySWQgOiBidWZmZXJzLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIGJvb2wgZGVsZXRlZCA9IGVyYXNlKCZtVXNpbmdDb25uZWN0aW9ucywgYnVmZmVySWQsIGNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICBpZiAoZGVsZXRlZCkgeworICAgICAgICAgICAgICAgIGF1dG8gYnVmZmVySXRlciA9IG1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQtLTsKKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVySXRlci0+c2Vjb25kLT5tT3duZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGZyZWVidWZmZXIgaW5zZXJ0IGZhaWwKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFidWZmZXJJdGVyLT5zZWNvbmQtPm1JbnZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoYnVmZmVySXRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uLm9uQnVmZmVySW52YWxpZGF0ZWQoYnVmZmVySWQsIG1JbnZhbGlkYXRpb25DaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtVXNpbmdCdWZmZXJzLmVyYXNlKGJ1ZmZlcnMpOworICAgIH0KKworICAgIC8vIENsZWFuaW5nIHRyYW5zYWN0aW9ucworICAgIGF1dG8gcGVuZGluZyA9IG1QZW5kaW5nVHJhbnNhY3Rpb25zLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICBpZiAocGVuZGluZyAhPSBtUGVuZGluZ1RyYW5zYWN0aW9ucy5lbmQoKSkgeworICAgICAgICBmb3IgKGNvbnN0IFRyYW5zYWN0aW9uSWQmIHRyYW5zYWN0aW9uSWQgOiBwZW5kaW5nLT5zZWNvbmQpIHsKKyAgICAgICAgICAgIGF1dG8gaXRlciA9IG1UcmFuc2FjdGlvbnMuZmluZCh0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgIGlmIChpdGVyICE9IG1UcmFuc2FjdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWl0ZXItPnNlY29uZC0+bVNlbmRlclZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICBtQ29tcGxldGVkVHJhbnNhY3Rpb25zLmluc2VydCh0cmFuc2FjdGlvbklkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQgPSBpdGVyLT5zZWNvbmQtPm1CdWZmZXJJZDsKKyAgICAgICAgICAgICAgICBhdXRvIGJ1ZmZlckl0ZXIgPSBtQnVmZmVycy5maW5kKGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50LS07CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlckl0ZXItPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBidWZmZXJJdGVyLT5zZWNvbmQtPm1UcmFuc2FjdGlvbkNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaGFuZGxlIGZyZWVidWZmZXIgaW5zZXJ0IGZhaWwKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFidWZmZXJJdGVyLT5zZWNvbmQtPm1JbnZhbGlkYXRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyVW51c2VkKGJ1ZmZlckl0ZXItPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRnJlZUJ1ZmZlcnMuaW5zZXJ0KGJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlclVudXNlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChidWZmZXJJdGVyLT5zZWNvbmQtPm1BbGxvY1NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoYnVmZmVySXRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW52YWxpZGF0aW9uLm9uQnVmZmVySW52YWxpZGF0ZWQoYnVmZmVySWQsIG1JbnZhbGlkYXRpb25DaGFubmVsKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtVHJhbnNhY3Rpb25zLmVyYXNlKGl0ZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1Db25uZWN0aW9uSWRzLmVyYXNlKGNvbm5lY3Rpb25JZCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQWNjZXNzb3I6OkltcGw6OkJ1ZmZlclBvb2w6OmdldEZyZWVCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLCBCdWZmZXJJZCAqcElkLAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpIHsKKyAgICBhdXRvIGJ1ZmZlckl0ID0gbUZyZWVCdWZmZXJzLmJlZ2luKCk7CisgICAgZm9yICg7YnVmZmVySXQgIT0gbUZyZWVCdWZmZXJzLmVuZCgpOyArK2J1ZmZlckl0KSB7CisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkID0gKmJ1ZmZlckl0OworICAgICAgICBpZiAoYWxsb2NhdG9yLT5jb21wYXRpYmxlKHBhcmFtcywgbUJ1ZmZlcnNbYnVmZmVySWRdLT5tQ29uZmlnKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGJ1ZmZlckl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKSkgeworICAgICAgICBCdWZmZXJJZCBpZCA9ICpidWZmZXJJdDsKKyAgICAgICAgbUZyZWVCdWZmZXJzLmVyYXNlKGJ1ZmZlckl0KTsKKyAgICAgICAgbVN0YXRzLm9uQnVmZmVyUmVjeWNsZWQobUJ1ZmZlcnNbaWRdLT5tQWxsb2NTaXplKTsKKyAgICAgICAgKmhhbmRsZSA9IG1CdWZmZXJzW2lkXS0+aGFuZGxlKCk7CisgICAgICAgICpwSWQgPSBpZDsKKyAgICAgICAgQUxPR1YoInJlY3ljbGUgYSBidWZmZXIgJXUgJXAiLCBpZCwgKmhhbmRsZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK1Jlc3VsdFN0YXR1cyBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6YWRkTmV3QnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgQnVmZmVySWQgKnBJZCwKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90KiogaGFuZGxlKSB7CisKKyAgICBCdWZmZXJJZCBidWZmZXJJZCA9IG1TZXErKzsKKyAgICBpZiAobVNlcSA9PSBDb25uZWN0aW9uOjpTWU5DX0JVRkZFUklEKSB7CisgICAgICAgIG1TZXEgPSAwOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW50ZXJuYWxCdWZmZXI+IGJ1ZmZlciA9CisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEludGVybmFsQnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVySWQsIGFsbG9jLCBhbGxvY1NpemUsIHBhcmFtcyk7CisgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICBhdXRvIHJlcyA9IG1CdWZmZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgICBidWZmZXJJZCwgc3RkOjptb3ZlKGJ1ZmZlcikpKTsKKyAgICAgICAgaWYgKHJlcy5zZWNvbmQpIHsKKyAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckFsbG9jYXRlZChhbGxvY1NpemUpOworICAgICAgICAgICAgKmhhbmRsZSA9IGFsbG9jLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICpwSWQgPSBidWZmZXJJZDsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6Y2xlYW5VcChib29sIGNsZWFyQ2FjaGUpIHsKKyAgICBpZiAoY2xlYXJDYWNoZSB8fCBtVGltZXN0YW1wVXMgPiBtTGFzdENsZWFuVXBVcyArIGtDbGVhblVwRHVyYXRpb25VcykgeworICAgICAgICBtTGFzdENsZWFuVXBVcyA9IG1UaW1lc3RhbXBVczsKKyAgICAgICAgaWYgKG1UaW1lc3RhbXBVcyA+IG1MYXN0TG9nVXMgKyBrTG9nRHVyYXRpb25VcykgeworICAgICAgICAgICAgbUxhc3RMb2dVcyA9IG1UaW1lc3RhbXBVczsKKyAgICAgICAgICAgIEFMT0dEKCJidWZmZXJwb29sMiAlcCA6ICV6dSglenUgc2l6ZSkgdG90YWwgYnVmZmVycyAtICIKKyAgICAgICAgICAgICAgICAgICIlenUoJXp1IHNpemUpIHVzZWQgYnVmZmVycyAtICV6dS8lenUgKHJlY3ljbGUvYWxsb2MpIC0gIgorICAgICAgICAgICAgICAgICAgIiV6dS8lenUgKGZldGNoL3RyYW5zZmVyKSIsCisgICAgICAgICAgICAgICAgICB0aGlzLCBtU3RhdHMubUJ1ZmZlcnNDYWNoZWQsIG1TdGF0cy5tU2l6ZUNhY2hlZCwKKyAgICAgICAgICAgICAgICAgIG1TdGF0cy5tQnVmZmVyc0luVXNlLCBtU3RhdHMubVNpemVJblVzZSwKKyAgICAgICAgICAgICAgICAgIG1TdGF0cy5tVG90YWxSZWN5Y2xlcywgbVN0YXRzLm1Ub3RhbEFsbG9jYXRpb25zLAorICAgICAgICAgICAgICAgICAgbVN0YXRzLm1Ub3RhbEZldGNoZXMsIG1TdGF0cy5tVG90YWxUcmFuc2ZlcnMpOworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byBmcmVlSXQgPSBtRnJlZUJ1ZmZlcnMuYmVnaW4oKTsgZnJlZUl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKTspIHsKKyAgICAgICAgICAgIGlmICghY2xlYXJDYWNoZSAmJiAobVN0YXRzLm1TaXplQ2FjaGVkIDwga01pbkFsbG9jQnl0ZXNGb3JFdmljdGlvbgorICAgICAgICAgICAgICAgICAgICB8fCBtQnVmZmVycy5zaXplKCkgPCBrTWluQnVmZmVyQ291bnRGb3JFdmljdGlvbikpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gaXQgPSBtQnVmZmVycy5maW5kKCpmcmVlSXQpOworICAgICAgICAgICAgaWYgKGl0ICE9IG1CdWZmZXJzLmVuZCgpICYmCisgICAgICAgICAgICAgICAgICAgIGl0LT5zZWNvbmQtPm1Pd25lckNvdW50ID09IDAgJiYgaXQtPnNlY29uZC0+bVRyYW5zYWN0aW9uQ291bnQgPT0gMCkgeworICAgICAgICAgICAgICAgIG1TdGF0cy5vbkJ1ZmZlckV2aWN0ZWQoaXQtPnNlY29uZC0+bUFsbG9jU2l6ZSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGZyZWVJdCA9IG1GcmVlQnVmZmVycy5lcmFzZShmcmVlSXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICArK2ZyZWVJdDsKKyAgICAgICAgICAgICAgICBBTE9HVygiYnVmZmVycG9vbDIgaW5jb25zaXN0ZW50ISIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpCdWZmZXJQb29sOjppbnZhbGlkYXRlKAorICAgICAgICBib29sIG5lZWRzQWNrLCBCdWZmZXJJZCBmcm9tLCBCdWZmZXJJZCB0bywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCkgeworICAgIGZvciAoYXV0byBmcmVlSXQgPSBtRnJlZUJ1ZmZlcnMuYmVnaW4oKTsgZnJlZUl0ICE9IG1GcmVlQnVmZmVycy5lbmQoKTspIHsKKyAgICAgICAgaWYgKGlzQnVmZmVySW5SYW5nZShmcm9tLCB0bywgKmZyZWVJdCkpIHsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBtQnVmZmVycy5maW5kKCpmcmVlSXQpOworICAgICAgICAgICAgaWYgKGl0ICE9IG1CdWZmZXJzLmVuZCgpICYmCisgICAgICAgICAgICAgICAgaXQtPnNlY29uZC0+bU93bmVyQ291bnQgPT0gMCAmJiBpdC0+c2Vjb25kLT5tVHJhbnNhY3Rpb25Db3VudCA9PSAwKSB7CisgICAgICAgICAgICAgICAgbVN0YXRzLm9uQnVmZmVyRXZpY3RlZChpdC0+c2Vjb25kLT5tQWxsb2NTaXplKTsKKyAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgZnJlZUl0ID0gbUZyZWVCdWZmZXJzLmVyYXNlKGZyZWVJdCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJidWZmZXJwb29sMiBpbmNvbnNpc3RlbnQhIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKytmcmVlSXQ7CisgICAgfQorCisgICAgc2l6ZV90IGxlZnQgPSAwOworICAgIGZvciAoYXV0byBpdCA9IG1CdWZmZXJzLmJlZ2luKCk7IGl0ICE9IG1CdWZmZXJzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmIChpc0J1ZmZlckluUmFuZ2UoZnJvbSwgdG8sIGl0LT5maXJzdCkpIHsKKyAgICAgICAgICAgIGl0LT5zZWNvbmQtPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICsrbGVmdDsKKyAgICAgICAgfQorICAgIH0KKyAgICBtSW52YWxpZGF0aW9uLm9uSW52YWxpZGF0aW9uUmVxdWVzdChuZWVkc0FjaywgZnJvbSwgdG8sIGxlZnQsIG1JbnZhbGlkYXRpb25DaGFubmVsLCBpbXBsKTsKK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QnVmZmVyUG9vbDo6Zmx1c2goY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCkgeworICAgIEJ1ZmZlcklkIGZyb20gPSBtU3RhcnRTZXE7CisgICAgQnVmZmVySWQgdG8gPSBtU2VxOworICAgIG1TdGFydFNlcSA9IG1TZXE7CisgICAgLy8gVE9ETzogbmVlZHNBY2sgcGFyYW1zIAorICAgIEFMT0dWKCJidWZmZXIgaW52YWxpZGF0aW9uIHJlcXVlc3QgYnA6JXUgJXUgJXUiLCBtSW52YWxpZGF0aW9uLm1JZCwgZnJvbSwgdG8pOworICAgIGlmIChmcm9tICE9IHRvKSB7CisgICAgICAgIGludmFsaWRhdGUodHJ1ZSwgZnJvbSwgdG8sIGltcGwpOworICAgIH0KK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6aW52YWxpZGF0b3JUaHJlYWQoCisgICAgICAgICAgICBzdGQ6Om1hcDx1aW50MzJfdCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4+ICZhY2Nlc3NvcnMsCisgICAgICAgICAgICBzdGQ6Om11dGV4ICZtdXRleCwKKyAgICAgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlICZjdiwKKyAgICAgICAgICAgIGJvb2wgJnJlYWR5KSB7CisgICAgY29uc3RleHByIHVpbnQzMl90IE5VTV9TUElOX1RPX0lOQ1JFQVNFX1NMRUVQID0gMTAyNDsKKyAgICBjb25zdGV4cHIgdWludDMyX3QgTlVNX1NQSU5fVE9fTE9HID0gMTAyNCo4OworICAgIGNvbnN0ZXhwciB1c2Vjb25kc190IE1BWF9TTEVFUF9VUyA9IDEwMDAwOworICAgIHVpbnQzMl90IG51bVNwaW4gPSAwOworICAgIHVzZWNvbmRzX3Qgc2xlZXBVcyA9IDE7CisKKyAgICB3aGlsZSh0cnVlKSB7CisgICAgICAgIHN0ZDo6bWFwPHVpbnQzMl90LCBjb25zdCBzdGQ6OndlYWtfcHRyPEFjY2Vzc29yOjpJbXBsPj4gY29waWVkOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOworICAgICAgICAgICAgaWYgKCFyZWFkeSkgeworICAgICAgICAgICAgICAgIG51bVNwaW4gPSAwOworICAgICAgICAgICAgICAgIHNsZWVwVXMgPSAxOworICAgICAgICAgICAgICAgIGN2LndhaXQobG9jayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb3BpZWQuaW5zZXJ0KGFjY2Vzc29ycy5iZWdpbigpLCBhY2Nlc3NvcnMuZW5kKCkpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6bGlzdDxDb25uZWN0aW9uSWQ+IGVyYXNlZDsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gY29waWVkLmJlZ2luKCk7IGl0ICE9IGNvcGllZC5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiBpbXBsID0gaXQtPnNlY29uZC5sb2NrKCk7CisgICAgICAgICAgICBpZiAoIWltcGwpIHsKKyAgICAgICAgICAgICAgICBlcmFzZWQucHVzaF9iYWNrKGl0LT5maXJzdCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGltcGwtPmhhbmRsZUludmFsaWRhdGVBY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOworICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gZXJhc2VkLmJlZ2luKCk7IGl0ICE9IGVyYXNlZC5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgIGFjY2Vzc29ycy5lcmFzZSgqaXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFjY2Vzc29ycy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIHJlYWR5ID0gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFRPRE8gVXNlIGFuIGVmZmljaWVudCB3YXkgdG8gd2FpdCBvdmVyIEZNUS4KKyAgICAgICAgICAgICAgICAvLyBOLkIuIFNpbmNlIHRoZXJlIGlzIG5vdCBhIGVmZmljaWVudCB3YXkgdG8gd2FpdCBvdmVyIEZNUSwKKyAgICAgICAgICAgICAgICAvLyBwb2xsaW5nIG92ZXIgdGhlIEZNUSBpcyB0aGUgY3VycmVudCB3YXkgdG8gcHJldmVudCBkcmFpbmluZworICAgICAgICAgICAgICAgIC8vIENQVS4KKyAgICAgICAgICAgICAgICBsb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICsrbnVtU3BpbjsKKyAgICAgICAgICAgICAgICBpZiAobnVtU3BpbiAlIE5VTV9TUElOX1RPX0lOQ1JFQVNFX1NMRUVQID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgc2xlZXBVcyA8IE1BWF9TTEVFUF9VUykgeworICAgICAgICAgICAgICAgICAgICBzbGVlcFVzICo9IDEwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobnVtU3BpbiAlIE5VTV9TUElOX1RPX0xPRyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJpbnZhbGlkYXRvciB0aHJlYWQgc3Bpbm5pbmciKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgOjp1c2xlZXAoc2xlZXBVcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK0FjY2Vzc29yOjpJbXBsOjpBY2Nlc3NvckludmFsaWRhdG9yOjpBY2Nlc3NvckludmFsaWRhdG9yKCkgOiBtUmVhZHkoZmFsc2UpIHsKKyAgICBzdGQ6OnRocmVhZCBpbnZhbGlkYXRvcigKKyAgICAgICAgICAgIGludmFsaWRhdG9yVGhyZWFkLAorICAgICAgICAgICAgc3RkOjpyZWYobUFjY2Vzc29ycyksCisgICAgICAgICAgICBzdGQ6OnJlZihtTXV0ZXgpLAorICAgICAgICAgICAgc3RkOjpyZWYobUN2KSwKKyAgICAgICAgICAgIHN0ZDo6cmVmKG1SZWFkeSkpOworICAgIGludmFsaWRhdG9yLmRldGFjaCgpOworfQorCit2b2lkIEFjY2Vzc29yOjpJbXBsOjpBY2Nlc3NvckludmFsaWRhdG9yOjphZGRBY2Nlc3NvcigKKyAgICAgICAgdWludDMyX3QgYWNjZXNzb3JJZCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpIHsKKyAgICBib29sIG5vdGlmeSA9IGZhbHNlOworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIGlmIChtQWNjZXNzb3JzLmZpbmQoYWNjZXNzb3JJZCkgPT0gbUFjY2Vzc29ycy5lbmQoKSkgeworICAgICAgICBpZiAoIW1SZWFkeSkgeworICAgICAgICAgICAgbVJlYWR5ID0gdHJ1ZTsKKyAgICAgICAgICAgIG5vdGlmeSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbUFjY2Vzc29ycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoYWNjZXNzb3JJZCwgaW1wbCkpOworICAgICAgICBBTE9HVigiYnVmZmVyIGludmFsaWRhdGlvbiBhZGRlZCBicDoldSAlZCIsIGFjY2Vzc29ySWQsIG5vdGlmeSk7CisgICAgfQorICAgIGxvY2sudW5sb2NrKCk7CisgICAgaWYgKG5vdGlmeSkgeworICAgICAgICBtQ3Yubm90aWZ5X29uZSgpOworICAgIH0KK30KKwordm9pZCBBY2Nlc3Nvcjo6SW1wbDo6QWNjZXNzb3JJbnZhbGlkYXRvcjo6ZGVsQWNjZXNzb3IodWludDMyX3QgYWNjZXNzb3JJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgbUFjY2Vzc29ycy5lcmFzZShhY2Nlc3NvcklkKTsKKyAgICBBTE9HVigiYnVmZmVyIGludmFsaWRhdGlvbiBkZWxldGVkIGJwOiV1IiwgYWNjZXNzb3JJZCk7CisgICAgaWYgKG1BY2Nlc3NvcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgbVJlYWR5ID0gZmFsc2U7CisgICAgfQorfQorCitzdGQ6OnVuaXF1ZV9wdHI8QWNjZXNzb3I6OkltcGw6OkFjY2Vzc29ySW52YWxpZGF0b3I+IEFjY2Vzc29yOjpJbXBsOjpzSW52YWxpZGF0b3I7CisKK3ZvaWQgQWNjZXNzb3I6OkltcGw6OmNyZWF0ZUludmFsaWRhdG9yKCkgeworICAgIGlmICghc0ludmFsaWRhdG9yKSB7CisgICAgICAgIHNJbnZhbGlkYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QWNjZXNzb3I6OkltcGw6OkFjY2Vzc29ySW52YWxpZGF0b3I+KCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0FjY2Vzc29ySW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwN2UwZjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9BY2Nlc3NvckltcGwuaApAQCAtMCwwICsxLDQwMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQUNDRVNTT1JJTVBMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQUNDRVNTT1JJTVBMX0gKKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworc3RydWN0IEludGVybmFsQnVmZmVyOworc3RydWN0IFRyYW5zYWN0aW9uU3RhdHVzOworCisvKioKKyAqIEFuIGltcGxlbWVudGF0aW9uIG9mIGEgYnVmZmVyIHBvb2wgYWNjZXNzb3Iob3IgYSBidWZmZXIgcG9vbCBpbXBsZW1lbnRhdGlvbi4pICovCitjbGFzcyBBY2Nlc3Nvcjo6SW1wbAorICAgIDogcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QWNjZXNzb3I6OkltcGw+IHsKK3B1YmxpYzoKKyAgICBJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yKTsKKworICAgIH5JbXBsKCk7CisKKyAgICBSZXN1bHRTdGF0dXMgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyLAorICAgICAgICAgICAgc3A8Q29ubmVjdGlvbj4gKmNvbm5lY3Rpb24sCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQsCisgICAgICAgICAgICB1aW50MzJfdCAqcE1zZ0lkLAorICAgICAgICAgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvcioqIHN0YXR1c0Rlc2NQdHIsCisgICAgICAgICAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yKiogaW52RGVzY1B0cik7CisKKyAgICBSZXN1bHRTdGF0dXMgY2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QqKiBoYW5kbGUpOworCisgICAgUmVzdWx0U3RhdHVzIGZldGNoKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSk7CisKKyAgICB2b2lkIGZsdXNoKCk7CisKKyAgICB2b2lkIGNsZWFuVXAoYm9vbCBjbGVhckNhY2hlKTsKKworICAgIGJvb2wgaXNWYWxpZCgpOworCisgICAgdm9pZCBoYW5kbGVJbnZhbGlkYXRlQWNrKCk7CisKKyAgICBzdGF0aWMgdm9pZCBjcmVhdGVJbnZhbGlkYXRvcigpOworCitwcml2YXRlOgorICAgIC8vIENvbm5lY3Rpb25JZCA9IHBpZCA6ICh0aW1lc3RhbXBfY3JlYXRlZCArIHNlcUlkKQorICAgIC8vIGluIG9yZGVyIHRvIGd1YXJhbnRlZSB1bmlxdWVuZXNzIGZvciBlYWNoIGNvbm5lY3Rpb24KKyAgICBzdGF0aWMgdWludDMyX3Qgc1NlcUlkOworICAgIHN0YXRpYyBpbnQzMl90IHNQaWQ7CisKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciBwb29sIGltcGxlbWVudGF0aW9uLgorICAgICAqCisgICAgICogSGFuZGxlcyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzLiBIYW5kbGVzIGJ1ZmZlciBhbGxvY2F0aW9uL3JlY3ljbGluZy4KKyAgICAgKiBIYW5kbGVzIGJ1ZmZlciB0cmFuc2ZlciBiZXR3ZWVuIGJ1ZmZlciBwb29sIGNsaWVudHMuCisgICAgICovCisgICAgc3RydWN0IEJ1ZmZlclBvb2wgeworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OworICAgICAgICBpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICAgICAgaW50NjRfdCBtTGFzdENsZWFuVXBVczsKKyAgICAgICAgaW50NjRfdCBtTGFzdExvZ1VzOworICAgICAgICBCdWZmZXJJZCBtU2VxOworICAgICAgICBCdWZmZXJJZCBtU3RhcnRTZXE7CisgICAgICAgIGJvb2wgbVZhbGlkOworICAgICAgICBCdWZmZXJTdGF0dXNPYnNlcnZlciBtT2JzZXJ2ZXI7CisgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwgbUludmFsaWRhdGlvbkNoYW5uZWw7CisKKyAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBzdGQ6OnNldDxCdWZmZXJJZD4+IG1Vc2luZ0J1ZmZlcnM7CisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnNldDxDb25uZWN0aW9uSWQ+PiBtVXNpbmdDb25uZWN0aW9uczsKKworICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHN0ZDo6c2V0PFRyYW5zYWN0aW9uSWQ+PiBtUGVuZGluZ1RyYW5zYWN0aW9uczsKKyAgICAgICAgLy8gVHJhbnNhY3Rpb25zIGNvbXBsZXRlZCBiZWZvcmUgVFJBTlNGRVJfVE8gbWVzc2FnZSBhcnJpdmFsLgorICAgICAgICAvLyBGZXRjaCBkb2VzIG5vdCBvY2N1ciBmb3IgdGhlIHRyYW5zYWN0aW9ucy4KKyAgICAgICAgLy8gT25seSB0cmFuc2FjdGlvbiBpZCBpcyBrZXB0IGZvciB0aGUgdHJhbnNhY3Rpb25zIGluIHNob3J0IGR1cmF0aW9uLgorICAgICAgICBzdGQ6OnNldDxUcmFuc2FjdGlvbklkPiBtQ29tcGxldGVkVHJhbnNhY3Rpb25zOworICAgICAgICAvLyBDdXJyZW50bHkgYWN0aXZlKHBlbmRpbmcpIHRyYW5zYXRpb25zJyBzdGF0dXMgJiBpbmZvcm1hdGlvbi4KKyAgICAgICAgc3RkOjptYXA8VHJhbnNhY3Rpb25JZCwgc3RkOjp1bmlxdWVfcHRyPFRyYW5zYWN0aW9uU3RhdHVzPj4KKyAgICAgICAgICAgICAgICBtVHJhbnNhY3Rpb25zOworCisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnVuaXF1ZV9wdHI8SW50ZXJuYWxCdWZmZXI+PiBtQnVmZmVyczsKKyAgICAgICAgc3RkOjpzZXQ8QnVmZmVySWQ+IG1GcmVlQnVmZmVyczsKKyAgICAgICAgc3RkOjpzZXQ8Q29ubmVjdGlvbklkPiBtQ29ubmVjdGlvbklkczsKKworICAgICAgICBzdHJ1Y3QgSW52YWxpZGF0aW9uIHsKKyAgICAgICAgICAgIHN0YXRpYyBzdGQ6OmF0b21pYzxzdGQ6OnVpbnQzMl90PiBzSW52U2VxSWQ7CisKKyAgICAgICAgICAgIHN0cnVjdCBQZW5kaW5nIHsKKyAgICAgICAgICAgICAgICBib29sIG1OZWVkc0FjazsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtRnJvbTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBtVG87CisgICAgICAgICAgICAgICAgc2l6ZV90IG1MZWZ0OworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+IG1JbXBsOworICAgICAgICAgICAgICAgIFBlbmRpbmcoYm9vbCBuZWVkc0FjaywgdWludDMyX3QgZnJvbSwgdWludDMyX3QgdG8sIHNpemVfdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEFjY2Vzc29yOjpJbXBsPiAmaW1wbCkKKyAgICAgICAgICAgICAgICAgICAgICAgIDogbU5lZWRzQWNrKG5lZWRzQWNrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUZyb20oZnJvbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1Ubyh0byksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1MZWZ0KGxlZnQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtSW1wbChpbXBsKQorICAgICAgICAgICAgICAgIHt9CisKKyAgICAgICAgICAgICAgICBib29sIGlzSW52YWxpZGF0ZWQodWludDMyX3QgYnVmZmVySWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzQnVmZmVySW5SYW5nZShtRnJvbSwgbVRvLCBidWZmZXJJZCkgJiYgLS1tTGVmdCA9PSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxQZW5kaW5nPiBtUGVuZGluZ3M7CisgICAgICAgICAgICBzdGQ6Om1hcDxDb25uZWN0aW9uSWQsIHVpbnQzMl90PiBtQWNrczsKKyAgICAgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3A8SU9ic2VydmVyPj4gbU9ic2VydmVyczsKKyAgICAgICAgICAgIHVpbnQzMl90IG1JbnZhbGlkYXRpb25JZDsKKyAgICAgICAgICAgIHVpbnQzMl90IG1JZDsKKworICAgICAgICAgICAgSW52YWxpZGF0aW9uKCkgOiBtSW52YWxpZGF0aW9uSWQoMCksIG1JZChzSW52U2VxSWQuZmV0Y2hfYWRkKDEpKSB7fQorCisgICAgICAgICAgICB2b2lkIG9uQ29ubmVjdChDb25uZWN0aW9uSWQgY29uSWQsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKTsKKworICAgICAgICAgICAgdm9pZCBvbkNsb3NlKENvbm5lY3Rpb25JZCBjb25JZCk7CisKKyAgICAgICAgICAgIHZvaWQgb25BY2soQ29ubmVjdGlvbklkIGNvbklkLCB1aW50MzJfdCBtc2dJZCk7CisKKyAgICAgICAgICAgIHZvaWQgb25CdWZmZXJJbnZhbGlkYXRlZCgKKyAgICAgICAgICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwgJmNoYW5uZWwpOworCisgICAgICAgICAgICB2b2lkIG9uSW52YWxpZGF0aW9uUmVxdWVzdCgKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBuZWVkc0FjaywgdWludDMyX3QgZnJvbSwgdWludDMyX3QgdG8sIHNpemVfdCBsZWZ0LAorICAgICAgICAgICAgICAgICAgICBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsICZjaGFubmVsLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKTsKKworICAgICAgICAgICAgdm9pZCBvbkhhbmRsZUFjaygKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBjb25zdCBzcDxJT2JzZXJ2ZXI+PiAqb2JzZXJ2ZXJzLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqaW52YWxpZGF0aW9uSWQpOworICAgICAgICB9IG1JbnZhbGlkYXRpb247CisgICAgICAgIC8vLyBCdWZmZXIgcG9vbCBzdGF0aXN0aWNzIHdoaWNoIHRyYWNrcyBhbGxvY2F0aW9uIGFuZCB0cmFuc2ZlciBzdGF0aXN0aWNzLgorICAgICAgICBzdHJ1Y3QgU3RhdHMgeworICAgICAgICAgICAgLy8vIFRvdGFsIHNpemUgb2YgYWxsb2NhdGlvbnMgd2hpY2ggYXJlIHVzZWQgb3IgYXZhaWxhYmxlIHRvIHVzZS4KKyAgICAgICAgICAgIC8vLyAoYnl0ZXMgb3IgcGl4ZWxzKQorICAgICAgICAgICAgc2l6ZV90IG1TaXplQ2FjaGVkOworICAgICAgICAgICAgLy8vICMgb2YgY2FjaGVkIGJ1ZmZlcnMgd2hpY2ggYXJlIHVzZWQgb3IgYXZhaWxhYmxlIHRvIHVzZS4KKyAgICAgICAgICAgIHNpemVfdCBtQnVmZmVyc0NhY2hlZDsKKyAgICAgICAgICAgIC8vLyBUb3RhbCBzaXplIG9mIGFsbG9jYXRpb25zIHdoaWNoIGFyZSBjdXJyZW50bHkgdXNlZC4gKGJ5dGVzIG9yIHBpeGVscykKKyAgICAgICAgICAgIHNpemVfdCBtU2l6ZUluVXNlOworICAgICAgICAgICAgLy8vICMgb2YgY3VycmVudGx5IHVzZWQgYnVmZmVycworICAgICAgICAgICAgc2l6ZV90IG1CdWZmZXJzSW5Vc2U7CisKKyAgICAgICAgICAgIC8vLyAjIG9mIGFsbG9jYXRpb25zIGNhbGxlZCBvbiBidWZmZXJwb29sLiAoIyBvZiBmZXRjaGVkIGZyb20gQmxvY2tQb29sKQorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbEFsbG9jYXRpb25zOworICAgICAgICAgICAgLy8vICMgb2YgYWxsb2NhdGlvbnMgdGhhdCB3ZXJlIHNlcnZlZCBmcm9tIHRoZSBjYWNoZS4KKyAgICAgICAgICAgIC8vLyAoIyBvZiBhbGxvY2F0b3IgYWxsb2MgcHJldmVudGVkKQorICAgICAgICAgICAgc2l6ZV90IG1Ub3RhbFJlY3ljbGVzOworICAgICAgICAgICAgLy8vICMgb2YgYnVmZmVyIHRyYW5zZmVycyBpbml0aWF0ZWQuCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsVHJhbnNmZXJzOworICAgICAgICAgICAgLy8vICMgb2YgdHJhbnNmZXJzIHRoYXQgaGFkIHRvIGJlIGZldGNoZWQuCisgICAgICAgICAgICBzaXplX3QgbVRvdGFsRmV0Y2hlczsKKworICAgICAgICAgICAgU3RhdHMoKQorICAgICAgICAgICAgICAgIDogbVNpemVDYWNoZWQoMCksIG1CdWZmZXJzQ2FjaGVkKDApLCBtU2l6ZUluVXNlKDApLCBtQnVmZmVyc0luVXNlKDApLAorICAgICAgICAgICAgICAgICAgbVRvdGFsQWxsb2NhdGlvbnMoMCksIG1Ub3RhbFJlY3ljbGVzKDApLCBtVG90YWxUcmFuc2ZlcnMoMCksIG1Ub3RhbEZldGNoZXMoMCkge30KKworICAgICAgICAgICAgLy8vIEEgbmV3IGJ1ZmZlciBpcyBhbGxvY2F0ZWQgb24gYW4gYWxsb2NhdGlvbiByZXF1ZXN0LgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckFsbG9jYXRlZChzaXplX3QgYWxsb2NTaXplKSB7CisgICAgICAgICAgICAgICAgbVNpemVDYWNoZWQgKz0gYWxsb2NTaXplOworICAgICAgICAgICAgICAgIG1CdWZmZXJzQ2FjaGVkKys7CisKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlKys7CisKKyAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucysrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgZXZpY3RlZCBhbmQgZGVzdHJveWVkLgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlckV2aWN0ZWQoc2l6ZV90IGFsbG9jU2l6ZSkgeworICAgICAgICAgICAgICAgIG1TaXplQ2FjaGVkIC09IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0NhY2hlZC0tOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLy8gQSBidWZmZXIgaXMgcmVjeWNsZWQgb24gYW4gYWxsb2NhdGlvbiByZXF1ZXN0LgorICAgICAgICAgICAgdm9pZCBvbkJ1ZmZlclJlY3ljbGVkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlICs9IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlKys7CisKKyAgICAgICAgICAgICAgICBtVG90YWxBbGxvY2F0aW9ucysrOworICAgICAgICAgICAgICAgIG1Ub3RhbFJlY3ljbGVzKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciBpcyBhdmFpbGFibGUgdG8gYmUgcmVjeWNsZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyVW51c2VkKHNpemVfdCBhbGxvY1NpemUpIHsKKyAgICAgICAgICAgICAgICBtU2l6ZUluVXNlIC09IGFsbG9jU2l6ZTsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc0luVXNlLS07CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vLyBBIGJ1ZmZlciB0cmFuc2ZlciBpcyBpbml0aWF0ZWQuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyU2VudCgpIHsKKyAgICAgICAgICAgICAgICBtVG90YWxUcmFuc2ZlcnMrKzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8vIEEgYnVmZmVyIGZldGNoIGlzIGludm9rZWQgYnkgYSBidWZmZXIgdHJhbnNmZXIuCisgICAgICAgICAgICB2b2lkIG9uQnVmZmVyRmV0Y2hlZCgpIHsKKyAgICAgICAgICAgICAgICBtVG90YWxGZXRjaGVzKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0gbVN0YXRzOworCisgICAgICAgIGJvb2wgaXNWYWxpZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBtVmFsaWQ7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIGludmFsaWRhdGUoYm9vbCBuZWVkc0FjaywgQnVmZmVySWQgZnJvbSwgQnVmZmVySWQgdG8sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWNjZXNzb3I6OkltcGw+ICZpbXBsKTsKKworICAgICAgICBzdGF0aWMgdm9pZCBjcmVhdGVJbnZhbGlkYXRvcigpOworCisgICAgcHVibGljOgorICAgICAgICAvKiogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sLiAqLworICAgICAgICBCdWZmZXJQb29sKCk7CisKKyAgICAgICAgLyoqIERlc3Ryb3lzIGEgYnVmZmVyIHBvb2wuICovCisgICAgICAgIH5CdWZmZXJQb29sKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyBhbGwgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICAgICAgICAgKiBFYWNoIHN0YXR1cyBtZXNzYWdlIGlzIGhhbmRsZWQgYnkgbWV0aG9kcyB3aXRoICdoYW5kbGUnIHByZWZpeC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgcHJvY2Vzc1N0YXR1c01lc3NhZ2VzKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSBidWZmZXIgYmVpbmcgb3duZWQgYnkgYSBjb25uZWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICB0aGUgaWQgb2YgdGhlIGJ1ZmZlciBvd25pbmcgY29ubmVjdGlvbi4KKyAgICAgICAgICogQHBhcmFtIGJ1ZmZlcklkICAgICAgdGhlIGlkIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGJ1ZmZlciBpcyBvd25lZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlT3duQnVmZmVyKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogSGFuZGxlcyBhIGJ1ZmZlciBiZWluZyByZWxlYXNlZCBieSBhIGNvbm5lY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgYnVmZmVyIG93bmluZyBjb25uZWN0aW9uLgorICAgICAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICB0aGUgaWQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgYnVmZmVyIG93bmVyc2hpcCBpcyByZWxlYXNlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlUmVsZWFzZUJ1ZmZlcihDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEhhbmRsZXMgYSB0cmFuc2ZlciB0cmFuc2FjdGlvbiBzdGFydCBtZXNzYWdlIGZyb20gdGhlIHNlbmRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgICBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBmb3IgdGhlIHRyYW5zYWN0aW9uLgorICAgICAgICAgKgorICAgICAgICAgKiBAcmVzdWx0IHtAY29kZSB0cnVlfSB3aGVuIHRyYW5zZmVyX3RvIG1lc3NhZ2UgaXMgYWNrbm93bGVkZ2VkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVUcmFuc2ZlclRvKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gYmVpbmcgYWNrZWQgYnkgdGhlIHJlY2VpdmVyLgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gbWVzc2FnZSAgIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIGZvciB0aGUgdHJhbnNhY3Rpb24uCisgICAgICAgICAqCisgICAgICAgICAqIEByZXN1bHQge0Bjb2RlIHRydWV9IHdoZW4gdHJhbnNmZXJfZnJvbSBtZXNzYWdlIGlzIGFja25vd2xlZGdlZCwKKyAgICAgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgaGFuZGxlVHJhbnNmZXJGcm9tKGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgdHJhbnNmZXIgdHJhbnNhY3Rpb24gcmVzdWx0IG1lc3NhZ2UgZnJvbSB0aGUgcmVjZWl2ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBtZXNzYWdlICAgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgZXhpc2l0bmcgdHJhbnNhY3Rpb24gaXMgZmluaXNoZWQsCisgICAgICAgICAqICAgICAgICAge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICAgICAqLworICAgICAgICBib29sIGhhbmRsZVRyYW5zZmVyUmVzdWx0KGNvbnN0IEJ1ZmZlclN0YXR1c01lc3NhZ2UgJm1lc3NhZ2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5kbGVzIGEgY29ubmVjdGlvbiBiZWluZyBjbG9zZWQsIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuIEFsbCB0aGUKKyAgICAgICAgICogYnVmZmVycyBhbmQgdHJhbnNhY3Rpb25zIG93bmVkIGJ5IHRoZSBjb25uZWN0aW9uIHdpbGwgYmUgY2xlYW5lZCB1cC4KKyAgICAgICAgICogVGhlIHJlbGF0ZWQgRk1RIHdpbGwgYmUgY2xlYW5lZCB1cCB0b28uCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIHRoZSBpZCBvZiB0aGUgY29ubmVjdGlvbi4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJlc3VsdCB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgY29ubmVjdGlvbiBleGlzdGVkLAorICAgICAgICAgKiAgICAgICAgIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgYm9vbCBoYW5kbGVDbG9zZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUmVjeWNsZXMgYSBleGlzdGluZyBmcmVlIGJ1ZmZlciBpZiBpdCBpcyBwb3NzaWJsZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGFsbG9jYXRvciB0aGUgYnVmZmVyIGFsbG9jYXRvcgorICAgICAgICAgKiBAcGFyYW0gcGFyYW1zICAgIHRoZSBhbGxvY2F0aW9uIHBhcmFtZXRlcnMuCisgICAgICAgICAqIEBwYXJhbSBwSWQgICAgICAgdGhlIGlkIG9mIHRoZSByZWN5Y2xlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBoYW5kbGUgICAgdGhlIG5hdGl2ZSBoYW5kbGUgb2YgdGhlIHJlY3ljbGVkIGJ1ZmZlci4KKyAgICAgICAgICoKKyAgICAgICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gd2hlbiBhIGJ1ZmZlciBpcyByZWN5Y2xlZCwge0Bjb2RlIGZhbHNlfQorICAgICAgICAgKiAgICAgICAgIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIGJvb2wgZ2V0RnJlZUJ1ZmZlcigKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRvcj4gJmFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpwSWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEFkZHMgYSBuZXdseSBhbGxvY2F0ZWQgYnVmZmVyIHRvIGJ1ZmZlcnBvb2wuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBhbGxvYyAgICAgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBhbGxvY1NpemUgdGhlIHNpemUgb2YgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqIEBwYXJhbSBwYXJhbXMgICAgdGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgICAgICogQHBhcmFtIHBJZCAgICAgICB0aGUgYnVmZmVyIGlkIGZvciB0aGUgbmV3bHkgYWxsb2NhdGVkIGJ1ZmZlci4KKyAgICAgICAgICogQHBhcmFtIGhhbmRsZSAgICB0aGUgbmF0aXZlIGhhbmRsZSBmb3IgdGhlIG5ld2x5IGFsbG9jYXRlZCBidWZmZXIuCisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gT0sgd2hlbiBhbiBhbGxvY2F0aW9uIGlzIHN1Y2Nlc3NmdWxseSBhbGxvY2F0ZWQuCisgICAgICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgICAgICovCisgICAgICAgIFJlc3VsdFN0YXR1cyBhZGROZXdCdWZmZXIoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGFsbG9jU2l6ZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIEJ1ZmZlcklkICpwSWQsCisgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogUHJvY2Vzc2VzIHBlbmRpbmcgYnVmZmVyIHN0YXR1cyBtZXNzYWdlcyBhbmQgcGVyZm9ybXMgcGVyaW9kaWMgY2FjaGUKKyAgICAgICAgICogY2xlYW5pbmcuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjbGVhckNhY2hlICAgIGlmIGNsZWFyQ2FjaGUgaXMgdHJ1ZSwgaXQgZnJlZXMgYWxsIGJ1ZmZlcnMKKyAgICAgICAgICogICAgICAgICAgICAgICAgICAgICAgd2FpdGluZyB0byBiZSByZWN5Y2xlZC4KKyAgICAgICAgICovCisgICAgICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFByb2Nlc3NlcyBwZW5kaW5nIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZXMgYW5kIGludmFsaWRhdGUgYWxsIGN1cnJlbnQKKyAgICAgICAgICogZnJlZSBidWZmZXJzLiBBY3RpdmUgYnVmZmVycyBhcmUgaW52YWxpZGF0ZWQgYWZ0ZXIgYmVpbmcgaW5hY3RpdmUuCisgICAgICAgICAqLworICAgICAgICB2b2lkIGZsdXNoKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpOworCisgICAgICAgIGZyaWVuZCBjbGFzcyBBY2Nlc3Nvcjo6SW1wbDsKKyAgICB9IG1CdWZmZXJQb29sOworCisgICAgc3RydWN0ICBBY2Nlc3NvckludmFsaWRhdG9yIHsKKyAgICAgICAgc3RkOjptYXA8dWludDMyX3QsIGNvbnN0IHN0ZDo6d2Vha19wdHI8QWNjZXNzb3I6OkltcGw+PiBtQWNjZXNzb3JzOworICAgICAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICAgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbUN2OworICAgICAgICBib29sIG1SZWFkeTsKKworICAgICAgICBBY2Nlc3NvckludmFsaWRhdG9yKCk7CisgICAgICAgIHZvaWQgYWRkQWNjZXNzb3IodWludDMyX3QgYWNjZXNzb3JJZCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4gJmltcGwpOworICAgICAgICB2b2lkIGRlbEFjY2Vzc29yKHVpbnQzMl90IGFjY2Vzc29ySWQpOworICAgIH07CisKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEFjY2Vzc29ySW52YWxpZGF0b3I+IHNJbnZhbGlkYXRvcjsKKworICAgIHN0YXRpYyB2b2lkIGludmFsaWRhdG9yVGhyZWFkKAorICAgICAgICBzdGQ6Om1hcDx1aW50MzJfdCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxBY2Nlc3Nvcjo6SW1wbD4+ICZhY2Nlc3NvcnMsCisgICAgICAgIHN0ZDo6bXV0ZXggJm11dGV4LAorICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSAmY3YsCisgICAgICAgIGJvb2wgJnJlYWR5KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSB1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0FDQ0VTU09SSU1QTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9BbmRyb2lkLmJwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2YxMTRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ3IEBACitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wLWRlZmF1bHQiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIkFjY2Vzc29yLmNwcCIsCisgICAgICAgICJBY2Nlc3NvckltcGwuY3BwIiwKKyAgICAgICAgIkJ1ZmZlclBvb2xDbGllbnQuY3BwIiwKKyAgICAgICAgIkJ1ZmZlclN0YXR1cy5jcHAiLAorICAgICAgICAiQ2xpZW50TWFuYWdlci5jcHAiLAorICAgICAgICAiQ29ubmVjdGlvbi5jcHAiLAorICAgICAgICAiT2JzZXJ2ZXIuY3BwIiwKKyAgICBdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgIF0sCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliZm1xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMC4xIiwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMC1kZWZhdWx0Il0sCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EQlVGRkVSUE9PTF9DTE9ORV9IQU5ETEVTIiwKKyAgICBdLAorfQorCisvLyBEZXByZWNhdGVkLiBEbyBub3QgdXNlLiBVc2UgbGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAuMSBpbnN0ZWFkLgorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wIiwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMC1kZWZhdWx0Il0sCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDJmZWY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5jcHAKQEAgLTAsMCArMSw4NjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xDbGllbnQiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSAiQnVmZmVyUG9vbENsaWVudC5oIgorI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga1JlY2VpdmVUaW1lb3V0VXMgPSAxMDAwMDAwOyAvLyAxMDBtcworc3RhdGljIGNvbnN0ZXhwciBpbnQga1Bvc3RNYXhSZXRyeSA9IDM7CitzdGF0aWMgY29uc3RleHByIGludCBrQ2FjaGVUdGxVcyA9IDEwMDAwMDA7IC8vIFRPRE86IHR1bmUKKworY2xhc3MgQnVmZmVyUG9vbENsaWVudDo6SW1wbAorICAgICAgICA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbXBsKGNvbnN0IHNwPEFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKTsKKworICAgIGV4cGxpY2l0IEltcGwoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsIGNvbnN0IHNwPElPYnNlcnZlcj4gJm9ic2VydmVyKTsKKworICAgIGJvb2wgaXNWYWxpZCgpIHsKKyAgICAgICAgcmV0dXJuIG1WYWxpZDsKKyAgICB9CisKKyAgICBib29sIGlzTG9jYWwoKSB7CisgICAgICAgIHJldHVybiBtVmFsaWQgJiYgbUxvY2FsOworICAgIH0KKworICAgIENvbm5lY3Rpb25JZCBnZXRDb25uZWN0aW9uSWQoKSB7CisgICAgICAgIHJldHVybiBtQ29ubmVjdGlvbklkOworICAgIH0KKworICAgIHNwPElBY2Nlc3Nvcj4gJmdldEFjY2Vzc29yKCkgeworICAgICAgICByZXR1cm4gbUFjY2Vzc29yOworICAgIH0KKworICAgIGJvb2wgaXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICB2b2lkIHJlY2VpdmVJbnZhbGlkYXRpb24odWludDMyX3QgbXNnSUQpOworCisgICAgUmVzdWx0U3RhdHVzIGZsdXNoKCk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHJlY2VpdmUoCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBVcywKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIHZvaWQgcG9zdEJ1ZmZlclJlbGVhc2UoQnVmZmVySWQgYnVmZmVySWQpOworCisgICAgYm9vbCBwb3N0U2VuZCgKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBDb25uZWN0aW9uSWQgcmVjZWl2ZXIsCisgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7Citwcml2YXRlOgorCisgICAgYm9vbCBwb3N0UmVjZWl2ZSgKKyAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzKTsKKworICAgIGJvb2wgcG9zdFJlY2VpdmVSZXN1bHQoCisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBib29sIHJlc3VsdCwgYm9vbCAqbmVlZHNTeW5jKTsKKworICAgIHZvaWQgdHJ5U3luY0Zyb21SZW1vdGUoKTsKKworICAgIGJvb2wgc3luY1JlbGVhc2VkKHVpbnQzMl90IG1zZ0lkID0gMCk7CisKKyAgICB2b2lkIGV2aWN0Q2FjaGVzKGJvb2wgY2xlYXJDYWNoZSA9IGZhbHNlKTsKKworICAgIHZvaWQgaW52YWxpZGF0ZUJ1ZmZlcihCdWZmZXJJZCBpZCk7CisKKyAgICB2b2lkIGludmFsaWRhdGVSYW5nZShCdWZmZXJJZCBmcm9tLCBCdWZmZXJJZCB0byk7CisKKyAgICBSZXN1bHRTdGF0dXMgYWxsb2NhdGVCdWZmZXJIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLCBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCisgICAgUmVzdWx0U3RhdHVzIGZldGNoQnVmZmVySGFuZGxlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICBzdHJ1Y3QgQmxvY2tQb29sRGF0YUR0b3I7CisgICAgc3RydWN0IENsaWVudEJ1ZmZlcjsKKworICAgIGJvb2wgbUxvY2FsOworICAgIGJvb2wgbVZhbGlkOworICAgIHNwPElBY2Nlc3Nvcj4gbUFjY2Vzc29yOworICAgIHNwPENvbm5lY3Rpb24+IG1Mb2NhbENvbm5lY3Rpb247CisgICAgc3A8SUNvbm5lY3Rpb24+IG1SZW1vdGVDb25uZWN0aW9uOworICAgIHVpbnQzMl90IG1TZXFJZDsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgICBpbnQ2NF90IG1MYXN0RXZpY3RDYWNoZVVzOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcj4gbUludmFsaWRhdGlvbkxpc3RlbmVyOworCisgICAgLy8gQ2FjaGVkQnVmZmVycworICAgIHN0cnVjdCBCdWZmZXJDYWNoZSB7CisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIGJvb2wgbUNyZWF0aW5nOworICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtQ3JlYXRlQ3Y7CisgICAgICAgIHN0ZDo6bWFwPEJ1ZmZlcklkLCBzdGQ6OnVuaXF1ZV9wdHI8Q2xpZW50QnVmZmVyPj4gbUJ1ZmZlcnM7CisgICAgICAgIGludCBtQWN0aXZlOworICAgICAgICBpbnQ2NF90IG1MYXN0Q2hhbmdlVXM7CisKKyAgICAgICAgQnVmZmVyQ2FjaGUoKSA6IG1DcmVhdGluZyhmYWxzZSksIG1BY3RpdmUoMCksIG1MYXN0Q2hhbmdlVXMoZ2V0VGltZXN0YW1wTm93KCkpIHt9CisKKyAgICAgICAgdm9pZCBpbmNBY3RpdmVfbCgpIHsKKyAgICAgICAgICAgICsrbUFjdGl2ZTsKKyAgICAgICAgICAgIG1MYXN0Q2hhbmdlVXMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgZGVjQWN0aXZlX2woKSB7CisgICAgICAgICAgICAtLW1BY3RpdmU7CisgICAgICAgICAgICBtTGFzdENoYW5nZVVzID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgICAgIH0KKyAgICB9IG1DYWNoZTsKKworICAgIC8vIEZNUSAtIHJlbGVhc2Ugbm90aWZpZXIKKyAgICBzdHJ1Y3QgUmVsZWFzZUNhY2hlIHsKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgLy8gVE9ETzogdXNlIG9ubHkgb25lIGxpc3Q/KHVzaW5nIG9uZSBsaXN0IG1heSBkZWFseSBzZW5kaW5nIG1lc3NhZ2VzPykKKyAgICAgICAgc3RkOjpsaXN0PEJ1ZmZlcklkPiBtUmVsZWFzaW5nSWRzOworICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+IG1SZWxlYXNlZElkczsKKyAgICAgICAgdWludDMyX3QgbUludmFsaWRhdGVJZDsgLy8gVE9ETzogaW52YWxpZGF0aW9uIEFDSyB0byBidWZmZXJwb29sCisgICAgICAgIGJvb2wgbUludmFsaWRhdGVBY2s7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNDaGFubmVsPiBtU3RhdHVzQ2hhbm5lbDsKKworICAgICAgICBSZWxlYXNlQ2FjaGUoKSA6IG1JbnZhbGlkYXRlSWQoMCksIG1JbnZhbGlkYXRlQWNrKHRydWUpIHt9CisgICAgfSBtUmVsZWFzaW5nOworCisgICAgLy8gVGhpcyBsb2NrIGlzIGhlbGQgZHVyaW5nIHN5bmNocm9uaXphdGlvbiBmcm9tIHJlbW90ZSBzaWRlLgorICAgIC8vIEluIG9yZGVyIHRvIG1pbmltaXplIHJlbW90ZSBjYWxscyBhbmQgbG9ja2luZyBkdXJ0YWlvbiwgdGhpcyBsb2NrIGlzIGhlbGQKKyAgICAvLyBieSBiZXN0IGVmZm9ydCBhcHByb2FjaCB1c2luZyB0cnlfbG9jaygpLgorICAgIHN0ZDo6bXV0ZXggbVJlbW90ZVN5bmNMb2NrOworfTsKKworc3RydWN0IEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkJsb2NrUG9vbERhdGFEdG9yIHsKKyAgICBCbG9ja1Bvb2xEYXRhRHRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudDo6SW1wbD4gJmltcGwpCisgICAgICAgICAgICA6IG1JbXBsKGltcGwpIHt9CisKKyAgICB2b2lkIG9wZXJhdG9yKCkoQnVmZmVyUG9vbERhdGEgKmJ1ZmZlcikgeworICAgICAgICBCdWZmZXJJZCBpZCA9IGJ1ZmZlci0+bUlkOworICAgICAgICBkZWxldGUgYnVmZmVyOworCisgICAgICAgIGF1dG8gaW1wbCA9IG1JbXBsLmxvY2soKTsKKyAgICAgICAgaWYgKGltcGwgJiYgaW1wbC0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBpbXBsLT5wb3N0QnVmZmVyUmVsZWFzZShpZCk7CisgICAgICAgIH0KKyAgICB9CisgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50OjpJbXBsPiBtSW1wbDsKK307CisKK3N0cnVjdCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpDbGllbnRCdWZmZXIgeworcHJpdmF0ZToKKyAgICBpbnQ2NF90IG1FeHBpcmVVczsKKyAgICBib29sIG1IYXNDYWNoZTsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsKKyAgICBCdWZmZXJJZCBtSWQ7CisgICAgbmF0aXZlX2hhbmRsZV90ICptSGFuZGxlOworICAgIHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbERhdGE+IG1DYWNoZTsKKworICAgIHZvaWQgdXBkYXRlRXhwaXJlKCkgeworICAgICAgICBtRXhwaXJlVXMgPSBnZXRUaW1lc3RhbXBOb3coKSArIGtDYWNoZVR0bFVzOworICAgIH0KKworcHVibGljOgorICAgIENsaWVudEJ1ZmZlcigKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIEJ1ZmZlcklkIGlkLCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSkKKyAgICAgICAgICAgIDogbUhhc0NhY2hlKGZhbHNlKSwgbUNvbm5lY3Rpb25JZChjb25uZWN0aW9uSWQpLAorICAgICAgICAgICAgICBtSWQoaWQpLCBtSGFuZGxlKGhhbmRsZSkgeworICAgICAgICBtRXhwaXJlVXMgPSBnZXRUaW1lc3RhbXBOb3coKSArIGtDYWNoZVR0bFVzOworICAgIH0KKworICAgIH5DbGllbnRCdWZmZXIoKSB7CisgICAgICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKG1IYW5kbGUpOworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobUhhbmRsZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBCdWZmZXJJZCBpZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1JZDsKKyAgICB9CisKKyAgICBib29sIGV4cGlyZSgpIGNvbnN0IHsKKyAgICAgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgcmV0dXJuIG5vdyA+PSBtRXhwaXJlVXM7CisgICAgfQorCisgICAgYm9vbCBoYXNDYWNoZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1IYXNDYWNoZTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGZldGNoQ2FjaGUobmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSkgeworICAgICAgICBpZiAobUhhc0NhY2hlKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNhY2hlID0gbUNhY2hlLmxvY2soKTsKKyAgICAgICAgICAgIGlmIChjYWNoZSkgeworICAgICAgICAgICAgICAgICpwSGFuZGxlID0gbUhhbmRsZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBjYWNoZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNyZWF0ZUNhY2hlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw+ICZpbXBsLAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqcEhhbmRsZSkgeworICAgICAgICBpZiAoIW1IYXNDYWNoZSkgeworICAgICAgICAgICAgLy8gQWxsb2NhdGVzIGEgcmF3IHB0ciBpbiBvcmRlciB0byBhdm9pZCBzZW5kaW5nICNwb3N0QnVmZmVyUmVsZWFzZQorICAgICAgICAgICAgLy8gZnJvbSBkZWxldGVyLCBpbiBjYXNlIG9mIG5hdGl2ZV9oYW5kbGVfY2xvbmUgZmFpbHVyZS4KKyAgICAgICAgICAgIEJ1ZmZlclBvb2xEYXRhICpwdHIgPSBuZXcgQnVmZmVyUG9vbERhdGEobUNvbm5lY3Rpb25JZCwgbUlkKTsKKyAgICAgICAgICAgIGlmIChwdHIpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGNhY2hlKHB0ciwgQmxvY2tQb29sRGF0YUR0b3IoaW1wbCkpOworICAgICAgICAgICAgICAgIGlmIChjYWNoZSkgeworICAgICAgICAgICAgICAgICAgICBtQ2FjaGUgPSBjYWNoZTsKKyAgICAgICAgICAgICAgICAgICAgbUhhc0NhY2hlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgKnBIYW5kbGUgPSBtSGFuZGxlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY2FjaGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYm9vbCBvbkNhY2hlUmVsZWFzZSgpIHsKKyAgICAgICAgaWYgKG1IYXNDYWNoZSkgeworICAgICAgICAgICAgLy8gVE9ETzogdmVyaWZ5IG1DYWNoZSBpcyBub3QgdmFsaWQ7CisgICAgICAgICAgICB1cGRhdGVFeHBpcmUoKTsKKyAgICAgICAgICAgIG1IYXNDYWNoZSA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK307CisKK0J1ZmZlclBvb2xDbGllbnQ6OkltcGw6OkltcGwoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpCisgICAgOiBtTG9jYWwodHJ1ZSksIG1WYWxpZChmYWxzZSksIG1BY2Nlc3NvcihhY2Nlc3NvciksIG1TZXFJZCgwKSwKKyAgICAgIG1MYXN0RXZpY3RDYWNoZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7CisgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvciAqc3RhdHVzRGVzYzsKKyAgICBjb25zdCBJbnZhbGlkYXRpb25EZXNjcmlwdG9yICppbnZEZXNjOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBhY2Nlc3Nvci0+Y29ubmVjdCgKKyAgICAgICAgICAgIG9ic2VydmVyLCB0cnVlLAorICAgICAgICAgICAgJm1Mb2NhbENvbm5lY3Rpb24sICZtQ29ubmVjdGlvbklkLCAmbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkLAorICAgICAgICAgICAgJnN0YXR1c0Rlc2MsICZpbnZEZXNjKTsKKyAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbCA9CisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNDaGFubmVsPigqc3RhdHVzRGVzYyk7CisgICAgICAgIG1JbnZhbGlkYXRpb25MaXN0ZW5lciA9CisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcj4oKmludkRlc2MpOworICAgICAgICBtVmFsaWQgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsICYmCisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+aXNWYWxpZCgpICYmCisgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbkxpc3RlbmVyICYmCisgICAgICAgICAgICAgICAgbUludmFsaWRhdGlvbkxpc3RlbmVyLT5pc1ZhbGlkKCk7CisgICAgfQorfQorCitCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpJbXBsKGNvbnN0IHNwPElBY2Nlc3Nvcj4gJmFjY2Vzc29yLCBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcikKKyAgICA6IG1Mb2NhbChmYWxzZSksIG1WYWxpZChmYWxzZSksIG1BY2Nlc3NvcihhY2Nlc3NvciksIG1TZXFJZCgwKSwKKyAgICAgIG1MYXN0RXZpY3RDYWNoZVVzKGdldFRpbWVzdGFtcE5vdygpKSB7CisgICAgYm9vbCB2YWxpZCA9IGZhbHNlOworICAgIHNwPElDb25uZWN0aW9uPiYgb3V0Q29ubmVjdGlvbiA9IG1SZW1vdGVDb25uZWN0aW9uOworICAgIENvbm5lY3Rpb25JZCYgaWQgPSBtQ29ubmVjdGlvbklkOworICAgIHVpbnQzMl90JiBvdXRNc2dJZCA9IG1SZWxlYXNpbmcubUludmFsaWRhdGVJZDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzQ2hhbm5lbD4mIG91dENoYW5uZWwgPQorICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXI+JiBvdXRPYnNlcnZlciA9CisgICAgICAgICAgICBtSW52YWxpZGF0aW9uTGlzdGVuZXI7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gYWNjZXNzb3ItPmNvbm5lY3QoCisgICAgICAgICAgICBvYnNlcnZlciwKKyAgICAgICAgICAgIFsmdmFsaWQsICZvdXRDb25uZWN0aW9uLCAmaWQsICZvdXRNc2dJZCwgJm91dENoYW5uZWwsICZvdXRPYnNlcnZlcl0KKyAgICAgICAgICAgIChSZXN1bHRTdGF0dXMgc3RhdHVzLCBzcDxJQ29ubmVjdGlvbj4gY29ubmVjdGlvbiwKKyAgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCB1aW50MzJfdCBtc2dJZCwKKyAgICAgICAgICAgICBjb25zdCBTdGF0dXNEZXNjcmlwdG9yJiBzdGF0dXNEZXNjLAorICAgICAgICAgICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3ImIGludkRlc2MpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0Q29ubmVjdGlvbiA9IGNvbm5lY3Rpb247CisgICAgICAgICAgICAgICAgICAgIGlkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgICAgICAgICBvdXRNc2dJZCA9IG1zZ0lkOworICAgICAgICAgICAgICAgICAgICBvdXRDaGFubmVsID0gc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNDaGFubmVsPihzdGF0dXNEZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0T2JzZXJ2ZXIgPSBzdGQ6Om1ha2VfdW5pcXVlPEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyPihpbnZEZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dENoYW5uZWwgJiYgb3V0Q2hhbm5lbC0+aXNWYWxpZCgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRPYnNlcnZlciAmJiBvdXRPYnNlcnZlci0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBtVmFsaWQgPSB0cmFuc1Jlc3VsdC5pc09rKCkgJiYgdmFsaWQ7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6aXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGJvb2wgYWN0aXZlID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICAgICAgZXZpY3RDYWNoZXMoY2xlYXJDYWNoZSk7CisgICAgICAgICpsYXN0VHJhbnNhY3Rpb25VcyA9IG1DYWNoZS5tTGFzdENoYW5nZVVzOworICAgICAgICBhY3RpdmUgPSBtQ2FjaGUubUFjdGl2ZSA+IDA7CisgICAgfQorICAgIGlmIChtVmFsaWQgJiYgbUxvY2FsICYmIG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgbUxvY2FsQ29ubmVjdGlvbi0+Y2xlYW5VcChjbGVhckNhY2hlKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBhY3RpdmU7Cit9CisKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cmVjZWl2ZUludmFsaWRhdGlvbih1aW50MzJfdCBtZXNzYWdlSWQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgIHN5bmNSZWxlYXNlZChtZXNzYWdlSWQpOworICAgIC8vIFRPRE86IGV2aWN0IGNhY2hlIHJlcXVpcmVkPworfQorCitSZXN1bHRTdGF0dXMgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6Zmx1c2goKSB7CisgICAgaWYgKCFtTG9jYWwgfHwgIW1Mb2NhbENvbm5lY3Rpb24gfHwgIW1WYWxpZCkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUNhY2hlLm1Mb2NrKTsKKyAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgIGV2aWN0Q2FjaGVzKCk7CisgICAgICAgIHJldHVybiBtTG9jYWxDb25uZWN0aW9uLT5mbHVzaCgpOworICAgIH0KK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoIW1Mb2NhbCB8fCAhbUxvY2FsQ29ubmVjdGlvbiB8fCAhbVZhbGlkKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBCdWZmZXJJZCBidWZmZXJJZDsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSA9IG51bGxwdHI7CisgICAgYnVmZmVyLT5yZXNldCgpOworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXMgPSBhbGxvY2F0ZUJ1ZmZlckhhbmRsZShwYXJhbXMsICZidWZmZXJJZCwgJmhhbmRsZSk7CisgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIGlmIChoYW5kbGUpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICAgICAgc3luY1JlbGVhc2VkKCk7CisgICAgICAgICAgICBldmljdENhY2hlcygpOworICAgICAgICAgICAgYXV0byBjYWNoZUl0ID0gbUNhY2hlLm1CdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgICAgICAgICAgaWYgKGNhY2hlSXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogdmVyaWZ5IGl0IGlzIHJlY3ljbGVkLiAobm90IGhhdmluZyBhY3RpdmUgcmVmKQorICAgICAgICAgICAgICAgIG1DYWNoZS5tQnVmZmVycy5lcmFzZShjYWNoZUl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gY2xpZW50QnVmZmVyID0gc3RkOjptYWtlX3VuaXF1ZTxDbGllbnRCdWZmZXI+KAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBidWZmZXJJZCwgaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChjbGllbnRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IG1DYWNoZS5tQnVmZmVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJJZCwgc3RkOjptb3ZlKGNsaWVudEJ1ZmZlcikpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0LnNlY29uZCkgeworICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID0gcmVzdWx0LmZpcnN0LT5zZWNvbmQtPmNyZWF0ZUNhY2hlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSwgcEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuaW5jQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoISpidWZmZXIpIHsKKyAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgY2FjaGUgY3JlYXRpb24gZmFpbHVyZSAlZDogJWxsZCIsCisgICAgICAgICAgICAgICAgICBoYW5kbGUgIT0gbnVsbHB0ciwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Tk9fTUVNT1JZOworICAgICAgICAgICAgcG9zdEJ1ZmZlclJlbGVhc2UoYnVmZmVySWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpyZWNlaXZlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipwSGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBpZiAoIW1WYWxpZCkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgaWYgKHRpbWVzdGFtcFVzICE9IDApIHsKKyAgICAgICAgdGltZXN0YW1wVXMgKz0ga1JlY2VpdmVUaW1lb3V0VXM7CisgICAgfQorICAgIGlmICghcG9zdFJlY2VpdmUoYnVmZmVySWQsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgYnVmZmVyLT5yZXNldCgpOworICAgIHdoaWxlKDEpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTG9jayk7CisgICAgICAgIHN5bmNSZWxlYXNlZCgpOworICAgICAgICBldmljdENhY2hlcygpOworICAgICAgICBhdXRvIGNhY2hlSXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZmluZChidWZmZXJJZCk7CisgICAgICAgIGlmIChjYWNoZUl0ICE9IG1DYWNoZS5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgaWYgKGNhY2hlSXQtPnNlY29uZC0+aGFzQ2FjaGUoKSkgeworICAgICAgICAgICAgICAgICpidWZmZXIgPSBjYWNoZUl0LT5zZWNvbmQtPmZldGNoQ2FjaGUocEhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKCEqYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRyYW5zZmVyIHRpbWVfb3V0CisgICAgICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnlpZWxkKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiY2xpZW50IHJlY2VpdmUgZnJvbSByZWZlcmVuY2UgJWxsZCIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpidWZmZXIgPSBjYWNoZUl0LT5zZWNvbmQtPmNyZWF0ZUNhY2hlKHNoYXJlZF9mcm9tX3RoaXMoKSwgcEhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgbUNhY2hlLmluY0FjdGl2ZV9sKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVjZWl2ZSBmcm9tIGNhY2hlICVsbGQiLCAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFtQ2FjaGUubUNyZWF0aW5nKSB7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGluZyA9IHRydWU7CisgICAgICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gZmV0Y2hCdWZmZXJIYW5kbGUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsICZoYW5kbGUpOworICAgICAgICAgICAgICAgIGxvY2subG9jaygpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhdXRvIGNsaWVudEJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8Q2xpZW50QnVmZmVyPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgYnVmZmVySWQsIGhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY2xpZW50QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV0byByZXN1bHQgPSBtQ2FjaGUubUJ1ZmZlcnMuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoYnVmZmVySWQsIHN0ZDo6bW92ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50QnVmZmVyKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpidWZmZXIgPSByZXN1bHQuZmlyc3QtPnNlY29uZC0+Y3JlYXRlQ2FjaGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2Zyb21fdGhpcygpLCBwSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCpidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWNoZS5pbmNBY3RpdmVfbCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghKmJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGluZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DcmVhdGVDdi5ub3RpZnlfYWxsKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2FjaGUubUNyZWF0ZUN2LndhaXQobG9jayk7CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBuZWVkc1N5bmMgPSBmYWxzZTsKKyAgICBib29sIHBvc3RlZCA9IHBvc3RSZWNlaXZlUmVzdWx0KGJ1ZmZlcklkLCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqYnVmZmVyID8gdHJ1ZSA6IGZhbHNlLCAmbmVlZHNTeW5jKTsKKyAgICBBTE9HVigiY2xpZW50IHJlY2VpdmUgJWxsZCAtICV1IDogJXMgKCVkKSIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgKmJ1ZmZlciA/ICJvayIgOiAiZmFpbCIsIHBvc3RlZCk7CisgICAgaWYgKG1WYWxpZCAmJiBtTG9jYWwgJiYgbUxvY2FsQ29ubmVjdGlvbikgeworICAgICAgICBtTG9jYWxDb25uZWN0aW9uLT5jbGVhblVwKGZhbHNlKTsKKyAgICB9CisgICAgaWYgKG5lZWRzU3luYyAmJiBtUmVtb3RlQ29ubmVjdGlvbikgeworICAgICAgICB0cnlTeW5jRnJvbVJlbW90ZSgpOworICAgIH0KKyAgICBpZiAoKmJ1ZmZlcikgeworICAgICAgICBpZiAoIXBvc3RlZCkgeworICAgICAgICAgICAgYnVmZmVyLT5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKwordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0QnVmZmVyUmVsZWFzZShCdWZmZXJJZCBidWZmZXJJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWxlYXNpbmcubUxvY2spOworICAgIG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcy5wdXNoX2JhY2soYnVmZmVySWQpOworICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLCBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7Cit9CisKKy8vIFRPRE86IHJldmlzZSBhZC1ob2MgcG9zdGluZyBkYXRhIHN0cnVjdHVyZQorYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0U2VuZCgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIENvbm5lY3Rpb25JZCByZWNlaXZlciwKKyAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwgaW50NjRfdCAqdGltZXN0YW1wVXMpIHsKKyAgICB7CisgICAgICAgIC8vIFRPRE86IGRvbid0IG5lZWQgdG8gY2FsbCBzeW5jUmVsZWFzZWQgZXZlcnkgdGltZQorICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ2FjaGUubUxvY2spOworICAgICAgICBzeW5jUmVsZWFzZWQoKTsKKyAgICB9CisgICAgYm9vbCByZXQgPSBmYWxzZTsKKyAgICBib29sIG5lZWRzU3luYyA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgICp0aW1lc3RhbXBVcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICAqdHJhbnNhY3Rpb25JZCA9IChtQ29ubmVjdGlvbklkIDw8IDMyKSB8IG1TZXFJZCsrOworICAgICAgICAvLyBUT0RPOiByZXRyeSwgYWRkIHRpbWVvdXQsIHRhcmdldD8KKyAgICAgICAgcmV0ID0gIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgICAgICp0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwgQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9UTywgbUNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICByZWNlaXZlciwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLCBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgIG5lZWRzU3luYyA9ICFtTG9jYWwgJiYgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+bmVlZHNTeW5jKCk7CisgICAgfQorICAgIGlmIChtVmFsaWQgJiYgbUxvY2FsICYmIG1Mb2NhbENvbm5lY3Rpb24pIHsKKyAgICAgICAgbUxvY2FsQ29ubmVjdGlvbi0+Y2xlYW5VcChmYWxzZSk7CisgICAgfQorICAgIGlmIChuZWVkc1N5bmMgJiYgbVJlbW90ZUNvbm5lY3Rpb24pIHsKKyAgICAgICAgdHJ5U3luY0Zyb21SZW1vdGUoKTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpwb3N0UmVjZWl2ZSgKKyAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwgaW50NjRfdCB0aW1lc3RhbXBVcykgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga1Bvc3RNYXhSZXRyeTsgKytpKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgaWYgKHRpbWVzdGFtcFVzID09IDAgfHwgbm93IDwgdGltZXN0YW1wVXMpIHsKKyAgICAgICAgICAgIGJvb2wgcmVzdWx0ID0gbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX0ZST00sCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIC0xLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjp5aWVsZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+cG9zdEJ1ZmZlclN0YXR1c01lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX1RJTUVPVVQsCisgICAgICAgICAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIC0xLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6cG9zdFJlY2VpdmVSZXN1bHQoCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIGJvb2wgcmVzdWx0LCBib29sICpuZWVkc1N5bmMpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAvLyBUT0RPOiByZXRyeSwgYWRkIHRpbWVvdXQKKyAgICBib29sIHJldCA9IG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsCisgICAgICAgICAgICByZXN1bHQgPyBCdWZmZXJTdGF0dXM6OlRSQU5TRkVSX09LIDogQnVmZmVyU3RhdHVzOjpUUkFOU0ZFUl9FUlJPUiwKKyAgICAgICAgICAgIG1Db25uZWN0aW9uSWQsIC0xLCBtUmVsZWFzaW5nLm1SZWxlYXNpbmdJZHMsCisgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgKm5lZWRzU3luYyA9ICFtTG9jYWwgJiYgbVJlbGVhc2luZy5tU3RhdHVzQ2hhbm5lbC0+bmVlZHNTeW5jKCk7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjp0cnlTeW5jRnJvbVJlbW90ZSgpIHsKKyAgICBpZiAobVJlbW90ZVN5bmNMb2NrLnRyeV9sb2NrKCkpIHsKKyAgICAgICAgYm9vbCBuZWVkc1N5bmMgPSBmYWxzZTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlbGVhc2luZy5tTG9jayk7CisgICAgICAgICAgICBuZWVkc1N5bmMgPSBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5uZWVkc1N5bmMoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmVlZHNTeW5jKSB7CisgICAgICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQgPSAobUNvbm5lY3Rpb25JZCA8PCAzMik7CisgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCA9IENvbm5lY3Rpb246OlNZTkNfQlVGRkVSSUQ7CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBtUmVtb3RlQ29ubmVjdGlvbi0+ZmV0Y2goCisgICAgICAgICAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICBbXQorICAgICAgICAgICAgICAgICAgICAoUmVzdWx0U3RhdHVzIG91dFN0YXR1cywgQnVmZmVyIG91dEJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpIG91dFN0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSBvdXRCdWZmZXI7CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgic3luYyBmcm9tIGNsaWVudCAlbGxkIGZhaWxlZDogYnVmZmVycG9vbCBwcm9jZXNzIGRpZWQuIiwKKyAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1SZW1vdGVTeW5jTG9jay51bmxvY2soKTsKKyAgICB9Cit9CisKKy8vIHNob3VsZCBoYXZlIG1DYWNoZS5tTG9jaworYm9vbCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpzeW5jUmVsZWFzZWQodWludDMyX3QgbWVzc2FnZUlkKSB7CisgICAgYm9vbCBjbGVhcmVkID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgaWYgKG1SZWxlYXNpbmcubVJlbGVhc2luZ0lkcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBtUmVsZWFzaW5nLm1TdGF0dXNDaGFubmVsLT5wb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgbVJlbGVhc2luZy5tUmVsZWFzaW5nSWRzLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1SZWxlYXNpbmcubVJlbGVhc2VkSWRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGZvciAoQnVmZmVySWQmIGlkOiBtUmVsZWFzaW5nLm1SZWxlYXNlZElkcykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgcmVsZWFzZSBidWZmZXIgJWxsZCAtICV1IiwgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBpZCk7CisgICAgICAgICAgICAgICAgYXV0byBmb3VuZCA9IG1DYWNoZS5tQnVmZmVycy5maW5kKGlkKTsKKyAgICAgICAgICAgICAgICBpZiAoZm91bmQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChmb3VuZC0+c2Vjb25kLT5vbkNhY2hlUmVsZWFzZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGUuZGVjQWN0aXZlX2woKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIQorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNsaWVudCAlbGxkIGNhY2hlIHJlbGVhc2Ugc3RhdHVzIGluY29uc2l0ZW50ISIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBub3QgaGFwcGVuIQorICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2xpZW50ICVsbGQgY2FjaGUgc3RhdHVzIGluY29uc2l0ZW50ISIsIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJlbGVhc2luZy5tUmVsZWFzZWRJZHMuY2xlYXIoKTsKKyAgICAgICAgICAgIGNsZWFyZWQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2U+IGludmFsaWRhdGlvbnM7CisgICAgbUludmFsaWRhdGlvbkxpc3RlbmVyLT5nZXRJbnZhbGlkYXRpb25zKGludmFsaWRhdGlvbnMpOworICAgIHVpbnQzMl90IGxhc3RNc2dJZCA9IDA7CisgICAgaWYgKGludmFsaWRhdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICBmb3IgKGF1dG8gaXQgPSBpbnZhbGlkYXRpb25zLmJlZ2luKCk7IGl0ICE9IGludmFsaWRhdGlvbnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGlmIChpdC0+bWVzc2FnZUlkICE9IDApIHsKKyAgICAgICAgICAgICAgICBsYXN0TXNnSWQgPSBpdC0+bWVzc2FnZUlkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGl0LT5mcm9tQnVmZmVySWQgPT0gaXQtPnRvQnVmZmVySWQpIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZnJvbUJ1ZmZlcklkID0gVUlOVDMyX01BWAorICAgICAgICAgICAgICAgIGludmFsaWRhdGVCdWZmZXIoaXQtPmZyb21CdWZmZXJJZCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludmFsaWRhdGVSYW5nZShpdC0+ZnJvbUJ1ZmZlcklkLCBpdC0+dG9CdWZmZXJJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVsZWFzaW5nLm1Mb2NrKTsKKyAgICAgICAgaWYgKGxhc3RNc2dJZCAhPSAwKSB7CisgICAgICAgICAgICBpZiAoaXNNZXNzYWdlTGF0ZXIobGFzdE1zZ0lkLCBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQpKSB7CisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkID0gbGFzdE1zZ0lkOworICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubUludmFsaWRhdGVBY2sgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtZXNzYWdlSWQgIT0gMCkgeworICAgICAgICAgICAgLy8gbWVzc2FnZXMgYXJlIGRyYWluZWQuCisgICAgICAgICAgICBpZiAoaXNNZXNzYWdlTGF0ZXIobWVzc2FnZUlkLCBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQpKSB7CisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkID0gbWVzc2FnZUlkOworICAgICAgICAgICAgICAgIG1SZWxlYXNpbmcubUludmFsaWRhdGVBY2sgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbVJlbGVhc2luZy5tSW52YWxpZGF0ZUFjaykgeworICAgICAgICAgICAgLy8gcG9zdCBBQ0sKKyAgICAgICAgICAgIG1SZWxlYXNpbmcubVN0YXR1c0NoYW5uZWwtPnBvc3RCdWZmZXJJbnZhbGlkYXRlQWNrKAorICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICBtUmVsZWFzaW5nLm1JbnZhbGlkYXRlSWQsICZtUmVsZWFzaW5nLm1JbnZhbGlkYXRlQWNrKTsKKyAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgJWxsZCBpbnZhbGlkYXRlaW9uIGFjayAoJWQpICV1IiwKKyAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUFjaywgbVJlbGVhc2luZy5tSW52YWxpZGF0ZUlkKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2xlYXJlZDsKK30KKworLy8gc2hvdWxkIGhhdmUgbUNhY2hlLm1Mb2NrCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmV2aWN0Q2FjaGVzKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgaWYgKG5vdyA+PSBtTGFzdEV2aWN0Q2FjaGVVcyArIGtDYWNoZVR0bFVzIHx8IGNsZWFyQ2FjaGUpIHsKKyAgICAgICAgc2l6ZV90IGV2aWN0ZWQgPSAwOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUNhY2hlLm1CdWZmZXJzLmVuZCgpOykgeworICAgICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5oYXNDYWNoZSgpICYmIChpdC0+c2Vjb25kLT5leHBpcmUoKSB8fCBjbGVhckNhY2hlKSkgeworICAgICAgICAgICAgICAgIGl0ID0gbUNhY2hlLm1CdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICArK2V2aWN0ZWQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImNhY2hlIGNvdW50ICVsbGQgOiB0b3RhbCAlenUsIGFjdGl2ZSAlZCwgZXZpY3RlZCAlenUiLAorICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIG1DYWNoZS5tQnVmZmVycy5zaXplKCksIG1DYWNoZS5tQWN0aXZlLCBldmljdGVkKTsKKyAgICAgICAgbUxhc3RFdmljdENhY2hlVXMgPSBub3c7CisgICAgfQorfQorCisvLyBzaG91bGQgaGF2ZSBtQ2FjaGUubUxvY2sKK3ZvaWQgQnVmZmVyUG9vbENsaWVudDo6SW1wbDo6aW52YWxpZGF0ZUJ1ZmZlcihCdWZmZXJJZCBpZCkgeworICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgaWYgKGlkID09IGl0LT5zZWNvbmQtPmlkKCkpIHsKKyAgICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+aGFzQ2FjaGUoKSkgeworICAgICAgICAgICAgICAgIG1DYWNoZS5tQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgQUxPR1YoImNhY2hlIGludmFsaWRhdGVkICVsbGQgOiBidWZmZXIgJXUiLAorICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUNvbm5lY3Rpb25JZCwgaWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiSW5jb25zaXRlbnQgaW52YWxpZGF0aW9uICVsbGQgOiBhY3RpdmVyIGJ1ZmZlciEhICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsICh1bnNpZ25lZCBpbnQpaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIHNob3VsZCBoYXZlIG1DYWNoZS5tTG9jawordm9pZCBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjppbnZhbGlkYXRlUmFuZ2UoQnVmZmVySWQgZnJvbSwgQnVmZmVySWQgdG8pIHsKKyAgICBzaXplX3QgaW52YWxpZGF0ZWQgPSAwOworICAgIGZvciAoYXV0byBpdCA9IG1DYWNoZS5tQnVmZmVycy5iZWdpbigpOyBpdCAhPSBtQ2FjaGUubUJ1ZmZlcnMuZW5kKCk7KSB7CisgICAgICAgIGlmICghaXQtPnNlY29uZC0+aGFzQ2FjaGUoKSkgeworICAgICAgICAgICAgQnVmZmVySWQgYmlkID0gaXQtPnNlY29uZC0+aWQoKTsKKyAgICAgICAgICAgIGlmIChmcm9tIDwgdG8pIHsKKyAgICAgICAgICAgICAgICBpZiAoZnJvbSA8PSBiaWQgJiYgYmlkIDwgdG8pIHsKKyAgICAgICAgICAgICAgICAgICAgKytpbnZhbGlkYXRlZDsKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBtQ2FjaGUubUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChmcm9tIDw9IGJpZCB8fCBiaWQgPCB0bykgeworICAgICAgICAgICAgICAgICAgICArK2ludmFsaWRhdGVkOworICAgICAgICAgICAgICAgICAgICBpdCA9IG1DYWNoZS5tQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICArK2l0OworICAgIH0KKyAgICBBTE9HVigiY2FjaGUgaW52YWxpZGF0ZWQgJWxsZCA6ICMgb2YgaW52YWxpZGF0ZWQgJXp1IiwKKyAgICAgICAgICAobG9uZyBsb25nKW1Db25uZWN0aW9uSWQsIGludmFsaWRhdGVkKTsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OkltcGw6OmFsbG9jYXRlQnVmZmVySGFuZGxlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1zLCBCdWZmZXJJZCAqYnVmZmVySWQsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCoqIGhhbmRsZSkgeworICAgIGlmIChtTG9jYWxDb25uZWN0aW9uKSB7CisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogYWxsb2NIYW5kbGUgPSBudWxscHRyOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUxvY2FsQ29ubmVjdGlvbi0+YWxsb2NhdGUoCisgICAgICAgICAgICAgICAgcGFyYW1zLCBidWZmZXJJZCwgJmFsbG9jSGFuZGxlKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAqaGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jbG9uZShhbGxvY0hhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoImNsaWVudCBhbGxvY2F0ZSByZXN1bHQgJWxsZCAlZCA6ICV1IGNsb25lICVwIiwKKyAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ29ubmVjdGlvbklkLCBzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSywKKyAgICAgICAgICAgICAgKmhhbmRsZSA/ICpidWZmZXJJZCA6IDAgLCAqaGFuZGxlKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpJbXBsOjpmZXRjaEJ1ZmZlckhhbmRsZSgKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlKSB7CisgICAgc3A8SUNvbm5lY3Rpb24+IGNvbm5lY3Rpb247CisgICAgaWYgKG1Mb2NhbCkgeworICAgICAgICBjb25uZWN0aW9uID0gbUxvY2FsQ29ubmVjdGlvbjsKKyAgICB9IGVsc2UgeworICAgICAgICBjb25uZWN0aW9uID0gbVJlbW90ZUNvbm5lY3Rpb247CisgICAgfQorICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gY29ubmVjdGlvbi0+ZmV0Y2goCisgICAgICAgICAgICB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgIFsmc3RhdHVzLCAmaGFuZGxlXQorICAgICAgICAgICAgKFJlc3VsdFN0YXR1cyBvdXRTdGF0dXMsIEJ1ZmZlciBvdXRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBvdXRTdGF0dXM7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci5idWZmZXIuZ2V0TmF0aXZlSGFuZGxlKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPyBzdGF0dXMgOiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCisKK0J1ZmZlclBvb2xDbGllbnQ6OkJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpIHsKKyAgICBtSW1wbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oYWNjZXNzb3IsIG9ic2VydmVyKTsKK30KKworQnVmZmVyUG9vbENsaWVudDo6QnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxJQWNjZXNzb3I+ICZhY2Nlc3NvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpIHsKKyAgICBtSW1wbCA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oYWNjZXNzb3IsIG9ic2VydmVyKTsKK30KKworQnVmZmVyUG9vbENsaWVudDo6fkJ1ZmZlclBvb2xDbGllbnQoKSB7CisgICAgLy8gVE9ETzogaG93IHRvIGhhbmRsZSBvcnBoYW5lZCBidWZmZXJzPworfQorCitib29sIEJ1ZmZlclBvb2xDbGllbnQ6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1JbXBsICYmIG1JbXBsLT5pc1ZhbGlkKCk7Cit9CisKK2Jvb2wgQnVmZmVyUG9vbENsaWVudDo6aXNMb2NhbCgpIHsKKyAgICByZXR1cm4gbUltcGwgJiYgbUltcGwtPmlzTG9jYWwoKTsKK30KKworYm9vbCBCdWZmZXJQb29sQ2xpZW50Ojppc0FjdGl2ZShpbnQ2NF90ICpsYXN0VHJhbnNhY3Rpb25VcywgYm9vbCBjbGVhckNhY2hlKSB7CisgICAgaWYgKCFpc1ZhbGlkKCkpIHsKKyAgICAgICAgKmxhc3RUcmFuc2FjdGlvblVzID0gMDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbUltcGwtPmlzQWN0aXZlKGxhc3RUcmFuc2FjdGlvblVzLCBjbGVhckNhY2hlKTsKK30KKworQ29ubmVjdGlvbklkIEJ1ZmZlclBvb2xDbGllbnQ6OmdldENvbm5lY3Rpb25JZCgpIHsKKyAgICBpZiAoaXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgfQorICAgIHJldHVybiAtMTsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OmdldEFjY2Vzc29yKHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKSB7CisgICAgaWYgKGlzVmFsaWQoKSkgeworICAgICAgICAqYWNjZXNzb3IgPSBtSW1wbC0+Z2V0QWNjZXNzb3IoKTsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCit2b2lkIEJ1ZmZlclBvb2xDbGllbnQ6OnJlY2VpdmVJbnZhbGlkYXRpb24odWludDMyX3QgbXNnSWQpIHsKKyAgICBBTE9HVigiYnVmZmVycG9vbDIgY2xpZW50IHJlY3YgaW52ICV1IiwgbXNnSWQpOworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgbUltcGwtPnJlY2VpdmVJbnZhbGlkYXRpb24obXNnSWQpOworICAgIH0KK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OmZsdXNoKCkgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mbHVzaCgpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OmFsbG9jYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5hbGxvY2F0ZShwYXJhbXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJQb29sQ2xpZW50OjpyZWNlaXZlKAorICAgICAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5yZWNlaXZlKHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCB0aW1lc3RhbXBVcywgaGFuZGxlLCBidWZmZXIpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIEJ1ZmZlclBvb2xDbGllbnQ6OnBvc3RTZW5kKAorICAgICAgICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcykgeworICAgIGlmIChpc1ZhbGlkKCkpIHsKKyAgICAgICAgYm9vbCByZXN1bHQgPSBtSW1wbC0+cG9zdFNlbmQoCisgICAgICAgICAgICAgICAgYnVmZmVyLT5tSWQsIHJlY2VpdmVySWQsIHRyYW5zYWN0aW9uSWQsIHRpbWVzdGFtcFVzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdCA/IFJlc3VsdFN0YXR1czo6T0sgOiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyUG9vbENsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4ZDlhZTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJQb29sQ2xpZW50LmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlBPT0xDTElFTlRfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9CVUZGRVJQT09MQ0xJRU5UX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lBY2Nlc3Nvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNvbm5lY3Rpb24uaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lPYnNlcnZlci5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNvbm5lY3Rpb247Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SU9ic2VydmVyOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKKy8qKgorICogQSBidWZmZXIgcG9vbCBjbGllbnQgZm9yIGEgYnVmZmVyIHBvb2wuIEZvciBhIHNwZWNpZmljIGJ1ZmZlciBwb29sLCBhdCBtb3N0CisgKiBvbmUgYnVmZmVyIHBvb2wgY2xpZW50IGV4aXN0cyBwZXIgcHJvY2Vzcy4gVGhpcyBjbGFzcyB3aWxsIG5vdCBiZSBleHBvc2VkCisgKiBvdXRzaWRlLiBBIGJ1ZmZlciBwb29sIGNsaWVudCB3aWxsIGJlIHVzZWQgdmlhIENsaWVudE1hbmFnZXIuCisgKi8KK2NsYXNzIEJ1ZmZlclBvb2xDbGllbnQgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBidWZmZXIgcG9vbCBjbGllbnQgZnJvbSBhIGxvY2FsIGJ1ZmZlciBwb29sCisgICAgICogKHZpYSBDbGllbnRNYW5hZ2VyI2NyZWF0ZSkuCisgICAgICovCisgICAgZXhwbGljaXQgQnVmZmVyUG9vbENsaWVudChjb25zdCBzcDxBY2Nlc3Nvcj4gJmFjY2Vzc29yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU9ic2VydmVyPiAmb2JzZXJ2ZXIpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBwb29sIGNsaWVudCBmcm9tIGEgcmVtb3RlIGJ1ZmZlciBwb29sCisgICAgICogKHZpYSBDbGllbnRNYW5hZ2VyI3JlZ2lzdGVyU2VuZGVyKS4KKyAgICAgKiBOb3RlOiBBIGJ1ZmZlciBwb29sIGNsaWVudCBjcmVhdGVkIHdpdGggcmVtb3RlIGJ1ZmZlciBwb29sIGNhbm5vdAorICAgICAqIGFsbG9jYXRlIGEgYnVmZmVyLgorICAgICAqLworICAgIGV4cGxpY2l0IEJ1ZmZlclBvb2xDbGllbnQoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJT2JzZXJ2ZXI+ICZvYnNlcnZlcik7CisKKyAgICAvKiogRGVzdHJ1Y3RzIGEgYnVmZmVyIHBvb2wgY2xpZW50LiAqLworICAgIH5CdWZmZXJQb29sQ2xpZW50KCk7CisKK3ByaXZhdGU6CisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICBib29sIGlzTG9jYWwoKTsKKworICAgIGJvb2wgaXNBY3RpdmUoaW50NjRfdCAqbGFzdFRyYW5zYWN0aW9uVXMsIGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICBDb25uZWN0aW9uSWQgZ2V0Q29ubmVjdGlvbklkKCk7CisKKyAgICBSZXN1bHRTdGF0dXMgZ2V0QWNjZXNzb3Ioc3A8SUFjY2Vzc29yPiAqYWNjZXNzb3IpOworCisgICAgdm9pZCByZWNlaXZlSW52YWxpZGF0aW9uKHVpbnQzMl90IG1zZ0lkKTsKKworICAgIFJlc3VsdFN0YXR1cyBmbHVzaCgpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpOworCisgICAgUmVzdWx0U3RhdHVzIHBvc3RTZW5kKENvbm5lY3Rpb25JZCByZWNlaXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lc3RhbXBVcyk7CisKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ2xpZW50TWFuYWdlcjsKKyAgICBmcmllbmQgc3RydWN0IE9ic2VydmVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlBPT0xDTElFTlRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvQnVmZmVyU3RhdHVzLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclN0YXR1cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkzNzI2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclN0YXR1cy5jcHAKQEAgLTAsMCArMSwzMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xTdGF0dXMiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgIkJ1ZmZlclN0YXR1cy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK2ludDY0X3QgZ2V0VGltZXN0YW1wTm93KCkgeworICAgIGludDY0X3Qgc3RhbXA7CisgICAgc3RydWN0IHRpbWVzcGVjIHRzOworICAgIC8vIFRPRE86IENMT0NLX01PTk9UT05JQ19DT0FSU0U/CisgICAgY2xvY2tfZ2V0dGltZShDTE9DS19NT05PVE9OSUMsICZ0cyk7CisgICAgc3RhbXAgPSB0cy50dl9uc2VjIC8gMTAwMDsKKyAgICBzdGFtcCArPSAodHMudHZfc2VjICogMTAwMDAwMExMKTsKKyAgICByZXR1cm4gc3RhbXA7Cit9CisKK2Jvb2wgaXNNZXNzYWdlTGF0ZXIodWludDMyX3QgY3VyTXNnSWQsIHVpbnQzMl90IHByZXZNc2dJZCkgeworICAgIHJldHVybiBjdXJNc2dJZCAhPSBwcmV2TXNnSWQgJiYgY3VyTXNnSWQgLSBwcmV2TXNnSWQgPCBwcmV2TXNnSWQgLSBjdXJNc2dJZDsKK30KKworYm9vbCBpc0J1ZmZlckluUmFuZ2UoQnVmZmVySWQgZnJvbSwgQnVmZmVySWQgdG8sIEJ1ZmZlcklkIGJ1ZmZlcklkKSB7CisgICAgaWYgKGZyb20gPCB0bykgeworICAgICAgICByZXR1cm4gZnJvbSA8PSBidWZmZXJJZCAmJiBidWZmZXJJZCA8IHRvOworICAgIH0gZWxzZSB7IC8vIHdyYXAgaGFwcGVucworICAgICAgICByZXR1cm4gZnJvbSA8PSBidWZmZXJJZCB8fCBidWZmZXJJZCA8IHRvOworICAgIH0KK30KKworc3RhdGljIGNvbnN0ZXhwciBpbnQga051bUVsZW1lbnRzSW5RdWV1ZSA9IDEwMjQqMTY7CitzdGF0aWMgY29uc3RleHByIGludCBrTWluRWxlbWVudHNUb1N5bmNJblF1ZXVlID0gMTI4OworCitSZXN1bHRTdGF0dXMgQnVmZmVyU3RhdHVzT2JzZXJ2ZXI6Om9wZW4oCisgICAgICAgIENvbm5lY3Rpb25JZCBpZCwgY29uc3QgU3RhdHVzRGVzY3JpcHRvcioqIGZtcURlc2NQdHIpIHsKKyAgICBpZiAobUJ1ZmZlclN0YXR1c1F1ZXVlcy5maW5kKGlkKSAhPSBtQnVmZmVyU3RhdHVzUXVldWVzLmVuZCgpKSB7CisgICAgICAgIC8vIFRPRE86IGlkIGNvbGxpc2lvbiBsb2c/CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzUXVldWU+IHF1ZXVlID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVyU3RhdHVzUXVldWU+KGtOdW1FbGVtZW50c0luUXVldWUpOworICAgIGlmICghcXVldWUgfHwgcXVldWUtPmlzVmFsaWQoKSA9PSBmYWxzZSkgeworICAgICAgICAqZm1xRGVzY1B0ciA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICB9IGVsc2UgeworICAgICAgICAqZm1xRGVzY1B0ciA9IHF1ZXVlLT5nZXREZXNjKCk7CisgICAgfQorICAgIGF1dG8gcmVzdWx0ID0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5pbnNlcnQoCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihpZCwgc3RkOjptb3ZlKHF1ZXVlKSkpOworICAgIGlmICghcmVzdWx0LnNlY29uZCkgeworICAgICAgICAqZm1xRGVzY1B0ciA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK1Jlc3VsdFN0YXR1cyBCdWZmZXJTdGF0dXNPYnNlcnZlcjo6Y2xvc2UoQ29ubmVjdGlvbklkIGlkKSB7CisgICAgaWYgKG1CdWZmZXJTdGF0dXNRdWV1ZXMuZmluZChpZCkgPT0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lbmQoKSkgeworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgbUJ1ZmZlclN0YXR1c1F1ZXVlcy5lcmFzZShpZCk7CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7Cit9CisKK3ZvaWQgQnVmZmVyU3RhdHVzT2JzZXJ2ZXI6OmdldEJ1ZmZlclN0YXR1c0NoYW5nZXMoc3RkOjp2ZWN0b3I8QnVmZmVyU3RhdHVzTWVzc2FnZT4gJm1lc3NhZ2VzKSB7CisgICAgZm9yIChhdXRvIGl0ID0gbUJ1ZmZlclN0YXR1c1F1ZXVlcy5iZWdpbigpOyBpdCAhPSBtQnVmZmVyU3RhdHVzUXVldWVzLmVuZCgpOyArK2l0KSB7CisgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgbWVzc2FnZTsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gaXQtPnNlY29uZC0+YXZhaWxhYmxlVG9SZWFkKCk7CisgICAgICAgIHdoaWxlIChhdmFpbCA+IDApIHsKKyAgICAgICAgICAgIGlmICghaXQtPnNlY29uZC0+cmVhZCgmbWVzc2FnZSwgMSkpIHsKKyAgICAgICAgICAgICAgICAvLyBTaW5jZSBhdmFsaWFibGUgIyBvZiByZWFkcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZyAoc3B1cmlvdXMgY2xpZW50PykKKyAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHJlYWQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZylpdC0+Zmlyc3QpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkID0gaXQtPmZpcnN0OworICAgICAgICAgICAgbWVzc2FnZXMucHVzaF9iYWNrKG1lc3NhZ2UpOworICAgICAgICAgICAgLS1hdmFpbDsKKyAgICAgICAgfQorICAgIH0KK30KKworQnVmZmVyU3RhdHVzQ2hhbm5lbDo6QnVmZmVyU3RhdHVzQ2hhbm5lbCgKKyAgICAgICAgY29uc3QgU3RhdHVzRGVzY3JpcHRvciAmZm1xRGVzYykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJTdGF0dXNRdWV1ZT4gcXVldWUgPQorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxCdWZmZXJTdGF0dXNRdWV1ZT4oZm1xRGVzYyk7CisgICAgaWYgKCFxdWV1ZSB8fCBxdWV1ZS0+aXNWYWxpZCgpID09IGZhbHNlKSB7CisgICAgICAgIG1WYWxpZCA9IGZhbHNlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1WYWxpZCAgPSB0cnVlOworICAgIG1CdWZmZXJTdGF0dXNRdWV1ZSA9IHN0ZDo6bW92ZShxdWV1ZSk7Cit9CisKK2Jvb2wgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6aXNWYWxpZCgpIHsKKyAgICByZXR1cm4gbVZhbGlkOworfQorCitib29sIEJ1ZmZlclN0YXR1c0NoYW5uZWw6Om5lZWRzU3luYygpIHsKKyAgICBpZiAobVZhbGlkKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICByZXR1cm4gYXZhaWwgKyBrTWluRWxlbWVudHNUb1N5bmNJblF1ZXVlIDwga051bUVsZW1lbnRzSW5RdWV1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEJ1ZmZlclN0YXR1c0NoYW5uZWw6OnBvc3RCdWZmZXJSZWxlYXNlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpIHsKKyAgICBpZiAobVZhbGlkICYmIHBlbmRpbmcuc2l6ZSgpID4gMCkgeworICAgICAgICBzaXplX3QgYXZhaWwgPSBtQnVmZmVyU3RhdHVzUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgYXZhaWwgPSBzdGQ6Om1pbihhdmFpbCwgcGVuZGluZy5zaXplKCkpOworICAgICAgICBCdWZmZXJTdGF0dXNNZXNzYWdlIG1lc3NhZ2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IGF2YWlsOyArK2kpIHsKKyAgICAgICAgICAgIEJ1ZmZlcklkIGlkID0gcGVuZGluZy5mcm9udCgpOworICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOworICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCA9IGlkOworICAgICAgICAgICAgbWVzc2FnZS5jb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRpbmc/CisgICAgICAgICAgICAgICAgQUxPR1coIkZNUSBtZXNzYWdlIGNhbm5vdCBiZSBzZW50IGZyb20gJWxsZCIsIChsb25nIGxvbmcpY29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwZW5kaW5nLnBvcF9mcm9udCgpOworICAgICAgICAgICAgcG9zdGVkLnB1c2hfYmFjayhpZCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQnVmZmVyU3RhdHVzQ2hhbm5lbDo6cG9zdEJ1ZmZlckludmFsaWRhdGVBY2soCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgIHVpbnQzMl90IGludmFsaWRhdGVJZCwKKyAgICAgICAgYm9vbCAqaW52YWxpZGF0ZWQpIHsKKyAgICBpZiAobVZhbGlkICYmICEqaW52YWxpZGF0ZWQpIHsKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gbUJ1ZmZlclN0YXR1c1F1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCk7CisgICAgICAgIGlmIChhdmFpbCA+IDApIHsKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgbWVzc2FnZTsKKyAgICAgICAgICAgIG1lc3NhZ2UubmV3U3RhdHVzID0gQnVmZmVyU3RhdHVzOjpJTlZBTElEQVRJT05fQUNLOworICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCA9IGludmFsaWRhdGVJZDsKKyAgICAgICAgICAgIG1lc3NhZ2UuY29ubmVjdGlvbklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgaWYgKCFtQnVmZmVyU3RhdHVzUXVldWUtPndyaXRlKCZtZXNzYWdlLCAxKSkgeworICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHdyaXRlcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgLy8gdGhpcyBzaG91bGQgbm90IGhhcHBlbi4KKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kaW5nPworICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgc2VudCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmludmFsaWRhdGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBCdWZmZXJTdGF0dXNDaGFubmVsOjpwb3N0QnVmZmVyU3RhdHVzTWVzc2FnZSgKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLCBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgQnVmZmVyU3RhdHVzIHN0YXR1cywgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgQ29ubmVjdGlvbklkIHRhcmdldElkLAorICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpIHsKKyAgICBpZiAobVZhbGlkKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IG1CdWZmZXJTdGF0dXNRdWV1ZS0+YXZhaWxhYmxlVG9Xcml0ZSgpOworICAgICAgICBzaXplX3QgbnVtUGVuZGluZyA9IHBlbmRpbmcuc2l6ZSgpOworICAgICAgICBpZiAoYXZhaWwgPj0gbnVtUGVuZGluZyArIDEpIHsKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgcmVsZWFzZSwgbWVzc2FnZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUGVuZGluZzsgKytpKSB7CisgICAgICAgICAgICAgICAgQnVmZmVySWQgaWQgPSBwZW5kaW5nLmZyb250KCk7CisgICAgICAgICAgICAgICAgcmVsZWFzZS5uZXdTdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok5PVF9VU0VEOworICAgICAgICAgICAgICAgIHJlbGVhc2UuYnVmZmVySWQgPSBpZDsKKyAgICAgICAgICAgICAgICByZWxlYXNlLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJnJlbGVhc2UsIDEpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFNpbmNlIGF2YWxpYWJsZSAjIG9mIHdyaXRlcyBhcmUgYWxyZWFkeSBjb25maXJtZWQsCisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4uCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGVycm9yIGhhbmRsaW5nPworICAgICAgICAgICAgICAgICAgICBBTE9HVygiRk1RIG1lc3NhZ2UgY2Fubm90IGJlIHNlbnQgZnJvbSAlbGxkIiwgKGxvbmcgbG9uZyljb25uZWN0aW9uSWQpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHBlbmRpbmcucG9wX2Zyb250KCk7CisgICAgICAgICAgICAgICAgcG9zdGVkLnB1c2hfYmFjayhpZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZXNzYWdlLnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworICAgICAgICAgICAgbWVzc2FnZS5idWZmZXJJZCA9IGJ1ZmZlcklkOworICAgICAgICAgICAgbWVzc2FnZS5uZXdTdGF0dXMgPSBzdGF0dXM7CisgICAgICAgICAgICBtZXNzYWdlLmNvbm5lY3Rpb25JZCA9IGNvbm5lY3Rpb25JZDsKKyAgICAgICAgICAgIG1lc3NhZ2UudGFyZ2V0Q29ubmVjdGlvbklkID0gdGFyZ2V0SWQ7CisgICAgICAgICAgICAvLyBUT0RPIDogdGltZXNhdGFtcAorICAgICAgICAgICAgbWVzc2FnZS50aW1lc3RhbXBVcyA9IDA7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJTdGF0dXNRdWV1ZS0+d3JpdGUoJm1lc3NhZ2UsIDEpKSB7CisgICAgICAgICAgICAgICAgLy8gU2luY2UgYXZhbGlhYmxlICMgb2Ygd3JpdGVzIGFyZSBhbHJlYWR5IGNvbmZpcm1lZCwKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIEFMT0dXKCJGTVEgbWVzc2FnZSBjYW5ub3QgYmUgc2VudCBmcm9tICVsbGQiLCAobG9uZyBsb25nKWNvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcjo6QnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXIoCisgICAgICAgIGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IgJmZtcURlc2MpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVySW52YWxpZGF0aW9uUXVldWU+IHF1ZXVlID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVySW52YWxpZGF0aW9uUXVldWU+KGZtcURlc2MpOworICAgIGlmICghcXVldWUgfHwgcXVldWUtPmlzVmFsaWQoKSA9PSBmYWxzZSkgeworICAgICAgICBtVmFsaWQgPSBmYWxzZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtVmFsaWQgID0gdHJ1ZTsKKyAgICBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUgPSBzdGQ6Om1vdmUocXVldWUpOworICAgIC8vIGRyYWluIHByZXZpb3VzIG1lc3NhZ2VzCisgICAgc2l6ZV90IGF2YWlsID0gc3RkOjptaW4oCisgICAgICAgICAgICBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUtPmF2YWlsYWJsZVRvUmVhZCgpLCAoc2l6ZV90KSBrTnVtRWxlbWVudHNJblF1ZXVlKTsKKyAgICBzdGQ6OnZlY3RvcjxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlPiB0ZW1wKGF2YWlsKTsKKyAgICBpZiAoYXZhaWwgPiAwKSB7CisgICAgICAgIG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+cmVhZCh0ZW1wLmRhdGEoKSwgYXZhaWwpOworICAgIH0KK30KKwordm9pZCBCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lcjo6Z2V0SW52YWxpZGF0aW9ucygKKyAgICAgICAgc3RkOjp2ZWN0b3I8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZT4gJm1lc3NhZ2VzKSB7CisgICAgLy8gVHJ5IHR3aWNlIGluIGNhc2Ugb2Ygb3ZlcmZsb3cuCisgICAgLy8gVE9ETzogaGFuZGxpbmcgb3ZlcmZsb3cgdGhvdWdoIGl0IG1heSBub3QgaGFwcGVuLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7CisgICAgICAgIHNpemVfdCBhdmFpbCA9IHN0ZDo6bWluKAorICAgICAgICAgICAgICAgIG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+YXZhaWxhYmxlVG9SZWFkKCksIChzaXplX3QpIGtOdW1FbGVtZW50c0luUXVldWUpOworICAgICAgICBpZiAoYXZhaWwgPiAwKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlPiB0ZW1wKGF2YWlsKTsKKyAgICAgICAgICAgIGlmIChtQnVmZmVySW52YWxpZGF0aW9uUXVldWUtPnJlYWQodGVtcC5kYXRhKCksIGF2YWlsKSkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2VzLnJlc2VydmUobWVzc2FnZXMuc2l6ZSgpICsgYXZhaWwpOworICAgICAgICAgICAgICAgIGZvciAoYXV0byBpdCA9IHRlbXAuYmVnaW4oKTsgaXQgIT0gdGVtcC5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcy5wdXNoX2JhY2soKml0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQnVmZmVySW52YWxpZGF0aW9uTGlzdGVuZXI6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1WYWxpZDsKK30KKworQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbDo6QnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCgpCisgICAgOiBtVmFsaWQodHJ1ZSksCisgICAgICBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUoCisgICAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QnVmZmVySW52YWxpZGF0aW9uUXVldWU+KGtOdW1FbGVtZW50c0luUXVldWUsIHRydWUpKSB7CisgICAgaWYgKCFtQnVmZmVySW52YWxpZGF0aW9uUXVldWUgfHwgbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlLT5pc1ZhbGlkKCkgPT0gZmFsc2UpIHsKKyAgICAgICAgbVZhbGlkID0gZmFsc2U7CisgICAgfQorfQorCitib29sIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWw6OmlzVmFsaWQoKSB7CisgICAgcmV0dXJuIG1WYWxpZDsKK30KKwordm9pZCBCdWZmZXJJbnZhbGlkYXRpb25DaGFubmVsOjpnZXREZXNjKGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IgKipmbXFEZXNjUHRyKSB7CisgICAgaWYgKG1WYWxpZCkgeworICAgICAgICAqZm1xRGVzY1B0ciA9IG1CdWZmZXJJbnZhbGlkYXRpb25RdWV1ZS0+Z2V0RGVzYygpOworICAgIH0gZWxzZSB7CisgICAgICAgICpmbXFEZXNjUHRyID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3ZvaWQgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbDo6cG9zdEludmFsaWRhdGlvbigKKyAgICAgICAgdWludDMyX3QgbXNnSWQsIEJ1ZmZlcklkIGZyb21JZCwgQnVmZmVySWQgdG9JZCkgeworICAgIEJ1ZmZlckludmFsaWRhdGlvbk1lc3NhZ2UgbWVzc2FnZTsKKworICAgIG1lc3NhZ2UubWVzc2FnZUlkID0gbXNnSWQ7CisgICAgbWVzc2FnZS5mcm9tQnVmZmVySWQgPSBmcm9tSWQ7CisgICAgbWVzc2FnZS50b0J1ZmZlcklkID0gdG9JZDsKKyAgICAvLyBUT0RPOiBoYW5kbGUgZmFpbHVyZSAoaXQgZG9lcyBub3QgaGFwcGVuIG5vcm1hbGx5LikKKyAgICBtQnVmZmVySW52YWxpZGF0aW9uUXVldWUtPndyaXRlKCZtZXNzYWdlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJTdGF0dXMuaCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0J1ZmZlclN0YXR1cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNjU4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9CdWZmZXJTdGF0dXMuaApAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSU1RBVFVTX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQlVGRkVSU1RBVFVTX0gKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxsaXN0PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKKy8qKiBSZXR1cm5zIG1vbm90b25pYyB0aW1lc3RhbXAgaW4gVXMgc2luY2UgZml4ZWQgcG9pbnQgaW4gdGltZS4gKi8KK2ludDY0X3QgZ2V0VGltZXN0YW1wTm93KCk7CisKK2Jvb2wgaXNNZXNzYWdlTGF0ZXIodWludDMyX3QgY3VyTXNnSWQsIHVpbnQzMl90IHByZXZNc2dJZCk7CisKK2Jvb2wgaXNCdWZmZXJJblJhbmdlKEJ1ZmZlcklkIGZyb20sIEJ1ZmZlcklkIHRvLCBCdWZmZXJJZCBidWZmZXJJZCk7CisKKy8qKgorICogQSBjb2xsZWN0aW9uIG9mIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBGTVEgZm9yIGEgYnVmZmVyIHBvb2wuIGJ1ZmZlcgorICogb3duZXJzaGlwL3N0YXR1cyBjaGFuZ2UgbWVzc2FnZXMgYXJlIHNlbnQgdmlhIHRoZSBGTVFzIGZyb20gdGhlIGNsaWVudHMuCisgKi8KK2NsYXNzIEJ1ZmZlclN0YXR1c09ic2VydmVyIHsKK3ByaXZhdGU6CisgICAgc3RkOjptYXA8Q29ubmVjdGlvbklkLCBzdGQ6OnVuaXF1ZV9wdHI8QnVmZmVyU3RhdHVzUXVldWU+PgorICAgICAgICAgICAgbUJ1ZmZlclN0YXR1c1F1ZXVlczsKKworcHVibGljOgorICAgIC8qKiBDcmVhdGVzIGEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIEZNUSBmb3IgdGhlIHNwZWNpZmllZAorICAgICAqIGNvbm5lY3Rpb24oY2xpZW50KS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIHNwZWNpZmllZCBjbGllbnQuCisgICAgICogQHBhcmFtIGZtcURlc2NQdHIgICAgZG91YmxlIHB0ciBvZiBjcmVhdGVkIEZNUSdzIGRlc2NyaXB0b3IuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIGlmIEZNUSBpcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgb3BlbihDb25uZWN0aW9uSWQgaWQsIGNvbnN0IFN0YXR1c0Rlc2NyaXB0b3IqKiBmbXFEZXNjUHRyKTsKKworICAgIC8qKiBDbG9zZXMgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgRk1RIGZvciB0aGUgc3BlY2lmaWVkCisgICAgICogY29ubmVjdGlvbihjbGllbnQpLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgY29ubmVjdGlvbiBJZCBvZiB0aGUgc3BlY2lmaWVkIGNsaWVudC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gT0sgaWYgdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIGlzIGNsb3NlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBpZCk7CisKKyAgICAvKiogUmV0cmlldmVzIGFsbCBwZW5kaW5nIEZNUSBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGZyb20gY2xpZW50cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtZXNzYWdlcyAgcmV0cmlldmVkIHBlbmRpbmcgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCBnZXRCdWZmZXJTdGF0dXNDaGFuZ2VzKHN0ZDo6dmVjdG9yPEJ1ZmZlclN0YXR1c01lc3NhZ2U+ICZtZXNzYWdlcyk7Cit9OworCisvKioKKyAqIEEgYnVmZmVyIHN0YXR1cyBtZXNzYWdlIEZNUSBmb3IgYSBidWZmZXIgcG9vbCBjbGllbnQuIEJ1ZmZlciBvd25lcnNoaXAvc3RhdHVzCisgKiBjaGFuZ2UgbWVzc2FnZXMgYXJlIHNlbnQgdmlhIHRoZSBmbXEgdG8gdGhlIGJ1ZmZlciBwb29sLgorICovCitjbGFzcyBCdWZmZXJTdGF0dXNDaGFubmVsIHsKK3ByaXZhdGU6CisgICAgYm9vbCBtVmFsaWQ7CisgICAgc3RkOjp1bmlxdWVfcHRyPEJ1ZmZlclN0YXR1c1F1ZXVlPiBtQnVmZmVyU3RhdHVzUXVldWU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25uZWN0cyB0byBhIGJ1ZmZlciBzdGF0dXMgbWVzc2FnZSBGTVEgZnJvbSBhIGRlc2NyaXB0b3Igb2YKKyAgICAgKiB0aGUgY3JlYXRlZCBGTVEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm1xRGVzYyAgIERlc2NyaXB0b3Igb2YgdGhlIGNyZWF0ZWQgRk1RLgorICAgICAqLworICAgIEJ1ZmZlclN0YXR1c0NoYW5uZWwoY29uc3QgU3RhdHVzRGVzY3JpcHRvciAmZm1xRGVzYyk7CisKKyAgICAvKiogUmV0dXJucyB3aGV0aGVyIHRoZSBGTVEgaXMgY29ubmVjdGVkIHN1Y2Nlc3NmdWxseS4gKi8KKyAgICBib29sIGlzVmFsaWQoKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBuZWVkcyB0byBiZSBzeW5jZWQgZnJvbSB0aGUgYnVmZmVyIHBvb2wgKi8KKyAgICBib29sIG5lZWRzU3luYygpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgcmVsZWFzZSBtZXNzYWdlIHRvIHRoZSBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgIGNvbm5lY3Rpb24gSWQgb2YgdGhlIGNsaWVudC4KKyAgICAgKiBAcGFyYW0gcGVuZGluZyAgICAgICBjdXJyZW50bHkgcGVuZGluZyBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKiBAcGFyYW0gcG9zdGVkICAgICAgICBwb3N0ZWQgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICovCisgICAgdm9pZCBwb3N0QnVmZmVyUmVsZWFzZSgKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwZW5kaW5nLCBzdGQ6Omxpc3Q8QnVmZmVySWQ+ICZwb3N0ZWQpOworCisgICAgLyoqCisgICAgICogUG9zdHMgYSBidWZmZXIgc3RhdHVzIG1lc3NhZ2UgcmVnYXJkaW5nIHRoZSBzcGVjaWZpZWQgYnVmZmVyCisgICAgICogdHJhbnNmZXIgdHJhbnNhY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBJZCBvZiB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgICAgIGJ1ZmZlciBJZCBvZiB0aGUgc3BlY2lmaWVkIHRyYW5zYWN0aW9uLgorICAgICAqIEBwYXJhbSBzdGF0dXMgICAgICAgIG5ldyBzdGF0dXMgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIHRhcmdldElkICAgICAgY29ubmVjdGlvbiBJZCBvZiB0aGUgcmVjZWl2ZXIob25seSB3aGVuIHRoZSBzZW5kZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0cyBhIHN0YXR1cyBtZXNzYWdlKS4KKyAgICAgKiBAcGFyYW0gcGVuZGluZyAgICAgICBjdXJyZW50bHkgcGVuZGluZyBidWZmZXIgcmVsZWFzZSBtZXNzYWdlcy4KKyAgICAgKiBAcGFyYW0gcG9zdGVkICAgICAgICBwb3N0ZWQgYnVmZmVyIHJlbGVhc2UgbWVzc2FnZXMuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBpcyBwb3N0ZWQsCisgICAgICogICAgICAgICB7QGNvZGUgZmFsc2V9IG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIHBvc3RCdWZmZXJTdGF0dXNNZXNzYWdlKAorICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgQnVmZmVySWQgYnVmZmVySWQsCisgICAgICAgICAgICBCdWZmZXJTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgIENvbm5lY3Rpb25JZCB0YXJnZXRJZCwKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBlbmRpbmcsIHN0ZDo6bGlzdDxCdWZmZXJJZD4gJnBvc3RlZCk7CisKKyAgICAvKioKKyAgICAgKiBQb3N0cyBhIGJ1ZmZlciBpbnZhbGlhZGF0aW9uIG1lc3NnZSB0byB0aGUgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBjb25uZWN0aW9uIElkIG9mIHRoZSBjbGllbnQuCisgICAgICogQHBhcmFtIGludmFsaWRhdGVJZCAgaW52YWxpZGF0aW9uIGFjayB0byB0aGUgYnVmZmVyIHBvb2wuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaWYgaW52YWxpZGF0aW9uIGlkIGlzIHplcm8sIHRoZSBhY2sgd2lsbCBub3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0ZWQuCisgICAgICogQHBhcmFtIGludmFsaWRhdGVkICAgc2V0cyB7QGNvZGUgdHJ1ZX0gb25seSB3aGVuIHRoZSBpbnZhbGlkYXRpb24gYWNrIGlzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgcG9zdGVkLgorICAgICAqLworICAgIHZvaWQgcG9zdEJ1ZmZlckludmFsaWRhdGVBY2soCisgICAgICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgdWludDMyX3QgaW52YWxpZGF0ZUlkLAorICAgICAgICAgICAgYm9vbCAqaW52YWxpZGF0ZWQpOworfTsKKworLyoqCisgKiBBIGJ1ZmZlciBpbnZhbGlkYXRpb24gRk1RIGZvciBhIGJ1ZmZlciBwb29sIGNsaWVudC4gQnVmZmVyIGludmFsaWRhdGlvbgorICogbWVzc2FnZXMgYXJlIHJlY2VpdmVkIHZpYSB0aGUgZm1xIGZyb20gdGhlIGJ1ZmZlciBwb29sLiBCdWZmZXIgaW52YWxpZGF0aW9uCisgKiBtZXNzYWdlcyBhcmUgaGFuZGxlZCBhcyBzb29uIGFzIHBvc3NpYmxlLgorICovCitjbGFzcyBCdWZmZXJJbnZhbGlkYXRpb25MaXN0ZW5lciB7Citwcml2YXRlOgorICAgIGJvb2wgbVZhbGlkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZT4gbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29ubmVjdHMgdG8gYSBidWZmZXIgaW52YWxpZGF0aW9uIEZNUSBmcm9tIGEgZGVzY3JpcHRvciBvZiB0aGUgY3JlYXRlZCBGTVEuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm1xRGVzYyAgIERlc2NyaXB0b3Igb2YgdGhlIGNyZWF0ZWQgRk1RLgorICAgICAqLworICAgIEJ1ZmZlckludmFsaWRhdGlvbkxpc3RlbmVyKGNvbnN0IEludmFsaWRhdGlvbkRlc2NyaXB0b3IgJmZtcURlc2MpOworCisgICAgLyoqIFJldHJpZXZlcyBhbGwgcGVuZGluZyBidWZmZXIgaW52YWxpZGF0aW9uIG1lc3NhZ2VzIGZyb20gdGhlIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIG1lc3NhZ2VzICByZXRyaWV2ZWQgcGVuZGluZyBtZXNzYWdlcy4KKyAgICAgKi8KKyAgICB2b2lkIGdldEludmFsaWRhdGlvbnMoc3RkOjp2ZWN0b3I8QnVmZmVySW52YWxpZGF0aW9uTWVzc2FnZT4gJm1lc3NhZ2VzKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBpcyBjb25uZWN0ZWQgc3VjY2VzZnVsbHkuICovCisgICAgYm9vbCBpc1ZhbGlkKCk7Cit9OworCisvKioKKyAqIEEgYnVmZmVyIGludmFsaWRhdGlvbiBGTVEgZm9yIGEgYnVmZmVyIHBvb2wuIEEgYnVmZmVyIHBvb2wgd2lsbCBzZW5kIGJ1ZmZlcgorICogaW52YWxpZGF0aW9uIG1lc3NhZ2VzIHRvIHRoZSBjbGllbnRzIHZpYSB0aGUgRk1RLiBUaGUgRk1RIGlzIHNoYXJlZCBhbW9uZworICogYnVmZmVyIHBvb2wgY2xpZW50cy4KKyAqLworY2xhc3MgQnVmZmVySW52YWxpZGF0aW9uQ2hhbm5lbCB7Citwcml2YXRlOgorICAgIGJvb2wgbVZhbGlkOworICAgIHN0ZDo6dW5pcXVlX3B0cjxCdWZmZXJJbnZhbGlkYXRpb25RdWV1ZT4gbUJ1ZmZlckludmFsaWRhdGlvblF1ZXVlOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBpbnZhbGlkYXRpb24gRk1RIGZvciBhIGJ1ZmZlciBwb29sLgorICAgICAqLworICAgIEJ1ZmZlckludmFsaWRhdGlvbkNoYW5uZWwoKTsKKworICAgIC8qKiBSZXR1cm5zIHdoZXRoZXIgdGhlIEZNUSBpcyBjb25uZWN0ZWQgc3VjY2VzZnVsbHkuICovCisgICAgYm9vbCBpc1ZhbGlkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGRlc2NyaXB0b3Igb2YgYSBidWZmZXIgaW52YWxpZGF0aW9uIEZNUS4gdGhlIGRlc2NyaXB0b3IgbWF5CisgICAgICogYmUgcGFzc2VkIHRvIHRoZSBjbGllbnQgZm9yIGJ1ZmZlciBpbnZhbGlkYXRpb24gaGFuZGxpbmcuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZm1xRGVzY1B0ciAgICBkb3VibGUgcHRyIG9mIGNyZWF0ZWQgRk1RJ3MgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICB2b2lkIGdldERlc2MoY29uc3QgSW52YWxpZGF0aW9uRGVzY3JpcHRvciAqKmZtcURlc2NQdHIpOworCisgICAgLyoqIFBvc3RzIGEgYnVmZmVyIGludmFsaWRhdGlvbiBmb3IgaW52YWxpZGF0ZWQgYnVmZmVycy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtc2dJZCAgICAgSW52YWxpZGF0aW9uIG1lc3NhZ2UgaWQgd2hpY2ggaXMgdXNlZCB3aGVuIGNsaWVudHMgc2VuZAorICAgICAqICAgICAgICAgICAgICAgICAgYWNrcyBiYWNrIHZpYSBCdWZmZXJTdGF0dXNNZXNzYWdlCisgICAgICogQHBhcmFtIGZyb21JZCAgICBUaGUgc3RhcnQgYnVmZmVyaWQgb2YgdGhlIGludmFsaWRhdGVkIGJ1ZmZlcnMoaW5jbHVzaXZlKQorICAgICAqIEBwYXJhbSB0b0lkICAgICAgVGhlIGVuZCBidWZmZXJJZCBvZiB0aGUgaW52YWxpZGF0ZWQgYnVmZmVycyhpbmNsdXNpdmUpCisgICAgICovCisgICAgdm9pZCBwb3N0SW52YWxpZGF0aW9uKHVpbnQzMl90IG1zZ0lkLCBCdWZmZXJJZCBmcm9tSWQsIEJ1ZmZlcklkIHRvSWQpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlNUQVRVU19ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9DbGllbnRNYW5hZ2VyLmNwcCBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0NsaWVudE1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZWU0ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9DbGllbnRNYW5hZ2VyLmNwcApAQCAtMCwwICsxLDU2OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgIkJ1ZmZlclBvb2xNYW5hZ2VyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlICJCdWZmZXJQb29sQ2xpZW50LmgiCisjaW5jbHVkZSAiT2JzZXJ2ZXIuaCIKKyNpbmNsdWRlICJBY2Nlc3Nvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrUmVnaXN0ZXJUaW1lb3V0VXMgPSA1MDAwMDA7IC8vIDAuNSBzZWMKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrQ2xlYW5VcER1cmF0aW9uVXMgPSAxMDAwMDAwOyAvLyBUT0RPOiAxIHNlYyB0dW5lCitzdGF0aWMgY29uc3RleHByIGludDY0X3Qga0NsaWVudFRpbWVvdXRVcyA9IDUwMDAwMDA7IC8vIFRPRE86IDUgc2VjcyB0dW5lCisKKy8qKgorICogVGhlIGhvbGRlciBvZiB0aGUgY29va2llIG9mIHJlbW90ZSBJQ2xpZW50TWFuYWdlci4KKyAqIFRoZSBjb29raWUgaXMgcHJvY2VzcyBsb2NhbGx5IHVuaXF1ZSBmb3IgZWFjaCBJQ2xpZW50TWFuYWdlci4KKyAqIChUaGUgY29va2llIGlzIHVzZWQgdG8gbm90aWZ5IGRlYXRoIG9mIGNsaWVudHMgdG8gYnVmZmVycG9vbCBwcm9jZXNzLikKKyAqLworY2xhc3MgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvb2tpZSBob2xkZXIgZm9yIHJlbW90ZSBJQ2xpZW50TWFuYWdlcihzKS4KKyAgICAgKi8KKyAgICBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyKCk7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIGEgY29va2llIGZvciBhIHJlbW90ZSBJQ2xpZW50TWFuYWdlci4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtYW5hZ2VyICAgdGhlIHNwZWNpZmllZCByZW1vdGUgSUNsaWVudE1hbmFnZXIuCisgICAgICogQHBhcmFtIGFkZGVkICAgICB0cnVlIHdoZW4gdGhlIHNwZWNpZmllZCByZW1vdGUgSUNsaWVudE1hbmFnZXIgaXMgYWRkZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgIG5ld2x5LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRoZSBwcm9jZXNzIGxvY2FsbHkgdW5pcXVlIGNvb2tpZSBmb3IgdGhlIHNwZWNpZmllZCBJQ2xpZW50TWFuYWdlci4KKyAgICAgKi8KKyAgICB1aW50NjRfdCBnZXRDb29raWUoY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+ICZtYW5hZ2VyLCBib29sICphZGRlZCk7CisKK3ByaXZhdGU6CisgICAgdWludDY0X3QgbVNlcUlkOworICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjpsaXN0PHN0ZDo6cGFpcjxjb25zdCB3cDxJQ2xpZW50TWFuYWdlcj4sIHVpbnQ2NF90Pj4gbU1hbmFnZXJzOworfTsKKworQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcjo6Q2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcigpIDogbVNlcUlkKDApe30KKwordWludDY0X3QgQ2xpZW50TWFuYWdlckNvb2tpZUhvbGRlcjo6Z2V0Q29va2llKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJm1hbmFnZXIsCisgICAgICAgIGJvb2wgKmFkZGVkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGZvciAoYXV0byBpdCA9IG1NYW5hZ2Vycy5iZWdpbigpOyBpdCAhPSBtTWFuYWdlcnMuZW5kKCk7KSB7CisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiBrZXkgPSBpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICBpZiAoa2V5KSB7CisgICAgICAgICAgICBpZiAoaW50ZXJmYWNlc0VxdWFsKGtleSwgbWFuYWdlcikpIHsKKyAgICAgICAgICAgICAgICAqYWRkZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpdCA9IG1NYW5hZ2Vycy5lcmFzZShpdCk7CisgICAgICAgIH0KKyAgICB9CisgICAgdWludDY0X3QgaWQgPSBtU2VxSWQrKzsKKyAgICAqYWRkZWQgPSB0cnVlOworICAgIG1NYW5hZ2Vycy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIobWFuYWdlciwgaWQpKTsKKyAgICByZXR1cm4gaWQ7Cit9CisKK2NsYXNzIENsaWVudE1hbmFnZXI6OkltcGwgeworcHVibGljOgorICAgIEltcGwoKTsKKworICAgIC8vIEJuUmVnaXN0ZXJTZW5kZXIKKyAgICBSZXN1bHRTdGF0dXMgcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCk7CisKKyAgICAvLyBCcFJlZ2lzdGVyU2VuZGVyCisgICAgUmVzdWx0U3RhdHVzIHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKTsKKworICAgIFJlc3VsdFN0YXR1cyBjcmVhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGZsdXNoKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIFJlc3VsdFN0YXR1cyByZWNlaXZlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcik7CisKKyAgICBSZXN1bHRTdGF0dXMgcG9zdFNlbmQoQ29ubmVjdGlvbklkIHJlY2VpdmVySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNhY3Rpb25JZCAqdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZXN0YW1wVXMpOworCisgICAgUmVzdWx0U3RhdHVzIGdldEFjY2Vzc29yKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKTsKKworICAgIHZvaWQgY2xlYW5VcChib29sIGNsZWFyQ2FjaGUgPSBmYWxzZSk7CisKK3ByaXZhdGU6CisgICAgLy8gSW4gb3JkZXIgdG8gcHJldmVudCBkZWFkbG9jayBiZXR3ZWVuIG11bHRpcGxlIGxvY2tzLAorICAgIC8vIGFsd2F5cyBsb2NrIENsaWVudENhY2hlLmxvY2sgYmVmb3JlIGxvY2tpbmcgQWN0aXZlQ2xpZW50cy5sb2NrLgorICAgIHN0cnVjdCBDbGllbnRDYWNoZSB7CisgICAgICAgIC8vIFRoaXMgbG9jayBpcyBoZWxkIGZvciBicmllZiBkdXJhdGlvbi4KKyAgICAgICAgLy8gQmxvY2tpbmcgb3BlcmF0aW9uIGlzIG5vdCBwZXJmb3JtZWQgd2hpbGUgaG9sZGluZyB0aGUgbG9jay4KKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8Y29uc3Qgd3A8SUFjY2Vzc29yPiwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50Pj4+CisgICAgICAgICAgICAgICAgbUNsaWVudHM7CisgICAgICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1Db25uZWN0Q3Y7CisgICAgICAgIGJvb2wgbUNvbm5lY3Rpbmc7CisgICAgICAgIGludDY0X3QgbUxhc3RDbGVhblVwVXM7CisKKyAgICAgICAgQ2xpZW50Q2FjaGUoKSA6IG1Db25uZWN0aW5nKGZhbHNlKSwgbUxhc3RDbGVhblVwVXMoZ2V0VGltZXN0YW1wTm93KCkpIHt9CisgICAgfSBtQ2FjaGU7CisKKyAgICAvLyBBY3RpdmUgY2xpZW50cyB3aGljaCBjYW4gYmUgcmV0cmlldmVkIHZpYSBDb25uZWN0aW9uSWQKKyAgICBzdHJ1Y3QgQWN0aXZlQ2xpZW50cyB7CisgICAgICAgIC8vIFRoaXMgbG9jayBpcyBoZWxkIGZvciBicmllZiBkdXJhdGlvbi4KKyAgICAgICAgLy8gQmxvY2tpbmcgb3BlcmF0aW9uIGlzIG5vdCBwZXJmb3JtZWQgaG9sZGluZyB0aGUgbG9jay4KKyAgICAgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+PgorICAgICAgICAgICAgICAgIG1DbGllbnRzOworICAgIH0gbUFjdGl2ZTsKKworICAgIHNwPE9ic2VydmVyPiBtT2JzZXJ2ZXI7CisKKyAgICBDbGllbnRNYW5hZ2VyQ29va2llSG9sZGVyIG1SZW1vdGVDbGllbnRDb29raWVzOworfTsKKworQ2xpZW50TWFuYWdlcjo6SW1wbDo6SW1wbCgpCisgICAgOiBtT2JzZXJ2ZXIobmV3IE9ic2VydmVyKCkpIHt9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWdpc3RlclNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUFjY2Vzc29yPiAmYWNjZXNzb3IsIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCkgeworICAgIGNsZWFuVXAoKTsKKyAgICBpbnQ2NF90IHRpbWVvdXRVcyA9IGdldFRpbWVzdGFtcE5vdygpICsga1JlZ2lzdGVyVGltZW91dFVzOworICAgIGRvIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTXV0ZXgpOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBtQ2FjaGUubUNsaWVudHMuYmVnaW4oKTsgaXQgIT0gbUNhY2hlLm1DbGllbnRzLmVuZCgpOyArK2l0KSB7CisgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IHNBY2Nlc3NvciA9IGl0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoc0FjY2Vzc29yICYmIGludGVyZmFjZXNFcXVhbChzQWNjZXNzb3IsIGFjY2Vzc29yKSkgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPSBpdC0+c2Vjb25kLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50KSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgICAgICAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjbGllbnQtPmdldENvbm5lY3Rpb25JZCgpOworICAgICAgICAgICAgICAgICAgICBpZiAobUFjdGl2ZS5tQ2xpZW50cy5maW5kKCpwQ29ubmVjdGlvbklkKSAhPSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXIgZXhpc3RpbmcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpBTFJFQURZX0VYSVNUUzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtQ2FjaGUubUNsaWVudHMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghbUNhY2hlLm1Db25uZWN0aW5nKSB7CisgICAgICAgICAgICBtQ2FjaGUubUNvbm5lY3RpbmcgPSB0cnVlOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIFJlc3VsdFN0YXR1cyByZXN1bHQgPSBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QnVmZmVyUG9vbENsaWVudD4oYWNjZXNzb3IsIG1PYnNlcnZlcik7CisgICAgICAgICAgICBsb2NrLmxvY2soKTsKKyAgICAgICAgICAgIGlmICghY2xpZW50KSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFjbGllbnQtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgIHJlc3VsdCA9IFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzdWx0ID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBoYW5kbGUgaW5zZXJ0IGZhaWwuIChtYWxsb2MgZmFpbCkKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IHdjbGllbnQgPSBjbGllbnQ7CisgICAgICAgICAgICAgICAgbUNhY2hlLm1DbGllbnRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihhY2Nlc3Nvciwgd2NsaWVudCkpOworICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBjb25JZCA9IGNsaWVudC0+Z2V0Q29ubmVjdGlvbklkKCk7CisgICAgICAgICAgICAgICAgbU9ic2VydmVyLT5hZGRDbGllbnQoY29uSWQsIHdjbGllbnQpOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICAgICAgICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgY2xpZW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpwQ29ubmVjdGlvbklkID0gY29uSWQ7CisgICAgICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyIG5ldyBjb25uZWN0aW9uICVsbGQiLCAobG9uZyBsb25nKSpwQ29ubmVjdGlvbklkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdGluZyA9IGZhbHNlOworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWNoZS5tQ29ubmVjdEN2Lm5vdGlmeV9hbGwoKTsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgbUNhY2hlLm1Db25uZWN0Q3Yud2FpdF9mb3IoCisgICAgICAgICAgICAgICAgbG9jaywgc3RkOjpjaHJvbm86Om1pY3Jvc2Vjb25kcyhrUmVnaXN0ZXJUaW1lb3V0VXMpKTsKKyAgICB9IHdoaWxlIChnZXRUaW1lc3RhbXBOb3coKSA8IHRpbWVvdXRVcyk7CisgICAgLy8gVE9ETzogcmV0dXJuIHRpbWVvdXQgZXJyb3IKKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCkgeworICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgYm9vbCBsb2NhbCA9IGZhbHNlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKHNlbmRlcklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBpdC0+c2Vjb25kLT5nZXRBY2Nlc3NvcigmYWNjZXNzb3IpOworICAgICAgICBsb2NhbCA9IGl0LT5zZWNvbmQtPmlzTG9jYWwoKTsKKyAgICB9CisgICAgUmVzdWx0U3RhdHVzIHJzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBpZiAoYWNjZXNzb3IpIHsKKyAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSByZWNlaXZlci0+cmVnaXN0ZXJTZW5kZXIoCisgICAgICAgICAgICAgICAgYWNjZXNzb3IsCisgICAgICAgICAgICAgICAgWyZycywgcmVjZWl2ZXJJZF0oCisgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcnMgPSBzdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICpyZWNlaXZlcklkID0gY29ubmVjdGlvbklkOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0gZWxzZSBpZiAobG9jYWwgJiYgcnMgPT0gUmVzdWx0U3RhdHVzOjpPSykgeworICAgICAgICAgICAgc3A8Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50PiByZWNpcGllbnQgPSBBY2Nlc3Nvcjo6Z2V0Q29ubmVjdGlvbkRlYXRoUmVjaXBpZW50KCk7CisgICAgICAgICAgICBpZiAocmVjaXBpZW50KSAgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjbGllbnQgZGVhdGggcmVjaXBpZW50IHJlZ2lzdGVyZWQgJWxsZCIsIChsb25nIGxvbmcpKnJlY2VpdmVySWQpOworICAgICAgICAgICAgICAgIGJvb2wgYWRkZWQ7CisgICAgICAgICAgICAgICAgdWludDY0X3QgY29va2llID0gbVJlbW90ZUNsaWVudENvb2tpZXMuZ2V0Q29va2llKHJlY2VpdmVyLCAmYWRkZWQpOworICAgICAgICAgICAgICAgIHJlY2lwaWVudC0+YWRkQ29va2llVG9Db25uZWN0aW9uKGNvb2tpZSwgKnJlY2VpdmVySWQpOworICAgICAgICAgICAgICAgIGlmIChhZGRlZCkgeworICAgICAgICAgICAgICAgICAgICBSZXR1cm48Ym9vbD4gdHJhbnNSZXN1bHQgPSByZWNlaXZlci0+bGlua1RvRGVhdGgocmVjaXBpZW50LCBjb29raWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcnM7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpjcmVhdGUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICBDb25uZWN0aW9uSWQgKnBDb25uZWN0aW9uSWQpIHsKKyAgICBjb25zdCBzcDxBY2Nlc3Nvcj4gYWNjZXNzb3IgPSBuZXcgQWNjZXNzb3IoYWxsb2NhdG9yKTsKKyAgICBpZiAoIWFjY2Vzc29yIHx8ICFhY2Nlc3Nvci0+aXNWYWxpZCgpKSB7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgIH0KKyAgICAvLyBUT0RPOiBvYnNlcnZlciBpcyBsb2NhbC4gdXNlIGRpcmVjdCBjYWxsIGluc3RlYWQgb2YgaGlkbCBjYWxsLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPQorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxCdWZmZXJQb29sQ2xpZW50PihhY2Nlc3NvciwgbU9ic2VydmVyKTsKKyAgICBpZiAoIWNsaWVudCB8fCAhY2xpZW50LT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgfQorICAgIC8vIFNpbmNlIGEgbmV3IGJ1ZmZlcnBvb2wgaXMgY3JlYXRlZCwgZXZpY3QgbWVtb3JpZXMgd2hpY2ggYXJlIHVzZWQgYnkKKyAgICAvLyBleGlzdGluZyBidWZmZXJwb29scyBhbmQgY2xpZW50cy4KKyAgICBjbGVhblVwKHRydWUpOworICAgIHsKKyAgICAgICAgLy8gVE9ETzogaGFuZGxlIGluc2VydCBmYWlsLiAobWFsbG9jIGZhaWwpCisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1DYWNoZS5tTXV0ZXgpOworICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IHdjbGllbnQgPSBjbGllbnQ7CisgICAgICAgIG1DYWNoZS5tQ2xpZW50cy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoYWNjZXNzb3IsIHdjbGllbnQpKTsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbklkID0gY2xpZW50LT5nZXRDb25uZWN0aW9uSWQoKTsKKyAgICAgICAgbU9ic2VydmVyLT5hZGRDbGllbnQoY29uSWQsIHdjbGllbnQpOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgICAgICBtQWN0aXZlLm1DbGllbnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25JZCwgY2xpZW50KSk7CisgICAgICAgIH0KKyAgICAgICAgKnBDb25uZWN0aW9uSWQgPSBjb25JZDsKKyAgICAgICAgQUxPR1YoImNyZWF0ZSBuZXcgY29ubmVjdGlvbiAlbGxkIiwgKGxvbmcgbG9uZykqcENvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jazEobUNhY2hlLm1NdXRleCk7CisgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrMihtQWN0aXZlLm1NdXRleCk7CisgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgIGlmIChpdCAhPSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgIHNwPElBY2Nlc3Nvcj4gYWNjZXNzb3I7CisgICAgICAgIGl0LT5zZWNvbmQtPmdldEFjY2Vzc29yKCZhY2Nlc3Nvcik7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbG9zaW5nID0gaXQtPnNlY29uZDsKKyAgICAgICAgbUFjdGl2ZS5tQ2xpZW50cy5lcmFzZShjb25uZWN0aW9uSWQpOworICAgICAgICBmb3IgKGF1dG8gY2l0ID0gbUNhY2hlLm1DbGllbnRzLmJlZ2luKCk7IGNpdCAhPSBtQ2FjaGUubUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgICAgICAvLyBjbGVhbiB1cCBkZWFkIGNsaWVudCBjYWNoZXMKKyAgICAgICAgICAgIHNwPElBY2Nlc3Nvcj4gY0FjY2Vzc29yID0gY2l0LT5maXJzdC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAoIWNBY2Nlc3NvciB8fCAoYWNjZXNzb3IgJiYgaW50ZXJmYWNlc0VxdWFsKGNBY2Nlc3NvciwgYWNjZXNzb3IpKSkgeworICAgICAgICAgICAgICAgIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5lcmFzZShjaXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaXQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBsb2NrMi51bmxvY2soKTsKKyAgICAgICAgbG9jazEudW5sb2NrKCk7CisgICAgICAgIGNsb3NpbmctPmZsdXNoKCk7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpmbHVzaChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPmZsdXNoKCk7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjphbGxvY2F0ZSgKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICoqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICpidWZmZXIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbENsaWVudD4gY2xpZW50OworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUFjdGl2ZS5tTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgICAgIGlmIChpdCA9PSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0KKyAgICAgICAgY2xpZW50ID0gaXQtPnNlY29uZDsKKyAgICB9CisjaWZkZWYgQlVGRkVSUE9PTF9DTE9ORV9IQU5ETEVTCisgICAgbmF0aXZlX2hhbmRsZV90ICpvcmlnSGFuZGxlOworICAgIFJlc3VsdFN0YXR1cyByZXMgPSBjbGllbnQtPmFsbG9jYXRlKHBhcmFtcywgJm9yaWdIYW5kbGUsIGJ1ZmZlcik7CisgICAgaWYgKHJlcyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKG9yaWdIYW5kbGUpOworICAgIGlmIChoYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBidWZmZXItPnJlc2V0KCk7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisjZWxzZQorICAgIHJldHVybiBjbGllbnQtPmFsbG9jYXRlKHBhcmFtcywgaGFuZGxlLCBidWZmZXIpOworI2VuZGlmCit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpJbXBsOjpyZWNlaXZlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQ7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGF1dG8gaXQgPSBtQWN0aXZlLm1DbGllbnRzLmZpbmQoY29ubmVjdGlvbklkKTsKKyAgICAgICAgaWYgKGl0ID09IG1BY3RpdmUubUNsaWVudHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PVF9GT1VORDsKKyAgICAgICAgfQorICAgICAgICBjbGllbnQgPSBpdC0+c2Vjb25kOworICAgIH0KKyNpZmRlZiBCVUZGRVJQT09MX0NMT05FX0hBTkRMRVMKKyAgICBuYXRpdmVfaGFuZGxlX3QgKm9yaWdIYW5kbGU7CisgICAgUmVzdWx0U3RhdHVzIHJlcyA9IGNsaWVudC0+cmVjZWl2ZSgKKyAgICAgICAgICAgIHRyYW5zYWN0aW9uSWQsIGJ1ZmZlcklkLCB0aW1lc3RhbXBVcywgJm9yaWdIYW5kbGUsIGJ1ZmZlcik7CisgICAgaWYgKHJlcyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2Nsb25lKG9yaWdIYW5kbGUpOworICAgIGlmIChoYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBidWZmZXItPnJlc2V0KCk7CisgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6T0s7CisjZWxzZQorICAgIHJldHVybiBjbGllbnQtPnJlY2VpdmUodHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsIHRpbWVzdGFtcFVzLCBoYW5kbGUsIGJ1ZmZlcik7CisjZW5kaWYKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OkltcGw6OnBvc3RTZW5kKAorICAgICAgICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAmYnVmZmVyLAorICAgICAgICBUcmFuc2FjdGlvbklkICp0cmFuc2FjdGlvbklkLCBpbnQ2NF90ICp0aW1lc3RhbXBVcykgeworICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQgPSBidWZmZXItPm1Db25uZWN0aW9uSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPnBvc3RTZW5kKHJlY2VpdmVySWQsIGJ1ZmZlciwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6SW1wbDo6Z2V0QWNjZXNzb3IoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIHNwPElBY2Nlc3Nvcj4gKmFjY2Vzc29yKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+IGNsaWVudDsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BY3RpdmUubU11dGV4KTsKKyAgICAgICAgYXV0byBpdCA9IG1BY3RpdmUubUNsaWVudHMuZmluZChjb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoaXQgPT0gbUFjdGl2ZS5tQ2xpZW50cy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGNsaWVudCA9IGl0LT5zZWNvbmQ7CisgICAgfQorICAgIHJldHVybiBjbGllbnQtPmdldEFjY2Vzc29yKGFjY2Vzc29yKTsKK30KKwordm9pZCBDbGllbnRNYW5hZ2VyOjpJbXBsOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGludDY0X3Qgbm93ID0gZ2V0VGltZXN0YW1wTm93KCk7CisgICAgaW50NjRfdCBsYXN0VHJhbnNhY3Rpb25VczsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jazEobUNhY2hlLm1NdXRleCk7CisgICAgaWYgKGNsZWFyQ2FjaGUgfHwgbUNhY2hlLm1MYXN0Q2xlYW5VcFVzICsga0NsZWFuVXBEdXJhdGlvblVzIDwgbm93KSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrMihtQWN0aXZlLm1NdXRleCk7CisgICAgICAgIGludCBjbGVhbmVkID0gMDsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUFjdGl2ZS5tQ2xpZW50cy5iZWdpbigpOyBpdCAhPSBtQWN0aXZlLm1DbGllbnRzLmVuZCgpOykgeworICAgICAgICAgICAgaWYgKCFpdC0+c2Vjb25kLT5pc0FjdGl2ZSgmbGFzdFRyYW5zYWN0aW9uVXMsIGNsZWFyQ2FjaGUpKSB7CisgICAgICAgICAgICAgICAgaWYgKGxhc3RUcmFuc2FjdGlvblVzICsga0NsaWVudFRpbWVvdXRVcyA8IG5vdykgeworICAgICAgICAgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IGFjY2Vzc29yOworICAgICAgICAgICAgICAgICAgICBpdC0+c2Vjb25kLT5nZXRBY2Nlc3NvcigmYWNjZXNzb3IpOworICAgICAgICAgICAgICAgICAgICBpdCA9IG1BY3RpdmUubUNsaWVudHMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICAgICArK2NsZWFuZWQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsraXQ7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChhdXRvIGNpdCA9IG1DYWNoZS5tQ2xpZW50cy5iZWdpbigpOyBjaXQgIT0gbUNhY2hlLm1DbGllbnRzLmVuZCgpOykgeworICAgICAgICAgICAgLy8gY2xlYW4gdXAgZGVhZCBjbGllbnQgY2FjaGVzCisgICAgICAgICAgICBzcDxJQWNjZXNzb3I+IGNBY2Nlc3NvciA9IGNpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKCFjQWNjZXNzb3IpIHsKKyAgICAgICAgICAgICAgICBjaXQgPSBtQ2FjaGUubUNsaWVudHMuZXJhc2UoY2l0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKytjaXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiMgb2YgY2xlYW5lZCBjb25uZWN0aW9uczogJWQiLCBjbGVhbmVkKTsKKyAgICAgICAgbUNhY2hlLm1MYXN0Q2xlYW5VcFVzID0gbm93OworICAgIH0KK30KKworLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ2xpZW50TWFuYWdlciBmb2xsb3cuCitSZXR1cm48dm9pZD4gQ2xpZW50TWFuYWdlcjo6cmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3Nvcj4mIGJ1ZmZlclBvb2wsIHJlZ2lzdGVyU2VuZGVyX2NiIF9oaWRsX2NiKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQgPSAtMTsKKyAgICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1JbXBsLT5yZWdpc3RlclNlbmRlcihidWZmZXJQb29sLCAmY29ubmVjdGlvbklkKTsKKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb25uZWN0aW9uSWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9oaWRsX2NiKFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1IsIC0xKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworLy8gTWV0aG9kcyBmb3IgbG9jYWwgdXNlLgorc3A8Q2xpZW50TWFuYWdlcj4gQ2xpZW50TWFuYWdlcjo6c0luc3RhbmNlOworc3RkOjptdXRleCBDbGllbnRNYW5hZ2VyOjpzSW5zdGFuY2VMb2NrOworCitzcDxDbGllbnRNYW5hZ2VyPiBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzSW5zdGFuY2VMb2NrKTsKKyAgICBpZiAoIXNJbnN0YW5jZSkgeworICAgICAgICBzSW5zdGFuY2UgPSBuZXcgQ2xpZW50TWFuYWdlcigpOworICAgIH0KKyAgICBBY2Nlc3Nvcjo6Y3JlYXRlSW52YWxpZGF0b3IoKTsKKyAgICByZXR1cm4gc0luc3RhbmNlOworfQorCitDbGllbnRNYW5hZ2VyOjpDbGllbnRNYW5hZ2VyKCkgOiBtSW1wbChuZXcgSW1wbCgpKSB7fQorCitDbGllbnRNYW5hZ2VyOjp+Q2xpZW50TWFuYWdlcigpIHsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OmNyZWF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+ICZhbGxvY2F0b3IsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcENvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmNyZWF0ZShhbGxvY2F0b3IsIHBDb25uZWN0aW9uSWQpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKworUmVzdWx0U3RhdHVzIENsaWVudE1hbmFnZXI6OnJlZ2lzdGVyU2VuZGVyKAorICAgICAgICBjb25zdCBzcDxJQ2xpZW50TWFuYWdlcj4gJnJlY2VpdmVyLAorICAgICAgICBDb25uZWN0aW9uSWQgc2VuZGVySWQsCisgICAgICAgIENvbm5lY3Rpb25JZCAqcmVjZWl2ZXJJZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPnJlZ2lzdGVyU2VuZGVyKHJlY2VpdmVyLCBzZW5kZXJJZCwgcmVjZWl2ZXJJZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6Y2xvc2UoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmNsb3NlKGNvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6Zmx1c2goQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZsdXNoKGNvbm5lY3Rpb25JZCk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6YWxsb2NhdGUoCisgICAgICAgIENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+YWxsb2NhdGUoY29ubmVjdGlvbklkLCBwYXJhbXMsIGhhbmRsZSwgYnVmZmVyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDbGllbnRNYW5hZ2VyOjpyZWNlaXZlKAorICAgICAgICBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLCBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQsCisgICAgICAgIEJ1ZmZlcklkIGJ1ZmZlcklkLCBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlcikgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPnJlY2VpdmUoY29ubmVjdGlvbklkLCB0cmFuc2FjdGlvbklkLCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcFVzLCBoYW5kbGUsIGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitSZXN1bHRTdGF0dXMgQ2xpZW50TWFuYWdlcjo6cG9zdFNlbmQoCisgICAgICAgIENvbm5lY3Rpb25JZCByZWNlaXZlcklkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsIGludDY0X3QqIHRpbWVzdGFtcFVzKSB7CisgICAgaWYgKG1JbXBsICYmIGJ1ZmZlcikgeworICAgICAgICByZXR1cm4gbUltcGwtPnBvc3RTZW5kKHJlY2VpdmVySWQsIGJ1ZmZlciwgdHJhbnNhY3Rpb25JZCwgdGltZXN0YW1wVXMpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBDbGllbnRNYW5hZ2VyOjpjbGVhblVwKCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICBtSW1wbC0+Y2xlYW5VcCh0cnVlKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0Nvbm5lY3Rpb24uY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvQ29ubmVjdGlvbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdkMGM3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0Nvbm5lY3Rpb24uY3BwCkBAIC0wLDAgKzEsMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkNvbm5lY3Rpb24uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYnVmZmVycG9vbCB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDb25uZWN0aW9uIGZvbGxvdy4KK1JldHVybjx2b2lkPiBDb25uZWN0aW9uOjpmZXRjaCh1aW50NjRfdCB0cmFuc2FjdGlvbklkLCB1aW50MzJfdCBidWZmZXJJZCwgZmV0Y2hfY2IgX2hpZGxfY2IpIHsKKyAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICBpZiAoYnVmZmVySWQgIT0gU1lOQ19CVUZGRVJJRCkgeworICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBudWxscHRyOworICAgICAgICAgICAgc3RhdHVzID0gbUFjY2Vzc29yLT5mZXRjaCgKKyAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25JZCwgdHJhbnNhY3Rpb25JZCwgYnVmZmVySWQsICZoYW5kbGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgQnVmZmVyIGJ1ZmZlciA9IHt9OworICAgICAgICAgICAgICAgIGJ1ZmZlci5pZCA9IGJ1ZmZlcklkOworICAgICAgICAgICAgICAgIGJ1ZmZlci5idWZmZXIgPSBoYW5kbGU7CisgICAgICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBidWZmZXIpOworICAgICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQWNjZXNzb3ItPmNsZWFuVXAoZmFsc2UpOworICAgICAgICB9CisgICAgfQorCisgICAgQnVmZmVyIGJ1ZmZlciA9IHt9OworICAgIGJ1ZmZlci5pZCA9IDA7CisgICAgYnVmZmVyLmJ1ZmZlciA9IG51bGxwdHI7CisKKyAgICBfaGlkbF9jYihzdGF0dXMsIGJ1ZmZlcik7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworQ29ubmVjdGlvbjo6Q29ubmVjdGlvbigpIDogbUluaXRpYWxpemVkKGZhbHNlKSwgbUNvbm5lY3Rpb25JZCgtMUxMKSB7fQorCitDb25uZWN0aW9uOjp+Q29ubmVjdGlvbigpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICBtQWNjZXNzb3ItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgIH0KK30KKwordm9pZCBDb25uZWN0aW9uOjppbml0aWFsaXplKAorICAgICAgICBjb25zdCBzcDxBY2Nlc3Nvcj4mIGFjY2Vzc29yLCBDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkKSB7CisgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgbUFjY2Vzc29yID0gYWNjZXNzb3I7CisgICAgICAgIG1Db25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorfQorCitSZXN1bHRTdGF0dXMgQ29ubmVjdGlvbjo6Zmx1c2goKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCAmJiBtQWNjZXNzb3IpIHsKKyAgICAgICAgcmV0dXJuIG1BY2Nlc3Nvci0+Zmx1c2goKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK1Jlc3VsdFN0YXR1cyBDb25uZWN0aW9uOjphbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJnBhcmFtcywgQnVmZmVySWQgKmJ1ZmZlcklkLAorICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpIHsKKyAgICBpZiAobUluaXRpYWxpemVkICYmIG1BY2Nlc3NvcikgeworICAgICAgICByZXR1cm4gbUFjY2Vzc29yLT5hbGxvY2F0ZShtQ29ubmVjdGlvbklkLCBwYXJhbXMsIGJ1ZmZlcklkLCBoYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKK30KKwordm9pZCBDb25uZWN0aW9uOjpjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQgJiYgbUFjY2Vzc29yKSB7CisgICAgICAgIG1BY2Nlc3Nvci0+Y2xlYW5VcChjbGVhckNhY2hlKTsKKyAgICB9Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlIGZvbGxvdy4KKworLy9JQ29ubmVjdGlvbiogSElETF9GRVRDSF9JQ29ubmVjdGlvbihjb25zdCBjaGFyKiAvKiBuYW1lICovKSB7CisvLyAgICByZXR1cm4gbmV3IENvbm5lY3Rpb24oKTsKKy8vfQorCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9Db25uZWN0aW9uLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9Db25uZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODUwNzc0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0Nvbm5lY3Rpb24uaApAQCAtMCwwICsxLDEwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQ09OTkVDVElPTl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0NPTk5FQ1RJT05fSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgIkFjY2Vzc29yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6QWNjZXNzb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IENvbm5lY3Rpb24gOiBwdWJsaWMgSUNvbm5lY3Rpb24geworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNvbm5lY3Rpb24gZm9sbG93LgorICAgIFJldHVybjx2b2lkPiBmZXRjaCh1aW50NjRfdCB0cmFuc2FjdGlvbklkLCB1aW50MzJfdCBidWZmZXJJZCwgZmV0Y2hfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogSW52YWxpZGF0ZXMgYWxsIGJ1ZmZlcnMgd2hpY2ggYXJlIGFjdGl2ZSBhbmQvb3IgYXJlIHJlYWR5IHRvIGJlIHJlY3ljbGVkLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBmbHVzaCgpOworCisgICAgLyoqCisgICAgICogQWxsb2NhdGVzIGEgYnVmZmVyIHVzaW5nIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4gUmVjeWNsZXMgYSBidWZmZXIgaWYKKyAgICAgKiBpdCBpcyBwb3NzaWJsZS4gVGhlIHJldHVybmVkIGJ1ZmZlciBjYW4gYmUgdHJhbnNmZXJyZWQgdG8gb3RoZXIgcmVtb3RlCisgICAgICogY2xpZW50cyhDb25uZWN0aW9uKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBwYXJhbXMgICAgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAqIEBwYXJhbSBidWZmZXJJZCAgSWQgb2YgdGhlIGFsbG9jYXRlZCBidWZmZXIuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICBuYXRpdmUgaGFuZGxlIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyBpZiBhIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgYWxsb2NhdGVkLgorICAgICAqICAgICAgICAgTk9fTUVNT1JZIHdoZW4gdGhlcmUgaXMgbm8gbWVtb3J5LgorICAgICAqICAgICAgICAgQ1JJVElDQUxfRVJST1Igb3RoZXJ3aXNlLgorICAgICAqLworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCAqYnVmZmVySWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBQcm9jZXNzZXMgcGVuZGluZyBidWZmZXIgc3RhdHVzIG1lc3NhZ2VzIGFuZCBwZXJmb3JtcyBwZXJpb2RpYyBjYWNoZSBjbGVhbmluZworICAgICAqIGZyb20gYnVmZmVycG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjbGVhckNhY2hlICAgIGlmIGNsZWFyQ2FjaGUgaXMgdHJ1ZSwgYnVmZmVycG9vbCBmcmVlcyBhbGwgYnVmZmVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgIHdhaXRpbmcgdG8gYmUgcmVjeWNsZWQuCisgICAgICovCisgICAgdm9pZCBjbGVhblVwKGJvb2wgY2xlYXJDYWNoZSk7CisKKyAgICAvKiogRGVzdHJ1Y3RzIGEgY29ubmVjdGlvbi4gKi8KKyAgICB+Q29ubmVjdGlvbigpOworCisgICAgLyoqIENyZWF0ZXMgYSBjb25uZWN0aW9uLiAqLworICAgIENvbm5lY3Rpb24oKTsKKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemVzIHdpdGggdGhlIHNwZWNpZmllZCBidWZmZXIgcG9vbCBhbmQgdGhlIGNvbm5lY3Rpb24gaWQuCisgICAgICogVGhlIGNvbm5lY3Rpb24gaWQgc2hvdWxkIGJlIHVuaXF1ZSBpbiB0aGUgd2hvbGUgc3lzdGVtLgorICAgICAqCisgICAgICogQHBhcmFtIGFjY2Vzc29yICAgICAgdGhlIHNwZWNpZmllZCBidWZmZXIgcG9vbC4KKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBJZC4KKyAgICAgKi8KKyAgICB2b2lkIGluaXRpYWxpemUoY29uc3Qgc3A8QWNjZXNzb3I+ICZhY2Nlc3NvciwgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCk7CisKKyAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICBTWU5DX0JVRkZFUklEID0gVUlOVDMyX01BWCwKKyAgICB9OworCitwcml2YXRlOgorICAgIGJvb2wgbUluaXRpYWxpemVkOworICAgIHNwPEFjY2Vzc29yPiBtQWNjZXNzb3I7CisgICAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQ09OTkVDVElPTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9PYnNlcnZlci5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9PYnNlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIyMzE2MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL09ic2VydmVyLmNwcApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIk9ic2VydmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKworT2JzZXJ2ZXI6Ok9ic2VydmVyKCkgeworfQorCitPYnNlcnZlcjo6fk9ic2VydmVyKCkgeworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklPYnNlcnZlciBmb2xsb3cuCitSZXR1cm48dm9pZD4gT2JzZXJ2ZXI6Om9uTWVzc2FnZShpbnQ2NF90IGNvbm5lY3Rpb25JZCwgdWludDMyX3QgbXNnSWQpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGF1dG8gaXQgPSBtQ2xpZW50cy5maW5kKGNvbm5lY3Rpb25JZCk7CisgICAgaWYgKGl0ICE9IG1DbGllbnRzLmVuZCgpKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQ2xpZW50PiBjbGllbnQgPSBpdC0+c2Vjb25kLmxvY2soKTsKKyAgICAgICAgaWYgKCFjbGllbnQpIHsKKyAgICAgICAgICAgIG1DbGllbnRzLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBjbGllbnQtPnJlY2VpdmVJbnZhbGlkYXRpb24obXNnSWQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWb2lkKCk7Cit9CisKK3ZvaWQgT2JzZXJ2ZXI6OmFkZENsaWVudChDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8QnVmZmVyUG9vbENsaWVudD4gJndjbGllbnQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgZm9yIChhdXRvIGl0ID0gbUNsaWVudHMuYmVnaW4oKTsgaXQgIT0gbUNsaWVudHMuZW5kKCk7KSB7CisgICAgICAgIGlmICghaXQtPnNlY29uZC5sb2NrKCkgfHwgaXQtPmZpcnN0ID09IGNvbm5lY3Rpb25JZCkgeworICAgICAgICAgICAgaXQgPSBtQ2xpZW50cy5lcmFzZShpdCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgfQorICAgIG1DbGllbnRzLmluc2VydChzdGQ6Om1ha2VfcGFpcihjb25uZWN0aW9uSWQsIHdjbGllbnQpKTsKKworfQorCit2b2lkIE9ic2VydmVyOjpkZWxDbGllbnQoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBtQ2xpZW50cy5lcmFzZShjb25uZWN0aW9uSWQpOworfQorCisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL09ic2VydmVyLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC9PYnNlcnZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyYmQ3YzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9PYnNlcnZlci5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX09CU0VSVkVSX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfT0JTRVJWRVJfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JT2JzZXJ2ZXIuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSAiQnVmZmVyUG9vbENsaWVudC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpzcDsKKworc3RydWN0IE9ic2VydmVyIDogcHVibGljIElPYnNlcnZlciB7CisgICAgLy8gTWV0aG9kcyBmcm9tIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJT2JzZXJ2ZXIgZm9sbG93LgorICAgIFJldHVybjx2b2lkPiBvbk1lc3NhZ2UoaW50NjRfdCBjb25uZWN0aW9uSWQsIHVpbnQzMl90IG1zZ0lkKSBvdmVycmlkZTsKKworICAgIH5PYnNlcnZlcigpOworCisgICAgdm9pZCBhZGRDbGllbnQoQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPEJ1ZmZlclBvb2xDbGllbnQ+ICZ3Y2xpZW50KTsKKworICAgIHZvaWQgZGVsQ2xpZW50KENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCitwcml2YXRlOgorICAgIE9ic2VydmVyKCk7CisKKyAgICBmcmllbmQgc3RydWN0IENsaWVudE1hbmFnZXI7CisKKyAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgIHN0ZDo6bWFwPENvbm5lY3Rpb25JZCwgY29uc3Qgc3RkOjp3ZWFrX3B0cjxCdWZmZXJQb29sQ2xpZW50Pj4gbUNsaWVudHM7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycG9vbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfT0JTRVJWRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvaW5jbHVkZS9idWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvaW5jbHVkZS9idWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOTA2Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQnVmZmVyUG9vbFR5cGVzLmgKQEAgLTAsMCArMSwxMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlBPT0xUWVBFU19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlBPT0xUWVBFU19ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKKworc3RydWN0IEJ1ZmZlclBvb2xEYXRhIHsKKyAgICAvLyBGb3IgbG9jYWwgdXNlLCB0byBzcGVjaWZ5IGEgYnVmZmVycG9vbCAoY2xpZW50IGNvbm5lY3Rpb24pIGZvciBidWZmZXJzLgorICAgIC8vIFJldHVybiB2YWx1ZSBmcm9tIGNvbm5lY3QjSUFjY2Vzc29yKGFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjApLgorICAgIGludDY0X3QgbUNvbm5lY3Rpb25JZDsKKyAgICAvLyBCdWZmZXJJZAorICAgIHVpbnQzMl90IG1JZDsKKworICAgIEJ1ZmZlclBvb2xEYXRhKCkgOiBtQ29ubmVjdGlvbklkKDApLCBtSWQoMCkge30KKworICAgIEJ1ZmZlclBvb2xEYXRhKAorICAgICAgICAgICAgaW50NjRfdCBjb25uZWN0aW9uSWQsIHVpbnQzMl90IGlkKQorICAgICAgICAgICAgOiBtQ29ubmVjdGlvbklkKGNvbm5lY3Rpb25JZCksIG1JZChpZCkge30KKworICAgIH5CdWZmZXJQb29sRGF0YSgpIHt9Cit9OworCituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6a1Vuc3luY2hyb25pemVkV3JpdGU7CisKK3R5cGVkZWYgdWludDMyX3QgQnVmZmVySWQ7Cit0eXBlZGVmIHVpbnQ2NF90IFRyYW5zYWN0aW9uSWQ7Cit0eXBlZGVmIGludDY0X3QgQ29ubmVjdGlvbklkOworCitlbnVtIDogQ29ubmVjdGlvbklkIHsKKyAgICBJTlZBTElEX0NPTk5FQ1RJT05JRCA9IDAsCit9OworCit0eXBlZGVmIGFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU8QnVmZmVyU3RhdHVzTWVzc2FnZSwga1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQnVmZmVyU3RhdHVzUXVldWU7Cit0eXBlZGVmIEJ1ZmZlclN0YXR1c1F1ZXVlOjpEZXNjcmlwdG9yIFN0YXR1c0Rlc2NyaXB0b3I7CisKK3R5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTxCdWZmZXJJbnZhbGlkYXRpb25NZXNzYWdlLCBrVW5zeW5jaHJvbml6ZWRXcml0ZT4KKyAgICAgICAgQnVmZmVySW52YWxpZGF0aW9uUXVldWU7Cit0eXBlZGVmIEJ1ZmZlckludmFsaWRhdGlvblF1ZXVlOjpEZXNjcmlwdG9yIEludmFsaWRhdGlvbkRlc2NyaXB0b3I7CisKKy8qKgorICogQWxsb2NhdGlvbiB3cmFwcGVyIGNsYXNzIGZvciBidWZmZXIgcG9vbC4KKyAqLworc3RydWN0IEJ1ZmZlclBvb2xBbGxvY2F0aW9uIHsKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKm1IYW5kbGU7CisKKyAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1IYW5kbGU7CisgICAgfQorCisgICAgQnVmZmVyUG9vbEFsbG9jYXRpb24oY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpIDogbUhhbmRsZShoYW5kbGUpIHt9CisKKyAgICB+QnVmZmVyUG9vbEFsbG9jYXRpb24oKSB7fTsKK307CisKKy8qKgorICogQWxsb2NhdG9yIHdyYXBwZXIgY2xhc3MgZm9yIGJ1ZmZlciBwb29sLgorICovCitjbGFzcyBCdWZmZXJQb29sQWxsb2NhdG9yIHsKK3B1YmxpYzoKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlIGFuIGFsbG9jYXRpb24oYnVmZmVyKSBmb3IgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgIGFsbG9jYXRpb24gcGFyYW1ldGVycworICAgICAqIEBwYXJhbSBhbGxvYyAgICAgY3JlYXRlZCBhbGxvY2F0aW9uCisgICAgICogQHBhcmFtIGFsbG9jU2l6ZSBzaXplIG9mIGNyZWF0ZWQgYWxsb2NhdGlvbgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGFuIGFsbG9jYXRpb24gaXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICovCisgICAgdmlydHVhbCBSZXN1bHRTdGF0dXMgYWxsb2NhdGUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgICAgICAgICBzaXplX3QgKmFsbG9jU2l6ZSkgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGFsbG9jYXRpb24gcGFyYW1ldGVycyBvZiBhbiBvbGQgYWxsb2NhdGlvbiBhcmUKKyAgICAgKiBjb21wYXRpYmxlIHdpdGggbmV3IGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgY29tcGF0aWJsZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmbmV3UGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpID0gMDsKKworcHJvdGVjdGVkOgorICAgIEJ1ZmZlclBvb2xBbGxvY2F0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIH5CdWZmZXJQb29sQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uCit9ICAvLyBuYW1lc3BhY2UgVjJfMAorfSAgLy8gbmFtZXNwYWNlIGJ1ZmZlcnBvb2wKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0JVRkZFUlBPT0xUWVBFU19ICmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC9pbmNsdWRlL2J1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvaW5jbHVkZS9idWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGI2MWY0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvaW5jbHVkZS9idWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaApAQCAtMCwwICsxLDE5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9CVUZGRVJQT09MX1YyXzBfQ0xJRU5UTUFOQUdFUl9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQlVGRkVSUE9PTF9WMl8wX0NMSUVOVE1BTkFHRVJfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSAiQnVmZmVyUG9vbFR5cGVzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGJ1ZmZlcnBvb2wgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfbWVtb3J5OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQWNjZXNzb3I7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDbGllbnRNYW5hZ2VyIDogcHVibGljIElDbGllbnRNYW5hZ2VyIHsKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklDbGllbnRNYW5hZ2VyIGZvbGxvdy4KKyAgICBSZXR1cm48dm9pZD4gcmVnaXN0ZXJTZW5kZXIoY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3Nvcj4mIGJ1ZmZlclBvb2wsIHJlZ2lzdGVyU2VuZGVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIC8qKiBHZXRzIGFuIGluc3RhbmNlLiAqLworICAgIHN0YXRpYyBzcDxDbGllbnRNYW5hZ2VyPiBnZXRJbnN0YW5jZSgpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGxvY2FsIGNvbm5lY3Rpb24gd2l0aCBhIG5ld2x5IGNyZWF0ZWQgYnVmZmVyIHBvb2wuCisgICAgICoKKyAgICAgKiBAcGFyYW0gYWxsb2NhdG9yICAgICBmb3IgbmV3IGJ1ZmZlciBhbGxvY2F0aW9uLgorICAgICAqIEBwYXJhbSBwQ29ubmVjdGlvbklkIElkIG9mIHRoZSBjcmVhdGVkIGNvbm5lY3Rpb24uIFRoaXMgaXMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzeXN0ZW0td2lkZSB1bmlxdWUuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgcG9vbCBhbmQgYSBsb2NhbCBjb25uZWN0aW9uIGlzIHN1Y2Nlc3NmdWxseQorICAgICAqICAgICAgICAgY3JlYXRlZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgY3JlYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiAmYWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpwQ29ubmVjdGlvbklkKTsKKworICAgIC8qKgorICAgICAqIFJlZ2lzdGVyIGEgY3JlYXRlZCBjb25uZWN0aW9uIGFzIHNlbmRlciBmb3IgcmVtb3RlIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXIgICAgICBUaGUgcmVtb3RlIHJlY2VpdmluZyBwcm9jZXNzLgorICAgICAqIEBwYXJhbSBzZW5kZXJJZCAgICAgIEEgbG9jYWwgY29ubmVjdGlvbiB3aGljaCB3aWxsIHNlbmQgYnVmZmVycyB0by4KKyAgICAgKiBAcGFyYW0gcmVjZWl2ZXJJZCAgICBJZCBvZiB0aGUgY3JlYXRlZCByZWNlaXZpbmcgY29ubmVjdGlvbiBvbiB0aGUgcmVjZWl2ZXIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbiBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCBvbiB0aGUKKyAgICAgKiAgICAgICAgIHJlY2VpdmVyIHByb2Nlc3MuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc2VuZGVyIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIEFMUkVBRFlfRVhJU1RTIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbiBpcyBhbHJlYWR5IG1hZGUuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIHJlZ2lzdGVyU2VuZGVyKGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiAmcmVjZWl2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbm5lY3Rpb25JZCBzZW5kZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29ubmVjdGlvbklkICpyZWNlaXZlcklkKTsKKworICAgIC8qKgorICAgICAqIENsb3NlcyB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBUaGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gdGhlIGNvbm5lY3Rpb24gaXMgY2xvc2VkLgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGNsb3NlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogRXZpY3RzIGNhY2hlZCBhbGxvY2F0aW9ucy4gSWYgaXQncyBsb2NhbCBjb25uZWN0aW9uLCByZWxlYXNlIHRoZQorICAgICAqIHByZXZpb3VzIGFsbG9jYXRpb25zIGFuZCBkbyBub3QgcmVjeWNsZSBjdXJyZW50IGFjdGl2ZSBhbGxvY2F0aW9ucy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb25uZWN0aW9uSWQgVGhlIGlkIG9mIHRoZSBjb25uZWN0aW9uLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIHRoZSBjb25uZWN0aW9uIGlzIHJlc2V0dGVkLgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGZsdXNoKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQpOworCisgICAgLyoqCisgICAgICogQWxsb2NhdGVzIGEgYnVmZmVyIGZyb20gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uLiBUaGUgb3V0cHV0IHBhcmFtZXRlcgorICAgICAqIGhhbmRsZSBpcyBjbG9uZWQgZnJvbSB0aGUgaW50ZXJuYWwgaGFuZGxlLiBTbyBpdCBpcyBzYWZlIHRvIHVzZSBkaXJlY3RseSwKKyAgICAgKiBhbmQgaXQgc2hvdWxkIGJlIGRlbGV0ZWQgYW5kIGRlc3Ryb3llZCBhZnRlciB1c2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29ubmVjdGlvbklkICBUaGUgaWQgb2YgdGhlIGNvbm5lY3Rpb24uCisgICAgICogQHBhcmFtIHBhcmFtcyAgICAgICAgVGhlIGFsbG9jYXRpb24gcGFyYW1ldGVycy4KKyAgICAgKiBAcGFyYW0gaGFuZGxlICAgICAgICBUaGUgbmF0aXZlIGhhbmRsZSB0byB0aGUgYWxsb2NhdGVkIGJ1ZmZlci4gaGFuZGxlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc2hvdWxkIGJlIGNsb25lZCBiZWZvcmUgdXNlLgorICAgICAqIEBwYXJhbSBidWZmZXIgICAgICAgIFRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHdhcyBhbGxvY2F0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqICAgICAgICAgTk9UX0ZPVU5EIHdoZW4gdGhlIHNwZWNpZmllZCBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBOT19NRU1PUlkgd2hlbiB0aGVyZSBpcyBubyBtZW1vcnkuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIGFsbG9jYXRlKENvbm5lY3Rpb25JZCBjb25uZWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZwYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIC8qKgorICAgICAqIFJlY2VpdmVzIGEgYnVmZmVyIGZvciB0aGUgdHJhbnNhY3Rpb24uIFRoZSBvdXRwdXQgcGFyYW1ldGVyIGhhbmRsZSBpcworICAgICAqIGNsb25lZCBmcm9tIHRoZSBpbnRlcm5hbCBoYW5kbGUuIFNvIGl0IGlzIHNhZmUgdG8gdXNlIGRpcmVjdGx5LCBhbmQgaXQKKyAgICAgKiBzaG91bGQgYmUgZGVsZXRlZCBhbmQgZGVzdG95ZWQgYWZ0ZXIgdXNlLgorICAgICAqCisgICAgICogQHBhcmFtIGNvbm5lY3Rpb25JZCAgVGhlIGlkIG9mIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gdHJhbnNhY3Rpb25JZCBUaGUgaWQgZm9yIHRoZSB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVySWQgICAgICBUaGUgaWQgZm9yIHRoZSBidWZmZXIuCisgICAgICogQHBhcmFtIHRpbWVzdGFtcFVzICAgVGhlIHRpbWVzdGFtcCBvZiB0aGUgYnVmZmVyIGlzIGJlaW5nIHNlbnQuCisgICAgICogQHBhcmFtIGhhbmRsZSAgICAgICAgVGhlIG5hdGl2ZSBoYW5kbGUgdG8gdGhlIGFsbG9jYXRlZCBidWZmZXIuIGhhbmRsZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNob3VsZCBiZSBjbG9uZWQgYmVmb3JlIHVzZS4KKyAgICAgKiBAcGFyYW0gYnVmZmVyICAgICAgICBUaGUgcmVjZWl2ZWQgYnVmZmVyLgorICAgICAqCisgICAgICogQHJldHVybiBPSyB3aGVuIGEgYnVmZmVyIHdhcyByZWNlaXZlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc3BlY2lmaWVkIGNvbm5lY3Rpb24gd2FzIG5vdCBmb3VuZC4KKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSB3aGVuIHRoZXJlIGlzIG5vIG1lbW9yeS4KKyAgICAgKiAgICAgICAgIENSSVRJQ0FMX0VSUk9SIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBSZXN1bHRTdGF0dXMgcmVjZWl2ZShDb25uZWN0aW9uSWQgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJJZCBidWZmZXJJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyKTsKKworICAgIC8qKgorICAgICAqIFBvc3RzIGEgYnVmZmVyIHRyYW5zZmVyIHRyYW5zYWN0aW9uIHRvIHRoZSBidWZmZXIgcG9vbC4gU2VuZHMgYSBidWZmZXIKKyAgICAgKiB0byBvdGhlciByZW1vdGUgY2xpZW50cyhjb25uZWN0aW9uKSBhZnRlciB0aGlzIGNhbGwgaGFzIGJlZW4gc3VjY2VlZGVkLgorICAgICAqCisgICAgICogQHBhcmFtIHJlY2VpdmVySWQgICAgVGhlIGlkIG9mIHRoZSByZWNlaXZpbmcgY29ubmVjdGlvbi4KKyAgICAgKiBAcGFyYW0gYnVmZmVyICAgICAgICB0byB0cmFuc2ZlcgorICAgICAqIEBwYXJhbSB0cmFuc2FjdGlvbklkIElkIG9mIHRoZSB0cmFuc2ZlciB0cmFuc2FjdGlvbi4KKyAgICAgKiBAcGFyYW0gdGltZXN0YW1wVXMgICBUaGUgdGltZXN0YW1wIG9mIHRoZSBidWZmZXIgdHJhbnNhY3Rpb24gaXMgYmVpbmcKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwb3N0ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE9LIHdoZW4gYSBidWZmZXIgdHJhbnNhY3Rpb24gd2FzIHBvc3RlZCBzdWNjZXNzZnVsbHkuCisgICAgICogICAgICAgICBOT1RfRk9VTkQgd2hlbiB0aGUgc2VuZGluZyBjb25uZWN0aW9uIHdhcyBub3QgZm91bmQuCisgICAgICogICAgICAgICBDUklUSUNBTF9FUlJPUiBvdGhlcndpc2UuCisgICAgICovCisgICAgUmVzdWx0U3RhdHVzIHBvc3RTZW5kKENvbm5lY3Rpb25JZCByZWNlaXZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zYWN0aW9uSWQgKnRyYW5zYWN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVzdGFtcFVzKTsKKworICAgIC8qKgorICAgICAqICBUaW1lIG91dCBpbmFjdGl2ZSBsaW5nZXJpbmcgY29ubmVjdGlvbnMgYW5kIGNsb3NlLgorICAgICAqLworICAgIHZvaWQgY2xlYW5VcCgpOworCisgICAgLyoqIERlc3RydWN0cyB0aGUgbWFuYWdlciBvZiBidWZmZXIgcG9vbCBjbGllbnRzLiAgKi8KKyAgICB+Q2xpZW50TWFuYWdlcigpOworcHJpdmF0ZToKKyAgICBzdGF0aWMgc3A8Q2xpZW50TWFuYWdlcj4gc0luc3RhbmNlOworICAgIHN0YXRpYyBzdGQ6Om11dGV4IHNJbnN0YW5jZUxvY2s7CisKKyAgICBjbGFzcyBJbXBsOworICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBtSW1wbDsKKworICAgIENsaWVudE1hbmFnZXIoKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJwb29sCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX0JVRkZFUlBPT0xfVjJfMF9DTElFTlRNQU5BR0VSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNDRmNjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiVnRzVm5ka0hpZGxCdWZmZXJwb29sVjJfMFRhcmdldFNpbmdsZVRlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFsbG9jYXRvci5jcHAiLAorICAgICAgICAic2luZ2xlLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiYm90aCIsCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNWbmRrSGlkbEJ1ZmZlcnBvb2xWMl8wVGFyZ2V0TXVsdGlUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhbGxvY2F0b3IuY3BwIiwKKyAgICAgICAgIm11bHRpLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmZtcSIsCisgICAgXSwKKyAgICBjb21waWxlX211bHRpbGliOiAiYm90aCIsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9PV05FUlMgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczM2UwYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL09XTkVSUwpAQCAtMCwwICsxLDkgQEAKKyMgTWVkaWEgdGVhbQorbGFqb3NAZ29vZ2xlLmNvbQorcGF3aW5AZ29vZ2xlLmNvbQordGFrbGVlQGdvb2dsZS5jb20KK3dvbnNpa0Bnb29nbGUuY29tCisKKyMgVlRTIHRlYW0KK3lpbUBnb29nbGUuY29tCit6aHVveWFvQGdvb2dsZS5jb20KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL2FsbG9jYXRvci5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9hbGxvY2F0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0M2Y3ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9hbGxvY2F0b3IuY3BwCkBAIC0wLDAgKzEsMjA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGN1dGlscy9hc2htZW0uaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1bmlvbiBQYXJhbXMgeworICBzdHJ1Y3QgeworICAgIHVpbnQzMl90IGNhcGFjaXR5OworICB9IGRhdGE7CisgIHVpbnQ4X3QgYXJyYXlbMF07CisgIFBhcmFtcygpIDogZGF0YXswfSB7fQorICBQYXJhbXModWludDMyX3Qgc2l6ZSkKKyAgICAgIDogZGF0YXtzaXplfSB7fQorfTsKKworCituYW1lc3BhY2UgeworCitzdHJ1Y3QgSGFuZGxlQXNobWVtIDogcHVibGljIG5hdGl2ZV9oYW5kbGVfdCB7CisgIEhhbmRsZUFzaG1lbShpbnQgYXNobWVtRmQsIHNpemVfdCBzaXplKQorICAgIDogbmF0aXZlX2hhbmRsZV90KGNIZWFkZXIpLAorICAgIG1GZHN7IGFzaG1lbUZkIH0sCisgICAgbUludHN7IGludCAoc2l6ZSAmIDB4RkZGRkZGRkYpLCBpbnQoKHVpbnQ2NF90KHNpemUpID4+IDMyKSAmIDB4RkZGRkZGRkYpLCBrTWFnaWMgfSB7fQorCisgIGludCBhc2htZW1GZCgpIGNvbnN0IHsgcmV0dXJuIG1GZHMubUFzaG1lbTsgfQorICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc2l6ZV90KHVuc2lnbmVkKG1JbnRzLm1TaXplTG8pKQorICAgICAgICB8IHNpemVfdCh1aW50NjRfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUhpKSkgPDwgMzIpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKiBjb25zdCBvKTsKKworcHJvdGVjdGVkOgorICBzdHJ1Y3QgeworICAgIGludCBtQXNobWVtOworICB9IG1GZHM7CisgIHN0cnVjdCB7CisgICAgaW50IG1TaXplTG87CisgICAgaW50IG1TaXplSGk7CisgICAgaW50IG1NYWdpYzsKKyAgfSBtSW50czsKKworcHJpdmF0ZToKKyAgZW51bSB7CisgICAga01hZ2ljID0gJ2FobVx4MDAnLAorICAgIG51bUZkcyA9IHNpemVvZihtRmRzKSAvIHNpemVvZihpbnQpLAorICAgIG51bUludHMgPSBzaXplb2YobUludHMpIC8gc2l6ZW9mKGludCksCisgICAgdmVyc2lvbiA9IHNpemVvZihuYXRpdmVfaGFuZGxlX3QpCisgIH07CisgIGNvbnN0IHN0YXRpYyBuYXRpdmVfaGFuZGxlX3QgY0hlYWRlcjsKK307CisKK2NvbnN0IG5hdGl2ZV9oYW5kbGVfdCBIYW5kbGVBc2htZW06OmNIZWFkZXIgPSB7CisgIEhhbmRsZUFzaG1lbTo6dmVyc2lvbiwKKyAgSGFuZGxlQXNobWVtOjpudW1GZHMsCisgIEhhbmRsZUFzaG1lbTo6bnVtSW50cywKKyAge30KK307CisKK2Jvb2wgSGFuZGxlQXNobWVtOjppc1ZhbGlkKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqIGNvbnN0IG8pIHsKKyAgaWYgKCFvIHx8IG1lbWNtcChvLCAmY0hlYWRlciwgc2l6ZW9mKGNIZWFkZXIpKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBIYW5kbGVBc2htZW0gKm90aGVyID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlQXNobWVtKj4obyk7CisgIHJldHVybiBvdGhlci0+bUludHMubU1hZ2ljID09IGtNYWdpYzsKK30KKworY2xhc3MgQWxsb2NhdGlvbkFzaG1lbSB7Citwcml2YXRlOgorICBBbGxvY2F0aW9uQXNobWVtKGludCBhc2htZW1GZCwgc2l6ZV90IGNhcGFjaXR5LCBib29sIHJlcykKKyAgICA6IG1IYW5kbGUoYXNobWVtRmQsIGNhcGFjaXR5KSwKKyAgICAgIG1Jbml0KHJlcykge30KKworcHVibGljOgorICBzdGF0aWMgQWxsb2NhdGlvbkFzaG1lbSAqQWxsb2Moc2l6ZV90IHNpemUpIHsKKyAgICBjb25zdGV4cHIgc3RhdGljIGNvbnN0IGNoYXIgKmtBbGxvY2F0aW9uVGFnID0gImJ1ZmZlcnBvb2xfdGVzdCI7CisgICAgaW50IGFzaG1lbUZkID0gYXNobWVtX2NyZWF0ZV9yZWdpb24oa0FsbG9jYXRpb25UYWcsIHNpemUpOworICAgIHJldHVybiBuZXcgQWxsb2NhdGlvbkFzaG1lbShhc2htZW1GZCwgc2l6ZSwgYXNobWVtRmQgPj0gMCk7CisgIH0KKworICB+QWxsb2NhdGlvbkFzaG1lbSgpIHsKKyAgICBpZiAobUluaXQpIHsKKyAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoJm1IYW5kbGUpOworICAgIH0KKyAgfQorCisgIGNvbnN0IEhhbmRsZUFzaG1lbSAqaGFuZGxlKCkgeworICAgIHJldHVybiAmbUhhbmRsZTsKKyAgfQorCitwcml2YXRlOgorICBIYW5kbGVBc2htZW0gbUhhbmRsZTsKKyAgYm9vbCBtSW5pdDsKKyAgLy8gVE9ETzogbWFwcGluZyBhbmQgbWFwIGZkCit9OworCitzdHJ1Y3QgQWxsb2NhdGlvbkR0b3IgeworICBBbGxvY2F0aW9uRHRvcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4gJmFsbG9jKQorICAgICAgOiBtQWxsb2MoYWxsb2MpIHt9CisKKyAgdm9pZCBvcGVyYXRvcigpKEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwb29sQWxsb2MpIHsgZGVsZXRlIHBvb2xBbGxvYzsgfQorCisgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPiBtQWxsb2M7Cit9OworCit9CisKKworUmVzdWx0U3RhdHVzIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjphbGxvY2F0ZSgKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgIHNpemVfdCAqYWxsb2NTaXplKSB7CisgIFBhcmFtcyBhc2htZW1QYXJhbXM7CisgIG1lbWNweSgmYXNobWVtUGFyYW1zLCBwYXJhbXMuZGF0YSgpLCBzdGQ6Om1pbihzaXplb2YoUGFyYW1zKSwgcGFyYW1zLnNpemUoKSkpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxBbGxvY2F0aW9uQXNobWVtPiBhc2htZW1BbGxvYyA9CisgICAgICBzdGQ6OnNoYXJlZF9wdHI8QWxsb2NhdGlvbkFzaG1lbT4oCisgICAgICAgICAgQWxsb2NhdGlvbkFzaG1lbTo6QWxsb2MoYXNobWVtUGFyYW1zLmRhdGEuY2FwYWNpdHkpKTsKKyAgaWYgKGFzaG1lbUFsbG9jKSB7CisgICAgQnVmZmVyUG9vbEFsbG9jYXRpb24gKnB0ciA9IG5ldyBCdWZmZXJQb29sQWxsb2NhdGlvbihhc2htZW1BbGxvYy0+aGFuZGxlKCkpOworICAgIGlmIChwdHIpIHsKKyAgICAgICphbGxvYyA9IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4ocHRyLCBBbGxvY2F0aW9uRHRvcihhc2htZW1BbGxvYykpOworICAgICAgaWYgKCphbGxvYykgeworICAgICAgICAgICphbGxvY1NpemUgPSBhc2htZW1QYXJhbXMuZGF0YS5jYXBhY2l0eTsKKyAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgIH0KKyAgICAgIGRlbGV0ZSBwdHI7CisgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgfQorICB9CisgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworfQorCitib29sIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJm9sZFBhcmFtcykgeworICBzaXplX3QgbmV3U2l6ZSA9IG5ld1BhcmFtcy5zaXplKCk7CisgIHNpemVfdCBvbGRTaXplID0gb2xkUGFyYW1zLnNpemUoKTsKKyAgaWYgKG5ld1NpemUgPT0gb2xkU2l6ZSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmV3U2l6ZTsgKytpKSB7CisgICAgICBpZiAobmV3UGFyYW1zW2ldICE9IG9sZFBhcmFtc1tpXSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvcjo6RmlsbChjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmhhbmRsZSwgY29uc3QgdW5zaWduZWQgY2hhciB2YWwpIHsKKyAgaWYgKCFIYW5kbGVBc2htZW06OmlzVmFsaWQoaGFuZGxlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBIYW5kbGVBc2htZW0gKm8gPSBzdGF0aWNfY2FzdDxjb25zdCBIYW5kbGVBc2htZW0qPihoYW5kbGUpOworICB1bnNpZ25lZCBjaGFyICpwdHIgPSAodW5zaWduZWQgY2hhciAqKW1tYXAoCisgICAgICBOVUxMLCBvLT5zaXplKCksIFBST1RfUkVBRHxQUk9UX1dSSVRFLCBNQVBfU0hBUkVELCBvLT5hc2htZW1GZCgpLCAwKTsKKworICBpZiAocHRyICE9IE1BUF9GQUlMRUQpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG8tPnNpemUoKTsgKytpKSB7CisgICAgICBwdHJbaV0gPSB2YWw7CisgICAgfQorICAgIG11bm1hcChwdHIsIG8tPnNpemUoKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsIGNvbnN0IHVuc2lnbmVkIGNoYXIgdmFsKSB7CisgIGlmICghSGFuZGxlQXNobWVtOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSGFuZGxlQXNobWVtICpvID0gc3RhdGljX2Nhc3Q8Y29uc3QgSGFuZGxlQXNobWVtKj4oaGFuZGxlKTsKKyAgdW5zaWduZWQgY2hhciAqcHRyID0gKHVuc2lnbmVkIGNoYXIgKiltbWFwKAorICAgICAgTlVMTCwgby0+c2l6ZSgpLCBQUk9UX1JFQUQsIE1BUF9TSEFSRUQsIG8tPmFzaG1lbUZkKCksIDApOworCisgIGlmIChwdHIgIT0gTUFQX0ZBSUxFRCkgeworICAgIGJvb2wgcmVzID0gdHJ1ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG8tPnNpemUoKTsgKytpKSB7CisgICAgICBpZiAocHRyW2ldICE9IHZhbCkgeworICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIG11bm1hcChwdHIsIG8tPnNpemUoKSk7CisgICAgcmV0dXJuIHJlczsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcyhzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKSB7CisgIGNvbnN0ZXhwciBzdGF0aWMgaW50IGtBbGxvY2F0aW9uU2l6ZSA9IDEwMjQgKiAxMDsKKyAgUGFyYW1zIGFzaG1lbVBhcmFtcyhrQWxsb2NhdGlvblNpemUpOworCisgIHBhcmFtcy0+YXNzaWduKGFzaG1lbVBhcmFtcy5hcnJheSwgYXNobWVtUGFyYW1zLmFycmF5ICsgc2l6ZW9mKGFzaG1lbVBhcmFtcykpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmggYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9hbGxvY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjgxZGMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvYWxsb2NhdG9yLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVk5ES19ISURMX0JVRkZFUlBPT0xfVjJfMF9BTExPQ0FUT1JfSAorI2RlZmluZSBWTkRLX0hJRExfQlVGRkVSUE9PTF9WMl8wX0FMTE9DQVRPUl9ICisKKyNpbmNsdWRlIDxidWZmZXJwb29sL0J1ZmZlclBvb2xUeXBlcy5oPgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OgorICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgQnVmZmVyUG9vbEFsbG9jYXRvcjsKKworLy8gYnVmZmVyIGFsbG9jYXRvciBmb3IgdGhlIHRlc3RzCitjbGFzcyBUZXN0QnVmZmVyUG9vbEFsbG9jYXRvciA6IHB1YmxpYyBCdWZmZXJQb29sQWxsb2NhdG9yIHsKKyBwdWJsaWM6CisgIFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yKCkge30KKworICB+VGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3IoKSBvdmVycmlkZSB7fQorCisgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0aW9uPiAqYWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKmFsbG9jU2l6ZSkgb3ZlcnJpZGU7CisKKyAgYm9vbCBjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmb2xkUGFyYW1zKSBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBGaWxsKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCk7CisKKyAgc3RhdGljIGJvb2wgVmVyaWZ5KGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLCBjb25zdCB1bnNpZ25lZCBjaGFyIHZhbCk7CisKK307CisKKy8vIHJldHJpZXZlIGJ1ZmZlciBhbGxvY2F0b3IgcGFyYW10ZXJzCit2b2lkIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcyk7CisKKyNlbmRpZiAgLy8gVk5ES19ISURMX0JVRkZFUlBPT0xfVjJfMF9BTExPQ0FUT1JfSApkaWZmIC0tZ2l0IGEvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvbXVsdGkuY3BwIGIvbWVkaWEvYnVmZmVycG9vbC8yLjAvdGVzdHMvbXVsdGkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YjY5OTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9tdWx0aS5jcHAKQEAgLTAsMCArMSwyMjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgImJ1ZmZmZXJwb29sX3VuaXRfdGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxidWZmZXJwb29sL0NsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsVHJhbnNwb3J0U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvTGVnYWN5U3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3dhaXQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgImFsbG9jYXRvci5oIgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNsaWVudE1hbmFnZXI7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OlJlc3VsdFN0YXR1czsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkJ1ZmZlcklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6Q2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNvbm5lY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OlRyYW5zYWN0aW9uSWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhOworCituYW1lc3BhY2UgeworCisvLyBjb21tdW5pY2F0aW9uIG1lc3NhZ2UgdHlwZXMgYmV0d2VlbiBwcm9jZXNzZXMuCitlbnVtIFBpcGVDb21tYW5kIDogaW50MzJfdCB7CisgICAgSU5JVF9PSyA9IDAsCisgICAgSU5JVF9FUlJPUiwKKyAgICBTRU5ELAorICAgIFJFQ0VJVkVfT0ssCisgICAgUkVDRUlWRV9FUlJPUiwKK307CisKKy8vIGNvbW11bmljYXRpb24gbWVzc2FnZSBiZXR3ZWVuIHByb2Nlc3Nlcy4KK3VuaW9uIFBpcGVNZXNzYWdlIHsKKyAgICBzdHJ1Y3QgIHsKKyAgICAgICAgaW50MzJfdCBjb21tYW5kOworICAgICAgICBCdWZmZXJJZCBidWZmZXJJZDsKKyAgICAgICAgQ29ubmVjdGlvbklkIGNvbm5lY3Rpb25JZDsKKyAgICAgICAgVHJhbnNhY3Rpb25JZCB0cmFuc2FjdGlvbklkOworICAgICAgICBpbnQ2NF90ICB0aW1lc3RhbXBVczsKKyAgICB9IGRhdGE7CisgICAgY2hhciBhcnJheVswXTsKK307CisKKy8vIG1lZGlhLmJ1ZmZlcnBvb2wgdGVzdCBzZXR1cAorY2xhc3MgQnVmZmVycG9vbE11bHRpVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgIFJlc3VsdFN0YXR1cyBzdGF0dXM7CisgICAgbVJlY2VpdmVyUGlkID0gLTE7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IGZhbHNlOworCisgICAgQVNTRVJUX1RSVUUocGlwZShtQ29tbWFuZFBpcGVGZHMpID09IDApOworICAgIEFTU0VSVF9UUlVFKHBpcGUobVJlc3VsdFBpcGVGZHMpID09IDApOworCisgICAgbVJlY2VpdmVyUGlkID0gZm9yaygpOworICAgIEFTU0VSVF9UUlVFKG1SZWNlaXZlclBpZCA+PSAwKTsKKworICAgIGlmIChtUmVjZWl2ZXJQaWQgPT0gMCkgeworICAgICAgZG9SZWNlaXZlcigpOworICAgICAgLy8gSW4gb3JkZXIgdG8gaWdub3JlIGd0ZXN0IGJlaGF2aW91ciwgd2FpdCBmb3IgYmVpbmcga2lsbGVkIGZyb20KKyAgICAgIC8vIHRlYXJEb3duCisgICAgICBwYXVzZSgpOworICAgIH0KKworICAgIG1NYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICBBU1NFUlRfTkUobU1hbmFnZXIsIG51bGxwdHIpOworCisgICAgbUFsbG9jYXRvciA9IHN0ZDo6bWFrZV9zaGFyZWQ8VGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I+KCk7CisgICAgQVNTRVJUX1RSVUUoKGJvb2wpbUFsbG9jYXRvcik7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+Y3JlYXRlKG1BbGxvY2F0b3IsICZtQ29ubmVjdGlvbklkKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IHRydWU7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgaWYgKG1SZWNlaXZlclBpZCA+IDApIHsKKyAgICAgIGtpbGwobVJlY2VpdmVyUGlkLCBTSUdLSUxMKTsKKyAgICAgIGludCB3c3RhdHVzOworICAgICAgd2FpdCgmd3N0YXR1cyk7CisgICAgfQorCisgICAgaWYgKG1Db25uZWN0aW9uVmFsaWQpIHsKKyAgICAgIG1NYW5hZ2VyLT5jbG9zZShtQ29ubmVjdGlvbklkKTsKKyAgICB9CisgIH0KKworIHByb3RlY3RlZDoKKyAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICB9CisKKyAgYW5kcm9pZDo6c3A8Q2xpZW50TWFuYWdlcj4gbU1hbmFnZXI7CisgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICBib29sIG1Db25uZWN0aW9uVmFsaWQ7CisgIENvbm5lY3Rpb25JZCBtQ29ubmVjdGlvbklkOworICBwaWRfdCBtUmVjZWl2ZXJQaWQ7CisgIGludCBtQ29tbWFuZFBpcGVGZHNbMl07CisgIGludCBtUmVzdWx0UGlwZUZkc1syXTsKKworICBib29sIHNlbmRNZXNzYWdlKGludCAqcGlwZXMsIGNvbnN0IFBpcGVNZXNzYWdlICZtZXNzYWdlKSB7CisgICAgaW50IHJldCA9IHdyaXRlKHBpcGVzWzFdLCBtZXNzYWdlLmFycmF5LCBzaXplb2YoUGlwZU1lc3NhZ2UpKTsKKyAgICByZXR1cm4gcmV0ID09IHNpemVvZihQaXBlTWVzc2FnZSk7CisgIH0KKworICBib29sIHJlY2VpdmVNZXNzYWdlKGludCAqcGlwZXMsIFBpcGVNZXNzYWdlICptZXNzYWdlKSB7CisgICAgaW50IHJldCA9IHJlYWQocGlwZXNbMF0sIG1lc3NhZ2UtPmFycmF5LCBzaXplb2YoUGlwZU1lc3NhZ2UpKTsKKyAgICByZXR1cm4gcmV0ID09IHNpemVvZihQaXBlTWVzc2FnZSk7CisgIH0KKworICB2b2lkIGRvUmVjZWl2ZXIoKSB7CisgICAgY29uZmlndXJlUnBjVGhyZWFkcG9vbCgxLCBmYWxzZSk7CisgICAgUGlwZU1lc3NhZ2UgbWVzc2FnZTsKKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgaWYgKCFtTWFuYWdlcikgeworICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9FUlJPUjsKKyAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYW5kcm9pZDo6c3RhdHVzX3Qgc3RhdHVzID0gbU1hbmFnZXItPnJlZ2lzdGVyQXNTZXJ2aWNlKCk7CisgICAgaWYgKHN0YXR1cyAhPSBhbmRyb2lkOjpPSykgeworICAgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9FUlJPUjsKKyAgICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6SU5JVF9PSzsKKyAgICBzZW5kTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgbWVzc2FnZSk7CisKKyAgICByZWNlaXZlTWVzc2FnZShtQ29tbWFuZFBpcGVGZHMsICZtZXNzYWdlKTsKKyAgICB7CisgICAgICBuYXRpdmVfaGFuZGxlX3QgKnJoYW5kbGUgPSBudWxscHRyOworICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiByYnVmZmVyOworICAgICAgUmVzdWx0U3RhdHVzIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWNlaXZlKAorICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQsIG1lc3NhZ2UuZGF0YS50cmFuc2FjdGlvbklkLAorICAgICAgICAgIG1lc3NhZ2UuZGF0YS5idWZmZXJJZCwgbWVzc2FnZS5kYXRhLnRpbWVzdGFtcFVzLCAmcmhhbmRsZSwgJnJidWZmZXIpOworICAgICAgbU1hbmFnZXItPmNsb3NlKG1lc3NhZ2UuZGF0YS5jb25uZWN0aW9uSWQpOworICAgICAgaWYgKHN0YXR1cyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIGlmICghVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OlZlcmlmeShyaGFuZGxlLCAweDc3KSkgeworICAgICAgICAgIG1lc3NhZ2UuZGF0YS5jb21tYW5kID0gUGlwZUNvbW1hbmQ6OlJFQ0VJVkVfRVJST1I7CisgICAgICAgICAgc2VuZE1lc3NhZ2UobVJlc3VsdFBpcGVGZHMsIG1lc3NhZ2UpOworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBtZXNzYWdlLmRhdGEuY29tbWFuZCA9IFBpcGVDb21tYW5kOjpSRUNFSVZFX09LOworICAgIHNlbmRNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCBtZXNzYWdlKTsKKyAgfQorfTsKKworLy8gQnVmZmVyIHRyYW5zZmVyIHRlc3QgYmV0d2VlbiBwcm9jZXNzZXMuCitURVNUX0YoQnVmZmVycG9vbE11bHRpVGVzdCwgVHJhbnNmZXJCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgUGlwZU1lc3NhZ2UgbWVzc2FnZTsKKworICBBU1NFUlRfVFJVRShyZWNlaXZlTWVzc2FnZShtUmVzdWx0UGlwZUZkcywgJm1lc3NhZ2UpKTsKKworICBhbmRyb2lkOjpzcDxJQ2xpZW50TWFuYWdlcj4gcmVjZWl2ZXIgPSBJQ2xpZW50TWFuYWdlcjo6Z2V0U2VydmljZSgpOworICBDb25uZWN0aW9uSWQgcmVjZWl2ZXJJZDsKKyAgQVNTRVJUX1RSVUUoKGJvb2wpcmVjZWl2ZXIpOworCisgIHN0YXR1cyA9IG1NYW5hZ2VyLT5yZWdpc3RlclNlbmRlcihyZWNlaXZlciwgbUNvbm5lY3Rpb25JZCwgJnJlY2VpdmVySWQpOworICBBU1NFUlRfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIHsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKnNoYW5kbGUgPSBudWxscHRyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gc2J1ZmZlcjsKKyAgICBUcmFuc2FjdGlvbklkIHRyYW5zYWN0aW9uSWQ7CisgICAgaW50NjRfdCBwb3N0VXM7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworCisgICAgZ2V0VGVzdEFsbG9jYXRvclBhcmFtcygmdmVjUGFyYW1zKTsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmc2hhbmRsZSwgJnNidWZmZXIpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKworICAgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpGaWxsKHNoYW5kbGUsIDB4NzcpKTsKKworICAgIHN0YXR1cyA9IG1NYW5hZ2VyLT5wb3N0U2VuZChyZWNlaXZlcklkLCBzYnVmZmVyLCAmdHJhbnNhY3Rpb25JZCwgJnBvc3RVcyk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworCisgICAgbWVzc2FnZS5kYXRhLmNvbW1hbmQgPSBQaXBlQ29tbWFuZDo6U0VORDsKKyAgICBtZXNzYWdlLmRhdGEuYnVmZmVySWQgPSBzYnVmZmVyLT5tSWQ7CisgICAgbWVzc2FnZS5kYXRhLmNvbm5lY3Rpb25JZCA9IHJlY2VpdmVySWQ7CisgICAgbWVzc2FnZS5kYXRhLnRyYW5zYWN0aW9uSWQgPSB0cmFuc2FjdGlvbklkOworICAgIG1lc3NhZ2UuZGF0YS50aW1lc3RhbXBVcyA9IHBvc3RVczsKKyAgICBzZW5kTWVzc2FnZShtQ29tbWFuZFBpcGVGZHMsIG1lc3NhZ2UpOworICB9CisgIEVYUEVDVF9UUlVFKHJlY2VpdmVNZXNzYWdlKG1SZXN1bHRQaXBlRmRzLCAmbWVzc2FnZSkpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICBzZXRlbnYoIlRSRUJMRV9URVNUSU5HX09WRVJSSURFIiwgInRydWUiLCB0cnVlKTsKKyAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgIGludCBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgIExPRyhJTkZPKSA8PCAiVGVzdCByZXN1bHQgPSAiIDw8IHN0YXR1czsKKyAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3Rlc3RzL3NpbmdsZS5jcHAgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9zaW5nbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3N2VkY2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9idWZmZXJwb29sLzIuMC90ZXN0cy9zaW5nbGUuY3BwCkBAIC0wLDAgKzEsMTY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJidWZmZmVycG9vbF91bml0X3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL0xlZ2FjeVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAiYWxsb2NhdG9yLmgiCisKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6QnVmZmVySWQ7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpDbGllbnRNYW5hZ2VyOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6Q29ubmVjdGlvbklkOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6VHJhbnNhY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE7CisKK25hbWVzcGFjZSB7CisKKy8vIE51bWJlciBvZiBpdGVyYXRpb24gZm9yIGJ1ZmZlciBhbGxvY2F0aW9uIHRlc3QuCitjb25zdGV4cHIgc3RhdGljIGludCBrTnVtQWxsb2NhdGlvblRlc3QgPSAzOworCisvLyBOdW1iZXIgb2YgaXRlcmF0aW9uIGZvciBidWZmZXIgcmVjeWNsaW5nIHRlc3QuCitjb25zdGV4cHIgc3RhdGljIGludCBrTnVtUmVjeWNsZVRlc3QgPSAzOworCisvLyBtZWRpYS5idWZmZXJwb29sIHRlc3Qgc2V0dXAKK2NsYXNzIEJ1ZmZlcnBvb2xTaW5nbGVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgICBtQ29ubmVjdGlvblZhbGlkID0gZmFsc2U7CisKKyAgICBtTWFuYWdlciA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgQVNTRVJUX05FKG1NYW5hZ2VyLCBudWxscHRyKTsKKworICAgIG1BbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yPigpOworICAgIEFTU0VSVF9UUlVFKChib29sKW1BbGxvY2F0b3IpOworCisgICAgc3RhdHVzID0gbU1hbmFnZXItPmNyZWF0ZShtQWxsb2NhdG9yLCAmbUNvbm5lY3Rpb25JZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spOworCisgICAgbUNvbm5lY3Rpb25WYWxpZCA9IHRydWU7CisKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIobU1hbmFnZXIsIG1Db25uZWN0aW9uSWQsICZtUmVjZWl2ZXJJZCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6QUxSRUFEWV9FWElTVFMgJiYKKyAgICAgICAgICAgICAgICBtUmVjZWl2ZXJJZCA9PSBtQ29ubmVjdGlvbklkKTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICBpZiAobUNvbm5lY3Rpb25WYWxpZCkgeworICAgICAgbU1hbmFnZXItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgIH0KKyAgfQorCisgcHJvdGVjdGVkOgorICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgIH0KKworICBhbmRyb2lkOjpzcDxDbGllbnRNYW5hZ2VyPiBtTWFuYWdlcjsKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgIGJvb2wgbUNvbm5lY3Rpb25WYWxpZDsKKyAgQ29ubmVjdGlvbklkIG1Db25uZWN0aW9uSWQ7CisgIENvbm5lY3Rpb25JZCBtUmVjZWl2ZXJJZDsKKworfTsKKworLy8gQnVmZmVyIGFsbG9jYXRpb24gdGVzdC4KKy8vIENoZWNrIHdoZXRoZXIgZWFjaCBidWZmZXIgYWxsb2NhdGlvbiBpcyBkb25lIHN1Y2Nlc3NmdWxseSB3aXRoCisvLyB1bmlxdWUgYnVmZmVyIGlkLgorVEVTVF9GKEJ1ZmZlcnBvb2xTaW5nbGVUZXN0LCBBbGxvY2F0ZUJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisKKyAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBidWZmZXJba051bUFsbG9jYXRpb25UZXN0XTsKKyAgbmF0aXZlX2hhbmRsZV90ICphbGxvY0hhbmRsZSA9IG51bGxwdHI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bUFsbG9jYXRpb25UZXN0OyArK2kpIHsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZidWZmZXJbaV0pOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGtOdW1BbGxvY2F0aW9uVGVzdDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwga051bUFsbG9jYXRpb25UZXN0OyArK2opIHsKKyAgICAgIEFTU0VSVF9UUlVFKGJ1ZmZlcltpXS0+bUlkICE9IGJ1ZmZlcltqXS0+bUlkKTsKKyAgICB9CisgIH0KKyAgRVhQRUNUX1RSVUUoa051bUFsbG9jYXRpb25UZXN0ID4gMSk7Cit9CisKKy8vIEJ1ZmZlciByZWN5Y2xlIHRlc3QuCisvLyBDaGVjayB3aGV0aGVyIGRlLWFsbG9jYXRlZCBidWZmZXJzIGFyZSByZWN5Y2xlZC4KK1RFU1RfRihCdWZmZXJwb29sU2luZ2xlVGVzdCwgUmVjeWNsZUJ1ZmZlcikgeworICBSZXN1bHRTdGF0dXMgc3RhdHVzOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiB2ZWNQYXJhbXM7CisgIGdldFRlc3RBbGxvY2F0b3JQYXJhbXMoJnZlY1BhcmFtcyk7CisKKyAgQnVmZmVySWQgYmlkW2tOdW1SZWN5Y2xlVGVzdF07CisgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVJlY3ljbGVUZXN0OyArK2kpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlcjsKKyAgICBuYXRpdmVfaGFuZGxlX3QgKmFsbG9jSGFuZGxlID0gbnVsbHB0cjsKKyAgICBzdGF0dXMgPSBtTWFuYWdlci0+YWxsb2NhdGUobUNvbm5lY3Rpb25JZCwgdmVjUGFyYW1zLCAmYWxsb2NIYW5kbGUsICZidWZmZXIpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgICBiaWRbaV0gPSBidWZmZXItPm1JZDsKKyAgfQorICBmb3IgKGludCBpID0gMTsgaSA8IGtOdW1SZWN5Y2xlVGVzdDsgKytpKSB7CisgICAgQVNTRVJUX1RSVUUoYmlkW2kgLSAxXSA9PSBiaWRbaV0pOworICB9CisgIEVYUEVDVF9UUlVFKGtOdW1SZWN5Y2xlVGVzdCA+IDEpOworfQorCisvLyBCdWZmZXIgdHJhbnNmZXIgdGVzdC4KKy8vIENoZWNrIHdoZXRoZXIgYnVmZmVyIGlzIHRyYW5zZmVycmVkIHRvIGFub3RoZXIgY2xpZW50IHN1Y2Nlc3NmdWxseS4KK1RFU1RfRihCdWZmZXJwb29sU2luZ2xlVGVzdCwgVHJhbnNmZXJCdWZmZXIpIHsKKyAgUmVzdWx0U3RhdHVzIHN0YXR1czsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVjUGFyYW1zOworICBnZXRUZXN0QWxsb2NhdG9yUGFyYW1zKCZ2ZWNQYXJhbXMpOworICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IHNidWZmZXIsIHJidWZmZXI7CisgIG5hdGl2ZV9oYW5kbGVfdCAqYWxsb2NIYW5kbGUgPSBudWxscHRyOworICBuYXRpdmVfaGFuZGxlX3QgKnJlY3ZIYW5kbGUgPSBudWxscHRyOworCisgIFRyYW5zYWN0aW9uSWQgdHJhbnNhY3Rpb25JZDsKKyAgaW50NjRfdCBwb3N0VXM7CisKKyAgc3RhdHVzID0gbU1hbmFnZXItPmFsbG9jYXRlKG1Db25uZWN0aW9uSWQsIHZlY1BhcmFtcywgJmFsbG9jSGFuZGxlLCAmc2J1ZmZlcik7CisgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgQVNTRVJUX1RSVUUoVGVzdEJ1ZmZlclBvb2xBbGxvY2F0b3I6OkZpbGwoYWxsb2NIYW5kbGUsIDB4NzcpKTsKKyAgc3RhdHVzID0gbU1hbmFnZXItPnBvc3RTZW5kKG1SZWNlaXZlcklkLCBzYnVmZmVyLCAmdHJhbnNhY3Rpb25JZCwgJnBvc3RVcyk7CisgIEFTU0VSVF9UUlVFKHN0YXR1cyA9PSBSZXN1bHRTdGF0dXM6Ok9LKTsKKyAgc3RhdHVzID0gbU1hbmFnZXItPnJlY2VpdmUobVJlY2VpdmVySWQsIHRyYW5zYWN0aW9uSWQsIHNidWZmZXItPm1JZCwgcG9zdFVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjdkhhbmRsZSwgJnJidWZmZXIpOworICBFWFBFQ1RfVFJVRShzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpPSyk7CisgIEFTU0VSVF9UUlVFKFRlc3RCdWZmZXJQb29sQWxsb2NhdG9yOjpWZXJpZnkocmVjdkhhbmRsZSwgMHg3NykpOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgTE9HKElORk8pIDw8ICJUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL0FuZHJvaWQubWsgYi9tZWRpYS9jb2RlYzIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQ3MzlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0OCBAQAorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBET0NVTUVOVEFUSU9OIEdFTkVSQVRJT04KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0MyX1JPT1QgOj0gJChjYWxsIG15LWRpcikKKworQzJfRE9DU19ST09UIDo9ICQoT1VUX0RJUikvdGFyZ2V0L2NvbW1vbi9kb2NzL2NvZGVjMgorCitDMl9PVVRfVEVNUCA6PSAkKFBST0RVQ1RfT1VUKS9nZW4vRVRDL0NvZGVjMi1kb2NzX2ludGVybWVkaWF0ZXMKKworQzJfRE9YWSA6PSAkKG9yICQoc2hlbGwgY29tbWFuZCAtdiBkb3h5Z2VuKSxcCisJCSQoc2hlbGwgY29tbWFuZCAtdiAvQXBwbGljYXRpb25zL0RveHlnZW4uYXBwL0NvbnRlbnRzL1Jlc291cmNlcy9kb3h5Z2VuKSkKKworLlBIT05ZOiBjaGVjay1kb3h5Z2VuCitjaGVjay1kb3h5Z2VuOgoraWZuZGVmIEMyX0RPWFkKKwkkKGVycm9yICdkb3h5Z2VuIGlzIG5vdCBhdmFpbGFibGUnKQorZW5kaWYKKworJChDMl9PVVRfVEVNUCkvZG94eS1hcGkuY29uZmlnOiAkKEMyX1JPT1QpL2RvY3MvZG94eWdlbi5jb25maWcKKwkjIG9ubHkgZG9jdW1lbnQgaW5jbHVkZSBkaXJlY3RvcnksIG5vIGludGVybmFsIHNlY3Rpb25zCisJc2VkICdzL1woXklOUFVUICo9LipcKS9cMWluY2x1ZGVcLy87IFwKKwlzL1woXklOVEVSTkFMX0RPQ1MgKj0gKlwpLiovXDFOTy87IFwKKwlzL1woXkVOQUJMRURfU0VDVElPTlMgKj0uKlwpSU5URVJOQUxcKC4qXCkuKi9cMVwyLzsgXAorCXM6XCheT1VUUFVUX0RJUkVDVE9SWSAqPSBcKW91dDpcMSckKE9VVF9ESVIpJzo7JyBcCisJCSQoQzJfUk9PVCkvZG9jcy9kb3h5Z2VuLmNvbmZpZyA+ICRACisKKyQoQzJfT1VUX1RFTVApL2RveHktaW50ZXJuYWwuY29uZmlnOiAkKEMyX1JPT1QpL2RvY3MvZG94eWdlbi5jb25maWcKKwlzZWQgJ3M6XCheT1VUUFVUX0RJUkVDVE9SWSAqPSBcKW91dFwoLipcKWFwaTpcMSckKE9VVF9ESVIpJ1wyaW50ZXJuYWw6OycgXAorCQkkKEMyX1JPT1QpL2RvY3MvZG94eWdlbi5jb25maWcgPiAkQAorCisuUEhPTlk6IGRvY3MtYXBpCitkb2NzLWFwaTogJChDMl9PVVRfVEVNUCkvZG94eS1hcGkuY29uZmlnIGNoZWNrLWRveHlnZW4KKwllY2hvIEFQSSBkb2NzIGFyZSBidWlsZGluZyBpbiAkKEMyX0RPQ1NfUk9PVCkvYXBpCisJcm0gLXJmICQoQzJfRE9DU19ST09UKS9hcGkKKwlta2RpciAtcCAkKEMyX0RPQ1NfUk9PVCkvYXBpCisJJChDMl9ET1hZKSAkKEMyX09VVF9URU1QKS9kb3h5LWFwaS5jb25maWcKKworLlBIT05ZOiBkb2NzLWludGVybmFsCitkb2NzLWludGVybmFsOiAkKEMyX09VVF9URU1QKS9kb3h5LWludGVybmFsLmNvbmZpZyBjaGVjay1kb3h5Z2VuCisJZWNobyBJbnRlcm5hbCBkb2NzIGFyZSBidWlsZGluZyBpbiAkKEMyX0RPQ1NfUk9PVCkvaW50ZXJuYWwKKwlybSAtcmYgJChDMl9ET0NTX1JPT1QpL2ludGVybmFsCisJbWtkaXIgLXAgJChDMl9ET0NTX1JPT1QpL2ludGVybmFsCisJJChDMl9ET1hZKSAkKEMyX09VVF9URU1QKS9kb3h5LWludGVybmFsLmNvbmZpZworCisuUEhPTlk6IGRvY3MtYWxsCitkb2NzLWFsbDogZG9jcy1hcGkgZG9jcy1pbnRlcm5hbAorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoY2FsbCBteS1kaXIpKQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZWNhNTg1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hYWNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMlNvZnRBYWNEZWMuY3BwIiwKKyAgICAgICAgIkRyY1ByZXNNb2RlV3JhcC5jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliRnJhdW5ob2ZlckFBQyIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hYWNlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEFhY0VuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJGcmF1bmhvZmVyQUFDIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDRlMTI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5jcHAKQEAgLTAsMCArMSw5MjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFhY0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxudW1lcmljPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QWFjRGVjLmgiCisKKyNkZWZpbmUgRklMRVJFQURfTUFYX0xBWUVSUyAyCisKKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCAtMTYuMCAgLyogNjQqLTAuMjVkQiA9IC0xNiBkQiBiZWxvdyBmdWxsIHNjYWxlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0NVVCAgIDEuMCAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QgMS4wIC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19IRUFWWSBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZICAgLyogc3dpdGNoIGZvciBoZWF2eSBjb21wcmVzc2lvbiBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19FRkZFQ1QgMyAgLyogTVBFRy1EIERSQyBlZmZlY3QgdHlwZTsgMyA9PiBMaW1pdGVkIHBsYXliYWNrIHJhbmdlICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwgKDAuMjUpIC8qIGVuY29kZXIgdGFyZ2V0IGxldmVsOyAtMSA9PiB0aGUgdmFsdWUgaXMgdW5rbm93biwgb3RoZXJ3aXNlIGRCIHN0ZXAgdmFsdWUgKGUuZy4gNjQgZm9yIC0xNiBkQikgKi8KKyNkZWZpbmUgTUFYX0NIQU5ORUxfQ09VTlQgICAgICAgICAgICA4ICAvKiBtYXhpbXVtIG51bWJlciBvZiBhdWRpbyBjaGFubmVscyB0aGF0IGNhbiBiZSBkZWNvZGVkICovCisvLyBuYW1lcyBvZiBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGRlZmF1bHQgRFJDIHNldHRpbmdzCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX1JFRl9MRVZFTCAgImFhY19kcmNfcmVmZXJlbmNlX2xldmVsIgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9DVVQgICAgICAgICJhYWNfZHJjX2N1dCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QgICAgICAiYWFjX2RyY19ib29zdCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlkgICAgICAiYWFjX2RyY19oZWF2eSIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRU5DX0xFVkVMICJhYWNfZHJjX2VuY190YXJnZXRfbGV2ZWwiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0VGRkVDVCAgICAgInJvLmFhY19kcmNfZWZmZWN0X3R5cGUiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmFhYy5kZWNvZGVyIjsKKworY2xhc3MgQzJTb2Z0QWFjRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOworICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsT3V0cHV0RGVsYXksIEMyX1BBUkFNS0VZX09VVFBVVF9ERUxBWSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQoMnUpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgNzM1MCwgODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwCisgICAgICAgICAgICAgICAgfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNoYW5uZWxDb3VudCwgQzJfUEFSQU1LRVlfQ0hBTk5FTF9DT1VOVCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDgwMDAsIDk2MDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFhY0Zvcm1hdCwgQzJfUEFSQU1LRVlfQUFDX1BBQ0tBR0lORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQWFjRm9ybWF0SW5mbzo6aW5wdXQoMHUsIEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX1JBVykpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQWFjRm9ybWF0LCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19SQVcsIEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX0FEVFMKKyAgICAgICAgICAgICAgICB9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQWFjRm9ybWF0KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDLCBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEVfUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VSX1NDQUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19YSEV9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1VOVVNFRAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0NvbXByZXNzTW9kZSwgQzJfUEFSQU1LRVlfRFJDX0NPTVBSRVNTSU9OX01PREUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0NvbXByZXNzaW9uTW9kZVR1bmluZzo6aW5wdXQoMHUsIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fSEVBVlkpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EcmNDb21wcmVzc01vZGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9PRE1fREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9MSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0NvbXByZXNzTW9kZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjVGFyZ2V0UmVmTGV2ZWwsIEMyX1BBUkFNS0VZX0RSQ19UQVJHRVRfUkVGRVJFTkNFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNUYXJnZXRSZWZlcmVuY2VMZXZlbFR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY1RhcmdldFJlZkxldmVsLCB2YWx1ZSkuaW5SYW5nZSgtMzEuNzUsIDAuMjUpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNUYXJnZXRSZWZMZXZlbCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjRW5jVGFyZ2V0TGV2ZWwsIEMyX1BBUkFNS0VZX0RSQ19FTkNPREVEX1RBUkdFVF9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjRW5jb2RlZFRhcmdldExldmVsVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjRW5jVGFyZ2V0TGV2ZWwsIHZhbHVlKS5pblJhbmdlKC0zMS43NSwgMC4yNSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0VuY1RhcmdldExldmVsKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNCb29zdEZhY3RvciwgQzJfUEFSQU1LRVlfRFJDX0JPT1NUX0ZBQ1RPUikKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjQm9vc3RGYWN0b3JUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNCb29zdEZhY3RvciwgdmFsdWUpLmluUmFuZ2UoMCwgMS4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNCb29zdEZhY3Rvcik+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjQXR0ZW51YXRpb25GYWN0b3IsIEMyX1BBUkFNS0VZX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0F0dGVudWF0aW9uRmFjdG9yVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY0F0dGVudWF0aW9uRmFjdG9yLCB2YWx1ZSkuaW5SYW5nZSgwLCAxLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0F0dGVudWF0aW9uRmFjdG9yKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNFZmZlY3RUeXBlLCBDMl9QQVJBTUtFWV9EUkNfRUZGRUNUX1RZUEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0VmZmVjdFR5cGVUdW5pbmc6OmlucHV0KDB1LCBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MSU1JVEVEX1BMQVlCQUNLX1JBTkdFKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRHJjRWZmZWN0VHlwZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9PRE1fREVGQVVMVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9PRkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MQVRFX05JR0hULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX05PSVNZX0VOVklST05NRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xJTUlURURfUExBWUJBQ0tfUkFOR0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTE9XX1BMQVlCQUNLX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0RJQUxPR19FTkhBTkNFTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9HRU5FUkFMX0NPTVBSRVNTSU9OfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbURyY0VmZmVjdFR5cGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBib29sIGlzQWR0cygpIGNvbnN0IHsgcmV0dXJuIG1BYWNGb3JtYXQtPnZhbHVlID09IEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX0FEVFM7IH0KKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorICAgIGludDMyX3QgZ2V0RHJjQ29tcHJlc3NNb2RlKCkgY29uc3QgeyByZXR1cm4gbURyY0NvbXByZXNzTW9kZS0+dmFsdWUgPT0gQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWSA/IDEgOiAwOyB9CisgICAgaW50MzJfdCBnZXREcmNUYXJnZXRSZWZMZXZlbCgpIGNvbnN0IHsgcmV0dXJuIChtRHJjVGFyZ2V0UmVmTGV2ZWwtPnZhbHVlIDw9IDAgPyAtbURyY1RhcmdldFJlZkxldmVsLT52YWx1ZSAqIDQuICsgMC41IDogLTEpOyB9CisgICAgaW50MzJfdCBnZXREcmNFbmNUYXJnZXRMZXZlbCgpIGNvbnN0IHsgcmV0dXJuIChtRHJjRW5jVGFyZ2V0TGV2ZWwtPnZhbHVlIDw9IDAgPyAtbURyY0VuY1RhcmdldExldmVsLT52YWx1ZSAqIDQuICsgMC41IDogLTEpOyB9CisgICAgaW50MzJfdCBnZXREcmNCb29zdEZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1EcmNCb29zdEZhY3Rvci0+dmFsdWUgKiAxMjcuICsgMC41OyB9CisgICAgaW50MzJfdCBnZXREcmNBdHRlbnVhdGlvbkZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIG1EcmNBdHRlbnVhdGlvbkZhY3Rvci0+dmFsdWUgKiAxMjcuICsgMC41OyB9CisgICAgaW50MzJfdCBnZXREcmNFZmZlY3RUeXBlKCkgY29uc3QgeyByZXR1cm4gbURyY0VmZmVjdFR5cGUtPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUFhY0Zvcm1hdEluZm86OmlucHV0PiBtQWFjRm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0NvbXByZXNzaW9uTW9kZVR1bmluZzo6aW5wdXQ+IG1EcmNDb21wcmVzc01vZGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWxUdW5pbmc6OmlucHV0PiBtRHJjVGFyZ2V0UmVmTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjRW5jb2RlZFRhcmdldExldmVsVHVuaW5nOjppbnB1dD4gbURyY0VuY1RhcmdldExldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0Jvb3N0RmFjdG9yVHVuaW5nOjppbnB1dD4gbURyY0Jvb3N0RmFjdG9yOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0F0dGVudWF0aW9uRmFjdG9yVHVuaW5nOjppbnB1dD4gbURyY0F0dGVudWF0aW9uRmFjdG9yOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbURyY0VmZmVjdFR5cGVUdW5pbmc6OmlucHV0PiBtRHJjRWZmZWN0VHlwZTsKKyAgICAvLyBUT0RPIEFkZCA6IEMyU3RyZWFtQWFjU2JyTW9kZVR1bmluZworfTsKKworQzJTb2Z0QWFjRGVjOjpDMlNvZnRBYWNEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUFBQ0RlY29kZXIobnVsbHB0ciksCisgICAgICBtU3RyZWFtSW5mbyhudWxscHRyKSwKKyAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCisgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyKG51bGxwdHIpIHsKK30KKworQzJTb2Z0QWFjRGVjOjp+QzJTb2Z0QWFjRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNEZWM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RGVjb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRGVjOjpvblN0b3AoKSB7CisgICAgZHJhaW5EZWNvZGVyKCk7CisgICAgLy8gcmVzZXQgdGhlICJjb25maWd1cmVkIiBzdGF0ZQorICAgIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkID0gMDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID0gMDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkID0gMDsKKyAgICBtQnVmZmVyc0luZm8uY2xlYXIoKTsKKworICAgIC8vIFRvIG1ha2UgdGhlIGNvZGVjIGJlaGF2ZSB0aGUgc2FtZSBiZWZvcmUgYW5kIGFmdGVyIGEgcmVzZXQsIHdlIG5lZWQgdG8gaW52YWxpZGF0ZSB0aGUKKyAgICAvLyBzdHJlYW1pbmZvIHN0cnVjdC4gVGhpcyBkb2VzIHRoYXQ6CisgICAgbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUgPSAwOyAvLyBUT0RPOiBtU3RyZWFtSW5mbyBpcyByZWFkIG9ubHkKKworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFhY0RlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRBYWNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobUFBQ0RlY29kZXIpIHsKKyAgICAgICAgYWFjRGVjb2Rlcl9DbG9zZShtQUFDRGVjb2Rlcik7CisgICAgICAgIG1BQUNEZWNvZGVyID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXIpIHsKKyAgICAgICAgZGVsZXRlW10gbU91dHB1dERlbGF5UmluZ0J1ZmZlcjsKKyAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlciA9IG51bGxwdHI7CisgICAgfQorfQorCitzdGF0dXNfdCBDMlNvZnRBYWNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIEFMT0dWKCJpbml0RGVjb2RlcigpIik7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICBtQUFDRGVjb2RlciA9IGFhY0RlY29kZXJfT3BlbihUVF9NUDRfQURJRiwgLyogbnVtIGxheWVycyAqLyAxKTsKKyAgICBpZiAobUFBQ0RlY29kZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtU3RyZWFtSW5mbyA9IGFhY0RlY29kZXJfR2V0U3RyZWFtSW5mbyhtQUFDRGVjb2Rlcik7CisgICAgICAgIGlmIChtU3RyZWFtSW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBPSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1PdXRwdXREZWxheUNvbXBlbnNhdGVkID0gMDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSA9IDIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVCAqIGtOdW1EZWxheUJsb2Nrc01heDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyID0gbmV3IHNob3J0W21PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplXTsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgPSAwOworICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID0gMDsKKyAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyRmlsbGVkID0gMDsKKworICAgIGlmIChtQUFDRGVjb2RlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJBQUMgZGVjb2RlciBpcyBudWxsLiBUT0RPOiBDYW4gbm90IGNhbGwgYWFjRGVjb2Rlcl9TZXRQYXJhbSBpbiB0aGUgZm9sbG93aW5nIGNvZGUiKTsKKyAgICB9CisKKyAgICAvL2FhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19QQ01fTElNSVRFUl9FTkFCTEUsIDApOworCisgICAgLy9pbml0IERSQyB3cmFwcGVyCisgICAgbURyY1dyYXAuc2V0RGVjb2RlckhhbmRsZShtQUFDRGVjb2Rlcik7CisgICAgbURyY1dyYXAuc3VibWl0U3RyZWFtRGF0YShtU3RyZWFtSW5mbyk7CisKKyAgICAvLyBmb3Igc3RyZWFtcyB0aGF0IGNvbnRhaW4gbWV0YWRhdGEsIHVzZSB0aGUgbW9iaWxlIHByb2ZpbGUgRFJDIHNldHRpbmdzIHVubGVzcyBvdmVycmlkZGVuIGJ5IHBsYXRmb3JtIHByb3BlcnRpZXMKKyAgICAvLyBUT0RPOiBjaGFuZ2UgdGhlIERSQyBzZXR0aW5ncyBkZXBlbmRpbmcgb24gYXVkaW8gb3V0cHV0IGRldmljZSB0eXBlIChIRE1JLCBsb2Fkc3BlYWtlciwgaGVhZHBob25lKQorCisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVAorICAgIGludDMyX3QgdGFyZ2V0UmVmTGV2ZWwgPSBtSW50Zi0+Z2V0RHJjVGFyZ2V0UmVmTGV2ZWwoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBvZiAlZCIsIHRhcmdldFJlZkxldmVsKTsKKyAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9UQVJHRVQsICh1bnNpZ25lZCl0YXJnZXRSZWZMZXZlbCk7CisKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUgorCisgICAgaW50MzJfdCBhdHRlbnVhdGlvbkZhY3RvciA9IG1JbnRmLT5nZXREcmNBdHRlbnVhdGlvbkZhY3RvcigpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyBhdHRlbnVhdGlvbiBmYWN0b3Igb2YgJWQiLCBhdHRlbnVhdGlvbkZhY3Rvcik7CisgICAgbURyY1dyYXAuc2V0UGFyYW0oRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQVRUX0ZBQ1RPUiwgKHVuc2lnbmVkKWF0dGVudWF0aW9uRmFjdG9yKTsKKworICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1IKKyAgICBpbnQzMl90IGJvb3N0RmFjdG9yID0gbUludGYtPmdldERyY0Jvb3N0RmFjdG9yKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc2lyZWQgRFJDIGJvb3N0IGZhY3RvciBvZiAlZCIsIGJvb3N0RmFjdG9yKTsKKyAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1IsICh1bnNpZ25lZClib29zdEZhY3Rvcik7CisKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfSEVBVlkKKyAgICBpbnQzMl90IGNvbXByZXNzTW9kZSA9IG1JbnRmLT5nZXREcmNDb21wcmVzc01vZGUoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzcmllZCBEUkMgaGVhdnkgY29tcHJlc3Npb24gc3dpdGNoIG9mICVkIiwgY29tcHJlc3NNb2RlKTsKKyAgICBtRHJjV3JhcC5zZXRQYXJhbShEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWSwgKHVuc2lnbmVkKWNvbXByZXNzTW9kZSk7CisKKyAgICAvLyBEUkNfUFJFU19NT0RFX1dSQVBfRU5DT0RFUl9UQVJHRVQKKyAgICBpbnQzMl90IGVuY1RhcmdldExldmVsID0gbUludGYtPmdldERyY0VuY1RhcmdldExldmVsKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGVuY29kZXItc2lkZSBEUkMgcmVmZXJlbmNlIGxldmVsIG9mICVkIiwgZW5jVGFyZ2V0TGV2ZWwpOworICAgIG1EcmNXcmFwLnNldFBhcmFtKERSQ19QUkVTX01PREVfV1JBUF9FTkNPREVSX1RBUkdFVCwgKHVuc2lnbmVkKWVuY1RhcmdldExldmVsKTsKKworICAgIC8vIEFBQ19VTklEUkNfU0VUX0VGRkVDVAorICAgIGludDMyX3QgZWZmZWN0VHlwZSA9IG1JbnRmLT5nZXREcmNFZmZlY3RUeXBlKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIE1QRUctRCBEUkMgZWZmZWN0IHR5cGUgJWQiLCBlZmZlY3RUeXBlKTsKKyAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfVU5JRFJDX1NFVF9FRkZFQ1QsIGVmZmVjdFR5cGUpOworCisgICAgLy8gQnkgZGVmYXVsdCwgdGhlIGRlY29kZXIgY3JlYXRlcyBhIDUuMSBjaGFubmVsIGRvd25taXggc2lnbmFsLgorICAgIC8vIEZvciBzZXZlbiBhbmQgZWlnaHQgY2hhbm5lbCBpbnB1dCBzdHJlYW1zLCBlbmFibGUgNi4xIGFuZCA3LjEgY2hhbm5lbCBvdXRwdXQKKyAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1BQUNEZWNvZGVyLCBBQUNfUENNX01BWF9PVVRQVVRfQ0hBTk5FTFMsIC0xKTsKKworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2Jvb2wgQzJTb2Z0QWFjRGVjOjpvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKElOVF9QQ00gKnNhbXBsZXMsIGludDMyX3QgbnVtU2FtcGxlcykgeworICAgIGlmIChudW1TYW1wbGVzID09IDApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGlmIChvdXRwdXREZWxheVJpbmdCdWZmZXJTcGFjZUxlZnQoKSA8IG51bVNhbXBsZXMpIHsKKyAgICAgICAgQUxPR0UoIlJJTkcgQlVGRkVSIFdPVUxEIE9WRVJGTE9XIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyArIG51bVNhbXBsZXMgPD0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUKKyAgICAgICAgICAgICYmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyA8PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MKKyAgICAgICAgICAgICAgICAgICAgfHwgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPiBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgKyBudW1TYW1wbGVzKSkgeworICAgICAgICAvLyBmYXN0ZXIgbWVtY29weSBsb29wIHdpdGhvdXQgY2hlY2tzLCBpZiB0aGUgcHJlY29uZGl0aW9ucyBhbGxvdyB0aGlzCisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclttT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MrK10gPSBzYW1wbGVzW2ldOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvcyA+PSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zIC09IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoInNsb3cgQzJTb2Z0QWFjRGVjOjpvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKCkiKTsKKworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJbbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zXSA9IHNhbXBsZXNbaV07CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MrKzsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgPj0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgLT0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCArPSBudW1TYW1wbGVzOworICAgIHJldHVybiB0cnVlOworfQorCitpbnQzMl90IEMyU29mdEFhY0RlYzo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcyhJTlRfUENNICpzYW1wbGVzLCBpbnQzMl90IG51bVNhbXBsZXMpIHsKKworICAgIGlmIChudW1TYW1wbGVzID4gbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCkgeworICAgICAgICBBTE9HRSgiUklORyBCVUZGRVIgV09VTEQgVU5ERVJSVU4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGlmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcyArIG51bVNhbXBsZXMgPD0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUKKyAgICAgICAgICAgICYmIChtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgPCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcworICAgICAgICAgICAgICAgICAgICB8fCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyV3JpdGVQb3MgPj0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgKyBudW1TYW1wbGVzKSkgeworICAgICAgICAvLyBmYXN0ZXIgbWVtY29weSBsb29wIHdpdGhvdXQgY2hlY2tzLCBpZiB0aGUgcHJlY29uZGl0aW9ucyBhbGxvdyB0aGlzCisgICAgICAgIGlmIChzYW1wbGVzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAgICAgICAgIHNhbXBsZXNbaV0gPSBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyW21PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zKytdOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgKz0gbnVtU2FtcGxlczsKKyAgICAgICAgfQorICAgICAgICBpZiAobU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgPj0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUpIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zIC09IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoInNsb3cgQzJTb2Z0QWFjRGVjOjpvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKCkiKTsKKworICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzYW1wbGVzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBzYW1wbGVzW2ldID0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclttT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvc107CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyUmVhZFBvcysrOworICAgICAgICAgICAgaWYgKG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID49IG1PdXRwdXREZWxheVJpbmdCdWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlclJlYWRQb3MgLT0gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZCAtPSBudW1TYW1wbGVzOworICAgIHJldHVybiBudW1TYW1wbGVzOworfQorCitpbnQzMl90IEMyU29mdEFhY0RlYzo6b3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpIHsKKyAgICByZXR1cm4gbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZDsKK30KKworaW50MzJfdCBDMlNvZnRBYWNEZWM6Om91dHB1dERlbGF5UmluZ0J1ZmZlclNwYWNlTGVmdCgpIHsKKyAgICByZXR1cm4gbU91dHB1dERlbGF5UmluZ0J1ZmZlclNpemUgLSBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCk7Cit9CisKK3ZvaWQgQzJTb2Z0QWFjRGVjOjpkcmFpblJpbmdCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBib29sIGVvcykgeworICAgIHdoaWxlICghbUJ1ZmZlcnNJbmZvLmVtcHR5KCkgJiYgb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpCisgICAgICAgICAgICA+PSBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7CisgICAgICAgIEluZm8gJm91dEluZm8gPSBtQnVmZmVyc0luZm8uZnJvbnQoKTsKKyAgICAgICAgQUxPR1YoIm91dEluZm8uZnJhbWVJbmRleCA9ICUiIFBSSXU2NCwgb3V0SW5mby5mcmFtZUluZGV4KTsKKyAgICAgICAgaW50IHNhbXBsZXNpemUgX191bnVzZWQgPSBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7CisKKyAgICAgICAgaW50IGF2YWlsYWJsZSA9IG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKKyAgICAgICAgaW50IG51bUZyYW1lcyA9IG91dEluZm8uZGVjb2RlZFNpemVzLnNpemUoKTsKKyAgICAgICAgaW50IG51bVNhbXBsZXMgPSBudW1GcmFtZXMgKiAobVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscyk7CisgICAgICAgIGlmIChhdmFpbGFibGUgPCBudW1TYW1wbGVzKSB7CisgICAgICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyA9IGF2YWlsYWJsZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiVkIHNhbXBsZXMgYXZhaWxhYmxlICglZCksIG9yICVkIGZyYW1lcyIsCisgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywgYXZhaWxhYmxlLCBudW1GcmFtZXMpOworICAgICAgICBBTE9HVigiZ2V0dGluZyAlZCBmcm9tIHJpbmdidWZmZXIiLCBudW1TYW1wbGVzKTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYpPiBmaWxsV29yayA9CisgICAgICAgICAgICBbJmJsb2NrLCBudW1TYW1wbGVzLCBwb29sLCB0aGlzXSgpCisgICAgICAgICAgICAgICAgICAgIC0+IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYpPiB7CisgICAgICAgICAgICAgICAgYXV0byBmaWxsRW1wdHlXb3JrID0gW10oCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywgYzJfc3RhdHVzX3QgZXJyKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycjsKKyAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGEgJm91dHB1dCA9IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpwbGFjZWhvbGRlcnM7CisgICAgICAgICAgICAgICAgaWYgKG51bVNhbXBsZXMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpiaW5kKGZpbGxFbXB0eVdvcmssIF8xLCBDMl9PSyk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcsIHByb3BlciB1c2FnZSwgZXRjLgorICAgICAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KSwgdXNhZ2UsICZibG9jayk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIGZldGNoIGEgbGluZWFyIGJsb2NrICglZCkiLCBlcnIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RkOjpiaW5kKGZpbGxFbXB0eVdvcmssIF8xLCBDMl9OT19NRU1PUlkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDMldyaXRlVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgSU5UX1BDTSAqb3V0QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxJTlRfUENNICo+KHdWaWV3LmRhdGEoKSk7CisgICAgICAgICAgICAgICAgaW50MzJfdCBucyA9IG91dHB1dERlbGF5UmluZ0J1ZmZlckdldFNhbXBsZXMob3V0QnVmZmVyLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBpZiAobnMgIT0gbnVtU2FtcGxlcykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgibm90IGEgY29tcGxldGUgZnJhbWUgb2Ygc2FtcGxlcyBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YmluZChmaWxsRW1wdHlXb3JrLCBfMSwgQzJfQ09SUlVQVEVEKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIFtidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2spXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YSAmb3V0cHV0ID0gd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0OworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfSgpOworCisgICAgICAgIGlmICh3b3JrICYmIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9PSBjMl9jbnRyNjRfdChvdXRJbmZvLmZyYW1lSW5kZXgpKSB7CisgICAgICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbmlzaChvdXRJbmZvLmZyYW1lSW5kZXgsIGZpbGxXb3JrKTsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJvdXQgdGltZXN0YW1wICUiIFBSSXU2NCAiIC8gJXUiLCBvdXRJbmZvLnRpbWVzdGFtcCwgYmxvY2sgPyBibG9jay0+Y2FwYWNpdHkoKSA6IDApOworICAgICAgICBtQnVmZmVyc0luZm8ucG9wX2Zyb250KCk7CisgICAgfQorfQorCit2b2lkIEMyU29mdEFhY0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBVQ0hBUiogaW5CdWZmZXJbRklMRVJFQURfTUFYX0xBWUVSU107CisgICAgVUlOVCBpbkJ1ZmZlckxlbmd0aFtGSUxFUkVBRF9NQVhfTEFZRVJTXSA9IHswfTsKKyAgICBVSU5UIGJ5dGVzVmFsaWRbRklMRVJFQURfTUFYX0xBWUVSU10gPSB7MH07CisKKyAgICBJTlRfUENNIHRtcE91dEJ1ZmZlclsyMDQ4ICogTUFYX0NIQU5ORUxfQ09VTlRdOworICAgIEMyUmVhZFZpZXcgdmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIHNpemVfdCBvZmZzZXQgPSAwdTsKKyAgICBzaXplX3Qgc2l6ZSA9IDB1OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgc2l6ZSA9IHZpZXcuY2FwYWNpdHkoKTsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMDsKKworICAgIC8vVE9ETworI2lmIDAKKyAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMCAmJiAhY29kZWNDb25maWcpIHsKKyAgICAgICAgQUxPR1coImZpcnN0IGJ1ZmZlciBzaG91bGQgaGF2ZSBGTEFHX0NPREVDX0NPTkZJRyBzZXQiKTsKKyAgICAgICAgY29kZWNDb25maWcgPSB0cnVlOworICAgIH0KKyNlbmRpZgorICAgIGlmIChjb2RlY0NvbmZpZyAmJiBzaXplID4gMHUpIHsKKyAgICAgICAgLy8gY29uc3RfY2FzdCBiZWNhdXNlIG9mIGxpYkFBQ2RlYyBtZXRob2Qgc2lnbmF0dXJlLgorICAgICAgICBpbkJ1ZmZlclswXSA9IGNvbnN0X2Nhc3Q8VUNIQVIgKj4odmlldy5kYXRhKCkgKyBvZmZzZXQpOworICAgICAgICBpbkJ1ZmZlckxlbmd0aFswXSA9IHNpemU7CisKKyAgICAgICAgQUFDX0RFQ09ERVJfRVJST1IgZGVjb2RlckVyciA9CisgICAgICAgICAgICBhYWNEZWNvZGVyX0NvbmZpZ1JhdyhtQUFDRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGgpOworCisgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IEFBQ19ERUNfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJhYWNEZWNvZGVyX0NvbmZpZ1JhdyBkZWNvZGVyRXJyID0gMHglNC40eCIsIGRlY29kZXJFcnIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgSW5mbyBpbkluZm87CisgICAgaW5JbmZvLmZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICBpbkluZm8udGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKTsKKyAgICBpbkluZm8uYnVmZmVyU2l6ZSA9IHNpemU7CisgICAgaW5JbmZvLmRlY29kZWRTaXplcy5jbGVhcigpOworICAgIHdoaWxlIChzaXplID4gMHUpIHsKKyAgICAgICAgQUxPR1YoInNpemUgPSAlenUiLCBzaXplKTsKKyAgICAgICAgaWYgKG1JbnRmLT5pc0FkdHMoKSkgeworICAgICAgICAgICAgc2l6ZV90IGFkdHNIZWFkZXJTaXplID0gMDsKKyAgICAgICAgICAgIC8vIHNraXAgMzAgYml0cywgYWFjX2ZyYW1lX2xlbmd0aCBmb2xsb3dzLgorICAgICAgICAgICAgLy8gc3Nzc3Nzc3Mgc3Nzc2lpaXAgcHBmZmZmUGMgY2NvaENDbGwgbGxsbGxsbGwgbGxsPz8/Pz8KKworICAgICAgICAgICAgY29uc3QgdWludDhfdCAqYWR0c0hlYWRlciA9IHZpZXcuZGF0YSgpICsgb2Zmc2V0OworCisgICAgICAgICAgICBib29sIHNpZ25hbEVycm9yID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IDcpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQXVkaW8gZGF0YSB0b28gc2hvcnQgdG8gY29udGFpbiBldmVuIHRoZSBBRFRTIGhlYWRlci4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIkdvdCAlenUgYnl0ZXMuIiwgc2l6ZSk7CisgICAgICAgICAgICAgICAgaGV4ZHVtcChhZHRzSGVhZGVyLCBzaXplKTsKKyAgICAgICAgICAgICAgICBzaWduYWxFcnJvciA9IHRydWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJvb2wgcHJvdGVjdGlvbkFic2VudCA9IChhZHRzSGVhZGVyWzFdICYgMSk7CisKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBhYWNfZnJhbWVfbGVuZ3RoID0KKyAgICAgICAgICAgICAgICAgICAgKChhZHRzSGVhZGVyWzNdICYgMykgPDwgMTEpCisgICAgICAgICAgICAgICAgICAgIHwgKGFkdHNIZWFkZXJbNF0gPDwgMykKKyAgICAgICAgICAgICAgICAgICAgfCAoYWR0c0hlYWRlcls1XSA+PiA1KTsKKworICAgICAgICAgICAgICAgIGlmIChzaXplIDwgYWFjX2ZyYW1lX2xlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBhdWRpbyBkYXRhIGZvciB0aGUgY29tcGxldGUgZnJhbWUuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR290ICV6dSBieXRlcywgZnJhbWUgc2l6ZSBhY2NvcmRpbmcgdG8gdGhlIEFEVFMgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZWFkZXIgaXMgJXUgYnl0ZXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCBhYWNfZnJhbWVfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgaGV4ZHVtcChhZHRzSGVhZGVyLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgc2lnbmFsRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFkdHNIZWFkZXJTaXplID0gKHByb3RlY3Rpb25BYnNlbnQgPyA3IDogOSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhYWNfZnJhbWVfbGVuZ3RoIDwgYWR0c0hlYWRlclNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0X2Nhc3QgYmVjYXVzZSBvZiBsaWJBQUNkZWMgbWV0aG9kIHNpZ25hdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyWzBdID0gY29uc3RfY2FzdDxVQ0hBUiAqPihhZHRzSGVhZGVyICsgYWR0c0hlYWRlclNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGhbMF0gPSBhYWNfZnJhbWVfbGVuZ3RoIC0gYWR0c0hlYWRlclNpemU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBhZHRzSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgLT0gYWR0c0hlYWRlclNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzaWduYWxFcnJvcikgeworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIGNvbnN0X2Nhc3QgYmVjYXVzZSBvZiBsaWJBQUNkZWMgbWV0aG9kIHNpZ25hdHVyZS4KKyAgICAgICAgICAgIGluQnVmZmVyWzBdID0gY29uc3RfY2FzdDxVQ0hBUiAqPih2aWV3LmRhdGEoKSArIG9mZnNldCk7CisgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aFswXSA9IHNpemU7CisgICAgICAgIH0KKworICAgICAgICAvLyBGaWxsIGFuZCBkZWNvZGUKKyAgICAgICAgYnl0ZXNWYWxpZFswXSA9IGluQnVmZmVyTGVuZ3RoWzBdOworCisgICAgICAgIElOVCBwcmV2U2FtcGxlUmF0ZSA9IG1TdHJlYW1JbmZvLT5zYW1wbGVSYXRlOworICAgICAgICBJTlQgcHJldk51bUNoYW5uZWxzID0gbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworCisgICAgICAgIGFhY0RlY29kZXJfRmlsbChtQUFDRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICBieXRlc1ZhbGlkKTsKKworICAgICAgICAvLyBydW4gRFJDIGNoZWNrCisgICAgICAgIG1EcmNXcmFwLnN1Ym1pdFN0cmVhbURhdGEobVN0cmVhbUluZm8pOworICAgICAgICBtRHJjV3JhcC51cGRhdGUoKTsKKworICAgICAgICBVSU5UIGluQnVmZmVyVXNlZExlbmd0aCA9IGluQnVmZmVyTGVuZ3RoWzBdIC0gYnl0ZXNWYWxpZFswXTsKKyAgICAgICAgc2l6ZSAtPSBpbkJ1ZmZlclVzZWRMZW5ndGg7CisgICAgICAgIG9mZnNldCArPSBpbkJ1ZmZlclVzZWRMZW5ndGg7CisKKyAgICAgICAgQUFDX0RFQ09ERVJfRVJST1IgZGVjb2RlckVycjsKKyAgICAgICAgZG8geworICAgICAgICAgICAgaWYgKG91dHB1dERlbGF5UmluZ0J1ZmZlclNwYWNlTGVmdCgpIDwKKyAgICAgICAgICAgICAgICAgICAgKG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNraXBwaW5nIGRlY29kZTogbm90IGVub3VnaCBzcGFjZSBsZWZ0IGluIHJpbmdidWZmZXIiKTsKKyAgICAgICAgICAgICAgICAvLyBkaXNjYXJkIGJ1ZmZlcgorICAgICAgICAgICAgICAgIHNpemUgPSAwOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgbnVtQ29uc3VtZWQgPSBtU3RyZWFtSW5mby0+bnVtVG90YWxCeXRlczsKKyAgICAgICAgICAgIGRlY29kZXJFcnIgPSBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKG1BQUNEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wT3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBmbGFncyAqLyk7CisKKyAgICAgICAgICAgIG51bUNvbnN1bWVkID0gbVN0cmVhbUluZm8tPm51bVRvdGFsQnl0ZXMgLSBudW1Db25zdW1lZDsKKworICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgPT0gQUFDX0RFQ19OT1RfRU5PVUdIX0JJVFMpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluSW5mby5kZWNvZGVkU2l6ZXMucHVzaF9iYWNrKG51bUNvbnN1bWVkKTsKKworICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgICAgIEFMT0dXKCJhYWNEZWNvZGVyX0RlY29kZUZyYW1lIGRlY29kZXJFcnIgPSAweCU0LjR4IiwgZGVjb2RlckVycik7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChieXRlc1ZhbGlkWzBdICE9IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYnl0ZXNWYWxpZFswXSAhPSAwIHNob3VsZCBuZXZlciBoYXBwZW4iKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHNpemVfdCBudW1PdXRCeXRlcyA9CisgICAgICAgICAgICAgICAgbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVsczsKKworICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgPT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgICAgIGlmICghb3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyh0bXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSkgeworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJBQUMgZGVjb2RlciByZXR1cm5lZCBlcnJvciAweCU0LjR4LCBzdWJzdGl0dXRpbmcgc2lsZW5jZSIsIGRlY29kZXJFcnIpOworCisgICAgICAgICAgICAgICAgbWVtc2V0KHRtcE91dEJ1ZmZlciwgMCwgbnVtT3V0Qnl0ZXMpOyAvLyBUT0RPOiBjaGVjayBmb3Igb3ZlcmZsb3cKKworICAgICAgICAgICAgICAgIGlmICghb3V0cHV0RGVsYXlSaW5nQnVmZmVyUHV0U2FtcGxlcyh0bXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSkgeworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBEaXNjYXJkIGlucHV0IGJ1ZmZlci4KKyAgICAgICAgICAgICAgICBzaXplID0gMDsKKworICAgICAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUFBQ0RlY29kZXIsIEFBQ19UUERFQ19DTEVBUl9CVUZGRVIsIDEpOworCisgICAgICAgICAgICAgICAgLy8gQWZ0ZXIgYW4gZXJyb3IsIHJlcGxhY2UgYnVmZmVyU2l6ZSB3aXRoIHRoZSBzdW0gb2YgdGhlCisgICAgICAgICAgICAgICAgLy8gZGVjb2RlZFNpemVzIHRvIHJlc3luY2hyb25pemUgdGhlIGluL291dCBsaXN0cy4KKyAgICAgICAgICAgICAgICBpbkluZm8uZGVjb2RlZFNpemVzLnBvcF9iYWNrKCk7CisgICAgICAgICAgICAgICAgaW5JbmZvLmJ1ZmZlclNpemUgPSBzdGQ6OmFjY3VtdWxhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBpbkluZm8uZGVjb2RlZFNpemVzLmJlZ2luKCksIGluSW5mby5kZWNvZGVkU2l6ZXMuZW5kKCksIDApOworCisgICAgICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBBQUMrL2VBQUMrIHN0cmVhbXMgY2FuIGJlIHNpZ25hbGxlZCBpbiB0d28gd2F5czogZWl0aGVyIGV4cGxpY2l0bHkKKyAgICAgICAgICAgICAqIG9yIGltcGxpY2l0bHksIGFjY29yZGluZyB0byBNUEVHNCBzcGVjLiBBQUMrL2VBQUMrIGlzIGEgZHVhbAorICAgICAgICAgICAgICogcmF0ZSBzeXN0ZW0gYW5kIHRoZSBzYW1wbGluZyByYXRlIGluIHRoZSBmaW5hbCBvdXRwdXQgaXMgYWN0dWFsbHkKKyAgICAgICAgICAgICAqIGRvdWJsZWQgY29tcGFyZWQgd2l0aCB0aGUgY29yZSBBQUMgZGVjb2RlciBzYW1wbGluZyByYXRlLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIEV4cGxpY2l0IHNpZ25hbGxpbmcgaXMgZG9uZSBieSBleHBsaWNpdGx5IGRlZmluaW5nIFNCUiBhdWRpbyBvYmplY3QKKyAgICAgICAgICAgICAqIHR5cGUgaW4gdGhlIGJpdHN0cmVhbS4gSW1wbGljaXQgc2lnbmFsbGluZyBpcyBkb25lIGJ5IGVtYmVkZGluZworICAgICAgICAgICAgICogU0JSIGNvbnRlbnQgaW4gQUFDIGV4dGVuc2lvbiBwYXlsb2FkIHNwZWNpZmljIHRvIFNCUiwgYW5kIGhlbmNlCisgICAgICAgICAgICAgKiByZXF1aXJlcyBhbiBBQUMgZGVjb2RlciB0byBwZXJmb3JtIHByZS1jaGVja3Mgb24gYWN0dWFsIGF1ZGlvIGZyYW1lcy4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBUaHVzLCB3ZSBjb3VsZCBub3Qgc2F5IGZvciBzdXJlIHdoZXRoZXIgYSBzdHJlYW0gaXMKKyAgICAgICAgICAgICAqIEFBQysvZUFBQysgdW50aWwgdGhlIGZpcnN0IGRhdGEgZnJhbWUgaXMgZGVjb2RlZC4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCFtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSB8fCAhbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgLy8gaWYgKChtSW5wdXRCdWZmZXJDb3VudCA+IDIpICYmIChtT3V0cHV0QnVmZmVyQ291bnQgPD0gMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkludmFsaWQgQUFDIHN0cmVhbSIpOworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgZGVjb2RlckVyciwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIC8vIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgLy8gfQorICAgICAgICAgICAgfSBlbHNlIGlmICgobVN0cmVhbUluZm8tPnNhbXBsZVJhdGUgIT0gcHJldlNhbXBsZVJhdGUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMgIT0gcHJldk51bUNoYW5uZWxzKSkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJSZWNvbmZpZ3VyaW5nIGRlY29kZXI6ICVkLT4lZCBIeiwgJWQtPiVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgICAgICAgICAgICBwcmV2U2FtcGxlUmF0ZSwgbVN0cmVhbUluZm8tPnNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgcHJldk51bUNoYW5uZWxzLCBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHMpOworCisgICAgICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBtU3RyZWFtSW5mby0+c2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygwdSwgbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgJnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mbyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgZG9lcyBub3QgaGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSB2YWx1ZXMgYXJlCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIGFsdGVyZWQgZHVyaW5nIGNvbmZpZy4KKyAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGEgJm91dHB1dCA9IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dDsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShzYW1wbGVSYXRlSW5mbykpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KGNoYW5uZWxDb3VudEluZm8pKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIFVwZGF0ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoInNpemUgPSAlenUiLCBzaXplKTsKKyAgICAgICAgfSB3aGlsZSAoZGVjb2RlckVyciA9PSBBQUNfREVDX09LKTsKKyAgICB9CisKKyAgICBpbnQzMl90IG91dHB1dERlbGF5ID0gbVN0cmVhbUluZm8tPm91dHB1dERlbGF5ICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworCisgICAgbUJ1ZmZlcnNJbmZvLnB1c2hfYmFjayhzdGQ6Om1vdmUoaW5JbmZvKSk7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICBpZiAoIWVvcyAmJiBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCA8IG91dHB1dERlbGF5KSB7CisgICAgICAgIC8vIGRpc2NhcmQgb3V0cHV0RGVsYXkgYXQgdGhlIGJlZ2lubmluZworICAgICAgICBpbnQzMl90IHRvQ29tcGVuc2F0ZSA9IG91dHB1dERlbGF5IC0gbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQ7CisgICAgICAgIGludDMyX3QgZGlzY2FyZCA9IG91dHB1dERlbGF5UmluZ0J1ZmZlclNhbXBsZXNBdmFpbGFibGUoKTsKKyAgICAgICAgaWYgKGRpc2NhcmQgPiB0b0NvbXBlbnNhdGUpIHsKKyAgICAgICAgICAgIGRpc2NhcmQgPSB0b0NvbXBlbnNhdGU7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBkaXNjYXJkZWQgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKG51bGxwdHIsIGRpc2NhcmQpOworICAgICAgICBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZCArPSBkaXNjYXJkZWQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkcmFpblJpbmdCdWZmZXIod29yaywgcG9vbCwgZmFsc2UgLyogbm90IEVPUyAqLyk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNEZWM6OmRyYWluSW50ZXJuYWwoCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAoZHJhaW5Nb2RlID09IERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUyk7CisKKyAgICBkcmFpbkRlY29kZXIoKTsKKyAgICBkcmFpblJpbmdCdWZmZXIod29yaywgcG9vbCwgZW9zKTsKKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgYXV0byBmaWxsRW1wdHlXb3JrID0gW10oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgIH07CisgICAgICAgIHdoaWxlIChtQnVmZmVyc0luZm8uc2l6ZSgpID4gMXUpIHsKKyAgICAgICAgICAgIGZpbmlzaChtQnVmZmVyc0luZm8uZnJvbnQoKS5mcmFtZUluZGV4LCBmaWxsRW1wdHlXb3JrKTsKKyAgICAgICAgICAgIG1CdWZmZXJzSW5mby5wb3BfZnJvbnQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAod29yayAmJiB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9PSAwdSkgeworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgfQorICAgICAgICBtQnVmZmVyc0luZm8uY2xlYXIoKTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFhY0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBkcmFpbkRlY29kZXIoKTsKKyAgICBtQnVmZmVyc0luZm8uY2xlYXIoKTsKKworICAgIGludCBhdmFpbDsKKyAgICB3aGlsZSAoKGF2YWlsID0gb3V0cHV0RGVsYXlSaW5nQnVmZmVyU2FtcGxlc0F2YWlsYWJsZSgpKSA+IDApIHsKKyAgICAgICAgaWYgKGF2YWlsID4gbVN0cmVhbUluZm8tPmZyYW1lU2l6ZSAqIG1TdHJlYW1JbmZvLT5udW1DaGFubmVscykgeworICAgICAgICAgICAgYXZhaWwgPSBtU3RyZWFtSW5mby0+ZnJhbWVTaXplICogbVN0cmVhbUluZm8tPm51bUNoYW5uZWxzOworICAgICAgICB9CisgICAgICAgIGludDMyX3QgbnMgPSBvdXRwdXREZWxheVJpbmdCdWZmZXJHZXRTYW1wbGVzKG51bGxwdHIsIGF2YWlsKTsKKyAgICAgICAgaWYgKG5zICE9IGF2YWlsKSB7CisgICAgICAgICAgICBBTE9HVygibm90IGEgY29tcGxldGUgZnJhbWUgb2Ygc2FtcGxlcyBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zID0gbU91dHB1dERlbGF5UmluZ0J1ZmZlcldyaXRlUG9zOworCisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFhY0RlYzo6ZHJhaW5EZWNvZGVyKCkgeworICAgIC8vIGZsdXNoIGRlY29kZXIgdW50aWwgb3V0cHV0RGVsYXkgaXMgY29tcGVuc2F0ZWQKKyAgICB3aGlsZSAobU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgPiAwKSB7CisgICAgICAgIC8vIGEgYnVmZmVyIGJpZyBlbm91Z2ggZm9yIE1BWF9DSEFOTkVMX0NPVU5UIGNoYW5uZWxzIG9mIGRlY29kZWQgSEUtQUFDCisgICAgICAgIElOVF9QQ00gdG1wT3V0QnVmZmVyWzIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVF07CisKKyAgICAgICAgLy8gcnVuIERSQyBjaGVjaworICAgICAgICBtRHJjV3JhcC5zdWJtaXRTdHJlYW1EYXRhKG1TdHJlYW1JbmZvKTsKKyAgICAgICAgbURyY1dyYXAudXBkYXRlKCk7CisKKyAgICAgICAgQUFDX0RFQ09ERVJfRVJST1IgZGVjb2RlckVyciA9CisgICAgICAgICAgICBhYWNEZWNvZGVyX0RlY29kZUZyYW1lKG1BQUNEZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0bXBPdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwNDggKiBNQVhfQ0hBTk5FTF9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFDREVDX0ZMVVNIKTsKKyAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gQUFDX0RFQ19PSykgeworICAgICAgICAgICAgQUxPR1coImFhY0RlY29kZXJfRGVjb2RlRnJhbWUgZGVjb2RlckVyciA9IDB4JTQuNHgiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgdG1wT3V0QnVmZmVyU2FtcGxlcyA9IG1TdHJlYW1JbmZvLT5mcmFtZVNpemUgKiBtU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisgICAgICAgIGlmICh0bXBPdXRCdWZmZXJTYW1wbGVzID4gbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQpIHsKKyAgICAgICAgICAgIHRtcE91dEJ1ZmZlclNhbXBsZXMgPSBtT3V0cHV0RGVsYXlDb21wZW5zYXRlZDsKKyAgICAgICAgfQorICAgICAgICBvdXRwdXREZWxheVJpbmdCdWZmZXJQdXRTYW1wbGVzKHRtcE91dEJ1ZmZlciwgdG1wT3V0QnVmZmVyU2FtcGxlcyk7CisKKyAgICAgICAgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQgLT0gdG1wT3V0QnVmZmVyU2FtcGxlczsKKyAgICB9Cit9CisKK2NsYXNzIEMyU29mdEFhY0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRBYWNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0QWFjRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFhY0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEFhY0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFhY0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEFhY0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEFhY0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0MyU29mdEFhY0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NWMyOWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRGVjLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BQUNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BQUNfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKKyNpbmNsdWRlICJhYWNkZWNvZGVyX2xpYi5oIgorI2luY2x1ZGUgIkRyY1ByZXNNb2RlV3JhcC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRBYWNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0QWFjRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEFhY0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga051bURlbGF5QmxvY2tzTWF4ICAgICAgPSA4LAorICAgIH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworCisgICAgSEFORExFX0FBQ0RFQ09ERVIgbUFBQ0RlY29kZXI7CisgICAgQ1N0cmVhbUluZm8gKm1TdHJlYW1JbmZvOworICAgIGJvb2wgbUlzRmlyc3Q7CisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworICAgIHNpemVfdCBtT3V0cHV0QnVmZmVyQ291bnQ7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgc3RydWN0IEluZm8geworICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4OworICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZTsKKyAgICAgICAgdWludDY0X3QgdGltZXN0YW1wOworICAgICAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBkZWNvZGVkU2l6ZXM7CisgICAgfTsKKyAgICBzdGQ6Omxpc3Q8SW5mbz4gbUJ1ZmZlcnNJbmZvOworCisgICAgQ0RyY1ByZXNNb2RlV3JhcHBlciBtRHJjV3JhcDsKKworICAgIGVudW0geworICAgICAgICBOT05FLAorICAgICAgICBBV0FJVElOR19ESVNBQkxFRCwKKyAgICAgICAgQVdBSVRJTkdfRU5BQkxFRAorICAgIH0gbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZTsKKworICAgIHZvaWQgaW5pdFBvcnRzKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBib29sIGlzQ29uZmlndXJlZCgpIGNvbnN0OworICAgIHZvaWQgZHJhaW5EZWNvZGVyKCk7CisKKyAgICB2b2lkIGRyYWluUmluZ0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGJvb2wgZW9zKTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKworLy8gICAgICBkZWxheSBjb21wZW5zYXRpb24KKyAgICBib29sIG1FbmRPZklucHV0OworICAgIGJvb2wgbUVuZE9mT3V0cHV0OworICAgIGludDMyX3QgbU91dHB1dERlbGF5Q29tcGVuc2F0ZWQ7CisgICAgaW50MzJfdCBtT3V0cHV0RGVsYXlSaW5nQnVmZmVyU2l6ZTsKKyAgICBzaG9ydCAqbU91dHB1dERlbGF5UmluZ0J1ZmZlcjsKKyAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJXcml0ZVBvczsKKyAgICBpbnQzMl90IG1PdXRwdXREZWxheVJpbmdCdWZmZXJSZWFkUG9zOworICAgIGludDMyX3QgbU91dHB1dERlbGF5UmluZ0J1ZmZlckZpbGxlZDsKKyAgICBib29sIG91dHB1dERlbGF5UmluZ0J1ZmZlclB1dFNhbXBsZXMoSU5UX1BDTSAqc2FtcGxlcywgaW50IG51bVNhbXBsZXMpOworICAgIGludDMyX3Qgb3V0cHV0RGVsYXlSaW5nQnVmZmVyR2V0U2FtcGxlcyhJTlRfUENNICpzYW1wbGVzLCBpbnQgbnVtU2FtcGxlcyk7CisgICAgaW50MzJfdCBvdXRwdXREZWxheVJpbmdCdWZmZXJTYW1wbGVzQXZhaWxhYmxlKCk7CisgICAgaW50MzJfdCBvdXRwdXREZWxheVJpbmdCdWZmZXJTcGFjZUxlZnQoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEFhY0RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BQUNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYjk0ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRW5jLmNwcApAQCAtMCwwICsxLDY4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QWFjRW5jIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QWFjRW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmFhYy5lbmNvZGVyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEMyU29mdEFhY0VuYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoCisgICAgICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICA4MDAwLCAxMTAyNSwgMTIwMDAsIDE2MDAwLCAyMjA1MCwgMjQwMDAsIDMyMDAwLCA0NDEwMCwgNDgwMDAKKyAgICAgICAgICAgICAgICB9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDYpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg4MDAwLCA5NjAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKE1heEJ1ZlNpemVDYWxjdWxhdG9yLCBtQ2hhbm5lbENvdW50KQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDLCBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEVfUFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FTER9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1VOVVNFRAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU0JSTW9kZSwgQzJfUEFSQU1LRVlfQUFDX1NCUl9NT0RFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1BYWNTYnJNb2RlVHVuaW5nOjppbnB1dCgwdSwgQUFDX1NCUl9BVVRPKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TQlJNb2RlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpBQUNfU0JSX09GRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6QUFDX1NCUl9TSU5HTEVfUkFURSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6QUFDX1NCUl9EVUFMX1JBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkFBQ19TQlJfQVVUTyB9KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptU0JSTW9kZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRDaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50LT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldEJpdHJhdGUoKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRTQlJNb2RlKCkgY29uc3QgeyByZXR1cm4gbVNCUk1vZGUtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0UHJvZmlsZSgpIGNvbnN0IHsgcmV0dXJuIG1Qcm9maWxlTGV2ZWwtPnByb2ZpbGU7IH0KKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4QnVmU2l6ZUNhbGN1bGF0b3IoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgQzJQPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gJmNoYW5uZWxDb3VudCkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAxMDI0ICogc2l6ZW9mKHNob3J0KSAqIGNoYW5uZWxDb3VudC52LnZhbHVlOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQWFjU2JyTW9kZVR1bmluZzo6aW5wdXQ+IG1TQlJNb2RlOworfTsKKworQzJTb2Z0QWFjRW5jOjpDMlNvZnRBYWNFbmMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUFBQ0VuY29kZXIobnVsbHB0ciksCisgICAgICBtTnVtQnl0ZXNQZXJJbnB1dEZyYW1lKDB1KSwKKyAgICAgIG1PdXRCdWZmZXJTaXplKDB1KSwKKyAgICAgIG1TZW50Q29kZWNTcGVjaWZpY0RhdGEoZmFsc2UpLAorICAgICAgbUlucHV0U2l6ZSgwKSwKKyAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCisgICAgICBtT3V0SW5kZXgoMHUpLAorICAgICAgbVJlbWFpbmRlckxlbigwdSkgeworfQorCitDMlNvZnRBYWNFbmM6On5DMlNvZnRBYWNFbmMoKSB7CisgICAgb25SZXNldCgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNFbmM6Om9uSW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBpbml0RW5jb2RlcigpOworICAgIHJldHVybiBlcnIgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKworc3RhdHVzX3QgQzJTb2Z0QWFjRW5jOjppbml0RW5jb2RlcigpIHsKKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY09wZW4oJm1BQUNFbmNvZGVyLCAwLCAwKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgQUFDIGVuY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIHJldHVybiBzZXRBdWRpb1BhcmFtcygpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNFbmM6Om9uU3RvcCgpIHsKKyAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhID0gZmFsc2U7CisgICAgbUlucHV0U2l6ZSA9IDB1OworICAgIG1OZXh0RnJhbWVUaW1lc3RhbXBVcy5yZXNldCgpOworICAgIG1MYXN0RnJhbWVFbmRUaW1lc3RhbXBVcy5yZXNldCgpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1SZW1haW5kZXJMZW4gPSAwOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBYWNFbmM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7CisgICAgYWFjRW5jQ2xvc2UoJm1BQUNFbmNvZGVyKTsKK30KKwordm9pZCBDMlNvZnRBYWNFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICAvLyBuby1vcAorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBYWNFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgbVNlbnRDb2RlY1NwZWNpZmljRGF0YSA9IGZhbHNlOworICAgIG1JbnB1dFNpemUgPSAwdTsKKyAgICBtTmV4dEZyYW1lVGltZXN0YW1wVXMucmVzZXQoKTsKKyAgICBtTGFzdEZyYW1lRW5kVGltZXN0YW1wVXMucmVzZXQoKTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyBDSEFOTkVMX01PREUgZ2V0Q2hhbm5lbE1vZGUodWludDMyX3QgbkNoYW5uZWxzKSB7CisgICAgQ0hBTk5FTF9NT0RFIGNoTW9kZSA9IE1PREVfSU5WQUxJRDsKKyAgICBzd2l0Y2ggKG5DaGFubmVscykgeworICAgICAgICBjYXNlIDE6IGNoTW9kZSA9IE1PREVfMTsgYnJlYWs7CisgICAgICAgIGNhc2UgMjogY2hNb2RlID0gTU9ERV8yOyBicmVhazsKKyAgICAgICAgY2FzZSAzOiBjaE1vZGUgPSBNT0RFXzFfMjsgYnJlYWs7CisgICAgICAgIGNhc2UgNDogY2hNb2RlID0gTU9ERV8xXzJfMTsgYnJlYWs7CisgICAgICAgIGNhc2UgNTogY2hNb2RlID0gTU9ERV8xXzJfMjsgYnJlYWs7CisgICAgICAgIGNhc2UgNjogY2hNb2RlID0gTU9ERV8xXzJfMl8xOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogY2hNb2RlID0gTU9ERV9JTlZBTElEOworICAgIH0KKyAgICByZXR1cm4gY2hNb2RlOworfQorCitzdGF0aWMgQVVESU9fT0JKRUNUX1RZUEUgZ2V0QU9URnJvbVByb2ZpbGUodWludDMyX3QgcHJvZmlsZSkgeworICAgaWYgKHByb2ZpbGUgPT0gQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDKSB7CisgICAgICAgcmV0dXJuIEFPVF9BQUNfTEM7CisgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFKSB7CisgICAgICAgcmV0dXJuIEFPVF9TQlI7CisgICB9IGVsc2UgaWYgKHByb2ZpbGUgPT0gQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFX1BTKSB7CisgICAgICAgcmV0dXJuIEFPVF9QUzsKKyAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEQpIHsKKyAgICAgICByZXR1cm4gQU9UX0VSX0FBQ19MRDsKKyAgIH0gZWxzZSBpZiAocHJvZmlsZSA9PSBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRUxEKSB7CisgICAgICAgcmV0dXJuIEFPVF9FUl9BQUNfRUxEOworICAgfSBlbHNlIHsKKyAgICAgICBBTE9HVygiVW5zdXBwb3J0ZWQgQUFDIHByb2ZpbGUgLSBkZWZhdWx0aW5nIHRvIEFBQy1MQyIpOworICAgICAgIHJldHVybiBBT1RfQUFDX0xDOworICAgfQorfQorCitzdGF0dXNfdCBDMlNvZnRBYWNFbmM6OnNldEF1ZGlvUGFyYW1zKCkgeworICAgIC8vIFdlIGNhbGwgdGhpcyB3aGVuZXZlciBzYW1wbGUgcmF0ZSwgbnVtYmVyIG9mIGNoYW5uZWxzLCBiaXRyYXRlIG9yIFNCUiBtb2RlIGNoYW5nZQorICAgIC8vIGluIHJlcG9uc2UgdG8gc2V0UGFyYW1ldGVyIGNhbGxzLgorICAgIGludDMyX3Qgc2JyUmF0aW8gPSAwOworICAgIHVpbnQzMl90IHNick1vZGUgPSBtSW50Zi0+Z2V0U0JSTW9kZSgpOworICAgIGlmIChzYnJNb2RlID09IEFBQ19TQlJfU0lOR0xFX1JBVEUpIHNiclJhdGlvID0gMTsKKyAgICBlbHNlIGlmIChzYnJNb2RlID09IEFBQ19TQlJfRFVBTF9SQVRFKSBzYnJSYXRpbyA9IDI7CisKKyAgICBBTE9HVigic2V0QXVkaW9QYXJhbXM6ICV1IEh6LCAldSBjaGFubmVscywgJXUgYnBzLCAlaSBzYnIgbW9kZSwgJWkgc2JyIHJhdGlvIiwKKyAgICAgICAgIG1JbnRmLT5nZXRTYW1wbGVSYXRlKCksIG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKSwgbUludGYtPmdldEJpdHJhdGUoKSwKKyAgICAgICAgIHNick1vZGUsIHNiclJhdGlvKTsKKworICAgIHVpbnQzMl90IGFhY1Byb2ZpbGUgPSBtSW50Zi0+Z2V0UHJvZmlsZSgpOworICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jb2Rlcl9TZXRQYXJhbShtQUFDRW5jb2RlciwgQUFDRU5DX0FPVCwgZ2V0QU9URnJvbVByb2ZpbGUoYWFjUHJvZmlsZSkpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEFBQyBlbmNvZGVyIHBhcmFtZXRlcnMiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfU0FNUExFUkFURSwgbUludGYtPmdldFNhbXBsZVJhdGUoKSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfQklUUkFURSwgbUludGYtPmdldEJpdHJhdGUoKSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfQ0hBTk5FTE1PREUsCisgICAgICAgICAgICBnZXRDaGFubmVsTW9kZShtSW50Zi0+Z2V0Q2hhbm5lbENvdW50KCkpKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19UUkFOU01VWCwgVFRfTVA0X1JBVykpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgQUFDIGVuY29kZXIgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAoc2JyTW9kZSAhPSAtMSAmJiBhYWNQcm9maWxlID09IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FTEQpIHsKKyAgICAgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNvZGVyX1NldFBhcmFtKG1BQUNFbmNvZGVyLCBBQUNFTkNfU0JSX01PREUsIHNick1vZGUpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNCUiByYXRpbyBwYXJhbWV0ZXIgY29uZmlndXJhdGlvbnM6CisgICAgICAgMDogRGVmYXVsdCBjb25maWd1cmF0aW9uIHdoZXJlaW4gU0JSIHJhdGlvIGlzIGNvbmZpZ3VyZWQgZGVwZW5kaW5nIG9uIGF1ZGlvIG9iamVjdCB0eXBlIGJ5CisgICAgICAgICAgdGhlIEZESy4KKyAgICAgICAxOiBEb3duc2FtcGxlZCBTQlIgKGRlZmF1bHQgZm9yIEVMRCkKKyAgICAgICAyOiBEdWFscmF0ZSBTQlIgKGRlZmF1bHQgZm9yIEhFLUFBQykKKyAgICAgKi8KKyAgICBpZiAoQUFDRU5DX09LICE9IGFhY0VuY29kZXJfU2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19TQlJfUkFUSU8sIHNiclJhdGlvKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBQUMgZW5jb2RlciBwYXJhbWV0ZXJzIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDMlNvZnRBYWNFbmM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYm9vbCBlb3MgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworCisgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IG1JbnRmLT5nZXRTYW1wbGVSYXRlKCk7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gbUludGYtPmdldENoYW5uZWxDb3VudCgpOworCisgICAgaWYgKCFtU2VudENvZGVjU3BlY2lmaWNEYXRhKSB7CisgICAgICAgIC8vIFRoZSB2ZXJ5IGZpcnN0IHRoaW5nIHdlIHdhbnQgdG8gb3V0cHV0IGlzIHRoZSBjb2RlYyBzcGVjaWZpYworICAgICAgICAvLyBkYXRhLgorCisgICAgICAgIGlmIChBQUNFTkNfT0sgIT0gYWFjRW5jRW5jb2RlKG1BQUNFbmNvZGVyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyLCBudWxscHRyKSkgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBpbml0aWFsaXplIGVuY29kZXIgZm9yIHByb2ZpbGUgLyBzYW1wbGUtcmF0ZSAvIGJpdC1yYXRlIC8gY2hhbm5lbHMiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICB1aW50MzJfdCBiaXRyYXRlID0gbUludGYtPmdldEJpdHJhdGUoKTsKKyAgICAgICAgdWludDMyX3QgYWN0dWFsQml0UmF0ZSA9IGFhY0VuY29kZXJfR2V0UGFyYW0obUFBQ0VuY29kZXIsIEFBQ0VOQ19CSVRSQVRFKTsKKyAgICAgICAgaWYgKGJpdHJhdGUgIT0gYWN0dWFsQml0UmF0ZSkgeworICAgICAgICAgICAgQUxPR1coIlJlcXVlc3RlZCBiaXRyYXRlICV1IHVuc3VwcG9ydGVkLCB1c2luZyAldSIsIGJpdHJhdGUsIGFjdHVhbEJpdFJhdGUpOworICAgICAgICB9CisKKyAgICAgICAgQUFDRU5DX0luZm9TdHJ1Y3QgZW5jSW5mbzsKKyAgICAgICAgaWYgKEFBQ0VOQ19PSyAhPSBhYWNFbmNJbmZvKG1BQUNFbmNvZGVyLCAmZW5jSW5mbykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IEFBQyBlbmNvZGVyIGluZm8iKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gY3NkID0KKyAgICAgICAgICAgIEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKGVuY0luZm8uY29uZlNpemUsIDB1KTsKKyAgICAgICAgaWYgKCFjc2QpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDU0QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGNzZC0+bS52YWx1ZSwgZW5jSW5mby5jb25mQnVmLCBlbmNJbmZvLmNvbmZTaXplKTsKKyAgICAgICAgQUxPR1YoInB1dCBjc2QiKTsKKyNpZiBkZWZpbmVkKExPR19OREVCVUcpICYmICFMT0dfTkRFQlVHCisgICAgICAgIGhleGR1bXAoY3NkLT5tLnZhbHVlLCBjc2QtPmZsZXhDb3VudCgpKTsKKyNlbmRpZgorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhzdGQ6Om1vdmUoY3NkKSk7CisKKyAgICAgICAgbU91dEJ1ZmZlclNpemUgPSBlbmNJbmZvLm1heE91dEJ1ZkJ5dGVzOworICAgICAgICBtTnVtQnl0ZXNQZXJJbnB1dEZyYW1lID0gZW5jSW5mby5mcmFtZUxlbmd0aCAqIGNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQxNl90KTsKKworICAgICAgICBtU2VudENvZGVjU3BlY2lmaWNEYXRhID0gdHJ1ZTsKKyAgICB9CisKKyAgICB1aW50OF90IHRlbXBbMV07CisgICAgQzJSZWFkVmlldyB2aWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IHRlbXA7CisgICAgc2l6ZV90IGNhcGFjaXR5ID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgdmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBkYXRhID0gdmlldy5kYXRhKCk7CisgICAgICAgIGNhcGFjaXR5ID0gdmlldy5jYXBhY2l0eSgpOworICAgIH0KKyAgICBjMl9jbnRyNjRfdCBpbnB1dFRpbWVzdGFtcFVzID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXA7CisgICAgaWYgKGlucHV0VGltZXN0YW1wVXMgPCBtTGFzdEZyYW1lRW5kVGltZXN0YW1wVXMudmFsdWVfb3IoaW5wdXRUaW1lc3RhbXBVcykpIHsKKyAgICAgICAgQUxPR1coIkNvcnJlY3Rpbmcgb3ZlcmxhcHBpbmcgdGltZXN0YW1wOiBsYXN0IGZyYW1lIGVuZGVkIGF0ICVsbGR1cyBidXQgIgorICAgICAgICAgICAgICAiY3VycmVudCBmcmFtZSBpcyBzdGFydGluZyBhdCAlbGxkdXMuIFVzaW5nIHRoZSBsYXN0IGZyYW1lJ3MgZW5kIHRpbWVzdGFtcCIsCisgICAgICAgICAgICAgIG1MYXN0RnJhbWVFbmRUaW1lc3RhbXBVcy0+cGVla2xsKCksIGlucHV0VGltZXN0YW1wVXMucGVla2xsKCkpOworICAgICAgICBpbnB1dFRpbWVzdGFtcFVzID0gKm1MYXN0RnJhbWVFbmRUaW1lc3RhbXBVczsKKyAgICB9CisgICAgaWYgKGNhcGFjaXR5ID4gMCkgeworICAgICAgICBpZiAoIW1OZXh0RnJhbWVUaW1lc3RhbXBVcykgeworICAgICAgICAgICAgbU5leHRGcmFtZVRpbWVzdGFtcFVzID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXA7CisgICAgICAgIH0KKyAgICAgICAgbUxhc3RGcmFtZUVuZFRpbWVzdGFtcFVzID0gaW5wdXRUaW1lc3RhbXBVcworICAgICAgICAgICAgICAgICsgKGNhcGFjaXR5IC8gc2l6ZW9mKGludDE2X3QpICogMTAwMDAwMGxsIC8gY2hhbm5lbENvdW50IC8gc2FtcGxlUmF0ZSk7CisgICAgfQorCisgICAgc2l6ZV90IG51bUZyYW1lcyA9CisgICAgICAgIChtUmVtYWluZGVyTGVuICsgY2FwYWNpdHkgKyBtSW5wdXRTaXplICsgKGVvcyA/IG1OdW1CeXRlc1BlcklucHV0RnJhbWUgLSAxIDogMCkpCisgICAgICAgIC8gbU51bUJ5dGVzUGVySW5wdXRGcmFtZTsKKyAgICBBTE9HVigiY2FwYWNpdHkgPSAlenU7IG1JbnB1dFNpemUgPSAlenU7IG51bUZyYW1lcyA9ICV6dSAiCisgICAgICAgICAgIm1OdW1CeXRlc1BlcklucHV0RnJhbWUgPSAldSBpbnB1dFRTID0gJWxsZCByZW1haW5pbmcgPSAlenUiLAorICAgICAgICAgIGNhcGFjaXR5LCBtSW5wdXRTaXplLCBudW1GcmFtZXMsIG1OdW1CeXRlc1BlcklucHV0RnJhbWUsIGlucHV0VGltZXN0YW1wVXMucGVla2xsKCksCisgICAgICAgICAgbVJlbWFpbmRlckxlbik7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV3JpdGVWaWV3PiB3VmlldzsKKyAgICB1aW50OF90ICpvdXRQdHIgPSB0ZW1wOworICAgIHNpemVfdCBvdXRBdmFpbGFibGUgPSAwdTsKKyAgICB1aW50NjRfdCBpbnB1dEluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgc2l6ZV90IGJ5dGVzUGVyU2FtcGxlID0gY2hhbm5lbENvdW50ICogc2l6ZW9mKGludDE2X3QpOworCisgICAgQUFDRU5DX0luQXJncyBpbmFyZ3M7CisgICAgQUFDRU5DX091dEFyZ3Mgb3V0YXJnczsKKyAgICBtZW1zZXQoJmluYXJncywgMCwgc2l6ZW9mKGluYXJncykpOworICAgIG1lbXNldCgmb3V0YXJncywgMCwgc2l6ZW9mKG91dGFyZ3MpKTsKKyAgICBpbmFyZ3MubnVtSW5TYW1wbGVzID0gY2FwYWNpdHkgLyBzaXplb2YoaW50MTZfdCk7CisKKyAgICB2b2lkKiBpbkJ1ZmZlcltdICAgICAgICA9IHsgKHVuc2lnbmVkIGNoYXIgKilkYXRhIH07CisgICAgSU5UICAgaW5CdWZmZXJJZHNbXSAgICAgPSB7IElOX0FVRElPX0RBVEEgfTsKKyAgICBJTlQgICBpbkJ1ZmZlclNpemVbXSAgICA9IHsgKElOVCljYXBhY2l0eSB9OworICAgIElOVCAgIGluQnVmZmVyRWxTaXplW10gID0geyBzaXplb2YoaW50MTZfdCkgfTsKKworICAgIEFBQ0VOQ19CdWZEZXNjIGluQnVmRGVzYzsKKyAgICBpbkJ1ZkRlc2MubnVtQnVmcyAgICAgICAgICAgPSBzaXplb2YoaW5CdWZmZXIpIC8gc2l6ZW9mKHZvaWQqKTsKKyAgICBpbkJ1ZkRlc2MuYnVmcyAgICAgICAgICAgICAgPSAodm9pZCoqKSZpbkJ1ZmZlcjsKKyAgICBpbkJ1ZkRlc2MuYnVmZmVySWRlbnRpZmllcnMgPSBpbkJ1ZmZlcklkczsKKyAgICBpbkJ1ZkRlc2MuYnVmU2l6ZXMgICAgICAgICAgPSBpbkJ1ZmZlclNpemU7CisgICAgaW5CdWZEZXNjLmJ1ZkVsU2l6ZXMgICAgICAgID0gaW5CdWZmZXJFbFNpemU7CisKKyAgICB2b2lkKiBvdXRCdWZmZXJbXSAgICAgICA9IHsgb3V0UHRyIH07CisgICAgSU5UICAgb3V0QnVmZmVySWRzW10gICAgPSB7IE9VVF9CSVRTVFJFQU1fREFUQSB9OworICAgIElOVCAgIG91dEJ1ZmZlclNpemVbXSAgID0geyAwIH07CisgICAgSU5UICAgb3V0QnVmZmVyRWxTaXplW10gPSB7IHNpemVvZihVQ0hBUikgfTsKKworICAgIEFBQ0VOQ19CdWZEZXNjIG91dEJ1ZkRlc2M7CisgICAgb3V0QnVmRGVzYy5udW1CdWZzICAgICAgICAgICA9IHNpemVvZihvdXRCdWZmZXIpIC8gc2l6ZW9mKHZvaWQqKTsKKyAgICBvdXRCdWZEZXNjLmJ1ZnMgICAgICAgICAgICAgID0gKHZvaWQqKikmb3V0QnVmZmVyOworICAgIG91dEJ1ZkRlc2MuYnVmZmVySWRlbnRpZmllcnMgPSBvdXRCdWZmZXJJZHM7CisgICAgb3V0QnVmRGVzYy5idWZTaXplcyAgICAgICAgICA9IG91dEJ1ZmZlclNpemU7CisgICAgb3V0QnVmRGVzYy5idWZFbFNpemVzICAgICAgICA9IG91dEJ1ZmZlckVsU2l6ZTsKKworICAgIEFBQ0VOQ19FUlJPUiBlbmNvZGVyRXJyID0gQUFDRU5DX09LOworCisgICAgY2xhc3MgRmlsbFdvcmsgeworICAgIHB1YmxpYzoKKyAgICAgICAgRmlsbFdvcmsodWludDMyX3QgZmxhZ3MsIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3JkaW5hbCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKQorICAgICAgICAgICAgOiBtRmxhZ3MoZmxhZ3MpLCBtT3JkaW5hbChvcmRpbmFsKSwgbUJ1ZmZlcihidWZmZXIpIHsKKyAgICAgICAgfQorICAgICAgICB+RmlsbFdvcmsoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpbUZsYWdzOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gbU9yZGluYWw7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgICAgICAgICBpZiAobUJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhtQnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJ0aW1lc3RhbXAgPSAlbGxkLCBpbmRleCA9ICVsbGQsIHcvJXMgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgIG1PcmRpbmFsLnRpbWVzdGFtcC5wZWVrbGwoKSwKKyAgICAgICAgICAgICAgICAgIG1PcmRpbmFsLmZyYW1lSW5kZXgucGVla2xsKCksCisgICAgICAgICAgICAgICAgICBtQnVmZmVyID8gIiIgOiAibyIpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCB1aW50MzJfdCBtRmxhZ3M7CisgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgbU9yZGluYWw7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gbUJ1ZmZlcjsKKyAgICB9OworCisgICAgc3RydWN0IE91dHB1dEJ1ZmZlciB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgICAgICBjMl9jbnRyNjRfdCB0aW1lc3RhbXBVczsKKyAgICB9OworICAgIHN0ZDo6bGlzdDxPdXRwdXRCdWZmZXI+IG91dHB1dEJ1ZmZlcnM7CisKKyAgICBpZiAobVJlbWFpbmRlckxlbiA+IDApIHsKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgICAgIGZvciAoOyBtUmVtYWluZGVyTGVuIDwgYnl0ZXNQZXJTYW1wbGUgJiYgb2Zmc2V0IDwgY2FwYWNpdHk7ICsrb2Zmc2V0KSB7CisgICAgICAgICAgICBtUmVtYWluZGVyW21SZW1haW5kZXJMZW4rK10gPSBkYXRhW29mZnNldF07CisgICAgICAgIH0KKyAgICAgICAgZGF0YSArPSBvZmZzZXQ7CisgICAgICAgIGNhcGFjaXR5IC09IG9mZnNldDsKKyAgICAgICAgaWYgKG1SZW1haW5kZXJMZW4gPT0gYnl0ZXNQZXJTYW1wbGUpIHsKKyAgICAgICAgICAgIGluQnVmZmVyWzBdID0gbVJlbWFpbmRlcjsKKyAgICAgICAgICAgIGluQnVmZmVyU2l6ZVswXSA9IGJ5dGVzUGVyU2FtcGxlOworICAgICAgICAgICAgaW5hcmdzLm51bUluU2FtcGxlcyA9IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIG1SZW1haW5kZXJMZW4gPSAwOworICAgICAgICAgICAgQUxPR1YoIlByb2Nlc3NpbmcgcmVtYWluZGVyIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXZSBoYXZlIGV4aGF1c3RlZCB0aGUgaW5wdXQgYWxyZWFkeQorICAgICAgICAgICAgaW5hcmdzLm51bUluU2FtcGxlcyA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKGVuY29kZXJFcnIgPT0gQUFDRU5DX09LICYmIGluYXJncy5udW1JblNhbXBsZXMgPj0gY2hhbm5lbENvdW50KSB7CisgICAgICAgIGlmIChudW1GcmFtZXMgJiYgIWJsb2NrKSB7CisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZywgcHJvcGVyIHVzYWdlLCBldGMuCisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG1PdXRCdWZmZXJTaXplLCB1c2FnZSwgJmJsb2NrKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmYWlsZWQgOiBlcnIgPSAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd1ZpZXcucmVzZXQobmV3IEMyV3JpdGVWaWV3KGJsb2NrLT5tYXAoKS5nZXQoKSkpOworICAgICAgICAgICAgb3V0UHRyID0gd1ZpZXctPmRhdGEoKTsKKyAgICAgICAgICAgIG91dEF2YWlsYWJsZSA9IHdWaWV3LT5zaXplKCk7CisgICAgICAgICAgICAtLW51bUZyYW1lczsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldCgmb3V0YXJncywgMCwgc2l6ZW9mKG91dGFyZ3MpKTsKKworICAgICAgICBvdXRCdWZmZXJbMF0gPSBvdXRQdHI7CisgICAgICAgIG91dEJ1ZmZlclNpemVbMF0gPSBvdXRBdmFpbGFibGU7CisKKyAgICAgICAgZW5jb2RlckVyciA9IGFhY0VuY0VuY29kZShtQUFDRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CdWZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRCdWZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dGFyZ3MpOworCisgICAgICAgIGlmIChlbmNvZGVyRXJyID09IEFBQ0VOQ19PSykgeworICAgICAgICAgICAgaWYgKG91dGFyZ3MubnVtT3V0Qnl0ZXMgPiAwKSB7CisgICAgICAgICAgICAgICAgbUlucHV0U2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgaW50IGNvbnN1bWVkID0gKGNhcGFjaXR5IC8gc2l6ZW9mKGludDE2X3QpKSAtIGluYXJncy5udW1JblNhbXBsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICsgb3V0YXJncy5udW1JblNhbXBsZXM7CisgICAgICAgICAgICAgICAgQUxPR1YoImNvbnN1bWVkID0gJWQsIGNhcGFjaXR5ID0gJXp1LCBpblNhbXBsZXMgPSAlZCwgb3V0U2FtcGxlcyA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lZCwgY2FwYWNpdHksIGluYXJncy5udW1JblNhbXBsZXMsIG91dGFyZ3MubnVtSW5TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICBjMl9jbnRyNjRfdCBjdXJyZW50RnJhbWVUaW1lc3RhbXBVcyA9ICptTmV4dEZyYW1lVGltZXN0YW1wVXM7CisgICAgICAgICAgICAgICAgbU5leHRGcmFtZVRpbWVzdGFtcFVzID0gaW5wdXRUaW1lc3RhbXBVcworICAgICAgICAgICAgICAgICAgICAgICAgKyAoY29uc3VtZWQgKiAxMDAwMDAwbGwgLyBjaGFubmVsQ291bnQgLyBzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0YXJncy5udW1PdXRCeXRlcyk7CisjaWYgMAorICAgICAgICAgICAgICAgIGhleGR1bXAob3V0UHRyLCBzdGQ6Om1pbihvdXRhcmdzLm51bU91dEJ5dGVzLCAyNTYpKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIG91dFB0ciA9IHRlbXA7CisgICAgICAgICAgICAgICAgb3V0QXZhaWxhYmxlID0gMDsKKyAgICAgICAgICAgICAgICBibG9jay5yZXNldCgpOworCisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVycy5wdXNoX2JhY2soe2J1ZmZlciwgY3VycmVudEZyYW1lVGltZXN0YW1wVXN9KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUlucHV0U2l6ZSArPSBvdXRhcmdzLm51bUluU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGluQnVmZmVyWzBdID09IG1SZW1haW5kZXIpIHsKKyAgICAgICAgICAgICAgICBpbkJ1ZmZlclswXSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihkYXRhKTsKKyAgICAgICAgICAgICAgICBpbkJ1ZmZlclNpemVbMF0gPSBjYXBhY2l0eTsKKyAgICAgICAgICAgICAgICBpbmFyZ3MubnVtSW5TYW1wbGVzID0gY2FwYWNpdHkgLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG91dGFyZ3MubnVtSW5TYW1wbGVzID4gMCkgeworICAgICAgICAgICAgICAgIGluQnVmZmVyWzBdID0gKGludDE2X3QgKilpbkJ1ZmZlclswXSArIG91dGFyZ3MubnVtSW5TYW1wbGVzOworICAgICAgICAgICAgICAgIGluQnVmZmVyU2l6ZVswXSAtPSBvdXRhcmdzLm51bUluU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgICAgICBpbmFyZ3MubnVtSW5TYW1wbGVzIC09IG91dGFyZ3MubnVtSW5TYW1wbGVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCJlbmNvZGVyRXJyID0gJWQgbUlucHV0U2l6ZSA9ICV6dSAiCisgICAgICAgICAgICAgICJpbmFyZ3MubnVtSW5TYW1wbGVzID0gJWQsIG1OZXh0RnJhbWVUaW1lc3RhbXBVcyA9ICVsbGQiLAorICAgICAgICAgICAgICBlbmNvZGVyRXJyLCBtSW5wdXRTaXplLCBpbmFyZ3MubnVtSW5TYW1wbGVzLCBtTmV4dEZyYW1lVGltZXN0YW1wVXMtPnBlZWtsbCgpKTsKKyAgICB9CisgICAgaWYgKGVvcyAmJiBpbkJ1ZmZlclNpemVbMF0gPiAwKSB7CisgICAgICAgIGlmIChudW1GcmFtZXMgJiYgIWJsb2NrKSB7CisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZywgcHJvcGVyIHVzYWdlLCBldGMuCisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG1PdXRCdWZmZXJTaXplLCB1c2FnZSwgJmJsb2NrKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmYWlsZWQgOiBlcnIgPSAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgd1ZpZXcucmVzZXQobmV3IEMyV3JpdGVWaWV3KGJsb2NrLT5tYXAoKS5nZXQoKSkpOworICAgICAgICAgICAgb3V0UHRyID0gd1ZpZXctPmRhdGEoKTsKKyAgICAgICAgICAgIG91dEF2YWlsYWJsZSA9IHdWaWV3LT5zaXplKCk7CisgICAgICAgICAgICAtLW51bUZyYW1lczsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldCgmb3V0YXJncywgMCwgc2l6ZW9mKG91dGFyZ3MpKTsKKworICAgICAgICBvdXRCdWZmZXJbMF0gPSBvdXRQdHI7CisgICAgICAgIG91dEJ1ZmZlclNpemVbMF0gPSBvdXRBdmFpbGFibGU7CisKKyAgICAgICAgLy8gRmx1c2gKKyAgICAgICAgaW5hcmdzLm51bUluU2FtcGxlcyA9IC0xOworCisgICAgICAgICh2b2lkKWFhY0VuY0VuY29kZShtQUFDRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJ1ZkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0QnVmRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbmFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0YXJncyk7CisgICAgICAgIGluQnVmZmVyU2l6ZVswXSA9IDA7CisgICAgfQorCisgICAgaWYgKGluQnVmZmVyU2l6ZVswXSA+IDApIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbkJ1ZmZlclNpemVbMF07ICsraSkgeworICAgICAgICAgICAgbVJlbWFpbmRlcltpXSA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4oaW5CdWZmZXJbMF0pW2ldOworICAgICAgICB9CisgICAgICAgIG1SZW1haW5kZXJMZW4gPSBpbkJ1ZmZlclNpemVbMF07CisgICAgfQorCisgICAgd2hpbGUgKG91dHB1dEJ1ZmZlcnMuc2l6ZSgpID4gMSkgeworICAgICAgICBjb25zdCBPdXRwdXRCdWZmZXImIGZyb250ID0gb3V0cHV0QnVmZmVycy5mcm9udCgpOworICAgICAgICBDMldvcmtPcmRpbmFsU3RydWN0IG9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICBvcmRpbmFsLmZyYW1lSW5kZXggPSBtT3V0SW5kZXgrKzsKKyAgICAgICAgb3JkaW5hbC50aW1lc3RhbXAgPSBmcm9udC50aW1lc3RhbXBVczsKKyAgICAgICAgY2xvbmVBbmRTZW5kKAorICAgICAgICAgICAgICAgIGlucHV0SW5kZXgsCisgICAgICAgICAgICAgICAgd29yaywKKyAgICAgICAgICAgICAgICBGaWxsV29yayhDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFLCBvcmRpbmFsLCBmcm9udC5idWZmZXIpKTsKKyAgICAgICAgb3V0cHV0QnVmZmVycy5wb3BfZnJvbnQoKTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXI7CisgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICBvcmRpbmFsLmZyYW1lSW5kZXggPSBtT3V0SW5kZXgrKzsKKyAgICBpZiAoIW91dHB1dEJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBvcmRpbmFsLnRpbWVzdGFtcCA9IG91dHB1dEJ1ZmZlcnMuZnJvbnQoKS50aW1lc3RhbXBVczsKKyAgICAgICAgYnVmZmVyID0gb3V0cHV0QnVmZmVycy5mcm9udCgpLmJ1ZmZlcjsKKyAgICB9CisgICAgLy8gTWFyayB0aGUgZW5kIG9mIGZyYW1lCisgICAgRmlsbFdvcmsoKEMyRnJhbWVEYXRhOjpmbGFnc190KShlb3MgPyBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNIDogMCksCisgICAgICAgICAgICAgb3JkaW5hbCwgYnVmZmVyKSh3b3JrKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QWFjRW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgc3dpdGNoIChkcmFpbk1vZGUpIHsKKyAgICAgICAgY2FzZSBEUkFJTl9DT01QT05FTlRfTk9fRU9TOgorICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIE5PX0RSQUlOOgorICAgICAgICAgICAgLy8gbm8tb3AKKyAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgY2FzZSBEUkFJTl9DSEFJTjoKKyAgICAgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgICAgICBjYXNlIERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAodm9pZClwb29sOworICAgIG1TZW50Q29kZWNTcGVjaWZpY0RhdGEgPSBmYWxzZTsKKyAgICBtSW5wdXRTaXplID0gMHU7CisgICAgbU5leHRGcmFtZVRpbWVzdGFtcFVzLnJlc2V0KCk7CisgICAgbUxhc3RGcmFtZUVuZFRpbWVzdGFtcFVzLnJlc2V0KCk7CisKKyAgICAvLyBUT0RPOiB3ZSBkb24ndCBoYXZlIGFueSBwZW5kaW5nIHdvcmsgYXQgdGhpcyB0aW1lIHRvIGRyYWluLgorICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0QWFjRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEFhY0VuY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRBYWNFbmMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QWFjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QWFjRW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QWFjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QWFjRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QWFjRW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvQzJTb2Z0QWFjRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEyODI4MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9DMlNvZnRBYWNFbmMuaApAQCAtMCwwICsxLDc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQUFDX0VOQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfQUFDX0VOQ19IXworCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPG9wdGlvbmFsPgorCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgImFhY2VuY19saWIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMlNvZnRBYWNFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworcHVibGljOgorICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0QWFjRW5jKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEFhY0VuYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworCisgICAgSEFORExFX0FBQ0VOQ09ERVIgbUFBQ0VuY29kZXI7CisKKyAgICBVSU5UIG1OdW1CeXRlc1BlcklucHV0RnJhbWU7CisgICAgVUlOVCBtT3V0QnVmZmVyU2l6ZTsKKworICAgIGJvb2wgbVNlbnRDb2RlY1NwZWNpZmljRGF0YTsKKyAgICBzaXplX3QgbUlucHV0U2l6ZTsKKyAgICBzdGQ6Om9wdGlvbmFsPGMyX2NudHI2NF90PiBtTmV4dEZyYW1lVGltZXN0YW1wVXM7CisgICAgc3RkOjpvcHRpb25hbDxjMl9jbnRyNjRfdD4gbUxhc3RGcmFtZUVuZFRpbWVzdGFtcFVzOworCisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgc3RkOjphdG9taWNfdWludDY0X3QgbU91dEluZGV4OworCisgICAgLy8gV2Ugc3VwcG9ydCBtYXggNiBjaGFubmVscworICAgIHVpbnQ4X3QgbVJlbWFpbmRlcls2ICogc2l6ZW9mKGludDE2X3QpXTsKKyAgICBzaXplX3QgbVJlbWFpbmRlckxlbjsKKworICAgIHN0YXR1c190IGluaXRFbmNvZGVyKCk7CisKKyAgICBzdGF0dXNfdCBzZXRBdWRpb1BhcmFtcygpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QWFjRW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FBQ19FTkNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5YWViYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9EcmNQcmVzTW9kZVdyYXAuY3BwCkBAIC0wLDAgKzEsMzcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlICJEcmNQcmVzTW9kZVdyYXAuaCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFhY0RyY1dyYXBwZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKy8vI2RlZmluZSBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKworI2RlZmluZSBHUE1fRU5DT0RFUl9UQVJHRVRfTEVWRUwgNjQKKyNkZWZpbmUgTUFYX1RBUkdFVF9MRVZFTCA0MAorCitDRHJjUHJlc01vZGVXcmFwcGVyOjpDRHJjUHJlc01vZGVXcmFwcGVyKCkKK3sKKyAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisKKyAgICAvKiBEYXRhIGZyb20gc3RyZWFtSW5mby4gKi8KKyAgICAvKiBJbml0aWFsaXplZCB0byB0aGUgc2FtZSB2YWx1ZXMgYXMgaW4gdGhlIGFhYyBkZWNvZGVyICovCisgICAgbVN0cmVhbVBSTCA9IC0xOworICAgIG1TdHJlYW1EUkNQcmVzTW9kZSA9IC0xOworICAgIG1TdHJlYW1OckFBQ0NoYW4gPSAwOworICAgIG1TdHJlYW1Ock91dENoYW4gPSAwOworCisgICAgLyogRGVzaXJlZCB2YWx1ZXMgKHNldCBieSB1c2VyKS4gKi8KKyAgICAvKiBJbml0aWFsaXplZCB0byB0aGUgc2FtZSB2YWx1ZXMgYXMgaW4gdGhlIGFhYyBkZWNvZGVyICovCisgICAgbURlc1RhcmdldCA9IC0xOworICAgIG1EZXNBdHRGYWN0b3IgPSAwOworICAgIG1EZXNCb29zdEZhY3RvciA9IDA7CisgICAgbURlc0hlYXZ5ID0gMDsKKworICAgIG1FbmNvZGVyVGFyZ2V0ID0gLTE7CisKKyAgICAvKiBWYWx1ZXMgZnJvbSBsYXN0IHRpbWUuICovCisgICAgLyogSW5pdGlhbGl6ZWQgdG8gdGhlIHNhbWUgdmFsdWVzIGFzIHRoZSBkZXNpcmVkIHZhbHVlcyAqLworICAgIG1MYXN0VGFyZ2V0ID0gLTE7CisgICAgbUxhc3RBdHRGYWN0b3IgPSAwOworICAgIG1MYXN0Qm9vc3RGYWN0b3IgPSAwOworICAgIG1MYXN0SGVhdnkgPSAwOworfQorCitDRHJjUHJlc01vZGVXcmFwcGVyOjp+Q0RyY1ByZXNNb2RlV3JhcHBlcigpCit7Cit9CisKK3ZvaWQKK0NEcmNQcmVzTW9kZVdyYXBwZXI6OnNldERlY29kZXJIYW5kbGUoY29uc3QgSEFORExFX0FBQ0RFQ09ERVIgaGFuZGxlKQoreworICAgIG1IYW5kbGVEZWNvZGVyID0gaGFuZGxlOworfQorCit2b2lkCitDRHJjUHJlc01vZGVXcmFwcGVyOjpzdWJtaXRTdHJlYW1EYXRhKENTdHJlYW1JbmZvKiBwU3RyZWFtSW5mbykKK3sKKyAgICBhc3NlcnQocFN0cmVhbUluZm8pOworCisgICAgaWYgKG1TdHJlYW1QUkwgIT0gcFN0cmVhbUluZm8tPmRyY1Byb2dSZWZMZXYpIHsKKyAgICAgICAgbVN0cmVhbVBSTCA9IHBTdHJlYW1JbmZvLT5kcmNQcm9nUmVmTGV2OworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZHJjUHJvZ1JlZkxldiBpcyAlZFxuIiwgbVN0cmVhbVBSTCk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobVN0cmVhbURSQ1ByZXNNb2RlICE9IHBTdHJlYW1JbmZvLT5kcmNQcmVzTW9kZSkgeworICAgICAgICBtU3RyZWFtRFJDUHJlc01vZGUgPSBwU3RyZWFtSW5mby0+ZHJjUHJlc01vZGU7CisgICAgICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBkcmNQcmVzTW9kZSBpcyAlZFxuIiwgbVN0cmVhbURSQ1ByZXNNb2RlKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChtU3RyZWFtTnJBQUNDaGFuICE9IHBTdHJlYW1JbmZvLT5hYWNOdW1DaGFubmVscykgeworICAgICAgICBtU3RyZWFtTnJBQUNDaGFuID0gcFN0cmVhbUluZm8tPmFhY051bUNoYW5uZWxzOworICAgICAgICBtRGF0YVVwZGF0ZSA9IHRydWU7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogYWFjTnVtQ2hhbm5lbHMgaXMgJWRcbiIsIG1TdHJlYW1OckFBQ0NoYW4pOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKG1TdHJlYW1Ock91dENoYW4gIT0gcFN0cmVhbUluZm8tPm51bUNoYW5uZWxzKSB7CisgICAgICAgIG1TdHJlYW1Ock91dENoYW4gPSBwU3RyZWFtSW5mby0+bnVtQ2hhbm5lbHM7CisgICAgICAgIG1EYXRhVXBkYXRlID0gdHJ1ZTsKKyNpZmRlZiBEUkNfUFJFU19NT0RFX1dSQVBfREVCVUcKKyAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBudW1DaGFubmVscyBpcyAlZFxuIiwgbVN0cmVhbU5yT3V0Q2hhbik7CisjZW5kaWYKKyAgICB9CisKKworCisgICAgaWYgKG1TdHJlYW1Ock91dENoYW48bVN0cmVhbU5yQUFDQ2hhbikgeworICAgICAgICBtSXNEb3dubWl4ID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSXNEb3dubWl4ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1Jc0Rvd25taXggJiYgKG1TdHJlYW1Ock91dENoYW4gPT0gMSkpIHsKKyAgICAgICAgbUlzTW9ub0Rvd25taXggPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jc01vbm9Eb3dubWl4ID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKG1Jc0Rvd25taXggJiYgbVN0cmVhbU5yT3V0Q2hhbiA9PSAyKXsKKyAgICAgICAgbUlzU3RlcmVvRG93bm1peCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUlzU3RlcmVvRG93bm1peCA9IGZhbHNlOworICAgIH0KKworfQorCit2b2lkCitDRHJjUHJlc01vZGVXcmFwcGVyOjpzZXRQYXJhbShjb25zdCBEUkNfUFJFU19NT0RFX1dSQVBfUEFSQU0gcGFyYW0sIGNvbnN0IGludCB2YWx1ZSkKK3sKKyAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgY2FzZSBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9UQVJHRVQ6CisgICAgICAgIG1EZXNUYXJnZXQgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SOgorICAgICAgICBtRGVzQXR0RmFjdG9yID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SOgorICAgICAgICBtRGVzQm9vc3RGYWN0b3IgPSB2YWx1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWToKKyAgICAgICAgbURlc0hlYXZ5ID0gdmFsdWU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgRFJDX1BSRVNfTU9ERV9XUkFQX0VOQ09ERVJfVEFSR0VUOgorICAgICAgICBtRW5jb2RlclRhcmdldCA9IHZhbHVlOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgbURhdGFVcGRhdGUgPSB0cnVlOworfQorCit2b2lkCitDRHJjUHJlc01vZGVXcmFwcGVyOjp1cGRhdGUoKQoreworICAgIC8vIEdldCBEYXRhIGZyb20gRGVjb2RlcgorICAgIGludCBwcm9nUmVmTGV2ZWwgPSBtU3RyZWFtUFJMOworICAgIGludCBkcmNQcmVzTW9kZSA9IG1TdHJlYW1EUkNQcmVzTW9kZTsKKworICAgIC8vIGJ5IGRlZmF1bHQsIGRvIGFzIGRlc2lyZWQKKyAgICBpbnQgbmV3VGFyZ2V0ICAgICAgICAgPSBtRGVzVGFyZ2V0OworICAgIGludCBuZXdBdHRGYWN0b3IgICAgICA9IG1EZXNBdHRGYWN0b3I7CisgICAgaW50IG5ld0Jvb3N0RmFjdG9yICAgID0gbURlc0Jvb3N0RmFjdG9yOworICAgIGludCBuZXdIZWF2eSAgICAgICAgICA9IG1EZXNIZWF2eTsKKworICAgIGlmIChtRGF0YVVwZGF0ZSkgeworICAgICAgICAvLyBzYW5pdHkgY2hlY2sKKyAgICAgICAgaWYgKG1EZXNUYXJnZXQgPCBNQVhfVEFSR0VUX0xFVkVMKXsKKyAgICAgICAgICAgIG1EZXNUYXJnZXQgPSBNQVhfVEFSR0VUX0xFVkVMOyAgLy8gbGltaXQgdGFyZ2V0IGxldmVsIHRvIC0xMCBkQiBvciBiZWxvdworICAgICAgICAgICAgbmV3VGFyZ2V0ID0gTUFYX1RBUkdFVF9MRVZFTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtRW5jb2RlclRhcmdldCAhPSAtMSkgeworICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQ8MTI0KSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IC0zMSBkQgorICAgICAgICAgICAgICAgIGlmICgobUlzU3RlcmVvRG93bm1peCA9PSBmYWxzZSkgJiYgKG1Jc01vbm9Eb3dubWl4ID09IGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBubyBzdGVyZW8gb3IgbW9ubyBkb3dubWl4aW5nLCBjYWxjdWxhdGVkIHNjYWxpbmcgb2YgbGlnaHQgRFJDCisgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBhcyBsaXR0bGUgY29tcHJlc3Npb24gYXMgcG9zc2libGUgKi8KKyAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMDsKKyAgICAgICAgICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3IgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAobURlc1RhcmdldDxwcm9nUmVmTGV2ZWwpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gUFJMCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUVuY29kZXJUYXJnZXQgPCBtRGVzVGFyZ2V0KSB7IC8vIGlmIG1FbmNvZGVyVGFyZ2V0ID4gdGFyZ2V0IGxldmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUVuY29kZXJUYXJnZXQgPiB0YXJnZXQgbGV2ZWwgPiBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY2FsY0ZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBjYWxjRmFjdG9yX25vcm07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMC4wZiA8IGNhbGNGYWN0b3Jfbm9ybSA8IDEuMGYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxjRmFjdG9yX25vcm0gPSAoZmxvYXQpKG1EZXNUYXJnZXQgLSBwcm9nUmVmTGV2ZWwpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCkobUVuY29kZXJUYXJnZXQgLSBwcm9nUmVmTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGNGYWN0b3IgPSAoaW50KShjYWxjRmFjdG9yX25vcm0qMTI3LjBmKTsgLy8gMCA8PSBjYWxjRmFjdG9yIDwgMTI3CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2FsY0ZhY3RvciBpcyB0aGUgbG93ZXIgbGltaXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAoY2FsY0ZhY3Rvcj5uZXdBdHRGYWN0b3IpID8gY2FsY0ZhY3RvciA6IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZXcgQXR0RmFjdG9yIHdpbGwgYmUgYWx3YXlzID0gY2FsY0ZhY3RvciwgYXMgaXQgaXMgc2V0IHRvIDAgYmVmb3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0Jvb3N0RmFjdG9yID0gbmV3QXR0RmFjdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB0YXJnZXQgbGV2ZWwgPiBtRW5jb2RlclRhcmdldCA+IFBSTCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld1RETGltaXRlckVuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgZG9tYWluIGxpbWl0ZXIgbXVzdCBhbHdheXMgYmUgYWN0aXZlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIHRhcmdldCBsZXZlbCA8PSBQUkwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHJlc3RyaWN0aW9ucyByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3QXR0RmFjdG9yID0gbmV3QXR0RmFjdG9yOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMjMgZEIgb3IgbW9ubyBkb3dubWl4CisgICAgICAgICAgICAgICAgICAgIGlmICggKG1EZXNUYXJnZXQ8OTIpIHx8IG1Jc01vbm9Eb3dubWl4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgcGVyZm9ybSBhIGRvd25taXgsIHNvLCB3ZSBuZWVkIGF0IGxlYXN0IGZ1bGwgbGlnaHQgRFJDCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gLTMxIGRCCisgICAgICAgICAgICAgICAgLy8gcGxheWJhY2sgLTMxIGRCOiBsaWdodCBEUkMgb25seSBuZWVkZWQgaWYgd2UgcGVyZm9ybSBkb3dubWl4aW5nCisgICAgICAgICAgICAgICAgaWYgKG1Jc0Rvd25taXgpIHsgICAvLyB3ZSBkbyBkb3dubWl4aW5nCisgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IC8vIGhhbmRsZSBvdGhlciB1c2VkIGVuY29kZXIgdGFyZ2V0IGxldmVscworCisgICAgICAgICAgICAvLyBTYW5pdHkgY2hlY2s6IERSQyBwcmVzZW50YXRpb24gbW9kZSBpcyBvbmx5IHNwZWNpZmllZCBmb3IgbWF4LiA1LjEgY2hhbm5lbHMKKyAgICAgICAgICAgIGlmIChtU3RyZWFtTnJBQUNDaGFuID4gNikgeworICAgICAgICAgICAgICAgIGRyY1ByZXNNb2RlID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChkcmNQcmVzTW9kZSkgeworICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgZGVmYXVsdDogLy8gcHJlc2VudGF0aW9uIG1vZGUgbm90IGluZGljYXRlZAorICAgICAgICAgICAgeworCisgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQ8MTI0KSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBubyBzdGVyZW8gb3IgbW9ubyBkb3dubWl4aW5nCisgICAgICAgICAgICAgICAgICAgIGlmICgobUlzU3RlcmVvRG93bm1peCA9PSBmYWxzZSkgJiYgKG1Jc01vbm9Eb3dubWl4ID09IGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQ8cHJvZ1JlZkxldmVsKSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld1RETGltaXRlckVuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRpbWUgZG9tYWluIGxpbWl0ZXIgbXVzdCBhbHdheXMgYmUgYWN0aXZlIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZyYW1ld29yayBhY3RpdmF0ZXMgaXQgYnkgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsgLy8gYXQgbGVhc3QsIHVzZSBsaWdodCBjb21wcmVzc2lvbgorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IFBSTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHJlc3RyaWN0aW9ucyByZXF1aXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld0F0dEZhY3RvciA9IG5ld0F0dEZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gZG93bm1peGluZworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3VERMaW1pdGVyRW5hYmxlID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0aW1lIGRvbWFpbiBsaW1pdGVyIG11c3QgYWx3YXlzIGJlIGFjdGl2ZSBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZyYW1ld29yayBhY3RpdmF0ZXMgaXQgYnkgZGVmYXVsdAorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiB0YXJnZXQgbGV2ZWwgPiAtMjMgZEIgb3IgbW9ubyBkb3dubWl4CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChtRGVzVGFyZ2V0IDwgOTIpIHx8IG1Jc01vbm9Eb3dubWl4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZXsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBwZXJmb3JtIGEgZG93bm1peCwgc28sIHdlIG5lZWQgYXQgbGVhc3QgZnVsbCBsaWdodCBEUkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyB0YXJnZXQgbGV2ZWwgPD0gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIGlmIChtSXNEb3dubWl4KSB7ICAgLy8gd2UgZG8gZG93bm1peGluZy4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld1RETGltaXRlckVuYWJsZSA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGltZSBkb21haW4gbGltaXRlciBtdXN0IGFsd2F5cyBiZSBhY3RpdmUgaW4gdGhpcyBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBmcmFtZXdvcmsgYWN0aXZhdGVzIGl0IGJ5IGRlZmF1bHQKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0F0dEZhY3RvciA9IDEyNzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAvLyBQcmVzZW50YXRpb24gbW9kZSAxIGFuZCAyIGFjY29yZGluZyB0byBFVFNJIFRTIDEwMSAxNTQ6CisgICAgICAgICAgICAvLyBEaWdpdGFsIFZpZGVvIEJyb2FkY2FzdGluZyAoRFZCKTsgU3BlY2lmaWNhdGlvbiBmb3IgdGhlIHVzZSBvZiBWaWRlbyBhbmQgQXVkaW8gQ29kaW5nCisgICAgICAgICAgICAvLyBpbiBCcm9hZGNhc3RpbmcgQXBwbGljYXRpb25zIGJhc2VkIG9uIHRoZSBNUEVHLTIgVHJhbnNwb3J0IFN0cmVhbSwKKyAgICAgICAgICAgIC8vIHNlY3Rpb24gQy41LjQuLCAiRGVjb2RpbmciLCBhbmQgVGFibGUgQy4zMworICAgICAgICAgICAgLy8gSVNPIERSQyAgICAgICAgICAgIC0+IG5ld0hlYXZ5ID0gMCAgKFVzZSBsaWdodCBjb21wcmVzc2lvbiwgTVBFRy1zdHlsZSkKKyAgICAgICAgICAgIC8vIENvbXByZXNzaW9uX3ZhbHVlICAtPiBuZXdIZWF2eSA9IDEgIChVc2UgaGVhdnkgY29tcHJlc3Npb24sIERWQi1zdHlsZSkKKyAgICAgICAgICAgIC8vIHNjYWxpbmcgcmVzdHJpY3RlZCAtPiBuZXdBdHRGYWN0b3IgPSAxMjcKKworICAgICAgICAgICAgY2FzZSAxOiAvLyBwcmVzZW50YXRpb24gbW9kZSAxLCBMaWdodDotMzEvSGVhdnk6LTIzCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKG1EZXNUYXJnZXQgPCAxMjQpIHsgLy8gaWYgdGFyZ2V0IGxldmVsID4gLTMxIGRCCisgICAgICAgICAgICAgICAgICAgIC8vIHBsYXliYWNrIHVwIHRvIC0yMyBkQgorICAgICAgICAgICAgICAgICAgICBuZXdIZWF2eSA9IDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc0Rvd25taXgpIHsgICAvLyB3ZSBkbyBkb3dubWl4aW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMjogLy8gcHJlc2VudGF0aW9uIG1vZGUgMiwgTGlnaHQ6LTIzL0hlYXZ5Oi0yMworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmIChtRGVzVGFyZ2V0IDwgMTI0KSB7IC8vIGlmIHRhcmdldCBsZXZlbCA+IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayB1cCB0byAtMjMgZEIKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc01vbm9Eb3dubWl4KSB7IC8vIGlmIG1vbm8gZG93bm1peAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAxOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsgLy8gdGFyZ2V0IGxldmVsIDw9IC0zMSBkQgorICAgICAgICAgICAgICAgICAgICAvLyBwbGF5YmFjayAtMzEgZEIKKyAgICAgICAgICAgICAgICAgICAgbmV3SGVhdnkgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAobUlzRG93bm1peCkgeyAgIC8vIHdlIGRvIGRvd25taXhpbmcuCisgICAgICAgICAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IgPSAxMjc7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgfSAvLyBzd2l0Y2goKQorICAgICAgICB9IC8vIGlmIChtRW5jb2RlclRhcmdldCAgPT0gR1BNX0VOQ09ERVJfVEFSR0VUX0xFVkVMKQorCisgICAgICAgIC8vIHNhbml0eSBhZ2FpbgorICAgICAgICBpZiAobmV3SGVhdnkgPT0gMSkgeworICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3I9MTI3OyAvLyBub3QgcmVhbGx5IG5lZWRlZCBhcyB0aGUgc2FtZSB3b3VsZCBiZSBkb25lIGJ5IHRoZSBkZWNvZGVyIGFueXdheQorICAgICAgICAgICAgbmV3QXR0RmFjdG9yID0gMTI3OworICAgICAgICB9CisKKyAgICAgICAgLy8gdXBkYXRlIHRoZSBkZWNvZGVyCisgICAgICAgIGlmIChuZXdUYXJnZXQgIT0gbUxhc3RUYXJnZXQpIHsKKyAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUhhbmRsZURlY29kZXIsIEFBQ19EUkNfUkVGRVJFTkNFX0xFVkVMLCBuZXdUYXJnZXQpOworICAgICAgICAgICAgbUxhc3RUYXJnZXQgPSBuZXdUYXJnZXQ7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgICAgICBpZiAobmV3VGFyZ2V0ICE9IG1EZXNUYXJnZXQpCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBmb3JjZWQgdGFyZ2V0IGxldmVsIHRvICVkIChmcm9tICVkKVxuIiwgbmV3VGFyZ2V0LCBtRGVzVGFyZ2V0KTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IHNldCB0YXJnZXQgbGV2ZWwgdG8gJWRcbiIsIG5ld1RhcmdldCk7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXdBdHRGYWN0b3IgIT0gbUxhc3RBdHRGYWN0b3IpIHsKKyAgICAgICAgICAgIGFhY0RlY29kZXJfU2V0UGFyYW0obUhhbmRsZURlY29kZXIsIEFBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SLCBuZXdBdHRGYWN0b3IpOworICAgICAgICAgICAgbUxhc3RBdHRGYWN0b3IgPSBuZXdBdHRGYWN0b3I7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgICAgICBpZiAobmV3QXR0RmFjdG9yICE9IG1EZXNBdHRGYWN0b3IpCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBmb3JjZWQgYXR0ZW51YXRpb24gZmFjdG9yIHRvICVkIChmcm9tICVkKVxuIiwgbmV3QXR0RmFjdG9yLCBtRGVzQXR0RmFjdG9yKTsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IHNldCBhdHRlbnVhdGlvbiBmYWN0b3IgdG8gJWRcbiIsIG5ld0F0dEZhY3Rvcik7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXdCb29zdEZhY3RvciAhPSBtTGFzdEJvb3N0RmFjdG9yKSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX0JPT1NUX0ZBQ1RPUiwgbmV3Qm9vc3RGYWN0b3IpOworICAgICAgICAgICAgbUxhc3RCb29zdEZhY3RvciA9IG5ld0Jvb3N0RmFjdG9yOworI2lmZGVmIERSQ19QUkVTX01PREVfV1JBUF9ERUJVRworICAgICAgICAgICAgaWYgKG5ld0Jvb3N0RmFjdG9yICE9IG1EZXNCb29zdEZhY3RvcikKKyAgICAgICAgICAgICAgICBBTE9HVigiRFJDIHByZXNlbnRhdGlvbiBtb2RlIHdyYXBwZXI6IGZvcmNlZCBib29zdCBmYWN0b3IgdG8gJWQgKGZyb20gJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3Qm9vc3RGYWN0b3IsIG1EZXNCb29zdEZhY3Rvcik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgQUxPR1YoIkRSQyBwcmVzZW50YXRpb24gbW9kZSB3cmFwcGVyOiBzZXQgYm9vc3QgZmFjdG9yIHRvICVkXG4iLCBuZXdCb29zdEZhY3Rvcik7CisjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXdIZWF2eSAhPSBtTGFzdEhlYXZ5KSB7CisgICAgICAgICAgICBhYWNEZWNvZGVyX1NldFBhcmFtKG1IYW5kbGVEZWNvZGVyLCBBQUNfRFJDX0hFQVZZX0NPTVBSRVNTSU9OLCBuZXdIZWF2eSk7CisgICAgICAgICAgICBtTGFzdEhlYXZ5ID0gbmV3SGVhdnk7CisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgICAgICBpZiAobmV3SGVhdnkgIT0gbURlc0hlYXZ5KQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogZm9yY2VkIGhlYXZ5IGNvbXByZXNzaW9uIHRvICVkIChmcm9tICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld0hlYXZ5LCBtRGVzSGVhdnkpOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEFMT0dWKCJEUkMgcHJlc2VudGF0aW9uIG1vZGUgd3JhcHBlcjogc2V0IGhlYXZ5IGNvbXByZXNzaW9uIHRvICVkXG4iLCBuZXdIZWF2eSk7CisjZW5kaWYKKyAgICAgICAgfQorCisjaWZkZWYgRFJDX1BSRVNfTU9ERV9XUkFQX0RFQlVHCisgICAgICAgIEFMT0dWKCJEUkMgY29uZmlnOiB0Z3RfbGV2OiAlM2QsIGN1dDogJTNkLCBib29zdDogJTNkLCBoZWF2eTogJWRcbiIsIG5ld1RhcmdldCwKKyAgICAgICAgICAgICAgICBuZXdBdHRGYWN0b3IsIG5ld0Jvb3N0RmFjdG9yLCBuZXdIZWF2eSk7CisjZW5kaWYKKyAgICAgICAgbURhdGFVcGRhdGUgPSBmYWxzZTsKKworICAgIH0gLy8gaWYgKG1EYXRhVXBkYXRlKQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL0RyY1ByZXNNb2RlV3JhcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYjZjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvRHJjUHJlc01vZGVXcmFwLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjcHJhZ21hIG9uY2UKKyNpbmNsdWRlICJhYWNkZWNvZGVyX2xpYi5oIgorCit0eXBlZGVmIGVudW0KK3sKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9UQVJHRVQgICAgICAgICA9IDB4MDAwMCwKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9BVFRfRkFDVE9SICAgICA9IDB4MDAwMSwKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9CT09TVF9GQUNUT1IgICA9IDB4MDAwMiwKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWSAgICAgICAgICA9IDB4MDAwMywKKyAgICBEUkNfUFJFU19NT0RFX1dSQVBfRU5DT0RFUl9UQVJHRVQgICAgICAgICA9IDB4MDAwNAorfSBEUkNfUFJFU19NT0RFX1dSQVBfUEFSQU07CisKKworY2xhc3MgQ0RyY1ByZXNNb2RlV3JhcHBlciB7CitwdWJsaWM6CisgICAgQ0RyY1ByZXNNb2RlV3JhcHBlcigpOworICAgIH5DRHJjUHJlc01vZGVXcmFwcGVyKCk7CisgICAgdm9pZCBzZXREZWNvZGVySGFuZGxlKGNvbnN0IEhBTkRMRV9BQUNERUNPREVSIGhhbmRsZSk7CisgICAgdm9pZCBzZXRQYXJhbShjb25zdCBEUkNfUFJFU19NT0RFX1dSQVBfUEFSQU0gcGFyYW0sIGNvbnN0IGludCB2YWx1ZSk7CisgICAgdm9pZCBzdWJtaXRTdHJlYW1EYXRhKENTdHJlYW1JbmZvKik7CisgICAgdm9pZCB1cGRhdGUoKTsKKworcHJvdGVjdGVkOgorICAgIEhBTkRMRV9BQUNERUNPREVSIG1IYW5kbGVEZWNvZGVyOworICAgIGludCBtRGVzVGFyZ2V0OworICAgIGludCBtRGVzQXR0RmFjdG9yOworICAgIGludCBtRGVzQm9vc3RGYWN0b3I7CisgICAgaW50IG1EZXNIZWF2eTsKKworICAgIGludCBtRW5jb2RlclRhcmdldDsKKworICAgIGludCBtTGFzdFRhcmdldDsKKyAgICBpbnQgbUxhc3RBdHRGYWN0b3I7CisgICAgaW50IG1MYXN0Qm9vc3RGYWN0b3I7CisgICAgaW50IG1MYXN0SGVhdnk7CisKKyAgICBTQ0hBUiBtU3RyZWFtUFJMOworICAgIFNDSEFSIG1TdHJlYW1EUkNQcmVzTW9kZTsKKyAgICBJTlQgbVN0cmVhbU5yQUFDQ2hhbjsKKyAgICBJTlQgbVN0cmVhbU5yT3V0Q2hhbjsKKworICAgIGJvb2wgbUlzRG93bm1peDsKKyAgICBib29sIG1Jc01vbm9Eb3dubWl4OworICAgIGJvb2wgbUlzU3RlcmVvRG93bm1peDsKKworICAgIGJvb2wgbURhdGFVcGRhdGU7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpyZW5hbWUgdG8gbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYWFjL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OT1RJQ0UKcmVuYW1lIHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9OT1RJQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FhYy9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hYWMvcGF0ZW50X2Rpc2NsYWltZXIudHh0CkBAIC0wLDAgKzEsOSBAQAorCitUSElTIElTIE5PVCBBIEdSQU5UIE9GIFBBVEVOVCBSSUdIVFMuCisKK0dvb2dsZSBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBvciB3YXJyYW50eSB0aGF0IHRoZSBjb2RlY3MgZm9yIHdoaWNoCitzb3VyY2UgY29kZSBpcyBtYWRlIGF2YWlsYWJsZSBoZXJldW5kZXIgYXJlIHVuZW5jdW1iZXJlZCBieQordGhpcmQtcGFydHkgcGF0ZW50cy4gIFRob3NlIGludGVuZGluZyB0byB1c2UgdGhpcyBzb3VyY2UgY29kZSBpbgoraGFyZHdhcmUgb3Igc29mdHdhcmUgcHJvZHVjdHMgYXJlIGFkdmlzZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YKK3RoZXNlIGNvZGVjcywgaW5jbHVkaW5nIGluIG9wZW4gc291cmNlIHNvZnR3YXJlIG9yIHNoYXJld2FyZSwgbWF5CityZXF1aXJlIHBhdGVudCBsaWNlbnNlcyBmcm9tIHRoZSByZWxldmFudCBwYXRlbnQgaG9sZGVycy4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UyNWJjOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzcgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYW1ybmJkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEFtckRlYy5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURBTVJOQiIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYmRlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYW1yd2JkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEFtckRlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYmRlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYW1ybmJlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEFtck5iRW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZW5jIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hbXJ3YmVuYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QW1yV2JFbmMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1yd2JlbmMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZW5jX2NvbW1vbiIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtckRlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU3OGFkMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuY3BwCkBAIC0wLDAgKzEsNDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2lmZGVmIEFNUk5CCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEFtck5iRGVjIgorI2Vsc2UKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QW1yV2JEZWMiCisjZW5kaWYKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QW1yRGVjLmgiCisjaW5jbHVkZSAiZ3NtYW1yX2RlYy5oIgorI2luY2x1ZGUgInB2YW1yd2JkZWNvZGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworI2lmZGVmIEFNUk5CCisgIGNvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hbXJuYi5kZWNvZGVyIjsKKyNlbHNlCisgIGNvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hbXJ3Yi5kZWNvZGVyIjsKKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQzJTb2Z0QW1yRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTywKKyNpZmRlZiBBTVJOQgorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQgorI2Vsc2UKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IKKyNlbmRpZgorICAgICAgICAgICAgICAgICkgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7CisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKAorICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyNpZmRlZiBBTVJOQgorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuZXF1YWxUbyg4MDAwKX0pCisjZWxzZQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCAxNjAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmVxdWFsVG8oMTYwMDApfSkKKyNlbmRpZgorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmVxdWFsVG8oMSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorI2lmZGVmIEFNUk5CCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dCgwdSwgNDc1MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNDc1MCwgMTIyMDApfSkKKyNlbHNlCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dCgwdSwgNjYwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNjYwMCwgMjM4NTApfSkKKyNlbmRpZgorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworfTsKKworQzJTb2Z0QW1yRGVjOjpDMlNvZnRBbXJEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUFtckhhbmRsZShudWxscHRyKSwKKyAgICAgIG1EZWNvZGVyQnVmKG51bGxwdHIpLAorICAgICAgbURlY29kZXJDb29raWUobnVsbHB0cikgeworI2lmZGVmIEFNUk5CCisgICAgbUlzV2lkZSA9IGZhbHNlOworI2Vsc2UKKyAgICBtSXNXaWRlID0gdHJ1ZTsKKyNlbmRpZgorfQorCitDMlNvZnRBbXJEZWM6On5DMlNvZnRBbXJEZWMoKSB7CisgICAgKHZvaWQpb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtckRlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfTk9fTUVNT1JZOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJEZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAoIW1Jc1dpZGUpIHsKKyAgICAgICAgU3BlZWNoX0RlY29kZV9GcmFtZV9yZXNldChtQW1ySGFuZGxlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBwdkRlY29kZXJfQW1yV2JfUmVzZXQobUFtckhhbmRsZSwgMCAvKiByZXNldF9hbGwgKi8pOworICAgIH0KKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEFtckRlYzo6b25SZWxlYXNlKCkgeworICAgIGlmICghbUlzV2lkZSkgeworICAgICAgICBpZiAobUFtckhhbmRsZSkgeworICAgICAgICAgICAgR1NNRGVjb2RlRnJhbWVFeGl0KCZtQW1ySGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBtQW1ySGFuZGxlID0gbnVsbHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAobURlY29kZXJCdWYpIHsKKyAgICAgICAgICAgIGZyZWUobURlY29kZXJCdWYpOworICAgICAgICB9CisgICAgICAgIG1EZWNvZGVyQnVmID0gbnVsbHB0cjsKKyAgICAgICAgbUFtckhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIG1EZWNvZGVyQ29va2llID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtckRlYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3N0YXR1c190IEMyU29mdEFtckRlYzo6aW5pdERlY29kZXIoKSB7CisgICAgaWYgKCFtSXNXaWRlKSB7CisgICAgICAgIGlmIChHU01Jbml0RGVjb2RlKCZtQW1ySGFuZGxlLCAoaW50OF90ICopIkFNUk5CRGVjb2RlciIpKQorICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdWludDMyX3QgbWVtUmVxID0gcHZEZWNvZGVyX0FtcldiTWVtUmVxdWlyZW1lbnRzKCk7CisgICAgICAgIG1EZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcSk7CisgICAgICAgIGlmIChtRGVjb2RlckJ1ZikgeworICAgICAgICAgICAgcHZEZWNvZGVyX0FtcldiX0luaXQoJm1BbXJIYW5kbGUsIG1EZWNvZGVyQnVmLCAmbURlY29kZXJDb29raWUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyBzaXplX3QgZ2V0RnJhbWVTaXplKGJvb2wgaXNXaWRlLCB1bnNpZ25lZCBGTSkgeworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYW1lU2l6ZU5CWzE2XSA9IHsKKyAgICAgICAgMTIsIDEzLCAxNSwgMTcsIDE5LCAyMCwgMjYsIDMxLAorICAgICAgICA1LCA2LCA1LCA1LCAvLyBTSUQKKyAgICAgICAgMCwgMCwgMCwgLy8gZnV0dXJlIHVzZQorICAgICAgICAwIC8vIG5vIGRhdGEKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0ZyYW1lU2l6ZVdCWzE2XSA9IHsKKyAgICAgICAgMTcsIDIzLCAzMiwgMzYsIDQwLCA0NiwgNTAsIDU4LCA2MCwKKyAgICAgICAgNSwgLy8gU0lECisgICAgICAgIDAsIDAsIDAsIDAsIC8vIGZ1dHVyZSB1c2UKKyAgICAgICAgMCwgLy8gc3BlZWNoIGxvc3QKKyAgICAgICAgMCAvLyBubyBkYXRhCisgICAgfTsKKworICAgIGlmIChGTSA+IDE1IHx8IChpc1dpZGUgJiYgRk0gPiA5ICYmIEZNIDwgMTQpIHx8ICghaXNXaWRlICYmIEZNID4gMTEgJiYgRk0gPCAxNSkpIHsKKyAgICAgICAgQUxPR0UoImlsbGVnYWwgQU1SIGZyYW1lIG1vZGUgJWQiLCBGTSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICAvLyBhZGQgMSBmb3IgaGVhZGVyIGJ5dGUKKyAgICByZXR1cm4gKGlzV2lkZSA/IGtGcmFtZVNpemVXQltGTV0gOiBrRnJhbWVTaXplTkJbRk1dKSArIDE7Cit9CisKK3N0YXRpYyBzdGF0dXNfdCBjYWxjdWxhdGVOdW1GcmFtZXMoY29uc3QgdWludDggKmlucHV0LCBzaXplX3QgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+ICpmcmFtZVNpemVMaXN0LCBib29sIGlzV2lkZSkgeworICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgaW5TaXplOykgeworICAgICAgICBpbnQxNl90IEZNID0gKChpbnB1dFswXSA+PiAzKSAmIDB4MGYpOworICAgICAgICBzaXplX3QgZnJhbWVTaXplID0gZ2V0RnJhbWVTaXplKGlzV2lkZSwgRk0pOworICAgICAgICBpZiAoZnJhbWVTaXplID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmICgoaW5TaXplIC0gaykgPj0gZnJhbWVTaXplKSB7CisgICAgICAgICAgICBpbnB1dCArPSBmcmFtZVNpemU7CisgICAgICAgICAgICBrICs9IGZyYW1lU2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGJyZWFrOworICAgICAgICBmcmFtZVNpemVMaXN0LT5wdXNoX2JhY2soZnJhbWVTaXplKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEMyU29mdEFtckRlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gZnJhbWVTaXplTGlzdDsKKyAgICBpZiAoT0sgIT0gY2FsY3VsYXRlTnVtRnJhbWVzKHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0LCBpblNpemUsICZmcmFtZVNpemVMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzV2lkZSkpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChmcmFtZVNpemVMaXN0LmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoImlucHV0IHNpemUgc21hbGxlciB0aGFuIGV4cGVjdGVkIik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDE2X3Qgb3V0U2FtcGxlcyA9IG1Jc1dpZGUgPyBrTnVtU2FtcGxlc1BlckZyYW1lV0IgOiBrTnVtU2FtcGxlc1BlckZyYW1lTkI7CisgICAgc2l6ZV90IGNhbE91dFNpemUgPSBvdXRTYW1wbGVzICogZnJhbWVTaXplTGlzdC5zaXplKCkgKiBzaXplb2YoaW50MTZfdCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKGNhbE91dFNpemUsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MTZfdCAqb3V0cHV0ID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+KHdWaWV3LmRhdGEoKSk7CisgICAgYXV0byBpdCA9IGZyYW1lU2l6ZUxpc3QuYmVnaW4oKTsKKyAgICBjb25zdCB1aW50OF90ICppblB0ciA9IHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0OworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGlmIChpdCA9PSBmcmFtZVNpemVMaXN0LmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRCgidW5leHBlY3RlZCB0cmFpbGluZyBieXRlcywgaWdub3JpbmcgdGhlbSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCAqaW5wdXQgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5QdHIgKyBpblBvcyk7CisgICAgICAgIGludDE2X3QgRk0gPSAoKCppbnB1dCA+PiAzKSAmIDB4MGYpOworICAgICAgICBpZiAoIW1Jc1dpZGUpIHsKKyAgICAgICAgICAgIGludDMyX3QgbnVtQnl0ZXNSZWFkID0gQU1SRGVjb2RlKG1BbXJIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoRnJhbWVfVHlwZV8zR1BQKSBGTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0ICsgMSwgb3V0cHV0LCBNSU1FX0lFVEYpOworICAgICAgICAgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4obnVtQnl0ZXNSZWFkICsgMSkgIT0gKml0KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoInBhbmljLCBwYXJzZWQgc2l6ZSBkb2VzIG5vdCBtYXRjaCBkZWNvZGVkIHNpemUiKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoRk0gPj0gOSkgeworICAgICAgICAgICAgICAgIC8vIFByb2R1Y2Ugc2lsZW5jZSBpbnN0ZWFkIG9mIGNvbWZvcnQgbm9pc2UgYW5kIGZvcgorICAgICAgICAgICAgICAgIC8vIHNwZWVjaCBsb3N0L25vIGRhdGEuCisgICAgICAgICAgICAgICAgbWVtc2V0KG91dHB1dCwgMCwgb3V0U2FtcGxlcyAqIHNpemVvZihpbnQxNl90KSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGludDE2X3QgRlQ7CisgICAgICAgICAgICAgICAgUlhfU3RhdGVfd2Igcnhfc3RhdGU7CisgICAgICAgICAgICAgICAgaW50MTZfdCBudW1SZWNTYW1wbGVzOworCisgICAgICAgICAgICAgICAgbWltZV91bnNvcnRpbmcoY29uc3RfY2FzdDx1aW50OF90ICo+KCZpbnB1dFsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0U2FtcGxlQnVmZmVyLCAmRlQsICZGTSwgMSwgJnJ4X3N0YXRlKTsKKyAgICAgICAgICAgICAgICBwdkRlY29kZXJfQW1yV2IoRk0sIG1JbnB1dFNhbXBsZUJ1ZmZlciwgb3V0cHV0LCAmbnVtUmVjU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURlY29kZXJCdWYsIEZULCBtRGVjb2RlckNvb2tpZSk7CisgICAgICAgICAgICAgICAgaWYgKG51bVJlY1NhbXBsZXMgIT0gb3V0U2FtcGxlcykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiU2FtcGxlIG91dHB1dCBwZXIgZnJhbWUgaW5jb3JyZWN0Iik7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBEZWxldGUgdGhlIDIgTFNCcyAoMTQtYml0IG91dHB1dCkgKi8KKyAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bVJlY1NhbXBsZXM7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBvdXRwdXRbaV0gJj0gMHhmZmZDOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpblBvcyArPSAqaXQ7CisgICAgICAgIG91dHB1dCArPSBvdXRTYW1wbGVzOworICAgICAgICArK2l0OworICAgIH0KKworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaykpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0QU1SRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEFNUkRlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRBbXJEZWMoQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBbXJEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QW1yRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QW1yRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QU1SRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QU1SRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM4NDQ1MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJEZWMuaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQU1SX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfQU1SX0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRBbXJEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0QW1yRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEFtckRlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtOdW1TYW1wbGVzUGVyRnJhbWVOQiAgID0gMTYwLAorICAgICAgICBrTnVtU2FtcGxlc1BlckZyYW1lV0IgICA9IDMyMCwKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICB2b2lkICptQW1ySGFuZGxlOworICAgIHZvaWQgKm1EZWNvZGVyQnVmOworICAgIGludDE2X3QgKm1EZWNvZGVyQ29va2llOworCisgICAgaW50MTZfdCBtSW5wdXRTYW1wbGVCdWZmZXJbNDc3XTsKKworICAgIGJvb2wgbUlzV2lkZTsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0QW1yRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0FNUl9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyZDhjYjYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuY3BwCkBAIC0wLDAgKzEsMzQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBbXJOYkVuYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0QW1yTmJFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYW1ybmIuZW5jb2RlciI7CisKK30gIC8vIG5hbWVzcGFjZQorCisKK2NsYXNzIEMyU29mdEFtck5iRW5jOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfTkIpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOworICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuZXF1YWxUbygxKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dCgwdSwgODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmVxdWFsVG8oODAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICAoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ3NTApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQ3NTAsIDEyMjAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRDaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50LT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldEJpdHJhdGUoKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZS0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdEFtck5iRW5jOjpDMlNvZnRBbXJOYkVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUVuY1N0YXRlKG51bGxwdHIpLAorICAgICAgbVNpZFN0YXRlKG51bGxwdHIpIHsKK30KKworQzJTb2Z0QW1yTmJFbmM6On5DMlNvZnRBbXJOYkVuYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yTmJFbmM6Om9uSW5pdCgpIHsKKyAgICBib29sIGR0eF9lbmFibGUgPSBmYWxzZTsKKworICAgIGlmIChBTVJFbmNvZGVJbml0KCZtRW5jU3RhdGUsICZtU2lkU3RhdGUsIGR0eF9lbmFibGUpICE9IDApCisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgLy8gVE9ETzogZ2V0IG1vZGUgZGlyZWN0bHkgZnJvbSBjb25maWcKKyAgICBzd2l0Y2gobUludGYtPmdldEJpdHJhdGUoKSkgeworICAgICAgICBjYXNlIDQ3NTA6IG1Nb2RlID0gTVI0NzU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA1MTUwOiBtTW9kZSA9IE1SNTE1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNTkwMDogbU1vZGUgPSBNUjU5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNjcwMDogbU1vZGUgPSBNUjY3OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzQwMDogbU1vZGUgPSBNUjc0OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNzk1MDogbU1vZGUgPSBNUjc5NTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEwMjAwOiBtTW9kZSA9IE1SMTAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTIyMDA6IG1Nb2RlID0gTVIxMjI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogbU1vZGUgPSBNUjc5NTsKKyAgICB9CisgICAgbUlzRmlyc3QgPSB0cnVlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDA7CisgICAgbUZpbGxlZExlbiA9IDA7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yTmJFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobUVuY1N0YXRlKSB7CisgICAgICAgIEFNUkVuY29kZUV4aXQoJm1FbmNTdGF0ZSwgJm1TaWRTdGF0ZSk7CisgICAgICAgIG1FbmNTdGF0ZSA9IG1TaWRTdGF0ZSA9IG51bGxwdHI7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJOYkVuYzo6b25TdG9wKCkgeworICAgIGlmIChBTVJFbmNvZGVSZXNldChtRW5jU3RhdGUsIG1TaWRTdGF0ZSkgIT0gMCkKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKyAgICBtRmlsbGVkTGVuID0gMDsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBbXJOYkVuYzo6b25SZXNldCgpIHsKKyAgICAodm9pZCkgb25TdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtck5iRW5jOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yTmJFbmM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCwgZmxhZ3MgJXgiLAorICAgICAgICAgIGluU2l6ZSwgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKworICAgIHNpemVfdCBvdXRDYXBhY2l0eSA9IGtOdW1CeXRlc1BlcklucHV0RnJhbWU7CisgICAgb3V0Q2FwYWNpdHkgKz0gbUZpbGxlZExlbiArIGluU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gb3V0cHV0QmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0Q2FwYWNpdHksIHVzYWdlLCAmb3V0cHV0QmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBvdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdWludDY0X3Qgb3V0VGltZVN0YW1wID0KKyAgICAgICAgbVByb2Nlc3NlZFNhbXBsZXMgKiAxMDAwMDAwbGwgLyBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgc2l6ZV90IG91dFBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluUHRyID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgICAgIGludCB2YWxpZFNhbXBsZXMgPSBtRmlsbGVkTGVuIC8gc2l6ZW9mKGludDE2X3QpOworICAgICAgICBpZiAoKGluUG9zICsgKGtOdW1CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKSkgPD0gaW5TaXplKSB7CisgICAgICAgICAgICBtZW1jcHkobUlucHV0RnJhbWUgKyB2YWxpZFNhbXBsZXMsIGluUHRyICsgaW5Qb3MsCisgICAgICAgICAgICAgICAgICAgKGtOdW1CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKSk7CisgICAgICAgICAgICBpblBvcyArPSAoa051bUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KG1JbnB1dEZyYW1lICsgdmFsaWRTYW1wbGVzLCBpblB0ciArIGluUG9zLCAoaW5TaXplIC0gaW5Qb3MpKTsKKyAgICAgICAgICAgIG1GaWxsZWRMZW4gKz0gKGluU2l6ZSAtIGluUG9zKTsKKyAgICAgICAgICAgIGluUG9zICs9IChpblNpemUgLSBpblBvcyk7CisgICAgICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICAgICAgdmFsaWRTYW1wbGVzID0gbUZpbGxlZExlbiAvIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgICAgICBtZW1zZXQobUlucHV0RnJhbWUgKyB2YWxpZFNhbXBsZXMsIDAsIChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbikpOworICAgICAgICAgICAgfSBlbHNlIGJyZWFrOworCisgICAgICAgIH0KKyAgICAgICAgRnJhbWVfVHlwZV8zR1BQIGZyYW1lVHlwZTsKKyAgICAgICAgaW50IG51bUVuY0J5dGVzID0gQU1SRW5jb2RlKG1FbmNTdGF0ZSwgbVNpZFN0YXRlLCBtTW9kZSwgbUlucHV0RnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Vmlldy5kYXRhKCkgKyBvdXRQb3MsICZmcmFtZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTVJfVFhfV01GKTsKKyAgICAgICAgaWYgKG51bUVuY0J5dGVzIDwgMCB8fCBudW1FbmNCeXRlcyA+ICgoaW50KW91dENhcGFjaXR5IC0gKGludClvdXRQb3MpKSB7CisgICAgICAgICAgICBBTE9HRSgiZW5jb2RlRnJhbWUgY2FsbCBmYWlsZWQsIHN0YXRlIFslZCAlenUgJXp1XSIsIG51bUVuY0J5dGVzLCBvdXRQb3MsIG91dENhcGFjaXR5KTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gQ29udmVydCBoZWFkZXIgYnl0ZSBmcm9tIFdNRiB0byBJRVRGIGZvcm1hdC4KKyAgICAgICAgaWYgKG51bUVuY0J5dGVzID4gMCkKKyAgICAgICAgICAgIHdWaWV3LmRhdGEoKVtvdXRQb3NdID0gKCh3Vmlldy5kYXRhKClbb3V0UG9zXSA8PCAzKSB8IDQpICYgMHg3YzsKKyAgICAgICAgb3V0UG9zICs9IG51bUVuY0J5dGVzOworICAgICAgICBtUHJvY2Vzc2VkU2FtcGxlcyArPSBrTnVtU2FtcGxlc1BlckZyYW1lOworICAgICAgICBtRmlsbGVkTGVuID0gMDsKKyAgICB9CisgICAgQUxPR1YoImNhdXNhbCBzYW1wbGUgc2l6ZSAlZCIsIG1GaWxsZWRMZW4pOworICAgIGlmIChtSXNGaXJzdCAmJiBvdXRQb3MgIT0gMCkgeworICAgICAgICBtSXNGaXJzdCA9IGZhbHNlOworICAgICAgICBtQW5jaG9yVGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgIH0KKyAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIGlmIChvdXRQb3MgIT0gMCkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgY3JlYXRlTGluZWFyQnVmZmVyKHN0ZDo6bW92ZShvdXRwdXRCbG9jayksIDAsIG91dFBvcykpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworCisgICAgfQorICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIGlmIChtRmlsbGVkTGVuKSBBTE9HVigiRGlzY2FyZGluZyB0cmFpbGluZyAlZCBieXRlcyIsIG1GaWxsZWRMZW4pOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QW1yTmJFbmM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgb25GbHVzaF9zbSgpOworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0QW1yTmJFbmNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0QW1yTmJFbmNGYWN0b3J5KCkKKyAgICAgICAgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdEFtck5iRW5jKAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFtck5iRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRBbXJOYkVuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEFtck5iRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRBbXJOYkVuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEFtck5iRW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJOYkVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhYjE0ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yTmJFbmMuaApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQU1SX05CX0VOQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfQU1SX05CX0VOQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgImdzbWFtcl9lbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMlNvZnRBbXJOYkVuYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICBwdWJsaWM6CisgICAgY2xhc3MgSW50ZkltcGw7CisgICAgQzJTb2Z0QW1yTmJFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRBbXJOYkVuYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtOdW1TYW1wbGVzUGVyRnJhbWUgPSBMX0ZSQU1FOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtOdW1CeXRlc1BlcklucHV0RnJhbWUgPSBrTnVtU2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKGludDE2X3QpOworCisgICAgdm9pZCAqbUVuY1N0YXRlOworICAgIHZvaWQgKm1TaWRTdGF0ZTsKKyAgICBNb2RlIG1Nb2RlOworICAgIGJvb2wgbUlzRmlyc3Q7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIHVpbnQ2NF90IG1BbmNob3JUaW1lU3RhbXA7CisgICAgdWludDY0X3QgbVByb2Nlc3NlZFNhbXBsZXM7CisgICAgaW50MzJfdCBtRmlsbGVkTGVuOworICAgIGludDE2X3QgbUlucHV0RnJhbWVba051bVNhbXBsZXNQZXJGcmFtZV07CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBbXJOYkVuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BTVJfTkJfRU5DX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvQzJTb2Z0QW1yV2JFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGFlNGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmNwcApAQCAtMCwwICsxLDQyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QW1yV2JFbmMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBbXJXYkVuYy5oIgorI2luY2x1ZGUgImNtbk1lbW9yeS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hbXJ3Yi5lbmNvZGVyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEMyU29mdEFtcldiRW5jOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOworICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuZXF1YWxUbygxKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dCgwdSwgMTYwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5lcXVhbFRvKDE2MDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoCisgICAgICAgICAgICAgICAgICAgIChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCgwdSwgNjYwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNjYwMCwgMjM4NTApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA4MTkyKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgdWludDMyX3QgZ2V0U2FtcGxlUmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1TYW1wbGVSYXRlLT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldENoYW5uZWxDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsQ291bnQtPnZhbHVlOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworfTsKKworQzJTb2Z0QW1yV2JFbmM6OkMyU29mdEFtcldiRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtRW5jb2RlckhhbmRsZShudWxscHRyKSwKKyAgICAgIG1BcGlIYW5kbGUobnVsbHB0ciksCisgICAgICBtTWVtT3BlcmF0b3IobnVsbHB0cikgeworfQorCitDMlNvZnRBbXJXYkVuYzo6fkMyU29mdEFtcldiRW5jKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJXYkVuYzo6b25Jbml0KCkgeworICAgIC8vIFRPRE86IGdldCBtb2RlIGRpcmVjdGx5IGZyb20gY29uZmlnCisgICAgc3dpdGNoKG1JbnRmLT5nZXRCaXRyYXRlKCkpIHsKKyAgICAgICAgY2FzZSA2NjAwOiBtTW9kZSA9IFZPQU1SV0JfTUQ2NjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDg4NTA6IG1Nb2RlID0gVk9BTVJXQl9NRDg4NTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDEyNjUwOiBtTW9kZSA9IFZPQU1SV0JfTUQxMjY1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTQyNTA6IG1Nb2RlID0gVk9BTVJXQl9NRDE0MjU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxNTg1MDogbU1vZGUgPSBWT0FNUldCX01EMTU4NTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE4MjUwOiBtTW9kZSA9IFZPQU1SV0JfTUQxODI1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTk4NTA6IG1Nb2RlID0gVk9BTVJXQl9NRDE5ODU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyMzA1MDogbU1vZGUgPSBWT0FNUldCX01EMjMwNTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDIzODUwOiBtTW9kZSA9IFZPQU1SV0JfTUQyMzg1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IG1Nb2RlID0gVk9BTVJXQl9NRDIzMDU7CisgICAgfQorICAgIHN0YXR1c190IGVyciA9IGluaXRFbmNvZGVyKCk7CisgICAgbUlzRmlyc3QgPSB0cnVlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDA7CisgICAgbUZpbGxlZExlbiA9IDA7CisKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK3ZvaWQgQzJTb2Z0QW1yV2JFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobUVuY29kZXJIYW5kbGUpIHsKKyAgICAgICAgQ0hFQ0tfRVEoKFZPX1UzMilWT19FUlJfTk9ORSwgbUFwaUhhbmRsZS0+VW5pbml0KG1FbmNvZGVySGFuZGxlKSk7CisgICAgICAgIG1FbmNvZGVySGFuZGxlID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKG1BcGlIYW5kbGUpIHsKKyAgICAgICAgZGVsZXRlIG1BcGlIYW5kbGU7CisgICAgICAgIG1BcGlIYW5kbGUgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobU1lbU9wZXJhdG9yKSB7CisgICAgICAgIGRlbGV0ZSBtTWVtT3BlcmF0b3I7CisgICAgICAgIG1NZW1PcGVyYXRvciA9IG51bGxwdHI7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJXYkVuYzo6b25TdG9wKCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga051bVNhbXBsZXNQZXJGcmFtZTsgaSsrKSB7CisgICAgICAgIG1JbnB1dEZyYW1lW2ldID0gMHgwMDA4OyAvKiBFSEZfTUFTSyAqLworICAgIH0KKyAgICB1aW50OF90IG91dEJ1ZmZlcltrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lXTsKKyAgICAodm9pZCkgZW5jb2RlSW5wdXQob3V0QnVmZmVyLCBrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lKTsKKyAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKyAgICBtRmlsbGVkTGVuID0gMDsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBbXJXYkVuYzo6b25SZXNldCgpIHsKKyAgICAodm9pZCkgb25TdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFtcldiRW5jOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0QW1yV2JFbmM6OmluaXRFbmNvZGVyKCkgeworICAgIG1BcGlIYW5kbGUgPSBuZXcgVk9fQVVESU9fQ09ERUNBUEk7CisgICAgaWYgKCFtQXBpSGFuZGxlKSByZXR1cm4gTk9fTUVNT1JZOworCisgICAgaWYgKFZPX0VSUl9OT05FICE9IHZvR2V0QU1SV0JFbmNBUEkobUFwaUhhbmRsZSkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgYXBpIGhhbmRsZSIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBtTWVtT3BlcmF0b3IgPSBuZXcgVk9fTUVNX09QRVJBVE9SOworICAgIGlmICghbU1lbU9wZXJhdG9yKSByZXR1cm4gTk9fTUVNT1JZOworCisgICAgbU1lbU9wZXJhdG9yLT5BbGxvYyA9IGNtbk1lbUFsbG9jOworICAgIG1NZW1PcGVyYXRvci0+Q29weSA9IGNtbk1lbUNvcHk7CisgICAgbU1lbU9wZXJhdG9yLT5GcmVlID0gY21uTWVtRnJlZTsKKyAgICBtTWVtT3BlcmF0b3ItPlNldCA9IGNtbk1lbVNldDsKKyAgICBtTWVtT3BlcmF0b3ItPkNoZWNrID0gY21uTWVtQ2hlY2s7CisKKyAgICBWT19DT0RFQ19JTklUX1VTRVJEQVRBIHVzZXJEYXRhOworICAgIG1lbXNldCgmdXNlckRhdGEsIDAsIHNpemVvZih1c2VyRGF0YSkpOworICAgIHVzZXJEYXRhLm1lbWZsYWcgPSBWT19JTUZfVVNFUk1FTU9QRVJBVE9SOworICAgIHVzZXJEYXRhLm1lbURhdGEgPSAoVk9fUFRSKSBtTWVtT3BlcmF0b3I7CisKKyAgICBpZiAoVk9fRVJSX05PTkUgIT0gbUFwaUhhbmRsZS0+SW5pdCgKKyAgICAgICAgICAgICAgICAmbUVuY29kZXJIYW5kbGUsIFZPX0FVRElPX0NvZGluZ0FNUldCLCAmdXNlckRhdGEpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdCBBTVJXQiBlbmNvZGVyIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIFZPQU1SV0JGUkFNRVRZUEUgdHlwZSA9IFZPQU1SV0JfUkZDMzI2NzsKKyAgICBpZiAoVk9fRVJSX05PTkUgIT0gbUFwaUhhbmRsZS0+U2V0UGFyYW0oCisgICAgICAgICAgICAgICAgbUVuY29kZXJIYW5kbGUsIFZPX1BJRF9BTVJXQl9GUkFNRVRZUEUsICZ0eXBlKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBTVJXQiBlbmNvZGVyIGZyYW1lIHR5cGUgdG8gJWQiLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKFZPX0VSUl9OT05FICE9CisgICAgICAgICAgICBtQXBpSGFuZGxlLT5TZXRQYXJhbSgKKyAgICAgICAgICAgICAgICAgICAgbUVuY29kZXJIYW5kbGUsIFZPX1BJRF9BTVJXQl9NT0RFLCAgJm1Nb2RlKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBBTVJXQiBlbmNvZGVyIG1vZGUgdG8gJWQiLCBtTW9kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworaW50IEMyU29mdEFtcldiRW5jOjplbmNvZGVJbnB1dCh1aW50OF90ICpidWZmZXIsIHVpbnQzMl90IGxlbmd0aCkgeworICAgIFZPX0NPREVDQlVGRkVSIGlucHV0RGF0YTsKKyAgICBtZW1zZXQoJmlucHV0RGF0YSwgMCwgc2l6ZW9mKGlucHV0RGF0YSkpOworICAgIGlucHV0RGF0YS5CdWZmZXIgPSAodW5zaWduZWQgY2hhciAqKSBtSW5wdXRGcmFtZTsKKyAgICBpbnB1dERhdGEuTGVuZ3RoID0ga051bUJ5dGVzUGVySW5wdXRGcmFtZTsKKworICAgIENIRUNLX0VRKChWT19VMzIpVk9fRVJSX05PTkUsCisgICAgICAgICAgICAgbUFwaUhhbmRsZS0+U2V0SW5wdXREYXRhKG1FbmNvZGVySGFuZGxlLCAmaW5wdXREYXRhKSk7CisKKyAgICBWT19BVURJT19PVVRQVVRJTkZPIG91dHB1dEluZm87CisgICAgbWVtc2V0KCZvdXRwdXRJbmZvLCAwLCBzaXplb2Yob3V0cHV0SW5mbykpOworICAgIFZPX0NPREVDQlVGRkVSIG91dHB1dERhdGE7CisgICAgbWVtc2V0KCZvdXRwdXREYXRhLCAwLCBzaXplb2Yob3V0cHV0RGF0YSkpOworICAgIG91dHB1dERhdGEuQnVmZmVyID0gYnVmZmVyOworICAgIG91dHB1dERhdGEuTGVuZ3RoID0gbGVuZ3RoOworICAgIFZPX1UzMiByZXQgPSBtQXBpSGFuZGxlLT5HZXRPdXRwdXREYXRhKAorICAgICAgICAgICAgbUVuY29kZXJIYW5kbGUsICZvdXRwdXREYXRhLCAmb3V0cHV0SW5mbyk7CisgICAgaWYgKHJldCAhPSBWT19FUlJfTk9ORSAmJiByZXQgIT0gVk9fRVJSX0lOUFVUX0JVRkZFUl9TTUFMTCkgeworICAgICAgICBBTE9HRCgiZW5jb3VudGVyZWQgZXJyb3IgZHVyaW5nIGVuY29kZSBjYWxsIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIG91dHB1dERhdGEuTGVuZ3RoOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRBbXJXYkVuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisKKyAgICBzaXplX3Qgb3V0Q2FwYWNpdHkgPSBrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lOworICAgIG91dENhcGFjaXR5ICs9IG1GaWxsZWRMZW4gKyBpblNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IG91dHB1dEJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dENhcGFjaXR5LCB1c2FnZSwgJm91dHB1dEJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gb3V0cHV0QmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPQorICAgICAgICBtUHJvY2Vzc2VkU2FtcGxlcyAqIDEwMDAwMDBsbCAvIG1JbnRmLT5nZXRTYW1wbGVSYXRlKCk7CisgICAgc2l6ZV90IGluUG9zID0gMDsKKyAgICBzaXplX3Qgb3V0UG9zID0gMDsKKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCAqaW5QdHIgPSByVmlldy5kYXRhKCkgKyBpbk9mZnNldDsKKyAgICAgICAgaW50IHZhbGlkU2FtcGxlcyA9IG1GaWxsZWRMZW4gLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGlmICgoaW5Qb3MgKyAoa051bUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKSA8PSBpblNpemUpIHsKKyAgICAgICAgICAgIG1lbWNweShtSW5wdXRGcmFtZSArIHZhbGlkU2FtcGxlcywgaW5QdHIgKyBpblBvcywKKyAgICAgICAgICAgICAgICAgICAoa051bUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKTsKKyAgICAgICAgICAgIGluUG9zICs9IChrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lIC0gbUZpbGxlZExlbik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1jcHkobUlucHV0RnJhbWUgKyB2YWxpZFNhbXBsZXMsIGluUHRyICsgaW5Qb3MsIChpblNpemUgLSBpblBvcykpOworICAgICAgICAgICAgbUZpbGxlZExlbiArPSAoaW5TaXplIC0gaW5Qb3MpOworICAgICAgICAgICAgaW5Qb3MgKz0gKGluU2l6ZSAtIGluUG9zKTsKKyAgICAgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgICAgICB2YWxpZFNhbXBsZXMgPSBtRmlsbGVkTGVuIC8gc2l6ZW9mKGludDE2X3QpOworICAgICAgICAgICAgICAgIG1lbXNldChtSW5wdXRGcmFtZSArIHZhbGlkU2FtcGxlcywgMCwgKGtOdW1CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKSk7CisgICAgICAgICAgICB9IGVsc2UgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW50IG51bUVuY0J5dGVzID0gZW5jb2RlSW5wdXQoKHdWaWV3LmRhdGEoKSArIG91dFBvcyksIG91dENhcGFjaXR5IC0gb3V0UG9zKTsKKyAgICAgICAgaWYgKG51bUVuY0J5dGVzIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoImVuY29kZUZyYW1lIGNhbGwgZmFpbGVkLCBzdGF0ZSBbJWQgJXp1ICV6dV0iLCBudW1FbmNCeXRlcywgb3V0UG9zLCBvdXRDYXBhY2l0eSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG91dFBvcyArPSBudW1FbmNCeXRlczsKKyAgICAgICAgbVByb2Nlc3NlZFNhbXBsZXMgKz0ga051bVNhbXBsZXNQZXJGcmFtZTsKKyAgICAgICAgbUZpbGxlZExlbiA9IDA7CisgICAgfQorICAgIEFMT0dWKCJjYXVzYWwgc2FtcGxlIHNpemUgJWQiLCBtRmlsbGVkTGVuKTsKKyAgICBpZiAobUlzRmlyc3QgJiYgb3V0UG9zICE9IDApIHsKKyAgICAgICAgbUlzRmlyc3QgPSBmYWxzZTsKKyAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICB9CisgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICBpZiAob3V0UG9zICE9IDApIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgIGNyZWF0ZUxpbmVhckJ1ZmZlcihzdGQ6Om1vdmUob3V0cHV0QmxvY2spLCAwLCBvdXRQb3MpKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgaWYgKG1GaWxsZWRMZW4pIEFMT0dWKCJEaXNjYXJkaW5nIHRyYWlsaW5nICVkIGJ5dGVzIiwgbUZpbGxlZExlbik7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBbXJXYkVuYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBvbkZsdXNoX3NtKCk7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRBbXJXYkVuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRBbXJXYkVuY0ZhY3RvcnkoKQorICAgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkge30KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0QW1yV2JFbmMoCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QW1yV2JFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEFtcldiRW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QW1yV2JFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEFtcldiRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QW1yV2JFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW1yX25iX3diL0MyU29mdEFtcldiRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGNjOWU5ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9DMlNvZnRBbXJXYkVuYy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BTVJfV0JfRU5DX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BTVJfV0JfRU5DX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAidm9BTVJXQi5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyU29mdEFtcldiRW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKK3B1YmxpYzoKKyAgICBjbGFzcyBJbnRmSW1wbDsKKyAgICBDMlNvZnRBbXJXYkVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdEFtcldiRW5jKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga051bVNhbXBsZXNQZXJGcmFtZSA9IDMyMDsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTnVtQnl0ZXNQZXJJbnB1dEZyYW1lID0ga051bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KTsKKworICAgIHZvaWQgKm1FbmNvZGVySGFuZGxlOworICAgIFZPX0FVRElPX0NPREVDQVBJICptQXBpSGFuZGxlOworICAgIFZPX01FTV9PUEVSQVRPUiAqbU1lbU9wZXJhdG9yOworICAgIFZPQU1SV0JNT0RFIG1Nb2RlOworICAgIGJvb2wgbUlzRmlyc3Q7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIHVpbnQ2NF90IG1BbmNob3JUaW1lU3RhbXA7CisgICAgdWludDY0X3QgbVByb2Nlc3NlZFNhbXBsZXM7CisgICAgaW50MzJfdCBtRmlsbGVkTGVuOworICAgIGludDE2X3QgbUlucHV0RnJhbWVba051bVNhbXBsZXNQZXJGcmFtZV07CisKKyAgICBzdGF0dXNfdCBpbml0RW5jb2RlcigpOworICAgIGludCBlbmNvZGVJbnB1dCh1aW50OF90ICpidWZmZXIsIHVpbnQzMl90IGxlbmd0aCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBbXJXYkVuYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BTVJfV0JfRU5DX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL05PVElDRQpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9OT1RJQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Ftcl9uYl93Yi9wYXRlbnRfZGlzY2xhaW1lci50eHQgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvcGF0ZW50X2Rpc2NsYWltZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hbXJfbmJfd2IvcGF0ZW50X2Rpc2NsYWltZXIudHh0CkBAIC0wLDAgKzEsOSBAQAorCitUSElTIElTIE5PVCBBIEdSQU5UIE9GIFBBVEVOVCBSSUdIVFMuCisKK0dvb2dsZSBtYWtlcyBubyByZXByZXNlbnRhdGlvbiBvciB3YXJyYW50eSB0aGF0IHRoZSBjb2RlY3MgZm9yIHdoaWNoCitzb3VyY2UgY29kZSBpcyBtYWRlIGF2YWlsYWJsZSBoZXJldW5kZXIgYXJlIHVuZW5jdW1iZXJlZCBieQordGhpcmQtcGFydHkgcGF0ZW50cy4gIFRob3NlIGludGVuZGluZyB0byB1c2UgdGhpcyBzb3VyY2UgY29kZSBpbgoraGFyZHdhcmUgb3Igc29mdHdhcmUgcHJvZHVjdHMgYXJlIGFkdmlzZWQgdGhhdCBpbXBsZW1lbnRhdGlvbnMgb2YKK3RoZXNlIGNvZGVjcywgaW5jbHVkaW5nIGluIG9wZW4gc291cmNlIHNvZnR3YXJlIG9yIHNoYXJld2FyZSwgbWF5CityZXF1aXJlIHBhdGVudCBsaWNlbnNlcyBmcm9tIHRoZSByZWxldmFudCBwYXRlbnQgaG9sZGVycy4KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjFkYmQ0YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjAgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYXYxZGVjX2FvbSIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIC8vIGNvb3JkaW5hdGVkIHdpdGggZnJhbWV3b3Jrcy9hdi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nYXYxL0FuZHJvaWQuYnAKKyAgICAvLyBzbyBvbmx5IDEgb2YgdGhlbSBoYXMgdGhlIG9mZmljaWFsIGMyLmFuZHJvaWQuYXYxLmRlY29kZXIgbmFtZQorICAgIGNmbGFnczogWworICAgICAgICAiLURDT0RFQ05BTUU9XCJjMi5hbmRyb2lkLmF2MS1hb20uZGVjb2RlclwiIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRBb21EZWMuY3BwIl0sCisgICAgc3RhdGljX2xpYnM6IFsibGliYW9tIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImV4dGVybmFsL2xpYmFvbS8iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2FvbS9DMlNvZnRBb21EZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MTM3ZTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmNwcApAQCAtMCwwICsxLDgxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QW9tRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBb21EZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBjb2RlY25hbWUgc2V0IGFuZCBwYXNzZWQgaW4gYXMgYSBjb21waWxlIGZsYWcgZnJvbSBBbmRyb2lkLmJwCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gQ09ERUNOQU1FOworCitjbGFzcyBDMlNvZnRBb21EZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiBoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICBoZWxwZXIsIENPTVBPTkVOVF9OQU1FLCBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQorICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIGFkZFBhcmFtZXRlcihEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQzJDb25maWc6OkxFVkVMX0FWMV8yXzEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMX0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVYxXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8yXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8yXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfM18xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfM18yLAorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgbUhkcjEwUGx1c0luZm9JbnB1dCA9IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQ6OkFsbG9jU2hhcmVkKDApOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUhkcjEwUGx1c0luZm9JbnB1dCwgQzJfUEFSQU1LRVlfSU5QVVRfSERSMTBfUExVU19JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChtSGRyMTBQbHVzSW5mb0lucHV0KQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1IZHIxMFBsdXNJbmZvSW5wdXQsIG0udmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoSGRyMTBQbHVzSW5mb0lucHV0U2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBtSGRyMTBQbHVzSW5mb091dHB1dCA9IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgwKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1IZHIxMFBsdXNJbmZvT3V0cHV0LCBDMl9QQVJBTUtFWV9PVVRQVVRfSERSMTBfUExVU19JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChtSGRyMTBQbHVzSW5mb091dHB1dCkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtSGRyMTBQbHVzSW5mb091dHB1dCwgbS52YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihIZHIxMFBsdXNJbmZvT3V0cHV0U2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoRGVmaW5lUGFyYW0obU1heFNpemUsIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzMjAgKiAyNDAgKiAzIC8gNCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobU1heElucHV0U2l6ZSwgdmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhJbnB1dFNpemVTZXR0ZXIsIG1NYXhTaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbMV0gPSB7CisgICAgICAgICAgICBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoMXUsIDB1LCA4dSAvKiBiaXREZXB0aCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBtZW1jcHkoZGVmYXVsdENvbG9ySW5mby0+bS5sb2NhdGlvbnMsIGxvY2F0aW9ucywgc2l6ZW9mKGxvY2F0aW9ucykpOworCisgICAgICAgIGRlZmF1bHRDb2xvckluZm8gPSBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgIHtDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpfSwgMHUsIDh1IC8qIGJpdERlcHRoICovLAorICAgICAgICAgICAgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIGhlbHBlci0+YWRkU3RydWN0RGVzY3JpcHRvcnM8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+KCk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKERlZmluZVBhcmFtKG1Db2xvckluZm8sIEMyX1BBUkFNS0VZX0NPREVEX0NPTE9SX0lORk8pCisgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKGRlZmF1bHRDb2xvckluZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRGVmYXVsdENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmb3JtYXRzPworICAgICAgICBhZGRQYXJhbWV0ZXIoRGVmaW5lUGFyYW0obVBpeGVsRm9ybWF0LCBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQpCisgICAgICAgICAgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiYgb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiYgbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhQaWN0dXJlU2l6ZVNldHRlcigKKyAgICAgICAgYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4mIG1lLAorICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4mIHNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIFRPRE86IGdldCBtYXggd2lkdGgvaGVpZ2h0IGZyb20gdGhlIHNpemUncyBmaWVsZCBoZWxwZXJzIHZzLgorICAgICAgICAvLyBoYXJkY29kaW5nCisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCA0MDk2dSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCA0MDk2dSk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBNYXhJbnB1dFNpemVTZXR0ZXIoCisgICAgICAgIGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4mIG1lLAorICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiYgbWF4U2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gYXNzdW1lIGNvbXByZXNzaW9uIHJhdGlvIG9mIDIKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAoKChtYXhTaXplLnYud2lkdGggKyA2MykgLyA2NCkgKgorICAgICAgICAgICAgICAgICAgICAgICAgICAoKG1heFNpemUudi5oZWlnaHQgKyA2MykgLyA2NCkgKiAzMDcyKTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisgICAgc3RhdGljIEMyUiBEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmIChtZS52LnJhbmdlID4gQzJDb2xvcjo6UkFOR0VfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5tYXRyaXggPiBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClzaXplOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBnZXREZWZhdWx0Q29sb3JBc3BlY3RzX2woKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEhkcjEwUGx1c0luZm9JbnB1dFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBIZHIxMFBsdXNJbmZvT3V0cHV0U2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+IG1NYXhTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbU1heElucHV0U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gbUNvbG9ySW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dD4gbUhkcjEwUGx1c0luZm9JbnB1dDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ+IG1IZHIxMFBsdXNJbmZvT3V0cHV0OworfTsKKworQzJTb2Z0QW9tRGVjOjpDMlNvZnRBb21EZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUNvZGVjQ3R4KG51bGxwdHIpeworCisgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOworICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtT3V0RmlsZSk7CisKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVFbmQsIG51bGxwdHIpOworfQorCitDMlNvZnRBb21EZWM6On5DMlNvZnRBb21EZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFvbURlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBb21EZWM6Om9uU3RvcCgpIHsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEFvbURlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBvbkZsdXNoX3NtKCk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGZsdXNoIGRlY29kZXIuIFRyeSB0byBoYXJkIHJlc2V0IGRlY29kZXIuIik7CisgICAgICAgIGRlc3Ryb3lEZWNvZGVyKCk7CisgICAgICAgICh2b2lkKWluaXREZWNvZGVyKCk7CisgICAgfQorfQorCit2b2lkIEMyU29mdEFvbURlYzo6b25SZWxlYXNlKCkgeworICAgIGRlc3Ryb3lEZWNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEFvbURlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAoYW9tX2NvZGVjX2RlY29kZShtQ29kZWNDdHgsIG51bGxwdHIsIDAsIG51bGxwdHIpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmx1c2ggYXYxIGRlY29kZXIuIik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgYW9tX2NvZGVjX2l0ZXJfdCBpdGVyID0gbnVsbHB0cjsKKyAgICB3aGlsZSAoYW9tX2NvZGVjX2dldF9mcmFtZShtQ29kZWNDdHgsICZpdGVyKSkgeworICAgIH0KKworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdGljIGludCBHZXRDUFVDb3JlQ291bnQoKSB7CisgICAgaW50IGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gY3B1Q29yZUNvdW50OworfQorCitzdGF0dXNfdCBDMlNvZnRBb21EZWM6OmluaXREZWNvZGVyKCkgeworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBpZiAoIW1Db2RlY0N0eCkgeworICAgICAgICBtQ29kZWNDdHggPSBuZXcgYW9tX2NvZGVjX2N0eF90OworICAgIH0KKworICAgIGlmICghbUNvZGVjQ3R4KSB7CisgICAgICAgIEFMT0dFKCJtQ29kZWNDdHggaXMgbnVsbCIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIGFvbV9jb2RlY19kZWNfY2ZnX3QgY2ZnOworICAgIG1lbXNldCgmY2ZnLCAwLCBzaXplb2YoYW9tX2NvZGVjX2RlY19jZmdfdCkpOworICAgIGNmZy50aHJlYWRzID0gR2V0Q1BVQ29yZUNvdW50KCk7CisgICAgY2ZnLmFsbG93X2xvd2JpdGRlcHRoID0gMTsKKworICAgIGFvbV9jb2RlY19mbGFnc190IGZsYWdzOworICAgIG1lbXNldCgmZmxhZ3MsIDAsIHNpemVvZihhb21fY29kZWNfZmxhZ3NfdCkpOworCisgICAgQUxPR1YoIlVzaW5nIGxpYmFvbSBBVjEgc29mdHdhcmUgZGVjb2Rlci4iKTsKKyAgICBhb21fY29kZWNfZXJyX3QgZXJyOworICAgIGlmICgoZXJyID0gYW9tX2NvZGVjX2RlY19pbml0KG1Db2RlY0N0eCwgYW9tX2NvZGVjX2F2MV9keCgpLCAmY2ZnLCAwKSkpIHsKKyAgICAgICAgQUxPR0UoImF2MSBkZWNvZGVyIGZhaWxlZCB0byBpbml0aWFsaXplLiAoJWQpIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRBb21EZWM6OmRlc3Ryb3lEZWNvZGVyKCkgeworICAgIGlmIChtQ29kZWNDdHgpIHsKKyAgICAgICAgYW9tX2NvZGVjX2Rlc3Ryb3kobUNvZGVjQ3R4KTsKKyAgICAgICAgZGVsZXRlIG1Db2RlY0N0eDsKKyAgICAgICAgbUNvZGVjQ3R4ID0gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0QW9tRGVjOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+JiBibG9jaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgY3JlYXRlR3JhcGhpY0J1ZmZlcihibG9jaywgQzJSZWN0KG1XaWR0aCwgbUhlaWdodCkpOworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyLCBpbmRleCwgaW50ZiA9IHRoaXMtPm1JbnRmXSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKSB7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgaWYgKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICYmCisgICAgICAgICAgICAoYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtOiB3b3JrLT5pbnB1dC5jb25maWdVcGRhdGUpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbSkgeworICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQgKmhkcjEwUGx1c0luZm8gPQorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dDo6RnJvbShwYXJhbS5nZXQoKSk7CisKKyAgICAgICAgICAgICAgICBpZiAoaGRyMTBQbHVzSW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IG91dFBhcmFtID0gQzJQYXJhbTo6Q29weUFzU3RyZWFtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwYXJhbS5nZXQoKSwgdHJ1ZSAvKm91dHB1dCovLCBwYXJhbS0+c3RyZWFtKCkpOworICAgICAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBpbnRmLT5jb25maWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBvdXRQYXJhbS5nZXQoKSB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KCpvdXRQYXJhbS5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZpbmlzaFdvcms6IENvbmZpZyB1cGRhdGUgc2l6ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCit2b2lkIEMyU29mdEFvbURlYzo6cHJvY2Vzcyhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIHsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9CisgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgY29kZWNDb25maWcgPQorICAgICAgICAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwKTsKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisKKyAgICBpZiAoY29kZWNDb25maWcpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDY0X3QgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrbGwoKTsKKyAgICBpZiAoaW5TaXplKSB7CisgICAgICAgIHVpbnQ4X3QqIGJpdHN0cmVhbSA9IGNvbnN0X2Nhc3Q8dWludDhfdCo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICAgICAgaW50MzJfdCBkZWNvZGVUaW1lID0gMDsKKyAgICAgICAgaW50MzJfdCBkZWxheSA9IDA7CisKKyAgICAgICAgRFVNUF9UT19GSUxFKG1PdXRGaWxlLCBiaXRzdHJlYW0sIGluU2l6ZSk7CisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIGRlbGF5KTsKKworICAgICAgICBhb21fY29kZWNfZXJyX3QgZXJyID0KKyAgICAgICAgICAgIGFvbV9jb2RlY19kZWNvZGUobUNvZGVjQ3R4LCBiaXRzdHJlYW0sIGluU2l6ZSwgJmZyYW1lSW5kZXgpOworCisgICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICAgICAgVElNRV9ESUZGKG1UaW1lU3RhcnQsIG1UaW1lRW5kLCBkZWNvZGVUaW1lKTsKKyAgICAgICAgQUxPR1YoImRlY29kZVRpbWU9JTRkIGRlbGF5PSU0ZFxuIiwgZGVjb2RlVGltZSwgZGVsYXkpOworCisgICAgICAgIGlmIChlcnIgIT0gQU9NX0NPREVDX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiYXYxIGRlY29kZXIgZmFpbGVkIHRvIGRlY29kZSBmcmFtZSBlcnI6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoYW9tX2NvZGVjX2RlY29kZShtQ29kZWNDdHgsIG51bGxwdHIsIDAsIG51bGxwdHIpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGZsdXNoIGF2MSBkZWNvZGVyLiIpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAodm9pZClvdXRwdXRCdWZmZXIocG9vbCwgd29yayk7CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghaW5TaXplKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKKyAgICAgICAgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgdWludDhfdCogZHN0U3RhcnQgPSBkc3Q7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7CisgICAgICAgIG1lbWNweShkc3QsIHNyY1ksIHdpZHRoKTsKKyAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZTsKKyAgICB9CisKKyAgICBkc3QgPSBkc3RTdGFydCArIGRzdFlTdHJpZGUgKiBoZWlnaHQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1YsIHdpZHRoIC8gMik7CisgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KKworICAgIGRzdCA9IGRzdFN0YXJ0ICsgKGRzdFlTdHJpZGUgKiBoZWlnaHQpICsgKGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1UsIHdpZHRoIC8gMik7CisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKHVpbnQzMl90ICpkc3QsCisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgeworCisgICAgLy8gQ29udmVydGluZyB0d28gbGluZXMgYXQgYSB0aW1lLCBzbGlnaHRseSBmYXN0ZXIKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgeSArPSAyKSB7CisgICAgICAgIHVpbnQzMl90ICpkc3RUb3AgPSAodWludDMyX3QgKikgZHN0OworICAgICAgICB1aW50MzJfdCAqZHN0Qm90ID0gKHVpbnQzMl90ICopIChkc3QgKyBkc3RTdHJpZGUpOworICAgICAgICB1aW50MTZfdCAqeVNyY1RvcCA9ICh1aW50MTZfdCopIHNyY1k7CisgICAgICAgIHVpbnQxNl90ICp5U3JjQm90ID0gKHVpbnQxNl90KikgKHNyY1kgKyBzcmNZU3RyaWRlKTsKKyAgICAgICAgdWludDE2X3QgKnVTcmMgPSAodWludDE2X3QqKSBzcmNVOworICAgICAgICB1aW50MTZfdCAqdlNyYyA9ICh1aW50MTZfdCopIHNyY1Y7CisKKyAgICAgICAgdWludDMyX3QgdTAxLCB2MDEsIHkwMSwgeTIzLCB5NDUsIHk2NywgdXYwLCB1djE7CisgICAgICAgIHNpemVfdCB4ID0gMDsKKyAgICAgICAgZm9yICg7IHggPCB3aWR0aCAtIDM7IHggKz0gNCkgeworCisgICAgICAgICAgICB1MDEgPSAqKCh1aW50MzJfdCopdVNyYyk7IHVTcmMgKz0gMjsKKyAgICAgICAgICAgIHYwMSA9ICooKHVpbnQzMl90Kil2U3JjKTsgdlNyYyArPSAyOworCisgICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7IHlTcmNUb3AgKz0gMjsKKyAgICAgICAgICAgIHkyMyA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsgeVNyY1RvcCArPSAyOworICAgICAgICAgICAgeTQ1ID0gKigodWludDMyX3QqKXlTcmNCb3QpOyB5U3JjQm90ICs9IDI7CisgICAgICAgICAgICB5NjcgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7IHlTcmNCb3QgKz0gMjsKKworICAgICAgICAgICAgdXYwID0gKHUwMSAmIDB4M0ZGKSB8ICgodjAxICYgMHgzRkYpIDw8IDIwKTsKKyAgICAgICAgICAgIHV2MSA9ICh1MDEgPj4gMTYpIHwgKCh2MDEgPj4gMTYpIDw8IDIwKTsKKworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdFRvcCsrID0gMyA8PCAzMCB8ICgoeTIzICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyA+PiAxNikgPDwgMTApIHwgdXYxOworCisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0Qm90KysgPSAzIDw8IDMwIHwgKCh5NjcgJiAweDNGRikgPDwgMTApIHwgdXYxOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ID4+IDE2KSA8PCAxMCkgfCB1djE7CisgICAgICAgIH0KKworICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgYXQgbW9zdCAyIG1vcmUgcGl4ZWxzIHRvIHByb2Nlc3MuIE5vdGUgdGhhdCB3ZSBkb24ndAorICAgICAgICAvLyBuZWVkIHRvIGNvbnNpZGVyIG9kZCBjYXNlIGFzIHRoZSBidWZmZXIgaXMgYWx3YXlzIGFsaWduZWQgdG8gZXZlbi4KKyAgICAgICAgaWYgKHggPCB3aWR0aCkgeworICAgICAgICAgICAgdTAxID0gKnVTcmM7CisgICAgICAgICAgICB2MDEgPSAqdlNyYzsKKyAgICAgICAgICAgIHkwMSA9ICooKHVpbnQzMl90Kil5U3JjVG9wKTsKKyAgICAgICAgICAgIHk0NSA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAoKHkwMSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gKCh5NDUgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZSAqIDI7CisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3QgKz0gZHN0U3RyaWRlICogMjsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKHVpbnQ4X3QgKmRzdCwKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1ksIGNvbnN0IHVpbnQxNl90ICpzcmNVLCBjb25zdCB1aW50MTZfdCAqc3JjViwKKyAgICAgICAgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLCBzaXplX3Qgc3JjVlN0cmlkZSwKKyAgICAgICAgc2l6ZV90IGRzdFlTdHJpZGUsIHNpemVfdCBkc3RVVlN0cmlkZSwgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0KSB7CisKKyAgICB1aW50OF90ICpkc3RZID0gKHVpbnQ4X3QgKilkc3Q7CisgICAgc2l6ZV90IGRzdFlTaXplID0gZHN0WVN0cmlkZSAqIGhlaWdodDsKKyAgICBzaXplX3QgZHN0VVZTaXplID0gZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyOworICAgIHVpbnQ4X3QgKmRzdFYgPSBkc3RZICsgZHN0WVNpemU7CisgICAgdWludDhfdCAqZHN0VSA9IGRzdFYgKyBkc3RVVlNpemU7CisKKyAgICBmb3IgKHNpemVfdCB5ID0gMDsgeSA8IGhlaWdodDsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgICAgICAgZHN0WVt4XSA9ICh1aW50OF90KShzcmNZW3hdID4+IDIpOworICAgICAgICB9CisKKyAgICAgICAgc3JjWSArPSBzcmNZU3RyaWRlOworICAgICAgICBkc3RZICs9IGRzdFlTdHJpZGU7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCAoaGVpZ2h0ICsgMSkgLyAyOyArK3kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCAod2lkdGggKyAxKSAvIDI7ICsreCkgeworICAgICAgICAgICAgZHN0VVt4XSA9ICh1aW50OF90KShzcmNVW3hdID4+IDIpOworICAgICAgICAgICAgZHN0Vlt4XSA9ICh1aW50OF90KShzcmNWW3hdID4+IDIpOworICAgICAgICB9CisKKyAgICAgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgICAgIGRzdFUgKz0gZHN0VVZTdHJpZGU7CisgICAgICAgIGRzdFYgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorICAgIHJldHVybjsKK30KK2Jvb2wgQzJTb2Z0QW9tRGVjOjpvdXRwdXRCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKQoreworICAgIGlmICghKHdvcmsgJiYgcG9vbCkpIHJldHVybiBmYWxzZTsKKworICAgIGFvbV9jb2RlY19pdGVyX3QgaXRlciA9IG51bGxwdHI7CisgICAgYW9tX2ltYWdlX3QqIGltZyA9IGFvbV9jb2RlY19nZXRfZnJhbWUobUNvZGVjQ3R4LCAmaXRlcik7CisKKyAgICBpZiAoIWltZykgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGltZy0+ZF93ICE9IG1XaWR0aCB8fCBpbWctPmRfaCAhPSBtSGVpZ2h0KSB7CisgICAgICAgIG1XaWR0aCA9IGltZy0+ZF93OworICAgICAgICBtSGVpZ2h0ID0gaW1nLT5kX2g7CisKKyAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb25maWcgdXBkYXRlIHNpemUgZmFpbGVkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIENIRUNLKGltZy0+Zm10ID09IEFPTV9JTUdfRk1UX0k0MjAgfHwgaW1nLT5mbXQgPT0gQU9NX0lNR19GTVRfSTQyMDE2KTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgIGlmIChpbWctPmZtdCA9PSBBT01fSU1HX0ZNVF9JNDIwMTYpIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JBc3BlY3RzID0gbUludGYtPmdldERlZmF1bHRDb2xvckFzcGVjdHNfbCgpOworCisgICAgICAgIGlmIChkZWZhdWx0Q29sb3JBc3BlY3RzLT5wcmltYXJpZXMgPT0gQzJDb2xvcjo6UFJJTUFSSUVTX0JUMjAyMCAmJgorICAgICAgICAgICAgZGVmYXVsdENvbG9yQXNwZWN0cy0+bWF0cml4ID09IEMyQ29sb3I6Ok1BVFJJWF9CVDIwMjAgJiYKKyAgICAgICAgICAgIGRlZmF1bHRDb2xvckFzcGVjdHMtPnRyYW5zZmVyID09IEMyQ29sb3I6OlRSQU5TRkVSX1NUMjA4NCkgeworICAgICAgICAgICAgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDI7CisgICAgICAgIH0KKyAgICB9CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfTsKKworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKGFsaWduKG1XaWR0aCwgMTYpLCBtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgdXNhZ2UsICZibG9jayk7CisKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUxPR1YoInByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCVkeCVkKSwgb3V0IGZyYW1laW5kZXggJWQiLAorICAgICAgICAgIGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCksIG1XaWR0aCwgbUhlaWdodCwKKyAgICAgICAgICAoaW50KSooaW50NjRfdCopaW1nLT51c2VyX3ByaXYpOworCisgICAgdWludDhfdCogZHN0ID0gY29uc3RfY2FzdDx1aW50OF90Kj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBpbWctPnN0cmlkZVtBT01fUExBTkVfWV07CisgICAgc2l6ZV90IHNyY1VTdHJpZGUgPSBpbWctPnN0cmlkZVtBT01fUExBTkVfVV07CisgICAgc2l6ZV90IHNyY1ZTdHJpZGUgPSBpbWctPnN0cmlkZVtBT01fUExBTkVfVl07CisgICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0ID0gd1ZpZXcubGF5b3V0KCk7CisgICAgc2l6ZV90IGRzdFlTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXS5yb3dJbmM7CisgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm93SW5jOworCisgICAgaWYgKGltZy0+Zm10ID09IEFPTV9JTUdfRk1UX0k0MjAxNikgeworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSA9IChjb25zdCB1aW50MTZfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9ZXTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1UgPSAoY29uc3QgdWludDE2X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfVV07CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNWID0gKGNvbnN0IHVpbnQxNl90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1ZdOworCisgICAgICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDIpIHsKKyAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCgodWludDMyX3QgKilkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVVN0cmlkZSAvIDIsIHNyY1ZTdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0WVN0cmlkZSAvIHNpemVvZih1aW50MzJfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZVVY0MjBQbGFuYXIoZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW0FPTV9QTEFORV9ZXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbQU9NX1BMQU5FX1VdOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNWID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tBT01fUExBTkVfVl07CisgICAgICAgIGNvcHlPdXRwdXRCdWZmZXJUb1l1dlBsYW5hckZyYW1lKAorICAgICAgICAgICAgICAgIGRzdCwgc3JjWSwgc3JjVSwgc3JjViwKKyAgICAgICAgICAgICAgICBzcmNZU3RyaWRlLCBzcmNVU3RyaWRlLCBzcmNWU3RyaWRlLAorICAgICAgICAgICAgICAgIGRzdFlTdHJpZGUsIGRzdFVWU3RyaWRlLAorICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgfQorICAgIGZpbmlzaFdvcmsoKihpbnQ2NF90KilpbWctPnVzZXJfcHJpdiwgd29yaywgc3RkOjptb3ZlKGJsb2NrKSk7CisgICAgYmxvY2sgPSBudWxscHRyOworICAgIHJldHVybiB0cnVlOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBb21EZWM6OmRyYWluSW50ZXJuYWwoCisgICAgdWludDMyX3QgZHJhaW5Nb2RlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sLAorICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGlmIChhb21fY29kZWNfZGVjb2RlKG1Db2RlY0N0eCwgbnVsbHB0ciwgMCwgbnVsbHB0cikpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmbHVzaCBhdjEgZGVjb2Rlci4iKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICB3aGlsZSAoKG91dHB1dEJ1ZmZlcihwb29sLCB3b3JrKSkpIHsKKyAgICB9CisKKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUyAmJiB3b3JrICYmCisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID09IDB1KSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBb21EZWM6OmRyYWluKHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2NsYXNzIEMyU29mdEFvbUZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKKyAgIHB1YmxpYzoKKyAgICBDMlNvZnRBb21GYWN0b3J5KCkKKyAgICAgICAgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdEFvbURlYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QW9tRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRBb21EZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBb21EZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEFvbUZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEFvbUZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0MyU29mdEFvbURlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjODI2NDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hb20vQzJTb2Z0QW9tRGVjLmgKQEAgLTAsMCArMSwxMzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9BVjFfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9BVjFfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgImFvbS9hb21fZGVjb2Rlci5oIgorI2luY2x1ZGUgImFvbS9hb21keC5oIgorCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgZ2V0dGltZW9mZGF5KGEsIGIpOworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0QW9tRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEFvbURlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRBb21EZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSBvdmVycmlkZTsKKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGFvbV9jb2RlY19jdHhfdCogbUNvZGVjQ3R4OworCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworCisgICAgI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICBjaGFyIG1JbkZpbGVbMjAwXTsKKyAgICBjaGFyIG1PdXRGaWxlWzIwMF07CisgICAgI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7ICAgLy8gVGltZSBhdCB0aGUgc3RhcnQgb2YgZGVjb2RlKCkKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZUVuZDsgICAgIC8vIFRpbWUgYXQgdGhlIGVuZCBvZiBkZWNvZGUoKQorCisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBkZXN0cm95RGVjb2RlcigpOworICAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4mIGJsb2NrKTsKKyAgICBib29sIG91dHB1dEJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKTsKKworICAgIGMyX3N0YXR1c190IGRyYWluSW50ZXJuYWwodWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEFvbURlYyk7Cit9OworCisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorCisjZGVmaW5lIElOUFVUX0RVTVBfUEFUSCAiL2RhdGEvbG9jYWwvdG1wL3RlbXAvYXYxIgorI2RlZmluZSBJTlBVVF9EVU1QX0VYVCAid2VibSIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSCAiL2RhdGEvbG9jYWwvdG1wL3RlbXAvYXYxIgorI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQgImF2MSIKKyNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RyY3B5KG1JbkZpbGUsICIiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkdFTkVSQVRFX0ZJTEVfTkFNRVMiKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJWxkLiVsZC4lcyIsIElOUFVUX0RVTVBfUEFUSCwgbVRpbWVTdGFydC50dl9zZWMsIFwKKyAgICAgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3VzZWMsIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RyY3B5KG1PdXRGaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3ByaW50ZihtT3V0RmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBPVVRQVVRfRFVNUF9QQVRILCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCBPVVRQVVRfRFVNUF9FWFQpOyAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRklMRSogZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAid2IiKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJPcGVuZWQgZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyAgICAgICAgIFwKKyAgICAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgb3BlbiBmaWxlICVzIiwgbV9maWxlbmFtZSk7IFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKSAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRklMRSogZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAiYWIiKTsgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCAhPSBOVUxMICYmIG1fYnVmICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJEdW1wIHRvIGZpbGUhIik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpID0gZndyaXRlKG1fYnVmLCAxLCBtX3NpemUsIGZwKTsgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKGkgIT0gKGludCltX3NpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBTE9HRCgiRXJyb3IgaW4gZndyaXRlLCByZXR1cm5lZCAlZCIsIGkpOyAgICBcCisgICAgICAgICAgICAgICAgcGVycm9yKCJFcnJvciBpbiB3cml0ZSB0byBmaWxlIik7ICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICVzIiwgbV9maWxlbmFtZSk7IFwKKyAgICAgICAgICAgIGlmIChmcCAhPSBOVUxMKSBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKyNkZWZpbmUgSU5QVVRfRFVNUF9QQVRICisjZGVmaW5lIElOUFVUX0RVTVBfRVhUCisjZGVmaW5lIE9VVFBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUCisjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKQorI2RlZmluZSBDUkVBVEVfRFVNUF9GSUxFKG1fZmlsZW5hbWUpCisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKQorI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfQVYxX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDIxNDQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzNyBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9hdmNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYmF2Y2RlYyJdLAorCisgICAgc3JjczogWyJDMlNvZnRBdmNEZWMuY3BwIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImV4dGVybmFsL2xpYmF2Yy9kZWNvZGVyIiwKKyAgICAgICAgImV4dGVybmFsL2xpYmF2Yy9jb21tb24iLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYXZjZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJhdmNlbmMiXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0QXZjRW5jLmNwcCJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9saWJhdmMvZW5jb2RlciIsCisgICAgICAgICJleHRlcm5hbC9saWJhdmMvY29tbW9uIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLXVudXNlZC12YXJpYWJsZSIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFlMDY3NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNEZWMuY3BwCkBAIC0wLDAgKzEsMTA0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRBdmNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMk1hcHBlci5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRBdmNEZWMuaCIKKyNpbmNsdWRlICJpaDI2NGQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiOworY29uc3RleHByIHVpbnQzMl90IGtEZWZhdWx0T3V0cHV0RGVsYXkgPSA4OworY29uc3RleHByIHVpbnQzMl90IGtNYXhPdXRwdXREZWxheSA9IDE2OworY29uc3RleHByIHVpbnQzMl90IGtNaW5JbnB1dEJ5dGVzID0gNDsKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBDMlNvZnRBdmNEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQykgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7IC8vIFRPRE86IGFjY291bnQgZm9yIG91ciBidWZmZXJzIGhlcmUKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICAvLyBUT0RPOiBQcm9wZXIgc3VwcG9ydCBmb3IgcmVvcmRlciBkZXB0aC4KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxPdXRwdXREZWxheSwgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dChrRGVmYXVsdE91dHB1dERlbGF5KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1BY3R1YWxPdXRwdXREZWxheSwgdmFsdWUpLmluUmFuZ2UoMCwga01heE91dHB1dERlbGF5KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQWN0dWFsT3V0cHV0RGVsYXkpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUT0RPOiBvdXRwdXQgbGF0ZW5jeSBhbmQgcmVvcmRlcmluZworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIGNvZGVkIGFuZCBvdXRwdXQgcGljdHVyZSBzaXplIGlzIHRoZSBzYW1lIGZvciB0aGlzIGNvZGVjCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCA0MDgwLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgNDA4MCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFNpemUsIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgNDA4MCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDQwODAsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkUsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNV8yKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0JBU0VMSU5FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19CQVNFTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTUFJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ09OU1RSQUlORURfSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfUFJPR1JFU1NJVkVfSElHSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSH0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzEsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMUIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8yLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMl8xLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzJfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzMsIEMyQ29uZmlnOjpMRVZFTF9BVkNfM18xLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzNfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzQsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNF8xLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzRfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVZDXzUsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNV8xLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzVfMgorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzMjAgKiAyNDAgKiAzIC8gNCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobU1heElucHV0U2l6ZSwgdmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhJbnB1dFNpemVTZXR0ZXIsIG1NYXhTaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbMV0gPSB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIDF1LCAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBtZW1jcHkoZGVmYXVsdENvbG9ySW5mby0+bS5sb2NhdGlvbnMsIGxvY2F0aW9ucywgc2l6ZW9mKGxvY2F0aW9ucykpOworCisgICAgICAgIGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9LAorICAgICAgICAgICAgICAgICAgICAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBoZWxwZXItPmFkZFN0cnVjdERlc2NyaXB0b3JzPEMyQ2hyb21hT2Zmc2V0U3RydWN0PigpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29sb3JJbmZvLCBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShkZWZhdWx0Q29sb3JJbmZvKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURlZmF1bHRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0RFRkFVTFRfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCAgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihEZWZhdWx0Q29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvZGVkQ29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb2xvcjo6UkFOR0VfTElNSVRFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHByaW1hcmllcykuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2RlZENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCAgICAgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBtYXRyaXgpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCwgICAgQzJDb2xvcjo6TUFUUklYX09USEVSKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQ29sb3JBc3BlY3RzU2V0dGVyLCBtRGVmYXVsdENvbG9yQXNwZWN0cywgbUNvZGVkQ29sb3JBc3BlY3RzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgZm9ybWF0cz8KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1QaXhlbEZvcm1hdCwgQzJfUEFSQU1LRVlfUElYRUxfRk9STUFUKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4UGljdHVyZVNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBUT0RPOiBnZXQgbWF4IHdpZHRoL2hlaWdodCBmcm9tIHRoZSBzaXplJ3MgZmllbGQgaGVscGVycyB2cy4gaGFyZGNvZGluZworICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgNDA4MHUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgNDA4MHUpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMgorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDE1KSAvIDE2KSAqICgobWF4U2l6ZS52LmhlaWdodCArIDE1KSAvIDE2KSAqIDE5Mik7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXNpemU7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmY29kZWQpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIHRha2UgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCB1bnNwZWNpZmllZCBmaWVsZHMsIGFuZCBjb2RlZCB2YWx1ZXMgZm9yIHNwZWNpZmllZCBvbmVzCisgICAgICAgIG1lLnNldCgpLnJhbmdlID0gY29kZWQudi5yYW5nZSA9PSBSQU5HRV9VTlNQRUNJRklFRCA/IGRlZi52LnJhbmdlIDogY29kZWQudi5yYW5nZTsKKyAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gY29kZWQudi5wcmltYXJpZXMgPT0gUFJJTUFSSUVTX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi5wcmltYXJpZXMgOiBjb2RlZC52LnByaW1hcmllczsKKyAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBjb2RlZC52LnRyYW5zZmVyID09IFRSQU5TRkVSX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi50cmFuc2ZlciA6IGNvZGVkLnYudHJhbnNmZXI7CisgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IGNvZGVkLnYubWF0cml4ID09IE1BVFJJWF9VTlNQRUNJRklFRCA/IGRlZi52Lm1hdHJpeCA6IGNvZGVkLnYubWF0cml4OworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gZ2V0Q29sb3JBc3BlY3RzX2woKSB7CisgICAgICAgIHJldHVybiBtQ29sb3JBc3BlY3RzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gbU1heFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtTWF4SW5wdXRTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBtQ29sb3JJbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiBtQ29kZWRDb2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IG1EZWZhdWx0Q29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gbUNvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0OworfTsKKworc3RhdGljIHNpemVfdCBnZXRDcHVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKworc3RhdGljIHZvaWQgKml2ZF9hbGlnbmVkX21hbGxvYyh2b2lkICpjdHh0LCBXT1JEMzIgYWxpZ25tZW50LCBXT1JEMzIgc2l6ZSkgeworICAgICh2b2lkKSBjdHh0OworICAgIHJldHVybiBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpOworfQorCitzdGF0aWMgdm9pZCBpdmRfYWxpZ25lZF9mcmVlKHZvaWQgKmN0eHQsIHZvaWQgKm1lbSkgeworICAgICh2b2lkKSBjdHh0OworICAgIGZyZWUobWVtKTsKK30KKworQzJTb2Z0QXZjRGVjOjpDMlNvZnRBdmNEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbURlY0hhbmRsZShudWxscHRyKSwKKyAgICAgIG1PdXRCdWZmZXJGbHVzaChudWxscHRyKSwKKyAgICAgIG1JdkNvbG9yRm9ybWF0KElWX1lVVl80MjBQKSwKKyAgICAgIG1PdXRwdXREZWxheShrRGVmYXVsdE91dHB1dERlbGF5KSwKKyAgICAgIG1XaWR0aCgzMjApLAorICAgICAgbUhlaWdodCgyNDApLAorICAgICAgbUhlYWRlckRlY29kZWQoZmFsc2UpLAorICAgICAgbU91dEluZGV4KDB1KSB7CisgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOworICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7Cit9CisKK0MyU29mdEF2Y0RlYzo6fkMyU29mdEF2Y0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlYzo6b25TdG9wKCkgeworICAgIGlmIChPSyAhPSByZXNldERlY29kZXIoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICByZXNldFBsdWdpbigpOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBdmNEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpIG9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEF2Y0RlYzo6b25SZWxlYXNlKCkgeworICAgICh2b2lkKSBkZWxldGVEZWNvZGVyKCk7CisgICAgaWYgKG1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG51bGxwdHIsIG1PdXRCdWZmZXJGbHVzaCk7CisgICAgICAgIG1PdXRCdWZmZXJGbHVzaCA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2spIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKE9LICE9IHNldEZsdXNoTW9kZSgpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IG1TdHJpZGUgKiBtSGVpZ2h0ICogMyAvIDI7CisgICAgbU91dEJ1ZmZlckZsdXNoID0gKHVpbnQ4X3QgKilpdmRfYWxpZ25lZF9tYWxsb2MobnVsbHB0ciwgMTI4LCBidWZmZXJTaXplKTsKKyAgICBpZiAoIW1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBBTE9HRSgiY291bGQgbm90IGFsbG9jYXRlIHRtcCBvdXRwdXQgYnVmZmVyIChmb3IgZmx1c2gpIG9mIHNpemUgJXUgIiwgYnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgfQorCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisKKyAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgMCwgMCk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoMCA9PSBzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1PdXRCdWZmZXJGbHVzaCkgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG51bGxwdHIsIG1PdXRCdWZmZXJGbHVzaCk7CisgICAgICAgIG1PdXRCdWZmZXJGbHVzaCA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmNyZWF0ZURlY29kZXIoKSB7CisgICAgaXZkZXh0X2NyZWF0ZV9pcF90IHNfY3JlYXRlX2lwOworICAgIGl2ZGV4dF9jcmVhdGVfb3BfdCBzX2NyZWF0ZV9vcDsKKworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2NyZWF0ZV9pcF90KTsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5lX2NtZCA9IElWRF9DTURfQ1JFQVRFOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5lX291dHB1dF9mb3JtYXQgPSBtSXZDb2xvckZvcm1hdDsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5wZl9hbGlnbmVkX2FsbG9jID0gaXZkX2FsaWduZWRfbWFsbG9jOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnBmX2FsaWduZWRfZnJlZSA9IGl2ZF9hbGlnbmVkX2ZyZWU7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QucHZfbWVtX2N0eHQgPSBudWxscHRyOworICAgIHNfY3JlYXRlX29wLnNfaXZkX2NyZWF0ZV9vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2NyZWF0ZV9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfY3JlYXRlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19jcmVhdGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19jcmVhdGVfb3Auc19pdmRfY3JlYXRlX29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtRGVjSGFuZGxlID0gKGl2X29ial90KilzX2NyZWF0ZV9vcC5zX2l2ZF9jcmVhdGVfb3BfdC5wdl9oYW5kbGU7CisgICAgbURlY0hhbmRsZS0+cHZfZnhucyA9ICh2b2lkICopaXZkZWNfYXBpX2Z1bmN0aW9uOworICAgIG1EZWNIYW5kbGUtPnU0X3NpemUgPSBzaXplb2YoaXZfb2JqX3QpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OnNldE51bUNvcmVzKCkgeworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90IHNfc2V0X251bV9jb3Jlc19pcDsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCBzX3NldF9udW1fY29yZXNfb3A7CisKKyAgICBzX3NldF9udW1fY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLmVfc3ViX2NtZCA9IElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVM7CisgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X251bV9jb3JlcyA9IG1OdW1Db3JlczsKKyAgICBzX3NldF9udW1fY29yZXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9udW1fY29yZXNfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfbnVtX2NvcmVzX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEF2Y0RlYzo6c2V0UGFyYW1zKHNpemVfdCBzdHJpZGUsIElWRF9WSURFT19ERUNPREVfTU9ERV9UIGRlY19tb2RlKSB7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX2lwX3Qgc19zZXRfZHluX3BhcmFtc19pcDsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfb3BfdCBzX3NldF9keW5fcGFyYW1zX29wOworCisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9TRVRQQVJBTVM7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9kaXNwX3dkID0gKFVXT1JEMzIpIHN0cmlkZTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX3NraXBfbW9kZSA9IElWRF9TS0lQX05PTkU7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2ZybV9vdXRfbW9kZSA9IElWRF9ESVNQTEFZX0ZSQU1FX09VVDsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfdmlkX2RlY19tb2RlID0gZGVjX21vZGU7CisgICAgc19zZXRfZHluX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9keW5fcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2R5bl9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDMlNvZnRBdmNEZWM6OmdldFZlcnNpb24oKSB7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfZ2V0X3ZlcnNpb25pbmZvX2lwOworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCBzX2dldF92ZXJzaW9uaW5mb19vcDsKKyAgICBVV09SRDggYXUxX2J1Zls1MTJdOworCisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3QpOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfR0VUVkVSU0lPTjsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlciA9IGF1MV9idWY7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAudTRfdmVyc2lvbl9idWZmZXJfc2l6ZSA9IHNpemVvZihhdTFfYnVmKTsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92ZXJzaW9uaW5mb19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3ZlcnNpb25pbmZvX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgIHNfZ2V0X3ZlcnNpb25pbmZvX29wLnU0X2Vycm9yX2NvZGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJpdHRpYW0gZGVjb2RlciB2ZXJzaW9uIG51bWJlcjogJXMiLAorICAgICAgICAgICAgICAoY2hhciAqKSBzX2dldF92ZXJzaW9uaW5mb19pcC5wdl92ZXJzaW9uX2J1ZmZlcik7CisgICAgfQorfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmluaXREZWNvZGVyKCkgeworICAgIGlmIChPSyAhPSBjcmVhdGVEZWNvZGVyKCkpIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIG1OdW1Db3JlcyA9IE1JTihnZXRDcHVDb3JlQ291bnQoKSwgTUFYX05VTV9DT1JFUyk7CisgICAgbVN0cmlkZSA9IEFMSUdOMTI4KG1XaWR0aCk7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAodm9pZCkgc2V0TnVtQ29yZXMoKTsKKyAgICBpZiAoT0sgIT0gc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfRlJBTUUpKSByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAodm9pZCkgZ2V0VmVyc2lvbigpOworCisgICAgcmV0dXJuIE9LOworfQorCitib29sIEMyU29mdEF2Y0RlYzo6c2V0RGVjb2RlQXJncyhpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY29kZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWFkVmlldyAqaW5CdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkdyYXBoaWNWaWV3ICpvdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHNNYXJrZXIpIHsKKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gbVN0cmlkZTsKKyAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gbUhlaWdodDsKKyAgICBzaXplX3QgbHVtYVNpemUgPSBkaXNwbGF5U3RyaWRlICogZGlzcGxheUhlaWdodDsKKyAgICBzaXplX3QgY2hyb21hU2l6ZSA9IGx1bWFTaXplID4+IDI7CisKKyAgICBwc19kZWNvZGVfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9pcF90KTsKKyAgICBwc19kZWNvZGVfaXAtPmVfY21kID0gSVZEX0NNRF9WSURFT19ERUNPREU7CisgICAgaWYgKGluQnVmZmVyKSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfdHMgPSB0c01hcmtlcjsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGluQnVmZmVyLT5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfbnVtX0J5dGVzID0gaW5TaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfdHMgPSAwOworICAgICAgICBwc19kZWNvZGVfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBudWxscHRyOworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X251bV9CeXRlcyA9IDA7CisgICAgfQorICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMF0gPSBsdW1hU2l6ZTsKKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzFdID0gY2hyb21hU2l6ZTsKKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzJdID0gY2hyb21hU2l6ZTsKKyAgICBpZiAob3V0QnVmZmVyKSB7CisgICAgICAgIGlmIChvdXRCdWZmZXItPndpZHRoKCkgPCBkaXNwbGF5U3RyaWRlIHx8IG91dEJ1ZmZlci0+aGVpZ2h0KCkgPCBkaXNwbGF5SGVpZ2h0KSB7CisgICAgICAgICAgICBBTE9HRSgiT3V0cHV0IGJ1ZmZlciB0b28gc21hbGw6IHByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCV1eCV1KSIsCisgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPndpZHRoKCksIG91dEJ1ZmZlci0+aGVpZ2h0KCksIGRpc3BsYXlTdHJpZGUsIGRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBtT3V0QnVmZmVyRmx1c2g7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gbU91dEJ1ZmZlckZsdXNoICsgbHVtYVNpemU7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gbU91dEJ1ZmZlckZsdXNoICsgbHVtYVNpemUgKyBjaHJvbWFTaXplOworICAgIH0KKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9udW1fYnVmcyA9IDM7CisgICAgcHNfZGVjb2RlX29wLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfb3BfdCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDMlNvZnRBdmNEZWM6OmdldFZ1aVBhcmFtcygpIHsKKyAgICBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3Qgc19nZXRfdnVpX3BhcmFtc19pcDsKKyAgICBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3Qgc19nZXRfdnVpX3BhcmFtc19vcDsKKworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3QpOworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2dldF92dWlfcGFyYW1zX2lwLmVfc3ViX2NtZCA9CisgICAgICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKSBJSDI2NERfQ01EX0NUTF9HRVRfVlVJX1BBUkFNUzsKKyAgICBzX2dldF92dWlfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3Z1aV9wYXJhbXNfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92dWlfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBWdWlDb2xvckFzcGVjdHMgdnVpQ29sb3JBc3BlY3RzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX2NvbG91cl9wcmltYXJpZXM7CisgICAgdnVpQ29sb3JBc3BlY3RzLnRyYW5zZmVyID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV90ZnJfY2hhcnM7CisgICAgdnVpQ29sb3JBc3BlY3RzLmNvZWZmcyA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfbWF0cml4X2NvZWZmczsKKyAgICB2dWlDb2xvckFzcGVjdHMuZnVsbFJhbmdlID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV92aWRlb19mdWxsX3JhbmdlX2ZsYWc7CisKKyAgICAvLyBjb252ZXJ0IHZ1aSBhc3BlY3RzIHRvIEMyIHZhbHVlcyBpZiBjaGFuZ2VkCisgICAgaWYgKCEodnVpQ29sb3JBc3BlY3RzID09IG1CaXRzdHJlYW1Db2xvckFzcGVjdHMpKSB7CisgICAgICAgIG1CaXRzdHJlYW1Db2xvckFzcGVjdHMgPSB2dWlDb2xvckFzcGVjdHM7CisgICAgICAgIENvbG9yQXNwZWN0cyBzZkFzcGVjdHM7CisgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQgY29kZWRBc3BlY3RzID0geyAwdSB9OworICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCisgICAgICAgICAgICAgICAgdnVpQ29sb3JBc3BlY3RzLnByaW1hcmllcywgdnVpQ29sb3JBc3BlY3RzLnRyYW5zZmVyLCB2dWlDb2xvckFzcGVjdHMuY29lZmZzLAorICAgICAgICAgICAgICAgIHZ1aUNvbG9yQXNwZWN0cy5mdWxsUmFuZ2UsIHNmQXNwZWN0cyk7CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVByaW1hcmllcywgJmNvZGVkQXNwZWN0cy5wcmltYXJpZXMpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVJhbmdlLCAmY29kZWRBc3BlY3RzLnJhbmdlKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tTWF0cml4Q29lZmZzLCAmY29kZWRBc3BlY3RzLm1hdHJpeCkpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tVHJhbnNmZXIsICZjb2RlZEFzcGVjdHMudHJhbnNmZXIpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICh2b2lkKW1JbnRmLT5jb25maWcoeyZjb2RlZEFzcGVjdHN9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OnNldEZsdXNoTW9kZSgpIHsKKyAgICBpdmRfY3RsX2ZsdXNoX2lwX3Qgc19zZXRfZmx1c2hfaXA7CisgICAgaXZkX2N0bF9mbHVzaF9vcF90IHNfc2V0X2ZsdXNoX29wOworCisgICAgc19zZXRfZmx1c2hfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX2lwX3QpOworICAgIHNfc2V0X2ZsdXNoX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfZmx1c2hfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfRkxVU0g7CisgICAgc19zZXRfZmx1c2hfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZmx1c2hfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9mbHVzaF9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9mbHVzaF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRBdmNEZWM6OnJlc2V0RGVjb2RlcigpIHsKKyAgICBpdmRfY3RsX3Jlc2V0X2lwX3Qgc19yZXNldF9pcDsKKyAgICBpdmRfY3RsX3Jlc2V0X29wX3Qgc19yZXNldF9vcDsKKworICAgIHNfcmVzZXRfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X2lwX3QpOworICAgIHNfcmVzZXRfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3Jlc2V0X2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1JFU0VUOworICAgIHNfcmVzZXRfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX3Jlc2V0X29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19yZXNldF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfcmVzZXRfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19yZXNldF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1TdHJpZGUgPSAwOworICAgICh2b2lkKSBzZXROdW1Db3JlcygpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1IZWFkZXJEZWNvZGVkID0gZmFsc2U7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QXZjRGVjOjpyZXNldFBsdWdpbigpIHsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0QXZjRGVjOjpkZWxldGVEZWNvZGVyKCkgeworICAgIGlmIChtRGVjSGFuZGxlKSB7CisgICAgICAgIGl2ZGV4dF9kZWxldGVfaXBfdCBzX2RlbGV0ZV9pcDsKKyAgICAgICAgaXZkZXh0X2RlbGV0ZV9vcF90IHNfZGVsZXRlX29wOworCisgICAgICAgIHNfZGVsZXRlX2lwLnNfaXZkX2RlbGV0ZV9pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2RlbGV0ZV9pcF90KTsKKyAgICAgICAgc19kZWxldGVfaXAuc19pdmRfZGVsZXRlX2lwX3QuZV9jbWQgPSBJVkRfQ01EX0RFTEVURTsKKyAgICAgICAgc19kZWxldGVfb3Auc19pdmRfZGVsZXRlX29wX3QudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfZGVsZXRlX29wX3QpOworICAgICAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2RlbGV0ZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2RlbGV0ZV9vcCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICBzX2RlbGV0ZV9vcC5zX2l2ZF9kZWxldGVfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1EZWNIYW5kbGUgPSBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRBdmNEZWM6OmZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKHN0ZDo6bW92ZShtT3V0QmxvY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgbU91dEJsb2NrID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBidWZmZXItPnNldEluZm8obUludGYtPmdldENvbG9yQXNwZWN0c19sKCkpOworICAgIH0KKworICAgIGNsYXNzIEZpbGxXb3JrIHsKKyAgICAgICBwdWJsaWM6CisgICAgICAgIEZpbGxXb3JrKHVpbnQzMl90IGZsYWdzLCBDMldvcmtPcmRpbmFsU3RydWN0IG9yZGluYWwsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIGJ1ZmZlcikKKyAgICAgICAgICAgIDogbUZsYWdzKGZsYWdzKSwgbU9yZGluYWwob3JkaW5hbCksIG1CdWZmZXIoYnVmZmVyKSB7fQorICAgICAgICB+RmlsbFdvcmsoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgdm9pZCBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpbUZsYWdzOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gbU9yZGluYWw7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgICAgICAgICBpZiAobUJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhtQnVmZmVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJ0aW1lc3RhbXAgPSAlbGxkLCBpbmRleCA9ICVsbGQsIHcvJXMgYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgIG1PcmRpbmFsLnRpbWVzdGFtcC5wZWVrbGwoKSwgbU9yZGluYWwuZnJhbWVJbmRleC5wZWVrbGwoKSwKKyAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPyAiIiA6ICJvIik7CisgICAgICAgIH0KKworICAgICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IHVpbnQzMl90IG1GbGFnczsKKyAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCBtT3JkaW5hbDsKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBtQnVmZmVyOworICAgIH07CisKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlcl0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KTA7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfTsKKyAgICBpZiAod29yayAmJiBjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSB7CisgICAgICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgICAgICAvLyBUT0RPOiBDaGVjayBpZiBjbG9uZUFuZFNlbmQgY2FuIGJlIGF2b2lkZWQgYnkgdHJhY2tpbmcgbnVtYmVyIG9mIGZyYW1lcyByZW1haW5pbmcKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgICAgIG1PdXRJbmRleCA9IGluZGV4OworICAgICAgICAgICAgICAgIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3V0T3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgICAgICAgICAgY2xvbmVBbmRTZW5kKAorICAgICAgICAgICAgICAgICAgICBtT3V0SW5kZXgsIHdvcmssCisgICAgICAgICAgICAgICAgICAgIEZpbGxXb3JrKEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUsIG91dE9yZGluYWwsIGJ1ZmZlcikpOworICAgICAgICAgICAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2goaW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlYzo6ZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICAgICAgQUxPR0UoIm5vdCBzdXBwb3NlZCB0byBiZSBoZXJlLCBpbnZhbGlkIGRlY29kZXIgY29udGV4dCIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBpZiAobVN0cmlkZSAhPSBBTElHTjEyOChtV2lkdGgpKSB7CisgICAgICAgIG1TdHJpZGUgPSBBTElHTjEyOChtV2lkdGgpOworICAgICAgICBpZiAoT0sgIT0gc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfRlJBTUUpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrICYmCisgICAgICAgICAgICAobU91dEJsb2NrLT53aWR0aCgpICE9IG1TdHJpZGUgfHwgbU91dEJsb2NrLT5oZWlnaHQoKSAhPSBtSGVpZ2h0KSkgeworICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKCFtT3V0QmxvY2spIHsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyOworICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKG1TdHJpZGUsIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZtT3V0QmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpIiwKKyAgICAgICAgICAgICAgbU91dEJsb2NrLT53aWR0aCgpLCBtT3V0QmxvY2stPmhlaWdodCgpLCBtU3RyaWRlLCBtSGVpZ2h0KTsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIFRPRE86IGNhbiBvdmVyYWxsIGVycm9yIGNoZWNraW5nIGJlIGltcHJvdmVkPworLy8gVE9ETzogYWxsb3cgY29uZmlndXJhdGlvbiBvZiBjb2xvciBmb3JtYXQgYW5kIHVzYWdlIGZvciBncmFwaGljIGJ1ZmZlcnMgaW5zdGVhZAorLy8gICAgICAgb2YgaGFyZCBjb2RpbmcgdGhlbSB0byBIQUxfUElYRUxfRk9STUFUX1lWMTIKKy8vIFRPRE86IHBhc3MgY29sb3Jhc3BlY3RzIGluZm9ybWF0aW9uIHRvIHN1cmZhY2UKKy8vIFRPRE86IHRlc3Qgc3VwcG9ydCBmb3IgZHluYW1pYyBjaGFuZ2UgaW4gcmVzb2x1dGlvbgorLy8gVE9ETzogdmVyaWZ5IGlmIHRoZSBkZWNvZGVyIHNlbnQgYmFjayBhbGwgZnJhbWVzCit2b2lkIEMyU29mdEF2Y0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIHVpbnQzMl90IHdvcmtJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpICYgMHhGRkZGRkZGRjsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgYm9vbCBoYXNQaWN0dXJlID0gZmFsc2U7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplICYmIGluU2l6ZSAtIGluUG9zID49IGtNaW5JbnB1dEJ5dGVzKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisgICAgICAgIHsKKyAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgJnJWaWV3LCAmd1ZpZXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PZmZzZXQgKyBpblBvcywgaW5TaXplIC0gaW5Qb3MsIHdvcmtJbmRleCkpIHsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGZhbHNlID09IG1IZWFkZXJEZWNvZGVkKSB7CisgICAgICAgICAgICAgICAgLyogRGVjb2RlIGhlYWRlciBhbmQgZ2V0IGRpbWVuc2lvbnMgKi8KKyAgICAgICAgICAgICAgICBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9IRUFERVIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBXT1JEMzIgZGVsYXk7CisgICAgICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICAgICAgICAgIFRJTUVfRElGRihtVGltZUVuZCwgbVRpbWVTdGFydCwgZGVsYXkpOworICAgICAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgICAgICBXT1JEMzIgZGVjb2RlVGltZTsKKyAgICAgICAgICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICAgICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgZGVjb2RlVGltZSk7CisgICAgICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCIsIGRlY29kZVRpbWUsIGRlbGF5LAorICAgICAgICAgICAgICAgICAgc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoSVZEX01FTV9BTExPQ19GQUlMRUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJhbGxvY2F0aW9uIGZhaWx1cmUgaW4gZGVjb2RlciIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoSVZEX1NUUkVBTV9XSURUSF9IRUlHSFRfTk9UX1NVUFBPUlRFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSkgeworICAgICAgICAgICAgQUxPR0UoInVuc3VwcG9ydGVkIHJlc29sdXRpb24gOiAlZHglZCIsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChJVkRfUkVTX0NIQU5HRUQgPT0gKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpIHsKKyAgICAgICAgICAgIEFMT0dWKCJyZXNvbHV0aW9uIGNoYW5nZWQiKTsKKyAgICAgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX05PX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgICAgICByZXNldERlY29kZXIoKTsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworCisgICAgICAgICAgICAvKiBEZWNvZGUgaGVhZGVyIGFuZCBnZXQgbmV3IGRpbWVuc2lvbnMgKi8KKyAgICAgICAgICAgIHNldFBhcmFtcyhtU3RyaWRlLCBJVkRfREVDT0RFX0hFQURFUik7CisgICAgICAgICAgICAodm9pZCkgaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsICZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wKTsKKyAgICAgICAgfSBlbHNlIGlmIChJU19JVkRfRkFUQUxfRVJST1Ioc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYXRhbCBlcnJvciBpbiBkZWNvZGVyIDB4JXgiLCBzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChzX2RlY29kZV9vcC5pNF9yZW9yZGVyX2RlcHRoID49IDAgJiYgbU91dHB1dERlbGF5ICE9IHNfZGVjb2RlX29wLmk0X3Jlb3JkZXJfZGVwdGgpIHsKKyAgICAgICAgICAgIG1PdXRwdXREZWxheSA9IHNfZGVjb2RlX29wLmk0X3Jlb3JkZXJfZGVwdGg7CisgICAgICAgICAgICBBTE9HVigiTmV3IE91dHB1dCBkZWxheSAlZCAiLCBtT3V0cHV0RGVsYXkpOworCisgICAgICAgICAgICBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0IG91dHB1dERlbGF5KG1PdXRwdXREZWxheSk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgIG1JbnRmLT5jb25maWcoeyZvdXRwdXREZWxheX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShvdXRwdXREZWxheSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHNldCBvdXRwdXQgZGVsYXkiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoMCA8IHNfZGVjb2RlX29wLnU0X3BpY193ZCAmJiAwIDwgc19kZWNvZGVfb3AudTRfcGljX2h0KSB7CisgICAgICAgICAgICBpZiAobUhlYWRlckRlY29kZWQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBtSGVhZGVyRGVjb2RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgc2V0UGFyYW1zKEFMSUdOMTI4KHNfZGVjb2RlX29wLnU0X3BpY193ZCksIElWRF9ERUNPREVfRlJBTUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X3BpY193ZCAhPSBtV2lkdGggfHwgc19kZWNvZGVfb3AudTRfcGljX2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtV2lkdGggPSBzX2RlY29kZV9vcC51NF9waWNfd2Q7CisgICAgICAgICAgICAgICAgbUhlaWdodCA9IHNfZGVjb2RlX29wLnU0X3BpY19odDsKKyAgICAgICAgICAgICAgICBDSEVDS19FUSgwdSwgc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpOworCisgICAgICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgd2lkdGggYW5kIGhlaWdodCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpZ2V0VnVpUGFyYW1zKCk7CisgICAgICAgIGhhc1BpY3R1cmUgfD0gKDEgPT0gc19kZWNvZGVfb3AudTRfZnJhbWVfZGVjb2RlZF9mbGFnKTsKKyAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZGVjb2RlX29wLnU0X3RzLCB3b3JrKTsKKyAgICAgICAgfQorICAgICAgICBpblBvcyArPSBzX2RlY29kZV9vcC51NF9udW1fYnl0ZXNfY29uc3VtZWQ7CisgICAgfQorICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFoYXNQaWN0dXJlKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorCisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNEZWM6OmRyYWluSW50ZXJuYWwoCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgaWYgKE9LICE9IHNldEZsdXNoTW9kZSgpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKyAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCBudWxscHRyLCAmd1ZpZXcsIDAsIDAsIDApKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2NsYXNzIEMyU29mdEF2Y0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRBdmNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRBdmNEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QXZjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEF2Y0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEF2Y0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEF2Y0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEF2Y0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYXZjL0MyU29mdEF2Y0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkMjc0OTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRGVjLmgKQEAgLTAsMCArMSwxOTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0FWQ19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FWQ19ERUNfSF8KKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisjaW5jbHVkZSAiaWgyNjRfdHlwZWRlZnMuaCIKKyNpbmNsdWRlICJpdi5oIgorI2luY2x1ZGUgIml2ZC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNkZWZpbmUgaXZkZWNfYXBpX2Z1bmN0aW9uICAgICAgICAgICAgICBpaDI2NGRfYXBpX2Z1bmN0aW9uCisjZGVmaW5lIGl2ZGV4dF9jcmVhdGVfaXBfdCAgICAgICAgICAgICAgaWgyNjRkX2NyZWF0ZV9pcF90CisjZGVmaW5lIGl2ZGV4dF9jcmVhdGVfb3BfdCAgICAgICAgICAgICAgaWgyNjRkX2NyZWF0ZV9vcF90CisjZGVmaW5lIGl2ZGV4dF9kZWxldGVfaXBfdCAgICAgICAgICAgICAgaWgyNjRkX2RlbGV0ZV9pcF90CisjZGVmaW5lIGl2ZGV4dF9kZWxldGVfb3BfdCAgICAgICAgICAgICAgaWgyNjRkX2RlbGV0ZV9vcF90CisjZGVmaW5lIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90ICAgaWgyNjRkX2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QgICBpaDI2NGRfY3RsX3NldF9udW1fY29yZXNfb3BfdAorI2RlZmluZSBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3QgIGloMjY0ZF9jdGxfZ2V0X3Z1aV9wYXJhbXNfaXBfdAorI2RlZmluZSBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3QgIGloMjY0ZF9jdGxfZ2V0X3Z1aV9wYXJhbXNfb3BfdAorI2RlZmluZSBBTElHTjY0KHgpICAgICAgICAgICAgICAgICAgICAgICgoKCh4KSArIDYzKSA+PiA2KSA8PCA2KQorI2RlZmluZSBBTElHTjEyOCh4KSAgICAgICAgICAgICAgICAgICAgICgoKCh4KSArIDEyNykgPj4gNykgPDwgNykKKyNkZWZpbmUgTUFYX05VTV9DT1JFUyAgICAgICAgICAgICAgICAgICA0CisjZGVmaW5lIElWREVYVF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMgICAgXAorICAgICAgICAoSVZEX0NPTlRST0xfQVBJX0NPTU1BTkRfVFlQRV9UKUlIMjY0RF9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKKyNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KGEsIGIpOworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfUEFUSCAgICAgIi9zZGNhcmQvY2xpcHMvYXZjZF9pbnB1dCIKKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfRVhUICAgICAgImgyNjQiCisgICAgI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsICBcCisgICAgICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgICAgICBcCisgICAgICAgICAgICAgICAgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorICAgICNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJ3YiIpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyAgICAjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplLCBtX29mZnNldClcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgImFiIik7ICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCAhPSBOVUxMICYmIG1fYnVmICE9IE5VTEwgJiYgbV9vZmZzZXQgPT0gMCkgeyBcCisgICAgICAgICAgICBpbnQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpID0gZndyaXRlKG1fYnVmLCAxLCBtX3NpemUsIGZwKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiZndyaXRlIHJldCAlZCB0byB3cml0ZSAlZCIsIGksIG1fc2l6ZSk7ICBcCisgICAgICAgICAgICBpZiAoaSAhPSAoaW50KSBtX3NpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgQUxPR0QoIkVycm9yIGluIGZ3cml0ZSwgcmV0dXJuZWQgJWQiLCBpKTsgICBcCisgICAgICAgICAgICAgICAgcGVycm9yKCJFcnJvciBpbiB3cml0ZSB0byBmaWxlIik7ICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSBpZiAoZnAgPT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiQ291bGQgbm90IHdyaXRlIHRvIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTtcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChmcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UgLyogRklMRV9EVU1QX0VOQUJMRSAqLworICAgICNkZWZpbmUgSU5QVVRfRFVNUF9QQVRICisgICAgI2RlZmluZSBJTlBVVF9EVU1QX0VYVAorICAgICNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSAorICAgICNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUCisgICAgI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkKKyAgICAjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkKKyAgICAjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplLCBtX29mZnNldCkKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKworY2xhc3MgQzJTb2Z0QXZjRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKK3B1YmxpYzoKKyAgICBjbGFzcyBJbnRmSW1wbDsKKyAgICBDMlNvZnRBdmNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0QXZjRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0YXR1c190IGNyZWF0ZURlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBzZXROdW1Db3JlcygpOworICAgIHN0YXR1c190IHNldFBhcmFtcyhzaXplX3Qgc3RyaWRlLCBJVkRfVklERU9fREVDT0RFX01PREVfVCBkZWNfbW9kZSk7CisgICAgdm9pZCBnZXRWZXJzaW9uKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBib29sIHNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKTsKKyAgICBib29sIGdldFZ1aVBhcmFtcygpOworICAgIGMyX3N0YXR1c190IGVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCBzZXRGbHVzaE1vZGUoKTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCByZXNldERlY29kZXIoKTsKKyAgICB2b2lkIHJlc2V0UGx1Z2luKCk7CisgICAgc3RhdHVzX3QgZGVsZXRlRGVjb2RlcigpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKworICAgIC8vIFRPRE86VGhpcyBpcyBub3QgdGhlIHJpZ2h0IHBsYWNlIGZvciB0aGlzIGVudW0uIFRoZXNlIHNob3VsZAorICAgIC8vIGJlIHBhcnQgb2YgYzItdm5kayBzbyB0aGF0IHRoZXkgY2FuIGJlIGFjY2Vzc2VkIGJ5IGFsbCB2aWRlbyBwbHVnaW5zCisgICAgLy8gdW50aWwgdGhlbiwgbWFrZSB0aGVtIGZlZWwgYXQgaG9tZQorICAgIGVudW0geworICAgICAgICBrTm90U3VwcG9ydGVkLAorICAgICAgICBrUHJlZmVyQml0c3RyZWFtLAorICAgICAgICBrUHJlZmVyQ29udGFpbmVyLAorICAgIH07CisKKyAgICBpdl9vYmpfdCAqbURlY0hhbmRsZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IG1PdXRCbG9jazsKKyAgICB1aW50OF90ICptT3V0QnVmZmVyRmx1c2g7CisKKyAgICBzaXplX3QgbU51bUNvcmVzOworICAgIElWX0NPTE9SX0ZPUk1BVF9UIG1JdkNvbG9yRm9ybWF0OworICAgIHVpbnQzMl90IG1PdXRwdXREZWxheTsKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICB1aW50MzJfdCBtU3RyaWRlOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1IZWFkZXJEZWNvZGVkOworICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1PdXRJbmRleDsKKyAgICAvLyBDb2xvciBhc3BlY3RzLiBUaGVzZSBhcmUgSVNPIHZhbHVlcyBhbmQgYXJlIG1lYW50IHRvIGRldGVjdCBjaGFuZ2VzIGluIGFzcGVjdHMgdG8gYXZvaWQKKyAgICAvLyBjb252ZXJ0aW5nIHRoZW0gdG8gQzIgdmFsdWVzIGZvciBlYWNoIGZyYW1lCisgICAgc3RydWN0IFZ1aUNvbG9yQXNwZWN0cyB7CisgICAgICAgIHVpbnQ4X3QgcHJpbWFyaWVzOworICAgICAgICB1aW50OF90IHRyYW5zZmVyOworICAgICAgICB1aW50OF90IGNvZWZmczsKKyAgICAgICAgdWludDhfdCBmdWxsUmFuZ2U7CisKKyAgICAgICAgLy8gZGVmYXVsdCBjb2xvciBhc3BlY3RzCisgICAgICAgIFZ1aUNvbG9yQXNwZWN0cygpCisgICAgICAgICAgICA6IHByaW1hcmllcygyKSwgdHJhbnNmZXIoMiksIGNvZWZmcygyKSwgZnVsbFJhbmdlKDApIHsgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBWdWlDb2xvckFzcGVjdHMgJm8pIHsKKyAgICAgICAgICAgIHJldHVybiBwcmltYXJpZXMgPT0gby5wcmltYXJpZXMgJiYgdHJhbnNmZXIgPT0gby50cmFuc2ZlciAmJiBjb2VmZnMgPT0gby5jb2VmZnMKKyAgICAgICAgICAgICAgICAgICAgJiYgZnVsbFJhbmdlID09IG8uZnVsbFJhbmdlOworICAgICAgICB9CisgICAgfSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzOworCisgICAgLy8gcHJvZmlsZQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7CisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7CisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorICAgIGNoYXIgbUluRmlsZVsyMDBdOworI2VuZGlmIC8qIEZJTEVfRFVNUF9FTkFCTEUgKi8KKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEF2Y0RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BVkNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzZDQxOWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmNwcApAQCAtMCwwICsxLDE3NjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0QXZjRW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgIkMyU29mdEF2Y0VuYy5oIgorI2luY2x1ZGUgImloMjY0ZS5oIgorI2luY2x1ZGUgImloMjY0ZV9lcnJvci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5hdmMuZW5jb2RlciI7Citjb25zdGV4cHIgdWludDMyX3Qga01pbk91dEJ1ZmZlclNpemUgPSA1MjQyODg7Cit2b2lkIFBhcnNlR29wKAorICAgICAgICBjb25zdCBDMlN0cmVhbUdvcFR1bmluZzo6b3V0cHV0ICZnb3AsCisgICAgICAgIHVpbnQzMl90ICpzeW5jSW50ZXJ2YWwsIHVpbnQzMl90ICppSW50ZXJ2YWwsIHVpbnQzMl90ICptYXhCZnJhbWVzKSB7CisgICAgdWludDMyX3Qgc3luY0ludCA9IDE7CisgICAgdWludDMyX3QgaUludCA9IDE7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBnb3AuZmxleENvdW50KCk7ICsraSkgeworICAgICAgICBjb25zdCBDMkdvcExheWVyU3RydWN0ICZsYXllciA9IGdvcC5tLnZhbHVlc1tpXTsKKyAgICAgICAgaWYgKGxheWVyLmNvdW50ID09IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgIHN5bmNJbnQgPSAwOworICAgICAgICB9IGVsc2UgaWYgKHN5bmNJbnQgPD0gVUlOVDMyX01BWCAvIChsYXllci5jb3VudCArIDEpKSB7CisgICAgICAgICAgICBzeW5jSW50ICo9IChsYXllci5jb3VudCArIDEpOworICAgICAgICB9CisgICAgICAgIGlmICgobGF5ZXIudHlwZV8gJiBJX0ZSQU1FKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAobGF5ZXIuY291bnQgPT0gVUlOVDMyX01BWCkgeworICAgICAgICAgICAgICAgIGlJbnQgPSAwOworICAgICAgICAgICAgfSBlbHNlIGlmIChpSW50IDw9IFVJTlQzMl9NQVggLyAobGF5ZXIuY291bnQgKyAxKSkgeworICAgICAgICAgICAgICAgIGlJbnQgKj0gKGxheWVyLmNvdW50ICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxheWVyLnR5cGVfID09IEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdChQX0ZSQU1FIHwgQl9GUkFNRSkgJiYgbWF4QmZyYW1lcykgeworICAgICAgICAgICAgKm1heEJmcmFtZXMgPSBsYXllci5jb3VudDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc3luY0ludGVydmFsKSB7CisgICAgICAgICpzeW5jSW50ZXJ2YWwgPSBzeW5jSW50OworICAgIH0KKyAgICBpZiAoaUludGVydmFsKSB7CisgICAgICAgICppSW50ZXJ2YWwgPSBpSW50OworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEMyU29mdEF2Y0VuYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQorICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Vc2FnZSwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX1VTQUdFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgKHVpbnQ2NF90KUMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDI1NjAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyNTYwLCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtR29wLCBDMl9QQVJBTUtFWV9HT1ApCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAgICAgMCAvKiBmbGV4Q291bnQgKi8sIDB1IC8qIHN0cmVhbSAqLykpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtR29wLCBtLnZhbHVlc1swXS50eXBlXykuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtR29wLCBtLnZhbHVlc1swXS5jb3VudCkuYW55KCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEdvcFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxJbnB1dERlbGF5LCBDMl9QQVJBTUtFWV9JTlBVVF9ERUxBWSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dChERUZBVUxUX0JfRlJBTUVTKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1BY3R1YWxJbnB1dERlbGF5LCB2YWx1ZSkuaW5SYW5nZSgwLCBNQVhfQl9GUkFNRVMpfSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKElucHV0RGVsYXlTZXR0ZXIsIG1Hb3ApCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRnJhbWVSYXRlLCBDMl9QQVJBTUtFWV9GUkFNRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDMwLikpCisgICAgICAgICAgICAgICAgLy8gVE9ETzogTW9yZSByZXN0cmljdGlvbj8KKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1GcmFtZVJhdGUsIHZhbHVlKS5ncmVhdGVyVGhhbigwLil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUZyYW1lUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQwOTYsIDEyMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQml0cmF0ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnRyYVJlZnJlc2gsIEMyX1BBUkFNS0VZX0lOVFJBX1JFRlJFU0gpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0RJU0FCTEVELCAwLikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUludHJhUmVmcmVzaCwgbW9kZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OklOVFJBX1JFRlJFU0hfRElTQUJMRUQsIEMyQ29uZmlnOjpJTlRSQV9SRUZSRVNIX0FSQklUUkFSWSB9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1JbnRyYVJlZnJlc2gsIHBlcmlvZCkuYW55KCkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEludHJhUmVmcmVzaFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSwgTEVWRUxfQVZDXzRfMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgUFJPRklMRV9BVkNfQkFTRUxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFBST0ZJTEVfQVZDX01BSU4sCisgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18xLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzFCLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzFfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18xXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMV8zLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfMl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzJfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18zLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ18zXzIsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0FWQ180XzEsCisgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9BVkNfNF8yLAorICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfQVZDXzUsCisgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSwgbUZyYW1lUmF0ZSwgbUJpdHJhdGUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdFN5bmMsIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0KDB1LCBDMl9GQUxTRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUmVxdWVzdFN5bmMsIHZhbHVlKS5vbmVPZih7IEMyX0ZBTFNFLCBDMl9UUlVFIH0pIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptUmVxdWVzdFN5bmMpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVN5bmNGcmFtZVBlcmlvZCwgQzJfUEFSQU1LRVlfU1lOQ19GUkFNRV9JTlRFUlZBTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dCgwdSwgMTAwMDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU3luY0ZyYW1lUGVyaW9kLCB2YWx1ZSkuYW55KCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVN5bmNGcmFtZVBlcmlvZCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgSW5wdXREZWxheVNldHRlcigKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBDMlA8QzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6OmlucHV0PiAmbWUsCisgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1Hb3BUdW5pbmc6Om91dHB1dD4gJmdvcCkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgdWludDMyX3QgbWF4QmZyYW1lcyA9IDA7CisgICAgICAgIFBhcnNlR29wKGdvcC52LCBudWxscHRyLCBudWxscHRyLCAmbWF4QmZyYW1lcyk7CisgICAgICAgIG1lLnNldCgpLnZhbHVlID0gbWF4QmZyYW1lczsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEJpdHJhdGVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi52YWx1ZSA8PSA0MDk2KSB7CisgICAgICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IDQwOTY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmc2l6ZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gJmZyYW1lUmF0ZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+ICZiaXRyYXRlKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAoIW1lLkYobWUudi5wcm9maWxlKS5zdXBwb3J0c0F0QWxsKG1lLnYucHJvZmlsZSkpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnByb2ZpbGUgPSBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cnVjdCBMZXZlbExpbWl0cyB7CisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBsZXZlbDsKKyAgICAgICAgICAgIGZsb2F0IG1ic1BlclNlYzsKKyAgICAgICAgICAgIHVpbnQ2NF90IG1iczsKKyAgICAgICAgICAgIHVpbnQzMl90IGJpdHJhdGU7CisgICAgICAgIH07CisgICAgICAgIGNvbnN0ZXhwciBMZXZlbExpbWl0cyBrTGltaXRzW10gPSB7CisgICAgICAgICAgICB7IExFVkVMX0FWQ18xLCAgICAgMTQ4NSwgICAgOTksICAgICA2NDAwMCB9LAorICAgICAgICAgICAgLy8gRGVjb2RlciBkb2VzIG5vdCBwcm9wZXJseSBoYW5kbGUgbGV2ZWwgMWIuCisgICAgICAgICAgICAvLyB7IExFVkVMX0FWQ18xQiwgICAgMTQ4NSwgICA5OSwgICAxMjgwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzFfMSwgICAzMDAwLCAgIDM5NiwgICAgMTkyMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18xXzIsICAgNjAwMCwgICAzOTYsICAgIDM4NDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMV8zLCAgMTE4ODAsICAgMzk2LCAgICA3NjgwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzIsICAgIDExODgwLCAgIDM5NiwgICAyMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18yXzEsICAxOTgwMCwgICA3OTIsICAgNDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMl8yLCAgMjAyNTAsICAxNjIwLCAgIDQwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzMsICAgIDQwNTAwLCAgMTYyMCwgIDEwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ18zXzEsIDEwODAwMCwgIDM2MDAsICAxNDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfM18yLCAyMTYwMDAsICA1MTIwLCAgMjAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzQsICAgMjQ1NzYwLCAgODE5MiwgIDIwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0FWQ180XzEsIDI0NTc2MCwgIDgxOTIsICA1MDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNF8yLCA1MjIyNDAsICA4NzA0LCAgNTAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfQVZDXzUsICAgNTg5ODI0LCAyMjA4MCwgMTM1MDAwMDAwIH0sCisgICAgICAgIH07CisKKyAgICAgICAgdWludDY0X3QgbWJzID0gdWludDY0X3QoKHNpemUudi53aWR0aCArIDE1KSAvIDE2KSAqICgoc2l6ZS52LmhlaWdodCArIDE1KSAvIDE2KTsKKyAgICAgICAgZmxvYXQgbWJzUGVyU2VjID0gZmxvYXQobWJzKSAqIGZyYW1lUmF0ZS52LnZhbHVlOworCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBzdXBwbGllZCBsZXZlbCBtZWV0cyB0aGUgTUIgLyBiaXRyYXRlIHJlcXVpcmVtZW50cy4gSWYKKyAgICAgICAgLy8gbm90LCB1cGRhdGUgdGhlIGxldmVsIHdpdGggdGhlIGxvd2VzdCBsZXZlbCBtZWV0aW5nIHRoZSByZXF1aXJlbWVudHMuCisKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICAvLyBCeSBkZWZhdWx0IG5lZWRzVXBkYXRlID0gZmFsc2UgaW4gY2FzZSB0aGUgc3VwcGxpZWQgbGV2ZWwgZG9lcyBtZWV0CisgICAgICAgIC8vIHRoZSByZXF1aXJlbWVudHMuIEZvciBMZXZlbCAxYiwgd2Ugd2FudCB0byB1cGRhdGUgdGhlIGxldmVsIGFueXdheSwKKyAgICAgICAgLy8gc28gd2Ugc2V0IGl0IHRvIHRydWUgaW4gdGhhdCBjYXNlLgorICAgICAgICBib29sIG5lZWRzVXBkYXRlID0gKG1lLnYubGV2ZWwgPT0gTEVWRUxfQVZDXzFCKTsKKyAgICAgICAgZm9yIChjb25zdCBMZXZlbExpbWl0cyAmbGltaXQgOiBrTGltaXRzKSB7CisgICAgICAgICAgICBpZiAobWJzIDw9IGxpbWl0Lm1icyAmJiBtYnNQZXJTZWMgPD0gbGltaXQubWJzUGVyU2VjICYmCisgICAgICAgICAgICAgICAgICAgIGJpdHJhdGUudi52YWx1ZSA8PSBsaW1pdC5iaXRyYXRlKSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgbG93ZXN0IGxldmVsIHRoYXQgbWVldHMgdGhlIHJlcXVpcmVtZW50cywgYW5kIGlmCisgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZW4ndCBzZWVuIHRoZSBzdXBwbGllZCBsZXZlbCB5ZXQsIHRoYXQgbWVhbnMgd2UgZG9uJ3QKKyAgICAgICAgICAgICAgICAvLyBuZWVkIHRoZSB1cGRhdGUuCisgICAgICAgICAgICAgICAgaWYgKG5lZWRzVXBkYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJHaXZlbiBsZXZlbCAleCBkb2VzIG5vdCBjb3ZlciBjdXJyZW50IGNvbmZpZ3VyYXRpb246ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFkanVzdGluZyB0byAleCIsIG1lLnYubGV2ZWwsIGxpbWl0LmxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBsaW1pdC5sZXZlbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1lLnYubGV2ZWwgPT0gbGltaXQubGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAvLyBXZSBicmVhayBvdXQgb2YgdGhlIGxvb3Agd2hlbiB0aGUgbG93ZXN0IGZlYXNpYmxlIGxldmVsIGlzCisgICAgICAgICAgICAgICAgLy8gZm91bmQuIFRoZSBmYWN0IHRoYXQgd2UncmUgaGVyZSBtZWFucyB0aGF0IG91ciBsZXZlbCBkb2Vzbid0CisgICAgICAgICAgICAgICAgLy8gbWVldCB0aGUgcmVxdWlyZW1lbnQgYW5kIG5lZWRzIHRvIGJlIHVwZGF0ZWQuCisgICAgICAgICAgICAgICAgbmVlZHNVcGRhdGUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghZm91bmQpIHsKKyAgICAgICAgICAgIC8vIFdlIHNldCB0byB0aGUgaGlnaGVzdCBzdXBwb3J0ZWQgbGV2ZWwuCisgICAgICAgICAgICBtZS5zZXQoKS5sZXZlbCA9IExFVkVMX0FWQ181OworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEludHJhUmVmcmVzaFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi5wZXJpb2QgPCAxKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5tb2RlID0gQzJDb25maWc6OklOVFJBX1JFRlJFU0hfRElTQUJMRUQ7CisgICAgICAgICAgICBtZS5zZXQoKS5wZXJpb2QgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gb25seSBzdXBwb3J0IGFyYml0cmFyeSBtb2RlIChjeWNsaWMgaW4gb3VyIGNhc2UpCisgICAgICAgICAgICBtZS5zZXQoKS5tb2RlID0gQzJDb25maWc6OklOVFJBX1JFRlJFU0hfQVJCSVRSQVJZOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBHb3BTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtZS52LmZsZXhDb3VudCgpOyArK2kpIHsKKyAgICAgICAgICAgIGNvbnN0IEMyR29wTGF5ZXJTdHJ1Y3QgJmxheWVyID0gbWUudi5tLnZhbHVlc1swXTsKKyAgICAgICAgICAgIGlmIChsYXllci50eXBlXyA9PSBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoUF9GUkFNRSB8IEJfRlJBTUUpCisgICAgICAgICAgICAgICAgICAgICYmIGxheWVyLmNvdW50ID4gTUFYX0JfRlJBTUVTKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubS52YWx1ZXNbaV0uY291bnQgPSBNQVhfQl9GUkFNRVM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBJVl9QUk9GSUxFX1QgZ2V0UHJvZmlsZV9sKCkgY29uc3QgeworICAgICAgICBzd2l0Y2ggKG1Qcm9maWxlTGV2ZWwtPnByb2ZpbGUpIHsKKyAgICAgICAgY2FzZSBQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORTogIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBQUk9GSUxFX0FWQ19CQVNFTElORTogcmV0dXJuIElWX1BST0ZJTEVfQkFTRTsKKyAgICAgICAgY2FzZSBQUk9GSUxFX0FWQ19NQUlOOiAgICAgcmV0dXJuIElWX1BST0ZJTEVfTUFJTjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dEKCJVbnJlY29nbml6ZWQgcHJvZmlsZTogJXgiLCBtUHJvZmlsZUxldmVsLT5wcm9maWxlKTsKKyAgICAgICAgICAgIHJldHVybiBJVl9QUk9GSUxFX0RFRkFVTFQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBVV09SRDMyIGdldExldmVsX2woKSBjb25zdCB7CisgICAgICAgIHN0cnVjdCBMZXZlbCB7CisgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBjMkxldmVsOworICAgICAgICAgICAgVVdPUkQzMiBhdmNMZXZlbDsKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3RleHByIExldmVsIGxldmVsc1tdID0geworICAgICAgICAgICAgeyBMRVZFTF9BVkNfMSwgICAxMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMUIsICAgOSB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMV8xLCAxMSB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMV8yLCAxMiB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMV8zLCAxMyB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMiwgICAyMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMl8xLCAyMSB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMl8yLCAyMiB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfMywgICAzMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfM18xLCAzMSB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfM18yLCAzMiB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNCwgICA0MCB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNF8xLCA0MSB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNF8yLCA0MiB9LAorICAgICAgICAgICAgeyBMRVZFTF9BVkNfNSwgICA1MCB9LAorICAgICAgICB9OworICAgICAgICBmb3IgKGNvbnN0IExldmVsICZsZXZlbCA6IGxldmVscykgeworICAgICAgICAgICAgaWYgKG1Qcm9maWxlTGV2ZWwtPmxldmVsID09IGxldmVsLmMyTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGV2ZWwuYXZjTGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCBsZXZlbDogJXgiLCBtUHJvZmlsZUxldmVsLT5sZXZlbCk7CisgICAgICAgIHJldHVybiA0MTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRTeW5jRnJhbWVQZXJpb2RfbCgpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIDwgMCB8fCBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA9PSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGRvdWJsZSBwZXJpb2QgPSBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSAvIDFlNiAqIG1GcmFtZVJhdGUtPnZhbHVlOworICAgICAgICByZXR1cm4gKHVpbnQzMl90KWMyX21heChjMl9taW4ocGVyaW9kICsgMC41LCBkb3VibGUoVUlOVDMyX01BWCkpLCAxLik7CisgICAgfQorCisgICAgLy8gdW5zYWZlIGdldHRlcnMKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiBnZXRTaXplX2woKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBnZXRJbnRyYVJlZnJlc2hfbCgpIGNvbnN0IHsgcmV0dXJuIG1JbnRyYVJlZnJlc2g7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IGdldEZyYW1lUmF0ZV9sKCkgY29uc3QgeyByZXR1cm4gbUZyYW1lUmF0ZTsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGdldEJpdHJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBnZXRSZXF1ZXN0U3luY19sKCkgY29uc3QgeyByZXR1cm4gbVJlcXVlc3RTeW5jOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ+IGdldEdvcF9sKCkgY29uc3QgeyByZXR1cm4gbUdvcDsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dD4gbVVzYWdlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IG1SZXF1ZXN0U3luYzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gbUludHJhUmVmcmVzaDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dD4gbVN5bmNGcmFtZVBlcmlvZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Hb3BUdW5pbmc6Om91dHB1dD4gbUdvcDsKK307CisKKyNkZWZpbmUgaXZlX2FwaV9mdW5jdGlvbiAgaWgyNjRlX2FwaV9mdW5jdGlvbgorCituYW1lc3BhY2UgeworCisvLyBGcm9tIGV4dGVybmFsL2xpYmF2Yy9lbmNvZGVyL2loMjY0ZV9iaXRzdHJlYW0uaAorY29uc3RleHByIHVpbnQzMl90IE1JTl9TVFJFQU1fU0laRSA9IDB4ODAwOworCitzdGF0aWMgc2l6ZV90IEdldENQVUNvcmVDb3VudCgpIHsKKyAgICBsb25nIGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVsZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OworfQorCit9ICAvLyBuYW1lc3BhY2UKKworQzJTb2Z0QXZjRW5jOjpDMlNvZnRBdmNFbmMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUl2VmlkZW9Db2xvckZvcm1hdChJVl9ZVVZfNDIwUCksCisgICAgICBtQVZDRW5jUHJvZmlsZShJVl9QUk9GSUxFX0JBU0UpLAorICAgICAgbUFWQ0VuY0xldmVsKDQxKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1TYXdJbnB1dEVPUyhmYWxzZSksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpLAorICAgICAgbUNvZGVjQ3R4KG51bGxwdHIpLAorICAgICAgbU91dEJsb2NrKG51bGxwdHIpLAorICAgICAgbU91dEJ1ZmZlclNpemUoa01pbk91dEJ1ZmZlclNpemUpIHsKKworICAgIC8vIElmIGR1bXAgaXMgZW5hYmxlZCwgdGhlbiBvcGVuIGNyZWF0ZSBhbiBlbXB0eSBmaWxlCisgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOworICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7CisgICAgQ1JFQVRFX0RVTVBfRklMRShtT3V0RmlsZSk7CisKKyAgICBpbml0RW5jUGFyYW1zKCk7Cit9CisKK0MyU29mdEF2Y0VuYzo6fkMyU29mdEF2Y0VuYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpvbkluaXQoKSB7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6Om9uU3RvcCgpIHsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QXZjRW5jOjpvblJlc2V0KCkgeworICAgIC8vIFRPRE86IHVzZSBJVkVfQ01EX0NUTF9SRVNFVD8KKyAgICByZWxlYXNlRW5jb2RlcigpOworICAgIGlmIChtT3V0QmxvY2spIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGluaXRFbmNQYXJhbXMoKTsKK30KKwordm9pZCBDMlNvZnRBdmNFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICByZWxlYXNlRW5jb2RlcigpOworICAgIGlmIChtT3V0QmxvY2spIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgLy8gVE9ETzogdXNlIElWRV9DTURfQ1RMX0ZMVVNIPworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCAgQzJTb2Z0QXZjRW5jOjppbml0RW5jUGFyYW1zKCkgeworICAgIG1Db2RlY0N0eCA9IG51bGxwdHI7CisgICAgbU1lbVJlY29yZHMgPSBudWxscHRyOworICAgIG1OdW1NZW1SZWNvcmRzID0gREVGQVVMVF9NRU1fUkVDX0NOVDsKKyAgICBtSGVhZGVyR2VuZXJhdGVkID0gMDsKKyAgICBtTnVtQ29yZXMgPSBHZXRDUFVDb3JlQ291bnQoKTsKKyAgICBtQXJjaCA9IERFRkFVTFRfQVJDSDsKKyAgICBtU2xpY2VNb2RlID0gREVGQVVMVF9TTElDRV9NT0RFOworICAgIG1TbGljZVBhcmFtID0gREVGQVVMVF9TTElDRV9QQVJBTTsKKyAgICBtSGFsZlBlbEVuYWJsZSA9IERFRkFVTFRfSFBFTDsKKyAgICBtSUludGVydmFsID0gREVGQVVMVF9JX0lOVEVSVkFMOworICAgIG1JRFJJbnRlcnZhbCA9IERFRkFVTFRfSURSX0lOVEVSVkFMOworICAgIG1EaXNhYmxlRGVibGtMZXZlbCA9IERFRkFVTFRfRElTQUJMRV9ERUJMS19MRVZFTDsKKyAgICBtRW5hYmxlRmFzdFNhZCA9IERFRkFVTFRfRU5BQkxFX0ZBU1RfU0FEOworICAgIG1FbmFibGVBbHRSZWYgPSBERUZBVUxUX0VOQUJMRV9BTFRfUkVGOworICAgIG1FbmNTcGVlZCA9IERFRkFVTFRfRU5DX1NQRUVEOworICAgIG1JbnRyYTR4NCA9IERFRkFVTFRfSU5UUkE0eDQ7CisgICAgbUNvbnN0cmFpbmVkSW50cmFGbGFnID0gREVGQVVMVF9DT05TVFJBSU5FRF9JTlRSQTsKKyAgICBtUFNOUkVuYWJsZSA9IERFRkFVTFRfUFNOUl9FTkFCTEU7CisgICAgbVJlY29uRW5hYmxlID0gREVGQVVMVF9SRUNPTl9FTkFCTEU7CisgICAgbUVudHJvcHlNb2RlID0gREVGQVVMVF9FTlRST1BZX01PREU7CisgICAgbUJmcmFtZXMgPSBERUZBVUxUX0JfRlJBTUVTOworCisgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXREaW1lbnNpb25zKCkgeworICAgIGl2ZV9jdGxfc2V0X2RpbWVuc2lvbnNfaXBfdCBzX2RpbWVuc2lvbnNfaXA7CisgICAgaXZlX2N0bF9zZXRfZGltZW5zaW9uc19vcF90IHNfZGltZW5zaW9uc19vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX2RpbWVuc2lvbnNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2RpbWVuc2lvbnNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0RJTUVOU0lPTlM7CisgICAgc19kaW1lbnNpb25zX2lwLnU0X2h0ID0gbVNpemUtPmhlaWdodDsKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfd2QgPSBtU2l6ZS0+d2lkdGg7CisKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2RpbWVuc2lvbnNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19kaW1lbnNpb25zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZGltZW5zaW9uc19pcF90KTsKKyAgICBzX2RpbWVuc2lvbnNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9kaW1lbnNpb25zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2RpbWVuc2lvbnNfaXAsICZzX2RpbWVuc2lvbnNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBmcmFtZSBkaW1lbnNpb25zID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2RpbWVuc2lvbnNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXROdW1Db3JlcygpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfbnVtX2NvcmVzX2lwX3Qgc19udW1fY29yZXNfaXA7CisgICAgaXZlX2N0bF9zZXRfbnVtX2NvcmVzX29wX3Qgc19udW1fY29yZXNfb3A7CisgICAgc19udW1fY29yZXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX251bV9jb3Jlc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfTlVNX0NPUkVTOworICAgIHNfbnVtX2NvcmVzX2lwLnU0X251bV9jb3JlcyA9IE1JTihtTnVtQ29yZXMsIENPREVDX01BWF9DT1JFUyk7CisgICAgc19udW1fY29yZXNfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX251bV9jb3Jlc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisgICAgc19udW1fY29yZXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9udW1fY29yZXNfaXBfdCk7CisKKyAgICBzX251bV9jb3Jlc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X251bV9jb3Jlc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24oCisgICAgICAgICAgICBtQ29kZWNDdHgsICh2b2lkICopICZzX251bV9jb3Jlc19pcCwgKHZvaWQgKikgJnNfbnVtX2NvcmVzX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgcHJvY2Vzc29yIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19udW1fY29yZXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRGcmFtZVJhdGUoKSB7CisgICAgaXZlX2N0bF9zZXRfZnJhbWVfcmF0ZV9pcF90IHNfZnJhbWVfcmF0ZV9pcDsKKyAgICBpdmVfY3RsX3NldF9mcmFtZV9yYXRlX29wX3Qgc19mcmFtZV9yYXRlX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfZnJhbWVfcmF0ZV9pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZnJhbWVfcmF0ZV9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfRlJBTUVSQVRFOworCisgICAgc19mcmFtZV9yYXRlX2lwLnU0X3NyY19mcmFtZV9yYXRlID0gbUZyYW1lUmF0ZS0+dmFsdWUgKyAwLjU7CisgICAgc19mcmFtZV9yYXRlX2lwLnU0X3RndF9mcmFtZV9yYXRlID0gbUZyYW1lUmF0ZS0+dmFsdWUgKyAwLjU7CisKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2ZyYW1lX3JhdGVfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19mcmFtZV9yYXRlX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZnJhbWVfcmF0ZV9pcF90KTsKKyAgICBzX2ZyYW1lX3JhdGVfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9mcmFtZV9yYXRlX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2ZyYW1lX3JhdGVfaXAsICZzX2ZyYW1lX3JhdGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBmcmFtZSByYXRlID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICBzX2ZyYW1lX3JhdGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRJcGVQYXJhbXMoKSB7CisgICAgaXZlX2N0bF9zZXRfaXBlX3BhcmFtc19pcF90IHNfaXBlX3BhcmFtc19pcDsKKyAgICBpdmVfY3RsX3NldF9pcGVfcGFyYW1zX29wX3Qgc19pcGVfcGFyYW1zX29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfaXBlX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfaXBlX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfSVBFX1BBUkFNUzsKKworICAgIHNfaXBlX3BhcmFtc19pcC51NF9lbmFibGVfaW50cmFfNHg0ID0gbUludHJhNHg0OworICAgIHNfaXBlX3BhcmFtc19pcC51NF9lbmNfc3BlZWRfcHJlc2V0ID0gbUVuY1NwZWVkOworICAgIHNfaXBlX3BhcmFtc19pcC51NF9jb25zdHJhaW5lZF9pbnRyYV9wcmVkID0gbUNvbnN0cmFpbmVkSW50cmFGbGFnOworCisgICAgc19pcGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19pcGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfaXBlX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2lwZV9wYXJhbXNfaXBfdCk7CisgICAgc19pcGVfcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfaXBlX3BhcmFtc19vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19pcGVfcGFyYW1zX2lwLCAmc19pcGVfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgaXBlIHBhcmFtcyA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19pcGVfcGFyYW1zX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0Qml0UmF0ZSgpIHsKKyAgICBpdmVfY3RsX3NldF9iaXRyYXRlX2lwX3Qgc19iaXRyYXRlX2lwOworICAgIGl2ZV9jdGxfc2V0X2JpdHJhdGVfb3BfdCBzX2JpdHJhdGVfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19iaXRyYXRlX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19iaXRyYXRlX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9CSVRSQVRFOworCisgICAgc19iaXRyYXRlX2lwLnU0X3RhcmdldF9iaXRyYXRlID0gbUJpdHJhdGUtPnZhbHVlOworCisgICAgc19iaXRyYXRlX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19iaXRyYXRlX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfYml0cmF0ZV9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2JpdHJhdGVfaXBfdCk7CisgICAgc19iaXRyYXRlX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfYml0cmF0ZV9vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19iaXRyYXRlX2lwLCAmc19iaXRyYXRlX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgYml0IHJhdGUgPSAweCV4XG4iLCBzX2JpdHJhdGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRGcmFtZVR5cGUoSVZfUElDVFVSRV9DT0RJTkdfVFlQRV9UIGVfZnJhbWVfdHlwZSkgeworICAgIGl2ZV9jdGxfc2V0X2ZyYW1lX3R5cGVfaXBfdCBzX2ZyYW1lX3R5cGVfaXA7CisgICAgaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9vcF90IHNfZnJhbWVfdHlwZV9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgc19mcmFtZV90eXBlX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19mcmFtZV90eXBlX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9GUkFNRVRZUEU7CisKKyAgICBzX2ZyYW1lX3R5cGVfaXAuZV9mcmFtZV90eXBlID0gZV9mcmFtZV90eXBlOworCisgICAgc19mcmFtZV90eXBlX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19mcmFtZV90eXBlX2lwLnU0X3RpbWVzdGFtcF9sb3cgPSAtMTsKKworICAgIHNfZnJhbWVfdHlwZV9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2ZyYW1lX3R5cGVfaXBfdCk7CisgICAgc19mcmFtZV90eXBlX29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZnJhbWVfdHlwZV9vcF90KTsKKworICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19mcmFtZV90eXBlX2lwLCAmc19mcmFtZV90eXBlX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgZnJhbWUgdHlwZSA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19mcmFtZV90eXBlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0UXAoKSB7CisgICAgaXZlX2N0bF9zZXRfcXBfaXBfdCBzX3FwX2lwOworICAgIGl2ZV9jdGxfc2V0X3FwX29wX3Qgc19xcF9vcDsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisKKyAgICBzX3FwX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19xcF9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfUVA7CisKKyAgICBzX3FwX2lwLnU0X2lfcXAgPSBERUZBVUxUX0lfUVA7CisgICAgc19xcF9pcC51NF9pX3FwX21heCA9IERFRkFVTFRfUVBfTUFYOworICAgIHNfcXBfaXAudTRfaV9xcF9taW4gPSBERUZBVUxUX1FQX01JTjsKKworICAgIHNfcXBfaXAudTRfcF9xcCA9IERFRkFVTFRfUF9RUDsKKyAgICBzX3FwX2lwLnU0X3BfcXBfbWF4ID0gREVGQVVMVF9RUF9NQVg7CisgICAgc19xcF9pcC51NF9wX3FwX21pbiA9IERFRkFVTFRfUVBfTUlOOworCisgICAgc19xcF9pcC51NF9iX3FwID0gREVGQVVMVF9QX1FQOworICAgIHNfcXBfaXAudTRfYl9xcF9tYXggPSBERUZBVUxUX1FQX01BWDsKKyAgICBzX3FwX2lwLnU0X2JfcXBfbWluID0gREVGQVVMVF9RUF9NSU47CisKKyAgICBzX3FwX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19xcF9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX3FwX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfcXBfaXBfdCk7CisgICAgc19xcF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3FwX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX3FwX2lwLCAmc19xcF9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IHFwIDB4JXhcbiIsIHNfcXBfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRFbmNNb2RlKElWRV9FTkNfTU9ERV9UIGVfZW5jX21vZGUpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfZW5jX21vZGVfaXBfdCBzX2VuY19tb2RlX2lwOworICAgIGl2ZV9jdGxfc2V0X2VuY19tb2RlX29wX3Qgc19lbmNfbW9kZV9vcDsKKworICAgIHNfZW5jX21vZGVfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2VuY19tb2RlX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9FTkNfTU9ERTsKKworICAgIHNfZW5jX21vZGVfaXAuZV9lbmNfbW9kZSA9IGVfZW5jX21vZGU7CisKKyAgICBzX2VuY19tb2RlX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19lbmNfbW9kZV9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2VuY19tb2RlX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZW5jX21vZGVfaXBfdCk7CisgICAgc19lbmNfbW9kZV9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2VuY19tb2RlX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2VuY19tb2RlX2lwLCAmc19lbmNfbW9kZV9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGluIGhlYWRlciBlbmNvZGUgbW9kZSA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgc19lbmNfbW9kZV9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldFZidlBhcmFtcygpIHsKKyAgICBpdmVfY3RsX3NldF92YnZfcGFyYW1zX2lwX3Qgc192YnZfaXA7CisgICAgaXZlX2N0bF9zZXRfdmJ2X3BhcmFtc19vcF90IHNfdmJ2X29wOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfdmJ2X2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc192YnZfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX1ZCVl9QQVJBTVM7CisKKyAgICBzX3Zidl9pcC51NF92YnZfYnVmX3NpemUgPSAwOworICAgIHNfdmJ2X2lwLnU0X3Zidl9idWZmZXJfZGVsYXkgPSAxMDAwOworCisgICAgc192YnZfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX3Zidl9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX3Zidl9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3Zidl9wYXJhbXNfaXBfdCk7CisgICAgc192YnZfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF92YnZfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX3Zidl9pcCwgJnNfdmJ2X29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgVkJWIHBhcmFtcyA9IDB4JXhcbiIsIHNfdmJ2X29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0QWlyUGFyYW1zKCkgeworICAgIGl2ZV9jdGxfc2V0X2Fpcl9wYXJhbXNfaXBfdCBzX2Fpcl9pcDsKKyAgICBpdmVfY3RsX3NldF9haXJfcGFyYW1zX29wX3Qgc19haXJfb3A7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworCisgICAgc19haXJfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2Fpcl9pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfQUlSX1BBUkFNUzsKKworICAgIHNfYWlyX2lwLmVfYWlyX21vZGUgPQorICAgICAgICAobUludHJhUmVmcmVzaC0+bW9kZSA9PSBDMkNvbmZpZzo6SU5UUkFfUkVGUkVTSF9ESVNBQkxFRCB8fCBtSW50cmFSZWZyZXNoLT5wZXJpb2QgPCAxKQorICAgICAgICAgICAgPyBJVkVfQUlSX01PREVfTk9ORSA6IElWRV9BSVJfTU9ERV9DWUNMSUM7CisgICAgc19haXJfaXAudTRfYWlyX3JlZnJlc2hfcGVyaW9kID0gbUludHJhUmVmcmVzaC0+cGVyaW9kOworCisgICAgc19haXJfaXAudTRfdGltZXN0YW1wX2hpZ2ggPSAtMTsKKyAgICBzX2Fpcl9pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2Fpcl9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2Fpcl9wYXJhbXNfaXBfdCk7CisgICAgc19haXJfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9haXJfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2Fpcl9pcCwgJnNfYWlyX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgYWlyIHBhcmFtcyA9IDB4JXhcbiIsIHNfYWlyX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6c2V0TWVQYXJhbXMoKSB7CisgICAgSVZfU1RBVFVTX1Qgc3RhdHVzOworICAgIGl2ZV9jdGxfc2V0X21lX3BhcmFtc19pcF90IHNfbWVfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X21lX3BhcmFtc19vcF90IHNfbWVfcGFyYW1zX29wOworCisgICAgc19tZV9wYXJhbXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX21lX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkVfQ01EX0NUTF9TRVRfTUVfUEFSQU1TOworCisgICAgc19tZV9wYXJhbXNfaXAudTRfZW5hYmxlX2Zhc3Rfc2FkID0gbUVuYWJsZUZhc3RTYWQ7CisgICAgc19tZV9wYXJhbXNfaXAudTRfZW5hYmxlX2FsdF9yZWYgPSBtRW5hYmxlQWx0UmVmOworCisgICAgc19tZV9wYXJhbXNfaXAudTRfZW5hYmxlX2hwZWwgPSBtSGFsZlBlbEVuYWJsZTsKKyAgICBzX21lX3BhcmFtc19pcC51NF9lbmFibGVfcXBlbCA9IERFRkFVTFRfUVBFTDsKKyAgICBzX21lX3BhcmFtc19pcC51NF9tZV9zcGVlZF9wcmVzZXQgPSBERUZBVUxUX01FX1NQRUVEOworICAgIHNfbWVfcGFyYW1zX2lwLnU0X3NyY2hfcm5nX3ggPSBERUZBVUxUX1NSQ0hfUk5HX1g7CisgICAgc19tZV9wYXJhbXNfaXAudTRfc3JjaF9ybmdfeSA9IERFRkFVTFRfU1JDSF9STkdfWTsKKworICAgIHNfbWVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19tZV9wYXJhbXNfaXAudTRfdGltZXN0YW1wX2xvdyA9IC0xOworCisgICAgc19tZV9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9tZV9wYXJhbXNfaXBfdCk7CisgICAgc19tZV9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9tZV9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfbWVfcGFyYW1zX2lwLCAmc19tZV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHNldCBtZSBwYXJhbXMgPSAweCV4XG4iLCBzX21lX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldEdvcFBhcmFtcygpIHsKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfZ29wX3BhcmFtc19pcF90IHNfZ29wX3BhcmFtc19pcDsKKyAgICBpdmVfY3RsX3NldF9nb3BfcGFyYW1zX29wX3Qgc19nb3BfcGFyYW1zX29wOworCisgICAgc19nb3BfcGFyYW1zX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19nb3BfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9HT1BfUEFSQU1TOworCisgICAgc19nb3BfcGFyYW1zX2lwLnU0X2lfZnJtX2ludGVydmFsID0gbUlJbnRlcnZhbDsKKyAgICBzX2dvcF9wYXJhbXNfaXAudTRfaWRyX2ZybV9pbnRlcnZhbCA9IG1JRFJJbnRlcnZhbDsKKworICAgIHNfZ29wX3BhcmFtc19pcC51NF90aW1lc3RhbXBfaGlnaCA9IC0xOworICAgIHNfZ29wX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2dvcF9wYXJhbXNfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX3NldF9nb3BfcGFyYW1zX2lwX3QpOworICAgIHNfZ29wX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2dvcF9wYXJhbXNfb3BfdCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZ29wX3BhcmFtc19pcCwgJnNfZ29wX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IEdPUCBwYXJhbXMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZ29wX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnNldFByb2ZpbGVQYXJhbXMoKSB7CisgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgaXZlX2N0bF9zZXRfcHJvZmlsZV9wYXJhbXNfaXBfdCBzX3Byb2ZpbGVfcGFyYW1zX2lwOworICAgIGl2ZV9jdGxfc2V0X3Byb2ZpbGVfcGFyYW1zX29wX3Qgc19wcm9maWxlX3BhcmFtc19vcDsKKworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAuZV9jbWQgPSBJVkVfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRV9DTURfQ1RMX1NFVF9QUk9GSUxFX1BBUkFNUzsKKworICAgIHNfcHJvZmlsZV9wYXJhbXNfaXAuZV9wcm9maWxlID0gbUludGYtPmdldFByb2ZpbGVfbCgpOworICAgIGlmIChzX3Byb2ZpbGVfcGFyYW1zX2lwLmVfcHJvZmlsZSA9PSBJVl9QUk9GSUxFX0JBU0UpIHsKKyAgICAgICAgc19wcm9maWxlX3BhcmFtc19pcC51NF9lbnRyb3B5X2NvZGluZ19tb2RlID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X2VudHJvcHlfY29kaW5nX21vZGUgPSAxOworICAgIH0KKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19wcm9maWxlX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX3Byb2ZpbGVfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfcHJvZmlsZV9wYXJhbXNfaXBfdCk7CisgICAgc19wcm9maWxlX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X3Byb2ZpbGVfcGFyYW1zX29wX3QpOworICAgIGxvY2sudW5sb2NrKCk7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfcHJvZmlsZV9wYXJhbXNfaXAsICZzX3Byb2ZpbGVfcGFyYW1zX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzZXQgcHJvZmlsZSBwYXJhbXMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfcHJvZmlsZV9wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXREZWJsb2NrUGFyYW1zKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBpdmVfY3RsX3NldF9kZWJsb2NrX3BhcmFtc19pcF90IHNfZGVibG9ja19wYXJhbXNfaXA7CisgICAgaXZlX2N0bF9zZXRfZGVibG9ja19wYXJhbXNfb3BfdCBzX2RlYmxvY2tfcGFyYW1zX29wOworCisgICAgc19kZWJsb2NrX3BhcmFtc19pcC5lX2NtZCA9IElWRV9DTURfVklERU9fQ1RMOworICAgIHNfZGVibG9ja19wYXJhbXNfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfU0VUX0RFQkxPQ0tfUEFSQU1TOworCisgICAgc19kZWJsb2NrX3BhcmFtc19pcC51NF9kaXNhYmxlX2RlYmxvY2tfbGV2ZWwgPSBtRGlzYWJsZURlYmxrTGV2ZWw7CisKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLnU0X3RpbWVzdGFtcF9oaWdoID0gLTE7CisgICAgc19kZWJsb2NrX3BhcmFtc19pcC51NF90aW1lc3RhbXBfbG93ID0gLTE7CisKKyAgICBzX2RlYmxvY2tfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZlX2N0bF9zZXRfZGVibG9ja19wYXJhbXNfaXBfdCk7CisgICAgc19kZWJsb2NrX3BhcmFtc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfc2V0X2RlYmxvY2tfcGFyYW1zX29wX3QpOworCisgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2RlYmxvY2tfcGFyYW1zX2lwLCAmc19kZWJsb2NrX3BhcmFtc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZW5hYmxlL2Rpc2FibGUgZGVibG9jayBwYXJhbXMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfZGVibG9ja19wYXJhbXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRBdmNFbmM6OmxvZ1ZlcnNpb24oKSB7CisgICAgaXZlX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90IHNfY3RsX2lwOworICAgIGl2ZV9jdGxfZ2V0dmVyc2lvbmluZm9fb3BfdCBzX2N0bF9vcDsKKyAgICBVV09SRDggYXUxX2J1Zls1MTJdOworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKworICAgIHNfY3RsX2lwLmVfY21kID0gSVZFX0NNRF9WSURFT19DVEw7CisgICAgc19jdGxfaXAuZV9zdWJfY21kID0gSVZFX0NNRF9DVExfR0VUVkVSU0lPTjsKKyAgICBzX2N0bF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZV9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCk7CisgICAgc19jdGxfb3AudTRfc2l6ZSA9IHNpemVvZihpdmVfY3RsX2dldHZlcnNpb25pbmZvX29wX3QpOworICAgIHNfY3RsX2lwLnB1MV92ZXJzaW9uID0gYXUxX2J1ZjsKKyAgICBzX2N0bF9pcC51NF92ZXJzaW9uX2J1ZnNpemUgPSBzaXplb2YoYXUxX2J1Zik7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgKHZvaWQgKikgJnNfY3RsX2lwLCAodm9pZCAqKSAmc19jdGxfb3ApOworCisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBpbiBnZXR0aW5nIHZlcnNpb246IDB4JXgiLCBzX2N0bF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiSXR0aWFtIGVuY29kZXIgdmVyc2lvbjogJXMiLCAoY2hhciAqKXNfY3RsX2lwLnB1MV92ZXJzaW9uKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OmluaXRFbmNvZGVyKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1czsKKyAgICBXT1JEMzIgbGV2ZWw7CisKKyAgICBDSEVDSyghbVN0YXJ0ZWQpOworCisgICAgYzJfc3RhdHVzX3QgZXJyVHlwZSA9IEMyX09LOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ+IGdvcDsKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBtU2l6ZSA9IG1JbnRmLT5nZXRTaXplX2woKTsKKyAgICAgICAgbUJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIG1GcmFtZVJhdGUgPSBtSW50Zi0+Z2V0RnJhbWVSYXRlX2woKTsKKyAgICAgICAgbUludHJhUmVmcmVzaCA9IG1JbnRmLT5nZXRJbnRyYVJlZnJlc2hfbCgpOworICAgICAgICBtQVZDRW5jTGV2ZWwgPSBtSW50Zi0+Z2V0TGV2ZWxfbCgpOworICAgICAgICBtSUludGVydmFsID0gbUludGYtPmdldFN5bmNGcmFtZVBlcmlvZF9sKCk7CisgICAgICAgIG1JRFJJbnRlcnZhbCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2RfbCgpOworICAgICAgICBnb3AgPSBtSW50Zi0+Z2V0R29wX2woKTsKKyAgICB9CisgICAgaWYgKGdvcCAmJiBnb3AtPmZsZXhDb3VudCgpID4gMCkgeworICAgICAgICB1aW50MzJfdCBzeW5jSW50ZXJ2YWwgPSAxOworICAgICAgICB1aW50MzJfdCBpSW50ZXJ2YWwgPSAxOworICAgICAgICB1aW50MzJfdCBtYXhCZnJhbWVzID0gMDsKKyAgICAgICAgUGFyc2VHb3AoKmdvcCwgJnN5bmNJbnRlcnZhbCwgJmlJbnRlcnZhbCwgJm1heEJmcmFtZXMpOworICAgICAgICBpZiAoc3luY0ludGVydmFsID4gMCkgeworICAgICAgICAgICAgQUxPR0QoIlVwZGF0aW5nIElEUiBpbnRlcnZhbCBmcm9tIEdPUDogb2xkICV1IG5ldyAldSIsIG1JRFJJbnRlcnZhbCwgc3luY0ludGVydmFsKTsKKyAgICAgICAgICAgIG1JRFJJbnRlcnZhbCA9IHN5bmNJbnRlcnZhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaUludGVydmFsID4gMCkgeworICAgICAgICAgICAgQUxPR0QoIlVwZGF0aW5nIEkgaW50ZXJ2YWwgZnJvbSBHT1A6IG9sZCAldSBuZXcgJXUiLCBtSUludGVydmFsLCBpSW50ZXJ2YWwpOworICAgICAgICAgICAgbUlJbnRlcnZhbCA9IGlJbnRlcnZhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAobUJmcmFtZXMgIT0gbWF4QmZyYW1lcykgeworICAgICAgICAgICAgQUxPR0QoIlVwZGF0aW5nIG1heCBCIGZyYW1lcyBmcm9tIEdPUDogb2xkICV1IG5ldyAldSIsIG1CZnJhbWVzLCBtYXhCZnJhbWVzKTsKKyAgICAgICAgICAgIG1CZnJhbWVzID0gbWF4QmZyYW1lczsKKyAgICAgICAgfQorICAgIH0KKyAgICB1aW50MzJfdCB3aWR0aCA9IG1TaXplLT53aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQgPSBtU2l6ZS0+aGVpZ2h0OworCisgICAgbVN0cmlkZSA9IHdpZHRoOworCisgICAgLy8gQXNzdW1lIHdvcnN0IGNhc2Ugb3V0cHV0IGJ1ZmZlciBzaXplIHRvIGJlIGVxdWFsIHRvIG51bWJlciBvZiBieXRlcyBpbiBpbnB1dAorICAgIG1PdXRCdWZmZXJTaXplID0gc3RkOjptYXgod2lkdGggKiBoZWlnaHQgKiAzIC8gMiwga01pbk91dEJ1ZmZlclNpemUpOworCisgICAgLy8gVE9ETworICAgIG1JdlZpZGVvQ29sb3JGb3JtYXQgPSBJVl9ZVVZfNDIwUDsKKworICAgIEFMT0dEKCJQYXJhbXMgd2lkdGggJWQgaGVpZ2h0ICVkIGxldmVsICVkIGNvbG9yRm9ybWF0ICVkIGJmcmFtZXMgJWQiLCB3aWR0aCwKKyAgICAgICAgICAgIGhlaWdodCwgbUFWQ0VuY0xldmVsLCBtSXZWaWRlb0NvbG9yRm9ybWF0LCBtQmZyYW1lcyk7CisKKyAgICAvKiBHZXR0aW5nIE51bWJlciBvZiBNZW1SZWNvcmRzICovCisgICAgeworICAgICAgICBpdl9udW1fbWVtX3JlY19pcF90IHNfbnVtX21lbV9yZWNfaXA7CisgICAgICAgIGl2X251bV9tZW1fcmVjX29wX3Qgc19udW1fbWVtX3JlY19vcDsKKworICAgICAgICBzX251bV9tZW1fcmVjX2lwLnU0X3NpemUgPSBzaXplb2YoaXZfbnVtX21lbV9yZWNfaXBfdCk7CisgICAgICAgIHNfbnVtX21lbV9yZWNfb3AudTRfc2l6ZSA9IHNpemVvZihpdl9udW1fbWVtX3JlY19vcF90KTsKKworICAgICAgICBzX251bV9tZW1fcmVjX2lwLmVfY21kID0gSVZfQ01EX0dFVF9OVU1fTUVNX1JFQzsKKworICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG51bGxwdHIsICZzX251bV9tZW1fcmVjX2lwLCAmc19udW1fbWVtX3JlY19vcCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiR2V0IG51bWJlciBvZiBtZW1vcnkgcmVjb3JkcyBmYWlsZWQgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICBzX251bV9tZW1fcmVjX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorCisgICAgICAgIG1OdW1NZW1SZWNvcmRzID0gc19udW1fbWVtX3JlY19vcC51NF9udW1fbWVtX3JlYzsKKyAgICB9CisKKyAgICAvKiBBbGxvY2F0ZSBhcnJheSB0byBob2xkIG1lbW9yeSByZWNvcmRzICovCisgICAgaWYgKG1OdW1NZW1SZWNvcmRzID4gU0laRV9NQVggLyBzaXplb2YoaXZfbWVtX3JlY190KSkgeworICAgICAgICBBTE9HRSgicmVxdWVzdGVkIG1lbW9yeSBzaXplIGlzIHRvbyBiaWcuIik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIG1NZW1SZWNvcmRzID0gKGl2X21lbV9yZWNfdCAqKW1hbGxvYyhtTnVtTWVtUmVjb3JkcyAqIHNpemVvZihpdl9tZW1fcmVjX3QpKTsKKyAgICBpZiAobnVsbHB0ciA9PSBtTWVtUmVjb3JkcykgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGFsbG9jYXRlIG1lbW9yeSBmb3IgaG9sZCBtZW1vcnkgcmVjb3JkczogU2l6ZSAlenUiLAorICAgICAgICAgICAgICAgIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIHsKKyAgICAgICAgaXZfbWVtX3JlY190ICpwc19tZW1fcmVjOworICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykgeworICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfc2l6ZSA9IHNpemVvZihpdl9tZW1fcmVjX3QpOworICAgICAgICAgICAgcHNfbWVtX3JlYy0+cHZfYmFzZSA9IG51bGxwdHI7CisgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSA9IDA7CisgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fYWxpZ25tZW50ID0gMDsKKyAgICAgICAgICAgIHBzX21lbV9yZWMtPmVfbWVtX3R5cGUgPSBJVl9OQV9NRU1fVFlQRTsKKworICAgICAgICAgICAgcHNfbWVtX3JlYysrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogR2V0dGluZyBNZW1SZWNvcmRzIEF0dHJpYnV0ZXMgKi8KKyAgICB7CisgICAgICAgIGl2X2ZpbGxfbWVtX3JlY19pcF90IHNfZmlsbF9tZW1fcmVjX2lwOworICAgICAgICBpdl9maWxsX21lbV9yZWNfb3BfdCBzX2ZpbGxfbWVtX3JlY19vcDsKKworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9zaXplID0gc2l6ZW9mKGl2X2ZpbGxfbWVtX3JlY19pcF90KTsKKyAgICAgICAgc19maWxsX21lbV9yZWNfb3AudTRfc2l6ZSA9IHNpemVvZihpdl9maWxsX21lbV9yZWNfb3BfdCk7CisKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAuZV9jbWQgPSBJVl9DTURfRklMTF9OVU1fTUVNX1JFQzsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAucHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9udW1fbWVtX3JlYyA9IG1OdW1NZW1SZWNvcmRzOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfd2QgPSB3aWR0aDsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X2h0ID0gaGVpZ2h0OworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfbGV2ZWwgPSBtQVZDRW5jTGV2ZWw7CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLmVfY29sb3JfZm9ybWF0ID0gREVGQVVMVF9JTlBfQ09MT1JfRk9STUFUOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfcmVmX2NudCA9IERFRkFVTFRfTUFYX1JFRl9GUk07CisgICAgICAgIHNfZmlsbF9tZW1fcmVjX2lwLnU0X21heF9yZW9yZGVyX2NudCA9IERFRkFVTFRfTUFYX1JFT1JERVJfRlJNOworICAgICAgICBzX2ZpbGxfbWVtX3JlY19pcC51NF9tYXhfc3JjaF9ybmdfeCA9IERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWDsKKyAgICAgICAgc19maWxsX21lbV9yZWNfaXAudTRfbWF4X3NyY2hfcm5nX3kgPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1k7CisKKyAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihudWxscHRyLCAmc19maWxsX21lbV9yZWNfaXAsICZzX2ZpbGxfbWVtX3JlY19vcCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiRmlsbCBtZW1vcnkgcmVjb3JkcyBmYWlsZWQgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgICAgICBzX2ZpbGxfbWVtX3JlY19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBBbGxvY2F0aW5nIE1lbW9yeSBmb3IgTWVtIFJlY29yZHMgKi8KKyAgICB7CisgICAgICAgIFdPUkQzMiB0b3RhbF9zaXplOworICAgICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CisgICAgICAgIHRvdGFsX3NpemUgPSAwOworICAgICAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtTWVtUmVjb3JkczsgaSsrKSB7CisgICAgICAgICAgICBwc19tZW1fcmVjLT5wdl9iYXNlID0gaXZlX2FsaWduZWRfbWFsbG9jKAorICAgICAgICAgICAgICAgICAgICBwc19tZW1fcmVjLT51NF9tZW1fYWxpZ25tZW50LCBwc19tZW1fcmVjLT51NF9tZW1fc2l6ZSk7CisgICAgICAgICAgICBpZiAocHNfbWVtX3JlYy0+cHZfYmFzZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSBmb3IgbWVtIHJlY29yZCBpZCAlenUgc2l6ZSAldVxuIiwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0b3RhbF9zaXplICs9IHBzX21lbV9yZWMtPnU0X21lbV9zaXplOworCisgICAgICAgICAgICBwc19tZW1fcmVjKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBDb2RlYyBJbnN0YW5jZSBDcmVhdGlvbiAqLworICAgIHsKKyAgICAgICAgaXZlX2luaXRfaXBfdCBzX2luaXRfaXA7CisgICAgICAgIGl2ZV9pbml0X29wX3Qgc19pbml0X29wOworCisgICAgICAgIG1Db2RlY0N0eCA9IChpdl9vYmpfdCAqKW1NZW1SZWNvcmRzWzBdLnB2X2Jhc2U7CisgICAgICAgIG1Db2RlY0N0eC0+dTRfc2l6ZSA9IHNpemVvZihpdl9vYmpfdCk7CisgICAgICAgIG1Db2RlY0N0eC0+cHZfZnhucyA9ICh2b2lkICopaXZlX2FwaV9mdW5jdGlvbjsKKworICAgICAgICBzX2luaXRfaXAudTRfc2l6ZSA9IHNpemVvZihpdmVfaW5pdF9pcF90KTsKKyAgICAgICAgc19pbml0X29wLnU0X3NpemUgPSBzaXplb2YoaXZlX2luaXRfb3BfdCk7CisKKyAgICAgICAgc19pbml0X2lwLmVfY21kID0gSVZfQ01EX0lOSVQ7CisgICAgICAgIHNfaW5pdF9pcC51NF9udW1fbWVtX3JlYyA9IG1OdW1NZW1SZWNvcmRzOworICAgICAgICBzX2luaXRfaXAucHNfbWVtX3JlYyA9IG1NZW1SZWNvcmRzOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X3dkID0gd2lkdGg7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfaHQgPSBoZWlnaHQ7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfcmVmX2NudCA9IERFRkFVTFRfTUFYX1JFRl9GUk07CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfcmVvcmRlcl9jbnQgPSBERUZBVUxUX01BWF9SRU9SREVSX0ZSTTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9sZXZlbCA9IG1BVkNFbmNMZXZlbDsKKyAgICAgICAgc19pbml0X2lwLmVfaW5wX2NvbG9yX2ZtdCA9IG1JdlZpZGVvQ29sb3JGb3JtYXQ7CisKKyAgICAgICAgaWYgKG1SZWNvbkVuYWJsZSB8fCBtUFNOUkVuYWJsZSkgeworICAgICAgICAgICAgc19pbml0X2lwLnU0X2VuYWJsZV9yZWNvbiA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzX2luaXRfaXAudTRfZW5hYmxlX3JlY29uID0gMDsKKyAgICAgICAgfQorICAgICAgICBzX2luaXRfaXAuZV9yZWNvbl9jb2xvcl9mbXQgPSBERUZBVUxUX1JFQ09OX0NPTE9SX0ZPUk1BVDsKKyAgICAgICAgc19pbml0X2lwLmVfcmNfbW9kZSA9IERFRkFVTFRfUkNfTU9ERTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9mcmFtZXJhdGUgPSBERUZBVUxUX01BWF9GUkFNRVJBVEU7CisgICAgICAgIHNfaW5pdF9pcC51NF9tYXhfYml0cmF0ZSA9IERFRkFVTFRfTUFYX0JJVFJBVEU7CisgICAgICAgIHNfaW5pdF9pcC51NF9udW1fYmZyYW1lcyA9IG1CZnJhbWVzOworICAgICAgICBzX2luaXRfaXAuZV9jb250ZW50X3R5cGUgPSBJVl9QUk9HUkVTU0lWRTsKKyAgICAgICAgc19pbml0X2lwLnU0X21heF9zcmNoX3JuZ194ID0gREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9YOworICAgICAgICBzX2luaXRfaXAudTRfbWF4X3NyY2hfcm5nX3kgPSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1k7CisgICAgICAgIHNfaW5pdF9pcC5lX3NsaWNlX21vZGUgPSBtU2xpY2VNb2RlOworICAgICAgICBzX2luaXRfaXAudTRfc2xpY2VfcGFyYW0gPSBtU2xpY2VQYXJhbTsKKyAgICAgICAgc19pbml0X2lwLmVfYXJjaCA9IG1BcmNoOworICAgICAgICBzX2luaXRfaXAuZV9zb2MgPSBERUZBVUxUX1NPQzsKKworICAgICAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfaW5pdF9pcCwgJnNfaW5pdF9vcCk7CisKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgICAgICBBTE9HRSgiSW5pdCBlbmNvZGVyIGZhaWxlZCA9IDB4JXhcbiIsIHNfaW5pdF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBHZXQgQ29kZWMgVmVyc2lvbiAqLworICAgIGxvZ1ZlcnNpb24oKTsKKworICAgIC8qIHNldCBwcm9jZXNzb3IgZGV0YWlscyAqLworICAgIHNldE51bUNvcmVzKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBGcmFtZSBkaW1lbnNpb25zICovCisgICAgc2V0RGltZW5zaW9ucygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgRnJhbWUgcmF0ZXMgKi8KKyAgICBzZXRGcmFtZVJhdGUoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IElQRSBQYXJhbXMgKi8KKyAgICBzZXRJcGVQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IEJpdHJhdGUgKi8KKyAgICBzZXRCaXRSYXRlKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBRUCAqLworICAgIHNldFFwKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBBSVIgcGFyYW1zICovCisgICAgc2V0QWlyUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBWQlYgcGFyYW1zICovCisgICAgc2V0VmJ2UGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBNb3Rpb24gZXN0aW1hdGlvbiBwYXJhbXMgKi8KKyAgICBzZXRNZVBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgR09QIHBhcmFtcyAqLworICAgIHNldEdvcFBhcmFtcygpOworCisgICAgLyogVmlkZW8gY29udHJvbCBTZXQgRGVibG9jayBwYXJhbXMgKi8KKyAgICBzZXREZWJsb2NrUGFyYW1zKCk7CisKKyAgICAvKiBWaWRlbyBjb250cm9sIFNldCBQcm9maWxlIHBhcmFtcyAqLworICAgIHNldFByb2ZpbGVQYXJhbXMoKTsKKworICAgIC8qIFZpZGVvIGNvbnRyb2wgU2V0IGluIEVuY29kZSBoZWFkZXIgbW9kZSAqLworICAgIHNldEVuY01vZGUoSVZFX0VOQ19NT0RFX0hFQURFUik7CisKKyAgICBBTE9HVigiaW5pdF9jb2RlYyBzdWNjZXNzZnVsbCIpOworCisgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkID0gZmFsc2U7CisgICAgbVN0YXJ0ZWQgPSB0cnVlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRBdmNFbmM6OnJlbGVhc2VFbmNvZGVyKCkgeworICAgIElWX1NUQVRVU19UIHN0YXR1cyA9IElWX1NVQ0NFU1M7CisgICAgaXZfcmV0cmlldmVfbWVtX3JlY19pcF90IHNfcmV0cmlldmVfbWVtX2lwOworICAgIGl2X3JldHJpZXZlX21lbV9yZWNfb3BfdCBzX3JldHJpZXZlX21lbV9vcDsKKyAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWM7CisKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBzX3JldHJpZXZlX21lbV9pcC51NF9zaXplID0gc2l6ZW9mKGl2X3JldHJpZXZlX21lbV9yZWNfaXBfdCk7CisgICAgc19yZXRyaWV2ZV9tZW1fb3AudTRfc2l6ZSA9IHNpemVvZihpdl9yZXRyaWV2ZV9tZW1fcmVjX29wX3QpOworICAgIHNfcmV0cmlldmVfbWVtX2lwLmVfY21kID0gSVZfQ01EX1JFVFJJRVZFX01FTVJFQzsKKyAgICBzX3JldHJpZXZlX21lbV9pcC5wc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisKKyAgICBzdGF0dXMgPSBpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfcmV0cmlldmVfbWVtX2lwLCAmc19yZXRyaWV2ZV9tZW1fb3ApOworCisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcmV0cmlldmUgbWVtb3J5IHJlY29yZHMgPSAweCV4XG4iLAorICAgICAgICAgICAgICAgIHNfcmV0cmlldmVfbWVtX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIC8qIEZyZWUgbWVtb3J5IHJlY29yZHMgKi8KKyAgICBwc19tZW1fcmVjID0gbU1lbVJlY29yZHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzX3JldHJpZXZlX21lbV9vcC51NF9udW1fbWVtX3JlY19maWxsZWQ7IGkrKykgeworICAgICAgICBpZiAocHNfbWVtX3JlYykgaXZlX2FsaWduZWRfZnJlZShwc19tZW1fcmVjLT5wdl9iYXNlKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgibWVtb3J5IHJlY29yZCBpcyBudWxsLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBwc19tZW1fcmVjKys7CisgICAgfQorCisgICAgaWYgKG1NZW1SZWNvcmRzKSBmcmVlKG1NZW1SZWNvcmRzKTsKKworICAgIC8vIGNsZWFyIG90aGVyIHBvaW50ZXJzIGludG8gdGhlIHNwYWNlIGJlaW5nIGZyZWUoKWQKKyAgICBtQ29kZWNDdHggPSBudWxscHRyOworCisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpzZXRFbmNvZGVBcmdzKAorICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX2lwX3QgKnBzX2VuY29kZV9pcCwKKyAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90ICpwc19lbmNvZGVfb3AsCisgICAgICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgKmNvbnN0IGlucHV0LAorICAgICAgICB1aW50OF90ICpiYXNlLAorICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwKKyAgICAgICAgdWludDY0X3Qgd29ya0luZGV4KSB7CisgICAgaXZfcmF3X2J1Zl90ICpwc19pbnBfcmF3X2J1ZjsKKyAgICBtZW1zZXQocHNfZW5jb2RlX2lwLCAwLCBzaXplb2YoKnBzX2VuY29kZV9pcCkpOworICAgIG1lbXNldChwc19lbmNvZGVfb3AsIDAsIHNpemVvZigqcHNfZW5jb2RlX29wKSk7CisKKyAgICBwc19pbnBfcmF3X2J1ZiA9ICZwc19lbmNvZGVfaXAtPnNfaW5wX2J1ZjsKKyAgICBwc19lbmNvZGVfaXAtPnNfb3V0X2J1Zi5wdl9idWYgPSBiYXNlOworICAgIHBzX2VuY29kZV9pcC0+c19vdXRfYnVmLnU0X2J5dGVzID0gMDsKKyAgICBwc19lbmNvZGVfaXAtPnNfb3V0X2J1Zi51NF9idWZzaXplID0gY2FwYWNpdHk7CisgICAgcHNfZW5jb2RlX2lwLT51NF9zaXplID0gc2l6ZW9mKGl2ZV92aWRlb19lbmNvZGVfaXBfdCk7CisgICAgcHNfZW5jb2RlX29wLT51NF9zaXplID0gc2l6ZW9mKGl2ZV92aWRlb19lbmNvZGVfb3BfdCk7CisKKyAgICBwc19lbmNvZGVfaXAtPmVfY21kID0gSVZFX0NNRF9WSURFT19FTkNPREU7CisgICAgcHNfZW5jb2RlX2lwLT5wdl9idWZzID0gbnVsbHB0cjsKKyAgICBwc19lbmNvZGVfaXAtPnB2X21iX2luZm8gPSBudWxscHRyOworICAgIHBzX2VuY29kZV9pcC0+cHZfcGljX2luZm8gPSBudWxscHRyOworICAgIHBzX2VuY29kZV9pcC0+dTRfbWJfaW5mb190eXBlID0gMDsKKyAgICBwc19lbmNvZGVfaXAtPnU0X3BpY19pbmZvX3R5cGUgPSAwOworICAgIHBzX2VuY29kZV9pcC0+dTRfaXNfbGFzdCA9IDA7CisgICAgcHNfZW5jb2RlX2lwLT51NF90aW1lc3RhbXBfaGlnaCA9IHdvcmtJbmRleCA+PiAzMjsKKyAgICBwc19lbmNvZGVfaXAtPnU0X3RpbWVzdGFtcF9sb3cgPSB3b3JrSW5kZXggJiAweEZGRkZGRkZGOworICAgIHBzX2VuY29kZV9vcC0+c19vdXRfYnVmLnB2X2J1ZiA9IG51bGxwdHI7CisKKyAgICAvKiBJbml0aWFsaXplIGNvbG9yIGZvcm1hdHMgKi8KKyAgICBtZW1zZXQocHNfaW5wX3Jhd19idWYsIDAsIHNpemVvZihpdl9yYXdfYnVmX3QpKTsKKyAgICBwc19pbnBfcmF3X2J1Zi0+dTRfc2l6ZSA9IHNpemVvZihpdl9yYXdfYnVmX3QpOworICAgIHBzX2lucF9yYXdfYnVmLT5lX2NvbG9yX2ZtdCA9IG1JdlZpZGVvQ29sb3JGb3JtYXQ7CisgICAgaWYgKGlucHV0ID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1TYXdJbnB1dEVPUykgeworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT51NF9pc19sYXN0ID0gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgaWYgKGlucHV0LT53aWR0aCgpIDwgbVNpemUtPndpZHRoIHx8CisgICAgICAgIGlucHV0LT5oZWlnaHQoKSA8IG1TaXplLT5oZWlnaHQpIHsKKyAgICAgICAgLyogRXhwZWN0IHdpZHRoIGhlaWdodCB0byBiZSBjb25maWd1cmVkICovCisgICAgICAgIEFMT0dXKCJ1bmV4cGVjdGVkIENhcGFjaXR5IEFzcGVjdCAlZCglZCkgeCAlZCglZCkiLCBpbnB1dC0+d2lkdGgoKSwKKyAgICAgICAgICAgICAgbVNpemUtPndpZHRoLCBpbnB1dC0+aGVpZ2h0KCksIG1TaXplLT5oZWlnaHQpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigid2lkdGggPSAlZCwgaGVpZ2h0ID0gJWQiLCBpbnB1dC0+d2lkdGgoKSwgaW5wdXQtPmhlaWdodCgpKTsKKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gaW5wdXQtPmxheW91dCgpOworICAgIHVpbnQ4X3QgKnlQbGFuZSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbnB1dC0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgdWludDhfdCAqdVBsYW5lID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGlucHV0LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgICB1aW50OF90ICp2UGxhbmUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5wdXQtPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOworICAgIGludDMyX3QgeVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldLnJvd0luYzsKKyAgICBpbnQzMl90IHVTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb3dJbmM7CisgICAgaW50MzJfdCB2U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ucm93SW5jOworCisgICAgdWludDMyX3Qgd2lkdGggPSBtU2l6ZS0+d2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0ID0gbVNpemUtPmhlaWdodDsKKyAgICAvLyB3aWR0aCBhbmQgaGVpZ2h0IGFyZSBhbHdheXMgZXZlbiAoYXMgYmxvY2sgc2l6ZSBpcyAxNngxNikKKyAgICBDSEVDS19FUSgod2lkdGggJiAxdSksIDB1KTsKKyAgICBDSEVDS19FUSgoaGVpZ2h0ICYgMXUpLCAwdSk7CisgICAgc2l6ZV90IHlQbGFuZVNpemUgPSB3aWR0aCAqIGhlaWdodDsKKworICAgIHN3aXRjaCAobGF5b3V0LnR5cGUpIHsKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0I6CisgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCQTogeworICAgICAgICAgICAgQUxPR1YoInlQbGFuZVNpemUgPSAlenUiLCB5UGxhbmVTaXplKTsKKyAgICAgICAgICAgIE1lbW9yeUJsb2NrIGNvbnZlcnNpb25CdWZmZXIgPSBtQ29udmVyc2lvbkJ1ZmZlcnMuZmV0Y2goeVBsYW5lU2l6ZSAqIDMgLyAyKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVtcGxhY2UoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksIGNvbnZlcnNpb25CdWZmZXIpOworICAgICAgICAgICAgeVBsYW5lID0gY29udmVyc2lvbkJ1ZmZlci5kYXRhKCk7CisgICAgICAgICAgICB1UGxhbmUgPSB5UGxhbmUgKyB5UGxhbmVTaXplOworICAgICAgICAgICAgdlBsYW5lID0gdVBsYW5lICsgeVBsYW5lU2l6ZSAvIDQ7CisgICAgICAgICAgICB5U3RyaWRlID0gd2lkdGg7CisgICAgICAgICAgICB1U3RyaWRlID0gdlN0cmlkZSA9IHlTdHJpZGUgLyAyOworICAgICAgICAgICAgQ29udmVydFJHQlRvUGxhbmFyWVVWKHlQbGFuZSwgeVN0cmlkZSwgaGVpZ2h0LCBjb252ZXJzaW9uQnVmZmVyLnNpemUoKSwgKmlucHV0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOiB7CisgICAgICAgICAgICBpZiAoIUlzWVVWNDIwKCppbnB1dCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiaW5wdXQgaXMgbm90IFlVVjQyMCIpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgICAgICAgICAmJiB1U3RyaWRlID09IHZTdHJpZGUKKyAgICAgICAgICAgICAgICAgICAgJiYgeVN0cmlkZSA9PSAyICogdlN0cmlkZSkgeworICAgICAgICAgICAgICAgIC8vIEk0MjAgY29tcGF0aWJsZSAtIGFscmVhZHkgc2V0IHVwIGFib3ZlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvcHkgdG8gSTQyMAorICAgICAgICAgICAgeVN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgdVN0cmlkZSA9IHZTdHJpZGUgPSB5U3RyaWRlIC8gMjsKKyAgICAgICAgICAgIE1lbW9yeUJsb2NrIGNvbnZlcnNpb25CdWZmZXIgPSBtQ29udmVyc2lvbkJ1ZmZlcnMuZmV0Y2goeVBsYW5lU2l6ZSAqIDMgLyAyKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVtcGxhY2UoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksIGNvbnZlcnNpb25CdWZmZXIpOworICAgICAgICAgICAgTWVkaWFJbWFnZTIgaW1nID0gQ3JlYXRlWVVWNDIwUGxhbmFyTWVkaWFJbWFnZTIod2lkdGgsIGhlaWdodCwgeVN0cmlkZSwgaGVpZ2h0KTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IEltYWdlQ29weShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwgJmltZywgKmlucHV0KTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQnVmZmVyIGNvbnZlcnNpb24gZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHlQbGFuZSA9IGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgdVBsYW5lID0geVBsYW5lICsgeVBsYW5lU2l6ZTsKKyAgICAgICAgICAgIHZQbGFuZSA9IHVQbGFuZSArIHlQbGFuZVNpemUgLyA0OworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQToKKyAgICAgICAgICAgIEFMT0dFKCJZVVZBIHBsYW5lIHR5cGUgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVucmVjb2duaXplZCBwbGFuZSB0eXBlOiAlZCIsIGxheW91dC50eXBlKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgc3dpdGNoIChtSXZWaWRlb0NvbG9yRm9ybWF0KSB7CisgICAgICAgIGNhc2UgSVZfWVVWXzQyMFA6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIGlucHV0IGJ1ZmZlciBpcyBzdXBwb3NlZCB0byBiZSBjb25zdCBidXQgSXR0aWFtIEFQSSB3YW50cyBiYXJlIHBvaW50ZXIuCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMF0gPSB5UGxhbmU7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMV0gPSB1UGxhbmU7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXB2X2J1ZnNbMl0gPSB2UGxhbmU7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfd2RbMF0gPSBpbnB1dC0+d2lkdGgoKTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfd2RbMV0gPSBpbnB1dC0+d2lkdGgoKSAvIDI7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3dkWzJdID0gaW5wdXQtPndpZHRoKCkgLyAyOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzBdID0gaW5wdXQtPmhlaWdodCgpOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9odFsxXSA9IGlucHV0LT5oZWlnaHQoKSAvIDI7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzJdID0gaW5wdXQtPmhlaWdodCgpIC8gMjsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9zdHJkWzBdID0geVN0cmlkZTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFsxXSA9IHVTdHJpZGU7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3N0cmRbMl0gPSB2U3RyaWRlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIElWX1lVVl80MjJJTEU6CisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgIC8vIHBzX2lucF9yYXdfYnVmLT5hcHZfYnVmc1swXSA9IHB1MV9idWY7CisgICAgICAgICAgICAvLyBwc19pbnBfcmF3X2J1Zi0+YXU0X3dkWzBdID0gbVdpZHRoICogMjsKKyAgICAgICAgICAgIC8vIHBzX2lucF9yYXdfYnVmLT5hdTRfaHRbMF0gPSBtSGVpZ2h0OworICAgICAgICAgICAgLy8gcHNfaW5wX3Jhd19idWYtPmF1NF9zdHJkWzBdID0gbVN0cmlkZSAqIDI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSVZfWVVWXzQyMFNQX1VWOgorICAgICAgICBjYXNlIElWX1lVVl80MjBTUF9WVToKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgeworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzBdID0geVBsYW5lOworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmFwdl9idWZzWzFdID0gdVBsYW5lOworCisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3dkWzBdID0gaW5wdXQtPndpZHRoKCk7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X3dkWzFdID0gaW5wdXQtPndpZHRoKCk7CisKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfaHRbMF0gPSBpbnB1dC0+aGVpZ2h0KCk7CisgICAgICAgICAgICBwc19pbnBfcmF3X2J1Zi0+YXU0X2h0WzFdID0gaW5wdXQtPmhlaWdodCgpIC8gMjsKKworICAgICAgICAgICAgcHNfaW5wX3Jhd19idWYtPmF1NF9zdHJkWzBdID0geVN0cmlkZTsKKyAgICAgICAgICAgIHBzX2lucF9yYXdfYnVmLT5hdTRfc3RyZFsxXSA9IHVTdHJpZGU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0QXZjRW5jOjpmaW5pc2hXb3JrKHVpbnQ2NF90IHdvcmtJbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX29wX3QgKnBzX2VuY29kZV9vcCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0KKyAgICAgICAgICAgIGNyZWF0ZUxpbmVhckJ1ZmZlcihtT3V0QmxvY2ssIDAsIHBzX2VuY29kZV9vcC0+c19vdXRfYnVmLnU0X2J5dGVzKTsKKyAgICBpZiAoSVZfSURSX0ZSQU1FID09IHBzX2VuY29kZV9vcC0+dTRfZW5jb2RlZF9mcmFtZV90eXBlKSB7CisgICAgICAgIEFMT0dWKCJJRFIgZnJhbWUgcHJvZHVjZWQiKTsKKyAgICAgICAgYnVmZmVyLT5zZXRJbmZvKHN0ZDo6bWFrZV9zaGFyZWQ8QzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgIDB1IC8qIHN0cmVhbSBpZCAqLywgQzJDb25maWc6OlNZTkNfRlJBTUUpKTsKKyAgICB9CisgICAgbU91dEJsb2NrID0gbnVsbHB0cjsKKworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KHdvcmtJbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgICAgICBpZiAobVNhd0lucHV0RU9TKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKHdvcmtJbmRleCwgZmlsbFdvcmspOworICAgIH0KK30KKwordm9pZCBDMlNvZnRBdmNFbmM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBJVl9TVEFUVVNfVCBzdGF0dXM7CisgICAgV09SRDMyIHRpbWVEZWxheSA9IDA7CisgICAgV09SRDMyIHRpbWVUYWtlbiA9IDA7CisgICAgdWludDY0X3Qgd29ya0luZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1bGwoKTsKKworICAgIC8vIEluaXRpYWxpemUgZW5jb2RlciBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXplZAorICAgIGlmIChtQ29kZWNDdHggPT0gbnVsbHB0cikgeworICAgICAgICBpZiAoQzJfT0sgIT0gaW5pdEVuY29kZXIoKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyB3aGlsZSAoIW1TYXdPdXRwdXRFT1MgJiYgIW91dFF1ZXVlLmVtcHR5KCkpIHsKKyAgICBjMl9zdGF0dXNfdCBlcnJvcjsKKyAgICBpdmVfdmlkZW9fZW5jb2RlX2lwX3Qgc19lbmNvZGVfaXA7CisgICAgaXZlX3ZpZGVvX2VuY29kZV9vcF90IHNfZW5jb2RlX29wOworICAgIG1lbXNldCgmc19lbmNvZGVfb3AsIDAsIHNpemVvZihzX2VuY29kZV9vcCkpOworCisgICAgaWYgKCFtU3BzUHBzSGVhZGVyUmVjZWl2ZWQpIHsKKyAgICAgICAgY29uc3RleHByIHVpbnQzMl90IGtIZWFkZXJMZW5ndGggPSBNSU5fU1RSRUFNX1NJWkU7CisgICAgICAgIHVpbnQ4X3QgaGVhZGVyW2tIZWFkZXJMZW5ndGhdOworICAgICAgICBlcnJvciA9IHNldEVuY29kZUFyZ3MoCisgICAgICAgICAgICAgICAgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3AsIG51bGxwdHIsIGhlYWRlciwga0hlYWRlckxlbmd0aCwgd29ya0luZGV4KTsKKyAgICAgICAgaWYgKGVycm9yICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgic2V0RW5jb2RlQXJncyBmYWlsZWQ6ICVkIiwgZXJyb3IpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gaXZlX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wKTsKKworICAgICAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFbmNvZGUgaGVhZGVyIGZhaWxlZCA9IDB4JXhcbiIsCisgICAgICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJCeXRlcyBHZW5lcmF0ZWQgaW4gaGVhZGVyICVkXG4iLAorICAgICAgICAgICAgICAgICAgICBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpOworICAgICAgICB9CisKKyAgICAgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkID0gdHJ1ZTsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gY3NkID0KKyAgICAgICAgICAgIEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKHNfZW5jb2RlX29wLnNfb3V0X2J1Zi51NF9ieXRlcywgMHUpOworICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGNzZC0+bS52YWx1ZSwgaGVhZGVyLCBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhzdGQ6Om1vdmUoY3NkKSk7CisKKyAgICAgICAgRFVNUF9UT19GSUxFKAorICAgICAgICAgICAgICAgIG1PdXRGaWxlLCBjc2QtPm0udmFsdWUsIGNzZC0+ZmxleENvdW50KCkpOworICAgICAgICBpZiAod29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaGFuZGxlIGR5bmFtaWMgY29uZmlnIHBhcmFtZXRlcnMKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1JbnRyYVJlZnJlc2hUdW5pbmc6Om91dHB1dD4gaW50cmFSZWZyZXNoID0gbUludGYtPmdldEludHJhUmVmcmVzaF9sKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gcmVxdWVzdFN5bmMgPSBtSW50Zi0+Z2V0UmVxdWVzdFN5bmNfbCgpOworICAgICAgICBsb2NrLnVubG9jaygpOworCisgICAgICAgIGlmIChiaXRyYXRlICE9IG1CaXRyYXRlKSB7CisgICAgICAgICAgICBtQml0cmF0ZSA9IGJpdHJhdGU7CisgICAgICAgICAgICBzZXRCaXRSYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoaW50cmFSZWZyZXNoICE9IG1JbnRyYVJlZnJlc2gpIHsKKyAgICAgICAgICAgIG1JbnRyYVJlZnJlc2ggPSBpbnRyYVJlZnJlc2g7CisgICAgICAgICAgICBzZXRBaXJQYXJhbXMoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXF1ZXN0U3luYyAhPSBtUmVxdWVzdFN5bmMpIHsKKyAgICAgICAgICAgIC8vIHdlIGNhbiBoYW5kbGUgSURSIGltbWVkaWF0ZWx5CisgICAgICAgICAgICBpZiAocmVxdWVzdFN5bmMtPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgLy8gdW5zZXQgcmVxdWVzdAorICAgICAgICAgICAgICAgIEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0IGNsZWFyU3luYygwdSwgQzJfRkFMU0UpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsgJmNsZWFyU3luYyB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkdvdCBzeW5jIHJlcXVlc3QiKTsKKyAgICAgICAgICAgICAgICBzZXRGcmFtZVR5cGUoSVZfSURSX0ZSQU1FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1SZXF1ZXN0U3luYyA9IHJlcXVlc3RTeW5jOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBtU2F3SW5wdXRFT1MgPSB0cnVlOworICAgIH0KKworICAgIC8qIEluIG5vcm1hbCBtb2RlLCBzdG9yZSBpbnB1dEJ1ZmZlckluZm8gYW5kIHRoaXMgd2lsbCBiZSByZXR1cm5lZAorICAgICAgIHdoZW4gZW5jb2RlciBjb25zdW1lcyB0aGlzIGlucHV0ICovCisgICAgLy8gaWYgKCFtSW5wdXREYXRhSXNNZXRhICYmIChpbnB1dEJ1ZmZlckluZm8gIT0gTlVMTCkpIHsKKyAgICAvLyAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSX0hFQURFUlM7IGkrKykgeworICAgIC8vICAgICAgICAgaWYgKE5VTEwgPT0gbUlucHV0QnVmZmVySW5mb1tpXSkgeworICAgIC8vICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlckluZm9baV0gPSBpbnB1dEJ1ZmZlckluZm87CisgICAgLy8gICAgICAgICAgICAgYnJlYWs7CisgICAgLy8gICAgICAgICB9CisgICAgLy8gICAgIH0KKyAgICAvLyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHZpZXc7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBpbnB1dEJ1ZmZlcjsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBpbnB1dEJ1ZmZlciA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF07CisgICAgICAgIHZpZXcgPSBzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IEMyR3JhcGhpY1ZpZXc+KAorICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkpOworICAgICAgICBpZiAodmlldy0+ZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZXJyID0gJWQiLCB2aWV3LT5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkbyB7CisgICAgICAgIGlmIChtU2F3SW5wdXRFT1MgJiYgd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSBicmVhazsKKyAgICAgICAgaWYgKCFtT3V0QmxvY2spIHsKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX07CisgICAgICAgICAgICAvLyBUT0RPOiBlcnJvciBoYW5kbGluZywgcHJvcGVyIHVzYWdlLCBldGMuCisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgIHBvb2wtPmZldGNoTGluZWFyQmxvY2sobU91dEJ1ZmZlclNpemUsIHVzYWdlLCAmbU91dEJsb2NrKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmV0Y2ggbGluZWFyIGJsb2NrIGVyciA9ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBlcnI7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGVyciA9ICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGVycm9yID0gc2V0RW5jb2RlQXJncygKKyAgICAgICAgICAgICAgICAmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCwgdmlldy5nZXQoKSwgd1ZpZXcuYmFzZSgpLCB3Vmlldy5jYXBhY2l0eSgpLCB3b3JrSW5kZXgpOworICAgICAgICBpZiAoZXJyb3IgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJzZXRFbmNvZGVBcmdzIGZhaWxlZCA6ICVkIiwgZXJyb3IpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycm9yOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIERVTVBfVE9fRklMRSgKKyAgICAgICAgLy8gICAgICAgICBtSW5GaWxlLCBzX2VuY29kZV9pcC5zX2lucF9idWYuYXB2X2J1ZnNbMF0sCisgICAgICAgIC8vICAgICAgICAgKG1IZWlnaHQgKiBtU3RyaWRlICogMyAvIDIpKTsKKworICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICAgICAgLyogQ29tcHV0ZSB0aW1lIGVsYXBzZWQgYmV0d2VlbiBlbmQgb2YgcHJldmlvdXMgZGVjb2RlKCkKKyAgICAgICAgICogdG8gc3RhcnQgb2YgY3VycmVudCBkZWNvZGUoKSAqLworICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIHRpbWVEZWxheSk7CisgICAgICAgIHN0YXR1cyA9IGl2ZV9hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCk7CisKKyAgICAgICAgaWYgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKSB7CisgICAgICAgICAgICBpZiAoKHNfZW5jb2RlX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSA9PSBJSDI2NEVfQklUU1RSRUFNX0JVRkZFUl9PVkVSRkxPVykgeworICAgICAgICAgICAgICAgIC8vIFRPRE86IHVzZSBJVkVfQ01EX0NUTF9HRVRCVUZJTkZPIGZvciBwcm9wZXIgbWF4IGlucHV0IHNpemU/CisgICAgICAgICAgICAgICAgbU91dEJ1ZmZlclNpemUgKj0gMjsKKyAgICAgICAgICAgICAgICBtT3V0QmxvY2sucmVzZXQoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dFKCJFbmNvZGUgRnJhbWUgZmFpbGVkID0gMHgleFxuIiwKKyAgICAgICAgICAgICAgICAgICAgc19lbmNvZGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKElWX1NVQ0NFU1MgIT0gc3RhdHVzKTsKKworICAgIC8vIEhvbGQgaW5wdXQgYnVmZmVyIHJlZmVyZW5jZQorICAgIGlmIChpbnB1dEJ1ZmZlcikgeworICAgICAgICBtQnVmZmVyc1tzX2VuY29kZV9pcC5zX2lucF9idWYuYXB2X2J1ZnNbMF1dID0gaW5wdXRCdWZmZXI7CisgICAgfQorCisgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOworICAgIC8qIENvbXB1dGUgdGltZSB0YWtlbiBmb3IgZGVjb2RlKCkgKi8KKyAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIHRpbWVUYWtlbik7CisKKyAgICBBTE9HVigidGltZVRha2VuPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgdGltZVRha2VuLCB0aW1lRGVsYXksCisgICAgICAgICAgICBzX2VuY29kZV9vcC5zX291dF9idWYudTRfYnl0ZXMpOworCisgICAgdm9pZCAqZnJlZWQgPSBzX2VuY29kZV9vcC5zX2lucF9idWYuYXB2X2J1ZnNbMF07CisgICAgLyogSWYgZW5jb2RlciBmcmVlcyB1cCBhbiBpbnB1dCBidWZmZXIsIG1hcmsgaXQgYXMgZnJlZSAqLworICAgIGlmIChmcmVlZCAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChtQnVmZmVycy5jb3VudChmcmVlZCkgPT0gMHUpIHsKKyAgICAgICAgICAgIEFMT0dEKCJidWZmZXIgbm90IHRyYWNrZWQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFJlbGVhc2UgaW5wdXQgYnVmZmVyIHJlZmVyZW5jZQorICAgICAgICAgICAgbUJ1ZmZlcnMuZXJhc2UoZnJlZWQpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZXJhc2UoZnJlZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHNfZW5jb2RlX29wLm91dHB1dF9wcmVzZW50KSB7CisgICAgICAgIGlmICghc19lbmNvZGVfb3Auc19vdXRfYnVmLnU0X2J5dGVzKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3I6IE91dHB1dCBwcmVzZW50IGJ1dCBieXRlcyBnZW5lcmF0ZWQgaXMgemVybyIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgdWludDY0X3Qgd29ya0lkID0gKCh1aW50NjRfdClzX2VuY29kZV9vcC51NF90aW1lc3RhbXBfaGlnaCA8PCAzMikgfAorICAgICAgICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLnU0X3RpbWVzdGFtcF9sb3c7CisgICAgICAgIGZpbmlzaFdvcmsod29ya0lkLCB3b3JrLCAmc19lbmNvZGVfb3ApOworICAgIH0KKyAgICBpZiAobVNhd0lucHV0RU9TKSB7CisgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEF2Y0VuYzo6ZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworCisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmICghbU91dEJsb2NrKSB7CisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0ge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEV9OworICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcsIHByb3BlciB1c2FnZSwgZXRjLgorICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICBwb29sLT5mZXRjaExpbmVhckJsb2NrKG1PdXRCdWZmZXJTaXplLCB1c2FnZSwgJm1PdXRCbG9jayk7CisgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImZldGNoIGxpbmVhciBibG9jayBlcnIgPSAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gZXJyOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBDMldyaXRlVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgaXZlX3ZpZGVvX2VuY29kZV9pcF90IHNfZW5jb2RlX2lwOworICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX29wX3Qgc19lbmNvZGVfb3A7CisgICAgICAgIGlmIChDMl9PSyAhPSBzZXRFbmNvZGVBcmdzKCZzX2VuY29kZV9pcCwgJnNfZW5jb2RlX29wLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3Vmlldy5iYXNlKCksIHdWaWV3LmNhcGFjaXR5KCksIDApKSB7CisgICAgICAgICAgICBBTE9HRSgic2V0RW5jb2RlQXJncyBmYWlsZWQgZm9yIGRyYWluSW50ZXJuYWwiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICAodm9pZClpdmVfYXBpX2Z1bmN0aW9uKG1Db2RlY0N0eCwgJnNfZW5jb2RlX2lwLCAmc19lbmNvZGVfb3ApOworCisgICAgICAgIHZvaWQgKmZyZWVkID0gc19lbmNvZGVfb3Auc19pbnBfYnVmLmFwdl9idWZzWzBdOworICAgICAgICAvKiBJZiBlbmNvZGVyIGZyZWVzIHVwIGFuIGlucHV0IGJ1ZmZlciwgbWFyayBpdCBhcyBmcmVlICovCisgICAgICAgIGlmIChmcmVlZCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAobUJ1ZmZlcnMuY291bnQoZnJlZWQpID09IDB1KSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImJ1ZmZlciBub3QgdHJhY2tlZCIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBSZWxlYXNlIGlucHV0IGJ1ZmZlciByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICBtQnVmZmVycy5lcmFzZShmcmVlZCk7CisgICAgICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZXJhc2UoZnJlZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHNfZW5jb2RlX29wLm91dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICB1aW50NjRfdCB3b3JrSWQgPSAoKHVpbnQ2NF90KXNfZW5jb2RlX29wLnU0X3RpbWVzdGFtcF9oaWdoIDw8IDMyKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNfZW5jb2RlX29wLnU0X3RpbWVzdGFtcF9sb3c7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHdvcmtJZCwgd29yaywgJnNfZW5jb2RlX29wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCAhPSAxdSkgeworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0QXZjRW5jOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworY2xhc3MgQzJTb2Z0QXZjRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEF2Y0VuY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdEF2Y0VuYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRBdmNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0QXZjRW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0QXZjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0QXZjRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0QXZjRW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9hdmMvQzJTb2Z0QXZjRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU1MDU1YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2F2Yy9DMlNvZnRBdmNFbmMuaApAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfQVZDX0VOQ19IX18KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0FWQ19FTkNfSF9fCisKKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJpaDI2NF90eXBlZGVmcy5oIgorI2luY2x1ZGUgIml2Mi5oIgorI2luY2x1ZGUgIml2ZTIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIENPREVDX01BWF9DT1JFUyAgICAgICAgICA0CisjZGVmaW5lIExFTl9TVEFUVVNfQlVGRkVSICAgICAgICAoMTAgICogMTAyNCkKKyNkZWZpbmUgTUFYX1ZCVl9CVUZGX1NJWkUgICAgICAgICgxMjAgKiAxNjM4NCkKKyNkZWZpbmUgTUFYX05VTV9JT19CVUZTICAgICAgICAgICAzCisjZGVmaW5lIE1BWF9CX0ZSQU1FUyAgICAgICAgICAgICAgMQorCisjZGVmaW5lIERFRkFVTFRfTUFYX1JFRl9GUk0gICAgICAgICAyCisjZGVmaW5lIERFRkFVTFRfTUFYX1JFT1JERVJfRlJNICAgICAwCisjZGVmaW5lIERFRkFVTFRfUVBfTUlOICAgICAgICAgICAgICAxMAorI2RlZmluZSBERUZBVUxUX1FQX01BWCAgICAgICAgICAgICAgNDAKKyNkZWZpbmUgREVGQVVMVF9NQVhfQklUUkFURSAgICAgICAgIDI0MDAwMDAwMAorI2RlZmluZSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1ggICAgMjU2CisjZGVmaW5lIERFRkFVTFRfTUFYX1NSQ0hfUkFOR0VfWSAgICAyNTYKKyNkZWZpbmUgREVGQVVMVF9NQVhfRlJBTUVSQVRFICAgICAgIDEyMDAwMAorI2RlZmluZSBERUZBVUxUX05VTV9DT1JFUyAgICAgICAgICAgMQorI2RlZmluZSBERUZBVUxUX05VTV9DT1JFU19QUkVfRU5DICAgMAorI2RlZmluZSBERUZBVUxUX0ZQUyAgICAgICAgICAgICAgICAgMzAKKyNkZWZpbmUgREVGQVVMVF9FTkNfU1BFRUQgICAgICAgICAgIElWRV9OT1JNQUwKKworI2RlZmluZSBERUZBVUxUX01FTV9SRUNfQ05UICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1JFQ09OX0VOQUJMRSAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX0NIS1NVTV9FTkFCTEUgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1NUQVJUX0ZSTSAgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX05VTV9GUk1TICAgICAgICAgICAgMHhGRkZGRkZGRgorI2RlZmluZSBERUZBVUxUX0lOUF9DT0xPUl9GT1JNQVQgICAgICAgSVZfWVVWXzQyMFNQX1ZVCisjZGVmaW5lIERFRkFVTFRfUkVDT05fQ09MT1JfRk9STUFUICAgICBJVl9ZVVZfNDIwUAorI2RlZmluZSBERUZBVUxUX0xPT1BCQUNLICAgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1NSQ19GUkFNRV9SQVRFICAgICAgMzAKKyNkZWZpbmUgREVGQVVMVF9UR1RfRlJBTUVfUkFURSAgICAgIDMwCisjZGVmaW5lIERFRkFVTFRfTUFYX1dEICAgICAgICAgICAgICAxOTIwCisjZGVmaW5lIERFRkFVTFRfTUFYX0hUICAgICAgICAgICAgICAxOTIwCisjZGVmaW5lIERFRkFVTFRfTUFYX0xFVkVMICAgICAgICAgICA0MQorI2RlZmluZSBERUZBVUxUX1NUUklERSAgICAgICAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1dEICAgICAgICAgICAgICAgICAgMTI4MAorI2RlZmluZSBERUZBVUxUX0hUICAgICAgICAgICAgICAgICAgNzIwCisjZGVmaW5lIERFRkFVTFRfUFNOUl9FTkFCTEUgICAgICAgICAwCisjZGVmaW5lIERFRkFVTFRfTUVfU1BFRUQgICAgICAgICAgICAxMDAKKyNkZWZpbmUgREVGQVVMVF9FTkFCTEVfRkFTVF9TQUQgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9FTkFCTEVfQUxUX1JFRiAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9SQ19NT0RFICAgICAgICAgICAgIElWRV9SQ19TVE9SQUdFCisjZGVmaW5lIERFRkFVTFRfQklUUkFURSAgICAgICAgICAgICA2MDAwMDAwCisjZGVmaW5lIERFRkFVTFRfSV9RUCAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBERUZBVUxUX0lfUVBfTUFYICAgICAgICAgICAgREVGQVVMVF9RUF9NQVgKKyNkZWZpbmUgREVGQVVMVF9JX1FQX01JTiAgICAgICAgICAgIERFRkFVTFRfUVBfTUlOCisjZGVmaW5lIERFRkFVTFRfUF9RUCAgICAgICAgICAgICAgICAyOAorI2RlZmluZSBERUZBVUxUX1BfUVBfTUFYICAgICAgICAgICAgREVGQVVMVF9RUF9NQVgKKyNkZWZpbmUgREVGQVVMVF9QX1FQX01JTiAgICAgICAgICAgIERFRkFVTFRfUVBfTUlOCisjZGVmaW5lIERFRkFVTFRfQl9RUCAgICAgICAgICAgICAgICAyMgorI2RlZmluZSBERUZBVUxUX0JfUVBfTUFYICAgICAgICAgICAgREVGQVVMVF9RUF9NQVgKKyNkZWZpbmUgREVGQVVMVF9CX1FQX01JTiAgICAgICAgICAgIERFRkFVTFRfUVBfTUlOCisjZGVmaW5lIERFRkFVTFRfQUlSICAgICAgICAgICAgICAgICBJVkVfQUlSX01PREVfTk9ORQorI2RlZmluZSBERUZBVUxUX0FJUl9SRUZSRVNIX1BFUklPRCAgMzAKKyNkZWZpbmUgREVGQVVMVF9TUkNIX1JOR19YICAgICAgICAgIDY0CisjZGVmaW5lIERFRkFVTFRfU1JDSF9STkdfWSAgICAgICAgICA0OAorI2RlZmluZSBERUZBVUxUX0lfSU5URVJWQUwgICAgICAgICAgMzAKKyNkZWZpbmUgREVGQVVMVF9JRFJfSU5URVJWQUwgICAgICAgIDEwMDAKKyNkZWZpbmUgREVGQVVMVF9CX0ZSQU1FUyAgICAgICAgICAgIDAKKyNkZWZpbmUgREVGQVVMVF9ESVNBQkxFX0RFQkxLX0xFVkVMIDAKKyNkZWZpbmUgREVGQVVMVF9IUEVMICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVGQVVMVF9RUEVMICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVGQVVMVF9JNCAgICAgICAgICAgICAgICAgIDEKKyNkZWZpbmUgREVGQVVMVF9FUFJPRklMRSAgICAgICAgICAgIElWX1BST0ZJTEVfQkFTRQorI2RlZmluZSBERUZBVUxUX0VOVFJPUFlfTU9ERSAgICAgICAgMAorI2RlZmluZSBERUZBVUxUX1NMSUNFX01PREUgICAgICAgICAgSVZFX1NMSUNFX01PREVfTk9ORQorI2RlZmluZSBERUZBVUxUX1NMSUNFX1BBUkFNICAgICAgICAgMjU2CisjZGVmaW5lIERFRkFVTFRfQVJDSCAgICAgICAgICAgICAgICBBUkNIX0FSTV9BOVEKKyNkZWZpbmUgREVGQVVMVF9TT0MgICAgICAgICAgICAgICAgIFNPQ19HRU5FUklDCisjZGVmaW5lIERFRkFVTFRfSU5UUkE0eDQgICAgICAgICAgICAwCisjZGVmaW5lIFNUUkxFTkdUSCAgICAgICAgICAgICAgICAgICA1MDAKKyNkZWZpbmUgREVGQVVMVF9DT05TVFJBSU5FRF9JTlRSQSAgIDAKKworI2RlZmluZSBNSU4oYSwgYikgKChhKSA8IChiKSk/IChhKSA6IChiKQorI2RlZmluZSBNQVgoYSwgYikgKChhKSA+IChiKSk/IChhKSA6IChiKQorI2RlZmluZSBBTElHTjE2KHgpICgoKCh4KSArIDE1KSA+PiA0KSA8PCA0KQorI2RlZmluZSBBTElHTjEyOCh4KSAoKCgoeCkgKyAxMjcpID4+IDcpIDw8IDcpCisjZGVmaW5lIEFMSUdONDA5Nih4KSAoKCgoeCkgKyA0MDk1KSA+PiAxMikgPDwgMTIpCisKKy8qKiBVc2VkIHRvIHJlbW92ZSB3YXJuaW5ncyBhYm91dCB1bnVzZWQgcGFyYW1ldGVycyAqLworI2RlZmluZSBVTlVTRUQoeCkgKCh2b2lkKSh4KSkKKworLyoqIEdldCB0aW1lICovCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgZ2V0dGltZW9mZGF5KGEsIGIpOworCisvKiogQ29tcHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gc3RhcnQgYW5kIGVuZCAqLworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgXAorICAgIGRpZmYgPSAoKChlbmQpLnR2X3NlYyAtIChzdGFydCkudHZfc2VjKSAqIDEwMDAwMDApICsgXAorICAgICAgICAgICAgKChlbmQpLnR2X3VzZWMgLSAoc3RhcnQpLnR2X3VzZWMpOworCisjZGVmaW5lIGl2ZV9hbGlnbmVkX21hbGxvYyhhbGlnbm1lbnQsIHNpemUpIG1lbWFsaWduKGFsaWdubWVudCwgc2l6ZSkKKyNkZWZpbmUgaXZlX2FsaWduZWRfZnJlZShidWYpIGZyZWUoYnVmKQorCitzdHJ1Y3QgQzJTb2Z0QXZjRW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEF2Y0VuYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5DMlNvZnRBdmNFbmMoKTsKKworcHJpdmF0ZToKKyAgICAvLyBPTVggaW5wdXQgYnVmZmVyJ3MgdGltZXN0YW1wIGFuZCBmbGFncworICAgIHR5cGVkZWYgc3RydWN0IHsKKyAgICAgICAgaW50NjRfdCBtVGltZVVzOworICAgICAgICBpbnQzMl90IG1GbGFnczsKKyAgICB9IElucHV0QnVmZmVySW5mbzsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisKKyAgICBpbnQzMl90IG1TdHJpZGU7CisKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OyAgIC8vIFRpbWUgYXQgdGhlIHN0YXJ0IG9mIGRlY29kZSgpCisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7ICAgICAvLyBUaW1lIGF0IHRoZSBlbmQgb2YgZGVjb2RlKCkKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICBjaGFyIG1JbkZpbGVbMjAwXTsKKyAgICBjaGFyIG1PdXRGaWxlWzIwMF07CisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCisgICAgSVZfQ09MT1JfRk9STUFUX1QgbUl2VmlkZW9Db2xvckZvcm1hdDsKKworICAgIElWX1BST0ZJTEVfVCBtQVZDRW5jUHJvZmlsZSBfX3VudXNlZDsKKyAgICBXT1JEMzIgICBtQVZDRW5jTGV2ZWw7CisgICAgYm9vbCAgICAgbVN0YXJ0ZWQ7CisgICAgYm9vbCAgICAgbVNwc1Bwc0hlYWRlclJlY2VpdmVkOworCisgICAgYm9vbCAgICAgbVNhd0lucHV0RU9TOworICAgIGJvb2wgICAgIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sICAgICBtSW50cmE0eDQ7CisgICAgYm9vbCAgICAgbUVuYWJsZUZhc3RTYWQ7CisgICAgYm9vbCAgICAgbUVuYWJsZUFsdFJlZjsKKyAgICBib29sICAgICBtUmVjb25FbmFibGU7CisgICAgYm9vbCAgICAgbVBTTlJFbmFibGU7CisgICAgYm9vbCAgICAgbUVudHJvcHlNb2RlOworICAgIGJvb2wgICAgIG1Db25zdHJhaW5lZEludHJhRmxhZzsKKyAgICBJVkVfU1BFRURfQ09ORklHICAgICBtRW5jU3BlZWQ7CisKKyAgICBpdl9vYmpfdCAqbUNvZGVjQ3R4OyAgICAgICAgIC8vIENvZGVjIGNvbnRleHQKKyAgICBpdl9tZW1fcmVjX3QgKm1NZW1SZWNvcmRzOyAgIC8vIE1lbW9yeSByZWNvcmRzIHJlcXVlc3RlZCBieSB0aGUgY29kZWMKKyAgICBzaXplX3QgbU51bU1lbVJlY29yZHM7ICAgICAgIC8vIE51bWJlciBvZiBtZW1vcnkgcmVjb3JkcyByZXF1ZXN0ZWQgYnkgY29kZWMKKyAgICBzaXplX3QgbU51bUNvcmVzOyAgICAgICAgICAgIC8vIE51bWJlciBvZiBjb3JlcyB1c2VkIGJ5IHRoZSBjb2RlYworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IG1PdXRCbG9jazsKKworICAgIC8vIGNvbmZpZ3VyYXRpb25zIHVzZWQgYnkgY29tcG9uZW50IGluIHByb2Nlc3MKKyAgICAvLyAoVE9ETzoga2VlcCB0aGlzIGluIGludGYgYnV0IG1ha2UgdGhlbSBpbnRlcm5hbCBvbmx5KQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBtSW50cmFSZWZyZXNoOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IG1SZXF1ZXN0U3luYzsKKworICAgIHVpbnQzMl90IG1PdXRCdWZmZXJTaXplOworICAgIFVXT1JEMzIgbUhlYWRlckdlbmVyYXRlZDsKKyAgICBVV09SRDMyIG1CZnJhbWVzOworICAgIElWX0FSQ0hfVCBtQXJjaDsKKyAgICBJVkVfU0xJQ0VfTU9ERV9UIG1TbGljZU1vZGU7CisgICAgVVdPUkQzMiBtU2xpY2VQYXJhbTsKKyAgICBib29sIG1IYWxmUGVsRW5hYmxlOworICAgIFVXT1JEMzIgbUlJbnRlcnZhbDsKKyAgICBVV09SRDMyIG1JRFJJbnRlcnZhbDsKKyAgICBVV09SRDMyIG1EaXNhYmxlRGVibGtMZXZlbDsKKyAgICBzdGQ6Om1hcDxjb25zdCB2b2lkICosIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4+IG1CdWZmZXJzOworICAgIE1lbW9yeUJsb2NrUG9vbCBtQ29udmVyc2lvbkJ1ZmZlcnM7CisgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCAqLCBNZW1vcnlCbG9jaz4gbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2U7CisKKyAgICB2b2lkIGluaXRFbmNQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBpbml0RW5jb2RlcigpOworICAgIGMyX3N0YXR1c190IHJlbGVhc2VFbmNvZGVyKCk7CisKKyAgICBjMl9zdGF0dXNfdCBzZXRGcmFtZVR5cGUoSVZfUElDVFVSRV9DT0RJTkdfVFlQRV9UICBlX2ZyYW1lX3R5cGUpOworICAgIGMyX3N0YXR1c190IHNldFFwKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0RW5jTW9kZShJVkVfRU5DX01PREVfVCBlX2VuY19tb2RlKTsKKyAgICBjMl9zdGF0dXNfdCBzZXREaW1lbnNpb25zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0TnVtQ29yZXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRGcmFtZVJhdGUoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRJcGVQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRCaXRSYXRlKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0QWlyUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0TWVQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRHb3BQYXJhbXMoKTsKKyAgICBjMl9zdGF0dXNfdCBzZXRQcm9maWxlUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3Qgc2V0RGVibG9ja1BhcmFtcygpOworICAgIGMyX3N0YXR1c190IHNldFZidlBhcmFtcygpOworICAgIHZvaWQgbG9nVmVyc2lvbigpOworICAgIGMyX3N0YXR1c190IHNldEVuY29kZUFyZ3MoCisgICAgICAgICAgICBpdmVfdmlkZW9fZW5jb2RlX2lwX3QgKnBzX2VuY29kZV9pcCwKKyAgICAgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfb3BfdCAqcHNfZW5jb2RlX29wLAorICAgICAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAqY29uc3QgaW5wdXQsCisgICAgICAgICAgICB1aW50OF90ICpiYXNlLAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgICAgICB1aW50NjRfdCB3b3JrSW5kZXgpOworICAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCB3b3JrSW5kZXgsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGl2ZV92aWRlb19lbmNvZGVfb3BfdCAqcHNfZW5jb2RlX29wKTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRBdmNFbmMpOworfTsKKworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEggICAgICIvc2RjYXJkL21lZGlhL2F2Y2VfaW5wdXQiCisjZGVmaW5lIElOUFVUX0RVTVBfRVhUICAgICAgInl1diIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSCAgICAiL3NkY2FyZC9tZWRpYS9hdmNlX291dHB1dCIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRVhUICAgICAiaDI2NCIKKworI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsICBcCisgICAgICAgICAgICBtVGltZVN0YXJ0LnR2X3NlYywgbVRpbWVTdGFydC50dl91c2VjLCAgICAgIFwKKyAgICAgICAgICAgIElOUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cmNweShtT3V0RmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3ByaW50ZihtT3V0RmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBPVVRQVVRfRFVNUF9QQVRILFwKKyAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsICAgICAgXAorICAgICAgICAgICAgT1VUUFVUX0RVTVBfRVhUKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSB7ICAgICAgICAgICAgICAgICAgXAorICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgIndiIik7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIk9wZW5lZCBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgICAgICAgICAgXAorICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKSAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTEUgKmZwID0gZm9wZW4obV9maWxlbmFtZSwgImFiIik7ICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwgJiYgbV9idWYgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpID0gZndyaXRlKG1fYnVmLCAxLCBtX3NpemUsIGZwKTsgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJmd3JpdGUgcmV0ICVkIHRvIHdyaXRlICVkIiwgaSwgbV9zaXplKTsgIFwKKyAgICAgICAgaWYgKGkgIT0gKGludCltX3NpemUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkVycm9yIGluIGZ3cml0ZSwgcmV0dXJuZWQgJWQiLCBpKTsgICBcCisgICAgICAgICAgICBwZXJyb3IoIkVycm9yIGluIHdyaXRlIHRvIGZpbGUiKTsgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCB3cml0ZSB0byBmaWxlICVzIiwgbV9maWxlbmFtZSk7XAorICAgICAgICBpZiAoZnAgIT0gTlVMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2Vsc2UgLyogRklMRV9EVU1QX0VOQUJMRSAqLworI2RlZmluZSBJTlBVVF9EVU1QX1BBVEgKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSAorI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQKKyNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpCisjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkKKyNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpCisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9BVkNfRU5DX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMDgzNWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMzQgQEAKKy8vIERPIE5PVCBERVBFTkQgT04gVEhJUyBESVJFQ1RMWQorLy8gdXNlIGxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIGluc3RlYWQKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfY29tbW9uIiwKKyAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJTaW1wbGVDMkNvbXBvbmVudC5jcHAiLAorICAgICAgICAiU2ltcGxlQzJJbnRlcmZhY2UuY3BwIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLCAvLyBmb3IgcHJvcGVydGllcworICAgICAgICAibGlibG9nIiwgICAgLy8gZm9yIEFMT0cKKyAgICAgICAgImxpYnNmcGx1Z2luX2Njb2RlY191dGlscyIsIC8vIGZvciBJbWFnZUNvcHkKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLCAvLyBmb3IgTXV0ZXhlZAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCit9CisKK2ZpbGVncm91cCB7CisgICAgbmFtZTogImNvZGVjMl9zb2Z0X2V4cG9ydHMiLAorICAgIHNyY3M6IFsgImV4cG9ydHMubGRzIiBdLAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3Igc29mdHdhcmUgY29kZWMgaW1wbGVtZW50YXRpb24KKy8vIHRvIGJlIHVzZWQgYnkgY29kZSB1bmRlciBtZWRpYS9jb2RlY3MvKiBvbmx5IGFzIGl0cyBzdGFiaWxpdHkgaXMgbm90IGd1YXJhbnRlZWQKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgIGRlZmF1bHRzOiBbImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIl0sCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2ZXJzaW9uX3NjcmlwdDogIjpjb2RlYzJfc29mdF9leHBvcnRzIiwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliY29kZWMyX3NvZnRfY29tbW9uIiwKKyAgICAgICAgImxpYmN1dGlscyIsIC8vIGZvciBwcm9wZXJ0aWVzCisgICAgICAgICJsaWJsb2ciLCAvLyBmb3IgQUxPRworICAgICAgICAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwgLy8gZm9yIEltYWdlQ29weQorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsIC8vIGZvciBDb2xvclV0aWxzIGFuZCBNSU1FCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKK30KKworLy8gcHVibGljIGRlcGVuZGVuY3kgZm9yIHNvZnR3YXJlIGNvZGVjIGltcGxlbWVudGF0aW9uCisvLyB0byBiZSB1c2VkIGJ5IGNvZGUgdW5kZXIgbWVkaWEvY29kZWNzLyogb25seQorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorfQorCisvLyBwdWJsaWMgZGVwZW5kZW5jeSBmb3Igc29mdHdhcmUgY29kZWMgaW1wbGVtZW50YXRpb24KKy8vIHRvIGJlIHVzZWQgYnkgY29kZSB1bmRlciBtZWRpYS9jb2RlY3MvKiBvbmx5CitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCit9CisKKy8vIFRFTVA6IHVzZWQgYnkgY2hlZXRzMiBwcm9qZWN0IC0gcmVtb3ZlIHdoZW4gbm8gbG9uZ2VyIHVzZWQKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NpbXBsZV9jb21wb25lbnQiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJTaW1wbGVDMkludGVyZmFjZS5jcHAiLAorICAgIF0sCisKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJDb21wb25lbnQuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9TaW1wbGVDMkNvbXBvbmVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIzZmJkMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJDb21wb25lbnQuY3BwCkBAIC0wLDAgKzEsNjExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTaW1wbGVDMkNvbXBvbmVudCIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gU2ltcGxlQzJDb21wb25lbnQ6OldvcmtRdWV1ZTo6cG9wX2Zyb250KCkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmsgPSBzdGQ6Om1vdmUobVF1ZXVlLmZyb250KCkud29yayk7CisgICAgbVF1ZXVlLnBvcF9mcm9udCgpOworICAgIHJldHVybiB3b3JrOworfQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrUXVldWU6OnB1c2hfYmFjayhzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKSB7CisgICAgbVF1ZXVlLnB1c2hfYmFjayh7IHN0ZDo6bW92ZSh3b3JrKSwgTk9fRFJBSU4gfSk7Cit9CisKK2Jvb2wgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtRdWV1ZTo6ZW1wdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIG1RdWV1ZS5lbXB0eSgpOworfQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpXb3JrUXVldWU6OmNsZWFyKCkgeworICAgIG1RdWV1ZS5jbGVhcigpOworfQorCit1aW50MzJfdCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya1F1ZXVlOjpkcmFpbk1vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1RdWV1ZS5mcm9udCgpLmRyYWluTW9kZTsKK30KKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6V29ya1F1ZXVlOjptYXJrRHJhaW4odWludDMyX3QgZHJhaW5Nb2RlKSB7CisgICAgbVF1ZXVlLnB1c2hfYmFjayh7IG51bGxwdHIsIGRyYWluTW9kZSB9KTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworU2ltcGxlQzJDb21wb25lbnQ6OldvcmtIYW5kbGVyOjpXb3JrSGFuZGxlcigpIDogbVJ1bm5pbmcoZmFsc2UpIHt9CisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtIYW5kbGVyOjpzZXRDb21wb25lbnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxTaW1wbGVDMkNvbXBvbmVudD4gJnRoaXopIHsKKyAgICBtVGhpeiA9IHRoaXo7Cit9CisKK3N0YXRpYyB2b2lkIFJlcGx5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBpbnQzMl90ICplcnIgPSBudWxscHRyKSB7CisgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SWQ7CisgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJZCkpOworICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZTsKKyAgICBpZiAoZXJyKSB7CisgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZXJyIiwgKmVycik7CisgICAgfQorICAgIHJlcGx5LT5wb3N0UmVwbHkocmVwbHlJZCk7Cit9CisKK3ZvaWQgU2ltcGxlQzJDb21wb25lbnQ6OldvcmtIYW5kbGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxTaW1wbGVDMkNvbXBvbmVudD4gdGhpeiA9IG1UaGl6LmxvY2soKTsKKyAgICBpZiAoIXRoaXopIHsKKyAgICAgICAgQUxPR0QoImNvbXBvbmVudCBub3QgeWV0IHNldDsgbXNnID0gJXMiLCBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlkOworICAgICAgICBpZiAobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJZCkpIHsKKyAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZTsKKyAgICAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZXJyIiwgQzJfQ09SUlVQVEVEKTsKKyAgICAgICAgICAgIHJlcGx5LT5wb3N0UmVwbHkocmVwbHlJZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdFByb2Nlc3M6IHsKKyAgICAgICAgICAgIGlmIChtUnVubmluZykgeworICAgICAgICAgICAgICAgIGlmICh0aGl6LT5wcm9jZXNzUXVldWUoKSkgeworICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0UHJvY2VzcywgdGhpcykpLT5wb3N0KCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiSWdub3JlIHByb2Nlc3MgbWVzc2FnZSBhcyB3ZSdyZSBub3QgcnVubmluZyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdEluaXQ6IHsKKyAgICAgICAgICAgIGludDMyX3QgZXJyID0gdGhpei0+b25Jbml0KCk7CisgICAgICAgICAgICBSZXBseShtc2csICZlcnIpOworICAgICAgICAgICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTdGFydDogeworICAgICAgICAgICAgbVJ1bm5pbmcgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFN0b3A6IHsKKyAgICAgICAgICAgIGludDMyX3QgZXJyID0gdGhpei0+b25TdG9wKCk7CisgICAgICAgICAgICBSZXBseShtc2csICZlcnIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdFJlc2V0OiB7CisgICAgICAgICAgICB0aGl6LT5vblJlc2V0KCk7CisgICAgICAgICAgICBtUnVubmluZyA9IGZhbHNlOworICAgICAgICAgICAgUmVwbHkobXNnKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRSZWxlYXNlOiB7CisgICAgICAgICAgICB0aGl6LT5vblJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7CisgICAgICAgICAgICBSZXBseShtc2cpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgQUxPR0QoIlVucmVjb2duaXplZCBtc2c6ICVkIiwgbXNnLT53aGF0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2NsYXNzIFNpbXBsZUMyQ29tcG9uZW50OjpCbG9ja2luZ0Jsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgQmxvY2tpbmdCbG9ja1Bvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgYmFzZSk6IG1CYXNle2Jhc2V9IHt9CisKKyAgICB2aXJ0dWFsIGxvY2FsX2lkX3QgZ2V0TG9jYWxJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1CYXNlLT5nZXRMb2NhbElkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1CYXNlLT5nZXRBbGxvY2F0b3JJZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiogYmxvY2spIHsKKyAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgICAgICBkbyB7CisgICAgICAgICAgICBzdGF0dXMgPSBtQmFzZS0+ZmV0Y2hMaW5lYXJCbG9jayhjYXBhY2l0eSwgdXNhZ2UsIGJsb2NrKTsKKyAgICAgICAgfSB3aGlsZSAoc3RhdHVzID09IEMyX0JMT0NLSU5HKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoQ2lyY3VsYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNpcmN1bGFyQmxvY2s+KiBibG9jaykgeworICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CYXNlLT5mZXRjaENpcmN1bGFyQmxvY2soY2FwYWNpdHksIHVzYWdlLCBibG9jayk7CisgICAgICAgIH0gd2hpbGUgKHN0YXR1cyA9PSBDMl9CTE9DS0lORyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+KiBibG9jaykgeworICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1CYXNlLT5mZXRjaEdyYXBoaWNCbG9jayh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrKTsKKyAgICAgICAgfSB3aGlsZSAoc3RhdHVzID09IEMyX0JMT0NLSU5HKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtQmFzZTsKK307CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK25hbWVzcGFjZSB7CisKK3N0cnVjdCBEdW1teVJlYWRWaWV3IDogcHVibGljIEMyUmVhZFZpZXcgeworICAgIER1bW15UmVhZFZpZXcoKSA6IEMyUmVhZFZpZXcoQzJfTk9fSU5JVCkge30KK307CisKK30gIC8vIG5hbWVzcGFjZQorCitTaW1wbGVDMkNvbXBvbmVudDo6U2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gJmludGYpCisgICAgOiBtRHVtbXlSZWFkVmlldyhEdW1teVJlYWRWaWV3KCkpLAorICAgICAgbUludGYoaW50ZiksCisgICAgICBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKKyAgICAgIG1IYW5kbGVyKG5ldyBXb3JrSGFuZGxlcikgeworICAgIG1Mb29wZXItPnNldE5hbWUoaW50Zi0+Z2V0TmFtZSgpLmNfc3RyKCkpOworICAgICh2b2lkKW1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CisgICAgbUxvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlLCBBTkRST0lEX1BSSU9SSVRZX1ZJREVPKTsKK30KKworU2ltcGxlQzJDb21wb25lbnQ6On5TaW1wbGVDMkNvbXBvbmVudCgpIHsKKyAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlci0+aWQoKSk7CisgICAgKHZvaWQpbUxvb3Blci0+c3RvcCgpOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6c2V0TGlzdGVuZXJfdmIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lciwgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgeworICAgIG1IYW5kbGVyLT5zZXRDb21wb25lbnQoc2hhcmVkX2Zyb21fdGhpcygpKTsKKworICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgIGlmIChzdGF0ZS0+bVN0YXRlID09IFJVTk5JTkcpIHsKKyAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICB9IGVsc2UgaWYgKCFtYXlCbG9jaykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JMT0NLSU5HOworICAgICAgICB9CisgICAgfQorICAgIHN0YXRlLT5tTGlzdGVuZXIgPSBsaXN0ZW5lcjsKKyAgICAvLyBUT0RPOiB3YWl0IGZvciBsaXN0ZW5lciBjaGFuZ2UgdG8gaGF2ZSB0YWtlbiBwbGFjZSBiZWZvcmUgcmV0dXJuaW5nCisgICAgLy8gKGUuZy4gaWYgdGhlcmUgaXMgYW4gb25nb2luZyBsaXN0ZW5lciBjYWxsYmFjaykKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpxdWV1ZV9uYihzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICogY29uc3QgaXRlbXMpIHsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPm1TdGF0ZSAhPSBSVU5OSU5HKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgcXVldWVXYXNFbXB0eSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIHF1ZXVlV2FzRW1wdHkgPSBxdWV1ZS0+ZW1wdHkoKTsKKyAgICAgICAgd2hpbGUgKCFpdGVtcy0+ZW1wdHkoKSkgeworICAgICAgICAgICAgcXVldWUtPnB1c2hfYmFjayhzdGQ6Om1vdmUoaXRlbXMtPmZyb250KCkpKTsKKyAgICAgICAgICAgIGl0ZW1zLT5wb3BfZnJvbnQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocXVldWVXYXNFbXB0eSkgeworICAgICAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFByb2Nlc3MsIG1IYW5kbGVyKSktPnBvc3QoKTsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6YW5ub3VuY2VfbmIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJXb3JrT3V0bGluZT4gJml0ZW1zKSB7CisgICAgKHZvaWQpaXRlbXM7CisgICAgcmV0dXJuIEMyX09NSVRURUQ7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpmbHVzaF9zbSgKKyAgICAgICAgZmx1c2hfbW9kZV90IGZsdXNoTW9kZSwgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspIHsKKyAgICAodm9pZClmbHVzaE1vZGU7CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5tU3RhdGUgIT0gUlVOTklORykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBxdWV1ZS0+aW5jR2VuZXJhdGlvbigpOworICAgICAgICAvLyBUT0RPOiBxdWV1ZS0+c3BsaWNlZEJ5KGZsdXNoZWRXb3JrLCBmbHVzaGVkV29yay0+ZW5kKCkpOworICAgICAgICB3aGlsZSAoIXF1ZXVlLT5lbXB0eSgpKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrID0gcXVldWUtPnBvcF9mcm9udCgpOworICAgICAgICAgICAgaWYgKHdvcmspIHsKKyAgICAgICAgICAgICAgICBmbHVzaGVkV29yay0+cHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKCFxdWV1ZS0+cGVuZGluZygpLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGZsdXNoZWRXb3JrLT5wdXNoX2JhY2soc3RkOjptb3ZlKHF1ZXVlLT5wZW5kaW5nKCkuYmVnaW4oKS0+c2Vjb25kKSk7CisgICAgICAgICAgICBxdWV1ZS0+cGVuZGluZygpLmVyYXNlKHF1ZXVlLT5wZW5kaW5nKCkuYmVnaW4oKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpkcmFpbl9uYihkcmFpbl9tb2RlX3QgZHJhaW5Nb2RlKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5tU3RhdGUgIT0gUlVOTklORykgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9TVEFURTsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIHF1ZXVlV2FzRW1wdHkgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBxdWV1ZVdhc0VtcHR5ID0gcXVldWUtPmVtcHR5KCk7CisgICAgICAgIHF1ZXVlLT5tYXJrRHJhaW4oZHJhaW5Nb2RlKTsKKyAgICB9CisgICAgaWYgKHF1ZXVlV2FzRW1wdHkpIHsKKyAgICAgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRQcm9jZXNzLCBtSGFuZGxlcikpLT5wb3N0KCk7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6c3RhcnQoKSB7CisgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgaWYgKHN0YXRlLT5tU3RhdGUgPT0gUlVOTklORykgeworICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgIH0KKyAgICBib29sIG5lZWRzSW5pdCA9IChzdGF0ZS0+bVN0YXRlID09IFVOSU5JVElBTElaRUQpOworICAgIHN0YXRlLnVubG9jaygpOworICAgIGlmIChuZWVkc0luaXQpIHsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgICAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdEluaXQsIG1IYW5kbGVyKSktPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXBseSk7CisgICAgICAgIGludDMyX3QgZXJyOworICAgICAgICBDSEVDSyhyZXBseS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiAoYzJfc3RhdHVzX3QpZXJyOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRTdGFydCwgbUhhbmRsZXIpKS0+cG9zdCgpOworICAgIH0KKyAgICBzdGF0ZS5sb2NrKCk7CisgICAgc3RhdGUtPm1TdGF0ZSA9IFJVTk5JTkc7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBTaW1wbGVDMkNvbXBvbmVudDo6c3RvcCgpIHsKKyAgICBBTE9HVigic3RvcCIpOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+bVN0YXRlICE9IFJVTk5JTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfU1RBVEU7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPm1TdGF0ZSA9IFNUT1BQRUQ7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgICAgIHF1ZXVlLT5jbGVhcigpOworICAgICAgICBxdWV1ZS0+cGVuZGluZygpLmNsZWFyKCk7CisgICAgfQorICAgIHNwPEFNZXNzYWdlPiByZXBseTsKKyAgICAobmV3IEFNZXNzYWdlKFdvcmtIYW5kbGVyOjprV2hhdFN0b3AsIG1IYW5kbGVyKSktPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXBseSk7CisgICAgaW50MzJfdCBlcnI7CisgICAgQ0hFQ0socmVwbHktPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIChjMl9zdGF0dXNfdCllcnI7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgU2ltcGxlQzJDb21wb25lbnQ6OnJlc2V0KCkgeworICAgIEFMT0dWKCJyZXNldCIpOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgIHN0YXRlLT5tU3RhdGUgPSBVTklOSVRJQUxJWkVEOworICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBxdWV1ZS0+Y2xlYXIoKTsKKyAgICAgICAgcXVldWUtPnBlbmRpbmcoKS5jbGVhcigpOworICAgIH0KKyAgICBzcDxBTWVzc2FnZT4gcmVwbHk7CisgICAgKG5ldyBBTWVzc2FnZShXb3JrSGFuZGxlcjo6a1doYXRSZXNldCwgbUhhbmRsZXIpKS0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlcGx5KTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IFNpbXBsZUMyQ29tcG9uZW50OjpyZWxlYXNlKCkgeworICAgIEFMT0dWKCJyZWxlYXNlIik7CisgICAgc3A8QU1lc3NhZ2U+IHJlcGx5OworICAgIChuZXcgQU1lc3NhZ2UoV29ya0hhbmRsZXI6OmtXaGF0UmVsZWFzZSwgbUhhbmRsZXIpKS0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlcGx5KTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gU2ltcGxlQzJDb21wb25lbnQ6OmludGYoKSB7CisgICAgcmV0dXJuIG1JbnRmOworfQorCituYW1lc3BhY2UgeworCitzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHZlYyhzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gcmV0OworICAgIHJldC5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICByZXR1cm4gcmV0OworfQorCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBTaW1wbGVDMkNvbXBvbmVudDo6ZmluaXNoKAorICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LCBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJik+IGZpbGxXb3JrKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBpZiAocXVldWUtPnBlbmRpbmcoKS5jb3VudChmcmFtZUluZGV4KSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygidW5rbm93biBmcmFtZSBpbmRleDogJSIgUFJJdTY0LCBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3b3JrID0gc3RkOjptb3ZlKHF1ZXVlLT5wZW5kaW5nKCkuYXQoZnJhbWVJbmRleCkpOworICAgICAgICBxdWV1ZS0+cGVuZGluZygpLmVyYXNlKGZyYW1lSW5kZXgpOworICAgIH0KKyAgICBpZiAod29yaykgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtRXhlY1N0YXRlLmxvY2soKS0+bUxpc3RlbmVyOworICAgICAgICBsaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihzaGFyZWRfZnJvbV90aGlzKCksIHZlYyh3b3JrKSk7CisgICAgICAgIEFMT0dWKCJyZXR1cm5pbmcgcGVuZGluZyB3b3JrIik7CisgICAgfQorfQorCit2b2lkIFNpbXBsZUMyQ29tcG9uZW50OjpjbG9uZUFuZFNlbmQoCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZjdXJyZW50V29yaywKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICYpPiBmaWxsV29yaykgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmsobmV3IEMyV29yayk7CisgICAgaWYgKGN1cnJlbnRXb3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPT0gZnJhbWVJbmRleCkgeworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IGN1cnJlbnRXb3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbCA9IGN1cnJlbnRXb3JrLT5pbnB1dC5vcmRpbmFsOworICAgIH0gZWxzZSB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBpZiAocXVldWUtPnBlbmRpbmcoKS5jb3VudChmcmFtZUluZGV4KSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVygidW5rbm93biBmcmFtZSBpbmRleDogJSIgUFJJdTY0LCBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IHF1ZXVlLT5wZW5kaW5nKCkuYXQoZnJhbWVJbmRleCktPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsID0gcXVldWUtPnBlbmRpbmcoKS5hdChmcmFtZUluZGV4KS0+aW5wdXQub3JkaW5hbDsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgIGlmICh3b3JrKSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IG1FeGVjU3RhdGUubG9jaygpLT5tTGlzdGVuZXI7CisgICAgICAgIGxpc3RlbmVyLT5vbldvcmtEb25lX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgdmVjKHdvcmspKTsKKyAgICAgICAgQUxPR1YoImNsb25lZCBhbmQgc2VuZGluZyB3b3JrIik7CisgICAgfQorfQorCitib29sIFNpbXBsZUMyQ29tcG9uZW50Ojpwcm9jZXNzUXVldWUoKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB1aW50NjRfdCBnZW5lcmF0aW9uOworICAgIGludDMyX3QgZHJhaW5Nb2RlOworICAgIGJvb2wgaXNGbHVzaFBlbmRpbmcgPSBmYWxzZTsKKyAgICBib29sIGhhc1F1ZXVlZFdvcmsgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8V29ya1F1ZXVlPjo6TG9ja2VkIHF1ZXVlKG1Xb3JrUXVldWUpOworICAgICAgICBpZiAocXVldWUtPmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIGdlbmVyYXRpb24gPSBxdWV1ZS0+Z2VuZXJhdGlvbigpOworICAgICAgICBkcmFpbk1vZGUgPSBxdWV1ZS0+ZHJhaW5Nb2RlKCk7CisgICAgICAgIGlzRmx1c2hQZW5kaW5nID0gcXVldWUtPnBvcFBlbmRpbmdGbHVzaCgpOworICAgICAgICB3b3JrID0gcXVldWUtPnBvcF9mcm9udCgpOworICAgICAgICBoYXNRdWV1ZWRXb3JrID0gIXF1ZXVlLT5lbXB0eSgpOworICAgIH0KKyAgICBpZiAoaXNGbHVzaFBlbmRpbmcpIHsKKyAgICAgICAgQUxPR1YoInByb2Nlc3NpbmcgcGVuZGluZyBmbHVzaCIpOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBvbkZsdXNoX3NtKCk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJmbHVzaCBlcnI6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIC8vIFRPRE86IGVycm9yCisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIW1PdXRwdXRCbG9ja1Bvb2wpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gW3RoaXNdIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGRvbid0IHVzZSBxdWVyeV92YgorICAgICAgICAgICAgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0IG91dHB1dEZvcm1hdCgwdSk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IGludGYoKS0+cXVlcnlfdmIoCisgICAgICAgICAgICAgICAgICAgIHsgJm91dHB1dEZvcm1hdCB9LAorICAgICAgICAgICAgICAgICAgICB7IEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSB9LAorICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0sgJiYgZXJyICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJxdWVyeSBlcnIgPSAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IHBvb2xJZCA9CisgICAgICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6R1JBUEhJQworICAgICAgICAgICAgICAgICAgICAgICAgPyBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQworICAgICAgICAgICAgICAgICAgICAgICAgOiBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOworICAgICAgICAgICAgaWYgKHBhcmFtcy5zaXplKCkpIHsKKyAgICAgICAgICAgICAgICBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQgKm91dHB1dFBvb2xzID0KKyAgICAgICAgICAgICAgICAgICAgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICAgICAgaWYgKG91dHB1dFBvb2xzICYmIG91dHB1dFBvb2xzLT5mbGV4Q291bnQoKSA+PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIHBvb2xJZCA9IG91dHB1dFBvb2xzLT5tLnZhbHVlc1swXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gYmxvY2tQb29sOworICAgICAgICAgICAgZXJyID0gR2V0Q29kZWMyQmxvY2tQb29sKHBvb2xJZCwgc2hhcmVkX2Zyb21fdGhpcygpLCAmYmxvY2tQb29sKTsKKyAgICAgICAgICAgIEFMT0dEKCJVc2luZyBvdXRwdXQgYmxvY2sgcG9vbCB3aXRoIHBvb2xJRCAlbGx1ID0+IGdvdCAlbGx1IC0gJWQiLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBvb2xJZCwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZykoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tQb29sID8gYmxvY2tQb29sLT5nZXRMb2NhbElkKCkgOiAxMTEwMDAxMTEpLAorICAgICAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgIG1PdXRwdXRCbG9ja1Bvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEJsb2NraW5nQmxvY2tQb29sPihibG9ja1Bvb2wpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfSgpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gc3RhdGUtPm1MaXN0ZW5lcjsKKyAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgbGlzdGVuZXItPm9uRXJyb3JfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGhhc1F1ZXVlZFdvcms7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXdvcmspIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gZHJhaW4oZHJhaW5Nb2RlLCBtT3V0cHV0QmxvY2tQb29sKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgTXV0ZXhlZDxFeGVjU3RhdGU+OjpMb2NrZWQgc3RhdGUobUV4ZWNTdGF0ZSk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IHN0YXRlLT5tTGlzdGVuZXI7CisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbkVycm9yX25iKHNoYXJlZF9mcm9tX3RoaXMoKSwgZXJyKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaGFzUXVldWVkV29yazsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gdXBkYXRlczsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtOiB3b3JrLT5pbnB1dC5jb25maWdVcGRhdGUpIHsKKyAgICAgICAgICAgIGlmIChwYXJhbSkgeworICAgICAgICAgICAgICAgIHVwZGF0ZXMuZW1wbGFjZV9iYWNrKHBhcmFtLmdldCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXVwZGF0ZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gaW50ZigpLT5jb25maWdfdmIodXBkYXRlcywgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgQUxPR0QoImFwcGxpZWQgJXp1IGNvbmZpZ1VwZGF0ZXMgPT4gJXMgKCVkKSIsIHVwZGF0ZXMuc2l6ZSgpLCBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICB9CisgICAgfQorCisgICAgQUxPR1YoInN0YXJ0IHByb2Nlc3NpbmcgZnJhbWUgIyUiIFBSSXU2NCwgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIC8vIElmIGlucHV0IGJ1ZmZlciBsaXN0IGlzIG5vdCBlbXB0eSwgaXQgbWVhbnMgd2UgaGF2ZSBzb21lIGlucHV0IHRvIHByb2Nlc3Mgb24uCisgICAgLy8gSG93ZXZlciwgaW5wdXQgY291bGQgYmUgYSBudWxsIGJ1ZmZlci4gSW4gc3VjaCBjYXNlLCBjbGVhciB0aGUgYnVmZmVyIGxpc3QKKyAgICAvLyBiZWZvcmUgbWFraW5nIGNhbGwgdG8gcHJvY2VzcygpLgorICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpICYmICF3b3JrLT5pbnB1dC5idWZmZXJzWzBdKSB7CisgICAgICAgIEFMT0dEKCJFbmNvdW50ZXJlZCBudWxsIGlucHV0IGJ1ZmZlci4gQ2xlYXJpbmcgdGhlIGlucHV0IGJ1ZmZlciIpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgfQorICAgIHByb2Nlc3Mod29yaywgbU91dHB1dEJsb2NrUG9vbCk7CisgICAgQUxPR1YoInByb2Nlc3NlZCBmcmFtZSAjJSIgUFJJdTY0LCB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgTXV0ZXhlZDxXb3JrUXVldWU+OjpMb2NrZWQgcXVldWUobVdvcmtRdWV1ZSk7CisgICAgaWYgKHF1ZXVlLT5nZW5lcmF0aW9uKCkgIT0gZ2VuZXJhdGlvbikgeworICAgICAgICBBTE9HRCgid29yayBmb3JtIG9sZCBnZW5lcmF0aW9uOiB3YXMgJSIgUFJJdTY0ICIgbm93ICUiIFBSSXU2NCwKKyAgICAgICAgICAgICAgICBxdWV1ZS0+Z2VuZXJhdGlvbigpLCBnZW5lcmF0aW9uKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9UX0ZPVU5EOworICAgICAgICBxdWV1ZS51bmxvY2soKTsKKworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0ZS0+bUxpc3RlbmVyOworICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgbGlzdGVuZXItPm9uV29ya0RvbmVfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCB2ZWMod29yaykpOworICAgICAgICByZXR1cm4gaGFzUXVldWVkV29yazsKKyAgICB9CisgICAgaWYgKHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkICE9IDB1KSB7CisgICAgICAgIHF1ZXVlLnVubG9jaygpOworICAgICAgICBNdXRleGVkPEV4ZWNTdGF0ZT46OkxvY2tlZCBzdGF0ZShtRXhlY1N0YXRlKTsKKyAgICAgICAgQUxPR1YoInJldHVybmluZyB0aGlzIHdvcmsiKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0ZS0+bUxpc3RlbmVyOworICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgbGlzdGVuZXItPm9uV29ya0RvbmVfbmIoc2hhcmVkX2Zyb21fdGhpcygpLCB2ZWMod29yaykpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJxdWV1ZSBwZW5kaW5nIHdvcmsiKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB1bmV4cGVjdGVkOworCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgaWYgKHF1ZXVlLT5wZW5kaW5nKCkuY291bnQoZnJhbWVJbmRleCkgIT0gMCkgeworICAgICAgICAgICAgdW5leHBlY3RlZCA9IHN0ZDo6bW92ZShxdWV1ZS0+cGVuZGluZygpLmF0KGZyYW1lSW5kZXgpKTsKKyAgICAgICAgICAgIHF1ZXVlLT5wZW5kaW5nKCkuZXJhc2UoZnJhbWVJbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpcXVldWUtPnBlbmRpbmcoKS5pbnNlcnQoeyBmcmFtZUluZGV4LCBzdGQ6Om1vdmUod29yaykgfSk7CisKKyAgICAgICAgcXVldWUudW5sb2NrKCk7CisgICAgICAgIGlmICh1bmV4cGVjdGVkKSB7CisgICAgICAgICAgICBBTE9HRCgidW5leHBlY3RlZCBwZW5kaW5nIHdvcmsiKTsKKyAgICAgICAgICAgIHVuZXhwZWN0ZWQtPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIE11dGV4ZWQ8RXhlY1N0YXRlPjo6TG9ja2VkIHN0YXRlKG1FeGVjU3RhdGUpOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXIgPSBzdGF0ZS0+bUxpc3RlbmVyOworICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25Xb3JrRG9uZV9uYihzaGFyZWRfZnJvbV90aGlzKCksIHZlYyh1bmV4cGVjdGVkKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGhhc1F1ZXVlZFdvcms7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gU2ltcGxlQzJDb21wb25lbnQ6OmNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaykgeworICAgIHJldHVybiBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIGJsb2NrLT5vZmZzZXQoKSwgYmxvY2stPnNpemUoKSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gU2ltcGxlQzJDb21wb25lbnQ6OmNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaywgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKKyAgICByZXR1cm4gQzJCdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jay0+c2hhcmUob2Zmc2V0LCBzaXplLCA6OkMyRmVuY2UoKSkpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IFNpbXBsZUMyQ29tcG9uZW50OjpjcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaykgeworICAgIHJldHVybiBjcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLCBDMlJlY3QoYmxvY2stPndpZHRoKCksIGJsb2NrLT5oZWlnaHQoKSkpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IFNpbXBsZUMyQ29tcG9uZW50OjpjcmVhdGVHcmFwaGljQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywgY29uc3QgQzJSZWN0ICZjcm9wKSB7CisgICAgcmV0dXJuIEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLT5zaGFyZShjcm9wLCA6OkMyRmVuY2UoKSkpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMySW50ZXJmYWNlLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvU2ltcGxlQzJJbnRlcmZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4NDlhNGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL1NpbXBsZUMySW50ZXJmYWNlLmNwcApAQCAtMCwwICsxLDMxNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiU2ltcGxlQzJJbnRlcmZhY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKy8vIHVzZSBNZWRpYURlZnMgaGVyZSB2cy4gTWVkaWFDb2RlY0NvbnN0YW50cyBhcyB0aGlzIGlzIG5vdCBNZWRpYUNvZGVjIHNwZWNpZmljL2RlcGVuZGVudAorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIFNpbXBsZUludGVyZmFjZSAqLworCitTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6OkJhc2VQYXJhbXMoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJnJlZmxlY3RvciwKKyAgICAgICAgQzJTdHJpbmcgbmFtZSwKKyAgICAgICAgQzJDb21wb25lbnQ6OmtpbmRfdCBraW5kLAorICAgICAgICBDMkNvbXBvbmVudDo6ZG9tYWluX3QgZG9tYWluLAorICAgICAgICBDMlN0cmluZyBtZWRpYVR5cGUsCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RyaW5nPiBhbGlhc2VzKQorICAgIDogQzJJbnRlcmZhY2VIZWxwZXIocmVmbGVjdG9yKSB7CisgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU5hbWUsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9OQU1FKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyQ29tcG9uZW50TmFtZVNldHRpbmc+KG5hbWUuY19zdHIoKSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBpZiAoYWxpYXNlcy5zaXplKCkpIHsKKyAgICAgICAgQzJTdHJpbmcgam9pbmVkOworICAgICAgICBmb3IgKGNvbnN0IEMyU3RyaW5nICZhbGlhcyA6IGFsaWFzZXMpIHsKKyAgICAgICAgICAgIGlmIChqb2luZWQubGVuZ3RoKCkpIHsKKyAgICAgICAgICAgICAgICBqb2luZWQgKz0gIiwiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgam9pbmVkICs9IGFsaWFzOworICAgICAgICB9CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWxpYXNlcywgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FMSUFTRVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEFsbG9jU2hhcmVkU3RyaW5nPEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmc+KGpvaW5lZC5jX3N0cigpKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUtpbmQsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9LSU5EKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEtpbmRTZXR0aW5nKGtpbmQpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obURvbWFpbiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0RPTUFJTikKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnREb21haW5TZXR0aW5nKGRvbWFpbikpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAvLyBzaW1wbGUgaW50ZXJmYWNlcyBoYXZlIHNpbmdsZSBzdHJlYW1zCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0U3RyZWFtQ291bnQsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9DT1VOVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0U3RyZWFtQ291bnRUdW5pbmc6OmlucHV0KDEpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dFN0cmVhbUNvdW50LCBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0NPVU5UKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRTdHJlYW1Db3VudFR1bmluZzo6b3V0cHV0KDEpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgLy8gc2V0IHVwIGJ1ZmZlciBmb3JtYXRzIGFuZCBhbGxvY2F0b3JzCisKKyAgICAvLyBkZWZhdWx0IHRvIGxpbmVhciBidWZmZXJzIGFuZCBubyBtZWRpYSB0eXBlCisgICAgQzJCdWZmZXJEYXRhOjp0eXBlX3QgcmF3QnVmZmVyVHlwZSA9IEMyQnVmZmVyRGF0YTo6TElORUFSOworICAgIEMyU3RyaW5nIHJhd01lZGlhVHlwZTsKKyAgICBDMkFsbG9jYXRvcjo6aWRfdCByYXdBbGxvY2F0b3IgPSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUjsKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCByYXdQb29sSWQgPSBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOworICAgIEMyQnVmZmVyRGF0YTo6dHlwZV90IGNvZGVkQnVmZmVyVHlwZSA9IEMyQnVmZmVyRGF0YTo6TElORUFSOworICAgIEMyQWxsb2NhdG9yOjppZF90IGNvZGVkQWxsb2NhdG9yID0gQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVI7CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgY29kZWRQb29sSWQgPSBDMkJsb2NrUG9vbDo6QkFTSUNfTElORUFSOworCisgICAgc3dpdGNoIChkb21haW4pIHsKKyAgICAgICAgY2FzZSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFOgorICAgICAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fVklERU86CisgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgZGVmaW5lIHJhdyBpbWFnZT8gVGhlIG9ubHkgZGlmZmVyZW5jZSBpcyB0aW1lc3RhbXAgaGFuZGxpbmcKKyAgICAgICAgICAgIHJhd0J1ZmZlclR5cGUgPSBDMkJ1ZmZlckRhdGE6OkdSQVBISUM7CisgICAgICAgICAgICByYXdNZWRpYVR5cGUgPSBNRURJQV9NSU1FVFlQRV9WSURFT19SQVc7CisgICAgICAgICAgICByYXdBbGxvY2F0b3IgPSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0dSQVBISUM7CisgICAgICAgICAgICByYXdQb29sSWQgPSBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU86CisgICAgICAgICAgICByYXdCdWZmZXJUeXBlID0gQzJCdWZmZXJEYXRhOjpMSU5FQVI7CisgICAgICAgICAgICByYXdNZWRpYVR5cGUgPSBNRURJQV9NSU1FVFlQRV9BVURJT19SQVc7CisgICAgICAgICAgICByYXdBbGxvY2F0b3IgPSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUjsKKyAgICAgICAgICAgIHJhd1Bvb2xJZCA9IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBib29sIGlzRW5jb2RlciA9IGtpbmQgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKworICAgIC8vIGhhbmRsZSByYXcgZGVjb2RlcnMKKyAgICBpZiAobWVkaWFUeXBlID09IHJhd01lZGlhVHlwZSkgeworICAgICAgICBjb2RlZEJ1ZmZlclR5cGUgPSByYXdCdWZmZXJUeXBlOworICAgICAgICBjb2RlZEFsbG9jYXRvciA9IHJhd0FsbG9jYXRvcjsKKyAgICAgICAgY29kZWRQb29sSWQgPSByYXdQb29sSWQ7CisgICAgfQorCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0Rm9ybWF0LCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fQlVGRkVSX1RZUEUpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAwdSwgaXNFbmNvZGVyID8gcmF3QnVmZmVyVHlwZSA6IGNvZGVkQnVmZmVyVHlwZSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNZWRpYVR5cGUsIEMyX1BBUkFNS0VZX0lOUFVUX01FRElBX1RZUEUpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoQWxsb2NTaGFyZWRTdHJpbmc8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+KAorICAgICAgICAgICAgICAgICAgICBpc0VuY29kZXIgPyByYXdNZWRpYVR5cGUgOiBtZWRpYVR5cGUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obU91dHB1dEZvcm1hdCwgQzJfUEFSQU1LRVlfT1VUUFVUX1NUUkVBTV9CVUZGRVJfVFlQRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAwdSwgaXNFbmNvZGVyID8gY29kZWRCdWZmZXJUeXBlIDogcmF3QnVmZmVyVHlwZSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0TWVkaWFUeXBlLCBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShBbGxvY1NoYXJlZFN0cmluZzxDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgICAgICBpc0VuY29kZXIgPyBtZWRpYVR5cGUgOiByYXdNZWRpYVR5cGUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgaW5wdXRBbGxvY2F0b3JzWzFdID0geyBpc0VuY29kZXIgPyByYXdBbGxvY2F0b3IgOiBjb2RlZEFsbG9jYXRvciB9OworICAgIEMyQWxsb2NhdG9yOjppZF90IG91dHB1dEFsbG9jYXRvcnNbMV0gPSB7IGlzRW5jb2RlciA/IGNvZGVkQWxsb2NhdG9yIDogcmF3QWxsb2NhdG9yIH07CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Qgb3V0cHV0UG9vbElkc1sxXSA9IHsgaXNFbmNvZGVyID8gY29kZWRQb29sSWQgOiByYXdQb29sSWQgfTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dEFsbG9jYXRvcnMsIEMyX1BBUkFNS0VZX0lOUFVUX0FMTE9DQVRPUlMpCisgICAgICAgICAgICAud2l0aERlZmF1bHQoQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ6OkFsbG9jU2hhcmVkKGlucHV0QWxsb2NhdG9ycykpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtSW5wdXRBbGxvY2F0b3JzLCBtLnZhbHVlc1swXSkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtSW5wdXRBbGxvY2F0b3JzLCBtLnZhbHVlcykuaW5SYW5nZSgwLCAxKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0Pjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1PdXRwdXRBbGxvY2F0b3JzLCBDMl9QQVJBTUtFWV9PVVRQVVRfQUxMT0NBVE9SUykKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKG91dHB1dEFsbG9jYXRvcnMpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobU91dHB1dEFsbG9jYXRvcnMsIG0udmFsdWVzWzBdKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1PdXRwdXRBbGxvY2F0b3JzLCBtLnZhbHVlcykuaW5SYW5nZSgwLCAxKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dD46Ok5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtT3V0cHV0UG9vbElkcywgQzJfUEFSQU1LRVlfT1VUUFVUX0JMT0NLX1BPT0xTKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KEMyUG9ydEJsb2NrUG9vbHNUdW5pbmc6Om91dHB1dDo6QWxsb2NTaGFyZWQob3V0cHV0UG9vbElkcykpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtT3V0cHV0UG9vbElkcywgbS52YWx1ZXNbMF0pLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobU91dHB1dFBvb2xJZHMsIG0udmFsdWVzKS5pblJhbmdlKDAsIDEpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0Pjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIC8vIGFkZCBzdGF0ZWxlc3MgcGFyYW1zCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVN1YnNjcmliZWRQYXJhbUluZGljZXMsIEMyX1BBUkFNS0VZX1NVQlNDUklCRURfUEFSQU1fSU5ESUNFUykKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc6OkFsbG9jU2hhcmVkKDB1KSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsgQzJGKG1TdWJzY3JpYmVkUGFyYW1JbmRpY2VzLCBtLnZhbHVlc1swXSkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtU3Vic2NyaWJlZFBhcmFtSW5kaWNlcywgbS52YWx1ZXMpLmFueSgpIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8QzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nPjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIC8qIFRPRE8KKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1DdXJyZW50V29ya09yZGluYWwsIEMyX1BBUkFNS0VZX0NVUlJFTlRfV09SSykKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJDdXJyZW50V29ya1R1bmluZygpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoeyBDMkYobUN1cnJlbnRXb3JrT3JkaW5hbCwgbS50aW1lU3RhbXApLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUN1cnJlbnRXb3JrT3JkaW5hbCwgbS5mcmFtZUluZGV4KS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1DdXJyZW50V29ya09yZGluYWwsIG0uY3VzdG9tT3JkaW5hbCkuYW55KCkgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxDMkN1cnJlbnRXb3JrVHVuaW5nPjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1MYXN0SW5wdXRRdWV1ZWRXb3JrT3JkaW5hbCwgQzJfUEFSQU1LRVlfTEFTVF9JTlBVVF9RVUVVRUQpCisgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc6OmlucHV0KCkpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtTGFzdElucHV0UXVldWVkV29ya09yZGluYWwsIG0udGltZVN0YW1wKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXN0SW5wdXRRdWV1ZWRXb3JrT3JkaW5hbCwgbS5mcmFtZUluZGV4KS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXN0SW5wdXRRdWV1ZWRXb3JrT3JkaW5hbCwgbS5jdXN0b21PcmRpbmFsKS5hbnkoKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc6OmlucHV0Pjo6Tm9uU3RyaWN0VmFsdWVzV2l0aE5vRGVwcykKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1MYXN0T3V0cHV0UXVldWVkV29ya09yZGluYWwsIEMyX1BBUkFNS0VZX0xBU1RfT1VUUFVUX1FVRVVFRCkKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJMYXN0V29ya1F1ZXVlZFR1bmluZzo6b3V0cHV0KCkpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7IEMyRihtTGFzdE91dHB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLnRpbWVTdGFtcCkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtTGFzdE91dHB1dFF1ZXVlZFdvcmtPcmRpbmFsLCBtLmZyYW1lSW5kZXgpLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUxhc3RPdXRwdXRRdWV1ZWRXb3JrT3JkaW5hbCwgbS5jdXN0b21PcmRpbmFsKS5hbnkoKSB9KQorICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPEMyTGFzdFdvcmtRdWV1ZWRUdW5pbmc6Om91dHB1dD46Ok5vblN0cmljdFZhbHVlc1dpdGhOb0RlcHMpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJPdXRPZk1lbW9yeVR1bmluZz4gbU91dE9mTWVtb3J5OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydENvbmZpZ0NvdW50ZXJUdW5pbmc6OmlucHV0PiBtSW5wdXRDb25maWdDb3VudGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRDb25maWdDb3VudGVyVHVuaW5nOjpvdXRwdXQ+IG1PdXRwdXRDb25maWdDb3VudGVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbmZpZ0NvdW50ZXJUdW5pbmc+IG1EaXJlY3RDb25maWdDb3VudGVyOworCisgICAgKi8KK30KKwordm9pZCBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6Om5vSW5wdXRMYXRlbmN5KCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1SZXF1ZXN0ZWRJbnB1dERlbGF5LCBDMl9QQVJBTUtFWV9JTlBVVF9ERUxBWV9SRVFVRVNUKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRSZXF1ZXN0ZWREZWxheVR1bmluZzo6aW5wdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbElucHV0RGVsYXksIEMyX1BBUkFNS0VZX0lOUFVUX0RFTEFZKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9PdXRwdXRMYXRlbmN5KCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1SZXF1ZXN0ZWRPdXRwdXREZWxheSwgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZX1JFUVVFU1QpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjpvdXRwdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUFjdHVhbE91dHB1dERlbGF5LCBDMl9QQVJBTUtFWV9PVVRQVVRfREVMQVkpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9QaXBlbGluZUxhdGVuY3koKSB7CisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVJlcXVlc3RlZFBpcGVsaW5lRGVsYXksIEMyX1BBUkFNS0VZX1BJUEVMSU5FX0RFTEFZX1JFUVVFU1QpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyUmVxdWVzdGVkUGlwZWxpbmVEZWxheVR1bmluZygwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsUGlwZWxpbmVEZWxheSwgQzJfUEFSQU1LRVlfUElQRUxJTkVfREVMQVkpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQWN0dWFsUGlwZWxpbmVEZWxheVR1bmluZygwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7Cit9CisKK3ZvaWQgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zOjpub1ByaXZhdGVCdWZmZXJzKCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcml2YXRlQWxsb2NhdG9ycywgQzJfUEFSQU1LRVlfUFJJVkFURV9BTExPQ0FUT1JTKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEMyUHJpdmF0ZUFsbG9jYXRvcnNUdW5pbmc6OkFsbG9jU2hhcmVkKDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhQcml2YXRlQnVmZmVyQ291bnQsIEMyX1BBUkFNS0VZX01BWF9QUklWQVRFX0JVRkZFUl9DT1VOVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShDMk1heFByaXZhdGVCdWZmZXJDb3VudFR1bmluZzo6QWxsb2NTaGFyZWQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByaXZhdGVQb29sSWRzLCBDMl9QQVJBTUtFWV9QUklWQVRFX0JMT0NLX1BPT0xTKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKEMyUHJpdmF0ZUJsb2NrUG9vbHNUdW5pbmc6OkFsbG9jU2hhcmVkKDB1KSkKKyAgICAgICAgICAgIC5idWlsZCgpKTsKK30KKwordm9pZCBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXM6Om5vSW5wdXRSZWZlcmVuY2VzKCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFJlZmVyZW5jZUFnZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX1JFRkVSRU5DRV9BR0UpCisgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4UmVmZXJlbmNlQWdlVHVuaW5nOjppbnB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRSZWZlcmVuY2VDb3VudCwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX1JFRkVSRU5DRV9DT1VOVCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhSZWZlcmVuY2VDb3VudFR1bmluZzo6aW5wdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9PdXRwdXRSZWZlcmVuY2VzKCkgeworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhPdXRwdXRSZWZlcmVuY2VBZ2UsIEMyX1BBUkFNS0VZX09VVFBVVF9NQVhfUkVGRVJFTkNFX0FHRSkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhSZWZlcmVuY2VBZ2VUdW5pbmc6Om91dHB1dCgwdSkpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4T3V0cHV0UmVmZXJlbmNlQ291bnQsIEMyX1BBUkFNS0VZX09VVFBVVF9NQVhfUkVGRVJFTkNFX0NPVU5UKQorICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjpvdXRwdXQoMHUpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCit2b2lkIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtczo6bm9UaW1lU3RyZXRjaCgpIHsKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtVGltZVN0cmV0Y2gsIEMyX1BBUkFNS0VZX1RJTUVfU1RSRVRDSCkKKyAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRUaW1lU3RyZXRjaFR1bmluZygxLmYpKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworfQorCisvKgorICAgIENsaWVudHMgbmVlZCB0byBoYW5kbGUgdGhlIGZvbGxvd2luZyBiYXNlIHBhcmFtcyBkdWUgdG8gY3VzdG9tIGRlcGVuZGVuY3kuCisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBcGlMZXZlbFNldHRpbmc+IG1BcGlMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBcGlGZWF0dXJlc1NldHRpbmc+IG1BcGlGZWF0dXJlczsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZz4gbUF0dHJpYjsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzo6aW5wdXQ+IG1TdWdnZXN0ZWRJbnB1dEJ1ZmZlckNvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzo6b3V0cHV0PiBtU3VnZ2VzdGVkT3V0cHV0QnVmZmVyQ291bnQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJUcmlwcGVkVHVuaW5nPiBtVHJpcHBlZDsKKworKi8KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9leHBvcnRzLmxkcyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvZXhwb3J0cy5sZHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjQxYmFlOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvZXhwb3J0cy5sZHMKQEAgLTAsMCArMSw3IEBACit7CisgICAgZ2xvYmFsOgorICAgICAgICBDcmVhdGVDb2RlYzJGYWN0b3J5OworICAgICAgICBEZXN0cm95Q29kZWMyRmFjdG9yeTsKKyAgICBsb2NhbDogKjsKK307CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkNvbXBvbmVudC5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMyQ29tcG9uZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjJkNTcxNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2Jhc2UvaW5jbHVkZS9TaW1wbGVDMkNvbXBvbmVudC5oCkBAIC0wLDAgKzEsMjQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTSU1QTEVfQzJfQ09NUE9ORU5UX0hfCisjZGVmaW5lIFNJTVBMRV9DMl9DT01QT05FTlRfSF8KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NdXRleGVkLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU2ltcGxlQzJDb21wb25lbnQKKyAgICAgICAgOiBwdWJsaWMgQzJDb21wb25lbnQsIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFNpbXBsZUMyQ29tcG9uZW50PiB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKTsKKyAgICB2aXJ0dWFsIH5TaW1wbGVDMkNvbXBvbmVudCgpOworCisgICAgLy8gQzJDb21wb25lbnQKKyAgICAvLyBGcm9tIEMyQ29tcG9uZW50CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gJmxpc3RlbmVyLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXVlX25iKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGFubm91bmNlX25iKGNvbnN0IHN0ZDo6dmVjdG9yPEMyV29ya091dGxpbmU+ICZpdGVtcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmbHVzaF9zbSgKKyAgICAgICAgICAgIGZsdXNoX21vZGVfdCBtb2RlLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBkcmFpbl9uYihkcmFpbl9tb2RlX3QgbW9kZSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdGFydCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc3RvcCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVzZXQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZigpIG92ZXJyaWRlOworCisgICAgLy8gZm9yIGhhbmRsZXIKKyAgICBib29sIHByb2Nlc3NRdWV1ZSgpOworCitwcm90ZWN0ZWQ6CisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBpbnRlcm5hbCBzdGF0ZXMgb2YgdGhlIGNvbXBvbmVudCBhY2NvcmRpbmcgdG8gdGhlIGNvbmZpZyBzZXQKKyAgICAgKiBpbiB0aGUgaW50ZXJmYWNlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyBzdGFydCgpLCBidXQgb25seSBhdCB0aGUgZmlyc3QgaW52b2NhdGlvbiBvcgorICAgICAqIGFmdGVyIHJlc2V0KCkuCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBvbkluaXQoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdG9wIHRoZSBjb21wb25lbnQuCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBvblN0b3AoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXNldCB0aGUgY29tcG9uZW50LgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBvblJlc2V0KCkgPSAwOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgY29tcG9uZW50LgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBvblJlbGVhc2UoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBGbHVzaCB0aGUgY29tcG9uZW50LgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpID0gMDsKKworICAgIC8qKgorICAgICAqIFByb2Nlc3MgdGhlIGdpdmVuIHdvcmsgYW5kIGZpbmlzaCBwZW5kaW5nIHdvcmsgdXNpbmcgZmluaXNoKCkuCisgICAgICoKKyAgICAgKiBccGFyYW1baW4sb3V0XSAgIHdvcmsgICAgdGhlIHdvcmsgdG8gcHJvY2VzcworICAgICAqIFxwYXJhbVtpbl0gICAgICAgcG9vbCAgICB0aGUgcG9vbCB0byB1c2UgZm9yIGFsbG9jYXRpbmcgb3V0cHV0IGJsb2Nrcy4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgPSAwOworCisgICAgLyoqCisgICAgICogRHJhaW4gdGhlIGNvbXBvbmVudCBhbmQgZmluaXNoIHBlbmRpbmcgd29yayB1c2luZyBmaW5pc2goKS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gICBkcmFpbk1vZGUgICBtb2RlIG9mIGRyYWluLgorICAgICAqIFxwYXJhbVtpbl0gICBwb29sICAgICAgICB0aGUgcG9vbCB0byB1c2UgZm9yIGFsbG9jYXRpbmcgb3V0cHV0IGJsb2Nrcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICBUaGUgY29tcG9uZW50IGhhcyBkcmFpbmVkIGFsbCBwZW5kaW5nIG91dHB1dAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLgorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgICAgICBVbnN1cHBvcnRlZCBtb2RlIChlLmcuIERSQUlOX0NIQUlOKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSA9IDA7CisKKyAgICAvLyBmb3IgZGVyaXZlZCBjbGFzc2VzCisgICAgLyoqCisgICAgICogRmluaXNoIHBlbmRpbmcgd29yay4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0cmlldmUgdGhlIHBlbmRpbmcgd29yayBhY2NvcmRpbmcgdG8gfGZyYW1lSW5kZXh8IGFuZAorICAgICAqIGZlZWQgdGhlIHdvcmsgaW50byB8ZmlsbFdvcmt8IGZ1bmN0aW9uLiB8ZmlsbFdvcmt8IG11c3QgYmUKKyAgICAgKiAibm9uLWJsb2NraW5nIi4gT25jZSB8ZmlsbFdvcmt8IHJldHVybnMgdGhlIGZpbGxlZCB3b3JrIHdpbGwgYmUgcmV0dXJuZWQKKyAgICAgKiB0byB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogXHBhcmFtW2luXSAgIGZyYW1lSW5kZXggICAgdGhlIGluZGV4IG9mIHRoZSBwZW5kaW5nIHdvcmsKKyAgICAgKiBccGFyYW1baW5dICAgZmlsbFdvcmsgICAgICB0aGUgZnVuY3Rpb24gdG8gZmlsbCB0aGUgcmV0cmlldmVkIHdvcmsuCisgICAgICovCisgICAgdm9pZCBmaW5pc2godWludDY0X3QgZnJhbWVJbmRleCwgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICYpPiBmaWxsV29yayk7CisKKyAgICAvKioKKyAgICAgKiBDbG9uZSBwZW5kaW5nIG9yIGN1cnJlbnQgd29yayBhbmQgc2VuZCB0aGUgd29yayBiYWNrIHRvIGNsaWVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIHdpbGwgcmV0cmlldmUgYW5kIGNsb25lIHRoZSBwZW5kaW5nIG9yIGN1cnJlbnQgd29yayBhY2NvcmRpbmcKKyAgICAgKiB0byB8ZnJhbWVJbmRleHwgYW5kIGZlZWQgdGhlIHdvcmsgaW50byB8ZmlsbFdvcmt8IGZ1bmN0aW9uLiB8ZmlsbFdvcmt8CisgICAgICogbXVzdCBiZSAibm9uLWJsb2NraW5nIi4gT25jZSB8ZmlsbFdvcmt8IHJldHVybnMgdGhlIGZpbGxlZCB3b3JrIHdpbGwgYmUKKyAgICAgKiByZXR1cm5lZCB0byB0aGUgY2xpZW50LgorICAgICAqCisgICAgICogXHBhcmFtW2luXSAgIGZyYW1lSW5kZXggICAgdGhlIGluZGV4IG9mIHRoZSB3b3JrCisgICAgICogXHBhcmFtW2luXSAgIGN1cnJlbnRXb3JrICAgdGhlIGN1cnJlbnQgd29yayB1bmRlciBwcm9jZXNzaW5nCisgICAgICogXHBhcmFtW2luXSAgIGZpbGxXb3JrICAgICAgdGhlIGZ1bmN0aW9uIHRvIGZpbGwgdGhlIHJldHJpZXZlZCB3b3JrLgorICAgICAqLworICAgIHZvaWQgY2xvbmVBbmRTZW5kKAorICAgICAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZjdXJyZW50V29yaywKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmKT4gZmlsbFdvcmspOworCisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjcmVhdGVMaW5lYXJCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jayk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywKKyAgICAgICAgICAgIGNvbnN0IEMyUmVjdCAmY3JvcCk7CisKKyAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IE5PX0RSQUlOID0gfjB1OworCisgICAgQzJSZWFkVmlldyBtRHVtbXlSZWFkVmlldzsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IG1JbnRmOworCisgICAgY2xhc3MgV29ya0hhbmRsZXIgOiBwdWJsaWMgQUhhbmRsZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgICBrV2hhdFByb2Nlc3MsCisgICAgICAgICAgICBrV2hhdEluaXQsCisgICAgICAgICAgICBrV2hhdFN0YXJ0LAorICAgICAgICAgICAga1doYXRTdG9wLAorICAgICAgICAgICAga1doYXRSZXNldCwKKyAgICAgICAgICAgIGtXaGF0UmVsZWFzZSwKKyAgICAgICAgfTsKKworICAgICAgICBXb3JrSGFuZGxlcigpOworICAgICAgICB+V29ya0hhbmRsZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAgICAgdm9pZCBzZXRDb21wb25lbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFNpbXBsZUMyQ29tcG9uZW50PiAmdGhpeik7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxTaW1wbGVDMkNvbXBvbmVudD4gbVRoaXo7CisgICAgICAgIGJvb2wgbVJ1bm5pbmc7CisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBVTklOSVRJQUxJWkVELAorICAgICAgICBTVE9QUEVELAorICAgICAgICBSVU5OSU5HLAorICAgIH07CisKKyAgICBzdHJ1Y3QgRXhlY1N0YXRlIHsKKyAgICAgICAgRXhlY1N0YXRlKCkgOiBtU3RhdGUoVU5JTklUSUFMSVpFRCkge30KKworICAgICAgICBpbnQgbVN0YXRlOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgfTsKKyAgICBNdXRleGVkPEV4ZWNTdGF0ZT4gbUV4ZWNTdGF0ZTsKKworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisgICAgc3A8V29ya0hhbmRsZXI+IG1IYW5kbGVyOworCisgICAgY2xhc3MgV29ya1F1ZXVlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHR5cGVkZWYgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gUGVuZGluZ1dvcms7CisKKyAgICAgICAgaW5saW5lIFdvcmtRdWV1ZSgpIDogbUZsdXNoKGZhbHNlKSwgbUdlbmVyYXRpb24oMHVsKSB7fQorCisgICAgICAgIGlubGluZSB1aW50NjRfdCBnZW5lcmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbUdlbmVyYXRpb247IH0KKyAgICAgICAgaW5saW5lIHZvaWQgaW5jR2VuZXJhdGlvbigpIHsgKyttR2VuZXJhdGlvbjsgbUZsdXNoID0gdHJ1ZTsgfQorCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHBvcF9mcm9udCgpOworICAgICAgICB2b2lkIHB1c2hfYmFjayhzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKTsKKyAgICAgICAgYm9vbCBlbXB0eSgpIGNvbnN0OworICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUoKSBjb25zdDsKKyAgICAgICAgdm9pZCBtYXJrRHJhaW4odWludDMyX3QgZHJhaW5Nb2RlKTsKKyAgICAgICAgaW5saW5lIGJvb2wgcG9wUGVuZGluZ0ZsdXNoKCkgeworICAgICAgICAgICAgYm9vbCBmbHVzaCA9IG1GbHVzaDsKKyAgICAgICAgICAgIG1GbHVzaCA9IGZhbHNlOworICAgICAgICAgICAgcmV0dXJuIGZsdXNoOworICAgICAgICB9CisgICAgICAgIHZvaWQgY2xlYXIoKTsKKyAgICAgICAgUGVuZGluZ1dvcmsgJnBlbmRpbmcoKSB7IHJldHVybiBtUGVuZGluZ1dvcms7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlOworICAgICAgICB9OworCisgICAgICAgIGJvb2wgbUZsdXNoOworICAgICAgICB1aW50NjRfdCBtR2VuZXJhdGlvbjsKKyAgICAgICAgc3RkOjpsaXN0PEVudHJ5PiBtUXVldWU7CisgICAgICAgIFBlbmRpbmdXb3JrIG1QZW5kaW5nV29yazsKKyAgICB9OworICAgIE11dGV4ZWQ8V29ya1F1ZXVlPiBtV29ya1F1ZXVlOworCisgICAgY2xhc3MgQmxvY2tpbmdCbG9ja1Bvb2w7CisgICAgc3RkOjpzaGFyZWRfcHRyPEJsb2NraW5nQmxvY2tQb29sPiBtT3V0cHV0QmxvY2tQb29sOworCisgICAgU2ltcGxlQzJDb21wb25lbnQoKSA9IGRlbGV0ZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU0lNUExFX0MyX0NPTVBPTkVOVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMySW50ZXJmYWNlLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9iYXNlL2luY2x1ZGUvU2ltcGxlQzJJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDUxZDNkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYmFzZS9pbmNsdWRlL1NpbXBsZUMySW50ZXJmYWNlLmgKQEAgLTAsMCArMSwyMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0lNUExFX0MyX0lOVEVSRkFDRV9IXworI2RlZmluZSBBTkRST0lEX1NJTVBMRV9DMl9JTlRFUkZBQ0VfSF8KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBXcmFwIGEgY29tbW9uIGludGVyZmFjZSBvYmplY3QgKHN1Y2ggYXMgQ29kZWMyQ2xpZW50OjpJbnRlcmZhY2UsIG9yIEMySW50ZXJmYWNlSGVscGVyIGludG8KKyAqIGEgQzJDb21wb25lbnRJbnRlcmZhY2UuCisgKgorICogXHBhcmFtIFQgY29tbW9uIGludGVyZmFjZSB0eXBlCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgU2ltcGxlQzJJbnRlcmZhY2UgOiBwdWJsaWMgQzJDb21wb25lbnRJbnRlcmZhY2UgeworcHVibGljOgorICAgIFNpbXBsZUMySW50ZXJmYWNlKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFQ+ICZpbXBsKQorICAgICAgICA6IG1OYW1lKG5hbWUpLAorICAgICAgICAgIG1JZChpZCksCisgICAgICAgICAgbUltcGwoaW1wbCkgeworICAgIH0KKworICAgIH5TaW1wbGVDMkludGVyZmFjZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIC8vIEZyb20gQzJDb21wb25lbnRJbnRlcmZhY2UKKyAgICBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbU5hbWU7IH0KKyAgICBjMl9ub2RlX2lkX3QgZ2V0SWQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtSWQ7IH0KKyAgICBjMl9zdGF0dXNfdCBxdWVyeV92YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUltcGwtPnF1ZXJ5KHN0YWNrUGFyYW1zLCBoZWFwUGFyYW1JbmRpY2VzLCBtYXlCbG9jaywgaGVhcFBhcmFtcyk7CisgICAgfQorICAgIGMyX3N0YXR1c190IGNvbmZpZ192YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5jb25maWcocGFyYW1zLCBtYXlCbG9jaywgZmFpbHVyZXMpOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVUdW5uZWxfc20oYzJfbm9kZV9pZF90KSBvdmVycmlkZSB7IHJldHVybiBDMl9PTUlUVEVEOyB9CisgICAgYzJfc3RhdHVzX3QgcmVsZWFzZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QpIG92ZXJyaWRlIHsgcmV0dXJuIEMyX09NSVRURUQ7IH0KKyAgICBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICogY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMocGFyYW1zKTsKKyAgICB9CisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfdmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW1wbC0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoZmllbGRzLCBtYXlCbG9jayk7CisgICAgfQorCitwcml2YXRlOgorICAgIEMyU3RyaW5nIG1OYW1lOworICAgIGNvbnN0IGMyX25vZGVfaWRfdCBtSWQ7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFQ+IG1JbXBsOworfTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzZXMgZm9yIGNvbW1vbiBpbnRlcmZhY2VzLgorICovCit0ZW1wbGF0ZTw+CitjbGFzcyBTaW1wbGVDMkludGVyZmFjZTx2b2lkPiB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQmFzZSBDb2RlYyAyLjAgcGFyYW1ldGVycyByZXF1aXJlZCBmb3IgYWxsIGNvbXBvbmVudHMuCisgICAgICovCisgICAgc3RydWN0IEJhc2VQYXJhbXMgOiBDMkludGVyZmFjZUhlbHBlciB7CisgICAgICAgIGV4cGxpY2l0IEJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyLAorICAgICAgICAgICAgICAgIEMyU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OmtpbmRfdCBraW5kLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50Ojpkb21haW5fdCBkb21haW4sCisgICAgICAgICAgICAgICAgQzJTdHJpbmcgbWVkaWFUeXBlLAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RyaW5nPiBhbGlhc2VzID0gc3RkOjp2ZWN0b3I8QzJTdHJpbmc+KCkpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGhhcyBubyBpbnB1dCBsYXRlbmN5LiBPdGhlcndpc2UsIGNvbXBvbmVudCBtdXN0CisgICAgICAgIC8vLyBhZGQgc3VwcG9ydCBmb3IgQzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc6OmlucHV0IGFuZCBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQuCisgICAgICAgIHZvaWQgbm9JbnB1dExhdGVuY3koKTsKKworICAgICAgICAvLy8gTWFya3MgdGhhdCB0aGlzIGNvbXBvbmVudCBoYXMgbm8gb3V0cHV0IGxhdGVuY3kuIE90aGVyd2lzZSwgY29tcG9uZW50IG11c3QKKyAgICAgICAgLy8vIGFkZCBzdXBwb3J0IGZvciBDMlBvcnRSZXF1ZXN0ZWREZWxheVR1bmluZzo6b3V0cHV0IGFuZCBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6b3V0cHV0LgorICAgICAgICB2b2lkIG5vT3V0cHV0TGF0ZW5jeSgpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGhhcyBubyBwaXBlbGluZSBsYXRlbmN5LiBPdGhlcndpc2UsIGNvbXBvbmVudCBtdXN0CisgICAgICAgIC8vLyBhZGQgc3VwcG9ydCBmb3IgQzJSZXF1ZXN0ZWRQaXBlbGluZURlbGF5VHVuaW5nIGFuZCBDMkFjdHVhbFBpcGVsaW5lRGVsYXlUdW5pbmcuCisgICAgICAgIHZvaWQgbm9QaXBlbGluZUxhdGVuY3koKTsKKworICAgICAgICAvLy8gTWFya3MgdGhhdCB0aGlzIGNvbXBvbmVudCBoYXMgbm8gbmVlZCBmb3IgcHJpdmF0ZSBidWZmZXJzLiBPdGhlcndpc2UsIGNvbXBvbmVudCBtdXN0CisgICAgICAgIC8vLyBhZGQgc3VwcG9ydCBmb3IgQzJNYXhQcml2YXRlQnVmZmVyQ291bnRUdW5pbmcsIEMyUHJpdmF0ZUFsbG9jYXRvcnNUdW5pbmcgYW5kCisgICAgICAgIC8vLyBDMlByaXZhdGVCbG9ja1Bvb2xzVHVuaW5nLgorICAgICAgICB2b2lkIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsKKworICAgICAgICAvLy8gTWFya3MgdGhhdCB0aGlzIGNvbXBvbmVudCBob2xkcyBubyByZWZlcmVuY2VzIHRvIGlucHV0IGJ1ZmZlcnMuIE90aGVyd2lzZSwgY29tcG9uZW50CisgICAgICAgIC8vLyBtdXN0IGFkZCBzdXBwb3J0IGZvciBDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzo6aW5wdXQgYW5kCisgICAgICAgIC8vLyBDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjppbnB1dC4KKyAgICAgICAgdm9pZCBub0lucHV0UmVmZXJlbmNlcygpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGhvbGRzIG5vIHJlZmVyZW5jZXMgdG8gb3V0cHV0IGJ1ZmZlcnMuIE90aGVyd2lzZSwgY29tcG9uZW50CisgICAgICAgIC8vLyBtdXN0IGFkZCBzdXBwb3J0IGZvciBDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzo6b3V0cHV0IGFuZAorICAgICAgICAvLy8gQzJTdHJlYW1NYXhSZWZlcmVuY2VDb3VudFR1bmluZzo6b3V0cHV0LgorICAgICAgICB2b2lkIG5vT3V0cHV0UmVmZXJlbmNlcygpOworCisgICAgICAgIC8vLyBNYXJrcyB0aGF0IHRoaXMgY29tcG9uZW50IGRvZXMgbm90IHN0cmV0Y2ggdGltZS4gT3RoZXJ3aXNlLCBjb21wb25lbnQKKyAgICAgICAgLy8vIG11c3QgYWRkIHN1cHBvcnQgZm9yIEMyQ29tcG9uZW50VGltZVN0cmV0Y2hUdW5pbmcuCisgICAgICAgIHZvaWQgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFwaUxldmVsU2V0dGluZz4gbUFwaUxldmVsOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBcGlGZWF0dXJlc1NldHRpbmc+IG1BcGlGZWF0dXJlczsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQbGF0Zm9ybUxldmVsU2V0dGluZz4gbVBsYXRmb3JtTGV2ZWw7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBsYXRmb3JtRmVhdHVyZXNTZXR0aW5nPiBtUGxhdGZvcm1GZWF0dXJlczsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnROYW1lU2V0dGluZz4gbU5hbWU7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEFsaWFzZXNTZXR0aW5nPiBtQWxpYXNlczsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50S2luZFNldHRpbmc+IG1LaW5kOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnREb21haW5TZXR0aW5nPiBtRG9tYWluOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZz4gbUF0dHJpYjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50VGltZVN0cmV0Y2hUdW5pbmc+IG1UaW1lU3RyZXRjaDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ+IG1JbnB1dE1lZGlhVHlwZTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6Om91dHB1dD4gbU91dHB1dE1lZGlhVHlwZTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0PiBtSW5wdXRGb3JtYXQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJ1ZmZlclR5cGVTZXR0aW5nOjpvdXRwdXQ+IG1PdXRwdXRGb3JtYXQ7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFJlcXVlc3RlZERlbGF5VHVuaW5nOjppbnB1dD4gbVJlcXVlc3RlZElucHV0RGVsYXk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRSZXF1ZXN0ZWREZWxheVR1bmluZzo6b3V0cHV0PiBtUmVxdWVzdGVkT3V0cHV0RGVsYXk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlcXVlc3RlZFBpcGVsaW5lRGVsYXlUdW5pbmc+IG1SZXF1ZXN0ZWRQaXBlbGluZURlbGF5OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQ+IG1BY3R1YWxJbnB1dERlbGF5OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dD4gbUFjdHVhbE91dHB1dERlbGF5OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nPiBtQWN0dWFsUGlwZWxpbmVEZWxheTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhSZWZlcmVuY2VBZ2VUdW5pbmc6OmlucHV0PiBtTWF4SW5wdXRSZWZlcmVuY2VBZ2U7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFJlZmVyZW5jZUNvdW50VHVuaW5nOjppbnB1dD4gbU1heElucHV0UmVmZXJlbmNlQ291bnQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFJlZmVyZW5jZUFnZVR1bmluZzo6b3V0cHV0PiBtTWF4T3V0cHV0UmVmZXJlbmNlQWdlOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhSZWZlcmVuY2VDb3VudFR1bmluZzo6b3V0cHV0PiBtTWF4T3V0cHV0UmVmZXJlbmNlQ291bnQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk1heFByaXZhdGVCdWZmZXJDb3VudFR1bmluZz4gbU1heFByaXZhdGVCdWZmZXJDb3VudDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQb3J0U3RyZWFtQ291bnRUdW5pbmc6OmlucHV0PiBtSW5wdXRTdHJlYW1Db3VudDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFN0cmVhbUNvdW50VHVuaW5nOjpvdXRwdXQ+IG1PdXRwdXRTdHJlYW1Db3VudDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdWJzY3JpYmVkUGFyYW1JbmRpY2VzVHVuaW5nPiBtU3Vic2NyaWJlZFBhcmFtSW5kaWNlczsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjppbnB1dD4gbVN1Z2dlc3RlZElucHV0QnVmZmVyQ291bnQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzo6b3V0cHV0PiBtU3VnZ2VzdGVkT3V0cHV0QnVmZmVyQ291bnQ7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ3VycmVudFdvcmtUdW5pbmc+IG1DdXJyZW50V29ya09yZGluYWw7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxhc3RXb3JrUXVldWVkVHVuaW5nOjppbnB1dD4gbUxhc3RJbnB1dFF1ZXVlZFdvcmtPcmRpbmFsOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMYXN0V29ya1F1ZXVlZFR1bmluZzo6b3V0cHV0PiBtTGFzdE91dHB1dFF1ZXVlZFdvcmtPcmRpbmFsOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjppbnB1dD4gbUlucHV0QWxsb2NhdG9yczsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dD4gbU91dHB1dEFsbG9jYXRvcnM7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlByaXZhdGVBbGxvY2F0b3JzVHVuaW5nPiBtUHJpdmF0ZUFsbG9jYXRvcnM7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ+IG1PdXRwdXRQb29sSWRzOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQcml2YXRlQmxvY2tQb29sc1R1bmluZz4gbVByaXZhdGVQb29sSWRzOworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlRyaXBwZWRUdW5pbmc+IG1UcmlwcGVkOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJPdXRPZk1lbW9yeVR1bmluZz4gbU91dE9mTWVtb3J5OworCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvcnRDb25maWdDb3VudGVyVHVuaW5nOjppbnB1dD4gbUlucHV0Q29uZmlnQ291bnRlcjsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9ydENvbmZpZ0NvdW50ZXJUdW5pbmc6Om91dHB1dD4gbU91dHB1dENvbmZpZ0NvdW50ZXI7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbmZpZ0NvdW50ZXJUdW5pbmc+IG1EaXJlY3RDb25maWdDb3VudGVyOworICAgIH07Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordXNpbmcgU2ltcGxlSW50ZXJmYWNlID0gU2ltcGxlQzJJbnRlcmZhY2U8VD47CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIC4uLkFyZ3M+CitzdGQ6OnNoYXJlZF9wdHI8VD4gQWxsb2NTaGFyZWRTdHJpbmcoY29uc3QgQXJncygmLi4uIGFyZ3MpLCBjb25zdCBjaGFyICpzdHIpIHsKKyAgICBzaXplX3QgbGVuID0gc3RybGVuKHN0cikgKyAxOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiByZXQgPSBUOjpBbGxvY1NoYXJlZChsZW4sIGFyZ3MuLi4pOworICAgIHN0cmNweShyZXQtPm0udmFsdWUsIHN0cik7CisgICAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgLi4uQXJncz4KK3N0ZDo6c2hhcmVkX3B0cjxUPiBBbGxvY1NoYXJlZFN0cmluZyhjb25zdCBBcmdzKCYuLi4gYXJncyksIGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gcmV0ID0gVDo6QWxsb2NTaGFyZWQoc3RyLmxlbmd0aCgpICsgMSwgYXJncy4uLik7CisgICAgc3RyY3B5KHJldC0+bS52YWx1ZSwgc3RyLmNfc3RyKCkpOworICAgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFNldHRlciB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGUgdHlwZTsKKworICAgIHN0YXRpYyBDMlIgTm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywgQzJJbnRlcmZhY2VIZWxwZXI6OkMyUDx0eXBlPiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIHJldHVybiBtZS5GKG1lLnYudmFsdWUpLnZhbGlkYXRlUG9zc2libGUobWUudi52YWx1ZSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBOb25TdHJpY3RWYWx1ZXNXaXRoTm9EZXBzKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywgQzJJbnRlcmZhY2VIZWxwZXI6OkMyUDx0eXBlPiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBtZS52LmZsZXhDb3VudCgpOyArK2l4KSB7CisgICAgICAgICAgICByZXMucGx1cyhtZS5GKG1lLnYubS52YWx1ZXNbaXhdKS52YWxpZGF0ZVBvc3NpYmxlKG1lLnYubS52YWx1ZXNbaXhdKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFN0cmljdFZhbHVlV2l0aE5vRGVwcygKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBjb25zdCBDMkludGVyZmFjZUhlbHBlcjo6QzJQPHR5cGU+ICZvbGQsCisgICAgICAgICAgICBDMkludGVyZmFjZUhlbHBlcjo6QzJQPHR5cGU+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYudmFsdWUpLnN1cHBvcnRzTm93KG1lLnYudmFsdWUpKSB7CisgICAgICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IG9sZC52LnZhbHVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtZS5GKG1lLnYudmFsdWUpLnZhbGlkYXRlUG9zc2libGUobWUudi52YWx1ZSk7CisgICAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX1NJTVBMRV9DMl9JTlRFUkZBQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDgxZTI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDEgQEAKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImNvZGVjMnBsYXkiLAorICAgIGRlZmF1bHRzOiBbImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIl0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJjb2RlYzIuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYWRybV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJkYXRhc291cmNlIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvY29kZWMyLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2NtZHMvY29kZWMyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGVhZjg4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvY21kcy9jb2RlYzIuY3BwCkBAIC0wLDAgKzEsNDgzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDx0aHJlYWQ+CisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiY29kZWMyIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9EYXRhU291cmNlRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCisjaW5jbHVkZSA8Z3VpL0dMQ29uc3VtZXIuaD4KKyNpbmNsdWRlIDxndWkvSVByb2R1Y2VyTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlQ29tcG9zZXJDbGllbnQuaD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPEMyV29yay5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTGluZWFyQnVmZmVyIDogcHVibGljIEMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBMaW5lYXJCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaykKKyAgICAgICAgOiBDMkJ1ZmZlcih7IGJsb2NrLT5zaGFyZShibG9jay0+b2Zmc2V0KCksIGJsb2NrLT5zaXplKCksIDo6QzJGZW5jZSgpKSB9KSB7fQorfTsKKworY2xhc3MgTGlzdGVuZXI7CisKK2NsYXNzIFNpbXBsZVBsYXllciB7CitwdWJsaWM6CisgICAgU2ltcGxlUGxheWVyKCk7CisgICAgflNpbXBsZVBsYXllcigpOworCisgICAgdm9pZCBvbldvcmtEb25lKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB3b3JrSXRlbXMpOworICAgIHZvaWQgb25UcmlwcGVkKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gc2V0dGluZ1Jlc3VsdCk7CisgICAgdm9pZCBvbkVycm9yKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwgdWludDMyX3QgZXJyb3JDb2RlKTsKKworICAgIHZvaWQgcGxheShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKworICAgIHNwPElQcm9kdWNlckxpc3RlbmVyPiBtUHJvZHVjZXJMaXN0ZW5lcjsKKworICAgIHN0ZDo6YXRvbWljX2ludCBtTGluZWFyUG9vbElkOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NJb247CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtTGluZWFyUG9vbDsKKworICAgIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworCisgICAgc3RkOjptdXRleCBtUHJvY2Vzc2VkTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUHJvY2Vzc2VkQ29uZGl0aW9uOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVByb2Nlc3NlZFdvcms7CisKKyAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZTsKKyAgICBzcDxTdXJmYWNlQ29tcG9zZXJDbGllbnQ+IG1Db21wb3NlckNsaWVudDsKKyAgICBzcDxTdXJmYWNlQ29udHJvbD4gbUNvbnRyb2w7Cit9OworCitjbGFzcyBMaXN0ZW5lciA6IHB1YmxpYyBDMkNvbXBvbmVudDo6TGlzdGVuZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IExpc3RlbmVyKFNpbXBsZVBsYXllciAqdGhpeikgOiBtVGhpcyh0aGl6KSB7fQorICAgIHZpcnR1YWwgfkxpc3RlbmVyKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmVfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKSBvdmVycmlkZSB7CisgICAgICAgIG1UaGlzLT5vbldvcmtEb25lKGNvbXBvbmVudCwgc3RkOjptb3ZlKHdvcmtJdGVtcykpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWRfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHNldHRpbmdSZXN1bHQpIG92ZXJyaWRlIHsKKyAgICAgICAgbVRoaXMtPm9uVHJpcHBlZChjb21wb25lbnQsIHNldHRpbmdSZXN1bHQpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgbVRoaXMtPm9uRXJyb3IoY29tcG9uZW50LCBlcnJvckNvZGUpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBTaW1wbGVQbGF5ZXIgKiBjb25zdCBtVGhpczsKK307CisKKworU2ltcGxlUGxheWVyOjpTaW1wbGVQbGF5ZXIoKQorICAgIDogbUxpc3RlbmVyKG5ldyBMaXN0ZW5lcih0aGlzKSksCisgICAgICBtUHJvZHVjZXJMaXN0ZW5lcihuZXcgRHVtbXlQcm9kdWNlckxpc3RlbmVyKSwKKyAgICAgIG1MaW5lYXJQb29sSWQoQzJCbG9ja1Bvb2w6OlBMQVRGT1JNX1NUQVJUKSwKKyAgICAgIG1Db21wb3NlckNsaWVudChuZXcgU3VyZmFjZUNvbXBvc2VyQ2xpZW50KSB7CisgICAgQ0hFQ0tfRVEobUNvbXBvc2VyQ2xpZW50LT5pbml0Q2hlY2soKSwgKHN0YXR1c190KU9LKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBzdG9yZSA9IEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICBDSEVDS19FUShzdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIsICZtQWxsb2NJb24pLCBDMl9PSyk7CisgICAgbUxpbmVhclBvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihtQWxsb2NJb24sIG1MaW5lYXJQb29sSWQrKyk7CisKKyAgICBtQ29udHJvbCA9IG1Db21wb3NlckNsaWVudC0+Y3JlYXRlU3VyZmFjZSgKKyAgICAgICAgICAgIFN0cmluZzgoIkEgU3VyZmFjZSIpLAorICAgICAgICAgICAgMTI4MCwKKyAgICAgICAgICAgIDgwMCwKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWVYxMik7CisgICAgICAgICAgICAvL1BJWEVMX0ZPUk1BVF9SR0JfNTY1KTsKKworICAgIENIRUNLKG1Db250cm9sICE9IG51bGxwdHIpOworICAgIENIRUNLKG1Db250cm9sLT5pc1ZhbGlkKCkpOworCisgICAgU3VyZmFjZUNvbXBvc2VyQ2xpZW50OjpUcmFuc2FjdGlvbnt9CisgICAgICAgICAgICAuc2V0TGF5ZXIobUNvbnRyb2wsIElOVF9NQVgpCisgICAgICAgICAgICAuc2hvdyhtQ29udHJvbCkKKyAgICAgICAgICAgIC5hcHBseSgpOworCisgICAgbVN1cmZhY2UgPSBtQ29udHJvbC0+Z2V0U3VyZmFjZSgpOworICAgIENIRUNLKG1TdXJmYWNlICE9IG51bGxwdHIpOworICAgIG1TdXJmYWNlLT5jb25uZWN0KE5BVElWRV9XSU5ET1dfQVBJX0NQVSwgbVByb2R1Y2VyTGlzdGVuZXIpOworfQorCitTaW1wbGVQbGF5ZXI6On5TaW1wbGVQbGF5ZXIoKSB7CisgICAgbUNvbXBvc2VyQ2xpZW50LT5kaXNwb3NlKCk7Cit9CisKK3ZvaWQgU2ltcGxlUGxheWVyOjpvbldvcmtEb25lKAorICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKSB7CisgICAgQUxPR1YoIlNpbXBsZVBsYXllcjo6b25Xb3JrRG9uZSIpOworICAgICh2b2lkKSBjb21wb25lbnQ7CisgICAgVUxvY2sgbChtUHJvY2Vzc2VkTG9jayk7CisgICAgZm9yIChhdXRvICYgaXRlbSA6IHdvcmtJdGVtcykgeworICAgICAgICBtUHJvY2Vzc2VkV29yay5wdXNoX2JhY2soc3RkOjptb3ZlKGl0ZW0pKTsKKyAgICB9CisgICAgbVByb2Nlc3NlZENvbmRpdGlvbi5ub3RpZnlfYWxsKCk7Cit9CisKK3ZvaWQgU2ltcGxlUGxheWVyOjpvblRyaXBwZWQoCisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHNldHRpbmdSZXN1bHQpIHsKKyAgICAodm9pZCkgY29tcG9uZW50OworICAgICh2b2lkKSBzZXR0aW5nUmVzdWx0OworICAgIC8vIFRPRE8KK30KKwordm9pZCBTaW1wbGVQbGF5ZXI6Om9uRXJyb3Ioc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LCB1aW50MzJfdCBlcnJvckNvZGUpIHsKKyAgICAodm9pZCkgY29tcG9uZW50OworICAgICh2b2lkKSBlcnJvckNvZGU7CisgICAgLy8gVE9ETworfQorCit2b2lkIFNpbXBsZVBsYXllcjo6cGxheShjb25zdCBzcDxJTWVkaWFTb3VyY2U+ICZzb3VyY2UpIHsKKyAgICBBTE9HVigiU2ltcGxlUGxheWVyOjpwbGF5Iik7CisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKKyAgICAodm9pZCkgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKHNvdXJjZS0+Z2V0Rm9ybWF0KCksICZmb3JtYXQpOworCisgICAgc3A8QUJ1ZmZlcj4gY3NkMCwgY3NkMTsKKyAgICBmb3JtYXQtPmZpbmRCdWZmZXIoImNzZC0wIiwgJmNzZDApOworICAgIGZvcm1hdC0+ZmluZEJ1ZmZlcigiY3NkLTEiLCAmY3NkMSk7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBzb3VyY2UtPnN0YXJ0KCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAic291cmNlIHJldHVybmVkIGVycm9yICVkICgweCUwOHgpXG4iLCBlcnIsIGVycik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gc3RvcmUgPSBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgKHZvaWQpc3RvcmUtPmNyZWF0ZUNvbXBvbmVudCgiYzIuYW5kcm9pZC5hdmMuZGVjb2RlciIsICZjb21wb25lbnQpOworCisgICAgKHZvaWQpY29tcG9uZW50LT5zZXRMaXN0ZW5lcl92YihtTGlzdGVuZXIsIEMyX0RPTlRfQkxPQ0spOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ+IHBvb2xzID0KKyAgICAgICAgQzJQb3J0QmxvY2tQb29sc1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSh7ICh1aW50NjRfdClDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQyB9KTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gcmVzdWx0OworICAgICh2b2lkKWNvbXBvbmVudC0+aW50ZigpLT5jb25maWdfdmIoe3Bvb2xzLmdldCgpfSwgQzJfRE9OVF9CTE9DSywgJnJlc3VsdCk7CisgICAgY29tcG9uZW50LT5zdGFydCgpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA4OyArK2kpIHsKKyAgICAgICAgbVdvcmtRdWV1ZS5lbXBsYWNlX2JhY2sobmV3IEMyV29yayk7CisgICAgfQorCisgICAgc3RkOjphdG9taWNfYm9vbCBydW5uaW5nKHRydWUpOworICAgIHN0ZDo6dGhyZWFkIHN1cmZhY2VUaHJlYWQoW3RoaXMsICZydW5uaW5nXSgpIHsKKyAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJmlnYnAgPSBtU3VyZmFjZS0+Z2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOworICAgICAgICB3aGlsZSAocnVubmluZykgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBVTG9jayBsKG1Qcm9jZXNzZWRMb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAobVByb2Nlc3NlZFdvcmsuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBtUHJvY2Vzc2VkQ29uZGl0aW9uLndhaXRfZm9yKGwsIDEwMG1zKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Qcm9jZXNzZWRXb3JrLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdvcmsuc3dhcChtUHJvY2Vzc2VkV29yay5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICBtUHJvY2Vzc2VkV29yay5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzbG90OworICAgICAgICAgICAgc3A8RmVuY2U+IGZlbmNlOworICAgICAgICAgICAgQUxPR1YoIlJlbmRlcjogRnJhbWUgIyVsbGQiLCB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJm91dHB1dCA9IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzWzBdOworICAgICAgICAgICAgaWYgKG91dHB1dCkgeworICAgICAgICAgICAgICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgYmxvY2sgPSBvdXRwdXQtPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmdyYWxsb2NIYW5kbGUgPSBVbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKGJsb2NrLmhhbmRsZSgpKTsKKyAgICAgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBidWZmZXIobmV3IEdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBncmFsbG9jSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhpY0J1ZmZlcjo6Q0xPTkVfSEFORExFLAorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sud2lkdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJsb2NrLmhlaWdodCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLAorICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1aW50NjRfdClHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLAorICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sud2lkdGgoKSkpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGdyYWxsb2NIYW5kbGUpOworCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gaWdicC0+YXR0YWNoQnVmZmVyKCZzbG90LCBidWZmZXIpOworCisgICAgICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBxYmkoCisgICAgICAgICAgICAgICAgICAgICAgICAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wICogMTAwMGxsKS5wZWVrbGwoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgSEFMX0RBVEFTUEFDRV9VTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVjdChibG9jay53aWR0aCgpLCBibG9jay5oZWlnaHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19XSU5ET1csCisgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgRmVuY2U6Ok5PX0ZFTkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgMCk7CisgICAgICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgcWJvOworICAgICAgICAgICAgICAgIGVyciA9IGlnYnAtPnF1ZXVlQnVmZmVyKHNsb3QsIHFiaSwgJnFibyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisKKyAgICAgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLm5vdGlmeV9hbGwoKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicmVuZGVyIGxvb3AgZmluaXNoZWQiKTsKKyAgICB9KTsKKworICAgIGxvbmcgbnVtRnJhbWVzID0gMDsKKyAgICBtTGluZWFyUG9vbC5yZXNldChuZXcgQzJQb29sZWRCbG9ja1Bvb2wobUFsbG9jSW9uLCBtTGluZWFyUG9vbElkKyspKTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgc2l6ZV90IHNpemUgPSAwdTsKKyAgICAgICAgdm9pZCAqZGF0YSA9IG51bGxwdHI7CisgICAgICAgIGludDY0X3QgdGltZXN0YW1wID0gMHU7CisgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY3NkOworICAgICAgICBpZiAoY3NkMCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjc2QgPSBjc2QwOworICAgICAgICAgICAgY3NkMCA9IG51bGxwdHI7CisgICAgICAgIH0gZWxzZSBpZiAoY3NkMSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjc2QgPSBjc2QxOworICAgICAgICAgICAgY3NkMSA9IG51bGxwdHI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBzb3VyY2UtPnJlYWQoJmJ1ZmZlcik7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0soYnVmZmVyID09IG51bGxwdHIpOworCisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgIENIRUNLKG1ldGEuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZXN0YW1wKSk7CisKKyAgICAgICAgICAgIHNpemUgPSBidWZmZXItPnNpemUoKTsKKyAgICAgICAgICAgIGRhdGEgPSBidWZmZXItPmRhdGEoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjc2QgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc2l6ZSA9IGNzZC0+c2l6ZSgpOworICAgICAgICAgICAgZGF0YSA9IGNzZC0+ZGF0YSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gUHJlcGFyZSBDMldvcmsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgICAgICB3aGlsZSAoIXdvcmspIHsKKyAgICAgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgICAgICBpZiAoIW1Xb3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCAxMDBtcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IG51bUZyYW1lczsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgIG1MaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgIHNpemUsCisgICAgICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAgICAgJmJsb2NrKTsKKyAgICAgICAgQzJXcml0ZVZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJDMkxpbmVhckJsb2NrOjptYXAoKSBmYWlsZWQgOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkodmlldy5iYXNlKCksIGRhdGEsIHNpemUpOworCisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IExpbmVhckJ1ZmZlcihibG9jaykpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgQUxPR1YoIkZyYW1lICMlbGQgc2l6ZSA9ICV6dSIsIG51bUZyYW1lcywgc2l6ZSk7CisgICAgICAgIC8vIERPIFRIRSBERUNPRElORworICAgICAgICBjb21wb25lbnQtPnF1ZXVlX25iKCZpdGVtcyk7CisKKyAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBudWxscHRyOworICAgICAgICB9CisKKyAgICAgICAgKytudW1GcmFtZXM7CisgICAgfQorICAgIEFMT0dWKCJtYWluIGxvb3AgZmluaXNoZWQiKTsKKyAgICBzb3VyY2UtPnN0b3AoKTsKKyAgICBydW5uaW5nLnN0b3JlKGZhbHNlKTsKKyAgICBzdXJmYWNlVGhyZWFkLmpvaW4oKTsKKworICAgIGNvbXBvbmVudC0+cmVsZWFzZSgpOworICAgIHByaW50ZigiXG4iKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK3N0YXRpYyB2b2lkIHVzYWdlKGNvbnN0IGNoYXIgKm1lKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJ1c2FnZTogJXMgW29wdGlvbnNdIFtpbnB1dF9maWxlbmFtZV1cbiIsIG1lKTsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIiAgICAgICAtaChlbHApXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgYW5kcm9pZDo6UHJvY2Vzc1N0YXRlOjpzZWxmKCktPnN0YXJ0VGhyZWFkUG9vbCgpOworCisgICAgaW50IHJlczsKKyAgICB3aGlsZSAoKHJlcyA9IGdldG9wdChhcmdjLCBhcmd2LCAiaCIpKSA+PSAwKSB7CisgICAgICAgIHN3aXRjaCAocmVzKSB7CisgICAgICAgICAgICBjYXNlICdoJzoKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgdXNhZ2UoYXJndlswXSk7CisgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGFyZ2MgLT0gb3B0aW5kOworICAgIGFyZ3YgKz0gb3B0aW5kOworCisgICAgaWYgKGFyZ2MgPCAxKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWRcbiIpOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBTaW1wbGVQbGF5ZXIgcGxheWVyOworCisgICAgZm9yIChpbnQgayA9IDA7IGsgPCBhcmdjICYmIGVyciA9PSBPSzsgKytrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVuYW1lID0gYXJndltrXTsKKworICAgICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0KKyAgICAgICAgICAgIERhdGFTb3VyY2VGYWN0b3J5OjpnZXRJbnN0YW5jZSgpLT5DcmVhdGVGcm9tVVJJKG51bGxwdHIgLyogaHR0cFNlcnZpY2UgKi8sIGZpbGVuYW1lKTsKKworICAgICAgICBpZiAoc3RybmNhc2VjbXAoZmlsZW5hbWUsICJzaW5lOiIsIDUpICYmIGRhdGFTb3VyY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gY3JlYXRlIGRhdGEgc291cmNlLlxuIik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorCisgICAgICAgIFZlY3RvcjxzcDxJTWVkaWFTb3VyY2U+ID4gbWVkaWFTb3VyY2VzOworICAgICAgICBzcDxJTWVkaWFTb3VyY2U+IG1lZGlhU291cmNlOworCisgICAgICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGUoZGF0YVNvdXJjZSk7CisKKyAgICAgICAgaWYgKGV4dHJhY3RvciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCBjcmVhdGUgZXh0cmFjdG9yLlxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IGV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoKTsKKworICAgICAgICBpZiAobWV0YSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICAgICAgaWYgKCFtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiZXh0cmFjdG9yIGRpZCBub3QgcHJvdmlkZSBNSU1FIHR5cGUuXG4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgbnVtVHJhY2tzID0gZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworCisgICAgICAgIHNpemVfdCBpOworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtVHJhY2tzOyArK2kpIHsKKyAgICAgICAgICAgIG1ldGEgPSBleHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSwgMCk7CisKKyAgICAgICAgICAgIGlmIChtZXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgICAgICBtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKKworICAgICAgICAgICAgLy8gVE9ETzogYWxsb3dpbmcgQVZDIG9ubHkgZm9yIHRoZSB0aW1lIGJlaW5nCisgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby9hdmMiLCA5KSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZXRhID0gbnVsbHB0cjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtZXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiTm8gQVZDIHRyYWNrIGZvdW5kLlxuIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBtZWRpYVNvdXJjZSA9IGV4dHJhY3Rvci0+Z2V0VHJhY2soaSk7CisgICAgICAgIGlmIChtZWRpYVNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgInNraXAgTlVMTCB0cmFjayAlenUsIHRvdGFsIHRyYWNrcyAlenUuXG4iLCBpLCBudW1UcmFja3MpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgcGxheWVyLnBsYXkobWVkaWFTb3VyY2UpOworICAgIH0KKworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1ZWI1MWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9mbGFjZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsibGliRkxBQy1oZWFkZXJzIl0sCisKKyAgICBzcmNzOiBbIkMyU29mdEZsYWNEZWMuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZmxhY2RlYyIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9mbGFjZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRGbGFjRW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliRkxBQyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMzliOWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNEZWMuY3BwCkBAIC0wLDAgKzEsMzc4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRGbGFjRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRGbGFjRGVjLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmZsYWMuZGVjb2RlciI7CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBDMlNvZnRGbGFjRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKyAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoCisgICAgICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmluUmFuZ2UoMSwgNjU1MzUwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA4KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDc2ODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoMSwgMjEwMDAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzMjc2OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGNtRW5jb2RpbmdJbmZvLCBDMl9QQVJBTUtFWV9QQ01fRU5DT0RJTkcpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBjbUVuY29kaW5nSW5mbzo6b3V0cHV0KDB1LCBDMkNvbmZpZzo6UENNXzE2KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1QY21FbmNvZGluZ0luZm8sIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNXzE2LAorICAgICAgICAgICAgICAgICAgICAgLy8gQzJDb25maWc6OlBDTV84LAorICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV9GTE9BVH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptUGNtRW5jb2RpbmdJbmZvKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIGludDMyX3QgZ2V0UGNtRW5jb2RpbmdJbmZvKCkgY29uc3QgeyByZXR1cm4gbVBjbUVuY29kaW5nSW5mby0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOjpvdXRwdXQ+IG1QY21FbmNvZGluZ0luZm87Cit9OworCitDMlNvZnRGbGFjRGVjOjpDMlNvZnRGbGFjRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1GTEFDRGVjb2RlcihudWxscHRyKSB7Cit9CisKK0MyU29mdEZsYWNEZWM6On5DMlNvZnRGbGFjRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNEZWM6Om9uU3RvcCgpIHsKKyAgICBpZiAobUZMQUNEZWNvZGVyKSBtRkxBQ0RlY29kZXItPmZsdXNoKCk7CisgICAgbWVtc2V0KCZtU3RyZWFtSW5mbywgMCwgc2l6ZW9mKG1TdHJlYW1JbmZvKSk7CisgICAgbUhhc1N0cmVhbUluZm8gPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEZsYWNEZWM6Om9uUmVzZXQoKSB7CisgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEZsYWNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CisgICAgaWYgKG1GTEFDRGVjb2RlcikgZGVsZXRlIG1GTEFDRGVjb2RlcjsKKyAgICBtRkxBQ0RlY29kZXIgPSBudWxscHRyOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRGbGFjRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0RmxhY0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgaWYgKG1GTEFDRGVjb2RlcikgeworICAgICAgICBkZWxldGUgbUZMQUNEZWNvZGVyOworICAgIH0KKyAgICBtRkxBQ0RlY29kZXIgPSBGTEFDRGVjb2Rlcjo6Q3JlYXRlKCk7CisgICAgaWYgKCFtRkxBQ0RlY29kZXIpIHsKKyAgICAgICAgQUxPR0UoImluaXREZWNvZGVyOiBmYWlsZWQgdG8gY3JlYXRlIEZMQUNEZWNvZGVyIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgbWVtc2V0KCZtU3RyZWFtSW5mbywgMCwgc2l6ZW9mKG1TdHJlYW1JbmZvKSk7CisgICAgbUhhc1N0cmVhbUluZm8gPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUlucHV0QnVmZmVyQ291bnQgPSAwOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKworLy8gKFRPRE8pIGFkZCBtdWx0aWZyYW1lIHN1cHBvcnQsIGluIHBsdWdpbiBhbmQgRkxBQ0RlY29kZXIuY3BwCit2b2lkIEMyU29mdEZsYWNEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMDsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwICYmICFjb2RlY0NvbmZpZykgeworICAgICAgICBBTE9HVigiRmlyc3QgZnJhbWUgaGFzIHRvIGluY2x1ZGUgY29uZmlndXJhdGlvbiwgZm9yY2luZyBjb25maWciKTsKKyAgICAgICAgY29kZWNDb25maWcgPSB0cnVlOworICAgIH0KKworICAgIHVpbnQ4X3QgKmlucHV0ID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICBpZiAoY29kZWNDb25maWcpIHsKKyAgICAgICAgc3RhdHVzX3QgZGVjb2RlckVyciA9IG1GTEFDRGVjb2Rlci0+cGFyc2VNZXRhZGF0YShpbnB1dCwgaW5TaXplKTsKKyAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gT0sgJiYgZGVjb2RlckVyciAhPSBXT1VMRF9CTE9DSykgeworICAgICAgICAgICAgQUxPR0UoInByb2Nlc3M6IEZMQUNEZWNvZGVyIHBhcnNlTWV0YURhdGEgcmV0dXJucyBlcnJvciAlZCIsIGRlY29kZXJFcnIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIG1JbnB1dEJ1ZmZlckNvdW50Kys7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChkZWNvZGVyRXJyID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICBBTE9HVigicHJvY2VzczogcGFyc2VNZXRhZGF0YSBpcyBCbG9ja2luZywgQ29udGludWUgJWQiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1TdHJlYW1JbmZvID0gbUZMQUNEZWNvZGVyLT5nZXRTdHJlYW1JbmZvKCk7CisgICAgICAgICAgICBpZiAobVN0cmVhbUluZm8uc2FtcGxlX3JhdGUgJiYgbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSAmJgorICAgICAgICAgICAgICAgIG1TdHJlYW1JbmZvLmNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgbUhhc1N0cmVhbUluZm8gPSB0cnVlOworICAgICAgICAgICAgICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygKKyAgICAgICAgICAgICAgICAgICAgMHUsIG1TdHJlYW1JbmZvLnNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCBjaGFubmVsQ291bnRJbmZvKAorICAgICAgICAgICAgICAgICAgICAwdSwgbVN0cmVhbUluZm8uY2hhbm5lbHMpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KGNoYW5uZWxDb3VudEluZm8pKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIFVwZGF0ZSBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR0QoInByb2Nlc3M6IGRlY29kZXIgY29uZmlndXJhdGlvbiA6ICVkIEh6LCAlZCBjaGFubmVscywgJWQgc2FtcGxlcywiCisgICAgICAgICAgICAgICAgICAiICVkIGJsb2NrIHNpemUiLCBtU3RyZWFtSW5mby5zYW1wbGVfcmF0ZSwgbVN0cmVhbUluZm8uY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAoaW50KW1TdHJlYW1JbmZvLnRvdGFsX3NhbXBsZXMsIG1TdHJlYW1JbmZvLm1heF9ibG9ja3NpemUpOworICAgICAgICB9CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBib29sIG91dHB1dEZsb2F0ID0gbUludGYtPmdldFBjbUVuY29kaW5nSW5mbygpID09IEMyQ29uZmlnOjpQQ01fRkxPQVQ7CisgICAgY29uc3Qgc2l6ZV90IHNhbXBsZVNpemUgPSBvdXRwdXRGbG9hdCA/IHNpemVvZihmbG9hdCkgOiBzaXplb2Yoc2hvcnQpOworICAgIHNpemVfdCBvdXRTaXplID0gbUhhc1N0cmVhbUluZm8gPworICAgICAgICAgICAgbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSAqIG1TdHJlYW1JbmZvLmNoYW5uZWxzICogc2FtcGxlU2l6ZQorICAgICAgICAgIDoga01heEJsb2NrU2l6ZSAqIEZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHMgKiBzYW1wbGVTaXplOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dFNpemUsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBkZWNvZGVyRXJyID0gbUZMQUNEZWNvZGVyLT5kZWNvZGVPbmVGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgaW5TaXplLCB3Vmlldy5kYXRhKCksICZvdXRTaXplLCBvdXRwdXRGbG9hdCk7CisgICAgaWYgKGRlY29kZXJFcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoInByb2Nlc3M6IEZMQUNEZWNvZGVyIGRlY29kZU9uZUZyYW1lIHJldHVybnMgZXJyb3IgJWQiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUlucHV0QnVmZmVyQ291bnQrKzsKKyAgICBBTE9HVigib3V0IGJ1ZmZlciBhdHRyLiBzaXplICV6dSIsIG91dFNpemUpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0U2l6ZSkpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICBpZiAobUZMQUNEZWNvZGVyKSBtRkxBQ0RlY29kZXItPmZsdXNoKCk7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdEZsYWNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0RmxhY0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRGbGFjRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRGbGFjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEZsYWNEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRGbGFjRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0RmxhY0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEZsYWNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ5MWJmZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0RlYy5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9GTEFDX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfRkxBQ19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJGTEFDRGVjb2Rlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRGbGFjRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEZsYWNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRGbGFjRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTWF4QmxvY2tTaXplICAgPSA0MDk2CisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgRkxBQ0RlY29kZXIgKm1GTEFDRGVjb2RlcjsKKyAgICBGTEFDX19TdHJlYW1NZXRhZGF0YV9TdHJlYW1JbmZvIG1TdHJlYW1JbmZvOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1IYXNTdHJlYW1JbmZvOworICAgIHNpemVfdCBtSW5wdXRCdWZmZXJDb3VudDsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRGbGFjRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0ZMQUNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL0MyU29mdEZsYWNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDhkYjdlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmNwcApAQCAtMCwwICsxLDQ5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0RmxhY0VuYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEZsYWNFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuZmxhYy5lbmNvZGVyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEMyU29mdEZsYWNFbmM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOworICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQoMHUsIDQ0MTAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuaW5SYW5nZSgxLCA2NTUzNTApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptU2FtcGxlUmF0ZSk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86OmlucHV0KDB1LCAxKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1DaGFubmVsQ291bnQsIHZhbHVlKS5pblJhbmdlKDEsIDIpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1DaGFubmVsQ291bnQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCA3NjgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDEsIDIxMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbXBsZXhpdHksIEMyX1BBUkFNS0VZX0NPTVBMRVhJVFkpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbXBsZXhpdHlUdW5pbmc6Om91dHB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9ERUZBVUxUKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1Db21wbGV4aXR5LCB2YWx1ZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9NSU4sIEZMQUNfQ09NUFJFU1NJT05fTEVWRUxfTUFYKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ29tcGxleGl0eSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDQ2MDgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBjbUVuY29kaW5nSW5mbywgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QY21FbmNvZGluZ0luZm86OmlucHV0KDB1LCBDMkNvbmZpZzo6UENNXzE2KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1QY21FbmNvZGluZ0luZm8sIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UENNXzE2LAorICAgICAgICAgICAgICAgICAgICAgLy8gQzJDb25maWc6OlBDTV84LAorICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV9GTE9BVH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptUGNtRW5jb2RpbmdJbmZvKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRDaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50LT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldEJpdHJhdGUoKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRDb21wbGV4aXR5KCkgY29uc3QgeyByZXR1cm4gbUNvbXBsZXhpdHktPnZhbHVlOyB9CisgICAgaW50MzJfdCBnZXRQY21FbmNvZGluZ0luZm8oKSBjb25zdCB7IHJldHVybiBtUGNtRW5jb2RpbmdJbmZvLT52YWx1ZTsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6aW5wdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29tcGxleGl0eVR1bmluZzo6b3V0cHV0PiBtQ29tcGxleGl0eTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOjppbnB1dD4gbVBjbUVuY29kaW5nSW5mbzsKK307CisKK0MyU29mdEZsYWNFbmM6OkMyU29mdEZsYWNFbmMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUZsYWNTdHJlYW1FbmNvZGVyKG51bGxwdHIpLAorICAgICAgbUlucHV0QnVmZmVyUGNtMzIobnVsbHB0cikgeworfQorCitDMlNvZnRGbGFjRW5jOjp+QzJTb2Z0RmxhY0VuYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0VuYzo6b25Jbml0KCkgeworICAgIG1GbGFjU3RyZWFtRW5jb2RlciA9IEZMQUNfX3N0cmVhbV9lbmNvZGVyX25ldygpOworICAgIGlmICghbUZsYWNTdHJlYW1FbmNvZGVyKSByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgbUlucHV0QnVmZmVyUGNtMzIgPSAoRkxBQ19faW50MzIqKSBtYWxsb2MoCisgICAgICAgICAgICBrSW5CbG9ja1NpemUgKiBrTWF4TnVtQ2hhbm5lbHMgKiBzaXplb2YoRkxBQ19faW50MzIpKTsKKyAgICBpZiAoIW1JbnB1dEJ1ZmZlclBjbTMyKSByZXR1cm4gQzJfTk9fTUVNT1JZOworCisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1Jc0ZpcnN0RnJhbWUgPSB0cnVlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwdWxsOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMHU7CisgICAgbUVuY29kZXJXcml0ZURhdGEgPSBmYWxzZTsKKyAgICBtRW5jb2RlclJldHVybmVkTmJCeXRlcyA9IDA7CisgICAgbUhlYWRlck9mZnNldCA9IDA7CisgICAgbVdyb3RlSGVhZGVyID0gZmFsc2U7CisKKyAgICBzdGF0dXNfdCBlcnIgPSBjb25maWd1cmVFbmNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCit2b2lkIEMyU29mdEZsYWNFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobUZsYWNTdHJlYW1FbmNvZGVyKSB7CisgICAgICAgIEZMQUNfX3N0cmVhbV9lbmNvZGVyX2RlbGV0ZShtRmxhY1N0cmVhbUVuY29kZXIpOworICAgICAgICBtRmxhY1N0cmVhbUVuY29kZXIgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtSW5wdXRCdWZmZXJQY20zMikgeworICAgICAgICBmcmVlKG1JbnB1dEJ1ZmZlclBjbTMyKTsKKyAgICAgICAgbUlucHV0QnVmZmVyUGNtMzIgPSBudWxscHRyOworICAgIH0KK30KKwordm9pZCBDMlNvZnRGbGFjRW5jOjpvblJlc2V0KCkgeworICAgICh2b2lkKSBvblN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0VuYzo6b25TdG9wKCkgeworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtSXNGaXJzdEZyYW1lID0gdHJ1ZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMHVsbDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDB1OworICAgIG1FbmNvZGVyV3JpdGVEYXRhID0gZmFsc2U7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOworICAgIG1IZWFkZXJPZmZzZXQgPSAwOworICAgIG1Xcm90ZUhlYWRlciA9IGZhbHNlOworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gZHJhaW4oRFJBSU5fQ09NUE9ORU5UX05PX0VPUywgbnVsbHB0cik7CisgICAgaWYgKEMyX09LICE9IHN0YXR1cykgcmV0dXJuIHN0YXR1czsKKworICAgIHN0YXR1c190IGVyciA9IGNvbmZpZ3VyZUVuY29kZXIoKTsKKyAgICBpZiAoZXJyICE9IE9LKSBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RmxhY0VuYzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKK30KKwordm9pZCBDMlNvZnRGbGFjRW5jOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgICAgIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCksIHdvcmstPmlucHV0LmZsYWdzKTsKKyAgICBpZiAobUlzRmlyc3RGcmFtZSAmJiBpblNpemUpIHsKKyAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICAgICAgbUlzRmlyc3RGcmFtZSA9IGZhbHNlOworICAgIH0KKworICAgIGlmICghbVdyb3RlSGVhZGVyKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0PiBjc2QgPQorICAgICAgICAgICAgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dDo6QWxsb2NVbmlxdWUobUhlYWRlck9mZnNldCwgMHUpOworICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgQUxPR0UoIkNTRCBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZW1jcHkoY3NkLT5tLnZhbHVlLCBtSGVhZGVyLCBtSGVhZGVyT2Zmc2V0KTsKKyAgICAgICAgQUxPR1YoInB1dCBjc2QsICVkIGJ5dGVzIiwgbUhlYWRlck9mZnNldCk7CisKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNzZCkpOworICAgICAgICBtV3JvdGVIZWFkZXIgPSB0cnVlOworICAgIH0KKworICAgIGNvbnN0IHVpbnQzMl90IHNhbXBsZVJhdGUgPSBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpOworICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKTsKKyAgICBjb25zdCBib29sIGlucHV0RmxvYXQgPSBtSW50Zi0+Z2V0UGNtRW5jb2RpbmdJbmZvKCkgPT0gQzJDb25maWc6OlBDTV9GTE9BVDsKKyAgICBjb25zdCB1bnNpZ25lZCBzYW1wbGVTaXplID0gaW5wdXRGbG9hdCA/IHNpemVvZihmbG9hdCkgOiBzaXplb2YoaW50MTZfdCk7CisgICAgY29uc3QgdW5zaWduZWQgZnJhbWVTaXplID0gY2hhbm5lbENvdW50ICogc2FtcGxlU2l6ZTsKKyAgICBjb25zdCB1aW50NjRfdCBvdXRUaW1lU3RhbXAgPSBtUHJvY2Vzc2VkU2FtcGxlcyAqIDEwMDAwMDBsbCAvIHNhbXBsZVJhdGU7CisKKyAgICBzaXplX3Qgb3V0Q2FwYWNpdHkgPSBpblNpemU7CisgICAgb3V0Q2FwYWNpdHkgKz0gbUJsb2NrU2l6ZSAqIGZyYW1lU2l6ZTsKKworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dENhcGFjaXR5LCB1c2FnZSwgJm1PdXRwdXRCbG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDMldyaXRlVmlldyB3VmlldyA9IG1PdXRwdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtRW5jb2RlcldyaXRlRGF0YSA9IHRydWU7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluUHRyID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisgICAgICAgIGNvbnN0IHNpemVfdCBwcm9jZXNzU2l6ZSA9IE1JTihrSW5CbG9ja1NpemUgKiBmcmFtZVNpemUsIChpblNpemUgLSBpblBvcykpOworICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0RnJhbWVzID0gcHJvY2Vzc1NpemUgLyBmcmFtZVNpemU7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIG5iSW5wdXRTYW1wbGVzID0gcHJvY2Vzc1NpemUgLyBzYW1wbGVTaXplOworCisgICAgICAgIEFMT0dWKCJhYm91dCB0byBlbmNvZGUgJXp1IGJ5dGVzIiwgcHJvY2Vzc1NpemUpOworICAgICAgICBpZiAoaW5wdXRGbG9hdCkgeworICAgICAgICAgICAgY29uc3QgZmxvYXQgKiBjb25zdCBwY21GbG9hdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZmxvYXQgKj4oaW5QdHIgKyBpblBvcyk7CisgICAgICAgICAgICBtZW1jcHlfdG9fcThfMjNfZnJvbV9mbG9hdF93aXRoX2NsYW1wKG1JbnB1dEJ1ZmZlclBjbTMyLCBwY21GbG9hdCwgbmJJbnB1dFNhbXBsZXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgaW50MTZfdCAqIGNvbnN0IHBjbTE2ID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBpbnQxNl90ICo+KGluUHRyICsgaW5Qb3MpOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5iSW5wdXRTYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXJQY20zMltpXSA9IChGTEFDX19pbnQzMikgcGNtMTZbaV07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBGTEFDX19ib29sIG9rID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfcHJvY2Vzc19pbnRlcmxlYXZlZCgKKyAgICAgICAgICAgICAgICBtRmxhY1N0cmVhbUVuY29kZXIsIG1JbnB1dEJ1ZmZlclBjbTMyLCBuYklucHV0RnJhbWVzKTsKKyAgICAgICAgaWYgKCFvaykgeworICAgICAgICAgICAgQUxPR0UoImVycm9yIGVuY291bnRlcmVkIGR1cmluZyBlbmNvZGluZyIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIG1PdXRwdXRCbG9jay5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGluUG9zICs9IHByb2Nlc3NTaXplOworICAgIH0KKyAgICBpZiAoZW9zICYmIChDMl9PSyAhPSBkcmFpbihEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wpKSkgeworICAgICAgICBBTE9HRSgiZXJyb3IgZW5jb3VudGVyZWQgZHVyaW5nIGVuY29kaW5nIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgbU91dHB1dEJsb2NrLnJlc2V0KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICBpZiAobUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgIT0gMCkgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihzdGQ6Om1vdmUobU91dHB1dEJsb2NrKSwgMCwgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiZW5jb2RlciBwcm9jZXNzX2ludGVybGVhdmVkIHJldHVybmVkIHdpdGhvdXQgZGF0YSB0byB3cml0ZSIpOworICAgIH0KKyAgICBtT3V0cHV0QmxvY2sgPSBudWxscHRyOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorICAgIG1FbmNvZGVyV3JpdGVEYXRhID0gZmFsc2U7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOworfQorCitGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMgQzJTb2Z0RmxhY0VuYzo6b25FbmNvZGVkRmxhY0F2YWlsYWJsZSgKKyAgICAgICAgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwgc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBzYW1wbGVzLAorICAgICAgICB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lKSB7CisgICAgKHZvaWQpIGN1cnJlbnRfZnJhbWU7CisgICAgQUxPR1YoIiVzIChieXRlcz0lenUsIHNhbXBsZXM9JXUsIGN1cnJfZnJhbWU9JXUpIiwgX19mdW5jX18sIGJ5dGVzLCBzYW1wbGVzLAorICAgICAgICAgIGN1cnJlbnRfZnJhbWUpOworCisgICAgaWYgKHNhbXBsZXMgPT0gMCkgeworICAgICAgICBBTE9HSSgic2F2aW5nICV6dSBieXRlcyBvZiBoZWFkZXIiLCBieXRlcyk7CisgICAgICAgIG1lbWNweShtSGVhZGVyICsgbUhlYWRlck9mZnNldCwgYnVmZmVyLCBieXRlcyk7CisgICAgICAgIG1IZWFkZXJPZmZzZXQgKz0gYnl0ZXM7Ly8gd2lsbCBjb250YWluIGhlYWRlciBzaXplIHdoZW4gZmluaXNoZWQgcmVjZWl2aW5nIGhlYWRlcgorICAgICAgICByZXR1cm4gRkxBQ19fU1RSRUFNX0VOQ09ERVJfV1JJVEVfU1RBVFVTX09LOworICAgIH0KKworICAgIGlmICgoc2FtcGxlcyA9PSAwKSB8fCAhbUVuY29kZXJXcml0ZURhdGEpIHsKKyAgICAgICAgLy8gY2FsbGVkIGJ5IHRoZSBlbmNvZGVyIGJlY2F1c2UgdGhlcmUncyBoZWFkZXIgZGF0YSB0byBzYXZlLCBidXQgaXQncyBub3QgdGhlIHJvbGUKKyAgICAgICAgLy8gb2YgdGhpcyBjb21wb25lbnQgKHVubGVzcyBXUklURV9GTEFDX0hFQURFUl9JTl9GSVJTVF9CVUZGRVIgaXMgZGVmaW5lZCkKKyAgICAgICAgQUxPR1YoImlnbm9yaW5nICV6dSBieXRlcyBvZiBoZWFkZXIgZGF0YSAoc2FtcGxlcz0lZCkiLCBieXRlcywgc2FtcGxlcyk7CisgICAgICAgIHJldHVybiBGTEFDX19TVFJFQU1fRU5DT0RFUl9XUklURV9TVEFUVVNfT0s7CisgICAgfQorCisgICAgLy8gd3JpdGUgZW5jb2RlZCBkYXRhCisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBtT3V0cHV0QmxvY2stPm1hcCgpLmdldCgpOworICAgIHVpbnQ4X3QqIG91dERhdGEgPSB3Vmlldy5kYXRhKCk7CisgICAgQUxPR1YoIndyaXRpbmcgJXp1IGJ5dGVzIG9mIGVuY29kZWQgZGF0YSBvbiBvdXRwdXQiLCBieXRlcyk7CisgICAgLy8gaW5jcmVtZW50IG1Qcm9jZXNzZWRTYW1wbGVzIHRvIG1haW50YWluIGF1ZGlvIHN5bmNocm9uaXphdGlvbiBkdXJpbmcKKyAgICAvLyBwbGF5IGJhY2sKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyArPSBzYW1wbGVzOworICAgIGlmIChieXRlcyArIG1FbmNvZGVyUmV0dXJuZWROYkJ5dGVzID4gbU91dHB1dEJsb2NrLT5jYXBhY2l0eSgpKSB7CisgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIHNwYWNlIGxlZnQgdG8gd3JpdGUgZW5jb2RlZCBkYXRhLCBkcm9wcGluZyAlenUgYnl0ZXMiLCBieXRlcyk7CisgICAgICAgIC8vIGEgZmF0YWwgZXJyb3Igd291bGQgc3RvcCB0aGUgZW5jb2RpbmcKKyAgICAgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKKyAgICB9CisgICAgbWVtY3B5KG91dERhdGEgKyBtRW5jb2RlclJldHVybmVkTmJCeXRlcywgYnVmZmVyLCBieXRlcyk7CisgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgKz0gYnl0ZXM7CisgICAgcmV0dXJuIEZMQUNfX1NUUkVBTV9FTkNPREVSX1dSSVRFX1NUQVRVU19PSzsKK30KKworCitzdGF0dXNfdCBDMlNvZnRGbGFjRW5jOjpjb25maWd1cmVFbmNvZGVyKCkgeworICAgIEFMT0dWKCIlcyBudW1DaGFubmVsPSVkLCBzYW1wbGVSYXRlPSVkIiwgX19mdW5jX18sIG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKSwgbUludGYtPmdldFNhbXBsZVJhdGUoKSk7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8ICFtRmxhY1N0cmVhbUVuY29kZXIpIHsKKyAgICAgICAgQUxPR0UoImNhbid0IGNvbmZpZ3VyZSBlbmNvZGVyOiBubyBlbmNvZGVyIG9yIGludmFsaWQgc3RhdGUiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgY29uc3QgYm9vbCBpbnB1dEZsb2F0ID0gbUludGYtPmdldFBjbUVuY29kaW5nSW5mbygpID09IEMyQ29uZmlnOjpQQ01fRkxPQVQ7CisgICAgY29uc3QgaW50IGJpdHNQZXJTYW1wbGUgPSBpbnB1dEZsb2F0ID8gMjQgOiAxNjsKKyAgICBGTEFDX19ib29sIG9rID0gdHJ1ZTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9jaGFubmVscyhtRmxhY1N0cmVhbUVuY29kZXIsIG1JbnRmLT5nZXRDaGFubmVsQ291bnQoKSk7CisgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfc2FtcGxlX3JhdGUobUZsYWNTdHJlYW1FbmNvZGVyLCBtSW50Zi0+Z2V0U2FtcGxlUmF0ZSgpKTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9iaXRzX3Blcl9zYW1wbGUobUZsYWNTdHJlYW1FbmNvZGVyLCBiaXRzUGVyU2FtcGxlKTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9jb21wcmVzc2lvbl9sZXZlbChtRmxhY1N0cmVhbUVuY29kZXIsCisgICAgICAgICAgICAgICAgICAgIG1JbnRmLT5nZXRDb21wbGV4aXR5KCkpOworICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X3ZlcmlmeShtRmxhY1N0cmVhbUVuY29kZXIsIGZhbHNlKTsKKyAgICBpZiAoIW9rKSB7CisgICAgICAgIEFMT0dFKCJ1bmtub3duIGVycm9yIHdoZW4gY29uZmlndXJpbmcgZW5jb2RlciIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBvayAmPSBGTEFDX19TVFJFQU1fRU5DT0RFUl9JTklUX1NUQVRVU19PSyA9PQorICAgICAgICAgICAgRkxBQ19fc3RyZWFtX2VuY29kZXJfaW5pdF9zdHJlYW0obUZsYWNTdHJlYW1FbmNvZGVyLAorICAgICAgICAgICAgICAgICAgICBmbGFjRW5jb2RlcldyaXRlQ2FsbGJhY2sgICAgLyp3cml0ZV9jYWxsYmFjayovLAorICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qc2Vla19jYWxsYmFjayovLAorICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qdGVsbF9jYWxsYmFjayovLAorICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qbWV0YWRhdGFfY2FsbGJhY2sqLywKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgdGhpcyAvKmNsaWVudF9kYXRhKi8pOworCisgICAgaWYgKCFvaykgeworICAgICAgICBBTE9HRSgidW5rbm93biBlcnJvciB3aGVuIGNvbmZpZ3VyaW5nIGVuY29kZXIiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbUJsb2NrU2l6ZSA9IEZMQUNfX3N0cmVhbV9lbmNvZGVyX2dldF9ibG9ja3NpemUobUZsYWNTdHJlYW1FbmNvZGVyKTsKKworICAgIEFMT0dWKCJlbmNvZGVyIHN1Y2Nlc3NmdWxseSBjb25maWd1cmVkIik7CisgICAgcmV0dXJuIE9LOworfQorCitGTEFDX19TdHJlYW1FbmNvZGVyV3JpdGVTdGF0dXMgQzJTb2Z0RmxhY0VuYzo6ZmxhY0VuY29kZXJXcml0ZUNhbGxiYWNrKAorICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtRW5jb2RlciAqLAorICAgICAgICAgICAgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwKKyAgICAgICAgICAgIHNpemVfdCBieXRlcywKKyAgICAgICAgICAgIHVuc2lnbmVkIHNhbXBsZXMsCisgICAgICAgICAgICB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lLAorICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpIHsKKyAgICByZXR1cm4gKChDMlNvZnRGbGFjRW5jKikgY2xpZW50X2RhdGEpLT5vbkVuY29kZWRGbGFjQXZhaWxhYmxlKAorICAgICAgICAgICAgYnVmZmVyLCBieXRlcywgc2FtcGxlcywgY3VycmVudF9mcmFtZSk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEZsYWNFbmM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZCkgcG9vbDsKKyAgICBzd2l0Y2ggKGRyYWluTW9kZSkgeworICAgICAgICBjYXNlIE5PX0RSQUlOOgorICAgICAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIGNhc2UgRFJBSU5fQ0hBSU46CisgICAgICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgICAgIGNhc2UgRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TOgorICAgICAgICAgICAgLy8gVE9ETzogVGhpcyBmbGFnIGlzIG5vdCBiZWluZyBzZW50IGJhY2sgdG8gdGhlIGNsaWVudAorICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGVyZSBhcmUgbm8gaXRlbXMgaW4gUGVuZGluZ1dvcmsgcXVldWUgYXMgYWxsIHRoZQorICAgICAgICAgICAgLy8gaW5wdXRzIGFyZSBiZWluZyBzZW50IGJhY2sgd2l0aCBlbXB0eXdvcmsgb3IgdmFsaWQgZW5jb2RlZCBkYXRhCisgICAgICAgICAgICAvLyBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgY2FzZSBEUkFJTl9DT01QT05FTlRfTk9fRU9TOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKyAgICBGTEFDX19ib29sIG9rID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfZmluaXNoKG1GbGFjU3RyZWFtRW5jb2Rlcik7CisgICAgaWYgKCFvaykgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICBtSXNGaXJzdEZyYW1lID0gdHJ1ZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMHVsbDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDB1OworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjbGFzcyBDMlNvZnRGbGFjRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEZsYWNFbmNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0RmxhY0VuYyhDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEZsYWNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0RmxhY0VuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEZsYWNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRGbGFjRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEZsYWNFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9DMlNvZnRGbGFjRW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNmMDFkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvQzJTb2Z0RmxhY0VuYy5oCkBAIC0wLDAgKzEsODggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9GTEFDX0VOQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfRkxBQ19FTkNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJGTEFDL3N0cmVhbV9lbmNvZGVyLmgiCisKKyNkZWZpbmUgRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9NSU4gICAgIDAKKyNkZWZpbmUgRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9ERUZBVUxUIDUKKyNkZWZpbmUgRkxBQ19DT01QUkVTU0lPTl9MRVZFTF9NQVggICAgIDgKKworI2RlZmluZSBGTEFDX0hFQURFUl9TSVpFICAgICAgICAgICAgICAgMTI4CisKKyNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDMlNvZnRGbGFjRW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKK3B1YmxpYzoKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEZsYWNFbmMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0RmxhY0VuYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdGF0dXNfdCBjb25maWd1cmVFbmNvZGVyKCk7CisgICAgc3RhdGljIEZMQUNfX1N0cmVhbUVuY29kZXJXcml0ZVN0YXR1cyBmbGFjRW5jb2RlcldyaXRlQ2FsbGJhY2soCisgICAgICAgICAgICBjb25zdCBGTEFDX19TdHJlYW1FbmNvZGVyICplbmNvZGVyLCBjb25zdCBGTEFDX19ieXRlIGJ1ZmZlcltdLAorICAgICAgICAgICAgc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBzYW1wbGVzLCB1bnNpZ25lZCBjdXJyZW50X2ZyYW1lLAorICAgICAgICAgICAgdm9pZCAqY2xpZW50X2RhdGEpOworICAgIEZMQUNfX1N0cmVhbUVuY29kZXJXcml0ZVN0YXR1cyBvbkVuY29kZWRGbGFjQXZhaWxhYmxlKAorICAgICAgICAgICAgY29uc3QgRkxBQ19fYnl0ZSBidWZmZXJbXSwgc2l6ZV90IGJ5dGVzLCB1bnNpZ25lZCBzYW1wbGVzLAorICAgICAgICAgICAgdW5zaWduZWQgY3VycmVudF9mcmFtZSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGNvbnN0IHVuc2lnbmVkIGludCBrSW5CbG9ja1NpemUgPSAxMTUyOworICAgIGNvbnN0IHVuc2lnbmVkIGludCBrTWF4TnVtQ2hhbm5lbHMgPSAyOworICAgIEZMQUNfX1N0cmVhbUVuY29kZXIqIG1GbGFjU3RyZWFtRW5jb2RlcjsKKyAgICBGTEFDX19pbnQzMiogbUlucHV0QnVmZmVyUGNtMzI7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IG1PdXRwdXRCbG9jazsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgdWludDMyX3QgbUJsb2NrU2l6ZTsKKyAgICBib29sIG1Jc0ZpcnN0RnJhbWU7CisgICAgdWludDY0X3QgbUFuY2hvclRpbWVTdGFtcDsKKyAgICB1aW50NjRfdCBtUHJvY2Vzc2VkU2FtcGxlczsKKyAgICAvLyBzaG91bGQgdGhlIGRhdGEgcmVjZWl2ZWQgYnkgdGhlIGNhbGxiYWNrIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBwb3J0CisgICAgYm9vbCBtRW5jb2RlcldyaXRlRGF0YTsKKyAgICBzaXplX3QgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXM7CisgICAgdW5zaWduZWQgbUhlYWRlck9mZnNldDsKKyAgICBib29sIG1Xcm90ZUhlYWRlcjsKKyAgICBjaGFyIG1IZWFkZXJbRkxBQ19IRUFERVJfU0laRV07CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRGbGFjRW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0ZMQUNfRU5DX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKY29weSB0byBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9mbGFjL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZmxhYy9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL05PVElDRQpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL2ZsYWMvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2VkZTY4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQW5kcm9pZC5icApAQCAtMCwwICsxLDIzIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2c3MTFhbGF3ZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRHNzExRGVjLmNwcCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItREFMQVciLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfZzcxMW1sYXdkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEc3MTFEZWMuY3BwIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmYwNzkzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9DMlNvZnRHNzExRGVjLmNwcApAQCAtMCwwICsxLDMxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0RzcxMURlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorCisjaW5jbHVkZSAiQzJTb2Z0RzcxMURlYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKKyNpZmRlZiBBTEFXCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuZzcxMS5hbGF3LmRlY29kZXIiOworI2Vsc2UKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5nNzExLm1sYXcuZGVjb2RlciI7CisjZW5kaWYKKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEMyU29mdEc3MTFEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLAorI2lmZGVmIEFMQVcKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcKKyNlbHNlCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXCisjZW5kaWYKKyAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOworICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5pblJhbmdlKDgwMDAsIDQ4MDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVNhbXBsZVJhdGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1DaGFubmVsQ291bnQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCA2KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuZXF1YWxUbyg2NDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dD4gbVNhbXBsZVJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0PiBtQ2hhbm5lbENvdW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjppbnB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtSW5wdXRNYXhCdWZTaXplOworfTsKKworQzJTb2Z0RzcxMURlYzo6QzJTb2Z0RzcxMURlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCkgeworfQorCitDMlNvZnRHNzExRGVjOjp+QzJTb2Z0RzcxMURlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RzcxMURlYzo6b25Jbml0KCkgeworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEc3MTFEZWM6Om9uU3RvcCgpIHsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEc3MTFEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0RzcxMURlYzo6b25SZWxlYXNlKCkgeworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHNzExRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRHNzExRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICBpbnQgb3V0U2l6ZSA9IGluU2l6ZSAqIHNpemVvZihpbnQxNl90KTsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgIGlmIChpblNpemUgPT0gMCkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ4X3QgKmlucHV0cHRyID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhvdXRTaXplLCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGludDE2X3QgKm91dHB1dHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPih3Vmlldy5kYXRhKCkpOworCisjaWZkZWYgQUxBVworICAgIERlY29kZUFMYXcob3V0cHV0cHRyLCBpbnB1dHB0ciwgaW5TaXplKTsKKyNlbHNlCisgICAgRGVjb2RlTUxhdyhvdXRwdXRwdHIsIGlucHV0cHRyLCBpblNpemUpOworI2VuZGlmCisKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2spKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0RzcxMURlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKyNpZmRlZiBBTEFXCit2b2lkIEMyU29mdEc3MTFEZWM6OkRlY29kZUFMYXcoCisgICAgICAgIGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpIHsKKyAgICB3aGlsZSAoaW5TaXplID4gMCkgeworICAgICAgICBpblNpemUtLTsKKyAgICAgICAgaW50MzJfdCB4ID0gKmluKys7CisKKyAgICAgICAgaW50MzJfdCBpeCA9IHggXiAweDU1OworICAgICAgICBpeCAmPSAweDdmOworCisgICAgICAgIGludDMyX3QgaWV4cCA9IGl4ID4+IDQ7CisgICAgICAgIGludDMyX3QgbWFudCA9IGl4ICYgMHgwZjsKKworICAgICAgICBpZiAoaWV4cCA+IDApIHsKKyAgICAgICAgICAgIG1hbnQgKz0gMTY7CisgICAgICAgIH0KKworICAgICAgICBtYW50ID0gKG1hbnQgPDwgNCkgKyA4OworCisgICAgICAgIGlmIChpZXhwID4gMSkgeworICAgICAgICAgICAgbWFudCA9IG1hbnQgPDwgKGlleHAgLSAxKTsKKyAgICAgICAgfQorCisgICAgICAgICpvdXQrKyA9ICh4ID4gMTI3KSA/IG1hbnQgOiAtbWFudDsKKyAgICB9Cit9CisjZWxzZQordm9pZCBDMlNvZnRHNzExRGVjOjpEZWNvZGVNTGF3KAorICAgICAgICBpbnQxNl90ICpvdXQsIGNvbnN0IHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7CisgICAgd2hpbGUgKGluU2l6ZSA+IDApIHsKKyAgICAgICAgaW5TaXplLS07CisgICAgICAgIGludDMyX3QgeCA9ICppbisrOworCisgICAgICAgIGludDMyX3QgbWFudGlzc2EgPSB+eDsKKyAgICAgICAgaW50MzJfdCBleHBvbmVudCA9IChtYW50aXNzYSA+PiA0KSAmIDc7CisgICAgICAgIGludDMyX3Qgc2VnbWVudCA9IGV4cG9uZW50ICsgMTsKKyAgICAgICAgbWFudGlzc2EgJj0gMHgwZjsKKworICAgICAgICBpbnQzMl90IHN0ZXAgPSA0IDw8IHNlZ21lbnQ7CisKKyAgICAgICAgaW50MzJfdCBhYnMgPSAoMHg4MGwgPDwgZXhwb25lbnQpICsgc3RlcCAqIG1hbnRpc3NhICsgc3RlcCAvIDIgLSA0ICogMzM7CisKKyAgICAgICAgKm91dCsrID0gKHggPCAweDgwKSA/IC1hYnMgOiBhYnM7CisgICAgfQorfQorI2VuZGlmCisKK2NsYXNzIEMyU29mdEc3MTFEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0RzcxMURlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRHNzExRGVjKENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEc3MTFEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRHNzExRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0RzcxMURlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEc3MTFEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRHNzExRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvQzJTb2Z0RzcxMURlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzZThmZmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL0MyU29mdEc3MTFEZWMuaApAQCAtMCwwICsxLDU5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfRzcxMV9ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0c3MTFfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdEc3MTFEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0RzcxMURlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0RzcxMURlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisKKyNpZmRlZiBBTEFXCisgICAgdm9pZCBEZWNvZGVBTGF3KGludDE2X3QgKm91dCwgY29uc3QgdWludDhfdCAqaW4sIHNpemVfdCBpblNpemUpOworI2Vsc2UKKyAgICB2b2lkIERlY29kZU1MYXcoaW50MTZfdCAqb3V0LCBjb25zdCB1aW50OF90ICppbiwgc2l6ZV90IGluU2l6ZSk7CisjZW5kaWYKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEc3MTFEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfRzcxMV9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL2c3MTEvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nNzExL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTk9USUNFCmNvcHkgdG8gbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZzcxMS9OT1RJQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzRhYmI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjAgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfYXYxZGVjX2dhdjEiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICAvLyBjb29yZGluYXRlZCB3aXRoIGZyYW1ld29ya3MvYXYvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvYW9tL0FuZHJvaWQuYnAKKyAgICAvLyBzbyBvbmx5IDEgb2YgdGhlbSBoYXMgdGhlIG9mZmljaWFsIGMyLmFuZHJvaWQuYXYxLmRlY29kZXIgbmFtZQorICAgIGNmbGFnczogWworICAgICAgICAiLURDT0RFQ05BTUU9XCJjMi5hbmRyb2lkLmF2MS5kZWNvZGVyXCIiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEdhdjFEZWMuY3BwIl0sCisgICAgc3RhdGljX2xpYnM6IFsibGliZ2F2MSJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9saWJnYXYxL2xpYmdhdjEvIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9DMlNvZnRHYXYxRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM1ZjU0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5jcHAKQEAgLTAsMCArMSw3OTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEdhdjFEZWMiCisjaW5jbHVkZSAiQzJTb2Z0R2F2MURlYy5oIgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIGNvZGVjbmFtZSBzZXQgYW5kIHBhc3NlZCBpbiBhcyBhIGNvbXBpbGUgZmxhZyBmcm9tIEFuZHJvaWQuYnAKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSBDT0RFQ05BTUU7CisKK2NsYXNzIEMyU29mdEdhdjFEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CisgcHVibGljOgorICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgIGhlbHBlciwgQ09NUE9ORU5UX05BTUUsIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEpIHsKKyAgICBub1ByaXZhdGVCdWZmZXJzKCk7ICAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlLgorICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICBub1RpbWVTdHJldGNoKCk7CisKKyAgICBhZGRQYXJhbWV0ZXIoRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb25maWc6OlBST0ZJTEVfQVYxXzAsIEMyQ29uZmlnOjpMRVZFTF9BVjFfMl8xKSkKKyAgICAgICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uZU9mKHtDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMX0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfMl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0FWMV8yXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVYxXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfQVYxXzNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9BVjFfM18yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KX0pCisgICAgICAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgbUhkcjEwUGx1c0luZm9JbnB1dCA9IEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQ6OkFsbG9jU2hhcmVkKDApOworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgRGVmaW5lUGFyYW0obUhkcjEwUGx1c0luZm9JbnB1dCwgQzJfUEFSQU1LRVlfSU5QVVRfSERSMTBfUExVU19JTkZPKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KG1IZHIxMFBsdXNJbmZvSW5wdXQpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgQzJGKG1IZHIxMFBsdXNJbmZvSW5wdXQsIG0udmFsdWUpLmFueSgpLAorICAgICAgICAgICAgfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKEhkcjEwUGx1c0luZm9JbnB1dFNldHRlcikKKyAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIG1IZHIxMFBsdXNJbmZvT3V0cHV0ID0gQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKDApOworICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgRGVmaW5lUGFyYW0obUhkcjEwUGx1c0luZm9PdXRwdXQsIEMyX1BBUkFNS0VZX09VVFBVVF9IRFIxMF9QTFVTX0lORk8pCisgICAgICAgICAgICAud2l0aERlZmF1bHQobUhkcjEwUGx1c0luZm9PdXRwdXQpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgQzJGKG1IZHIxMFBsdXNJbmZvT3V0cHV0LCBtLnZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihIZHIxMFBsdXNJbmZvT3V0cHV0U2V0dGVyKQorICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICBEZWZpbmVQYXJhbShtTWF4U2l6ZSwgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgIH0pCisgICAgICAgICAgICAud2l0aFNldHRlcihNYXhQaWN0dXJlU2l6ZVNldHRlciwgbVNpemUpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICBhZGRQYXJhbWV0ZXIoRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAwdSwgMzIwICogMjQwICogMyAvIDQpKQorICAgICAgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICAgICAgIEMyRihtTWF4SW5wdXRTaXplLCB2YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhJbnB1dFNpemVTZXR0ZXIsIG1NYXhTaXplKQorICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0ge0MyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCl9OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoMXUsIDB1LCA4dSAvKiBiaXREZXB0aCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgIGRlZmF1bHRDb2xvckluZm8gPSBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAge0MyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCl9LCAwdSwgOHUgLyogYml0RGVwdGggKi8sCisgICAgICAgIEMyQ29sb3I6OllVVl80MjApOworICAgIGhlbHBlci0+YWRkU3RydWN0RGVzY3JpcHRvcnM8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+KCk7CisKKyAgICBhZGRQYXJhbWV0ZXIoRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShkZWZhdWx0Q29sb3JJbmZvKQorICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICBEZWZpbmVQYXJhbShtRGVmYXVsdENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQpKQorICAgICAgICAgICAgLndpdGhGaWVsZHMoCisgICAgICAgICAgICAgICAge0MyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcmFuZ2UpCisgICAgICAgICAgICAgICAgICAgICAuaW5SYW5nZShDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHByaW1hcmllcykKKyAgICAgICAgICAgICAgICAgICAgIC5pblJhbmdlKEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgdHJhbnNmZXIpCisgICAgICAgICAgICAgICAgICAgICAuaW5SYW5nZShDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtYXRyaXgpCisgICAgICAgICAgICAgICAgICAgICAuaW5SYW5nZShDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpfSkKKyAgICAgICAgICAgIC53aXRoU2V0dGVyKERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAvLyBUT0RPOiBzdXBwb3J0IG1vcmUgZm9ybWF0cz8KKyAgICBhZGRQYXJhbWV0ZXIoRGVmaW5lUGFyYW0obVBpeGVsRm9ybWF0LCBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQpCisgICAgICAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgIH0KKworICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgIH0KKyAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgfQorICAgIHJldHVybiByZXM7CisgIH0KKworICBzdGF0aWMgQzJSIE1heFBpY3R1cmVTaXplU2V0dGVyKAorICAgICAgYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1lLAorICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuCisgICAgLy8gaGFyZGNvZGluZworICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCA0MDk2dSk7CisgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDQwOTZ1KTsKKyAgICByZXR1cm4gQzJSOjpPaygpOworICB9CisKKyAgc3RhdGljIEMyUiBNYXhJbnB1dFNpemVTZXR0ZXIoCisgICAgICBib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtYXhTaXplKSB7CisgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgLy8gYXNzdW1lIGNvbXByZXNzaW9uIHJhdGlvIG9mIDIKKyAgICBtZS5zZXQoKS52YWx1ZSA9CisgICAgICAgICgoKG1heFNpemUudi53aWR0aCArIDYzKSAvIDY0KSAqICgobWF4U2l6ZS52LmhlaWdodCArIDYzKSAvIDY0KSAqIDMwNzIpOworICAgIHJldHVybiBDMlI6Ok9rKCk7CisgIH0KKworICBzdGF0aWMgQzJSIERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIoCisgICAgICBib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJm1lKSB7CisgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICB9CisgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgfQorICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgfQorICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgIH0KKyAgICByZXR1cm4gQzJSOjpPaygpOworICB9CisKKyAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoCisgICAgICBib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gJm1lLAorICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgKHZvaWQpc2l6ZTsKKyAgICAodm9pZCltZTsgIC8vIFRPRE86IHZhbGlkYXRlCisgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PgorICBnZXREZWZhdWx0Q29sb3JBc3BlY3RzX2woKSB7CisgICAgcmV0dXJuIG1EZWZhdWx0Q29sb3JBc3BlY3RzOworICB9CisKKyAgc3RhdGljIEMyUiBIZHIxMFBsdXNJbmZvSW5wdXRTZXR0ZXIoYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICh2b2lkKW1heUJsb2NrOworICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICByZXR1cm4gQzJSOjpPaygpOworICB9CisKKyAgc3RhdGljIEMyUiBIZHIxMFBsdXNJbmZvT3V0cHV0U2V0dGVyKGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICh2b2lkKW1heUJsb2NrOworICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICByZXR1cm4gQzJSOjpPaygpOworICB9CisKKyBwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOworICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiBtTWF4U2l6ZTsKKyAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtTWF4SW5wdXRTaXplOworICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gbUNvbG9ySW5mbzsKKyAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQ+IG1QaXhlbEZvcm1hdDsKKyAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IG1EZWZhdWx0Q29sb3JBc3BlY3RzOworICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dD4gbUhkcjEwUGx1c0luZm9JbnB1dDsKKyAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0PiBtSGRyMTBQbHVzSW5mb091dHB1dDsKK307CisKK0MyU29mdEdhdjFEZWM6OkMyU29mdEdhdjFEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQ29kZWNDdHgobnVsbHB0cikgeworICBnZXR0aW1lb2ZkYXkoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKK30KKworQzJTb2Z0R2F2MURlYzo6fkMyU29mdEdhdjFEZWMoKSB7IG9uUmVsZWFzZSgpOyB9CisKK2MyX3N0YXR1c190IEMyU29mdEdhdjFEZWM6Om9uSW5pdCgpIHsKKyAgcmV0dXJuIGluaXREZWNvZGVyKCkgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0R2F2MURlYzo6b25TdG9wKCkgeworICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0R2F2MURlYzo6b25SZXNldCgpIHsKKyAgKHZvaWQpb25TdG9wKCk7CisgIGMyX3N0YXR1c190IGVyciA9IG9uRmx1c2hfc20oKTsKKyAgaWYgKGVyciAhPSBDMl9PSykgeworICAgIEFMT0dXKCJGYWlsZWQgdG8gZmx1c2ggdGhlIGF2MSBkZWNvZGVyLiBUcnlpbmcgdG8gaGFyZCByZXNldC4iKTsKKyAgICBkZXN0cm95RGVjb2RlcigpOworICAgIGlmICghaW5pdERlY29kZXIoKSkgeworICAgICAgQUxPR0UoIkhhcmQgcmVzZXQgZmFpbGVkLiIpOworICAgIH0KKyAgfQorfQorCit2b2lkIEMyU29mdEdhdjFEZWM6Om9uUmVsZWFzZSgpIHsgZGVzdHJveURlY29kZXIoKTsgfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHYXYxRGVjOjpvbkZsdXNoX3NtKCkgeworICBMaWJnYXYxU3RhdHVzQ29kZSBzdGF0dXMgPQorICAgICAgbUNvZGVjQ3R4LT5FbnF1ZXVlRnJhbWUoLypkYXRhPSovbnVsbHB0ciwgLypzaXplPSovMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdXNlcl9wcml2YXRlX2RhdGE9Ki8wKTsKKyAgaWYgKHN0YXR1cyAhPSBrTGliZ2F2MVN0YXR1c09rKSB7CisgICAgQUxPR0UoIkZhaWxlZCB0byBmbHVzaCBhdjEgZGVjb2Rlci4gc3RhdHVzOiAlZC4iLCBzdGF0dXMpOworICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgIH0KKworICAvLyBEZXF1ZXVlIGZyYW1lIChpZiBhbnkpIHRoYXQgd2FzIGVucXVldWVkIHByZXZpb3VzbHkuCisgIGNvbnN0IGxpYmdhdjE6OkRlY29kZXJCdWZmZXIgKmJ1ZmZlcjsKKyAgc3RhdHVzID0gbUNvZGVjQ3R4LT5EZXF1ZXVlRnJhbWUoJmJ1ZmZlcik7CisgIGlmIChzdGF0dXMgIT0ga0xpYmdhdjFTdGF0dXNPaykgeworICAgIEFMT0dFKCJGYWlsZWQgdG8gZGVxdWV1ZSBmcmFtZSBhZnRlciBmbHVzaGluZyB0aGUgYXYxIGRlY29kZXIuIHN0YXR1czogJWQiLAorICAgICAgICAgIHN0YXR1cyk7CisgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgfQorCisgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisKKyAgcmV0dXJuIEMyX09LOworfQorCitzdGF0aWMgaW50IEdldENQVUNvcmVDb3VudCgpIHsKKyAgaW50IGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICBBTE9HVigiTnVtYmVyIG9mIENQVSBjb3JlczogJWQiLCBjcHVDb3JlQ291bnQpOworICByZXR1cm4gY3B1Q29yZUNvdW50OworfQorCitib29sIEMyU29mdEdhdjFEZWM6OmluaXREZWNvZGVyKCkgeworICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICBtQ29kZWNDdHgucmVzZXQobmV3IGxpYmdhdjE6OkRlY29kZXIoKSk7CisKKyAgaWYgKG1Db2RlY0N0eCA9PSBudWxscHRyKSB7CisgICAgQUxPR0UoIm1Db2RlY0N0eCBpcyBudWxsIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgbGliZ2F2MTo6RGVjb2RlclNldHRpbmdzIHNldHRpbmdzID0ge307CisgIHNldHRpbmdzLnRocmVhZHMgPSBHZXRDUFVDb3JlQ291bnQoKTsKKworICBBTE9HVigiVXNpbmcgbGliZ2F2MSBBVjEgc29mdHdhcmUgZGVjb2Rlci4iKTsKKyAgTGliZ2F2MVN0YXR1c0NvZGUgc3RhdHVzID0gbUNvZGVjQ3R4LT5Jbml0KCZzZXR0aW5ncyk7CisgIGlmIChzdGF0dXMgIT0ga0xpYmdhdjFTdGF0dXNPaykgeworICAgIEFMT0dFKCJhdjEgZGVjb2RlciBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4gc3RhdHVzOiAlZC4iLCBzdGF0dXMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit2b2lkIEMyU29mdEdhdjFEZWM6OmRlc3Ryb3lEZWNvZGVyKCkgeyBtQ29kZWNDdHggPSBudWxscHRyOyB9CisKK3ZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICB1aW50MzJfdCBmbGFncyA9IDA7CisgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICB9CisgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdEdhdjFEZWM6OmZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2spIHsKKyAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPQorICAgICAgY3JlYXRlR3JhcGhpY0J1ZmZlcihibG9jaywgQzJSZWN0KG1XaWR0aCwgbUhlaWdodCkpOworICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlciwgaW5kZXhdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAmJgorICAgICAgICAoYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkpIHsKKyAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgIH07CisgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICBmaWxsV29yayh3b3JrKTsKKyAgfSBlbHNlIHsKKyAgICBmaW5pc2goaW5kZXgsIGZpbGxXb3JrKTsKKyAgfQorfQorCit2b2lkIEMyU29mdEdhdjFEZWM6OnByb2Nlc3MoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgIHJldHVybjsKKyAgfQorCisgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICBzaXplX3QgaW5TaXplID0gMHU7CisgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICBib29sIGNvZGVjQ29uZmlnID0KKyAgICAgICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDApOworICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKworICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsIGluU2l6ZSwKKyAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisKKyAgaWYgKGNvZGVjQ29uZmlnKSB7CisgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICByZXR1cm47CisgIH0KKworICBpbnQ2NF90IGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla2xsKCk7CisgIGlmIChpblNpemUpIHsKKyAgICB1aW50OF90ICpiaXRzdHJlYW0gPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXcuZGF0YSgpICsgaW5PZmZzZXQpOworICAgIGludDMyX3QgZGVjb2RlVGltZSA9IDA7CisgICAgaW50MzJfdCBkZWxheSA9IDA7CisKKyAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIGRlbGF5KTsKKworICAgIGNvbnN0IExpYmdhdjFTdGF0dXNDb2RlIHN0YXR1cyA9CisgICAgICAgIG1Db2RlY0N0eC0+RW5xdWV1ZUZyYW1lKGJpdHN0cmVhbSwgaW5TaXplLCBmcmFtZUluZGV4KTsKKworICAgIEdFVFRJTUUoJm1UaW1lRW5kLCBudWxscHRyKTsKKyAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIGRlY29kZVRpbWUpOworICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU0ZCBkZWxheT0lNGRcbiIsIGRlY29kZVRpbWUsIGRlbGF5KTsKKworICAgIGlmIChzdGF0dXMgIT0ga0xpYmdhdjFTdGF0dXNPaykgeworICAgICAgQUxPR0UoImF2MSBkZWNvZGVyIGZhaWxlZCB0byBkZWNvZGUgZnJhbWUuIHN0YXR1czogJWQuIiwgc3RhdHVzKTsKKyAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgcmV0dXJuOworICAgIH0KKworICB9IGVsc2UgeworICAgIGNvbnN0IExpYmdhdjFTdGF0dXNDb2RlIHN0YXR1cyA9CisgICAgICAgIG1Db2RlY0N0eC0+RW5xdWV1ZUZyYW1lKC8qZGF0YT0qL251bGxwdHIsIC8qc2l6ZT0qLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdXNlcl9wcml2YXRlX2RhdGE9Ki8wKTsKKyAgICBpZiAoc3RhdHVzICE9IGtMaWJnYXYxU3RhdHVzT2spIHsKKyAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZmx1c2ggYXYxIGRlY29kZXIuIHN0YXR1czogJWQuIiwgc3RhdHVzKTsKKyAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgICh2b2lkKW91dHB1dEJ1ZmZlcihwb29sLCB3b3JrKTsKKworICBpZiAoZW9zKSB7CisgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICB9IGVsc2UgaWYgKCFpblNpemUpIHsKKyAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvcHlPdXRwdXRCdWZmZXJUb1lWMTJGcmFtZSh1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQ4X3QgKnNyY1ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqc3JjVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICpzcmNWLCBzaXplX3Qgc3JjWVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgeworICBjb25zdCBzaXplX3QgZHN0WVN0cmlkZSA9IGFsaWduKHdpZHRoLCAxNik7CisgIGNvbnN0IHNpemVfdCBkc3RVVlN0cmlkZSA9IGFsaWduKGRzdFlTdHJpZGUgLyAyLCAxNik7CisgIHVpbnQ4X3QgKmNvbnN0IGRzdFN0YXJ0ID0gZHN0OworCisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0OyArK2kpIHsKKyAgICBtZW1jcHkoZHN0LCBzcmNZLCB3aWR0aCk7CisgICAgc3JjWSArPSBzcmNZU3RyaWRlOworICAgIGRzdCArPSBkc3RZU3RyaWRlOworICB9CisKKyAgZHN0ID0gZHN0U3RhcnQgKyBkc3RZU3RyaWRlICogaGVpZ2h0OworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgeworICAgIG1lbWNweShkc3QsIHNyY1YsIHdpZHRoIC8gMik7CisgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgfQorCisgIGRzdCA9IGRzdFN0YXJ0ICsgKGRzdFlTdHJpZGUgKiBoZWlnaHQpICsgKGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMik7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgbWVtY3B5KGRzdCwgc3JjVSwgd2lkdGggLyAyKTsKKyAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgZHN0ICs9IGRzdFVWU3RyaWRlOworICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCh1aW50MzJfdCAqZHN0LCBjb25zdCB1aW50MTZfdCAqc3JjWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjViwgc2l6ZV90IHNyY1lTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaGVpZ2h0KSB7CisgIC8vIENvbnZlcnRpbmcgdHdvIGxpbmVzIGF0IGEgdGltZSwgc2xpZ2h0bHkgZmFzdGVyCisgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgaGVpZ2h0OyB5ICs9IDIpIHsKKyAgICB1aW50MzJfdCAqZHN0VG9wID0gKHVpbnQzMl90ICopZHN0OworICAgIHVpbnQzMl90ICpkc3RCb3QgPSAodWludDMyX3QgKikoZHN0ICsgZHN0U3RyaWRlKTsKKyAgICB1aW50MTZfdCAqeVNyY1RvcCA9ICh1aW50MTZfdCAqKXNyY1k7CisgICAgdWludDE2X3QgKnlTcmNCb3QgPSAodWludDE2X3QgKikoc3JjWSArIHNyY1lTdHJpZGUpOworICAgIHVpbnQxNl90ICp1U3JjID0gKHVpbnQxNl90ICopc3JjVTsKKyAgICB1aW50MTZfdCAqdlNyYyA9ICh1aW50MTZfdCAqKXNyY1Y7CisKKyAgICB1aW50MzJfdCB1MDEsIHYwMSwgeTAxLCB5MjMsIHk0NSwgeTY3LCB1djAsIHV2MTsKKyAgICBzaXplX3QgeCA9IDA7CisgICAgZm9yICg7IHggPCB3aWR0aCAtIDM7IHggKz0gNCkgeworICAgICAgdTAxID0gKigodWludDMyX3QgKil1U3JjKTsKKyAgICAgIHVTcmMgKz0gMjsKKyAgICAgIHYwMSA9ICooKHVpbnQzMl90ICopdlNyYyk7CisgICAgICB2U3JjICs9IDI7CisKKyAgICAgIHkwMSA9ICooKHVpbnQzMl90ICopeVNyY1RvcCk7CisgICAgICB5U3JjVG9wICs9IDI7CisgICAgICB5MjMgPSAqKCh1aW50MzJfdCAqKXlTcmNUb3ApOworICAgICAgeVNyY1RvcCArPSAyOworICAgICAgeTQ1ID0gKigodWludDMyX3QgKil5U3JjQm90KTsKKyAgICAgIHlTcmNCb3QgKz0gMjsKKyAgICAgIHk2NyA9ICooKHVpbnQzMl90ICopeVNyY0JvdCk7CisgICAgICB5U3JjQm90ICs9IDI7CisKKyAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICB1djEgPSAodTAxID4+IDE2KSB8ICgodjAxID4+IDE2KSA8PCAyMCk7CisKKyAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyAmIDB4M0ZGKSA8PCAxMCkgfCB1djE7CisgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MjMgPj4gMTYpIDw8IDEwKSB8IHV2MTsKKworICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk0NSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk2NyA+PiAxNikgPDwgMTApIHwgdXYxOworICAgIH0KKworICAgIC8vIFRoZXJlIHNob3VsZCBiZSBhdCBtb3N0IDIgbW9yZSBwaXhlbHMgdG8gcHJvY2Vzcy4gTm90ZSB0aGF0IHdlIGRvbid0CisgICAgLy8gbmVlZCB0byBjb25zaWRlciBvZGQgY2FzZSBhcyB0aGUgYnVmZmVyIGlzIGFsd2F5cyBhbGlnbmVkIHRvIGV2ZW4uCisgICAgaWYgKHggPCB3aWR0aCkgeworICAgICAgdTAxID0gKnVTcmM7CisgICAgICB2MDEgPSAqdlNyYzsKKyAgICAgIHkwMSA9ICooKHVpbnQzMl90ICopeVNyY1RvcCk7CisgICAgICB5NDUgPSAqKCh1aW50MzJfdCAqKXlTcmNCb3QpOworICAgICAgdXYwID0gKHUwMSAmIDB4M0ZGKSB8ICgodjAxICYgMHgzRkYpIDw8IDIwKTsKKyAgICAgICpkc3RUb3ArKyA9ICgoeTAxICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICpkc3RUb3ArKyA9ICgoeTAxID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAqZHN0Qm90KysgPSAoKHk0NSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAqZHN0Qm90KysgPSAoKHk0NSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgIH0KKworICAgIHNyY1kgKz0gc3JjWVN0cmlkZSAqIDI7CisgICAgc3JjVSArPSBzcmNVU3RyaWRlOworICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICBkc3QgKz0gZHN0U3RyaWRlICogMjsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcigKKyAgICB1aW50OF90ICpkc3QsIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwKKyAgICBjb25zdCB1aW50MTZfdCAqc3JjViwgc2l6ZV90IHNyY1lTdHJpZGUsIHNpemVfdCBzcmNVU3RyaWRlLAorICAgIHNpemVfdCBzcmNWU3RyaWRlLCBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKKyAgdWludDhfdCAqZHN0WSA9ICh1aW50OF90ICopZHN0OworICBzaXplX3QgZHN0WVNpemUgPSBkc3RTdHJpZGUgKiBoZWlnaHQ7CisgIHNpemVfdCBkc3RVVlN0cmlkZSA9IGFsaWduKGRzdFN0cmlkZSAvIDIsIDE2KTsKKyAgc2l6ZV90IGRzdFVWU2l6ZSA9IGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMjsKKyAgdWludDhfdCAqZHN0ViA9IGRzdFkgKyBkc3RZU2l6ZTsKKyAgdWludDhfdCAqZHN0VSA9IGRzdFYgKyBkc3RVVlNpemU7CisKKyAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgd2lkdGg7ICsreCkgeworICAgICAgZHN0WVt4XSA9ICh1aW50OF90KShzcmNZW3hdID4+IDIpOworICAgIH0KKworICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICBkc3RZICs9IGRzdFN0cmlkZTsKKyAgfQorCisgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgKGhlaWdodCArIDEpIC8gMjsgKyt5KSB7CisgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCAod2lkdGggKyAxKSAvIDI7ICsreCkgeworICAgICAgZHN0VVt4XSA9ICh1aW50OF90KShzcmNVW3hdID4+IDIpOworICAgICAgZHN0Vlt4XSA9ICh1aW50OF90KShzcmNWW3hdID4+IDIpOworICAgIH0KKworICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgZHN0VSArPSBkc3RVVlN0cmlkZTsKKyAgICBkc3RWICs9IGRzdFVWU3RyaWRlOworICB9Cit9CisKK2Jvb2wgQzJTb2Z0R2F2MURlYzo6b3V0cHV0QnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICBpZiAoISh3b3JrICYmIHBvb2wpKSByZXR1cm4gZmFsc2U7CisKKyAgY29uc3QgbGliZ2F2MTo6RGVjb2RlckJ1ZmZlciAqYnVmZmVyOworICBjb25zdCBMaWJnYXYxU3RhdHVzQ29kZSBzdGF0dXMgPSBtQ29kZWNDdHgtPkRlcXVldWVGcmFtZSgmYnVmZmVyKTsKKworICBpZiAoc3RhdHVzICE9IGtMaWJnYXYxU3RhdHVzT2spIHsKKyAgICBBTE9HRSgiYXYxIGRlY29kZXIgRGVxdWV1ZUZyYW1lIGZhaWxlZC4gc3RhdHVzOiAlZC4iLCBzdGF0dXMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIHxidWZmZXJ8IGNhbiBiZSBOVUxMIGlmIHN0YXR1cyB3YXMgZXF1YWwgdG8ga0xpYmdhdjFTdGF0dXNPay4gVGhpcyBpcyBub3QKKyAgLy8gYW4gZXJyb3IuIFRoaXMgY291bGQgbWVhbiBvbmUgb2YgdHdvIHRoaW5nczoKKyAgLy8gIC0gVGhlIEVucXVldWVGcmFtZSgpIGNhbGwgd2FzIGVpdGhlciBhIGZsdXNoIChjYWxsZWQgd2l0aCBudWxscHRyKS4KKyAgLy8gIC0gVGhlIGVucXVldWVkIGZyYW1lIGRpZCBub3QgaGF2ZSBhbnkgZGlzcGxheWFibGUgZnJhbWVzLgorICBpZiAoIWJ1ZmZlcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNvbnN0IGludCB3aWR0aCA9IGJ1ZmZlci0+ZGlzcGxheWVkX3dpZHRoWzBdOworICBjb25zdCBpbnQgaGVpZ2h0ID0gYnVmZmVyLT5kaXNwbGF5ZWRfaGVpZ2h0WzBdOworICBpZiAod2lkdGggIT0gbVdpZHRoIHx8IGhlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgbVdpZHRoID0gd2lkdGg7CisgICAgbUhlaWdodCA9IGhlaWdodDsKKworICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFMT0dFKCJDb25maWcgdXBkYXRlIHNpemUgZmFpbGVkIik7CisgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvLyBUT0RPKHZpZ25lc2h2KTogQWRkIHN1cHBvcnQgZm9yIG1vbm9jaHJvbWUgdmlkZW9zIHNpbmNlIEFWMSBzdXBwb3J0cyBpdC4KKyAgQ0hFQ0soYnVmZmVyLT5pbWFnZV9mb3JtYXQgPT0gbGliZ2F2MTo6a0ltYWdlRm9ybWF0WXV2NDIwKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOworICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgIGlmIChidWZmZXItPmJpdGRlcHRoID09IDEwKSB7CisgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckFzcGVjdHMgPQorICAgICAgICBtSW50Zi0+Z2V0RGVmYXVsdENvbG9yQXNwZWN0c19sKCk7CisKKyAgICBpZiAoZGVmYXVsdENvbG9yQXNwZWN0cy0+cHJpbWFyaWVzID09IEMyQ29sb3I6OlBSSU1BUklFU19CVDIwMjAgJiYKKyAgICAgICAgZGVmYXVsdENvbG9yQXNwZWN0cy0+bWF0cml4ID09IEMyQ29sb3I6Ok1BVFJJWF9CVDIwMjAgJiYKKyAgICAgICAgZGVmYXVsdENvbG9yQXNwZWN0cy0+dHJhbnNmZXIgPT0gQzJDb2xvcjo6VFJBTlNGRVJfU1QyMDg0KSB7CisgICAgICBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1JHQkFfMTAxMDEwMjsKKyAgICB9CisgIH0KKyAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfTsKKworICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhhbGlnbihtV2lkdGgsIDE2KSwgbUhlaWdodCwgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSwgJmJsb2NrKTsKKworICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgQUxPR0UoImZldGNoR3JhcGhpY0Jsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICB3b3JrLT5yZXN1bHQgPSBlcnI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQzJHcmFwaGljVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKworICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpLCBvdXQgZnJhbWVpbmRleCAlZCIsIGJsb2NrLT53aWR0aCgpLAorICAgICAgICBibG9jay0+aGVpZ2h0KCksIG1XaWR0aCwgbUhlaWdodCwgKGludClidWZmZXItPnVzZXJfcHJpdmF0ZV9kYXRhKTsKKworICB1aW50OF90ICpkc3QgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgIHNpemVfdCBzcmNZU3RyaWRlID0gYnVmZmVyLT5zdHJpZGVbMF07CisgIHNpemVfdCBzcmNVU3RyaWRlID0gYnVmZmVyLT5zdHJpZGVbMV07CisgIHNpemVfdCBzcmNWU3RyaWRlID0gYnVmZmVyLT5zdHJpZGVbMl07CisKKyAgaWYgKGJ1ZmZlci0+Yml0ZGVwdGggPT0gMTApIHsKKyAgICBjb25zdCB1aW50MTZfdCAqc3JjWSA9IChjb25zdCB1aW50MTZfdCAqKWJ1ZmZlci0+cGxhbmVbMF07CisgICAgY29uc3QgdWludDE2X3QgKnNyY1UgPSAoY29uc3QgdWludDE2X3QgKilidWZmZXItPnBsYW5lWzFdOworICAgIGNvbnN0IHVpbnQxNl90ICpzcmNWID0gKGNvbnN0IHVpbnQxNl90ICopYnVmZmVyLT5wbGFuZVsyXTsKKworICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDIpIHsKKyAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCgKKyAgICAgICAgICAodWludDMyX3QgKilkc3QsIHNyY1ksIHNyY1UsIHNyY1YsIHNyY1lTdHJpZGUgLyAyLCBzcmNVU3RyaWRlIC8gMiwKKyAgICAgICAgICBzcmNWU3RyaWRlIC8gMiwgYWxpZ24obVdpZHRoLCAxNiksIG1XaWR0aCwgbUhlaWdodCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbihtV2lkdGgsIDE2KSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgY29uc3QgdWludDhfdCAqc3JjWSA9IChjb25zdCB1aW50OF90ICopYnVmZmVyLT5wbGFuZVswXTsKKyAgICBjb25zdCB1aW50OF90ICpzcmNVID0gKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPnBsYW5lWzFdOworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1YgPSAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+cGxhbmVbMl07CisgICAgY29weU91dHB1dEJ1ZmZlclRvWVYxMkZyYW1lKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjVlN0cmlkZSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgfQorICBmaW5pc2hXb3JrKGJ1ZmZlci0+dXNlcl9wcml2YXRlX2RhdGEsIHdvcmssIHN0ZDo6bW92ZShibG9jaykpOworICBibG9jayA9IG51bGxwdHI7CisgIHJldHVybiB0cnVlOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHYXYxRGVjOjpkcmFpbkludGVybmFsKAorICAgIHVpbnQzMl90IGRyYWluTW9kZSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgcmV0dXJuIEMyX09LOworICB9CisgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgIHJldHVybiBDMl9PTUlUVEVEOworICB9CisKKyAgTGliZ2F2MVN0YXR1c0NvZGUgc3RhdHVzID0KKyAgICAgIG1Db2RlY0N0eC0+RW5xdWV1ZUZyYW1lKC8qZGF0YT0qL251bGxwdHIsIC8qc2l6ZT0qLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnVzZXJfcHJpdmF0ZV9kYXRhPSovMCk7CisgIGlmIChzdGF0dXMgIT0ga0xpYmdhdjFTdGF0dXNPaykgeworICAgIEFMT0dFKCJGYWlsZWQgdG8gZmx1c2ggYXYxIGRlY29kZXIuIHN0YXR1czogJWQuIiwgc3RhdHVzKTsKKyAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICB9CisKKyAgd2hpbGUgKG91dHB1dEJ1ZmZlcihwb29sLCB3b3JrKSkgeworICB9CisKKyAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MgJiYgd29yayAmJgorICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPT0gMHUpIHsKKyAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICB9CisKKyAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHYXYxRGVjOjpkcmFpbih1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2NsYXNzIEMyU29mdEdhdjFGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CisgcHVibGljOgorICBDMlNvZnRHYXYxRmFjdG9yeSgpCisgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gKmNvbnN0IGNvbXBvbmVudCwKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCAqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICBuZXcgQzJTb2Z0R2F2MURlYyhDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0R2F2MURlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgZGVsZXRlcik7CisgICAgcmV0dXJuIEMyX09LOworICB9CisKKyAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gKmNvbnN0IGludGVyZmFjZSwKKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSAqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEdhdjFEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0R2F2MURlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgZGVsZXRlcik7CisgICAgcmV0dXJuIEMyX09LOworICB9CisKKyAgdmlydHVhbCB+QzJTb2Z0R2F2MUZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyBwcml2YXRlOgorICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5ICpDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRHYXYxRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkgKmZhY3RvcnkpIHsKKyAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ2F2MS9DMlNvZnRHYXYxRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdjMDhiYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dhdjEvQzJTb2Z0R2F2MURlYy5oCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9HQVYxX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfR0FWMV9ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSAibGliZ2F2MS9zcmMvZGVjb2Rlci5oIgorI2luY2x1ZGUgImxpYmdhdjEvc3JjL2RlY29kZXJfc2V0dGluZ3MuaCIKKworI2RlZmluZSBHRVRUSU1FKGEsIGIpIGdldHRpbWVvZmRheShhLCBiKTsKKyNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICBcCisgICAgZGlmZiA9ICgoKGVuZCkudHZfc2VjIC0gKHN0YXJ0KS50dl9zZWMpICogMTAwMDAwMCkgKyBcCisgICAgICAgICAgICAoKGVuZCkudHZfdXNlYyAtIChzdGFydCkudHZfdXNlYyk7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdEdhdjFEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICBjbGFzcyBJbnRmSW1wbDsKKworICBDMlNvZnRHYXYxRGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgIH5DMlNvZnRHYXYxRGVjKCk7CisKKyAgLy8gQmVnaW4gU2ltcGxlQzJDb21wb25lbnQgb3ZlcnJpZGVzLgorICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgIHZvaWQgcHJvY2Vzcyhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIG92ZXJyaWRlOworICBjMl9zdGF0dXNfdCBkcmFpbih1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIG92ZXJyaWRlOworICAvLyBFbmQgU2ltcGxlQzJDb21wb25lbnQgb3ZlcnJpZGVzLgorCisgcHJpdmF0ZToKKyAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgc3RkOjp1bmlxdWVfcHRyPGxpYmdhdjE6OkRlY29kZXI+IG1Db2RlY0N0eDsKKworICB1aW50MzJfdCBtV2lkdGg7CisgIHVpbnQzMl90IG1IZWlnaHQ7CisgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisKKyAgc3RydWN0IHRpbWV2YWwgbVRpbWVTdGFydDsgIC8vIFRpbWUgYXQgdGhlIHN0YXJ0IG9mIGRlY29kZSgpCisgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOyAgICAvLyBUaW1lIGF0IHRoZSBlbmQgb2YgZGVjb2RlKCkKKworICBib29sIGluaXREZWNvZGVyKCk7CisgIHZvaWQgZGVzdHJveURlY29kZXIoKTsKKyAgdm9pZCBmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4mIGJsb2NrKTsKKyAgYm9vbCBvdXRwdXRCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspOworICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKTsKKworICBDMl9ET19OT1RfQ09QWShDMlNvZnRHYXYxRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0dBVjFfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMzBjMDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQW5kcm9pZC5icApAQCAtMCwwICsxLDExIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2dzbWRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0R3NtRGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGliZ3NtIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9DMlNvZnRHc21EZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4N2NmYzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmNwcApAQCAtMCwwICsxLDMwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0R3NtRGVjIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRHc21EZWMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuZ3NtLmRlY29kZXIiOworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQzJTb2Z0R3NtRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19NU0dTTSkgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7CisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKAorICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgODAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLmVxdWFsVG8oODAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmVxdWFsVG8oMSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCAxMzIwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmVxdWFsVG8oMTMyMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAxMDI0IC8gTVNHU01fSU5fRlJNX1NaICogTVNHU01fSU5fRlJNX1NaKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdEdzbURlYzo6QzJTb2Z0R3NtRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtR3NtKG51bGxwdHIpIHsKK30KKworQzJTb2Z0R3NtRGVjOjp+QzJTb2Z0R3NtRGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHc21EZWM6Om9uSW5pdCgpIHsKKyAgICBpZiAoIW1Hc20pIG1Hc20gPSBnc21fY3JlYXRlKCk7CisgICAgaWYgKCFtR3NtKSByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIGludCBtc29wdCA9IDE7CisgICAgKHZvaWQpZ3NtX29wdGlvbihtR3NtLCBHU01fT1BUX1dBVjQ5LCAmbXNvcHQpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEdzbURlYzo6b25TdG9wKCkgeworICAgIGlmIChtR3NtKSB7CisgICAgICAgIGdzbV9kZXN0cm95KG1Hc20pOworICAgICAgICBtR3NtID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKCFtR3NtKSBtR3NtID0gZ3NtX2NyZWF0ZSgpOworICAgIGlmICghbUdzbSkgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICBpbnQgbXNvcHQgPSAxOworICAgICh2b2lkKWdzbV9vcHRpb24obUdzbSwgR1NNX09QVF9XQVY0OSwgJm1zb3B0KTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRW9zID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEdzbURlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRHc21EZWM6Om9uUmVsZWFzZSgpIHsKKyAgICBpZiAobUdzbSkgeworICAgICAgICBnc21fZGVzdHJveShtR3NtKTsKKyAgICAgICAgbUdzbSA9IG51bGxwdHI7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRHc21EZWM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0aWMgc2l6ZV90IGRlY29kZUdTTShnc20gaGFuZGxlLCBpbnQxNl90ICpvdXQsIHNpemVfdCBvdXRDYXBhY2l0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmluLCBzaXplX3QgaW5TaXplKSB7CisgICAgc2l6ZV90IG91dFNpemUgPSAwOworCisgICAgaWYgKGluU2l6ZSAlIE1TR1NNX0lOX0ZSTV9TWiA9PSAwCisgICAgICAgICAgICAmJiAoaW5TaXplIC8gTVNHU01fSU5fRlJNX1NaICogTVNHU01fT1VUX0ZSTV9TWiAqIHNpemVvZigqb3V0KQorICAgICAgICAgICAgICAgICAgICA8PSBvdXRDYXBhY2l0eSkpIHsKKyAgICAgICAgd2hpbGUgKGluU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIGdzbV9kZWNvZGUoaGFuZGxlLCBpbiwgb3V0KTsKKyAgICAgICAgICAgIGluICs9IEZSR1NNX0lOX0ZSTV9TWjsKKyAgICAgICAgICAgIGluU2l6ZSAtPSBGUkdTTV9JTl9GUk1fU1o7CisgICAgICAgICAgICBvdXQgKz0gRlJHU01fT1VUX0ZSTV9TWjsKKyAgICAgICAgICAgIG91dFNpemUgKz0gRlJHU01fT1VUX0ZSTV9TWjsKKworICAgICAgICAgICAgZ3NtX2RlY29kZShoYW5kbGUsIGluLCBvdXQpOworICAgICAgICAgICAgaW4gKz0gRlJHU01fSU5fRlJNX1NaX01JTlVTXzE7CisgICAgICAgICAgICBpblNpemUgLT0gRlJHU01fSU5fRlJNX1NaX01JTlVTXzE7CisgICAgICAgICAgICBvdXQgKz0gRlJHU01fT1VUX0ZSTV9TWjsKKyAgICAgICAgICAgIG91dFNpemUgKz0gRlJHU01fT1VUX0ZSTV9TWjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBvdXRTaXplICogc2l6ZW9mKGludDE2X3QpOworfQorCit2b2lkIEMyU29mdEdzbURlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgIHNpemVfdCBvdXRDYXBhY2l0eSA9IChpblNpemUgLyBNU0dTTV9JTl9GUk1fU1ogKSAqIE1TR1NNX09VVF9GUk1fU1ogKiBzaXplb2YoaW50MTZfdCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKG91dENhcGFjaXR5LCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDE2X3QgKm91dHB1dCA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPih3Vmlldy5kYXRhKCkpOworICAgIHVpbnQ4X3QgKmlucHV0ID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LmRhdGEoKSArIGluT2Zmc2V0KTsKKyAgICBzaXplX3Qgb3V0U2l6ZSA9IGRlY29kZUdTTShtR3NtLCBvdXRwdXQsIG91dENhcGFjaXR5LCBpbnB1dCwgaW5TaXplKTsKKyAgICBpZiAoIW91dFNpemUpIHsKKyAgICAgICAgQUxPR0UoImVuY291bnRlcmVkIGltcHJvcGVyIGluc2l6ZSBvciBvdXRzaXplIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigib3V0IGJ1ZmZlciBhdHRyLiBzaXplICV6dSIsIG91dFNpemUpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0U2l6ZSkpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIG1TaWduYWxsZWRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0R3NtRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0R1NNRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEdTTURlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRHc21EZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0R3NtRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdEdzbURlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEdzbURlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdEdTTURlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdEdTTURlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvZ3NtL0MyU29mdEdzbURlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZDI3M2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vQzJTb2Z0R3NtRGVjLmgKQEAgLTAsMCArMSw2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0dTTV9ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX0dTTV9ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJnc20uaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIEZSR1NNX0lOX0ZSTV9TWiAgICAgICAgICAgICAzMworI2RlZmluZSBGUkdTTV9JTl9GUk1fU1pfTUlOVVNfMSAgICAgMzIKKyNkZWZpbmUgRlJHU01fT1VUX0ZSTV9TWiAgICAgICAgICAgIDE2MAorI2RlZmluZSBNU0dTTV9JTl9GUk1fU1ogICAgICAgICAgICAgKEZSR1NNX0lOX0ZSTV9TWiArIEZSR1NNX0lOX0ZSTV9TWl9NSU5VU18xKQorI2RlZmluZSBNU0dTTV9PVVRfRlJNX1NaICAgICAgICAgICAgKEZSR1NNX09VVF9GUk1fU1ogKiAyKQorCitzdHJ1Y3QgQzJTb2Z0R3NtRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEdzbURlYyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRHc21EZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGdzbSBtR3NtOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZEVvczsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEdzbURlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9HU01fREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9nc20vTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL05PVElDRSBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL05PVElDRQpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL2dzbS9OT1RJQ0UKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjliZDc4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjUgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfaGV2Y2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0SGV2Y0RlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYmhldmNkZWMiXSwKKworfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X2hldmNlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdEhldmNFbmMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJoZXZjZW5jIl0sCisKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL2hldmMvQzJTb2Z0SGV2Y0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkYjQzODcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuY3BwCkBAIC0wLDAgKzEsMTA1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0SGV2Y0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyTWFwcGVyLmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdEhldmNEZWMuaCIKKyNpbmNsdWRlICJpaGV2Y2RfY3hhLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLmhldmMuZGVjb2RlciI7Citjb25zdGV4cHIgdWludDMyX3Qga0RlZmF1bHRPdXRwdXREZWxheSA9IDg7Citjb25zdGV4cHIgdWludDMyX3Qga01heE91dHB1dERlbGF5ID0gMTY7Cit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgQzJTb2Z0SGV2Y0RlYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7IC8vIFRPRE86IGFjY291bnQgZm9yIG91ciBidWZmZXJzIGhlcmUKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICAvLyBUT0RPOiBQcm9wZXIgc3VwcG9ydCBmb3IgcmVvcmRlciBkZXB0aC4KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxPdXRwdXREZWxheSwgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dChrRGVmYXVsdE91dHB1dERlbGF5KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1BY3R1YWxPdXRwdXREZWxheSwgdmFsdWUpLmluUmFuZ2UoMCwga01heE91dHB1dERlbGF5KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQWN0dWFsT3V0cHV0RGVsYXkpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgNDA5NiwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDQwOTYsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fU1RJTEx9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8yXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzNfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzQsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNF8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNSwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81XzIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzRfMSwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNV8xLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzVfMgorICAgICAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhTaXplLCBDMl9QQVJBTUtFWV9NQVhfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAzMjAsIDI0MCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDQwOTYsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCA0MDk2LCAyKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKE1heFBpY3R1cmVTaXplU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1NYXhJbnB1dFNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCAzMjAgKiAyNDAgKiAzIC8gNCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobU1heElucHV0U2l6ZSwgdmFsdWUpLmFueSgpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLmNhbGN1bGF0ZWRBcyhNYXhJbnB1dFNpemVTZXR0ZXIsIG1NYXhTaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBDMkNocm9tYU9mZnNldFN0cnVjdCBsb2NhdGlvbnNbMV0gPSB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IGRlZmF1bHRDb2xvckluZm8gPQorICAgICAgICAgICAgQzJTdHJlYW1Db2xvckluZm86Om91dHB1dDo6QWxsb2NTaGFyZWQoCisgICAgICAgICAgICAgICAgICAgIDF1LCAwdSwgOHUgLyogYml0RGVwdGggKi8sIEMyQ29sb3I6OllVVl80MjApOworICAgICAgICBtZW1jcHkoZGVmYXVsdENvbG9ySW5mby0+bS5sb2NhdGlvbnMsIGxvY2F0aW9ucywgc2l6ZW9mKGxvY2F0aW9ucykpOworCisgICAgICAgIGRlZmF1bHRDb2xvckluZm8gPSBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgIHtDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpfSwgMHUsIDh1IC8qIGJpdERlcHRoICovLAorICAgICAgICAgICAgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIGhlbHBlci0+YWRkU3RydWN0RGVzY3JpcHRvcnM8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+KCk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckluZm8sIEMyX1BBUkFNS0VZX0NPREVEX0NPTE9SX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKGRlZmF1bHRDb2xvckluZm8pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRGVmYXVsdENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29kZWRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9MSU1JVEVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvZGVkQ29sb3JBc3BlY3RzU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCByYW5nZSkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsICAgICBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgIEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCAgICBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2xvckFzcGVjdHNTZXR0ZXIsIG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBtQ29kZWRDb2xvckFzcGVjdHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmb3JtYXRzPworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBpeGVsRm9ybWF0LCBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heFBpY3R1cmVTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuIGhhcmRjb2RpbmcKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDQwOTZ1KTsKKyAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDQwOTZ1KTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heElucHV0U2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWF4U2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gYXNzdW1lIGNvbXByZXNzaW9uIHJhdGlvIG9mIDIKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAoKChtYXhTaXplLnYud2lkdGggKyA2MykgLyA2NCkgKiAoKG1heFNpemUudi5oZWlnaHQgKyA2MykgLyA2NCkgKiAzMDcyKTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgKHZvaWQpc2l6ZTsKKyAgICAgICAgKHZvaWQpbWU7ICAvLyBUT0RPOiB2YWxpZGF0ZQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgRGVmYXVsdENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAobWUudi5yYW5nZSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYubWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBDb2RlZENvbG9yQXNwZWN0c1NldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAobWUudi5yYW5nZSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYudHJhbnNmZXIgPiBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnRyYW5zZmVyID0gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYubWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiAmbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZkZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZjb2RlZCkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gdGFrZSBkZWZhdWx0IHZhbHVlcyBmb3IgYWxsIHVuc3BlY2lmaWVkIGZpZWxkcywgYW5kIGNvZGVkIHZhbHVlcyBmb3Igc3BlY2lmaWVkIG9uZXMKKyAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBjb2RlZC52LnJhbmdlID09IFJBTkdFX1VOU1BFQ0lGSUVEID8gZGVmLnYucmFuZ2UgOiBjb2RlZC52LnJhbmdlOworICAgICAgICBtZS5zZXQoKS5wcmltYXJpZXMgPSBjb2RlZC52LnByaW1hcmllcyA9PSBQUklNQVJJRVNfVU5TUEVDSUZJRUQKKyAgICAgICAgICAgICAgICA/IGRlZi52LnByaW1hcmllcyA6IGNvZGVkLnYucHJpbWFyaWVzOworICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IGNvZGVkLnYudHJhbnNmZXIgPT0gVFJBTlNGRVJfVU5TUEVDSUZJRUQKKyAgICAgICAgICAgICAgICA/IGRlZi52LnRyYW5zZmVyIDogY29kZWQudi50cmFuc2ZlcjsKKyAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gY29kZWQudi5tYXRyaXggPT0gTUFUUklYX1VOU1BFQ0lGSUVEID8gZGVmLnYubWF0cml4IDogY29kZWQudi5tYXRyaXg7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBnZXRDb2xvckFzcGVjdHNfbCgpIHsKKyAgICAgICAgcmV0dXJuIG1Db2xvckFzcGVjdHM7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiBtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiBtTWF4U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1NYXhJbnB1dFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ+IG1Db2xvckluZm87CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+IG1Db2RlZENvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gbURlZmF1bHRDb2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0PiBtQ29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0PiBtUGl4ZWxGb3JtYXQ7Cit9OworCitzdGF0aWMgc2l6ZV90IGdldENwdUNvcmVDb3VudCgpIHsKKyAgICBsb25nIGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVsZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OworfQorCitzdGF0aWMgdm9pZCAqaXZkX2FsaWduZWRfbWFsbG9jKHZvaWQgKmN0eHQsIFdPUkQzMiBhbGlnbm1lbnQsIFdPUkQzMiBzaXplKSB7CisgICAgKHZvaWQpIGN0eHQ7CisgICAgcmV0dXJuIG1lbWFsaWduKGFsaWdubWVudCwgc2l6ZSk7Cit9CisKK3N0YXRpYyB2b2lkIGl2ZF9hbGlnbmVkX2ZyZWUodm9pZCAqY3R4dCwgdm9pZCAqbWVtKSB7CisgICAgKHZvaWQpIGN0eHQ7CisgICAgZnJlZShtZW0pOworfQorCitDMlNvZnRIZXZjRGVjOjpDMlNvZnRIZXZjRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgICBtRGVjSGFuZGxlKG51bGxwdHIpLAorICAgICAgICBtT3V0QnVmZmVyRmx1c2gobnVsbHB0ciksCisgICAgICAgIG1JdkNvbG9yZm9ybWF0KElWX1lVVl80MjBQKSwKKyAgICAgICAgbU91dHB1dERlbGF5KGtEZWZhdWx0T3V0cHV0RGVsYXkpLAorICAgICAgICBtV2lkdGgoMzIwKSwKKyAgICAgICAgbUhlaWdodCgyNDApLAorICAgICAgICBtSGVhZGVyRGVjb2RlZChmYWxzZSksCisgICAgICAgIG1PdXRJbmRleCgwdSkgeworfQorCitDMlNvZnRIZXZjRGVjOjp+QzJTb2Z0SGV2Y0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKE9LICE9IHJlc2V0RGVjb2RlcigpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEhldmNEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpIG9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdEhldmNEZWM6Om9uUmVsZWFzZSgpIHsKKyAgICAodm9pZCkgZGVsZXRlRGVjb2RlcigpOworICAgIGlmIChtT3V0QnVmZmVyRmx1c2gpIHsKKyAgICAgICAgaXZkX2FsaWduZWRfZnJlZShudWxscHRyLCBtT3V0QnVmZmVyRmx1c2gpOworICAgICAgICBtT3V0QnVmZmVyRmx1c2ggPSBudWxscHRyOworICAgIH0KKyAgICBpZiAobU91dEJsb2NrKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAoT0sgIT0gc2V0Rmx1c2hNb2RlKCkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisKKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gbVN0cmlkZTsKKyAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gbUhlaWdodDsKKyAgICB1aW50MzJfdCBidWZmZXJTaXplID0gZGlzcGxheVN0cmlkZSAqIGRpc3BsYXlIZWlnaHQgKiAzIC8gMjsKKyAgICBtT3V0QnVmZmVyRmx1c2ggPSAodWludDhfdCAqKWl2ZF9hbGlnbmVkX21hbGxvYyhudWxscHRyLCAxMjgsIGJ1ZmZlclNpemUpOworICAgIGlmICghbU91dEJ1ZmZlckZsdXNoKSB7CisgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgYWxsb2NhdGUgdG1wIG91dHB1dCBidWZmZXIgKGZvciBmbHVzaCkgb2Ygc2l6ZSAldSAiLCBidWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICB9CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKworICAgICAgICBzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCBudWxscHRyLCBudWxscHRyLCAwLCAwLCAwKTsKKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIGlmICgwID09IHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobU91dEJ1ZmZlckZsdXNoKSB7CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobnVsbHB0ciwgbU91dEJ1ZmZlckZsdXNoKTsKKyAgICAgICAgbU91dEJ1ZmZlckZsdXNoID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OmNyZWF0ZURlY29kZXIoKSB7CisgICAgaXZkZXh0X2NyZWF0ZV9pcF90IHNfY3JlYXRlX2lwOworICAgIGl2ZGV4dF9jcmVhdGVfb3BfdCBzX2NyZWF0ZV9vcDsKKworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2NyZWF0ZV9pcF90KTsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5lX2NtZCA9IElWRF9DTURfQ1JFQVRFOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5lX291dHB1dF9mb3JtYXQgPSBtSXZDb2xvcmZvcm1hdDsKKyAgICBzX2NyZWF0ZV9pcC5zX2l2ZF9jcmVhdGVfaXBfdC5wZl9hbGlnbmVkX2FsbG9jID0gaXZkX2FsaWduZWRfbWFsbG9jOworICAgIHNfY3JlYXRlX2lwLnNfaXZkX2NyZWF0ZV9pcF90LnBmX2FsaWduZWRfZnJlZSA9IGl2ZF9hbGlnbmVkX2ZyZWU7CisgICAgc19jcmVhdGVfaXAuc19pdmRfY3JlYXRlX2lwX3QucHZfbWVtX2N0eHQgPSBudWxscHRyOworICAgIHNfY3JlYXRlX29wLnNfaXZkX2NyZWF0ZV9vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2NyZWF0ZV9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfY3JlYXRlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19jcmVhdGVfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19jcmVhdGVfb3Auc19pdmRfY3JlYXRlX29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtRGVjSGFuZGxlID0gKGl2X29ial90KilzX2NyZWF0ZV9vcC5zX2l2ZF9jcmVhdGVfb3BfdC5wdl9oYW5kbGU7CisgICAgbURlY0hhbmRsZS0+cHZfZnhucyA9ICh2b2lkICopaXZkZWNfYXBpX2Z1bmN0aW9uOworICAgIG1EZWNIYW5kbGUtPnU0X3NpemUgPSBzaXplb2YoaXZfb2JqX3QpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpzZXROdW1Db3JlcygpIHsKKyAgICBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCBzX3NldF9udW1fY29yZXNfaXA7CisgICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3Qgc19zZXRfbnVtX2NvcmVzX29wOworCisgICAgc19zZXRfbnVtX2NvcmVzX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QpOworICAgIHNfc2V0X251bV9jb3Jlc19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfc2V0X251bV9jb3Jlc19pcC5lX3N1Yl9jbWQgPSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTOworICAgIHNfc2V0X251bV9jb3Jlc19pcC51NF9udW1fY29yZXMgPSBtTnVtQ29yZXM7CisgICAgc19zZXRfbnVtX2NvcmVzX29wLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfbnVtX2NvcmVzX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfbnVtX2NvcmVzX29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0QoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X251bV9jb3Jlc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpzZXRQYXJhbXMoc2l6ZV90IHN0cmlkZSwgSVZEX1ZJREVPX0RFQ09ERV9NT0RFX1QgZGVjX21vZGUpIHsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfaXBfdCBzX3NldF9keW5fcGFyYW1zX2lwOworICAgIGl2ZF9jdGxfc2V0X2NvbmZpZ19vcF90IHNfc2V0X2R5bl9wYXJhbXNfb3A7CisKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX2lwX3QpOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX1NFVFBBUkFNUzsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLnU0X2Rpc3Bfd2QgPSAoVVdPUkQzMikgc3RyaWRlOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV9mcm1fc2tpcF9tb2RlID0gSVZEX1NLSVBfTk9ORTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX291dF9tb2RlID0gSVZEX0RJU1BMQVlfRlJBTUVfT1VUOworICAgIHNfc2V0X2R5bl9wYXJhbXNfaXAuZV92aWRfZGVjX21vZGUgPSBkZWNfbW9kZTsKKyAgICBzX3NldF9keW5fcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZHluX3BhcmFtc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfZHluX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpnZXRWZXJzaW9uKCkgeworICAgIGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCBzX2dldF92ZXJzaW9uaW5mb19pcDsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3Qgc19nZXRfdmVyc2lvbmluZm9fb3A7CisgICAgVVdPUkQ4IGF1MV9idWZbNTEyXTsKKworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19pcF90KTsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5lX2NtZCA9IElWRF9DTURfVklERU9fQ1RMOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLmVfc3ViX2NtZCA9IElWRF9DTURfQ1RMX0dFVFZFUlNJT047CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAucHZfdmVyc2lvbl9idWZmZXIgPSBhdTFfYnVmOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnU0X3ZlcnNpb25fYnVmZmVyX3NpemUgPSBzaXplb2YoYXUxX2J1Zik7CisgICAgc19nZXRfdmVyc2lvbmluZm9fb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2dldHZlcnNpb25pbmZvX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdmVyc2lvbmluZm9faXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2dldF92ZXJzaW9uaW5mb19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICBzX2dldF92ZXJzaW9uaW5mb19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiaXR0aWFtIGRlY29kZXIgdmVyc2lvbiBudW1iZXI6ICVzIiwKKyAgICAgICAgICAgICAgKGNoYXIgKikgc19nZXRfdmVyc2lvbmluZm9faXAucHZfdmVyc2lvbl9idWZmZXIpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgaWYgKE9LICE9IGNyZWF0ZURlY29kZXIoKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgbU51bUNvcmVzID0gTUlOKGdldENwdUNvcmVDb3VudCgpLCBNQVhfTlVNX0NPUkVTKTsKKyAgICBtU3RyaWRlID0gQUxJR04xMjgobVdpZHRoKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXNldFBsdWdpbigpOworICAgICh2b2lkKSBzZXROdW1Db3JlcygpOworICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9GUkFNRSkpIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICh2b2lkKSBnZXRWZXJzaW9uKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2Jvb2wgQzJTb2Z0SGV2Y0RlYzo6c2V0RGVjb2RlQXJncyhpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY29kZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3QgKnBzX2RlY29kZV9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkdyYXBoaWNWaWV3ICpvdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHNNYXJrZXIpIHsKKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gbVN0cmlkZTsKKyAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gbUhlaWdodDsKKyAgICBzaXplX3QgbHVtYVNpemUgPSBkaXNwbGF5U3RyaWRlICogZGlzcGxheUhlaWdodDsKKyAgICBzaXplX3QgY2hyb21hU2l6ZSA9IGx1bWFTaXplID4+IDI7CisKKyAgICBwc19kZWNvZGVfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9pcF90KTsKKyAgICBwc19kZWNvZGVfaXAtPmVfY21kID0gSVZEX0NNRF9WSURFT19ERUNPREU7CisgICAgaWYgKGluQnVmZmVyKSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfdHMgPSB0c01hcmtlcjsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGluQnVmZmVyLT5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfbnVtX0J5dGVzID0gaW5TaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfdHMgPSAwOworICAgICAgICBwc19kZWNvZGVfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBudWxscHRyOworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X251bV9CeXRlcyA9IDA7CisgICAgfQorICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMF0gPSBsdW1hU2l6ZTsKKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzFdID0gY2hyb21hU2l6ZTsKKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzJdID0gY2hyb21hU2l6ZTsKKyAgICBpZiAob3V0QnVmZmVyKSB7CisgICAgICAgIGlmIChvdXRCdWZmZXItPndpZHRoKCkgPCBkaXNwbGF5U3RyaWRlIHx8IG91dEJ1ZmZlci0+aGVpZ2h0KCkgPCBkaXNwbGF5SGVpZ2h0KSB7CisgICAgICAgICAgICBBTE9HRSgiT3V0cHV0IGJ1ZmZlciB0b28gc21hbGw6IHByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCV1eCV1KSIsCisgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPndpZHRoKCksIG91dEJ1ZmZlci0+aGVpZ2h0KCksIGRpc3BsYXlTdHJpZGUsIGRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBtT3V0QnVmZmVyRmx1c2g7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gbU91dEJ1ZmZlckZsdXNoICsgbHVtYVNpemU7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gbU91dEJ1ZmZlckZsdXNoICsgbHVtYVNpemUgKyBjaHJvbWFTaXplOworICAgIH0KKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9udW1fYnVmcyA9IDM7CisgICAgcHNfZGVjb2RlX29wLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfb3BfdCk7CisgICAgcHNfZGVjb2RlX29wLT51NF9vdXRwdXRfcHJlc2VudCA9IDA7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDMlNvZnRIZXZjRGVjOjpnZXRWdWlQYXJhbXMoKSB7CisgICAgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90IHNfZ2V0X3Z1aV9wYXJhbXNfaXA7CisgICAgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19vcF90IHNfZ2V0X3Z1aV9wYXJhbXNfb3A7CisKKyAgICBzX2dldF92dWlfcGFyYW1zX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19pcF90KTsKKyAgICBzX2dldF92dWlfcGFyYW1zX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19nZXRfdnVpX3BhcmFtc19pcC5lX3N1Yl9jbWQgPQorICAgICAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVCkgSUhFVkNEX0NYQV9DTURfQ1RMX0dFVF9WVUlfUEFSQU1TOworICAgIHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdnVpX3BhcmFtc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3Z1aV9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19nZXRfdnVpX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFZ1aUNvbG9yQXNwZWN0cyB2dWlDb2xvckFzcGVjdHM7CisgICAgdnVpQ29sb3JBc3BlY3RzLnByaW1hcmllcyA9IHNfZ2V0X3Z1aV9wYXJhbXNfb3AudTFfY29sb3VyX3ByaW1hcmllczsKKyAgICB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX3RyYW5zZmVyX2NoYXJhY3RlcmlzdGljczsKKyAgICB2dWlDb2xvckFzcGVjdHMuY29lZmZzID0gc19nZXRfdnVpX3BhcmFtc19vcC51MV9tYXRyaXhfY29lZmZpY2llbnRzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5mdWxsUmFuZ2UgPSBzX2dldF92dWlfcGFyYW1zX29wLnUxX3ZpZGVvX2Z1bGxfcmFuZ2VfZmxhZzsKKworICAgIC8vIGNvbnZlcnQgdnVpIGFzcGVjdHMgdG8gQzIgdmFsdWVzIGlmIGNoYW5nZWQKKyAgICBpZiAoISh2dWlDb2xvckFzcGVjdHMgPT0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0cykpIHsKKyAgICAgICAgbUJpdHN0cmVhbUNvbG9yQXNwZWN0cyA9IHZ1aUNvbG9yQXNwZWN0czsKKyAgICAgICAgQ29sb3JBc3BlY3RzIHNmQXNwZWN0czsKKyAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCBjb2RlZEFzcGVjdHMgPSB7IDB1IH07CisgICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKKyAgICAgICAgICAgICAgICB2dWlDb2xvckFzcGVjdHMucHJpbWFyaWVzLCB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIsIHZ1aUNvbG9yQXNwZWN0cy5jb2VmZnMsCisgICAgICAgICAgICAgICAgdnVpQ29sb3JBc3BlY3RzLmZ1bGxSYW5nZSwgc2ZBc3BlY3RzKTsKKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tUHJpbWFyaWVzLCAmY29kZWRBc3BlY3RzLnByaW1hcmllcykpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5wcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tUmFuZ2UsICZjb2RlZEFzcGVjdHMucmFuZ2UpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1NYXRyaXhDb2VmZnMsICZjb2RlZEFzcGVjdHMubWF0cml4KSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUMyTWFwcGVyOjptYXAoc2ZBc3BlY3RzLm1UcmFuc2ZlciwgJmNvZGVkQXNwZWN0cy50cmFuc2ZlcikpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgKHZvaWQpbUludGYtPmNvbmZpZyh7JmNvZGVkQXNwZWN0c30sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXR1c190IEMyU29mdEhldmNEZWM6OnNldEZsdXNoTW9kZSgpIHsKKyAgICBpdmRfY3RsX2ZsdXNoX2lwX3Qgc19zZXRfZmx1c2hfaXA7CisgICAgaXZkX2N0bF9mbHVzaF9vcF90IHNfc2V0X2ZsdXNoX29wOworCisgICAgc19zZXRfZmx1c2hfaXAudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX2lwX3QpOworICAgIHNfc2V0X2ZsdXNoX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfZmx1c2hfaXAuZV9zdWJfY21kID0gSVZEX0NNRF9DVExfRkxVU0g7CisgICAgc19zZXRfZmx1c2hfb3AudTRfc2l6ZSA9IHNpemVvZihpdmRfY3RsX2ZsdXNoX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZmx1c2hfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9mbHVzaF9vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9mbHVzaF9vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjpyZXNldERlY29kZXIoKSB7CisgICAgaXZkX2N0bF9yZXNldF9pcF90IHNfcmVzZXRfaXA7CisgICAgaXZkX2N0bF9yZXNldF9vcF90IHNfcmVzZXRfb3A7CisKKyAgICBzX3Jlc2V0X2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9pcF90KTsKKyAgICBzX3Jlc2V0X2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19yZXNldF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9SRVNFVDsKKyAgICBzX3Jlc2V0X29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfcmVzZXRfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Jlc2V0X29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfcmVzZXRfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtU3RyaWRlID0gMDsKKyAgICAodm9pZCkgc2V0TnVtQ29yZXMoKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtSGVhZGVyRGVjb2RlZCA9IGZhbHNlOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDMlNvZnRIZXZjRGVjOjpyZXNldFBsdWdpbigpIHsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKK30KKworc3RhdHVzX3QgQzJTb2Z0SGV2Y0RlYzo6ZGVsZXRlRGVjb2RlcigpIHsKKyAgICBpZiAobURlY0hhbmRsZSkgeworICAgICAgICBpdmRleHRfZGVsZXRlX2lwX3Qgc19kZWxldGVfaXA7CisgICAgICAgIGl2ZGV4dF9kZWxldGVfb3BfdCBzX2RlbGV0ZV9vcDsKKworICAgICAgICBzX2RlbGV0ZV9pcC5zX2l2ZF9kZWxldGVfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9kZWxldGVfaXBfdCk7CisgICAgICAgIHNfZGVsZXRlX2lwLnNfaXZkX2RlbGV0ZV9pcF90LmVfY21kID0gSVZEX0NNRF9ERUxFVEU7CisgICAgICAgIHNfZGVsZXRlX29wLnNfaXZkX2RlbGV0ZV9vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2RlbGV0ZV9vcF90KTsKKyAgICAgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19kZWxldGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19kZWxldGVfb3ApOworICAgICAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIEFMT0dFKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgc19kZWxldGVfb3Auc19pdmRfZGVsZXRlX29wX3QudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBtRGVjSGFuZGxlID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRIZXZjRGVjOjpmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlR3JhcGhpY0J1ZmZlcihzdGQ6Om1vdmUobU91dEJsb2NrKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KG1XaWR0aCwgbUhlaWdodCkpOworICAgIG1PdXRCbG9jayA9IG51bGxwdHI7CisgICAgeworICAgICAgICBJbnRmSW1wbDo6TG9jayBsb2NrID0gbUludGYtPmxvY2soKTsKKyAgICAgICAgYnVmZmVyLT5zZXRJbmZvKG1JbnRmLT5nZXRDb2xvckFzcGVjdHNfbCgpKTsKKyAgICB9CisKKyAgICBjbGFzcyBGaWxsV29yayB7CisgICAgICAgcHVibGljOgorICAgICAgICBGaWxsV29yayh1aW50MzJfdCBmbGFncywgQzJXb3JrT3JkaW5hbFN0cnVjdCBvcmRpbmFsLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBidWZmZXIpCisgICAgICAgICAgICA6IG1GbGFncyhmbGFncyksIG1PcmRpbmFsKG9yZGluYWwpLCBtQnVmZmVyKGJ1ZmZlcikge30KKyAgICAgICAgfkZpbGxXb3JrKCkgPSBkZWZhdWx0OworCisgICAgICAgIHZvaWQgb3BlcmF0b3IoKShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KW1GbGFnczsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IG1PcmRpbmFsOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgICAgICAgICAgaWYgKG1CdWZmZXIpIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2sobUJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigidGltZXN0YW1wID0gJWxsZCwgaW5kZXggPSAlbGxkLCB3LyVzIGJ1ZmZlciIsCisgICAgICAgICAgICAgICAgICBtT3JkaW5hbC50aW1lc3RhbXAucGVla2xsKCksIG1PcmRpbmFsLmZyYW1lSW5kZXgucGVla2xsKCksCisgICAgICAgICAgICAgICAgICBtQnVmZmVyID8gIiIgOiAibyIpOworICAgICAgICB9CisKKyAgICAgICBwcml2YXRlOgorICAgICAgICBjb25zdCB1aW50MzJfdCBtRmxhZ3M7CisgICAgICAgIGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgbU9yZGluYWw7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gbUJ1ZmZlcjsKKyAgICB9OworCisgICAgYXV0byBmaWxsV29yayA9IFtidWZmZXJdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH07CisgICAgaWYgKHdvcmsgJiYgYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkgeworICAgICAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICAgICAgLy8gVE9ETzogQ2hlY2sgaWYgY2xvbmVBbmRTZW5kIGNhbiBiZSBhdm9pZGVkIGJ5IHRyYWNraW5nIG51bWJlciBvZiBmcmFtZXMgcmVtYWluaW5nCisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBtT3V0SW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgICAgICBDMldvcmtPcmRpbmFsU3RydWN0IG91dE9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICAgICAgICAgIGNsb25lQW5kU2VuZCgKKyAgICAgICAgICAgICAgICAgICAgbU91dEluZGV4LCB3b3JrLAorICAgICAgICAgICAgICAgICAgICBGaWxsV29yayhDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFLCBvdXRPcmRpbmFsLCBidWZmZXIpKTsKKyAgICAgICAgICAgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmluaXNoKGluZGV4LCBmaWxsV29yayk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRGVjOjplbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibm90IHN1cHBvc2VkIHRvIGJlIGhlcmUsIGludmFsaWQgZGVjb2RlciBjb250ZXh0Iik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIGlmIChtU3RyaWRlICE9IEFMSUdOMTI4KG1XaWR0aCkpIHsKKyAgICAgICAgbVN0cmlkZSA9IEFMSUdOMTI4KG1XaWR0aCk7CisgICAgICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9GUkFNRSkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2sgJiYKKyAgICAgICAgICAgIChtT3V0QmxvY2stPndpZHRoKCkgIT0gbVN0cmlkZSB8fCBtT3V0QmxvY2stPmhlaWdodCgpICE9IG1IZWlnaHQpKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAoIW1PdXRCbG9jaykgeworICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2sobVN0cmlkZSwgbUhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJm1PdXRCbG9jayk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCkiLAorICAgICAgICAgICAgICBtT3V0QmxvY2stPndpZHRoKCksIG1PdXRCbG9jay0+aGVpZ2h0KCksIG1TdHJpZGUsIG1IZWlnaHQpOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gVE9ETzogY2FuIG92ZXJhbGwgZXJyb3IgY2hlY2tpbmcgYmUgaW1wcm92ZWQ/CisvLyBUT0RPOiBhbGxvdyBjb25maWd1cmF0aW9uIG9mIGNvbG9yIGZvcm1hdCBhbmQgdXNhZ2UgZm9yIGdyYXBoaWMgYnVmZmVycyBpbnN0ZWFkCisvLyAgICAgICBvZiBoYXJkIGNvZGluZyB0aGVtIHRvIEhBTF9QSVhFTF9GT1JNQVRfWVYxMgorLy8gVE9ETzogcGFzcyBjb2xvcmFzcGVjdHMgaW5mb3JtYXRpb24gdG8gc3VyZmFjZQorLy8gVE9ETzogdGVzdCBzdXBwb3J0IGZvciBkeW5hbWljIGNoYW5nZSBpbiByZXNvbHV0aW9uCisvLyBUT0RPOiB2ZXJpZnkgaWYgdGhlIGRlY29kZXIgc2VudCBiYWNrIGFsbCBmcmFtZXMKK3ZvaWQgQzJTb2Z0SGV2Y0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IGluT2Zmc2V0ID0gMHU7CisgICAgc2l6ZV90IGluU2l6ZSA9IDB1OworICAgIHVpbnQzMl90IHdvcmtJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpICYgMHhGRkZGRkZGRjsKKyAgICBDMlJlYWRWaWV3IHJWaWV3ID0gbUR1bW15UmVhZFZpZXc7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgclZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IHJWaWV3LmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgYm9vbCBoYXNQaWN0dXJlID0gZmFsc2U7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfaXBfdCBzX2RlY29kZV9pcDsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90IHNfZGVjb2RlX29wOworICAgICAgICBpZiAoIXNldERlY29kZUFyZ3MoJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3AsICZyVmlldywgJndWaWV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5PZmZzZXQgKyBpblBvcywgaW5TaXplIC0gaW5Qb3MsIHdvcmtJbmRleCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZhbHNlID09IG1IZWFkZXJEZWNvZGVkKSB7CisgICAgICAgICAgICAvKiBEZWNvZGUgaGVhZGVyIGFuZCBnZXQgZGltZW5zaW9ucyAqLworICAgICAgICAgICAgc2V0UGFyYW1zKG1TdHJpZGUsIElWRF9ERUNPREVfSEVBREVSKTsKKyAgICAgICAgfQorICAgICAgICBXT1JEMzIgZGVsYXk7CisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIG51bGxwdHIpOworICAgICAgICBUSU1FX0RJRkYobVRpbWVFbmQsIG1UaW1lU3RhcnQsIGRlbGF5KTsKKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIFdPUkQzMiBkZWNvZGVUaW1lOworICAgICAgICBHRVRUSU1FKCZtVGltZUVuZCwgbnVsbHB0cik7CisgICAgICAgIFRJTUVfRElGRihtVGltZVN0YXJ0LCBtVGltZUVuZCwgZGVjb2RlVGltZSk7CisgICAgICAgIEFMT0dWKCJkZWNvZGVUaW1lPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgZGVjb2RlVGltZSwgZGVsYXksCisgICAgICAgICAgICAgIHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZCk7CisgICAgICAgIGlmIChJVkRfTUVNX0FMTE9DX0ZBSUxFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSkgeworICAgICAgICAgICAgQUxPR0UoImFsbG9jYXRpb24gZmFpbHVyZSBpbiBkZWNvZGVyIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChJVkRfU1RSRUFNX1dJRFRIX0hFSUdIVF9OT1RfU1VQUE9SVEVEID09CisgICAgICAgICAgICAgICAgICAgKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bnN1cHBvcnRlZCByZXNvbHV0aW9uIDogJWR4JWQiLCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoSVZEX1JFU19DSEFOR0VEID09IChzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlICYgSVZEX0VSUk9SX01BU0spKSB7CisgICAgICAgICAgICBBTE9HVigicmVzb2x1dGlvbiBjaGFuZ2VkIik7CisgICAgICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9OT19FT1MsIHBvb2wsIHdvcmspOworICAgICAgICAgICAgcmVzZXREZWNvZGVyKCk7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKworICAgICAgICAgICAgLyogRGVjb2RlIGhlYWRlciBhbmQgZ2V0IG5ldyBkaW1lbnNpb25zICovCisgICAgICAgICAgICBzZXRQYXJhbXMobVN0cmlkZSwgSVZEX0RFQ09ERV9IRUFERVIpOworICAgICAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIH0gZWxzZSBpZiAoSVNfSVZEX0ZBVEFMX0VSUk9SKHNfZGVjb2RlX29wLnU0X2Vycm9yX2NvZGUpKSB7CisgICAgICAgICAgICBBTE9HRSgiRmF0YWwgZXJyb3IgaW4gZGVjb2RlciAweCV4Iiwgc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc19kZWNvZGVfb3AuaTRfcmVvcmRlcl9kZXB0aCA+PSAwICYmIG1PdXRwdXREZWxheSAhPSBzX2RlY29kZV9vcC5pNF9yZW9yZGVyX2RlcHRoKSB7CisgICAgICAgICAgICBtT3V0cHV0RGVsYXkgPSBzX2RlY29kZV9vcC5pNF9yZW9yZGVyX2RlcHRoOworICAgICAgICAgICAgQUxPR1YoIk5ldyBPdXRwdXQgZGVsYXkgJWQgIiwgbU91dHB1dERlbGF5KTsKKworICAgICAgICAgICAgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dCBvdXRwdXREZWxheShtT3V0cHV0RGVsYXkpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsmb3V0cHV0RGVsYXl9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkob3V0cHV0RGVsYXkpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNhbm5vdCBzZXQgb3V0cHV0IGRlbGF5Iik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoMCA8IHNfZGVjb2RlX29wLnU0X3BpY193ZCAmJiAwIDwgc19kZWNvZGVfb3AudTRfcGljX2h0KSB7CisgICAgICAgICAgICBpZiAobUhlYWRlckRlY29kZWQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICBtSGVhZGVyRGVjb2RlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgc2V0UGFyYW1zKEFMSUdOMTI4KHNfZGVjb2RlX29wLnU0X3BpY193ZCksIElWRF9ERUNPREVfRlJBTUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X3BpY193ZCAhPSBtV2lkdGggfHwgIHNfZGVjb2RlX29wLnU0X3BpY19odCAhPSBtSGVpZ2h0KSB7CisgICAgICAgICAgICAgICAgbVdpZHRoID0gc19kZWNvZGVfb3AudTRfcGljX3dkOworICAgICAgICAgICAgICAgIG1IZWlnaHQgPSBzX2RlY29kZV9vcC51NF9waWNfaHQ7CisgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoMHUsIHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KTsKKworICAgICAgICAgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICAgICAgbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoc2l6ZSkpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3Qgc2V0IHdpZHRoIGFuZCBoZWlnaHQiKTsKKyAgICAgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICh2b2lkKSBnZXRWdWlQYXJhbXMoKTsKKyAgICAgICAgaGFzUGljdHVyZSB8PSAoMSA9PSBzX2RlY29kZV9vcC51NF9mcmFtZV9kZWNvZGVkX2ZsYWcpOworICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsoc19kZWNvZGVfb3AudTRfdHMsIHdvcmspOworICAgICAgICB9CisgICAgICAgIGlmICgwID09IHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZCkgeworICAgICAgICAgICAgQUxPR0QoIkJ5dGVzIGNvbnN1bWVkIGlzIHplcm8uIElnbm9yaW5nIHJlbWFpbmluZyBieXRlcyIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaW5Qb3MgKz0gc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkOworICAgICAgICBpZiAoaGFzUGljdHVyZSAmJiAoaW5TaXplIC0gaW5Qb3MpKSB7CisgICAgICAgICAgICBBTE9HRCgiZGVjb2RlZCBmcmFtZSBpbiBjdXJyZW50IGFjY2VzcyBuYWwsIGlnbm9yaW5nIGZ1cnRoZXIgdHJhaWxpbmcgYnl0ZXMgJWQiLAorICAgICAgICAgICAgICAgICAgKGludClpblNpemUgLSAoaW50KWluUG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVvcykgeworICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoIWhhc1BpY3R1cmUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNEZWM6OmRyYWluSW50ZXJuYWwoCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgaWYgKE9LICE9IHNldEZsdXNoTW9kZSgpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKyAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCBudWxscHRyLCAmd1ZpZXcsIDAsIDAsIDApKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgKHZvaWQpIGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLCAmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCk7CisgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgZmluaXNoV29yayhzX2RlY29kZV9vcC51NF90cywgd29yayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNEZWM6OmRyYWluKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChkcmFpbk1vZGUsIHBvb2wsIG51bGxwdHIpOworfQorCitjbGFzcyBDMlNvZnRIZXZjRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdEhldmNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRIZXZjRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEhldmNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0SGV2Y0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEhldmNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRIZXZjRGVjRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0SGV2Y0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZWNkMTAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRGVjLmgKQEAgLTAsMCArMSwxNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9IRVZDX0RFQ19IXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfSEVWQ19ERUNfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJpaGV2Y190eXBlZGVmcy5oIgorI2luY2x1ZGUgIml2LmgiCisjaW5jbHVkZSAiaXZkLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworI2RlZmluZSBpdmRlY19hcGlfZnVuY3Rpb24gICAgICAgICAgICAgIGloZXZjZF9jeGFfYXBpX2Z1bmN0aW9uCisjZGVmaW5lIGl2ZGV4dF9jcmVhdGVfaXBfdCAgICAgICAgICAgICAgaWhldmNkX2N4YV9jcmVhdGVfaXBfdAorI2RlZmluZSBpdmRleHRfY3JlYXRlX29wX3QgICAgICAgICAgICAgIGloZXZjZF9jeGFfY3JlYXRlX29wX3QKKyNkZWZpbmUgaXZkZXh0X2RlbGV0ZV9pcF90ICAgICAgICAgICAgICBpaGV2Y2RfY3hhX2RlbGV0ZV9pcF90CisjZGVmaW5lIGl2ZGV4dF9kZWxldGVfb3BfdCAgICAgICAgICAgICAgaWhldmNkX2N4YV9kZWxldGVfb3BfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfaXBfdCAgIGloZXZjZF9jeGFfY3RsX3NldF9udW1fY29yZXNfaXBfdAorI2RlZmluZSBpdmRleHRfY3RsX3NldF9udW1fY29yZXNfb3BfdCAgIGloZXZjZF9jeGFfY3RsX3NldF9udW1fY29yZXNfb3BfdAorI2RlZmluZSBpdmRleHRfY3RsX2dldF92dWlfcGFyYW1zX2lwX3QgIGloZXZjZF9jeGFfY3RsX2dldF92dWlfcGFyYW1zX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfdnVpX3BhcmFtc19vcF90ICBpaGV2Y2RfY3hhX2N0bF9nZXRfdnVpX3BhcmFtc19vcF90CisjZGVmaW5lIEFMSUdONjQoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoKHgpICsgNjMpID4+IDYpIDw8IDYpCisjZGVmaW5lIEFMSUdOMTI4KHgpICAgICAgICAgICAgICAgICAgICAgKCgoKHgpICsgMTI3KSA+PiA3KSA8PCA3KQorI2RlZmluZSBNQVhfTlVNX0NPUkVTICAgICAgICAgICAgICAgICAgIDQKKyNkZWZpbmUgSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUyAgICBcCisgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpSUhFVkNEX0NYQV9DTURfQ1RMX1NFVF9OVU1fQ09SRVMKKyNkZWZpbmUgTUlOKGEsIGIpICAgICAgICAgICAgICAgICAgICAgICAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisjZGVmaW5lIEdFVFRJTUUoYSwgYikgICAgICAgICAgICAgICAgICAgZ2V0dGltZW9mZGF5KGEsIGIpOworI2RlZmluZSBUSU1FX0RJRkYoc3RhcnQsIGVuZCwgZGlmZikgICAgIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgICgoZW5kKS50dl91c2VjIC0gKHN0YXJ0KS50dl91c2VjKTsKKworCitzdHJ1Y3QgQzJTb2Z0SGV2Y0RlYyA6IHB1YmxpYyBTaW1wbGVDMkNvbXBvbmVudCB7CisgICAgY2xhc3MgSW50ZkltcGw7CisKKyAgICBDMlNvZnRIZXZjRGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRIZXZjRGVjKCk7CisKKyAgICAvLyBGcm9tIFNpbXBsZUMyQ29tcG9uZW50CisgICAgYzJfc3RhdHVzX3Qgb25Jbml0KCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25TdG9wKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc2V0KCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvbkZsdXNoX3NtKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwcm9jZXNzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbigKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworIHByaXZhdGU6CisgICAgc3RhdHVzX3QgY3JlYXRlRGVjb2RlcigpOworICAgIHN0YXR1c190IHNldE51bUNvcmVzKCk7CisgICAgc3RhdHVzX3Qgc2V0UGFyYW1zKHNpemVfdCBzdHJpZGUsIElWRF9WSURFT19ERUNPREVfTU9ERV9UIGRlY19tb2RlKTsKKyAgICBzdGF0dXNfdCBnZXRWZXJzaW9uKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBib29sIHNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKTsKKyAgICBib29sIGdldFZ1aVBhcmFtcygpOworICAgIC8vIFRPRE86VGhpcyBpcyBub3QgdGhlIHJpZ2h0IHBsYWNlIGZvciBjb2xvckFzcGVjdHMgZnVuY3Rpb25zLiBUaGVzZSBzaG91bGQKKyAgICAvLyBiZSBwYXJ0IG9mIGMyLXZuZGsgc28gdGhhdCB0aGV5IGNhbiBiZSBhY2Nlc3NlZCBieSBhbGwgdmlkZW8gcGx1Z2lucworICAgIC8vIHVudGlsIHRoZW4sIG1ha2UgdGhlbSBmZWVsIGF0IGhvbWUKKyAgICBib29sIGNvbG9yQXNwZWN0c0RpZmZlcihjb25zdCBDb2xvckFzcGVjdHMgJmEsIGNvbnN0IENvbG9yQXNwZWN0cyAmYik7CisgICAgdm9pZCB1cGRhdGVGaW5hbENvbG9yQXNwZWN0cygKKyAgICAgICAgICAgIGNvbnN0IENvbG9yQXNwZWN0cyAmb3RoZXJBc3BlY3RzLCBjb25zdCBDb2xvckFzcGVjdHMgJnByZWZlcnJlZEFzcGVjdHMpOworICAgIHN0YXR1c190IGhhbmRsZUNvbG9yQXNwZWN0c0NoYW5nZSgpOworICAgIGMyX3N0YXR1c190IGVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKTsKKyAgICB2b2lkIGZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCBzZXRGbHVzaE1vZGUoKTsKKyAgICBjMl9zdGF0dXNfdCBkcmFpbkludGVybmFsKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKyAgICBzdGF0dXNfdCByZXNldERlY29kZXIoKTsKKyAgICB2b2lkIHJlc2V0UGx1Z2luKCk7CisgICAgc3RhdHVzX3QgZGVsZXRlRGVjb2RlcigpOworCisgICAgLy8gVE9ETzpUaGlzIGlzIG5vdCB0aGUgcmlnaHQgcGxhY2UgZm9yIHRoaXMgZW51bS4gVGhlc2Ugc2hvdWxkCisgICAgLy8gYmUgcGFydCBvZiBjMi12bmRrIHNvIHRoYXQgdGhleSBjYW4gYmUgYWNjZXNzZWQgYnkgYWxsIHZpZGVvIHBsdWdpbnMKKyAgICAvLyB1bnRpbCB0aGVuLCBtYWtlIHRoZW0gZmVlbCBhdCBob21lCisgICAgZW51bSB7CisgICAgICAgIGtOb3RTdXBwb3J0ZWQsCisgICAgICAgIGtQcmVmZXJCaXRzdHJlYW0sCisgICAgICAgIGtQcmVmZXJDb250YWluZXIsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgaXZfb2JqX3QgKm1EZWNIYW5kbGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBtT3V0QmxvY2s7CisgICAgdWludDhfdCAqbU91dEJ1ZmZlckZsdXNoOworCisgICAgc2l6ZV90IG1OdW1Db3JlczsKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZDb2xvcmZvcm1hdDsKKyAgICB1aW50MzJfdCBtT3V0cHV0RGVsYXk7CisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgdWludDMyX3QgbVN0cmlkZTsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgYm9vbCBtSGVhZGVyRGVjb2RlZDsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtT3V0SW5kZXg7CisKKyAgICAvLyBDb2xvciBhc3BlY3RzLiBUaGVzZSBhcmUgSVNPIHZhbHVlcyBhbmQgYXJlIG1lYW50IHRvIGRldGVjdCBjaGFuZ2VzIGluIGFzcGVjdHMgdG8gYXZvaWQKKyAgICAvLyBjb252ZXJ0aW5nIHRoZW0gdG8gQzIgdmFsdWVzIGZvciBlYWNoIGZyYW1lCisgICAgc3RydWN0IFZ1aUNvbG9yQXNwZWN0cyB7CisgICAgICAgIHVpbnQ4X3QgcHJpbWFyaWVzOworICAgICAgICB1aW50OF90IHRyYW5zZmVyOworICAgICAgICB1aW50OF90IGNvZWZmczsKKyAgICAgICAgdWludDhfdCBmdWxsUmFuZ2U7CisKKyAgICAgICAgLy8gZGVmYXVsdCBjb2xvciBhc3BlY3RzCisgICAgICAgIFZ1aUNvbG9yQXNwZWN0cygpCisgICAgICAgICAgICA6IHByaW1hcmllcygyKSwgdHJhbnNmZXIoMiksIGNvZWZmcygyKSwgZnVsbFJhbmdlKDApIHsgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBWdWlDb2xvckFzcGVjdHMgJm8pIHsKKyAgICAgICAgICAgIHJldHVybiBwcmltYXJpZXMgPT0gby5wcmltYXJpZXMgJiYgdHJhbnNmZXIgPT0gby50cmFuc2ZlciAmJiBjb2VmZnMgPT0gby5jb2VmZnMKKyAgICAgICAgICAgICAgICAgICAgJiYgZnVsbFJhbmdlID09IG8uZnVsbFJhbmdlOworICAgICAgICB9CisgICAgfSBtQml0c3RyZWFtQ29sb3JBc3BlY3RzOworCisgICAgLy8gcHJvZmlsZQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7CisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRIZXZjRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX0hFVkNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmQyNTQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmNwcApAQCAtMCwwICsxLDEwODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU29mdEhldmNFbmMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMkJ1ZmZlclV0aWxzLmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlICJpaGV2Y190eXBlZGVmcy5oIgorI2luY2x1ZGUgIml0dF92aWRlb19hcGkuaCIKKyNpbmNsdWRlICJpaGV2Y2VfYXBpLmgiCisjaW5jbHVkZSAiaWhldmNlX3BsdWdpbi5oIgorI2luY2x1ZGUgIkMyU29mdEhldmNFbmMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuaGV2Yy5lbmNvZGVyIjsKKwordm9pZCBQYXJzZUdvcCgKKyAgICAgICAgY29uc3QgQzJTdHJlYW1Hb3BUdW5pbmc6Om91dHB1dCAmZ29wLAorICAgICAgICB1aW50MzJfdCAqc3luY0ludGVydmFsLCB1aW50MzJfdCAqaUludGVydmFsLCB1aW50MzJfdCAqbWF4QmZyYW1lcykgeworICAgIHVpbnQzMl90IHN5bmNJbnQgPSAxOworICAgIHVpbnQzMl90IGlJbnQgPSAxOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZ29wLmZsZXhDb3VudCgpOyArK2kpIHsKKyAgICAgICAgY29uc3QgQzJHb3BMYXllclN0cnVjdCAmbGF5ZXIgPSBnb3AubS52YWx1ZXNbaV07CisgICAgICAgIGlmIChsYXllci5jb3VudCA9PSBVSU5UMzJfTUFYKSB7CisgICAgICAgICAgICBzeW5jSW50ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChzeW5jSW50IDw9IFVJTlQzMl9NQVggLyAobGF5ZXIuY291bnQgKyAxKSkgeworICAgICAgICAgICAgc3luY0ludCAqPSAobGF5ZXIuY291bnQgKyAxKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKGxheWVyLnR5cGVfICYgSV9GUkFNRSkgPT0gMCkgeworICAgICAgICAgICAgaWYgKGxheWVyLmNvdW50ID09IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICAgICBpSW50ID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaUludCA8PSBVSU5UMzJfTUFYIC8gKGxheWVyLmNvdW50ICsgMSkpIHsKKyAgICAgICAgICAgICAgICBpSW50ICo9IChsYXllci5jb3VudCArIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChsYXllci50eXBlXyA9PSBDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QoUF9GUkFNRSB8IEJfRlJBTUUpICYmIG1heEJmcmFtZXMpIHsKKyAgICAgICAgICAgICptYXhCZnJhbWVzID0gbGF5ZXIuY291bnQ7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHN5bmNJbnRlcnZhbCkgeworICAgICAgICAqc3luY0ludGVydmFsID0gc3luY0ludDsKKyAgICB9CisgICAgaWYgKGlJbnRlcnZhbCkgeworICAgICAgICAqaUludGVydmFsID0gaUludDsKKyAgICB9Cit9Cit9IC8vIG5hbWVwc2FjZQorCitjbGFzcyBDMlNvZnRIZXZjRW5jOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUdvcCwgQzJfUEFSQU1LRVlfR09QKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChDMlN0cmVhbUdvcFR1bmluZzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDAgLyogZmxleENvdW50ICovLCAwdSAvKiBzdHJlYW0gKi8pKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUdvcCwgbS52YWx1ZXNbMF0udHlwZV8pLmFueSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkYobUdvcCwgbS52YWx1ZXNbMF0uY291bnQpLmFueSgpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihHb3BTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWN0dWFsSW5wdXREZWxheSwgQzJfUEFSQU1LRVlfSU5QVVRfREVMQVkpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgIERFRkFVTFRfQl9GUkFNRVMgKyBERUZBVUxUX1JDX0xPT0tBSEVBRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQWN0dWFsSW5wdXREZWxheSwgdmFsdWUpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgIDAsIE1BWF9CX0ZSQU1FUyArIE1BWF9SQ19MT09LQUhFQUQpfSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKElucHV0RGVsYXlTZXR0ZXIsIG1Hb3ApCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoCisgICAgICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVVzYWdlLCBDMl9QQVJBTUtFWV9JTlBVVF9TVFJFQU1fVVNBR0UpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCAodWludDY0X3QpQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICAvLyBtYXRjaGVzIHNpemUgbGltaXRzIGluIGNvZGVjIGxpYnJhcnkKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAxOTIwLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMTA4OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtRnJhbWVSYXRlLCBDMl9QQVJBTUtFWV9GUkFNRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDMwLikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRnJhbWVSYXRlLCB2YWx1ZSkuZ3JlYXRlclRoYW4oMC4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptRnJhbWVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gbWF0Y2hlcyBsaW1pdHMgaW4gY29kZWMgbGlicmFyeQorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZU1vZGUsIEMyX1BBUkFNS0VZX0JJVFJBVEVfTU9ERSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbmZpZzo6QklUUkFURV9WQVJJQUJMRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUJpdHJhdGVNb2RlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkJJVFJBVEVfQ09OU1QsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6QklUUkFURV9WQVJJQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpCSVRSQVRFX0lHTk9SRX0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZU1vZGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCgwdSwgNjQwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUJpdHJhdGUsIHZhbHVlKS5pblJhbmdlKDQwOTYsIDEyMDAwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoQml0cmF0ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gbWF0Y2hlcyBsZXZlbHMgYWxsb3dlZCB3aXRoaW4gY29kZWMgbGlicmFyeQorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbXBsZXhpdHksIEMyX1BBUkFNS0VZX0NPTVBMRVhJVFkpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbXBsZXhpdHlUdW5pbmc6Om91dHB1dCgwdSwgMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ29tcGxleGl0eSwgdmFsdWUpLmluUmFuZ2UoMCwgMTApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1Db21wbGV4aXR5KT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1RdWFsaXR5LCBDMl9QQVJBTUtFWV9RVUFMSVRZKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1RdWFsaXR5VHVuaW5nOjpvdXRwdXQoMHUsIDgwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1RdWFsaXR5LCB2YWx1ZSkuaW5SYW5nZSgwLCAxMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1RdWFsaXR5KT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAwdSwgUFJPRklMRV9IRVZDX01BSU4sIExFVkVMX0hFVkNfTUFJTl8xKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKQorICAgICAgICAgICAgICAgICAgICAgICAgLm9uZU9mKHtDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl9TVElMTH0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpCisgICAgICAgICAgICAgICAgICAgICAgICAub25lT2Yoe0xFVkVMX0hFVkNfTUFJTl8xLCBMRVZFTF9IRVZDX01BSU5fMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfSEVWQ19NQUlOXzJfMSwgTEVWRUxfSEVWQ19NQUlOXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExFVkVMX0hFVkNfTUFJTl8zXzEsIExFVkVMX0hFVkNfTUFJTl80LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMRVZFTF9IRVZDX01BSU5fNF8xLCBMRVZFTF9IRVZDX01BSU5fNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTEVWRUxfSEVWQ19NQUlOXzVfMSwgTEVWRUxfSEVWQ19NQUlOXzVfMn0pLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSwgbUZyYW1lUmF0ZSwgbUJpdHJhdGUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUmVxdWVzdFN5bmMsIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0KDB1LCBDMl9GQUxTRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUmVxdWVzdFN5bmMsIHZhbHVlKS5vbmVPZih7IEMyX0ZBTFNFLCBDMl9UUlVFIH0pIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptUmVxdWVzdFN5bmMpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICBEZWZpbmVQYXJhbShtU3luY0ZyYW1lUGVyaW9kLCBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdCgKKyAgICAgICAgICAgICAgICAgICAgbmV3IEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dCgwdSwgMTAwMDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU3luY0ZyYW1lUGVyaW9kLCB2YWx1ZSkuYW55KCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgICAgICBTZXR0ZXI8ZGVjbHR5cGUoKm1TeW5jRnJhbWVQZXJpb2QpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIElucHV0RGVsYXlTZXR0ZXIoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgQzJQPEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ+ICZnb3ApIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIHVpbnQzMl90IG1heEJmcmFtZXMgPSAwOworICAgICAgICBQYXJzZUdvcChnb3AudiwgbnVsbHB0ciwgbnVsbHB0ciwgJm1heEJmcmFtZXMpOworICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IG1heEJmcmFtZXMgKyBERUZBVUxUX1JDX0xPT0tBSEVBRDsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEJpdHJhdGVTZXR0ZXIoYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4mIG1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi52YWx1ZSA8IDQwOTYpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnZhbHVlID0gNDA5NjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiYgb2xkTWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+JiBtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFByb2ZpbGVMZXZlbFNldHRlcigKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBDMlA8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZzaXplLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiAmZnJhbWVSYXRlLAorICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gJmJpdHJhdGUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmICghbWUuRihtZS52LnByb2ZpbGUpLnN1cHBvcnRzQXRBbGwobWUudi5wcm9maWxlKSkgeworICAgICAgICAgICAgbWUuc2V0KCkucHJvZmlsZSA9IFBST0ZJTEVfSEVWQ19NQUlOOworICAgICAgICB9CisKKyAgICAgICAgc3RydWN0IExldmVsTGltaXRzIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGxldmVsOworICAgICAgICAgICAgdWludDY0X3Qgc2FtcGxlc1BlclNlYzsKKyAgICAgICAgICAgIHVpbnQ2NF90IHNhbXBsZXM7CisgICAgICAgICAgICB1aW50MzJfdCBiaXRyYXRlOworICAgICAgICB9OworCisgICAgICAgIGNvbnN0ZXhwciBMZXZlbExpbWl0cyBrTGltaXRzW10gPSB7CisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8xLCAgICAgICA1NTI5NjAsICAgIDM2ODY0LCAgICAxMjgwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzIsICAgICAgMzY4NjQwMCwgICAxMjI4ODAsICAgMTUwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fMl8xLCAgICA3MzcyODAwLCAgIDI0NTc2MCwgICAzMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8zLCAgICAgMTY1ODg4MDAsICAgNTUyOTYwLCAgIDYwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzNfMSwgICAzMzE3NzYwMCwgICA5ODMwNDAsICAxMDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNCwgICAgIDY2ODQ2NzIwLCAgMjIyODIyNCwgIDEyMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl80XzEsICAxMzM2OTM0NDAsICAyMjI4MjI0LCAgMjAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzUsICAgIDI2NzM4Njg4MCwgIDg5MTI4OTYsICAyNTAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNV8xLCAgNTM0NzczNzYwLCAgODkxMjg5NiwgIDQwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl81XzIsIDEwNjk1NDc1MjAsICA4OTEyODk2LCAgNjAwMDAwMDAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzYsICAgMTA2OTU0NzUyMCwgMzU2NTE1ODQsICA2MDAwMDAwMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNl8xLCAyMTM5MDk1MDQwLCAzNTY1MTU4NCwgMTIwMDAwMDAwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl82XzIsIDQyNzgxOTAwODAsIDM1NjUxNTg0LCAyNDAwMDAwMDAgfSwKKyAgICAgICAgfTsKKworICAgICAgICB1aW50NjRfdCBzYW1wbGVzID0gc2l6ZS52LndpZHRoICogc2l6ZS52LmhlaWdodDsKKyAgICAgICAgdWludDY0X3Qgc2FtcGxlc1BlclNlYyA9IHNhbXBsZXMgKiBmcmFtZVJhdGUudi52YWx1ZTsKKworICAgICAgICAvLyBDaGVjayBpZiB0aGUgc3VwcGxpZWQgbGV2ZWwgbWVldHMgdGhlIE1CIC8gYml0cmF0ZSByZXF1aXJlbWVudHMuIElmCisgICAgICAgIC8vIG5vdCwgdXBkYXRlIHRoZSBsZXZlbCB3aXRoIHRoZSBsb3dlc3QgbGV2ZWwgbWVldGluZyB0aGUgcmVxdWlyZW1lbnRzLgorCisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgLy8gQnkgZGVmYXVsdCBuZWVkc1VwZGF0ZSA9IGZhbHNlIGluIGNhc2UgdGhlIHN1cHBsaWVkIGxldmVsIGRvZXMgbWVldAorICAgICAgICAvLyB0aGUgcmVxdWlyZW1lbnRzLgorICAgICAgICBib29sIG5lZWRzVXBkYXRlID0gZmFsc2U7CisgICAgICAgIGZvciAoY29uc3QgTGV2ZWxMaW1pdHMgJmxpbWl0IDoga0xpbWl0cykgeworICAgICAgICAgICAgaWYgKHNhbXBsZXMgPD0gbGltaXQuc2FtcGxlcyAmJiBzYW1wbGVzUGVyU2VjIDw9IGxpbWl0LnNhbXBsZXNQZXJTZWMgJiYKKyAgICAgICAgICAgICAgICAgICAgYml0cmF0ZS52LnZhbHVlIDw9IGxpbWl0LmJpdHJhdGUpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBsb3dlc3QgbGV2ZWwgdGhhdCBtZWV0cyB0aGUgcmVxdWlyZW1lbnRzLCBhbmQgaWYKKyAgICAgICAgICAgICAgICAvLyB3ZSBoYXZlbid0IHNlZW4gdGhlIHN1cHBsaWVkIGxldmVsIHlldCwgdGhhdCBtZWFucyB3ZSBkb24ndAorICAgICAgICAgICAgICAgIC8vIG5lZWQgdGhlIHVwZGF0ZS4KKyAgICAgICAgICAgICAgICBpZiAobmVlZHNVcGRhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkdpdmVuIGxldmVsICV4IGRvZXMgbm90IGNvdmVyIGN1cnJlbnQgY29uZmlndXJhdGlvbjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRqdXN0aW5nIHRvICV4IiwgbWUudi5sZXZlbCwgbGltaXQubGV2ZWwpOworICAgICAgICAgICAgICAgICAgICBtZS5zZXQoKS5sZXZlbCA9IGxpbWl0LmxldmVsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobWUudi5sZXZlbCA9PSBsaW1pdC5sZXZlbCkgeworICAgICAgICAgICAgICAgIC8vIFdlIGJyZWFrIG91dCBvZiB0aGUgbG9vcCB3aGVuIHRoZSBsb3dlc3QgZmVhc2libGUgbGV2ZWwgaXMKKyAgICAgICAgICAgICAgICAvLyBmb3VuZC4gVGhlIGZhY3QgdGhhdCB3ZSdyZSBoZXJlIG1lYW5zIHRoYXQgb3VyIGxldmVsIGRvZXNuJ3QKKyAgICAgICAgICAgICAgICAvLyBtZWV0IHRoZSByZXF1aXJlbWVudCBhbmQgbmVlZHMgdG8gYmUgdXBkYXRlZC4KKyAgICAgICAgICAgICAgICBuZWVkc1VwZGF0ZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgLy8gV2Ugc2V0IHRvIHRoZSBoaWdoZXN0IHN1cHBvcnRlZCBsZXZlbC4KKyAgICAgICAgICAgIG1lLnNldCgpLmxldmVsID0gTEVWRUxfSEVWQ19NQUlOXzVfMjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgR29wU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUdvcFR1bmluZzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWUudi5mbGV4Q291bnQoKTsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBDMkdvcExheWVyU3RydWN0ICZsYXllciA9IG1lLnYubS52YWx1ZXNbMF07CisgICAgICAgICAgICBpZiAobGF5ZXIudHlwZV8gPT0gQzJDb25maWc6OnBpY3R1cmVfdHlwZV90KFBfRlJBTUUgfCBCX0ZSQU1FKQorICAgICAgICAgICAgICAgICAgICAmJiBsYXllci5jb3VudCA+IE1BWF9CX0ZSQU1FUykgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm0udmFsdWVzW2ldLmNvdW50ID0gTUFYX0JfRlJBTUVTOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgVVdPUkQzMiBnZXRQcm9maWxlX2woKSBjb25zdCB7CisgICAgICAgIHN3aXRjaCAobVByb2ZpbGVMZXZlbC0+cHJvZmlsZSkgeworICAgICAgICBjYXNlIFBST0ZJTEVfSEVWQ19NQUlOOiAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIFBST0ZJTEVfSEVWQ19NQUlOX1NUSUxMOiByZXR1cm4gMTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dEKCJVbnJlY29nbml6ZWQgcHJvZmlsZTogJXgiLCBtUHJvZmlsZUxldmVsLT5wcm9maWxlKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorCisgICAgVVdPUkQzMiBnZXRMZXZlbF9sKCkgY29uc3QgeworICAgICAgICBzdHJ1Y3QgTGV2ZWwgeworICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgYzJMZXZlbDsKKyAgICAgICAgICAgIFVXT1JEMzIgaGV2Y0xldmVsOworICAgICAgICB9OworICAgICAgICBjb25zdGV4cHIgTGV2ZWwgbGV2ZWxzW10gPSB7CisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8xLCAgICAzMCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fMiwgICAgNjAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzJfMSwgIDYzIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl8zLCAgICA5MCB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fM18xLCAgOTMgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzQsICAgMTIwIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl80XzEsIDEyMyB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNSwgICAxNTAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzVfMSwgMTUzIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl81XzIsIDE1NiB9LAorICAgICAgICAgICAgeyBMRVZFTF9IRVZDX01BSU5fNiwgICAxODAgfSwKKyAgICAgICAgICAgIHsgTEVWRUxfSEVWQ19NQUlOXzZfMSwgMTgzIH0sCisgICAgICAgICAgICB7IExFVkVMX0hFVkNfTUFJTl82XzIsIDE4NiB9LAorICAgICAgICB9OworICAgICAgICBmb3IgKGNvbnN0IExldmVsICZsZXZlbCA6IGxldmVscykgeworICAgICAgICAgICAgaWYgKG1Qcm9maWxlTGV2ZWwtPmxldmVsID09IGxldmVsLmMyTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGV2ZWwuaGV2Y0xldmVsOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dEKCJVbnJlY29nbml6ZWQgbGV2ZWw6ICV4IiwgbVByb2ZpbGVMZXZlbC0+bGV2ZWwpOworICAgICAgICByZXR1cm4gMTU2OworICAgIH0KKyAgICB1aW50MzJfdCBnZXRTeW5jRnJhbWVQZXJpb2RfbCgpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIDwgMCB8fAorICAgICAgICAgICAgbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPT0gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICBkb3VibGUgcGVyaW9kID0gbVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgLyAxZTYgKiBtRnJhbWVSYXRlLT52YWx1ZTsKKyAgICAgICAgcmV0dXJuICh1aW50MzJfdCljMl9tYXgoYzJfbWluKHBlcmlvZCArIDAuNSwgZG91YmxlKFVJTlQzMl9NQVgpKSwgMS4pOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IGdldFNpemVfbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TaXplOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1GcmFtZVJhdGVJbmZvOjpvdXRwdXQ+IGdldEZyYW1lUmF0ZV9sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUZyYW1lUmF0ZTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dD4gZ2V0Qml0cmF0ZU1vZGVfbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CaXRyYXRlTW9kZTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gZ2V0Qml0cmF0ZV9sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJpdHJhdGU7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gZ2V0UmVxdWVzdFN5bmNfbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1SZXF1ZXN0U3luYzsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29tcGxleGl0eVR1bmluZzo6b3V0cHV0PiBnZXRDb21wbGV4aXR5X2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ29tcGxleGl0eTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUXVhbGl0eVR1bmluZzo6b3V0cHV0PiBnZXRRdWFsaXR5X2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUXVhbGl0eTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ+IGdldEdvcF9sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUdvcDsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVNb2RlVHVuaW5nOjpvdXRwdXQ+IG1CaXRyYXRlTW9kZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db21wbGV4aXR5VHVuaW5nOjpvdXRwdXQ+IG1Db21wbGV4aXR5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVF1YWxpdHlUdW5pbmc6Om91dHB1dD4gbVF1YWxpdHk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiBtUHJvZmlsZUxldmVsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQ+IG1TeW5jRnJhbWVQZXJpb2Q7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtR29wVHVuaW5nOjpvdXRwdXQ+IG1Hb3A7Cit9OworCitzdGF0aWMgc2l6ZV90IEdldENQVUNvcmVDb3VudCgpIHsKKyAgICBsb25nIGNwdUNvcmVDb3VudCA9IDA7CisKKyNpZiBkZWZpbmVkKF9TQ19OUFJPQ0VTU09SU19PTkxOKQorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DRVNTT1JTX09OTE4pOworI2Vsc2UKKyAgICAvLyBfU0NfTlBST0NfT05MTiBtdXN0IGJlIGRlZmluZWQuLi4KKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ19PTkxOKTsKKyNlbmRpZgorCisgICAgaWYgKGNwdUNvcmVDb3VudCA8IDEpCisgICAgICAgIGNwdUNvcmVDb3VudCA9IDE7CisgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OworfQorCitDMlNvZnRIZXZjRW5jOjpDMlNvZnRIZXZjRW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUl2VmlkZW9Db2xvckZvcm1hdChJVl9ZVVZfNDIwUCksCisgICAgICBtSGV2Y0VuY1Byb2ZpbGUoMSksCisgICAgICBtSGV2Y0VuY0xldmVsKDMwKSwKKyAgICAgIG1TdGFydGVkKGZhbHNlKSwKKyAgICAgIG1TcHNQcHNIZWFkZXJSZWNlaXZlZChmYWxzZSksCisgICAgICBtU2lnbmFsbGVkRW9zKGZhbHNlKSwKKyAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCisgICAgICBtQ29kZWNDdHgobnVsbHB0cikgeworICAgIC8vIElmIGR1bXAgaXMgZW5hYmxlZCwgdGhlbiBjcmVhdGUgYW4gZW1wdHkgZmlsZQorICAgIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKTsKKyAgICBDUkVBVEVfRFVNUF9GSUxFKG1JbkZpbGUpOworICAgIENSRUFURV9EVU1QX0ZJTEUobU91dEZpbGUpOworCisgICAgZ2V0dGltZW9mZGF5KCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICBnZXR0aW1lb2ZkYXkoJm1UaW1lRW5kLCBudWxscHRyKTsKK30KKworQzJTb2Z0SGV2Y0VuYzo6fkMyU29mdEhldmNFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNFbmM6Om9uSW5pdCgpIHsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNFbmM6Om9uU3RvcCgpIHsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0SGV2Y0VuYzo6b25SZXNldCgpIHsKKyAgICByZWxlYXNlRW5jb2RlcigpOworfQorCit2b2lkIEMyU29mdEhldmNFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICByZWxlYXNlRW5jb2RlcigpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRW5jOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJTaWduYWxsaW5nIEVPUyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKworc3RhdGljIGludCBnZXRRcEZyb21RdWFsaXR5KGludCBxdWFsaXR5KSB7CisgICAgaW50IHFwOworI2RlZmluZSBNSU5fUVAgNAorI2RlZmluZSBNQVhfUVAgNTAKKyAgICAvKiBRdWFsaXR5OiAxMDAgLT4gUXAgOiBNSU5fUVAKKyAgICAgKiBRdWFsaXR5OiAwIC0+IFFwIDogTUFYX1FQCisgICAgICogUXAgPSAoKE1JTl9RUCAtIE1BWF9RUCkgKiBxdWFsaXR5IC8gMTAwKSArIE1BWF9RUDsKKyAgICAgKi8KKyAgICBxcCA9ICgoTUlOX1FQIC0gTUFYX1FQKSAqIHF1YWxpdHkgLyAxMDApICsgTUFYX1FQOworICAgIHFwID0gc3RkOjptaW4ocXAsIE1BWF9RUCk7CisgICAgcXAgPSBzdGQ6Om1heChxcCwgTUlOX1FQKTsKKyAgICByZXR1cm4gcXA7Cit9CitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRW5jOjppbml0RW5jUGFyYW1zKCkgeworICAgIG1Db2RlY0N0eCA9IG51bGxwdHI7CisgICAgbU51bUNvcmVzID0gc3RkOjptaW4oR2V0Q1BVQ29yZUNvdW50KCksIChzaXplX3QpIENPREVDX01BWF9DT1JFUyk7CisgICAgbWVtc2V0KCZtRW5jUGFyYW1zLCAwLCBzaXplb2YoaWhldmNlX3N0YXRpY19jZmdfcGFyYW1zX3QpKTsKKworICAgIC8vIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgIElIRVZDRV9QTFVHSU5fU1RBVFVTX1QgZXJyID0gaWhldmNlX3NldF9kZWZfcGFyYW1zKCZtRW5jUGFyYW1zKTsKKyAgICBpZiAoSUhFVkNFX0VPSyAhPSBlcnIpIHsKKyAgICAgICAgQUxPR0UoIkhFVkMgZGVmYXVsdCBpbml0IGZhaWxlZCA6IDB4JXgiLCBlcnIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKyAgICBtQmZyYW1lcyA9IDA7CisgICAgaWYgKG1Hb3AgJiYgbUdvcC0+ZmxleENvdW50KCkgPiAwKSB7CisgICAgICAgIHVpbnQzMl90IHN5bmNJbnRlcnZhbCA9IDE7CisgICAgICAgIHVpbnQzMl90IGlJbnRlcnZhbCA9IDE7CisgICAgICAgIHVpbnQzMl90IG1heEJmcmFtZXMgPSAwOworICAgICAgICBQYXJzZUdvcCgqbUdvcCwgJnN5bmNJbnRlcnZhbCwgJmlJbnRlcnZhbCwgJm1heEJmcmFtZXMpOworICAgICAgICBpZiAoc3luY0ludGVydmFsID4gMCkgeworICAgICAgICAgICAgQUxPR0QoIlVwZGF0aW5nIElEUiBpbnRlcnZhbCBmcm9tIEdPUDogb2xkICV1IG5ldyAldSIsIG1JRFJJbnRlcnZhbCwgc3luY0ludGVydmFsKTsKKyAgICAgICAgICAgIG1JRFJJbnRlcnZhbCA9IHN5bmNJbnRlcnZhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaUludGVydmFsID4gMCkgeworICAgICAgICAgICAgQUxPR0QoIlVwZGF0aW5nIEkgaW50ZXJ2YWwgZnJvbSBHT1A6IG9sZCAldSBuZXcgJXUiLCBtSUludGVydmFsLCBpSW50ZXJ2YWwpOworICAgICAgICAgICAgbUlJbnRlcnZhbCA9IGlJbnRlcnZhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAobUJmcmFtZXMgIT0gbWF4QmZyYW1lcykgeworICAgICAgICAgICAgQUxPR0QoIlVwZGF0aW5nIG1heCBCIGZyYW1lcyBmcm9tIEdPUDogb2xkICV1IG5ldyAldSIsIG1CZnJhbWVzLCBtYXhCZnJhbWVzKTsKKyAgICAgICAgICAgIG1CZnJhbWVzID0gbWF4QmZyYW1lczsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyB1cGRhdGUgY29uZmlndXJhdGlvbgorICAgIG1FbmNQYXJhbXMuc19zcmNfcHJtcy5pNF93aWR0aCA9IG1TaXplLT53aWR0aDsKKyAgICBtRW5jUGFyYW1zLnNfc3JjX3BybXMuaTRfaGVpZ2h0ID0gbVNpemUtPmhlaWdodDsKKyAgICBtRW5jUGFyYW1zLnNfc3JjX3BybXMuaTRfZnJtX3JhdGVfZGVub20gPSAxMDAwOworICAgIG1FbmNQYXJhbXMuc19zcmNfcHJtcy5pNF9mcm1fcmF0ZV9udW0gPQorICAgICAgICBtRnJhbWVSYXRlLT52YWx1ZSAqIG1FbmNQYXJhbXMuc19zcmNfcHJtcy5pNF9mcm1fcmF0ZV9kZW5vbTsKKyAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uaTRfcXVhbGl0eV9wcmVzZXQgPSBJSEVWQ0VfUVVBTElUWV9QNTsKKyAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uYWk0X3RndF9iaXRyYXRlWzBdID0KKyAgICAgICAgbUJpdHJhdGUtPnZhbHVlOworICAgIG1FbmNQYXJhbXMuc190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5haTRfcGVha19iaXRyYXRlWzBdID0KKyAgICAgICAgbUJpdHJhdGUtPnZhbHVlIDw8IDE7CisgICAgbUVuY1BhcmFtcy5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmk0X2NvZGVjX2xldmVsID0gbUhldmNFbmNMZXZlbDsKKyAgICBtRW5jUGFyYW1zLnNfY29kaW5nX3Rvb2xzX3BybXMuaTRfbWF4X2lfb3Blbl9nb3BfcGVyaW9kID0gbUlEUkludGVydmFsOworICAgIG1FbmNQYXJhbXMuc19jb2RpbmdfdG9vbHNfcHJtcy5pNF9tYXhfY3JhX29wZW5fZ29wX3BlcmlvZCA9IG1JSW50ZXJ2YWw7CisgICAgbUl2VmlkZW9Db2xvckZvcm1hdCA9IElWX1lVVl80MjBQOworICAgIG1FbmNQYXJhbXMuc19tdWx0aV90aHJkX3BybXMuaTRfbWF4X251bV9jb3JlcyA9IG1OdW1Db3JlczsKKyAgICBtRW5jUGFyYW1zLnNfb3V0X3N0cm1fcHJtcy5pNF9jb2RlY19wcm9maWxlID0gbUhldmNFbmNQcm9maWxlOworICAgIG1FbmNQYXJhbXMuc19sYXBfcHJtcy5pNF9yY19sb29rX2FoZWFkX3BpY3MgPSBERUZBVUxUX1JDX0xPT0tBSEVBRDsKKyAgICBpZiAobUJmcmFtZXMgPT0gMCkgeworICAgICAgICBtRW5jUGFyYW1zLnNfY29kaW5nX3Rvb2xzX3BybXMuaTRfbWF4X3RlbXBvcmFsX2xheWVycyA9IDA7CisgICAgfSBlbHNlIGlmIChtQmZyYW1lcyA8PSAyKSB7CisgICAgICAgIG1FbmNQYXJhbXMuc19jb2RpbmdfdG9vbHNfcHJtcy5pNF9tYXhfdGVtcG9yYWxfbGF5ZXJzID0gMTsKKyAgICB9IGVsc2UgaWYgKG1CZnJhbWVzIDw9IDYpIHsKKyAgICAgICAgbUVuY1BhcmFtcy5zX2NvZGluZ190b29sc19wcm1zLmk0X21heF90ZW1wb3JhbF9sYXllcnMgPSAyOworICAgIH0gZWxzZSB7CisgICAgICAgIG1FbmNQYXJhbXMuc19jb2RpbmdfdG9vbHNfcHJtcy5pNF9tYXhfdGVtcG9yYWxfbGF5ZXJzID0gMzsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1CaXRyYXRlTW9kZS0+dmFsdWUpIHsKKyAgICAgICAgY2FzZSBDMkNvbmZpZzo6QklUUkFURV9JR05PUkU6CisgICAgICAgICAgICBtRW5jUGFyYW1zLnNfY29uZmlnX3BybXMuaTRfcmF0ZV9jb250cm9sX21vZGUgPSAzOworICAgICAgICAgICAgbUVuY1BhcmFtcy5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmFpNF9mcmFtZV9xcFswXSA9CisgICAgICAgICAgICAgICAgZ2V0UXBGcm9tUXVhbGl0eShtUXVhbGl0eS0+dmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb25maWc6OkJJVFJBVEVfQ09OU1Q6CisgICAgICAgICAgICBtRW5jUGFyYW1zLnNfY29uZmlnX3BybXMuaTRfcmF0ZV9jb250cm9sX21vZGUgPSA1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb25maWc6OkJJVFJBVEVfVkFSSUFCTEU6CisgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtRW5jUGFyYW1zLnNfY29uZmlnX3BybXMuaTRfcmF0ZV9jb250cm9sX21vZGUgPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGlmIChtQ29tcGxleGl0eS0+dmFsdWUgPT0gMTApIHsKKyAgICAgICAgbUVuY1BhcmFtcy5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmk0X3F1YWxpdHlfcHJlc2V0ID0gSUhFVkNFX1FVQUxJVFlfUDA7CisgICAgfSBlbHNlIGlmIChtQ29tcGxleGl0eS0+dmFsdWUgPj0gOCkgeworICAgICAgICBtRW5jUGFyYW1zLnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uaTRfcXVhbGl0eV9wcmVzZXQgPSBJSEVWQ0VfUVVBTElUWV9QMjsKKyAgICB9IGVsc2UgaWYgKG1Db21wbGV4aXR5LT52YWx1ZSA+PSA3KSB7CisgICAgICAgIG1FbmNQYXJhbXMuc190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5pNF9xdWFsaXR5X3ByZXNldCA9IElIRVZDRV9RVUFMSVRZX1AzOworICAgIH0gZWxzZSBpZiAobUNvbXBsZXhpdHktPnZhbHVlID49IDUpIHsKKyAgICAgICAgbUVuY1BhcmFtcy5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmk0X3F1YWxpdHlfcHJlc2V0ID0gSUhFVkNFX1FVQUxJVFlfUDQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUVuY1BhcmFtcy5zX3RndF9seXJfcHJtcy5hc190Z3RfcGFyYW1zWzBdLmk0X3F1YWxpdHlfcHJlc2V0ID0gSUhFVkNFX1FVQUxJVFlfUDU7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRW5jOjpyZWxlYXNlRW5jb2RlcigpIHsKKyAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKworICAgIGlmIChtQ29kZWNDdHgpIHsKKyAgICAgICAgSUhFVkNFX1BMVUdJTl9TVEFUVVNfVCBlcnIgPSBpaGV2Y2VfY2xvc2UobUNvZGVjQ3R4KTsKKyAgICAgICAgaWYgKElIRVZDRV9FT0sgIT0gZXJyKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICBtQ29kZWNDdHggPSBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNFbmM6OmRyYWluKHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIHsKKyAgICByZXR1cm4gZHJhaW5JbnRlcm5hbChkcmFpbk1vZGUsIHBvb2wsIG51bGxwdHIpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRW5jOjppbml0RW5jb2RlcigpIHsKKyAgICBDSEVDSyghbUNvZGVjQ3R4KTsKKworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIG1TaXplID0gbUludGYtPmdldFNpemVfbCgpOworICAgICAgICBtQml0cmF0ZU1vZGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZU1vZGVfbCgpOworICAgICAgICBtQml0cmF0ZSA9IG1JbnRmLT5nZXRCaXRyYXRlX2woKTsKKyAgICAgICAgbUZyYW1lUmF0ZSA9IG1JbnRmLT5nZXRGcmFtZVJhdGVfbCgpOworICAgICAgICBtSGV2Y0VuY1Byb2ZpbGUgPSBtSW50Zi0+Z2V0UHJvZmlsZV9sKCk7CisgICAgICAgIG1IZXZjRW5jTGV2ZWwgPSBtSW50Zi0+Z2V0TGV2ZWxfbCgpOworICAgICAgICBtSURSSW50ZXJ2YWwgPSBtSW50Zi0+Z2V0U3luY0ZyYW1lUGVyaW9kX2woKTsKKyAgICAgICAgbUlJbnRlcnZhbCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2RfbCgpOworICAgICAgICBtQ29tcGxleGl0eSA9IG1JbnRmLT5nZXRDb21wbGV4aXR5X2woKTsKKyAgICAgICAgbVF1YWxpdHkgPSBtSW50Zi0+Z2V0UXVhbGl0eV9sKCk7CisgICAgICAgIG1Hb3AgPSBtSW50Zi0+Z2V0R29wX2woKTsKKyAgICAgICAgbVJlcXVlc3RTeW5jID0gbUludGYtPmdldFJlcXVlc3RTeW5jX2woKTsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBpbml0RW5jUGFyYW1zKCk7CisKKyAgICBpZiAoQzJfT0sgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIHBhcmFtcyA6IDB4JXgiLCBzdGF0dXMpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIElIRVZDRV9QTFVHSU5fU1RBVFVTX1QgZXJyID0gSUhFVkNFX0VPSzsKKyAgICBlcnIgPSBpaGV2Y2VfaW5pdCgmbUVuY1BhcmFtcywgJm1Db2RlY0N0eCk7CisgICAgaWYgKElIRVZDRV9FT0sgIT0gZXJyKSB7CisgICAgICAgIEFMT0dFKCJIRVZDIGVuY29kZXIgaW5pdCBmYWlsZWQgOiAweCV4IiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBtU3RhcnRlZCA9IHRydWU7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRIZXZjRW5jOjpzZXRFbmNvZGVBcmdzKGloZXZjZV9pbnBfYnVmX3QqIHBzX2VuY29kZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyogY29uc3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHdvcmtJbmRleCkgeworICAgIGloZXZjZV9zdGF0aWNfY2ZnX3BhcmFtc190KiBwYXJhbXMgPSAmbUVuY1BhcmFtczsKKyAgICBtZW1zZXQocHNfZW5jb2RlX2lwLCAwLCBzaXplb2YoKnBzX2VuY29kZV9pcCkpOworCisgICAgaWYgKCFpbnB1dCkgeworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgaWYgKGlucHV0LT53aWR0aCgpIDwgbVNpemUtPndpZHRoIHx8CisgICAgICAgIGlucHV0LT5oZWlnaHQoKSA8IG1TaXplLT5oZWlnaHQpIHsKKyAgICAgICAgLyogRXhwZWN0IHdpZHRoIGhlaWdodCB0byBiZSBjb25maWd1cmVkICovCisgICAgICAgIEFMT0dXKCJ1bmV4cGVjdGVkIENhcGFjaXR5IEFzcGVjdCAlZCglZCkgeCAlZCglZCkiLCBpbnB1dC0+d2lkdGgoKSwKKyAgICAgICAgICAgICAgbVNpemUtPndpZHRoLCBpbnB1dC0+aGVpZ2h0KCksIG1TaXplLT5oZWlnaHQpOworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0JiBsYXlvdXQgPSBpbnB1dC0+bGF5b3V0KCk7CisgICAgdWludDhfdCogeVBsYW5lID0KKyAgICAgICAgY29uc3RfY2FzdDx1aW50OF90ICo+KGlucHV0LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldKTsKKyAgICB1aW50OF90KiB1UGxhbmUgPQorICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oaW5wdXQtPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVV0pOworICAgIHVpbnQ4X3QqIHZQbGFuZSA9CisgICAgICAgIGNvbnN0X2Nhc3Q8dWludDhfdCAqPihpbnB1dC0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXSk7CisgICAgaW50MzJfdCB5U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV0ucm93SW5jOworICAgIGludDMyX3QgdVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLnJvd0luYzsKKyAgICBpbnQzMl90IHZTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXS5yb3dJbmM7CisKKyAgICBjb25zdCB1aW50MzJfdCB3aWR0aCA9IG1TaXplLT53aWR0aDsKKyAgICBjb25zdCB1aW50MzJfdCBoZWlnaHQgPSBtU2l6ZS0+aGVpZ2h0OworCisgICAgLy8gd2lkdGggYW5kIGhlaWdodCBtdXN0IGJlIGV2ZW4KKyAgICBpZiAod2lkdGggJiAxdSB8fCBoZWlnaHQgJiAxdSkgeworICAgICAgICBBTE9HVygiaGVpZ2h0KCV1KSBhbmQgd2lkdGgoJXUpIG11c3QgYm90aCBiZSBldmVuIiwgaGVpZ2h0LCB3aWR0aCk7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgc2l6ZV90IHlQbGFuZVNpemUgPSB3aWR0aCAqIGhlaWdodDsKKworICAgIHN3aXRjaCAobGF5b3V0LnR5cGUpIHsKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0I6CisgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCQTogeworICAgICAgICAgICAgTWVtb3J5QmxvY2sgY29udmVyc2lvbkJ1ZmZlciA9CisgICAgICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzLmZldGNoKHlQbGFuZVNpemUgKiAzIC8gMik7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lbXBsYWNlKGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgICAgIHlQbGFuZSA9IGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgdVBsYW5lID0geVBsYW5lICsgeVBsYW5lU2l6ZTsKKyAgICAgICAgICAgIHZQbGFuZSA9IHVQbGFuZSArIHlQbGFuZVNpemUgLyA0OworICAgICAgICAgICAgeVN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgdVN0cmlkZSA9IHZTdHJpZGUgPSB5U3RyaWRlIC8gMjsKKyAgICAgICAgICAgIENvbnZlcnRSR0JUb1BsYW5hcllVVih5UGxhbmUsIHlTdHJpZGUsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJzaW9uQnVmZmVyLnNpemUoKSwgKmlucHV0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOiB7CisgICAgICAgICAgICBpZiAoIUlzWVVWNDIwKCppbnB1dCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiaW5wdXQgaXMgbm90IFlVVjQyMCIpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5jb2xJbmMgPT0gMSAmJgorICAgICAgICAgICAgICAgIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmNvbEluYyA9PSAxICYmCisgICAgICAgICAgICAgICAgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY29sSW5jID09IDEgJiYKKyAgICAgICAgICAgICAgICB1U3RyaWRlID09IHZTdHJpZGUgJiYgeVN0cmlkZSA9PSAyICogdlN0cmlkZSkgeworICAgICAgICAgICAgICAgIC8vIEk0MjAgY29tcGF0aWJsZSAtIGFscmVhZHkgc2V0IHVwIGFib3ZlCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGNvcHkgdG8gSTQyMAorICAgICAgICAgICAgeVN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgdVN0cmlkZSA9IHZTdHJpZGUgPSB5U3RyaWRlIC8gMjsKKyAgICAgICAgICAgIE1lbW9yeUJsb2NrIGNvbnZlcnNpb25CdWZmZXIgPQorICAgICAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVycy5mZXRjaCh5UGxhbmVTaXplICogMyAvIDIpOworICAgICAgICAgICAgbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2UuZW1wbGFjZShjb252ZXJzaW9uQnVmZmVyLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgICAgICBNZWRpYUltYWdlMiBpbWcgPQorICAgICAgICAgICAgICAgIENyZWF0ZVlVVjQyMFBsYW5hck1lZGlhSW1hZ2UyKHdpZHRoLCBoZWlnaHQsIHlTdHJpZGUsIGhlaWdodCk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJbWFnZUNvcHkoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksICZpbWcsICppbnB1dCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkJ1ZmZlciBjb252ZXJzaW9uIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB5UGxhbmUgPSBjb252ZXJzaW9uQnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIHVQbGFuZSA9IHlQbGFuZSArIHlQbGFuZVNpemU7CisgICAgICAgICAgICB2UGxhbmUgPSB1UGxhbmUgKyB5UGxhbmVTaXplIC8gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVZBOgorICAgICAgICAgICAgQUxPR0UoIllVVkEgcGxhbmUgdHlwZSBpcyBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5yZWNvZ25pemVkIHBsYW5lIHR5cGU6ICVkIiwgbGF5b3V0LnR5cGUpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1JdlZpZGVvQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIwUDogeworICAgICAgICAgICAgLy8gaW5wdXQgYnVmZmVyIGlzIHN1cHBvc2VkIHRvIGJlIGNvbnN0IGJ1dCBJdHRpYW0gQVBJIHdhbnRzIGJhcmUKKyAgICAgICAgICAgIC8vIHBvaW50ZXIuCisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFwdl9pbnBfcGxhbmVzWzBdID0geVBsYW5lOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5hcHZfaW5wX3BsYW5lc1sxXSA9IHVQbGFuZTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YXB2X2lucF9wbGFuZXNbMl0gPSB2UGxhbmU7CisKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zdHJkWzBdID0geVN0cmlkZTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zdHJkWzFdID0gdVN0cmlkZTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zdHJkWzJdID0gdlN0cmlkZTsKKworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3NpemVbMF0gPSB5U3RyaWRlICogaGVpZ2h0OworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3NpemVbMV0gPSB1U3RyaWRlICogaGVpZ2h0ID4+IDE7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc2l6ZVsyXSA9IHZTdHJpZGUgKiBoZWlnaHQgPj4gMTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBJVl9ZVVZfNDIySUxFOiB7CisgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSVZfWVVWXzQyMFNQX1VWOgorICAgICAgICBjYXNlIElWX1lVVl80MjBTUF9WVToKKyAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5hcHZfaW5wX3BsYW5lc1swXSA9IHlQbGFuZTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YXB2X2lucF9wbGFuZXNbMV0gPSB1UGxhbmU7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFwdl9pbnBfcGxhbmVzWzJdID0gbnVsbHB0cjsKKworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3N0cmRbMF0gPSB5U3RyaWRlOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3N0cmRbMV0gPSB1U3RyaWRlOworICAgICAgICAgICAgcHNfZW5jb2RlX2lwLT5haTRfaW5wX3N0cmRbMl0gPSAwOworCisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc2l6ZVswXSA9IHlTdHJpZGUgKiBoZWlnaHQ7CisgICAgICAgICAgICBwc19lbmNvZGVfaXAtPmFpNF9pbnBfc2l6ZVsxXSA9IHVTdHJpZGUgKiBoZWlnaHQgPj4gMTsKKyAgICAgICAgICAgIHBzX2VuY29kZV9pcC0+YWk0X2lucF9zaXplWzJdID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcHNfZW5jb2RlX2lwLT5pNF9jdXJyX2JpdHJhdGUgPQorICAgICAgICBwYXJhbXMtPnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uYWk0X3RndF9iaXRyYXRlWzBdOworICAgIHBzX2VuY29kZV9pcC0+aTRfY3Vycl9wZWFrX2JpdHJhdGUgPQorICAgICAgICBwYXJhbXMtPnNfdGd0X2x5cl9wcm1zLmFzX3RndF9wYXJhbXNbMF0uYWk0X3BlYWtfYml0cmF0ZVswXTsKKyAgICBwc19lbmNvZGVfaXAtPmk0X2N1cnJfcmF0ZV9mYWN0b3IgPSBwYXJhbXMtPnNfY29uZmlnX3BybXMuaTRfcmF0ZV9mYWN0b3I7CisgICAgcHNfZW5jb2RlX2lwLT51OF9wdHMgPSB3b3JrSW5kZXg7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdEhldmNFbmM6OmZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaGV2Y2Vfb3V0X2J1Zl90KiBwc19lbmNvZGVfb3ApIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICBwb29sLT5mZXRjaExpbmVhckJsb2NrKHBzX2VuY29kZV9vcC0+aTRfYnl0ZXNfZ2VuZXJhdGVkLCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoQzJfT0sgIT0gc3RhdHVzKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzIDB4JXgiLCBzdGF0dXMpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBzdGF0dXM7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKEMyX09LICE9IHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCB3aXRoIHN0YXR1cyAweCV4Iiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHdWaWV3LmVycm9yKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWVtY3B5KHdWaWV3LmRhdGEoKSwgcHNfZW5jb2RlX29wLT5wdTFfb3V0cHV0X2J1ZiwKKyAgICAgICAgICAgcHNfZW5jb2RlX29wLT5pNF9ieXRlc19nZW5lcmF0ZWQpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPQorICAgICAgICBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIDAsIHBzX2VuY29kZV9vcC0+aTRfYnl0ZXNfZ2VuZXJhdGVkKTsKKworICAgIERVTVBfVE9fRklMRShtT3V0RmlsZSwgcHNfZW5jb2RlX29wLT5wdTFfb3V0cHV0X2J1ZiwKKyAgICAgICAgICAgICAgICAgcHNfZW5jb2RlX29wLT5pNF9ieXRlc19nZW5lcmF0ZWQpOworCisgICAgaWYgKHBzX2VuY29kZV9vcC0+aTRfaXNfa2V5X2ZyYW1lKSB7CisgICAgICAgIEFMT0dWKCJJRFIgZnJhbWUgcHJvZHVjZWQiKTsKKyAgICAgICAgYnVmZmVyLT5zZXRJbmZvKHN0ZDo6bWFrZV9zaGFyZWQ8QzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgMHUgLyogc3RyZWFtIGlkICovLCBDMkNvbmZpZzo6U1lOQ19GUkFNRSkpOworICAgIH0KKworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgZmlsbFdvcmsod29yayk7CisgICAgICAgIGlmIChtU2lnbmFsbGVkRW9zKSB7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPQorICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2goaW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdEhldmNFbmM6OmRyYWluSW50ZXJuYWwoCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpaGV2Y2Vfb3V0X2J1Zl90IHNfZW5jb2RlX29we307CisgICAgICAgIG1lbXNldCgmc19lbmNvZGVfb3AsIDAsIHNpemVvZihzX2VuY29kZV9vcCkpOworCisgICAgICAgIGloZXZjZV9lbmNvZGUobUNvZGVjQ3R4LCBudWxscHRyLCAmc19lbmNvZGVfb3ApOworICAgICAgICBpZiAoc19lbmNvZGVfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkKSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZW5jb2RlX29wLnU4X3B0cywgd29yaywgcG9vbCwgJnNfZW5jb2RlX29wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCAhPSAxdSkgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRIZXZjRW5jOjpwcm9jZXNzKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIEFMT0dEKCJTaWduYWxsZWQgRXJyb3IgLyBTaWduYWxsZWQgRW9zIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQzJfT0s7CisKKyAgICAvLyBJbml0aWFsaXplIGVuY29kZXIgaWYgbm90IGFscmVhZHkgaW5pdGlhbGl6ZWQKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHN0YXR1cyA9IGluaXRFbmNvZGVyKCk7CisgICAgICAgIGlmIChDMl9PSyAhPSBzdGF0dXMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIDogMHgleCIsIHN0YXR1cyk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gc3RhdHVzOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiB2aWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gaW5wdXRCdWZmZXIgPSBudWxscHRyOworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIGlmIChlb3MpIG1TaWduYWxsZWRFb3MgPSB0cnVlOworCisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgaW5wdXRCdWZmZXIgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdOworICAgICAgICB2aWV3ID0gc3RkOjptYWtlX3NoYXJlZDxjb25zdCBDMkdyYXBoaWNWaWV3PigKKyAgICAgICAgICAgIGlucHV0QnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkpOworICAgICAgICBpZiAodmlldy0+ZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZXJyID0gJWQiLCB2aWV3LT5lcnJvcigpKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIElIRVZDRV9QTFVHSU5fU1RBVFVTX1QgZXJyID0gSUhFVkNFX0VPSzsKKworICAgIGlmICghbVNwc1Bwc0hlYWRlclJlY2VpdmVkKSB7CisgICAgICAgIGloZXZjZV9vdXRfYnVmX3Qgc19oZWFkZXJfb3B7fTsKKyAgICAgICAgZXJyID0gaWhldmNlX2VuY29kZV9oZWFkZXIobUNvZGVjQ3R4LCAmc19oZWFkZXJfb3ApOworICAgICAgICBpZiAoZXJyID09IElIRVZDRV9FT0sgJiYgc19oZWFkZXJfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gY3NkID0KKyAgICAgICAgICAgICAgICBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgKKyAgICAgICAgICAgICAgICAgICAgc19oZWFkZXJfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkLCAwdSk7CisgICAgICAgICAgICBpZiAoIWNzZCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDU0QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShjc2QtPm0udmFsdWUsIHNfaGVhZGVyX29wLnB1MV9vdXRwdXRfYnVmLAorICAgICAgICAgICAgICAgICAgIHNfaGVhZGVyX29wLmk0X2J5dGVzX2dlbmVyYXRlZCk7CisgICAgICAgICAgICBEVU1QX1RPX0ZJTEUobU91dEZpbGUsIGNzZC0+bS52YWx1ZSwgY3NkLT5mbGV4Q291bnQoKSk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoY3NkKSk7CisgICAgICAgICAgICBtU3BzUHBzSGVhZGVyUmVjZWl2ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmICghaW5wdXRCdWZmZXIpIHsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBoYW5kbGUgZHluYW1pYyBiaXRyYXRlIGNoYW5nZQorICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IGJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisKKyAgICAgICAgaWYgKGJpdHJhdGUgIT0gbUJpdHJhdGUpIHsKKyAgICAgICAgICAgIG1CaXRyYXRlID0gYml0cmF0ZTsKKyAgICAgICAgICAgIG1FbmNQYXJhbXMuc190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5haTRfdGd0X2JpdHJhdGVbMF0gPQorICAgICAgICAgICAgICAgIG1CaXRyYXRlLT52YWx1ZTsKKyAgICAgICAgICAgIG1FbmNQYXJhbXMuc190Z3RfbHlyX3BybXMuYXNfdGd0X3BhcmFtc1swXS5haTRfcGVha19iaXRyYXRlWzBdID0KKyAgICAgICAgICAgICAgICBtQml0cmF0ZS0+dmFsdWUgPDwgMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGloZXZjZV9pbnBfYnVmX3Qgc19lbmNvZGVfaXB7fTsKKyAgICBpaGV2Y2Vfb3V0X2J1Zl90IHNfZW5jb2RlX29we307CisgICAgdWludDY0X3Qgd29ya0luZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1bGwoKTsKKworICAgIHN0YXR1cyA9IHNldEVuY29kZUFyZ3MoJnNfZW5jb2RlX2lwLCB2aWV3LmdldCgpLCB3b3JrSW5kZXgpOworICAgIGlmIChDMl9PSyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoInNldEVuY29kZUFyZ3MgZmFpbGVkIDogMHgleCIsIHN0YXR1cyk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHN0YXR1czsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBoYW5kbGUgcmVxdWVzdCBrZXkgZnJhbWUKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IHJlcXVlc3RTeW5jOworICAgICAgICByZXF1ZXN0U3luYyA9IG1JbnRmLT5nZXRSZXF1ZXN0U3luY19sKCk7CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisgICAgICAgIGlmIChyZXF1ZXN0U3luYyAhPSBtUmVxdWVzdFN5bmMpIHsKKyAgICAgICAgICAgIC8vIHdlIGNhbiBoYW5kbGUgSURSIGltbWVkaWF0ZWx5CisgICAgICAgICAgICBpZiAocmVxdWVzdFN5bmMtPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgLy8gdW5zZXQgcmVxdWVzdAorICAgICAgICAgICAgICAgIEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0IGNsZWFyU3luYygwdSwgQzJfRkFMU0UpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsgJmNsZWFyU3luYyB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkdvdCBzeW5jIHJlcXVlc3QiKTsKKyAgICAgICAgICAgICAgICAvL0ZvcmNlIHRoaXMgYXMgYW4gSURSIGZyYW1lCisgICAgICAgICAgICAgICAgc19lbmNvZGVfaXAuaTRfZm9yY2VfaWRyX2ZsYWcgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVJlcXVlc3RTeW5jID0gcmVxdWVzdFN5bmM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1aW50NjRfdCB0aW1lRGVsYXkgPSAwOworICAgIHVpbnQ2NF90IHRpbWVUYWtlbiA9IDA7CisgICAgbWVtc2V0KCZzX2VuY29kZV9vcCwgMCwgc2l6ZW9mKHNfZW5jb2RlX29wKSk7CisgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCB0aW1lRGVsYXkpOworCisgICAgaWYgKGlucHV0QnVmZmVyKSB7CisgICAgICAgIGVyciA9IGloZXZjZV9lbmNvZGUobUNvZGVjQ3R4LCAmc19lbmNvZGVfaXAsICZzX2VuY29kZV9vcCk7CisgICAgICAgIGlmIChJSEVWQ0VfRU9LICE9IGVycikgeworICAgICAgICAgICAgQUxPR0UoIkVuY29kZSBGcmFtZSBmYWlsZWQgOiAweCV4IiwgZXJyKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICghZW9zKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorCisgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOworICAgIC8qIENvbXB1dGUgdGltZSB0YWtlbiBmb3IgZGVjb2RlKCkgKi8KKyAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIHRpbWVUYWtlbik7CisKKyAgICBBTE9HVigidGltZVRha2VuPSU2ZCBkZWxheT0lNmQgbnVtQnl0ZXM9JTZkIiwgKGludCl0aW1lVGFrZW4sCisgICAgICAgICAgKGludCl0aW1lRGVsYXksIHNfZW5jb2RlX29wLmk0X2J5dGVzX2dlbmVyYXRlZCk7CisKKyAgICBpZiAoc19lbmNvZGVfb3AuaTRfYnl0ZXNfZ2VuZXJhdGVkKSB7CisgICAgICAgIGZpbmlzaFdvcmsoc19lbmNvZGVfb3AudThfcHRzLCB3b3JrLCBwb29sLCAmc19lbmNvZGVfb3ApOworICAgIH0KKworICAgIGlmIChlb3MpIHsKKyAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfV0lUSF9FT1MsIHBvb2wsIHdvcmspOworICAgIH0KK30KKworY2xhc3MgQzJTb2Z0SGV2Y0VuY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKKyAgIHB1YmxpYzoKKyAgICBDMlNvZnRIZXZjRW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0SGV2Y0VuYygKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRIZXZjRW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0SGV2Y0VuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdEhldmNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIH5DMlNvZnRIZXZjRW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0SGV2Y0VuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9oZXZjL0MyU29mdEhldmNFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWE0NjAyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvaGV2Yy9DMlNvZnRIZXZjRW5jLmgKQEAgLTAsMCArMSwxNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX0hFVkNfRU5DX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9IRVZDX0VOQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSAiaWhldmNfdHlwZWRlZnMuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKiogR2V0IHRpbWUgKi8KKyNkZWZpbmUgR0VUVElNRShhLCBiKSBnZXR0aW1lb2ZkYXkoYSwgYikKKworLyoqIENvbXB1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgKi8KKyNkZWZpbmUgVElNRV9ESUZGKHN0YXJ0LCBlbmQsIGRpZmYpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkaWZmID0gKCgoZW5kKS50dl9zZWMgLSAoc3RhcnQpLnR2X3NlYykgKiAxMDAwMDAwKSArIFwKKyAgICAgICAgICAgKChlbmQpLnR2X3VzZWMgLSAoc3RhcnQpLnR2X3VzZWMpOworCisjZGVmaW5lIENPREVDX01BWF9DT1JFUyAgNAorI2RlZmluZSBNQVhfQl9GUkFNRVMgICAgIDEKKyNkZWZpbmUgTUFYX1JDX0xPT0tBSEVBRCAxCisKKyNkZWZpbmUgREVGQVVMVF9CX0ZSQU1FUyAgICAgMAorI2RlZmluZSBERUZBVUxUX1JDX0xPT0tBSEVBRCAwCisKK3N0cnVjdCBDMlNvZnRIZXZjRW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdEhldmNFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2Vzcyhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4odWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIG92ZXJyaWRlOworCisgICBwcm90ZWN0ZWQ6CisgICAgfkMyU29mdEhldmNFbmMoKSBvdmVycmlkZTsKKworICAgcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+IG1JbnRmOworICAgIGloZXZjZV9zdGF0aWNfY2ZnX3BhcmFtc190IG1FbmNQYXJhbXM7CisgICAgc2l6ZV90IG1OdW1Db3JlczsKKyAgICBVV09SRDMyIG1JRFJJbnRlcnZhbDsKKyAgICBVV09SRDMyIG1JSW50ZXJ2YWw7CisgICAgVVdPUkQzMiBtQmZyYW1lczsKKyAgICBJVl9DT0xPUl9GT1JNQVRfVCBtSXZWaWRlb0NvbG9yRm9ybWF0OworICAgIFVXT1JEMzIgbUhldmNFbmNQcm9maWxlOworICAgIFVXT1JEMzIgbUhldmNFbmNMZXZlbDsKKyAgICBib29sIG1TdGFydGVkOworICAgIGJvb2wgbVNwc1Bwc0hlYWRlclJlY2VpdmVkOworICAgIGJvb2wgbVNpZ25hbGxlZEVvczsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICB2b2lkKiBtQ29kZWNDdHg7CisgICAgTWVtb3J5QmxvY2tQb29sIG1Db252ZXJzaW9uQnVmZmVyczsKKyAgICBzdGQ6Om1hcDx2b2lkKiwgTWVtb3J5QmxvY2s+IG1Db252ZXJzaW9uQnVmZmVyc0luVXNlOworICAgIC8vIGNvbmZpZ3VyYXRpb25zIHVzZWQgYnkgY29tcG9uZW50IGluIHByb2Nlc3MKKyAgICAvLyAoVE9ETzoga2VlcCB0aGlzIGluIGludGYgYnV0IG1ha2UgdGhlbSBpbnRlcm5hbCBvbmx5KQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlTW9kZVR1bmluZzo6b3V0cHV0PiBtQml0cmF0ZU1vZGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29tcGxleGl0eVR1bmluZzo6b3V0cHV0PiBtQ29tcGxleGl0eTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1RdWFsaXR5VHVuaW5nOjpvdXRwdXQ+IG1RdWFsaXR5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUdvcFR1bmluZzo6b3V0cHV0PiBtR29wOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICBjaGFyIG1JbkZpbGVbMjAwXTsKKyAgICBjaGFyIG1PdXRGaWxlWzIwMF07CisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCisgICAgLy8gcHJvZmlsZQorICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lU3RhcnQ7CisgICAgc3RydWN0IHRpbWV2YWwgbVRpbWVFbmQ7CisKKyAgICBjMl9zdGF0dXNfdCBpbml0RW5jUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKyAgICBjMl9zdGF0dXNfdCByZWxlYXNlRW5jb2RlcigpOworICAgIGMyX3N0YXR1c190IHNldEVuY29kZUFyZ3MoaWhldmNlX2lucF9idWZfdCogcHNfZW5jb2RlX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyogY29uc3QgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB3b3JrSW5kZXgpOworICAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wsCisgICAgICAgICAgICAgICAgICAgIGloZXZjZV9vdXRfYnVmX3QqIHBzX2VuY29kZV9vcCk7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbCh1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspOworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdEhldmNFbmMpOworfTsKKyNpZmRlZiBGSUxFX0RVTVBfRU5BQkxFCisKKyNkZWZpbmUgSU5QVVRfRFVNUF9QQVRIICIvZGF0YS9sb2NhbC90bXAvaGV2YyIKKyNkZWZpbmUgSU5QVVRfRFVNUF9FWFQgInl1diIKKyNkZWZpbmUgT1VUUFVUX0RVTVBfUEFUSCAiL2RhdGEvbG9jYWwvdG1wL2hldmMiCisjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVCAiaDI2NSIKKyNkZWZpbmUgR0VORVJBVEVfRklMRV9OQU1FUygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgR0VUVElNRSgmbVRpbWVTdGFydCwgTlVMTCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdHJjcHkobUluRmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEFMT0dEKCJHRU5FUkFURV9GSUxFX05BTUVTIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3ByaW50ZihtSW5GaWxlLCAiJXNfJWxkLiVsZC4lcyIsIElOUFVUX0RVTVBfUEFUSCwgbVRpbWVTdGFydC50dl9zZWMsIFwKKyAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfdXNlYywgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0cmNweShtT3V0RmlsZSwgIiIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3ByaW50ZihtT3V0RmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBPVVRQVVRfRFVNUF9QQVRILCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG1UaW1lU3RhcnQudHZfc2VjLCBtVGltZVN0YXJ0LnR2X3VzZWMsIE9VVFBVVF9EVU1QX0VYVCk7ICAgICAgXAorfQorCisjZGVmaW5lIENSRUFURV9EVU1QX0ZJTEUobV9maWxlbmFtZSkgICAgICAgICAgICAgICAgIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEZJTEUqIGZwID0gZm9wZW4obV9maWxlbmFtZSwgIndiIik7ICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIk9wZW5lZCBmaWxlICVzIiwgbV9maWxlbmFtZSk7ICAgICAgICAgXAorICAgICAgICBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKSAgICAgICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRklMRSogZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAiYWIiKTsgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKGZwICE9IE5VTEwgJiYgbV9idWYgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJEdW1wIHRvIGZpbGUhIik7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGkgPSBmd3JpdGUobV9idWYsIDEsIG1fc2l6ZSwgZnApOyAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChpICE9IChpbnQpbV9zaXplKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBTE9HRCgiRXJyb3IgaW4gZndyaXRlLCByZXR1cm5lZCAlZCIsIGkpOyAgICBcCisgICAgICAgICAgICBwZXJyb3IoIkVycm9yIGluIHdyaXRlIHRvIGZpbGUiKTsgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSAlcyIsIG1fZmlsZW5hbWUpOyBcCisgICAgICAgIGlmIChmcCAhPSBOVUxMKSBmY2xvc2UoZnApOyAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZWxzZSAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisjZGVmaW5lIElOUFVUX0RVTVBfUEFUSAorI2RlZmluZSBJTlBVVF9EVU1QX0VYVAorI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRICisjZGVmaW5lIE9VVFBVVF9EVU1QX0VYVAorI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkKKyNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKQorI2RlZmluZSBEVU1QX1RPX0ZJTEUobV9maWxlbmFtZSwgbV9idWYsIG1fc2l6ZSkKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQzJfU09GVF9IRVZDX0VOQ19IX18KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY2NjVlZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTEgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfbXAzZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRNcDNEZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tcDNkZWMiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhN2UzZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9DMlNvZnRNcDNEZWMuY3BwCkBAIC0wLDAgKzEsNTUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRNcDNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bnVtZXJpYz4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRNcDNEZWMuaCIKKyNpbmNsdWRlICJwdm1wM2RlY29kZXJfYXBpLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm1wMy5kZWNvZGVyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEMyU29mdE1QMzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRykgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7CisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKAorICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5vbmVPZih7ODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwKKyAgICAgICAgICAgICAgICAgICAgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDIpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgMil9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgMzIwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7Cit9OworCitDMlNvZnRNUDM6OkMyU29mdE1QMyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCksCisgICAgICBtQ29uZmlnKG51bGxwdHIpLAorICAgICAgbURlY29kZXJCdWYobnVsbHB0cikgeworfQorCitDMlNvZnRNUDM6On5DMlNvZnRNUDMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1QMzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfTk9fTUVNT1JZOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNUDM6Om9uU3RvcCgpIHsKKyAgICAvLyBNYWtlIHN1cmUgdGhhdCB0aGUgbmV4dCBidWZmZXIgb3V0cHV0IGRvZXMgbm90IHN0aWxsCisgICAgLy8gZGVwZW5kIG9uIGZyYWdtZW50cyBmcm9tIHRoZSBsYXN0IG9uZSBkZWNvZGVkLgorICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1BbmNob3JUaW1lU3RhbXAgPSAwOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzID0gMDsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNUDM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7Cit9CisKK3ZvaWQgQzJTb2Z0TVAzOjpvblJlbGVhc2UoKSB7CisgICAgbUdhcGxlc3NCeXRlcyA9IGZhbHNlOworICAgIGlmIChtRGVjb2RlckJ1ZikgeworICAgICAgICBmcmVlKG1EZWNvZGVyQnVmKTsKKyAgICAgICAgbURlY29kZXJCdWYgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtQ29uZmlnKSB7CisgICAgICAgIGRlbGV0ZSBtQ29uZmlnOworICAgICAgICBtQ29uZmlnID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyU29mdE1QMzo6aW5pdERlY29kZXIoKSB7CisgICAgbUNvbmZpZyA9IG5ldyB0UFZNUDNEZWNvZGVyRXh0ZXJuYWx7fTsKKyAgICBpZiAoIW1Db25maWcpIHJldHVybiBOT19NRU1PUlk7CisgICAgbUNvbmZpZy0+ZXF1YWxpemVyVHlwZSA9IGZsYXQ7CisgICAgbUNvbmZpZy0+Y3JjRW5hYmxlZCA9IGZhbHNlOworCisgICAgc2l6ZV90IG1lbVJlcXVpcmVtZW50cyA9IHB2bXAzX2RlY29kZXJNZW1SZXF1aXJlbWVudHMoKTsKKyAgICBtRGVjb2RlckJ1ZiA9IG1hbGxvYyhtZW1SZXF1aXJlbWVudHMpOworICAgIGlmICghbURlY29kZXJCdWYpIHJldHVybiBOT19NRU1PUlk7CisKKyAgICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1Zik7CisKKyAgICBtSXNGaXJzdCA9IHRydWU7CisgICAgbUdhcGxlc3NCeXRlcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDA7CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8qIFRoZSBiZWxvdyBjb2RlIGlzIGJvcnJvd2VkIGZyb20gLi90ZXN0L21wM3JlYWRlci5jcHAgKi8KK3N0YXRpYyBib29sIHBhcnNlTXAzSGVhZGVyKHVpbnQzMl90IGhlYWRlciwgc2l6ZV90ICpmcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9zYW1wbGluZ19yYXRlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfY2hhbm5lbHMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9iaXRyYXRlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfbnVtX3NhbXBsZXMgPSBudWxscHRyKSB7CisgICAgKmZyYW1lX3NpemUgPSAwOworICAgIGlmIChvdXRfc2FtcGxpbmdfcmF0ZSkgKm91dF9zYW1wbGluZ19yYXRlID0gMDsKKyAgICBpZiAob3V0X2NoYW5uZWxzKSAqb3V0X2NoYW5uZWxzID0gMDsKKyAgICBpZiAob3V0X2JpdHJhdGUpICpvdXRfYml0cmF0ZSA9IDA7CisgICAgaWYgKG91dF9udW1fc2FtcGxlcykgKm91dF9udW1fc2FtcGxlcyA9IDExNTI7CisKKyAgICBpZiAoKGhlYWRlciAmIDB4ZmZlMDAwMDApICE9IDB4ZmZlMDAwMDApIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIHZlcnNpb24gPSAoaGVhZGVyID4+IDE5KSAmIDM7CisgICAgaWYgKHZlcnNpb24gPT0gMHgwMSkgcmV0dXJuIGZhbHNlOworCisgICAgdW5zaWduZWQgbGF5ZXIgPSAoaGVhZGVyID4+IDE3KSAmIDM7CisgICAgaWYgKGxheWVyID09IDB4MDApIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIGJpdHJhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEyKSAmIDB4MGY7CisgICAgaWYgKGJpdHJhdGVfaW5kZXggPT0gMCB8fCBiaXRyYXRlX2luZGV4ID09IDB4MGYpIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIHNhbXBsaW5nX3JhdGVfaW5kZXggPSAoaGVhZGVyID4+IDEwKSAmIDM7CisgICAgaWYgKHNhbXBsaW5nX3JhdGVfaW5kZXggPT0gMykgcmV0dXJuIGZhbHNlOworCisgICAgc3RhdGljIGNvbnN0IGludCBrU2FtcGxpbmdSYXRlVjFbXSA9IHsgNDQxMDAsIDQ4MDAwLCAzMjAwMCB9OworICAgIGludCBzYW1wbGluZ19yYXRlID0ga1NhbXBsaW5nUmF0ZVYxW3NhbXBsaW5nX3JhdGVfaW5kZXhdOworICAgIGlmICh2ZXJzaW9uID09IDIgLyogVjIgKi8pIHsKKyAgICAgICAgc2FtcGxpbmdfcmF0ZSAvPSAyOworICAgIH0gZWxzZSBpZiAodmVyc2lvbiA9PSAwIC8qIFYyLjUgKi8pIHsKKyAgICAgICAgc2FtcGxpbmdfcmF0ZSAvPSA0OworICAgIH0KKworICAgIHVuc2lnbmVkIHBhZGRpbmcgPSAoaGVhZGVyID4+IDkpICYgMTsKKworICAgIGlmIChsYXllciA9PSAzKSB7IC8vIGxheWVyIEkKKyAgICAgICAgc3RhdGljIGNvbnN0IGludCBrQml0cmF0ZVYxW10gPQorICAgICAgICB7CisgICAgICAgICAgICAzMiwgNjQsIDk2LCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMjg4LCAzMjAsIDM1MiwgMzg0LCA0MTYsIDQ0OAorICAgICAgICB9OworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjJbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIDMyLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNDQsIDE2MCwgMTc2LCAxOTIsIDIyNCwgMjU2CisgICAgICAgIH07CisKKyAgICAgICAgaW50IGJpdHJhdGUgPSAodmVyc2lvbiA9PSAzIC8qIFYxICovKSA/IGtCaXRyYXRlVjFbYml0cmF0ZV9pbmRleCAtIDFdIDoKKyAgICAgICAgICAgICAgICBrQml0cmF0ZVYyW2JpdHJhdGVfaW5kZXggLSAxXTsKKworICAgICAgICBpZiAob3V0X2JpdHJhdGUpIHsKKyAgICAgICAgICAgICpvdXRfYml0cmF0ZSA9IGJpdHJhdGU7CisgICAgICAgIH0KKyAgICAgICAgKmZyYW1lX3NpemUgPSAoMTIwMDAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmcpICogNDsKKyAgICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAgICAgKm91dF9udW1fc2FtcGxlcyA9IDM4NDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIGxheWVyIElJIG9yIElJSQorICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFMMltdID0KKyAgICAgICAgeworICAgICAgICAgICAgMzIsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE2MCwgMTkyLCAyMjQsIDI1NiwgMzIwLCAzODQKKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCaXRyYXRlVjFMM1tdID0KKyAgICAgICAgeworICAgICAgICAgICAgMzIsIDQwLCA0OCwgNTYsIDY0LCA4MCwgOTYsIDExMiwgMTI4LCAxNjAsIDE5MiwgMjI0LCAyNTYsIDMyMAorICAgICAgICB9OworCisgICAgICAgIHN0YXRpYyBjb25zdCBpbnQga0JpdHJhdGVWMltdID0KKyAgICAgICAgeworICAgICAgICAgICAgOCwgMTYsIDI0LCAzMiwgNDAsIDQ4LCA1NiwgNjQsIDgwLCA5NiwgMTEyLCAxMjgsIDE0NCwgMTYwCisgICAgICAgIH07CisKKyAgICAgICAgaW50IGJpdHJhdGU7CisgICAgICAgIGlmICh2ZXJzaW9uID09IDMgLyogVjEgKi8pIHsKKyAgICAgICAgICAgIGJpdHJhdGUgPSAobGF5ZXIgPT0gMiAvKiBMMiAqLykgPyBrQml0cmF0ZVYxTDJbYml0cmF0ZV9pbmRleCAtIDFdIDoKKyAgICAgICAgICAgICAgICAgICAga0JpdHJhdGVWMUwzW2JpdHJhdGVfaW5kZXggLSAxXTsKKworICAgICAgICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAxMTUyOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeyAvLyBWMiAob3IgMi41KQorICAgICAgICAgICAgYml0cmF0ZSA9IGtCaXRyYXRlVjJbYml0cmF0ZV9pbmRleCAtIDFdOworICAgICAgICAgICAgaWYgKG91dF9udW1fc2FtcGxlcykgeworICAgICAgICAgICAgICAgICpvdXRfbnVtX3NhbXBsZXMgPSAobGF5ZXIgPT0gMSAvKiBMMyAqLykgPyA1NzYgOiAxMTUyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG91dF9iaXRyYXRlKSB7CisgICAgICAgICAgICAqb3V0X2JpdHJhdGUgPSBiaXRyYXRlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gMyAvKiBWMSAqLykgeworICAgICAgICAgICAgKmZyYW1lX3NpemUgPSAxNDQwMDAgKiBiaXRyYXRlIC8gc2FtcGxpbmdfcmF0ZSArIHBhZGRpbmc7CisgICAgICAgIH0gZWxzZSB7IC8vIFYyIG9yIFYyLjUKKyAgICAgICAgICAgIHNpemVfdCB0bXAgPSAobGF5ZXIgPT0gMSAvKiBMMyAqLykgPyA3MjAwMCA6IDE0NDAwMDsKKyAgICAgICAgICAgICpmcmFtZV9zaXplID0gdG1wICogYml0cmF0ZSAvIHNhbXBsaW5nX3JhdGUgKyBwYWRkaW5nOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG91dF9zYW1wbGluZ19yYXRlKSB7CisgICAgICAgICpvdXRfc2FtcGxpbmdfcmF0ZSA9IHNhbXBsaW5nX3JhdGU7CisgICAgfQorCisgICAgaWYgKG91dF9jaGFubmVscykgeworICAgICAgICBpbnQgY2hhbm5lbF9tb2RlID0gKGhlYWRlciA+PiA2KSAmIDM7CisKKyAgICAgICAgKm91dF9jaGFubmVscyA9IChjaGFubmVsX21vZGUgPT0gMykgPyAxIDogMjsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHVpbnQzMl90IFUzMl9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKKyAgICByZXR1cm4gcHRyWzBdIDw8IDI0IHwgcHRyWzFdIDw8IDE2IHwgcHRyWzJdIDw8IDggfCBwdHJbM107Cit9CisKK3N0YXRpYyBzdGF0dXNfdCBjYWxjdWxhdGVPdXRTaXplKHVpbnQ4ICpoZWFkZXIsIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzaXplX3Q+ICpkZWNvZGVkU2l6ZXMpIHsKKyAgICB1aW50MzJfdCBjaGFubmVsczsKKyAgICB1aW50MzJfdCBudW1TYW1wbGVzOworICAgIHNpemVfdCBmcmFtZVNpemU7CisgICAgc2l6ZV90IHRvdGFsSW5TaXplID0gMDsKKworICAgIHdoaWxlICh0b3RhbEluU2l6ZSArIDQgPCBpblNpemUpIHsKKyAgICAgICAgaWYgKCFwYXJzZU1wM0hlYWRlcihVMzJfQVQoaGVhZGVyICsgdG90YWxJblNpemUpLCAmZnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsICZjaGFubmVscywgbnVsbHB0ciwgJm51bVNhbXBsZXMpKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gcGFyc2UgbXAzIGhlYWRlciBkdXJpbmcgb3V0U2l6ZSBlc3RpbWF0aW9uIik7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICB0b3RhbEluU2l6ZSArPSBmcmFtZVNpemU7CisgICAgICAgIGRlY29kZWRTaXplcy0+cHVzaF9iYWNrKG51bVNhbXBsZXMgKiBjaGFubmVscyAqIHNpemVvZihpbnQxNl90KSk7CisgICAgfQorCisgICAgaWYgKGRlY29kZWRTaXplcy0+ZW1wdHkoKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1QMzo6b25GbHVzaF9zbSgpIHsKKyAgICByZXR1cm4gb25TdG9wKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1QMzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKKy8vIFRPRE86IENhbiBvdmVyYWxsIGVycm9yIGNoZWNraW5nIGJlIGltcHJvdmVkPyBBcyBpbiB0aGUgY2hlY2sgZm9yIHZhbGlkaXR5IG9mCisvLyAgICAgICB3b3JrLCBwb29sIHB0ciwgd29yay0+aW5wdXQuYnVmZmVycy5zaXplKCkgPT0gMSwgLi4uCisvLyBUT0RPOiBCbGluZCByZW1vdmFsIG9mIDUyOSBzYW1wbGVzIGZyb20gdGhlIG91dHB1dCBtYXkgbm90IHdvcmsuIEJlY2F1c2UKKy8vICAgICAgIG1wZWcgbGF5ZXIgMSBmcmFtZSBzaXplIGlzIDM4NCBzYW1wbGVzIHBlciBmcmFtZS4gVGhpcyBzaG91bGQgaW50cm9kdWNlCisvLyAgICAgICBuZWdhdGl2ZSB2YWx1ZXMgYW5kIGNhbiBjYXVzZSBTRUcgZmF1bHRzLiBTb2Z0IG9teCBtcDMgcGx1Z2luIGNhbiBoYXZlCisvLyAgICAgICB0aGlzIHByb2JsZW0gKENIRUNLISkKK3ZvaWQgQzJTb2Z0TVAzOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluU2l6ZSA9PSAwICYmICghbUdhcGxlc3NCeXRlcyB8fCAhZW9zKSkgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQiLCBpblNpemUsCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKworICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSBtQ29uZmlnLT5udW1fY2hhbm5lbHM7CisgICAgc2l6ZV90IGNhbE91dFNpemU7CisgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBkZWNvZGVkU2l6ZXM7CisgICAgaWYgKGluU2l6ZSAmJiBPSyAhPSBjYWxjdWxhdGVPdXRTaXplKGNvbnN0X2Nhc3Q8dWludDggKj4oclZpZXcuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5TaXplLCAmZGVjb2RlZFNpemVzKSkgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2FsT3V0U2l6ZSA9IHN0ZDo6YWNjdW11bGF0ZShkZWNvZGVkU2l6ZXMuYmVnaW4oKSwgZGVjb2RlZFNpemVzLmVuZCgpLCAwKTsKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGNhbE91dFNpemUgKz0ga1BWTVAzRGVjb2RlckRlbGF5ICogbnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKGNhbE91dFNpemUsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IG91dFNpemUgPSAwOworICAgIGludCBvdXRPZmZzZXQgPSAwOworICAgIGF1dG8gaXQgPSBkZWNvZGVkU2l6ZXMuYmVnaW4oKTsKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIGludDMyX3Qgc2FtcGxpbmdSYXRlID0gbUNvbmZpZy0+c2FtcGxpbmdSYXRlOworICAgIHdoaWxlIChpblBvcyA8IGluU2l6ZSkgeworICAgICAgICBpZiAoaXQgPT0gZGVjb2RlZFNpemVzLmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HRSgidW5leHBlY3RlZCB0cmFpbGluZyBieXRlcywgaWdub3JpbmcgdGhlbSIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtQ29uZmlnLT5wSW5wdXRCdWZmZXIgPSBjb25zdF9jYXN0PHVpbnQ4ICo+KHJWaWV3LmRhdGEoKSArIGluUG9zKTsKKyAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJDdXJyZW50TGVuZ3RoID0gKGluU2l6ZSAtIGluUG9zKTsKKyAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJNYXhMZW5ndGggPSAwOworICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlclVzZWRMZW5ndGggPSAwOworICAgICAgICBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgPSAoY2FsT3V0U2l6ZSAtIG91dFNpemUpOworICAgICAgICBtQ29uZmlnLT5wT3V0cHV0QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90ICo+ICh3Vmlldy5kYXRhKCkgKyBvdXRTaXplKTsKKworICAgICAgICBFUlJPUl9DT0RFIGRlY29kZXJFcnI7CisgICAgICAgIGlmICgoZGVjb2RlckVyciA9IHB2bXAzX2ZyYW1lZGVjb2RlcihtQ29uZmlnLCBtRGVjb2RlckJ1ZikpCisgICAgICAgICAgICAgICAgIT0gTk9fREVDT0RJTkdfRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJtcDMgZGVjb2RlciByZXR1cm5lZCBlcnJvciAlZCIsIGRlY29kZXJFcnIpOworICAgICAgICAgICAgaWYgKGRlY29kZXJFcnIgIT0gTk9fRU5PVUdIX01BSU5fREFUQV9FUlJPUgorICAgICAgICAgICAgICAgICAgICAmJiBkZWNvZGVyRXJyICE9IFNJREVfSU5GT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGhpcyBpcyByZWNvdmVyYWJsZSwganVzdCBpZ25vcmUgdGhlIGN1cnJlbnQgZnJhbWUgYW5kCisgICAgICAgICAgICAvLyBwbGF5IHNpbGVuY2UgaW5zdGVhZC4KKyAgICAgICAgICAgIEFMT0dWKCJpZ25vcmluZyBlcnJvciBhbmQgc2VuZGluZyBzaWxlbmNlIik7CisgICAgICAgICAgICBpZiAobUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgPSAqaXQgLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1zZXQobUNvbmZpZy0+cE91dHB1dEJ1ZmZlciwgMCwgbUNvbmZpZy0+b3V0cHV0RnJhbWVTaXplICogc2l6ZW9mKGludDE2X3QpKTsKKyAgICAgICAgfSBlbHNlIGlmIChtQ29uZmlnLT5zYW1wbGluZ1JhdGUgIT0gc2FtcGxpbmdSYXRlCisgICAgICAgICAgICAgICAgfHwgbUNvbmZpZy0+bnVtX2NoYW5uZWxzICE9IG51bUNoYW5uZWxzKSB7CisgICAgICAgICAgICBBTE9HSSgiUmVjb25maWd1cmluZyBkZWNvZGVyOiAlZC0+JWQgSHosICVkLT4lZCBjaGFubmVscyIsCisgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlLCBtQ29uZmlnLT5zYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsIG1Db25maWctPm51bV9jaGFubmVscyk7CisgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBtQ29uZmlnLT5zYW1wbGluZ1JhdGU7CisgICAgICAgICAgICBudW1DaGFubmVscyA9IG1Db25maWctPm51bV9jaGFubmVsczsKKworICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBzYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygwdSwgbnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvIH0sCisgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KHNhbXBsZVJhdGVJbmZvKSk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKml0ICE9IG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAqIHNpemVvZihpbnQxNl90KSkgeworICAgICAgICAgICAgQUxPR0UoInBhbmljLCBwYXJzZWQgc2l6ZSBkb2VzIG5vdCBtYXRjaCBkZWNvZGVkIHNpemUiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgb3V0U2l6ZSArPSBtQ29uZmlnLT5vdXRwdXRGcmFtZVNpemUgKiBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGluUG9zICs9IG1Db25maWctPmlucHV0QnVmZmVyVXNlZExlbmd0aDsKKyAgICAgICAgaXQrKzsKKyAgICB9CisgICAgaWYgKG1Jc0ZpcnN0KSB7CisgICAgICAgIG1Jc0ZpcnN0ID0gZmFsc2U7CisgICAgICAgIG1HYXBsZXNzQnl0ZXMgPSB0cnVlOworICAgICAgICAvLyBUaGUgZGVjb2RlciBkZWxheSBpcyA1Mjkgc2FtcGxlcywgc28gdHJpbSB0aGF0IG1hbnkgc2FtcGxlcyBvZmYKKyAgICAgICAgLy8gdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCBvdXRwdXQgYnVmZmVyLiBUaGlzIGVzc2VudGlhbGx5IG1ha2VzIHRoaXMKKyAgICAgICAgLy8gZGVjb2RlciBoYXZlIHplcm8gZGVsYXksIHdoaWNoIHRoZSByZXN0IG9mIHRoZSBwaXBlbGluZSBhc3N1bWVzLgorICAgICAgICBvdXRPZmZzZXQgPSBrUFZNUDNEZWNvZGVyRGVsYXkgKiBudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgbUFuY2hvclRpbWVTdGFtcCA9IHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1bGwoKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBpZiAoY2FsT3V0U2l6ZSA+PQorICAgICAgICAgICAgb3V0U2l6ZSArIGtQVk1QM0RlY29kZXJEZWxheSAqIG51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKSB7CisgICAgICAgICAgICBpZiAoIW1lbXNldChyZWludGVycHJldF9jYXN0PGludDE2X3QqPih3Vmlldy5kYXRhKCkgKyBvdXRTaXplKSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQVk1QM0RlY29kZXJEZWxheSAqIG51bUNoYW5uZWxzICogc2l6ZW9mKGludDE2X3QpKSkgeworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiQWRkaW5nIDUyOSBzYW1wbGVzIGF0IGVuZCIpOworICAgICAgICAgICAgbUdhcGxlc3NCeXRlcyA9IGZhbHNlOworICAgICAgICAgICAgb3V0U2l6ZSArPSBrUFZNUDNEZWNvZGVyRGVsYXkgKiBudW1DaGFubmVscyAqIHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9IG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gc2FtcGxpbmdSYXRlOworICAgIG1Qcm9jZXNzZWRTYW1wbGVzICs9ICgob3V0U2l6ZSAtIG91dE9mZnNldCkgLyAobnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpKTsKKyAgICBBTE9HVigib3V0IGJ1ZmZlciBhdHRyLiBvZmZzZXQgJWQgc2l6ZSAlZCB0aW1lc3RhbXAgJXUiLCBvdXRPZmZzZXQsIG91dFNpemUgLSBvdXRPZmZzZXQsCisgICAgICAgICAgKHVpbnQzMl90KShtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wKSk7CisgICAgZGVjb2RlZFNpemVzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soCisgICAgICAgICAgICBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIG91dE9mZnNldCwgb3V0U2l6ZSAtIG91dE9mZnNldCkpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgIGlmIChlb3MpIHsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgfQorfQorCitjbGFzcyBDMlNvZnRNcDNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0TXAzRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgIG5ldyBDMlNvZnRNUDMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNUDM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRNUDM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TVAzOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE1wM0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE1wM0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL0MyU29mdE1wM0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMmJkYzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcDMvQzJTb2Z0TXAzRGVjLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX01QM19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX01QM19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworc3RydWN0IHRQVk1QM0RlY29kZXJFeHRlcm5hbDsKKworYm9vbCBwYXJzZU1wM0hlYWRlcih1aW50MzJfdCBoZWFkZXIsIHNpemVfdCAqZnJhbWVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9zYW1wbGluZ19yYXRlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm91dF9jaGFubmVscyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfYml0cmF0ZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpvdXRfbnVtX3NhbXBsZXMgPSBudWxscHRyKTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0TVAzIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE1QMyhjb25zdCBjaGFyICpuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRNUDMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtQVk1QM0RlY29kZXJEZWxheSA9IDUyOSAvLyBzYW1wbGVzCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdFBWTVAzRGVjb2RlckV4dGVybmFsICptQ29uZmlnOworICAgIHZvaWQgKm1EZWNvZGVyQnVmOworCisgICAgYm9vbCBtSXNGaXJzdDsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtR2FwbGVzc0J5dGVzOworICAgIHVpbnQ2NF90IG1BbmNob3JUaW1lU3RhbXA7CisgICAgdWludDY0X3QgbVByb2Nlc3NlZFNhbXBsZXM7CisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0TVAzKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX01QM19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmNvcHkgdG8gbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTk9USUNFCmNvcHkgdG8gbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXAzL3BhdGVudF9kaXNjbGFpbWVyLnR4dCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9wYXRlbnRfZGlzY2xhaW1lci50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjRiZjExZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wMy9wYXRlbnRfZGlzY2xhaW1lci50eHQKQEAgLTAsMCArMSw5IEBACisKK1RISVMgSVMgTk9UIEEgR1JBTlQgT0YgUEFURU5UIFJJR0hUUy4KKworR29vZ2xlIG1ha2VzIG5vIHJlcHJlc2VudGF0aW9uIG9yIHdhcnJhbnR5IHRoYXQgdGhlIGNvZGVjcyBmb3Igd2hpY2gKK3NvdXJjZSBjb2RlIGlzIG1hZGUgYXZhaWxhYmxlIGhlcmV1bmRlciBhcmUgdW5lbmN1bWJlcmVkIGJ5Cit0aGlyZC1wYXJ0eSBwYXRlbnRzLiAgVGhvc2UgaW50ZW5kaW5nIHRvIHVzZSB0aGlzIHNvdXJjZSBjb2RlIGluCitoYXJkd2FyZSBvciBzb2Z0d2FyZSBwcm9kdWN0cyBhcmUgYWR2aXNlZCB0aGF0IGltcGxlbWVudGF0aW9ucyBvZgordGhlc2UgY29kZWNzLCBpbmNsdWRpbmcgaW4gb3BlbiBzb3VyY2Ugc29mdHdhcmUgb3Igc2hhcmV3YXJlLCBtYXkKK3JlcXVpcmUgcGF0ZW50IGxpY2Vuc2VzIGZyb20gdGhlIHJlbGV2YW50IHBhdGVudCBob2xkZXJzLgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQxZjBhOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxNiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9tcGVnMmRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX3NpZ25lZC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0TXBlZzJEZWMuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJtcGVnMmRlYyJdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9saWJtcGVnMi9kZWNvZGVyIiwKKyAgICAgICAgImV4dGVybmFsL2xpYm1wZWcyL2NvbW1vbiIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZjdiNDAzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuY3BwCkBAIC0wLDAgKzEsMTExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0TXBlZzJEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMk1hcHBlci5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRNcGVnMkRlYy5oIgorI2luY2x1ZGUgImltcGVnMmQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQubXBlZzIuZGVjb2RlciI7CisKK2NsYXNzIEMyU29mdE1wZWcyRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMikgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7IC8vIFRPRE86IGFjY291bnQgZm9yIG91ciBidWZmZXJzIGhlcmUKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICAvLyBUT0RPOiBvdXRwdXQgbGF0ZW5jeSBhbmQgcmVvcmRlcmluZworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgxNiwgMTkyMCwgNCksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDE2LCAxMDg4LCA0KSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNpemVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dCgwdSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU0lNUExFLCBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9TSU1QTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9NQUlOfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0xPVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVAyVl9NQUlOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0hfMTQ0MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4U2l6ZSwgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAxOTIwLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMTA4OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihNYXhQaWN0dXJlU2l6ZVNldHRlciwgbVNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4SW5wdXRTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzIwICogMjQwICogMyAvIDIpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAxdSwgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfSwKKyAgICAgICAgICAgICAgICAgICAgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgcHJpbWFyaWVzKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsIEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ29kZWRDb2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9MSU1JVEVELCBDMkNvbG9yOjpQUklNQVJJRVNfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVEKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UkFOR0VfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvZGVkQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2RlZENvbG9yQXNwZWN0cywgdHJhbnNmZXIpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlRSQU5TRkVSX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29kZWRDb2xvckFzcGVjdHMsIG1hdHJpeCkuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6TUFUUklYX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpNQVRSSVhfT1RIRVIpCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihDb2RlZENvbG9yQXNwZWN0c1NldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckFzcGVjdHMsIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgcmFuZ2UpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVELCBDMkNvbG9yOjpSQU5HRV9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtQ29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Db2xvckFzcGVjdHMsIHRyYW5zZmVyKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobUNvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKENvbG9yQXNwZWN0c1NldHRlciwgbURlZmF1bHRDb2xvckFzcGVjdHMsIG1Db2RlZENvbG9yQXNwZWN0cykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4UGljdHVyZVNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBUT0RPOiBnZXQgbWF4IHdpZHRoL2hlaWdodCBmcm9tIHRoZSBzaXplJ3MgZmllbGQgaGVscGVycyB2cy4gaGFyZGNvZGluZworICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgMTkyMHUpOworICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBjMl9taW4oYzJfbWF4KG1lLnYuaGVpZ2h0LCBzaXplLnYuaGVpZ2h0KSwgMTA4OHUpOworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMQorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDE1KSAvIDE2KSAqICgobWF4U2l6ZS52LmhlaWdodCArIDE1KSAvIDE2KSAqIDM4NCk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXNpemU7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29kZWRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1lLnYucHJpbWFyaWVzID4gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSB7CisgICAgICAgICAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52LnRyYW5zZmVyID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgQ29sb3JBc3BlY3RzU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiAmZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiAmY29kZWQpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIC8vIHRha2UgZGVmYXVsdCB2YWx1ZXMgZm9yIGFsbCB1bnNwZWNpZmllZCBmaWVsZHMsIGFuZCBjb2RlZCB2YWx1ZXMgZm9yIHNwZWNpZmllZCBvbmVzCisgICAgICAgIG1lLnNldCgpLnJhbmdlID0gY29kZWQudi5yYW5nZSA9PSBSQU5HRV9VTlNQRUNJRklFRCA/IGRlZi52LnJhbmdlIDogY29kZWQudi5yYW5nZTsKKyAgICAgICAgbWUuc2V0KCkucHJpbWFyaWVzID0gY29kZWQudi5wcmltYXJpZXMgPT0gUFJJTUFSSUVTX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi5wcmltYXJpZXMgOiBjb2RlZC52LnByaW1hcmllczsKKyAgICAgICAgbWUuc2V0KCkudHJhbnNmZXIgPSBjb2RlZC52LnRyYW5zZmVyID09IFRSQU5TRkVSX1VOU1BFQ0lGSUVECisgICAgICAgICAgICAgICAgPyBkZWYudi50cmFuc2ZlciA6IGNvZGVkLnYudHJhbnNmZXI7CisgICAgICAgIG1lLnNldCgpLm1hdHJpeCA9IGNvZGVkLnYubWF0cml4ID09IE1BVFJJWF9VTlNQRUNJRklFRCA/IGRlZi52Lm1hdHJpeCA6IGNvZGVkLnYubWF0cml4OworICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gZ2V0Q29sb3JBc3BlY3RzX2woKSB7CisgICAgICAgIHJldHVybiBtQ29sb3JBc3BlY3RzOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gbU1heFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtTWF4SW5wdXRTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBtQ29sb3JJbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86OmlucHV0PiBtQ29kZWRDb2xvckFzcGVjdHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IG1EZWZhdWx0Q29sb3JBc3BlY3RzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dD4gbUNvbG9yQXNwZWN0czsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0OworfTsKKworc3RhdGljIHNpemVfdCBnZXRDcHVDb3JlQ291bnQoKSB7CisgICAgbG9uZyBjcHVDb3JlQ291bnQgPSAxOworI2lmIGRlZmluZWQoX1NDX05QUk9DRVNTT1JTX09OTE4pCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NFU1NPUlNfT05MTik7CisjZWxzZQorICAgIC8vIF9TQ19OUFJPQ19PTkxOIG11c3QgYmUgZGVmaW5lZC4uLgorICAgIGNwdUNvcmVDb3VudCA9IHN5c2NvbmYoX1NDX05QUk9DX09OTE4pOworI2VuZGlmCisgICAgQ0hFQ0soY3B1Q29yZUNvdW50ID49IDEpOworICAgIEFMT0dWKCJOdW1iZXIgb2YgQ1BVIGNvcmVzOiAlbGQiLCBjcHVDb3JlQ291bnQpOworICAgIHJldHVybiAoc2l6ZV90KWNwdUNvcmVDb3VudDsKK30KKworc3RhdGljIHZvaWQgKml2ZF9hbGlnbmVkX21hbGxvYyhXT1JEMzIgYWxpZ25tZW50LCBXT1JEMzIgc2l6ZSkgeworICAgIHJldHVybiBtZW1hbGlnbihhbGlnbm1lbnQsIHNpemUpOworfQorCitzdGF0aWMgdm9pZCBpdmRfYWxpZ25lZF9mcmVlKHZvaWQgKm1lbSkgeworICAgIGZyZWUobWVtKTsKK30KKworQzJTb2Z0TXBlZzJEZWM6OkMyU29mdE1wZWcyRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgICBtRGVjSGFuZGxlKG51bGxwdHIpLAorICAgICAgICBtTWVtUmVjb3JkcyhudWxscHRyKSwKKyAgICAgICAgbU91dEJ1ZmZlckRyYWluKG51bGxwdHIpLAorICAgICAgICBtSXZDb2xvcmZvcm1hdChJVl9ZVVZfNDIwUCksCisgICAgICAgIG1XaWR0aCgzMjApLAorICAgICAgICBtSGVpZ2h0KDI0MCksCisgICAgICAgIG1PdXRJbmRleCgwdSkgeworICAgIC8vIElmIGlucHV0IGR1bXAgaXMgZW5hYmxlZCwgdGhlbiBvcGVuIGNyZWF0ZSBhbiBlbXB0eSBmaWxlCisgICAgR0VORVJBVEVfRklMRV9OQU1FUygpOworICAgIENSRUFURV9EVU1QX0ZJTEUobUluRmlsZSk7Cit9CisKK0MyU29mdE1wZWcyRGVjOjp+QzJTb2Z0TXBlZzJEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKE9LICE9IHJlc2V0RGVjb2RlcigpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE1wZWcyRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKSBvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRNcGVnMkRlYzo6b25SZWxlYXNlKCkgeworICAgICh2b2lkKSBkZWxldGVEZWNvZGVyKCk7CisgICAgaWYgKG1PdXRCdWZmZXJEcmFpbikgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG1PdXRCdWZmZXJEcmFpbik7CisgICAgICAgIG1PdXRCdWZmZXJEcmFpbiA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2spIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGlmIChtTWVtUmVjb3JkcykgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG1NZW1SZWNvcmRzKTsKKyAgICAgICAgbU1lbVJlY29yZHMgPSBudWxscHRyOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKE9LICE9IHNldEZsdXNoTW9kZSgpKSByZXR1cm4gQzJfQ09SUlVQVEVEOworCisgICAgdWludDMyX3QgZGlzcGxheVN0cmlkZSA9IG1TdHJpZGU7CisgICAgdWludDMyX3QgZGlzcGxheUhlaWdodCA9IG1IZWlnaHQ7CisgICAgdWludDMyX3QgYnVmZmVyU2l6ZSA9IGRpc3BsYXlTdHJpZGUgKiBkaXNwbGF5SGVpZ2h0ICogMyAvIDI7CisgICAgbU91dEJ1ZmZlckRyYWluID0gKHVpbnQ4X3QgKilpdmRfYWxpZ25lZF9tYWxsb2MoMTI4LCBidWZmZXJTaXplKTsKKyAgICBpZiAoIW1PdXRCdWZmZXJEcmFpbikgeworICAgICAgICBBTE9HRSgiY291bGQgbm90IGFsbG9jYXRlIHRtcCBvdXRwdXQgYnVmZmVyIChmb3IgZmx1c2gpIG9mIHNpemUgJXUgIiwgYnVmZmVyU2l6ZSk7CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgfQorCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisKKyAgICAgICAgc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgbnVsbHB0ciwgMCwgMCwgMCk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoMCA9PSBzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCkgeworICAgICAgICAgICAgcmVzZXRQbHVnaW4oKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1PdXRCdWZmZXJEcmFpbikgeworICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKG1PdXRCdWZmZXJEcmFpbik7CisgICAgICAgIG1PdXRCdWZmZXJEcmFpbiA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6Z2V0TnVtTWVtUmVjb3JkcygpIHsKKyAgICBpdl9udW1fbWVtX3JlY19pcF90IHNfbnVtX21lbV9yZWNfaXA7CisgICAgaXZfbnVtX21lbV9yZWNfb3BfdCBzX251bV9tZW1fcmVjX29wOworCisgICAgc19udW1fbWVtX3JlY19pcC51NF9zaXplID0gc2l6ZW9mKHNfbnVtX21lbV9yZWNfaXApOworICAgIHNfbnVtX21lbV9yZWNfaXAuZV9jbWQgPSBJVl9DTURfR0VUX05VTV9NRU1fUkVDOworICAgIHNfbnVtX21lbV9yZWNfb3AudTRfc2l6ZSA9IHNpemVvZihzX251bV9tZW1fcmVjX29wKTsKKworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19udW1fbWVtX3JlY19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfbnVtX21lbV9yZWNfb3ApOworICAgIGlmIChJVl9TVUNDRVNTICE9IHN0YXR1cykgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gZ2V0dGluZyBtZW0gcmVjb3JkczogMHgleCIsIHNfbnVtX21lbV9yZWNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtTnVtTWVtUmVjb3JkcyA9IHNfbnVtX21lbV9yZWNfb3AudTRfbnVtX21lbV9yZWM7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpmaWxsTWVtUmVjb3JkcygpIHsKKyAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWMgPSAoaXZfbWVtX3JlY190ICopIGl2ZF9hbGlnbmVkX21hbGxvYygKKyAgICAgICAgICAgIDEyOCwgbU51bU1lbVJlY29yZHMgKiBzaXplb2YoaXZfbWVtX3JlY190KSk7CisgICAgaWYgKCFwc19tZW1fcmVjKSB7CisgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgbWVtc2V0KHBzX21lbV9yZWMsIDAsIG1OdW1NZW1SZWNvcmRzICogc2l6ZW9mKGl2X21lbV9yZWNfdCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKykKKyAgICAgICAgcHNfbWVtX3JlY1tpXS51NF9zaXplID0gc2l6ZW9mKGl2X21lbV9yZWNfdCk7CisgICAgbU1lbVJlY29yZHMgPSBwc19tZW1fcmVjOworCisgICAgaXZkZXh0X2ZpbGxfbWVtX3JlY19pcF90IHNfZmlsbF9tZW1faXA7CisgICAgaXZkZXh0X2ZpbGxfbWVtX3JlY19vcF90IHNfZmlsbF9tZW1fb3A7CisKKyAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2ZpbGxfbWVtX3JlY19pcF90KTsKKyAgICBzX2ZpbGxfbWVtX2lwLnU0X3NoYXJlX2Rpc3BfYnVmID0gMDsKKyAgICBzX2ZpbGxfbWVtX2lwLmVfb3V0cHV0X2Zvcm1hdCA9IG1JdkNvbG9yZm9ybWF0OworICAgIHNfZmlsbF9tZW1faXAudTRfZGVpbnRlcmxhY2UgPSAxOworICAgIHNfZmlsbF9tZW1faXAuc19pdmRfZmlsbF9tZW1fcmVjX2lwX3QuZV9jbWQgPSBJVl9DTURfRklMTF9OVU1fTUVNX1JFQzsKKyAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnB2X21lbV9yZWNfbG9jYXRpb24gPSBtTWVtUmVjb3JkczsKKyAgICBzX2ZpbGxfbWVtX2lwLnNfaXZkX2ZpbGxfbWVtX3JlY19pcF90LnU0X21heF9mcm1fd2QgPSBtV2lkdGg7CisgICAgc19maWxsX21lbV9pcC5zX2l2ZF9maWxsX21lbV9yZWNfaXBfdC51NF9tYXhfZnJtX2h0ID0gbUhlaWdodDsKKyAgICBzX2ZpbGxfbWVtX29wLnNfaXZkX2ZpbGxfbWVtX3JlY19vcF90LnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2ZpbGxfbWVtX3JlY19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZmlsbF9tZW1faXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2ZpbGxfbWVtX29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIGZpbGxpbmcgbWVtIHJlY29yZHM6IDB4JXgiLAorICAgICAgICAgICAgICBzX2ZpbGxfbWVtX29wLnNfaXZkX2ZpbGxfbWVtX3JlY19vcF90LnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBDSEVDS19FUShtTnVtTWVtUmVjb3Jkcywgc19maWxsX21lbV9vcC5zX2l2ZF9maWxsX21lbV9yZWNfb3BfdC51NF9udW1fbWVtX3JlY19maWxsZWQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU51bU1lbVJlY29yZHM7IGkrKywgcHNfbWVtX3JlYysrKSB7CisgICAgICAgIHBzX21lbV9yZWMtPnB2X2Jhc2UgPSBpdmRfYWxpZ25lZF9tYWxsb2MoCisgICAgICAgICAgICAgICAgcHNfbWVtX3JlYy0+dTRfbWVtX2FsaWdubWVudCwgcHNfbWVtX3JlYy0+dTRfbWVtX3NpemUpOworICAgICAgICBpZiAoIXBzX21lbV9yZWMtPnB2X2Jhc2UpIHsKKyAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgZm9yIG1lbW9yeSByZWNvcmQgIyV6dSBvZiBzaXplICV1IiwKKyAgICAgICAgICAgICAgICAgIGksIHBzX21lbV9yZWMtPnU0X21lbV9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpjcmVhdGVEZWNvZGVyKCkgeworICAgIGl2ZGV4dF9pbml0X2lwX3Qgc19pbml0X2lwOworICAgIGl2ZGV4dF9pbml0X29wX3Qgc19pbml0X29wOworCisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9pbml0X2lwX3QpOworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QuZV9jbWQgPSAoSVZEX0FQSV9DT01NQU5EX1RZUEVfVClJVl9DTURfSU5JVDsKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnB2X21lbV9yZWNfbG9jYXRpb24gPSBtTWVtUmVjb3JkczsKKyAgICBzX2luaXRfaXAuc19pdmRfaW5pdF9pcF90LnU0X2ZybV9tYXhfd2QgPSBtV2lkdGg7CisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9mcm1fbWF4X2h0ID0gbUhlaWdodDsKKyAgICBzX2luaXRfaXAudTRfc2hhcmVfZGlzcF9idWYgPSAwOworICAgIHNfaW5pdF9pcC51NF9kZWludGVybGFjZSA9IDE7CisgICAgc19pbml0X2lwLnNfaXZkX2luaXRfaXBfdC51NF9udW1fbWVtX3JlYyA9IG1OdW1NZW1SZWNvcmRzOworICAgIHNfaW5pdF9pcC5zX2l2ZF9pbml0X2lwX3QuZV9vdXRwdXRfZm9ybWF0ID0gbUl2Q29sb3Jmb3JtYXQ7CisgICAgc19pbml0X29wLnNfaXZkX2luaXRfb3BfdC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9pbml0X29wX3QpOworCisgICAgbURlY0hhbmRsZSA9IChpdl9vYmpfdCAqKW1NZW1SZWNvcmRzWzBdLnB2X2Jhc2U7CisgICAgbURlY0hhbmRsZS0+cHZfZnhucyA9ICh2b2lkICopaXZkZWNfYXBpX2Z1bmN0aW9uOworICAgIG1EZWNIYW5kbGUtPnU0X3NpemUgPSBzaXplb2YoaXZfb2JqX3QpOworCisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2luaXRfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX2luaXRfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19pbml0X29wLnNfaXZkX2luaXRfb3BfdC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6c2V0TnVtQ29yZXMoKSB7CisgICAgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3Qgc19zZXRfbnVtX2NvcmVzX2lwOworICAgIGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90IHNfc2V0X251bV9jb3Jlc19vcDsKKworICAgIHNfc2V0X251bV9jb3Jlc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19pcF90KTsKKyAgICBzX3NldF9udW1fY29yZXNfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9udW1fY29yZXNfaXAuZV9zdWJfY21kID0gSVZERVhUX0NNRF9DVExfU0VUX05VTV9DT1JFUzsKKyAgICBzX3NldF9udW1fY29yZXNfaXAudTRfbnVtX2NvcmVzID0gbU51bUNvcmVzOworICAgIHNfc2V0X251bV9jb3Jlc19vcC51NF9zaXplID0gc2l6ZW9mKGl2ZGV4dF9jdGxfc2V0X251bV9jb3Jlc19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X251bV9jb3Jlc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X251bV9jb3Jlc19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dEKCJlcnJvciBpbiAlczogMHgleCIsIF9fZnVuY19fLCBzX3NldF9udW1fY29yZXNfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OnNldFBhcmFtcyhzaXplX3Qgc3RyaWRlKSB7CisgICAgaXZkX2N0bF9zZXRfY29uZmlnX2lwX3Qgc19zZXRfZHluX3BhcmFtc19pcDsKKyAgICBpdmRfY3RsX3NldF9jb25maWdfb3BfdCBzX3NldF9keW5fcGFyYW1zX29wOworCisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfc2V0X2NvbmZpZ19pcF90KTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9TRVRQQVJBTVM7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC51NF9kaXNwX3dkID0gKFVXT1JEMzIpIHN0cmlkZTsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfZnJtX3NraXBfbW9kZSA9IElWRF9TS0lQX05PTkU7CisgICAgc19zZXRfZHluX3BhcmFtc19pcC5lX2ZybV9vdXRfbW9kZSA9IElWRF9ESVNQTEFZX0ZSQU1FX09VVDsKKyAgICBzX3NldF9keW5fcGFyYW1zX2lwLmVfdmlkX2RlY19tb2RlID0gSVZEX0RFQ09ERV9GUkFNRTsKKyAgICBzX3NldF9keW5fcGFyYW1zX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9zZXRfY29uZmlnX29wX3QpOworICAgIElWX0FQSV9DQUxMX1NUQVRVU19UIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtRGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19zZXRfZHluX3BhcmFtc19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2R5bl9wYXJhbXNfb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRSgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywgc19zZXRfZHluX3BhcmFtc19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6Z2V0VmVyc2lvbigpIHsKKyAgICBpdmRfY3RsX2dldHZlcnNpb25pbmZvX2lwX3Qgc19nZXRfdmVyc2lvbmluZm9faXA7CisgICAgaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90IHNfZ2V0X3ZlcnNpb25pbmZvX29wOworICAgIFVXT1JEOCBhdTFfYnVmWzUxMl07CisKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZ2V0dmVyc2lvbmluZm9faXBfdCk7CisgICAgc19nZXRfdmVyc2lvbmluZm9faXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9HRVRWRVJTSU9OOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnB2X3ZlcnNpb25fYnVmZmVyID0gYXUxX2J1ZjsKKyAgICBzX2dldF92ZXJzaW9uaW5mb19pcC51NF92ZXJzaW9uX2J1ZmZlcl9zaXplID0gc2l6ZW9mKGF1MV9idWYpOworICAgIHNfZ2V0X3ZlcnNpb25pbmZvX29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9nZXR2ZXJzaW9uaW5mb19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfZ2V0X3ZlcnNpb25pbmZvX2lwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc19nZXRfdmVyc2lvbmluZm9fb3ApOworICAgIGlmIChzdGF0dXMgIT0gSVZfU1VDQ0VTUykgeworICAgICAgICBBTE9HRCgiZXJyb3IgaW4gJXM6IDB4JXgiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgc19nZXRfdmVyc2lvbmluZm9fb3AudTRfZXJyb3JfY29kZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIml0dGlhbSBkZWNvZGVyIHZlcnNpb24gbnVtYmVyOiAlcyIsCisgICAgICAgICAgICAgIChjaGFyICopIHNfZ2V0X3ZlcnNpb25pbmZvX2lwLnB2X3ZlcnNpb25fYnVmZmVyKTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjppbml0RGVjb2RlcigpIHsKKyAgICBzdGF0dXNfdCByZXQgPSBnZXROdW1NZW1SZWNvcmRzKCk7CisgICAgaWYgKE9LICE9IHJldCkgcmV0dXJuIHJldDsKKworICAgIHJldCA9IGZpbGxNZW1SZWNvcmRzKCk7CisgICAgaWYgKE9LICE9IHJldCkgcmV0dXJuIHJldDsKKworICAgIGlmIChPSyAhPSBjcmVhdGVEZWNvZGVyKCkpIHJldHVybiBVTktOT1dOX0VSUk9SOworCisgICAgbU51bUNvcmVzID0gTUlOKGdldENwdUNvcmVDb3VudCgpLCBNQVhfTlVNX0NPUkVTKTsKKyAgICBtU3RyaWRlID0gQUxJR042NChtV2lkdGgpOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIHJlc2V0UGx1Z2luKCk7CisgICAgKHZvaWQpIHNldE51bUNvcmVzKCk7CisgICAgaWYgKE9LICE9IHNldFBhcmFtcyhtU3RyaWRlKSkgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgKHZvaWQpIGdldFZlcnNpb24oKTsKKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBDMlNvZnRNcGVnMkRlYzo6c2V0RGVjb2RlQXJncyhpdmRfdmlkZW9fZGVjb2RlX2lwX3QgKnBzX2RlY29kZV9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9vcF90ICpwc19kZWNvZGVfb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVhZFZpZXcgKmluQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkdyYXBoaWNWaWV3ICpvdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdHNNYXJrZXIpIHsKKyAgICB1aW50MzJfdCBkaXNwbGF5U3RyaWRlID0gbVN0cmlkZTsKKyAgICB1aW50MzJfdCBkaXNwbGF5SGVpZ2h0ID0gbUhlaWdodDsKKyAgICBzaXplX3QgbHVtYVNpemUgPSBkaXNwbGF5U3RyaWRlICogZGlzcGxheUhlaWdodDsKKyAgICBzaXplX3QgY2hyb21hU2l6ZSA9IGx1bWFTaXplID4+IDI7CisKKyAgICBwc19kZWNvZGVfaXAtPnU0X3NpemUgPSBzaXplb2YoaXZkX3ZpZGVvX2RlY29kZV9pcF90KTsKKyAgICBwc19kZWNvZGVfaXAtPmVfY21kID0gSVZEX0NNRF9WSURFT19ERUNPREU7CisgICAgaWYgKGluQnVmZmVyKSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfdHMgPSB0c01hcmtlcjsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5wdl9zdHJlYW1fYnVmZmVyID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGluQnVmZmVyLT5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfbnVtX0J5dGVzID0gaW5TaXplOworICAgIH0gZWxzZSB7CisgICAgICAgIHBzX2RlY29kZV9pcC0+dTRfdHMgPSAwOworICAgICAgICBwc19kZWNvZGVfaXAtPnB2X3N0cmVhbV9idWZmZXIgPSBudWxscHRyOworICAgICAgICBwc19kZWNvZGVfaXAtPnU0X251bV9CeXRlcyA9IDA7CisgICAgfQorICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnU0X21pbl9vdXRfYnVmX3NpemVbMF0gPSBsdW1hU2l6ZTsKKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzFdID0gY2hyb21hU2l6ZTsKKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9taW5fb3V0X2J1Zl9zaXplWzJdID0gY2hyb21hU2l6ZTsKKyAgICBpZiAob3V0QnVmZmVyKSB7CisgICAgICAgIGlmIChvdXRCdWZmZXItPndpZHRoKCkgPCBkaXNwbGF5U3RyaWRlIHx8IG91dEJ1ZmZlci0+aGVpZ2h0KCkgPCBkaXNwbGF5SGVpZ2h0KSB7CisgICAgICAgICAgICBBTE9HRSgiT3V0cHV0IGJ1ZmZlciB0b28gc21hbGw6IHByb3ZpZGVkICglZHglZCkgcmVxdWlyZWQgKCV1eCV1KSIsCisgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPndpZHRoKCksIG91dEJ1ZmZlci0+aGVpZ2h0KCksIGRpc3BsYXlTdHJpZGUsIGRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzBdID0gb3V0QnVmZmVyLT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgICAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci5wdTFfYnVmc1sxXSA9IG91dEJ1ZmZlci0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMl0gPSBvdXRCdWZmZXItPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHNfZGVjb2RlX2lwLT5zX291dF9idWZmZXIucHUxX2J1ZnNbMF0gPSBtT3V0QnVmZmVyRHJhaW47CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzFdID0gbU91dEJ1ZmZlckRyYWluICsgbHVtYVNpemU7CisgICAgICAgIHBzX2RlY29kZV9pcC0+c19vdXRfYnVmZmVyLnB1MV9idWZzWzJdID0gbU91dEJ1ZmZlckRyYWluICsgbHVtYVNpemUgKyBjaHJvbWFTaXplOworICAgIH0KKyAgICBwc19kZWNvZGVfaXAtPnNfb3V0X2J1ZmZlci51NF9udW1fYnVmcyA9IDM7CisgICAgcHNfZGVjb2RlX29wLT51NF9zaXplID0gc2l6ZW9mKGl2ZF92aWRlb19kZWNvZGVfb3BfdCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworCitib29sIEMyU29mdE1wZWcyRGVjOjpnZXRTZXFJbmZvKCkgeworICAgIGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX2lwX3Qgc19jdGxfZ2V0X3NlcV9pbmZvX2lwOworICAgIGl2ZGV4dF9jdGxfZ2V0X3NlcV9pbmZvX29wX3Qgc19jdGxfZ2V0X3NlcV9pbmZvX29wOworCisgICAgc19jdGxfZ2V0X3NlcV9pbmZvX2lwLnU0X3NpemUgPSBzaXplb2YoaXZkZXh0X2N0bF9nZXRfc2VxX2luZm9faXBfdCk7CisgICAgc19jdGxfZ2V0X3NlcV9pbmZvX2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19jdGxfZ2V0X3NlcV9pbmZvX2lwLmVfc3ViX2NtZCA9CisgICAgICAgIChJVkRfQ09OVFJPTF9BUElfQ09NTUFORF9UWVBFX1QpSU1QRUcyRF9DTURfQ1RMX0dFVF9TRVFfSU5GTzsKKyAgICBzX2N0bF9nZXRfc2VxX2luZm9fb3AudTRfc2l6ZSA9IHNpemVvZihpdmRleHRfY3RsX2dldF9zZXFfaW5mb19vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfY3RsX2dldF9zZXFfaW5mb19pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfY3RsX2dldF9zZXFfaW5mb19vcCk7CisgICAgaWYgKHN0YXR1cyAhPSBJVl9TVUNDRVNTKSB7CisgICAgICAgIEFMT0dXKCJFcnJvciBpbiBnZXR0aW5nIFNlcXVlbmNlIGluZm86IDB4JXgiLCBzX2N0bF9nZXRfc2VxX2luZm9fb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBWdWlDb2xvckFzcGVjdHMgdnVpQ29sb3JBc3BlY3RzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5wcmltYXJpZXMgPSBzX2N0bF9nZXRfc2VxX2luZm9fb3AudTFfY29sb3VyX3ByaW1hcmllczsKKyAgICB2dWlDb2xvckFzcGVjdHMudHJhbnNmZXIgPSBzX2N0bF9nZXRfc2VxX2luZm9fb3AudTFfdHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzOworICAgIHZ1aUNvbG9yQXNwZWN0cy5jb2VmZnMgPSBzX2N0bF9nZXRfc2VxX2luZm9fb3AudTFfbWF0cml4X2NvZWZmaWNpZW50czsKKyAgICB2dWlDb2xvckFzcGVjdHMuZnVsbFJhbmdlID0gIGZhbHNlOyAgLy8gbXBlZzIgdmlkZW8gaGFzIGxpbWl0ZWQgcmFuZ2UuCisKKyAgICAvLyBjb252ZXJ0IHZ1aSBhc3BlY3RzIHRvIEMyIHZhbHVlcyBpZiBjaGFuZ2VkCisgICAgaWYgKCEodnVpQ29sb3JBc3BlY3RzID09IG1CaXRzdHJlYW1Db2xvckFzcGVjdHMpKSB7CisgICAgICAgIG1CaXRzdHJlYW1Db2xvckFzcGVjdHMgPSB2dWlDb2xvckFzcGVjdHM7CisgICAgICAgIENvbG9yQXNwZWN0cyBzZkFzcGVjdHM7CisgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6aW5wdXQgY29kZWRBc3BlY3RzID0geyAwdSB9OworICAgICAgICBDb2xvclV0aWxzOjpjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMoCisgICAgICAgICAgICAgICAgdnVpQ29sb3JBc3BlY3RzLnByaW1hcmllcywgdnVpQ29sb3JBc3BlY3RzLnRyYW5zZmVyLCB2dWlDb2xvckFzcGVjdHMuY29lZmZzLAorICAgICAgICAgICAgICAgIHZ1aUNvbG9yQXNwZWN0cy5mdWxsUmFuZ2UsIHNmQXNwZWN0cyk7CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVByaW1hcmllcywgJmNvZGVkQXNwZWN0cy5wcmltYXJpZXMpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMucHJpbWFyaWVzID0gQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVEOworICAgICAgICB9CisgICAgICAgIGlmICghQzJNYXBwZXI6Om1hcChzZkFzcGVjdHMubVJhbmdlLCAmY29kZWRBc3BlY3RzLnJhbmdlKSkgeworICAgICAgICAgICAgY29kZWRBc3BlY3RzLnJhbmdlID0gQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tTWF0cml4Q29lZmZzLCAmY29kZWRBc3BlY3RzLm1hdHJpeCkpIHsKKyAgICAgICAgICAgIGNvZGVkQXNwZWN0cy5tYXRyaXggPSBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFDMk1hcHBlcjo6bWFwKHNmQXNwZWN0cy5tVHJhbnNmZXIsICZjb2RlZEFzcGVjdHMudHJhbnNmZXIpKSB7CisgICAgICAgICAgICBjb2RlZEFzcGVjdHMudHJhbnNmZXIgPSBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRDsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICh2b2lkKW1JbnRmLT5jb25maWcoeyZjb2RlZEFzcGVjdHN9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6c2V0Rmx1c2hNb2RlKCkgeworICAgIGl2ZF9jdGxfZmx1c2hfaXBfdCBzX3NldF9mbHVzaF9pcDsKKyAgICBpdmRfY3RsX2ZsdXNoX29wX3Qgc19zZXRfZmx1c2hfb3A7CisKKyAgICBzX3NldF9mbHVzaF9pcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfaXBfdCk7CisgICAgc19zZXRfZmx1c2hfaXAuZV9jbWQgPSBJVkRfQ01EX1ZJREVPX0NUTDsKKyAgICBzX3NldF9mbHVzaF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9GTFVTSDsKKyAgICBzX3NldF9mbHVzaF9vcC51NF9zaXplID0gc2l6ZW9mKGl2ZF9jdGxfZmx1c2hfb3BfdCk7CisgICAgSVZfQVBJX0NBTExfU1RBVFVTX1Qgc3RhdHVzID0gaXZkZWNfYXBpX2Z1bmN0aW9uKG1EZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3NldF9mbHVzaF9pcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfc2V0X2ZsdXNoX29wKTsKKyAgICBpZiAoc3RhdHVzICE9IElWX1NVQ0NFU1MpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfc2V0X2ZsdXNoX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpyZXNldERlY29kZXIoKSB7CisgICAgaXZkX2N0bF9yZXNldF9pcF90IHNfcmVzZXRfaXA7CisgICAgaXZkX2N0bF9yZXNldF9vcF90IHNfcmVzZXRfb3A7CisKKyAgICBzX3Jlc2V0X2lwLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9pcF90KTsKKyAgICBzX3Jlc2V0X2lwLmVfY21kID0gSVZEX0NNRF9WSURFT19DVEw7CisgICAgc19yZXNldF9pcC5lX3N1Yl9jbWQgPSBJVkRfQ01EX0NUTF9SRVNFVDsKKyAgICBzX3Jlc2V0X29wLnU0X3NpemUgPSBzaXplb2YoaXZkX2N0bF9yZXNldF9vcF90KTsKKyAgICBJVl9BUElfQ0FMTF9TVEFUVVNfVCBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNfcmVzZXRfaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzX3Jlc2V0X29wKTsKKyAgICBpZiAoSVZfU1VDQ0VTUyAhPSBzdGF0dXMpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIGluICVzOiAweCV4IiwgX19mdW5jX18sIHNfcmVzZXRfb3AudTRfZXJyb3JfY29kZSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICAodm9pZCkgc2V0TnVtQ29yZXMoKTsKKyAgICBtU3RyaWRlID0gMDsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDMlNvZnRNcGVnMkRlYzo6cmVzZXRQbHVnaW4oKSB7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIGdldHRpbWVvZmRheSgmbVRpbWVTdGFydCwgbnVsbHB0cik7CisgICAgZ2V0dGltZW9mZGF5KCZtVGltZUVuZCwgbnVsbHB0cik7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpkZWxldGVEZWNvZGVyKCkgeworICAgIGlmIChtTWVtUmVjb3JkcykgeworICAgICAgICBpdl9tZW1fcmVjX3QgKnBzX21lbV9yZWMgPSBtTWVtUmVjb3JkczsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OdW1NZW1SZWNvcmRzOyBpKyssIHBzX21lbV9yZWMrKykgeworICAgICAgICAgICAgaWYgKHBzX21lbV9yZWMtPnB2X2Jhc2UpIHsKKyAgICAgICAgICAgICAgICBpdmRfYWxpZ25lZF9mcmVlKHBzX21lbV9yZWMtPnB2X2Jhc2UpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGl2ZF9hbGlnbmVkX2ZyZWUobU1lbVJlY29yZHMpOworICAgICAgICBtTWVtUmVjb3JkcyA9IG51bGxwdHI7CisgICAgfQorICAgIG1EZWNIYW5kbGUgPSBudWxscHRyOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6cmVJbml0RGVjb2RlcigpIHsKKyAgICBkZWxldGVEZWNvZGVyKCk7CisKKyAgICBzdGF0dXNfdCByZXQgPSBpbml0RGVjb2RlcigpOworICAgIGlmIChPSyAhPSByZXQpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGRlY29kZXIiKTsKKyAgICAgICAgZGVsZXRlRGVjb2RlcigpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRNcGVnMkRlYzo6ZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoc3RkOjptb3ZlKG1PdXRCbG9jayksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChtV2lkdGgsIG1IZWlnaHQpKTsKKyAgICBtT3V0QmxvY2sgPSBudWxscHRyOworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIGJ1ZmZlci0+c2V0SW5mbyhtSW50Zi0+Z2V0Q29sb3JBc3BlY3RzX2woKSk7CisgICAgfQorCisgICAgY2xhc3MgRmlsbFdvcmsgeworICAgICAgIHB1YmxpYzoKKyAgICAgICAgRmlsbFdvcmsodWludDMyX3QgZmxhZ3MsIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3JkaW5hbCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgYnVmZmVyKQorICAgICAgICAgICAgOiBtRmxhZ3MoZmxhZ3MpLCBtT3JkaW5hbChvcmRpbmFsKSwgbUJ1ZmZlcihidWZmZXIpIHt9CisgICAgICAgIH5GaWxsV29yaygpID0gZGVmYXVsdDsKKworICAgICAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCltRmxhZ3M7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSBtT3JkaW5hbDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKG1CdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoInRpbWVzdGFtcCA9ICVsbGQsIGluZGV4ID0gJWxsZCwgdy8lcyBidWZmZXIiLAorICAgICAgICAgICAgICAgICAgbU9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpLCBtT3JkaW5hbC5mcmFtZUluZGV4LnBlZWtsbCgpLAorICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA/ICIiIDogIm8iKTsKKyAgICAgICAgfQorCisgICAgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3QgdWludDMyX3QgbUZsYWdzOworICAgICAgICBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0IG1PcmRpbmFsOworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IG1CdWZmZXI7CisgICAgfTsKKworICAgIGF1dG8gZmlsbFdvcmsgPSBbYnVmZmVyXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB9OworICAgIGlmICh3b3JrICYmIGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpIHsKKyAgICAgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgICAgIC8vIFRPRE86IENoZWNrIGlmIGNsb25lQW5kU2VuZCBjYW4gYmUgYXZvaWRlZCBieSB0cmFja2luZyBudW1iZXIgb2YgZnJhbWVzIHJlbWFpbmluZworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgbU91dEluZGV4ID0gaW5kZXg7CisgICAgICAgICAgICAgICAgQzJXb3JrT3JkaW5hbFN0cnVjdCBvdXRPcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgICAgICAgICBjbG9uZUFuZFNlbmQoCisgICAgICAgICAgICAgICAgICAgIG1PdXRJbmRleCwgd29yaywKKyAgICAgICAgICAgICAgICAgICAgRmlsbFdvcmsoQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSwgb3V0T3JkaW5hbCwgYnVmZmVyKSk7CisgICAgICAgICAgICAgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaChpbmRleCwgZmlsbFdvcmspOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzJEZWM6OmVuc3VyZURlY29kZXJTdGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgaWYgKCFtRGVjSGFuZGxlKSB7CisgICAgICAgIEFMT0dFKCJub3Qgc3VwcG9zZWQgdG8gYmUgaGVyZSwgaW52YWxpZCBkZWNvZGVyIGNvbnRleHQiKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisgICAgaWYgKG1TdHJpZGUgIT0gQUxJR042NChtV2lkdGgpKSB7CisgICAgICAgIG1TdHJpZGUgPSBBTElHTjY0KG1XaWR0aCk7CisgICAgICAgIGlmIChPSyAhPSBzZXRQYXJhbXMobVN0cmlkZSkpIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2sgJiYKKyAgICAgICAgICAgIChtT3V0QmxvY2stPndpZHRoKCkgIT0gbVN0cmlkZSB8fCBtT3V0QmxvY2stPmhlaWdodCgpICE9IG1IZWlnaHQpKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAoIW1PdXRCbG9jaykgeworICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2sobVN0cmlkZSwgbUhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJm1PdXRCbG9jayk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJwcm92aWRlZCAoJWR4JWQpIHJlcXVpcmVkICglZHglZCkiLAorICAgICAgICAgICAgICBtT3V0QmxvY2stPndpZHRoKCksIG1PdXRCbG9jay0+aGVpZ2h0KCksIG1TdHJpZGUsIG1IZWlnaHQpOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gVE9ETzogY2FuIG92ZXJhbGwgZXJyb3IgY2hlY2tpbmcgYmUgaW1wcm92ZWQ/CisvLyBUT0RPOiBhbGxvdyBjb25maWd1cmF0aW9uIG9mIGNvbG9yIGZvcm1hdCBhbmQgdXNhZ2UgZm9yIGdyYXBoaWMgYnVmZmVycyBpbnN0ZWFkCisvLyAgICAgICBvZiBoYXJkIGNvZGluZyB0aGVtIHRvIEhBTF9QSVhFTF9GT1JNQVRfWVYxMgorLy8gVE9ETzogcGFzcyBjb2xvcmFzcGVjdHMgaW5mb3JtYXRpb24gdG8gc3VyZmFjZQorLy8gVE9ETzogdGVzdCBzdXBwb3J0IGZvciBkeW5hbWljIGNoYW5nZSBpbiByZXNvbHV0aW9uCisvLyBUT0RPOiB2ZXJpZnkgaWYgdGhlIGRlY29kZXIgc2VudCBiYWNrIGFsbCBmcmFtZXMKK3ZvaWQgQzJTb2Z0TXBlZzJEZWM6OnByb2Nlc3MoCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMHU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICB1aW50MzJfdCB3b3JrSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSAmIDB4RkZGRkZGRkY7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBlb3MgPSAoKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMCk7CisgICAgYm9vbCBoYXNQaWN0dXJlID0gZmFsc2U7CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHNpemUgJXp1IHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkLCBmbGFncyAleCIsCisgICAgICAgICAgaW5TaXplLCAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksCisgICAgICAgICAgKGludCl3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgd29yay0+aW5wdXQuZmxhZ3MpOworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGlmIChDMl9PSyAhPSBlbnN1cmVEZWNvZGVyU3RhdGUocG9vbCkpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEMyR3JhcGhpY1ZpZXcgd1ZpZXcgPSBtT3V0QmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoImdyYXBoaWMgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX2lwX3Qgc19kZWNvZGVfaXA7CisgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCBzX2RlY29kZV9vcDsKKyAgICAgICAgaWYgKCFzZXREZWNvZGVBcmdzKCZzX2RlY29kZV9pcCwgJnNfZGVjb2RlX29wLCAmclZpZXcsICZ3VmlldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGluT2Zmc2V0ICsgaW5Qb3MsIGluU2l6ZSAtIGluUG9zLCB3b3JrSW5kZXgpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBJZiBpbnB1dCBkdW1wIGlzIGVuYWJsZWQsIHRoZW4gd3JpdGUgdG8gZmlsZQorICAgICAgICBEVU1QX1RPX0ZJTEUobUluRmlsZSwgc19kZWNvZGVfaXAucHZfc3RyZWFtX2J1ZmZlciwgc19kZWNvZGVfaXAudTRfbnVtX0J5dGVzKTsKKyAgICAgICAgV09SRDMyIGRlbGF5OworICAgICAgICBHRVRUSU1FKCZtVGltZVN0YXJ0LCBudWxscHRyKTsKKyAgICAgICAgVElNRV9ESUZGKG1UaW1lRW5kLCBtVGltZVN0YXJ0LCBkZWxheSk7CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBXT1JEMzIgZGVjb2RlVGltZTsKKyAgICAgICAgR0VUVElNRSgmbVRpbWVFbmQsIG51bGxwdHIpOworICAgICAgICBUSU1FX0RJRkYobVRpbWVTdGFydCwgbVRpbWVFbmQsIGRlY29kZVRpbWUpOworICAgICAgICBBTE9HVigiZGVjb2RlVGltZT0lNmQgZGVsYXk9JTZkIG51bUJ5dGVzPSU2ZCAiLCBkZWNvZGVUaW1lLCBkZWxheSwKKyAgICAgICAgICAgICAgc19kZWNvZGVfb3AudTRfbnVtX2J5dGVzX2NvbnN1bWVkKTsKKyAgICAgICAgaWYgKElNUEVHMkRfVU5TVVBQT1JURURfRElNRU5TSU9OUyA9PSBzX2RlY29kZV9vcC51NF9lcnJvcl9jb2RlKSB7CisgICAgICAgICAgICBBTE9HVigidW5zdXBwb3J0ZWQgcmVzb2x1dGlvbiA6ICVkeCVkIiwgc19kZWNvZGVfb3AudTRfcGljX3dkLCBzX2RlY29kZV9vcC51NF9waWNfaHQpOworICAgICAgICAgICAgZHJhaW5JbnRlcm5hbChEUkFJTl9DT01QT05FTlRfTk9fRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgICAgIHJlc2V0UGx1Z2luKCk7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgICAgICAgICAgbVdpZHRoID0gc19kZWNvZGVfb3AudTRfcGljX3dkOworICAgICAgICAgICAgbUhlaWdodCA9IHNfZGVjb2RlX29wLnU0X3BpY19odDsKKworICAgICAgICAgICAgQUxPR0koIkNvbmZpZ3VyaW5nIGRlY29kZXI6IG1XaWR0aCAlZCAsIG1IZWlnaHQgJWQgIiwKKyAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3Qgc2V0IHdpZHRoIGFuZCBoZWlnaHQiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKE9LICE9IHJlSW5pdERlY29kZXIoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVpbml0aWFsaXplIGRlY29kZXIiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKElWRF9SRVNfQ0hBTkdFRCA9PSAoc19kZWNvZGVfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKSB7CisgICAgICAgICAgICBBTE9HVigicmVzb2x1dGlvbiBjaGFuZ2VkIik7CisgICAgICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9OT19FT1MsIHBvb2wsIHdvcmspOworICAgICAgICAgICAgcmVzZXREZWNvZGVyKCk7CisgICAgICAgICAgICByZXNldFBsdWdpbigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgwIDwgc19kZWNvZGVfb3AudTRfcGljX3dkICYmIDAgPCBzX2RlY29kZV9vcC51NF9waWNfaHQpIHsKKyAgICAgICAgICAgIGlmIChzX2RlY29kZV9vcC51NF9waWNfd2QgIT0gbVdpZHRoIHx8ICBzX2RlY29kZV9vcC51NF9waWNfaHQgIT0gbUhlaWdodCkgeworICAgICAgICAgICAgICAgIG1XaWR0aCA9IHNfZGVjb2RlX29wLnU0X3BpY193ZDsKKyAgICAgICAgICAgICAgICBtSGVpZ2h0ID0gc19kZWNvZGVfb3AudTRfcGljX2h0OworICAgICAgICAgICAgICAgIENIRUNLX0VRKDB1LCBzX2RlY29kZV9vcC51NF9vdXRwdXRfcHJlc2VudCk7CisKKyAgICAgICAgICAgICAgICBBTE9HSSgiQ29uZmlndXJpbmcgZGVjb2RlciBvdXQ6IG1XaWR0aCAlZCAsIG1IZWlnaHQgJWQgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgICAgICAgICAgICAgIG1JbnRmLT5jb25maWcoeyZzaXplfSwgQzJfTUFZX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KHNpemUpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IHNldCB3aWR0aCBhbmQgaGVpZ2h0Iik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICh2b2lkKSBnZXRTZXFJbmZvKCk7CisgICAgICAgIGhhc1BpY3R1cmUgfD0gKDEgPT0gc19kZWNvZGVfb3AudTRfZnJhbWVfZGVjb2RlZF9mbGFnKTsKKyAgICAgICAgaWYgKHNfZGVjb2RlX29wLnU0X291dHB1dF9wcmVzZW50KSB7CisgICAgICAgICAgICBmaW5pc2hXb3JrKHNfZGVjb2RlX29wLnU0X3RzLCB3b3JrKTsKKyAgICAgICAgfQorCisgICAgICAgIGluUG9zICs9IHNfZGVjb2RlX29wLnU0X251bV9ieXRlc19jb25zdW1lZDsKKyAgICAgICAgaWYgKGhhc1BpY3R1cmUgJiYgKGluU2l6ZSAtIGluUG9zKSAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRCgiZGVjb2RlZCBmcmFtZSBpbiBjdXJyZW50IGFjY2VzcyBuYWwsIGlnbm9yaW5nIGZ1cnRoZXIgdHJhaWxpbmcgYnl0ZXMgJWQiLAorICAgICAgICAgICAgICAgICAgKGludClpblNpemUgLSAoaW50KWluUG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVvcykgeworICAgICAgICBkcmFpbkludGVybmFsKERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywgcG9vbCwgd29yayk7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoIWhhc1BpY3R1cmUpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWcyRGVjOjpkcmFpbkludGVybmFsKAorICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGlmIChPSyAhPSBzZXRGbHVzaE1vZGUoKSkgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpZiAoQzJfT0sgIT0gZW5zdXJlRGVjb2RlclN0YXRlKHBvb2wpKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IG1PdXRCbG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgaXZkX3ZpZGVvX2RlY29kZV9pcF90IHNfZGVjb2RlX2lwOworICAgICAgICBpdmRfdmlkZW9fZGVjb2RlX29wX3Qgc19kZWNvZGVfb3A7CisgICAgICAgIGlmICghc2V0RGVjb2RlQXJncygmc19kZWNvZGVfaXAsICZzX2RlY29kZV9vcCwgbnVsbHB0ciwgJndWaWV3LCAwLCAwLCAwKSkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgICh2b2lkKSBpdmRlY19hcGlfZnVuY3Rpb24obURlY0hhbmRsZSwgJnNfZGVjb2RlX2lwLCAmc19kZWNvZGVfb3ApOworICAgICAgICBpZiAoc19kZWNvZGVfb3AudTRfb3V0cHV0X3ByZXNlbnQpIHsKKyAgICAgICAgICAgIGZpbmlzaFdvcmsoc19kZWNvZGVfb3AudTRfdHMsIHdvcmspOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnMkRlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIHJldHVybiBkcmFpbkludGVybmFsKGRyYWluTW9kZSwgcG9vbCwgbnVsbHB0cik7Cit9CisKK2NsYXNzIEMyU29mdE1wZWcyRGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdE1wZWcyRGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICAgICAgbmV3IEMyU29mdE1wZWcyRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRNcGVnMkRlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRNcGVnMkRlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWcyRGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0TXBlZzJEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRNcGVnMkRlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzIvQzJTb2Z0TXBlZzJEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjVkM2I4NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWcyL0MyU29mdE1wZWcyRGVjLmgKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9NUEVHMl9ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX01QRUcyX0RFQ19IXworCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKworI2luY2x1ZGUgIml2X2RhdGF0eXBlZGVmLmgiCisjaW5jbHVkZSAiaXYuaCIKKyNpbmNsdWRlICJpdmQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIGl2ZGVjX2FwaV9mdW5jdGlvbiAgICAgICAgICAgICAgaW1wZWcyZF9hcGlfZnVuY3Rpb24KKyNkZWZpbmUgaXZkZXh0X2luaXRfaXBfdCAgICAgICAgICAgICAgICBpbXBlZzJkX2luaXRfaXBfdAorI2RlZmluZSBpdmRleHRfaW5pdF9vcF90ICAgICAgICAgICAgICAgIGltcGVnMmRfaW5pdF9vcF90CisjZGVmaW5lIGl2ZGV4dF9maWxsX21lbV9yZWNfaXBfdCAgICAgICAgaW1wZWcyZF9maWxsX21lbV9yZWNfaXBfdAorI2RlZmluZSBpdmRleHRfZmlsbF9tZW1fcmVjX29wX3QgICAgICAgIGltcGVnMmRfZmlsbF9tZW1fcmVjX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QgICBpbXBlZzJkX2N0bF9zZXRfbnVtX2NvcmVzX2lwX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9zZXRfbnVtX2NvcmVzX29wX3QgICBpbXBlZzJkX2N0bF9zZXRfbnVtX2NvcmVzX29wX3QKKyNkZWZpbmUgaXZkZXh0X2N0bF9nZXRfc2VxX2luZm9faXBfdCAgICBpbXBlZzJkX2N0bF9nZXRfc2VxX2luZm9faXBfdAorI2RlZmluZSBpdmRleHRfY3RsX2dldF9zZXFfaW5mb19vcF90ICAgIGltcGVnMmRfY3RsX2dldF9zZXFfaW5mb19vcF90CisjZGVmaW5lIEFMSUdONjQoeCkgICAgICAgICAgICAgICAgICAgICAgKCgoKHgpICsgNjMpID4+IDYpIDw8IDYpCisjZGVmaW5lIE1BWF9OVU1fQ09SRVMgICAgICAgICAgICAgICAgICAgNAorI2RlZmluZSBJVkRFWFRfQ01EX0NUTF9TRVRfTlVNX0NPUkVTICAgIFwKKyAgICAgICAgKElWRF9DT05UUk9MX0FQSV9DT01NQU5EX1RZUEVfVClJTVBFRzJEX0NNRF9DVExfU0VUX05VTV9DT1JFUworI2RlZmluZSBNSU4oYSwgYikgICAgICAgICAgICAgICAgICAgICAgICgoKGEpIDwgKGIpKSA/IChhKSA6IChiKSkKKyNkZWZpbmUgR0VUVElNRShhLCBiKSAgICAgICAgICAgICAgICAgICBnZXR0aW1lb2ZkYXkoYSwgYik7CisjZGVmaW5lIFRJTUVfRElGRihzdGFydCwgZW5kLCBkaWZmKSAgICAgXAorICAgIGRpZmYgPSAoKChlbmQpLnR2X3NlYyAtIChzdGFydCkudHZfc2VjKSAqIDEwMDAwMDApICsgXAorICAgICAgICAgICAgKChlbmQpLnR2X3VzZWMgLSAoc3RhcnQpLnR2X3VzZWMpOworCisjaWZkZWYgRklMRV9EVU1QX0VOQUJMRQorICAgICNkZWZpbmUgSU5QVVRfRFVNUF9QQVRIICAgICAiL3NkY2FyZC9jbGlwcy9tcGVnMmRfaW5wdXQiCisgICAgI2RlZmluZSBJTlBVVF9EVU1QX0VYVCAgICAgICJtMnYiCisgICAgI2RlZmluZSBHRU5FUkFURV9GSUxFX05BTUVTKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdFVFRJTUUoJm1UaW1lU3RhcnQsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0cmNweShtSW5GaWxlLCAiIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHNwcmludGYobUluRmlsZSwgIiVzXyVsZC4lbGQuJXMiLCBJTlBVVF9EVU1QX1BBVEgsICBcCisgICAgICAgICAgICAgICAgbVRpbWVTdGFydC50dl9zZWMsIG1UaW1lU3RhcnQudHZfdXNlYywgICAgICBcCisgICAgICAgICAgICAgICAgSU5QVVRfRFVNUF9FWFQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorICAgICNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKSB7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICBGSUxFICpmcCA9IGZvcGVuKG1fZmlsZW5hbWUsICJ3YiIpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoZnAgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZmNsb3NlKGZwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBvcGVuIGZpbGUgJXMiLCBtX2ZpbGVuYW1lKTsgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyAgICAjZGVmaW5lIERVTVBfVE9fRklMRShtX2ZpbGVuYW1lLCBtX2J1ZiwgbV9zaXplKSAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgRklMRSAqZnAgPSBmb3BlbihtX2ZpbGVuYW1lLCAiYWIiKTsgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKGZwICE9IE5VTEwgJiYgbV9idWYgIT0gTlVMTCkgeyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHVpbnQzMl90IGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGkgPSBmd3JpdGUobV9idWYsIDEsIG1fc2l6ZSwgZnApOyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJmd3JpdGUgcmV0ICVkIHRvIHdyaXRlICVkIiwgaSwgbV9zaXplKTsgIFwKKyAgICAgICAgICAgIGlmIChpICE9ICh1aW50MzJfdCltX3NpemUpIHsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBBTE9HRCgiRXJyb3IgaW4gZndyaXRlLCByZXR1cm5lZCAlZCIsIGkpOyAgIFwKKyAgICAgICAgICAgICAgICBwZXJyb3IoIkVycm9yIGluIHdyaXRlIHRvIGZpbGUiKTsgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZjbG9zZShmcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3Qgd3JpdGUgdG8gZmlsZSAlcyIsIG1fZmlsZW5hbWUpO1wKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZSAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisgICAgI2RlZmluZSBJTlBVVF9EVU1QX1BBVEgKKyAgICAjZGVmaW5lIElOUFVUX0RVTVBfRVhUCisgICAgI2RlZmluZSBPVVRQVVRfRFVNUF9QQVRICisgICAgI2RlZmluZSBPVVRQVVRfRFVNUF9FWFQKKyAgICAjZGVmaW5lIEdFTkVSQVRFX0ZJTEVfTkFNRVMoKQorICAgICNkZWZpbmUgQ1JFQVRFX0RVTVBfRklMRShtX2ZpbGVuYW1lKQorICAgICNkZWZpbmUgRFVNUF9UT19GSUxFKG1fZmlsZW5hbWUsIG1fYnVmLCBtX3NpemUpCisjZW5kaWYgLyogRklMRV9EVU1QX0VOQUJMRSAqLworCitzdHJ1Y3QgQzJTb2Z0TXBlZzJEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0TXBlZzJEZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcGVnMkRlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyBwcml2YXRlOgorICAgIHN0YXR1c190IGdldE51bU1lbVJlY29yZHMoKTsKKyAgICBzdGF0dXNfdCBmaWxsTWVtUmVjb3JkcygpOworICAgIHN0YXR1c190IGNyZWF0ZURlY29kZXIoKTsKKyAgICBzdGF0dXNfdCBzZXROdW1Db3JlcygpOworICAgIHN0YXR1c190IHNldFBhcmFtcyhzaXplX3Qgc3RyaWRlKTsKKyAgICBzdGF0dXNfdCBnZXRWZXJzaW9uKCk7CisgICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBib29sIHNldERlY29kZUFyZ3MoaXZkX3ZpZGVvX2RlY29kZV9pcF90ICpwc19kZWNvZGVfaXAsCisgICAgICAgICAgICAgICAgICAgICAgIGl2ZF92aWRlb19kZWNvZGVfb3BfdCAqcHNfZGVjb2RlX29wLAorICAgICAgICAgICAgICAgICAgICAgICBDMlJlYWRWaWV3ICppbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgQzJHcmFwaGljVmlldyAqb3V0QnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHRzTWFya2VyKTsKKyAgICBib29sIGdldFNlcUluZm8oKTsKKyAgICBjMl9zdGF0dXNfdCBlbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgc3RhdHVzX3Qgc2V0Rmx1c2hNb2RlKCk7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgc3RhdHVzX3QgcmVzZXREZWNvZGVyKCk7CisgICAgdm9pZCByZXNldFBsdWdpbigpOworICAgIHN0YXR1c190IGRlbGV0ZURlY29kZXIoKTsKKyAgICBzdGF0dXNfdCByZUluaXREZWNvZGVyKCk7CisKKyAgICAvLyBUT0RPOlRoaXMgaXMgbm90IHRoZSByaWdodCBwbGFjZSBmb3IgdGhpcyBlbnVtLiBUaGVzZSBzaG91bGQKKyAgICAvLyBiZSBwYXJ0IG9mIGMyLXZuZGsgc28gdGhhdCB0aGV5IGNhbiBiZSBhY2Nlc3NlZCBieSBhbGwgdmlkZW8gcGx1Z2lucworICAgIC8vIHVudGlsIHRoZW4sIG1ha2UgdGhlbSBmZWVsIGF0IGhvbWUKKyAgICBlbnVtIHsKKyAgICAgICAga05vdFN1cHBvcnRlZCwKKyAgICAgICAga1ByZWZlckJpdHN0cmVhbSwKKyAgICAgICAga1ByZWZlckNvbnRhaW5lciwKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBpdl9vYmpfdCAqbURlY0hhbmRsZTsKKyAgICBpdl9tZW1fcmVjX3QgKm1NZW1SZWNvcmRzOworICAgIHNpemVfdCBtTnVtTWVtUmVjb3JkczsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IG1PdXRCbG9jazsKKyAgICB1aW50OF90ICptT3V0QnVmZmVyRHJhaW47CisKKyAgICBzaXplX3QgbU51bUNvcmVzOworICAgIElWX0NPTE9SX0ZPUk1BVF9UIG1JdkNvbG9yZm9ybWF0OworCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgdWludDMyX3QgbVN0cmlkZTsKKyAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgc3RkOjphdG9taWNfdWludDY0X3QgbU91dEluZGV4OworCisgICAgLy8gQ29sb3IgYXNwZWN0cy4gVGhlc2UgYXJlIElTTyB2YWx1ZXMgYW5kIGFyZSBtZWFudCB0byBkZXRlY3QgY2hhbmdlcyBpbiBhc3BlY3RzIHRvIGF2b2lkCisgICAgLy8gY29udmVydGluZyB0aGVtIHRvIEMyIHZhbHVlcyBmb3IgZWFjaCBmcmFtZQorICAgIHN0cnVjdCBWdWlDb2xvckFzcGVjdHMgeworICAgICAgICB1aW50OF90IHByaW1hcmllczsKKyAgICAgICAgdWludDhfdCB0cmFuc2ZlcjsKKyAgICAgICAgdWludDhfdCBjb2VmZnM7CisgICAgICAgIHVpbnQ4X3QgZnVsbFJhbmdlOworCisgICAgICAgIC8vIGRlZmF1bHQgY29sb3IgYXNwZWN0cworICAgICAgICBWdWlDb2xvckFzcGVjdHMoKQorICAgICAgICAgICAgOiBwcmltYXJpZXMoMiksIHRyYW5zZmVyKDIpLCBjb2VmZnMoMiksIGZ1bGxSYW5nZSgwKSB7IH0KKworICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgVnVpQ29sb3JBc3BlY3RzICZvKSB7CisgICAgICAgICAgICByZXR1cm4gcHJpbWFyaWVzID09IG8ucHJpbWFyaWVzICYmIHRyYW5zZmVyID09IG8udHJhbnNmZXIgJiYgY29lZmZzID09IG8uY29lZmZzCisgICAgICAgICAgICAgICAgICAgICYmIGZ1bGxSYW5nZSA9PSBvLmZ1bGxSYW5nZTsKKyAgICAgICAgfQorICAgIH0gbUJpdHN0cmVhbUNvbG9yQXNwZWN0czsKKworICAgIC8vIHByb2ZpbGUKKyAgICBzdHJ1Y3QgdGltZXZhbCBtVGltZVN0YXJ0OworICAgIHN0cnVjdCB0aW1ldmFsIG1UaW1lRW5kOworI2lmZGVmIEZJTEVfRFVNUF9FTkFCTEUKKyAgICBjaGFyIG1JbkZpbGVbMjAwXTsKKyNlbmRpZiAvKiBGSUxFX0RVTVBfRU5BQkxFICovCisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRNcGVnMkRlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJfU09GVF9NUEVHMl9ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWU0ZjQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNjYgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfbXBlZzRkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9zaWduZWQtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE1wZWc0RGVjLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAorICAgICAgICAiLURNUEVHNCIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9oMjYzZGVjIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRNcGVnNERlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X21wZWc0ZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisKKyAgICBzcmNzOiBbIkMyU29mdE1wZWc0RW5jLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE1QRUc0IiwKKyAgICAgICAgIi1ET1NDTF9JTVBPUlRfUkVGPSIsCisgICAgXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9oMjYzZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfc2lnbmVkLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMlNvZnRNcGVnNEVuYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbICJsaWJzdGFnZWZyaWdodF9tNHZoMjYzZW5jIiBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNjY4NWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmNwcApAQCAtMCwwICsxLDc1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpZmRlZiBNUEVHNAorICAjZGVmaW5lIExPR19UQUcgIkMyU29mdE1wZWc0RGVjIgorI2Vsc2UKKyAgI2RlZmluZSBMT0dfVEFHICJDMlNvZnRIMjYzRGVjIgorI2VuZGlmCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdE1wZWc0RGVjLmgiCisjaW5jbHVkZSAibXA0ZGVjX2FwaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZmRlZiBNUEVHNAorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm1wZWc0LmRlY29kZXIiOworI2Vsc2UKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5oMjYzLmRlY29kZXIiOworI2VuZGlmCisKK2NsYXNzIEMyU29mdE1wZWc0RGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTywKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0CisjZWxzZQorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMKKyNlbmRpZgorICAgICAgICAgICAgICAgICkgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7IC8vIFRPRE86IGFjY291bnQgZm9yIG91ciBidWZmZXJzIGhlcmUKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICAvLyBUT0RPOiBQcm9wZXIgc3VwcG9ydCBmb3IgcmVvcmRlciBkZXB0aC4KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BY3R1YWxPdXRwdXREZWxheSwgQzJfUEFSQU1LRVlfT1VUUFVUX0RFTEFZKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dCgxdSkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMTc2LCAxNDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDE5MjAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAxMDg4LCAyKSwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMzUyLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjg4LCAyKSwKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyNpZmRlZiBNUEVHNAorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRSwgQzJDb25maWc6OkxFVkVMX01QNFZfMykpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkuZXF1YWxUbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfM0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80QSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl81LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzZ9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyLCBtU2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZWxzZQorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0JBU0VMSU5FLCBDMkNvbmZpZzo6TEVWRUxfSDI2M18zMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfQkFTRUxJTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JU1dWMn0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgbGV2ZWwpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18xMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18yMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M18zMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M180MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfSDI2M180NX0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyNlbmRpZgorCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtTWF4U2l6ZSwgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSkKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0KDB1LCAxOTIwLCAxMDg4KSkKKyNlbHNlCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDM1MiwgMjg4KSkKKyNlbmRpZgorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDIsIDE5MjAsIDIpLAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIGhlaWdodCkuaW5SYW5nZSgyLCAxMDg4LCAyKSwKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMzUyLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjg4LCAyKSwKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorI2lmZGVmIE1QRUc0CisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMTkyMCAqIDEwODggKiAzIC8gMikpCisjZWxzZQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDM1MiAqIDI4OCAqIDMgLyAyKSkKKyNlbmRpZgorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1NYXhJbnB1dFNpemUsIHZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC5jYWxjdWxhdGVkQXMoTWF4SW5wdXRTaXplU2V0dGVyLCBtTWF4U2l6ZSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgbG9jYXRpb25zWzFdID0geyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH07CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICAxdSwgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgbWVtY3B5KGRlZmF1bHRDb2xvckluZm8tPm0ubG9jYXRpb25zLCBsb2NhdGlvbnMsIHNpemVvZihsb2NhdGlvbnMpKTsKKworICAgICAgICBkZWZhdWx0Q29sb3JJbmZvID0KKyAgICAgICAgICAgIEMyU3RyZWFtQ29sb3JJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKAorICAgICAgICAgICAgICAgICAgICB7IEMyQ2hyb21hT2Zmc2V0U3RydWN0OjpJVFVfWVVWXzQyMF8wKCkgfSwKKyAgICAgICAgICAgICAgICAgICAgMHUsIDh1IC8qIGJpdERlcHRoICovLCBDMkNvbG9yOjpZVVZfNDIwKTsKKyAgICAgICAgaGVscGVyLT5hZGRTdHJ1Y3REZXNjcmlwdG9yczxDMkNocm9tYU9mZnNldFN0cnVjdD4oKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbG9ySW5mbywgQzJfUEFSQU1LRVlfQ09ERURfQ09MT1JfSU5GTykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUoZGVmYXVsdENvbG9ySW5mbykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBtb3JlIGZvcm1hdHM/CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUGl4ZWxGb3JtYXQsIEMyX1BBUkFNS0VZX1BJWEVMX0ZPUk1BVCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtUGl4ZWxGb3JtYXRJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHUsIEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgU2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4UGljdHVyZVNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZzaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBUT0RPOiBnZXQgbWF4IHdpZHRoL2hlaWdodCBmcm9tIHRoZSBzaXplJ3MgZmllbGQgaGVscGVycyB2cy4gaGFyZGNvZGluZworI2lmZGVmIE1QRUc0CisgICAgICAgIG1lLnNldCgpLndpZHRoID0gYzJfbWluKGMyX21heChtZS52LndpZHRoLCBzaXplLnYud2lkdGgpLCAxOTIwdSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCAxMDg4dSk7CisjZWxzZQorICAgICAgICBtZS5zZXQoKS53aWR0aCA9IGMyX21pbihjMl9tYXgobWUudi53aWR0aCwgc2l6ZS52LndpZHRoKSwgMzUydSk7CisgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IGMyX21pbihjMl9tYXgobWUudi5oZWlnaHQsIHNpemUudi5oZWlnaHQpLCAyODh1KTsKKyNlbmRpZgorICAgICAgICByZXR1cm4gQzJSOjpPaygpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgTWF4SW5wdXRTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gJm1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtYXhTaXplKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAvLyBhc3N1bWUgY29tcHJlc3Npb24gcmF0aW8gb2YgMQorICAgICAgICBtZS5zZXQoKS52YWx1ZSA9ICgoKG1heFNpemUudi53aWR0aCArIDE1KSAvIDE2KSAqICgobWF4U2l6ZS52LmhlaWdodCArIDE1KSAvIDE2KSAqIDM4NCk7CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXNpemU7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBnZXRNYXhXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIG1NYXhTaXplLT53aWR0aDsgfQorICAgIHVpbnQzMl90IGdldE1heEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIG1NYXhTaXplLT5oZWlnaHQ7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjppbnB1dD4gbVByb2ZpbGVMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4UGljdHVyZVNpemVUdW5pbmc6Om91dHB1dD4gbU1heFNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0PiBtTWF4SW5wdXRTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0PiBtQ29sb3JJbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0PiBtUGl4ZWxGb3JtYXQ7Cit9OworCitDMlNvZnRNcGVnNERlYzo6QzJTb2Z0TXBlZzREZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbURlY0hhbmRsZShudWxscHRyKSwKKyAgICAgIG1PdXRwdXRCdWZmZXJ7fSwKKyAgICAgIG1Jbml0aWFsaXplZChmYWxzZSkgeworfQorCitDMlNvZnRNcGVnNERlYzo6fkMyU29mdE1wZWc0RGVjKCkgeworICAgIG9uUmVsZWFzZSgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6b25TdG9wKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaWYgKG1EZWNIYW5kbGUpIHsKKyAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgICAgICAgfQorICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB9CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwga051bU91dHB1dEJ1ZmZlcnM7ICsraSkgeworICAgICAgICBpZiAobU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgICAgICAgZnJlZShtT3V0cHV0QnVmZmVyW2ldKTsKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorICAgIG1OdW1TYW1wbGVzT3V0cHV0ID0gMDsKKyAgICBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNcGVnNERlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKKyAgICAodm9pZClvbkluaXQoKTsKK30KKwordm9pZCBDMlNvZnRNcGVnNERlYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaWYgKG1EZWNIYW5kbGUpIHsKKyAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgICAgICAgICAgIGRlbGV0ZSBtRGVjSGFuZGxlOworICAgICAgICAgICAgbURlY0hhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorICAgIGlmIChtT3V0QmxvY2spIHsKKyAgICAgICAgbU91dEJsb2NrLnJlc2V0KCk7CisgICAgfQorICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtOdW1PdXRwdXRCdWZmZXJzOyArK2kpIHsKKyAgICAgICAgaWYgKG1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgICAgIGZyZWUobU91dHB1dEJ1ZmZlcltpXSk7CisgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW2ldID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzREZWM6Om9uRmx1c2hfc20oKSB7CisgICAgaWYgKG1Jbml0aWFsaXplZCkgeworICAgICAgICBpZiAoUFZfVFJVRSAhPSBQVlJlc2V0VmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjppbml0RGVjb2RlcigpIHsKKyNpZmRlZiBNUEVHNAorICAgIG1Jc01wZWc0ID0gdHJ1ZTsKKyNlbHNlCisgICAgbUlzTXBlZzQgPSBmYWxzZTsKKyNlbmRpZgorICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBtRGVjSGFuZGxlID0gbmV3IHRhZ3ZpZGVvRGVjQ29udHJvbHM7CisgICAgfQorICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibURlY0hhbmRsZSBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorICAgIG1lbXNldChtRGVjSGFuZGxlLCAwLCBzaXplb2YodGFndmlkZW9EZWNDb250cm9scykpOworCisgICAgLyogVE9ETzogYnJpbmcgdGhlc2UgdmFsdWVzIHRvIDM1MiBhbmQgMjg4LiBJdCBjYW5ub3QgYmUgZG9uZSBhcyBvZiBub3cKKyAgICAgKiBiZWNhdXNlLCBoMjYzIGRvZXNuJ3Qgc2VlbSB0byBhbGxvdyBwb3J0IHJlY29uZmlndXJhdGlvbi4gSW4gT01YLCB0aGUKKyAgICAgKiBwcm9ibGVtIG9mIGxhcmdlciB3aWR0aCBhbmQgaGVpZ2h0IHRoYW4gZGVmYXVsdCB3aWR0aCBhbmQgaGVpZ2h0IGlzCisgICAgICogb3ZlcmNvbWUgYnkgYWRhcHRpdmVQbGF5QmFjaygpIGFwaSBjYWxsLiBUaGlzIGNhbGwgZ2V0cyB3aWR0aCBhbmQgaGVpZ2h0CisgICAgICogaW5mb3JtYXRpb24gZnJvbSBleHRyYWN0b3IuIFN1Y2ggYSB0aGluZyBpcyBub3QgcG9zc2libGUgaGVyZS4KKyAgICAgKiBTbyB3ZSBhcmUgY29uZmlndXJpbmcgdG8gbGFyZ2VyIHZhbHVlcy4qLworICAgIG1XaWR0aCA9IDE0MDg7CisgICAgbUhlaWdodCA9IDExNTI7CisgICAgbU51bVNhbXBsZXNPdXRwdXQgPSAwOworICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgIG1GcmFtZXNDb25maWd1cmVkID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICB9CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzREZWM6OmZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKHN0ZDo6bW92ZShtT3V0QmxvY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlJlY3QobVdpZHRoLCBtSGVpZ2h0KSk7CisgICAgbU91dEJsb2NrID0gbnVsbHB0cjsKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlciwgaW5kZXhdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKSB7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgaWYgKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICYmCisgICAgICAgICAgICAgICAgKGMyX2NudHI2NF90KGluZGV4KSA9PSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgpKSB7CisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIH07CisgICAgaWYgKHdvcmsgJiYgYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2goaW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RGVjOjplbnN1cmVEZWNvZGVyU3RhdGUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIGlmICghbURlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibm90IHN1cHBvc2VkIHRvIGJlIGhlcmUsIGludmFsaWQgZGVjb2RlciBjb250ZXh0Iik7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgbU91dHB1dEJ1ZmZlclNpemUgPSBhbGlnbihtSW50Zi0+Z2V0TWF4V2lkdGgoKSwgMTYpICogYWxpZ24obUludGYtPmdldE1heEhlaWdodCgpLCAxNikgKiAzIC8gMjsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7CisgICAgICAgIGlmICghbU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcltpXSA9ICh1aW50OF90ICopbWFsbG9jKG1PdXRwdXRCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIGlmICghbU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgICAgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1PdXRCbG9jayAmJgorICAgICAgICAgICAgKG1PdXRCbG9jay0+d2lkdGgoKSAhPSBhbGlnbihtV2lkdGgsIDE2KSB8fCBtT3V0QmxvY2stPmhlaWdodCgpICE9IG1IZWlnaHQpKSB7CisgICAgICAgIG1PdXRCbG9jay5yZXNldCgpOworICAgIH0KKyAgICBpZiAoIW1PdXRCbG9jaykgeworICAgICAgICB1aW50MzJfdCBmb3JtYXQgPSBIQUxfUElYRUxfRk9STUFUX1lWMTI7CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soYWxpZ24obVdpZHRoLCAxNiksIG1IZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZtT3V0QmxvY2spOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiZmV0Y2hHcmFwaGljQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpIiwKKyAgICAgICAgICAgICAgbU91dEJsb2NrLT53aWR0aCgpLCBtT3V0QmxvY2stPmhlaWdodCgpLCBtV2lkdGgsIG1IZWlnaHQpOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2Jvb2wgQzJTb2Z0TXBlZzREZWM6OmhhbmRsZVJlc0NoYW5nZShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGRpc3Bfd2lkdGgsIGRpc3BfaGVpZ2h0OworICAgIFBWR2V0VmlkZW9EaW1lbnNpb25zKG1EZWNIYW5kbGUsIChpbnQzMiAqKSZkaXNwX3dpZHRoLCAoaW50MzIgKikmZGlzcF9oZWlnaHQpOworCisgICAgdWludDMyX3QgYnVmX3dpZHRoLCBidWZfaGVpZ2h0OworICAgIFBWR2V0QnVmZmVyRGltZW5zaW9ucyhtRGVjSGFuZGxlLCAoaW50MzIgKikmYnVmX3dpZHRoLCAoaW50MzIgKikmYnVmX2hlaWdodCk7CisKKyAgICBDSEVDS19MRShkaXNwX3dpZHRoLCBidWZfd2lkdGgpOworICAgIENIRUNLX0xFKGRpc3BfaGVpZ2h0LCBidWZfaGVpZ2h0KTsKKworICAgIEFMT0dWKCJkaXNwbGF5IHNpemUgKCVkeCVkKSwgYnVmZmVyIHNpemUgKCVkeCVkKSIsCisgICAgICAgICAgIGRpc3Bfd2lkdGgsIGRpc3BfaGVpZ2h0LCBidWZfd2lkdGgsIGJ1Zl9oZWlnaHQpOworCisgICAgYm9vbCByZXNDaGFuZ2VkID0gZmFsc2U7CisgICAgaWYgKGRpc3Bfd2lkdGggIT0gbVdpZHRoIHx8IGRpc3BfaGVpZ2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgbVdpZHRoID0gZGlzcF93aWR0aDsKKyAgICAgICAgbUhlaWdodCA9IGRpc3BfaGVpZ2h0OworICAgICAgICByZXNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwga051bU91dHB1dEJ1ZmZlcnM7ICsraSkgeworICAgICAgICAgICAgaWYgKG1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgICAgICAgICBmcmVlKG1PdXRwdXRCdWZmZXJbaV0pOworICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtSXNNcGVnNCkgeworICAgICAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpOworCisgICAgICAgICAgICB1aW50OF90ICp2b2xfZGF0YVsxXXt9OworICAgICAgICAgICAgaW50MzJfdCB2b2xfc2l6ZSA9IDA7CisKKyAgICAgICAgICAgIGlmICghUFZJbml0VmlkZW9EZWNvZGVyKAorICAgICAgICAgICAgICAgICAgICBtRGVjSGFuZGxlLCB2b2xfZGF0YSwgJnZvbF9zaXplLCAxLCBtSW50Zi0+Z2V0TWF4V2lkdGgoKSwgbUludGYtPmdldE1heEhlaWdodCgpLCBIMjYzX01PREUpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yIGluIFBWSW5pdFZpZGVvRGVjb2RlciBIMjYzX01PREUgd2hpbGUgcmVzQ2hhbmdlZCB3YXMgc2V0IHRvIHRydWUiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gcmVzQ2hhbmdlZDsKK30KKworLyogVE9ETzogY2FuIHJlbW92ZSB0ZW1wb3JhcnkgY29weSBhZnRlciBsaWJyYXJ5IHN1cHBvcnRzIHdyaXRpbmcgdG8gZGlzcGxheQorICogYnVmZmVyIFksIFUgYW5kIFYgcGxhbmUgcG9pbnRlcnMgdXNpbmcgc3RyaWRlIGluZm8uICovCitzdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKKyAgICAgICAgdWludDhfdCAqZHN0LCB1aW50OF90ICpzcmMsCisgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgc2l6ZV90IHNyY1VWU3RyaWRlID0gc3JjWVN0cmlkZSAvIDI7CisgICAgdWludDhfdCAqc3JjU3RhcnQgPSBzcmM7CisgICAgdWludDhfdCAqZHN0U3RhcnQgPSBkc3Q7CisgICAgc2l6ZV90IHZTdHJpZGUgPSBhbGlnbihoZWlnaHQsIDE2KTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoKTsKKyAgICAgICAgIHNyYyArPSBzcmNZU3RyaWRlOworICAgICAgICAgZHN0ICs9IGRzdFlTdHJpZGU7CisgICAgfQorICAgIC8qIFUgYnVmZmVyICovCisgICAgc3JjID0gc3JjU3RhcnQgKyB2U3RyaWRlICogc3JjWVN0cmlkZTsKKyAgICBkc3QgPSBkc3RTdGFydCArIChkc3RZU3RyaWRlICogaGVpZ2h0KSArIChkc3RVVlN0cmlkZSAqIGhlaWdodCAvIDIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoIC8gMik7CisgICAgICAgICBzcmMgKz0gc3JjVVZTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorICAgIC8qIFYgYnVmZmVyICovCisgICAgc3JjID0gc3JjU3RhcnQgKyB2U3RyaWRlICogc3JjWVN0cmlkZSAqIDUgLyA0OworICAgIGRzdCA9IGRzdFN0YXJ0ICsgKGRzdFlTdHJpZGUgKiBoZWlnaHQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmMsIHdpZHRoIC8gMik7CisgICAgICAgICBzcmMgKz0gc3JjVVZTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorfQorCit2b2lkIEMyU29mdE1wZWc0RGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgdWludDMyX3Qgd29ya0luZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkgJiAweEZGRkZGRkZGOworICAgIEMyUmVhZFZpZXcgclZpZXcgPSBtRHVtbXlSZWFkVmlldzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9IHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0tPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5mcm9udCgpLm1hcCgpLmdldCgpOworICAgICAgICBpblNpemUgPSByVmlldy5jYXBhY2l0eSgpOworICAgICAgICBpZiAoaW5TaXplICYmIHJWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHJWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBpZiAoaW5TaXplID09IDApIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ4X3QgKmJpdHN0cmVhbSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgdWludDMyX3QgKnN0YXJ0X2NvZGUgPSAodWludDMyX3QgKiliaXRzdHJlYW07CisgICAgYm9vbCB2b2xIZWFkZXIgPSAqc3RhcnRfY29kZSA9PSAweEIwMDEwMDAwOworICAgIGlmICh2b2xIZWFkZXIpIHsKKyAgICAgICAgUFZDbGVhblVwVmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUpOworICAgICAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIW1Jbml0aWFsaXplZCkgeworICAgICAgICB1aW50OF90ICp2b2xfZGF0YVsxXXt9OworICAgICAgICBpbnQzMl90IHZvbF9zaXplID0gMDsKKworICAgICAgICBib29sIGNvZGVjQ29uZmlnID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwOworICAgICAgICBpZiAoY29kZWNDb25maWcgfHwgdm9sSGVhZGVyKSB7CisgICAgICAgICAgICB2b2xfZGF0YVswXSA9IGJpdHN0cmVhbTsKKyAgICAgICAgICAgIHZvbF9zaXplID0gaW5TaXplOworICAgICAgICB9CisgICAgICAgIE1QNERlY29kaW5nTW9kZSBtb2RlID0gKG1Jc01wZWc0KSA/IE1QRUc0X01PREUgOiBIMjYzX01PREU7CisgICAgICAgIGlmICghUFZJbml0VmlkZW9EZWNvZGVyKAorICAgICAgICAgICAgICAgIG1EZWNIYW5kbGUsIHZvbF9kYXRhLCAmdm9sX3NpemUsIDEsCisgICAgICAgICAgICAgICAgbUludGYtPmdldE1heFdpZHRoKCksIG1JbnRmLT5nZXRNYXhIZWlnaHQoKSwgbW9kZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJQVkluaXRWaWRlb0RlY29kZXIgZmFpbGVkLiBVbnN1cHBvcnRlZCBjb250ZW50PyIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgICAgICBNUDREZWNvZGluZ01vZGUgYWN0dWFsTW9kZSA9IFBWR2V0RGVjQml0c3RyZWFtTW9kZShtRGVjSGFuZGxlKTsKKyAgICAgICAgaWYgKG1vZGUgIT0gYWN0dWFsTW9kZSkgeworICAgICAgICAgICAgQUxPR0UoIkRlY29kZWQgbW9kZSBub3Qgc2FtZSBhcyBhY3R1YWwgbW9kZSBvZiB0aGUgZGVjb2RlciIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIFBWU2V0UG9zdFByb2NUeXBlKG1EZWNIYW5kbGUsIDApOworICAgICAgICBpZiAoaGFuZGxlUmVzQ2hhbmdlKHdvcmspKSB7CisgICAgICAgICAgICBBTE9HSSgiU2V0dGluZyB3aWR0aCBhbmQgaGVpZ2h0Iik7CisgICAgICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0IHNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgdXBkYXRlIHNpemUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb2RlY0NvbmZpZykgeworICAgICAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNpemVfdCBpblBvcyA9IDA7CisgICAgd2hpbGUgKGluUG9zIDwgaW5TaXplKSB7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IGVuc3VyZURlY29kZXJTdGF0ZShwb29sKTsKKyAgICAgICAgaWYgKEMyX09LICE9IGVycikgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBDMkdyYXBoaWNWaWV3IHdWaWV3ID0gbU91dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgeUZyYW1lU2l6ZSA9IHNpemVvZih1aW50OCkgKiBtRGVjSGFuZGxlLT5zaXplOworICAgICAgICBpZiAobU91dHB1dEJ1ZmZlclNpemUgPCB5RnJhbWVTaXplICogMyAvIDIpeworICAgICAgICAgICAgQUxPR0UoIlRvbyBzbWFsbCBvdXRwdXQgYnVmZmVyOiAlenUgYnl0ZXMiLCBtT3V0cHV0QnVmZmVyU2l6ZSk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfTk9fTUVNT1JZOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtRnJhbWVzQ29uZmlndXJlZCkgeworICAgICAgICAgICAgUFZTZXRSZWZlcmVuY2VZVVYobURlY0hhbmRsZSxtT3V0cHV0QnVmZmVyWzFdKTsKKyAgICAgICAgICAgIG1GcmFtZXNDb25maWd1cmVkID0gdHJ1ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgaWYgaGVhZGVyIGNvbnRhaW5zIG5ldyBpbmZvLCBlLmcuLCB3aWR0aC9oZWlnaHQsIGV0Yy4KKyAgICAgICAgVm9wSGVhZGVySW5mbyBoZWFkZXJfaW5mbzsKKyAgICAgICAgdWludDMyX3QgdXNlRXh0VGltZXN0YW1wID0gKGluUG9zID09IDApOworICAgICAgICBpbnQzMl90IHRtcEluU2l6ZSA9IChpbnQzMl90KWluU2l6ZTsKKyAgICAgICAgdWludDhfdCAqYml0c3RyZWFtVG1wID0gYml0c3RyZWFtOworICAgICAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSB3b3JrSW5kZXg7CisgICAgICAgIGlmIChQVkRlY29kZVZvcEhlYWRlcigKKyAgICAgICAgICAgICAgICAgICAgbURlY0hhbmRsZSwgJmJpdHN0cmVhbVRtcCwgJnRpbWVzdGFtcCwgJnRtcEluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgJmhlYWRlcl9pbmZvLCAmdXNlRXh0VGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICBtT3V0cHV0QnVmZmVyW21OdW1TYW1wbGVzT3V0cHV0ICYgMV0pICE9IFBWX1RSVUUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZGVjb2RlIHZvcCBoZWFkZXIuIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gSDI2MyBkb2Vzbid0IGhhdmUgVk9MIGhlYWRlciwgdGhlIGZyYW1lIHNpemUgaW5mb3JtYXRpb24gaXMgaW4gc2hvcnQgaGVhZGVyLCBpLmUuIHRoZQorICAgICAgICAvLyBkZWNvZGVyIG1heSBkZXRlY3Qgc2l6ZSBjaGFuZ2UgYWZ0ZXIgUFZEZWNvZGVWb3BIZWFkZXIuCisgICAgICAgIGJvb2wgcmVzQ2hhbmdlID0gaGFuZGxlUmVzQ2hhbmdlKHdvcmspOworICAgICAgICBpZiAobUlzTXBlZzQgJiYgcmVzQ2hhbmdlKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYgKHJlc0NoYW5nZSkgeworICAgICAgICAgICAgQUxPR0koIlNldHRpbmcgd2lkdGggYW5kIGhlaWdodCIpOworICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCBzaXplKDB1LCBtV2lkdGgsIG1IZWlnaHQpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyh7JnNpemV9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgdXBkYXRlIHNpemUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoUFZEZWNvZGVWb3BCb2R5KG1EZWNIYW5kbGUsICZ0bXBJblNpemUpICE9IFBWX1RSVUUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZGVjb2RlIHZpZGVvIGZyYW1lLiIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGFuZGxlUmVzQ2hhbmdlKHdvcmspKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCAqb3V0cHV0QnVmZmVyWSA9IHdWaWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgICAgIEMyUGxhbmFyTGF5b3V0IGxheW91dCA9IHdWaWV3LmxheW91dCgpOworICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldLnJvd0luYzsKKyAgICAgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm93SW5jOworICAgICAgICAodm9pZCljb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJZLAorICAgICAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbbU51bVNhbXBsZXNPdXRwdXQgJiAxXSwKKyAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKKyAgICAgICAgICAgICAgICBhbGlnbihtV2lkdGgsIDE2KSwgbVdpZHRoLCBtSGVpZ2h0KTsKKworICAgICAgICBpblBvcyArPSBpblNpemUgLSAoc2l6ZV90KXRtcEluU2l6ZTsKKyAgICAgICAgZmluaXNoV29yayh3b3JrSW5kZXgsIHdvcmspOworICAgICAgICArK21OdW1TYW1wbGVzT3V0cHV0OworICAgICAgICBpZiAoaW5TaXplIC0gaW5Qb3MgIT0gMCkgeworICAgICAgICAgICAgQUxPR0QoImRlY29kZWQgZnJhbWUsIGlnbm9yaW5nIGZ1cnRoZXIgdHJhaWxpbmcgYnl0ZXMgJWQiLAorICAgICAgICAgICAgICAgICAgKGludClpblNpemUgLSAoaW50KWluUG9zKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNERlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKXBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2NsYXNzIEMyU29mdE1wZWc0RGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdE1wZWc0RGVjRmFjdG9yeSgpIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0TXBlZzREZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWc0RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdE1wZWc0RGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0TXBlZzREZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcGVnNERlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE1wZWc0RGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE2YTA5NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzREZWMuaApAQCAtMCwwICsxLDc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMl9TT0ZUX01QRUc0X0RFQ19IXworI2RlZmluZSBDMl9TT0ZUX01QRUc0X0RFQ19IXworCisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworCitzdHJ1Y3QgdGFndmlkZW9EZWNDb250cm9sczsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0TXBlZzREZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0TXBlZzREZWMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcGVnNERlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyBwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTnVtT3V0cHV0QnVmZmVycyA9IDIsCisgICAgfTsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisgICAgYzJfc3RhdHVzX3QgZW5zdXJlRGVjb2RlclN0YXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpOworICAgIHZvaWQgZmluaXNoV29yayh1aW50NjRfdCBpbmRleCwgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspOworICAgIGJvb2wgaGFuZGxlUmVzQ2hhbmdlKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdGFndmlkZW9EZWNDb250cm9scyAqbURlY0hhbmRsZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IG1PdXRCbG9jazsKKyAgICB1aW50OF90ICptT3V0cHV0QnVmZmVyW2tOdW1PdXRwdXRCdWZmZXJzXTsKKyAgICBzaXplX3QgIG1PdXRwdXRCdWZmZXJTaXplOworCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgdWludDMyX3QgbU51bVNhbXBsZXNPdXRwdXQ7CisKKyAgICBib29sIG1Jc01wZWc0OworICAgIGJvb2wgbUluaXRpYWxpemVkOworICAgIGJvb2wgbUZyYW1lc0NvbmZpZ3VyZWQ7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0TXBlZzREZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDMl9TT0ZUX01QRUc0X0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGM4YzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9DMlNvZnRNcGVnNEVuYy5jcHAKQEAgLTAsMCArMSw2NjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpZmRlZiBNUEVHNAorICAjZGVmaW5lIExPR19UQUcgIkMyU29mdE1wZWc0RW5jIgorI2Vsc2UKKyAgI2RlZmluZSBMT0dfVEFHICJDMlNvZnRIMjYzRW5jIgorI2VuZGlmCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgIkMyU29mdE1wZWc0RW5jLmgiCisjaW5jbHVkZSAibXA0ZW5jX2FwaS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKKyNpZmRlZiBNUEVHNAorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm1wZWc0LmVuY29kZXIiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU8gPSBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKKyNlbHNlCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQuaDI2My5lbmNvZGVyIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPID0gTUVESUFfTUlNRVRZUEVfVklERU9fSDI2MzsKKyNlbmRpZgorCit9IC8vIG5hbWVwc2FjZQorCitjbGFzcyBDMlNvZnRNcGVnNEVuYzo6SW50ZkltcGwgOiBwdWJsaWMgU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBJbnRmSW1wbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+ICZoZWxwZXIpCisgICAgICAgIDogU2ltcGxlSW50ZXJmYWNlPHZvaWQ+OjpCYXNlUGFyYW1zKAorICAgICAgICAgICAgICAgIGhlbHBlciwKKyAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpET01BSU5fVklERU8sCisgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU8pIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOyAvLyBUT0RPOiBhY2NvdW50IGZvciBvdXIgYnVmZmVycyBoZXJlCisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKAorICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Vc2FnZSwgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX1VTQUdFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1Vc2FnZVR1bmluZzo6aW5wdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgKHVpbnQ2NF90KUMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNpemUsIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCgwdSwgMTc2LCAxNDQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgICAgICAgICBDMkYobVNpemUsIHdpZHRoKS5pblJhbmdlKDE2LCAxNzYsIDE2KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMTYsIDE0NCwgMTYpLAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkub25lT2YoezE3NiwgMzUyfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5vbmVPZih7MTQ0LCAyODh9KSwKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUZyYW1lUmF0ZSwgQzJfUEFSQU1LRVlfRlJBTUVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0KDB1LCAxNy4pKQorICAgICAgICAgICAgICAgIC8vIFRPRE86IE1vcmUgcmVzdHJpY3Rpb24/CisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRnJhbWVSYXRlLCB2YWx1ZSkuZ3JlYXRlclRoYW4oMC4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptRnJhbWVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGUsIEMyX1BBUkFNS0VZX0JJVFJBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQoMHUsIDY0MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg0MDk2LCAxMjAwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEJpdHJhdGVTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU3luY0ZyYW1lUGVyaW9kLCBDMl9QQVJBTUtFWV9TWU5DX0ZSQU1FX0lOVEVSVkFMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TeW5jRnJhbWVJbnRlcnZhbFR1bmluZzo6b3V0cHV0KDB1LCAxMDAwMDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TeW5jRnJhbWVQZXJpb2QsIHZhbHVlKS5hbnkoKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptU3luY0ZyYW1lUGVyaW9kKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyNpZmRlZiBNUEVHNAorICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsIFBST0ZJTEVfTVA0Vl9TSU1QTEUsIExFVkVMX01QNFZfMikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkuZXF1YWxUbygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9GSUxFX01QNFZfU0lNUExFKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX01QNFZfMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8wQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzJ9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoUHJvZmlsZUxldmVsU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyNlbHNlCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtUHJvZmlsZUxldmVsLCBDMl9QQVJBTUtFWV9QUk9GSUxFX0xFVkVMKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgUFJPRklMRV9IMjYzX0JBU0VMSU5FLCBMRVZFTF9IMjYzXzQ1KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBwcm9maWxlKS5lcXVhbFRvKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0ZJTEVfSDI2M19CQVNFTElORSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQ1fSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEJpdHJhdGVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi52YWx1ZSA8PSA0MDk2KSB7CisgICAgICAgICAgICBtZS5zZXQoKS52YWx1ZSA9IDQwOTY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJm9sZE1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIEMyUiByZXMgPSBDMlI6Ok9rKCk7CisgICAgICAgIGlmICghbWUuRihtZS52LndpZHRoKS5zdXBwb3J0c0F0QWxsKG1lLnYud2lkdGgpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYud2lkdGgpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS53aWR0aCA9IG9sZE1lLnYud2lkdGg7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYuaGVpZ2h0KS5zdXBwb3J0c0F0QWxsKG1lLnYuaGVpZ2h0KSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LmhlaWdodCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLmhlaWdodCA9IG9sZE1lLnYuaGVpZ2h0OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgIGlmICghbWUuRihtZS52LnByb2ZpbGUpLnN1cHBvcnRzQXRBbGwobWUudi5wcm9maWxlKSkgeworI2lmZGVmIE1QRUc0CisgICAgICAgICAgICBtZS5zZXQoKS5wcm9maWxlID0gUFJPRklMRV9NUDRWX1NJTVBMRTsKKyNlbHNlCisgICAgICAgICAgICBtZS5zZXQoKS5wcm9maWxlID0gUFJPRklMRV9IMjYzX0JBU0VMSU5FOworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtZS5GKG1lLnYubGV2ZWwpLnN1cHBvcnRzQXRBbGwobWUudi5sZXZlbCkpIHsKKyNpZmRlZiBNUEVHNAorICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBMRVZFTF9NUDRWXzI7CisjZWxzZQorICAgICAgICAgICAgbWUuc2V0KCkubGV2ZWwgPSBMRVZFTF9IMjYzXzQ1OworI2VuZGlmCisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICAvLyB1bnNhZmUgZ2V0dGVycworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IGdldFNpemVfbCgpIGNvbnN0IHsgcmV0dXJuIG1TaXplOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBnZXRGcmFtZVJhdGVfbCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZVJhdGU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBnZXRCaXRyYXRlX2woKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZTsgfQorICAgIHVpbnQzMl90IGdldFN5bmNGcmFtZVBlcmlvZCgpIGNvbnN0IHsKKyAgICAgICAgaWYgKG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIDwgMCB8fCBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSA9PSBJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIGRvdWJsZSBwZXJpb2QgPSBtU3luY0ZyYW1lUGVyaW9kLT52YWx1ZSAvIDFlNiAqIG1GcmFtZVJhdGUtPnZhbHVlOworICAgICAgICByZXR1cm4gKHVpbnQzMl90KWMyX21heChjMl9taW4ocGVyaW9kICsgMC41LCBkb3VibGUoVUlOVDMyX01BWCkpLCAxLik7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dD4gbVVzYWdlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gbUZyYW1lUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dD4gbVN5bmNGcmFtZVBlcmlvZDsKK307CisKK0MyU29mdE1wZWc0RW5jOjpDMlNvZnRNcGVnNEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudCgKKyAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUhhbmRsZShudWxscHRyKSwKKyAgICAgIG1FbmNQYXJhbXMobnVsbHB0ciksCisgICAgICBtU3RhcnRlZChmYWxzZSksCisgICAgICBtT3V0QnVmZmVyU2l6ZSg1MjQyODgpIHsKK30KKworQzJTb2Z0TXBlZzRFbmM6On5DMlNvZnRNcGVnNEVuYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzRFbmM6Om9uSW5pdCgpIHsKKyNpZmRlZiBNUEVHNAorICAgIG1FbmNvZGVNb2RlID0gQ09NQklORV9NT0RFX1dJVEhfRVJSX1JFUzsKKyNlbHNlCisgICAgbUVuY29kZU1vZGUgPSBIMjYzX01PREU7CisjZW5kaWYKKyAgICBpZiAoIW1IYW5kbGUpIHsKKyAgICAgICAgbUhhbmRsZSA9IG5ldyB0YWd2aWRlb0VuY0NvbnRyb2xzOworICAgIH0KKworICAgIGlmICghbUVuY1BhcmFtcykgeworICAgICAgICBtRW5jUGFyYW1zID0gbmV3IHRhZ3ZpZGVvRW5jT3B0aW9uczsKKyAgICB9CisKKyAgICBpZiAoIShtRW5jUGFyYW1zICYmIG1IYW5kbGUpKSByZXR1cm4gQzJfTk9fTUVNT1JZOworCisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIGluaXRFbmNvZGVyKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjpvblN0b3AoKSB7CisgICAgaWYgKCFtU3RhcnRlZCkgeworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgICh2b2lkKVBWQ2xlYW5VcFZpZGVvRW5jb2RlcihtSGFuZGxlKTsKKyAgICB9CisgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgcmV0dXJuIEMyX09LOworfQorCit2b2lkIEMyU29mdE1wZWc0RW5jOjpvblJlc2V0KCkgeworICAgIG9uU3RvcCgpOworICAgIGluaXRFbmNvZGVyKCk7Cit9CisKK3ZvaWQgQzJTb2Z0TXBlZzRFbmM6Om9uUmVsZWFzZSgpIHsKKyAgICBvblN0b3AoKTsKKyAgICBpZiAobUVuY1BhcmFtcykgeworICAgICAgICBkZWxldGUgbUVuY1BhcmFtczsKKyAgICAgICAgbUVuY1BhcmFtcyA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtSGFuZGxlKSB7CisgICAgICAgIGRlbGV0ZSBtSGFuZGxlOworICAgICAgICBtSGFuZGxlID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjpvbkZsdXNoX3NtKCkgeworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0TXBlZzRFbmM6OmluaXRFbmNQYXJhbXMoKSB7CisgICAgaWYgKG1IYW5kbGUpIHsKKyAgICAgICAgbWVtc2V0KG1IYW5kbGUsIDAsIHNpemVvZih0YWd2aWRlb0VuY0NvbnRyb2xzKSk7CisgICAgfSBlbHNlIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgaWYgKG1FbmNQYXJhbXMpIHsKKyAgICAgICAgbWVtc2V0KG1FbmNQYXJhbXMsIDAsIHNpemVvZih0YWd2aWRlb0VuY09wdGlvbnMpKTsKKyAgICB9IGVsc2UgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKworICAgIGlmICghUFZHZXREZWZhdWx0RW5jT3B0aW9uKG1FbmNQYXJhbXMsIDApKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IGRlZmF1bHQgZW5jb2RpbmcgcGFyYW1ldGVycyIpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIGlmIChtRnJhbWVSYXRlLT52YWx1ZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJGcmFtZXJhdGUgc2hvdWxkIG5vdCBiZSAwIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgbUVuY1BhcmFtcy0+ZW5jTW9kZSA9IG1FbmNvZGVNb2RlOworICAgIG1FbmNQYXJhbXMtPmVuY1dpZHRoWzBdID0gbVNpemUtPndpZHRoOworICAgIG1FbmNQYXJhbXMtPmVuY0hlaWdodFswXSA9IG1TaXplLT5oZWlnaHQ7CisgICAgbUVuY1BhcmFtcy0+ZW5jRnJhbWVSYXRlWzBdID0gbUZyYW1lUmF0ZS0+dmFsdWUgKyAwLjU7CisgICAgbUVuY1BhcmFtcy0+cmNUeXBlID0gVkJSXzE7CisgICAgbUVuY1BhcmFtcy0+dmJ2RGVsYXkgPSA1LjBmOworICAgIG1FbmNQYXJhbXMtPnByb2ZpbGVfbGV2ZWwgPSBDT1JFX1BST0ZJTEVfTEVWRUwyOworICAgIG1FbmNQYXJhbXMtPnBhY2tldFNpemUgPSAzMjsKKyAgICBtRW5jUGFyYW1zLT5ydmxjRW5hYmxlID0gUFZfT0ZGOworICAgIG1FbmNQYXJhbXMtPm51bUxheWVycyA9IDE7CisgICAgbUVuY1BhcmFtcy0+dGltZUluY1JlcyA9IDEwMDA7CisgICAgbUVuY1BhcmFtcy0+dGlja1BlclNyYyA9IG1FbmNQYXJhbXMtPnRpbWVJbmNSZXMgLyAobUZyYW1lUmF0ZS0+dmFsdWUgKyAwLjUpOworICAgIG1FbmNQYXJhbXMtPmJpdFJhdGVbMF0gPSBtQml0cmF0ZS0+dmFsdWU7CisgICAgbUVuY1BhcmFtcy0+aVF1YW50WzBdID0gMTU7CisgICAgbUVuY1BhcmFtcy0+cFF1YW50WzBdID0gMTI7CisgICAgbUVuY1BhcmFtcy0+cXVhbnRUeXBlWzBdID0gMDsKKyAgICBtRW5jUGFyYW1zLT5ub0ZyYW1lU2tpcHBlZCA9IFBWX09GRjsKKworICAgIC8vIFBWJ3MgTVBFRzQgZW5jb2RlciByZXF1aXJlcyB0aGUgdmlkZW8gZGltZW5zaW9uIG9mIG11bHRpcGxlCisgICAgaWYgKG1TaXplLT53aWR0aCAlIDE2ICE9IDAgfHwgbVNpemUtPmhlaWdodCAlIDE2ICE9IDApIHsKKyAgICAgICAgQUxPR0UoIlZpZGVvIGZyYW1lIHNpemUgJWR4JWQgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2IiwKKyAgICAgICAgICAgICAgbVNpemUtPndpZHRoLCBtU2l6ZS0+aGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBTZXQgSURSIGZyYW1lIHJlZnJlc2ggaW50ZXJ2YWwKKyAgICBtRW5jUGFyYW1zLT5pbnRyYVBlcmlvZCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2QoKTsKKyAgICBtRW5jUGFyYW1zLT5udW1JbnRyYU1CID0gMDsKKyAgICBtRW5jUGFyYW1zLT5zY2VuZURldGVjdCA9IFBWX09OOworICAgIG1FbmNQYXJhbXMtPnNlYXJjaFJhbmdlID0gMTY7CisgICAgbUVuY1BhcmFtcy0+bXY4eDhFbmFibGUgPSBQVl9PRkY7CisgICAgbUVuY1BhcmFtcy0+Z29iSGVhZGVySW50ZXJ2YWwgPSAwOworICAgIG1FbmNQYXJhbXMtPnVzZUFDUHJlZCA9IFBWX09OOworICAgIG1FbmNQYXJhbXMtPmludHJhRENWbGNUaCA9IDA7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE1wZWc0RW5jOjppbml0RW5jb2RlcigpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBtU2l6ZSA9IG1JbnRmLT5nZXRTaXplX2woKTsKKyAgICAgICAgbUJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIG1GcmFtZVJhdGUgPSBtSW50Zi0+Z2V0RnJhbWVSYXRlX2woKTsKKyAgICB9CisgICAgYzJfc3RhdHVzX3QgZXJyID0gaW5pdEVuY1BhcmFtcygpOworICAgIGlmIChDMl9PSyAhPSBlcnIpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplZCBlbmNvZGVyIHBhcmFtcyIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBpZiAoIVBWSW5pdFZpZGVvRW5jb2RlcihtSGFuZGxlLCBtRW5jUGFyYW1zKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXRpYWxpemUgdGhlIGVuY29kZXIiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICAvLyAxc3QgYnVmZmVyIGZvciBjb2RlYyBzcGVjaWZpYyBkYXRhCisgICAgbU51bUlucHV0RnJhbWVzID0gLTE7CisgICAgbVN0YXJ0ZWQgPSB0cnVlOworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRNcGVnNEVuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICBpZiAobVNpZ25hbGxlZEVycm9yIHx8IG1TaWduYWxsZWRPdXRwdXRFb3MpIHsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSW5pdGlhbGl6ZSBlbmNvZGVyIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpemVkCisgICAgaWYgKCFtU3RhcnRlZCAmJiBDMl9PSyAhPSBpbml0RW5jb2RlcigpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBlbmNvZGVyIik7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhtT3V0QnVmZmVyU2l6ZSwgdXNhZ2UsICZibG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgIGlmICh3Vmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gd1ZpZXcuZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ4X3QgKm91dFB0ciA9ICh1aW50OF90ICopd1ZpZXcuZGF0YSgpOworICAgIGlmIChtTnVtSW5wdXRGcmFtZXMgPCAwKSB7CisgICAgICAgIC8vIFRoZSB2ZXJ5IGZpcnN0IHRoaW5nIHdlIHdhbnQgdG8gb3V0cHV0IGlzIHRoZSBjb2RlYyBzcGVjaWZpYyBkYXRhLgorICAgICAgICBpbnQzMl90IG91dHB1dFNpemUgPSBtT3V0QnVmZmVyU2l6ZTsKKyAgICAgICAgaWYgKCFQVkdldFZvbEhlYWRlcihtSGFuZGxlLCBvdXRQdHIsICZvdXRwdXRTaXplLCAwKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgVk9MIGhlYWRlciIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJCeXRlcyBHZW5lcmF0ZWQgaW4gaGVhZGVyICVkXG4iLCBvdXRwdXRTaXplKTsKKyAgICAgICAgfQorCisgICAgICAgICsrbU51bUlucHV0RnJhbWVzOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dD4gY3NkID0KKyAgICAgICAgICAgIEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKG91dHB1dFNpemUsIDB1KTsKKyAgICAgICAgaWYgKCFjc2QpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDU0QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGNzZC0+bS52YWx1ZSwgb3V0UHRyLCBvdXRwdXRTaXplKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGNzZCkpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiByVmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGlucHV0QnVmZmVyOworICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIGlucHV0QnVmZmVyID0gd29yay0+aW5wdXQuYnVmZmVyc1swXTsKKyAgICAgICAgclZpZXcgPSBzdGQ6Om1ha2Vfc2hhcmVkPGNvbnN0IEMyR3JhcGhpY1ZpZXc+KAorICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkpOworICAgICAgICBpZiAoclZpZXctPmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGVyciA9ICVkIiwgclZpZXctPmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gclZpZXctPmVycm9yKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHVpbnQ2NF90IGlucHV0VGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2sgaW5CdWZmZXIgPSBpbnB1dEJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5mcm9udCgpOworICAgIGlmIChpbkJ1ZmZlci53aWR0aCgpIDwgbVNpemUtPndpZHRoIHx8CisgICAgICAgIGluQnVmZmVyLmhlaWdodCgpIDwgbVNpemUtPmhlaWdodCkgeworICAgICAgICAvKiBFeHBlY3Qgd2lkdGggaGVpZ2h0IHRvIGJlIGNvbmZpZ3VyZWQgKi8KKyAgICAgICAgQUxPR1coInVuZXhwZWN0ZWQgQ2FwYWNpdHkgQXNwZWN0ICVkKCVkKSB4ICVkKCVkKSIsIGluQnVmZmVyLndpZHRoKCksCisgICAgICAgICAgICAgIG1TaXplLT53aWR0aCwgaW5CdWZmZXIuaGVpZ2h0KCksIG1TaXplLT5oZWlnaHQpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gclZpZXctPmxheW91dCgpOworICAgIHVpbnQ4X3QgKnlQbGFuZSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy0+ZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgdWludDhfdCAqdVBsYW5lID0gY29uc3RfY2FzdDx1aW50OF90ICo+KHJWaWV3LT5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgICB1aW50OF90ICp2UGxhbmUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oclZpZXctPmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOworICAgIGludDMyX3QgeVN0cmlkZSA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldLnJvd0luYzsKKyAgICBpbnQzMl90IHVTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXS5yb3dJbmM7CisgICAgaW50MzJfdCB2U3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0ucm93SW5jOworICAgIHVpbnQzMl90IHdpZHRoID0gbVNpemUtPndpZHRoOworICAgIHVpbnQzMl90IGhlaWdodCA9IG1TaXplLT5oZWlnaHQ7CisgICAgLy8gd2lkdGggYW5kIGhlaWdodCBhcmUgYWx3YXlzIGV2ZW4gKGFzIGJsb2NrIHNpemUgaXMgMTZ4MTYpCisgICAgQ0hFQ0tfRVEoKHdpZHRoICYgMXUpLCAwdSk7CisgICAgQ0hFQ0tfRVEoKGhlaWdodCAmIDF1KSwgMHUpOworICAgIHNpemVfdCB5UGxhbmVTaXplID0gd2lkdGggKiBoZWlnaHQ7CisgICAgc3dpdGNoIChsYXlvdXQudHlwZSkgeworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjoKKyAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0JBOiB7CisgICAgICAgICAgICBNZW1vcnlCbG9jayBjb252ZXJzaW9uQnVmZmVyID0gbUNvbnZlcnNpb25CdWZmZXJzLmZldGNoKHlQbGFuZVNpemUgKiAzIC8gMik7CisgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lbXBsYWNlKGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCBjb252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgICAgIHlQbGFuZSA9IGNvbnZlcnNpb25CdWZmZXIuZGF0YSgpOworICAgICAgICAgICAgdVBsYW5lID0geVBsYW5lICsgeVBsYW5lU2l6ZTsKKyAgICAgICAgICAgIHZQbGFuZSA9IHVQbGFuZSArIHlQbGFuZVNpemUgLyA0OworICAgICAgICAgICAgeVN0cmlkZSA9IHdpZHRoOworICAgICAgICAgICAgdVN0cmlkZSA9IHZTdHJpZGUgPSB3aWR0aCAvIDI7CisgICAgICAgICAgICBDb252ZXJ0UkdCVG9QbGFuYXJZVVYoeVBsYW5lLCB5U3RyaWRlLCBoZWlnaHQsIGNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpLCAqclZpZXcuZ2V0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVY6IHsKKyAgICAgICAgICAgIGlmICghSXNZVVY0MjAoKnJWaWV3KSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBpcyBub3QgWVVWNDIwIik7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgeVN0cmlkZSA9PSBhbGlnbih3aWR0aCwgMTYpCisgICAgICAgICAgICAgICAgICAgICYmIHVTdHJpZGUgPT0gdlN0cmlkZQorICAgICAgICAgICAgICAgICAgICAmJiB5U3RyaWRlID09IDIgKiB2U3RyaWRlKSB7CisgICAgICAgICAgICAgICAgLy8gSTQyMCBjb21wYXRpYmxlIHdpdGggeVN0cmlkZSBiZWluZyBlcXVhbCB0byBhbGlnbmVkIHdpZHRoCisgICAgICAgICAgICAgICAgLy8gcGxhbmVzIGFyZSBhbHJlYWR5IHNldCB1cCBhYm92ZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb3B5IHRvIEk0MjAKKyAgICAgICAgICAgIE1lbW9yeUJsb2NrIGNvbnZlcnNpb25CdWZmZXIgPSBtQ29udmVyc2lvbkJ1ZmZlcnMuZmV0Y2goeVBsYW5lU2l6ZSAqIDMgLyAyKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyc0luVXNlLmVtcGxhY2UoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksIGNvbnZlcnNpb25CdWZmZXIpOworICAgICAgICAgICAgTWVkaWFJbWFnZTIgaW1nID0gQ3JlYXRlWVVWNDIwUGxhbmFyTWVkaWFJbWFnZTIod2lkdGgsIGhlaWdodCwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJbWFnZUNvcHkoY29udmVyc2lvbkJ1ZmZlci5kYXRhKCksICZpbWcsICpyVmlldyk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkJ1ZmZlciBjb252ZXJzaW9uIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICB5UGxhbmUgPSBjb252ZXJzaW9uQnVmZmVyLmRhdGEoKTsKKyAgICAgICAgICAgIHVQbGFuZSA9IHlQbGFuZSArIHlQbGFuZVNpemU7CisgICAgICAgICAgICB2UGxhbmUgPSB1UGxhbmUgKyB5UGxhbmVTaXplIC8gNDsKKyAgICAgICAgICAgIHlTdHJpZGUgPSB3aWR0aDsKKyAgICAgICAgICAgIHVTdHJpZGUgPSB2U3RyaWRlID0gd2lkdGggLyAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVkE6CisgICAgICAgICAgICBBTE9HRSgiWVVWQSBwbGFuZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoIlVucmVjb2duaXplZCBwbGFuZSB0eXBlOiAlZCIsIGxheW91dC50eXBlKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDSEVDSyhOVUxMICE9IHlQbGFuZSk7CisgICAgLyogRW5jb2RlIGZyYW1lcyAqLworICAgIFZpZGVvRW5jRnJhbWVJTyB2aW4sIHZvdXQ7CisgICAgbWVtc2V0KCZ2aW4sIDAsIHNpemVvZih2aW4pKTsKKyAgICBtZW1zZXQoJnZvdXQsIDAsIHNpemVvZih2b3V0KSk7CisgICAgdmluLnlDaGFuID0geVBsYW5lOworICAgIHZpbi51Q2hhbiA9IHVQbGFuZTsKKyAgICB2aW4udkNoYW4gPSB2UGxhbmU7CisgICAgdmluLnRpbWVzdGFtcCA9IChpbnB1dFRpbWVTdGFtcCArIDUwMCkgLyAxMDAwOyAgLy8gaW4gbXMKKyAgICB2aW4uaGVpZ2h0ID0gYWxpZ24oaGVpZ2h0LCAxNik7CisgICAgdmluLnBpdGNoID0gYWxpZ24od2lkdGgsIDE2KTsKKworICAgIHVpbnQzMl90IG1vZFRpbWVNcyA9IDA7CisgICAgaW50MzJfdCBuTGF5ZXIgPSAwOworICAgIE1QNEhpbnRUcmFjayBoaW50VHJhY2s7CisgICAgaW50MzJfdCBvdXRwdXRTaXplID0gbU91dEJ1ZmZlclNpemU7CisgICAgaWYgKCFQVkVuY29kZVZpZGVvRnJhbWUobUhhbmRsZSwgJnZpbiwgJnZvdXQsICZtb2RUaW1lTXMsIG91dFB0ciwgJm91dHB1dFNpemUsICZuTGF5ZXIpIHx8CisgICAgICAgICFQVkdldEhpbnRUcmFjayhtSGFuZGxlLCAmaGludFRyYWNrKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGVuY29kZSBmcmFtZSBvciBnZXQgaGludCB0cmFjayBhdCBmcmFtZSAlIiBQUklkNjQsIG1OdW1JbnB1dEZyYW1lcyk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigib3V0cHV0U2l6ZSBmaWxsZWQgOiAlZCIsIG91dHB1dFNpemUpOworICAgICsrbU51bUlucHV0RnJhbWVzOworICAgIENIRUNLKE5VTEwgPT0gUFZHZXRPdmVycnVuQnVmZmVyKG1IYW5kbGUpKTsKKworICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgaWYgKG91dHB1dFNpemUpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIDAsIG91dHB1dFNpemUpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgPSBpbnB1dFRpbWVTdGFtcDsKKyAgICAgICAgaWYgKGhpbnRUcmFjay5Db2RlVHlwZSA9PSAwKSB7CisgICAgICAgICAgICBidWZmZXItPnNldEluZm8oc3RkOjptYWtlX3NoYXJlZDxDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgIDB1IC8qIHN0cmVhbSBpZCAqLywgQzJDb25maWc6OlNZTkNfRlJBTUUpKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICB9CisKKyAgICBtQ29udmVyc2lvbkJ1ZmZlcnNJblVzZS5lcmFzZSh5UGxhbmUpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRNcGVnNEVuYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKXBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0TXBlZzRFbmNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0TXBlZzRFbmNGYWN0b3J5KCkKKyAgICAgICAgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdE1wZWc0RW5jKAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWc0RW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudEludGVyZmFjZSopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICppbnRlcmZhY2UgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KAorICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRNcGVnNEVuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE1wZWc0RW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRNcGVnNEVuY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdE1wZWc0RW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL0MyU29mdE1wZWc0RW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM0NjFmYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvQzJTb2Z0TXBlZzRFbmMuaApAQCAtMCwwICsxLDgzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyX1NPRlRfTVBFRzRfRU5DX0hfXworI2RlZmluZSBDMl9TT0ZUX01QRUc0X0VOQ19IX18KKworI2luY2x1ZGUgPG1hcD4KKworI2luY2x1ZGUgPENvZGVjMkJ1ZmZlclV0aWxzLmg+CisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgIm1wNGVuY19hcGkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0TXBlZzRFbmMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0TXBlZzRFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKworICAgIHZpcnR1YWwgfkMyU29mdE1wZWc0RW5jKCk7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKworICAgIHRhZ3ZpZGVvRW5jQ29udHJvbHMgKm1IYW5kbGU7CisgICAgdGFndmlkZW9FbmNPcHRpb25zICAqbUVuY1BhcmFtczsKKworICAgIGJvb2wgICAgIG1TdGFydGVkOworICAgIGJvb2wgICAgIG1TaWduYWxsZWRPdXRwdXRFb3M7CisgICAgYm9vbCAgICAgbVNpZ25hbGxlZEVycm9yOworCisgICAgdWludDMyX3QgbU91dEJ1ZmZlclNpemU7CisgICAgLy8gY29uZmlndXJhdGlvbnMgdXNlZCBieSBjb21wb25lbnQgaW4gcHJvY2VzcworICAgIC8vIChUT0RPOiBrZWVwIHRoaXMgaW4gaW50ZiBidXQgbWFrZSB0aGVtIGludGVybmFsIG9ubHkpCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworCisgICAgaW50NjRfdCAgbU51bUlucHV0RnJhbWVzOworICAgIE1QNEVuY29kaW5nTW9kZSBtRW5jb2RlTW9kZTsKKworICAgIE1lbW9yeUJsb2NrUG9vbCBtQ29udmVyc2lvbkJ1ZmZlcnM7CisgICAgc3RkOjptYXA8dm9pZCAqLCBNZW1vcnlCbG9jaz4gbUNvbnZlcnNpb25CdWZmZXJzSW5Vc2U7CisKKyAgICBjMl9zdGF0dXNfdCBpbml0RW5jUGFyYW1zKCk7CisgICAgYzJfc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdE1wZWc0RW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQzJfU09GVF9NUEVHNF9FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKY29weSB0byBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvbXBlZzRfaDI2My9OT1RJQ0UKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL05PVElDRQpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL21wZWc0X2gyNjMvcGF0ZW50X2Rpc2NsYWltZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmYxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9tcGVnNF9oMjYzL3BhdGVudF9kaXNjbGFpbWVyLnR4dApAQCAtMCwwICsxLDkgQEAKKworVEhJUyBJUyBOT1QgQSBHUkFOVCBPRiBQQVRFTlQgUklHSFRTLgorCitHb29nbGUgbWFrZXMgbm8gcmVwcmVzZW50YXRpb24gb3Igd2FycmFudHkgdGhhdCB0aGUgY29kZWNzIGZvciB3aGljaAorc291cmNlIGNvZGUgaXMgbWFkZSBhdmFpbGFibGUgaGVyZXVuZGVyIGFyZSB1bmVuY3VtYmVyZWQgYnkKK3RoaXJkLXBhcnR5IHBhdGVudHMuICBUaG9zZSBpbnRlbmRpbmcgdG8gdXNlIHRoaXMgc291cmNlIGNvZGUgaW4KK2hhcmR3YXJlIG9yIHNvZnR3YXJlIHByb2R1Y3RzIGFyZSBhZHZpc2VkIHRoYXQgaW1wbGVtZW50YXRpb25zIG9mCit0aGVzZSBjb2RlY3MsIGluY2x1ZGluZyBpbiBvcGVuIHNvdXJjZSBzb2Z0d2FyZSBvciBzaGFyZXdhcmUsIG1heQorcmVxdWlyZSBwYXRlbnQgbGljZW5zZXMgZnJvbSB0aGUgcmVsZXZhbnQgcGF0ZW50IGhvbGRlcnMuCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVkMTQxYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQW5kcm9pZC5icApAQCAtMCwwICsxLDIyIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X29wdXNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE9wdXNEZWMuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJvcHVzIl0sCit9CitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X29wdXNlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdE9wdXNFbmMuY3BwIl0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJvcHVzIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjY5NzRmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRGVjLmNwcApAQCAtMCwwICsxLDQ4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0T3B1c0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJDMlNvZnRPcHVzRGVjLmgiCisKK2V4dGVybiAiQyIgeworICAgICNpbmNsdWRlIDxvcHVzLmg+CisgICAgI2luY2x1ZGUgPG9wdXNfbXVsdGlzdHJlYW0uaD4KK30KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworCitjb25zdGV4cHIgY2hhciBDT01QT05FTlRfTkFNRVtdID0gImMyLmFuZHJvaWQub3B1cy5kZWNvZGVyIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK2NsYXNzIEMyU29mdE9wdXNEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOworICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQoMHUsIDQ4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1TYW1wbGVSYXRlLCB2YWx1ZSkuZXF1YWxUbyg0ODAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg2MDAwLCA1MTAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA5NjAgKiA2KSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdE9wdXNEZWM6OkMyU29mdE9wdXNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KAorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbURlY29kZXIobnVsbHB0cikgeworfQorCitDMlNvZnRPcHVzRGVjOjp+QzJTb2Z0T3B1c0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0RlYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfTk9fTUVNT1JZOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRGVjOjpvblN0b3AoKSB7CisgICAgaWYgKG1EZWNvZGVyKSB7CisgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9kZXN0cm95KG1EZWNvZGVyKTsKKyAgICAgICAgbURlY29kZXIgPSBudWxscHRyOworICAgIH0KKyAgICBtZW1zZXQoJm1IZWFkZXIsIDAsIHNpemVvZihtSGVhZGVyKSk7CisgICAgbUNvZGVjRGVsYXkgPSAwOworICAgIG1TZWVrUHJlUm9sbCA9IDA7CisgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSAwOworICAgIG1JbnB1dEJ1ZmZlckNvdW50ID0gMDsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0T3B1c0RlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRPcHVzRGVjOjpvblJlbGVhc2UoKSB7CisgICAgaWYgKG1EZWNvZGVyKSB7CisgICAgICAgIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9kZXN0cm95KG1EZWNvZGVyKTsKKyAgICAgICAgbURlY29kZXIgPSBudWxscHRyOworICAgIH0KK30KKworc3RhdHVzX3QgQzJTb2Z0T3B1c0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgbWVtc2V0KCZtSGVhZGVyLCAwLCBzaXplb2YobUhlYWRlcikpOworICAgIG1Db2RlY0RlbGF5ID0gMDsKKyAgICBtU2Vla1ByZVJvbGwgPSAwOworICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gMDsKKyAgICBtSW5wdXRCdWZmZXJDb3VudCA9IDA7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworCisgICAgcmV0dXJuIE9LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChtRGVjb2RlcikgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3RsKG1EZWNvZGVyLCBPUFVTX1JFU0VUX1NUQVRFKTsKKyAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtU2Vla1ByZVJvbGw7CisgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdGljIHZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7Cit9CisKK3N0YXRpYyBjb25zdCBpbnQga1JhdGUgPSA0ODAwMDsKKworLy8gT3B1cyB1c2VzIFZvcmJpcyBjaGFubmVsIG1hcHBpbmcsIGFuZCBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nIHNwZWNpZmllcworLy8gbWFwcGluZ3MgZm9yIHVwIHRvIDggY2hhbm5lbHMuIFRoaXMgaW5mb3JtYXRpb24gaXMgcGFydCBvZiB0aGUgVm9yYmlzIEkKKy8vIFNwZWNpZmljYXRpb246CisvLyBodHRwOi8vd3d3LnhpcGgub3JnL3ZvcmJpcy9kb2MvVm9yYmlzX0lfc3BlYy5odG1sCitzdGF0aWMgY29uc3QgaW50IGtNYXhDaGFubmVscyA9IDg7CisKKy8vIE1heGltdW0gcGFja2V0IHNpemUgdXNlZCBpbiBYaXBoJ3Mgb3B1c2RlYy4KK3N0YXRpYyBjb25zdCBpbnQga01heE9wdXNPdXRwdXRQYWNrZXRTaXplU2FtcGxlcyA9IDk2MCAqIDY7CisKKy8vIERlZmF1bHQgYXVkaW8gb3V0cHV0IGNoYW5uZWwgbGF5b3V0LiBVc2VkIHRvIGluaXRpYWxpemUgfHN0cmVhbV9tYXB8IGluCisvLyBPcHVzSGVhZGVyLCBhbmQgcGFzc2VkIHRvIG9wdXNfbXVsdGlzdHJlYW1fZGVjb2Rlcl9jcmVhdGUoKSB3aGVuIHRoZSBoZWFkZXIKKy8vIGRvZXMgbm90IGNvbnRhaW4gbWFwcGluZyBpbmZvcm1hdGlvbi4gVGhlIHZhbHVlcyBhcmUgdmFsaWQgb25seSBmb3IgbW9ubyBhbmQKKy8vIHN0ZXJlbyBvdXRwdXQ6IE9wdXMgc3RyZWFtcyB3aXRoIG1vcmUgdGhhbiAyIGNoYW5uZWxzIHJlcXVpcmUgYSBzdHJlYW0gbWFwLgorc3RhdGljIGNvbnN0IGludCBrTWF4Q2hhbm5lbHNXaXRoRGVmYXVsdExheW91dCA9IDI7CitzdGF0aWMgY29uc3QgdWludDhfdCBrRGVmYXVsdE9wdXNDaGFubmVsTGF5b3V0W2tNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0XSA9IHsgMCwgMSB9OworCisKKy8vIENvbnZlcnQgbmFub3NlY29uZHMgdG8gbnVtYmVyIG9mIHNhbXBsZXMuCitzdGF0aWMgdWludDY0X3QgbnNfdG9fc2FtcGxlcyh1aW50NjRfdCBucywgaW50IHJhdGUpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ZG91YmxlPihucykgKiByYXRlIC8gMTAwMDAwMDAwMDsKK30KKwordm9pZCBDMlNvZnRPcHVzRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSByVmlldy5kYXRhKCkgKyBpbk9mZnNldDsKKyAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPCAzKSB7CisgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAwKSB7CisgICAgICAgICAgICBzaXplX3Qgb3B1c0hlYWRTaXplID0gMDsKKyAgICAgICAgICAgIHNpemVfdCBjb2RlY0RlbGF5QnVmU2l6ZSA9IDA7CisgICAgICAgICAgICBzaXplX3Qgc2Vla1ByZVJvbGxCdWZTaXplID0gMDsKKyAgICAgICAgICAgIHZvaWQgKm9wdXNIZWFkQnVmID0gTlVMTDsKKyAgICAgICAgICAgIHZvaWQgKmNvZGVjRGVsYXlCdWYgPSBOVUxMOworICAgICAgICAgICAgdm9pZCAqc2Vla1ByZVJvbGxCdWYgPSBOVUxMOworCisgICAgICAgICAgICBpZiAoIUdldE9wdXNIZWFkZXJCdWZmZXJzKGRhdGEsIGluU2l6ZSwgJm9wdXNIZWFkQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHVzSGVhZFNpemUsICZjb2RlY0RlbGF5QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY0RlbGF5QnVmU2l6ZSwgJnNlZWtQcmVSb2xsQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWVrUHJlUm9sbEJ1ZlNpemUpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIGVuY291bnRlcmVkIGVycm9yIGluIEdldE9wdXNIZWFkZXJCdWZmZXJzIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFQYXJzZU9wdXNIZWFkZXIoKHVpbnQ4X3QgKilvcHVzSGVhZEJ1Ziwgb3B1c0hlYWRTaXplLCAmbUhlYWRlcikpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgRW5jb3VudGVyZWQgZXJyb3Igd2hpbGUgUGFyc2luZyBPcHVzIEhlYWRlci4iLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDhfdCBjaGFubmVsX21hcHBpbmdba01heENoYW5uZWxzXSA9IHswfTsKKyAgICAgICAgICAgIGlmIChtSGVhZGVyLmNoYW5uZWxzIDw9IGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIGtEZWZhdWx0T3B1c0NoYW5uZWxMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgIGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZjaGFubmVsX21hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXIuc3RyZWFtX21hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci5jaGFubmVscyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgc3RhdHVzID0gT1BVU19JTlZBTElEX1NUQVRFOworICAgICAgICAgICAgbURlY29kZXIgPSBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKGtSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXIuY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci5udW1fc3RyZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSGVhZGVyLm51bV9jb3VwbGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxfbWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RhdHVzKTsKKyAgICAgICAgICAgIGlmICghbURlY29kZXIgfHwgc3RhdHVzICE9IE9QVVNfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgib3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZSBmYWlsZWQgc3RhdHVzID0gJXMiLAorICAgICAgICAgICAgICAgICAgICAgIG9wdXNfc3RyZXJyb3Ioc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2N0bChtRGVjb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT1BVU19TRVRfR0FJTihtSGVhZGVyLmdhaW5fZGIpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gT1BVU19PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IE9QVVMgaGVhZGVyIGdhaW47IHN0YXR1cyA9ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBvcHVzX3N0cmVycm9yKHN0YXR1cykpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGNvZGVjRGVsYXlCdWYgJiYgY29kZWNEZWxheUJ1ZlNpemUgPT0gc2l6ZW9mKHVpbnQ2NF90KSkgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOworICAgICAgICAgICAgICAgIG1lbWNweSgmdmFsdWUsIGNvZGVjRGVsYXlCdWYsIHNpemVvZih1aW50NjRfdCkpOworICAgICAgICAgICAgICAgIG1Db2RlY0RlbGF5ID0gbnNfdG9fc2FtcGxlcyh2YWx1ZSwga1JhdGUpOworICAgICAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gbUNvZGVjRGVsYXk7CisgICAgICAgICAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzZWVrUHJlUm9sbEJ1ZiAmJiBzZWVrUHJlUm9sbEJ1ZlNpemUgPT0gc2l6ZW9mKHVpbnQ2NF90KSkgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlOworICAgICAgICAgICAgICAgIG1lbWNweSgmdmFsdWUsIHNlZWtQcmVSb2xsQnVmLCBzaXplb2YodWludDY0X3QpKTsKKyAgICAgICAgICAgICAgICBtU2Vla1ByZVJvbGwgPSBuc190b19zYW1wbGVzKHZhbHVlLCBrUmF0ZSk7CisgICAgICAgICAgICAgICAgKyttSW5wdXRCdWZmZXJDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChpblNpemUgPCA4KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIklucHV0IHNhbXBsZSBzaXplIGlzIHRvbyBzbWFsbC4iKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQ2NF90IHNhbXBsZXMgPSBuc190b19zYW1wbGVzKCAqKHJlaW50ZXJwcmV0X2Nhc3Q8aW50NjRfdCo+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3RfY2FzdDx1aW50OF90ICo+IChkYXRhKSkpLCBrUmF0ZSk7CisgICAgICAgICAgICBpZiAobUlucHV0QnVmZmVyQ291bnQgPT0gMSkgeworICAgICAgICAgICAgICAgIG1Db2RlY0RlbGF5ID0gc2FtcGxlczsKKyAgICAgICAgICAgICAgICBtU2FtcGxlc1RvRGlzY2FyZCA9IG1Db2RlY0RlbGF5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbVNlZWtQcmVSb2xsID0gc2FtcGxlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICsrbUlucHV0QnVmZmVyQ291bnQ7CisgICAgICAgIGlmIChtSW5wdXRCdWZmZXJDb3VudCA9PSAzKSB7CisgICAgICAgICAgICBBTE9HSSgiQ29uZmlndXJpbmcgZGVjb2RlcjogJWQgSHosICVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgICAgICAgICBrUmF0ZSwgbUhlYWRlci5jaGFubmVscyk7CisgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIGtSYXRlKTsKKyAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG1IZWFkZXIuY2hhbm5lbHMpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgeyAmc2FtcGxlUmF0ZUluZm8sICZjaGFubmVsQ291bnRJbmZvIH0sCisgICAgICAgICAgICAgICAgICAgIEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhDMlBhcmFtOjpDb3B5KHNhbXBsZVJhdGVJbmZvKSk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIElnbm9yZSBDU0QgcmUtc3VibWlzc2lvbnMuCisgICAgaWYgKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykpIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFdoZW4gc2Vla2luZyB0byB6ZXJvLCB8bUNvZGVjRGVsYXl8IHNhbXBsZXMgaGFzIHRvIGJlIGRpc2NhcmRlZAorICAgIC8vIGluc3RlYWQgb2YgfG1TZWVrUHJlUm9sbHwgc2FtcGxlcyAoYXMgd2Ugd291bGQgd2hlbiBzZWVraW5nIHRvIGFueQorICAgIC8vIG90aGVyIHRpbWVzdGFtcCkuCisgICAgaWYgKHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCkgPT0gMCkgbVNhbXBsZXNUb0Rpc2NhcmQgPSBtQ29kZWNEZWxheTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAga01heE51bVNhbXBsZXNQZXJCdWZmZXIgKiBrTWF4Q2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgbnVtU2FtcGxlcyA9IG9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlKG1EZWNvZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPiAod1ZpZXcuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtNYXhPcHVzT3V0cHV0UGFja2V0U2l6ZVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAobnVtU2FtcGxlcyA8IDApIHsKKyAgICAgICAgQUxPR0UoIm9wdXNfbXVsdGlzdHJlYW1fZGVjb2RlIHJldHVybmVkIG51bVNhbXBsZXMgJWQiLCBudW1TYW1wbGVzKTsKKyAgICAgICAgbnVtU2FtcGxlcyA9IDA7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCBvdXRPZmZzZXQgPSAwOworICAgIGlmIChtU2FtcGxlc1RvRGlzY2FyZCA+IDApIHsKKyAgICAgICAgaWYgKG1TYW1wbGVzVG9EaXNjYXJkID4gbnVtU2FtcGxlcykgeworICAgICAgICAgICAgbVNhbXBsZXNUb0Rpc2NhcmQgLT0gbnVtU2FtcGxlczsKKyAgICAgICAgICAgIG51bVNhbXBsZXMgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtU2FtcGxlcyAtPSBtU2FtcGxlc1RvRGlzY2FyZDsKKyAgICAgICAgICAgIG91dE9mZnNldCA9IG1TYW1wbGVzVG9EaXNjYXJkICogc2l6ZW9mKGludDE2X3QpICogbUhlYWRlci5jaGFubmVsczsKKyAgICAgICAgICAgIG1TYW1wbGVzVG9EaXNjYXJkID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChudW1TYW1wbGVzKSB7CisgICAgICAgIGludCBvdXRTaXplID0gbnVtU2FtcGxlcyAqIHNpemVvZihpbnQxNl90KSAqIG1IZWFkZXIuY2hhbm5lbHM7CisgICAgICAgIEFMT0dWKCJvdXQgYnVmZmVyIGF0dHIuIG9mZnNldCAlZCBzaXplICVkICIsIG91dE9mZnNldCwgb3V0U2l6ZSk7CisKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhjcmVhdGVMaW5lYXJCdWZmZXIoYmxvY2ssIG91dE9mZnNldCwgb3V0U2l6ZSkpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgYmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2NsYXNzIEMyU29mdE9wdXNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0T3B1c0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRPcHVzRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0T3B1c0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRPcHVzRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0T3B1c0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE9wdXNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRPcHVzRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL29wdXMvQzJTb2Z0T3B1c0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwNzE1YWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNEZWMuaApAQCAtMCwwICsxLDY5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0MyX1NPRlRfT1BVU19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX09QVVNfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK3N0cnVjdCBPcHVzTVNEZWNvZGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRPcHVzRGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE9wdXNEZWMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdE9wdXNEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBrTWF4TnVtU2FtcGxlc1BlckJ1ZmZlciA9IDk2MCAqIDYKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBPcHVzTVNEZWNvZGVyICptRGVjb2RlcjsKKyAgICBPcHVzSGVhZGVyIG1IZWFkZXI7CisKKyAgICBpbnQ2NF90IG1Db2RlY0RlbGF5OworICAgIGludDY0X3QgbVNlZWtQcmVSb2xsOworICAgIGludDY0X3QgbVNhbXBsZXNUb0Rpc2NhcmQ7CisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50OworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKworICAgIHN0YXR1c190IGluaXREZWNvZGVyKCk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRPcHVzRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX09QVVNfREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNFbmMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGQxOTY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmNwcApAQCAtMCwwICsxLDYzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0T3B1c0VuYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oPgorI2luY2x1ZGUgIkMyU29mdE9wdXNFbmMuaCIKKworZXh0ZXJuICJDIiB7CisgICAgI2luY2x1ZGUgPG9wdXMuaD4KKyAgICAjaW5jbHVkZSA8b3B1c19tdWx0aXN0cmVhbS5oPgorfQorCisjZGVmaW5lIERFRkFVTFRfRlJBTUVfRFVSQVRJT05fTVMgMjAKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLm9wdXMuZW5jb2RlciI7CisKK30gIC8vIG5hbWVzcGFjZQorCitzdGF0aWMgY29uc3QgaW50IGtNYXhOdW1DaGFubmVsc1N1cHBvcnRlZCA9IDI7CisKK2NsYXNzIEMyU29mdE9wdXNFbmM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOworICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2FtcGxlUmF0ZSwgQzJfUEFSQU1LRVlfU0FNUExFX1JBVEUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjppbnB1dCgwdSwgNDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgIDgwMDAsIDEyMDAwLCAxNjAwMCwgMjQwMDAsIDQ4MDAwfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dCgwdSwgMSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQ2hhbm5lbENvdW50LCB2YWx1ZSkuaW5SYW5nZSgxLCBrTWF4TnVtQ2hhbm5lbHNTdXBwb3J0ZWQpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigoU2V0dGVyPGRlY2x0eXBlKCptQ2hhbm5lbENvdW50KT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dCgwdSwgMTI4MDAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1CaXRyYXRlLCB2YWx1ZSkuaW5SYW5nZSg1MDAsIDUxMjAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUNvbXBsZXhpdHksIEMyX1BBUkFNS0VZX0NPTVBMRVhJVFkpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUNvbXBsZXhpdHlUdW5pbmc6Om91dHB1dCgwdSwgMTApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNvbXBsZXhpdHksIHZhbHVlKS5pblJhbmdlKDEsIDEwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQ29tcGxleGl0eSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgMzg0MCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRDaGFubmVsQ291bnQoKSBjb25zdCB7IHJldHVybiBtQ2hhbm5lbENvdW50LT52YWx1ZTsgfQorICAgIHVpbnQzMl90IGdldEJpdHJhdGUoKSBjb25zdCB7IHJldHVybiBtQml0cmF0ZS0+dmFsdWU7IH0KKyAgICB1aW50MzJfdCBnZXRDb21wbGV4aXR5KCkgY29uc3QgeyByZXR1cm4gbUNvbXBsZXhpdHktPnZhbHVlOyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db21wbGV4aXR5VHVuaW5nOjpvdXRwdXQ+IG1Db21wbGV4aXR5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdE9wdXNFbmM6OkMyU29mdE9wdXNFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1PdXRwdXRCbG9jayhudWxscHRyKSwKKyAgICAgIG1FbmNvZGVyKG51bGxwdHIpLAorICAgICAgbUlucHV0QnVmZmVyUGNtMTYobnVsbHB0ciksCisgICAgICBtT3V0SW5kZXgoMHUpIHsKK30KKworQzJTb2Z0T3B1c0VuYzo6fkMyU29mdE9wdXNFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNFbmM6Om9uSW5pdCgpIHsKKyAgICByZXR1cm4gaW5pdEVuY29kZXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0T3B1c0VuYzo6Y29uZmlndXJlRW5jb2RlcigpIHsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBtb25vX21hcHBpbmdbMjU2XSA9IHswfTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBzdGVyZW9fbWFwcGluZ1syNTZdID0gezAsIDF9OworICAgIG1TYW1wbGVSYXRlID0gbUludGYtPmdldFNhbXBsZVJhdGUoKTsKKyAgICBtQ2hhbm5lbENvdW50ID0gbUludGYtPmdldENoYW5uZWxDb3VudCgpOworICAgIHVpbnQzMl90IGJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZSgpOworICAgIGludCBjb21wbGV4aXR5ID0gbUludGYtPmdldENvbXBsZXhpdHkoKTsKKyAgICBtTnVtU2FtcGxlc1BlckZyYW1lID0gbVNhbXBsZVJhdGUgLyAoMTAwMCAvIG1GcmFtZUR1cmF0aW9uTXMpOworICAgIG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUgPQorICAgICAgICBtQ2hhbm5lbENvdW50ICogbU51bVNhbXBsZXNQZXJGcmFtZSAqIHNpemVvZihpbnQxNl90KTsKKyAgICBpbnQgZXJyID0gQzJfT0s7CisKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBtYXBwaW5nOworICAgIGlmIChtQ2hhbm5lbENvdW50ID09IDEpIHsKKyAgICAgICAgbWFwcGluZyA9IG1vbm9fbWFwcGluZzsKKyAgICB9IGVsc2UgaWYgKG1DaGFubmVsQ291bnQgPT0gMikgeworICAgICAgICBtYXBwaW5nID0gc3RlcmVvX21hcHBpbmc7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIk51bWJlciBvZiBjaGFubmVscyAoJWQpIGlzIG5vdCBzdXBwb3J0ZWQiLCBtQ2hhbm5lbENvdW50KTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAobUVuY29kZXIgIT0gbnVsbHB0cikgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfZGVzdHJveShtRW5jb2Rlcik7CisgICAgfQorCisgICAgbUVuY29kZXIgPSBvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3JlYXRlKG1TYW1wbGVSYXRlLCBtQ2hhbm5lbENvdW50LAorICAgICAgICAxLCBtQ2hhbm5lbENvdW50IC0gMSwgbWFwcGluZywgT1BVU19BUFBMSUNBVElPTl9BVURJTywgJmVycik7CisgICAgaWYgKGVycikgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGNyZWF0ZSBsaWJvcHVzIGVuY29kZXIuIEVycm9yIGNvZGU6ICVpIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICAvLyBDb21wbGV4aXR5CisgICAgaWYgKG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwoCisgICAgICAgICAgICBtRW5jb2RlciwgT1BVU19TRVRfQ09NUExFWElUWShjb21wbGV4aXR5KSkgIT0gT1BVU19PSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCBjb21wbGV4aXR5Iik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gRFRYCisgICAgaWYgKG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwobUVuY29kZXIsIE9QVVNfU0VUX0RUWCgwKSAhPSBPUFVTX09LKSkgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCBkdHgiKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBBcHBsaWNhdGlvbgorICAgIGlmIChvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKG1FbmNvZGVyLAorICAgICAgICAgICAgT1BVU19TRVRfQVBQTElDQVRJT04oT1BVU19BUFBMSUNBVElPTl9BVURJTykpICE9IE9QVVNfT0spIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBzZXQgYXBwbGljYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBTaWduYWwgdHlwZQorICAgIGlmIChvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKG1FbmNvZGVyLCBPUFVTX1NFVF9TSUdOQUwoT1BVU19BVVRPKSkgIT0KKyAgICAgICAgT1BVU19PSykgeworICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHNldCBzaWduYWwiKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDb25zdHJhaW5lZCBWQlIKKyAgICBpZiAob3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChtRW5jb2RlciwgT1BVU19TRVRfVkJSKDEpICE9IE9QVVNfT0spKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IHZiciB0eXBlIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorICAgIGlmIChvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKG1FbmNvZGVyLCBPUFVTX1NFVF9WQlJfQ09OU1RSQUlOVCgxKSAhPQorICAgICAgICAgICAgT1BVU19PSykpIHsKKyAgICAgICAgQUxPR0UoImZhaWxlZCB0byBzZXQgdmJyIGNvbnN0cmFpbnQiKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBCaXRyYXRlCisgICAgaWYgKG9wdXNfbXVsdGlzdHJlYW1fZW5jb2Rlcl9jdGwobUVuY29kZXIsIE9QVVNfU0VUX0JJVFJBVEUoYml0cmF0ZSkpICE9CisgICAgICAgICAgICBPUFVTX09LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IGJpdHJhdGUiKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBTZXQgc2VlayBwcmVyb2xsIHRvIDgwIG1zCisgICAgbVNlZWtQcmVSb2xsID0gODAwMDAwMDA7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRW5jOjppbml0RW5jb2RlcigpIHsKKyAgICBtU2lnbmFsbGVkRW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbUhlYWRlckdlbmVyYXRlZCA9IGZhbHNlOworICAgIG1Jc0ZpcnN0RnJhbWUgPSB0cnVlOworICAgIG1FbmNvZGVyRmx1c2hlZCA9IGZhbHNlOworICAgIG1CdWZmZXJBdmFpbGFibGUgPSBmYWxzZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMHVsbDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDA7CisgICAgbUZpbGxlZExlbiA9IDA7CisgICAgbUZyYW1lRHVyYXRpb25NcyA9IERFRkFVTFRfRlJBTUVfRFVSQVRJT05fTVM7CisgICAgaWYgKCFtSW5wdXRCdWZmZXJQY20xNikgeworICAgICAgICBtSW5wdXRCdWZmZXJQY20xNiA9CisgICAgICAgICAgICAoaW50MTZfdCopbWFsbG9jKGtGcmFtZVNpemUgKiBrTWF4TnVtQ2hhbm5lbHMgKiBzaXplb2YoaW50MTZfdCkpOworICAgIH0KKyAgICBpZiAoIW1JbnB1dEJ1ZmZlclBjbTE2KSByZXR1cm4gQzJfTk9fTUVNT1JZOworCisgICAgLyogRGVmYXVsdCBDb25maWd1cmF0aW9ucyAqLworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGNvbmZpZ3VyZUVuY29kZXIoKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRW5jOjpvblN0b3AoKSB7CisgICAgbVNpZ25hbGxlZEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1Jc0ZpcnN0RnJhbWUgPSB0cnVlOworICAgIG1FbmNvZGVyRmx1c2hlZCA9IGZhbHNlOworICAgIG1CdWZmZXJBdmFpbGFibGUgPSBmYWxzZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMHVsbDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDB1OworICAgIG1GaWxsZWRMZW4gPSAwOworICAgIGlmIChtRW5jb2RlcikgeworICAgICAgICBpbnQgc3RhdHVzID0gb3B1c19tdWx0aXN0cmVhbV9lbmNvZGVyX2N0bChtRW5jb2RlciwgT1BVU19SRVNFVF9TVEFURSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT1BVU19PSykgeworICAgICAgICAgICAgQUxPR0UoIk9QVVNfUkVTRVRfU1RBVEUgZmFpbGVkIHN0YXR1cyA9ICVzIiwgb3B1c19zdHJlcnJvcihzdGF0dXMpKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorICAgIGlmIChtT3V0cHV0QmxvY2spIG1PdXRwdXRCbG9jay5yZXNldCgpOworICAgIG1PdXRwdXRCbG9jayA9IG51bGxwdHI7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0T3B1c0VuYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRPcHVzRW5jOjpvblJlbGVhc2UoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7CisgICAgaWYgKG1JbnB1dEJ1ZmZlclBjbTE2KSB7CisgICAgICAgIGZyZWUobUlucHV0QnVmZmVyUGNtMTYpOworICAgICAgICBtSW5wdXRCdWZmZXJQY20xNiA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtRW5jb2RlcikgeworICAgICAgICBvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfZGVzdHJveShtRW5jb2Rlcik7CisgICAgICAgIG1FbmNvZGVyID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdE9wdXNFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCisvLyBEcmFpbiB0aGUgZW5jb2RlciB0byBnZXQgbGFzdCBmcmFtZXMgKGlmIGFueSkKK2ludCBDMlNvZnRPcHVzRW5jOjpkcmFpbkVuY29kZXIodWludDhfdCogb3V0UHRyKSB7CisgICAgbWVtc2V0KCh1aW50OF90ICopbUlucHV0QnVmZmVyUGNtMTYgKyBtRmlsbGVkTGVuLCAwLAorICAgICAgICAobU51bVBjbUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKTsKKyAgICBpbnQgZW5jb2RlZEJ5dGVzID0gb3B1c19tdWx0aXN0cmVhbV9lbmNvZGUoCisgICAgICAgIG1FbmNvZGVyLCBtSW5wdXRCdWZmZXJQY20xNiwgbU51bVNhbXBsZXNQZXJGcmFtZSwgb3V0UHRyLCBrTWF4UGF5bG9hZCk7CisgICAgaWYgKGVuY29kZWRCeXRlcyA+IG1PdXRwdXRCbG9jay0+Y2FwYWNpdHkoKSkgeworICAgICAgICBBTE9HRSgibm90IGVub3VnaCBzcGFjZSBsZWZ0IHRvIHdyaXRlIGVuY29kZWQgZGF0YSwgZHJvcHBpbmcgJWQgYnl0ZXMiLAorICAgICAgICAgICAgICBtQnl0ZXNFbmNvZGVkKTsKKyAgICAgICAgLy8gYSBmYXRhbCBlcnJvciB3b3VsZCBzdG9wIHRoZSBlbmNvZGluZworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIEFMT0dWKCJlbmNvZGVkICVpIE9wdXMgYnl0ZXMgZnJvbSAlenUgUENNIGJ5dGVzIiwgZW5jb2RlZEJ5dGVzLAorICAgICAgICAgIG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUpOworICAgIG1FbmNvZGVyRmx1c2hlZCA9IHRydWU7CisgICAgbUZpbGxlZExlbiA9IDA7CisgICAgcmV0dXJuIGVuY29kZWRCeXRlczsKK30KKwordm9pZCBDMlNvZnRPcHVzRW5jOjpwcm9jZXNzKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIHBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIHNpemVfdCBpbk9mZnNldCA9IDB1OworICAgIHNpemVfdCBpblNpemUgPSAwdTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBpZiAoIXdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICByVmlldyA9CisgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgaW5TaXplID0gclZpZXcuY2FwYWNpdHkoKTsKKyAgICAgICAgaWYgKGluU2l6ZSAmJiByVmlldy5lcnJvcigpKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCB2aWV3IG1hcCBmYWlsZWQgJWQiLCByVmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisKKyAgICBpZiAoIW1FbmNvZGVyKSB7CisgICAgICAgIGlmIChpbml0RW5jb2RlcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiaW5pdEVuY29kZXIgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycjsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1Jc0ZpcnN0RnJhbWUgJiYgaW5TaXplID4gMCkgeworICAgICAgICBtQW5jaG9yVGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgICAgICBtSXNGaXJzdEZyYW1lID0gZmFsc2U7CisgICAgfQorCisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfTsKKyAgICBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKGtNYXhQYXlsb2FkLCB1c2FnZSwgJm1PdXRwdXRCbG9jayk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRSgiZmV0Y2hMaW5lYXJCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX05PX01FTU9SWTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gbU91dHB1dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgbU91dHB1dEJsb2NrLnJlc2V0KCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgaW5Qb3MgPSAwOworICAgIHNpemVfdCBwcm9jZXNzU2l6ZSA9IDA7CisgICAgbUJ5dGVzRW5jb2RlZCA9IDA7CisgICAgdWludDY0X3Qgb3V0VGltZVN0YW1wID0gMHU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXI7CisgICAgdWludDY0X3QgaW5wdXRJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgIGNvbnN0IHVpbnQ4X3QqIGluUHRyID0gclZpZXcuZGF0YSgpICsgaW5PZmZzZXQ7CisKKyAgICBjbGFzcyBGaWxsV29yayB7CisgICAgcHVibGljOgorICAgICAgICBGaWxsV29yayh1aW50MzJfdCBmbGFncywgQzJXb3JrT3JkaW5hbFN0cnVjdCBvcmRpbmFsLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpCisgICAgICAgICAgICA6IG1GbGFncyhmbGFncyksIG1PcmRpbmFsKG9yZGluYWwpLCBtQnVmZmVyKGJ1ZmZlcikgeworICAgICAgICB9CisgICAgICAgIH5GaWxsV29yaygpID0gZGVmYXVsdDsKKworICAgICAgICB2b2lkIG9wZXJhdG9yKCkoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmspIHsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCltRmxhZ3M7CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSBtT3JkaW5hbDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKG1CdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoInRpbWVzdGFtcCA9ICVsbGQsIGluZGV4ID0gJWxsZCwgdy8lcyBidWZmZXIiLAorICAgICAgICAgICAgICAgICAgbU9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpLAorICAgICAgICAgICAgICAgICAgbU9yZGluYWwuZnJhbWVJbmRleC5wZWVrbGwoKSwKKyAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPyAiIiA6ICJvIik7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IHVpbnQzMl90IG1GbGFnczsKKyAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCBtT3JkaW5hbDsKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBtQnVmZmVyOworICAgIH07CisKKyAgICBDMldvcmtPcmRpbmFsU3RydWN0IG91dE9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworCisgICAgaWYgKCFtSGVhZGVyR2VuZXJhdGVkKSB7CisgICAgICAgIHVpbnQ4X3QgaGVhZGVyW0FPUFVTX1VOSUZJRURfQ1NEX01BWFNJWkVdOworICAgICAgICBtZW1zZXQoaGVhZGVyLCAwLCBzaXplb2YoaGVhZGVyKSk7CisKKyAgICAgICAgLy8gR2V0IGNvZGVjRGVsYXkKKyAgICAgICAgaW50MzJfdCBsb29rYWhlYWQ7CisgICAgICAgIGlmIChvcHVzX211bHRpc3RyZWFtX2VuY29kZXJfY3RsKG1FbmNvZGVyLCBPUFVTX0dFVF9MT09LQUhFQUQoJmxvb2thaGVhZCkpICE9CisgICAgICAgICAgICAgICAgT1BVU19PSykgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBnZXQgbG9va2FoZWFkIik7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1Db2RlY0RlbGF5ID0gbG9va2FoZWFkICogMTAwMDAwMDAwMGxsIC8gbVNhbXBsZVJhdGU7CisKKyAgICAgICAgT3B1c0hlYWRlciBvcHVzSGVhZGVyOworICAgICAgICBtZW1zZXQoJm9wdXNIZWFkZXIsIDAsIHNpemVvZihvcHVzSGVhZGVyKSk7CisgICAgICAgIG9wdXNIZWFkZXIuY2hhbm5lbHMgPSBtQ2hhbm5lbENvdW50OworICAgICAgICBvcHVzSGVhZGVyLm51bV9zdHJlYW1zID0gbUNoYW5uZWxDb3VudDsKKyAgICAgICAgb3B1c0hlYWRlci5udW1fY291cGxlZCA9IDA7CisgICAgICAgIG9wdXNIZWFkZXIuY2hhbm5lbF9tYXBwaW5nID0gKChtQ2hhbm5lbENvdW50ID4gOCkgPyAyNTUgOiAobUNoYW5uZWxDb3VudCA+IDIpKTsKKyAgICAgICAgb3B1c0hlYWRlci5nYWluX2RiID0gMDsKKyAgICAgICAgb3B1c0hlYWRlci5za2lwX3NhbXBsZXMgPSBsb29rYWhlYWQ7CisgICAgICAgIGludCBoZWFkZXJMZW4gPSBXcml0ZU9wdXNIZWFkZXJzKG9wdXNIZWFkZXIsIG1TYW1wbGVSYXRlLCBoZWFkZXIsCisgICAgICAgICAgICBzaXplb2YoaGVhZGVyKSwgbUNvZGVjRGVsYXksIG1TZWVrUHJlUm9sbCk7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+IGNzZCA9CisgICAgICAgICAgICBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpBbGxvY1VuaXF1ZShoZWFkZXJMZW4sIDB1KTsKKyAgICAgICAgaWYgKCFjc2QpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDU0QgYWxsb2NhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoInB1dCBjc2QsICVkIGJ5dGVzIiwgaGVhZGVyTGVuKTsKKyAgICAgICAgbWVtY3B5KGNzZC0+bS52YWx1ZSwgaGVhZGVyLCBoZWFkZXJMZW4pOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjayhzdGQ6Om1vdmUoY3NkKSk7CisgICAgICAgIG1IZWFkZXJHZW5lcmF0ZWQgPSB0cnVlOworICAgIH0KKworICAgIC8qCisgICAgICogRm9yIGJ1ZmZlciBzaXplIHdoaWNoIGlzIG5vdCBhIG11bHRpcGxlIG9mIG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUsIHdlIHdpbGwKKyAgICAgKiBhY2N1bXVsYXRlIHRoZSBpbnB1dCBhbmQga2VlcCBpdC4gT25jZSB0aGUgaW5wdXQgaXMgZmlsbGVkIHdpdGggZXhwZWN0ZWQgbnVtYmVyCisgICAgICogb2YgYnl0ZXMsIHdlIHdpbGwgc2VuZCBpdCB0byBlbmNvZGVyLiBtRmlsbGVkTGVuIG1hbmFnZXMgdGhlIGJ5dGVzIG9mIGlucHV0IHlldAorICAgICAqIHRvIGJlIHByb2Nlc3NlZC4gVGhlIG5leHQgY2FsbCB3aWxsIGZpbGwgbU51bVBjbUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4KKyAgICAgKiBieXRlcyB0byBpbnB1dCBhbmQgc2VuZCBpdCB0byB0aGUgZW5jb2Rlci4KKyAgICAgKi8KKyAgICB3aGlsZSAoaW5Qb3MgPCBpblNpemUpIHsKKyAgICAgICAgY29uc3QgdWludDhfdCogcGNtQnl0ZXMgPSBpblB0ciArIGluUG9zOworICAgICAgICBpbnQgZmlsbGVkU2FtcGxlcyA9IG1GaWxsZWRMZW4gLyBzaXplb2YoaW50MTZfdCk7CisgICAgICAgIGlmICgoaW5Qb3MgKyAobU51bVBjbUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW4pKSA8PSBpblNpemUpIHsKKyAgICAgICAgICAgIHByb2Nlc3NTaXplID0gbU51bVBjbUJ5dGVzUGVySW5wdXRGcmFtZSAtIG1GaWxsZWRMZW47CisgICAgICAgICAgICBtQnVmZmVyQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByb2Nlc3NTaXplID0gaW5TaXplIC0gaW5Qb3M7CisgICAgICAgICAgICBtQnVmZmVyQXZhaWxhYmxlID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1JbnB1dEJ1ZmZlclBjbTE2ICsgZmlsbGVkU2FtcGxlcywgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgKG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUgLSBtRmlsbGVkTGVuKSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlckF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgdW5zaWduZWQgbklucHV0U2FtcGxlcyA9IHByb2Nlc3NTaXplIC8gc2l6ZW9mKGludDE2X3QpOworCisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuSW5wdXRTYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGludDMyX3QgZGF0YSA9IHBjbUJ5dGVzWzIgKiBpICsgMV0gPDwgOCB8IHBjbUJ5dGVzWzIgKiBpXTsKKyAgICAgICAgICAgIGRhdGEgPSAoKGRhdGEgJiAweEZGRkYpIF4gMHg4MDAwKSAtIDB4ODAwMDsKKyAgICAgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTE2W2kgKyBmaWxsZWRTYW1wbGVzXSA9IGRhdGE7CisgICAgICAgIH0KKyAgICAgICAgaW5Qb3MgKz0gcHJvY2Vzc1NpemU7CisgICAgICAgIG1GaWxsZWRMZW4gKz0gcHJvY2Vzc1NpemU7CisgICAgICAgIGlmICghbUJ1ZmZlckF2YWlsYWJsZSkgYnJlYWs7CisgICAgICAgIHVpbnQ4X3QqIG91dFB0ciA9IHdWaWV3LmRhdGEoKSArIG1CeXRlc0VuY29kZWQ7CisgICAgICAgIGludCBlbmNvZGVkQnl0ZXMgPQorICAgICAgICAgICAgb3B1c19tdWx0aXN0cmVhbV9lbmNvZGUobUVuY29kZXIsIG1JbnB1dEJ1ZmZlclBjbTE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bVNhbXBsZXNQZXJGcmFtZSwgb3V0UHRyLCBrTWF4UGF5bG9hZCAtIG1CeXRlc0VuY29kZWQpOworICAgICAgICBBTE9HVigiZW5jb2RlZCAlaSBPcHVzIGJ5dGVzIGZyb20gJXp1IFBDTSBieXRlcyIsIGVuY29kZWRCeXRlcywKKyAgICAgICAgICAgICAgcHJvY2Vzc1NpemUpOworCisgICAgICAgIGlmIChlbmNvZGVkQnl0ZXMgPCAwIHx8IGVuY29kZWRCeXRlcyA+IChrTWF4UGF5bG9hZCAtIG1CeXRlc0VuY29kZWQpKSB7CisgICAgICAgICAgICBBTE9HRSgib3B1c19lbmNvZGUgZmFpbGVkLCBlbmNvZGVkQnl0ZXMgOiAlZCIsIGVuY29kZWRCeXRlcyk7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIG91dE9yZGluYWwuZnJhbWVJbmRleCA9IG1PdXRJbmRleCsrOworICAgICAgICAgICAgb3V0T3JkaW5hbC50aW1lc3RhbXAgPSBtQW5jaG9yVGltZVN0YW1wICsgb3V0VGltZVN0YW1wOworICAgICAgICAgICAgY2xvbmVBbmRTZW5kKAorICAgICAgICAgICAgICAgIGlucHV0SW5kZXgsIHdvcmssCisgICAgICAgICAgICAgICAgRmlsbFdvcmsoQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSwgb3V0T3JkaW5hbCwgYnVmZmVyKSk7CisgICAgICAgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZW5jb2RlZEJ5dGVzID4gMCkgeworICAgICAgICAgICAgYnVmZmVyID0KKyAgICAgICAgICAgICAgICBjcmVhdGVMaW5lYXJCdWZmZXIobU91dHB1dEJsb2NrLCBtQnl0ZXNFbmNvZGVkLCBlbmNvZGVkQnl0ZXMpOworICAgICAgICB9CisgICAgICAgIG1CeXRlc0VuY29kZWQgKz0gZW5jb2RlZEJ5dGVzOworICAgICAgICBtUHJvY2Vzc2VkU2FtcGxlcyArPSAoZmlsbGVkU2FtcGxlcyArIG5JbnB1dFNhbXBsZXMpOworICAgICAgICBvdXRUaW1lU3RhbXAgPQorICAgICAgICAgICAgbVByb2Nlc3NlZFNhbXBsZXMgKiAxMDAwMDAwbGwgLyBtQ2hhbm5lbENvdW50IC8gbVNhbXBsZVJhdGU7CisgICAgICAgIGlmICgocHJvY2Vzc1NpemUgKyBtRmlsbGVkTGVuKSA8IG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUpCisgICAgICAgICAgICBtRW5jb2RlckZsdXNoZWQgPSB0cnVlOworICAgICAgICBtRmlsbGVkTGVuID0gMDsKKyAgICB9CisKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKGVvcykgeworICAgICAgICBBTE9HVigic2lnbmFsbGVkIGVvcyIpOworICAgICAgICBtU2lnbmFsbGVkRW9zID0gdHJ1ZTsKKyAgICAgICAgaWYgKCFtRW5jb2RlckZsdXNoZWQpIHsKKyAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBvdXRPcmRpbmFsLmZyYW1lSW5kZXggPSBtT3V0SW5kZXgrKzsKKyAgICAgICAgICAgICAgICBvdXRPcmRpbmFsLnRpbWVzdGFtcCA9IG1BbmNob3JUaW1lU3RhbXAgKyBvdXRUaW1lU3RhbXA7CisgICAgICAgICAgICAgICAgY2xvbmVBbmRTZW5kKAorICAgICAgICAgICAgICAgICAgICBpbnB1dEluZGV4LCB3b3JrLAorICAgICAgICAgICAgICAgICAgICBGaWxsV29yayhDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFLCBvdXRPcmRpbmFsLCBidWZmZXIpKTsKKyAgICAgICAgICAgICAgICBidWZmZXIucmVzZXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIGRyYWluIHRoZSBlbmNvZGVyIGZvciBsYXN0IGJ1ZmZlcgorICAgICAgICAgICAgZHJhaW5JbnRlcm5hbChwb29sLCB3b3JrKTsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgfQorICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgb3V0T3JkaW5hbC5mcmFtZUluZGV4ID0gbU91dEluZGV4Kys7CisgICAgICAgIG91dE9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICAgICAgRmlsbFdvcmsoKEMyRnJhbWVEYXRhOjpmbGFnc190KShmbGFncyksIG91dE9yZGluYWwsIGJ1ZmZlcikod29yayk7CisgICAgICAgIGJ1ZmZlci5yZXNldCgpOworICAgIH0KKyAgICBtT3V0cHV0QmxvY2sgPSBudWxscHRyOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRW5jOjpkcmFpbkludGVybmFsKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sLAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgIG1CeXRlc0VuY29kZWQgPSAwOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gbnVsbHB0cjsKKyAgICBDMldvcmtPcmRpbmFsU3RydWN0IG91dE9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX07CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jayhrTWF4UGF5bG9hZCwgdXNhZ2UsICZtT3V0cHV0QmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgIH0KKworICAgIEMyV3JpdGVWaWV3IHdWaWV3ID0gbU91dHB1dEJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgid3JpdGUgdmlldyBtYXAgZmFpbGVkICVkIiwgd1ZpZXcuZXJyb3IoKSk7CisgICAgICAgIG1PdXRwdXRCbG9jay5yZXNldCgpOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIGludCBlbmNCeXRlcyA9IGRyYWluRW5jb2Rlcih3Vmlldy5kYXRhKCkpOworICAgIGlmIChlbmNCeXRlcyA+IDApIG1CeXRlc0VuY29kZWQgKz0gZW5jQnl0ZXM7CisgICAgaWYgKG1CeXRlc0VuY29kZWQgPiAwKSB7CisgICAgICAgIGJ1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihtT3V0cHV0QmxvY2ssIDAsIG1CeXRlc0VuY29kZWQpOworICAgICAgICBtT3V0cHV0QmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgbVByb2Nlc3NlZFNhbXBsZXMgKz0gKG1OdW1QY21CeXRlc1BlcklucHV0RnJhbWUgLyBzaXplb2YoaW50MTZfdCkpOworICAgIHVpbnQ2NF90IG91dFRpbWVTdGFtcCA9CisgICAgICAgIG1Qcm9jZXNzZWRTYW1wbGVzICogMTAwMDAwMGxsIC8gbUNoYW5uZWxDb3VudCAvIG1TYW1wbGVSYXRlOworICAgIG91dE9yZGluYWwuZnJhbWVJbmRleCA9IG1PdXRJbmRleCsrOworICAgIG91dE9yZGluYWwudGltZXN0YW1wID0gbUFuY2hvclRpbWVTdGFtcCArIG91dFRpbWVTdGFtcDsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPQorICAgICAgICAoQzJGcmFtZURhdGE6OmZsYWdzX3QpKGVvcyA/IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0gOiAwKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gb3V0T3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgfQorICAgIG1PdXRwdXRCbG9jayA9IG51bGxwdHI7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRPcHVzRW5jOjpkcmFpbih1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKyAgICBtSXNGaXJzdEZyYW1lID0gdHJ1ZTsKKyAgICBtQW5jaG9yVGltZVN0YW1wID0gMHVsbDsKKyAgICBtUHJvY2Vzc2VkU2FtcGxlcyA9IDB1OworICAgIHJldHVybiBkcmFpbkludGVybmFsKHBvb2wsIG51bGxwdHIpOworfQorCitjbGFzcyBDMlNvZnRPcHVzRW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdE9wdXNFbmNGYWN0b3J5KCkKKyAgICAgICAgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHt9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgbmV3IEMyU29mdE9wdXNFbmMoCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0T3B1c0VuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0T3B1c0VuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdE9wdXNFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdE9wdXNFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0T3B1c0VuY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9vcHVzL0MyU29mdE9wdXNFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjRkOGYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvb3B1cy9DMlNvZnRPcHVzRW5jLmgKQEAgLTAsMCArMSw5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX09QVVNfRU5DX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9PUFVTX0VOQ19IXworCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisjZGVmaW5lIE1JTihhLCBiKSAoKChhKSA8IChiKSkgPyAoYSkgOiAoYikpCisKK3N0cnVjdCBPcHVzTVNFbmNvZGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRPcHVzRW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdE9wdXNFbmMoY29uc3QgY2hhciAqbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdE9wdXNFbmMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICAgIC8qIE9QVVNfRlJBTUVTSVpFXzIwX01TICovCisgICAgY29uc3QgaW50IGtGcmFtZVNpemUgPSA5NjA7CisgICAgY29uc3QgaW50IGtNYXhTYW1wbGVSYXRlID0gNDgwMDA7CisgICAgY29uc3QgaW50IGtNaW5TYW1wbGVSYXRlID0gODAwMDsKKyAgICBjb25zdCBpbnQga01heFBheWxvYWQgPSAoNDAwMCAqIGtNYXhTYW1wbGVSYXRlKSAvIGtNaW5TYW1wbGVSYXRlOworICAgIGNvbnN0IGludCBrTWF4TnVtQ2hhbm5lbHMgPSA4OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbU91dHB1dEJsb2NrOworCisgICAgT3B1c01TRW5jb2RlciogbUVuY29kZXI7CisgICAgaW50MTZfdCogbUlucHV0QnVmZmVyUGNtMTY7CisKKyAgICBib29sIG1IZWFkZXJHZW5lcmF0ZWQ7CisgICAgYm9vbCBtSXNGaXJzdEZyYW1lOworICAgIGJvb2wgbUVuY29kZXJGbHVzaGVkOworICAgIGJvb2wgbUJ1ZmZlckF2YWlsYWJsZTsKKyAgICBib29sIG1TaWduYWxsZWRFb3M7CisgICAgYm9vbCBtU2lnbmFsbGVkRXJyb3I7CisgICAgdWludDMyX3QgbVNhbXBsZVJhdGU7CisgICAgdWludDMyX3QgbUNoYW5uZWxDb3VudDsKKyAgICB1aW50MzJfdCBtRnJhbWVEdXJhdGlvbk1zOworICAgIHVpbnQ2NF90IG1BbmNob3JUaW1lU3RhbXA7CisgICAgdWludDY0X3QgbVByb2Nlc3NlZFNhbXBsZXM7CisgICAgLy8gQ29kZWMgZGVsYXkgaW4gbnMKKyAgICB1aW50NjRfdCBtQ29kZWNEZWxheTsKKyAgICAvLyBTZWVrIHByZS1yb2xsIGluIG5zCisgICAgdWludDY0X3QgbVNlZWtQcmVSb2xsOworICAgIGludCBtTnVtU2FtcGxlc1BlckZyYW1lOworICAgIGludCBtQnl0ZXNFbmNvZGVkOworICAgIGludDMyX3QgbUZpbGxlZExlbjsKKyAgICBzaXplX3QgbU51bVBjbUJ5dGVzUGVySW5wdXRGcmFtZTsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtT3V0SW5kZXg7CisgICAgYzJfc3RhdHVzX3QgaW5pdEVuY29kZXIoKTsKKyAgICBjMl9zdGF0dXNfdCBjb25maWd1cmVFbmNvZGVyKCk7CisgICAgaW50IGRyYWluRW5jb2Rlcih1aW50OF90KiBvdXRQdHIpOworICAgIGMyX3N0YXR1c190IGRyYWluSW50ZXJuYWwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKTsKKworICAgIEMyX0RPX05PVF9DT1BZKEMyU29mdE9wdXNFbmMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfT1BVU19FTkNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5NDRkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsOSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF9yYXdkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFJhd0RlYy5jcHAiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9DMlNvZnRSYXdEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVlYjkwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9DMlNvZnRSYXdEZWMuY3BwCkBAIC0wLDAgKzEsMjI2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRSYXdEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdFJhd0RlYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC5yYXcuZGVjb2RlciI7CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBDMlNvZnRSYXdEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVykgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7CisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKAorICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgNDQxMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5pblJhbmdlKDgwMDAsIDM4NDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDIpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoMSwgOTgzMDQwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1CaXRyYXRlKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1JbnB1dE1heEJ1ZlNpemUsIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0KDB1LCA2NCAqIDEwMjQpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBjbUVuY29kaW5nSW5mbywgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QY21FbmNvZGluZ0luZm86Om91dHB1dCgwdSwgQzJDb25maWc6OlBDTV8xNikpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtUGNtRW5jb2RpbmdJbmZvLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBDTV8xNiwKKyAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQQ01fOCwKKyAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQQ01fRkxPQVR9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoKFNldHRlcjxkZWNsdHlwZSgqbVBjbUVuY29kaW5nSW5mbyk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOjpvdXRwdXQ+IG1QY21FbmNvZGluZ0luZm87Cit9OworCitDMlNvZnRSYXdEZWM6OkMyU29mdFJhd0RlYygKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+ICZpbnRmSW1wbCkKKyAgICA6IFNpbXBsZUMyQ29tcG9uZW50KHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlSW50ZXJmYWNlPEludGZJbXBsPj4obmFtZSwgaWQsIGludGZJbXBsKSksCisgICAgICBtSW50ZihpbnRmSW1wbCkgeworfQorCitDMlNvZnRSYXdEZWM6On5DMlNvZnRSYXdEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFJhd0RlYzo6b25Jbml0KCkgeworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFJhd0RlYzo6b25TdG9wKCkgeworICAgIG1TaWduYWxsZWRFb3MgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0UmF3RGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdFJhd0RlYzo6b25SZWxlYXNlKCkgeworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRSYXdEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdFJhd0RlYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAodm9pZClwb29sOworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisKKyAgICBpZiAobVNpZ25hbGxlZEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiaW4gYnVmZmVyIGF0dHIuIHRpbWVzdGFtcCAlZCBmcmFtZWluZGV4ICVkIiwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworCisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gd29yay0+aW5wdXQuZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKHdvcmstPmlucHV0LmJ1ZmZlcnNbMF0pOworICAgIH0KKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIG1TaWduYWxsZWRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigic2lnbmFsbGVkIEVPUyIpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0UmF3RGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgKHZvaWQpIHBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworY2xhc3MgQzJTb2Z0UmF3RGVjRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFJhd0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRSYXdEZWMoQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0UmF3RGVjOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdFJhd0RlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFJhd0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFJhd0RlY0ZhY3RvcnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtSGVscGVyOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworZXh0ZXJuICJDIiA6OkMyQ29tcG9uZW50RmFjdG9yeSogQ3JlYXRlQ29kZWMyRmFjdG9yeSgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIG5ldyA6OmFuZHJvaWQ6OkMyU29mdFJhd0RlY0ZhY3RvcnkoKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIERlc3Ryb3lDb2RlYzJGYWN0b3J5KDo6QzJDb21wb25lbnRGYWN0b3J5KiBmYWN0b3J5KSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGRlbGV0ZSBmYWN0b3J5OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5oIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L0MyU29mdFJhd0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkZmRlYzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy9yYXcvQzJTb2Z0UmF3RGVjLmgKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1JBV19ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1JBV19ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQzJTb2Z0UmF3RGVjIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdFJhd0RlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKyAgICB2aXJ0dWFsIH5DMlNvZnRSYXdEZWMoKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZTsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZTsKKyAgICB2b2lkIHByb2Nlc3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IGRyYWluKAorICAgICAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7Citwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgYm9vbCBtU2lnbmFsbGVkRW9zOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0UmF3RGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1JBV19ERUNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMiBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3Jhdy9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmNvcHkgdG8gbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L05PVElDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTk9USUNFCmNvcHkgdG8gbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvcmF3L05PVElDRQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWY0ODVkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMSBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92b3JiaXNkZWMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkMyU29mdFZvcmJpc0RlYy5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbImxpYnZvcmJpc2lkZWMiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0MyU29mdFZvcmJpc0RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU1NjRkOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuY3BwCkBAIC0wLDAgKzEsNDg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRWb3JiaXNEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdFZvcmJpc0RlYy5oIgorCitleHRlcm4gIkMiIHsKKyAgICAjaW5jbHVkZSA8VHJlbW9sby9jb2RlY19pbnRlcm5hbC5oPgorCisgICAgaW50IF92b3JiaXNfdW5wYWNrX2Jvb2tzKHZvcmJpc19pbmZvICp2aSxvZ2dwYWNrX2J1ZmZlciAqb3BiKTsKKyAgICBpbnQgX3ZvcmJpc191bnBhY2tfaW5mbyh2b3JiaXNfaW5mbyAqdmksb2dncGFja19idWZmZXIgKm9wYik7CisgICAgaW50IF92b3JiaXNfdW5wYWNrX2NvbW1lbnQodm9yYmlzX2NvbW1lbnQgKnZjLG9nZ3BhY2tfYnVmZmVyICpvcGIpOworfQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC52b3JiaXMuZGVjb2RlciI7CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBDMlNvZnRWb3JiaXNEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7CisgICAgICAgIG5vSW5wdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vT3V0cHV0UmVmZXJlbmNlcygpOworICAgICAgICBub0lucHV0TGF0ZW5jeSgpOworICAgICAgICBub1RpbWVTdHJldGNoKCk7CisgICAgICAgIHNldERlcml2ZWRJbnN0YW5jZSh0aGlzKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUF0dHJpYiwgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVMpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nKAorICAgICAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6QVRUUklCX0lTX1RFTVBPUkFMKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1TYW1wbGVSYXRlLCBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCgwdSwgNDgwMDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVNhbXBsZVJhdGUsIHZhbHVlKS5pblJhbmdlKDgwMDAsIDE5MjAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoMzIwMDAsIDUwMDAwMCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGUpPjo6Tm9uU3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlucHV0TWF4QnVmU2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDgxOTIgKiAyICogc2l6ZW9mKGludDE2X3QpKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ+IG1TYW1wbGVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNoYW5uZWxDb3VudEluZm86Om91dHB1dD4gbUNoYW5uZWxDb3VudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlSW5mbzo6aW5wdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbUlucHV0TWF4QnVmU2l6ZTsKK307CisKK0MyU29mdFZvcmJpc0RlYzo6QzJTb2Z0Vm9yYmlzRGVjKAorICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1TdGF0ZShudWxscHRyKSwKKyAgICAgIG1WaShudWxscHRyKSB7Cit9CisKK0MyU29mdFZvcmJpc0RlYzo6fkMyU29mdFZvcmJpc0RlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0Vm9yYmlzRGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9OT19NRU1PUlk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZvcmJpc0RlYzo6b25TdG9wKCkgeworICAgIGlmIChtU3RhdGUpIHsKKyAgICAgICAgdm9yYmlzX2RzcF9jbGVhcihtU3RhdGUpOworICAgICAgICBkZWxldGUgbVN0YXRlOworICAgICAgICBtU3RhdGUgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtVmkpIHsKKyAgICAgICAgdm9yYmlzX2luZm9fY2xlYXIobVZpKTsKKyAgICAgICAgZGVsZXRlIG1WaTsKKyAgICAgICAgbVZpID0gbnVsbHB0cjsKKyAgICB9CisgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgPSAtMTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisKKyAgICByZXR1cm4gKGluaXREZWNvZGVyKCkgPT0gT0sgPyBDMl9PSyA6IEMyX0NPUlJVUFRFRCk7Cit9CisKK3ZvaWQgQzJTb2Z0Vm9yYmlzRGVjOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCit2b2lkIEMyU29mdFZvcmJpc0RlYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtU3RhdGUpIHsKKyAgICAgICAgdm9yYmlzX2RzcF9jbGVhcihtU3RhdGUpOworICAgICAgICBkZWxldGUgbVN0YXRlOworICAgICAgICBtU3RhdGUgPSBudWxscHRyOworICAgIH0KKworICAgIGlmIChtVmkpIHsKKyAgICAgICAgdm9yYmlzX2luZm9fY2xlYXIobVZpKTsKKyAgICAgICAgZGVsZXRlIG1WaTsKKyAgICAgICAgbVZpID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3N0YXR1c190IEMyU29mdFZvcmJpc0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgbVZpID0gbmV3IHZvcmJpc19pbmZve307CisgICAgaWYgKCFtVmkpIHJldHVybiBOT19NRU1PUlk7CisgICAgdm9yYmlzX2luZm9fY2xlYXIobVZpKTsKKworICAgIG1TdGF0ZSA9IG5ldyB2b3JiaXNfZHNwX3N0YXRle307CisgICAgaWYgKCFtU3RhdGUpIHJldHVybiBOT19NRU1PUlk7CisgICAgdm9yYmlzX2RzcF9jbGVhcihtU3RhdGUpOworCisgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgPSAtMTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbUluZm9VbnBhY2tlZCA9IGZhbHNlOworICAgIG1Cb29rc1VucGFja2VkID0gZmFsc2U7CisgICAgcmV0dXJuIE9LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWb3JiaXNEZWM6Om9uRmx1c2hfc20oKSB7CisgICAgbU51bUZyYW1lc0xlZnRPblBhZ2UgPSAtMTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgaWYgKG1TdGF0ZSkgdm9yYmlzX2RzcF9yZXN0YXJ0KG1TdGF0ZSk7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZvcmJpc0RlYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKSBwb29sOworICAgIGlmIChkcmFpbk1vZGUgPT0gTk9fRFJBSU4pIHsKKyAgICAgICAgQUxPR1coImRyYWluIHdpdGggTk9fRFJBSU46IG5vLW9wIik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisgICAgaWYgKGRyYWluTW9kZSA9PSBEUkFJTl9DSEFJTikgeworICAgICAgICBBTE9HVygiRFJBSU5fQ0hBSU4gbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxFbXB0eVdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCitzdGF0aWMgdm9pZCBtYWtlQml0UmVhZGVyKAorICAgICAgICBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwKKyAgICAgICAgb2dnX2J1ZmZlciAqYnVmLCBvZ2dfcmVmZXJlbmNlICpyZWYsIG9nZ3BhY2tfYnVmZmVyICpiaXRzKSB7CisgICAgYnVmLT5kYXRhID0gKHVpbnQ4X3QgKilkYXRhOworICAgIGJ1Zi0+c2l6ZSA9IHNpemU7CisgICAgYnVmLT5yZWZjb3VudCA9IDE7CisgICAgYnVmLT5wdHIub3duZXIgPSBudWxscHRyOworCisgICAgcmVmLT5idWZmZXIgPSBidWY7CisgICAgcmVmLT5iZWdpbiA9IDA7CisgICAgcmVmLT5sZW5ndGggPSBzaXplOworICAgIHJlZi0+bmV4dCA9IG51bGxwdHI7CisKKyAgICBvZ2dwYWNrX3JlYWRpbml0KGJpdHMsIHJlZik7Cit9CisKKy8vIChDSEVDSyEpIG11bHRpZnJhbWUgaXMgdHJpY2t5LiBkZWNvZGUgY2FsbCBkb2VzbnQgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMKKy8vIGNvbnN1bWVkIGJ5IHRoZSBjb21wb25lbnQuIEFsc28gaXQgaXMgdW5jbGVhciB3aHkgbnVtUGFnZUZyYW1lcyBpcyBiZWluZworLy8gdGFnZ2VkIGF0IHRoZSBlbmQgb2YgaW5wdXQgYnVmZmVycyBmb3IgbmV3IHBhZ2VzLiBSZWZlciBsaW5lcyAyOTctMzAwIGluCisvLyBTaW1wbGVEZWNvZGluZ1NvdXJjZS5jcHAKK3ZvaWQgQzJTb2Z0Vm9yYmlzRGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSByVmlldy5lcnJvcigpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGluU2l6ZSA9PSAwKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImluIGJ1ZmZlciBhdHRyLiBzaXplICV6dSB0aW1lc3RhbXAgJWQgZnJhbWVpbmRleCAlZCIsIGluU2l6ZSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCksIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSByVmlldy5kYXRhKCkgKyBpbk9mZnNldDsKKyAgICBpbnQzMl90IG51bUNoYW5uZWxzICA9IG1WaS0+Y2hhbm5lbHM7CisgICAgaW50MzJfdCBzYW1wbGluZ1JhdGUgPSBtVmktPnJhdGU7CisgICAgLyogRGVjb2RlIHZvcmJpcyBoZWFkZXJzIG9ubHkgb25jZSAqLworICAgIGlmIChpblNpemUgPiA3ICYmICFtZW1jbXAoJmRhdGFbMV0sICJ2b3JiaXMiLCA2KSAmJiAoIW1JbmZvVW5wYWNrZWQgfHwgIW1Cb29rc1VucGFja2VkKSkgeworICAgICAgICBpZiAoKGRhdGFbMF0gIT0gMSkgJiYgKGRhdGFbMF0gIT0gNSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJ1bmV4cGVjdGVkIHR5cGUgcmVjZWl2ZWQgJWQiLCBkYXRhWzBdKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBvZ2dfYnVmZmVyIGJ1ZjsKKyAgICAgICAgb2dnX3JlZmVyZW5jZSByZWY7CisgICAgICAgIG9nZ3BhY2tfYnVmZmVyIGJpdHM7CisKKyAgICAgICAgLy8gc2tpcCA3IDx0eXBlICsgInZvcmJpcyI+IGJ5dGVzCisgICAgICAgIG1ha2VCaXRSZWFkZXIoKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgNywgaW5TaXplIC0gNywgJmJ1ZiwgJnJlZiwgJmJpdHMpOworICAgICAgICBpZiAoZGF0YVswXSA9PSAxKSB7CisgICAgICAgICAgICB2b3JiaXNfaW5mb19pbml0KG1WaSk7CisgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19pbmZvKG1WaSwgJmJpdHMpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVuY291bnRlcmVkIGVycm9yIHdoaWxlIHVucGFja2luZyBpbmZvIik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1WaS0+cmF0ZSAhPSBzYW1wbGluZ1JhdGUgfHwKKyAgICAgICAgICAgICAgICAgICAgbVZpLT5jaGFubmVscyAhPSBudW1DaGFubmVscykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJ2b3JiaXM6IHJhdGUvY2hhbm5lbHMgY2hhbmdlZDogJWxkLyVkIiwgbVZpLT5yYXRlLCBtVmktPmNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBtVmktPnJhdGU7CisgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSBtVmktPmNoYW5uZWxzOworCisgICAgICAgICAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBzYW1wbGluZ1JhdGUpOworICAgICAgICAgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgJnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mbyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKEMyUGFyYW06OkNvcHkoc2FtcGxlUmF0ZUluZm8pKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soQzJQYXJhbTo6Q29weShjaGFubmVsQ291bnRJbmZvKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvbmZpZyBVcGRhdGUgZmFpbGVkIik7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1JbmZvVW5wYWNrZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFtSW5mb1VucGFja2VkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkRhdGEgd2l0aCB0eXBlOjUgc2VudCBiZWZvcmUgc2VuZGluZyB0eXBlOjEiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoMCAhPSBfdm9yYmlzX3VucGFja19ib29rcyhtVmksICZiaXRzKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJFbmNvdW50ZXJlZCBlcnJvciB3aGlsZSB1bnBhY2tpbmcgYm9va3MiKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoMCAhPSB2b3JiaXNfZHNwX2luaXQobVN0YXRlLCBtVmkpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVuY291bnRlcmVkIGVycm9yIHdoaWxlIGRzcCBpbml0Iik7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJvb2tzVW5wYWNrZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFtSW5mb1VucGFja2VkIHx8ICFtQm9va3NVbnBhY2tlZCkgeworICAgICAgICBBTE9HRSgiTWlzc2luZyBDT0RFQ19DT05GSUcgZGF0YSBtSW5mb1VucGFja2VkOiAlZCBtQm9va3NVbnBhY2sgJWQiLCBtSW5mb1VucGFja2VkLCBtQm9va3NVbnBhY2tlZCk7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludDMyX3QgbnVtUGFnZUZyYW1lcyA9IDA7CisgICAgaWYgKGluU2l6ZSA8IHNpemVvZihudW1QYWdlRnJhbWVzKSkgeworICAgICAgICBBTE9HRSgiaW5wdXQgaGVhZGVyIGhhcyBzaXplICV6dSwgZXhwZWN0ZWQgJXp1IiwgaW5TaXplLCBzaXplb2YobnVtUGFnZUZyYW1lcykpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbWVtY3B5KCZudW1QYWdlRnJhbWVzLCBkYXRhICsgaW5TaXplIC0gc2l6ZW9mKG51bVBhZ2VGcmFtZXMpLCBzaXplb2YobnVtUGFnZUZyYW1lcykpOworICAgIGluU2l6ZSAtPSBzaXplb2YobnVtUGFnZUZyYW1lcyk7CisgICAgaWYgKG51bVBhZ2VGcmFtZXMgPj0gMCkgeworICAgICAgICBtTnVtRnJhbWVzTGVmdE9uUGFnZSA9IG51bVBhZ2VGcmFtZXM7CisgICAgfQorCisgICAgb2dnX2J1ZmZlciBidWY7CisgICAgYnVmLmRhdGEgPSBjb25zdF9jYXN0PHVuc2lnbmVkIGNoYXIqPihkYXRhKTsKKyAgICBidWYuc2l6ZSA9IGluU2l6ZTsKKyAgICBidWYucmVmY291bnQgPSAxOworICAgIGJ1Zi5wdHIub3duZXIgPSBudWxscHRyOworCisgICAgb2dnX3JlZmVyZW5jZSByZWY7CisgICAgcmVmLmJ1ZmZlciA9ICZidWY7CisgICAgcmVmLmJlZ2luID0gMDsKKyAgICByZWYubGVuZ3RoID0gYnVmLnNpemU7CisgICAgcmVmLm5leHQgPSBudWxscHRyOworCisgICAgb2dnX3BhY2tldCBwYWNrOworICAgIHBhY2sucGFja2V0ID0gJnJlZjsKKyAgICBwYWNrLmJ5dGVzID0gcmVmLmxlbmd0aDsKKyAgICBwYWNrLmJfb19zID0gMDsKKyAgICBwYWNrLmVfb19zID0gMDsKKyAgICBwYWNrLmdyYW51bGVwb3MgPSAwOworICAgIHBhY2sucGFja2V0bm8gPSAwOworCisgICAgc2l6ZV90IG1heFNhbXBsZXNJbkJ1ZmZlciA9IGtNYXhOdW1TYW1wbGVzUGVyQ2hhbm5lbCAqIG1WaS0+Y2hhbm5lbHM7CisgICAgc2l6ZV90IG91dENhcGFjaXR5ID0gIG1heFNhbXBsZXNJbkJ1ZmZlciAqIHNpemVvZihpbnQxNl90KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2sob3V0Q2FwYWNpdHksIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZm9yIE91dHB1dCBmYWlsZWQgd2l0aCBzdGF0dXMgJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaWYgKHdWaWV3LmVycm9yKCkpIHsKKyAgICAgICAgQUxPR0UoIndyaXRlIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHdWaWV3LmVycm9yKCkpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSB3Vmlldy5lcnJvcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50IG51bUZyYW1lcyA9IDA7CisgICAgaW50IHJldCA9IHZvcmJpc19kc3Bfc3ludGhlc2lzKG1TdGF0ZSwgJnBhY2ssIDEpOworICAgIGlmICgwICE9IHJldCkgeworICAgICAgICBBTE9HRCgidm9yYmlzX2RzcF9zeW50aGVzaXMgcmV0dXJuZWQgJWQ7IGlnbm9yZWQiLCByZXQpOworICAgIH0gZWxzZSB7CisgICAgICAgIG51bUZyYW1lcyA9IHZvcmJpc19kc3BfcGNtb3V0KAorICAgICAgICAgICAgICAgIG1TdGF0ZSwgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPiAod1ZpZXcuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICBrTWF4TnVtU2FtcGxlc1BlckNoYW5uZWwpOworICAgICAgICBpZiAobnVtRnJhbWVzIDwgMCkgeworICAgICAgICAgICAgQUxPR0QoInZvcmJpc19kc3BfcGNtb3V0IHJldHVybmVkICVkIiwgbnVtRnJhbWVzKTsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IDA7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobU51bUZyYW1lc0xlZnRPblBhZ2UgPj0gMCkgeworICAgICAgICBpZiAobnVtRnJhbWVzID4gbU51bUZyYW1lc0xlZnRPblBhZ2UpIHsKKyAgICAgICAgICAgIEFMT0dWKCJkaXNjYXJkaW5nICVkIGZyYW1lcyBhdCBlbmQgb2YgcGFnZSIsIG51bUZyYW1lcyAtIG1OdW1GcmFtZXNMZWZ0T25QYWdlKTsKKyAgICAgICAgICAgIG51bUZyYW1lcyA9IG1OdW1GcmFtZXNMZWZ0T25QYWdlOworICAgICAgICB9CisgICAgICAgIG1OdW1GcmFtZXNMZWZ0T25QYWdlIC09IG51bUZyYW1lczsKKyAgICB9CisKKyAgICBpZiAobnVtRnJhbWVzKSB7CisgICAgICAgIGludCBvdXRTaXplID0gbnVtRnJhbWVzICogc2l6ZW9mKGludDE2X3QpICogbVZpLT5jaGFubmVsczsKKworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jaywgMCwgb3V0U2l6ZSkpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZmlsbEVtcHR5V29yayh3b3JrKTsKKyAgICAgICAgYmxvY2sucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKGVvcykgeworICAgICAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxlZCBFT1MiKTsKKyAgICB9Cit9CisKK2NsYXNzIEMyU29mdFZvcmJpc0RlY0ZhY3RvcnkgOiBwdWJsaWMgQzJDb21wb25lbnRGYWN0b3J5IHsKK3B1YmxpYzoKKyAgICBDMlNvZnRWb3JiaXNEZWNGYWN0b3J5KCkgOiBtSGVscGVyKHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlJlZmxlY3RvckhlbHBlcj4oCisgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgICAgICBuZXcgQzJTb2Z0Vm9yYmlzRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZvcmJpc0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRWb3JiaXNEZWM6OkludGZJbXBsPigKKyAgICAgICAgICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWb3JiaXNEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRWb3JiaXNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRWb3JiaXNEZWNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZvcmJpcy9DMlNvZnRWb3JiaXNEZWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmY3MzI2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL0MyU29mdFZvcmJpc0RlYy5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9WT1JCSVNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9WT1JCSVNfREVDX0hfCisKKyNpbmNsdWRlIDxTaW1wbGVDMkNvbXBvbmVudC5oPgorCisKK3N0cnVjdCB2b3JiaXNfZHNwX3N0YXRlOworc3RydWN0IHZvcmJpc19pbmZvOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRWb3JiaXNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0Vm9yYmlzRGVjKGNvbnN0IGNoYXIgKm5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdFZvcmJpc0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworIHByaXZhdGU6CisgICAgZW51bSB7CisgICAgICAgIGtNYXhOdW1TYW1wbGVzUGVyQ2hhbm5lbCA9IDgxOTIsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdm9yYmlzX2RzcF9zdGF0ZSAqbVN0YXRlOworICAgIHZvcmJpc19pbmZvICptVmk7CisKKyAgICBpbnQzMl90IG1OdW1GcmFtZXNMZWZ0T25QYWdlOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGJvb2wgbVNpZ25hbGxlZE91dHB1dEVvczsKKyAgICBib29sIG1JbmZvVW5wYWNrZWQ7CisgICAgYm9vbCBtQm9va3NVbnBhY2tlZDsKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0Vm9yYmlzRGVjKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZPUkJJU19ERUNfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9NT0RVTEVfTElDRU5TRV9BUEFDSEUyIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdm9yYmlzL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKc2ltaWxhcml0eSBpbmRleCAxMDAlCmNvcHkgZnJvbSBtZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIKY29weSB0byBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OT1RJQ0UgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTk9USUNFCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OT1RJQ0UKY29weSB0byBtZWRpYS9jb2RlYzIvY29tcG9uZW50cy92b3JiaXMvTk9USUNFCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZjU3NTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQW5kcm9pZC5icApAQCAtMCwwICsxLDYwIEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3ZwOWRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0VnB4RGVjLmNwcCJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsibGlidnB4Il0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EVlA5IiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9zb2Z0X3ZwOGRlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0VnB4RGVjLmNwcCJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsibGlidnB4Il0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfdnA5ZW5jIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGliY29kZWMyX3NvZnQtZGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWworICAgICAgICAiQzJTb2Z0VnA5RW5jLmNwcCIsCisgICAgICAgICJDMlNvZnRWcHhFbmMuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsibGlidnB4Il0sCisKKyAgICBjZmxhZ3M6IFsiLURWUDkiXSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfc29mdF92cDhlbmMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJjb2RlYzJfc29mdC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMlNvZnRWcDhFbmMuY3BwIiwKKyAgICAgICAgIkMyU29mdFZweEVuYy5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWyJsaWJ2cHgiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA4RW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMThmNWQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOEVuYy5jcHAKQEAgLTAsMCArMSwxMTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0VnA4RW5jIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgIkMyU29mdFZwOEVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0MyU29mdFZwOEVuYzo6QzJTb2Z0VnA4RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogQzJTb2Z0VnB4RW5jKG5hbWUsIGlkLCBpbnRmSW1wbCksIG1EQ1RQYXJ0aXRpb25zKDApLCBtUHJvZmlsZSgxKSB7fQorCit2b2lkIEMyU29mdFZwOEVuYzo6c2V0Q29kZWNTcGVjaWZpY0ludGVyZmFjZSgpIHsKKyAgICBtQ29kZWNJbnRlcmZhY2UgPSB2cHhfY29kZWNfdnA4X2N4KCk7Cit9CisKK3ZvaWQgQzJTb2Z0VnA4RW5jOjpzZXRDb2RlY1NwZWNpZmljQ29uZmlndXJhdGlvbigpIHsKKyAgICBzd2l0Y2ggKG1Qcm9maWxlKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMDsKKyAgICB9Cit9CisKK3ZweF9jb2RlY19lcnJfdCBDMlNvZnRWcDhFbmM6OnNldENvZGVjU3BlY2lmaWNDb250cm9scygpIHsKKyAgICB2cHhfY29kZWNfZXJyX3QgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlA4RV9TRVRfVE9LRU5fUEFSVElUSU9OUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbURDVFBhcnRpdGlvbnMpOworICAgIGlmIChjb2RlY19yZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBzZXR0aW5nIGRjdCBwYXJ0aXRpb25zIGZvciB2cHggZW5jb2Rlci4iKTsKKyAgICB9CisgICAgcmV0dXJuIGNvZGVjX3JldHVybjsKK30KKworY2xhc3MgQzJTb2Z0VnA4RW5jRmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFZwOEVuY0ZhY3RvcnkoKQorICAgICAgICA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkge30KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0VnA4RW5jKENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhFbmM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0VnA4RW5jRmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0VnA4RW5jRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA4RW5jLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA4RW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQ2ZjM1NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDhFbmMuaApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9WUDhfRU5DX0hfXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfVlA4X0VOQ19IX18KKworI2luY2x1ZGUgIkMyU29mdFZweEVuYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIEV4cG9zZXMgdnA4IGVuY29kZXIgYXMgYSBjMiBDb21wb25lbnQKKy8vCisvLyBJbiBhZGRpdGlvbiB0byB0aGUgYmFzZSBjbGFzcyBzZXR0aW5ncywgT25seSBmb2xsb3dpbmcgZW5jb2RlciBzZXR0aW5ncyBhcmUKKy8vIGF2YWlsYWJsZToKKy8vICAgIC0gdG9rZW4gcGFydGl0aW9uaW5nCitzdHJ1Y3QgQzJTb2Z0VnA4RW5jIDogcHVibGljIEMyU29mdFZweEVuYyB7CisgICAgQzJTb2Z0VnA4RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworCisgcHJvdGVjdGVkOgorICAgIC8vIFBvcHVsYXRlcyB8bUNvZGVjSW50ZXJmYWNlfCB3aXRoIGNvZGVjIHNwZWNpZmljIHNldHRpbmdzLgorICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljSW50ZXJmYWNlKCk7CisKKyAgICAvLyBTZXRzIGNvZGVjIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNDb25maWd1cmF0aW9uKCk7CisKKyAgICAvLyBJbml0aWFsaXplcyBjb2RlYyBzcGVjaWZpYyBlbmNvZGVyIHNldHRpbmdzLgorICAgIHZpcnR1YWwgdnB4X2NvZGVjX2Vycl90IHNldENvZGVjU3BlY2lmaWNDb250cm9scygpOworCisgcHJpdmF0ZToKKyAgICAvLyBNYXggdmFsdWUgc3VwcG9ydGVkIGZvciBEQ1QgcGFydGl0aW9ucworICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4RENUUGFydGl0aW9ucyA9IDM7CisKKyAgICAvLyB2cDggc3BlY2lmaWMgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIKKyAgICAvLyB0aGF0IGVuYWJsZXMgdG9rZW4gcGFydGl0aW9uaW5nIG9mCisgICAgLy8gdGhlIHN0cmVhbSBpbnRvIHN1YnN0cmVhbXMKKyAgICBpbnQzMl90IG1EQ1RQYXJ0aXRpb25zOworCisgICAgLy8gQzIgUHJvZmlsZSBwYXJhbWV0ZXIKKyAgICBpbnQzMl90IG1Qcm9maWxlOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0VnA4RW5jKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZQOF9FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmNwcCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDlFbmMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0MGRiZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnA5RW5jLmNwcApAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRWcDlFbmMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvbWlzYy5oPgorCisjaW5jbHVkZSAiQzJTb2Z0VnA5RW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworQzJTb2Z0VnA5RW5jOjpDMlNvZnRWcDlFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpCisgICAgOiBDMlNvZnRWcHhFbmMobmFtZSwgaWQsIGludGZJbXBsKSwKKyAgICAgIG1Qcm9maWxlKDEpLAorICAgICAgbUxldmVsKDApLAorICAgICAgbVRpbGVDb2x1bW5zKDApLAorICAgICAgbUZyYW1lUGFyYWxsZWxEZWNvZGluZyhmYWxzZSkgeworfQorCit2b2lkIEMyU29mdFZwOUVuYzo6c2V0Q29kZWNTcGVjaWZpY0ludGVyZmFjZSgpIHsKKyAgICBtQ29kZWNJbnRlcmZhY2UgPSB2cHhfY29kZWNfdnA5X2N4KCk7Cit9CisKK3ZvaWQgQzJTb2Z0VnA5RW5jOjpzZXRDb2RlY1NwZWNpZmljQ29uZmlndXJhdGlvbigpIHsKKyAgICBzd2l0Y2ggKG1Qcm9maWxlKSB7CisgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3Byb2ZpbGUgPSAxOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMjsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgODoKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfcHJvZmlsZSA9IDM7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wcm9maWxlID0gMDsKKyAgICB9Cit9CisKK3ZweF9jb2RlY19lcnJfdCBDMlNvZnRWcDlFbmM6OnNldENvZGVjU3BlY2lmaWNDb250cm9scygpIHsKKyAgICB2cHhfY29kZWNfZXJyX3QgY29kZWNSZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbCgKKyAgICAgICAgICAgIG1Db2RlY0NvbnRleHQsIFZQOUVfU0VUX1RJTEVfQ09MVU1OUywgbVRpbGVDb2x1bW5zKTsKKyAgICBpZiAoY29kZWNSZXR1cm4gIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgIEFMT0dFKCJFcnJvciBzZXR0aW5nIFZQOUVfU0VUX1RJTEVfQ09MVU1OUyB0byAlZC4gdnB4X2NvZGVjX2NvbnRyb2woKSAiCisgICAgICAgICAgICAgICJyZXR1cm5lZCAlZCIsIG1UaWxlQ29sdW1ucywgY29kZWNSZXR1cm4pOworICAgICAgICByZXR1cm4gY29kZWNSZXR1cm47CisgICAgfQorICAgIGNvZGVjUmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2woCisgICAgICAgICAgICBtQ29kZWNDb250ZXh0LCBWUDlFX1NFVF9GUkFNRV9QQVJBTExFTF9ERUNPRElORywKKyAgICAgICAgICAgIG1GcmFtZVBhcmFsbGVsRGVjb2RpbmcpOworICAgIGlmIChjb2RlY1JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIHNldHRpbmcgVlA5RV9TRVRfRlJBTUVfUEFSQUxMRUxfREVDT0RJTkcgdG8gJWQuIgorICAgICAgICAgICAgICAidnB4X2NvZGVjX2NvbnRyb2woKSByZXR1cm5lZCAlZCIsIG1GcmFtZVBhcmFsbGVsRGVjb2RpbmcsCisgICAgICAgICAgICAgIGNvZGVjUmV0dXJuKTsKKyAgICAgICAgcmV0dXJuIGNvZGVjUmV0dXJuOworICAgIH0KKyAgICBjb2RlY1JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsIFZQOUVfU0VUX1JPV19NVCwgMSk7CisgICAgaWYgKGNvZGVjUmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBWUDlFX1NFVF9ST1dfTVQgdG8gMS4gdnB4X2NvZGVjX2NvbnRyb2woKSAiCisgICAgICAgICAgICAgICJyZXR1cm5lZCAlZCIsIGNvZGVjUmV0dXJuKTsKKyAgICAgICAgcmV0dXJuIGNvZGVjUmV0dXJuOworICAgIH0KKworICAgIC8vIEZvciBWUDksIHdlIGFsd2F5cyBzZXQgQ1BVX1VTRUQgdG8gOCAoYmVjYXVzZSB0aGUgcmVhbHRpbWUgZGVmYXVsdCBpcyAwCisgICAgLy8gd2hpY2ggaXMgdG9vIHNsb3cpLgorICAgIGNvZGVjUmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwgVlA4RV9TRVRfQ1BVVVNFRCwgOCk7CisgICAgaWYgKGNvZGVjUmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3Igc2V0dGluZyBWUDhFX1NFVF9DUFVVU0VEIHRvIDguIHZweF9jb2RlY19jb250cm9sKCkgIgorICAgICAgICAgICAgICAicmV0dXJuZWQgJWQiLCBjb2RlY1JldHVybik7CisgICAgICAgIHJldHVybiBjb2RlY1JldHVybjsKKyAgICB9CisgICAgcmV0dXJuIGNvZGVjUmV0dXJuOworfQorCitjbGFzcyBDMlNvZnRWcDlFbmNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0VnA5RW5jRmFjdG9yeSgpCisgICAgICAgIDogbUhlbHBlcihzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJSZWZsZWN0b3JIZWxwZXI+KAorICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCktPmdldFBhcmFtUmVmbGVjdG9yKCkpKSB7fQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KiBjb25zdCBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnQqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqY29tcG9uZW50ID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PigKKyAgICAgICAgICAgIG5ldyBDMlNvZnRWcDlFbmMoQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZweEVuYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoQzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgb3ZlcnJpZGUgeworICAgICAgICAqaW50ZXJmYWNlID0gc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPigKKyAgICAgICAgICAgIG5ldyBTaW1wbGVJbnRlcmZhY2U8QzJTb2Z0VnB4RW5jOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsIGlkLAorICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0VnB4RW5jOjpJbnRmSW1wbD4obUhlbHBlcikpLAorICAgICAgICAgICAgZGVsZXRlcik7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DMlNvZnRWcDlFbmNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRWcDlFbmNGYWN0b3J5KCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBEZXN0cm95Q29kZWMyRmFjdG9yeSg6OkMyQ29tcG9uZW50RmFjdG9yeSogZmFjdG9yeSkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICBkZWxldGUgZmFjdG9yeTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDlFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcDlFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2VmOGZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZwOUVuYy5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1ZQOV9FTkNfSF9fCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9WUDlfRU5DX0hfXworCisjaW5jbHVkZSAiQzJTb2Z0VnB4RW5jLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gRXhwb3NlcyB2cDkgZW5jb2RlciBhcyBhIGMyIENvbXBvbmVudAorLy8KKy8vIEluIGFkZGl0aW9uIHRvIHRoZSBiYXNlIGNsYXNzIHNldHRpbmdzLCBPbmx5IGZvbGxvd2luZyBlbmNvZGVyIHNldHRpbmdzIGFyZQorLy8gYXZhaWxhYmxlOgorLy8gICAgLSB0aWxlIHJvd3MKKy8vICAgIC0gdGlsZSBjb2x1bW5zCisvLyAgICAtIGZyYW1lIHBhcmFsbGVsIG1vZGUKK3N0cnVjdCBDMlNvZnRWcDlFbmMgOiBwdWJsaWMgQzJTb2Z0VnB4RW5jIHsKKyAgICBDMlNvZnRWcDlFbmMoY29uc3QgY2hhciogbmFtZSwgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisKKyBwcm90ZWN0ZWQ6CisgICAgLy8gUG9wdWxhdGVzIHxtQ29kZWNJbnRlcmZhY2V8IHdpdGggY29kZWMgc3BlY2lmaWMgc2V0dGluZ3MuCisgICAgdmlydHVhbCB2b2lkIHNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKTsKKworICAgIC8vIFNldHMgY29kZWMgc3BlY2lmaWMgY29uZmlndXJhdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgc2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKTsKKworICAgIC8vIEluaXRpYWxpemVzIGNvZGVjIHNwZWNpZmljIGVuY29kZXIgc2V0dGluZ3MuCisgICAgdmlydHVhbCB2cHhfY29kZWNfZXJyX3Qgc2V0Q29kZWNTcGVjaWZpY0NvbnRyb2xzKCk7CisKKyBwcml2YXRlOgorICAgIC8vIEMyIFByb2ZpbGUgJiBMZXZlbCBwYXJhbWV0ZXIKKyAgICBpbnQzMl90IG1Qcm9maWxlOworICAgIGludDMyX3QgbUxldmVsIF9fdW51c2VkOworCisgICAgaW50MzJfdCBtVGlsZUNvbHVtbnM7CisKKyAgICBib29sIG1GcmFtZVBhcmFsbGVsRGVjb2Rpbmc7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRWcDlFbmMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfVlA5X0VOQ19IX18KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweERlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJjOWM4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuY3BwCkBAIC0wLDAgKzEsOTU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlNvZnRWcHhEZWMiCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8U2ltcGxlQzJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkMyU29mdFZweERlYy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZmRlZiBWUDkKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC52cDkuZGVjb2RlciI7CisjZWxzZQorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLnZwOC5kZWNvZGVyIjsKKyNlbmRpZgorCitjbGFzcyBDMlNvZnRWcHhEZWM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfREVDT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLAorI2lmZGVmIFZQOQorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOQorI2Vsc2UKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19WUDgKKyNlbmRpZgorICAgICAgICAgICAgICAgICkgeworICAgICAgICBub1ByaXZhdGVCdWZmZXJzKCk7IC8vIFRPRE86IGFjY291bnQgZm9yIG91ciBidWZmZXJzIGhlcmUKKyAgICAgICAgbm9JbnB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9PdXRwdXRSZWZlcmVuY2VzKCk7CisgICAgICAgIG5vSW5wdXRMYXRlbmN5KCk7CisgICAgICAgIG5vVGltZVN0cmV0Y2goKTsKKworICAgICAgICAvLyBUT0RPOiBvdXRwdXQgbGF0ZW5jeSBhbmQgcmVvcmRlcmluZworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtU2l6ZSwgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dCgwdSwgMzIwLCAyNDApKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCB3aWR0aCkuaW5SYW5nZSgyLCAyMDQ4LCAyKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1TaXplLCBoZWlnaHQpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTaXplU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworI2lmZGVmIFZQOQorICAgICAgICAvLyBUT0RPOiBBZGQgQzJDb25maWc6OlBST0ZJTEVfVlA5XzJIRFIgPz8KKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfVlA5XzAsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8yfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzFfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV8yXzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkxFVkVMX1ZQOV8zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfM18xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9WUDlfNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzRfMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6TEVWRUxfVlA5XzUsCisgICAgICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBtSGRyMTBQbHVzSW5mb0lucHV0ID0gQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dDo6QWxsb2NTaGFyZWQoMCk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSGRyMTBQbHVzSW5mb0lucHV0LCBDMl9QQVJBTUtFWV9JTlBVVF9IRFIxMF9QTFVTX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG1IZHIxMFBsdXNJbmZvSW5wdXQpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUhkcjEwUGx1c0luZm9JbnB1dCwgbS52YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihIZHIxMFBsdXNJbmZvSW5wdXRTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIG1IZHIxMFBsdXNJbmZvT3V0cHV0ID0gQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKDApOworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUhkcjEwUGx1c0luZm9PdXRwdXQsIEMyX1BBUkFNS0VZX09VVFBVVF9IRFIxMF9QTFVTX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG1IZHIxMFBsdXNJbmZvT3V0cHV0KQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1IZHIxMFBsdXNJbmZvT3V0cHV0LCBtLnZhbHVlKS5hbnkoKSwKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKEhkcjEwUGx1c0luZm9PdXRwdXRTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisjaWYgMAorICAgICAgICAvLyBzYW1wbGUgQlQuMjAyMCBzdGF0aWMgaW5mbworICAgICAgICBtSGRyU3RhdGljSW5mbyA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ+KCk7CisgICAgICAgIG1IZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcgPSB7CisgICAgICAgICAgICAucmVkICAgPSB7IC54ID0gMC43MDgsICAueSA9IDAuMjkyIH0sCisgICAgICAgICAgICAuZ3JlZW4gPSB7IC54ID0gMC4xNzAsICAueSA9IDAuNzk3IH0sCisgICAgICAgICAgICAuYmx1ZSAgPSB7IC54ID0gMC4xMzEsICAueSA9IDAuMDQ2IH0sCisgICAgICAgICAgICAud2hpdGUgPSB7IC54ID0gMC4zMTI3LCAueSA9IDAuMzI5MCB9LAorICAgICAgICAgICAgLm1heEx1bWluYW5jZSA9IDEwMDAsCisgICAgICAgICAgICAubWluTHVtaW5hbmNlID0gMC4xLAorICAgICAgICB9OworICAgICAgICBtSGRyU3RhdGljSW5mby0+bWF4Q2xsID0gMTAwMDsKKyAgICAgICAgbUhkclN0YXRpY0luZm8tPm1heEZhbGwgPSAxMjA7CisKKyAgICAgICAgbUhkclN0YXRpY0luZm8tPm1heEx1bWluYW5jZSA9IDA7IC8vIGRpc2FibGUgc3RhdGljIGluZm8KKworICAgICAgICBoZWxwZXItPmFkZFN0cnVjdERlc2NyaXB0b3JzPEMyTWFzdGVyaW5nRGlzcGxheUNvbG9yVm9sdW1lU3RydWN0LCBDMkNvbG9yWHlTdHJ1Y3Q+KCk7CisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSGRyU3RhdGljSW5mbywgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChtSGRyU3RhdGljSW5mbykKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtSGRyU3RhdGljSW5mbywgbWFzdGVyaW5nLnJlZC54KS5pblJhbmdlKDAsIDEpLAorICAgICAgICAgICAgICAgICAgICAvLyBUT0RPCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihIZHJTdGF0aWNJbmZvU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyNlbmRpZgorI2Vsc2UKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0KDB1LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfVU5VU0VELCBDMkNvbmZpZzo6TEVWRUxfVU5VU0VEKSkKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisjZW5kaWYKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heFNpemUsIEMyX1BBUkFNS0VZX01BWF9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoTWF4UGljdHVyZVNpemVTZXR0ZXIsIG1TaXplKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obU1heElucHV0U2l6ZSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQoMHUsIDMyMCAqIDI0MCAqIDMgLyA0KSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtTWF4SW5wdXRTaXplLCB2YWx1ZSkuYW55KCksCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAuY2FsY3VsYXRlZEFzKE1heElucHV0U2l6ZVNldHRlciwgbU1heFNpemUpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0IGxvY2F0aW9uc1sxXSA9IHsgQzJDaHJvbWFPZmZzZXRTdHJ1Y3Q6OklUVV9ZVVZfNDIwXzAoKSB9OworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgMXUsIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIG1lbWNweShkZWZhdWx0Q29sb3JJbmZvLT5tLmxvY2F0aW9ucywgbG9jYXRpb25zLCBzaXplb2YobG9jYXRpb25zKSk7CisKKyAgICAgICAgZGVmYXVsdENvbG9ySW5mbyA9CisgICAgICAgICAgICBDMlN0cmVhbUNvbG9ySW5mbzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgKKyAgICAgICAgICAgICAgICAgICAgeyBDMkNocm9tYU9mZnNldFN0cnVjdDo6SVRVX1lVVl80MjBfMCgpIH0sCisgICAgICAgICAgICAgICAgICAgIDB1LCA4dSAvKiBiaXREZXB0aCAqLywgQzJDb2xvcjo6WVVWXzQyMCk7CisgICAgICAgIGhlbHBlci0+YWRkU3RydWN0RGVzY3JpcHRvcnM8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+KCk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Db2xvckluZm8sIEMyX1BBUkFNS0VZX0NPREVEX0NPTE9SX0lORk8pCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKGRlZmF1bHRDb2xvckluZm8pCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRGVmYXVsdENvbG9yQXNwZWN0cywgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dCgKKyAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsIEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURlZmF1bHRDb2xvckFzcGVjdHMsIHJhbmdlKS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpSQU5HRV9VTlNQRUNJRklFRCwgICAgIEMyQ29sb3I6OlJBTkdFX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCBwcmltYXJpZXMpLmluUmFuZ2UoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29sb3I6OlBSSU1BUklFU19VTlNQRUNJRklFRCwgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1EZWZhdWx0Q29sb3JBc3BlY3RzLCB0cmFuc2ZlcikuaW5SYW5nZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb2xvcjo6VFJBTlNGRVJfVU5TUEVDSUZJRUQsICBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtRGVmYXVsdENvbG9yQXNwZWN0cywgbWF0cml4KS5pblJhbmdlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgIEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgbW9yZSBmb3JtYXRzPworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVBpeGVsRm9ybWF0LCBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbVBpeGVsRm9ybWF0SW5mbzo6b3V0cHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIFNpemVTZXR0ZXIoYm9vbCBtYXlCbG9jaywgY29uc3QgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKCFtZS5GKG1lLnYud2lkdGgpLnN1cHBvcnRzQXRBbGwobWUudi53aWR0aCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi53aWR0aCkpKTsKKyAgICAgICAgICAgIG1lLnNldCgpLndpZHRoID0gb2xkTWUudi53aWR0aDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW1lLkYobWUudi5oZWlnaHQpLnN1cHBvcnRzQXRBbGwobWUudi5oZWlnaHQpKSB7CisgICAgICAgICAgICByZXMgPSByZXMucGx1cyhDMlNldHRpbmdSZXN1bHRCdWlsZGVyOjpCYWRWYWx1ZShtZS5GKG1lLnYuaGVpZ2h0KSkpOworICAgICAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gb2xkTWUudi5oZWlnaHQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heFBpY3R1cmVTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6b3V0cHV0PiAmc2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gVE9ETzogZ2V0IG1heCB3aWR0aC9oZWlnaHQgZnJvbSB0aGUgc2l6ZSdzIGZpZWxkIGhlbHBlcnMgdnMuIGhhcmRjb2RpbmcKKyAgICAgICAgbWUuc2V0KCkud2lkdGggPSBjMl9taW4oYzJfbWF4KG1lLnYud2lkdGgsIHNpemUudi53aWR0aCksIDIwNDh1KTsKKyAgICAgICAgbWUuc2V0KCkuaGVpZ2h0ID0gYzJfbWluKGMyX21heChtZS52LmhlaWdodCwgc2l6ZS52LmhlaWdodCksIDIwNDh1KTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIE1heElucHV0U2l6ZVNldHRlcihib29sIG1heUJsb2NrLCBDMlA8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1NYXhQaWN0dXJlU2l6ZVR1bmluZzo6b3V0cHV0PiAmbWF4U2l6ZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgLy8gYXNzdW1lIGNvbXByZXNzaW9uIHJhdGlvIG9mIDIKKyAgICAgICAgbWUuc2V0KCkudmFsdWUgPSAoKChtYXhTaXplLnYud2lkdGggKyA2MykgLyA2NCkgKiAoKG1heFNpemUudi5oZWlnaHQgKyA2MykgLyA2NCkgKiAzMDcyKTsKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIERlZmF1bHRDb2xvckFzcGVjdHNTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgaWYgKG1lLnYucmFuZ2UgPiBDMkNvbG9yOjpSQU5HRV9PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkucmFuZ2UgPSBDMkNvbG9yOjpSQU5HRV9PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi5wcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnByaW1hcmllcyA9IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUjsKKyAgICAgICAgfQorICAgICAgICBpZiAobWUudi50cmFuc2ZlciA+IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSKSB7CisgICAgICAgICAgICBtZS5zZXQoKS50cmFuc2ZlciA9IEMyQ29sb3I6OlRSQU5TRkVSX09USEVSOworICAgICAgICB9CisgICAgICAgIGlmIChtZS52Lm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgbWUuc2V0KCkubWF0cml4ID0gQzJDb2xvcjo6TUFUUklYX09USEVSOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBQcm9maWxlTGV2ZWxTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+ICZtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlA8QzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dD4gJnNpemUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXNpemU7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQ29sb3JBc3BlY3RzVHVuaW5nOjpvdXRwdXQ+IGdldERlZmF1bHRDb2xvckFzcGVjdHNfbCgpIHsKKyAgICAgICAgcmV0dXJuIG1EZWZhdWx0Q29sb3JBc3BlY3RzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgSGRyMTBQbHVzSW5mb0lucHV0U2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUhkcjEwUGx1c0luZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIEhkcjEwUGx1c0luZm9PdXRwdXRTZXR0ZXIoYm9vbCBtYXlCbG9jaywgQzJQPEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+IG1TaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOjpvdXRwdXQ+IG1NYXhTaXplOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dD4gbU1heElucHV0U2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckluZm86Om91dHB1dD4gbUNvbG9ySW5mbzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1QaXhlbEZvcm1hdEluZm86Om91dHB1dD4gbVBpeGVsRm9ybWF0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUNvbG9yQXNwZWN0c1R1bmluZzo6b3V0cHV0PiBtRGVmYXVsdENvbG9yQXNwZWN0czsKKyNpZmRlZiBWUDkKKyNpZiAwCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0PiBtSGRyU3RhdGljSW5mbzsKKyNlbmRpZgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUhkcjEwUGx1c0luZm86OmlucHV0PiBtSGRyMTBQbHVzSW5mb0lucHV0OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dD4gbUhkcjEwUGx1c0luZm9PdXRwdXQ7CisjZW5kaWYKK307CisKK0MyU29mdFZweERlYzo6Q29udmVydGVyVGhyZWFkOjpDb252ZXJ0ZXJUaHJlYWQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxNdXRleGVkPENvbnZlcnNpb25RdWV1ZT4+ICZxdWV1ZSkKKyAgICA6IFRocmVhZChmYWxzZSksIG1RdWV1ZShxdWV1ZSkge30KKworYm9vbCBDMlNvZnRWcHhEZWM6OkNvbnZlcnRlclRocmVhZDo6dGhyZWFkTG9vcCgpIHsKKyAgICBNdXRleGVkPENvbnZlcnNpb25RdWV1ZT46OkxvY2tlZCBxdWV1ZSgqbVF1ZXVlKTsKKyAgICBpZiAocXVldWUtPmVudHJpZXMuZW1wdHkoKSkgeworICAgICAgICBxdWV1ZS53YWl0Rm9yQ29uZGl0aW9uKHF1ZXVlLT5jb25kKTsKKyAgICAgICAgaWYgKHF1ZXVlLT5lbnRyaWVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBjb252ZXJ0ID0gcXVldWUtPmVudHJpZXMuZnJvbnQoKTsKKyAgICBxdWV1ZS0+ZW50cmllcy5wb3BfZnJvbnQoKTsKKyAgICBpZiAoIXF1ZXVlLT5lbnRyaWVzLmVtcHR5KCkpIHsKKyAgICAgICAgcXVldWUtPmNvbmQuc2lnbmFsKCk7CisgICAgfQorICAgIHF1ZXVlLnVubG9jaygpOworCisgICAgY29udmVydCgpOworCisgICAgcXVldWUubG9jaygpOworICAgIGlmICgtLXF1ZXVlLT5udW1QZW5kaW5nID09IDB1KSB7CisgICAgICAgIHF1ZXVlLT5jb25kLmJyb2FkY2FzdCgpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworQzJTb2Z0VnB4RGVjOjpDMlNvZnRWcHhEZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiAmaW50ZkltcGwpCisgICAgOiBTaW1wbGVDMkNvbXBvbmVudChzdGQ6Om1ha2Vfc2hhcmVkPFNpbXBsZUludGVyZmFjZTxJbnRmSW1wbD4+KG5hbWUsIGlkLCBpbnRmSW1wbCkpLAorICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgbUNvZGVjQ3R4KG51bGxwdHIpLAorICAgICAgbUNvcmVDb3VudCgxKSwKKyAgICAgIG1RdWV1ZShuZXcgTXV0ZXhlZDxDb252ZXJzaW9uUXVldWU+KSB7Cit9CisKK0MyU29mdFZweERlYzo6fkMyU29mdFZweERlYygpIHsKKyAgICBvblJlbGVhc2UoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RGVjOjpvbkluaXQoKSB7CisgICAgc3RhdHVzX3QgZXJyID0gaW5pdERlY29kZXIoKTsKKyAgICByZXR1cm4gZXJyID09IE9LID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweERlYzo6b25TdG9wKCkgeworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKwordm9pZCBDMlNvZnRWcHhEZWM6Om9uUmVzZXQoKSB7CisgICAgKHZvaWQpb25TdG9wKCk7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gb25GbHVzaF9zbSgpOworICAgIGlmIChlcnIgIT0gQzJfT0spCisgICAgeworICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGZsdXNoIGRlY29kZXIuIFRyeSB0byBoYXJkIHJlc2V0IGRlY29kZXIiKTsKKyAgICAgICAgZGVzdHJveURlY29kZXIoKTsKKyAgICAgICAgKHZvaWQpaW5pdERlY29kZXIoKTsKKyAgICB9Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RGVjOjpvblJlbGVhc2UoKSB7CisgICAgZGVzdHJveURlY29kZXIoKTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RGVjOjpvbkZsdXNoX3NtKCkgeworICAgIGlmIChtRnJhbWVQYXJhbGxlbE1vZGUpIHsKKyAgICAgICAgLy8gRmx1c2ggZGVjb2RlciBieSBwYXNzaW5nIG51bGxwdHIgZGF0YSBwdHIgYW5kIDAgc2l6ZS4KKyAgICAgICAgLy8gSWRlYWxseSwgdGhpcyBzaG91bGQgbmV2ZXIgZmFpbC4KKyAgICAgICAgaWYgKHZweF9jb2RlY19kZWNvZGUobUNvZGVjQ3R4LCBudWxscHRyLCAwLCBudWxscHRyLCAwKSkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBmbHVzaCBvbjIgZGVjb2Rlci4iKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEcm9wIGFsbCB0aGUgZGVjb2RlZCBmcmFtZXMgaW4gZGVjb2Rlci4KKyAgICB2cHhfY29kZWNfaXRlcl90IGl0ZXIgPSBudWxscHRyOworICAgIHdoaWxlICh2cHhfY29kZWNfZ2V0X2ZyYW1lKG1Db2RlY0N0eCwgJml0ZXIpKSB7CisgICAgfQorCisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RhdGljIGludCBHZXRDUFVDb3JlQ291bnQoKSB7CisgICAgaW50IGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVkIiwgY3B1Q29yZUNvdW50KTsKKyAgICByZXR1cm4gY3B1Q29yZUNvdW50OworfQorCitzdGF0dXNfdCBDMlNvZnRWcHhEZWM6OmluaXREZWNvZGVyKCkgeworI2lmZGVmIFZQOQorICAgIG1Nb2RlID0gTU9ERV9WUDk7CisjZWxzZQorICAgIG1Nb2RlID0gTU9ERV9WUDg7CisjZW5kaWYKKworICAgIG1XaWR0aCA9IDMyMDsKKyAgICBtSGVpZ2h0ID0gMjQwOworICAgIG1GcmFtZVBhcmFsbGVsTW9kZSA9IGZhbHNlOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKworICAgIGlmICghbUNvZGVjQ3R4KSB7CisgICAgICAgIG1Db2RlY0N0eCA9IG5ldyB2cHhfY29kZWNfY3R4X3Q7CisgICAgfQorICAgIGlmICghbUNvZGVjQ3R4KSB7CisgICAgICAgIEFMT0dFKCJtQ29kZWNDdHggaXMgbnVsbCIpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIHZweF9jb2RlY19kZWNfY2ZnX3QgY2ZnOworICAgIG1lbXNldCgmY2ZnLCAwLCBzaXplb2YodnB4X2NvZGVjX2RlY19jZmdfdCkpOworICAgIGNmZy50aHJlYWRzID0gbUNvcmVDb3VudCA9IEdldENQVUNvcmVDb3VudCgpOworCisgICAgdnB4X2NvZGVjX2ZsYWdzX3QgZmxhZ3M7CisgICAgbWVtc2V0KCZmbGFncywgMCwgc2l6ZW9mKHZweF9jb2RlY19mbGFnc190KSk7CisgICAgaWYgKG1GcmFtZVBhcmFsbGVsTW9kZSkgZmxhZ3MgfD0gVlBYX0NPREVDX1VTRV9GUkFNRV9USFJFQURJTkc7CisKKyAgICB2cHhfY29kZWNfZXJyX3QgdnB4X2VycjsKKyAgICBpZiAoKHZweF9lcnIgPSB2cHhfY29kZWNfZGVjX2luaXQoCisgICAgICAgICAgICAgICAgIG1Db2RlY0N0eCwgbU1vZGUgPT0gTU9ERV9WUDggPyAmdnB4X2NvZGVjX3ZwOF9keF9hbGdvIDogJnZweF9jb2RlY192cDlfZHhfYWxnbywKKyAgICAgICAgICAgICAgICAgJmNmZywgZmxhZ3MpKSkgeworICAgICAgICBBTE9HRSgib24yIGRlY29kZXIgZmFpbGVkIHRvIGluaXRpYWxpemUuICglZCkiLCB2cHhfZXJyKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKG1Nb2RlID09IE1PREVfVlA5KSB7CisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OnN0cmluZ19saXRlcmFsczsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQ29yZUNvdW50OyArK2kpIHsKKyAgICAgICAgICAgIHNwPENvbnZlcnRlclRocmVhZD4gdGhyZWFkKG5ldyBDb252ZXJ0ZXJUaHJlYWQobVF1ZXVlKSk7CisgICAgICAgICAgICBtQ29udmVydGVyVGhyZWFkcy5wdXNoX2JhY2sodGhyZWFkKTsKKyAgICAgICAgICAgIGlmICh0aHJlYWQtPnJ1bigoInZwOWNvbnYgIyJzICsgc3RkOjp0b19zdHJpbmcoaSkpLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9QUklPUklUWV9BVURJTykgIT0gT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQzJTb2Z0VnB4RGVjOjpkZXN0cm95RGVjb2RlcigpIHsKKyAgICBpZiAgKG1Db2RlY0N0eCkgeworICAgICAgICB2cHhfY29kZWNfZGVzdHJveShtQ29kZWNDdHgpOworICAgICAgICBkZWxldGUgbUNvZGVjQ3R4OworICAgICAgICBtQ29kZWNDdHggPSBudWxscHRyOworICAgIH0KKyAgICBib29sIHJ1bm5pbmcgPSB0cnVlOworICAgIGZvciAoY29uc3Qgc3A8Q29udmVydGVyVGhyZWFkPiAmdGhyZWFkIDogbUNvbnZlcnRlclRocmVhZHMpIHsKKyAgICAgICAgdGhyZWFkLT5yZXF1ZXN0RXhpdCgpOworICAgIH0KKyAgICB3aGlsZSAocnVubmluZykgeworICAgICAgICBtUXVldWUtPmxvY2soKS0+Y29uZC5icm9hZGNhc3QoKTsKKyAgICAgICAgcnVubmluZyA9IGZhbHNlOworICAgICAgICBmb3IgKGNvbnN0IHNwPENvbnZlcnRlclRocmVhZD4gJnRocmVhZCA6IG1Db252ZXJ0ZXJUaHJlYWRzKSB7CisgICAgICAgICAgICBpZiAodGhyZWFkLT5pc1J1bm5pbmcoKSkgeworICAgICAgICAgICAgICAgIHJ1bm5pbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1Db252ZXJ0ZXJUaHJlYWRzLmNsZWFyKCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgZmlsbEVtcHR5V29yayhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpZiAod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKK30KKwordm9pZCBDMlNvZnRWcHhEZWM6OmZpbmlzaFdvcmsodWludDY0X3QgaW5kZXgsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2spIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGNyZWF0ZUdyYXBoaWNCdWZmZXIoYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChtV2lkdGgsIG1IZWlnaHQpKTsKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlciwgaW5kZXgsIGludGYgPSB0aGlzLT5tSW50Zl0oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaykgeworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIGlmICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAmJgorICAgICAgICAgICAgICAgIChjMl9jbnRyNjRfdChpbmRleCkgPT0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4KSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsaW5nIGVvcyIpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiAmcGFyYW06IHdvcmstPmlucHV0LmNvbmZpZ1VwZGF0ZSkgeworICAgICAgICAgICAgaWYgKHBhcmFtKSB7CisgICAgICAgICAgICAgICAgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjppbnB1dCAqaGRyMTBQbHVzSW5mbyA9CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbUhkcjEwUGx1c0luZm86OmlucHV0OjpGcm9tKHBhcmFtLmdldCgpKTsKKworICAgICAgICAgICAgICAgIGlmIChoZHIxMFBsdXNJbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gb3V0UGFyYW0gPSBDMlBhcmFtOjpDb3B5QXNTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBhcmFtLmdldCgpLCB0cnVlIC8qb3V0cHV0Ki8sIHBhcmFtLT5zdHJlYW0oKSk7CisgICAgICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IGludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IG91dFBhcmFtLmdldCgpIH0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoKm91dFBhcmFtLmdldCgpKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZmluaXNoV29yazogQ29uZmlnIHVwZGF0ZSBzaXplIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisgICAgaWYgKHdvcmsgJiYgYzJfY250cjY0X3QoaW5kZXgpID09IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCkgeworICAgICAgICBmaWxsV29yayh3b3JrKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaW5pc2goaW5kZXgsIGZpbGxXb3JrKTsKKyAgICB9Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RGVjOjpwcm9jZXNzKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgIC8vIEluaXRpYWxpemUgb3V0cHV0IHdvcmsKKyAgICB3b3JrLT5yZXN1bHQgPSBDMl9PSzsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDB1OworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgaW5PZmZzZXQgPSAwdTsKKyAgICBzaXplX3QgaW5TaXplID0gMHU7CisgICAgQzJSZWFkVmlldyByVmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHJWaWV3ID0gd29yay0+aW5wdXQuYnVmZmVyc1swXS0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCk7CisgICAgICAgIGluU2l6ZSA9IHJWaWV3LmNhcGFjaXR5KCk7CisgICAgICAgIGlmIChpblNpemUgJiYgclZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgQUxPR0UoInJlYWQgdmlldyBtYXAgZmFpbGVkICVkIiwgclZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIGNvZGVjQ29uZmlnID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0wKTsKKyAgICBib29sIGVvcyA9ICgod29yay0+aW5wdXQuZmxhZ3MgJiBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwKTsKKworICAgIEFMT0dWKCJpbiBidWZmZXIgYXR0ci4gc2l6ZSAlenUgdGltZXN0YW1wICVkIGZyYW1laW5kZXggJWQsIGZsYWdzICV4IiwKKyAgICAgICAgICBpblNpemUsIChpbnQpd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSwKKyAgICAgICAgICAoaW50KXdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCB3b3JrLT5pbnB1dC5mbGFncyk7CisKKyAgICAvLyBTb2Z0d2FyZSBWUDkgRGVjb2RlciBkb2VzIG5vdCBuZWVkIHRoZSBDb2RlYyBTcGVjaWZpYyBEYXRhIChDU0QpCisgICAgLy8gKHNwZWNpZmllZCBpbiBodHRwOi8vd3d3LndlYm1wcm9qZWN0Lm9yZy92cDkvcHJvZmlsZXMvKS4gSWdub3JlIGl0IGlmCisgICAgLy8gaXQgd2FzIHBhc3NlZC4KKyAgICBpZiAoY29kZWNDb25maWcpIHsKKyAgICAgICAgLy8gSWdub3JlIENTRCBidWZmZXIgZm9yIFZQOS4KKyAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfVlA5KSB7CisgICAgICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVG9sZXJhdGUgdGhlIENTRCBidWZmZXIgZm9yIFZQOC4gVGhpcyBpcyBhIHdvcmthcm91bmQKKyAgICAgICAgICAgIC8vIGZvciBiLzI4Njg5NTM2LiBjb250aW51ZQorICAgICAgICAgICAgQUxPR1coIldBUk5JTkc6IEdvdCBDU0QgYnVmZmVyIGZvciBWUDguIENvbnRpbnVlIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaW5TaXplKSB7CisgICAgICAgIHVpbnQ4X3QgKmJpdHN0cmVhbSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihyVmlldy5kYXRhKCkgKyBpbk9mZnNldCk7CisgICAgICAgIHZweF9jb2RlY19lcnJfdCBlcnIgPSB2cHhfY29kZWNfZGVjb2RlKAorICAgICAgICAgICAgICAgIG1Db2RlY0N0eCwgYml0c3RyZWFtLCBpblNpemUsICZ3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgsIDApOworICAgICAgICBpZiAoZXJyICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgQUxPR0UoIm9uMiBkZWNvZGVyIGZhaWxlZCB0byBkZWNvZGUgZnJhbWUuIGVycjogJWQiLCBlcnIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBvdXRwdXRCdWZmZXIocG9vbCwgd29yayk7CisgICAgaWYgKGVyciA9PSBOT1RfRU5PVUdIX0RBVEEpIHsKKyAgICAgICAgaWYgKGluU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCJNYXliZSBub24tZGlzcGxheSBmcmFtZSBhdCAlbGxkLiIsCisgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla2xsKCkpOworICAgICAgICAgICAgLy8gc2VuZCB0aGUgd29yayBiYWNrIHdpdGggZW1wdHkgYnVmZmVyLgorICAgICAgICAgICAgaW5TaXplID0gMDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dEKCJFcnJvciB3aGlsZSBnZXR0aW5nIHRoZSBvdXRwdXQgZnJhbWUgb3V0Iik7CisgICAgICAgIC8vIHdvcmstPnJlc3VsdCB3b3VsZCBiZSBhbHJlYWR5IGZpbGxlZDsgZG8gZmlsbEVtcHR5V29yaygpIGJlbG93IHRvCisgICAgICAgIC8vIHNlbmQgdGhlIHdvcmsgYmFjay4KKyAgICAgICAgaW5TaXplID0gMDsKKyAgICB9CisKKyAgICBpZiAoZW9zKSB7CisgICAgICAgIGRyYWluSW50ZXJuYWwoRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TLCBwb29sLCB3b3JrKTsKKyAgICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IHRydWU7CisgICAgfSBlbHNlIGlmICghaW5TaXplKSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKKyAgICAgICAgdWludDhfdCAqZHN0LCBjb25zdCB1aW50OF90ICpzcmNZLCBjb25zdCB1aW50OF90ICpzcmNVLCBjb25zdCB1aW50OF90ICpzcmNWLAorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgICAgICBzaXplX3QgZHN0WVN0cmlkZSwgc2l6ZV90IGRzdFVWU3RyaWRlLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0KSB7CisgICAgdWludDhfdCAqZHN0U3RhcnQgPSBkc3Q7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodDsgKytpKSB7CisgICAgICAgICBtZW1jcHkoZHN0LCBzcmNZLCB3aWR0aCk7CisgICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0WVN0cmlkZTsKKyAgICB9CisKKyAgICBkc3QgPSBkc3RTdGFydCArIGRzdFlTdHJpZGUgKiBoZWlnaHQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZWlnaHQgLyAyOyArK2kpIHsKKyAgICAgICAgIG1lbWNweShkc3QsIHNyY1YsIHdpZHRoIC8gMik7CisgICAgICAgICBzcmNWICs9IHNyY1ZTdHJpZGU7CisgICAgICAgICBkc3QgKz0gZHN0VVZTdHJpZGU7CisgICAgfQorCisgICAgZHN0ID0gZHN0U3RhcnQgKyAoZHN0WVN0cmlkZSAqIGhlaWdodCkgKyAoZHN0VVZTdHJpZGUgKiBoZWlnaHQgLyAyKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhlaWdodCAvIDI7ICsraSkgeworICAgICAgICAgbWVtY3B5KGRzdCwgc3JjVSwgd2lkdGggLyAyKTsKKyAgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgIGRzdCArPSBkc3RVVlN0cmlkZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWTQxMCh1aW50MzJfdCAqZHN0LAorICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSwgY29uc3QgdWludDE2X3QgKnNyY1UsIGNvbnN0IHVpbnQxNl90ICpzcmNWLAorICAgICAgICBzaXplX3Qgc3JjWVN0cmlkZSwgc2l6ZV90IHNyY1VTdHJpZGUsIHNpemVfdCBzcmNWU3RyaWRlLAorICAgICAgICBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpIHsKKworICAgIC8vIENvbnZlcnRpbmcgdHdvIGxpbmVzIGF0IGEgdGltZSwgc2xpZ2h0bHkgZmFzdGVyCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7IHkgKz0gMikgeworICAgICAgICB1aW50MzJfdCAqZHN0VG9wID0gKHVpbnQzMl90ICopIGRzdDsKKyAgICAgICAgdWludDMyX3QgKmRzdEJvdCA9ICh1aW50MzJfdCAqKSAoZHN0ICsgZHN0U3RyaWRlKTsKKyAgICAgICAgdWludDE2X3QgKnlTcmNUb3AgPSAodWludDE2X3QqKSBzcmNZOworICAgICAgICB1aW50MTZfdCAqeVNyY0JvdCA9ICh1aW50MTZfdCopIChzcmNZICsgc3JjWVN0cmlkZSk7CisgICAgICAgIHVpbnQxNl90ICp1U3JjID0gKHVpbnQxNl90Kikgc3JjVTsKKyAgICAgICAgdWludDE2X3QgKnZTcmMgPSAodWludDE2X3QqKSBzcmNWOworCisgICAgICAgIHVpbnQzMl90IHUwMSwgdjAxLCB5MDEsIHkyMywgeTQ1LCB5NjcsIHV2MCwgdXYxOworICAgICAgICBzaXplX3QgeCA9IDA7CisgICAgICAgIGZvciAoOyB4IDwgd2lkdGggLSAzOyB4ICs9IDQpIHsKKworICAgICAgICAgICAgdTAxID0gKigodWludDMyX3QqKXVTcmMpOyB1U3JjICs9IDI7CisgICAgICAgICAgICB2MDEgPSAqKCh1aW50MzJfdCopdlNyYyk7IHZTcmMgKz0gMjsKKworICAgICAgICAgICAgeTAxID0gKigodWludDMyX3QqKXlTcmNUb3ApOyB5U3JjVG9wICs9IDI7CisgICAgICAgICAgICB5MjMgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7IHlTcmNUb3AgKz0gMjsKKyAgICAgICAgICAgIHk0NSA9ICooKHVpbnQzMl90Kil5U3JjQm90KTsgeVNyY0JvdCArPSAyOworICAgICAgICAgICAgeTY3ID0gKigodWludDMyX3QqKXlTcmNCb3QpOyB5U3JjQm90ICs9IDI7CisKKyAgICAgICAgICAgIHV2MCA9ICh1MDEgJiAweDNGRikgfCAoKHYwMSAmIDB4M0ZGKSA8PCAyMCk7CisgICAgICAgICAgICB1djEgPSAodTAxID4+IDE2KSB8ICgodjAxID4+IDE2KSA8PCAyMCk7CisKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkwMSAmIDB4M0ZGKSA8PCAxMCkgfCB1djA7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RUb3ArKyA9IDMgPDwgMzAgfCAoKHkyMyAmIDB4M0ZGKSA8PCAxMCkgfCB1djE7CisgICAgICAgICAgICAqZHN0VG9wKysgPSAzIDw8IDMwIHwgKCh5MjMgPj4gMTYpIDw8IDEwKSB8IHV2MTsKKworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk0NSA+PiAxNikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdEJvdCsrID0gMyA8PCAzMCB8ICgoeTY3ICYgMHgzRkYpIDw8IDEwKSB8IHV2MTsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9IDMgPDwgMzAgfCAoKHk2NyA+PiAxNikgPDwgMTApIHwgdXYxOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIGF0IG1vc3QgMiBtb3JlIHBpeGVscyB0byBwcm9jZXNzLiBOb3RlIHRoYXQgd2UgZG9uJ3QKKyAgICAgICAgLy8gbmVlZCB0byBjb25zaWRlciBvZGQgY2FzZSBhcyB0aGUgYnVmZmVyIGlzIGFsd2F5cyBhbGlnbmVkIHRvIGV2ZW4uCisgICAgICAgIGlmICh4IDwgd2lkdGgpIHsKKyAgICAgICAgICAgIHUwMSA9ICp1U3JjOworICAgICAgICAgICAgdjAxID0gKnZTcmM7CisgICAgICAgICAgICB5MDEgPSAqKCh1aW50MzJfdCopeVNyY1RvcCk7CisgICAgICAgICAgICB5NDUgPSAqKCh1aW50MzJfdCopeVNyY0JvdCk7CisgICAgICAgICAgICB1djAgPSAodTAxICYgMHgzRkYpIHwgKCh2MDEgJiAweDNGRikgPDwgMjApOworICAgICAgICAgICAgKmRzdFRvcCsrID0gKCh5MDEgJiAweDNGRikgPDwgMTApIHwgdXYwOworICAgICAgICAgICAgKmRzdFRvcCsrID0gKCh5MDEgPj4gMTYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9ICgoeTQ1ICYgMHgzRkYpIDw8IDEwKSB8IHV2MDsKKyAgICAgICAgICAgICpkc3RCb3QrKyA9ICgoeTQ1ID4+IDE2KSA8PCAxMCkgfCB1djA7CisgICAgICAgIH0KKworICAgICAgICBzcmNZICs9IHNyY1lTdHJpZGUgKiAyOworICAgICAgICBzcmNVICs9IHNyY1VTdHJpZGU7CisgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZTsKKyAgICAgICAgZHN0ICs9IGRzdFN0cmlkZSAqIDI7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCitzdGF0aWMgdm9pZCBjb252ZXJ0WVVWNDIwUGxhbmFyMTZUb1lVVjQyMFBsYW5hcih1aW50OF90ICpkc3QsCisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNZLCBjb25zdCB1aW50MTZfdCAqc3JjVSwgY29uc3QgdWludDE2X3QgKnNyY1YsCisgICAgICAgIHNpemVfdCBzcmNZU3RyaWRlLCBzaXplX3Qgc3JjVVN0cmlkZSwgc2l6ZV90IHNyY1ZTdHJpZGUsCisgICAgICAgIHNpemVfdCBkc3RZU3RyaWRlLCBzaXplX3QgZHN0VVZTdHJpZGUsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgeworCisgICAgdWludDhfdCAqZHN0WSA9ICh1aW50OF90ICopZHN0OworICAgIHNpemVfdCBkc3RZU2l6ZSA9IGRzdFlTdHJpZGUgKiBoZWlnaHQ7CisgICAgc2l6ZV90IGRzdFVWU2l6ZSA9IGRzdFVWU3RyaWRlICogaGVpZ2h0IC8gMjsKKyAgICB1aW50OF90ICpkc3RWID0gZHN0WSArIGRzdFlTaXplOworICAgIHVpbnQ4X3QgKmRzdFUgPSBkc3RWICsgZHN0VVZTaXplOworCisgICAgZm9yIChzaXplX3QgeSA9IDA7IHkgPCBoZWlnaHQ7ICsreSkgeworICAgICAgICBmb3IgKHNpemVfdCB4ID0gMDsgeCA8IHdpZHRoOyArK3gpIHsKKyAgICAgICAgICAgIGRzdFlbeF0gPSAodWludDhfdCkoc3JjWVt4XSA+PiAyKTsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZTsKKyAgICAgICAgZHN0WSArPSBkc3RZU3RyaWRlOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgKGhlaWdodCArIDEpIC8gMjsgKyt5KSB7CisgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgKHdpZHRoICsgMSkgLyAyOyArK3gpIHsKKyAgICAgICAgICAgIGRzdFVbeF0gPSAodWludDhfdCkoc3JjVVt4XSA+PiAyKTsKKyAgICAgICAgICAgIGRzdFZbeF0gPSAodWludDhfdCkoc3JjVlt4XSA+PiAyKTsKKyAgICAgICAgfQorCisgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZTsKKyAgICAgICAgc3JjViArPSBzcmNWU3RyaWRlOworICAgICAgICBkc3RVICs9IGRzdFVWU3RyaWRlOworICAgICAgICBkc3RWICs9IGRzdFVWU3RyaWRlOworICAgIH0KKyAgICByZXR1cm47Cit9CitzdGF0dXNfdCBDMlNvZnRWcHhEZWM6Om91dHB1dEJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspCit7CisgICAgaWYgKCEod29yayAmJiBwb29sKSkgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIHZweF9jb2RlY19pdGVyX3QgaXRlciA9IG51bGxwdHI7CisgICAgdnB4X2ltYWdlX3QgKmltZyA9IHZweF9jb2RlY19nZXRfZnJhbWUobUNvZGVjQ3R4LCAmaXRlcik7CisKKyAgICBpZiAoIWltZykgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKworICAgIGlmIChpbWctPmRfdyAhPSBtV2lkdGggfHwgaW1nLT5kX2ggIT0gbUhlaWdodCkgeworICAgICAgICBtV2lkdGggPSBpbWctPmRfdzsKKyAgICAgICAgbUhlaWdodCA9IGltZy0+ZF9oOworCisgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQgc2l6ZSgwdSwgbVdpZHRoLCBtSGVpZ2h0KTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtSW50Zi0+Y29uZmlnKHsmc2l6ZX0sIEMyX01BWV9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soCisgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzaXplKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiQ29uZmlnIHVwZGF0ZSBzaXplIGZhaWxlZCIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorCisgICAgfQorICAgIGlmKGltZy0+Zm10ICE9IFZQWF9JTUdfRk1UX0k0MjAgJiYgaW1nLT5mbXQgIT0gVlBYX0lNR19GTVRfSTQyMDE2KSB7CisgICAgICAgIEFMT0dFKCJpbWctPmZtdCAlZCBub3Qgc3VwcG9ydGVkIiwgaW1nLT5mbXQpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOworICAgIHVpbnQzMl90IGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICBpZiAoaW1nLT5mbXQgPT0gVlBYX0lNR19GTVRfSTQyMDE2KSB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc6Om91dHB1dD4gZGVmYXVsdENvbG9yQXNwZWN0cyA9IG1JbnRmLT5nZXREZWZhdWx0Q29sb3JBc3BlY3RzX2woKTsKKworICAgICAgICBpZiAoZGVmYXVsdENvbG9yQXNwZWN0cy0+cHJpbWFyaWVzID09IEMyQ29sb3I6OlBSSU1BUklFU19CVDIwMjAgJiYKKyAgICAgICAgICAgIGRlZmF1bHRDb2xvckFzcGVjdHMtPm1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwICYmCisgICAgICAgICAgICBkZWZhdWx0Q29sb3JBc3BlY3RzLT50cmFuc2ZlciA9PSBDMkNvbG9yOjpUUkFOU0ZFUl9TVDIwODQpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfUkdCQV8xMDEwMTAyOworICAgICAgICB9CisgICAgfQorICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jayhhbGlnbihtV2lkdGgsIDE2KSwgbUhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dFKCJmZXRjaEdyYXBoaWNCbG9jayBmb3IgT3V0cHV0IGZhaWxlZCB3aXRoIHN0YXR1cyAlZCIsIGVycik7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IGVycjsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgQzJHcmFwaGljVmlldyB3VmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICBBTE9HRSgiZ3JhcGhpYyB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBBTE9HVigicHJvdmlkZWQgKCVkeCVkKSByZXF1aXJlZCAoJWR4JWQpLCBvdXQgZnJhbWVpbmRleCAlbGxkIiwKKyAgICAgICAgICAgYmxvY2stPndpZHRoKCksIGJsb2NrLT5oZWlnaHQoKSwgbVdpZHRoLCBtSGVpZ2h0LAorICAgICAgICAgICAoKGMyX2NudHI2NF90ICopaW1nLT51c2VyX3ByaXYpLT5wZWVrbGwoKSk7CisKKyAgICB1aW50OF90ICpkc3QgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4od1ZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgc2l6ZV90IHNyY1lTdHJpZGUgPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfWV07CisgICAgc2l6ZV90IHNyY1VTdHJpZGUgPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfVV07CisgICAgc2l6ZV90IHNyY1ZTdHJpZGUgPSBpbWctPnN0cmlkZVtWUFhfUExBTkVfVl07CisgICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0ID0gd1ZpZXcubGF5b3V0KCk7CisgICAgc2l6ZV90IGRzdFlTdHJpZGUgPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXS5yb3dJbmM7CisgICAgc2l6ZV90IGRzdFVWU3RyaWRlID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm93SW5jOworCisgICAgaWYgKGltZy0+Zm10ID09IFZQWF9JTUdfRk1UX0k0MjAxNikgeworICAgICAgICBjb25zdCB1aW50MTZfdCAqc3JjWSA9IChjb25zdCB1aW50MTZfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9ZXTsKKyAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY1UgPSAoY29uc3QgdWludDE2X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfVV07CisgICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNWID0gKGNvbnN0IHVpbnQxNl90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ZdOworCisgICAgICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9SR0JBXzEwMTAxMDIpIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8Q29udmVyc2lvblF1ZXVlPjo6TG9ja2VkIHF1ZXVlKCptUXVldWUpOworICAgICAgICAgICAgc2l6ZV90IGkgPSAwOworICAgICAgICAgICAgY29uc3RleHByIHNpemVfdCBrSGVpZ2h0ID0gNjQ7CisgICAgICAgICAgICBmb3IgKDsgaSA8IG1IZWlnaHQ7IGkgKz0ga0hlaWdodCkgeworICAgICAgICAgICAgICAgIHF1ZXVlLT5lbnRyaWVzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIFtkc3QsIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwgZHN0WVN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IG1XaWR0aCwgaGVpZ2h0ID0gc3RkOjptaW4obUhlaWdodCAtIGksIGtIZWlnaHQpXSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydFlVVjQyMFBsYW5hcjE2VG9ZNDEwKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90ICopZHN0LCBzcmNZLCBzcmNVLCBzcmNWLCBzcmNZU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1VTdHJpZGUgLyAyLCBzcmNWU3RyaWRlIC8gMiwgZHN0WVN0cmlkZSAvIHNpemVvZih1aW50MzJfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHNyY1kgKz0gc3JjWVN0cmlkZSAvIDIgKiBrSGVpZ2h0OworICAgICAgICAgICAgICAgIHNyY1UgKz0gc3JjVVN0cmlkZSAvIDIgKiAoa0hlaWdodCAvIDIpOworICAgICAgICAgICAgICAgIHNyY1YgKz0gc3JjVlN0cmlkZSAvIDIgKiAoa0hlaWdodCAvIDIpOworICAgICAgICAgICAgICAgIGRzdCArPSBkc3RZU3RyaWRlICoga0hlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIENIRUNLX0VRKDB1LCBxdWV1ZS0+bnVtUGVuZGluZyk7CisgICAgICAgICAgICBxdWV1ZS0+bnVtUGVuZGluZyA9IHF1ZXVlLT5lbnRyaWVzLnNpemUoKTsKKyAgICAgICAgICAgIHdoaWxlIChxdWV1ZS0+bnVtUGVuZGluZyA+IDApIHsKKyAgICAgICAgICAgICAgICBxdWV1ZS0+Y29uZC5zaWduYWwoKTsKKyAgICAgICAgICAgICAgICBxdWV1ZS53YWl0Rm9yQ29uZGl0aW9uKHF1ZXVlLT5jb25kKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnZlcnRZVVY0MjBQbGFuYXIxNlRvWVVWNDIwUGxhbmFyKGRzdCwgc3JjWSwgc3JjVSwgc3JjViwgc3JjWVN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNVU3RyaWRlIC8gMiwgc3JjVlN0cmlkZSAvIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNZID0gKGNvbnN0IHVpbnQ4X3QgKilpbWctPnBsYW5lc1tWUFhfUExBTkVfWV07CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1UgPSAoY29uc3QgdWludDhfdCAqKWltZy0+cGxhbmVzW1ZQWF9QTEFORV9VXTsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjViA9IChjb25zdCB1aW50OF90ICopaW1nLT5wbGFuZXNbVlBYX1BMQU5FX1ZdOworICAgICAgICBjb3B5T3V0cHV0QnVmZmVyVG9ZdXZQbGFuYXJGcmFtZSgKKyAgICAgICAgICAgICAgICBkc3QsIHNyY1ksIHNyY1UsIHNyY1YsCisgICAgICAgICAgICAgICAgc3JjWVN0cmlkZSwgc3JjVVN0cmlkZSwgc3JjVlN0cmlkZSwKKyAgICAgICAgICAgICAgICBkc3RZU3RyaWRlLCBkc3RVVlN0cmlkZSwKKyAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQpOworICAgIH0KKyAgICBmaW5pc2hXb3JrKCgoYzJfY250cjY0X3QgKilpbWctPnVzZXJfcHJpdiktPnBlZWt1bGwoKSwgd29yaywgc3RkOjptb3ZlKGJsb2NrKSk7CisgICAgcmV0dXJuIE9LOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhEZWM6OmRyYWluSW50ZXJuYWwoCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmspIHsKKyAgICBpZiAoZHJhaW5Nb2RlID09IE5PX0RSQUlOKSB7CisgICAgICAgIEFMT0dXKCJkcmFpbiB3aXRoIE5PX0RSQUlOOiBuby1vcCIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ0hBSU4pIHsKKyAgICAgICAgQUxPR1coIkRSQUlOX0NIQUlOIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgd2hpbGUgKG91dHB1dEJ1ZmZlcihwb29sLCB3b3JrKSA9PSBPSykgeworICAgIH0KKworICAgIGlmIChkcmFpbk1vZGUgPT0gRFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TICYmCisgICAgICAgICAgICB3b3JrICYmIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID09IDB1KSB7CisgICAgICAgIGZpbGxFbXB0eVdvcmsod29yayk7CisgICAgfQorCisgICAgcmV0dXJuIEMyX09LOworfQorYzJfc3RhdHVzX3QgQzJTb2Z0VnB4RGVjOjpkcmFpbigKKyAgICAgICAgdWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSB7CisgICAgcmV0dXJuIGRyYWluSW50ZXJuYWwoZHJhaW5Nb2RlLCBwb29sLCBudWxscHRyKTsKK30KKworY2xhc3MgQzJTb2Z0VnB4RmFjdG9yeSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIEMyU29mdFZweEZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgR2V0Q29kZWMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpLT5nZXRQYXJhbVJlZmxlY3RvcigpKSkgeworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4oCisgICAgICAgICAgICBuZXcgQzJTb2Z0VnB4RGVjKENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlNvZnRWcHhEZWM6OkludGZJbXBsPihtSGVscGVyKSksCisgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICBuZXcgU2ltcGxlSW50ZXJmYWNlPEMyU29mdFZweERlYzo6SW50ZkltcGw+KAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLCBpZCwKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyU29mdFZweERlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgIGRlbGV0ZXIpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJTb2Z0VnB4RmFjdG9yeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IG1IZWxwZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIDo6QzJDb21wb25lbnRGYWN0b3J5KiBDcmVhdGVDb2RlYzJGYWN0b3J5KCkgeworICAgIEFMT0dWKCJpbiAlcyIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6QzJTb2Z0VnB4RmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmggYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA2NTE2NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhEZWMuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1ZQWF9ERUNfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMl9TT0ZUX1ZQWF9ERUNfSF8KKworI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKworI2luY2x1ZGUgInZweC92cHhfZGVjb2Rlci5oIgorI2luY2x1ZGUgInZweC92cDhkeC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBDMlNvZnRWcHhEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0VnB4RGVjKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiYgaW50ZkltcGwpOworICAgIHZpcnR1YWwgfkMyU29mdFZweERlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKyBwcml2YXRlOgorICAgIGVudW0geworICAgICAgICBNT0RFX1ZQOCwKKyAgICAgICAgTU9ERV9WUDksCisgICAgfSBtTW9kZTsKKworICAgIHN0cnVjdCBDb252ZXJzaW9uUXVldWU7CisKKyAgICBjbGFzcyBDb252ZXJ0ZXJUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IENvbnZlcnRlclRocmVhZCgKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TXV0ZXhlZDxDb252ZXJzaW9uUXVldWU+PiAmcXVldWUpOworICAgICAgICB+Q29udmVydGVyVGhyZWFkKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworICAgICAgICBib29sIHRocmVhZExvb3AoKSBvdmVycmlkZTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxNdXRleGVkPENvbnZlcnNpb25RdWV1ZT4+IG1RdWV1ZTsKKyAgICB9OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICB2cHhfY29kZWNfY3R4X3QgKm1Db2RlY0N0eDsKKyAgICBib29sIG1GcmFtZVBhcmFsbGVsTW9kZTsgIC8vIEZyYW1lIHBhcmFsbGVsIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IFZQOSBkZWNvZGVyLgorCisgICAgdWludDMyX3QgbVdpZHRoOworICAgIHVpbnQzMl90IG1IZWlnaHQ7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworCisgICAgaW50IG1Db3JlQ291bnQ7CisgICAgc3RydWN0IENvbnZlcnNpb25RdWV1ZSB7CisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4+IGVudHJpZXM7CisgICAgICAgIENvbmRpdGlvbiBjb25kOworICAgICAgICBzaXplX3QgbnVtUGVuZGluZ3swdX07CisgICAgfTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TXV0ZXhlZDxDb252ZXJzaW9uUXVldWU+PiBtUXVldWU7CisgICAgc3RkOjp2ZWN0b3I8c3A8Q29udmVydGVyVGhyZWFkPj4gbUNvbnZlcnRlclRocmVhZHM7CisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIHN0YXR1c190IGRlc3Ryb3lEZWNvZGVyKCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKHVpbnQ2NF90IGluZGV4LCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2spOworICAgIHN0YXR1c190IG91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisgICAgYzJfc3RhdHVzX3QgZHJhaW5JbnRlcm5hbCgKKyAgICAgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiAmd29yayk7CisKKyAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRWcHhEZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0MyX1NPRlRfVlBYX0RFQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvQzJTb2Z0VnB4RW5jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmM3YThmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5jcHAKQEAgLTAsMCArMSw2NzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0VnB4RW5jIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9taXNjLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgorCisjaW5jbHVkZSA8Q29kZWMyQnVmZmVyVXRpbHMuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSAiQzJTb2Z0VnB4RW5jLmgiCisKKyNpZm5kZWYgSU5UMzJfTUFYCisjZGVmaW5lIElOVDMyX01BWCAgIDIxNDc0ODM2NDcKKyNlbmRpZgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKyNpZiAwCitzdGF0aWMgc2l6ZV90IGdldENwdUNvcmVDb3VudCgpIHsKKyAgICBsb25nIGNwdUNvcmVDb3VudCA9IDE7CisjaWYgZGVmaW5lZChfU0NfTlBST0NFU1NPUlNfT05MTikKKyAgICBjcHVDb3JlQ291bnQgPSBzeXNjb25mKF9TQ19OUFJPQ0VTU09SU19PTkxOKTsKKyNlbHNlCisgICAgLy8gX1NDX05QUk9DX09OTE4gbXVzdCBiZSBkZWZpbmVkLi4uCisgICAgY3B1Q29yZUNvdW50ID0gc3lzY29uZihfU0NfTlBST0NfT05MTik7CisjZW5kaWYKKyAgICBDSEVDSyhjcHVDb3JlQ291bnQgPj0gMSk7CisgICAgQUxPR1YoIk51bWJlciBvZiBDUFUgY29yZXM6ICVsZCIsIGNwdUNvcmVDb3VudCk7CisgICAgcmV0dXJuIChzaXplX3QpY3B1Q29yZUNvdW50OworfQorI2VuZGlmCisKK0MyU29mdFZweEVuYzo6QzJTb2Z0VnB4RW5jKGNvbnN0IGNoYXIqIG5hbWUsIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoCisgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgIG1JbnRmKGludGZJbXBsKSwKKyAgICAgIG1Db2RlY0NvbnRleHQobnVsbHB0ciksCisgICAgICBtQ29kZWNDb25maWd1cmF0aW9uKG51bGxwdHIpLAorICAgICAgbUNvZGVjSW50ZXJmYWNlKG51bGxwdHIpLAorICAgICAgbVN0cmlkZUFsaWduKDIpLAorICAgICAgbUNvbG9yRm9ybWF0KFZQWF9JTUdfRk1UX0k0MjApLAorICAgICAgbUJpdHJhdGVDb250cm9sTW9kZShWUFhfVkJSKSwKKyAgICAgIG1FcnJvclJlc2lsaWVuY2UoZmFsc2UpLAorICAgICAgbU1pblF1YW50aXplcigwKSwKKyAgICAgIG1NYXhRdWFudGl6ZXIoMCksCisgICAgICBtVGVtcG9yYWxMYXllcnMoMCksCisgICAgICBtVGVtcG9yYWxQYXR0ZXJuVHlwZShWUFhUZW1wb3JhbExheWVyUGF0dGVybk5vbmUpLAorICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCgwKSwKKyAgICAgIG1UZW1wb3JhbFBhdHRlcm5JZHgoMCksCisgICAgICBtTGFzdFRpbWVzdGFtcCgweDdGRkZGRkZGRkZGRkZGRkZ1bGwpLAorICAgICAgbVNpZ25hbGxlZE91dHB1dEVvcyhmYWxzZSksCisgICAgICBtU2lnbmFsbGVkRXJyb3IoZmFsc2UpIHsKKyAgICBtZW1zZXQobVRlbXBvcmFsTGF5ZXJCaXRyYXRlUmF0aW8sIDAsIHNpemVvZihtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpbykpOworICAgIG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvWzBdID0gMTAwOworfQorCitDMlNvZnRWcHhFbmM6On5DMlNvZnRWcHhFbmMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweEVuYzo6b25Jbml0KCkgeworICAgIHN0YXR1c190IGVyciA9IGluaXRFbmNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBPSyA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworfQorCit2b2lkIEMyU29mdFZweEVuYzo6b25SZWxlYXNlKCkgeworICAgIGlmIChtQ29kZWNDb250ZXh0KSB7CisgICAgICAgIHZweF9jb2RlY19kZXN0cm95KG1Db2RlY0NvbnRleHQpOworICAgICAgICBkZWxldGUgbUNvZGVjQ29udGV4dDsKKyAgICAgICAgbUNvZGVjQ29udGV4dCA9IG51bGxwdHI7CisgICAgfQorCisgICAgaWYgKG1Db2RlY0NvbmZpZ3VyYXRpb24pIHsKKyAgICAgICAgZGVsZXRlIG1Db2RlY0NvbmZpZ3VyYXRpb247CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24gPSBudWxscHRyOworICAgIH0KKworICAgIC8vIHRoaXMgb25lIGlzIG5vdCBhbGxvY2F0ZWQgYnkgdXMKKyAgICBtQ29kZWNJbnRlcmZhY2UgPSBudWxscHRyOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhFbmM6Om9uU3RvcCgpIHsKKyAgICBvblJlbGVhc2UoKTsKKyAgICBtTGFzdFRpbWVzdGFtcCA9IDB4N0ZGRkZGRkZGRkZGRkZGRkxMOworICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0VnB4RW5jOjpvblJlc2V0KCkgeworICAgICh2b2lkKW9uU3RvcCgpOworfQorCitjMl9zdGF0dXNfdCBDMlNvZnRWcHhFbmM6Om9uRmx1c2hfc20oKSB7CisgICAgcmV0dXJuIG9uU3RvcCgpOworfQorCitzdGF0dXNfdCBDMlNvZnRWcHhFbmM6OmluaXRFbmNvZGVyKCkgeworICAgIHZweF9jb2RlY19lcnJfdCBjb2RlY19yZXR1cm47CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gVU5LTk9XTl9FUlJPUjsKKyAgICB7CisgICAgICAgIEludGZJbXBsOjpMb2NrIGxvY2sgPSBtSW50Zi0+bG9jaygpOworICAgICAgICBtU2l6ZSA9IG1JbnRmLT5nZXRTaXplX2woKTsKKyAgICAgICAgbUJpdHJhdGUgPSBtSW50Zi0+Z2V0Qml0cmF0ZV9sKCk7CisgICAgICAgIG1CaXRyYXRlTW9kZSA9IG1JbnRmLT5nZXRCaXRyYXRlTW9kZV9sKCk7CisgICAgICAgIG1GcmFtZVJhdGUgPSBtSW50Zi0+Z2V0RnJhbWVSYXRlX2woKTsKKyAgICAgICAgbUludHJhUmVmcmVzaCA9IG1JbnRmLT5nZXRJbnRyYVJlZnJlc2hfbCgpOworICAgICAgICBtUmVxdWVzdFN5bmMgPSBtSW50Zi0+Z2V0UmVxdWVzdFN5bmNfbCgpOworICAgICAgICBtVGVtcG9yYWxMYXllcnMgPSBtSW50Zi0+Z2V0VGVtcG9yYWxMYXllcnNfbCgpLT5tLmxheWVyQ291bnQ7CisgICAgfQorCisgICAgc3dpdGNoIChtQml0cmF0ZU1vZGUtPnZhbHVlKSB7CisgICAgICAgIGNhc2UgQzJDb25maWc6OkJJVFJBVEVfQ09OU1Q6CisgICAgICAgICAgICBtQml0cmF0ZUNvbnRyb2xNb2RlID0gVlBYX0NCUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29uZmlnOjpCSVRSQVRFX1ZBUklBQkxFOgorICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBtQml0cmF0ZUNvbnRyb2xNb2RlID0gVlBYX1ZCUjsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHNldENvZGVjU3BlY2lmaWNJbnRlcmZhY2UoKTsKKyAgICBpZiAoIW1Db2RlY0ludGVyZmFjZSkgZ290byBDbGVhblVwOworCisgICAgQUxPR0QoIlZQeDogaW5pdEVuY29kZXIuIEJSTW9kZTogJXUuIFRTTGF5ZXJzOiAlenUuIEtGOiAldS4gUVA6ICV1IC0gJXUiLAorICAgICAgICAgICh1aW50MzJfdCltQml0cmF0ZUNvbnRyb2xNb2RlLCBtVGVtcG9yYWxMYXllcnMsIG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2QoKSwKKyAgICAgICAgICBtTWluUXVhbnRpemVyLCBtTWF4UXVhbnRpemVyKTsKKworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24gPSBuZXcgdnB4X2NvZGVjX2VuY19jZmdfdDsKKyAgICBpZiAoIW1Db2RlY0NvbmZpZ3VyYXRpb24pIGdvdG8gQ2xlYW5VcDsKKyAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfZW5jX2NvbmZpZ19kZWZhdWx0KG1Db2RlY0ludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKyAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgiRXJyb3IgcG9wdWxhdGluZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gZm9yIHZweCBlbmNvZGVyLiIpOworICAgICAgICBnb3RvIENsZWFuVXA7CisgICAgfQorCisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z193ID0gbVNpemUtPndpZHRoOworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfaCA9IG1TaXplLT5oZWlnaHQ7CisgICAgLy9tQ29kZWNDb25maWd1cmF0aW9uLT5nX3RocmVhZHMgPSBnZXRDcHVDb3JlQ291bnQoKTsKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5nX3RocmVhZHMgPSAwOworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfZXJyb3JfcmVzaWxpZW50ID0gbUVycm9yUmVzaWxpZW5jZTsKKworICAgIC8vIHRpbWViYXNlIHVuaXQgaXMgbWljcm9zZWNvbmQKKyAgICAvLyBnX3RpbWViYXNlIGlzIGluIHNlY29uZHMgKGkuZS4gMS8xMDAwMDAwIHNlY29uZHMpCisgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z190aW1lYmFzZS5udW0gPSAxOworICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfdGltZWJhc2UuZGVuID0gMTAwMDAwMDsKKyAgICAvLyByY190YXJnZXRfYml0cmF0ZSBpcyBpbiBrYnBzLCBtQml0cmF0ZSBpbiBicHMKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY190YXJnZXRfYml0cmF0ZSA9IChtQml0cmF0ZS0+dmFsdWUgKyA1MDApIC8gMTAwMDsKKyAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19lbmRfdXNhZ2UgPSBtQml0cmF0ZUNvbnRyb2xNb2RlOworICAgIC8vIERpc2FibGUgZnJhbWUgZHJvcCAtIG5vdCBhbGxvd2VkIGluIE1lZGlhQ29kZWMgbm93LgorICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2Ryb3BmcmFtZV90aHJlc2ggPSAwOworICAgIC8vIERpc2FibGUgbGFnZ2VkIGVuY29kaW5nLgorICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfbGFnX2luX2ZyYW1lcyA9IDA7CisgICAgaWYgKG1CaXRyYXRlQ29udHJvbE1vZGUgPT0gVlBYX0NCUikgeworICAgICAgICAvLyBEaXNhYmxlIHNwYXRpYWwgcmVzaXppbmcuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3Jlc2l6ZV9hbGxvd2VkID0gMDsKKyAgICAgICAgLy8gU2luZ2xlLXBhc3MgbW9kZS4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+Z19wYXNzID0gVlBYX1JDX09ORV9QQVNTOworICAgICAgICAvLyBNYXhpbXVtIGFtb3VudCBvZiBiaXRzIHRoYXQgY2FuIGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgdGFyZ2V0CisgICAgICAgIC8vIGJpdHJhdGUgLSBleHByZXNzZWQgYXMgcGVyY2VudGFnZSBvZiB0aGUgdGFyZ2V0IGJpdHJhdGUuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX3VuZGVyc2hvb3RfcGN0ID0gMTAwOworICAgICAgICAvLyBNYXhpbXVtIGFtb3VudCBvZiBiaXRzIHRoYXQgY2FuIGJlIGFkZGVkIHRvIHRoZSB0YXJnZXQKKyAgICAgICAgLy8gYml0cmF0ZSAtIGV4cHJlc3NlZCBhcyBwZXJjZW50YWdlIG9mIHRoZSB0YXJnZXQgYml0cmF0ZS4KKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfb3ZlcnNob290X3BjdCA9IDE1OworICAgICAgICAvLyBJbml0aWFsIHZhbHVlIG9mIHRoZSBidWZmZXIgbGV2ZWwgaW4gbXMuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2J1Zl9pbml0aWFsX3N6ID0gNTAwOworICAgICAgICAvLyBBbW91bnQgb2YgZGF0YSB0aGF0IHRoZSBlbmNvZGVyIHNob3VsZCB0cnkgdG8gbWFpbnRhaW4gaW4gbXMuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnJjX2J1Zl9vcHRpbWFsX3N6ID0gNjAwOworICAgICAgICAvLyBUaGUgYW1vdW50IG9mIGRhdGEgdGhhdCBtYXkgYmUgYnVmZmVyZWQgYnkgdGhlIGRlY29kaW5nCisgICAgICAgIC8vIGFwcGxpY2F0aW9uIGluIG1zLgorICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19idWZfc3ogPSAxMDAwOworICAgICAgICAvLyBFbmFibGUgZXJyb3IgcmVzaWxpZW5jZSAtIG5lZWRlZCBmb3IgcGFja2V0IGxvc3MuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmdfZXJyb3JfcmVzaWxpZW50ID0gMTsKKyAgICAgICAgLy8gTWF4aW11bSBrZXkgZnJhbWUgaW50ZXJ2YWwgLSBmb3IgQ0JSIGJvb3N0IHRvIDMwMDAKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbWF4X2Rpc3QgPSAzMDAwOworICAgICAgICAvLyBFbmNvZGVyIGRldGVybWluZXMgb3B0aW1hbCBrZXkgZnJhbWUgcGxhY2VtZW50IGF1dG9tYXRpY2FsbHkuCisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21vZGUgPSBWUFhfS0ZfQVVUTzsKKyAgICB9CisKKyAgICAvLyBGcmFtZXMgdGVtcG9yYWwgcGF0dGVybiAtIGZvciBub3cgV2ViUlRDIGxpa2UgcGF0dGVybiBpcyBvbmx5IHN1cHBvcnRlZC4KKyAgICBzd2l0Y2ggKG1UZW1wb3JhbExheWVycykgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3BlcmlvZGljaXR5ID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzBdID0gMDsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWxsOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybkxlbmd0aCA9IDE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+dHNfbnVtYmVyX2xheWVycyA9IDI7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclswXSA9IDI7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19yYXRlX2RlY2ltYXRvclsxXSA9IDE7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19wZXJpb2RpY2l0eSA9IDI7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFswXSA9IDA7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19sYXllcl9pZFsxXSA9IDE7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzBdID0ga1RlbXBvcmFsVXBkYXRlTGFzdEFuZEdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMV0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMl0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblszXSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls1XSA9IGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNl0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0UmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls3XSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmU7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoID0gODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c19udW1iZXJfbGF5ZXJzID0gMzsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzBdID0gNDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzFdID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3JhdGVfZGVjaW1hdG9yWzJdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX3BlcmlvZGljaXR5ID0gNDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzBdID0gMDsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzFdID0gMjsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzJdID0gMTsKKyAgICAgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX2xheWVyX2lkWzNdID0gMjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMF0gPSBrVGVtcG9yYWxVcGRhdGVMYXN0QW5kR29sZGVuUmVmQWx0UmVmOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVyblsxXSA9IGtUZW1wb3JhbFVwZGF0ZU5vbmVOb1JlZkdvbGRlblJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bMl0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZjsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bM10gPSBrVGVtcG9yYWxVcGRhdGVOb25lOworICAgICAgICAgICAgbVRlbXBvcmFsUGF0dGVybls0XSA9IGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzVdID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5bNl0gPSBrVGVtcG9yYWxVcGRhdGVHb2xkZW5SZWZBbHRSZWY7CisgICAgICAgICAgICBtVGVtcG9yYWxQYXR0ZXJuWzddID0ga1RlbXBvcmFsVXBkYXRlTm9uZTsKKyAgICAgICAgICAgIG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiV3JvbmcgbnVtYmVyIG9mIHRlbXBvcmFsIGxheWVycyAlenUiLCBtVGVtcG9yYWxMYXllcnMpOworICAgICAgICAgICAgZ290byBDbGVhblVwOworICAgIH0KKyAgICAvLyBTZXQgYml0cmF0ZSB2YWx1ZXMgZm9yIGVhY2ggbGF5ZXIKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db2RlY0NvbmZpZ3VyYXRpb24tPnRzX251bWJlcl9sYXllcnM7IGkrKykgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT50c190YXJnZXRfYml0cmF0ZVtpXSA9CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY190YXJnZXRfYml0cmF0ZSAqCisgICAgICAgICAgICBtVGVtcG9yYWxMYXllckJpdHJhdGVSYXRpb1tpXSAvIDEwMDsKKyAgICB9CisgICAgaWYgKG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2QoKSA+PSAwKSB7CisgICAgICAgIG1Db2RlY0NvbmZpZ3VyYXRpb24tPmtmX21heF9kaXN0ID0gbUludGYtPmdldFN5bmNGcmFtZVBlcmlvZCgpOworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5rZl9taW5fZGlzdCA9IG1JbnRmLT5nZXRTeW5jRnJhbWVQZXJpb2QoKTsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+a2ZfbW9kZSA9IFZQWF9LRl9BVVRPOworICAgIH0KKyAgICBpZiAobU1pblF1YW50aXplciA+IDApIHsKKyAgICAgICAgbUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfbWluX3F1YW50aXplciA9IG1NaW5RdWFudGl6ZXI7CisgICAgfQorICAgIGlmIChtTWF4UXVhbnRpemVyID4gMCkgeworICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY19tYXhfcXVhbnRpemVyID0gbU1heFF1YW50aXplcjsKKyAgICB9CisgICAgc2V0Q29kZWNTcGVjaWZpY0NvbmZpZ3VyYXRpb24oKTsKKyAgICBtQ29kZWNDb250ZXh0ID0gbmV3IHZweF9jb2RlY19jdHhfdDsKKyAgICBpZiAoIW1Db2RlY0NvbnRleHQpIGdvdG8gQ2xlYW5VcDsKKyAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfZW5jX2luaXQobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvZGVjSW50ZXJmYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgIC8vIGZsYWdzCisgICAgaWYgKGNvZGVjX3JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluaXRpYWxpemluZyB2cHggZW5jb2RlciIpOworICAgICAgICBnb3RvIENsZWFuVXA7CisgICAgfQorCisgICAgLy8gRXh0cmEgQ0JSIHNldHRpbmdzCisgICAgaWYgKG1CaXRyYXRlQ29udHJvbE1vZGUgPT0gVlBYX0NCUikgeworICAgICAgICBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfY29udHJvbChtQ29kZWNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhFX1NFVF9TVEFUSUNfVEhSRVNIT0xELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKKyAgICAgICAgaWYgKGNvZGVjX3JldHVybiA9PSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICAgIHVpbnQzMl90IHJjX21heF9pbnRyYV90YXJnZXQgPQorICAgICAgICAgICAgICAgICh1aW50MzJfdCkobUNvZGVjQ29uZmlndXJhdGlvbi0+cmNfYnVmX29wdGltYWxfc3ogKiBtRnJhbWVSYXRlLT52YWx1ZSAvIDIwICsgMC41KTsKKyAgICAgICAgICAgIC8vIERvbid0IGdvIGJlbG93IDMgdGltZXMgcGVyIGZyYW1lIGJhbmR3aWR0aC4KKyAgICAgICAgICAgIGlmIChyY19tYXhfaW50cmFfdGFyZ2V0IDwgMzAwKSB7CisgICAgICAgICAgICAgICAgcmNfbWF4X2ludHJhX3RhcmdldCA9IDMwMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvZGVjX3JldHVybiA9IHZweF9jb2RlY19jb250cm9sKG1Db2RlY0NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWUDhFX1NFVF9NQVhfSU5UUkFfQklUUkFURV9QQ1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByY19tYXhfaW50cmFfdGFyZ2V0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoY29kZWNfcmV0dXJuID09IFZQWF9DT0RFQ19PSykgeworICAgICAgICAgICAgY29kZWNfcmV0dXJuID0gdnB4X2NvZGVjX2NvbnRyb2wobUNvZGVjQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZQOEVfU0VUX0NQVVVTRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvZGVjX3JldHVybiAhPSBWUFhfQ09ERUNfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBzZXR0aW5nIGNiciBwYXJhbWV0ZXJzIGZvciB2cHggZW5jb2Rlci4iKTsKKyAgICAgICAgICAgIGdvdG8gQ2xlYW5VcDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvZGVjX3JldHVybiA9IHNldENvZGVjU3BlY2lmaWNDb250cm9scygpOworICAgIGlmIChjb2RlY19yZXR1cm4gIT0gVlBYX0NPREVDX09LKSBnb3RvIENsZWFuVXA7CisKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHdpZHRoID0gbVNpemUtPndpZHRoOworICAgICAgICB1aW50MzJfdCBoZWlnaHQgPSBtU2l6ZS0+aGVpZ2h0OworICAgICAgICBpZiAoKCh1aW50NjRfdCl3aWR0aCAqIGhlaWdodCkgPgorICAgICAgICAgICAgKCh1aW50NjRfdClJTlQzMl9NQVggLyAzKSkgeworICAgICAgICAgICAgQUxPR0UoImIvMjU4MTI3OTQsIEJ1ZmZlciBzaXplIGlzIHRvbyBiaWcsIHdpZHRoPSV1LCBoZWlnaHQ9JXUuIiwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1aW50MzJfdCBzdHJpZGUgPSAod2lkdGggKyBtU3RyaWRlQWxpZ24gLSAxKSAmIH4obVN0cmlkZUFsaWduIC0gMSk7CisgICAgICAgICAgICB1aW50MzJfdCB2c3RyaWRlID0gKGhlaWdodCArIG1TdHJpZGVBbGlnbiAtIDEpICYgfihtU3RyaWRlQWxpZ24gLSAxKTsKKyAgICAgICAgICAgIG1Db252ZXJzaW9uQnVmZmVyID0gTWVtb3J5QmxvY2s6OkFsbG9jYXRlKHN0cmlkZSAqIHZzdHJpZGUgKiAzIC8gMik7CisgICAgICAgICAgICBpZiAoIW1Db252ZXJzaW9uQnVmZmVyLnNpemUoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW5nIGNvbnZlcnNpb24gYnVmZmVyIGZhaWxlZC4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbU51bUlucHV0RnJhbWVzID0gLTE7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCitDbGVhblVwOgorICAgIG9uUmVsZWFzZSgpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZweF9lbmNfZnJhbWVfZmxhZ3NfdCBDMlNvZnRWcHhFbmM6OmdldEVuY29kZUZsYWdzKCkgeworICAgIHZweF9lbmNfZnJhbWVfZmxhZ3NfdCBmbGFncyA9IDA7CisgICAgaWYgKG1UZW1wb3JhbFBhdHRlcm5MZW5ndGggPiAwKSB7CisgICAgICBpbnQgcGF0dGVybklkeCA9IG1UZW1wb3JhbFBhdHRlcm5JZHggJSBtVGVtcG9yYWxQYXR0ZXJuTGVuZ3RoOworICAgICAgbVRlbXBvcmFsUGF0dGVybklkeCsrOworICAgICAgc3dpdGNoIChtVGVtcG9yYWxQYXR0ZXJuW3BhdHRlcm5JZHhdKSB7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVMYXN0OgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9HRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3k6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUdvbGRlbjoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1JFRl9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlQWx0cmVmV2l0aG91dERlcGVuZGVuY3k6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVBbHRyZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfR0Y7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfTEFTVDsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVOb25lTm9SZWZBbHRyZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfQVJGOworICAgICAgICAgICAgICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgICAgY2FzZSBrVGVtcG9yYWxVcGRhdGVOb25lOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0VOVFJPUFk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTm9uZU5vUmVmR29sZGVuUmVmQWx0UmVmOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0VOVFJPUFk7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3lSZWZBbHRSZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0xBU1Q7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZjoKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9HRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9BUkY7CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19SRUZfR0Y7CisgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIGNhc2Uga1RlbXBvcmFsVXBkYXRlR29sZGVuUmVmQWx0UmVmOgorICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0FSRjsKKyAgICAgICAgICAgICAgZmxhZ3MgfD0gVlA4X0VGTEFHX05PX1VQRF9MQVNUOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUxhc3RBbmRHb2xkZW5SZWZBbHRSZWY6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fUkVGX0dGOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICBjYXNlIGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbGw6CisgICAgICAgICAgICAgIGZsYWdzIHw9IFZQOF9FRkxBR19OT19VUERfQVJGOworICAgICAgICAgICAgICBmbGFncyB8PSBWUDhfRUZMQUdfTk9fVVBEX0dGOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZsYWdzOworfQorCisvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgWVVWIGlucHV0IGNvbG9yIGZvcm1hdHMKKy8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBTVkMsIEFSRi4gU1ZDIGFuZCBBUkYgcmV0dXJucyBtdWx0aXBsZSBmcmFtZXMKKy8vIChoaWVyYXJjaGljYWwgLyBub3Nob3cpIGluIG9uZSBjYWxsLiBUaGVzZSBmcmFtZXMgc2hvdWxkIGJlIGNvbWJpbmVkIGluIHRvCisvLyBhIHNpbmdsZSBidWZmZXIgYW5kIHNlbnQgYmFjayB0byB0aGUgY2xpZW50Cit2b2lkIEMyU29mdFZweEVuYzo6cHJvY2VzcygKKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmssCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wpIHsKKyAgICAvLyBJbml0aWFsaXplIG91dHB1dCB3b3JrCisgICAgd29yay0+cmVzdWx0ID0gQzJfT0s7CisgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAxdTsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKworICAgIGlmIChtU2lnbmFsbGVkRXJyb3IgfHwgbVNpZ25hbGxlZE91dHB1dEVvcykgeworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gSW5pdGlhbGl6ZSBlbmNvZGVyIGlmIG5vdCBhbHJlYWR5CisgICAgaWYgKCFtQ29kZWNDb250ZXh0ICYmIE9LICE9IGluaXRFbmNvZGVyKCkpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBpbml0aWFsaXplIGVuY29kZXIiKTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHJWaWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gaW5wdXRCdWZmZXI7CisgICAgaWYgKCF3b3JrLT5pbnB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgaW5wdXRCdWZmZXIgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdOworICAgICAgICByVmlldyA9IHN0ZDo6bWFrZV9zaGFyZWQ8Y29uc3QgQzJHcmFwaGljVmlldz4oCisgICAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLmZyb250KCkubWFwKCkuZ2V0KCkpOworICAgICAgICBpZiAoclZpZXctPmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJncmFwaGljIHZpZXcgbWFwIGVyciA9ICVkIiwgclZpZXctPmVycm9yKCkpOworICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIkVtcHR5IGlucHV0IEJ1ZmZlciIpOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrIGluQnVmZmVyID0KKyAgICAgICAgaW5wdXRCdWZmZXItPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKTsKKyAgICBpZiAoaW5CdWZmZXIud2lkdGgoKSAhPSBtU2l6ZS0+d2lkdGggfHwKKyAgICAgICAgaW5CdWZmZXIuaGVpZ2h0KCkgIT0gbVNpemUtPmhlaWdodCkgeworICAgICAgICBBTE9HRSgidW5leHBlY3RlZCBJbnB1dCBidWZmZXIgYXR0cmlidXRlcyAlZCglZCkgeCAlZCglZCkiLAorICAgICAgICAgICAgICBpbkJ1ZmZlci53aWR0aCgpLCBtU2l6ZS0+d2lkdGgsIGluQnVmZmVyLmhlaWdodCgpLAorICAgICAgICAgICAgICBtU2l6ZS0+aGVpZ2h0KTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGJvb2wgZW9zID0gKCh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDApOworICAgIHZweF9pbWFnZV90IHJhd19mcmFtZTsKKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gclZpZXctPmxheW91dCgpOworICAgIHVpbnQzMl90IHdpZHRoID0gclZpZXctPndpZHRoKCk7CisgICAgdWludDMyX3QgaGVpZ2h0ID0gclZpZXctPmhlaWdodCgpOworICAgIGlmICh3aWR0aCA+IDB4ODAwMCB8fCBoZWlnaHQgPiAweDgwMDApIHsKKyAgICAgICAgQUxPR0UoIkltYWdlIHRvbyBiaWc6ICV1IHggJXUiLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHVpbnQzMl90IHN0cmlkZSA9ICh3aWR0aCArIG1TdHJpZGVBbGlnbiAtIDEpICYgfihtU3RyaWRlQWxpZ24gLSAxKTsKKyAgICB1aW50MzJfdCB2c3RyaWRlID0gKGhlaWdodCArIG1TdHJpZGVBbGlnbiAtIDEpICYgfihtU3RyaWRlQWxpZ24gLSAxKTsKKyAgICBzd2l0Y2ggKGxheW91dC50eXBlKSB7CisgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCOgorICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQkE6IHsKKyAgICAgICAgICAgIENvbnZlcnRSR0JUb1BsYW5hcllVVihtQ29udmVyc2lvbkJ1ZmZlci5kYXRhKCksIHN0cmlkZSwgdnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udmVyc2lvbkJ1ZmZlci5zaXplKCksICpyVmlldy5nZXQoKSk7CisgICAgICAgICAgICB2cHhfaW1nX3dyYXAoJnJhd19mcmFtZSwgVlBYX0lNR19GTVRfSTQyMCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyaWRlQWxpZ24sIG1Db252ZXJzaW9uQnVmZmVyLmRhdGEoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVjogeworICAgICAgICAgICAgaWYgKCFJc1lVVjQyMCgqclZpZXcpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImlucHV0IGlzIG5vdCBZVVY0MjAiKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sSW5jID09IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY29sSW5jID09IDEpIHsKKyAgICAgICAgICAgICAgICAvLyBJNDIwIGNvbXBhdGlibGUgLSB0aG91Z2ggd2l0aCBjdXN0b20gb2Zmc2V0IGFuZCBzdHJpZGUKKyAgICAgICAgICAgICAgICB2cHhfaW1nX3dyYXAoJnJhd19mcmFtZSwgVlBYX0lNR19GTVRfSTQyMCwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0cmlkZUFsaWduLCAodWludDhfdCopclZpZXctPmRhdGEoKVswXSk7CisgICAgICAgICAgICAgICAgcmF3X2ZyYW1lLnBsYW5lc1sxXSA9ICh1aW50OF90KilyVmlldy0+ZGF0YSgpWzFdOworICAgICAgICAgICAgICAgIHJhd19mcmFtZS5wbGFuZXNbMl0gPSAodWludDhfdCopclZpZXctPmRhdGEoKVsyXTsKKyAgICAgICAgICAgICAgICByYXdfZnJhbWUuc3RyaWRlWzBdID0gbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0ucm93SW5jOworICAgICAgICAgICAgICAgIHJhd19mcmFtZS5zdHJpZGVbMV0gPSBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5yb3dJbmM7CisgICAgICAgICAgICAgICAgcmF3X2ZyYW1lLnN0cmlkZVsyXSA9IGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLnJvd0luYzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gY29weSB0byBJNDIwCisgICAgICAgICAgICAgICAgTWVkaWFJbWFnZTIgaW1nID0gQ3JlYXRlWVVWNDIwUGxhbmFyTWVkaWFJbWFnZTIod2lkdGgsIGhlaWdodCwgc3RyaWRlLCB2c3RyaWRlKTsKKyAgICAgICAgICAgICAgICBpZiAobUNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpID49IHN0cmlkZSAqIHZzdHJpZGUgKiAzIC8gMikgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJbWFnZUNvcHkobUNvbnZlcnNpb25CdWZmZXIuZGF0YSgpLCAmaW1nLCAqclZpZXcpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQnVmZmVyIGNvbnZlcnNpb24gZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdnB4X2ltZ193cmFwKCZyYXdfZnJhbWUsIFZQWF9JTUdfRk1UX0k0MjAsIHN0cmlkZSwgdnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJpZGVBbGlnbiwgbUNvbnZlcnNpb25CdWZmZXIuZGF0YSgpKTsKKyAgICAgICAgICAgICAgICAgICAgdnB4X2ltZ19zZXRfcmVjdCgmcmF3X2ZyYW1lLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ29udmVyc2lvbiBidWZmZXIgaXMgdG9vIHNtYWxsOiAldSB4ICV1IGZvciAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmlkZSwgdnN0cmlkZSwgbUNvbnZlcnNpb25CdWZmZXIuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCJVbnJlY29nbml6ZWQgcGxhbmUgdHlwZTogJWQiLCBsYXlvdXQudHlwZSk7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdnB4X2VuY19mcmFtZV9mbGFnc190IGZsYWdzID0gZ2V0RW5jb2RlRmxhZ3MoKTsKKyAgICAvLyBoYW5kbGUgZHluYW1pYyBjb25maWcgcGFyYW1ldGVycworICAgIHsKKyAgICAgICAgSW50ZkltcGw6OkxvY2sgbG9jayA9IG1JbnRmLT5sb2NrKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBpbnRyYVJlZnJlc2ggPSBtSW50Zi0+Z2V0SW50cmFSZWZyZXNoX2woKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gYml0cmF0ZSA9IG1JbnRmLT5nZXRCaXRyYXRlX2woKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiByZXF1ZXN0U3luYyA9IG1JbnRmLT5nZXRSZXF1ZXN0U3luY19sKCk7CisgICAgICAgIGxvY2sudW5sb2NrKCk7CisKKyAgICAgICAgaWYgKGludHJhUmVmcmVzaCAhPSBtSW50cmFSZWZyZXNoKSB7CisgICAgICAgICAgICBtSW50cmFSZWZyZXNoID0gaW50cmFSZWZyZXNoOworICAgICAgICAgICAgQUxPR1YoIkdvdCBtSW50cmFSZWZyZXNoIHJlcXVlc3QiKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXF1ZXN0U3luYyAhPSBtUmVxdWVzdFN5bmMpIHsKKyAgICAgICAgICAgIC8vIHdlIGNhbiBoYW5kbGUgSURSIGltbWVkaWF0ZWx5CisgICAgICAgICAgICBpZiAocmVxdWVzdFN5bmMtPnZhbHVlKSB7CisgICAgICAgICAgICAgICAgLy8gdW5zZXQgcmVxdWVzdAorICAgICAgICAgICAgICAgIEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0IGNsZWFyU3luYygwdSwgQzJfRkFMU0UpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAgICAgICAgICAgICBtSW50Zi0+Y29uZmlnKHsgJmNsZWFyU3luYyB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkdvdCBzeW5jIHJlcXVlc3QiKTsKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBWUFhfRUZMQUdfRk9SQ0VfS0Y7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVxdWVzdFN5bmMgPSByZXF1ZXN0U3luYzsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChiaXRyYXRlICE9IG1CaXRyYXRlKSB7CisgICAgICAgICAgICBtQml0cmF0ZSA9IGJpdHJhdGU7CisgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uLT5yY190YXJnZXRfYml0cmF0ZSA9CisgICAgICAgICAgICAgICAgKG1CaXRyYXRlLT52YWx1ZSArIDUwMCkgLyAxMDAwOworICAgICAgICAgICAgdnB4X2NvZGVjX2Vycl90IHJlcyA9IHZweF9jb2RlY19lbmNfY29uZmlnX3NldChtQ29kZWNDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29kZWNDb25maWd1cmF0aW9uKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gVlBYX0NPREVDX09LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoInZweCBlbmNvZGVyIGZhaWxlZCB0byB1cGRhdGUgYml0cmF0ZTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgIHZweF9jb2RlY19lcnJfdG9fc3RyaW5nKHJlcykpOworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHVpbnQ2NF90IGlucHV0VGltZVN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3VsbCgpOworICAgIHVpbnQzMl90IGZyYW1lRHVyYXRpb247CisgICAgaWYgKGlucHV0VGltZVN0YW1wID4gbUxhc3RUaW1lc3RhbXApIHsKKyAgICAgICAgZnJhbWVEdXJhdGlvbiA9ICh1aW50MzJfdCkoaW5wdXRUaW1lU3RhbXAgLSBtTGFzdFRpbWVzdGFtcCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVXNlIGRlZmF1bHQgb2YgMzAgZnBzIGluIGNhc2Ugb2YgMCBmcmFtZSByYXRlLgorICAgICAgICBmbG9hdCBmcmFtZVJhdGUgPSBtRnJhbWVSYXRlLT52YWx1ZTsKKyAgICAgICAgaWYgKGZyYW1lUmF0ZSA8IDAuMDAxKSB7CisgICAgICAgICAgICBmcmFtZVJhdGUgPSAzMDsKKyAgICAgICAgfQorICAgICAgICBmcmFtZUR1cmF0aW9uID0gKHVpbnQzMl90KSgxMDAwMDAwIC8gZnJhbWVSYXRlICsgMC41KTsKKyAgICB9CisgICAgbUxhc3RUaW1lc3RhbXAgPSBpbnB1dFRpbWVTdGFtcDsKKworICAgIHZweF9jb2RlY19lcnJfdCBjb2RlY19yZXR1cm4gPSB2cHhfY29kZWNfZW5jb2RlKG1Db2RlY0NvbnRleHQsICZyYXdfZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRUaW1lU3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVEdXJhdGlvbiwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVlBYX0RMX1JFQUxUSU1FKTsKKyAgICBpZiAoY29kZWNfcmV0dXJuICE9IFZQWF9DT0RFQ19PSykgeworICAgICAgICBBTE9HRSgidnB4IGVuY29kZXIgZmFpbGVkIHRvIGVuY29kZSBmcmFtZSIpOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBib29sIHBvcHVsYXRlZCA9IGZhbHNlOworICAgIHZweF9jb2RlY19pdGVyX3QgZW5jb2RlZF9wYWNrZXRfaXRlcmF0b3IgPSBudWxscHRyOworICAgIGNvbnN0IHZweF9jb2RlY19jeF9wa3RfdCogZW5jb2RlZF9wYWNrZXQ7CisgICAgd2hpbGUgKChlbmNvZGVkX3BhY2tldCA9IHZweF9jb2RlY19nZXRfY3hfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgbUNvZGVjQ29udGV4dCwgJmVuY29kZWRfcGFja2V0X2l0ZXJhdG9yKSkpIHsKKyAgICAgICAgaWYgKGVuY29kZWRfcGFja2V0LT5raW5kID09IFZQWF9DT0RFQ19DWF9GUkFNRV9QS1QpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHBvb2wtPmZldGNoTGluZWFyQmxvY2soZW5jb2RlZF9wYWNrZXQtPmRhdGEuZnJhbWUuc3osIHVzYWdlLCAmYmxvY2spOworICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJmZXRjaExpbmVhckJsb2NrIGZvciBPdXRwdXQgZmFpbGVkIHdpdGggc3RhdHVzICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgICAgICBpZiAod1ZpZXcuZXJyb3IoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJ3cml0ZSB2aWV3IG1hcCBmYWlsZWQgJWQiLCB3Vmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBtZW1jcHkod1ZpZXcuZGF0YSgpLCBlbmNvZGVkX3BhY2tldC0+ZGF0YS5mcmFtZS5idWYsIGVuY29kZWRfcGFja2V0LT5kYXRhLmZyYW1lLnN6KTsKKyAgICAgICAgICAgICsrbU51bUlucHV0RnJhbWVzOworCisgICAgICAgICAgICBBTE9HRCgiYnl0ZXMgZ2VuZXJhdGVkICV6dSIsIGVuY29kZWRfcGFja2V0LT5kYXRhLmZyYW1lLnN6KTsKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgICAgIGlmIChlb3MpIHsKKyAgICAgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICAgICAgfQorICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyID0gY3JlYXRlTGluZWFyQnVmZmVyKGJsb2NrKTsKKyAgICAgICAgICAgIGlmIChlbmNvZGVkX3BhY2tldC0+ZGF0YS5mcmFtZS5mbGFncyAmIFZQWF9GUkFNRV9JU19LRVkpIHsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldEluZm8oc3RkOjptYWtlX3NoYXJlZDxDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgICAgICAgICAwdSAvKiBzdHJlYW0gaWQgKi8sIEMyQ29uZmlnOjpTWU5DX0ZSQU1FKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IGVuY29kZWRfcGFja2V0LT5kYXRhLmZyYW1lLnB0czsKKyAgICAgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgICAgICAgICBwb3B1bGF0ZWQgPSB0cnVlOworICAgICAgICAgICAgaWYgKGVvcykgeworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRPdXRwdXRFb3MgPSB0cnVlOworICAgICAgICAgICAgICAgIEFMT0dWKCJzaWduYWxsZWQgRU9TIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKCFwb3B1bGF0ZWQpIHsKKyAgICAgICAgd29yay0+d29ya2xldHNQcm9jZXNzZWQgPSAwdTsKKyAgICB9Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFZweEVuYzo6ZHJhaW4oCisgICAgICAgIHVpbnQzMl90IGRyYWluTW9kZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeworICAgICh2b2lkKXBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9DMlNvZnRWcHhFbmMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmNjZDFiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L0MyU29mdFZweEVuYy5oCkBAIC0wLDAgKzEsNDMzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJfU09GVF9WUFhfRU5DX0hfXworI2RlZmluZSBBTkRST0lEX0MyX1NPRlRfVlBYX0VOQ19IX18KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPENvZGVjMkJ1ZmZlclV0aWxzLmg+CisjaW5jbHVkZSA8U2ltcGxlQzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxTaW1wbGVDMkludGVyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgInZweC92cHhfZW5jb2Rlci5oIgorI2luY2x1ZGUgInZweC92cHhfY29kZWMuaCIKKyNpbmNsdWRlICJ2cHgvdnB4X2ltYWdlLmgiCisjaW5jbHVkZSAidnB4L3ZwOGN4LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gVE9ETzogVGhlc2UgZGVmcyB0YWtlbiBmcm9tIGRlcHJlY2F0ZWQgT01YX1ZpZGVvRXh0LmguIE1vdmUgdGhlc2UgZGVmaW5pdGlvbnMKKy8vIHRvIGEgbmV3IGhlYWRlciBmaWxlIGFuZCBpbmNsdWRlIGl0LgorCisvKiogTWF4aW11bSBudW1iZXIgb2YgdGVtcG9yYWwgbGF5ZXJzICovCisjZGVmaW5lIE1BWFRFTVBPUkFMTEFZRVJTIDMKKworLyoqIHRlbXBvcmFsIGxheWVyIHBhdHRlcm5zICovCit0eXBlZGVmIGVudW0gVGVtcG9yYWxQYXR0ZXJuVHlwZSB7CisgICAgVlBYVGVtcG9yYWxMYXllclBhdHRlcm5Ob25lID0gMCwKKyAgICBWUFhUZW1wb3JhbExheWVyUGF0dGVybldlYlJUQyA9IDEsCisgICAgVlBYVGVtcG9yYWxMYXllclBhdHRlcm5NYXggPSAweDdGRkZGRkZGCit9IFRlbXBvcmFsUGF0dGVyblR5cGU7CisKKy8vIEJhc2UgY2xhc3MgZm9yIGEgVlBYIEVuY29kZXIgQ29tcG9uZW50CisvLworLy8gT25seSBmb2xsb3dpbmcgZW5jb2RlciBzZXR0aW5ncyBhcmUgYXZhaWxhYmxlIChjb2RlYyBzcGVjaWZpYyBzZXR0aW5ncyBtaWdodAorLy8gYmUgYXZhaWxhYmxlIGluIHRoZSBzdWItY2xhc3Nlcyk6CisvLyAgICAtIHZpZGVvIHJlc29sdXRpb24KKy8vICAgIC0gdGFyZ2V0IGJpdHJhdGUKKy8vICAgIC0gcmF0ZSBjb250cm9sIChjb25zdGFudCAvIHZhcmlhYmxlKQorLy8gICAgLSBmcmFtZSByYXRlCisvLyAgICAtIGVycm9yIHJlc2lsaWVuY2UKKy8vICAgIC0gcmVjb25zdHJ1Y3Rpb24gJiBsb29wIGZpbHRlcnMgKGdfcHJvZmlsZSkKKy8vCisvLyBPbmx5IGZvbGxvd2luZyBjb2xvciBmb3JtYXRzIGFyZSByZWNvZ25pemVkCisvLyAgICAtIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQgorLy8gICAgLSBDMlBsYW5hckxheW91dDo6VFlQRV9SR0JBCisvLworLy8gRm9sbG93aW5nIHNldHRpbmdzIGFyZSBub3QgY29uZmlndXJhYmxlIGJ5IHRoZSBjbGllbnQKKy8vICAgIC0gZW5jb2RpbmcgZGVhZGxpbmUgaXMgcmVhbHRpbWUKKy8vICAgIC0gbXVsdGl0aHJlYWRlZCBlbmNvZGluZyB1dGlsaXplcyBhIG51bWJlciBvZiB0aHJlYWRzIGVxdWFsCisvLyB0byBvbmxpbmUgY3B1J3MgYXZhaWxhYmxlCisvLyAgICAtIHRoZSBhbGdvcml0aG0gaW50ZXJmYWNlIGZvciBlbmNvZGVyIGlzIGRlY2lkZWQgYnkgdGhlIHN1Yi1jbGFzcyBpbiB1c2UKKy8vICAgIC0gZnJhY3Rpb25hbCBiaXRzIG9mIGZyYW1lIHJhdGUgaXMgZGlzY2FyZGVkCisvLyAgICAtIHRpbWVzdGFtcHMgYXJlIGluIG1pY3Jvc2Vjb25kcywgdGhlcmVmb3JlIGVuY29kZXIgdGltZWJhc2UgaXMgZml4ZWQKKy8vIHRvIDEvMTAwMDAwMAorCitzdHJ1Y3QgQzJTb2Z0VnB4RW5jIDogcHVibGljIFNpbXBsZUMyQ29tcG9uZW50IHsKKyAgICBjbGFzcyBJbnRmSW1wbDsKKworICAgIEMyU29mdFZweEVuYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4mIGludGZJbXBsKTsKKworICAgIC8vIEZyb20gU2ltcGxlQzJDb21wb25lbnQKKyAgICBjMl9zdGF0dXNfdCBvbkluaXQoKSBvdmVycmlkZSBmaW5hbDsKKyAgICBjMl9zdGF0dXNfdCBvblN0b3AoKSBvdmVycmlkZSBmaW5hbDsKKyAgICB2b2lkIG9uUmVzZXQoKSBvdmVycmlkZSBmaW5hbDsKKyAgICB2b2lkIG9uUmVsZWFzZSgpIG92ZXJyaWRlIGZpbmFsOworICAgIGMyX3N0YXR1c190IG9uRmx1c2hfc20oKSBvdmVycmlkZSBmaW5hbDsKKworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGUgZmluYWw7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZSBmaW5hbDsKKworIHByb3RlY3RlZDoKKyAgICAgc3RkOjpzaGFyZWRfcHRyPEludGZJbXBsPiBtSW50ZjsKKyAgICAgdmlydHVhbCB+QzJTb2Z0VnB4RW5jKCk7CisKKyAgICAgLy8gSW5pdGlhbGl6ZXMgdnB4IGVuY29kZXIgd2l0aCBhdmFpbGFibGUgc2V0dGluZ3MuCisgICAgIHN0YXR1c190IGluaXRFbmNvZGVyKCk7CisKKyAgICAgLy8gUG9wdWxhdGVzIG1Db2RlY0ludGVyZmFjZSB3aXRoIGNvZGVjIHNwZWNpZmljIHNldHRpbmdzLgorICAgICB2aXJ0dWFsIHZvaWQgc2V0Q29kZWNTcGVjaWZpY0ludGVyZmFjZSgpID0gMDsKKworICAgICAvLyBTZXRzIGNvZGVjIHNwZWNpZmljIGNvbmZpZ3VyYXRpb24uCisgICAgIHZpcnR1YWwgdm9pZCBzZXRDb2RlY1NwZWNpZmljQ29uZmlndXJhdGlvbigpID0gMDsKKworICAgICAvLyBTZXRzIGNvZGVjIHNwZWNpZmljIGVuY29kZXIgY29udHJvbHMuCisgICAgIHZpcnR1YWwgdnB4X2NvZGVjX2Vycl90IHNldENvZGVjU3BlY2lmaWNDb250cm9scygpID0gMDsKKworICAgICAvLyBHZXQgY3VycmVudCBlbmNvZGUgZmxhZ3MuCisgICAgIHZpcnR1YWwgdnB4X2VuY19mcmFtZV9mbGFnc190IGdldEVuY29kZUZsYWdzKCk7CisKKyAgICAgZW51bSBUZW1wb3JhbFJlZmVyZW5jZXMgeworICAgICAgICAgLy8gRm9yIDEgbGF5ZXIgY2FzZTogcmVmZXJlbmNlIGFsbCAobGFzdCwgZ29sZGVuLCBhbmQgYWx0IHJlZiksIGJ1dCBvbmx5CisgICAgICAgICAvLyB1cGRhdGUgbGFzdC4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUxhc3RSZWZBbGwgPSAxMiwKKyAgICAgICAgIC8vIEZpcnN0IGJhc2UgbGF5ZXIgZnJhbWUgZm9yIDMgdGVtcG9yYWwgbGF5ZXJzLCB3aGljaCB1cGRhdGVzIGxhc3QgYW5kCisgICAgICAgICAvLyBnb2xkZW4gd2l0aCBhbHQgcmVmIGRlcGVuZGVuY3kuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVMYXN0QW5kR29sZGVuUmVmQWx0UmVmID0gMTEsCisgICAgICAgICAvLyBGaXJzdCBlbmhhbmNlbWVudCBsYXllciB3aXRoIGFsdCByZWYgZGVwZW5kZW5jeS4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUdvbGRlblJlZkFsdFJlZiA9IDEwLAorICAgICAgICAgLy8gRmlyc3QgZW5oYW5jZW1lbnQgbGF5ZXIgd2l0aCBhbHQgcmVmIGRlcGVuZGVuY3kuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVHb2xkZW5XaXRob3V0RGVwZW5kZW5jeVJlZkFsdFJlZiA9IDksCisgICAgICAgICAvLyBCYXNlIGxheWVyIHdpdGggYWx0IHJlZiBkZXBlbmRlbmN5LgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlTGFzdFJlZkFsdFJlZiA9IDgsCisgICAgICAgICAvLyBIaWdoZXN0IGVuaGFjZW1lbnQgbGF5ZXIgd2l0aG91dCBkZXBlbmRlbmN5IG9uIGdvbGRlbiB3aXRoIGFsdCByZWYKKyAgICAgICAgIC8vIGRlcGVuZGVuY3kuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVOb25lTm9SZWZHb2xkZW5SZWZBbHRSZWYgPSA3LAorICAgICAgICAgLy8gU2Vjb25kIGxheWVyIGFuZCBsYXN0IGZyYW1lIGluIGN5Y2xlLCBmb3IgMiBsYXllcnMuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVOb25lTm9SZWZBbHRyZWYgPSA2LAorICAgICAgICAgLy8gSGlnaGVzdCBlbmhhbmNlbWVudCBsYXllci4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZU5vbmUgPSA1LAorICAgICAgICAgLy8gU2Vjb25kIGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlQWx0cmVmID0gNCwKKyAgICAgICAgIC8vIFNlY29uZCBlbmhhbmNlbWVudCBsYXllciB3aXRob3V0IGRlcGVuZGVuY3kgb24gcHJldmlvdXMgZnJhbWVzIGluCisgICAgICAgICAvLyB0aGUgc2Vjb25kIGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlQWx0cmVmV2l0aG91dERlcGVuZGVuY3kgPSAzLAorICAgICAgICAgLy8gRmlyc3QgZW5oYW5jZW1lbnQgbGF5ZXIuCisgICAgICAgICBrVGVtcG9yYWxVcGRhdGVHb2xkZW4gPSAyLAorICAgICAgICAgLy8gRmlyc3QgZW5oYW5jZW1lbnQgbGF5ZXIgd2l0aG91dCBkZXBlbmRlbmN5IG9uIHByZXZpb3VzIGZyYW1lcyBpbgorICAgICAgICAgLy8gdGhlIGZpcnN0IGVuaGFuY2VtZW50IGxheWVyLgorICAgICAgICAga1RlbXBvcmFsVXBkYXRlR29sZGVuV2l0aG91dERlcGVuZGVuY3kgPSAxLAorICAgICAgICAgLy8gQmFzZSBsYXllci4KKyAgICAgICAgIGtUZW1wb3JhbFVwZGF0ZUxhc3QgPSAwLAorICAgICB9OworICAgICBlbnVtIHsKKyAgICAgICAgIGtNYXhUZW1wb3JhbFBhdHRlcm4gPSA4CisgICAgIH07CisKKyAgICAgLy8gdnB4IHNwZWNpZmljIG9wYXF1ZSBkYXRhIHN0cnVjdHVyZSB0aGF0CisgICAgIC8vIHN0b3JlcyBlbmNvZGVyIHN0YXRlCisgICAgIHZweF9jb2RlY19jdHhfdCogbUNvZGVjQ29udGV4dDsKKworICAgICAvLyB2cHggc3BlY2lmaWMgZGF0YSBzdHJ1Y3R1cmUgdGhhdAorICAgICAvLyBzdG9yZXMgZW5jb2RlciBjb25maWd1cmF0aW9uCisgICAgIHZweF9jb2RlY19lbmNfY2ZnX3QqIG1Db2RlY0NvbmZpZ3VyYXRpb247CisKKyAgICAgLy8gdnB4IHNwZWNpZmljIHJlYWQtb25seSBkYXRhIHN0cnVjdHVyZQorICAgICAvLyB0aGF0IHNwZWNpZmllcyBhbGdvcml0aG0gaW50ZXJmYWNlIChlLmcuIHZwOCkKKyAgICAgdnB4X2NvZGVjX2lmYWNlX3QqIG1Db2RlY0ludGVyZmFjZTsKKworICAgICAvLyBhbGlnbiBzdHJpZGUgdG8gdGhlIHBvd2VyIG9mIDIKKyAgICAgaW50MzJfdCBtU3RyaWRlQWxpZ247CisKKyAgICAgLy8gQ29sb3IgZm9ybWF0IGZvciB0aGUgaW5wdXQgcG9ydAorICAgICB2cHhfaW1nX2ZtdF90IG1Db2xvckZvcm1hdDsKKworICAgICAvLyBCaXRyYXRlIGNvbnRyb2wgbW9kZSwgZWl0aGVyIGNvbnN0YW50IG9yIHZhcmlhYmxlCisgICAgIHZweF9yY19tb2RlIG1CaXRyYXRlQ29udHJvbE1vZGU7CisKKyAgICAgLy8gUGFyYW1ldGVyIHRoYXQgZGVub3RlcyB3aGV0aGVyIGVycm9yIHJlc2lsaWVuY2UKKyAgICAgLy8gaXMgZW5hYmxlZCBpbiBlbmNvZGVyCisgICAgIGJvb2wgbUVycm9yUmVzaWxpZW5jZTsKKworICAgICAvLyBNaW5pbXVtIChiZXN0IHF1YWxpdHkpIHF1YW50aXplcgorICAgICB1aW50MzJfdCBtTWluUXVhbnRpemVyOworCisgICAgIC8vIE1heGltdW0gKHdvcnN0IHF1YWxpdHkpIHF1YW50aXplcgorICAgICB1aW50MzJfdCBtTWF4UXVhbnRpemVyOworCisgICAgIC8vIE51bWJlciBvZiBjb2RpbmcgdGVtcG9yYWwgbGF5ZXJzIHRvIGJlIHVzZWQuCisgICAgIHNpemVfdCBtVGVtcG9yYWxMYXllcnM7CisKKyAgICAgLy8gVGVtcG9yYWwgbGF5ZXIgYml0cmFyZSByYXRpbyBpbiBwZXJjZW50YWdlCisgICAgIHVpbnQzMl90IG1UZW1wb3JhbExheWVyQml0cmF0ZVJhdGlvW01BWFRFTVBPUkFMTEFZRVJTXTsKKworICAgICAvLyBUZW1wb3JhbCBwYXR0ZXJuIHR5cGUKKyAgICAgVGVtcG9yYWxQYXR0ZXJuVHlwZSBtVGVtcG9yYWxQYXR0ZXJuVHlwZTsKKworICAgICAvLyBUZW1wb3JhbCBwYXR0ZXJuIGxlbmd0aAorICAgICBzaXplX3QgbVRlbXBvcmFsUGF0dGVybkxlbmd0aDsKKworICAgICAvLyBUZW1wb3JhbCBwYXR0ZXJuIGN1cnJlbnQgaW5kZXgKKyAgICAgc2l6ZV90IG1UZW1wb3JhbFBhdHRlcm5JZHg7CisKKyAgICAgLy8gRnJhbWUgdHlwZSB0ZW1wb3JhbCBwYXR0ZXJuCisgICAgIFRlbXBvcmFsUmVmZXJlbmNlcyBtVGVtcG9yYWxQYXR0ZXJuW2tNYXhUZW1wb3JhbFBhdHRlcm5dOworCisgICAgIC8vIExhc3QgaW5wdXQgYnVmZmVyIHRpbWVzdGFtcAorICAgICB1aW50NjRfdCBtTGFzdFRpbWVzdGFtcDsKKworICAgICAvLyBOdW1iZXIgb2YgaW5wdXQgZnJhbWVzCisgICAgIGludDY0X3QgbU51bUlucHV0RnJhbWVzOworCisgICAgIC8vIENvbnZlcnNpb24gYnVmZmVyIGlzIG5lZWRlZCB0byBpbnB1dCB0bworICAgICAvLyB5dXY0MjAgcGxhbmFyIGZvcm1hdC4KKyAgICAgTWVtb3J5QmxvY2sgbUNvbnZlcnNpb25CdWZmZXI7CisKKyAgICAgLy8gU2lnbmFsbGVkIEVPUworICAgICBib29sIG1TaWduYWxsZWRPdXRwdXRFb3M7CisKKyAgICAgLy8gU2lnbmFsbGVkIEVycm9yCisgICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworCisgICAgLy8gY29uZmlndXJhdGlvbnMgdXNlZCBieSBjb21wb25lbnQgaW4gcHJvY2VzcworICAgIC8vIChUT0RPOiBrZWVwIHRoaXMgaW4gaW50ZiBidXQgbWFrZSB0aGVtIGludGVybmFsIG9ubHkpCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+IG1JbnRyYVJlZnJlc2g7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+IG1CaXRyYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUJpdHJhdGVNb2RlVHVuaW5nOjpvdXRwdXQ+IG1CaXRyYXRlTW9kZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOjpvdXRwdXQ+IG1SZXF1ZXN0U3luYzsKKworICAgICBDMl9ET19OT1RfQ09QWShDMlNvZnRWcHhFbmMpOworfTsKKworbmFtZXNwYWNlIHsKKworI2lmZGVmIFZQOQorY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLnZwOS5lbmNvZGVyIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPID0gTUVESUFfTUlNRVRZUEVfVklERU9fVlA5OworI2Vsc2UKK2NvbnN0ZXhwciBjaGFyIENPTVBPTkVOVF9OQU1FW10gPSAiYzIuYW5kcm9pZC52cDguZW5jb2RlciI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFTyA9IE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQODsKKyNlbmRpZgorCit9IC8vIG5hbWVwc2FjZQorCitjbGFzcyBDMlNvZnRWcHhFbmM6OkludGZJbXBsIDogcHVibGljIFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcyB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgSW50ZkltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiAmaGVscGVyKQorICAgICAgICA6IFNpbXBsZUludGVyZmFjZTx2b2lkPjo6QmFzZVBhcmFtcygKKyAgICAgICAgICAgICAgICBoZWxwZXIsCisgICAgICAgICAgICAgICAgQ09NUE9ORU5UX05BTUUsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUiwKKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPLAorICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX1ZJREVPKSB7CisgICAgICAgIG5vUHJpdmF0ZUJ1ZmZlcnMoKTsgLy8gVE9ETzogYWNjb3VudCBmb3Igb3VyIGJ1ZmZlcnMgaGVyZQorICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1BdHRyaWIsIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BVFRSSUJVVEVTKQorICAgICAgICAgICAgICAgIC53aXRoQ29uc3RWYWx1ZShuZXcgQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZygKKyAgICAgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkFUVFJJQl9JU19URU1QT1JBTCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtVXNhZ2UsIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9VU0FHRSkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0KAorICAgICAgICAgICAgICAgICAgICAgICAgMHUsICh1aW50NjRfdClDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCkpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1TaXplLCBDMl9QQVJBTUtFWV9QSUNUVVJFX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQoMHUsIDMyMCwgMjQwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgd2lkdGgpLmluUmFuZ2UoMiwgMjA0OCwgMiksCisgICAgICAgICAgICAgICAgICAgIEMyRihtU2l6ZSwgaGVpZ2h0KS5pblJhbmdlKDIsIDIwNDgsIDIpLAorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2l6ZVNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUJpdHJhdGVNb2RlLCBDMl9QQVJBTUtFWV9CSVRSQVRFX01PREUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbUJpdHJhdGVNb2RlVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAwdSwgQzJDb25maWc6OkJJVFJBVEVfVkFSSUFCTEUpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1CaXRyYXRlTW9kZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpCSVRSQVRFX0NPTlNULCBDMkNvbmZpZzo6QklUUkFURV9WQVJJQUJMRSB9KQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoCisgICAgICAgICAgICAgICAgICAgIFNldHRlcjxkZWNsdHlwZSgqbUJpdHJhdGVNb2RlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUZyYW1lUmF0ZSwgQzJfUEFSQU1LRVlfRlJBTUVfUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0KDB1LCAzMC4pKQorICAgICAgICAgICAgICAgIC8vIFRPRE86IE1vcmUgcmVzdHJpY3Rpb24/CisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRnJhbWVSYXRlLCB2YWx1ZSkuZ3JlYXRlclRoYW4oMC4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICAgICAgU2V0dGVyPGRlY2x0eXBlKCptRnJhbWVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgRGVmaW5lUGFyYW0obUxheWVyaW5nLCBDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORykKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQoQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKDB1LCAwLCAwLCAwKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtTGF5ZXJpbmcsIG0ubGF5ZXJDb3VudCkuaW5SYW5nZSgwLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXllcmluZywgbS5iTGF5ZXJDb3VudCkuaW5SYW5nZSgwLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1MYXllcmluZywgbS5iaXRyYXRlUmF0aW9zKS5pblJhbmdlKDAuLCAxLikKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKExheWVyaW5nU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVN5bmNGcmFtZVBlcmlvZCwgQzJfUEFSQU1LRVlfU1lOQ19GUkFNRV9JTlRFUlZBTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtU3luY0ZyYW1lSW50ZXJ2YWxUdW5pbmc6Om91dHB1dCgwdSwgMTAwMDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU3luY0ZyYW1lUGVyaW9kLCB2YWx1ZSkuYW55KCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVN5bmNGcmFtZVBlcmlvZCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgIERlZmluZVBhcmFtKG1CaXRyYXRlLCBDMl9QQVJBTUtFWV9CSVRSQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1CaXRyYXRlSW5mbzo6b3V0cHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoNDA5NiwgNDAwMDAwMDApfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihCaXRyYXRlU2V0dGVyKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUludHJhUmVmcmVzaCwgQzJfUEFSQU1LRVlfSU5UUkFfUkVGUkVTSCkKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB1LCBDMkNvbmZpZzo6SU5UUkFfUkVGUkVTSF9ESVNBQkxFRCwgMC4pKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgIERlZmluZVBhcmFtKG1Qcm9maWxlTGV2ZWwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwpCisgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1Qcm9maWxlTGV2ZWxJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgMHUsIFBST0ZJTEVfVlA5XzAsIExFVkVMX1ZQOV80XzEpKQorICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICBDMkYobVByb2ZpbGVMZXZlbCwgcHJvZmlsZSkuZXF1YWxUbygKKyAgICAgICAgICAgICAgICBQUk9GSUxFX1ZQOV8wCisgICAgICAgICAgICApLAorICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIGxldmVsKS5lcXVhbFRvKAorICAgICAgICAgICAgICAgIExFVkVMX1ZQOV80XzEpLAorICAgICAgICB9KQorICAgICAgICAud2l0aFNldHRlcihQcm9maWxlTGV2ZWxTZXR0ZXIpCisgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVJlcXVlc3RTeW5jLCBDMl9QQVJBTUtFWV9SRVFVRVNUX1NZTkNfRlJBTUUpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dCgwdSwgQzJfRkFMU0UpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobVJlcXVlc3RTeW5jLCB2YWx1ZSkub25lT2YoeyBDMl9GQUxTRSwgQzJfVFJVRSB9KSB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbVJlcXVlc3RTeW5jKT46Ok5vblN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBCaXRyYXRlU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbUJpdHJhdGVJbmZvOjpvdXRwdXQ+ICZtZSkgeworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgQzJSIHJlcyA9IEMyUjo6T2soKTsKKyAgICAgICAgaWYgKG1lLnYudmFsdWUgPD0gNDA5NikgeworICAgICAgICAgICAgbWUuc2V0KCkudmFsdWUgPSA0MDk2OworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdGljIEMyUiBTaXplU2V0dGVyKGJvb2wgbWF5QmxvY2ssIGNvbnN0IEMyUDxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+ICZvbGRNZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAoIW1lLkYobWUudi53aWR0aCkuc3VwcG9ydHNBdEFsbChtZS52LndpZHRoKSkgeworICAgICAgICAgICAgcmVzID0gcmVzLnBsdXMoQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6QmFkVmFsdWUobWUuRihtZS52LndpZHRoKSkpOworICAgICAgICAgICAgbWUuc2V0KCkud2lkdGggPSBvbGRNZS52LndpZHRoOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmhlaWdodCkuc3VwcG9ydHNBdEFsbChtZS52LmhlaWdodCkpIHsKKyAgICAgICAgICAgIHJlcyA9IHJlcy5wbHVzKEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKG1lLkYobWUudi5oZWlnaHQpKSk7CisgICAgICAgICAgICBtZS5zZXQoKS5oZWlnaHQgPSBvbGRNZS52LmhlaWdodDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBpZiAoIW1lLkYobWUudi5wcm9maWxlKS5zdXBwb3J0c0F0QWxsKG1lLnYucHJvZmlsZSkpIHsKKyAgICAgICAgICAgIG1lLnNldCgpLnByb2ZpbGUgPSBQUk9GSUxFX1ZQOV8wOworICAgICAgICB9CisgICAgICAgIGlmICghbWUuRihtZS52LmxldmVsKS5zdXBwb3J0c0F0QWxsKG1lLnYubGV2ZWwpKSB7CisgICAgICAgICAgICBtZS5zZXQoKS5sZXZlbCA9IExFVkVMX1ZQOV80XzE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisKKyAgICBzdGF0aWMgQzJSIExheWVyaW5nU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dD4mIG1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBDMlIgcmVzID0gQzJSOjpPaygpOworICAgICAgICBpZiAobWUudi5tLmxheWVyQ291bnQgPiA0KSB7CisgICAgICAgICAgICBtZS5zZXQoKS5tLmxheWVyQ291bnQgPSA0OworICAgICAgICB9CisgICAgICAgIG1lLnNldCgpLm0uYkxheWVyQ291bnQgPSAwOworICAgICAgICAvLyBlbnN1cmUgcmF0aW9zIGFyZSBtb25vdG9uaWMgYW5kIGNsYW1wZWQgYmV0d2VlbiAwIGFuZCAxCisgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBtZS52LmZsZXhDb3VudCgpOyArK2l4KSB7CisgICAgICAgICAgICBtZS5zZXQoKS5tLmJpdHJhdGVSYXRpb3NbaXhdID0gYzJfY2xhbXAoCisgICAgICAgICAgICAgICAgaXggPiAwID8gbWUudi5tLmJpdHJhdGVSYXRpb3NbaXggLSAxXSA6IDAsIG1lLnYubS5iaXRyYXRlUmF0aW9zW2l4XSwgMS4pOworICAgICAgICB9CisgICAgICAgIEFMT0dJKCJzZXR0aW5nIHRlbXBvcmFsIGxheWVyaW5nICV1ICsgJXUiLCBtZS52Lm0ubGF5ZXJDb3VudCwgbWUudi5tLmJMYXllckNvdW50KTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyB1bnNhZmUgZ2V0dGVycworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQ+IGdldFNpemVfbCgpIGNvbnN0IHsgcmV0dXJuIG1TaXplOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtSW50cmFSZWZyZXNoVHVuaW5nOjpvdXRwdXQ+IGdldEludHJhUmVmcmVzaF9sKCkgY29uc3QgeyByZXR1cm4gbUludHJhUmVmcmVzaDsgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUZyYW1lUmF0ZUluZm86Om91dHB1dD4gZ2V0RnJhbWVSYXRlX2woKSBjb25zdCB7IHJldHVybiBtRnJhbWVSYXRlOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gZ2V0Qml0cmF0ZV9sKCkgY29uc3QgeyByZXR1cm4gbUJpdHJhdGU7IH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1CaXRyYXRlTW9kZVR1bmluZzo6b3V0cHV0PiBnZXRCaXRyYXRlTW9kZV9sKCkgY29uc3QgeyByZXR1cm4gbUJpdHJhdGVNb2RlOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PiBnZXRSZXF1ZXN0U3luY19sKCkgY29uc3QgeyByZXR1cm4gbVJlcXVlc3RTeW5jOyB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0PiBnZXRUZW1wb3JhbExheWVyc19sKCkgY29uc3QgeyByZXR1cm4gbUxheWVyaW5nOyB9CisgICAgdWludDMyX3QgZ2V0U3luY0ZyYW1lUGVyaW9kKCkgY29uc3QgeworICAgICAgICBpZiAobVN5bmNGcmFtZVBlcmlvZC0+dmFsdWUgPCAwIHx8IG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlID09IElOVDY0X01BWCkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgZG91YmxlIHBlcmlvZCA9IG1TeW5jRnJhbWVQZXJpb2QtPnZhbHVlIC8gMWU2ICogbUZyYW1lUmF0ZS0+dmFsdWU7CisgICAgICAgIHJldHVybiAodWludDMyX3QpYzJfbWF4KGMyX21pbihwZXJpb2QgKyAwLjUsIGRvdWJsZShVSU5UMzJfTUFYKSksIDEuKTsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtVXNhZ2VUdW5pbmc6OmlucHV0PiBtVXNhZ2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dD4gbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRnJhbWVSYXRlSW5mbzo6b3V0cHV0PiBtRnJhbWVSYXRlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dD4gbUxheWVyaW5nOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzo6b3V0cHV0PiBtSW50cmFSZWZyZXNoOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVJlcXVlc3RTeW5jRnJhbWVUdW5pbmc6Om91dHB1dD4gbVJlcXVlc3RTeW5jOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOjpvdXRwdXQ+IG1TeW5jRnJhbWVQZXJpb2Q7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86Om91dHB1dD4gbUJpdHJhdGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc6Om91dHB1dD4gbUJpdHJhdGVNb2RlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86Om91dHB1dD4gbVByb2ZpbGVMZXZlbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9DMl9TT0ZUX1ZQWF9FTkNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL01PRFVMRV9MSUNFTlNFX0FQQUNIRTIgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKY29weSBmcm9tIG1lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTU9EVUxFX0xJQ0VOU0VfQVBBQ0hFMgpjb3B5IHRvIG1lZGlhL2NvZGVjMi9jb21wb25lbnRzL3ZweC9NT0RVTEVfTElDRU5TRV9BUEFDSEUyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy92cHgvTk9USUNFIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L05PVElDRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWVkNThhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMvdnB4L05PVElDRQpAQCAtMCwwICsxLDE5MCBAQAorCisgICBDb3B5cmlnaHQgKGMpIDIwMDUtMjAxMywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKworICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KKworICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCisKKyAgIDEuIERlZmluaXRpb25zLgorCisgICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAorICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCisKKyAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5CisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCisKKyAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKKyAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KKyAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCisgICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKKyAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCisgICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKKyAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCisKKyAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKKyAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCisKKyAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAorICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgorICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KKworICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKKyAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKKyAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKKyAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KKworICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKKyAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKKyAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yaworICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KKworICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAorICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQorICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucworICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKKyAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgorICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAorICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KKworICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKKyAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKKyAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQorICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgorICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCisgICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKKyAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKKyAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCisgICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAorICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKKyAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAorICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKKyAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgorCisgICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQorICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCisgICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KKworICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCisgICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQorICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCisgICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCisKKyAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgorICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAorICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKKyAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAorICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCisgICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKKyAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKKyAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91CisgICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQorICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yaworICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKKyAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKKyAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQorICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgorCisgICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQorICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0CisgICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQorICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6CisKKyAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCisgICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKKworICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcworICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAorCisgICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKKyAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCisgICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKKyAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCisgICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAorCisgICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKKyAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0CisgICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCisgICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90CisgICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCisgICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKKyAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCisgICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCisgICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAorICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cworICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKKyAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgorICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCisgICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCisgICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCisgICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgorCisgICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKKyAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKKyAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKKyAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAorICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCisgICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgorCisgICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCisgICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKKyAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCisgICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KKyAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKKyAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCisgICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCisKKyAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKKyAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKKyAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQorICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCisKKyAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgorICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAorICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKKyAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCisgICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCisgICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKKyAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQorICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgorCisgICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKKyAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAorICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKKyAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCisgICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCisgICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKKyAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKKyAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKKyAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCisgICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCisgICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCisKKyAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKKyAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCisgICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAorICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKKyAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5CisgICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgorICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAorICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5CisgICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCisgICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KKworICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzk1Y2MxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvbXBvbmVudHMveGFhYy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTEgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyX3NvZnRfeGFhY2RlYyIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0LWRlZmF1bHRzIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJTb2Z0WGFhY0RlYy5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYnhhYWNkZWMiXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQzJTb2Z0WGFhY0RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZWJhZGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuY3BwCkBAIC0wLDAgKzEsMTU5NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJTb2Z0WGFhY0RlYyIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPFNpbXBsZUMySW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDMlNvZnRYYWFjRGVjLmgiCisKKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX1JFRl9MRVZFTCAtMTYuMCAgIC8qIDY0Ki0wLjI1ZEIgPSAtMTYgZEIgYmVsb3cgZnVsbCBzY2FsZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQgICAxLjAgIC8qIG1heGltdW0gY29tcHJlc3Npb24gb2YgZHluYW1pYyByYW5nZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCAxLjAgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0hFQVZZIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fSEVBVlkgICAvKiBzd2l0Y2ggZm9yIGhlYXZ5IGNvbXByZXNzaW9uIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0VGRkVDVCAzICAvKiBNUEVHLUQgRFJDIGVmZmVjdCB0eXBlOyAzID0+IExpbWl0ZWQgcGxheWJhY2sgcmFuZ2UgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCAoMC4yNSkgLyogZW5jb2RlciB0YXJnZXQgbGV2ZWw7IC0xID0+IHRoZSB2YWx1ZSBpcyB1bmtub3duLCBvdGhlcndpc2UgZEIgc3RlcCB2YWx1ZSAoZS5nLiA2NCBmb3IgLTE2IGRCKSAqLworI2RlZmluZSBNQVhfQ0hBTk5FTF9DT1VOVCAgICAgICAgICAgIDggIC8qIG1heGltdW0gbnVtYmVyIG9mIGF1ZGlvIGNoYW5uZWxzIHRoYXQgY2FuIGJlIGRlY29kZWQgKi8KKy8vIG5hbWVzIG9mIHByb3BlcnRpZXMgdGhhdCBjYW4gYmUgdXNlZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdCBEUkMgc2V0dGluZ3MKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfUkVGX0xFVkVMICAiYWFjX2RyY19yZWZlcmVuY2VfbGV2ZWwiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0NVVCAgICAgICAgImFhY19kcmNfY3V0IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9CT09TVCAgICAgICJhYWNfZHJjX2Jvb3N0IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9IRUFWWSAgICAgICJhYWNfZHJjX2hlYXZ5IgorI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9FTkNfTEVWRUwgICJhYWNfZHJjX2VuY190YXJnZXRfbGV2ZWwiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0VGRkVDVF9UWVBFICJyby5hYWNfZHJjX2VmZmVjdF90eXBlIgorCisjZGVmaW5lIFJFVFVSTl9JRl9GQVRBTChyZXR2YWwsIHN0cikgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAocmV0dmFsICYgSUFfRkFUQUxfRVJST1IpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HRSgiRXJyb3IgaW4gJXM6IFJldHVybmVkOiAlZCIsIHN0ciwgcmV0dmFsKTsgICBcCisgICAgICAgIHJldHVybiByZXR2YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgaWYgKHJldHZhbCAhPSBJQV9OT19FUlJPUikgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HVygiV2FybmluZyBpbiAlczogUmV0dXJuZWQ6ICVkIiwgc3RyLCByZXR2YWwpOyBcCisgICAgfQorCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIGNoYXIgQ09NUE9ORU5UX05BTUVbXSA9ICJjMi5hbmRyb2lkLnhhYWMuZGVjb2RlciI7CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBDMlNvZnRYYWFjRGVjOjpJbnRmSW1wbCA6IHB1YmxpYyBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGZJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBTaW1wbGVJbnRlcmZhY2U8dm9pZD46OkJhc2VQYXJhbXMoCisgICAgICAgICAgICAgICAgaGVscGVyLAorICAgICAgICAgICAgICAgIENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIsCisgICAgICAgICAgICAgICAgQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTywKKyAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMpIHsKKyAgICAgICAgbm9Qcml2YXRlQnVmZmVycygpOworICAgICAgICBub0lucHV0UmVmZXJlbmNlcygpOworICAgICAgICBub091dHB1dFJlZmVyZW5jZXMoKTsKKyAgICAgICAgbm9JbnB1dExhdGVuY3koKTsKKyAgICAgICAgbm9UaW1lU3RyZXRjaCgpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQXR0cmliLCBDMl9QQVJBTUtFWV9DT01QT05FTlRfQVRUUklCVVRFUykKKyAgICAgICAgICAgICAgICAud2l0aENvbnN0VmFsdWUobmV3IEMyQ29tcG9uZW50QXR0cmlidXRlc1NldHRpbmcoCisgICAgICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpBVFRSSUJfSVNfVEVNUE9SQUwpKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVNhbXBsZVJhdGUsIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0KDB1LCA0NDEwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtU2FtcGxlUmF0ZSwgdmFsdWUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgNzM1MCwgODAwMCwgMTEwMjUsIDEyMDAwLCAxNjAwMCwgMjIwNTAsIDI0MDAwLCAzMjAwMCwgNDQxMDAsIDQ4MDAwCisgICAgICAgICAgICAgICAgfSl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKChTZXR0ZXI8ZGVjbHR5cGUoKm1TYW1wbGVSYXRlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQ2hhbm5lbENvdW50LCBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQoMHUsIDEpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUNoYW5uZWxDb3VudCwgdmFsdWUpLmluUmFuZ2UoMSwgOCl9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjxkZWNsdHlwZSgqbUNoYW5uZWxDb3VudCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQml0cmF0ZSwgQzJfUEFSQU1LRVlfQklUUkFURSkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0KDB1LCA2NDAwMCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtQml0cmF0ZSwgdmFsdWUpLmluUmFuZ2UoODAwMCwgOTYwMDAwKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptQml0cmF0ZSk+OjpOb25TdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW5wdXRNYXhCdWZTaXplLCBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfQlVGRkVSX1NJWkUpCisgICAgICAgICAgICAgICAgLndpdGhDb25zdFZhbHVlKG5ldyBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCgwdSwgODE5MikpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtQWFjRm9ybWF0LCBDMl9QQVJBTUtFWV9BQUNfUEFDS0FHSU5HKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1BYWNGb3JtYXRJbmZvOjppbnB1dCgwdSwgQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfUkFXKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1BYWNGb3JtYXQsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX1JBVywgQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfQURUUworICAgICAgICAgICAgICAgIH0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1BYWNGb3JtYXQpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obVByb2ZpbGVMZXZlbCwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQoMHUsCisgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHsKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Qcm9maWxlTGV2ZWwsIHByb2ZpbGUpLm9uZU9mKHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19IRV9QUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTEQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VMRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6UFJPRklMRV9BQUNfWEhFfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtUHJvZmlsZUxldmVsLCBsZXZlbCkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQKKyAgICAgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFByb2ZpbGVMZXZlbFNldHRlcikKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1EcmNDb21wcmVzc01vZGUsIEMyX1BBUkFNS0VZX0RSQ19DT01QUkVTU0lPTl9NT0RFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNDb21wcmVzc2lvbk1vZGVUdW5pbmc6OmlucHV0KDB1LCBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtRHJjQ29tcHJlc3NNb2RlLCB2YWx1ZSkub25lT2YoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fT0RNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfQ09NUFJFU1NJT05fTElHSFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9IRUFWWX0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNDb21wcmVzc01vZGUpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY1RhcmdldFJlZkxldmVsLCBDMl9QQVJBTUtFWV9EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCkKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RyZWFtRHJjVGFyZ2V0UmVmZXJlbmNlTGV2ZWxUdW5pbmc6OmlucHV0KDB1LCBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNUYXJnZXRSZWZMZXZlbCwgdmFsdWUpLmluUmFuZ2UoLTMxLjc1LCAwLjI1KX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjVGFyZ2V0UmVmTGV2ZWwpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0VuY1RhcmdldExldmVsLCBDMl9QQVJBTUtFWV9EUkNfRU5DT0RFRF9UQVJHRVRfTEVWRUwpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0VuY29kZWRUYXJnZXRMZXZlbFR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9FTkNfTEVWRUwpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobURyY0VuY1RhcmdldExldmVsLCB2YWx1ZSkuaW5SYW5nZSgtMzEuNzUsIDAuMjUpfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNFbmNUYXJnZXRMZXZlbCk+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjQm9vc3RGYWN0b3IsIEMyX1BBUkFNS0VZX0RSQ19CT09TVF9GQUNUT1IpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0cmVhbURyY0Jvb3N0RmFjdG9yVHVuaW5nOjppbnB1dCgwdSwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19CT09TVCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoe0MyRihtRHJjQm9vc3RGYWN0b3IsIHZhbHVlKS5pblJhbmdlKDAsIDEuKX0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0dGVyPGRlY2x0eXBlKCptRHJjQm9vc3RGYWN0b3IpPjo6U3RyaWN0VmFsdWVXaXRoTm9EZXBzKQorICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKKworICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obURyY0F0dGVudWF0aW9uRmFjdG9yLCBDMl9QQVJBTUtFWV9EUkNfQVRURU5VQVRJT05fRkFDVE9SKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNBdHRlbnVhdGlvbkZhY3RvclR1bmluZzo6aW5wdXQoMHUsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQ1VUKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7QzJGKG1EcmNBdHRlbnVhdGlvbkZhY3RvciwgdmFsdWUpLmluUmFuZ2UoMCwgMS4pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNBdHRlbnVhdGlvbkZhY3Rvcik+OjpTdHJpY3RWYWx1ZVdpdGhOb0RlcHMpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworCisgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtRHJjRWZmZWN0VHlwZSwgQzJfUEFSQU1LRVlfRFJDX0VGRkVDVF9UWVBFKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJTdHJlYW1EcmNFZmZlY3RUeXBlVHVuaW5nOjppbnB1dCgwdSwgQzJDb25maWc6OkRSQ19FRkZFQ1RfTElNSVRFRF9QTEFZQkFDS19SQU5HRSkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobURyY0VmZmVjdFR5cGUsIHZhbHVlKS5vbmVPZih7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfT0RNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfT0ZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfTEFURV9OSUdIVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9OT0lTWV9FTlZJUk9OTUVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9MSU1JVEVEX1BMQVlCQUNLX1JBTkdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyQ29uZmlnOjpEUkNfRUZGRUNUX0xPV19QTEFZQkFDS19MRVZFTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbmZpZzo6RFJDX0VGRkVDVF9ESUFMT0dfRU5IQU5DRU1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJDb25maWc6OkRSQ19FRkZFQ1RfR0VORVJBTF9DT01QUkVTU0lPTn0pCisgICAgICAgICAgICAgICAgfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihTZXR0ZXI8ZGVjbHR5cGUoKm1EcmNFZmZlY3RUeXBlKT46OlN0cmljdFZhbHVlV2l0aE5vRGVwcykKKyAgICAgICAgICAgICAgICAuYnVpbGQoKSk7CisgICAgfQorCisgICAgYm9vbCBpc0FkdHMoKSBjb25zdCB7IHJldHVybiBtQWFjRm9ybWF0LT52YWx1ZSA9PSBDMkNvbmZpZzo6QUFDX1BBQ0tBR0lOR19BRFRTOyB9CisgICAgdWludDMyX3QgZ2V0Qml0cmF0ZSgpIGNvbnN0IHsgcmV0dXJuIG1CaXRyYXRlLT52YWx1ZTsgfQorICAgIHN0YXRpYyBDMlIgUHJvZmlsZUxldmVsU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMlN0cmVhbVByb2ZpbGVMZXZlbEluZm86OmlucHV0PiAmbWUpIHsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKW1lOyAgLy8gVE9ETzogdmFsaWRhdGUKKyAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICB9CisgICAgaW50MzJfdCBnZXREcmNDb21wcmVzc01vZGUoKSBjb25zdCB7IHJldHVybiBtRHJjQ29tcHJlc3NNb2RlLT52YWx1ZSA9PSBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZID8gMSA6IDA7IH0KKyAgICBpbnQzMl90IGdldERyY1RhcmdldFJlZkxldmVsKCkgY29uc3QgeyByZXR1cm4gKG1EcmNUYXJnZXRSZWZMZXZlbC0+dmFsdWUgPD0gMCA/IC1tRHJjVGFyZ2V0UmVmTGV2ZWwtPnZhbHVlICogNC4gKyAwLjUgOiAtMSk7IH0KKyAgICBpbnQzMl90IGdldERyY0VuY1RhcmdldExldmVsKCkgY29uc3QgeyByZXR1cm4gKG1EcmNFbmNUYXJnZXRMZXZlbC0+dmFsdWUgPD0gMCA/IC1tRHJjRW5jVGFyZ2V0TGV2ZWwtPnZhbHVlICogNC4gKyAwLjUgOiAtMSk7IH0KKyAgICBpbnQzMl90IGdldERyY0Jvb3N0RmFjdG9yKCkgY29uc3QgeyByZXR1cm4gbURyY0Jvb3N0RmFjdG9yLT52YWx1ZSAqIDEyNy4gKyAwLjU7IH0KKyAgICBpbnQzMl90IGdldERyY0F0dGVudWF0aW9uRmFjdG9yKCkgY29uc3QgeyByZXR1cm4gbURyY0F0dGVudWF0aW9uRmFjdG9yLT52YWx1ZSAqIDEyNy4gKyAwLjU7IH0KKyAgICBpbnQzMl90IGdldERyY0VmZmVjdFR5cGUoKSBjb25zdCB7IHJldHVybiBtRHJjRWZmZWN0VHlwZS0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6b3V0cHV0PiBtU2FtcGxlUmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ+IG1DaGFubmVsQ291bnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQml0cmF0ZUluZm86OmlucHV0PiBtQml0cmF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzo6aW5wdXQ+IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtQWFjRm9ybWF0SW5mbzo6aW5wdXQ+IG1BYWNGb3JtYXQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzo6aW5wdXQ+IG1Qcm9maWxlTGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQ29tcHJlc3Npb25Nb2RlVHVuaW5nOjppbnB1dD4gbURyY0NvbXByZXNzTW9kZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNUYXJnZXRSZWZlcmVuY2VMZXZlbFR1bmluZzo6aW5wdXQ+IG1EcmNUYXJnZXRSZWZMZXZlbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJlYW1EcmNFbmNvZGVkVGFyZ2V0TGV2ZWxUdW5pbmc6OmlucHV0PiBtRHJjRW5jVGFyZ2V0TGV2ZWw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQm9vc3RGYWN0b3JUdW5pbmc6OmlucHV0PiBtRHJjQm9vc3RGYWN0b3I7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjQXR0ZW51YXRpb25GYWN0b3JUdW5pbmc6OmlucHV0PiBtRHJjQXR0ZW51YXRpb25GYWN0b3I7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RyZWFtRHJjRWZmZWN0VHlwZVR1bmluZzo6aW5wdXQ+IG1EcmNFZmZlY3RUeXBlOworICAgIC8vIFRPRE8gQWRkIDogQzJTdHJlYW1BYWNTYnJNb2RlVHVuaW5nCit9OworCitDMlNvZnRYYWFjRGVjOjpDMlNvZnRYYWFjRGVjKAorICAgICAgICBjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gJmludGZJbXBsKQorICAgIDogU2ltcGxlQzJDb21wb25lbnQoc3RkOjptYWtlX3NoYXJlZDxTaW1wbGVJbnRlcmZhY2U8SW50ZkltcGw+PihuYW1lLCBpZCwgaW50ZkltcGwpKSwKKyAgICAgICAgbUludGYoaW50ZkltcGwpLAorICAgICAgICBtWGhlYWFjQ29kZWNIYW5kbGUobnVsbHB0ciksCisgICAgICAgIG1NcGVnRERyY0hhbmRsZShudWxscHRyKSwKKyAgICAgICAgbU91dHB1dERyYWluQnVmZmVyKG51bGxwdHIpIHsKK30KKworQzJTb2Z0WGFhY0RlYzo6fkMyU29mdFhhYWNEZWMoKSB7CisgICAgb25SZWxlYXNlKCk7Cit9CisKK2MyX3N0YXR1c190IEMyU29mdFhhYWNEZWM6Om9uSW5pdCgpIHsKKyAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSAxMDI0OworICAgIG1JbnB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgbU91dHB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgbVNhbXBGcmVxID0gMDsKKyAgICBtTnVtQ2hhbm5lbHMgPSAwOworICAgIG1QY21XZFN6ID0gMDsKKyAgICBtQ2hhbm5lbE1hc2sgPSAwOworICAgIG1OdW1PdXRCeXRlcyA9IDA7CisgICAgbUN1ckZyYW1lSW5kZXggPSAwOworICAgIG1DdXJUaW1lc3RhbXAgPSAwOworICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgICBtSXNDb2RlY0NvbmZpZ0ZsdXNoUmVxdWlyZWQgPSBmYWxzZTsKKyAgICBtU2lnbmFsbGVkT3V0cHV0RW9zID0gZmFsc2U7CisgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgbU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MgPSAwOworICAgIG1EUkNGbGFnID0gMDsKKyAgICBtTXBlZ0REUkNQcmVzZW50ID0gMDsKKyAgICBtTWVtb3J5VmVjLmNsZWFyKCk7CisgICAgbURyY01lbW9yeVZlYy5jbGVhcigpOworCisgICAgSUFfRVJST1JDT0RFIGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgcmV0dXJuIGVyciA9PSBJQV9OT19FUlJPUiA/IEMyX09LIDogQzJfQ09SUlVQVEVEOworCit9CisKK2MyX3N0YXR1c190IEMyU29mdFhhYWNEZWM6Om9uU3RvcCgpIHsKKyAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSAxMDI0OworICAgIGRyYWluRGVjb2RlcigpOworICAgIC8vIHJlc2V0IHRoZSAiY29uZmlndXJlZCIgc3RhdGUKKyAgICBtU2FtcEZyZXEgPSAwOworICAgIG1OdW1DaGFubmVscyA9IDA7CisgICAgbVBjbVdkU3ogPSAwOworICAgIG1DaGFubmVsTWFzayA9IDA7CisgICAgbU51bU91dEJ5dGVzID0gMDsKKyAgICBtQ3VyRnJhbWVJbmRleCA9IDA7CisgICAgbUN1clRpbWVzdGFtcCA9IDA7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworICAgIG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zID0gMDsKKyAgICBtRFJDRmxhZyA9IDA7CisgICAgbU1wZWdERFJDUHJlc2VudCA9IDA7CisKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK3ZvaWQgQzJTb2Z0WGFhY0RlYzo6b25SZXNldCgpIHsKKyAgICAodm9pZClvblN0b3AoKTsKK30KKwordm9pZCBDMlNvZnRYYWFjRGVjOjpvblJlbGVhc2UoKSB7CisgICAgSUFfRVJST1JDT0RFIGVyckNvZGUgPSBkZUluaXRYQUFDRGVjb2RlcigpOworICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJDb2RlKSBBTE9HRSgiZGVJbml0WEFBQ0RlY29kZXIoKSBmYWlsZWQgJWQiLCBlcnJDb2RlKTsKKworICAgIGVyckNvZGUgPSBkZUluaXRNUEVHREREcmMoKTsKKyAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyQ29kZSkgQUxPR0UoImRlSW5pdE1QRUdERERyYygpIGZhaWxlZCAlZCIsIGVyckNvZGUpOworCisgICAgaWYgKG1PdXRwdXREcmFpbkJ1ZmZlcikgeworICAgICAgICBkZWxldGVbXSBtT3V0cHV0RHJhaW5CdWZmZXI7CisgICAgICAgIG1PdXRwdXREcmFpbkJ1ZmZlciA9IG51bGxwdHI7CisgICAgfQorfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6aW5pdERlY29kZXIoKSB7CisgICAgQUxPR1YoImluaXREZWNvZGVyKCkiKTsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKworICAgIGVycl9jb2RlID0gaW5pdFhBQUNEZWNvZGVyKCk7CisgICAgaWYgKGVycl9jb2RlICE9IElBX05PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJpbml0WEFBQ0RlY29kZXIgRmFpbGVkIik7CisgICAgICAgIC8qIENhbGwgZGVJbml0IHRvIGZyZWUgYW55IGFsbG9jYXRlZCBtZW1vcnkgKi8KKyAgICAgICAgZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKworICAgIGlmICghbU91dHB1dERyYWluQnVmZmVyKSB7CisgICAgICAgIG1PdXRwdXREcmFpbkJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBjaGFyW2tPdXRwdXREcmFpbkJ1ZmZlclNpemVdOworICAgICAgICBpZiAoIW1PdXRwdXREcmFpbkJ1ZmZlcikgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKworICAgIGVycl9jb2RlID0gaW5pdFhBQUNEcmMoKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiaW5pdFhBQUNEcmMiKTsKKworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitzdGF0aWMgdm9pZCBmaWxsRW1wdHlXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrKSB7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgQUxPR1YoInNpZ25hbGxpbmcgZW9zIik7CisgICAgfQorICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsID0gd29yay0+aW5wdXQub3JkaW5hbDsKKyAgICB3b3JrLT53b3JrbGV0c1Byb2Nlc3NlZCA9IDF1OworfQorCit2b2lkIEMyU29mdFhhYWNEZWM6OmZpbmlzaFdvcmsoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgIEFMT0dWKCJtQ3VyRnJhbWVJbmRleCA9ICUiIFBSSXU2NCwgbUN1ckZyYW1lSW5kZXgpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX07CisgICAgLy8gVE9ETzogZXJyb3IgaGFuZGxpbmcsIHByb3BlciB1c2FnZSwgZXRjLgorICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgIHBvb2wtPmZldGNoTGluZWFyQmxvY2sobU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MsIHVzYWdlLCAmYmxvY2spOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0UoImZldGNoTGluZWFyQmxvY2sgZmFpbGVkIDogZXJyID0gJWQiLCBlcnIpOworICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9OT19NRU1PUlk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQzJXcml0ZVZpZXcgd1ZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgaW50MTZfdCogb3V0QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxpbnQxNl90Kj4od1ZpZXcuZGF0YSgpKTsKKyAgICBtZW1jcHkob3V0QnVmZmVyLCBtT3V0cHV0RHJhaW5CdWZmZXIsIG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zKTsKKyAgICBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcyA9IDA7CisKKyAgICBhdXRvIGZpbGxXb3JrID0gW2J1ZmZlciA9IGNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jayldKAorICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaykgeworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIGlmICh3b3JrLT5pbnB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICBBTE9HVigic2lnbmFsbGluZyBlb3MiKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLnB1c2hfYmFjayhidWZmZXIpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbCA9IHdvcmstPmlucHV0Lm9yZGluYWw7CisgICAgICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgfTsKKyAgICBpZiAod29yayAmJiB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPT0gYzJfY250cjY0X3QobUN1ckZyYW1lSW5kZXgpKSB7CisgICAgICAgIGZpbGxXb3JrKHdvcmspOworICAgIH0gZWxzZSB7CisgICAgICAgIGZpbmlzaChtQ3VyRnJhbWVJbmRleCwgZmlsbFdvcmspOworICAgIH0KKworICAgIEFMT0dWKCJvdXQgdGltZXN0YW1wICUiIFBSSXU2NCAiIC8gJXUiLCBtQ3VyVGltZXN0YW1wLCBibG9jay0+Y2FwYWNpdHkoKSk7Cit9CisKK3ZvaWQgQzJTb2Z0WGFhY0RlYzo6cHJvY2Vzcyhjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKSB7CisgICAgLy8gSW5pdGlhbGl6ZSBvdXRwdXQgd29yaworICAgIHdvcmstPnJlc3VsdCA9IEMyX09LOworICAgIHdvcmstPndvcmtsZXRzUHJvY2Vzc2VkID0gMXU7CisgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyA9IHdvcmstPmlucHV0LmZsYWdzOworCisgICAgaWYgKG1TaWduYWxsZWRFcnJvciB8fCBtU2lnbmFsbGVkT3V0cHV0RW9zKSB7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB1aW50OF90KiBpbkJ1ZmZlciA9IG51bGxwdHI7CisgICAgdWludDMyX3QgaW5CdWZmZXJMZW5ndGggPSAwOworICAgIEMyUmVhZFZpZXcgdmlldyA9IG1EdW1teVJlYWRWaWV3OworICAgIHNpemVfdCBvZmZzZXQgPSAwdTsKKyAgICBzaXplX3Qgc2l6ZSA9IDB1OworICAgIGlmICghd29yay0+aW5wdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIHZpZXcgPSB3b3JrLT5pbnB1dC5idWZmZXJzWzBdLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgc2l6ZSA9IHZpZXcuY2FwYWNpdHkoKTsKKyAgICB9CisgICAgaWYgKHNpemUgJiYgdmlldy5lcnJvcigpKSB7CisgICAgICAgIEFMT0dFKCJyZWFkIHZpZXcgbWFwIGZhaWxlZCAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgIHdvcmstPnJlc3VsdCA9IHZpZXcuZXJyb3IoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGJvb2wgZW9zID0gKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSkgIT0gMDsKKyAgICBib29sIGNvZGVjQ29uZmlnID0KKyAgICAgICAgKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwOworICAgIGlmIChjb2RlY0NvbmZpZykgeworICAgICAgICBpZiAoc2l6ZSA9PSAwdSkgeworICAgICAgICAgICAgQUxPR0UoImVtcHR5IGNvZGVjIGNvbmZpZyIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBjb25zdF9jYXN0IGJlY2F1c2Ugb2YgbGliQUFDZGVjIG1ldGhvZCBzaWduYXR1cmUuCisgICAgICAgIGluQnVmZmVyID0gY29uc3RfY2FzdDx1aW50OF90Kj4odmlldy5kYXRhKCkgKyBvZmZzZXQpOworICAgICAgICBpbkJ1ZmZlckxlbmd0aCA9IHNpemU7CisKKyAgICAgICAgLyogR0EgaGVhZGVyIGNvbmZpZ3VyYXRpb24gc2VudCB0byBEZWNvZGVyISAqLworICAgICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBjb25maWdYQUFDRGVjb2RlcihpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworICAgICAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyX2NvZGUpIHsKKyAgICAgICAgICAgIEFMT0dFKCJjb25maWdYQUFDRGVjb2RlciBlcnJfY29kZSA9ICVkIiwgZXJyX2NvZGUpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgPSB3b3JrLT5pbnB1dC5mbGFnczsKKyAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwgPSB3b3JrLT5pbnB1dC5vcmRpbmFsOworICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUN1ckZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICBtQ3VyVGltZXN0YW1wID0gd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKTsKKyAgICBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcyA9IDA7CisgICAgY2hhciogdGVtcE91dHB1dERyYWluQnVmZmVyID0gbU91dHB1dERyYWluQnVmZmVyOworICAgIHdoaWxlIChzaXplID4gMHUpIHsKKyAgICAgICAgaWYgKChrT3V0cHV0RHJhaW5CdWZmZXJTaXplICogc2l6ZW9mKGludDE2X3QpIC0KKyAgICAgICAgICAgICBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvcykgPAorICAgICAgICAgICAgKG1PdXRwdXRGcmFtZUxlbmd0aCAqIHNpemVvZihpbnQxNl90KSAqIG1OdW1DaGFubmVscykpIHsKKyAgICAgICAgICAgIEFMT0dWKCJza2lwcGluZyBkZWNvZGU6IG5vdCBlbm91Z2ggc3BhY2UgbGVmdCBpbiBEcmFpbkJ1ZmZlciIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiaW5BdHRyaWJ1dGUgc2l6ZSA9ICV6dSIsIHNpemUpOworICAgICAgICBpZiAobUludGYtPmlzQWR0cygpKSB7CisgICAgICAgICAgICBBTE9HVigiQURUUyIpOworICAgICAgICAgICAgc2l6ZV90IGFkdHNIZWFkZXJTaXplID0gMDsKKyAgICAgICAgICAgIC8vIHNraXAgMzAgYml0cywgYWFjX2ZyYW1lX2xlbmd0aCBmb2xsb3dzLgorICAgICAgICAgICAgLy8gc3Nzc3Nzc3Mgc3Nzc2lpaXAgcHBmZmZmUGMgY2NvaENDbGwgbGxsbGxsbGwgbGxsPz8/Pz8KKworICAgICAgICAgICAgY29uc3QgdWludDhfdCogYWR0c0hlYWRlciA9IHZpZXcuZGF0YSgpICsgb2Zmc2V0OworICAgICAgICAgICAgYm9vbCBzaWduYWxFcnJvciA9IGZhbHNlOworICAgICAgICAgICAgaWYgKHNpemUgPCA3KSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkF1ZGlvIGRhdGEgdG9vIHNob3J0IHRvIGNvbnRhaW4gZXZlbiB0aGUgQURUUyBoZWFkZXIuICIKKyAgICAgICAgICAgICAgICAgICAgICAiR290ICV6dSBieXRlcy4iLCBzaXplKTsKKyAgICAgICAgICAgICAgICBoZXhkdW1wKGFkdHNIZWFkZXIsIHNpemUpOworICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYm9vbCBwcm90ZWN0aW9uQWJzZW50ID0gKGFkdHNIZWFkZXJbMV0gJiAxKTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBhYWNfZnJhbWVfbGVuZ3RoID0gKChhZHRzSGVhZGVyWzNdICYgMykgPDwgMTEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFkdHNIZWFkZXJbNF0gPDwgMykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWR0c0hlYWRlcls1XSA+PiA1KTsKKworICAgICAgICAgICAgICAgIGlmIChzaXplIDwgYWFjX2ZyYW1lX2xlbmd0aCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBhdWRpbyBkYXRhIGZvciB0aGUgY29tcGxldGUgZnJhbWUuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkdvdCAlenUgYnl0ZXMsIGZyYW1lIHNpemUgYWNjb3JkaW5nIHRvIHRoZSBBRFRTICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImhlYWRlciBpcyAldSBieXRlcy4iLCBzaXplLCBhYWNfZnJhbWVfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgaGV4ZHVtcChhZHRzSGVhZGVyLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgc2lnbmFsRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGFkdHNIZWFkZXJTaXplID0gKHByb3RlY3Rpb25BYnNlbnQgPyA3IDogOSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhYWNfZnJhbWVfbGVuZ3RoIDwgYWR0c0hlYWRlclNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbnN0X2Nhc3QgYmVjYXVzZSBvZiBsaWJBQUNkZWMgbWV0aG9kIHNpZ25hdHVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIGluQnVmZmVyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QqPihhZHRzSGVhZGVyICsgYWR0c0hlYWRlclNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGggPSBhYWNfZnJhbWVfbGVuZ3RoIC0gYWR0c0hlYWRlclNpemU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBhZHRzSGVhZGVyU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgLT0gYWR0c0hlYWRlclNpemU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChzaWduYWxFcnJvcikgeworICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgd29yay0+cmVzdWx0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dWKCJOb24gQURUUyIpOworICAgICAgICAgICAgLy8gY29uc3RfY2FzdCBiZWNhdXNlIG9mIGxpYkFBQ2RlYyBtZXRob2Qgc2lnbmF0dXJlLgorICAgICAgICAgICAgaW5CdWZmZXIgPSBjb25zdF9jYXN0PHVpbnQ4X3QqPih2aWV3LmRhdGEoKSArIG9mZnNldCk7CisgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCA9IHNpemU7CisgICAgICAgIH0KKworICAgICAgICBzaWduZWQgaW50IHByZXZTYW1wbGVSYXRlID0gbVNhbXBGcmVxOworICAgICAgICBzaWduZWQgaW50IHByZXZOdW1DaGFubmVscyA9IG1OdW1DaGFubmVsczsKKworICAgICAgICAvKiBYQUFDIGRlY29kZXIgZXhwZWN0cyBmaXJzdCBmcmFtZSB0byBiZSBmZWQgdmlhIGNvbmZpZ1hBQUNEZWNvZGVyIEFQSQorICAgICAgICAgKiB3aGljaCBzaG91bGQgaW5pdGlhbGl6ZSB0aGUgY29kZWMuIE9uY2UgdGhpcyBzdGF0ZSBpcyByZWFjaGVkLCBjYWxsIHRoZQorICAgICAgICAgKiBkZWNvZGVYQUFDU3RyZWFtIEFQSSB3aXRoIHNhbWUgZnJhbWUgdG8gZGVjb2RlISAqLworICAgICAgICBpZiAoIW1Jc0NvZGVjSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGNvbmZpZ1hBQUNEZWNvZGVyKGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgICAgICAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyX2NvZGUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiY29uZmlnWEFBQ0RlY29kZXIgRmFpbGVkIDIgZXJyX2NvZGUgPSAlZCIsIGVycl9jb2RlKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICgobVNhbXBGcmVxICE9IHByZXZTYW1wbGVSYXRlKSB8fAorICAgICAgICAgICAgICAgIChtTnVtQ2hhbm5lbHMgIT0gcHJldk51bUNoYW5uZWxzKSkgeworICAgICAgICAgICAgICAgIEFMT0dJKCJSZWNvbmZpZ3VyaW5nIGRlY29kZXI6ICVkLT4lZCBIeiwgJWQtPiVkIGNoYW5uZWxzIiwKKyAgICAgICAgICAgICAgICAgICAgICBwcmV2U2FtcGxlUmF0ZSwgbVNhbXBGcmVxLCBwcmV2TnVtQ2hhbm5lbHMsIG1OdW1DaGFubmVscyk7CisKKyAgICAgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQgc2FtcGxlUmF0ZUluZm8oMHUsIG1TYW1wRnJlcSk7CisgICAgICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygwdSwgbU51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgJnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mbyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgJmZhaWx1cmVzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weShzYW1wbGVSYXRlSW5mbykpOworICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW06OkNvcHkoY2hhbm5lbENvdW50SW5mbykpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDb25maWcgVXBkYXRlIGZhaWxlZCIpOworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzaWduZWQgaW50IGJ5dGVzQ29uc3VtZWQgPSAwOworICAgICAgICBJQV9FUlJPUkNPREUgZXJyb3JDb2RlID0gSUFfTk9fRVJST1I7CisgICAgICAgIGlmIChtSXNDb2RlY0luaXRpYWxpemVkKSB7CisgICAgICAgICAgICBtSXNDb2RlY0NvbmZpZ0ZsdXNoUmVxdWlyZWQgPSB0cnVlOworICAgICAgICAgICAgZXJyb3JDb2RlID0gZGVjb2RlWEFBQ1N0cmVhbShpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZieXRlc0NvbnN1bWVkLCAmbU51bU91dEJ5dGVzKTsKKyAgICAgICAgfSBlbHNlIGlmICghbUlzQ29kZWNDb25maWdGbHVzaFJlcXVpcmVkKSB7CisgICAgICAgICAgICBBTE9HVygiQXNzdW1wdGlvbiB0aGF0IGZpcnN0IGZyYW1lIGFmdGVyIGhlYWRlciBpbml0aWFsaXplcyBkZWNvZGVyIEZhaWxlZCEiKTsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICB3b3JrLT5yZXN1bHQgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc2l6ZSAtPSBieXRlc0NvbnN1bWVkOworICAgICAgICBvZmZzZXQgKz0gYnl0ZXNDb25zdW1lZDsKKworICAgICAgICBpZiAoaW5CdWZmZXJMZW5ndGggIT0gKHVpbnQzMl90KWJ5dGVzQ29uc3VtZWQpCisgICAgICAgICAgICBBTE9HVygiQWxsIGRhdGEgbm90IGNvbnN1bWVkIik7CisKKyAgICAgICAgLyogSW4gY2FzZSBvZiBlcnJvciwgZGVjb2RlciB3b3VsZCBoYXZlIGdpdmVuIG91dCBlbXB0eSBidWZmZXIgKi8KKyAgICAgICAgaWYgKChJQV9OT19FUlJPUiAhPSBlcnJvckNvZGUpICYmICgwID09IG1OdW1PdXRCeXRlcykgJiYgbUlzQ29kZWNJbml0aWFsaXplZCkKKyAgICAgICAgICAgIG1OdW1PdXRCeXRlcyA9IG1PdXRwdXRGcmFtZUxlbmd0aCAqIChtUGNtV2RTeiAvIDgpICogbU51bUNoYW5uZWxzOworCisgICAgICAgIGlmICghYnl0ZXNDb25zdW1lZCkgeworICAgICAgICAgICAgQUxPR1coImJ5dGVzQ29uc3VtZWQgPSAwIHNob3VsZCBuZXZlciBoYXBwZW4iKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgodWludDMyX3QpbU51bU91dEJ5dGVzID4KKyAgICAgICAgICAgIG1PdXRwdXRGcmFtZUxlbmd0aCAqIHNpemVvZihpbnQxNl90KSAqIG1OdW1DaGFubmVscykgeworICAgICAgICAgICAgQUxPR0UoIm1OdW1PdXRCeXRlcyA+IG1PdXRwdXRGcmFtZUxlbmd0aCAqIHNpemVvZihpbnQxNl90KSAqIG1OdW1DaGFubmVscywgc2hvdWxkIG5ldmVyIGhhcHBlbiIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHdvcmstPnJlc3VsdCA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJvckNvZGUpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIGZvciBvdmVyZmxvdywgQVNBTgorICAgICAgICAgICAgbWVtc2V0KG1PdXRwdXRCdWZmZXIsIDAsIG1OdW1PdXRCeXRlcyk7CisKKyAgICAgICAgICAgIC8vIERpc2NhcmQgaW5wdXQgYnVmZmVyLgorICAgICAgICAgICAgc2l6ZSA9IDA7CisKKyAgICAgICAgICAgIC8vIGZhbGwgdGhyb3VnaAorICAgICAgICB9CisgICAgICAgIG1lbWNweSh0ZW1wT3V0cHV0RHJhaW5CdWZmZXIsIG1PdXRwdXRCdWZmZXIsIG1OdW1PdXRCeXRlcyk7CisgICAgICAgIHRlbXBPdXRwdXREcmFpbkJ1ZmZlciArPSBtTnVtT3V0Qnl0ZXM7CisgICAgICAgIG1PdXRwdXREcmFpbkJ1ZmZlcldyaXRlUG9zICs9IG1OdW1PdXRCeXRlczsKKyAgICB9CisKKyAgICBpZiAobU91dHB1dERyYWluQnVmZmVyV3JpdGVQb3MpIHsKKyAgICAgICAgZmluaXNoV29yayh3b3JrLCBwb29sKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmaWxsRW1wdHlXb3JrKHdvcmspOworICAgIH0KKyAgICBpZiAoZW9zKSBtU2lnbmFsbGVkT3V0cHV0RW9zID0gdHJ1ZTsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0WGFhY0RlYzo6ZHJhaW4odWludDMyX3QgZHJhaW5Nb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgcG9vbCkgeworICAgICh2b2lkKXBvb2w7CisgICAgaWYgKGRyYWluTW9kZSA9PSBOT19EUkFJTikgeworICAgICAgICBBTE9HVygiZHJhaW4gd2l0aCBOT19EUkFJTjogbm8tb3AiKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBpZiAoZHJhaW5Nb2RlID09IERSQUlOX0NIQUlOKSB7CisgICAgICAgIEFMT0dXKCJEUkFJTl9DSEFJTiBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHJldHVybiBDMl9PSzsKK30KKworSUFfRVJST1JDT0RFIEMyU29mdFhhYWNEZWM6OmNvbmZpZ2ZsdXNoRGVjb2RlKCkgeworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZTsKKyAgICB1aW50MzJfdCB1aV9pbml0X2RvbmU7CisgICAgdWludDMyX3QgaW5CdWZmZXJMZW5ndGggPSA4MjAzOworCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9GTFVTSF9NRU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9GTFVTSF9NRU0iKTsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5CdWZmZXJMZW5ndGgpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUyIpOworCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9GTFVTSF9NRU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9GTFVTSF9NRU0iKTsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfSU5JVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9ET05FX1FVRVJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfaW5pdF9kb25lKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfSU5JVF9ET05FX1FVRVJZIik7CisKKyAgICBpZiAodWlfaW5pdF9kb25lKSB7CisgICAgICAgIGVycl9jb2RlID0gZ2V0WEFBQ1N0cmVhbUluZm8oKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiZ2V0WEFBQ1N0cmVhbUluZm8iKTsKKyAgICAgICAgQUxPR1YoIkZvdW5kIENvZGVjIHdpdGggYmVsb3cgY29uZmlnLS0tXG5zYW1wRnJlcSAlZFxubnVtQ2hhbm5lbHMgJWRcbnBjbVdkU3ogJWRcbmNoYW5uZWxNYXNrICVkXG5vdXRwdXRGcmFtZUxlbmd0aCAlZCIsCisgICAgICAgICAgICAgICBtU2FtcEZyZXEsIG1OdW1DaGFubmVscywgbVBjbVdkU3osIG1DaGFubmVsTWFzaywgbU91dHB1dEZyYW1lTGVuZ3RoKTsKKyAgICAgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KKworYzJfc3RhdHVzX3QgQzJTb2Z0WGFhY0RlYzo6b25GbHVzaF9zbSgpIHsKKyAgICBpZiAobUlzQ29kZWNJbml0aWFsaXplZCkgeworICAgICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBjb25maWdmbHVzaERlY29kZSgpOworICAgICAgICBpZiAoZXJyX2NvZGUgIT0gSUFfTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBjb25maWdmbHVzaERlY29kZTogRXJyb3IgJWQiLCBlcnJfY29kZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZHJhaW5EZWNvZGVyKCk7CisgICAgbVNpZ25hbGxlZE91dHB1dEVvcyA9IGZhbHNlOworICAgIG1TaWduYWxsZWRFcnJvciA9IGZhbHNlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6ZHJhaW5EZWNvZGVyKCkgeworICAgIC8qIE91dHB1dCBkZWxheSBjb21wZW5zYXRpb24gbG9naWMgc2hvdWxkIHNpdCBoZXJlLiAqLworICAgIC8qIE5vdGhpbmcgdG8gYmUgZG9uZSBhcyBYQUFDIGRlY29kZXIgZG9lcyBub3QgaW50cm9kdWNlIG91dHB1dCBidWZmZXIgZGVsYXkgKi8KKworICAgIHJldHVybiAwOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6aW5pdFhBQUNEZWNvZGVyKCkgeworICAgIC8qIEZpcnN0IHBhcnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiBFcnJvciBIYW5kbGVyIEluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogR2V0IExpYnJhcnkgTmFtZSwgTGlicmFyeSBWZXJzaW9uIGFuZCBBUEkgVmVyc2lvbiAqLworICAgIC8qIEluaXRpYWxpemUgQVBJIHN0cnVjdHVyZSArIERlZmF1bHQgY29uZmlnIHNldCAgICAgKi8KKyAgICAvKiBTZXQgY29uZmlnIHBhcmFtcyBmcm9tIHVzZXIgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogSW5pdGlhbGl6ZSBtZW1vcnkgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qIEdldCBtZW1vcnkgaW5mb3JtYXRpb24gYW5kIGFsbG9jYXRlIG1lbW9yeSAgICAgICAgKi8KKworICAgIG1JbnB1dEJ1ZmZlclNpemUgPSAwOworICAgIG1JbnB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgbU91dHB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgLyogUHJvY2VzcyBzdHJ1Y3QgaW5pdGluZyBlbmQgKi8KKworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBJbml0aWFsaXplIEFQSSBzdHJ1Y3R1cmUgYW5kIHNldCBjb25maWcgcGFyYW1zIHRvIGRlZmF1bHQgICAgICAgICovCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIEFQSSBzaXplICovCisgICAgdWludDMyX3QgcHVpX2FwaV9zaXplOworICAgIC8qIEdldCB0aGUgQVBJIHNpemUgKi8KKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9BUElfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHVpX2FwaV9zaXplKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUiKTsKKworICAgIC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgQVBJICovCisgICAgbVhoZWFhY0NvZGVjSGFuZGxlID0gbWVtYWxpZ24oNCwgcHVpX2FwaV9zaXplKTsKKyAgICBpZiAoIW1YaGVhYWNDb2RlY0hhbmRsZSkgeworICAgICAgICBBTE9HRSgibWFsbG9jIGZvciBwdWlfYXBpX3NpemUgKyA0ID4+ICVkIEZhaWxlZCIsIHB1aV9hcGlfc2l6ZSArIDQpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorICAgIG1NZW1vcnlWZWMucHVzaChtWGhlYWFjQ29kZWNIYW5kbGUpOworCisgICAgLyogU2V0IHRoZSBjb25maWcgcGFyYW1zIHRvIGRlZmF1bHQgdmFsdWVzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0FQSV9QUkVfQ09ORklHX1BBUkFNUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0lOSVRfQVBJX1BSRV9DT05GSUdfUEFSQU1TIik7CisKKyAgICAvKiBHZXQgdGhlIEFQSSBzaXplICovCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShudWxscHRyLCBJQV9BUElfQ01EX0dFVF9BUElfU0laRSwgMCwgJnB1aV9hcGlfc2l6ZSk7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9BUElfU0laRSIpOworCisgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBBUEkgKi8KKyAgICBtTXBlZ0REcmNIYW5kbGUgPSBtZW1hbGlnbig0LCBwdWlfYXBpX3NpemUpOworICAgIGlmICghbU1wZWdERHJjSGFuZGxlKSB7CisgICAgICAgIEFMT0dFKCJtYWxsb2MgZm9yIHB1aV9hcGlfc2l6ZSArIDQgPj4gJWQgRmFpbGVkIiwgcHVpX2FwaV9zaXplICsgNCk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbU1lbW9yeVZlYy5wdXNoKG1NcGVnRERyY0hhbmRsZSk7CisKKyAgICAvKiBTZXQgdGhlIGNvbmZpZyBwYXJhbXMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9BUElfUFJFX0NPTkZJR19QQVJBTVMsIG51bGxwdHIpOworCisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9BUElfUFJFX0NPTkZJR19QQVJBTVMiKTsKKworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBTZXQgY29uZmlnIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIHVpbnQzMl90IHVpX21wNF9mbGFnID0gMTsKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9JU01QNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX21wNF9mbGFnKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0lTTVA0Iik7CisKKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogSW5pdGlhbGl6ZSBNZW1vcnkgaW5mbyB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICB1aW50MzJfdCB1aV9wcm9jX21lbV90YWJzX3NpemU7CisgICAgcFZPSUQgcHZfYWxsb2NfcHRyOworICAgIC8qIEdldCBtZW1vcnkgaW5mbyB0YWJsZXMgc2l6ZSAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX01FTVRBQlNfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfR0VUX01FTVRBQlNfU0laRSIpOworCisgICAgcHZfYWxsb2NfcHRyID0gbWVtYWxpZ24oNCwgdWlfcHJvY19tZW1fdGFic19zaXplKTsKKyAgICBpZiAoIXB2X2FsbG9jX3B0cikgeworICAgICAgICBBTE9HRSgiTWFsbG9jIGZvciBzaXplICh1aV9wcm9jX21lbV90YWJzX3NpemUgKyA0KSA9ICVkIGZhaWxlZCEiLCB1aV9wcm9jX21lbV90YWJzX3NpemUgKyA0KTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKyAgICBtTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKKworICAgIC8qIFNldCBwb2ludGVyIGZvciBwcm9jZXNzIG1lbW9yeSB0YWJsZXMgICAgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZfYWxsb2NfcHRyKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9TRVRfTUVNVEFCU19QVFIiKTsKKworICAgIC8qIGluaXRpYWxpemUgdGhlIEFQSSwgcG9zdCBjb25maWcsIGZpbGwgbWVtb3J5IHRhYmxlcyAgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUyIpOworCisgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIEFsbG9jYXRlIE1lbW9yeSB3aXRoIGluZm8gZnJvbSBsaWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogVGhlcmUgYXJlIGZvdXIgZGlmZmVyZW50IHR5cGVzIG9mIG1lbW9yaWVzLCB0aGF0IG5lZWRzIHRvIGJlIGFsbG9jYXRlZCAqLworICAgIC8qIHBlcnNpc3RlbnQsc2NyYXRjaCxpbnB1dCBhbmQgb3V0cHV0ICovCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKKyAgICAgICAgaW50IHVpX3NpemUgPSAwLCB1aV9hbGlnbm1lbnQgPSAwLCB1aV90eXBlID0gMDsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IHNpemUgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX3NpemUpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSIpOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgYWxpZ25tZW50ICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2FsaWdubWVudCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQiKTsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IHR5cGUgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX3R5cGUpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSIpOworCisgICAgICAgIHB2X2FsbG9jX3B0ciA9IG1lbWFsaWduKHVpX2FsaWdubWVudCwgdWlfc2l6ZSk7CisgICAgICAgIGlmICghcHZfYWxsb2NfcHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiTWFsbG9jIGZvciBzaXplICh1aV9zaXplICsgdWlfYWxpZ25tZW50KSA9ICVkIGZhaWxlZCEiLAorICAgICAgICAgICAgICAgICAgIHVpX3NpemUgKyB1aV9hbGlnbm1lbnQpOworICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1NZW1vcnlWZWMucHVzaChwdl9hbGxvY19wdHIpOworCisgICAgICAgIC8qIFNldCB0aGUgYnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX01FTV9QVFIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZfYWxsb2NfcHRyKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKyAgICAgICAgaWYgKHVpX3R5cGUgPT0gSUFfTUVNVFlQRV9JTlBVVCkgeworICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gKHBXT1JEOClwdl9hbGxvY19wdHI7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXJTaXplID0gdWlfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodWlfdHlwZSA9PSBJQV9NRU1UWVBFX09VVFBVVCkKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXIgPSAocFdPUkQ4KXB2X2FsbG9jX3B0cjsKKyAgICB9CisgICAgLyogRW5kIGZpcnN0IHBhcnQgKi8KKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KKworc3RhdHVzX3QgQzJTb2Z0WGFhY0RlYzo6aW5pdFhBQUNEcmMoKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisgICAgdW5zaWduZWQgaW50IHVpX2RyY192YWw7CisgICAgLy8gIERSQ19QUkVTX01PREVfV1JBUF9ERVNJUkVEX1RBUkdFVAorICAgIGludDMyX3QgdGFyZ2V0UmVmTGV2ZWwgPSBtSW50Zi0+Z2V0RHJjVGFyZ2V0UmVmTGV2ZWwoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgZGVzaXJlZCBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBvZiAlZCIsIHRhcmdldFJlZkxldmVsKTsKKyAgICB1aV9kcmNfdmFsID0gKHVuc2lnbmVkIGludCl0YXJnZXRSZWZMZXZlbDsKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xFVkVMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfZHJjX3ZhbCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xFVkVMIik7CisKKyAgICAvKiBVc2UgdWlfZHJjX3ZhbCBmcm9tIFBST1BfRFJDX09WRVJSSURFX1JFRl9MRVZFTCBvciBEUkNfREVGQVVMVF9NT0JJTEVfUkVGX0xFVkVMCisgICAgICogZm9yIElBX0VOSEFBQ1BMVVNfREVDX0RSQ19UQVJHRVRfTE9VRE5FU1MgdG9vICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19EUkNfVEFSR0VUX0xPVURORVNTLCAmdWlfZHJjX3ZhbCk7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19EUkNfVEFSR0VUX0xPVURORVNTIik7CisKKyAgICBpbnQzMl90IGF0dGVudWF0aW9uRmFjdG9yID0gbUludGYtPmdldERyY0F0dGVudWF0aW9uRmFjdG9yKCk7CisgICAgQUxPR1YoIkFBQyBkZWNvZGVyIHVzaW5nIGRlc2lyZWQgRFJDIGF0dGVudWF0aW9uIGZhY3RvciBvZiAlZCIsIGF0dGVudWF0aW9uRmFjdG9yKTsKKyAgICB1aV9kcmNfdmFsID0gKHVuc2lnbmVkIGludClhdHRlbnVhdGlvbkZhY3RvcjsKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQ1VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfZHJjX3ZhbCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQ1VUIik7CisKKyAgICAvLyAgRFJDX1BSRVNfTU9ERV9XUkFQX0RFU0lSRURfQk9PU1RfRkFDVE9SCisgICAgaW50MzJfdCBib29zdEZhY3RvciA9IG1JbnRmLT5nZXREcmNCb29zdEZhY3RvcigpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNpcmVkIERSQyBib29zdCBmYWN0b3Igb2YgJWQiLCBib29zdEZhY3Rvcik7CisgICAgdWlfZHJjX3ZhbCA9ICh1bnNpZ25lZCBpbnQpYm9vc3RGYWN0b3I7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0JPT1NULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfZHJjX3ZhbCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQk9PU1QiKTsKKworICAgIC8vICBEUkNfUFJFU19NT0RFX1dSQVBfREVTSVJFRF9IRUFWWQorICAgIGludDMyX3QgY29tcHJlc3NNb2RlID0gbUludGYtPmdldERyY0NvbXByZXNzTW9kZSgpOworICAgIEFMT0dWKCJBQUMgZGVjb2RlciB1c2luZyBkZXNyaWVkIERSQyBoZWF2eSBjb21wcmVzc2lvbiBzd2l0Y2ggb2YgJWQiLCBjb21wcmVzc01vZGUpOworICAgIHVpX2RyY192YWwgPSAodW5zaWduZWQgaW50KWNvbXByZXNzTW9kZTsKKworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19IRUFWWV9DT01QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfZHJjX3ZhbCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfSEVBVllfQ09NUCIpOworCisgICAgLy8gQUFDX1VOSURSQ19TRVRfRUZGRUNUCisgICAgaW50MzJfdCBlZmZlY3RUeXBlID0gbUludGYtPmdldERyY0VmZmVjdFR5cGUoKTsKKyAgICBBTE9HVigiQUFDIGRlY29kZXIgdXNpbmcgTVBFRy1EIERSQyBlZmZlY3QgdHlwZSAlZCIsIGVmZmVjdFR5cGUpOworICAgIHVpX2RyY192YWwgPSAodW5zaWduZWQgaW50KWVmZmVjdFR5cGU7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19EUkNfRUZGRUNUX1RZUEUsICZ1aV9kcmNfdmFsKTsKKworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6ZGVJbml0WEFBQ0RlY29kZXIoKSB7CisgICAgQUxPR1YoImRlSW5pdFhBQUNEZWNvZGVyIik7CisKKyAgICAvKiBFcnJvciBjb2RlICovCisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisKKyAgICBpZiAobVhoZWFhY0NvZGVjSGFuZGxlKSB7CisgICAgICAgIC8qIFRlbGwgdGhhdCB0aGUgaW5wdXQgaXMgb3ZlciBpbiB0aGlzIGJ1ZmZlciAqLworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTlBVVF9PVkVSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIH0KKworICAgIC8qIElycmVzcGVjdGl2ZSBvZiBlcnJvciByZXR1cm5lZCBpbiBJQV9BUElfQ01EX0lOUFVUX09WRVIsIGZyZWUgYWxsb2NhdGVkIG1lbW9yeSAqLworICAgIGZvciAodm9pZCogYnVmIDogbU1lbW9yeVZlYykgeworICAgICAgICBpZiAoYnVmKSBmcmVlKGJ1Zik7CisgICAgfQorICAgIG1NZW1vcnlWZWMuY2xlYXIoKTsKKyAgICBtWGhlYWFjQ29kZWNIYW5kbGUgPSBudWxscHRyOworCisgICAgcmV0dXJuIGVycl9jb2RlOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6ZGVJbml0TVBFR0RERHJjKCkgeworICAgIEFMT0dWKCJkZUluaXRNUEVHREREcmMiKTsKKworICAgIGZvciAodm9pZCogYnVmIDogbURyY01lbW9yeVZlYykgeworICAgICAgICBpZiAoYnVmKSBmcmVlKGJ1Zik7CisgICAgfQorICAgIG1EcmNNZW1vcnlWZWMuY2xlYXIoKTsKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjpjb25maWdYQUFDRGVjb2Rlcih1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgpIHsKKyAgICBpZiAobUlucHV0QnVmZmVyU2l6ZSA8IGluQnVmZmVyTGVuZ3RoKSB7CisgICAgICAgIEFMT0dFKCJDYW5ub3QgY29uZmlnIEFBQywgaW5wdXQgYnVmZmVyIHNpemUgJWQgPCBpbkJ1ZmZlckxlbmd0aCAlZCIsIG1JbnB1dEJ1ZmZlclNpemUsIGluQnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvKiBDb3B5IHRoZSBidWZmZXIgcGFzc2VkIGJ5IEFuZHJvaWQgcGx1Z2luIHRvIGNvZGVjIGlucHV0IGJ1ZmZlciAqLworICAgIG1lbWNweShtSW5wdXRCdWZmZXIsIGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCk7CisKKyAgICAvKiBTZXQgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHByb2Nlc3NlZCAqLworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmluQnVmZmVyTGVuZ3RoKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVMiKTsKKworICAgIGlmIChtSXNDb2RlY0NvbmZpZ0ZsdXNoUmVxdWlyZWQpIHsKKyAgICAgICAgLyogSWYgY29kZWMgaXMgYWxyZWFkeSBpbml0aWFsaXplZCwgdGhlbiBHQSBoZWFkZXIgaXMgcGFzc2VkIGFnYWluICovCisgICAgICAgIC8qIE5lZWQgdG8gY2FsbCB0aGUgRmx1c2ggQVBJIGluc3RlYWQgb2YgSU5JVF9QUk9DRVNTICovCisgICAgICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSBmYWxzZTsgLyogQ29kZWMgbmVlZHMgdG8gYmUgUmVpbml0aWFsaXplZCBhZnRlciBmbHVzaCAqLworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfR0FfSERSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9HQV9IRFIiKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBwcm9jZXNzICovCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX1BST0NFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0NNRF9UWVBFX0lOSVRfUFJPQ0VTUyIpOworICAgIH0KKworICAgIHVpbnQzMl90IHVpX2luaXRfZG9uZTsKKyAgICAvKiBDaGVja2luZyBmb3IgZW5kIG9mIGluaXRpYWxpemF0aW9uICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0RPTkVfUVVFUlksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9pbml0X2RvbmUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9JTklUX0RPTkVfUVVFUlkiKTsKKworICAgIC8qIEhvdyBtdWNoIGJ1ZmZlciBpcyB1c2VkIGluIGlucHV0IGJ1ZmZlcnMgKi8KKyAgICBpbnQzMl90IGlfYnl0ZXNfY29uc3VtZWQ7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ1VSSURYX0lOUFVUX0JVRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlfYnl0ZXNfY29uc3VtZWQpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9BUElfQ01EX0dFVF9DVVJJRFhfSU5QVVRfQlVGIik7CisKKyAgICBpZiAodWlfaW5pdF9kb25lKSB7CisgICAgICAgIGVycl9jb2RlID0gZ2V0WEFBQ1N0cmVhbUluZm8oKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiZ2V0WEFBQ1N0cmVhbUluZm8iKTsKKyAgICAgICAgQUxPR0koIkZvdW5kIENvZGVjIHdpdGggYmVsb3cgY29uZmlnLS0tXG5zYW1wRnJlcSAlZFxubnVtQ2hhbm5lbHMgJWRcbnBjbVdkU3ogJWRcbmNoYW5uZWxNYXNrICVkXG5vdXRwdXRGcmFtZUxlbmd0aCAlZCIsCisgICAgICAgICAgICAgICBtU2FtcEZyZXEsIG1OdW1DaGFubmVscywgbVBjbVdkU3osIG1DaGFubmVsTWFzaywgbU91dHB1dEZyYW1lTGVuZ3RoKTsKKyAgICAgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IHRydWU7CisKKyAgICAgICAgZXJyX2NvZGUgPSBjb25maWdNUEVHRERyYygpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJjb25maWdNUEVHRERyYyIpOworICAgIH0KKworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjppbml0TVBFR0RERHJjKCkgeworICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoV09SRDMyKTI7IGkrKykgeworICAgICAgICBXT1JEMzIgdWlfc2l6ZSwgdWlfYWxpZ25tZW50LCB1aV90eXBlOworICAgICAgICBwVk9JRCBwdl9hbGxvY19wdHI7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSBzaXplICovCisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19TSVpFLCBpLCAmdWlfc2l6ZSk7CisKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSIpOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgYWxpZ25tZW50ICovCisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5ULCBpLCAmdWlfYWxpZ25tZW50KTsKKworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQiKTsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IHR5cGUgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUsIGksICZ1aV90eXBlKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSIpOworCisgICAgICAgIHB2X2FsbG9jX3B0ciA9IG1lbWFsaWduKDQsIHVpX3NpemUpOworICAgICAgICBpZiAocHZfYWxsb2NfcHRyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1EcmNNZW1vcnlWZWMucHVzaChwdl9hbGxvY19wdHIpOworCisgICAgICAgIC8qIFNldCB0aGUgYnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIGksIHB2X2FsbG9jX3B0cik7CisKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOworICAgIH0KKworICAgIFdPUkQzMiB1aV9zaXplOworICAgIHVpX3NpemUgPSA4MTkyICogMjsKKworICAgIG1EcmNJbkJ1ZiA9IChpbnQ4X3QqKW1lbWFsaWduKDQsIHVpX3NpemUpOworICAgIGlmIChtRHJjSW5CdWYgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKyAgICBtRHJjTWVtb3J5VmVjLnB1c2gobURyY0luQnVmKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCAyLCBtRHJjSW5CdWYpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKworICAgIG1EcmNPdXRCdWYgPSAoaW50OF90KiltZW1hbGlnbig0LCB1aV9zaXplKTsKKyAgICBpZiAobURyY091dEJ1ZiA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorICAgIG1EcmNNZW1vcnlWZWMucHVzaChtRHJjT3V0QnVmKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCAzLCBtRHJjT3V0QnVmKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CitpbnQgQzJTb2Z0WGFhY0RlYzo6Y29uZmlnTVBFR0REcmMoKSB7CisgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gSUFfTk9fRVJST1I7CisgICAgaW50IGlfZWZmZWN0X3R5cGU7CisgICAgaW50IGlfbG91ZF9ub3JtOworICAgIGludCBpX3RhcmdldF9sb3VkbmVzczsKKyAgICB1bnNpZ25lZCBpbnQgaV9zYnJfbW9kZTsKKyAgICB1aW50MzJfdCB1aV9wcm9jX21lbV90YWJzX3NpemUgPSAwOworICAgIHBWT0lEIHB2X2FsbG9jX3B0ciA9IE5VTEw7CisKKyAgICAvKiBTYW1wbGluZyBGcmVxdWVuY3kgKi8KKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fU0FNUF9GUkVRLCAmbVNhbXBGcmVxKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9TQU1QX0ZSRVEiKTsKKyAgICAvKiBUb3RhbCBOdW1iZXIgb2YgQ2hhbm5lbHMgKi8KKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fTlVNX0NIQU5ORUxTLCAmbU51bUNoYW5uZWxzKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMiKTsKKworICAgIC8qIFBDTSB3b3JkIHNpemUgICovCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX1BDTV9XRFNaLCAmbVBjbVdkU3opOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX1BDTV9XRFNaIik7CisKKyAgICAvKlNldCBFZmZlY3QgVHlwZSovCisKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfRUZGRUNUX1RZUEUsICZpX2VmZmVjdF90eXBlKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VGRkVDVF9UWVBFIik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfRFJDX0VGRkVDVF9UWVBFLCAmaV9lZmZlY3RfdHlwZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfRFJDX0VGRkVDVF9UWVBFIik7CisKKyAgICAvKlNldCB0YXJnZXQgbG91ZG5lc3MgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xPVURORVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaV90YXJnZXRfbG91ZG5lc3MpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xPVURORVNTIik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfRFJDX1RBUkdFVF9MT1VETkVTUywgJmlfdGFyZ2V0X2xvdWRuZXNzKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19EUkNfVEFSR0VUX0xPVURORVNTIik7CisKKyAgICAvKlNldCBsb3VkX25vcm1fZmxhZyovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0xPVURfTk9STSwgJmlfbG91ZF9ub3JtKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0xPVURfTk9STSIpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0RSQ19MT1VEX05PUk0sICZpX2xvdWRfbm9ybSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfRFJDX0xPVURfTk9STSIpOworCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fU0JSX01PREUsICZpX3Nicl9tb2RlKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fU0JSX01PREUiKTsKKworICAgIC8qIEdldCBtZW1vcnkgaW5mbyB0YWJsZXMgc2l6ZSAqLworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1UQUJTX1NJWkUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfcHJvY19tZW1fdGFic19zaXplKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1UQUJTX1NJWkUiKTsKKworICAgIHB2X2FsbG9jX3B0ciA9IG1lbWFsaWduKDQsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisgICAgaWYgKHB2X2FsbG9jX3B0ciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisgICAgbWVtc2V0KHB2X2FsbG9jX3B0ciwgMCwgdWlfcHJvY19tZW1fdGFic19zaXplKTsKKyAgICBtTWVtb3J5VmVjLnB1c2gocHZfYWxsb2NfcHRyKTsKKworICAgIC8qIFNldCBwb2ludGVyIGZvciBwcm9jZXNzIG1lbW9yeSB0YWJsZXMgKi8KKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNVEFCU19QVFIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdl9hbGxvY19wdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSIik7CisKKyAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9BUElfUE9TVF9DT05GSUdfUEFSQU1TLCBudWxscHRyKTsKKworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfQVBJX1BPU1RfQ09ORklHX1BBUkFNUyIpOworCisgICAgLyogRnJlZSBhbnkgbWVtb3J5IHRoYXQgaXMgYWxsb2NhdGVkIGZvciBNUEVHIEQgRHJjIHNvIGZhciAqLworICAgIGRlSW5pdE1QRUdERERyYygpOworCisgICAgZXJyX2NvZGUgPSBpbml0TVBFR0RERHJjKCk7CisgICAgaWYgKGVycl9jb2RlICE9IElBX05PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJpbml0TVBFR0RERHJjIGZhaWxlZCB3aXRoIGVycm9yICVkIiwgZXJyX2NvZGUpOworICAgICAgICBkZUluaXRNUEVHREREcmMoKTsKKyAgICAgICAgcmV0dXJuIGVycl9jb2RlOworICAgIH0KKworICAgIC8qIERSQyBidWZmZXJzCisgICAgICAgIGJ1ZlswXSAtIGNvbnRhaW5zIGV4dGVuc2lvbiBlbGVtZW50IHBheSBsb2FkIGxvdWRuZXNzIHJlbGF0ZWQKKyAgICAgICAgYnVmWzFdIC0gY29udGFpbnMgZXh0ZW5zaW9uIGVsZW1lbnQgcGF5IGxvYWQqLworICAgIHsKKyAgICAgICAgVk9JRCogcF9hcnJheVsyXVsxNl07CisgICAgICAgIFdPUkQzMiBpaTsKKyAgICAgICAgV09SRDMyIGJ1Zl9zaXplc1syXVsxNl07CisgICAgICAgIFdPUkQzMiBudW1fZWxlbWVudHM7CisgICAgICAgIFdPUkQzMiBudW1fY29uZmlnX2V4dDsKKyAgICAgICAgV09SRDMyIGJpdF9zdHJfZm10ID0gMTsKKworICAgICAgICBXT1JEMzIgdW9fbnVtX2NoYW47CisKKyAgICAgICAgbWVtc2V0KGJ1Zl9zaXplcywgMCwgMzIgKiBzaXplb2YoV09SRDMyKSk7CisKKyAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0VYVF9FTEVfQlVGX1NJWkVTLCAmYnVmX3NpemVzWzBdWzBdKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0VYVF9FTEVfQlVGX1NJWkVTIik7CisKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0VYVF9FTEVfUFRSLCAmcF9hcnJheSk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19FWFRfRUxFX1BUUiIpOworCisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULCBJQV9DTURfVFlQRV9JTklUX1NFVF9CVUZGX1BUUiwgbnVsbHB0cik7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0NNRF9UWVBFX0lOSVRfU0VUX0JVRkZfUFRSIik7CisKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX05VTV9FTEUsICZudW1fZWxlbWVudHMpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfTlVNX0VMRSIpOworCisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19OVU1fQ09ORklHX0VYVCwgJm51bV9jb25maWdfZXh0KTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX05VTV9DT05GSUdfRVhUIik7CisKKyAgICAgICAgZm9yIChpaSA9IDA7IGlpIDwgbnVtX2NvbmZpZ19leHQ7IGlpKyspIHsKKyAgICAgICAgICAgIC8qY29weSBsb3VkbmVzcyBiaXRzdHJlYW0qLworICAgICAgICAgICAgaWYgKGJ1Zl9zaXplc1swXVtpaV0gPiAwKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KG1EcmNJbkJ1ZiwgcF9hcnJheVswXVtpaV0sIGJ1Zl9zaXplc1swXVtpaV0pOworCisgICAgICAgICAgICAgICAgLypTZXQgYml0c3RyZWFtX3NwbGl0X2Zvcm1hdCAqLworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCwgJmJpdF9zdHJfZm10KTsKKyAgICAgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCIpOworCisgICAgICAgICAgICAgICAgLyogU2V0IG51bWJlciBvZiBieXRlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVNfSUxfQlMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmX3NpemVzWzBdW2lpXSk7CisgICAgICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVNfSUxfQlMiKTsKKworICAgICAgICAgICAgICAgIC8qIEV4ZWN1dGUgcHJvY2VzcyAqLworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0NQWV9JTF9CU0ZfQlVGRiwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9DUFlfSUxfQlNGX0JVRkYiKTsKKworICAgICAgICAgICAgICAgIG1EUkNGbGFnID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSAwOyBpaSA8IG51bV9lbGVtZW50czsgaWkrKykgeworICAgICAgICAgICAgLypjb3B5IGNvbmZpZyBiaXRzdHJlYW0qLworICAgICAgICAgICAgaWYgKGJ1Zl9zaXplc1sxXVtpaV0gPiAwKSB7CisgICAgICAgICAgICAgICAgbWVtY3B5KG1EcmNJbkJ1ZiwgcF9hcnJheVsxXVtpaV0sIGJ1Zl9zaXplc1sxXVtpaV0pOworICAgICAgICAgICAgICAgIC8qIFNldCBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcHJvY2Vzc2VkICovCisKKyAgICAgICAgICAgICAgICAvKlNldCBiaXRzdHJlYW1fc3BsaXRfZm9ybWF0ICovCisgICAgICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFULCAmYml0X3N0cl9mbXQpOworICAgICAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFUIik7CisKKyAgICAgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVNfSUNfQlMsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmX3NpemVzWzFdW2lpXSk7CisgICAgICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfSU5QVVRfQllURVNfSUNfQlMiKTsKKworICAgICAgICAgICAgICAgIC8qIEV4ZWN1dGUgcHJvY2VzcyAqLworICAgICAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0lOSVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0NQWV9JQ19CU0ZfQlVGRiwgbnVsbHB0cik7CisKKyAgICAgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9DTURfVFlQRV9JTklUX0NQWV9JQ19CU0ZfQlVGRiIpOworCisgICAgICAgICAgICAgICAgbURSQ0ZsYWcgPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1EUkNGbGFnID09IDEpIHsKKyAgICAgICAgICAgIG1NcGVnRERSQ1ByZXNlbnQgPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbU1wZWdERFJDUHJlc2VudCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvKlJlYWQgaW50ZXJmYWNlIGJ1ZmZlciBjb25maWcgZmlsZSBiaXRzdHJlYW0qLworICAgICAgICBpZiAobU1wZWdERFJDUHJlc2VudCA9PSAxKSB7CisgICAgICAgICAgICBXT1JEMzIgaW50ZXJmYWNlX2lzX3ByZXNlbnQgPSAxOworCisgICAgICAgICAgICBpZiAoaV9zYnJfbW9kZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGlfc2JyX21vZGUgPT0gMSkgeworICAgICAgICAgICAgICAgICAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSAyMDQ4OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaV9zYnJfbW9kZSA9PSAzKSB7CisgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRGcmFtZUxlbmd0aCA9IDQwOTY7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbU91dHB1dEZyYW1lTGVuZ3RoID0gMTAyNDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1PdXRwdXRGcmFtZUxlbmd0aCA9IDQwOTY7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0ZSQU1FX1NJWkUsIChXT1JEMzIgKikmbU91dHB1dEZyYW1lTGVuZ3RoKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0ZSQU1FX1NJWkUiKTsKKworICAgICAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0lOVF9QUkVTRU5ULCAmaW50ZXJmYWNlX2lzX3ByZXNlbnQpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fSU5UX1BSRVNFTlQiKTsKKworICAgICAgICAgICAgLyogRXhlY3V0ZSBwcm9jZXNzICovCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0NQWV9JTl9CU0ZfQlVGRiwgbnVsbHB0cik7CisgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9DTURfVFlQRV9JTklUX0NQWV9JTl9CU0ZfQlVGRiIpOworCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX1BST0NFU1MsIG51bGxwdHIpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfSU5JVF9QUk9DRVNTIik7CisKKyAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUywgJnVvX251bV9jaGFuKTsKKyAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUyIpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGVycl9jb2RlOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6ZGVjb2RlWEFBQ1N0cmVhbSh1aW50OF90KiBpbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnl0ZXNDb25zdW1lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIG91dEJ5dGVzKSB7CisgICAgaWYgKG1JbnB1dEJ1ZmZlclNpemUgPCBpbkJ1ZmZlckxlbmd0aCkgeworICAgICAgICBBTE9HRSgiQ2Fubm90IGNvbmZpZyBBQUMsIGlucHV0IGJ1ZmZlciBzaXplICVkIDwgaW5CdWZmZXJMZW5ndGggJWQiLCBtSW5wdXRCdWZmZXJTaXplLCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLyogQ29weSB0aGUgYnVmZmVyIHBhc3NlZCBieSBBbmRyb2lkIHBsdWdpbiB0byBjb2RlYyBpbnB1dCBidWZmZXIgKi8KKyAgICBtZW1jcHkobUlucHV0QnVmZmVyLCBpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOworCisgICAgLyogU2V0IG51bWJlciBvZiBieXRlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbkJ1ZmZlckxlbmd0aCk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTIik7CisKKyAgICAvKiBFeGVjdXRlIHByb2Nlc3MgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0VYRUNVVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0NNRF9UWVBFX0RPX0VYRUNVVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9DTURfVFlQRV9ET19FWEVDVVRFIik7CisKKyAgICAvKiBDaGVja2luZyBmb3IgZW5kIG9mIHByb2Nlc3NpbmcgKi8KKyAgICB1aW50MzJfdCB1aV9leGVjX2RvbmU7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9FWEVDVVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9ET05FX1FVRVJZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdWlfZXhlY19kb25lKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQ01EX1RZUEVfRE9ORV9RVUVSWSIpOworCisgICAgaWYgKHVpX2V4ZWNfZG9uZSAhPSAxKSB7CisgICAgICAgIFZPSUQqIHBfYXJyYXk7ICAgICAgICAvLyBJVFRJQU06YnVmZmVyIHRvIGhhbmRsZSBnYWluIHBheWxvYWQKKyAgICAgICAgV09SRDMyIGJ1Zl9zaXplID0gMDsgIC8vIElUVElBTTpnYWluIHBheWxvYWQgbGVuZ3RoCisgICAgICAgIFdPUkQzMiBiaXRfc3RyX2ZtdCA9IDE7CisgICAgICAgIFdPUkQzMiBnYWluX3N0cmVhbV9mbGFnID0gMTsKKworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfR0FJTl9QQVlMT0FEX0xFTiwgJmJ1Zl9zaXplKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX0dBSU5fUEFZTE9BRF9MRU4iKTsKKworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfR0FJTl9QQVlMT0FEX0JVRiwgJnBfYXJyYXkpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfR0FJTl9QQVlMT0FEX0JVRiIpOworCisgICAgICAgIGlmIChidWZfc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIC8qU2V0IGJpdHN0cmVhbV9zcGxpdF9mb3JtYXQgKi8KKyAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX1BBUkFNX0JJVFNfRk9STUFULCAmYml0X3N0cl9mbXQpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQiKTsKKworICAgICAgICAgICAgbWVtY3B5KG1EcmNJbkJ1ZiwgcF9hcnJheSwgYnVmX3NpemUpOworICAgICAgICAgICAgLyogU2V0IG51bWJlciBvZiBieXRlcyB0byBiZSBwcm9jZXNzZWQgKi8KKyAgICAgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgICAgICBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0lOUFVUX0JZVEVTX0JTLCAwLCAmYnVmX3NpemUpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQiKTsKKworICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRFJDX0RFQ19DT05GSUdfR0FJTl9TVFJFQU1fRkxBRywgJmdhaW5fc3RyZWFtX2ZsYWcpOworICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRFJDX0RFQ19DT05GSUdfUEFSQU1fQklUU19GT1JNQVQiKTsKKworICAgICAgICAgICAgLyogRXhlY3V0ZSBwcm9jZXNzICovCisgICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9DTURfVFlQRV9JTklUX0NQWV9CU0ZfQlVGRiwgbnVsbHB0cik7CisgICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19QQVJBTV9CSVRTX0ZPUk1BVCIpOworCisgICAgICAgICAgICBtTXBlZ0REUkNQcmVzZW50ID0gMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEhvdyBtdWNoIGJ1ZmZlciBpcyB1c2VkIGluIGlucHV0IGJ1ZmZlcnMgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DVVJJRFhfSU5QVVRfQlVGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlc0NvbnN1bWVkKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfQ1VSSURYX0lOUFVUX0JVRiIpOworCisgICAgLyogR2V0IHRoZSBvdXRwdXQgYnl0ZXMgKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9PVVRQVVRfQllURVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ5dGVzKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICAiSUFfQVBJX0NNRF9HRVRfT1VUUFVUX0JZVEVTIik7CisKKyAgICBpZiAobU1wZWdERFJDUHJlc2VudCA9PSAxKSB7CisgICAgICAgIG1lbWNweShtRHJjSW5CdWYsIG1PdXRwdXRCdWZmZXIsICpvdXRCeXRlcyk7CisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUywgMCwgb3V0Qnl0ZXMpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9JTlBVVF9CWVRFUyIpOworCisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9FWEVDVVRFLCBJQV9DTURfVFlQRV9ET19FWEVDVVRFLCBudWxscHRyKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQ01EX1RZUEVfRE9fRVhFQ1VURSIpOworCisgICAgICAgIG1lbWNweShtT3V0cHV0QnVmZmVyLCBtRHJjT3V0QnVmLCAqb3V0Qnl0ZXMpOworICAgIH0KKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKK0lBX0VSUk9SQ09ERSBDMlNvZnRYYWFjRGVjOjpnZXRYQUFDU3RyZWFtSW5mbygpIHsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKworICAgIC8qIFNhbXBsaW5nIGZyZXF1ZW5jeSAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NBTVBfRlJFUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1TYW1wRnJlcSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9TQU1QX0ZSRVEiKTsKKworICAgIC8qIFRvdGFsIE51bWJlciBvZiBDaGFubmVscyAqLworICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1OdW1DaGFubmVscyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9OVU1fQ0hBTk5FTFMiKTsKKyAgICBpZiAobU51bUNoYW5uZWxzID4gTUFYX0NIQU5ORUxfQ09VTlQpIHsKKyAgICAgICAgQUxPR0UoIiBObyBvZiBjaGFubmVscyBhcmUgbW9yZSB0aGFuIG1heCBjaGFubmVsc1xuIik7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CisKKyAgICAvKiBQQ00gd29yZCBzaXplICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fUENNX1dEU1osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtUGNtV2RTeik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9QQ01fV0RTWiIpOworICAgIGlmICgobVBjbVdkU3ogLyA4KSAhPSAyKSB7CisgICAgICAgIEFMT0dFKCIgTm8gb2YgY2hhbm5lbHMgYXJlIG1vcmUgdGhhbiBtYXggY2hhbm5lbHNcbiIpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorCisgICAgLyogY2hhbm5lbCBtYXNrIHRvIHRlbGwgdGhlIGFycmFuZ2VtZW50IG9mIGNoYW5uZWxzIGluIGJpdCBzdHJlYW0gKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtQ2hhbm5lbE1hc2spOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fQ0hBTk5FTF9NQVNLIik7CisKKyAgICAvKiBDaGFubmVsIG1vZGUgdG8gdGVsbCBNT05PL1NURVJFTy9EVUFMLU1PTk8vTk9ORV9PRl9USEVTRSAqLworICAgIHVpbnQzMl90IHVpX2NoYW5uZWxfbW9kZTsKKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9DSEFOTkVMX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9jaGFubmVsX21vZGUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fQ0hBTk5FTF9NT0RFIik7CisgICAgaWYgKHVpX2NoYW5uZWxfbW9kZSA9PSAwKQorICAgICAgICBBTE9HVigiQ2hhbm5lbCBNb2RlOiBNT05PX09SX1BTXG4iKTsKKyAgICBlbHNlIGlmICh1aV9jaGFubmVsX21vZGUgPT0gMSkKKyAgICAgICAgQUxPR1YoIkNoYW5uZWwgTW9kZTogU1RFUkVPXG4iKTsKKyAgICBlbHNlIGlmICh1aV9jaGFubmVsX21vZGUgPT0gMikKKyAgICAgICAgQUxPR1YoIkNoYW5uZWwgTW9kZTogRFVBTC1NT05PXG4iKTsKKyAgICBlbHNlCisgICAgICAgIEFMT0dWKCJDaGFubmVsIE1vZGU6IE5PTkVfT0ZfVEhFU0Ugb3IgTVVMVElDSEFOTkVMXG4iKTsKKworICAgIC8qIENoYW5uZWwgbW9kZSB0byB0ZWxsIFNCUiBQUkVTRU5UL05PVF9QUkVTRU5UICovCisgICAgdWludDMyX3QgdWlfc2JyX21vZGU7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fU0JSX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9zYnJfbW9kZSk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9TQlJfTU9ERSIpOworICAgIGlmICh1aV9zYnJfbW9kZSA9PSAwKQorICAgICAgICBBTE9HVigiU0JSIE1vZGU6IE5PVF9QUkVTRU5UXG4iKTsKKyAgICBlbHNlIGlmICh1aV9zYnJfbW9kZSA9PSAxKQorICAgICAgICBBTE9HVigiU0JSIE1vZGU6IFBSRVNFTlRcbiIpOworICAgIGVsc2UKKyAgICAgICAgQUxPR1YoIlNCUiBNb2RlOiBJTExFR0FMXG4iKTsKKworICAgIC8qIG1PdXRwdXRGcmFtZUxlbmd0aCA9IDEwMjQgKiAoMSArIFNCUl9NT0RFKSBmb3IgQUFDICovCisgICAgLyogRm9yIFVTQUMgaXQgY291bGQgYmUgMTAyNCAqIDMgLCBzdXBwb3J0IHRvIHF1ZXJ5ICAqLworICAgIC8qIG5vdCB5ZXQgYWRkZWQgaW4gY29kZWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBtT3V0cHV0RnJhbWVMZW5ndGggPSAxMDI0ICogKDEgKyB1aV9zYnJfbW9kZSk7CisgICAgQUxPR0koIm1PdXRwdXRGcmFtZUxlbmd0aCAlZCB1aV9zYnJfbW9kZSAlZCIsIG1PdXRwdXRGcmFtZUxlbmd0aCwgdWlfc2JyX21vZGUpOworCisgICAgcmV0dXJuIElBX05PX0VSUk9SOworfQorCitJQV9FUlJPUkNPREUgQzJTb2Z0WGFhY0RlYzo6c2V0WEFBQ0RSQ0luZm8oaW50MzJfdCBkcmNDdXQsIGludDMyX3QgZHJjQm9vc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkcmNSZWZMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRyY0hlYXZ5Q29tcHJlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkckVmZmVjdFR5cGUpIHsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKworICAgIGludDMyX3QgdWlfZHJjX2VuYWJsZSA9IDE7CisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VOQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2RyY19lbmFibGUpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfRU5BQkxFIik7CisgICAgaWYgKGRyY0N1dCAhPSAtMSkgeworICAgICAgICBlcnJfY29kZSA9CisgICAgICAgICAgICBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0NVVCwgJmRyY0N1dCk7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfQ1VUIik7CisgICAgfQorCisgICAgaWYgKGRyY0Jvb3N0ICE9IC0xKSB7CisgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaSgKKyAgICAgICAgICAgIG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19CT09TVCwgJmRyY0Jvb3N0KTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19CT09TVCIpOworICAgIH0KKworICAgIGlmIChkcmNSZWZMZXZlbCAhPSAtMSkgeworICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkoCisgICAgICAgICAgICBtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfVEFSR0VUX0xFVkVMLCAmZHJjUmVmTGV2ZWwpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19UQVJHRVRfTEVWRUwiKTsKKyAgICB9CisKKyAgICBpZiAoZHJjUmVmTGV2ZWwgIT0gLTEpIHsKKyAgICAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKAorICAgICAgICAgICAgbVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19EUkNfVEFSR0VUX0xPVURORVNTLCAmZHJjUmVmTGV2ZWwpOworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19EUkNfVEFSR0VUX0xPVURORVNTIik7CisgICAgfQorCisgICAgaWYgKGRyY0hlYXZ5Q29tcHJlc3Npb24gIT0gLTEpIHsKKyAgICAgICAgZXJyX2NvZGUgPQorICAgICAgICAgICAgaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19IRUFWWV9DT01QLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHJjSGVhdnlDb21wcmVzc2lvbik7CisgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0hFQVZZX0NPTVAiKTsKKyAgICB9CisKKyAgICBlcnJfY29kZSA9CisgICAgICAgIGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfRFJDX0VGRkVDVF9UWVBFLCAmZHJFZmZlY3RUeXBlKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19EUkNfRUZGRUNUX1RZUEUiKTsKKworICAgIGludDMyX3QgaV9lZmZlY3RfdHlwZSwgaV90YXJnZXRfbG91ZG5lc3MsIGlfbG91ZF9ub3JtOworICAgIC8qU2V0IEVmZmVjdCBUeXBlKi8KKyAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9EUkNfRUZGRUNUX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpX2VmZmVjdF90eXBlKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0VGRkVDVF9UWVBFIik7CisKKyAgICBlcnJfY29kZSA9CisgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfRUZGRUNUX1RZUEUsICZpX2VmZmVjdF90eXBlKTsKKworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0RSQ19ERUNfQ09ORklHX0RSQ19FRkZFQ1RfVFlQRSIpOworCisgICAgLypTZXQgdGFyZ2V0IGxvdWRuZXNzICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKAorICAgICAgICBtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19UQVJHRVRfTE9VRE5FU1MsICZpX3RhcmdldF9sb3VkbmVzcyk7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX0RSQ19UQVJHRVRfTE9VRE5FU1MiKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9DT05GSUdfUEFSQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9EUkNfREVDX0NPTkZJR19EUkNfVEFSR0VUX0xPVURORVNTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlfdGFyZ2V0X2xvdWRuZXNzKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19EUkNfVEFSR0VUX0xPVURORVNTIik7CisKKyAgICAvKlNldCBsb3VkX25vcm1fZmxhZyovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfQ09ORklHX1BBUkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0xPVURfTk9STSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlfbG91ZF9ub3JtKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fRFJDX0xPVURfTk9STSIpOworCisgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX0NPTkZJR19QQVJBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0RSQ19ERUNfQ09ORklHX0RSQ19MT1VEX05PUk0sICZpX2xvdWRfbm9ybSk7CisKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9EUkNfREVDX0NPTkZJR19EUkNfTE9VRF9OT1JNIik7CisKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CisKK2NsYXNzIEMyU29mdFhhYWNEZWNGYWN0b3J5IDogcHVibGljIEMyQ29tcG9uZW50RmFjdG9yeSB7CitwdWJsaWM6CisgICAgQzJTb2Z0WGFhY0RlY0ZhY3RvcnkoKSA6IG1IZWxwZXIoc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyUmVmbGVjdG9ySGVscGVyPigKKyAgICAgICAgICAgIEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKS0+Z2V0UGFyYW1SZWZsZWN0b3IoKSkpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChDMkNvbXBvbmVudCopPiBkZWxldGVyKSBvdmVycmlkZSB7CisgICAgICAgICpjb21wb25lbnQgPSBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+KAorICAgICAgICAgICAgICAgIG5ldyBDMlNvZnRYYWFjRGVjKENPTVBPTkVOVF9OQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0WGFhY0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEMyQ29tcG9uZW50SW50ZXJmYWNlKik+IGRlbGV0ZXIpIG92ZXJyaWRlIHsKKyAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4oCisgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUludGVyZmFjZTxDMlNvZnRYYWFjRGVjOjpJbnRmSW1wbD4oCisgICAgICAgICAgICAgICAgICAgICAgICBDT01QT05FTlRfTkFNRSwgaWQsIHN0ZDo6bWFrZV9zaGFyZWQ8QzJTb2Z0WGFhY0RlYzo6SW50ZkltcGw+KG1IZWxwZXIpKSwKKyAgICAgICAgICAgICAgICBkZWxldGVyKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyU29mdFhhYWNEZWNGYWN0b3J5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbUhlbHBlcjsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKK2V4dGVybiAiQyIgOjpDMkNvbXBvbmVudEZhY3RvcnkqIENyZWF0ZUNvZGVjMkZhY3RvcnkoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBuZXcgOjphbmRyb2lkOjpDMlNvZnRYYWFjRGVjRmFjdG9yeSgpOworfQorCitleHRlcm4gIkMiIHZvaWQgRGVzdHJveUNvZGVjMkZhY3RvcnkoOjpDMkNvbXBvbmVudEZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgZGVsZXRlIGZhY3Rvcnk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuaCBiL21lZGlhL2NvZGVjMi9jb21wb25lbnRzL3hhYWMvQzJTb2Z0WGFhY0RlYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjODU2N2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29tcG9uZW50cy94YWFjL0MyU29mdFhhYWNEZWMuaApAQCAtMCwwICsxLDEzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9DMl9TT0ZUX1hBQUNfREVDX0hfCisjZGVmaW5lIEFORFJPSURfQzJfU09GVF9YQUFDX0RFQ19IXworI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPFNpbXBsZUMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlICJpeGhlYWFjZF90eXBlX2RlZi5oIgorI2luY2x1ZGUgIml4aGVhYWNkX2Vycm9yX3N0YW5kYXJkcy5oIgorI2luY2x1ZGUgIml4aGVhYWNkX2Vycm9yX2hhbmRsZXIuaCIKKyNpbmNsdWRlICJpeGhlYWFjZF9hcGljbWRfc3RhbmRhcmRzLmgiCisjaW5jbHVkZSAiaXhoZWFhY2RfbWVtb3J5X3N0YW5kYXJkcy5oIgorI2luY2x1ZGUgIml4aGVhYWNkX2FhY19jb25maWcuaCIKKworI2luY2x1ZGUgImltcGRfYXBpY21kX3N0YW5kYXJkcy5oIgorI2luY2x1ZGUgImltcGRfZHJjX2NvbmZpZ19wYXJhbXMuaCIKKworI2RlZmluZSBNQVhfQ0hBTk5FTF9DT1VOVCAgICAgICAgICAgOCAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgdGhhdCBjYW4gYmUgZGVjb2RlZCAqLworI2RlZmluZSBNQVhfTlVNX0JMT0NLUyAgICAgICAgICAgICAgOCAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gYmxvY2tzIHRoYXQgY2FuIGJlIGRlY29kZWQgKi8KKworZXh0ZXJuICJDIiBJQV9FUlJPUkNPREUgaXhoZWFhY2RfZGVjX2FwaShwVk9JRCBwX2lhX21vZHVsZV9vYmosCisgICAgICAgICAgICAgICAgICAgICAgICBXT1JEMzIgaV9jbWQsIFdPUkQzMiBpX2lkeCwgcFZPSUQgcHZfdmFsdWUpOworZXh0ZXJuICJDIiBJQV9FUlJPUkNPREUgaWFfZHJjX2RlY19hcGkocFZPSUQgcF9pYV9tb2R1bGVfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgV09SRDMyIGlfY21kLCBXT1JEMzIgaV9pZHgsIHBWT0lEIHB2X3ZhbHVlKTsKK2V4dGVybiAiQyIgIElBX0VSUk9SQ09ERSBpeGhlYWFjZF9nZXRfY29uZmlnX3BhcmFtKHBWT0lEIHBfaWFfcHJvY2Vzc19hcGlfb2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdPUkQzMiBwaV9zYW1wX2ZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV09SRDMyIHBpX251bV9jaGFuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFdPUkQzMiBwaV9wY21fd2Rfc3osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwV09SRDMyIHBpX2NoYW5uZWxfbWFzayk7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEMyU29mdFhhYWNEZWMgOiBwdWJsaWMgU2ltcGxlQzJDb21wb25lbnQgeworICAgIGNsYXNzIEludGZJbXBsOworCisgICAgQzJTb2Z0WGFhY0RlYyhjb25zdCBjaGFyKiBuYW1lLCBjMl9ub2RlX2lkX3QgaWQsCisgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW50ZkltcGw+JiBpbnRmSW1wbCk7CisgICAgdmlydHVhbCB+QzJTb2Z0WGFhY0RlYygpOworCisgICAgLy8gRnJvbSBTaW1wbGVDMkNvbXBvbmVudAorICAgIGMyX3N0YXR1c190IG9uSW5pdCgpIG92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG9uU3RvcCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOworICAgIHZvaWQgb25SZWxlYXNlKCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3Qgb25GbHVzaF9zbSgpIG92ZXJyaWRlOworICAgIHZvaWQgcHJvY2VzcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgb3ZlcnJpZGU7CisgICAgYzJfc3RhdHVzX3QgZHJhaW4oCisgICAgICAgICAgICB1aW50MzJfdCBkcmFpbk1vZGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICZwb29sKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga091dHB1dERyYWluQnVmZmVyU2l6ZSAgICAgID0gMjA0OCAqIE1BWF9DSEFOTkVMX0NPVU5UICogTUFYX05VTV9CTE9DS1MsCisgICAgfTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRmSW1wbD4gbUludGY7CisgICAgdm9pZCogbVhoZWFhY0NvZGVjSGFuZGxlOworICAgIHZvaWQqIG1NcGVnRERyY0hhbmRsZTsKKyAgICB1aW50MzJfdCBtSW5wdXRCdWZmZXJTaXplOworICAgIHVpbnQzMl90IG1PdXRwdXRGcmFtZUxlbmd0aDsKKyAgICBpbnQ4X3QqIG1JbnB1dEJ1ZmZlcjsKKyAgICBpbnQ4X3QqIG1PdXRwdXRCdWZmZXI7CisgICAgaW50MzJfdCBtU2FtcEZyZXE7CisgICAgaW50MzJfdCBtTnVtQ2hhbm5lbHM7CisgICAgaW50MzJfdCBtUGNtV2RTejsKKyAgICBpbnQzMl90IG1DaGFubmVsTWFzazsKKyAgICBpbnQzMl90IG1OdW1PdXRCeXRlczsKKyAgICB1aW50NjRfdCBtQ3VyRnJhbWVJbmRleDsKKyAgICB1aW50NjRfdCBtQ3VyVGltZXN0YW1wOworICAgIGJvb2wgbUlzQ29kZWNJbml0aWFsaXplZDsKKyAgICBib29sIG1Jc0NvZGVjQ29uZmlnRmx1c2hSZXF1aXJlZDsKKyAgICBpbnQ4X3QqIG1EcmNJbkJ1ZjsKKyAgICBpbnQ4X3QqIG1EcmNPdXRCdWY7CisgICAgaW50MzJfdCBtTXBlZ0REUkNQcmVzZW50OworICAgIGludDMyX3QgbURSQ0ZsYWc7CisKKyAgICBWZWN0b3I8dm9pZCo+IG1NZW1vcnlWZWM7CisgICAgVmVjdG9yPHZvaWQqPiBtRHJjTWVtb3J5VmVjOworCisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlckNvdW50IF9fdW51c2VkOworICAgIHNpemVfdCBtT3V0cHV0QnVmZmVyQ291bnQgX191bnVzZWQ7CisgICAgYm9vbCBtU2lnbmFsbGVkT3V0cHV0RW9zOworICAgIGJvb2wgbVNpZ25hbGxlZEVycm9yOworICAgIGNoYXIqIG1PdXRwdXREcmFpbkJ1ZmZlcjsKKyAgICB1aW50MzJfdCBtT3V0cHV0RHJhaW5CdWZmZXJXcml0ZVBvczsKKworICAgIElBX0VSUk9SQ09ERSBpbml0RGVjb2RlcigpOworICAgIElBX0VSUk9SQ09ERSBzZXREcmNQYXJhbWV0ZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgY29uZmlnZmx1c2hEZWNvZGUoKTsKKyAgICBJQV9FUlJPUkNPREUgZHJhaW5EZWNvZGVyKCk7CisgICAgdm9pZCBmaW5pc2hXb3JrKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKTsKKworICAgIElBX0VSUk9SQ09ERSBpbml0WEFBQ0RyYygpOworICAgIElBX0VSUk9SQ09ERSBpbml0WEFBQ0RlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgaW5pdE1QRUdERERyYygpOworICAgIElBX0VSUk9SQ09ERSBkZUluaXRNUEVHREREcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgY29uZmlnWEFBQ0RlY29kZXIodWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoKTsKKyAgICBpbnQgY29uZmlnTVBFR0REcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgZGVjb2RlWEFBQ1N0cmVhbSh1aW50OF90KiBpbkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90KiBieXRlc0NvbnN1bWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIG91dEJ5dGVzKTsKKyAgICBJQV9FUlJPUkNPREUgZ2V0WEFBQ1N0cmVhbUluZm8oKTsKKyAgICBJQV9FUlJPUkNPREUgc2V0WEFBQ0RSQ0luZm8oaW50MzJfdCBkcmNDdXQsIGludDMyX3QgZHJjQm9vc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZHJjUmVmTGV2ZWwsIGludDMyX3QgZHJjSGVhdnlDb21wcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkckVmZmVjdFR5cGUpOworCisgICAgQzJfRE9fTk9UX0NPUFkoQzJTb2Z0WGFhY0RlYyk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEMyX1NPRlRfWEFBQ19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9jb3JlL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTdlODk5NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0OCBAQAorY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGliY29kZWMyX2hlYWRlcnMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCit9CisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY29kZWMyIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIHZuZGs6IHsKKyAgICAgICAgZW5hYmxlZDogdHJ1ZSwKKyAgICB9LAorCisgICAgc3JjczogWyJDMi5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfaGVhZGVycyIsCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnV0aWxzX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfaGVhZGVycyIsCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnV0aWxzX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiBmYWxzZSwgLy8gdHJ1ZSwKKyAgICAgICAgZGlhZzogeworICAgICAgICAgICAgY2ZpOiBmYWxzZSwgLy8gdHJ1ZSwKKyAgICAgICAgfSwKKyAgICB9LAorCisgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9DMi5jcHAgYi9tZWRpYS9jb2RlYzIvY29yZS9DMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU5ZDRlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL0MyLmNwcApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPEMyLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKworLyoqCisgKiBUaGVyZSBpcyBub3RoaW5nIGhlcmUgeWV0LiBUaGlzIGxpYnJhcnkgaXMgYnVpbHQgdG8gc2VlIHdoYXQgc3ltYm9scyBhbmQgbWV0aG9kcyBnZXQKKyAqIGRlZmluZWQgYXMgcGFydCBvZiB0aGUgQVBJIGluY2x1ZGUgZmlsZXMuCisgKgorICogR29pbmcgZm9yd2FyZCwgdGhlIENvZGVjMiBsaWJyYXJ5IHdpbGwgY29udGFpbiB1dGlsaXR5IG1ldGhvZHMgdGhhdCBhcmUgdXNlZnVsIGZvcgorICogQ29kZWMyIGNsaWVudHMuCisgKi8KKworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYzNDY2ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzIuaApAQCAtMCwwICsxLDU1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJfSF8KKyNkZWZpbmUgQzJfSF8KKworI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKy8qKiBuYW5vc2Vjb25kcyB3aXRoIGFyYml0cmFyeSBvcmlnaW4uICovCit0eXBlZGVmIGludDY0X3QgYzJfbnNlY3NfdDsKKworLyoqIFxtYWlucGFnZSBDb2RlYzIKKyAqCisgKiBDb2RlYzIgaXMgYSBnZW5lcmljIGZyYW1lLWJhc2VkIGRhdGEgcHJvY2Vzc2luZyBBUEkuCisgKgorICogVGhlIG1lZGlhIHN1YnN5c3RlbSBhY2Nlc3NlcyBjb21wb25lbnRzIHZpYSB0aGUgXHJlZiBBUEkuCisgKi8KKworLyoqIFxpbmdyb3VwIEFQSQorICoKKyAqIFRoZSBDb2RlYzIgQVBJIGRlZmluZXMgdGhlIG9wZXJhdGlvbiBvZiBkYXRhIHByb2Nlc3NpbmcgY29tcG9uZW50cyBhbmQgdGhlaXIgaW50ZXJhY3Rpb24gd2l0aAorICogdGhlIHJlc3Qgb2YgdGhlIHN5c3RlbS4KKyAqCisgKiBDb2RpbmcgQ29udmVudGlvbnMKKyAqCisgKiBNaXRpZ2F0aW5nIEJpbmFyeSBDb21wYXRpYmlsaXR5LgorICoKKyAqIFdoaWxlIGZ1bGwgYmluYXJ5IGNvbXBhdGliaWxpdHkgaXMgbm90IGEgZ29hbCBvZiB0aGUgQVBJIChkdWUgdG8gb3VyIHVzZSBvZiBTVEwpLCB3ZSB0cnkgdG8KKyAqIG1pdGlnYXRlIGJpbmFyeSBicmVha3MgYnkgYWRoZXJpbmcgdG8gdGhlIGZvbGxvd2luZyBjb252ZW50aW9uczoKKyAqCisgKiAtIGF0IG1vc3Qgb25lIHZ0YWJsZSB3aXRoIHBsYWNlaG9sZGVyIHZpcnR1YWwgbWV0aG9kcworICogLSBhbGwgb3B0aW9uYWwvcGxhY2Vob2xkZXIgdmlydHVhbCBtZXRob2RzIHJldHVybmluZyBhIGMyX3N0YXR1c190LCB3aXRoIEMyX09NSVRURUQgbm90IHJlcXVpcmluZworICogICBhbnkgdXBkYXRlIHRvIGlucHV0L291dHB1dCBhcmd1bWVudHMuCisgKiAtIGxpbWl0aW5nIHN5bWJvbCBleHBvcnQgb2YgaW5saW5lIG1ldGhvZHMKKyAqIC0gdXNlIG9mIHBpbXBsIChvciBzaGFyZWQtcGltcGwpCisgKgorICogTmFtaW5nCisgKgorICogLSBhbGwgY2xhc3NlcyBhbmQgdHlwZXMgcHJlZml4IHdpdGggQzIKKyAqIC0gY2xhc3NlcyBmb3IgaW50ZXJuYWwgdXNlIHByZWZpeCB3aXRoIF9DMgorICogLSBlbnVtIHZhbHVlcyBpbiBnbG9iYWwgbmFtZXNwYWNlIHByZWZpeCB3aXRoIEMyXyBhbGwgY2FwcworICogLSBlbnVtIHZhbHVlcyBpbnNpZGUgY2xhc3NlcyBoYXZlIG5vIEMyXyBwcmVmaXggYXMgY2xhc3MgYWxyZWFkeSBoYXMgaXQKKyAqIC0gc3VwcG9ydGluZyB0d28ga2luZHMgb2YgZW51bSBuYW1pbmc6IGFsbC1jYXBzIGFuZCBrQ2FtZWxDYXNlCisgKiBcdG9kbyByZXZpc2l0IGtDYW1lbENhc2UgZm9yIHBhcmFtLXR5cGUKKyAqCisgKiBBc3BlY3RzCisgKgorICogQXNwZWN0cyBkZWZpbmUgY2VydGFpbiBjb21tb24gYmVoYXZpb3IgYWNyb3NzIGEgZ3JvdXAgb2Ygb2JqZWN0cy4KKyAqIC0gY2xhc3NlcyB3aG9zZSBuYW1lIG1hdGNoZXMgX0MyLipBc3BlY3QKKyAqIC0gb25seSBwcm90ZWN0ZWQgY29uc3RydWN0b3JzCisgKiAtIG5vIGRlc2N0cnVjdG9yIGFuZCBjb3BpYWJsZQorICogLSBhbGwgbWV0aG9kcyBhcmUgaW5saW5lIG9yIHN0YXRpYyAodGhpcyBpcyBvcHBvc2l0ZSBvZiB0aGUgaW50ZXJmYWNlIHBhcmFkaWdtIHdoZXJlIGFsbCBtZXRob2RzCisgKiAgIGFyZSB2aXJ0dWFsLCB3aGljaCB3b3VsZCBub3Qgd29yayBkdWUgdG8gdGhlIGF0IG1vc3Qgb25lIHZ0YWJsZSBydWxlLikKKyAqIC0gb25seSBwcml2YXRlIHZhcmlhYmxlcyAodGhpcyBwcmV2ZW50cyBzdWJjbGFzc2VzIGludGVyZmVyaW5nIHdpdGggdGhlIGFzcGVjdHMuKQorICovCisKKy8vLyBcZGVmZ3JvdXAgdHlwZXMgQ29tbW9uIFR5cGVzCisvLy8gQHsKKworLyoqCisgKiBDMlN0cmluZzogYmFzaWMgc3RyaW5nIGltcGxlbWVudGF0aW9uCisgKi8KK3R5cGVkZWYgc3RkOjpzdHJpbmcgQzJTdHJpbmc7CisKKy8qKgorICogQzJTdHJpbmdMaXRlcmFsOiBiYXNpYyBzdHJpbmcgbGl0ZXJhbCBpbXBsZW1lbnRhdGlvbi4KKyAqIFxub3RlIHRoZXNlIGFyZSBuZXZlciBvd25lZCBieSBhbnkgb2JqZWN0LCBhbmQgY2FuIG9ubHkgcmVmZXIgdG8gQyBzdHJpbmcgbGl0ZXJhbHMuCisgKi8KK3R5cGVkZWYgY29uc3QgY2hhciAqQzJTdHJpbmdMaXRlcmFsOworCisvKioKKyAqIGMyX3N0YXR1c190OiBzdGF0dXMgY29kZXMgdXNlZC4KKyAqLworZW51bSBjMl9zdGF0dXNfdCA6IGludDMyX3QgeworLyoKKyAqIFVzZSBQT1NJWCBlcnJubyBjb25zdGFudHMuCisgKi8KKyAgICBDMl9PSyAgICAgICAgPSAwLCAgICAgICAgICAgIC8vLzwgb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkKKworICAgIC8vIGJhZCBpbnB1dAorICAgIEMyX0JBRF9WQUxVRSA9IEVJTlZBTCwgICAgICAgLy8vPCBhcmd1bWVudCBoYXMgaW52YWxpZCB2YWx1ZSAodXNlciBlcnJvcikKKyAgICBDMl9CQURfSU5ERVggPSBFTlhJTywgICAgICAgIC8vLzwgYXJndW1lbnQgdXNlcyBpbnZhbGlkIGluZGV4ICh1c2VyIGVycm9yKQorICAgIEMyX0NBTk5PVF9ETyA9IEVOT1RTVVAsICAgICAgLy8vPCBhcmd1bWVudC9pbmRleCBpcyB2YWxpZCBidXQgbm90IHBvc3NpYmxlCisKKyAgICAvLyBiYWQgc2VxdWVuY2luZyBvZiBldmVudHMKKyAgICBDMl9EVVBMSUNBVEUgPSBFRVhJU1QsICAgICAgIC8vLzwgb2JqZWN0IGFscmVhZHkgZXhpc3RzCisgICAgQzJfTk9UX0ZPVU5EID0gRU5PRU5ULCAgICAgICAvLy88IG9iamVjdCBub3QgZm91bmQKKyAgICBDMl9CQURfU1RBVEUgPSBFUEVSTSwgICAgICAgIC8vLzwgb3BlcmF0aW9uIGlzIG5vdCBwZXJtaXR0ZWQgaW4gdGhlIGN1cnJlbnQgc3RhdGUKKyAgICBDMl9CTE9DS0lORyAgPSBFV09VTERCTE9DSywgIC8vLzwgb3BlcmF0aW9uIHdvdWxkIGJsb2NrIGJ1dCBibG9ja2luZyBpcyBub3QgcGVybWl0dGVkCisgICAgQzJfQ0FOQ0VMRUQgID0gRUlOVFIsICAgICAgICAvLy88IG9wZXJhdGlvbiBpbnRlcnJ1cHRlZC9jYW5jZWxlZAorCisgICAgLy8gYmFkIGVudmlyb25tZW50CisgICAgQzJfTk9fTUVNT1JZID0gRU5PTUVNLCAgICAgICAvLy88IG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIG9wZXJhdGlvbgorICAgIEMyX1JFRlVTRUQgICA9IEVBQ0NFUywgICAgICAgLy8vPCBtaXNzaW5nIHBlcm1pc3Npb24gdG8gY29tcGxldGUgb3BlcmF0aW9uCisKKyAgICBDMl9USU1FRF9PVVQgPSBFVElNRURPVVQsICAgIC8vLzwgb3BlcmF0aW9uIGRpZCBub3QgY29tcGxldGUgd2l0aGluIHRpbWVvdXQKKworICAgIC8vIGJhZCB2ZXJzaW9uaW5nCisgICAgQzJfT01JVFRFRCAgID0gRU5PU1lTLCAgICAgICAvLy88IG9wZXJhdGlvbiBpcyBub3QgaW1wbGVtZW50ZWQvc3VwcG9ydGVkIChvcHRpb25hbCBvbmx5KQorCisgICAgLy8gdW5rbm93biBmYXRhbAorICAgIEMyX0NPUlJVUFRFRCA9IEVGQVVMVCwgICAgICAgLy8vPCBzb21lIHVuZXhwZWN0ZWQgZXJyb3IgcHJldmVudGVkIHRoZSBvcGVyYXRpb24KKyAgICBDMl9OT19JTklUICAgPSBFTk9ERVYsICAgICAgIC8vLzwgc3RhdHVzIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZAorfTsKKworLyoqCisgKiBUeXBlIHRoYXQgZGVzY3JpYmVzIHRoZSBkZXNpcmVkIGJsb2NraW5nIGJlaGF2aW9yIGZvciB2YXJpYWJsZSBibG9ja2luZyBjYWxscy4gQmxvY2tpbmcgaW4gdGhpcworICogQVBJIGlzIHVzZWQgaW4gYSBzb21ld2hhdCBtb2RpZmllZCBtZWFuaW5nIHN1Y2ggdGhhdCBvcGVyYXRpb25zIHRoYXQgbWVyZWx5IHVwZGF0ZSB2YXJpYWJsZXMKKyAqIHByb3RlY3RlZCBieSBtdXRleGVzIGFyZSBzdGlsbCBjb25zaWRlcmVkICJub24tYmxvY2tpbmciIChhbHdheXMgdXNlZCBpbiBxdW90ZXMpLgorICovCitlbnVtIGMyX2Jsb2NraW5nX3QgOiBpbnQzMl90IHsKKyAgICAvKioKKyAgICAgKiBUaGUgb3BlcmF0aW9uIFNIQUxMIGJlICJub24tYmxvY2tpbmciLiBUaGlzIG1lYW5zIHRoYXQgaXQgc2hhbGwgbm90IHBlcmZvcm0gYW55IGZpbGUKKyAgICAgKiBvcGVyYXRpb25zLCBvciBjYWxsL3dhaXQgb24gb3RoZXIgcHJvY2Vzc2VzLiBJdCBtYXkgdXNlIGEgcHJvdGVjdGVkIHJlZ2lvbiBhcyBsb25nIGFzIHRoZQorICAgICAqIG11dGV4IGlzIG5ldmVyIHVzZWQgdG8gcHJvdGVjdCBjb2RlIHRoYXQgaXMgb3RoZXJ3aXNlICJtYXkgYmxvY2siLgorICAgICAqLworICAgIEMyX0RPTlRfQkxPQ0sgPSBmYWxzZSwKKyAgICAvKioKKyAgICAgKiBUaGUgb3BlcmF0aW9uIE1BWSBiZSB0ZW1wb3JhcmlseSBibG9ja2luZy4KKyAgICAgKi8KKyAgICBDMl9NQVlfQkxPQ0sgPSB0cnVlLAorfTsKKworLy8vIEB9CisKKy8vLyBcZGVmZ3JvdXAgdXRpbHMgVXRpbGl0aWVzCisvLy8gQHsKKworI2RlZmluZSBDMl9ET19OT1RfQ09QWSh0eXBlKSBcCisgICAgdHlwZSYgb3BlcmF0b3I9KGNvbnN0IHR5cGUgJikgPSBkZWxldGU7IFwKKyAgICB0eXBlKGNvbnN0IHR5cGUgJikgPSBkZWxldGU7IFwKKworI2RlZmluZSBDMl9ERUZBVUxUX01PVkUodHlwZSkgXAorICAgIHR5cGUmIG9wZXJhdG9yPSh0eXBlICYmKSA9IGRlZmF1bHQ7IFwKKyAgICB0eXBlKHR5cGUgJiYpID0gZGVmYXVsdDsgXAorCisjZGVmaW5lIEMyX0FMTE9XX09WRVJGTE9XIF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJpbnRlZ2VyIikpKQorI2RlZmluZSBDMl9DT05TVCAgICBfX2F0dHJpYnV0ZV9fKChjb25zdCkpCisjZGVmaW5lIEMyX0hJREUgICAgIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNkZWZpbmUgQzJfSU5MSU5FICAgaW5saW5lIEMyX0hJREUKKyNkZWZpbmUgQzJfSU5URVJOQUwgX19hdHRyaWJ1dGVfXygoaW50ZXJuYWxfbGlua2FnZSkpCisjZGVmaW5lIEMyX1BBQ0sgICAgIF9fYXR0cmlidXRlX18oKGFsaWduZWQoNCkpKQorI2RlZmluZSBDMl9QVVJFICAgICBfX2F0dHJpYnV0ZV9fKChwdXJlKSkKKworI2RlZmluZSBERUZJTkVfT1RIRVJfQ09NUEFSSVNPTl9PUEVSQVRPUlModHlwZSkgXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgdHlwZSAmb3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOyB9IFwKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IHJldHVybiAoKnRoaXMgPT0gb3RoZXIpIHx8ICgqdGhpcyA8IG90aGVyKTsgfSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCB0eXBlICZvdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA8IG90aGVyKTsgfSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I+KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IHJldHVybiAhKCp0aGlzIDwgb3RoZXIpICYmICEoKnRoaXMgPT0gb3RoZXIpOyB9CisKKyNkZWZpbmUgREVGSU5FX0ZJRUxEX0JBU0VEX0NPTVBBUklTT05fT1BFUkFUT1JTKHR5cGUsIGZpZWxkKSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IHJldHVybiBmaWVsZCA8IG90aGVyLmZpZWxkOyB9IFwKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IHJldHVybiBmaWVsZCA9PSBvdGhlci5maWVsZDsgfSBcCisgICAgREVGSU5FX09USEVSX0NPTVBBUklTT05fT1BFUkFUT1JTKHR5cGUpCisKKyNkZWZpbmUgREVGSU5FX0ZJRUxEX0FORF9NQVNLX0JBU0VEX0NPTVBBUklTT05fT1BFUkFUT1JTKHR5cGUsIGZpZWxkLCBtYXNrKSBcCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IHR5cGUgJm90aGVyKSBjb25zdCB7IFwKKyAgICAgICAgcmV0dXJuIChmaWVsZCAmIG1hc2spIDwgKG90aGVyLmZpZWxkICYgKG1hc2spKTsgXAorICAgIH0gXAorICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgdHlwZSAmb3RoZXIpIGNvbnN0IHsgXAorICAgICAgICByZXR1cm4gKGZpZWxkICYgbWFzaykgPT0gKG90aGVyLmZpZWxkICYgKG1hc2spKTsgXAorICAgIH0gXAorICAgIERFRklORV9PVEhFUl9DT01QQVJJU09OX09QRVJBVE9SUyh0eXBlKQorCisjZGVmaW5lIERFRklORV9FTlVNX09QRVJBVE9SUyhldHlwZSkgXAorICAgIGlubGluZSBjb25zdGV4cHIgZXR5cGUgb3BlcmF0b3J8KGV0eXBlIGEsIGV0eXBlIGIpIHsgcmV0dXJuIChldHlwZSkoc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGEpIHwgc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGIpKTsgfSBcCisgICAgaW5saW5lIGNvbnN0ZXhwciBldHlwZSAmb3BlcmF0b3J8PShldHlwZSAmYSwgZXR5cGUgYikgeyBhID0gKGV0eXBlKShzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYSkgfCBzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYikpOyByZXR1cm4gYTsgfSBcCisgICAgaW5saW5lIGNvbnN0ZXhwciBldHlwZSBvcGVyYXRvciYoZXR5cGUgYSwgZXR5cGUgYikgeyByZXR1cm4gKGV0eXBlKShzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYSkgJiBzdGQ6OnVuZGVybHlpbmdfdHlwZTxldHlwZT46OnR5cGUoYikpOyB9IFwKKyAgICBpbmxpbmUgY29uc3RleHByIGV0eXBlICZvcGVyYXRvciY9KGV0eXBlICZhLCBldHlwZSBiKSB7IGEgPSAoZXR5cGUpKHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShhKSAmIHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShiKSk7IHJldHVybiBhOyB9IFwKKyAgICBpbmxpbmUgY29uc3RleHByIGV0eXBlIG9wZXJhdG9yXihldHlwZSBhLCBldHlwZSBiKSB7IHJldHVybiAoZXR5cGUpKHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShhKSBeIHN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShiKSk7IH0gXAorICAgIGlubGluZSBjb25zdGV4cHIgZXR5cGUgJm9wZXJhdG9yXj0oZXR5cGUgJmEsIGV0eXBlIGIpIHsgYSA9IChldHlwZSkoc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGEpIF4gc3RkOjp1bmRlcmx5aW5nX3R5cGU8ZXR5cGU+Ojp0eXBlKGIpKTsgcmV0dXJuIGE7IH0gXAorICAgIGlubGluZSBjb25zdGV4cHIgZXR5cGUgb3BlcmF0b3J+KGV0eXBlIGEpIHsgcmV0dXJuIChldHlwZSkofnN0ZDo6dW5kZXJseWluZ190eXBlPGV0eXBlPjo6dHlwZShhKSk7IH0KKwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQj4KK2NsYXNzIEMyX0hJREUgYzJfY250cl90OworCisvLy8gXGNvbmQgSU5URVJOQUwKKworLy8vIFxkZWZncm91cCB1dGlsc19pbnRlcm5hbAorLy8vIEB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJfSElERSBfYzJfY250cl9jb21wYXRfaGVscGVyIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8VT46OnZhbHVlPjo6dHlwZT4KKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIFQgZ2V0KGNvbnN0IFUgJnZhbHVlKSB7CisgICAgICAgIHJldHVybiBUKHZhbHVlKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBFPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPChzaXplb2YoVSkgPj0gc2l6ZW9mKFQpKT46OnR5cGU+CisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBUIGdldChjb25zdCBjMl9jbnRyX3Q8VSwgdm9pZD4gJnZhbHVlKSB7CisgICAgICAgIHJldHVybiBUKHZhbHVlLm1WYWx1ZSk7CisgICAgfQorfTsKKworLy8vIEB9CisKKy8vLyBcZW5kY29uZAorCisvKioKKyAqIEludGVncmFsIGNvdW50ZXIgdHlwZS4KKyAqCisgKiBUaGlzIGlzIGJhc2ljYWxseSBhbiB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlIHRoYXQgaXMgTkVWRVIgY2hlY2tlZCBmb3Igb3ZlcmZsb3cvdW5kZXJmbG93IC0gYW5kCisgKiBjb21wYXJpc29uIG9wZXJhdG9ycyBhcmUgcmVkZWZpbmVkLgorICoKKyAqIFxub3RlIENvbXBhcmlzb24gb2YgY291bnRlciB0eXBlcyBpcyBub3QgZnVsbHkgdHJhbnNpdGl2ZSwgZS5nLgorICogaXQgY291bGQgYmUgdGhhdCBhID4gYiA+IGMgYnV0IGEgIT4gYy4KKyAqIHN0ZDo6bGVzczw+LCBncmVhdGVyPD4sIGxlc3NfZXF1YWw8PiBhbmQgZ3JlYXRlcl9lcXVhbDw+IHNwZWNpYWxpemF0aW9ucyB5aWVsZCB0b3RhbCBvcmRlcmluZywKKyAqIGJ1dCBtYXkgbm90IG1hdGNoIHNlbWFudGljIG9yZGVyaW5nIG9mIHRoZSB2YWx1ZXMuCisgKgorICogVGVjaG5pY2FsbHk6IGNvdW50ZXIgdHlwZXMgcmVwcmVzZW50IGludGVnZXIgdmFsdWVzOiBBICogMl5OICsgdmFsdWUsIHdoZXJlIEEgY2FuIGJlIGFyYml0cmFyeS4KKyAqIFRoaXMgbWFrZXMgYWRkaXRpb24sIHN1YnRyYWN0aW9uLCBtdWx0aXBsaWNhdGlvbiAoYXMgd2VsbCBhcyBiaXR3aXNlIG9wZXJhdGlvbnMpIHdlbGwgZGVmaW5lZC4KKyAqIEhvd2V2ZXIsIGRpdmlzaW9uIGlzIGluIGdlbmVyYWwgbm90IHdlbGwgZGVmaW5lZCwgYXMgdGhlIHJlc3VsdCBtYXkgZGVwZW5kIG9uIEEuIFRoaXMgaXMgYWxzbworICogdHJ1ZSBmb3IgbG9naWNhbCBvcGVyYXRvcnMgYW5kIGJvb2xlYW4gY29udmVyc2lvbi4KKyAqCisgKiBFdmVuIHRob3VnaCB3ZWxsIGRlZmluZWQsIGJpdHdpc2Ugb3BlcmF0b3JzIGFyZSBub3QgaW1wbGVtZW50ZWQgZm9yIGNvdW50ZXIgdHlwZXMgYXMgdGhleSBhcmUgbm90CisgKiBtZWFuaW5nZnVsLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBCPXR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfaW50ZWdyYWw8VD46OnZhbHVlICYmIHN0ZDo6aXNfdW5zaWduZWQ8VD46OnZhbHVlPjo6dHlwZT4KK2NsYXNzIEMyX0hJREUgYzJfY250cl90IHsKKyAgICB1c2luZyBjb21wYXQgPSBfYzJfY250cl9jb21wYXRfaGVscGVyPFQ+OworCisgICAgVCBtVmFsdWU7CisgICAgY29uc3RleHByIHN0YXRpYyBUIEhBTEZfUkFOR0UgPSBUKH4wKSBeIChUKH4wKSA+PiAxKTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+CisgICAgZnJpZW5kIHN0cnVjdCBfYzJfY250cl9jb21wYXRfaGVscGVyOworcHVibGljOgorCisgICAgLyoqCisgICAgICogRGVmYXVsdCBjb25zdHJ1Y3Rvci4gSW5pdGlhbGl6ZWQgY291bnRlciB0byAwLgorICAgICAqLworICAgIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90KCkgOiBtVmFsdWUoVCgwKSkge30KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBmcm9tIGEgY29tcGF0aWJsZSB0eXBlLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+CisgICAgaW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3QoY29uc3QgVSAmdmFsdWUpIDogbVZhbHVlKGNvbXBhdDo6Z2V0KHZhbHVlKSkge30KKworICAgIC8qKgorICAgICAqIFBlZWsgYXMgdW5kZXJseWluZyBzaWduZWQgdHlwZS4KKyAgICAgKi8KKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgdHlwZW5hbWUgc3RkOjptYWtlX3NpZ25lZDxUPjo6dHlwZSBwZWVrKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dHlwZW5hbWUgc3RkOjptYWtlX3NpZ25lZDxUPjo6dHlwZT4obVZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZWVrIGFzIHVuZGVybHlpbmcgdW5zaWduZWQgdHlwZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIFQgcGVla3UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogUGVlayBhcyBsb25nIGxvbmcgLSBlLmcuIGZvciBwcmludGluZy4KKyAgICAgKi8KKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgbG9uZyBsb25nIHBlZWtsbCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIChsb25nIGxvbmcpbVZhbHVlOworICAgIH0KKworICAgIC8qKgorICAgICAqIFBlZWsgYXMgdW5zaWduZWQgbG9uZyBsb25nIC0gZS5nLiBmb3IgcHJpbnRpbmcuCisgICAgICovCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIHVuc2lnbmVkIGxvbmcgbG9uZyBwZWVrdWxsKCkgY29uc3QgeworICAgICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcgbG9uZyltVmFsdWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29udmVydCB0byBhIHNtYWxsZXIgY291bnRlciB0eXBlLiBUaGlzIGlzIGFsd2F5cyBzYWZlLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8KHNpemVvZihVKSA8IHNpemVvZihUKSk+Ojp0eXBlPgorICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgYzJfY250cl90PFU+KCkgeworICAgICAgICByZXR1cm4gYzJfY250cl90PFU+KG1WYWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQXJpdGhtZXRpYyBvcGVyYXRvcnMKKyAgICAgKi8KKworI2RlZmluZSBERUZJTkVfQzJfQ05UUl9CSU5BUllfT1AoYXR0cmliLCBvcCwgb3BfYXNzaWduKSBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gXAorICAgIGF0dHJpYiBpbmxpbmUgYzJfY250cl90PFQ+JiBvcGVyYXRvciBvcF9hc3NpZ24oY29uc3QgVSAmdmFsdWUpIHsgXAorICAgICAgICBtVmFsdWUgb3BfYXNzaWduIGNvbXBhdDo6Z2V0KHZhbHVlKTsgXAorICAgICAgICByZXR1cm4gKnRoaXM7IFwKKyAgICB9IFwKKyAgICBcCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgRT1kZWNsdHlwZShjb21wYXQ6OmdldChVKDApKSk+IFwKKyAgICBhdHRyaWIgaW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3Q8VD4gb3BlcmF0b3Igb3AoY29uc3QgVSAmdmFsdWUpIGNvbnN0IHsgXAorICAgICAgICByZXR1cm4gYzJfY250cl90PFQ+KG1WYWx1ZSBvcCBjb21wYXQ6OmdldCh2YWx1ZSkpOyBcCisgICAgfSBcCisgICAgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8KHNpemVvZihVKSA8IHNpemVvZihUKSk+Ojp0eXBlPiBcCisgICAgYXR0cmliIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90PFU+IG9wZXJhdG9yIG9wKGNvbnN0IGMyX2NudHJfdDxVPiAmdmFsdWUpIGNvbnN0IHsgXAorICAgICAgICByZXR1cm4gYzJfY250cl90PFU+KFUobVZhbHVlKSBvcCB2YWx1ZS5wZWVrdSgpKTsgXAorICAgIH0KKworI2RlZmluZSBERUZJTkVfQzJfQ05UUl9VTkFSWV9PUChhdHRyaWIsIG9wKSBcCisgICAgYXR0cmliIGlubGluZSBjb25zdGV4cHIgYzJfY250cl90PFQ+IG9wZXJhdG9yIG9wKCkgY29uc3QgeyBcCisgICAgICAgIHJldHVybiBjMl9jbnRyX3Q8VD4ob3AgbVZhbHVlKTsgXAorICAgIH0KKworI2RlZmluZSBERUZJTkVfQzJfQ05UUl9DUkVNRU5UX09QKGF0dHJpYiwgb3ApIFwKKyAgICBhdHRyaWIgaW5saW5lIGMyX2NudHJfdDxUPiAmb3BlcmF0b3Igb3AoKSB7IFwKKyAgICAgICAgb3AgbVZhbHVlOyBcCisgICAgICAgIHJldHVybiAqdGhpczsgXAorICAgIH0gXAorICAgIGF0dHJpYiBpbmxpbmUgYzJfY250cl90PFQ+IG9wZXJhdG9yIG9wKGludCkgeyBcCisgICAgICAgIHJldHVybiBjMl9jbnRyX3Q8VCwgdm9pZD4obVZhbHVlIG9wKTsgXAorICAgIH0KKworICAgIERFRklORV9DMl9DTlRSX0JJTkFSWV9PUChDMl9BTExPV19PVkVSRkxPVywgKywgKz0pCisgICAgREVGSU5FX0MyX0NOVFJfQklOQVJZX09QKEMyX0FMTE9XX09WRVJGTE9XLCAtLCAtPSkKKyAgICBERUZJTkVfQzJfQ05UUl9CSU5BUllfT1AoQzJfQUxMT1dfT1ZFUkZMT1csICosICo9KQorCisgICAgREVGSU5FX0MyX0NOVFJfVU5BUllfT1AoQzJfQUxMT1dfT1ZFUkZMT1csIC0pCisgICAgREVGSU5FX0MyX0NOVFJfVU5BUllfT1AoQzJfQUxMT1dfT1ZFUkZMT1csICspCisKKyAgICBERUZJTkVfQzJfQ05UUl9DUkVNRU5UX09QKEMyX0FMTE9XX09WRVJGTE9XLCArKykKKyAgICBERUZJTkVfQzJfQ05UUl9DUkVNRU5UX09QKEMyX0FMTE9XX09WRVJGTE9XLCAtLSkKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc191bnNpZ25lZDxVPjo6dmFsdWU+Ojp0eXBlPgorICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3Q8VD4gb3BlcmF0b3I8PChjb25zdCBVICZ2YWx1ZSkgY29uc3QgeworICAgICAgICByZXR1cm4gYzJfY250cl90PFQ+KG1WYWx1ZSA8PCB2YWx1ZSk7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgRT10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3Vuc2lnbmVkPFU+Ojp2YWx1ZT46OnR5cGU+CisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgYzJfY250cl90PFQ+ICZvcGVyYXRvcjw8PShjb25zdCBVICZ2YWx1ZSkgeworICAgICAgICBtVmFsdWUgPDw9IHZhbHVlOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29tcGFyaXNvbiBvcGVyYXRvcnMKKyAgICAgKi8KKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IGMyX2NudHJfdDxUPiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFQob3RoZXIubVZhbHVlIC0gbVZhbHVlKSA8IEhBTEZfUkFOR0U7CisgICAgfQorCisgICAgQzJfQUxMT1dfT1ZFUkZMT1cKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+PShjb25zdCBjMl9jbnRyX3Q8VD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBUKG1WYWx1ZSAtIG90aGVyLm1WYWx1ZSkgPCBIQUxGX1JBTkdFOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGMyX2NudHJfdDxUPiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1WYWx1ZSA9PSBvdGhlci5tVmFsdWU7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgYzJfY250cl90PFQ+ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPChjb25zdCBjMl9jbnRyX3Q8VD4gJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAqdGhpcyA8PSBvdGhlciAmJiAqdGhpcyAhPSBvdGhlcjsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGMyX2NudHJfdDxUPiAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICp0aGlzID49IG90aGVyICYmICp0aGlzICE9IG90aGVyOworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxVPjo6dmFsdWU+Ojp0eXBlPgoraW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3Q8VD4gb3BlcmF0b3IrKGNvbnN0IFUgJmEsIGNvbnN0IGMyX2NudHJfdDxUPiAmYikgeworICAgIHJldHVybiBiICsgYTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgRT10eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFU+Ojp2YWx1ZT46OnR5cGU+CitpbmxpbmUgY29uc3RleHByIGMyX2NudHJfdDxUPiBvcGVyYXRvci0oY29uc3QgVSAmYSwgY29uc3QgYzJfY250cl90PFQ+ICZiKSB7CisgICAgcmV0dXJuIGMyX2NudHJfdDxUPihhKSAtIGI7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEU9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19pbnRlZ3JhbDxVPjo6dmFsdWU+Ojp0eXBlPgoraW5saW5lIGNvbnN0ZXhwciBjMl9jbnRyX3Q8VD4gb3BlcmF0b3IqKGNvbnN0IFUgJmEsIGNvbnN0IGMyX2NudHJfdDxUPiAmYikgeworICAgIHJldHVybiBiICogYTsKK30KKwordHlwZWRlZiBjMl9jbnRyX3Q8dWludDMyX3Q+IGMyX2NudHIzMl90OyAvKiogMzItYml0IGNvdW50ZXIgdHlwZSAqLwordHlwZWRlZiBjMl9jbnRyX3Q8dWludDY0X3Q+IGMyX2NudHI2NF90OyAvKiogNjQtYml0IGNvdW50ZXIgdHlwZSAqLworCisvLy8gXGNvbmQgSU5URVJOQUwKKworLy8vIFxkZWZncm91cCB1dGlsc19pbnRlcm5hbAorLy8vIEB7CisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIFQ+IHN0cnVjdCBjMl90eXBlczsKKworLyoqIHNwZWNpYWxpemF0aW9uIGZvciBhIHNpbmdsZSB0eXBlICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGMyX3R5cGVzPFQ+IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6ZGVjYXk8VD46OnR5cGUgd2lkZV90eXBlOworICAgIHR5cGVkZWYgd2lkZV90eXBlIG5hcnJvd190eXBlOworICAgIHR5cGVkZWYgd2lkZV90eXBlIG1pbl90eXBlOyAvLyB0eXBlIGZvciBtaW4oVC4uLikKK307CisKKy8qKiBzcGVjaWFsaXphdGlvbiBmb3IgdHdvIHR5cGVzICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorc3RydWN0IGMyX3R5cGVzPFQsIFU+IHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID09IHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIm1peGluZyBmbG9hdGluZyBwb2ludCBhbmQgbm9uLWZsb2F0aW5nIHBvaW50IHR5cGVzIGlzIGRpc2FsbG93ZWQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2lnbmVkPFQ+Ojp2YWx1ZSA9PSBzdGQ6OmlzX3NpZ25lZDxVPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAibWl4aW5nIHNpZ25lZCBhbmQgdW5zaWduZWQgdHlwZXMgaXMgZGlzYWxsb3dlZCIpOworCisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmRlY2F5PAorICAgICAgICAgICAgZGVjbHR5cGUodHJ1ZSA/IHN0ZDo6ZGVjbHZhbDxUPigpIDogc3RkOjpkZWNsdmFsPFU+KCkpPjo6dHlwZSB3aWRlX3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OmRlY2F5PAorICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxzaXplb2YoVCkgPCBzaXplb2YoVSksIFQsIFU+Ojp0eXBlPjo6dHlwZSBuYXJyb3dfdHlwZTsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8CisgICAgICAgICAgICBzdGQ6OmlzX3NpZ25lZDxUPjo6dmFsdWUsIHdpZGVfdHlwZSwgbmFycm93X3R5cGU+Ojp0eXBlIG1pbl90eXBlOworfTsKKworLy8vIEB9CisKKy8vLyBcZW5kY29uZAorCisvKioKKyAqIFR5cGUgc3VwcG9ydCB1dGlsaXR5IGNsYXNzLiBPbmx5IHN1cHBvcnRzIHNpbWlsYXIgY2xhc3Nlcywgc3VjaCBhczoKKyAqIC0gYWxsIGZsb2F0aW5nIHBvaW50CisgKiAtIGFsbCB1bnNpZ25lZC9hbGwgc2lnbmVkCisgKiAtIGFsbCBwb2ludGVyCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lLi4uIFY+CitzdHJ1Y3QgYzJfdHlwZXM8VCwgVSwgVi4uLj4geworICAgIC8qKiBDb21tb24gdHlwZSB0aGF0IGFjY29tbW9kYXRlcyBhbGwgdGVtcGxhdGUgcGFyYW1ldGVyIHR5cGVzLiAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46OndpZGVfdHlwZSwgVi4uLj46OndpZGVfdHlwZSB3aWRlX3R5cGU7CisgICAgLyoqIE5hcnJvd2VzdCB0eXBlIG9mIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgdHlwZXMuICovCisgICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczx0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6bmFycm93X3R5cGUsIFYuLi4+OjpuYXJyb3dfdHlwZSBuYXJyb3dfdHlwZTsKKyAgICAvKiogVHlwZSB0aGF0IGFjY29tbW9kYXRlcyB0aGUgbWluaW11bSB2YWx1ZSBmb3IgYW55IGlucHV0IGZvciB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIHR5cGVzLiAqLworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8dHlwZW5hbWUgYzJfdHlwZXM8VCwgVT46Om1pbl90eXBlLCBWLi4uPjo6bWluX3R5cGUgbWluX3R5cGU7Cit9OworCisvKioKKyAqICBcaW5ncm91cCB1dGlsc19pbnRlcm5hbAorICogc3BlY2lhbGl6YXRpb24gZm9yIHR3byB2YWx1ZXMgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitpbmxpbmUgY29uc3RleHByIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+Ojp3aWRlX3R5cGUgYzJfbWF4KGNvbnN0IFQgYSwgY29uc3QgVSBiKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6d2lkZV90eXBlIHdpZGVfdHlwZTsKKyAgICByZXR1cm4gKHsgd2lkZV90eXBlIGFfKGEpLCBiXyhiKTsgYV8gPiBiXyA/IGFfIDogYl87IH0pOworfQorCisvKioKKyAqIEZpbmRzIHRoZSBtYXhpbXVtIHZhbHVlIG9mIGEgbGlzdCBvZiAic2ltaWxhcmx5IHR5cGVkIiB2YWx1ZXMuCisgKgorICogVGhpcyBpcyBhbiBleHRlbnNpb24gdG8gc3RkOjptYXggd2hlcmUgdGhlIHR5cGVzIGRvIG5vdCBoYXZlIHRvIGJlIGlkZW50aWNhbCwgYW5kIHRoZSBzbWFsbGVzdAorICogcmVzdWx0aW5nIHR5cGUgaXMgdXNlZCB0aGF0IGFjY29tbW9kYXRlcyB0aGUgYXJndW1lbnQgdHlwZXMuCisgKgorICogXG5vdGUgVmFsdWUgdHlwZXMgbXVzdCBiZSBzaW1pbGFyLCBlLmcuIGFsbCBmbG9hdGluZyBwb2ludCwgYWxsIHBvaW50ZXJzLCBhbGwgc2lnbmVkLCBvciBhbGwKKyAqIHVuc2lnbmVkLgorICoKKyAqIEByZXR1cm4gdGhlIGxhcmdlc3Qgb2YgdGhlIGlucHV0IGFyZ3VtZW50cy4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUuLi4gVj4KK2NvbnN0ZXhwciB0eXBlbmFtZSBjMl90eXBlczxULCBVLCBWLi4uPjo6d2lkZV90eXBlIGMyX21heChjb25zdCBUIGEsIGNvbnN0IFUgYiwgY29uc3QgViAuLi4gYykgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8VCwgVSwgVi4uLj46OndpZGVfdHlwZSB3aWRlX3R5cGU7CisgICAgcmV0dXJuICh7IHdpZGVfdHlwZSBhXyhhKSwgYl8oYzJfbWF4KGIsIGMuLi4pKTsgYV8gPiBiXyA/IGFfIDogYl87IH0pOworfQorCisvKioKKyAqICBcaW5ncm91cCB1dGlsc19pbnRlcm5hbAorICogc3BlY2lhbGl6YXRpb24gZm9yIHR3byB2YWx1ZXMgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitpbmxpbmUgY29uc3RleHByIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+OjptaW5fdHlwZSBjMl9taW4oY29uc3QgVCBhLCBjb25zdCBVIGIpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFU+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOworICAgIHJldHVybiAoeworICAgICAgICB3aWRlX3R5cGUgYV8oYSksIGJfKGIpOworICAgICAgICBzdGF0aWNfY2FzdDx0eXBlbmFtZSBjMl90eXBlczxULCBVPjo6bWluX3R5cGU+KGFfIDwgYl8gPyBhXyA6IGJfKTsKKyAgICB9KTsKK30KKworLyoqCisgKiBGaW5kcyB0aGUgbWluaW11bSB2YWx1ZSBvZiBhIGxpc3Qgb2YgInNpbWlsYXJseSB0eXBlZCIgdmFsdWVzLgorICoKKyAqIFRoaXMgaXMgYW4gZXh0ZW5zaW9uIHRvIHN0ZDo6bWluIHdoZXJlIHRoZSB0eXBlcyBkbyBub3QgaGF2ZSB0byBiZSBpZGVudGljYWwsIGFuZCB0aGUgc21hbGxlc3QKKyAqIHJlc3VsdGluZyB0eXBlIGlzIHVzZWQgdGhhdCBhY2NvbW1vZGF0ZXMgdGhlIGFyZ3VtZW50IHR5cGVzLgorICoKKyAqIFxub3RlIFZhbHVlIHR5cGVzIG11c3QgYmUgc2ltaWxhciwgZS5nLiBhbGwgZmxvYXRpbmcgcG9pbnQsIGFsbCBwb2ludGVycywgYWxsIHNpZ25lZCwgb3IgYWxsCisgKiB1bnNpZ25lZC4KKyAqCisgKiBAcmV0dXJuIHRoZSBzbWFsbGVzdCBvZiB0aGUgaW5wdXQgYXJndW1lbnRzLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZS4uLiBWPgorY29uc3RleHByIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFUsIFYuLi4+OjptaW5fdHlwZSBjMl9taW4oY29uc3QgVCBhLCBjb25zdCBVIGIsIGNvbnN0IFYgLi4uIGMpIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIGMyX3R5cGVzPFUsIFYuLi4+OjptaW5fdHlwZSByZXN0X3R5cGU7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBjMl90eXBlczxULCByZXN0X3R5cGU+Ojp3aWRlX3R5cGUgd2lkZV90eXBlOworICAgIHJldHVybiAoeworICAgICAgICB3aWRlX3R5cGUgYV8oYSksIGJfKGMyX21pbihiLCBjLi4uKSk7CisgICAgICAgIHN0YXRpY19jYXN0PHR5cGVuYW1lIGMyX3R5cGVzPFQsIHJlc3RfdHlwZT46Om1pbl90eXBlPihhXyA8IGJfID8gYV8gOiBiXyk7CisgICAgfSk7Cit9CisKKy8qKgorICogIFxpbmdyb3VwIHV0aWxzX2ludGVybmFsCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIFY+CitpbmxpbmUgY29uc3RleHByIHR5cGVuYW1lIGMyX3R5cGVzPFQsIFY+Ojp3aWRlX3R5cGUgYzJfY2xhbXAoY29uc3QgVCBhLCBjb25zdCBVIGIsIGNvbnN0IFYgYykgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgYzJfdHlwZXM8VCwgVSwgVj46OndpZGVfdHlwZSB3aWRlX3R5cGU7CisgICAgcmV0dXJuICh7CisgICAgICAgIHdpZGVfdHlwZSBhXyhhKSwgYl8oYiksIGNfKGMpOworICAgICAgICBzdGF0aWNfY2FzdDx0eXBlbmFtZSBjMl90eXBlczxULCBWPjo6d2lkZV90eXBlPihiXyA8IGFfID8gYV8gOiBiXyA+IGNfID8gY18gOiBiXyk7CisgICAgfSk7Cit9CisKKy8vLyBAfQorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3Qgc3RkOjpsZXNzPDo6YzJfY250cl90PFQ+PiB7CisgICAgY29uc3RleHByIGJvb2wgb3BlcmF0b3IoKShjb25zdCA6OmMyX2NudHJfdDxUPiAmbGgsIGNvbnN0IDo6YzJfY250cl90PFQ+ICZyaCkgY29uc3QgeworICAgICAgICByZXR1cm4gbGgucGVla3UoKSA8IHJoLnBlZWt1KCk7CisgICAgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3Qgc3RkOjpsZXNzX2VxdWFsPDo6YzJfY250cl90PFQ+PiB7CisgICAgY29uc3RleHByIGJvb2wgb3BlcmF0b3IoKShjb25zdCA6OmMyX2NudHJfdDxUPiAmbGgsIGNvbnN0IDo6YzJfY250cl90PFQ+ICZyaCkgY29uc3QgeworICAgICAgICByZXR1cm4gbGgucGVla3UoKSA8PSByaC5wZWVrdSgpOworICAgIH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IHN0ZDo6Z3JlYXRlcjw6OmMyX2NudHJfdDxUPj4geworICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yKCkoY29uc3QgOjpjMl9jbnRyX3Q8VD4gJmxoLCBjb25zdCA6OmMyX2NudHJfdDxUPiAmcmgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxoLnBlZWt1KCkgPiByaC5wZWVrdSgpOworICAgIH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IHN0ZDo6Z3JlYXRlcl9lcXVhbDw6OmMyX2NudHJfdDxUPj4geworICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yKCkoY29uc3QgOjpjMl9jbnRyX3Q8VD4gJmxoLCBjb25zdCA6OmMyX2NudHJfdDxUPiAmcmgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxoLnBlZWt1KCkgPj0gcmgucGVla3UoKTsKKyAgICB9Cit9OworCisjZW5kaWYgIC8vIEMyX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QzNTg3YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJCdWZmZXIuaApAQCAtMCwwICsxLDIxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyQlVGRkVSX0hfCisjZGVmaW5lIEMyQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxDMi5oPgorI2luY2x1ZGUgPEMyQnVmZmVyQmFzZS5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4gLy8gZm9yIEMySW5mbworCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YW5kcm9pZC1DMkJ1ZmZlci5oPgorI2Vsc2UKKwordHlwZWRlZiB2b2lkKiBDMkhhbmRsZTsKKworI2VuZGlmCisKKy8vLyBcZGVmZ3JvdXAgYnVmZmVyIEJ1ZmZlcnMKKy8vLyBAeworCisvLy8gXGRlZmdyb3VwIGJ1ZmZlcl9zeW5jIFN5bmNocm9uaXphdGlvbgorLy8vIEB7CisKKy8qKgorICogU3luY2hyb25pemF0aW9uIGlzIGFjY29tcGxpc2hlZCB1c2luZyBldmVudCBhbmQgZmVuY2Ugb2JqZWN0cy4KKyAqCisgKiBUaGVzZSBhcmUgY3Jvc3MtcHJvY2VzcyBleHRlbnNpb25zIG9mIHByb21pc2UvZnV0dXJlIGluZnJhc3RydWN0dXJlLgorICogRXZlbnRzIGFyZSBhbmFsb2dvdXMgdG8gc3RkOjpwcm9taXNlPHZvaWQ+LCB3aGVyZWFzIGZlbmNlcyBhcmUgdG8gc3RkOjpzaGFyZWRfZnV0dXJlPHZvaWQ+LgorICoKKyAqIEZlbmNlcyBhbmQgZXZlbnRzIGFyZSBzaGFyZWFibGUvY29weWFibGUuCisgKgorICogRmVuY2VzIGFyZSB1c2VkIGluIHR3byBzY2VuYXJpb3MsIGFuZCBhbGwgY29waWVkIGluc3RhbmNlcyByZWZlciB0byB0aGUgc2FtZSBldmVudC4KKyAqIFx0b2RvIGRvIGV2ZW50cyBuZWVkIHRvIGJlIGNvcHlhYmxlIG9yIHNob3VsZCB0aGV5IGJlIHVuaXF1ZT8KKyAqCisgKiBhY3F1aXJlIHN5bmMgZmVuY2Ugb2JqZWN0OiBzaWduYWxlZCB3aGVuIGl0IGlzIHNhZmUgZm9yIHRoZSBjb21wb25lbnQgb3IgY2xpZW50IHRvIGFjY2VzcworICogKHRoZSBjb250ZW50cyBvZikgYW4gb2JqZWN0LgorICoKKyAqIHJlbGVhc2Ugc3luYyBmZW5jZSBvYmplY3Q6IFx0b2RvCisgKgorICogRmVuY2VzIGNhbiBiZSBiYWNrZWQgYnkgaGFyZHdhcmUuIEhhcmR3YXJlIGZlbmNlcyBhcmUgZ3VhcmFudGVlZCB0byBzaWduYWwgTk8gTUFUVEVSIFdIQVQgd2l0aGluCisgKiBhIHNob3J0IChwbGF0Zm9ybSBzcGVjaWZpYykgYW1vdW50IG9mIHRpbWU7IHRoaXMgZ3VhcmFudGVlIGlzIHVzdWFsbHkgbGVzcyB0aGFuIDE1IG1zZWNzLgorICovCisKKy8qKgorICogRmVuY2Ugb2JqZWN0IHVzZWQgYnkgY29tcG9uZW50cyBhbmQgdGhlIGZyYW1ld29yay4KKyAqCisgKiBJbXBsZW1lbnRzIHRoZSB3YWl0aW5nIGZvciBhbiBldmVudCwgYW5hbG9nb3VzIHRvIGEgJ2Z1dHVyZScuCisgKgorICogVG8gYmUgaW1wbGVtZW50ZWQgYnkgdmVuZG9ycyBpZiB1c2luZyBIVyBmZW5jZXMuCisgKi8KK2NsYXNzIEMyRmVuY2UgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFdhaXRzIGZvciBhIGZlbmNlIHRvIGJlIHNpZ25hbGVkIHdpdGggYSB0aW1lb3V0LgorICAgICAqCisgICAgICogXHRvZG8gYSBtZWNoYW5pc20gdG8gY2FuY2VsIGEgd2FpdCAtIGZvciBub3cgdGhlIG9ubHkgd2F5IHRvIGRvIHRoaXMgaXMgdG8gYWJhbmRvbiB0aGUKKyAgICAgKiBldmVudCwgYnV0IGZlbmNlcyBhcmUgc2hhcmVkIHNvIGNhbmNlbGluZyBhIHdhaXQgd2lsbCBjYW5jZWwgYWxsIHdhaXRzLgorICAgICAqCisgICAgICogXHBhcmFtIHRpbWVvdXROcyAgICAgICAgICAgdGhlIG1heGltdW0gdGltZSB0byB3YWl0IGluIG5zZWNzCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIGZlbmNlIGhhcyBiZWVuIHNpZ25hbGVkCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgICAgIHRoZSBmZW5jZSBoYXMgbm90IGJlZW4gc2lnbmFsZWQgd2l0aGluIHRoZSB0aW1lb3V0CisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgICAgIHRoZSBmZW5jZSBoYXMgYmVlbiBhYmFuZG9uZWQgd2l0aG91dCBiZWluZyBzaWduYWxlZCAoaXQgd2lsbCBuZXZlcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBzaWduYWxlZCkKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICAgICAgbm8gcGVybWlzc2lvbiB0byB3YWl0IGZvciB0aGUgZmVuY2UgKHVuZXhwZWN0ZWQgLSBzeXN0ZW0pCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgd2FpdGluZyBmb3IgdGhlIGZlbmNlICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IHdhaXQoYzJfbnNlY3NfdCB0aW1lb3V0TnMpOworCisgICAgLyoqCisgICAgICogVXNlZCB0byBjaGVjayBpZiB0aGlzIGZlbmNlIGlzIHZhbGlkIChpZiB0aGVyZSBpcyBhIGNoYW5jZSBmb3IgaXQgdG8gYmUgc2lnbmFsZWQuKQorICAgICAqIEEgZmVuY2UgYmVjb21lcyBpbnZhbGlkIGlmIHRoZSBjb250cm9saW5nIGV2ZW50IGlzIGRlc3Ryb3llZCB3aXRob3V0IGl0IHNpZ25hbGluZyB0aGUgZmVuY2UuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHdoZXRoZXIgdGhpcyBmZW5jZSBpcyB2YWxpZAorICAgICAqLworICAgIGJvb2wgdmFsaWQoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFVzZWQgdG8gY2hlY2sgaWYgdGhpcyBmZW5jZSBoYXMgYmVlbiBzaWduYWxlZCAoaXMgcmVhZHkpLgorICAgICAqCisgICAgICogXHJldHVybiB3aGV0aGVyIHRoaXMgZmVuY2UgaGFzIGJlZW4gc2lnbmFsZWQKKyAgICAgKi8KKyAgICBib29sIHJlYWR5KCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgZmlsZSBkZXNjcmlwdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gd2FpdCBmb3IgdGhpcyBmZW5jZSBpbiBhIHNlbGVjdCBzeXN0ZW0gY2FsbC4KKyAgICAgKiBcbm90ZSBUaGUgcmV0dXJuZWQgZmlsZSBkZXNjcmlwdG9yLCBpZiB2YWxpZCwgbXVzdCBiZSBjbG9zZWQgYnkgdGhlIGNhbGxlci4KKyAgICAgKgorICAgICAqIFRoaXMgY2FuIGJlIHVzZWQgaW4gZS5nLiBwb2xsKCkgc3lzdGVtIGNhbGxzLiBUaGlzIGZpbGUgYmVjb21lcyByZWFkYWJsZSAoUE9MTElOKSB3aGVuIHRoZQorICAgICAqIGZlbmNlIGlzIHNpZ25hbGVkLCBhbmQgYmFkIChQT0xMRVJSKSBpZiB0aGUgZmVuY2UgaXMgYWJhbmRvbmVkLgorICAgICAqCisgICAgICogXHJldHVybiBhIGZpbGUgZGVzY3JpcHRvciByZXByZXNlbnRpbmcgdGhpcyBmZW5jZSAod2l0aCBvd25lcnNoaXApLCBvciAtMSBpZiB0aGUgZmVuY2UKKyAgICAgKiBoYXMgYWxyZWFkeSBiZWVuIHNpZ25hbGVkIChcdG9kbyBvciBhYmFuZG9uZWQpLgorICAgICAqCisgICAgICogXHRvZG8gdGhpcyBtdXN0IGJlIGNvbXBhdGlibGUgd2l0aCBmZW5jZXMgdXNlZCBieSBncmFsbG9jCisgICAgICovCisgICAgaW50IGZkKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmZW5jZSBpcyBhIGhhcmR3YXJlLWJhY2tlZCBmZW5jZS4KKyAgICAgKiBccmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIGhhcmR3YXJlIGZlbmNlCisgICAgICovCisgICAgYm9vbCBpc0hXKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBOdWxsLWZlbmNlLiBBIGZlbmNlIHRoYXQgaGFzIGZpcmVkLgorICAgICAqLworICAgIGNvbnN0ZXhwciBDMkZlbmNlKCkgOiBtSW1wbChudWxscHRyKSB7IH0KKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKyAgICBDMkZlbmNlKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKTsKKyAgICBmcmllbmQgc3RydWN0IF9DMkZlbmNlRmFjdG9yeTsKK307CisKKy8qKgorICogRXZlbnQgb2JqZWN0IHVzZWQgYnkgY29tcG9uZW50cyBhbmQgdGhlIGZyYW1ld29yay4KKyAqCisgKiBJbXBsZW1lbnRzIHRoZSBzaWduYWxpbmcgb2YgYW4gZXZlbnQsIGFuYWxvZ291cyB0byBhICdwcm9taXNlJy4KKyAqCisgKiBIYXJkd2FyZSBiYWNrZWQgZXZlbnRzIGRvIG5vdCBnbyB0aHJvdWdoIHRoaXMgb2JqZWN0LCBhbmQgbXVzdCBiZSBleHBvc2VkIGRpcmVjdGx5IGFzIGZlbmNlcworICogYnkgdmVuZG9ycy4KKyAqLworY2xhc3MgQzJFdmVudCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGZlbmNlIGZvciB0aGlzIGV2ZW50LgorICAgICAqLworICAgIEMyRmVuY2UgZmVuY2UoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFNpZ25hbHMgKGFsbCkgYXNzb2NpYXRlZCBmZW5jZShzKS4KKyAgICAgKiBUaGlzIGhhcyBubyBlZmZlY3Qgbm8gZWZmZWN0IGlmIHRoZSBldmVudCB3YXMgYWxyZWFkeSBzaWduYWxlZCBvciBhYmFuZG9uZWQuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIGZlbmNlKHMpIHdlcmUgc3VjY2Vzc2Z1bGx5IHNpZ25hbGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgICAgIHRoZSBmZW5jZShzKSBoYXZlIGFscmVhZHkgYmVlbiBhYmFuZG9uZWQgb3IgbWVyZ2VkIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgICAgIHRoZSBmZW5jZShzKSBoYXZlIGFscmVhZHkgYmVlbiBzaWduYWxlZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgICAgICBubyBwZXJtaXNzaW9uIHRvIHNpZ25hbCB0aGUgZmVuY2UgKHVuZXhwZWN0ZWQgLSBzeXN0ZW0pCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgc2lnbmFsaW5nIHRoZSBmZW5jZShzKSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBmaXJlKCk7CisKKyAgICAvKioKKyAgICAgKiBUcmlnZ2VyIHRoaXMgZXZlbnQgZnJvbSB0aGUgbWVyZ2luZyBvZiB0aGUgc3VwcGxpZWQgZmVuY2VzLiBUaGlzIG1lYW5zIHRoYXQgaXQgd2lsbCBiZQorICAgICAqIGFiYW5kb25lZCBpZiBhbnkgb2YgdGhlc2UgZmVuY2VzIGhhdmUgYmVlbiBhYmFuZG9uZWQsIGFuZCBpdCB3aWxsIGJlIGZpcmVkIGlmIGFsbCBvZiB0aGVzZQorICAgICAqIGZlbmNlcyBoYXZlIGJlZW4gc2lnbmFsZWQuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIG1lcmdpbmcgd2FzIHN1Y2Nlc3NmdWxseSBkb25lCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgICAgIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHBlcmZvcm0gdGhlIG1lcmdpbmcKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSAgICAgdGhlIGZlbmNlIGhhdmUgYWxyZWFkeSBiZWVuIG1lcmdlZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFICAgICB0aGUgZmVuY2UgaGF2ZSBhbHJlYWR5IGJlZW4gc2lnbmFsZWQgb3IgYWJhbmRvbmVkIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgICAgIG5vIHBlcm1pc3Npb24gdG8gbWVyZ2UgdGhlIGZlbmNlICh1bmV4cGVjdGVkIC0gc3lzdGVtKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEICAgICBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIG1lcmdpbmcgdGhlIGZlbmNlKHMpICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IG1lcmdlKHN0ZDo6dmVjdG9yPEMyRmVuY2U+IGZlbmNlcyk7CisKKyAgICAvKioKKyAgICAgKiBBYmFuZG9ucyB0aGUgZXZlbnQgYW5kIGFueSBhc3NvY2lhdGVkIGZlbmNlKHMpLgorICAgICAqIFxub3RlIENhbGwgdGhpcyB0byBleHBsaWNpdGx5IGFiYW5kb24gYW4gZXZlbnQgYmVmb3JlIGl0IGlzIGRlc3RydWN0ZWQgdG8gYXZvaWQgYSB3YXJuaW5nLgorICAgICAqCisgICAgICogVGhpcyBoYXMgbm8gZWZmZWN0IG5vIGVmZmVjdCBpZiB0aGUgZXZlbnQgd2FzIGFscmVhZHkgc2lnbmFsZWQgb3IgYWJhbmRvbmVkLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBmZW5jZShzKSB3ZXJlIHN1Y2Nlc3NmdWxseSBzaWduYWxlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFICAgICB0aGUgZmVuY2UocykgaGF2ZSBhbHJlYWR5IGJlZW4gc2lnbmFsZWQgb3IgbWVyZ2VkIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgICAgIHRoZSBmZW5jZShzKSBoYXZlIGFscmVhZHkgYmVlbiBhYmFuZG9uZWQgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICAgICAgbm8gcGVybWlzc2lvbiB0byBhYmFuZG9uIHRoZSBmZW5jZSAodW5leHBlY3RlZCAtIHN5c3RlbSkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCAgICAgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBzaWduYWxpbmcgdGhlIGZlbmNlKHMpICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IGFiYW5kb24oKTsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8vLyBcYWRkdG9ncm91cCBidWZfaW50ZXJuYWwgSW50ZXJuYWwKKy8vLyBAeworCisvKioKKyAqIEludGVyZmFjZSBmb3Igb2JqZWN0cyB0aGF0IGVuY2Fwc3VsYXRlIGFuIHVwZGF0YWJsZSBzdGF0dXMgdmFsdWUuCisgKi8KK3N0cnVjdCBfQzJJbm5hdGVTdGF0dXMgeworICAgIGlubGluZSBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdCB7IHJldHVybiBtU3RhdHVzOyB9CisKK3Byb3RlY3RlZDoKKyAgICBfQzJJbm5hdGVTdGF0dXMoYzJfc3RhdHVzX3Qgc3RhdHVzKSA6IG1TdGF0dXMoc3RhdHVzKSB7IH0KKworICAgIGMyX3N0YXR1c190IG1TdGF0dXM7IC8vIHRoaXMgc3RhdHVzIGlzIHVwZGF0YWJsZSBieSB0aGUgb2JqZWN0Cit9OworCisvLy8gQH0KKworLyoqCisgKiBUaGlzIGlzIGEgdXRpbGl0eSB0ZW1wbGF0ZSBmb3Igb2JqZWN0cyBwcm90ZWN0ZWQgYnkgYW4gYWNxdWlyZSBmZW5jZSwgc28gdGhhdCBlcnJvcnMgZHVyaW5nCisgKiBhY3F1aXJpbmcgdGhlIG9iamVjdCBhcmUgcHJvcGFnYXRlZCB0byB0aGUgb2JqZWN0IGl0c2VsZi4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIEMyQWNxdWlyYWJsZSA6IHB1YmxpYyBDMkZlbmNlIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBY3F1aXJlcyB0aGUgb2JqZWN0IHByb3RlY3RlZCBieSBhbiBhY3F1aXJlIGZlbmNlLiBBbnkgZXJyb3JzIGR1cmluZyB0aGUgbWFwcGluZyB3aWxsIGJlCisgICAgICogcGFzc2VkIHRvIHRoZSBvYmplY3QuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGFjcXVpcmVkIG9iamVjdCBwb3RlbnRpYWxseSBpbnZhbGlkYXRlZCBpZiB3YWl0aW5nIGZvciB0aGUgZmVuY2UgZmFpbGVkLgorICAgICAqLworICAgIFQgZ2V0KCkgeworICAgICAgICAvLyBUT0RPOgorICAgICAgICAvLyB3YWl0KCk7CisgICAgICAgIHJldHVybiBtVDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBDMkFjcXVpcmFibGUoYzJfc3RhdHVzX3QgZXJyb3IsIEMyRmVuY2UgZmVuY2UsIFQgdCkgOiBDMkZlbmNlKGZlbmNlKSwgbUluaXRpYWxFcnJvcihlcnJvciksIG1UKHQpIHsgfQorCitwcml2YXRlOgorICAgIGMyX3N0YXR1c190IG1Jbml0aWFsRXJyb3I7CisgICAgVCBtVDsgLy8gVE9ETzogbW92ZSBpbnN0ZWFkIG9mIGNvcHkKK307CisKKy8vLyBAfQorCisvLy8gXGRlZmdyb3VwIGxpbmVhciBMaW5lYXIgRGF0YSBCbG9ja3MKKy8vLyBAeworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgTElORUFSIEFTUEVDVFMsIEJMT0NLUyBBTkQgVklFV1MKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioKKyAqIEJhc2ljIHNlZ21lbnQgbWF0aCBzdXBwb3J0LgorICovCitzdHJ1Y3QgQzJTZWdtZW50IHsKKyAgICB1aW50MzJfdCBvZmZzZXQ7CisgICAgdWludDMyX3Qgc2l6ZTsKKworICAgIGlubGluZSBjb25zdGV4cHIgQzJTZWdtZW50KHVpbnQzMl90IG9mZnNldF8sIHVpbnQzMl90IHNpemVfKQorICAgICAgICA6IG9mZnNldChvZmZzZXRfKSwKKyAgICAgICAgICBzaXplKHNpemVfKSB7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzRW1wdHkoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzaXplID09IDA7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBvZmZzZXQgPD0gfnNpemU7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBvcGVyYXRvciBib29sKCkgY29uc3QgeworICAgICAgICByZXR1cm4gaXNWYWxpZCgpICYmICFpc0VtcHR5KCk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFib29sKCp0aGlzKTsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBjb250YWlucyhjb25zdCBDMlNlZ21lbnQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIGlmICghaXNWYWxpZCgpIHx8ICFvdGhlci5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBvZmZzZXQgPD0gb3RoZXIub2Zmc2V0CisgICAgICAgICAgICAgICAgICAgICYmIG9mZnNldCArIHNpemUgPj0gb3RoZXIub2Zmc2V0ICsgb3RoZXIuc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAhb3RoZXIuaXNWYWxpZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG9mZnNldCA9PSBvdGhlci5vZmZzZXQgJiYgc2l6ZSA9PSBvdGhlci5zaXplOworICAgICAgICB9CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgQzJTZWdtZW50ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0ob3RoZXIpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKG90aGVyKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I+KGNvbnN0IEMyU2VnbWVudCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zKG90aGVyKSAmJiAhb3BlcmF0b3I9PShvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPD0oY29uc3QgQzJTZWdtZW50ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gb3RoZXIuY29udGFpbnMoKnRoaXMpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwoY29uc3QgQzJTZWdtZW50ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gb3RoZXIuY29udGFpbnMoKnRoaXMpICYmICFvcGVyYXRvcj09KG90aGVyKTsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgZW5kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gb2Zmc2V0ICsgc2l6ZTsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgQzJTZWdtZW50IGludGVyc2VjdChjb25zdCBDMlNlZ21lbnQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlNlZ21lbnQoYzJfbWF4KG9mZnNldCwgb3RoZXIub2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjMl9taW4oZW5kKCksIG90aGVyLmVuZCgpKSAtIGMyX21heChvZmZzZXQsIG90aGVyLm9mZnNldCkpOworICAgIH0KKworICAgIC8qKiBjbGFtcHMgZW5kIHRvIG9mZnNldCBpZiBpdCBvdmVyZmxvd3MgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIEMyU2VnbWVudCBub3JtYWxpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlNlZ21lbnQob2Zmc2V0LCBjMl9tYXgob2Zmc2V0LCBlbmQoKSkgLSBvZmZzZXQpOworICAgIH0KKworICAgIC8qKiBjbGFtcHMgZW5kIHRvIG1heCBpZiBpdCBvdmVyZmxvd3MgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIEMyU2VnbWVudCBzYXR1cmF0ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyU2VnbWVudChvZmZzZXQsIGMyX21pbihzaXplLCB+b2Zmc2V0KSk7CisgICAgfQorCit9OworCisvKioKKyAqIENvbW1vbiBhc3BlY3QgZm9yIGFsbCBvYmplY3RzIHRoYXQgaGF2ZSBhIGxpbmVhciBjYXBhY2l0eS4KKyAqLworY2xhc3MgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworLy8vIFxuYW1lIExpbmVhciBjYXBhY2l0eSBpbnRlcmZhY2UKKy8vLyBAeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgY2FwYWNpdHkoKSBjb25zdCB7IHJldHVybiBtQ2FwYWNpdHk7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgb3BlcmF0b3IgQzJTZWdtZW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJTZWdtZW50KDAsIG1DYXBhY2l0eSk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisKKyNpZiBVSU5UUFRSX01BWCA9PSAweGZmZmZmZmZmCisgICAgc3RhdGljX2Fzc2VydChzaXplb2Yoc2l6ZV90KSA9PSBzaXplb2YodWludDMyX3QpLCAic2l6ZV90IGlzIHRvbyBiaWciKTsKKyNlbHNlCisgICAgc3RhdGljX2Fzc2VydChzaXplb2Yoc2l6ZV90KSA+IHNpemVvZih1aW50MzJfdCksICJzaXplX3QgaXMgdG9vIHNtYWxsIik7CisgICAgLy8gZXhwbGljaXRseSBkaXNhYmxlIGNvbnN0cnVjdGlvbiBmcm9tIHNpemVfdAorICAgIGlubGluZSBleHBsaWNpdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChzaXplX3QgY2FwYWNpdHkpID0gZGVsZXRlOworI2VuZGlmCisKKyAgICBpbmxpbmUgZXhwbGljaXQgY29uc3RleHByIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KHVpbnQzMl90IGNhcGFjaXR5KQorICAgICAgOiBtQ2FwYWNpdHkoY2FwYWNpdHkpIHsgfQorCisgICAgaW5saW5lIGV4cGxpY2l0IGNvbnN0ZXhwciBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChjb25zdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50KQorICAgICAgICA6IG1DYXBhY2l0eShwYXJlbnQgPT0gbnVsbHB0ciA/IDAgOiBwYXJlbnQtPmNhcGFjaXR5KCkpIHsgfQorCitwcml2YXRlOgorICAgIHVpbnQzMl90IG1DYXBhY2l0eTsKKy8vLyBAfQorfTsKKworLyoqCisgKiBBc3BlY3QgZm9yIG9iamVjdHMgdGhhdCBoYXZlIGEgbGluZWFyIHJhbmdlIGluc2lkZSBhIGxpbmVhciBjYXBhY2l0eS4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlLgorICovCitjbGFzcyBfQzJMaW5lYXJSYW5nZUFzcGVjdCA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7CisvLy8gXG5hbWUgTGluZWFyIHJhbmdlIGludGVyZmFjZQorLy8vIEB7CitwdWJsaWM6CisgICAgaW5saW5lIGNvbnN0ZXhwciB1aW50MzJfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBtT2Zmc2V0OyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciB1aW50MzJfdCBlbmRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBtT2Zmc2V0ICsgbVNpemU7IH0KKyAgICBpbmxpbmUgY29uc3RleHByIHVpbnQzMl90IHNpemUoKSBjb25zdCB7IHJldHVybiBtU2l6ZTsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBvcGVyYXRvciBDMlNlZ21lbnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlNlZ21lbnQobU9mZnNldCwgbVNpemUpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBzdWJyYW5nZSBvZiBjYXBhY2l0eSBbMCwgY2FwYWNpdHldICYgW3NpemUsIHNpemUgKyBvZmZzZXRdCisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJMaW5lYXJSYW5nZUFzcGVjdCh1aW50MzJfdCBjYXBhY2l0eV8sIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KGNhcGFjaXR5XyksCisgICAgICAgICAgbU9mZnNldChjMl9taW4ob2Zmc2V0LCBjYXBhY2l0eSgpKSksCisgICAgICAgICAgbVNpemUoYzJfbWluKHNpemUsIGNhcGFjaXR5KCkgLSBtT2Zmc2V0KSkgeworICAgIH0KKworcHJvdGVjdGVkOgorICAgIC8vIGNvcHkgY29uc3RydWN0b3IgKG5vIGVycm9yIGNoZWNrKQorICAgIGlubGluZSBjb25zdGV4cHIgX0MyTGluZWFyUmFuZ2VBc3BlY3QoY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJm90aGVyKQorICAgICAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KG90aGVyLmNhcGFjaXR5KCkpLAorICAgICAgICAgIG1PZmZzZXQob3RoZXIub2Zmc2V0KCkpLAorICAgICAgICAgIG1TaXplKG90aGVyLnNpemUoKSkgeworICAgIH0KKworICAgIC8vIHBhcmVudCBjYXBhY2l0eSByYW5nZSBbMCwgY2FwYWNpdHldCisgICAgaW5saW5lIGNvbnN0ZXhwciBleHBsaWNpdCBfQzJMaW5lYXJSYW5nZUFzcGVjdChjb25zdCBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCAqcGFyZW50KQorICAgICAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KHBhcmVudCksCisgICAgICAgICAgbU9mZnNldCgwKSwKKyAgICAgICAgICBtU2l6ZShjYXBhY2l0eSgpKSB7CisgICAgfQorCisgICAgLy8gc3VicmFuZ2Ugb2YgcGFyZW50IGNhcGFjaXR5IFswLCBjYXBhY2l0eV0gJiBbc2l6ZSwgc2l6ZSArIG9mZnNldF0KKyAgICBpbmxpbmUgY29uc3RleHByIF9DMkxpbmVhclJhbmdlQXNwZWN0KGNvbnN0IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0ICpwYXJlbnQsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KHBhcmVudCksCisgICAgICAgICAgbU9mZnNldChjMl9taW4ob2Zmc2V0LCBjYXBhY2l0eSgpKSksCisgICAgICAgICAgbVNpemUoYzJfbWluKHNpemUsIGNhcGFjaXR5KCkgLSBtT2Zmc2V0KSkgeworICAgIH0KKworICAgIC8vIHN1YnNlY3Rpb24gb2YgdGhlIHBhcmVudCdzIGFuZCBbb2Zmc2V0LCBvZmZzZXQgKyBzaXplXSByYW5nZXMKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMkxpbmVhclJhbmdlQXNwZWN0KGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICpwYXJlbnQsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KHBhcmVudCksCisgICAgICAgICAgbU9mZnNldChjMl9taW4oYzJfbWF4KG9mZnNldCwgcGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT5vZmZzZXQoKSksIGNhcGFjaXR5KCkpKSwKKyAgICAgICAgICBtU2l6ZShzdGQ6Om1pbihjMl9taW4oc2l6ZSwgcGFyZW50ID09IG51bGxwdHIgPyAwIDogcGFyZW50LT5zaXplKCkpLCBjYXBhY2l0eSgpIC0gbU9mZnNldCkpIHsKKyAgICB9CisKK3B1YmxpYzoKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMkxpbmVhclJhbmdlQXNwZWN0IGNoaWxkUmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9DMkxpbmVhclJhbmdlQXNwZWN0KAorICAgICAgICAgICAgbVNpemUsCisgICAgICAgICAgICBjMl9taW4oYzJfbWF4KG9mZnNldCwgbU9mZnNldCksIGNhcGFjaXR5KCkpIC0gbU9mZnNldCwKKyAgICAgICAgICAgIGMyX21pbihjMl9taW4oc2l6ZSwgbVNpemUpLCBjYXBhY2l0eSgpIC0gYzJfbWluKGMyX21heChvZmZzZXQsIG1PZmZzZXQpLCBjYXBhY2l0eSgpKSkpOworICAgIH0KKworICAgIGZyaWVuZCBjbGFzcyBfQzJFZGl0YWJsZUxpbmVhclJhbmdlQXNwZWN0OworICAgIC8vIGludmFyaWFudHMgMCA8PSBtT2Zmc2V0IDw9IG1PZmZzZXQgKyBtU2l6ZSA8PSBjYXBhY2l0eSgpCisgICAgdWludDMyX3QgbU9mZnNldDsKKyAgICB1aW50MzJfdCBtU2l6ZTsKKy8vLyBAfQorfTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBzYWZlIHJhbmdlIGNhbGN1bGF0aW9ucyB1c2luZyBzaXplX3Qtcy4KKyAqLworY2xhc3MgQzJMaW5lYXJSYW5nZSA6IHB1YmxpYyBfQzJMaW5lYXJSYW5nZUFzcGVjdCB7CitwdWJsaWM6CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkxpbmVhclJhbmdlKGNvbnN0IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0ICZwYXJlbnQsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9DMkxpbmVhclJhbmdlQXNwZWN0KCZwYXJlbnQsIG9mZnNldCwgc2l6ZSkgeyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIEMyTGluZWFyUmFuZ2UoY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnBhcmVudCwgc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpCisgICAgICAgIDogX0MyTGluZWFyUmFuZ2VBc3BlY3QoJnBhcmVudCwgb2Zmc2V0LCBzaXplKSB7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgQzJMaW5lYXJSYW5nZSBpbnRlcnNlY3Qoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyTGluZWFyUmFuZ2UoKnRoaXMsIG9mZnNldCwgc2l6ZSk7CisgICAgfQorfTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIGZvciBzaW1wbGUgYW5kIHNhZmUgY2FwYWNpdHkgYW5kIHJhbmdlIGNvbnN0cnVjdGlvbi4KKyAqLworY2xhc3MgQzJMaW5lYXJDYXBhY2l0eSA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7CitwdWJsaWM6CisgICAgaW5saW5lIGNvbnN0ZXhwciBleHBsaWNpdCBDMkxpbmVhckNhcGFjaXR5KHNpemVfdCBjYXBhY2l0eSkKKyAgICAgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChjMl9taW4oY2FwYWNpdHksIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSkpIHsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkxpbmVhclJhbmdlIHJhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMkxpbmVhclJhbmdlKCp0aGlzLCBvZmZzZXQsIHNpemUpOworICAgIH0KK307CisKKy8qKgorICogQXNwZWN0IGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhbiBlZGl0YWJsZSBsaW5lYXIgcmFuZ2UuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4KKyAqLworY2xhc3MgX0MyRWRpdGFibGVMaW5lYXJSYW5nZUFzcGVjdCA6IHB1YmxpYyBfQzJMaW5lYXJSYW5nZUFzcGVjdCB7CisgICAgdXNpbmcgX0MyTGluZWFyUmFuZ2VBc3BlY3Q6Ol9DMkxpbmVhclJhbmdlQXNwZWN0OworCitwdWJsaWM6CisvLy8gXG5hbWUgRWRpdGFibGUgbGluZWFyIHJhbmdlIGludGVyZmFjZQorLy8vIEB7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBvZmZzZXQgdG8gfG9mZnNldHwsIHdoaWxlIHRyeWluZyB0byBrZWVwIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB1bmNoYW5nZWQgKGUuZy4KKyAgICAgKiBzaXplIHdpbGwgZ3JvdyBpZiBvZmZzZXQgaXMgZGVjcmVhc2VkLCBhbmQgbWF5IHNocmluayBpZiBvZmZzZXQgaXMgaW5jcmVhc2VkLikgUmV0dXJucworICAgICAqIHRydWUgaWYgc3VjY2Vzc2Z1bCwgd2hpY2ggaXMgZXF1aXZhbGVudCB0byBpZiAwIDw9IHxvZmZzZXR8IDw9IGNhcGFjaXR5KCkuCisgICAgICoKKyAgICAgKiBOb3RlOiBzZXR0aW5nIG9mZnNldCBhbmQgc2l6ZSB3aWxsIHlpZWxkIGRpZmZlcmVudCByZXN1bHQgZGVwZW5kaW5nIG9uIHRoZSBvcmRlciBvZiB0aGUKKyAgICAgKiBvcGVyYXRpb25zLiBBbHdheXMgc2V0IG9mZnNldCBmaXJzdCB0byBlbnN1cmUgcHJvcGVyIHNpemUuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgc2V0T2Zmc2V0KHVpbnQzMl90IG9mZnNldCkgeworICAgICAgICBpZiAob2Zmc2V0ID4gY2FwYWNpdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9mZnNldCA+IG1PZmZzZXQgKyBtU2l6ZSkgeworICAgICAgICAgICAgbVNpemUgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVNpemUgPSBtT2Zmc2V0ICsgbVNpemUgLSBvZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgbU9mZnNldCA9IG9mZnNldDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2l6ZSB0byB8c2l6ZXwuIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLCB3aGljaCBpcyBlcXVpdmFsZW50IHRvCisgICAgICogaWYgMCA8PSB8c2l6ZXwgPD0gY2FwYWNpdHkoKSAtIG9mZnNldCgpLgorICAgICAqCisgICAgICogTm90ZTogc2V0dGluZyBvZmZzZXQgYW5kIHNpemUgd2lsbCB5aWVsZCBkaWZmZXJlbnQgcmVzdWx0IGRlcGVuZGluZyBvbiB0aGUgb3JkZXIgb2YgdGhlCisgICAgICogb3BlcmF0aW9ucy4gQWx3YXlzIHNldCBvZmZzZXQgZmlyc3QgdG8gZW5zdXJlIHByb3BlciBzaXplLgorICAgICAqLworICAgIGlubGluZSBib29sIHNldFNpemUodWludDMyX3Qgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA+IGNhcGFjaXR5KCkgLSBtT2Zmc2V0KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtU2l6ZSA9IHNpemU7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFNldHMgdGhlIG9mZnNldCB0byB8b2Zmc2V0fCB3aXRoIGJlc3QgZWZmb3J0LiBTYW1lIGFzIHNldE9mZnNldCgpIGV4Y2VwdCB0aGF0IG9mZnNldCB3aWxsCisgICAgICogYmUgY2xhbXBlZCB0byB0aGUgYnVmZmVyIGNhcGFjaXR5LgorICAgICAqCisgICAgICogTm90ZTogc2V0dGluZyBvZmZzZXQgYW5kIHNpemUgKGV2ZW4gdXNpbmcgYmVzdCBlZmZvcnQpIHdpbGwgeWllbGQgZGlmZmVyZW50IHJlc3VsdCBkZXBlbmRpbmcKKyAgICAgKiBvbiB0aGUgb3JkZXIgb2YgdGhlIG9wZXJhdGlvbnMuIEFsd2F5cyBzZXQgb2Zmc2V0IGZpcnN0IHRvIGVuc3VyZSBwcm9wZXIgc2l6ZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBzZXRPZmZzZXRfYmUodWludDMyX3Qgb2Zmc2V0KSB7CisgICAgICAgICh2b2lkKXNldE9mZnNldChjMl9taW4ob2Zmc2V0LCBjYXBhY2l0eSgpKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgc2l6ZSB0byB8c2l6ZXwgd2l0aCBiZXN0IGVmZm9ydC4gU2FtZSBhcyBzZXRTaXplKCkgZXhjZXB0IHRoYXQgdGhlIHNlbGVjdGVkIHJlZ2lvbgorICAgICAqIHdpbGwgYmUgY2xhbXBlZCB0byB0aGUgYnVmZmVyIGNhcGFjaXR5IChlLmcuIHNpemUgaXMgY2xhbXBlZCB0byBbMCwgY2FwYWNpdHkoKSAtIG9mZnNldCgpXSkuCisgICAgICoKKyAgICAgKiBOb3RlOiBzZXR0aW5nIG9mZnNldCBhbmQgc2l6ZSAoZXZlbiB1c2luZyBiZXN0IGVmZm9ydCkgd2lsbCB5aWVsZCBkaWZmZXJlbnQgcmVzdWx0IGRlcGVuZGluZworICAgICAqIG9uIHRoZSBvcmRlciBvZiB0aGUgb3BlcmF0aW9ucy4gQWx3YXlzIHNldCBvZmZzZXQgZmlyc3QgdG8gZW5zdXJlIHByb3BlciBzaXplLgorICAgICAqLworICAgIGlubGluZSB2b2lkIHNldFNpemVfYmUodWludDMyX3Qgc2l6ZSkgeworICAgICAgICBtU2l6ZSA9IGMyX21pbihzaXplLCBjYXBhY2l0eSgpIC0gbU9mZnNldCk7CisgICAgfQorLy8vIEB9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgQUxMT0NBVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLy8gXGluZ3JvdXAgYWxsb2NhdG9yIEFsbG9jYXRpb24gYW5kIG1lbW9yeSBwbGFjZW1lbnQKKy8vLyBAeworCitjbGFzcyBDMkxpbmVhckFsbG9jYXRpb247CitjbGFzcyBDMkdyYXBoaWNBbGxvY2F0aW9uOworCisvKioKKyAqICBBbGxvY2F0b3JzIGFyZSB1c2VkIGJ5IHRoZSBmcmFtZXdvcmsgdG8gYWxsb2NhdGUgbWVtb3J5IChhbGxvY2F0aW9ucykgZm9yIGJ1ZmZlcnMuIFRoZXkgY2FuCisgKiAgc3VwcG9ydCBlaXRoZXIgMUQgb3IgMkQgYWxsb2NhdGlvbnMuCisgKgorICogIFxub3RlIEluIHRoZW9yeSB0aGV5IGNvdWxkIHN1cHBvcnQgYm90aCwgYnV0IGluIHByYWN0aWNlLCB3ZSB3aWxsIHVzZSBvbmx5IG9uZSBvciB0aGUgb3RoZXIuCisgKgorICogIE5ldmVyIGNvbnN0cnVjdGVkIG9uIHN0YWNrLgorICoKKyAqICBBbGxvY2F0b3JzIGFyZSBwcm92aWRlZCBieSB2ZW5kb3JzLgorICovCitjbGFzcyBDMkFsbG9jYXRvciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQWxsb2NhdG9yIElEIHR5cGUuCisgICAgICovCisgICAgdHlwZWRlZiB1aW50MzJfdCBpZF90OworICAgIGVudW0gOiBpZF90IHsKKyAgICAgICAgQkFEX0lEID0gMHhCQURELCAvLyBpbnZhbGlkIGFsbG9jYXRvciBJRAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0aW9uIHR5cGVzLiBUaGlzIGlzIGEgYml0bWFzayBhbmQgaXMgdXNlZCBpbiBDMkFsbG9jYXRvcjo6SW5mbworICAgICAqIHRvIGxpc3QgdGhlIHN1cHBvcnRlZCBhbGxvY2F0aW9uIHR5cGVzIG9mIGFuIGFsbG9jYXRvci4KKyAgICAgKi8KKyAgICBlbnVtIHR5cGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgTElORUFSICA9IDEgPDwgMCwgLy8KKyAgICAgICAgR1JBUEhJQyA9IDEgPDwgMSwKKyAgICB9OworCisgICAgLyoqCisgICAgICogSW5mb3JtYXRpb24gYWJvdXQgYW4gYWxsb2NhdG9yLgorICAgICAqCisgICAgICogQWxsb2NhdG9ycyBkb24ndCBoYXZlIGEgcXVlcnkgQVBJIHNvIGFsbCBxdWVyaWFibGUgaW5mb3JtYXRpb24gaXMgc3RvcmVkIGhlcmUuCisgICAgICovCisgICAgc3RydWN0IFRyYWl0cyB7CisgICAgICAgIEMyU3RyaW5nIG5hbWU7ICAgICAgICAgICAgICAvLy88IGFsbG9jYXRvciBuYW1lCisgICAgICAgIGlkX3QgaWQ7ICAgICAgICAgICAgICAgICAgICAvLy88IGFsbG9jYXRvciBJRAorICAgICAgICB0eXBlX3Qgc3VwcG9ydGVkVHlwZXM7ICAgICAgLy8vPCBzdXBwb3J0ZWQgYWxsb2NhdGlvbiB0eXBlcworICAgICAgICBDMk1lbW9yeVVzYWdlIG1pbmltdW1Vc2FnZTsgLy8vPCB1c2FnZSB0aGF0IGlzIG1pbmltYWxseSByZXF1aXJlZCBmb3IgYWxsb2NhdGlvbnMKKyAgICAgICAgQzJNZW1vcnlVc2FnZSBtYXhpbXVtVXNhZ2U7IC8vLzwgdXNhZ2UgdGhhdCBpcyBtYXhpbWFsbHkgYWxsb3dlZCBmb3IgYWxsb2NhdGlvbnMKKyAgICB9OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdW5pcXVlIG5hbWUgb2YgdGhpcyBhbGxvY2F0b3IuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBhbGxvY2F0b3IuCisgICAgICogXHJldHZhbCBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBhY3R1YWwgbmFtZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIElEIGZvciB0aGlzIGFsbG9jYXRvci4gVGhpcyBJRCBpcyB1c2VkIHRvIGdldCB0aGlzIGFsbG9jYXRvciBmcm9tIHRoZQorICAgICAqIGFsbG9jYXRvciBzdG9yZSwgYW5kIHRvIGlkZW50aWZ5IHRoaXMgYWxsb2NhdG9yIGFjcm9zcyBhbGwgcHJvY2Vzc2VzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgdW5pcXVlIElEIGZvciB0aGlzIGFsbG9jYXRvci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGlkX3QgZ2V0SWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGxvY2F0b3IgdHJhaXRzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBBbGxvY2F0b3JzIGRvbid0IGhhdmUgYSBmdWxsLWZsZWRnZWQgcXVlcnkgQVBJLCBvbmx5IHRoaXMgbWV0aG9kLgorICAgICAqCisgICAgICogXHJldHVybiBhbGxvY2F0b3IgaW5mb3JtYXRpb24KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUcmFpdHM+IGdldFRyYWl0cygpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEFsbG9jYXRlcyBhIDFEIGFsbG9jYXRpb24gb2YgZ2l2ZW4gfGNhcGFjaXR5fCBhbmQgfHVzYWdlfC4gSWYgc3VjY2Vzc2Z1bCwgdGhlIGFsbG9jYXRpb24gaXMKKyAgICAgKiBzdG9yZWQgaW4gfGFsbG9jYXRpb258LiBPdGhlcndpc2UsIHxhbGxvY2F0aW9ufCBpcyBzZXQgdG8gJ251bGxwdHInLgorICAgICAqCisgICAgICogXHBhcmFtIGNhcGFjaXR5ICAgICAgdGhlIHNpemUgb2YgcmVxdWVzdGVkIGFsbG9jYXRpb24gKHRoZSBhbGxvY2F0aW9uIGNvdWxkIGJlIHNsaWdodGx5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgbGFyZ2VyLCBlLmcuIHRvIGFjY291bnQgZm9yIGFueSBzeXN0ZW0tcmVxdWlyZWQgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSB1c2FnZSAgICAgICAgIHRoZSBtZW1vcnkgdXNhZ2UgaW5mbyBmb3IgdGhlIHJlcXVlc3RlZCBhbGxvY2F0aW9uLiBcbm90ZSB0aGF0IHRoZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHJldHVybmVkIGFsbG9jYXRpb24gbWF5IGJlIGxhdGVyIHVzZWQvbWFwcGVkIHdpdGggZGlmZmVyZW50IHVzYWdlLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFRoZSBhbGxvY2F0b3Igc2hvdWxkIGxheW91dCB0aGUgYnVmZmVyIHRvIGJlIG9wdGltaXplZCBmb3IgdGhpcyB1c2FnZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBidXQgbXVzdCBzdXBwb3J0IGFueSB1c2FnZS4gT25lIGV4Y2VwdGlvbjogcHJvdGVjdGVkIGJ1ZmZlcnMgY2FuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb25seSBiZSB1c2VkIGluIGEgcHJvdGVjdGVkIHNjZW5hcmlvLgorICAgICAqIFxwYXJhbSBhbGxvY2F0aW9uICAgIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGFsbG9jYXRpb24gc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBhbGxvY2F0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgYWxsb2NhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgY2FwYWNpdHkgb3IgdXNhZ2UgYXJlIG5vdCBzdXBwb3J0ZWQgKGludmFsaWQpIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBhbGxvY2F0b3IgZG9lcyBub3Qgc3VwcG9ydCAxRCBhbGxvY2F0aW9ucworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyBhbGxvY2F0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbmV3TGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5IF9fdW51c2VkLCBDMk1lbW9yeVVzYWdlIHVzYWdlIF9fdW51c2VkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24gLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIChSZSljcmVhdGVzIGEgMUQgYWxsb2NhdGlvbiBmcm9tIGEgbmF0aXZlIHxoYW5kbGV8LiBJZiBzdWNjZXNzZnVsLCB0aGUgYWxsb2NhdGlvbiBpcyBzdG9yZWQKKyAgICAgKiBpbiB8YWxsb2NhdGlvbnwuIE90aGVyd2lzZSwgfGFsbG9jYXRpb258IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gaGFuZGxlICAgICAgdGhlIGhhbmRsZSBmb3IgdGhlIGV4aXN0aW5nIGFsbG9jYXRpb24uIE9uIHN1Y2Nlc3MsIHRoZSBhbGxvY2F0aW9uIHdpbGwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgdGFrZSBvd25lcnNoaXAgb2YgfGhhbmRsZXwuCisgICAgICogXHBhcmFtIGFsbG9jYXRpb24gIHBvaW50ZXIgdG8gd2hlcmUgdGhlIGFsbG9jYXRpb24gc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgcmVjcmVhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHJlY3JlYXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIHJlY3JlYXRpb24gdGltZWQgb3V0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gcmVjcmVhdGUgdGhlIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBpbnZhbGlkIGhhbmRsZSAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfT01JVFRFRCAgIHRoaXMgYWxsb2NhdG9yIGRvZXMgbm90IHN1cHBvcnQgMUQgYWxsb2NhdGlvbnMKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgYWxsb2NhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbiAvKiBub25udWxsICovKSB7CisgICAgICAgICphbGxvY2F0aW9uID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWxsb2NhdGVzIGEgMkQgYWxsb2NhdGlvbiBvZiBnaXZlbiB8d2lkdGh8LCB8aGVpZ2h0fCwgfGZvcm1hdHwgYW5kIHx1c2FnZXwuIElmIHN1Y2Nlc3NmdWwsCisgICAgICogdGhlIGFsbG9jYXRpb24gaXMgc3RvcmVkIGluIHxhbGxvY2F0aW9ufC4gT3RoZXJ3aXNlLCB8YWxsb2NhdGlvbnwgaXMgc2V0IHRvICdudWxscHRyJy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB3aWR0aCAgICAgICAgIHRoZSB3aWR0aCBvZiByZXF1ZXN0ZWQgYWxsb2NhdGlvbiAodGhlIGFsbG9jYXRpb24gY291bGQgYmUgc2xpZ2h0bHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBsYXJnZXIsIGUuZy4gdG8gYWNjb3VudCBmb3IgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCisgICAgICogXHBhcmFtIGhlaWdodCAgICAgICAgdGhlIGhlaWdodCBvZiByZXF1ZXN0ZWQgYWxsb2NhdGlvbiAodGhlIGFsbG9jYXRpb24gY291bGQgYmUgc2xpZ2h0bHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBsYXJnZXIsIGUuZy4gdG8gYWNjb3VudCBmb3IgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCisgICAgICogXHBhcmFtIGZvcm1hdCAgICAgICAgdGhlIHBpeGVsIGZvcm1hdCBvZiByZXF1ZXN0ZWQgYWxsb2NhdGlvbi4gVGhpcyBjb3VsZCBiZSBhIHZlbmRvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmljIGZvcm1hdC4KKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgICAgICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYWxsb2NhdGlvbi4gXG5vdGUgdGhhdCB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICByZXR1cm5lZCBhbGxvY2F0aW9uIG1heSBiZSBsYXRlciB1c2VkL21hcHBlZCB3aXRoIGRpZmZlcmVudCB1c2FnZS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBUaGUgYWxsb2NhdG9yIHNob3VsZCBsYXlvdXQgdGhlIGJ1ZmZlciB0byBiZSBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYnV0IG11c3Qgc3VwcG9ydCBhbnkgdXNhZ2UuIE9uZSBleGNlcHRpb246IHByb3RlY3RlZCBidWZmZXJzIGNhbgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYWxsb2NhdGlvbiAgICBwb2ludGVyIHRvIHdoZXJlIHRoZSBhbGxvY2F0aW9uIHNoYWxsIGJlIHN0b3JlZCBvbiBzdWNjZXNzLiBudWxscHRyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYWxsb2NhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZSBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGFsbG9jYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSB0aGUgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0aGlzIGFsbG9jYXRvciBkb2VzIG5vdCBzdXBwb3J0IDJEIGFsbG9jYXRpb25zCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIGFsbG9jYXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBuZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoIF9fdW51c2VkLCB1aW50MzJfdCBoZWlnaHQgX191bnVzZWQsIHVpbnQzMl90IGZvcm1hdCBfX3VudXNlZCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24gLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIC8qKgorICAgICAqIChSZSljcmVhdGVzIGEgMkQgYWxsb2NhdGlvbiBmcm9tIGEgbmF0aXZlIGhhbmRsZS4gIElmIHN1Y2Nlc3NmdWwsIHRoZSBhbGxvY2F0aW9uIGlzIHN0b3JlZAorICAgICAqIGluIHxhbGxvY2F0aW9ufC4gT3RoZXJ3aXNlLCB8YWxsb2NhdGlvbnwgaXMgc2V0IHRvICdudWxscHRyJy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBoYW5kbGUgICAgICB0aGUgaGFuZGxlIGZvciB0aGUgZXhpc3RpbmcgYWxsb2NhdGlvbi4gT24gc3VjY2VzcywgdGhlIGFsbG9jYXRpb24gd2lsbAorICAgICAqICAgICAgICAgICAgICAgICAgICB0YWtlIG93bmVyc2hpcCBvZiB8aGFuZGxlfC4KKyAgICAgKiBccGFyYW0gYWxsb2NhdGlvbiAgcG9pbnRlciB0byB3aGVyZSB0aGUgYWxsb2NhdGlvbiBzaGFsbCBiZSBzdG9yZWQgb24gc3VjY2Vzcy4gbnVsbHB0cgorICAgICAqICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBhbGxvY2F0aW9uIHdhcyByZWNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcmVjcmVhdGUgdGhlIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgcmVjcmVhdGlvbiB0aW1lZCBvdXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byByZWNyZWF0ZSB0aGUgYWxsb2NhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIGludmFsaWQgaGFuZGxlIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBhbGxvY2F0b3IgZG9lcyBub3Qgc3VwcG9ydCAyRCBhbGxvY2F0aW9ucworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biwgdW5yZWNvdmVyYWJsZSBlcnJvciBvY2N1cmVkIGR1cmluZyByZWNyZWF0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24gLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IG51bGxwdHI7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworcHJvdGVjdGVkOgorICAgIEMyQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworfTsKKworLyoqCisgKiBcaW5ncm91cCBsaW5lYXIgYWxsb2NhdG9yCisgKiAxRCBhbGxvY2F0aW9uIGludGVyZmFjZS4KKyAqLworY2xhc3MgQzJMaW5lYXJBbGxvY2F0aW9uIDogcHVibGljIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBNYXBzIGEgcG9ydGlvbiBvZiBhbiBhbGxvY2F0aW9uIHN0YXJ0aW5nIGZyb20gfG9mZnNldHwgd2l0aCB8c2l6ZXwgaW50byBsb2NhbCBwcm9jZXNzIG1lbW9yeS4KKyAgICAgKiBTdG9yZXMgdGhlIHN0YXJ0aW5nIGFkZHJlc3MgaW50byB8YWRkcnwsIG9yIE5VTEwgaWYgdGhlIG9wZXJhdGlvbiB3YXMgdW5zdWNjZXNzZnVsLgorICAgICAqIHxmZW5jZXwgd2lsbCBjb250YWluIGFuIGFjcXVpcmUgc3luYyBmZW5jZSBvYmplY3QuIElmIGl0IGlzIGFscmVhZHkKKyAgICAgKiBzYWZlIHRvIGFjY2VzcyB0aGUgYnVmZmVyIGNvbnRlbnRzLCB0aGVuIGl0IHdpbGwgY29udGFpbiBhbiBlbXB0eSAoYWxyZWFkeSBmaXJlZCkgZmVuY2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gb2Zmc2V0ICAgICAgICBzdGFydGluZyBwb3NpdGlvbiBvZiB0aGUgcG9ydGlvbiB0byBiZSBtYXBwZWQgKHRoaXMgZG9lcyBub3QgaGF2ZSB0bworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGJlIHBhZ2UgYWxpZ25lZCkKKyAgICAgKiBccGFyYW0gc2l6ZSAgICAgICAgICBzaXplIG9mIHRoZSBwb3J0aW9uIHRvIGJlIG1hcHBlZCAodGhpcyBkb2VzIG5vdCBoYXZlIHRvIGJlIHBhZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbGlnbmVkKQorICAgICAqIFxwYXJhbSB1c2FnZSAgICAgICAgIHRoZSBkZXNpcmVkIHVzYWdlLiBcdG9kbyB0aGlzIG11c3QgYmUga1NvZnR3YXJlUmVhZCBhbmQvb3IKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBrU29mdHdhcmVXcml0ZS4KKyAgICAgKiBccGFyYW0gZmVuY2UgICAgICAgICBhIHBvaW50ZXIgdG8gYSBmZW5jZSBvYmplY3QgaWYgYW4gYXN5bmMgbWFwcGluZyBpcyByZXF1ZXN0ZWQuIElmCisgICAgICogICAgICAgICAgICAgICAgICAgICAgbm90LW51bGwsIGFuZCBhY3F1aXJlIGZlbmNlIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gc3VjY2Vzcywgb3IgZW1wdHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBmZW5jZSBvbiBmYWlsdXJlLiBJZiBudWxsLCB0aGUgbWFwcGluZyB3aWxsIGJlIHN5bmNocm9ub3VzLgorICAgICAqIFxwYXJhbSBhZGRyICAgICAgICAgIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgc3RhcnRpbmcgYWRkcmVzcyBvZiB0aGUgbWFwcGVkIHBvcnRpb24gd2lsbCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHN0b3JlZC4gT24gZmFpbHVyZSwgbnVsbHB0ciB3aWxsIGJlIHN0b3JlZCBoZXJlLgorICAgICAqCisgICAgICogXHRvZG8gT25seSBvbmUgcG9ydGlvbiBjYW4gYmUgbWFwcGVkIGF0IHRoZSBzYW1lIHRpbWUgLSB0aGlzIGlzIHRydWUgZm9yIGdyYWxsb2MsIGJ1dCB0aGVyZQorICAgICAqICAgICAgIGlzIG5vIG5lZWQgZm9yIHRoaXMgZm9yIDFEIGJ1ZmZlcnMuCisgICAgICogXHRvZG8gRG8gd2UgbmVlZCB0byBzdXBwb3J0IHN5bmMgb3BlcmF0aW9uIGFzIHdlIGNvdWxkIGp1c3Qgd2FpdCBmb3IgdGhlIGZlbmNlPworICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gbWFwIHRoZSBwb3J0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSBpZiB0aGUgYWxsb2NhdGlvbiBpcyBhbHJlYWR5IG1hcHBlZC4KKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGUgb3BlcmF0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgdGhlIHBhcmFtZXRlcnMgKG9mZnNldC9zaXplKSBhcmUgaW52YWxpZCBvciBvdXRzaWRlIHRoZSBhbGxvY2F0aW9uLCBvcgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZSB1c2FnZSBmbGFncyBhcmUgaW52YWxpZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbiBmcm9tIGNvbXBsZXRpbmcgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBtYXAoCisgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UgLyogbnVsbGFibGUgKi8sCisgICAgICAgICAgICB2b2lkICoqYWRkciAvKiBub25udWxsICovKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBVbm1hcHMgYSBwb3J0aW9uIG9mIGFuIGFsbG9jYXRpb24gYXQgfGFkZHJ8IHdpdGggfHNpemV8LiBUaGVzZSBtdXN0IGJlIHBhcmFtZXRlcnMgcHJldmlvdXNseQorICAgICAqIHBhc3NlZCB0byBhbmQgcmV0dXJuZWQgYnkgfG1hcHw7IG90aGVyd2lzZSwgdGhpcyBvcGVyYXRpb24gaXMgYSBuby1vcC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBhZGRyICAgICAgICAgIHN0YXJ0aW5nIGFkZHJlc3Mgb2YgdGhlIG1hcHBlZCByZWdpb24KKyAgICAgKiBccGFyYW0gc2l6ZSAgICAgICAgICBzaXplIG9mIHRoZSBtYXBwZWQgcmVnaW9uCisgICAgICogXHBhcmFtIGZlbmNlICAgICAgICAgYSBwb2ludGVyIHRvIGEgZmVuY2Ugb2JqZWN0IGlmIGFuIGFzeW5jIHVubWFwcGluZyBpcyByZXF1ZXN0ZWQuIElmCisgICAgICogICAgICAgICAgICAgICAgICAgICAgbm90LW51bGwsIGEgcmVsZWFzZSBmZW5jZSB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MsIG9yIGVtcHR5IGZlbmNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgb24gZmFpbHVyZS4gVGhpcyBmZW5jZSBzaWduYWxzIHdoZW4gdGhlIG9yaWdpbmFsIGFsbG9jYXRpb24gY29udGFpbnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBhbGwgY2hhbmdlcyB0aGF0IGhhcHBlbmVkIHRvIHRoZSBtYXBwZWQgcmVnaW9uLiBJZiBudWxsLCB0aGUgdW5tYXBwaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzeW5jaHJvbm91cy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGlmIHRoZSBhbGxvY2F0aW9uIHdhcyBub3QgbWFwcGVkIHByZXZpb3VzbHkuCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgdGhlIHBhcmFtZXRlcnMgKGFkZHIvc2l6ZSkgZG8gbm90IGNvcnJlc3BvbmQgdG8gcHJldmlvdXNseSBtYXBwZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICByZWdpb25zIChjYWxsZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgb3BlcmF0aW9uIGZyb20gY29tcGxldGluZyAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIHVubWFwIHRoZSBwb3J0aW9uICh1bmV4cGVjdGVkIC0gc3lzdGVtKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgdW5tYXAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGxvY2F0b3IgSUQgZm9yIHRoaXMgYWxsb2NhdGlvbi4gVGhpcyBpcyB1c2VmdWwgdG8gcHV0IHRoZSBoYW5kbGUgaW50byBjb250ZXh0LgorICAgICAqLworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGlvbiBoYW5kbGUuCisgICAgICovCisgICAgdmlydHVhbCBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIHNhbWUgYWxsb2NhdGlvbiBhcyB8b3RoZXJ8LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJm90aGVyKSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICAvLyBcdG9kbyBzaG91bGQgd2UgbGltaXQgYWxsb2NhdGlvbiBkaXJlY3RseT8KKyAgICBDMkxpbmVhckFsbG9jYXRpb24oc2l6ZV90IGNhcGFjaXR5KSA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KGMyX21pbihjYXBhY2l0eSwgVUlOVDMyX01BWCkpIHt9CisgICAgdmlydHVhbCB+QzJMaW5lYXJBbGxvY2F0aW9uKCkgPSBkZWZhdWx0OworfTsKKworY2xhc3MgQzJDaXJjdWxhckJsb2NrOworY2xhc3MgQzJMaW5lYXJCbG9jazsKK2NsYXNzIEMyR3JhcGhpY0Jsb2NrOworCisvKioKKyAqICBCbG9jayBwb29scyBhcmUgdXNlZCBieSBjb21wb25lbnRzIHRvIG9idGFpbiBvdXRwdXQgYnVmZmVycyBpbiBhbiBlZmZpY2llbnQgd2F5LiBUaGV5IGNhbgorICogIHN1cHBvcnQgZWl0aGVyIGxpbmVhciAoMUQpLCBjaXJjdWxhciAoMUQpIG9yIGdyYXBoaWMgKDJEKSBibG9ja3MuCisgKgorICogIEJsb2NrIHBvb2xzIGRlY291cGxlIHRoZSByZWN5Y2xpbmcgb2YgbWVtb3J5L2FsbG9jYXRpb25zIGZyb20gdGhlIGNvbXBvbmVudHMuIFRoZXkgYXJlIG1lYW50IHRvCisgKiAgYmUgYW4gb3BhcXVlIHNlcnZpY2UgKHRoZXJlIGFyZSBubyBwdWJsaWMgQVBJcyBvdGhlciB0aGFuIG9idGFpbmluZyBibG9ja3MpIHByb3ZpZGVkIGJ5IHRoZQorICogIHBsYXRmb3JtLiBCbG9jayBwb29scyBhcmUgYWxzbyBtZWFudCB0byBkZWNvdXBsZSBhbGxvY2F0aW9ucyBmcm9tIG1lbW9yeSB1c2VkIGJ5IGJ1ZmZlcnMuIFRoaXMKKyAqICBpcyBhY2NvbXBsaXNoZWQgYnkgYWxsb3dpbmcgcG9vbHMgdG8gYWxsb3QgbXVsdGlwbGUgbWVtb3J5ICdibG9ja3MnIG9uIGEgc2luZ2xlIGFsbG9jYXRpb24uIEFzCisgKiAgdGhlaXIgbmFtZSBzdWdnZXN0LCBibG9jayBwb29scyBtYWludGFpbiBhIHBvb2wgb2YgbWVtb3J5IGJsb2Nrcy4gV2hlbiBhIGNvbXBvbmVudCBhc2tzIGZvcgorICogIGEgbWVtb3J5IGJsb2NrLCBwb29scyB3aWxsIHRyeSB0byByZXR1cm4gYSBmcmVlIG1lbW9yeSBibG9jayBhbHJlYWR5IGluIHRoZSBwb29sLiBJZiBubyBzdWNoCisgKiAgYmxvY2sgZXhpc3RzLCB0aGV5IHdpbGwgYWxsb2NhdGUgbWVtb3J5IHVzaW5nIHRoZSBiYWNraW5nIGFsbG9jYXRvciBhbmQgYWxsb3QgYSBibG9jayBvbiB0aGF0CisgKiAgYWxsb2NhdGlvbi4gV2hlbiBibG9ja3MgYXJlIG5vIGxvbmdlciB1c2VkIGluIHRoZSBzeXN0ZW0sIHRoZXkgYXJlIHJlY3ljbGVkIGJhY2sgdG8gdGhlIGJsb2NrCisgKiAgcG9vbCBhbmQgYXJlIGF2YWlsYWJsZSBhcyBmcmVlIGJsb2Nrcy4KKyAqCisgKiAgTmV2ZXIgY29uc3RydWN0ZWQgb24gc3RhY2suCisgKi8KK2NsYXNzIEMyQmxvY2tQb29sIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBCbG9jayBwb29sIElEIHR5cGUuCisgICAgICovCisgICAgdHlwZWRlZiB1aW50NjRfdCBsb2NhbF9pZF90OworCisgICAgZW51bSA6IGxvY2FsX2lkX3QgeworICAgICAgICBCQVNJQ19MSU5FQVIgPSAwLCAgLy8vPCBJRCBvZiBiYXNpYyAodW5vcHRpbWl6ZWQpIGJsb2NrIHBvb2wgZm9yIGZldGNoaW5nIDFEIGJsb2NrcworICAgICAgICBCQVNJQ19HUkFQSElDID0gMSwgLy8vPCBJRCBvZiBiYXNpYyAodW5vcHRpbWl6ZWQpIGJsb2NrIHBvb2wgZm9yIGZldGNoaW5nIDJEIGJsb2NrcworICAgICAgICBQTEFURk9STV9TVEFSVCA9IDB4MTAsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIElEIGZvciB0aGlzIGJsb2NrIHBvb2wuIFRoaXMgSUQgaXMgdXNlZCB0byBnZXQgdGhpcyBibG9jayBwb29sIGZyb20gdGhlIHBsYXRmb3JtLgorICAgICAqIEl0IGlzIG9ubHkgdmFsaWQgaW4gdGhlIGN1cnJlbnQgcHJvY2Vzcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiBhIGxvY2FsIElEIGZvciB0aGlzIGJsb2NrIHBvb2wuCisgICAgICovCisgICAgdmlydHVhbCBsb2NhbF9pZF90IGdldExvY2FsSWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBJRCBvZiB0aGUgYmFja2luZyBhbGxvY2F0b3Igb2YgdGhpcyBibG9jayBwb29sLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBJRCBvZiB0aGUgYmFja2luZyBhbGxvY2F0b3Igb2YgdGhpcyBibG9jayBwb29sLgorICAgICAqLworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW5zIGEgbGluZWFyIHdyaXRlYWJsZSBibG9jayBvZiBnaXZlbiB8Y2FwYWNpdHl8IGFuZCB8dXNhZ2V8LiBJZiBzdWNjZXNzZnVsLCB0aGUKKyAgICAgKiBibG9jayBpcyBzdG9yZWQgaW4gfGJsb2NrfC4gT3RoZXJ3aXNlLCB8YmxvY2t8IGlzIHNldCB0byAnbnVsbHB0cicuCisgICAgICoKKyAgICAgKiBccGFyYW0gY2FwYWNpdHkgdGhlIHNpemUgb2YgcmVxdWVzdGVkIGJsb2NrLgorICAgICAqIFxwYXJhbSB1c2FnZSAgICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYmxvY2suIFJldHVybmVkIGJsb2NrcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgIG9wdGltaXplZCBmb3IgdGhpcyB1c2FnZSwgYnV0IG1heSBiZSB1c2VkIHdpdGggYW55IHVzYWdlLiBPbmUgZXhjZXB0aW9uOgorICAgICAqICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYmxvY2tzL2J1ZmZlcnMgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYmxvY2sgICAgcG9pbnRlciB0byB3aGVyZSB0aGUgb2J0YWluZWQgYmxvY2sgc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIgd2lsbAorICAgICAqICAgICAgICAgICAgICAgICBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgYW55IHJlcXVpcmVkIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfQkxPQ0tJTkcgIHRoZSBvcGVyYXRpb24gaXMgYmxvY2tlZAorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gY29tcGxldGUgYW55IHJlcXVpcmVkIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBjYXBhY2l0eSBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0aGlzIHBvb2wgZG9lcyBub3Qgc3VwcG9ydCBsaW5lYXIgYmxvY2tzCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIG9wZXJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSBfX3VudXNlZCwgQzJNZW1vcnlVc2FnZSB1c2FnZSBfX3VudXNlZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYmxvY2sgPSBudWxscHRyOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW5zIGEgY2lyY3VsYXIgd3JpdGVhYmxlIGJsb2NrIG9mIGdpdmVuIHxjYXBhY2l0eXwgYW5kIHx1c2FnZXwuIElmIHN1Y2Nlc3NmdWwsIHRoZQorICAgICAqIGJsb2NrIGlzIHN0b3JlZCBpbiB8YmxvY2t8LiBPdGhlcndpc2UsIHxibG9ja3wgaXMgc2V0IHRvICdudWxscHRyJy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBjYXBhY2l0eSB0aGUgc2l6ZSBvZiByZXF1ZXN0ZWQgY2lyY3VsYXIgYmxvY2suIChub3RlOiB0aGUgc2l6ZSBvZiB0aGUgb2J0YWluZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgYmxvY2sgY291bGQgYmUgc2xpZ2h0bHkgbGFyZ2VyLCBlLmcuIHRvIGFjY29tbW9kYXRlIGFueSBzeXN0ZW0tcmVxdWlyZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgYWxpZ25tZW50KQorICAgICAqIFxwYXJhbSB1c2FnZSAgICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYmxvY2suIFJldHVybmVkIGJsb2NrcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgIG9wdGltaXplZCBmb3IgdGhpcyB1c2FnZSwgYnV0IG1heSBiZSB1c2VkIHdpdGggYW55IHVzYWdlLiBPbmUgZXhjZXB0aW9uOgorICAgICAqICAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgYmxvY2tzL2J1ZmZlcnMgY2FuIG9ubHkgYmUgdXNlZCBpbiBhIHByb3RlY3RlZCBzY2VuYXJpby4KKyAgICAgKiBccGFyYW0gYmxvY2sgICAgcG9pbnRlciB0byB3aGVyZSB0aGUgb2J0YWluZWQgYmxvY2sgc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAgICAgKiAgICAgICAgICAgICAgICAgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgYW55IHJlcXVpcmVkIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfQkxPQ0tJTkcgIHRoZSBvcGVyYXRpb24gaXMgYmxvY2tlZAorICAgICAqIFxyZXR2YWwgQzJfUkVGVVNFRCAgIG5vIHBlcm1pc3Npb24gdG8gY29tcGxldGUgYW55IHJlcXVpcmVkIGFsbG9jYXRpb24KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBjYXBhY2l0eSBvciB1c2FnZSBhcmUgbm90IHN1cHBvcnRlZCAoaW52YWxpZCkgKGNhbGxlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX09NSVRURUQgICB0aGlzIHBvb2wgZG9lcyBub3Qgc3VwcG9ydCBjaXJjdWxhciBibG9ja3MKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24sIHVucmVjb3ZlcmFibGUgZXJyb3Igb2NjdXJlZCBkdXJpbmcgb3BlcmF0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hDaXJjdWxhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHkgX191bnVzZWQsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgX191bnVzZWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDaXJjdWxhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgICAgICAqYmxvY2sgPSBudWxscHRyOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBPYnRhaW5zIGEgMkQgZ3JhcGhpYyBibG9jayBvZiBnaXZlbiB8d2lkdGh8LCB8aGVpZ2h0fCwgfGZvcm1hdHwgYW5kIHx1c2FnZXwuIElmIHN1Y2Nlc3NmdWwsCisgICAgICogdGhlIGJsb2NrIGlzIHN0b3JlZCBpbiB8YmxvY2t8LiBPdGhlcndpc2UsIHxibG9ja3wgaXMgc2V0IHRvICdudWxscHRyJy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB3aWR0aCAgdGhlIHdpZHRoIG9mIHJlcXVlc3RlZCBibG9jayAodGhlIG9idGFpbmVkIGJsb2NrIGNvdWxkIGJlIHNsaWdodGx5IGxhcmdlciwgZS5nLgorICAgICAqICAgICAgICAgICAgICAgdG8gYWNjb21tb2RhdGUgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCisgICAgICogXHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHJlcXVlc3RlZCBibG9jayAodGhlIG9idGFpbmVkIGJsb2NrIGNvdWxkIGJlIHNsaWdodGx5IGxhcmdlciwKKyAgICAgKiAgICAgICAgICAgICAgIGUuZy4gdG8gYWNjb21tb2RhdGUgYW55IHN5c3RlbS1yZXF1aXJlZCBhbGlnbm1lbnQpCisgICAgICogXHBhcmFtIGZvcm1hdCB0aGUgcGl4ZWwgZm9ybWF0IG9mIHJlcXVlc3RlZCBibG9jay4gVGhpcyBjb3VsZCBiZSBhIHZlbmRvciBzcGVjaWZpYyBmb3JtYXQuCisgICAgICogXHBhcmFtIHVzYWdlICB0aGUgbWVtb3J5IHVzYWdlIGluZm8gZm9yIHRoZSByZXF1ZXN0ZWQgYmxvY2suIFJldHVybmVkIGJsb2NrcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICBvcHRpbWl6ZWQgZm9yIHRoaXMgdXNhZ2UsIGJ1dCBtYXkgYmUgdXNlZCB3aXRoIGFueSB1c2FnZS4gT25lIGV4Y2VwdGlvbjoKKyAgICAgKiAgICAgICAgICAgICAgIHByb3RlY3RlZCBibG9ja3MvYnVmZmVycyBjYW4gb25seSBiZSB1c2VkIGluIGEgcHJvdGVjdGVkIHNjZW5hcmlvLgorICAgICAqIFxwYXJhbSBibG9jayAgcG9pbnRlciB0byB3aGVyZSB0aGUgb2J0YWluZWQgYmxvY2sgc2hhbGwgYmUgc3RvcmVkIG9uIHN1Y2Nlc3MuIG51bGxwdHIKKyAgICAgKiAgICAgICAgICAgICAgIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gZmFpbHVyZQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICB0aGUgb3BlcmF0aW9uIGlzIGJsb2NrZWQKKyAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBubyBwZXJtaXNzaW9uIHRvIGNvbXBsZXRlIGFueSByZXF1aXJlZCBhbGxvY2F0aW9uCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgd2lkdGgsIGhlaWdodCwgZm9ybWF0IG9yIHVzYWdlIGFyZSBub3Qgc3VwcG9ydGVkIChpbnZhbGlkKSAoY2FsbGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdGhpcyBwb29sIGRvZXMgbm90IHN1cHBvcnQgMkQgYmxvY2tzCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIG9wZXJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGggX191bnVzZWQsIHVpbnQzMl90IGhlaWdodCBfX3VudXNlZCwgdWludDMyX3QgZm9ybWF0IF9fdW51c2VkLAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSBfX3VudXNlZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgKmJsb2NrID0gbnVsbHB0cjsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJCbG9ja1Bvb2woKSA9IGRlZmF1bHQ7Citwcm90ZWN0ZWQ6CisgICAgQzJCbG9ja1Bvb2woKSA9IGRlZmF1bHQ7Cit9OworCisvLy8gQH0KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyAgQkxPQ0tTCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLyoqCisgKiBCbG9ja3MgYXJlIHNlY3Rpb25zIG9mIGFsbG9jYXRpb25zLiBUaGV5IGNhbiBiZSBlaXRoZXIgMUQgb3IgMkQuCisgKi8KKworY2xhc3MgQzJMaW5lYXJBbGxvY2F0aW9uOworCisvKioKKyAqIEEgMUQgYmxvY2suCisgKgorICogXG5vdGUgY2FwYWNpdHkoKSBpcyBub3QgbWVhbmluZ2Z1bCBmb3IgdXNlcnMgb2YgYmxvY2tzOyBpbnN0ZWFkIHNpemUoKSBpcyB0aGUgY2FwYWNpdHkgb2YgdGhlCisgKiB1c2FibGUgcG9ydGlvbi4gVXNlIGFuZCBvZmZzZXQoKSBhbmQgc2l6ZSgpIGlmIGFjY2Vzc2luZyB0aGUgYmxvY2sgZGlyZWN0bHkgdGhyb3VnaCBpdHMgaGFuZGxlCisgKiB0byByZXByZXNlbnQgdGhlIGFsbG90dGVkIHJhbmdlIG9mIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRpb24gdG8gdGhpcyBibG9jay4KKyAqLworY2xhc3MgQzJCbG9jazFEIDogcHVibGljIF9DMkxpbmVhclJhbmdlQXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIGhhbmRsZSBmb3IgdGhpcyBhbGxvY2F0aW9uLgorICAgICAqCisgICAgICogXG5vdGUgdGhhdCB0aGUgYmxvY2sgYW5kIGl0cyBibG9jayBwb29sIGhhcyBzaGFyZWQgb3duZXJzaGlwIG9mIHRoZSBoYW5kbGUKKyAgICAgKiAgICAgICBhbmQgaWYgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIGJsb2NrIGFyZSByZWxlYXNlZCwgdGhlIHVuZGVybHlpbmcgYmxvY2sKKyAgICAgKiAgICAgICBhbGxvY2F0aW9uIG1heSBnZXQgcmV1c2VkIGV2ZW4gaWYgYSBjbGllbnQga2VlcHMgYSBjbG9uZSBvZiB0aGlzIGhhbmRsZS4KKyAgICAgKi8KKyAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGxvY2F0b3IncyBJRCB0aGF0IGNyZWF0ZWQgdGhlIHVuZGVybHlpbmcgYWxsb2NhdGlvbiBmb3IgdGhpcyBibG9jay4gVGhpcworICAgICAqIHByb3ZpZGVzIHRoZSBjb250ZXh0IGZvciB1bmRlcnN0YW5kaW5nIHRoZSBoYW5kbGUuCisgICAgICovCisgICAgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAgIGNsYXNzIEltcGw7CisgICAgLyoqIGNvbnN0cnVjdCBhIGJsb2NrLiAqLworICAgIEMyQmxvY2sxRChzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnJhbmdlKTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogUmVhZCB2aWV3IHByb3ZpZGVzIHJlYWQtb25seSBhY2Nlc3MgZm9yIGEgbGluZWFyIG1lbW9yeSBzZWdtZW50LgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCisgKi8KK2NsYXNzIEMyUmVhZFZpZXcgOiBwdWJsaWMgX0MyTGluZWFyQ2FwYWNpdHlBc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9yIG51bGxwdHIgb24gZXJyb3IuCisgICAgICogICAgICAgICBUaGlzIHBvaW50ZXIgaXMgb25seSB2YWxpZCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoaXMgdmlldyBvciB1bnRpbCBpdCBpcyByZWxlYXNlZC4KKyAgICAgKi8KKyAgICBjb25zdCB1aW50OF90ICpkYXRhKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcG9ydGlvbiBvZiB0aGlzIHZpZXcuCisgICAgICoKKyAgICAgKiBccGFyYW0gb2Zmc2V0ICB0aGUgc3RhcnQgb2Zmc2V0IG9mIHRoZSBwb3J0aW9uLiBcbm90ZSBUaGlzIGlzIGNsYW1wZWQgdG8gdGhlIGNhcGFjaXR5IG9mIHRoaXMKKyAgICAgKiAgICAgICAgICAgICAgdmlldy4KKyAgICAgKiBccGFyYW0gc2l6ZSAgICB0aGUgc2l6ZSBvZiB0aGUgcG9ydGlvbi4gXG5vdGUgVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSByZW1haW5pbmcgZGF0YSBmcm9tIG9mZnNldC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSByZWFkIHZpZXcgY29udGFpbmluZyBhIHBvcnRpb24gb2YgdGhpcyB2aWV3CisgICAgICovCisgICAgQzJSZWFkVmlldyBzdWJWaWV3KHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gZXJyb3IgZHVyaW5nIHRoZSBjcmVhdGlvbi9tYXBwaW5nIG9mIHRoaXMgdmlldy4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBlcnJvcigpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmVsZWFzZXMgdGhpcyB2aWV3LiBUaGlzIHNldHMgZXJyb3IgdG8gQzJfTk9fSU5JVC4KKyAgICAgKi8KKyAgICAvL3ZvaWQgcmVsZWFzZSgpOworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgSW1wbDsKKyAgICBDMlJlYWRWaWV3KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHNpemUpOworICAgIGV4cGxpY2l0IEMyUmVhZFZpZXcoYzJfc3RhdHVzX3QgZXJyb3IpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKyAgICB1aW50MzJfdCBtT2Zmc2V0OyAvKio8IG9mZnNldCBpbnRvIHRoZSBsaW5lYXIgYmxvY2sgYmFja2luZyB0aGlzIHJlYWQgdmlldyAqLworfTsKKworLyoqCisgKiBXcml0ZSB2aWV3IHByb3ZpZGVzIHJlYWQvd3JpdGUgYWNjZXNzIGZvciBhIGxpbmVhciBtZW1vcnkgc2VnbWVudC4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlLiBcdG9kbyBtb3ZhYmxlIG9ubHk/CisgKi8KK2NsYXNzIEMyV3JpdGVWaWV3IDogcHVibGljIF9DMkVkaXRhYmxlTGluZWFyUmFuZ2VBc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFN0YXJ0IG9mIHRoZSBibG9jay4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrIG9yIG51bGxwdHIgb24gZXJyb3IuCisgICAgICogICAgICAgICBUaGlzIHBvaW50ZXIgaXMgb25seSB2YWxpZCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoaXMgdmlldyBvciB1bnRpbCBpdCBpcyByZWxlYXNlZC4KKyAgICAgKi8KKyAgICB1aW50OF90ICpiYXNlKCk7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIHBvaW50ZXIgdG8gdGhlIGJsb2NrIGF0IHRoZSBjdXJyZW50IG9mZnNldCBvciBudWxscHRyIG9uIGVycm9yLgorICAgICAqICAgICAgICAgVGhpcyBwb2ludGVyIGlzIG9ubHkgdmFsaWQgZHVyaW5nIHRoZSBsaWZldGltZSBvZiB0aGlzIHZpZXcgb3IgdW50aWwgaXQgaXMgcmVsZWFzZWQuCisgICAgICovCisgICAgdWludDhfdCAqZGF0YSgpOworCisgICAgLyoqCisgICAgICogXHJldHVybiBlcnJvciBkdXJpbmcgdGhlIGNyZWF0aW9uL21hcHBpbmcgb2YgdGhpcyB2aWV3LgorICAgICAqLworICAgIGMyX3N0YXR1c190IGVycm9yKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlcyB0aGlzIHZpZXcuIFRoaXMgc2V0cyBlcnJvciB0byBDMl9OT19JTklULgorICAgICAqLworICAgIC8vdm9pZCByZWxlYXNlKCk7CisKK3Byb3RlY3RlZDoKKyAgICBjbGFzcyBJbXBsOworICAgIEMyV3JpdGVWaWV3KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsKTsKKyAgICBleHBsaWNpdCBDMldyaXRlVmlldyhjMl9zdGF0dXNfdCBlcnJvcik7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworfTsKKworLyoqCisgKiBBIGNvbnN0YW50IChyZWFkLW9ubHkpIGxpbmVhciBibG9jayAocG9ydGlvbiBvZiBhbiBhbGxvY2F0aW9uKSB3aXRoIGFuIGFjcXVpcmUgZmVuY2UuCisgKiBCbG9ja3MgYXJlIHVubWFwcGVkIHdoZW4gY3JlYXRlZCwgYW5kIGNhbiBiZSBtYXBwZWQgaW50byBhIHJlYWQgdmlldyBvbiBkZW1hbmQuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZSBhbmQgY29udGFpbnMgYSByZWZlcmVuY2UgdG8gdGhlIGFsbG9jYXRpb24gdGhhdCBpdCBpcyBiYXNlZCBvbi4KKyAqLworY2xhc3MgQzJDb25zdExpbmVhckJsb2NrIDogcHVibGljIEMyQmxvY2sxRCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyB0aGlzIGJsb2NrIGludG8gbWVtb3J5IGFuZCByZXR1cm5zIGEgcmVhZCB2aWV3IGZvciBpdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSByZWFkIHZpZXcgZm9yIHRoaXMgYmxvY2suCisgICAgICovCisgICAgQzJBY3F1aXJhYmxlPEMyUmVhZFZpZXc+IG1hcCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHBvcnRpb24gb2YgdGhpcyBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSBvZmZzZXQgIHRoZSBzdGFydCBvZmZzZXQgb2YgdGhlIHBvcnRpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgY2FwYWNpdHkgb2YgdGhpcworICAgICAqICAgICAgICAgICAgICBibG9jay4KKyAgICAgKiBccGFyYW0gc2l6ZSAgICB0aGUgc2l6ZSBvZiB0aGUgcG9ydGlvbi4gXG5vdGUgVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSByZW1haW5pbmcgZGF0YSBmcm9tIG9mZnNldC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBjb25zdGFudCBsaW5lYXIgYmxvY2sgY29udGFpbmluZyBhIHBvcnRpb24gb2YgdGhpcyBibG9jaworICAgICAqLworICAgIEMyQ29uc3RMaW5lYXJCbG9jayBzdWJCbG9jayhzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhY3F1aXJlIGZlbmNlIGZvciB0aGlzIGJsb2NrLgorICAgICAqCisgICAgICogXHJldHVybiBhIGZlbmNlIHRoYXQgbXVzdCBiZSB3YWl0ZWQgb24gYmVmb3JlIHJlYWRpbmcgdGhlIGJsb2NrLgorICAgICAqLworICAgIEMyRmVuY2UgZmVuY2UoKSBjb25zdCB7IHJldHVybiBtRmVuY2U7IH0KKworcHJvdGVjdGVkOgorICAgIEMyQ29uc3RMaW5lYXJCbG9jayhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnJhbmdlLCBDMkZlbmNlIG1GZW5jZSk7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7CisgICAgQzJGZW5jZSBtRmVuY2U7Cit9OworCisvKioKKyAqIExpbmVhciBibG9jayBpcyBhIHdyaXRlYWJsZSAxRCBibG9jay4gT25jZSB3cml0dGVuLCBpdCBjYW4gYmUgc2hhcmVkIGluIHdob2xlIG9yIGluIHBhcnRzIHdpdGgKKyAqIGNvbnN1bWVycy9yZWFkZXJzIGFzIHJlYWQtb25seSBjb25zdCBsaW5lYXIgYmxvY2socykuCisgKi8KK2NsYXNzIEMyTGluZWFyQmxvY2sgOiBwdWJsaWMgQzJCbG9jazFEIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBNYXBzIHRoaXMgYmxvY2sgaW50byBtZW1vcnkgYW5kIHJldHVybnMgYSB3cml0ZSB2aWV3IGZvciBpdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSB3cml0ZSB2aWV3IGZvciB0aGlzIGJsb2NrLgorICAgICAqLworICAgIEMyQWNxdWlyYWJsZTxDMldyaXRlVmlldz4gbWFwKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgcmVhZC1vbmx5IGNvbnN0IGxpbmVhciBibG9jayBmb3IgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2s7IG9wdGlvbmFsbHkgcHJvdGVjdGVkCisgICAgICogYnkgYW4gYWNxdWlyZSBmZW5jZS4gVGhlcmUgYXJlIHR3byB3YXlzIHRvIHVzZSB0aGlzOgorICAgICAqCisgICAgICogMSkgc2hhcmUgcmVhZHkgYmxvY2sgYWZ0ZXIgd3JpdGluZyBkYXRhIGludG8gdGhlIGJsb2NrLiBJbiB0aGlzIGNhc2Ugbm8gZmVuY2Ugc2hhbGwgYmUKKyAgICAgKiAgICBzdXBwbGllZCwgYW5kIHRoZSBibG9jayBzaGFsbCBub3QgYmUgbW9kaWZpZWQgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZC4KKyAgICAgKiAyKSBzaGFyZSBibG9jayBtZXRhZGF0YSBiZWZvcmUgYWN0dWFsbHkgKGZpbmlzaGluZykgd3JpdGluZyB0aGUgZGF0YSBpbnRvIHRoZSBibG9jay4gSW4KKyAgICAgKiAgICB0aGlzIGNhc2UgYSBmZW5jZSBtdXN0IGJlIHN1cHBsaWVkIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgZGF0YSBpcyB3cml0dGVuLgorICAgICAqICAgIFRoZSBibG9jayBzaGFsbCBiZSBtb2RpZmllZCBvbmx5IHVudGlsIGZpcmluZyB0aGUgZXZlbnQgZm9yIHRoZSBmZW5jZS4KKyAgICAgKi8KKyAgICBDMkNvbnN0TGluZWFyQmxvY2sgc2hhcmUoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUsIEMyRmVuY2UgZmVuY2UpOworCitwcm90ZWN0ZWQ6CisgICAgQzJMaW5lYXJCbG9jayhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnJhbmdlKTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworfTsKKworLy8vIEB9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICBDSVJDVUxBUiBCTE9DS1MgQU5EIFZJRVdTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLy8vIFxkZWZncm91cCBjaXJjdWxhciBDaXJjdWxhciBidWZmZXIgc3VwcG9ydAorLy8vIEB7CisKKy8qKgorICogQ2lyY3VsYXIgYmxvY2tzIGNhbiBiZSB1c2VkIHRvIHNoYXJlIGRhdGEgYmV0d2VlbiBhIHdyaXRlciBhbmQgYSByZWFkZXIgKGFuZC9vciBvdGhlciBjb25zdW1lcnMpLQorICogaW4gYSBtZW1vcnktZWZmaWNpZW50IHdheSBieSByZXVzaW5nIGEgc2VjdGlvbiBvZiBtZW1vcnkuIENpcmN1bGFyIGJsb2NrcyBhcmUgYSBiaXQgbW9yZSBjb21wbGV4CisgKiB0aGFuIHNpbmdsZSByZWFkZXIvc2luZ2xlIHdyaXRlciBzY2hlbWVzIHRvIGZhY2lsaXRhdGUgYmxvY2stYmFzZWQgY29uc3VtaW5nIG9mIGRhdGEuCisgKgorICogVGhleSBjYW4gb3BlcmF0ZSBpbiB0d28gbW9kZXM6CisgKgorICogMSkgb25lIHdyaXRlciB0aGF0IGNyZWF0ZXMgYmxvY2tzIHRvIGJlIGNvbnN1bWVkICh0aGlzIG1vZGVsIGNhbiBiZSB1c2VkIGJ5IGNvbXBvbmVudHMpCisgKgorICogMikgb25lIHdyaXRlciB0aGF0IHdyaXRlcyBjb250aW51b3VzbHksIGFuZCBvbmUgcmVhZGVyIHRoYXQgY2FuIGNyZWF0ZXMgYmxvY2tzIHRvIGJlIGNvbnN1bWVkCisgKiAgICBieSBmdXJ0aGVyIHJlY2lwaWVudHMgKHRoaXMgbW9kZWwgaXMgdXNlZCBieSB0aGUgZnJhbWV3b3JrLCBhbmQgY2Fubm90IGJlIHVzZWQgYnkgY29tcG9uZW50cy4pCisgKgorICogQ2lyY3VsYXIgYmxvY2tzIGhhdmUgZm91ciBzZWdtZW50cyB3aXRoIHJ1bm5pbmcgcG9pbnRlcnM6CisgKiAgLSByZXNlcnZlZDogZGF0YSByZXNlcnZlZCBhbmQgYXZhaWxhYmxlIGZvciB0aGUgd3JpdGVyCisgKiAgLSBjb21taXR0ZWQ6IGRhdGEgY29tbWl0dGVkIGJ5IHRoZSB3cml0ZXIgYW5kIGF2YWlsYWJsZSB0byB0aGUgcmVhZGVyIChpZiBwcmVzZW50KQorICogIC0gdXNlZDogZGF0YSB1c2VkIGJ5IGNvbnN1bWVycyAoaWYgcHJlc2VudCkKKyAqICAtIGF2YWlsYWJsZTogdW51c2VkIGRhdGEgYXZhaWxhYmxlIHRvIGJlIHJlc2VydmVkCisgKi8KK2NsYXNzIEMyQ2lyY3VsYXJCbG9jayA6IHB1YmxpYyBDMkJsb2NrMUQgeworICAgIC8vIFRPRE86IGFkZCBtZXRob2RzCisKK3ByaXZhdGU6CisgICAgc2l6ZV90IG1SZXNlcnZlZCBfX3VudXNlZDsgICAvLyBlbmQgb2YgcmVzZXJ2ZWQgc2VjdGlvbgorICAgIHNpemVfdCBtQ29tbWl0dGVkIF9fdW51c2VkOyAgLy8gZW5kIG9mIGNvbW1pdHRlZCBzZWN0aW9uCisgICAgc2l6ZV90IG1Vc2VkIF9fdW51c2VkOyAgICAgICAvLyBlbmQgb2YgdXNlZCBzZWN0aW9uCisgICAgc2l6ZV90IG1GcmVlIF9fdW51c2VkOyAgICAgICAvLyBlbmQgb2YgZnJlZSBzZWN0aW9uCit9OworCitjbGFzcyBfQzJDaXJjdWxhckJsb2NrU2VnbWVudCA6IHB1YmxpYyBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYXZhaWxhYmxlIHNpemUgZm9yIHRoaXMgc2VnbWVudC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gY3VycmVudGx5IGF2YWlsYWJsZSBzaXplIGZvciB0aGlzIHNlZ21lbnQKKyAgICAgKi8KKyAgICBzaXplX3QgYXZhaWxhYmxlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXNlcnZlIHNvbWUgc3BhY2UgZm9yIHRoaXMgc2VnbWVudCBmcm9tIGl0cyBjdXJyZW50IHN0YXJ0LgorICAgICAqCisgICAgICogXHBhcmFtIHNpemUgICAgZGVzaXJlZCBzcGFjZSBpbiBieXRlcworICAgICAqIFxwYXJhbSBmZW5jZSAgIGEgcG9pbnRlciB0byBhbiBhY3F1aXJlIGZlbmNlLiBJZiBub24tbnVsbCwgdGhlIHJlc2VydmF0aW9uIGlzIGFzeW5jaHJvbm91cyBhbmQKKyAgICAgKiAgICAgICAgICAgICAgYSBmZW5jZSB3aWxsIGJlIHN0b3JlZCBoZXJlIHRoYXQgd2lsbCBiZSBzaWduYWxlZCB3aGVuIHRoZSByZXNlcnZhdGlvbiBpcworICAgICAqICAgICAgICAgICAgICBjb21wbGV0ZS4gSWYgbnVsbCwgdGhlIHJlc2VydmF0aW9uIGlzIHN5bmNocm9ub3VzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgICAgIHRoZSBzcGFjZSB3YXMgc3VjY2Vzc2Z1bGx5IHJlc2VydmVkCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgICAgIHRoZSBzcGFjZSByZXF1ZXN0ZWQgY2Fubm90IGJlIHJlc2VydmVkCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgICAgIHRoZSByZXNlcnZhdGlvbiB0aW1lZCBvdXQgXHRvZG8gd2hlbj8KKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCAgICAgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCByZXNlcnZpbmcgc3BhY2UuICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IHJlc2VydmUoc2l6ZV90IHNpemUsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovKTsKKworICAgIC8qKgorICAgICAqIEFiYW5kb25zIGEgcG9ydGlvbiBvZiB0aGlzIHNlZ21lbnQuIFRoaXMgd2lsbCBtb3ZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhpcyBzZWdtZW50LgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyBtZXRob2RzIGlzIG9ubHkgYWxsb3dlZCBpZiB0aGlzIHNlZ21lbnQgaXMgcHJvZHVjaW5nIGJsb2Nrcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaXplICAgIG51bWJlciBvZiBieXRlcyB0byBhYmFuZG9uCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICAgICAgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSBhYmFuZG9uZWQKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCAgICAgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgICAgIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgYWJhbmRvbmluZyB0aGUgZGF0YSAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBhYmFuZG9uKHNpemVfdCBzaXplKTsKKworICAgIC8qKgorICAgICAqIFNoYXJlIGEgcG9ydGlvbiBhcyBibG9jayhzKSB3aXRoIGNvbnN1bWVycyAodGhlc2UgYXJlIG1vdmVkIHRvIHRoZSB1c2VkIHNlY3Rpb24pLgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyBtZXRob2RzIGlzIG9ubHkgYWxsb3dlZCBpZiB0aGlzIHNlZ21lbnQgaXMgcHJvZHVjaW5nIGJsb2Nrcy4KKyAgICAgKiBcbm90ZSBTaGFyZSBkb2VzIG5vdCBtb3ZlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNlZ21lbnQuIChcdG9kbyBhZGQgYWJhbmRvbi9vZmZzZXQ/KQorICAgICAqCisgICAgICogXHBhcmFtIHNpemUgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIHNoYXJlCisgICAgICogXHBhcmFtIGZlbmNlICAgZmVuY2UgdG8gYmUgdXNlZCBmb3IgdGhlIHNlY3Rpb24KKyAgICAgKiBccGFyYW0gYmxvY2tzICB2ZWN0b3Igd2hlcmUgdGhlIGJsb2NrcyBvZiB0aGUgc2VjdGlvbiBhcmUgYXBwZW5kZWQgdG8KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgICAgICB0aGUgcG9ydGlvbiB3YXMgc3VjY2Vzc2Z1bGx5IHNoYXJlZAorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZICAgICBub3QgZW5vdWdoIG1lbW9yeSB0byBzaGFyZSB0aGUgcG9ydGlvbgorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUICAgICB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCAgICAgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBzaGFyaW5nIHRoZSBkYXRhICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IHNoYXJlKHNpemVfdCBzaXplLCBDMkZlbmNlIGZlbmNlLCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYmVnaW5uaW5nIG9mZnNldCBvZiB0aGlzIHNlZ21lbnQgZnJvbSB0aGUgc3RhcnQgb2YgdGhpcyBjaXJjdWxhciBibG9jay4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYmVnaW5uaW5nIG9mZnNldAorICAgICAqLworICAgIHNpemVfdCBiZWdpbigpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZW5kIG9mZnNldCBvZiB0aGlzIHNlZ21lbnQgZnJvbSB0aGUgc3RhcnQgb2YgdGhpcyBjaXJjdWxhciBibG9jay4KKyAgICAgKgorICAgICAqIEByZXR1cm4gZW5kIG9mZnNldAorICAgICAqLworICAgIHNpemVfdCBlbmQoKTsKK307CisKKy8qKgorICogQSBjaXJjdWxhciB3cml0ZS12aWV3IGlzIGEgZHluYW1pYyBtYXBwZWQgdmlldyBmb3IgYSBzZWdtZW50IG9mIGEgY2lyY3VsYXIgYmxvY2suIENhcmUgbXVzdCBiZQorICogdGFrZW4gd2hlbiB1c2luZyB0aGlzIHZpZXcgc28gdGhhdCBvbmx5IHRoZSBzZWN0aW9uIG93bmVkIGJ5IHRoZSBzZWdtZW50IGlzIG1vZGlmaWVkLgorICovCitjbGFzcyBDMkNpcmN1bGFyV3JpdGVWaWV3IDogcHVibGljIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBTdGFydCBvZiB0aGUgY2lyY3VsYXIgYmxvY2suCisgICAgICogXG5vdGUgdGhlIHNlZ21lbnQgZG9lcyBub3Qgb3duIHRoaXMgcG9pbnRlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIGNpcmN1bGFyIGJsb2NrIG9yIG51bGxwdHIgb24gZXJyb3IuCisgICAgICovCisgICAgdWludDhfdCAqYmFzZSgpOworCisgICAgLyoqCisgICAgICogXHJldHVybiBlcnJvciBkdXJpbmcgdGhlIGNyZWF0aW9uL21hcHBpbmcgb2YgdGhpcyB2aWV3LgorICAgICAqLworICAgIGMyX3N0YXR1c190IGVycm9yKCkgY29uc3Q7Cit9OworCisvKioKKyAqIFRoZSB3cml0ZXIgb2YgYSBjaXJjdWxhciBidWZmZXIuCisgKgorICogQ2FuIGNvbW1pdCBkYXRhIHRvIGEgcmVhZGVyIChub3Qgc3VwcG9ydGVkIGZvciBjb21wb25lbnRzKSBPUiBzaGFyZSBkYXRhIGJsb2NrcyBkaXJlY3RseSB3aXRoIGEKKyAqIGNvbnN1bWVyLgorICoKKyAqIElmIGEgY29tcG9uZW50IHN1cHBvcnRzIG91dHB1dHRpbmcgZGF0YSBpbnRvIGNpcmN1bGFyIGJ1ZmZlcnMsIGl0IG11c3QgYWxsb2NhdGUgYSBjaXJjdWxhcgorICogYmxvY2sgYW5kIHVzZSBhIGNpcmN1bGFyIHdyaXRlci4KKyAqLworY2xhc3MgQzJDaXJjdWxhcldyaXRlciA6IHB1YmxpYyBfQzJDaXJjdWxhckJsb2NrU2VnbWVudCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29tbWl0cyBhIHBvcnRpb24gb2YgdGhpcyBzZWdtZW50IHRvIHRoZSBuZXh0IHNlZ21lbnQuIFRoaXMgbW92ZXMgdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgICAgKiBzZWdtZW50LgorICAgICAqCisgICAgICogXHBhcmFtIHNpemUgICAgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbW1pdCB0byB0aGUgbmV4dCBzZWdtZW50CisgICAgICogXHBhcmFtIGZlbmNlICAgZmVuY2UgdXNlZCBmb3IgdGhlIGNvbW1pdCAodGhlIGZlbmNlIG11c3Qgc2lnbmFsIGJlZm9yZSB0aGUgZGF0YSBpcyBjb21taXR0ZWQpCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgY29tbWl0KHNpemVfdCBzaXplLCBDMkZlbmNlIGZlbmNlKTsKKworICAgIC8qKgorICAgICAqIE1hcHMgdGhpcyBibG9jayBpbnRvIG1lbW9yeSBhbmQgcmV0dXJucyBhIHdyaXRlIHZpZXcgZm9yIGl0LgorICAgICAqCisgICAgICogXHJldHVybiBhIHdyaXRlIHZpZXcgZm9yIHRoaXMgYmxvY2suCisgICAgICovCisgICAgQzJBY3F1aXJhYmxlPEMyQ2lyY3VsYXJXcml0ZVZpZXc+IG1hcCgpOworfTsKKworLy8vIEB9CisKKy8vLyBcZGVmZ3JvdXAgZ3JhcGhpYyBHcmFwaGljIERhdGEgQmxvY2tzCisvLy8gQHsKKworLyoqCisgKiBDMlJlY3Q6IHJlY3RhbmdsZSB0eXBlIHdpdGggbm9uLW5lZ2F0aXZlIGNvb3JkaW5hdGVzLgorICoKKyAqIFxub3RlIFRoaXMgc3RydWN0IGhhcyBwdWJsaWMgZmllbGRzIHdpdGhvdXQgZ2V0dGVycy9zZXR0ZXJzLiBBbGwgbWV0aG9kcyBhcmUgaW5saW5lLgorICovCitzdHJ1Y3QgQzJSZWN0IHsKKy8vIHB1YmxpYzoKKyAgICB1aW50MzJfdCB3aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgdWludDMyX3QgbGVmdDsKKyAgICB1aW50MzJfdCB0b3A7CisKKyAgICBjb25zdGV4cHIgaW5saW5lIEMyUmVjdCgpCisgICAgICAgIDogQzJSZWN0KDAsIDAsIDAsIDApIHsgfQorCisgICAgY29uc3RleHByIGlubGluZSBDMlJlY3QodWludDMyX3Qgd2lkdGhfLCB1aW50MzJfdCBoZWlnaHRfKQorICAgICAgICA6IEMyUmVjdCh3aWR0aF8sIGhlaWdodF8sIDAsIDApIHsgfQorCisgICAgY29uc3RleHByIEMyUmVjdCBpbmxpbmUgYXQodWludDMyX3QgbGVmdF8sIHVpbnQzMl90IHRvcF8pIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyUmVjdCh3aWR0aCwgaGVpZ2h0LCBsZWZ0XywgdG9wXyk7CisgICAgfQorCisgICAgLy8gdXRpbGl0eSBtZXRob2RzCisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDA7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBsZWZ0IDw9IH53aWR0aCAmJiB0b3AgPD0gfmhlaWdodDsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpc1ZhbGlkKCkgJiYgIWlzRW1wdHkoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gIWJvb2woKnRoaXMpOworICAgIH0KKworICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIGNvbnRhaW5zKGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkgfHwgIW90aGVyLmlzVmFsaWQoKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGxlZnQgPD0gb3RoZXIubGVmdCAmJiB0b3AgPD0gb3RoZXIudG9wCisgICAgICAgICAgICAgICAgICAgICYmIGxlZnQgKyB3aWR0aCA+PSBvdGhlci5sZWZ0ICsgb3RoZXIud2lkdGgKKyAgICAgICAgICAgICAgICAgICAgJiYgdG9wICsgaGVpZ2h0ID49IG90aGVyLnRvcCArIG90aGVyLmhlaWdodDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKCFpc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAhb3RoZXIuaXNWYWxpZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGxlZnQgPT0gb3RoZXIubGVmdCAmJiB0b3AgPT0gb3RoZXIudG9wCisgICAgICAgICAgICAgICAgICAgICYmIHdpZHRoID09IG90aGVyLndpZHRoICYmIGhlaWdodCA9PSBvdGhlci5oZWlnaHQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAhb3BlcmF0b3I9PShvdGhlcik7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPj0oY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gY29udGFpbnMob3RoZXIpOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcj4oY29uc3QgQzJSZWN0ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gY29udGFpbnMob3RoZXIpICYmICFvcGVyYXRvcj09KG90aGVyKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgb3BlcmF0b3I8PShjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBvdGhlci5jb250YWlucygqdGhpcyk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPChjb25zdCBDMlJlY3QgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBvdGhlci5jb250YWlucygqdGhpcykgJiYgIW9wZXJhdG9yPT0ob3RoZXIpOworICAgIH0KKworICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciB1aW50MzJfdCByaWdodCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGxlZnQgKyB3aWR0aDsKKyAgICB9CisKKyAgICBDMl9BTExPV19PVkVSRkxPVworICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3QgYm90dG9tKCkgY29uc3QgeworICAgICAgICByZXR1cm4gdG9wICsgaGVpZ2h0OworICAgIH0KKworICAgIEMyX0FMTE9XX09WRVJGTE9XCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlJlY3QgaW50ZXJzZWN0KGNvbnN0IEMyUmVjdCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyUmVjdChjMl9taW4ocmlnaHQoKSwgb3RoZXIucmlnaHQoKSkgLSBjMl9tYXgobGVmdCwgb3RoZXIubGVmdCksCisgICAgICAgICAgICAgICAgICAgICAgYzJfbWluKGJvdHRvbSgpLCBvdGhlci5ib3R0b20oKSkgLSBjMl9tYXgodG9wLCBvdGhlci50b3ApLAorICAgICAgICAgICAgICAgICAgICAgIGMyX21heChsZWZ0LCBvdGhlci5sZWZ0KSwKKyAgICAgICAgICAgICAgICAgICAgICBjMl9tYXgodG9wLCBvdGhlci50b3ApKTsKKyAgICB9CisKKyAgICAvKiogY2xhbXBzIHJpZ2h0IGFuZCBib3R0b20gdG8gdG9wLCBsZWZ0IGlmIHRoZXkgb3ZlcmZsb3cgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIEMyUmVjdCBub3JtYWxpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlJlY3QoYzJfbWF4KGxlZnQsIHJpZ2h0KCkpIC0gbGVmdCwgYzJfbWF4KHRvcCwgYm90dG9tKCkpIC0gdG9wLCBsZWZ0LCB0b3ApOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLy8gbm90ZTogcG90ZW50aWFsbHkgdW51c3VhbCBhcmd1bWVudCBvcmRlcgorICAgIGNvbnN0ZXhwciBpbmxpbmUgQzJSZWN0KHVpbnQzMl90IHdpZHRoXywgdWludDMyX3QgaGVpZ2h0XywgdWludDMyX3QgbGVmdF8sIHVpbnQzMl90IHRvcF8pCisgICAgICAgIDogd2lkdGgod2lkdGhfKSwKKyAgICAgICAgICBoZWlnaHQoaGVpZ2h0XyksCisgICAgICAgICAgbGVmdChsZWZ0XyksCisgICAgICAgICAgdG9wKHRvcF8pIHsgfQorfTsKKworLyoqCisgKiBJbnRlcmZhY2UgZm9yIG9iamVjdHMgdGhhdCBoYXZlIGEgd2lkdGggYW5kIGhlaWdodCAocGxhbmFyIGNhcGFjaXR5KS4KKyAqLworY2xhc3MgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgeworLy8vIFxuYW1lIFBsYW5hciBjYXBhY2l0eSBpbnRlcmZhY2UKKy8vLyBAeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgdWludDMyX3Qgd2lkdGgoKSBjb25zdCB7IHJldHVybiBfbVdpZHRoOyB9CisgICAgaW5saW5lIGNvbnN0ZXhwciB1aW50MzJfdCBoZWlnaHQoKSBjb25zdCB7IHJldHVybiBfbUhlaWdodDsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBvcGVyYXRvciBDMlJlY3QoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlJlY3QoX21XaWR0aCwgX21IZWlnaHQpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGlubGluZSBjb25zdGV4cHIgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkKKyAgICAgIDogX21XaWR0aCh3aWR0aCksIF9tSGVpZ2h0KGhlaWdodCkgeyB9CisKKyAgICBpbmxpbmUgZXhwbGljaXQgY29uc3RleHByIF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KGNvbnN0IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0ICpwYXJlbnQpCisgICAgICAgIDogX21XaWR0aChwYXJlbnQgPT0gbnVsbHB0ciA/IDAgOiBwYXJlbnQtPndpZHRoKCkpLAorICAgICAgICAgIF9tSGVpZ2h0KHBhcmVudCA9PSBudWxscHRyID8gMCA6IHBhcmVudC0+aGVpZ2h0KCkpIHsgfQorCitwcml2YXRlOgorICAgIHVpbnQzMl90IF9tV2lkdGg7CisgICAgdWludDMyX3QgX21IZWlnaHQ7CisvLy8gQH0KK307CisKKy8qKgorICogQzJQbGFuZUluZm86IGluZm9ybWF0aW9uIG9uIHRoZSBsYXlvdXQgb2YgYSBzaW5nZSBmbGV4aWJsZSBwbGFuZS4KKyAqCisgKiBQdWJsaWMgZmllbGRzIHdpdGhvdXQgZ2V0dGVycy9zZXR0ZXJzLgorICovCitzdHJ1Y3QgQzJQbGFuZUluZm8geworLy9wdWJsaWM6CisgICAgZW51bSBjaGFubmVsX3QgOiB1aW50MzJfdCB7CisgICAgICAgIENIQU5ORUxfWSwgIC8vLzwgbHVtYQorICAgICAgICBDSEFOTkVMX1IsICAvLy88IHJlZAorICAgICAgICBDSEFOTkVMX0csICAvLy88IGdyZWVuCisgICAgICAgIENIQU5ORUxfQiwgIC8vLzwgYmx1ZQorICAgICAgICBDSEFOTkVMX0EsICAvLy88IGFscGhhCisgICAgICAgIENIQU5ORUxfQ1IsIC8vLzwgQ3IKKyAgICAgICAgQ0hBTk5FTF9DQiwgLy8vPCBDYgorICAgIH0gY2hhbm5lbDsKKworICAgIGludDMyX3QgY29sSW5jOyAgICAgICAvLy88IGNvbHVtbiBpbmNyZW1lbnQgaW4gYnl0ZXMuIG1heSBiZSBuZWdhdGl2ZQorICAgIGludDMyX3Qgcm93SW5jOyAgICAgICAvLy88IHJvdyBpbmNyZW1lbnQgaW4gYnl0ZXMuIG1heSBiZSBuZWdhdGl2ZQorCisgICAgdWludDMyX3QgY29sU2FtcGxpbmc7IC8vLzwgc3Vic2FtcGxpbmcgY29tcGFyZWQgdG8gd2lkdGggKG11c3QgYmUgYSBwb3dlciBvZiAyKQorICAgIHVpbnQzMl90IHJvd1NhbXBsaW5nOyAvLy88IHN1YnNhbXBsaW5nIGNvbXBhcmVkIHRvIGhlaWdodCAobXVzdCBiZSBhIHBvd2VyIG9mIDIpCisKKyAgICB1aW50MzJfdCBhbGxvY2F0ZWREZXB0aDsgLy8vPCBzaXplIG9mIGVhY2ggc2FtcGxlIChtdXN0IGJlIGEgbXVsdGlwbGUgb2YgOCkKKyAgICB1aW50MzJfdCBiaXREZXB0aDsgICAgICAgLy8vPCBzaWduaWZpY2FudCBiaXRzIHBlciBzYW1wbGUKKyAgICAvKioKKyAgICAgKiB0aGUgcmlnaHQgc2hpZnQgb2YgdGhlIHNpZ25pZmljYW50IGJpdHMgaW4gdGhlIHNhbXBsZS4gRS5nLiBpZiBhIDEwLWJpdCBzaWduaWZpY2FudAorICAgICAqIHZhbHVlIGlzIGxhaWQgb3V0IGluIGEgMTYtYml0IGFsbG9jYXRpb24gYWxpZ25lZCB0byBMU0IgKHZhbHVlcyAwLTEwMjMpLCByaWdodFNoaWZ0CisgICAgICogd291bGQgYmUgMCBhcyB0aGUgMTYtYml0IHZhbHVlIHJlYWQgZnJvbSB0aGUgc2FtcGxlIGRvZXMgbm90IG5lZWQgdG8gYmUgcmlnaHQgc2hpZnRlZAorICAgICAqIGFuZCBjYW4gYmUgdXNlZCBhcyBpcyAoYWZ0ZXIgYXBwbHlpbmcgYSAxMC1iaXQgbWFzayBvZiAweDNGRikuCisgICAgICoKKyAgICAgKiArLS0tLS0tLS0rLS0tLS0tLS0rCisgICAgICogfCAgICAgIFZWfFZWVlZWVlZWfAorICAgICAqICstLS0tLS0tLSstLS0tLS0tLSsKKyAgICAgKiAgMTUgICAgIDggNyAgICAgIDAKKyAgICAgKgorICAgICAqIElmIHRoZSB2YWx1ZSBpcyBsYWlkIG91dCBhbGlnbmVkIHRvIE1TQiwgcmlnaHRTaGlmdCB3b3VsZCBiZSA2LCBhcyB0aGUgdmFsdWUgcmVhZAorICAgICAqIGZyb20gdGhlIGFsbG9jYXRlZCBzYW1wbGUgbXVzdCBiZSByaWdodC1zaGlmdGVkIGJ5IDYgdG8gZ2V0IHRoZSBhY3R1YWwgc2FtcGxlIHZhbHVlLgorICAgICAqCisgICAgICogKy0tLS0tLS0tKy0tLS0tLS0tKworICAgICAqIHxWVlZWVlZWVnxWViAgICAgIHwKKyAgICAgKiArLS0tLS0tLS0rLS0tLS0tLS0rCisgICAgICogIDE1ICAgICA4IDcgICAgICAwCisgICAgICovCisgICAgdWludDMyX3QgcmlnaHRTaGlmdDsKKworICAgIGVudW0gZW5kaWFubmVzc190IDogdWludDMyX3QgeworICAgICAgICBOQVRJVkUsCisgICAgICAgIExJVFRMRV9FTkQsIC8vIExJVFRMRV9FTkRJQU4gaXMgcmVzZXJ2ZWQgbWFjcm8KKyAgICAgICAgQklHX0VORCwgICAgLy8gQklHX0VORElBTiBpcyBhIHJlc2VydmVkIG1hY3JvCisgICAgfSBlbmRpYW5uZXNzOyAvLy88IGVuZGlhbm5lc3Mgb2YgdGhlIHNhbXBsZXMKKworICAgIC8qKgorICAgICAqIFRoZSBmb2xsb3dpbmcgdHdvIGZpZWxkcyBkZWZpbmUgdGhlIHJlbGF0aW9uIGJldHdlZW4gbXVsdGlwbGUgcGxhbmVzLiBJZiBtdWx0aXBsZSBwbGFuZXMgYXJlCisgICAgICogaW50ZXJsZWF2ZWQsIHRoZXkgc2hhcmUgYSByb290IHBsYW5lICh3aGljaGV2ZXIgcGxhbmUncyBzdGFydCBhZGRyZXNzIGlzIHRoZSBsb3dlc3QpLCBhbmQKKyAgICAgKiB8b2Zmc2V0fCBpcyB0aGUgb2Zmc2V0IG9mIHRoaXMgcGxhbmUgaW5zaWRlIHRoZSByb290IHBsYW5lIChpbiBieXRlcykuIHxyb290SXh8IGlzIHRoZSBpbmRleAorICAgICAqIG9mIHRoZSByb290IHBsYW5lLiBJZiBhIHBsYW5lIGlzIGluZGVwZW5kZW50LCByb290SXggaXMgaXRzIGluZGV4IGFuZCBvZmZzZXQgaXMgMC4KKyAgICAgKi8KKyAgICB1aW50MzJfdCByb290SXg7IC8vLzwgaW5kZXggb2YgdGhlIHJvb3QgcGxhbmUKKyAgICB1aW50MzJfdCBvZmZzZXQ7IC8vLzwgb2Zmc2V0IG9mIHRoaXMgcGxhbmUgaW5zaWRlIG9mIHRoZSByb290IHBsYW5lCisKKyAgICBpbmxpbmUgY29uc3RleHByIHNzaXplX3QgbWluT2Zmc2V0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIGNvbnN0IHsKKyAgICAgICAgc3NpemVfdCBvZmZzID0gMDsKKyAgICAgICAgaWYgKHdpZHRoID4gMCAmJiBjb2xJbmMgPCAwKSB7CisgICAgICAgICAgICBvZmZzICs9IGNvbEluYyAqIChzc2l6ZV90KSh3aWR0aCAtIDEpOworICAgICAgICB9CisgICAgICAgIGlmIChoZWlnaHQgPiAwICYmIHJvd0luYyA8IDApIHsKKyAgICAgICAgICAgIG9mZnMgKz0gcm93SW5jICogKHNzaXplX3QpKGhlaWdodCAtIDEpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBvZmZzOworICAgIH0KKworICAgIGlubGluZSBjb25zdGV4cHIgc3NpemVfdCBtYXhPZmZzZXQodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCkgY29uc3QgeworICAgICAgICBzc2l6ZV90IG9mZnMgPSAoYWxsb2NhdGVkRGVwdGggKyA3KSA+PiAzOworICAgICAgICBpZiAod2lkdGggPiAwICYmIGNvbEluYyA+IDApIHsKKyAgICAgICAgICAgIG9mZnMgKz0gY29sSW5jICogKHNzaXplX3QpKHdpZHRoIC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhlaWdodCA+IDAgJiYgcm93SW5jID4gMCkgeworICAgICAgICAgICAgb2ZmcyArPSByb3dJbmMgKiAoc3NpemVfdCkoaGVpZ2h0IC0gMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG9mZnM7CisgICAgfQorfSBDMl9QQUNLOworCitzdHJ1Y3QgQzJQbGFuYXJMYXlvdXQgeworLy9wdWJsaWM6CisgICAgZW51bSB0eXBlX3QgOiB1aW50MzJfdCB7CisgICAgICAgIFRZUEVfVU5LTk9XTiA9IDAsCisgICAgICAgIFRZUEVfWVVWID0gMHgxMDAsICAgLy8vPCBZVVYgaW1hZ2Ugd2l0aCAzIHBsYW5lcworICAgICAgICBUWVBFX1lVVkEsICAgICAgICAgIC8vLzwgWVVWQSBpbWFnZSB3aXRoIDQgcGxhbmVzCisgICAgICAgIFRZUEVfUkdCLCAgICAgICAgICAgLy8vPCBSR0IgaW1hZ2Ugd2l0aCAzIHBsYW5lcworICAgICAgICBUWVBFX1JHQkEsICAgICAgICAgIC8vLzwgUkJHQSBpbWFnZSB3aXRoIDQgcGxhbmVzCisgICAgfTsKKworICAgIHR5cGVfdCB0eXBlOyAgICAgICAgICAgICAgICAgICAgLy8gaW1hZ2UgdHlwZQorICAgIHVpbnQzMl90IG51bVBsYW5lczsgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIGNvbXBvbmVudCBwbGFuZXMKKyAgICB1aW50MzJfdCByb290UGxhbmVzOyAgICAgICAgICAgIC8vIG51bWJlciBvZiBsYXlvdXQgcGxhbmVzIChyb290IHBsYW5lcykKKworICAgIGVudW0gcGxhbmVfaW5kZXhfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgUExBTkVfWSA9IDAsCisgICAgICAgIFBMQU5FX1UgPSAxLAorICAgICAgICBQTEFORV9WID0gMiwKKyAgICAgICAgUExBTkVfUiA9IDAsCisgICAgICAgIFBMQU5FX0cgPSAxLAorICAgICAgICBQTEFORV9CID0gMiwKKyAgICAgICAgUExBTkVfQSA9IDMsCisgICAgICAgIE1BWF9OVU1fUExBTkVTID0gNCwKKyAgICB9OworCisgICAgQzJQbGFuZUluZm8gcGxhbmVzW01BWF9OVU1fUExBTkVTXTsKK307CisKKy8qKgorICogQXNwZWN0IGZvciBvYmplY3RzIHRoYXQgaGF2ZSBhIHBsYW5hciBzZWN0aW9uIChjcm9wIHJlY3RhbmdsZSkuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4KKyAqLworY2xhc3MgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCA6IHB1YmxpYyBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCB7CisvLy8gXG5hbWUgUGxhbmFyIHNlY3Rpb24gaW50ZXJmYWNlCisvLy8gQHsKK3ByaXZhdGU6CisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGNvbnN0IEMyUmVjdCAmY3JvcCkKKyAgICAgICAgOiBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCh3aWR0aCwgaGVpZ2h0KSwKKyAgICAgICAgICBtQ3JvcChDMlJlY3Qoc3RkOjptaW4od2lkdGggLSBzdGQ6Om1pbihjcm9wLmxlZnQsIHdpZHRoKSwgY3JvcC53aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKGhlaWdodCAtIHN0ZDo6bWluKGNyb3AudG9wLCBoZWlnaHQpLCBjcm9wLmhlaWdodCkpLmF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKGNyb3AubGVmdCwgd2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWluKGNyb3AuaGVpZ2h0LCBoZWlnaHQpKSkgeworICAgIH0KKworcHVibGljOgorICAgIC8vIGNyb3AgY2FuIGJlIGFuIGVtcHR5IHJlY3QsIGRvZXMgbm90IGhhdmUgdG8gbGluZSB1cCB3aXRoIHN1YnNhbXBsaW5nCisgICAgLy8gTk9URTogd2UgZG8gbm90IHN1cHBvcnQgZmxvYXRpbmctcG9pbnQgY3JvcAorICAgIGlubGluZSBjb25zdGV4cHIgQzJSZWN0IGNyb3AoKSBjb25zdCB7IHJldHVybiBtQ3JvcDsgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIGNoaWxkIHBsYW5hciBzZWN0aW9uIGZvciB8Y3JvcHwsIHdoZXJlIHRoZSBjYXBhY2l0eSByZXByZXNlbnRzIHRoaXMgc2VjdGlvbi4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgY2hpbGRTZWN0aW9uKGNvbnN0IEMyUmVjdCAmY3JvcCkgY29uc3QgeworICAgICAgICByZXR1cm4gX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCgKKyAgICAgICAgICAgICAgICBtQ3JvcC53aWR0aCwgbUNyb3AuaGVpZ2h0LAorICAgICAgICAgICAgICAgIC8vIGNyb3AgYW5kIHRyYW5zbGF0ZSB8Y3JvcHwgcmVjdAorICAgICAgICAgICAgICAgIEMyUmVjdChjMl9taW4obUNyb3AucmlnaHQoKSAtIGMyX2NsYW1wKG1Dcm9wLmxlZnQsIGNyb3AubGVmdCwgbUNyb3AucmlnaHQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcm9wLndpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgYzJfbWluKG1Dcm9wLmJvdHRvbSgpIC0gYzJfY2xhbXAobUNyb3AudG9wLCBjcm9wLnRvcCwgbUNyb3AuYm90dG9tKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JvcC5oZWlnaHQpKQorICAgICAgICAgICAgICAgIC5hdChjMl9jbGFtcChtQ3JvcC5sZWZ0LCBjcm9wLmxlZnQsIG1Dcm9wLnJpZ2h0KCkpIC0gbUNyb3AubGVmdCwKKyAgICAgICAgICAgICAgICAgICAgYzJfY2xhbXAobUNyb3AudG9wLCBjcm9wLnRvcCwgbUNyb3AuYm90dG9tKCkpIC0gbUNyb3AudG9wKSk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgaW5saW5lIGNvbnN0ZXhwciBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KGNvbnN0IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0ICpwYXJlbnQpCisgICAgICAgIDogX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QocGFyZW50KSwgbUNyb3Aod2lkdGgoKSwgaGVpZ2h0KCkpIHt9CisKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoY29uc3QgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgKnBhcmVudCwgY29uc3QgQzJSZWN0ICZjcm9wKQorICAgICAgICA6IF9DMlBsYW5hckNhcGFjaXR5QXNwZWN0KHBhcmVudCksCisgICAgICAgICAgbUNyb3AocGFyZW50ID09IG51bGxwdHIgPyBDMlJlY3QoKSA6ICgoQzJSZWN0KSpwYXJlbnQpLmludGVyc2VjdChjcm9wKS5ub3JtYWxpemUoKSkgeyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAqcGFyZW50LCBjb25zdCBDMlJlY3QgJmNyb3ApCisgICAgICAgIDogX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QocGFyZW50KSwKKyAgICAgICAgICBtQ3JvcChwYXJlbnQgPT0gbnVsbHB0ciA/IEMyUmVjdCgpIDogcGFyZW50LT5jcm9wKCkuaW50ZXJzZWN0KGNyb3ApLm5vcm1hbGl6ZSgpKSB7IH0KKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgX0MyRWRpdGFibGVQbGFuYXJTZWN0aW9uQXNwZWN0OworICAgIEMyUmVjdCBtQ3JvcDsKKy8vLyBAfQorfTsKKworLyoqCisgKiBBc3BlY3QgZm9yIG9iamVjdHMgdGhhdCBoYXZlIGFuIGVkaXRhYmxlIHBsYW5hciBzZWN0aW9uIChjcm9wIHJlY3RhbmdsZSkuCisgKgorICogVGhpcyBjbGFzcyBpcyBjb3BpYWJsZS4KKyAqLworY2xhc3MgX0MyRWRpdGFibGVQbGFuYXJTZWN0aW9uQXNwZWN0IDogcHVibGljIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgeworLy8vIFxuYW1lIFBsYW5hciBzZWN0aW9uIGludGVyZmFjZQorLy8vIEB7CisgICAgdXNpbmcgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdDo6X0MyUGxhbmFyU2VjdGlvbkFzcGVjdDsKKworcHVibGljOgorICAgIC8vIGNyb3AgY2FuIGJlIGFuIGVtcHR5IHJlY3QsIGRvZXMgbm90IGhhdmUgdG8gbGluZSB1cCB3aXRoIHN1YnNhbXBsaW5nCisgICAgLy8gTk9URTogd2UgZG8gbm90IHN1cHBvcnQgZmxvYXRpbmctcG9pbnQgY3JvcAorICAgIGlubGluZSBjb25zdGV4cHIgQzJSZWN0IGNyb3AoKSBjb25zdCB7IHJldHVybiBtQ3JvcDsgfQorCisgICAgLyoqCisgICAgICogIFNldHMgY3JvcCB0byBjcm9wIGludGVyc2VjdGVkIHdpdGggWygwLDApIC4uICh3aWR0aCwgaGVpZ2h0KV0KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBzZXRDcm9wX2JlKGNvbnN0IEMyUmVjdCAmY3JvcCkgeworICAgICAgICBtQ3JvcC5sZWZ0ID0gc3RkOjptaW4od2lkdGgoKSwgY3JvcC5sZWZ0KTsKKyAgICAgICAgbUNyb3AudG9wID0gc3RkOjptaW4oaGVpZ2h0KCksIGNyb3AudG9wKTsKKyAgICAgICAgLy8gSXQncyBndWFyYW50ZWVkIHRoYXQgbUNyb3AubGVmdCA8PSB3aWR0aCgpICYmIG1Dcm9wLnRvcCA8PSBoZWlnaHQoKQorICAgICAgICBtQ3JvcC53aWR0aCA9IHN0ZDo6bWluKHdpZHRoKCkgLSBtQ3JvcC5sZWZ0LCBjcm9wLndpZHRoKTsKKyAgICAgICAgbUNyb3AuaGVpZ2h0ID0gc3RkOjptaW4oaGVpZ2h0KCkgLSBtQ3JvcC50b3AsIGNyb3AuaGVpZ2h0KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBJZiBjcm9wIGlzIHdpdGhpbiB0aGUgZGltZW5zaW9ucyBvZiB0aGlzIG9iamVjdCwgaXQgc2V0cyBjcm9wIHRvIGl0LgorICAgICAqCisgICAgICogXHJldHVybiB0cnVlIGlmZiBjcm9wIGlzIHdpdGhpbiB0aGUgZGltZW5zaW9ucyBvZiB0aGlzIG9iamVjdAorICAgICAqLworICAgIGlubGluZSBib29sIHNldENyb3AoY29uc3QgQzJSZWN0ICZjcm9wKSB7CisgICAgICAgIGlmICh3aWR0aCgpIDwgY3JvcC53aWR0aCB8fCBoZWlnaHQoKSA8IGNyb3AuaGVpZ2h0CisgICAgICAgICAgICAgICAgfHwgd2lkdGgoKSAtIGNyb3Aud2lkdGggPCBjcm9wLmxlZnQgfHwgaGVpZ2h0KCkgLSBjcm9wLmhlaWdodCA8IGNyb3AudG9wKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgbUNyb3AgPSBjcm9wOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisvLy8gQH0KK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3Igc2FmZSByYW5nZSBjYWxjdWxhdGlvbnMgdXNpbmcgc2l6ZV90LXMuCisgKi8KK2NsYXNzIEMyUGxhbmFyU2VjdGlvbiA6IHB1YmxpYyBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0IHsKK3B1YmxpYzoKKyAgICBpbmxpbmUgY29uc3RleHByIEMyUGxhbmFyU2VjdGlvbihjb25zdCBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCAmcGFyZW50LCBjb25zdCBDMlJlY3QgJmNyb3ApCisgICAgICAgIDogX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCgmcGFyZW50LCBjcm9wKSB7IH0KKworICAgIGlubGluZSBjb25zdGV4cHIgQzJQbGFuYXJTZWN0aW9uKGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnBhcmVudCwgY29uc3QgQzJSZWN0ICZjcm9wKQorICAgICAgICA6IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoJnBhcmVudCwgY3JvcCkgeyB9CisKKyAgICBpbmxpbmUgY29uc3RleHByIEMyUGxhbmFyU2VjdGlvbiBpbnRlcnNlY3QoY29uc3QgQzJSZWN0ICZjcm9wKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMlBsYW5hclNlY3Rpb24oKnRoaXMsIGNyb3ApOworICAgIH0KK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyBmb3Igc2ltcGxlIGFuZCBzYWZlIHBsYW5hciBjYXBhY2l0eSBhbmQgc2VjdGlvbiBjb25zdHJ1Y3Rpb24uCisgKi8KK2NsYXNzIEMyUGxhbmFyQ2FwYWNpdHkgOiBwdWJsaWMgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QgeworcHVibGljOgorICAgIGlubGluZSBjb25zdGV4cHIgZXhwbGljaXQgQzJQbGFuYXJDYXBhY2l0eShzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQpCisgICAgICAgIDogX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3QoYzJfbWluKHdpZHRoLCBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMyX21pbihoZWlnaHQsIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSkpIHsgfQorCisgICAgaW5saW5lIGNvbnN0ZXhwciBDMlBsYW5hclNlY3Rpb24gc2VjdGlvbihjb25zdCBDMlJlY3QgJmNyb3ApIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyUGxhbmFyU2VjdGlvbigqdGhpcywgY3JvcCk7CisgICAgfQorfTsKKworCisvKioKKyAqIFxpbmdyb3VwIGdyYXBoaWMgYWxsb2NhdG9yCisgKiAyRCBhbGxvY2F0aW9uIGludGVyZmFjZS4KKyAqLworY2xhc3MgQzJHcmFwaGljQWxsb2NhdGlvbiA6IHB1YmxpYyBfQzJQbGFuYXJDYXBhY2l0eUFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyBhIHJlY3Rhbmd1bGFyIHNlY3Rpb24gKGFzIGRlZmluZWQgYnkgfHJlY3R8KSBvZiBhIDJEIGFsbG9jYXRpb24gaW50byBsb2NhbCBwcm9jZXNzCisgICAgICogbWVtb3J5IGZvciBmbGV4aWJsZSBhY2Nlc3MuIE9uIHN1Y2Nlc3MsIGl0IGZpbGxzIG91dCB8bGF5b3V0fCB3aXRoIHRoZSBwbGFuZSBzcGVjaWZpY2F0aW9ucworICAgICAqIGFuZCBmaWxscyB0aGUgfGFkZHJ8IGFycmF5IHdpdGggcG9pbnRlcnMgdG8gdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHRvcC1sZWZ0IHBpeGVsIG9mIGVhY2gKKyAgICAgKiBwbGFuZSB1c2VkLiBPdGhlcndpc2UsIGl0IGxlYXZlcyB8bGF5b3V0fCBhbmQgfGFkZHJ8IHVudG91Y2hlZC4gfGZlbmNlfCB3aWxsIGNvbnRhaW4KKyAgICAgKiBhbiBhY3F1aXJlIHN5bmMgZmVuY2Ugb2JqZWN0LiBJZiBpdCBpcyBhbHJlYWR5IHNhZmUgdG8gYWNjZXNzIHRoZQorICAgICAqIGJ1ZmZlciBjb250ZW50cywgdGhlbiBpdCB3aWxsIGJlIGFuIGVtcHR5IChhbHJlYWR5IGZpcmVkKSBmZW5jZS4KKyAgICAgKgorICAgICAqIFNhZmUgcmVnaW9ucyBmb3IgdGhlIHBvaW50ZXIgYWRkcmVzc2VzIHJldHVybmVkIGNhbiBiZSBnb3R0ZW4gdmlhIEMyTGF5b3V0SW5mby5taW5PZmZzZXQoKS8KKyAgICAgKiBtYXhPZmZzZXQoKS4KKyAgICAgKgorICAgICAqIFxwYXJhbSByZWN0ICAgICAgICAgIHNlY3Rpb24gdG8gYmUgbWFwcGVkICh0aGlzIGRvZXMgbm90IGhhdmUgdG8gYmUgYWxpZ25lZCkKKyAgICAgKiBccGFyYW0gdXNhZ2UgICAgICAgICB0aGUgZGVzaXJlZCB1c2FnZS4gXHRvZG8gdGhpcyBtdXN0IGJlIGtTb2Z0d2FyZVJlYWQgYW5kL29yCisgICAgICogICAgICAgICAgICAgICAgICAgICAga1NvZnR3YXJlV3JpdGUuCisgICAgICogXHBhcmFtIGZlbmNlICAgICAgICAgYSBwb2ludGVyIHRvIGEgZmVuY2Ugb2JqZWN0IGlmIGFuIGFzeW5jIG1hcHBpbmcgaXMgcmVxdWVzdGVkLiBJZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG5vdC1udWxsLCBhbmQgYWNxdWlyZSBmZW5jZSB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MsIG9yIGVtcHR5CisgICAgICogICAgICAgICAgICAgICAgICAgICAgZmVuY2Ugb24gZmFpbHVyZS4gSWYgbnVsbCwgdGhlIG1hcHBpbmcgd2lsbCBiZSBzeW5jaHJvbm91cy4KKyAgICAgKiBccGFyYW0gbGF5b3V0ICAgICAgICBhIHBvaW50ZXIgdG8gd2hlcmUgdGhlIG1hcHBlZCBwbGFuZXMnIGRlc2NyaXB0b3JzIHdpbGwgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzdG9yZWQuIE9uIGZhaWx1cmUsIG51bGxwdHIgd2lsbCBiZSBzdG9yZWQgaGVyZS4KKyAgICAgKiBccGFyYW0gYWRkciAgICAgICAgICBwb2ludGVyIHRvIGFuIGFycmF5IHdpdGggYXQgbGVhc3QgQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMuIE9ubHkgbGF5b3V0Lm51bVBsYW5lcyBlbGVtZW50cyB3aWxsIGJlIG1vZGlmaWVkIG9uIHN1Y2Nlc3MuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBtYXAgdGhlIHNlY3Rpb24KKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSB0aGVyZSBpcyBhbHJlYWR5IGEgbWFwcGVkIHJlZ2lvbiBhbmQgdGhpcyBhbGxvY2F0aW9uIGNhbm5vdCBzdXBwb3J0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgbXVsdGktbWFwcGluZyAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBvcGVyYXRpb24gdGltZWQgb3V0CisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY29tcGxldGUgdGhlIG9wZXJhdGlvbgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHRoZSBwYXJhbWV0ZXJzIChyZWN0KSBhcmUgaW52YWxpZCBvciBvdXRzaWRlIHRoZSBhbGxvY2F0aW9uLCBvciB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICB1c2FnZSBmbGFncyBhcmUgaW52YWxpZCAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbiBmcm9tIGNvbXBsZXRpbmcgKHVuZXhwZWN0ZWQpCisKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG1hcCgKKyAgICAgICAgICAgIEMyUmVjdCByZWN0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLCBDMkZlbmNlICpmZW5jZSwKKyAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0ICpsYXlvdXQgLyogbm9ubnVsbCAqLywgdWludDhfdCAqKmFkZHIgLyogbm9ubnVsbCAqLykgPSAwOworCisgICAgLyoqCisgICAgICogVW5tYXBzIGEgc2VjdGlvbiBvZiBhbiBhbGxvY2F0aW9uIGF0IHxhZGRyfCB3aXRoIHxyZWN0fC4gVGhlc2UgbXVzdCBiZSBwYXJhbWV0ZXJzIHByZXZpb3VzbHkKKyAgICAgKiBwYXNzZWQgdG8gYW5kIHJldHVybmVkIGJ5IHxtYXB8OyBvdGhlcndpc2UsIHRoaXMgb3BlcmF0aW9uIGlzIGEgbm8tb3AuCisgICAgICoKKyAgICAgKiBccGFyYW0gYWRkciAgICAgICAgICBwb2ludGVyIHRvIGFuIGFycmF5IHdpdGggYXQgbGVhc3QgQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTCisgICAgICogICAgICAgICAgICAgICAgICAgICAgZWxlbWVudHMgY29udGFpbmluZyB0aGUgc3RhcnRpbmcgYWRkcmVzc2VzIG9mIHRoZSBtYXBwZWQgbGF5ZXJzCisgICAgICogXHBhcmFtIHJlY3QgICAgICAgICAgYm91bmRhcmllcyBvZiB0aGUgbWFwcGVkIHNlY3Rpb24KKyAgICAgKiBccGFyYW0gZmVuY2UgICAgICAgICBhIHBvaW50ZXIgdG8gYSBmZW5jZSBvYmplY3QgaWYgYW4gYXN5bmMgdW5tYXBwaW5nIGlzIHJlcXVlc3RlZC4gSWYKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBub3QtbnVsbCwgYSByZWxlYXNlIGZlbmNlIHdpbGwgYmUgc3RvcmVkIGhlcmUgb24gc3VjY2Vzcywgb3IgZW1wdHkgZmVuY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvbiBmYWlsdXJlLiBUaGlzIGZlbmNlIHNpZ25hbHMgd2hlbiB0aGUgb3JpZ2luYWwgYWxsb2NhdGlvbiBjb250YWlucworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGFsbCBjaGFuZ2VzIHRoYXQgaGFwcGVuZWQgdG8gdGhlIG1hcHBlZCBzZWN0aW9uLiBJZiBudWxsLCB0aGUgdW5tYXBwaW5nCisgICAgICogICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSBzeW5jaHJvbm91cy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgb3BlcmF0aW9uIHRpbWVkIG91dAorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIHRoZXJlIGlzIG5vIHN1Y2ggbWFwcGVkIHJlZ2lvbiAoY2FsbGVyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIG9wZXJhdGlvbiBmcm9tIGNvbXBsZXRpbmcgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byB1bm1hcCB0aGUgc2VjdGlvbiAodW5leHBlY3RlZCAtIHN5c3RlbSkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHVubWFwKAorICAgICAgICAgICAgdWludDhfdCAqKmFkZHIgLyogbm9ubnVsbCAqLywgQzJSZWN0IHJlY3QsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBhbGxvY2F0b3IgSUQgZm9yIHRoaXMgYWxsb2NhdGlvbi4gVGhpcyBpcyB1c2VmdWwgdG8gcHV0IHRoZSBoYW5kbGUgaW50byBjb250ZXh0LgorICAgICAqLworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGlvbiBoYW5kbGUuCisgICAgICovCisgICAgdmlydHVhbCBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIHNhbWUgYWxsb2NhdGlvbiBhcyB8b3RoZXJ8LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY0FsbG9jYXRpb24+ICZvdGhlcikgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgdXNpbmcgX0MyUGxhbmFyQ2FwYWNpdHlBc3BlY3Q6Ol9DMlBsYW5hckNhcGFjaXR5QXNwZWN0OworICAgIHZpcnR1YWwgfkMyR3JhcGhpY0FsbG9jYXRpb24oKSA9IGRlZmF1bHQ7Cit9OworCitjbGFzcyBDMkdyYXBoaWNBbGxvY2F0aW9uOworCisvKioKKyAqIEEgMkQgYmxvY2suCisgKgorICogXG5vdGUgd2lkdGgoKS9oZWlnaHQoKSBpcyBub3QgbWVhbmluZ2Z1bCBmb3IgdXNlcnMgb2YgYmxvY2tzOyBpbnN0ZWFkLCBjcm9wKCkud2lkdGgoKSBhbmQKKyAqIGNyb3AoKS5oZWlnaHQoKSBpcyB0aGUgY2FwYWNpdHkgb2YgdGhlIHVzYWJsZSBwb3J0aW9uLiBVc2UgYW5kIGNyb3AoKSBpZiBhY2Nlc3NpbmcgdGhlIGJsb2NrCisgKiBkaXJlY3RseSB0aHJvdWdoIGl0cyBoYW5kbGUgdG8gcmVwcmVzZW50IHRoZSBhbGxvdHRlZCByZWdpb24gb2YgdGhlIHVuZGVybHlpbmcgYWxsb2NhdGlvbiB0byB0aGlzCisgKiBibG9jay4KKyAqLworY2xhc3MgQzJCbG9jazJEIDogcHVibGljIF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcgaGFuZGxlIGZvciB0aGlzIGFsbG9jYXRpb24uCisgICAgICoKKyAgICAgKiBcbm90ZSB0aGF0IHRoZSBibG9jayBhbmQgaXRzIGJsb2NrIHBvb2wgaGFzIHNoYXJlZCBvd25lcnNoaXAgb2YgdGhlIGhhbmRsZQorICAgICAqICAgICAgIGFuZCBpZiBhbGwgcmVmZXJlbmNlcyB0byB0aGUgYmxvY2sgYXJlIHJlbGVhc2VkLCB0aGUgdW5kZXJseWluZyBibG9jaworICAgICAqICAgICAgIGFsbG9jYXRpb24gbWF5IGdldCByZXVzZWQgZXZlbiBpZiBhIGNsaWVudCBrZWVwcyBhIGNsb25lIG9mIHRoaXMgaGFuZGxlLgorICAgICAqLworICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFsbG9jYXRvcidzIElEIHRoYXQgY3JlYXRlZCB0aGUgdW5kZXJseWluZyBhbGxvY2F0aW9uIGZvciB0aGlzIGJsb2NrLiBUaGlzCisgICAgICogcHJvdmlkZXMgdGhlIGNvbnRleHQgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGhhbmRsZS4KKyAgICAgKi8KKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgSW1wbDsKKyAgICBDMkJsb2NrMkQoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24pOworCisgICAgZnJpZW5kIHN0cnVjdCBfQzJCbG9ja0ZhY3Rvcnk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IG1JbXBsOworfTsKKworLyoqCisgKiBHcmFwaGljIHZpZXcgcHJvdmlkZXMgcmVhZCBvciByZWFkLXdyaXRlIGFjY2VzcyBmb3IgYSBncmFwaGljIGJsb2NrLgorICoKKyAqIFRoaXMgY2xhc3MgaXMgY29waWFibGUuCisgKgorICogXG5vdGUgRHVlIHRvIHRoZSBzdWJzYW1wbGluZyBvZiBncmFwaGljIGJ1ZmZlcnMsIGEgcmVhZCB2aWV3IG11c3Qgc3RpbGwgY29udGFpbiBhIGNyb3AgcmVjdGFuZ2xlCisgKiB0byBlbnN1cmUgc3Vic2FtcGxpbmcgaXMgZm9sbG93ZWQuIFRoaXMgcmVzdWx0cyBpbiBuZWFybHkgaWRlbnRpY2FsIGludGVyZmFjZSBiZXR3ZWVuIHJlYWQgYW5kCisgKiB3cml0ZSB2aWV3cywgc28gQzJHcmFwaGljVmlldyBjYW4gZW5jb21wYXNzIGJvdGggb2YgdGhlbS4KKyAqLworY2xhc3MgQzJHcmFwaGljVmlldyA6IHB1YmxpYyBfQzJFZGl0YWJsZVBsYW5hclNlY3Rpb25Bc3BlY3QgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFxyZXR1cm4gYXJyYXkgb2YgcG9pbnRlcnMgKG9mIGxheW91dCgpLm51bVBsYW5lcyBlbGVtZW50cykgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwbGFuZXMgb3IKKyAgICAgKiBudWxscHRyIG9uIGVycm9yLiBSZWdhcmRsZXNzIG9mIGNyb3AgcmVjdCwgdGhleSBhbHdheXMgcG9pbnQgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiBlYWNoCisgICAgICogcGxhbmUuIEFjY2VzcyBvdXRzaWRlIG9mIHRoZSBjcm9wIHJlY3QgcmVzdWx0cyBpbiBhbiB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgICovCisgICAgY29uc3QgdWludDhfdCAqY29uc3QgKmRhdGEoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gYXJyYXkgb2YgcG9pbnRlcnMgKG9mIGxheW91dCgpLm51bVBsYW5lcyBlbGVtZW50cykgdG8gdGhlIHN0YXJ0IG9mIHRoZSBwbGFuZXMgb3IKKyAgICAgKiBudWxscHRyIG9uIGVycm9yLiBSZWdhcmRsZXNzIG9mIGNyb3AgcmVjdCwgdGhleSBhbHdheXMgcG9pbnQgdG8gdGhlIHRvcC1sZWZ0IGNvcm5lciBvZiBlYWNoCisgICAgICogcGxhbmUuIEFjY2VzcyBvdXRzaWRlIG9mIHRoZSBjcm9wIHJlY3QgcmVzdWx0cyBpbiBhbiB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgICovCisgICAgdWludDhfdCAqY29uc3QgKmRhdGEoKTsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gbGF5b3V0IG9mIHRoZSBncmFwaGljIGJsb2NrIHRvIGludGVycHJldCB0aGUgcmV0dXJuZWQgZGF0YS4KKyAgICAgKi8KKyAgICBjb25zdCBDMlBsYW5hckxheW91dCBsYXlvdXQoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBzZWN0aW9uIG9mIHRoaXMgdmlldy4KKyAgICAgKgorICAgICAqIFxwYXJhbSByZWN0ICAgIHRoZSBkaW1lbnNpb24gb2YgdGhlIHNlY3Rpb24uIFxub3RlIFRoaXMgaXMgY2xhbXBlZCB0byB0aGUgY3JvcCBvZiB0aGlzIHZpZXcuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgcmVhZCB2aWV3IGNvbnRhaW5pbmcgdGhlIHJlcXVlc3RlZCBzZWN0aW9uIG9mIHRoaXMgdmlldworICAgICAqLworICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgc3ViVmlldyhjb25zdCBDMlJlY3QgJnJlY3QpIGNvbnN0OworICAgIEMyR3JhcGhpY1ZpZXcgc3ViVmlldyhjb25zdCBDMlJlY3QgJnJlY3QpOworCisgICAgLyoqCisgICAgICogXHJldHVybiBlcnJvciBkdXJpbmcgdGhlIGNyZWF0aW9uL21hcHBpbmcgb2YgdGhpcyB2aWV3LgorICAgICAqLworICAgIGMyX3N0YXR1c190IGVycm9yKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgICBjbGFzcyBJbXBsOworICAgIEMyR3JhcGhpY1ZpZXcoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24pOworICAgIGV4cGxpY2l0IEMyR3JhcGhpY1ZpZXcoYzJfc3RhdHVzX3QgZXJyb3IpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyQmxvY2tGYWN0b3J5OworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogQSBjb25zdGFudCAocmVhZC1vbmx5KSBncmFwaGljIGJsb2NrIChwb3J0aW9uIG9mIGFuIGFsbG9jYXRpb24pIHdpdGggYW4gYWNxdWlyZSBmZW5jZS4KKyAqIEJsb2NrcyBhcmUgdW5tYXBwZWQgd2hlbiBjcmVhdGVkLCBhbmQgY2FuIGJlIG1hcHBlZCBpbnRvIGEgcmVhZCB2aWV3IG9uIGRlbWFuZC4KKyAqCisgKiBUaGlzIGNsYXNzIGlzIGNvcGlhYmxlIGFuZCBjb250YWlucyBhIHJlZmVyZW5jZSB0byB0aGUgYWxsb2NhdGlvbiB0aGF0IGl0IGlzIGJhc2VkIG9uLgorICovCitjbGFzcyBDMkNvbnN0R3JhcGhpY0Jsb2NrIDogcHVibGljIEMyQmxvY2syRCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyB0aGlzIGJsb2NrIGludG8gbWVtb3J5IGFuZCByZXR1cm5zIGEgcmVhZCB2aWV3IGZvciBpdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSByZWFkIHZpZXcgZm9yIHRoaXMgYmxvY2suCisgICAgICovCisgICAgQzJBY3F1aXJhYmxlPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IG1hcCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHNlY3Rpb24gb2YgdGhpcyBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSByZWN0ICAgIHRoZSBjb29yZGluYXRlcyBvZiB0aGUgc2VjdGlvbi4gXG5vdGUgVGhpcyBpcyBjbGFtcGVkIHRvIHRoZSBjcm9wIHJlY3RhbmdsZSBvZgorICAgICAqICAgICAgICAgICAgICB0aGlzIGJsb2NrLgorICAgICAqCisgICAgICogXHJldHVybiBhIGNvbnN0YW50IGdyYXBoaWMgYmxvY2sgY29udGFpbmluZyBhIHBvcnRpb24gb2YgdGhpcyBibG9jaworICAgICAqLworICAgIEMyQ29uc3RHcmFwaGljQmxvY2sgc3ViQmxvY2soY29uc3QgQzJSZWN0ICZyZWN0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGFjcXVpcmUgZmVuY2UgZm9yIHRoaXMgYmxvY2suCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgZmVuY2UgdGhhdCBtdXN0IGJlIHdhaXRlZCBvbiBiZWZvcmUgcmVhZGluZyB0aGUgYmxvY2suCisgICAgICovCisgICAgQzJGZW5jZSBmZW5jZSgpIGNvbnN0IHsgcmV0dXJuIG1GZW5jZTsgfQorCitwcm90ZWN0ZWQ6CisgICAgQzJDb25zdEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uLCBDMkZlbmNlIGZlbmNlKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKKyAgICBDMkZlbmNlIG1GZW5jZTsKK307CisKKy8qKgorICogR3JhcGhpYyBibG9jayBpcyBhIHdyaXRlYWJsZSAyRCBibG9jay4gT25jZSB3cml0dGVuLCBpdCBjYW4gYmUgc2hhcmVkIGluIHdob2xlIG9yIGluIHBhcnQgd2l0aAorICogY29uc3VtZXJzL3JlYWRlcnMgYXMgcmVhZC1vbmx5IGNvbnN0IGdyYXBoaWMgYmxvY2suCisgKi8KK2NsYXNzIEMyR3JhcGhpY0Jsb2NrIDogcHVibGljIEMyQmxvY2syRCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogTWFwcyB0aGlzIGJsb2NrIGludG8gbWVtb3J5IGFuZCByZXR1cm5zIGEgd3JpdGUgdmlldyBmb3IgaXQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgd3JpdGUgdmlldyBmb3IgdGhpcyBibG9jay4KKyAgICAgKi8KKyAgICBDMkFjcXVpcmFibGU8QzJHcmFwaGljVmlldz4gbWFwKCk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgcmVhZC1vbmx5IGNvbnN0IGxpbmVhciBibG9jayBmb3IgYSBwb3J0aW9uIG9mIHRoaXMgYmxvY2s7IG9wdGlvbmFsbHkgcHJvdGVjdGVkCisgICAgICogYnkgYW4gYWNxdWlyZSBmZW5jZS4gVGhlcmUgYXJlIHR3byB3YXlzIHRvIHVzZSB0aGlzOgorICAgICAqCisgICAgICogMSkgc2hhcmUgcmVhZHkgYmxvY2sgYWZ0ZXIgd3JpdGluZyBkYXRhIGludG8gdGhlIGJsb2NrLiBJbiB0aGlzIGNhc2Ugbm8gZmVuY2Ugc2hhbGwgYmUKKyAgICAgKiAgICBzdXBwbGllZCwgYW5kIHRoZSBibG9jayBzaGFsbCBub3QgYmUgbW9kaWZpZWQgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZC4KKyAgICAgKiAyKSBzaGFyZSBibG9jayBtZXRhZGF0YSBiZWZvcmUgYWN0dWFsbHkgKGZpbmlzaGluZykgd3JpdGluZyB0aGUgZGF0YSBpbnRvIHRoZSBibG9jay4gSW4KKyAgICAgKiAgICB0aGlzIGNhc2UgYSBmZW5jZSBtdXN0IGJlIHN1cHBsaWVkIHRoYXQgd2lsbCBiZSB0cmlnZ2VyZWQgd2hlbiB0aGUgZGF0YSBpcyB3cml0dGVuLgorICAgICAqICAgIFRoZSBibG9jayBzaGFsbCBiZSBtb2RpZmllZCBvbmx5IHVudGlsIGZpcmluZyB0aGUgZXZlbnQgZm9yIHRoZSBmZW5jZS4KKyAgICAgKi8KKyAgICBDMkNvbnN0R3JhcGhpY0Jsb2NrIHNoYXJlKGNvbnN0IEMyUmVjdCAmY3JvcCwgQzJGZW5jZSBmZW5jZSk7CisKK3Byb3RlY3RlZDoKKyAgICBDMkdyYXBoaWNCbG9jayhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCAmc2VjdGlvbik7CisKKyAgICBmcmllbmQgc3RydWN0IF9DMkJsb2NrRmFjdG9yeTsKK307CisKKy8vLyBAfQorCisvLy8gXGRlZmdyb3VwIGJ1ZmZlcl9vbmogQnVmZmVyIG9iamVjdHMKKy8vLyBAeworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vICBCVUZGRVJTCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8vIFx0b2RvOiBEbyB3ZSBzdGlsbCBuZWVkIHRoaXM/CisvLy8KKy8vIFRoZXJlIGFyZSAyIGtpbmRzIG9mIGJ1ZmZlcnM6IGxpbmVhciBvciBncmFwaGljLiBMaW5lYXIgYnVmZmVycyBjYW4gY29udGFpbiBhIHNpbmdsZSBibG9jaywgb3IKKy8vIGEgbGlzdCBvZiBibG9ja3MgKExJTkVBUl9DSFVOS1MpLiBTdXBwb3J0IGZvciBsaXN0IG9mIGJsb2NrcyBpcyBvcHRpb25hbCwgYW5kIGNhbiBhbGxvdyBjb25zdW1pbmcKKy8vIGRhdGEgZnJvbSBjaXJjdWxhciBidWZmZXJzIG9yIHNjYXR0ZXJlZCBkYXRhIHNvdXJjZXMgd2l0aG91dCBleHRyYSBtZW1jcHkuIEN1cnJlbnRseSwgbGlzdCBvZgorLy8gZ3JhcGhpYyBibG9ja3MgaXMgbm90IHN1cHBvcnRlZC4KKworY2xhc3MgQzJMaW5lYXJCdWZmZXI7ICAgLy8gcmVhZC13cml0ZSBidWZmZXIKK2NsYXNzIEMyR3JhcGhpY0J1ZmZlcjsgIC8vIHJlYWQtd3JpdGUgYnVmZmVyCitjbGFzcyBDMkxpbmVhckNodW5rc0J1ZmZlcjsKKworLyoqCisgKiBDMkJ1ZmZlckRhdGE6IHRoZSBtYWluLCBub24tbWV0YSBkYXRhIG9mIGEgYnVmZmVyLiBBIGJ1ZmZlciBjYW4gY29udGFpbiBlaXRoZXIgbGluZWFyIGJsb2NrcworICogb3IgZ3JhcGhpYyBibG9ja3MsIGFuZCBjYW4gY29udGFpbiBlaXRoZXIgYSBzaW5nbGUgYmxvY2sgb3IgbXVsdGlwbGUgYmxvY2tzLiBUaGlzIGlzIGRldGVybWluZWQKKyAqIGJ5IGl0cyB0eXBlLgorICovCitjbGFzcyBDMkJ1ZmZlckRhdGEgeworcHVibGljOgorICAgIC8qKgorICAgICAqICBUaGUgdHlwZSBvZiBidWZmZXIgZGF0YS4KKyAgICAgKi8KKyAgICBlbnVtIHR5cGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgSU5WQUxJRCwgICAgICAgICAgICAvLy88IGludmFsaWQgYnVmZmVyIHR5cGUuIERvIG5vdCB1c2UuCisgICAgICAgIExJTkVBUiwgICAgICAgICAgICAgLy8vPCB0aGUgYnVmZmVyIGNvbnRhaW5zIGEgc2luZ2xlIGxpbmVhciBibG9jaworICAgICAgICBMSU5FQVJfQ0hVTktTLCAgICAgIC8vLzwgdGhlIGJ1ZmZlciBjb250YWlucyBvbmUgb3IgbW9yZSBsaW5lYXIgYmxvY2tzCisgICAgICAgIEdSQVBISUMsICAgICAgICAgICAgLy8vPCB0aGUgYnVmZmVyIGNvbnRhaW5zIGEgc2luZ2xlIGdyYXBoaWMgYmxvY2sKKyAgICAgICAgR1JBUEhJQ19DSFVOS1MsICAgICAvLy88IHRoZSBidWZmZXIgY29udGFpbnMgb25lIG9mIG1vcmUgZ3JhcGhpYyBibG9ja3MKKyAgICB9OworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgdHlwZSBvZiB0aGlzIGJ1ZmZlciAoZGF0YSkuCisgICAgICogXHJldHVybiB0aGUgdHlwZSBvZiB0aGlzIGJ1ZmZlciBkYXRhLgorICAgICAqLworICAgIHR5cGVfdCB0eXBlKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsaW5lYXIgYmxvY2tzIG9mIHRoaXMgYnVmZmVyLgorICAgICAqIFxyZXR1cm4gYSBjb25zdGFudCBsaXN0IG9mIGNvbnN0IGxpbmVhciBibG9ja3Mgb2YgdGhpcyBidWZmZXIuCisgICAgICogXHJldHZhbCBlbXB0eSBsaXN0IGlmIHRoaXMgYnVmZmVyIGRvZXMgbm90IGNvbnRhaW4gbGluZWFyIGJsb2NrKHMpLgorICAgICAqLworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gbGluZWFyQmxvY2tzKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBncmFwaGljIGJsb2NrcyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBccmV0dXJuIGEgY29uc3RhbnQgbGlzdCBvZiBjb25zdCBncmFwaGljIGJsb2NrcyBvZiB0aGlzIGJ1ZmZlci4KKyAgICAgKiBccmV0dmFsIGVtcHR5IGxpc3QgaWYgdGhpcyBidWZmZXIgZG9lcyBub3QgY29udGFpbiBncmFwaGljIGJsb2NrKHMpLgorICAgICAqLworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+IGdyYXBoaWNCbG9ja3MoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKworcHJvdGVjdGVkOgorICAgIC8vIG5vIHB1YmxpYyBjb25zdHJ1Y3RvcgorICAgIGV4cGxpY2l0IEMyQnVmZmVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpOworICAgIGV4cGxpY2l0IEMyQnVmZmVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKTsKK307CisKKy8qKgorICogQzJCdWZmZXI6IGJ1ZmZlciBiYXNlIGNsYXNzLiBUaGVzZSBhcmUgYWx3YXlzIHVzZWQgYXMgc2hhcmVkX3B0cnMuIFRob3VnaCB0aGUgdW5kZXJseWluZyBidWZmZXIKKyAqIG9iamVjdHMgKG5hdGl2ZSBidWZmZXJzLCBpb24gYnVmZmVycywgb3IgZG1hYnVmcykgYXJlIHJlZmVyZW5jZS1jb3VudGVkIGJ5IHRoZSBzeXN0ZW0sCisgKiBDMkJ1ZmZlcnMgaG9sZCBvbmx5IGEgc2luZ2xlIHJlZmVyZW5jZS4KKyAqCisgKiBUaGVzZSBvYmplY3RzIGNhbm5vdCBiZSB1c2VkIG9uIHRoZSBzdGFjay4KKyAqLworY2xhc3MgQzJCdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEdldHMgdGhlIGJ1ZmZlcidzIGRhdGEuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBidWZmZXIncyBkYXRhLgorICAgICAqLworICAgIGNvbnN0IEMyQnVmZmVyRGF0YSBkYXRhKCkgY29uc3Q7CisKKyAgICAvLy9AbmFtZSBQcmUtZGVzdHJveSBub3RpZmljYXRpb24gaGFuZGxpbmcKKyAgICAvLy9AeworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgZm9yIG5vdGlmaWNhdGlvbiBqdXN0IHByaW9yIHRvIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGlzIG9iamVjdC4KKyAgICAgKi8KKyAgICB0eXBlZGVmIHZvaWQgKCpPbkRlc3Ryb3lOb3RpZnkpIChjb25zdCBDMkJ1ZmZlciAqYnVmLCB2b2lkICphcmcpOworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXJzIGZvciBhIHByZS1kZXN0cm95IG5vdGlmaWNhdGlvbi4gVGhpcyBpcyBjYWxsZWQganVzdCBwcmlvciB0byB0aGUgZGVzdHJ1Y3Rpb24gb2YKKyAgICAgKiB0aGlzIGJ1ZmZlciAod2hlbiB0aGlzIGJ1ZmZlciBpcyBubyBsb25nZXIgdmFsaWQuKQorICAgICAqCisgICAgICogXHBhcmFtIG9uRGVzdHJveU5vdGlmeSAgIHRoZSBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAgICAgKiBccGFyYW0gYXJnICAgICAgICAgICAgICAgYW4gYXJiaXRyYXJ5IHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgcmVnaXN0cmF0aW9uIHdhcyBzdWNjZXNzZnVsLgorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFIGEgbm90aWZpY2F0aW9uIHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQgZm9yIHRoaXMgY2FsbGJhY2sgYW5kIGFyZ3VtZW50CisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gcmVnaXN0ZXIgZm9yIHRoaXMgY2FsbGJhY2sKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBhbiB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgcmVnaXN0cmF0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIGMyX3N0YXR1c190IHJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KE9uRGVzdHJveU5vdGlmeSBvbkRlc3Ryb3lOb3RpZnksIHZvaWQgKmFyZyA9IG51bGxwdHIpOworCisgICAgLyoqCisgICAgICogVW5yZWdpc3RlcnMgYSBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgcHJlLWRlc3Ryb3kgbm90aWZpY2F0aW9uLgorICAgICAqCisgICAgICogXHBhcmFtIG9uRGVzdHJveU5vdGlmeSAgIHRoZSBub3RpZmljYXRpb24gY2FsbGJhY2sKKyAgICAgKiBccGFyYW0gYXJnICAgICAgICAgICAgICAgYW4gYXJiaXRyYXJ5IHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgdW5yZWdpc3RyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgdGhlIG5vdGlmaWNhdGlvbiB3YXMgbm90IGZvdW5kCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgYW4gdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIHJlZ2lzdHJhdGlvbiAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCB1bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KE9uRGVzdHJveU5vdGlmeSBvbkRlc3Ryb3lOb3RpZnksIHZvaWQgKmFyZyA9IG51bGxwdHIpOworCisgICAgLy8vQH0KKworICAgIHZpcnR1YWwgfkMyQnVmZmVyKCkgPSBkZWZhdWx0OworCisgICAgLy8vQG5hbWUgQnVmZmVyLXNwZWNpZmljIGFyYml0cmFyeSBtZXRhZGF0YSBoYW5kbGluZworICAgIC8vL0B7CisKKyAgICAvKioKKyAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIG1ldGFkYXRhIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBjb25zdGFudCBsaXN0IG9mIGluZm8gb2JqZWN0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBidWZmZXIuCisgICAgICovCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IGluZm8oKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEF0dGFjaGVzIChvciB1cGRhdGVzKSBhbiAoZXhpc3RpbmcpIG1ldGFkYXRhIGZvciB0aGlzIGJ1ZmZlci4KKyAgICAgKiBJZiB0aGUgbWV0YWRhdGEgaXMgc3RyZWFtIHNwZWNpZmljLCB0aGUgc3RyZWFtIGluZm9ybWF0aW9uIHdpbGwgYmUgcmVzZXQuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5mbyBNZXRhZGF0YSB0byB1cGRhdGUKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBtZXRhZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IGF0dGFjaGVkL3VwZGF0ZWQuCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gYXR0YWNoIHRoZSBtZXRhZGF0YSAodGhpcyByZXR1cm4gdmFsdWUgaXMgbm90CisgICAgICogICAgICAgICAgICAgICAgICAgICAgdXNlZCBpZiB0aGUgc2FtZSBraW5kIG9mIG1ldGFkYXRhIGlzIGFscmVhZHkgYXR0YWNoZWQgdG8gdGhlIGJ1ZmZlcikuCisgICAgICovCisgICAgYzJfc3RhdHVzX3Qgc2V0SW5mbyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiAmaW5mbyk7CisKKyAgICAvKioKKyAgICAgKiBDaGVja3MgaWYgdGhlcmUgaXMgYSBjZXJ0YWluIHR5cGUgb2YgbWV0YWRhdGEgYXR0YWNoZWQgdG8gdGhpcyBidWZmZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5kZXggdGhlIHBhcmFtZXRlciB0eXBlIG9mIHRoZSBtZXRhZGF0YQorICAgICAqCisgICAgICogXHJldHVybiB0cnVlIGlmZiB0aGVyZSBpcyBhIG1ldGFkYXRhIHdpdGggdGhlIHBhcmFtZXRlciB0eXBlIGF0dGFjaGVkIHRvIHRoaXMgYnVmZmVyLgorICAgICAqLworICAgIGJvb2wgaGFzSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGVyZSBpcyBhIGNlcnRhaW4gdHlwZSBvZiBtZXRhZGF0YSBhdHRhY2hlZCB0byB0aGlzIGJ1ZmZlciwgYW5kIHJldHVybnMgYQorICAgICAqIHNoYXJlZCBwb2ludGVyIHRvIGl0IGlmIHRoZXJlIGlzLiBSZXR1cm5zIGFuIGVtcHR5IHNoYXJlZCBwb2ludGVyIG9iamVjdCAobnVsbHB0cikgaWYgdGhlcmUKKyAgICAgKiBpcyBub3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5kZXggdGhlIHBhcmFtZXRlciB0eXBlIG9mIHRoZSBtZXRhZGF0YQorICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgbWV0YWRhdGEuCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gZ2V0SW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJlbW92ZXMgYSBtZXRhZGF0YSBmcm9tIHRoZSBidWZmZXIuCisgICAgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gcmVtb3ZlSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KTsKKyAgICAvLy9AfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBjb250YWluaW5nIGEgc2luZ2xlIGxpbmVhciBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSBibG9jayB0aGUgY29udGVudCBvZiB0aGUgYnVmZmVyLgorICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgY3JlYXRlZCBidWZmZXIuCisgICAgICovCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gQ3JlYXRlTGluZWFyQnVmZmVyKGNvbnN0IEMyQ29uc3RMaW5lYXJCbG9jayAmYmxvY2spOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1ZmZlciBjb250YWluaW5nIGEgc2luZ2xlIGdyYXBoaWMgYmxvY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gYmxvY2sgdGhlIGNvbnRlbnQgb2YgdGhlIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgYnVmZmVyLgorICAgICAqLworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IENyZWF0ZUdyYXBoaWNCdWZmZXIoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2spOworCitwcm90ZWN0ZWQ6CisgICAgLy8gbm8gcHVibGljIGNvbnN0cnVjdG9yCisgICAgZXhwbGljaXQgQzJCdWZmZXIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKTsKKyAgICBleHBsaWNpdCBDMkJ1ZmZlcihjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKTsKKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKKy8qKgorICogQW4gZXh0ZW5zaW9uIG9mIEMySW5mbyBvYmplY3RzIHRoYXQgY2FuIGNvbnRhaW4gYXJiaXRyYXJ5IGJ1ZmZlciBkYXRhLgorICoKKyAqIFxub3RlIFRoaXMgb2JqZWN0IGlzIG5vdCBkZXNjcmliYWJsZSBhbmQgY29udGFpbnMgb3BhcXVlIGRhdGEuCisgKi8KK2NsYXNzIEMySW5mb0J1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogR2V0cyB0aGUgaW5kZXggb2YgdGhpcyBpbmZvIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIHBhcmFtZXRlciBpbmRleC4KKyAgICAgKi8KKyAgICBjb25zdCBDMlBhcmFtOjpJbmRleCBpbmRleCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0cyB0aGUgYnVmZmVyJ3MgZGF0YS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIGJ1ZmZlcidzIGRhdGEuCisgICAgICovCisgICAgY29uc3QgQzJCdWZmZXJEYXRhIGRhdGEoKSBjb25zdDsKK307CisKKy8vLyBAfQorCisvLy8gQH0KKworI2VuZGlmICAvLyBDMkJVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkJ1ZmZlckJhc2UuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJCdWZmZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJkNDhmMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJCdWZmZXJCYXNlLmgKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJCVUZGRVJfQkFTRV9IXworI2RlZmluZSBDMkJVRkZFUl9CQVNFX0hfCisKKy8vLyBcZGVmZ3JvdXAgYWxsb2NhdG9yIEFsbG9jYXRpb24gYW5kIG1lbW9yeSBwbGFjZW1lbnQKKy8vLyBAeworCisvKioKKyAqIEJ1ZmZlci9tZW1vcnkgdXNhZ2UgYml0cy4gVGhlc2Ugc2hhbGwgYmUgdXNlZCBieSB0aGUgYWxsb2NhdG9ycyB0byBzZWxlY3Qgb3B0aW1hbCBtZW1vcnkgdHlwZS8KKyAqIHBvb2wgYW5kIGJ1ZmZlciBsYXlvdXQuIFVzYWdlIGJpdHMgYXJlIGNvbmNlcHR1YWxseSBzZXBhcmF0ZWQgaW50byByZWFkIGFuZCB3cml0ZSB1c2FnZSwgd2hpbGUKKyAqIHRoZSBidWZmZXIgdXNlIGxpZmUtY3ljbGUgaXMgc2VwYXJhdGVkIGludG8gcHJvZHVjZXJzICh3cml0ZXJzKSBhbmQgY29uc3VtZXJzIChyZWFkZXJzKS4KKyAqIFRoZXNlIHR3byBjb25jZXB0cyBhcmUgcmVsYXRlZCBidXQgbm90IGVxdWl2YWxlbnQ6IGNvbnN1bWVycyBtYXkgb25seSByZWFkIGJ1ZmZlcnMgYW5kIG9ubHkKKyAqIHByb2R1Y2VycyBtYXkgd3JpdGUgdG8gYnVmZmVyczsgbm90ZSwgaG93ZXZlciwgdGhhdCBidWZmZXIgcHJvZHVjZXJzIG1heSBhbHNvIHdhbnQgb3IgbmVlZCB0bworICogcmVhZCB0aGUgYnVmZmVycy4KKyAqCisgKiBSZWFkIGFuZCB3cml0ZSBidWZmZXIgdXNhZ2UgYml0cyBzaGFsbCBiZSBvci1lZCB0byBhcnJpdmUgYXQgdGhlIGZ1bGwgYnVmZmVyIHVzYWdlLiBBZG1pdHRlZGx5LAorICogdGhpcyBkb2VzIG5vdCBhY2NvdW50IGZvciB0aGUgYW1vdW50IG9mIHJlYWRpbmcgYW5kIHdyaXRpbmcgKGUuZy4gYSBidWZmZXIgbWF5IGhhdmUgb25lIG9yIG1vcmUKKyAqIHJlYWRlcnMpOyBob3dldmVyLCB0aGUgcHJvcGVyIGluZm9ybWF0aW9uIG5lY2Vzc2FyeSB0byBwcm9wZXJseSB3ZWlnaCB0aGUgdmFyaW91cyB1c2FnZXMgd291bGQgYmUKKyAqIHRoZSBhbW91bnQgb2YgZGF0YSByZWFkL3dyaXR0ZW4gZm9yIGVhY2ggdXNhZ2UgdHlwZS4gVGhpcyB3b3VsZCByZXN1bHQgaW4gYW4gaW50ZWdlciBhcnJheSBvZgorICogc2l6ZSA2NCAob3IgdGhlIG51bWJlciBvZiBkaXN0aW5jdCB1c2FnZXMpIGZvciBtZW1vcnkgdXNhZ2UsIGFuZCBsaWtlbHkgc3VjaCBkZXRhaWxlZCBpbmZvcm1hdGlvbgorICogd291bGQgbm90IGFsd2F5cyBiZSBhdmFpbGFibGUuCisgKgorICogVGhhdCBwbGF0Zm9ybS1hZ25vc3RpYyBDb2RlYyAyLjAgQVBJIG9ubHkgZGVmaW5lcyB0aGUgYmFyZSBtaW5pbXVtIHVzYWdlcy4gUGxhdGZvcm1zIHNoYWxsIGRlZmluZQorICogdXNhZ2UgYml0cyB0aGF0IGFyZSBhcHByb3ByaWF0ZSBmb3IgdGhlIHBsYXRmb3JtLgorICovCitzdHJ1Y3QgQzJNZW1vcnlVc2FnZSB7CisvLyBwdWJsaWM6CisgICAgLyoqCisgICAgICogQnVmZmVyIHJlYWQgdXNhZ2UuCisgICAgICovCisgICAgZW51bSByZWFkX3QgOiB1aW50NjRfdCB7CisgICAgICAgIC8qKiBCdWZmZXIgaXMgcmVhZCBieSB0aGUgQ1BVLiAqLworICAgICAgICBDUFVfUkVBRCAgICAgICAgPSAxIDw8IDAsCisgICAgICAgIC8qKgorICAgICAgICAgKiBCdWZmZXIgc2hhbGwgb25seSBiZSByZWFkIGJ5IHRydXN0ZWQgaGFyZHdhcmUuIFRoZSBkZWZpbml0aW9uIG9mIHRydXN0ZWQgaGFyZHdhcmUgaXMKKyAgICAgICAgICogcGxhdGZvcm0gc3BlY2lmaWMsIGJ1dCB0aGlzIGZsYWcgaXMgcmVzZXJ2ZWQgdG8gcHJldmVudCBtYXBwaW5nIHRoaXMgYmxvY2sgaW50byBDUFUKKyAgICAgICAgICogcmVhZGFibGUgbWVtb3J5IHJlc3VsdGluZyBpbiBidXMgZmF1bHQuIFRoaXMgZmxhZyBjYW4gYmUgdXNlZCB3aGVuIGJ1ZmZlciBhY2Nlc3MgbXVzdCBiZQorICAgICAgICAgKiBwcm90ZWN0ZWQuCisgICAgICAgICAqLworICAgICAgICBSRUFEX1BST1RFQ1RFRCAgPSAxIDw8IDEsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIEJ1ZmZlciB3cml0ZSB1c2FnZS4KKyAgICAgKi8KKyAgICBlbnVtIHdyaXRlX3QgOiB1aW50NjRfdCB7CisgICAgICAgIC8qKiBCdWZmZXIgaXMgd3JpdHRlZCB0byBieSB0aGUgQ1BVLiAqLworICAgICAgICBDUFVfV1JJVEUgICAgICAgID0gMSA8PCAyLAorICAgICAgICAvKioKKyAgICAgICAgICogQnVmZmVyIHNoYWxsIG9ubHkgYmUgd3JpdHRlbiB0byBieSB0cnVzdGVkIGhhcmR3YXJlLiBUaGUgZGVmaW5pdGlvbiBvZiB0cnVzdGVkIGhhcmR3YXJlCisgICAgICAgICAqIGlzIHBsYXRmb3JtIHNwZWNpZmljLCBidXQgdGhpcyBmbGFnIGlzIHJlc2VydmVkIHRvIHByZXZlbnQgbWFwcGluZyB0aGlzIGJsb2NrIGludG8gQ1BVCisgICAgICAgICAqIHdyaXRhYmxlIG1lbW9yeSByZXN1bHRpbmcgaW4gYnVzIGZhdWx0LiBUaGlzIGZsYWcgY2FuIGJlIHVzZWQgd2hlbiBidWZmZXIgaW50ZWdyaXR5IG11c3QKKyAgICAgICAgICogYmUgcHJvdGVjdGVkLgorICAgICAgICAgKi8KKyAgICAgICAgV1JJVEVfUFJPVEVDVEVEICA9IDEgPDwgMywKKyAgICB9OworCisgICAgZW51bSA6IHVpbnQ2NF90IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEJ1ZmZlciB1c2FnZSBiaXRzIHJlc2VydmVkIGZvciB0aGUgcGxhdGZvcm0uIFdlIGRvbid0IHNlcGFyYXRlbHkgcmVzZXJ2ZSByZWFkIGFuZAorICAgICAgICAgKiB3cml0ZSB1c2FnZXMgYXMgcGxhdGZvcm1zIG1heSBoYXZlIGFzeW1tZXRyaWMgZGlzdHJpYnV0aW9uIGJldHdlZW4gdGhlbS4KKyAgICAgICAgICovCisgICAgICAgIFBMQVRGT1JNX01BU0sgICAgID0gfihDUFVfUkVBRCB8IENQVV9XUklURSB8IFJFQURfUFJPVEVDVEVEIHwgV1JJVEVfUFJPVEVDVEVEKSwKKyAgICB9OworCisgICAgLyoqIENyZWF0ZSBhIHVzYWdlIGZyb20gc2VwYXJhdGUgY29uc3VtZXIgYW5kIHByb2R1Y2VyIHVzYWdlIG1hc2suIFxkZXByZWNhdGVkICovCisgICAgaW5saW5lIEMyTWVtb3J5VXNhZ2UodWludDY0X3QgY29uc3VtZXIsIHVpbnQ2NF90IHByb2R1Y2VyKQorICAgICAgICA6IGV4cGVjdGVkKGNvbnN1bWVyIHwgcHJvZHVjZXIpIHsgfQorCisgICAgaW5saW5lIGV4cGxpY2l0IEMyTWVtb3J5VXNhZ2UodWludDY0X3QgZXhwZWN0ZWRfKQorICAgICAgICA6IGV4cGVjdGVkKGV4cGVjdGVkXykgeyB9CisKKyAgICB1aW50NjRfdCBleHBlY3RlZDsgLy8gZXhwZWN0ZWQgYnVmZmVyIHVzYWdlCit9OworCisvLy8gQH0KKworI2VuZGlmICAvLyBDMkJVRkZFUl9CQVNFX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb21wb25lbnQuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb21wb25lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2Y4ZDJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkNvbXBvbmVudC5oCkBAIC0wLDAgKzEsOTc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMkNPTVBPTkVOVF9IXworCisjZGVmaW5lIEMyQ09NUE9ORU5UX0hfCisKKyNpbmNsdWRlIDxzdGRib29sLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgPEMyRW51bS5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKworLy8vIFxkZWZncm91cCBjb21wb25lbnRzIENvbXBvbmVudHMKKy8vLyBAeworCitzdHJ1Y3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IHsKKyAgICBlbnVtIHR5cGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgUE9TU0lCTEUsIC8vLzwgcXVlcnkgYWxsIHBvc3NpYmxlIHZhbHVlcyByZWdhcmRsZXNzIG9mIG90aGVyIHNldHRpbmdzCisgICAgICAgIENVUlJFTlQsICAvLy88IHF1ZXJ5IGN1cnJlbnRseSBwb3NzaWJsZSB2YWx1ZXMgZ2l2ZW4gZGVwZW5kZW50IHNldHRpbmdzCisgICAgfTsKKworcHJpdmF0ZToKKyAgICBDMlBhcmFtRmllbGQgX21GaWVsZDsKKyAgICB0eXBlX3QgX21UeXBlOworcHVibGljOgorICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIHZhbHVlczsKKworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeShjb25zdCBDMlBhcmFtRmllbGQgJmZpZWxkXywgdHlwZV90IHR5cGVfKQorICAgICAgICA6IF9tRmllbGQoZmllbGRfKSwgX21UeXBlKHR5cGVfKSwgc3RhdHVzKEMyX05PX0lOSVQpIHsgfQorCisgICAgc3RhdGljIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeQorICAgIEN1cnJlbnQoY29uc3QgQzJQYXJhbUZpZWxkICZmaWVsZF8pIHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeShmaWVsZF8sIENVUlJFTlQpOworICAgIH0KKworICAgIHN0YXRpYyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKKyAgICBQb3NzaWJsZShjb25zdCBDMlBhcmFtRmllbGQgJmZpZWxkXykgeworICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KGZpZWxkXywgUE9TU0lCTEUpOworICAgIH0KKworICAgIGlubGluZSBDMlBhcmFtRmllbGQgZmllbGQoKSBjb25zdCB7IHJldHVybiBfbUZpZWxkOyB9OworCisgICAgaW5saW5lIHR5cGVfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gX21UeXBlOyB9Cit9OworCisvKioKKyAqIENvbXBvbmVudCBpbnRlcmZhY2Ugb2JqZWN0LiBUaGlzIG9iamVjdCBjb250YWlucyBhbGwgb2YgdGhlIGNvbmZpZ3VyYXRpb24gb2YgYSBwb3RlbnRpYWwgb3IKKyAqIGFjdHVhbCBjb21wb25lbnQuIEl0IGNhbiBiZSBjcmVhdGVkIGFuZCB1c2VkIGluZGVwZW5kZW50bHkgb2YgYW4gYWN0dWFsIEMyQ29tcG9uZW50IGluc3RhbmNlIHRvCisgKiBxdWVyeSBzdXBwb3J0IGFuZCBwYXJhbWV0ZXJzIGZvciB2YXJpb3VzIGNvbXBvbmVudCBzZXR0aW5ncyBhbmQgY29uZmlndXJhdGlvbnMgZm9yIGEgcG90ZW50aWFsCisgKiBjb21wb25lbnQuIEFjdHVhbCBjb21wb25lbnRzIGFsc28gZXhwb3NlIHRoaXMgaW50ZXJmYWNlLgorICovCisKK2NsYXNzIEMyQ29tcG9uZW50SW50ZXJmYWNlIHsKK3B1YmxpYzoKKyAgICAvLyBBTFdBWVMgQVZBSUxBQkxFIE1FVEhPRFMKKyAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSBvYmplY3QuCisgICAgICogVGhpcyBpcyBhIHVuaXF1ZSBuYW1lIGZvciB0aGlzIGNvbXBvbmVudCBvciBjb21wb25lbnQgaW50ZXJmYWNlICdjbGFzcyc7IGhvd2V2ZXIsIG11bHRpcGxlCisgICAgICogaW5zdGFuY2VzIG9mIHRoaXMgY29tcG9uZW50IFNIQUxMIGhhdmUgdGhlIHNhbWUgbmFtZS4KKyAgICAgKgorICAgICAqIFdoZW4gYXR0YWNoZWQgdG8gYSBjb21wb25lbnQsIHRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIGFueSBjb21wb25lbnQgc3RhdGUuCisgICAgICogVGhpcyBjYWxsIGRvZXMgbm90IGNoYW5nZSB0aGUgc3RhdGUgbm9yIHRoZSBpbnRlcm5hbCBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIG5hbWUgb2YgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSBvYmplY3QuCisgICAgICogXHJldHZhbCBhbiBlbXB0eSBzdHJpbmcgaWYgdGhlcmUgd2FzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGFsbG9jYXRlIHRoZSBhY3R1YWwgbmFtZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGEgdW5pcXVlIElEIGZvciB0aGlzIGNvbXBvbmVudCBvciBpbnRlcmZhY2Ugb2JqZWN0LgorICAgICAqIFRoaXMgSUQgaXMgdXNlZCBhcyB3b3JrIHRhcmdldHMsIHVuaXF1ZSB3b3JrIElEcywgYW5kIHdoZW4gY29uZmlndXJpbmcgdHVubmVsaW5nLgorICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZS4KKyAgICAgKiBUaGlzIGNhbGwgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGF0ZSBub3IgdGhlIGludGVybmFsIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiBhIHVuaXF1ZSBub2RlIElEIGZvciB0aGlzIGNvbXBvbmVudCBvciBjb21wb25lbnQgaW50ZXJmYWNlIGluc3RhbmNlLgorICAgICAqLworICAgIHZpcnR1YWwgYzJfbm9kZV9pZF90IGdldElkKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUXVlcmllcyBhIHNldCBvZiBwYXJhbWV0ZXJzIGZyb20gdGhlIGNvbXBvbmVudCBvciBpbnRlcmZhY2Ugb2JqZWN0LgorICAgICAqIFF1ZXJ5aW5nIGlzIHBlcmZvcm1lZCBhdCBiZXN0IGVmZm9ydDogdGhlIGNvbXBvbmVudCBTSEFMTCBxdWVyeSBhbGwgc3VwcG9ydGVkIHBhcmFtZXRlcnMgYW5kCisgICAgICogc2tpcCB1bnN1cHBvcnRlZCBvbmVzLCBoZWFwIGFsbG9jYXRlZCBwYXJhbWV0ZXJzIHRoYXQgY291bGQgbm90IGJlIGFsbG9jYXRlZCBvciBwYXJhbWV0ZXJzCisgICAgICogdGhhdCBjb3VsZCBub3QgYmUgcXVlcmllZCB3aXRob3V0IGJsb2NraW5nLiBBbnkgZXJyb3JzIGFyZSBjb21tdW5pY2F0ZWQgaW4gdGhlIHJldHVybiB2YWx1ZS4KKyAgICAgKiBBZGRpdGlvbmFsbHksIHByZWFsbG9jYXRlZCAoZS5nLiBzdGFjaykgcGFyYW1ldGVycyB0aGF0IGNvdWxkIG5vdCBiZSBxdWVyaWVkIGFyZSBpbnZhbGlkYXRlZC4KKyAgICAgKiBJbnZhbGlkIG9yIGJsb2NraW5nIHBhcmFtZXRlcnMgdG8gYmUgYWxsb2NhdGVkIG9uIHRoZSBoZWFwIGFyZSBvbWl0dGVkIGZyb20gdGhlIHJlc3VsdC4KKyAgICAgKgorICAgICAqIFxub3RlIFBhcmFtZXRlciB2YWx1ZXMgZG8gbm90IGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgcXVlcnkuCisgICAgICoKKyAgICAgKiBcdG9kbyBUaGlzIG1ldGhvZCBjYW5ub3QgYmUgdXNlZCB0byBxdWVyeSBpbmZvLWJ1ZmZlcnMuIElzIHRoYXQgYSBwcm9ibGVtPworICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZSBleGNlcHQKKyAgICAgKiByZWxlYXNlZC4KKyAgICAgKiBUaGlzIGNhbGwgZG9lcyBub3QgY2hhbmdlIHRoZSBzdGF0ZSBub3IgdGhlIGludGVybmFsIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyBhIHZhcmlhYmxlIGJsb2NraW5nIGJlaGF2aW9yIGJhc2VkIG9uIHN0YXRlLgorICAgICAqIEluIHRoZSBzdG9wcGVkIHN0YXRlIHRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqIEluIHRoZSBydW5uaW5nIHN0YXRlcyB0aGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHBhcmFtW2luLG91dF0gc3RhY2tQYXJhbXMgIGEgbGlzdCBvZiBwYXJhbXMgcXVlcmllZC4gVGhlc2UgYXJlIGluaXRpYWxpemVkIHNwZWNpZmljIHRvIGVhY2gKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0dGluZzsgZS5nLiBzaXplIGFuZCBpbmRleCBhcmUgc2V0IGFuZCByZXN0IG9mIHRoZSBtZW1iZXJzIGFyZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcmVkLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcbm90ZSBGbGV4aWJsZSBzZXR0aW5ncyB0aGF0IGFyZSBvZiBpbmNvcnJlY3Qgc2l6ZSB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGVkLgorICAgICAqIFxwYXJhbVtpbl0gaGVhcFBhcmFtSW5kaWNlcyBhIHZlY3RvciBvZiBwYXJhbSBpbmRpY2VzIGZvciBwYXJhbXMgdG8gYmUgcXVlcmllZCBhbmQgcmV0dXJuZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb24gdGhlIGhlYXAuIFRoZXNlIHBhcmFtZXRlcnMgd2lsbCBiZSByZXR1cm5lZCBpbiBoZWFwUGFyYW1zLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnN1cHBvcnRlZCBwYXJhbSBpbmRpY2VzIHdpbGwgYmUgaWdub3JlZC4KKyAgICAgKiBccGFyYW1baW5dIG1heUJsb2NrICAgICAgICAgaWYgdHJ1ZSAoQzJfTUFZX0JMT0NLKSwgaW1wbGVtZW50YXRpb24gbWF5IG1vbWVudGFyaWx5IGJsb2NrLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlcndpc2UgKEMyX0RPTlRfQkxPQ0spLCBpdCBtdXN0IGJlICJub24tYmxvY2tpbmciLgorICAgICAqIFxwYXJhbVtvdXRdIGhlYXBQYXJhbXMgICAgICBhIGxpc3Qgb2YgcGFyYW1zIHdoZXJlIHRvIHdoaWNoIHRoZSBzdXBwb3J0ZWQgaGVhcCBwYXJhbWV0ZXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpbGwgYmUgYXBwZW5kZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIGhlYXBQYXJhbUluZGljZXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICBhbGwgcGFyYW1ldGVycyBjb3VsZCBiZSBxdWVyaWVkCisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHF1ZXJpZWQsIGJ1dCBzb21lIHBhcmFtZXRlcnMgd2VyZSBub3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgcmVsZWFzZWQgY29tcG9uZW50IHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIGNvdWxkIG5vdCBhbGxvY2F0ZSBtZW1vcnkgZm9yIGEgc3VwcG9ydGVkIHBhcmFtZXRlcgorICAgICAqIFxyZXR2YWwgQzJfQkxPQ0tJTkcgIHRoZSBvcGVyYXRpb24gbXVzdCBibG9jayB0byBjb21wbGV0ZSBidXQgbWF5QmxvY2sgaXMgZmFsc2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgcXVlcnkgdGhlIHBhcmFtZXRlcnMgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHJ1bm5pbmcgc3RhdGUpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgcXVlcnlpbmcgb2YgdGhlIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3ZiKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFNldHMgYSBzZXQgb2YgcGFyYW1ldGVycyBmb3IgdGhlIGNvbXBvbmVudCBvciBpbnRlcmZhY2Ugb2JqZWN0LgorICAgICAqCisgICAgICogVHVuaW5nIGlzIHBlcmZvcm1lZCBhdCBiZXN0IGVmZm9ydDogdGhlIGNvbXBvbmVudCBTSEFMTCBwcm9jZXNzIHRoZSBjb25maWd1cmF0aW9uIHVwZGF0ZXMgaW4KKyAgICAgKiB0aGUgb3JkZXIgdGhleSBhcHBlYXIgaW4gfHBhcmFtc3wuIElmIGFueSBwYXJhbWV0ZXIgdXBkYXRlIGZhaWxzLCB0aGUgY29tcG9uZW50IHNoYWxsCisgICAgICogY29tbXVuaWNhdGUgdGhlIGZhaWx1cmUgaW4gdGhlIHJldHVybiB2YWx1ZSBhbmQgaW4gfGZhaWx1cmVzfCwgYW5kIHN0aWxsIHByb2Nlc3MgdGhlCisgICAgICogcmVtYWluaW5nIHBhcmFtZXRlcnMuIFVuc3VwcG9ydGVkIHBhcmFtZXRlcnMgYXJlIHNraXBwZWQsIHRob3VnaCB0aGV5IGFyZSBjb21tdW5pY2F0ZWQgaW4KKyAgICAgKiB0aGVyIHJldHVybiB2YWx1ZS4gTW9zdCBwYXJhbWV0ZXJzIGFyZSB1cGRhdGVkIGF0IGJlc3QgZWZmb3J0IC0gc3VjaCB0aGF0IGV2ZW4gaWYgY2xpZW50CisgICAgICogc3BlY2lmaWVzIGFuIHVuc3VwcG9ydGVkIHZhbHVlIGZvciBhIGZpZWxkLCB0aGUgY2xvc2VzdCBzdXBwb3J0ZWQgdmFsdWUgaXMgdXNlZC4gT24gdGhlCisgICAgICogb3RoZXIgaGFuZCwgc3RyaWN0IHBhcmFtZXRlcnMgb25seSBhY2NlcHQgc3BlY2lmaWMgdmFsdWVzIGZvciB0aGVpciBmaWVsZHMsIGFuZCBpZiB0aGUgY2xpZW50CisgICAgICogc3BlY2lmaWVzIGFuIHVuc3VwcG9ydGVkIHZhbHVlLCB0aGUgcGFyYW1ldGVyIHNldHRpbmcgc2hhbGwgZmFpbCBmb3IgdGhhdCBmaWVsZC4KKyAgICAgKiBJZiB0aGUgY2xpZW50IHRyaWVzIHRvIGNoYW5nZSB0aGUgdmFsdWUgb2YgYSBmaWVsZCB0aGF0IHJlcXVpcmVzIG1vbWVudGFyeSBibG9ja2luZyB3aXRob3V0CisgICAgICogc2V0dGluZyB8bWF5QmxvY2t8IHRvIEMyX01BWV9CTE9DSywgdGhhdCBwYXJhbWV0ZXIgc2hhbGwgYWxzbyBiZSBza2lwcGVkIGFuZCBhIHNwZWNpZmljCisgICAgICogcmV0dXJuIHZhbHVlIHNoYWxsIGJlIHVzZWQuIEZpbmFsIHZhbHVlcyBmb3IgYWxsIHBhcmFtZXRlcnMgc2V0IGFyZSBwcm9wYWdhdGVkIGJhY2sgdG8gdGhlCisgICAgICogY2FsbGVyIGluIHxwYXJhbXN8LgorICAgICAqCisgICAgICogXG5vdGUgUGFyYW1ldGVyIHR1bmluZyBET0VTIGRlcGVuZCBvbiB0aGUgb3JkZXIgb2YgdGhlIHR1bmluZyBwYXJhbWV0ZXJzLiBFLmcuIHNvbWUgcGFyYW1ldGVyCisgICAgICogdXBkYXRlIG1heSBhbGxvdyBzb21lIHN1YnNlcXVlbnQgdmFsdWVzIGZvciBmdXJ0aGVyIHBhcmFtZXRlciB1cGRhdGVzLgorICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZSBleGNlcHQKKyAgICAgKiByZWxlYXNlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyBhIHZhcmlhYmxlIGJsb2NraW5nIGJlaGF2aW9yIGJhc2VkIG9uIHN0YXRlLgorICAgICAqIEluIHRoZSBzdG9wcGVkIHN0YXRlIHRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqIEluIHRoZSBydW5uaW5nIHN0YXRlcyB0aGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHBhcmFtW2luLG91dF0gcGFyYW1zIGEgbGlzdCBvZiBwYXJhbWV0ZXIgdXBkYXRlcy4gVGhlc2Ugd2lsbCBiZSB1cGRhdGVkIHRvIHRoZSBhY3R1YWwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyIHZhbHVlcyBhZnRlciB0aGUgdXBkYXRlcyAodGhpcyBpcyBiZWNhdXNlIHR1bmluZyBpcyBwZXJmb3JtZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgYXQgYmVzdCBlZmZvcnQpLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgICBcdG9kbyBwYXJhbXMgdGhhdCBjb3VsZCBub3QgYmUgdXBkYXRlZCBhcmUgbm90IG1hcmtlZCBoZXJlLCBzbyBhcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgY29uZnVzaW5nIC0gYXJlIHRoZXkgImV4aXN0aW5nIiB2YWx1ZXMgb3IgaW50ZW5kZWQgdG8gYmUgY29uZmlndXJlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM/CisgICAgICogXHBhcmFtW2luXSBtYXlCbG9jayAgIGlmIHRydWUgKEMyX01BWV9CTE9DSyksIGltcGxlbWVudGF0aW9uIG1heSBtb21lbnRhcmlseSBibG9jay4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIChDMl9ET05UX0JMT0NLKSwgaXQgbXVzdCBiZSAibm9uLWJsb2NraW5nIi4KKyAgICAgKiBccGFyYW1bb3V0XSBmYWlsdXJlcyAgYSBsaXN0IG9mIHBhcmFtZXRlciBmYWlsdXJlcyBhbmQgb3B0aW9uYWwgZ3VpZGFuY2UKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGFsbCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LCBidXQgc29tZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgd2VyZSBub3Qgc3VwcG9ydGVkCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgc29tZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgYmVjYXVzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZXkgY29udGFpbmVkIHVuc3VwcG9ydGVkIHZhbHVlcy4gVGhlc2UgYXJlIHJldHVybmVkIGluIHxmYWlsdXJlc3wuCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIGNvbXBvbmVudCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBzb21lIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIG5vdCBiZSB1cGRhdGVkIHN1Y2Nlc3NmdWxseSBiZWNhdXNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdGhleSBjb250YWluZWQgdW5zdXBwb3J0ZWQgdmFsdWVzLCBidXQgY291bGQgbm90IGFsbG9jYXRlIGEgZmFpbHVyZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCBmb3IgdGhlbS4KKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3Qgc2V0IHRoZSBwYXJhbWV0ZXJzIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGluIHRoZSBydW5uaW5nIHN0YXRlKQorICAgICAqIFxyZXR2YWwgQzJfQkxPQ0tJTkcgIHRoZSBvcGVyYXRpb24gbXVzdCBibG9jayB0byBjb21wbGV0ZSBidXQgbWF5QmxvY2sgaXMgZmFsc2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSB1cGRhdGUgb2YgdGhlIHBhcmFtZXRlcnMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZ192YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpID0gMDsKKworICAgIC8vIFRVTk5FTElORworICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIHR1bm5lbCBmcm9tIHRoaXMgY29tcG9uZW50IHRvIHRoZSB0YXJnZXQgY29tcG9uZW50LgorICAgICAqCisgICAgICogSWYgdGhlIGNvbXBvbmVudCBpcyBzdWNjZXNzZnVsbHkgY3JlYXRlZCwgc3Vic2VxdWVudCB3b3JrIGl0ZW1zIHF1ZXVlZCBtYXkgaW5jbHVkZSBhCisgICAgICogdHVubmVsZWQgcGF0aCBiZXR3ZWVuIHRoZXNlIGNvbXBvbmVudHMuCisgICAgICoKKyAgICAgKiBXaGVuIGF0dGFjaGVkIHRvIGEgY29tcG9uZW50LCB0aGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgY29tcG9uZW50IHN0YXRlIGV4Y2VwdAorICAgICAqIHJlbGVhc2VkLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSB0dW5uZWwgd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkCisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggdGhlIHRhcmdldCBjb21wb25lbnQgZG9lcyBub3QgZXhpc3QKKyAgICAgKiBccmV0dmFsIEMyX0RVUExJQ0FURSB0aGUgdHVubmVsIGFscmVhZHkgZXhpc3RzCisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdHVubmVsaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjb21wb25lbnQKKyAgICAgKiBccmV0dmFsIEMyX0NBTk5PVF9ETyB0aGUgc3BlY2lmaWMgdHVubmVsIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgcmVsZWFzZWQgY29tcG9uZW50IHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgdHVubmVsIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgdHVubmVsICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlVHVubmVsX3NtKGMyX25vZGVfaWRfdCB0YXJnZXRDb21wb25lbnQpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2VzIGEgdHVubmVsIGZyb20gdGhpcyBjb21wb25lbnQgdG8gdGhlIHRhcmdldCBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGUgcmVsZWFzZSBvZiBhIHR1bm5lbCBpcyBkZWxheWVkIHdoaWxlIHRoZXJlIGFyZSBwZW5kaW5nIHdvcmsgaXRlbXMgZm9yIHRoZSB0dW5uZWwuCisgICAgICogQWZ0ZXIgcmVsZWFzaW5nIGEgdHVubmVsLCBzdWJzZXF1ZW50IHdvcmsgaXRlbXMgcXVldWVkIE1VU1QgTk9UIGluY2x1ZGUgYSB0dW5uZWxlZAorICAgICAqIHBhdGggYmV0d2VlbiB0aGVzZSBjb21wb25lbnRzLgorICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZSBleGNlcHQKKyAgICAgKiByZWxlYXNlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgdHVubmVsIHdhcyBtYXJrZWQgZm9yIHJlbGVhc2Ugc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggdGhlIHRhcmdldCBjb21wb25lbnQgZG9lcyBub3QgZXhpc3QKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCB0aGUgdHVubmVsIGRvZXMgbm90IGV4aXN0CisgICAgICogXHJldHZhbCBDMl9PTUlUVEVEICAgdHVubmVsaW5nIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjb21wb25lbnQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgcmVsZWFzZWQgY29tcG9uZW50IHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IG1hcmsgdGhlIHR1bm5lbCBmb3IgcmVsZWFzZSB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgcmVsZWFzZSBvZiB0aGUgdHVubmVsICh1bmV4cGVjdGVkKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVsZWFzZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QgdGFyZ2V0Q29tcG9uZW50KSA9IDA7CisKKyAgICAvLyBSRUZMRUNUSU9OIE1FQ0hBTklTTSAoVVNFRCBGT1IgRVhURU5TSU9OKQorICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0IG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZSBleGNlcHQKKyAgICAgKiByZWxlYXNlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHBhcmFtW291dF0gcGFyYW1zIGEgdmVjdG9yIG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIHdpbGwgYmUgYXBwZW5kZWQgdG8gdGhpcyB2ZWN0b3IuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIGNvbXBsZXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIGNvbXBvbmVudCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjb21wbGV0ZSB0aGlzIG1ldGhvZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKiBjb25zdCBwYXJhbXMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhlIHF1ZXJpZWQgZmllbGRzLgorICAgICAqCisgICAgICogQ2xpZW50IFNIQUxMIHNldCB0aGUgcGFyYW1ldGVyLWZpZWxkIHNwZWNpZmllciBhbmQgdGhlIHR5cGUgb2Ygc3VwcG9ydGVkIHZhbHVlcyBxdWVyeSAoZS5nLgorICAgICAqIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzLCBvciBwb3RlbnRpYWwgc3VwcG9ydGVkIHZhbHVlcykgaW4gZmllbGRzLgorICAgICAqIFVwb24gcmV0dXJuIHRoZSBjb21wb25lbnQgU0hBTEwgZmlsbCBpbiB0aGUgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhlIGZpZWxkcyBsaXN0ZWQgYXMgd2VsbAorICAgICAqIGFzIGEgc3RhdHVzIGZvciBlYWNoIGZpZWxkLiBDb21wb25lbnQgc2hhbGwgcHJvY2VzcyBhbGwgZmllbGRzIHF1ZXJpZWQgZXZlbiBpZiBzb21lIHF1ZXJpZXMKKyAgICAgKiBmYWlsLgorICAgICAqCisgICAgICogV2hlbiBhdHRhY2hlZCB0byBhIGNvbXBvbmVudCwgdGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYW55IGNvbXBvbmVudCBzdGF0ZSBleGNlcHQKKyAgICAgKiByZWxlYXNlZC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyBhIHZhcmlhYmxlIGJsb2NraW5nIGJlaGF2aW9yIGJhc2VkIG9uIHN0YXRlLgorICAgICAqIEluIHRoZSBzdG9wcGVkIHN0YXRlIHRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqIEluIHRoZSBydW5uaW5nIHN0YXRlcyB0aGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogXHBhcmFtW2luIG91dF0gZmllbGRzIGEgdmVjdG9yIG9mIGZpZWxkcyBkZXNjcmlwdG9yIHN0cnVjdHVyZXMuCisgICAgICogXHBhcmFtW2luXSBtYXlCbG9jayAgIGlmIHRydWUgKEMyX01BWV9CTE9DSyksIGltcGxlbWVudGF0aW9uIG1heSBtb21lbnRhcmlseSBibG9jay4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIChDMl9ET05UX0JMT0NLKSwgaXQgbXVzdCBiZSAibm9uLWJsb2NraW5nIi4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBvcGVyYXRpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgcmVsZWFzZWQgY29tcG9uZW50IHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGVycm9yIGNvZGUgaXMgb25seSBhbGxvd2VkIGZvciBpbnRlcmZhY2VzIGNvbm5lY3RlZCB0byBjb21wb25lbnRzKQorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGF0IGxlYXN0IG9uZSBmaWVsZCB3YXMgbm90IHJlY29nbml6ZWQgYXMgYSBjb21wb25lbnQgZmllbGQKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgcXVlcnkgc3VwcG9ydGVkIHZhbHVlcyB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbiB0aGUgcnVubmluZyBzdGF0ZSkKKyAgICAgKiBccmV0dmFsIEMyX0JMT0NLSU5HICB0aGUgb3BlcmF0aW9uIG11c3QgYmxvY2sgdG8gY29tcGxldGUgYnV0IG1heUJsb2NrIGlzIGZhbHNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHRoaXMgZXJyb3IgY29kZSBpcyBvbmx5IGFsbG93ZWQgZm9yIGludGVyZmFjZXMgY29ubmVjdGVkIHRvIGNvbXBvbmVudHMpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgb3BlcmF0aW9uIGZyb20gY29tcGxldGluZyAodW5leHBlY3RlZCkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodGhpcyBlcnJvciBjb2RlIGlzIG9ubHkgYWxsb3dlZCBmb3IgaW50ZXJmYWNlcyBjb25uZWN0ZWQgdG8gY29tcG9uZW50cykKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIH5DMkNvbXBvbmVudEludGVyZmFjZSgpID0gZGVmYXVsdDsKK307CisKK2NsYXNzIEMyQ29tcG9uZW50IHsKK3B1YmxpYzoKKyAgICBjbGFzcyBMaXN0ZW5lciB7CisgICAgcHVibGljOgorICAgICAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrRG9uZV9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKSA9IDA7CisKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uVHJpcHBlZF9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHNldHRpbmdSZXN1bHQpID0gMDsKKworICAgICAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcl9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGVycm9yQ29kZSkgPSAwOworCisgICAgICAgIC8vIHZpcnR1YWwgdm9pZCBvblR1bm5lbFJlbGVhc2VkKDxmcm9tPiwgPHRvPikgPSAwOworCisgICAgICAgIC8vIHZpcnR1YWwgdm9pZCBvbkNvbXBvbmVudFJlbGVhc2VkKDxpZD4pID0gMDsKKworICAgICAgICB2aXJ0dWFsIH5MaXN0ZW5lcigpID0gZGVmYXVsdDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogU2V0cyB0aGUgbGlzdGVuZXIgZm9yIHRoaXMgY29tcG9uZW50CisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbGwgc3RhdGVzIGV4Y2VwdCByZWxlYXNlZC4KKyAgICAgKiBUaGUgbGlzdGVuZXIgY2FuIG9ubHkgYmUgc2V0IHRvIG5vbi1udWxsIHZhbHVlIGluIHN0b3BwZWQgc3RhdGUgKHRoYXQgZG9lcyBub3QgaW5jbHVkZQorICAgICAqIHRyaXBwZWQgb3IgZXJyb3IpLiBJdCBjYW4gYmUgc2V0IHRvIG51bGxwdHIgaW4gYm90aCBzdG9wcGVkIGFuZCBydW5uaW5nIHN0YXRlcy4KKyAgICAgKiBDb21wb25lbnRzIG9ubHkgdXNlIHRoZSBsaXN0ZW5lciBpbiBydW5uaW5nIHN0YXRlLgorICAgICAqCisgICAgICogSWYgbGlzdGVuZXIgaXMgbnVsbHB0ciwgdGhlIGNvbXBvbmVudCBTSEFMTCBndWFyYW50ZWUgdGhhdCBubyBtb3JlIGxpc3RlbmVyIGNhbGxiYWNrcyBhcmUKKyAgICAgKiBkb25lIHRvIHRoZSBvcmlnaW5hbCBsaXN0ZW5lciBvbmNlIHRoaXMgbWV0aG9kIHJldHVybnMuIChBbnkgcGVuZGluZyBsaXN0ZW5lciBjYWxsYmFja3Mgd2lsbAorICAgICAqIG5lZWQgdG8gYmUgY29tcGxldGVkIGR1cmluZyB0aGlzIGNhbGwgLSBoZW5jZSB0aGlzIGNhbGwgbWF5IGJlIHRlbXBvcmFyaWx5IGJsb2NraW5nLikKKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGhhcyBhIHZhcmlhYmxlIGJsb2NraW5nIGJlaGF2aW9yIGJhc2VkIG9uIHN0YXRlLgorICAgICAqIEluIHRoZSBzdG9wcGVkIHN0YXRlIHRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqIEluIHRoZSBydW5uaW5nIHN0YXRlcyB0aGlzIG1ldGhvZCBtYXkgYmUgbW9tZW50YXJpbHkgYmxvY2tpbmcsIGJ1dCBNVVNUIHJldHVybiB3aXRoaW4gNW1zLgorICAgICAqCisgICAgICogQ29tcG9uZW50IFNIQUxMIGhhbmRsZSBsaXN0ZW5lciBub3RpZmljYXRpb25zIGZyb20gdGhlIHNhbWUgdGhyZWFkICh0aGUgdGhyZWFkIHVzZWQgaXMKKyAgICAgKiBhdCB0aGUgY29tcG9uZW50J3MgZGlzY3JldGlvbi4pCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGlzIGNvdWxkIGFsc28gYmUgYWNjb21wbGlzaGVkIGJ5IHBhc3NpbmcgYSB3ZWFrX3B0ciB0byBhIGNvbXBvbmVudC1zcGVjaWZpYyBsaXN0ZW5lcgorICAgICAqIGhlcmUgYW5kIHJlcXVpcmluZyB0aGUgY2xpZW50IHRvIGFsd2F5cyBwcm9tb3RlIHRoZSB3ZWFrX3B0ciBiZWZvcmUgYW55IGNhbGxiYWNrLiBUaGlzIHdvdWxkCisgICAgICogcHV0IHRoZSBidXJkZW4gb24gdGhlIGNsaWVudCB0byBjbGVhciB0aGUgbGlzdGVuZXIgLSB3YWl0IGZvciBpdHMgZGVsZXRpb24gLSBhdCB3aGljaCBwb2ludAorICAgICAqIGl0IGlzIGd1YXJhbnRlZWQgdGhhdCBubyBtb3JlIGxpc3RlbmVyIGNhbGxiYWNrcyB3aWxsIG9jY3VyLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBsaXN0ZW5lciB0aGUgY29tcG9uZW50IGxpc3RlbmVyIG9iamVjdAorICAgICAqIFxwYXJhbVtpbl0gbWF5QmxvY2sgaWYgdHJ1ZSAoQzJfTUFZX0JMT0NLKSwgaW1wbGVtZW50YXRpb24gbWF5IG1vbWVudGFyaWx5IGJsb2NrLgorICAgICAqICAgICAgICAgICAgICAgICAgICAgT3RoZXJ3aXNlIChDMl9ET05UX0JMT0NLKSwgaXQgbXVzdCBiZSAibm9uLWJsb2NraW5nIi4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIGF0dGVtcHRpbmcgdG8gY2hhbmdlIHRoZSBsaXN0ZW5lciBpbiB0aGUgcnVubmluZyBzdGF0ZSB0byBhIG5vbi1udWxsCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdmFsdWUgKHVzZXIgZXJyb3IpLCBvciBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIHN0YXRlCisgICAgICogXHJldHZhbCBDMl9CTE9DS0lORyAgdGhlIG9wZXJhdGlvbiBtdXN0IGJsb2NrIHRvIGNvbXBsZXRlIGJ1dCBtYXlCbG9jayBpcyBmYWxzZQorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGxpc3RlbmVyIHdhcyB1cGRhdGVkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHNldExpc3RlbmVyX3ZiKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiAmbGlzdGVuZXIsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spID0gMDsKKworICAgIC8vLyBjb21wb25lbnQgZG9tYWluIChlLmcuIGF1ZGlvIG9yIHZpZGVvKQorICAgIGVudW0gZG9tYWluX3QgOiB1aW50MzJfdDsKKworICAgIC8vLyBjb21wb25lbnQga2luZCAoZS5nLiBlbmNvZGVyLCBkZWNvZGVyIG9yIGZpbHRlcikKKyAgICBlbnVtIGtpbmRfdCA6IHVpbnQzMl90OworCisgICAgLy8vIGNvbXBvbmVudCByYW5rLiBUaGlzIG51bWJlciBpcyB1c2VkIHRvIGRldGVybWluZSBjb21wb25lbnQgb3JkZXJpbmcgKHRoZSBsb3dlciB0aGUgc29vbmVyKQorICAgIC8vLyBpbiB0aGUgY29tcG9uZW50IGxpc3QuCisgICAgdHlwZWRlZiB1aW50MzJfdCByYW5rX3Q7CisKKyAgICAvLy8gY29tcG9uZW50IGF0dHJpYnV0ZXMKKyAgICBlbnVtIGF0dHJpYl90IDogdWludDY0X3Q7CisKKyAgICAvKioKKyAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCBhIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgVHJhaXRzIHsKKyAgICAvLyBwdWJsaWM6CisgICAgICAgIEMyU3RyaW5nIG5hbWU7IC8vLzwgbmFtZSBvZiB0aGUgY29tcG9uZW50CisgICAgICAgIGRvbWFpbl90IGRvbWFpbjsgLy8vPCBjb21wb25lbnQgZG9tYWluCisgICAgICAgIGtpbmRfdCBraW5kOyAvLy88IGNvbXBvbmVudCBraW5kCisgICAgICAgIHJhbmtfdCByYW5rOyAvLy88IGNvbXBvbmVudCByYW5rCisgICAgICAgIEMyU3RyaW5nIG1lZGlhVHlwZTsgLy8vPCBtZWRpYSB0eXBlIHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50CisgICAgICAgIEMyU3RyaW5nIG93bmVyOyAvLy88IG5hbWUgb2YgdGhlIGNvbXBvbmVudCBzdG9yZSBvd25pbmcgdGhpcyBjb21wb25lbnQKKworICAgICAgICAvKioKKyAgICAgICAgICogbmFtZSBhbGlhcyhlcykgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgICAgICAgICAqIFxub3RlIE11bHRpcGxlIGNvbXBvbmVudHMgY2FuIGhhdmUgdGhlIHNhbWUgYWxpYXMgYXMgbG9uZyBhcyB0aGVpciBtZWRpYS10eXBlIGRpZmZlcnMuCisgICAgICAgICAqLworICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gYWxpYXNlczsgLy8vPCBuYW1lIGFsaWFzZXMgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkKKyAgICB9OworCisgICAgLy8gTUVUSE9EUyBBVkFJTEFCTEUgV0hFTiBSVU5OSU5HCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAvKioKKyAgICAgKiBRdWV1ZXMgdXAgd29yayBmb3IgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIHJ1bm5pbmcgKGluY2x1ZGluZyB0cmlwcGVkIGFuZCBlcnJvcikgc3RhdGVzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxIG1zCisgICAgICoKKyAgICAgKiBJdCBpcyBhY2NlcHRhYmxlIGZvciB0aGlzIG1ldGhvZCB0byByZXR1cm4gT0sgYW5kIHJldHVybiBhbiBlcnJvciB2YWx1ZSB1c2luZyB0aGUKKyAgICAgKiBvbldvcmtEb25lKCkgY2FsbGJhY2suCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgd29yayB3YXMgc3VjY2Vzc2Z1bGx5IHF1ZXVlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIHNvbWUgY29tcG9uZW50KHMpIGluIHRoZSB3b3JrIGRvKGVzKSBub3QgZXhpc3QKKyAgICAgKiBccmV0dmFsIEMyX0NBTk5PVF9ETyB0aGUgY29tcG9uZW50cyBhcmUgbm90IHR1bm5lbGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHN0b3BwZWQgb3IgcmVsZWFzZWQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBxdWV1ZSB0aGUgd29yaworICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgcXVldWluZyB0aGUgd29yayAodW5leHBlY3RlZCkKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXVlX25iKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBBbm5vdW5jZXMgYSB3b3JrIHRvIGJlIHF1ZXVlZCBsYXRlciBmb3IgdGhlIGNvbXBvbmVudC4gVGhpcyByZXNlcnZlcyBhIHNsb3QgZm9yIHRoZSBxdWV1ZQorICAgICAqIHRvIGVuc3VyZSBjb3JyZWN0IHdvcmsgb3JkZXJpbmcgZXZlbiBpZiB0aGUgd29yayBpcyBxdWV1ZWQgbGF0ZXIuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCBhbmQgZXJyb3IpIHN0YXRlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMSBtcworICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIHdvcmsgYW5ub3VuY2VtZW50IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSByZWNvcmRlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIHNvbWUgY29tcG9uZW50KHMpIGluIHRoZSB3b3JrIG91dGxpbmUgZG8oZXMpIG5vdCBleGlzdAorICAgICAqIFxyZXR2YWwgQzJfQ0FOTk9UX0RPIHRoZSBjb21wb25lbnRlcyBhcmUgbm90IHR1bm5lbGVkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHN0b3BwZWQgb3IgcmVsZWFzZWQgc3RhdGUgKHVzZXIgZXJyb3IpCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byByZWNvcmQgdGhlIHdvcmsgYW5ub3VuY2VtZW50CisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCByZWNvcmRpbmcgdGhlIGFubm91bmNlbWVudCAodW5leHBlY3RlZCkKKyAgICAgKgorICAgICAqIFx0b2RvIENhbiB0aGlzIGJlIHJvbGxlZCBpbnRvIHF1ZXVlX25iPworICAgICAqIFx0b2RvIEV4cG9zZSBuZXh0IHdvcmsgaXRlbSBmb3IgZWFjaCBjb21wb25lbnQgdG8gZGV0ZWN0IHN0YWxscworICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgYW5ub3VuY2VfbmIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJXb3JrT3V0bGluZT4gJml0ZW1zKSA9IDA7CisKKyAgICBlbnVtIGZsdXNoX21vZGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8vIGZsdXNoIHdvcmsgZnJvbSB0aGlzIGNvbXBvbmVudCBvbmx5CisgICAgICAgIEZMVVNIX0NPTVBPTkVOVCwKKworICAgICAgICAvLy8gZmx1c2ggd29yayBmcm9tIHRoaXMgY29tcG9uZW50IGFuZCBhbGwgY29tcG9uZW50cyBjb25uZWN0ZWQgZG93bnN0cmVhbSBmcm9tIGl0IHZpYQorICAgICAgICAvLy8gdHVubmVsaW5nCisgICAgICAgIEZMVVNIX0NIQUlOID0gKDEgPDwgMTYpLAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBEaXNjYXJkcyBhbmQgYWJhbmRvbnMgYW55IHBlbmRpbmcgd29yayBmb3IgdGhlIGNvbXBvbmVudCwgYW5kIG9wdGlvbmFsbHkgYW55IGNvbXBvbmVudAorICAgICAqIGRvd25zdHJlYW0uCisgICAgICoKKyAgICAgKiBcdG9kbyBkZWZpbmUgdGhpczogd2UgY291bGQgZmx1c2ggYWxsIHdvcmsgYmVmb3JlIGxhc3QgaXRlbSBxdWV1ZWQgZm9yIGNvbXBvbmVudCBhY3Jvc3MgYWxsCisgICAgICogICAgICAgICAgICAgICAgICAgIGNvbXBvbmVudHMgbGlua2VkIHRvIHRoaXM7IGZsdXNoIG9ubHkgd29yayBpdGVtcyB0aGF0IGFyZSBxdWV1ZWQgdG8gdGhpcworICAgICAqICAgICAgICAgICAgICAgICAgICBjb21wb25lbnQKKyAgICAgKiBcdG9kbyByZXR1cm4gd29yayAjIG9mIGxhc3QgZmx1c2hlZCBpdGVtOyBvciBhbGwgZmx1c2hlZCAoYnV0IG5vdCByZXR1cm5lZCBpdGVtcykKKyAgICAgKiBcdG9kbyB3ZSBjb3VsZCBtYWtlIGZsdXNoIHRha2UgYSB3b3JrIGl0ZW0gYW5kIGZsdXNoIGFsbCB3b3JrIGJlZm9yZS9hZnRlciB0aGF0IGl0ZW0gdG8gYWxsb3cKKyAgICAgKiAgICAgICBUQkQgKHNsaWNpbmcvc2Vlaz8pCisgICAgICogXHRvZG8gd2UgY291bGQgc2ltcGx5IHRha2UgYSBsaXN0IG9mIG51bWJlcnMgYW5kIGZsdXNoIHRob3NlLi4uIHRoaXMgaXMgYmFkIGZvciBkZWNvZGVycworICAgICAqICAgICAgIGFsc28sIHdoYXQgd291bGQgaGFwcGVuIHRvIGZpbmUgZ3JhZGUgcmVmZXJlbmNlcz8KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIHJ1bm5pbmcgKGluY2x1ZGluZyB0cmlwcGVkIGFuZCBlcnJvcikgc3RhdGVzLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgbXVzdCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFdvcmsgdGhhdCBjb3VsZCBiZSBpbW1lZGlhdGVseSBhYmFuZG9uZWQvZGlzY2FyZGVkIFNIQUxMIGJlIHJldHVybmVkIGluIHxmbHVzaGVkV29ya3w7IHRoaXMKKyAgICAgKiBjYW4gYmUgZG9uZSBpbiBhbiBhcmJpdHJhcnkgb3JkZXIuCisgICAgICoKKyAgICAgKiBXb3JrIHRoYXQgY291bGQgbm90IGJlIGFiYW5kb25lZCBvciBkaXNjYXJkZWQgaW1tZWRpYXRlbHkgU0hBTEwgYmUgbWFya2VkIHRvIGJlCisgICAgICogZGlzY2FyZGVkIGF0IHRoZSBlYXJsaWVzdCBvcHBvcnR1bml0eSwgYW5kIFNIQUxMIGJlIHJldHVybmVkIHZpYSB0aGUgb25Xb3JrRG9uZSgpIGNhbGxiYWNrLgorICAgICAqIFRoaXMgc2hhbGwgYmUgY29tcGxldGVkIHdpdGhpbiA1MDBtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtb2RlIGZsdXNoIG1vZGUKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGZsdXNoZWQKKyAgICAgKiBccmV0dmFsIEMyX0JBRF9TVEFURSB3aGVuIGNhbGxlZCBpbiB0aGUgc3RvcHBlZCBvciByZWxlYXNlZCBzdGF0ZSAodXNlciBlcnJvcikKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgZmx1c2ggY291bGQgbm90IGJlIGNvbXBsZXRlZCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBmbHVzaGluZyBmcm9tIGNvbXBsZXRpb24gKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmbHVzaF9zbShmbHVzaF9tb2RlX3QgbW9kZSwgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspID0gMDsKKworICAgIGVudW0gZHJhaW5fbW9kZV90IDogdWludDMyX3QgeworICAgICAgICAvLy8gZHJhaW4gY29tcG9uZW50IG9ubHkgYW5kIGFkZCBhbiAiZW5kLW9mLXN0cmVhbSIgbWFya2VyLiBDb21wb25lbnQgc2hhbGwgcHJvY2VzcyBhbGwKKyAgICAgICAgLy8vIHF1ZXVlZCB3b3JrIGFuZCBjb21wbGV0ZSB0aGUgY3VycmVudCBzdHJlYW0uIElmIG5ldyBpbnB1dCBpcyByZWNlaXZlZCwgaXQgc2hhbGwgc3RhcnQKKyAgICAgICAgLy8vIGEgbmV3IHN0cmVhbS4gXHRvZG8gZGVmaW5lIHdoYXQgYSBzdHJlYW0gaXMuCisgICAgICAgIERSQUlOX0NPTVBPTkVOVF9XSVRIX0VPUywKKyAgICAgICAgLy8vIGRyYWluIGNvbXBvbmVudCB3aXRob3V0IHNldHRpbmcgImVuZC1vZi1zdHJlYW0iIG1hcmtlci4gQ29tcG9uZW50IHNoYWxsIHByb2Nlc3MgYWxsCisgICAgICAgIC8vLyBxdWV1ZWQgd29yayBidXQgc2hhbGwgZXhwZWN0IG1vcmUgd29yayBpdGVtcyBmb3IgdGhlIHNhbWUgc3RyZWFtLgorICAgICAgICBEUkFJTl9DT01QT05FTlRfTk9fRU9TID0gKDEgPDwgMCksCisKKyAgICAgICAgLy8vIG1hcmtzIHRoZSBsYXN0IHdvcmsgaXRlbSB3aXRoIGEgcGVyc2lzdGVudCAiZW5kLW9mLXN0cmVhbSIgbWFya2VyIHRoYXQgd2lsbCBkcmFpbgorICAgICAgICAvLy8gZG93bnN0cmVhbSBjb21wb25lbnRzCisgICAgICAgIC8vLyBcdG9kbyB0aGlzIG1heSBjb25mdXNlIHdvcmstb3JkZXJpbmcgZG93bnN0cmVhbQorICAgICAgICBEUkFJTl9DSEFJTiA9ICgxIDw8IDE2KSwKKworICAgICAgICAvKioKKyAgICAgICAgICogXHRvZG8gZGVmaW5lIHRoaXM7IHdlIGNvdWxkIHBsYWNlIEVPUyB0byBhbGwgdXBzdHJlYW0gY29tcG9uZW50cywganVzdCB0aGlzIGNvbXBvbmVudCwgb3IKKyAgICAgICAgICogICAgICAgYWxsIHVwc3RyZWFtIGFuZCBkb3duc3RyZWFtIGNvbXBvbmVudC4KKyAgICAgICAgICogXHRvZG8gc2hvdWxkIEVPUyBjYXJyeSBvdmVyIHRvIGRvd25zdHJlYW0gY29tcG9uZW50cz8KKyAgICAgICAgICovCisgICAgfTsKKworICAgIC8qKgorICAgICAqIERyYWlucyB0aGUgY29tcG9uZW50LCBhbmQgb3B0aW9uYWxseSBkb3duc3RyZWFtIGNvbXBvbmVudHMuIFRoaXMgaXMgYSBzaWduYWxsaW5nIG1ldGhvZDsKKyAgICAgKiBhcyBzdWNoIGl0IGRvZXMgbm90IHdhaXQgZm9yIGFueSB3b3JrIGNvbXBsZXRpb24uCisgICAgICoKKyAgICAgKiBNYXJrcyBsYXN0IHdvcmsgaXRlbSBhcyAiZHJhaW4tdGlsbC1oZXJlIiwgc28gY29tcG9uZW50IGlzIG5vdGlmaWVkIG5vdCB0byB3YWl0IGZvciBmdXJ0aGVyCisgICAgICogd29yayBiZWZvcmUgaXQgcHJvY2Vzc2VzIHdvcmsgYWxyZWFkeSBxdWV1ZWQuIFRoaXMgbWV0aG9kIGNhbiBhbHNvIHVzZWQgdG8gc2V0IHRoZQorICAgICAqIGVuZC1vZi1zdHJlYW0gZmxhZyBhZnRlciB3b3JrIGhhcyBiZWVuIHF1ZXVlZC4gQ2xpZW50IGNhbiBjb250aW51ZSB0byBxdWV1ZSBmdXJ0aGVyIHdvcmsKKyAgICAgKiBpbW1lZGlhdGVseSBhZnRlciB0aGlzIG1ldGhvZCByZXR1cm5zLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gcnVubmluZyAoaW5jbHVkaW5nIHRyaXBwZWQpIHN0YXRlcy4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogV29yayB0aGF0IGlzIGNvbXBsZXRlZCBTSEFMTCBiZSByZXR1cm5lZCB2aWEgdGhlIG9uV29ya0RvbmUoKSBjYWxsYmFjay4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtb2RlIGRyYWluIG1vZGUKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBkcmFpbiByZXF1ZXN0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSByZWNvcmRlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHdoZW4gY2FsbGVkIGluIHRoZSBzdG9wcGVkIG9yIHJlbGVhc2VkIHN0YXRlICh1c2VyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIHRoZSBkcmFpbiBtb2RlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIFx0b2RvIGRlZmluZSBzdXBwb3J0ZWQgbW9kZXMgZGlzY292ZXJ5CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGZsdXNoIGNvdWxkIG5vdCBiZSBjb21wbGV0ZWQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgZmx1c2hpbmcgZnJvbSBjb21wbGV0aW9uICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZHJhaW5fbmIoZHJhaW5fbW9kZV90IG1vZGUpID0gMDsKKworICAgIC8vIFNUQVRFIENIQU5HRSBNRVRIT0RTCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAvKioKKyAgICAgKiBTdGFydHMgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgc3VwcG9ydGVkIGluIHN0b3BwZWQgc3RhdGUsIGFzIHdlbGwgYXMgZHVyaW5nIHRoZSB0cmlwcGVkIHN0YXRlLgorICAgICAqCisgICAgICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBDMl9PSywgdGhlIGNvbXBvbmVudCBzaGFsbCBiZSBpbiB0aGUgcnVubmluZyBzdGF0ZS4KKyAgICAgKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIEMyX0JBRF9TVEFURSBvciBDMl9EVVBMSUNBVEUsIG5vIHN0YXRlIGNoYW5nZSBpcyBleHBlY3RlZCBhcyBhCisgICAgICogcmVzcG9uc2UgdG8gdGhpcyBjYWxsLgorICAgICAqIE90aGVyd2lzZSwgdGhlIGNvbXBvbmVudCBzaGFsbCBiZSBpbiB0aGUgc3RvcHBlZCBzdGF0ZS4KKyAgICAgKgorICAgICAqIFxub3RlIElmIGEgY29tcG9uZW50IGlzIGluIHRoZSB0cmlwcGVkIHN0YXRlIGFuZCBzdGFydCgpIGlzIGNhbGxlZCB3aGlsZSB0aGUgY29tcG9uZW50CisgICAgICogY29uZmlndXJhdGlvbiBzdGlsbCByZXN1bHRzIGluIGEgdHJpcCwgc3RhcnQgc2hhbGwgc3VjY2VlZCBhbmQgYSBuZXcgb25UcmlwcGVkIGNhbGxiYWNrCisgICAgICogc2hvdWxkIGJlIHVzZWQgdG8gY29tbXVuaWNhdGUgdGhlIGNvbmZpZ3VyYXRpb24gY29uZmxpY3QgdGhhdCByZXN1bHRzIGluIHRoZSBuZXcgdHJpcC4KKyAgICAgKgorICAgICAqIFx0b2RvIFRoaXMgbWV0aG9kIE1VU1QgcmV0dXJuIHdpdGhpbiA1MDBtcy4gU2VlbXMgdGhpcyBzaG91bGQgYmUgYWJsZSB0byByZXR1cm4gcXVpY2tseSwgYXMKKyAgICAgKiB0aGVyZSBhcmUgbm8gaW1tZWRpYXRlIGd1YXJhbnRlZXMuIFRob3VnaCB0aGVyZSBhcmUgZ3VhcmFudGVlcyBmb3IgcmVzcG9uc2l2ZW5lc3MgaW1tZWRpYXRlbHkKKyAgICAgKiBhZnRlciBzdGFydCByZXR1cm5zLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBoYXMgc3RhcnRlZCAob3IgcmVzdW1lZCkgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgd2hlbiBjYWxsZWQgZHVyaW5nIGFub3RoZXIgc3RhcnQgY2FsbCBmcm9tIGFub3RoZXIgdGhyZWFkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gYW55IHN0YXRlIG90aGVyIHRoYW4gdGhlIHN0b3BwZWQgc3RhdGUgb3IgdHJpcHBlZCBzdGF0ZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRpbmcgd2hlbiBjYWxsZWQgZHVyaW5nIGFub3RoZXIgc3RhdGUgY2hhbmdlIGNhbGwgZnJvbSBhbm90aGVyCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdGhyZWFkICh1c2VyIGVycm9yKQorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHN0YXJ0IHRoZSBjb21wb25lbnQKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCB0aGUgY29tcG9uZW50IGNvdWxkIG5vdCBiZSBzdGFydGVkIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHN0YXJ0aW5nIHRoZSBjb21wb25lbnQgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdGFydCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFN0b3BzIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBydW5uaW5nIChpbmNsdWRpbmcgdHJpcHBlZCkgc3RhdGUuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldHVybiB3aXRoaW5nIDUwMG1zLgorICAgICAqCisgICAgICogVXBvbiB0aGlzIGNhbGwsIGFsbCBwZW5kaW5nIHdvcmsgU0hBTEwgYmUgYWJhbmRvbmVkIGFuZCBhbGwgYnVmZmVyIHJlZmVyZW5jZXMgU0hBTEwgYmUKKyAgICAgKiByZWxlYXNlZC4KKyAgICAgKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIEMyX0JBRF9TVEFURSBvciBDMl9EVVBMSUNBVEUsIG5vIHN0YXRlIGNoYW5nZSBpcyBleHBlY3RlZCBhcyBhCisgICAgICogcmVzcG9uc2UgdG8gdGhpcyBjYWxsLgorICAgICAqIEZvciBhbGwgb3RoZXIgcmV0dXJuIHZhbHVlcywgdGhlIGNvbXBvbmVudCBzaGFsbCBiZSBpbiB0aGUgc3RvcHBlZCBzdGF0ZS4KKyAgICAgKgorICAgICAqIFx0b2RvIHNob3VsZCB0aGlzIHJldHVybiBjb21wbGV0ZWQgd29yaywgc2luY2UgY2xpZW50IHdpbGwganVzdCBmcmVlIGl0PyBQZXJoYXBzIGp1c3QgdG8KKyAgICAgKiB2ZXJpZnkgYWNjb3VudGluZy4KKyAgICAgKgorICAgICAqIFRoaXMgZG9lcyBub3QgYWx0ZXIgYW55IHNldHRpbmdzIGFuZCB0dW5pbmdzIHRoYXQgbWF5IGhhdmUgcmVzdWx0ZWQgaW4gYSB0cmlwcGVkIHN0YXRlLgorICAgICAqIChJcyB0aGlzIG1hdGVyaWFsIGdpdmVuIHRoZSBkZWZpbml0aW9uPyBQZXJoYXBzIGluIGNhc2Ugd2Ugd2FudCB0byBzdGFydCBhZ2Fpbi4pCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IGhhcyBzdGFydGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFIHdoZW4gY2FsbGVkIGR1cmluZyBhbm90aGVyIHN0b3AgY2FsbCBmcm9tIGFub3RoZXIgdGhyZWFkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gYW55IHN0YXRlIG90aGVyIHRoYW4gdGhlIHJ1bm5pbmcgc3RhdGUsIGluY2x1ZGluZyB3aGVuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgY2FsbGVkIGR1cmluZyBhbm90aGVyIHN0YXRlIGNoYW5nZSBjYWxsIGZyb20gYW5vdGhlciB0aHJlYWQgKHVzZXIgZXJyb3IpCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGNvbXBvbmVudCBjb3VsZCBub3QgYmUgc3RvcHBlZCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCBzdG9wcGluZyB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3Qgc3RvcCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlc2V0cyB0aGUgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSBzdXBwb3J0ZWQgaW4gYWxsIChpbmNsdWRpbmcgdHJpcHBlZCkgc3RhdGVzIG90aGVyIHRoYW4gcmVsZWFzZWQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBkdXJpbmcgYW55IG90aGVyIGJsb2NraW5nIGNhbGwuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIHJldHVybiB3aXRoaW5nIDUwMG1zLgorICAgICAqCisgICAgICogQWZ0ZXIgdGhpcyBjYWxsIHJldHVybnMgYWxsIHdvcmsgU0hBTEwgYmUgYWJhbmRvbmVkLCBhbGwgYnVmZmVyIHJlZmVyZW5jZXMgU0hBTEwgYmUgcmVsZWFzZWQuCisgICAgICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBDMl9CQURfU1RBVEUgb3IgQzJfRFVQTElDQVRFLCBubyBzdGF0ZSBjaGFuZ2UgaXMgZXhwZWN0ZWQgYXMgYQorICAgICAqIHJlc3BvbnNlIHRvIHRoaXMgY2FsbC4KKyAgICAgKiBGb3IgYWxsIG90aGVyIHJldHVybiB2YWx1ZXMsIHRoZSBjb21wb25lbnQgc2hhbGwgYmUgaW4gdGhlIHN0b3BwZWQgc3RhdGUuCisgICAgICoKKyAgICAgKiBcdG9kbyBzaG91bGQgdGhpcyByZXR1cm4gY29tcGxldGVkIHdvcmssIHNpbmNlIGNsaWVudCB3aWxsIGp1c3QgZnJlZSBpdD8gQWxzbywgaWYgaXQgdW5ibG9ja3MKKyAgICAgKiBhIHN0b3AsIHdoZXJlIHNob3VsZCBjb21wbGV0ZWQgd29yayBiZSByZXR1cm5lZD8KKyAgICAgKgorICAgICAqIFRoaXMgYnJpbmdzIHNldHRpbmdzIGJhY2sgdG8gdGhlaXIgZGVmYXVsdCAtICJndWFyYW50ZWVpbmciIG5vIHRyaXBwZWQgc3BhY2UuCisgICAgICoKKyAgICAgKiBcdG9kbyByZWNsYWltIHN1cHBvcnQgLSBpdCBzZWVtcyB0aGF0IHNpbmNlIG93bmVyc2hpcCBpcyBwYXNzZWQsIHRoaXMgd2lsbCBhbGxvdyByZWNsYWltaW5nCisgICAgICogc3R1ZmYuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IGhhcyBiZWVuIHJlc2V0CisgICAgICogXHJldHZhbCBDMl9EVVBMSUNBVEUgd2hlbiBjYWxsZWQgZHVyaW5nIGFub3RoZXIgcmVzZXQgY2FsbCBmcm9tIGFub3RoZXIgdGhyZWFkCisgICAgICogXHJldHZhbCBDMl9CQURfU1RBVEUgd2hlbiBjYWxsZWQgaW4gdGhlIHJlbGVhc2VkIHN0YXRlCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIGNvbXBvbmVudCBjb3VsZCBub3QgYmUgcmVzZXQgd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgcmVzZXR0aW5nIHRoZSBjb21wb25lbnQgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCByZXNldCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2VzIHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBzdG9wcGVkIHN0YXRlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCByZXR1cm4gd2l0aGluZyA1MDBtcy4gVXBvbiByZXR1cm4gYWxsIHJlZmVyZW5jZXMgc2hhbGwgYmUgYWJhbmRvbmVkLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBoYXMgYmVlbiByZWxlYXNlZAorICAgICAqIFxyZXR2YWwgQzJfRFVQTElDQVRFIHRoZSBjb21wb25lbnQgaXMgYWxyZWFkeSByZWxlYXNlZAorICAgICAqIFxyZXR2YWwgQzJfQkFEX1NUQVRFIHRoZSBjb21wb25lbnQgaXMgcnVubmluZworICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIHRoZSBjb21wb25lbnQgY291bGQgbm90IGJlIHJlbGVhc2VkIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHJlbGVhc2luZyB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVsZWFzZSgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGludGVyZmFjZSBmb3IgdGhpcyBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYoKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5DMkNvbXBvbmVudCgpID0gZGVmYXVsdDsKK307CisKK0MyRU5VTShDMkNvbXBvbmVudDo6a2luZF90LCB1aW50MzJfdCwKKyAgICBLSU5EX09USEVSLAorICAgIEtJTkRfREVDT0RFUiwKKyAgICBLSU5EX0VOQ09ERVIKKyk7CisKK0MyRU5VTShDMkNvbXBvbmVudDo6ZG9tYWluX3QsIHVpbnQzMl90LAorICAgIERPTUFJTl9PVEhFUiwKKyAgICBET01BSU5fVklERU8sCisgICAgRE9NQUlOX0FVRElPLAorICAgIERPTUFJTl9JTUFHRQorKTsKKworY2xhc3MgQzJGcmFtZUluZm9QYXJzZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIFxyZXR1cm4gdGhlIGNvbnRlbnQgdHlwZSBzdXBwb3J0ZWQgYnkgdGhpcyBpbmZvIHBhcnNlci4KKyAgICAgKgorICAgICAqIFx0b2RvIHRoaXMgbWF5IGJlIHJlZHVuZGFudAorICAgICAqLworICAgIHZpcnR1YWwgQzJTdHJpbmdMaXRlcmFsIGdldFR5cGUoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuIGEgdmVjdG9yIG9mIHN1cHBvcnRlZCBwYXJhbWV0ZXIgaW5kaWNlcyBwYXJzZWQgYnkgdGhpcyBpbmZvIHBhcnNlci4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHRvZG8gc3RpY2t5IHZzLiBub24tc3RpY2t5IHBhcmFtcz8gdGhpcyBtYXkgYmUgY29tbXVuaWNhdGVkIGJ5IHBhcmFtLXJlZmxlY3Rvci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBnZXRQYXJzZWRQYXJhbXMoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhpcyBpbmZvIHBhcnNlci4gVGhpcyBicmluZ3MgdGhpcyBwYXJzZXIgdG8gaXRzIGluaXRpYWwgc3RhdGUgYWZ0ZXIgY3JlYXRpb24uCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBpbmZvIHBhcnNlciB3YXMgcmVzZXQKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgcmVzZXQgdGhlIHBhcnNlciB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgcmVzZXR0aW5nIG9mIHRoZSBwYXJzZXIgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCByZXNldCgpIHsgcmV0dXJuIEMyX09LOyB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHBhcnNlRnJhbWUoQzJGcmFtZURhdGEgJmZyYW1lKTsKKworICAgIHZpcnR1YWwgfkMyRnJhbWVJbmZvUGFyc2VyKCkgPSBkZWZhdWx0OworfTsKKworY2xhc3MgQzJBbGxvY2F0b3JTdG9yZSB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBDMkFsbG9jYXRvcjo6aWRfdCBpZF90OworCisgICAgZW51bSA6IEMyQWxsb2NhdG9yOjppZF90IHsKKyAgICAgICAgREVGQVVMVF9MSU5FQVIsICAgICAvLy88IGJhc2ljIGxpbmVhciBhbGxvY2F0b3IgdHlwZQorICAgICAgICBERUZBVUxUX0dSQVBISUMsICAgIC8vLzwgYmFzaWMgZ3JhcGhpYyBhbGxvY2F0b3IgdHlwZQorICAgICAgICBQTEFURk9STV9TVEFSVCA9IDB4MTAsCisgICAgICAgIFZFTkRPUl9TVEFSVCAgID0gMHgxMDAsCisgICAgICAgIEJBRF9JRCAgICAgICAgID0gQzJBbGxvY2F0b3I6OkJBRF9JRCwgLy8vPCBETyBOT1QgVVNFCisgICAgfTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHVuaXF1ZSBuYW1lIG9mIHRoaXMgYWxsb2NhdG9yIHN0b3JlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRoZSBuYW1lIG9mIHRoaXMgYWxsb2NhdG9yIHN0b3JlLgorICAgICAqIFxyZXR2YWwgYW4gZW1wdHkgc3RyaW5nIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0byBhbGxvY2F0ZSB0aGUgYWN0dWFsIG5hbWUuCisgICAgICovCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc2V0IG9mIGFsbG9jYXRvcnMgc3VwcG9ydGVkIGJ5IHRoaXMgYWxsb2NhdG9yIHN0b3JlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSAibm9uLWJsb2NraW5nIiBhbmQgcmV0dXJuIHdpdGhpbiAxbXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIHZlY3RvciBvZiBhbGxvY2F0b3IgaW5mb3JtYXRpb24gKGFzIHNoYXJlZCBwb2ludGVycykKKyAgICAgKiBccmV0dmFsIGFuIGVtcHR5IHZlY3RvciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIHdob2xlIHZlY3Rvci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkFsbG9jYXRvcjo6VHJhaXRzPj4gbGlzdEFsbG9jYXRvcnNfbmIoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMvY3JlYXRlcyBhIHNoYXJlZCBhbGxvY2F0b3Igb2JqZWN0LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCBiZSByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFRoZSBhbGxvY2F0b3IgaXMgY3JlYXRlZCBvbiBmaXJzdCB1c2UsIGFuZCB0aGUgc2FtZSBhbGxvY2F0b3IgaXMgcmV0dXJuZWQgb24gc3Vic2VxdWVudAorICAgICAqIGNvbmN1cnJlbnQgdXNlcyBpbiB0aGUgc2FtZSBwcm9jZXNzLiBUaGUgYWxsb2NhdG9yIGlzIGZyZWVkIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIHJlZmVyZW5jZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gaWQgICAgICB0aGUgSUQgb2YgdGhlIGFsbG9jYXRvciB0byBjcmVhdGUuIFRoaXMgaXMgZGVmaW5lZCBieSB0aGUgc3RvcmUsIGJ1dAorICAgICAqICAgICAgICAgICAgICAgIHRoZSBJRCBvZiB0aGUgZGVmYXVsdCBsaW5lYXIgYW5kIGdyYXBoaWMgYWxsb2NhdG9ycyBpcyBmb3JtYWxpemVkLgorICAgICAqIFxwYXJhbSBhbGxvY2F0b3Igc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGNyZWF0ZWQgYWxsb2NhdG9yIGlzIHN0b3JlZC4gQ2xlYXJlZCBvbiBmYWlsdXJlCisgICAgICogICAgICAgICAgICAgICAgICBhbmQgdXBkYXRlZCBvbiBzdWNjZXNzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGFsbG9jYXRvciB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgY3JlYXRlIHRoZSBhbGxvY2F0b3Igd2l0aGluIHRoZSB0aW1lIGxpbWl0ICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSBhbGxvY2F0b3IgKHVuZXhwZWN0ZWQpCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBubyBzdWNoIGFsbG9jYXRvcgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSB0aGUgYWxsb2NhdG9yCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEFsbG9jYXRvcihpZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+KiBjb25zdCBhbGxvY2F0b3IpID0gMDsKKworICAgIHZpcnR1YWwgfkMyQWxsb2NhdG9yU3RvcmUoKSA9IGRlZmF1bHQ7Cit9OworCitjbGFzcyBDMkNvbXBvbmVudFN0b3JlIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgY29tcG9uZW50IG9yIGNvbXBvbmVudCBpbnRlcmZhY2Ugb2JqZWN0LgorICAgICAqIFRoaXMgaXMgYSB1bmlxdWUgbmFtZSBmb3IgdGhpcyBjb21wb25lbnQgb3IgY29tcG9uZW50IGludGVyZmFjZSAnY2xhc3MnOyBob3dldmVyLCBtdWx0aXBsZQorICAgICAqIGluc3RhbmNlcyBvZiB0aGlzIGNvbXBvbmVudCBTSEFMTCBoYXZlIHRoZSBzYW1lIG5hbWUuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlIHN1cHBvcnRlZCBpbiBhbnkgc3RhdGUuIFRoaXMgY2FsbCBkb2VzIG5vdCBjaGFuZ2UgdGhlIHN0YXRlIG5vciB0aGUKKyAgICAgKiBpbnRlcm5hbCBzdGF0ZXMgb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIE1VU1QgYmUgIm5vbi1ibG9ja2luZyIgYW5kIHJldHVybiB3aXRoaW4gMW1zLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgbmFtZSBvZiB0aGlzIGNvbXBvbmVudCBvciBjb21wb25lbnQgaW50ZXJmYWNlIG9iamVjdC4KKyAgICAgKiBccmV0dmFsIGFuIGVtcHR5IHN0cmluZyBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8gYWxsb2NhdGUgdGhlIGFjdHVhbCBuYW1lLgorICAgICAqLworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDEwMG1zLgorICAgICAqCisgICAgICogXHBhcmFtIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgY29tcG9uZW50IHRvIGNyZWF0ZQorICAgICAqIFxwYXJhbSBjb21wb25lbnQgICAgIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGNvbXBvbmVudCBpcyBzdG9yZWQuIENsZWFyZWQgb24KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBmYWlsdXJlIGFuZCB1cGRhdGVkIG9uIHN1Y2Nlc3MuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBjcmVhdGUgdGhlIGNvbXBvbmVudCB3aXRoaW4gdGhlIHRpbWUgbGltaXQgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgY3JlYXRpb24gb2YgdGhlIGNvbXBvbmVudCAodW5leHBlY3RlZCkKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIG5vIHN1Y2ggY29tcG9uZW50CisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIEMyU3RyaW5nIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4qIGNvbnN0IGNvbXBvbmVudCkgPSAwOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvbXBvbmVudCBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDEwMG1zLgorICAgICAqCisgICAgICogXHBhcmFtIG5hbWUgICAgICAgICAgbmFtZSBvZiB0aGUgY29tcG9uZW50IGludGVyZmFjZSB0byBjcmVhdGUKKyAgICAgKiBccGFyYW0gaW50ZXJmYWNlICAgICBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgY3JlYXRlZCBpbnRlcmZhY2UgaXMgc3RvcmVkCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IGludGVyZmFjZSB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkKKyAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgY3JlYXRlIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlIHdpdGhpbiB0aGUgdGltZSBsaW1pdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHNvbWUgdW5rbm93biBlcnJvciBwcmV2ZW50ZWQgdGhlIGNyZWF0aW9uIG9mIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBubyBzdWNoIGNvbXBvbmVudCBpbnRlcmZhY2UKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UKKyAgICAgKgorICAgICAqIFx0b2RvIERvIHdlIG5lZWQgYW4gaW50ZXJmYWNlLCBvciBjb3VsZCB0aGlzIGp1c3QgYmUgYSBjb21wb25lbnQgdGhhdCBpcyBuZXZlciBzdGFydGVkPworICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIGNvbXBvbmVudHMgc3VwcG9ydGVkIGJ5IHRoaXMgY29tcG9uZW50IHN0b3JlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgTVVTVCByZXR1cm4gd2l0aGluIDUwMG1zLgorICAgICAqCisgICAgICogXHJldHZhbCB2ZWN0b3Igb2YgY29tcG9uZW50IGluZm9ybWF0aW9uLgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PiBsaXN0Q29tcG9uZW50cygpID0gMDsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVUSUxJVFkgTUVUSE9EUyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8gb24tZGVtYW5kIGJ1ZmZlciBsYXlvdXQgY29udmVyc2lvbiAoc3dpenpsaW5nKQorICAgIC8vCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb3B5QnVmZmVyKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gc3JjLCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiBkc3QpID0gMDsKKworICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENPTkZJR1VSQVRJT04gQVBJIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gZS5nLiBmb3IgZ2xvYmFsIHNldHRpbmdzIChzeXN0ZW0td2lkZSBzdHJpZGUsIGV0Yy4pCisKKyAgICAvKioKKyAgICAgKiBRdWVyaWVzIGEgc2V0IG9mIHN5c3RlbS13aWRlIHBhcmFtZXRlcnMuCisgICAgICogUXVlcnlpbmcgaXMgcGVyZm9ybWVkIGF0IGJlc3QgZWZmb3J0OiB0aGUgc3RvcmUgU0hBTEwgcXVlcnkgYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFuZAorICAgICAqIHNraXAgdW5zdXBwb3J0ZWQgb25lcywgb3IgaGVhcCBhbGxvY2F0ZWQgcGFyYW1ldGVycyB0aGF0IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuIEFueSBlcnJvcnMKKyAgICAgKiBhcmUgY29tbXVuaWNhdGVkIGluIHRoZSByZXR1cm4gdmFsdWUuIEFkZGl0aW9uYWxseSwgcHJlYWxsb2NhdGVkIChlLmcuIHN0YWNrKSBwYXJhbWV0ZXJzIHRoYXQKKyAgICAgKiBjb3VsZCBub3QgYmUgcXVlcmllZCBhcmUgaW52YWxpZGF0ZWQuIFBhcmFtZXRlcnMgdG8gYmUgYWxsb2NhdGVkIG9uIHRoZSBoZWFwIGFyZSBvbWl0dGVkIGZyb20KKyAgICAgKiB0aGUgcmVzdWx0LgorICAgICAqCisgICAgICogXG5vdGUgUGFyYW1ldGVyIHZhbHVlcyBkbyBub3QgZGVwZW5kIG9uIHRoZSBvcmRlciBvZiBxdWVyeS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIG1heSBiZSBtb21lbnRhcmlseSBibG9ja2luZywgYnV0IE1VU1QgcmV0dXJuIHdpdGhpbiA1bXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gc3RhY2tQYXJhbXMgICBhIGxpc3Qgb2YgcGFyYW1zIHF1ZXJpZWQuIFRoZXNlIGFyZSBpbml0aWFsaXplZCBzcGVjaWZpYyB0byBlYWNoCisgICAgICogICAgICAgICAgICAgICAgICAgICAgc2V0dGluZzsgZS5nLiBzaXplIGFuZCBpbmRleCBhcmUgc2V0IGFuZCByZXN0IG9mIHRoZSBtZW1iZXJzIGFyZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNsZWFyZWQuCisgICAgICogICAgICAgICAgICAgICAgICAgICAgTk9URTogRmxleGlibGUgc2V0dGluZ3MgdGhhdCBhcmUgb2YgaW5jb3JyZWN0IHNpemUgd2lsbCBiZSBpbnZhbGlkYXRlZC4KKyAgICAgKiBccGFyYW0gaGVhcFBhcmFtSW5kaWNlcyBhIHZlY3RvciBvZiBwYXJhbSBpbmRpY2VzIGZvciBwYXJhbXMgdG8gYmUgcXVlcmllZCBhbmQgcmV0dXJuZWQgb24gdGhlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaGVhcC4gVGhlc2UgcGFyYW1ldGVycyB3aWxsIGJlIHJldHVybmVkIGluIGhlYXBQYXJhbXMuIFVuc3VwcG9ydGVkIHBhcmFtCisgICAgICogICAgICAgICAgICAgICAgICAgICAgaW5kaWNlcyB3aWxsIGJlIGlnbm9yZWQuCisgICAgICogXHBhcmFtIGhlYXBQYXJhbXMgICAgYSBsaXN0IG9mIHBhcmFtcyB3aGVyZSB0byB3aGljaCB0aGUgc3VwcG9ydGVkIGhlYXAgcGFyYW1ldGVycyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYXBwZW5kZWQgaW4gdGhlIG9yZGVyIHRoZXkgYXBwZWFyIGluIGhlYXBQYXJhbUluZGljZXMuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICBhbGwgcGFyYW1ldGVycyBjb3VsZCBiZSBxdWVyaWVkCisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHF1ZXJpZWQsIGJ1dCBzb21lIHBhcmFtZXRlcnMgd2VyZSBub3QKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBzdXBwb3J0ZWQKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBjb3VsZCBub3QgYWxsb2NhdGUgbWVtb3J5IGZvciBhIHN1cHBvcnRlZCBwYXJhbWV0ZXIKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBxdWVyeWluZyBvZiB0aGUgcGFyYW1ldGVycworICAgICAqICAgICAgICAgICAgICAgICAgICAgICh1bmV4cGVjdGVkKQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlfc20oCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogU2V0cyBhIHNldCBvZiBzeXN0ZW0td2lkZSBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogXG5vdGUgVGhlcmUgYXJlIG5vIHNldHRhYmxlIHN5c3RlbS13aWRlIHBhcmFtZXRlcnMgZGVmaW5lZCB0aHVzIGZhciwgYnV0IG1heSBiZSBhZGRlZCBpbiB0aGUKKyAgICAgKiBmdXR1cmUuCisgICAgICoKKyAgICAgKiBUdW5pbmcgaXMgcGVyZm9ybWVkIGF0IGJlc3QgZWZmb3J0OiB0aGUgc3RvcmUgU0hBTEwgdXBkYXRlIGFsbCBzdXBwb3J0ZWQgY29uZmlndXJhdGlvbiBhdAorICAgICAqIGJlc3QgZWZmb3J0ICh1bmxlc3MgY29uZmlndXJlZCBvdGhlcndpc2UpIGFuZCBza2lwIHVuc3VwcG9ydGVkIG9uZXMuIEFueSBlcnJvcnMgYXJlCisgICAgICogY29tbXVuaWNhdGVkIGluIHRoZSByZXR1cm4gdmFsdWUgYW5kIGluIHxmYWlsdXJlc3wuCisgICAgICoKKyAgICAgKiBcbm90ZSBQYXJhbWV0ZXIgdHVuaW5nIERPRVMgZGVwZW5kIG9uIHRoZSBvcmRlciBvZiB0aGUgdHVuaW5nIHBhcmFtZXRlcnMuIEUuZy4gc29tZSBwYXJhbWV0ZXIKKyAgICAgKiB1cGRhdGUgbWF5IGFsbG93IHNvbWUgc3Vic2VxdWVudCBwYXJhbWV0ZXIgdXBkYXRlLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbXMgICAgICAgIGEgbGlzdCBvZiBwYXJhbWV0ZXIgdXBkYXRlcy4gVGhlc2Ugd2lsbCBiZSB1cGRhdGVkIHRvIHRoZSBhY3R1YWwKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIgdmFsdWVzIGFmdGVyIHRoZSB1cGRhdGVzICh0aGlzIGlzIGJlY2F1c2UgdHVuaW5nIGlzIHBlcmZvcm1lZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgIGF0IGJlc3QgZWZmb3J0KS4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBcdG9kbyBwYXJhbXMgdGhhdCBjb3VsZCBub3QgYmUgdXBkYXRlZCBhcmUgbm90IG1hcmtlZCBoZXJlLCBzbyBhcmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjb25mdXNpbmcgLSBhcmUgdGhleSAiZXhpc3RpbmciIHZhbHVlcyBvciBpbnRlbmRlZCB0byBiZSBjb25maWd1cmVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPworICAgICAqIFxwYXJhbSBmYWlsdXJlcyAgICAgIGEgbGlzdCBvZiBwYXJhbWV0ZXIgZmFpbHVyZXMKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGFsbCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggYWxsIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGNvdWxkIGJlIHVwZGF0ZWQgc3VjY2Vzc2Z1bGx5LCBidXQgc29tZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgd2VyZSBub3Qgc3VwcG9ydGVkCisgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgc29tZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgYmVjYXVzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZXkgY29udGFpbmVkIHVuc3VwcG9ydGVkIHZhbHVlcy4gVGhlc2UgYXJlIHJldHVybmVkIGluIHxmYWlsdXJlc3wuCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgc29tZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBjb3VsZCBub3QgYmUgdXBkYXRlZCBzdWNjZXNzZnVsbHkgYmVjYXVzZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHRoZXkgY29udGFpbmVkIHVuc3VwcG9ydGVkIHZhbHVlcywgYnV0IGNvdWxkIG5vdCBhbGxvY2F0ZSBhIGZhaWx1cmUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBvYmplY3QgZm9yIHRoZW0uCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgdXBkYXRlIG9mIHRoZSBwYXJhbWV0ZXJzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWdfc20oCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpID0gMDsKKworICAgIC8vIFJFRkxFQ1RJT04gTUVDSEFOSVNNIChVU0VEIEZPUiBFWFRFTlNJT04pCisgICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgcmVmbGVjdG9yLgorICAgICAqCisgICAgICogVGhpcyBpcyB1c2VkIHRvIGRlc2NyaWJlIHBhcmFtZXRlciBmaWVsZHMuIFRoaXMgaXMgc2hhcmVkIGZvciBhbGwgY29tcG9uZW50cyBjcmVhdGVkIGJ5CisgICAgICogdGhpcyBjb21wb25lbnQgc3RvcmUuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gYSBzaGFyZWQgcGFyYW1ldGVyIHJlZmxlY3RvciBvYmplY3QuCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UGFyYW1SZWZsZWN0b3IoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBzZXQgb2Ygc3VwcG9ydGVkIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBNVVNUIGJlICJub24tYmxvY2tpbmciIGFuZCByZXR1cm4gd2l0aGluIDFtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbVtvdXRdIHBhcmFtcyBhIHZlY3RvciBvZiBzdXBwb3J0ZWQgcGFyYW1ldGVycyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoaXMgdmVjdG9yLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoaXMgbWV0aG9kLgorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqIGNvbnN0IHBhcmFtcykgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogUmV0cmlldmVzIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGUgcXVlcmllZCBmaWVsZHMuCisgICAgICoKKyAgICAgKiBDbGllbnQgU0hBTEwgc2V0IHRoZSBwYXJhbWV0ZXItZmllbGQgc3BlY2lmaWVyIGFuZCB0aGUgdHlwZSBvZiBzdXBwb3J0ZWQgdmFsdWVzIHF1ZXJ5IChlLmcuCisgICAgICogY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMsIG9yIHBvdGVudGlhbCBzdXBwb3J0ZWQgdmFsdWVzKSBpbiBmaWVsZHMuCisgICAgICogVXBvbiByZXR1cm4gdGhlIHN0b3JlIFNIQUxMIGZpbGwgaW4gdGhlIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoZSBmaWVsZHMgbGlzdGVkIGFzIHdlbGwKKyAgICAgKiBhcyBhIHN0YXR1cyBmb3IgZWFjaCBmaWVsZC4gU3RvcmUgc2hhbGwgcHJvY2VzcyBhbGwgZmllbGRzIHF1ZXJpZWQgZXZlbiBpZiBzb21lIHF1ZXJpZXMKKyAgICAgKiBmYWlsLgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgbWF5IGJlIG1vbWVudGFyaWx5IGJsb2NraW5nLCBidXQgTVVTVCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbiBvdXRdIGZpZWxkcyBhIHZlY3RvciBvZiBmaWVsZHMgZGVzY3JpcHRvciBzdHJ1Y3R1cmVzLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqIFxyZXR2YWwgQzJfQkFEX0lOREVYIGF0IGxlYXN0IG9uZSBmaWVsZCB3YXMgbm90IHJlY29nbml6ZWQgYXMgYSBjb21wb25lbnQgc3RvcmUgZmllbGQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIH5DMkNvbXBvbmVudFN0b3JlKCkgPSBkZWZhdWx0OworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vLyBAfQorCisjZW5kaWYgIC8vIEMyQ09NUE9ORU5UX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29uZmlnLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyQ29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyMGY5MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJDb25maWcuaApAQCAtMCwwICsxLDIxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyQ09ORklHX0hfCisjZGVmaW5lIEMyQ09ORklHX0hfCisKKyNpbmNsdWRlIDxDMi5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJFbnVtLmg+CisjaW5jbHVkZSA8QzJQYXJhbURlZi5oPgorCisvLy8gXGRlZmdyb3VwIGNvbmZpZyBDb21wb25lbnQgY29uZmlndXJhdGlvbgorLy8vIEB7CisKKy8qKgorICogRW51bWVyYXRlZCBib29sZWFuLgorICovCitDMkVOVU0oYzJfYm9vbF90LCB1aW50MzJfdCwKKyAgICBDMl9GQUxTRSwgLy8vPCB0cnVlCisgICAgQzJfVFJVRSwgIC8vLzwgZmFsc2UKKykKKwordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PGMyX2Jvb2xfdD4gQzJCb29sVmFsdWU7CisKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkVhc3lFbnVtPGMyX2Jvb2xfdD4+IEMyRWFzeUJvb2xWYWx1ZTsKKworLyoqCisgKiBFbnVtZXJhdGVkIHNldCB0cmktc3RhdGUuCisgKgorICogVXNlZCBmb3Igb3B0aW9uYWwgY29uZmlndXJhdGlvbnMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB2YWx1ZXMgc2V0IGJ5IHRoZSBjbGllbnQsCisgKiBkZWZhdWx0IHZhbHVlcyBzZXQgYnkgdGhlIGNvbXBvbmVudCwgb3IgdW5zZXQgdmFsdWVzLgorICovCitDMkVOVU0oYzJfc2V0X3QsIHVpbnQzMl90LAorICAgIEMyX1VOU0VULCAgIC8vIHBhcmFtZXRlciBpcyB1bnNldCBhbmQgaGFzIG5vIHZhbHVlCisgICAgQzJfU0VULCAgICAgLy8gcGFyYW1ldGVyIGlzL2hhcyBiZWVuIHNldCBieSB0aGUgY2xpZW50CisgICAgQzJfREVGQVVMVCwgLy8gcGFyYW1ldGVyIGhhcyBub3QgYmVlbiBzZXQgYnkgdGhlIGNsaWVudCwgYnV0IGlzIHNldCBieSB0aGUgY29tcG9uZW50CispCisKKy8qKiBFbnVtZXJhdGlvbnMgdXNlZCBieSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgKi8KK3N0cnVjdCBDMkNvbmZpZyB7CisgICAgZW51bSBhYWNfcGFja2FnaW5nX3QgOiB1aW50MzJfdDsgICAgICAgIC8vLzwgQUFDIHBhY2thZ2luZyAoUkFXIHZzIEFEVFMpCisgICAgZW51bSBhYWNfc2JyX21vZGVfdCA6IHVpbnQzMl90OyAgICAgICAgIC8vLzwgQUFDIFNCUiBtb2RlCisgICAgZW51bSBhcGlfZmVhdHVyZV90IDogdWludDY0X3Q7ICAgICAgICAgIC8vLzwgQVBJIGZlYXR1cmVzCisgICAgZW51bSBhcGlfbGV2ZWxfdCA6IHVpbnQzMl90OyAgICAgICAgICAgIC8vLzwgQVBJIGxldmVsCisgICAgZW51bSBiaXRyYXRlX21vZGVfdCA6IHVpbnQzMl90OyAgICAgICAgIC8vLzwgYml0cmF0ZSBjb250cm9sIG1vZGUKKyAgICBlbnVtIGRyY19jb21wcmVzc2lvbl9tb2RlX3QgOiBpbnQzMl90OyAgLy8vPCBEUkMgY29tcHJlc3Npb24gbW9kZQorICAgIGVudW0gZHJjX2VmZmVjdF90eXBlX3QgOiBpbnQzMl90OyAgICAgICAvLy88IERSQyBlZmZlY3QgdHlwZQorICAgIGVudW0gaW50cmFfcmVmcmVzaF9tb2RlX3QgOiB1aW50MzJfdDsgICAvLy88IGludHJhIHJlZnJlc2ggbW9kZXMKKyAgICBlbnVtIGxldmVsX3QgOiB1aW50MzJfdDsgICAgICAgICAgICAgICAgLy8vPCBjb2RpbmcgbGV2ZWwKKyAgICBlbnVtIG9yZGluYWxfa2V5X3QgOiB1aW50MzJfdDsgICAgICAgICAgLy8vPCB3b3JrIG9yZGVyaW5nIGtleXMKKyAgICBlbnVtIHBjbV9lbmNvZGluZ190IDogdWludDMyX3Q7ICAgICAgICAgLy8vPCBQQ00gZW5jb2RpbmcKKyAgICBlbnVtIHBpY3R1cmVfdHlwZV90IDogdWludDMyX3Q7ICAgICAgICAgLy8vPCBwaWN0dXJlIHR5cGVzCisgICAgZW51bSBwbGF0Zm9ybV9mZWF0dXJlX3QgOiB1aW50NjRfdDsgICAgIC8vLzwgcGxhdGZvcm0gZmVhdHVyZXMKKyAgICBlbnVtIHBsYXRmb3JtX2xldmVsX3QgOiB1aW50MzJfdDsgICAgICAgLy8vPCBwbGF0Zm9ybSBsZXZlbAorICAgIGVudW0gcHJlcGVuZF9oZWFkZXJfbW9kZV90IDogdWludDMyX3Q7ICAvLy88IHByZXBlbmQgaGVhZGVyIG9wZXJhdGlvbmFsIG1vZGVzCisgICAgZW51bSBwcm9maWxlX3QgOiB1aW50MzJfdDsgICAgICAgICAgICAgIC8vLzwgY29kaW5nIHByb2ZpbGUKKyAgICBlbnVtIHNjYWxpbmdfbWV0aG9kX3QgOiB1aW50MzJfdDsgICAgICAgLy8vPCBzY2FsaW5nIG1ldGhvZHMKKyAgICBlbnVtIHNjYW5fb3JkZXJfdCA6IHVpbnQzMl90OyAgICAgICAgICAgLy8vPCBzY2FuIG9yZGVycworICAgIGVudW0gc2VjdXJlX21vZGVfdCA6IHVpbnQzMl90OyAgICAgICAgICAvLy88IHNlY3VyZS9wcm90ZWN0ZWQgbW9kZXMKKyAgICBlbnVtIHN1cHBsZW1lbnRhbF9pbmZvX3QgOiB1aW50MzJfdDsgICAgLy8vPCBzdXBwbGVtZW50YWwgaW5mb3JtYXRpb24gdHlwZXMKKyAgICBlbnVtIHRpbGluZ19tb2RlX3QgOiB1aW50MzJfdDsgICAgICAgICAgLy8vPCB0aWxpbmcgbW9kZXMKK307CisKK25hbWVzcGFjZSB7CisKK2VudW0gQzJQYXJhbUluZGV4S2luZCA6IEMyUGFyYW06OnR5cGVfaW5kZXhfdCB7CisgICAgQzJfUEFSQU1fSU5ERVhfSU5WQUxJRCAgICAgICAgICAgICA9IDB4MCwgICAgLy8vPCBkbyBub3QgdXNlCisgICAgQzJfUEFSQU1fSU5ERVhfU1RSVUNUX1NUQVJUICAgICAgICA9IDB4MSwgICAgLy8vPCBzdHJ1Y3Qgb25seSBpbmRpY2VzCisgICAgQzJfUEFSQU1fSU5ERVhfUEFSQU1fU1RBUlQgICAgICAgICA9IDB4ODAwLCAgLy8vPCByZWd1bGFyIHBhcmFtZXRlcnMKKyAgICBDMl9QQVJBTV9JTkRFWF9DT0RFUl9QQVJBTV9TVEFSVCAgID0gMHgxMDAwLCAvLy88IGVuL3RyYW5zY29kZXIgcGFyYW1ldGVycworICAgIEMyX1BBUkFNX0lOREVYX1BJQ1RVUkVfUEFSQU1fU1RBUlQgPSAweDE4MDAsIC8vLzwgaW1hZ2UvdmlkZW8gcGFyYW1ldGVycworICAgIEMyX1BBUkFNX0lOREVYX1ZJREVPX1BBUkFNX1NUQVJUICAgPSAweDIwMDAsIC8vLzwgdmlkZW8gcGFyYW1ldGVycworICAgIEMyX1BBUkFNX0lOREVYX0lNQUdFX1BBUkFNX1NUQVJUICAgPSAweDI4MDAsIC8vLzwgaW1hZ2UgcGFyYW1ldGVycworICAgIEMyX1BBUkFNX0lOREVYX0FVRElPX1BBUkFNX1NUQVJUICAgPSAweDMwMDAsIC8vLzwgaW1hZ2UgcGFyYW1ldGVycworICAgIEMyX1BBUkFNX0lOREVYX1BMQVRGT1JNX1NUQVJUICAgICAgPSAweDQwMDAsIC8vLzwgcGxhdGZvcm0tZGVmaW5lZCBwYXJhbWV0ZXJzCisKKyAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBzdHJ1Y3R1cmUgaW5kaWNlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgICAga1BhcmFtSW5kZXhDb2xvclh5ID0gQzJfUEFSQU1fSU5ERVhfU1RSVUNUX1NUQVJULAorICAgIGtQYXJhbUluZGV4TWFzdGVyaW5nRGlzcGxheUNvbG9yVm9sdW1lLAorICAgIGtQYXJhbUluZGV4Q2hyb21hT2Zmc2V0LAorICAgIGtQYXJhbUluZGV4R29wTGF5ZXIsCisKKyAgICAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBwYXJhbWV0ZXIgaW5kaWNlcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisgICAga1BhcmFtSW5kZXhBcGlMZXZlbCA9IEMyX1BBUkFNX0lOREVYX1BBUkFNX1NUQVJULAorICAgIGtQYXJhbUluZGV4QXBpRmVhdHVyZXMsCisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gYWxsIGNvbXBvbmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICAvKiBnZW5lcmljIGNvbXBvbmVudCBjaGFyYWN0ZXJpc3RpY3MgKi8KKyAgICBrUGFyYW1JbmRleE5hbWUsCisgICAga1BhcmFtSW5kZXhBbGlhc2VzLAorICAgIGtQYXJhbUluZGV4S2luZCwKKyAgICBrUGFyYW1JbmRleERvbWFpbiwKKyAgICBrUGFyYW1JbmRleEF0dHJpYnV0ZXMsCisgICAga1BhcmFtSW5kZXhUaW1lU3RyZXRjaCwKKworICAgIC8qIGNvZGluZyBjaGFyYWN0ZXJpc3RpY3MgKi8KKyAgICBrUGFyYW1JbmRleFByb2ZpbGVMZXZlbCwKKyAgICBrUGFyYW1JbmRleEluaXREYXRhLAorICAgIGtQYXJhbUluZGV4U3VwcGxlbWVudGFsRGF0YSwKKyAgICBrUGFyYW1JbmRleFN1YnNjcmliZWRTdXBwbGVtZW50YWxEYXRhLAorCisgICAgLyogcGlwZWxpbmUgY2hhcmFjdGVyaXN0aWNzICovCisgICAga1BhcmFtSW5kZXhNZWRpYVR5cGUsCisgICAgX19rUGFyYW1JbmRleFJFU0VSVkVEXzAsCisgICAga1BhcmFtSW5kZXhEZWxheSwKKyAgICBrUGFyYW1JbmRleE1heFJlZmVyZW5jZUFnZSwKKyAgICBrUGFyYW1JbmRleE1heFJlZmVyZW5jZUNvdW50LAorICAgIGtQYXJhbUluZGV4UmVvcmRlckJ1ZmZlckRlcHRoLAorICAgIGtQYXJhbUluZGV4UmVvcmRlcktleSwKKyAgICBrUGFyYW1JbmRleFN0cmVhbUNvdW50LAorICAgIGtQYXJhbUluZGV4U3Vic2NyaWJlZFBhcmFtSW5kaWNlcywKKyAgICBrUGFyYW1JbmRleFN1Z2dlc3RlZEJ1ZmZlckNvdW50LAorICAgIGtQYXJhbUluZGV4QmF0Y2hTaXplLAorICAgIGtQYXJhbUluZGV4Q3VycmVudFdvcmssCisgICAga1BhcmFtSW5kZXhMYXN0V29ya1F1ZXVlZCwKKworICAgIC8qIG1lbW9yeSBhbGxvY2F0aW9uICovCisgICAga1BhcmFtSW5kZXhBbGxvY2F0b3JzLAorICAgIGtQYXJhbUluZGV4QmxvY2tQb29scywKKyAgICBrUGFyYW1JbmRleEJ1ZmZlclR5cGUsCisgICAga1BhcmFtSW5kZXhVc2FnZSwKKyAgICBrUGFyYW1JbmRleE91dE9mTWVtb3J5LAorICAgIGtQYXJhbUluZGV4TWF4QnVmZmVyU2l6ZSwKKworICAgIC8qIG1pc2MuIHN0YXRlICovCisgICAga1BhcmFtSW5kZXhUcmlwcGVkLAorICAgIGtQYXJhbUluZGV4Q29uZmlnQ291bnRlciwKKworICAgIC8qIHJlc291cmNlcyAqLworICAgIGtQYXJhbUluZGV4UmVzb3VyY2VzTmVlZGVkLAorICAgIGtQYXJhbUluZGV4UmVzb3VyY2VzUmVzZXJ2ZWQsCisgICAga1BhcmFtSW5kZXhPcGVyYXRpbmdSYXRlLAorICAgIGtQYXJhbUluZGV4UmVhbFRpbWVQcmlvcml0eSwKKworICAgIC8qIHByb3RlY3RlZCBjb250ZW50ICovCisgICAga1BhcmFtSW5kZXhTZWN1cmVNb2RlLAorCisgICAgLy8gZGVwcmVjYXRlZAorICAgIGtQYXJhbUluZGV4RGVsYXlSZXF1ZXN0ID0ga1BhcmFtSW5kZXhEZWxheSB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfUkVRVUVTVF9GTEFHLAorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICh0cmFucy9lbiljb2RlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICBrUGFyYW1JbmRleEJpdHJhdGUgPSBDMl9QQVJBTV9JTkRFWF9DT0RFUl9QQVJBTV9TVEFSVCwKKyAgICBrUGFyYW1JbmRleEJpdHJhdGVNb2RlLAorICAgIGtQYXJhbUluZGV4UXVhbGl0eSwKKyAgICBrUGFyYW1JbmRleENvbXBsZXhpdHksCisgICAga1BhcmFtSW5kZXhQcmVwZW5kSGVhZGVyTW9kZSwKKworICAgIC8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBpbWFnZS92aWRlbyBjb21wb25lbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisgICAga1BhcmFtSW5kZXhQaWN0dXJlU2l6ZSA9IEMyX1BBUkFNX0lOREVYX1BJQ1RVUkVfUEFSQU1fU1RBUlQsCisgICAga1BhcmFtSW5kZXhDcm9wUmVjdCwKKyAgICBrUGFyYW1JbmRleFBpeGVsRm9ybWF0LAorICAgIGtQYXJhbUluZGV4Um90YXRpb24sCisgICAga1BhcmFtSW5kZXhQaXhlbEFzcGVjdFJhdGlvLAorICAgIGtQYXJhbUluZGV4U2NhbGVkUGljdHVyZVNpemUsCisgICAga1BhcmFtSW5kZXhTY2FsZWRDcm9wUmVjdCwKKyAgICBrUGFyYW1JbmRleFNjYWxpbmdNZXRob2QsCisgICAga1BhcmFtSW5kZXhDb2xvckluZm8sCisgICAga1BhcmFtSW5kZXhDb2xvckFzcGVjdHMsCisgICAga1BhcmFtSW5kZXhIZHJTdGF0aWNNZXRhZGF0YSwKKyAgICBrUGFyYW1JbmRleERlZmF1bHRDb2xvckFzcGVjdHMsCisKKyAgICBrUGFyYW1JbmRleEJsb2NrU2l6ZSwKKyAgICBrUGFyYW1JbmRleEJsb2NrQ291bnQsCisgICAga1BhcmFtSW5kZXhCbG9ja1JhdGUsCisKKyAgICBrUGFyYW1JbmRleFBpY3R1cmVUeXBlTWFzaywKKyAgICBrUGFyYW1JbmRleFBpY3R1cmVUeXBlLAorICAgIGtQYXJhbUluZGV4SGRyMTBQbHVzTWV0YWRhdGEsCisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gdmlkZW8gY29tcG9uZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIGtQYXJhbUluZGV4RnJhbWVSYXRlID0gQzJfUEFSQU1fSU5ERVhfVklERU9fUEFSQU1fU1RBUlQsCisgICAga1BhcmFtSW5kZXhNYXhCaXRyYXRlLAorICAgIGtQYXJhbUluZGV4TWF4RnJhbWVSYXRlLAorICAgIGtQYXJhbUluZGV4TWF4UGljdHVyZVNpemUsCisgICAga1BhcmFtSW5kZXhHb3AsCisgICAga1BhcmFtSW5kZXhTeW5jRnJhbWVJbnRlcnZhbCwKKyAgICBrUGFyYW1JbmRleFJlcXVlc3RTeW5jRnJhbWUsCisgICAga1BhcmFtSW5kZXhUZW1wb3JhbExheWVyaW5nLAorICAgIGtQYXJhbUluZGV4TGF5ZXJJbmRleCwKKyAgICBrUGFyYW1JbmRleExheWVyQ291bnQsCisgICAga1BhcmFtSW5kZXhJbnRyYVJlZnJlc2gsCisKKyAgICAvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaW1hZ2UgY29tcG9uZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworICAgIGtQYXJhbUluZGV4VGlsZUxheW91dCA9IEMyX1BBUkFNX0lOREVYX0lNQUdFX1BBUkFNX1NUQVJULAorICAgIGtQYXJhbUluZGV4VGlsZUhhbmRsaW5nLAorCisgICAgLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGF1ZGlvIGNvbXBvbmVudHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyAgICBrUGFyYW1JbmRleFNhbXBsZVJhdGUgPSBDMl9QQVJBTV9JTkRFWF9BVURJT19QQVJBTV9TVEFSVCwKKyAgICBrUGFyYW1JbmRleENoYW5uZWxDb3VudCwKKyAgICBrUGFyYW1JbmRleFBjbUVuY29kaW5nLAorICAgIGtQYXJhbUluZGV4QWFjUGFja2FnaW5nLAorICAgIGtQYXJhbUluZGV4TWF4Q2hhbm5lbENvdW50LAorICAgIGtQYXJhbUluZGV4QWFjU2JyTW9kZSwgLy8gYWFjIGVuY29kZSwgZW51bQorICAgIGtQYXJhbUluZGV4RHJjRW5jb2RlZFRhcmdldExldmVsLCAgLy8gZHJjLCBmbG9hdCAoZEJGUykKKyAgICBrUGFyYW1JbmRleERyY1RhcmdldFJlZmVyZW5jZUxldmVsLCAvLyBkcmMsIGZsb2F0IChkQkZTKQorICAgIGtQYXJhbUluZGV4RHJjQ29tcHJlc3Npb24sIC8vIGRyYywgZW51bQorICAgIGtQYXJhbUluZGV4RHJjQm9vc3RGYWN0b3IsIC8vIGRyYywgZmxvYXQgKDAtMSkKKyAgICBrUGFyYW1JbmRleERyY0F0dGVudWF0aW9uRmFjdG9yLCAvLyBkcmMsIGZsb2F0ICgwLTEpCisgICAga1BhcmFtSW5kZXhEcmNFZmZlY3RUeXBlLCAvLyBkcmMsIGVudW0KKworICAgIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBwbGF0Zm9ybS1kZWZpbmVkIHBhcmFtZXRlcnMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKyAgICBrUGFyYW1JbmRleFBsYXRmb3JtTGV2ZWwgPSBDMl9QQVJBTV9JTkRFWF9QTEFURk9STV9TVEFSVCwgLy8gYWxsLCB1MzIKKyAgICBrUGFyYW1JbmRleFBsYXRmb3JtRmVhdHVyZXMsIC8vIGFsbCwgdTY0IG1hc2sKKyAgICBrUGFyYW1JbmRleFN0b3JlSW9uVXNhZ2UsIC8vIHN0b3JlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleEFzcGVjdHNUb0RhdGFTcGFjZSwgLy8gc3RvcmUsIHN0cnVjdAorICAgIGtQYXJhbUluZGV4RmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3IsIC8vIHN0b3JlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleEZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9ycywgLy8gc3RvcmUsIHN0cnVjdFtdCisgICAga1BhcmFtSW5kZXhEYXRhU3BhY2VUb0FzcGVjdHMsIC8vIHN0b3JlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleERhdGFTcGFjZSwgLy8gdTMyCisgICAga1BhcmFtSW5kZXhTdXJmYWNlU2NhbGluZywgLy8gdTMyCisKKyAgICAvLyBpbnB1dCBzdXJmYWNlCisgICAga1BhcmFtSW5kZXhJbnB1dFN1cmZhY2VFb3MsIC8vIGlucHV0LXN1cmZhY2UsIGVvcworICAgIGtQYXJhbUluZGV4VGltZWRDb250cm9sLCAvLyBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleFN0YXJ0QXQsIC8vIGlucHV0LXN1cmZhY2UsIHN0cnVjdAorICAgIGtQYXJhbUluZGV4U3VzcGVuZEF0LCAvLyBpbnB1dC1zdXJmYWNlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleFJlc3VtZUF0LCAvLyBpbnB1dC1zdXJmYWNlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleFN0b3BBdCwgLy8gaW5wdXQtc3VyZmFjZSwgc3RydWN0CisgICAga1BhcmFtSW5kZXhUaW1lT2Zmc2V0LCAvLyBpbnB1dC1zdXJmYWNlLCBzdHJ1Y3QKKyAgICBrUGFyYW1JbmRleE1pbkZyYW1lUmF0ZSwgLy8gaW5wdXQtc3VyZmFjZSwgZmxvYXQKKyAgICBrUGFyYW1JbmRleFRpbWVzdGFtcEdhcEFkanVzdG1lbnQsIC8vIGlucHV0LXN1cmZhY2UsIHN0cnVjdAorCisgICAga1BhcmFtSW5kZXhTdXJmYWNlQWxsb2NhdG9yLCAvLyB1MzIKK307CisKK30KKworLyoqCisgKiBDb2RlYyAyLjAgcGFyYW1ldGVyIHR5cGVzIGZvbGxvdyB0aGUgZm9sbG93aW5nIG5hbWluZyBjb252ZW50aW9uOgorICoKKyAqIEMyPGdyb3VwPjxkb21haW4+PGluZGV4Pjx0eXBlPgorICoKKyAqIEUuZy4gQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86IGdyb3VwPSIiIGRvbWFpbj0iU3RyZWFtIiBpbmRleD0iUGljdHVyZVNpemUiIHR5cGU9IkluZm8iLgorICogR3JvdXAgaXMgc29tZXdoYXQgYXJiaXRyYXJ5LCBidXQgZGVub3RlcyBraW5kIG9mIG9iamVjdHMgdGhlIHBhcmFtZXRlciBpcyBkZWZpbmVkLgorICogQXQgdGhpcyBwb2ludCB3ZSB1c2UgQ29tcG9uZW50IGFuZCBTdG9yZSB0byBkaXN0aW5ndWlzaCBiYXNpYyBjb21wb25lbnQvc3RvcmUgcGFyYW1ldGVycy4KKyAqCisgKiBQYXJhbWV0ZXIga2V5cyBhcmUgbmFtZWQgQzJfUEFSQU1LRVlfWzxncm91cD5fXTxkb21haW4+XzxpbmRleD4gYXMgdHlwZSBpcyBub3QgZXhwZWN0ZWQKKyAqIHRvIGRpc3Rpbmd1aXNoIHBhcmFtZXRlcnMuIEUuZy4gYSBjb21wb25lbnQgY291bGQgY2hhbmdlIHRoZSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgYW5kIGl0CisgKiBpcyBub3QgZXhwZWN0ZWQgdXNlcnMgd291bGQgbmVlZCB0byBjaGFuZ2UgdGhlIGtleS4KKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBUEkgbGV2ZWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworZW51bSBDMkNvbmZpZzo6YXBpX2xldmVsX3QgOiB1aW50MzJfdCB7CisgICAgQVBJX0wwXzEgPSAwLCAgIC8vLzwgc3VwcG9ydCBmb3IgQVBJIGxldmVsIDAuMQorfTsKKworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjphcGlfbGV2ZWxfdD4sIGtQYXJhbUluZGV4QXBpTGV2ZWw+CisgICAgICAgIEMyQXBpTGV2ZWxTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQVBJX0xFVkVMW10gPSAiYXBpLmxldmVsIjsKKworZW51bSBDMkNvbmZpZzo6YXBpX2ZlYXR1cmVfdCA6IHVpbnQ2NF90IHsKKyAgICBBUElfUkVGTEVDVElPTiAgICAgICA9ICgxVSA8PCAwKSwgIC8vLzwgYWJpbGl0eSB0byBsaXN0IHN1cHBvcnRlZCBwYXJhbWV0ZXJzCisgICAgQVBJX1ZBTFVFUyAgICAgICAgICAgPSAoMVUgPDwgMSksICAvLy88IGFiaWxpdHkgdG8gbGlzdCBzdXBwb3J0ZWQgdmFsdWVzIGZvciBlYWNoIHBhcmFtZXRlcgorICAgIEFQSV9DVVJSRU5UX1ZBTFVFUyAgID0gKDFVIDw8IDIpLCAgLy8vPCBhYmlsaXR5IHRvIGxpc3QgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGVhY2ggcGFyYW1ldGVyCisgICAgQVBJX0RFUEVOREVOQ1kgICAgICAgPSAoMVUgPDwgMyksICAvLy88IGhhdmUgYSBkZWZpbmVkIHBhcmFtZXRlciBkZXBlbmRlbmN5CisKKyAgICBBUElfU1RSRUFNUyAgICAgICAgICA9ICgxVUxMIDw8IDMyKSwgIC8vLzwgc3VwcG9ydGluZyB2YXJpYWJsZSBudW1iZXIgb2Ygc3RyZWFtcworCisgICAgQVBJX1RVTk5FTElORyAgICAgICAgPSAoMVVMTCA8PCA0OCksICAvLy88IHR1bm5lbGluZyBBUEkKK307CisKKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6YXBpX2ZlYXR1cmVfdD4sIGtQYXJhbUluZGV4QXBpRmVhdHVyZXM+CisgICAgICAgIEMyQXBpRmVhdHVyZXNTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQVBJX0ZFQVRVUkVTW10gPSAiYXBpLmZlYXR1cmVzIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2VuZXJpYyBjb21wb25lbnQgY2hhcmFjdGVyaXN0aWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudC4KKyAqCisgKiBUaGlzIG11c3QgY29udGFpbiBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIG9yIGRvdCAnLicsIGh5cGhlbiAnLScsIHBsdXMgJysnLCBvcgorICogdW5kZXJsaW5lICdfJy4gVGhlIG5hbWUgb2YgZWFjaCBjb21wb25lbnQgbXVzdCBiZSB1bmlxdWUuCisgKgorICogRm9yIEFuZHJvaWQ6IENvbXBvbmVudCBuYW1lcyBtdXN0IHN0YXJ0IHdpdGggJ2MyLicgZm9sbG93ZWQgYnkgdGhlIGNvbXBhbnkgbmFtZSBvciBhYmJyZXZpYXRpb24KKyAqIGFuZCBhbm90aGVyIGRvdCwgZS5nLiAnYzIuYW5kcm9pZC4nLiBVc2Ugb2YgbG93ZXJjYXNlIGlzIHByZWZlcnJlZCBidXQgbm90IHJlcXVpcmVkLgorICovCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4TmFtZT4gQzJDb21wb25lbnROYW1lU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9OQU1FW10gID0gImNvbXBvbmVudC5uYW1lIjsKKworLyoqCisgKiBBbHRlcm5hdGUgbmFtZXMgKGFsaWFzZXMpIG9mIHRoZSBjb21wb25lbnQuCisgKgorICogVGhpcyBpcyBhIGNvbW1hICcsJyBzZXBhcmF0ZWQgbGlzdCBvZiBhbHRlcm5hdGUgY29tcG9uZW50IG5hbWVzLiBVbmxpa2UgY29tcG9uZW50IG5hbWVzIHRoYXQKKyAqIG11c3QgYmUgdW5pcXVlLCBtdWx0aXBsZSBjb21wb25lbnRzIGNhbiBoYXZlIHRoZSBzYW1lIGFsaWFzLgorICovCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4QWxpYXNlcz4gQzJDb21wb25lbnRBbGlhc2VzU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPTVBPTkVOVF9BTElBU0VTW10gID0gImNvbXBvbmVudC5hbGlhc2VzIjsKKworLyoqCisgKiBDb21wb25lbnQga2luZC4KKyAqLworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29tcG9uZW50OjpraW5kX3Q+LCBrUGFyYW1JbmRleEtpbmQ+CisgICAgICAgIEMyQ29tcG9uZW50S2luZFNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT01QT05FTlRfS0lORFtdICA9ICJjb21wb25lbnQua2luZCI7CisKKy8qKgorICogQ29tcG9uZW50IGRvbWFpbi4KKyAqLworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29tcG9uZW50Ojpkb21haW5fdD4sIGtQYXJhbUluZGV4RG9tYWluPgorICAgICAgICBDMkNvbXBvbmVudERvbWFpblNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT01QT05FTlRfRE9NQUlOW10gID0gImNvbXBvbmVudC5kb21haW4iOworCisvKioKKyAqIENvbXBvbmVudCBhdHRyaWJ1dGVzLgorICoKKyAqIFRoZXNlIGFyZSBhIHNldCBvZiBmbGFncyBwcm92aWRlZCBieSB0aGUgY29tcG9uZW50IGNoYXJhY3Rlcml6aW5nIGl0cyBwcm9jZXNzaW5nIGFsZ29yaXRobS4KKyAqLworQzJFTlVNKEMyQ29tcG9uZW50OjphdHRyaWJfdCwgdWludDY0X3QsCisgICAgQVRUUklCX0lTX1RFTVBPUkFMID0gMXUgPDwgMCwgLy8vPCBjb21wb25lbnQgaW5wdXQgb3JkZXJpbmcgbWF0dGVycyBmb3IgcHJvY2Vzc2luZworKQorCisvLyByZWFkLW9ubHkKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb21wb25lbnQ6OmF0dHJpYl90Piwga1BhcmFtSW5kZXhBdHRyaWJ1dGVzPgorICAgICAgICBDMkNvbXBvbmVudEF0dHJpYnV0ZXNTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09NUE9ORU5UX0FUVFJJQlVURVNbXSA9ICJjb21wb25lbnQuYXR0cmlidXRlcyI7CisKKy8qKgorICogVGltZSBzdHJldGNoaW5nLgorICoKKyAqIFRoaXMgaXMgdGhlIHJhdGlvIGJldHdlZW4gdGhlIHJhdGUgb2YgdGhlIGlucHV0IHRpbWVzdGFtcCwgYW5kIHRoZSByYXRlIG9mIHRoZSBvdXRwdXQgdGltZXN0YW1wLgorICogRS5nLiBpZiB0aGlzIGlzIDQuMCwgZm9yIGV2ZXJ5IDEgc2Vjb25kcyBvZiBpbnB1dCB0aW1lc3RhbXAgZGlmZmVyZW5jZSwgdGhlIG91dHB1dCBzaGFsbCBkaWZmZXIKKyAqIGJ5IDQgc2Vjb25kcy4KKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4VGltZVN0cmV0Y2g+IEMyQ29tcG9uZW50VGltZVN0cmV0Y2hUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9USU1FX1NUUkVUQ0hbXSAgPSAiYWxnby50aW1lLXN0cmV0Y2giOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb2RpbmcgY2hhcmFjdGVyaXN0aWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogUHJvZmlsZSBhbmQgbGV2ZWwuCisgKgorICogUHJvZmlsZSBkZXRlcm1pbmVzIHRoZSB0b29scyB1c2VkIGJ5IHRoZSBjb21wb25lbnQuCisgKiBMZXZlbCBkZXRlcm1pbmVzIHRoZSBsZXZlbCBvZiByZXNvdXJjZXMgdXNlZCBieSB0aGUgY29tcG9uZW50LgorICovCisKK25hbWVzcGFjZSB7CisKK2VudW0gOiB1aW50MzJfdCB7CisgICAgX0MyX1BMX01QMlZfQkFTRSA9IDB4MTAwMCwKKyAgICBfQzJfUExfQUFDX0JBU0UgID0gMHgyMDAwLAorICAgIF9DMl9QTF9IMjYzX0JBU0UgPSAweDMwMDAsCisgICAgX0MyX1BMX01QNFZfQkFTRSA9IDB4NDAwMCwKKyAgICBfQzJfUExfQVZDX0JBU0UgID0gMHg1MDAwLAorICAgIF9DMl9QTF9IRVZDX0JBU0UgPSAweDYwMDAsCisgICAgX0MyX1BMX1ZQOV9CQVNFICA9IDB4NzAwMCwKKyAgICBfQzJfUExfRFZfQkFTRSAgID0gMHg4MDAwLAorICAgIF9DMl9QTF9BVjFfQkFTRSAgPSAweDkwMDAsCisKKyAgICBDMl9QUk9GSUxFX0xFVkVMX1ZFTkRPUl9TVEFSVCA9IDB4NzAwMDAwMDAsCit9OworCit9CisKK2VudW0gQzJDb25maWc6OnByb2ZpbGVfdCA6IHVpbnQzMl90IHsKKyAgICBQUk9GSUxFX1VOVVNFRCA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgcHJvZmlsZSBpcyBub3QgdXNlZCBieSB0aGlzIG1lZGlhIHR5cGUKKworICAgIC8vIEFBQyAoTVBFRy0yIFBhcnQgNyBhbmQgTVBFRy00IFBhcnQgMykgcHJvZmlsZXMKKyAgICBQUk9GSUxFX0FBQ19MQyA9IF9DMl9QTF9BQUNfQkFTRSwgICAgICAgICAgIC8vLzwgQUFDIExvdy1Db21wbGV4aXR5CisgICAgUFJPRklMRV9BQUNfTUFJTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBNYWluCisgICAgUFJPRklMRV9BQUNfU1NSLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBTY2FsYWJsZSBTYW1wbGluZyBSYXRlCisgICAgUFJPRklMRV9BQUNfTFRQLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBMb25nIFRlcm0gUHJlZGljdGlvbgorICAgIFBST0ZJTEVfQUFDX0hFLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgSGlnaC1FZmZpY2llbmN5CisgICAgUFJPRklMRV9BQUNfU0NBTEFCTEUsICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBTY2FsYWJsZQorICAgIFBST0ZJTEVfQUFDX0VSX0xDLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgRXJyb3IgUmVzaWxpZW50IExvdy1Db21wbGV4aXR5CisgICAgUFJPRklMRV9BQUNfRVJfU0NBTEFCTEUsICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBFcnJvciBSZXNpbGllbnQgU2NhbGFibGUKKyAgICBQUk9GSUxFX0FBQ19MRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIExvdyBEZWxheQorICAgIFBST0ZJTEVfQUFDX0hFX1BTLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBQUMgSGlnaC1FZmZpY2llbmN5IFBhcmFtZXRyaWMgU3RlcmVvCisgICAgUFJPRklMRV9BQUNfRUxELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFBQyBFbmhhbmNlZCBMb3cgRGVsYXkKKyAgICBQUk9GSUxFX0FBQ19YSEUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQUFDIEV4dGVuZGVkIEhpZ2gtRWZmaWNpZW5jeQorCisgICAgLy8gTVBFRy0yIFZpZGVvIHByb2ZpbGVzCisgICAgUFJPRklMRV9NUDJWX1NJTVBMRSA9IF9DMl9QTF9NUDJWX0JBU0UsICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIFNpbXBsZQorICAgIFBST0ZJTEVfTVAyVl9NQUlOLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBNYWluCisgICAgUFJPRklMRV9NUDJWX1NOUl9TQ0FMQUJMRSwgICAgICAgICAgICAgICAgICAvLy88IE1QRUctMiBWaWRlbyAoSC4yNjIpIFNOUiBTY2FsYWJsZQorICAgIFBST0ZJTEVfTVAyVl9TUEFUSUFMTFlfU0NBTEFCTEUsICAgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBTcGF0aWFsbHkgU2NhbGFibGUKKyAgICBQUk9GSUxFX01QMlZfSElHSCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgSGlnaAorICAgIFBST0ZJTEVfTVAyVl80MjIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSA0OjI6MgorICAgIFBST0ZJTEVfTVAyVl9NVUxUSVZJRVcsICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBNdWx0aS12aWV3CisKKyAgICAvLyBILjI2MyBwcm9maWxlcworICAgIFBST0ZJTEVfSDI2M19CQVNFTElORSA9IF9DMl9QTF9IMjYzX0JBU0UsICAgLy8vPCBILjI2MyBCYXNlbGluZSAoUHJvZmlsZSAwKQorICAgIFBST0ZJTEVfSDI2M19IMzIwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBILjMyMCBDb2RpbmcgRWZmaWNpZW5jeSBWZXJzaW9uIDIgQmFja3dhcmQtQ29tcGF0aWJpbGl0eSAoUHJvZmlsZSAxKQorICAgIFBST0ZJTEVfSDI2M19WMUJDLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBWZXJzaW9uIDEgQmFja3dhcmQtQ29tcGF0aWJpbGl0eSAoUHJvZmlsZSAyKQorICAgIFBST0ZJTEVfSDI2M19JU1dWMiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBWZXJzaW9uIDIgSW50ZXJhY3RpdmUgYW5kIFN0cmVhbWluZyBXaXJlbGVzcyAoUHJvZmlsZSAzKQorICAgIFBST0ZJTEVfSDI2M19JU1dWMywgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBWZXJzaW9uIDMgSW50ZXJhY3RpdmUgYW5kIFN0cmVhbWluZyBXaXJlbGVzcyAoUHJvZmlsZSA0KQorICAgIFBST0ZJTEVfSDI2M19ISUdIX0NPTVBSRVNTSU9OLCAgICAgICAgICAgICAgLy8vPCBILjI2MyBDb252ZXJzYXRpb25hbCBIaWdoIENvbXByZXNzaW9uIChQcm9maWxlIDUpCisgICAgUFJPRklMRV9IMjYzX0lOVEVSTkVULCAgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIENvbnZlcnNhdGlvbmFsIEludGVybmV0IChQcm9maWxlIDYpCisgICAgUFJPRklMRV9IMjYzX0lOVEVSTEFDRSwgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIENvbnZlcnNhdGlvbmFsIEludGVybGFjZSAoUHJvZmlsZSA3KQorICAgIFBST0ZJTEVfSDI2M19ISUdIX0xBVEVOQ1ksICAgICAgICAgICAgICAgICAgLy8vPCBILjI2MyBIaWdoIExhdGVuY3kgKFByb2ZpbGUgOCkKKworICAgIC8vIE1QRUctNCBQYXJ0IDIgKFZpZGVvKSBOYXR1cmFsIFZpc3VhbCBQcm9maWxlcworICAgIFBST0ZJTEVfTVA0Vl9TSU1QTEUsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gU2ltcGxlCisgICAgUFJPRklMRV9NUDRWX1NJTVBMRV9TQ0FMQUJMRSwgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBTaW1wbGUgU2NhbGFibGUKKyAgICBQUk9GSUxFX01QNFZfQ09SRSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIENvcmUKKyAgICBQUk9GSUxFX01QNFZfTUFJTiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIE1haW4KKyAgICBQUk9GSUxFX01QNFZfTkJJVCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIE4tQml0CisgICAgUFJPRklMRV9NUDRWX0FSVFMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBBZHZhbmNlZCBSZWFsdGltZSBTaW1wbGUKKyAgICBQUk9GSUxFX01QNFZfQ09SRV9TQ0FMQUJMRSwgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIENvcmUgU2NhbGFibGUKKyAgICBQUk9GSUxFX01QNFZfQUNFLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIEFkdmFuY2VkIENvZGluZyBFZmZpY2llbmN5CisgICAgUFJPRklMRV9NUDRWX0FEVkFOQ0VEX0NPUkUsICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBBZHZhbmNlZCBDb3JlCisgICAgUFJPRklMRV9NUDRWX1NJTVBMRV9TVFVESU8sICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBTaW1wbGUgU3R1ZGlvCisgICAgUFJPRklMRV9NUDRWX0NPUkVfU1RVRElPLCAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBDb3JlIFN0dWRpbworICAgIFBST0ZJTEVfTVA0Vl9BRFZBTkNFRF9TSU1QTEUsICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gQWR2YW5jZWQgU2ltcGxlCisgICAgUFJPRklMRV9NUDRWX0ZHUywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBGaW5lIEdyYW51bGFyaXR5IFNjYWxhYmxlCisKKyAgICAvLyBBVkMgLyBNUEVHLTQgUGFydCAxMCAoSC4yNjQpIHByb2ZpbGVzCisgICAgUFJPRklMRV9BVkNfQkFTRUxJTkUgPSBfQzJfUExfQVZDX0JBU0UsICAgICAvLy88IEFWQyAoSC4yNjQpIEJhc2VsaW5lCisgICAgUFJPRklMRV9BVkNfQ09OU1RSQUlORURfQkFTRUxJTkUsICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIENvbnN0cmFpbmVkIEJhc2VsaW5lCisgICAgUFJPRklMRV9BVkNfTUFJTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIE1haW4KKyAgICBQUk9GSUxFX0FWQ19FWFRFTkRFRCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgRXh0ZW5kZWQKKyAgICBQUk9GSUxFX0FWQ19ISUdILCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgSGlnaAorICAgIFBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0gsICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBQcm9ncmVzc2l2ZSBIaWdoCisgICAgUFJPRklMRV9BVkNfQ09OU1RSQUlORURfSElHSCwgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIENvbnN0cmFpbmVkIEhpZ2gKKyAgICBQUk9GSUxFX0FWQ19ISUdIXzEwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgSGlnaCAxMAorICAgIFBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0hfMTAsICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBQcm9ncmVzc2l2ZSBIaWdoIDEwCisgICAgUFJPRklMRV9BVkNfSElHSF80MjIsICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2ggNDoyOjIKKyAgICBQUk9GSUxFX0FWQ19ISUdIXzQ0NF9QUkVESUNUSVZFLCAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgSGlnaCA0OjQ6NCBQcmVkaWN0aXZlCisgICAgUFJPRklMRV9BVkNfSElHSF8xMF9JTlRSQSwgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIEhpZ2ggMTAgSW50cmEKKyAgICBQUk9GSUxFX0FWQ19ISUdIXzQyMl9JTlRSQSwgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgSGlnaCA0OjI6MiBJbnRyYQorICAgIFBST0ZJTEVfQVZDX0hJR0hfNDQ0X0lOVFJBLCAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBIaWdoIDQ6NDo0IEludHJhCisgICAgUFJPRklMRV9BVkNfQ0FWTENfNDQ0X0lOVFJBLCAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIENBVkxDIDQ6NDo0IEludHJhCisgICAgUFJPRklMRV9BVkNfU0NBTEFCTEVfQkFTRUxJTkUgPSBfQzJfUExfQVZDX0JBU0UgKyAweDEwMCwgIC8vLzwgQVZDIChILjI2NCkgU2NhbGFibGUgQmFzZWxpbmUKKyAgICBQUk9GSUxFX0FWQ19TQ0FMQUJMRV9DT05TVFJBSU5FRF9CQVNFTElORSwgIC8vLzwgQVZDIChILjI2NCkgU2NhbGFibGUgQ29uc3RyYWluZWQgQmFzZWxpbmUKKyAgICBQUk9GSUxFX0FWQ19TQ0FMQUJMRV9ISUdILCAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgU2NhbGFibGUgSGlnaAorICAgIFBST0ZJTEVfQVZDX1NDQUxBQkxFX0NPTlNUUkFJTkVEX0hJR0gsICAgICAgLy8vPCBBVkMgKEguMjY0KSBTY2FsYWJsZSBDb25zdHJhaW5lZCBIaWdoCisgICAgUFJPRklMRV9BVkNfU0NBTEFCTEVfSElHSF9JTlRSQSwgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIFNjYWxhYmxlIEhpZ2ggSW50cmEKKyAgICBQUk9GSUxFX0FWQ19NVUxUSVZJRVdfSElHSCA9IF9DMl9QTF9BVkNfQkFTRSArIDB4MjAwLCAgLy8vPCBBVkMgKEguMjY0KSBNdWx0aXZpZXcgSGlnaAorICAgIFBST0ZJTEVfQVZDX1NURVJFT19ISUdILCAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBTdGVyZW8gSGlnaAorICAgIFBST0ZJTEVfQVZDX01GQ19ISUdILCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBNRkMgSGlnaAorICAgIFBST0ZJTEVfQVZDX01VTFRJVklFV19ERVBUSF9ISUdIID0gX0MyX1BMX0FWQ19CQVNFICsgMHgzMDAsICAvLy88IEFWQyAoSC4yNjQpIE11bHRpdmlldyBEZXB0aCBIaWdoCisgICAgUFJPRklMRV9BVkNfTUZDX0RFUFRIX0hJR0gsICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIE1GQyBEZXB0aCBIaWdoCisgICAgUFJPRklMRV9BVkNfRU5IQU5DRURfTVVMVElWSUVXX0RFUFRIX0hJR0ggPSBfQzJfUExfQVZDX0JBU0UgKyAweDQwMCwgIC8vLzwgQVZDIChILjI2NCkgRW5oYW5jZWQgTXVsdGl2aWV3IERlcHRoIEhpZ2gKKworICAgIC8vIEhFVkMgcHJvZmlsZXMKKyAgICBQUk9GSUxFX0hFVkNfTUFJTiA9IF9DMl9QTF9IRVZDX0JBU0UsICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4KKyAgICBQUk9GSUxFX0hFVkNfTUFJTl8xMCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gMTAKKyAgICBQUk9GSUxFX0hFVkNfTUFJTl9TVElMTCwgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gU3RpbGwgUGljdHVyZQorICAgIFBST0ZJTEVfSEVWQ19NT05PID0gX0MyX1BMX0hFVkNfQkFTRSArIDB4MTAwLCAgLy8vPCBIRVZDIChILjI2NSkgTW9ub2Nocm9tZQorICAgIFBST0ZJTEVfSEVWQ19NT05PXzEyLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTW9ub2Nocm9tZSAxMgorICAgIFBST0ZJTEVfSEVWQ19NT05PXzE2LCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTW9ub2Nocm9tZSAxNgorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzEyLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiAxMgorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQyMl8xMCwgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjI6MiAxMAorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQyMl8xMiwgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjI6MiAxMgorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQ0NCwgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjQ6NAorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xMCwgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjQ6NCAxMAorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xMiwgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjQ6NCAxMgorICAgIFBST0ZJTEVfSEVWQ19NQUlOX0lOVFJBLCAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBJbnRyYQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzEwX0lOVFJBLCAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiAxMCBJbnRyYQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzEyX0lOVFJBLCAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiAxMiBJbnRyYQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQyMl8xMF9JTlRSQSwgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjI6MiAxMCBJbnRyYQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQyMl8xMl9JTlRSQSwgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjI6MiAxMiBJbnRyYQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQ0NF9JTlRSQSwgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjQ6NCBJbnRyYQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xMF9JTlRSQSwgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjQ6NCAxMCBJbnRyYQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xMl9JTlRSQSwgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjQ6NCAxMiBJbnRyYQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQ0NF8xNl9JTlRSQSwgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjQ6NCAxNiBJbnRyYQorICAgIFBST0ZJTEVfSEVWQ19NQUlOXzQ0NF9TVElMTCwgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiA0OjQ6NCBTdGlsbCBQaWN0dXJlCisgICAgUFJPRklMRV9IRVZDX01BSU5fNDQ0XzE2X1NUSUxMLCAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIDQ6NDo0IDE2IFN0aWxsIFBpY3R1cmUKKyAgICBQUk9GSUxFX0hFVkNfSElHSF80NDQgPSBfQzJfUExfSEVWQ19CQVNFICsgMHgyMDAsICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRocm91Z2hwdXQgNDo0OjQKKyAgICBQUk9GSUxFX0hFVkNfSElHSF80NDRfMTAsICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGhyb3VnaHB1dCA0OjQ6NCAxMAorICAgIFBST0ZJTEVfSEVWQ19ISUdIXzQ0NF8xNCwgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaHJvdWdocHV0IDQ6NDo0IDE0CisgICAgUFJPRklMRV9IRVZDX0hJR0hfNDQ0XzE2X0lOVFJBLCAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRocm91Z2hwdXQgNDo0OjQgMTYgSW50cmEKKyAgICBQUk9GSUxFX0hFVkNfU1hfTUFJTiA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDMwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIFNjcmVlbi1FeHRlbmRlZCBNYWluCisgICAgUFJPRklMRV9IRVZDX1NYX01BSU5fMTAsICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY3JlZW4tRXh0ZW5kZWQgTWFpbiAxMAorICAgIFBST0ZJTEVfSEVWQ19TWF9NQUlOXzQ0NCwgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgU2NyZWVuLUV4dGVuZGVkIE1haW4gNDo0OjQKKyAgICBQUk9GSUxFX0hFVkNfU1hfTUFJTl80NDRfMTAsICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIFNjcmVlbi1FeHRlbmRlZCBNYWluIDQ6NDo0IDEwCisgICAgUFJPRklMRV9IRVZDX1NYX0hJR0hfNDQ0LCAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY3JlZW4tRXh0ZW5kZWQgSGlnaCBUaHJvdWdocHV0IDQ6NDo0CisgICAgUFJPRklMRV9IRVZDX1NYX0hJR0hfNDQ0XzEwLCAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY3JlZW4tRXh0ZW5kZWQgSGlnaCBUaHJvdWdocHV0IDQ6NDo0IDEwCisgICAgUFJPRklMRV9IRVZDX1NYX0hJR0hfNDQ0XzE0LCAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBTY3JlZW4tRXh0ZW5kZWQgSGlnaCBUaHJvdWdocHV0IDQ6NDo0IDE0CisgICAgUFJPRklMRV9IRVZDX01VTFRJVklFV19NQUlOID0gX0MyX1BMX0hFVkNfQkFTRSArIDB4NDAwLCAgLy8vPCBIRVZDIChILjI2NSkgTXVsdGl2aWV3IE1haW4KKyAgICBQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTUFJTiA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDUwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIFNjYWxhYmxlIE1haW4KKyAgICBQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTUFJTl8xMCwgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIFNjYWxhYmxlIE1haW4gMTAKKyAgICBQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTU9OTyA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDYwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIFNjYWxhYmxlIE1vbm9jaHJvbWUKKyAgICBQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTU9OT18xMiwgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIFNjYWxhYmxlIE1vbm9jaHJvbWUgMTIKKyAgICBQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTU9OT18xNiwgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIFNjYWxhYmxlIE1vbm9jaHJvbWUgMTYKKyAgICBQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTUFJTl80NDQsICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIFNjYWxhYmxlIE1haW4gNDo0OjQKKyAgICBQUk9GSUxFX0hFVkNfM0RfTUFJTiA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDcwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIDNEIE1haW4KKworICAgIC8vIFZQOSBwcm9maWxlcworICAgIFBST0ZJTEVfVlA5XzAgPSBfQzJfUExfVlA5X0JBU0UsICAgICAgICAgICAgLy8vPCBWUDkgUHJvZmlsZSAwICg0OjI6MCkKKyAgICBQUk9GSUxFX1ZQOV8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IFByb2ZpbGUgMSAoNDoyOjIgb3IgNDo0OjQpCisgICAgUFJPRklMRV9WUDlfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBQcm9maWxlIDIgKDQ6MjowLCAxMCBvciAxMiBiaXQpCisgICAgUFJPRklMRV9WUDlfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBQcm9maWxlIDMgKDQ6MjoyIG9yIDQ6NDo0LCAxMCBvciAxMiBiaXQpCisKKyAgICAvLyBEb2xieSBWaXNpb24gcHJvZmlsZXMKKyAgICBQUk9GSUxFX0RWX0FWX1BFUiA9IF9DMl9QTF9EVl9CQVNFICsgMCwgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2YXYucGVyIHByb2ZpbGUgKGRlcHJlY2F0ZWQpCisgICAgUFJPRklMRV9EVl9BVl9QRU4sICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmF2LnBlbiBwcm9maWxlIChkZXByZWNhdGVkKQorICAgIFBST0ZJTEVfRFZfSEVfREVSLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZoZS5kZXIgcHJvZmlsZSAoZGVwcmVjYXRlZCkKKyAgICBQUk9GSUxFX0RWX0hFX0RFTiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuZGVuIHByb2ZpbGUgKGRlcHJlY2F0ZWQpCisgICAgUFJPRklMRV9EVl9IRV8wNCA9IF9DMl9QTF9EVl9CQVNFICsgNCwgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmhlLjA0IHByb2ZpbGUKKyAgICBQUk9GSUxFX0RWX0hFXzA1ID0gX0MyX1BMX0RWX0JBU0UgKyA1LCAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuMDUgcHJvZmlsZQorICAgIFBST0ZJTEVfRFZfSEVfRFRILCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZoZS5kdGggcHJvZmlsZSAoZGVwcmVjYXRlZCkKKyAgICBQUk9GSUxFX0RWX0hFXzA3ID0gX0MyX1BMX0RWX0JBU0UgKyA3LCAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGR2aGUuMDcgcHJvZmlsZQorICAgIFBST0ZJTEVfRFZfSEVfMDggPSBfQzJfUExfRFZfQkFTRSArIDgsICAgICAgLy8vPCBEb2xieSBWaXNpb24gZHZoZS4wOCBwcm9maWxlCisgICAgUFJPRklMRV9EVl9BVl8wOSA9IF9DMl9QTF9EVl9CQVNFICsgOSwgICAgICAvLy88IERvbGJ5IFZpc2lvbiBkdmF2LjA5IHByb2ZpbGUKKworICAgIC8vIEFWMSBwcm9maWxlcworICAgIFBST0ZJTEVfQVYxXzAgPSBfQzJfUExfQVYxX0JBU0UsICAgICAgICAgICAgLy8vPCBBVjEgUHJvZmlsZSAwICg0OjI6MCwgOCB0byAxMCBiaXQpCisgICAgUFJPRklMRV9BVjFfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBQcm9maWxlIDEgKDggdG8gMTAgYml0KQorICAgIFBST0ZJTEVfQVYxXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgUHJvZmlsZSAyICg4IHRvIDEyIGJpdCkKK307CisKK2VudW0gQzJDb25maWc6OmxldmVsX3QgOiB1aW50MzJfdCB7CisgICAgTEVWRUxfVU5VU0VEID0gMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGxldmVsIGlzIG5vdCB1c2VkIGJ5IHRoaXMgbWVkaWEgdHlwZQorCisgICAgLy8gTVBFRy0yIFZpZGVvIGxldmVscworICAgIExFVkVMX01QMlZfTE9XID0gX0MyX1BMX01QMlZfQkFTRSwgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBMb3cgTGV2ZWwKKyAgICBMRVZFTF9NUDJWX01BSU4sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgTWFpbiBMZXZlbAorICAgIExFVkVMX01QMlZfSElHSF8xNDQwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBIaWdoIDE0NDAgTGV2ZWwKKyAgICBMRVZFTF9NUDJWX0hJR0gsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy0yIFZpZGVvIChILjI2MikgSGlnaCBMZXZlbAorICAgIExFVkVMX01QMlZfSElHSFAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTIgVmlkZW8gKEguMjYyKSBIaWdoUCBMZXZlbAorCisgICAgLy8gSC4yNjMgbGV2ZWxzCisgICAgTEVWRUxfSDI2M18xMCA9IF9DMl9QTF9IMjYzX0JBU0UsICAgICAgICAgICAvLy88IEguMjYzIExldmVsIDEwCisgICAgTEVWRUxfSDI2M18yMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIExldmVsIDIwCisgICAgTEVWRUxfSDI2M18zMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIExldmVsIDMwCisgICAgTEVWRUxfSDI2M180MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIExldmVsIDQwCisgICAgTEVWRUxfSDI2M180NSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIExldmVsIDQ1CisgICAgTEVWRUxfSDI2M181MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIExldmVsIDUwCisgICAgTEVWRUxfSDI2M182MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIExldmVsIDYwCisgICAgTEVWRUxfSDI2M183MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEguMjYzIExldmVsIDcwCisKKyAgICAvLyBNUEVHLTQgUGFydCAyIChWaWRlbykgbGV2ZWxzCisgICAgTEVWRUxfTVA0Vl8wID0gX0MyX1BMX01QNFZfQkFTRSwgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCAwCisgICAgTEVWRUxfTVA0Vl8wQiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCAwYgorICAgIExFVkVMX01QNFZfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgMQorICAgIExFVkVMX01QNFZfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgMgorICAgIExFVkVMX01QNFZfMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgMworICAgIExFVkVMX01QNFZfM0IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNUEVHLTQgVmlkZW8gTGV2ZWwgM2IKKyAgICBMRVZFTF9NUDRWXzQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDQKKyAgICBMRVZFTF9NUDRWXzRBLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTVBFRy00IFZpZGVvIExldmVsIDRhCisgICAgTEVWRUxfTVA0Vl81LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCA1CisgICAgTEVWRUxfTVA0Vl82LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IE1QRUctNCBWaWRlbyBMZXZlbCA2CisKKyAgICAvLyBBVkMgLyBNUEVHLTQgUGFydCAxMCAoSC4yNjQpIGxldmVscworICAgIExFVkVMX0FWQ18xID0gX0MyX1BMX0FWQ19CQVNFLCAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAxCisgICAgTEVWRUxfQVZDXzFCLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDFiCisgICAgTEVWRUxfQVZDXzFfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDEuMQorICAgIExFVkVMX0FWQ18xXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAxLjIKKyAgICBMRVZFTF9BVkNfMV8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMS4zCisgICAgTEVWRUxfQVZDXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDIKKyAgICBMRVZFTF9BVkNfMl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgMi4xCisgICAgTEVWRUxfQVZDXzJfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDIuMgorICAgIExFVkVMX0FWQ18zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAzCisgICAgTEVWRUxfQVZDXzNfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDMuMQorICAgIExFVkVMX0FWQ18zXzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCAzLjIKKyAgICBMRVZFTF9BVkNfNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgNAorICAgIExFVkVMX0FWQ180XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA0LjEKKyAgICBMRVZFTF9BVkNfNF8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgNC4yCisgICAgTEVWRUxfQVZDXzUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDUKKyAgICBMRVZFTF9BVkNfNV8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVZDIChILjI2NCkgTGV2ZWwgNS4xCisgICAgTEVWRUxfQVZDXzVfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDUuMgorICAgIExFVkVMX0FWQ182LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA2CisgICAgTEVWRUxfQVZDXzZfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWQyAoSC4yNjQpIExldmVsIDYuMQorICAgIExFVkVMX0FWQ182XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVkMgKEguMjY0KSBMZXZlbCA2LjIKKworICAgIC8vIEhFVkMgKEguMjY1KSB0aWVycyBhbmQgbGV2ZWxzCisgICAgTEVWRUxfSEVWQ19NQUlOXzEgPSBfQzJfUExfSEVWQ19CQVNFLCAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgMQorICAgIExFVkVMX0hFVkNfTUFJTl8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDIKKyAgICBMRVZFTF9IRVZDX01BSU5fMl8xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCAyLjEKKyAgICBMRVZFTF9IRVZDX01BSU5fMywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCAzCisgICAgTEVWRUxfSEVWQ19NQUlOXzNfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgMy4xCisgICAgTEVWRUxfSEVWQ19NQUlOXzQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNAorICAgIExFVkVMX0hFVkNfTUFJTl80XzEsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDQuMQorICAgIExFVkVMX0hFVkNfTUFJTl81LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgTWFpbiBUaWVyIExldmVsIDUKKyAgICBMRVZFTF9IRVZDX01BSU5fNV8xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCA1LjEKKyAgICBMRVZFTF9IRVZDX01BSU5fNV8yLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCA1LjIKKyAgICBMRVZFTF9IRVZDX01BSU5fNiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIE1haW4gVGllciBMZXZlbCA2CisgICAgTEVWRUxfSEVWQ19NQUlOXzZfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNi4xCisgICAgTEVWRUxfSEVWQ19NQUlOXzZfMiwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBNYWluIFRpZXIgTGV2ZWwgNi4yCisKKyAgICBMRVZFTF9IRVZDX0hJR0hfNCA9IF9DMl9QTF9IRVZDX0JBU0UgKyAweDEwMCwgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA0CisgICAgTEVWRUxfSEVWQ19ISUdIXzRfMSwgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRpZXIgTGV2ZWwgNC4xCisgICAgTEVWRUxfSEVWQ19ISUdIXzUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEhFVkMgKEguMjY1KSBIaWdoIFRpZXIgTGV2ZWwgNQorICAgIExFVkVMX0hFVkNfSElHSF81XzEsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaWVyIExldmVsIDUuMQorICAgIExFVkVMX0hFVkNfSElHSF81XzIsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaWVyIExldmVsIDUuMgorICAgIExFVkVMX0hFVkNfSElHSF82LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBIRVZDIChILjI2NSkgSGlnaCBUaWVyIExldmVsIDYKKyAgICBMRVZFTF9IRVZDX0hJR0hfNl8xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA2LjEKKyAgICBMRVZFTF9IRVZDX0hJR0hfNl8yLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSEVWQyAoSC4yNjUpIEhpZ2ggVGllciBMZXZlbCA2LjIKKworICAgIC8vIFZQOSBsZXZlbHMKKyAgICBMRVZFTF9WUDlfMSA9IF9DMl9QTF9WUDlfQkFTRSwgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDEKKyAgICBMRVZFTF9WUDlfMV8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDEuMQorICAgIExFVkVMX1ZQOV8yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgMgorICAgIExFVkVMX1ZQOV8yXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgMi4xCisgICAgTEVWRUxfVlA5XzMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCAzCisgICAgTEVWRUxfVlA5XzNfMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCAzLjEKKyAgICBMRVZFTF9WUDlfNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDQKKyAgICBMRVZFTF9WUDlfNF8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDQuMQorICAgIExFVkVMX1ZQOV81LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgNQorICAgIExFVkVMX1ZQOV81XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgNS4xCisgICAgTEVWRUxfVlA5XzVfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFZQOSBMZXZlbCA1LjIKKyAgICBMRVZFTF9WUDlfNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDYKKyAgICBMRVZFTF9WUDlfNl8xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVlA5IExldmVsIDYuMQorICAgIExFVkVMX1ZQOV82XzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBWUDkgTGV2ZWwgNi4yCisKKyAgICAvLyBEb2xieSBWaXNpb24gbGV2ZWxzCisgICAgTEVWRUxfRFZfTUFJTl9IRF8yNCA9IF9DMl9QTF9EVl9CQVNFLCAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgaGQyNAorICAgIExFVkVMX0RWX01BSU5fSERfMzAsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIGhkMzAKKyAgICBMRVZFTF9EVl9NQUlOX0ZIRF8yNCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciBmaGQyNAorICAgIExFVkVMX0RWX01BSU5fRkhEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIGZoZDMwCisgICAgTEVWRUxfRFZfTUFJTl9GSERfNjAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgZmhkNjAKKyAgICBMRVZFTF9EVl9NQUlOX1VIRF8yNCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciB1aGQyNAorICAgIExFVkVMX0RWX01BSU5fVUhEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gbWFpbiB0aWVyIHVoZDMwCisgICAgTEVWRUxfRFZfTUFJTl9VSERfNDgsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBtYWluIHRpZXIgdWhkNDgKKyAgICBMRVZFTF9EVl9NQUlOX1VIRF82MCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIG1haW4gdGllciB1aGQ2MAorCisgICAgTEVWRUxfRFZfSElHSF9IRF8yNCA9IF9DMl9QTF9EVl9CQVNFICsgMHgxMDAsICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgaGQyNAorICAgIExFVkVMX0RWX0hJR0hfSERfMzAsICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIGhkMzAKKyAgICBMRVZFTF9EVl9ISUdIX0ZIRF8yNCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciBmaGQyNAorICAgIExFVkVMX0RWX0hJR0hfRkhEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIGZoZDMwCisgICAgTEVWRUxfRFZfSElHSF9GSERfNjAsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgZmhkNjAKKyAgICBMRVZFTF9EVl9ISUdIX1VIRF8yNCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciB1aGQyNAorICAgIExFVkVMX0RWX0hJR0hfVUhEXzMwLCAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBEb2xieSBWaXNpb24gaGlnaCB0aWVyIHVoZDMwCisgICAgTEVWRUxfRFZfSElHSF9VSERfNDgsICAgICAgICAgICAgICAgICAgICAgICAvLy88IERvbGJ5IFZpc2lvbiBoaWdoIHRpZXIgdWhkNDgKKyAgICBMRVZFTF9EVl9ISUdIX1VIRF82MCwgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRG9sYnkgVmlzaW9uIGhpZ2ggdGllciB1aGQ2MAorCisgICAgLy8gQVYxIGxldmVscworICAgIExFVkVMX0FWMV8yICAgID0gX0MyX1BMX0FWMV9CQVNFICwgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgMgorICAgIExFVkVMX0FWMV8yXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgMi4xCisgICAgTEVWRUxfQVYxXzJfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCAyLjIKKyAgICBMRVZFTF9BVjFfMl8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDIuMworICAgIExFVkVMX0FWMV8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgMworICAgIExFVkVMX0FWMV8zXzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgMy4xCisgICAgTEVWRUxfQVYxXzNfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCAzLjIKKyAgICBMRVZFTF9BVjFfM18zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDMuMworICAgIExFVkVMX0FWMV80LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNAorICAgIExFVkVMX0FWMV80XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNC4xCisgICAgTEVWRUxfQVYxXzRfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA0LjIKKyAgICBMRVZFTF9BVjFfNF8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDQuMworICAgIExFVkVMX0FWMV81LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNQorICAgIExFVkVMX0FWMV81XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNS4xCisgICAgTEVWRUxfQVYxXzVfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA1LjIKKyAgICBMRVZFTF9BVjFfNV8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDUuMworICAgIExFVkVMX0FWMV82LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNgorICAgIExFVkVMX0FWMV82XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNi4xCisgICAgTEVWRUxfQVYxXzZfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA2LjIKKyAgICBMRVZFTF9BVjFfNl8zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDYuMworICAgIExFVkVMX0FWMV83LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNworICAgIExFVkVMX0FWMV83XzEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBBVjEgTGV2ZWwgNy4xCisgICAgTEVWRUxfQVYxXzdfMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IEFWMSBMZXZlbCA3LjIKKyAgICBMRVZFTF9BVjFfN18zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgQVYxIExldmVsIDcuMworfTsKKworc3RydWN0IEMyUHJvZmlsZUxldmVsU3RydWN0IHsKKyAgICBDMkNvbmZpZzo6cHJvZmlsZV90IHByb2ZpbGU7ICAvLy88IGNvZGluZyBwcm9maWxlCisgICAgQzJDb25maWc6OmxldmVsX3QgICBsZXZlbDsgICAgLy8vPCBjb2RpbmcgbGV2ZWwKKworICAgIEMyUHJvZmlsZUxldmVsU3RydWN0KAorICAgICAgICAgICAgQzJDb25maWc6OnByb2ZpbGVfdCBwcm9maWxlXyA9IEMyQ29uZmlnOjpQUk9GSUxFX1VOVVNFRCwKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGxldmVsXyA9IEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQpCisgICAgICAgIDogcHJvZmlsZShwcm9maWxlXyksIGxldmVsKGxldmVsXykgeyB9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFByb2ZpbGVMZXZlbCkKKyAgICBDMkZJRUxEKHByb2ZpbGUsICJwcm9maWxlIikKKyAgICBDMkZJRUxEKGxldmVsLCAgICJsZXZlbCIpCit9OworCisvLyBUT0RPOiBtYXkgbmVlZCB0byBtYWtlIHRoaXMgZXhwbGljaXQgKGhhdmUgLnNldCBtZW1iZXIpCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlByb2ZpbGVMZXZlbFN0cnVjdCwga1BhcmFtSW5kZXhQcm9maWxlTGV2ZWw+CisgICAgICAgIEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUxbXSA9ICJjb2RlZC5wbCI7CisKKy8qKgorICogQ29kZWMtc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gZGF0YS4KKyAqCisgKiBUaGlzIGlzIGluaXRpYWxpemF0aW9uIGRhdGEgZm9yIHRoZSBjb2RlYy4KKyAqCisgKiBGb3IgQVZDL0hFVkMsIHRoZXNlIGFyZSB0aGUgY29uY2F0ZW5hdGVkIFNQUy9QUFMvVlBTIE5BTHMuCisgKgorICogVE9ETzogZGVmaW5lIGZvciBvdGhlciBjb2RlY3MuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyQmxvYlZhbHVlLCBrUGFyYW1JbmRleEluaXREYXRhPiBDMlN0cmVhbUluaXREYXRhSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOSVRfREFUQVtdID0gImNvZGVkLmluaXQtZGF0YSI7CisKKy8qKgorICogU3VwcGxlbWVudGFsIERhdGEuCisgKgorICogVGhpcyBpcyBjb2Rpbmctc3BlY2lmaWMgc3VwcGxlbWVudGFsIGluZm9ybWF0aW9uYWwgZGF0YSwgZS5nLiBTRUkgZm9yIEFWQy9IRVZDLgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgbm90IGEgY29uZmlndXJhdGlvbiBzbyBpdCBkb2VzIG5vdCBoYXZlIGEgcGFyYW1ldGVyIGtleS4KKyAqIFRoaXMgc3RydWN0dXJlIHNoYWxsIGJlIHJldHVybmVkIGluIHRoZSBjb25maWd1cmF0aW9uIHVwZGF0ZSwgYW5kIGNhbiBiZSByZXBlYXRlZCBhcyBuZWVkZWQKKyAqIGluIHRoZSBzYW1lIHVwZGF0ZS4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjpzdXBwbGVtZW50YWxfaW5mb190LCB1aW50MzJfdCwKKyAgICBJTkZPX05PTkUgPSAwLAorCisgICAgSU5GT19QUkVGSVhfU0VJX1VOSVQgPSAweDEwMDAwLCAvLy88IHByZWZpeCBTRUkgcGF5bG9hZCB0eXBlcyBhZGQgdGhpcyBmbGFnCisgICAgSU5GT19TVUZGSVhfU0VJX1VOSVQgPSAweDIwMDAwLCAvLy88IHN1ZmZpeCBTRUkgcGF5bG9hZCB0eXBlcyBhZGQgdGhpcyBmbGFnCisKKyAgICBJTkZPX1NFSV9VU0VSX0RBVEEgPSBJTkZPX1BSRUZJWF9TRUlfVU5JVCB8IDQsICAgIC8vLzwgY2xvc2VkLWNhcHRpb25pbmcgZGF0YSAoSVRVLVQgVDM1KQorICAgIElORk9fU0VJX01EQ1YgICAgICA9IElORk9fUFJFRklYX1NFSV9VTklUIHwgMTM3LCAgLy8vPCBtYXN0ZXJpbmcgZGlzcGxheSBjb2xvciB2b2x1bWUKKyAgICBJTkZPX1NFVF9VU0VSX0RBVEFfU0ZYID0gSU5GT19TVUZGSVhfU0VJX1VOSVQgfCA0LCAvLy88IGNsb3NlZC1jYXB0aW9uaW5nIGRhdGEgKElUVS1UIFQzNSkKKworICAgIElORk9fVkVORE9SX1NUQVJUID0gMHg3MDAwMDAwMAorKQorCitzdHJ1Y3QgQzJTdXBwbGVtZW50YWxEYXRhU3RydWN0IHsKKyAgICBDMlN1cHBsZW1lbnRhbERhdGFTdHJ1Y3QoKQorICAgICAgICA6IHR5cGVfKElORk9fTk9ORSkgeyB9CisKKyAgICBDMlN1cHBsZW1lbnRhbERhdGFTdHJ1Y3QoCisgICAgICAgICAgICBzaXplX3QgZmxleENvdW50LCBDMkNvbmZpZzo6c3VwcGxlbWVudGFsX2luZm9fdCB0eXBlLCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkYXRhXykKKyAgICAgICAgOiB0eXBlXyh0eXBlKSB7CisgICAgICAgICAgICBtZW1jcHkoZGF0YSwgJmRhdGFfWzBdLCBjMl9taW4oZGF0YV8uc2l6ZSgpLCBmbGV4Q291bnQpKTsKKyAgICB9CisKKyAgICBDMkNvbmZpZzo6c3VwcGxlbWVudGFsX2luZm9fdCB0eXBlXzsKKyAgICB1aW50OF90IGRhdGFbXTsKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChTdXBwbGVtZW50YWxEYXRhLCBkYXRhKQorICAgIEMyRklFTEQodHlwZV8sICJ0eXBlIikKKyAgICBDMkZJRUxEKGRhdGEsICJkYXRhIikKK307Cit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlN1cHBsZW1lbnRhbERhdGFTdHJ1Y3QsIGtQYXJhbUluZGV4U3VwcGxlbWVudGFsRGF0YT4KKyAgICAgICAgQzJTdHJlYW1TdXBwbGVtZW50YWxEYXRhSW5mbzsKKworLyoqCisgKiBTdXBwbGVtZW50YWwgRGF0YSBTdWJzY3JpcHRpb24KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyQ29uZmlnOjpzdXBwbGVtZW50YWxfaW5mb190PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleFN1YnNjcmliZWRTdXBwbGVtZW50YWxEYXRhPgorICAgICAgICBDMlN0cmVhbVN1YnNjcmliZWRTdXBwbGVtZW50YWxEYXRhVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU1VCU0NSSUJFRF9TVVBQTEVNRU5UQUxfREFUQVtdID0gIm91dHB1dC5zdWJzY3JpYmVkLXN1cHBsZW1lbnRhbCI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcGlwZWxpbmUgY2hhcmFjdGVyaXN0aWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBNZWRpYS10eXBlLgorICoKKyAqIFRoaXMgaXMgZGVmaW5lZCBmb3IgYm90aCBwb3J0IGFuZCBzdHJlYW0sIGJ1dCBzdHJlYW0gbWVkaWEgdHlwZSBtYXkgYmUgYSBzdWJ0eXBlIG9mIHRoZQorICogcG9ydCBtZWRpYSB0eXBlLgorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyU2V0dGluZywgQzJTdHJpbmdWYWx1ZSwga1BhcmFtSW5kZXhNZWRpYVR5cGU+IEMyUG9ydE1lZGlhVHlwZVNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFW10gPSAiaW5wdXQubWVkaWEtdHlwZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfTUVESUFfVFlQRVtdID0gIm91dHB1dC5tZWRpYS10eXBlIjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyU2V0dGluZywgQzJTdHJpbmdWYWx1ZSwga1BhcmFtSW5kZXhNZWRpYVR5cGU+IEMyU3RyZWFtTWVkaWFUeXBlU2V0dGluZzsKKworLyoqCisgKiBQaXBlbGluZSBkZWxheXMuCisgKgorICogSW5wdXQgZGVsYXkgaXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGlucHV0IGZyYW1lcyByZXF1ZXN0ZWQgYnkgdGhlIGNvbXBvbmVudCB0byBwcm9jZXNzCisgKiBhbiBpbnB1dCBmcmFtZS4KKyAqCisgKiBPdXRwdXQgZGVsYXkgaXMgdGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIG91dHB1dCBmcmFtZXMgdGhhdCBuZWVkIHRvIGJlIGdlbmVyYXRlZCBiZWZvcmUgYW4KKyAqIG91dHB1dCBjYW4gYmUgcmVsZWFzZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAqCisgKiBQaXBlbGluZSBkZWxheSBpcyB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgZnJhbWVzIHRoYXQgYXJlIHByb2Nlc3NlZCBhdCBvbmUgdGltZSBieSB0aGUKKyAqIGNvbXBvbmVudC4KKyAqCisgKiBBcyB0aGVzZSBtYXkgdmFyeSBmcm9tIGZyYW1lIHRvIGZyYW1lLCB0aGUgbnVtYmVyIGlzIHRoZSBtYXhpbXVtIHJlcXVpcmVkIHZhbHVlLiBFLmcuIGlmCisgKiBpbnB1dCBkZWxheSBpcyAwLCB0aGUgY29tcG9uZW50IGlzIGV4cGVjdGVkIHRvIGNvbnN1bWUgZWFjaCBmcmFtZSBxdWV1ZWQgZXZlbiBpZiBubyBmdXJ0aGVyCisgKiBmcmFtZXMgYXJlIHF1ZXVlZC4gU2ltaWxhcmx5LCBpZiBpbnB1dCBkZWxheSBpcyAxLCBhcyBsb25nIGFzIHRoZXJlIGFyZSBhbHdheXMgZXhhY3RseSAyCisgKiBvdXRzdGFuZGluZyBpbnB1dCBmcmFtZXMgcXVldWVkIHRvIHRoZSBjb21wb25lbnQsIGl0IHNoYWxsIHByb2R1Y2Ugb3V0cHV0LgorICovCisKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4RGVsYXkgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX1JFUVVFU1RfRkxBRz4KKyAgICAgICAgQzJQb3J0UmVxdWVzdGVkRGVsYXlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9ERUxBWV9SRVFVRVNUW10gPSAiaW5wdXQuZGVsYXkiOyAvLyBkZXByZWNhdGVkCitjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfREVMQVlfUkVRVUVTVFtdID0gIm91dHB1dC5kZWxheSI7IC8vIGRlcHJlY2F0ZWQKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4RGVsYXkgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX1JFUVVFU1RfRkxBRz4KKyAgICAgICAgQzJSZXF1ZXN0ZWRQaXBlbGluZURlbGF5VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUElQRUxJTkVfREVMQVlfUkVRVUVTVFtdID0gImFsZ28uZGVsYXkiOyAvLyBkZXByZWNhdGVkCisKKy8vIHJlYWQtb25seQordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhEZWxheT4gQzJQb3J0RGVsYXlUdW5pbmc7Cit0eXBlZGVmIEMyUG9ydERlbGF5VHVuaW5nIEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOyAvLyBkZXByZWNhdGVkCitjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9ERUxBWVtdID0gImlucHV0LmRlbGF5IjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9ERUxBWVtdID0gIm91dHB1dC5kZWxheSI7CisKKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleERlbGF5PiBDMlBpcGVsaW5lRGVsYXlUdW5pbmc7Cit0eXBlZGVmIEMyUGlwZWxpbmVEZWxheVR1bmluZyBDMkFjdHVhbFBpcGVsaW5lRGVsYXlUdW5pbmc7IC8vIGRlcHJlY2F0ZWQKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BJUEVMSU5FX0RFTEFZW10gPSAiYWxnby5kZWxheSI7CisKKy8qKgorICogUmVmZXJlbmNlIGNoYXJhY3RlcmlzdGljcy4KKyAqCisgKiBUaGUgY29tcG9uZW50IG1heSBob2xkIG9udG8gaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIGV2ZW4gYWZ0ZXIgY29tcGxldGluZyB0aGUgY29ycmVzcG9uZGluZworICogd29yayBpdGVtLgorICoKKyAqIE1heCByZWZlcmVuY2UgYWdlIGlzIHRoZSBsb25nZXN0IG51bWJlciBvZiBhZGRpdGlvbmFsIGZyYW1lIHByb2Nlc3NpbmcgdGhhdCBhIGNvbXBvbmVudCBtYXkKKyAqIGhvbGQgb250byBhIGJ1ZmZlciBmb3IuIE1heCByZWZlcmVuY2UgY291bnQgaXMgdGhlIG51bWJlciBvZiBidWZmZXJzIHRoYXQgYSBjb21wb25lbnQgbWF5CisgKiBob2xkIG9udG8gYXQgdGhlIHNhbWUgdGltZSBhdCB0aGUgd29yc3QgY2FzZS4gVGhlc2UgbnVtYmVycyBhc3N1bWUgc2luZ2xlIGZyYW1lIHBlciBidWZmZXJzLgorICoKKyAqIFVzZSBtYXgtdWludDMyIGlmIHRoZXJlIGlzIG5vIGxpbWl0IGZvciB0aGUgbWF4IGFnZSBvciBjb3VudC4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleE1heFJlZmVyZW5jZUFnZT4KKyAgICAgICAgQzJTdHJlYW1NYXhSZWZlcmVuY2VBZ2VUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9NQVhfUkVGRVJFTkNFX0FHRVtdID0gImlucHV0LnJlZmVyZW5jZS5tYXgtYWdlIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9NQVhfUkVGRVJFTkNFX0FHRVtdID0gIm91dHB1dC5yZWZlcmVuY2UubWF4LWFnZSI7CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhNYXhSZWZlcmVuY2VDb3VudD4KKyAgICAgICAgQzJTdHJlYW1NYXhSZWZlcmVuY2VDb3VudFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9SRUZFUkVOQ0VfQ09VTlRbXSA9ICJpbnB1dC5yZWZlcmVuY2UubWF4LWNvdW50IjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9NQVhfUkVGRVJFTkNFX0NPVU5UW10gPSAib3V0cHV0LnJlZmVyZW5jZS5tYXgtY291bnQiOworCisvKioKKyAqIE91dHB1dCByZW9yZGVyaW5nLgorICoKKyAqIFRoZSBzaXplIG9mIHRoZSB3aW5kb3cgdG8gdXNlIGZvciBvdXRwdXQgYnVmZmVyIHJlb3JkZXJpbmcuIDAgaXMgaW50ZXJwcmV0ZWQgYXMgMS4KKyAqLworLy8gb3V0cHV0IG9ubHkKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4UmVvcmRlckJ1ZmZlckRlcHRoPgorICAgICAgICBDMlBvcnRSZW9yZGVyQnVmZmVyRGVwdGhUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfUkVPUkRFUl9ERVBUSFtdID0gIm91dHB1dC5yZW9yZGVyLmRlcHRoIjsKKworQzJFTlVNKEMyQ29uZmlnOjpvcmRpbmFsX2tleV90LCB1aW50MzJfdCwKKyAgICAgICAgT1JESU5BTCwKKyAgICAgICAgVElNRVNUQU1QLAorICAgICAgICBDVVNUT00pCisKKy8vIHJlYWQtb25seSwgb3V0cHV0IG9ubHkKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJTZXR0aW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpvcmRpbmFsX2tleV90Piwga1BhcmFtSW5kZXhSZW9yZGVyS2V5PgorICAgICAgICBDMlBvcnRSZW9yZGVyS2V5U2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9SRU9SREVSX0tFWVtdID0gIm91dHB1dC5yZW9yZGVyLmtleSI7CisKKy8qKgorICogU3RyZWFtIGNvdW50LgorICovCisvLyBwcml2YXRlCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleFN0cmVhbUNvdW50PiBDMlBvcnRTdHJlYW1Db3VudFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9DT1VOVFtdID0gImlucHV0LnN0cmVhbS1jb3VudCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0NPVU5UW10gPSAib3V0cHV0LnN0cmVhbS1jb3VudCI7CisKKy8qKgorICogQ29uZmlnIHVwZGF0ZSBzdWJzY3JpcHRpb24uCisgKi8KKy8vIHByaXZhdGUKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50MzJBcnJheSwga1BhcmFtSW5kZXhTdWJzY3JpYmVkUGFyYW1JbmRpY2VzPgorICAgICAgICBDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TVUJTQ1JJQkVEX1BBUkFNX0lORElDRVNbXSA9ICJvdXRwdXQuc3Vic2NyaWJlZC1pbmRpY2VzIjsKKworLyoqCisgKiBTdWdnZXN0ZWQgYnVmZmVyIChDMkZyYW1lKSBjb3VudC4gVGhpcyBpcyBhIHN1Z2dlc3Rpb24gYnkgdGhlIGNvbXBvbmVudCBmb3IgdGhlIG51bWJlciBvZgorICogaW5wdXQgYW5kIG91dHB1dCBmcmFtZXMgYWxsb2NhdGVkIGZvciB0aGUgY29tcG9uZW50J3MgdXNlIGluIHRoZSBidWZmZXIgcG9vbHMuCisgKgorICogQ29tcG9uZW50IHNoYWxsIHNldCB0aGUgYWNjZXB0YWJsZSByYW5nZSBvZiBidWZmZXJzIGFsbG9jYXRlZCBmb3IgaXQuIEUuZy4gY2xpZW50IHNoYWxsCisgKiBhbGxvY2F0ZSBhdCBsZWFzdCB0aGUgbWluaW11bSByZXF1aXJlZCB2YWx1ZS4KKyAqLworLy8gcmVhZC1vbmx5Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQ2NEFycmF5LCBrUGFyYW1JbmRleFN1Z2dlc3RlZEJ1ZmZlckNvdW50PgorICAgICAgICBDMlBvcnRTdWdnZXN0ZWRCdWZmZXJDb3VudFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVR0dFU1RFRF9CVUZGRVJfQ09VTlRbXSA9ICJpbnB1dC5idWZmZXJzLnBvb2wtc2l6ZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfU1VHR0VTVEVEX0JVRkZFUl9DT1VOVFtdID0gIm91dHB1dC5idWZmZXJzLnBvb2wtc2l6ZSI7CisKKy8qKgorICogSW5wdXQvb3V0cHV0IGJhdGNoaW5nLgorICoKKyAqIEZvciBpbnB1dCwgY29tcG9uZW50IHJlcXVlc3RzIHRoYXQgY2xpZW50IGJhdGNoZXMgd29yayBpbiBiYXRjaGVzIG9mIHNwZWNpZmllZCBzaXplLiBGb3Igb3V0cHV0LAorICogY2xpZW50IHJlcXVlc3RzIHRoYXQgdGhlIGNvbXBvbmVudCBiYXRjaGVzIHdvcmsgY29tcGxldGlvbiBpbiBnaXZlbiBiYXRjaCBzaXplLgorICogVmFsdWUgMCBtZWFucyBkb24ndCBjYXJlLgorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQ2NEFycmF5LCBrUGFyYW1JbmRleEJhdGNoU2l6ZT4gQzJQb3J0QmF0Y2hTaXplVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfQkFUQ0hfU0laRVtdID0gImlucHV0LmJ1ZmZlcnMuYmF0Y2gtc2l6ZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfQkFUQ0hfU0laRVtdID0gIm91dHB1dC5idWZmZXJzLmJhdGNoLXNpemUiOworCisvKioKKyAqIEN1cnJlbnQgJiBsYXN0IHdvcmsgb3JkaW5hbHMuCisgKgorICogaW5wdXQgcG9ydDogbGFzdCB3b3JrIHF1ZXVlZCB0byBjb21wb25lbnQuCisgKiBvdXRwdXQgcG9ydDogbGFzdCB3b3JrIGNvbXBsZXRlZCBieSBjb21wb25lbnQuCisgKiBnbG9iYWw6IGN1cnJlbnQgd29yay4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJXb3JrT3JkaW5hbFN0cnVjdCwga1BhcmFtSW5kZXhMYXN0V29ya1F1ZXVlZD4gQzJMYXN0V29ya1F1ZXVlZFR1bmluZzsKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJXb3JrT3JkaW5hbFN0cnVjdCwga1BhcmFtSW5kZXhDdXJyZW50V29yaz4gQzJDdXJyZW50V29ya1R1bmluZzsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1lbW9yeSBhbGxvY2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBBbGxvY2F0b3JzIHRvIHVzZS4KKyAqCisgKiBUaGVzZSBhcmUgcmVxdWVzdGVkIGJ5IHRoZSBjb21wb25lbnQuCisgKgorICogSWYgbm9uZSBzcGVjaWZpZWQsIGNsaWVudCB3aWxsIHVzZSB0aGUgZGVmYXVsdCBhbGxvY2F0b3IgSUQgYmFzZWQgb24gdGhlIGNvbXBvbmVudCBkb21haW4gYW5kCisgKiBraW5kLgorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyQWxsb2NhdG9yOjppZF90Piwga1BhcmFtSW5kZXhBbGxvY2F0b3JzPgorICAgICAgICBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfQUxMT0NBVE9SU1tdID0gImlucHV0LmJ1ZmZlcnMuYWxsb2NhdG9yLWlkcyI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfQUxMT0NBVE9SU1tdID0gIm91dHB1dC5idWZmZXJzLmFsbG9jYXRvci1pZHMiOworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJBbGxvY2F0b3I6OmlkX3Q+LCBrUGFyYW1JbmRleEFsbG9jYXRvcnM+CisgICAgICAgIEMyUHJpdmF0ZUFsbG9jYXRvcnNUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QUklWQVRFX0FMTE9DQVRPUlNbXSA9ICJhbGdvLmJ1ZmZlcnMuYWxsb2NhdG9yLWlkcyI7CisKKy8qKgorICogQWxsb2NhdG9yIHRvIHVzZSBmb3Igb3V0cHV0dGluZyB0byBzdXJmYWNlLgorICoKKyAqIENvbXBvbmVudHMgY2FuIG9wdGlvbmFsbHkgcmVxdWVzdCBhbGxvY2F0b3IgdHlwZSBmb3Igb3V0cHV0dGluZyB0byBzdXJmYWNlLgorICoKKyAqIElmIG5vbmUgc3BlY2lmaWVkLCBjbGllbnQgd2lsbCB1c2UgdGhlIGRlZmF1bHQgQnVmZmVyUXVldWUtYmFja2VkIGFsbG9jYXRvciBJRCBmb3Igb3V0cHV0dGluZyB0bworICogc3VyZmFjZS4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhTdXJmYWNlQWxsb2NhdG9yPgorICAgICAgICBDMlBvcnRTdXJmYWNlQWxsb2NhdG9yVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX1NVUkZBQ0VfQUxMT0NBVE9SW10gPSAib3V0cHV0LmJ1ZmZlcnMuc3VyZmFjZS1hbGxvY2F0b3ItaWQiOworCisvKioKKyAqIEJsb2NrIHBvb2xzIHRvIHVzZS4KKyAqCisgKiBUaGVzZSBhcmUgYWxsb2NhdGVkIGJ5IHRoZSBjbGllbnQgZm9yIHRoZSBjb21wb25lbnQgdXNpbmcgdGhlIGFsbG9jYXRvciBJRHMgc3BlY2lmaWVkIGJ5IHRoZQorICogY29tcG9uZW50LiBUaGlzIGlzIG5vdCB1c2VkIGZvciB0aGUgaW5wdXQgcG9ydC4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdD4sIGtQYXJhbUluZGV4QmxvY2tQb29scz4KKyAgICAgICAgQzJQb3J0QmxvY2tQb29sc1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9CTE9DS19QT09MU1tdID0gIm91dHB1dC5idWZmZXJzLnBvb2wtaWRzIjsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZUFycmF5U3RydWN0PEMyQmxvY2tQb29sOjpsb2NhbF9pZF90Piwga1BhcmFtSW5kZXhCbG9ja1Bvb2xzPgorICAgICAgICBDMlByaXZhdGVCbG9ja1Bvb2xzVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUFJJVkFURV9CTE9DS19QT09MU1tdID0gImFsZ28uYnVmZmVycy5wb29sLWlkcyI7CisKKy8qKgorICogVGhlIG1heCBudW1iZXIgb2YgcHJpdmF0ZSBhbGxvY2F0aW9ucyBhdCBhbnkgb25lIHRpbWUgYnkgdGhlIGNvbXBvbmVudC4KKyAqIChUaGlzIGlzIGFuIGFycmF5IHdpdGggYSBjb3JyZXNwb25kaW5nIHZhbHVlIGZvciBlYWNoIHByaXZhdGUgYWxsb2NhdG9yKQorICovCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyVWludDMyQXJyYXksIGtQYXJhbUluZGV4TWF4UmVmZXJlbmNlQ291bnQ+CisgICAgICAgIEMyTWF4UHJpdmF0ZUJ1ZmZlckNvdW50VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTUFYX1BSSVZBVEVfQlVGRkVSX0NPVU5UW10gPSAiYWxnby5idWZmZXJzLm1heC1jb3VudCI7CisKKy8qKgorICogQnVmZmVyIHR5cGUKKyAqCisgKiBUaGlzIGlzIHByb3ZpZGVkIGJ5IHRoZSBjb21wb25lbnQgZm9yIHRoZSBjbGllbnQgdG8gYWxsb2NhdGUgdGhlIHByb3BlciBidWZmZXIgdHlwZSBmb3IgdGhlCisgKiBpbnB1dCBwb3J0LCBhbmQgY2FuIGJlIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgdG8gY29udHJvbCB0aGUgYnVmZmVyIHR5cGUgZm9yIHRoZSBvdXRwdXQuCisgKi8KKy8vIHByaXZhdGUKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJFYXN5RW51bTxDMkJ1ZmZlckRhdGE6OnR5cGVfdD4+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4QnVmZmVyVHlwZT4KKyAgICAgICAgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NUUkVBTV9CVUZGRVJfVFlQRVtdID0gImlucHV0LmJ1ZmZlcnMudHlwZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX0JVRkZFUl9UWVBFW10gPSAib3V0cHV0LmJ1ZmZlcnMudHlwZSI7CisKKy8qKgorICogTWVtb3J5IHVzYWdlLgorICoKKyAqIFN1Z2dlc3RlZCBieSBjb21wb25lbnQgZm9yIGlucHV0IGFuZCBuZWdvdGlhdGVkIGJldHdlZW4gY2xpZW50IGFuZCBjb21wb25lbnQgZm9yIG91dHB1dC4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlVpbnQ2NFZhbHVlLCBrUGFyYW1JbmRleFVzYWdlPiBDMlN0cmVhbVVzYWdlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1RSRUFNX1VTQUdFW10gPSAiaW5wdXQuYnVmZmVycy51c2FnZSI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfU1RSRUFNX1VTQUdFW10gPSAib3V0cHV0LmJ1ZmZlcnMudXNhZ2UiOworCisvKioKKyAqIFBpY3R1cmUgKHZpZGVvIG9yIGltYWdlIGZyYW1lKSBzaXplLgorICovCitzdHJ1Y3QgQzJQaWN0dXJlU2l6ZVN0cnVjdCB7CisgICAgaW5saW5lIEMyUGljdHVyZVNpemVTdHJ1Y3QoKQorICAgICAgICA6IHdpZHRoKDApLCBoZWlnaHQoMCkgeyB9CisKKyAgICBpbmxpbmUgQzJQaWN0dXJlU2l6ZVN0cnVjdCh1aW50MzJfdCB3aWR0aF8sIHVpbnQzMl90IGhlaWdodF8pCisgICAgICAgIDogd2lkdGgod2lkdGhfKSwgaGVpZ2h0KGhlaWdodF8pIHsgfQorCisgICAgdWludDMyX3Qgd2lkdGg7ICAgICAvLy88IHZpZGVvIHdpZHRoCisgICAgdWludDMyX3QgaGVpZ2h0OyAgICAvLy88IHZpZGVvIGhlaWdodAorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChQaWN0dXJlU2l6ZSkKKyAgICBDMkZJRUxEKHdpZHRoLCAid2lkdGgiKQorICAgIEMyRklFTEQoaGVpZ2h0LCAiaGVpZ2h0IikKK307CisKKy8qKgorICogT3V0IG9mIG1lbW9yeSBzaWduYWxpbmcKKyAqCisgKiBUaGlzIGlzIGEgY29uZmlndXJhdGlvbiBmb3IgdGhlIGNsaWVudCB0byBtYXJrIHRoYXQgaXQgY2Fubm90IGFsbG9jYXRlIG5lY2Vzc2FyeSBwcml2YXRlIGFuZC8KKyAqIG9yIG91dHB1dCBidWZmZXJzIHRvIGNvbnRpbnVlIG9wZXJhdGlvbiwgYW5kIHRvIHNpZ25hbCB0aGUgZmFpbGluZyBjb25maWd1cmF0aW9uLgorICovCitzdHJ1Y3QgQzJPdXRPZk1lbW9yeVN0cnVjdCB7CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgcG9vbDsgICAvLy88IHBvb2wgSUQgdGhhdCBmYWlsZWQgdGhlIGFsbG9jYXRpb24KKyAgICB1aW50NjRfdCB1c2FnZTsgICAgICAgICAgICAgICAgIC8vLzwgbWVtb3J5IHVzYWdlIHVzZWQKKyAgICBDMlBpY3R1cmVTaXplU3RydWN0IHBsYW5hcjsgICAgIC8vLzwgYnVmZmVyIGRpbWVuc2lvbnMgdG8gYmUgYWxsb2NhdGVkIGlmIDJECisgICAgdWludDMyX3QgZm9ybWF0OyAgICAgICAgICAgICAgICAvLy88IHBpeGVsIGZvcm1hdCB0byBiZSB1c2VkIGlmIDJECisgICAgdWludDMyX3QgY2FwYWNpdHk7ICAgICAgICAgICAgICAvLy88IGJ1ZmZlciBjYXBhY2l0eSB0byBiZSBhbGxvY2F0ZWQgaWYgMUQKKyAgICBjMl9ib29sX3Qgb3V0T2ZNZW1vcnk7ICAgICAgICAgICAvLy88IHRydWUgaWYgY29tcG9uZW50IGlzIG91dCBvZiBtZW1vcnkKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoT3V0T2ZNZW1vcnkpCisgICAgQzJGSUVMRChwb29sLCAicG9vbCIpCisgICAgQzJGSUVMRCh1c2FnZSwgInVzYWdlIikKKyAgICBDMkZJRUxEKHBsYW5hciwgInBsYW5hciIpCisgICAgQzJGSUVMRChmb3JtYXQsICJmb3JtYXQiKQorICAgIEMyRklFTEQoY2FwYWNpdHksICJjYXBhY2l0eSIpCisgICAgQzJGSUVMRChvdXRPZk1lbW9yeSwgIm91dC1vZi1tZW1vcnkiKQorfTsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMk91dE9mTWVtb3J5U3RydWN0LCBrUGFyYW1JbmRleE91dE9mTWVtb3J5PiBDMk91dE9mTWVtb3J5VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUX09GX01FTU9SWVtdID0gImFsZ28ub29tIjsKKworLyoqCisgKiBNYXggYnVmZmVyIHNpemUKKyAqCisgKiBUaGlzIGlzIGEgaGludCBwcm92aWRlZCBieSB0aGUgY29tcG9uZW50IGZvciB0aGUgbWF4aW11bSBidWZmZXIgc2l6ZSBleHBlY3RlZCBvbiBhIHN0cmVhbSBmb3IgdGhlCisgKiBjdXJyZW50IGNvbmZpZ3VyYXRpb24gb24gaXRzIGlucHV0IGFuZCBvdXRwdXQgc3RyZWFtcy4gVGhpcyBpcyBjb21tdW5pY2F0ZWQgdG8gY2xpZW50cyBzbyB0aGV5CisgKiBjYW4gcHJlYWxsb2NhdGUgaW5wdXQgYnVmZmVycywgb3IgY29uZmlndXJlIGRvd25zdHJlYW0gY29tcG9uZW50cyB0aGF0IHJlcXVpcmUgYSBtYXhpbXVtIHNpemUgb24KKyAqIHRoZWlyIGJ1ZmZlcnMuCisgKgorICogUmVhZC1vbmx5LiBSZXF1aXJlZCB0byBiZSBwcm92aWRlZCBieSBjb21wb25lbnRzIG9uIGFsbCBjb21wcmVzc2VkIHN0cmVhbXMuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4TWF4QnVmZmVyU2l6ZT4gQzJTdHJlYW1NYXhCdWZmZXJTaXplSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX01BWF9CVUZGRVJfU0laRVtdID0gImlucHV0LmJ1ZmZlcnMubWF4LXNpemUiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfT1VUUFVUX01BWF9CVUZGRVJfU0laRVtdID0gIm91dHB1dC5idWZmZXJzLm1heC1zaXplIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBtaXNjLiBzdGF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogVHJpcHBlZCBzdGF0ZSwKKyAqCisgKiBUaGlzIHN0YXRlIGV4aXN0cyB0byBiZSBhYmxlIHRvIHByb3ZpZGUgcmVhc29uaW5nIGZvciBhIHRyaXBwZWQgc3RhdGUgZHVyaW5nIG5vcm1hbAorICogaW50ZXJmYWNlIG9wZXJhdGlvbnMsIGFzIHdlbGwgYXMgdG8gYWxsb3cgY2xpZW50IHRvIHRyaXAgdGhlIGNvbXBvbmVudCBvbiBkZW1hbmQuCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJCb29sVmFsdWUsIGtQYXJhbUluZGV4VHJpcHBlZD4KKyAgICAgICAgQzJUcmlwcGVkVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVFJJUFBFRFtdID0gImFsZ28udHJpcHBlZCI7CisKKy8qKgorICogQ29uZmlndXJhdGlvbiBjb3VudGVycy4KKyAqCisgKiBDb25maWd1cmF0aW9ucyBhcmUgdHJhY2tlZCB1c2luZyB0aHJlZSBjb3VudGVycy4gVGhlIGlucHV0IGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgZXhhY3RseQorICogb25jZSB3aXRoIGVhY2ggd29yayBhY2NlcHRlZCBieSB0aGUgY29tcG9uZW50LiBUaGUgb3V0cHV0IGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgZXhhY3RseQorICogb25jZSB3aXRoIGVhY2ggd29yayBjb21wbGV0ZWQgYnkgdGhlIGNvbXBvbmVudCAoaW4gdGhlIG9yZGVyIG9mIHdvcmsgY29tcGxldGlvbikuIFRoZQorICogZ2xvYmFsIGNvdW50ZXIgaXMgaW5jcmVtZW50ZWQgZXhhY3RseSBvbmNlIGR1cmluZyB0byBlYWNoIGNvbmZpZygpIGNhbGwuIFRoZXNlIGNvdW50ZXJzCisgKiBzaGFsbCBiZSByZWFkLW9ubHkuCisgKgorICogVE9ETzogdGhlc2Ugc2hvdWxkIGJlIGNvdW50ZXJzLgorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlVpbnQ2NFZhbHVlLCBrUGFyYW1JbmRleENvbmZpZ0NvdW50ZXI+IEMyUG9ydENvbmZpZ0NvdW50ZXJUdW5pbmc7Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyVWludDY0VmFsdWUsIGtQYXJhbUluZGV4Q29uZmlnQ291bnRlcj4gQzJDb25maWdDb3VudGVyVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfQ09VTlRFUltdID0gImlucHV0LmJ1ZmZlcnMuY291bnRlciI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfQ09VTlRFUltdID0gIm91dHB1dC5idWZmZXJzLmNvdW50ZXIiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09ORklHX0NPVU5URVJbXSA9ICJhbGdvLmNvbmZpZy5jb3VudGVyIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gcmVzb3VyY2VzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogUmVzb3VyY2VzIG5lZWRlZCBhbmQgcmVzb3VyY2VzIHJlc2VydmVkIGZvciBjdXJyZW50IGNvbmZpZ3VyYXRpb24uCisgKgorICogUmVzb3VyY2VzIGFyZSB0cmFja2VkIGFzIGEgdmVjdG9yIG9mIHBvc2l0aXZlIG51bWJlcnMuIEF2YWlsYWJsZSByZXNvdXJjZXMgYXJlIGRlZmluZWQgYnkKKyAqIHRoZSB2ZW5kb3IuCisgKgorICogQnkgZGVmYXVsdCwgbm8gcmVzb3VyY2VzIGFyZSByZXNlcnZlZCBmb3IgYSBjb21wb25lbnQuIElmIHJlc291cmNlIHJlc2VydmF0aW9uIGlzIHN1Y2Nlc3NmdWwsCisgKiB0aGUgY29tcG9uZW50IHNoYWxsIGJlIGFibGUgdG8gdXNlIHRob3NlIHJlc291cmNlcyBleGNsdXNpdmVseS4gSWYgaG93ZXZlciwgdGhlIGNvbXBvbmVudCBpcworICogbm90IHVzaW5nIGFsbCBvZiB0aGUgcmVzZXJ2ZWQgcmVzb3VyY2VzLCB0aG9zZSBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIgY29tcG9uZW50cy4KKyAqCisgKiBUT0RPOiBkZWZpbmUgc29tZSBvZiB0aGUgcmVzb3VyY2VzLgorICovCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyVWludDY0QXJyYXksIGtQYXJhbUluZGV4UmVzb3VyY2VzTmVlZGVkPiBDMlJlc291cmNlc05lZWRlZFR1bmluZzsKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJVaW50NjRBcnJheSwga1BhcmFtSW5kZXhSZXNvdXJjZXNSZXNlcnZlZD4KKyAgICAgICAgQzJSZXNvdXJjZXNSZXNlcnZlZFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1JFU09VUkNFU19ORUVERURbXSA9ICJyZXNvdXJjZXMubmVlZGVkIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1JFU09VUkNFU19SRVNFUlZFRFtdID0gInJlc291cmNlcy5yZXNlcnZlZCI7CisKKy8qKgorICogT3BlcmF0aW5nIHJhdGUuCisgKgorICogT3BlcmF0aW5nIHJhdGUgaXMgdGhlIGV4cGVjdGVkIHJhdGUgb2Ygd29yayB0aHJvdWdoIHRoZSBjb21wb25lbnQuIE5lZ2F0aXZlIHZhbHVlcyBpcworICogaW52YWxpZC4KKyAqCisgKiBUT0RPOiB0aGlzIGNvdWxkIGRpc3Rpbmd1aXNoIHNldCB2YWx1ZQorICovCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhPcGVyYXRpbmdSYXRlPiBDMk9wZXJhdGluZ1JhdGVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PUEVSQVRJTkdfUkFURVtdID0gImFsZ28ucmF0ZSI7CisKKy8qKgorICogUmVhbHRpbWUgLyBvcGVyYXRpbmcgcG9pbnQuCisgKgorICogUHJpb3JpdHkgdmFsdWUgZGVmaW5lcyB0aGUgb3BlcmF0aW5nIHBvaW50IGZvciB0aGUgY29tcG9uZW50LiBPcGVyYXRpbmcgcG9pbnRzIGFyZSBkZWZpbmVkIGJ5CisgKiB0aGUgdmVuZG9yLiBQcmlvcml0eSB2YWx1ZSBvZiAwIG1lYW5zIHRoYXQgdGhlIGNsaWVudCByZXF1aXJlcyBvcGVyYXRpb24gYXQgdGhlIGdpdmVuIG9wZXJhdGluZworICogcmF0ZS4gUHJpb3JpdHkgdmFsdWVzIC0xIGFuZCBiZWxvdyBkZWZpbmUgb3BlcmF0aW5nIHBvaW50cyBpbiBkZWNyZWFzaW5nIHBlcmZvcm1hbmNlLiBJbiB0aGlzCisgKiBjYXNlIGNsaWVudCBleHBlY3RzIGJlc3QgZWZmb3J0IHdpdGhvdXQgZXhjZWVkaW5nIHRoZSBzcGVjaWZpYyBvcGVyYXRpbmcgcG9pbnQuIFRoaXMgYWxsb3dzCisgKiBjbGllbnQgdG8gcnVuIGNvbXBvbmVudHMgZGVlcGVyIGluIHRoZSBiYWNrZ3JvdW5kIGJ5IHVzaW5nIGxhcmdlciBwcmlvcml0eSB2YWx1ZXMuIEluIHRoZXNlCisgKiBjYXNlcyBvcGVyYXRpbmcgcmF0ZSBpcyBhIGhpbnQgZm9yIHRoZSBtYXhpbXVtIHJhdGUgdGhhdCB0aGUgY2xpZW50IGFudGljaXBhdGVzLgorICoKKyAqIE9wZXJhdGluZyByYXRlIGFuZCBwcmlvcml0eSBhcmUgdXNlZCBpbiB0YW5kZW0uIEUuZy4gaWYgdGhlcmUgYXJlIGNvbXBvbmVudHMgdGhhdCBydW4gYXQgYQorICogaGlnaGVyIG9wZXJhdGluZyBwb2ludCAocHJpb3JpdHkpIGl0IHdpbGwgbWFrZSBtb3JlIHJlc291cmNlcyBhdmFpbGFibGUgZm9yIGNvbXBvbmVudHMgYXQKKyAqIGEgbG93ZXIgb3BlcmF0aW5nIHBvaW50LCBzbyBvcGVyYXRpbmcgcmF0ZSBjYW4gYmUgdXNlZCB0byBnYXRlIHRob3NlIGNvbXBvbmVudHMuCisgKgorICogUG9zaXRpdmUgcHJpb3JpdHkgdmFsdWVzIGFyZSBub3QgZGVmaW5lZCBhdCB0aGUgbW9tZW50IGFuZCBzaGFsbCBiZSB0cmVhdGVkIGVxdWl2YWxlbnQgdG8gMC4KKyAqLwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMkludDMyVmFsdWUsIGtQYXJhbUluZGV4UmVhbFRpbWVQcmlvcml0eT4KKyAgICAgICAgQzJSZWFsVGltZVByaW9yaXR5VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUFJJT1JJVFlbXSA9ICJhbGdvLnByaW9yaXR5IjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBwcm90ZWN0ZWQgY29udGVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogU2VjdXJlIG1vZGUuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6c2VjdXJlX21vZGVfdCwgdWludDMyX3QsCisgICAgU01fVU5QUk9URUNURUQsICAgIC8vLzwgbm8gY29udGVudCBwcm90ZWN0aW9uCisgICAgU01fUkVBRF9QUk9URUNURUQsIC8vLzwgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIHNoYWxsIGJlIHByb3RlY3RlZCBmcm9tIHJlYWRpbmcKKykKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpzZWN1cmVfbW9kZV90Piwga1BhcmFtSW5kZXhTZWN1cmVNb2RlPgorICAgICAgICBDMlNlY3VyZU1vZGVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TRUNVUkVfTU9ERVtdID0gImFsZ28uc2VjdXJlLW1vZGUiOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEVOQ09ERVIgQ09NUE9ORU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogQml0cmF0ZQorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleEJpdHJhdGU+IEMyU3RyZWFtQml0cmF0ZUluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9CSVRSQVRFW10gPSAiY29kZWQuYml0cmF0ZSI7CisKKy8qKgorICogQml0cmF0ZSBtb2RlLgorICoKKyAqIFRPRE86IHJlZmluZSB0aGlzIHdpdGggYml0cmF0ZSByYW5nZXMgYW5kIHN1Z2dlc3RlZCB3aW5kb3cKKyAqLworQzJFTlVNKEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdCwgdWludDMyX3QsCisgICAgQklUUkFURV9DT05TVF9TS0lQX0FMTE9XRUQgPSAwLCAgICAgIC8vLzwgY29uc3RhbnQgYml0cmF0ZSwgZnJhbWUgc2tpcHBpbmcgYWxsb3dlZAorICAgIEJJVFJBVEVfQ09OU1QgPSAxLCAgICAgICAgICAgICAgICAgICAvLy88IGNvbnN0YW50IGJpdHJhdGUsIGtlZXAgYWxsIGZyYW1lcworICAgIEJJVFJBVEVfVkFSSUFCTEVfU0tJUF9BTExPV0VEID0gMiwgICAvLy88IGJpdHJhdGUgY2FuIHZhcnksIGZyYW1lIHNraXBwaW5nIGFsbG93ZWQKKyAgICBCSVRSQVRFX1ZBUklBQkxFID0gMywgICAgICAgICAgICAgICAgLy8vPCBiaXRyYXRlIGNhbiB2YXJ5LCBrZWVwIGFsbCBmcmFtZXMKKyAgICBCSVRSQVRFX0lHTk9SRSA9IDcsICAgICAgICAgICAgICAgICAgLy8vPCBiaXRyYXRlIGNhbiBiZSBleGNlZWRlZCBhdCB3aWxsIHRvIGFjaGlldmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBxdWFsaXR5IG9yIG90aGVyIHNldHRpbmdzCisKKyAgICAvLyBiaXRyYXRlIG1vZGVzIGFyZSBjb21wb3NlZCBvZiB0aGUgZm9sbG93aW5nIGZsYWdzCisgICAgQklUUkFURV9GTEFHX0tFRVBfQUxMX0ZSQU1FUyA9IDEsCisgICAgQklUUkFURV9GTEFHX0NBTl9WQVJZID0gMiwKKyAgICBCSVRSQVRFX0ZMQUdfQ0FOX0VYQ0VFRCA9IDQsCispCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4Qml0cmF0ZU1vZGU+CisgICAgICAgIEMyU3RyZWFtQml0cmF0ZU1vZGVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9CSVRSQVRFX01PREVbXSA9ICJhbGdvLmJpdHJhdGUtbW9kZSI7CisKKy8qKgorICogUXVhbGl0eS4KKyAqCisgKiBUaGlzIGlzIGRlZmluZWQgYnkgZWFjaCBjb21wb25lbnQsIHRoZSBoaWdoZXIgdGhlIGJldHRlciB0aGUgb3V0cHV0IHF1YWxpdHkgYXQgdGhlIGV4cGVuc2Ugb2YKKyAqIGxlc3MgY29tcHJlc3Npb24gZWZmaWNpZW5jeS4gVGhpcyBzZXR0aW5nIGlzIGRlZmluZWQgZm9yIHRoZSBvdXRwdXQgc3RyZWFtcyBpbiBjYXNlIHRoZQorICogY29tcG9uZW50IGNhbiBzdXBwb3J0IHZhcnlpbmcgcXVhbGl0eSBvbiBlYWNoIHN0cmVhbSwgb3IgYXMgYW4gb3V0cHV0IHBvcnQgdHVuaW5nIGluIGNhc2UgdGhlCisgKiBxdWFsaXR5IGlzIGdsb2JhbCB0byBhbGwgc3RyZWFtcy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleFF1YWxpdHk+IEMyU3RyZWFtUXVhbGl0eVR1bmluZzsKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4UXVhbGl0eT4gQzJRdWFsaXR5VHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUVVBTElUWVtdID0gImFsZ28ucXVhbGl0eSI7CisKKy8qKgorICogQ29tcGxleGl0eS4KKyAqCisgKiBUaGlzIGlzIGRlZmluZWQgYnkgZWFjaCBjb21wb25lbnQsIHRoaXMgaGlnaGVyIHRoZSB2YWx1ZSwgdGhlIG1vcmUgcmVzb3VyY2VzIHRoZSBjb21wb25lbnQKKyAqIHdpbGwgdXNlIHRvIHByb2R1Y2UgYmV0dGVyIHF1YWxpdHkgYXQgdGhlIHNhbWUgY29tcHJlc3Npb24gZWZmaWNpZW5jeSBvciBiZXR0ZXIgY29tcHJlc3Npb24KKyAqIGVmZmljaWVuY3kgYXQgdGhlIHNhbWUgcXVhbGl0eS4gVGhpcyBzZXR0aW5nIGlzIGRlZmluZWQgZm9yIHRoZSBvdXRwdXQgc3RyZWFtcyBpbiBjYXNlIHRoZQorICogY29tcG9uZW50IGNhbiBzdXBwb3J0IHZhcnlpbmcgY29tcGxleGl0eSBvbiBlYWNoIHN0cmVhbSwgb3IgYXMgYW4gb3V0cHV0IHBvcnQgdHVuaW5nIGluIGNhc2UgdGhlCisgKiBxdWFsaXR5IGlzIGdsb2JhbCB0byBhbGwgc3RyZWFtcworICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4Q29tcGxleGl0eT4gQzJTdHJlYW1Db21wbGV4aXR5VHVuaW5nOwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhDb21wbGV4aXR5PiBDMkNvbXBsZXhpdHlUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT01QTEVYSVRZW10gPSAiYWxnby5jb21wbGV4aXR5IjsKKworLyoqCisgKiBIZWFkZXIgKGluaXQtZGF0YSkgaGFuZGxpbmcgYXJvdW5kIHN5bmMgZnJhbWVzLgorICovCitDMkVOVU0oQzJDb25maWc6OnByZXBlbmRfaGVhZGVyX21vZGVfdCwgdWludDMyX3QsCisgICAgLyoqCisgICAgICogZG9uJ3QgcHJlcGVuZCBoZWFkZXIuIFNpZ25hbCBoZWFkZXIgb25seSB0aHJvdWdoIEMyU3RyZWFtSW5pdERhdGFJbmZvLgorICAgICAqLworICAgIFBSRVBFTkRfSEVBREVSX1RPX05PTkUsCisKKyAgICAvKioKKyAgICAgKiBwcmVwZW5kIGhlYWRlciBiZWZvcmUgdGhlIGZpcnN0IG91dHB1dCBmcmFtZSBhbmQgdGhlcmVhZnRlciBiZWZvcmUgdGhlIG5leHQgc3luYyBmcmFtZQorICAgICAqIGlmIGl0IGNoYW5nZXMuCisgICAgICovCisgICAgUFJFUEVORF9IRUFERVJfT05fQ0hBTkdFLAorCisgICAgLyoqCisgICAgICogcHJlcGVuZCBoZWFkZXIgYmVmb3JlIGV2ZXJ5IHN5bmMgZnJhbWUuCisgICAgICovCisgICAgUFJFUEVORF9IRUFERVJfVE9fQUxMX1NZTkMsCispCisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJDb25maWc6OnByZXBlbmRfaGVhZGVyX21vZGVfdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhQcmVwZW5kSGVhZGVyTW9kZT4KKyAgICAgICAgQzJQcmVwZW5kSGVhZGVyTW9kZVNldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QUkVQRU5EX0hFQURFUl9NT0RFW10gPSAib3V0cHV0LmJ1ZmZlcnMucHJlcGVuZC1oZWFkZXIiOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJTUFHRS9WSURFTyBDT01QT05FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qCisgKiBPcmRlciBvZiB0cmFuc2Zvcm1hdGlvbiBpczoKKyAqCisgKiBjcm9wID0+IChzY2FsaW5nID0+IHNjYWxlZC1jcm9wKSA9PiBzYW1wbGUtYXNwZWN0LXJhdGlvID0+IGZsaXAgPT4gcm90YXRpb24KKyAqLworCisvKioKKyAqIFBpY3R1cmUgKGltYWdlLSBhbmQgdmlkZW8gZnJhbWUpIHNpemUuCisgKgorICogVGhpcyBpcyB1c2VkIGZvciB0aGUgb3V0cHV0IG9mIHRoZSB2aWRlbyBkZWNvZGVyLCBhbmQgdGhlIGlucHV0IG9mIHRoZSB2aWRlbyBlbmNvZGVyLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlBpY3R1cmVTaXplU3RydWN0LCBrUGFyYW1JbmRleFBpY3R1cmVTaXplPiBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRVtdID0gInJhdy5zaXplIjsKKworLyoqCisgKiBDcm9wIHJlY3RhbmdsZS4KKyAqLworc3RydWN0IEMyUmVjdFN0cnVjdCA6IEMyUmVjdCB7CisgICAgQzJSZWN0U3RydWN0KCkgPSBkZWZhdWx0OworICAgIEMyUmVjdFN0cnVjdChjb25zdCBDMlJlY3QgJnJlY3QpIDogQzJSZWN0KHJlY3QpIHsgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEMyUmVjdFN0cnVjdCAmKSA9IGRlbGV0ZTsKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgQzJSZWN0U3RydWN0ICYpID0gZGVsZXRlOworCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9CQVNFX0MyU1RSVUNUKFJlY3QpCisgICAgQzJGSUVMRCh3aWR0aCwgIndpZHRoIikKKyAgICBDMkZJRUxEKGhlaWdodCwgImhlaWdodCIpCisgICAgQzJGSUVMRChsZWZ0LCAibGVmdCIpCisgICAgQzJGSUVMRCh0b3AsICJ0b3AiKQorfTsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJSZWN0U3RydWN0LCBrUGFyYW1JbmRleENyb3BSZWN0PiBDMlN0cmVhbUNyb3BSZWN0SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NST1BfUkVDVFtdID0gInJhdy5jcm9wIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPREVEX0NST1BfUkVDVFtdID0gImNvZGVkLmNyb3AiOworCisvKioKKyAqIFBpeGVsIGZvcm1hdC4KKyAqLworLy8gVE9ETzogZGVmaW5lIHNvbWUKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhQaXhlbEZvcm1hdD4gQzJTdHJlYW1QaXhlbEZvcm1hdEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVRbXSA9ICJyYXcucGl4ZWwtZm9ybWF0IjsKKworLyoqCisgKiBFeHRlbmRlZCByb3RhdGlvbiBpbmZvcm1hdGlvbiBhbHNvIGluY29ycG9yYXRpbmcgYSBmbGlwLgorICoKKyAqIFJvdGF0aW9uIGlzIGNvdW50ZXIgY2xvY2std2lzZS4KKyAqLworc3RydWN0IEMyUm90YXRpb25TdHJ1Y3QgeworICAgIEMyUm90YXRpb25TdHJ1Y3QoaW50MzJfdCByb3RhdGlvbiA9IDApCisgICAgICAgIDogZmxpcCgwKSwgdmFsdWUocm90YXRpb24pIHsgfQorCisgICAgaW50MzJfdCBmbGlwOyAgIC8vLzwgaG9yaXpvbnRhbCBmbGlwIChsZWZ0LXJpZ2h0IGZsaXAgYXBwbGllZCBwcmlvciB0byByb3RhdGlvbikKKyAgICBpbnQzMl90IHZhbHVlOyAgLy8vPCByb3RhdGlvbiBpbiBkZWdyZWVzIGNvdW50ZXIgY2xvY2t3aXNlCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfQzJTVFJVQ1QoUm90YXRpb24pCisgICAgQzJGSUVMRChmbGlwLCAiZmxpcCIpCisgICAgQzJGSUVMRCh2YWx1ZSwgInZhbHVlIikKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyUm90YXRpb25TdHJ1Y3QsIGtQYXJhbUluZGV4Um90YXRpb24+IEMyU3RyZWFtUm90YXRpb25JbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUk9UQVRJT05bXSA9ICJyYXcucm90YXRpb24iOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVlVJX1JPVEFUSU9OW10gPSAiY29kZWQudnVpLnJvdGF0aW9uIjsKKworLyoqCisgKiBQaXhlbCAoc2FtcGxlKSBhc3BlY3QgcmF0aW8uCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyUGljdHVyZVNpemVTdHJ1Y3QsIGtQYXJhbUluZGV4UGl4ZWxBc3BlY3RSYXRpbz4KKyAgICAgICAgQzJTdHJlYW1QaXhlbEFzcGVjdFJhdGlvSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1BJWEVMX0FTUEVDVF9SQVRJT1tdID0gInJhdy5zYXIiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVlVJX1BJWEVMX0FTUEVDVF9SQVRJT1tdID0gImNvZGVkLnZ1aS5zYXIiOworCisvKioKKyAqIEluLWxpbmUgc2NhbGluZy4KKyAqCisgKiBDb21wb25lbnRzIGNhbiBvcHRpb25hbGx5IHN1cHBvcnQgc2NhbGluZyBvZiByYXcgaW1hZ2UvdmlkZW8gZnJhbWVzLiAgT3Igc2NhbGluZyBvbmx5IGEKKyAqIHBvcnRpb24gb2YgcmF3IGltYWdlL3ZpZGVvIGZyYW1lcyAoc2NhbGVkLWNyb3ApLgorICovCisKK0MyRU5VTShDMkNvbmZpZzo6c2NhbGluZ19tZXRob2RfdCwgdWludDMyX3QsCisgICAgU0NBTElOR19BUkJJVFJBUlksICAgLy8vPCBhcmJpdHJhcnksIHVuc3BlY2lmaWVkCispCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6c2NhbGluZ19tZXRob2RfdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhTY2FsaW5nTWV0aG9kPgorICAgICAgICBDMlN0cmVhbVNjYWxpbmdNZXRob2RUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TQ0FMSU5HX01PREVbXSA9ICJyYXcuc2NhbGluZy1tZXRob2QiOworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyUGljdHVyZVNpemVTdHJ1Y3QsIGtQYXJhbUluZGV4U2NhbGVkUGljdHVyZVNpemU+CisgICAgICAgIEMyU3RyZWFtU2NhbGVkUGljdHVyZVNpemVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TQ0FMRURfUElDVFVSRV9TSVpFW10gPSAicmF3LnNjYWxlZC1zaXplIjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlJlY3RTdHJ1Y3QsIGtQYXJhbUluZGV4U2NhbGVkQ3JvcFJlY3Q+CisgICAgICAgIEMyU3RyZWFtU2NhbGVkQ3JvcFJlY3RUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9TQ0FMRURfQ1JPUF9SRUNUW10gPSAicmF3LnNjYWxlZC1jcm9wIjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjb2xvciBpbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogQ29sb3IgSW5mbworICoKKyAqIENocm9tYSBsb2NhdGlvbiBjYW4gdmFyeSBmb3IgdG9wIGFuZCBib3R0b20gZmllbGRzLCBzbyB1c2UgYW4gYXJyYXksIHRoYXQgY2FuIGhhdmUgMCB0byAyCisgKiB2YWx1ZXMuIEVtcHR5IGFycmF5IGlzIHVzZWQgZm9yIG5vbiBZVVYgZm9ybWF0cy4KKyAqLworCitzdHJ1Y3QgQzJDb2xvciB7CisgICAgZW51bSBtYXRyaXhfdCA6IHVpbnQzMl90OyAgLy8vPCBtYXRyaXggY29lZmZpY2llbnQgKFlVViA8PT4gUkdCKQorICAgIGVudW0gcGxhbmVfbGF5b3V0X3QgOiB1aW50MzJfdDsgIC8vLzwgcGxhbmUgbGF5b3V0IGZvciBmbGV4aWJsZSBmb3JtYXRzCisgICAgZW51bSBwcmltYXJpZXNfdCA6IHVpbnQzMl90OyAgLy8vPCBjb2xvciBwcmltYXJpZXMgYW5kIHdoaXRlIHBvaW50CisgICAgZW51bSByYW5nZV90IDogdWludDMyX3Q7ICAvLy88IHJhbmdlIG9mIGNvbG9yIGNvbXBvbmVudCB2YWx1ZXMKKyAgICBlbnVtIHN1YnNhbXBsaW5nX3QgOiB1aW50MzJfdDsgIC8vLzwgY2hyb21hIHN1YnNhbXBsaW5nCisgICAgZW51bSB0cmFuc2Zlcl90IDogdWludDMyX3Q7ICAvLy88IHRyYW5zZmVyIGZ1bmN0aW9uCit9OworCisvLy8gQ2hyb21hIHN1YnNhbXBsaW5nCitDMkVOVU0oQzJDb2xvcjo6c3Vic2FtcGxpbmdfdCwgdWludDMyX3QsCisgICAgTU9OT0NIUk9NRSwgICAgIC8vLzwgdGhlcmUgYXJlIG5vIENyIG5vciBDYiBwbGFuZXMKKyAgICBNT05PQ0hST01FX0FMUEhBLCAvLy88IHRoZXJlIGFyZSBubyBDciBub3IgQ2IgcGxhbmVzLCBidXQgdGhlcmUgaXMgYW4gYWxwaGEgcGxhbmUKKyAgICBSR0IsICAgICAgICAgICAgLy8vPCBSR0IKKyAgICBSR0JBLCAgICAgICAgICAgLy8vPCBSR0JBCisgICAgWVVWXzQyMCwgICAgICAgIC8vLzwgQ3IgYW5kIENiIHBsYW5lcyBhcmUgc3Vic2FtcGxlZCBieSAyIGJvdGggaG9yaXpvbnRhbGx5IGFuZCB2ZXJ0aWNhbGx5CisgICAgWVVWXzQyMiwgICAgICAgIC8vLzwgQ3IgYW5kIENiIHBsYW5lcyBhcmUgc3Vic2FtcGxlZCBob3Jpem9udGFsbHkKKyAgICBZVVZfNDQ0LCAgICAgICAgLy8vPCBDciBhbmQgQ2IgcGxhbmVzIGFyZSBub3Qgc3Vic2FtcGxlZAorICAgIFlVVkFfNDQ0LCAgICAgICAvLy88IENyIGFuZCBDYiBwbGFuZXMgYXJlIG5vdCBzdWJzYW1wbGVkLCB0aGVyZSBpcyBhbiBhbHBoYSBwbGFuZQorKQorCitzdHJ1Y3QgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgeworICAgIC8vIGNocm9tYSBvZmZzZXRzIGRlZmluZWQgYnkgSVRVCisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQ0NCgpIHsgcmV0dXJuIHsgMC4wZiwgMC4wZiB9OyB9CisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQyMigpIHsgcmV0dXJuIHsgMC4wZiwgMC4wZiB9OyB9CisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQyMF8wKCkgeyByZXR1cm4geyAwLjBmLCAwLjVmIH07IH0KKyAgICBjb25zdGV4cHIgc3RhdGljIEMyQ2hyb21hT2Zmc2V0U3RydWN0IElUVV9ZVVZfNDIwXzEoKSB7IHJldHVybiB7IDAuNWYsIDAuNWYgfTsgfQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80MjBfMigpIHsgcmV0dXJuIHsgMC4wZiwgMC4wZiB9OyB9CisgICAgY29uc3RleHByIHN0YXRpYyBDMkNocm9tYU9mZnNldFN0cnVjdCBJVFVfWVVWXzQyMF8zKCkgeyByZXR1cm4geyAwLjVmLCAwLjBmIH07IH0KKyAgICBjb25zdGV4cHIgc3RhdGljIEMyQ2hyb21hT2Zmc2V0U3RydWN0IElUVV9ZVVZfNDIwXzQoKSB7IHJldHVybiB7IDAuMGYsIDEuMGYgfTsgfQorICAgIGNvbnN0ZXhwciBzdGF0aWMgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgSVRVX1lVVl80MjBfNSgpIHsgcmV0dXJuIHsgMC41ZiwgMS4wZiB9OyB9CisKKyAgICBmbG9hdCB4OyAgICAvLy88IHggb2Zmc2V0IGluIHBpeGVscyAodG93YXJkcyByaWdodCkKKyAgICBmbG9hdCB5OyAgICAvLy88IHkgb2Zmc2V0IGluIHBpeGVscyAodG93YXJkcyBkb3duKQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChDaHJvbWFPZmZzZXQpCisgICAgQzJGSUVMRCh4LCAieCIpCisgICAgQzJGSUVMRCh5LCAieSIpCit9OworCitzdHJ1Y3QgQzJDb2xvckluZm9TdHJ1Y3QgeworICAgIEMyQ29sb3JJbmZvU3RydWN0KCkKKyAgICAgICAgOiBiaXREZXB0aCg4KSwgc3Vic2FtcGxpbmcoQzJDb2xvcjo6WVVWXzQyMCkgeyB9CisKKyAgICB1aW50MzJfdCBiaXREZXB0aDsKKyAgICBDMkNvbG9yOjpzdWJzYW1wbGluZ190IHN1YnNhbXBsaW5nOworICAgIEMyQ2hyb21hT2Zmc2V0U3RydWN0IGxvY2F0aW9uc1tdOyAvLyBtYXggMiBlbGVtZW50cworCisgICAgQzJDb2xvckluZm9TdHJ1Y3QoCisgICAgICAgICAgICBzaXplX3QgLyogZmxleENvdW50ICovLCB1aW50MzJfdCBiaXREZXB0aF8sIEMyQ29sb3I6OnN1YnNhbXBsaW5nX3Qgc3Vic2FtcGxpbmdfKQorICAgICAgICA6IGJpdERlcHRoKGJpdERlcHRoXyksIHN1YnNhbXBsaW5nKHN1YnNhbXBsaW5nXykgeyB9CisKKyAgICBDMkNvbG9ySW5mb1N0cnVjdCgKKyAgICAgICAgICAgIHNpemVfdCBmbGV4Q291bnQsIHVpbnQzMl90IGJpdERlcHRoXywgQzJDb2xvcjo6c3Vic2FtcGxpbmdfdCBzdWJzYW1wbGluZ18sCisgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8QzJDaHJvbWFPZmZzZXRTdHJ1Y3Q+IGxvY2F0aW9uc18pCisgICAgICAgIDogYml0RGVwdGgoYml0RGVwdGhfKSwgc3Vic2FtcGxpbmcoc3Vic2FtcGxpbmdfKSB7CisgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgIGZvciAoY29uc3QgQzJDaHJvbWFPZmZzZXRTdHJ1Y3QgJmxvY2F0aW9uIDogbG9jYXRpb25zXykgeworICAgICAgICAgICAgaWYgKGl4ID09IGZsZXhDb3VudCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbG9jYXRpb25zW2l4XSA9IGxvY2F0aW9uOworICAgICAgICAgICAgKytpeDsKKyAgICAgICAgfQorICAgIH0KKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChDb2xvckluZm8sIGxvY2F0aW9ucykKKyAgICBDMkZJRUxEKGJpdERlcHRoLCAiYml0LWRlcHRoIikKKyAgICBDMkZJRUxEKHN1YnNhbXBsaW5nLCAic3Vic2FtcGxpbmciKQorICAgIEMyRklFTEQobG9jYXRpb25zLCAibG9jYXRpb25zIikKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyQ29sb3JJbmZvU3RydWN0LCBrUGFyYW1JbmRleENvbG9ySW5mbz4gQzJTdHJlYW1Db2xvckluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0xPUl9JTkZPW10gPSAicmF3LmNvbG9yLWZvcm1hdCI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0RFRF9DT0xPUl9JTkZPW10gPSAiY29kZWQuY29sb3ItZm9ybWF0IjsKKworLyoqCisgKiBDb2xvciBBc3BlY3RzCisgKi8KKworLyogVGhlIG1lYW5pbmcgb2YgdGhlIGZvbGxvd2luZyBlbnVtZXJhdG9ycyBpcyBhcyBkZXNjcmliZWQgaW4gSVRVLVQgSC4yNzMuICovCisKKy8vLyBSYW5nZQorQzJFTlVNKEMyQ29sb3I6OnJhbmdlX3QsIHVpbnQzMl90LAorICAgIFJBTkdFX1VOU1BFQ0lGSUVELCAgICAgICAgICAvLy88IHJhbmdlIGlzIHVuc3BlY2lmaWVkCisgICAgUkFOR0VfRlVMTCwgICAgICAgICAgICAgICAgIC8vLzwgZnVsbCByYW5nZQorICAgIFJBTkdFX0xJTUlURUQsICAgICAgICAgICAgICAvLy88IGxpbWl0ZWQgcmFuZ2UKKworICAgIFJBTkdFX1ZFTkRPUl9TVEFSVCA9IDB4ODAsICAvLy88IHZlbmRvci1zcGVjaWZpYyByYW5nZSB2YWx1ZXMgc3RhcnQgaGVyZQorICAgIFJBTkdFX09USEVSID0gMFhGRiAgICAgICAgICAvLy88IG1heCB2YWx1ZSwgcmVzZXJ2ZWQgZm9yIHVuZGVmaW5lZCB2YWx1ZXMKKykKKworLy8vIENvbG9yIHByaW1hcmllcworQzJFTlVNKEMyQ29sb3I6OnByaW1hcmllc190LCB1aW50MzJfdCwKKyAgICBQUklNQVJJRVNfVU5TUEVDSUZJRUQsICAgICAgICAgIC8vLzwgcHJpbWFyaWVzIGFyZSB1bnNwZWNpZmllZAorICAgIFBSSU1BUklFU19CVDcwOSwgICAgICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuNzA5LTYgb3IgZXF1aXZhbGVudAorICAgIFBSSU1BUklFU19CVDQ3MF9NLCAgICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuNDcwLTYgU3lzdGVtIE0gb3IgZXF1aXZhbGVudAorICAgIFBSSU1BUklFU19CVDYwMV82MjUsICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuNjAxLTYgNjI1IG9yIGVxdWl2YWxlbnQKKyAgICBQUklNQVJJRVNfQlQ2MDFfNTI1LCAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjYwMS02IDUyNSBvciBlcXVpdmFsZW50CisgICAgUFJJTUFSSUVTX0dFTkVSSUNfRklMTSwgICAgICAgICAvLy88IEdlbmVyaWMgRmlsbQorICAgIFBSSU1BUklFU19CVDIwMjAsICAgICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuMjAyMCBvciBlcXVpdmFsZW50CisgICAgUFJJTUFSSUVTX1JQNDMxLCAgICAgICAgICAgICAgICAvLy88IFNNUFRFIFJQIDQzMS0yIG9yIGVxdWl2YWxlbnQKKyAgICBQUklNQVJJRVNfRUc0MzIsICAgICAgICAgICAgICAgIC8vLzwgU01QVEUgRUcgNDMyLTEgb3IgZXF1aXZhbGVudAorICAgIFBSSU1BUklFU19FQlUzMjEzLCAgICAgICAgICAgICAgLy8vPCBFQlUgVGVjaC4zMjEzLUUgb3IgZXF1aXZhbGVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vCisgICAgUFJJTUFSSUVTX1ZFTkRPUl9TVEFSVCA9IDB4ODAsICAvLy88IHZlbmRvci1zcGVjaWZpYyBwcmltYXJpZXMgdmFsdWVzIHN0YXJ0IGhlcmUKKyAgICBQUklNQVJJRVNfT1RIRVIgPSAweGZmICAgICAgICAgIC8vLzwgbWF4IHZhbHVlLCByZXNlcnZlZCBmb3IgdW5kZWZpbmVkIHZhbHVlcworKQorCisvLy8gVHJhbnNmZXIgZnVuY3Rpb24KK0MyRU5VTShDMkNvbG9yOjp0cmFuc2Zlcl90LCB1aW50MzJfdCwKKyAgICBUUkFOU0ZFUl9VTlNQRUNJRklFRCwgICAgICAgICAgIC8vLzwgdHJhbnNmZXIgaXMgdW5zcGVjaWZpZWQKKyAgICBUUkFOU0ZFUl9MSU5FQVIsICAgICAgICAgICAgICAgIC8vLzwgTGluZWFyIHRyYW5zZmVyIGNoYXJhY3RlcmlzdGljcworICAgIFRSQU5TRkVSX1NSR0IsICAgICAgICAgICAgICAgICAgLy8vPCBzUkdCIG9yIGVxdWl2YWxlbnQKKyAgICBUUkFOU0ZFUl8xNzBNLCAgICAgICAgICAgICAgICAgIC8vLzwgU01QVEUgMTcwTSBvciBlcXVpdmFsZW50IChlLmcuIEJULjYwMS83MDkvMjAyMCkKKyAgICBUUkFOU0ZFUl9HQU1NQTIyLCAgICAgICAgICAgICAgIC8vLzwgQXNzdW1lZCBkaXNwbGF5IGdhbW1hIDIuMgorICAgIFRSQU5TRkVSX0dBTU1BMjgsICAgICAgICAgICAgICAgLy8vPCBBc3N1bWVkIGRpc3BsYXkgZ2FtbWEgMi44CisgICAgVFJBTlNGRVJfU1QyMDg0LCAgICAgICAgICAgICAgICAvLy88IFNNUFRFIFNUIDIwODQgZm9yIDEwLzEyLzE0LzE2IGJpdCBzeXN0ZW1zCisgICAgVFJBTlNGRVJfSExHLCAgICAgICAgICAgICAgICAgICAvLy88IEFSSUIgU1RELUI2NyBoeWJyaWQtbG9nLWdhbW1hCisKKyAgICBUUkFOU0ZFUl8yNDBNID0gMHg0MCwgICAgICAgICAgIC8vLzwgU01QVEUgMjQwTSBvciBlcXVpdmFsZW50CisgICAgVFJBTlNGRVJfWFZZQ0MsICAgICAgICAgICAgICAgICAvLy88IElFQyA2MTk2Ni0yLTQgb3IgZXF1aXZhbGVudAorICAgIFRSQU5TRkVSX0JUMTM2MSwgICAgICAgICAgICAgICAgLy8vPCBSZWMuSVRVLVIgQlQuMTM2MSBleHRlbmRlZCBnYW11dAorICAgIFRSQU5TRkVSX1NUNDI4LCAgICAgICAgICAgICAgICAgLy8vPCBTTVBURSBTVCA0MjgtMSBvciBlcXVpdmFsZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8KKyAgICBUUkFOU0ZFUl9WRU5ET1JfU1RBUlQgPSAweDgwLCAgIC8vLzwgdmVuZG9yLXNwZWNpZmljIHRyYW5zZmVyIHZhbHVlcyBzdGFydCBoZXJlCisgICAgVFJBTlNGRVJfT1RIRVIgPSAweGZmICAgICAgICAgICAvLy88IG1heCB2YWx1ZSwgcmVzZXJ2ZWQgZm9yIHVuZGVmaW5lZCB2YWx1ZXMKKykKKworLy8vIE1hdHJpeCBjb2VmZmljaWVudAorQzJFTlVNKEMyQ29sb3I6Om1hdHJpeF90LCB1aW50MzJfdCwKKyAgICBNQVRSSVhfVU5TUEVDSUZJRUQsICAgICAgICAgICAgIC8vLzwgbWF0cml4IGNvZWZmaWNpZW50cyBhcmUgdW5zcGVjaWZpZWQKKyAgICBNQVRSSVhfQlQ3MDksICAgICAgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjcwOS01IG9yIGVxdWl2YWxlbnQKKyAgICBNQVRSSVhfRkNDNDdfNzNfNjgyLCAgICAgICAgICAgIC8vLzwgRkNDIFRpdGxlIDQ3IENGUiA3My42ODIgb3IgZXF1aXZhbGVudCAoS1I9MC4zMCwgS0I9MC4xMSkKKyAgICBNQVRSSVhfQlQ2MDEsICAgICAgICAgICAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjQ3MCwgQlQuNjAxLTYgNjI1IG9yIGVxdWl2YWxlbnQKKyAgICBNQVRSSVhfMjQwTSwgICAgICAgICAgICAgICAgICAgIC8vLzwgU01QVEUgMjQwTSBvciBlcXVpdmFsZW50CisgICAgTUFUUklYX0JUMjAyMCwgICAgICAgICAgICAgICAgICAvLy88IFJlYy5JVFUtUiBCVC4yMDIwIG5vbi1jb25zdGFudCBsdW1pbmFuY2UKKyAgICBNQVRSSVhfQlQyMDIwX0NPTlNUQU5ULCAgICAgICAgIC8vLzwgUmVjLklUVS1SIEJULjIwMjAgY29uc3RhbnQgbHVtaW5hbmNlCisgICAgTUFUUklYX1ZFTkRPUl9TVEFSVCA9IDB4ODAsICAgICAvLy88IHZlbmRvci1zcGVjaWZpYyBtYXRyaXggY29lZmZpY2llbnQgdmFsdWVzIHN0YXJ0IGhlcmUKKyAgICBNQVRSSVhfT1RIRVIgPSAweGZmLCAgICAgICAgICAgIC8vLzwgbWF4IHZhbHVlLCByZXNlcnZlZCBmb3IgdW5kZWZpbmVkIHZhbHVlcworKQorCitzdHJ1Y3QgQzJDb2xvckFzcGVjdHNTdHJ1Y3QgeworICAgIEMyQ29sb3I6OnJhbmdlX3QgcmFuZ2U7CisgICAgQzJDb2xvcjo6cHJpbWFyaWVzX3QgcHJpbWFyaWVzOworICAgIEMyQ29sb3I6OnRyYW5zZmVyX3QgdHJhbnNmZXI7CisgICAgQzJDb2xvcjo6bWF0cml4X3QgbWF0cml4OworCisgICAgQzJDb2xvckFzcGVjdHNTdHJ1Y3QoKQorICAgICAgICA6IHJhbmdlKEMyQ29sb3I6OlJBTkdFX1VOU1BFQ0lGSUVEKSwKKyAgICAgICAgICBwcmltYXJpZXMoQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVEKSwKKyAgICAgICAgICB0cmFuc2ZlcihDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCksCisgICAgICAgICAgbWF0cml4KEMyQ29sb3I6Ok1BVFJJWF9VTlNQRUNJRklFRCkgeyB9CisKKyAgICBDMkNvbG9yQXNwZWN0c1N0cnVjdChDMkNvbG9yOjpyYW5nZV90IHJhbmdlXywgQzJDb2xvcjo6cHJpbWFyaWVzX3QgcHJpbWFyaWVzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMkNvbG9yOjp0cmFuc2Zlcl90IHRyYW5zZmVyXywgQzJDb2xvcjo6bWF0cml4X3QgbWF0cml4XykKKyAgICAgICAgOiByYW5nZShyYW5nZV8pLCBwcmltYXJpZXMocHJpbWFyaWVzXyksIHRyYW5zZmVyKHRyYW5zZmVyXyksIG1hdHJpeChtYXRyaXhfKSB7fQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChDb2xvckFzcGVjdHMpCisgICAgQzJGSUVMRChyYW5nZSwgInJhbmdlIikKKyAgICBDMkZJRUxEKHByaW1hcmllcywgInByaW1hcmllcyIpCisgICAgQzJGSUVMRCh0cmFuc2ZlciwgInRyYW5zZmVyIikKKyAgICBDMkZJRUxEKG1hdHJpeCwgIm1hdHJpeCIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkNvbG9yQXNwZWN0c1N0cnVjdCwga1BhcmFtSW5kZXhDb2xvckFzcGVjdHM+CisgICAgICAgIEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFNbXSA9ICJyYXcuY29sb3IiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFNbXSA9ICJjb2RlZC52dWkuY29sb3IiOworCisvKioKKyAqIERlZmF1bHQgY29sb3IgYXNwZWN0cyB0byB1c2UuIFRoZXNlIGNvbWUgZnJvbSB0aGUgY29udGFpbmVyIG9yIGNsaWVudCBhbmQgc2hhbGwgYmUgaGFuZGxlZAorICogYWNjb3JkaW5nIHRvIHRoZSBjb2Rpbmcgc3RhbmRhcmQuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJDb2xvckFzcGVjdHNTdHJ1Y3QsIGtQYXJhbUluZGV4RGVmYXVsdENvbG9yQXNwZWN0cz4KKyAgICAgICAgQzJTdHJlYW1Db2xvckFzcGVjdHNUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFNbXSA9ICJkZWZhdWx0LmNvbG9yIjsKKworLyoqCisgKiBIRFIgU3RhdGljIE1ldGFkYXRhIEluZm8uCisgKi8KK3N0cnVjdCBDMkNvbG9yWHlTdHJ1Y3QgeworICAgIGZsb2F0IHg7IC8vLzwgeCBjb2xvciBjb29yZGluYXRlIGluIHh5WSBzcGFjZSBbMC0xXQorICAgIGZsb2F0IHk7IC8vLzwgeSBjb2xvciBjb29yZGluYXRlIGluIHh5WSBzcGFjZSBbMC0xXQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChDb2xvclh5KQorICAgIEMyRklFTEQoeCwgIngiKQorICAgIEMyRklFTEQoeSwgInkiKQorfTsKKworc3RydWN0IEMyTWFzdGVyaW5nRGlzcGxheUNvbG9yVm9sdW1lU3RydWN0IHsKKyAgICBDMkNvbG9yWHlTdHJ1Y3QgcmVkOyAgICAvLy88IGNvb3JkaW5hdGVzIG9mIHJlZCBkaXNwbGF5IHByaW1hcnkKKyAgICBDMkNvbG9yWHlTdHJ1Y3QgZ3JlZW47ICAvLy88IGNvb3JkaW5hdGVzIG9mIGdyZWVuIGRpc3BsYXkgcHJpbWFyeQorICAgIEMyQ29sb3JYeVN0cnVjdCBibHVlOyAgIC8vLzwgY29vcmRpbmF0ZXMgb2YgYmx1ZSBkaXNwbGF5IHByaW1hcnkKKyAgICBDMkNvbG9yWHlTdHJ1Y3Qgd2hpdGU7ICAvLy88IGNvb3JkaW5hdGVzIG9mIHdoaXRlIHBvaW50CisKKyAgICBmbG9hdCBtYXhMdW1pbmFuY2U7ICAvLy88IG1heCBkaXNwbGF5IG1hc3RlcmluZyBsdW1pbmFuY2UgaW4gY2QvbV4yCisgICAgZmxvYXQgbWluTHVtaW5hbmNlOyAgLy8vPCBtaW4gZGlzcGxheSBtYXN0ZXJpbmcgbHVtaW5hbmNlIGluIGNkL21eMgorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChNYXN0ZXJpbmdEaXNwbGF5Q29sb3JWb2x1bWUpCisgICAgQzJGSUVMRChyZWQsICJyZWQiKQorICAgIEMyRklFTEQoZ3JlZW4sICJncmVlbiIpCisgICAgQzJGSUVMRChibHVlLCAiYmx1ZSIpCisgICAgQzJGSUVMRCh3aGl0ZSwgIndoaXRlIikKKworICAgIEMyRklFTEQobWF4THVtaW5hbmNlLCAibWF4LWx1bWluYW5jZSIpCisgICAgQzJGSUVMRChtaW5MdW1pbmFuY2UsICJtaW4tbHVtaW5hbmNlIikKK307CisKK3N0cnVjdCBDMkhkclN0YXRpY01ldGFkYXRhU3RydWN0IHsKKyAgICBDMk1hc3RlcmluZ0Rpc3BsYXlDb2xvclZvbHVtZVN0cnVjdCBtYXN0ZXJpbmc7CisKKyAgICAvLyBjb250ZW50IGRlc2NyaXB0b3JzCisgICAgZmxvYXQgbWF4Q2xsOyAgLy8vPCBtYXggY29udGVudCBsaWdodCBsZXZlbCAocGl4ZWwgbHVtaW5hbmNlKSBpbiBjZC9tXjIKKyAgICBmbG9hdCBtYXhGYWxsOyAvLy88IG1heCBmcmFtZSBhdmVyYWdlIGxpZ2h0IGxldmVsIChmcmFtZSBsdW1pbmFuY2UpIGluIGNkL21eMgorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9CQVNFX0MyU1RSVUNUKEhkclN0YXRpY01ldGFkYXRhKQorICAgIEMyRklFTEQobWFzdGVyaW5nLCAibWFzdGVyaW5nIikKKyAgICBDMkZJRUxEKG1heENsbCwgIm1heC1jbGwiKQorICAgIEMyRklFTEQobWF4RmFsbCwgIm1heC1mYWxsIikKK307Cit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMkhkclN0YXRpY01ldGFkYXRhU3RydWN0LCBrUGFyYW1JbmRleEhkclN0YXRpY01ldGFkYXRhPgorICAgICAgICBDMlN0cmVhbUhkclN0YXRpY0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk9bXSA9ICJyYXcuaGRyLXN0YXRpYy1pbmZvIjsKKworLyoqCisgKiBIRFIxMCsgTWV0YWRhdGEgSW5mby4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJCbG9iVmFsdWUsIGtQYXJhbUluZGV4SGRyMTBQbHVzTWV0YWRhdGE+CisgICAgICAgIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX0hEUjEwX1BMVVNfSU5GT1tdID0gImlucHV0LmhkcjEwLXBsdXMtaW5mbyI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9PVVRQVVRfSERSMTBfUExVU19JTkZPW10gPSAib3V0cHV0LmhkcjEwLXBsdXMtaW5mbyI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBibG9jay1iYXNlZCBjb2RpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBCbG9jay1zaXplLCBibG9jayBjb3VudCBhbmQgYmxvY2sgcmF0ZS4gVXNlZCB0byBkZXRlcm1pbmUgb3IgY29tbXVuaWNhdGUgcHJvZmlsZS1sZXZlbAorICogcmVxdWlyZW1lbnRzLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlBpY3R1cmVTaXplU3RydWN0LCBrUGFyYW1JbmRleEJsb2NrU2l6ZT4gQzJTdHJlYW1CbG9ja1NpemVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQkxPQ0tfU0laRVtdID0gImNvZGVkLmJsb2NrLXNpemUiOworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleEJsb2NrQ291bnQ+IEMyU3RyZWFtQmxvY2tDb3VudEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9CTE9DS19DT1VOVFtdID0gImNvZGVkLmJsb2NrLWNvdW50IjsKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleEJsb2NrUmF0ZT4gQzJTdHJlYW1CbG9ja1JhdGVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQkxPQ0tfUkFURVtdID0gImNvZGVkLmJsb2NrLXJhdGUiOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBWSURFTyBDT01QT05FTlRTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogRnJhbWUgcmF0ZSAoY29kZWQgYW5kIHBvcnQgZm9yIHJhdyBkYXRhKQorICoKKyAqIENvZGVkIGZyYW1lIHJhdGVzIGFyZSB3aGF0IGlzIHJlcHJlc2VudGVkIGluIHRoZSBjb21wcmVzc2VkIGJpdHN0cmVhbSBhbmQgc2hvdWxkIGNvcnJlc3BvbmQgdG8KKyAqIHRoZSB0aW1lc3RhbXAuCisgKgorICogRnJhbWUgcmF0ZXMgb24gcmF3IHBvcnRzIHNob3VsZCBzdGlsbCBjb3JyZXNwb25kIHRvIHRoZSB0aW1lc3RhbXBzLgorICoKKyAqIEZvciBzbG93IG1vdGlvbiBvciB0aW1lbGFwc2UgcmVjb3JkaW5nLCB0aGUgdGltZXN0YW1wIHNoYWxsIGJlIGFkanVzdGVkIHByaW9yIHRvIGZlZWRpbmcgYW4KKyAqIGVuY29kZXIsIGFuZCB0aGUgdGltZSBzdHJldGNoIHBhcmFtZXRlciBzaG91bGQgYmUgdXNlZCB0byBzaWduYWwgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuCisgKiB0aW1lc3RhbXAgYW5kIHJlYWwtd29ybGQgdGltZS4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleEZyYW1lUmF0ZT4gQzJTdHJlYW1GcmFtZVJhdGVJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRlJBTUVfUkFURVtdID0gImNvZGVkLmZyYW1lLXJhdGUiOworCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleEZyYW1lUmF0ZT4gQzJQb3J0RnJhbWVSYXRlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX0ZSQU1FX1JBVEVbXSA9ICJpbnB1dC5mcmFtZS1yYXRlIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9GUkFNRV9SQVRFW10gPSAib3V0cHV0LmZyYW1lLXJhdGUiOworCisvKioKKyAqIFRpbWUgc3RyZXRjaC4gUmF0aW8gYmV0d2VlbiByZWFsLXdvcmxkIHRpbWUgYW5kIHRpbWVzdGFtcC4gRS5nLiB0aW1lIHN0cmV0Y2ggb2YgNC4wIG1lYW5zIHRoYXQKKyAqIHRpbWVzdGFtcCBncm93cyAxLzQgdGhlIHNwZWVkIG9mIHJlYWwtd29ybGQgdGltZSAoZS5nLiA0eCBzbG8tbW8gaW5wdXQpLiBUaGlzIGNhbiBiZSB1c2VkIHRvCisgKiBvcHRpbWl6ZSBlbmNvZGluZy4KKyAqLwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhUaW1lU3RyZXRjaD4gQzJQb3J0VGltZVN0cmV0Y2hJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfVElNRV9TVFJFVENIW10gPSAiaW5wdXQudGltZS1zdHJldGNoIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX09VVFBVVF9USU1FX1NUUkVUQ0hbXSA9ICJvdXRwdXQudGltZS1zdHJldGNoIjsKKworLyoqCisgKiBNYXggdmlkZW8gZnJhbWUgc2l6ZS4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlBpY3R1cmVTaXplU3RydWN0LCBrUGFyYW1JbmRleE1heFBpY3R1cmVTaXplPgorICAgICAgICBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nOwordHlwZWRlZiBDMlN0cmVhbU1heFBpY3R1cmVTaXplVHVuaW5nIEMyTWF4VmlkZW9TaXplSGludFBvcnRTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRVtdID0gInJhdy5tYXgtc2l6ZSI7CisKKy8qKgorICogUGljdHVyZSB0eXBlIG1hc2suCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QsIHVpbnQzMl90LAorICAgIFNZTkNfRlJBTUUgPSAoMSA8PCAwKSwgIC8vLzwgc3luYyBmcmFtZSwgZS5nLiBJRFIKKyAgICBJX0ZSQU1FICAgID0gKDEgPDwgMSksICAvLy88IGludHJhIGZyYW1lIHRoYXQgaXMgY29tcGxldGVseSBlbmNvZGVkCisgICAgUF9GUkFNRSAgICA9ICgxIDw8IDIpLCAgLy8vPCBpbnRlciBwcmVkaWN0ZWQgZnJhbWUgZnJvbSBwcmV2aW91cyBmcmFtZXMKKyAgICBCX0ZSQU1FICAgID0gKDEgPDwgMyksICAvLy88IGJhY2t3YXJkIHByZWRpY3RlZCAob3V0LW9mLW9yZGVyKSBmcmFtZQorKQorCisvKioKKyAqIEFsbG93ZWQgcGljdHVyZSB0eXBlcy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyRWFzeUVudW08QzJDb25maWc6OnBpY3R1cmVfdHlwZV90Pj4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhQaWN0dXJlVHlwZU1hc2s+CisgICAgICAgIEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUElDVFVSRV9UWVBFX01BU0tbXSA9ICJjb2RpbmcucGljdHVyZS10eXBlLW1hc2siOworCisvKioKKyAqIFJlc3VsdGluZyBwaWN0dXJlIHR5cGUKKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkVhc3lFbnVtPEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdD4+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4UGljdHVyZVR5cGU+CisgICAgICAgIEMyU3RyZWFtUGljdHVyZVR5cGVJbmZvOwordHlwZWRlZiBDMlN0cmVhbVBpY3R1cmVUeXBlSW5mbyBDMlN0cmVhbVBpY3R1cmVUeXBlTWFza0luZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QSUNUVVJFX1RZUEVbXSA9ICJjb2RlZC5waWN0dXJlLXR5cGUiOworCisvKioKKyAqIEdPUCBzcGVjaWZpY2F0aW9uLgorICoKKyAqIEdPUCBpcyBzcGVjaWZpZWQgaW4gbGF5ZXJzIGJldHdlZW4gc3luYyBmcmFtZXMsIGJ5IHNwZWNpZnlpbmcgdGhlIG51bWJlciBvZiBzcGVjaWZpYyB0eXBlIG9mCisgKiBmcmFtZXMgYmV0d2VlbiB0aGUgcHJldmlvdXMgdHlwZSAoc3RhcnRpbmcgd2l0aCBzeW5jIGZyYW1lcyBmb3IgdGhlIGZpcnN0IGxheWVyKToKKyAqCisgKiBFLmcuCisgKiAgICAgIC0gNCBJIGZyYW1lcyBiZXR3ZWVuIGVhY2ggc3luYyBmcmFtZQorICogICAgICAtIDIgUCBmcmFtZXMgYmV0d2VlbiBlYWNoIEkgZnJhbWUKKyAqICAgICAgLSAxIEIgZnJhbWUgYmV0d2VlbiBlYWNoIFAgZnJhbWUKKyAqCisgKiAgICAgIFsgeyBJLCA0IH0sIHsgUCwgMiB9LCB7IEIsIDEgfSBdID09PiAoU3luYylCUEJQQiBJQlBCUEIgSUJQQlBCIElCUEJQQiBJQlBCUEIgKFN5bmMpQlBCUEIKKyAqCisgKiBGb3IgaW5maW5pdGUgR09QLCBJIGxheWVyIGNhbiBiZSBvbWl0dGVkIChhcyB0aGUgZmlyc3QgZnJhbWUgaXMgYWx3YXlzIGEgc3luYyBmcmFtZS4pOgorICoKKyAqICAgICAgWyB7IFAsIE1BWF9VSU5UIH0gXSAgID09PiAoU3luYylQUFBQUFBQUFBQUFBQUFBQUFAuLi4KKyAqCisgKiBTeW5jIGZyYW1lcyBjYW4gYWxzbyBiZSByZXF1ZXN0ZWQgb24gZGVtYW5kLCBhbmQgYXMgYSB0aW1lLWJhc2VkIGludGVydmFsLiBGb3IgdGltZS1iYXNlZAorICogaW50ZXJ2YWwsIGlmIHRoZXJlIGhhc24ndCBiZWVuIGEgc3luYyBmcmFtZSBpbiBhdCBsZWFzdCB0aGUgZ2l2ZW4gdGltZSwgdGhlIG5leHQgSSBmcmFtZSBzaGFsbAorICogYmUgZW5jb2RlZCBhcyBhIHN5bmMgZnJhbWUuICBGb3Igc3luYyByZXF1ZXN0LCB0aGUgbmV4dCBJIGZyYW1lIHNoYWxsIGJlIGVuY29kZWQgYXMgYSBzeW5jIGZyYW1lLgorICoKKyAqIFRlbXBvcmFsIGxheWVyaW5nIHdpbGwgZGV0ZXJtaW5lIEdPUCBzdHJ1Y3R1cmUgb3RoZXIgdGhhbiB0aGUgSSBmcmFtZSBjb3VudCBiZXR3ZWVuIHN5bmMKKyAqIGZyYW1lcy4KKyAqLworc3RydWN0IEMyR29wTGF5ZXJTdHJ1Y3QgeworICAgIEMyR29wTGF5ZXJTdHJ1Y3QoKSA6IHR5cGVfKChDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QpMCksIGNvdW50KDApIHt9CisgICAgQzJHb3BMYXllclN0cnVjdChDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QgdHlwZSwgdWludDMyX3QgY291bnRfKQorICAgICAgICA6IHR5cGVfKHR5cGUpLCBjb3VudChjb3VudF8pIHsgfQorCisgICAgQzJDb25maWc6OnBpY3R1cmVfdHlwZV90IHR5cGVfOworICAgIHVpbnQzMl90IGNvdW50OworCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChHb3BMYXllcikKKyAgICBDMkZJRUxEKHR5cGVfLCAidHlwZSIpCisgICAgQzJGSUVMRChjb3VudCwgImNvdW50IikKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMkdvcExheWVyU3RydWN0Piwga1BhcmFtSW5kZXhHb3A+CisgICAgICAgIEMyU3RyZWFtR29wVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfR09QW10gPSAiY29kaW5nLmdvcCI7CisKKy8qKgorICogU3luYyBmcmFtZSBjYW4gYmUgcmVxdWVzdGVkIG9uIGRlbWFuZCBieSB0aGUgY2xpZW50LgorICoKKyAqIElmIHRydWUsIHRoZSBuZXh0IEkgZnJhbWUgc2hhbGwgYmUgZW5jb2RlZCBhcyBhIHN5bmMgZnJhbWUuIFRoaXMgY29uZmlnIGNhbiBiZSBwYXNzZWQKKyAqIHN5bmNocm9ub3VzbHkgd2l0aCB0aGUgd29yaywgb3IgZGlyZWN0bHkgdG8gdGhlIGNvbXBvbmVudCAtIGxlYWRpbmcgdG8gZGlmZmVyZW50IHJlc3VsdC4KKyAqIElmIGl0IGlzIHBhc3NlZCB3aXRoIHdvcmssIGl0IHNoYWxsIHRha2UgZWZmZWN0IHdoZW4gdGhhdCB3b3JrIGl0ZW0gaXMgYmVpbmcgcHJvY2Vzc2VkIChzbworICogdGhlIGZpcnN0IEkgZnJhbWUgYXQgb3IgYWZ0ZXIgdGhhdCB3b3JrIGl0ZW0gc2hhbGwgYmUgYSBzeW5jIGZyYW1lKS4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMkVhc3lCb29sVmFsdWUsIGtQYXJhbUluZGV4UmVxdWVzdFN5bmNGcmFtZT4KKyAgICAgICAgQzJTdHJlYW1SZXF1ZXN0U3luY0ZyYW1lVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUkVRVUVTVF9TWU5DX0ZSQU1FW10gPSAiY29kaW5nLnJlcXVlc3Qtc3luYy1mcmFtZSI7CisKKy8qKgorICogU3luYyBmcmFtZSBpbnRlcnZhbCBpbiB0aW1lIGRvbWFpbiAodGltZXN0YW1wKS4KKyAqCisgKiBJZiB0aGVyZSBoYXNuJ3QgYmVlbiBhIHN5bmMgZnJhbWUgaW4gYXQgbGVhc3QgdGhpcyB2YWx1ZSwgdGhlIG5leHQgaW50cmEgZnJhbWUgc2hhbGwgYmUgZW5jb2RlZAorICogYXMgYSBzeW5jIGZyYW1lLiBUaGUgdmFsdWUgb2YgTUFYX0k2NCBvciBhIG5lZ2F0aXZlIHZhbHVlIG1lYW5zIG5vIHN5bmMgZnJhbWVzIGFmdGVyIHRoZSBmaXJzdAorICogZnJhbWUuIEEgdmFsdWUgb2YgMCBtZWFucyBhbGwgc3luYyBmcmFtZXMuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJJbnQ2NFZhbHVlLCBrUGFyYW1JbmRleFN5bmNGcmFtZUludGVydmFsPgorICAgICAgICBDMlN0cmVhbVN5bmNGcmFtZUludGVydmFsVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfU1lOQ19GUkFNRV9JTlRFUlZBTFtdID0gImNvZGluZy5zeW5jLWZyYW1lLWludGVydmFsIjsKKworLyoqCisgKiBUZW1wb3JhbCBsYXllcmluZworICoKKyAqIExheWVyIGluZGV4IGlzIGEgdmFsdWUgYmV0d2VlbiAwIGFuZCBsYXllciBjb3VudCAtIDEuIExheWVycyB3aXRoIGhpZ2hlciBpbmRleCBoYXZlIGhpZ2hlcgorICogZnJlcXVlbmN5OgorICogICAgIDAKKyAqICAgMSAgIDEKKyAqICAyIDIgMiAyCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4TGF5ZXJJbmRleD4gQzJTdHJlYW1MYXllckluZGV4SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0xBWUVSX0lOREVYW10gPSAiY29kZWQubGF5ZXItaW5kZXgiOworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleExheWVyQ291bnQ+IEMyU3RyZWFtTGF5ZXJDb3VudEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9MQVlFUl9DT1VOVFtdID0gImNvZGVkLmxheWVyLWNvdW50IjsKKworc3RydWN0IEMyVGVtcG9yYWxMYXllcmluZ1N0cnVjdCB7CisgICAgQzJUZW1wb3JhbExheWVyaW5nU3RydWN0KCkKKyAgICAgICAgOiBsYXllckNvdW50KDApLCBiTGF5ZXJDb3VudCgwKSB7IH0KKworICAgIEMyVGVtcG9yYWxMYXllcmluZ1N0cnVjdChzaXplX3QgLyogZmxleENvdW50ICovLCB1aW50MzJfdCBsYXllckNvdW50XywgdWludDMyX3QgYkxheWVyQ291bnRfKQorICAgICAgICA6IGxheWVyQ291bnQobGF5ZXJDb3VudF8pLCBiTGF5ZXJDb3VudChjMl9taW4obGF5ZXJDb3VudF8sIGJMYXllckNvdW50XykpIHsgfQorCisgICAgQzJUZW1wb3JhbExheWVyaW5nU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIHVpbnQzMl90IGxheWVyQ291bnRfLCB1aW50MzJfdCBiTGF5ZXJDb3VudF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxmbG9hdD4gcmF0aW9zKQorICAgICAgICA6IGxheWVyQ291bnQobGF5ZXJDb3VudF8pLCBiTGF5ZXJDb3VudChjMl9taW4obGF5ZXJDb3VudF8sIGJMYXllckNvdW50XykpIHsKKyAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgZm9yIChmbG9hdCByYXRpbyA6IHJhdGlvcykgeworICAgICAgICAgICAgaWYgKGl4ID09IGZsZXhDb3VudCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYml0cmF0ZVJhdGlvc1tpeCsrXSA9IHJhdGlvOworICAgICAgICB9CisgICAgfQorCisgICAgdWludDMyX3QgbGF5ZXJDb3VudDsgICAgIC8vLzwgdG90YWwgbnVtYmVyIG9mIGxheWVycyAoMCBtZWFucyBubyB0ZW1wb3JhbCBsYXllcmluZykKKyAgICB1aW50MzJfdCBiTGF5ZXJDb3VudDsgICAgLy8vPCB0b3RhbCBudW1iZXIgb2YgYmlkaXJlY3Rpb25hbCBsYXllcnMgKDw9IG51bSBsYXllcnMpCisgICAgLyoqCisgICAgICogQml0cmF0ZSBidWRnZXRzIGZvciBlYWNoIGxheWVyIGFuZCB0aGUgbGF5ZXJzIGJlbG93LCBnaXZlbiBhcyBhIHJhdGlvIG9mIHRoZSB0b3RhbAorICAgICAqIHN0cmVhbSBiaXRyYXRlLiBUaGlzIGNhbiBiZSBvbWl0dGVkIG9yIHBhcnRpYWxseSBzcGVjaWZpZmVkIGJ5IHRoZSBjbGllbnQgd2hpbGUgY29uZmlndXJpbmcsCisgICAgICogaW4gd2hpY2ggY2FzZSB0aGUgY29tcG9uZW50IHNoYWxsIGZpbGwgaW4gYXBwcm9wcmlhdGUgdmFsdWVzIGZvciB0aGUgbWlzc2luZyBsYXllcnMuCisgICAgICogVGhpcyBtdXN0IGJlIHByb3ZpZGVkIGJ5IHRoZSBjb21wb25lbnQgd2hlbiBxdWVyaWVkIGZvciBhdCBsZWFzdCBsYXllciBjb3VudCAtIDEgKGFzIHRoZQorICAgICAqIGxhc3QgbGF5ZXIncyBidWRnZXQgaXMgYWx3YXlzIDEuMCkuCisgICAgICovCisgICAgZmxvYXQgYml0cmF0ZVJhdGlvc1tdOyAgIC8vLzwgMS4wLWJhc2VkCisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoVGVtcG9yYWxMYXllcmluZywgYml0cmF0ZVJhdGlvcykKKyAgICBDMkZJRUxEKGxheWVyQ291bnQsICJsYXllci1jb3VudCIpCisgICAgQzJGSUVMRChiTGF5ZXJDb3VudCwgImItbGF5ZXItY291bnQiKQorICAgIEMyRklFTEQoYml0cmF0ZVJhdGlvcywgImJpdHJhdGUtcmF0aW9zIikKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJUZW1wb3JhbExheWVyaW5nU3RydWN0LCBrUGFyYW1JbmRleFRlbXBvcmFsTGF5ZXJpbmc+CisgICAgICAgIEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HW10gPSAiY29kaW5nLnRlbXBvcmFsLWxheWVyaW5nIjsKKworLyoqCisgKiBJbnRyYS1yZWZyZXNoLgorICovCisKK0MyRU5VTShDMkNvbmZpZzo6aW50cmFfcmVmcmVzaF9tb2RlX3QsIHVpbnQzMl90LAorICAgIElOVFJBX1JFRlJFU0hfRElTQUJMRUQsICAgICAvLy88IG5vIGludHJhIHJlZnJlc2gKKyAgICBJTlRSQV9SRUZSRVNIX0FSQklUUkFSWSwgICAgLy8vPCBhcmJpdHJhcnksIHVuc3BlY2lmaWVkCispCisKK3N0cnVjdCBDMkludHJhUmVmcmVzaFN0cnVjdCB7CisgICAgQzJJbnRyYVJlZnJlc2hTdHJ1Y3QoKQorICAgICAgICA6IG1vZGUoQzJDb25maWc6OklOVFJBX1JFRlJFU0hfRElTQUJMRUQpLCBwZXJpb2QoMC4pIHsgfQorCisgICAgQzJJbnRyYVJlZnJlc2hTdHJ1Y3QoQzJDb25maWc6OmludHJhX3JlZnJlc2hfbW9kZV90IG1vZGVfLCBmbG9hdCBwZXJpb2RfKQorICAgICAgICA6IG1vZGUobW9kZV8pLCBwZXJpb2QocGVyaW9kXykgeyB9CisKKyAgICBDMkNvbmZpZzo6aW50cmFfcmVmcmVzaF9tb2RlX3QgbW9kZTsgLy8vPCByZWZyZXNoIG1vZGUKKyAgICBmbG9hdCBwZXJpb2Q7ICAgICAgICAgLy8vPCBpbnRyYSByZWZyZXNoIHBlcmlvZCBpbiBmcmFtZXMgKG11c3QgYmUgPj0gMSksIDAgbWVhbnMgZGlzYWJsZWQKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoSW50cmFSZWZyZXNoKQorICAgIEMyRklFTEQobW9kZSwgIm1vZGUiKQorICAgIEMyRklFTEQocGVyaW9kLCAicGVyaW9kIikKK307CisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMlR1bmluZywgQzJJbnRyYVJlZnJlc2hTdHJ1Y3QsIGtQYXJhbUluZGV4SW50cmFSZWZyZXNoPgorICAgICAgICBDMlN0cmVhbUludHJhUmVmcmVzaFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOVFJBX1JFRlJFU0hbXSA9ICJjb2RpbmcuaW50cmEtcmVmcmVzaCI7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElNQUdFIENPTVBPTkVOVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBUaWxlIGxheW91dC4KKyAqCisgKiBUaGlzIGRlc2NyaWJlZCBob3cgdGhlIGltYWdlIGlzIGRlY29tcG9zZWQgaW50byB0aWxlcy4KKyAqLworQzJFTlVNKEMyQ29uZmlnOjpzY2FuX29yZGVyX3QsIHVpbnQzMl90LAorICAgIFNDQU5fTEVGVF9UT19SSUdIVF9USEVOX0RPV04KKykKKworc3RydWN0IEMyVGlsZUxheW91dFN0cnVjdCB7CisgICAgQzJQaWN0dXJlU2l6ZVN0cnVjdCB0aWxlOyAgICAgICAvLy88IHRpbGUgc2l6ZQorICAgIHVpbnQzMl90IGNvbHVtbkNvdW50OyAgICAgICAgICAgLy8vPCBudW1iZXIgb2YgdGlsZXMgaG9yaXpvbnRhbGx5CisgICAgdWludDMyX3Qgcm93Q291bnQ7ICAgICAgICAgICAgICAvLy88IG51bWJlciBvZiB0aWxlcyB2ZXJ0aWNhbGx5CisgICAgQzJDb25maWc6OnNjYW5fb3JkZXJfdCBvcmRlcjsgICAvLy88IHRpbGUgb3JkZXIKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoVGlsZUxheW91dCkKKyAgICBDMkZJRUxEKHRpbGUsICJ0aWxlIikKKyAgICBDMkZJRUxEKGNvbHVtbkNvdW50LCAiY29sdW1ucyIpCisgICAgQzJGSUVMRChyb3dDb3VudCwgInJvd3MiKQorICAgIEMyRklFTEQob3JkZXIsICJvcmRlciIpCit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlRpbGVMYXlvdXRTdHJ1Y3QsIGtQYXJhbUluZGV4VGlsZUxheW91dD4gQzJTdHJlYW1UaWxlTGF5b3V0SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1RJTEVfTEFZT1VUW10gPSAiY29kZWQudGlsZS1sYXlvdXQiOworCisvKioKKyAqIFRpbGUgaGFuZGxpbmcuCisgKgorICogV2hldGhlciB0byBjb25jYXRlbmF0ZSB0aWxlcyBvciBvdXRwdXQgdGhlbSBlYWNoLgorICovCitDMkVOVU0oQzJDb25maWc6OnRpbGluZ19tb2RlX3QsIHVpbnQzMl90LAorICAgIFRJTElOR19TRVBBUkFURSwgICAgLy8vPCBvdXRwdXQgZWFjaCB0aWxlIGluIGEgc2VwYXJhdGUgb25Xb3JrRG9uZQorICAgIFRJTElOR19DT05DQVRFTkFURSAgLy8vPCBvdXRwdXQgb25lIHdvcmsgY29tcGxldGlvbiBwZXIgZnJhbWUgKGNvbmNhdGVuYXRlIHRpbGVzKQorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyVGlsZUxheW91dFN0cnVjdCwga1BhcmFtSW5kZXhUaWxlSGFuZGxpbmc+CisgICAgICAgIEMyU3RyZWFtVGlsZUhhbmRsaW5nVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfVElMRV9IQU5ETElOR1tdID0gImNvZGluZy50aWxlLWhhbmRsaW5nIjsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQVVESU8gQ09NUE9ORU5UUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIFNhbXBsZSByYXRlCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4U2FtcGxlUmF0ZT4gQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1NBTVBMRV9SQVRFW10gPSAicmF3LnNhbXBsZS1yYXRlIjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0NPREVEX1NBTVBMRV9SQVRFW10gPSAiY29kZWQuc2FtcGxlLXJhdGUiOworCisvKioKKyAqIENoYW5uZWwgY291bnQuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyVWludDMyVmFsdWUsIGtQYXJhbUluZGV4Q2hhbm5lbENvdW50PiBDMlN0cmVhbUNoYW5uZWxDb3VudEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DSEFOTkVMX0NPVU5UW10gPSAicmF3LmNoYW5uZWwtY291bnQiOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfQ09ERURfQ0hBTk5FTF9DT1VOVFtdID0gImNvZGVkLmNoYW5uZWwtY291bnQiOworCisvKioKKyAqIE1heCBjaGFubmVsIGNvdW50LiBVc2VkIHRvIGxpbWl0IHRoZSBudW1iZXIgb2YgY29kZWQgb3IgZGVjb2RlZCBjaGFubmVscy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJVaW50MzJWYWx1ZSwga1BhcmFtSW5kZXhNYXhDaGFubmVsQ291bnQ+IEMyU3RyZWFtTWF4Q2hhbm5lbENvdW50SW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX01BWF9DSEFOTkVMX0NPVU5UW10gPSAicmF3Lm1heC1jaGFubmVsLWNvdW50IjsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX01BWF9DT0RFRF9DSEFOTkVMX0NPVU5UW10gPSAiY29kZWQubWF4LWNoYW5uZWwtY291bnQiOworCisvKioKKyAqIEF1ZGlvIHNhbXBsZSBmb3JtYXQgKFBDTSBlbmNvZGluZykKKyAqLworQzJFTlVNKEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCwgdWludDMyX3QsCisgICAgUENNXzE2LAorICAgIFBDTV84LAorICAgIFBDTV9GTE9BVAorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdD4sIGtQYXJhbUluZGV4UGNtRW5jb2Rpbmc+CisgICAgICAgIEMyU3RyZWFtUGNtRW5jb2RpbmdJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HW10gPSAicmF3LnBjbS1lbmNvZGluZyI7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9DT0RFRF9QQ01fRU5DT0RJTkdbXSA9ICJjb2RlZC5wY20tZW5jb2RpbmciOworCisvKioKKyAqIEFBQyBTQlIgTW9kZS4gVXNlZCBkdXJpbmcgZW5jb2RpbmcuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6YWFjX3Nicl9tb2RlX3QsIHVpbnQzMl90LAorICAgIEFBQ19TQlJfT0ZGLAorICAgIEFBQ19TQlJfU0lOR0xFX1JBVEUsCisgICAgQUFDX1NCUl9EVUFMX1JBVEUsCisgICAgQUFDX1NCUl9BVVRPIC8vLzwgbGV0IHRoZSBjb2RlYyBkZWNpZGUKKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6YWFjX3Nicl9tb2RlX3Q+LCBrUGFyYW1JbmRleEFhY1Nick1vZGU+CisgICAgICAgIEMyU3RyZWFtQWFjU2JyTW9kZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0FBQ19TQlJfTU9ERVtdID0gImNvZGluZy5hYWMtc2JyLW1vZGUiOworCisvKioKKyAqIERSQyBDb21wcmVzc2lvbi4gVXNlZCBkdXJpbmcgZGVjb2RpbmcuCisgKi8KK0MyRU5VTShDMkNvbmZpZzo6ZHJjX2NvbXByZXNzaW9uX21vZGVfdCwgaW50MzJfdCwKKyAgICBEUkNfQ09NUFJFU1NJT05fT0RNX0RFRkFVTFQsIC8vLzwgb2RtJ3MgZGVmYXVsdAorICAgIERSQ19DT01QUkVTU0lPTl9OT05FLAorICAgIERSQ19DT01QUkVTU0lPTl9MSUdIVCwKKyAgICBEUkNfQ09NUFJFU1NJT05fSEVBVlkgLy8vPAorKQorCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlNpbXBsZVZhbHVlU3RydWN0PEMyQ29uZmlnOjpkcmNfY29tcHJlc3Npb25fbW9kZV90PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleERyY0NvbXByZXNzaW9uPgorICAgICAgICBDMlN0cmVhbURyY0NvbXByZXNzaW9uTW9kZVR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0RSQ19DT01QUkVTU0lPTl9NT0RFW10gPSAiY29kaW5nLmRyYy5jb21wcmVzc2lvbi1tb2RlIjsKKworLyoqCisgKiBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBpbiBkQkZTLiBVc2VkIGR1cmluZyBkZWNvZGluZy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleERyY1RhcmdldFJlZmVyZW5jZUxldmVsPgorICAgICAgICBDMlN0cmVhbURyY1RhcmdldFJlZmVyZW5jZUxldmVsVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRFJDX1RBUkdFVF9SRUZFUkVOQ0VfTEVWRUxbXSA9ICJjb2RpbmcuZHJjLnJlZmVyZW5jZS1sZXZlbCI7CisKKy8qKgorICogRFJDIHRhcmdldCByZWZlcmVuY2UgbGV2ZWwgaW4gZEJGUy4gVXNlZCBkdXJpbmcgZGVjb2RpbmcuCisgKi8KK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyRmxvYXRWYWx1ZSwga1BhcmFtSW5kZXhEcmNFbmNvZGVkVGFyZ2V0TGV2ZWw+CisgICAgICAgIEMyU3RyZWFtRHJjRW5jb2RlZFRhcmdldExldmVsVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRFJDX0VOQ09ERURfVEFSR0VUX0xFVkVMW10gPSAiY29kaW5nLmRyYy5lbmNvZGVkLWxldmVsIjsKKworLyoqCisgKiBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBpbiBkQkZTLiBVc2VkIGR1cmluZyBkZWNvZGluZy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleERyY0Jvb3N0RmFjdG9yPgorICAgICAgICBDMlN0cmVhbURyY0Jvb3N0RmFjdG9yVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRFJDX0JPT1NUX0ZBQ1RPUltdID0gImNvZGluZy5kcmMuYm9vc3QtZmFjdG9yIjsKKworLyoqCisgKiBEUkMgdGFyZ2V0IHJlZmVyZW5jZSBsZXZlbCBpbiBkQkZTLiBVc2VkIGR1cmluZyBkZWNvZGluZy4KKyAqLwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJGbG9hdFZhbHVlLCBrUGFyYW1JbmRleERyY0F0dGVudWF0aW9uRmFjdG9yPgorICAgICAgICBDMlN0cmVhbURyY0F0dGVudWF0aW9uRmFjdG9yVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUltdID0gImNvZGluZy5kcmMuYXR0ZW51YXRpb24tZmFjdG9yIjsKKworLyoqCisgKiBEUkMgRWZmZWN0IFR5cGUgKHNlZSBJU08gMjMwMDMtNCkgVW5pZm9ybSBEeW5hbWljIFJhbmdlIENvbnRyb2wuIFVzZWQgZHVyaW5nIGRlY29kaW5nLgorICovCitDMkVOVU0oQzJDb25maWc6OmRyY19lZmZlY3RfdHlwZV90LCBpbnQzMl90LAorICAgIERSQ19FRkZFQ1RfT0RNX0RFRkFVTFQgPSAtMiwgLy8vPCBvZG0ncyBkZWZhdWx0CisgICAgRFJDX0VGRkVDVF9PRkYgPSAtMSwgICAgLy8vPCBubyBEUkMKKyAgICBEUkNfRUZGRUNUX05PTkUgPSAwLCAgICAvLy88IG5vIERSQyBleGNlcHQgdG8gcHJldmVudCBjbGlwcGluZworICAgIERSQ19FRkZFQ1RfTEFURV9OSUdIVCwKKyAgICBEUkNfRUZGRUNUX05PSVNZX0VOVklST05NRU5ULAorICAgIERSQ19FRkZFQ1RfTElNSVRFRF9QTEFZQkFDS19SQU5HRSwKKyAgICBEUkNfRUZGRUNUX0xPV19QTEFZQkFDS19MRVZFTCwKKyAgICBEUkNfRUZGRUNUX0RJQUxPR19FTkhBTkNFTUVOVCwKKyAgICBEUkNfRUZGRUNUX0dFTkVSQUxfQ09NUFJFU1NJT04KKykKKwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6ZHJjX2VmZmVjdF90eXBlX3Q+LAorICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4RHJjRWZmZWN0VHlwZT4KKyAgICAgICAgQzJTdHJlYW1EcmNFZmZlY3RUeXBlVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfRFJDX0VGRkVDVF9UWVBFW10gPSAiY29kaW5nLmRyYy5lZmZlY3QtdHlwZSI7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBBQUMgY29tcG9uZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBBQUMgc3RyZWFtIGZvcm1hdAorICovCitDMkVOVU0oQzJDb25maWc6OmFhY19wYWNrYWdpbmdfdCwgdWludDMyX3QsCisgICAgQUFDX1BBQ0tBR0lOR19SQVcsCisgICAgQUFDX1BBQ0tBR0lOR19BRFRTCispCisKK3R5cGVkZWYgQzJTdHJlYW1QYXJhbTxDMkluZm8sIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8QzJFYXN5RW51bTxDMkNvbmZpZzo6YWFjX3BhY2thZ2luZ190Pj4sCisgICAgICAgIGtQYXJhbUluZGV4QWFjUGFja2FnaW5nPiBDMlN0cmVhbUFhY1BhY2thZ2luZ0luZm87Cit0eXBlZGVmIEMyU3RyZWFtQWFjUGFja2FnaW5nSW5mbyBDMlN0cmVhbUFhY0Zvcm1hdEluZm87Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9BQUNfUEFDS0FHSU5HW10gPSAiY29kZWQuYWFjLXBhY2thZ2luZyI7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFBMQVRGT1JNLURFRklORUQgUEFSQU1FVEVSUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIFBsYXRmb3JtIGxldmVsIGFuZCBmZWF0dXJlcy4KKyAqLworZW51bSBDMkNvbmZpZzo6cGxhdGZvcm1fbGV2ZWxfdCA6IHVpbnQzMl90IHsKKyAgICBQTEFURk9STV9QLCAgIC8vLzwgc3VwcG9ydCBmb3IgQW5kcm9pZCA5LjAgZmVhdHVyZSBzZXQKK307CisKKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6cGxhdGZvcm1fbGV2ZWxfdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhQbGF0Zm9ybUxldmVsPgorICAgICAgICBDMlBsYXRmb3JtTGV2ZWxTZXR0aW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfUExBVEZPUk1fTEVWRUxbXSA9ICJhcGkucGxhdGZvcm0tbGV2ZWwiOworCitlbnVtIEMyQ29uZmlnOjpwbGF0Zm9ybV9mZWF0dXJlX3QgOiB1aW50NjRfdCB7CisgICAgLy8gbm8gcGxhdGZvcm0tc3BlY2lmaWMgZmVhdHVyZXMgaGF2ZSBiZWVuIGRlZmluZWQKK307CisKKy8vIHJlYWQtb25seQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTaW1wbGVWYWx1ZVN0cnVjdDxDMkNvbmZpZzo6cGxhdGZvcm1fZmVhdHVyZV90PiwKKyAgICAgICAgICAgICAgICBrUGFyYW1JbmRleFBsYXRmb3JtRmVhdHVyZXM+CisgICAgICAgIEMyUGxhdGZvcm1GZWF0dXJlc1NldHRpbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9QTEFURk9STV9GRUFUVVJFU1tdID0gImFwaS5wbGF0Zm9ybS1mZWF0dXJlcyI7CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgZGVzY3JpYmVzIHRoZSBwcmVmZXJyZWQgaW9uIGFsbG9jYXRpb24gcGFyYW1ldGVycyBmb3IgYSBnaXZlbiBtZW1vcnkgdXNhZ2UuCisgKi8KK3N0cnVjdCBDMlN0b3JlSW9uVXNhZ2VTdHJ1Y3QgeworICAgIGlubGluZSBDMlN0b3JlSW9uVXNhZ2VTdHJ1Y3QoKSB7CisgICAgICAgIG1lbXNldCh0aGlzLCAwLCBzaXplb2YoKnRoaXMpKTsKKyAgICB9CisKKyAgICBpbmxpbmUgQzJTdG9yZUlvblVzYWdlU3RydWN0KHVpbnQ2NF90IHVzYWdlXywgdWludDMyX3QgY2FwYWNpdHlfKQorICAgICAgICA6IHVzYWdlKHVzYWdlXyksIGNhcGFjaXR5KGNhcGFjaXR5XyksIGhlYXBNYXNrKDApLCBhbGxvY0ZsYWdzKDApLCBtaW5BbGlnbm1lbnQoMCkgeyB9CisKKyAgICB1aW50NjRfdCB1c2FnZTsgICAgICAgIC8vLzwgQzJNZW1vcnlVc2FnZQorICAgIHVpbnQzMl90IGNhcGFjaXR5OyAgICAgLy8vPCBjYXBhY2l0eQorICAgIGludDMyX3QgaGVhcE1hc2s7ICAgICAgLy8vPCBpb24gaGVhcE1hc2sKKyAgICBpbnQzMl90IGFsbG9jRmxhZ3M7ICAgIC8vLzwgaW9uIGFsbG9jYXRpb24gZmxhZ3MKKyAgICB1aW50MzJfdCBtaW5BbGlnbm1lbnQ7IC8vLzwgbWluaW11bSBhbGlnbm1lbnQKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoU3RvcmVJb25Vc2FnZSkKKyAgICBDMkZJRUxEKHVzYWdlLCAidXNhZ2UiKQorICAgIEMyRklFTEQoY2FwYWNpdHksICJjYXBhY2l0eSIpCisgICAgQzJGSUVMRChoZWFwTWFzaywgImhlYXAtbWFzayIpCisgICAgQzJGSUVMRChhbGxvY0ZsYWdzLCAiYWxsb2MtZmxhZ3MiKQorICAgIEMyRklFTEQobWluQWxpZ25tZW50LCAibWluLWFsaWdubWVudCIpCit9OworCisvLyBzdG9yZSwgcHJpdmF0ZQordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJTdG9yZUlvblVzYWdlU3RydWN0LCBrUGFyYW1JbmRleFN0b3JlSW9uVXNhZ2U+CisgICAgICAgIEMyU3RvcmVJb25Vc2FnZUluZm87CisKKy8qKgorICogRmxleGlibGUgcGl4ZWwgZm9ybWF0IGRlc2NyaXB0b3JzCisgKi8KK3N0cnVjdCBDMkZsZXhpYmxlUGl4ZWxGb3JtYXREZXNjcmlwdG9yU3RydWN0IHsKKyAgICB1aW50MzJfdCBwaXhlbEZvcm1hdDsKKyAgICB1aW50MzJfdCBiaXREZXB0aDsKKyAgICBDMkNvbG9yOjpzdWJzYW1wbGluZ190IHN1YnNhbXBsaW5nOworICAgIEMyQ29sb3I6OnBsYW5lX2xheW91dF90IGxheW91dDsKKworICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoRmxleGlibGVQaXhlbEZvcm1hdERlc2NyaXB0b3IpCisgICAgQzJGSUVMRChwaXhlbEZvcm1hdCwgInBpeGVsLWZvcm1hdCIpCisgICAgQzJGSUVMRChiaXREZXB0aCwgImJpdC1kZXB0aCIpCisgICAgQzJGSUVMRChzdWJzYW1wbGluZywgInN1YnNhbXBsaW5nIikKKyAgICBDMkZJRUxEKGxheW91dCwgImxheW91dCIpCit9OworCisvKioKKyAqIFBsYW5lIGxheW91dCBvZiBmbGV4aWJsZSBwaXhlbCBmb3JtYXRzLgorICoKKyAqIGJwcDogYnl0ZXMgcGVyIGNvbG9yIGNvbXBvbmVudCwgZS5nLiAxIGZvciA4LWJpdCBmb3JtYXRzLCBhbmQgMiBmb3IgMTAtMTYtYml0IGZvcm1hdHMuCisgKi8KK0MyRU5VTShDMkNvbG9yOjpwbGFuZV9sYXlvdXRfdCwgdWludDMyX3QsCisgICAgICAgLyoqIFVua25vd24gbGF5b3V0ICovCisgICAgICAgVU5LTk9XTl9MQVlPVVQsCisKKyAgICAgICAvKiogUGxhbmFyIGxheW91dCB3aXRoIHJvd3Mgb2YgZWFjaCBwbGFuZSBwYWNrZWQgKGNvbEluYyA9IGJwcCkgKi8KKyAgICAgICBQTEFOQVJfUEFDS0VELAorCisgICAgICAgLyoqIFNlbWlwbGFuYXIgbGF5b3V0IHdpdGggcm93cyBvZiBlYWNoIHBsYW5lIHBhY2tlZCAoY29sSW5jX1kvQSA9IGJwcCAocGxhbmFyKSwKKyAgICAgICAgKiAgY29sSW5jX0NiL0NyID0gMipicHAgKGludGVybGVhdmVkKS4gVXNlZCBvbmx5IGZvciBZVVYoQSkgZm9ybWF0cy4gKi8KKyAgICAgICBTRU1JUExBTkFSX1BBQ0tFRCwKKworICAgICAgIC8qKiBJbnRlcmxlYXZlZCBwYWNrZWQuIGNvbEluYyA9IE4qYnBwIChOIGFyZSB0aGUgbnVtYmVyIG9mIGNvbG9yIGNvbXBvbmVudHMpICovCisgICAgICAgSU5URVJMRUFWRURfUEFDS0VELAorCisgICAgICAgLyoqIEludGVybGVhdmVkIGFsaWduZWQuIGNvbEluYyA9IHNtYWxsZXN0IHBvd2VyIG9mIDIgPj0gTipicHAgKE4gYXJlIHRoZSBudW1iZXIgb2YgY29sb3IKKyAgICAgICAgKiAgY29tcG9uZW50cykgKi8KKyAgICAgICBJTlRFUkxFQVZFRF9BTElHTkVECispCisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8QzJGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvclN0cnVjdD4sCisgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcnM+CisgICAgICAgIEMyU3RvcmVGbGV4aWJsZVBpeGVsRm9ybWF0RGVzY3JpcHRvcnNJbmZvOworCisvKioKKyAqIFRoaXMgc3RydWN0dXJlIGRlc2NyaWJlcyB0aGUgYW5kcm9pZCBkYXRhc3BhY2UgZm9yIGEgcmF3IHZpZGVvL2ltYWdlIGZyYW1lLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleERhdGFTcGFjZT4gQzJTdHJlYW1EYXRhU3BhY2VJbmZvOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfREFUQV9TUEFDRVtdID0gInJhdy5kYXRhLXNwYWNlIjsKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBkZXNjcmliZXMgdGhlIGFuZHJvaWQgc3VyZmFjZSBzY2FsaW5nIG1vZGUgZm9yIGEgcmF3IHZpZGVvL2ltYWdlIGZyYW1lLgorICovCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCBrUGFyYW1JbmRleFN1cmZhY2VTY2FsaW5nPiBDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX1NVUkZBQ0VfU0NBTElOR19NT0RFW10gPSAicmF3LnN1cmZhY2Utc2NhbGluZyI7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJTlBVVCBTVVJGQUNFID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvKioKKyAqIElucHV0IHN1cmZhY2UgRU9TCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJFYXN5Qm9vbFZhbHVlLCBrUGFyYW1JbmRleElucHV0U3VyZmFjZUVvcz4KKyAgICAgICAgQzJJbnB1dFN1cmZhY2VFb3NUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX0VPU1tdID0gImlucHV0LXN1cmZhY2UuZW9zIjsKKworLyoqCisgKiBTdGFydC9zdXNwZW5kL3Jlc3VtZS9zdG9wIGNvbnRyb2xzIGFuZCB0aW1lc3RhbXBzIGZvciBpbnB1dCBzdXJmYWNlLgorICoKKyAqIFRPRE86IG1ha2UgdGhlc2UgY291bnRlcnMKKyAqLworCitzdHJ1Y3QgQzJUaW1lZENvbnRyb2xTdHJ1Y3QgeworICAgIGMyX2Jvb2xfdCBlbmFibGVkOyAvLy88IGNvbnRyb2wgaXMgZW5hYmxlZAorICAgIGludDY0X3QgdGltZXN0YW1wOyAvLy88IGlmIGVuYWJsZWQsIHRpbWUgdGhlIGNvbnRyb2wgc2hvdWxkIHRha2UgZWZmZWN0CisKKyAgICBDMlRpbWVkQ29udHJvbFN0cnVjdCgpCisgICAgICAgIDogZW5hYmxlZChDMl9GQUxTRSksIHRpbWVzdGFtcCgwKSB7IH0KKworICAgIC8qIGltcGxpY2l0ICovIEMyVGltZWRDb250cm9sU3RydWN0KHVpbnQ2NF90IHRpbWVzdGFtcF8pCisgICAgICAgIDogZW5hYmxlZChDMl9UUlVFKSwgdGltZXN0YW1wKHRpbWVzdGFtcF8pIHsgfQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChUaW1lZENvbnRyb2wpCisgICAgQzJGSUVMRChlbmFibGVkLCAgICJlbmFibGVkIikKKyAgICBDMkZJRUxEKHRpbWVzdGFtcCwgInRpbWVzdGFtcCIpCit9OworCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlRpbWVkQ29udHJvbFN0cnVjdCwga1BhcmFtSW5kZXhTdGFydEF0PgorICAgICAgICBDMlBvcnRTdGFydFRpbWVzdGFtcFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfU1RBUlRfQVRbXSA9ICJpbnB1dC1zdXJmYWNlLnN0YXJ0IjsKK3R5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyVGltZWRDb250cm9sU3RydWN0LCBrUGFyYW1JbmRleFN1c3BlbmRBdD4KKyAgICAgICAgQzJQb3J0U3VzcGVuZFRpbWVzdGFtcFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfU1VTUEVORF9BVFtdID0gImlucHV0LXN1cmZhY2Uuc3VzcGVuZCI7Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlRpbWVkQ29udHJvbFN0cnVjdCwga1BhcmFtSW5kZXhSZXN1bWVBdD4KKyAgICAgICAgQzJQb3J0UmVzdW1lVGltZXN0YW1wVHVuaW5nOworY29uc3RleHByIGNoYXIgQzJfUEFSQU1LRVlfSU5QVVRfU1VSRkFDRV9SRVNVTUVfQVRbXSA9ICJpbnB1dC1zdXJmYWNlLnJlc3VtZSI7Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlRpbWVkQ29udHJvbFN0cnVjdCwga1BhcmFtSW5kZXhTdG9wQXQ+CisgICAgICAgIEMyUG9ydFN0b3BUaW1lc3RhbXBUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX1NUT1BfQVRbXSA9ICJpbnB1dC1zdXJmYWNlLnN0b3AiOworCisvKioKKyAqIFRpbWUgb2Zmc2V0IGZvciBpbnB1dCBzdXJmYWNlLiBJbnB1dCB0aW1lc3RhbXAgdG8gY29kZWMgaXMgc3VyZmFjZSBidWZmZXIgdGltZXN0YW1wIHBsdXMgdGhpcworICogdGltZSBvZmZzZXQuCisgKi8KK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlR1bmluZywgQzJJbnQ2NFZhbHVlLCBrUGFyYW1JbmRleFRpbWVPZmZzZXQ+IEMyQ29tcG9uZW50VGltZU9mZnNldFR1bmluZzsKK2NvbnN0ZXhwciBjaGFyIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfVElNRV9PRkZTRVRbXSA9ICJpbnB1dC1zdXJmYWNlLnRpbWUtb2Zmc2V0IjsKKworLyoqCisgKiBNaW5pbXVtIGZwcyBmb3IgaW5wdXQgc3VyZmFjZS4KKyAqCisgKiBSZXBlYXQgZnJhbWUgdG8gbWVldCB0aGlzLgorICovCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMkZsb2F0VmFsdWUsIGtQYXJhbUluZGV4TWluRnJhbWVSYXRlPiBDMlBvcnRNaW5GcmFtZVJhdGVUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX01JTl9GUkFNRV9SQVRFW10gPSAiaW5wdXQtc3VyZmFjZS5taW4tZnJhbWUtcmF0ZSI7CisKKy8qKgorICogVGltZXN0YW1wIGFkanVzdG1lbnQgKG92ZXJyaWRlKSBmb3IgaW5wdXQgc3VyZmFjZSBidWZmZXJzLiBUaGVzZSBjb250cm9sIHRoZSBpbnB1dCB0aW1lc3RhbXAKKyAqIGZlZCB0byB0aGUgY29kZWMsIGJ1dCBkbyBub3QgaW1wYWN0IHRoZSBvdXRwdXQgdGltZXN0YW1wLgorICovCitzdHJ1Y3QgQzJUaW1lc3RhbXBHYXBBZGp1c3RtZW50U3RydWN0IHsKKyAgICAvLy8gY29udHJvbCBtb2RlcworICAgIGVudW0gbW9kZV90IDogdWludDMyX3Q7CisKKyAgICBpbmxpbmUgQzJUaW1lc3RhbXBHYXBBZGp1c3RtZW50U3RydWN0KCk7CisKKyAgICBpbmxpbmUgQzJUaW1lc3RhbXBHYXBBZGp1c3RtZW50U3RydWN0KG1vZGVfdCBtb2RlXywgdWludDY0X3QgdmFsdWVfKQorICAgICAgICA6IG1vZGUobW9kZV8pLCB2YWx1ZSh2YWx1ZV8pIHsgfQorCisgICAgbW9kZV90IG1vZGU7ICAgIC8vLzwgY29udHJvbCBtb2RlCisgICAgdWludDY0X3QgdmFsdWU7IC8vLzwgY29udHJvbCB2YWx1ZSBmb3IgZ2FwIGJldHdlZW4gdHdvIHRpbWVzdGFtcAorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChUaW1lc3RhbXBHYXBBZGp1c3RtZW50KQorICAgIEMyRklFTEQobW9kZSwgIm1vZGUiKQorICAgIEMyRklFTEQodmFsdWUsICJ2YWx1ZSIpCit9OworCitDMkVOVU0oQzJUaW1lc3RhbXBHYXBBZGp1c3RtZW50U3RydWN0Ojptb2RlX3QsIHVpbnQzMl90LAorICAgIE5PTkUsCisgICAgTUlOX0dBUCwKKyAgICBGSVhFRF9HQVAsCispOworCitpbmxpbmUgQzJUaW1lc3RhbXBHYXBBZGp1c3RtZW50U3RydWN0OjpDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3QoKQorICAgIDogbW9kZShDMlRpbWVzdGFtcEdhcEFkanVzdG1lbnRTdHJ1Y3Q6Ok5PTkUpLCB2YWx1ZSgwKSB7IH0KKwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJUaW1lc3RhbXBHYXBBZGp1c3RtZW50U3RydWN0PiBDMlBvcnRUaW1lc3RhbXBHYXBUdW5pbmc7Citjb25zdGV4cHIgY2hhciBDMl9QQVJBTUtFWV9JTlBVVF9TVVJGQUNFX1RJTUVTVEFNUF9BREpVU1RNRU5UW10gPSAiaW5wdXQtc3VyZmFjZS50aW1lc3RhbXAtYWRqdXN0bWVudCI7CisKKy8vLyBAfQorCisjZW5kaWYgIC8vIEMyQ09ORklHX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyRW51bS5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkVudW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMGZhZDhmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMkVudW0uaApAQCAtMCwwICsxLDIyOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJFTlVNX0hfCisjZGVmaW5lIEMyRU5VTV9IXworCisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPF9DMk1hY3JvVXRpbHMuaD4KKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvKiogXGZpbGUKKyAqIFRvb2xzIGZvciBlYXNpZXIgZW51bSBzdXBwb3J0LgorICovCisKKy8vLyBcY29uZCBJTlRFUk5BTAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVUSUxJVElFUyBGT1IgRU5VTUVSQVRJT04gUkVGTEVDVElPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0aGF0IGFsbG93cyBpZ25vcmluZyBlbnVtIHZhbHVlIGFzc2lnbm1lbnQgKGUuZy4gYm90aCAnKF9DMkVudW1Db25zdClrVmFsdWUgPSB4JworICogYW5kICcoX0MyRW51bUNvbnN0KWtWYWx1ZScgd2lsbCBldmFsIHRvIGtWYWx1ZS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIF9DMkVudW1Db25zdCB7CitwdWJsaWM6CisgICAgLy8gaW1wbGljaXQgY29udmVyc2lvbiBmcm9tIFQKKyAgICBpbmxpbmUgX0MyRW51bUNvbnN0KFQgdmFsdWUpIDogX21WYWx1ZSh2YWx1ZSkge30KKyAgICAvLyBpbXBsaWNpdCBjb252ZXJzaW9uIHRvIFQKKyAgICBpbmxpbmUgb3BlcmF0b3IgVCgpIHsgcmV0dXJuIF9tVmFsdWU7IH0KKyAgICAvLyBpbXBsaWNpdCBjb252ZXJzaW9uIHRvIEMyVmFsdWU6OlByaW1pdGl2ZQorICAgIGlubGluZSBvcGVyYXRvciBDMlZhbHVlOjpQcmltaXRpdmUoKSB7IHJldHVybiAoVClfbVZhbHVlOyB9CisgICAgLy8gaWdub3JlIGFzc2lnbm1lbnQgYW5kIHJldHVybiBUIGhlcmUgdG8gYXZvaWQgaW1wbGljaXQgY29udmVyc2lvbiB0byBUIGxhdGVyCisgICAgaW5saW5lIFQgJm9wZXJhdG9yID0oVCB2YWx1ZSBfX3VudXNlZCkgeyByZXR1cm4gX21WYWx1ZTsgfQorcHJpdmF0ZToKKyAgICBUIF9tVmFsdWU7Cit9OworCisvLy8gbWFwcGVyIHRvIGdldCBuYW1lIG9mIGVudW0KKy8vLyBcbm90ZSB0aGlzIHdpbGwgY29udGFpbiBhbnkgaW5pdGlhbGl6YXRpb24sIHdoaWNoIHdlIHdpbGwgcmVtb3ZlIHdoZW4gY29udmVydGluZyB0byBsb3dlci1jYXNlCisjZGVmaW5lIF9DMl9HRVRfRU5VTV9OQU1FKHgsIHkpICN4CisvLy8gbWFwcGVyIHRvIGdldCB2YWx1ZSBvZiBlbnVtCisjZGVmaW5lIF9DMl9HRVRfRU5VTV9WQUxVRSh4LCB0eXBlKSAoX0MyRW51bUNvbnN0PHR5cGU+KXgKKworLy8vIFxlbmRjb25kCisKK2NsYXNzIF9DMkVudW1VdGlscyB7CisgICAgc3RhdGljIEMyU3RyaW5nIGNhbWVsQ2FzZVRvRGFzaGVkKEMyU3RyaW5nIG5hbWUpOworCisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPEMyU3RyaW5nPiBzYW5pdGl6ZUVudW1WYWx1ZU5hbWVzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJTdHJpbmdMaXRlcmFsPiBuYW1lcywKKyAgICAgICAgICAgIEMyU3RyaW5nTGl0ZXJhbCBfcHJlZml4ID0gbnVsbHB0cik7CisKKyAgICBmcmllbmQgY2xhc3MgQzJVdGlsVGVzdF9FbnVtVXRpbHNUZXN0X1Rlc3Q7CisKK3B1YmxpYzoKKyAgICAvLyB0aGlzIG1heSBub3QgYmUgdXNlZC4uLgorICAgIHN0YXRpYyBDMl9ISURFIHN0ZDo6dmVjdG9yPEMyU3RyaW5nPiBwYXJzZUVudW1WYWx1ZXNGcm9tU3RyaW5nKEMyU3RyaW5nTGl0ZXJhbCB2YWx1ZSk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyBDMl9ISURFIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgc2FuaXRpemVFbnVtVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VD4gdmFsdWVzLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmdMaXRlcmFsPiBuYW1lcywKKyAgICAgICAgICAgIEMyU3RyaW5nTGl0ZXJhbCBwcmVmaXggPSBudWxscHRyKSB7CisgICAgICAgIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgbmFtZWRWYWx1ZXM7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RyaW5nPiBzYW5pdGl6ZWROYW1lcyA9IHNhbml0aXplRW51bVZhbHVlTmFtZXMobmFtZXMsIHByZWZpeCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmFsdWVzLnNpemUoKSAmJiBpIDwgc2FuaXRpemVkTmFtZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIG5hbWVkVmFsdWVzLmVtcGxhY2VfYmFjayhzYW5pdGl6ZWROYW1lc1tpXSwgdmFsdWVzW2ldKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbmFtZWRWYWx1ZXM7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgRT4KKyAgICBzdGF0aWMgQzJfSElERSBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIGN1c3RvbUVudW1WYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8QzJTdHJpbmdMaXRlcmFsLCBFPj4gaXRlbXMpIHsKKyAgICAgICAgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBuYW1lZFZhbHVlczsKKyAgICAgICAgZm9yIChhdXRvICZpdGVtIDogaXRlbXMpIHsKKyAgICAgICAgICAgIG5hbWVkVmFsdWVzLmVtcGxhY2VfYmFjayhpdGVtLmZpcnN0LCBpdGVtLnNlY29uZCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG5hbWVkVmFsdWVzOworICAgIH0KK307CisKKyNkZWZpbmUgREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIobmFtZSwgdHlwZSwgcHJlZml4LCAuLi4pIFwKKyAgICBfREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIoX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fLCBuYW1lLCB0eXBlLCBwcmVmaXgsIFwKKyAgICAgICAgICAgICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihlbmFibGVkLCBuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikgXAorICAgIF9fREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIoZW5hYmxlZCwgbmFtZSwgdHlwZSwgcHJlZml4LCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfX0RFRklORV9DMl9FTlVNX1ZBTFVFX0FVVE9fSEVMUEVSKGVuYWJsZWQsIG5hbWUsIHR5cGUsIHByZWZpeCwgLi4uKSBcCisgICAgX19fREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIjI2VuYWJsZWQobmFtZSwgdHlwZSwgcHJlZml4LCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihuYW1lLCB0eXBlLCBwcmVmaXgsIC4uLikgXAordGVtcGxhdGU8PiBcCitDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0Zvcihjb25zdCBuYW1lICZyIF9fdW51c2VkKSB7IFwKKyAgICByZXR1cm4gX0MyRW51bVV0aWxzOjpzYW5pdGl6ZUVudW1WYWx1ZXMoIFwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4geyBfQzJfTUFQKF9DMl9HRVRfRU5VTV9WQUxVRSwgdHlwZSwgX19WQV9BUkdTX18pIH0sIFwKKyAgICAgICAgICAgIHsgX0MyX01BUChfQzJfR0VUX0VOVU1fTkFNRSwgdHlwZSwgX19WQV9BUkdTX18pIH0sIFwKKyAgICAgICAgICAgIHByZWZpeCk7IFwKK30KKyNkZWZpbmUgX19fREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVJfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18obmFtZSwgdHlwZSwgcHJlZml4LCAuLi4pCisKKyNkZWZpbmUgREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihuYW1lLCBuYW1lcykgXAorICAgIF9ERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXywgbmFtZSwgbmFtZXMpCisjZGVmaW5lIF9ERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKGVuYWJsZWQsIG5hbWUsIG5hbWVzKSBcCisgICAgX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKGVuYWJsZWQsIG5hbWUsIG5hbWVzKQorI2RlZmluZSBfX0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoZW5hYmxlZCwgbmFtZSwgbmFtZXMpIFwKKyAgICBfX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSIyNlbmFibGVkKG5hbWUsIG5hbWVzKQorI2RlZmluZSBfX19ERUZJTkVfQzJfRU5VTV9WQUxVRV9DVVNUT01fSEVMUEVSKG5hbWUsIG5hbWVzKSBcCit0ZW1wbGF0ZTw+IFwKK0MyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKGNvbnN0IG5hbWUgJnIgX191bnVzZWQpIHsgXAorICAgIHJldHVybiBfQzJFbnVtVXRpbHM6OmN1c3RvbUVudW1WYWx1ZXMoIFwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxDMlN0cmluZ0xpdGVyYWwsIG5hbWU+PiBuYW1lcyk7IFwKK30KKyNkZWZpbmUgX19fREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUl9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyhuYW1lLCBuYW1lcykKKworLyoqCisgKiBEZWZpbmVzIGFuIGVudW0gdHlwZSB3aXRoIHRoZSBkZWZhdWx0IG5hbWVkIHZhbHVlIG1hcHBlci4gVGhlIGRlZmF1bHQgbWFwcGVyCisgKiBmaW5kcyBhbmQgcmVtb3ZlcyB0aGUgbG9uZ2VzdCBjb21tb24gcHJlZml4IGFjcm9zcyBhbGwgb2YgdGhlIGVudW0gdmFsdWUgbmFtZXMsIGFuZAorICogcmVwbGFjZXMgY2FtZWwtY2FzZSBzZXBhcmF0b3JzIHdpdGggZGFzaGVzICgnLScpLgorICoKKyAqIFRoaXMgbWFjcm8gbXVzdCBiZSB1c2VkIGluIHRoZSBnbG9iYWwgc2NvcGUgYW5kIG5hbWVzcGFjZS4KKyAqCisgKiAgfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAqICBDMkVOVU0oYzJfZW51bV90LCB1aW50MzJfdCwKKyAqICAgIEMyX1ZBTFVFMSwKKyAqICAgIEMyX1ZBTFVFMiA9IDUsCisgKiAgICBDMl9WQUxVRTMgPSBDMl9WQUxVRTEgKyAxKQorICogIC8vIG5hbWVkIHZhbHVlcyBhcmU6IEMyX1ZBTFVFMSA9PiAiMSIsIEMyX1ZBTFVFMiA9PiAiMiIsIC4uLgorICogIC8vIGxvbmdlc3QgY29tbW9uIHByZWZpeCBpcyAiQzJfVkFMVUUiCisgKiAgfn5+fn5+fn5+fn5+fgorICoKKyAqIFxwYXJhbSBuYW1lIG5hbWUgb2YgdGhlIGVudW0gdHlwZSAoVGhpcyBjYW4gYmUgYW4gaW5uZXIgY2xhc3MgZW51bS4pCisgKiBccGFyYW0gdHlwZSB1bmRlcmx5aW5nIHR5cGUKKyAqLworI2RlZmluZSBDMkVOVU0obmFtZSwgdHlwZSwgLi4uKSBcCitlbnVtIG5hbWUgOiB0eXBlIHsgX19WQV9BUkdTX18gfTsgXAorREVGSU5FX0MyX0VOVU1fVkFMVUVfQVVUT19IRUxQRVIobmFtZSwgdHlwZSwgbnVsbHB0ciwgX19WQV9BUkdTX18pCisKKy8qKgorICogRGVmaW5lcyBhbiBlbnVtIHR5cGUgd2l0aCB0aGUgZGVmYXVsdCBuYW1lZCB2YWx1ZSBtYXBwZXIgYnV0IGN1c3RvbSBwcmVmaXguIFRoZSBkZWZhdWx0CisgKiBtYXBwZXIgcmVtb3ZlcyB0aGUgcHJlZml4IGZyb20gYWxsIG9mIHRoZSBlbnVtIHZhbHVlIG5hbWVzIChpZiBwcmVzZW50KSwgYW5kCisgKiBpbnNlcnRzIGRhc2hlcyBhdCBjYW1lbC1jYXNlIHNlcGFyYXRvcnMgKGxvd0hpZ2ggYmVjb21lcyBsb3ctaGlnaCkgYW5kIGFsc28gcmVwbGFjZXMKKyAqIG5vbi1sZWFkaW5nIHVuZGVyc2NvcmVzIHdpdGggZGFzaGVzICgnLScpLgorICoKKyAqIFRoaXMgbWFjcm8gbXVzdCBiZSB1c2VkIGluIHRoZSBnbG9iYWwgc2NvcGUgYW5kIG5hbWVzcGFjZS4KKyAqCisgKiAgfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAqICBDMkVOVU1fQ1VTVE9NX1BSRUZJWChjMl9lbnVtX3QsIHVpbnQzMl90LCAiQzJfIiwKKyAqICAgIEMyX1ZBTFVFMSwKKyAqICAgIEMyX1ZBTFVFMiA9IDUsCisgKiAgICBDMl9WQUxVRTMgPSBDMl9WQUxVRTEgKyAxKQorICogIC8vIG5hbWVkIHZhbHVlcyBhcmU6IEMyX1ZBTFVFMSA9PiAiVkFMVUUxIiwgQzJfVkFMVUUyID0+ICJWQUxVRTIiLCAuLi4KKyAqICB+fn5+fn5+fn5+fn5+CisgKgorICogXHBhcmFtIG5hbWUgbmFtZSBvZiB0aGUgZW51bSB0eXBlIChUaGlzIGNhbiBiZSBhbiBpbm5lciBjbGFzcyBlbnVtLikKKyAqIFxwYXJhbSB0eXBlIHVuZGVybHlpbmcgdHlwZQorICogXHBhcmFtIHByZWZpeCBwcmVmaXggdG8gcmVtb3ZlCisgKi8KKyNkZWZpbmUgQzJFTlVNX0NVU1RPTV9QUkVGSVgobmFtZSwgdHlwZSwgcHJlZml4LCAuLi4pIFwKK2VudW0gbmFtZSA6IHR5cGUgeyBfX1ZBX0FSR1NfXyB9OyBcCitERUZJTkVfQzJfRU5VTV9WQUxVRV9BVVRPX0hFTFBFUihuYW1lLCB0eXBlLCBwcmVmaXgsIF9fVkFfQVJHU19fKQorCisvKioKKyAqIERlZmluZXMgYW4gZW51bSB0eXBlIHdpdGggY3VzdG9tIG5hbWVzLgorICoKKyAqIFRoaXMgbWFjcm8gbXVzdCBiZSB1c2VkIGluIHRoZSBnbG9iYWwgc2NvcGUgYW5kIG5hbWVzcGFjZS4KKyAqCisgKiAgfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAqICBDMkVOVU1fQ1VTVE9NX05BTUVTKFNvbWVTdHJ1Y3Q6OmMyX2VudW1fdCwgdWludDMyX3QsICh7CisgKiAgICAgIHsgIk9uZSIsIFNvbWVTdHJ1Y3Q6OkMyX1ZBTFVFMSB9LAorICogICAgICB7ICJUd28iLCBTb21lU3RydWN0OjpDMl9WQUxVRTIgfSwKKyAqICAgICAgeyAiVGhyZWUiLCBTb21lU3RydWN0OjpDMl9WQUxVRTMgfSB9KSwKKyAqICAgIEMyX1ZBTFVFMSwKKyAqICAgIEMyX1ZBTFVFMiA9IDUsCisgKiAgICBDMl9WQUxVRTMgPSBDMl9WQUxVRTEgKyAxKQorICoKKyAqICAvLyBuYW1lZCB2YWx1ZXMgYXJlOiBDMl9WQUxVRTEgPT4gIk9uZSIsIEMyX1ZBTFVFMiA9PiAiVHdvIiwgLi4uCisgKiAgfn5+fn5+fn5+fn5+fgorICovCisjZGVmaW5lIEMyRU5VTV9DVVNUT01fTkFNRVMobmFtZSwgdHlwZSwgbmFtZXMsIC4uLikgXAorZW51bSBuYW1lIDogdHlwZSB7IF9fVkFfQVJHU19fIH07IFwKK0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIobmFtZSwgbmFtZXMpCisKKy8qKgorICogTWFrZSBlbnVtcyB1c2FibGUgYXMgdGhlaXIgaW50ZWdyYWwgdHlwZXMuCisgKgorICogTm90ZTogdGhpcyBtYWtlcyB0aGVtIG5vdCB1c2FibGUgaW4gcHJpbnRmKCkKKyAqLwordGVtcGxhdGU8Y2xhc3MgRT4KK3N0cnVjdCBDMkVhc3lFbnVtIHsKKyAgICB1c2luZyBVID0gdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8RT46OnR5cGU7CisgICAgRSB2YWx1ZTsKKyAgICAvLyBkZWZpbmUgY29udmVyc2lvbiBmdW5jdGlvbnMKKyAgICBpbmxpbmUgY29uc3RleHByIG9wZXJhdG9yIEUoKSBjb25zdCB7IHJldHVybiB2YWx1ZTsgfQorICAgIGlubGluZSBjb25zdGV4cHIgQzJFYXN5RW51bShFIHZhbHVlXykgOiB2YWx1ZSh2YWx1ZV8pIHsgfQorICAgIGlubGluZSBjb25zdGV4cHIgQzJFYXN5RW51bShVIHZhbHVlXykgOiB2YWx1ZShFKHZhbHVlXykpIHsgfQorICAgIGlubGluZSBjb25zdGV4cHIgQzJFYXN5RW51bSgpID0gZGVmYXVsdDsKK307CisKKy8vIG1ha2UgQzJFYXN5RW51bSBiZWhhdmUgbGlrZSBhIHJlZ3VsYXIgZW51bQorCituYW1lc3BhY2Ugc3RkIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBFPgorICAgIHN0cnVjdCB1bmRlcmx5aW5nX3R5cGU8QzJFYXN5RW51bTxFPj4geworICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIHVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZSB0eXBlOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBFPgorICAgIHN0cnVjdCBpc19lbnVtPEMyRWFzeUVudW08RT4+IHsKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBib29sIHZhbHVlID0gdHJ1ZTsKKyAgICB9OworfQorCisjZW5kaWYgIC8vIEMyRU5VTV9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW0uaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxZDQxN2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL0MyUGFyYW0uaApAQCAtMCwwICsxLDE2ODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyUEFSQU1fSF8KKyNkZWZpbmUgQzJQQVJBTV9IXworCisjaW5jbHVkZSA8QzIuaD4KKworI2luY2x1ZGUgPHN0ZGJvb2wuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vLyBcYWRkdG9ncm91cCBQYXJhbWV0ZXJzCisvLy8gQHsKKworLy8vIFxkZWZncm91cCBpbnRlcm5hbCBJbnRlcm5hbCBoZWxwZXJzLgorCisvKiEKKyAqIFxmaWxlCisgKiBQQVJBTUVURVJTOiBTRVRUSU5HcywgVFVOSU5HcywgYW5kIElORk9zCisgKiA9PT0KKyAqCisgKiBUaGVzZSByZXByZXNlbnQgbWlzY2VsbGFuZW91cyBjb250cm9sIGFuZCBtZXRhZGF0YSBpbmZvcm1hdGlvbiBhbmQgYXJlIGxpa2VseSBjb3BpZWQgaW50bworICoga2VybmVsIHNwYWNlLiBUaGVyZWZvcmUsIHRoZXNlIGFyZSBDLWxpa2Ugc3RydWN0dXJlcyBkZXNpZ25lZCB0byBjYXJyeSBqdXN0IGEgc21hbGwgYW1vdW50IG9mCisgKiBpbmZvcm1hdGlvbi4gV2UgYXJlIHVzaW5nIEMrKyB0byBiZSBhYmxlIHRvIGFkZCBjb25zdHJ1Y3RvcnMsIGFzIHdlbGwgYXMgbm9uLXZpcnR1YWwgYW5kIGNsYXNzCisgKiBtZXRob2RzLgorICoKKyAqID09U3BlY2lmaWNhdGlvbiBkZXRhaWxzOgorICoKKyAqIFJlc3RyaWN0aW9uczoKKyAqICAgLSBtdXN0IGJlIFBPRCBzdHJ1Y3QsIGUuZy4gbm8gdnRhYmxlIChubyB2aXJ0dWFsIGRlc3RydWN0b3IpCisgKiAgIC0gbXVzdCBoYXZlIHRoZSBzYW1lIHNpemUgaW4gNjQtYml0IGFuZCAzMi1iaXQgbW9kZSAobm8gc2l6ZV90KQorICogICAtIGFzIHN1Y2gsIG5vIHBvaW50ZXIgbWVtYmVycworICogICAtIHNvbWUgY29tbW9uIG1lbWJlciBmaWVsZCBuYW1lcyBhcmUgcmVzZXJ2ZWQgYXMgdGhleSBhcmUgZGVmaW5lZCBhcyBtZXRob2RzIGZvciBhbGwKKyAqICAgICBwYXJhbWV0ZXJzOgorICogICAgIHRoZXkgYXJlOiBzaXplLCB0eXBlLCBraW5kLCBpbmRleCBhbmQgc3RyZWFtCisgKgorICogQmVoYXZpb3I6CisgKiAtIFBhcmFtcyBjYW4gYmUgZ2xvYmFsIChub3QgcmVsYXRlZCB0byBpbnB1dCBvciBvdXRwdXQpLCByZWxhdGVkIHRvIGlucHV0IG9yIG91dHB1dCwKKyAqICAgb3IgcmVsYXRlZCB0byBhbiBpbnB1dC9vdXRwdXQgc3RyZWFtLgorICogLSBBbGwgcGFyYW1zIGFyZSBxdWVyaWVkL3NldCB1c2luZyBhIHVuaXF1ZSBwYXJhbSBpbmRleCwgd2hpY2ggaW5jb3Jwb3JhdGVzIGEgcG90ZW50aWFsIHN0cmVhbQorICogICBpbmRleCBhbmQvb3IgcG9ydC4KKyAqIC0gUXVlcnlpbmcgKHN1cHBvcnRlZCkgcGFyYW1zIE1VU1QgbmV2ZXIgZmFpbC4KKyAqIC0gQWxsIHBhcmFtcyBNVVNUIGhhdmUgZGVmYXVsdCB2YWx1ZXMuCisgKiAtIElmIHNvbWUgZmllbGRzIGhhdmUgInVuc3VwcG9ydGVkIiBvciAiaW52YWxpZCIgdmFsdWVzIGR1cmluZyBzZXR0aW5nLCB0aGlzIFNIT1VMRCBiZQorICogICBjb21tdW5pY2F0ZWQgdG8gdGhlIGFwcC4KKyAqICAgYSkgSWRlYWxseSwgdGhpcyBzaG91bGQgYmUgYXZvaWRlZC4gIFdoZW4gc2V0dGluZyBwYXJhbWV0ZXJzLCBpbiBnZW5lcmFsLCBjb21wb25lbnQgc2hvdWxkIGRvCisgKiAgICAgImJlc3QgZWZmb3J0IiB0byBhcHBseSBhbGwgc2V0dGluZ3MuIEl0IHNob3VsZCBjaGFuZ2UgImludmFsaWQvdW5zdXBwb3J0ZWQiIHZhbHVlcyB0byB0aGUKKyAqICAgICBuZWFyZXN0IHN1cHBvcnRlZCB2YWx1ZXMuCisgKiAgIC0gVGhpcyBpcyBjb21tdW5pY2F0ZWQgdG8gdGhlIGNsaWVudCBieSBjaGFuZ2luZyB0aGUgc291cmNlIHZhbHVlcyBpbiB0dW5lKCkvCisgKiAgICAgY29uZmlndXJlKCkuCisgKiAgIGIpIElmIGZhbGxpbmcgYmFjayB0byBhIHN1cHBvcnRlZCB2YWx1ZSBpcyBhYnNvbHV0ZWx5IGltcG9zc2libGUsIHRoZSBjb21wb25lbnQgU0hBTEwgcmV0dXJuCisgKiAgICAgYW4gZXJyb3IgZm9yIHRoZSBzcGVjaWZpYyBzZXR0aW5nLCBidXQgc2hvdWxkIGNvbnRpbnVlIHRvIGFwcGx5IG90aGVyIHNldHRpbmdzLgorICogICAgIFRPRE86IHRoaXMgY3VycmVudGx5IG1heSByZXN1bHQgaW4gdW5pbnRlbmRlZCByZXN1bHRzLgorICoKKyAqICoqTk9URToqKiB1bmxpa2UgT01YLCBwYXJhbXMgYXJlIG5vdCB2ZXJzaW9uZWQuIEluc3RlYWQsIGEgbmV3IHN0cnVjdCB3aXRoIG5ldyBwYXJhbSBpbmRleAorICogU0hBTEwgYmUgYWRkZWQgYXMgbmV3IHZlcnNpb25zIGFyZSByZXF1aXJlZC4KKyAqCisgKiBUaGUgcHJvcGVyIHN1YnR5cGUgKFNldHRpbmcsIEluZm8gb3IgUGFyYW0pIGlzIGluY29ycG9yYXRlZCBpbnRvIHRoZSBjbGFzcyB0eXBlLiBEZWZpbmUgc3RydWN0cworICogdG8gZGVmaW5lIG11bHRpcGxlIHN1YnR5cGVkIHZlcnNpb25zIG9mIHJlbGF0ZWQgcGFyYW1ldGVycy4KKyAqCisgKiA9PUltcGxlbWVudGF0aW9uIGRldGFpbHM6CisgKgorICogLSBVc2UgbWFjcm9zIHRvIGRlZmluZSBwYXJhbWV0ZXJzCisgKiAtIEFsbCBwYXJhbWV0ZXJzIG11c3QgaGF2ZSBhIGRlZmF1bHQgY29uc3RydWN0b3IKKyAqICAgLSBUaGlzIGlzIG9ubHkgdXNlZCBmb3IgaW5zdGFudGlhdGluZyB0aGUgY2xhc3MgaW4gc291cmNlIChlLmcuIHdpbGwgbm90IGJlIHVzZWQKKyAqICAgICB3aGVuIGJ1aWxkaW5nIGEgcGFyYW1ldGVyIGJ5IHRoZSBmcmFtZXdvcmsgZnJvbSBrZXkvdmFsdWUgcGFpcnMuKQorICovCisKKy8vLyBcaW5ncm91cCBpbnRlcm5hbAorCisvKioKKyAqIFBhcmFtZXRlciBiYXNlIGNsYXNzLgorICovCitzdHJ1Y3QgQzJQYXJhbSB7CisgICAgLy8gcGFyYW0gaW5kZXggZW5jb21wYXNzZXMgdGhlIGZvbGxvd2luZzoKKyAgICAvLworICAgIC8vIC0ga2luZCAoc2V0dGluZywgdHVuaW5nLCBpbmZvLCBzdHJ1Y3QpCisgICAgLy8gLSBzY29wZQorICAgIC8vICAgLSBkaXJlY3Rpb24gKGdsb2JhbCwgaW5wdXQsIG91dHB1dCkKKyAgICAvLyAgIC0gc3RyZWFtIGZsYWcKKyAgICAvLyAgIC0gc3RyZWFtIElEICh1c3VhbGx5IDApCisgICAgLy8gLSBhbmQgdGhlIHBhcmFtZXRlcidzIHR5cGUgKGNvcmUgaW5kZXgpCisgICAgLy8gICAtIGZsZXhpYmxlIHBhcmFtZXRlciBmbGFnCisgICAgLy8gICAtIHZlbmRvciBleHRlbnNpb24gZmxhZworICAgIC8vICAgLSB0eXBlIGluZGV4ICh0aGlzIGluY2x1ZGVzIHRoZSB2ZW5kb3IgZXh0ZW5zaW9uIGZsYWcpCisgICAgLy8KKyAgICAvLyBsYXlvdXQ6CisgICAgLy8KKyAgICAvLyAgICAgICAga2luZCA6IDwtLS0tLS0tIHNjb3BlIC0tLS0tLS0+IDogPC0tLS0tIGNvcmUgaW5kZXggLS0tLS0+CisgICAgLy8gICAgICArLS0tLS0tKy0tLS0tKy0tLSstLS0tLS0rLS0tLS0tLS0rLS0tLXwtLS0tLS0rLS0tLS0tLS0tLS0tLS0rCisgICAgLy8gICAgICB8IGtpbmQgfCBkaXIgfCAtIHxzdHJlYW18c3RyZWFtSUR8ZmxleHx2ZW5kb3J8ICB0eXBlIGluZGV4ICB8CisgICAgLy8gICAgICArLS0tLS0tKy0tLS0tKy0tLSstLS0tLS0rLS0tLS0tLS0rLS0tLSstLS0tLS0rLS0tLS0tLS0tLS0tLS0rCisgICAgLy8gIGJpdDogMzEuLjMwIDI5LjI4ICAgICAgIDI1ICAgMjQgLi4gMTcgIDE2ICAgIDE1ICAgMTQgICAgLi4gICAgIDAKKyAgICAvLworcHVibGljOgorICAgIC8qKgorICAgICAqIEMyUGFyYW0ga2luZHMsIHVzYWJsZSBhcyBiaXRtYXBzLgorICAgICAqLworICAgIGVudW0ga2luZF90IDogdWludDMyX3QgeworICAgICAgICBOT05FICAgID0gMCwKKyAgICAgICAgU1RSVUNUICA9ICgxIDw8IDApLAorICAgICAgICBJTkZPICAgID0gKDEgPDwgMSksCisgICAgICAgIFNFVFRJTkcgPSAoMSA8PCAyKSwKKyAgICAgICAgVFVOSU5HICA9ICgxIDw8IDMpIHwgU0VUVElORywgLy8gdHVuaW5ncyBhcmUgc2V0dGluZ3MKKyAgICB9OworCisgICAgLyoqCisgICAgICogVGhlIHBhcmFtZXRlciB0eXBlIGluZGV4IHNwZWNpZmllcyB0aGUgdW5kZXJseWluZyBwYXJhbWV0ZXIgdHlwZSBvZiBhIHBhcmFtZXRlciBhcworICAgICAqIGFuIGludGVnZXIgdmFsdWUuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXIgdHlwZXMgYXJlIGRpdmlkZWQgaW50byB0d28gZ3JvdXBzOiBwbGF0Zm9ybSB0eXBlcyBhbmQgdmVuZG9yIHR5cGVzLgorICAgICAqCisgICAgICogUGxhdGZvcm0gdHlwZXMgYXJlIGRlZmluZWQgYnkgdGhlIHBsYXRmb3JtIGFuZCBhcmUgY29tbW9uIGZvciBhbGwgaW1wbGVtZW50YXRpb25zLgorICAgICAqCisgICAgICogVmVuZG9yIHR5cGVzIGFyZSBkZWZpbmVkIGJ5IGVhY2ggdmVuZG9ycywgc28gdGhleSBtYXkgZGlmZmVyIGJldHdlZW4gaW1wbGVtZW50YXRpb25zLgorICAgICAqIEl0IGlzIHJlY29tbWVuZGVkIHRoYXQgdmVuZG9yIHR5cGVzIGJlIHRoZSBzYW1lIGZvciBhbGwgaW1wbGVtZW50YXRpb25zIGJ5IGEgc3BlY2lmaWMKKyAgICAgKiB2ZW5kb3IuCisgICAgICovCisgICAgdHlwZWRlZiB1aW50MzJfdCB0eXBlX2luZGV4X3Q7CisgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgICAgIFRZUEVfSU5ERVhfVkVORE9SX1NUQVJUID0gMHgwMDAwODAwMCwgLy8vPCB2ZW5kb3IgaW5kaWNlcyBTSEFMTCBzdGFydCBhZnRlciB0aGlzCisgICAgfTsKKworICAgIC8qKgorICAgICAqIENvcmUgaW5kZXggaXMgdGhlIHVuZGVybHlpbmcgcGFyYW1ldGVyIHR5cGUgZm9yIGEgcGFyYW1ldGVyLiBJdCBpcyB1c2VkIHRvIGRlc2NyaWJlIHRoZQorICAgICAqIGxheW91dCBvZiB0aGUgcGFyYW1ldGVyIHN0cnVjdHVyZSByZWdhcmRsZXNzIG9mIHRoZSBjb21wb25lbnQgb3IgcGFyYW1ldGVyIGtpbmQvc2NvcGUuCisgICAgICoKKyAgICAgKiBJdCBpcyB1c2VkIHRvIGlkZW50aWZ5IGFuZCBkaXN0aW5ndWlzaCBnbG9iYWwgcGFyYW1ldGVycywgYW5kIGFsc28gcGFyYW1ldGVycyBvbiBhIGdpdmVuCisgICAgICogcG9ydCBvciBzdHJlYW0uIFRoZXkgbXVzdCBiZSB1bmlxdWUgZm9yIHRoZSBzZXQgb2YgZ2xvYmFsIHBhcmFtZXRlcnMsIGFzIHdlbGwgYXMgZm9yIHRoZQorICAgICAqIHNldCBvZiBwYXJhbWV0ZXJzIG9uIGVhY2ggcG9ydCBvciBlYWNoIHN0cmVhbSwgYnV0IHRoZSBzYW1lIGNvcmUgaW5kZXggY2FuIGJlIHVzZWQgZm9yCisgICAgICogcGFyYW1ldGVycyBvbiBkaWZmZXJlbnQgc3RyZWFtcyBvciBwb3J0cywgYXMgd2VsbCBhcyBmb3IgZ2xvYmFsIHBhcmFtZXRlcnMgYW5kIHBvcnQvc3RyZWFtCisgICAgICogcGFyYW1ldGVycy4KKyAgICAgKgorICAgICAqIE11bHRpcGxlIHBhcmFtZXRlciB0eXBlcyBjYW4gc2hhcmUgdGhlIHNhbWUgbGF5b3V0LgorICAgICAqCisgICAgICogXG5vdGUgVGhlIGxheW91dCBmb3IgYWxsIHBhcmFtZXRlcnMgd2l0aCB0aGUgc2FtZSBjb3JlIGluZGV4IGFjcm9zcyBhbGwgY29tcG9uZW50cyBtdXN0CisgICAgICogYmUgaWRlbnRpY2FsLgorICAgICAqLworICAgIHN0cnVjdCBDb3JlSW5kZXggeworICAgIC8vcHVibGljOgorICAgICAgICBlbnVtIDogdWludDMyX3QgeworICAgICAgICAgICAgSVNfRkxFWF9GTEFHICAgID0gMHgwMDAxMDAwMCwKKyAgICAgICAgICAgIElTX1JFUVVFU1RfRkxBRyA9IDB4MDAwMjAwMDAsCisgICAgICAgIH07CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgICAgICBLSU5EX01BU0sgICAgICA9IDB4QzAwMDAwMDAsCisgICAgICAgICAgICBLSU5EX1NUUlVDVCAgICA9IDB4MDAwMDAwMDAsCisgICAgICAgICAgICBLSU5EX1RVTklORyAgICA9IDB4NDAwMDAwMDAsCisgICAgICAgICAgICBLSU5EX1NFVFRJTkcgICA9IDB4ODAwMDAwMDAsCisgICAgICAgICAgICBLSU5EX0lORk8gICAgICA9IDB4QzAwMDAwMDAsCisKKyAgICAgICAgICAgIERJUl9NQVNLICAgICAgID0gMHgzMDAwMDAwMCwKKyAgICAgICAgICAgIERJUl9HTE9CQUwgICAgID0gMHgyMDAwMDAwMCwKKyAgICAgICAgICAgIERJUl9VTkRFRklORUQgID0gRElSX01BU0ssIC8vIE1VU1QgaGF2ZSBhbGwgYml0cyBzZXQKKyAgICAgICAgICAgIERJUl9JTlBVVCAgICAgID0gMHgwMDAwMDAwMCwKKyAgICAgICAgICAgIERJUl9PVVRQVVQgICAgID0gMHgxMDAwMDAwMCwKKworICAgICAgICAgICAgSVNfU1RSRUFNX0ZMQUcgID0gMHgwMjAwMDAwMCwKKyAgICAgICAgICAgIFNUUkVBTV9JRF9NQVNLICA9IDB4MDFGMDAwMDAsCisgICAgICAgICAgICBTVFJFQU1fSURfU0hJRlQgPSAyMCwKKyAgICAgICAgICAgIE1BWF9TVFJFQU1fSUQgICA9IFNUUkVBTV9JRF9NQVNLID4+IFNUUkVBTV9JRF9TSElGVCwKKyAgICAgICAgICAgIFNUUkVBTV9NQVNLICAgICA9IElTX1NUUkVBTV9GTEFHIHwgU1RSRUFNX0lEX01BU0ssCisKKyAgICAgICAgICAgIElTX1ZFTkRPUl9GTEFHICA9IDB4MDAwMDgwMDAsCisgICAgICAgICAgICBUWVBFX0lOREVYX01BU0sgPSAweDAwMDBGRkZGLAorICAgICAgICAgICAgQ09SRV9NQVNLICAgICAgID0gVFlQRV9JTkRFWF9NQVNLIHwgSVNfRkxFWF9GTEFHLAorICAgICAgICB9OworCisgICAgcHVibGljOgorICAgICAgICAvLy8gY29uc3RydWN0b3IvY29udmVyc2lvbiBmcm9tIHVpbnQzMl90CisgICAgICAgIGlubGluZSBDb3JlSW5kZXgodWludDMyX3QgaW5kZXgpIDogbUluZGV4KGluZGV4KSB7IH0KKworICAgICAgICAvLyBubyBjb252ZXJzaW9uIGZyb20gdWludDY0X3QKKyAgICAgICAgaW5saW5lIENvcmVJbmRleCh1aW50NjRfdCBpbmRleCkgPSBkZWxldGU7CisKKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIHZlbmRvciBleHRlbnNpb24gcGFyYW1ldGVyCisgICAgICAgIGlubGluZSBib29sIGlzVmVuZG9yKCkgY29uc3QgeyByZXR1cm4gbUluZGV4ICYgSVNfVkVORE9SX0ZMQUc7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgZmxleGlibGUgcGFyYW1ldGVyICh3aXRoIHZhcmlhYmxlIHNpemUpCisgICAgICAgIGlubGluZSBib29sIGlzRmxleGlibGUoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiBJU19GTEVYX0ZMQUc7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgY29yZSBpbmRleAorICAgICAgICAvLy8gVGhpcyBpcyB0aGUgY29tYmluYXRpb24gb2YgdGhlIHBhcmFtZXRlciB0eXBlIGluZGV4IGFuZCB0aGUgZmxleGlibGUgZmxhZy4KKyAgICAgICAgaW5saW5lIHVpbnQzMl90IGNvcmVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIENPUkVfTUFTSzsgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBwYXJhbWV0ZXIgdHlwZSBpbmRleAorICAgICAgICBpbmxpbmUgdHlwZV9pbmRleF90IHR5cGVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleCAmIFRZUEVfSU5ERVhfTUFTSzsgfQorCisgICAgICAgIERFRklORV9GSUVMRF9BTkRfTUFTS19CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyhDb3JlSW5kZXgsIG1JbmRleCwgQ09SRV9NQVNLKQorCisgICAgcHJvdGVjdGVkOgorICAgICAgICB1aW50MzJfdCBtSW5kZXg7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFR5cGUgZW5jb21wYXNzZXMgdGhlIHBhcmFtZXRlcidzIGtpbmQgKHR1bmluZywgc2V0dGluZywgaW5mbyksIGl0cyBzY29wZSAod2hldGhlciB0aGUKKyAgICAgKiBwYXJhbWV0ZXIgaXMgZ2xvYmFsLCBpbnB1dCBvciBvdXRwdXQsIGFuZCB3aGV0aGVyIGl0IGlzIGZvciBhIHN0cmVhbSkgYW5kIHRoZSBpdHMgYmFzZQorICAgICAqIGluZGV4ICh3aGljaCBhbHNvIGRldGVybWluZXMgaXRzIGxheW91dCkuCisgICAgICovCisgICAgc3RydWN0IFR5cGUgOiBwdWJsaWMgQ29yZUluZGV4IHsKKyAgICAvL3B1YmxpYzoKKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIGdsb2JhbCBwYXJhbWV0ZXIgKG5vdCBmb3IgaW5wdXQgbm9yIG91dHB1dCkKKyAgICAgICAgaW5saW5lIGJvb2wgaXNHbG9iYWwoKSBjb25zdCB7IHJldHVybiAobUluZGV4ICYgRElSX01BU0spID09IERJUl9HTE9CQUw7IH0KKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhbiBpbnB1dCBvciBpbnB1dCBzdHJlYW0gcGFyYW1ldGVyCisgICAgICAgIGlubGluZSBib29sIGZvcklucHV0KCkgY29uc3QgeyByZXR1cm4gKG1JbmRleCAmIERJUl9NQVNLKSA9PSBESVJfSU5QVVQ7IH0KKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhbiBvdXRwdXQgb3Igb3V0cHV0IHN0cmVhbSBwYXJhbWV0ZXIKKyAgICAgICAgaW5saW5lIGJvb2wgZm9yT3V0cHV0KCkgY29uc3QgeyByZXR1cm4gKG1JbmRleCAmIERJUl9NQVNLKSA9PSBESVJfT1VUUFVUOyB9CisKKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIHN0cmVhbSBwYXJhbWV0ZXIKKyAgICAgICAgaW5saW5lIGJvb2wgZm9yU3RyZWFtKCkgY29uc3QgeyByZXR1cm4gbUluZGV4ICYgSVNfU1RSRUFNX0ZMQUc7IH0KKyAgICAgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCkgcGFyYW1ldGVyCisgICAgICAgIGlubGluZSBib29sIGZvclBvcnQoKSBjb25zdCAgIHsgcmV0dXJuICFmb3JTdHJlYW0oKSAmJiAhaXNHbG9iYWwoKTsgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBwYXJhbWV0ZXIgdHlwZTogdGhlIHBhcmFtZXRlciBpbmRleCB3aXRob3V0IHRoZSBzdHJlYW0gSUQKKyAgICAgICAgaW5saW5lIHVpbnQzMl90IHR5cGUoKSBjb25zdCB7IHJldHVybiBtSW5kZXggJiAoflNUUkVBTV9JRF9NQVNLKTsgfQorCisgICAgICAgIC8vLyByZXR1cm4gdGhlIGtpbmQgKHN0cnVjdCwgaW5mbywgc2V0dGluZyBvciB0dW5pbmcpIG9mIHRoaXMgcGFyYW0KKyAgICAgICAgaW5saW5lIGtpbmRfdCBraW5kKCkgY29uc3QgeworICAgICAgICAgICAgc3dpdGNoIChtSW5kZXggJiBLSU5EX01BU0spIHsKKyAgICAgICAgICAgICAgICBjYXNlIEtJTkRfU1RSVUNUOiByZXR1cm4gU1RSVUNUOworICAgICAgICAgICAgICAgIGNhc2UgS0lORF9JTkZPOiByZXR1cm4gSU5GTzsKKyAgICAgICAgICAgICAgICBjYXNlIEtJTkRfU0VUVElORzogcmV0dXJuIFNFVFRJTkc7CisgICAgICAgICAgICAgICAgY2FzZSBLSU5EX1RVTklORzogcmV0dXJuIFRVTklORzsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9ORTsgLy8gc2hvdWxkIG5vdCBoYXBwZW4KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vLyBjb25zdHJ1Y3Rvci9jb252ZXJzaW9uIGZyb20gdWludDMyX3QKKyAgICAgICAgaW5saW5lIFR5cGUodWludDMyX3QgaW5kZXgpIDogQ29yZUluZGV4KGluZGV4KSB7IH0KKworICAgICAgICAvLyBubyBjb252ZXJzaW9uIGZyb20gdWludDY0X3QKKyAgICAgICAgaW5saW5lIFR5cGUodWludDY0X3QgaW5kZXgpID0gZGVsZXRlOworCisgICAgICAgIERFRklORV9GSUVMRF9BTkRfTUFTS19CQVNFRF9DT01QQVJJU09OX09QRVJBVE9SUyhUeXBlLCBtSW5kZXgsIH5TVFJFQU1fSURfTUFTSykKKworICAgIHByaXZhdGU6CisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJQYXJhbTsgICAvLyBmb3Igc2V0UG9ydCgpCisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgQzJUdW5pbmc7ICAvLyBmb3IgS0lORF9UVU5JTkcKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBDMlNldHRpbmc7IC8vIGZvciBLSU5EX1NFVFRJTkcKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBDMkluZm87ICAgIC8vIGZvciBLSU5EX0lORk8KKyAgICAgICAgLy8gZm9yIERJUl9HTE9CQUwKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJHbG9iYWxQYXJhbTsKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IEksIGNsYXNzIEY+IGZyaWVuZCBzdHJ1Y3QgQzJQb3J0UGFyYW07ICAgLy8gZm9yIGtEaXIqCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyU3RyZWFtUGFyYW07IC8vIGZvciBrRGlyKgorICAgICAgICBmcmllbmQgc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yOyAvLyBmb3IgdGVzdGluZworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBwb3J0L3N0cmVhbSBkaXJlY3Rpb24uCisgICAgICAgICAqIEByZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiBjb3VsZCBub3Qgc2V0IGRpcmVjdGlvbiAoZS5nLiBpdCBpcyBnbG9iYWwgcGFyYW0pLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0UG9ydChib29sIG91dHB1dCkgeworICAgICAgICAgICAgaWYgKGlzR2xvYmFsKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1JbmRleCA9IChtSW5kZXggJiB+RElSX01BU0spIHwgKG91dHB1dCA/IERJUl9PVVRQVVQgOiBESVJfSU5QVVQpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIGluZGV4IGVuY29tcGFzc2VzIGFsbCByZW1haW5pbmcgaW5mb3JtYXRpb246IGJhc2ljYWxseSB0aGUgc3RyZWFtIElELgorICAgICAqLworICAgIHN0cnVjdCBJbmRleCA6IHB1YmxpYyBUeXBlIHsKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGluZGV4IGFzIHVpbnQzMl90CisgICAgICAgIGlubGluZSBvcGVyYXRvciB1aW50MzJfdCgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleDsgfQorCisgICAgICAgIC8vLyBjb25zdHJ1Y3Rvci9jb252ZXJzaW9uIGZyb20gdWludDMyX3QKKyAgICAgICAgaW5saW5lIEluZGV4KHVpbnQzMl90IGluZGV4KSA6IFR5cGUoaW5kZXgpIHsgfQorCisgICAgICAgIC8vLyBjb3B5IGNvbnN0cnVjdG9yCisgICAgICAgIGlubGluZSBJbmRleChjb25zdCBJbmRleCAmaW5kZXgpID0gZGVmYXVsdDsKKworICAgICAgICAvLyBubyBjb252ZXJzaW9uIGZyb20gdWludDY0X3QKKyAgICAgICAgaW5saW5lIEluZGV4KHVpbnQ2NF90IGluZGV4KSA9IGRlbGV0ZTsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgc3RyZWFtIElEIG9yIH4wIGlmIG5vdCBhIHN0cmVhbQorICAgICAgICBpbmxpbmUgdW5zaWduZWQgc3RyZWFtKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIGZvclN0cmVhbSgpID8gcmF3U3RyZWFtKCkgOiB+MFU7CisgICAgICAgIH0KKworICAgICAgICAvLy8gUmV0dXJucyBhbiBpbmRleCB3aXRoIHN0cmVhbSBmaWVsZCBzZXQgdG8gZ2l2ZW4gc3RyZWFtLgorICAgICAgICBpbmxpbmUgSW5kZXggd2l0aFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIGNvbnN0IHsKKyAgICAgICAgICAgIEluZGV4IGl4ID0gbUluZGV4OworICAgICAgICAgICAgKHZvaWQpaXguc2V0U3RyZWFtKHN0cmVhbSk7CisgICAgICAgICAgICByZXR1cm4gaXg7CisgICAgICAgIH0KKworICAgICAgICAvLy8gc2V0cyB0aGUgcG9ydCAoZGlyZWN0aW9uKS4gUmV0dXJucyB0cnVlIGlmZiBzdWNjZXNzZnVsLgorICAgICAgICBpbmxpbmUgSW5kZXggd2l0aFBvcnQoYm9vbCBvdXRwdXQpIGNvbnN0IHsKKyAgICAgICAgICAgIEluZGV4IGl4ID0gbUluZGV4OworICAgICAgICAgICAgKHZvaWQpaXguc2V0UG9ydChvdXRwdXQpOworICAgICAgICAgICAgcmV0dXJuIGl4OworICAgICAgICB9CisKKyAgICAgICAgREVGSU5FX0ZJRUxEX0JBU0VEX0NPTVBBUklTT05fT1BFUkFUT1JTKEluZGV4LCBtSW5kZXgpCisKKyAgICBwcml2YXRlOgorICAgICAgICBmcmllbmQgc3RydWN0IEMyUGFyYW07ICAgICAgICAgICAvLyBmb3Igc2V0U3RyZWFtLCBNYWtlU3RyZWFtSWQsIGlzVmFsaWQKKyAgICAgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsgLy8gZm9yIHRlc3RpbmcKKworICAgICAgICAvKioKKyAgICAgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0eXBlIGlzIHZhbGlkLCBlLmcuIGRpcmVjdGlvbiBpcyBub3QgdW5kZWZpbmVkIEFORAorICAgICAgICAgKiBzdHJlYW0gaXMgMCBpZiBub3QgYSBzdHJlYW0gcGFyYW0uCisgICAgICAgICAqLworICAgICAgICBpbmxpbmUgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgICAgICAgICAgLy8gdGhlcmUgaXMgbm8gVHlwZTo6aXNWYWxpZCAoZXZlbiB0aG91Z2ggc29tZSBvZiB0aGlzIGNoZWNrIGNvdWxkIGJlCisgICAgICAgICAgICAvLyBwZXJmb3JtZWQgb24gdHlwZXMpIGFzIHRoaXMgaXMgb25seSB1c2VkIG9uIGluZGV4Li4uCisgICAgICAgICAgICByZXR1cm4gKGZvclN0cmVhbSgpID8gcmF3U3RyZWFtKCkgPCBNQVhfU1RSRUFNX0lEIDogcmF3U3RyZWFtKCkgPT0gMCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKG1JbmRleCAmIERJUl9NQVNLKSAhPSBESVJfVU5ERUZJTkVEOworICAgICAgICB9CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIHJhdyBzdHJlYW0gSUQgZmllbGQKKyAgICAgICAgaW5saW5lIHVuc2lnbmVkIHJhd1N0cmVhbSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAobUluZGV4ICYgU1RSRUFNX0lEX01BU0spID4+IFNUUkVBTV9JRF9TSElGVDsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBzdHJlYW1JZCBiaXRmaWVsZCBmb3IgYSBnaXZlbiB8c3RyZWFtfC4gSWYgc3RyZWFtIGlzIGludmFsaWQsCisgICAgICAgIC8vLyByZXR1cm5zIGFuIGludmFsaWQgYml0ZmllbGQuCisgICAgICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgTWFrZVN0cmVhbUlkKHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICAgICAgLy8gc2F0dXJhdGUgc3RyZWFtIElEIChtYXggdmFsdWUgaXMgaW52YWxpZCkKKyAgICAgICAgICAgIGlmIChzdHJlYW0gPiBNQVhfU1RSRUFNX0lEKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtID0gTUFYX1NUUkVBTV9JRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAoc3RyZWFtIDw8IFNUUkVBTV9JRF9TSElGVCkgJiBTVFJFQU1fSURfTUFTSzsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSBib29sIGNvbnZlcnRUb1N0cmVhbShib29sIG91dHB1dCwgdW5zaWduZWQgc3RyZWFtKSB7CisgICAgICAgICAgICBtSW5kZXggPSAobUluZGV4ICYgfkRJUl9NQVNLKSB8IElTX1NUUkVBTV9GTEFHOworICAgICAgICAgICAgKHZvaWQpc2V0UG9ydChvdXRwdXQpOworICAgICAgICAgICAgcmV0dXJuIHNldFN0cmVhbShzdHJlYW0pOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIHZvaWQgY29udmVydFRvUG9ydChib29sIG91dHB1dCkgeworICAgICAgICAgICAgbUluZGV4ID0gKG1JbmRleCAmIH4oRElSX01BU0sgfCBJU19TVFJFQU1fRkxBRykpOworICAgICAgICAgICAgKHZvaWQpc2V0UG9ydChvdXRwdXQpOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIHZvaWQgY29udmVydFRvR2xvYmFsKCkgeworICAgICAgICAgICAgbUluZGV4ID0gKG1JbmRleCAmIH4oRElSX01BU0sgfCBJU19TVFJFQU1fRkxBRykpIHwgRElSX0dMT0JBTDsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIGNvbnZlcnRUb1JlcXVlc3QoKSB7CisgICAgICAgICAgICBtSW5kZXggPSBtSW5kZXggfCBJU19SRVFVRVNUX0ZMQUc7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogU2V0cyB0aGUgc3RyZWFtIGluZGV4LgorICAgICAgICAgKiBccmV0dXJuIHRydWUgb24gc3VjY2VzcywgZmFsc2UgaWYgY291bGQgbm90IHNldCBpbmRleCAoZS5nLiBub3QgYSBzdHJlYW0gcGFyYW0pLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICAgICAgaWYgKGZvclN0cmVhbSgpKSB7CisgICAgICAgICAgICAgICAgbUluZGV4ID0gKG1JbmRleCAmIH5TVFJFQU1fSURfTUFTSykgfCBNYWtlU3RyZWFtSWQoc3RyZWFtKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy0+c3RyZWFtKCkgPCBNQVhfU1RSRUFNX0lEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfTsKKworcHVibGljOgorICAgIC8vIHB1YmxpYyBnZXR0ZXJzIGZvciBJbmRleCBtZXRob2RzCisKKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgdmVuZG9yIGV4dGVuc2lvbiBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgYm9vbCBpc1ZlbmRvcigpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguaXNWZW5kb3IoKTsgfQorICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBmbGV4aWJsZSBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgYm9vbCBpc0ZsZXhpYmxlKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5pc0ZsZXhpYmxlKCk7IH0KKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGEgZ2xvYmFsIHBhcmFtZXRlciAobm90IGZvciBpbnB1dCBub3Igb3V0cHV0KQorICAgIGlubGluZSBib29sIGlzR2xvYmFsKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5pc0dsb2JhbCgpOyB9CisgICAgLy8vIHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBpcyBhbiBpbnB1dCBvciBpbnB1dCBzdHJlYW0gcGFyYW1ldGVyCisgICAgaW5saW5lIGJvb2wgZm9ySW5wdXQoKSBjb25zdCB7IHJldHVybiBfbUluZGV4LmZvcklucHV0KCk7IH0KKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIGFuIG91dHB1dCBvciBvdXRwdXQgc3RyZWFtIHBhcmFtZXRlcgorICAgIGlubGluZSBib29sIGZvck91dHB1dCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguZm9yT3V0cHV0KCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBzdHJlYW0gcGFyYW1ldGVyCisgICAgaW5saW5lIGJvb2wgZm9yU3RyZWFtKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5mb3JTdHJlYW0oKTsgfQorICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoaXMgaXMgYSBwb3J0IChpbnB1dCBvciBvdXRwdXQpIHBhcmFtZXRlcgorICAgIGlubGluZSBib29sIGZvclBvcnQoKSBjb25zdCAgIHsgcmV0dXJuIF9tSW5kZXguZm9yUG9ydCgpOyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgc3RyZWFtIElEIG9yIH4wIGlmIG5vdCBhIHN0cmVhbQorICAgIGlubGluZSB1bnNpZ25lZCBzdHJlYW0oKSBjb25zdCB7IHJldHVybiBfbUluZGV4LnN0cmVhbSgpOyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHR5cGU6IHRoZSBwYXJhbWV0ZXIgaW5kZXggd2l0aG91dCB0aGUgc3RyZWFtIElECisgICAgaW5saW5lIFR5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXgudHlwZSgpOyB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgaW5kZXggb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICAvLy8gXHRvZG86IHNob3VsZCB3ZSByZXN0cmljdCB0aGlzIHRvIEMyUGFyYW1GaWVsZD8KKyAgICBpbmxpbmUgdWludDMyX3QgaW5kZXgoKSBjb25zdCB7IHJldHVybiAodWludDMyX3QpX21JbmRleDsgfQorCisgICAgLy8vIHJldHVybnMgdGhlIGNvcmUgaW5kZXggb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICBpbmxpbmUgQ29yZUluZGV4IGNvcmVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguY29yZUluZGV4KCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBraW5kIG9mIHRoaXMgcGFyYW1ldGVyCisgICAgaW5saW5lIGtpbmRfdCBraW5kKCkgY29uc3QgeyByZXR1cm4gX21JbmRleC5raW5kKCk7IH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBwYXJhbWV0ZXIgb3IgMCBpZiB0aGUgcGFyYW1ldGVyIGlzIGludmFsaWQKKyAgICBpbmxpbmUgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBfbVNpemU7IH0KKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoZSBwYXJhbWV0ZXIgaXMgdmFsaWQKKyAgICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIF9tSW5kZXguaXNWYWxpZCgpICYmIF9tU2l6ZSA+IDA7IH0KKworICAgIC8vLyByZXR1cm5zIHRydWUgaWZmIHRoZSBwYXJhbWV0ZXIgaXMgaW52YWxpZAorICAgIGlubGluZSBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvciBib29sKCk7IH0KKworICAgIC8vIGVxdWFsaXR5IGlzIGRvbmUgYnkgbWVtY21wICh1c2UgZXF1YWxzKCkgdG8gcHJldmVudCBhbnkgb3ZlcnJlYWQpCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDMlBhcmFtICZvKSBjb25zdCB7CisgICAgICAgIHJldHVybiBlcXVhbHMobykgJiYgbWVtY21wKHRoaXMsICZvLCBfbVNpemUpID09IDA7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgQzJQYXJhbSAmbykgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0obyk7IH0KKworICAgIC8vLyBzYWZlKHIpIHR5cGUgY2FzdCBmcm9tIHBvaW50ZXIgYW5kIHNpemUKKyAgICBpbmxpbmUgc3RhdGljIEMyUGFyYW0qIEZyb20odm9pZCAqYWRkciwgc2l6ZV90IGxlbikgeworICAgICAgICAvLyBfbVNpemUgbXVzdCBmaXQgaW50byBzaXplLCBidXQgcmVhbGx5IEMyUGFyYW0gbXVzdCBhbHNvIHRvIGJlIGEgdmFsaWQgcGFyYW0KKyAgICAgICAgaWYgKGxlbiA8IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgLy8gX21TaXplIG11c3QgbWF0Y2ggbGVuZ3RoCisgICAgICAgIEMyUGFyYW0gKnBhcmFtID0gKEMyUGFyYW0qKWFkZHI7CisgICAgICAgIGlmIChwYXJhbS0+X21TaXplICE9IGxlbikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBhcmFtOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIG1hbmFnZWQgY2xvbmUgb2YgfG9yaWd8IGF0IGhlYXAuCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gQ29weShjb25zdCBDMlBhcmFtICZvcmlnKSB7CisgICAgICAgIGlmIChvcmlnLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICB2b2lkICptZW0gPSA6Om9wZXJhdG9yIG5ldyAob3JpZy5zaXplKCkpOworICAgICAgICBDMlBhcmFtICpwYXJhbSA9IG5ldyAobWVtKSBDMlBhcmFtKG9yaWcuc2l6ZSgpLCBvcmlnLl9tSW5kZXgpOworICAgICAgICBwYXJhbS0+dXBkYXRlRnJvbShvcmlnKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPihwYXJhbSk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgbWFuYWdlZCBjbG9uZSBvZiB8b3JpZ3wgYXMgYSBzdHJlYW0gcGFyYW1ldGVyIGF0IGhlYXAuCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gQ29weUFzU3RyZWFtKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAmb3JpZywgYm9vbCBvdXRwdXQsIHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gY29weSA9IENvcHkob3JpZyk7CisgICAgICAgIGlmIChjb3B5KSB7CisgICAgICAgICAgICBjb3B5LT5fbUluZGV4LmNvbnZlcnRUb1N0cmVhbShvdXRwdXQsIHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgbWFuYWdlZCBjbG9uZSBvZiB8b3JpZ3wgYXMgYSBwb3J0IHBhcmFtZXRlciBhdCBoZWFwLgorICAgIGlubGluZSBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IENvcHlBc1BvcnQoY29uc3QgQzJQYXJhbSAmb3JpZywgYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IGNvcHkgPSBDb3B5KG9yaWcpOworICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgY29weS0+X21JbmRleC5jb252ZXJ0VG9Qb3J0KG91dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgbWFuYWdlZCBjbG9uZSBvZiB8b3JpZ3wgYXMgYSBnbG9iYWwgcGFyYW1ldGVyIGF0IGhlYXAuCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gQ29weUFzR2xvYmFsKGNvbnN0IEMyUGFyYW0gJm9yaWcpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IGNvcHkgPSBDb3B5KG9yaWcpOworICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgY29weS0+X21JbmRleC5jb252ZXJ0VG9HbG9iYWwoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29weTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyBtYW5hZ2VkIGNsb25lIG9mIHxvcmlnfCBhcyBhIHN0cmVhbSBwYXJhbWV0ZXIgYXQgaGVhcC4KKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBDb3B5QXNSZXF1ZXN0KGNvbnN0IEMyUGFyYW0gJm9yaWcpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IGNvcHkgPSBDb3B5KG9yaWcpOworICAgICAgICBpZiAoY29weSkgeworICAgICAgICAgICAgY29weS0+X21JbmRleC5jb252ZXJ0VG9SZXF1ZXN0KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGNvcHk7CisgICAgfQorCisjaWYgMAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFAsIGNsYXNzPWRlY2x0eXBlKEMyUGFyYW0oUCgpKSk+CisgICAgUCAqQXMoKSB7IHJldHVybiBQOjpGcm9tKHRoaXMpOyB9CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUD4KKyAgICBjb25zdCBQICpBcygpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2Nhc3Q8Y29uc3QgUCo+KFA6OkZyb20oY29uc3RfY2FzdDxDMlBhcmFtKj4odGhpcykpKTsgfQorI2VuZGlmCisKK3Byb3RlY3RlZDoKKyAgICAvLy8gc2V0cyB0aGUgc3RyZWFtIGZpZWxkLiBSZXR1cm5zIHRydWUgaWZmIHN1Y2Nlc3NmdWwuCisgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeworICAgICAgICByZXR1cm4gX21JbmRleC5zZXRTdHJlYW0oc3RyZWFtKTsKKyAgICB9CisKKyAgICAvLy8gc2V0cyB0aGUgcG9ydCAoZGlyZWN0aW9uKS4gUmV0dXJucyB0cnVlIGlmZiBzdWNjZXNzZnVsLgorICAgIGlubGluZSBib29sIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgcmV0dXJuIF9tSW5kZXguc2V0UG9ydChvdXRwdXQpOworICAgIH0KKworcHVibGljOgorICAgIC8vLyBpbnZhbGlkYXRlIHRoaXMgcGFyYW1ldGVyLiBUaGVyZSBpcyBubyByZWNvdmVyeSBmcm9tIHRoaXMgY2FsbDsgZS5nLiBwYXJhbWV0ZXIKKyAgICAvLy8gY2Fubm90IGJlICdjb3JyZWN0ZWQnIHRvIGJlIHZhbGlkLgorICAgIGlubGluZSB2b2lkIGludmFsaWRhdGUoKSB7IF9tU2l6ZSA9IDA7IH0KKworICAgIC8vIGlmIG90aGVyIGlzIHRoZSBzYW1lIGtpbmQgb2YgKHZhbGlkKSBwYXJhbSBhcyB0aGlzLCBjb3B5IGl0IGludG8gdGhpcyBhbmQgcmV0dXJuIHRydWUuCisgICAgLy8gb3RoZXJ3aXNlLCBkbyBub3QgY29weSBhbnl0aGluZywgYW5kIHJldHVybiBmYWxzZS4KKyAgICBpbmxpbmUgYm9vbCB1cGRhdGVGcm9tKGNvbnN0IEMyUGFyYW0gJm90aGVyKSB7CisgICAgICAgIGlmIChvdGhlci5fbVNpemUgPD0gX21TaXplICYmIG90aGVyLl9tSW5kZXggPT0gX21JbmRleCAmJiBfbVNpemUgPiAwKSB7CisgICAgICAgICAgICBtZW1jcHkodGhpcywgJm90aGVyLCBvdGhlci5fbVNpemUpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIC8vIHJldHVybnMgfG98IGlmIGl0IGlzIGEgbnVsbCBwdHIsIG9yIGlmIGNhbiBzdWl0YWJseSBiZSBhIHBhcmFtIG9mIGdpdmVuIHx0eXBlfCAoZS5nLiBoYXMKKyAgICAvLyBzYW1lIHR5cGUgKGlnbm9yaW5nIHN0cmVhbSBJRCksIGFuZCBzaXplKS4gT3RoZXJ3aXNlLCByZXR1cm5zIG51bGwuIElmIHxjaGVja0RpcnwgaXMgZmFsc2UsCisgICAgLy8gYWxsb3cgdW5kZWZpbmVkIG9yIGRpZmZlcmVudCBkaXJlY3Rpb24gKGUuZy4gYXMgY29uc3RydWN0ZWQgZnJvbSBDMlBvcnRQYXJhbSgpIHZzLgorICAgIC8vIEMyUG9ydFBhcmFtOjppbnB1dCksIGJ1dCBzdGlsbCByZXF1aXJlIGVxdWl2YWxlbnQgdHlwZSAoc3RyZWFtLCBwb3J0IG9yIGdsb2JhbCk7IG90aGVyd2lzZSwKKyAgICAvLyByZXR1cm4gbnVsbC4KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0IEMyUGFyYW0qIElmU3VpdGFibGUoCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtKiBvLCBzaXplX3Qgc2l6ZSwgVHlwZSB0eXBlLCBzaXplX3QgZmxleFNpemUgPSAwLCBib29sIGNoZWNrRGlyID0gdHJ1ZSkgeworICAgICAgICBpZiAobyA9PSBudWxscHRyIHx8IG8tPl9tU2l6ZSA8IHNpemUgfHwgKGZsZXhTaXplICYmICgoby0+X21TaXplIC0gc2l6ZSkgJSBmbGV4U2l6ZSkpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIGlmIChjaGVja0RpcikgeworICAgICAgICAgICAgcmV0dXJuIG8tPl9tSW5kZXgudHlwZSgpID09IHR5cGUubUluZGV4ID8gbyA6IG51bGxwdHI7CisgICAgICAgIH0gZWxzZSBpZiAoby0+X21JbmRleC5pc0dsb2JhbCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAoKG8tPl9tSW5kZXgudHlwZSgpIF4gdHlwZS5tSW5kZXgpICYgflR5cGU6OkRJUl9NQVNLKSA/IG51bGxwdHIgOiBvOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIGJhc2UgY29uc3RydWN0b3IKKyAgICBpbmxpbmUgQzJQYXJhbSh1aW50MzJfdCBwYXJhbVNpemUsIEluZGV4IHBhcmFtSW5kZXgpCisgICAgICAgIDogX21TaXplKHBhcmFtU2l6ZSksCisgICAgICAgICAgX21JbmRleChwYXJhbUluZGV4KSB7CisgICAgICAgIGlmIChwYXJhbVNpemUgPiBzaXplb2YoQzJQYXJhbSkpIHsKKyAgICAgICAgICAgIG1lbXNldCh0aGlzICsgMSwgMCwgcGFyYW1TaXplIC0gc2l6ZW9mKEMyUGFyYW0pKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBiYXNlIGNvbnN0cnVjdG9yIHdpdGggc3RyZWFtIHNldAorICAgIGlubGluZSBDMlBhcmFtKHVpbnQzMl90IHBhcmFtU2l6ZSwgSW5kZXggcGFyYW1JbmRleCwgdW5zaWduZWQgc3RyZWFtKQorICAgICAgICA6IF9tU2l6ZShwYXJhbVNpemUpLAorICAgICAgICAgIF9tSW5kZXgocGFyYW1JbmRleCB8IEluZGV4OjpNYWtlU3RyZWFtSWQoc3RyZWFtKSkgeworICAgICAgICBpZiAocGFyYW1TaXplID4gc2l6ZW9mKEMyUGFyYW0pKSB7CisgICAgICAgICAgICBtZW1zZXQodGhpcyArIDEsIDAsIHBhcmFtU2l6ZSAtIHNpemVvZihDMlBhcmFtKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmb3JTdHJlYW0oKSkgeworICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7IC8vIGZvciB0ZXN0aW5nCisKKyAgICAvLy8gcmV0dXJucyB0cnVlIGlmZiB8b3wgaGFzIHRoZSBzYW1lIHNpemUgYW5kIGluZGV4IGFzIHRoaXMuIFRoaXMgcGVyZm9ybXMgdGhlCisgICAgLy8vIGJhc2ljIGNoZWNrIGZvciBlcXVhbGl0eS4KKyAgICBpbmxpbmUgYm9vbCBlcXVhbHMoY29uc3QgQzJQYXJhbSAmbykgY29uc3QgeworICAgICAgICByZXR1cm4gX21TaXplID09IG8uX21TaXplICYmIF9tSW5kZXggPT0gby5fbUluZGV4OworICAgIH0KKworICAgIHVpbnQzMl90IF9tU2l6ZTsKKyAgICBJbmRleCBfbUluZGV4OworfTsKKworLy8vIFxpbmdyb3VwIGludGVybmFsCisvLy8gYWxsb3cgQzJQYXJhbXMgYWNjZXNzIHRvIHByaXZhdGUgbWV0aG9kcywgZS5nLiBjb25zdHJ1Y3RvcnMKKyNkZWZpbmUgQzJQQVJBTV9NQUtFX0ZSSUVORFMgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyR2xvYmFsUGFyYW07IFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBTLCBpbnQgSSwgY2xhc3MgRj4gZnJpZW5kIHN0cnVjdCBDMlBvcnRQYXJhbTsgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFMsIGludCBJLCBjbGFzcyBGPiBmcmllbmQgc3RydWN0IEMyU3RyZWFtUGFyYW07IFwKKworLyoqCisgKiBTZXR0aW5nIGJhc2Ugc3RydWN0dXJlIGZvciBjb21wb25lbnQgbWV0aG9kIHNpZ25hdHVyZXMuIFdyYXAgY29uc3RydWN0b3JzLgorICovCitzdHJ1Y3QgQzJTZXR0aW5nIDogcHVibGljIEMyUGFyYW0geworcHJvdGVjdGVkOgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMyU2V0dGluZyhjb25zdCBBcmdzKCYuLi4gYXJncykpIDogQzJQYXJhbShhcmdzLi4uKSB7IH0KK3B1YmxpYzogLy8gVE9ETworICAgIGVudW0gOiB1aW50MzJfdCB7IFBBUkFNX0tJTkQgPSBUeXBlOjpLSU5EX1NFVFRJTkcgfTsKK307CisKKy8qKgorICogVHVuaW5nIGJhc2Ugc3RydWN0dXJlIGZvciBjb21wb25lbnQgbWV0aG9kIHNpZ25hdHVyZXMuIFdyYXAgY29uc3RydWN0b3JzLgorICovCitzdHJ1Y3QgQzJUdW5pbmcgOiBwdWJsaWMgQzJTZXR0aW5nIHsKK3Byb3RlY3RlZDoKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGlubGluZSBDMlR1bmluZyhjb25zdCBBcmdzKCYuLi4gYXJncykpIDogQzJTZXR0aW5nKGFyZ3MuLi4pIHsgfQorcHVibGljOiAvLyBUT0RPCisgICAgZW51bSA6IHVpbnQzMl90IHsgUEFSQU1fS0lORCA9IFR5cGU6OktJTkRfVFVOSU5HIH07Cit9OworCisvKioKKyAqIEluZm8gYmFzZSBzdHJ1Y3R1cmUgZm9yIGNvbXBvbmVudCBtZXRob2Qgc2lnbmF0dXJlcy4gV3JhcCBjb25zdHJ1Y3RvcnMuCisgKi8KK3N0cnVjdCBDMkluZm8gOiBwdWJsaWMgQzJQYXJhbSB7Citwcm90ZWN0ZWQ6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbmxpbmUgQzJJbmZvKGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBDMlBhcmFtKGFyZ3MuLi4pIHsgfQorcHVibGljOiAvLyBUT0RPCisgICAgZW51bSA6IHVpbnQzMl90IHsgUEFSQU1fS0lORCA9IFR5cGU6OktJTkRfSU5GTyB9OworfTsKKworLyoqCisgKiBTdHJ1Y3R1cmUgdW5pcXVlbHkgc3BlY2lmeWluZyBhIGZpZWxkIGluIGFuIGFyYml0cmFyeSBzdHJ1Y3R1cmUuCisgKgorICogXG5vdGUgVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCBkaWZmZXJlbnRseSBpbiBDMkZpZWxkRGVzY3JpcHRvciB0bworICogaWRlbnRpZnkgYXJyYXkgZmllbGRzLCBzdWNoIHRoYXQgX21TaXplIGlzIHRoZSBzaXplIG9mIGVhY2ggZWxlbWVudC4gVGhpcyBpcworICogYmVjYXVzZSB0aGUgZmllbGQgZGVzY3JpcHRvciBjb250YWlucyB0aGUgYXJyYXktbGVuZ3RoLCBhbmQgd2Ugd2FudCB0byBrZWVwCisgKiBhIHJlbGV2YW50IGVsZW1lbnQgc2l6ZSBmb3IgdmFyaWFibGUgbGVuZ3RoIGFycmF5cy4KKyAqLworc3RydWN0IF9DMkZpZWxkSWQgeworLy9wdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdXNlZCBmb3IgQzJGaWVsZERlc2NyaXB0b3IgdGhhdCByZW1vdmVzIHRoZSBhcnJheSBleHRlbnQuCisgICAgICoKKyAgICAgKiBccGFyYW1baW5dIG9mZnNldCBwb2ludGVyIHRvIHRoZSBmaWVsZCBpbiBhbiBvYmplY3QgYXQgYWRkcmVzcyAwLgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIGNsYXNzIEI9dHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFQ+Ojp0eXBlPgorICAgIGlubGluZSBfQzJGaWVsZElkKFQqIG9mZnNldCkKKyAgICAgICAgOiAvLyBvZmZzZXQgaXMgZnJvbSAiMCIgc28gd2lsbCBmaXQgb24gMzItYml0cworICAgICAgICAgIF9tT2Zmc2V0KCh1aW50MzJfdCkodWludHB0cl90KShvZmZzZXQpKSwKKyAgICAgICAgICBfbVNpemUoc2l6ZW9mKEIpKSB7IH0KKworICAgIC8qKgorICAgICAqIERpcmVjdCBjb25zdHJ1Y3RvciBmcm9tIG9mZnNldCBhbmQgc2l6ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gb2Zmc2V0IG9mZnNldCBvZiB0aGUgZmllbGQuCisgICAgICogXHBhcmFtW2luXSBzaXplIHNpemUgb2YgdGhlIGZpZWxkLgorICAgICAqLworICAgIGlubGluZSBfQzJGaWVsZElkKHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9tT2Zmc2V0KG9mZnNldCksIF9tU2l6ZShzaXplKSB7fQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0b3IgdXNlZCB0byBpZGVudGlmeSBhIGZpZWxkIGluIGFuIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBVW3R5cGVdIHBvaW50ZXIgdG8gdGhlIG9iamVjdCB0aGF0IGNvbnRhaW5zIHRoaXMgZmllbGQuIFRoaXMgaXMgbmVlZGVkIGluIGNhc2UgdGhlCisgICAgICogICAgICAgIGZpZWxkIGlzIGluIGFuIChpbmhlcml0ZWQpIGJhc2UgY2xhc3MsIGluIHdoaWNoIGNhc2UgVCB3aWxsIGJlIHRoYXQgYmFzZSBjbGFzcy4KKyAgICAgKiBccGFyYW0gcG1baW1dIG1lbWJlciBwb2ludGVyIHRvIHRoZSBmaWVsZAorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lIEI9dHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFI+Ojp0eXBlPgorICAgIGlubGluZSBfQzJGaWVsZElkKFUgKiwgUiBUOjoqIHBtKQorICAgICAgICA6IF9tT2Zmc2V0KCh1aW50MzJfdCkodWludHB0cl90KSgmKCgoVSopMjU2KS0+KnBtKSkgLSAyNTZ1KSwKKyAgICAgICAgICBfbVNpemUoc2l6ZW9mKEIpKSB7IH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdG9yIHVzZWQgdG8gaWRlbnRpZnkgYSBmaWVsZCBpbiBhbiBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG1baW1dIG1lbWJlciBwb2ludGVyIHRvIHRoZSBmaWVsZAorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEI9dHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFI+Ojp0eXBlPgorICAgIGlubGluZSBfQzJGaWVsZElkKFIgVDo6KiBwbSkKKyAgICAgICAgOiBfbU9mZnNldCgodWludDMyX3QpKHVpbnRwdHJfdCkoJigoKFQqKTApLT4qcG0pKSksCisgICAgICAgICAgX21TaXplKHNpemVvZihCKSkgeyB9CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF9DMkZpZWxkSWQgJm90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbU9mZnNldCA9PSBvdGhlci5fbU9mZnNldCAmJiBfbVNpemUgPT0gb3RoZXIuX21TaXplOworICAgIH0KKworICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBfQzJGaWVsZElkICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gX21PZmZzZXQgPCBvdGhlci5fbU9mZnNldCB8fAorICAgICAgICAgICAgLy8gTk9URTogb3JkZXIgcGFyZW50IHN0cnVjdHVyZSBiZWZvcmUgc3ViIGZpZWxkCisgICAgICAgICAgICAoX21PZmZzZXQgPT0gb3RoZXIuX21PZmZzZXQgJiYgX21TaXplID4gb3RoZXIuX21TaXplKTsKKyAgICB9CisKKyAgICBERUZJTkVfT1RIRVJfQ09NUEFSSVNPTl9PUEVSQVRPUlMoX0MyRmllbGRJZCkKKworI2lmIDAKKyAgICBpbmxpbmUgdWludDMyX3Qgb2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gX21PZmZzZXQ7IH0KKyAgICBpbmxpbmUgdWludDMyX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9tU2l6ZTsgfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEZSSUVORF9URVNUKQorICAgIGZyaWVuZCB2b2lkIFByaW50VG8oY29uc3QgX0MyRmllbGRJZCAmZCwgOjpzdGQ6Om9zdHJlYW0qKTsKKyNlbmRpZgorCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgX0MyUGFyYW1JbnNwZWN0b3I7CisgICAgZnJpZW5kIHN0cnVjdCBDMkZpZWxkRGVzY3JpcHRvcjsKKworICAgIHVpbnQzMl90IF9tT2Zmc2V0OyAvLyBvZmZzZXQgb2YgZmllbGQKKyAgICB1aW50MzJfdCBfbVNpemU7ICAgLy8gc2l6ZSBvZiBmaWVsZAorfTsKKworLyoqCisgKiBTdHJ1Y3R1cmUgdW5pcXVlbHkgc3BlY2lmeWluZyBhICdmaWVsZCcgaW4gYSBjb25maWd1cmF0aW9uLiBUaGUgZmllbGQKKyAqIGNhbiBiZSBhIGZpZWxkIG9mIGEgY29uZmlndXJhdGlvbiwgYSBzdWJmaWVsZCBvZiBhIGZpZWxkIG9mIGEgY29uZmlndXJhdGlvbiwKKyAqIGFuZCBldmVuIHRoZSB3aG9sZSBjb25maWd1cmF0aW9uLiBNb3Jlb3ZlciwgaWYgdGhlIGZpZWxkIGNhbiBwb2ludCB0byBhbgorICogZWxlbWVudCBpbiBhIGFycmF5IGZpZWxkLCBvciB0byB0aGUgZW50aXJlIGFycmF5IGZpZWxkLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIGlzIHVzZWQgZm9yIHF1ZXJ5aW5nIHN1cHBvcnRlZCB2YWx1ZXMgZm9yIGEgZmllbGQsIGFzIHdlbGwKKyAqIGFzIGNvbW11bmljYXRpbmcgY29uZmlndXJhdGlvbiBmYWlsdXJlcyBhbmQgY29uZmxpY3RzIHdoZW4gdHJ5aW5nIHRvIGNoYW5nZQorICogYSBjb25maWd1cmF0aW9uIGZvciBhIGNvbXBvbmVudC9pbnRlcmZhY2Ugb3IgYSBzdG9yZS4KKyAqLworc3RydWN0IEMyUGFyYW1GaWVsZCB7CisvL3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBmaWVsZCBpZGVudGlmaWVyIHVzaW5nIGEgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXIgKHZhcmlhYmxlKSwKKyAgICAgKiBhbmQgYSBwb2ludGVyIHRvIG1lbWJlci4KKyAgICAgKgorICAgICAqIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgICAgICoKKyAgICAgKiBzdHJ1Y3QgQzJTb21lUGFyYW0geworICAgICAqICAgdWludDMyX3QgbUZpZWxkOworICAgICAqICAgdWludDMyX3QgbUFycmF5WzJdOworICAgICAqICAgQzJPdGhlclN0cnVjdCBtU3RydWN0OworICAgICAqICAgdWludDMyX3QgbUZsZXhBcnJheVtdOworICAgICAqIH0gKm1QYXJhbTsKKyAgICAgKgorICAgICAqIEMyUGFyYW1GaWVsZChtUGFyYW0sICZtUGFyYW0tPm1GaWVsZCk7CisgICAgICogQzJQYXJhbUZpZWxkKG1QYXJhbSwgJm1QYXJhbS0+bUFycmF5KTsKKyAgICAgKiBDMlBhcmFtRmllbGQobVBhcmFtLCAmbVBhcmFtLT5tQXJyYXlbMF0pOworICAgICAqIEMyUGFyYW1GaWVsZChtUGFyYW0sICZtUGFyYW0tPm1TdHJ1Y3QubVN1YkZpZWxkKTsKKyAgICAgKiBDMlBhcmFtRmllbGQobVBhcmFtLCAmbVBhcmFtLT5tRmxleEFycmF5KTsKKyAgICAgKiBDMlBhcmFtRmllbGQobVBhcmFtLCAmbVBhcmFtLT5tRmxleEFycmF5WzJdKTsKKyAgICAgKgorICAgICAqIH5+fn5+fn5+fn5+fn4KKyAgICAgKgorICAgICAqIFx0b2RvIGZpeCB3aGF0IHRoaXMgaXMgZm9yIFRbXSAoZm9yIG5vdyBzaXplIGJlY29tZXMgVFsxXSkKKyAgICAgKgorICAgICAqIFxub3RlIHRoaXMgZG9lcyBub3Qgd29yayBmb3IgNjQtYml0IG1lbWJlcnMgYXMgaXQgdHJpZ2dlcnMgYQorICAgICAqICd0YWtpbmcgYWRkcmVzcyBvZiBwYWNrZWQgbWVtYmVyJyB3YXJuaW5nLgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtIHBvaW50ZXIgdG8gcGFyYW1ldGVyCisgICAgICogXHBhcmFtIG9mZnNldCBtZW1iZXIgcG9pbnRlcgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIEMyUGFyYW1GaWVsZChTKiBwYXJhbSwgVCogb2Zmc2V0KQorICAgICAgICA6IF9tSW5kZXgocGFyYW0tPmluZGV4KCkpLAorICAgICAgICAgIF9tRmllbGRJZCgoVCopKCh1aW50cHRyX3Qpb2Zmc2V0IC0gKHVpbnRwdHJfdClwYXJhbSkpIHt9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB0eXBlbmFtZSBUPgorICAgIGlubGluZSBzdGF0aWMgQzJQYXJhbUZpZWxkIE1ha2UoUyYgcGFyYW0sIFQmIG9mZnNldCkgeworICAgICAgICByZXR1cm4gQzJQYXJhbUZpZWxkKHBhcmFtLmluZGV4KCksICh1aW50cHRyX3QpJm9mZnNldCAtICh1aW50cHRyX3QpJnBhcmFtLCBzaXplb2YoVCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGZpZWxkIGlkZW50aWZpZXIgdXNpbmcgYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciAodmFyaWFibGUpLAorICAgICAqIGFuZCBhIG1lbWJlciBwb2ludGVyLiBUaGlzIG1ldGhvZCBjYW5ub3QgYmUgdXNlZCB0byByZWZlciB0byBhbgorICAgICAqIGFycmF5IGVsZW1lbnQgb3IgYSBzdWJmaWVsZC4KKyAgICAgKgorICAgICAqIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgICAgICoKKyAgICAgKiBDMlNvbWVQYXJhbSBtUGFyYW07CisgICAgICogQzJQYXJhbUZpZWxkKCZtUGFyYW0sICZDMlNvbWVQYXJhbTo6bU1lbWJlckZpZWxkKTsKKyAgICAgKgorICAgICAqIH5+fn5+fn5+fn5+fn4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwIHBvaW50ZXIgdG8gcGFyYW1ldGVyCisgICAgICogXHBhcmFtIFQgbWVtYmVyIHBvaW50ZXIgdG8gdGhlIGZpZWxkIG1lbWJlcgorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CisgICAgaW5saW5lIEMyUGFyYW1GaWVsZChVICpwLCBSIFQ6OiogcG0pIDogX21JbmRleChwLT5pbmRleCgpKSwgX21GaWVsZElkKHAsIHBtKSB7IH0KKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGZpZWxkIGlkZW50aWZpZXIgdG8gYSBjb25maWd1cmF0aW9uIHBhcmFtZXRlciAodmFyaWFibGUpLgorICAgICAqCisgICAgICogfn5+fn5+fn5+fn5+fiAoLmNwcCkKKyAgICAgKgorICAgICAqIEMyU29tZVBhcmFtIG1QYXJhbTsKKyAgICAgKiBDMlBhcmFtRmllbGQoJm1QYXJhbSk7CisgICAgICoKKyAgICAgKiB+fn5+fn5+fn5+fn5+CisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW0gcG9pbnRlciB0byBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorICAgIGlubGluZSBDMlBhcmFtRmllbGQoUyogcGFyYW0pCisgICAgICAgIDogX21JbmRleChwYXJhbS0+aW5kZXgoKSksIF9tRmllbGRJZCgwdSwgcGFyYW0tPnNpemUoKSkgeyB9CisKKyAgICAvKiogQ29weSBjb25zdHJ1Y3Rvci4gKi8KKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkKGNvbnN0IEMyUGFyYW1GaWVsZCAmb3RoZXIpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIEVxdWFsaXR5IG9wZXJhdG9yLgorICAgICAqLworICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQzJQYXJhbUZpZWxkICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gX21JbmRleCA9PSBvdGhlci5fbUluZGV4ICYmIF9tRmllbGRJZCA9PSBvdGhlci5fbUZpZWxkSWQ7CisgICAgfQorCisgICAgLyoqCisgICAgICogT3JkZXJpbmcgb3BlcmF0b3IuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEMyUGFyYW1GaWVsZCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tSW5kZXggPCBvdGhlci5fbUluZGV4IHx8CisgICAgICAgICAgICAoX21JbmRleCA9PSBvdGhlci5fbUluZGV4ICYmIF9tRmllbGRJZCA8IG90aGVyLl9tRmllbGRJZCk7CisgICAgfQorCisgICAgREVGSU5FX09USEVSX0NPTVBBUklTT05fT1BFUkFUT1JTKEMyUGFyYW1GaWVsZCkKKworcHJvdGVjdGVkOgorICAgIGlubGluZSBDMlBhcmFtRmllbGQoQzJQYXJhbTo6SW5kZXggaW5kZXgsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qgc2l6ZSkKKyAgICAgICAgOiBfbUluZGV4KGluZGV4KSwgX21GaWVsZElkKG9mZnNldCwgc2l6ZSkge30KKworcHJpdmF0ZToKKyAgICBmcmllbmQgc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yOworCisgICAgQzJQYXJhbTo6SW5kZXggX21JbmRleDsgLy8vPCBwYXJhbWV0ZXIgaW5kZXgKKyAgICBfQzJGaWVsZElkIF9tRmllbGRJZDsgICAvLy88IGZpZWxkIGlkZW50aWZpZXIKK307CisKKy8qKgorICogQSBzaGFyZWQgKHVuaW9uKSByZXByZXNlbnRhdGlvbiBvZiBudW1lcmljIHZhbHVlcworICovCitjbGFzcyBDMlZhbHVlIHsKK3B1YmxpYzoKKyAgICAvLy8gQSB1bmlvbiBvZiBzdXBwb3J0ZWQgcHJpbWl0aXZlIHR5cGVzLgorICAgIHVuaW9uIFByaW1pdGl2ZSB7CisgICAgICAgIC8vIGZpcnN0IG1lbWJlciBpcyBhbHdheXMgemVybyBpbml0aWFsaXplZCBzbyBpdCBtdXN0IGJlIHRoZSBsYXJnZXN0CisgICAgICAgIHVpbnQ2NF90ICAgIHU2NDsgICAvLy88IHVpbnQ2NF90IHZhbHVlCisgICAgICAgIGludDY0X3QgICAgIGk2NDsgICAvLy88IGludDY0X3QgdmFsdWUKKyAgICAgICAgYzJfY250cjY0X3QgYzY0OyAgIC8vLzwgYzJfY250cjY0X3QgdmFsdWUKKyAgICAgICAgdWludDMyX3QgICAgdTMyOyAgIC8vLzwgdWludDMyX3QgdmFsdWUKKyAgICAgICAgaW50MzJfdCAgICAgaTMyOyAgIC8vLzwgaW50MzJfdCB2YWx1ZQorICAgICAgICBjMl9jbnRyMzJfdCBjMzI7ICAgLy8vPCBjMl9jbnRyMzJfdCB2YWx1ZQorICAgICAgICBmbG9hdCAgICAgICBmcDsgICAgLy8vPCBmbG9hdCB2YWx1ZQorCisgICAgICAgIC8vIGNvbnN0cnVjdG9ycyAtIGltcGxpY2l0CisgICAgICAgIFByaW1pdGl2ZSh1aW50NjRfdCB2YWx1ZSkgICAgOiB1NjQodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUoaW50NjRfdCB2YWx1ZSkgICAgIDogaTY0KHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKGMyX2NudHI2NF90IHZhbHVlKSA6IGM2NCh2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZSh1aW50MzJfdCB2YWx1ZSkgICAgOiB1MzIodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUoaW50MzJfdCB2YWx1ZSkgICAgIDogaTMyKHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKGMyX2NudHIzMl90IHZhbHVlKSA6IGMzMih2YWx1ZSkgeyB9CisgICAgICAgIFByaW1pdGl2ZSh1aW50OF90IHZhbHVlKSAgICAgOiB1MzIodmFsdWUpIHsgfQorICAgICAgICBQcmltaXRpdmUoY2hhciB2YWx1ZSkgICAgICAgIDogaTMyKHZhbHVlKSB7IH0KKyAgICAgICAgUHJpbWl0aXZlKGZsb2F0IHZhbHVlKSAgICAgICA6IGZwKHZhbHVlKSAgeyB9CisKKyAgICAgICAgLy8gYWxsb3cgY29uc3RydWN0aW9uIGZyb20gZW51bSB0eXBlCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIEUsIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19lbnVtPEU+Ojp2YWx1ZT46OnR5cGU+CisgICAgICAgIFByaW1pdGl2ZShFIHZhbHVlKQorICAgICAgICAgICAgOiBQcmltaXRpdmUoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8RT46OnR5cGU+KHZhbHVlKSkgeyB9CisKKyAgICAgICAgUHJpbWl0aXZlKCkgOiB1NjQoMCkgeyB9CisKKyAgICAgICAgLyoqIGdldHMgdmFsdWUgb3V0IG9mIHRoZSB1bmlvbiAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjb25zdCBUICZyZWYoKSBjb25zdDsKKworICAgICAgICAvLyB2ZXJpZnkgdGhhdCB3ZSBjYW4gYXNzdW1lIHN0YW5kYXJkIGFsaWFzaW5nCisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHU2NCkgPT0gc2l6ZW9mKGk2NCksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YodTY0KSA9PSBzaXplb2YoYzY0KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1MzIpID09IHNpemVvZihpMzIpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHUzMikgPT0gc2l6ZW9mKGMzMiksICIiKTsKKyAgICB9OworICAgIC8vIHZlcmlmeSB0aGF0IHdlIGNhbiBhc3N1bWUgc3RhbmRhcmQgYWxpYXNpbmcKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKFByaW1pdGl2ZSwgdTY0KSA9PSBvZmZzZXRvZihQcmltaXRpdmUsIGk2NCksICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKFByaW1pdGl2ZSwgdTY0KSA9PSBvZmZzZXRvZihQcmltaXRpdmUsIGM2NCksICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKFByaW1pdGl2ZSwgdTMyKSA9PSBvZmZzZXRvZihQcmltaXRpdmUsIGkzMiksICIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKFByaW1pdGl2ZSwgdTMyKSA9PSBvZmZzZXRvZihQcmltaXRpdmUsIGMzMiksICIiKTsKKworICAgIGVudW0gdHlwZV90IDogdWludDMyX3QgeworICAgICAgICBOT19JTklULAorICAgICAgICBJTlQzMiwKKyAgICAgICAgVUlOVDMyLAorICAgICAgICBDTlRSMzIsCisgICAgICAgIElOVDY0LAorICAgICAgICBVSU5UNjQsCisgICAgICAgIENOVFI2NCwKKyAgICAgICAgRkxPQVQsCisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgPSBzdGQ6OmlzX2VudW08VD46OnZhbHVlPgorICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIHR5cGVfdCBUeXBlRm9yKCkgeworICAgICAgICB1c2luZyBVID0gdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8VD46OnR5cGU7CisgICAgICAgIHJldHVybiBUeXBlRm9yPFU+KCk7CisgICAgfQorCisgICAgLy8gZGVwcmVjdGF0ZWQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIEIgPSBzdGQ6OmlzX2VudW08VD46OnZhbHVlPgorICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByIHR5cGVfdCB0eXBlRm9yKCkgeworICAgICAgICByZXR1cm4gVHlwZUZvcjxULCBCPigpOworICAgIH0KKworICAgIC8vIGNvbnN0cnVjdG9ycyAtIGltcGxpY2l0CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDMlZhbHVlKFQgdmFsdWUpICA6IF9tVHlwZSh0eXBlRm9yPFQ+KCkpLCBfbVZhbHVlKHZhbHVlKSB7IH0KKworICAgIEMyVmFsdWUoKSA6IF9tVHlwZShOT19JTklUKSB7IH0KKworICAgIGlubGluZSB0eXBlX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIF9tVHlwZTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgYm9vbCBnZXQoVCAqdmFsdWUpIGNvbnN0IHsKKyAgICAgICAgaWYgKF9tVHlwZSA9PSB0eXBlRm9yPFQ+KCkpIHsKKyAgICAgICAgICAgICp2YWx1ZSA9IF9tVmFsdWUucmVmPFQ+KCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8vIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHZhbHVlCisgICAgdm9pZCAqZ2V0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21UeXBlID09IE5PX0lOSVQgPyBudWxscHRyIDogKHZvaWQqKSZfbVZhbHVlOworICAgIH0KKworICAgIC8vLyByZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBjb250YWluZWQgdmFsdWUKKyAgICBzaXplX3QgaW5saW5lIHNpemVPZigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIFNpemVGb3IoX21UeXBlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgc2l6ZV90IFNpemVGb3IodHlwZV90IHR5cGUpIHsKKyAgICAgICAgc3dpdGNoICh0eXBlKSB7CisgICAgICAgICAgICBjYXNlIElOVDMyOgorICAgICAgICAgICAgY2FzZSBVSU5UMzI6CisgICAgICAgICAgICBjYXNlIENOVFIzMjogcmV0dXJuIHNpemVvZihfbVZhbHVlLmkzMik7CisgICAgICAgICAgICBjYXNlIElOVDY0OgorICAgICAgICAgICAgY2FzZSBVSU5UNjQ6CisgICAgICAgICAgICBjYXNlIENOVFI2NDogcmV0dXJuIHNpemVvZihfbVZhbHVlLmk2NCk7CisgICAgICAgICAgICBjYXNlIEZMT0FUOiByZXR1cm4gc2l6ZW9mKF9tVmFsdWUuZnApOworICAgICAgICAgICAgZGVmYXVsdDogcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgdHlwZV90IF9tVHlwZTsKKyAgICBQcmltaXRpdmUgX21WYWx1ZTsKK307CisKK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IGludDMyX3QgJkMyVmFsdWU6OlByaW1pdGl2ZTo6cmVmPGludDMyX3Q+KCkgY29uc3QgeyByZXR1cm4gaTMyOyB9Cit0ZW1wbGF0ZTw+IGlubGluZSBjb25zdCBpbnQ2NF90ICZDMlZhbHVlOjpQcmltaXRpdmU6OnJlZjxpbnQ2NF90PigpIGNvbnN0IHsgcmV0dXJuIGk2NDsgfQordGVtcGxhdGU8PiBpbmxpbmUgY29uc3QgdWludDMyX3QgJkMyVmFsdWU6OlByaW1pdGl2ZTo6cmVmPHVpbnQzMl90PigpIGNvbnN0IHsgcmV0dXJuIHUzMjsgfQordGVtcGxhdGU8PiBpbmxpbmUgY29uc3QgdWludDY0X3QgJkMyVmFsdWU6OlByaW1pdGl2ZTo6cmVmPHVpbnQ2NF90PigpIGNvbnN0IHsgcmV0dXJuIHU2NDsgfQordGVtcGxhdGU8PiBpbmxpbmUgY29uc3QgYzJfY250cjMyX3QgJkMyVmFsdWU6OlByaW1pdGl2ZTo6cmVmPGMyX2NudHIzMl90PigpIGNvbnN0IHsgcmV0dXJuIGMzMjsgfQordGVtcGxhdGU8PiBpbmxpbmUgY29uc3QgYzJfY250cjY0X3QgJkMyVmFsdWU6OlByaW1pdGl2ZTo6cmVmPGMyX2NudHI2NF90PigpIGNvbnN0IHsgcmV0dXJuIGM2NDsgfQordGVtcGxhdGU8PiBpbmxpbmUgY29uc3QgZmxvYXQgJkMyVmFsdWU6OlByaW1pdGl2ZTo6cmVmPGZsb2F0PigpIGNvbnN0IHsgcmV0dXJuIGZwOyB9CisKKy8vIHByb3ZpZGUgdHlwZXMgZm9yIGVudW1zIGFuZCB1aW50OF90LCBjaGFyIGV2ZW4gdGhvdWdoIHdlIGRvbid0IHByb3ZpZGUgcmVhZGluZyBhcyB0aGVtCit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjxjaGFyLCBmYWxzZT4oKSB7IHJldHVybiBJTlQzMjsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgQzJWYWx1ZTo6dHlwZV90IEMyVmFsdWU6OlR5cGVGb3I8aW50MzJfdCwgZmFsc2U+KCkgeyByZXR1cm4gSU5UMzI7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OnR5cGVfdCBDMlZhbHVlOjpUeXBlRm9yPGludDY0X3QsIGZhbHNlPigpIHsgcmV0dXJuIElOVDY0OyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBDMlZhbHVlOjp0eXBlX3QgQzJWYWx1ZTo6VHlwZUZvcjx1aW50OF90LCBmYWxzZT4oKSB7IHJldHVybiBVSU5UMzI7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OnR5cGVfdCBDMlZhbHVlOjpUeXBlRm9yPHVpbnQzMl90LCBmYWxzZT4oKSB7IHJldHVybiBVSU5UMzI7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OnR5cGVfdCBDMlZhbHVlOjpUeXBlRm9yPHVpbnQ2NF90LCBmYWxzZT4oKSB7IHJldHVybiBVSU5UNjQ7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OnR5cGVfdCBDMlZhbHVlOjpUeXBlRm9yPGMyX2NudHIzMl90LCBmYWxzZT4oKSB7IHJldHVybiBDTlRSMzI7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OnR5cGVfdCBDMlZhbHVlOjpUeXBlRm9yPGMyX2NudHI2NF90LCBmYWxzZT4oKSB7IHJldHVybiBDTlRSNjQ7IH0KK3RlbXBsYXRlPD4gY29uc3RleHByIEMyVmFsdWU6OnR5cGVfdCBDMlZhbHVlOjpUeXBlRm9yPGZsb2F0LCBmYWxzZT4oKSB7IHJldHVybiBGTE9BVDsgfQorCisvLyBmb3J3YXJkIGRlY2xhcmUgZWFzeSBlbnVtIHRlbXBsYXRlCit0ZW1wbGF0ZTx0eXBlbmFtZSBFPiBzdHJ1Y3QgQzJFYXN5RW51bTsKKworLyoqCisgKiBmaWVsZCBkZXNjcmlwdG9yLiBBIGZpZWxkIGlzIHVuaXF1ZWx5IGRlZmluZWQgYnkgYW4gaW5kZXggaW50byBhIHBhcmFtZXRlci4KKyAqIChOb3RlOiBTdHJlYW0taWQgaXMgbm90IGNhcHR1cmVkIGFzIGEgZmllbGQuKQorICoKKyAqIE9yZGVyaW5nIG9mIGZpZWxkcyBpcyBieSBvZmZzZXQuIEluIGNhc2Ugb2Ygc3RydWN0dXJlcywgaXQgaXMgZGVwdGggZmlyc3QsCisgKiB3aXRoIGEgc3RydWN0dXJlIHRha2luZyBhbiBpbmRleCBqdXN0IGJlZm9yZSBhbmQgaW4gYWRkaXRpb24gdG8gaXRzIG1lbWJlcnMuCisgKi8KK3N0cnVjdCBDMkZpZWxkRGVzY3JpcHRvciB7CisvL3B1YmxpYzoKKyAgICAvKiogZmllbGQgdHlwZXMgYW5kIGZsYWdzCisgICAgICogXG5vdGU6IG9ubHkgMzItYml0IGFuZCA2NC1iaXQgZmllbGRzIGFyZSBzdXBwb3J0ZWQgKGUuZy4gbm8gYm9vbGVhbiwgYXMgdGhhdAorICAgICAqIGlzIHJlcHJlc2VudGVkIHVzaW5nIElOVDMyKS4KKyAgICAgKi8KKyAgICBlbnVtIHR5cGVfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8gcHJpbWl0aXZlIHR5cGVzCisgICAgICAgIElOVDMyICAgPSBDMlZhbHVlOjpJTlQzMiwgIC8vLzwgMzItYml0IHNpZ25lZCBpbnRlZ2VyCisgICAgICAgIFVJTlQzMiAgPSBDMlZhbHVlOjpVSU5UMzIsIC8vLzwgMzItYml0IHVuc2lnbmVkIGludGVnZXIKKyAgICAgICAgQ05UUjMyICA9IEMyVmFsdWU6OkNOVFIzMiwgLy8vPCAzMi1iaXQgY291bnRlcgorICAgICAgICBJTlQ2NCAgID0gQzJWYWx1ZTo6SU5UNjQsICAvLy88IDY0LWJpdCBzaWduZWQgaW50ZWdlcgorICAgICAgICBVSU5UNjQgID0gQzJWYWx1ZTo6VUlOVDY0LCAvLy88IDY0LWJpdCBzaWduZWQgaW50ZWdlcgorICAgICAgICBDTlRSNjQgID0gQzJWYWx1ZTo6Q05UUjY0LCAvLy88IDY0LWJpdCBjb3VudGVyCisgICAgICAgIEZMT0FUICAgPSBDMlZhbHVlOjpGTE9BVCwgIC8vLzwgMzItYml0IGZsb2F0aW5nIHBvaW50CisKKyAgICAgICAgLy8gYXJyYXkgdHlwZXMKKyAgICAgICAgU1RSSU5HID0gMHgxMDAsIC8vLzwgZml4ZWQtc2l6ZSBzdHJpbmcgKFBPRCkKKyAgICAgICAgQkxPQiwgICAgICAgICAgIC8vLzwgYmxvYi4gQmxvYnMgaGF2ZSBubyBzdWItZWxlbWVudHMgYW5kIGNhbiBiZSB0aG91Z2h0IG9mIGFzIGJ5dGUgYXJyYXlzOworICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBob3dldmVyLCBieXRlcyBjYW5ub3QgYmUgaW5kaXZpZHVhbGx5IGFkZHJlc3NlZCBieSBjbGllbnRzLgorCisgICAgICAgIC8vIGNvbXBsZXggdHlwZXMKKyAgICAgICAgU1RSVUNUX0ZMQUcgPSAweDIwMDAwLCAvLy88IHN0cnVjdHMuIE1hcmtlZCB3aXRoIHRoaXMgZmxhZyBpbiBhZGRpdGlvbiB0byB0aGVpciBjb3JlSW5kZXguCisgICAgfTsKKworICAgIHR5cGVkZWYgc3RkOjpwYWlyPEMyU3RyaW5nLCBDMlZhbHVlOjpQcmltaXRpdmU+IE5hbWVkVmFsdWVUeXBlOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8TmFtZWRWYWx1ZVR5cGU+IE5hbWVkVmFsdWVzVHlwZTsKKyAgICAvL3R5cGVkZWYgc3RkOjpwYWlyPHN0ZDo6dmVjdG9yPEMyU3RyaW5nPiwgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPj4gTmFtZWRWYWx1ZXNUeXBlOworCisgICAgLyoqCisgICAgICogVGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gdGhhdCByZXR1cm5zIHRoZSBuYW1lZCB2YWx1ZXMgZm9yIGEgdHlwZS4KKyAgICAgKgorICAgICAqIFx0b2RvIGhpZGUgZnJvbSBjbGllbnQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIGEgdmVjdG9yIG9mIG5hbWUtdmFsdWUgcGFpcnMuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQj4KKyAgICBzdGF0aWMgTmFtZWRWYWx1ZXNUeXBlIG5hbWVkVmFsdWVzRm9yKGNvbnN0IEIgJik7CisKKyAgICAvKiogc3BlY2lhbGl6YXRpb24gZm9yIGVhc3kgZW51bXMgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBFPgorICAgIGlubGluZSBzdGF0aWMgTmFtZWRWYWx1ZXNUeXBlIG5hbWVkVmFsdWVzRm9yKGNvbnN0IEMyRWFzeUVudW08RT4gJikgeworI3ByYWdtYSBHQ0MgZGlhZ25vc3RpYyBwdXNoCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XbnVsbC1kZXJlZmVyZW5jZSIKKyAgICAgICAgcmV0dXJuIG5hbWVkVmFsdWVzRm9yKCooRSopbnVsbHB0cik7CisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorICAgIH0KKworcHJpdmF0ZToKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBCLCBib29sIGVuYWJsZWQ9c3RkOjppc19hcml0aG1ldGljPEI+Ojp2YWx1ZSB8fCBzdGQ6OmlzX2VudW08Qj46OnZhbHVlPgorICAgIHN0cnVjdCBDMl9ISURFIF9OYW1lZFZhbHVlc0dldHRlcjsKKworcHVibGljOgorICAgIGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcih1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBleHRlbnQsIEMyU3RyaW5nIG5hbWUsIHNpemVfdCBvZmZzZXQsIHNpemVfdCBzaXplKQorICAgICAgICA6IF9tVHlwZSgodHlwZV90KXR5cGUpLCBfbUV4dGVudChleHRlbnQpLCBfbU5hbWUobmFtZSksIF9tRmllbGRJZChvZmZzZXQsIHNpemUpIHsgfQorCisgICAgaW5saW5lIEMyRmllbGREZXNjcmlwdG9yKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICYpID0gZGVmYXVsdDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIGNsYXNzIEI9dHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFQ+Ojp0eXBlPgorICAgIGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcihjb25zdCBUKiBvZmZzZXQsIGNvbnN0IGNoYXIgKm5hbWUpCisgICAgICAgIDogX21UeXBlKHRoaXMtPkdldFR5cGUoKEIqKW51bGxwdHIpKSwKKyAgICAgICAgICBfbUV4dGVudChzdGQ6OmlzX2FycmF5PFQ+Ojp2YWx1ZSA/IHN0ZDo6ZXh0ZW50PFQ+Ojp2YWx1ZSA6IDEpLAorICAgICAgICAgIF9tTmFtZShuYW1lKSwKKyAgICAgICAgICBfbU5hbWVkVmFsdWVzKF9OYW1lZFZhbHVlc0dldHRlcjxCPjo6Z2V0TmFtZWRWYWx1ZXMoKSksCisgICAgICAgICAgX21GaWVsZElkKG9mZnNldCkge30KKworICAgIC8vLyBcZGVwcmVjYXRlZAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGNsYXNzIEI9dHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFQ+Ojp0eXBlPgorICAgIGlubGluZSBDMkZpZWxkRGVzY3JpcHRvcihTKiwgVCBTOjoqIGZpZWxkLCBjb25zdCBjaGFyICpuYW1lKQorICAgICAgICA6IF9tVHlwZSh0aGlzLT5HZXRUeXBlKChCKiludWxscHRyKSksCisgICAgICAgICAgX21FeHRlbnQoc3RkOjppc19hcnJheTxUPjo6dmFsdWUgPyBzdGQ6OmV4dGVudDxUPjo6dmFsdWUgOiAxKSwKKyAgICAgICAgICBfbU5hbWUobmFtZSksCisgICAgICAgICAgX21GaWVsZElkKCYoKChTKikwKS0+KmZpZWxkKSkge30KKworICAgIC8vLyByZXR1cm5zIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQKKyAgICBpbmxpbmUgdHlwZV90IHR5cGUoKSBjb25zdCB7IHJldHVybiBfbVR5cGU7IH0KKyAgICAvLy8gcmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoZSBmaWVsZCBpbiBjYXNlIGl0IGlzIGFuIGFycmF5LiBSZXR1cm5zIDAgZm9yCisgICAgLy8vIFRbXSBhcnJheXMsIHJldHVybnMgMSBmb3IgVFsxXSBhcnJheXMgYXMgd2VsbCBhcyBpZiB0aGUgZmllbGQgaXMgbm90IGFuIGFycmF5LgorICAgIGlubGluZSBzaXplX3QgZXh0ZW50KCkgY29uc3QgeyByZXR1cm4gX21FeHRlbnQ7IH0KKyAgICAvLy8gcmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmllbGQKKyAgICBpbmxpbmUgQzJTdHJpbmcgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIF9tTmFtZTsgfQorCisgICAgY29uc3QgTmFtZWRWYWx1ZXNUeXBlICZuYW1lZFZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIF9tTmFtZWRWYWx1ZXM7IH0KKworI2lmIGRlZmluZWQoRlJJRU5EX1RFU1QpCisgICAgZnJpZW5kIHZvaWQgUHJpbnRUbyhjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmLCA6OnN0ZDo6b3N0cmVhbSopOworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJiwgY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJik7CisgICAgRlJJRU5EX1RFU1QoQzJQYXJhbVRlc3RfUGFyYW1GaWVsZExpc3QsIFZlcmlmeVN0cnVjdCk7CisjZW5kaWYKKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3QgYW4gb2Zmc2V0ZWQgZmllbGQgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJGaWVsZERlc2NyaXB0b3IoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmRlc2MsIHNpemVfdCBvZmZzZXQpCisgICAgICAgIDogX21UeXBlKGRlc2MuX21UeXBlKSwgX21FeHRlbnQoZGVzYy5fbUV4dGVudCksCisgICAgICAgICAgX21OYW1lKGRlc2MuX21OYW1lKSwgX21OYW1lZFZhbHVlcyhkZXNjLl9tTmFtZWRWYWx1ZXMpLAorICAgICAgICAgIF9tRmllbGRJZChkZXNjLl9tRmllbGRJZC5fbU9mZnNldCArIG9mZnNldCwgZGVzYy5fbUZpZWxkSWQuX21TaXplKSB7IH0KKworICAgIHR5cGVfdCBfbVR5cGU7CisgICAgdWludDMyX3QgX21FeHRlbnQ7IC8vIHRoZSBsYXN0IG1lbWJlciBjYW4gYmUgYXJiaXRyYXJ5IGxlbmd0aCBpZiBpdCBpcyBUW10gYXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4dGVuZGluZyB0byB0aGUgZW5kIG9mIHRoZSBwYXJhbWV0ZXIgKHRoaXMgaXMgbWFya2VkIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gMCkuIFRbMF0tcyBhcmUgbm90IGZpZWxkcy4KKyAgICBDMlN0cmluZyBfbU5hbWU7CisgICAgTmFtZWRWYWx1ZXNUeXBlIF9tTmFtZWRWYWx1ZXM7CisKKyAgICBfQzJGaWVsZElkIF9tRmllbGRJZDsgICAvLyBmaWVsZCBpZGVudGlmaWVyIChvZmZzZXQgYW5kIHNpemUpCisKKyAgICAvLyBOT1RFOiBXZSBkbyBub3QgY2FwdHVyZSBkZWZhdWx0IHZhbHVlKHMpIGhlcmUgYXMgdGhhdCBtYXkgZGVwZW5kIG9uIHRoZSBjb21wb25lbnQuCisgICAgLy8gTk9URTogV2UgYWxzbyBkbyBub3QgY2FwdHVyZSBiZXN0RWZmb3J0LCBhcyAxKSB0aGlzIHNob3VsZCBiZSB0cnVlIGZvciBtb3N0IGZpZWxkcywKKyAgICAvLyAyKSB0aGlzIGlzIGF0IHBhcmFtZXRlciBncmFudWxhcml0eS4KKworICAgIC8vIHR5cGUgcmVzb2x1dGlvbgorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoaW50MzJfdCopICAgICB7IHJldHVybiBJTlQzMjsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUodWludDMyX3QqKSAgICB7IHJldHVybiBVSU5UMzI7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKGMyX2NudHIzMl90KikgeyByZXR1cm4gQ05UUjMyOyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShpbnQ2NF90KikgICAgIHsgcmV0dXJuIElOVDY0OyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZSh1aW50NjRfdCopICAgIHsgcmV0dXJuIFVJTlQ2NDsgfQorICAgIGlubGluZSBzdGF0aWMgdHlwZV90IEdldFR5cGUoYzJfY250cjY0X3QqKSB7IHJldHVybiBDTlRSNjQ7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKGZsb2F0KikgICAgICAgeyByZXR1cm4gRkxPQVQ7IH0KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKGNoYXIqKSAgICAgICAgeyByZXR1cm4gU1RSSU5HOyB9CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZSh1aW50OF90KikgICAgIHsgcmV0dXJuIEJMT0I7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsCisgICAgICAgICAgICAgY2xhc3M9dHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19lbnVtPFQ+Ojp2YWx1ZT46OnR5cGU+CisgICAgaW5saW5lIHN0YXRpYyB0eXBlX3QgR2V0VHlwZShUKikgeworICAgICAgICB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxUPjo6dHlwZSB1bmRlcmx5aW5nKDApOworICAgICAgICByZXR1cm4gR2V0VHlwZSgmdW5kZXJseWluZyk7CisgICAgfQorCisgICAgLy8gdmVyaWZ5IEMyU3RydWN0IGJ5IGhhdmluZyBhIEZpZWxkTGlzdCgpIGFuZCBhIENPUkVfSU5ERVguCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVCwKKyAgICAgICAgICAgICBjbGFzcz1kZWNsdHlwZShUOjpDT1JFX0lOREVYICsgMSksIGNsYXNzPWRlY2x0eXBlKFQ6OkZpZWxkTGlzdCgpKT4KKyAgICBpbmxpbmUgc3RhdGljIHR5cGVfdCBHZXRUeXBlKFQqKSB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfYmFzZV9vZjxDMlBhcmFtLCBUPjo6dmFsdWUsICJjYW5ub3QgdXNlIEMyUGFyYW1zIGFzIGZpZWxkcyIpOworICAgICAgICByZXR1cm4gKHR5cGVfdCkoVDo6Q09SRV9JTkRFWCB8IFNUUlVDVF9GTEFHKTsKKyAgICB9CisKKyAgICBmcmllbmQgc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yOworfTsKKworLy8gbm8gbmFtZWQgdmFsdWVzIGZvciBjb21wb3VuZCB0eXBlcwordGVtcGxhdGU8dHlwZW5hbWUgQj4KK3N0cnVjdCBDMkZpZWxkRGVzY3JpcHRvcjo6X05hbWVkVmFsdWVzR2V0dGVyPEIsIGZhbHNlPiB7CisgICAgaW5saW5lIHN0YXRpYyBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIGdldE5hbWVkVmFsdWVzKCkgeworICAgICAgICByZXR1cm4gTmFtZWRWYWx1ZXNUeXBlKCk7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQj4KK3N0cnVjdCBDMkZpZWxkRGVzY3JpcHRvcjo6X05hbWVkVmFsdWVzR2V0dGVyPEIsIHRydWU+IHsKKyAgICBpbmxpbmUgc3RhdGljIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgZ2V0TmFtZWRWYWx1ZXMoKSB7CisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdudWxsLWRlcmVmZXJlbmNlIgorICAgICAgICByZXR1cm4gQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKCooQiopbnVsbHB0cik7CisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorICAgIH0KK307CisKKyNkZWZpbmUgREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IodHlwZSkgXAordGVtcGxhdGU8PiBpbmxpbmUgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoY29uc3QgdHlwZSAmKSB7IFwKKyAgICByZXR1cm4gTmFtZWRWYWx1ZXNUeXBlKCk7IFwKK30KKworLy8gV2UgY2Fubm90IHN1YnR5cGUgY29uc3RydWN0b3IgZm9yIGVudW1lcmF0ZWQgdHlwZXMgc28gaW5zdGVkIGRlZmluZSBubyBuYW1lZCB2YWx1ZXMgZm9yCisvLyBub24tZW51bWVyYXRlZCBpbnRlZ3JhbCB0eXBlcy4KK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKGludDMyX3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUih1aW50MzJfdCkKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKGMyX2NudHIzMl90KQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoaW50NjRfdCkKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKHVpbnQ2NF90KQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoYzJfY250cjY0X3QpCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUih1aW50OF90KQorREVGSU5FX05PX05BTUVEX1ZBTFVFU19GT1IoY2hhcikKK0RFRklORV9OT19OQU1FRF9WQUxVRVNfRk9SKGZsb2F0KQorCisvKioKKyAqIERlc2NyaWJlcyB0aGUgZmllbGRzIG9mIGEgc3RydWN0dXJlLgorICovCitzdHJ1Y3QgQzJTdHJ1Y3REZXNjcmlwdG9yIHsKK3B1YmxpYzoKKyAgICAvLy8gUmV0dXJucyB0aGUgY29yZSBpbmRleCBvZiB0aGUgc3RydWN0CisgICAgaW5saW5lIEMyUGFyYW06OkNvcmVJbmRleCBjb3JlSW5kZXgoKSBjb25zdCB7IHJldHVybiBfbVR5cGUuY29yZUluZGV4KCk7IH0KKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBmaWVsZHMgaW4gdGhpcyBzdHJ1Y3QgKG5vdCBjb3VudGluZyBhbnkgcmVjdXJzaXZlIGZpZWxkcykuCisgICAgLy8gTXVzdCBiZSBhdCBsZWFzdCAxIGZvciB2YWxpZCBzdHJ1Y3RzLgorICAgIGlubGluZSBzaXplX3QgbnVtRmllbGRzKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZHMuc2l6ZSgpOyB9CisKKyAgICAvLyBSZXR1cm5zIHRoZSBsaXN0IG9mIGRpcmVjdCBmaWVsZHMgKG5vdCBjb3VudGluZyBhbnkgcmVjdXJzaXZlIGZpZWxkcykuCisgICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj46OmNvbnN0X2l0ZXJhdG9yIGZpZWxkX2l0ZXJhdG9yOworICAgIGlubGluZSBmaWVsZF9pdGVyYXRvciBjYmVnaW4oKSBjb25zdCB7IHJldHVybiBfbUZpZWxkcy5jYmVnaW4oKTsgfQorICAgIGlubGluZSBmaWVsZF9pdGVyYXRvciBjZW5kKCkgY29uc3QgeyByZXR1cm4gX21GaWVsZHMuY2VuZCgpOyB9CisKKyAgICAvLyBvbmx5IHN1cHBseWluZyBjb25zdCBpdGVyYXRvciAtIGJ1dCB0aGVzZSBuYW1lcyBhcmUgbmVlZGVkIGZvciByYW5nZSBiYXNlZCBsb29wcworICAgIGlubGluZSBmaWVsZF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIF9tRmllbGRzLmNiZWdpbigpOyB9CisgICAgaW5saW5lIGZpZWxkX2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIF9tRmllbGRzLmNlbmQoKTsgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgQzJTdHJ1Y3REZXNjcmlwdG9yKFQqKQorICAgICAgICA6IEMyU3RydWN0RGVzY3JpcHRvcihUOjpDT1JFX0lOREVYLCBUOjpGaWVsZExpc3QoKSkgeyB9CisKKyAgICBpbmxpbmUgQzJTdHJ1Y3REZXNjcmlwdG9yKAorICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IHR5cGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gJmZpZWxkcykKKyAgICAgICAgOiBfbVR5cGUodHlwZSksIF9tRmllbGRzKGZpZWxkcykgeyB9CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsKKworICAgIGlubGluZSBDMlN0cnVjdERlc2NyaXB0b3IoCisgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggdHlwZSwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiAmJmZpZWxkcykKKyAgICAgICAgOiBfbVR5cGUodHlwZSksIF9tRmllbGRzKHN0ZDo6bW92ZShmaWVsZHMpKSB7IH0KKworICAgIGNvbnN0IEMyUGFyYW06OkNvcmVJbmRleCBfbVR5cGU7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9tRmllbGRzOworfTsKKworLyoqCisgKiBEZXNjcmliZXMgcGFyYW1ldGVycyBmb3IgYSBjb21wb25lbnQuCisgKi8KK3N0cnVjdCBDMlBhcmFtRGVzY3JpcHRvciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHNldHRpbmcgdGhpcyBwYXJhbSBpcyByZXF1aXJlZCB0byBjb25maWd1cmUgdGhpcyBjb21wb25lbnQuCisgICAgICogVGhpcyBjYW4gb25seSBiZSB0cnVlIGZvciBidWlsdGluIHBhcmFtcyBmb3IgcGxhdGZvcm0tZGVmaW5lZCBjb21wb25lbnRzIChlLmcuIHZpZGVvIGFuZAorICAgICAqIGF1ZGlvIGVuY29kZXJzL2RlY29kZXJzLCB2aWRlby9hdWRpbyBmaWx0ZXJzKS4KKyAgICAgKiBGb3IgdmVuZG9yLWRlZmluZWQgY29tcG9uZW50cywgaXQgY2FuIGJlIHRydWUgZXZlbiBmb3IgdmVuZG9yLWRlZmluZWQgcGFyYW1zLAorICAgICAqIGJ1dCBpdCBpcyBub3QgcmVjb21tZW5kZWQsIGluIGNhc2UgdGhlIGNvbXBvbmVudCBiZWNvbWVzIHBsYXRmb3JtLWRlZmluZWQuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgaXNSZXF1aXJlZCgpIGNvbnN0IHsgcmV0dXJuIF9tQXR0cmliICYgSVNfUkVRVUlSRUQ7IH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHBhcmFtZXRlciBpcyBwZXJzaXN0ZW50LiBUaGlzIGlzIGFsd2F5cyB0cnVlIGZvciBDMlR1bmluZyBhbmQgQzJTZXR0aW5nLAorICAgICAqIGJ1dCBtYXkgYmUgZmFsc2UgZm9yIEMySW5mby4gSWYgdHJ1ZSwgdGhpcyBwYXJhbWV0ZXIgcGVyc2lzdHMgYWNyb3NzIGZyYW1lcyBhbmQgYXBwbGllcyB0bworICAgICAqIHRoZSBjdXJyZW50IGFuZCBzdWJzZXF1ZW50IGZyYW1lcy4gSWYgZmFsc2UsIHRoaXMgQzJJbmZvIHBhcmFtZXRlciBvbmx5IGFwcGxpZXMgdG8gdGhlCisgICAgICogY3VycmVudCBmcmFtZSBhbmQgaXMgbm90IGFzc3VtZWQgdG8gaGF2ZSB0aGUgc2FtZSB2YWx1ZSAob3IgZXZlbiBiZSBwcmVzZW50KSBvbiBzdWJzZXF1ZW50CisgICAgICogZnJhbWVzLCB1bmxlc3MgaXQgaXMgc3BlY2lmaWVkIGZvciB0aG9zZSBmcmFtZXMuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgaXNQZXJzaXN0ZW50KCkgY29uc3QgeyByZXR1cm4gX21BdHRyaWIgJiBJU19QRVJTSVNURU5UOyB9CisKKyAgICBpbmxpbmUgYm9vbCBpc1N0cmljdCgpIGNvbnN0IHsgcmV0dXJuIF9tQXR0cmliICYgSVNfU1RSSUNUOyB9CisKKyAgICBpbmxpbmUgYm9vbCBpc1JlYWRPbmx5KCkgY29uc3QgeyByZXR1cm4gX21BdHRyaWIgJiBJU19SRUFEX09OTFk7IH0KKworICAgIGlubGluZSBib29sIGlzVmlzaWJsZSgpIGNvbnN0IHsgcmV0dXJuICEoX21BdHRyaWIgJiBJU19ISURERU4pOyB9CisKKyAgICBpbmxpbmUgYm9vbCBpc1B1YmxpYygpIGNvbnN0IHsgcmV0dXJuICEoX21BdHRyaWIgJiBJU19JTlRFUk5BTCk7IH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgcGFyYW0uCisgICAgLy8vIFRoaXMgZGVmYXVsdHMgdG8gdGhlIHVuZGVybHlpbmcgQzJTdHJ1Y3QncyBuYW1lLCBidXQgY291bGQgYmUgYWx0ZXJlZCBmb3IgYSBjb21wb25lbnQuCisgICAgaW5saW5lIEMyU3RyaW5nIG5hbWUoKSBjb25zdCB7IHJldHVybiBfbU5hbWU7IH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBwYXJhbWV0ZXIgaW5kZXgKKyAgICBpbmxpbmUgQzJQYXJhbTo6SW5kZXggaW5kZXgoKSBjb25zdCB7IHJldHVybiBfbUluZGV4OyB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgaW5kaWNlcyBvZiBwYXJhbWV0ZXJzIHRoYXQgdGhpcyBwYXJhbWV0ZXIgaGFzIGEgZGVwZW5kZW5jeSBvbgorICAgIGlubGluZSBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmRlcGVuZGVuY2llcygpIGNvbnN0IHsgcmV0dXJuIF9tRGVwZW5kZW5jaWVzOyB9CisKKyAgICAvLy8gXGRlcHJlY2F0ZWQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGlubGluZSBDMlBhcmFtRGVzY3JpcHRvcihib29sIGlzUmVxdWlyZWQsIEMyU3RyaW5nTGl0ZXJhbCBuYW1lLCBjb25zdCBUKikKKyAgICAgICAgOiBfbUluZGV4KFQ6OlBBUkFNX1RZUEUpLAorICAgICAgICAgIF9tQXR0cmliKElTX1BFUlNJU1RFTlQgfCAoaXNSZXF1aXJlZCA/IElTX1JFUVVJUkVEIDogMCkpLAorICAgICAgICAgIF9tTmFtZShuYW1lKSB7IH0KKworICAgIC8vLyBcZGVwcmVjYXRlZAorICAgIGlubGluZSBDMlBhcmFtRGVzY3JpcHRvcigKKyAgICAgICAgICAgIGJvb2wgaXNSZXF1aXJlZCwgQzJTdHJpbmdMaXRlcmFsIG5hbWUsIEMyUGFyYW06OkluZGV4IGluZGV4KQorICAgICAgICA6IF9tSW5kZXgoaW5kZXgpLAorICAgICAgICAgIF9tQXR0cmliKElTX1BFUlNJU1RFTlQgfCAoaXNSZXF1aXJlZCA/IElTX1JFUVVJUkVEIDogMCkpLAorICAgICAgICAgIF9tTmFtZShuYW1lKSB7IH0KKworICAgIGVudW0gYXR0cmliX3QgOiB1aW50MzJfdCB7CisgICAgICAgIC8vIGZsYWdzIHRoYXQgZGVmYXVsdCBvbgorICAgICAgICBJU19SRVFVSVJFRCAgID0gMXUgPDwgMCwgLy8vPCBwYXJhbWV0ZXIgaXMgcmVxdWlyZWQgdG8gYmUgc3BlY2lmaWVkCisgICAgICAgIElTX1BFUlNJU1RFTlQgPSAxdSA8PCAxLCAvLy88IHBhcmFtZXRlciByZXRhaW5zIGl0cyB2YWx1ZQorICAgICAgICAvLyBmbGFncyB0aGF0IGRlZmF1bHQgb2ZmCisgICAgICAgIElTX1NUUklDVCAgICAgPSAxdSA8PCAyLCAvLy88IHBhcmFtZXRlciBpcyBzdHJpY3QKKyAgICAgICAgSVNfUkVBRF9PTkxZICA9IDF1IDw8IDMsIC8vLzwgcGFyYW1ldGVyIGlzIHB1YmxpY2x5IHJlYWQtb25seQorICAgICAgICBJU19ISURERU4gICAgID0gMXUgPDwgNCwgLy8vPCBwYXJhbWV0ZXIgc2hhbGwgbm90IGJlIHZpc2libGUgdG8gY2xpZW50cworICAgICAgICBJU19JTlRFUk5BTCAgID0gMXUgPDwgNSwgLy8vPCBwYXJhbWV0ZXIgc2hhbGwgbm90IGJlIHVzZWQgYnkgZnJhbWV3b3JrIChvdGhlciB0aGFuIHRlc3RpbmcpCisgICAgICAgIElTX0NPTlNUICAgICAgPSAxdSA8PCA2IHwgSVNfUkVBRF9PTkxZLCAvLy88IHBhcmFtZXRlciBpcyBwdWJsaWNseSBjb25zdCAoaGVuY2UgcmVhZC1vbmx5KQorICAgIH07CisKKyAgICBpbmxpbmUgQzJQYXJhbURlc2NyaXB0b3IoCisgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4LCBhdHRyaWJfdCBhdHRyaWIsIEMyU3RyaW5nTGl0ZXJhbCBuYW1lKQorICAgICAgICA6IF9tSW5kZXgoaW5kZXgpLAorICAgICAgICAgIF9tQXR0cmliKGF0dHJpYiksCisgICAgICAgICAgX21OYW1lKG5hbWUpIHsgfQorCisgICAgaW5saW5lIEMyUGFyYW1EZXNjcmlwdG9yKAorICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleCwgYXR0cmliX3QgYXR0cmliLCBDMlN0cmluZyAmJm5hbWUsCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmJmRlcGVuZGVuY2llcykKKyAgICAgICAgOiBfbUluZGV4KGluZGV4KSwKKyAgICAgICAgICBfbUF0dHJpYihhdHRyaWIpLAorICAgICAgICAgIF9tTmFtZShuYW1lKSwKKyAgICAgICAgICBfbURlcGVuZGVuY2llcyhzdGQ6Om1vdmUoZGVwZW5kZW5jaWVzKSkgeyB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgQzJQYXJhbTo6SW5kZXggX21JbmRleDsKKyAgICBjb25zdCB1aW50MzJfdCBfbUF0dHJpYjsKKyAgICBjb25zdCBDMlN0cmluZyBfbU5hbWU7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IF9tRGVwZW5kZW5jaWVzOworCisgICAgZnJpZW5kIHN0cnVjdCBfQzJQYXJhbUluc3BlY3RvcjsKK307CisKK0RFRklORV9FTlVNX09QRVJBVE9SUyg6OkMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCkKKworCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKy8vLyBEZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aG91dCBDT1JFX0lOREVYLgorLy8vIFxub3RlIF9GSUVMRF9MSVNUIGlzIHVzZWQgb25seSBkdXJpbmcgZGVjbGFyYXRpb24gc28gdGhhdCBDMlN0cnVjdCBkZWNsYXJhdGlvbnMgY2FuIGVuZCB3aXRoCisvLy8gYSBzaW1wbGUgbGlzdCBvZiBDMkZJRUxELXMgYW5kIGNsb3NpbmcgYnJhY2tldC4gTWFyayBpdCB1bnVzZWQgYXMgaXQgaXMgbm90IHVzZWQgaW4gdGVtcGxhdGVkCisvLy8gc3RydWN0cy4KKyNkZWZpbmUgREVGSU5FX0JBU0VfQzJTVFJVQ1QobmFtZSkgXAorcHJpdmF0ZTogXAorICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX0ZJRUxEX0xJU1QgX191bnVzZWQ7IC8qKjwgc3RydWN0dXJlIGZpZWxkcyAqLyBcCitwdWJsaWM6IFwKKyAgICB0eXBlZGVmIEMyIyNuYW1lIyNTdHJ1Y3QgX3R5cGU7IC8qKjwgdHlwZSBuYW1lIHNob3J0aGFuZCAqLyBcCisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsgLyoqPCBzdHJ1Y3R1cmUgZmllbGRzIGZhY3RvcnkgKi8KKworLy8vIERlZmluZSBhIHN0cnVjdHVyZSB3aXRoIG1hdGNoaW5nIENPUkVfSU5ERVguCisjZGVmaW5lIERFRklORV9DMlNUUlVDVChuYW1lKSBcCitwdWJsaWM6IFwKKyAgICBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXgjI25hbWUgfTsgXAorICAgIERFRklORV9CQVNFX0MyU1RSVUNUKG5hbWUpCisKKy8vLyBEZWZpbmUgYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgd2l0aG91dCBDT1JFX0lOREVYLgorI2RlZmluZSBERUZJTkVfQkFTRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIpIFwKK3B1YmxpYzogXAorICAgIEZMRVgoQzIjI25hbWUjI1N0cnVjdCwgZmxleE1lbWJlcikgXAorICAgIERFRklORV9CQVNFX0MyU1RSVUNUKG5hbWUpCisKKy8vLyBEZWZpbmUgYSBmbGV4aWJsZSBzdHJ1Y3R1cmUgd2l0aCBtYXRjaGluZyBDT1JFX0lOREVYLgorI2RlZmluZSBERUZJTkVfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyKSBcCitwdWJsaWM6IFwKKyAgICBGTEVYKEMyIyNuYW1lIyNTdHJ1Y3QsIGZsZXhNZW1iZXIpIFwKKyAgICBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXgjI25hbWUgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRyB9OyBcCisgICAgREVGSU5FX0JBU0VfQzJTVFJVQ1QobmFtZSkKKworLy8vIFxpbmdyb3VwIGludGVybmFsCisvLy8gRGVzY3JpYmUgYSBzdHJ1Y3R1cmUgb2YgYSB0ZW1wbGF0ZWQgc3RydWN0dXJlLgorLy8gVXNlIGxpc3QuLi4gYXMgdGhlIGFyZ3VtZW50IGdldHMgcmVzdWJzaXRpdHV0ZWQgYW5kIGl0IGNvbnRhaW5zIGNvbW1hcy4gQWx0ZXJuYXRpdmUgd291bGQgYmUKKy8vIHRvIHdyYXAgbGlzdCBpbiBhbiBleHByZXNzaW9uLCBlLmcuICh7IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBsaXN0OyB9KSkgd2hpY2ggY29udmVydHMKKy8vIGl0IGZyb20gYW4gaW5pdGlhbGl6ZXIgbGlzdCB0byBhIHZlY3Rvci4KKyNkZWZpbmUgREVTQ1JJQkVfVEVNUExBVEVEX0MyU1RSVUNUKHN0cnVrdCwgbGlzdC4uLikgXAorICAgIF9ERVNDUklCRV9URU1QTEFUQUJMRV9DMlNUUlVDVCh0ZW1wbGF0ZTw+LCBzdHJ1a3QsIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXywgbGlzdCkKKworLy8vIFxkZXByZWNhdGVkCisvLy8gRGVzY3JpYmUgdGhlIGZpZWxkcyBvZiBhIHN0cnVjdHVyZSB1c2luZyBhbiBpbml0aWFsaXplciBsaXN0LgorI2RlZmluZSBERVNDUklCRV9DMlNUUlVDVChuYW1lLCBsaXN0Li4uKSBcCisgICAgX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUKCwgQzIjI25hbWUjI1N0cnVjdCwgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fLCBsaXN0KQorCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKy8vLyBNYWNybyBsYXllciB0byBnZXQgdmFsdWUgb2YgZW5hYmxlZCB0aGF0IGlzIHBhc3NlZCBpbiBhcyBhIG1hY3JvIHZhcmlhYmxlCisjZGVmaW5lIF9ERVNDUklCRV9URU1QTEFUQUJMRV9DMlNUUlVDVCh0ZW1wbGF0ZSwgc3RydWt0LCBlbmFibGVkLCBsaXN0Li4uKSBcCisgICAgX19ERVNDUklCRV9URU1QTEFUQUJMRV9DMlNUUlVDVCh0ZW1wbGF0ZSwgc3RydWt0LCBlbmFibGVkLCBsaXN0KQorCisvLy8gXGluZ3JvdXAgaW50ZXJuYWwKKy8vLyBNYWNybyBsYXllciB0byByZXNvbHZlIHRvIHRoZSBzcGVjaWZpYyBtYWNybyBiYXNlZCBvbiBtYWNybyB2YXJpYWJsZQorI2RlZmluZSBfX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUKHRlbXBsYXRlLCBzdHJ1a3QsIGVuYWJsZWQsIGxpc3QuLi4pIFwKKyAgICBfX19ERVNDUklCRV9URU1QTEFUQUJMRV9DMlNUUlVDVCMjZW5hYmxlZCh0ZW1wbGF0ZSwgc3RydWt0LCBsaXN0KQorCisjZGVmaW5lIF9fX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUKHRlbXBsYXRlLCBzdHJ1a3QsIGxpc3QuLi4pIFwKKyAgICB0ZW1wbGF0ZSBcCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IHN0cnVrdDo6RmllbGRMaXN0KCkgeyByZXR1cm4gbGlzdDsgfQorCisjZGVmaW5lIF9fX0RFU0NSSUJFX1RFTVBMQVRBQkxFX0MyU1RSVUNUX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKHRlbXBsYXRlLCBzdHJ1a3QsIGxpc3QuLi4pCisKKy8qKgorICogRGVzY3JpYmUgYSBmaWVsZCBvZiBhIHN0cnVjdHVyZS4KKyAqIFRoZXNlIG11c3QgYmUgaW4gb3JkZXIuCisgKgorICogVGhlcmUgYXJlIHR3byB3YXlzIHRvIHVzZSB0aGlzIG1hY3JvOgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIHN0cnVjdCBDMlZpZGVvV2lkdGhTdHJ1Y3QgeworICogICAgICBpbnQzMl90IHdpZHRoOworICogICAgICBDMlZpZGVvV2lkdGhTdHJ1Y3QoKSB7fSAvLyBvcHRpb25hbCBkZWZhdWx0IGNvbnN0cnVjdG9yCisgKiAgICAgIEMyVmlkZW9XaWR0aFN0cnVjdChpbnQzMl90IF93aWR0aCkgOiB3aWR0aChfd2lkdGgpIHt9CisgKgorICogICAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKFZpZGVvV2lkdGgpCisgKiAgICAgIEMyRklFTEQod2lkdGgsICJ3aWR0aCIpCisgKiAgfTsKKyAqICB+fn5+fn5+fn5+fn5+CisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgc3RydWN0IEMyVmlkZW9XaWR0aFN0cnVjdCB7CisgKiAgICAgIGludDMyX3Qgd2lkdGg7CisgKiAgICAgIEMyVmlkZW9XaWR0aFN0cnVjdCgpID0gZGVmYXVsdDsgLy8gb3B0aW9uYWwgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICogICAgICBDMlZpZGVvV2lkdGhTdHJ1Y3QoaW50MzJfdCBfd2lkdGgpIDogd2lkdGgoX3dpZHRoKSB7fQorICoKKyAqICAgICAgREVGSU5FX0MyU1RSVUNUKFZpZGVvV2lkdGgpCisgKiAgfSBDMl9QQUNLOworICoKKyAqICBERVNDUklCRV9DMlNUUlVDVChWaWRlb1dpZHRoLCB7CisgKiAgICAgIEMyRklFTEQod2lkdGgsICJ3aWR0aCIpCisgKiAgfSkKKyAqICB+fn5+fn5+fn5+fn5+CisgKgorICogIEZvciBmbGV4aWJsZSBzdHJ1Y3R1cmVzICh0aG9zZSBlbmRpbmcgaW4gVFtdKSwgdXNlIHRoZSBmbGV4aWJsZSBtYWNyb3M6CisgKgorICogIH5+fn5+fn5+fn5+fn4gKC5jcHApCisgKiAgc3RydWN0IEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0IHsKKyAqICAgICAgaW50MzJfdCB3aWR0aHNbXTsKKyAqICAgICAgQzJWaWRlb0ZsZXhXaWR0aHNTdHJ1Y3QoKTsgLy8gbXVzdCBoYXZlIGEgZGVmYXVsdCBjb25zdHJ1Y3RvcgorICoKKyAqICBwcml2YXRlOgorICogICAgICAvLyBtYXkgaGF2ZSBwcml2YXRlIGNvbnN0cnVjdG9ycyB0YWtpbmcgbnVtYmVyIG9mIHdpZHRocyBhcyB0aGUgZmlyc3QgYXJndW1lbnQKKyAqICAgICAgLy8gVGhpcyBpcyB1c2VkIGJ5IHRoZSBDMlBhcmFtIGZhY3RvcnkgbWV0aG9kcywgZS5nLgorICogICAgICAvLyAgIEMyVmlkZW9GbGV4V2lkdGhzR2xvYmFsUGFyYW06OkFsbG9jVW5pcXVlKHNpemVfdCwgaW50MzJfdCk7CisgKiAgICAgIEMyVmlkZW9GbGV4V2lkdGhzU3RydWN0KHNpemVfdCBmbGV4Q291bnQsIGludDMyX3QgdmFsdWUpIHsKKyAqICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmxleENvdW50OyArK2kpIHsKKyAqICAgICAgICAgICAgICB3aWR0aHNbaV0gPSB2YWx1ZTsKKyAqICAgICAgICAgIH0KKyAqICAgICAgfQorICoKKyAqICAgICAgLy8gSWYgdGhlIGxhc3QgYXJndW1lbnQgaXMgVFtOXSBvciBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4sIHRoZSBmbGV4Q291bnQgd2lsbAorICogICAgICAvLyBiZSBhdXRvbWF0aWNhbGx5IGNhbGN1bGF0ZWQgYW5kIHBhc3NlZCBieSB0aGUgQzJQYXJhbSBmYWN0b3J5IG1ldGhvZHMsIGUuZy4KKyAqICAgICAgLy8gICBpbnQgd2lkdGhzW10gPSB7IDEsIDIsIDMgfTsKKyAqICAgICAgLy8gICBDMlZpZGVvRmxleFdpZHRoc0dsb2JhbFBhcmFtOjpBbGxvY1VuaXF1ZSh3aWR0aHMpOworICogICAgICB0ZW1wbGF0ZTx1bnNpZ25lZCBOPgorICogICAgICBDMlZpZGVvRmxleFdpZHRoc1N0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBpbnQzMl90KCZpbml0KVtOXSkgeworICogICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmbGV4Q291bnQ7ICsraSkgeworICogICAgICAgICAgICAgIHdpZHRoc1tpXSA9IGluaXRbaV07CisgKiAgICAgICAgICB9CisgKiAgICAgIH0KKyAqCisgKiAgICAgIERFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChWaWRlb0ZsZXhXaWR0aHMsIHdpZHRocykKKyAqICAgICAgQzJGSUVMRCh3aWR0aHMsICJ3aWR0aHMiKQorICogIH07CisgKiAgfn5+fn5+fn5+fn5+fgorICoKKyAqICB+fn5+fn5+fn5+fn5+ICguY3BwKQorICogIHN0cnVjdCBDMlZpZGVvRmxleFdpZHRoc1N0cnVjdCB7CisgKiAgICAgIGludDMyX3QgbVdpZHRoc1tdOworICogICAgICBDMlZpZGVvRmxleFdpZHRoc1N0cnVjdCgpOyAvLyBtdXN0IGhhdmUgYSBkZWZhdWx0IGNvbnN0cnVjdG9yCisgKgorICogICAgICBERUZJTkVfRkxFWF9DMlNUUlVDVChWaWRlb0ZsZXhXaWR0aHMsIG1XaWR0aHMpCisgKiAgfSBDMl9QQUNLOworICoKKyAqICBERVNDUklCRV9DMlNUUlVDVChWaWRlb0ZsZXhXaWR0aHMsIHsKKyAqICAgICAgQzJGSUVMRChtV2lkdGhzLCAid2lkdGhzIikKKyAqICB9KQorICogIH5+fn5+fn5+fn5+fn4KKyAqCisgKi8KKyNkZWZpbmUgREVTQ1JJQkVfQzJGSUVMRChtZW1iZXIsIG5hbWUpIFwKKyAgQzJGaWVsZERlc2NyaXB0b3IoJigoX3R5cGUqKShudWxscHRyKSktPm1lbWJlciwgbmFtZSksCisKKyNkZWZpbmUgQzJGSUVMRChtZW1iZXIsIG5hbWUpIF9DMkZJRUxEKG1lbWJlciwgbmFtZSwgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKQorLy8vIFxpZiAwCisjZGVmaW5lIF9DMkZJRUxEKG1lbWJlciwgbmFtZSwgZW5hYmxlZCkgX19DMkZJRUxEKG1lbWJlciwgbmFtZSwgZW5hYmxlZCkKKyNkZWZpbmUgX19DMkZJRUxEKG1lbWJlciwgbmFtZSwgZW5hYmxlZCkgREVTQ1JJQkVfQzJGSUVMRCMjZW5hYmxlZChtZW1iZXIsIG5hbWUpCisjZGVmaW5lIERFU0NSSUJFX0MyRklFTERfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18obWVtYmVyLCBuYW1lKQorLy8vIFxlbmRpZgorCisvLy8gRGVmaW5lIGEgc3RydWN0dXJlIHdpdGggbWF0Y2hpbmcgQ09SRV9JTkRFWCBhbmQgc3RhcnQgZGVzY3JpYmluZyBpdHMgZmllbGRzLgorLy8vIFRoaXMgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyNkZWZpbmUgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChuYW1lKSBcCisgICAgX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgREVGSU5FX0MyU1RSVUNULCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18pCisKKy8vLyBEZWZpbmUgYSBiYXNlIHN0cnVjdHVyZSAod2l0aCBubyBDT1JFX0lOREVYKSBhbmQgc3RhcnQgZGVzY3JpYmluZyBpdHMgZmllbGRzLgorLy8vIFRoaXMgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyNkZWZpbmUgREVGSU5FX0FORF9ERVNDUklCRV9CQVNFX0MyU1RSVUNUKG5hbWUpIFwKKyAgICBfREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChuYW1lLCBERUZJTkVfQkFTRV9DMlNUUlVDVCwgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKQorCisvLy8gRGVmaW5lIGEgZmxleGlibGUgc3RydWN0dXJlIHdpdGggbWF0Y2hpbmcgQ09SRV9JTkRFWCBhbmQgc3RhcnQgZGVzY3JpYmluZyBpdHMgZmllbGRzLgorLy8vIFRoaXMgbXVzdCBiZSBhdCB0aGUgZW5kIG9mIHRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbi4KKyNkZWZpbmUgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIpIFwKKyAgICBfREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKCBcCisgICAgICAgICAgICBuYW1lLCBmbGV4TWVtYmVyLCBERUZJTkVfRkxFWF9DMlNUUlVDVCwgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKQorCisvLy8gRGVmaW5lIGEgZmxleGlibGUgYmFzZSBzdHJ1Y3R1cmUgKHdpdGggbm8gQ09SRV9JTkRFWCkgYW5kIHN0YXJ0IGRlc2NyaWJpbmcgaXRzIGZpZWxkcy4KKy8vLyBUaGlzIG11c3QgYmUgYXQgdGhlIGVuZCBvZiB0aGUgc3RydWN0dXJlIGRlZmluaXRpb24uCisjZGVmaW5lIERFRklORV9BTkRfREVTQ1JJQkVfQkFTRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIpIFwKKyAgICBfREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKCBcCisgICAgICAgICAgICBuYW1lLCBmbGV4TWVtYmVyLCBERUZJTkVfQkFTRV9GTEVYX0MyU1RSVUNULCBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18pCisKKy8vLyBcaWYgMAorLyoKKyAgIEFsdGVybmF0ZSBkZWNsYXJhdGlvbiBvZiBmaWVsZCBkZWZpbml0aW9ucyBpbiBjYXNlIG5vIGZpZWxkIGxpc3QgaXMgdG8gYmUgZ2VuZXJhdGVkLgorICAgVGhlIHNwZWNpZmljIG1hY3JvIGlzIGNob3NlZCBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fICh3aGV0aGVyIGl0IGlzCisgICBkZWZpbmVkICh0byBiZSBlbXB0eSkgb3Igbm90LiBUaGlzIHJlcXVpcmVzIHR3byBsZXZlbCBvZiBtYWNybyBzdWJzdGl0dXRpb24uCisgICBUUklDS1k6IHVzZSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gdG8gaGFuZGxlIGNsb3NpbmcgYnJhY2tldCB0aGF0IGlzIG5vcm1hbGx5IGFmdGVyCisgICB0aGVzZSBtYWNyb3MuCisqLworCisjZGVmaW5lIF9ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIGRlZmluZU1hY3JvLCBlbmFibGVkKSBcCisgICAgX19ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIGRlZmluZU1hY3JvLCBlbmFibGVkKQorI2RlZmluZSBfX0RFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QobmFtZSwgZGVmaW5lTWFjcm8sIGVuYWJsZWQpIFwKKyAgICBfX19ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUIyNlbmFibGVkKG5hbWUsIGRlZmluZU1hY3JvKQorI2RlZmluZSBfX19ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKG5hbWUsIGRlZmluZU1hY3JvKSBcCisgICAgZGVmaW5lTWFjcm8obmFtZSkgfSBDMl9QQUNLOyBuYW1lc3BhY2UgeworI2RlZmluZSBfX19ERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKG5hbWUsIGRlZmluZU1hY3JvKSBcCisgICAgZGVmaW5lTWFjcm8obmFtZSkgfSBDMl9QQUNLOyBcCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyIyNuYW1lIyNTdHJ1Y3Q6OkZpZWxkTGlzdCgpIHsgcmV0dXJuIF9GSUVMRF9MSVNUOyB9IFwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzIjI25hbWUjI1N0cnVjdDo6X0ZJRUxEX0xJU1QgPSB7CisKKyNkZWZpbmUgX0RFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyLCBkZWZpbmVNYWNybywgZW5hYmxlZCkgXAorICAgIF9fREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKG5hbWUsIGZsZXhNZW1iZXIsIGRlZmluZU1hY3JvLCBlbmFibGVkKQorI2RlZmluZSBfX0RFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVChuYW1lLCBmbGV4TWVtYmVyLCBkZWZpbmVNYWNybywgZW5hYmxlZCkgXAorICAgIF9fX0RFRklORV9BTkRfREVTQ1JJQkVfRkxFWF9DMlNUUlVDVCMjZW5hYmxlZChuYW1lLCBmbGV4TWVtYmVyLCBkZWZpbmVNYWNybykKKyNkZWZpbmUgX19fREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fKG5hbWUsIGZsZXhNZW1iZXIsIGRlZmluZU1hY3JvKSBcCisgICAgZGVmaW5lTWFjcm8obmFtZSwgZmxleE1lbWJlcikgfSBDMl9QQUNLOyBuYW1lc3BhY2UgeworI2RlZmluZSBfX19ERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QobmFtZSwgZmxleE1lbWJlciwgZGVmaW5lTWFjcm8pIFwKKyAgICBkZWZpbmVNYWNybyhuYW1lLCBmbGV4TWVtYmVyKSB9IEMyX1BBQ0s7IFwKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzIjI25hbWUjI1N0cnVjdDo6RmllbGRMaXN0KCkgeyByZXR1cm4gX0ZJRUxEX0xJU1Q7IH0gXAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMiMjbmFtZSMjU3RydWN0OjpfRklFTERfTElTVCA9IHsKKy8vLyBcZW5kaWYKKworCisvKioKKyAqIFBhcmFtZXRlciByZWZsZWN0b3IgY2xhc3MuCisgKgorICogVGhpcyBjbGFzcyBjZW50cmFsaXplcyB0aGUgZGVzY3JpcHRpb24gb2YgcGFyYW1ldGVyIHN0cnVjdHVyZXMuIFRoaXMgY2FuIGJlIHNoYXJlZAorICogYnkgbXVsdGlwbGUgY29tcG9uZW50cyBhcyBkZXNjcmliaW5nIGEgcGFyYW1ldGVyIGRvZXMgbm90IGltcGx5IHN1cHBvcnQgb2YgdGhhdAorICogcGFyYW1ldGVyLiBIb3dldmVyLCBlYWNoIHN1cHBvcnRlZCBwYXJhbWV0ZXIgYW5kIGFueSBkZXBlbmRlbnQgc3RydWN0dXJlcyB3aXRoaW4KKyAqIG11c3QgYmUgZGVzY3JpYmVkIGJ5IHRoZSBwYXJhbWV0ZXIgcmVmbGVjdG9yIHByb3ZpZGVkIGJ5IGEgY29tcG9uZW50LgorICovCitjbGFzcyBDMlBhcmFtUmVmbGVjdG9yIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiAgRGVzY3JpYmVzIGEgcGFyYW1ldGVyIHN0cnVjdHVyZS4KKyAgICAgKgorICAgICAqICBccGFyYW1baW5dIGNvcmVJbmRleCB0aGUgY29yZSBpbmRleCBvZiB0aGUgcGFyYW1ldGVyIHN0cnVjdHVyZSBjb250YWluaW5nIGF0IGxlYXN0IHRoZQorICAgICAqICBjb3JlIGluZGV4CisgICAgICoKKyAgICAgKiAgXHJldHVybiB0aGUgZGVzY3JpcHRpb24gb2YgdGhlIHBhcmFtZXRlciBzdHJ1Y3R1cmUKKyAgICAgKiAgXHJldHZhbCBudWxscHRyIGlmIHRoZSBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHJlZmxlY3RvcgorICAgICAqCisgICAgICogIFRoaXMgbWV0aG9kcyBzaGFsbCBub3QgYmxvY2sgYW5kIHJldHVybiBpbW1lZGlhdGVseS4KKyAgICAgKgorICAgICAqICBcbm90ZSB0aGlzIGNsYXNzIGRvZXMgbm90IHRha2UgYSBzZXQgb2YgaW5kaWNlcyBiZWNhdXNlIHdlIHdvdWxkIHRoZW4gcHJlZmVyCisgICAgICogIHRvIGFsc28gcmV0dXJuIGFueSBkZXBlbmRlbnQgc3RydWN0dXJlcywgYW5kIHdlIGRvbid0IHdhbnQgdGhpcyBsb2dpYyB0byBiZQorICAgICAqICByZXBlYXRlZCBpbiBlYWNoIHJlZmxlY3Rvci4gQWx0ZXJuYXRlbHksIHRoaXMgY291bGQganVzdCByZXR1cm4gYSBtYXAgb2YgYWxsCisgICAgICogIGRlc2NyaXB0aW9ucywgYnV0IHdlIHdhbnQgdG8gY29uc2VydmUgbWVtb3J5IGlmIGNsaWVudCBvbmx5IHdhbnRzIHRoZSBkZXNjcmlwdGlvbgorICAgICAqICBvZiBhIGZldyBpbmRpY2VzLgorICAgICAqLworICAgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY3JpYmUoQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCkgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+QzJQYXJhbVJlZmxlY3RvcigpID0gZGVmYXVsdDsKK307CisKKy8qKgorICogR2VuZXJpYyBzdXBwb3J0ZWQgdmFsdWVzIGZvciBhIGZpZWxkLgorICoKKyAqIFRoaXMgY2FuIGJlIGVpdGhlciBhIHJhbmdlIG9yIGEgc2V0IG9mIHZhbHVlcy4gVGhlIHJhbmdlIGNhbiBiZSBhIHNpbXBsZSByYW5nZSwgYW4gYXJpdGhtZXRpYywKKyAqIGdlb21ldHJpYyBvciBtdWx0aXBseS1hY2N1bXVsYXRlIHNlcmllcyB3aXRoIGEgY2xlYXIgbWluaW11bSBhbmQgbWF4aW11bSB2YWx1ZS4gVmFsdWVzIGNhbgorICogYmUgZGlzY3JldGUgdmFsdWVzLCBvciBjYW4gb3B0aW9uYWxseSByZXByZXNlbnQgZmxhZ3MgdG8gYmUgb3ItZWQuCisgKgorICogXG5vdGUgRG8gbm90IHVzZSBmbGFncyB0byByZXByZXNlbnQgYml0ZmllbGRzLiBVc2UgaW5kaXZpZHVhbCB2YWx1ZXMgb3Igc2VwYXJhdGUgZmllbGRzIGluc3RlYWQuCisgKi8KK3N0cnVjdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIHsKKy8vcHVibGljOgorICAgIGVudW0gdHlwZV90IHsKKyAgICAgICAgRU1QVFksICAgICAgLy8vPCBubyBzdXBwb3J0ZWQgdmFsdWVzCisgICAgICAgIFJBTkdFLCAgICAgIC8vLzwgYSBudW1lcmljIHJhbmdlIHRoYXQgY2FuIGJlIGNvbnRpbnVvdXMgb3IgZGlzY3JldGUKKyAgICAgICAgVkFMVUVTLCAgICAgLy8vPCBhIGxpc3Qgb2YgdmFsdWVzCisgICAgICAgIEZMQUdTICAgICAgIC8vLzwgYSBsaXN0IG9mIGZsYWdzIHRoYXQgY2FuIGJlIE9SLWVkCisgICAgfTsKKworICAgIHR5cGVfdCB0eXBlOyAvKiogVHlwZSBvZiB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuICovCisKKyAgICB0eXBlZGVmIEMyVmFsdWU6OlByaW1pdGl2ZSBQcmltaXRpdmU7CisKKyAgICAvKioKKyAgICAgKiBSYW5nZSBzcGVjaWZpZXIgZm9yIHN1cHBvcnRlZCB2YWx1ZS4gVXNlZCBpZiB0eXBlIGlzIFJBTkdFLgorICAgICAqCisgICAgICogSWYgc3RlcCBpcyAwIGFuZCBudW0gYW5kIGRlbm9tIGFyZSBib3RoIDEsIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFyZSBhbnkgdmFsdWUsIGZvciB3aGljaAorICAgICAqIG1pbiA8PSB2YWx1ZSA8PSBtYXguCisgICAgICoKKyAgICAgKiBPdGhlcndpc2UsIHRoZSByYW5nZSByZXByZXNlbnRzIGEgZ2VvbWV0cmljL2FyaXRobWV0aWMvbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMsIHdoZXJlCisgICAgICogc3VjY2Vzc2l2ZSBzdXBwb3J0ZWQgdmFsdWVzIGNhbiBiZSBkZXJpdmVkIGZyb20gcHJldmlvdXMgdmFsdWVzIChzdGFydGluZyBhdCBtaW4pLCB1c2luZyB0aGUKKyAgICAgKiBmb2xsb3dpbmcgZm9ybXVsYToKKyAgICAgKiAgdlswXSA9IG1pbgorICAgICAqICB2W2ldID0gdltpLTFdICogbnVtIC8gZGVub20gKyBzdGVwIGZvciBpID49IDEsIHdoaWxlIG1pbiA8IHZbaV0gPD0gbWF4LgorICAgICAqLworICAgIHN0cnVjdCB7CisgICAgICAgIC8qKiBMb3dlciBlbmQgb2YgdGhlIHJhbmdlIChpbmNsdXNpdmUpLiAqLworICAgICAgICBQcmltaXRpdmUgbWluOworICAgICAgICAvKiogVXBwZXIgZW5kIG9mIHRoZSByYW5nZSAoaW5jbHVzaXZlIGlmIHBlcm1pdHRlZCBieSBzZXJpZXMpLiAqLworICAgICAgICBQcmltaXRpdmUgbWF4OworICAgICAgICAvKiogU3RlcCBiZXR3ZWVuIHN1cHBvcnRlZCB2YWx1ZXMuICovCisgICAgICAgIFByaW1pdGl2ZSBzdGVwOworICAgICAgICAvKiogTnVtZXJhdG9yIG9mIGEgZ2VvbWV0cmljIHNlcmllcy4gKi8KKyAgICAgICAgUHJpbWl0aXZlIG51bTsKKyAgICAgICAgLyoqIERlbm9taW5hdG9yIG9mIGEgZ2VvbWV0cmljIHNlcmllcy4gKi8KKyAgICAgICAgUHJpbWl0aXZlIGRlbm9tOworICAgIH0gcmFuZ2U7CisKKyAgICAvKioKKyAgICAgKiBMaXN0IG9mIHZhbHVlcy4gVXNlZCBpZiB0eXBlIGlzIFZBTFVFUyBvciBGTEFHUy4KKyAgICAgKgorICAgICAqIElmIHR5cGUgaXMgVkFMVUVTLCB0aGlzIGlzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCB2YWx1ZXMgaW4gZGVjcmVhc2luZyBwcmVmZXJlbmNlLgorICAgICAqCisgICAgICogSWYgdHlwZSBpcyBGTEFHUywgdGhpcyB2ZWN0b3IgY29udGFpbnMgeyBtaW4tbWFzaywgZmxhZzEsIGZsYWcyLi4uIH0uIEJhc2ljYWxseSwgdGhlIGZpcnN0CisgICAgICogdmFsdWUgaXMgdGhlIHJlcXVpcmVkIHNldCBvZiBmbGFncyB0byBiZSBzZXQsIGFuZCB0aGUgcmVzdCBvZiB0aGUgdmFsdWVzIGFyZSBmbGFncyB0aGF0IGNhbgorICAgICAqIGJlIHNldCBpbmRlcGVuZGVudGx5LiBGTEFHUyBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgaW50ZWdyYWwgdHlwZXMuIFN1cHBvcnRlZCBmbGFncyBzaG91bGQKKyAgICAgKiBub3Qgb3ZlcmxhcCwgYXMgaXQgY2FuIG1ha2UgdmFsaWRhdGlvbiBub24tZGV0ZXJtaW5pc3RpYy4gVGhlIHN0YW5kYXJkIHZhbGlkYXRpb24gbWV0aG9kCisgICAgICogaXMgdGhhdCBzdGFydGluZyBmcm9tIHRoZSBvcmlnaW5hbCB2YWx1ZSwgaWYgZWFjaCBmbGFnIGlzIHJlbW92ZWQgd2hlbiBmdWxseSBwcmVzZW50ICh0aGUKKyAgICAgKiBtaW4tbWFzayBtdXN0IGJlIGZ1bGx5IHByZXNlbnQpLCB3ZSBzaGFsbCBhcnJpdmUgYXQgMC4KKyAgICAgKi8KKyAgICBzdGQ6OnZlY3RvcjxQcmltaXRpdmU+IHZhbHVlczsKKworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoKQorICAgICAgICA6IHR5cGUoRU1QVFkpIHsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoVCBtaW4sIFQgbWF4LCBUIHN0ZXAgPSBUKHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8gMCA6IDEpKQorICAgICAgICA6IHR5cGUoUkFOR0UpLAorICAgICAgICAgIHJhbmdle21pbiwgbWF4LCBzdGVwLCAoVCkxLCAoVCkxfSB7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhUIG1pbiwgVCBtYXgsIFQgbnVtLCBUIGRlbikgOgorICAgICAgICB0eXBlKFJBTkdFKSwKKyAgICAgICAgcmFuZ2V7bWluLCBtYXgsIChUKTAsIG51bSwgZGVufSB7IH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhUIG1pbiwgVCBtYXgsIFQgc3RlcCwgVCBudW0sIFQgZGVuKQorICAgICAgICA6IHR5cGUoUkFOR0UpLAorICAgICAgICAgIHJhbmdle21pbiwgbWF4LCBzdGVwLCBudW0sIGRlbn0geyB9CisKKyAgICAvLy8gXGRlcHJlY2F0ZWQKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoYm9vbCBmbGFncywgc3RkOjppbml0aWFsaXplcl9saXN0PFQ+IGxpc3QpCisgICAgICAgIDogdHlwZShmbGFncyA/IEZMQUdTIDogVkFMVUVTKSwKKyAgICAgICAgICByYW5nZXsoVCkwLCAoVCkwLCAoVCkwLCAoVCkwLCAoVCkwfSB7CisgICAgICAgIGZvciAoVCB2YWx1ZSA6IGxpc3QpIHsKKyAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2sodmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIFxkZXByZWNhdGVkCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKGJvb2wgZmxhZ3MsIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiBsaXN0KQorICAgICAgICA6IHR5cGUoZmxhZ3MgPyBGTEFHUyA6IFZBTFVFUyksCisgICAgICAgICAgcmFuZ2V7KFQpMCwgKFQpMCwgKFQpMCwgKFQpMCwgKFQpMH0geworICAgICAgICBmb3IoVCB2YWx1ZSA6IGxpc3QpIHsKKyAgICAgICAgICAgIHZhbHVlcy5lbXBsYWNlX2JhY2sodmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIFxpbnRlcm5hbAorICAgIC8vLyBcdG9kbzogY3JlYXRlIHNlcGFyYXRlIHZhbHVlcyB2cy4gZmxhZ3MgaW5pdGlhbGl6ZXIgYXMgZm9yIGZsYWdzIHdlIHdhbnQKKyAgICAvLy8gdG8gbGlzdCBib3RoIGFsbG93ZWQgYW5kIHJlcXVpcmVkIGZsYWdzCisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgR0NDIGRpYWdub3N0aWMgaWdub3JlZCAiLVdudWxsLWRlcmVmZXJlbmNlIgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEU9ZGVjbHR5cGUoQzJGaWVsZERlc2NyaXB0b3I6Om5hbWVkVmFsdWVzRm9yKCooVCopbnVsbHB0cikpPgorICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoYm9vbCBmbGFncywgY29uc3QgVCopCisgICAgICAgIDogdHlwZShmbGFncyA/IEZMQUdTIDogVkFMVUVTKSwKKyAgICAgICAgICByYW5nZXsoVCkwLCAoVCkwLCAoVCkwLCAoVCkwLCAoVCkwfSB7CisgICAgICAgICAgICAgIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgbmFtZWQgPSBDMkZpZWxkRGVzY3JpcHRvcjo6bmFtZWRWYWx1ZXNGb3IoKihUKiludWxscHRyKTsKKyAgICAgICAgaWYgKGZsYWdzKSB7CisgICAgICAgICAgICB2YWx1ZXMuZW1wbGFjZV9iYWNrKDApOyAvLyBtaW4tbWFzayBkZWZhdWx0cyB0byAwCisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZVR5cGUgJml0ZW0gOiBuYW1lZCl7CisgICAgICAgICAgICB2YWx1ZXMuZW1wbGFjZV9iYWNrKGl0ZW0uc2Vjb25kKTsKKyAgICAgICAgfQorICAgIH0KK307CisjcHJhZ21hIEdDQyBkaWFnbm9zdGljIHBvcAorCisvKioKKyAqIFN1cHBvcnRlZCB2YWx1ZXMgZm9yIGEgc3BlY2lmaWMgZmllbGQuCisgKgorICogVGhpcyBpcyBhIHBhaXIgb2YgdGhlIGZpZWxkIHNwZWNpZmllciB0b2dldGhlciB3aXRoIGFuIG9wdGlvbmFsIHN1cHBvcnRlZCB2YWx1ZXMgb2JqZWN0LgorICogVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB3aGVuIHJlcG9ydGluZyBwYXJhbWV0ZXIgY29uZmlndXJhdGlvbiBmYWlsdXJlcyBhbmQgY29uZmxpY3RzLgorICovCitzdHJ1Y3QgQzJQYXJhbUZpZWxkVmFsdWVzIHsKKyAgICBDMlBhcmFtRmllbGQgcGFyYW1PckZpZWxkOyAvLy88IHRoZSBmaWVsZCBvciBwYXJhbWV0ZXIKKyAgICAvLy8gb3B0aW9uYWwgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhlIGZpZWxkIGlmIHBhcmFtT3JGaWVsZCBzcGVjaWZpZXMgYW4gYWN0dWFsIGZpZWxkIHRoYXQgaXMKKyAgICAvLy8gbnVtZXJpYyAobm9uIHN0cnVjdCwgYmxvYiBvciBzdHJpbmcpLiBTdXBwb3J0ZWQgdmFsdWVzIGZvciBhcnJheXMgKGluY2x1ZGluZyBzdHJpbmcgYW5kCisgICAgLy8vIGJsb2JzKSBkZXNjcmliZSB0aGUgc3VwcG9ydGVkIHZhbHVlcyBmb3IgZWFjaCBlbGVtZW50IChjaGFyYWN0ZXIgZm9yIHN0cmluZywgYW5kIGJ5dGVzIGZvcgorICAgIC8vLyBibG9icykuIEl0IGlzIG9wdGlvbmFsIGZvciByZWFkLW9ubHkgc3RyaW5ncyBhbmQgYmxvYnMuCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+IHZhbHVlczsKKworICAgIC8vIFRoaXMgc3RydWN0IGlzIG1lYW50IHRvIGJlIG1vdmUgY29uc3RydWN0ZWQuCisgICAgQzJfREVGQVVMVF9NT1ZFKEMyUGFyYW1GaWVsZFZhbHVlcyk7CisKKyAgICAvLyBDb3B5IGNvbnN0cnVjdG9yL2Fzc2lnbm1lbnQgaXMgYWxzbyBwcm92aWRlZCBhcyB0aGlzIG9iamVjdCBtYXkgZ2V0IGNvcGllZC4KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXMoY29uc3QgQzJQYXJhbUZpZWxkVmFsdWVzICZvdGhlcikKKyAgICAgICAgOiBwYXJhbU9yRmllbGQob3RoZXIucGFyYW1PckZpZWxkKSwKKyAgICAgICAgICB2YWx1ZXMob3RoZXIudmFsdWVzID8gc3RkOjptYWtlX3VuaXF1ZTxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPigqb3RoZXIudmFsdWVzKSA6IG51bGxwdHIpIHsgfQorCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzJiBvcGVyYXRvcj0oY29uc3QgQzJQYXJhbUZpZWxkVmFsdWVzICZvdGhlcikgeworICAgICAgICBwYXJhbU9yRmllbGQgPSBvdGhlci5wYXJhbU9yRmllbGQ7CisgICAgICAgIHZhbHVlcyA9IG90aGVyLnZhbHVlcyA/IHN0ZDo6bWFrZV91bmlxdWU8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4oKm90aGVyLnZhbHVlcykgOiBudWxscHRyOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Qgd2l0aCBubyB2YWx1ZXMuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGFyYW1PckZpZWxkXykKKyAgICAgICAgOiBwYXJhbU9yRmllbGQocGFyYW1PckZpZWxkXykgeyB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3Qgd2l0aCB2YWx1ZXMuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGFyYW1PckZpZWxkXywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzXykKKyAgICAgICAgOiBwYXJhbU9yRmllbGQocGFyYW1PckZpZWxkXyksCisgICAgICAgICAgdmFsdWVzKHN0ZDo6bWFrZV91bmlxdWU8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4odmFsdWVzXykpIHsgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0IGZyb20gZmllbGRzLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlcyhjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtT3JGaWVsZF8sIHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzPiAmJnZhbHVlc18pCisgICAgICAgIDogcGFyYW1PckZpZWxkKHBhcmFtT3JGaWVsZF8pLAorICAgICAgICAgIHZhbHVlcyhzdGQ6Om1vdmUodmFsdWVzXykpIHsgfQorfTsKKworLy8vIEB9CisKKy8vIGluY2x1ZGUgZGVidWcgaGVhZGVyIGZvciBDMlBhcmFtcy5oIGlmIEMyRGVidWcuaCB3YXMgYWxyZWFkeSBpbmNsdWRlZAorI2lmZGVmIEMyVVRJTFNfREVCVUdfSF8KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctcGFyYW0uaD4KKyNlbmRpZgorCisjZW5kaWYgIC8vIEMyUEFSQU1fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbURlZi5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMlBhcmFtRGVmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEzMzI4MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJQYXJhbURlZi5oCkBAIC0wLDAgKzEsOTMxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqIFxmaWxlCisgKiBUZW1wbGF0ZXMgdXNlZCB0byBkZWNsYXJlIHBhcmFtZXRlcnMuCisgKi8KKyNpZm5kZWYgQzJQQVJBTV9ERUZfSF8KKyNkZWZpbmUgQzJQQVJBTV9ERUZfSF8KKworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaW5jbHVkZSA8QzJQYXJhbS5oPgorCisvLy8gXGFkZHRvZ3JvdXAgUGFyYW1ldGVycworLy8vIEB7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PSBVVElMSVRZIFRFTVBMQVRFUyBGT1IgUEFSQU1FVEVSIERFRklOSVRJT05TID09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisvLy8gXGFkZHRvZ3JvdXAgaW50ZXJuYWwKKy8vLyBAeworCisvLy8gSGVscGVyIGNsYXNzIHRoYXQgY2hlY2tzIGlmIGEgdHlwZSBoYXMgZXF1YWxpdHkgYW5kIGluZXF1YWxpdHkgb3BlcmF0b3JzLgorc3RydWN0IEMyX0hJREUgX0MyQ29tcGFyYWJsZV9pbXBsCit7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUywgdHlwZW5hbWU9ZGVjbHR5cGUoUygpID09IFMoKSk+CisgICAgc3RhdGljIHN0ZDo6dHJ1ZV90eXBlIFRlc3RFcXVhbChpbnQpOworICAgIHRlbXBsYXRlPHR5cGVuYW1lPgorICAgIHN0YXRpYyBzdGQ6OmZhbHNlX3R5cGUgVGVzdEVxdWFsKC4uLik7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB0eXBlbmFtZT1kZWNsdHlwZShTKCkgIT0gUygpKT4KKyAgICBzdGF0aWMgc3RkOjp0cnVlX3R5cGUgVGVzdE5vdEVxdWFsKGludCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RhdGljIHN0ZDo6ZmFsc2VfdHlwZSBUZXN0Tm90RXF1YWwoLi4uKTsKK307CisKKy8qKgorICogSGVscGVyIHRlbXBsYXRlIHRoYXQgcmV0dXJucyBpZiBhIHR5cGUgaGFzIGVxdWFsaXR5IGFuZCBpbmVxdWFsaXR5IG9wZXJhdG9ycy4KKyAqCisgKiBVc2UgYXMgX0MyQ29tcGFyYWJsZTx0eXBlbmFtZSBTPjo6dmFsdWUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFM+CitzdHJ1Y3QgQzJfSElERSBfQzJDb21wYXJhYmxlCisgICAgOiBwdWJsaWMgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBkZWNsdHlwZShfQzJDb21wYXJhYmxlX2ltcGw6OlRlc3RFcXVhbDxTPigwKSk6OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBkZWNsdHlwZShfQzJDb21wYXJhYmxlX2ltcGw6OlRlc3ROb3RFcXVhbDxTPigwKSk6OnZhbHVlPiB7Cit9OworCisvLy8gIEhlbHBlciBjbGFzcyB0aGF0IGNoZWNrcyBpZiBhIHR5cGUgaGFzIGEgQ09SRV9JTkRFWCBjb25zdGFudC4KK3N0cnVjdCBDMl9ISURFIF9DMkNvcmVJbmRleEhlbHBlcl9pbXBsCit7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgUywgaW50PVM6OkNPUkVfSU5ERVg+CisgICAgc3RhdGljIHN0ZDo6dHJ1ZV90eXBlIFRlc3RDb3JlSW5kZXgoaW50KTsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZT4KKyAgICBzdGF0aWMgc3RkOjpmYWxzZV90eXBlIFRlc3RDb3JlSW5kZXgoLi4uKTsKK307CisKKy8vLyBNYWNybyB0aGF0IGRlZmluZXMgYW5kIHRodXMgb3ZlcnJpZGVzIGEgdHlwZSdzIENPUkVfSU5ERVggZm9yIGEgc2V0dGluZworI2RlZmluZSBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShjb3JlSW5kZXgpIFwKK3B1YmxpYzogXAorICAgIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBjb3JlSW5kZXggfTsKKworCisvLy8gSGVscGVyIHRlbXBsYXRlIHRoYXQgYWRkcyBhIENPUkVfSU5ERVggdG8gYSB0eXBlIGlmIGl0IGRvZXMgbm90IGhhdmUgb25lIChmb3IgdGVzdGluZykKK3RlbXBsYXRlPHR5cGVuYW1lIFMsIGludCBDb3JlSW5kZXg+CitzdHJ1Y3QgQzJfSElERSBfQzJBZGRDb3JlSW5kZXggOiBwdWJsaWMgUyB7CisgICAgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoQ29yZUluZGV4KQorfTsKKworLyoqCisgKiBcYnJpZWYgSGVscGVyIGNsYXNzIHRvIGNoZWNrIHN0cnVjdCByZXF1aXJlbWVudHMgZm9yIHBhcmFtZXRlcnMuCisgKgorICogRmVhdHVyZXM6CisgKiAgLSB2ZXJpZnkgZGVmYXVsdCBjb25zdHJ1Y3Rvciwgbm8gdmlydHVhbCBtZXRob2RzLCBhbmQgbm8gZXF1YWxpdHkgb3BlcmF0b3JzLgorICogIC0gZXhwb3NlIFBBUkFNX1RZUEUsIGFuZCBub24tZmxleCBGTEVYX1NJWkUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFMsIGludCBDb3JlSW5kZXgsIHVuc2lnbmVkIFR5cGVGbGFncz4KK3N0cnVjdCBDMl9ISURFIF9DMlN0cnVjdENoZWNrIHsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICAgICAgc3RkOjppc19kZWZhdWx0X2NvbnN0cnVjdGlibGU8Uz46OnZhbHVlLCAiQzIgc3RydWN0dXJlIG11c3QgaGF2ZSBkZWZhdWx0IGNvbnN0cnVjdG9yIik7CisgICAgc3RhdGljX2Fzc2VydCghc3RkOjppc19wb2x5bW9ycGhpYzxTPjo6dmFsdWUsICJDMiBzdHJ1Y3R1cmUgbXVzdCBub3QgaGF2ZSB2aXJ0dWFsIG1ldGhvZHMiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCFfQzJDb21wYXJhYmxlPFM+Ojp2YWx1ZSwgIkMyIHN0cnVjdHVyZSBtdXN0IG5vdCBoYXZlIG9wZXJhdG9yPT0gb3IgIT0iKTsKKworcHVibGljOgorICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgIFBBUkFNX1RZUEUgPSBDb3JlSW5kZXggfCBUeXBlRmxhZ3MKKyAgICB9OworCitwcm90ZWN0ZWQ6CisgICAgZW51bSA6IHVpbnQzMl90IHsKKyAgICAgICAgRkxFWF9TSVpFID0gMCwKKyAgICB9OworfTsKKworLy8vIEhlbHBlciBjbGFzcyB0aGF0IGNoZWNrcyBpZiBhIHR5cGUgaGFzIGFuIGludGVnZXIgRkxFWF9TSVpFIG1lbWJlci4KK3N0cnVjdCBDMl9ISURFIF9DMkZsZXhpYmxlX2ltcGwgeworICAgIC8vLyBzcGVjaWFsaXphdGlvbiBmb3IgdHlwZXMgdGhhdCBoYXZlIGEgRkxFWF9TSVpFIG1lbWJlcgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFMsIHVuc2lnbmVkPVM6OkZMRVhfU0laRT4KKyAgICBzdGF0aWMgc3RkOjp0cnVlX3R5cGUgVGVzdEZsZXhTaXplKGludCk7CisgICAgdGVtcGxhdGU8dHlwZW5hbWU+CisgICAgc3RhdGljIHN0ZDo6ZmFsc2VfdHlwZSBUZXN0RmxleFNpemUoLi4uKTsKK307CisKKy8vLyBIZWxwZXIgdGVtcGxhdGUgdGhhdCByZXR1cm5zIGlmIGEgdHlwZSBoYXMgYW4gaW50ZWdlciBGTEVYX1NJWkUgbWVtYmVyLgordGVtcGxhdGU8dHlwZW5hbWUgUz4KK3N0cnVjdCBDMl9ISURFIF9DMkZsZXhpYmxlCisgICAgOiBwdWJsaWMgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBkZWNsdHlwZShfQzJGbGV4aWJsZV9pbXBsOjpUZXN0RmxleFNpemU8Uz4oMCkpOjp2YWx1ZT4geworfTsKKworLy8vIE1hY3JvIHRvIHRlc3QgaWYgYSB0eXBlIGlzIGZsZXhpYmxlIChoYXMgYSBGTEVYX1NJWkUgbWVtYmVyKS4KKyNkZWZpbmUgSUZfRkxFWElCTEUoUykgRU5BQkxFX0lGKF9DMkZsZXhpYmxlPFM+Ojp2YWx1ZSkKKy8vLyBTaG9ydGhhbmQgZm9yIHN0ZDo6ZW5hYmxlX2lmCisjZGVmaW5lIEVOQUJMRV9JRihjb25kKSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxjb25kPjo6dHlwZQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBWPXZvaWQ+CitzdHJ1Y3QgQzJfSElERSBfYzJfZW5hYmxlX2lmX3R5cGUgeworICAgIHR5cGVkZWYgViB0eXBlOworfTsKKworLy8vIEhlbHBlciB0ZW1wbGF0ZSB0aGF0IGV4cG9zZXMgdGhlIGZsZXhpYmxlIHN1YnR5cGUgb2YgYSBzdHJ1Y3QuCit0ZW1wbGF0ZTx0eXBlbmFtZSBTLCB0eXBlbmFtZSBFPXZvaWQ+CitzdHJ1Y3QgQzJfSElERSBfQzJGbGV4SGVscGVyIHsKKyAgICB0eXBlZGVmIHZvaWQgRmxleFR5cGU7CisgICAgZW51bSA6IHVpbnQzMl90IHsgRkxFWF9TSVpFID0gMCB9OworfTsKKworLy8vIFNwZWNpYWxpemF0aW9uIGZvciBmbGV4aWJsZSB0eXBlcy4gVGhpcyBvbmx5IHdvcmtzIGlmIF9GbGV4TWVtYmVyVHlwZSBpcyBwdWJsaWMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorc3RydWN0IEMyX0hJREUgX0MyRmxleEhlbHBlcjxTLAorICAgICAgICB0eXBlbmFtZSBfYzJfZW5hYmxlX2lmX3R5cGU8dHlwZW5hbWUgUzo6X0ZsZXhNZW1iZXJUeXBlPjo6dHlwZT4geworICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmxleEhlbHBlcjx0eXBlbmFtZSBTOjpfRmxleE1lbWJlclR5cGU+OjpGbGV4VHlwZSBGbGV4VHlwZTsKKyAgICBlbnVtIDogdWludDMyX3QgeyBGTEVYX1NJWkUgPSBfQzJGbGV4SGVscGVyPHR5cGVuYW1lIFM6Ol9GbGV4TWVtYmVyVHlwZT46OkZMRVhfU0laRSB9OworfTsKKworLy8vIFNwZWNpYWxpemF0aW9uIGZvciBmbGV4IGFycmF5cy4KK3RlbXBsYXRlPHR5cGVuYW1lIFM+CitzdHJ1Y3QgQzJfSElERSBfQzJGbGV4SGVscGVyPFNbXSwKKyAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc192b2lkPHR5cGVuYW1lIF9DMkZsZXhIZWxwZXI8Uz46OkZsZXhUeXBlPjo6dmFsdWU+Ojp0eXBlPiB7CisgICAgdHlwZWRlZiBTIEZsZXhUeXBlOworICAgIGVudW0gOiB1aW50MzJfdCB7IEZMRVhfU0laRSA9IHNpemVvZihTKSB9OworfTsKKworLyoqCisgKiBcYnJpZWYgSGVscGVyIGNsYXNzIHRvIGNoZWNrIGZsZXhpYmxlIHN0cnVjdCByZXF1aXJlbWVudHMgYW5kIGFkZCBjb21tb24gb3BlcmF0aW9ucy4KKyAqCisgKiBGZWF0dXJlczoKKyAqICAtIGV4cG9zZSBDT1JFX0lOREVYIGFuZCBGaWVsZExpc3QgKHRoaXMgaXMgbm9ybWFsbHkgaW5oZXJpdGVkIGZyb20gdGhlIHN0cnVjdCwgYnV0IGZsZXhpYmxlCisgKiAgICBzdHJ1Y3RzIGNhbm5vdCBiZSBiYXNlIGNsYXNzZXMgYW5kIHRodXMgaW5oZXJpdGVkIGZyb20pCisgKiAgLSBkaXNhYmxlIGNvcHkgYXNzaWdubWVudCBhbmQgY29uc3RydWN0aW9uIChUT0RPOiB0aGlzIGlzIGFscmVhZHkgZG9uZSBpbiB0aGUgRkxFWCBtYWNybyBmb3IgdGhlCisgKiAgICBmbGV4aWJsZSBzdHJ1Y3QsIHNvIG1heSBub3QgYmUgbmVlZGVkIGhlcmUpCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFMsIGludCBQYXJhbUluZGV4LCB1bnNpZ25lZCBUeXBlRmxhZ3M+CitzdHJ1Y3QgQzJfSElERSBfQzJGbGV4U3RydWN0Q2hlY2sgOgorLy8gYWRkIGZsZXhpYmxlIGZsYWcgYXMgX0MyU3RydWN0Q2hlY2sgZGVmaW5lcyBQQVJBTV9UWVBFCisgICAgICAgIHB1YmxpYyBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4IHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19GTEVYX0ZMQUcsIFR5cGVGbGFncz4geworcHVibGljOgorICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgIC8vLyBcaGlkZWluaXRpYWxpemVyCisgICAgICAgIENPUkVfSU5ERVggPSBQYXJhbUluZGV4IHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19GTEVYX0ZMQUcsIC8vLzwgZmxleGlibGUgc3RydWN0IGNvcmUtaW5kZXgKKyAgICB9OworCisgICAgaW5saW5lIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCkgeyByZXR1cm4gUzo6RmllbGRMaXN0KCk7IH0KKworICAgIC8vIGRlZmF1bHQgY29uc3RydWN0b3IgbmVlZGVkIGJlY2F1c2Ugb2YgdGhlIGRpc2FibGVkIGNvcHkgY29uc3RydWN0b3IKKyAgICBpbmxpbmUgX0MyRmxleFN0cnVjdENoZWNrKCkgPSBkZWZhdWx0OworCitwcm90ZWN0ZWQ6CisgICAgLy8gY2Fubm90IGNvcHkgZmxleGlibGUgcGFyYW1zCisgICAgX0MyRmxleFN0cnVjdENoZWNrKGNvbnN0IF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUeXBlRmxhZ3M+ICYpID0gZGVsZXRlOworICAgIF9DMkZsZXhTdHJ1Y3RDaGVjayYgb3BlcmF0b3I9IChjb25zdCBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVHlwZUZsYWdzPiAmKSA9IGRlbGV0ZTsKKworICAgIC8vIGNvbnN0YW50cyB1c2VkIGZvciBoZWxwZXIgbWV0aG9kcworICAgIGVudW0gOiB1aW50MzJfdCB7CisgICAgICAgIC8vLyBcaGlkZWluaXRpYWxpemVyCisgICAgICAgIEZMRVhfU0laRSA9IF9DMkZsZXhIZWxwZXI8Uz46OkZMRVhfU0laRSwgLy8vPCBzaXplIG9mIGZsZXhpYmxlIHR5cGUKKyAgICAgICAgLy8vIFxoaWRlaW5pdGlhbGl6ZXIKKyAgICAgICAgTUFYX1NJWkUgPSAodWludDMyX3Qpc3RkOjptaW4oKHNpemVfdClVSU5UMzJfTUFYLCBTSVpFX01BWCksIC8vIFRPRE86IGlzIHRoaXMgYWx3YXlzIHUzMiBtYXg/CisgICAgICAgIC8vLyBcaGlkZWluaXRpYWxpemVyCisgICAgICAgIEJBU0VfU0laRSA9IHNpemVvZihTKSArIHNpemVvZihDMlBhcmFtKSwgLy8vPCBzaXplIG9mIHRoZSBiYXNlIHBhcmFtCisgICAgfTsKKworICAgIC8vLyByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgc2l6ZSBvZiB0aGlzIHBhcmFtIHdpdGggZmxleENvdW50LCBvciAwIGlmIGl0IHdvdWxkIG92ZXJmbG93LgorICAgIGlubGluZSBzdGF0aWMgc2l6ZV90IENhbGNTaXplKHNpemVfdCBmbGV4Q291bnQsIHNpemVfdCBzaXplID0gQkFTRV9TSVpFKSB7CisgICAgICAgIGlmIChmbGV4Q291bnQgPD0gKE1BWF9TSVpFIC0gc2l6ZSkgLyBTOjpGTEVYX1NJWkUpIHsKKyAgICAgICAgICAgIHJldHVybiBzaXplICsgUzo6RkxFWF9TSVpFICogZmxleENvdW50OworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vLyBkeW5hbWljIG5ldyBvcGVyYXRvciB1c2FibGUgZm9yIHBhcmFtcyBvZiB0eXBlIFMKKyAgICBpbmxpbmUgdm9pZCogb3BlcmF0b3IgbmV3KHNpemVfdCBzaXplLCBzaXplX3QgZmxleENvdW50KSBub2V4Y2VwdCB7CisgICAgICAgIC8vIFRPRE86IGFzc2VydChzaXplID09IEJBU0VfU0laRSk7CisgICAgICAgIHNpemUgPSBDYWxjU2l6ZShmbGV4Q291bnQsIHNpemUpOworICAgICAgICBpZiAoc2l6ZSA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiA6Om9wZXJhdG9yIG5ldyhzaXplKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9Cit9OworCisvLy8gRGVmaW5lIEZyb20oKSBjYXN0IG9wZXJhdG9ycyBmb3IgcGFyYW1zLgorI2RlZmluZSBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX1R5cGUpIFwKKyAgICBpbmxpbmUgc3RhdGljIF9UeXBlKiBGcm9tKEMyUGFyYW0gKm90aGVyKSB7IFwKKyAgICAgICAgcmV0dXJuIChfVHlwZSopQzJQYXJhbTo6SWZTdWl0YWJsZSggXAorICAgICAgICAgICAgICAgIG90aGVyLCBzaXplb2YoX1R5cGUpLCBfVHlwZTo6UEFSQU1fVFlQRSwgX1R5cGU6OkZMRVhfU0laRSwgXAorICAgICAgICAgICAgICAgIChfVHlwZTo6UEFSQU1fVFlQRSAmIFQ6OkluZGV4OjpESVJfVU5ERUZJTkVEKSAhPSBUOjpJbmRleDo6RElSX1VOREVGSU5FRCk7IFwKKyAgICB9IFwKKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0IF9UeXBlKiBGcm9tKGNvbnN0IEMyUGFyYW0gKm90aGVyKSB7IFwKKyAgICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y29uc3QgX1R5cGUqPihGcm9tKGNvbnN0X2Nhc3Q8QzJQYXJhbSAqPihvdGhlcikpKTsgXAorICAgIH0gXAorICAgIGlubGluZSBzdGF0aWMgX1R5cGUqIEZyb20oc3RkOjpudWxscHRyX3QpIHsgcmV0dXJuIG51bGxwdHI7IH0gXAorCisvKioKKyAqIERlZmluZSBmbGV4aWJsZSBhbGxvY2F0b3JzIChBbGxvY1NoYXJlZCBvciBBbGxvY1VuaXF1ZSkgZm9yIGZsZXhpYmxlIHBhcmFtcy4KKyAqICAtIFA6OkFsbG9jWHl6KGZsZXhDb3VudCwgYXJncy4uLik6IGFsbG9jYXRlIGZvciBnaXZlbiBmbGV4LWNvdW50LiBUaGlzIG1hcHMgdG8KKyAqICAgICAgICAgIFQoZmxleENvdW50LCBhcmdzLi4uKVwKKyAqCisgKiBDbGFuZyBkb2VzIG5vdCBzdXBwb3J0IGFyZ3MuLi4gZm9sbG93ZWQgYnkgdGVtcGxhdGVkIHBhcmFtIGFzIGFyZ3MuLi4gZWF0cyBpdC4gSGVuY2UsCisgKiBwcm92aWRlIHNwZWNpYWxpemF0aW9ucyB3aGVyZSB0aGUgaW5pdGlhbGl6ZXIgcmVwbGFjZXMgdGhlIGZsZXhDb3VudC4KKyAqCisgKiBTcGVjaWFsaXphdGlvbnMgdGhhdCBkZWR1Y2UgZmxleENvdW50OgorICogIC0gUDo6QWxsb2NYeXooVFtdLCBhcmdzLi4uKTogYWxsb2NhdGUgZm9yIHNpemUgb2YgKGFuZCB3aXRoKSBpbml0IGFycmF5LgorICogIC0gUDo6QWxsb2NYeXooc3RkOjppbml0aWFsaXplcl9saXN0PFQ+LCBhcmdzLi4uKTogYWxsb2NhdGUgZm9yIHNpemUgb2YgKGFuZCB3aXRoKSBpbml0aWFsaXplcgorICogICAgICAgICAgICBsaXN0LgorICogIC0gUDo6QWxsb2NYeXooc3RkOjp2ZWN0b3I8VD4sIGFyZ3MuLi4pOiBhbGxvY2F0ZSBmb3Igc2l6ZSBvZiAoYW5kIHdpdGgpIGluaXQgdmVjdG9yLgorICogIFRoZXNlIHNwZWNpYWxpemF0aW9ucyBtYXAgdG8gVChmbGV4Q291bnQgPSBzaXplLW9mLWluaXQsIGFyZ3MuLi4sIGluaXQpCisgKi8KKyNkZWZpbmUgREVGSU5FX0ZMRVhJQkxFX0FMTE9DKF9UeXBlLCBTLCBwdHIsIFB0cikgXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+IFwKKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6cHRyIyNfcHRyPF9UeXBlPiBBbGxvYyMjUHRyKHNpemVfdCBmbGV4Q291bnQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgeyBcCisgICAgICAgIHJldHVybiBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4obmV3KGZsZXhDb3VudCkgX1R5cGUoZmxleENvdW50LCBhcmdzLi4uKSk7IFwKKyAgICB9IFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzLCB0eXBlbmFtZSBVPXR5cGVuYW1lIFM6OkZsZXhUeXBlPiBcCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4gQWxsb2MjI1B0ciggXAorICAgICAgICAgICAgY29uc3Qgc3RkOjppbml0aWFsaXplcl9saXN0PFU+ICZpbml0LCBjb25zdCBBcmdzKCYuLi4gYXJncykpIHsgXAorICAgICAgICByZXR1cm4gc3RkOjpwdHIjI19wdHI8X1R5cGU+KG5ldyhpbml0LnNpemUoKSkgX1R5cGUoaW5pdC5zaXplKCksIGFyZ3MuLi4sIGluaXQpKTsgXAorICAgIH0gXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3MsIHR5cGVuYW1lIFU9dHlwZW5hbWUgUzo6RmxleFR5cGU+IFwKKyAgICBpbmxpbmUgc3RhdGljIHN0ZDo6cHRyIyNfcHRyPF9UeXBlPiBBbGxvYyMjUHRyKCBcCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxVPiAmaW5pdCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKSB7IFwKKyAgICAgICAgcmV0dXJuIHN0ZDo6cHRyIyNfcHRyPF9UeXBlPihuZXcoaW5pdC5zaXplKCkpIF9UeXBlKGluaXQuc2l6ZSgpLCBhcmdzLi4uLCBpbml0KSk7IFwKKyAgICB9IFwKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzLCB0eXBlbmFtZSBVPXR5cGVuYW1lIFM6OkZsZXhUeXBlLCB1bnNpZ25lZCBOPiBcCisgICAgaW5saW5lIHN0YXRpYyBzdGQ6OnB0ciMjX3B0cjxfVHlwZT4gQWxsb2MjI1B0cihjb25zdCBVKCZpbml0KVtOXSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKSB7IFwKKyAgICAgICAgcmV0dXJuIHN0ZDo6cHRyIyNfcHRyPF9UeXBlPihuZXcoTikgX1R5cGUoTiwgYXJncy4uLiwgaW5pdCkpOyBcCisgICAgfSBcCisKKy8qKgorICogRGVmaW5lIGZsZXhpYmxlIG1ldGhvZHMgQWxsb2NTaGFyZWQsIEFsbG9jVW5pcXVlIGFuZCBmbGV4Q291bnQuCisgKi8KKyNkZWZpbmUgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMoX1R5cGUsIFMpIFwKKyAgICBERUZJTkVfRkxFWElCTEVfQUxMT0MoX1R5cGUsIFMsIHNoYXJlZCwgU2hhcmVkKSBcCisgICAgREVGSU5FX0ZMRVhJQkxFX0FMTE9DKF9UeXBlLCBTLCB1bmlxdWUsIFVuaXF1ZSkgXAorICAgIGlubGluZSBzaXplX3QgZmxleENvdW50KCkgY29uc3QgeyBcCisgICAgICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKF9UeXBlKSA9PSBfVHlwZTo6QkFTRV9TSVpFLCAiaW5jb3JyZWN0IEJBU0VfU0laRSIpOyBcCisgICAgICAgIHNpemVfdCBzeiA9IHRoaXMtPnNpemUoKTsgXAorICAgICAgICBpZiAoc3ogPj0gc2l6ZW9mKF9UeXBlKSkgeyBcCisgICAgICAgICAgICByZXR1cm4gKHN6IC0gc2l6ZW9mKF9UeXBlKSkgLyBfVHlwZTo6RkxFWF9TSVpFOyBcCisgICAgICAgIH0gXAorICAgICAgICByZXR1cm4gMDsgXAorICAgIH0gXAorCisvLy8gTWFyayBmbGV4aWJsZSBtZW1iZXIgdmFyaWFibGUgYW5kIG1ha2Ugc3RydWN0dXJlIGZsZXhpYmxlLgorI2RlZmluZSBGTEVYKGNscywgbSkgXAorICAgIEMyX0RPX05PVF9DT1BZKGNscykgXAorcHJpdmF0ZTogXAorICAgIEMyUEFSQU1fTUFLRV9GUklFTkRTIFwKKyAgICAvKiogXGlmIDAgKi8gXAorICAgIHRlbXBsYXRlPHR5cGVuYW1lLCB0eXBlbmFtZT4gZnJpZW5kIHN0cnVjdCBfQzJGbGV4SGVscGVyOyBcCitwdWJsaWM6IFwKKyAgICB0eXBlZGVmIGRlY2x0eXBlKG0pIF9GbGV4TWVtYmVyVHlwZTsgXAorICAgIC8qIGRlZmF1bHQgY29uc3RydWN0b3Igd2l0aCBmbGV4Q291bnQgKi8gXAorICAgIGlubGluZSBjbHMoc2l6ZV90KSA6IGNscygpIHt9IFwKKyAgICAvKiBjb25zdGV4cHIgc3RhdGljIF9GbGV4TWVtYmVyVHlwZSBjbHM6OiogZmxleE1lbWJlciA9ICZjbHM6Om07ICovIFwKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZsZXhIZWxwZXI8X0ZsZXhNZW1iZXJUeXBlPjo6RmxleFR5cGUgRmxleFR5cGU7IFwKKyAgICBzdGF0aWNfYXNzZXJ0KFwKKyAgICAgICAgICAgICFzdGQ6OmlzX3ZvaWQ8RmxleFR5cGU+Ojp2YWx1ZSwgXAorICAgICAgICAgICAgIm1lbWJlciBpcyBub3QgZmxleGlibGUsIG9yIGEgZmxleGlibGUgYXJyYXkgb2YgYSBmbGV4aWJsZSB0eXBlIik7IFwKKyAgICBlbnVtIDogdWludDMyX3QgeyBGTEVYX1NJWkUgPSBfQzJGbGV4SGVscGVyPF9GbGV4TWVtYmVyVHlwZT46OkZMRVhfU0laRSB9OyBcCisgICAgLyoqIFxlbmRpZiAqLyBcCisKKy8vLyBAfQorCisvKioKKyAqIEdsb2JhbC1wYXJhbWV0ZXIgdGVtcGxhdGUuCisgKgorICogQmFzZSB0ZW1wbGF0ZSB0byBkZWZpbmUgYSBnbG9iYWwgc2V0dGluZy90dW5pbmcgb3IgaW5mbyBiYXNlZCBvbiBhIHN0cnVjdHVyZSBhbmQKKyAqIGFuIG9wdGlvbmFsIFBhcmFtSW5kZXguIEdsb2JhbCBwYXJhbWV0ZXJzIGFyZSBub3QgdGllZCB0byBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCkuCisgKgorICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBvZiB0aGUgd3JhcHBlZAorICogc3RydWN0dXJlIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSwgYW5kIGNvbnN0cnVjdG9ycyBhbmQgcG90ZW50aWFsIHB1YmxpYyBtZXRob2RzIGFyZSBhbHNvCisgKiB3cmFwcGVkLgorICoKKyAqIFx0cGFyYW0gVCBwYXJhbSB0eXBlIEMyU2V0dGluZywgQzJUdW5pbmcgb3IgQzJJbmZvCisgKiBcdHBhcmFtIFMgd3JhcHBlZCBzdHJ1Y3R1cmUKKyAqIFx0cGFyYW0gUGFyYW1JbmRleCBvcHRpb25hbCBwYXJhbWV0ZXIgaW5kZXggb3ZlcnJpZGUuIE11c3QgYmUgc3BlY2lmaWVkIGZvciBiYXNlL3JldXNlZAorICogc3RydWN0dXJlcy4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUywgaW50IFBhcmFtSW5kZXg9Uzo6Q09SRV9JTkRFWCwgY2xhc3MgRmxleD12b2lkPgorc3RydWN0IEMyX0hJREUgQzJHbG9iYWxQYXJhbSA6IHB1YmxpYyBULCBwdWJsaWMgUywKKyAgICAgICAgcHVibGljIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpUeXBlOjpESVJfR0xPQkFMPiB7CisgICAgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoUGFyYW1JbmRleCkKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPFQsIFMsIFBhcmFtSW5kZXg+IF9UeXBlOworCitwdWJsaWM6CisgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbmxpbmUgQzJHbG9iYWxQYXJhbShjb25zdCBBcmdzKCYuLi4gYXJncykpIDogVChzaXplb2YoX1R5cGUpLCBfVHlwZTo6UEFSQU1fVFlQRSksIFMoYXJncy4uLikgeyB9CisKKyAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX1R5cGUpCit9OworCisvKioKKyAqIEdsb2JhbC1wYXJhbWV0ZXIgdGVtcGxhdGUgZm9yIGZsZXhpYmxlIHN0cnVjdHVyZXMuCisgKgorICogQmFzZSB0ZW1wbGF0ZSB0byBkZWZpbmUgYSBnbG9iYWwgc2V0dGluZy90dW5pbmcgb3IgaW5mbyBiYXNlZCBvbiBhIGZsZXhpYmxlIHN0cnVjdHVyZSBhbmQKKyAqIGFuIG9wdGlvbmFsIFBhcmFtSW5kZXguIEdsb2JhbCBwYXJhbWV0ZXJzIGFyZSBub3QgdGllZCB0byBhIHBvcnQgKGlucHV0IG9yIG91dHB1dCkuCisgKgorICogXHRwYXJhbSBUIHBhcmFtIHR5cGUgQzJTZXR0aW5nLCBDMlR1bmluZyBvciBDMkluZm8KKyAqIFx0cGFyYW0gUyB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorICogXHRwYXJhbSBQYXJhbUluZGV4IG9wdGlvbmFsIHBhcmFtZXRlciBpbmRleCBvdmVycmlkZS4gTXVzdCBiZSBzcGVjaWZpZWQgZm9yIGJhc2UvcmV1c2VkCisgKiAgICAgICAgIHN0cnVjdHVyZXMuCisgKgorICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBvZiBmbGV4aWJsZQorICogc3RydWN0dXJlcyBjYW4gYmUgYWNjZXNzZWQgdmlhIHRoZSBtIG1lbWJlciB2YXJpYWJsZTsgaG93ZXZlciwgdGhlIGNvbnN0cnVjdG9ycyBvZiB0aGUgc3RydWN0dXJlCisgKiBhcmUgd3JhcHBlZCBkaXJlY3RseS4gKFRoaXMgaXMgYmVjYXVzZSBmbGV4aWJsZSB0eXBlcyBjYW5ub3QgYmUgc3ViY2xhc3NlZC4pCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBQYXJhbUluZGV4Pgorc3RydWN0IEMyX0hJREUgQzJHbG9iYWxQYXJhbTxULCBTLCBQYXJhbUluZGV4LCBJRl9GTEVYSUJMRShTKT4KKyAgICA6IHB1YmxpYyBULCBwdWJsaWMgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpUeXBlOjpESVJfR0xPQkFMPiB7Citwcml2YXRlOgorICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxULCBTLCBQYXJhbUluZGV4PiBfVHlwZTsKKworICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgaW5saW5lIEMyR2xvYmFsUGFyYW0oc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIF9UeXBlOjpQQVJBTV9UWVBFKSwgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQorCitwdWJsaWM6CisgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisKKyAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhfVHlwZSwgUykKKyAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX1R5cGUpCit9OworCisvKioKKyAqIFBvcnQtcGFyYW1ldGVyIHRlbXBsYXRlLgorICoKKyAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgcG9ydCBzZXR0aW5nL3R1bmluZyBvciBpbmZvIGJhc2VkIG9uIGEgc3RydWN0dXJlIGFuZAorICogYW4gb3B0aW9uYWwgUGFyYW1JbmRleC4gUG9ydCBwYXJhbWV0ZXJzIGFyZSB0aWVkIHRvIGEgcG9ydCAoaW5wdXQgb3Igb3V0cHV0KSwgYnV0IG5vdCB0byBhCisgKiBzcGVjaWZpYyBzdHJlYW0uCisgKgorICogXHRwYXJhbSBUIHBhcmFtIHR5cGUgQzJTZXR0aW5nLCBDMlR1bmluZyBvciBDMkluZm8KKyAqIFx0cGFyYW0gUyB3cmFwcGVkIHN0cnVjdHVyZQorICogXHRwYXJhbSBQYXJhbUluZGV4IG9wdGlvbmFsIHBhcmFtZXRlciBpbmRleCBvdmVycmlkZS4gTXVzdCBiZSBzcGVjaWZpZWQgZm9yIGJhc2UvcmV1c2VkCisgKiAgICAgICAgIHN0cnVjdHVyZXMuCisgKgorICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBvZiB0aGUgd3JhcHBlZAorICogc3RydWN0dXJlIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSwgYW5kIGNvbnN0cnVjdG9ycyBhbmQgcG90ZW50aWFsIHB1YmxpYyBtZXRob2RzIGFyZSBhbHNvCisgKiB3cmFwcGVkLgorICoKKyAqIFRoZXJlIGFyZSAzIGZsYXZvcnMgb2YgcG9ydCBwYXJhbWV0ZXJzOiB1bnNwZWNpZmllZCwgaW5wdXQgYW5kIG91dHB1dC4gUGFyYW1ldGVycyB3aXRoCisgKiB1bnNwZWNpZmllZCBwb3J0IGV4cG9zZSBhIHNldFBvcnQgbWV0aG9kLCBhbmQgYWRkIGFuIGluaXRpYWwgcG9ydCBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleD1TOjpDT1JFX0lOREVYLCBjbGFzcyBGbGV4PXZvaWQ+CitzdHJ1Y3QgQzJfSElERSBDMlBvcnRQYXJhbSA6IHB1YmxpYyBULCBwdWJsaWMgUywKKyAgICAgICAgcHJpdmF0ZSBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OkRJUl9VTkRFRklORUQ+IHsKKyAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShQYXJhbUluZGV4KQorcHJpdmF0ZToKKyAgICB0eXBlZGVmIEMyUG9ydFBhcmFtPFQsIFMsIFBhcmFtSW5kZXg+IF9UeXBlOworCitwdWJsaWM6CisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgaW5saW5lIEMyUG9ydFBhcmFtKCkgOiBUKHNpemVvZihfVHlwZSksIF9UeXBlOjpQQVJBTV9UWVBFKSB7IH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIHNwZWNpZnlpbmcgcG9ydC9kaXJlY3Rpb24uCisgICAgaW5saW5lIEMyUG9ydFBhcmFtKGJvb2wgX291dHB1dCwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICA6IFQoc2l6ZW9mKF9UeXBlKSwgX291dHB1dCA/IG91dHB1dDo6UEFSQU1fVFlQRSA6IGlucHV0OjpQQVJBTV9UWVBFKSwgUyhhcmdzLi4uKSB7IH0KKyAgICAvLy8gU2V0IHBvcnQvZGlyZWN0aW9uLgorICAgIGlubGluZSB2b2lkIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsgQzJQYXJhbTo6c2V0UG9ydChvdXRwdXQpOyB9CisKKyAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX1R5cGUpCisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIGlucHV0IHBvcnQgcGFyYW1ldGVyLgorICAgIHN0cnVjdCBpbnB1dCA6IHB1YmxpYyBULCBwdWJsaWMgUywKKyAgICAgICAgICAgIHB1YmxpYyBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OkRJUl9JTlBVVD4geworICAgICAgICBfQzJfQ09SRV9JTkRFWF9PVkVSUklERShQYXJhbUluZGV4KQorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3Rvci4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAgICAgaW5saW5lIGlucHV0KGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkgOiBUKHNpemVvZihfVHlwZSksIGlucHV0OjpQQVJBTV9UWVBFKSwgUyhhcmdzLi4uKSB7IH0KKworICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoaW5wdXQpCisKKyAgICB9OworCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBvdXRwdXQgcG9ydCBwYXJhbWV0ZXIuCisgICAgc3RydWN0IG91dHB1dCA6IHB1YmxpYyBULCBwdWJsaWMgUywKKyAgICAgICAgICAgIHB1YmxpYyBfQzJTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OkRJUl9PVVRQVVQ+IHsKKyAgICAgICAgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoUGFyYW1JbmRleCkKKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3IuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBvdXRwdXQoY29uc3QgQXJncygmLi4uIGFyZ3MpKSA6IFQoc2l6ZW9mKF9UeXBlKSwgb3V0cHV0OjpQQVJBTV9UWVBFKSwgUyhhcmdzLi4uKSB7IH0KKworICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMob3V0cHV0KQorICAgIH07Cit9OworCisvKioKKyAqIFBvcnQtcGFyYW1ldGVyIHRlbXBsYXRlIGZvciBmbGV4aWJsZSBzdHJ1Y3R1cmVzLgorICoKKyAqIEJhc2UgdGVtcGxhdGUgdG8gZGVmaW5lIGEgcG9ydCBzZXR0aW5nL3R1bmluZyBvciBpbmZvIGJhc2VkIG9uIGEgZmxleGlibGUgc3RydWN0dXJlIGFuZAorICogYW4gb3B0aW9uYWwgUGFyYW1JbmRleC4gUG9ydCBwYXJhbWV0ZXJzIGFyZSB0aWVkIHRvIGEgcG9ydCAoaW5wdXQgb3Igb3V0cHV0KSwgYnV0IG5vdCB0byBhCisgKiBzcGVjaWZpYyBzdHJlYW0uCisgKgorICogXHRwYXJhbSBUIHBhcmFtIHR5cGUgQzJTZXR0aW5nLCBDMlR1bmluZyBvciBDMkluZm8KKyAqIFx0cGFyYW0gUyB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorICogXHRwYXJhbSBQYXJhbUluZGV4IG9wdGlvbmFsIHBhcmFtZXRlciBpbmRleCBvdmVycmlkZS4gTXVzdCBiZSBzcGVjaWZpZWQgZm9yIGJhc2UvcmV1c2VkCisgKiAgICAgICAgIHN0cnVjdHVyZXMuCisgKgorICogUGFyYW1ldGVycyB3cmFwIHN0cnVjdHVyZXMgYnkgcHJlcGVuZGluZyBhIChwYXJhbWV0ZXIpIGhlYWRlci4gVGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBvZiBmbGV4aWJsZQorICogc3RydWN0dXJlcyBjYW4gYmUgYWNjZXNzZWQgdmlhIHRoZSBtIG1lbWJlciB2YXJpYWJsZTsgaG93ZXZlciwgdGhlIGNvbnN0cnVjdG9ycyBvZiB0aGUgc3RydWN0dXJlCisgKiBhcmUgd3JhcHBlZCBkaXJlY3RseS4gKFRoaXMgaXMgYmVjYXVzZSBmbGV4aWJsZSB0eXBlcyBjYW5ub3QgYmUgc3ViY2xhc3NlZC4pCisgKgorICogVGhlcmUgYXJlIDMgZmxhdm9ycyBvZiBwb3J0IHBhcmFtZXRlcnM6IHVuc3BlY2lmaWVkLCBpbnB1dCBhbmQgb3V0cHV0LiBQYXJhbWV0ZXJzIHdpdGgKKyAqIHVuc3BlY2lmaWVkIHBvcnQgZXhwb3NlIGEgc2V0UG9ydCBtZXRob2QsIGFuZCBhZGQgYW4gaW5pdGlhbCBwb3J0IHBhcmFtZXRlciB0byB0aGUgY29uc3RydWN0b3IuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBQYXJhbUluZGV4Pgorc3RydWN0IEMyX0hJREUgQzJQb3J0UGFyYW08VCwgUywgUGFyYW1JbmRleCwgSUZfRkxFWElCTEUoUyk+CisgICAgOiBwdWJsaWMgVCwgcHVibGljIF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LCBUOjpQQVJBTV9LSU5EIHwgVDo6VHlwZTo6RElSX1VOREVGSU5FRD4geworcHJpdmF0ZToKKyAgICB0eXBlZGVmIEMyUG9ydFBhcmFtPFQsIFMsIFBhcmFtSW5kZXg+IF9UeXBlOworCisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IgZm9yIGJhc2ljIGFsbG9jYXRpb246IG5ldyhmbGV4Q291bnQpIFAuCisgICAgaW5saW5lIEMyUG9ydFBhcmFtKHNpemVfdCBmbGV4Q291bnQpIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgX1R5cGU6OlBBUkFNX1RZUEUpIHsgfQorICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uLgorICAgIGlubGluZSBDMlBvcnRQYXJhbShzaXplX3QgZmxleENvdW50LCBib29sIF9vdXRwdXQsIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBfb3V0cHV0ID8gb3V0cHV0OjpQQVJBTV9UWVBFIDogaW5wdXQ6OlBBUkFNX1RZUEUpLAorICAgICAgICAgIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KKworcHVibGljOgorICAgIC8vLyBTZXQgcG9ydC9kaXJlY3Rpb24uCisgICAgaW5saW5lIHZvaWQgc2V0UG9ydChib29sIG91dHB1dCkgeyBDMlBhcmFtOjpzZXRQb3J0KG91dHB1dCk7IH0KKworICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMoX1R5cGUsIFMpCisgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKF9UeXBlKQorCisgICAgLy8vIFNwZWNpYWxpemF0aW9uIGZvciBhbiBpbnB1dCBwb3J0IHBhcmFtZXRlci4KKyAgICBzdHJ1Y3QgaW5wdXQgOiBwdWJsaWMgVCwKKyAgICAgICAgICAgIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpESVJfSU5QVVQ+IHsKKyAgICBwcml2YXRlOgorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgcG9ydC9kaXJlY3Rpb24uCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBpbnB1dChzaXplX3QgZmxleENvdW50LCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgICAgICA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIGlucHV0OjpQQVJBTV9UWVBFKSwgbShmbGV4Q291bnQsIGFyZ3MuLi4pIHsgfQorCisgICAgcHVibGljOgorICAgICAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKworICAgICAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhpbnB1dCwgUykKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKGlucHV0KQorICAgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIG91dHB1dCBwb3J0IHBhcmFtZXRlci4KKyAgICBzdHJ1Y3Qgb3V0cHV0IDogcHVibGljIFQsCisgICAgICAgICAgICBwdWJsaWMgX0MyRmxleFN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6RElSX09VVFBVVD4geworICAgIHByaXZhdGU6CisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBwb3J0L2RpcmVjdGlvbi4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAgICAgaW5saW5lIG91dHB1dChzaXplX3QgZmxleENvdW50LCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgICAgICA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIG91dHB1dDo6UEFSQU1fVFlQRSksIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KKworICAgIHB1YmxpYzoKKyAgICAgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisKKyAgICAgICAgREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMob3V0cHV0LCBTKQorICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMob3V0cHV0KQorICAgIH07Cit9OworCisvKioKKyAqIFN0cmVhbS1wYXJhbWV0ZXIgdGVtcGxhdGUuCisgKgorICogQmFzZSB0ZW1wbGF0ZSB0byBkZWZpbmUgYSBzdHJlYW0gc2V0dGluZy90dW5pbmcgb3IgaW5mbyBiYXNlZCBvbiBhIHN0cnVjdHVyZSBhbmQKKyAqIGFuIG9wdGlvbmFsIFBhcmFtSW5kZXguIFN0cmVhbSBwYXJhbWV0ZXJzIGFyZSB0aWVkIHRvIGEgc3BlY2lmaWMgc3RyZWFtIG9uIGEgcG9ydCAoaW5wdXQgb3IKKyAqIG91dHB1dCkuCisgKgorICogXHRwYXJhbSBUIHBhcmFtIHR5cGUgQzJTZXR0aW5nLCBDMlR1bmluZyBvciBDMkluZm8KKyAqIFx0cGFyYW0gUyB3cmFwcGVkIHN0cnVjdHVyZQorICogXHRwYXJhbSBQYXJhbUluZGV4IG9wdGlvbmFsIHBhcmFtdGVyIGluZGV4IG92ZXJyaWRlLiBNdXN0IGJlIHNwZWNpZmllZCBmb3IgYmFzZS9yZXVzZWQKKyAqICAgICAgICAgc3RydWN0dXJlcy4KKyAqCisgKiBQYXJhbWV0ZXJzIHdyYXAgc3RydWN0dXJlcyBieSBwcmVwZW5kaW5nIGEgKHBhcmFtZXRlcikgaGVhZGVyLiBUaGUgZmllbGRzIG9mIHRoZSB3cmFwcGVkCisgKiBzdHJ1Y3R1cmUgY2FuIGJlIGFjY2Vzc2VkIGRpcmVjdGx5LCBhbmQgY29uc3RydWN0b3JzIGFuZCBwb3RlbnRpYWwgcHVibGljIG1ldGhvZHMgYXJlIGFsc28KKyAqIHdyYXBwZWQuCisgKgorICogVGhlcmUgYXJlIDMgZmxhdm9ycyBvZiBzdHJlYW0gcGFyYW1ldGVyczogdW5zcGVjaWZpZWQgcG9ydCwgaW5wdXQgYW5kIG91dHB1dC4gQWxsIG9mIHRoZXNlIGV4cG9zZQorICogYSBzZXRTdHJlYW0gbWV0aG9kIGFuZCBhbiBleHRyYSBpbml0aWFsIHN0cmVhbUlEIHBhcmFtZXRlciBmb3IgdGhlIGNvbnN0cnVjdG9yLiBNb3Jlb3ZlciwKKyAqIHBhcmFtZXRlcnMgd2l0aCB1bnNwZWNpZmllZCBwb3J0IGV4cG9zZSBhIHNldFBvcnQgbWV0aG9kLCBhbmQgYWRkIGFuIGFkZGl0aW9uYWwgaW5pdGlhbCBwb3J0CisgKiBwYXJhbWV0ZXIgdG8gdGhlIGNvbnN0cnVjdG9yLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBTLCBpbnQgUGFyYW1JbmRleD1TOjpDT1JFX0lOREVYLCBjbGFzcyBGbGV4PXZvaWQ+CitzdHJ1Y3QgQzJfSElERSBDMlN0cmVhbVBhcmFtIDogcHVibGljIFQsIHB1YmxpYyBTLAorICAgICAgICBwcml2YXRlIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsCisgICAgICAgICAgICAgICAgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpJU19TVFJFQU1fRkxBRyB8IFQ6OkluZGV4OjpESVJfVU5ERUZJTkVEPiB7CisgICAgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoUGFyYW1JbmRleCkKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBDMlN0cmVhbVBhcmFtPFQsIFMsIFBhcmFtSW5kZXg+IF9UeXBlOworCitwdWJsaWM6CisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuIFBvcnQvZGlyZWN0aW9uIGFuZCBzdHJlYW0tSUQgaXMgdW5kZWZpbmVkLgorICAgIGlubGluZSBDMlN0cmVhbVBhcmFtKCkgOiBUKHNpemVvZihfVHlwZSksIF9UeXBlOjpQQVJBTV9UWVBFKSB7IH0KKyAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgcG9ydC9kaXJlY3Rpb24gYW5kCisgICAgLy8vIHN0cmVhbS1JRC4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgIGlubGluZSBDMlN0cmVhbVBhcmFtKGJvb2wgX291dHB1dCwgdW5zaWduZWQgc3RyZWFtLCBjb25zdCBBcmdzKCYuLi4gYXJncykpCisgICAgICAgIDogVChzaXplb2YoX1R5cGUpLCBfb3V0cHV0ID8gb3V0cHV0OjpQQVJBTV9UWVBFIDogaW5wdXQ6OlBBUkFNX1RZUEUsIHN0cmVhbSksCisgICAgICAgICAgUyhhcmdzLi4uKSB7IH0KKyAgICAvLy8gU2V0IHBvcnQvZGlyZWN0aW9uLgorICAgIGlubGluZSB2b2lkIHNldFBvcnQoYm9vbCBvdXRwdXQpIHsgQzJQYXJhbTo6c2V0UG9ydChvdXRwdXQpOyB9CisgICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgorICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9CisKKyAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoX1R5cGUpCisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIGlucHV0IHN0cmVhbSBwYXJhbWV0ZXIuCisgICAgc3RydWN0IGlucHV0IDogcHVibGljIFQsIHB1YmxpYyBTLAorICAgICAgICAgICAgcHVibGljIF9DMlN0cnVjdENoZWNrPFMsIFBhcmFtSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIFQ6OlBBUkFNX0tJTkQgfCBUOjpJbmRleDo6SVNfU1RSRUFNX0ZMQUcgfCBUOjpUeXBlOjpESVJfSU5QVVQ+IHsKKyAgICAgICAgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoUGFyYW1JbmRleCkKKworICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gU3RyZWFtLUlEIGlzIHVuZGVmaW5lZC4KKyAgICAgICAgaW5saW5lIGlucHV0KCkgOiBUKHNpemVvZihfVHlwZSksIGlucHV0OjpQQVJBTV9UWVBFKSB7IH0KKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHN0cmVhbS1JRC4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAgICAgaW5saW5lIGlucHV0KHVuc2lnbmVkIHN0cmVhbSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICAgICAgOiBUKHNpemVvZihfVHlwZSksIGlucHV0OjpQQVJBTV9UWVBFLCBzdHJlYW0pLCBTKGFyZ3MuLi4pIHsgfQorICAgICAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCisgICAgICAgIGlubGluZSBib29sIHNldFN0cmVhbSh1bnNpZ25lZCBzdHJlYW0pIHsgcmV0dXJuIEMyUGFyYW06OnNldFN0cmVhbShzdHJlYW0pOyB9CisKKyAgICAgICAgREVGSU5FX0NBU1RfT1BFUkFUT1JTKGlucHV0KQorICAgIH07CisKKyAgICAvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGFuIG91dHB1dCBzdHJlYW0gcGFyYW1ldGVyLgorICAgIHN0cnVjdCBvdXRwdXQgOiBwdWJsaWMgVCwgcHVibGljIFMsCisgICAgICAgICAgICBwdWJsaWMgX0MyU3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpJU19TVFJFQU1fRkxBRyB8IFQ6OlR5cGU6OkRJUl9PVVRQVVQ+IHsKKyAgICAgICAgX0MyX0NPUkVfSU5ERVhfT1ZFUlJJREUoUGFyYW1JbmRleCkKKworICAgICAgICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3Rvci4gU3RyZWFtLUlEIGlzIHVuZGVmaW5lZC4KKyAgICAgICAgaW5saW5lIG91dHB1dCgpIDogVChzaXplb2YoX1R5cGUpLCBvdXRwdXQ6OlBBUkFNX1RZUEUpIHsgfQorICAgICAgICAvLy8gV3JhcHBlciBhcm91bmQgYmFzZSBzdHJ1Y3R1cmUncyBjb25zdHJ1Y3RvciB3aGlsZSBhbHNvIHNwZWNpZnlpbmcgc3RyZWFtLUlELgorICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5BcmdzPgorICAgICAgICBpbmxpbmUgb3V0cHV0KHVuc2lnbmVkIHN0cmVhbSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICAgICAgOiBUKHNpemVvZihfVHlwZSksIG91dHB1dDo6UEFSQU1fVFlQRSwgc3RyZWFtKSwgUyhhcmdzLi4uKSB7IH0KKyAgICAgICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgorICAgICAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7IHJldHVybiBDMlBhcmFtOjpzZXRTdHJlYW0oc3RyZWFtKTsgfQorCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhvdXRwdXQpCisgICAgfTsKK307CisKKy8qKgorICogU3RyZWFtLXBhcmFtZXRlciB0ZW1wbGF0ZSBmb3IgZmxleGlibGUgc3RydWN0dXJlcy4KKyAqCisgKiBCYXNlIHRlbXBsYXRlIHRvIGRlZmluZSBhIHN0cmVhbSBzZXR0aW5nL3R1bmluZyBvciBpbmZvIGJhc2VkIG9uIGEgZmxleGlibGUgc3RydWN0dXJlIGFuZAorICogYW4gb3B0aW9uYWwgUGFyYW1JbmRleC4gU3RyZWFtIHBhcmFtZXRlcnMgYXJlIHRpZWQgdG8gYSBzcGVjaWZpYyBzdHJlYW0gb24gYSBwb3J0IChpbnB1dCBvcgorICogb3V0cHV0KS4KKyAqCisgKiBcdHBhcmFtIFQgcGFyYW0gdHlwZSBDMlNldHRpbmcsIEMyVHVuaW5nIG9yIEMySW5mbworICogXHRwYXJhbSBTIHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisgKiBcdHBhcmFtIFBhcmFtSW5kZXggb3B0aW9uYWwgcGFyYW1ldGVyIGluZGV4IG92ZXJyaWRlLiBNdXN0IGJlIHNwZWNpZmllZCBmb3IgYmFzZS9yZXVzZWQKKyAqICAgICAgICAgc3RydWN0dXJlcy4KKyAqCisgKiBQYXJhbWV0ZXJzIHdyYXAgc3RydWN0dXJlcyBieSBwcmVwZW5kaW5nIGEgKHBhcmFtZXRlcikgaGVhZGVyLiBUaGUgZmllbGRzIGFuZCBtZXRob2RzIG9mIGZsZXhpYmxlCisgKiBzdHJ1Y3R1cmVzIGNhbiBiZSBhY2Nlc3NlZCB2aWEgdGhlIG0gbWVtYmVyIHZhcmlhYmxlOyBob3dldmVyLCB0aGUgY29uc3RydWN0b3JzIG9mIHRoZSBzdHJ1Y3R1cmUKKyAqIGFyZSB3cmFwcGVkIGRpcmVjdGx5LiAoVGhpcyBpcyBiZWNhdXNlIGZsZXhpYmxlIHR5cGVzIGNhbm5vdCBiZSBzdWJjbGFzc2VkLikKKyAqCisgKiBUaGVyZSBhcmUgMyBmbGF2b3JzIG9mIHN0cmVhbSBwYXJhbWV0ZXJzOiB1bnNwZWNpZmllZCBwb3J0LCBpbnB1dCBhbmQgb3V0cHV0LiBBbGwgb2YgdGhlc2UgZXhwb3NlCisgKiBhIHNldFN0cmVhbSBtZXRob2QgYW5kIGFuIGV4dHJhIGluaXRpYWwgc3RyZWFtSUQgcGFyYW1ldGVyIGZvciB0aGUgY29uc3RydWN0b3IuIE1vcmVvdmVyLAorICogcGFyYW1ldGVycyB3aXRoIHVuc3BlY2lmaWVkIHBvcnQgZXhwb3NlIGEgc2V0UG9ydCBtZXRob2QsIGFuZCBhZGQgYW4gYWRkaXRpb25hbCBpbml0aWFsIHBvcnQKKyAqIHBhcmFtZXRlciB0byB0aGUgY29uc3RydWN0b3IuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFMsIGludCBQYXJhbUluZGV4Pgorc3RydWN0IEMyX0hJREUgQzJTdHJlYW1QYXJhbTxULCBTLCBQYXJhbUluZGV4LCBJRl9GTEVYSUJMRShTKT4KKyAgICA6IHB1YmxpYyBULAorICAgICAgcHVibGljIF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LAorICAgICAgICAgICAgICBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OklTX1NUUkVBTV9GTEFHIHwgVDo6SW5kZXg6OkRJUl9VTkRFRklORUQ+IHsKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBDMlN0cmVhbVBhcmFtPFQsIFMsIFBhcmFtSW5kZXg+IF9UeXBlOworICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLiBQb3J0L2RpcmVjdGlvbiBhbmQgc3RyZWFtLUlEIGlzIHVuZGVmaW5lZC4KKyAgICBpbmxpbmUgQzJTdHJlYW1QYXJhbShzaXplX3QgZmxleENvdW50KSA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIF9UeXBlOjpQQVJBTV9UWVBFLCAwdSkgeyB9CisgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHBvcnQvZGlyZWN0aW9uIGFuZAorICAgIC8vLyBzdHJlYW0tSUQuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICBpbmxpbmUgQzJTdHJlYW1QYXJhbShzaXplX3QgZmxleENvdW50LCBib29sIF9vdXRwdXQsIHVuc2lnbmVkIHN0cmVhbSwgY29uc3QgQXJncygmLi4uIGFyZ3MpKQorICAgICAgICA6IFQoX1R5cGU6OkNhbGNTaXplKGZsZXhDb3VudCksIF9vdXRwdXQgPyBvdXRwdXQ6OlBBUkFNX1RZUEUgOiBpbnB1dDo6UEFSQU1fVFlQRSwgc3RyZWFtKSwKKyAgICAgICAgICBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKK3B1YmxpYzoKKyAgICBTIG07IC8vLzwgd3JhcHBlZCBmbGV4aWJsZSBzdHJ1Y3R1cmUKKworICAgIC8vLyBTZXQgcG9ydC9kaXJlY3Rpb24uCisgICAgaW5saW5lIHZvaWQgc2V0UG9ydChib29sIG91dHB1dCkgeyBDMlBhcmFtOjpzZXRQb3J0KG91dHB1dCk7IH0KKyAgICAvLy8gU2V0IHN0cmVhbS1pZC4gXHJldHZhbCB0cnVlIGlmIHRoZSBzdHJlYW0taWQgd2FzIHN1Y2Nlc3NmdWxseSBzZXQuCisgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeyByZXR1cm4gQzJQYXJhbTo6c2V0U3RyZWFtKHN0cmVhbSk7IH0KKworICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKF9UeXBlLCBTKQorICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhfVHlwZSkKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gaW5wdXQgc3RyZWFtIHBhcmFtZXRlci4KKyAgICBzdHJ1Y3QgaW5wdXQgOiBwdWJsaWMgVCwKKyAgICAgICAgICAgIHB1YmxpYyBfQzJGbGV4U3RydWN0Q2hlY2s8UywgUGFyYW1JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgVDo6UEFSQU1fS0lORCB8IFQ6OkluZGV4OjpJU19TVFJFQU1fRkxBRyB8IFQ6OlR5cGU6OkRJUl9JTlBVVD4geworICAgIHByaXZhdGU6CisgICAgICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLiBTdHJlYW0tSUQgaXMgdW5kZWZpbmVkLgorICAgICAgICBpbmxpbmUgaW5wdXQoc2l6ZV90IGZsZXhDb3VudCkgOiBUKF9UeXBlOjpDYWxjU2l6ZShmbGV4Q291bnQpLCBpbnB1dDo6UEFSQU1fVFlQRSkgeyB9CisgICAgICAgIC8vLyBXcmFwcGVyIGFyb3VuZCBiYXNlIHN0cnVjdHVyZSdzIGNvbnN0cnVjdG9yIHdoaWxlIGFsc28gc3BlY2lmeWluZyBzdHJlYW0tSUQuCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLkFyZ3M+CisgICAgICAgIGlubGluZSBpbnB1dChzaXplX3QgZmxleENvdW50LCB1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgICAgIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgaW5wdXQ6OlBBUkFNX1RZUEUsIHN0cmVhbSksIG0oZmxleENvdW50LCBhcmdzLi4uKSB7IH0KKworICAgIHB1YmxpYzoKKyAgICAgICAgUyBtOyAvLy88IHdyYXBwZWQgZmxleGlibGUgc3RydWN0dXJlCisKKyAgICAgICAgLy8vIFNldCBzdHJlYW0taWQuIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgc3RyZWFtLWlkIHdhcyBzdWNjZXNzZnVsbHkgc2V0LgorICAgICAgICBpbmxpbmUgYm9vbCBzZXRTdHJlYW0odW5zaWduZWQgc3RyZWFtKSB7IHJldHVybiBDMlBhcmFtOjpzZXRTdHJlYW0oc3RyZWFtKTsgfQorCisgICAgICAgIERFRklORV9GTEVYSUJMRV9NRVRIT0RTKGlucHV0LCBTKQorICAgICAgICBERUZJTkVfQ0FTVF9PUEVSQVRPUlMoaW5wdXQpCisgICAgfTsKKworICAgIC8vLyBTcGVjaWFsaXphdGlvbiBmb3IgYW4gb3V0cHV0IHN0cmVhbSBwYXJhbWV0ZXIuCisgICAgc3RydWN0IG91dHB1dCA6IHB1YmxpYyBULAorICAgICAgICAgICAgcHVibGljIF9DMkZsZXhTdHJ1Y3RDaGVjazxTLCBQYXJhbUluZGV4LAorICAgICAgICAgICAgICAgICAgICBUOjpQQVJBTV9LSU5EIHwgVDo6SW5kZXg6OklTX1NUUkVBTV9GTEFHIHwgVDo6VHlwZTo6RElSX09VVFBVVD4geworICAgIHByaXZhdGU6CisgICAgICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLiBTdHJlYW0tSUQgaXMgdW5kZWZpbmVkLgorICAgICAgICBpbmxpbmUgb3V0cHV0KHNpemVfdCBmbGV4Q291bnQpIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgb3V0cHV0OjpQQVJBTV9UWVBFKSB7IH0KKyAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGJhc2Ugc3RydWN0dXJlJ3MgY29uc3RydWN0b3Igd2hpbGUgYWxzbyBzcGVjaWZ5aW5nIHN0cmVhbS1JRC4KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uQXJncz4KKyAgICAgICAgaW5saW5lIG91dHB1dChzaXplX3QgZmxleENvdW50LCB1bnNpZ25lZCBzdHJlYW0sIGNvbnN0IEFyZ3MoJi4uLiBhcmdzKSkKKyAgICAgICAgICAgIDogVChfVHlwZTo6Q2FsY1NpemUoZmxleENvdW50KSwgb3V0cHV0OjpQQVJBTV9UWVBFLCBzdHJlYW0pLCBtKGZsZXhDb3VudCwgYXJncy4uLikgeyB9CisKKyAgICBwdWJsaWM6CisgICAgICAgIFMgbTsgLy8vPCB3cmFwcGVkIGZsZXhpYmxlIHN0cnVjdHVyZQorCisgICAgICAgIC8vLyBTZXQgc3RyZWFtLWlkLiBccmV0dmFsIHRydWUgaWYgdGhlIHN0cmVhbS1pZCB3YXMgc3VjY2Vzc2Z1bGx5IHNldC4KKyAgICAgICAgaW5saW5lIGJvb2wgc2V0U3RyZWFtKHVuc2lnbmVkIHN0cmVhbSkgeyByZXR1cm4gQzJQYXJhbTo6c2V0U3RyZWFtKHN0cmVhbSk7IH0KKworICAgICAgICBERUZJTkVfRkxFWElCTEVfTUVUSE9EUyhvdXRwdXQsIFMpCisgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUyhvdXRwdXQpCisgICAgfTsKK307CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PSBTSU1QTEUgVkFMVUUgUEFSQU1FVEVSUyA9PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworLyoqCisgKiBcaW5ncm91cCBpbnRlcm5hbAorICogQSBzdHJ1Y3R1cmUgdGVtcGxhdGUgZW5jYXBzdWxhdGluZyBhIHNpbmdsZSBlbGVtZW50IHdpdGggZGVmYXVsdCBjb25zdHJ1Y3RvcnMgYW5kIG5vIGNvcmUtaW5kZXguCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJTaW1wbGVWYWx1ZVN0cnVjdCB7CisgICAgVCB2YWx1ZTsgLy8vPCBzaW1wbGUgdmFsdWUgb2YgdGhlIHN0cnVjdHVyZQorICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3QoKSA9IGRlZmF1bHQ7CisgICAgLy8gQ29uc3RydWN0b3Igd2l0aCBhbiBpbml0aWFsIHZhbHVlLgorICAgIGlubGluZSBDMlNpbXBsZVZhbHVlU3RydWN0KFQgdmFsdWUpIDogdmFsdWUodmFsdWUpIHt9CisgICAgREVGSU5FX0JBU0VfQzJTVFJVQ1QoU2ltcGxlVmFsdWUpCit9OworCisvLyBUT0RPOiBtb3ZlIHRoaXMgYW5kIG5leHQgdG8gc29tZSBnZW5lcmljIHBsYWNlCisvKioKKyAqIEludGVyZmFjZSB0byBhIGJsb2NrIG9mIChtYXBwZWQpIG1lbW9yeSBjb250YWluaW5nIGFuIGFycmF5IG9mIHNvbWUgdHlwZSAoVCkuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJNZW1vcnlCbG9jayB7CisgICAgLy8vIFxyZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBibG9jay4KKyAgICB2aXJ0dWFsIHNpemVfdCBzaXplKCkgY29uc3QgPSAwOworICAgIC8vLyBccmV0dXJucyBhIGNvbnN0IHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoaXMgYmxvY2suIENhcmUgbXVzdCBiZSB0YWtlbiB0byBub3QgcmVhZCBvdXRzaWRlCisgICAgLy8vIHRoZSBibG9jay4KKyAgICB2aXJ0dWFsIGNvbnN0IFQgKmRhdGEoKSBjb25zdCA9IDA7IC8vIFRPRE86IHNob3VsZCB0aGlzIGJlIGZyaWVuZCBhY2Nlc3Mgb25seSBpbiBzb21lIEMyTWVtb3J5IG1vZHVsZT8KKyAgICAvLy8gXHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB0aGlzIGJsb2NrLiBDYXJlIG11c3QgYmUgdGFrZW4gdG8gbm90IHJlYWQgb3Igd3JpdGUKKyAgICAvLy8gb3V0c2lkZSB0aGUgYmxvY2suCisgICAgaW5saW5lIFQgKmRhdGEoKSB7IHJldHVybiBjb25zdF9jYXN0PFQqPihjb25zdF9jYXN0PGNvbnN0IEMyTWVtb3J5QmxvY2sqPih0aGlzKS0+ZGF0YSgpKTsgfQorCitwcm90ZWN0ZWQ6CisgICAgLy8gVE9ETzogZm9yIG5vdyBpdCBzaG91bGQgbmV2ZXIgYmUgZGVsZXRlZCBhcyBDMk1lbW9yeUJsb2NrCisgICAgdmlydHVhbCB+QzJNZW1vcnlCbG9jaygpID0gZGVmYXVsdDsKK307CisKKy8qKgorICogSW50ZXJmYWNlIHRvIGEgYmxvY2sgb2YgbWVtb3J5IGNvbnRhaW5pbmcgYSBjb25zdGFudCAoY29uc3RleHByKSBhcnJheSBvZiBzb21lIHR5cGUgKFQpLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyQ29uc3RNZW1vcnlCbG9jayA6IHB1YmxpYyBDMk1lbW9yeUJsb2NrPFQ+IHsKKyAgICB2aXJ0dWFsIGNvbnN0IFQgKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gX21EYXRhOyB9CisgICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9tU2l6ZTsgfQorCisgICAgLy8vIENvbnN0cnVjdG9yLgorICAgIHRlbXBsYXRlPHVuc2lnbmVkIE4+CisgICAgaW5saW5lIGNvbnN0ZXhwciBDMkNvbnN0TWVtb3J5QmxvY2soY29uc3QgVCgmaW5pdClbTl0pIDogX21EYXRhKGluaXQpLCBfbVNpemUoTikge30KKworcHJpdmF0ZToKKyAgICBjb25zdCBUICpfbURhdGE7CisgICAgY29uc3Qgc2l6ZV90IF9tU2l6ZTsKK307CisKKy8vLyBcYWRkdG9ncm91cCBpbnRlcm5hbAorLy8vIEB7CisKKy8vLyBIZWxwZXIgY2xhc3MgdG8gaW5pdGlhbGl6ZSBmbGV4aWJsZSBhcnJheXMgd2l0aCB2YXJpb3VzIGluaXRhbGl6ZXJzLgorc3RydWN0IF9DMlZhbHVlQXJyYXlIZWxwZXIgeworICAgIC8vIGNoYXJbXS1zIGFyZSB1c2VkIGFzIG51bGwgdGVybWluYXRlZCBzdHJpbmdzLCBzbyB0aGUgbGFzdCBlbGVtZW50IGlzIG5ldmVyIGluaXRlZC4KKworICAgIC8vLyBJbml0aWFsaXplIGEgZmxleGlibGUgYXJyYXkgdXNpbmcgYSBjb25zdGV4cHIgbWVtb3J5IGJsb2NrLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIHZvaWQgaW5pdChUKCZhcnJheSlbXSwgc2l6ZV90IGFycmF5TGVuLCBjb25zdCBDMk1lbW9yeUJsb2NrPFQ+ICZibG9jaykgeworICAgICAgICAvLyByZXNlcnZlIGxhc3QgZWxlbWVudCBmb3IgdGVybWluYWwgMCBmb3Igc3RyaW5ncworICAgICAgICBpZiAoYXJyYXlMZW4gJiYgc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSkgeworICAgICAgICAgICAgLS1hcnJheUxlbjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmxvY2suZGF0YSgpKSB7CisgICAgICAgICAgICBtZW1jcHkoYXJyYXksIGJsb2NrLmRhdGEoKSwgc3RkOjptaW4oYXJyYXlMZW4sIGJsb2NrLnNpemUoKSkgKiBzaXplb2YoVCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8vIEluaXRpYWxpemUgYSBmbGV4aWJsZSBhcnJheSB1c2luZyBhbiBpbml0aWFsaXplciBsaXN0LgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIHZvaWQgaW5pdChUKCZhcnJheSlbXSwgc2l6ZV90IGFycmF5TGVuLCBjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gJmluaXQpIHsKKyAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgLy8gcmVzZXJ2ZSBsYXN0IGVsZW1lbnQgZm9yIHRlcm1pbmFsIDAgZm9yIHN0cmluZ3MKKyAgICAgICAgaWYgKGFycmF5TGVuICYmIHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWUpIHsKKyAgICAgICAgICAgIC0tYXJyYXlMZW47CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBUICZpdGVtIDogaW5pdCkgeworICAgICAgICAgICAgaWYgKGl4ID09IGFycmF5TGVuKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhcnJheVtpeCsrXSA9IGl0ZW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLy8gSW5pdGlhbGl6ZSBhIGZsZXhpYmxlIGFycmF5IHVzaW5nIGEgdmVjdG9yLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIHZvaWQgaW5pdChUKCZhcnJheSlbXSwgc2l6ZV90IGFycmF5TGVuLCBjb25zdCBzdGQ6OnZlY3RvcjxUPiAmaW5pdCkgeworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICAvLyByZXNlcnZlIGxhc3QgZWxlbWVudCBmb3IgdGVybWluYWwgMCBmb3Igc3RyaW5ncworICAgICAgICBpZiAoYXJyYXlMZW4gJiYgc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSkgeworICAgICAgICAgICAgLS1hcnJheUxlbjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IFQgJml0ZW0gOiBpbml0KSB7CisgICAgICAgICAgICBpZiAoaXggPT0gYXJyYXlMZW4pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFycmF5W2l4KytdID0gaXRlbTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vLyBJbml0aWFsaXplIGEgZmxleGlibGUgYXJyYXkgdXNpbmcgYW5vdGhlciBmbGV4aWJsZSBhcnJheS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB1bnNpZ25lZCBOPgorICAgIHN0YXRpYyB2b2lkIGluaXQoVCgmYXJyYXkpW10sIHNpemVfdCBhcnJheUxlbiwgY29uc3QgVCgmc3RyKVtOXSkgeworICAgICAgICAvLyByZXNlcnZlIGxhc3QgZWxlbWVudCBmb3IgdGVybWluYWwgMCBmb3Igc3RyaW5ncworICAgICAgICBpZiAoYXJyYXlMZW4gJiYgc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSkgeworICAgICAgICAgICAgLS1hcnJheUxlbjsKKyAgICAgICAgfQorICAgICAgICBpZiAoYXJyYXlMZW4pIHsKKyAgICAgICAgICAgIG1lbWNweShhcnJheSwgc3RyLCBzdGQ6Om1pbihhcnJheUxlbiwgKHNpemVfdClOKSAqIHNpemVvZihUKSk7CisgICAgICAgIH0KKyAgICB9Cit9OworCisvKioKKyAqIFNwZWNpYWxpemF0aW9uIGZvciBhIGZsZXhpYmxlIGJsb2IgYW5kIHN0cmluZyBhcnJheXMuIEEgc3RydWN0dXJlIHRlbXBsYXRlIGVuY2Fwc3VsYXRpbmcgYSBzaW5nbGUKKyAqIGZsZXhpYmxlIGFycmF5IG1lbWJlciB3aXRoIGRlZmF1bHQgZmxleGlibGUgY29uc3RydWN0b3JzIGFuZCBubyBjb3JlLWluZGV4LiBUaGlzIHR5cGUgY2Fubm90IGJlCisgKiBjb25zdHJ1Y3RlZCBvbiBpdHMgb3duIGFzIGl0J3Mgc2l6ZSBpcyAwLgorICoKKyAqIFxpbnRlcm5hbCBUaGlzIGlzIGRpZmZlcmVudCBmcm9tIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8VFtdPiBzaW1wbHkgYmVjYXVzZSBpdHMgbWVtYmVyIGhhcyB0aGUgbmFtZQorICogYXMgdmFsdWUgdG8gcmVmbGVjdCB0aGlzIGlzIGEgc2luZ2xlIHZhbHVlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8VFtdPiB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlIHx8IHN0ZDo6aXNfc2FtZTxULCB1aW50OF90Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiQzJTaW1wbGVWYWx1ZVN0cnVjdDxUW10+IGlzIG9ubHkgZm9yIEJMT0Igb3IgU1RSSU5HIik7CisgICAgVCB2YWx1ZVtdOworCisgICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3QoKSA9IGRlZmF1bHQ7CisgICAgREVGSU5FX0JBU0VfQzJTVFJVQ1QoU2ltcGxlVmFsdWUpCisgICAgRkxFWChDMlNpbXBsZVZhbHVlU3RydWN0LCB2YWx1ZSkKKworcHJpdmF0ZToKKyAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBDMk1lbW9yeUJsb2NrPFQ+ICZibG9jaykgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlLCBmbGV4Q291bnQsIGJsb2NrKTsKKyAgICB9CisKKyAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gJmluaXQpIHsKKyAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdCh2YWx1ZSwgZmxleENvdW50LCBpbml0KTsKKyAgICB9CisKKyAgICBpbmxpbmUgQzJTaW1wbGVWYWx1ZVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBzdGQ6OnZlY3RvcjxUPiAmaW5pdCkgeworICAgICAgICBfQzJWYWx1ZUFycmF5SGVscGVyOjppbml0KHZhbHVlLCBmbGV4Q291bnQsIGluaXQpOworICAgIH0KKworICAgIHRlbXBsYXRlPHVuc2lnbmVkIE4+CisgICAgaW5saW5lIEMyU2ltcGxlVmFsdWVTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgVCgmaW5pdClbTl0pIHsKKyAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdCh2YWx1ZSwgZmxleENvdW50LCBpbml0KTsKKyAgICB9Cit9OworCisvLy8gQH0KKworLyoqCisgKiBBIHN0cnVjdHVyZSB0ZW1wbGF0ZSBlbmNhcHN1bGF0aW5nIGEgc2luZ2xlIGZsZXhpYmxlIGFycmF5IGVsZW1lbnQgb2YgYSBzcGVjaWZpYyB0eXBlIChUKSB3aXRoCisgKiBkZWZhdWx0IGNvbnN0cnVjdG9ycyBhbmQgbm8gY29yZS1pbmRleC4gVGhpcyB0eXBlIGNhbm5vdCBiZSBjb25zdHJ1Y3RlZCBvbiBpdHMgb3duIGFzIGl0J3Mgc2l6ZQorICogaXMgMC4gSW5zdGVhZCwgaXQgaXMgbWVhbnQgdG8gYmUgdXNlZCBhcyBhIHBhcmFtZXRlciwgZS5nLgorICoKKyAqICAgdHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMySW5mbywgQzJTaW1wbGVBcnJheVN0cnVjdDxDMk15RmFuY3lTdHJ1Y3Q+LAorICogICAgICAgICAgIGtQYXJhbUluZGV4TXlGYW5jeUFycmF5U3RyZWFtUGFyYW0+IEMyTXlGYW5jeUFycmF5U3RyZWFtSW5mbzsKKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMlNpbXBsZUFycmF5U3RydWN0IHsKKyAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3NhbWU8VCwgY2hhcj46OnZhbHVlICYmICFzdGQ6OmlzX3NhbWU8VCwgdWludDhfdD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgInVzZSBDMlNpbXBsZVZhbHVlU3RydWN0PFRbXT4gaXMgZm9yIEJMT0Igb3IgU1RSSU5HIik7CisKKyAgICBUIHZhbHVlc1tdOyAvLy88IGFycmF5IG1lbWJlcgorICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yCisgICAgaW5saW5lIEMyU2ltcGxlQXJyYXlTdHJ1Y3QoKSA9IGRlZmF1bHQ7CisgICAgREVGSU5FX0JBU0VfRkxFWF9DMlNUUlVDVChTaW1wbGVBcnJheSwgdmFsdWVzKQorICAgIC8vRkxFWChDMlNpbXBsZUFycmF5U3RydWN0LCB2YWx1ZXMpCisKK3ByaXZhdGU6CisgICAgLy8vIENvbnN0cnVjdCBmcm9tIGEgQzJNZW1vcnlCbG9jay4KKyAgICAvLy8gVXNlZCBvbmx5IGJ5IHRoZSBmbGV4aWJsZSBwYXJhbWV0ZXIgYWxsb2NhdG9ycyAoQWxsb2NVbmlxdWUgJiBBbGxvY1NoYXJlZCkuCisgICAgaW5saW5lIEMyU2ltcGxlQXJyYXlTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgQzJNZW1vcnlCbG9jazxUPiAmYmxvY2spIHsKKyAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdCh2YWx1ZXMsIGZsZXhDb3VudCwgYmxvY2spOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhbiBpbml0aWFsaXplciBsaXN0LgorICAgIC8vLyBVc2VkIG9ubHkgYnkgdGhlIGZsZXhpYmxlIHBhcmFtZXRlciBhbGxvY2F0b3JzIChBbGxvY1VuaXF1ZSAmIEFsbG9jU2hhcmVkKS4KKyAgICBpbmxpbmUgQzJTaW1wbGVBcnJheVN0cnVjdChzaXplX3QgZmxleENvdW50LCBjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gJmluaXQpIHsKKyAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdCh2YWx1ZXMsIGZsZXhDb3VudCwgaW5pdCk7CisgICAgfQorCisgICAgLy8vIENvbnN0cnVjdCBmcm9tIGFuIHZlY3Rvci4KKyAgICAvLy8gVXNlZCBvbmx5IGJ5IHRoZSBmbGV4aWJsZSBwYXJhbWV0ZXIgYWxsb2NhdG9ycyAoQWxsb2NVbmlxdWUgJiBBbGxvY1NoYXJlZCkuCisgICAgaW5saW5lIEMyU2ltcGxlQXJyYXlTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmluaXQpIHsKKyAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdCh2YWx1ZXMsIGZsZXhDb3VudCwgaW5pdCk7CisgICAgfQorCisgICAgLy8vIENvbnN0cnVjdCBmcm9tIGFub3RoZXIgZmxleGlibGUgYXJyYXkuCisgICAgLy8vIFVzZWQgb25seSBieSB0aGUgZmxleGlibGUgcGFyYW1ldGVyIGFsbG9jYXRvcnMgKEFsbG9jVW5pcXVlICYgQWxsb2NTaGFyZWQpLgorICAgIHRlbXBsYXRlPHVuc2lnbmVkIE4+CisgICAgaW5saW5lIEMyU2ltcGxlQXJyYXlTdHJ1Y3Qoc2l6ZV90IGZsZXhDb3VudCwgY29uc3QgVCgmaW5pdClbTl0pIHsKKyAgICAgICAgX0MyVmFsdWVBcnJheUhlbHBlcjo6aW5pdCh2YWx1ZXMsIGZsZXhDb3VudCwgaW5pdCk7CisgICAgfQorfTsKKworLyoqCisgKiBcYWRkdG9ncm91cCBzaW1wbGV2YWx1ZSBTaW1wbGUgdmFsdWUgYW5kIGFycmF5IHN0cnVjdHVyZXMuCisgKiBAeworICoKKyAqIFNpbXBsZSB2YWx1ZSBzdHJ1Y3R1cmVzLgorICoKKyAqIFN0cnVjdHVyZXMgY29udGFpbmluZyBhIHNpbmdsZSBzaW1wbGUgdmFsdWUuIFRoZXNlIGNhbiBiZSByZXVzZWQgdG8gZWFzaWx5IGRlZmluZSBzaW1wbGUKKyAqIHBhcmFtZXRlcnMgb2YgdmFyaW91cyB0eXBlczoKKyAqCisgKiAgIHR5cGVkZWYgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMySW50MzJWYWx1ZSwga1BhcmFtSW5kZXhNeUludGVnZXJQb3J0UGFyYW0+CisgKiAgICAgICAgICAgQzJNeUludGVnZXJQb3J0UGFyYW1UdW5pbmc7CisgKgorICogVGhleSBjb250YWluIGEgc2luZ2xlIG1lbWJlciAodmFsdWUgb3IgdmFsdWVzKSB0aGF0IGlzIGRlc2NyaWJlZCBhcyAidmFsdWUiIG9yICJ2YWx1ZXMiLgorICoKKyAqIFRoZXNlIHN0cnVjdHVyZXMgZG9uJ3QgZGVmaW5lIGEgY29yZSBpbmRleCwgYW5kIGFzIHN1Y2gsIHRoZXkgY2Fubm90IGJlIHVzZWQgaW4gc3RydWN0dXJlCisgKiBkZWNsYXJhdGlvbnMuIFVzZSB0eXBlW10gaW5zdGVhZCwgc3VjaCBhcyBpbnQzMl90IGZpZWxkW10uCisgKi8KKy8vLyBBIDMyLWJpdCBzaWduZWQgaW50ZWdlciBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8aW50MzJfdD4gQzJJbnQzMlZhbHVlOworLy8vIEEgMzItYml0IHNpZ25lZCBpbnRlZ2VyIGFycmF5IHBhcmFtZXRlciBpbiB2YWx1ZXMsIGRlc2NyaWJlZCBhcyAidmFsdWVzIgordHlwZWRlZiBDMlNpbXBsZUFycmF5U3RydWN0PGludDMyX3Q+IEMySW50MzJBcnJheTsKKy8vLyBBIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHBhcmFtZXRlciBpbiB2YWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDx1aW50MzJfdD4gQzJVaW50MzJWYWx1ZTsKKy8vLyBBIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGFycmF5IHBhcmFtZXRlciBpbiB2YWx1ZXMsIGRlc2NyaWJlZCBhcyAidmFsdWVzIgordHlwZWRlZiBDMlNpbXBsZUFycmF5U3RydWN0PHVpbnQzMl90PiBDMlVpbnQzMkFycmF5OworLy8vIEEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIHBhcmFtZXRlciBpbiB2YWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDxpbnQ2NF90PiBDMkludDY0VmFsdWU7CisvLy8gQSA2NC1iaXQgc2lnbmVkIGludGVnZXIgYXJyYXkgcGFyYW1ldGVyIGluIHZhbHVlcywgZGVzY3JpYmVkIGFzICJ2YWx1ZXMiCit0eXBlZGVmIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8aW50NjRfdD4gQzJJbnQ2NEFycmF5OworLy8vIEEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgcGFyYW1ldGVyIGluIHZhbHVlLCBkZXNjcmliZWQgYXMgInZhbHVlIgordHlwZWRlZiBDMlNpbXBsZVZhbHVlU3RydWN0PHVpbnQ2NF90PiBDMlVpbnQ2NFZhbHVlOworLy8vIEEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgYXJyYXkgcGFyYW1ldGVyIGluIHZhbHVlcywgZGVzY3JpYmVkIGFzICJ2YWx1ZXMiCit0eXBlZGVmIEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8dWludDY0X3Q+IEMyVWludDY0QXJyYXk7CisvLy8gQSBmbG9hdCBwYXJhbWV0ZXIgaW4gdmFsdWUsIGRlc2NyaWJlZCBhcyAidmFsdWUiCit0eXBlZGVmIEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8ZmxvYXQ+IEMyRmxvYXRWYWx1ZTsKKy8vLyBBIGZsb2F0IGFycmF5IHBhcmFtZXRlciBpbiB2YWx1ZXMsIGRlc2NyaWJlZCBhcyAidmFsdWVzIgordHlwZWRlZiBDMlNpbXBsZUFycmF5U3RydWN0PGZsb2F0PiBDMkZsb2F0QXJyYXk7CisvLy8gQSBibG9iIGZsZXhpYmxlIHBhcmFtZXRlciBpbiB2YWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDx1aW50OF90W10+IEMyQmxvYlZhbHVlOworLy8vIEEgc3RyaW5nIGZsZXhpYmxlIHBhcmFtZXRlciBpbiB2YWx1ZSwgZGVzY3JpYmVkIGFzICJ2YWx1ZSIKK3R5cGVkZWYgQzJTaW1wbGVWYWx1ZVN0cnVjdDxjaGFyW10+IEMyU3RyaW5nVmFsdWU7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJTaW1wbGVWYWx1ZVN0cnVjdDxUPjo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiB7IERFU0NSSUJFX0MyRklFTEQodmFsdWUsICJ2YWx1ZSIpIH07Cit9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyU2ltcGxlVmFsdWVTdHJ1Y3Q8VFtdPjo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiB7IERFU0NSSUJFX0MyRklFTEQodmFsdWUsICJ2YWx1ZSIpIH07Cit9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyU2ltcGxlQXJyYXlTdHJ1Y3Q8VD46OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4geyBERVNDUklCRV9DMkZJRUxEKHZhbHVlcywgInZhbHVlcyIpIH07Cit9CisKKy8vLyBAfQorCisvLy8gQH0KKworI2VuZGlmICAvLyBDMlBBUkFNX0RFRl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9DMldvcmsuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJXb3JrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjkyM2YzZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvQzJXb3JrLmgKQEAgLTAsMCArMSwyMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyV09SS19IXworCisjZGVmaW5lIEMyV09SS19IXworCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRib29sLmg+CisKKy8vLyBcZGVmZ3JvdXAgd29yayBXb3JrIGFuZCBkYXRhIHByb2Nlc3NpbmcKKy8vLyBAeworCisvKioKKyAqIEluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhlIHJlYXNvbiBhIHBhcmFtZXRlciBzZXR0aW5ncyBtYXkgZmFpbCwgb3IKKyAqIG1heSBiZSBvdmVycmlkZW4uCisgKi8KK3N0cnVjdCBDMlNldHRpbmdSZXN1bHQgeworICAgIGVudW0gRmFpbHVyZSA6IHVpbnQzMl90IHsKKyAgICAgICAgLyogcGFyYW1ldGVyIGZhaWx1cmVzIGJlbG93ICovCisgICAgICAgIEJBRF9UWVBFLCAgIC8vLzwgcGFyYW1ldGVyIGlzIG5vdCBzdXBwb3J0ZWQKKyAgICAgICAgQkFEX1BPUlQsICAgLy8vPCBwYXJhbWV0ZXIgaXMgbm90IHN1cHBvcnRlZCBvbiB0aGUgc3BlY2lmaWMgcG9ydAorICAgICAgICBCQURfSU5ERVgsICAvLy88IHBhcmFtZXRlciBpcyBub3Qgc3VwcG9ydGVkIG9uIHRoZSBzcGVjaWZpYyBzdHJlYW0KKyAgICAgICAgUkVBRF9PTkxZLCAgLy8vPCBwYXJhbWV0ZXIgaXMgcmVhZC1vbmx5IGFuZCBjYW5ub3QgYmUgc2V0CisgICAgICAgIE1JU01BVENILCAgIC8vLzwgcGFyYW1ldGVyIG1pc21hdGNoZXMgaW5wdXQgZGF0YQorCisgICAgICAgIC8qIGZpZWxkIGZhaWx1cmVzIGJlbG93ICovCisgICAgICAgIEJBRF9WQUxVRSwgIC8vLzwgc3RyaWN0IHBhcmFtZXRlciBkb2VzIG5vdCBhY2NlcHQgdmFsdWUgZm9yIHRoZSBmaWVsZCBhdCBhbGwKKyAgICAgICAgQ09ORkxJQ1QsICAgLy8vPCBzdHJpY3QgcGFyYW1ldGVyIGZpZWxkIHZhbHVlIGlzIGluIGNvbmZsaWN0IHdpdGggYW4vb3RoZXIgc2V0dGluZyhzKQorCisgICAgICAgIC8vLyBwYXJhbWV0ZXIgZmllbGQgaXMgb3V0IG9mIHJhbmdlIGR1ZSB0byBvdGhlciBzZXR0aW5ncyAodGhpcyBmYWlsdXJlIG1vZGUKKyAgICAgICAgLy8vIGNhbiBvbmx5IGJlIHVzZWQgZm9yIHN0cmljdCBjYWxjdWxhdGVkIHBhcmFtZXRlcnMpCisgICAgICAgIFVOU1VQUE9SVEVELAorCisgICAgICAgIC8vLyBmaWVsZCBkb2VzIG5vdCBhY2Nlc3MgdGhlIHJlcXVlc3RlZCBwYXJhbWV0ZXIgdmFsdWUgYXQgYWxsLiBJdCBoYXMgYmVlbiBjb3JyZWN0ZWQgdG8KKyAgICAgICAgLy8vIHRoZSBjbG9zZXN0IHN1cHBvcnRlZCB2YWx1ZS4gVGhpcyBmYWlsdXJlIG1vZGUgaXMgcHJvdmlkZWQgdG8gZ2l2ZSBndWlkYW5jZSBhcyB0byB3aGF0CisgICAgICAgIC8vLyBhcmUgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGZvciB0aGlzIGZpZWxkICh3aGljaCBtYXkgYmUgYSBzdWJzZXQgb2YgdGhlIGF0LWFsbC0KKyAgICAgICAgLy8vIHBvdGVudGlhbCB2YWx1ZXMpCisgICAgICAgIElORk9fQkFEX1ZBTFVFLAorCisgICAgICAgIC8vLyByZXF1ZXN0ZWQgcGFyYW1ldGVyIHZhbHVlIGlzIGluIGNvbmZsaWN0IHdpdGggYW4vb3RoZXIgc2V0dGluZyhzKQorICAgICAgICAvLy8gYW5kIGhhcyBiZWVuIGNvcnJlY3RlZCB0byB0aGUgY2xvc2VzdCBzdXBwb3J0ZWQgdmFsdWUuIFRoaXMgZmFpbHVyZQorICAgICAgICAvLy8gbW9kZSBpcyBnaXZlbiB0byBwcm92aWRlIGd1aWRhbmNlIGFzIHRvIHdoYXQgYXJlIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBhcyB3ZWxsCisgICAgICAgIC8vLyBhcyB0byBvcHRpb25hbGx5IHByb3ZpZGUgc3VnZ2VzdGlvbiB0byB0aGUgY2xpZW50IGFzIHRvIGhvdyB0byBlbmFibGUgdGhlIHJlcXVlc3RlZAorICAgICAgICAvLy8gcGFyYW1ldGVyIHZhbHVlLgorICAgICAgICBJTkZPX0NPTkZMSUNULAorICAgIH07CisKKyAgICBGYWlsdXJlIGZhaWx1cmU7ICAgIC8vLzwgZmFpbHVyZSBjb2RlCisKKyAgICAvLy8gRmFpbGluZyAob3IgY29ycmVjdGVkKSBmaWVsZCBvciBwYXJhbWV0ZXJhbmQgb3B0aW9uYWxseSwgY3VycmVudGx5IHN1cHBvcnRlZCB2YWx1ZXMgZm9yIHRoZQorICAgIC8vLyBmaWVsZC4gVmFsdWVzIG11c3Qgb25seSBiZSBzZXQgZm9yIGZpZWxkIGZhaWx1cmVzIG90aGVyIHRoYW4gQkFEX1ZBTFVFLCBhbmQgb25seSBpZiB0aGV5IGFyZQorICAgIC8vLyBkaWZmZXJlbnQgZnJvbSB0aGUgZ2xvYmFsbHkgc3VwcG9ydGVkIHZhbHVlcyAoZS5nLiBkdWUgdG8gcmVzdHJpY3Rpb25zIGJ5IGFub3RoZXIgcGFyYW0gb3IKKyAgICAvLy8gaW5wdXQgZGF0YSkuCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzIGZpZWxkOworCisgICAgLy8vIENvbmZsaWN0aW5nIHBhcmFtZXRlcnMgb3IgZmllbGRzIHdpdGggb3B0aW9uYWwgc3VnZ2VzdGlvbnMgd2l0aCAob3B0aW9uYWwpIHN1Z2dlc3RlZCB2YWx1ZXMKKyAgICAvLy8gZm9yIGFueSBjb25mbGljdGluZyBmaWVsZHMgdG8gYXZvaWQgdGhlIGNvbmZsaWN0LiBNdXN0IG9ubHkgYmUgc2V0IGZvciBDT05GTElDVCwgVU5TVVBQT1JURUQKKyAgICAvLy8gYW5kIElORk9fQ09ORkxJQ1QgZmFpbHVyZSBjb2Rlcy4KKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+IGNvbmZsaWN0czsKK307CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gIFdPUksKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvKiogVW5pcXVlIElEIGZvciBhIHByb2Nlc3Npbmcgbm9kZS4gKi8KK3R5cGVkZWYgdWludDMyX3QgYzJfbm9kZV9pZF90OworCitlbnVtIHsKKyAgICBrUGFyYW1JbmRleFdvcmtPcmRpbmFsLAorfTsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBmb3Igb3JkZXJpbmcgd29yayBpdGVtcyBvbiBhIGNvbXBvbmVudCBwb3J0LgorICovCitzdHJ1Y3QgQzJXb3JrT3JkaW5hbFN0cnVjdCB7CisvL3B1YmxpYzoKKyAgICBjMl9jbnRyNjRfdCB0aW1lc3RhbXA7ICAgICAvKiogZnJhbWUgdGltZXN0YW1wIGluIG1pY3Jvc2Vjb25kcyAqLworICAgIGMyX2NudHI2NF90IGZyYW1lSW5kZXg7ICAgIC8qKiBzdWJtaXNzaW9uIG9yZGluYWwgb24gdGhlIGluaXRpYWwgY29tcG9uZW50ICovCisgICAgYzJfY250cjY0X3QgY3VzdG9tT3JkaW5hbDsgLyoqIGNhbiBiZSBnaXZlbiBieSB0aGUgY29tcG9uZW50LCBlLmcuIGRlY29kZSBvcmRlciAqLworCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9DMlNUUlVDVChXb3JrT3JkaW5hbCkKKyAgICBDMkZJRUxEKHRpbWVzdGFtcCwgInRpbWVzdGFtcCIpCisgICAgQzJGSUVMRChmcmFtZUluZGV4LCAiZnJhbWUtaW5kZXgiKQorICAgIEMyRklFTEQoY3VzdG9tT3JkaW5hbCwgImN1c3RvbS1vcmRpbmFsIikKK307CisKKy8qKgorICogVGhpcyBzdHJ1Y3R1cmUgcmVwcmVzZW50cyBhIENvZGVjIDIuMCBmcmFtZSB3aXRoIGl0cyBtZXRhZGF0YS4KKyAqCisgKiBBIGZyYW1lIGJhc2ljYWxseSBjb25zaXN0cyBvZiBhbiBvcmRlcmVkIHNldHMgb2YgYnVmZmVycywgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGFuZCBpbmZvIGJ1ZmZlcnMKKyAqIGFsb25nIHdpdGggc29tZSBub24tY29uZmlndXJhdGlvbiBtZXRhZGF0YS4KKyAqLworc3RydWN0IEMyRnJhbWVEYXRhIHsKKy8vcHVibGljOgorICAgIGVudW0gZmxhZ3NfdCA6IHVpbnQzMl90IHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZvciBpbnB1dCBmcmFtZXM6IG5vIG91dHB1dCBmcmFtZSBzaGFsbCBiZSBnZW5lcmF0ZWQgd2hlbiBwcm9jZXNzaW5nIHRoaXMgZnJhbWUsIGJ1dAorICAgICAgICAgKiBtZXRhZGF0YSBzaGFsbCBzdGlsbCBiZSBwcm9jZXNzZWQuCisgICAgICAgICAqIEZvciBvdXRwdXQgZnJhbWVzOiB0aGlzIGZyYW1lIHNoYWxsIGJlIGRpc2NhcmRlZCBhbmQgYnV0IG1ldGFkYXRhIGlzIHN0aWxsIHZhbGlkLgorICAgICAgICAgKi8KKyAgICAgICAgRkxBR19EUk9QX0ZSQU1FICAgID0gKDEgPDwgMCksCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGZyYW1lIGlzIHRoZSBsYXN0IGZyYW1lIG9mIHRoZSBjdXJyZW50IHN0cmVhbS4gRnVydGhlciBmcmFtZXMgYXJlIHBhcnQgb2YgYSBuZXcKKyAgICAgICAgICogc3RyZWFtLgorICAgICAgICAgKi8KKyAgICAgICAgRkxBR19FTkRfT0ZfU1RSRUFNID0gKDEgPDwgMSksCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGZyYW1lIHNoYWxsIGJlIGRpc2NhcmRlZCB3aXRoIGl0cyBtZXRhZGF0YS4KKyAgICAgICAgICogVGhpcyBmbGFnIGlzIG9ubHkgc2V0IGJ5IGNvbXBvbmVudHMgLSBlLmcuIGFzIGEgcmVzcG9uc2UgdG8gdGhlIGZsdXNoIGNvbW1hbmQuCisgICAgICAgICAqLworICAgICAgICBGTEFHX0RJU0NBUkRfRlJBTUUgPSAoMSA8PCAyKSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgZnJhbWUgaXMgbm90IHRoZSBsYXN0IGZyYW1lIHByb2R1Y2VkIGZvciB0aGUgaW5wdXQuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgZmxhZyBpcyBub3JtYWxseSBzZXQgYnkgdGhlIGNvbXBvbmVudCAtIGUuZy4gd2hlbiBhbiBpbnB1dCBmcmFtZSByZXN1bHRzIGluIG11bHRpcGxlCisgICAgICAgICAqIG91dHB1dCBmcmFtZXMsIHRoaXMgZmxhZyBpcyBzZXQgb24gYWxsIGJ1dCB0aGUgbGFzdCBvdXRwdXQgZnJhbWUuCisgICAgICAgICAqCisgICAgICAgICAqIEFsc28sIHdoZW4gY29tcG9uZW50cyBhcmUgY2hhaW5lZCwgdGhpcyBmbGFnIHNob3VsZCBiZSBwcm9wYWdhdGVkIGRvd24gdGhlCisgICAgICAgICAqIHdvcmsgY2hhaW4uIFRoYXQgaXMsIGlmIHNldCBvbiBhbiBlYXJsaWVyIGZyYW1lIG9mIGEgd29yay1jaGFpbiwgaXQgc2hvdWxkIGJlIHByb3BhZ2F0ZWQKKyAgICAgICAgICogdG8gYWxsIGxhdGVyIGZyYW1lcyBpbiB0aGF0IGNoYWluLiBBZGRpdGlvbmFsbHksIGNvbXBvbmVudHMgZG93biB0aGUgY2hhaW4gY291bGQgc2V0CisgICAgICAgICAqIHRoaXMgZmxhZyBldmVuIGlmIG5vdCBzZXQgZWFybGllciwgZS5nLiBpZiBtdWx0aXBsZSBvdXRwdXQgZnJhbWUgaXMgZ2VuZXJhdGVkIGF0IHRoYXQKKyAgICAgICAgICogY29tcG9uZW50IGZvciB0aGUgaW5wdXQgZnJhbWUuCisgICAgICAgICAqLworICAgICAgICBGTEFHX0lOQ09NUExFVEUgPSAoMSA8PCAzKSwKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoaXMgZnJhbWUgY29udGFpbnMgb25seSBjb2RlYy1zcGVjaWZpYyBjb25maWd1cmF0aW9uIGRhdGEsIGFuZCBubyBhY3R1YWwgYWNjZXNzIHVuaXQuCisgICAgICAgICAqCisgICAgICAgICAqIFxkZXByZWNhdGVkIHBhc3MgY29kZWMgY29uZmlndXJhdGlvbiB3aXRoIHVzaW5nIHRoZSBcdG9kbyBjb2RlYy1zcGVjaWZpYyBjb25maWd1cmF0aW9uCisgICAgICAgICAqIGluZm8gdG9nZXRoZXIgd2l0aCB0aGUgYWNjZXNzIHVuaXQuCisgICAgICAgICAqLworICAgICAgICBGTEFHX0NPREVDX0NPTkZJRyAgPSAoMXUgPDwgMzEpLAorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBGcmFtZSBmbGFncyAqLworICAgIGZsYWdzX3QgIGZsYWdzOworICAgIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3JkaW5hbDsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+PiBidWZmZXJzOworICAgIC8vPCBmb3IgaW5pdGlhbCB3b3JrIGl0ZW0sIHRoZXNlIG1heSBhbHNvIGNvbWUgZnJvbSB0aGUgcGFyc2VyIC0gaWYgcHJvdmlkZWQKKyAgICAvLzwgZm9yIG91dHB1dCBidWZmZXJzLCB0aGVzZSBhcmUgdGhlIHJlc3BvbnNlcyB0byByZXF1ZXN0ZWRJbmZvcworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gICAgICBjb25maWdVcGRhdGU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMySW5mb0J1ZmZlcj4+IGluZm9CdWZmZXJzOworfTsKKworc3RydWN0IEMyV29ya2xldCB7CisvL3B1YmxpYzoKKyAgICAvLyBJTgorICAgIGMyX25vZGVfaWRfdCBjb21wb25lbnQ7CisKKyAgICAvKiogQ29uZmlndXJhdGlvbiBjaGFuZ2VzIHRvIGJlIGFwcGxpZWQgYmVmb3JlIHByb2Nlc3NpbmcgdGhpcyB3b3JrbGV0LiAqLworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+IHR1bmluZ3M7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworCisgICAgLy8gT1VUCisgICAgQzJGcmFtZURhdGEgb3V0cHV0OworfTsKKworLyoqCisgKiBJbmZvcm1hdGlvbiBhYm91dCBwYXJ0aWFsIHdvcmstY2hhaW5zIG5vdCBwYXJ0IG9mIHRoZSBjdXJyZW50IHdvcmsgaXRlbXMuCisgKgorICogVG8gYmUgZGVmaW5lZCBsYXRlci4KKyAqLworc3RydWN0IEMyV29ya0NoYWluSW5mbzsKKworLyoqCisgKiBUaGlzIHN0cnVjdHVyZSBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBhbGwgYSBzaW5nbGUgd29yayBpdGVtLgorICoKKyAqIFRoaXMgc3RydWN0dXJlIHNoYWxsIGJlIHBhc3NlZCBieSB0aGUgY2xpZW50IHRvIHRoZSBjb21wb25lbnQgZm9yIHRoZSBmaXJzdCB3b3JrbGV0LiBBcyBzdWNoLAorICogd29ya2xldHMgbXVzdCBub3QgYmUgZW1wdHkuIFRoZSBvd25lcnNoaXAgb2YgdGhpcyBvYmplY3QgaXMgcGFzc2VkLgorICovCitzdHJ1Y3QgQzJXb3JrIHsKKy8vcHVibGljOgorICAgIC8vLyBhZGRpdGlvbmFsIHdvcmsgY2hhaW4gaW5mbyBub3QgcGFydCBvZiB0aGlzIHdvcmsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJXb3JrQ2hhaW5JbmZvPiBjaGFpbkluZm87CisKKyAgICAvLy8gVGhlIGlucHV0IGRhdGEgdG8gYmUgcHJvY2Vzc2VkIGFzIHBhcnQgb2YgdGhpcyB3b3JrL3dvcmstY2hhaW4uIFRoaXMgaXMgcHJvdmlkZWQgYnkgdGhlCisgICAgLy8vIGNsaWVudCB3aXRoIG93bmVyc2hpcC4gV2hlbiB0aGUgd29yayBpcyByZXR1cm5lZCAodmlhIG9uV29ya0RvbmUpLCB0aGUgaW5wdXQgYnVmZmVyLXBhY2sncworICAgIC8vLyBidWZmZXIgdmVjdG9yIHNoYWxsIGNvbnRhaW4gbnVsbHB0cnMuCisgICAgQzJGcmFtZURhdGEgaW5wdXQ7CisKKyAgICAvLy8gVGhlIGNoYWluIG9mIGNvbXBvbmVudHMsIHR1bmluZ3MgKGluY2x1ZGluZyBvdXRwdXQgYnVmZmVyIHBvb2wgSURzKSBhbmQgaW5mbyByZXF1ZXN0cyB0aGF0IHRoZQorICAgIC8vLyBkYXRhIG11c3QgcGFzcyB0aHJvdWdoLiBJZiB0aGlzIGhhcyBtb3JlIHRoYW4gYSBzaW5nbGUgZWxlbWVudCwgdGhlIHR1bm5lbHMgYmV0d2VlbiBzdWNjZXNzaXZlCisgICAgLy8vIGNvbXBvbmVudHMgb2YgdGhlIHdvcmtsZXQgY2hhaW4gbXVzdCBoYXZlIGJlZW4gKHN1Y2Nlc3NmdWxseSkgcHJlLXJlZ2lzdGVyZWQgYXQgdGhlIHRpbWUgdGhhdAorICAgIC8vLyB0aGUgd29yayBpcyBzdWJtaXR0ZWQuIEFsbG9jYXRpbmcgdGhlIG91dHB1dCBidWZmZXJzIGluIHRoZSB3b3JrbGV0cyBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YKKyAgICAvLy8gZWFjaCBjb21wb25lbnQuIFVwb24gd29yayBzdWJtaXNzaW9uLCBlYWNoIG91dHB1dCBidWZmZXItcGFjayBzaGFsbCBiZSBhbiBhcHByb3ByaWF0ZWx5IHNpemVkCisgICAgLy8vIHZlY3RvciBjb250YWluaW5nIG51bGxwdHJzLiBXaGVuIHRoZSB3b3JrIGlzIGNvbXBsZXRlZC9yZXR1cm5lZCB0byB0aGUgY2xpZW50LCBvdXRwdXQgYnVmZmVycworICAgIC8vLyBwb2ludGVycyBmcm9tIGFsbCBidXQgdGhlIGZpbmFsIHdvcmtsZXQgc2hhbGwgYmUgbnVsbHB0cnMuCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcmtsZXQ+PiB3b3JrbGV0czsKKworICAgIC8vLyBOdW1iZXIgb2Ygd29ya2xldHMgc3VjY2Vzc2Z1bGx5IHByb2Nlc3NlZCBpbiB0aGlzIGNoYWluLiBUaGlzIHNoYWxsIGJlIGluaXRpYWxpemVkIHRvIDAgYnkgdGhlCisgICAgLy8vIGNsaWVudCB3aGVuIHRoZSB3b3JrIGlzIHN1Ym1pdHRlZC4gSXQgc2hhbGwgY29udGFpbiB0aGUgbnVtYmVyIG9mIHdvcmtsZXRzIHRoYXQgd2VyZQorICAgIC8vLyBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkIHdoZW4gdGhlIHdvcmsgaXMgcmV0dXJuZWQgdG8gdGhlIGNsaWVudC4gSWYgdGhpcyBpcyBsZXNzIHRoZW4gdGhlIG51bWJlcgorICAgIC8vLyBvZiB3b3JrbGV0cywgcmVzdWx0IG11c3Qgbm90IGJlIHN1Y2Nlc3MuIEl0IG11c3QgYmUgaW4gdGhlIHJhbmdlIG9mIFswLCB3b3JrbGV0cy5zaXplKCldLgorICAgIHVpbnQzMl90IHdvcmtsZXRzUHJvY2Vzc2VkOworCisgICAgLy8vIFRoZSBmaW5hbCBvdXRjb21lIG9mIHRoZSB3b3JrIChjb3JyZXNwb25kaW5nIHRvIHRoZSBjdXJyZW50IHdvcmtsZXRzUHJvY2Vzc2VkKS4gSWYgMCB3aGVuCisgICAgLy8vIHdvcmsgaXMgcmV0dXJuZWQsIGl0IGlzIGFzc3VtZWQgdGhhdCBhbGwgd29ya2xldHMgaGF2ZSBiZWVuIHByb2Nlc3NlZC4KKyAgICBjMl9zdGF0dXNfdCByZXN1bHQ7Cit9OworCisvKioKKyAqIEluZm9ybWF0aW9uIGFib3V0IGEgZnV0dXJlIHdvcmsgdG8gYmUgc3VibWl0dGVkIHRvIHRoZSBjb21wb25lbnQuIFRoZSBpbmZvcm1hdGlvbiBpcyB1c2VkIHRvCisgKiByZXNlcnZlIHRoZSB3b3JrIGZvciB3b3JrIG9yZGVyaW5nIHB1cnBvc2VzLgorICovCitzdHJ1Y3QgQzJXb3JrT3V0bGluZSB7CisvL3B1YmxpYzoKKyAgICBDMldvcmtPcmRpbmFsU3RydWN0IG9yZGluYWw7CisgICAgc3RkOjp2ZWN0b3I8YzJfbm9kZV9pZF90PiBjaGFpbjsKK307CisKKy8vLyBAfQorCisjZW5kaWYgIC8vIEMyV09SS19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9fQzJNYWNyb1V0aWxzLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL19DMk1hY3JvVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNGU5YmE1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9fQzJNYWNyb1V0aWxzLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfTUFDUk9fVVRJTFNfSF8KKyNkZWZpbmUgQzJVVElMU19NQUNST19VVElMU19IXworCisvKiogXGZpbGUKKyAqIE1hY3JvIHV0aWxpdGllcyBmb3IgdGhlIHV0aWxzIGxpYnJhcnkgdXNlZCBieSBDb2RlYzIgaW1wbGVtZW50YXRpb25zLgorICovCisKKy8vLyBcaWYgMAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVkFSSUFCTEUgQVJHVU1FTlQgQ09VTlRJTkcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8vIHJlbW92ZSBlbXB0eSBhcmd1bWVudHMgLSBfQzJfQVJHKCkgZXhwYW5kcyB0byAnJywgd2hpbGUgX0MyX0FSRyh4KSBleHBhbmRzIHRvICcsIHgnCisvLyBfQzJfQVJHbiguLi4pIGRvZXMgdGhlIHNhbWUgZm9yIG4gYXJndW1lbnRzCisjZGVmaW5lIF9DMl9BUkcoLi4uKSAsICMjX19WQV9BUkdTX18KKyNkZWZpbmUgX0MyX0FSRzIoXzEsIF8yKSBfQzJfQVJHKF8xKSBfQzJfQVJHKF8yKQorI2RlZmluZSBfQzJfQVJHNChfMSwgXzIsIF8zLCBfNCkgX0MyX0FSRzIoXzEsIF8yKSBfQzJfQVJHMihfMywgXzQpCisjZGVmaW5lIF9DMl9BUkc4KF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCkgX0MyX0FSRzQoXzEsIF8yLCBfMywgXzQpIF9DMl9BUkc0KF81LCBfNiwgXzcsIF84KQorI2RlZmluZSBfQzJfQVJHMTYoXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgXzcsIF84LCBfOSwgXzEwLCBfMTEsIF8xMiwgXzEzLCBfMTQsIF8xNSwgXzE2KSBcCisgICAgICAgIF9DMl9BUkc4KF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCkgX0MyX0FSRzgoXzksIF8xMCwgXzExLCBfMTIsIF8xMywgXzE0LCBfMTUsIF8xNikKKworLy8gcmV0dXJuIHRoZSA2NXRoIGFyZ3VtZW50CisjZGVmaW5lIF9DMl9BUkdDXzMoXywgXzAsIF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCwgXzksIF8xMCwgXzExLCBfMTIsIF8xMywgXzE0LCBfMTUsIF8xNiwgXAorICAgICAgICBfMTcsIF8xOCwgXzE5LCBfMjAsIF8yMSwgXzIyLCBfMjMsIF8yNCwgXzI1LCBfMjYsIF8yNywgXzI4LCBfMjksIF8zMCwgXzMxLCBfMzIsIFwKKyAgICAgICAgXzMzLCBfMzQsIF8zNSwgXzM2LCBfMzcsIF8zOCwgXzM5LCBfNDAsIF80MSwgXzQyLCBfNDMsIF80NCwgXzQ1LCBfNDYsIF80NywgXzQ4LCBcCisgICAgICAgIF80OSwgXzUwLCBfNTEsIF81MiwgXzUzLCBfNTQsIF81NSwgXzU2LCBfNTcsIF81OCwgXzU5LCBfNjAsIF82MSwgXzYyLCBfNjMsIF82NCwgLi4uKSBfNjQKKworLy8vIFxlbmRpZgorCisvKioKKyAqIFJldHVybnMgdGhlIG51bWJlciBvZiBhcmd1bWVudHMuCisgKi8KKy8vIFdlIGRvIHRoaXMgYnkgcHJlcGVuZGluZyAxIGFuZCBhcHBlbmRpbmcgNjUgZGVzaWduZWQgdmFsdWVzIHN1Y2ggdGhhdCB0aGUgNjV0aCBlbGVtZW50CisvLyB3aWxsIGJlIHRoZSBudW1iZXIgb2YgYXJndW1lbnRzLgorI2RlZmluZSBfQzJfQVJHQyguLi4pIF9DMl9BUkdDXzEoMCwgIyNfX1ZBX0FSR1NfXywgXAorICAgICAgICA2NCwgNjMsIDYyLCA2MSwgNjAsIDU5LCA1OCwgNTcsIDU2LCA1NSwgNTQsIDUzLCA1MiwgNTEsIDUwLCA0OSwgNDgsIDQ3LCA0NiwgNDUsIDQ0LCA0MywgXAorICAgICAgICA0MiwgNDEsIDQwLCAzOSwgMzgsIDM3LCAzNiwgMzUsIDM0LCAzMywgMzIsIDMxLCAzMCwgMjksIDI4LCAyNywgMjYsIDI1LCAyNCwgMjMsIDIyLCAyMSwgXAorICAgICAgICAyMCwgMTksIDE4LCAxNywgMTYsIDE1LCAxNCwgMTMsIDEyLCAxMSwgMTAsIDksIDgsIDcsIDYsIDUsIDQsIDMsIDIsIDEsIDApCisKKy8vLyBcaWYgMAorCisvLyBzdGVwIDEuIHJlbW92ZSBlbXB0eSBhcmd1bWVudHMgLSB0aGlzIGlzIG5lZWRlZCB0byBhbGxvdyB0cmFpbGluZyBjb21tYSBpbiBlbnVtIGRlZmluaXRpb25zCisvLyAoTk9URTogd2UgZG9uJ3Qga25vdyB3aGljaCBhcmd1bWVudCB3aWxsIGhhdmUgdGhpcyB0cmFpbGluZyBjb21tYSBzbyB3ZSBoYXZlIHRvIHRyeSBhbGwpCisjZGVmaW5lIF9DMl9BUkdDXzEoXywgXzAsIF8xLCBfMiwgXzMsIF80LCBfNSwgXzYsIF83LCBfOCwgXzksIF8xMCwgXzExLCBfMTIsIF8xMywgXzE0LCBfMTUsIF8xNiwgXAorICAgICAgICBfMTcsIF8xOCwgXzE5LCBfMjAsIF8yMSwgXzIyLCBfMjMsIF8yNCwgXzI1LCBfMjYsIF8yNywgXzI4LCBfMjksIF8zMCwgXzMxLCBfMzIsIFwKKyAgICAgICAgXzMzLCBfMzQsIF8zNSwgXzM2LCBfMzcsIF8zOCwgXzM5LCBfNDAsIF80MSwgXzQyLCBfNDMsIF80NCwgXzQ1LCBfNDYsIF80NywgXzQ4LCBcCisgICAgICAgIF80OSwgXzUwLCBfNTEsIF81MiwgXzUzLCBfNTQsIF81NSwgXzU2LCBfNTcsIF81OCwgXzU5LCBfNjAsIF82MSwgXzYyLCBfNjMsIF82NCwgLi4uKSBcCisgICAgX0MyX0FSR0NfMihfIF9DMl9BUkcoXzApIFwKKyAgICBfQzJfQVJHMTYoXzEsIF8yLCBfMywgXzQsIF81LCBfNiwgXzcsIF84LCBfOSwgXzEwLCBfMTEsIF8xMiwgXzEzLCBfMTQsIF8xNSwgXzE2KSBcCisgICAgX0MyX0FSRzE2KF8xNywgXzE4LCBfMTksIF8yMCwgXzIxLCBfMjIsIF8yMywgXzI0LCBfMjUsIF8yNiwgXzI3LCBfMjgsIF8yOSwgXzMwLCBfMzEsIF8zMikgXAorICAgIF9DMl9BUkcxNihfMzMsIF8zNCwgXzM1LCBfMzYsIF8zNywgXzM4LCBfMzksIF80MCwgXzQxLCBfNDIsIF80MywgXzQ0LCBfNDUsIF80NiwgXzQ3LCBfNDgpIFwKKyAgICBfQzJfQVJHMTYoXzQ5LCBfNTAsIF81MSwgXzUyLCBfNTMsIF81NCwgXzU1LCBfNTYsIF81NywgXzU4LCBfNTksIF82MCwgXzYxLCBfNjIsIF82MywgXzY0KSwgXAorICAgICMjX19WQV9BUkdTX18pCisKKy8vIHN0ZXAgMi4gdGhpcyBpcyBuZWVkZWQgYXMgcmVtb3ZlZCBhcmd1bWVudHMgY2Fubm90IGJlIHBhc3NlZCBkaXJlY3RseSBhcyBlbXB0eSBpbnRvIGEgbWFjcm8KKyNkZWZpbmUgX0MyX0FSR0NfMiguLi4pIF9DMl9BUkdDXzMoX19WQV9BUkdTX18pCisKKy8vLyBcZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVkFSSUFCTEUgQVJHVU1FTlQgQ09OVkVSU0lPTiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLy8gXGlmIDAKKworLy8gbWFjcm9zIHRoYXQgY29udmVydCBfMSwgXzIsIF8zLCAuLi4gdG8gZm4oXzEsIGFyZyksIGZuKF8yLCBhcmcpLCBmbihfMywgYXJnKSwgLi4uCisjZGVmaW5lIF9DMl9NQVBfNjQoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzYzKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNjMoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzYyKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNjIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzYxKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNjEoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzYwKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNjAoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzU5KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNTkoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzU4KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNTgoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzU3KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNTcoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzU2KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNTYoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzU1KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNTUoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzU0KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNTQoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzUzKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNTMoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzUyKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNTIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzUxKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNTEoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzUwKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNTAoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQ5KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNDkoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQ4KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNDgoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQ3KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNDcoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQ2KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNDYoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQ1KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNDUoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQ0KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNDQoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQzKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNDMoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQyKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNDIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQxKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNDEoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzQwKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNDAoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzM5KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMzkoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzM4KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMzgoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzM3KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMzcoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzM2KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMzYoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzM1KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMzUoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzM0KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMzQoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzMzKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMzMoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzMyKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMzIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzMxKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMzEoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzMwKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMzAoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzI5KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMjkoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzI4KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMjgoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzI3KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMjcoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzI2KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMjYoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzI1KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMjUoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzI0KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMjQoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzIzKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMjMoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzIyKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMjIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzIxKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMjEoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzIwKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMjAoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzE5KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMTkoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzE4KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMTgoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzE3KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMTcoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzE2KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMTYoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzE1KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMTUoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzE0KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMTQoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzEzKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMTMoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzEyKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMTIoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzExKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMTEoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzEwKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMTAoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzkoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF85KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF84KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfOChmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNyhmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzcoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzYoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF82KGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF81KGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfNShmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfNChmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzQoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpLCBfQzJfTUFQXzMoZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKyNkZWZpbmUgX0MyX01BUF8zKGZuLCBhcmcsIGhlYWQsIC4uLikgZm4oaGVhZCwgYXJnKSwgX0MyX01BUF8yKGZuLCBhcmcsICMjX19WQV9BUkdTX18pCisjZGVmaW5lIF9DMl9NQVBfMihmbiwgYXJnLCBoZWFkLCAuLi4pIGZuKGhlYWQsIGFyZyksIF9DMl9NQVBfMShmbiwgYXJnLCAjI19fVkFfQVJHU19fKQorI2RlZmluZSBfQzJfTUFQXzEoZm4sIGFyZywgaGVhZCwgLi4uKSBmbihoZWFkLCBhcmcpCisKKy8vLyBcZW5kaWYKKworLyoqCisgKiBNYXBzIGVhY2ggYXJndW1lbnQgdXNpbmcgYW5vdGhlciBtYWNybyB4IC0+IGZuKHgsIGFyZykKKyAqLworLy8gdXNlIHdyYXBwZXIgdG8gY2FsbCB0aGUgcHJvcGVyIG1hcHBlciBiYXNlZCBvbiB0aGUgbnVtYmVyIG9mIGFyZ3VtZW50cworI2RlZmluZSBfQzJfTUFQKGZuLCBhcmcsIC4uLikgX0MyX01BUF9fKF9DMl9BUkdDKF9fVkFfQVJHU19fKSwgZm4sIGFyZywgIyNfX1ZBX0FSR1NfXykKKworLy8vIFxpZiAwCisKKy8vIGV2YWx1YXRlIF9uIHNvIGl0IGJlY29tZXMgYSBudW1iZXIKKyNkZWZpbmUgX0MyX01BUF9fKF9uLCBmbiwgYXJnLCAuLi4pIF9DMl9NQVBfKF9uLCBmbiwgYXJnLCBfX1ZBX0FSR1NfXykKKy8vIGNhbGwgdGhlIHByb3BlciBtYXBwZXIKKyNkZWZpbmUgX0MyX01BUF8oX24sIGZuLCBhcmcsIC4uLikgX0MyX01BUF8jI19uIChmbiwgYXJnLCBfX1ZBX0FSR1NfXykKKworLy8vIFxlbmRpZgorCisjZW5kaWYgIC8vIEMyVVRJTFNfTUFDUk9fVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvYW5kcm9pZC1DMkJ1ZmZlci5oIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9hbmRyb2lkLUMyQnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZiZWFiNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvYW5kcm9pZC1DMkJ1ZmZlci5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfQzJCVUZGRVJfSF8KKyNkZWZpbmUgQU5EUk9JRF9DMkJVRkZFUl9IXworCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+CisKKy8qIFVzZSBhbmRyb2lkIG5hdGl2ZSBoYW5kbGUgZm9yIEMySGFuZGxlICovCit0eXBlZGVmIDo6bmF0aXZlX2hhbmRsZV90IEMySGFuZGxlOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogQW5kcm9pZCBwbGF0Zm9ybSBidWZmZXIvbWVtb3J5IHVzYWdlIGJpdHMuCisgKi8KK3N0cnVjdCBDMkFuZHJvaWRNZW1vcnlVc2FnZSA6IHB1YmxpYyBDMk1lbW9yeVVzYWdlIHsKKyAgICBpbmxpbmUgQzJBbmRyb2lkTWVtb3J5VXNhZ2UoY29uc3QgQzJNZW1vcnlVc2FnZSAmdXNhZ2UpIDogQzJNZW1vcnlVc2FnZSh1c2FnZSkgeyB9CisKKy8vIHB1YmxpYzoKKyAgICAvKioKKyAgICAgKiBSZXVzZSBncmFsbG9jIGZsYWdzIHdoZXJlIHBvc3NpYmxlLCBhcyBDb2RlYyAyLjAgQVBJIG9ubHkgdXNlcyBiaXRzIDAgYW5kIDEuCisgICAgICovCisgICAgZW51bSBjb25zdW1lcl90IDogdWludDY0X3QgeworICAgICAgICBSRU5ERVJTQ1JJUFRfUkVBRCA9IEdSQUxMT0NfVVNBR0VfUkVOREVSU0NSSVBULAorICAgICAgICBIV19URVhUVVJFX1JFQUQgICA9IEdSQUxMT0NfVVNBR0VfSFdfVEVYVFVSRSwKKyAgICAgICAgSFdfQ09NUE9TRVJfUkVBRCAgPSBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSLAorICAgICAgICAvLyBncmFsbG9jIGRvZXMgbm90IGRlZmluZSBhIHZpZGVvIGRlY29kZXIgcmVhZCB1c2FnZSBmbGFnLCBzbyB1c2UgZW5jb2RlciBmb3IKKyAgICAgICAgLy8gbm93CisgICAgICAgIEhXX0NPREVDX1JFQUQgICAgID0gR1JBTExPQ19VU0FHRV9IV19WSURFT19FTkNPREVSLAorICAgICAgICBSRUFEX1BST1RFQ1RFRCAgICA9IEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVELAorICAgIH07CisKKyAgICBlbnVtIHByb2R1Y2VyX3QgOiB1aW50NjRfdCB7CisgICAgICAgIFJFTkRFUlNDUklQVF9XUklURSA9IEdSQUxMT0NfVVNBR0VfUkVOREVSU0NSSVBULAorICAgICAgICBIV19URVhUVVJFX1dSSVRFICAgPSBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUiwKKyAgICAgICAgSFdfQ09NUE9TRVJfV1JJVEUgID0gR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUiB8IEdSQUxMT0NfVVNBR0VfSFdfUkVOREVSLAorICAgICAgICBIV19DT0RFQ19XUklURSAgICAgPSBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVIsCisgICAgICAgIC8vIGdyYWxsb2MgZG9lcyBub3QgZGVmaW5lIGEgd3JpdGUgcHJvdGVjdGVkIHVzYWdlIGZsYWcsIHNvIHVzZSByZWFkIHByb3RlY3RlZAorICAgICAgICAvLyBub3cKKyAgICAgICAgV1JJVEVfUFJPVEVDVEVEICAgID0gR1JBTExPQ19VU0FHRV9QUk9URUNURUQsCisgICAgfTsKKworICAgIC8qKgorICAgICAqIENvbnZlcnQgZnJvbSBncmFsbG9jIHVzYWdlLgorICAgICAqLworICAgIHN0YXRpYyBDMk1lbW9yeVVzYWdlIEZyb21HcmFsbG9jVXNhZ2UodWludDY0X3QgdXNhZ2UpOworCisgICAgLyoqCisgICAgICogQ29udmVydCB0byBncmFsbG9jIHVzYWdlLgorICAgICAqLworICAgIHVpbnQ2NF90IGFzR3JhbGxvY1VzYWdlKCkgY29uc3Q7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQzJCVUZGRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2UuaCBiL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTgyYTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2NvcmUvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZS5oCkBAIC0wLDAgKzEsNzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQzJfVjFfMF9JTlBVVF9TVVJGQUNFX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9DMl9WMV8wX0lOUFVUX1NVUkZBQ0VfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9jb2RlYzIvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBHcmFwaGljQnVmZmVyU291cmNlOworCituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyA6OmFuZHJvaWQ6OnNwOworCit0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcgorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordHlwZWRlZiA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXIgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworLy8gVE9ETzogOjphbmRyb2lkOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjxJSW5wdXRTdXJmYWNlPgordHlwZWRlZiA6OmFuZHJvaWQ6OlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IElucHV0U3VyZmFjZUJhc2U7CisKK2NsYXNzIElucHV0U3VyZmFjZSA6IHB1YmxpYyBJbnB1dFN1cmZhY2VCYXNlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5JbnB1dFN1cmZhY2UoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBNZXRob2RzIGZyb20gSUlucHV0U3VyZmFjZQorICAgIHNwPElucHV0U3VyZmFjZUNvbm5lY3Rpb24+IGNvbm5lY3RUb0NvbXBvbmVudCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjw6OkMyQ29tcG9uZW50PiAmY29tcCk7CisgICAgLy8gVE9ETzogaW50ZigpCisKKyAgICBzdGF0aWMgc3A8SW5wdXRTdXJmYWNlPiBDcmVhdGUoKTsKKworcHJpdmF0ZToKKyAgICBJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBzcDxCR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmYmFzZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6R3JhcGhpY0J1ZmZlclNvdXJjZT4gJnNvdXJjZSk7CisKKyAgICBzcDw6OmFuZHJvaWQ6OkdyYXBoaWNCdWZmZXJTb3VyY2U+IG1Tb3VyY2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQzJfVjFfMF9JTlBVVF9TVVJGQUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9jb3JlL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvY29kZWMyLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmggYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYWUzYWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvY29yZS9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfQzJfVjFfMF9JTlBVVF9TVVJGQUNFX0NPTk5FQ1RJT05fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX0MyX1YxXzBfSU5QVVRfU1VSRkFDRV9DT05ORUNUSU9OX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2NvZGVjMi8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCisvLyBUT0RPOiBpbmhlcml0IGZyb20gSUlucHV0U3VyZmFjZUNvbm5lY3Rpb24KK2NsYXNzIElucHV0U3VyZmFjZUNvbm5lY3Rpb24gOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+SW5wdXRTdXJmYWNlQ29ubmVjdGlvbigpOworCisgICAgLy8gRnJvbSBJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbgorICAgIHZvaWQgZGlzY29ubmVjdCgpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBJbnB1dFN1cmZhY2U7CisKKyAgICAvLyBGb3IgSW5wdXRTdXJmYWNlCisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbigKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gJmNvbXApOworICAgIGJvb2wgaW5pdCgpOworCisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbigpID0gZGVsZXRlOworCisgICAgY2xhc3MgSW1wbDsKKworICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IG1Tb3VyY2U7CisgICAgc3A8SW1wbD4gbUltcGw7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbnB1dFN1cmZhY2VDb25uZWN0aW9uKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbgorfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9DMl9WMV8wX0lOUFVUX1NVUkZBQ0VfQ09OTkVDVElPTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZG9jcy9kb3h5ZmlsdGVyLnNoIGIvbWVkaWEvY29kZWMyL2RvY3MvZG94eWZpbHRlci5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kODEzMTUzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2RvY3MvZG94eWZpbHRlci5zaApAQCAtMCwwICsxLDEwMCBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uMworaW1wb3J0IHJlLCBzeXMKKworZ2xvYmFsIGluX2NvbW1lbnQsIGN1cnJlbnQsIGluZGVudCwgaG9sZAoraW5fY29tbWVudCwgY3VycmVudCwgaW5kZW50LCBob2xkID0gRmFsc2UsIE5vbmUsICcnLCBbXQorCitjbGFzcyBDaGFuZ2VDU3R5bGVDb21tZW50c1RvRG94eToKKyAgICBkZWYgZHVtcF9ob2xkKCk6CisgICAgICAgIGdsb2JhbCBob2xkCisgICAgICAgIGZvciBoIGluIGhvbGQ6CisgICAgICAgICAgICBwcmludChoLCBlbmQ9JycpCisgICAgICAgIGhvbGRbOl0gPSBbXQorCisgICAgZGVmIGRveHlfaG9sZCgpOgorICAgICAgICBnbG9iYWwgY3VycmVudCwgaG9sZAorICAgICAgICBpZiBjdXJyZW50ID09ICcvLyc6CisgICAgICAgICAgICBmb3IgaCBpbiBob2xkOgorICAgICAgICAgICAgICAgIHByaW50KHJlLnN1YihyJ14oICovLyg/IS8pKScsIHInXDEvJywgaCksIGVuZD0nJykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpcnN0ID0gVHJ1ZQorICAgICAgICAgICAgZm9yIGggaW4gaG9sZDoKKyAgICAgICAgICAgICAgICBpZiBmaXJzdDoKKyAgICAgICAgICAgICAgICAgICAgaCA9IHJlLnN1YihyJ14oICovWypdKD8hWypdKSknLCByJ1wxKicsIGgpCisgICAgICAgICAgICAgICAgICAgIGZpcnN0ID0gRmFsc2UKKyAgICAgICAgICAgICAgICBwcmludChoLCBlbmQ9JycpCisgICAgICAgIGhvbGRbOl0gPSBbXQorCisgICAgZGVmIHByb2Nlc3NfY29tbWVudCh0LCBpbmQsIGxpbmUpOgorICAgICAgICBnbG9iYWwgY3VycmVudCwgaW5kZW50LCBob2xkCisgICAgICAgIGlmIHQgIT0gY3VycmVudCBvciBpbmQgbm90IGluIChpbmRlbnQsIGluZGVudCArICcgJyk6CisgICAgICAgICAgICBkdW1wX2hvbGQoKQorICAgICAgICAgICAgY3VycmVudCwgaW5kZW50ID0gdCwgaW5kCisgICAgICAgIGhvbGQuYXBwZW5kKGxpbmUpCisKKyAgICBkZWYgcHJvY2Vzc19saW5lKGluZCwgbGluZSk6CisgICAgICAgIGdsb2JhbCBjdXJyZW50LCBpbmRlbnQKKyAgICAgICAgaWYgaW5kIGluIChpbmRlbnQsICcnKToKKyAgICAgICAgICAgIGRveHlfaG9sZCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkdW1wX2hvbGQoKQorICAgICAgICBjdXJyZW50LCBpbmRlbnQgPSBOb25lLCBOb25lCisgICAgICAgIHByaW50KGxpbmUsIGVuZD0nJykKKworICAgIGRlZiBwcm9jZXNzKHNlbGYsIGlucHV0LCBwYXRoKToKKyAgICAgICAgZm9yIGxpbmUgaW4gaW5wdXQ6CisgICAgICAgICAgICBpbmQgPSByZS5tYXRjaChyJ14oICopJywgbGluZSkuZ3JvdXAoMSkKKyAgICAgICAgICAgIGlmIGluX2NvbW1lbnQ6CisgICAgICAgICAgICAgICAgIyBUT0RPOiB0aGlzIGlzIG5vdCBxdWl0ZSByaWdodCwgYnV0IGdvb2QgZW5vdWdoCisgICAgICAgICAgICAgICAgbSA9IHJlLm1hdGNoKHInXiAqWypdLycsIGxpbmUpCisgICAgICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc19jb21tZW50KCcvKicsIGluZCwgbGluZSkKKyAgICAgICAgICAgICAgICAgICAgaW5fY29tbWVudCA9IEZhbHNlCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJvY2Vzc19jb21tZW50KCcvKicsIGluZCwgbGluZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbSA9IHJlLm1hdGNoKHInXiAqLy8nLCBsaW5lKQorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICAjIG9uZS1saW5lIGNvbW1lbnQKKyAgICAgICAgICAgICAgICBwcm9jZXNzX2NvbW1lbnQoJy8vJywgaW5kLCBsaW5lKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBtID0gcmUubWF0Y2gocideICovWypdJywgbGluZSkKKyAgICAgICAgICAgIGlmIG06CisgICAgICAgICAgICAgICAgIyBtdWx0aS1saW5lIGNvbW1lbnQKKyAgICAgICAgICAgICAgICBwcm9jZXNzX2NvbW1lbnQoJy8qJywgaW5kLCBsaW5lKQorICAgICAgICAgICAgICAgICMgVE9ETzogdGhpcyBpcyBub3QgcXVpdGUgcmlnaHQsIGJ1dCBnb29kIGVub3VnaAorICAgICAgICAgICAgICAgIGluX2NvbW1lbnQgPSBub3QgcmUubWF0Y2gocideICpbKl0vJywgbGluZSkKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgcHJvY2Vzc19saW5lKGluZCwgbGluZSkKKworY2xhc3MgQXV0b0dyb3VwOgorICAgIGRlZiBwcm9jZXNzKHNlbGYsIGlucHV0LCBwYXRoKToKKyAgICAgICAgaWYgJy9jb2RlYzIvaW5jbHVkZS8nIGluIHBhdGg6CisgICAgICAgICAgICBncm91cCA9ICdBUEkgQ29kZWMyIEFQSScKKyAgICAgICAgZWxpZiBGYWxzZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbGlmICcvY29kZWMyL3ZuZGsvJyBpbiBwYXRoOgorICAgICAgICAgICAgZ3JvdXAgPSAnVk5ESyBQbGF0Zm9ybSBwcm92aWRlZCBnbHVlJworICAgICAgICBlbGlmICcvY29kZWMyL3Rlc3RzLycgaW4gcGF0aDoKKyAgICAgICAgICAgIGdyb3VwID0gJ1Rlc3RzIFVuaXQgdGVzdHMnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBncm91cCA9ICdSYW5kb20gTWlzYy4gc2FuZGJveCcKKworICAgICAgICBwcmludCgnI3VuZGVmIF9fQVBQTEVfXycpCisKKyAgICAgICAgZm9yIGxpbmUgaW4gaW5wdXQ6CisgICAgICAgICAgICBpZiByZS5tYXRjaChyJ15uYW1lc3BhY2UgYW5kcm9pZCB7JywgbGluZSk6CisgICAgICAgICAgICAgICAgcHJpbnQobGluZSwgZW5kPScnKQorICAgICAgICAgICAgICAgIHByaW50KCkKKyAgICAgICAgICAgICAgICBwcmludChyJy8vLyBcYWRkdG9ncm91cCB7fScuZm9ybWF0KGdyb3VwKSkKKyAgICAgICAgICAgICAgICBwcmludChyJy8vLyBAeycpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgcmUubWF0Y2gocidefSArLy8gK25hbWVzcGFjZScsIGxpbmUpOgorICAgICAgICAgICAgICAgIHByaW50KHInLy8vIEB9JykKKyAgICAgICAgICAgICAgICBwcmludCgpCisgICAgICAgICAgICBwcmludChsaW5lLCBlbmQ9JycpCisKK1AgPSBBdXRvR3JvdXAoKQorZm9yIHBhdGggaW4gc3lzLmFyZ3ZbMTpdOgorICAgIHdpdGggb3BlbihwYXRoLCAncnQnKSBhcyBpbnB1dDoKKyAgICAgICAgUC5wcm9jZXNzKGlucHV0LCBwYXRoKQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2RvY3MvZG94eWdlbi5jb25maWcgYi9tZWRpYS9jb2RlYzIvZG9jcy9kb3h5Z2VuLmNvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzNiZWEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2RvY3MvZG94eWdlbi5jb25maWcKQEAgLTAsMCArMSwyNDQ2IEBACisjIERveHlmaWxlIDEuOC4xMQorCisjIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHNldHRpbmdzIHRvIGJlIHVzZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtCisjIGRveHlnZW4gKHd3dy5kb3h5Z2VuLm9yZykgZm9yIGEgcHJvamVjdC4KKyMKKyMgQWxsIHRleHQgYWZ0ZXIgYSBkb3VibGUgaGFzaCAoIyMpIGlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCBpcyBwbGFjZWQgaW4KKyMgZnJvbnQgb2YgdGhlIFRBRyBpdCBpcyBwcmVjZWRpbmcuCisjCisjIEFsbCB0ZXh0IGFmdGVyIGEgc2luZ2xlIGhhc2ggKCMpIGlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCB3aWxsIGJlIGlnbm9yZWQuCisjIFRoZSBmb3JtYXQgaXM6CisjIFRBRyA9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBGb3IgbGlzdHMsIGl0ZW1zIGNhbiBhbHNvIGJlIGFwcGVuZGVkIHVzaW5nOgorIyBUQUcgKz0gdmFsdWUgW3ZhbHVlLCAuLi5dCisjIFZhbHVlcyB0aGF0IGNvbnRhaW4gc3BhY2VzIHNob3VsZCBiZSBwbGFjZWQgYmV0d2VlbiBxdW90ZXMgKFwiIFwiKS4KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9qZWN0IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhpcyB0YWcgc3BlY2lmaWVzIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgY2hhcmFjdGVycyBpbiB0aGUgY29uZmlnIGZpbGUKKyMgdGhhdCBmb2xsb3cuIFRoZSBkZWZhdWx0IGlzIFVURi04IHdoaWNoIGlzIGFsc28gdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbCB0ZXh0CisjIGJlZm9yZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGlzIHRhZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUgaWNvbnYKKyMgYnVpbHQgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252CisjIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBVVEYtOC4KKworRE9YWUZJTEVfRU5DT0RJTkcgICAgICA9IFVURi04CisKKyMgVGhlIFBST0pFQ1RfTkFNRSB0YWcgaXMgYSBzaW5nbGUgd29yZCAob3IgYSBzZXF1ZW5jZSBvZiB3b3JkcyBzdXJyb3VuZGVkIGJ5CisjIGRvdWJsZS1xdW90ZXMsIHVubGVzcyB5b3UgYXJlIHVzaW5nIERveHl3aXphcmQpIHRoYXQgc2hvdWxkIGlkZW50aWZ5IHRoZQorIyBwcm9qZWN0IGZvciB3aGljaCB0aGUgZG9jdW1lbnRhdGlvbiBpcyBnZW5lcmF0ZWQuIFRoaXMgbmFtZSBpcyB1c2VkIGluIHRoZQorIyB0aXRsZSBvZiBtb3N0IGdlbmVyYXRlZCBwYWdlcyBhbmQgaW4gYSBmZXcgb3RoZXIgcGxhY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTXkgUHJvamVjdC4KKworUFJPSkVDVF9OQU1FICAgICAgICAgICA9IENvZGVjMgorCisjIFRoZSBQUk9KRUNUX05VTUJFUiB0YWcgY2FuIGJlIHVzZWQgdG8gZW50ZXIgYSBwcm9qZWN0IG9yIHJldmlzaW9uIG51bWJlci4gVGhpcworIyBjb3VsZCBiZSBoYW5keSBmb3IgYXJjaGl2aW5nIHRoZSBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiBvciBpZiBzb21lIHZlcnNpb24KKyMgY29udHJvbCBzeXN0ZW0gaXMgdXNlZC4KKworUFJPSkVDVF9OVU1CRVIgICAgICAgICA9IAorCisjIFVzaW5nIHRoZSBQUk9KRUNUX0JSSUVGIHRhZyBvbmUgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWwgb25lIGxpbmUgZGVzY3JpcHRpb24KKyMgZm9yIGEgcHJvamVjdCB0aGF0IGFwcGVhcnMgYXQgdGhlIHRvcCBvZiBlYWNoIHBhZ2UgYW5kIHNob3VsZCBnaXZlIHZpZXdlciBhCisjIHF1aWNrIGlkZWEgYWJvdXQgdGhlIHB1cnBvc2Ugb2YgdGhlIHByb2plY3QuIEtlZXAgdGhlIGRlc2NyaXB0aW9uIHNob3J0LgorCitQUk9KRUNUX0JSSUVGICAgICAgICAgID0gCisKKyMgV2l0aCB0aGUgUFJPSkVDVF9MT0dPIHRhZyBvbmUgY2FuIHNwZWNpZnkgYSBsb2dvIG9yIGFuIGljb24gdGhhdCBpcyBpbmNsdWRlZAorIyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSBsb2dvIHNob3VsZCBub3QgZXhjZWVkIDU1CisjIHBpeGVscyBhbmQgdGhlIG1heGltdW0gd2lkdGggc2hvdWxkIG5vdCBleGNlZWQgMjAwIHBpeGVscy4gRG94eWdlbiB3aWxsIGNvcHkKKyMgdGhlIGxvZ28gdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuCisKK1BST0pFQ1RfTE9HTyAgICAgICAgICAgPSAKKworIyBUaGUgT1VUUFVUX0RJUkVDVE9SWSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAocmVsYXRpdmUgb3IgYWJzb2x1dGUpIHBhdGgKKyMgaW50byB3aGljaCB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBiZSB3cml0dGVuLiBJZiBhIHJlbGF0aXZlIHBhdGggaXMKKyMgZW50ZXJlZCwgaXQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gd2hlcmUgZG94eWdlbiB3YXMgc3RhcnRlZC4gSWYKKyMgbGVmdCBibGFuayB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2lsbCBiZSB1c2VkLgorCitPVVRQVVRfRElSRUNUT1JZICAgICAgID0gb3V0L3RhcmdldC9jb21tb24vZG9jcy9jb2RlYzIvYXBpCisKKyMgSWYgdGhlIENSRUFURV9TVUJESVJTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGNyZWF0ZSA0MDk2IHN1Yi0KKyMgZGlyZWN0b3JpZXMgKGluIDIgbGV2ZWxzKSB1bmRlciB0aGUgb3V0cHV0IGRpcmVjdG9yeSBvZiBlYWNoIG91dHB1dCBmb3JtYXQgYW5kCisjIHdpbGwgZGlzdHJpYnV0ZSB0aGUgZ2VuZXJhdGVkIGZpbGVzIG92ZXIgdGhlc2UgZGlyZWN0b3JpZXMuIEVuYWJsaW5nIHRoaXMKKyMgb3B0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiBmZWVkaW5nIGRveHlnZW4gYSBodWdlIGFtb3VudCBvZiBzb3VyY2UgZmlsZXMsIHdoZXJlCisjIHB1dHRpbmcgYWxsIGdlbmVyYXRlZCBmaWxlcyBpbiB0aGUgc2FtZSBkaXJlY3Rvcnkgd291bGQgb3RoZXJ3aXNlIGNhdXNlcworIyBwZXJmb3JtYW5jZSBwcm9ibGVtcyBmb3IgdGhlIGZpbGUgc3lzdGVtLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0NSRUFURV9TVUJESVJTICAgICAgICAgPSBOTworCisjIElmIHRoZSBBTExPV19VTklDT0RFX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgYWxsb3cgbm9uLUFTQ0lJCisjIGNoYXJhY3RlcnMgdG8gYXBwZWFyIGluIHRoZSBuYW1lcyBvZiBnZW5lcmF0ZWQgZmlsZXMuIElmIHNldCB0byBOTywgbm9uLUFTQ0lJCisjIGNoYXJhY3RlcnMgd2lsbCBiZSBlc2NhcGVkLCBmb3IgZXhhbXBsZSBfeEUzX3g4MV94ODQgd2lsbCBiZSB1c2VkIGZvciBVbmljb2RlCisjIFUrMzA0NC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitBTExPV19VTklDT0RFX05BTUVTICAgID0gTk8KKworIyBUaGUgT1VUUFVUX0xBTkdVQUdFIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGxhbmd1YWdlIGluIHdoaWNoIGFsbAorIyBkb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBieSBkb3h5Z2VuIGlzIHdyaXR0ZW4uIERveHlnZW4gd2lsbCB1c2UgdGhpcworIyBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSBhbGwgY29uc3RhbnQgb3V0cHV0IGluIHRoZSBwcm9wZXIgbGFuZ3VhZ2UuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IEFmcmlrYWFucywgQXJhYmljLCBBcm1lbmlhbiwgQnJhemlsaWFuLCBDYXRhbGFuLCBDaGluZXNlLAorIyBDaGluZXNlLVRyYWRpdGlvbmFsLCBDcm9hdGlhbiwgQ3plY2gsIERhbmlzaCwgRHV0Y2gsIEVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpLAorIyBFc3BlcmFudG8sIEZhcnNpIChQZXJzaWFuKSwgRmlubmlzaCwgRnJlbmNoLCBHZXJtYW4sIEdyZWVrLCBIdW5nYXJpYW4sCisjIEluZG9uZXNpYW4sIEl0YWxpYW4sIEphcGFuZXNlLCBKYXBhbmVzZS1lbiAoSmFwYW5lc2Ugd2l0aCBFbmdsaXNoIG1lc3NhZ2VzKSwKKyMgS29yZWFuLCBLb3JlYW4tZW4gKEtvcmVhbiB3aXRoIEVuZ2xpc2ggbWVzc2FnZXMpLCBMYXR2aWFuLCBMaXRodWFuaWFuLAorIyBNYWNlZG9uaWFuLCBOb3J3ZWdpYW4sIFBlcnNpYW4gKEZhcnNpKSwgUG9saXNoLCBQb3J0dWd1ZXNlLCBSb21hbmlhbiwgUnVzc2lhbiwKKyMgU2VyYmlhbiwgU2VyYmlhbi1DeXJpbGxpYywgU2xvdmFrLCBTbG92ZW5lLCBTcGFuaXNoLCBTd2VkaXNoLCBUdXJraXNoLAorIyBVa3JhaW5pYW4gYW5kIFZpZXRuYW1lc2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBFbmdsaXNoLgorCitPVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaAorCisjIElmIHRoZSBCUklFRl9NRU1CRVJfREVTQyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGluY2x1ZGUgYnJpZWYgbWVtYmVyCisjIGRlc2NyaXB0aW9ucyBhZnRlciB0aGUgbWVtYmVycyB0aGF0IGFyZSBsaXN0ZWQgaW4gdGhlIGZpbGUgYW5kIGNsYXNzCisjIGRvY3VtZW50YXRpb24gKHNpbWlsYXIgdG8gSmF2YWRvYykuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0JSSUVGX01FTUJFUl9ERVNDICAgICAgPSBZRVMKKworIyBJZiB0aGUgUkVQRUFUX0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgcHJlcGVuZCB0aGUgYnJpZWYKKyMgZGVzY3JpcHRpb24gb2YgYSBtZW1iZXIgb3IgZnVuY3Rpb24gYmVmb3JlIHRoZSBkZXRhaWxlZCBkZXNjcmlwdGlvbgorIworIyBOb3RlOiBJZiBib3RoIEhJREVfVU5ET0NfTUVNQkVSUyBhbmQgQlJJRUZfTUVNQkVSX0RFU0MgYXJlIHNldCB0byBOTywgdGhlCisjIGJyaWVmIGRlc2NyaXB0aW9ucyB3aWxsIGJlIGNvbXBsZXRlbHkgc3VwcHJlc3NlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworUkVQRUFUX0JSSUVGICAgICAgICAgICA9IFlFUworCisjIFRoaXMgdGFnIGltcGxlbWVudHMgYSBxdWFzaS1pbnRlbGxpZ2VudCBicmllZiBkZXNjcmlwdGlvbiBhYmJyZXZpYXRvciB0aGF0IGlzCisjIHVzZWQgdG8gZm9ybSB0aGUgdGV4dCBpbiB2YXJpb3VzIGxpc3RpbmdzLiBFYWNoIHN0cmluZyBpbiB0aGlzIGxpc3QsIGlmIGZvdW5kCisjIGFzIHRoZSBsZWFkaW5nIHRleHQgb2YgdGhlIGJyaWVmIGRlc2NyaXB0aW9uLCB3aWxsIGJlIHN0cmlwcGVkIGZyb20gdGhlIHRleHQKKyMgYW5kIHRoZSByZXN1bHQsIGFmdGVyIHByb2Nlc3NpbmcgdGhlIHdob2xlIGxpc3QsIGlzIHVzZWQgYXMgdGhlIGFubm90YXRlZAorIyB0ZXh0LiBPdGhlcndpc2UsIHRoZSBicmllZiBkZXNjcmlwdGlvbiBpcyB1c2VkIGFzLWlzLiBJZiBsZWZ0IGJsYW5rLCB0aGUKKyMgZm9sbG93aW5nIHZhbHVlcyBhcmUgdXNlZCAoJG5hbWUgaXMgYXV0b21hdGljYWxseSByZXBsYWNlZCB3aXRoIHRoZSBuYW1lIG9mCisjIHRoZSBlbnRpdHkpOlRoZSAkbmFtZSBjbGFzcywgVGhlICRuYW1lIHdpZGdldCwgVGhlICRuYW1lIGZpbGUsIGlzLCBwcm92aWRlcywKKyMgc3BlY2lmaWVzLCBjb250YWlucywgcmVwcmVzZW50cywgYSwgYW4gYW5kIHRoZS4KKworQUJCUkVWSUFURV9CUklFRiAgICAgICA9ICJUaGUgJG5hbWUgY2xhc3MiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICRuYW1lIHdpZGdldCIgXAorICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgJG5hbWUgZmlsZSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWlucyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVwcmVzZW50cyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgYW4gXAorICAgICAgICAgICAgICAgICAgICAgICAgIHRoZQorCisjIElmIHRoZSBBTFdBWVNfREVUQUlMRURfU0VDIGFuZCBSRVBFQVRfQlJJRUYgdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTIHRoZW4KKyMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZGV0YWlsZWQgc2VjdGlvbiBldmVuIGlmIHRoZXJlIGlzIG9ubHkgYSBicmllZgorIyBkZXNjcmlwdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitBTFdBWVNfREVUQUlMRURfU0VDICAgID0gTk8KKworIyBJZiB0aGUgSU5MSU5FX0lOSEVSSVRFRF9NRU1CIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgc2hvdyBhbGwKKyMgaW5oZXJpdGVkIG1lbWJlcnMgb2YgYSBjbGFzcyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGF0IGNsYXNzIGFzIGlmIHRob3NlCisjIG1lbWJlcnMgd2VyZSBvcmRpbmFyeSBjbGFzcyBtZW1iZXJzLiBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzIGFuZCBhc3NpZ25tZW50CisjIG9wZXJhdG9ycyBvZiB0aGUgYmFzZSBjbGFzc2VzIHdpbGwgbm90IGJlIHNob3duLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOTElORV9JTkhFUklURURfTUVNQiAgPSBZRVMKKworIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgcHJlcGVuZCB0aGUgZnVsbCBwYXRoCisjIGJlZm9yZSBmaWxlcyBuYW1lIGluIHRoZSBmaWxlIGxpc3QgYW5kIGluIHRoZSBoZWFkZXIgZmlsZXMuIElmIHNldCB0byBOTyB0aGUKKyMgc2hvcnRlc3QgcGF0aCB0aGF0IG1ha2VzIHRoZSBmaWxlIG5hbWUgdW5pcXVlIHdpbGwgYmUgdXNlZAorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitGVUxMX1BBVEhfTkFNRVMgICAgICAgID0gWUVTCisKKyMgVGhlIFNUUklQX0ZST01fUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUgcGF0aC4KKyMgU3RyaXBwaW5nIGlzIG9ubHkgZG9uZSBpZiBvbmUgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIG1hdGNoZXMgdGhlIGxlZnQtaGFuZAorIyBwYXJ0IG9mIHRoZSBwYXRoLiBUaGUgdGFnIGNhbiBiZSB1c2VkIHRvIHNob3cgcmVsYXRpdmUgcGF0aHMgaW4gdGhlIGZpbGUgbGlzdC4KKyMgSWYgbGVmdCBibGFuayB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcyBydW4gaXMgdXNlZCBhcyB0aGUgcGF0aCB0bworIyBzdHJpcC4KKyMKKyMgTm90ZSB0aGF0IHlvdSBjYW4gc3BlY2lmeSBhYnNvbHV0ZSBwYXRocyBoZXJlLCBidXQgYWxzbyByZWxhdGl2ZSBwYXRocywgd2hpY2gKKyMgd2lsbCBiZSByZWxhdGl2ZSBmcm9tIHRoZSBkaXJlY3Rvcnkgd2hlcmUgZG94eWdlbiBpcyBzdGFydGVkLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRlVMTF9QQVRIX05BTUVTIGlzIHNldCB0byBZRVMuCisKK1NUUklQX0ZST01fUEFUSCAgICAgICAgPSBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMgorCisjIFRoZSBTVFJJUF9GUk9NX0lOQ19QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mIHRoZQorIyBwYXRoIG1lbnRpb25lZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIGNsYXNzLCB3aGljaCB0ZWxscyB0aGUgcmVhZGVyIHdoaWNoCisjIGhlYWRlciBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIGEgY2xhc3MuIElmIGxlZnQgYmxhbmsgb25seSB0aGUgbmFtZSBvZgorIyB0aGUgaGVhZGVyIGZpbGUgY29udGFpbmluZyB0aGUgY2xhc3MgZGVmaW5pdGlvbiBpcyB1c2VkLiBPdGhlcndpc2Ugb25lIHNob3VsZAorIyBzcGVjaWZ5IHRoZSBsaXN0IG9mIGluY2x1ZGUgcGF0aHMgdGhhdCBhcmUgbm9ybWFsbHkgcGFzc2VkIHRvIHRoZSBjb21waWxlcgorIyB1c2luZyB0aGUgLUkgZmxhZy4KKworU1RSSVBfRlJPTV9JTkNfUEFUSCAgICA9IAorCisjIElmIHRoZSBTSE9SVF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIG11Y2ggc2hvcnRlciAoYnV0CisjIGxlc3MgcmVhZGFibGUpIGZpbGUgbmFtZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpcyB5b3VyIGZpbGUgc3lzdGVtcyBkb2Vzbid0CisjIHN1cHBvcnQgbG9uZyBuYW1lcyBsaWtlIG9uIERPUywgTWFjLCBvciBDRC1ST00uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0hPUlRfTkFNRVMgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEpBVkFET0NfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGludGVycHJldCB0aGUKKyMgZmlyc3QgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBKYXZhZG9jLXN0eWxlIGNvbW1lbnQgYXMgdGhlIGJyaWVmCisjIGRlc2NyaXB0aW9uLiBJZiBzZXQgdG8gTk8sIHRoZSBKYXZhZG9jLXN0eWxlIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LQorIyBzdHlsZSBjb21tZW50cyAodGh1cyByZXF1aXJpbmcgYW4gZXhwbGljaXQgQGJyaWVmIGNvbW1hbmQgZm9yIGEgYnJpZWYKKyMgZGVzY3JpcHRpb24uKQorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0pBVkFET0NfQVVUT0JSSUVGICAgICAgPSBZRVMKKworIyBJZiB0aGUgUVRfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGludGVycHJldCB0aGUgZmlyc3QKKyMgbGluZSAodW50aWwgdGhlIGZpcnN0IGRvdCkgb2YgYSBRdC1zdHlsZSBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYKKyMgc2V0IHRvIE5PLCB0aGUgUXQtc3R5bGUgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtc3R5bGUgY29tbWVudHMgKHRodXMKKyMgcmVxdWlyaW5nIGFuIGV4cGxpY2l0IFxicmllZiBjb21tYW5kIGZvciBhIGJyaWVmIGRlc2NyaXB0aW9uLikKKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitRVF9BVVRPQlJJRUYgICAgICAgICAgID0gWUVTCisKKyMgVGhlIE1VTFRJTElORV9DUFBfSVNfQlJJRUYgdGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIG1ha2UgZG94eWdlbiB0cmVhdCBhCisjIG11bHRpLWxpbmUgQysrIHNwZWNpYWwgY29tbWVudCBibG9jayAoaS5lLiBhIGJsb2NrIG9mIC8vISBvciAvLy8gY29tbWVudHMpIGFzCisjIGEgYnJpZWYgZGVzY3JpcHRpb24uIFRoaXMgdXNlZCB0byBiZSB0aGUgZGVmYXVsdCBiZWhhdmlvci4gVGhlIG5ldyBkZWZhdWx0IGlzCisjIHRvIHRyZWF0IGEgbXVsdGktbGluZSBDKysgY29tbWVudCBibG9jayBhcyBhIGRldGFpbGVkIGRlc2NyaXB0aW9uLiBTZXQgdGhpcworIyB0YWcgdG8gWUVTIGlmIHlvdSBwcmVmZXIgdGhlIG9sZCBiZWhhdmlvciBpbnN0ZWFkLgorIworIyBOb3RlIHRoYXQgc2V0dGluZyB0aGlzIHRhZyB0byBZRVMgYWxzbyBtZWFucyB0aGF0IHJhdGlvbmFsIHJvc2UgY29tbWVudHMgYXJlCisjIG5vdCByZWNvZ25pemVkIGFueSBtb3JlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK01VTFRJTElORV9DUFBfSVNfQlJJRUYgPSBOTworCisjIElmIHRoZSBJTkhFUklUX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhbiB1bmRvY3VtZW50ZWQgbWVtYmVyIGluaGVyaXRzIHRoZQorIyBkb2N1bWVudGF0aW9uIGZyb20gYW55IGRvY3VtZW50ZWQgbWVtYmVyIHRoYXQgaXQgcmUtaW1wbGVtZW50cy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworSU5IRVJJVF9ET0NTICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBTRVBBUkFURV9NRU1CRVJfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgcHJvZHVjZSBhIG5ldworIyBwYWdlIGZvciBlYWNoIG1lbWJlci4gSWYgc2V0IHRvIE5PLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIG1lbWJlciB3aWxsIGJlIHBhcnQKKyMgb2YgdGhlIGZpbGUvY2xhc3MvbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgaXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0VQQVJBVEVfTUVNQkVSX1BBR0VTICA9IE5PCisKKyMgVGhlIFRBQl9TSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBzcGFjZXMgaW4gYSB0YWIuIERveHlnZW4KKyMgdXNlcyB0aGlzIHZhbHVlIHRvIHJlcGxhY2UgdGFicyBieSBzcGFjZXMgaW4gY29kZSBmcmFnbWVudHMuCisjIE1pbmltdW0gdmFsdWU6IDEsIG1heGltdW0gdmFsdWU6IDE2LCBkZWZhdWx0IHZhbHVlOiA0LgorCitUQUJfU0laRSAgICAgICAgICAgICAgID0gNAorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2YgYWxpYXNlcyB0aGF0IGFjdCBhcyBjb21tYW5kcyBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbi4gQW4gYWxpYXMgaGFzIHRoZSBmb3JtOgorIyBuYW1lPXZhbHVlCisjIEZvciBleGFtcGxlIGFkZGluZworIyAic2lkZWVmZmVjdD1AcGFyIFNpZGUgRWZmZWN0czpcbiIKKyMgd2lsbCBhbGxvdyB5b3UgdG8gcHV0IHRoZSBjb21tYW5kIFxzaWRlZWZmZWN0IChvciBAc2lkZWVmZmVjdCkgaW4gdGhlCisjIGRvY3VtZW50YXRpb24sIHdoaWNoIHdpbGwgcmVzdWx0IGluIGEgdXNlci1kZWZpbmVkIHBhcmFncmFwaCB3aXRoIGhlYWRpbmcKKyMgIlNpZGUgRWZmZWN0czoiLiBZb3UgY2FuIHB1dCBcbidzIGluIHRoZSB2YWx1ZSBwYXJ0IG9mIGFuIGFsaWFzIHRvIGluc2VydAorIyBuZXdsaW5lcy4KKworQUxJQVNFUyAgICAgICAgICAgICAgICA9IAorCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2Ygd29yZC1rZXl3b3JkIG1hcHBpbmdzIChUQ0wgb25seSkuCisjIEEgbWFwcGluZyBoYXMgdGhlIGZvcm0gIm5hbWU9dmFsdWUiLiBGb3IgZXhhbXBsZSBhZGRpbmcgImNsYXNzPWl0Y2w6OmNsYXNzIgorIyB3aWxsIGFsbG93IHlvdSB0byB1c2UgdGhlIGNvbW1hbmQgY2xhc3MgaW4gdGhlIGl0Y2w6OmNsYXNzIG1lYW5pbmcuCisKK1RDTF9TVUJTVCAgICAgICAgICAgICAgPSAKKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9GT1JfQyB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBDIHNvdXJjZXMKKyMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3IgQy4gRm9yCisjIGluc3RhbmNlLCBzb21lIG9mIHRoZSBuYW1lcyB0aGF0IGFyZSB1c2VkIHdpbGwgYmUgZGlmZmVyZW50LiBUaGUgbGlzdCBvZiBhbGwKKyMgbWVtYmVycyB3aWxsIGJlIG9taXR0ZWQsIGV0Yy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfRk9SX0MgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9KQVZBIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEphdmEgb3IKKyMgUHl0aG9uIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZAorIyBmb3IgdGhhdCBsYW5ndWFnZS4gRm9yIGluc3RhbmNlLCBuYW1lc3BhY2VzIHdpbGwgYmUgcHJlc2VudGVkIGFzIHBhY2thZ2VzLAorIyBxdWFsaWZpZWQgc2NvcGVzIHdpbGwgbG9vayBkaWZmZXJlbnQsIGV0Yy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfSkFWQSAgID0gTk8KKworIyBTZXQgdGhlIE9QVElNSVpFX0ZPUl9GT1JUUkFOIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEZvcnRyYW4KKyMgc291cmNlcy4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgdGFpbG9yZWQgZm9yIEZvcnRyYW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfRk9SX0ZPUlRSQU4gICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfVkhETCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBWSERMCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvciBWSERMLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK09QVElNSVpFX09VVFBVVF9WSERMICAgPSBOTworCisjIERveHlnZW4gc2VsZWN0cyB0aGUgcGFyc2VyIHRvIHVzZSBkZXBlbmRpbmcgb24gdGhlIGV4dGVuc2lvbiBvZiB0aGUgZmlsZXMgaXQKKyMgcGFyc2VzLiBXaXRoIHRoaXMgdGFnIHlvdSBjYW4gYXNzaWduIHdoaWNoIHBhcnNlciB0byB1c2UgZm9yIGEgZ2l2ZW4KKyMgZXh0ZW5zaW9uLiBEb3h5Z2VuIGhhcyBhIGJ1aWx0LWluIG1hcHBpbmcsIGJ1dCB5b3UgY2FuIG92ZXJyaWRlIG9yIGV4dGVuZCBpdAorIyB1c2luZyB0aGlzIHRhZy4gVGhlIGZvcm1hdCBpcyBleHQ9bGFuZ3VhZ2UsIHdoZXJlIGV4dCBpcyBhIGZpbGUgZXh0ZW5zaW9uLCBhbmQKKyMgbGFuZ3VhZ2UgaXMgb25lIG9mIHRoZSBwYXJzZXJzIHN1cHBvcnRlZCBieSBkb3h5Z2VuOiBJREwsIEphdmEsIEphdmFzY3JpcHQsCisjIEMjLCBDLCBDKyssIEQsIFBIUCwgT2JqZWN0aXZlLUMsIFB5dGhvbiwgRm9ydHJhbiAoZml4ZWQgZm9ybWF0IEZvcnRyYW46CisjIEZvcnRyYW5GaXhlZCwgZnJlZSBmb3JtYXR0ZWQgRm9ydHJhbjogRm9ydHJhbkZyZWUsIHVua25vd24gZm9ybWF0dGVkIEZvcnRyYW46CisjIEZvcnRyYW4uIEluIHRoZSBsYXRlciBjYXNlIHRoZSBwYXJzZXIgdHJpZXMgdG8gZ3Vlc3Mgd2hldGhlciB0aGUgY29kZSBpcyBmaXhlZAorIyBvciBmcmVlIGZvcm1hdHRlZCBjb2RlLCB0aGlzIGlzIHRoZSBkZWZhdWx0IGZvciBGb3J0cmFuIHR5cGUgZmlsZXMpLCBWSERMLiBGb3IKKyMgaW5zdGFuY2UgdG8gbWFrZSBkb3h5Z2VuIHRyZWF0IC5pbmMgZmlsZXMgYXMgRm9ydHJhbiBmaWxlcyAoZGVmYXVsdCBpcyBQSFApLAorIyBhbmQgLmYgZmlsZXMgYXMgQyAoZGVmYXVsdCBpcyBGb3J0cmFuKSwgdXNlOiBpbmM9Rm9ydHJhbiBmPUMuCisjCisjIE5vdGU6IEZvciBmaWxlcyB3aXRob3V0IGV4dGVuc2lvbiB5b3UgY2FuIHVzZSBub19leHRlbnNpb24gYXMgYSBwbGFjZWhvbGRlci4KKyMKKyMgTm90ZSB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyB5b3UgYWxzbyBuZWVkIHRvIHNldCBGSUxFX1BBVFRFUk5TIG90aGVyd2lzZQorIyB0aGUgZmlsZXMgYXJlIG5vdCByZWFkIGJ5IGRveHlnZW4uCisKK0VYVEVOU0lPTl9NQVBQSU5HICAgICAgPSAKKworIyBJZiB0aGUgTUFSS0RPV05fU1VQUE9SVCB0YWcgaXMgZW5hYmxlZCB0aGVuIGRveHlnZW4gcHJlLXByb2Nlc3NlcyBhbGwgY29tbWVudHMKKyMgYWNjb3JkaW5nIHRvIHRoZSBNYXJrZG93biBmb3JtYXQsIHdoaWNoIGFsbG93cyBmb3IgbW9yZSByZWFkYWJsZQorIyBkb2N1bWVudGF0aW9uLiBTZWUgaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi8gZm9yIGRldGFpbHMuCisjIFRoZSBvdXRwdXQgb2YgbWFya2Rvd24gcHJvY2Vzc2luZyBpcyBmdXJ0aGVyIHByb2Nlc3NlZCBieSBkb3h5Z2VuLCBzbyB5b3UgY2FuCisjIG1peCBkb3h5Z2VuLCBIVE1MLCBhbmQgWE1MIGNvbW1hbmRzIHdpdGggTWFya2Rvd24gZm9ybWF0dGluZy4gRGlzYWJsZSBvbmx5IGluCisjIGNhc2Ugb2YgYmFja3dhcmQgY29tcGF0aWJpbGl0aWVzIGlzc3Vlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworTUFSS0RPV05fU1VQUE9SVCAgICAgICA9IFlFUworCisjIFdoZW4gZW5hYmxlZCBkb3h5Z2VuIHRyaWVzIHRvIGxpbmsgd29yZHMgdGhhdCBjb3JyZXNwb25kIHRvIGRvY3VtZW50ZWQKKyMgY2xhc3Nlcywgb3IgbmFtZXNwYWNlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIGRvY3VtZW50YXRpb24uIFN1Y2ggYSBsaW5rIGNhbgorIyBiZSBwcmV2ZW50ZWQgaW4gaW5kaXZpZHVhbCBjYXNlcyBieSBwdXR0aW5nIGEgJSBzaWduIGluIGZyb250IG9mIHRoZSB3b3JkIG9yCisjIGdsb2JhbGx5IGJ5IHNldHRpbmcgQVVUT0xJTktfU1VQUE9SVCB0byBOTy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQVVUT0xJTktfU1VQUE9SVCAgICAgICA9IFlFUworCisjIElmIHlvdSB1c2UgU1RMIGNsYXNzZXMgKGkuZS4gc3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yLCBldGMuKSBidXQgZG8gbm90IHdhbnQKKyMgdG8gaW5jbHVkZSAoYSB0YWcgZmlsZSBmb3IpIHRoZSBTVEwgc291cmNlcyBhcyBpbnB1dCwgdGhlbiB5b3Ugc2hvdWxkIHNldCB0aGlzCisjIHRhZyB0byBZRVMgaW4gb3JkZXIgdG8gbGV0IGRveHlnZW4gbWF0Y2ggZnVuY3Rpb25zIGRlY2xhcmF0aW9ucyBhbmQKKyMgZGVmaW5pdGlvbnMgd2hvc2UgYXJndW1lbnRzIGNvbnRhaW4gU1RMIGNsYXNzZXMgKGUuZy4gZnVuYyhzdGQ6OnN0cmluZyk7CisjIHZlcnN1cyBmdW5jKHN0ZDo6c3RyaW5nKSB7fSkuIFRoaXMgYWxzbyBtYWtlIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbgorIyBkaWFncmFtcyB0aGF0IGludm9sdmUgU1RMIGNsYXNzZXMgbW9yZSBjb21wbGV0ZSBhbmQgYWNjdXJhdGUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQlVJTFRJTl9TVExfU1VQUE9SVCAgICA9IFlFUworCisjIElmIHlvdSB1c2UgTWljcm9zb2Z0J3MgQysrL0NMSSBsYW5ndWFnZSwgeW91IHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvCisjIGVuYWJsZSBwYXJzaW5nIHN1cHBvcnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQ1BQX0NMSV9TVVBQT1JUICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBTSVBfU1VQUE9SVCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBzaXAgKHNlZToKKyMgaHR0cDovL3d3dy5yaXZlcmJhbmtjb21wdXRpbmcuY28udWsvc29mdHdhcmUvc2lwL2ludHJvKSBzb3VyY2VzIG9ubHkuIERveHlnZW4KKyMgd2lsbCBwYXJzZSB0aGVtIGxpa2Ugbm9ybWFsIEMrKyBidXQgd2lsbCBhc3N1bWUgYWxsIGNsYXNzZXMgdXNlIHB1YmxpYyBpbnN0ZWFkCisjIG9mIHByaXZhdGUgaW5oZXJpdGFuY2Ugd2hlbiBubyBleHBsaWNpdCBwcm90ZWN0aW9uIGtleXdvcmQgaXMgcHJlc2VudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTSVBfU1VQUE9SVCAgICAgICAgICAgID0gTk8KKworIyBGb3IgTWljcm9zb2Z0J3MgSURMIHRoZXJlIGFyZSBwcm9wZ2V0IGFuZCBwcm9wcHV0IGF0dHJpYnV0ZXMgdG8gaW5kaWNhdGUKKyMgZ2V0dGVyIGFuZCBzZXR0ZXIgbWV0aG9kcyBmb3IgYSBwcm9wZXJ0eS4gU2V0dGluZyB0aGlzIG9wdGlvbiB0byBZRVMgd2lsbCBtYWtlCisjIGRveHlnZW4gdG8gcmVwbGFjZSB0aGUgZ2V0IGFuZCBzZXQgbWV0aG9kcyBieSBhIHByb3BlcnR5IGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBtZXRob2RzIGFyZSBpbmRlZWQgZ2V0dGluZyBvciBzZXR0aW5nIGEgc2ltcGxlCisjIHR5cGUuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBvciB5b3Ugd2FudCB0byBzaG93IHRoZSBtZXRob2RzIGFueXdheSwgeW91CisjIHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0lETF9QUk9QRVJUWV9TVVBQT1JUICAgPSBZRVMKKworIyBJZiBtZW1iZXIgZ3JvdXBpbmcgaXMgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIERJU1RSSUJVVEVfR1JPVVBfRE9DCisjIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHJldXNlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBmaXJzdAorIyBtZW1iZXIgaW4gdGhlIGdyb3VwIChpZiBhbnkpIGZvciB0aGUgb3RoZXIgbWVtYmVycyBvZiB0aGUgZ3JvdXAuIEJ5IGRlZmF1bHQKKyMgYWxsIG1lbWJlcnMgb2YgYSBncm91cCBtdXN0IGJlIGRvY3VtZW50ZWQgZXhwbGljaXRseS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitESVNUUklCVVRFX0dST1VQX0RPQyAgID0gTk8KKworIyBJZiBvbmUgYWRkcyBhIHN0cnVjdCBvciBjbGFzcyB0byBhIGdyb3VwIGFuZCB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLCB0aGVuIGFsc28KKyMgYW55IG5lc3RlZCBjbGFzcyBvciBzdHJ1Y3QgaXMgYWRkZWQgdG8gdGhlIHNhbWUgZ3JvdXAuIEJ5IGRlZmF1bHQgdGhpcyBvcHRpb24KKyMgaXMgZGlzYWJsZWQgYW5kIG9uZSBoYXMgdG8gYWRkIG5lc3RlZCBjb21wb3VuZHMgZXhwbGljaXRseSB2aWEgXGluZ3JvdXAuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR1JPVVBfTkVTVEVEX0NPTVBPVU5EUyA9IE5PCisKKyMgU2V0IHRoZSBTVUJHUk9VUElORyB0YWcgdG8gWUVTIHRvIGFsbG93IGNsYXNzIG1lbWJlciBncm91cHMgb2YgdGhlIHNhbWUgdHlwZQorIyAoZm9yIGluc3RhbmNlIGEgZ3JvdXAgb2YgcHVibGljIGZ1bmN0aW9ucykgdG8gYmUgcHV0IGFzIGEgc3ViZ3JvdXAgb2YgdGhhdAorIyB0eXBlIChlLmcuIHVuZGVyIHRoZSBQdWJsaWMgRnVuY3Rpb25zIHNlY3Rpb24pLiBTZXQgaXQgdG8gTk8gdG8gcHJldmVudAorIyBzdWJncm91cGluZy4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgZG9uZSBwZXIgY2xhc3MgdXNpbmcgdGhlCisjIFxub3N1Ymdyb3VwaW5nIGNvbW1hbmQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NVQkdST1VQSU5HICAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIHRoZSBJTkxJTkVfR1JPVVBFRF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzLCBzdHJ1Y3RzIGFuZCB1bmlvbnMKKyMgYXJlIHNob3duIGluc2lkZSB0aGUgZ3JvdXAgaW4gd2hpY2ggdGhleSBhcmUgaW5jbHVkZWQgKGUuZy4gdXNpbmcgXGluZ3JvdXApCisjIGluc3RlYWQgb2Ygb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQgTWFuIHBhZ2VzKSBvciBzZWN0aW9uIChmb3IgTGFUZVgKKyMgYW5kIFJURikuCisjCisjIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgZG9lcyBub3Qgd29yayBpbiBjb21iaW5hdGlvbiB3aXRoCisjIFNFUEFSQVRFX01FTUJFUl9QQUdFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfR1JPVVBFRF9DTEFTU0VTID0gTk8KKworIyBXaGVuIHRoZSBJTkxJTkVfU0lNUExFX1NUUlVDVFMgdGFnIGlzIHNldCB0byBZRVMsIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMKKyMgd2l0aCBvbmx5IHB1YmxpYyBkYXRhIGZpZWxkcyBvciBzaW1wbGUgdHlwZWRlZiBmaWVsZHMgd2lsbCBiZSBzaG93biBpbmxpbmUgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIHNjb3BlIGluIHdoaWNoIHRoZXkgYXJlIGRlZmluZWQgKGkuZS4gZmlsZSwKKyMgbmFtZXNwYWNlLCBvciBncm91cCBkb2N1bWVudGF0aW9uKSwgcHJvdmlkZWQgdGhpcyBzY29wZSBpcyBkb2N1bWVudGVkLiBJZiBzZXQKKyMgdG8gTk8sIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMgYXJlIHNob3duIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kCisjIE1hbiBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYIGFuZCBSVEYpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOTElORV9TSU1QTEVfU1RSVUNUUyAgPSBOTworCisjIFdoZW4gVFlQRURFRl9ISURFU19TVFJVQ1QgdGFnIGlzIGVuYWJsZWQsIGEgdHlwZWRlZiBvZiBhIHN0cnVjdCwgdW5pb24sIG9yCisjIGVudW0gaXMgZG9jdW1lbnRlZCBhcyBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHdpdGggdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYuIFNvCisjIHR5cGVkZWYgc3RydWN0IFR5cGVTIHt9IFR5cGVULCB3aWxsIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIHN0cnVjdAorIyB3aXRoIG5hbWUgVHlwZVQuIFdoZW4gZGlzYWJsZWQgdGhlIHR5cGVkZWYgd2lsbCBhcHBlYXIgYXMgYSBtZW1iZXIgb2YgYSBmaWxlLAorIyBuYW1lc3BhY2UsIG9yIGNsYXNzLiBBbmQgdGhlIHN0cnVjdCB3aWxsIGJlIG5hbWVkIFR5cGVTLiBUaGlzIGNhbiB0eXBpY2FsbHkgYmUKKyMgdXNlZnVsIGZvciBDIGNvZGUgaW4gY2FzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gZGljdGF0ZXMgdGhhdCBhbGwgY29tcG91bmQKKyMgdHlwZXMgYXJlIHR5cGVkZWYnZWQgYW5kIG9ubHkgdGhlIHR5cGVkZWYgaXMgcmVmZXJlbmNlZCwgbmV2ZXIgdGhlIHRhZyBuYW1lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1RZUEVERUZfSElERVNfU1RSVUNUICAgPSBZRVMKKworIyBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9sIGxvb2t1cCBjYWNoZSBjYW4gYmUgc2V0IHVzaW5nIExPT0tVUF9DQUNIRV9TSVpFLiBUaGlzCisjIGNhY2hlIGlzIHVzZWQgdG8gcmVzb2x2ZSBzeW1ib2xzIGdpdmVuIHRoZWlyIG5hbWUgYW5kIHNjb3BlLiBTaW5jZSB0aGlzIGNhbiBiZQorIyBhbiBleHBlbnNpdmUgcHJvY2VzcyBhbmQgb2Z0ZW4gdGhlIHNhbWUgc3ltYm9sIGFwcGVhcnMgbXVsdGlwbGUgdGltZXMgaW4gdGhlCisjIGNvZGUsIGRveHlnZW4ga2VlcHMgYSBjYWNoZSBvZiBwcmUtcmVzb2x2ZWQgc3ltYm9scy4gSWYgdGhlIGNhY2hlIGlzIHRvbyBzbWFsbAorIyBkb3h5Z2VuIHdpbGwgYmVjb21lIHNsb3dlci4gSWYgdGhlIGNhY2hlIGlzIHRvbyBsYXJnZSwgbWVtb3J5IGlzIHdhc3RlZC4gVGhlCisjIGNhY2hlIHNpemUgaXMgZ2l2ZW4gYnkgdGhpcyBmb3JtdWxhOiAyXigxNitMT09LVVBfQ0FDSEVfU0laRSkuIFRoZSB2YWxpZCByYW5nZQorIyBpcyAwLi45LCB0aGUgZGVmYXVsdCBpcyAwLCBjb3JyZXNwb25kaW5nIHRvIGEgY2FjaGUgc2l6ZSBvZiAyXjE2PTY1NTM2CisjIHN5bWJvbHMuIEF0IHRoZSBlbmQgb2YgYSBydW4gZG94eWdlbiB3aWxsIHJlcG9ydCB0aGUgY2FjaGUgdXNhZ2UgYW5kIHN1Z2dlc3QKKyMgdGhlIG9wdGltYWwgY2FjaGUgc2l6ZSBmcm9tIGEgc3BlZWQgcG9pbnQgb2Ygdmlldy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogOSwgZGVmYXVsdCB2YWx1ZTogMC4KKworTE9PS1VQX0NBQ0hFX1NJWkUgICAgICA9IDAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBCdWlsZCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBFWFRSQUNUX0FMTCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGFzc3VtZSBhbGwgZW50aXRpZXMgaW4KKyMgZG9jdW1lbnRhdGlvbiBhcmUgZG9jdW1lbnRlZCwgZXZlbiBpZiBubyBkb2N1bWVudGF0aW9uIHdhcyBhdmFpbGFibGUuIFByaXZhdGUKKyMgY2xhc3MgbWVtYmVycyBhbmQgc3RhdGljIGZpbGUgbWVtYmVycyB3aWxsIGJlIGhpZGRlbiB1bmxlc3MgdGhlCisjIEVYVFJBQ1RfUFJJVkFURSByZXNwZWN0aXZlbHkgRVhUUkFDVF9TVEFUSUMgdGFncyBhcmUgc2V0IHRvIFlFUy4KKyMgTm90ZTogVGhpcyB3aWxsIGFsc28gZGlzYWJsZSB0aGUgd2FybmluZ3MgYWJvdXQgdW5kb2N1bWVudGVkIG1lbWJlcnMgdGhhdCBhcmUKKyMgbm9ybWFsbHkgcHJvZHVjZWQgd2hlbiBXQVJOSU5HUyBpcyBzZXQgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfQUxMICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhUUkFDVF9QUklWQVRFIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgcHJpdmF0ZSBtZW1iZXJzIG9mIGEgY2xhc3Mgd2lsbAorIyBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1BSSVZBVEUgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhUUkFDVF9QQUNLQUdFIHRhZyBpcyBzZXQgdG8gWUVTLCBhbGwgbWVtYmVycyB3aXRoIHBhY2thZ2Ugb3IgaW50ZXJuYWwKKyMgc2NvcGUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1BBQ0tBR0UgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhUUkFDVF9TVEFUSUMgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBzdGF0aWMgbWVtYmVycyBvZiBhIGZpbGUgd2lsbCBiZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1NUQVRJQyAgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhUUkFDVF9MT0NBTF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzIChhbmQgc3RydWN0cykgZGVmaW5lZAorIyBsb2NhbGx5IGluIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gTk8sCisjIG9ubHkgY2xhc3NlcyBkZWZpbmVkIGluIGhlYWRlciBmaWxlcyBhcmUgaW5jbHVkZWQuIERvZXMgbm90IGhhdmUgYW55IGVmZmVjdAorIyBmb3IgSmF2YSBzb3VyY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFWFRSQUNUX0xPQ0FMX0NMQVNTRVMgID0gWUVTCisKKyMgVGhpcyBmbGFnIGlzIG9ubHkgdXNlZnVsIGZvciBPYmplY3RpdmUtQyBjb2RlLiBJZiBzZXQgdG8gWUVTLCBsb2NhbCBtZXRob2RzLAorIyB3aGljaCBhcmUgZGVmaW5lZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gc2VjdGlvbiBidXQgbm90IGluIHRoZSBpbnRlcmZhY2UgYXJlCisjIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gTk8sIG9ubHkgbWV0aG9kcyBpbiB0aGUgaW50ZXJmYWNlIGFyZQorIyBpbmNsdWRlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX0xPQ0FMX01FVEhPRFMgID0gTk8KKworIyBJZiB0aGlzIGZsYWcgaXMgc2V0IHRvIFlFUywgdGhlIG1lbWJlcnMgb2YgYW5vbnltb3VzIG5hbWVzcGFjZXMgd2lsbCBiZQorIyBleHRyYWN0ZWQgYW5kIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIG5hbWVzcGFjZSBjYWxsZWQKKyMgJ2Fub255bW91c19uYW1lc3BhY2V7ZmlsZX0nLCB3aGVyZSBmaWxlIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCB0aGUgYmFzZSBuYW1lIG9mCisjIHRoZSBmaWxlIHRoYXQgY29udGFpbnMgdGhlIGFub255bW91cyBuYW1lc3BhY2UuIEJ5IGRlZmF1bHQgYW5vbnltb3VzIG5hbWVzcGFjZQorIyBhcmUgaGlkZGVuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfQU5PTl9OU1BBQ0VTICAgPSBOTworCisjIElmIHRoZSBISURFX1VORE9DX01FTUJFUlMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFsbAorIyB1bmRvY3VtZW50ZWQgbWVtYmVycyBpbnNpZGUgZG9jdW1lbnRlZCBjbGFzc2VzIG9yIGZpbGVzLiBJZiBzZXQgdG8gTk8gdGhlc2UKKyMgbWVtYmVycyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzIG92ZXJ2aWV3cywgYnV0IG5vIGRvY3VtZW50YXRpb24KKyMgc2VjdGlvbiBpcyBnZW5lcmF0ZWQuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX1VORE9DX01FTUJFUlMgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9VTkRPQ19DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwKKyMgdW5kb2N1bWVudGVkIGNsYXNzZXMgdGhhdCBhcmUgbm9ybWFsbHkgdmlzaWJsZSBpbiB0aGUgY2xhc3MgaGllcmFyY2h5LiBJZiBzZXQKKyMgdG8gTk8sIHRoZXNlIGNsYXNzZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgdmFyaW91cyBvdmVydmlld3MuIFRoaXMgb3B0aW9uCisjIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX1VORE9DX0NMQVNTRVMgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9GUklFTkRfQ09NUE9VTkRTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgaGlkZSBhbGwgZnJpZW5kCisjIChjbGFzc3xzdHJ1Y3R8dW5pb24pIGRlY2xhcmF0aW9ucy4gSWYgc2V0IHRvIE5PLCB0aGVzZSBkZWNsYXJhdGlvbnMgd2lsbCBiZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8KKworIyBJZiB0aGUgSElERV9JTl9CT0RZX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFueQorIyBkb2N1bWVudGF0aW9uIGJsb2NrcyBmb3VuZCBpbnNpZGUgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGVzZQorIyBibG9ja3Mgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZnVuY3Rpb24ncyBkZXRhaWxlZCBkb2N1bWVudGF0aW9uIGJsb2NrLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hJREVfSU5fQk9EWV9ET0NTICAgICAgPSBOTworCisjIFRoZSBJTlRFUk5BTF9ET0NTIHRhZyBkZXRlcm1pbmVzIGlmIGRvY3VtZW50YXRpb24gdGhhdCBpcyB0eXBlZCBhZnRlciBhCisjIFxpbnRlcm5hbCBjb21tYW5kIGlzIGluY2x1ZGVkLiBJZiB0aGUgdGFnIGlzIHNldCB0byBOTyB0aGVuIHRoZSBkb2N1bWVudGF0aW9uCisjIHdpbGwgYmUgZXhjbHVkZWQuIFNldCBpdCB0byBZRVMgdG8gaW5jbHVkZSB0aGUgaW50ZXJuYWwgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTlRFUk5BTF9ET0NTICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENBU0VfU0VOU0VfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIGRveHlnZW4gd2lsbCBvbmx5IGdlbmVyYXRlIGZpbGUKKyMgbmFtZXMgaW4gbG93ZXItY2FzZSBsZXR0ZXJzLiBJZiBzZXQgdG8gWUVTLCB1cHBlci1jYXNlIGxldHRlcnMgYXJlIGFsc28KKyMgYWxsb3dlZC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgY2xhc3NlcyBvciBmaWxlcyB3aG9zZSBuYW1lcyBvbmx5IGRpZmZlcgorIyBpbiBjYXNlIGFuZCBpZiB5b3VyIGZpbGUgc3lzdGVtIHN1cHBvcnRzIGNhc2Ugc2Vuc2l0aXZlIGZpbGUgbmFtZXMuIFdpbmRvd3MKKyMgYW5kIE1hYyB1c2VycyBhcmUgYWR2aXNlZCB0byBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBzeXN0ZW0gZGVwZW5kZW50LgorCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9TQ09QRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgbWVtYmVycyB3aXRoCisjIHRoZWlyIGZ1bGwgY2xhc3MgYW5kIG5hbWVzcGFjZSBzY29wZXMgaW4gdGhlIGRvY3VtZW50YXRpb24uIElmIHNldCB0byBZRVMsIHRoZQorIyBzY29wZSB3aWxsIGJlIGhpZGRlbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX1NDT1BFX05BTUVTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEhJREVfQ09NUE9VTkRfUkVGRVJFTkNFIHRhZyBpcyBzZXQgdG8gTk8gKGRlZmF1bHQpIHRoZW4gZG94eWdlbiB3aWxsCisjIGFwcGVuZCBhZGRpdGlvbmFsIHRleHQgdG8gYSBwYWdlJ3MgdGl0bGUsIHN1Y2ggYXMgQ2xhc3MgUmVmZXJlbmNlLiBJZiBzZXQgdG8KKyMgWUVTIHRoZSBjb21wb3VuZCByZWZlcmVuY2Ugd2lsbCBiZSBoaWRkZW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9DT01QT1VORF9SRUZFUkVOQ0U9IE5PCisKKyMgSWYgdGhlIFNIT1dfSU5DTFVERV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBwdXQgYSBsaXN0IG9mCisjIHRoZSBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBieSBhIGZpbGUgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBmaWxlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX0lOQ0xVREVfRklMRVMgICAgID0gWUVTCisKKyMgSWYgdGhlIFNIT1dfR1JPVVBFRF9NRU1CX0lOQyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gd2lsbCBhZGQgZm9yIGVhY2gKKyMgZ3JvdXBlZCBtZW1iZXIgYW4gaW5jbHVkZSBzdGF0ZW1lbnQgdG8gdGhlIGRvY3VtZW50YXRpb24sIHRlbGxpbmcgdGhlIHJlYWRlcgorIyB3aGljaCBmaWxlIHRvIGluY2x1ZGUgaW4gb3JkZXIgdG8gdXNlIHRoZSBtZW1iZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU0hPV19HUk9VUEVEX01FTUJfSU5DICA9IE5PCisKKyMgSWYgdGhlIEZPUkNFX0xPQ0FMX0lOQ0xVREVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGxpc3QgaW5jbHVkZQorIyBmaWxlcyB3aXRoIGRvdWJsZSBxdW90ZXMgaW4gdGhlIGRvY3VtZW50YXRpb24gcmF0aGVyIHRoYW4gd2l0aCBzaGFycCBicmFja2V0cy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitGT1JDRV9MT0NBTF9JTkNMVURFUyAgID0gTk8KKworIyBJZiB0aGUgSU5MSU5FX0lORk8gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIHRhZyBbaW5saW5lXSBpcyBpbnNlcnRlZCBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbiBmb3IgaW5saW5lIG1lbWJlcnMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0lOTElORV9JTkZPICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgU09SVF9NRU1CRVJfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQorIyAoZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgZmlsZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIKKyMgbmFtZS4gSWYgc2V0IHRvIE5PLCB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbiBkZWNsYXJhdGlvbiBvcmRlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU09SVF9NRU1CRVJfRE9DUyAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1JUX0JSSUVGX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUgYnJpZWYKKyMgZGVzY3JpcHRpb25zIG9mIGZpbGUsIG5hbWVzcGFjZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIKKyMgbmFtZS4gSWYgc2V0IHRvIE5PLCB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbiBkZWNsYXJhdGlvbiBvcmRlci4gTm90ZSB0aGF0CisjIHRoaXMgd2lsbCBhbHNvIGluZmx1ZW5jZSB0aGUgb3JkZXIgb2YgdGhlIGNsYXNzZXMgaW4gdGhlIGNsYXNzIGxpc3QuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09SVF9CUklFRl9ET0NTICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFNPUlRfTUVNQkVSU19DVE9SU18xU1QgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUKKyMgKGJyaWVmIGFuZCBkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBjbGFzcyBtZW1iZXJzIHNvIHRoYXQgY29uc3RydWN0b3JzIGFuZAorIyBkZXN0cnVjdG9ycyBhcmUgbGlzdGVkIGZpcnN0LiBJZiBzZXQgdG8gTk8gdGhlIGNvbnN0cnVjdG9ycyB3aWxsIGFwcGVhciBpbiB0aGUKKyMgcmVzcGVjdGl2ZSBvcmRlcnMgZGVmaW5lZCBieSBTT1JUX0JSSUVGX0RPQ1MgYW5kIFNPUlRfTUVNQkVSX0RPQ1MuCisjIE5vdGU6IElmIFNPUlRfQlJJRUZfRE9DUyBpcyBzZXQgdG8gTk8gdGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3Igc29ydGluZyBicmllZgorIyBtZW1iZXIgZG9jdW1lbnRhdGlvbi4KKyMgTm90ZTogSWYgU09SVF9NRU1CRVJfRE9DUyBpcyBzZXQgdG8gTk8gdGhpcyBvcHRpb24gaXMgaWdub3JlZCBmb3Igc29ydGluZworIyBkZXRhaWxlZCBtZW1iZXIgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX01FTUJFUlNfQ1RPUlNfMVNUID0gTk8KKworIyBJZiB0aGUgU09SVF9HUk9VUF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZSBoaWVyYXJjaHkKKyMgb2YgZ3JvdXAgbmFtZXMgaW50byBhbHBoYWJldGljYWwgb3JkZXIuIElmIHNldCB0byBOTyB0aGUgZ3JvdXAgbmFtZXMgd2lsbAorIyBhcHBlYXIgaW4gdGhlaXIgZGVmaW5lZCBvcmRlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX0dST1VQX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgU09SVF9CWV9TQ09QRV9OQU1FIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgY2xhc3MgbGlzdCB3aWxsIGJlIHNvcnRlZCBieQorIyBmdWxseS1xdWFsaWZpZWQgbmFtZXMsIGluY2x1ZGluZyBuYW1lc3BhY2VzLiBJZiBzZXQgdG8gTk8sIHRoZSBjbGFzcyBsaXN0IHdpbGwKKyMgYmUgc29ydGVkIG9ubHkgYnkgY2xhc3MgbmFtZSwgbm90IGluY2x1ZGluZyB0aGUgbmFtZXNwYWNlIHBhcnQuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGlzIG5vdCB2ZXJ5IHVzZWZ1bCBpZiBISURFX1NDT1BFX05BTUVTIGlzIHNldCB0byBZRVMuCisjIE5vdGU6IFRoaXMgb3B0aW9uIGFwcGxpZXMgb25seSB0byB0aGUgY2xhc3MgbGlzdCwgbm90IHRvIHRoZSBhbHBoYWJldGljYWwKKyMgbGlzdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX0JZX1NDT1BFX05BTUUgICAgID0gTk8KKworIyBJZiB0aGUgU1RSSUNUX1BST1RPX01BVENISU5HIG9wdGlvbiBpcyBlbmFibGVkIGFuZCBkb3h5Z2VuIGZhaWxzIHRvIGRvIHByb3BlcgorIyB0eXBlIHJlc29sdXRpb24gb2YgYWxsIHBhcmFtZXRlcnMgb2YgYSBmdW5jdGlvbiBpdCB3aWxsIHJlamVjdCBhIG1hdGNoIGJldHdlZW4KKyMgdGhlIHByb3RvdHlwZSBhbmQgdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgbWVtYmVyIGZ1bmN0aW9uIGV2ZW4gaWYgdGhlcmUgaXMKKyMgb25seSBvbmUgY2FuZGlkYXRlIG9yIGl0IGlzIG9idmlvdXMgd2hpY2ggY2FuZGlkYXRlIHRvIGNob29zZSBieSBkb2luZyBhCisjIHNpbXBsZSBzdHJpbmcgbWF0Y2guIEJ5IGRpc2FibGluZyBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgZG94eWdlbiB3aWxsIHN0aWxsCisjIGFjY2VwdCBhIG1hdGNoIGJldHdlZW4gcHJvdG90eXBlIGFuZCBpbXBsZW1lbnRhdGlvbiBpbiBzdWNoIGNhc2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NUUklDVF9QUk9UT19NQVRDSElORyAgPSBOTworCisjIFRoZSBHRU5FUkFURV9UT0RPTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIGRpc2FibGUgKE5PKSB0aGUgdG9kbworIyBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFx0b2RvIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9UT0RPTElTVCAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX1RFU1RMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKFlFUykgb3IgZGlzYWJsZSAoTk8pIHRoZSB0ZXN0CisjIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRlc3QgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX1RFU1RMSVNUICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfQlVHTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIGRpc2FibGUgKE5PKSB0aGUgYnVnCisjIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXGJ1ZyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfQlVHTElTVCAgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9ERVBSRUNBVEVETElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yIGRpc2FibGUgKE5PKQorIyB0aGUgZGVwcmVjYXRlZCBsaXN0LiBUaGlzIGxpc3QgaXMgY3JlYXRlZCBieSBwdXR0aW5nIFxkZXByZWNhdGVkIGNvbW1hbmRzIGluCisjIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9ERVBSRUNBVEVETElTVD0gWUVTCisKKyMgVGhlIEVOQUJMRURfU0VDVElPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSBjb25kaXRpb25hbCBkb2N1bWVudGF0aW9uCisjIHNlY3Rpb25zLCBtYXJrZWQgYnkgXGlmIDxzZWN0aW9uX2xhYmVsPiAuLi4gXGVuZGlmIGFuZCBcY29uZCA8c2VjdGlvbl9sYWJlbD4KKyMgLi4uIFxlbmRjb25kIGJsb2Nrcy4KKworRU5BQkxFRF9TRUNUSU9OUyAgICAgICA9IElOVEVSTkFMCisKKyMgVGhlIE1BWF9JTklUSUFMSVpFUl9MSU5FUyB0YWcgZGV0ZXJtaW5lcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGluZXMgdGhhdCB0aGUKKyMgaW5pdGlhbCB2YWx1ZSBvZiBhIHZhcmlhYmxlIG9yIG1hY3JvIC8gZGVmaW5lIGNhbiBoYXZlIGZvciBpdCB0byBhcHBlYXIgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uIElmIHRoZSBpbml0aWFsaXplciBjb25zaXN0cyBvZiBtb3JlIGxpbmVzIHRoYW4gc3BlY2lmaWVkIGhlcmUKKyMgaXQgd2lsbCBiZSBoaWRkZW4uIFVzZSBhIHZhbHVlIG9mIDAgdG8gaGlkZSBpbml0aWFsaXplcnMgY29tcGxldGVseS4gVGhlCisjIGFwcGVhcmFuY2Ugb2YgdGhlIHZhbHVlIG9mIGluZGl2aWR1YWwgdmFyaWFibGVzIGFuZCBtYWNyb3MgLyBkZWZpbmVzIGNhbiBiZQorIyBjb250cm9sbGVkIHVzaW5nIFxzaG93aW5pdGlhbGl6ZXIgb3IgXGhpZGVpbml0aWFsaXplciBjb21tYW5kIGluIHRoZQorIyBkb2N1bWVudGF0aW9uIHJlZ2FyZGxlc3Mgb2YgdGhpcyBzZXR0aW5nLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAwMCwgZGVmYXVsdCB2YWx1ZTogMzAuCisKK01BWF9JTklUSUFMSVpFUl9MSU5FUyAgPSAzMAorCisjIFNldCB0aGUgU0hPV19VU0VEX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBsaXN0IG9mIGZpbGVzIGdlbmVyYXRlZCBhdAorIyB0aGUgYm90dG9tIG9mIHRoZSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzZXMgYW5kIHN0cnVjdHMuIElmIHNldCB0byBZRVMsIHRoZQorIyBsaXN0IHdpbGwgbWVudGlvbiB0aGUgZmlsZXMgdGhhdCB3ZXJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NIT1dfVVNFRF9GSUxFUyAgICAgICAgPSBZRVMKKworIyBTZXQgdGhlIFNIT1dfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIEZpbGVzIHBhZ2UuIFRoaXMKKyMgd2lsbCByZW1vdmUgdGhlIEZpbGVzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4IGFuZCBmcm9tIHRoZSBGb2xkZXIgVHJlZSBWaWV3CisjIChpZiBzcGVjaWZpZWQpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX0ZJTEVTICAgICAgICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBTSE9XX05BTUVTUEFDRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGdlbmVyYXRpb24gb2YgdGhlIE5hbWVzcGFjZXMKKyMgcGFnZS4gVGhpcyB3aWxsIHJlbW92ZSB0aGUgTmFtZXNwYWNlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUKKyMgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19OQU1FU1BBQ0VTICAgICAgICA9IFlFUworCisjIFRoZSBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSBvciBzY3JpcHQgdGhhdAorIyBkb3h5Z2VuIHNob3VsZCBpbnZva2UgdG8gZ2V0IHRoZSBjdXJyZW50IHZlcnNpb24gZm9yIGVhY2ggZmlsZSAodHlwaWNhbGx5IGZyb20KKyMgdGhlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0pLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBwcm9ncmFtIGJ5IGV4ZWN1dGluZyAodmlhCisjIHBvcGVuKCkpIHRoZSBjb21tYW5kIGNvbW1hbmQgaW5wdXQtZmlsZSwgd2hlcmUgY29tbWFuZCBpcyB0aGUgdmFsdWUgb2YgdGhlCisjIEZJTEVfVkVSU0lPTl9GSUxURVIgdGFnLCBhbmQgaW5wdXQtZmlsZSBpcyB0aGUgbmFtZSBvZiBhbiBpbnB1dCBmaWxlIHByb3ZpZGVkCisjIGJ5IGRveHlnZW4uIFdoYXRldmVyIHRoZSBwcm9ncmFtIHdyaXRlcyB0byBzdGFuZGFyZCBvdXRwdXQgaXMgdXNlZCBhcyB0aGUgZmlsZQorIyB2ZXJzaW9uLiBGb3IgYW4gZXhhbXBsZSBzZWUgdGhlIGRvY3VtZW50YXRpb24uCisKK0ZJTEVfVkVSU0lPTl9GSUxURVIgICAgPSAKKworIyBUaGUgTEFZT1VUX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsYXlvdXQgZmlsZSB3aGljaCB3aWxsIGJlIHBhcnNlZAorIyBieSBkb3h5Z2VuLiBUaGUgbGF5b3V0IGZpbGUgY29udHJvbHMgdGhlIGdsb2JhbCBzdHJ1Y3R1cmUgb2YgdGhlIGdlbmVyYXRlZAorIyBvdXRwdXQgZmlsZXMgaW4gYW4gb3V0cHV0IGZvcm1hdCBpbmRlcGVuZGVudCB3YXkuIFRvIGNyZWF0ZSB0aGUgbGF5b3V0IGZpbGUKKyMgdGhhdCByZXByZXNlbnRzIGRveHlnZW4ncyBkZWZhdWx0cywgcnVuIGRveHlnZW4gd2l0aCB0aGUgLWwgb3B0aW9uLiBZb3UgY2FuCisjIG9wdGlvbmFsbHkgc3BlY2lmeSBhIGZpbGUgbmFtZSBhZnRlciB0aGUgb3B0aW9uLCBpZiBvbWl0dGVkIERveHlnZW5MYXlvdXQueG1sCisjIHdpbGwgYmUgdXNlZCBhcyB0aGUgbmFtZSBvZiB0aGUgbGF5b3V0IGZpbGUuCisjCisjIE5vdGUgdGhhdCBpZiB5b3UgcnVuIGRveHlnZW4gZnJvbSBhIGRpcmVjdG9yeSBjb250YWluaW5nIGEgZmlsZSBjYWxsZWQKKyMgRG94eWdlbkxheW91dC54bWwsIGRveHlnZW4gd2lsbCBwYXJzZSBpdCBhdXRvbWF0aWNhbGx5IGV2ZW4gaWYgdGhlIExBWU9VVF9GSUxFCisjIHRhZyBpcyBsZWZ0IGVtcHR5LgorCitMQVlPVVRfRklMRSAgICAgICAgICAgID0gCisKKyMgVGhlIENJVEVfQklCX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGJpYiBmaWxlcyBjb250YWluaW5nCisjIHRoZSByZWZlcmVuY2UgZGVmaW5pdGlvbnMuIFRoaXMgbXVzdCBiZSBhIGxpc3Qgb2YgLmJpYiBmaWxlcy4gVGhlIC5iaWIKKyMgZXh0ZW5zaW9uIGlzIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgaWYgb21pdHRlZC4gVGhpcyByZXF1aXJlcyB0aGUgYmlidGV4IHRvb2wKKyMgdG8gYmUgaW5zdGFsbGVkLiBTZWUgYWxzbyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBmb3IgbW9yZSBpbmZvLgorIyBGb3IgTGFUZVggdGhlIHN0eWxlIG9mIHRoZSBiaWJsaW9ncmFwaHkgY2FuIGJlIGNvbnRyb2xsZWQgdXNpbmcKKyMgTEFURVhfQklCX1NUWUxFLiBUbyB1c2UgdGhpcyBmZWF0dXJlIHlvdSBuZWVkIGJpYnRleCBhbmQgcGVybCBhdmFpbGFibGUgaW4gdGhlCisjIHNlYXJjaCBwYXRoLiBTZWUgYWxzbyBcY2l0ZSBmb3IgaW5mbyBob3cgdG8gY3JlYXRlIHJlZmVyZW5jZXMuCisKK0NJVEVfQklCX0ZJTEVTICAgICAgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB3YXJuaW5nIGFuZCBwcm9ncmVzcyBtZXNzYWdlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBRVUlFVCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIG1lc3NhZ2VzIHRoYXQgYXJlIGdlbmVyYXRlZCB0bworIyBzdGFuZGFyZCBvdXRwdXQgYnkgZG94eWdlbi4gSWYgUVVJRVQgaXMgc2V0IHRvIFlFUyB0aGlzIGltcGxpZXMgdGhhdCB0aGUKKyMgbWVzc2FnZXMgYXJlIG9mZi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitRVUlFVCAgICAgICAgICAgICAgICAgID0gTk8KKworIyBUaGUgV0FSTklOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgYXJlCisjIGdlbmVyYXRlZCB0byBzdGFuZGFyZCBlcnJvciAoc3RkZXJyKSBieSBkb3h5Z2VuLiBJZiBXQVJOSU5HUyBpcyBzZXQgdG8gWUVTCisjIHRoaXMgaW1wbGllcyB0aGF0IHRoZSB3YXJuaW5ncyBhcmUgb24uCisjCisjIFRpcDogVHVybiB3YXJuaW5ncyBvbiB3aGlsZSB3cml0aW5nIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitXQVJOSU5HUyAgICAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFdBUk5fSUZfVU5ET0NVTUVOVEVEIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlCisjIHdhcm5pbmdzIGZvciB1bmRvY3VtZW50ZWQgbWVtYmVycy4gSWYgRVhUUkFDVF9BTEwgaXMgc2V0IHRvIFlFUyB0aGVuIHRoaXMgZmxhZworIyB3aWxsIGF1dG9tYXRpY2FsbHkgYmUgZGlzYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1dBUk5fSUZfVU5ET0NVTUVOVEVEICAgPSBZRVMKKworIyBJZiB0aGUgV0FSTl9JRl9ET0NfRVJST1IgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB3YXJuaW5ncyBmb3IKKyMgcG90ZW50aWFsIGVycm9ycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiwgc3VjaCBhcyBub3QgZG9jdW1lbnRpbmcgc29tZSBwYXJhbWV0ZXJzCisjIGluIGEgZG9jdW1lbnRlZCBmdW5jdGlvbiwgb3IgZG9jdW1lbnRpbmcgcGFyYW1ldGVycyB0aGF0IGRvbid0IGV4aXN0IG9yIHVzaW5nCisjIG1hcmt1cCBjb21tYW5kcyB3cm9uZ2x5LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitXQVJOX0lGX0RPQ19FUlJPUiAgICAgID0gWUVTCisKKyMgVGhpcyBXQVJOX05PX1BBUkFNRE9DIG9wdGlvbiBjYW4gYmUgZW5hYmxlZCB0byBnZXQgd2FybmluZ3MgZm9yIGZ1bmN0aW9ucyB0aGF0CisjIGFyZSBkb2N1bWVudGVkLCBidXQgaGF2ZSBubyBkb2N1bWVudGF0aW9uIGZvciB0aGVpciBwYXJhbWV0ZXJzIG9yIHJldHVybgorIyB2YWx1ZS4gSWYgc2V0IHRvIE5PLCBkb3h5Z2VuIHdpbGwgb25seSB3YXJuIGFib3V0IHdyb25nIG9yIGluY29tcGxldGUKKyMgcGFyYW1ldGVyIGRvY3VtZW50YXRpb24sIGJ1dCBub3QgYWJvdXQgdGhlIGFic2VuY2Ugb2YgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitXQVJOX05PX1BBUkFNRE9DICAgICAgID0gTk8KKworIyBJZiB0aGUgV0FSTl9BU19FUlJPUiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbW1lZGlhdGVseSBzdG9wIHdoZW4KKyMgYSB3YXJuaW5nIGlzIGVuY291bnRlcmVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1dBUk5fQVNfRVJST1IgICAgICAgICAgPSBOTworCisjIFRoZSBXQVJOX0ZPUk1BVCB0YWcgZGV0ZXJtaW5lcyB0aGUgZm9ybWF0IG9mIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgZG94eWdlbgorIyBjYW4gcHJvZHVjZS4gVGhlIHN0cmluZyBzaG91bGQgY29udGFpbiB0aGUgJGZpbGUsICRsaW5lLCBhbmQgJHRleHQgdGFncywgd2hpY2gKKyMgd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgZmlsZSBhbmQgbGluZSBudW1iZXIgZnJvbSB3aGljaCB0aGUgd2FybmluZyBvcmlnaW5hdGVkCisjIGFuZCB0aGUgd2FybmluZyB0ZXh0LiBPcHRpb25hbGx5IHRoZSBmb3JtYXQgbWF5IGNvbnRhaW4gJHZlcnNpb24sIHdoaWNoIHdpbGwKKyMgYmUgcmVwbGFjZWQgYnkgdGhlIHZlcnNpb24gb2YgdGhlIGZpbGUgKGlmIGl0IGNvdWxkIGJlIG9idGFpbmVkIHZpYQorIyBGSUxFX1ZFUlNJT05fRklMVEVSKQorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogJGZpbGU6JGxpbmU6ICR0ZXh0LgorCitXQVJOX0ZPUk1BVCAgICAgICAgICAgID0gIiRmaWxlOiRsaW5lOiAkdGV4dCIKKworIyBUaGUgV0FSTl9MT0dGSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgZmlsZSB0byB3aGljaCB3YXJuaW5nIGFuZCBlcnJvcgorIyBtZXNzYWdlcyBzaG91bGQgYmUgd3JpdHRlbi4gSWYgbGVmdCBibGFuayB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4gdG8gc3RhbmRhcmQKKyMgZXJyb3IgKHN0ZGVycikuCisKK1dBUk5fTE9HRklMRSAgICAgICAgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgaW5wdXQgZmlsZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgSU5QVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbgorIyBkb2N1bWVudGVkIHNvdXJjZSBmaWxlcy4gWW91IG1heSBlbnRlciBmaWxlIG5hbWVzIGxpa2UgbXlmaWxlLmNwcCBvcgorIyBkaXJlY3RvcmllcyBsaWtlIC91c3Ivc3JjL215cHJvamVjdC4gU2VwYXJhdGUgdGhlIGZpbGVzIG9yIGRpcmVjdG9yaWVzIHdpdGgKKyMgc3BhY2VzLiBTZWUgYWxzbyBGSUxFX1BBVFRFUk5TIGFuZCBFWFRFTlNJT05fTUFQUElORworIyBOb3RlOiBJZiB0aGlzIHRhZyBpcyBlbXB0eSB0aGUgY3VycmVudCBkaXJlY3RvcnkgaXMgc2VhcmNoZWQuCisKK0lOUFVUICAgICAgICAgICAgICAgICAgPSBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjMi8KKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjaGFyYWN0ZXIgZW5jb2Rpbmcgb2YgdGhlIHNvdXJjZSBmaWxlcworIyB0aGF0IGRveHlnZW4gcGFyc2VzLiBJbnRlcm5hbGx5IGRveHlnZW4gdXNlcyB0aGUgVVRGLTggZW5jb2RpbmcuIERveHlnZW4gdXNlcworIyBsaWJpY29udiAob3IgdGhlIGljb252IGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlIHRoZSBsaWJpY29udgorIyBkb2N1bWVudGF0aW9uIChzZWU6IGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9saWJpY29udikgZm9yIHRoZSBsaXN0IG9mCisjIHBvc3NpYmxlIGVuY29kaW5ncy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFVURi04LgorCitJTlBVVF9FTkNPRElORyAgICAgICAgID0gVVRGLTgKKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIElOUFVUIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEZJTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybnMgKGxpa2UgKi5jcHAgYW5kCisjICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4KKyMKKyMgTm90ZSB0aGF0IGZvciBjdXN0b20gZXh0ZW5zaW9ucyBvciBub3QgZGlyZWN0bHkgc3VwcG9ydGVkIGV4dGVuc2lvbnMgeW91IGFsc28KKyMgbmVlZCB0byBzZXQgRVhURU5TSU9OX01BUFBJTkcgZm9yIHRoZSBleHRlbnNpb24gb3RoZXJ3aXNlIHRoZSBmaWxlcyBhcmUgbm90CisjIHJlYWQgYnkgZG94eWdlbi4KKyMKKyMgSWYgbGVmdCBibGFuayB0aGUgZm9sbG93aW5nIHBhdHRlcm5zIGFyZSB0ZXN0ZWQ6Ki5jLCAqLmNjLCAqLmN4eCwgKi5jcHAsCisjICouYysrLCAqLmphdmEsICouaWksICouaXh4LCAqLmlwcCwgKi5pKyssICouaW5sLCAqLmlkbCwgKi5kZGwsICoub2RsLCAqLmgsCisjICouaGgsICouaHh4LCAqLmhwcCwgKi5oKyssICouY3MsICouZCwgKi5waHAsICoucGhwNCwgKi5waHA1LCAqLnBodG1sLCAqLmluYywKKyMgKi5tLCAqLm1hcmtkb3duLCAqLm1kLCAqLm1tLCAqLmRveCwgKi5weSwgKi5weXcsICouZjkwLCAqLmYsICouZm9yLCAqLnRjbCwKKyMgKi52aGQsICoudmhkbCwgKi51Y2YsICoucXNmLCAqLmFzIGFuZCAqLmpzLgorCitGSUxFX1BBVFRFUk5TICAgICAgICAgID0gQzIqLmMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEMyKi5jcHAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIEMyKi5oCisKKyMgVGhlIFJFQ1VSU0lWRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCBzdWJkaXJlY3RvcmllcyBzaG91bGQKKyMgYmUgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIGFzIHdlbGwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVDVVJTSVZFICAgICAgICAgICAgICA9IFlFUworCisjIFRoZSBFWENMVURFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IHNob3VsZCBiZQorIyBleGNsdWRlZCBmcm9tIHRoZSBJTlBVVCBzb3VyY2UgZmlsZXMuIFRoaXMgd2F5IHlvdSBjYW4gZWFzaWx5IGV4Y2x1ZGUgYQorIyBzdWJkaXJlY3RvcnkgZnJvbSBhIGRpcmVjdG9yeSB0cmVlIHdob3NlIHJvb3QgaXMgc3BlY2lmaWVkIHdpdGggdGhlIElOUFVUIHRhZy4KKyMKKyMgTm90ZSB0aGF0IHJlbGF0aXZlIHBhdGhzIGFyZSByZWxhdGl2ZSB0byB0aGUgZGlyZWN0b3J5IGZyb20gd2hpY2ggZG94eWdlbiBpcworIyBydW4uCisKK0VYQ0xVREUgICAgICAgICAgICAgICAgPSAKKworIyBUaGUgRVhDTFVERV9TWU1MSU5LUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHdoZXRoZXIgb3Igbm90IGZpbGVzIG9yCisjIGRpcmVjdG9yaWVzIHRoYXQgYXJlIHN5bWJvbGljIGxpbmtzIChhIFVuaXggZmlsZSBzeXN0ZW0gZmVhdHVyZSkgYXJlIGV4Y2x1ZGVkCisjIGZyb20gdGhlIGlucHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYQ0xVREVfU1lNTElOS1MgICAgICAgPSBOTworCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRVhDTFVERV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyB0byBleGNsdWRlCisjIGNlcnRhaW4gZmlsZXMgZnJvbSB0aG9zZSBkaXJlY3Rvcmllcy4KKyMKKyMgTm90ZSB0aGF0IHRoZSB3aWxkY2FyZHMgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgZmlsZSB3aXRoIGFic29sdXRlIHBhdGgsIHNvIHRvCisjIGV4Y2x1ZGUgYWxsIHRlc3QgZGlyZWN0b3JpZXMgZm9yIGV4YW1wbGUgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qCisKK0VYQ0xVREVfUEFUVEVSTlMgICAgICAgPSAuXyoKKworIyBUaGUgRVhDTFVERV9TWU1CT0xTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHN5bWJvbCBuYW1lcworIyAobmFtZXNwYWNlcywgY2xhc3NlcywgZnVuY3Rpb25zLCBldGMuKSB0aGF0IHNob3VsZCBiZSBleGNsdWRlZCBmcm9tIHRoZQorIyBvdXRwdXQuIFRoZSBzeW1ib2wgbmFtZSBjYW4gYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSwgYSB3b3JkLCBvciBpZiB0aGUKKyMgd2lsZGNhcmQgKiBpcyB1c2VkLCBhIHN1YnN0cmluZy4gRXhhbXBsZXM6IEFOYW1lc3BhY2UsIEFDbGFzcywKKyMgQUNsYXNzOjpBTmFtZXNwYWNlLCBBTmFtZXNwYWNlOjoqVGVzdAorIworIyBOb3RlIHRoYXQgdGhlIHdpbGRjYXJkcyBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBmaWxlIHdpdGggYWJzb2x1dGUgcGF0aCwgc28gdG8KKyMgZXhjbHVkZSBhbGwgdGVzdCBkaXJlY3RvcmllcyB1c2UgdGhlIHBhdHRlcm4gKi90ZXN0LyoKKworRVhDTFVERV9TWU1CT0xTICAgICAgICA9IAorCisjIFRoZSBFWEFNUExFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKKyMgdGhhdCBjb250YWluIGV4YW1wbGUgY29kZSBmcmFnbWVudHMgdGhhdCBhcmUgaW5jbHVkZWQgKHNlZSB0aGUgXGluY2x1ZGUKKyMgY29tbWFuZCkuCisKK0VYQU1QTEVfUEFUSCAgICAgICAgICAgPSAKKworIyBJZiB0aGUgdmFsdWUgb2YgdGhlIEVYQU1QTEVfUEFUSCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBFWEFNUExFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHAgYW5kCisjICouaCkgdG8gZmlsdGVyIG91dCB0aGUgc291cmNlLWZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4gSWYgbGVmdCBibGFuayBhbGwKKyMgZmlsZXMgYXJlIGluY2x1ZGVkLgorCitFWEFNUExFX1BBVFRFUk5TICAgICAgID0gKgorCisjIElmIHRoZSBFWEFNUExFX1JFQ1VSU0lWRSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHN1YmRpcmVjdG9yaWVzIHdpbGwgYmUKKyMgc2VhcmNoZWQgZm9yIGlucHV0IGZpbGVzIHRvIGJlIHVzZWQgd2l0aCB0aGUgXGluY2x1ZGUgb3IgXGRvbnRpbmNsdWRlIGNvbW1hbmRzCisjIGlycmVzcGVjdGl2ZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFJFQ1VSU0lWRSB0YWcuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhBTVBMRV9SRUNVUlNJVkUgICAgICA9IE5PCisKKyMgVGhlIElNQUdFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3IgZGlyZWN0b3JpZXMKKyMgdGhhdCBjb250YWluIGltYWdlcyB0aGF0IGFyZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZQorIyBcaW1hZ2UgY29tbWFuZCkuCisKK0lNQUdFX1BBVEggICAgICAgICAgICAgPSAKKworIyBUaGUgSU5QVVRfRklMVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJvZ3JhbSB0aGF0IGRveHlnZW4gc2hvdWxkCisjIGludm9rZSB0byBmaWx0ZXIgZm9yIGVhY2ggaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgZmlsdGVyIHByb2dyYW0KKyMgYnkgZXhlY3V0aW5nICh2aWEgcG9wZW4oKSkgdGhlIGNvbW1hbmQ6CisjCisjIDxmaWx0ZXI+IDxpbnB1dC1maWxlPgorIworIyB3aGVyZSA8ZmlsdGVyPiBpcyB0aGUgdmFsdWUgb2YgdGhlIElOUFVUX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlCisjIG5hbWUgb2YgYW4gaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIHRoZW4gdXNlIHRoZSBvdXRwdXQgdGhhdCB0aGUgZmlsdGVyCisjIHByb2dyYW0gd3JpdGVzIHRvIHN0YW5kYXJkIG91dHB1dC4gSWYgRklMVEVSX1BBVFRFUk5TIGlzIHNwZWNpZmllZCwgdGhpcyB0YWcKKyMgd2lsbCBiZSBpZ25vcmVkLgorIworIyBOb3RlIHRoYXQgdGhlIGZpbHRlciBtdXN0IG5vdCBhZGQgb3IgcmVtb3ZlIGxpbmVzOyBpdCBpcyBhcHBsaWVkIGJlZm9yZSB0aGUKKyMgY29kZSBpcyBzY2FubmVkLCBidXQgbm90IHdoZW4gdGhlIG91dHB1dCBjb2RlIGlzIGdlbmVyYXRlZC4gSWYgbGluZXMgYXJlIGFkZGVkCisjIG9yIHJlbW92ZWQsIHRoZSBhbmNob3JzIHdpbGwgbm90IGJlIHBsYWNlZCBjb3JyZWN0bHkuCisjCisjIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgb3Igbm90IGRpcmVjdGx5IHN1cHBvcnRlZCBleHRlbnNpb25zIHlvdSBhbHNvCisjIG5lZWQgdG8gc2V0IEVYVEVOU0lPTl9NQVBQSU5HIGZvciB0aGUgZXh0ZW5zaW9uIG90aGVyd2lzZSB0aGUgZmlsZXMgYXJlIG5vdAorIyBwcm9wZXJseSBwcm9jZXNzZWQgYnkgZG94eWdlbi4KKworSU5QVVRfRklMVEVSICAgICAgICAgICA9IGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWMyL2RvY3MvZG94eWZpbHRlci5zaAorCisjIFRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsdGVycyBvbiBhIHBlciBmaWxlIHBhdHRlcm4KKyMgYmFzaXMuIERveHlnZW4gd2lsbCBjb21wYXJlIHRoZSBmaWxlIG5hbWUgd2l0aCBlYWNoIHBhdHRlcm4gYW5kIGFwcGx5IHRoZQorIyBmaWx0ZXIgaWYgdGhlcmUgaXMgYSBtYXRjaC4gVGhlIGZpbHRlcnMgYXJlIGEgbGlzdCBvZiB0aGUgZm9ybTogcGF0dGVybj1maWx0ZXIKKyMgKGxpa2UgKi5jcHA9bXlfY3BwX2ZpbHRlcikuIFNlZSBJTlBVVF9GSUxURVIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gaG93CisjIGZpbHRlcnMgYXJlIHVzZWQuIElmIHRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGlzIGVtcHR5IG9yIGlmIG5vbmUgb2YgdGhlCisjIHBhdHRlcm5zIG1hdGNoIHRoZSBmaWxlIG5hbWUsIElOUFVUX0ZJTFRFUiBpcyBhcHBsaWVkLgorIworIyBOb3RlIHRoYXQgZm9yIGN1c3RvbSBleHRlbnNpb25zIG9yIG5vdCBkaXJlY3RseSBzdXBwb3J0ZWQgZXh0ZW5zaW9ucyB5b3UgYWxzbworIyBuZWVkIHRvIHNldCBFWFRFTlNJT05fTUFQUElORyBmb3IgdGhlIGV4dGVuc2lvbiBvdGhlcndpc2UgdGhlIGZpbGVzIGFyZSBub3QKKyMgcHJvcGVybHkgcHJvY2Vzc2VkIGJ5IGRveHlnZW4uCisKK0ZJTFRFUl9QQVRURVJOUyAgICAgICAgPSAKKworIyBJZiB0aGUgRklMVEVSX1NPVVJDRV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGlucHV0IGZpbHRlciAoaWYgc2V0IHVzaW5nCisjIElOUFVUX0ZJTFRFUikgd2lsbCBhbHNvIGJlIHVzZWQgdG8gZmlsdGVyIHRoZSBpbnB1dCBmaWxlcyB0aGF0IGFyZSB1c2VkIGZvcgorIyBwcm9kdWNpbmcgdGhlIHNvdXJjZSBmaWxlcyB0byBicm93c2UgKGkuZS4gd2hlbiBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitGSUxURVJfU09VUkNFX0ZJTEVTICAgID0gWUVTCisKKyMgVGhlIEZJTFRFUl9TT1VSQ0VfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgc291cmNlIGZpbHRlcnMgcGVyIGZpbGUKKyMgcGF0dGVybi4gQSBwYXR0ZXJuIHdpbGwgb3ZlcnJpZGUgdGhlIHNldHRpbmcgZm9yIEZJTFRFUl9QQVRURVJOIChpZiBhbnkpIGFuZAorIyBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIGRpc2FibGUgc291cmNlIGZpbHRlcmluZyBmb3IgYSBzcGVjaWZpYyBwYXR0ZXJuIHVzaW5nCisjICouZXh0PSAoc28gd2l0aG91dCBuYW1pbmcgYSBmaWx0ZXIpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRklMVEVSX1NPVVJDRV9GSUxFUyBpcyBzZXQgdG8gWUVTLgorCitGSUxURVJfU09VUkNFX1BBVFRFUk5TID0gCisKKyMgSWYgdGhlIFVTRV9NREZJTEVfQVNfTUFJTlBBR0UgdGFnIHJlZmVycyB0byB0aGUgbmFtZSBvZiBhIG1hcmtkb3duIGZpbGUgdGhhdAorIyBpcyBwYXJ0IG9mIHRoZSBpbnB1dCwgaXRzIGNvbnRlbnRzIHdpbGwgYmUgcGxhY2VkIG9uIHRoZSBtYWluIHBhZ2UKKyMgKGluZGV4Lmh0bWwpLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91IGhhdmUgYSBwcm9qZWN0IG9uIGZvciBpbnN0YW5jZSBHaXRIdWIKKyMgYW5kIHdhbnQgdG8gcmV1c2UgdGhlIGludHJvZHVjdGlvbiBwYWdlIGFsc28gZm9yIHRoZSBkb3h5Z2VuIG91dHB1dC4KKworVVNFX01ERklMRV9BU19NQUlOUEFHRSA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHNvdXJjZSBicm93c2luZworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGEgbGlzdCBvZiBzb3VyY2UgZmlsZXMgd2lsbCBiZQorIyBnZW5lcmF0ZWQuIERvY3VtZW50ZWQgZW50aXRpZXMgd2lsbCBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggdGhlc2Ugc291cmNlcy4KKyMKKyMgTm90ZTogVG8gZ2V0IHJpZCBvZiBhbGwgc291cmNlIGNvZGUgaW4gdGhlIGdlbmVyYXRlZCBvdXRwdXQsIG1ha2Ugc3VyZSB0aGF0CisjIGFsc28gVkVSQkFUSU1fSEVBREVSUyBpcyBzZXQgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU09VUkNFX0JST1dTRVIgICAgICAgICA9IFlFUworCisjIFNldHRpbmcgdGhlIElOTElORV9TT1VSQ0VTIHRhZyB0byBZRVMgd2lsbCBpbmNsdWRlIHRoZSBib2R5IG9mIGZ1bmN0aW9ucywKKyMgY2xhc3NlcyBhbmQgZW51bXMgZGlyZWN0bHkgaW50byB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfU09VUkNFUyAgICAgICAgID0gTk8KKworIyBTZXR0aW5nIHRoZSBTVFJJUF9DT0RFX0NPTU1FTlRTIHRhZyB0byBZRVMgd2lsbCBpbnN0cnVjdCBkb3h5Z2VuIHRvIGhpZGUgYW55CisjIHNwZWNpYWwgY29tbWVudCBibG9ja3MgZnJvbSBnZW5lcmF0ZWQgc291cmNlIGNvZGUgZnJhZ21lbnRzLiBOb3JtYWwgQywgQysrIGFuZAorIyBGb3J0cmFuIGNvbW1lbnRzIHdpbGwgYWx3YXlzIHJlbWFpbiB2aXNpYmxlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTVFJJUF9DT0RFX0NPTU1FTlRTICAgID0gWUVTCisKKyMgSWYgdGhlIFJFRkVSRU5DRURfQllfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkCisjIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkIGZ1bmN0aW9ucyByZWZlcmVuY2luZyBpdCB3aWxsIGJlIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OID0gWUVTCisKKyMgSWYgdGhlIFJFRkVSRU5DRVNfUkVMQVRJT04gdGFnIGlzIHNldCB0byBZRVMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uCisjIGFsbCBkb2N1bWVudGVkIGVudGl0aWVzIGNhbGxlZC91c2VkIGJ5IHRoYXQgZnVuY3Rpb24gd2lsbCBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVGRVJFTkNFU19SRUxBVElPTiAgICA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VTX0xJTktfU09VUkNFIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0CisjIHRvIFlFUyB0aGVuIHRoZSBoeXBlcmxpbmtzIGZyb20gZnVuY3Rpb25zIGluIFJFRkVSRU5DRVNfUkVMQVRJT04gYW5kCisjIFJFRkVSRU5DRURfQllfUkVMQVRJT04gbGlzdHMgd2lsbCBsaW5rIHRvIHRoZSBzb3VyY2UgY29kZS4gT3RoZXJ3aXNlIHRoZXkgd2lsbAorIyBsaW5rIHRvIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitSRUZFUkVOQ0VTX0xJTktfU09VUkNFID0gWUVTCisKKyMgSWYgU09VUkNFX1RPT0xUSVBTIGlzIGVuYWJsZWQgKHRoZSBkZWZhdWx0KSB0aGVuIGhvdmVyaW5nIGEgaHlwZXJsaW5rIGluIHRoZQorIyBzb3VyY2UgY29kZSB3aWxsIHNob3cgYSB0b29sdGlwIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBzdWNoIGFzIHByb3RvdHlwZSwKKyMgYnJpZWYgZGVzY3JpcHRpb24gYW5kIGxpbmtzIHRvIHRoZSBkZWZpbml0aW9uIGFuZCBkb2N1bWVudGF0aW9uLiBTaW5jZSB0aGlzCisjIHdpbGwgbWFrZSB0aGUgSFRNTCBmaWxlIGxhcmdlciBhbmQgbG9hZGluZyBvZiBsYXJnZSBmaWxlcyBhIGJpdCBzbG93ZXIsIHlvdQorIyBjYW4gb3B0IHRvIGRpc2FibGUgdGhpcyBmZWF0dXJlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUy4KKworU09VUkNFX1RPT0xUSVBTICAgICAgICA9IFlFUworCisjIElmIHRoZSBVU0VfSFRBR1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgcmVmZXJlbmNlcyB0byBzb3VyY2UgY29kZSB3aWxsCisjIHBvaW50IHRvIHRoZSBIVE1MIGdlbmVyYXRlZCBieSB0aGUgaHRhZ3MoMSkgdG9vbCBpbnN0ZWFkIG9mIGRveHlnZW4gYnVpbHQtaW4KKyMgc291cmNlIGJyb3dzZXIuIFRoZSBodGFncyB0b29sIGlzIHBhcnQgb2YgR05VJ3MgZ2xvYmFsIHNvdXJjZSB0YWdnaW5nIHN5c3RlbQorIyAoc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nbG9iYWwvZ2xvYmFsLmh0bWwpLiBZb3Ugd2lsbCBuZWVkIHZlcnNpb24KKyMgNC44LjYgb3IgaGlnaGVyLgorIworIyBUbyB1c2UgaXQgZG8gdGhlIGZvbGxvd2luZzoKKyMgLSBJbnN0YWxsIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBnbG9iYWwKKyMgLSBFbmFibGUgU09VUkNFX0JST1dTRVIgYW5kIFVTRV9IVEFHUyBpbiB0aGUgY29uZmlnIGZpbGUKKyMgLSBNYWtlIHN1cmUgdGhlIElOUFVUIHBvaW50cyB0byB0aGUgcm9vdCBvZiB0aGUgc291cmNlIHRyZWUKKyMgLSBSdW4gZG94eWdlbiBhcyBub3JtYWwKKyMKKyMgRG94eWdlbiB3aWxsIGludm9rZSBodGFncyAoYW5kIHRoYXQgd2lsbCBpbiB0dXJuIGludm9rZSBndGFncyksIHNvIHRoZXNlCisjIHRvb2xzIG11c3QgYmUgYXZhaWxhYmxlIGZyb20gdGhlIGNvbW1hbmQgbGluZSAoaS5lLiBpbiB0aGUgc2VhcmNoIHBhdGgpLgorIworIyBUaGUgcmVzdWx0OiBpbnN0ZWFkIG9mIHRoZSBzb3VyY2UgYnJvd3NlciBnZW5lcmF0ZWQgYnkgZG94eWdlbiwgdGhlIGxpbmtzIHRvCisjIHNvdXJjZSBjb2RlIHdpbGwgbm93IHBvaW50IHRvIHRoZSBvdXRwdXQgb2YgaHRhZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMuCisKK1VTRV9IVEFHUyAgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBWRVJCQVRJTV9IRUFERVJTIHRhZyBpcyBzZXQgdGhlIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIHZlcmJhdGltIGNvcHkgb2YgdGhlIGhlYWRlciBmaWxlIGZvciBlYWNoIGNsYXNzIGZvciB3aGljaCBhbiBpbmNsdWRlIGlzCisjIHNwZWNpZmllZC4gU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKyMgU2VlIGFsc286IFNlY3Rpb24gXGNsYXNzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitWRVJCQVRJTV9IRUFERVJTICAgICAgID0gWUVTCisKKyMgSWYgdGhlIENMQU5HX0FTU0lTVEVEX1BBUlNJTkcgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgdXNlIHRoZQorIyBjbGFuZyBwYXJzZXIgKHNlZTogaHR0cDovL2NsYW5nLmxsdm0ub3JnLykgZm9yIG1vcmUgYWNjdXJhdGUgcGFyc2luZyBhdCB0aGUKKyMgY29zdCBvZiByZWR1Y2VkIHBlcmZvcm1hbmNlLiBUaGlzIGNhbiBiZSBwYXJ0aWN1bGFybHkgaGVscGZ1bCB3aXRoIHRlbXBsYXRlCisjIHJpY2ggQysrIGNvZGUgZm9yIHdoaWNoIGRveHlnZW4ncyBidWlsdC1pbiBwYXJzZXIgbGFja3MgdGhlIG5lY2Vzc2FyeSB0eXBlCisjIGluZm9ybWF0aW9uLgorIyBOb3RlOiBUaGUgYXZhaWxhYmlsaXR5IG9mIHRoaXMgb3B0aW9uIGRlcGVuZHMgb24gd2hldGhlciBvciBub3QgZG94eWdlbiB3YXMKKyMgZ2VuZXJhdGVkIHdpdGggdGhlIC1EdXNlLWxpYmNsYW5nPU9OIG9wdGlvbiBmb3IgQ01ha2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQ0xBTkdfQVNTSVNURURfUEFSU0lORyA9IFlFUworCisjIElmIGNsYW5nIGFzc2lzdGVkIHBhcnNpbmcgaXMgZW5hYmxlZCB5b3UgY2FuIHByb3ZpZGUgdGhlIGNvbXBpbGVyIHdpdGggY29tbWFuZAorIyBsaW5lIG9wdGlvbnMgdGhhdCB5b3Ugd291bGQgbm9ybWFsbHkgdXNlIHdoZW4gaW52b2tpbmcgdGhlIGNvbXBpbGVyLiBOb3RlIHRoYXQKKyMgdGhlIGluY2x1ZGUgcGF0aHMgd2lsbCBhbHJlYWR5IGJlIHNldCBieSBkb3h5Z2VuIGZvciB0aGUgZmlsZXMgYW5kIGRpcmVjdG9yaWVzCisjIHNwZWNpZmllZCB3aXRoIElOUFVUIGFuZCBJTkNMVURFX1BBVEguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBDTEFOR19BU1NJU1RFRF9QQVJTSU5HIGlzIHNldCB0byBZRVMuCisKK0NMQU5HX09QVElPTlMgICAgICAgICAgPSAtc3RkPWMrKzE0CisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGFscGhhYmV0aWNhbCBjbGFzcyBpbmRleAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBBTFBIQUJFVElDQUxfSU5ERVggdGFnIGlzIHNldCB0byBZRVMsIGFuIGFscGhhYmV0aWNhbCBpbmRleCBvZiBhbGwKKyMgY29tcG91bmRzIHdpbGwgYmUgZ2VuZXJhdGVkLiBFbmFibGUgdGhpcyBpZiB0aGUgcHJvamVjdCBjb250YWlucyBhIGxvdCBvZgorIyBjbGFzc2VzLCBzdHJ1Y3RzLCB1bmlvbnMgb3IgaW50ZXJmYWNlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQUxQSEFCRVRJQ0FMX0lOREVYICAgICA9IFlFUworCisjIFRoZSBDT0xTX0lOX0FMUEhBX0lOREVYIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBudW1iZXIgb2YgY29sdW1ucyBpbgorIyB3aGljaCB0aGUgYWxwaGFiZXRpY2FsIGluZGV4IGxpc3Qgd2lsbCBiZSBzcGxpdC4KKyMgTWluaW11bSB2YWx1ZTogMSwgbWF4aW11bSB2YWx1ZTogMjAsIGRlZmF1bHQgdmFsdWU6IDUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBBTFBIQUJFVElDQUxfSU5ERVggaXMgc2V0IHRvIFlFUy4KKworQ09MU19JTl9BTFBIQV9JTkRFWCAgICA9IDUKKworIyBJbiBjYXNlIGFsbCBjbGFzc2VzIGluIGEgcHJvamVjdCBzdGFydCB3aXRoIGEgY29tbW9uIHByZWZpeCwgYWxsIGNsYXNzZXMgd2lsbAorIyBiZSBwdXQgdW5kZXIgdGhlIHNhbWUgaGVhZGVyIGluIHRoZSBhbHBoYWJldGljYWwgaW5kZXguIFRoZSBJR05PUkVfUFJFRklYIHRhZworIyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcHJlZml4IChvciBhIGxpc3Qgb2YgcHJlZml4ZXMpIHRoYXQgc2hvdWxkIGJlIGlnbm9yZWQKKyMgd2hpbGUgZ2VuZXJhdGluZyB0aGUgaW5kZXggaGVhZGVycy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEFMUEhBQkVUSUNBTF9JTkRFWCBpcyBzZXQgdG8gWUVTLgorCitJR05PUkVfUFJFRklYICAgICAgICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIEhUTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUwgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBIVE1MIG91dHB1dAorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9IVE1MICAgICAgICAgID0gWUVTCisKKyMgVGhlIEhUTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIEhUTUwgZG9jcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogaHRtbC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9PVVRQVVQgICAgICAgICAgICA9IGh0bWwKKworIyBUaGUgSFRNTF9GSUxFX0VYVEVOU0lPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBleHRlbnNpb24gZm9yIGVhY2gKKyMgZ2VuZXJhdGVkIEhUTUwgcGFnZSAoZm9yIGV4YW1wbGU6IC5odG0sIC5waHAsIC5hc3ApLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogLmh0bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRklMRV9FWFRFTlNJT04gICAgPSAuaHRtbAorCisjIFRoZSBIVE1MX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBIVE1MIGhlYWRlciBmaWxlIGZvcgorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIHRoZSB0YWcgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBzdGFuZGFyZCBoZWFkZXIuCisjCisjIFRvIGdldCB2YWxpZCBIVE1MIHRoZSBoZWFkZXIgZmlsZSB0aGF0IGluY2x1ZGVzIGFueSBzY3JpcHRzIGFuZCBzdHlsZSBzaGVldHMKKyMgdGhhdCBkb3h5Z2VuIG5lZWRzLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB1c2VkIChlLmcuCisjIHRoZSBzZXR0aW5nIEdFTkVSQVRFX1RSRUVWSUVXKS4gSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHN0YXJ0IHdpdGggYQorIyBkZWZhdWx0IGhlYWRlciB1c2luZworIyBkb3h5Z2VuIC13IGh0bWwgbmV3X2hlYWRlci5odG1sIG5ld19mb290ZXIuaHRtbCBuZXdfc3R5bGVzaGVldC5jc3MKKyMgWW91ckNvbmZpZ0ZpbGUKKyMgYW5kIHRoZW4gbW9kaWZ5IHRoZSBmaWxlIG5ld19oZWFkZXIuaHRtbC4gU2VlIGFsc28gc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIKKyMgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCBoZWFkZXIgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5CisjIHVzZXMuCisjIE5vdGU6IFRoZSBoZWFkZXIgaXMgc3ViamVjdCB0byBjaGFuZ2Ugc28geW91IHR5cGljYWxseSBoYXZlIHRvIHJlZ2VuZXJhdGUgdGhlCisjIGRlZmF1bHQgaGVhZGVyIHdoZW4gdXBncmFkaW5nIHRvIGEgbmV3ZXIgdmVyc2lvbiBvZiBkb3h5Z2VuLiBGb3IgYSBkZXNjcmlwdGlvbgorIyBvZiB0aGUgcG9zc2libGUgbWFya2VycyBhbmQgYmxvY2sgbmFtZXMgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0hFQURFUiAgICAgICAgICAgID0gCisKKyMgVGhlIEhUTUxfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIEhUTUwgZm9vdGVyIGZvciBlYWNoCisjIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIHRoZSB0YWcgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZAorIyBmb290ZXIuIFNlZSBIVE1MX0hFQURFUiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgYSBkZWZhdWx0CisjIGZvb3RlciBhbmQgd2hhdCBzcGVjaWFsIGNvbW1hbmRzIGNhbiBiZSB1c2VkIGluc2lkZSB0aGUgZm9vdGVyLiBTZWUgYWxzbworIyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZSBkZWZhdWx0IGZvb3RlcgorIyB0aGF0IGRveHlnZW4gbm9ybWFsbHkgdXNlcy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9GT09URVIgICAgICAgICAgICA9IAorCisjIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nIHN0eWxlCisjIHNoZWV0IHRoYXQgaXMgdXNlZCBieSBlYWNoIEhUTUwgcGFnZS4gSXQgY2FuIGJlIHVzZWQgdG8gZmluZS10dW5lIHRoZSBsb29rIG9mCisjIHRoZSBIVE1MIG91dHB1dC4gSWYgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBkZWZhdWx0IHN0eWxlIHNoZWV0LgorIyBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZSBzdHlsZQorIyBzaGVldCB0aGF0IGRveHlnZW4gbm9ybWFsbHkgdXNlcy4KKyMgTm90ZTogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCBpbnN0ZWFkIG9mIHRoaXMgdGFnLCBhcworIyBpdCBpcyBtb3JlIHJvYnVzdCBhbmQgdGhpcyB0YWcgKEhUTUxfU1RZTEVTSEVFVCkgd2lsbCBpbiB0aGUgZnV0dXJlIGJlY29tZQorIyBvYnNvbGV0ZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9TVFlMRVNIRUVUICAgICAgICA9IAorCisjIFRoZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYWRkaXRpb25hbCB1c2VyLWRlZmluZWQKKyMgY2FzY2FkaW5nIHN0eWxlIHNoZWV0cyB0aGF0IGFyZSBpbmNsdWRlZCBhZnRlciB0aGUgc3RhbmRhcmQgc3R5bGUgc2hlZXRzCisjIGNyZWF0ZWQgYnkgZG94eWdlbi4gVXNpbmcgdGhpcyBvcHRpb24gb25lIGNhbiBvdmVycnVsZSBjZXJ0YWluIHN0eWxlIGFzcGVjdHMuCisjIFRoaXMgaXMgcHJlZmVycmVkIG92ZXIgdXNpbmcgSFRNTF9TVFlMRVNIRUVUIHNpbmNlIGl0IGRvZXMgbm90IHJlcGxhY2UgdGhlCisjIHN0YW5kYXJkIHN0eWxlIHNoZWV0IGFuZCBpcyB0aGVyZWZvcmUgbW9yZSByb2J1c3QgYWdhaW5zdCBmdXR1cmUgdXBkYXRlcy4KKyMgRG94eWdlbiB3aWxsIGNvcHkgdGhlIHN0eWxlIHNoZWV0IGZpbGVzIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorIyBOb3RlOiBUaGUgb3JkZXIgb2YgdGhlIGV4dHJhIHN0eWxlIHNoZWV0IGZpbGVzIGlzIG9mIGltcG9ydGFuY2UgKGUuZy4gdGhlIGxhc3QKKyMgc3R5bGUgc2hlZXQgaW4gdGhlIGxpc3Qgb3ZlcnJ1bGVzIHRoZSBzZXR0aW5nIG9mIHRoZSBwcmV2aW91cyBvbmVzIGluIHRoZQorIyBsaXN0KS4gRm9yIGFuIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0VYVFJBX1NUWUxFU0hFRVQgID0gCisKKyMgVGhlIEhUTUxfRVhUUkFfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZXh0cmEgaW1hZ2VzIG9yCisjIG90aGVyIHNvdXJjZSBmaWxlcyB3aGljaCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIE5vdGUKKyMgdGhhdCB0aGVzZSBmaWxlcyB3aWxsIGJlIGNvcGllZCB0byB0aGUgYmFzZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFVzZSB0aGUKKyMgJHJlbHBhdGheIG1hcmtlciBpbiB0aGUgSFRNTF9IRUFERVIgYW5kL29yIEhUTUxfRk9PVEVSIGZpbGVzIHRvIGxvYWQgdGhlc2UKKyMgZmlsZXMuIEluIHRoZSBIVE1MX1NUWUxFU0hFRVQgZmlsZSwgdXNlIHRoZSBmaWxlIG5hbWUgb25seS4gQWxzbyBub3RlIHRoYXQgdGhlCisjIGZpbGVzIHdpbGwgYmUgY29waWVkIGFzLWlzOyB0aGVyZSBhcmUgbm8gY29tbWFuZHMgb3IgbWFya2VycyBhdmFpbGFibGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRVhUUkFfRklMRVMgICAgICAgPSAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0hVRSB0YWcgY29udHJvbHMgdGhlIGNvbG9yIG9mIHRoZSBIVE1MIG91dHB1dC4gRG94eWdlbgorIyB3aWxsIGFkanVzdCB0aGUgY29sb3JzIGluIHRoZSBzdHlsZSBzaGVldCBhbmQgYmFja2dyb3VuZCBpbWFnZXMgYWNjb3JkaW5nIHRvCisjIHRoaXMgY29sb3IuIEh1ZSBpcyBzcGVjaWZpZWQgYXMgYW4gYW5nbGUgb24gYSBjb2xvcndoZWVsLCBzZWUKKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9IdWUgZm9yIG1vcmUgaW5mb3JtYXRpb24uIEZvciBpbnN0YW5jZSB0aGUgdmFsdWUKKyMgMCByZXByZXNlbnRzIHJlZCwgNjAgaXMgeWVsbG93LCAxMjAgaXMgZ3JlZW4sIDE4MCBpcyBjeWFuLCAyNDAgaXMgYmx1ZSwgMzAwCisjIHB1cnBsZSwgYW5kIDM2MCBpcyByZWQgYWdhaW4uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDM1OSwgZGVmYXVsdCB2YWx1ZTogMjIwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0NPTE9SU1RZTEVfSFVFICAgID0gMjIwCisKKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9TQVQgdGFnIGNvbnRyb2xzIHRoZSBwdXJpdHkgKG9yIHNhdHVyYXRpb24pIG9mIHRoZSBjb2xvcnMKKyMgaW4gdGhlIEhUTUwgb3V0cHV0LiBGb3IgYSB2YWx1ZSBvZiAwIHRoZSBvdXRwdXQgd2lsbCB1c2UgZ3JheXNjYWxlcyBvbmx5LiBBCisjIHZhbHVlIG9mIDI1NSB3aWxsIHByb2R1Y2UgdGhlIG1vc3Qgdml2aWQgY29sb3JzLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAyNTUsIGRlZmF1bHQgdmFsdWU6IDEwMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX1NBVCAgICA9IDEwMAorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfR0FNTUEgdGFnIGNvbnRyb2xzIHRoZSBnYW1tYSBjb3JyZWN0aW9uIGFwcGxpZWQgdG8gdGhlCisjIGx1bWluYW5jZSBjb21wb25lbnQgb2YgdGhlIGNvbG9ycyBpbiB0aGUgSFRNTCBvdXRwdXQuIFZhbHVlcyBiZWxvdyAxMDAKKyMgZ3JhZHVhbGx5IG1ha2UgdGhlIG91dHB1dCBsaWdodGVyLCB3aGVyZWFzIHZhbHVlcyBhYm92ZSAxMDAgbWFrZSB0aGUgb3V0cHV0CisjIGRhcmtlci4gVGhlIHZhbHVlIGRpdmlkZWQgYnkgMTAwIGlzIHRoZSBhY3R1YWwgZ2FtbWEgYXBwbGllZCwgc28gODAgcmVwcmVzZW50cworIyBhIGdhbW1hIG9mIDAuOCwgVGhlIHZhbHVlIDIyMCByZXByZXNlbnRzIGEgZ2FtbWEgb2YgMi4yLCBhbmQgMTAwIGRvZXMgbm90CisjIGNoYW5nZSB0aGUgZ2FtbWEuCisjIE1pbmltdW0gdmFsdWU6IDQwLCBtYXhpbXVtIHZhbHVlOiAyNDAsIGRlZmF1bHQgdmFsdWU6IDgwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0NPTE9SU1RZTEVfR0FNTUEgID0gODAKKworIyBJZiB0aGUgSFRNTF9USU1FU1RBTVAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZm9vdGVyIG9mIGVhY2ggZ2VuZXJhdGVkIEhUTUwKKyMgcGFnZSB3aWxsIGNvbnRhaW4gdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcGFnZSB3YXMgZ2VuZXJhdGVkLiBTZXR0aW5nIHRoaXMKKyMgdG8gWUVTIGNhbiBoZWxwIHRvIHNob3cgd2hlbiBkb3h5Z2VuIHdhcyBsYXN0IHJ1biBhbmQgdGh1cyBpZiB0aGUKKyMgZG9jdW1lbnRhdGlvbiBpcyB1cCB0byBkYXRlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfVElNRVNUQU1QICAgICAgICAgPSBOTworCisjIElmIHRoZSBIVE1MX0RZTkFNSUNfU0VDVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZ2VuZXJhdGVkIEhUTUwKKyMgZG9jdW1lbnRhdGlvbiB3aWxsIGNvbnRhaW4gc2VjdGlvbnMgdGhhdCBjYW4gYmUgaGlkZGVuIGFuZCBzaG93biBhZnRlciB0aGUKKyMgcGFnZSBoYXMgbG9hZGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRFlOQU1JQ19TRUNUSU9OUyAgPSBZRVMKKworIyBXaXRoIEhUTUxfSU5ERVhfTlVNX0VOVFJJRVMgb25lIGNhbiBjb250cm9sIHRoZSBwcmVmZXJyZWQgbnVtYmVyIG9mIGVudHJpZXMKKyMgc2hvd24gaW4gdGhlIHZhcmlvdXMgdHJlZSBzdHJ1Y3R1cmVkIGluZGljZXMgaW5pdGlhbGx5OyB0aGUgdXNlciBjYW4gZXhwYW5kCisjIGFuZCBjb2xsYXBzZSBlbnRyaWVzIGR5bmFtaWNhbGx5IGxhdGVyIG9uLiBEb3h5Z2VuIHdpbGwgZXhwYW5kIHRoZSB0cmVlIHRvCisjIHN1Y2ggYSBsZXZlbCB0aGF0IGF0IG1vc3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgZW50cmllcyBhcmUgdmlzaWJsZSAodW5sZXNzCisjIGEgZnVsbHkgY29sbGFwc2VkIHRyZWUgYWxyZWFkeSBleGNlZWRzIHRoaXMgYW1vdW50KS4gU28gc2V0dGluZyB0aGUgbnVtYmVyIG9mCisjIGVudHJpZXMgMSB3aWxsIHByb2R1Y2UgYSBmdWxsIGNvbGxhcHNlZCB0cmVlIGJ5IGRlZmF1bHQuIDAgaXMgYSBzcGVjaWFsIHZhbHVlCisjIHJlcHJlc2VudGluZyBhbiBpbmZpbml0ZSBudW1iZXIgb2YgZW50cmllcyBhbmQgd2lsbCByZXN1bHQgaW4gYSBmdWxsIGV4cGFuZGVkCisjIHRyZWUgYnkgZGVmYXVsdC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogOTk5OSwgZGVmYXVsdCB2YWx1ZTogMTAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0lOREVYX05VTV9FTlRSSUVTID0gMTAwCisKKyMgSWYgdGhlIEdFTkVSQVRFX0RPQ1NFVCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcyB3aWxsIGJlCisjIGdlbmVyYXRlZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBBcHBsZSdzIFhjb2RlIDMgaW50ZWdyYXRlZCBkZXZlbG9wbWVudAorIyBlbnZpcm9ubWVudCAoc2VlOiBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS90b29scy94Y29kZS8pLCBpbnRyb2R1Y2VkIHdpdGgKKyMgT1NYIDEwLjUgKExlb3BhcmQpLiBUbyBjcmVhdGUgYSBkb2N1bWVudGF0aW9uIHNldCwgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgTWFrZWZpbGUgaW4gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gUnVubmluZyBtYWtlIHdpbGwgcHJvZHVjZSB0aGUgZG9jc2V0IGluCisjIHRoYXQgZGlyZWN0b3J5IGFuZCBydW5uaW5nIG1ha2UgaW5zdGFsbCB3aWxsIGluc3RhbGwgdGhlIGRvY3NldCBpbgorIyB+L0xpYnJhcnkvRGV2ZWxvcGVyL1NoYXJlZC9Eb2N1bWVudGF0aW9uL0RvY1NldHMgc28gdGhhdCBYY29kZSB3aWxsIGZpbmQgaXQgYXQKKyMgc3RhcnR1cC4gU2VlIGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL2NyZWF0aW5nZG9jc2V0c3dpdGhkb3h5Z2VuLmh0bWwKKyMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfRE9DU0VUICAgICAgICA9IE5PCisKKyMgVGhpcyB0YWcgZGV0ZXJtaW5lcyB0aGUgbmFtZSBvZiB0aGUgZG9jc2V0IGZlZWQuIEEgZG9jdW1lbnRhdGlvbiBmZWVkIHByb3ZpZGVzCisjIGFuIHVtYnJlbGxhIHVuZGVyIHdoaWNoIG11bHRpcGxlIGRvY3VtZW50YXRpb24gc2V0cyBmcm9tIGEgc2luZ2xlIHByb3ZpZGVyCisjIChzdWNoIGFzIGEgY29tcGFueSBvciBwcm9kdWN0IHN1aXRlKSBjYW4gYmUgZ3JvdXBlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IERveHlnZW4gZ2VuZXJhdGVkIGRvY3MuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KKworRE9DU0VUX0ZFRUROQU1FICAgICAgICA9ICJEb3h5Z2VuIGdlbmVyYXRlZCBkb2NzIgorCisjIFRoaXMgdGFnIHNwZWNpZmllcyBhIHN0cmluZyB0aGF0IHNob3VsZCB1bmlxdWVseSBpZGVudGlmeSB0aGUgZG9jdW1lbnRhdGlvbgorIyBzZXQgYnVuZGxlLiBUaGlzIHNob3VsZCBiZSBhIHJldmVyc2UgZG9tYWluLW5hbWUgc3R5bGUgc3RyaW5nLCBlLmcuCisjIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuIERveHlnZW4gd2lsbCBhcHBlbmQgLmRvY3NldCB0byB0aGUgbmFtZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KKworRE9DU0VUX0JVTkRMRV9JRCAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBUaGUgRE9DU0VUX1BVQkxJU0hFUl9JRCB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5CisjIHRoZSBkb2N1bWVudGF0aW9uIHB1Ymxpc2hlci4gVGhpcyBzaG91bGQgYmUgYSByZXZlcnNlIGRvbWFpbi1uYW1lIHN0eWxlCisjIHN0cmluZywgZS5nLiBjb20ubXljb21wYW55Lk15RG9jU2V0LmRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5QdWJsaXNoZXIuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KKworRE9DU0VUX1BVQkxJU0hFUl9JRCAgICA9IG9yZy5kb3h5Z2VuLlB1Ymxpc2hlcgorCisjIFRoZSBET0NTRVRfUFVCTElTSEVSX05BTUUgdGFnIGlkZW50aWZpZXMgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogUHVibGlzaGVyLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRE9DU0VUIGlzIHNldCB0byBZRVMuCisKK0RPQ1NFVF9QVUJMSVNIRVJfTkFNRSAgPSBQdWJsaXNoZXIKKworIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIGdlbmVyYXRlcyB0aHJlZQorIyBhZGRpdGlvbmFsIEhUTUwgaW5kZXggZmlsZXM6IGluZGV4LmhocCwgaW5kZXguaGhjLCBhbmQgaW5kZXguaGhrLiBUaGUKKyMgaW5kZXguaGhwIGlzIGEgcHJvamVjdCBmaWxlIHRoYXQgY2FuIGJlIHJlYWQgYnkgTWljcm9zb2Z0J3MgSFRNTCBIZWxwIFdvcmtzaG9wCisjIChzZWU6IGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS9lbi11cy9kb3dubG9hZC9kZXRhaWxzLmFzcHg/aWQ9MjExMzgpIG9uCisjIFdpbmRvd3MuCisjCisjIFRoZSBIVE1MIEhlbHAgV29ya3Nob3AgY29udGFpbnMgYSBjb21waWxlciB0aGF0IGNhbiBjb252ZXJ0IGFsbCBIVE1MIG91dHB1dAorIyBnZW5lcmF0ZWQgYnkgZG94eWdlbiBpbnRvIGEgc2luZ2xlIGNvbXBpbGVkIEhUTUwgZmlsZSAoLmNobSkuIENvbXBpbGVkIEhUTUwKKyMgZmlsZXMgYXJlIG5vdyB1c2VkIGFzIHRoZSBXaW5kb3dzIDk4IGhlbHAgZm9ybWF0LCBhbmQgd2lsbCByZXBsYWNlIHRoZSBvbGQKKyMgV2luZG93cyBoZWxwIGZvcm1hdCAoLmhscCkgb24gYWxsIFdpbmRvd3MgcGxhdGZvcm1zIGluIHRoZSBmdXR1cmUuIENvbXByZXNzZWQKKyMgSFRNTCBmaWxlcyBhbHNvIGNvbnRhaW4gYW4gaW5kZXgsIGEgdGFibGUgb2YgY29udGVudHMsIGFuZCB5b3UgY2FuIHNlYXJjaCBmb3IKKyMgd29yZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZSBIVE1MIHdvcmtzaG9wIGFsc28gY29udGFpbnMgYSB2aWV3ZXIgZm9yCisjIGNvbXByZXNzZWQgSFRNTCBmaWxlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9IVE1MSEVMUCAgICAgID0gTk8KKworIyBUaGUgQ0hNX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5jaG0KKyMgZmlsZS4gWW91IGNhbiBhZGQgYSBwYXRoIGluIGZyb250IG9mIHRoZSBmaWxlIGlmIHRoZSByZXN1bHQgc2hvdWxkIG5vdCBiZQorIyB3cml0dGVuIHRvIHRoZSBodG1sIG91dHB1dCBkaXJlY3RvcnkuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitDSE1fRklMRSAgICAgICAgICAgICAgID0gCisKKyMgVGhlIEhIQ19MT0NBVElPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gKGFic29sdXRlIHBhdGgKKyMgaW5jbHVkaW5nIGZpbGUgbmFtZSkgb2YgdGhlIEhUTUwgaGVscCBjb21waWxlciAoaGhjLmV4ZSkuIElmIG5vbi1lbXB0eSwKKyMgZG94eWdlbiB3aWxsIHRyeSB0byBydW4gdGhlIEhUTUwgaGVscCBjb21waWxlciBvbiB0aGUgZ2VuZXJhdGVkIGluZGV4LmhocC4KKyMgVGhlIGZpbGUgaGFzIHRvIGJlIHNwZWNpZmllZCB3aXRoIGZ1bGwgcGF0aC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0hIQ19MT0NBVElPTiAgICAgICAgICAgPSAKKworIyBUaGUgR0VORVJBVEVfQ0hJIGZsYWcgY29udHJvbHMgaWYgYSBzZXBhcmF0ZSAuY2hpIGluZGV4IGZpbGUgaXMgZ2VuZXJhdGVkCisjIChZRVMpIG9yIHRoYXQgaXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBtYXN0ZXIgLmNobSBmaWxlIChOTykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0NISSAgICAgICAgICAgPSBOTworCisjIFRoZSBDSE1fSU5ERVhfRU5DT0RJTkcgaXMgdXNlZCB0byBlbmNvZGUgSHRtbEhlbHAgaW5kZXggKGhoayksIGNvbnRlbnQgKGhoYykKKyMgYW5kIHByb2plY3QgZmlsZSBjb250ZW50LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQ0hNX0lOREVYX0VOQ09ESU5HICAgICA9IAorCisjIFRoZSBCSU5BUllfVE9DIGZsYWcgY29udHJvbHMgd2hldGhlciBhIGJpbmFyeSB0YWJsZSBvZiBjb250ZW50cyBpcyBnZW5lcmF0ZWQKKyMgKFlFUykgb3IgYSBub3JtYWwgdGFibGUgb2YgY29udGVudHMgKE5PKSBpbiB0aGUgLmNobSBmaWxlLiBGdXJ0aGVybW9yZSBpdAorIyBlbmFibGVzIHRoZSBQcmV2aW91cyBhbmQgTmV4dCBidXR0b25zLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitCSU5BUllfVE9DICAgICAgICAgICAgID0gTk8KKworIyBUaGUgVE9DX0VYUEFORCBmbGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIGFkZCBleHRyYSBpdGVtcyBmb3IgZ3JvdXAgbWVtYmVycyB0bworIyB0aGUgdGFibGUgb2YgY29udGVudHMgb2YgdGhlIEhUTUwgaGVscCBkb2N1bWVudGF0aW9uIGFuZCB0byB0aGUgdHJlZSB2aWV3LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitUT0NfRVhQQU5EICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfUUhQIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBib3RoIFFIUF9OQU1FU1BBQ0UgYW5kCisjIFFIUF9WSVJUVUFMX0ZPTERFUiBhcmUgc2V0LCBhbiBhZGRpdGlvbmFsIGluZGV4IGZpbGUgd2lsbCBiZSBnZW5lcmF0ZWQgdGhhdAorIyBjYW4gYmUgdXNlZCBhcyBpbnB1dCBmb3IgUXQncyBxaGVscGdlbmVyYXRvciB0byBnZW5lcmF0ZSBhIFF0IENvbXByZXNzZWQgSGVscAorIyAoLnFjaCkgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfUUhQICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFFIR19MT0NBVElPTiB0YWcgaXMgc3BlY2lmaWVkLCB0aGUgUUNIX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkKKyMgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5xY2ggZmlsZS4gVGhlIHBhdGggc3BlY2lmaWVkIGlzIHJlbGF0aXZlIHRvCisjIHRoZSBIVE1MIG91dHB1dCBmb2xkZXIuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUNIX0ZJTEUgICAgICAgICAgICAgICA9IAorCisjIFRoZSBRSFBfTkFNRVNQQUNFIHRhZyBzcGVjaWZpZXMgdGhlIG5hbWVzcGFjZSB0byB1c2Ugd2hlbiBnZW5lcmF0aW5nIFF0IEhlbHAKKyMgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gTmFtZXNwYWNlCisjIChzZWU6IGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNuYW1lc3BhY2UpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfTkFNRVNQQUNFICAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIFRoZSBRSFBfVklSVFVBTF9GT0xERVIgdGFnIHNwZWNpZmllcyB0aGUgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgUXQKKyMgSGVscCBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBWaXJ0dWFsCisjIEZvbGRlcnMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI3ZpcnR1YWwtCisjIGZvbGRlcnMpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogZG9jLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9WSVJUVUFMX0ZPTERFUiAgICAgPSBkb2MKKworIyBJZiB0aGUgUUhQX0NVU1RfRklMVEVSX05BTUUgdGFnIGlzIHNldCwgaXQgc3BlY2lmaWVzIHRoZSBuYW1lIG9mIGEgY3VzdG9tCisjIGZpbHRlciB0byBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gQ3VzdG9tCisjIEZpbHRlcnMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS0KKyMgZmlsdGVycykuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX0NVU1RfRklMVEVSX05BTUUgICA9IAorCisjIFRoZSBRSFBfQ1VTVF9GSUxURVJfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyBvZiB0aGUKKyMgY3VzdG9tIGZpbHRlciB0byBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUgUXQgSGVscCBQcm9qZWN0IC8gQ3VzdG9tCisjIEZpbHRlcnMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI2N1c3RvbS0KKyMgZmlsdGVycykuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX0NVU1RfRklMVEVSX0FUVFJTICA9IAorCisjIFRoZSBRSFBfU0VDVF9GSUxURVJfQVRUUlMgdGFnIHNwZWNpZmllcyB0aGUgbGlzdCBvZiB0aGUgYXR0cmlidXRlcyB0aGlzCisjIHByb2plY3QncyBmaWx0ZXIgc2VjdGlvbiBtYXRjaGVzLiBRdCBIZWxwIFByb2plY3QgLyBGaWx0ZXIgQXR0cmlidXRlcyAoc2VlOgorIyBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjZmlsdGVyLWF0dHJpYnV0ZXMpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9TRUNUX0ZJTFRFUl9BVFRSUyAgPSAKKworIyBUaGUgUUhHX0xPQ0FUSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiBvZiBRdCdzCisjIHFoZWxwZ2VuZXJhdG9yLiBJZiBub24tZW1wdHkgZG94eWdlbiB3aWxsIHRyeSB0byBydW4gcWhlbHBnZW5lcmF0b3Igb24gdGhlCisjIGdlbmVyYXRlZCAucWhwIGZpbGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhHX0xPQ0FUSU9OICAgICAgICAgICA9IAorCisjIElmIHRoZSBHRU5FUkFURV9FQ0xJUFNFSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgYWRkaXRpb25hbCBpbmRleCBmaWxlcyB3aWxsIGJlCisjIGdlbmVyYXRlZCwgdG9nZXRoZXIgd2l0aCB0aGUgSFRNTCBmaWxlcywgdGhleSBmb3JtIGFuIEVjbGlwc2UgaGVscCBwbHVnaW4uIFRvCisjIGluc3RhbGwgdGhpcyBwbHVnaW4gYW5kIG1ha2UgaXQgYXZhaWxhYmxlIHVuZGVyIHRoZSBoZWxwIGNvbnRlbnRzIG1lbnUgaW4KKyMgRWNsaXBzZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MIGZpbGVzIG5lZWRzCisjIHRvIGJlIGNvcGllZCBpbnRvIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBvZiBlY2xpcHNlLiBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5CisjIHdpdGhpbiB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBFQ0xJUFNFX0RPQ19JRCB2YWx1ZS4KKyMgQWZ0ZXIgY29weWluZyBFY2xpcHNlIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCBiZWZvcmUgdGhlIGhlbHAgYXBwZWFycy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9FQ0xJUFNFSEVMUCAgID0gTk8KKworIyBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgRWNsaXBzZSBoZWxwIHBsdWdpbi4gV2hlbiBpbnN0YWxsaW5nIHRoZSBwbHVnaW4KKyMgdGhlIGRpcmVjdG9yeSBuYW1lIGNvbnRhaW5pbmcgdGhlIEhUTUwgYW5kIFhNTCBmaWxlcyBzaG91bGQgYWxzbyBoYXZlIHRoaXMKKyMgbmFtZS4gRWFjaCBkb2N1bWVudGF0aW9uIHNldCBzaG91bGQgaGF2ZSBpdHMgb3duIGlkZW50aWZpZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5Qcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfRUNMSVBTRUhFTFAgaXMgc2V0IHRvIFlFUy4KKworRUNMSVBTRV9ET0NfSUQgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QKKworIyBJZiB5b3Ugd2FudCBmdWxsIGNvbnRyb2wgb3ZlciB0aGUgbGF5b3V0IG9mIHRoZSBnZW5lcmF0ZWQgSFRNTCBwYWdlcyBpdCBtaWdodAorIyBiZSBuZWNlc3NhcnkgdG8gZGlzYWJsZSB0aGUgaW5kZXggYW5kIHJlcGxhY2UgaXQgd2l0aCB5b3VyIG93bi4gVGhlCisjIERJU0FCTEVfSU5ERVggdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSBjb25kZW5zZWQgaW5kZXggKHRhYnMpIGF0IHRvcAorIyBvZiBlYWNoIEhUTUwgcGFnZS4gQSB2YWx1ZSBvZiBOTyBlbmFibGVzIHRoZSBpbmRleCBhbmQgdGhlIHZhbHVlIFlFUyBkaXNhYmxlcworIyBpdC4gU2luY2UgdGhlIHRhYnMgaW4gdGhlIGluZGV4IGNvbnRhaW4gdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIG5hdmlnYXRpb24KKyMgdHJlZSwgeW91IGNhbiBzZXQgdGhpcyBvcHRpb24gdG8gWUVTIGlmIHlvdSBhbHNvIHNldCBHRU5FUkFURV9UUkVFVklFVyB0byBZRVMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRElTQUJMRV9JTkRFWCAgICAgICAgICA9IE5PCisKKyMgVGhlIEdFTkVSQVRFX1RSRUVWSUVXIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBhIHRyZWUtbGlrZSBpbmRleAorIyBzdHJ1Y3R1cmUgc2hvdWxkIGJlIGdlbmVyYXRlZCB0byBkaXNwbGF5IGhpZXJhcmNoaWNhbCBpbmZvcm1hdGlvbi4gSWYgdGhlIHRhZworIyB2YWx1ZSBpcyBzZXQgdG8gWUVTLCBhIHNpZGUgcGFuZWwgd2lsbCBiZSBnZW5lcmF0ZWQgY29udGFpbmluZyBhIHRyZWUtbGlrZQorIyBpbmRleCBzdHJ1Y3R1cmUgKGp1c3QgbGlrZSB0aGUgb25lIHRoYXQgaXMgZ2VuZXJhdGVkIGZvciBIVE1MIEhlbHApLiBGb3IgdGhpcworIyB0byB3b3JrIGEgYnJvd3NlciB0aGF0IHN1cHBvcnRzIEphdmFTY3JpcHQsIERIVE1MLCBDU1MgYW5kIGZyYW1lcyBpcyByZXF1aXJlZAorIyAoaS5lLiBhbnkgbW9kZXJuIGJyb3dzZXIpLiBXaW5kb3dzIHVzZXJzIGFyZSBwcm9iYWJseSBiZXR0ZXIgb2ZmIHVzaW5nIHRoZQorIyBIVE1MIGhlbHAgZmVhdHVyZS4gVmlhIGN1c3RvbSBzdHlsZSBzaGVldHMgKHNlZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQpIG9uZSBjYW4KKyMgZnVydGhlciBmaW5lLXR1bmUgdGhlIGxvb2sgb2YgdGhlIGluZGV4LiBBcyBhbiBleGFtcGxlLCB0aGUgZGVmYXVsdCBzdHlsZQorIyBzaGVldCBnZW5lcmF0ZWQgYnkgZG94eWdlbiBoYXMgYW4gZXhhbXBsZSB0aGF0IHNob3dzIGhvdyB0byBwdXQgYW4gaW1hZ2UgYXQKKyMgdGhlIHJvb3Qgb2YgdGhlIHRyZWUgaW5zdGVhZCBvZiB0aGUgUFJPSkVDVF9OQU1FLiBTaW5jZSB0aGUgdHJlZSBiYXNpY2FsbHkgaGFzCisjIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZSB0YWIgaW5kZXgsIHlvdSBjb3VsZCBjb25zaWRlciBzZXR0aW5nCisjIERJU0FCTEVfSU5ERVggdG8gWUVTIHdoZW4gZW5hYmxpbmcgdGhpcyBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworR0VORVJBVEVfVFJFRVZJRVcgICAgICA9IFlFUworCisjIFRoZSBFTlVNX1ZBTFVFU19QRVJfTElORSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgZW51bSB2YWx1ZXMgdGhhdAorIyBkb3h5Z2VuIHdpbGwgZ3JvdXAgb24gb25lIGxpbmUgaW4gdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisjCisjIE5vdGUgdGhhdCBhIHZhbHVlIG9mIDAgd2lsbCBjb21wbGV0ZWx5IHN1cHByZXNzIHRoZSBlbnVtIHZhbHVlcyBmcm9tIGFwcGVhcmluZworIyBpbiB0aGUgb3ZlcnZpZXcgc2VjdGlvbi4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMjAsIGRlZmF1bHQgdmFsdWU6IDQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0VOVU1fVkFMVUVTX1BFUl9MSU5FICAgPSA0CisKKyMgSWYgdGhlIHRyZWV2aWV3IGlzIGVuYWJsZWQgKHNlZSBHRU5FUkFURV9UUkVFVklFVykgdGhlbiB0aGlzIHRhZyBjYW4gYmUgdXNlZAorIyB0byBzZXQgdGhlIGluaXRpYWwgd2lkdGggKGluIHBpeGVscykgb2YgdGhlIGZyYW1lIGluIHdoaWNoIHRoZSB0cmVlIGlzIHNob3duLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxNTAwLCBkZWZhdWx0IHZhbHVlOiAyNTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK1RSRUVWSUVXX1dJRFRIICAgICAgICAgPSAyNTAKKworIyBJZiB0aGUgRVhUX0xJTktTX0lOX1dJTkRPVyBvcHRpb24gaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIG9wZW4gbGlua3MgdG8KKyMgZXh0ZXJuYWwgc3ltYm9scyBpbXBvcnRlZCB2aWEgdGFnIGZpbGVzIGluIGEgc2VwYXJhdGUgd2luZG93LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0VYVF9MSU5LU19JTl9XSU5ET1cgICAgPSBOTworCisjIFVzZSB0aGlzIHRhZyB0byBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBvZiBMYVRlWCBmb3JtdWxhcyBpbmNsdWRlZCBhcyBpbWFnZXMgaW4KKyMgdGhlIEhUTUwgZG9jdW1lbnRhdGlvbi4gV2hlbiB5b3UgY2hhbmdlIHRoZSBmb250IHNpemUgYWZ0ZXIgYSBzdWNjZXNzZnVsCisjIGRveHlnZW4gcnVuIHlvdSBuZWVkIHRvIG1hbnVhbGx5IHJlbW92ZSBhbnkgZm9ybV8qLnBuZyBpbWFnZXMgZnJvbSB0aGUgSFRNTAorIyBvdXRwdXQgZGlyZWN0b3J5IHRvIGZvcmNlIHRoZW0gdG8gYmUgcmVnZW5lcmF0ZWQuCisjIE1pbmltdW0gdmFsdWU6IDgsIG1heGltdW0gdmFsdWU6IDUwLCBkZWZhdWx0IHZhbHVlOiAxMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRk9STVVMQV9GT05UU0laRSAgICAgICA9IDEwCisKKyMgVXNlIHRoZSBGT1JNVUxBX1RSQU5QQVJFTlQgdGFnIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdCB0aGUgaW1hZ2VzCisjIGdlbmVyYXRlZCBmb3IgZm9ybXVsYXMgYXJlIHRyYW5zcGFyZW50IFBOR3MuIFRyYW5zcGFyZW50IFBOR3MgYXJlIG5vdAorIyBzdXBwb3J0ZWQgcHJvcGVybHkgZm9yIElFIDYuMCwgYnV0IGFyZSBzdXBwb3J0ZWQgb24gYWxsIG1vZGVybiBicm93c2Vycy4KKyMKKyMgTm90ZSB0aGF0IHdoZW4gY2hhbmdpbmcgdGhpcyBvcHRpb24geW91IG5lZWQgdG8gZGVsZXRlIGFueSBmb3JtXyoucG5nIGZpbGVzIGluCisjIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkgYmVmb3JlIHRoZSBjaGFuZ2VzIGhhdmUgZWZmZWN0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitGT1JNVUxBX1RSQU5TUEFSRU5UICAgID0gWUVTCisKKyMgRW5hYmxlIHRoZSBVU0VfTUFUSEpBWCBvcHRpb24gdG8gcmVuZGVyIExhVGVYIGZvcm11bGFzIHVzaW5nIE1hdGhKYXggKHNlZQorIyBodHRwOi8vd3d3Lm1hdGhqYXgub3JnKSB3aGljaCB1c2VzIGNsaWVudCBzaWRlIEphdmFzY3JpcHQgZm9yIHRoZSByZW5kZXJpbmcKKyMgaW5zdGVhZCBvZiB1c2luZyBwcmUtcmVuZGVyZWQgYml0bWFwcy4gVXNlIHRoaXMgaWYgeW91IGRvIG5vdCBoYXZlIExhVGVYCisjIGluc3RhbGxlZCBvciBpZiB5b3Ugd2FudCB0byBmb3JtdWxhcyBsb29rIHByZXR0aWVyIGluIHRoZSBIVE1MIG91dHB1dC4gV2hlbgorIyBlbmFibGVkIHlvdSBtYXkgYWxzbyBuZWVkIHRvIGluc3RhbGwgTWF0aEpheCBzZXBhcmF0ZWx5IGFuZCBjb25maWd1cmUgdGhlIHBhdGgKKyMgdG8gaXQgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworVVNFX01BVEhKQVggICAgICAgICAgICA9IE5PCisKKyMgV2hlbiBNYXRoSmF4IGlzIGVuYWJsZWQgeW91IGNhbiBzZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCB0byBiZSB1c2VkIGZvcgorIyB0aGUgTWF0aEpheCBvdXRwdXQuIFNlZSB0aGUgTWF0aEpheCBzaXRlIChzZWU6CisjIGh0dHA6Ly9kb2NzLm1hdGhqYXgub3JnL2VuL2xhdGVzdC9vdXRwdXQuaHRtbCkgZm9yIG1vcmUgZGV0YWlscy4KKyMgUG9zc2libGUgdmFsdWVzIGFyZTogSFRNTC1DU1MgKHdoaWNoIGlzIHNsb3dlciwgYnV0IGhhcyB0aGUgYmVzdAorIyBjb21wYXRpYmlsaXR5KSwgTmF0aXZlTU1MIChpLmUuIE1hdGhNTCkgYW5kIFNWRy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IEhUTUwtQ1NTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9GT1JNQVQgICAgICAgICA9IEhUTUwtQ1NTCisKKyMgV2hlbiBNYXRoSmF4IGlzIGVuYWJsZWQgeW91IG5lZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIEhUTUwKKyMgb3V0cHV0IGRpcmVjdG9yeSB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4gVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQorIyBzaG91bGQgY29udGFpbiB0aGUgTWF0aEpheC5qcyBzY3JpcHQuIEZvciBpbnN0YW5jZSwgaWYgdGhlIG1hdGhqYXggZGlyZWN0b3J5CisjIGlzIGxvY2F0ZWQgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSwgdGhlbgorIyBNQVRISkFYX1JFTFBBVEggc2hvdWxkIGJlIC4uL21hdGhqYXguIFRoZSBkZWZhdWx0IHZhbHVlIHBvaW50cyB0byB0aGUgTWF0aEpheAorIyBDb250ZW50IERlbGl2ZXJ5IE5ldHdvcmsgc28geW91IGNhbiBxdWlja2x5IHNlZSB0aGUgcmVzdWx0IHdpdGhvdXQgaW5zdGFsbGluZworIyBNYXRoSmF4LiBIb3dldmVyLCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBpbnN0YWxsIGEgbG9jYWwgY29weSBvZgorIyBNYXRoSmF4IGZyb20gaHR0cDovL3d3dy5tYXRoamF4Lm9yZyBiZWZvcmUgZGVwbG95bWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGh0dHA6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX1JFTFBBVEggICAgICAgID0gaHR0cDovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdAorCisjIFRoZSBNQVRISkFYX0VYVEVOU0lPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgTWF0aEpheAorIyBleHRlbnNpb24gbmFtZXMgdGhhdCBzaG91bGQgYmUgZW5hYmxlZCBkdXJpbmcgTWF0aEpheCByZW5kZXJpbmcuIEZvciBleGFtcGxlCisjIE1BVEhKQVhfRVhURU5TSU9OUyA9IFRlWC9BTVNtYXRoIFRlWC9BTVNzeW1ib2xzCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX0VYVEVOU0lPTlMgICAgID0gCisKKyMgVGhlIE1BVEhKQVhfQ09ERUZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBmaWxlIHdpdGggamF2YXNjcmlwdCBwaWVjZXMKKyMgb2YgY29kZSB0aGF0IHdpbGwgYmUgdXNlZCBvbiBzdGFydHVwIG9mIHRoZSBNYXRoSmF4IGNvZGUuIFNlZSB0aGUgTWF0aEpheCBzaXRlCisjIChzZWU6IGh0dHA6Ly9kb2NzLm1hdGhqYXgub3JnL2VuL2xhdGVzdC9vdXRwdXQuaHRtbCkgZm9yIG1vcmUgZGV0YWlscy4gRm9yIGFuCisjIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9DT0RFRklMRSAgICAgICA9IAorCisjIFdoZW4gdGhlIFNFQVJDSEVOR0lORSB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzZWFyY2ggYm94IGZvcgorIyB0aGUgSFRNTCBvdXRwdXQuIFRoZSB1bmRlcmx5aW5nIHNlYXJjaCBlbmdpbmUgdXNlcyBqYXZhc2NyaXB0IGFuZCBESFRNTCBhbmQKKyMgc2hvdWxkIHdvcmsgb24gYW55IG1vZGVybiBicm93c2VyLiBOb3RlIHRoYXQgd2hlbiB1c2luZyBIVE1MIGhlbHAKKyMgKEdFTkVSQVRFX0hUTUxIRUxQKSwgUXQgaGVscCAoR0VORVJBVEVfUUhQKSwgb3IgZG9jc2V0cyAoR0VORVJBVEVfRE9DU0VUKQorIyB0aGVyZSBpcyBhbHJlYWR5IGEgc2VhcmNoIGZ1bmN0aW9uIHNvIHRoaXMgb25lIHNob3VsZCB0eXBpY2FsbHkgYmUgZGlzYWJsZWQuCisjIEZvciBsYXJnZSBwcm9qZWN0cyB0aGUgamF2YXNjcmlwdCBiYXNlZCBzZWFyY2ggZW5naW5lIGNhbiBiZSBzbG93LCB0aGVuCisjIGVuYWJsaW5nIFNFUlZFUl9CQVNFRF9TRUFSQ0ggbWF5IHByb3ZpZGUgYSBiZXR0ZXIgc29sdXRpb24uIEl0IGlzIHBvc3NpYmxlIHRvCisjIHNlYXJjaCB1c2luZyB0aGUga2V5Ym9hcmQ7IHRvIGp1bXAgdG8gdGhlIHNlYXJjaCBib3ggdXNlIDxhY2Nlc3Mga2V5PiArIFMKKyMgKHdoYXQgdGhlIDxhY2Nlc3Mga2V5PiBpcyBkZXBlbmRzIG9uIHRoZSBPUyBhbmQgYnJvd3NlciwgYnV0IGl0IGlzIHR5cGljYWxseQorIyA8Q1RSTD4sIDxBTFQ+LzxvcHRpb24+LCBvciBib3RoKS4gSW5zaWRlIHRoZSBzZWFyY2ggYm94IHVzZSB0aGUgPGN1cnNvciBkb3duCisjIGtleT4gdG8ganVtcCBpbnRvIHRoZSBzZWFyY2ggcmVzdWx0cyB3aW5kb3csIHRoZSByZXN1bHRzIGNhbiBiZSBuYXZpZ2F0ZWQKKyMgdXNpbmcgdGhlIDxjdXJzb3Iga2V5cz4uIFByZXNzIDxFbnRlcj4gdG8gc2VsZWN0IGFuIGl0ZW0gb3IgPGVzY2FwZT4gdG8gY2FuY2VsCisjIHRoZSBzZWFyY2guIFRoZSBmaWx0ZXIgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgd2hlbiB0aGUgY3Vyc29yIGlzIGluc2lkZSB0aGUKKyMgc2VhcmNoIGJveCBieSBwcmVzc2luZyA8U2hpZnQ+KzxjdXJzb3IgZG93bj4uIEFsc28gaGVyZSB1c2UgdGhlIDxjdXJzb3Iga2V5cz4KKyMgdG8gc2VsZWN0IGEgZmlsdGVyIGFuZCA8RW50ZXI+IG9yIDxlc2NhcGU+IHRvIGFjdGl2YXRlIG9yIGNhbmNlbCB0aGUgZmlsdGVyCisjIG9wdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworU0VBUkNIRU5HSU5FICAgICAgICAgICA9IFlFUworCisjIFdoZW4gdGhlIFNFUlZFUl9CQVNFRF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgdGhlIHNlYXJjaCBlbmdpbmUgd2lsbCBiZQorIyBpbXBsZW1lbnRlZCB1c2luZyBhIHdlYiBzZXJ2ZXIgaW5zdGVhZCBvZiBhIHdlYiBjbGllbnQgdXNpbmcgSmF2YXNjcmlwdC4gVGhlcmUKKyMgYXJlIHR3byBmbGF2b3JzIG9mIHdlYiBzZXJ2ZXIgYmFzZWQgc2VhcmNoaW5nIGRlcGVuZGluZyBvbiB0aGUgRVhURVJOQUxfU0VBUkNICisjIHNldHRpbmcuIFdoZW4gZGlzYWJsZWQsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIFBIUCBzY3JpcHQgZm9yIHNlYXJjaGluZyBhbmQKKyMgYW4gaW5kZXggZmlsZSB1c2VkIGJ5IHRoZSBzY3JpcHQuIFdoZW4gRVhURVJOQUxfU0VBUkNIIGlzIGVuYWJsZWQgdGhlIGluZGV4aW5nCisjIGFuZCBzZWFyY2hpbmcgbmVlZHMgdG8gYmUgcHJvdmlkZWQgYnkgZXh0ZXJuYWwgdG9vbHMuIFNlZSB0aGUgc2VjdGlvbgorIyAiRXh0ZXJuYWwgSW5kZXhpbmcgYW5kIFNlYXJjaGluZyIgZm9yIGRldGFpbHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitTRVJWRVJfQkFTRURfU0VBUkNIICAgID0gTk8KKworIyBXaGVuIEVYVEVSTkFMX1NFQVJDSCB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgbm8gbG9uZ2VyIGdlbmVyYXRlIHRoZSBQSFAKKyMgc2NyaXB0IGZvciBzZWFyY2hpbmcuIEluc3RlYWQgdGhlIHNlYXJjaCByZXN1bHRzIGFyZSB3cml0dGVuIHRvIGFuIFhNTCBmaWxlCisjIHdoaWNoIG5lZWRzIHRvIGJlIHByb2Nlc3NlZCBieSBhbiBleHRlcm5hbCBpbmRleGVyLiBEb3h5Z2VuIHdpbGwgaW52b2tlIGFuCisjIGV4dGVybmFsIHNlYXJjaCBlbmdpbmUgcG9pbnRlZCB0byBieSB0aGUgU0VBUkNIRU5HSU5FX1VSTCBvcHRpb24gdG8gb2J0YWluIHRoZQorIyBzZWFyY2ggcmVzdWx0cy4KKyMKKyMgRG94eWdlbiBzaGlwcyB3aXRoIGFuIGV4YW1wbGUgaW5kZXhlciAoZG94eWluZGV4ZXIpIGFuZCBzZWFyY2ggZW5naW5lCisjIChkb3h5c2VhcmNoLmNnaSkgd2hpY2ggYXJlIGJhc2VkIG9uIHRoZSBvcGVuIHNvdXJjZSBzZWFyY2ggZW5naW5lIGxpYnJhcnkKKyMgWGFwaWFuIChzZWU6IGh0dHA6Ly94YXBpYW4ub3JnLykuCisjCisjIFNlZSB0aGUgc2VjdGlvbiAiRXh0ZXJuYWwgSW5kZXhpbmcgYW5kIFNlYXJjaGluZyIgZm9yIGRldGFpbHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSEVOR0lORSBpcyBzZXQgdG8gWUVTLgorCitFWFRFUk5BTF9TRUFSQ0ggICAgICAgID0gTk8KKworIyBUaGUgU0VBUkNIRU5HSU5FX1VSTCBzaG91bGQgcG9pbnQgdG8gYSBzZWFyY2ggZW5naW5lIGhvc3RlZCBieSBhIHdlYiBzZXJ2ZXIKKyMgd2hpY2ggd2lsbCByZXR1cm4gdGhlIHNlYXJjaCByZXN1bHRzIHdoZW4gRVhURVJOQUxfU0VBUkNIIGlzIGVuYWJsZWQuCisjCisjIERveHlnZW4gc2hpcHMgd2l0aCBhbiBleGFtcGxlIGluZGV4ZXIgKGRveHlpbmRleGVyKSBhbmQgc2VhcmNoIGVuZ2luZQorIyAoZG94eXNlYXJjaC5jZ2kpIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgb3BlbiBzb3VyY2Ugc2VhcmNoIGVuZ2luZSBsaWJyYXJ5CisjIFhhcGlhbiAoc2VlOiBodHRwOi8veGFwaWFuLm9yZy8pLiBTZWUgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZAorIyBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSEVOR0lORV9VUkwgICAgICAgPSAKKworIyBXaGVuIFNFUlZFUl9CQVNFRF9TRUFSQ0ggYW5kIEVYVEVSTkFMX1NFQVJDSCBhcmUgYm90aCBlbmFibGVkIHRoZSB1bmluZGV4ZWQKKyMgc2VhcmNoIGRhdGEgaXMgd3JpdHRlbiB0byBhIGZpbGUgZm9yIGluZGV4aW5nIGJ5IGFuIGV4dGVybmFsIHRvb2wuIFdpdGggdGhlCisjIFNFQVJDSERBVEFfRklMRSB0YWcgdGhlIG5hbWUgb2YgdGhpcyBmaWxlIGNhbiBiZSBzcGVjaWZpZWQuCisjIFRoZSBkZWZhdWx0IGZpbGUgaXM6IHNlYXJjaGRhdGEueG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSERBVEFfRklMRSAgICAgICAgPSBzZWFyY2hkYXRhLnhtbAorCisjIFdoZW4gU0VSVkVSX0JBU0VEX1NFQVJDSCBhbmQgRVhURVJOQUxfU0VBUkNIIGFyZSBib3RoIGVuYWJsZWQgdGhlCisjIEVYVEVSTkFMX1NFQVJDSF9JRCB0YWcgY2FuIGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBmb3IgdGhlIHByb2plY3QuIFRoaXMgaXMKKyMgdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGggRVhUUkFfU0VBUkNIX01BUFBJTkdTIHRvIHNlYXJjaCB0aHJvdWdoIG11bHRpcGxlCisjIHByb2plY3RzIGFuZCByZWRpcmVjdCB0aGUgcmVzdWx0cyBiYWNrIHRvIHRoZSByaWdodCBwcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK0VYVEVSTkFMX1NFQVJDSF9JRCAgICAgPSAKKworIyBUaGUgRVhUUkFfU0VBUkNIX01BUFBJTkdTIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgc2VhcmNoaW5nIHRocm91Z2ggZG94eWdlbgorIyBwcm9qZWN0cyBvdGhlciB0aGFuIHRoZSBvbmUgZGVmaW5lZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwgYnV0IHRoYXQgYXJlCisjIGFsbCBhZGRlZCB0byB0aGUgc2FtZSBleHRlcm5hbCBzZWFyY2ggaW5kZXguIEVhY2ggcHJvamVjdCBuZWVkcyB0byBoYXZlIGEKKyMgdW5pcXVlIGlkIHNldCB2aWEgRVhURVJOQUxfU0VBUkNIX0lELiBUaGUgc2VhcmNoIG1hcHBpbmcgdGhlbiBtYXBzIHRoZSBpZCBvZgorIyB0byBhIHJlbGF0aXZlIGxvY2F0aW9uIHdoZXJlIHRoZSBkb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZC4gVGhlIGZvcm1hdCBpczoKKyMgRVhUUkFfU0VBUkNIX01BUFBJTkdTID0gdGFnbmFtZTE9bG9jMSB0YWduYW1lMj1sb2MyIC4uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK0VYVFJBX1NFQVJDSF9NQVBQSU5HUyAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgTGFUZVggb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgTGFUZVggb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9MQVRFWCAgICAgICAgID0gTk8KKworIyBUaGUgTEFURVhfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIExhVGVYIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGxhdGV4LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfT1VUUFVUICAgICAgICAgICA9IGxhdGV4CisKKyMgVGhlIExBVEVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBMYVRlWCBjb21tYW5kIG5hbWUgdG8gYmUKKyMgaW52b2tlZC4KKyMKKyMgTm90ZSB0aGF0IHdoZW4gZW5hYmxpbmcgVVNFX1BERkxBVEVYIHRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZCBmb3IgZ2VuZXJhdGluZworIyBiaXRtYXBzIGZvciBmb3JtdWxhcyBpbiB0aGUgSFRNTCBvdXRwdXQsIGJ1dCBub3QgaW4gdGhlIE1ha2VmaWxlIHRoYXQgaXMKKyMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKyMgVGhlIGRlZmF1bHQgZmlsZSBpczogbGF0ZXguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9DTURfTkFNRSAgICAgICAgID0gbGF0ZXgKKworIyBUaGUgTUFLRUlOREVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb21tYW5kIG5hbWUgdG8gZ2VuZXJhdGUKKyMgaW5kZXggZm9yIExhVGVYLgorIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBtYWtlaW5kZXguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitNQUtFSU5ERVhfQ01EX05BTUUgICAgID0gbWFrZWluZGV4CisKKyMgSWYgdGhlIENPTVBBQ1RfTEFURVggdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdCBMYVRlWAorIyBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvIHNhdmUgc29tZQorIyB0cmVlcyBpbiBnZW5lcmFsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitDT01QQUNUX0xBVEVYICAgICAgICAgID0gTk8KKworIyBUaGUgUEFQRVJfVFlQRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBwYXBlciB0eXBlIHRoYXQgaXMgdXNlZCBieSB0aGUKKyMgcHJpbnRlci4KKyMgUG9zc2libGUgdmFsdWVzIGFyZTogYTQgKDIxMCB4IDI5NyBtbSksIGxldHRlciAoOC41IHggMTEgaW5jaGVzKSwgbGVnYWwgKDguNSB4CisjIDE0IGluY2hlcykgYW5kIGV4ZWN1dGl2ZSAoNy4yNSB4IDEwLjUgaW5jaGVzKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGE0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworUEFQRVJfVFlQRSAgICAgICAgICAgICA9IGE0CisKKyMgVGhlIEVYVFJBX1BBQ0tBR0VTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIExhVGVYIHBhY2thZ2UgbmFtZXMKKyMgdGhhdCBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIExhVGVYIG91dHB1dC4gVGhlIHBhY2thZ2UgY2FuIGJlIHNwZWNpZmllZCBqdXN0CisjIGJ5IGl0cyBuYW1lIG9yIHdpdGggdGhlIGNvcnJlY3Qgc3ludGF4IGFzIHRvIGJlIHVzZWQgd2l0aCB0aGUgTGFUZVgKKyMgXHVzZXBhY2thZ2UgY29tbWFuZC4gVG8gZ2V0IHRoZSB0aW1lcyBmb250IGZvciBpbnN0YW5jZSB5b3UgY2FuIHNwZWNpZnkgOgorIyBFWFRSQV9QQUNLQUdFUz10aW1lcyBvciBFWFRSQV9QQUNLQUdFUz17dGltZXN9CisjIFRvIHVzZSB0aGUgb3B0aW9uIGludGxpbWl0cyB3aXRoIHRoZSBhbXNtYXRoIHBhY2thZ2UgeW91IGNhbiBzcGVjaWZ5OgorIyBFWFRSQV9QQUNLQUdFUz1baW50bGltaXRzXXthbXNtYXRofQorIyBJZiBsZWZ0IGJsYW5rIG5vIGV4dHJhIHBhY2thZ2VzIHdpbGwgYmUgaW5jbHVkZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0gCisKKyMgVGhlIExBVEVYX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGhlYWRlciBmb3IgdGhlCisjIGdlbmVyYXRlZCBMYVRlWCBkb2N1bWVudC4gVGhlIGhlYWRlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIHVudGlsIHRoZSBmaXJzdAorIyBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkIGhlYWRlci4gU2VlCisjIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gbGV0IGRveHlnZW4gd3JpdGUgdGhlCisjIGRlZmF1bHQgaGVhZGVyIHRvIGEgc2VwYXJhdGUgZmlsZS4KKyMKKyMgTm90ZTogT25seSB1c2UgYSB1c2VyLWRlZmluZWQgaGVhZGVyIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEgVGhlCisjIGZvbGxvd2luZyBjb21tYW5kcyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nIGluc2lkZSB0aGUgaGVhZGVyOiAkdGl0bGUsCisjICRkYXRldGltZSwgJGRhdGUsICRkb3h5Z2VudmVyc2lvbiwgJHByb2plY3RuYW1lLCAkcHJvamVjdG51bWJlciwKKyMgJHByb2plY3RicmllZiwgJHByb2plY3Rsb2dvLiBEb3h5Z2VuIHdpbGwgcmVwbGFjZSAkdGl0bGUgd2l0aCB0aGUgZW1wdHkKKyMgc3RyaW5nLCBmb3IgdGhlIHJlcGxhY2VtZW50IHZhbHVlcyBvZiB0aGUgb3RoZXIgY29tbWFuZHMgdGhlIHVzZXIgaXMgcmVmZXJyZWQKKyMgdG8gSFRNTF9IRUFERVIuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9IRUFERVIgICAgICAgICAgID0gCisKKyMgVGhlIExBVEVYX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGZvb3RlciBmb3IgdGhlCisjIGdlbmVyYXRlZCBMYVRlWCBkb2N1bWVudC4gVGhlIGZvb3RlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIGFmdGVyIHRoZSBsYXN0CisjIGNoYXB0ZXIuIElmIGl0IGlzIGxlZnQgYmxhbmsgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc3RhbmRhcmQgZm9vdGVyLiBTZWUKKyMgTEFURVhfSEVBREVSIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSBhIGRlZmF1bHQgZm9vdGVyIGFuZCB3aGF0CisjIHNwZWNpYWwgY29tbWFuZHMgY2FuIGJlIHVzZWQgaW5zaWRlIHRoZSBmb290ZXIuCisjCisjIE5vdGU6IE9ubHkgdXNlIGEgdXNlci1kZWZpbmVkIGZvb3RlciBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9GT09URVIgICAgICAgICAgID0gCisKKyMgVGhlIExBVEVYX0VYVFJBX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYWRkaXRpb25hbCB1c2VyLWRlZmluZWQKKyMgTGFUZVggc3R5bGUgc2hlZXRzIHRoYXQgYXJlIGluY2x1ZGVkIGFmdGVyIHRoZSBzdGFuZGFyZCBzdHlsZSBzaGVldHMgY3JlYXRlZAorIyBieSBkb3h5Z2VuLiBVc2luZyB0aGlzIG9wdGlvbiBvbmUgY2FuIG92ZXJydWxlIGNlcnRhaW4gc3R5bGUgYXNwZWN0cy4gRG94eWdlbgorIyB3aWxsIGNvcHkgdGhlIHN0eWxlIHNoZWV0IGZpbGVzIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LgorIyBOb3RlOiBUaGUgb3JkZXIgb2YgdGhlIGV4dHJhIHN0eWxlIHNoZWV0IGZpbGVzIGlzIG9mIGltcG9ydGFuY2UgKGUuZy4gdGhlIGxhc3QKKyMgc3R5bGUgc2hlZXQgaW4gdGhlIGxpc3Qgb3ZlcnJ1bGVzIHRoZSBzZXR0aW5nIG9mIHRoZSBwcmV2aW91cyBvbmVzIGluIHRoZQorIyBsaXN0KS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0VYVFJBX1NUWUxFU0hFRVQgPSAKKworIyBUaGUgTEFURVhfRVhUUkFfRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZXh0cmEgaW1hZ2VzIG9yCisjIG90aGVyIHNvdXJjZSBmaWxlcyB3aGljaCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBMQVRFWF9PVVRQVVQgb3V0cHV0CisjIGRpcmVjdG9yeS4gTm90ZSB0aGF0IHRoZSBmaWxlcyB3aWxsIGJlIGNvcGllZCBhcy1pczsgdGhlcmUgYXJlIG5vIGNvbW1hbmRzIG9yCisjIG1hcmtlcnMgYXZhaWxhYmxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfRVhUUkFfRklMRVMgICAgICA9IAorCisjIElmIHRoZSBQREZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIExhVGVYIHRoYXQgaXMgZ2VuZXJhdGVkIGlzCisjIHByZXBhcmVkIGZvciBjb252ZXJzaW9uIHRvIFBERiAodXNpbmcgcHMycGRmIG9yIHBkZmxhdGV4KS4gVGhlIFBERiBmaWxlIHdpbGwKKyMgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMuIFRoaXMKKyMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lIGJyb3dzaW5nIHVzaW5nIGEgUERGIHZpZXdlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK1BERl9IWVBFUkxJTktTICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVVNFX1BERkxBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgdXNlIHBkZmxhdGV4IHRvIGdlbmVyYXRlCisjIHRoZSBQREYgZmlsZSBkaXJlY3RseSBmcm9tIHRoZSBMYVRlWCBmaWxlcy4gU2V0IHRoaXMgb3B0aW9uIHRvIFlFUywgdG8gZ2V0IGEKKyMgaGlnaGVyIHF1YWxpdHkgUERGIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitVU0VfUERGTEFURVggICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIExBVEVYX0JBVENITU9ERSB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGFkZCB0aGUgXGJhdGNobW9kZQorIyBjb21tYW5kIHRvIHRoZSBnZW5lcmF0ZWQgTGFUZVggZmlsZXMuIFRoaXMgd2lsbCBpbnN0cnVjdCBMYVRlWCB0byBrZWVwIHJ1bm5pbmcKKyMgaWYgZXJyb3JzIG9jY3VyLCBpbnN0ZWFkIG9mIGFza2luZyB0aGUgdXNlciBmb3IgaGVscC4gVGhpcyBvcHRpb24gaXMgYWxzbyB1c2VkCisjIHdoZW4gZ2VuZXJhdGluZyBmb3JtdWxhcyBpbiBIVE1MLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9CQVRDSE1PREUgICAgICAgID0gTk8KKworIyBJZiB0aGUgTEFURVhfSElERV9JTkRJQ0VTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIG5vdCBpbmNsdWRlIHRoZQorIyBpbmRleCBjaGFwdGVycyAoc3VjaCBhcyBGaWxlIEluZGV4LCBDb21wb3VuZCBJbmRleCwgZXRjLikgaW4gdGhlIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfSElERV9JTkRJQ0VTICAgICA9IE5PCisKKyMgSWYgdGhlIExBVEVYX1NPVVJDRV9DT0RFIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGluY2x1ZGUgc291cmNlCisjIGNvZGUgd2l0aCBzeW50YXggaGlnaGxpZ2h0aW5nIGluIHRoZSBMYVRlWCBvdXRwdXQuCisjCisjIE5vdGUgdGhhdCB3aGljaCBzb3VyY2VzIGFyZSBzaG93biBhbHNvIGRlcGVuZHMgb24gb3RoZXIgc2V0dGluZ3Mgc3VjaCBhcworIyBTT1VSQ0VfQlJPV1NFUi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfU09VUkNFX0NPREUgICAgICA9IE5PCisKKyMgVGhlIExBVEVYX0JJQl9TVFlMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgc3R5bGUgdG8gdXNlIGZvciB0aGUKKyMgYmlibGlvZ3JhcGh5LCBlLmcuIHBsYWlubmF0LCBvciBpZWVldHIuIFNlZQorIyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0JpYlRlWCBhbmQgXGNpdGUgZm9yIG1vcmUgaW5mby4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IHBsYWluLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfQklCX1NUWUxFICAgICAgICA9IHBsYWluCisKKyMgSWYgdGhlIExBVEVYX1RJTUVTVEFNUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBmb290ZXIgb2YgZWFjaCBnZW5lcmF0ZWQKKyMgcGFnZSB3aWxsIGNvbnRhaW4gdGhlIGRhdGUgYW5kIHRpbWUgd2hlbiB0aGUgcGFnZSB3YXMgZ2VuZXJhdGVkLiBTZXR0aW5nIHRoaXMKKyMgdG8gTk8gY2FuIGhlbHAgd2hlbiBjb21wYXJpbmcgdGhlIG91dHB1dCBvZiBtdWx0aXBsZSBydW5zLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9USU1FU1RBTVAgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9SVEYgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBSVEYgb3V0cHV0LiBUaGUKKyMgUlRGIG91dHB1dCBpcyBvcHRpbWl6ZWQgZm9yIFdvcmQgOTcgYW5kIG1heSBub3QgbG9vayB0b28gcHJldHR5IHdpdGggb3RoZXIgUlRGCisjIHJlYWRlcnMvZWRpdG9ycy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9SVEYgICAgICAgICAgID0gTk8KKworIyBUaGUgUlRGX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBSVEYgZG9jcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogcnRmLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9PVVRQVVQgICAgICAgICAgICAgPSBydGYKKworIyBJZiB0aGUgQ09NUEFDVF9SVEYgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gZ2VuZXJhdGVzIG1vcmUgY29tcGFjdCBSVEYKKyMgZG9jdW1lbnRzLiBUaGlzIG1heSBiZSB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIGFuZCBtYXkgaGVscCB0byBzYXZlIHNvbWUKKyMgdHJlZXMgaW4gZ2VuZXJhbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK0NPTVBBQ1RfUlRGICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBSVEZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIFJURiB0aGF0IGlzIGdlbmVyYXRlZCB3aWxsCisjIGNvbnRhaW4gaHlwZXJsaW5rIGZpZWxkcy4gVGhlIFJURiBmaWxlIHdpbGwgY29udGFpbiBsaW5rcyAoanVzdCBsaWtlIHRoZSBIVE1MCisjIG91dHB1dCkgaW5zdGVhZCBvZiBwYWdlIHJlZmVyZW5jZXMuIFRoaXMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lCisjIGJyb3dzaW5nIHVzaW5nIFdvcmQgb3Igc29tZSBvdGhlciBXb3JkIGNvbXBhdGlibGUgcmVhZGVycyB0aGF0IHN1cHBvcnQgdGhvc2UKKyMgZmllbGRzLgorIworIyBOb3RlOiBXb3JkUGFkICh3cml0ZSkgYW5kIG90aGVycyBkbyBub3Qgc3VwcG9ydCBsaW5rcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9IWVBFUkxJTktTICAgICAgICAgPSBOTworCisjIExvYWQgc3R5bGVzaGVldCBkZWZpbml0aW9ucyBmcm9tIGZpbGUuIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcKKyMgZmlsZSwgaS5lLiBhIHNlcmllcyBvZiBhc3NpZ25tZW50cy4gWW91IG9ubHkgaGF2ZSB0byBwcm92aWRlIHJlcGxhY2VtZW50cywKKyMgbWlzc2luZyBkZWZpbml0aW9ucyBhcmUgc2V0IHRvIHRoZWlyIGRlZmF1bHQgdmFsdWUuCisjCisjIFNlZSBhbHNvIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgdGhlCisjIGRlZmF1bHQgc3R5bGUgc2hlZXQgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5IHVzZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KKworUlRGX1NUWUxFU0hFRVRfRklMRSAgICA9IAorCisjIFNldCBvcHRpb25hbCB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgZ2VuZXJhdGlvbiBvZiBhbiBSVEYgZG9jdW1lbnQuIFN5bnRheCBpcworIyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcgZmlsZS4gQSB0ZW1wbGF0ZSBleHRlbnNpb25zIGZpbGUgY2FuIGJlIGdlbmVyYXRlZAorIyB1c2luZyBkb3h5Z2VuIC1lIHJ0ZiBleHRlbnNpb25GaWxlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9FWFRFTlNJT05TX0ZJTEUgICAgPSAKKworIyBJZiB0aGUgUlRGX1NPVVJDRV9DT0RFIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGluY2x1ZGUgc291cmNlIGNvZGUKKyMgd2l0aCBzeW50YXggaGlnaGxpZ2h0aW5nIGluIHRoZSBSVEYgb3V0cHV0LgorIworIyBOb3RlIHRoYXQgd2hpY2ggc291cmNlcyBhcmUgc2hvd24gYWxzbyBkZXBlbmRzIG9uIG90aGVyIHNldHRpbmdzIHN1Y2ggYXMKKyMgU09VUkNFX0JST1dTRVIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfU09VUkNFX0NPREUgICAgICAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgbWFuIHBhZ2Ugb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX01BTiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIG1hbiBwYWdlcyBmb3IKKyMgY2xhc3NlcyBhbmQgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfTUFOICAgICAgICAgICA9IE5PCisKKyMgVGhlIE1BTl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgbWFuIHBhZ2VzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4gQSBkaXJlY3RvcnkgbWFuMyB3aWxsIGJlIGNyZWF0ZWQgaW5zaWRlIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5CisjIE1BTl9PVVRQVVQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogbWFuLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9PVVRQVVQgICAgICAgICAgICAgPSBtYW4KKworIyBUaGUgTUFOX0VYVEVOU0lPTiB0YWcgZGV0ZXJtaW5lcyB0aGUgZXh0ZW5zaW9uIHRoYXQgaXMgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZAorIyBtYW4gcGFnZXMuIEluIGNhc2UgdGhlIG1hbnVhbCBzZWN0aW9uIGRvZXMgbm90IHN0YXJ0IHdpdGggYSBudW1iZXIsIHRoZSBudW1iZXIKKyMgMyBpcyBwcmVwZW5kZWQuIFRoZSBkb3QgKC4pIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1BTl9FWFRFTlNJT04gdGFnIGlzCisjIG9wdGlvbmFsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogLjMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9NQU4gaXMgc2V0IHRvIFlFUy4KKworTUFOX0VYVEVOU0lPTiAgICAgICAgICA9IC4zCisKKyMgVGhlIE1BTl9TVUJESVIgdGFnIGRldGVybWluZXMgdGhlIG5hbWUgb2YgdGhlIGRpcmVjdG9yeSBjcmVhdGVkIHdpdGhpbgorIyBNQU5fT1VUUFVUIGluIHdoaWNoIHRoZSBtYW4gcGFnZXMgYXJlIHBsYWNlZC4gSWYgZGVmYXVsdHMgdG8gbWFuIGZvbGxvd2VkIGJ5CisjIE1BTl9FWFRFTlNJT04gd2l0aCB0aGUgaW5pdGlhbCAuIHJlbW92ZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9NQU4gaXMgc2V0IHRvIFlFUy4KKworTUFOX1NVQkRJUiAgICAgICAgICAgICA9IAorCisjIElmIHRoZSBNQU5fTElOS1MgdGFnIGlzIHNldCB0byBZRVMgYW5kIGRveHlnZW4gZ2VuZXJhdGVzIG1hbiBvdXRwdXQsIHRoZW4gaXQKKyMgd2lsbCBnZW5lcmF0ZSBvbmUgYWRkaXRpb25hbCBtYW4gZmlsZSBmb3IgZWFjaCBlbnRpdHkgZG9jdW1lbnRlZCBpbiB0aGUgcmVhbAorIyBtYW4gcGFnZShzKS4gVGhlc2UgYWRkaXRpb25hbCBmaWxlcyBvbmx5IHNvdXJjZSB0aGUgcmVhbCBtYW4gcGFnZSwgYnV0IHdpdGhvdXQKKyMgdGhlbSB0aGUgbWFuIGNvbW1hbmQgd291bGQgYmUgdW5hYmxlIHRvIGZpbmQgdGhlIGNvcnJlY3QgcGFnZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9MSU5LUyAgICAgICAgICAgICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBYTUwgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1hNTCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGFuIFhNTCBmaWxlIHRoYXQKKyMgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZiB0aGUgY29kZSBpbmNsdWRpbmcgYWxsIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfWE1MICAgICAgICAgICA9IE5PCisKKyMgVGhlIFhNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgWE1MIHBhZ2VzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiB4bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIFlFUy4KKworWE1MX09VVFBVVCAgICAgICAgICAgICA9IHhtbAorCisjIElmIHRoZSBYTUxfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBkdW1wIHRoZSBwcm9ncmFtCisjIGxpc3RpbmdzIChpbmNsdWRpbmcgc3ludGF4IGhpZ2hsaWdodGluZyBhbmQgY3Jvc3MtcmVmZXJlbmNpbmcgaW5mb3JtYXRpb24pIHRvCisjIHRoZSBYTUwgb3V0cHV0LiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHNpemUKKyMgb2YgdGhlIFhNTCBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIFlFUy4KKworWE1MX1BST0dSQU1MSVNUSU5HICAgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBET0NCT09LIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9ET0NCT09LIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgRG9jYm9vayBmaWxlcworIyB0aGF0IGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIFBERi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9ET0NCT09LICAgICAgID0gTk8KKworIyBUaGUgRE9DQk9PS19PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgRG9jYm9vayBwYWdlcyB3aWxsIGJlIHB1dC4KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4KKyMgZnJvbnQgb2YgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogZG9jYm9vay4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ0JPT0sgaXMgc2V0IHRvIFlFUy4KKworRE9DQk9PS19PVVRQVVQgICAgICAgICA9IGRvY2Jvb2sKKworIyBJZiB0aGUgRE9DQk9PS19QUk9HUkFNTElTVElORyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGluY2x1ZGUgdGhlCisjIHByb2dyYW0gbGlzdGluZ3MgKGluY2x1ZGluZyBzeW50YXggaGlnaGxpZ2h0aW5nIGFuZCBjcm9zcy1yZWZlcmVuY2luZworIyBpbmZvcm1hdGlvbikgdG8gdGhlIERPQ0JPT0sgb3V0cHV0LiBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyB3aWxsIHNpZ25pZmljYW50bHkKKyMgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIERPQ0JPT0sgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NCT09LIGlzIHNldCB0byBZRVMuCisKK0RPQ0JPT0tfUFJPR1JBTUxJU1RJTkcgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEF1dG9HZW4gRGVmaW5pdGlvbnMgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0FVVE9HRU5fREVGIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYW4KKyMgQXV0b0dlbiBEZWZpbml0aW9ucyAoc2VlIGh0dHA6Ly9hdXRvZ2VuLnNmLm5ldCkgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZQorIyBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzCisjIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgbW9tZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX0FVVE9HRU5fREVGICAgPSBOTworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfUEVSTE1PRCB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgUGVybCBtb2R1bGUKKyMgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLgorIworIyBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgbW9tZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX1BFUkxNT0QgICAgICAgPSBOTworCisjIElmIHRoZSBQRVJMTU9EX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgdGhlIG5lY2Vzc2FyeQorIyBNYWtlZmlsZSBydWxlcywgUGVybCBzY3JpcHRzIGFuZCBMYVRlWCBjb2RlIHRvIGJlIGFibGUgdG8gZ2VuZXJhdGUgUERGIGFuZCBEVkkKKyMgb3V0cHV0IGZyb20gdGhlIFBlcmwgbW9kdWxlIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUEVSTE1PRCBpcyBzZXQgdG8gWUVTLgorCitQRVJMTU9EX0xBVEVYICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUEVSTE1PRF9QUkVUVFkgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBuaWNlbHkKKyMgZm9ybWF0dGVkIHNvIGl0IGNhbiBiZSBwYXJzZWQgYnkgYSBodW1hbiByZWFkZXIuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvCisjIHVuZGVyc3RhbmQgd2hhdCBpcyBnb2luZyBvbi4gT24gdGhlIG90aGVyIGhhbmQsIGlmIHRoaXMgdGFnIGlzIHNldCB0byBOTywgdGhlCisjIHNpemUgb2YgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIG11Y2ggc21hbGxlciBhbmQgUGVybCB3aWxsIHBhcnNlIGl0CisjIGp1c3QgdGhlIHNhbWUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCisKK1BFUkxNT0RfUFJFVFRZICAgICAgICAgPSBZRVMKKworIyBUaGUgbmFtZXMgb2YgdGhlIG1ha2UgdmFyaWFibGVzIGluIHRoZSBnZW5lcmF0ZWQgZG94eXJ1bGVzLm1ha2UgZmlsZSBhcmUKKyMgcHJlZml4ZWQgd2l0aCB0aGUgc3RyaW5nIGNvbnRhaW5lZCBpbiBQRVJMTU9EX01BS0VWQVJfUFJFRklYLiBUaGlzIGlzIHVzZWZ1bAorIyBzbyBkaWZmZXJlbnQgZG94eXJ1bGVzLm1ha2UgZmlsZXMgaW5jbHVkZWQgYnkgdGhlIHNhbWUgTWFrZWZpbGUgZG9uJ3QKKyMgb3ZlcndyaXRlIGVhY2ggb3RoZXIncyB2YXJpYWJsZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCisKK1BFUkxNT0RfTUFLRVZBUl9QUkVGSVggPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgcHJlcHJvY2Vzc29yCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZXZhbHVhdGUgYWxsCisjIEMtcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgYW5kIGluY2x1ZGUgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VOQUJMRV9QUkVQUk9DRVNTSU5HICAgPSBZRVMKKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZXhwYW5kIGFsbCBtYWNybyBuYW1lcworIyBpbiB0aGUgc291cmNlIGNvZGUuIElmIHNldCB0byBOTywgb25seSBjb25kaXRpb25hbCBjb21waWxhdGlvbiB3aWxsIGJlCisjIHBlcmZvcm1lZC4gTWFjcm8gZXhwYW5zaW9uIGNhbiBiZSBkb25lIGluIGEgY29udHJvbGxlZCB3YXkgYnkgc2V0dGluZworIyBFWFBBTkRfT05MWV9QUkVERUYgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitNQUNST19FWFBBTlNJT04gICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYUEFORF9PTkxZX1BSRURFRiBhbmQgTUFDUk9fRVhQQU5TSU9OIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCisjIHRoZSBtYWNybyBleHBhbnNpb24gaXMgbGltaXRlZCB0byB0aGUgbWFjcm9zIHNwZWNpZmllZCB3aXRoIHRoZSBQUkVERUZJTkVEIGFuZAorIyBFWFBBTkRfQVNfREVGSU5FRCB0YWdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gWUVTCisKKyMgSWYgdGhlIFNFQVJDSF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGluY2x1ZGUgZmlsZXMgaW4gdGhlCisjIElOQ0xVREVfUEFUSCB3aWxsIGJlIHNlYXJjaGVkIGlmIGEgI2luY2x1ZGUgaXMgZm91bmQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hfSU5DTFVERVMgICAgICAgID0gWUVTCisKKyMgVGhlIElOQ0xVREVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBub3QgaW5wdXQgZmlsZXMgYnV0IHNob3VsZCBiZSBwcm9jZXNzZWQgYnkgdGhlCisjIHByZXByb2Nlc3Nvci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSF9JTkNMVURFUyBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX1BBVEggICAgICAgICAgID0gL1ZvbHVtZXMvQS9hb3NwL3ByZWJ1aWx0cy9jbGFuZy9kYXJ3aW4teDg2L2hvc3QvMy42L2xpYi9jbGFuZy8zLjYvaW5jbHVkZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2V4dGVybmFsL2xpYmN4eC9pbmNsdWRlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAvVm9sdW1lcy9BL2Fvc3AvYmlvbmljL2xpYmMvaW5jbHVkZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgL1ZvbHVtZXMvQS9hb3NwL2Jpb25pYy9saWJjL2tlcm5lbC91YXBpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAvVm9sdW1lcy9BL2Fvc3AvYmlvbmljL2xpYmMva2VybmVsL3VhcGkvYXNtLWFybTY0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAvVm9sdW1lcy9BL2Fvc3AvZXh0ZXJuYWwvZ3Rlc3QKKworIyBZb3UgY2FuIHVzZSB0aGUgSU5DTFVERV9GSUxFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkCisjIHBhdHRlcm5zIChsaWtlICouaCBhbmQgKi5ocHApIHRvIGZpbHRlciBvdXQgdGhlIGhlYWRlci1maWxlcyBpbiB0aGUKKyMgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmssIHRoZSBwYXR0ZXJucyBzcGVjaWZpZWQgd2l0aCBGSUxFX1BBVFRFUk5TIHdpbGwgYmUKKyMgdXNlZC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK0lOQ0xVREVfRklMRV9QQVRURVJOUyAgPSAKKworIyBUaGUgUFJFREVGSU5FRCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBtYWNybyBuYW1lcyB0aGF0IGFyZQorIyBkZWZpbmVkIGJlZm9yZSB0aGUgcHJlcHJvY2Vzc29yIGlzIHN0YXJ0ZWQgKHNpbWlsYXIgdG8gdGhlIC1EIG9wdGlvbiBvZiBlLmcuCisjIGdjYykuIFRoZSBhcmd1bWVudCBvZiB0aGUgdGFnIGlzIGEgbGlzdCBvZiBtYWNyb3Mgb2YgdGhlIGZvcm06IG5hbWUgb3IKKyMgbmFtZT1kZWZpbml0aW9uIChubyBzcGFjZXMpLiBJZiB0aGUgZGVmaW5pdGlvbiBhbmQgdGhlICI9IiBhcmUgb21pdHRlZCwgIj0xIgorIyBpcyBhc3N1bWVkLiBUbyBwcmV2ZW50IGEgbWFjcm8gZGVmaW5pdGlvbiBmcm9tIGJlaW5nIHVuZGVmaW5lZCB2aWEgI3VuZGVmIG9yCisjIHJlY3Vyc2l2ZWx5IGV4cGFuZGVkIHVzZSB0aGUgOj0gb3BlcmF0b3IgaW5zdGVhZCBvZiB0aGUgPSBvcGVyYXRvci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEVOQUJMRV9QUkVQUk9DRVNTSU5HIGlzIHNldCB0byBZRVMuCisKK1BSRURFRklORUQgICAgICAgICAgICAgPSBfX0FQUExFX189IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX0FORFJPSURfXz0xIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEOj0xIFwKKwkJCSBfX3VudXNlZD0KKworIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIGFuZCBFWFBBTkRfT05MWV9QUkVERUYgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIHRoaXMKKyMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsaXN0IG9mIG1hY3JvIG5hbWVzIHRoYXQgc2hvdWxkIGJlIGV4cGFuZGVkLiBUaGUKKyMgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IGlzIGZvdW5kIGluIHRoZSBzb3VyY2VzIHdpbGwgYmUgdXNlZC4gVXNlIHRoZSBQUkVERUZJTkVECisjIHRhZyBpZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgbWFjcm8gZGVmaW5pdGlvbiB0aGF0IG92ZXJydWxlcyB0aGUKKyMgZGVmaW5pdGlvbiBmb3VuZCBpbiB0aGUgc291cmNlIGNvZGUuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitFWFBBTkRfQVNfREVGSU5FRCAgICAgID0gREVGSU5FX0ZMRVhJQkxFX01FVEhPRFMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIERFRklORV9DQVNUX09QRVJBVE9SUworCisjIElmIHRoZSBTS0lQX0ZVTkNUSU9OX01BQ1JPUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4ncyBwcmVwcm9jZXNzb3Igd2lsbAorIyByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb24tbGlrZSBtYWNyb3MgdGhhdCBhcmUgYWxvbmUgb24gYSBsaW5lLCBoYXZlCisjIGFuIGFsbCB1cHBlcmNhc2UgbmFtZSwgYW5kIGRvIG5vdCBlbmQgd2l0aCBhIHNlbWljb2xvbi4gU3VjaCBmdW5jdGlvbiBtYWNyb3MKKyMgYXJlIHR5cGljYWxseSB1c2VkIGZvciBib2lsZXItcGxhdGUgY29kZSwgYW5kIHdpbGwgY29uZnVzZSB0aGUgcGFyc2VyIGlmIG5vdAorIyByZW1vdmVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworU0tJUF9GVU5DVElPTl9NQUNST1MgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIGV4dGVybmFsIHJlZmVyZW5jZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgVEFHRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgdGFnIGZpbGVzLiBGb3IgZWFjaCB0YWcKKyMgZmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIGFkZGVkLiBUaGUgZm9ybWF0IG9mCisjIGEgdGFnIGZpbGUgd2l0aG91dCB0aGlzIGxvY2F0aW9uIGlzIGFzIGZvbGxvd3M6CisjIFRBR0ZJTEVTID0gZmlsZTEgZmlsZTIgLi4uCisjIEFkZGluZyBsb2NhdGlvbiBmb3IgdGhlIHRhZyBmaWxlcyBpcyBkb25lIGFzIGZvbGxvd3M6CisjIFRBR0ZJTEVTID0gZmlsZTE9bG9jMSAiZmlsZTIgPSBsb2MyIiAuLi4KKyMgd2hlcmUgbG9jMSBhbmQgbG9jMiBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aHMgb3IgVVJMcy4gU2VlIHRoZQorIyBzZWN0aW9uICJMaW5raW5nIHRvIGV4dGVybmFsIGRvY3VtZW50YXRpb24iIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2UKKyMgb2YgdGFnIGZpbGVzLgorIyBOb3RlOiBFYWNoIHRhZyBmaWxlIG11c3QgaGF2ZSBhIHVuaXF1ZSBuYW1lICh3aGVyZSB0aGUgbmFtZSBkb2VzIE5PVCBpbmNsdWRlCisjIHRoZSBwYXRoKS4gSWYgYSB0YWcgZmlsZSBpcyBub3QgbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIGRveHlnZW4gaXMKKyMgcnVuLCB5b3UgbXVzdCBhbHNvIHNwZWNpZnkgdGhlIHBhdGggdG8gdGhlIHRhZ2ZpbGUgaGVyZS4KKworVEFHRklMRVMgICAgICAgICAgICAgICA9IAorCisjIFdoZW4gYSBmaWxlIG5hbWUgaXMgc3BlY2lmaWVkIGFmdGVyIEdFTkVSQVRFX1RBR0ZJTEUsIGRveHlnZW4gd2lsbCBjcmVhdGUgYQorIyB0YWcgZmlsZSB0aGF0IGlzIGJhc2VkIG9uIHRoZSBpbnB1dCBmaWxlcyBpdCByZWFkcy4gU2VlIHNlY3Rpb24gIkxpbmtpbmcgdG8KKyMgZXh0ZXJuYWwgZG9jdW1lbnRhdGlvbiIgZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHVzYWdlIG9mIHRhZyBmaWxlcy4KKworR0VORVJBVEVfVEFHRklMRSAgICAgICA9IAorCisjIElmIHRoZSBBTExFWFRFUk5BTFMgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBleHRlcm5hbCBjbGFzcyB3aWxsIGJlIGxpc3RlZCBpbgorIyB0aGUgY2xhc3MgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgaW5oZXJpdGVkIGV4dGVybmFsIGNsYXNzZXMgd2lsbCBiZQorIyBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQUxMRVhURVJOQUxTICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIEVYVEVSTkFMX0dST1VQUyB0YWcgaXMgc2V0IHRvIFlFUywgYWxsIGV4dGVybmFsIGdyb3VwcyB3aWxsIGJlIGxpc3RlZAorIyBpbiB0aGUgbW9kdWxlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBncm91cHMgd2lsbCBiZQorIyBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VYVEVSTkFMX0dST1VQUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRVhURVJOQUxfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMsIGFsbCBleHRlcm5hbCBwYWdlcyB3aWxsIGJlIGxpc3RlZCBpbgorIyB0aGUgcmVsYXRlZCBwYWdlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBwYWdlcyB3aWxsCisjIGJlIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRVhURVJOQUxfUEFHRVMgICAgICAgICA9IFlFUworCisjIFRoZSBQRVJMX1BBVEggc2hvdWxkIGJlIHRoZSBhYnNvbHV0ZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBwZXJsIHNjcmlwdAorIyBpbnRlcnByZXRlciAoaS5lLiB0aGUgcmVzdWx0IG9mICd3aGljaCBwZXJsJykuCisjIFRoZSBkZWZhdWx0IGZpbGUgKHdpdGggYWJzb2x1dGUgcGF0aCkgaXM6IC91c3IvYmluL3BlcmwuCisKK1BFUkxfUEFUSCAgICAgICAgICAgICAgPSAvdXNyL2Jpbi9wZXJsCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjbGFzcyBkaWFncmFtCisjIChpbiBIVE1MIGFuZCBMYVRlWCkgZm9yIGNsYXNzZXMgd2l0aCBiYXNlIG9yIHN1cGVyIGNsYXNzZXMuIFNldHRpbmcgdGhlIHRhZyB0bworIyBOTyB0dXJucyB0aGUgZGlhZ3JhbXMgb2ZmLiBOb3RlIHRoYXQgdGhpcyBvcHRpb24gYWxzbyB3b3JrcyB3aXRoIEhBVkVfRE9UCisjIGRpc2FibGVkLCBidXQgaXQgaXMgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhbmQgdXNlIGRvdCwgc2luY2UgaXQgeWllbGRzIG1vcmUKKyMgcG93ZXJmdWwgZ3JhcGhzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitDTEFTU19ESUFHUkFNUyAgICAgICAgID0gWUVTCisKKyMgWW91IGNhbiBkZWZpbmUgbWVzc2FnZSBzZXF1ZW5jZSBjaGFydHMgd2l0aGluIGRveHlnZW4gY29tbWVudHMgdXNpbmcgdGhlIFxtc2MKKyMgY29tbWFuZC4gRG94eWdlbiB3aWxsIHRoZW4gcnVuIHRoZSBtc2NnZW4gdG9vbCAoc2VlOgorIyBodHRwOi8vd3d3Lm1jdGVybmFuLm1lLnVrL21zY2dlbi8pKSB0byBwcm9kdWNlIHRoZSBjaGFydCBhbmQgaW5zZXJ0IGl0IGluIHRoZQorIyBkb2N1bWVudGF0aW9uLiBUaGUgTVNDR0VOX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlCisjIHRoZSBtc2NnZW4gdG9vbCByZXNpZGVzLiBJZiBsZWZ0IGVtcHR5IHRoZSB0b29sIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlCisjIGRlZmF1bHQgc2VhcmNoIHBhdGguCisKK01TQ0dFTl9QQVRIICAgICAgICAgICAgPSAKKworIyBZb3UgY2FuIGluY2x1ZGUgZGlhZ3JhbXMgbWFkZSB3aXRoIGRpYSBpbiBkb3h5Z2VuIGRvY3VtZW50YXRpb24uIERveHlnZW4gd2lsbAorIyB0aGVuIHJ1biBkaWEgdG8gcHJvZHVjZSB0aGUgZGlhZ3JhbSBhbmQgaW5zZXJ0IGl0IGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGUKKyMgRElBX1BBVEggdGFnIGFsbG93cyB5b3UgdG8gc3BlY2lmeSB0aGUgZGlyZWN0b3J5IHdoZXJlIHRoZSBkaWEgYmluYXJ5IHJlc2lkZXMuCisjIElmIGxlZnQgZW1wdHkgZGlhIGlzIGFzc3VtZWQgdG8gYmUgZm91bmQgaW4gdGhlIGRlZmF1bHQgc2VhcmNoIHBhdGguCisKK0RJQV9QQVRIICAgICAgICAgICAgICAgPSAKKworIyBJZiBzZXQgdG8gWUVTIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBoaWRlIGluaGVyaXRhbmNlCisjIGFuZCB1c2FnZSByZWxhdGlvbnMgaWYgdGhlIHRhcmdldCBpcyB1bmRvY3VtZW50ZWQgb3IgaXMgbm90IGEgY2xhc3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0hJREVfVU5ET0NfUkVMQVRJT05TICAgPSBZRVMKKworIyBJZiB5b3Ugc2V0IHRoZSBIQVZFX0RPVCB0YWcgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGFzc3VtZSB0aGUgZG90IHRvb2wgaXMKKyMgYXZhaWxhYmxlIGZyb20gdGhlIHBhdGguIFRoaXMgdG9vbCBpcyBwYXJ0IG9mIEdyYXBodml6IChzZWU6CisjIGh0dHA6Ly93d3cuZ3JhcGh2aXoub3JnLyksIGEgZ3JhcGggdmlzdWFsaXphdGlvbiB0b29sa2l0IGZyb20gQVQmVCBhbmQgTHVjZW50CisjIEJlbGwgTGFicy4gVGhlIG90aGVyIG9wdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGhhdmUgbm8gZWZmZWN0IGlmIHRoaXMgb3B0aW9uIGlzCisjIHNldCB0byBOTworIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hBVkVfRE9UICAgICAgICAgICAgICAgPSBOTworCisjIFRoZSBET1RfTlVNX1RIUkVBRFMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZG90IGludm9jYXRpb25zIGRveHlnZW4gaXMgYWxsb3dlZAorIyB0byBydW4gaW4gcGFyYWxsZWwuIFdoZW4gc2V0IHRvIDAgZG94eWdlbiB3aWxsIGJhc2UgdGhpcyBvbiB0aGUgbnVtYmVyIG9mCisjIHByb2Nlc3NvcnMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0uIFlvdSBjYW4gc2V0IGl0IGV4cGxpY2l0bHkgdG8gYSB2YWx1ZQorIyBsYXJnZXIgdGhhbiAwIHRvIGdldCBjb250cm9sIG92ZXIgdGhlIGJhbGFuY2UgYmV0d2VlbiBDUFUgbG9hZCBhbmQgcHJvY2Vzc2luZworIyBzcGVlZC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMzIsIGRlZmF1bHQgdmFsdWU6IDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfTlVNX1RIUkVBRFMgICAgICAgID0gMAorCisjIFdoZW4geW91IHdhbnQgYSBkaWZmZXJlbnRseSBsb29raW5nIGZvbnQgaW4gdGhlIGRvdCBmaWxlcyB0aGF0IGRveHlnZW4KKyMgZ2VuZXJhdGVzIHlvdSBjYW4gc3BlY2lmeSB0aGUgZm9udCBuYW1lIHVzaW5nIERPVF9GT05UTkFNRS4gWW91IG5lZWQgdG8gbWFrZQorIyBzdXJlIGRvdCBpcyBhYmxlIHRvIGZpbmQgdGhlIGZvbnQsIHdoaWNoIGNhbiBiZSBkb25lIGJ5IHB1dHRpbmcgaXQgaW4gYQorIyBzdGFuZGFyZCBsb2NhdGlvbiBvciBieSBzZXR0aW5nIHRoZSBET1RGT05UUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBieQorIyBzZXR0aW5nIERPVF9GT05UUEFUSCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZvbnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBIZWx2ZXRpY2EuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfRk9OVE5BTUUgICAgICAgICAgID0gSGVsdmV0aWNhCisKKyMgVGhlIERPVF9GT05UU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBzaXplIChpbiBwb2ludHMpIG9mIHRoZSBmb250IG9mCisjIGRvdCBncmFwaHMuCisjIE1pbmltdW0gdmFsdWU6IDQsIG1heGltdW0gdmFsdWU6IDI0LCBkZWZhdWx0IHZhbHVlOiAxMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9GT05UU0laRSAgICAgICAgICAgPSAxMAorCisjIEJ5IGRlZmF1bHQgZG94eWdlbiB3aWxsIHRlbGwgZG90IHRvIHVzZSB0aGUgZGVmYXVsdCBmb250IGFzIHNwZWNpZmllZCB3aXRoCisjIERPVF9GT05UTkFNRS4gSWYgeW91IHNwZWNpZnkgYSBkaWZmZXJlbnQgZm9udCB1c2luZyBET1RfRk9OVE5BTUUgeW91IGNhbiBzZXQKKyMgdGhlIHBhdGggd2hlcmUgZG90IGNhbiBmaW5kIGl0IHVzaW5nIHRoaXMgdGFnLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0ZPTlRQQVRIICAgICAgICAgICA9IAorCisjIElmIHRoZSBDTEFTU19HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvcgorIyBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmhlcml0YW5jZSByZWxhdGlvbnMuCisjIFNldHRpbmcgdGhpcyB0YWcgdG8gWUVTIHdpbGwgZm9yY2UgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyB0byBOTy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0NMQVNTX0dSQVBIICAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgQ09MTEFCT1JBVElPTl9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhCisjIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQgY2xhc3Mgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbXBsZW1lbnRhdGlvbgorIyBkZXBlbmRlbmNpZXMgKGluaGVyaXRhbmNlLCBjb250YWlubWVudCwgYW5kIGNsYXNzIHJlZmVyZW5jZXMgdmFyaWFibGVzKSBvZiB0aGUKKyMgY2xhc3Mgd2l0aCBvdGhlciBkb2N1bWVudGVkIGNsYXNzZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDT0xMQUJPUkFUSU9OX0dSQVBIICAgID0gWUVTCisKKyMgSWYgdGhlIEdST1VQX0dSQVBIUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvcgorIyBncm91cHMsIHNob3dpbmcgdGhlIGRpcmVjdCBncm91cHMgZGVwZW5kZW5jaWVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworR1JPVVBfR1JBUEhTICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGluaGVyaXRhbmNlIGFuZAorIyBjb2xsYWJvcmF0aW9uIGRpYWdyYW1zIGluIGEgc3R5bGUgc2ltaWxhciB0byB0aGUgT01HJ3MgVW5pZmllZCBNb2RlbGluZworIyBMYW5ndWFnZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworVU1MX0xPT0sgICAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBlbmFibGVkLCB0aGUgZmllbGRzIGFuZCBtZXRob2RzIGFyZSBzaG93biBpbnNpZGUgdGhlCisjIGNsYXNzIG5vZGUuIElmIHRoZXJlIGFyZSBtYW55IGZpZWxkcyBvciBtZXRob2RzIGFuZCBtYW55IG5vZGVzIHRoZSBncmFwaCBtYXkKKyMgYmVjb21lIHRvbyBiaWcgdG8gYmUgdXNlZnVsLiBUaGUgVU1MX0xJTUlUX05VTV9GSUVMRFMgdGhyZXNob2xkIGxpbWl0cyB0aGUKKyMgbnVtYmVyIG9mIGl0ZW1zIGZvciBlYWNoIHR5cGUgdG8gbWFrZSB0aGUgc2l6ZSBtb3JlIG1hbmFnZWFibGUuIFNldCB0aGlzIHRvIDAKKyMgZm9yIG5vIGxpbWl0LiBOb3RlIHRoYXQgdGhlIHRocmVzaG9sZCBtYXkgYmUgZXhjZWVkZWQgYnkgNTAlIGJlZm9yZSB0aGUgbGltaXQKKyMgaXMgZW5mb3JjZWQuIFNvIHdoZW4geW91IHNldCB0aGUgdGhyZXNob2xkIHRvIDEwLCB1cCB0byAxNSBmaWVsZHMgbWF5IGFwcGVhciwKKyMgYnV0IGlmIHRoZSBudW1iZXIgZXhjZWVkcyAxNSwgdGhlIHRvdGFsIGFtb3VudCBvZiBmaWVsZHMgc2hvd24gaXMgbGltaXRlZCB0bworIyAxMC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwLCBkZWZhdWx0IHZhbHVlOiAxMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1VNTF9MSU1JVF9OVU1fRklFTERTICAgPSAxMAorCisjIElmIHRoZSBURU1QTEFURV9SRUxBVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgaW5oZXJpdGFuY2UgYW5kCisjIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgc2hvdyB0aGUgcmVsYXRpb25zIGJldHdlZW4gdGVtcGxhdGVzIGFuZCB0aGVpcgorIyBpbnN0YW5jZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1RFTVBMQVRFX1JFTEFUSU9OUyAgICAgPSBOTworCisjIElmIHRoZSBJTkNMVURFX0dSQVBILCBFTkFCTEVfUFJFUFJPQ0VTU0lORyBhbmQgU0VBUkNIX0lOQ0xVREVTIHRhZ3MgYXJlIHNldCB0bworIyBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGZpbGUgc2hvd2luZyB0aGUKKyMgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIG90aGVyIGRvY3VtZW50ZWQKKyMgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX0dSQVBIICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIElOQ0xVREVEX0JZX0dSQVBILCBFTkFCTEVfUFJFUFJPQ0VTU0lORyBhbmQgU0VBUkNIX0lOQ0xVREVTIHRhZ3MgYXJlCisjIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBncmFwaCBmb3IgZWFjaCBkb2N1bWVudGVkIGZpbGUgc2hvd2luZworIyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoIG90aGVyIGRvY3VtZW50ZWQKKyMgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFRF9CWV9HUkFQSCAgICAgID0gWUVTCisKKyMgSWYgdGhlIENBTExfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsCisjIGRlcGVuZGVuY3kgZ3JhcGggZm9yIGV2ZXJ5IGdsb2JhbCBmdW5jdGlvbiBvciBjbGFzcyBtZXRob2QuCisjCisjIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHRpbWUgb2YgYSBydW4uCisjIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGwgZ3JhcGhzIGZvciBzZWxlY3RlZAorIyBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxncmFwaCBjb21tYW5kLiBEaXNhYmxpbmcgYSBjYWxsIGdyYXBoIGNhbiBiZQorIyBhY2NvbXBsaXNoZWQgYnkgbWVhbnMgb2YgdGhlIGNvbW1hbmQgXGhpZGVjYWxsZ3JhcGguCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0NBTExfR1JBUEggICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBDQUxMRVJfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBjYWxsZXIKKyMgZGVwZW5kZW5jeSBncmFwaCBmb3IgZXZlcnkgZ2xvYmFsIGZ1bmN0aW9uIG9yIGNsYXNzIG1ldGhvZC4KKyMKKyMgTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgdGltZSBvZiBhIHJ1bi4KKyMgU28gaW4gbW9zdCBjYXNlcyBpdCB3aWxsIGJlIGJldHRlciB0byBlbmFibGUgY2FsbGVyIGdyYXBocyBmb3Igc2VsZWN0ZWQKKyMgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZXJncmFwaCBjb21tYW5kLiBEaXNhYmxpbmcgYSBjYWxsZXIgZ3JhcGggY2FuIGJlCisjIGFjY29tcGxpc2hlZCBieSBtZWFucyBvZiB0aGUgY29tbWFuZCBcaGlkZWNhbGxlcmdyYXBoLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitDQUxMRVJfR1JBUEggICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgR1JBUEhJQ0FMX0hJRVJBUkNIWSB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBncmFwaGljYWwKKyMgaGllcmFyY2h5IG9mIGFsbCBjbGFzc2VzIGluc3RlYWQgb2YgYSB0ZXh0dWFsIG9uZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0dSQVBISUNBTF9ISUVSQVJDSFkgICAgPSBZRVMKKworIyBJZiB0aGUgRElSRUNUT1JZX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgdGhlCisjIGRlcGVuZGVuY2llcyBhIGRpcmVjdG9yeSBoYXMgb24gb3RoZXIgZGlyZWN0b3JpZXMgaW4gYSBncmFwaGljYWwgd2F5LiBUaGUKKyMgZGVwZW5kZW5jeSByZWxhdGlvbnMgYXJlIGRldGVybWluZWQgYnkgdGhlICNpbmNsdWRlIHJlbGF0aW9ucyBiZXR3ZWVuIHRoZQorIyBmaWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitESVJFQ1RPUllfR1JBUEggICAgICAgID0gWUVTCisKKyMgVGhlIERPVF9JTUFHRV9GT1JNQVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgaW1hZ2UgZm9ybWF0IG9mIHRoZSBpbWFnZXMKKyMgZ2VuZXJhdGVkIGJ5IGRvdC4gRm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoZSBpbWFnZSBmb3JtYXRzIHNlZSB0aGUgc2VjdGlvbgorIyBvdXRwdXQgZm9ybWF0cyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZG90IHRvb2wgKEdyYXBodml6IChzZWU6CisjIGh0dHA6Ly93d3cuZ3JhcGh2aXoub3JnLykpLgorIyBOb3RlOiBJZiB5b3UgY2hvb3NlIHN2ZyB5b3UgbmVlZCB0byBzZXQgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlcgorIyB0byBtYWtlIHRoZSBTVkcgZmlsZXMgdmlzaWJsZSBpbiBJRSA5KyAob3RoZXIgYnJvd3NlcnMgZG8gbm90IGhhdmUgdGhpcworIyByZXF1aXJlbWVudCkuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IHBuZywganBnLCBnaWYsIHN2ZywgcG5nOmdkLCBwbmc6Z2Q6Z2QsIHBuZzpjYWlybywKKyMgcG5nOmNhaXJvOmdkLCBwbmc6Y2Fpcm86Y2Fpcm8sIHBuZzpjYWlybzpnZGlwbHVzLCBwbmc6Z2RpcGx1cyBhbmQKKyMgcG5nOmdkaXBsdXM6Z2RpcGx1cy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IHBuZy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9JTUFHRV9GT1JNQVQgICAgICAgPSBwbmcKKworIyBJZiBET1RfSU1BR0VfRk9STUFUIGlzIHNldCB0byBzdmcsIHRoZW4gdGhpcyBvcHRpb24gY2FuIGJlIHNldCB0byBZRVMgdG8KKyMgZW5hYmxlIGdlbmVyYXRpb24gb2YgaW50ZXJhY3RpdmUgU1ZHIGltYWdlcyB0aGF0IGFsbG93IHpvb21pbmcgYW5kIHBhbm5pbmcuCisjCisjIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIGEgbW9kZXJuIGJyb3dzZXIgb3RoZXIgdGhhbiBJbnRlcm5ldCBFeHBsb3Jlci4gVGVzdGVkCisjIGFuZCB3b3JraW5nIGFyZSBGaXJlZm94LCBDaHJvbWUsIFNhZmFyaSwgYW5kIE9wZXJhLgorIyBOb3RlOiBGb3IgSUUgOSsgeW91IG5lZWQgdG8gc2V0IEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIgdG8gbWFrZQorIyB0aGUgU1ZHIGZpbGVzIHZpc2libGUuIE9sZGVyIHZlcnNpb25zIG9mIElFIGRvIG5vdCBoYXZlIFNWRyBzdXBwb3J0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTlRFUkFDVElWRV9TVkcgICAgICAgID0gTk8KKworIyBUaGUgRE9UX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggd2hlcmUgdGhlIGRvdCB0b29sIGNhbiBiZQorIyBmb3VuZC4gSWYgbGVmdCBibGFuaywgaXQgaXMgYXNzdW1lZCB0aGUgZG90IHRvb2wgY2FuIGJlIGZvdW5kIGluIHRoZSBwYXRoLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX1BBVEggICAgICAgICAgICAgICA9IAorCisjIFRoZSBET1RGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGRvdCBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZSBcZG90ZmlsZQorIyBjb21tYW5kKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVEZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBUaGUgTVNDRklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBtc2MgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXG1zY2ZpbGUKKyMgY29tbWFuZCkuCisKK01TQ0ZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBUaGUgRElBRklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBkaWEgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXGRpYWZpbGUKKyMgY29tbWFuZCkuCisKK0RJQUZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBXaGVuIHVzaW5nIHBsYW50dW1sLCB0aGUgUExBTlRVTUxfSkFSX1BBVEggdGFnIHNob3VsZCBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlCisjIHBhdGggd2hlcmUgamF2YSBjYW4gZmluZCB0aGUgcGxhbnR1bWwuamFyIGZpbGUuIElmIGxlZnQgYmxhbmssIGl0IGlzIGFzc3VtZWQKKyMgUGxhbnRVTUwgaXMgbm90IHVzZWQgb3IgY2FsbGVkIGR1cmluZyBhIHByZXByb2Nlc3Npbmcgc3RlcC4gRG94eWdlbiB3aWxsCisjIGdlbmVyYXRlIGEgd2FybmluZyB3aGVuIGl0IGVuY291bnRlcnMgYSBcc3RhcnR1bWwgY29tbWFuZCBpbiB0aGlzIGNhc2UgYW5kCisjIHdpbGwgbm90IGdlbmVyYXRlIG91dHB1dCBmb3IgdGhlIGRpYWdyYW0uCisKK1BMQU5UVU1MX0pBUl9QQVRIICAgICAgPSAKKworIyBXaGVuIHVzaW5nIHBsYW50dW1sLCB0aGUgc3BlY2lmaWVkIHBhdGhzIGFyZSBzZWFyY2hlZCBmb3IgZmlsZXMgc3BlY2lmaWVkIGJ5CisjIHRoZSAhaW5jbHVkZSBzdGF0ZW1lbnQgaW4gYSBwbGFudHVtbCBibG9jay4KKworUExBTlRVTUxfSU5DTFVERV9QQVRIICA9IAorCisjIFRoZSBET1RfR1JBUEhfTUFYX05PREVTIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gbnVtYmVyIG9mIG5vZGVzCisjIHRoYXQgd2lsbCBiZSBzaG93biBpbiB0aGUgZ3JhcGguIElmIHRoZSBudW1iZXIgb2Ygbm9kZXMgaW4gYSBncmFwaCBiZWNvbWVzCisjIGxhcmdlciB0aGFuIHRoaXMgdmFsdWUsIGRveHlnZW4gd2lsbCB0cnVuY2F0ZSB0aGUgZ3JhcGgsIHdoaWNoIGlzIHZpc3VhbGl6ZWQKKyMgYnkgcmVwcmVzZW50aW5nIGEgbm9kZSBhcyBhIHJlZCBib3guIE5vdGUgdGhhdCBkb3h5Z2VuIGlmIHRoZSBudW1iZXIgb2YgZGlyZWN0CisjIGNoaWxkcmVuIG9mIHRoZSByb290IG5vZGUgaW4gYSBncmFwaCBpcyBhbHJlYWR5IGxhcmdlciB0aGFuCisjIERPVF9HUkFQSF9NQVhfTk9ERVMgdGhlbiB0aGUgZ3JhcGggd2lsbCBub3QgYmUgc2hvd24gYXQgYWxsLiBBbHNvIG5vdGUgdGhhdAorIyB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkgTUFYX0RPVF9HUkFQSF9ERVBUSC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMTAwMDAsIGRlZmF1bHQgdmFsdWU6IDUwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0dSQVBIX01BWF9OT0RFUyAgICA9IDUwCisKKyMgVGhlIE1BWF9ET1RfR1JBUEhfREVQVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbWF4aW11bSBkZXB0aCBvZiB0aGUgZ3JhcGhzCisjIGdlbmVyYXRlZCBieSBkb3QuIEEgZGVwdGggdmFsdWUgb2YgMyBtZWFucyB0aGF0IG9ubHkgbm9kZXMgcmVhY2hhYmxlIGZyb20gdGhlCisjIHJvb3QgYnkgZm9sbG93aW5nIGEgcGF0aCB2aWEgYXQgbW9zdCAzIGVkZ2VzIHdpbGwgYmUgc2hvd24uIE5vZGVzIHRoYXQgbGF5CisjIGZ1cnRoZXIgZnJvbSB0aGUgcm9vdCBub2RlIHdpbGwgYmUgb21pdHRlZC4gTm90ZSB0aGF0IHNldHRpbmcgdGhpcyBvcHRpb24gdG8gMQorIyBvciAyIG1heSBncmVhdGx5IHJlZHVjZSB0aGUgY29tcHV0YXRpb24gdGltZSBuZWVkZWQgZm9yIGxhcmdlIGNvZGUgYmFzZXMuIEFsc28KKyMgbm90ZSB0aGF0IHRoZSBzaXplIG9mIGEgZ3JhcGggY2FuIGJlIGZ1cnRoZXIgcmVzdHJpY3RlZCBieQorIyBET1RfR1JBUEhfTUFYX05PREVTLiBVc2luZyBhIGRlcHRoIG9mIDAgbWVhbnMgbm8gZGVwdGggcmVzdHJpY3Rpb24uCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAsIGRlZmF1bHQgdmFsdWU6IDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitNQVhfRE9UX0dSQVBIX0RFUFRIICAgID0gMAorCisjIFNldCB0aGUgRE9UX1RSQU5TUEFSRU5UIHRhZyB0byBZRVMgdG8gZ2VuZXJhdGUgaW1hZ2VzIHdpdGggYSB0cmFuc3BhcmVudAorIyBiYWNrZ3JvdW5kLiBUaGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJlY2F1c2UgZG90IG9uIFdpbmRvd3MgZG9lcyBub3Qgc2VlbQorIyB0byBzdXBwb3J0IHRoaXMgb3V0IG9mIHRoZSBib3guCisjCisjIFdhcm5pbmc6IERlcGVuZGluZyBvbiB0aGUgcGxhdGZvcm0gdXNlZCwgZW5hYmxpbmcgdGhpcyBvcHRpb24gbWF5IGxlYWQgdG8KKyMgYmFkbHkgYW50aS1hbGlhc2VkIGxhYmVscyBvbiB0aGUgZWRnZXMgb2YgYSBncmFwaCAoaS5lLiB0aGV5IGJlY29tZSBoYXJkIHRvCisjIHJlYWQpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfVFJBTlNQQVJFTlQgICAgICAgID0gTk8KKworIyBTZXQgdGhlIERPVF9NVUxUSV9UQVJHRVRTIHRhZyB0byBZRVMgdG8gYWxsb3cgZG90IHRvIGdlbmVyYXRlIG11bHRpcGxlIG91dHB1dAorIyBmaWxlcyBpbiBvbmUgcnVuIChpLmUuIG11bHRpcGxlIC1vIGFuZCAtVCBvcHRpb25zIG9uIHRoZSBjb21tYW5kIGxpbmUpLiBUaGlzCisjIG1ha2VzIGRvdCBydW4gZmFzdGVyLCBidXQgc2luY2Ugb25seSBuZXdlciB2ZXJzaW9ucyBvZiBkb3QgKD4xLjguMTApIHN1cHBvcnQKKyMgdGhpcywgdGhpcyBmZWF0dXJlIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9NVUxUSV9UQVJHRVRTICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9MRUdFTkQgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgbGVnZW5kIHBhZ2UKKyMgZXhwbGFpbmluZyB0aGUgbWVhbmluZyBvZiB0aGUgdmFyaW91cyBib3hlcyBhbmQgYXJyb3dzIGluIHRoZSBkb3QgZ2VuZXJhdGVkCisjIGdyYXBocy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0xFR0VORCAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgRE9UX0NMRUFOVVAgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCByZW1vdmUgdGhlIGludGVybWVkaWF0ZSBkb3QKKyMgZmlsZXMgdGhhdCBhcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdmFyaW91cyBncmFwaHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwYWQzY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQW5kcm9pZC5icApAQCAtMCwwICsxLDI5IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl9jb21wb25lbnRfd3JhcHBlciIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyQ29tcG9uZW50V3JhcHBlci5jcHAiLAorICAgICAgICAiU2ltcGxlTWV0aG9kU3RhdGUuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9DMkNvbXBvbmVudFdyYXBwZXIuY3BwIGIvbWVkaWEvY29kZWMyL2ZhdWx0aW5qZWN0aW9uL0MyQ29tcG9uZW50V3JhcHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ1ZjhiZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9DMkNvbXBvbmVudFdyYXBwZXIuY3BwCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJDb21wb25lbnRXcmFwcGVyIgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnRXcmFwcGVyLmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKworYzJfc3RhdHVzX3QgV3JhcFNpbXBsZU1ldGhvZCgKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdCh2b2lkKT4gb3AsIGNvbnN0IFNpbXBsZU1ldGhvZFN0YXRlICZzdGF0ZSkgeworICAgIGMyX3N0YXR1c190IHJlc3VsdCA9IEMyX09LOworICAgIHN3aXRjaCAoc3RhdGUuZ2V0TW9kZSgpKSB7CisgICAgICAgIGNhc2UgU2ltcGxlTWV0aG9kU3RhdGU6OkVYRUNVVEU6CisgICAgICAgICAgICByZXN1bHQgPSBvcCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2ltcGxlTWV0aG9kU3RhdGU6Ok5PX09QOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU2ltcGxlTWV0aG9kU3RhdGU6OkhBTkc6CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIHN0ZDo6dGhpc190aHJlYWQ6OnNsZWVwX2Zvcigxcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgKHZvaWQpc3RhdGUub3ZlcnJpZGVSZXN1bHQoJnJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0MyQ29tcG9uZW50V3JhcHBlcjo6SW5qZWN0ZXI6OkluamVjdGVyKEMyQ29tcG9uZW50V3JhcHBlciAqdGhpeikgOiBtVGhpeih0aGl6KSB7fQorCitTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXIgQzJDb21wb25lbnRXcmFwcGVyOjpJbmplY3Rlcjo6c3RhcnQoKSB7CisgICAgcmV0dXJuIFNpbXBsZU1ldGhvZFN0YXRlOjpJbmplY3RlcigmbVRoaXotPm1TdGFydFN0YXRlKTsKK30KKworQzJDb21wb25lbnRXcmFwcGVyOjpMaXN0ZW5lcjo6TGlzdGVuZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lcikgOiBtTGlzdGVuZXIobGlzdGVuZXIpIHt9CisKK3ZvaWQgQzJDb21wb25lbnRXcmFwcGVyOjpMaXN0ZW5lcjo6b25Xb3JrRG9uZV9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0l0ZW1zKSB7CisgICAgbUxpc3RlbmVyLT5vbldvcmtEb25lX25iKGNvbXBvbmVudCwgc3RkOjptb3ZlKHdvcmtJdGVtcykpOworfQorCit2b2lkIEMyQ29tcG9uZW50V3JhcHBlcjo6TGlzdGVuZXI6Om9uVHJpcHBlZF9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBzZXR0aW5nUmVzdWx0KSB7CisgICAgbUxpc3RlbmVyLT5vblRyaXBwZWRfbmIoY29tcG9uZW50LHNldHRpbmdSZXN1bHQpOworfQorCit2b2lkIEMyQ29tcG9uZW50V3JhcHBlcjo6TGlzdGVuZXI6Om9uRXJyb3JfbmIoCisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwgdWludDMyX3QgZXJyb3JDb2RlKSB7CisgICAgbUxpc3RlbmVyLT5vbkVycm9yX25iKGNvbXBvbmVudCwgZXJyb3JDb2RlKTsKK30KKworQzJDb21wb25lbnRXcmFwcGVyOjpDMkNvbXBvbmVudFdyYXBwZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gJmNvbXApIDogbUNvbXAoY29tcCkge30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjpzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gJmxpc3RlbmVyLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSB7CisgICAgbUxpc3RlbmVyID0gc3RkOjptYWtlX3NoYXJlZDxMaXN0ZW5lcj4obGlzdGVuZXIpOworICAgIHJldHVybiBtQ29tcC0+c2V0TGlzdGVuZXJfdmIobUxpc3RlbmVyLCBtYXlCbG9jayk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6cXVldWVfbmIoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIHsKKyAgICByZXR1cm4gbUNvbXAtPnF1ZXVlX25iKGl0ZW1zKTsKK30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjphbm5vdW5jZV9uYihjb25zdCBzdGQ6OnZlY3RvcjxDMldvcmtPdXRsaW5lPiAmaXRlbXMpIHsKKyAgICByZXR1cm4gbUNvbXAtPmFubm91bmNlX25iKGl0ZW1zKTsKK30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjpmbHVzaF9zbSgKKyAgICAgICAgQzJDb21wb25lbnQ6OmZsdXNoX21vZGVfdCBtb2RlLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgeworICAgIHJldHVybiBtQ29tcC0+Zmx1c2hfc20obW9kZSwgZmx1c2hlZFdvcmspOworfQorCitjMl9zdGF0dXNfdCBDMkNvbXBvbmVudFdyYXBwZXI6OmRyYWluX25iKEMyQ29tcG9uZW50OjpkcmFpbl9tb2RlX3QgbW9kZSkgeworICAgIHJldHVybiBtQ29tcC0+ZHJhaW5fbmIobW9kZSk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6c3RhcnQoKSB7CisgICAgcmV0dXJuIFdyYXBTaW1wbGVNZXRob2QoW3RoaXNdIHsgcmV0dXJuIG1Db21wLT5zdGFydCgpOyB9LCBtU3RhcnRTdGF0ZSk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6c3RvcCgpIHsKKyAgICByZXR1cm4gbUNvbXAtPnN0b3AoKTsKK30KKworYzJfc3RhdHVzX3QgQzJDb21wb25lbnRXcmFwcGVyOjpyZXNldCgpIHsKKyAgICByZXR1cm4gbUNvbXAtPnJlc2V0KCk7Cit9CisKK2MyX3N0YXR1c190IEMyQ29tcG9uZW50V3JhcHBlcjo6cmVsZWFzZSgpIHsKKyAgICByZXR1cm4gbUNvbXAtPnJlbGVhc2UoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBDMkNvbXBvbmVudFdyYXBwZXI6OmludGYoKXsKKyAgICByZXR1cm4gbUNvbXAtPmludGYoKTsKK30KKworQzJDb21wb25lbnRXcmFwcGVyOjpJbmplY3RlciBDMkNvbXBvbmVudFdyYXBwZXI6OmluamVjdCgpIHsKKyAgICByZXR1cm4gSW5qZWN0ZXIodGhpcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQzJDb21wb25lbnRXcmFwcGVyLmggYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vQzJDb21wb25lbnRXcmFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM3MzUwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9DMkNvbXBvbmVudFdyYXBwZXIuaApAQCAtMCwwICsxLDg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMl9DT01QT05FTlRfV1JBUFBFUl9IXworI2RlZmluZSBDMl9DT01QT05FTlRfV1JBUFBFUl9IXworCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgIlNpbXBsZU1ldGhvZFN0YXRlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBDcmVhdGVzIGEgV3JhcHBlciBhcm91bmQgdGhlIGNsYXNzIEMyQ29tcG9uZW50IGFuZCBpdHMgbWV0aG9kcy4gVGhlIHdyYXBwZXIgaXMgdXNlZCB0bworICogc2ltdWxhdGUgZXJyb3JzIGluIHRoZSBhbmRyb2lkIG1lZGlhIGNvbXBvbmVudHMgYnkgZmF1bHQgaW5qZWN0aW9uIHRlY2huaXF1ZS4KKyAqIFRoaXMgaXMgZG9uZSB0byBjaGVjayBob3cgdGhlIGZyYW1ld29yayBoYW5kbGVzIHRoZSBlcnJvciBzaXR1YXRpb24uCisgKi8KK2NsYXNzIEMyQ29tcG9uZW50V3JhcHBlcgorICAgICAgICA6IHB1YmxpYyBDMkNvbXBvbmVudCwgcHVibGljIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8QzJDb21wb25lbnRXcmFwcGVyPiB7CitwdWJsaWM6CisgICAgY2xhc3MgSW5qZWN0ZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgSW5qZWN0ZXIoQzJDb21wb25lbnRXcmFwcGVyICp0aGl6KTsKKworICAgICAgICBTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXIgc3RhcnQoKTsKKyAgICBwcml2YXRlOgorICAgICAgICBDMkNvbXBvbmVudFdyYXBwZXIgKmNvbnN0IG1UaGl6OworICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBIHdyYXBwZXIgYXJvdW5kIHRoZSBsaXN0ZW5lciBjbGFzcyBpbnNpZGUgQzJDb21wb25lbnQgY2xhc3MuCisgICAgICovCisgICAgY2xhc3MgTGlzdGVuZXIgOiBwdWJsaWMgQzJDb21wb25lbnQ6Okxpc3RlbmVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IExpc3RlbmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lcik7CisgICAgICAgIHZpcnR1YWwgfkxpc3RlbmVyKCkgPSBkZWZhdWx0OworCisgICAgICAgIHZvaWQgb25Xb3JrRG9uZV9uYihzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtcykgb3ZlcnJpZGU7CisgICAgICAgIHZvaWQgb25UcmlwcGVkX25iKHN0ZDo6d2Vha19wdHI8QzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IHNldHRpbmdSZXN1bHQpIG92ZXJyaWRlOworICAgICAgICB2b2lkIG9uRXJyb3JfbmIoc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4gY29tcG9uZW50LCB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIH07CisKKyAgICBleHBsaWNpdCBDMkNvbXBvbmVudFdyYXBwZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAmY29tcCk7CisgICAgdmlydHVhbCB+QzJDb21wb25lbnRXcmFwcGVyKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzZXRMaXN0ZW5lcl92YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6TGlzdGVuZXI+ICZsaXN0ZW5lciwKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVldWVfbmIoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgYW5ub3VuY2VfbmIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJXb3JrT3V0bGluZT4gJml0ZW1zKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGZsdXNoX3NtKAorICAgICAgICAgICAgZmx1c2hfbW9kZV90IG1vZGUsIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGZsdXNoZWRXb3JrKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGRyYWluX25iKGRyYWluX21vZGVfdCBtb2RlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0YXJ0KCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBzdG9wKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCByZXNldCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcmVsZWFzZSgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmKCkgb3ZlcnJpZGU7CisKKyAgICBJbmplY3RlciBpbmplY3QoKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1Db21wOworCisgICAgU2ltcGxlTWV0aG9kU3RhdGUgbVN0YXJ0U3RhdGU7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQzJfQ09NUE9ORU5UX1dSQVBQRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9TaW1wbGVNZXRob2RTdGF0ZS5jcHAgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OWQ2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuY3BwCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTaW1wbGVNZXRob2RTdGF0ZSIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlICJTaW1wbGVNZXRob2RTdGF0ZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1NpbXBsZU1ldGhvZFN0YXRlOjpJbmplY3Rlcjo6SW5qZWN0ZXIoU2ltcGxlTWV0aG9kU3RhdGUgKnRoaXopIDogbVRoaXoodGhpeikge30KKwordm9pZCBTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXI6OmhhbmcoKSB7CisgICAgbVRoaXotPm1Nb2RlID0gSEFORzsKK30KKwordm9pZCBTaW1wbGVNZXRob2RTdGF0ZTo6SW5qZWN0ZXI6OmZhaWwoYzJfc3RhdHVzX3QgZXJyLCBib29sIGV4ZWN1dGUpIHsKKyAgICBtVGhpei0+bU1vZGUgPSBleGVjdXRlID8gRVhFQ1VURSA6IE5PX09QOworICAgIG1UaGl6LT5tT3ZlcnJpZGUgPSB0cnVlOworICAgIG1UaGl6LT5tUmVzdWx0T3ZlcnJpZGUgPSBlcnI7Cit9CisKK1NpbXBsZU1ldGhvZFN0YXRlOjpTaW1wbGVNZXRob2RTdGF0ZSgpCisgICAgOiBtTW9kZShFWEVDVVRFKSwgbU92ZXJyaWRlKGZhbHNlKSwgbVJlc3VsdE92ZXJyaWRlKEMyX09LKSB7fQorCitTaW1wbGVNZXRob2RTdGF0ZTo6TW9kZSBTaW1wbGVNZXRob2RTdGF0ZTo6Z2V0TW9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU1vZGU7Cit9CisKK2Jvb2wgU2ltcGxlTWV0aG9kU3RhdGU6Om92ZXJyaWRlUmVzdWx0KGMyX3N0YXR1c190ICpyZXN1bHQpIGNvbnN0IHsKKyAgICBpZiAoIW1PdmVycmlkZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgICpyZXN1bHQgPSBtUmVzdWx0T3ZlcnJpZGU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuaCBiL21lZGlhL2NvZGVjMi9mYXVsdGluamVjdGlvbi9TaW1wbGVNZXRob2RTdGF0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMDQ1OWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvZmF1bHRpbmplY3Rpb24vU2ltcGxlTWV0aG9kU3RhdGUuaApAQCAtMCwwICsxLDgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTSU1QTEVfTUVUSE9EX1NUQVRFX0hfCisjZGVmaW5lIFNJTVBMRV9NRVRIT0RfU1RBVEVfSF8KKworI2luY2x1ZGUgPEMyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBTdGF0ZSBmb3IgYSBzaW1wbGUgbWV0aG9kIHdoaWNoIHJldHVybnMgYzJfc3RhdHVzX3QgYW5kIHRha2VzIG5vIHBhcmFtZXRlcnMuCisgKi8KK2NsYXNzIFNpbXBsZU1ldGhvZFN0YXRlIHsKK3B1YmxpYzoKKyAgICBlbnVtIE1vZGUgeworICAgICAgICAvLyBFeGVjdXRlIHRoZSBub3JtYWwgb3BlcmF0aW9uCisgICAgICAgIEVYRUNVVEUsCisgICAgICAgIC8vIERvbid0IGRvIGFueXRoaW5nCisgICAgICAgIE5PX09QLAorICAgICAgICAvLyBIYW5nOyBuZXZlciByZXR1cm4KKyAgICAgICAgSEFORywKKyAgICB9OworCisgICAgLyoqCisgICAgICogSW5qZWN0ZXIgY2xhc3MgdGhhdCBtb2RpZmllcyB0aGUgaW50ZXJuYWwgc3RhdGVzIG9mIHRoaXMgY2xhc3MuCisgICAgICovCisgICAgY2xhc3MgSW5qZWN0ZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgSW5qZWN0ZXIoU2ltcGxlTWV0aG9kU3RhdGUgKnRoaXopOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBIYW5nIHRoZSBvcGVyYXRpb24uCisgICAgICAgICAqLworICAgICAgICB2b2lkIGhhbmcoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogRmFpbCB0aGUgb3BlcmF0aW9uIHdpdGggZ2l2ZW4gcGFyYW1zLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gZXJyICAgICAgIGVycm9yIGNvZGUgdG8gcmVwbGFjZSB0aGUgYWN0dWFsIHJldHVybiB2YWx1ZQorICAgICAgICAgKiBccGFyYW0gZXhlY3V0ZSAgIHdoZXRoZXIgdGhlIHdyYXBwZXIgc2hvdWxkIGV4ZWN1dGUgdGhlIG9wZXJhdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBmYWlsKGMyX3N0YXR1c190IGVyciwgYm9vbCBleGVjdXRlID0gZmFsc2UpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgU2ltcGxlTWV0aG9kU3RhdGUgKmNvbnN0IG1UaGl6OworICAgIH07CisKKyAgICBTaW1wbGVNZXRob2RTdGF0ZSgpOworCisgICAgLyoqCisgICAgICogR2V0IGV4ZWN1dGlvbiBtb2RlLgorICAgICAqLworICAgIE1vZGUgZ2V0TW9kZSgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogT3ZlcnJpZGUgcmVzdWx0IGZyb20gcnVubmluZyB0aGUgb3BlcmF0aW9uIGlmIGNvbmZpZ3VyZWQgc28uCisgICAgICovCisgICAgYm9vbCBvdmVycmlkZVJlc3VsdChjMl9zdGF0dXNfdCAqcmVzdWx0KSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBNb2RlIG1Nb2RlOworICAgIGJvb2wgbU92ZXJyaWRlOworICAgIGMyX3N0YXR1c190IG1SZXN1bHRPdmVycmlkZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBTSU1QTEVfTUVUSE9EX1NUQVRFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyOTMwYTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDEyNSBAQAorLy8gRE8gTk9UIERFUEVORCBPTiBUSElTIERJUkVDVExZCisvLyB1c2UgbGliY29kZWMyLWhpZGwtY2xpZW50LWRlZmF1bHRzIGluc3RlYWQKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfaGlkbF9jbGllbnRAMS4wIiwKKworICAgIGRlZmF1bHRzOiBbImhpZGxfZGVmYXVsdHMiXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkNsaWVudEJsb2NrSGVscGVyLmNwcCIsCisgICAgICAgICJ0eXBlcy5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliY29kZWMyX2ludGVybmFsIiwgLy8gcHJpdmF0ZQorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJwb29sQDIuMC4xIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAuMSIsCisgICAgICAgICJsaWJ1aSIsCisgICAgXSwKK30KKworCisvLyBETyBOT1QgREVQRU5EIE9OIFRISVMgRElSRUNUTFkKKy8vIHVzZSBsaWJjb2RlYzItaGlkbC1kZWZhdWx0cyBpbnN0ZWFkCitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliY29kZWMyX2hpZGxAMS4wIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgZGVmYXVsdHM6IFsiaGlkbF9kZWZhdWx0cyJdLAorCisgICAgc3JjczogWworICAgICAgICAiQ29tcG9uZW50LmNwcCIsCisgICAgICAgICJDb21wb25lbnRJbnRlcmZhY2UuY3BwIiwKKyAgICAgICAgIkNvbXBvbmVudFN0b3JlLmNwcCIsCisgICAgICAgICJDb25maWd1cmFibGUuY3BwIiwKKyAgICAgICAgIklucHV0QnVmZmVyTWFuYWdlci5jcHAiLAorICAgICAgICAiSW5wdXRTdXJmYWNlLmNwcCIsCisgICAgICAgICJJbnB1dFN1cmZhY2VDb25uZWN0aW9uLmNwcCIsCisgICAgICAgICJ0eXBlcy5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYmluZGVyX2hlYWRlcnMiLAorICAgICAgICAibGlic3lzdGVtX2hlYWRlcnMiLAorICAgICAgICAibGliY29kZWMyX2ludGVybmFsIiwgLy8gcHJpdmF0ZQorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5jb21tb25AMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWFAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycG9vbEAyLjAuMSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9idWZmZXJxdWV1ZV9oZWxwZXIiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wLjEiLAorICAgICAgICAibGlidWkiLAorICAgIF0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBDb2RlYyAyLjAgSEFMIHNlcnZpY2UgaW1wbGVtZW50YXRpb25zCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMi1oaWRsLWRlZmF1bHRzIiwKKyAgICBkZWZhdWx0czogWyJsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyJdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMl9oaWRsQDEuMCIsCisgICAgXSwKK30KKworLy8gcHVibGljIGRlcGVuZGVuY3kgZm9yIENvZGVjIDIuMCBIQUwgY2xpZW50CitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMi1oaWRsLWNsaWVudC1kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbF9jbGllbnRAMS4wIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NsaWVudEJsb2NrSGVscGVyLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9DbGllbnRCbG9ja0hlbHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA3OTBiYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9DbGllbnRCbG9ja0hlbHBlci5jcHAKQEAgLTAsMCArMSwzNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLWJsb2NrX2hlbHBlciIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8yLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9DbGllbnRCbG9ja0hlbHBlci5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8yLjAvQjJIR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKKyNpbmNsdWRlIDxpb21hbmlwPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjoKKyAgICAgICAgVjJfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIEIySEdyYXBoaWNCdWZmZXJQcm9kdWNlciA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6CisgICAgICAgIFYyXzA6OnV0aWxzOjpCMkhHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworLy8gQ3JlYXRlIGEgR3JhcGhpY0J1ZmZlciBvYmplY3QgZnJvbSBhIGdyYXBoaWMgYmxvY2suCitzcDxHcmFwaGljQnVmZmVyPiBjcmVhdGVHcmFwaGljQnVmZmVyKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrKSB7CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworICAgIHVpbnQzMl90IGZvcm1hdDsKKyAgICB1aW50NjRfdCB1c2FnZTsKKyAgICB1aW50MzJfdCBzdHJpZGU7CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICB1aW50NjRfdCBicUlkOworICAgIGludDMyX3QgYnFTbG90OworICAgIF9VbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jTWV0YWRhdGEoCisgICAgICAgICAgICBibG9jay5oYW5kbGUoKSwgJndpZHRoLCAmaGVpZ2h0LCAmZm9ybWF0LCAmdXNhZ2UsCisgICAgICAgICAgICAmc3RyaWRlLCAmZ2VuZXJhdGlvbiwgJmJxSWQsIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDMyX3QqPigmYnFTbG90KSk7CisgICAgbmF0aXZlX2hhbmRsZV90ICpncmFsbG9jSGFuZGxlID0KKyAgICAgICAgICAgIFVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoYmxvY2suaGFuZGxlKCkpOworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdyYXBoaWNCdWZmZXIgPQorICAgICAgICAgICAgbmV3IEdyYXBoaWNCdWZmZXIoZ3JhbGxvY0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoaWNCdWZmZXI6OkNMT05FX0hBTkRMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIHVzYWdlLCBzdHJpZGUpOworICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGdyYWxsb2NIYW5kbGUpOworICAgIHJldHVybiBncmFwaGljQnVmZmVyOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmxvY2tQcm9jZXNzb3I+Cit2b2lkIGZvckVhY2hCbG9jayhDMkZyYW1lRGF0YSYgZnJhbWVEYXRhLAorICAgICAgICAgICAgICAgICAgQmxvY2tQcm9jZXNzb3IgcHJvY2VzcykgeworICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgYnVmZmVyIDogZnJhbWVEYXRhLmJ1ZmZlcnMpIHsKKyAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgZm9yIChjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jayA6CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKSkgeworICAgICAgICAgICAgICAgIHByb2Nlc3MoYmxvY2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmxvY2tQcm9jZXNzb3I+Cit2b2lkIGZvckVhY2hCbG9jayhjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrTGlzdCwKKyAgICAgICAgICAgICAgICAgIEJsb2NrUHJvY2Vzc29yIHByb2Nlc3MpIHsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0xpc3QpIHsKKyAgICAgICAgaWYgKCF3b3JrKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcmtsZXQ+JiB3b3JrbGV0IDogd29yay0+d29ya2xldHMpIHsKKyAgICAgICAgICAgIGlmICh3b3JrbGV0KSB7CisgICAgICAgICAgICAgICAgZm9yRWFjaEJsb2NrKHdvcmtsZXQtPm91dHB1dCwgcHJvY2Vzcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3NwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdldEhnYnAoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnApIHsKKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBoZ2JwID0KKyAgICAgICAgICAgIGlnYnAtPmdldEhhbEludGVyZmFjZTxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPigpOworICAgIHJldHVybiBoZ2JwID8gaGdicCA6CisgICAgICAgICAgICBuZXcgQjJIR3JhcGhpY0J1ZmZlclByb2R1Y2VyKGlnYnApOworfQorCitzdGF0dXNfdCBhdHRhY2hUb0J1ZmZlclF1ZXVlKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnFTbG90KSB7CisgICAgaWYgKCFpZ2JwKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiYXR0YWNoVG9CdWZmZXJRdWV1ZSAtLSBudWxsIHByb2R1Y2VyLiI7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIHNwPEdyYXBoaWNCdWZmZXI+IGdyYXBoaWNCdWZmZXIgPSBjcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrKTsKKyAgICBncmFwaGljQnVmZmVyLT5zZXRHZW5lcmF0aW9uTnVtYmVyKGdlbmVyYXRpb24pOworCisgICAgTE9HKFZFUkJPU0UpIDw8ICJhdHRhY2hUb0J1ZmZlclF1ZXVlIC0tIGF0dGFjaGluZyBidWZmZXI6IgorICAgICAgICAgICAgPDwgIiBibG9jayBkaW1lbnNpb24gIiA8PCBibG9jay53aWR0aCgpIDw8ICJ4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBibG9jay5oZWlnaHQoKQorICAgICAgICAgICAgPDwgIiwgZ3JhcGhpY0J1ZmZlciBkaW1lbnNpb24gIiA8PCBncmFwaGljQnVmZmVyLT5nZXRXaWR0aCgpIDw8ICJ4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGdyYXBoaWNCdWZmZXItPmdldEhlaWdodCgpCisgICAgICAgICAgICA8PCBzdGQ6OmhleCA8PCBzdGQ6OnNldGZpbGwoJzAnKQorICAgICAgICAgICAgPDwgIiwgZm9ybWF0IDB4IiA8PCBzdGQ6OnNldHcoOCkgPDwgZ3JhcGhpY0J1ZmZlci0+Z2V0UGl4ZWxGb3JtYXQoKQorICAgICAgICAgICAgPDwgIiwgdXNhZ2UgMHgiIDw8IHN0ZDo6c2V0dygxNikgPDwgZ3JhcGhpY0J1ZmZlci0+Z2V0VXNhZ2UoKQorICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgc3RkOjpzZXRmaWxsKCcgJykKKyAgICAgICAgICAgIDw8ICIsIHN0cmlkZSAiIDw8IGdyYXBoaWNCdWZmZXItPmdldFN0cmlkZSgpCisgICAgICAgICAgICA8PCAiLCBnZW5lcmF0aW9uICIgPDwgZ3JhcGhpY0J1ZmZlci0+Z2V0R2VuZXJhdGlvbk51bWJlcigpOworCisgICAgc3RhdHVzX3QgcmVzdWx0ID0gaWdicC0+YXR0YWNoQnVmZmVyKGJxU2xvdCwgZ3JhcGhpY0J1ZmZlcik7CisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBMT0coV0FSTklORykgPDwgImF0dGFjaFRvQnVmZmVyUXVldWUgLS0gYXR0YWNoQnVmZmVyIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgInN0YXR1cyA9ICIgPDwgcmVzdWx0IDw8ICIuIjsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgTE9HKFZFUkJPU0UpIDw8ICJhdHRhY2hUb0J1ZmZlclF1ZXVlIC0tIGF0dGFjaEJ1ZmZlciByZXR1cm5lZCBzbG90ICMiCisgICAgICAgICAgICAgICAgIDw8ICpicVNsb3QgPDwgIi4iOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBnZXRCdWZmZXJRdWV1ZUFzc2lnbm1lbnQoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90KiBicUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnFTbG90KSB7CisgICAgcmV0dXJuIF9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUXVldWVEYXRhKAorICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YShibG9jayksCisgICAgICAgICAgICBnZW5lcmF0aW9uLCBicUlkLCBicVNsb3QpOworfQorfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitjbGFzcyBPdXRwdXRCdWZmZXJRdWV1ZTo6SW1wbCB7CisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbUlnYnA7CisgICAgdWludDMyX3QgbUdlbmVyYXRpb247CisgICAgdWludDY0X3QgbUJxSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPGludD4gbU93bmVyOworICAgIC8vIFRvIG1pZ3JhdGUgZXhpc3RpbmcgYnVmZmVycworICAgIHNwPEdyYXBoaWNCdWZmZXI+IG1CdWZmZXJzW0J1ZmZlclF1ZXVlRGVmczo6TlVNX0JVRkZFUl9TTE9UU107IC8vIGZpbmQgYSBiZXR0ZXIgd2F5CisgICAgc3RkOjp3ZWFrX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPgorICAgICAgICAgICAgICAgICAgICBtUG9vbERhdGFzW0J1ZmZlclF1ZXVlRGVmczo6TlVNX0JVRkZFUl9TTE9UU107CisKK3B1YmxpYzoKKyAgICBJbXBsKCk6IG1HZW5lcmF0aW9uKDApLCBtQnFJZCgwKSB7fQorCisgICAgYm9vbCBjb25maWd1cmUoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBicUlkKSB7CisgICAgICAgIHNpemVfdCB0cnlOdW0gPSAwOworICAgICAgICBzaXplX3Qgc3VjY2VzcyA9IDA7CisgICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IGJ1ZmZlcnNbQnVmZmVyUXVldWVEZWZzOjpOVU1fQlVGRkVSX1NMT1RTXTsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPgorICAgICAgICAgICAgICAgIHBvb2xEYXRhc1tCdWZmZXJRdWV1ZURlZnM6Ok5VTV9CVUZGRVJfU0xPVFNdOworICAgICAgICB7CisgICAgICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGwobU11dGV4KTsKKyAgICAgICAgICAgIGlmIChnZW5lcmF0aW9uID09IG1HZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUlnYnAgPSBpZ2JwOworICAgICAgICAgICAgbUdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOworICAgICAgICAgICAgbUJxSWQgPSBicUlkOworICAgICAgICAgICAgbU93bmVyID0gc3RkOjptYWtlX3NoYXJlZDxpbnQ+KDApOworICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBCdWZmZXJRdWV1ZURlZnM6Ok5VTV9CVUZGRVJfU0xPVFM7ICsraSkgeworICAgICAgICAgICAgICAgIGlmIChtQnFJZCA9PSAwIHx8ICFtQnVmZmVyc1tpXSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IGRhdGEgPSBtUG9vbERhdGFzW2ldLmxvY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoIWRhdGEgfHwKKyAgICAgICAgICAgICAgICAgICAgIV9DMkJsb2NrRmFjdG9yeTo6QmVnaW5BdHRhY2hCbG9ja1RvQnVmZmVyUXVldWUoZGF0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICsrdHJ5TnVtOworICAgICAgICAgICAgICAgIGludCBicVNsb3Q7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0tPnNldEdlbmVyYXRpb25OdW1iZXIoZ2VuZXJhdGlvbik7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gaWdicC0+YXR0YWNoQnVmZmVyKCZicVNsb3QsIG1CdWZmZXJzW2ldKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib29sIGF0dGFjaCA9CisgICAgICAgICAgICAgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkVuZEF0dGFjaEJsb2NrVG9CdWZmZXJRdWV1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgbU93bmVyLCBnZXRIZ2JwKG1JZ2JwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbiwgYnFJZCwgYnFTbG90KTsKKyAgICAgICAgICAgICAgICBpZiAoIWF0dGFjaCkgeworICAgICAgICAgICAgICAgICAgICBpZ2JwLT5jYW5jZWxCdWZmZXIoYnFTbG90LCBGZW5jZTo6Tk9fRkVOQ0UpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnVmZmVyc1ticVNsb3RdID0gbUJ1ZmZlcnNbaV07CisgICAgICAgICAgICAgICAgcG9vbERhdGFzW2JxU2xvdF0gPSBkYXRhOworICAgICAgICAgICAgICAgICsrc3VjY2VzczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQnVmZmVyUXVldWVEZWZzOjpOVU1fQlVGRkVSX1NMT1RTOyArK2kpIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXSA9IGJ1ZmZlcnNbaV07CisgICAgICAgICAgICAgICAgbVBvb2xEYXRhc1tpXSA9IHBvb2xEYXRhc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HRCgicmVtb3RlIGdyYXBoaWMgYnVmZmVyIG1pZ3JhdGlvbiAlenUvJXp1Iiwgc3VjY2VzcywgdHJ5TnVtKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCByZWdpc3RlckJ1ZmZlcihjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gZGF0YSA9CisgICAgICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YShibG9jayk7CisgICAgICAgIGlmICghZGF0YSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbChtTXV0ZXgpOworCisgICAgICAgIGlmICghbUlnYnApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IG9sZEdlbmVyYXRpb247CisgICAgICAgIHVpbnQ2NF90IG9sZElkOworICAgICAgICBpbnQzMl90IG9sZFNsb3Q7CisgICAgICAgIC8vIElmIHRoZSBibG9jayBpcyBub3QgYnVmZmVycXVldWUtYmFzZWQsIGRvIG5vdGhpbmcuCisgICAgICAgIGlmICghX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJRdWV1ZURhdGEoCisgICAgICAgICAgICAgICAgZGF0YSwgJm9sZEdlbmVyYXRpb24sICZvbGRJZCwgJm9sZFNsb3QpIHx8IChvbGRJZCA9PSAwKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC8vIElmIHRoZSBibG9jaydzIGJxSWQgaXMgdGhlIHNhbWUgYXMgdGhlIGRlc2lyZWQgYnFJZCwganVzdCBob2xkLgorICAgICAgICBpZiAoKG9sZElkID09IG1CcUlkKSAmJiAob2xkR2VuZXJhdGlvbiA9PSBtR2VuZXJhdGlvbikpIHsKKyAgICAgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiaG9sZEJ1ZmZlclF1ZXVlQmxvY2sgLS0gaW1wb3J0IHdpdGhvdXQgYXR0YWNoaW5nOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGJxSWQgIiA8PCBvbGRJZAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGJxU2xvdCAiIDw8IG9sZFNsb3QKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBnZW5lcmF0aW9uICIgPDwgbUdlbmVyYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkhvbGRCbG9ja0Zyb21CdWZmZXJRdWV1ZShkYXRhLCBtT3duZXIsIGdldEhnYnAobUlnYnApKTsKKyAgICAgICAgICAgIG1Qb29sRGF0YXNbb2xkU2xvdF0gPSBkYXRhOworICAgICAgICAgICAgbUJ1ZmZlcnNbb2xkU2xvdF0gPSBjcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrKTsKKyAgICAgICAgICAgIG1CdWZmZXJzW29sZFNsb3RdLT5zZXRHZW5lcmF0aW9uTnVtYmVyKG1HZW5lcmF0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGludDMyX3QgZCA9IChpbnQzMl90KSBtR2VuZXJhdGlvbiAtIChpbnQzMl90KSBvbGRHZW5lcmF0aW9uOworICAgICAgICBMT0coV0FSTklORykgPDwgInJlY2VpdmluZyBzdGFsZSBidWZmZXI6IGdlbmVyYXRpb24gIgorICAgICAgICAgICAgICAgICAgICAgPDwgbUdlbmVyYXRpb24gPDwgIiAsIGRpZmYgIiA8PCBkICA8PCAiIDogc2xvdCAiCisgICAgICAgICAgICAgICAgICAgICA8PCBvbGRTbG90OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3RhdHVzX3Qgb3V0cHV0QnVmZmVyKAorICAgICAgICAgICAgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgICAgICBjb25zdCBCbkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCYgaW5wdXQsCisgICAgICAgICAgICBCbkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQqIG91dHB1dCkgeworICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICB1aW50NjRfdCBicUlkOworICAgICAgICBpbnQzMl90IGJxU2xvdDsKKyAgICAgICAgYm9vbCBkaXNwbGF5ID0gZGlzcGxheUJ1ZmZlclF1ZXVlQmxvY2soYmxvY2spOworICAgICAgICBpZiAoIWdldEJ1ZmZlclF1ZXVlQXNzaWdubWVudChibG9jaywgJmdlbmVyYXRpb24sICZicUlkLCAmYnFTbG90KSB8fAorICAgICAgICAgICAgYnFJZCA9PSAwKSB7CisgICAgICAgICAgICAvLyBCbG9jayBub3QgZnJvbSBidWZmZXJxdWV1ZSAtLSBpdCBtdXN0IGJlIGF0dGFjaGVkIGJlZm9yZSBxdWV1aW5nLgorCisgICAgICAgICAgICBtTXV0ZXgubG9jaygpOworICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gb3V0cHV0SWdicCA9IG1JZ2JwOworICAgICAgICAgICAgdWludDMyX3Qgb3V0cHV0R2VuZXJhdGlvbiA9IG1HZW5lcmF0aW9uOworICAgICAgICAgICAgbU11dGV4LnVubG9jaygpOworCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdHRhY2hUb0J1ZmZlclF1ZXVlKAorICAgICAgICAgICAgICAgICAgICBibG9jaywgb3V0cHV0SWdicCwgb3V0cHV0R2VuZXJhdGlvbiwgJmJxU2xvdCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJvdXRwdXRCdWZmZXIgLS0gYXR0YWNoaW5nIGZhaWxlZC4iOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzID0gb3V0cHV0SWdicC0+cXVldWVCdWZmZXIoc3RhdGljX2Nhc3Q8aW50PihicVNsb3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgb3V0cHV0KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJvdXRwdXRCdWZmZXIgLS0gcXVldWVCdWZmZXIoKSBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uIG5vbi1idWZmZXJxdWV1ZS1iYXNlZCBibG9jay4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVycm9yID0gIiA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKworICAgICAgICBtTXV0ZXgubG9jaygpOworICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBvdXRwdXRJZ2JwID0gbUlnYnA7CisgICAgICAgIHVpbnQzMl90IG91dHB1dEdlbmVyYXRpb24gPSBtR2VuZXJhdGlvbjsKKyAgICAgICAgdWludDY0X3Qgb3V0cHV0QnFJZCA9IG1CcUlkOworICAgICAgICBtTXV0ZXgudW5sb2NrKCk7CisKKyAgICAgICAgaWYgKCFvdXRwdXRJZ2JwKSB7CisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIm91dHB1dEJ1ZmZlciAtLSBvdXRwdXQgc3VyZmFjZSBpcyBudWxsLiI7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICghZGlzcGxheSkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJvdXRwdXRCdWZmZXIgLS0gY2Fubm90IGRpc3BsYXkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJidWZmZXJxdWV1ZS1iYXNlZCBibG9jayB0byB0aGUgYnVmZmVycXVldWUuIjsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmIChicUlkICE9IG91dHB1dEJxSWQgfHwgZ2VuZXJhdGlvbiAhPSBvdXRwdXRHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICBpbnQzMl90IGRpZmYgPSAoaW50MzJfdCkgb3V0cHV0R2VuZXJhdGlvbiAtIChpbnQzMl90KSBnZW5lcmF0aW9uOworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJvdXRwdXRCdWZmZXIgLS0gYnVmZmVycyBmcm9tIG9sZCBnZW5lcmF0aW9uIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBvdXRwdXRHZW5lcmF0aW9uIDw8ICIgLCBkaWZmOiAiIDw8IGRpZmYKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiICwgc2xvdDogIiA8PCBicVNsb3Q7CisgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvdXRwdXRJZ2JwLT5xdWV1ZUJ1ZmZlcihzdGF0aWNfY2FzdDxpbnQ+KGJxU2xvdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIG91dHB1dCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIm91dHB1dEJ1ZmZlciAtLSBxdWV1ZUJ1ZmZlcigpIGZhaWxlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICJvbiBidWZmZXJxdWV1ZS1iYXNlZCBibG9jay4gIgorICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgPSAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBJbXBsICpnZXRQdHIoKSB7CisgICAgICAgIHJldHVybiB0aGlzOworICAgIH0KKworICAgIH5JbXBsKCkge30KK307CisKK091dHB1dEJ1ZmZlclF1ZXVlOjpPdXRwdXRCdWZmZXJRdWV1ZSgpOiBtSW1wbChuZXcgSW1wbCgpKSB7fQorCitPdXRwdXRCdWZmZXJRdWV1ZTo6fk91dHB1dEJ1ZmZlclF1ZXVlKCkge30KKworYm9vbCBPdXRwdXRCdWZmZXJRdWV1ZTo6Y29uZmlndXJlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYnFJZCkgeworICAgIHJldHVybiBtSW1wbCAmJiBtSW1wbC0+Y29uZmlndXJlKGlnYnAsIGdlbmVyYXRpb24sIGJxSWQpOworfQorCitzdGF0dXNfdCBPdXRwdXRCdWZmZXJRdWV1ZTo6b3V0cHV0QnVmZmVyKAorICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgIGNvbnN0IEJuR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0JiBpbnB1dCwKKyAgICBCbkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQqIG91dHB1dCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPm91dHB1dEJ1ZmZlcihibG9jaywgaW5wdXQsIG91dHB1dCk7CisgICAgfQorICAgIHJldHVybiBERUFEX09CSkVDVDsKK30KKwordm9pZCBPdXRwdXRCdWZmZXJRdWV1ZTo6aG9sZEJ1ZmZlclF1ZXVlQmxvY2tzKAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrTGlzdCkgeworICAgIGlmICghbUltcGwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3JFYWNoQmxvY2sod29ya0xpc3QsCisgICAgICAgICAgICAgICAgIHN0ZDo6YmluZCgmT3V0cHV0QnVmZmVyUXVldWU6OkltcGw6OnJlZ2lzdGVyQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbUltcGwtPmdldFB0cigpLCBzdGQ6OnBsYWNlaG9sZGVyczo6XzEpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvQ29tcG9uZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOWYyMGE0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudC5jcHAKQEAgLTAsMCArMSw0ODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUNvbXBvbmVudCIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9JbnB1dEJ1ZmZlck1hbmFnZXIuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbEJpbmRlclN1cHBvcnQuaD4KKyNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KKworI2luY2x1ZGUgPEMyQnFCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8dGhyZWFkPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOworCisvLyBDb21wb25lbnRMaXN0ZW5lciB3cmFwcGVyCitzdHJ1Y3QgQ29tcG9uZW50OjpMaXN0ZW5lciA6IHB1YmxpYyBDMkNvbXBvbmVudDo6TGlzdGVuZXIgeworCisgICAgTGlzdGVuZXIoY29uc3Qgc3A8Q29tcG9uZW50PiYgY29tcG9uZW50KSA6CisgICAgICAgIG1Db21wb25lbnQoY29tcG9uZW50KSwKKyAgICAgICAgbUxpc3RlbmVyKGNvbXBvbmVudC0+bUxpc3RlbmVyKSB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3JfbmIoCisgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiAvKiBjMmNvbXBvbmVudCAqLywKKyAgICAgICAgICAgIHVpbnQzMl90IGVycm9yQ29kZSkgb3ZlcnJpZGUgeworICAgICAgICBzcDxJQ29tcG9uZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBsaXN0ZW5lci0+b25FcnJvcihTdGF0dXM6Ok9LLCBlcnJvckNvZGUpOworICAgICAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb21wb25lbnQ6Okxpc3RlbmVyOjpvbkVycm9yX25iIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJ0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWRfbmIoCisgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiAvKiBjMmNvbXBvbmVudCAqLywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBjMnNldHRpbmdSZXN1bHQKKyAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICBzcDxJQ29tcG9uZW50TGlzdGVuZXI+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICBoaWRsX3ZlYzxTZXR0aW5nUmVzdWx0PiBzZXR0aW5nUmVzdWx0cyhjMnNldHRpbmdSZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgICAgIHNpemVfdCBpeCA9IDA7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+ICZjMnJlc3VsdCA6CisgICAgICAgICAgICAgICAgICAgIGMyc2V0dGluZ1Jlc3VsdCkgeworICAgICAgICAgICAgICAgIGlmIChjMnJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmc2V0dGluZ1Jlc3VsdHNbaXgrK10sICpjMnJlc3VsdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgc2V0dGluZ1Jlc3VsdHMucmVzaXplKGl4KTsKKyAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGxpc3RlbmVyLT5vblRyaXBwZWQoc2V0dGluZ1Jlc3VsdHMpOworICAgICAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb21wb25lbnQ6Okxpc3RlbmVyOjpvblRyaXBwZWRfbmIgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmVfbmIoCisgICAgICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50PiAvKiBjMmNvbXBvbmVudCAqLywKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gYzJ3b3JrSXRlbXMpIG92ZXJyaWRlIHsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGMyd29ya0l0ZW1zKSB7CisgICAgICAgICAgICBpZiAod29yaykgeworICAgICAgICAgICAgICAgIGlmICh3b3JrLT53b3JrbGV0cy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAhd29yay0+d29ya2xldHMuYmFjaygpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCAod29yay0+d29ya2xldHMuYmFjaygpLT5vdXRwdXQuZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgSW5wdXRCdWZmZXJNYW5hZ2VyOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnJlZ2lzdGVyRnJhbWVEYXRhKG1MaXN0ZW5lciwgd29yay0+aW5wdXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgIFdvcmtCdW5kbGUgd29ya0J1bmRsZTsKKworICAgICAgICAgICAgc3A8Q29tcG9uZW50PiBzdHJvbmdDb21wb25lbnQgPSBtQ29tcG9uZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgIGJlZ2luVHJhbnNmZXJCdWZmZXJRdWV1ZUJsb2NrcyhjMndvcmtJdGVtcywgdHJ1ZSk7CisgICAgICAgICAgICBpZiAoIW9iamNweSgmd29ya0J1bmRsZSwgYzJ3b3JrSXRlbXMsIHN0cm9uZ0NvbXBvbmVudCA/CisgICAgICAgICAgICAgICAgICAgICZzdHJvbmdDb21wb25lbnQtPm1CdWZmZXJQb29sU2VuZGVyIDogbnVsbHB0cikpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDb21wb25lbnQ6Okxpc3RlbmVyOjpvbldvcmtEb25lX25iIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJyZWNlaXZlZCBjb3JydXB0ZWQgd29yayBpdGVtcy4iOworICAgICAgICAgICAgICAgIGVuZFRyYW5zZmVyQnVmZmVyUXVldWVCbG9ja3MoYzJ3b3JrSXRlbXMsIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBsaXN0ZW5lci0+b25Xb3JrRG9uZSh3b3JrQnVuZGxlKTsKKyAgICAgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ29tcG9uZW50OjpMaXN0ZW5lcjo6b25Xb3JrRG9uZV9uYiAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAidHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICAgICAgZW5kVHJhbnNmZXJCdWZmZXJRdWV1ZUJsb2NrcyhjMndvcmtJdGVtcywgZmFsc2UsIHRydWUpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVuZFRyYW5zZmVyQnVmZmVyUXVldWVCbG9ja3MoYzJ3b3JrSXRlbXMsIHRydWUsIHRydWUpOworICAgICAgICB9CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgd3A8Q29tcG9uZW50PiBtQ29tcG9uZW50OworICAgIHdwPElDb21wb25lbnRMaXN0ZW5lcj4gbUxpc3RlbmVyOworfTsKKworLy8gQ29tcG9uZW50OjpTaW5rCitzdHJ1Y3QgQ29tcG9uZW50OjpTaW5rIDogcHVibGljIElJbnB1dFNpbmsgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+IG1Db21wb25lbnQ7CisgICAgc3A8SUNvbmZpZ3VyYWJsZT4gbUNvbmZpZ3VyYWJsZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gcXVldWUoY29uc3QgV29ya0J1bmRsZSYgd29ya0J1bmRsZSkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUNvbXBvbmVudC0+cXVldWUod29ya0J1bmRsZSk7CisgICAgfQorCisgICAgdmlydHVhbCBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IGdldENvbmZpZ3VyYWJsZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1Db25maWd1cmFibGU7CisgICAgfQorCisgICAgU2luayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiYgY29tcG9uZW50KTsKKyAgICB2aXJ0dWFsIH5TaW5rKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBQcm9jZXNzLXdpZGUgbWFwOiBDb21wb25lbnQ6OlNpbmsgLT4gQzJDb21wb25lbnQuCisgICAgc3RhdGljIHN0ZDo6bXV0ZXggc1NpbmsyQ29tcG9uZW50TXV0ZXg7CisgICAgc3RhdGljIHN0ZDo6bWFwPElJbnB1dFNpbmsqLCBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50Pj4gc1NpbmsyQ29tcG9uZW50OworCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gZmluZExvY2FsQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3Qgc3A8SUlucHV0U2luaz4mIHNpbmspOworfTsKKworc3RkOjptdXRleAorICAgICAgICBDb21wb25lbnQ6OlNpbms6OnNTaW5rMkNvbXBvbmVudE11dGV4e307CitzdGQ6Om1hcDxJSW5wdXRTaW5rKiwgc3RkOjp3ZWFrX3B0cjxDMkNvbXBvbmVudD4+CisgICAgICAgIENvbXBvbmVudDo6U2luazo6c1NpbmsyQ29tcG9uZW50e307CisKK0NvbXBvbmVudDo6U2luazo6U2luayhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiYgY29tcG9uZW50KQorICAgICAgICA6IG1Db21wb25lbnR7Y29tcG9uZW50fSwKKyAgICAgICAgICBtQ29uZmlndXJhYmxle1smY29tcG9uZW50XSgpIC0+IHNwPElDb25maWd1cmFibGU+IHsKKyAgICAgICAgICAgICAgUmV0dXJuPHNwPElDb21wb25lbnRJbnRlcmZhY2U+PiByZXQxID0gY29tcG9uZW50LT5nZXRJbnRlcmZhY2UoKTsKKyAgICAgICAgICAgICAgaWYgKCFyZXQxLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiU2luazo6U2luayAtLSBjb21wb25lbnQncyB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gcmV0MiA9CisgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbXBvbmVudEludGVyZmFjZT4+KHJldDEpLT4KKyAgICAgICAgICAgICAgICAgICAgICBnZXRDb25maWd1cmFibGUoKTsKKyAgICAgICAgICAgICAgaWYgKCFyZXQyLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiU2luazo6U2luayAtLSBpbnRlcmZhY2UncyB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzcDxJQ29uZmlndXJhYmxlPj4ocmV0Mik7CisgICAgICAgICAgfSgpfSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc1NpbmsyQ29tcG9uZW50TXV0ZXgpOworICAgIHNTaW5rMkNvbXBvbmVudC5lbXBsYWNlKHRoaXMsIGNvbXBvbmVudC0+bUNvbXBvbmVudCk7Cit9CisKK0NvbXBvbmVudDo6U2luazo6flNpbmsoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc1NpbmsyQ29tcG9uZW50TXV0ZXgpOworICAgIHNTaW5rMkNvbXBvbmVudC5lcmFzZSh0aGlzKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBDb21wb25lbnQ6OlNpbms6OmZpbmRMb2NhbENvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3A8SUlucHV0U2luaz4mIHNpbmspIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhzU2luazJDb21wb25lbnRNdXRleCk7CisgICAgYXV0byBpID0gc1NpbmsyQ29tcG9uZW50LmZpbmQoc2luay5nZXQoKSk7CisgICAgaWYgKGkgPT0gc1NpbmsyQ29tcG9uZW50LmVuZCgpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gaS0+c2Vjb25kLmxvY2soKTsKK30KKworLy8gQ29tcG9uZW50CitDb21wb25lbnQ6OkNvbXBvbmVudCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgY29uc3Qgc3A8Q29tcG9uZW50U3RvcmU+JiBzdG9yZSwKKyAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OgorICAgICAgICBJQ2xpZW50TWFuYWdlcj4mIGNsaWVudFBvb2xNYW5hZ2VyKQorICAgICAgOiBtQ29tcG9uZW50e2NvbXBvbmVudH0sCisgICAgICAgIG1JbnRlcmZhY2V7bmV3IENvbXBvbmVudEludGVyZmFjZShjb21wb25lbnQtPmludGYoKSwgc3RvcmUuZ2V0KCkpfSwKKyAgICAgICAgbUxpc3RlbmVye2xpc3RlbmVyfSwKKyAgICAgICAgbVN0b3Jle3N0b3JlfSwKKyAgICAgICAgbUJ1ZmZlclBvb2xTZW5kZXJ7Y2xpZW50UG9vbE1hbmFnZXJ9IHsKKyAgICAvLyBSZXRyaWV2ZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBmcm9tIHN0b3JlCisgICAgLy8gVE9ETzogV2UgY291bGQgY2FjaGUgdGhpcyBwZXIgY29tcG9uZW50L2ludGVyZmFjZSB0eXBlCisgICAgbUluaXQgPSBtSW50ZXJmYWNlLT5zdGF0dXMoKTsKK30KKworYzJfc3RhdHVzX3QgQ29tcG9uZW50OjpzdGF0dXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0OworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50CitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OnF1ZXVlKGNvbnN0IFdvcmtCdW5kbGUmIHdvcmtCdW5kbGUpIHsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGMyd29ya3M7CisKKyAgICBpZiAoIW9iamNweSgmYzJ3b3Jrcywgd29ya0J1bmRsZSkpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6Q09SUlVQVEVEOworICAgIH0KKworICAgIC8vIFJlZ2lzdGVyIGlucHV0IGJ1ZmZlcnMuCisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGMyd29ya3MpIHsKKyAgICAgICAgaWYgKHdvcmspIHsKKyAgICAgICAgICAgIElucHV0QnVmZmVyTWFuYWdlcjo6CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyRnJhbWVEYXRhKG1MaXN0ZW5lciwgd29yay0+aW5wdXQpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1cz4obUNvbXBvbmVudC0+cXVldWVfbmIoJmMyd29ya3MpKTsKK30KKworUmV0dXJuPHZvaWQ+IENvbXBvbmVudDo6Zmx1c2goZmx1c2hfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGMyZmx1c2hlZFdvcmtzOworICAgIGMyX3N0YXR1c190IGMycmVzID0gbUNvbXBvbmVudC0+Zmx1c2hfc20oCisgICAgICAgICAgICBDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULAorICAgICAgICAgICAgJmMyZmx1c2hlZFdvcmtzKTsKKworICAgIC8vIFVucmVnaXN0ZXIgaW5wdXQgYnVmZmVycy4KKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogYzJmbHVzaGVkV29ya3MpIHsKKyAgICAgICAgaWYgKHdvcmspIHsKKyAgICAgICAgICAgIGlmICh3b3JrLT53b3JrbGV0cy5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgIHx8ICF3b3JrLT53b3JrbGV0cy5iYWNrKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgKHdvcmstPndvcmtsZXRzLmJhY2soKS0+b3V0cHV0LmZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpID09IDApIHsKKyAgICAgICAgICAgICAgICBJbnB1dEJ1ZmZlck1hbmFnZXI6OgorICAgICAgICAgICAgICAgICAgICAgICAgdW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIsIHdvcmstPmlucHV0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFdvcmtCdW5kbGUgZmx1c2hlZFdvcmtCdW5kbGU7CisgICAgU3RhdHVzIHJlcyA9IHN0YXRpY19jYXN0PFN0YXR1cz4oYzJyZXMpOworICAgIGJlZ2luVHJhbnNmZXJCdWZmZXJRdWV1ZUJsb2NrcyhjMmZsdXNoZWRXb3JrcywgdHJ1ZSk7CisgICAgaWYgKGMycmVzID09IEMyX09LKSB7CisgICAgICAgIGlmICghb2JqY3B5KCZmbHVzaGVkV29ya0J1bmRsZSwgYzJmbHVzaGVkV29ya3MsICZtQnVmZmVyUG9vbFNlbmRlcikpIHsKKyAgICAgICAgICAgIHJlcyA9IFN0YXR1czo6Q09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorICAgIF9oaWRsX2NiKHJlcywgZmx1c2hlZFdvcmtCdW5kbGUpOworICAgIGVuZFRyYW5zZmVyQnVmZmVyUXVldWVCbG9ja3MoYzJmbHVzaGVkV29ya3MsIHRydWUsIHRydWUpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6ZHJhaW4oYm9vbCB3aXRoRW9zKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1cz4obUNvbXBvbmVudC0+ZHJhaW5fbmIod2l0aEVvcyA/CisgICAgICAgICAgICBDMkNvbXBvbmVudDo6RFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TIDoKKyAgICAgICAgICAgIEMyQ29tcG9uZW50OjpEUkFJTl9DT01QT05FTlRfTk9fRU9TKSk7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6c2V0T3V0cHV0U3VyZmFjZSgKKyAgICAgICAgdWludDY0X3QgYmxvY2tQb29sSWQsCisgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXIyPiYgc3VyZmFjZSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcG9vbDsKKyAgICBHZXRDb2RlYzJCbG9ja1Bvb2woYmxvY2tQb29sSWQsIG1Db21wb25lbnQsICZwb29sKTsKKyAgICBpZiAocG9vbCAmJiBwb29sLT5nZXRBbGxvY2F0b3JJZCgpID09IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w+IGJxUG9vbCA9CisgICAgICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w+KHBvb2wpOworICAgICAgICBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpPblJlbmRlckNhbGxiYWNrIGNiID0KKyAgICAgICAgICAgIFt0aGlzXSh1aW50NjRfdCBwcm9kdWNlciwgaW50MzJfdCBzbG90LCBpbnQ2NF90IG5zZWNzKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogYmF0Y2ggdGhpcworICAgICAgICAgICAgICAgIGhpZGxfdmVjPElDb21wb25lbnRMaXN0ZW5lcjo6UmVuZGVyZWRGcmFtZT4gcmVuZGVyZWQ7CisgICAgICAgICAgICAgICAgcmVuZGVyZWQucmVzaXplKDEpOworICAgICAgICAgICAgICAgIHJlbmRlcmVkWzBdID0geyBwcm9kdWNlciwgc2xvdCwgbnNlY3MgfTsKKyAgICAgICAgICAgICAgICAodm9pZCltTGlzdGVuZXItPm9uRnJhbWVzUmVuZGVyZWQocmVuZGVyZWQpLmlzT2soKTsKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKGJxUG9vbCkgeworICAgICAgICAgICAgYnFQb29sLT5zZXRSZW5kZXJDYWxsYmFjayhjYik7CisgICAgICAgICAgICBicVBvb2wtPmNvbmZpZ3VyZVByb2R1Y2VyKHN1cmZhY2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50Ojpjb25uZWN0VG9JbnB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IHNwPElJbnB1dFN1cmZhY2U+JiBpbnB1dFN1cmZhY2UsCisgICAgICAgIGNvbm5lY3RUb0lucHV0U3VyZmFjZV9jYiBfaGlkbF9jYikgeworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgc3A8SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24+IGNvbm5lY3Rpb247CisgICAgYXV0byB0cmFuc1N0YXR1cyA9IGlucHV0U3VyZmFjZS0+Y29ubmVjdCgKKyAgICAgICAgICAgIGFzSW5wdXRTaW5rKCksCisgICAgICAgICAgICBbJnN0YXR1cywgJmNvbm5lY3Rpb25dKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywgY29uc3Qgc3A8SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24+JiBjKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICBjb25uZWN0aW9uID0gYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgKTsKKyAgICBfaGlkbF9jYihzdGF0dXMsIGNvbm5lY3Rpb24pOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnQ6OmNvbm5lY3RUb09teElucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcjE+JiBwcm9kdWNlciwKKyAgICAgICAgY29uc3Qgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6CisgICAgICAgIElHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICBjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIHsKKyAgICAodm9pZClwcm9kdWNlcjsKKyAgICAodm9pZClzb3VyY2U7CisgICAgKHZvaWQpX2hpZGxfY2I7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPFN0YXR1cz4gQ29tcG9uZW50OjpkaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSgpIHsKKyAgICAvLyBUT0RPIGltcGxlbWVudAorICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK3N0cnVjdCBCbG9ja1Bvb2xJbnRmIDogcHVibGljIENvbmZpZ3VyYWJsZUMySW50ZiB7CisgICAgQmxvY2tQb29sSW50Zihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+JiBwb29sKQorICAgICAgICAgIDogQ29uZmlndXJhYmxlQzJJbnRmeworICAgICAgICAgICAgICAgICJDMkJsb2NrUG9vbDoiICsKKyAgICAgICAgICAgICAgICAgICAgKHBvb2wgPyBzdGQ6OnRvX3N0cmluZyhwb29sLT5nZXRMb2NhbElkKCkpIDogIm51bGwiKSwKKyAgICAgICAgICAgICAgICAwfSwKKyAgICAgICAgICAgIG1Qb29se3Bvb2x9IHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMKKyAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICAodm9pZClwYXJhbXM7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAodm9pZClmYWlsdXJlczsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4mIGluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpaW5kaWNlczsKKyAgICAgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgICAgICh2b2lkKXBhcmFtczsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiogY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpcGFyYW1zOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGZpZWxkcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpZmllbGRzOworICAgICAgICAodm9pZCltYXlCbG9jazsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbVBvb2w7Cit9OworCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKK1JldHVybjx2b2lkPiBDb21wb25lbnQ6OmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgdWludDMyX3QgYWxsb2NhdG9ySWQsCisgICAgICAgIGNyZWF0ZUJsb2NrUG9vbF9jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gYmxvY2tQb29sOworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IENyZWF0ZUNvZGVjMkJsb2NrUG9vbCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6aWRfdD4oYWxsb2NhdG9ySWQpLAorICAgICAgICAgICAgbUNvbXBvbmVudCwKKyAgICAgICAgICAgICZibG9ja1Bvb2wpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgYmxvY2tQb29sID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKGJsb2NrUG9vbCkgeworICAgICAgICBtQmxvY2tQb29sc011dGV4LmxvY2soKTsKKyAgICAgICAgbUJsb2NrUG9vbHMuZW1wbGFjZShibG9ja1Bvb2wtPmdldExvY2FsSWQoKSwgYmxvY2tQb29sKTsKKyAgICAgICAgbUJsb2NrUG9vbHNNdXRleC51bmxvY2soKTsKKyAgICB9IGVsc2UgaWYgKHN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICBzdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgfQorCisgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8U3RhdHVzPihzdGF0dXMpLAorICAgICAgICAgICAgYmxvY2tQb29sID8gYmxvY2tQb29sLT5nZXRMb2NhbElkKCkgOiAwLAorICAgICAgICAgICAgbmV3IENhY2hlZENvbmZpZ3VyYWJsZSgKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QmxvY2tQb29sSW50Zj4oYmxvY2tQb29sKSkpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6ZGVzdHJveUJsb2NrUG9vbCh1aW50NjRfdCBibG9ja1Bvb2xJZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1CbG9ja1Bvb2xzTXV0ZXgpOworICAgIHJldHVybiBtQmxvY2tQb29scy5lcmFzZShibG9ja1Bvb2xJZCkgPT0gMSA/CisgICAgICAgICAgICBTdGF0dXM6Ok9LIDogU3RhdHVzOjpDT1JSVVBURUQ7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6c3RhcnQoKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN0YXR1cz4obUNvbXBvbmVudC0+c3RhcnQoKSk7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6c3RvcCgpIHsKKyAgICBJbnB1dEJ1ZmZlck1hbmFnZXI6OnVucmVnaXN0ZXJGcmFtZURhdGEobUxpc3RlbmVyKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5zdG9wKCkpOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnQ6OnJlc2V0KCkgeworICAgIFN0YXR1cyBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KG1Db21wb25lbnQtPnJlc2V0KCkpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJsb2NrUG9vbHNNdXRleCk7CisgICAgICAgIG1CbG9ja1Bvb2xzLmNsZWFyKCk7CisgICAgfQorICAgIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1JldHVybjxTdGF0dXM+IENvbXBvbmVudDo6cmVsZWFzZSgpIHsKKyAgICBTdGF0dXMgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihtQ29tcG9uZW50LT5yZWxlYXNlKCkpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJsb2NrUG9vbHNNdXRleCk7CisgICAgICAgIG1CbG9ja1Bvb2xzLmNsZWFyKCk7CisgICAgfQorICAgIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK1JldHVybjxzcDxJQ29tcG9uZW50SW50ZXJmYWNlPj4gQ29tcG9uZW50OjpnZXRJbnRlcmZhY2UoKSB7CisgICAgcmV0dXJuIHNwPElDb21wb25lbnRJbnRlcmZhY2U+KG1JbnRlcmZhY2UpOworfQorCitSZXR1cm48c3A8SUlucHV0U2luaz4+IENvbXBvbmVudDo6YXNJbnB1dFNpbmsoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVNpbmtNdXRleCk7CisgICAgaWYgKCFtU2luaykgeworICAgICAgICBtU2luayA9IG5ldyBTaW5rKHNoYXJlZF9mcm9tX3RoaXMoKSk7CisgICAgfQorICAgIHJldHVybiB7bVNpbmt9OworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IENvbXBvbmVudDo6ZmluZExvY2FsQ29tcG9uZW50KAorICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luaykgeworICAgIHJldHVybiBDb21wb25lbnQ6OlNpbms6OmZpbmRMb2NhbENvbXBvbmVudChzaW5rKTsKK30KKwordm9pZCBDb21wb25lbnQ6OmluaXRMaXN0ZW5lcihjb25zdCBzcDxDb21wb25lbnQ+JiBzZWxmKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50OjpMaXN0ZW5lcj4gYzJsaXN0ZW5lciA9CisgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPExpc3RlbmVyPihzZWxmKTsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBtQ29tcG9uZW50LT5zZXRMaXN0ZW5lcl92YihjMmxpc3RlbmVyLCBDMl9ET05UX0JMT0NLKTsKKyAgICBpZiAocmVzICE9IEMyX09LKSB7CisgICAgICAgIG1Jbml0ID0gcmVzOworICAgIH0KK30KKworQ29tcG9uZW50Ojp+Q29tcG9uZW50KCkgeworICAgIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YShtTGlzdGVuZXIpOworICAgIG1TdG9yZS0+cmVwb3J0Q29tcG9uZW50RGVhdGgodGhpcyk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRJbnRlcmZhY2UuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudEludGVyZmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzllNTM1NwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRJbnRlcmZhY2UuY3BwCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1Db21wb25lbnRJbnRlcmZhY2UiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmg+CisKKyNpbmNsdWRlIDxoaWRsL0hpZGxCaW5kZXJTdXBwb3J0Lmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDxDMkJxQnVmZmVyUHJpdi5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPHRocmVhZD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvLyBJbXBsZW1lbnRhdGlvbiBvZiBDb25maWd1cmFibGVDMkludGYgYmFzZWQgb24gQzJDb21wb25lbnRJbnRlcmZhY2UKK3N0cnVjdCBDb21wSW50ZiA6IHB1YmxpYyBDb25maWd1cmFibGVDMkludGYgeworICAgIENvbXBJbnRmKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4mIGludGYpIDoKKyAgICAgICAgQ29uZmlndXJhYmxlQzJJbnRme2ludGYtPmdldE5hbWUoKSwgaW50Zi0+Z2V0SWQoKX0sCisgICAgICAgIG1JbnRme2ludGZ9IHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMKKyAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUludGYtPmNvbmZpZ192YihwYXJhbXMsIG1heUJsb2NrLCBmYWlsdXJlcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiYgaW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUludGYtPnF1ZXJ5X3ZiKHt9LCBpbmRpY2VzLCBtYXlCbG9jaywgcGFyYW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcworICAgICAgICAgICAgKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIocGFyYW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgZmllbGRzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUludGYtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKGZpZWxkcywgbWF5QmxvY2spOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gbUludGY7Cit9OworCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKKy8vIENvbXBvbmVudEludGVyZmFjZQorQ29tcG9uZW50SW50ZXJmYWNlOjpDb21wb25lbnRJbnRlcmZhY2UoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4mIGludGYsCisgICAgICAgIENvbXBvbmVudFN0b3JlKiBzdG9yZSkKKyAgICAgIDogbUludGVyZmFjZXtpbnRmfSwKKyAgICAgICAgbUNvbmZpZ3VyYWJsZXtuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKHN0ZDo6bWFrZV91bmlxdWU8Q29tcEludGY+KGludGYpKX0geworICAgIG1Jbml0ID0gbUNvbmZpZ3VyYWJsZS0+aW5pdChzdG9yZSk7Cit9CisKK2MyX3N0YXR1c190IENvbXBvbmVudEludGVyZmFjZTo6c3RhdHVzKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdDsKK30KKworUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBDb21wb25lbnRJbnRlcmZhY2U6OmdldENvbmZpZ3VyYWJsZSgpIHsKKyAgICByZXR1cm4gbUNvbmZpZ3VyYWJsZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbXBvbmVudFN0b3JlLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUwYTE5MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db21wb25lbnRTdG9yZS5jcHAKQEAgLTAsMCArMSw0MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUNvbXBvbmVudFN0b3JlIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvZmlsZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGN0aW1lPgorI2luY2x1ZGUgPGlvbWFuaXA+CisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOwordXNpbmcgOjphbmRyb2lkOjpHcmFwaGljQnVmZmVyU291cmNlOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitzdHJ1Y3QgU3RvcmVJbnRmIDogcHVibGljIENvbmZpZ3VyYWJsZUMySW50ZiB7CisgICAgU3RvcmVJbnRmKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiYgc3RvcmUpCisgICAgICAgICAgOiBDb25maWd1cmFibGVDMkludGZ7c3RvcmUgPyBzdG9yZS0+Z2V0TmFtZSgpIDogIiIsIDB9LAorICAgICAgICAgICAgbVN0b3Jle3N0b3JlfSB7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzCisgICAgICAgICAgICApIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gQXNzdW1lIGFsbCBwYXJhbXMgYXJlIGJsb2NraW5nCisgICAgICAgIC8vIFRPRE86IEZpbHRlciBmb3Igc3VwcG9ydGVkIHBhcmFtcworICAgICAgICBpZiAobWF5QmxvY2sgPT0gQzJfRE9OVF9CTE9DSyAmJiBwYXJhbXMuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbVN0b3JlLT5jb25maWdfc20ocGFyYW1zLCBmYWlsdXJlcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgLy8gQXNzdW1lIGFsbCBwYXJhbXMgYXJlIGJsb2NraW5nCisgICAgICAgIC8vIFRPRE86IEZpbHRlciBmb3Igc3VwcG9ydGVkIHBhcmFtcworICAgICAgICBpZiAobWF5QmxvY2sgPT0gQzJfRE9OVF9CTE9DSyAmJiBpbmRpY2VzLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1TdG9yZS0+cXVlcnlfc20oe30sIGluZGljZXMsIHBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbVN0b3JlLT5xdWVyeVN1cHBvcnRlZFBhcmFtc19uYihwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIC8vIEFzc3VtZSBhbGwgcGFyYW1zIGFyZSBibG9ja2luZworICAgICAgICAvLyBUT0RPOiBGaWx0ZXIgZm9yIHN1cHBvcnRlZCBwYXJhbXMKKyAgICAgICAgaWYgKG1heUJsb2NrID09IEMyX0RPTlRfQkxPQ0sgJiYgZmllbGRzLnNpemUoKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkxPQ0tJTkc7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1TdG9yZS0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20oZmllbGRzKTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gbVN0b3JlOworfTsKKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50U3RvcmUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+JiBzdG9yZSkKKyAgICAgIDogbUNvbmZpZ3VyYWJsZXtuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKHN0ZDo6bWFrZV91bmlxdWU8U3RvcmVJbnRmPihzdG9yZSkpfSwKKyAgICAgICAgbVN0b3Jle3N0b3JlfSB7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gcGxhdGZvcm1TdG9yZSA9IGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKTsKKyAgICBTZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZShzdG9yZSk7CisKKyAgICAvLyBSZXRyaWV2ZSBzdHJ1Y3QgZGVzY3JpcHRvcnMKKyAgICBtUGFyYW1SZWZsZWN0b3IgPSBtU3RvcmUtPmdldFBhcmFtUmVmbGVjdG9yKCk7CisKKyAgICAvLyBSZXRyaWV2ZSBzdXBwb3J0ZWQgcGFyYW1ldGVycyBmcm9tIHN0b3JlCisgICAgbUluaXQgPSBtQ29uZmlndXJhYmxlLT5pbml0KHRoaXMpOworfQorCitjMl9zdGF0dXNfdCBDb21wb25lbnRTdG9yZTo6c3RhdHVzKCkgY29uc3QgeworICAgIHJldHVybiBtSW5pdDsKK30KKworYzJfc3RhdHVzX3QgQ29tcG9uZW50U3RvcmU6OnZhbGlkYXRlU3VwcG9ydGVkUGFyYW1zKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiYgcGFyYW1zKSB7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfT0s7CisKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gJmRlc2MgOiBwYXJhbXMpIHsKKyAgICAgICAgaWYgKCFkZXNjKSB7CisgICAgICAgICAgICAvLyBBbGwgZGVzY3JpcHRvcnMgc2hvdWxkIGJlIHZhbGlkCisgICAgICAgICAgICByZXMgPSByZXMgPyByZXMgOiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggY29yZUluZGV4ID0gZGVzYy0+aW5kZXgoKS5jb3JlSW5kZXgoKTsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cnVjdERlc2NyaXB0b3JzTXV0ZXgpOworICAgICAgICBhdXRvIGl0ID0gbVN0cnVjdERlc2NyaXB0b3JzLmZpbmQoY29yZUluZGV4KTsKKyAgICAgICAgaWYgKGl0ID09IG1TdHJ1Y3REZXNjcmlwdG9ycy5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gc3RydWN0RGVzYyA9CisgICAgICAgICAgICAgICAgICAgIG1QYXJhbVJlZmxlY3Rvci0+ZGVzY3JpYmUoY29yZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghc3RydWN0RGVzYykgeworICAgICAgICAgICAgICAgIC8vIEFsbCBzdXBwb3J0ZWQgcGFyYW1zIG11c3QgYmUgZGVzY3JpYmVkCisgICAgICAgICAgICAgICAgcmVzID0gQzJfQkFEX0lOREVYOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN0cnVjdERlc2NyaXB0b3JzLmluc2VydCh7IGNvcmVJbmRleCwgc3RydWN0RGVzYyB9KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50U3RvcmUKK1JldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6Y3JlYXRlQ29tcG9uZW50KAorICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgbmFtZSwKKyAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcG9vbCwKKyAgICAgICAgY3JlYXRlQ29tcG9uZW50X2NiIF9oaWRsX2NiKSB7CisKKyAgICBzcDxDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IGMyY29tcG9uZW50OworICAgIFN0YXR1cyBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KAorICAgICAgICAgICAgbVN0b3JlLT5jcmVhdGVDb21wb25lbnQobmFtZSwgJmMyY29tcG9uZW50KSk7CisKKyAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgb25JbnRlcmZhY2VMb2FkZWQoYzJjb21wb25lbnQtPmludGYoKSk7CisgICAgICAgIGNvbXBvbmVudCA9IG5ldyBDb21wb25lbnQoYzJjb21wb25lbnQsIGxpc3RlbmVyLCB0aGlzLCBwb29sKTsKKyAgICAgICAgaWYgKCFjb21wb25lbnQpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IFN0YXR1czo6Q09SUlVQVEVEOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVwb3J0Q29tcG9uZW50QmlydGgoY29tcG9uZW50LmdldCgpKTsKKyAgICAgICAgICAgIGlmIChjb21wb25lbnQtPnN0YXR1cygpICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8U3RhdHVzPihjb21wb25lbnQtPnN0YXR1cygpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29tcG9uZW50LT5pbml0TGlzdGVuZXIoY29tcG9uZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoY29tcG9uZW50LT5zdGF0dXMoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxTdGF0dXM+KGNvbXBvbmVudC0+c3RhdHVzKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBfaGlkbF9jYihzdGF0dXMsIGNvbXBvbmVudCk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IENvbXBvbmVudFN0b3JlOjpjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lLAorICAgICAgICBjcmVhdGVJbnRlcmZhY2VfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGMyaW50ZXJmYWNlOworICAgIGMyX3N0YXR1c190IHJlcyA9IG1TdG9yZS0+Y3JlYXRlSW50ZXJmYWNlKG5hbWUsICZjMmludGVyZmFjZSk7CisgICAgc3A8SUNvbXBvbmVudEludGVyZmFjZT4gaW50ZXJmYWNlOworICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgb25JbnRlcmZhY2VMb2FkZWQoYzJpbnRlcmZhY2UpOworICAgICAgICBpbnRlcmZhY2UgPSBuZXcgQ29tcG9uZW50SW50ZXJmYWNlKGMyaW50ZXJmYWNlLCB0aGlzKTsKKyAgICB9CisgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8U3RhdHVzPihyZXMpLCBpbnRlcmZhY2UpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6bGlzdENvbXBvbmVudHMobGlzdENvbXBvbmVudHNfY2IgX2hpZGxfY2IpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IGMydHJhaXRzID0KKyAgICAgICAgICAgIG1TdG9yZS0+bGlzdENvbXBvbmVudHMoKTsKKyAgICBoaWRsX3ZlYzxJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0cz4gdHJhaXRzKGMydHJhaXRzLnNpemUoKSk7CisgICAgc2l6ZV90IGl4ID0gMDsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiAmYzJ0cmFpdCA6IGMydHJhaXRzKSB7CisgICAgICAgIGlmIChjMnRyYWl0KSB7CisgICAgICAgICAgICBpZiAob2JqY3B5KCZ0cmFpdHNbaXhdLCAqYzJ0cmFpdCkpIHsKKyAgICAgICAgICAgICAgICArK2l4OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICB0cmFpdHMucmVzaXplKGl4KTsKKyAgICBfaGlkbF9jYihTdGF0dXM6Ok9LLCB0cmFpdHMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDb21wb25lbnRTdG9yZTo6Y3JlYXRlSW5wdXRTdXJmYWNlKGNyZWF0ZUlucHV0U3VyZmFjZV9jYiBfaGlkbF9jYikgeworICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IHNvdXJjZSA9IG5ldyBHcmFwaGljQnVmZmVyU291cmNlKCk7CisgICAgaWYgKHNvdXJjZS0+aW5pdENoZWNrKCkgIT0gT0spIHsKKyAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpDT1JSVVBURUQsIG51bGxwdHIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBzcDxJbnB1dFN1cmZhY2U+IGlucHV0U3VyZmFjZSA9IG5ldyBJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICB0aGlzLAorICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlJlZmxlY3RvckhlbHBlcj4oKSwKKyAgICAgICAgICAgIHNvdXJjZS0+Z2V0SEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpLAorICAgICAgICAgICAgc291cmNlKTsKKyAgICBfaGlkbF9jYihpbnB1dFN1cmZhY2UgPyBTdGF0dXM6Ok9LIDogU3RhdHVzOjpOT19NRU1PUlksCisgICAgICAgICAgICAgaW5wdXRTdXJmYWNlKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCit2b2lkIENvbXBvbmVudFN0b3JlOjpvbkludGVyZmFjZUxvYWRlZChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+ICZpbnRmKSB7CisgICAgLy8gaW52YWxpZGF0ZSB1bnN1cHBvcnRlZCBzdHJ1Y3QgZGVzY3JpcHRvcnMgaWYgYSBuZXcgaW50ZXJmYWNlIGlzIGxvYWRlZCBhcyBpdCBtYXkgaGF2ZQorICAgIC8vIGV4cG9zZWQgbmV3IGRlc2NyaXB0b3JzCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cnVjdERlc2NyaXB0b3JzTXV0ZXgpOworICAgIGlmICghbUxvYWRlZEludGVyZmFjZXMuY291bnQoaW50Zi0+Z2V0TmFtZSgpKSkgeworICAgICAgICBtVW5zdXBwb3J0ZWRTdHJ1Y3REZXNjcmlwdG9ycy5jbGVhcigpOworICAgICAgICBtTG9hZGVkSW50ZXJmYWNlcy5lbXBsYWNlKGludGYtPmdldE5hbWUoKSk7CisgICAgfQorfQorCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6OmdldFN0cnVjdERlc2NyaXB0b3JzKAorICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50MzJfdD4mIGluZGljZXMsCisgICAgICAgIGdldFN0cnVjdERlc2NyaXB0b3JzX2NiIF9oaWRsX2NiKSB7CisgICAgaGlkbF92ZWM8U3RydWN0RGVzY3JpcHRvcj4gZGVzY3JpcHRvcnMoaW5kaWNlcy5zaXplKCkpOworICAgIHNpemVfdCBkc3RJeCA9IDA7CisgICAgU3RhdHVzIHJlcyA9IFN0YXR1czo6T0s7CisgICAgZm9yIChzaXplX3Qgc3JjSXggPSAwOyBzcmNJeCA8IGluZGljZXMuc2l6ZSgpOyArK3NyY0l4KSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJ1Y3REZXNjcmlwdG9yc011dGV4KTsKKyAgICAgICAgY29uc3QgQzJQYXJhbTo6Q29yZUluZGV4IGNvcmVJbmRleCA9IEMyUGFyYW06OkNvcmVJbmRleChpbmRpY2VzW3NyY0l4XSkuY29yZUluZGV4KCk7CisgICAgICAgIGNvbnN0IGF1dG8gaXRlbSA9IG1TdHJ1Y3REZXNjcmlwdG9ycy5maW5kKGNvcmVJbmRleCk7CisgICAgICAgIGlmIChpdGVtID09IG1TdHJ1Y3REZXNjcmlwdG9ycy5lbmQoKSkgeworICAgICAgICAgICAgLy8gbm90IGluIHRoZSBjYWNoZSwgYW5kIG5vdCBrbm93biB0byBiZSB1bnN1cHBvcnRlZCwgcXVlcnkgbG9jYWwgcmVmbGVjdG9yCisgICAgICAgICAgICBpZiAoIW1VbnN1cHBvcnRlZFN0cnVjdERlc2NyaXB0b3JzLmNvdW50KGNvcmVJbmRleCkpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBzdHJ1Y3REZXNjID0KKyAgICAgICAgICAgICAgICAgICAgbVBhcmFtUmVmbGVjdG9yLT5kZXNjcmliZShjb3JlSW5kZXgpOworICAgICAgICAgICAgICAgIGlmICghc3RydWN0RGVzYykgeworICAgICAgICAgICAgICAgICAgICBtVW5zdXBwb3J0ZWRTdHJ1Y3REZXNjcmlwdG9ycy5lbXBsYWNlKGNvcmVJbmRleCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0cnVjdERlc2NyaXB0b3JzLmluc2VydCh7IGNvcmVJbmRleCwgc3RydWN0RGVzYyB9KTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9iamNweSgmZGVzY3JpcHRvcnNbZHN0SXhdLCAqc3RydWN0RGVzYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrZHN0SXg7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXMgPSBTdGF0dXM6OkNPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzID0gU3RhdHVzOjpOT1RfRk9VTkQ7CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbS0+c2Vjb25kKSB7CisgICAgICAgICAgICBpZiAob2JqY3B5KCZkZXNjcmlwdG9yc1tkc3RJeF0sICppdGVtLT5zZWNvbmQpKSB7CisgICAgICAgICAgICAgICAgKytkc3RJeDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcyA9IFN0YXR1czo6Q09SUlVQVEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXMgPSBTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGRlc2NyaXB0b3JzLnJlc2l6ZShkc3RJeCk7CisgICAgX2hpZGxfY2IocmVzLCBkZXNjcmlwdG9ycyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHNwPElDbGllbnRNYW5hZ2VyPj4gQ29tcG9uZW50U3RvcmU6OmdldFBvb2xDbGllbnRNYW5hZ2VyKCkgeworICAgIHJldHVybiBDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpOworfQorCitSZXR1cm48U3RhdHVzPiBDb21wb25lbnRTdG9yZTo6Y29weUJ1ZmZlcihjb25zdCBCdWZmZXImIHNyYywgY29uc3QgQnVmZmVyJiBkc3QpIHsKKyAgICAvLyBUT0RPIGltcGxlbWVudAorICAgICh2b2lkKXNyYzsKKyAgICAodm9pZClkc3Q7CisgICAgcmV0dXJuIFN0YXR1czo6T01JVFRFRDsKK30KKworUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBDb21wb25lbnRTdG9yZTo6Z2V0Q29uZmlndXJhYmxlKCkgeworICAgIHJldHVybiBtQ29uZmlndXJhYmxlOworfQorCisvLyBDYWxsZWQgZnJvbSBjcmVhdGVDb21wb25lbnQoKSBhZnRlciBhIHN1Y2Nlc3NmdWwgY3JlYXRpb24gb2YgYGNvbXBvbmVudGAuCit2b2lkIENvbXBvbmVudFN0b3JlOjpyZXBvcnRDb21wb25lbnRCaXJ0aChDb21wb25lbnQqIGNvbXBvbmVudCkgeworICAgIENvbXBvbmVudFN0YXR1cyBjb21wb25lbnRTdGF0dXM7CisgICAgY29tcG9uZW50U3RhdHVzLmMyQ29tcG9uZW50ID0gY29tcG9uZW50LT5tQ29tcG9uZW50OworICAgIGNvbXBvbmVudFN0YXR1cy5iaXJ0aFRpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjpub3coKTsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Db21wb25lbnRSb3N0ZXJNdXRleCk7CisgICAgbUNvbXBvbmVudFJvc3Rlci5lbXBsYWNlKGNvbXBvbmVudCwgY29tcG9uZW50U3RhdHVzKTsKK30KKworLy8gQ2FsbGVkIGZyb20gd2l0aGluIHRoZSBkZXN0cnVjdG9yIG9mIGBjb21wb25lbnRgLiBObyB2aXJ0dWFsIGZ1bmN0aW9uIGNhbGxzCisvLyBhcmUgbWFkZSBvbiBgY29tcG9uZW50YCBoZXJlLgordm9pZCBDb21wb25lbnRTdG9yZTo6cmVwb3J0Q29tcG9uZW50RGVhdGgoQ29tcG9uZW50KiBjb21wb25lbnQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtQ29tcG9uZW50Um9zdGVyTXV0ZXgpOworICAgIG1Db21wb25lbnRSb3N0ZXIuZXJhc2UoY29tcG9uZW50KTsKK30KKworLy8gRHVtcHMgY29tcG9uZW50IHRyYWl0cy4KK3N0ZDo6b3N0cmVhbSYgQ29tcG9uZW50U3RvcmU6OmR1bXAoCisgICAgICAgIHN0ZDo6b3N0cmVhbSYgb3V0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4mIGNvbXApIHsKKworICAgIGNvbnN0ZXhwciBjb25zdCBjaGFyIGluZGVudFtdID0gIiAgICAiOworCisgICAgb3V0IDw8IGluZGVudCA8PCAibmFtZTogIiA8PCBjb21wLT5uYW1lIDw8IHN0ZDo6ZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJkb21haW46ICIgPDwgY29tcC0+ZG9tYWluIDw8IHN0ZDo6ZW5kbDsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJraW5kOiAiIDw8IGNvbXAtPmtpbmQgPDwgc3RkOjplbmRsOworICAgIG91dCA8PCBpbmRlbnQgPDwgInJhbms6ICIgPDwgY29tcC0+cmFuayA8PCBzdGQ6OmVuZGw7CisgICAgb3V0IDw8IGluZGVudCA8PCAibWVkaWFUeXBlOiAiIDw8IGNvbXAtPm1lZGlhVHlwZSA8PCBzdGQ6OmVuZGw7CisgICAgb3V0IDw8IGluZGVudCA8PCAiYWxpYXNlczoiOworICAgIGZvciAoY29uc3QgYXV0byYgYWxpYXMgOiBjb21wLT5hbGlhc2VzKSB7CisgICAgICAgIG91dCA8PCAnICcgPDwgYWxpYXM7CisgICAgfQorICAgIG91dCA8PCBzdGQ6OmVuZGw7CisKKyAgICByZXR1cm4gb3V0OworfQorCisvLyBEdW1wcyBjb21wb25lbnQgc3RhdHVzLgorc3RkOjpvc3RyZWFtJiBDb21wb25lbnRTdG9yZTo6ZHVtcCgKKyAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgIENvbXBvbmVudFN0YXR1cyYgY29tcFN0YXR1cykgeworCisgICAgY29uc3RleHByIGNvbnN0IGNoYXIgaW5kZW50W10gPSAiICAgICI7CisKKyAgICAvLyBQcmludCBiaXJ0aCB0aW1lLgorICAgIHN0ZDo6Y2hyb25vOjptaWxsaXNlY29uZHMgbXMgPQorICAgICAgICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oCisgICAgICAgICAgICAgICAgY29tcFN0YXR1cy5iaXJ0aFRpbWUudGltZV9zaW5jZV9lcG9jaCgpKTsKKyAgICBzdGQ6OnRpbWVfdCBiaXJ0aFRpbWUgPSBzdGQ6OmNocm9ubzo6c3lzdGVtX2Nsb2NrOjp0b190aW1lX3QoCisgICAgICAgICAgICBjb21wU3RhdHVzLmJpcnRoVGltZSk7CisgICAgc3RkOjp0bSB0bSA9ICpzdGQ6OmxvY2FsdGltZSgmYmlydGhUaW1lKTsKKyAgICBvdXQgPDwgaW5kZW50IDw8ICJDcmVhdGlvbiB0aW1lOiAiCisgICAgICAgIDw8IHN0ZDo6cHV0X3RpbWUoJnRtLCAiJVktJW0tJWQgJUg6JU06JVMiKQorICAgICAgICA8PCAnLicgPDwgc3RkOjpzZXRmaWxsKCcwJykgPDwgc3RkOjpzZXR3KDMpIDw8IG1zLmNvdW50KCkgJSAxMDAwCisgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKworICAgIC8vIFByaW50IG5hbWUgYW5kIGlkLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZiA9IGNvbXBTdGF0dXMuYzJDb21wb25lbnQtPmludGYoKTsKKyAgICBpZiAoIWludGYpIHsKKyAgICAgICAgb3V0IDw8IGluZGVudCA8PCAiVW5rbm93biBjb21wb25lbnQgLS0gbnVsbCBpbnRlcmZhY2UiIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgcmV0dXJuIG91dDsKKyAgICB9CisgICAgb3V0IDw8IGluZGVudCA8PCAiTmFtZTogIiA8PCBpbnRmLT5nZXROYW1lKCkgPDwgc3RkOjplbmRsOworICAgIG91dCA8PCBpbmRlbnQgPDwgIklkOiAiIDw8IGludGYtPmdldElkKCkgPDwgc3RkOjplbmRsOworCisgICAgcmV0dXJuIG91dDsKK30KKworLy8gRHVtcHMgaW5mb3JtYXRpb24gd2hlbiBsc2hhbCBpcyBjYWxsZWQuCitSZXR1cm48dm9pZD4gQ29tcG9uZW50U3RvcmU6OmRlYnVnKAorICAgICAgICBjb25zdCBoaWRsX2hhbmRsZSYgaGFuZGxlLAorICAgICAgICBjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4mIC8qIGFyZ3MgKi8pIHsKKyAgICBMT0coSU5GTykgPDwgImRlYnVnIC0tIGR1bXBpbmcuLi4iOworICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaCA9IGhhbmRsZS5nZXROYXRpdmVIYW5kbGUoKTsKKyAgICBpZiAoIWggfHwgaC0+bnVtRmRzICE9IDEpIHsKKyAgICAgICBMT0coRVJST1IpIDw8ICJkZWJ1ZyAtLSBkdW1waW5nIGZhaWxlZCAtLSAiCisgICAgICAgICAgICAgICAiaW52YWxpZCBmaWxlIGRlc2NyaXB0b3IgdG8gZHVtcCB0byI7CisgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dDsKKworICAgIHsgLy8gUG9wdWxhdGUgIm91dCIuCisKKyAgICAgICAgY29uc3RleHByIGNvbnN0IGNoYXIgaW5kZW50W10gPSAiICAiOworCisgICAgICAgIC8vIFNob3cgbmFtZS4KKyAgICAgICAgb3V0IDw8ICJCZWdpbm5pbmcgb2YgZHVtcCAtLSBDMkNvbXBvbmVudFN0b3JlOiAiCisgICAgICAgICAgICAgICAgPDwgbVN0b3JlLT5nZXROYW1lKCkgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKworICAgICAgICAvLyBSZXRyaWV2ZSB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgY29tcG9uZW50cy4KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PiB0cmFpdHNMaXN0ID0KKyAgICAgICAgICAgICAgICBtU3RvcmUtPmxpc3RDb21wb25lbnRzKCk7CisKKyAgICAgICAgLy8gRHVtcCB0aGUgdHJhaXRzIG9mIHN1cHBvcnRlZCBjb21wb25lbnRzLgorICAgICAgICBvdXQgPDwgaW5kZW50IDw8ICJTdXBwb3J0ZWQgY29tcG9uZW50czoiIDw8IHN0ZDo6ZW5kbCA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGlmICh0cmFpdHNMaXN0LnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBvdXQgPDwgaW5kZW50IDw8IGluZGVudCA8PCAiTk9ORSIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgdHJhaXRzIDogdHJhaXRzTGlzdCkgeworICAgICAgICAgICAgICAgIGR1bXAob3V0LCB0cmFpdHMpIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIER1bXAgYWN0aXZlIGNvbXBvbmVudHMuCisgICAgICAgIHsKKyAgICAgICAgICAgIG91dCA8PCBpbmRlbnQgPDwgIkFjdGl2ZSBjb21wb25lbnRzOiIgPDwgc3RkOjplbmRsIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Db21wb25lbnRSb3N0ZXJNdXRleCk7CisgICAgICAgICAgICBpZiAobUNvbXBvbmVudFJvc3Rlci5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgIG91dCA8PCBpbmRlbnQgPDwgaW5kZW50IDw8ICJOT05FIiA8PCBzdGQ6OmVuZGwgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIHBhaXIgOiBtQ29tcG9uZW50Um9zdGVyKSB7CisgICAgICAgICAgICAgICAgICAgIGR1bXAob3V0LCBwYWlyLnNlY29uZCkgPDwgc3RkOjplbmRsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG91dCA8PCAiRW5kIG9mIGR1bXAgLS0gQzJDb21wb25lbnRTdG9yZTogIgorICAgICAgICAgICAgICAgIDw8IG1TdG9yZS0+Z2V0TmFtZSgpIDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisKKyAgICBpZiAoIWFuZHJvaWQ6OmJhc2U6OldyaXRlU3RyaW5nVG9GZChvdXQuc3RyKCksIGgtPmRhdGFbMF0pKSB7CisgICAgICAgIFBMT0coV0FSTklORykgPDwgImRlYnVnIC0tIGR1bXBpbmcgZmFpbGVkIC0tIHdyaXRlKCkiOworICAgIH0gZWxzZSB7CisgICAgICAgIExPRyhJTkZPKSA8PCAiZGVidWcgLS0gZHVtcGluZyBzdWNjZWVkZWQiOworICAgIH0KKyAgICByZXR1cm4gVm9pZCgpOworfQorCisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db25maWd1cmFibGUuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0NvbmZpZ3VyYWJsZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWM5YzE3MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9Db25maWd1cmFibGUuY3BwCkBAIC0wLDAgKzEsMTk1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMi1Db25maWd1cmFibGUiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOworCitDYWNoZWRDb25maWd1cmFibGU6OkNhY2hlZENvbmZpZ3VyYWJsZSgKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPENvbmZpZ3VyYWJsZUMySW50Zj4mJiBpbnRmKQorICAgICAgOiBtSW50ZntzdGQ6Om1vdmUoaW50Zil9IHsKK30KKworYzJfc3RhdHVzX3QgQ2FjaGVkQ29uZmlndXJhYmxlOjppbml0KENvbXBvbmVudFN0b3JlKiBzdG9yZSkgeworICAgIC8vIFJldHJpZXZlIHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGZyb20gc3RvcmUKKyAgICBjMl9zdGF0dXNfdCBpbml0ID0gbUludGYtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKCZtU3VwcG9ydGVkUGFyYW1zKTsKKyAgICBjMl9zdGF0dXNfdCB2YWxpZGF0ZSA9IHN0b3JlLT52YWxpZGF0ZVN1cHBvcnRlZFBhcmFtcyhtU3VwcG9ydGVkUGFyYW1zKTsKKyAgICByZXR1cm4gaW5pdCA9PSBDMl9PSyA/IEMyX09LIDogdmFsaWRhdGU7Cit9CisKKy8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb25maWd1cmFibGUgZm9sbG93LgorUmV0dXJuPHVpbnQzMl90PiBDYWNoZWRDb25maWd1cmFibGU6OmdldElkKCkgeworICAgIHJldHVybiBtSW50Zi0+Z2V0SWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IENhY2hlZENvbmZpZ3VyYWJsZTo6Z2V0TmFtZShnZXROYW1lX2NiIF9oaWRsX2NiKSB7CisgICAgX2hpZGxfY2IobUludGYtPmdldE5hbWUoKSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IENhY2hlZENvbmZpZ3VyYWJsZTo6cXVlcnkoCisgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQzMl90PiYgaW5kaWNlcywKKyAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgcXVlcnlfY2IgX2hpZGxfY2IpIHsKKyAgICB0eXBlZGVmIEMyUGFyYW06OkluZGV4IEluZGV4OworICAgIHN0ZDo6dmVjdG9yPEluZGV4PiBjMmhlYXBQYXJhbUluZGljZXMoCisgICAgICAgICAgICAoSW5kZXgqKWluZGljZXMuZGF0YSgpLAorICAgICAgICAgICAgKEluZGV4KilpbmRpY2VzLmRhdGEoKSArIGluZGljZXMuc2l6ZSgpKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGMyaGVhcFBhcmFtczsKKyAgICBjMl9zdGF0dXNfdCBjMnJlcyA9IG1JbnRmLT5xdWVyeSgKKyAgICAgICAgICAgIGMyaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIG1heUJsb2NrID8gQzJfTUFZX0JMT0NLIDogQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgICZjMmhlYXBQYXJhbXMpOworCisgICAgaGlkbF92ZWM8dWludDhfdD4gcGFyYW1zOworICAgIGlmICghY3JlYXRlUGFyYW1zQmxvYigmcGFyYW1zLCBjMmhlYXBQYXJhbXMpKSB7CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnkgLS0gaW52YWxpZCBvdXRwdXQgcGFyYW1zLiI7CisgICAgfQorICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PFN0YXR1cz4oYzJyZXMpLCBwYXJhbXMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjx2b2lkPiBDYWNoZWRDb25maWd1cmFibGU6OmNvbmZpZygKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIGluUGFyYW1zLAorICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICBjb25maWdfY2IgX2hpZGxfY2IpIHsKKyAgICAvLyBpblBhcmFtcyBpcyBub3Qgd3JpdGFibGUsIHNvIGNyZWF0ZSBhIGNvcHkgYXMgY29uZmlnIG1vZGlmaWVzIHRoZSBwYXJhbWV0ZXJzCisgICAgaGlkbF92ZWM8dWludDhfdD4gaW5QYXJhbXNDb3B5ID0gaW5QYXJhbXM7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGMycGFyYW1zOworICAgIGlmICghcGFyc2VQYXJhbXNCbG9iKCZjMnBhcmFtcywgaW5QYXJhbXNDb3B5KSkgeworICAgICAgICBMT0coV0FSTklORykgPDwgImNvbmZpZyAtLSBpbnZhbGlkIGlucHV0IHBhcmFtcy4iOworICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkNPUlJVUFRFRCwKKyAgICAgICAgICAgICAgICBoaWRsX3ZlYzxTZXR0aW5nUmVzdWx0PigpLAorICAgICAgICAgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+KCkpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICAvLyBUT0RPOiBjaGVjayBpZiBibG9iIHdhcyBpbnZhbGlkCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGMyZmFpbHVyZXM7CisgICAgYzJfc3RhdHVzX3QgYzJyZXMgPSBtSW50Zi0+Y29uZmlnKAorICAgICAgICAgICAgYzJwYXJhbXMsCisgICAgICAgICAgICBtYXlCbG9jayA/IEMyX01BWV9CTE9DSyA6IEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAmYzJmYWlsdXJlcyk7CisgICAgaGlkbF92ZWM8U2V0dGluZ1Jlc3VsdD4gZmFpbHVyZXMoYzJmYWlsdXJlcy5zaXplKCkpOworICAgIHsKKyAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiYgYzJyZXN1bHQgOiBjMmZhaWx1cmVzKSB7CisgICAgICAgICAgICBpZiAoYzJyZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBpZiAob2JqY3B5KCZmYWlsdXJlc1tpeF0sICpjMnJlc3VsdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKytpeDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJjb25maWcgLS0gaW52YWxpZCBzZXR0aW5nIHJlc3VsdHMuIjsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZhaWx1cmVzLnJlc2l6ZShpeCk7CisgICAgfQorICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IG91dFBhcmFtczsKKyAgICBpZiAoIWNyZWF0ZVBhcmFtc0Jsb2IoJm91dFBhcmFtcywgYzJwYXJhbXMpKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgImNvbmZpZyAtLSBpbnZhbGlkIG91dHB1dCBwYXJhbXMuIjsKKyAgICB9CisgICAgX2hpZGxfY2IoKFN0YXR1cyljMnJlcywgZmFpbHVyZXMsIG91dFBhcmFtcyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IENhY2hlZENvbmZpZ3VyYWJsZTo6cXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgIHVpbnQzMl90IHN0YXJ0LAorICAgICAgICB1aW50MzJfdCBjb3VudCwKKyAgICAgICAgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfY2IgX2hpZGxfY2IpIHsKKyAgICBDMkxpbmVhclJhbmdlIHJlcXVlc3QgPSBDMkxpbmVhckNhcGFjaXR5KG1TdXBwb3J0ZWRQYXJhbXMuc2l6ZSgpKS5yYW5nZSgKKyAgICAgICAgICAgIHN0YXJ0LCBjb3VudCk7CisgICAgaGlkbF92ZWM8UGFyYW1EZXNjcmlwdG9yPiBwYXJhbXMocmVxdWVzdC5zaXplKCkpOworICAgIFN0YXR1cyByZXMgPSBTdGF0dXM6Ok9LOworICAgIHNpemVfdCBkc3RJeCA9IDA7CisgICAgZm9yIChzaXplX3Qgc3JjSXggPSByZXF1ZXN0Lm9mZnNldCgpOyBzcmNJeCA8IHJlcXVlc3QuZW5kT2Zmc2V0KCk7ICsrc3JjSXgpIHsKKyAgICAgICAgaWYgKG1TdXBwb3J0ZWRQYXJhbXNbc3JjSXhdKSB7CisgICAgICAgICAgICBpZiAob2JqY3B5KCZwYXJhbXNbZHN0SXhdLCAqbVN1cHBvcnRlZFBhcmFtc1tzcmNJeF0pKSB7CisgICAgICAgICAgICAgICAgKytkc3RJeDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzID0gU3RhdHVzOjpDT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJxdWVyeVN1cHBvcnRlZFBhcmFtcyAtLSBpbnZhbGlkIG91dHB1dCBwYXJhbXMuIjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IFN0YXR1czo6QkFEX0lOREVYOworICAgICAgICB9CisgICAgfQorICAgIHBhcmFtcy5yZXNpemUoZHN0SXgpOworICAgIF9oaWRsX2NiKHJlcywgcGFyYW1zKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gQ2FjaGVkQ29uZmlndXJhYmxlOjpxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8RmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGluRmllbGRzLAorICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICBxdWVyeVN1cHBvcnRlZFZhbHVlc19jYiBfaGlkbF9jYikgeworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gYzJmaWVsZHM7CisgICAgeworICAgICAgICAvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgb2JqZWN0cyBhcmUgcmVzdHJpY3RlZCBpbiB0aGF0IHNvbWUKKyAgICAgICAgLy8gbWVtYmVycyBhcmUgY29uc3QuCisgICAgICAgIC8vIEMyUGFyYW1GaWVsZCAtIHJlcXVpcmVkIGZvciBpdHMgY29uc3RydWN0b3IgLSBoYXMgbm8gY29uc3RydWN0b3JzCisgICAgICAgIC8vIGZyb20gZmllbGRzLiBVc2UgQzJQYXJhbUluc3BlY3Rvci4KKyAgICAgICAgZm9yIChjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5ICZxdWVyeSA6IGluRmllbGRzKSB7CisgICAgICAgICAgICBjMmZpZWxkcy5lbXBsYWNlX2JhY2soX0MyUGFyYW1JbnNwZWN0b3I6OkNyZWF0ZVBhcmFtRmllbGQoCisgICAgICAgICAgICAgICAgICAgIHF1ZXJ5LmZpZWxkLmluZGV4LAorICAgICAgICAgICAgICAgICAgICBxdWVyeS5maWVsZC5maWVsZElkLm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgcXVlcnkuZmllbGQuZmllbGRJZC5zaXplKSwKKyAgICAgICAgICAgICAgICAgICAgcXVlcnkudHlwZSA9PSBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpUeXBlOjpQT1NTSUJMRSA/CisgICAgICAgICAgICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UE9TU0lCTEUgOgorICAgICAgICAgICAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkNVUlJFTlQpOworICAgICAgICB9CisgICAgfQorICAgIGMyX3N0YXR1c190IGMycmVzID0gbUludGYtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgYzJmaWVsZHMsCisgICAgICAgICAgICBtYXlCbG9jayA/IEMyX01BWV9CTE9DSyA6IEMyX0RPTlRfQkxPQ0spOworICAgIGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQ+IG91dEZpZWxkcyhpbkZpZWxkcy5zaXplKCkpOworICAgIHNpemVfdCBkc3RJeCA9IDA7CisgICAgZm9yIChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgJnJlc3VsdCA6IGMyZmllbGRzKSB7CisgICAgICAgIGlmIChvYmpjcHkoJm91dEZpZWxkc1tkc3RJeF0sIHJlc3VsdCkpIHsKKyAgICAgICAgICAgICsrZHN0SXg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBvdXRGaWVsZHMucmVzaXplKGRzdEl4KTsKKyAgICAgICAgICAgIGMycmVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJxdWVyeVN1cHBvcnRlZFZhbHVlcyAtLSBpbnZhbGlkIG91dHB1dCBwYXJhbXMuIjsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIF9oaWRsX2NiKChTdGF0dXMpYzJyZXMsIG91dEZpZWxkcyk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0QnVmZmVyTWFuYWdlci5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRCdWZmZXJNYW5hZ2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDIzYTA1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0QnVmZmVyTWFuYWdlci5jcHAKQEAgLTAsMCArMSw0NjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUlucHV0QnVmZmVyTWFuYWdlciIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0lucHV0QnVmZmVyTWFuYWdlci5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudExpc3RlbmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKKyNpbmNsdWRlIDxjaHJvbm8+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjpyZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCkgeworICAgIGdldEluc3RhbmNlKCkuX3JlZ2lzdGVyRnJhbWVEYXRhKGxpc3RlbmVyLCBpbnB1dCk7Cit9CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjp1bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KSB7CisgICAgZ2V0SW5zdGFuY2UoKS5fdW5yZWdpc3RlckZyYW1lRGF0YShsaXN0ZW5lciwgaW5wdXQpOworfQorCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6dW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIpIHsKKyAgICBnZXRJbnN0YW5jZSgpLl91bnJlZ2lzdGVyRnJhbWVEYXRhKGxpc3RlbmVyKTsKK30KKwordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6OnNldE5vdGlmaWNhdGlvbkludGVydmFsKAorICAgICAgICBuc2Vjc190IG5vdGlmaWNhdGlvbkludGVydmFsTnMpIHsKKyAgICBnZXRJbnN0YW5jZSgpLl9zZXROb3RpZmljYXRpb25JbnRlcnZhbChub3RpZmljYXRpb25JbnRlcnZhbE5zKTsKK30KKwordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6Ol9yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCkgeworICAgIHVpbnQ2NF90IGZyYW1lSW5kZXggPSBpbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICBMT0coVkVSQk9TRSkgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X3JlZ2lzdGVyRnJhbWVEYXRhIC0tIGNhbGxlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgPDwgImxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGxpc3RlbmVyLmdldCgpCisgICAgICAgICAgICAgICAgIDw8ICIsIGZyYW1lSW5kZXggPSAiIDw8IHN0ZDo6ZGVjIDw8IGZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisKKyAgICBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPiAmYnVmZmVySWRzID0KKyAgICAgICAgICAgIG1UcmFja2VkQnVmZmVyc01hcFtsaXN0ZW5lcl1bZnJhbWVJbmRleF07CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0LmJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKCFpbnB1dC5idWZmZXJzW2ldKSB7CisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X3JlZ2lzdGVyRnJhbWVEYXRhIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiSW5wdXQgYnVmZmVyIGF0IGluZGV4ICIgPDwgaSA8PCAiIGlzIG51bGwuIjsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IFRyYWNrZWRCdWZmZXIgJmJ1ZmZlcklkID0KKyAgICAgICAgICAgICAgICAqYnVmZmVySWRzLmVtcGxhY2UobGlzdGVuZXIsIGZyYW1lSW5kZXgsIGksIGlucHV0LmJ1ZmZlcnNbaV0pLgorICAgICAgICAgICAgICAgIGZpcnN0OworCisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGlucHV0LmJ1ZmZlcnNbaV0tPnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KAorICAgICAgICAgICAgICAgIG9uQnVmZmVyRGVzdHJveWVkLAorICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZidWZmZXJJZCkpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfcmVnaXN0ZXJGcmFtZURhdGEgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAicmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoKSBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiKGxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGxpc3RlbmVyLmdldCgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGZyYW1lSW5kZXggPSAiIDw8IHN0ZDo6ZGVjIDw8IGZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgYnVmZmVySW5kZXggPSAiIDw8IGkKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIikgPT4gc3RhdHVzID0gIiA8PCBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICB9CisgICAgfQorCisgICAgbURlYXRoTm90aWZpY2F0aW9ucy5lbXBsYWNlKAorICAgICAgICAgICAgbGlzdGVuZXIsCisgICAgICAgICAgICBEZWF0aE5vdGlmaWNhdGlvbnMoCisgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkludGVydmFsTnMubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSkpOworfQorCisvLyBSZW1vdmUgYSBwYWlyIChsaXN0ZW5lciwgZnJhbWVJbmRleCkgZnJvbSBtVHJhY2tlZEJ1ZmZlcnNNYXAgYW5kCisvLyBtRGVhdGhOb3RpZmljYXRpb25zLiBUaGlzIGltcGxpZXMgYWxsIGJ1ZmZlckluZGljZXMgYXJlIHJlbW92ZWQuCisvLworLy8gVGhpcyBpcyBjYWxsZWQgZnJvbSBvbldvcmtEb25lKCkgYW5kIGZsdXNoKCkuCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6X3VucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpIHsKKyAgICB1aW50NjRfdCBmcmFtZUluZGV4ID0gaW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol91bnJlZ2lzdGVyRnJhbWVEYXRhIC0tIGNhbGxlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgPDwgImxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGxpc3RlbmVyLnVuc2FmZV9nZXQoKQorICAgICAgICAgICAgICAgICA8PCAiLCBmcmFtZUluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBmcmFtZUluZGV4CisgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgYXV0byBmaW5kTGlzdGVuZXIgPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZmluZChsaXN0ZW5lcik7CisgICAgaWYgKGZpbmRMaXN0ZW5lciAhPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZW5kKCkpIHsKKyAgICAgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PFRyYWNrZWRCdWZmZXI+PiAmZnJhbWVJbmRleDJCdWZmZXJJZHMKKyAgICAgICAgICAgICAgICA9IGZpbmRMaXN0ZW5lci0+c2Vjb25kOworICAgICAgICBhdXRvIGZpbmRGcmFtZUluZGV4ID0gZnJhbWVJbmRleDJCdWZmZXJJZHMuZmluZChmcmFtZUluZGV4KTsKKyAgICAgICAgaWYgKGZpbmRGcmFtZUluZGV4ICE9IGZyYW1lSW5kZXgyQnVmZmVySWRzLmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnNldDxUcmFja2VkQnVmZmVyPiAmYnVmZmVySWRzID0gZmluZEZyYW1lSW5kZXgtPnNlY29uZDsKKyAgICAgICAgICAgIGZvciAoY29uc3QgVHJhY2tlZEJ1ZmZlciYgYnVmZmVySWQgOiBidWZmZXJJZHMpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlciA9IGJ1ZmZlcklkLmJ1ZmZlci5sb2NrKCk7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBidWZmZXItPnVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25CdWZmZXJEZXN0cm95ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDx2b2lkKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB2b2lkKj4oJmJ1ZmZlcklkKSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6Ol91bnJlZ2lzdGVyRnJhbWVEYXRhICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi0tIHVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoKSBmYWlsZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKGxpc3RlbmVyIEAgMHgiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpoZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBidWZmZXJJZC5saXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiwgZnJhbWVJbmRleCA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCBidWZmZXJJZC5mcmFtZUluZGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGJ1ZmZlckluZGV4ID0gIiA8PCBidWZmZXJJZC5idWZmZXJJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSA9PiBzdGF0dXMgPSAiIDw8IHN0YXR1cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZyYW1lSW5kZXgyQnVmZmVySWRzLmVyYXNlKGZpbmRGcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmIChmcmFtZUluZGV4MkJ1ZmZlcklkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbVRyYWNrZWRCdWZmZXJzTWFwLmVyYXNlKGZpbmRMaXN0ZW5lcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBhdXRvIGZpbmRMaXN0ZW5lckQgPSBtRGVhdGhOb3RpZmljYXRpb25zLmZpbmQobGlzdGVuZXIpOworICAgIGlmIChmaW5kTGlzdGVuZXJEICE9IG1EZWF0aE5vdGlmaWNhdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgRGVhdGhOb3RpZmljYXRpb25zICZkZWF0aE5vdGlmaWNhdGlvbnMgPSBmaW5kTGlzdGVuZXJELT5zZWNvbmQ7CisgICAgICAgIGF1dG8gZmluZEZyYW1lSW5kZXggPSBkZWF0aE5vdGlmaWNhdGlvbnMuaW5kaWNlcy5maW5kKGZyYW1lSW5kZXgpOworICAgICAgICBpZiAoZmluZEZyYW1lSW5kZXggIT0gZGVhdGhOb3RpZmljYXRpb25zLmluZGljZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gJmJ1ZmZlckluZGljZXMgPSBmaW5kRnJhbWVJbmRleC0+c2Vjb25kOworICAgICAgICAgICAgZGVhdGhOb3RpZmljYXRpb25zLmNvdW50IC09IGJ1ZmZlckluZGljZXMuc2l6ZSgpOworICAgICAgICAgICAgZGVhdGhOb3RpZmljYXRpb25zLmluZGljZXMuZXJhc2UoZmluZEZyYW1lSW5kZXgpOworICAgICAgICB9CisgICAgfQorfQorCisvLyBSZW1vdmUgbGlzdGVuZXIgZnJvbSBtVHJhY2tlZEJ1ZmZlcnNNYXAgYW5kIG1EZWF0aE5vdGlmaWNhdGlvbnMuIFRoaXMgaW1wbGllcworLy8gYWxsIGZyYW1lSW5kaWNlcyBhbmQgYnVmZmVySW5kaWNlcyBhcmUgcmVtb3ZlZC4KKy8vCisvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgY2xlYW5zIHVwIGFsbCBpbnB1dCBidWZmZXJzLCBpLmUuLCB3aGVuCisvLyByZXNldCgpLCByZWxlYXNlKCksIHN0b3AoKSBvciB+Q29tcG9uZW50KCkgaXMgY2FsbGVkLgordm9pZCBJbnB1dEJ1ZmZlck1hbmFnZXI6Ol91bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lcikgeworICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfdW5yZWdpc3RlckZyYW1lRGF0YSAtLSBjYWxsZWQgd2l0aCAiCisgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleCA8PCBsaXN0ZW5lci51bnNhZmVfZ2V0KCkKKyAgICAgICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgIi4iOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisKKyAgICBhdXRvIGZpbmRMaXN0ZW5lciA9IG1UcmFja2VkQnVmZmVyc01hcC5maW5kKGxpc3RlbmVyKTsKKyAgICBpZiAoZmluZExpc3RlbmVyICE9IG1UcmFja2VkQnVmZmVyc01hcC5lbmQoKSkgeworICAgICAgICBzdGQ6Om1hcDx1aW50NjRfdCwgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4+ICZmcmFtZUluZGV4MkJ1ZmZlcklkcyA9CisgICAgICAgICAgICAgICAgZmluZExpc3RlbmVyLT5zZWNvbmQ7CisgICAgICAgIGZvciAoYXV0byBmaW5kRnJhbWVJbmRleCA9IGZyYW1lSW5kZXgyQnVmZmVySWRzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgZmluZEZyYW1lSW5kZXggIT0gZnJhbWVJbmRleDJCdWZmZXJJZHMuZW5kKCk7CisgICAgICAgICAgICAgICAgKytmaW5kRnJhbWVJbmRleCkgeworICAgICAgICAgICAgc3RkOjpzZXQ8VHJhY2tlZEJ1ZmZlcj4gJmJ1ZmZlcklkcyA9IGZpbmRGcmFtZUluZGV4LT5zZWNvbmQ7CisgICAgICAgICAgICBmb3IgKGNvbnN0IFRyYWNrZWRCdWZmZXImIGJ1ZmZlcklkIDogYnVmZmVySWRzKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPSBidWZmZXJJZC5idWZmZXIubG9jaygpOworICAgICAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gYnVmZmVyLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uQnVmZmVyRGVzdHJveWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgdm9pZCo+KCZidWZmZXJJZCkpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfdW5yZWdpc3RlckZyYW1lRGF0YSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICItLSB1bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCkgZmFpbGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIihsaXN0ZW5lciBAIDB4IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6aGV4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgYnVmZmVySWQubGlzdGVuZXIudW5zYWZlX2dldCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGZyYW1lSW5kZXggPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgYnVmZmVySWQuZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBidWZmZXJJbmRleCA9ICIgPDwgYnVmZmVySWQuYnVmZmVySW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIikgPT4gc3RhdHVzID0gIiA8PCBzdGF0dXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1UcmFja2VkQnVmZmVyc01hcC5lcmFzZShmaW5kTGlzdGVuZXIpOworICAgIH0KKworICAgIG1EZWF0aE5vdGlmaWNhdGlvbnMuZXJhc2UobGlzdGVuZXIpOworfQorCisvLyBTZXQgbU5vdGlmaWNhdGlvbkludGVydmFsTnMuCit2b2lkIElucHV0QnVmZmVyTWFuYWdlcjo6X3NldE5vdGlmaWNhdGlvbkludGVydmFsKAorICAgICAgICBuc2Vjc190IG5vdGlmaWNhdGlvbkludGVydmFsTnMpIHsKKyAgICBtTm90aWZpY2F0aW9uSW50ZXJ2YWxOcy5zdG9yZSgKKyAgICAgICAgICAgIG5vdGlmaWNhdGlvbkludGVydmFsTnMsCisgICAgICAgICAgICBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKK30KKworLy8gTW92ZSBhIGJ1ZmZlciBmcm9tIG1UcmFja2VkQnVmZmVyc01hcCB0byBtRGVhdGhOb3RpZmljYXRpb25zLgorLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBhIHJlZ2lzdGVyZWQgQzJCdWZmZXIgb2JqZWN0IGlzIGRlc3Ryb3llZC4KK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjpvbkJ1ZmZlckRlc3Ryb3llZChjb25zdCBDMkJ1ZmZlciogYnVmLCB2b2lkKiBhcmcpIHsKKyAgICBnZXRJbnN0YW5jZSgpLl9vbkJ1ZmZlckRlc3Ryb3llZChidWYsIGFyZyk7Cit9CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjpfb25CdWZmZXJEZXN0cm95ZWQoY29uc3QgQzJCdWZmZXIqIGJ1Ziwgdm9pZCogYXJnKSB7CisgICAgaWYgKCFidWYgfHwgIWFyZykgeworICAgICAgICBMT0coV0FSTklORykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIC0tIGNhbGxlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJudWxsIGFyZ3VtZW50IChzKTogIgorICAgICAgICAgICAgICAgICAgICAgPDwgImJ1ZiBAIDB4IiA8PCBzdGQ6OmhleCA8PCBidWYKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIsIGFyZyBAIDB4IiA8PCBzdGQ6OmhleCA8PCBhcmcKKyAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8ICIuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBUcmFja2VkQnVmZmVyIGlkKCpyZWludGVycHJldF9jYXN0PFRyYWNrZWRCdWZmZXIqPihhcmcpKTsKKyAgICBMT0coVkVSQk9TRSkgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIC0tIGNhbGxlZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgPDwgImJ1ZiBAIDB4IiA8PCBzdGQ6OmhleCA8PCBidWYKKyAgICAgICAgICAgICAgICAgPDwgIiwgYXJnIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGFyZworICAgICAgICAgICAgICAgICA8PCBzdGQ6OmRlYyA8PCAiIC0tICIKKyAgICAgICAgICAgICAgICAgPDwgImxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGlkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKQorICAgICAgICAgICAgICAgICA8PCAiLCBmcmFtZUluZGV4ID0gIiA8PCBzdGQ6OmRlYyA8PCBpZC5mcmFtZUluZGV4CisgICAgICAgICAgICAgICAgIDw8ICIsIGJ1ZmZlckluZGV4ID0gIiA8PCBpZC5idWZmZXJJbmRleAorICAgICAgICAgICAgICAgICA8PCAiLiI7CisKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworCisgICAgYXV0byBmaW5kTGlzdGVuZXIgPSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZmluZChpZC5saXN0ZW5lcik7CisgICAgaWYgKGZpbmRMaXN0ZW5lciA9PSBtVHJhY2tlZEJ1ZmZlcnNNYXAuZW5kKCkpIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyOjpfb25CdWZmZXJEZXN0cm95ZWQgLS0gIgorICAgICAgICAgICAgICAgICAgIDw8ICJyZWNlaXZlZCBpbnZhbGlkIGxpc3RlbmVyOiAiCisgICAgICAgICAgICAgICAgICAgPDwgImxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGlkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgKGZyYW1lSW5kZXggPSAiIDw8IHN0ZDo6ZGVjIDw8IGlkLmZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBidWZmZXJJbmRleCA9ICIgPDwgaWQuYnVmZmVySW5kZXgKKyAgICAgICAgICAgICAgICAgICA8PCAiKS4iOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PFRyYWNrZWRCdWZmZXI+PiAmZnJhbWVJbmRleDJCdWZmZXJJZHMKKyAgICAgICAgICAgID0gZmluZExpc3RlbmVyLT5zZWNvbmQ7CisgICAgYXV0byBmaW5kRnJhbWVJbmRleCA9IGZyYW1lSW5kZXgyQnVmZmVySWRzLmZpbmQoaWQuZnJhbWVJbmRleCk7CisgICAgaWYgKGZpbmRGcmFtZUluZGV4ID09IGZyYW1lSW5kZXgyQnVmZmVySWRzLmVuZCgpKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIC0tICIKKyAgICAgICAgICAgICAgICAgICA8PCAicmVjZWl2ZWQgaW52YWxpZCBmcmFtZSBpbmRleDogIgorICAgICAgICAgICAgICAgICAgIDw8ICJmcmFtZUluZGV4ID0gIiA8PCBpZC5mcmFtZUluZGV4CisgICAgICAgICAgICAgICAgICAgPDwgIiAobGlzdGVuZXIgQCAweCIgPDwgc3RkOjpoZXggPDwgaWQubGlzdGVuZXIudW5zYWZlX2dldCgpCisgICAgICAgICAgICAgICAgICAgPDwgIiwgYnVmZmVySW5kZXggPSAiIDw8IHN0ZDo6ZGVjIDw8IGlkLmJ1ZmZlckluZGV4CisgICAgICAgICAgICAgICAgICAgPDwgIikuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c2V0PFRyYWNrZWRCdWZmZXI+ICZidWZmZXJJZHMgPSBmaW5kRnJhbWVJbmRleC0+c2Vjb25kOworICAgIGF1dG8gZmluZEJ1ZmZlcklkID0gYnVmZmVySWRzLmZpbmQoaWQpOworICAgIGlmIChmaW5kQnVmZmVySWQgPT0gYnVmZmVySWRzLmVuZCgpKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6X29uQnVmZmVyRGVzdHJveWVkIC0tICIKKyAgICAgICAgICAgICAgICAgICA8PCAicmVjZWl2ZWQgaW52YWxpZCBidWZmZXIgaW5kZXg6ICIKKyAgICAgICAgICAgICAgICAgICA8PCAiYnVmZmVySW5kZXggPSAiIDw8IGlkLmJ1ZmZlckluZGV4CisgICAgICAgICAgICAgICAgICAgPDwgIiAoZnJhbWVJbmRleCA9ICIgPDwgaWQuZnJhbWVJbmRleAorICAgICAgICAgICAgICAgICAgIDw8ICIsIGxpc3RlbmVyIEAgMHgiIDw8IHN0ZDo6aGV4IDw8IGlkLmxpc3RlbmVyLnVuc2FmZV9nZXQoKQorICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8ICIpLiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBidWZmZXJJZHMuZXJhc2UoZmluZEJ1ZmZlcklkKTsKKyAgICBpZiAoYnVmZmVySWRzLmVtcHR5KCkpIHsKKyAgICAgICAgZnJhbWVJbmRleDJCdWZmZXJJZHMuZXJhc2UoZmluZEZyYW1lSW5kZXgpOworICAgICAgICBpZiAoZnJhbWVJbmRleDJCdWZmZXJJZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgbVRyYWNrZWRCdWZmZXJzTWFwLmVyYXNlKGZpbmRMaXN0ZW5lcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBEZWF0aE5vdGlmaWNhdGlvbnMgJmRlYXRoTm90aWZpY2F0aW9ucyA9IG1EZWF0aE5vdGlmaWNhdGlvbnNbaWQubGlzdGVuZXJdOworICAgIGRlYXRoTm90aWZpY2F0aW9ucy5pbmRpY2VzW2lkLmZyYW1lSW5kZXhdLmVtcGxhY2VfYmFjayhpZC5idWZmZXJJbmRleCk7CisgICAgKytkZWF0aE5vdGlmaWNhdGlvbnMuY291bnQ7CisgICAgbU9uQnVmZmVyRGVzdHJveWVkLm5vdGlmeV9vbmUoKTsKK30KKworLy8gTm90aWZ5IHRoZSBjbGllbnRzIGFib3V0IGJ1ZmZlciBkZXN0cnVjdGlvbnMuCisvLyBSZXR1cm4gZmFsc2UgaWYgYWxsIGRlc3RydWN0aW9ucyBoYXZlIGJlZW4gbm90aWZpZWQuCisvLyBSZXR1cm4gdHJ1ZSBhbmQgc2V0IHRpbWVUb1JldHJ5IHRvIHRoZSB0aW1lIHBvaW50IHRvIHdhaXQgZm9yIGJlZm9yZQorLy8gcmV0cnlpbmcgaWYgc29tZSBkZXN0cnVjdGlvbnMgaGF2ZSBub3QgYmVlbiBub3RpZmllZC4KK2Jvb2wgSW5wdXRCdWZmZXJNYW5hZ2VyOjpwcm9jZXNzTm90aWZpY2F0aW9ucyhuc2Vjc190KiB0aW1lVG9SZXRyeU5zKSB7CisKKyAgICBzdHJ1Y3QgTm90aWZpY2F0aW9uIHsKKyAgICAgICAgc3A8SUNvbXBvbmVudExpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICAgICAgaGlkbF92ZWM8SUNvbXBvbmVudExpc3RlbmVyOjpJbnB1dEJ1ZmZlcj4gaW5wdXRCdWZmZXJzOworICAgICAgICBOb3RpZmljYXRpb24oY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbCwgc2l6ZV90IHMpCisgICAgICAgICAgICAgIDogbGlzdGVuZXIobCksIGlucHV0QnVmZmVycyhzKSB7fQorICAgIH07CisgICAgc3RkOjpsaXN0PE5vdGlmaWNhdGlvbj4gbm90aWZpY2F0aW9uczsKKyAgICBuc2Vjc190IG5vdGlmaWNhdGlvbkludGVydmFsTnMgPQorICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkludGVydmFsTnMubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKworICAgIGJvb2wgcmV0cnkgPSBmYWxzZTsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgICp0aW1lVG9SZXRyeU5zID0gbm90aWZpY2F0aW9uSW50ZXJ2YWxOczsKKyAgICAgICAgbnNlY3NfdCB0aW1lTm93TnMgPSBzeXN0ZW1UaW1lKCk7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1EZWF0aE5vdGlmaWNhdGlvbnMuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBtRGVhdGhOb3RpZmljYXRpb25zLmVuZCgpOyApIHsKKyAgICAgICAgICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbGlzdGVuZXIgPSBpdC0+Zmlyc3QucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKCFsaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBEZWF0aE5vdGlmaWNhdGlvbnMgJmRlYXRoTm90aWZpY2F0aW9ucyA9IGl0LT5zZWNvbmQ7CisKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZVNpbmNlTGFzdE5vdGlmaWVkTnMgPQorICAgICAgICAgICAgICAgICAgICB0aW1lTm93TnMgLSBkZWF0aE5vdGlmaWNhdGlvbnMubGFzdFNlbnROczsKKyAgICAgICAgICAgIC8vIElmIG5vdCBlbm91Z2ggdGltZSBoYXMgcGFzc2VkIHNpbmNlIHRoZSBsYXN0IGNhbGxiYWNrLCBsZWF2ZSB0aGUKKyAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbnMgZm9yIHRoaXMgbGlzdGVuZXIgdW50b3VjaGVkIGZvciBub3cgYW5kIHJldHJ5CisgICAgICAgICAgICAvLyBsYXRlci4KKyAgICAgICAgICAgIGlmICh0aW1lU2luY2VMYXN0Tm90aWZpZWROcyA8IG5vdGlmaWNhdGlvbkludGVydmFsTnMpIHsKKyAgICAgICAgICAgICAgICByZXRyeSA9IHRydWU7CisgICAgICAgICAgICAgICAgKnRpbWVUb1JldHJ5TnMgPSBzdGQ6Om1pbigqdGltZVRvUmV0cnlOcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkludGVydmFsTnMgLSB0aW1lU2luY2VMYXN0Tm90aWZpZWROcyk7CisgICAgICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6OnByb2Nlc3NOb3RpZmljYXRpb25zIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIk5vdGlmaWNhdGlvbnMgZm9yIGxpc3RlbmVyIEAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpoZXggPDwgbGlzdGVuZXIuZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiB3aWxsIGJlIHBvc3Rwb25lZC4iOworICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIGVub3VnaCB0aW1lIGhhcyBwYXNzZWQgc2luY2UgdGhlIGxhc3Qgbm90aWZpY2F0aW9uIHRvIHRoaXMKKyAgICAgICAgICAgIC8vIGxpc3RlbmVyIGJ1dCB0aGVyZSBhcmUgY3VycmVudGx5IG5vIHBlbmRpbmcgbm90aWZpY2F0aW9ucywgdGhlCisgICAgICAgICAgICAvLyBsaXN0ZW5lciBjYW4gYmUgcmVtb3ZlZCBmcm9tIG1EZWF0aE5vdGlmaWNhdGlvbnMtLS10aGVyZSBpcyBubworICAgICAgICAgICAgLy8gbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IG5vdGlmaWNhdGlvbiB0aW1lIGFueW1vcmUuCisgICAgICAgICAgICBpZiAoZGVhdGhOb3RpZmljYXRpb25zLmNvdW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBpdCA9IG1EZWF0aE5vdGlmaWNhdGlvbnMuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBDcmVhdGUgdGhlIGFyZ3VtZW50IGZvciB0aGUgY2FsbGJhY2suCisgICAgICAgICAgICBub3RpZmljYXRpb25zLmVtcGxhY2VfYmFjayhsaXN0ZW5lciwgZGVhdGhOb3RpZmljYXRpb25zLmNvdW50KTsKKyAgICAgICAgICAgIGhpZGxfdmVjPElDb21wb25lbnRMaXN0ZW5lcjo6SW5wdXRCdWZmZXI+ICZpbnB1dEJ1ZmZlcnMgPQorICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25zLmJhY2soKS5pbnB1dEJ1ZmZlcnM7CisgICAgICAgICAgICBzaXplX3QgaSA9IDA7CisgICAgICAgICAgICBmb3IgKHN0ZDo6cGFpcjxjb25zdCB1aW50NjRfdCwgc3RkOjp2ZWN0b3I8c2l6ZV90Pj4mIHAgOgorICAgICAgICAgICAgICAgICAgICBkZWF0aE5vdGlmaWNhdGlvbnMuaW5kaWNlcykgeworICAgICAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXggPSBwLmZpcnN0OworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gJmJ1ZmZlckluZGljZXMgPSBwLnNlY29uZDsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHNpemVfdCYgYnVmZmVySW5kZXggOiBidWZmZXJJbmRpY2VzKSB7CisgICAgICAgICAgICAgICAgICAgIElDb21wb25lbnRMaXN0ZW5lcjo6SW5wdXRCdWZmZXIgJmlucHV0QnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBpbnB1dEJ1ZmZlcnNbaSsrXTsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuYXJyYXlJbmRleCA9IGJ1ZmZlckluZGV4OworICAgICAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci5mcmFtZUluZGV4ID0gZnJhbWVJbmRleDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIENsZWFyIGRlYXRoTm90aWZpY2F0aW9ucyBmb3IgdGhpcyBsaXN0ZW5lciBhbmQgc2V0IHJldHJ5IHRvIHRydWUKKyAgICAgICAgICAgIC8vIHNvIHByb2Nlc3NOb3RpZmljYXRpb25zIHdpbGwgYmUgY2FsbGVkIGFnYWluLiBUaGlzIHdpbGwKKyAgICAgICAgICAgIC8vIGd1YXJhbnRlZSB0aGF0IGEgbGlzdGVuZXIgd2l0aCBubyBwZW5kaW5nIG5vdGlmaWNhdGlvbnMgd2lsbAorICAgICAgICAgICAgLy8gZXZlbnR1YWxseSBiZSByZW1vdmVkIGZyb20gbURlYXRoTm90aWZpY2F0aW9ucyBhZnRlcgorICAgICAgICAgICAgLy8gbU5vdGlmaWNhdGlvbkludGVydmFsTnMgbmFub3NlY29uZHMgaGFzIHBhc3NlZC4KKyAgICAgICAgICAgIHJldHJ5ID0gdHJ1ZTsKKyAgICAgICAgICAgIGRlYXRoTm90aWZpY2F0aW9ucy5pbmRpY2VzLmNsZWFyKCk7CisgICAgICAgICAgICBkZWF0aE5vdGlmaWNhdGlvbnMuY291bnQgPSAwOworICAgICAgICAgICAgZGVhdGhOb3RpZmljYXRpb25zLmxhc3RTZW50TnMgPSB0aW1lTm93TnM7CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQ2FsbCBvbklucHV0QnVmZmVyc1JlbGVhc2VkKCkgb3V0c2lkZSB0aGUgbG9jayB0byBhdm9pZCBkZWFkbG9jay4KKyAgICBmb3IgKGNvbnN0IE5vdGlmaWNhdGlvbiYgbm90aWZpY2F0aW9uIDogbm90aWZpY2F0aW9ucykgeworICAgICAgICBpZiAoIW5vdGlmaWNhdGlvbi5saXN0ZW5lci0+b25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCgKKyAgICAgICAgICAgICAgICBub3RpZmljYXRpb24uaW5wdXRCdWZmZXJzKS5pc09rKCkpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgbWF5IHRyaWdnZXIgaWYgdGhlIGNsaWVudCBoYXMgZGllZC4KKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6cHJvY2Vzc05vdGlmaWNhdGlvbnMgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiZmFpbGVkIHRvIHNlbmQgZGVhdGggbm90aWZpY2F0aW9ucyB0byAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgbm90aWZpY2F0aW9uLmxpc3RlbmVyLmdldCgpCisgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZGVjIDw8ICIuIjsKKyAgICAgICAgfSBlbHNlIHsKKyNpZiBMT0dfTkRFQlVHID09IDAKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIGlucHV0QnVmZmVyTG9nOworICAgICAgICAgICAgZm9yIChjb25zdCBJQ29tcG9uZW50TGlzdGVuZXI6OklucHV0QnVmZmVyJiBpbnB1dEJ1ZmZlciA6CisgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbi5pbnB1dEJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlckxvZyA8PCAiICgiIDw8IGlucHV0QnVmZmVyLmZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCAiIDw8IGlucHV0QnVmZmVyLmFycmF5SW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMT0coVkVSQk9TRSkgPDwgIklucHV0QnVmZmVyTWFuYWdlcjo6cHJvY2Vzc05vdGlmaWNhdGlvbnMgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJkZWF0aCBub3RpZmljYXRpb25zIHNlbnQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJsaXN0ZW5lciBAIDB4IiA8PCBzdGQ6OmhleAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBub3RpZmljYXRpb24ubGlzdGVuZXIuZ2V0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RkOjpkZWMKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIHdpdGggdGhlc2UgKGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSBwYWlyczoiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgaW5wdXRCdWZmZXJMb2cuc3RyKCk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKyNpZiBMT0dfTkRFQlVHID09IDAKKyAgICBpZiAocmV0cnkpIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6OnByb2Nlc3NOb3RpZmljYXRpb25zIC0tICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJ3aWxsIHJldHJ5IGFnYWluIGluICIgPDwgKnRpbWVUb1JldHJ5TnMgPDwgIm5zLiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJJbnB1dEJ1ZmZlck1hbmFnZXI6OnByb2Nlc3NOb3RpZmljYXRpb25zIC0tICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJubyBwZW5kaW5nIGRlYXRoIG5vdGlmaWNhdGlvbnMuIjsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gcmV0cnk7Cit9CisKK3ZvaWQgSW5wdXRCdWZmZXJNYW5hZ2VyOjptYWluKCkgeworICAgIExPRyhWRVJCT1NFKSA8PCAiSW5wdXRCdWZmZXJNYW5hZ2VyIG1haW4gLS0gc3RhcnRlZC4iOworICAgIG5zZWNzX3QgdGltZVRvUmV0cnlOczsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgd2hpbGUgKG1EZWF0aE5vdGlmaWNhdGlvbnMuZW1wdHkoKSkgeworICAgICAgICAgICAgbU9uQnVmZmVyRGVzdHJveWVkLndhaXQobG9jayk7CisgICAgICAgIH0KKyAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgd2hpbGUgKHByb2Nlc3NOb3RpZmljYXRpb25zKCZ0aW1lVG9SZXRyeU5zKSkgeworICAgICAgICAgICAgc3RkOjp0aGlzX3RocmVhZDo6c2xlZXBfZm9yKAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmNocm9ubzo6bmFub3NlY29uZHModGltZVRvUmV0cnlOcykpOworICAgICAgICB9CisgICAgfQorfQorCitJbnB1dEJ1ZmZlck1hbmFnZXI6OklucHV0QnVmZmVyTWFuYWdlcigpCisgICAgICA6IG1NYWluVGhyZWFkeyZJbnB1dEJ1ZmZlck1hbmFnZXI6Om1haW4sIHRoaXN9IHsKK30KKworSW5wdXRCdWZmZXJNYW5hZ2VyJiBJbnB1dEJ1ZmZlck1hbmFnZXI6OmdldEluc3RhbmNlKCkgeworICAgIHN0YXRpYyBJbnB1dEJ1ZmZlck1hbmFnZXIgaW5zdGFuY2V7fTsKKyAgICByZXR1cm4gaW5zdGFuY2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRTdXJmYWNlLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9JbnB1dFN1cmZhY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNGNhODUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRTdXJmYWNlLmNwcApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzItSW5wdXRTdXJmYWNlIgorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDsKKworLy8gRGVyaXZlZCBjbGFzcyBvZiBDMkludGVyZmFjZUhlbHBlcgorY2xhc3MgSW5wdXRTdXJmYWNlOjpJbnRlcmZhY2UgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEludGVyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgOiBDMkludGVyZmFjZUhlbHBlcihoZWxwZXIpIHsKKworICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgYWRkUGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIERlZmluZVBhcmFtKG1Fb3MsIEMyX1BBUkFNS0VZX0lOUFVUX1NVUkZBQ0VfRU9TKQorICAgICAgICAgICAgICAgIC53aXRoRGVmYXVsdChuZXcgQzJJbnB1dFN1cmZhY2VFb3NUdW5pbmcoZmFsc2UpKQorICAgICAgICAgICAgICAgIC53aXRoRmllbGRzKHtDMkYobUVvcywgdmFsdWUpLm9uZU9mKHt0cnVlLCBmYWxzZX0pfSkKKyAgICAgICAgICAgICAgICAud2l0aFNldHRlcihFb3NTZXR0ZXIpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgIH0KKworICAgIHN0YXRpYyBDMlIgRW9zU2V0dGVyKGJvb2wgbWF5QmxvY2ssIEMyUDxDMklucHV0U3VyZmFjZUVvc1R1bmluZz4gJm1lKSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICByZXR1cm4gbWUuRihtZS52LnZhbHVlKS52YWxpZGF0ZVBvc3NpYmxlKG1lLnYudmFsdWUpOworICAgIH0KKworICAgIGJvb2wgZW9zKCkgY29uc3QgeyByZXR1cm4gbUVvcy0+dmFsdWU7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJJbnB1dFN1cmZhY2VFb3NUdW5pbmc+IG1Fb3M7Cit9OworCisvLyBEZXJpdmVkIGNsYXNzIG9mIENvbmZpZ3VyYWJsZUMySW50ZgorY2xhc3MgSW5wdXRTdXJmYWNlOjpDb25maWd1cmFibGVJbnRmIDogcHVibGljIENvbmZpZ3VyYWJsZUMySW50ZiB7CitwdWJsaWM6CisgICAgQ29uZmlndXJhYmxlSW50ZigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U6OkludGVyZmFjZT4gJmludGYsCisgICAgICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiAmc291cmNlKQorICAgICAgICA6IENvbmZpZ3VyYWJsZUMySW50ZigiaW5wdXQtc3VyZmFjZSIsIDApLAorICAgICAgICAgIG1JbnRmKGludGYpLAorICAgICAgICAgIG1Tb3VyY2Uoc291cmNlKSB7CisgICAgfQorCisgICAgdmlydHVhbCB+Q29uZmlndXJhYmxlSW50ZigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgcGFyYW1zCisgICAgICAgICAgICApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5xdWVyeSh7fSwgaW5kaWNlcywgbWF5QmxvY2ssIHBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzCisgICAgICAgICAgICApIG92ZXJyaWRlIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUludGYtPmNvbmZpZyhwYXJhbXMsIG1heUJsb2NrLCBmYWlsdXJlcyk7CisgICAgICAgIGlmIChtSW50Zi0+ZW9zKCkpIHsKKyAgICAgICAgICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IHNvdXJjZSA9IG1Tb3VyY2UucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxscHRyIHx8IHNvdXJjZS0+c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogcHV0IHNvbWV0aGluZyBpbiB8ZmFpbHVyZXN8CisgICAgICAgICAgICAgICAgZXJyID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gVE9ETzogcmVzZXQgZW9zPworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+KiBjb25zdCBwYXJhbXMKKyAgICAgICAgICAgICkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUludGYtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKHBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGZpZWxkcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2spIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRmLT5xdWVyeVN1cHBvcnRlZFZhbHVlcyhmaWVsZHMsIG1heUJsb2NrKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZTo6SW50ZXJmYWNlPiBtSW50ZjsKKyAgICB3cDxHcmFwaGljQnVmZmVyU291cmNlPiBtU291cmNlOworfTsKKworUmV0dXJuPHNwPElucHV0U3VyZmFjZTo6SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4+IElucHV0U3VyZmFjZTo6Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgeworICAgIHJldHVybiBtUHJvZHVjZXI7Cit9CisKK1JldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gSW5wdXRTdXJmYWNlOjpnZXRDb25maWd1cmFibGUoKSB7CisgICAgcmV0dXJuIG1Db25maWd1cmFibGU7Cit9CisKK1JldHVybjx2b2lkPiBJbnB1dFN1cmZhY2U6OmNvbm5lY3QoCisgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rLAorICAgICAgICBjb25uZWN0X2NiIF9oaWRsX2NiKSB7CisgICAgU3RhdHVzIHN0YXR1czsKKyAgICBzcDxJbnB1dFN1cmZhY2VDb25uZWN0aW9uPiBjb25uZWN0aW9uOworICAgIGlmICghc2luaykgeworICAgICAgICBfaGlkbF9jYihTdGF0dXM6OkJBRF9WQUxVRSwgbnVsbHB0cik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gY29tcCA9IENvbXBvbmVudDo6ZmluZExvY2FsQ29tcG9uZW50KHNpbmspOworICAgIGlmIChjb21wKSB7CisgICAgICAgIGNvbm5lY3Rpb24gPSBuZXcgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbihtU291cmNlLCBjb21wLCBtU3RvcmUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbm5lY3Rpb24gPSBuZXcgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbihtU291cmNlLCBzaW5rLCBtU3RvcmUpOworICAgIH0KKyAgICBpZiAoIWNvbm5lY3Rpb24tPmluaXQoKSkgeworICAgICAgICBjb25uZWN0aW9uID0gbnVsbHB0cjsKKyAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpCQURfVkFMVUU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpPSzsKKyAgICB9CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBjb25uZWN0aW9uKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCisvLyBDb25zdHJ1Y3RvciBpcyBleGNsdXNpdmUgdG8gQ29tcG9uZW50U3RvcmUuCitJbnB1dFN1cmZhY2U6OklucHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3Qgc3A8Q29tcG9uZW50U3RvcmU+JiBzdG9yZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiYgcmVmbGVjdG9yLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIsCisgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UpCisgICAgICA6IG1TdG9yZXtzdG9yZX0sCisgICAgICAgIG1Qcm9kdWNlcntwcm9kdWNlcn0sCisgICAgICAgIG1Tb3VyY2V7c291cmNlfSwKKyAgICAgICAgbUludGZ7c3RkOjptYWtlX3NoYXJlZDxJbnRlcmZhY2U+KHJlZmxlY3Rvcil9LAorICAgICAgICBtQ29uZmlndXJhYmxle25ldyBDYWNoZWRDb25maWd1cmFibGUoCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDb25maWd1cmFibGVJbnRmPigKKyAgICAgICAgICAgICAgICAgICAgbUludGYsIHNvdXJjZSkpfSB7CisKKyAgICBtQ29uZmlndXJhYmxlLT5pbml0KHN0b3JlLmdldCgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5OTMyZWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5jcHAKQEAgLTAsMCArMSw1MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyLUlucHV0U3VyZmFjZUNvbm5lY3Rpb24iCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0lucHV0U3VyZmFjZUNvbm5lY3Rpb24uaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9Db21wb25lbnRXcmFwcGVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSA8QzIuaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKworY29uc3RleHByIGludDMyX3Qga0J1ZmZlckNvdW50ID0gMTY7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK2NsYXNzIEJ1ZmZlcjJEIDogcHVibGljIEMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBCdWZmZXIyRChDMkNvbnN0R3JhcGhpY0Jsb2NrIGJsb2NrKSA6IEMyQnVmZmVyKHsgYmxvY2sgfSkgeworICAgIH0KK307CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gRGVyaXZlZCBjbGFzcyBvZiBDb21wb25lbnRXcmFwcGVyIGZvciB1c2Ugd2l0aAorLy8gR3JhcGhpY0J1ZmZlclNvdXJjZTo6Y29uZmlndXJlKCkuCisvLworc3RydWN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGwgOiBwdWJsaWMgQ29tcG9uZW50V3JhcHBlciB7CisKKyAgICBJbXBsKGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+JiBsb2NhbENvbXApCisgICAgICAgICAgOiBtU291cmNle3NvdXJjZX0sIG1Mb2NhbENvbXB7bG9jYWxDb21wfSwgbVNpbmt7fSwgbUZyYW1lSW5kZXh7MH0geworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYgPSBsb2NhbENvbXAtPmludGYoKTsKKyAgICAgICAgbVNpbmtOYW1lID0gaW50ZiA/IGludGYtPmdldE5hbWUoKSA6ICIiOworICAgIH0KKworICAgIEltcGwoY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rKQorICAgICAgICAgIDogbVNvdXJjZXtzb3VyY2V9LCBtTG9jYWxDb21we30sIG1TaW5re3Npbmt9LCBtRnJhbWVJbmRleHswfSB7CisgICAgICAgIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gdHJhbnNSZXN1bHQgPSBzaW5rLT5nZXRDb25maWd1cmFibGUoKTsKKyAgICAgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlJlbW90ZSBzaW5rIGlzIGRlYWQuIjsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtU2lua0NvbmZpZ3VyYWJsZSA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHRyYW5zUmVzdWx0KTsKKyAgICAgICAgaWYgKCFtU2lua0NvbmZpZ3VyYWJsZSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiUmVtb3RlIHNpbmsgaXMgbm90IGNvbmZpZ3VyYWJsZS4iOworICAgICAgICAgICAgbVNpbmtOYW1lID0gIiI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBoaWRsX3N0cmluZyBuYW1lOworICAgICAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtU2lua0NvbmZpZ3VyYWJsZS0+Z2V0TmFtZSgKKyAgICAgICAgICAgICAgICBbJm5hbWVdKGNvbnN0IGhpZGxfc3RyaW5nJiBuKSB7CisgICAgICAgICAgICAgICAgICAgIG5hbWUgPSBuOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiUmVtb3RlIHNpbmsncyBjb25maWd1cmFibGUgaXMgZGVhZC4iOworICAgICAgICAgICAgbVNpbmtOYW1lID0gIiI7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbVNpbmtOYW1lID0gbmFtZS5jX3N0cigpOworICAgIH0KKworICAgIHZpcnR1YWwgfkltcGwoKSB7CisgICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKKyAgICAgICAgbVNvdXJjZS0+cmVsZWFzZSgpOworICAgIH0KKworICAgIGJvb2wgaW5pdCgpIHsKKyAgICAgICAgaWYgKG1Tb3VyY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPmluaXRDaGVjaygpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkltcGw6OmluaXQgLS0gR3JhcGhpY0J1ZmZlclNvdXJjZSBpbml0IGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJzdGF0dXMgPSAiIDw8IGVyciA8PCAiLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiByZWFkIHNldHRpbmdzIHByb3Blcmx5IGZyb20gdGhlIGludGVyZmFjZQorICAgICAgICBDMlN0cmVhbVBpY3R1cmVTaXplSW5mbzo6aW5wdXQgaW5wdXRTaXplOworICAgICAgICBDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dCB1c2FnZTsKKyAgICAgICAgYzJfc3RhdHVzX3QgYzJTdGF0dXMgPSBxdWVyeUZyb21TaW5rKHsgJmlucHV0U2l6ZSwgJnVzYWdlIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpOworICAgICAgICBpZiAoYzJTdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiSW1wbDo6aW5pdCAtLSBjYW5ub3QgcXVlcnkgaW5mb3JtYXRpb24gZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBjb21wb25lbnQgaW50ZXJmYWNlOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInN0YXR1cyA9ICIgPDwgYXNTdHJpbmcoYzJTdGF0dXMpIDw8ICIuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IHByb3BlciBjb2xvciBhc3BlY3QgJiBkYXRhc3BhY2UKKyAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9CVDcwOTsKKworICAgICAgICAvLyBUT0RPOiB1c2UgdGhlIHVzYWdlIHJlYWQgZnJvbSBpbnRmCisgICAgICAgIC8vIHVpbnQzMl90IGdyYWxsb2NVc2FnZSA9CisgICAgICAgIC8vICAgICAgICAgQzJBbmRyb2lkTWVtb3J5VXNhZ2UoQzJNZW1vcnlVc2FnZSh1c2FnZS52YWx1ZSkpLgorICAgICAgICAvLyAgICAgICAgIGFzR3JhbGxvY1VzYWdlKCk7CisKKyAgICAgICAgdWludDMyX3QgZ3JhbGxvY1VzYWdlID0KKyAgICAgICAgICAgICAgICBtU2lua05hbWUuY29tcGFyZSgwLCAxMSwgImMyLmFuZHJvaWQuIikgPT0gMCA/CisgICAgICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOIDoKKyAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVI7CisKKyAgICAgICAgZXJyID0gbVNvdXJjZS0+Y29uZmlndXJlKAorICAgICAgICAgICAgICAgIHRoaXMsIGRhdGFTcGFjZSwga0J1ZmZlckNvdW50LAorICAgICAgICAgICAgICAgIGlucHV0U2l6ZS53aWR0aCwgaW5wdXRTaXplLmhlaWdodCwKKyAgICAgICAgICAgICAgICBncmFsbG9jVXNhZ2UpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkltcGw6OmluaXQgLS0gR0JTIGNvbmZpZ3VyZSBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAic3RhdHVzID0gIiA8PCBlcnIgPDwgIi4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtCdWZmZXJDb3VudDsgKytpKSB7CisgICAgICAgICAgICBpZiAoIW1Tb3VyY2UtPm9uSW5wdXRCdWZmZXJBZGRlZChpKS5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIkltcGw6OmluaXQ6IGZhaWxlZCB0byBwb3B1bGF0ZSBHQlMgc2xvdHMuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFtU291cmNlLT5zdGFydCgpLmlzT2soKSkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJJbXBsOjppbml0IC0tIEdCUyBmYWlsZWQgdG8gc3RhcnQuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBtQWxsb2NhdG9yTXV0ZXgubG9jaygpOworICAgICAgICBjMl9zdGF0dXNfdCBjMmVyciA9IEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKS0+ZmV0Y2hBbGxvY2F0b3IoCisgICAgICAgICAgICAgICAgQzJBbGxvY2F0b3JTdG9yZTo6UExBVEZPUk1fU1RBUlQgKyAxLCAgLy8gR1JBTExPQworICAgICAgICAgICAgICAgICZtQWxsb2NhdG9yKTsKKyAgICAgICAgbUFsbG9jYXRvck11dGV4LnVubG9jaygpOworICAgICAgICBpZiAoYzJlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiSW1wbDo6aW5pdCAtLSBmYWlsZWQgdG8gZmV0Y2ggZ3JhbGxvYyBhbGxvY2F0b3I6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAic3RhdHVzID0gIiA8PCBhc1N0cmluZyhjMmVycikgPDwgIi4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIEZyb20gQ29tcG9uZW50V3JhcHBlcgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VibWl0QnVmZmVyKAorICAgICAgICAgICAgaW50MzJfdCBidWZmZXJJZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXI+JiBidWZmZXIsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwKKyAgICAgICAgICAgIGludCBmZW5jZUZkKSBvdmVycmlkZSB7CisgICAgICAgIExPRyhWRVJCT1NFKSA8PCAiSW1wbDo6c3VibWl0QnVmZmVyIC0tIGJ1ZmZlcklkID0gIiA8PCBidWZmZXJJZCA8PCAiLiI7CisgICAgICAgIC8vIFRPRE86IFVzZSBmZCB0byBjb25zdHJ1Y3QgZmVuY2UKKyAgICAgICAgKHZvaWQpZmVuY2VGZDsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgIEMySGFuZGxlKiBoYW5kbGUgPSBXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZSgKKyAgICAgICAgICAgICAgICBidWZmZXItPmhhbmRsZSwKKyAgICAgICAgICAgICAgICBidWZmZXItPndpZHRoLCBidWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgICAgICBidWZmZXItPmZvcm1hdCwgYnVmZmVyLT51c2FnZSwgYnVmZmVyLT5zdHJpZGUpOworICAgICAgICBtQWxsb2NhdG9yTXV0ZXgubG9jaygpOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgbUFsbG9jYXRvck11dGV4LnVubG9jaygpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrID0KKyAgICAgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYyk7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayhuZXcgQzJXb3JrKTsKKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpMDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IG1GcmFtZUluZGV4LmZldGNoX2FkZCgKKyAgICAgICAgICAgICAgICAxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGMyQnVmZmVyKAorICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgbmV3IEJ1ZmZlcjJEKGJsb2NrLT5zaGFyZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUmVjdChibG9jay0+d2lkdGgoKSwgYmxvY2stPmhlaWdodCgpKSwgOjpDMkZlbmNlKCkpKSwKKyAgICAgICAgICAgICAgICBbYnVmZmVySWQsIHNvdXJjZSA9IG1Tb3VyY2VdKEMyQnVmZmVyKiBwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHB0cjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpc291cmNlLT5vbklucHV0QnVmZmVyRW1wdGllZChidWZmZXJJZCwgLTEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMucHVzaF9iYWNrKGMyQnVmZmVyKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICBlcnIgPSBxdWV1ZVRvU2luaygmaXRlbXMpOworICAgICAgICByZXR1cm4gKGVyciA9PSBDMl9PSykgPyBPSyA6IFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdWJtaXRFb3MoaW50MzJfdCBidWZmZXJJZCkgb3ZlcnJpZGUgeworICAgICAgICBMT0coVkVSQk9TRSkgPDwgIkltcGw6OnN1Ym1pdEVvcyAtLSBidWZmZXJJZCA9ICIgPDwgYnVmZmVySWQgPDwgIi4iOworICAgICAgICAodm9pZClidWZmZXJJZDsKKworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrKG5ldyBDMldvcmspOworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdCkwOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBtRnJhbWVJbmRleC5mZXRjaF9hZGQoCisgICAgICAgICAgICAgICAgMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBxdWV1ZVRvU2luaygmaXRlbXMpOworICAgICAgICByZXR1cm4gKGVyciA9PSBDMl9PSykgPyBPSyA6IFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGRpc3BhdGNoRGF0YVNwYWNlQ2hhbmdlZCgKKyAgICAgICAgICAgIGludDMyX3QgZGF0YVNwYWNlLCBpbnQzMl90IGFzcGVjdHMsIGludDMyX3QgcGl4ZWxGb3JtYXQpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICAodm9pZClkYXRhU3BhY2U7CisgICAgICAgICh2b2lkKWFzcGVjdHM7CisgICAgICAgICh2b2lkKXBpeGVsRm9ybWF0OworICAgIH0KKworICAgIC8vIENvbmZpZ3VyYWJsZSBpbnRlcmZhY2UgZm9yIElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGwuCisgICAgLy8KKyAgICAvLyBUaGlzIGNsYXNzIGlzIGRlY2xhcmVkIGFzIGFuIGlubmVyIGNsYXNzIHNvIHRoYXQgaXQgd2lsbCBoYXZlIGFjY2VzcyB0bworICAgIC8vIGFsbCBJbXBsJ3MgbWVtYmVycy4KKyAgICBzdHJ1Y3QgQ29uZmlndXJhYmxlSW50ZiA6IHB1YmxpYyBDb25maWd1cmFibGVDMkludGYgeworICAgICAgICBzcDxJbXBsPiBtQ29ubmVjdGlvbjsKKyAgICAgICAgQ29uZmlndXJhYmxlSW50Zihjb25zdCBzcDxJbXBsPiYgY29ubmVjdGlvbikKKyAgICAgICAgICAgICAgOiBDb25maWd1cmFibGVDMkludGZ7ImlucHV0LXN1cmZhY2UtY29ubmVjdGlvbiIsIDB9LAorICAgICAgICAgICAgICAgIG1Db25uZWN0aW9ue2Nvbm5lY3Rpb259IHt9CisgICAgICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcworICAgICAgICAgICAgICAgICkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zCisgICAgICAgICAgICAgICAgKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsCisgICAgICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Qgb3ZlcnJpZGU7CisgICAgfTsKKworcHJpdmF0ZToKKyAgICBjMl9zdGF0dXNfdCBxdWVyeUZyb21TaW5rKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSB7CisgICAgICAgIGlmIChtTG9jYWxDb21wKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IGludGYgPSBtTG9jYWxDb21wLT5pbnRmKCk7CisgICAgICAgICAgICBpZiAoaW50ZikgeworICAgICAgICAgICAgICAgIHJldHVybiBpbnRmLT5xdWVyeV92YihzdGFja1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeUZyb21TaW5rIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJjb21wb25lbnQgZG9lcyBub3QgaGF2ZSBhbiBpbnRlcmZhY2UuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1NUQVRFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQ0hFQ0sobVNpbmspIDw8ICItLSBxdWVyeUZyb21TaW5rICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICItLSBjb25uZWN0aW9uIGhhcyBubyBzaW5rLiI7CisgICAgICAgIENIRUNLKG1TaW5rQ29uZmlndXJhYmxlKSA8PCAiLS0gcXVlcnlGcm9tU2luayAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLS0gc2luayBoYXMgbm8gY29uZmlndXJhYmxlLiI7CisKKyAgICAgICAgaGlkbF92ZWM8UGFyYW1JbmRleD4gaW5kaWNlcygKKyAgICAgICAgICAgICAgICBzdGFja1BhcmFtcy5zaXplKCkgKyBoZWFwUGFyYW1JbmRpY2VzLnNpemUoKSk7CisgICAgICAgIHNpemVfdCBudW1JbmRpY2VzID0gMDsKKyAgICAgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgc3RhY2tQYXJhbSA6IHN0YWNrUGFyYW1zKSB7CisgICAgICAgICAgICBpZiAoIXN0YWNrUGFyYW0pIHsKKyAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeUZyb21TaW5rIC0tIG51bGwgc3RhY2sgcGFyYW0gZW5jb3VudGVyZWQuIjsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGluZGljZXNbbnVtSW5kaWNlcysrXSA9IHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KHN0YWNrUGFyYW0tPmluZGV4KCkpOworICAgICAgICB9CisgICAgICAgIHNpemVfdCBudW1TdGFja0luZGljZXMgPSBudW1JbmRpY2VzOworICAgICAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4JiBpbmRleCA6IGhlYXBQYXJhbUluZGljZXMpIHsKKyAgICAgICAgICAgIGluZGljZXNbbnVtSW5kaWNlcysrXSA9CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmRleCkpOworICAgICAgICB9CisgICAgICAgIGluZGljZXMucmVzaXplKG51bUluZGljZXMpOworICAgICAgICBpZiAoaGVhcFBhcmFtcykgeworICAgICAgICAgICAgaGVhcFBhcmFtcy0+cmVzZXJ2ZShoZWFwUGFyYW1zLT5zaXplKCkgKyBudW1JbmRpY2VzKTsKKyAgICAgICAgfQorICAgICAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1TaW5rQ29uZmlndXJhYmxlLT5xdWVyeSgKKyAgICAgICAgICAgICAgICBpbmRpY2VzLAorICAgICAgICAgICAgICAgIG1heUJsb2NrID09IEMyX01BWV9CTE9DSywKKyAgICAgICAgICAgICAgICBbJnN0YXR1cywgJm51bVN0YWNrSW5kaWNlcywgJnN0YWNrUGFyYW1zLCBoZWFwUGFyYW1zXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLCBjb25zdCBQYXJhbXMmIHApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LICYmIHN0YXR1cyAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXJ5RnJvbVNpbmsgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgInN0YXR1cyA9ICIgPDwgYXNTdHJpbmcoc3RhdHVzKSA8PCAiLiI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VQYXJhbXNCbG9iKCZwYXJhbVBvaW50ZXJzLCBwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnlGcm9tU2luayAtLSBlcnJvciB3aGlsZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJwYXJzaW5nIHBhcmFtcy4iOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvIGl0ID0gcGFyYW1Qb2ludGVycy5iZWdpbigpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ICE9IHBhcmFtUG9pbnRlcnMuZW5kKCk7ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbSogcGFyYW1Qb2ludGVyID0gKml0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG51bVN0YWNrSW5kaWNlcyA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLW51bVN0YWNrSW5kaWNlczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeUZyb21TaW5rIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVsbCBzdGFjayBwYXJhbS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICg7IGkgPCBzdGFja1BhcmFtcy5zaXplKCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdGFja1BhcmFtc1tpXTsgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soaSA8IHN0YWNrUGFyYW1zLnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrUGFyYW1zW2ldLT5pbmRleCgpICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbVBvaW50ZXItPmluZGV4KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnlGcm9tU2luayAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcmFtIHNraXBwZWQgKGluZGV4ID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YWNrUGFyYW1zW2ldLT5pbmRleCgpIDw8ICIpLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YWNrUGFyYW1zW2krK10tPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RhY2tQYXJhbXNbaSsrXS0+dXBkYXRlRnJvbSgqcGFyYW1Qb2ludGVyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeUZyb21TaW5rIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyYW0gdXBkYXRlIGZhaWxlZCAoaW5kZXggPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgcGFyYW1Qb2ludGVyLT5pbmRleCgpIDw8ICIpLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJxdWVyeUZyb21TaW5rIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibnVsbCBoZWFwIHBhcmFtLiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYXBQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJxdWVyeUZyb21TaW5rIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0b28gbWFueSBzdGFjayBwYXJhbXMuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMtPmVtcGxhY2VfYmFjayhDMlBhcmFtOjpDb3B5KCpwYXJhbVBvaW50ZXIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5RnJvbVNpbmsgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgcXVldWVUb1Npbmsoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgaXRlbXMpIHsKKyAgICAgICAgaWYgKG1Mb2NhbENvbXApIHsKKyAgICAgICAgICAgIHJldHVybiBtTG9jYWxDb21wLT5xdWV1ZV9uYihpdGVtcyk7CisgICAgICAgIH0KKworICAgICAgICBDSEVDSyhtU2luaykgPDwgIi0tIHF1ZXVlVG9TaW5rICIKKyAgICAgICAgICAgICAgICAgICAgIDw8ICItLSBjb25uZWN0aW9uIGhhcyBubyBzaW5rLiI7CisKKyAgICAgICAgV29ya0J1bmRsZSB3b3JrQnVuZGxlOworICAgICAgICBpZiAoIW9iamNweSgmd29ya0J1bmRsZSwgKml0ZW1zLCBudWxscHRyKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVldWVUb1NpbmsgLS0gYmFkIGlucHV0LiI7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbVNpbmstPnF1ZXVlKHdvcmtCdW5kbGUpOworICAgICAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVldWVUb1NpbmsgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVldWVUb1NpbmsgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBhc1N0cmluZyhzdGF0dXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1Mb2NhbENvbXA7CisgICAgc3A8SUlucHV0U2luaz4gbVNpbms7CisgICAgc3A8SUNvbmZpZ3VyYWJsZT4gbVNpbmtDb25maWd1cmFibGU7CisgICAgc3RkOjpzdHJpbmcgbVNpbmtOYW1lOworCisgICAgLy8gTmVlZGVkIGZvciBDb21wb25lbnRXcmFwcGVyIGltcGxlbWVudGF0aW9uCisgICAgc3RkOjptdXRleCBtQWxsb2NhdG9yTXV0ZXg7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1GcmFtZUluZGV4OworCit9OworCitJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uKAorICAgICAgICBjb25zdCBzcDxHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+JiBjb21wLAorICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlKQorICAgICAgOiBtSW1wbHtuZXcgSW1wbChzb3VyY2UsIGNvbXApfSwKKyAgICAgICAgbUNvbmZpZ3VyYWJsZXtuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxJbXBsOjpDb25maWd1cmFibGVJbnRmPihtSW1wbCkpfSB7CisgICAgbUNvbmZpZ3VyYWJsZS0+aW5pdChzdG9yZS5nZXQoKSk7Cit9CisKK0lucHV0U3VyZmFjZUNvbm5lY3Rpb246OklucHV0U3VyZmFjZUNvbm5lY3Rpb24oCisgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rLAorICAgICAgICBjb25zdCBzcDxDb21wb25lbnRTdG9yZT4mIHN0b3JlKQorICAgICAgOiBtSW1wbHtuZXcgSW1wbChzb3VyY2UsIHNpbmspfSwKKyAgICAgICAgbUNvbmZpZ3VyYWJsZXtuZXcgQ2FjaGVkQ29uZmlndXJhYmxlKAorICAgICAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxJbXBsOjpDb25maWd1cmFibGVJbnRmPihtSW1wbCkpfSB7CisgICAgbUNvbmZpZ3VyYWJsZS0+aW5pdChzdG9yZS5nZXQoKSk7Cit9CisKK1JldHVybjxTdGF0dXM+IElucHV0U3VyZmFjZUNvbm5lY3Rpb246OmRpc2Nvbm5lY3QoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUltcGxNdXRleCk7CisgICAgbUltcGwgPSBudWxscHRyOworICAgIHJldHVybiBTdGF0dXM6Ok9LOworfQorCitJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjp+SW5wdXRTdXJmYWNlQ29ubmVjdGlvbigpIHsKKyAgICBtSW1wbCA9IG51bGxwdHI7Cit9CisKK2Jvb2wgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6aW5pdCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW1wbE11dGV4KTsKKyAgICByZXR1cm4gbUltcGwtPmluaXQoKTsKK30KKworUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpnZXRDb25maWd1cmFibGUoKSB7CisgICAgcmV0dXJuIG1Db25maWd1cmFibGU7Cit9CisKKy8vIENvbmZpZ3VyYWJsZSBpbnRlcmZhY2UgZm9yIElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGwKK2MyX3N0YXR1c190IElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGw6OkNvbmZpZ3VyYWJsZUludGY6OmNvbmZpZygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiAqY29uc3QgZmFpbHVyZXMpIHsKKyAgICAvLyBUT0RPOiBpbXBsZW1lbnQKKyAgICAodm9pZClwYXJhbXM7CisgICAgKHZvaWQpbWF5QmxvY2s7CisgICAgKHZvaWQpZmFpbHVyZXM7CisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbXBsOjpDb25maWd1cmFibGVJbnRmOjpxdWVyeSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IHsKKyAgICAvLyBUT0RPOiBpbXBsZW1lbnQKKyAgICAodm9pZClpbmRpY2VzOworICAgICh2b2lkKW1heUJsb2NrOworICAgICh2b2lkKXBhcmFtczsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IElucHV0U3VyZmFjZUNvbm5lY3Rpb246OkltcGw6OkNvbmZpZ3VyYWJsZUludGY6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgLy8gVE9ETzogaW1wbGVtZW50CisgICAgKHZvaWQpcGFyYW1zOworICAgIHJldHVybiBDMl9PSzsKK30KKworYzJfc3RhdHVzX3QgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbjo6SW1wbDo6Q29uZmlndXJhYmxlSW50Zjo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3QgeworICAgIC8vIFRPRE86IGltcGxlbWVudAorICAgICh2b2lkKWZpZWxkczsKKyAgICAodm9pZCltYXlCbG9jazsKKyAgICByZXR1cm4gQzJfT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9DbGllbnRCbG9ja0hlbHBlci5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NsaWVudEJsb2NrSGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyMjk4YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9DbGllbnRCbG9ja0hlbHBlci5oCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0xJRU5UX0JMT0NLX0hFTFBFUl9ICisjZGVmaW5lIENMSUVOVF9CTE9DS19IRUxQRVJfSAorCisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKworLy8gQnVmZmVyUXVldWUtQmFzZWQgQmxvY2sgT3BlcmF0aW9ucworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBNYW5hZ2UgQnVmZmVyUXVldWUgYW5kIGdyYXBoaWMgYmxvY2tzIGZvciBib3RoIGNvbXBvbmVudCBhbmQgY29kZWMuCisvLyBNYW5hZ2UgZ3JhcGhpYyBibG9ja3Mgb3duZXJzaGlwIGNvbnNpc3RlbnRseSBkdXJpbmcgc3VyZmFjZSBjaGFuZ2UuCitzdHJ1Y3QgT3V0cHV0QnVmZmVyUXVldWUgeworCisgICAgT3V0cHV0QnVmZmVyUXVldWUoKTsKKworICAgIH5PdXRwdXRCdWZmZXJRdWV1ZSgpOworCisgICAgLy8gQ29uZmlndXJlIGEgbmV3IHN1cmZhY2UgdG8gcmVuZGVyIGdyYXBoaWMgYmxvY2tzLgorICAgIC8vIEdyYXBoaWMgYmxvY2tzIGZyb20gb2xkZXIgc3VyZmFjZSB3aWxsIGJlIG1pZ3JhdGVkIHRvIG5ldyBzdXJmYWNlLgorICAgIGJvb2wgY29uZmlndXJlKGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBpZ2JwLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYnFJZCk7CisKKyAgICAvLyBSZW5kZXIgYSBncmFwaGljIGJsb2NrIHRvIGN1cnJlbnQgc3VyZmFjZS4KKyAgICBzdGF0dXNfdCBvdXRwdXRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgIGNvbnN0IEJuR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0JiBpbnB1dCwKKyAgICAgICAgICAgIEJuR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCogb3V0cHV0KTsKKworICAgIC8vIENhbGwgaG9sZEJ1ZmZlclF1ZXVlQmxvY2soKSBvbiBvdXRwdXQgYmxvY2tzIGluIHRoZSBnaXZlbiB3b3JrTGlzdC4KKyAgICAvLyBUaGUgT3V0cHV0QnVmZmVyUXVldWUgd2lsbCB0YWtlIHRoZSBvd25lcnNoaXAgb2Ygb3V0cHV0IGJsb2Nrcy4KKyAgICAvLworICAgIC8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBXb3JrQnVuZGxlIGhhcyBiZWVuIHJlY2VpdmVkCisgICAgLy8gZnJvbSBhbm90aGVyIHByb2Nlc3MuCisgICAgdm9pZCBob2xkQnVmZmVyUXVldWVCbG9ja3MoCisgICAgICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrTGlzdCk7CisKK3ByaXZhdGU6CisKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBtSW1wbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ0xJRU5UX0JMT0NLX0hFTFBFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50LmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZkY2NkMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaApAQCAtMCwwICsxLDE0NCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVF9ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL0lDbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50TGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JSW5wdXRTaW5rLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JQmluZGVyLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzIuaD4KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6SUJpbmRlcjsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7Cit1c2luZyA6OmFuZHJvaWQ6OndwOworCitzdHJ1Y3QgQ29tcG9uZW50U3RvcmU7CisKK3N0cnVjdCBDb21wb25lbnQgOiBwdWJsaWMgSUNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxDb21wb25lbnQ+IHsKKyAgICBDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+JiwKKyAgICAgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3Qgc3A8Q29tcG9uZW50U3RvcmU+JiBzdG9yZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjoKKyAgICAgICAgICAgICAgICBJQ2xpZW50TWFuYWdlcj4mIGNsaWVudFBvb2xNYW5hZ2VyKTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdDsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjE7CisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYyXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMjsKKworICAgIC8vIE1ldGhvZHMgZnJvbSBJQ29tcG9uZW50IGZvbGxvdy4KKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IHF1ZXVlKGNvbnN0IFdvcmtCdW5kbGUmIHdvcmtCdW5kbGUpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGZsdXNoKGZsdXNoX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IGRyYWluKGJvb2wgd2l0aEVvcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBzZXRPdXRwdXRTdXJmYWNlKAorICAgICAgICAgICAgdWludDY0X3QgYmxvY2tQb29sSWQsCisgICAgICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMj4mIHN1cmZhY2UpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNvbm5lY3RUb0lucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFN1cmZhY2U+JiBpbnB1dFN1cmZhY2UsCisgICAgICAgICAgICBjb25uZWN0VG9JbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNvbm5lY3RUb09teElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXIxPiYgcHJvZHVjZXIsCisgICAgICAgICAgICBjb25zdCBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgY29ubmVjdFRvT214SW5wdXRTdXJmYWNlX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IGRpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgdWludDMyX3QgYWxsb2NhdG9ySWQsCisgICAgICAgICAgICBjcmVhdGVCbG9ja1Bvb2xfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gZGVzdHJveUJsb2NrUG9vbCh1aW50NjRfdCBibG9ja1Bvb2xJZCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48U3RhdHVzPiBzdGFydCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gc3RvcCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPFN0YXR1cz4gcmVzZXQoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IHJlbGVhc2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxzcDxJQ29tcG9uZW50SW50ZXJmYWNlPj4gZ2V0SW50ZXJmYWNlKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48c3A8SUlucHV0U2luaz4+IGFzSW5wdXRTaW5rKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBSZXR1cm5zIGEgQzJDb21wb25lbnQgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gc2luayBpZiB0aGUgc2luayBpcyBpbmRlZWQKKyAgICAvLyBhIGxvY2FsIGNvbXBvbmVudC4gUmV0dXJucyBudWxscHRyIG90aGVyd2lzZS4KKyAgICAvLworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBJbnB1dFN1cmZhY2U6OmNvbm5lY3QoKS4KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiBmaW5kTG9jYWxDb21wb25lbnQoCisgICAgICAgICAgICBjb25zdCBzcDxJSW5wdXRTaW5rPiYgc2luayk7CisKK3Byb3RlY3RlZDoKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+IG1Db21wb25lbnQ7CisgICAgc3A8Q29tcG9uZW50SW50ZXJmYWNlPiBtSW50ZXJmYWNlOworICAgIHNwPElDb21wb25lbnRMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHNwPENvbXBvbmVudFN0b3JlPiBtU3RvcmU7CisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjp1dGlsczo6RGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIKKyAgICAgICAgICAgIG1CdWZmZXJQb29sU2VuZGVyOworCisgICAgc3RydWN0IFNpbms7CisgICAgc3RkOjptdXRleCBtU2lua011dGV4OworICAgIHNwPFNpbms+IG1TaW5rOworCisgICAgc3RkOjptdXRleCBtQmxvY2tQb29sc011dGV4OworICAgIC8vIFRoaXMgbWFwIGtlZXBzIEMyQmxvY2tQb29sIG9iamVjdHMgdGhhdCBhcmUgY3JlYXRlZCBieSBjcmVhdGVCbG9ja1Bvb2woKQorICAgIC8vIGFsaXZlLiBUaGVzZSBDMkJsb2NrUG9vbCBvYmplY3RzIGNhbiBiZSBkZWxldGVkIGJ5IGNhbGxpbmcKKyAgICAvLyBkZXN0cm95QmxvY2tQb29sKCksIHJlc2V0KCkgb3IgcmVsZWFzZSgpLCBvciBieSBkZXN0cm95aW5nIHRoZSBjb21wb25lbnQuCisgICAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4+IG1CbG9ja1Bvb2xzOworCisgICAgdm9pZCBpbml0TGlzdGVuZXIoY29uc3Qgc3A8Q29tcG9uZW50PiYgc2VsZik7CisKKyAgICB2aXJ0dWFsIH5Db21wb25lbnQoKSBvdmVycmlkZTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29tcG9uZW50U3RvcmU7CisKKyAgICBzdHJ1Y3QgTGlzdGVuZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRJbnRlcmZhY2UuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWQyMzVlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudEludGVyZmFjZS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRfSU5URVJGQUNFX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRfSU5URVJGQUNFX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnRJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOworCitzdHJ1Y3QgQ29tcG9uZW50U3RvcmU7CisKK3N0cnVjdCBDb21wb25lbnRJbnRlcmZhY2UgOiBwdWJsaWMgSUNvbXBvbmVudEludGVyZmFjZSB7CisgICAgQ29tcG9uZW50SW50ZXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiYgaW50ZXJmYWNlLAorICAgICAgICAgICAgQ29tcG9uZW50U3RvcmUqIHN0b3JlKTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMoKSBjb25zdDsKKyAgICB2aXJ0dWFsIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gZ2V0Q29uZmlndXJhYmxlKCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+IG1JbnRlcmZhY2U7CisgICAgc3A8Q2FjaGVkQ29uZmlndXJhYmxlPiBtQ29uZmlndXJhYmxlOworICAgIGMyX3N0YXR1c190IG1Jbml0OworfTsKKworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UX0lOVEVSRkFDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlODBjNjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaApAQCAtMCwwICsxLDE1MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTVBPTkVOVFNUT1JFX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT01QT05FTlRTVE9SRV9ICisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudEludGVyZmFjZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db25maWd1cmFibGUuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzIuaD4KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpJQ2xpZW50TWFuYWdlcjsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDb21wb25lbnRTdG9yZSA6IHB1YmxpYyBJQ29tcG9uZW50U3RvcmUgeworICAgIENvbXBvbmVudFN0b3JlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiYgc3RvcmUpOworICAgIHZpcnR1YWwgfkNvbXBvbmVudFN0b3JlKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgc3RhdHVzIG9mIHRoZSBjb25zdHJ1Y3Rpb24gb2YgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBieSBDYWNoZWRDb25maWd1cmFibGU6OmluaXQoKSB0byB2YWxpZGF0ZQorICAgICAqIHN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICAgICAqLworICAgIGMyX3N0YXR1c190IHZhbGlkYXRlU3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4mIHBhcmFtcyk7CisKKyAgICAvLyBNZXRob2RzIGZyb20gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50U3RvcmUuCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY3JlYXRlQ29tcG9uZW50KAorICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCisgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcG9vbCwKKyAgICAgICAgICAgIGNyZWF0ZUNvbXBvbmVudF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5hbWUsCisgICAgICAgICAgICBjcmVhdGVJbnRlcmZhY2VfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGxpc3RDb21wb25lbnRzKGxpc3RDb21wb25lbnRzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjcmVhdGVJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBjcmVhdGVJbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGdldFN0cnVjdERlc2NyaXB0b3JzKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDMyX3Q+JiBpbmRpY2VzLAorICAgICAgICAgICAgZ2V0U3RydWN0RGVzY3JpcHRvcnNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgUmV0dXJuPHNwPElDbGllbnRNYW5hZ2VyPj4gZ2V0UG9vbENsaWVudE1hbmFnZXIoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IGNvcHlCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBCdWZmZXImIHNyYywKKyAgICAgICAgICAgIGNvbnN0IEJ1ZmZlciYgZHN0KSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gZ2V0Q29uZmlndXJhYmxlKCkgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBEdW1wcyBpbmZvcm1hdGlvbiB3aGVuIGxzaGFsIGlzIGNhbGxlZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBkZWJ1ZygKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfaGFuZGxlJiBoYW5kbGUsCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4mIGFyZ3MpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgc3A8Q2FjaGVkQ29uZmlndXJhYmxlPiBtQ29uZmlndXJhYmxlOworCisgICAgLy8gRG9lcyBib29ra2VlcGluZyBmb3IgYW4gaW50ZXJmYWNlIHRoYXQgaGFzIGJlZW4gbG9hZGVkLgorICAgIHZvaWQgb25JbnRlcmZhY2VMb2FkZWQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAmaW50Zik7CisKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gbVN0b3JlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBtUGFyYW1SZWZsZWN0b3I7CisKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpDb3JlSW5kZXgsIHN0ZDo6c2hhcmVkX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+PiBtU3RydWN0RGVzY3JpcHRvcnM7CisgICAgc3RkOjpzZXQ8QzJQYXJhbTo6Q29yZUluZGV4PiBtVW5zdXBwb3J0ZWRTdHJ1Y3REZXNjcmlwdG9yczsKKyAgICBzdGQ6OnNldDxDMlN0cmluZz4gbUxvYWRlZEludGVyZmFjZXM7CisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1TdHJ1Y3REZXNjcmlwdG9yc011dGV4OworCisgICAgLy8gQ29tcG9uZW50U3RvcmUga2VlcHMgdHJhY2sgb2YgbGl2ZSBDb21wb25lbnRzLgorCisgICAgc3RydWN0IENvbXBvbmVudFN0YXR1cyB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gYzJDb21wb25lbnQ7CisgICAgICAgIHN0ZDo6Y2hyb25vOjpzeXN0ZW1fY2xvY2s6OnRpbWVfcG9pbnQgYmlydGhUaW1lOworICAgIH07CisKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUNvbXBvbmVudFJvc3Rlck11dGV4OworICAgIHN0ZDo6bWFwPENvbXBvbmVudCosIENvbXBvbmVudFN0YXR1cz4gbUNvbXBvbmVudFJvc3RlcjsKKworICAgIC8vIENhbGxlZCB3aGVuZXZlciBDb21wb25lbnQgaXMgY3JlYXRlZC4KKyAgICB2b2lkIHJlcG9ydENvbXBvbmVudEJpcnRoKENvbXBvbmVudCogY29tcG9uZW50KTsKKyAgICAvLyBDYWxsZWQgb25seSBmcm9tIHRoZSBkZXN0cnVjdG9yIG9mIENvbXBvbmVudC4KKyAgICB2b2lkIHJlcG9ydENvbXBvbmVudERlYXRoKENvbXBvbmVudCogY29tcG9uZW50KTsKKworICAgIGZyaWVuZCBDb21wb25lbnQ7CisKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBkdW1waW5nLgorCisgICAgc3RkOjpvc3RyZWFtJiBkdW1wKAorICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4mIGNvbXApOworCisgICAgc3RkOjpvc3RyZWFtJiBkdW1wKAorICAgICAgICAgICAgc3RkOjpvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICBDb21wb25lbnRTdGF0dXMmIGNvbXBTdGF0dXMpOworCit9OworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09NUE9ORU5UU1RPUkVfSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0NvbmZpZ3VyYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwOTUxODUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlLmgKQEAgLTAsMCArMSwxMzggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMF9VVElMU19DT05GSUdVUkFCTEVfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX0NPTkZJR1VSQUJMRV9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29uZmlndXJhYmxlLmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBDb21wb25lbnRTdG9yZTsKKworLyoqCisgKiBDb2RlYzIgb2JqZWN0cyBvZiBkaWZmZXJlbnQgdHlwZXMgbWF5IGhhdmUgZGlmZmVyZW50IHF1ZXJ5aW5nIGFuZCBjb25maWd1cmluZworICogZnVuY3Rpb25zLCBidXQgYWNyb3NzIHRoZSBUcmVibGUgYm91bmRhcnksIHRoZXkgc2hhcmUgdGhlIHNhbWUgSElETAorICogaW50ZXJmYWNlLCBJQ29uZmlndXJhYmxlLgorICoKKyAqIENvbmZpZ3VyYWJsZUMySW50ZiBpcyBhbiBhYnN0cmFjdCBjbGFzcyB0aGF0IGEgQ29kZWMyIG9iamVjdCBjYW4gaW1wbGVtZW50IHRvCisgKiBlYXNpbHkgZXhwb3NlIGFuIElDb25maWd1cmFibGUgaW5zdGFuY2UuIFNlZSBDYWNoZWRDb25maWd1cmFibGUgYmVsb3cuCisgKi8KK3N0cnVjdCBDb25maWd1cmFibGVDMkludGYgeworICAgIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorICAgIHVpbnQzMl90IGdldElkKCkgY29uc3QgeyByZXR1cm4gbUlkOyB9CisgICAgLyoqIEMyQ29tcG9uZW50SW50ZXJmYWNlOjpxdWVyeV92YiBzYW5zIHN0YWNrIHBhcmFtcyAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgcGFyYW1zKSBjb25zdCA9IDA7CisgICAgLyoqIEMyQ29tcG9uZW50SW50ZXJmYWNlOjpjb25maWdfdmIgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvbmZpZygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpID0gMDsKKyAgICAvKiogQzJDb21wb25lbnRJbnRlcmZhY2U6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+KiBjb25zdCBwYXJhbXMpIGNvbnN0ID0gMDsKKyAgICAvKiogQzJDb21wb25lbnRJbnRlcmZhY2U6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iICovCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGZpZWxkcywgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB+Q29uZmlndXJhYmxlQzJJbnRmKCkgPSBkZWZhdWx0OworCisgICAgQ29uZmlndXJhYmxlQzJJbnRmKGNvbnN0IEMyU3RyaW5nJiBuYW1lLCB1aW50MzJfdCBpZCkKKyAgICAgICAgICA6IG1OYW1le25hbWV9LCBtSWR7aWR9IHt9CisKK3Byb3RlY3RlZDoKKyAgICBDMlN0cmluZyBtTmFtZTsgLyogY2FjaGVkIGNvbXBvbmVudCBuYW1lICovCisgICAgdWludDMyX3QgbUlkOworfTsKKworLyoqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgSUNvbmZpZ3VyYWJsZSBpbnRlcmZhY2UgdGhhdCBzdXBwb3J0cyBjYWNoaW5nIG9mCisgKiBzdXBwb3J0ZWQgcGFyYW1ldGVycyBmcm9tIGEgc3VwcGxpZWQgQ29tcG9uZW50U3RvcmUuCisgKgorICogQ2FjaGVkQ29uZmlndXJhYmxlIGVzc2VudGlhbGx5IGNvbnZlcnRzIGEgQ29uZmlndXJhYmxlQzJJbnRmIGludG8gSElETCdzCisgKiBJQ29uZmlndXJhYmxlLiBBIENvZGVjMiBvYmplY3QgZ2VuZXJhbGx5IGltcGxlbWVudHMgQ29uZmlndXJhYmxlQzJJbnRmIGFuZAorICogcGFzc2VzIHRoZSBpbXBsZW1lbnRhdGlvbiB0byB0aGUgY29uc3RydWN0b3Igb2YgQ2FjaGVkQ29uZmlndXJhYmxlLgorICoKKyAqIE5vdGUgdGhhdCBjYWNoaW5nIGhhcHBlbnMKKyAqLworc3RydWN0IENhY2hlZENvbmZpZ3VyYWJsZSA6IHB1YmxpYyBJQ29uZmlndXJhYmxlIHsKKyAgICBDYWNoZWRDb25maWd1cmFibGUoc3RkOjp1bmlxdWVfcHRyPENvbmZpZ3VyYWJsZUMySW50Zj4mJiBpbnRmKTsKKworICAgIGMyX3N0YXR1c190IGluaXQoQ29tcG9uZW50U3RvcmUqIHN0b3JlKTsKKworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb25maWd1cmFibGUKKworICAgIHZpcnR1YWwgUmV0dXJuPHVpbnQzMl90PiBnZXRJZCgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gZ2V0TmFtZShnZXROYW1lX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IHF1ZXJ5KAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDMyX3Q+JiBpbmRpY2VzLAorICAgICAgICAgICAgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgIHF1ZXJ5X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNvbmZpZygKKyAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBpblBhcmFtcywKKyAgICAgICAgICAgIGJvb2wgbWF5QmxvY2ssCisgICAgICAgICAgICBjb25maWdfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICB1aW50MzJfdCBzdGFydCwKKyAgICAgICAgICAgIHVpbnQzMl90IGNvdW50LAorICAgICAgICAgICAgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgaW5GaWVsZHMsCisgICAgICAgICAgICBib29sIG1heUJsb2NrLAorICAgICAgICAgICAgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgLy8gQ29tbW9uIENvZGVjMi4wIGludGVyZmFjZSB3cmFwcGVyCisgICAgc3RkOjp1bmlxdWVfcHRyPENvbmZpZ3VyYWJsZUMySW50Zj4gbUludGY7CisKKyAgICAvLyBDYWNoZWQgc3VwcG9ydGVkIHBhcmFtcworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IG1TdXBwb3J0ZWRQYXJhbXM7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9ISURMX1YxXzBfVVRJTFNfQ09ORklHVVJBQkxFX0gKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0QnVmZmVyTWFuYWdlci5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL0lucHV0QnVmZmVyTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ODU3ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRCdWZmZXJNYW5hZ2VyLmgKQEAgLTAsMCArMSwyOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVF9CVUZGRVJfTUFOQUdFUl9ICisjZGVmaW5lIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRfQlVGRkVSX01BTkFHRVJfSAorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudExpc3RlbmVyLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyV29yay5oPgorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ7CisKKy8qKgorICogSW5wdXRCdWZmZXJNYW5hZ2VyCisgKiA9PT09PT09PT09PT09PT09PT0KKyAqCisgKiBJbnB1dEJ1ZmZlck1hbmFnZXIgcHJlc2VudHMgYSB3YXkgdG8gdHJhY2sgYW5kIHVudHJhY2sgaW5wdXQgYnVmZmVycyBpbiB0aGlzCisgKiAoY29kZWMpIHByb2Nlc3MgYW5kIHNlbmQgYSBub3RpZmljYXRpb24gdG8gYSBsaXN0ZW5lciwgcG9zc2libHkgaW4gYQorICogZGlmZmVyZW50IHByb2Nlc3MsIHdoZW4gYSB0cmFja2VkIGJ1ZmZlciBubyBsb25nZXIgaGFzIGFueSByZWZlcmVuY2VzIGluIHRoaXMKKyAqIHByb2Nlc3MuCisgKgorICogSW5wdXRCdWZmZXJNYW5hZ2VyIGhvbGRzIGEgY29sbGVjdGlvbiBvZiByZWNvcmRzIHJlcHJlc2VudGluZyB0cmFja2VkIGJ1ZmZlcnMKKyAqIGFuZCB0aGVpciBjYWxsYmFjayBsaXN0ZW5lcnMuIENvbmNlcHR1YWxseSwgb25lIHJlY29yZCBpcyBhIHRyaXBsZSAobGlzdGVuZXIsCisgKiBmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgd2hlcmUKKyAqCisgKiAtIChmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgaXMgYSBwYWlyIG9mIGluZGljZXMgdXNlZCB0byBpZGVudGlmeSB0aGUgYnVmZmVyLgorICogLSBsaXN0ZW5lciBpcyBvZiB0eXBlIElDb21wb25lbnRMaXN0ZW5lci4gSXRzIG9uSW5wdXRCdWZmZXJzUmVsZWFzZWQoKQorICogICBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgYXNzb2NpYXRlZCBidWZmZXIgZGllcy4gVGhlIGFyZ3VtZW50IG9mCisgKiAgIG9uSW5wdXRCdWZmZXJzUmVsZWFzZWQoKSBpcyBhIGxpc3Qgb2YgSW5wdXRCdWZmZXIgb2JqZWN0cywgZWFjaCBvZiB3aGljaAorICogICBoYXMgdGhlIGZvbGxvd2luZyBtZW1iZXJzOgorICoKKyAqICAgICB1aW50NjRfdCBmcmFtZUluZGV4CisgKiAgICAgdWludDMyX3QgYXJyYXlJbmRleAorICoKKyAqIFdoZW4gYSB0cmFja2VkIGJ1ZmZlciBhc3NvY2lhdGVkIHRvIHRoZSB0cmlwbGUgKGxpc3RlbmVyLCBmcmFtZUluZGV4LAorICogYnVmZmVySW5kZXgpIGdvZXMgb3V0IG9mIHNjb3BlLCBsaXN0ZW5lci0+b25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCgpIHdpbGwgYmUKKyAqIGNhbGxlZCB3aXRoIGFuIElucHV0QnVmZmVyIG9iamVjdCB3aG9zZSBtZW1iZXJzIGFyZSBzZXQgYXMgZm9sbG93czoKKyAqCisgKiAgICAgaW5wdXRCdWZmZXIuZnJhbWVJbmRleCA9IGZyYW1lSW5kZXgKKyAqICAgICBpbnB1dEJ1ZmZlci5hcnJheUluZGV4ID0gYnVmZmVySW5kZXgKKyAqCisgKiBJUEMgT3B0aW1pemF0aW9uCisgKiAtLS0tLS0tLS0tLS0tLS0tCisgKgorICogU2luY2Ugb25JbnB1dEJ1ZmZlcnNSZWxlYXNlZCgpIGlzIGFuIElQQyBjYWxsLCBJbnB1dEJ1ZmZlck1hbmFnZXIgdHJpZXMgbm90CisgKiB0byBjYWxsIGl0IHRvbyBvZnRlbi4gQW55IHR3byBjYWxscyB0byB0aGUgc2FtZSBsaXN0ZW5lciBhcmUgYXQgbGVhc3QKKyAqIG1Ob3RpZmljYXRpb25JbnRlcnZhbE5zIG5hbm9zZWNvbmRzIGFwYXJ0LCB3aGVyZSBtTm90aWZpY2F0aW9uSW50ZXJ2YWxOcyBpcworICogY29uZmlndXJhYmxlIHZpYSBjYWxsaW5nIHNldE5vdGlmaWNhdGlvbkludGVydmFsKCkuIFRoZSBkZWZhdWx0IHZhbHVlIG9mCisgKiBtTm90aWZpY2F0aW9uSW50ZXJ2YWxOcyBpcyBrRGVmYXVsdE5vdGlmaWNhdGlvbkludGVybmFsTnMuCisgKgorICogUHVibGljIE1lbWJlciBGdW5jdGlvbnMKKyAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKgorICogSW5wdXRCdWZmZXJNYW5hZ2VyIGlzIGEgc2luZ2xldG9uIGNsYXNzLiBJdHMgb25seSBpbnN0YW5jZSBpcyBhY2Nlc3NpYmxlIHZpYQorICogdGhlIGZvbGxvd2luZyBwdWJsaWMgZnVuY3Rpb25zOgorICoKKyAqIC0gcmVnaXN0ZXJGcmFtZURhdGEoY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgKiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCkKKyAqCisgKiAtIHVucmVnaXN0ZXJGcmFtZURhdGEoY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgKiAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KQorICoKKyAqIC0gdW5yZWdpc3RlckZyYW1lRGF0YShjb25zdCBzcDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lcikKKyAqCisgKiAtIHNldE5vdGlmaWNhdGlvbkludGVydmFsKG5zZWNzX3Qgbm90aWZpY2F0aW9uSW50ZXJ2YWxOcykKKyAqCisgKi8KKworc3RydWN0IElucHV0QnVmZmVyTWFuYWdlciB7CisKKyAgICAvKioKKyAgICAgKiBUaGUgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIHRpbWUgaW50ZXJ2YWwgYmV0d2VlbiAyIHN1YnNlcXVlbnQgSVBDcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgY29uc3RleHByIG5zZWNzX3Qga0RlZmF1bHROb3RpZmljYXRpb25JbnRlcnZhbE5zID0gMTAwMDAwMDsgLyogMW1zICovCisKKyAgICAvKioKKyAgICAgKiBUcmFjayBhbGwgYnVmZmVycyBpbiBhIEMyRnJhbWVEYXRhIG9iamVjdC4KKyAgICAgKgorICAgICAqIGlucHV0IChDMkZyYW1lRGF0YSkgaGFzIHRoZSBmb2xsb3dpbmcgdHdvIG1lbWJlcnMgdGhhdCBhcmUgb2YgaW50ZXJlc3Q6CisgICAgICoKKyAgICAgKiAgIEMyV29ya09yZGluYWwgICAgICAgICAgICAgICAgb3JkaW5hbAorICAgICAqICAgdmVjdG9yPHNoYXJlZF9wdHI8QzJCdWZmZXI+PiBidWZmZXJzCisgICAgICoKKyAgICAgKiBDYWxsaW5nIHJlZ2lzdGVyRnJhbWVEYXRhKGxpc3RlbmVyLCBpbnB1dCkgd2lsbCByZWdpc3RlciBtdWx0aXBsZQorICAgICAqIHRyaXBsZXMgKGxpc3RlbmVyLCBmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgd2hlcmUgZnJhbWVJbmRleCBpcyBlcXVhbCB0bworICAgICAqIGlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCBhbmQgYnVmZmVySW5kZXggcnVucyB0aHJvdWdoIHRoZSBpbmRpY2VzIG9mCisgICAgICogaW5wdXQuYnVmZmVycyBzdWNoIHRoYXQgaW5wdXQuYnVmZmVyc1tidWZmZXJJbmRleF0gaXMgbm90IG51bGwuCisgICAgICoKKyAgICAgKiBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZnJvbSBxdWV1ZSgpLgorICAgICAqCisgICAgICogXHBhcmFtIGxpc3RlbmVyIExpc3RlbmVyIG9mIGRlYXRoIG5vdGlmaWNhdGlvbnMuCisgICAgICogXHBhcmFtIGlucHV0IElucHV0IGZyYW1lIGRhdGEgd2hvc2UgaW5wdXQgYnVmZmVycyBhcmUgdG8gYmUgdHJhY2tlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCByZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgY29uc3QgQzJGcmFtZURhdGEmIGlucHV0KTsKKworICAgIC8qKgorICAgICAqIFVudHJhY2sgYWxsIGJ1ZmZlcnMgaW4gYSBDMkZyYW1lRGF0YSBvYmplY3QuCisgICAgICoKKyAgICAgKiBDYWxsaW5nIHVucmVnaXN0ZXJGcmFtZURhdGEobGlzdGVuZXIsIGlucHV0KSB3aWxsIHVucmVnaXN0ZXIgYW5kIHJlbW92ZQorICAgICAqIHBlbmRpbmcgbm90aWZpY2F0aW9ucyBmb3IgYWxsIHRyaXBsZXMgKGwsIGZpLCBidWZmZXJJbmRleCkgc3VjaCB0aGF0CisgICAgICogbCA9IGxpc3RlbmVyIGFuZCBmaSA9IGlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC4KKyAgICAgKgorICAgICAqIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBmcm9tIG9uV29ya0RvbmUoKSBhbmQgZmx1c2goKS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaXN0ZW5lciBQcmV2aW91c2x5IHJlZ2lzdGVyZWQgbGlzdGVuZXIuCisgICAgICogXHBhcmFtIGlucHV0IFByZXZpb3VzbHkgcmVnaXN0ZXJlZCBmcmFtZSBkYXRhLgorICAgICAqLworICAgIHN0YXRpYyB2b2lkIHVucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCk7CisKKyAgICAvKioKKyAgICAgKiBVbnRyYWNrIGFsbCBidWZmZXJzIGFzc29jaWF0ZWQgdG8gYSBnaXZlbiBsaXN0ZW5lci4KKyAgICAgKgorICAgICAqIENhbGxpbmcgdW5yZWdpc3RlckZyYW1lRGF0YShsaXN0ZW5lcikgd2lsbCB1bnJlZ2lzdGVyIGFuZCByZW1vdmUKKyAgICAgKiBwZW5kaW5nIG5vdGlmaWNhdGlvbnMgZm9yIGFsbCB0cmlwbGVzIChsLCBmcmFtZUluZGV4LCBidWZmZXJJbmRleCkgc3VjaAorICAgICAqIHRoYXQgbCA9IGxpc3RlbmVyLgorICAgICAqCisgICAgICogVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBjbGVhbnMgdXAgYWxsIGlucHV0IGJ1ZmZlcnMsCisgICAgICogaS5lLiwgd2hlbiByZXNldCgpLCByZWxlYXNlKCksIHN0b3AoKSBvciB+Q29tcG9uZW50KCkgaXMgY2FsbGVkLgorICAgICAqCisgICAgICogXHBhcmFtIGxpc3RlbmVyIFByZXZpb3VzbHkgcmVnaXN0ZXJlZCBsaXN0ZW5lci4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCB1bnJlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgd3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIpOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBub3RpZmljYXRpb24gaW50ZXJ2YWwuCisgICAgICoKKyAgICAgKiBccGFyYW0gbm90aWZpY2F0aW9uSW50ZXJ2YWxOcyBOZXcgbm90aWZpY2F0aW9uIGludGVydmFsLCBpbiBuYW5vc2Vjb25kcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBzZXROb3RpZmljYXRpb25JbnRlcnZhbChuc2Vjc190IG5vdGlmaWNhdGlvbkludGVydmFsTnMpOworCitwcml2YXRlOgorICAgIHZvaWQgX3JlZ2lzdGVyRnJhbWVEYXRhKAorICAgICAgICAgICAgY29uc3Qgc3A8SUNvbXBvbmVudExpc3RlbmVyPiYgbGlzdGVuZXIsCisgICAgICAgICAgICBjb25zdCBDMkZyYW1lRGF0YSYgaW5wdXQpOworICAgIHZvaWQgX3VucmVnaXN0ZXJGcmFtZURhdGEoCisgICAgICAgICAgICBjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGNvbnN0IEMyRnJhbWVEYXRhJiBpbnB1dCk7CisgICAgdm9pZCBfdW5yZWdpc3RlckZyYW1lRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHdwPElDb21wb25lbnRMaXN0ZW5lcj4mIGxpc3RlbmVyKTsKKyAgICB2b2lkIF9zZXROb3RpZmljYXRpb25JbnRlcnZhbChuc2Vjc190IG5vdGlmaWNhdGlvbkludGVydmFsTnMpOworCisgICAgLy8gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRpZWQgdG8gQzJCdWZmZXIgb2JqZWN0cy4KKyAgICAvLworICAgIC8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHNJbnN0YW5jZSBpcyB0aGUgb25seSBpbnN0YW5jZSBvZiB0aGlzCisgICAgLy8gICAgICAgY2xhc3MuCisgICAgc3RhdGljIHZvaWQgb25CdWZmZXJEZXN0cm95ZWQoY29uc3QgQzJCdWZmZXIqIGJ1Ziwgdm9pZCogYXJnKTsKKyAgICB2b2lkIF9vbkJ1ZmZlckRlc3Ryb3llZChjb25zdCBDMkJ1ZmZlciogYnVmLCB2b2lkKiBhcmcpOworCisgICAgLy8gUGVyc2lzdGVudCBkYXRhIHRvIGJlIHBhc3NlZCBhcyAiYXJnIiBpbiBvbkJ1ZmZlckRlc3Ryb3llZCgpLgorICAgIC8vIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHRyaXBsZSAobGlzdGVuZXIsIGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSBwbHVzIGEKKyAgICAvLyB3ZWFrIHBvaW50ZXIgdG8gdGhlIEMyQnVmZmVyIG9iamVjdC4KKyAgICAvLworICAgIC8vIE5vdGUgdGhhdCB0aGUgImtleSIgaXMgYnVmZmVySW5kZXggYWNjb3JkaW5nIHRvIG9wZXJhdG9yPCgpLiBUaGlzIGlzCisgICAgLy8gZGVzaWduZWQgdG8gd29yayB3aXRoIFRyYWNrZWRCdWZmZXJzTWFwIGRlZmluZWQgYmVsb3cuCisgICAgc3RydWN0IFRyYWNrZWRCdWZmZXIgeworICAgICAgICB3cDxJQ29tcG9uZW50TGlzdGVuZXI+IGxpc3RlbmVyOworICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4OworICAgICAgICBzaXplX3QgYnVmZmVySW5kZXg7CisgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgVHJhY2tlZEJ1ZmZlcihjb25zdCB3cDxJQ29tcG9uZW50TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBidWZmZXIpCisgICAgICAgICAgICAgIDogbGlzdGVuZXIobGlzdGVuZXIpLAorICAgICAgICAgICAgICAgIGZyYW1lSW5kZXgoZnJhbWVJbmRleCksCisgICAgICAgICAgICAgICAgYnVmZmVySW5kZXgoYnVmZmVySW5kZXgpLAorICAgICAgICAgICAgICAgIGJ1ZmZlcihidWZmZXIpIHt9CisgICAgICAgIFRyYWNrZWRCdWZmZXIoY29uc3QgVHJhY2tlZEJ1ZmZlciYpID0gZGVmYXVsdDsKKyAgICAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgVHJhY2tlZEJ1ZmZlciYgb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBidWZmZXJJbmRleCA8IG90aGVyLmJ1ZmZlckluZGV4OworICAgICAgICB9CisgICAgfTsKKworICAgIC8vIE1hcDogbGlzdGVuZXIgLT4gZnJhbWVJbmRleCAtPiBzZXQ8VHJhY2tlZEJ1ZmZlcj4uCisgICAgLy8gRXNzZW50aWFsbHksIHRoaXMgaXMgdXNlZCB0byBzdG9yZSB0cmlwbGVzIChsaXN0ZW5lciwgZnJhbWVJbmRleCwKKyAgICAvLyBidWZmZXJJbmRleCkgdGhhdCdzIHNlYXJjaGFibGUgYnkgbGlzdGVuZXIgYW5kIChsaXN0ZW5lciwgZnJhbWVJbmRleCkuCisgICAgLy8gSG93ZXZlciwgdGhlIHZhbHVlIG9mIHRoZSBpbm5lcm1vc3QgbWFwIGlzIFRyYWNrZWRCdWZmZXIsIHdoaWNoIGFsc28KKyAgICAvLyBjb250YWlucyBhbiBleHRyYSBjb3B5IG9mIGxpc3RlbmVyIGFuZCBmcmFtZUluZGV4LiBUaGlzIGlzIG5lZWRlZAorICAgIC8vIGJlY2F1c2Ugb25CdWZmZXJEZXN0cm95ZWQoKSBuZWVkcyB0byBrbm93IGxpc3RlbmVyIGFuZCBmcmFtZUluZGV4IHRvby4KKyAgICB0eXBlZGVmIHN0ZDo6bWFwPHdwPElDb21wb25lbnRMaXN0ZW5lcj4sCisgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDx1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PFRyYWNrZWRCdWZmZXI+Pj4gVHJhY2tlZEJ1ZmZlcnNNYXA7CisKKyAgICAvLyBTdG9yYWdlIGZvciBwZW5kaW5nICh1bnNlbnQpIGRlYXRoIG5vdGlmaWNhdGlvbnMgZm9yIG9uZSBsaXN0ZW5lci4KKyAgICAvLyBFYWNoIHBhaXIgaW4gbWVtYmVyIG5hbWVkICJpbmRpY2VzIiBhcmUgKGZyYW1lSW5kZXgsIGJ1ZmZlckluZGV4KSBmcm9tCisgICAgLy8gdGhlIChsaXN0ZW5lciwgZnJhbWVJbmRleCwgYnVmZmVySW5kZXgpIHRyaXBsZS4KKyAgICBzdHJ1Y3QgRGVhdGhOb3RpZmljYXRpb25zIHsKKworICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIHBlbmRpbmcgbm90aWZpY2F0aW9ucyBmb3IgdGhpcyBsaXN0ZW5lci4KKyAgICAgICAgLy8gY291bnQgbWF5IGJlIDAsIGluIHdoaWNoIGNhc2UgdGhlIERlYXRoTm90aWZpY2F0aW9ucyBvYmplY3Qgd2lsbAorICAgICAgICAvLyByZW1haW4gdmFsaWQgZm9yIG9ubHkgYSBzbWFsbCBwZXJpb2QgKHNwZWNpZmllZAorICAgICAgICAvLyBuYW5vc2Vjb25kcykuCisgICAgICAgIHNpemVfdCBjb3VudDsKKworICAgICAgICAvLyBUaGUgdGltZXN0YW1wIG9mIHRoZSBtb3N0IHJlY2VudCBjYWxsYmFjayBvbiB0aGlzIGxpc3RlbmVyLiBUaGlzIGlzCisgICAgICAgIC8vIHVzZWQgdG8gZ3VhcmFudGVlIHRoYXQgY2FsbGJhY2tzIGRvIG5vdCBvY2N1ciB0b28gZnJlcXVlbnRseSwgYW5kCisgICAgICAgIC8vIGFsc28gdG8gdHJpZ2dlciBleHBpcmF0aW9uIG9mIGEgRGVhdGhOb3RpZmljYXRpb25zIG9iamVjdCB0aGF0IGhhcworICAgICAgICAvLyBjb3VudCA9IDAuCisgICAgICAgIG5zZWNzX3QgbGFzdFNlbnROczsKKworICAgICAgICAvLyBNYXA6IGZyYW1lSW5kZXggLT4gdmVjdG9yIG9mIGJ1ZmZlckluZGljZXMKKyAgICAgICAgLy8gVGhpcyBpcyBlc3NlbnRpYWxseSBhIGNvbGxlY3Rpb24gb2YgKGZyYW1kZUluZGV4LCBidWZmZXJJbmRleCkuCisgICAgICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnZlY3RvcjxzaXplX3Q+PiBpbmRpY2VzOworCisgICAgICAgIERlYXRoTm90aWZpY2F0aW9ucygKKyAgICAgICAgICAgICAgICBuc2Vjc190IG5vdGlmaWNhdGlvbkludGVydmFsTnMgPSBrRGVmYXVsdE5vdGlmaWNhdGlvbkludGVydmFsTnMpCisgICAgICAgICAgICAgIDogY291bnQoMCksCisgICAgICAgICAgICAgICAgbGFzdFNlbnROcyhzeXN0ZW1UaW1lKCkgLSBub3RpZmljYXRpb25JbnRlcnZhbE5zKSwKKyAgICAgICAgICAgICAgICBpbmRpY2VzKCkge30KKyAgICB9OworCisgICAgLy8gVGhlIG1pbmltdW0gdGltZSBwZXJpb2QgYmV0d2VlbiBJUEMgY2FsbHMgdG8gbm90aWZ5IHRoZSBjbGllbnQgYWJvdXQgdGhlCisgICAgLy8gZGVzdHJ1Y3Rpb24gb2YgaW5wdXQgYnVmZmVycy4KKyAgICBzdGQ6OmF0b21pYzxuc2Vjc190PiBtTm90aWZpY2F0aW9uSW50ZXJ2YWxOc3trRGVmYXVsdE5vdGlmaWNhdGlvbkludGVydmFsTnN9OworCisgICAgLy8gTXV0ZXggZm9yIHRoZSBtYW5hZ2VtZW50IG9mIGFsbCBpbnB1dCBidWZmZXJzLgorICAgIHN0ZDo6bXV0ZXggbU11dGV4OworCisgICAgLy8gVHJhY2tlZCBpbnB1dCBidWZmZXJzLgorICAgIFRyYWNrZWRCdWZmZXJzTWFwIG1UcmFja2VkQnVmZmVyc01hcDsKKworICAgIC8vIERlYXRoIG5vdGlmaWNhdGlvbnMgdG8gYmUgc2VudC4KKyAgICAvLworICAgIC8vIEEgRGVhdGhOb3RpZmljYXRpb25zIG9iamVjdCBpcyBhc3NvY2lhdGVkIHRvIGVhY2ggbGlzdGVuZXIuIEFuIGVudHJ5IGluCisgICAgLy8gdGhpcyBtYXAgd2lsbCBiZSByZW1vdmVkIGlmIGl0cyBhc3NvY2lhdGVkIERlYXRoTm90aWZpY2F0aW9ucyBoYXMgY291bnQgPQorICAgIC8vIDAgYW5kIGxhc3RTZW50TnMgPCBzeXN0ZW1UaW1lKCkgLSBtTm90aWZpY2F0aW9uSW50ZXJ2YWxOcy4KKyAgICBzdGQ6Om1hcDx3cDxJQ29tcG9uZW50TGlzdGVuZXI+LCBEZWF0aE5vdGlmaWNhdGlvbnM+IG1EZWF0aE5vdGlmaWNhdGlvbnM7CisKKyAgICAvLyBDb25kaXRpb24gdmFyaWFibGUgc2lnbmFsZWQgd2hlbiBhbiBlbnRyeSBpcyBhZGRlZCB0byBtRGVhdGhOb3RpZmljYXRpb25zLgorICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1PbkJ1ZmZlckRlc3Ryb3llZDsKKworICAgIC8vIE5vdGlmeSB0aGUgY2xpZW50cyBhYm91dCBidWZmZXIgZGVzdHJ1Y3Rpb25zLgorICAgIC8vIFJldHVybiBmYWxzZSBpZiBhbGwgZGVzdHJ1Y3Rpb25zIGhhdmUgYmVlbiBub3RpZmllZC4KKyAgICAvLyBSZXR1cm4gdHJ1ZSBhbmQgc2V0IHRpbWVUb1JldHJ5IHRvIHRoZSBkdXJhdGlvbiB0byB3YWl0IGZvciBiZWZvcmUKKyAgICAvLyByZXRyeWluZyBpZiBzb21lIGRlc3RydWN0aW9ucyBoYXZlIG5vdCBiZWVuIG5vdGlmaWVkLgorICAgIGJvb2wgcHJvY2Vzc05vdGlmaWNhdGlvbnMobnNlY3NfdCogdGltZVRvUmV0cnlOcyk7CisKKyAgICAvLyBNYWluIGZ1bmN0aW9uIGZvciB0aGUgaW5wdXQgYnVmZmVyIG1hbmFnZXIgdGhyZWFkLgorICAgIHZvaWQgbWFpbigpOworCisgICAgLy8gVGhlIHRocmVhZCB0aGF0IG1hbmFnZXMgbm90aWZpY2F0aW9ucy4KKyAgICAvLworICAgIC8vIE5vdGU6IFRoaXMgdmFyaWFibGUgaXMgZGVjbGFyZWQgbGFzdCBzbyBpdHMgaW5pdGlhbGl6YXRpb24gd2lsbCBoYXBwZW4KKyAgICAvLyBhZnRlciBhbGwgb3RoZXIgbWVtYmVyIHZhcmlhYmxlcyBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgc3RkOjp0aHJlYWQgbU1haW5UaHJlYWQ7CisKKyAgICAvLyBQcml2YXRlIGNvbnN0cnVjdG9yLgorICAgIElucHV0QnVmZmVyTWFuYWdlcigpOworCisgICAgLy8gVGhlIG9ubHkgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcy4KKyAgICBzdGF0aWMgSW5wdXRCdWZmZXJNYW5hZ2VyJiBnZXRJbnN0YW5jZSgpOworCit9OworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRfQlVGRkVSX01BTkFHRVJfSAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjllZDdmZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2UuaApAQCAtMCwwICsxLDkxIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRTVVJGQUNFX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VfSAorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NvbXBvbmVudFN0b3JlLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzIuMC9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUlucHV0U2luay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lJbnB1dFN1cmZhY2UuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKworI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBtZWRpYSB7CituYW1lc3BhY2UgYzIgeworbmFtZXNwYWNlIFYxXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKK3VzaW5nIDo6YW5kcm9pZDo6c3A7CisKK3N0cnVjdCBJbnB1dFN1cmZhY2UgOiBwdWJsaWMgSUlucHV0U3VyZmFjZSB7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjJfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6CisgICAgICAgICAgICBHcmFwaGljQnVmZmVyU291cmNlIEdyYXBoaWNCdWZmZXJTb3VyY2U7CisKKyAgICB2aXJ0dWFsIFJldHVybjxzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPj4gZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gZ2V0Q29uZmlndXJhYmxlKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBjb25uZWN0KAorICAgICAgICAgICAgY29uc3Qgc3A8SUlucHV0U2luaz4mIHNpbmssCisgICAgICAgICAgICBjb25uZWN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorCisgICAgY2xhc3MgSW50ZXJmYWNlOworICAgIGNsYXNzIENvbmZpZ3VyYWJsZUludGY7CisKKyAgICBzcDxDb21wb25lbnRTdG9yZT4gbVN0b3JlOworICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1Qcm9kdWNlcjsKKyAgICBzcDxHcmFwaGljQnVmZmVyU291cmNlPiBtU291cmNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRlcmZhY2U+IG1JbnRmOworICAgIHNwPENhY2hlZENvbmZpZ3VyYWJsZT4gbUNvbmZpZ3VyYWJsZTsKKworICAgIElucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPENvbXBvbmVudFN0b3JlPiYgc3RvcmUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+JiByZWZsZWN0b3IsCisgICAgICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgYmFzZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UpOworCisgICAgdmlydHVhbCB+SW5wdXRTdXJmYWNlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgZnJpZW5kIHN0cnVjdCBDb21wb25lbnRTdG9yZTsKKworfTsKKworCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMV8wCit9ICAvLyBuYW1lc3BhY2UgYzIKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9ISURMX1YxXzBfVVRJTFNfSU5QVVRTVVJGQUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC9JbnB1dFN1cmZhY2VDb25uZWN0aW9uLmggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OGI2YjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvaW5jbHVkZS9jb2RlYzIvaGlkbC8xLjAvSW5wdXRTdXJmYWNlQ29ubmVjdGlvbi5oCkBAIC0wLDAgKzEsOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VDT05ORUNUSU9OX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VDT05ORUNUSU9OX0gKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29uZmlndXJhYmxlLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbmZpZ3VyYWJsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lJbnB1dFN1cmZhY2VDb25uZWN0aW9uLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmg+CisKKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bXV0ZXg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjpHcmFwaGljQnVmZmVyU291cmNlOworCisvLyBBbiBJbnB1dFN1cmZhY2VDb25uZWN0aW9uIGNvbm5lY3RzIGFuIElucHV0U3VyZmFjZSB0byBhIHNpbmssIHdoaWNoIG1heSBiZSBhbgorLy8gSUlucHV0U2luayBvciBhIGxvY2FsIEMyQ29tcG9uZW50LiBUaGlzIGNhbiBiZSBzcGVjaWZpZWQgYnkgY2hvb3NpbmcgdGhlCisvLyBjb3JyZXNwb25kaW5nIGNvbnN0cnVjdG9yLiBUaGUgcmVhc29uIGZvciBkaXN0aW5ndWlzaGluZyB0aGVzZSB0d28gY2FzZXMgaXMKKy8vIHRoYXQgd2hlbiBhbiBJbnB1dFN1cmZhY2VDb25uZWN0aW9uIGxpdmVzIGluIHRoZSBzYW1lIHByb2Nlc3MgYXMgdGhlCisvLyBjb21wb25lbnQgdGhhdCBwcm9jZXNzZXMgdGhlIGJ1ZmZlcnMsIGRhdGEgcGFyY2VsaW5nIGlzIG5vdCBuZWVkZWQuCitzdHJ1Y3QgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiA6IHB1YmxpYyBJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiB7CisKKyAgICB2aXJ0dWFsIFJldHVybjxTdGF0dXM+IGRpc2Nvbm5lY3QoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHNwPElDb25maWd1cmFibGU+PiBnZXRDb25maWd1cmFibGUoKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorCisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbigKKyAgICAgICAgICAgIGNvbnN0IHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+JiBjb21wLAorICAgICAgICAgICAgY29uc3Qgc3A8Q29tcG9uZW50U3RvcmU+JiBzdG9yZSk7CisKKyAgICBJbnB1dFN1cmZhY2VDb25uZWN0aW9uKAorICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPElJbnB1dFNpbms+JiBzaW5rLAorICAgICAgICAgICAgY29uc3Qgc3A8Q29tcG9uZW50U3RvcmU+JiBzdG9yZSk7CisKKyAgICBib29sIGluaXQoKTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgSW5wdXRTdXJmYWNlOworCisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbigpID0gZGVsZXRlOworICAgIElucHV0U3VyZmFjZUNvbm5lY3Rpb24oY29uc3QgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbiYpID0gZGVsZXRlOworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb24mKSA9IGRlbGV0ZTsKKworICAgIHN0cnVjdCBJbXBsOworCisgICAgc3RkOjptdXRleCBtSW1wbE11dGV4OworICAgIHNwPEltcGw+IG1JbXBsOworICAgIHNwPENhY2hlZENvbmZpZ3VyYWJsZT4gbUNvbmZpZ3VyYWJsZTsKKworICAgIHZpcnR1YWwgfklucHV0U3VyZmFjZUNvbm5lY3Rpb24oKSBvdmVycmlkZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0hJRExfVjFfMF9VVElMU19JTlBVVFNVUkZBQ0VDT05ORUNUSU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC90eXBlcy5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3V0aWxzL2luY2x1ZGUvY29kZWMyL2hpZGwvMS4wL3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk5MjhiMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy9pbmNsdWRlL2NvZGVjMi9oaWRsLzEuMC90eXBlcy5oCkBAIC0wLDAgKzEsMzUwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9ISURMX1YxXzBfVVRJTFNfVFlQRVNfSAorI2RlZmluZSBDT0RFQzJfSElETF9WMV8wX1VUSUxTX1RZUEVTX0gKKworI2luY2x1ZGUgPGJ1ZmZlcnBvb2wvQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYnVmZmVycG9vbC8yLjAvSUNsaWVudE1hbmFnZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2J1ZmZlcnBvb2wvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvc2FmZV91bmlvbi8xLjAvdHlwZXMuaD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctYmFzZS5oPgorCisjaW5jbHVkZSA8Y2hyb25vPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgbWVkaWEgeworbmFtZXNwYWNlIGMyIHsKK25hbWVzcGFjZSBWMV8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OnN0YXR1c190OwordXNpbmcgOjphbmRyb2lkOjpzcDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6CisgICAgICAgIENvbm5lY3Rpb25JZDsKKworLy8gVHlwZXMgb2YgbWV0YWRhdGEgZm9yIEJsb2Nrcy4KK3N0cnVjdCBDMkhpZGxfUmFuZ2UgeworICAgIHVpbnQzMl90IG9mZnNldDsKKyAgICB1aW50MzJfdCBsZW5ndGg7IC8vIERvIG5vdCB1c2UgInNpemUiIGJlY2F1c2UgdGhlIG5hbWUgY29sbGlkZXMgd2l0aCBDMkluZm86OnNpemUoKS4KK307Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkhpZGxfUmFuZ2UsIDA+IEMySGlkbF9SYW5nZUluZm87CisKK3N0cnVjdCBDMkhpZGxfUmVjdCB7CisgICAgdWludDMyX3QgbGVmdDsKKyAgICB1aW50MzJfdCB0b3A7CisgICAgdWludDMyX3Qgd2lkdGg7CisgICAgdWludDMyX3QgaGVpZ2h0OworfTsKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMySGlkbF9SZWN0LCAxPiBDMkhpZGxfUmVjdEluZm87CisKKy8vIE1ha2UgYXNTdHJpbmcoKSBhbmQgb3BlcmF0b3I8PCB3b3JrIHdpdGggU3RhdHVzIGFzIHdlbGwgYXMgYzJfc3RhdHVzX3QuCitDMl9ERUNMQVJFX0FTX1NUUklOR19BTkRfREVGSU5FX1NUUkVBTV9PVVQoU3RhdHVzKTsKKworLyoqCisgKiBBbGwgb2JqY3B5KCkgZnVuY3Rpb25zIHdpbGwgcmV0dXJuIGEgYm9vbGVhbiB2YWx1ZSBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlCisgKiBjb252ZXJzaW9uIHN1Y2NlZWRzIG9yIG5vdC4KKyAqLworCisvLyBDMlNldHRpbmdSZXN1bHQgLT4gU2V0dGluZ1Jlc3VsdAorYm9vbCBvYmpjcHkoCisgICAgICAgIFNldHRpbmdSZXN1bHQqIGQsCisgICAgICAgIGNvbnN0IEMyU2V0dGluZ1Jlc3VsdCYgcyk7CisKKy8vIFNldHRpbmdSZXN1bHQgLT4gc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4KK2Jvb2wgb2JqY3B5KAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiogZCwKKyAgICAgICAgY29uc3QgU2V0dGluZ1Jlc3VsdCYgcyk7CisKKy8vIEMyUGFyYW1EZXNjcmlwdG9yIC0+IFBhcmFtRGVzY3JpcHRvcgorYm9vbCBvYmpjcHkoCisgICAgICAgIFBhcmFtRGVzY3JpcHRvciogZCwKKyAgICAgICAgY29uc3QgQzJQYXJhbURlc2NyaXB0b3ImIHMpOworCisvLyBQYXJhbURlc2NyaXB0b3IgLT4gc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPgorYm9vbCBvYmpjcHkoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4qIGQsCisgICAgICAgIGNvbnN0IFBhcmFtRGVzY3JpcHRvciYgcyk7CisKKy8vIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAtPiBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Citib29sIG9iamNweSgKKyAgICAgICAgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSogZCwKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzKTsKKworLy8gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAtPiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKK2Jvb2wgb2JqY3B5KAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkqIGQsCisgICAgICAgIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHMpOworCisvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgLT4gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdAorYm9vbCBvYmpjcHkoCisgICAgICAgIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQqIGQsCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSYgcyk7CisKKy8vIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnksIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQgLT4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5Citib29sIG9iamNweSgKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5KiBkLAorICAgICAgICBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5JiBzcSwKKyAgICAgICAgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdCYgc3IpOworCisvLyBDMkNvbXBvbmVudDo6VHJhaXRzIC0+IENvbXBvbmVudFRyYWl0cworYm9vbCBvYmpjcHkoCisgICAgICAgIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzKiBkLAorICAgICAgICBjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzJiBzKTsKKworLy8gQ29tcG9uZW50VHJhaXRzIC0+IEMyQ29tcG9uZW50OjpUcmFpdHMKK2Jvb2wgb2JqY3B5KAorICAgICAgICBDMkNvbXBvbmVudDo6VHJhaXRzKiBkLAorICAgICAgICBjb25zdCBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0cyYgcyk7CisKKy8vIEMyU3RydWN0RGVzY3JpcHRvciAtPiBTdHJ1Y3REZXNjcmlwdG9yCitib29sIG9iamNweSgKKyAgICAgICAgU3RydWN0RGVzY3JpcHRvciogZCwKKyAgICAgICAgY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yJiBzKTsKKworLy8gU3RydWN0RGVzY3JpcHRvciAtPiBDMlN0cnVjdERlc2NyaXB0b3IKK2Jvb2wgb2JqY3B5KAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiogZCwKKyAgICAgICAgY29uc3QgU3RydWN0RGVzY3JpcHRvciYgcyk7CisKKy8vIEFic3RyYWN0IGNsYXNzIHRvIGJlIHVzZWQgaW4KKy8vIG9iamNweShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IC0+IFdvcmtCdW5kbGUpLgorc3RydWN0IEJ1ZmZlclBvb2xTZW5kZXIgeworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OgorICAgICAgICAgICAgUmVzdWx0U3RhdHVzIFJlc3VsdFN0YXR1czsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjoKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UgQnVmZmVyU3RhdHVzTWVzc2FnZTsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjoKKyAgICAgICAgICAgIEJ1ZmZlclBvb2xEYXRhIEJ1ZmZlclBvb2xEYXRhOworCisgICAgLyoqCisgICAgICogU2VuZCBicERhdGEgYW5kIHJldHVybiBCdWZmZXJTdGF0dXNNZXNzYWdlIHRoYXQgY2FuIGJlIHN1cHBsaWVkIHRvCisgICAgICogSUNsaWVudE1hbmFnZXI6OnJlY2VpdmUoKSBpbiB0aGUgcmVjZWl2aW5nIHByb2Nlc3MuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgYmUgY2FsbGVkIGZyb20gd2l0aGluIHRoZSBmdW5jdGlvbgorICAgICAqIG9iamNweShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IC0+IFdvcmtCdW5kbGUpLgorICAgICAqCisgICAgICogXHBhcmFtW2luXSBicERhdGEgQnVmZmVyUG9vbERhdGEgaWRlbnRpZnlpbmcgdGhlIGJ1ZmZlciB0byBzZW5kLgorICAgICAqIFxwYXJhbVtvdXRdIGJwTWVzc2FnZSBCdWZmZXJTdGF0dXNNZXNzYWdlIG9mIHRoZSB0cmFuc2FjdGlvbi4gSW5mb3JtYXRpb24KKyAgICAgKiAgICBpbnNpZGUgXHAgYnBNZXNzYWdlIHNob3VsZCBiZSBwYXNzZWQgdG8gdGhlIHJlY2VpdmluZyBwcm9jZXNzIGJ5IHNvbWUKKyAgICAgKiAgICBvdGhlciBtZWFucyBzbyBpdCBjYW4gY2FsbCByZWNlaXZlKCkgcHJvcGVybHkuCisgICAgICogXHJldHVybiBSZXN1bHRTdGF0dXMgdmFsdWUgdGhhdCBkZXRlcm1pbmVzIHRoZSBzdWNjZXNzIG9mIHRoZSBvcGVyYXRpb24uCisgICAgICogICAgKFNlZSB0aGUgcG9zc2libGUgdmFsdWVzIG9mIFJlc3VsdFN0YXR1cyBpbgorICAgICAqICAgIGhhcmR3YXJlL2ludGVyZmFjZXMvbWVkaWEvYnVmZmVycG9vbC8yLjAvdHlwZXMuaGFsLikKKyAgICAgKi8KKyAgICB2aXJ0dWFsIFJlc3VsdFN0YXR1cyBzZW5kKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiYgYnBEYXRhLAorICAgICAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSogYnBNZXNzYWdlKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5CdWZmZXJQb29sU2VuZGVyKCkgPSBkZWZhdWx0OworfTsKKworLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBCdWZmZXJQb29sU2VuZGVyLgorLy8KKy8vIFRvIHVzZSBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlciwgdGhlIElDbGllbnRNYW5hZ2VyIGluc3RhbmNlIG9mIHRoZSByZWNlaXZpbmcKKy8vIHByb2Nlc3MgbXVzdCBiZSBzZXQgYmVmb3JlIHNlbmQoKSBjYW4gb3BlcmF0ZS4gRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXIgd2lsbAorLy8gaG9sZCBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhlIElDbGllbnRNYW5hZ2VyIGluc3RhbmNlIGFuZCB1c2UgaXQgdG8gY2FsbAorLy8gSUNsaWVudE1hbmFnZXI6OnJlZ2lzdGVyU2VuZGVyKCkgdG8gZXN0YWJsaXNoIHRoZSBidWZmZXJwb29sIGNvbm5lY3Rpb24gd2hlbgorLy8gc2VuZCgpIGlzIGNhbGxlZC4KK3N0cnVjdCBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlciA6IEJ1ZmZlclBvb2xTZW5kZXIgeworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICAgICAgICAgIENsaWVudE1hbmFnZXIgQ2xpZW50TWFuYWdlcjsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjoKKyAgICAgICAgICAgIElDbGllbnRNYW5hZ2VyIElDbGllbnRNYW5hZ2VyOworCisgICAgLy8gU2V0IHRoZSBJQ2xpZW50TWFuYWdlciBpbnN0YW5jZSBvZiB0aGUgcmVjZWl2aW5nIHByb2Nlc3MgYW5kIHRoZSByZWZyZXNoCisgICAgLy8gaW50ZXJ2YWwgZm9yIHRoZSBjb25uZWN0aW9uLiBUaGUgZGVmYXVsdCBpbnRlcnZhbCBpcyA0LjUgc2Vjb25kcywgd2hpY2gKKyAgICAvLyBpcyBzbGlnaHRseSBzaG9ydGVyIHRoYW4gdGhlIGFtb3VudCBvZiB0aW1lIHRoZSBidWZmZXJwb29sIHdpbGwga2VlcCBhbgorICAgIC8vIGluYWN0aXZlIGNvbm5lY3Rpb24gZm9yLgorICAgIERlZmF1bHRCdWZmZXJQb29sU2VuZGVyKAorICAgICAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiByZWNlaXZlck1hbmFnZXIgPSBudWxscHRyLAorICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gcmVmcmVzaEludGVydmFsID0gNDUwMG1zKTsKKworICAgIC8vIFNldCB0aGUgSUNsaWVudE1hbmFnZXIgaW5zdGFuY2Ugb2YgdGhlIHJlY2VpdmluZyBwcm9jZXNzIGFuZCB0aGUgcmVmcmVzaAorICAgIC8vIGludGVydmFsIGZvciB0aGUgY29ubmVjdGlvbi4gVGhlIGRlZmF1bHQgaW50ZXJ2YWwgaXMgNC41IHNlY29uZHMsIHdoaWNoCisgICAgLy8gaXMgc2xpZ2h0bHkgc2hvcnRlciB0aGFuIHRoZSBhbW91bnQgb2YgdGltZSB0aGUgYnVmZmVycG9vbCB3aWxsIGtlZXAgYW4KKyAgICAvLyBpbmFjdGl2ZSBjb25uZWN0aW9uIGZvci4KKyAgICB2b2lkIHNldFJlY2VpdmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiByZWNlaXZlck1hbmFnZXIsCisgICAgICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiByZWZyZXNoSW50ZXJ2YWwgPSA0NTAwbXMpOworCisgICAgLy8gSW1wbGVtZW50YXRpb24gb2YgQnVmZmVyUG9vbFNlbmRlcjo6c2VuZCgpLiBzZW5kKCkgd2lsbCBlc3RhYmxpc2ggYQorICAgIC8vIGJ1ZmZlcnBvb2wgY29ubmVjdGlvbiBpZiBuZWVkZWQsIHRoZW4gc2VuZCB0aGUgYnVmZmVycG9vbCBkYXRhIG92ZXIgdG8KKyAgICAvLyB0aGUgcmVjZWl2aW5nIHByb2Nlc3MuCisgICAgdmlydHVhbCBSZXN1bHRTdGF0dXMgc2VuZCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4mIGJwRGF0YSwKKyAgICAgICAgICAgIEJ1ZmZlclN0YXR1c01lc3NhZ2UqIGJwTWVzc2FnZSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3A8Q2xpZW50TWFuYWdlcj4gbVNlbmRlck1hbmFnZXI7CisgICAgc3A8SUNsaWVudE1hbmFnZXI+IG1SZWNlaXZlck1hbmFnZXI7CisgICAgaW50NjRfdCBtUmVjZWl2ZXJDb25uZWN0aW9uSWQ7CisgICAgaW50NjRfdCBtU291cmNlQ29ubmVjdGlvbklkOworICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgbUxhc3RTZW50OworICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIG1SZWZyZXNoSW50ZXJ2YWw7Cit9OworCisvLyBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IC0+IFdvcmtCdW5kbGUKKy8vIE5vdGU6IElmIGJ1ZmZlcnBvb2wgd2lsbCBiZSB1c2VkLCBicFNlbmRlciBtdXN0IG5vdCBiZSBudWxsLgorYm9vbCBvYmpjcHkoCisgICAgICAgIFdvcmtCdW5kbGUqIGQsCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJwU2VuZGVyID0gbnVsbHB0cik7CisKKy8vIFdvcmtCdW5kbGUgLT4gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PgorYm9vbCBvYmpjcHkoCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGQsCisgICAgICAgIGNvbnN0IFdvcmtCdW5kbGUmIHMpOworCisvKioKKyAqIFBhcnNlcyBhIHBhcmFtcyBibG9iIGFuZCByZXR1cm5zIEMyUGFyYW0gcG9pbnRlcnMgdG8gaXRzIHBhcmFtcy4gVGhlIHBvaW50ZXJzCisgKiBwb2ludCB0byBsb2NhdGlvbnMgaW5zaWRlIHRoZSB1bmRlcmx5aW5nIGJ1ZmZlciBvZiBccCBibG9iLiBJZiBccCBibG9iIGlzCisgKiBkZXN0cm95ZWQsIHRoZSBwb2ludGVycyBiZWNvbWUgaW52YWxpZC4KKyAqCisgKiBccGFyYW1bb3V0XSBwYXJhbXMgdGFyZ2V0IHZlY3RvciBvZiBDMlBhcmFtIHBvaW50ZXJzCisgKiBccGFyYW1baW5dIGJsb2IgcGFyYW1ldGVyIGJsb2IgdG8gcGFyc2UKKyAqIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgZnVsbCBibG9iIHdhcyBwYXJzZWQKKyAqIFxyZXR2YWwgZmFsc2Ugb3RoZXJ3aXNlCisgKi8KK2Jvb2wgcGFyc2VQYXJhbXNCbG9iKAorICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gKnBhcmFtcywKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8dWludDhfdD4gJmJsb2IpOworCisvKioKKyAqIENvbmNhdGVuYXRlcyBhIGxpc3Qgb2YgQzJQYXJhbXMgaW50byBhIHBhcmFtcyBibG9iLgorICoKKyAqIFxwYXJhbVtvdXRdIGJsb2IgdGFyZ2V0IGJsb2IKKyAqIFxwYXJhbVtpbl0gcGFyYW1zIHBhcmFtZXRlcnMgdG8gY29uY2F0ZW5hdGUKKyAqIFxyZXR2YWwgdHJ1ZSBpZiB0aGUgYmxvYiB3YXMgc3VjY2Vzc2Z1bGx5IGNyZWF0ZWQKKyAqIFxyZXR2YWwgZmFsc2UgaWYgdGhlIGJsb2Igd2FzIG5vdCBzdWNjZXNzZnVsICh0aGlzIG9ubHkgaGFwcGVucyBpZiB0aGUKKyAqICAgICAgICAgcGFyYW1ldGVycyB3ZXJlIG5vdCBjb25zdCkKKyAqLworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMpOworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmcGFyYW1zKTsKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiAmcGFyYW1zKTsKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+ICZwYXJhbXMpOworCisvKioKKyAqIFBhcnNlcyBhIHBhcmFtcyBibG9iIGFuZCBjcmVhdGUgYSB2ZWN0b3Igb2YgQzJQYXJhbXMgd2hvc2UgbWVtYmVycyBhcmUgY29waWVzCisgKiBvZiB0aGUgcGFyYW1zIGluIHRoZSBibG9iLgorICoKKyAqIFxwYXJhbVtvdXRdIHBhcmFtcyB0aGUgcmVzdWx0aW5nIHZlY3RvcgorICogXHBhcmFtW2luXSBibG9iIHBhcmFtZXRlciBibG9iIHRvIHBhcnNlCisgKiBccmV0dmFsIHRydWUgaWYgdGhlIGZ1bGwgYmxvYiB3YXMgcGFyc2VkIGFuZCBwYXJhbXMgd2FzIGNvbnN0cnVjdGVkCisgKiBccmV0dmFsIGZhbHNlIG90aGVyd2lzZQorICovCitib29sIGNvcHlQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogcGFyYW1zLAorICAgICAgICBQYXJhbXMgYmxvYik7Citib29sIGNvcHlQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyVHVuaW5nPj4qIHBhcmFtcywKKyAgICAgICAgUGFyYW1zIGJsb2IpOworCisvKioKKyAqIFBhcnNlcyBhIHBhcmFtcyBibG9iIGFuZCBhcHBsaWVzIHVwZGF0ZXMgdG8gcGFyYW1zLgorICoKKyAqIFxwYXJhbVtpbixvdXRdIHBhcmFtcyBwYXJhbXMgdG8gYmUgdXBkYXRlZAorICogXHBhcmFtW2luXSBibG9iIHBhcmFtZXRlciBibG9iIGNvbnRhaW5pbmcgdXBkYXRlcworICogXHJldHZhbCB0cnVlIGlmIHRoZSBmdWxsIGJsb2Igd2FzIHBhcnNlZCBhbmQgcGFyYW1zIHdhcyB1cGRhdGVkCisgKiBccmV0dmFsIGZhbHNlIG90aGVyd2lzZQorICovCitib29sIHVwZGF0ZVBhcmFtc0Zyb21CbG9iKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIHBhcmFtcywKKyAgICAgICAgY29uc3QgUGFyYW1zJiBibG9iKTsKKworLyoqCisgKiBDb252ZXJ0cyBhIEJ1ZmZlclBvb2wgc3RhdHVzIHZhbHVlIHRvIGMyX3N0YXR1c190LgorICogXHBhcmFtIEJ1ZmZlclBvb2wgc3RhdHVzCisgKiBccmV0dXJuIENvcnJlc3BvbmRpbmcgYzJfc3RhdHVzX3QKKyAqLworYzJfc3RhdHVzX3QgdG9DMlN0YXR1cyg6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6CisgICAgICAgIFJlc3VsdFN0YXR1cyBycyk7CisKKy8vIEJ1ZmZlclF1ZXVlLUJhc2VkIEJsb2NrIE9wZXJhdGlvbnMKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gQ2FsbCBiZWZvcmUgdHJhbnNmZXJyaW5nIGJsb2NrIHRvIG90aGVyIHByb2Nlc3Nlcy4KKy8vCisvLyBUaGUgZ2l2ZW4gYmxvY2sgaXMgcmVhZHkgdG8gdHJhbnNmZXIgdG8gb3RoZXIgcHJvY2Vzc2VzLiBUaGlzIHdpbGwgZ3VhcmFudGVlCisvLyB0aGUgZ2l2ZW4gYmxvY2sgZGF0YSBpcyBub3QgbXV0YXRlZCBieSBidWZmZXJxdWV1ZSBtaWdyYXRpb24uCitib29sIGJlZ2luVHJhbnNmZXJCdWZmZXJRdWV1ZUJsb2NrKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrKTsKKworLy8gQ2FsbCBiZWdpblRyYW5zZmVyQnVmZmVyUXVldWVCbG9jaygpIG9uIGJsb2NrcyBpbiB0aGUgZ2l2ZW4gd29ya0xpc3QuCisvLyBwcm9jZXNzSW5wdXQgZGV0ZXJtaW5lcyB3aGV0aGVyIGlucHV0IGJsb2NrcyBhcmUgeWllbGRlZC4gcHJvY2Vzc091dHB1dAorLy8gd29ya3Mgc2ltaWxhcmx5IG9uIG91dHB1dCBibG9ja3MuIChUaGUgZGVmYXVsdCB2YWx1ZSBvZiBwcm9jZXNzSW5wdXQgaXMKKy8vIGZhbHNlIHdoaWxlIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHByb2Nlc3NPdXRwdXQgaXMgdHJ1ZS4gVGhpcyBpbXBsaWVzIHRoYXQgaW4KKy8vIG1vc3QgY2FzZXMsIG9ubHkgb3V0cHV0IGJ1ZmZlcnMgY29udGFpbiBidWZmZXJxdWV1ZS1iYXNlZCBibG9ja3MuKQordm9pZCBiZWdpblRyYW5zZmVyQnVmZmVyUXVldWVCbG9ja3MoCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtMaXN0LAorICAgICAgICBib29sIHByb2Nlc3NJbnB1dCA9IGZhbHNlLAorICAgICAgICBib29sIHByb2Nlc3NPdXRwdXQgPSB0cnVlKTsKKworLy8gQ2FsbCBhZnRlciB0cmFuc2ZlcnJpbmcgYmxvY2sgaXMgZmluaXNoZWQgYW5kIG1ha2Ugc3VyZSB0aGF0CisvLyBiZWdpblRyYW5zZmVyQnVmZmVyUXVldWVCbG9jaygpIGlzIGNhbGxlZCBiZWZvcmUuCisvLworLy8gVGhlIHRyYW5zZmVyIG9mIGdpdmVuIGJsb2NrIGlzIGZpbmlzaGVkLiBJZiB0cmFuc2ZlciBpcyBzdWNjZXNzZnVsIHRoZSBnaXZlbgorLy8gYmxvY2sgaXMgbm90IG93bmVkIGJ5IHByb2Nlc3MgYW55bW9yZS4gU2luY2UgdHJhbnNmZXIgaXMgZmluaXNoZWQgdGhlIGdpdmVuCisvLyBibG9jayBkYXRhIGlzIE9LIHRvIG11dGF0ZSBieSBidWZmZXJxdWV1ZSBtaWdyYXRpb24gYWZ0ZXIgdGhpcyBjYWxsLgorYm9vbCBlbmRUcmFuc2ZlckJ1ZmZlclF1ZXVlQmxvY2soY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRyYW5zZmVyKTsKKworLy8gQ2FsbCBlbmRUcmFuc2ZlckJ1ZmZlclF1ZXVlQmxvY2soKSBvbiBibG9ja3MgaW4gdGhlIGdpdmVuIHdvcmtMaXN0LgorLy8gcHJvY2Vzc0lucHV0IGRldGVybWluZXMgd2hldGhlciBpbnB1dCBibG9ja3MgYXJlIHlpZWxkZWQuIHByb2Nlc3NPdXRwdXQKKy8vIHdvcmtzIHNpbWlsYXJseSBvbiBvdXRwdXQgYmxvY2tzLiAoVGhlIGRlZmF1bHQgdmFsdWUgb2YgcHJvY2Vzc0lucHV0IGlzCisvLyBmYWxzZSB3aGlsZSB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBwcm9jZXNzT3V0cHV0IGlzIHRydWUuIFRoaXMgaW1wbGllcyB0aGF0IGluCisvLyBtb3N0IGNhc2VzLCBvbmx5IG91dHB1dCBidWZmZXJzIGNvbnRhaW4gYnVmZmVycXVldWUtYmFzZWQgYmxvY2tzLikKK3ZvaWQgZW5kVHJhbnNmZXJCdWZmZXJRdWV1ZUJsb2NrcygKKyAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0xpc3QsCisgICAgICAgIGJvb2wgdHJhbnNmZXIsCisgICAgICAgIGJvb2wgcHJvY2Vzc0lucHV0ID0gZmFsc2UsCisgICAgICAgIGJvb2wgcHJvY2Vzc091dHB1dCA9IHRydWUpOworCisvLyBUaGUgZ2l2ZW4gYmxvY2sgaXMgcmVhZHkgdG8gYmUgcmVuZGVyZWQuIHRoZSBnaXZlbiBibG9jayBpcyBub3Qgb3duZWQgYnkKKy8vIHByb2Nlc3MgYW55bW9yZS4gSWYgbWlncmF0aW9uIGlzIGluIHByb2dyZXNzLCB0aGlzIHJldHVybnMgZmFsc2UgaW4gb3JkZXIKKy8vIG5vdCB0byByZW5kZXIuCitib29sIGRpc3BsYXlCdWZmZXJRdWV1ZUJsb2NrKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrKTsKKworfSAgLy8gbmFtZXNwYWNlIHV0aWxzCit9ICAvLyBuYW1lc3BhY2UgVjFfMAorfSAgLy8gbmFtZXNwYWNlIGMyCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKK30gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfSElETF9WMV8wX1VUSUxTX1RZUEVTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC91dGlscy90eXBlcy5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvdHlwZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZmE1OWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdXRpbHMvdHlwZXMuY3BwCkBAIC0wLDAgKzEsMTg0MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzItdHlwZXMiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzJQYXJhbUludGVybmFsLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDMldvcmsuaD4KKyNpbmNsdWRlIDx1dGlsL0MyUGFyYW1VdGlscy5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aW9tYW5pcD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBjMiB7CituYW1lc3BhY2UgVjFfMCB7CituYW1lc3BhY2UgdXRpbHMgeworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6QnVmZmVyU3RhdHVzTWVzc2FnZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjpSZXN1bHRTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OgorICAgICAgICBDbGllbnRNYW5hZ2VyOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjoKKyAgICAgICAgVHJhbnNhY3Rpb25JZDsKKworY29uc3QgY2hhciogYXNTdHJpbmcoU3RhdHVzIHN0YXR1cywgY29uc3QgY2hhciogZGVmKSB7CisgICAgcmV0dXJuIGFzU3RyaW5nKHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0dXMpLCBkZWYpOworfQorCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbnVtQ2xhc3M+Cit0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFbnVtQ2xhc3M+Ojp0eXBlIHVuZGVybHlpbmdfdmFsdWUoCisgICAgICAgIEVudW1DbGFzcyB4KSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEVudW1DbGFzcz46OnR5cGU+KHgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29tbW9uLCB0eXBlbmFtZSBEc3RWZWN0b3IsIHR5cGVuYW1lIFNyY1ZlY3Rvcj4KK3ZvaWQgY29weVZlY3RvcihEc3RWZWN0b3IqIGQsIGNvbnN0IFNyY1ZlY3RvciYgcykgeworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKENvbW1vbikgPT0gc2l6ZW9mKGRlY2x0eXBlKCgqZClbMF0pKSwKKyAgICAgICAgICAgICJEc3RWZWN0b3IncyBjb21wb25lbnQgc2l6ZSBkb2VzIG5vdCBtYXRjaCBDb21tb24iKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDb21tb24pID09IHNpemVvZihkZWNsdHlwZShzWzBdKSksCisgICAgICAgICAgICAiU3JjVmVjdG9yJ3MgY29tcG9uZW50IHNpemUgZG9lcyBub3QgbWF0Y2ggQ29tbW9uIik7CisgICAgZC0+cmVzaXplKHMuc2l6ZSgpKTsKKyAgICBzdGQ6OmNvcHkoCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IENvbW1vbio+KCZzWzBdKSwKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQ29tbW9uKj4oJnNbMF0gKyBzLnNpemUoKSksCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PENvbW1vbio+KCYoKmQpWzBdKSk7Cit9CisKKy8vIEMyUGFyYW1GaWVsZCAtPiBQYXJhbUZpZWxkCitib29sIG9iamNweShQYXJhbUZpZWxkICpkLCBjb25zdCBDMlBhcmFtRmllbGQgJnMpIHsKKyAgICBkLT5pbmRleCA9IHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRJbmRleChzKSk7CisgICAgZC0+ZmllbGRJZC5vZmZzZXQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChzKSk7CisgICAgZC0+ZmllbGRJZC5zaXplID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKHMpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RydWN0IEMyUGFyYW1GaWVsZEJ1aWxkZXIgOiBwdWJsaWMgQzJQYXJhbUZpZWxkIHsKKyAgICBDMlBhcmFtRmllbGRCdWlsZGVyKCkgOiBDMlBhcmFtRmllbGQoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxDMlBhcmFtOjpJbmRleD4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KDApKSwgMCwgMCkgeworICAgIH0KKyAgICAvLyBQYXJhbUZpZWxkIC0+IEMyUGFyYW1GaWVsZAorICAgIEMyUGFyYW1GaWVsZEJ1aWxkZXIoY29uc3QgUGFyYW1GaWVsZCYgcykgOiBDMlBhcmFtRmllbGQoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxDMlBhcmFtOjpJbmRleD4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHMuaW5kZXgpKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzLmZpZWxkSWQub2Zmc2V0KSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzLmZpZWxkSWQuc2l6ZSkpIHsKKyAgICB9Cit9OworCisvLyBDMldvcmtPcmRpbmFsU3RydWN0IC0+IFdvcmtPcmRpbmFsCitib29sIG9iamNweShXb3JrT3JkaW5hbCAqZCwgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmcykgeworICAgIGQtPmZyYW1lSW5kZXggPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgIGQtPnRpbWVzdGFtcFVzID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHMudGltZXN0YW1wLnBlZWt1KCkpOworICAgIGQtPmN1c3RvbU9yZGluYWwgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy5jdXN0b21PcmRpbmFsLnBlZWt1KCkpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBXb3JrT3JkaW5hbCAtPiBDMldvcmtPcmRpbmFsU3RydWN0Citib29sIG9iamNweShDMldvcmtPcmRpbmFsU3RydWN0ICpkLCBjb25zdCBXb3JrT3JkaW5hbCAmcykgeworICAgIGQtPmZyYW1lSW5kZXggPSBjMl9jbnRyNjRfdChzLmZyYW1lSW5kZXgpOworICAgIGQtPnRpbWVzdGFtcCA9IGMyX2NudHI2NF90KHMudGltZXN0YW1wVXMpOworICAgIGQtPmN1c3RvbU9yZGluYWwgPSBjMl9jbnRyNjRfdChzLmN1c3RvbU9yZGluYWwpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpyYW5nZSdzIHR5cGUgLT4gVmFsdWVSYW5nZQorYm9vbCBvYmpjcHkoCisgICAgICAgIFZhbHVlUmFuZ2UqIGQsCisgICAgICAgIGNvbnN0IGRlY2x0eXBlKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlKSYgcykgeworICAgIGQtPm1pbiA9IHN0YXRpY19jYXN0PFByaW1pdGl2ZVZhbHVlPihzLm1pbi51NjQpOworICAgIGQtPm1heCA9IHN0YXRpY19jYXN0PFByaW1pdGl2ZVZhbHVlPihzLm1heC51NjQpOworICAgIGQtPnN0ZXAgPSBzdGF0aWNfY2FzdDxQcmltaXRpdmVWYWx1ZT4ocy5zdGVwLnU2NCk7CisgICAgZC0+bnVtID0gc3RhdGljX2Nhc3Q8UHJpbWl0aXZlVmFsdWU+KHMubnVtLnU2NCk7CisgICAgZC0+ZGVub20gPSBzdGF0aWNfY2FzdDxQcmltaXRpdmVWYWx1ZT4ocy5kZW5vbS51NjQpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIC0+IEZpZWxkU3VwcG9ydGVkVmFsdWVzCitib29sIG9iamNweShGaWVsZFN1cHBvcnRlZFZhbHVlcyAqZCwgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmcykgeworICAgIHN3aXRjaCAocy50eXBlKSB7CisgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpFTVBUWTogeworICAgICAgICAgICAgZC0+ZW1wdHkoOjphbmRyb2lkOjpoaWRsOjpzYWZlX3VuaW9uOjpWMV8wOjpNb25vc3RhdGV7fSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UkFOR0U6IHsKKyAgICAgICAgICAgIFZhbHVlUmFuZ2UgcmFuZ2V7fTsKKyAgICAgICAgICAgIGlmICghb2JqY3B5KCZyYW5nZSwgcy5yYW5nZSkpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnJhbmdlLiI7CisgICAgICAgICAgICAgICAgZC0+cmFuZ2UocmFuZ2UpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGQtPnJhbmdlKHJhbmdlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpWQUxVRVM6IHsKKyAgICAgICAgICAgIGhpZGxfdmVjPFByaW1pdGl2ZVZhbHVlPiB2YWx1ZXM7CisgICAgICAgICAgICBjb3B5VmVjdG9yPHVpbnQ2NF90PigmdmFsdWVzLCBzLnZhbHVlcyk7CisgICAgICAgICAgICBkLT52YWx1ZXModmFsdWVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUzogeworICAgICAgICAgICAgaGlkbF92ZWM8UHJpbWl0aXZlVmFsdWU+IGZsYWdzOworICAgICAgICAgICAgY29weVZlY3Rvcjx1aW50NjRfdD4oJmZsYWdzLCBzLnZhbHVlcyk7CisgICAgICAgICAgICBkLT5mbGFncyhmbGFncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3QgIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMudHlwZSkKKyAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFZhbHVlUmFuZ2UgLT4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6cmFuZ2UncyB0eXBlCitib29sIG9iamNweSgKKyAgICAgICAgZGVjbHR5cGUoQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6cmFuZ2UpKiBkLAorICAgICAgICBjb25zdCBWYWx1ZVJhbmdlJiBzKSB7CisgICAgZC0+bWluLnU2NCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzLm1pbik7CisgICAgZC0+bWF4LnU2NCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihzLm1heCk7CisgICAgZC0+c3RlcC51NjQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy5zdGVwKTsKKyAgICBkLT5udW0udTY0ID0gc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHMubnVtKTsKKyAgICBkLT5kZW5vbS51NjQgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4ocy5kZW5vbSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEZpZWxkU3VwcG9ydGVkVmFsdWVzIC0+IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMKK2Jvb2wgb2JqY3B5KEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKmQsIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzICZzKSB7CisgICAgc3dpdGNoIChzLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgIGNhc2UgRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OmhpZGxfZGlzY3JpbWluYXRvcjo6ZW1wdHk6IHsKKyAgICAgICAgICAgIGQtPnR5cGUgPSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpFTVBUWTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgY2FzZSBGaWVsZFN1cHBvcnRlZFZhbHVlczo6aGlkbF9kaXNjcmltaW5hdG9yOjpyYW5nZTogeworICAgICAgICAgICAgZC0+dHlwZSA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlJBTkdFOworICAgICAgICAgICAgaWYgKCFvYmpjcHkoJmQtPnJhbmdlLCBzLnJhbmdlKCkpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBGaWVsZFN1cHBvcnRlZFZhbHVlczo6cmFuZ2UuIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkLT52YWx1ZXMucmVzaXplKDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnZhbHVlczogeworICAgICAgICAgICAgZC0+dHlwZSA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUzsKKyAgICAgICAgICAgIGNvcHlWZWN0b3I8dWludDY0X3Q+KCZkLT52YWx1ZXMsIHMudmFsdWVzKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIEZpZWxkU3VwcG9ydGVkVmFsdWVzOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OmZsYWdzOiB7CisgICAgICAgICAgICBkLT50eXBlID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RkxBR1M7CisgICAgICAgICAgICBjb3B5VmVjdG9yPHVpbnQ2NF90PigmZC0+dmFsdWVzLCBzLmZsYWdzKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coV0FSTklORykgPDwgIlVucmVjb2duaXplZCBGaWVsZFN1cHBvcnRlZFZhbHVlczo6Z2V0RGlzY3JpbWluYXRvcigpIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCisvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgLT4gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeQorYm9vbCBvYmpjcHkoCisgICAgICAgIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkqIGQsCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSYgcykgeworICAgIGlmICghb2JqY3B5KCZkLT5maWVsZCwgcy5maWVsZCgpKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6ZmllbGQuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzd2l0Y2ggKHMudHlwZSgpKSB7CisgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBPU1NJQkxFOgorICAgICAgICBkLT50eXBlID0gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6VHlwZTo6UE9TU0lCTEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDVVJSRU5UOgorICAgICAgICBkLT50eXBlID0gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6VHlwZTo6Q1VSUkVOVDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiVW5yZWNvZ25pemVkIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6dHlwZV90ICIKKyAgICAgICAgICAgICAgICAgICA8PCAid2l0aCB1bmRlcmx5aW5nIHZhbHVlICIgPDwgdW5kZXJseWluZ192YWx1ZShzLnR5cGUoKSkKKyAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgIGQtPnR5cGUgPSBzdGF0aWNfY2FzdDxGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpUeXBlPihzLnR5cGUoKSk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5IC0+IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeQorYm9vbCBvYmpjcHkoCisgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSogZCwKKyAgICAgICAgY29uc3QgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSYgcykgeworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6dHlwZV90IGRUeXBlOworICAgIHN3aXRjaCAocy50eXBlKSB7CisgICAgY2FzZSBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpUeXBlOjpQT1NTSUJMRToKKyAgICAgICAgZFR5cGUgPSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBPU1NJQkxFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlR5cGU6OkNVUlJFTlQ6CisgICAgICAgIGRUeXBlID0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDVVJSRU5UOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6VHlwZSAiCisgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy50eXBlKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgZFR5cGUgPSBzdGF0aWNfY2FzdDxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OnR5cGVfdD4ocy50eXBlKTsKKyAgICB9CisgICAgKmQgPSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkoQzJQYXJhbUZpZWxkQnVpbGRlcihzLmZpZWxkKSwgZFR5cGUpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgLT4gRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdAorYm9vbCBvYmpjcHkoCisgICAgICAgIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQqIGQsCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSYgcykgeworICAgIGQtPnN0YXR1cyA9IHN0YXRpY19jYXN0PFN0YXR1cz4ocy5zdGF0dXMpOworICAgIHJldHVybiBvYmpjcHkoJmQtPnZhbHVlcywgcy52YWx1ZXMpOworfQorCisvLyBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5LCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0IC0+CisvLyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkKK2Jvb2wgb2JqY3B5KAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkqIGQsCisgICAgICAgIGNvbnN0IEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkmIHNxLAorICAgICAgICBjb25zdCBGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5UmVzdWx0JiBzcikgeworICAgIGlmICghb2JqY3B5KGQsIHNxKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkLT5zdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3Iuc3RhdHVzKTsKKyAgICBpZiAoIW9iamNweSgmZC0+dmFsdWVzLCBzci52YWx1ZXMpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeVJlc3VsdDo6dmFsdWVzLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEMyQ29tcG9uZW50OjpUcmFpdHMgLT4gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHMKK2Jvb2wgb2JqY3B5KAorICAgICAgICBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0cyAqZCwKKyAgICAgICAgY29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cyAmcykgeworICAgIGQtPm5hbWUgPSBzLm5hbWU7CisKKyAgICBzd2l0Y2ggKHMuZG9tYWluKSB7CisgICAgY2FzZSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPOgorICAgICAgICBkLT5kb21haW4gPSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6RG9tYWluOjpWSURFTzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMkNvbXBvbmVudDo6RE9NQUlOX0FVRElPOgorICAgICAgICBkLT5kb21haW4gPSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6RG9tYWluOjpBVURJTzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMkNvbXBvbmVudDo6RE9NQUlOX0lNQUdFOgorICAgICAgICBkLT5kb21haW4gPSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6RG9tYWluOjpJTUFHRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSOgorICAgICAgICBkLT5kb21haW4gPSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6RG9tYWluOjpPVEhFUjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiVW5yZWNvZ25pemVkIEMyQ29tcG9uZW50Ojpkb21haW5fdCAiCisgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy5kb21haW4pCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICBkLT5kb21haW4gPSBzdGF0aWNfY2FzdDxJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6RG9tYWluPigKKyAgICAgICAgICAgICAgICBzLmRvbWFpbik7CisgICAgfQorCisgICAgc3dpdGNoIChzLmtpbmQpIHsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVI6CisgICAgICAgIGQtPmtpbmQgPSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6S2luZDo6REVDT0RFUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSOgorICAgICAgICBkLT5raW5kID0gSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OktpbmQ6OkVOQ09ERVI7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJDb21wb25lbnQ6OktJTkRfT1RIRVI6CisgICAgICAgIGQtPmtpbmQgPSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6S2luZDo6T1RIRVI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBDMkNvbXBvbmVudDo6a2luZF90ICIKKyAgICAgICAgICAgICAgICAgICA8PCAid2l0aCB1bmRlcmx5aW5nIHZhbHVlICIgPDwgdW5kZXJseWluZ192YWx1ZShzLmtpbmQpCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICBkLT5raW5kID0gc3RhdGljX2Nhc3Q8SUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OktpbmQ+KAorICAgICAgICAgICAgICAgIHMua2luZCk7CisgICAgfQorCisgICAgZC0+cmFuayA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzLnJhbmspOworCisgICAgZC0+bWVkaWFUeXBlID0gcy5tZWRpYVR5cGU7CisKKyAgICBkLT5hbGlhc2VzLnJlc2l6ZShzLmFsaWFzZXMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpeCA9IHMuYWxpYXNlcy5zaXplKCk7IGl4ID4gMDsgKSB7CisgICAgICAgIC0taXg7CisgICAgICAgIGQtPmFsaWFzZXNbaXhdID0gcy5hbGlhc2VzW2l4XTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIENvbXBvbmVudFRyYWl0cyAtPiBDMkNvbXBvbmVudDo6VHJhaXRzLCBzdGQ6OnVuaXF1ZV9wdHI8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+PgorYm9vbCBvYmpjcHkoCisgICAgICAgIEMyQ29tcG9uZW50OjpUcmFpdHMqIGQsCisgICAgICAgIGNvbnN0IElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzJiBzKSB7CisgICAgZC0+bmFtZSA9IHMubmFtZS5jX3N0cigpOworCisgICAgc3dpdGNoIChzLmRvbWFpbikgeworICAgIGNhc2UgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbjo6VklERU86CisgICAgICAgIGQtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fVklERU87CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbjo6QVVESU86CisgICAgICAgIGQtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fQVVESU87CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbjo6SU1BR0U6CisgICAgICAgIGQtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0U7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OkRvbWFpbjo6T1RIRVI6CisgICAgICAgIGQtPmRvbWFpbiA9IEMyQ29tcG9uZW50OjpET01BSU5fT1RIRVI7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhERUJVRykgPDwgIlVucmVjb2duaXplZCBDb21wb25lbnRUcmFpdHM6OkRvbWFpbiAiCisgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy5kb21haW4pCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICBkLT5kb21haW4gPSBzdGF0aWNfY2FzdDxDMkNvbXBvbmVudDo6ZG9tYWluX3Q+KHMuZG9tYWluKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHMua2luZCkgeworICAgIGNhc2UgSUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM6OktpbmQ6OkRFQ09ERVI6CisgICAgICAgIGQtPmtpbmQgPSBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSOworICAgICAgICBicmVhazsKKyAgICBjYXNlIElDb21wb25lbnRTdG9yZTo6Q29tcG9uZW50VHJhaXRzOjpLaW5kOjpFTkNPREVSOgorICAgICAgICBkLT5raW5kID0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBJQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudFRyYWl0czo6S2luZDo6T1RIRVI6CisgICAgICAgIGQtPmtpbmQgPSBDMkNvbXBvbmVudDo6S0lORF9PVEhFUjsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiVW5yZWNvZ25pemVkIENvbXBvbmVudFRyYWl0czo6S2luZCAiCisgICAgICAgICAgICAgICAgICAgPDwgIndpdGggdW5kZXJseWluZyB2YWx1ZSAiIDw8IHVuZGVybHlpbmdfdmFsdWUocy5raW5kKQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgZC0+a2luZCA9IHN0YXRpY19jYXN0PEMyQ29tcG9uZW50OjpraW5kX3Q+KHMua2luZCk7CisgICAgfQorCisgICAgZC0+cmFuayA9IHN0YXRpY19jYXN0PEMyQ29tcG9uZW50OjpyYW5rX3Q+KHMucmFuayk7CisgICAgZC0+bWVkaWFUeXBlID0gcy5tZWRpYVR5cGUuY19zdHIoKTsKKyAgICBkLT5hbGlhc2VzLnJlc2l6ZShzLmFsaWFzZXMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHMuYWxpYXNlcy5zaXplKCk7ICsraSkgeworICAgICAgICBkLT5hbGlhc2VzW2ldID0gcy5hbGlhc2VzW2ldOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCisvLyBDMlBhcmFtRmllbGRWYWx1ZXMgLT4gUGFyYW1GaWVsZFZhbHVlcworYm9vbCBvYmpjcHkoUGFyYW1GaWVsZFZhbHVlcyAqZCwgY29uc3QgQzJQYXJhbUZpZWxkVmFsdWVzICZzKSB7CisgICAgaWYgKCFvYmpjcHkoJmQtPnBhcmFtT3JGaWVsZCwgcy5wYXJhbU9yRmllbGQpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJQYXJhbUZpZWxkVmFsdWVzOjpwYXJhbU9yRmllbGQuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAocy52YWx1ZXMpIHsKKyAgICAgICAgZC0+dmFsdWVzLnJlc2l6ZSgxKTsKKyAgICAgICAgaWYgKCFvYmpjcHkoJmQtPnZhbHVlc1swXSwgKnMudmFsdWVzKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMlBhcmFtRmllbGRWYWx1ZXM6OnZhbHVlcy4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBkLT52YWx1ZXMucmVzaXplKDApOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBQYXJhbUZpZWxkVmFsdWVzIC0+IEMyUGFyYW1GaWVsZFZhbHVlcworYm9vbCBvYmpjcHkoQzJQYXJhbUZpZWxkVmFsdWVzICpkLCBjb25zdCBQYXJhbUZpZWxkVmFsdWVzICZzKSB7CisgICAgZC0+cGFyYW1PckZpZWxkID0gQzJQYXJhbUZpZWxkQnVpbGRlcihzLnBhcmFtT3JGaWVsZCk7CisgICAgaWYgKHMudmFsdWVzLnNpemUoKSA9PSAxKSB7CisgICAgICAgIGQtPnZhbHVlcyA9IHN0ZDo6bWFrZV91bmlxdWU8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4oKTsKKyAgICAgICAgaWYgKCFvYmpjcHkoZC0+dmFsdWVzLmdldCgpLCBzLnZhbHVlc1swXSkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgUGFyYW1GaWVsZFZhbHVlczo6dmFsdWVzLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlIGlmIChzLnZhbHVlcy5zaXplKCkgPT0gMCkgeworICAgICAgICBkLT52YWx1ZXMucmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgUGFyYW1GaWVsZFZhbHVlczogIgorICAgICAgICAgICAgICAgICAgIlR3byBvciBtb3JlIEZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdHMgZXhpc3QgaW4gIgorICAgICAgICAgICAgICAgICAgIlBhcmFtRmllbGRWYWx1ZXMuICIKKyAgICAgICAgICAgICAgICAgICJPbmx5IHplcm8gb3Igb25lIGlzIGFsbG93ZWQuIjsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gQzJTZXR0aW5nUmVzdWx0IC0+IFNldHRpbmdSZXN1bHQKK2Jvb2wgb2JqY3B5KFNldHRpbmdSZXN1bHQgKmQsIGNvbnN0IEMyU2V0dGluZ1Jlc3VsdCAmcykgeworICAgIHN3aXRjaCAocy5mYWlsdXJlKSB7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OkJBRF9UWVBFOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6QkFEX1RZUEU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpCQURfUE9SVDoKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9QT1JUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6QkFEX0lOREVYOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6QkFEX0lOREVYOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6UkVBRF9PTkxZOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6UkVBRF9PTkxZOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6TUlTTUFUQ0g6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpNSVNNQVRDSDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OkJBRF9WQUxVRToKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9WQUxVRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OkNPTkZMSUNUOgorICAgICAgICBkLT5mYWlsdXJlID0gU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6Q09ORkxJQ1Q7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpVTlNVUFBPUlRFRDoKKyAgICAgICAgZC0+ZmFpbHVyZSA9IFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OlVOU1VQUE9SVEVEOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyU2V0dGluZ1Jlc3VsdDo6SU5GT19CQURfVkFMVUU6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpJTkZPX0JBRF9WQUxVRTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMlNldHRpbmdSZXN1bHQ6OklORk9fQ09ORkxJQ1Q6CisgICAgICAgIGQtPmZhaWx1cmUgPSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpJTkZPX0NPTkZMSUNUOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coREVCVUcpIDw8ICJVbnJlY29nbml6ZWQgQzJTZXR0aW5nUmVzdWx0OjpGYWlsdXJlICIKKyAgICAgICAgICAgICAgICAgICA8PCAid2l0aCB1bmRlcmx5aW5nIHZhbHVlICIgPDwgdW5kZXJseWluZ192YWx1ZShzLmZhaWx1cmUpCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICBkLT5mYWlsdXJlID0gc3RhdGljX2Nhc3Q8U2V0dGluZ1Jlc3VsdDo6RmFpbHVyZT4ocy5mYWlsdXJlKTsKKyAgICB9CisgICAgaWYgKCFvYmpjcHkoJmQtPmZpZWxkLCBzLmZpZWxkKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyU2V0dGluZ1Jlc3VsdDo6ZmllbGQuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkLT5jb25mbGljdHMucmVzaXplKHMuY29uZmxpY3RzLnNpemUoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoY29uc3QgQzJQYXJhbUZpZWxkVmFsdWVzJiBzQ29uZmxpY3QgOiBzLmNvbmZsaWN0cykgeworICAgICAgICBQYXJhbUZpZWxkVmFsdWVzICZkQ29uZmxpY3QgPSBkLT5jb25mbGljdHNbaSsrXTsKKyAgICAgICAgaWYgKCFvYmpjcHkoJmRDb25mbGljdCwgc0NvbmZsaWN0KSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMlNldHRpbmdSZXN1bHQ6OmNvbmZsaWN0c1siCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGkgLSAxIDw8ICJdLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFNldHRpbmdSZXN1bHQgLT4gc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4KK2Jvb2wgb2JqY3B5KHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+ICpkLCBjb25zdCBTZXR0aW5nUmVzdWx0ICZzKSB7CisgICAgKmQgPSBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PihuZXcgQzJTZXR0aW5nUmVzdWx0IHsKKyAgICAgICAgICAgIC5maWVsZCA9IEMyUGFyYW1GaWVsZFZhbHVlcyhDMlBhcmFtRmllbGRCdWlsZGVyKCkpIH0pOworICAgIGlmICghKmQpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiTm8gbWVtb3J5IGZvciBDMlNldHRpbmdSZXN1bHQuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIGZhaWx1cmUKKyAgICBzd2l0Y2ggKHMuZmFpbHVyZSkgeworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6QkFEX1RZUEU6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OkJBRF9UWVBFOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OkJBRF9QT1JUOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpCQURfUE9SVDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpCQURfSU5ERVg6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OkJBRF9JTkRFWDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpSRUFEX09OTFk6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OlJFQURfT05MWTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpNSVNNQVRDSDoKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6TUlTTUFUQ0g7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6QkFEX1ZBTFVFOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpCQURfVkFMVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6Q09ORkxJQ1Q6CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBDMlNldHRpbmdSZXN1bHQ6OkNPTkZMSUNUOworICAgICAgICBicmVhazsKKyAgICBjYXNlIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmU6OlVOU1VQUE9SVEVEOgorICAgICAgICAoKmQpLT5mYWlsdXJlID0gQzJTZXR0aW5nUmVzdWx0OjpVTlNVUFBPUlRFRDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBTZXR0aW5nUmVzdWx0OjpGYWlsdXJlOjpJTkZPX0JBRF9WQUxVRToKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6SU5GT19CQURfVkFMVUU7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgU2V0dGluZ1Jlc3VsdDo6RmFpbHVyZTo6SU5GT19DT05GTElDVDoKKyAgICAgICAgKCpkKS0+ZmFpbHVyZSA9IEMyU2V0dGluZ1Jlc3VsdDo6SU5GT19DT05GTElDVDsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiVW5yZWNvZ25pemVkIFNldHRpbmdSZXN1bHQ6OkZhaWx1cmUgIgorICAgICAgICAgICAgICAgICAgIDw8ICJ3aXRoIHVuZGVybHlpbmcgdmFsdWUgIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMuZmFpbHVyZSkKKyAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgICgqZCktPmZhaWx1cmUgPSBzdGF0aWNfY2FzdDxDMlNldHRpbmdSZXN1bHQ6OkZhaWx1cmU+KHMuZmFpbHVyZSk7CisgICAgfQorCisgICAgLy8gZmllbGQKKyAgICBpZiAoIW9iamNweSgmKCpkKS0+ZmllbGQsIHMuZmllbGQpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgU2V0dGluZ1Jlc3VsdDo6ZmllbGQuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIGNvbmZsaWN0cworICAgICgqZCktPmNvbmZsaWN0cy5jbGVhcigpOworICAgICgqZCktPmNvbmZsaWN0cy5yZXNlcnZlKHMuY29uZmxpY3RzLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBQYXJhbUZpZWxkVmFsdWVzJiBzQ29uZmxpY3QgOiBzLmNvbmZsaWN0cykgeworICAgICAgICAoKmQpLT5jb25mbGljdHMuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgIEMyUGFyYW1GaWVsZFZhbHVlc3sgQzJQYXJhbUZpZWxkQnVpbGRlcigpLCBudWxscHRyIH0pOworICAgICAgICBpZiAoIW9iamNweSgmKCpkKS0+Y29uZmxpY3RzLmJhY2soKSwgc0NvbmZsaWN0KSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBTZXR0aW5nUmVzdWx0Ojpjb25mbGljdHMuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJQYXJhbURlc2NyaXB0b3IgLT4gUGFyYW1EZXNjcmlwdG9yCitib29sIG9iamNweShQYXJhbURlc2NyaXB0b3IgKmQsIGNvbnN0IEMyUGFyYW1EZXNjcmlwdG9yICZzKSB7CisgICAgZC0+aW5kZXggPSBzdGF0aWNfY2FzdDxQYXJhbUluZGV4PihzLmluZGV4KCkpOworICAgIGQtPmF0dHJpYiA9IHN0YXRpY19jYXN0PGhpZGxfYml0ZmllbGQ8UGFyYW1EZXNjcmlwdG9yOjpBdHRyaWI+PigKKyAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRBdHRyaWIocykpOworICAgIGQtPm5hbWUgPSBzLm5hbWUoKTsKKyAgICBjb3B5VmVjdG9yPHVpbnQzMl90PigmZC0+ZGVwZW5kZW5jaWVzLCBzLmRlcGVuZGVuY2llcygpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUGFyYW1EZXNjcmlwdG9yIC0+IEMyUGFyYW1EZXNjcmlwdG9yCitib29sIG9iamNweShzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICpkLCBjb25zdCBQYXJhbURlc2NyaXB0b3IgJnMpIHsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gZERlcGVuZGVuY2llczsKKyAgICBkRGVwZW5kZW5jaWVzLnJlc2VydmUocy5kZXBlbmRlbmNpZXMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IFBhcmFtSW5kZXgmIHNEZXBlbmRlbmN5IDogcy5kZXBlbmRlbmNpZXMpIHsKKyAgICAgICAgZERlcGVuZGVuY2llcy5lbXBsYWNlX2JhY2soc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNEZXBlbmRlbmN5KSk7CisgICAgfQorICAgICpkID0gc3RkOjptYWtlX3NoYXJlZDxDMlBhcmFtRGVzY3JpcHRvcj4oCisgICAgICAgICAgICBDMlBhcmFtOjpJbmRleChzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy5pbmRleCkpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90PihzLmF0dHJpYiksCisgICAgICAgICAgICBDMlN0cmluZyhzLm5hbWUuY19zdHIoKSksCisgICAgICAgICAgICBzdGQ6Om1vdmUoZERlcGVuZGVuY2llcykpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMlN0cnVjdERlc2NyaXB0b3IgLT4gU3RydWN0RGVzY3JpcHRvcgorYm9vbCBvYmpjcHkoU3RydWN0RGVzY3JpcHRvciAqZCwgY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yICZzKSB7CisgICAgZC0+dHlwZSA9IHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KHMuY29yZUluZGV4KCkuY29yZUluZGV4KCkpOworICAgIGQtPmZpZWxkcy5yZXNpemUocy5udW1GaWVsZHMoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoY29uc3QgYXV0byYgc0ZpZWxkIDogcykgeworICAgICAgICBGaWVsZERlc2NyaXB0b3ImIGRGaWVsZCA9IGQtPmZpZWxkc1tpKytdOworICAgICAgICBkRmllbGQuZmllbGRJZC5vZmZzZXQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChzRmllbGQpKTsKKyAgICAgICAgZEZpZWxkLmZpZWxkSWQuc2l6ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigKKyAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0U2l6ZShzRmllbGQpKTsKKyAgICAgICAgZEZpZWxkLnR5cGUgPSBzdGF0aWNfY2FzdDxoaWRsX2JpdGZpZWxkPEZpZWxkRGVzY3JpcHRvcjo6VHlwZT4+KAorICAgICAgICAgICAgICAgIHNGaWVsZC50eXBlKCkpOworICAgICAgICBkRmllbGQuZXh0ZW50ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHNGaWVsZC5leHRlbnQoKSk7CisgICAgICAgIGRGaWVsZC5uYW1lID0gc3RhdGljX2Nhc3Q8aGlkbF9zdHJpbmc+KHNGaWVsZC5uYW1lKCkpOworICAgICAgICBjb25zdCBhdXRvJiBzTmFtZWRWYWx1ZXMgPSBzRmllbGQubmFtZWRWYWx1ZXMoKTsKKyAgICAgICAgZEZpZWxkLm5hbWVkVmFsdWVzLnJlc2l6ZShzTmFtZWRWYWx1ZXMuc2l6ZSgpKTsKKyAgICAgICAgc2l6ZV90IGogPSAwOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNOYW1lZFZhbHVlIDogc05hbWVkVmFsdWVzKSB7CisgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWUmIGROYW1lZFZhbHVlID0gZEZpZWxkLm5hbWVkVmFsdWVzW2orK107CisgICAgICAgICAgICBkTmFtZWRWYWx1ZS5uYW1lID0gc3RhdGljX2Nhc3Q8aGlkbF9zdHJpbmc+KHNOYW1lZFZhbHVlLmZpcnN0KTsKKyAgICAgICAgICAgIGROYW1lZFZhbHVlLnZhbHVlID0gc3RhdGljX2Nhc3Q8UHJpbWl0aXZlVmFsdWU+KAorICAgICAgICAgICAgICAgICAgICBzTmFtZWRWYWx1ZS5zZWNvbmQudTY0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gU3RydWN0RGVzY3JpcHRvciAtPiBDMlN0cnVjdERlc2NyaXB0b3IKK2Jvb2wgb2JqY3B5KHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+ICpkLCBjb25zdCBTdHJ1Y3REZXNjcmlwdG9yICZzKSB7CisgICAgQzJQYXJhbTo6Q29yZUluZGV4IGRJbmRleCA9IEMyUGFyYW06OkNvcmVJbmRleChzdGF0aWNfY2FzdDx1aW50MzJfdD4ocy50eXBlKSk7CisgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGRGaWVsZHM7CisgICAgZEZpZWxkcy5yZXNlcnZlKHMuZmllbGRzLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvICZzRmllbGQgOiBzLmZpZWxkcykgeworICAgICAgICBDMkZpZWxkRGVzY3JpcHRvciBkRmllbGQgPSB7CisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc0ZpZWxkLnR5cGUpLAorICAgICAgICAgICAgc0ZpZWxkLmV4dGVudCwKKyAgICAgICAgICAgIHNGaWVsZC5uYW1lLAorICAgICAgICAgICAgc0ZpZWxkLmZpZWxkSWQub2Zmc2V0LAorICAgICAgICAgICAgc0ZpZWxkLmZpZWxkSWQuc2l6ZSB9OworICAgICAgICBDMkZpZWxkRGVzY3JpcHRvcjo6TmFtZWRWYWx1ZXNUeXBlIG5hbWVkVmFsdWVzOworICAgICAgICBuYW1lZFZhbHVlcy5yZXNlcnZlKHNGaWVsZC5uYW1lZFZhbHVlcy5zaXplKCkpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNOYW1lZFZhbHVlIDogc0ZpZWxkLm5hbWVkVmFsdWVzKSB7CisgICAgICAgICAgICBuYW1lZFZhbHVlcy5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICAgICAgc05hbWVkVmFsdWUubmFtZSwKKyAgICAgICAgICAgICAgICBDMlZhbHVlOjpQcmltaXRpdmUoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHNOYW1lZFZhbHVlLnZhbHVlKSkpOworICAgICAgICB9CisgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpBZGROYW1lZFZhbHVlcyhkRmllbGQsIHN0ZDo6bW92ZShuYW1lZFZhbHVlcykpOworICAgICAgICBkRmllbGRzLmVtcGxhY2VfYmFjayhkRmllbGQpOworICAgIH0KKyAgICAqZCA9IHN0ZDo6bWFrZV91bmlxdWU8QzJTdHJ1Y3REZXNjcmlwdG9yPigKKyAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpDcmVhdGVTdHJ1Y3REZXNjcmlwdG9yKGRJbmRleCwgc3RkOjptb3ZlKGRGaWVsZHMpKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworLy8gRmluZCBvciBhZGQgYSBoaWRsIEJhc2VCbG9jayBvYmplY3QgZnJvbSBhIGdpdmVuIEMySGFuZGxlKiB0byBhIGxpc3QgYW5kIGFuCisvLyBhc3NvY2lhdGVkIG1hcC4KKy8vIE5vdGU6IFRoZSBoYW5kbGUgaXMgbm90IGNsb25lZC4KK2Jvb2wgX2FkZEJhc2VCbG9jaygKKyAgICAgICAgdWludDMyX3QqIGluZGV4LAorICAgICAgICBjb25zdCBDMkhhbmRsZSogaGFuZGxlLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIGlmICghaGFuZGxlKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImFkZEJhc2VCbG9jayBjYWxsZWQgb24gYSBudWxsIEMySGFuZGxlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYXV0byBpdCA9IGJhc2VCbG9ja0luZGljZXMtPmZpbmQoaGFuZGxlKTsKKyAgICBpZiAoaXQgIT0gYmFzZUJsb2NrSW5kaWNlcy0+ZW5kKCkpIHsKKyAgICAgICAgKmluZGV4ID0gaXQtPnNlY29uZDsKKyAgICB9IGVsc2UgeworICAgICAgICAqaW5kZXggPSBiYXNlQmxvY2tzLT5zaXplKCk7CisgICAgICAgIGJhc2VCbG9ja0luZGljZXMtPmVtcGxhY2UoaGFuZGxlLCAqaW5kZXgpOworICAgICAgICBiYXNlQmxvY2tzLT5lbXBsYWNlX2JhY2soKTsKKworICAgICAgICBCYXNlQmxvY2sgJmRCYXNlQmxvY2sgPSBiYXNlQmxvY2tzLT5iYWNrKCk7CisgICAgICAgIC8vIFRoaXMgZG9lcyBub3QgY2xvbmUgdGhlIGhhbmRsZS4KKyAgICAgICAgZEJhc2VCbG9jay5uYXRpdmVCbG9jaygKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCo+KGhhbmRsZSkpOworCisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBGaW5kIG9yIGFkZCBhIGhpZGwgQmFzZUJsb2NrIG9iamVjdCBmcm9tIGEgZ2l2ZW4gQnVmZmVyUG9vbERhdGEgdG8gYSBsaXN0IGFuZAorLy8gYW4gYXNzb2NpYXRlZCBtYXAuCitib29sIF9hZGRCYXNlQmxvY2soCisgICAgICAgIHVpbnQzMl90KiBpbmRleCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiBicERhdGEsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgaWYgKCFicERhdGEpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiYWRkQmFzZUJsb2NrIGNhbGxlZCBvbiBhIG51bGwgQnVmZmVyUG9vbERhdGEuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBhdXRvIGl0ID0gYmFzZUJsb2NrSW5kaWNlcy0+ZmluZChicERhdGEuZ2V0KCkpOworICAgIGlmIChpdCAhPSBiYXNlQmxvY2tJbmRpY2VzLT5lbmQoKSkgeworICAgICAgICAqaW5kZXggPSBpdC0+c2Vjb25kOworICAgIH0gZWxzZSB7CisgICAgICAgICppbmRleCA9IGJhc2VCbG9ja3MtPnNpemUoKTsKKyAgICAgICAgYmFzZUJsb2NrSW5kaWNlcy0+ZW1wbGFjZShicERhdGEuZ2V0KCksICppbmRleCk7CisgICAgICAgIGJhc2VCbG9ja3MtPmVtcGxhY2VfYmFjaygpOworCisgICAgICAgIEJhc2VCbG9jayAmZEJhc2VCbG9jayA9IGJhc2VCbG9ja3MtPmJhY2soKTsKKworICAgICAgICBpZiAoYnVmZmVyUG9vbFNlbmRlcikgeworICAgICAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSBwb29sZWRCbG9jazsKKyAgICAgICAgICAgIFJlc3VsdFN0YXR1cyBicFN0YXR1cyA9IGJ1ZmZlclBvb2xTZW5kZXItPnNlbmQoCisgICAgICAgICAgICAgICAgICAgIGJwRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgJnBvb2xlZEJsb2NrKTsKKworICAgICAgICAgICAgaWYgKGJwU3RhdHVzICE9IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gc2VuZCBidWZmZXIgd2l0aCBCdWZmZXJQb29sLiBFcnJvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oYnBTdGF0dXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZEJhc2VCbG9jay5wb29sZWRCbG9jayhwb29sZWRCbG9jayk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgYWRkQmFzZUJsb2NrKAorICAgICAgICB1aW50MzJfdCogaW5kZXgsCisgICAgICAgIGNvbnN0IEMySGFuZGxlKiBoYW5kbGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBfQzJCbG9ja1Bvb2xEYXRhPiYgYmxvY2tQb29sRGF0YSwKKyAgICAgICAgQnVmZmVyUG9vbFNlbmRlciogYnVmZmVyUG9vbFNlbmRlciwKKyAgICAgICAgc3RkOjpsaXN0PEJhc2VCbG9jaz4qIGJhc2VCbG9ja3MsCisgICAgICAgIHN0ZDo6bWFwPGNvbnN0IHZvaWQqLCB1aW50MzJfdD4qIGJhc2VCbG9ja0luZGljZXMpIHsKKyAgICBpZiAoIWJsb2NrUG9vbERhdGEpIHsKKyAgICAgICAgLy8gTm8gQnVmZmVyUG9vbERhdGEgPT0+IE5BVElWRSBibG9jay4KKyAgICAgICAgcmV0dXJuIF9hZGRCYXNlQmxvY2soCisgICAgICAgICAgICAgICAgaW5kZXgsIGhhbmRsZSwKKyAgICAgICAgICAgICAgICBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKTsKKyAgICB9CisgICAgc3dpdGNoIChibG9ja1Bvb2xEYXRhLT5nZXRUeXBlKCkpIHsKKyAgICBjYXNlIF9DMkJsb2NrUG9vbERhdGE6OlRZUEVfQlVGRkVSUE9PTDogeworICAgICAgICAgICAgLy8gQnVmZmVyUG9vbERhdGEKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gYnBEYXRhOworICAgICAgICAgICAgaWYgKCFfQzJCbG9ja0ZhY3Rvcnk6OkdldEJ1ZmZlclBvb2xEYXRhKGJsb2NrUG9vbERhdGEsICZicERhdGEpCisgICAgICAgICAgICAgICAgICAgIHx8ICFicERhdGEpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJCdWZmZXJQb29sRGF0YSB1bmF2YWlsYWJsZSBpbiBhIGJsb2NrLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIF9hZGRCYXNlQmxvY2soCisgICAgICAgICAgICAgICAgICAgIGluZGV4LCBicERhdGEsCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpOworICAgICAgICB9CisgICAgY2FzZSBfQzJCbG9ja1Bvb2xEYXRhOjpUWVBFX0JVRkZFUlFVRVVFOgorICAgICAgICB1aW50MzJfdCBnZW47CisgICAgICAgIHVpbnQ2NF90IGJxSWQ7CisgICAgICAgIGludDMyX3QgYnFTbG90OworICAgICAgICAvLyBVcGRhdGUgaGFuZGxlIGlmIG1pZ3JhdGlvbiBoYXBwZW5lZC4KKyAgICAgICAgaWYgKF9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUXVldWVEYXRhKAorICAgICAgICAgICAgICAgIGJsb2NrUG9vbERhdGEsICZnZW4sICZicUlkLCAmYnFTbG90KSkgeworICAgICAgICAgICAgYW5kcm9pZDo6TWlncmF0ZU5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90Kj4oaGFuZGxlKSwgZ2VuLCBicUlkLCBicVNsb3QpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfYWRkQmFzZUJsb2NrKAorICAgICAgICAgICAgICAgIGluZGV4LCBoYW5kbGUsCisgICAgICAgICAgICAgICAgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcyk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiVW5rbm93biBDMkJsb2NrUG9vbERhdGEgdHlwZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCisvLyBDMkZlbmNlIC0+IGhpZGxfaGFuZGxlCisvLyBOb3RlOiBGaWxlIGRlc2NyaXB0b3JzIGFyZSBub3QgZHVwbGljYXRlZC4gVGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvciBtdXN0CisvLyBub3QgYmUgY2xvc2VkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCitib29sIG9iamNweShoaWRsX2hhbmRsZSogZCwgY29uc3QgQzJGZW5jZSYgcykgeworICAgICh2b2lkKXM7IC8vIFRPRE86IGltcGxlbWVudCBzLmZkKCkKKyAgICBpbnQgZmVuY2VGZCA9IC0xOworICAgIGQtPnNldFRvKG51bGxwdHIpOworICAgIGlmIChmZW5jZUZkID49IDApIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICAgICAgaWYgKCFoYW5kbGUpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkZhaWxlZCB0byBjcmVhdGUgYSBuYXRpdmUgaGFuZGxlLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaGFuZGxlLT5kYXRhWzBdID0gZmVuY2VGZDsKKyAgICAgICAgZC0+c2V0VG8oaGFuZGxlLCB0cnVlIC8qIG93bnMgKi8pOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJDb25zdExpbmVhckJsb2NrIC0+IEJsb2NrCisvLyBOb3RlOiBOYXRpdmUgaGFuZGxlcyBhcmUgbm90IGR1cGxpY2F0ZWQuIFRoZSBvcmlnaW5hbCBoYW5kbGVzIG11c3Qgbm90IGJlCisvLyBjbG9zZWQgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KK2Jvb2wgb2JqY3B5KEJsb2NrKiBkLCBjb25zdCBDMkNvbnN0TGluZWFyQmxvY2smIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IF9DMkJsb2NrUG9vbERhdGE+IGJwRGF0YSA9CisgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkdldExpbmVhckJsb2NrUG9vbERhdGEocyk7CisgICAgaWYgKCFhZGRCYXNlQmxvY2soJmQtPmluZGV4LCBzLmhhbmRsZSgpLCBicERhdGEsCisgICAgICAgICAgICBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIGJsb2NrIGRhdGEgaW4gQzJDb25zdExpbmVhckJsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgdGhlIG1ldGFkYXRhLgorICAgIEMySGlkbF9SYW5nZUluZm8gZFJhbmdlSW5mbzsKKyAgICBkUmFuZ2VJbmZvLm9mZnNldCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzLm9mZnNldCgpKTsKKyAgICBkUmFuZ2VJbmZvLmxlbmd0aCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzLnNpemUoKSk7CisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZkLT5tZXRhLCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj57ICZkUmFuZ2VJbmZvIH0pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgcmFuZ2UgaW5mbyBpbiBDMkNvbnN0TGluZWFyQmxvY2suIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIENvcHkgdGhlIGZlbmNlCisgICAgaWYgKCFvYmpjcHkoJmQtPmZlbmNlLCBzLmZlbmNlKCkpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJDb25zdExpbmVhckJsb2NrOjpmZW5jZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkNvbnN0R3JhcGhpY0Jsb2NrIC0+IEJsb2NrCisvLyBOb3RlOiBOYXRpdmUgaGFuZGxlcyBhcmUgbm90IGR1cGxpY2F0ZWQuIFRoZSBvcmlnaW5hbCBoYW5kbGVzIG11c3Qgbm90IGJlCisvLyBjbG9zZWQgYmVmb3JlIHRoZSB0cmFuc2FjdGlvbiBpcyBjb21wbGV0ZS4KK2Jvb2wgb2JqY3B5KEJsb2NrKiBkLCBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBfQzJCbG9ja1Bvb2xEYXRhPiBicERhdGEgPQorICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YShzKTsKKyAgICBpZiAoIWFkZEJhc2VCbG9jaygmZC0+aW5kZXgsIHMuaGFuZGxlKCksIGJwRGF0YSwKKyAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgYmxvY2sgZGF0YSBpbiBDMkNvbnN0R3JhcGhpY0Jsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgdGhlIG1ldGFkYXRhLgorICAgIEMySGlkbF9SZWN0SW5mbyBkUmVjdEluZm87CisgICAgQzJSZWN0IHNSZWN0ID0gcy5jcm9wKCk7CisgICAgZFJlY3RJbmZvLmxlZnQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc1JlY3QubGVmdCk7CisgICAgZFJlY3RJbmZvLnRvcCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzUmVjdC50b3ApOworICAgIGRSZWN0SW5mby53aWR0aCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzUmVjdC53aWR0aCk7CisgICAgZFJlY3RJbmZvLmhlaWdodCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihzUmVjdC5oZWlnaHQpOworICAgIGlmICghY3JlYXRlUGFyYW1zQmxvYigmZC0+bWV0YSwgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+eyAmZFJlY3RJbmZvIH0pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgcmVjdCBpbmZvIGluIEMyQ29uc3RHcmFwaGljQmxvY2suIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIENvcHkgdGhlIGZlbmNlCisgICAgaWYgKCFvYmpjcHkoJmQtPmZlbmNlLCBzLmZlbmNlKCkpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJDb25zdEdyYXBoaWNCbG9jazo6ZmVuY2UuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJCdWZmZXJEYXRhIC0+IEJ1ZmZlcgorLy8gVGhpcyBmdW5jdGlvbiBvbmx5IGZpbGxzIGluIGQtPmJsb2Nrcy4KK2Jvb2wgb2JqY3B5KEJ1ZmZlciogZCwgY29uc3QgQzJCdWZmZXJEYXRhJiBzLAorICAgICAgICBCdWZmZXJQb29sU2VuZGVyKiBidWZmZXJQb29sU2VuZGVyLAorICAgICAgICBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiogYmFzZUJsb2NrcywKKyAgICAgICAgc3RkOjptYXA8Y29uc3Qgdm9pZCosIHVpbnQzMl90PiogYmFzZUJsb2NrSW5kaWNlcykgeworICAgIGQtPmJsb2Nrcy5yZXNpemUoCisgICAgICAgICAgICBzLmxpbmVhckJsb2NrcygpLnNpemUoKSArCisgICAgICAgICAgICBzLmdyYXBoaWNCbG9ja3MoKS5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IEMyQ29uc3RMaW5lYXJCbG9jayYgbGluZWFyQmxvY2sgOiBzLmxpbmVhckJsb2NrcygpKSB7CisgICAgICAgIEJsb2NrJiBkQmxvY2sgPSBkLT5ibG9ja3NbaSsrXTsKKyAgICAgICAgaWYgKCFvYmpjcHkoCisgICAgICAgICAgICAgICAgJmRCbG9jaywgbGluZWFyQmxvY2ssCisgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJCdWZmZXJEYXRhOjpsaW5lYXJCbG9ja3MuICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIihEZXN0aW5hdGlvbiBpbmRleCA9ICIgPDwgaSAtIDEgPDwgIi4pIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGdyYXBoaWNCbG9jayA6IHMuZ3JhcGhpY0Jsb2NrcygpKSB7CisgICAgICAgIEJsb2NrJiBkQmxvY2sgPSBkLT5ibG9ja3NbaSsrXTsKKyAgICAgICAgaWYgKCFvYmpjcHkoCisgICAgICAgICAgICAgICAgJmRCbG9jaywgZ3JhcGhpY0Jsb2NrLAorICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQnVmZmVyRGF0YTo6Z3JhcGhpY0Jsb2Nrcy4gIgorICAgICAgICAgICAgICAgICAgICAgICA8PCAiKERlc3RpbmF0aW9uIGluZGV4ID0gIiA8PCBpIC0gMSA8PCAiLikiOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkJ1ZmZlciAtPiBCdWZmZXIKK2Jvb2wgb2JqY3B5KEJ1ZmZlciogZCwgY29uc3QgQzJCdWZmZXImIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZkLT5pbmZvLCBzLmluZm8oKSkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMkJ1ZmZlcjo6aW5mby4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghb2JqY3B5KGQsIHMuZGF0YSgpLCBidWZmZXJQb29sU2VuZGVyLCBiYXNlQmxvY2tzLCBiYXNlQmxvY2tJbmRpY2VzKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQnVmZmVyOjpkYXRhLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEMySW5mb0J1ZmZlciAtPiBJbmZvQnVmZmVyCitib29sIG9iamNweShJbmZvQnVmZmVyKiBkLCBjb25zdCBDMkluZm9CdWZmZXImIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgLy8gVE9ETzogQzJJbmZvQnVmZmVyIGlzIG5vdCBpbXBsZW1lbnRlZC4KKyAgICAodm9pZClkOworICAgICh2b2lkKXM7CisgICAgKHZvaWQpYnVmZmVyUG9vbFNlbmRlcjsKKyAgICAodm9pZCliYXNlQmxvY2tzOworICAgICh2b2lkKWJhc2VCbG9ja0luZGljZXM7CisgICAgTE9HKElORk8pIDw8ICJJbmZvQnVmZmVyIG5vdCBpbXBsZW1lbnRlZC4iOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkZyYW1lRGF0YSAtPiBGcmFtZURhdGEKK2Jvb2wgb2JqY3B5KEZyYW1lRGF0YSogZCwgY29uc3QgQzJGcmFtZURhdGEmIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIsCisgICAgICAgIHN0ZDo6bGlzdDxCYXNlQmxvY2s+KiBiYXNlQmxvY2tzLAorICAgICAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+KiBiYXNlQmxvY2tJbmRpY2VzKSB7CisgICAgZC0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDxoaWRsX2JpdGZpZWxkPEZyYW1lRGF0YTo6RmxhZ3M+PihzLmZsYWdzKTsKKyAgICBpZiAoIW9iamNweSgmZC0+b3JkaW5hbCwgcy5vcmRpbmFsKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyRnJhbWVEYXRhOjpvcmRpbmFsLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBkLT5idWZmZXJzLnJlc2l6ZShzLmJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+JiBzQnVmZmVyIDogcy5idWZmZXJzKSB7CisgICAgICAgIEJ1ZmZlciYgZEJ1ZmZlciA9IGQtPmJ1ZmZlcnNbaSsrXTsKKyAgICAgICAgaWYgKCFzQnVmZmVyKSB7CisgICAgICAgICAgICAvLyBBIG51bGwgKHBvaW50ZXIgdG8pIEMyQnVmZmVyIGNvcnJlc3BvbmRzIHRvIGEgQnVmZmVyIHdpdGggZW1wdHkKKyAgICAgICAgICAgIC8vIGluZm8gYW5kIGJsb2Nrcy4KKyAgICAgICAgICAgIGRCdWZmZXIuaW5mby5yZXNpemUoMCk7CisgICAgICAgICAgICBkQnVmZmVyLmJsb2Nrcy5yZXNpemUoMCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIW9iamNweSgKKyAgICAgICAgICAgICAgICAmZEJ1ZmZlciwgKnNCdWZmZXIsCisgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgYmFzZUJsb2NrcywgYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJGcmFtZURhdGE6OmJ1ZmZlcnNbIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBpIC0gMSA8PCAiXS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZkLT5jb25maWdVcGRhdGUsIHMuY29uZmlnVXBkYXRlKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyRnJhbWVEYXRhOjpjb25maWdVcGRhdGUuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGQtPmluZm9CdWZmZXJzLnJlc2l6ZShzLmluZm9CdWZmZXJzLnNpemUoKSk7CisgICAgaSA9IDA7CisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvQnVmZmVyPiYgc0luZm9CdWZmZXIgOiBzLmluZm9CdWZmZXJzKSB7CisgICAgICAgIEluZm9CdWZmZXImIGRJbmZvQnVmZmVyID0gZC0+aW5mb0J1ZmZlcnNbaSsrXTsKKyAgICAgICAgaWYgKCFzSW5mb0J1ZmZlcikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTnVsbCBDMkZyYW1lRGF0YTo6aW5mb0J1ZmZlcnNbIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBpIC0gMSA8PCAiXS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghb2JqY3B5KCZkSW5mb0J1ZmZlciwgKnNJbmZvQnVmZmVyLAorICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsIGJhc2VCbG9ja3MsIGJhc2VCbG9ja0luZGljZXMpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyRnJhbWVEYXRhOjppbmZvQnVmZmVyc1siCisgICAgICAgICAgICAgICAgICAgICAgIDw8IGkgLSAxIDw8ICJdLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCisvLyBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcidzIGltcGxlbWVudGF0aW9uCisKK0RlZmF1bHRCdWZmZXJQb29sU2VuZGVyOjpEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcigKKyAgICAgICAgY29uc3Qgc3A8SUNsaWVudE1hbmFnZXI+JiByZWNlaXZlck1hbmFnZXIsCisgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIHJlZnJlc2hJbnRlcnZhbCkKKyAgICA6IG1SZWNlaXZlck1hbmFnZXIocmVjZWl2ZXJNYW5hZ2VyKSwKKyAgICAgIG1Tb3VyY2VDb25uZWN0aW9uSWQoMCksCisgICAgICBtTGFzdFNlbnQoc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkpLAorICAgICAgbVJlZnJlc2hJbnRlcnZhbChyZWZyZXNoSW50ZXJ2YWwpIHsKK30KKwordm9pZCBEZWZhdWx0QnVmZmVyUG9vbFNlbmRlcjo6c2V0UmVjZWl2ZXIoCisgICAgICAgIGNvbnN0IHNwPElDbGllbnRNYW5hZ2VyPiYgcmVjZWl2ZXJNYW5hZ2VyLAorICAgICAgICBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiByZWZyZXNoSW50ZXJ2YWwpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgIGlmIChtUmVjZWl2ZXJNYW5hZ2VyICE9IHJlY2VpdmVyTWFuYWdlcikgeworICAgICAgICBtUmVjZWl2ZXJNYW5hZ2VyID0gcmVjZWl2ZXJNYW5hZ2VyOworICAgIH0KKyAgICBtUmVmcmVzaEludGVydmFsID0gcmVmcmVzaEludGVydmFsOworfQorCitSZXN1bHRTdGF0dXMgRGVmYXVsdEJ1ZmZlclBvb2xTZW5kZXI6OnNlbmQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4mIGJwRGF0YSwKKyAgICAgICAgQnVmZmVyU3RhdHVzTWVzc2FnZSogYnBNZXNzYWdlKSB7CisgICAgaWYgKCFtUmVjZWl2ZXJNYW5hZ2VyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIGFjY2VzcyB0byByZWNlaXZlcidzIEJ1ZmZlclBvb2wuIjsKKyAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Tk9UX0ZPVU5EOworICAgIH0KKyAgICBSZXN1bHRTdGF0dXMgcnM7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBpZiAoIW1TZW5kZXJNYW5hZ2VyKSB7CisgICAgICAgIG1TZW5kZXJNYW5hZ2VyID0gQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICAgICAgaWYgKCFtU2VuZGVyTWFuYWdlcikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJldHJpZXZlIGxvY2FsIEJ1ZmZlclBvb2wgQ2xpZW50TWFuYWdlci4iOworICAgICAgICAgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgaW50NjRfdCBjb25uZWN0aW9uSWQgPSBicERhdGEtPm1Db25uZWN0aW9uSWQ7CisgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6dGltZV9wb2ludCBub3cgPQorICAgICAgICAgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCk7CisgICAgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6ZHVyYXRpb24gaW50ZXJ2YWwgPSBub3cgLSBtTGFzdFNlbnQ7CisgICAgaWYgKG1Tb3VyY2VDb25uZWN0aW9uSWQgPT0gMCB8fAorICAgICAgICAgICAgbVNvdXJjZUNvbm5lY3Rpb25JZCAhPSBjb25uZWN0aW9uSWQgfHwKKyAgICAgICAgICAgIGludGVydmFsID4gbVJlZnJlc2hJbnRlcnZhbCkgeworICAgICAgICAvLyBJbml0aWFsaXplIHRoZSBidWZmZXJwb29sIGNvbm5lY3Rpb24uCisgICAgICAgIG1Tb3VyY2VDb25uZWN0aW9uSWQgPSBjb25uZWN0aW9uSWQ7CisgICAgICAgIGlmIChtU291cmNlQ29ubmVjdGlvbklkID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaW50NjRfdCByZWNlaXZlckNvbm5lY3Rpb25JZDsKKyAgICAgICAgcnMgPSBtU2VuZGVyTWFuYWdlci0+cmVnaXN0ZXJTZW5kZXIobVJlY2VpdmVyTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVjZWl2ZXJDb25uZWN0aW9uSWQpOworICAgICAgICBpZiAoKHJzICE9IFJlc3VsdFN0YXR1czo6T0spICYmIChycyAhPSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTKSkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJyZWdpc3RlclNlbmRlciAtLSByZXR1cm5lZCBlcnJvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PGludDMyX3Q+KHJzKQorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgICAgIHJldHVybiByczsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1SZWNlaXZlckNvbm5lY3Rpb25JZCA9IHJlY2VpdmVyQ29ubmVjdGlvbklkOworICAgICAgICB9CisgICAgfQorCisgICAgdWludDY0X3QgdHJhbnNhY3Rpb25JZDsKKyAgICBpbnQ2NF90IHRpbWVzdGFtcFVzOworICAgIHJzID0gbVNlbmRlck1hbmFnZXItPnBvc3RTZW5kKAorICAgICAgICAgICAgbVJlY2VpdmVyQ29ubmVjdGlvbklkLCBicERhdGEsICZ0cmFuc2FjdGlvbklkLCAmdGltZXN0YW1wVXMpOworICAgIGlmIChycyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNsaWVudE1hbmFnZXI6OnBvc3RTZW5kIC0tIHJldHVybmVkIGVycm9yOiAiCisgICAgICAgICAgICAgICAgICAgPDwgc3RhdGljX2Nhc3Q8aW50MzJfdD4ocnMpCisgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICByZXR1cm4gcnM7CisgICAgfQorICAgIGlmICghYnBNZXNzYWdlKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIk51bGwgb3V0cHV0IHBhcmFtZXRlciBmb3IgQnVmZmVyU3RhdHVzTWVzc2FnZS4iOworICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpDUklUSUNBTF9FUlJPUjsKKyAgICB9CisgICAgYnBNZXNzYWdlLT5jb25uZWN0aW9uSWQgPSBtUmVjZWl2ZXJDb25uZWN0aW9uSWQ7CisgICAgYnBNZXNzYWdlLT5idWZmZXJJZCA9IGJwRGF0YS0+bUlkOworICAgIGJwTWVzc2FnZS0+dHJhbnNhY3Rpb25JZCA9IHRyYW5zYWN0aW9uSWQ7CisgICAgYnBNZXNzYWdlLT50aW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOworICAgIG1MYXN0U2VudCA9IG5vdzsKKyAgICByZXR1cm4gcnM7Cit9CisKKy8vIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gLT4gV29ya0J1bmRsZQorYm9vbCBvYmpjcHkoCisgICAgICAgIFdvcmtCdW5kbGUqIGQsCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHMsCisgICAgICAgIEJ1ZmZlclBvb2xTZW5kZXIqIGJ1ZmZlclBvb2xTZW5kZXIpIHsKKyAgICAvLyBiYXNlQmxvY2tzIGhvbGRzIGEgbGlzdCBvZiBCYXNlQmxvY2sgb2JqZWN0cyB0aGF0IEJsb2NrcyBjYW4gcmVmZXIgdG8uCisgICAgc3RkOjpsaXN0PEJhc2VCbG9jaz4gYmFzZUJsb2NrczsKKworICAgIC8vIGJhc2VCbG9ja0luZGljZXMgbWFwcyBhIHJhdyBwb2ludGVyIHRvIG5hdGl2ZV9oYW5kbGVfdCBvciBCdWZmZXJQb29sRGF0YQorICAgIC8vIGluc2lkZSBiYXNlQmxvY2tzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGluZGV4IGludG8gYmFzZUJsb2Nrcy4gVGhlIGtleXMKKyAgICAvLyAocG9pbnRlcnMpIGFyZSB1c2VkIHRvIGlkZW50aWZ5IGJsb2NrcyB0aGF0IGhhdmUgdGhlIHNhbWUgImJhc2UgYmxvY2siIGluCisgICAgLy8gcywgYSBsaXN0IG9mIEMyV29yayBvYmplY3RzLiBCZWNhdXNlIGJhc2VCbG9ja3Mgd2lsbCBiZSBjb3BpZWQgaW50byBhCisgICAgLy8gaGlkbF92ZWMgZXZlbnR1YWxseSwgdGhlIHZhbHVlcyBvZiBiYXNlQmxvY2tJbmRpY2VzIGFyZSB6ZXJvLWJhc2VkCisgICAgLy8gaW50ZWdlciBpbmRpY2VzIGluc3RlYWQgb2YgbGlzdCBpdGVyYXRvcnMuCisgICAgLy8KKyAgICAvLyBOb3RlIHRoYXQgdGhlIHBvaW50ZXJzIGNhbiBiZSByYXcgYmVjYXVzZSBiYXNlQmxvY2tJbmRpY2VzIGhhcyBhIHNob3J0ZXIKKyAgICAvLyBsaWZlc3BhbiB0aGFuIGFsbCBvZiBiYXNlIGJsb2Nrcy4KKyAgICBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgdWludDMyX3Q+IGJhc2VCbG9ja0luZGljZXM7CisKKyAgICBkLT53b3Jrcy5yZXNpemUocy5zaXplKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiBzV29yayA6IHMpIHsKKyAgICAgICAgV29yayAmZFdvcmsgPSBkLT53b3Jrc1tpKytdOworICAgICAgICBpZiAoIXNXb3JrKSB7CisgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIk51bGwgQzJXb3JrIGVuY291bnRlcmVkLiI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNoYWluIGluZm8gaXMgbm90IGluIHVzZSBjdXJyZW50bHkuCisKKyAgICAgICAgLy8gaW5wdXQKKyAgICAgICAgaWYgKCFvYmpjcHkoJmRXb3JrLmlucHV0LCBzV29yay0+aW5wdXQsCisgICAgICAgICAgICAgICAgYnVmZmVyUG9vbFNlbmRlciwgJmJhc2VCbG9ja3MsICZiYXNlQmxvY2tJbmRpY2VzKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMldvcms6OmlucHV0LiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyB3b3JrbGV0cworICAgICAgICBpZiAoc1dvcmstPndvcmtsZXRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJXb3JrIHdpdGggbm8gd29ya2xldHMuIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFBhcmNlbCB0aGUgd29ya2xldHMuCisgICAgICAgICAgICBoaWRsX3ZlYzxXb3JrbGV0PiAmZFdvcmtsZXRzID0gZFdvcmsud29ya2xldHM7CisgICAgICAgICAgICBkV29ya2xldHMucmVzaXplKHNXb3JrLT53b3JrbGV0cy5zaXplKCkpOworICAgICAgICAgICAgc2l6ZV90IGogPSAwOworICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrbGV0PiYgc1dvcmtsZXQgOiBzV29yay0+d29ya2xldHMpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFzV29ya2xldCkgeworICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgIk51bGwgQzJXb3JrOjp3b3JrbGV0c1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIDw8ICJdLiI7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBXb3JrbGV0ICZkV29ya2xldCA9IGRXb3JrbGV0c1tqKytdOworCisgICAgICAgICAgICAgICAgLy8gY29tcG9uZW50IGlkCisgICAgICAgICAgICAgICAgZFdvcmtsZXQuY29tcG9uZW50SWQgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBzV29ya2xldC0+Y29tcG9uZW50KTsKKworICAgICAgICAgICAgICAgIC8vIHR1bmluZ3MKKyAgICAgICAgICAgICAgICBpZiAoIWNyZWF0ZVBhcmFtc0Jsb2IoJmRXb3JrbGV0LnR1bmluZ3MsIHNXb3JrbGV0LT50dW5pbmdzKSkgeworICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyV29yazo6d29ya2xldHNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGogLSAxIDw8ICJdLT50dW5pbmdzLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBmYWlsdXJlcworICAgICAgICAgICAgICAgIGRXb3JrbGV0LmZhaWx1cmVzLnJlc2l6ZShzV29ya2xldC0+ZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBzaXplX3QgayA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiYgc0ZhaWx1cmUgOgorICAgICAgICAgICAgICAgICAgICAgICAgc1dvcmtsZXQtPmZhaWx1cmVzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc0ZhaWx1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiTnVsbCBDMldvcms6OndvcmtsZXRzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIC0gMSA8PCAiXS0+ZmFpbHVyZXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGsgPDwgIl0uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KCZkV29ya2xldC5mYWlsdXJlc1trKytdLCAqc0ZhaWx1cmUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyV29yazo6d29ya2xldHNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIC0gMSA8PCAiXS0+ZmFpbHVyZXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBrIC0gMSA8PCAiXS4iOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gb3V0cHV0CisgICAgICAgICAgICAgICAgaWYgKCFvYmpjcHkoJmRXb3JrbGV0Lm91dHB1dCwgc1dvcmtsZXQtPm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclBvb2xTZW5kZXIsICZiYXNlQmxvY2tzLCAmYmFzZUJsb2NrSW5kaWNlcykpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBDMldvcms6OndvcmtsZXRzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBqIC0gMSA8PCAiXS0+b3V0cHV0LiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyB3b3JrbGV0cyBwcm9jZXNzZWQKKyAgICAgICAgZFdvcmsud29ya2xldHNQcm9jZXNzZWQgPSBzV29yay0+d29ya2xldHNQcm9jZXNzZWQ7CisKKyAgICAgICAgLy8gcmVzdWx0CisgICAgICAgIGRXb3JrLnJlc3VsdCA9IHN0YXRpY19jYXN0PFN0YXR1cz4oc1dvcmstPnJlc3VsdCk7CisgICAgfQorCisgICAgLy8gQ29weSBzdGQ6Omxpc3Q8QmFzZUJsb2NrPiB0byBoaWRsX3ZlYzxCYXNlQmxvY2s+LgorICAgIHsKKyAgICAgICAgZC0+YmFzZUJsb2Nrcy5yZXNpemUoYmFzZUJsb2Nrcy5zaXplKCkpOworICAgICAgICBzaXplX3QgaSA9IDA7CisgICAgICAgIGZvciAoY29uc3QgQmFzZUJsb2NrJiBiYXNlQmxvY2sgOiBiYXNlQmxvY2tzKSB7CisgICAgICAgICAgICBkLT5iYXNlQmxvY2tzW2krK10gPSBiYXNlQmxvY2s7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitzdHJ1Y3QgQzJCYXNlQmxvY2sgeworICAgIGVudW0gdHlwZV90IHsKKyAgICAgICAgTElORUFSLAorICAgICAgICBHUkFQSElDLAorICAgIH07CisgICAgdHlwZV90IHR5cGU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGxpbmVhcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGdyYXBoaWM7Cit9OworCisvLyBoaWRsX2hhbmRsZSAtPiBDMkZlbmNlCisvLyBOb3RlOiBGaWxlIGRlc2NyaXB0b3JzIGFyZSBub3QgZHVwbGljYXRlZC4gVGhlIG9yaWdpbmFsIGZpbGUgZGVzY3JpcHRvciBtdXN0CisvLyBub3QgYmUgY2xvc2VkIGJlZm9yZSB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUuCitib29sIG9iamNweShDMkZlbmNlKiBkLCBjb25zdCBoaWRsX2hhbmRsZSYgcykgeworICAgIC8vIFRPRE86IEltcGxlbWVudC4KKyAgICAodm9pZClzOworICAgICpkID0gQzJGZW5jZSgpOworICAgIHJldHVybiB0cnVlOworfQorCisvLyBDMkxpbmVhckJsb2NrLCB2ZWN0b3I8QzJQYXJhbSo+LCBDMkZlbmNlIC0+IEMyQnVmZmVyCitib29sIGNyZWF0ZUxpbmVhckJ1ZmZlcigKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiogYnVmZmVyLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4mIGJsb2NrLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4mIG1ldGEsCisgICAgICAgIGNvbnN0IEMyRmVuY2UmIGZlbmNlKSB7CisgICAgLy8gQ2hlY2sgdGhlIGJsb2NrIG1ldGEuIEl0IHNob3VsZCBoYXZlIGV4YWN0bHkgMSBDMkluZm86CisgICAgLy8gQzJIaWRsX1JhbmdlSW5mby4KKyAgICBpZiAoKG1ldGEuc2l6ZSgpICE9IDEpIHx8ICFtZXRhWzBdKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJMaW5lYXJCbG9jazo6bWV0YS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChtZXRhWzBdLT5zaXplKCkgIT0gc2l6ZW9mKEMySGlkbF9SYW5nZUluZm8pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgcmFuZ2UgaW5mbyBpbiBDMkxpbmVhckJsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQzJIaWRsX1JhbmdlSW5mbyAqcmFuZ2VJbmZvID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QzJIaWRsX1JhbmdlSW5mbyo+KG1ldGFbMF0pOworCisgICAgLy8gQ3JlYXRlIEMyQnVmZmVyIGZyb20gQzJMaW5lYXJCbG9jay4KKyAgICAqYnVmZmVyID0gQzJCdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcihibG9jay0+c2hhcmUoCisgICAgICAgICAgICByYW5nZUluZm8tPm9mZnNldCwgcmFuZ2VJbmZvLT5sZW5ndGgsCisgICAgICAgICAgICBmZW5jZSkpOworICAgIGlmICghKCpidWZmZXIpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkNyZWF0ZUxpbmVhckJ1ZmZlciBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQzJHcmFwaGljQmxvY2ssIHZlY3RvcjxDMlBhcmFtKj4sIEMyRmVuY2UgLT4gQzJCdWZmZXIKK2Jvb2wgY3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiogYnVmZmVyLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+JiBibG9jaywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiBtZXRhLAorICAgICAgICBjb25zdCBDMkZlbmNlJiBmZW5jZSkgeworICAgIC8vIENoZWNrIHRoZSBibG9jayBtZXRhLiBJdCBzaG91bGQgaGF2ZSBleGFjdGx5IDEgQzJJbmZvOgorICAgIC8vIEMySGlkbF9SZWN0SW5mby4KKyAgICBpZiAoKG1ldGEuc2l6ZSgpICE9IDEpIHx8ICFtZXRhWzBdKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJHcmFwaGljQmxvY2s6Om1ldGEuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobWV0YVswXS0+c2l6ZSgpICE9IHNpemVvZihDMkhpZGxfUmVjdEluZm8pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgcmVjdCBpbmZvIGluIEMyR3JhcGhpY0Jsb2NrLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQzJIaWRsX1JlY3RJbmZvICpyZWN0SW5mbyA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEMySGlkbF9SZWN0SW5mbyo+KG1ldGFbMF0pOworCisgICAgLy8gQ3JlYXRlIEMyQnVmZmVyIGZyb20gQzJHcmFwaGljQmxvY2suCisgICAgKmJ1ZmZlciA9IEMyQnVmZmVyOjpDcmVhdGVHcmFwaGljQnVmZmVyKGJsb2NrLT5zaGFyZSgKKyAgICAgICAgICAgIEMyUmVjdChyZWN0SW5mby0+d2lkdGgsIHJlY3RJbmZvLT5oZWlnaHQpLgorICAgICAgICAgICAgYXQocmVjdEluZm8tPmxlZnQsIHJlY3RJbmZvLT50b3ApLAorICAgICAgICAgICAgZmVuY2UpKTsKKyAgICBpZiAoISgqYnVmZmVyKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDcmVhdGVHcmFwaGljQnVmZmVyIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBCdWZmZXIgLT4gQzJCdWZmZXIKKy8vIE5vdGU6IFRoZSBuYXRpdmUgaGFuZGxlcyB3aWxsIGJlIGNsb25lZC4KK2Jvb2wgb2JqY3B5KHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4qIGQsIGNvbnN0IEJ1ZmZlciYgcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJCYXNlQmxvY2s+JiBiYXNlQmxvY2tzKSB7CisgICAgKmQgPSBudWxscHRyOworCisgICAgLy8gQ3VycmVudGx5LCBhIG5vbi1udWxsIEMyQnVmZmVyIG11c3QgY29udGFpbiBleGFjdGx5IDEgYmxvY2suCisgICAgaWYgKHMuYmxvY2tzLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAocy5ibG9ja3Muc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBCdWZmZXI6ICIKKyAgICAgICAgICAgICAgICAgICAgICAiQ3VycmVudGx5LCBhIEMyQnVmZmVyIG11c3QgY29udGFpbiBleGFjdGx5IDEgYmxvY2suIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IEJsb2NrICZzQmxvY2sgPSBzLmJsb2Nrc1swXTsKKyAgICBpZiAoc0Jsb2NrLmluZGV4ID49IGJhc2VCbG9ja3Muc2l6ZSgpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQnVmZmVyOjpibG9ja3NbMF0uaW5kZXg6ICIKKyAgICAgICAgICAgICAgICAgICAgICAiQXJyYXkgaW5kZXggb3V0IG9mIHJhbmdlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3QgQzJCYXNlQmxvY2sgJmJhc2VCbG9jayA9IGJhc2VCbG9ja3Nbc0Jsb2NrLmluZGV4XTsKKworICAgIC8vIFBhcnNlIG1ldGEuCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHNCbG9ja01ldGE7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnNCbG9ja01ldGEsIHNCbG9jay5tZXRhKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEJ1ZmZlcjo6YmxvY2tzWzBdLm1ldGEuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIENvcHkgZmVuY2UuCisgICAgQzJGZW5jZSBkRmVuY2U7CisgICAgaWYgKCFvYmpjcHkoJmRGZW5jZSwgc0Jsb2NrLmZlbmNlKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEJ1ZmZlcjo6YmxvY2tzWzBdLmZlbmNlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBDb25zdHJ1Y3QgYSBibG9jay4KKyAgICBzd2l0Y2ggKGJhc2VCbG9jay50eXBlKSB7CisgICAgY2FzZSBDMkJhc2VCbG9jazo6TElORUFSOgorICAgICAgICBpZiAoIWNyZWF0ZUxpbmVhckJ1ZmZlcihkLCBiYXNlQmxvY2subGluZWFyLCBzQmxvY2tNZXRhLCBkRmVuY2UpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQmFzZUJsb2NrOjpsaW5lYXIuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEMyQmFzZUJsb2NrOjpHUkFQSElDOgorICAgICAgICBpZiAoIWNyZWF0ZUdyYXBoaWNCdWZmZXIoZCwgYmFzZUJsb2NrLmdyYXBoaWMsIHNCbG9ja01ldGEsIGRGZW5jZSkpIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQzJCYXNlQmxvY2s6OmdyYXBoaWMuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEMyQmFzZUJsb2NrOjp0eXBlLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBQYXJzZSBpbmZvCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtczsKKyAgICBpZiAoIXBhcnNlUGFyYW1zQmxvYigmcGFyYW1zLCBzLmluZm8pKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgQnVmZmVyOjppbmZvLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yIChDMlBhcmFtKiBwYXJhbSA6IHBhcmFtcykgeworICAgICAgICBpZiAocGFyYW0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTnVsbCBwYXJhbSBpbiBCdWZmZXI6OmluZm8uIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gYzJwYXJhbXsKKyAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3B5KCpwYXJhbSkucmVsZWFzZSgpfTsKKyAgICAgICAgaWYgKCFjMnBhcmFtKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIHBhcmFtIGluIEJ1ZmZlcjo6aW5mby4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICAgICAgKCpkKS0+c2V0SW5mbyhzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJJbmZvPihjMnBhcmFtKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkMyQnVmZmVyOjpzZXRJbmZvIGZhaWxlZC4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEZyYW1lRGF0YSAtPiBDMkZyYW1lRGF0YQorYm9vbCBvYmpjcHkoQzJGcmFtZURhdGEqIGQsIGNvbnN0IEZyYW1lRGF0YSYgcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJCYXNlQmxvY2s+JiBiYXNlQmxvY2tzKSB7CisgICAgZC0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDxDMkZyYW1lRGF0YTo6ZmxhZ3NfdD4ocy5mbGFncyk7CisgICAgaWYgKCFvYmpjcHkoJmQtPm9yZGluYWwsIHMub3JkaW5hbCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBGcmFtZURhdGE6Om9yZGluYWwuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkLT5idWZmZXJzLmNsZWFyKCk7CisgICAgZC0+YnVmZmVycy5yZXNlcnZlKHMuYnVmZmVycy5zaXplKCkpOworICAgIGZvciAoY29uc3QgQnVmZmVyJiBzQnVmZmVyIDogcy5idWZmZXJzKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gZEJ1ZmZlcjsKKyAgICAgICAgaWYgKCFvYmpjcHkoJmRCdWZmZXIsIHNCdWZmZXIsIGJhc2VCbG9ja3MpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIEZyYW1lRGF0YTo6YnVmZmVycy4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGQtPmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKGRCdWZmZXIpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbXM7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtcywgcy5jb25maWdVcGRhdGUpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgIkludmFsaWQgRnJhbWVEYXRhOjpjb25maWdVcGRhdGUuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBkLT5jb25maWdVcGRhdGUuY2xlYXIoKTsKKyAgICBmb3IgKEMyUGFyYW0qIHBhcmFtIDogcGFyYW1zKSB7CisgICAgICAgIGQtPmNvbmZpZ1VwZGF0ZS5lbXBsYWNlX2JhY2soQzJQYXJhbTo6Q29weSgqcGFyYW0pKTsKKyAgICAgICAgaWYgKCFkLT5jb25maWdVcGRhdGUuYmFjaygpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmV4cGVjdGVkIGVycm9yIHdoaWxlIHBhcnNpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiRnJhbWVEYXRhOjpjb25maWdVcGRhdGUuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIG9uY2UgQzJJbmZvQnVmZmVyIGhhcyBjb25zdHJ1Y3RvcnMuCisgICAgZC0+aW5mb0J1ZmZlcnMuY2xlYXIoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQmFzZUJsb2NrIC0+IEMyQmFzZUJsb2NrCitib29sIG9iamNweShDMkJhc2VCbG9jayogZCwgY29uc3QgQmFzZUJsb2NrJiBzKSB7CisgICAgc3dpdGNoIChzLmdldERpc2NyaW1pbmF0b3IoKSkgeworICAgIGNhc2UgQmFzZUJsb2NrOjpoaWRsX2Rpc2NyaW1pbmF0b3I6Om5hdGl2ZUJsb2NrOiB7CisgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIHNIYW5kbGUgPQorICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb25lKHMubmF0aXZlQmxvY2soKSk7CisgICAgICAgICAgICBpZiAoc0hhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiTnVsbCBCYXNlQmxvY2s6Om5hdGl2ZUJsb2NrLiI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKnNDMkhhbmRsZSA9CisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQzJIYW5kbGUqPihzSGFuZGxlKTsKKworICAgICAgICAgICAgZC0+bGluZWFyID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhzQzJIYW5kbGUpOworICAgICAgICAgICAgaWYgKGQtPmxpbmVhcikgeworICAgICAgICAgICAgICAgIGQtPnR5cGUgPSBDMkJhc2VCbG9jazo6TElORUFSOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkLT5ncmFwaGljID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soc0MySGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChkLT5ncmFwaGljKSB7CisgICAgICAgICAgICAgICAgZC0+dHlwZSA9IEMyQmFzZUJsb2NrOjpHUkFQSElDOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIGhhbmRsZSB0eXBlIGluIEJhc2VCbG9jazo6bmF0aXZlQmxvY2suIjsKKyAgICAgICAgICAgIGlmIChzSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZShzSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShzSGFuZGxlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIGNhc2UgQmFzZUJsb2NrOjpoaWRsX2Rpc2NyaW1pbmF0b3I6OnBvb2xlZEJsb2NrOiB7CisgICAgICAgICAgICBjb25zdCBCdWZmZXJTdGF0dXNNZXNzYWdlICZicE1lc3NhZ2UgPQorICAgICAgICAgICAgICAgICAgICBzLnBvb2xlZEJsb2NrKCk7CisgICAgICAgICAgICBzcDxDbGllbnRNYW5hZ2VyPiBicCA9IENsaWVudE1hbmFnZXI6OmdldEluc3RhbmNlKCk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJwRGF0YTsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqY0hhbmRsZTsKKyAgICAgICAgICAgIFJlc3VsdFN0YXR1cyBicFN0YXR1cyA9IGJwLT5yZWNlaXZlKAorICAgICAgICAgICAgICAgICAgICBicE1lc3NhZ2UuY29ubmVjdGlvbklkLAorICAgICAgICAgICAgICAgICAgICBicE1lc3NhZ2UudHJhbnNhY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgYnBNZXNzYWdlLmJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICBicE1lc3NhZ2UudGltZXN0YW1wVXMsCisgICAgICAgICAgICAgICAgICAgICZjSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAmYnBEYXRhKTsKKyAgICAgICAgICAgIGlmIChicFN0YXR1cyAhPSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiRmFpbGVkIHRvIHJlY2VpdmUgYnVmZmVyIGZyb20gYnVmZmVycG9vbCAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAicmVzdWx0U3RhdHVzID0gIiA8PCB1bmRlcmx5aW5nX3ZhbHVlKGJwU3RhdHVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIi4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWJwRGF0YSkgeworICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIk5vIGRhdGEgaW4gYnVmZmVycG9vbCB0cmFuc2FjdGlvbi4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZC0+bGluZWFyID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhjSGFuZGxlLCBicERhdGEpOworICAgICAgICAgICAgaWYgKGQtPmxpbmVhcikgeworICAgICAgICAgICAgICAgIGQtPnR5cGUgPSBDMkJhc2VCbG9jazo6TElORUFSOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkLT5ncmFwaGljID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soY0hhbmRsZSwgYnBEYXRhKTsKKyAgICAgICAgICAgIGlmIChkLT5ncmFwaGljKSB7CisgICAgICAgICAgICAgICAgZC0+dHlwZSA9IEMyQmFzZUJsb2NrOjpHUkFQSElDOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAvLyBUaG91Z2ggd2UgZ290IGNsb25lZCBoYW5kbGUsIGNyZWF0aW5nIGJsb2NrIGZhaWxlZC4KKyAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2Nsb3NlKGNIYW5kbGUpOworICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGNIYW5kbGUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJVbmtub3duIGhhbmRsZSB0eXBlIGluIEJhc2VCbG9jazo6cG9vbGVkQmxvY2suIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhFUlJPUikgPDwgIlVucmVjb2duaXplZCBCYXNlQmxvY2sncyBkaXNjcmltaW5hdG9yIHdpdGggIgorICAgICAgICAgICAgICAgICAgIDw8ICJ1bmRlcmx5aW5nIHZhbHVlICIKKyAgICAgICAgICAgICAgICAgICA8PCB1bmRlcmx5aW5nX3ZhbHVlKHMuZ2V0RGlzY3JpbWluYXRvcigpKSA8PCAiLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gV29ya0J1bmRsZSAtPiBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+Citib29sIG9iamNweShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBkLCBjb25zdCBXb3JrQnVuZGxlJiBzKSB7CisgICAgLy8gQ29udmVydCBCYXNlQmxvY2tzIHRvIEMyQmFzZUJsb2Nrcy4KKyAgICBzdGQ6OnZlY3RvcjxDMkJhc2VCbG9jaz4gZEJhc2VCbG9ja3Mocy5iYXNlQmxvY2tzLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzLmJhc2VCbG9ja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKCFvYmpjcHkoJmRCYXNlQmxvY2tzW2ldLCBzLmJhc2VCbG9ja3NbaV0pKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFdvcmtCdW5kbGU6OmJhc2VCbG9ja3NbIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBpIDw8ICJdLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkLT5jbGVhcigpOworICAgIGZvciAoY29uc3QgV29yayYgc1dvcmsgOiBzLndvcmtzKSB7CisgICAgICAgIGQtPmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfdW5pcXVlPEMyV29yaz4oKSk7CisgICAgICAgIEMyV29yayYgZFdvcmsgPSAqZC0+YmFjaygpOworCisgICAgICAgIC8vIGNoYWluIGluZm8gaXMgbm90IGluIHVzZSBjdXJyZW50bHkuCisKKyAgICAgICAgLy8gaW5wdXQKKyAgICAgICAgaWYgKCFvYmpjcHkoJmRXb3JrLmlucHV0LCBzV29yay5pbnB1dCwgZEJhc2VCbG9ja3MpKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFdvcms6OmlucHV0LiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyB3b3JrbGV0KHMpCisgICAgICAgIGRXb3JrLndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIGZvciAoY29uc3QgV29ya2xldCYgc1dvcmtsZXQgOiBzV29yay53b3JrbGV0cykgeworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29ya2xldD4gZFdvcmtsZXQgPSBzdGQ6Om1ha2VfdW5pcXVlPEMyV29ya2xldD4oKTsKKworICAgICAgICAgICAgLy8gY29tcG9uZW50IGlkCisgICAgICAgICAgICBkV29ya2xldC0+Y29tcG9uZW50ID0gc3RhdGljX2Nhc3Q8YzJfbm9kZV9pZF90PigKKyAgICAgICAgICAgICAgICAgICAgc1dvcmtsZXQuY29tcG9uZW50SWQpOworCisgICAgICAgICAgICAvLyB0dW5pbmdzCisgICAgICAgICAgICBpZiAoIWNvcHlQYXJhbXNGcm9tQmxvYigmZFdvcmtsZXQtPnR1bmluZ3MsIHNXb3JrbGV0LnR1bmluZ3MpKSB7CisgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBXb3JrbGV0Ojp0dW5pbmdzIjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGZhaWx1cmVzCisgICAgICAgICAgICBkV29ya2xldC0+ZmFpbHVyZXMuY2xlYXIoKTsKKyAgICAgICAgICAgIGRXb3JrbGV0LT5mYWlsdXJlcy5yZXNlcnZlKHNXb3JrbGV0LmZhaWx1cmVzLnNpemUoKSk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IFNldHRpbmdSZXN1bHQmIHNGYWlsdXJlIDogc1dvcmtsZXQuZmFpbHVyZXMpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiBkRmFpbHVyZTsKKyAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmZEZhaWx1cmUsIHNGYWlsdXJlKSkgeworICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFdvcmtsZXQ6OmZhaWx1cmVzLiI7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZFdvcmtsZXQtPmZhaWx1cmVzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUoZEZhaWx1cmUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gb3V0cHV0CisgICAgICAgICAgICBpZiAoIW9iamNweSgmZFdvcmtsZXQtPm91dHB1dCwgc1dvcmtsZXQub3V0cHV0LCBkQmFzZUJsb2NrcykpIHsKKyAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJJbnZhbGlkIFdvcmtsZXQ6Om91dHB1dC4iOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZFdvcmsud29ya2xldHMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShkV29ya2xldCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gd29ya2xldHNQcm9jZXNzZWQKKyAgICAgICAgZFdvcmsud29ya2xldHNQcm9jZXNzZWQgPSBzV29yay53b3JrbGV0c1Byb2Nlc3NlZDsKKworICAgICAgICAvLyByZXN1bHQKKyAgICAgICAgZFdvcmsucmVzdWx0ID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHNXb3JrLnJlc3VsdCk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0ZXhwciBzaXplX3QgUEFSQU1TX0FMSUdOTUVOVCA9IDg7ICAvLyA2NC1iaXQgYWxpZ25tZW50CitzdGF0aWNfYXNzZXJ0KFBBUkFNU19BTElHTk1FTlQgJSBhbGlnbm9mKEMyUGFyYW0pID09IDAsICJDMlBhcmFtIGFsaWdubWVudCBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChQQVJBTVNfQUxJR05NRU5UICUgYWxpZ25vZihDMkluZm8pID09IDAsICJDMlBhcmFtIGFsaWdubWVudCBtaXNtYXRjaCIpOworc3RhdGljX2Fzc2VydChQQVJBTVNfQUxJR05NRU5UICUgYWxpZ25vZihDMlR1bmluZykgPT0gMCwgIkMyUGFyYW0gYWxpZ25tZW50IG1pc21hdGNoIik7CisKKy8vIFBhcmFtcyAtPiBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4KK2Jvb2wgcGFyc2VQYXJhbXNCbG9iKHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAqcGFyYW1zLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiAmYmxvYikgeworICAgIC8vIGFzc3VtaW5nIGJsb2IgaXMgY29uc3QgaGVyZQorICAgIHNpemVfdCBzaXplID0gYmxvYi5zaXplKCk7CisgICAgc2l6ZV90IGl4ID0gMDsKKyAgICBjb25zdCB1aW50OF90ICpkYXRhID0gYmxvYi5kYXRhKCk7CisgICAgQzJQYXJhbSAqcCA9IG51bGxwdHI7CisKKyAgICBkbyB7CisgICAgICAgIHAgPSBDMlBhcmFtVXRpbHM6OlBhcnNlRmlyc3QoZGF0YSArIGl4LCBzaXplIC0gaXgpOworICAgICAgICBpZiAocCkgeworICAgICAgICAgICAgcGFyYW1zLT5lbXBsYWNlX2JhY2socCk7CisgICAgICAgICAgICBpeCArPSBwLT5zaXplKCk7CisgICAgICAgICAgICBpeCA9IGFsaWduKGl4LCBQQVJBTVNfQUxJR05NRU5UKTsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKHApOworCisgICAgaWYgKGl4ICE9IHNpemUpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAicGFyc2VQYXJhbXNCbG9iIC0tIGluY29uc2lzdGVudCBzaXplcy4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKKy8qKgorICogQ29uY2F0ZW5hdGVzIGEgbGlzdCBvZiBDMlBhcmFtcyBpbnRvIGEgcGFyYW1zIGJsb2IuIFQgaXMgYSBjb250YWluZXIgdHlwZQorICogd2hvc2UgbWVtYmVyIHR5cGUgaXMgY29tcGF0aWJsZSB3aXRoIEMyUGFyYW0qLgorICoKKyAqIFxwYXJhbVtvdXRdIGJsb2IgdGFyZ2V0IGJsb2IKKyAqIFxwYXJhbVtpbl0gcGFyYW1zIHBhcmFtZXRlcnMgdG8gY29uY2F0ZW5hdGUKKyAqIFxyZXR2YWwgQzJfT0sgaWYgdGhlIGJsb2Igd2FzIHN1Y2Nlc3NmdWxseSBjcmVhdGVkCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSBpZiB0aGUgYmxvYiB3YXMgbm90IHN1Y2Nlc3NmdWwgY3JlYXRlZCAodGhpcyBvbmx5CisgKiAgICAgICAgIGhhcHBlbnMgaWYgdGhlIHBhcmFtZXRlcnMgd2VyZSBub3QgY29uc3QpCisgKi8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBfY3JlYXRlUGFyYW1zQmxvYihoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwgY29uc3QgVCAmcGFyYW1zKSB7CisgICAgLy8gYXNzdW1pbmcgdGhlIHBhcmFtZXRlciB2YWx1ZXMgYXJlIGNvbnN0CisgICAgc2l6ZV90IHNpemUgPSAwOworICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHBhcmFtcykgeworICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHNpemUgKz0gcC0+c2l6ZSgpOworICAgICAgICBzaXplID0gYWxpZ24oc2l6ZSwgUEFSQU1TX0FMSUdOTUVOVCk7CisgICAgfQorICAgIGJsb2ItPnJlc2l6ZShzaXplKTsKKyAgICBzaXplX3QgaXggPSAwOworICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHBhcmFtcykgeworICAgICAgICBpZiAoIXApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIE5FVkVSIG92ZXJ3cml0ZSBldmVuIGlmIHBhcmFtIHZhbHVlcyAoZS5nLiBzaXplKSBjaGFuZ2VkCisgICAgICAgIHNpemVfdCBwYXJhbVNpemUgPSBzdGQ6Om1pbihwLT5zaXplKCksIHNpemUgLSBpeCk7CisgICAgICAgIHN0ZDo6Y29weSgKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QqPigmKnApLAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KCYqcCkgKyBwYXJhbVNpemUsCisgICAgICAgICAgICAgICAgJigqYmxvYilbaXhdKTsKKyAgICAgICAgaXggKz0gcGFyYW1TaXplOworICAgICAgICBpeCA9IGFsaWduKGl4LCBQQVJBTVNfQUxJR05NRU5UKTsKKyAgICB9CisgICAgYmxvYi0+cmVzaXplKGl4KTsKKyAgICBpZiAoaXggIT0gc2l6ZSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVQYXJhbXNCbG9iIC0tIGluY29uc2lzdGVudCBzaXplcy4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvKioKKyAqIFBhcnNlcyBhIHBhcmFtcyBibG9iIGFuZCBjcmVhdGUgYSB2ZWN0b3Igb2YgbmV3IFQgb2JqZWN0cyB0aGF0IGNvbnRhaW4gY29waWVzCisgKiBvZiB0aGUgcGFyYW1zIGluIHRoZSBibG9iLiBUIGlzIEMyUGFyYW0gb3IgaXRzIGNvbXBhdGlibGUgZGVyaXZlZCBjbGFzcy4KKyAqCisgKiBccGFyYW1bb3V0XSBwYXJhbXMgdGhlIHJlc3VsdGluZyB2ZWN0b3IKKyAqIFxwYXJhbVtpbl0gYmxvYiBwYXJhbWV0ZXIgYmxvYiB0byBwYXJzZQorICogXHJldHZhbCBDMl9PSyBpZiB0aGUgZnVsbCBibG9iIHdhcyBwYXJzZWQgYW5kIHBhcmFtcyB3YXMgY29uc3RydWN0ZWQKKyAqIFxyZXR2YWwgQzJfQkFEX1ZBTFVFIG90aGVyd2lzZQorICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgX2NvcHlQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFQ+PiogcGFyYW1zLAorICAgICAgICBQYXJhbXMgYmxvYikgeworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtUG9pbnRlcnMsIGJsb2IpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNvcHlQYXJhbXNGcm9tQmxvYiAtLSBmYWlsZWQgdG8gcGFyc2UuIjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHBhcmFtcy0+cmVzaXplKHBhcmFtUG9pbnRlcnMuc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgcGFyYW1Qb2ludGVyIDogcGFyYW1Qb2ludGVycykgeworICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiY29weVBhcmFtc0Zyb21CbG9iIC0tIG51bGwgcGFyYW1Qb2ludGVyLiI7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgKCpwYXJhbXMpW2krK10ucmVzZXQocmVpbnRlcnByZXRfY2FzdDxUKj4oCisgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weSgqcGFyYW1Qb2ludGVyKS5yZWxlYXNlKCkpKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gc3RkOjp2ZWN0b3I8Y29uc3QgQzJQYXJhbSo+IC0+IFBhcmFtcworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgQzJQYXJhbSo+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IC0+IFBhcmFtcworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAtPiBQYXJhbXMKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJnBhcmFtcykgeworICAgIHJldHVybiBfY3JlYXRlUGFyYW1zQmxvYihibG9iLCBwYXJhbXMpOworfQorCisvLyBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJUdW5pbmc+PiAtPiBQYXJhbXMKK2Jvb2wgY3JlYXRlUGFyYW1zQmxvYigKKyAgICAgICAgaGlkbF92ZWM8dWludDhfdD4gKmJsb2IsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IC0+IFBhcmFtcworYm9vbCBjcmVhdGVQYXJhbXNCbG9iKAorICAgICAgICBoaWRsX3ZlYzx1aW50OF90PiAqYmxvYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+ICZwYXJhbXMpIHsKKyAgICByZXR1cm4gX2NyZWF0ZVBhcmFtc0Jsb2IoYmxvYiwgcGFyYW1zKTsKK30KKworLy8gUGFyYW1zIC0+IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4KK2Jvb2wgY29weVBhcmFtc0Zyb21CbG9iKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBwYXJhbXMsCisgICAgICAgIFBhcmFtcyBibG9iKSB7CisgICAgcmV0dXJuIF9jb3B5UGFyYW1zRnJvbUJsb2IocGFyYW1zLCBibG9iKTsKK30KKworLy8gUGFyYW1zIC0+IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlR1bmluZz4+Citib29sIGNvcHlQYXJhbXNGcm9tQmxvYigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyVHVuaW5nPj4qIHBhcmFtcywKKyAgICAgICAgUGFyYW1zIGJsb2IpIHsKKyAgICByZXR1cm4gX2NvcHlQYXJhbXNGcm9tQmxvYihwYXJhbXMsIGJsb2IpOworfQorCisvLyBQYXJhbXMgLT4gdXBkYXRlIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4KK2Jvb2wgdXBkYXRlUGFyYW1zRnJvbUJsb2IoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgcGFyYW1zLAorICAgICAgICBjb25zdCBQYXJhbXMmIGJsb2IpIHsKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDMyX3QsIEMyUGFyYW0qPiBpbmRleDJwYXJhbTsKKyAgICBmb3IgKEMyUGFyYW0qIGNvbnN0JiBwYXJhbSA6IHBhcmFtcykgeworICAgICAgICBpZiAoIXBhcmFtKSB7CisgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJ1cGRhdGVQYXJhbXNGcm9tQmxvYiAtLSBudWxsIG91dHB1dCBwYXJhbS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmIChpbmRleDJwYXJhbS5maW5kKHBhcmFtLT5pbmRleCgpKSA9PSBpbmRleDJwYXJhbS5lbmQoKSkgeworICAgICAgICAgICAgaW5kZXgycGFyYW0uZW1wbGFjZShwYXJhbS0+aW5kZXgoKSwgcGFyYW0pOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgaWYgKCFwYXJzZVBhcmFtc0Jsb2IoJnBhcmFtUG9pbnRlcnMsIGJsb2IpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInVwZGF0ZVBhcmFtc0Zyb21CbG9iIC0tIGZhaWxlZCB0byBwYXJzZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgcGFyYW1Qb2ludGVyIDogcGFyYW1Qb2ludGVycykgeworICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidXBkYXRlUGFyYW1zRnJvbUJsb2IgLS0gbnVsbCBpbnB1dCBwYXJhbS4iOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGRlY2x0eXBlKGluZGV4MnBhcmFtKTo6aXRlcmF0b3IgaSA9IGluZGV4MnBhcmFtLmZpbmQoCisgICAgICAgICAgICAgICAgcGFyYW1Qb2ludGVyLT5pbmRleCgpKTsKKyAgICAgICAgaWYgKGkgPT0gaW5kZXgycGFyYW0uZW5kKCkpIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgInVwZGF0ZVBhcmFtc0Zyb21CbG9iIC0tIGluZGV4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgcGFyYW1Qb2ludGVyLT5pbmRleCgpIDw8ICIgbm90IGZvdW5kLiBTa2lwcGluZy4uLiI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWktPnNlY29uZC0+dXBkYXRlRnJvbSgqcGFyYW1Qb2ludGVyKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAidXBkYXRlUGFyYW1zRnJvbUJsb2IgLS0gc2l6ZSBtaXNtYXRjaDogIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBwYXJhbXMuc2l6ZSgpIDw8ICIgdnMgIiA8PCBwYXJhbVBvaW50ZXItPnNpemUoKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIChpbmRleCA9ICIgPDwgaS0+Zmlyc3QgPDwgIikuIjsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQ29udmVydCBCdWZmZXJQb29sIFJlc3VsdFN0YXR1cyB0byBjMl9zdGF0dXNfdC4KK2MyX3N0YXR1c190IHRvQzJTdGF0dXMoUmVzdWx0U3RhdHVzIHJzKSB7CisgICAgc3dpdGNoIChycykgeworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpPSzoKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk6CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgY2FzZSBSZXN1bHRTdGF0dXM6OkFMUkVBRFlfRVhJU1RTOgorICAgICAgICByZXR1cm4gQzJfRFVQTElDQVRFOworICAgIGNhc2UgUmVzdWx0U3RhdHVzOjpOT1RfRk9VTkQ6CisgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgY2FzZSBSZXN1bHRTdGF0dXM6OkNSSVRJQ0FMX0VSUk9SOgorICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiVW5yZWNvZ25pemVkIEJ1ZmZlclBvb2wgUmVzdWx0U3RhdHVzOiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxpbnQzMl90PihycykgPDwgIi4iOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KK30KKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmxvY2tQcm9jZXNzb3I+Cit2b2lkIGZvckVhY2hCbG9jayhDMkZyYW1lRGF0YSYgZnJhbWVEYXRhLAorICAgICAgICAgICAgICAgICAgQmxvY2tQcm9jZXNzb3IgcHJvY2VzcykgeworICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgYnVmZmVyIDogZnJhbWVEYXRhLmJ1ZmZlcnMpIHsKKyAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgZm9yIChjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jayA6CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKSkgeworICAgICAgICAgICAgICAgIHByb2Nlc3MoYmxvY2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmxvY2tQcm9jZXNzb3I+Cit2b2lkIGZvckVhY2hCbG9jayhjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrTGlzdCwKKyAgICAgICAgICAgICAgICAgIEJsb2NrUHJvY2Vzc29yIHByb2Nlc3MsCisgICAgICAgICAgICAgICAgICBib29sIHByb2Nlc3NJbnB1dCwgYm9vbCBwcm9jZXNzT3V0cHV0KSB7CisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtMaXN0KSB7CisgICAgICAgIGlmICghd29yaykgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHByb2Nlc3NJbnB1dCkgeworICAgICAgICAgICAgZm9yRWFjaEJsb2NrKHdvcmstPmlucHV0LCBwcm9jZXNzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocHJvY2Vzc091dHB1dCkgeworICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrbGV0PiYgd29ya2xldCA6IHdvcmstPndvcmtsZXRzKSB7CisgICAgICAgICAgICAgICAgaWYgKHdvcmtsZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yRWFjaEJsb2NrKHdvcmtsZXQtPm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitib29sIGJlZ2luVHJhbnNmZXJCdWZmZXJRdWV1ZUJsb2NrKGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IGRhdGEgPQorICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YShibG9jayk7CisgICAgaWYgKGRhdGEgJiYgX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJRdWV1ZURhdGEoZGF0YSkpIHsKKyAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpCZWdpblRyYW5zZmVyQmxvY2tUb0NsaWVudChkYXRhKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBiZWdpblRyYW5zZmVyQnVmZmVyUXVldWVCbG9ja3MoCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtMaXN0LAorICAgICAgICBib29sIHByb2Nlc3NJbnB1dCwgYm9vbCBwcm9jZXNzT3V0cHV0KSB7CisgICAgZm9yRWFjaEJsb2NrKHdvcmtMaXN0LCBiZWdpblRyYW5zZmVyQnVmZmVyUXVldWVCbG9jaywKKyAgICAgICAgICAgICAgICAgcHJvY2Vzc0lucHV0LCBwcm9jZXNzT3V0cHV0KTsKK30KKworYm9vbCBlbmRUcmFuc2ZlckJ1ZmZlclF1ZXVlQmxvY2soCisgICAgICAgIGNvbnN0IEMyQ29uc3RHcmFwaGljQmxvY2smIGJsb2NrLAorICAgICAgICBib29sIHRyYW5zZmVyKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IGRhdGEgPQorICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpHZXRHcmFwaGljQmxvY2tQb29sRGF0YShibG9jayk7CisgICAgaWYgKGRhdGEgJiYgX0MyQmxvY2tGYWN0b3J5OjpHZXRCdWZmZXJRdWV1ZURhdGEoZGF0YSkpIHsKKyAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpFbmRUcmFuc2ZlckJsb2NrVG9DbGllbnQoZGF0YSwgdHJhbnNmZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIGVuZFRyYW5zZmVyQnVmZmVyUXVldWVCbG9ja3MoCisgICAgICAgIGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtMaXN0LAorICAgICAgICBib29sIHRyYW5zZmVyLAorICAgICAgICBib29sIHByb2Nlc3NJbnB1dCwgYm9vbCBwcm9jZXNzT3V0cHV0KSB7CisgICAgZm9yRWFjaEJsb2NrKHdvcmtMaXN0LAorICAgICAgICAgICAgICAgICBzdGQ6OmJpbmQoZW5kVHJhbnNmZXJCdWZmZXJRdWV1ZUJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwbGFjZWhvbGRlcnM6Ol8xLCB0cmFuc2ZlciksCisgICAgICAgICAgICAgICAgIHByb2Nlc3NJbnB1dCwgcHJvY2Vzc091dHB1dCk7Cit9CisKK2Jvb2wgZGlzcGxheUJ1ZmZlclF1ZXVlQmxvY2soY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2spIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gZGF0YSA9CisgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkdldEdyYXBoaWNCbG9ja1Bvb2xEYXRhKGJsb2NrKTsKKyAgICBpZiAoZGF0YSAmJiBfQzJCbG9ja0ZhY3Rvcnk6OkdldEJ1ZmZlclF1ZXVlRGF0YShkYXRhKSkgeworICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkRpc3BsYXlCbG9ja1RvQnVmZmVyUXVldWUoZGF0YSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYxXzAKK30gIC8vIG5hbWVzcGFjZSBjMgorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvT1dORVJTIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9PV05FUlMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczM2UwYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvT1dORVJTCkBAIC0wLDAgKzEsOSBAQAorIyBNZWRpYSB0ZWFtCitsYWpvc0Bnb29nbGUuY29tCitwYXdpbkBnb29nbGUuY29tCit0YWtsZWVAZ29vZ2xlLmNvbQord29uc2lrQGdvb2dsZS5jb20KKworIyBWVFMgdGVhbQoreWltQGdvb2dsZS5jb20KK3podW95YW9AZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWYwZDA5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRGVjVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzSGFsTWVkaWFDMlYxXzBEZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIlZ0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcCIsCisgICAgICAgIC8vIm1lZGlhX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uY3BwIgorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdCIsCisgICAgZGVmYXVsdHM6IFsiVnRzSGFsTWVkaWFDMlYxXzBEZWZhdWx0cyJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIlZ0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0QXVkaW9FbmNUZXN0LmNwcCIsCisgICAgICAgIC8vIm1lZGlhX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uY3BwIgorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRBdWRpb0RlY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGE1NTJjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0LmNwcApAQCAtMCwwICsxLDk0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMl9oaWRsX2hhbF9hdWRpb19kZWNfdGVzdCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorCit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uaCIKKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK3N0cnVjdCBGcmFtZUluZm8geworICAgIGludCBieXRlc0NvdW50OworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGludDY0X3QgdGltZXN0YW1wOworfTsKKworY2xhc3MgTGluZWFyQnVmZmVyIDogcHVibGljIEMyQnVmZmVyIHsKKyAgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBMaW5lYXJCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+JiBibG9jaykKKyAgICAgICAgOiBDMkJ1ZmZlcigKKyAgICAgICAgICAgICAge2Jsb2NrLT5zaGFyZShibG9jay0+b2Zmc2V0KCksIGJsb2NrLT5zaXplKCksIDo6QzJGZW5jZSgpKX0pIHt9Cit9OworCitzdGF0aWMgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KiBnRW52ID0gbnVsbHB0cjsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSB7CisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgU3VwZXI7CisKKyAgIHB1YmxpYzoKKyAgICA6OnN0ZDo6c3RyaW5nIGdldFRlc3RDYXNlSW5mbygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIDo6c3RkOjpzdHJpbmcoKSArCisgICAgICAgICAgICAgICAgIkNvbXBvbmVudDogIiArIGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCkgKyAiIHwgIiArCisgICAgICAgICAgICAgICAgIkluc3RhbmNlOiAiICsgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJSZXM6ICIgKyBnRW52LT5nZXRSZXMoKS5jX3N0cigpOworICAgIH0KKworICAgIC8vIGdvb2dsZS5jb2RlYzIgQXVkaW8gdGVzdCBzZXR1cAorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgU3VwZXI6OlNldFVwKCk7CisgICAgICAgIG1EaXNhYmxlVGVzdCA9IGZhbHNlOworICAgICAgICBBTE9HVigiQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCBTZXRVcCIpOworICAgICAgICBtQ2xpZW50ID0gYW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgICAgIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSk7CisgICAgICAgIEFTU0VSVF9ORShtQ2xpZW50LCBudWxscHRyKTsKKyAgICAgICAgbUxpc3RlbmVyLnJlc2V0KG5ldyBDb2RlY0xpc3RlbmVyKAorICAgICAgICAgICAgW3RoaXNdKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICAgICAgICAgIGhhbmRsZVdvcmtEb25lKHdvcmtJdGVtcyk7CisgICAgICAgICAgICB9KSk7CisgICAgICAgIEFTU0VSVF9ORShtTGlzdGVuZXIsIG51bGxwdHIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9JTlBVVF9CVUZGRVJTOyArK2kpIHsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmspOworICAgICAgICB9CisgICAgICAgIG1DbGllbnQtPmNyZWF0ZUNvbXBvbmVudChnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpLCBtTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNvbXBvbmVudCk7CisgICAgICAgIEFTU0VSVF9ORShtQ29tcG9uZW50LCBudWxscHRyKTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gc3RvcmUgPQorICAgICAgICAgICAgYW5kcm9pZDo6R2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgICAgICBDSEVDS19FUShzdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUxpbmVhckFsbG9jYXRvciksCisgICAgICAgICAgICAgICAgIEMyX09LKTsKKyAgICAgICAgbUxpbmVhclBvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihtTGluZWFyQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xJZCsrKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaW5lYXJQb29sLCBudWxscHRyKTsKKworICAgICAgICBtQ29tcE5hbWUgPSB1bmtub3duX2NvbXA7CisgICAgICAgIHN0cnVjdCBTdHJpbmdUb05hbWUgeworICAgICAgICAgICAgY29uc3QgY2hhciogTmFtZTsKKyAgICAgICAgICAgIHN0YW5kYXJkQ29tcCBDb21wTmFtZTsKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3QgU3RyaW5nVG9OYW1lIGtTdHJpbmdUb05hbWVbXSA9IHsKKyAgICAgICAgICAgIHsieGFhYyIsIHhhYWN9LAorICAgICAgICAgICAgeyJtcDMiLCBtcDN9LAorICAgICAgICAgICAgeyJhbXJuYiIsIGFtcm5ifSwKKyAgICAgICAgICAgIHsiYW1yd2IiLCBhbXJ3Yn0sCisgICAgICAgICAgICB7ImFhYyIsIGFhY30sCisgICAgICAgICAgICB7InZvcmJpcyIsIHZvcmJpc30sCisgICAgICAgICAgICB7Im9wdXMiLCBvcHVzfSwKKyAgICAgICAgICAgIHsicGNtIiwgcGNtfSwKKyAgICAgICAgICAgIHsiZzcxMS5hbGF3IiwgZzcxMWFsYXd9LAorICAgICAgICAgICAgeyJnNzExLm1sYXciLCBnNzExbWxhd30sCisgICAgICAgICAgICB7ImdzbSIsIGdzbX0sCisgICAgICAgICAgICB7InJhdyIsIHJhd30sCisgICAgICAgICAgICB7ImZsYWMiLCBmbGFjfSwKKyAgICAgICAgfTsKKyAgICAgICAgY29uc3Qgc2l6ZV90IGtOdW1TdHJpbmdUb05hbWUgPQorICAgICAgICAgICAgc2l6ZW9mKGtTdHJpbmdUb05hbWUpIC8gc2l6ZW9mKGtTdHJpbmdUb05hbWVbMF0pOworCisgICAgICAgIC8vIEZpbmQgdGhlIGNvbXBvbmVudCB0eXBlCisgICAgICAgIHN0ZDo6c3RyaW5nIGNvbXAgPSBzdGQ6OnN0cmluZyhnRW52LT5nZXRDb21wb25lbnQoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVN0cmluZ1RvTmFtZTsgKytpKSB7CisgICAgICAgICAgICBpZiAoc3RyY2FzZXN0cihjb21wLmNfc3RyKCksIGtTdHJpbmdUb05hbWVbaV0uTmFtZSkpIHsKKyAgICAgICAgICAgICAgICBtQ29tcE5hbWUgPSBrU3RyaW5nVG9OYW1lW2ldLkNvbXBOYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Fb3MgPSBmYWxzZTsKKyAgICAgICAgbUZyYW1lc1JlY2VpdmVkID0gMDsKKyAgICAgICAgbVRpbWVzdGFtcFVzID0gMHU7CisgICAgICAgIG1UaW1lc3RhbXBEZXZUZXN0ID0gZmFsc2U7CisgICAgICAgIGlmIChtQ29tcE5hbWUgPT0gdW5rbm93bl9jb21wKSBtRGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICBpZiAobURpc2FibGVUZXN0KSBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgICAgICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29tcG9uZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBTdXBlcjo6VGVhckRvd24oKTsKKyAgICB9CisKKyAgICBzdHJ1Y3Qgb3V0cHV0TWV0YURhdGEgeworICAgICAgICB1aW50NjRfdCB0aW1lc3RhbXBVczsKKyAgICAgICAgdWludDMyX3QgcmFuZ2VMZW5ndGg7CisgICAgfTsKKyAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiB0byBwcm9jZXNzIG9uV29ya0RvbmUgcmVjZWl2ZWQgYnkgTGlzdGVuZXIKKyAgICB2b2lkIGhhbmRsZVdvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0l0ZW1zKSB7CisgICAgICAgICAgICBpZiAoIXdvcmstPndvcmtsZXRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBGb3IgZGVjb2RlciBjb21wb25lbnRzIGN1cnJlbnQgdGltZXN0YW1wIGFsd2F5cyBleGNlZWRzCisgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgYm9vbCBjb2RlY0NvbmZpZyA9ICgod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDApOworICAgICAgICAgICAgICAgIGlmICghY29kZWNDb25maWcgJiYKKyAgICAgICAgICAgICAgICAgICAgIXdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0dFKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzKTsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrdSgpOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByYW5nZUxlbmd0aCA9CisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVyc1swXS0+ZGF0YSgpCisgICAgICAgICAgICAgICAgICAgICAgICAubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKS5jYXBhY2l0eSgpOworICAgICAgICAgICAgICAgICAgICAvL0xpc3Qgb2YgdGltZXN0YW1wIHZhbHVlcyBhbmQgb3V0cHV0IHNpemUgdG8gY2FsY3VsYXRlIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgICAgICBpZiAobVRpbWVzdGFtcERldlRlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dE1ldGFEYXRhIG1ldGEgPSB7bVRpbWVzdGFtcFVzLCByYW5nZUxlbmd0aH07CisgICAgICAgICAgICAgICAgICAgICAgICBvQnVmZmVyTWV0YURhdGEucHVzaF9iYWNrKG1ldGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJvb2wgbUNzZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHdvcmtEb25lKG1Db21wb25lbnQsIHdvcmssIG1GbHVzaGVkSW5kaWNlcywgbVF1ZXVlTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1Fb3MsIG1Dc2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1JlY2VpdmVkKTsKKyAgICAgICAgICAgICAgICAodm9pZCltQ3NkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgZW51bSBzdGFuZGFyZENvbXAgeworICAgICAgICB4YWFjLAorICAgICAgICBtcDMsCisgICAgICAgIGFtcm5iLAorICAgICAgICBhbXJ3YiwKKyAgICAgICAgYWFjLAorICAgICAgICB2b3JiaXMsCisgICAgICAgIG9wdXMsCisgICAgICAgIHBjbSwKKyAgICAgICAgZzcxMWFsYXcsCisgICAgICAgIGc3MTFtbGF3LAorICAgICAgICBnc20sCisgICAgICAgIHJhdywKKyAgICAgICAgZmxhYywKKyAgICAgICAgdW5rbm93bl9jb21wLAorICAgIH07CisKKyAgICBib29sIG1Fb3M7CisgICAgYm9vbCBtRGlzYWJsZVRlc3Q7CisgICAgYm9vbCBtVGltZXN0YW1wRGV2VGVzdDsKKyAgICBzdGFuZGFyZENvbXAgbUNvbXBOYW1lOworICAgIHVpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICB1aW50MzJfdCBtRnJhbWVzUmVjZWl2ZWQ7CisgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtRmx1c2hlZEluZGljZXM7CisgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtVGltZXN0YW1wVXNsaXN0OworICAgIDo6YW5kcm9pZDo6TGlzdDxvdXRwdXRNZXRhRGF0YT4gb0J1ZmZlck1ldGFEYXRhOworCisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbElkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUxpbmVhclBvb2w7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtTGluZWFyQWxsb2NhdG9yOworCisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9Cit9OworCit2b2lkIHZhbGlkYXRlQ29tcG9uZW50KAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGJvb2wmIGRpc2FibGVUZXN0KSB7CisgICAgLy8gVmFsaWRhdGUgaXRzIGEgQzIgQ29tcG9uZW50CisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImMyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIk5vdCBhIGMyIGNvbXBvbmVudCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBpdHMgbm90IGFuIGVuY29kZXIgYW5kIHRoZSBjb21wb25lbnQgdG8gYmUgdGVzdGVkIGlzIGF1ZGlvCisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImVuY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgRGVjb2RlciwgZ2l2ZW4gRW5jb2RlciIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0KKyAgICAgICAgY29tcG9uZW50LT5xdWVyeSh7fSwge0MyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LICYmIHF1ZXJpZWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkID0+ICVkIiwgYzJlcnIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGlucHV0RG9tYWluID0KKyAgICAgICAgICAgICgoQzJTdHJlYW1NZWRpYVR5cGVTZXR0aW5nOjppbnB1dCopcXVlcmllZFswXS5nZXQoKSktPm0udmFsdWU7CisgICAgICAgIGlmIChpbnB1dERvbWFpbi5maW5kKCJhdWRpby8iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIEF1ZGlvIENvbXBvbmVudCIpOworICAgICAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVmFsaWRhdGVzIGNvbXBvbmVudCBuYW1lCisgICAgaWYgKGNvbXBOYW1lID09IENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnVua25vd25fY29tcCkgeworICAgICAgICBBTE9HRSgiQ29tcG9uZW50IEluVmFsaWQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJDb21wb25lbnQgVmFsaWQiKTsKK30KKworLy8gU2V0IERlZmF1bHQgY29uZmlnIHBhcmFtLgorYm9vbCBzZXR1cENvbmZpZ1BhcmFtKAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBpbnQzMl90KiBiaXRTdHJlYW1JbmZvKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygwdSwgYml0U3RyZWFtSW5mb1swXSk7CisgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQgY2hhbm5lbENvdW50SW5mbygwdSwgYml0U3RyZWFtSW5mb1sxXSk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gY29uZmlnUGFyYW17JnNhbXBsZVJhdGVJbmZvLCAmY2hhbm5lbENvdW50SW5mb307CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgY29tcG9uZW50LT5jb25maWcoY29uZmlnUGFyYW0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgaWYgKHN0YXR1cyA9PSBDMl9PSyAmJiBmYWlsdXJlcy5zaXplKCkgPT0gMHUpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKK30KKworLy8gSW4gZGVjb2RlciBjb21wb25lbnRzLCBvZnRlbiB0aGUgaW5wdXQgcGFyYW1ldGVycyBnZXQgdXBkYXRlZCB1cG9uCisvLyBwYXJzaW5nIHRoZSBoZWFkZXIgb2YgZWxlbWVudGFyeSBzdHJlYW0uIENsaWVudCBuZWVkcyB0byBjb2xsZWN0IHRoaXMKKy8vIGluZm9ybWF0aW9uIGFuZCByZWNvbmZpZ3VyZQordm9pZCBnZXRJbnB1dENoYW5uZWxJbmZvKAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGludDMyX3QqIGJpdFN0cmVhbUluZm8pIHsKKyAgICAvLyBxdWVyeSBuU2FtcGxlUmF0ZSBhbmQgbkNoYW5uZWxzCisgICAgc3RkOjppbml0aWFsaXplcl9saXN0PEMyUGFyYW06OkluZGV4PiBpbmRpY2VzeworICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgIH07CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBpblBhcmFtczsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICBjb21wb25lbnQtPnF1ZXJ5KHt9LCBpbmRpY2VzLCBDMl9ET05UX0JMT0NLLCAmaW5QYXJhbXMpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0sgJiYgaW5QYXJhbXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkID0+ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNpemVfdCBvZmZzZXQgPSBzaXplb2YoQzJQYXJhbSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5QYXJhbXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIEMyUGFyYW0qIHBhcmFtID0gaW5QYXJhbXNbaV0uZ2V0KCk7CisgICAgICAgICAgICBiaXRTdHJlYW1JbmZvW2ldID0gKihpbnQzMl90KikoKHVpbnQ4X3QqKXBhcmFtICsgb2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKGNvbXBOYW1lKSB7CisgICAgICAgICAgICBjYXNlIENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OmFtcm5iOiB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGJpdFN0cmVhbUluZm9bMF0sIDgwMDApOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzFdLCAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6YW1yd2I6IHsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoYml0U3RyZWFtSW5mb1swXSwgMTYwMDApOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShiaXRTdHJlYW1JbmZvWzFdLCAxKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6Z3NtOiB7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKGJpdFN0cmVhbUluZm9bMF0sIDgwMDApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gbnVtYmVyIG9mIGVsZW1lbnRhcnkgc3RyZWFtcyBwZXIgY29tcG9uZW50CisjZGVmaW5lIFNUUkVBTV9DT1VOVCAyCisKKy8vIExvb2tVcFRhYmxlIG9mIGNsaXBzIGFuZCBtZXRhZGF0YSBmb3IgY29tcG9uZW50IHRlc3RpbmcKK3ZvaWQgR2V0VVJMRm9yQ29tcG9uZW50KENvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wLCBjaGFyKiBtVVJMLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogaW5mbywgc2l6ZV90IHN0cmVhbUluZGV4ID0gMCkgeworICAgIHN0cnVjdCBDb21wVG9VUkwgeworICAgICAgICBDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcDsKKyAgICAgICAgY29uc3QgY2hhciBtVVJMW1NUUkVBTV9DT1VOVF1bNTEyXTsKKyAgICAgICAgY29uc3QgY2hhciBpbmZvW1NUUkVBTV9DT1VOVF1bNTEyXTsKKyAgICB9OworICAgIEFTU0VSVF9UUlVFKHN0cmVhbUluZGV4IDwgU1RSRUFNX0NPVU5UKTsKKworICAgIHN0YXRpYyBjb25zdCBDb21wVG9VUkwga0NvbXBUb1VSTFtdID0geworICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjp4YWFjLAorICAgICAgICAgeyJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjIiwKKyAgICAgICAgICAiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYyJ9LAorICAgICAgICAgeyJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyIsCisgICAgICAgICAgImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjptcDMsCisgICAgICAgICB7ImJiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5tcDMiLAorICAgICAgICAgICJiYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzIn0sCisgICAgICAgICB7ImJiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5pbmZvIiwKKyAgICAgICAgICAiYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFhYywKKyAgICAgICAgIHsiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmFhYyIsCisgICAgICAgICAgImJiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMifSwKKyAgICAgICAgIHsiYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLAorICAgICAgICAgICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YW1ybmIsCisgICAgICAgICB7InNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouYW1ybmIiLAorICAgICAgICAgICJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iIn0sCisgICAgICAgICB7InNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouaW5mbyIsCisgICAgICAgICAgInNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YW1yd2IsCisgICAgICAgICB7ImJiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouYW1yd2IiLAorICAgICAgICAgICJiYmJfYW1yd2JfMWNoXzE0a2Jwc18xNjAwMGh6LmFtcndiIn0sCisgICAgICAgICB7ImJiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouaW5mbyIsCisgICAgICAgICAgImJiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6dm9yYmlzLAorICAgICAgICAgeyJiYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoudm9yYmlzIiwgIiJ9LAorICAgICAgICAgeyJiYmJfdm9yYmlzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyIsICIifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Om9wdXMsCisgICAgICAgICB7ImJiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoub3B1cyIsICIifSwKKyAgICAgICAgIHsiYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIiwgIiJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6ZzcxMWFsYXcsCisgICAgICAgICB7ImJiYl9nNzExYWxhd18xY2hfOGtoei5yYXciLCAiIn0sCisgICAgICAgICB7ImJiYl9nNzExYWxhd18xY2hfOGtoei5pbmZvIiwgIiJ9fSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6ZzcxMW1sYXcsCisgICAgICAgICB7ImJiYl9nNzExbXVsYXdfMWNoXzhraHoucmF3IiwgIiJ9LAorICAgICAgICAgeyJiYmJfZzcxMW11bGF3XzFjaF84a2h6LmluZm8iLCAiIn19LAorICAgICAgICB7Q29kZWMyQXVkaW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpnc20sCisgICAgICAgICB7ImJiYl9nc21fMWNoXzhraHpfMTNrYnBzLnJhdyIsICIifSwKKyAgICAgICAgIHsiYmJiX2dzbV8xY2hfOGtoel8xM2ticHMuaW5mbyIsICIifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnJhdywKKyAgICAgICAgIHsiYmJiX3Jhd18xY2hfOGtoel9zMzJsZS5yYXciLCAiIn0sCisgICAgICAgICB7ImJiYl9yYXdfMWNoXzhraHpfczMybGUuaW5mbyIsICIifX0sCisgICAgICAgIHtDb2RlYzJBdWRpb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmZsYWMsCisgICAgICAgICB7ImJiYl9mbGFjX3N0ZXJlb182ODBrYnBzXzQ4MDAwaHouZmxhYyIsICIifSwKKyAgICAgICAgIHsiYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5pbmZvIiwgIiJ9fSwKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoa0NvbXBUb1VSTCkgLyBzaXplb2Yoa0NvbXBUb1VSTFswXSk7ICsraSkgeworICAgICAgICBpZiAoa0NvbXBUb1VSTFtpXS5jb21wID09IGNvbXApIHsKKyAgICAgICAgICAgIHN0cmNhdChtVVJMLCBrQ29tcFRvVVJMW2ldLm1VUkxbc3RyZWFtSW5kZXhdKTsKKyAgICAgICAgICAgIHN0cmNhdChpbmZvLCBrQ29tcFRvVVJMW2ldLmluZm9bc3RyZWFtSW5kZXhdKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBkZWNvZGVORnJhbWVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Om11dGV4ICZxdWV1ZUxvY2ssIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlJiBxdWV1ZUNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiYgZmx1c2hlZEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgbGluZWFyUG9vbCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtJiBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4qIEluZm8sCisgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IHJhbmdlLCBib29sIHNpZ25hbEVPUyA9IHRydWUpIHsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgaW50IGZyYW1lSUQgPSBvZmZzZXQ7CisgICAgaW50IG1heFJldHJ5ID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoZnJhbWVJRCA9PSAoaW50KUluZm8tPnNpemUoKSB8fCBmcmFtZUlEID09IChvZmZzZXQgKyByYW5nZSkpIGJyZWFrOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgICAgIHdoaWxlICghd29yayAmJiAobWF4UmV0cnkgPCBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBpZiAoIXdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29yay5zd2FwKHdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICB3b3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghd29yayAmJiAobWF4UmV0cnkgPj0gTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJXYWl0IGZvciBnZW5lcmF0aW5nIEMyV29yayBleGNlZWRlZCB0aW1lb3V0IjsKKyAgICAgICAgfQorICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCA9ICgqSW5mbylbZnJhbWVJRF0udGltZXN0YW1wOworICAgICAgICBpZiAoKCpJbmZvKVtmcmFtZUlEXS5mbGFncykgZmxhZ3MgPSAxdSA8PCAoKCpJbmZvKVtmcmFtZUlEXS5mbGFncyAtIDEpOworICAgICAgICBpZiAoc2lnbmFsRU9TICYmICgoZnJhbWVJRCA9PSAoaW50KUluZm8tPnNpemUoKSAtIDEpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZUlEID09IChvZmZzZXQgKyByYW5nZSAtIDEpKSkpCisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworCisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gZnJhbWVJRDsKKyAgICAgICAgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgZmx1c2hlZEluZGljZXMuZW1wbGFjZV9iYWNrKGZyYW1lSUQpOworICAgICAgICB9CisgICAgICAgIGludCBzaXplID0gKCpJbmZvKVtmcmFtZUlEXS5ieXRlc0NvdW50OworICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKW1hbGxvYyhzaXplKTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpOworCisgICAgICAgIGVsZVN0cmVhbS5yZWFkKGRhdGEsIHNpemUpOworICAgICAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmdjb3VudCgpLCBzaXplKTsKKworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIGlmIChzaXplKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgICAgICBBU1NFUlRfRVEoQzJfT0ssCisgICAgICAgICAgICAgICAgICAgIGxpbmVhclBvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplLCB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0sCisgICAgICAgICAgICAgICAgICAgICAgICAmYmxvY2spKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGJsb2NrKTsKKworICAgICAgICAgICAgLy8gV3JpdGUgVmlldworICAgICAgICAgICAgQzJXcml0ZVZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkMyTGluZWFyQmxvY2s6Om1hcCgpIGZhaWxlZCA6ICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFTU0VSVF9FUSgoc2l6ZV90KXNpemUsIHZpZXcuY2FwYWNpdHkoKSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoMHUsIHZpZXcub2Zmc2V0KCkpOworICAgICAgICAgICAgQVNTRVJUX0VRKChzaXplX3Qpc2l6ZSwgdmlldy5zaXplKCkpOworCisgICAgICAgICAgICBtZW1jcHkodmlldy5iYXNlKCksIGRhdGEsIHNpemUpOworCisgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmVtcGxhY2VfYmFjayhuZXcgTGluZWFyQnVmZmVyKGJsb2NrKSk7CisgICAgICAgICAgICBmcmVlKGRhdGEpOworICAgICAgICB9CisgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICAvLyBETyBUSEUgREVDT0RJTkcKKyAgICAgICAgQVNTRVJUX0VRKGNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworICAgICAgICBBTE9HVigiRnJhbWUgIyVkIHNpemUgPSAlZCBxdWV1ZWQiLCBmcmFtZUlELCBzaXplKTsKKyAgICAgICAgZnJhbWVJRCsrOworICAgICAgICBtYXhSZXRyeSA9IDA7CisgICAgfQorfQorCitURVNUX0YoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgdmFsaWRhdGVDb21wTmFtZSkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBTE9HVigiQ2hlY2tzIGlmIHRoZSBnaXZlbiBjb21wb25lbnQgaXMgYSB2YWxpZCBhdWRpbyBjb21wb25lbnQiKTsKKyAgICB2YWxpZGF0ZUNvbXBvbmVudChtQ29tcG9uZW50LCBtQ29tcE5hbWUsIG1EaXNhYmxlVGVzdCk7CisgICAgQVNTRVJUX0VRKG1EaXNhYmxlVGVzdCwgZmFsc2UpOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgY29uZmlnQ29tcCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0cyBjb21wb25lbnQgc3BlY2lmaWMgY29uZmlndXJhdGlvbiIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIGludDMyX3QgYml0U3RyZWFtSW5mb1syXSA9IHswfTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICBzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIGJpdFN0cmVhbUluZm8pOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworY2xhc3MgQ29kZWMyQXVkaW9EZWNEZWNvZGVUZXN0CisgICAgOiBwdWJsaWMgQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwKKyAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxzdGQ6OnBhaXI8aW50MzJfdCwgYm9vbD4+IHsKK307CisKK1RFU1RfUChDb2RlYzJBdWRpb0RlY0RlY29kZVRlc3QsIERlY29kZVRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiRGVjb2RlcyBpbnB1dCBmaWxlIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgdWludDMyX3Qgc3RyZWFtSW5kZXggPSBHZXRQYXJhbSgpLmZpcnN0OworICAgIGJvb2wgc2lnbmFsRU9TID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgbVRpbWVzdGFtcERldlRlc3QgPSB0cnVlOworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8sIHN0cmVhbUluZGV4KTsKKyAgICBpZiAoIXN0cmNtcChtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKSkgeworICAgICAgICBBTE9HVigiRU1QVFkgSU5QVVQgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSAlcyBtVVJMICAlcyAiLAorICAgICAgICAgICAgICBnRW52LT5nZXRSZXMoKS5jX3N0cigpLCBtVVJMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgYm9vbCBjb2RlY0NvbmZpZyA9CisgICAgICAgICAgICAoKDEgPDwgKGZsYWdzIC0gMSkpICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwOworICAgICAgICBpZiAobVRpbWVzdGFtcERldlRlc3QgJiYgIWNvZGVjQ29uZmlnKQorICAgICAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5wdXNoX2JhY2sodGltZXN0YW1wKTsKKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworICAgIC8vIFJlc2V0IHRvdGFsIG5vIG9mIGZyYW1lcyByZWNlaXZlZAorICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgbVRpbWVzdGFtcFVzID0gMDsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07CisgICAgaWYgKG1Db21wTmFtZSA9PSByYXcpIHsKKyAgICAgICAgYml0U3RyZWFtSW5mb1swXSA9IDgwMDA7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMV0gPSAxOworICAgIH0gZWxzZSBpZiAobUNvbXBOYW1lID09IGc3MTFhbGF3IHx8IG1Db21wTmFtZSA9PSBnNzExbWxhdykgeworICAgICAgICAvLyBnNzExIHRlc3QgZGF0YSBpcyBhbGwgMS1jaGFubmVsIGFuZCBoYXMgbm8gZW1iZWRkZWQgY29uZmlnIGluZm8uCisgICAgICAgIGJpdFN0cmVhbUluZm9bMF0gPSA4MDAwOworICAgICAgICBiaXRTdHJlYW1JbmZvWzFdID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgfQorICAgIGlmICghc2V0dXBDb25maWdQYXJhbShtQ29tcG9uZW50LCBiaXRTdHJlYW1JbmZvKSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgKGludClJbmZvLnNpemUoKSwgc2lnbmFsRU9TKSk7CisKKyAgICAvLyBJZiBFT1MgaXMgbm90IHNlbnQsIHNlbmRpbmcgZW1wdHkgaW5wdXQgd2l0aCBFT1MgZmxhZworICAgIHNpemVfdCBpbmZvU2l6ZSA9IEluZm8uc2l6ZSgpOworICAgIGlmICghc2lnbmFsRU9TKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIDEpKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB0ZXN0SW5wdXRCdWZmZXIobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNLCBmYWxzZSkpOworICAgICAgICBpbmZvU2l6ZSArPSAxOworICAgIH0KKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBpbmZvU2l6ZSkgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dFKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXp1IiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBpbmZvU2l6ZSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCkgeworICAgICAgICB1aW50NjRfdCBleHBUczsKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlc1JlY2VpdmVkID0gMDsKKyAgICAgICAgLy8gVXBkYXRlIFNhbXBsZVJhdGUgYW5kIENoYW5uZWxDb3VudAorICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGdldElucHV0Q2hhbm5lbEluZm8obUNvbXBvbmVudCwgbUNvbXBOYW1lLCBiaXRTdHJlYW1JbmZvKSk7CisgICAgICAgIGludCBuU2FtcGxlUmF0ZSA9IGJpdFN0cmVhbUluZm9bMF07CisgICAgICAgIGludCBuQ2hhbm5lbHMgPSBiaXRTdHJlYW1JbmZvWzFdOworICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBpdEluID0gbVRpbWVzdGFtcFVzbGlzdC5iZWdpbigpOworICAgICAgICBhbmRyb2lkOjpMaXN0PG91dHB1dE1ldGFEYXRhPjo6aXRlcmF0b3IgaXRPdXQgPSBvQnVmZmVyTWV0YURhdGEuYmVnaW4oKTsKKyAgICAgICAgRVhQRUNUX0VRKCppdEluLCBpdE91dC0+dGltZXN0YW1wVXMpOworICAgICAgICBleHBUcyA9ICppdEluOworICAgICAgICB3aGlsZSAoaXRPdXQgIT0gb0J1ZmZlck1ldGFEYXRhLmVuZCgpKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoZXhwVHMsIGl0T3V0LT50aW1lc3RhbXBVcyk7CisgICAgICAgICAgICBpZiAoZXhwVHMgIT0gaXRPdXQtPnRpbWVzdGFtcFVzKSBicmVhazsKKyAgICAgICAgICAgIC8vIGJ1ZmZlciBzYW1wbGVzID0gKCh0b3RhbCBieXRlcykgLyAoYWMgKiAoYml0cyBwZXIgc2FtcGxlIC8gOCkpCisgICAgICAgICAgICBzYW1wbGVzUmVjZWl2ZWQgKz0gKChpdE91dC0+cmFuZ2VMZW5ndGgpIC8gKG5DaGFubmVscyAqIDIpKTsKKyAgICAgICAgICAgIGV4cFRzID0gc2FtcGxlc1JlY2VpdmVkICogMTAwMDAwMGxsIC8gblNhbXBsZVJhdGU7CisgICAgICAgICAgICBpdE91dCsrOworICAgICAgICB9CisgICAgICAgIGl0SW4gPSBtVGltZXN0YW1wVXNsaXN0LmVuZCgpOworICAgICAgICAtLWl0SW47CisgICAgICAgIEVYUEVDVF9HVChleHBUcywgKml0SW4pOworICAgICAgICBvQnVmZmVyTWV0YURhdGEuY2xlYXIoKTsKKyAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5jbGVhcigpOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisvLyBEZWNvZGVUZXN0IHdpdGggU3RyZWFtSW5kZXggYW5kIEVPUyAvIE5vIEVPUworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoU3RyZWFtSW5kZXhBbmRFT1MsIENvZGVjMkF1ZGlvRGVjRGVjb2RlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKHN0ZDo6bWFrZV9wYWlyKDAsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKDAsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoMSwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoMSwgdHJ1ZSkpKTsKKworLy8gdGh1bWJuYWlsIHRlc3QKK1RFU1RfRihDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LCBUaHVtYm5haWxUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgUmVxdWVzdCBmb3IgdGh1bWJuYWlsIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBhbmRyb2lkOjpWZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGludCBieXRlc0NvdW50ID0gMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShlbGVJbmZvID4+IGJ5dGVzQ291bnQpKSBicmVhazsKKyAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07CisgICAgaWYgKG1Db21wTmFtZSA9PSByYXcpIHsKKyAgICAgICAgYml0U3RyZWFtSW5mb1swXSA9IDgwMDA7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMV0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICB9CisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIGJpdFN0cmVhbUluZm8pKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisKKyAgICAvLyByZXF1ZXN0IEVPUyBmb3IgdGh1bWJuYWlsCisgICAgLy8gc2lnbmFsIEVPUyBmbGFnIHdpdGggbGFzdCBmcmFtZQorICAgIHNpemVfdCBpID0gLTE7CisgICAgZG8geworICAgICAgICBpKys7CisgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgaWYgKEluZm9baV0uZmxhZ3MpIGZsYWdzID0gMXUgPDwgKEluZm9baV0uZmxhZ3MgLSAxKTsKKworICAgIH0gd2hpbGUgKCEoZmxhZ3MgJiBTWU5DX0ZSQU1FKSk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsCisgICAgICAgIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCBpICsgMSkpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIEVYUEVDVF9HRShtRnJhbWVzUmVjZWl2ZWQsIDFVKTsKKyAgICBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgRU9TVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IGVtcHR5IGlucHV0IGJ1ZmZlciB3aXRoIEVPUyBmbGFnIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgLy8gUHJlcGFyZSBDMldvcmsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGlmICghbVdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLnN3YXAobVdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIm1Xb3JrUXVldWUgRW1wdHkgYXQgdGhlIHN0YXJ0IG9mIHRlc3QiOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KUMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSAwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IDA7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworCisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAobVdvcmtRdWV1ZS5zaXplKCkgIT0gTUFYX0lOUFVUX0JVRkZFUlMpIHsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtV29ya1F1ZXVlLnNpemUoKSwgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9EZWNIaWRsVGVzdCwgRmx1c2hUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3RzIEZsdXNoIGNhbGxzIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworICAgIGludDMyX3QgYml0U3RyZWFtSW5mb1syXSA9IHswfTsKKyAgICBpZiAobUNvbXBOYW1lID09IHJhdykgeworICAgICAgICBiaXRTdHJlYW1JbmZvWzBdID0gODAwMDsKKyAgICAgICAgYml0U3RyZWFtSW5mb1sxXSA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBnZXRJbnB1dENoYW5uZWxJbmZvKG1Db21wb25lbnQsIG1Db21wTmFtZSwgYml0U3RyZWFtSW5mbykpOworICAgIH0KKyAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obUNvbXBvbmVudCwgYml0U3RyZWFtSW5mbykpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICAvLyBEZWNvZGUgMTI4IGZyYW1lcyBhbmQgZmx1c2guIGhlcmUgMTI4IGlzIGNob3NlbiB0byBlbnN1cmUgdGhlcmUgaXMgYSBrZXkKKyAgICAvLyBmcmFtZSBhZnRlciB0aGlzIHNvIHRoYXQgdGhlIGJlbG93IHNlY3Rpb24gY2FuIGJlIGNvdmVyZWQgZm9yIGFsbAorICAgIC8vIGNvbXBvbmVudHMKKyAgICB1aW50MzJfdCBudW1GcmFtZXNGbHVzaGVkID0gMTI4OworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgbnVtRnJhbWVzRmx1c2hlZCwgZmFsc2UpKTsKKyAgICAvLyBmbHVzaAorICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gZmx1c2hlZFdvcms7CisgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworICAgIHVpbnQ2NF90IGZyYW1lSW5kZXg7CisgICAgeworICAgICAgICAvL1VwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9CisgICAgICAgICAgICAgICAgc3RkOjpmaW5kKG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gU2VlayB0byBuZXh0IGtleSBmcmFtZSBhbmQgc3RhcnQgZGVjb2RpbmcgdGlsbCB0aGUgZW5kCisgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CisgICAgaW50IGluZGV4ID0gbnVtRnJhbWVzRmx1c2hlZDsKKyAgICBib29sIGtleUZyYW1lID0gZmFsc2U7CisgICAgZmxhZ3MgPSAwOworICAgIHdoaWxlIChpbmRleCA8IChpbnQpSW5mby5zaXplKCkpIHsKKyAgICAgICAgaWYgKEluZm9baW5kZXhdLmZsYWdzKSBmbGFncyA9IDF1IDw8IChJbmZvW2luZGV4XS5mbGFncyAtIDEpOworICAgICAgICBpZiAoKGZsYWdzICYgU1lOQ19GUkFNRSkgPT0gU1lOQ19GUkFNRSkgeworICAgICAgICAgICAga2V5RnJhbWUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ3MgPSAwOworICAgICAgICBlbGVTdHJlYW0uaWdub3JlKEluZm9baW5kZXhdLmJ5dGVzQ291bnQpOworICAgICAgICBpbmRleCsrOworICAgIH0KKyAgICBpZiAoa2V5RnJhbWUpIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBkZWNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpSW5mby5zaXplKCkgLSBpbmRleCkpOworICAgIH0KKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBlcnIgPQorICAgICAgICBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgeworICAgICAgICAvL1VwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9CisgICAgICAgICAgICAgICAgc3RkOjpmaW5kKG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJBdWRpb0RlY0hpZGxUZXN0LCBEZWNvZGVUZXN0RW1wdHlCdWZmZXJzSW5zZXJ0ZWQpIHsKKyAgICBkZXNjcmlwdGlvbigiRGVjb2RlIHdpdGggbXVsdGlwbGUgZW1wdHkgaW5wdXQgZnJhbWVzIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKSA8PCBtVVJMIDw8ICIgLSBmaWxlIG5vdCBmb3VuZCI7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgdWludDMyX3QgZnJhbWVJZCA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgYm9vbCBjb2RlY0NvbmZpZyA9IGZhbHNlOworICAgIC8vIFRoaXMgdGVzdCBpbnRyb2R1Y2VzIGVtcHR5IENTRCBhZnRlciBldmVyeSAyMHRoIGZyYW1lCisgICAgLy8gYW5kIGVtcHR5IGlucHV0IGZyYW1lcyBhdCBhbiBpbnRlcnZhbCBvZiA1IGZyYW1lcy4KKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShmcmFtZUlkICUgNSkpIHsKKyAgICAgICAgICAgIGlmICghKGZyYW1lSWQgJSAyMCkpIGZsYWdzID0gMzI7CisgICAgICAgICAgICBlbHNlIGZsYWdzID0gMDsKKyAgICAgICAgICAgIGJ5dGVzQ291bnQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgICAgICBjb2RlY0NvbmZpZyA9IGZsYWdzID8KKyAgICAgICAgICAgICAgICAoKDEgPDwgKGZsYWdzIC0gMSkpICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwIDogMDsKKyAgICAgICAgfQorICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgICAgICBmcmFtZUlkKys7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMl0gPSB7MH07CisgICAgaWYgKG1Db21wTmFtZSA9PSByYXcpIHsKKyAgICAgICAgYml0U3RyZWFtSW5mb1swXSA9IDgwMDA7CisgICAgICAgIGJpdFN0cmVhbUluZm9bMV0gPSAxOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgZ2V0SW5wdXRDaGFubmVsSW5mbyhtQ29tcG9uZW50LCBtQ29tcE5hbWUsIGJpdFN0cmVhbUluZm8pKTsKKyAgICB9CisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIGJpdFN0cmVhbUluZm8pKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsCisgICAgICAgIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCAoaW50KUluZm8uc2l6ZSgpKSk7CisKKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgaWYgKCFtRW9zKSB7CisgICAgICAgIEFMT0dWKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgfQorCisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBJbmZvLnNpemUoKSkgeworICAgICAgICBBTE9HRSgiSW5wdXQgYnVmZmVyIGNvdW50IGFuZCBPdXRwdXQgYnVmZmVyIGNvdW50IG1pc21hdGNoIik7CisgICAgICAgIEFMT0dWKCJmcmFtZXNSZWNlaXZlZCA6ICVkIGlucHV0RnJhbWVzIDogJXp1IiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBJbmZvLnNpemUoKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBMT0coSU5GTykgPDwgIkMyIFRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvYXVkaW8vVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRBdWRpb0VuY1Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0QXVkaW9FbmNUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWJhZjdlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0QXVkaW9FbmNUZXN0LmNwcApAQCAtMCwwICsxLDY1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMl9oaWRsX2hhbF9hdWRpb19lbmNfdGVzdCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyQnVmZmVyUHJpdi5oPgorCit1c2luZyBhbmRyb2lkOjpDMkFsbG9jYXRvcklvbjsKKworI2luY2x1ZGUgPFZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZS5oPgorI2luY2x1ZGUgIm1lZGlhX2MyX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uaCIKKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKK2NsYXNzIExpbmVhckJ1ZmZlciA6IHB1YmxpYyBDMkJ1ZmZlciB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgTGluZWFyQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiYgYmxvY2spCisgICAgICAgIDogQzJCdWZmZXIoCisgICAgICAgICAgICAgIHtibG9jay0+c2hhcmUoYmxvY2stPm9mZnNldCgpLCBibG9jay0+c2l6ZSgpLCA6OkMyRmVuY2UoKSl9KSB7fQorfTsKKworc3RhdGljIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCogZ0VudiA9IG51bGxwdHI7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgOjpzdGQ6OnN0cmluZyBnZXRUZXN0Q2FzZUluZm8oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiA6OnN0ZDo6c3RyaW5nKCkgKworICAgICAgICAgICAgICAgICJDb21wb25lbnQ6ICIgKyBnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJJbnN0YW5jZTogIiArIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSArICIgfCAiICsKKyAgICAgICAgICAgICAgICAiUmVzOiAiICsgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKTsKKyAgICB9CisKKyAgICAvLyBnb29nbGUuY29kZWMyIEF1ZGlvIHRlc3Qgc2V0dXAKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtRGlzYWJsZVRlc3QgPSBmYWxzZTsKKyAgICAgICAgQUxPR1YoIkNvZGVjMkF1ZGlvRW5jSGlkbFRlc3QgU2V0VXAiKTsKKyAgICAgICAgbUNsaWVudCA9IGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgICAgICBnRW52LT5nZXRJbnN0YW5jZSgpLmNfc3RyKCkpOworICAgICAgICBBU1NFUlRfTkUobUNsaWVudCwgbnVsbHB0cik7CisgICAgICAgIG1MaXN0ZW5lci5yZXNldChuZXcgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgICAgIFt0aGlzXShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgICAgICBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOworICAgICAgICAgICAgfSkpOworICAgICAgICBBU1NFUlRfTkUobUxpc3RlbmVyLCBudWxscHRyKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgICAgICBtV29ya1F1ZXVlLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrKTsKKyAgICAgICAgfQorICAgICAgICBtQ2xpZW50LT5jcmVhdGVDb21wb25lbnQoZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSwgbUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db21wb25lbnQpOworICAgICAgICBBU1NFUlRfTkUobUNvbXBvbmVudCwgbnVsbHB0cik7CisKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IHN0b3JlID0KKyAgICAgICAgICAgIGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICAgICAgQ0hFQ0tfRVEoc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1MaW5lYXJBbGxvY2F0b3IpLAorICAgICAgICAgICAgICAgICBDMl9PSyk7CisgICAgICAgIG1MaW5lYXJQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUxpbmVhckFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sSWQrKyk7CisgICAgICAgIEFTU0VSVF9ORShtTGluZWFyUG9vbCwgbnVsbHB0cik7CisKKyAgICAgICAgbUNvbXBOYW1lID0gdW5rbm93bl9jb21wOworICAgICAgICBzdHJ1Y3QgU3RyaW5nVG9OYW1lIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIE5hbWU7CisgICAgICAgICAgICBzdGFuZGFyZENvbXAgQ29tcE5hbWU7CisgICAgICAgIH07CisgICAgICAgIGNvbnN0IFN0cmluZ1RvTmFtZSBrU3RyaW5nVG9OYW1lW10gPSB7CisgICAgICAgICAgICB7ImFhYyIsIGFhY30sCisgICAgICAgICAgICB7ImZsYWMiLCBmbGFjfSwKKyAgICAgICAgICAgIHsib3B1cyIsIG9wdXN9LAorICAgICAgICAgICAgeyJhbXJuYiIsIGFtcm5ifSwKKyAgICAgICAgICAgIHsiYW1yd2IiLCBhbXJ3Yn0sCisgICAgICAgIH07CisgICAgICAgIGNvbnN0IHNpemVfdCBrTnVtU3RyaW5nVG9OYW1lID0KKyAgICAgICAgICAgIHNpemVvZihrU3RyaW5nVG9OYW1lKSAvIHNpemVvZihrU3RyaW5nVG9OYW1lWzBdKTsKKworICAgICAgICAvLyBGaW5kIHRoZSBjb21wb25lbnQgdHlwZQorICAgICAgICBzdGQ6OnN0cmluZyBjb21wID0gc3RkOjpzdHJpbmcoZ0Vudi0+Z2V0Q29tcG9uZW50KCkpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1TdHJpbmdUb05hbWU7ICsraSkgeworICAgICAgICAgICAgaWYgKHN0cmNhc2VzdHIoY29tcC5jX3N0cigpLCBrU3RyaW5nVG9OYW1lW2ldLk5hbWUpKSB7CisgICAgICAgICAgICAgICAgbUNvbXBOYW1lID0ga1N0cmluZ1RvTmFtZVtpXS5Db21wTmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRW9zID0gZmFsc2U7CisgICAgICAgIG1Dc2QgPSBmYWxzZTsKKyAgICAgICAgbUZyYW1lc1JlY2VpdmVkID0gMDsKKyAgICAgICAgaWYgKG1Db21wTmFtZSA9PSB1bmtub3duX2NvbXApIG1EaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIGlmIChtRGlzYWJsZVRlc3QpIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgRGlzYWJsZWQgXG4iOworICAgICAgICBnZXRJbnB1dE1heEJ1ZlNpemUoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgICAgICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29tcG9uZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBTdXBlcjo6VGVhckRvd24oKTsKKyAgICB9CisgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCisgICAgdm9pZCBoYW5kbGVXb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtJdGVtcykgeworICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29ya0RvbmUobUNvbXBvbmVudCwgd29yaywgbUZsdXNoZWRJbmRpY2VzLCBtUXVldWVMb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUVvcywgbUNzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUmVjZWl2ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVudW0gc3RhbmRhcmRDb21wIHsKKyAgICAgICAgYWFjLAorICAgICAgICBmbGFjLAorICAgICAgICBvcHVzLAorICAgICAgICBhbXJuYiwKKyAgICAgICAgYW1yd2IsCisgICAgICAgIHVua25vd25fY29tcCwKKyAgICB9OworCisgICAgYm9vbCBtRW9zOworICAgIGJvb2wgbUNzZDsKKyAgICBib29sIG1EaXNhYmxlVGVzdDsKKyAgICBzdGFuZGFyZENvbXAgbUNvbXBOYW1lOworICAgIHVpbnQzMl90IG1GcmFtZXNSZWNlaXZlZDsKKyAgICBpbnQzMl90IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtRmx1c2hlZEluZGljZXM7CisKKyAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBtQmxvY2tQb29sSWQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtTGluZWFyUG9vbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1MaW5lYXJBbGxvY2F0b3I7CisKKyAgICBzdGQ6Om11dGV4IG1RdWV1ZUxvY2s7CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgbVF1ZXVlQ29uZGl0aW9uOworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gbVdvcmtRdWV1ZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6TGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IG1Db21wb25lbnQ7CisKKyAgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICAgIH0KKworICAgIC8vIEluIGVuY29kZXIgY29tcG9uZW50cywgZmV0Y2ggdGhlIHNpemUgb2YgaW5wdXQgYnVmZmVyIGFsbG9jYXRlZAorICAgIHZvaWQgZ2V0SW5wdXRNYXhCdWZTaXplKCkgeworICAgICAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMV0gPSB7MH07CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gaW5QYXJhbXM7CisgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IG1Db21wb25lbnQtPnF1ZXJ5KAorICAgICAgICAgICAge30sIHtDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dDo6UEFSQU1fVFlQRX0sIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAmaW5QYXJhbXMpOworICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LICYmIGluUGFyYW1zLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiUXVlcnkgTWF4QnVmZmVyU2l6ZUluZm8gZmFpbGVkID0+ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSBzaXplb2YoQzJQYXJhbSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGluUGFyYW1zLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgQzJQYXJhbSogcGFyYW0gPSBpblBhcmFtc1tpXS5nZXQoKTsKKyAgICAgICAgICAgICAgICBiaXRTdHJlYW1JbmZvW2ldID0gKihpbnQzMl90KikoKHVpbnQ4X3QqKXBhcmFtICsgb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtSW5wdXRNYXhCdWZTaXplID0gYml0U3RyZWFtSW5mb1swXTsKKyAgICB9CisKK307CisKK3ZvaWQgdmFsaWRhdGVDb21wb25lbnQoCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wTmFtZSwgYm9vbCYgZGlzYWJsZVRlc3QpIHsKKyAgICAvLyBWYWxpZGF0ZSBpdHMgYSBDMiBDb21wb25lbnQKKyAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiYzIiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiTm90IGEgYzIgY29tcG9uZW50Iik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIFZhbGlkYXRlIGl0cyBub3QgYW4gZW5jb2RlciBhbmQgdGhlIGNvbXBvbmVudCB0byBiZSB0ZXN0ZWQgaXMgYXVkaW8KKyAgICBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiZGVjb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIEFMT0dFKCJFeHBlY3RlZCBFbmNvZGVyLCBnaXZlbiBEZWNvZGVyIik7CisgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgYzJfc3RhdHVzX3QgYzJlcnIgPQorICAgICAgICBjb21wb25lbnQtPnF1ZXJ5KHt9LCB7QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICBpZiAoYzJlcnIgIT0gQzJfT0sgJiYgcXVlcmllZC5zaXplKCkgPT0gMCkgeworICAgICAgICBBTE9HRSgiUXVlcnkgbWVkaWEgdHlwZSBmYWlsZWQgPT4gJWQiLCBjMmVycik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgaW5wdXREb21haW4gPQorICAgICAgICAgICAgKChDMlN0cmVhbU1lZGlhVHlwZVNldHRpbmc6OmlucHV0KilxdWVyaWVkWzBdLmdldCgpKS0+bS52YWx1ZTsKKyAgICAgICAgaWYgKGlucHV0RG9tYWluLmZpbmQoImF1ZGlvLyIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgQXVkaW8gQ29tcG9uZW50Iik7CisgICAgICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZXMgY29tcG9uZW50IG5hbWUKKyAgICBpZiAoY29tcE5hbWUgPT0gQ29kZWMyQXVkaW9FbmNIaWRsVGVzdDo6dW5rbm93bl9jb21wKSB7CisgICAgICAgIEFMT0dFKCJDb21wb25lbnQgSW5WYWxpZCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQUxPR1YoIkNvbXBvbmVudCBWYWxpZCIpOworfQorCisvLyBTZXQgRGVmYXVsdCBjb25maWcgcGFyYW0uCitib29sIHNldHVwQ29uZmlnUGFyYW0oCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgIGludDMyX3QgbkNoYW5uZWxzLCBpbnQzMl90IG5TYW1wbGVSYXRlKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86OmlucHV0IHNhbXBsZVJhdGVJbmZvKDB1LCBuU2FtcGxlUmF0ZSk7CisgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBuQ2hhbm5lbHMpOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IGNvbmZpZ1BhcmFteyZzYW1wbGVSYXRlSW5mbywgJmNoYW5uZWxDb3VudEluZm99OworICAgIGMyX3N0YXR1c190IHN0YXR1cyA9CisgICAgICAgIGNvbXBvbmVudC0+Y29uZmlnKGNvbmZpZ1BhcmFtLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIGlmIChzdGF0dXMgPT0gQzJfT0sgJiYgZmFpbHVyZXMuc2l6ZSgpID09IDB1KSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIExvb2tVcFRhYmxlIG9mIGNsaXBzIGFuZCBtZXRhZGF0YSBmb3IgY29tcG9uZW50IHRlc3RpbmcKK3ZvaWQgR2V0VVJMRm9yQ29tcG9uZW50KENvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wLCBjaGFyKiBtVVJMKSB7CisgICAgc3RydWN0IENvbXBUb1VSTCB7CisgICAgICAgIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcCBjb21wOworICAgICAgICBjb25zdCBjaGFyKiBtVVJMOworICAgIH07CisgICAgc3RhdGljIGNvbnN0IENvbXBUb1VSTCBrQ29tcFRvVVJMW10gPSB7CisgICAgICAgIHtDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmFhYywKKyAgICAgICAgICJiYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXcifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YW1ybmIsCisgICAgICAgICAiYmJiX3Jhd18xY2hfOGtoel9zMTZsZS5yYXcifSwKKyAgICAgICAge0NvZGVjMkF1ZGlvRW5jSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YW1yd2IsCisgICAgICAgICAiYmJiX3Jhd18xY2hfMTZraHpfczE2bGUucmF3In0sCisgICAgICAgIHtDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmZsYWMsCisgICAgICAgICAiYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3In0sCisgICAgICAgIHtDb2RlYzJBdWRpb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Om9wdXMsCisgICAgICAgICAiYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3In0sCisgICAgfTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGtDb21wVG9VUkwpIC8gc2l6ZW9mKGtDb21wVG9VUkxbMF0pOyArK2kpIHsKKyAgICAgICAgaWYgKGtDb21wVG9VUkxbaV0uY29tcCA9PSBjb21wKSB7CisgICAgICAgICAgICBzdHJjYXQobVVSTCwga0NvbXBUb1VSTFtpXS5tVVJMKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBlbmNvZGVORnJhbWVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Om11dGV4ICZxdWV1ZUxvY2ssIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlJiBxdWV1ZUNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiYgZmx1c2hlZEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgbGluZWFyUG9vbCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtJiBlbGVTdHJlYW0sIHVpbnQzMl90IG5GcmFtZXMsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsIGludDMyX3QgbkNoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgIGludDMyX3QgblNhbXBsZVJhdGUsIGJvb2wgZmx1c2hlZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgIGJvb2wgc2lnbmFsRU9TID0gdHJ1ZSkgeworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKworICAgIHVpbnQzMl90IGZyYW1lSUQgPSAwOworICAgIHVpbnQzMl90IG1heFJldHJ5ID0gMDsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IHNhbXBsZXNQZXJGcmFtZSAqIG5DaGFubmVscyAqIDI7CisgICAgaW50MzJfdCB0aW1lc3RhbXBJbmNyID0KKyAgICAgICAgKGludCkoKChmbG9hdClzYW1wbGVzUGVyRnJhbWUgLyBuU2FtcGxlUmF0ZSkgKiAxMDAwMDAwKTsKKyAgICB1aW50NjRfdCB0aW1lc3RhbXAgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChuRnJhbWVzID09IDApIGJyZWFrOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgICAgIHdoaWxlICghd29yayAmJiAobWF4UmV0cnkgPCBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBpZiAoIXdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29yay5zd2FwKHdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICB3b3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghd29yayAmJiAobWF4UmV0cnkgPj0gTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJXYWl0IGZvciBnZW5lcmF0aW5nIEMyV29yayBleGNlZWRlZCB0aW1lb3V0IjsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2lnbmFsRU9TICYmIChuRnJhbWVzID09IDEpKQorICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgaWYgKGZsdXNoZWQpIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IFNZTkNfRlJBTUU7CisgICAgICAgICAgICBmbHVzaGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpZmxhZ3M7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gdGltZXN0YW1wOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBmcmFtZUlEOworICAgICAgICB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBmbHVzaGVkSW5kaWNlcy5lbXBsYWNlX2JhY2soZnJhbWVJRCk7CisgICAgICAgIH0KKyAgICAgICAgY2hhciogZGF0YSA9IChjaGFyKiltYWxsb2MoYnl0ZXNDb3VudCk7CisgICAgICAgIEFTU0VSVF9ORShkYXRhLCBudWxscHRyKTsKKyAgICAgICAgZWxlU3RyZWFtLnJlYWQoZGF0YSwgYnl0ZXNDb3VudCk7CisgICAgICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uZ2NvdW50KCksIGJ5dGVzQ291bnQpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgIEFTU0VSVF9FUShDMl9PSywgbGluZWFyUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNDb3VudCwge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsb2NrKSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGJsb2NrKTsKKyAgICAgICAgLy8gV3JpdGUgVmlldworICAgICAgICBDMldyaXRlVmlldyB2aWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkMyTGluZWFyQmxvY2s6Om1hcCgpIGZhaWxlZCA6ICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEFTU0VSVF9FUSgoc2l6ZV90KWJ5dGVzQ291bnQsIHZpZXcuY2FwYWNpdHkoKSk7CisgICAgICAgIEFTU0VSVF9FUSgwdSwgdmlldy5vZmZzZXQoKSk7CisgICAgICAgIEFTU0VSVF9FUSgoc2l6ZV90KWJ5dGVzQ291bnQsIHZpZXcuc2l6ZSgpKTsKKworICAgICAgICBtZW1jcHkodmlldy5iYXNlKCksIGRhdGEsIGJ5dGVzQ291bnQpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG5ldyBMaW5lYXJCdWZmZXIoYmxvY2spKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworICAgICAgICBmcmVlKGRhdGEpOworCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIC8vIERPIFRIRSBERUNPRElORworICAgICAgICBBU1NFUlRfRVEoY29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisgICAgICAgIEFMT0dWKCJGcmFtZSAjJWQgc2l6ZSA9ICVkIHF1ZXVlZCIsIGZyYW1lSUQsIGJ5dGVzQ291bnQpOworICAgICAgICBuRnJhbWVzLS07CisgICAgICAgIHRpbWVzdGFtcCArPSB0aW1lc3RhbXBJbmNyOworICAgICAgICBmcmFtZUlEKys7CisgICAgICAgIG1heFJldHJ5ID0gMDsKKyAgICB9Cit9CisKK1RFU1RfRihDb2RlYzJBdWRpb0VuY0hpZGxUZXN0LCB2YWxpZGF0ZUNvbXBOYW1lKSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFMT0dWKCJDaGVja3MgaWYgdGhlIGdpdmVuIGNvbXBvbmVudCBpcyBhIHZhbGlkIGF1ZGlvIGNvbXBvbmVudCIpOworICAgIHZhbGlkYXRlQ29tcG9uZW50KG1Db21wb25lbnQsIG1Db21wTmFtZSwgbURpc2FibGVUZXN0KTsKKyAgICBBU1NFUlRfRVEobURpc2FibGVUZXN0LCBmYWxzZSk7Cit9CisKK2NsYXNzIENvZGVjMkF1ZGlvRW5jRW5jb2RlVGVzdAorICAgIDogcHVibGljIENvZGVjMkF1ZGlvRW5jSGlkbFRlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjpwYWlyPGJvb2wsIGludDMyX3Q+PiB7Cit9OworCitURVNUX1AoQ29kZWMyQXVkaW9FbmNFbmNvZGVUZXN0LCBFbmNvZGVUZXN0KSB7CisgICAgQUxPR1YoIkVuY29kZVRlc3QiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgY2hhciBtVVJMWzUxMl07CisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwpOworICAgIGJvb2wgc2lnbmFsRU9TID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICAvLyBSYXRpbyB3LnIudCB0byBtSW5wdXRNYXhCdWZTaXplCisgICAgaW50MzJfdCBpbnB1dE1heEJ1ZlJhdGlvID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisKKyAgICAvLyBTZXR0aW5nIGRlZmF1bHQgc2FtcGxlUmF0ZQorICAgIGludDMyX3QgbkNoYW5uZWxzID0gMjsKKyAgICBpbnQzMl90IG5TYW1wbGVSYXRlID0gNDQxMDA7CisgICAgc3dpdGNoIChtQ29tcE5hbWUpIHsKKyAgICAgICAgY2FzZSBhYWM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGZsYWM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIG9wdXM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFtcm5iOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gODAwMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFtcndiOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gMTYwMDA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPQorICAgICAgICAoKG1JbnB1dE1heEJ1ZlNpemUgLyBpbnB1dE1heEJ1ZlJhdGlvKSAvIChuQ2hhbm5lbHMgKiAyKSk7CisgICAgQUxPR1YoInNpZ25hbEVPUyAlZCBtSW5wdXRNYXhCdWZTaXplICVkIHNhbXBsZXNQZXJGcmFtZSAlZCIsIHNpZ25hbEVPUywKKyAgICAgICAgICBtSW5wdXRNYXhCdWZTaXplLCBzYW1wbGVzUGVyRnJhbWUpOworCisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIG5DaGFubmVscywgblNhbXBsZVJhdGUpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICB1aW50MzJfdCBudW1GcmFtZXMgPSAxNjsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgbnVtRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSwgbkNoYW5uZWxzLCBuU2FtcGxlUmF0ZSwgZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgc2lnbmFsRU9TKSk7CisKKyAgICAvLyBJZiBFT1MgaXMgbm90IHNlbnQsIHNlbmRpbmcgZW1wdHkgaW5wdXQgd2l0aCBFT1MgZmxhZworICAgIGlmICghc2lnbmFsRU9TKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIDEpKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB0ZXN0SW5wdXRCdWZmZXIobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNLCBmYWxzZSkpOworICAgICAgICBudW1GcmFtZXMgKz0gMTsKKyAgICB9CisKKyAgICAvLyBibG9ja2luZyBjYWxsIHRvIGVuc3VyZXMgYXBwbGljYXRpb24gdG8gV2FpdCB0aWxsIGFsbCB0aGUgaW5wdXRzIGFyZQorICAgIC8vIGNvbnN1bWVkCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSBudW1GcmFtZXMpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HRSgiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICV1IiwgbUZyYW1lc1JlY2VpdmVkLCBudW1GcmFtZXMpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorICAgIGlmICgobUNvbXBOYW1lID09IGZsYWMgfHwgbUNvbXBOYW1lID09IG9wdXMgfHwgbUNvbXBOYW1lID09IGFhYykpIHsKKyAgICAgICAgaWYgKCFtQ3NkKSB7CisgICAgICAgICAgICBBTE9HRSgiQ1NEIGJ1ZmZlciBtaXNzaW5nIik7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworLy8gRW5jb2RlVGVzdCB3aXRoIEVPUyAvIE5vIEVPUyBhbmQgaW5wdXRNYXhCdWZSYXRpbworLy8gaW5wdXRNYXhCdWZSYXRpbyBpcyByYXRpbyB3LnIudC4gdG8gbUlucHV0TWF4QnVmU2l6ZQorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoRW5jb2RlVGVzdCwgQ29kZWMyQXVkaW9FbmNFbmNvZGVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoc3RkOjptYWtlX3BhaXIoZmFsc2UsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoZmFsc2UsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIodHJ1ZSwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcih0cnVlLCAyKSkpOworCisKK1RFU1RfRihDb2RlYzJBdWRpb0VuY0hpZGxUZXN0LCBFT1NUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgZW1wdHkgaW5wdXQgYnVmZmVyIHdpdGggRU9TIGZsYWciKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrOworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgbVdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJtV29ya1F1ZXVlIEVtcHR5IGlzIG5vdCBleHBlY3RlZCBhdCB0aGUgc3RhcnQgb2YgdGhlIHRlc3QiKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IDA7CisgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gMDsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisgICAgdWludDMyX3QgcXVldWVTaXplOworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgcXVldWVTaXplID0gbVdvcmtRdWV1ZS5zaXplKCk7CisgICAgICAgIGlmIChxdWV1ZVNpemUgPCBNQVhfSU5QVVRfQlVGRkVSUykgeworICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyQXVkaW9FbmNIaWRsVGVzdCwgRmx1c2hUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3QgUmVxdWVzdCBmb3IgZmx1c2giKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgY2hhciBtVVJMWzUxMl07CisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwpOworCisgICAgLy8gU2V0dGluZyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24KKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICBpbnQzMl90IG5DaGFubmVscyA9IDI7CisgICAgaW50MzJfdCBuU2FtcGxlUmF0ZSA9IDQ0MTAwOworICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gMTAyNDsKKyAgICBzd2l0Y2ggKG1Db21wTmFtZSkgeworICAgICAgICBjYXNlIGFhYzoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDI7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTAyNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGZsYWM6CisgICAgICAgICAgICBuQ2hhbm5lbHMgPSAyOworICAgICAgICAgICAgblNhbXBsZVJhdGUgPSA0ODAwMDsKKyAgICAgICAgICAgIHNhbXBsZXNQZXJGcmFtZSA9IDExNTI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBvcHVzOgorICAgICAgICAgICAgbkNoYW5uZWxzID0gMjsKKyAgICAgICAgICAgIG5TYW1wbGVSYXRlID0gNDgwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSA5NjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbXJuYjoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDE7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDgwMDA7CisgICAgICAgICAgICBzYW1wbGVzUGVyRnJhbWUgPSAxNjA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhbXJ3YjoKKyAgICAgICAgICAgIG5DaGFubmVscyA9IDE7CisgICAgICAgICAgICBuU2FtcGxlUmF0ZSA9IDE2MDAwOworICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lID0gMTYwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorCisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG1Db21wb25lbnQsIG5DaGFubmVscywgblNhbXBsZVJhdGUpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIHVpbnQzMl90IG51bUZyYW1lc0ZsdXNoZWQgPSAzMDsKKyAgICB1aW50MzJfdCBudW1GcmFtZXMgPSAxMjg7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sIG51bUZyYW1lc0ZsdXNoZWQsCisgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlc1BlckZyYW1lLCBuQ2hhbm5lbHMsIG5TYW1wbGVSYXRlKSk7CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBmbHVzaGVkV29yazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPQorICAgICAgICBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisgICAgdWludDY0X3QgZnJhbWVJbmRleDsKKyAgICB7CisgICAgICAgIC8vVXBkYXRlIG1GbHVzaGVkSW5kaWNlcyBiYXNlZCBvbiB0aGUgaW5kZXggcmVjZWl2ZWQgZnJvbSBmbHVzaCgpCisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgICAgICAgICAgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgZnJhbWVJbmRleEl0ID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZpbmQobUZsdXNoZWRJbmRpY2VzLmJlZ2luKCksIG1GbHVzaGVkSW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVJbmRleCk7CisgICAgICAgICAgICBpZiAoIW1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpICYmCisgICAgICAgICAgICAgICAgKGZyYW1lSW5kZXhJdCAhPSBtRmx1c2hlZEluZGljZXMuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLmVyYXNlKGZyYW1lSW5kZXhJdCk7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVdvcmtRdWV1ZS5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcyAtIG51bUZyYW1lc0ZsdXNoZWQsIHNhbXBsZXNQZXJGcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBuQ2hhbm5lbHMsIG5TYW1wbGVSYXRlLCB0cnVlKSk7CisgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgZXJyID0KKyAgICAgICAgbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworICAgIHsKKyAgICAgICAgLy9VcGRhdGUgbUZsdXNoZWRJbmRpY2VzIGJhc2VkIG9uIHRoZSBpbmRleCByZWNlaXZlZCBmcm9tIGZsdXNoKCkKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IGZsdXNoZWRXb3JrKSB7CisgICAgICAgICAgICBBU1NFUlRfTkUod29yaywgbnVsbHB0cik7CisgICAgICAgICAgICBmcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBmcmFtZUluZGV4SXQgPQorICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9FUShtRmx1c2hlZEluZGljZXMuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGdFbnYgPSBuZXcgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgZ0Vudi0+aW5pdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJDMiBUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2F1ZGlvL21lZGlhX2MyX2F1ZGlvX2hpZGxfdGVzdF9jb21tb24uaCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9tZWRpYV9jMl9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ3NzNjZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9hdWRpby9tZWRpYV9jMl9hdWRpb19oaWRsX3Rlc3RfY29tbW9uLmgKQEAgLTAsMCArMSwyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfQzJfQVVESU9fSElETF9URVNUX0NPTU1PTl9ICisjZGVmaW5lIE1FRElBX0MyX0FVRElPX0hJRExfVEVTVF9DT01NT05fSAorCisKKyNlbmRpZiAgLy8gTUVESUFfQzJfQVVESU9fSElETF9URVNUX0NPTU1PTl9ICmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTAxMWJhMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vQW5kcm9pZC5icApAQCAtMCwwICsxLDMzIEBACitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogIlZ0c0hhbE1lZGlhQzJWMV8wQ29tbW9uVXRpbCIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgIlZ0c0hhbFRhcmdldFRlc3REZWZhdWx0cyIsCisgICAgICAgICJsaWJjb2RlYzItaGlkbC1jbGllbnQtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogIlZ0c0hhbE1lZGlhQzJWMV8wRGVmYXVsdHMiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJWdHNIYWxUYXJnZXRUZXN0RGVmYXVsdHMiLAorICAgICAgICAibGliY29kZWMyLWhpZGwtY2xpZW50LWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgIlZ0c0hhbE1lZGlhQzJWMV8wQ29tbW9uVXRpbCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfY2xpZW50IiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9SRUFETUUubWQgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmY1NzljCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9SRUFETUUubWQKQEAgLTAsMCArMSwzNiBAQAorIyBDb2RlYzIgVlRTIEhhbCBAIDEuMCB0ZXN0cyAjCisKKyMjIG1hc3RlciA6CitGdW5jdGlvbmFsaXR5IG9mIG1hc3RlciBpcyB0byBlbnVtZXJhdGUgYWxsIHRoZSBDb2RlYzIgY29tcG9uZW50cyBhdmFpbGFibGUgaW4gQzIgbWVkaWEgc2VydmljZS4KKwordXNhZ2U6IGBWdHNIYWxNZWRpYUMyVjFfMFRhcmdldE1hc3RlclRlc3QgLUkgZGVmYXVsdGAKKworIyMgY29tcG9uZW50IDoKK0Z1bmN0aW9uYWxpdHkgb2YgY29tcG9uZW50IHRlc3QgaXMgdG8gdmFsaWRhdGUgY29tbW9uIGZ1bmN0aW9uYWxpdHkgYWNyb3NzIGFsbCB0aGUgQ29kZWMyIGNvbXBvbmVudHMgYXZhaWxhYmxlIGluIEMyIG1lZGlhIHNlcnZpY2UuIEZvciBhIHN0YW5kYXJkIEMyIGNvbXBvbmVudCwgdGhlc2UgdGVzdHMgYXJlIGV4cGVjdGVkIHRvIHBhc3MuCisKK3VzYWdlOiBgVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0IC1JIHNvZnR3YXJlIC1DIDxjb21wIG5hbWU+YAorCitleGFtcGxlOiBgVnRzSGFsTWVkaWFDMlYxXzBUYXJnZXRDb21wb25lbnRUZXN0IC1JIHNvZnR3YXJlIC1DIGMyLmFuZHJvaWQudm9yYmlzLmRlY29kZXJgCisKKyMjIGF1ZGlvIDoKK0Z1bmN0aW9uYWxpdHkgb2YgYXVkaW8gdGVzdCBpcyB0byB2YWxpZGF0ZSBhdWRpbyBzcGVjaWZpYyBmdW5jdGlvbmFsaXR5IG9mIENvZGVjMiBjb21wb25lbnRzLiBUaGUgcmVzb3VyY2UgZmlsZXMgZm9yIHRoaXMgdGVzdCBhcmUgdGFrZW4gZnJvbSBgZnJhbWV3b3Jrcy9hdi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzYC4gVGhlIHBhdGggdG8gdGhlc2UgZmlsZXMgb24gdGhlIGRldmljZSBjYW4gYmUgc3BlY2lmaWVkIHdpdGggYC1QYC4gKElmIHRoZSBkZXZpY2UgcGF0aCBpcyBvbWl0dGVkLCBgL2RhdGEvbG9jYWwvdG1wL21lZGlhL2AgaXMgdGhlIGRlZmF1bHQgdmFsdWUuKQorCit1c2FnZTogYFZ0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0IC1JIGRlZmF1bHQgLUMgPGNvbXAgbmFtZT4gLVAgPHBhdGggdG8gcmVzb3VyY2UgZmlsZXM+YAorCit1c2FnZTogYFZ0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0QXVkaW9FbmNUZXN0IC1JIHNvZnR3YXJlIC1DIDxjb21wIG5hbWU+IC1QIDxwYXRoIHRvIHJlc291cmNlIGZpbGVzPmAKKworZXhhbXBsZTogYFZ0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0QXVkaW9EZWNUZXN0IC1JIHNvZnR3YXJlIC1DIGMyLmFuZHJvaWQuZmxhYy5kZWNvZGVyIC1QIC9kYXRhL2xvY2FsL3RtcC9tZWRpYS9gCisKK2V4YW1wbGU6IGBWdHNIYWxNZWRpYUMyVjFfMFRhcmdldEF1ZGlvRW5jVGVzdCAtSSBzb2Z0d2FyZSAtQyBjMi5hbmRyb2lkLm9wdXMuZW5jb2RlciAtUCAvZGF0YS9sb2NhbC90bXAvbWVkaWEvYAorCisjIyB2aWRlbyA6CitGdW5jdGlvbmFsaXR5IG9mIHZpZGVvIHRlc3QgaXMgdG8gdmFsaWRhdGUgdmlkZW8gc3BlY2lmaWMgZnVuY3Rpb25hbGl0eSBvZiBDb2RlYzIgY29tcG9uZW50cy4gVGhlIHJlc291cmNlIGZpbGVzIGZvciB0aGlzIHRlc3QgYXJlIHRha2VuIGZyb20gYGZyYW1ld29ya3MvYXYvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlc2AuIFRoZSBwYXRoIHRvIHRoZXNlIGZpbGVzIG9uIHRoZSBkZXZpY2UgY2FuIGJlIHNwZWNpZmllZCB3aXRoIGAtUGAuIChJZiB0aGUgZGV2aWNlIHBhdGggaXMgb21pdHRlZCwgYC9kYXRhL2xvY2FsL3RtcC9tZWRpYS9gIGlzIHRoZSBkZWZhdWx0IHZhbHVlLikKKwordXNhZ2U6IGBWdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdCAtSSBkZWZhdWx0IC1DIDxjb21wIG5hbWU+IC1QIDxwYXRoIHRvIHJlc291cmNlIGZpbGVzPmAKKwordXNhZ2U6IGBWdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdCAtSSBzb2Z0d2FyZSAtQyA8Y29tcCBuYW1lPiAtUCA8cGF0aCB0byByZXNvdXJjZSBmaWxlcz5gCisKK2V4YW1wbGU6IGBWdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdCAtSSBzb2Z0d2FyZSAtQyBjMi5hbmRyb2lkLmF2Yy5kZWNvZGVyIC1QIC9kYXRhL2xvY2FsL3RtcC9tZWRpYS9gCisKK2V4YW1wbGU6IGBWdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdCAtSSBzb2Z0d2FyZSAtQyBjMi5hbmRyb2lkLnZwOS5lbmNvZGVyIC1QIC9kYXRhL2xvY2FsL3RtcC9tZWRpYS9gCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3M2I3MzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tbW9uL21lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uY3BwCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbiIKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCisvLyBUZXN0IHRoZSBjb2RlY3MgZm9yIE51bGxCdWZmZXIsIEVtcHR5IElucHV0IEJ1ZmZlciB3aXRoKG91dCkgZmxhZ3Mgc2V0Cit2b2lkIHRlc3RJbnB1dEJ1ZmZlcigKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgc3RkOjptdXRleCYgcXVldWVMb2NrLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCisgICAgdWludDMyX3QgZmxhZ3MsIGJvb2wgaXNOdWxsQnVmZmVyKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB7CisgICAgICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICBpZiAoIXdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLnN3YXAod29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgd29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJ3b3JrUXVldWUgRW1wdHkgYXQgdGhlIHN0YXJ0IG9mIHRlc3QiOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wID0gMDsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSAwOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBpZiAoaXNOdWxsQnVmZmVyKSB7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wbGFjZV9iYWNrKG51bGxwdHIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgQVNTRVJUX0VRKGNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworfQorCisvLyBXYWl0IGZvciBhbGwgdGhlIGlucHV0cyB0byBiZSBjb25zdW1lZCBieSB0aGUgcGx1Z2luLgordm9pZCB3YWl0T25JbnB1dENvbnN1bXB0aW9uKHN0ZDo6bXV0ZXgmIHF1ZXVlTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJDb3VudCkgeworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICB1aW50MzJfdCBxdWV1ZVNpemU7CisgICAgdWludDMyX3QgbWF4UmV0cnkgPSAwOworICAgIHsKKyAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICBxdWV1ZVNpemUgPSB3b3JrUXVldWUuc2l6ZSgpOworICAgIH0KKyAgICB3aGlsZSAoKG1heFJldHJ5IDwgTUFYX1JFVFJZKSAmJiAocXVldWVTaXplIDwgYnVmZmVyQ291bnQpKSB7CisgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgaWYgKHF1ZXVlU2l6ZSAhPSB3b3JrUXVldWUuc2l6ZSgpKSB7CisgICAgICAgICAgICBxdWV1ZVNpemUgPSB3b3JrUXVldWUuc2l6ZSgpOworICAgICAgICAgICAgbWF4UmV0cnkgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCit2b2lkIHdvcmtEb25lKAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yaywgc3RkOjpsaXN0PHVpbnQ2NF90PiYgZmx1c2hlZEluZGljZXMsCisgICAgc3RkOjptdXRleCYgcXVldWVMb2NrLCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLCBib29sJiBlb3MsIGJvb2wmIGNzZCwKKyAgICB1aW50MzJfdCYgZnJhbWVzUmVjZWl2ZWQpIHsKKyAgICAvLyBoYW5kbGUgY29uZmlndXJhdGlvbiBjaGFuZ2VzIGluIHdvcmsgZG9uZQorICAgIGlmICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuY29uZmlnVXBkYXRlLnNpemUoKSAhPSAwKSB7CisgICAgICAgIEFMT0dWKCJDb25maWcgVXBkYXRlIik7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gdXBkYXRlcyA9CisgICAgICAgICAgICBzdGQ6Om1vdmUod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmNvbmZpZ1VwZGF0ZSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBjb25maWdQYXJhbTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHVwZGF0ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIEMyUGFyYW0qIHBhcmFtID0gdXBkYXRlc1tpXS5nZXQoKTsKKyAgICAgICAgICAgIGlmIChwYXJhbS0+aW5kZXgoKSA9PSBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSB7CisgICAgICAgICAgICAgICAgY3NkID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHBhcmFtLT5pbmRleCgpID09CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVNhbXBsZVJhdGVJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS0+aW5kZXgoKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpIHx8CisgICAgICAgICAgICAgICAgICAgICAgIChwYXJhbS0+aW5kZXgoKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpIHsKKyAgICAgICAgICAgICAgICBjb25maWdQYXJhbS5wdXNoX2JhY2socGFyYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGNvbXBvbmVudC0+Y29uZmlnKGNvbmZpZ1BhcmFtLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgICAgICBBU1NFUlRfRVEoZmFpbHVyZXMuc2l6ZSgpLCAwdSk7CisgICAgfQorICAgIGlmICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuZmxhZ3MgIT0gQzJGcmFtZURhdGE6OkZMQUdfSU5DT01QTEVURSkgeworICAgICAgICBmcmFtZXNSZWNlaXZlZCsrOworICAgICAgICBlb3MgPSAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICYKKyAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9IDA7CisgICAgICAgIGF1dG8gZnJhbWVJbmRleEl0ID0gc3RkOjpmaW5kKGZsdXNoZWRJbmRpY2VzLmJlZ2luKCksIGZsdXNoZWRJbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgICAgIEFMT0dWKCJXb3JrRG9uZTogZnJhbWVJRCByZWNlaXZlZCAlZCIsCisgICAgICAgICAgICAgIChpbnQpd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB7CisgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICB3b3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICBpZiAoIWZsdXNoZWRJbmRpY2VzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBmbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcXVldWVDb25kaXRpb24ubm90aWZ5X2FsbCgpOworICAgICAgICB9CisgICAgfQorfQorCisvLyBSZXR1cm4gY3VycmVudCB0aW1lIGluIG1pY3JvIHNlY29uZHMKK2ludDY0X3QgZ2V0Tm93VXMoKSB7CisgICAgc3RydWN0IHRpbWV2YWwgdHY7CisgICAgZ2V0dGltZW9mZGF5KCZ0diwgTlVMTCk7CisKKyAgICByZXR1cm4gKGludDY0X3QpdHYudHZfdXNlYyArIHR2LnR2X3NlYyAqIDEwMDAwMDBsbDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbW1vbi9tZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI1OWU1NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9jb21tb24vbWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9DMl9ISURMX1RFU1RfQ09NTU9OX0gKKyNkZWZpbmUgTUVESUFfQzJfSElETF9URVNUX0NPTU1PTl9ICisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oPgorCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6dXRpbHM7CisKK3VzaW5nIDo6YW5kcm9pZDo6TXV0ZXhlZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOworCisjaW5jbHVkZSA8VnRzSGFsSGlkbFRhcmdldFRlc3RFbnZCYXNlLmg+CisKKyNkZWZpbmUgTUFYX1JFVFJZIDIwCisjZGVmaW5lIFRJTUVfT1VUIDQwMG1zCisjZGVmaW5lIE1BWF9JTlBVVF9CVUZGRVJTIDgKKworLyoKKyAqIEhhbmRsZSBDYWxsYmFjayBmdW5jdGlvbnMgb25Xb3JrRG9uZSgpLCBvblRyaXBwZWQoKSwKKyAqIG9uRXJyb3IoKSwgb25EZWF0aCgpLCBvbkZyYW1lc1JlbmRlcmVkKCkKKyAqLworc3RydWN0IENvZGVjTGlzdGVuZXIgOiBwdWJsaWMgYW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lciB7CisgICBwdWJsaWM6CisgICAgQ29kZWNMaXN0ZW5lcigKKyAgICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcyk+IGZuID0KKyAgICAgICAgICAgIG51bGxwdHIpCisgICAgICAgIDogY2FsbEJhY2soZm4pIHt9CisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmUoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wLAorICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIG92ZXJyaWRlIHsKKyAgICAgICAgLyogVE9ETyAqLworICAgICAgICBBTE9HRCgib25Xb3JrRG9uZSBjYWxsZWQiKTsKKyAgICAgICAgKHZvaWQpY29tcDsKKyAgICAgICAgaWYgKGNhbGxCYWNrKSBjYWxsQmFjayh3b3JrSXRlbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWQoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4mIHNldHRpbmdSZXN1bHRzKQorICAgICAgICBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpY29tcDsKKyAgICAgICAgKHZvaWQpc2V0dGluZ1Jlc3VsdHM7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRXJyb3IoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wLAorICAgICAgICB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgLyogVE9ETyAqLworICAgICAgICAodm9pZCljb21wOworICAgICAgICBBTE9HRCgib25FcnJvciBjYWxsZWQiKTsKKyAgICAgICAgaWYgKGVycm9yQ29kZSAhPSAwKSBBTE9HRSgiRXJyb3IgOiAldSIsIGVycm9yQ29kZSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRGVhdGgoCisgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wKSBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpY29tcDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUoCisgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBhcnJheUluZGV4KSBvdmVycmlkZSB7CisgICAgICAgIC8qIFRPRE8gKi8KKyAgICAgICAgKHZvaWQpZnJhbWVJbmRleDsKKyAgICAgICAgKHZvaWQpYXJyYXlJbmRleDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZVJlbmRlcmVkKAorICAgICAgICB1aW50NjRfdCBidWZmZXJRdWV1ZUlkLAorICAgICAgICBpbnQzMl90IHNsb3RJZCwKKyAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBOcykgb3ZlcnJpZGUgeworICAgICAgICAvKiBUT0RPICovCisgICAgICAgICh2b2lkKWJ1ZmZlclF1ZXVlSWQ7CisgICAgICAgICh2b2lkKXNsb3RJZDsKKyAgICAgICAgKHZvaWQpdGltZXN0YW1wTnM7CisgICAgfQorICAgIC8vIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICAvLyBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgLy8gc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpPiBjYWxsQmFjazsKK307CisKKy8vIEEgY2xhc3MgZm9yIHRlc3QgZW52aXJvbm1lbnQgc2V0dXAKK2NsYXNzIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0RW52QmFzZSB7CisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEVudkJhc2UgU3VwZXI7CisKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJUZXN0U2VydmljZXMoKSBvdmVycmlkZSB7CisgICAgICAgIHJlZ2lzdGVyVGVzdFNlcnZpY2U8SUNvbXBvbmVudFN0b3JlPigpOworICAgIH0KKworICAgIENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvbWVkaWEvIikge30KKworICAgIHZvaWQgc2V0Q29tcG9uZW50KGNvbnN0IGNoYXIqIF9jb21wb25lbnQpIHsgY29tcG9uZW50ID0gX2NvbXBvbmVudDsgfQorCisgICAgdm9pZCBzZXRJbnN0YW5jZShjb25zdCBjaGFyKiBfaW5zdGFuY2UpIHsgaW5zdGFuY2UgPSBfaW5zdGFuY2U7IH0KKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIqIF9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3QgaGlkbF9zdHJpbmcgZ2V0SW5zdGFuY2UoKSBjb25zdCB7IHJldHVybiBpbnN0YW5jZTsgfQorCisgICAgY29uc3QgaGlkbF9zdHJpbmcgZ2V0Q29tcG9uZW50KCkgY29uc3QgeyByZXR1cm4gY29tcG9uZW50OyB9CisKKyAgICBjb25zdCBoaWRsX3N0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KKworICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHsKKyAgICAgICAgICAgIHsiaW5zdGFuY2UiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ0knfSwKKyAgICAgICAgICAgIHsiY29tcG9uZW50IiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdDJ30sCisgICAgICAgICAgICB7InJlcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LAorICAgICAgICAgICAgezAsIDAsIDAsIDB9fTsKKworICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIkk6QzpQOiIsIG9wdGlvbnMsICZpbmRleCk7CisgICAgICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgICAgICBjYXNlICdJJzoKKyAgICAgICAgICAgICAgICAgICAgc2V0SW5zdGFuY2Uob3B0YXJnKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnQyc6CisgICAgICAgICAgICAgICAgICAgIHNldENvbXBvbmVudChvcHRhcmcpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgICAgICAgICAgc2V0UmVzKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJz8nOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBvcHRpb246ICVzXG5cbiIKKyAgICAgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICAgICAiLUksIC0taW5zdGFuY2U6IHNvZnR3YXJlIGZvciBDMiBjb21wb25lbnRzLCBlbHNlIGRlZmF1bHRcbiIKKyAgICAgICAgICAgICAgICAgICAgIi1DLCAtLWNvbXBvbmVudDogQzIgY29tcG9uZW50IHRvIHRlc3RcbiIKKyAgICAgICAgICAgICAgICAgICAgIi1QLCAtLXJlczogUmVzb3VyY2UgZmlsZXMgZGlyZWN0b3J5IGxvY2F0aW9uXG4iLAorICAgICAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgIHByaXZhdGU6CisgICAgaGlkbF9zdHJpbmcgaW5zdGFuY2U7CisgICAgaGlkbF9zdHJpbmcgY29tcG9uZW50OworICAgIGhpZGxfc3RyaW5nIHJlczsKK307CisKKy8qCisgKiBjb21tb24gZnVuY3Rpb25zIGRlY2xhcmF0aW9ucworICovCit2b2lkIHRlc3RJbnB1dEJ1ZmZlcigKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgc3RkOjptdXRleCYgcXVldWVMb2NrLCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCisgICAgdWludDMyX3QgZmxhZ3MsIGJvb2wgaXNOdWxsQnVmZmVyKTsKKwordm9pZCB3YWl0T25JbnB1dENvbnN1bXB0aW9uKHN0ZDo6bXV0ZXgmIHF1ZXVlTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBidWZmZXJDb3VudCA9IE1BWF9JTlBVVF9CVUZGRVJTKTsKKwordm9pZCB3b3JrRG9uZSgKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmssIHN0ZDo6bGlzdDx1aW50NjRfdD4mIGZsdXNoZWRJbmRpY2VzLAorICAgIHN0ZDo6bXV0ZXgmIHF1ZXVlTG9jaywgc3RkOjpjb25kaXRpb25fdmFyaWFibGUmIHF1ZXVlQ29uZGl0aW9uLAorICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtRdWV1ZSwgYm9vbCYgZW9zLCBib29sJiBjc2QsCisgICAgdWludDMyX3QmIGZyYW1lc1JlY2VpdmVkKTsKKworaW50NjRfdCBnZXROb3dVcygpOworCisjZW5kaWYgIC8vIE1FRElBX0MyX0hJRExfVEVTVF9DT01NT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlYzY0ZWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tcG9uZW50L0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIYWxNZWRpYUMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c0hhbE1lZGlhQzJWMV8wRGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIlZ0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdC5jcHAiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL2NvbXBvbmVudC9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldENvbXBvbmVudFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkYzU0MWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvY29tcG9uZW50L1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0Q29tcG9uZW50VGVzdC5jcHAKQEAgLTAsMCArMSwzNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMl9oaWRsX2hhbF9jb21wb25lbnRfdGVzdCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisKKyNpbmNsdWRlIDxWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UuaD4KKyNpbmNsdWRlICJtZWRpYV9jMl9oaWRsX3Rlc3RfY29tbW9uLmgiCisKKy8qIFRpbWVfT3V0IGZvciBzdGFydCgpLCBzdG9wKCksIHJlc2V0KCksIHJlbGVhc2UoKSwgZmx1c2goKSwgcXVldWUoKSBhcmUKKyAqIGRlZmluZWQgaW4gaGFyZHdhcmUvaW50ZXJmYWNlcy9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudC5oYWwuIEFkZGluZyA1MG1zCisgKiBleHRyYSBpbiBjYXNlIG9mIHRpbWVvdXQgaXMgNTAwbXMsIDFtcyBleHRyYSBpbiBjYXNlIHRpbWVvdXQgaXMgMW1zLzVtcy4gQWxsCisgKiB0aW1lb3V0IGlzIGNhbGN1bGF0ZWQgaW4gdXMuCisgKi8KKyNkZWZpbmUgU1RBUlRfVElNRV9PVVQgICAgICAgICAgICAgICAgICA1NTAwMDAKKyNkZWZpbmUgU1RPUF9USU1FX09VVCAgICAgICAgICAgICAgICAgICA1NTAwMDAKKyNkZWZpbmUgUkVTRVRfVElNRV9PVVQgICAgICAgICAgICAgICAgICA1NTAwMDAKKyNkZWZpbmUgUkVMRUFTRV9USU1FX09VVCAgICAgICAgICAgICAgICA1NTAwMDAKKyNkZWZpbmUgRkxVU0hfVElNRV9PVVQgICAgICAgICAgICAgICAgICA2MDAwCisjZGVmaW5lIFFVRVVFX1RJTUVfT1VUICAgICAgICAgICAgICAgICAgMjAwMAorCisvLyBUaW1lX091dCBmb3IgY29uZmlnKCksIHF1ZXJ5KCksIHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKCkgYXJlIGRlZmluZWQgaW4KKy8vIGhhcmR3YXJlL2ludGVyZmFjZXMvbWVkaWEvYzIvMS4wL0lDb25maWd1cmFibGUuaGFsLgorI2RlZmluZSBDT05GSUdfVElNRV9PVVQgICAgICAgICAgICAgICAgIDYwMDAKKyNkZWZpbmUgUVVFUllfVElNRV9PVVQgICAgICAgICAgICAgICAgICA2MDAwCisjZGVmaW5lIFFVRVJZU1VQUE9SVEVEUEFSQU1TX1RJTUVfT1VUICAgMjAwMAorCisjZGVmaW5lIENIRUNLX1RJTUVPVVQodGltZUNvbnN1bWVkLCBUSU1FX09VVCwgRnVuY05hbWUpICAgICAgICAgIFwKKyAgICBpZiAodGltZUNvbnN1bWVkID4gVElNRV9PVVQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBTE9HVyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAiVElNRURfT1VUICVzICB0aW1lQ29uc3VtZWQ9JSIgUFJJZDY0ICIgdXMgaXMgIiAgICAgIFwKKyAgICAgICAgICAgICJncmVhdGVyIHRoYW4gdGhyZXNob2xkICVkIHVzIiwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgRnVuY05hbWUsIHRpbWVDb25zdW1lZCwgVElNRV9PVVQpOyAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCitzdGF0aWMgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KiBnRW52ID0gbnVsbHB0cjsKKworbmFtZXNwYWNlIHsKKworLy8gZ29vZ2xlLmNvZGVjMiBDb21wb25lbnQgdGVzdCBzZXR1cAorY2xhc3MgQ29kZWMyQ29tcG9uZW50SGlkbFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgeworICAgcHJpdmF0ZToKKyAgICB0eXBlZGVmIDo6dGVzdGluZzo6VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlIFN1cGVyOworCisgICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBTdXBlcjo6U2V0VXAoKTsKKyAgICAgICAgbUVvcyA9IGZhbHNlOworICAgICAgICBtQ2xpZW50ID0gYW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgICAgIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSk7CisgICAgICAgIEFTU0VSVF9ORShtQ2xpZW50LCBudWxscHRyKTsKKyAgICAgICAgbUxpc3RlbmVyLnJlc2V0KG5ldyBDb2RlY0xpc3RlbmVyKAorICAgICAgICAgICAgW3RoaXNdKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICAgICAgICAgIGhhbmRsZVdvcmtEb25lKHdvcmtJdGVtcyk7CisgICAgICAgICAgICB9KSk7CisgICAgICAgIEFTU0VSVF9ORShtTGlzdGVuZXIsIG51bGxwdHIpOworICAgICAgICBtQ2xpZW50LT5jcmVhdGVDb21wb25lbnQoZ0Vudi0+Z2V0Q29tcG9uZW50KCkuY19zdHIoKSwgbUxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1Db21wb25lbnQpOworICAgICAgICBBU1NFUlRfTkUobUNvbXBvbmVudCwgbnVsbHB0cik7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX0lOUFVUX0JVRkZFUlM7ICsraSkgeworICAgICAgICAgICAgbVdvcmtRdWV1ZS5lbXBsYWNlX2JhY2sobmV3IEMyV29yayk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIC8vIElmIHlvdSBoYXZlIGVuY291bnRlcmVkIGEgZmF0YWwgZmFpbHVyZSwgaXQgaXMgcG9zc2libGUgdGhhdAorICAgICAgICAgICAgLy8gZnJlZU5vZGUoKSB3aWxsIG5vdCBnbyB0aHJvdWdoLiBJbnN0ZWFkIG9mIGhhbmdpbmcgdGhlIGFwcC4KKyAgICAgICAgICAgIC8vIGxldCBpdCBwYXNzIHRocm91Z2ggYW5kIHJlcG9ydCBlcnJvcnMKKyAgICAgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgICAgICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29tcG9uZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBTdXBlcjo6VGVhckRvd24oKTsKKyAgICB9CisgICAgLy8gY2FsbGJhY2sgZnVuY3Rpb24gdG8gcHJvY2VzcyBvbldvcmtEb25lIHJlY2VpdmVkIGJ5IExpc3RlbmVyCisgICAgdm9pZCBoYW5kbGVXb3JrRG9uZShzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpIHsKKyAgICAgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiYgd29yayA6IHdvcmtJdGVtcykgeworICAgICAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYm9vbCBtQ3NkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbUZyYW1lc1JlY2VpdmVkID0gMDsKKyAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1GbHVzaGVkSW5kaWNlczsKKyAgICAgICAgICAgICAgICB3b3JrRG9uZShtQ29tcG9uZW50LCB3b3JrLCBtRmx1c2hlZEluZGljZXMsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLCBtRW9zLCBtQ3NkLCBtRnJhbWVzUmVjZWl2ZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgYm9vbCBtRW9zOworICAgIHN0ZDo6bXV0ZXggbVF1ZXVlTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUXVldWVDb25kaXRpb247CisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBtV29ya1F1ZXVlOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudD4gbUNsaWVudDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbUxpc3RlbmVyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gbUNvbXBvbmVudDsKKworICAgcHJvdGVjdGVkOgorICAgIHN0YXRpYyB2b2lkIGRlc2NyaXB0aW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBkZXNjcmlwdGlvbikgeworICAgICAgICBSZWNvcmRQcm9wZXJ0eSgiZGVzY3JpcHRpb24iLCBkZXNjcmlwdGlvbik7CisgICAgfQorfTsKKworLy8gVGVzdCBFbXB0eSBGbHVzaAorVEVTVF9GKENvZGVjMkNvbXBvbmVudEhpZGxUZXN0LCBFbXB0eUZsdXNoKSB7CisgICAgQUxPR1YoIkVtcHR5IEZsdXNoIFRlc3QiKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gZmx1c2hlZFdvcms7CisgICAgZXJyID0gbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIC8vIEVtcHR5IEZsdXNoIHNob3VsZCBub3QgcmV0dXJuIGFueSB3b3JrCisgICAgQVNTRVJUX0VRKGZsdXNoZWRXb3JrLnNpemUoKSwgMHUpOworfQorCisvLyBUZXN0IFF1ZXVlIEVtcHR5IFdvcmsKK1RFU1RfRihDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgUXVldWVFbXB0eVdvcmspIHsKKyAgICBBTE9HVigiUXVldWUgRW1wdHkgV29yayBUZXN0Iik7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+c3RhcnQoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICAvLyBRdWV1ZWluZyBhbiBlbXB0eSBXb3JrQnVuZGxlCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiB3b3JrTGlzdDsKKyAgICBtQ29tcG9uZW50LT5xdWV1ZSgmd29ya0xpc3QpOworCisgICAgZXJyID0gbUNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7Cit9CisKKy8vIFRlc3QgQ29tcG9uZW50IENvbmZpZ3VyYXRpb24KK1RFU1RfRihDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgQ29uZmlnKSB7CisgICAgQUxPR1YoIkNvbmZpZ3VyYXRpb24gVGVzdCIpOworCisgICAgQzJTdHJpbmcgbmFtZSA9IG1Db21wb25lbnQtPmdldE5hbWUoKTsKKyAgICBFWFBFQ1RfTkUobmFtZS5lbXB0eSgpLCB0cnVlKSA8PCAiSW52YWxpZCBDb21wb25lbnQgTmFtZSI7CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHF1ZXJpZWQ7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworCisgICAgLy8gUXVlcnkgc3VwcG9ydGVkIHBhcmFtcyBieSB0aGUgY29tcG9uZW50CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gcGFyYW1zOworICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKCZwYXJhbXMpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBTE9HVigiTnVtYmVyIG9mIHRvdGFsIHBhcmFtcyAtICV6dSIsIHBhcmFtcy5zaXplKCkpOworCisgICAgLy8gUXVlcnkgYW5kIGNvbmZpZyBhbGwgdGhlIHN1cHBvcnRlZCBwYXJhbXMKKyAgICBmb3IgKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gcCA6IHBhcmFtcykgeworICAgICAgICBBTE9HRCgiUXVlcnlpbmcgaW5kZXggJWQiLCAoaW50KXAtPmluZGV4KCkpOworICAgICAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSh7fSwge3AtPmluZGV4KCl9LCBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgICAgIEVYUEVDVF9ORShxdWVyaWVkLnNpemUoKSwgMHUpOworICAgICAgICBFWFBFQ1RfRVEoZXJyLCBDMl9PSyk7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPmNvbmZpZyh7cXVlcmllZFswXS5nZXQoKX0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICAgICAgQVNTRVJUX0VRKGZhaWx1cmVzLnNpemUoKSwgMHUpOworICAgIH0KK30KKworLy8gVGVzdCBNdWx0aXBsZSBTdGFydCBTdG9wIFJlc2V0IFRlc3QKK1RFU1RfRihDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgTXVsdGlwbGVTdGFydFN0b3BSZXNldCkgeworICAgIEFMT0dWKCJNdWx0aXBsZSBTdGFydCBTdG9wIGFuZCBSZXNldCBUZXN0Iik7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE1BWF9SRVRSWTsgaSsrKSB7CisgICAgICAgIG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgICAgIG1Db21wb25lbnQtPnN0b3AoKTsKKyAgICB9CisKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfUkVUUlk7IGkrKykgeworICAgICAgICBtQ29tcG9uZW50LT5yZXNldCgpOworICAgIH0KKworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworCisgICAgLy8gU2Vjb25kIHN0b3Agc2hvdWxkIHJldHVybiBlcnJvcgorICAgIEFTU0VSVF9ORShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworLy8gVGVzdCBDb21wb25lbnQgUmVsZWFzZSBBUEkKK1RFU1RfRihDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgTXVsdGlwbGVSZWxlYXNlKSB7CisgICAgQUxPR1YoIk11bHRpcGxlIFJlbGVhc2UgVGVzdCIpOworICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgLy8gUXVlcnkgQ29tcG9uZW50IERvbWFpbiBUeXBlCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHt9LCB7QzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEV9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICBFWFBFQ1RfTkUocXVlcmllZC5zaXplKCksIDB1KTsKKworICAgIC8vIENvbmZpZ3VyZSBDb21wb25lbnQgRG9tYWluCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0KiBwb3J0TWVkaWFUeXBlID0KKyAgICAgICAgQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6aW5wdXQ6OkZyb20ocXVlcmllZFswXS5nZXQoKSk7CisgICAgZXJyID0gbUNvbXBvbmVudC0+Y29uZmlnKHtwb3J0TWVkaWFUeXBlfSwgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX0VRKGZhaWx1cmVzLnNpemUoKSwgMHUpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfUkVUUlk7IGkrKykgeworICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgfQorfQorCitjbGFzcyBDb2RlYzJDb21wb25lbnRJbnB1dFRlc3RzIDogcHVibGljIENvZGVjMkNvbXBvbmVudEhpZGxUZXN0LAorICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjpwYWlyPHVpbnQzMl90LCBib29sPiA+IHsKK307CisKK1RFU1RfUChDb2RlYzJDb21wb25lbnRJbnB1dFRlc3RzLCBJbnB1dEJ1ZmZlclRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgZm9yIGRpZmZlcmVudCBpbnB1dHMiKTsKKworICAgIHVpbnQzMl90IGZsYWdzID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICBib29sIGlzTnVsbEJ1ZmZlciA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIGlmIChpc051bGxCdWZmZXIpIEFMT0dEKCJUZXN0aW5nIGZvciBudWxsIGlucHV0IGJ1ZmZlciB3aXRoIGZsYWcgOiAldSIsIGZsYWdzKTsKKyAgICBlbHNlIEFMT0dEKCJUZXN0aW5nIGZvciBlbXB0eSBpbnB1dCBidWZmZXIgd2l0aCBmbGFnIDogJXUiLCBmbGFncyk7CisgICAgbUVvcyA9IGZhbHNlOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUodGVzdElucHV0QnVmZmVyKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtV29ya1F1ZXVlLCBmbGFncywgaXNOdWxsQnVmZmVyKSk7CisKKyAgICBBTE9HRCgiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIGlmIChmbGFncyA9PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNKSBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5yZXNldCgpLCBDMl9PSyk7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE5vblN0ZElucHV0cywgQ29kZWMyQ29tcG9uZW50SW5wdXRUZXN0cywgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgc3RkOjptYWtlX3BhaXIoMCwgdHJ1ZSksCisgICAgc3RkOjptYWtlX3BhaXIoQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSwgdHJ1ZSksCisgICAgc3RkOjptYWtlX3BhaXIoMCwgZmFsc2UpLAorICAgIHN0ZDo6bWFrZV9wYWlyKEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRywgZmFsc2UpLAorICAgIHN0ZDo6bWFrZV9wYWlyKEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0sIGZhbHNlKSkpOworCisvLyBUZXN0IEFQSSdzIFRpbWVvdXQKK1RFU1RfRihDb2RlYzJDb21wb25lbnRIaWRsVGVzdCwgVGltZW91dCkgeworICAgIEFMT0dWKCJUaW1lb3V0IFRlc3QiKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKworICAgIGludDY0X3Qgc3RhcnRUaW1lID0gZ2V0Tm93VXMoKTsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgIGludDY0X3QgdGltZUNvbnN1bWVkID0gZ2V0Tm93VXMoKSAtIHN0YXJ0VGltZTsKKyAgICBDSEVDS19USU1FT1VUKHRpbWVDb25zdW1lZCwgU1RBUlRfVElNRV9PVVQsICJzdGFydCgpIik7CisgICAgQUxPR1YoIm1Db21wb25lbnQtPnN0YXJ0KCkgdGltZUNvbnN1bWVkPSUiIFBSSWQ2NCAiIHVzIiwgdGltZUNvbnN1bWVkKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICBzdGFydFRpbWUgPSBnZXROb3dVcygpOworICAgIGVyciA9IG1Db21wb25lbnQtPnJlc2V0KCk7CisgICAgdGltZUNvbnN1bWVkID0gZ2V0Tm93VXMoKSAtIHN0YXJ0VGltZTsKKyAgICBDSEVDS19USU1FT1VUKHRpbWVDb25zdW1lZCwgUkVTRVRfVElNRV9PVVQsICJyZXNldCgpIik7CisgICAgQUxPR1YoIm1Db21wb25lbnQtPnJlc2V0KCkgdGltZUNvbnN1bWVkPSUiIFBSSWQ2NCAiIHVzIiwgdGltZUNvbnN1bWVkKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKworICAgIC8vIFF1ZXJ5IHN1cHBvcnRlZCBwYXJhbXMgYnkgdGhlIGNvbXBvbmVudAorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IHBhcmFtczsKKyAgICBzdGFydFRpbWUgPSBnZXROb3dVcygpOworICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKCZwYXJhbXMpOworICAgIHRpbWVDb25zdW1lZCA9IGdldE5vd1VzKCkgLSBzdGFydFRpbWU7CisgICAgQ0hFQ0tfVElNRU9VVCh0aW1lQ29uc3VtZWQsIFFVRVJZU1VQUE9SVEVEUEFSQU1TX1RJTUVfT1VULAorICAgICAgICAgICAgICAgICAgInF1ZXJ5U3VwcG9ydGVkUGFyYW1zKCkiKTsKKyAgICBBTE9HVigibUNvbXBvbmVudC0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMoKSB0aW1lQ29uc3VtZWQ9JSIgUFJJZDY0ICIgdXMiLAorICAgICAgICAgIHRpbWVDb25zdW1lZCk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAvLyBRdWVyeSBhbmQgY29uZmlnIGFsbCB0aGUgc3VwcG9ydGVkIHBhcmFtcworICAgIGZvciAoc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBwIDogcGFyYW1zKSB7CisgICAgICAgIHN0YXJ0VGltZSA9IGdldE5vd1VzKCk7CisgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHt9LCB7cC0+aW5kZXgoKX0sIEMyX0RPTlRfQkxPQ0ssICZxdWVyaWVkKTsKKyAgICAgICAgdGltZUNvbnN1bWVkID0gZ2V0Tm93VXMoKSAtIHN0YXJ0VGltZTsKKyAgICAgICAgQ0hFQ0tfVElNRU9VVCh0aW1lQ29uc3VtZWQsIFFVRVJZX1RJTUVfT1VULCAicXVlcnkoKSIpOworICAgICAgICBFWFBFQ1RfTkUocXVlcmllZC5zaXplKCksIDB1KTsKKyAgICAgICAgRVhQRUNUX0VRKGVyciwgQzJfT0spOworICAgICAgICBBTE9HVigibUNvbXBvbmVudC0+cXVlcnkoKSBmb3IgJXMgdGltZUNvbnN1bWVkPSUiIFBSSWQ2NCAiIHVzIiwKKyAgICAgICAgICAgICAgcC0+bmFtZSgpLmNfc3RyKCksIHRpbWVDb25zdW1lZCk7CisKKyAgICAgICAgc3RhcnRUaW1lID0gZ2V0Tm93VXMoKTsKKyAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+Y29uZmlnKHtxdWVyaWVkWzBdLmdldCgpfSwgQzJfRE9OVF9CTE9DSywgJmZhaWx1cmVzKTsKKyAgICAgICAgdGltZUNvbnN1bWVkID0gZ2V0Tm93VXMoKSAtIHN0YXJ0VGltZTsKKyAgICAgICAgQ0hFQ0tfVElNRU9VVCh0aW1lQ29uc3VtZWQsIENPTkZJR19USU1FX09VVCwgImNvbmZpZygpIik7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICAgICAgQVNTRVJUX0VRKGZhaWx1cmVzLnNpemUoKSwgMHUpOworICAgICAgICBBTE9HVigibUNvbXBvbmVudC0+Y29uZmlnKCkgZm9yICVzIHRpbWVDb25zdW1lZD0lIiBQUklkNjQgIiB1cyIsCisgICAgICAgICAgICAgIHAtPm5hbWUoKS5jX3N0cigpLCB0aW1lQ29uc3VtZWQpOworICAgIH0KKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gd29ya0xpc3Q7CisgICAgc3RhcnRUaW1lID0gZ2V0Tm93VXMoKTsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5xdWV1ZSgmd29ya0xpc3QpOworICAgIHRpbWVDb25zdW1lZCA9IGdldE5vd1VzKCkgLSBzdGFydFRpbWU7CisgICAgQUxPR1YoIm1Db21wb25lbnQtPnF1ZXVlKCkgdGltZUNvbnN1bWVkPSUiIFBSSWQ2NCAiIHVzIiwgdGltZUNvbnN1bWVkKTsKKyAgICBDSEVDS19USU1FT1VUKHRpbWVDb25zdW1lZCwgUVVFVUVfVElNRV9PVVQsICJxdWV1ZSgpIik7CisKKyAgICBzdGFydFRpbWUgPSBnZXROb3dVcygpOworICAgIGVyciA9IG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZ3b3JrTGlzdCk7CisgICAgdGltZUNvbnN1bWVkID0gZ2V0Tm93VXMoKSAtIHN0YXJ0VGltZTsKKyAgICBBTE9HVigibUNvbXBvbmVudC0+Zmx1c2goKSB0aW1lQ29uc3VtZWQ9JSIgUFJJZDY0ICIgdXMiLCB0aW1lQ29uc3VtZWQpOworICAgIENIRUNLX1RJTUVPVVQodGltZUNvbnN1bWVkLCBGTFVTSF9USU1FX09VVCwgImZsdXNoKCkiKTsKKworICAgIHN0YXJ0VGltZSA9IGdldE5vd1VzKCk7CisgICAgZXJyID0gbUNvbXBvbmVudC0+c3RvcCgpOworICAgIHRpbWVDb25zdW1lZCA9IGdldE5vd1VzKCkgLSBzdGFydFRpbWU7CisgICAgQUxPR1YoIm1Db21wb25lbnQtPnN0b3AoKSB0aW1lQ29uc3VtZWQ9JSIgUFJJZDY0ICIgdXMiLCB0aW1lQ29uc3VtZWQpOworICAgIENIRUNLX1RJTUVPVVQodGltZUNvbnN1bWVkLCBTVE9QX1RJTUVfT1VULCAic3RvcCgpIik7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworCisgICAgc3RhcnRUaW1lID0gZ2V0Tm93VXMoKTsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgdGltZUNvbnN1bWVkID0gZ2V0Tm93VXMoKSAtIHN0YXJ0VGltZTsKKyAgICBBTE9HVigibUNvbXBvbmVudC0+cmVsZWFzZSgpIHRpbWVDb25zdW1lZD0lIiBQUklkNjQgIiB1cyIsIHRpbWVDb25zdW1lZCk7CisgICAgQ0hFQ0tfVElNRU9VVCh0aW1lQ29uc3VtZWQsIFJFTEVBU0VfVElNRV9PVVQsICJyZWxlYXNlKCkiKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisKK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCisvLyBUT0RPOiBBZGQgdGVzdCBmb3IgSW52YWxpZCB3b3JrLAorLy8gVE9ETzogQWRkIHRlc3QgZm9yIEludmFsaWQgc3RhdGVzCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGdFbnYtPmluaXQoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJDMiBUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL21hc3Rlci9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL21hc3Rlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZTMyM2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvbWFzdGVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJWdHNIYWxNZWRpYUMyVjFfMFRhcmdldE1hc3RlclRlc3QiLAorICAgIGRlZmF1bHRzOiBbIlZ0c0hhbE1lZGlhQzJWMV8wRGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbIlZ0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0TWFzdGVyVGVzdC5jcHAiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL21hc3Rlci9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldE1hc3RlclRlc3QuY3BwIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL21hc3Rlci9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldE1hc3RlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4OGZiYzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvbWFzdGVyL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0TWFzdGVyVGVzdC5jcHAKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMl9oaWRsX2hhbF9tYXN0ZXJfdGVzdCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorCisjaW5jbHVkZSA8VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlLmg+CisjaW5jbHVkZSAibWVkaWFfYzJfaGlkbF90ZXN0X2NvbW1vbi5oIgorCitzdGF0aWMgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KiBnRW52ID0gbnVsbHB0cjsKKworbmFtZXNwYWNlIHsKKworLy8gZ29vZ2xlLmNvZGVjMiBNYXN0ZXIgdGVzdCBzZXR1cAorY2xhc3MgQ29kZWMyTWFzdGVySGFsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSB7CisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgU3VwZXI7CisKKyAgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIFN1cGVyOjpTZXRVcCgpOworICAgICAgICBtQ2xpZW50ID0gYW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgICAgIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSk7CisgICAgICAgIEFTU0VSVF9ORShtQ2xpZW50LCBudWxscHRyKTsKKyAgICB9CisKKyAgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgdm9pZCBkZXNjcmlwdGlvbihjb25zdCBzdGQ6OnN0cmluZyYgZGVzY3JpcHRpb24pIHsKKyAgICAgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwgZGVzY3JpcHRpb24pOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ+IG1DbGllbnQ7Cit9OworCit2b2lkIGRpc3BsYXlDb21wb25lbnRJbmZvKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+JiBjb21wTGlzdCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY29tcExpc3Quc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8IGNvbXBMaXN0W2ldLm5hbWUgPDwgIiB8ICIgPDwgY29tcExpc3RbaV0uZG9tYWluOworICAgICAgICBzdGQ6OmNvdXQgPDwgIiB8ICIgPDwgY29tcExpc3RbaV0ua2luZCA8PCAiXG4iOworICAgIH0KK30KKworLy8gTGlzdCBDb21wb25lbnRzCitURVNUX0YoQ29kZWMyTWFzdGVySGFsVGVzdCwgTGlzdENvbXBvbmVudHMpIHsKKyAgICBBTE9HVigiTGlzdENvbXBvbmVudHMgVGVzdCIpOworCisgICAgQzJTdHJpbmcgbmFtZSA9IG1DbGllbnQtPmdldE5hbWUoKTsKKyAgICBFWFBFQ1RfTkUobmFtZS5lbXB0eSgpLCB0cnVlKSA8PCAiSW52YWxpZCBDb2RlYzJDbGllbnQgTmFtZSI7CisKKyAgICAvLyBHZXQgTGlzdCBvZiBjb21wb25lbnRzIGZyb20gYWxsIGtub3duIHNlcnZpY2VzCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gbGlzdFRyYWl0cyA9CisgICAgICAgIG1DbGllbnQtPkxpc3RDb21wb25lbnRzKCk7CisKKyAgICBpZiAobGlzdFRyYWl0cy5zaXplKCkgPT0gMCkKKyAgICAgICAgQUxPR0UoIldhcm5pbmcsIENvbXBvbmVudEluZm8gbGlzdCBlbXB0eSIpOworICAgIGVsc2UgeworICAgICAgICAodm9pZClkaXNwbGF5Q29tcG9uZW50SW5mbzsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsaXN0VHJhaXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lcj4gbGlzdGVuZXI7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXBvbmVudDsKKyAgICAgICAgICAgIGxpc3RlbmVyLnJlc2V0KG5ldyBDb2RlY0xpc3RlbmVyKCkpOworICAgICAgICAgICAgQVNTRVJUX05FKGxpc3RlbmVyLCBudWxscHRyKTsKKworICAgICAgICAgICAgLy8gQ3JlYXRlIGNvbXBvbmVudCBmcm9tIGFsbCBrbm93biBzZXJ2aWNlcworICAgICAgICAgICAgY29tcG9uZW50ID0gbUNsaWVudC0+Q3JlYXRlQ29tcG9uZW50QnlOYW1lKAorICAgICAgICAgICAgICAgIGxpc3RUcmFpdHNbaV0ubmFtZS5jX3N0cigpLCBsaXN0ZW5lciwgJm1DbGllbnQpOworICAgICAgICAgICAgQVNTRVJUX05FKGNvbXBvbmVudCwgbnVsbHB0cikgPDwgIkNyZWF0ZSBjb21wb25lbnQgZmFpbGVkIGZvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBsaXN0VHJhaXRzW2ldLm5hbWUuY19zdHIoKTsKKyAgICAgICAgfQorICAgIH0KK30KKworfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IENvbXBvbmVudFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGdFbnYtPmluaXQoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJDMiBUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfMzUyeDI4OF80MjBwXzMwZnBzXzMyZnJhbWVzLnl1diBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiXzM1MngyODhfNDIwcF8zMGZwc18zMmZyYW1lcy55dXYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhM2U0YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiXzM1MngyODhfNDIwcF8zMGZwc18zMmZyYW1lcy55dXYKQEAgLTAsMCArMSBAQAorysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLS09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs8Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/RERBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMzMzLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PkJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU1NPU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nzw7Pjo9Ojo6ODg6Ozs4ODo6Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo+O0Q8PTo8PDk4Ojk6Ojk7PDo6Ozk+PD45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT0zNjY6Ozw4QzxBQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWy8vLzMvLy8vLy8vLy8vLy8vLzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw7OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OR6jZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1svLzMzLy8vLy8vLy8vLy8vKysvLy8vMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2tra29vb2dnZ2dnZ2dna2tra2trY1tfX19fX19fY19jX19fa29ra2tra2trb3Nvb29zc3Nzc3Nzc3dzb29vb2tTT09PT09PT09PT1NTW1dXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZElJTE5AOTk6MztAPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTUaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjY2RkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0jYuLi4uLi4uLi4qKiouHgYKCgoKCgoKBgYGBf5HT09PT09PT0tLS0tPT09vi4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5FybGlOUmJMTFZNPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS1BGntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7r6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFhSU1NTU1NTU1NTU1NUTUNERERERERDQ0NEQz9d0dPT09PT09LS0tLS0tLf6uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYd2xpSk5fTVJVTT48PDc7QEM+Njo3Pj87PUJAOTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0NLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpp5cVldXV1dXV1dXV1dXWFFJSUlJSUlJSUhISEhEYNDT0tLS0tLS0tLS0tLR3+rq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87PkBAODo7ODw8PDs+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzc/R0dLS0tLS0tHS0dHQ3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWFiYmJiYmJejKypqampqampqampqaqjZ2FiYmJiYmJiYmJiYmJcVFRUVFRUVFRUVFRVUWvQ0tLS0tLS0tLS0tLS0d/p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk6Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Nzs7Ozs7Ozs7OzczMzM7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Ozs7OzcvMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcXGxsbLzMvMy8zMzMzMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzLy8vLysrKysrKysrLy8rKy8vN1dXV1tbW1tbW1tbW1tXX2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo7ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7OztLTz8/P0tTPz9LU1dTPz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0NHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tXW1tbW1tbX19fX19fX19bW1tbW1tbX19fX19fX19fX19jY19bW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08CazM/Ozs7OztKrnM/Q07mf0dCcgoSKyM/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbW1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTEJAPT08PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK2nKWj1bKXmLW2k7i5r6LSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/OnZyRncOdoqar0pF9fq+w0c7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4+PDw5Nj9CP0I5NjQ4Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqYqtTPz8/Rv5igm7KtyIaZrdXSzZ6ew9DPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPj8+OjhFQD9COzc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmKrUz8/P07SZlqq4pNujmK3V08CgoNDPz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PDk2NDo5ODo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8qgo7/KnKWMp63Yqpmq1M/Pz9Srmn6jj6DYoZit1dWwoqnU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD45PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDUrJuni5ah2aGYrdXUo6G61NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbX19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDR0RBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk9Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q07aysqWZqdqhmK7WzZ6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkmxdXG9naGJdT0Y/SEhGRUA8PD4+PD09PDc1Njo5Njo7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXEopmWm7Tao5iv2MKfodLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS09PT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6DH1aKrpJrM2KGZrdqypKbW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtLQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09PIkY201dSxhMPWuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVaWpbTF9NSkxKVUxGQjw8P0ZFR0tIPTY2Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oz05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR1MjB1dHS0cPV0tHC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRExMQD43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dHT1NLS0tLV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj09Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRENJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZJRDxBQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ4ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+PEhGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0RFQ0FMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhRQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f3+Dg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tva2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREQ+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29ra2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODg5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREU+PDw4Ojg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPDs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5OTo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29ra2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFEPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Firzd29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3F0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tvc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h1fHZ9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg2NTQzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tba2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv72+v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg0NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7Oz4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubi4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTQ2ODg2ODY7Ojk8PT07Ojg2Njg4Ojc2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trq+ztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBGPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2Njg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm6ubm4t7e2tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+cnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NjQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO1tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tbS2tre3trW0tLOztLS1tbS0tLW1tba2tra2tre3t7e3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi3t7e4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmZqZl5eXl5eWmZuYmZmZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+QkA/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utrausr7Cxr6+wsrW1tre1tba1tbW1tba1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmpqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura6rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3uLe2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJmam5ycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BBQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytrayrqqelpaWlpaaoqKioqKWnqKinqKinqKipqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7a3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDY1NzM4Ojo6Ojo8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OztAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Slpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpaenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqalpKKjpaampaWlpqmqqaalo6SlpqakpKOioqOioaCfn56enJycnJ2dnZydnp+goqGio6OjoaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaWoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZmJeXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAP0JCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqSkoZ+en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc1Nzg7PTg6Ojk5Oz07Ozg5PjY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKunpqCcnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWkpaSlpaaoqKeop6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGho6Ojo6Kjpaampqenp6afm5qboqCalpeVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6Wmpqako6GgoJ+foaGfoKCdmpiYmZucoaSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODk6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/PkFBPkFBPzo5PT46UJ2gn5ybnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+mpp/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6elpKKho6empaWjoqWmpqWmp6amoJuZm6Ggl5KTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goqKioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6SmpqWlpqempqKdnJ+hn5eRkZCUl5qdmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+fn5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoKCfoJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3OTk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaSmp6alpaampaWjoKChoaCZkpCPlpuZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2dnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSk5KRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU5OTg5PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5qcnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKjoqOkpKampaSko6KhoZ6cm5WSlJicmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJycnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+foKChoqOjpKSkpKKhoZ6bmpmXobWemZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NjY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpmXmJmcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKCgoKKkoaKioaGgnpybm5uZn6ubnJqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY6NzU2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2goaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaCls6ygoJ+fnpyZmZqam65qdp2dnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJuam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn52dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goaCfppKbq5+goJ6bmpmamaiERH+fnp6cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpuam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpOTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnqCeYpymnp6cmpqbnKGjUUeDoJ2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5yam5ubm5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODo7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZuapmZdo6CbmpmbnZyudUlMhqCcnJ2cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxRPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8Pjk6Ojs+Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmKSAUniimZmanZugpF9WToehnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ybm5ucnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGgoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFxcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PUNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJuYmJmgiFtflJqZm5yco49kWkyBop6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbW0xGPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiZn5ddXXaXmpydnaKBZFlNfqKenp6dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubmpydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZmaYGFggJadnJ6YdGNVToCin5+fnp2eoaCenZ6dnp2dn5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmZn2leW2V/nJyejGpfUFKGnpudnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0JAQUI+PjtDRERAQ0M+Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qal5NzaGFUdpOXnIdcVlBXipKOkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkY6Smp6SfaCjlqScbkxPY4aGgo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4Ojs/PDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz9ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg4CEoJ2Of2yWpZWfgIl/X3J/gIKSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz05OTk3NDg2OTM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE+P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5/gKKLfG5SdZyMjFpxfXx+fXyGjo2Lho2UkYuQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODk4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhYCCfZiad1hPTHCUhoJMYG9xd4iFio6LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYB+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYt/iI2Mi4uHkY2jjVUvMD13h3d2QURea22EkImJkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmQnqGdk5eboZqdm6KmnGdBWkg7d3lrZ0UvOFtsc5CPi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6mpr49Lb6F4QXt3Y2JQUFpHYG6KoaGknpuapKekqauurKWkqKuvsbSuqqyus6+srLS0tLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipqmnqKN4YL/WpkN7jIB1T22OdVJkf6Oop6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkp6eZnaSlo6KdYn+9wK93nqOalGVMYXhtUXSVoqKgoZ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dQXmVkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA8Pjw5OTxBQkVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioaKnoaaupqadnmqEnLqPptChmbGoWEysk1Nlj6CeoKCenaCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGoqq2xsq+roqKGd359cs7JsZunr2tVqrBiWoemn6WioZ2fopiVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFVcaGRvY21paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PjxCPz9BREI5OoCepKehnpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqevt7e0tbazra6tj4aDbo/NuZWQopd0VG96c257laaqp6OfnqObnaGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpamnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKno6GmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm42Ad3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEI+Qz07OT45QEBAP0JDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7K3u7u7ubnBuLS1oIh5ZFmft8CmqJ2Id2txb3h4en2GjpKYnKKlpqulpJihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaChqKempaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgXZ4eXhjW1JZVF9fYW1odmtxaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz5DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW3wcbMz87Myb6zpJBzZlJEi5eJiYh+eHFuZ2ZsaWtxcnFxcnR8jKnExLuip6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWhpKenoZ+dnpaTnKCXmZKPjIyXlp+blpyanZyak5aUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FpYWZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PFx9vj49rLvK+kl4h0WVpRQ2l6bG91bmtlZVlXXlhcY2lpaGVgaIm0wMC5qa+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hnp2loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3b21bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs6PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVejIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxr7N0dXKuaedlIZyXlFUS0RbZl5ka2VhYGhZVFhSVlhZXFhadJm2u6u0sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Ef2pmaGFrbGdudnJydnJnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkzW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/wsHHy8i3lHVlVVBPVEg+XmteX2ViYF1kYVNWVlVTVFdym6uwqqiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3VrbG5kb21pcXhveWppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzM2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI8ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO5uMObYUlER0tEPVtlYmFoY2BbY19XUU5PT1V/tLqsrqWkoqekoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnZSTiYl+hoiMlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcl5ecm5+eo5yelpiXk5acmZmclJadlJaTiXZ5ent3bmtpaHZaZ3N4c3pnZ15kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6Ozs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTExMLEwa2DT0ZNRTtNW19la2VfW2BZWFJNVH+iqrm1s6upo6GtqqynrZ+stLS/w765uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4yVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl2dmVmaWpoXmtwbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMzKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMfCxpZqWEc/P0deY2JqYFpYV1NVdpm2vru8urysraapu7q5t7+ztbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rraussZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWh2aWpqdW55bF5kW1ZgWUxIRDY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8HDxMbJxczQzcfMycLCx8LLy8jHzMnOxcbGvalyUEswWFNVZmFTTk9wqcjIwsTGwLy+tLGwsMG+vsHGwL63tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2tr7WlpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOi5R9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpudnpaco6ChoqSjpKKempmbm5udnpyDfXJ9eHBnYGtqd21pZnZvdGNdY1VXVVRNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODo9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwsPCwbyRP052folWTG+ky9TFtr+/wL+6ur21s7PAv7m/wrnBt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopycn56joKaZeXp5gHNwZmVnZGtlYmtub29fWV1XVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw8PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvbzFp3dqg5CYb6nIyMfRwa+9vbi5u7u+uLWxur+0vL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsKempaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaOgmp6gpKKjnKKho6CenJ6eqaWolX16g3huZmFlYmFjZGRqY2dkW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OztAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPTo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Aur/AvLvFvbrAxL+9vq9zZX2Ri4nRxb+/yb+wwb+6t7u+uba4tLi8tb24tbSvs7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhY2Noa2dnamZqXlZWVFlPVExGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdaNt7+7w7W6x7a1uLq8uLm2qqOYjn+Dyb+/u8G+uca9wr+8xbi3t7W4tra8u7m2tLi6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVnb2plbGhZWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vM/Ed6fMvce3ubettrS3ubO1sbzJw5VLesq+v769vL/Iw8XFvse4tbOzvri5uL67urm8u7q0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucWdxa3RmY25gXFVIS0pESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Yk723x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTWr3R/usjPwsC4rrS0u723ubG9w8qPQ3TNw8K/vr28x8zHx8THvLa1t8G9u7zAw7u/wr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFmbGpvdW94ZGhjXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsbJ0ppxcqvS0czKxLW6v8TIvr60v8DAeVJty8bCvsG8v8PMysfFxsG5vr3Ev8C/wsi9x8bFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0cG1tdGxtb2BjX2JiTklNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8TQw7q+vMS+t7zAv8nPx8jKysKHcnOjy8zLzcrGwsPLzsG8uL26sXBjYrvIxMDAv8TAysnDw8PDucO+vrnAvcPGwsrOx8a9usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaahn5uCe3qIe21teHxgcWRcX2BgVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u7q9rDvra+wL6+uqacqbK2w7+lenZ4msTHy8jBw8DAycrBv7u5saF9c2qtyMXEv8DBv8vHw8DIwLvCu7m0u7vDw8HN0MrEvbW8u7m/ubq1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp2wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXpuc3l0aHBeXF9dWlJGRURNSUFEPUg7OzU5Ozo8PDo7Ozs8Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vEuW2szr22ucC8q35uaG5scoGVmHN3fJe9v8bAucC8vsXEvb24sbCZkH6Am8rCw7y9v7/Dw76/yL2+wLjIvquhoaGmucHJxbiyuLi3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bXV7cW9qXGBhWlRRQUZJR0tARUNJPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5udm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbR2gLO9trXCpYdpWl1gTVJbWm5zd4CfuLjCurO7t7u9v7q7u66km5mIkX7AxMO+vL+7u7i2wcK2wLvIrLyturifk5Gbo7e0sLS0tby5vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra8tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z3eG5yYV9nXVtVSj0/P0dHPUdDQzk6NTs5OT48PDk6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmohHiJoK+1nmtlZlZYX0lJTVBTbHeFpbC3vrmytbK7uby2ub60lZynlqFwrsnEwL2/ubOusr27rru7lI/O3Obi0biakoZ/na2vrrO6t7q+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybWBkYlxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/Fq4h8doygmWBUQ1dWSGFrVk9GSWCNoKuvtrq1tLKsvLm4tbjBvYuZsqOmcqXLwr+5urWupayzsKazuZro49vV19XPuol1amyYrKevtrOyurW7u7u1uLawtcSyvry+vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3Zzb2ReaFldXlNPTkI/SkNBS0pANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJqRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7WRgniIj29OSj9jWkFOd4CUa01BXIGwtbO1srSvrLu6uLa5v8Z2hKqfm2Wnv7i1srGtrZ+kp6edq6K9y6uotcrPz8uZdGtscqCkqq2up7Csr7GxrbGurq+5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2dG12amxdXGtVXlxQTkhER01CR05HODY2NTo1Oj04Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhHtYRkFOhlpKSlh2jYBjQFKiubO0srCxrbC5uLa7t7q9kKKyrKRzq7Cpq62ro6ignZ6dmJqus1o4S3mqxcrGooCFkoiInqOpqKCmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusayqqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeWl1dG9lVWJkWF1ST01JQElTRE5DPTg4NzU6Nzw9Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+xu6qZmZVpTkBSeHFQSUlLZ5uBWUVRrbuxrLOvrqyttraytLWuqaafmpudn6aonqCoqZ+hp5ablpeMrH0yUmhWdK+1sZ6MmqKim5ado6KfnqSgpKylpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CXlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqaSpq6aprKumoYh5g3x2f3pjeG1uXFFpVVBPR1BNTUNQUkA/Oz40Ojo1Ozo9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2qpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqLzCq6S+aUVSnIJRV0lJX0tTjmFkYoCutaqytK6qq6+wsrOtpZ2Rl5OPmKCfoqCco6SfnaiTmZSVi6BjXoaHdFqMo5mbmJ2hpKemnZ6foJyhn6Oop5ynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJaTj4+SkZmQlpWYl5+Ym5qbpJmXlJWanaCdp6iloKOioaOfnKCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fYB1dn1ubHtkaFZTZE5KSEdPU05LTkg8RUA9MkA4NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutra6ubq3t7uuqKChqaGqxr/KoVBBcp54T25LS2JldXNgW15wj7GvrrO1qqasrKObmZSNkZWXmJicn6KinJ2knpqklpaWlI+Iboe6v6NjZ5OHlJGOnqOipqKdn6aenZ+jpqieo6afqp2qraqup6iwpaOkpqespqGlopuZnq+orrKrpquqoJuYmJiVk5aak5WWmpabl5iYoZ6cnJeboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GfoKWipqCJfIB+d3l9ZXl5YWJTVmFJSUtMU1VKU1FNOT5BNjc9NjU7Ojw8OTs7ODo8PTs7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NTU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWdo8fHj1dTSWSjXWV+b3JdUGtjW2RfXWuPtLCwuKymoZydmpSYmpmQjpGVkYyOjZOZopyXopiZlpaZiHqkx9bVn09sf4mAg5SamJuro6Gwo5qjpqaqoqGqoqmkqLKrsbKruaimq6erq6isrKehoKOxrrKxtKqyr6OZnJ2eoZibm5qYmZuVlpuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWooqejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2iCbWVcU1taTVJLT09WTVRNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0/NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp6rpI16VWlydXVxYnZ2WFdjYGNnWVhXZayurK+nn56ioZeRlJygnJmYkpOfnKGjmp6alp6ZnZaal493n8rasrJnRmZ6eH+DgXuKta+ms6yhra2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7W4s7itsrSkoJ2loKyhoaKhoJqZlpagnJuYpaGgnqOhoJ+bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGDf3x4dmp3dV5tW1JhSVJWSEZWV0tDTUg9S0k4RTw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqK6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuioaCkgG6CcGBjWExbU1pNTFBYUkhNTUeXrKqppaCfmpGSlJiYlpaVjIiLjpWdnJ2cnpadmKWdoJqTcIa9slOKdXlxZWlqZV5Qa6y6rLS0sLewrrSppqSlrKm5s7W7w7zDwbe7tquusbi3vK+zsLXBvLe+s7O1oqyiqamyqauop6iamZ6aqqegmaign5+oqKWln52qoqKem5+ooKSnrZmgo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mGhX52cm1pd21obl1YW0NXTkpHTkdDR049Pkw+NTw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqamUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOfnYpiV15lYFdNUUc+Pj9DQz8+QlF4qK2pqqagnp+ho56fnpudnJSTlZWenpiUhZ2Zn5mpoqygkoJ7iIN6gZClh3NaS19aSUCnwbW5u8DDub27rK6nsa2xwra4wsbAyMrAyr+wubm9uMK+uLS7xsS9w7y4tKqzraqztK+zrqqvo56sqLeyraOwpqGjsLGusKSlrqOhoJqhpqGkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF8dHJra3VycWhXXFFGVUhESlBJP0ZCNEZIOTY8Pjc7PD48PDo6ODk8ODk7ODs6OTs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw8Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfn5V9YF5lYFFHRD1DP0U8Pzk2Tn+qs6ekpKKgnqWspp+YnZWSmp6ZlYyKhoiGeGyGn6Khqam0kXmMh4eWo6SmiGJua5GugExEt8S/xMjN0MjLw7K3tb6yvsW7vszNxszMzNLHvr/Awr3Hx8K4xMrJxMHHv7q0uru0u7ewtrKru7Kuu7fAu7qruK2rqri7tbyurrijpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5WUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrZGlveGtmWlxGTE1FRFRNRUJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo6Pz89Qj4/NzpBQD08PTg2Njw6PEA/QUFBPpKroKeup6KrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9c2phV05FPklZfHBiQj1cjq6soZmbnJ6emZeXmJONj5eXlI+NkIyCg4J2cnBsb42kq62yp3N2eW5sbIKEe4VZVnmMwKdhbszExMvQ0tXO08m9wL/Du8bFyMXR083T0NPTzMrBxsbGysjPv8nRzcfGycbCvcTBvr6/tb6zrb/Aw8TIxcjEr7+5sri9xMLBu7y8ta6np66ooKKppJqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXVzZWJncm9nX1paRE9NQ0ZRSURDQTU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjk7QUE7Oz43ODY6Oz5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOem52Wa2ZdVElEQD9LhZ6lmoSgsq2jnpyfmpiXlJOUl5GQkI2IhISJh4OAgYGAeXFxbmp2obe1mZdvZWZcTVaDgHCQemhvX7SnbJ/Tz8TN1NXY0dfNxsfJzMPFys/K0tfS19LV1tPUyMzHzM3K083O083GycrLwsfMx8nJxr/Ds7PIxcvLzM/Hyr++v73Bx8XMzMnJwMPArrCzqJ6hqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuWkIyGkYuAe3J1dmdjZ3dqZVdYUkROR0BJUUM+Qj06MjJBPEU8Nzg8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hnWNTTEpEQz9CUq3RvbKvppycnKCkoZ2blJSVlIp9eXFsZWJocnBye4WKgHVwbXBybYOsmIuaaVdjWF9kcIBtfo9yT3ObmYDG0NHCz9PW2NXV0svJztDLxs3SydLV19nW2NPW2M3Sys7RzM/RzdPQwMnIy8TMzczP0MbHyLbAy8DSzczQx8rJwMTDyM/N0NHPzcrIzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYWVzY11SXEpLR0FGSUo/O0E4PjU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpaWgoqNbSUBBREFGUHWxr6aalJefnJqgoJ6bnZqViXdpZGFfYGBfXl9fXWFsdXNwb25rcG5yho2LjmJPXFRcYFFmXlhlWk1qd3mH1dHQy9DN09fW09XQz9LT0cnT0cfQ19fY0tjS19nU1szPz8nN0szP0cDHxMnHz87S0dHIzM3Ay83G1M/Nz8jFy8fHyczL1NTR1c/SzNPCucWxpai1rqibqKulnbKosLOsrJOPk46Iio6Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUWBKSkNGQ1NOPzw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI8Ojw3NDo+PD9APUZBRD2CpJygpZ6lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu319TV2dnRztC/vMzJtr6up6qooaOsZ0M4PT5EWIKqqJ+XlZeZmpyfnZibnZN9cWVjYl9fYV9eYWBeYWBfYGVtcHBtam1vc3R/e3FrZVRHSVFQR0U9SlBcX3Vbc9XU0MnOzNLW0tHWzc/V1dHF0dPK0NTV1s7T0djX19fMyM7Eys/Nys3AysHJys7P0MzQzs7Mz9DIzNHRy87Lw8rIys3LzNLTztTS0dDQyr3IubCuu7m1q7awrai4rbO/u7GajqCUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Bva2FkbnBhWFxbSUZGRU1ZRTtAPTMzPDw4Nzg2NTs+QD05PDw4PD45PEA7QDo9OD85ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+ZpaegoKOnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksnxIRkI7Vo2hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYF5fX11cYm1ybm1xcXJxd2lPfo1qUVhLV09LYEBLW1JtYnbR0s7GzczN1MvO0szK1tbQzNDTy8zQ0tPKztHV0tXWysDKwsbNw8nKw83ExsnLy8/Lzs3RztTMx8nQzcnHy8bHwsbKzM7R0cfQz83OzNDFx8G4ub3Ewr3DubKyvrC7w8O1qpiloZiWkZWVkouUjZqRlJSPj5WCiYZ5cXJrbWhgYHFoWVhoVk1HTUlRUUI7RD87Njg6ODo7NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMrV1tna29jMzM/I1tXEwrWvtKigrZd4bG9vdo+ajYyXlZCTkZGVlpWQi3tlYmJiYF1eYWNiYF9fYGFhYF9dW11ncXFvcHFtaW5wZn2LemZnW0pWXWM8QVZLYWl3zs3GxMbNytHHys3NxdDSz83M1MrHys7Px8bO0svQz8W6xL/Gyr3Dx8nOxcPIwMfOyMTNy83QycXF0MnGwsbJxb/ByM3MzM/DyszJx8zQxcXIu8fDycnCz8C9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+CeG91ZGtgXmZxYVtXYEdJSEdJTVVHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7utpLZ+Z4KGoamTjY2Wj4WDg4OBfYSEf3NfW15dXmBeYGNkY19dXF5fYGBfW1pcYWtycG1taGdpanaDkZJ9aGhUV2ZQQkVcVlddecrEv8K/wsfJyMjJx7/Ey8XHyszJxMHKycHBy8/Ey8i/ucG8xsi+wMbPy8TAw7vKx8i7ycbFysG+wsvGxcS+xr69wcTGzMbFvL/Kw8XH0sXBycDKysfIxtDDw8bDrsTLx8PKt7+8urOprKSlmJ+YrKOhppujoJuVfHdzdWZqW2FubVpcWFJETEdDR0RMREZTQDU0MzM1QD0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL64vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srC2bV56e52RipKWhnqAhIV/dXh1cnBfWltcYGBiY2RkZWRgW1xeXV5dX1tZWlxhbnFtaWZna2hsf5KdjnNlWltTQUJFT1JTVpHCt7i7ubfAwcHDvb24vL64w8nExsG8xr+3usPIv8HJu7a7u8XDv7zCzsPGvr61wb7Eu73HvMO6tb3GxMLDt8C2tr+/vM3Evba6yLu/vszEwsbDxsnHycbQxsLMx7LHycPOzMDFwr+8srewsqeoqLmwpa2wqq2slHp3eGtlaGBob2RWXllKRkpGSEtBRkJGSkE5OjY1ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1q7e0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtbU1dfNys/FycXHwbrFvayup2Bjd4CSi4iLhHh/hoZ/fYN7dHRjXFxdXl9gYmNiYmRlYl1cW1xeXF5dWltcXWdyb2tkY2lpa3KJopJ/ZllRUVNOQDtHTHCgs66ysrKysrq0u7C2r7OusbrBu8DEu7+6tLG6vsC4x7i0vLbBwr24vcbBw7u1r7O1u7+0xbi7tay5vb7AvbG6trC3urPGvbevvL+1t7XFvb7DxsDExsbHzMW/xca7x8u/z8nHw8XBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpHQkRBRUY/PTo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDLzcjJyMrJysTQzdLPzcXHwcXBv7q4ybersJpbZ2+IjoWIiXp4foWGdneBfHNoXV1dXV5gX2BkYV5jZWNfXlxbXlxdXlpbW11fa29sZmNmaGdqdZGPg21fU1hkXU9ERF2VmKOmraqoqqeyrLSvsaetpquyurm1wrm5ua+qtLm6s8G5r8Cxvby7tbvHucO2raqosLLAtri9sLGosrO1u7yrrranrrauvLKwqriwrruuu7i7wMC+usO/xsPFwLzGwcfKuMXHxb/Hw8K5xMbCu8bJzMuzucK9u7OJdHZ3a2lgYmxpWVdXW0FMTE1KRUFDP0ZBOzo6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc3Sy8PFwcTPxs3Bw8a/xMTDw8rCycq/wLzCurO1tcOvqrGTW2l+koiOj3t4fYmFeXuEgHduXl1cXF1fYF9fZGNiZGNiYF9dWltaWl1aWlpaXGNtbWZkZGRmZ2p4h35vaFxjbGlxc4SUl4+SnaSqoaahqairqa+ipZ6prLS1sLy4r7aup623s7O7t7O8r7i5tbK7wbLBr6Wpo6uxs7OovaqrqKusrrW0pqiuoaSwqbOmp6iupqi3rLGzt7q6u7K8vr6+xL+1wcDHyLe+v8W3xMO/u7/Ewr7EyMzKv7/EwMCph3N0c2ppXGFvZFdWWFBIWlNTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDx7m5y8HLvrvJtr3DvrrKuMHDwrW2vLaxr7W8rqirk2NtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9dXVxaWFlbW1hXWVxfZWpkYmNhZGRobXp3cXFodH9/aGuTmpCNhpibpKCgnqOjpaWsnpuao6WrsK+2tqavq6aps6uzubC1ta22ubKwurqxtqWgpKCmsaisqbmqpaenqKezraCnpp+cpKWsn5+npKGhsa2trLK1s7Owtby2u8HAsrq+w8GxubnCs8C9wLW4u72+vMLHxMPEv7/EoIR4cWxiZmBrb2BVWV9ITmhPVEhGS0Y8PUA9Ojs7ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk7Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbq9tqCelZ2gprq2q7Ozu7PEz8nLwsW4t8fAzL+4yre7xbizxbizv8CstryyrKavtK2ho5JpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYWBeXFtcXFhZWFhYVlhaXV5jYmBjY2NiZWZpdnh0b3yDfFJnjZWKioCUmZyimZydoaOhpZyZoZqdqa6ssLSiqKipq6uktListq+ssrSus7WvsKqfnp+korKkpqq4raKmpqCoraqZn5+emZ2fpZqZo5ycnrCprKiqq6ytsLK4r7i5urC2vLu6q7OyubO9tLeysbW0v7W9wL3Dwru7vZeEe3NsX2VeZGRYVFdeSVddS1BHSkpHQTw/P0E7PzwwNTYzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67uMHBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uci4uL+3ssK0sbu7rLq6saKfqaunmJ6QbX6Fhn94cm1vbWtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFdXV1dXWFdaXWFiY2NiYmNkZG16cm53fmc9ZYyShoqCkZmaopuXmqGkoKKanZ+Zl6ysrK2woKShrKqmobSvsLGsqK+yp7qzprWgop+co6Kto6Kqtqqio6aepqajlpidl5manaCal52cnZytoayoo6Smrauys6q1sLKrsrm1r6qvsrKzt7Ovqa2usbexura6vb+3s7GUhnp2Zl9mX1tZVlNaVUtbUUxKRUhLSUM9P0JCQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+ynaWjmKWxw7W2va20uMLMyMa/xbbBwMfOt8DDvbO5ubLAtrG5u62yta+fmqSqoJSbkHh/g4R/eG9xdHFoZWRoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVVdgYmNhYWJgYGRmcnBrcntQOVt9jYaMhYyYlpqZkpydpqGcnaWbmpippK2uqZqhobaooJ+tqLWppqetsKS3sKO3oKOcmZmqpqGarbmvo6GknKKgn5OVoZSWlpyZmJaXnJWfqZ6qpKKdo6qqsK2otKyqpq2ysKWrrbOxr7Cvr6eop7KtsbSwu7S6t66jlIJ6d2VfYVdZWFNSVEtNXkxQTEdITUxFPUA+PUI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0usKxvre9rZ2np6Kqu8C9wLmutLjBzMjFwsO9xbjIzLLBwsGuvLu1u7y1ubmwsLGqnJqhqpWRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtbWVtbWlhWV1dWV1hXV1ZVWmJiYGBhX19gYmdwaW5uOS4wTICJjYeKk5iWmpGbmqOioKSknZudpJ2praSeoKG1pqCgoqeyoaWnpa+lsa2rtZ6gnZWVqaGilK2xsZ+io56emZuTi6CTkZOYmJKXmJiXnqebp6GimqSlpaukpbCnpaKrrK2mqa6vr6uoqqqzpqarr7Sxrry2sbCvn5J7eHNlYlxbXVhOTFFIUmFNVlBPSk5PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTs3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sba9sLyxt6yepaasuLu8wcW6srm1xMnJwMLGxce2xsSzwb/Fq7e3vba9uru1sqytqJmZoKSMinSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVlJUUlRfX11eX1xdXWBhaGtrYS4fK0x1hIqFiI6ak5qRl5uhnqmioaGhoqCap6iimJyisKmgoJykqZ2nop6srKqpra2ioaGVmKKanI+rqLCcn6KfnpeZk4qdkY2Sk5WQmJiTnKGjnKShopWgoqSlm6OrpaKkqqSrraWtsqmmpaamtaapqK2ztbS5uq+rrJ6Mc3FwYVtXVlZSR1FPSFpcT1JKVEtTTEVHSkM4Ozs9PDk2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Gtnainr7m5s8DIurXAr8XIzLrByczItcm9sb7Dya2xuMG1vMC8tLWqrKaWmpyciYFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSUk5QWFxaW1xcXF1cX2JpamI9Kz1MboCHg4eIkpOblZWapKSmpKikp6SglqOropOXo62nn5uYmp+erpmcqrOfpaafo6OhlJSblpaSqamtmpyfoaCblJCMmY2LkY2SjZaVkJ2hoKOdnKOVm6GjoZiiqKOiqKugq6+jrbilo6SirK2qqKuvtLeyvbWzq66YhXV0aVxZWVNVUkZYTFFbWE1VT1BMUVJJT0lCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ojo9Njg6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7auqKivrpupqKy3tqy8yru2v6zMxsW4wM7Px7PEu7e7wsixrbi/t7y+u7O2pqmglpiZl4h6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFBYWVlZXFtaW11eY25zU0RQW2B8gn2Jho6QmZiUmaakoqqopa2hpZacqZ2Tk6KnpZyXj46Zna2WmKeqmJ+dlKWgnpKRkpGTlaiqpZqYmZ6el46Mi5OFiI2Dj4uRlZGgnqGkmZaflZqhop6Um6WlqKiooLCwprG9p5+jrLSqrqevtLC5tcCxrrCrkX9zdGJXVFVOUkpHVlBSUkxMWE5LTE9TR05LQUNGREM+Qjc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7SsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqxtri8vcDDsbCxt660tLuztKOjnZ2Yl5WEgHZrZ2xucW5xam9rZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlRRTU5NUldYWVhYV1pbW2BqaWZuX25can94iH+KipCTkZejlpqlo6Kom6SVnaKZkIydoZmWloWEkZqjj5WjnJWWlYeimpuTjI6KkJqlp5uVlZeckZOIlI6LgYuNgJCLkpKSoZqgopaUmZiVoqaajZmlp6inoaC0sqizuKGdo7asqq2ksrKmtby0q6yxoop6dG5eTlFRTU9ETk5OUEtGTk5KSk5OUUhNSkFITElIRD85NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4NTg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2sKSnpKqloKmmpLOqorLEtbWys8bFt7rDyszGs6y6vbS4wK+tqbCepq67r62gmpuelZWIfIRuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlJTUFFUUVNVUU5NS0tTV1dWV1dXV1pcYWVZX1xsX154b4N6hICLiYuWm4qVl5+eoJajk56Zk4qEl5mLc4yCfY2WlYWSmZCTjo17mY+cjIKJgIqYoKOekJOYloWOgpR+fnOKjnqQh5OQkJ2bmpqSlpCejqKjjomaoKGjpJuitK+sr62fmKa4pqWwobGunLG7qqmvqZmEeHRkVk1SUFBNQ1NOTFBNQlBRSElOU05JSkpFS01HS0s+ODQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNDg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKimpaijpqWmpqayp6a0wbivtLDJxLi5wM7GvrOtu8GsrcStp6Gmkp2mt62joJGWl5KQfnh/ZldWX2dmaWdobmNpaWZiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOT05PT1BTVFFNTUpHTlNTU1RUU1VYWlxoWFpXaW1lZEVPaYh5jX6FlZCGjoyblZqUlZSRjJSIfpKIXjtWbnuKk4mAjJGMj4aGcouEloF5gXuGlJ2Vg5aOkI+Dhn2TeHFvho1+iYGQjpCYmpmTi5CKnYifmIiIlp6aoaCXp66prampnpats6KlrZmtq5iotKOpraKTf3RuYFtOU1JXTERUSlBMTEZOT0lFTFFNS1BKSU5QR0pKPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebegoq2hpqaqoKepp6OqsKintMK5sLWwx8K4s73Pv7mvrrXCp6rEqqKdmIOUnLGjmpmHlJCLh35zdl1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU5RTUtIRkhOUVFMT1JUVVdZYGBUUmJuY0U4N3mNiYd1gI2GgIWIlomUlYmRhYOShHeHfl9JUG13ipGDfYSMioR/f21+f5N3dXZ4hI2acFGNiIqGfH55lHZnd4aIfoqIlYuOkZOXjISKiZWEm42ChJKblp6dlKSjqKmlpZ6bsKqhpKSRpqqWoqqcoaaninduZl5cSFFRU01JVU1TSUxLT0lIRkpOTE1VS1FSUEdKRD03Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2m6KnnZ+hrqGnqKWnp6+sqrW8tri3s8G7tqe5yLi2qKi1tqqyvKeelY5/ipSplpWLf46Eg354cW9YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERDSU5PaFlOUVNTVVpmXFRgZ1dYUEqIfIyAbHd/e3d/h45+j5mLjniDjX5zfndxbXRwdI2NgHp+iaqEentodnuOcHJteIGLjZJ4e4B7gHdzcpJ4aHWFhISFfJWLiIqNi4B/hIuNgJSEfICPmJSclpGfnameoKGdoKmln52YjaekkqCglp6epIJzaWJdXUpXUFJIS1hST0pNTFJKSkpMUEhMUUxSVU5GSUI9Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZicn7Spr6qlrauwsaq9tLK7uLa6tLGft7qyqp2drKmosq+impGNlIGOnI6Rf3eGeHx2cG9qWUtISUhHRUhIUFRUVFdXU1VVVVVWV1hXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE5RUVNWXmJeXGFVZX6NkomKc2ByeXBzeYOLeICYkn5uhI16dHluan2tfHSQin56hpKAfH90ZnV8hmxvaHN8io2IgG16cX1xbXaPcWhxgX6OcESLhYKDhX93eHqMhn2Me3V9jpKPmIuSm5ujlpmdm52eoZyWjYulm46dl46WmJB5b25nY1tYWFVRSlNVVE9QTlBWS05LT09KUU9JT1BMRkQ9Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0tLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKawrK6rp6mwr7Gru7irur64s6ynm7CnrJuPlpylqaShmJqOhJJ6iY+Li3ZxfG11cWptalhLRkdFQUBDREhMTE1RUU9RU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFellKTk9RVFhcXFtXVneXm7t6a29bc3BodnOCi3V4iINsaYmPdnJ3aGh+gXGWkYqAfZV/SZKZbmd3foJtamRseYWQkoZrc2x8bnJ8hmltcH9zjYmFhnt9fnt3cHV0hoJ5gXlwfI6LipODlpaYmpCTlpaZlp2WjIOJn5KLko2GkJaAb2pvb29ZVlhUUlJZT1JVVFNYVU1PSE1LTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuYmp+krK+iraqota+urLO/q7zCv6aimpWkmJ6NhIuUoaKYmZGTi3OOeoCGjIZ1b3RscW1la2tZTkRGQ0A8Pj5CRkZHS0tLTE9SUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSk1OT1JWWlFWUlCYeleQX2hvXXZpZ3l0hYRxfYOBcWqWj3JxemhonI5MeYSRiISNZjF2h3JrfX2DdGZldX6EhIWAZmlsdWtwgHxocXF8bpONj3t0fX1xcW92bYN/d3l1anmIgoiJg5aSkpCLjZGUlI6XjYB5iJeIh4qGgJCIeGxrcGhlWFJbWFlZW05QVVZZWE5JSEVKSkhHQkBHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVtkoiakJmWpKitnrGep7qvq7KwwrG7w8ealo6VmYuOhXqEkJiVjZGMkIdxh4J0h4yGenBzcW9wZHBnX1RGSUM/PDs5Oj9AQURDRUdJS09RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVUtBSFBGXaWpl2ZxbmR1Zmt8e398dn+CgnZvnJFxd35xc5KGNXGcp5yNoKGEooV2cIZ7hnxzjK2NiYFoZ2JqbnJtcIN1aW9YdXCOm5F2bX97fW5ybnCAe3N2bmJ1g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2OfHRycW1gXF1eXFpZYV9STltaWFdMSElGSUg/Q0FCSD9DRD07Ojc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTAxMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpGBkoeVkZ2kp56vlaW0qa2xrsGyu8HFlo+MlI+AiHxugZCSiYOKh4+FdYODbJWIiHx1eHhteG53ZGpeSVBHPj83NDQ4Ozo7PT5AQkVIS0xMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1NUEw3Q01QUUJGe2l0cnJtdmZwgYF2eH9+e4h6c56Wd3yEf4OYg5qcYIWpnpyLg5COenaHfomIjnOKl4+Ee11kcXR6fHeKbWhqYnlvhZCCem+BeHWFenB0enhrbmlddoZ9h3yHho5/ipKXg42FjIZ9cYR/hH12d3t8iXhxdHVnaGBbXF5TXGdeV1BUWFtVR0pKRUxHP0ZAREQ/QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTQyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIp/k4yRnJ2eppGgq6CxqK/AsrvFupaOkZOHeoZ2a3+LkYN9ioOOjHiDgHOghIp9fYF/cIF+emh3a1JYTEBFMjExMjc2Njg4Ojw+QUVGRkdJS01PUVJTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklLTU5RS0pTWlZORl93fXF/cXRqdYiFdXeEgnqRg3SdloaEjJCTpIysqUiGrK+uioGAlIqBioGEkamHgZiYipx0bXyBhod+jmhnaHl/boWHgoVxhIZHbYB3cnl2aG1rX3Z9goh/h4SLeZScm4mKiJF/enWKdnx4bW93foF1dXNtXF5eXGNkWGdmXFVQUFdZUERMS0ZPSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2Nzc4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmEh5GOlZeSlqCdrKCmuK+zvbOXjZKLmIt9dHB+iZJ+fYyDkpR9hn6GpIeIf4KIhXiHiX5zhHhfY1dLQjYwLi8yMzEyNDY2ODo9Pj9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s/Pzg0Ll2WcHOjVUZJS0xNT1dfVmlXWFphf4d7inh8eX2KjHmAhIx8lZJ/nZ6VkpmZpKySmbuxprrHw6eLjKGljpOJgZF8cYOen5Gdf3eFhYqPh5BpaHCEgXSMhoSKcoaCd4eAe3aEfG12dWZ/lI6GiIiGh4egqqKWiI6Xf3qBiHp5b2dreH58gHVsZl5aW15qXmFnYFpQTE5XUlFJUEpETkdDSkRDQEREQjw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVvZneCen+Mf4GQjoqamqScoaymqq6wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOhICBjIqCiY2Df4p/bHBqXUJBNC4tLy8uLjAyMjM0Nzc4Oz0/QkRISU5RUlRSU1NUUlBPSEVCPDg3LzlDPjw8NjMubJOXTVBISkxLSk1VX153Y2JnbI+Pgo+Ii4OGiJODjYuZh5ycj5+moqGpkqe0oafBwq3Hr3i5lJp8jaGemISThYKOoZ+UmZGFioWPmpGWbHB1ioyClYyNjnePhHFthYGKlpGChYhyiKCVhpGJjY+WpLSom4yUooKHkoN9f2tqanyCg4N1Y15lYFtobF1tbF9XS0hOUlBOTExGSVBDRE5GQkNFRkM+Ojk2PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnB2kYZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXmAkoiRkn2KhJiSkIOAgIuMiYaQh4SJhnh4f2dNUj4vLy4sLy4tLzAwMDIxMjU2Nzo/Q0VOT1JUUFBRU1FOUElFRD47PDpERj8+PDc1Mjw/UjVISEhMS01OUV1pgXdtenWSkI6cm5mSmZCckJeapJqjppylqKeos5aqvaq0xsi2yNDPvpugcGmqqZ+Ek5KFnKCam5mmkZGIlaObmnd6fpSYk6GTl5eBlJ57d5WSqrKIjJaefJOdm42RlZijoaW1r5yRmKeGlo+NgIhsc3N9gX5zamJeYmBiaGVgZ2dcUkVKS1BPSUpMRkdNQ0hMRkZDQkdFQjs4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbXxhd419e5OOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Ljo18ioaPkI6BgoCJi4qFkoWDhomBgId2XmJQNTYwLTEvLC4wLy4vLi4wMDE1PkFBTVBSU1FSU1RSTlNMRUVAPD49RkdAQUA4NjYyPDk7RkhHSUlNTlBZaX6JcoyClZudqrSwnaelp6OksKetsq6uqrivsbybscOquMnLt8O/t6WisLOsrKqji5aYhKWmoKOXgaaZjaKqqKWIhZSkoaGqoKSpj5uwi5Wjpre6m6Cir5KinKGdj6Khq66rsrShlKSph5mIkomVeXp+hoFpYmldZmNfZGRfZ2dfW09DSUhTTkZIS0ZKR0ZGSEFLRkNGRkI7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhiV2luWHmEdoGThYeCnIORkIyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5GOg4SBi4WGiJKGgoWJh4iHh3FuYUBFNjQ8Mi8xMTAtLCstMC4uND5DQU1VUFJTVVVWVU5bUEdIRDw+PkZIQ0RBNzs8NUM7PUZLSUZIUU5QV32LmH+lm6agp7fAvKWuwLOor7yvtLqyvLK/tLm5orfEp7XIx7W9uLSoo7OtsLGbmZKan4inr6ullHafpJehrLK0mZaqrqivtrqyuqyvtaKxq7G1u7a0rbSfpqeippmor6yxuLe3p5q1qIukjZCSnoZ4goV4W2NmV2djYmRhYWdhW1RKRERMVFBISUlESUdFQUBAS0RCTUc9ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWVFiYld5dXGBk32EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiXmGgIyTjIeEgY5/gYmPhn+GiIaKh5F7eG5dV0BETjw2OjQ2QUI3NjQwLzZDSENRW09RVVdVXFdQX1VJS0tBPz5HS0ZFRDs+QDdENz9CSkpFRlZTT16Knaeeq6y4q6+4xcSxt8G6sLC+tLW+sbyutXOvsqS5xKOvxriws7Gzp6S1tqqwoKKWm6KSpbCupq2rp6SYoa20u6Kosrq1vL/Mv8XFvb2zwbe6t762ure4q6uwpK+orL2vvLrBwauYuaeUrY6Xl6mIfYN+bVhlY1lsZmtmV1xkWVZTSUdGTFBHQ0hJQUhEPj9CQkxAP01EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUVZTWVVadmpwfo2EgI6FbnpzeIdiuaGZo4mUlJaSlJONj5eSh4d7hoGNlYqAhIGKenyKh4Z9ioOCi4SWfXh6dWZQXGRHRUw7UWNhW15TRz87SFBEWmNRUVlYWmdZVGBfTFJPREE/SUpIRUVBQEM8RTZCPkhHSkxTWlRdj6ixr7Wywbezt8XJt7m/urWzubi1vLK4sMRfc7CksZqdqryopKirqqOisrWhqqiflZaemKCupaempZ+klKOosbSosrO9tsK+08nJ08bCxczCysPAvby+u7u2tK+4trbCucW9wsevnripoauNpKe1iIGBdGFkY19ZY2BqZ1NYYVZSVUlFRU1KQD5HRD1LQT1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtKy9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWQc2tycnOH1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaKfoOAgnh7i4OHe4t6gYqCl350fXpsZXB1WV5cUGVkYmBlZF1cWFdcTWRtVVJtbV9uX1hnZFRZVUpEQktLSUZISEhHQkk6RD9IS1NUVVxaW5C0u7S5scG6tbXHyLe0uLS3uLG1s7KttLWYY3SnnK1wXqKsm5egopuknqqllJ+fkJOOlZiYqJ6mn56amYOkna2lqrCtuLC9udTRz9fQyszSzM/Nysa/vsHJvMC8wMDExMTJvsfNsqO6sLSumqu3u5iAfG5fYl5bYGNaZGNRXGBTUUpDQUVGRTxARj9BSEI/Qzw6RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVtZaV9vlpKQlG5rb3R1h7SsoaGfi5mcmYyNlZGbkoWKin6IhoyQi4h8gYNzfIqDhXuJdIGKhpV/c3t5bG11e2hyZWlsaWZqamlgZmlpbFptc5atpLyIhmdcb2ddWVlUSEtOUEpLUEtTUUlMQUpGSk9fXmFmaWCWs8Ktta+3ubKvwsSzrrevr7mqsbClqrari7WnnJqmmk2ZnYyOn5aRppillYqTk4mQiY+RkZ2boZealZaHn5qnm6yvqbCotLTU1NTW08zQ09XN0s/MxMHJ0L3JycrJ0cbMzcLP0bevw7zDuaS1ucGihHFlXl9fWmJZWmdaUV1YTlBBQkhFQkg7QEM+QUc/P0E3O0M+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZUmVWco+QmIJncW94eYOhqp6ml4yam5eLjZWRmo59iYuFjYqKipCHfISCcH+HgYZ7h3KDkouOfXF4dmxweH5xem14c21pgXFtY2ptcHhpd3x+y77B36dtY3huY1thYEpQUlVOWV5PXVxOUE5UUFRUXG5tdoJxlay1qbGkrbOoq7q+r6mzpaO3paqtoKuzoo2wrZmXmIyOkZGEjpuBjaaRnImDi4SLiYSLhJSWmJeUm5Gcl5man5+rrKWooqytz9LV0s7M09TUz9TRzsfD1NHGzdLT09bM0dHE0dbFwM7Hx8KovbbOnnxxaGBkX1hhVF9bUFFUUU9IPkBGQUJFPEBBPkRDPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxVUU1OWnSGhYp3bHdwfX5/oZ6eoYyMmJOTi4yTj5WFeYWPkI2LiYiQhn6Ce3F+gIGHeoR1hZOQiH9vdnNsc317d3tzgnhya4FzcmlwcXp5cnq+y5p9i7GEdnKEdmdhal1DWllbVmVjWGNqU1hcXWBjXWN3en2LgZeoo6OfnZ+mpKmut6mlsqGhrKCiraGmsZ6IppqTkpGJjo2IgZOIapWijJmEgYZ+kYODk5eti5WNlJmOhpKRnpeosKKhoaWkqcnNz8jDzNHV0tTSztPNxtbSzNTY1tbY1NfVydTazcjX19HKq8LCy411cWViYVpWW1RdUUtHSkpKQDs6O0RBRDxCQz5HQj5CQjo8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7T0xGSlhwgHV9aHJ4coKKgJ2VnZSFi5WJjomIjYaOf3iDk5iKjIiIi4h+gnhze32CiHd/eoaRlYCDbndwbXZ/dnh8dIZ8em2HdnRvfXaEdXh7nbWMO0GKxaV+jHxpZVdJQ2ZjZWNnamNtd1teZmhrbmhtgIKHkYqcnZ+ckJaXnaKjpLCjo7GeoaScn6iforGbhZ2RkZKQioqKhoOPg36cm4uNgoSFeZR/gqmVo42SipeSjH6Yi5qSq7OYm5yonKe+w8a5t8fO0tHS0MzSy8jUztDV2tfX2NTZ2M3Y287J2drR1b7Ky7V6eXBnX1tUV1NcWEZHS0lFRT06NzpAQEI5R0Q/RENBQ0I7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjX2XkZ2LfoeSg4mGhImBh3x4hZaWiY6Ch4WHeoR5cXp7g4V1eYWOjZx5i3B8cHB6gHF7gHGDh4Fujnp1d3x8gnV+fIaHr3NYqcK2jZGCcG1iPV5ocnBxcG54doFlaG9ydXhxeYuGjZORmpWflIaLkpqfmpyonqCrmqGZmJ2knZ+rmYqZi4+RjYR7h4eDhIuNn5mTiIOHfmyZeoSZhoiTjI2UjIZ8nImUkK6qlJaYn5mnr7a9qa6+x8zJyszL0MnD0srU19nX2NfV29fT2dvV0Nra0dbI1MqWfH5ra11cUVVUYUpDRkpIPkE+PTc6PT87PUc8P0FBQURBPj86ODdEQjc1NTQ3OS41NTY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OTlEPkNHUmpebWRiZmt2gIhxkZCagHqAjX6CgYGEfoN7fISYjYeLfYWHgHeCeW97e4aBdHmSno6gdo91gnR1gX50gINvgZCCb5KEdXyBhXp2hnuJt8Wkwcm5gZabj3dwZU9mY4F6gXeGopCKeHl2e4N/e4R2bZOWk5SOl5CCiY6VmZaVpJuWnpWdkpGWop2YqpWQkImMkYKLg4iIgYWPkZ2amYiFi4GFl3qIiZ+XkIiNiYuCfaGJkYy8oZiTmJmdqaamrp+otr/AwbnIys7OxM3K0dbV1dnV19vU19na29fb2tnYztvGiH18amxoYlZZV1hOTEVOQzs9PTw4Ojs9OT1ANj0/Pzw+PT05ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzOTU1NTY0NTU3SEg9REpFNzkyNTtIPjs5OjdJUF1bUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWGVhXVtodHp5bIqNknd2eop7fn9+gHyEen2BkYmEhXqEh3t1fXRtfH2Gf3N+kp6RnoKQe4Z+eI9+eYqKboKagHSZhn2BiYV8fpB6j6mOj8OhvYyco519iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CRhIiKkJKUjZyZkpOPlYyLlJ6bk5+UkI2Nj4p+jo2NioOIkpaZnp6Ii5SRnZGBin+lmIiEjYGFhIGlhoqMt5idkZWWoqehnp6dpK+3urWswMbK0MjHzM/T09LY09XXwNfY2dvY2trZ2dfbuHt8e25saFpiXVRRT0lETEI8PD45OTs6OTk7PDY/PT48PTk5OzszN0Q/NzM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw6RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg2ODk/PUNRU1JYXlVYZm1tbWmBjopxcnmKe3p/fH97h3p8e4uGgn10g4V5cnlzbYB+hH53hZyhm52UkX+MiICYiICckm+IqIV6oYt8kY2DiIScfZqQiYyjo6CQpK+gipCLhYuBkoZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlIuGh4uSkouTk5OOi46Jh5WZm46UlZCKkZOFf4qHkYyKiZyWmKGhhpKdlZ+KiYiNm5CDh45/goeGpIWMkbKYnZKVl6Gin5mSnJ2osritpr3Cx83Ixs/N0MzP19HR1a7W1dja2Nra19bZ2aBygHdqaV9gWlVYWUNASUM/Pj46NDg6Ozc6OzozOzs/PT43Ozo6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNjem1hfpKDbm13i3h5fnqBfIZ7e3eGhH9zcIWCenV2dnSEgoR+f5Kmo5+lopaKnZCVl4uKp5dzirKNhKiShJmThZmMopWfmJKImp6jk6mwoJCUkI2OiJaMbo23hZrEyLKboaWbnJiWkLGRZKTNyJWOhoeIj5KMjJGTiISJiIWVmJmOj5OShpOWg36Pi5mHjZCqlpaioYiYnpaaiI6Hl5eJhI6MgX+Hj6WJjpOompeTl5mhmZ+Zk52bo7O1pqO8wr7IxcXJyMnCy9TNzdSp0tHW1dbY2tTS2c6FdYNrZmFgYFFLVlxCQkdDO0E9ODM3Ozw6OT02NDk6PDo4Mj85OTI6STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0SlE8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCZYNHdYKOfHxtfYh4en56gYGDfnZ2gIJ7bG6Kfnl8d3h8hIaLfoujtKikq7OhlqegpqSWla+ig5C4lZGzmoyhoIykm6+jpJ2YkKiXqZmusKSXlJWUkIuYmpagwI6jybirmqOlrZmRm5yynYaFqKKcl4WIiI2Ui4qSjoaAhYaIkZeTi4qTkoaTl4WDkI+bc5CYspWWo6CHm5qTj4qQipaaiIqWjYZ9jJieipCQnJqZk5mYn5SgnZSem6GxrqOkuL+0xMfEvcPDv8fOy8nSp8/M09LQ1tjSz9i8dX16YGNYY1lSSUtPRkJDRDU+Ozc2Oj87PDc9NDI2Njk3NzQ9NTs1PEs8Pjs8QkE3NTw7NTI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdNXF1ZSmhhO0iEi3p7bYWGeXyEeICEgX1weHx9fG9yjHl9gXt4houJhoSTqLytqbO9sKWus7Spo6KwrYqatZ6juaWVrKOXqa24pqSjn5mpmKqksLGqmZiclJWRl6CXmru7rcqhaba4qrCVmJ6jq5KXvaNeqbKCiYmMlIaQfI6NfIOFjY+Tk4iGkpWLjpWMioyWmJGbmbOWlKqdipuUkYyQkYuYmomRnY+KiZWfoY6VjZeZnZKcmJ6UoaCUnJ2mrqiipLO4q8LIxLW6vbvGyMjC0KHGyc3NxNfW0MrUo3N9bF9dVmJTUUhEPjxDQUE3Pzg3ND5GPDw2PDM1MzU1NDU0QjM5OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGdIYWBicEpAi4l+gHOHh3yBiXWBioN+bX18fH5wd4d3jYGHe42PjIaMmqvDwLC9xryztMG9tK2ss7eMqLKurr2rm7qjqK25uKunpqKho6Oqr7Kxq52co5mbmJeeoqWlkqO5rqi/u6ytsrmlo6d9iIadrbywgouLipCDj4ORjnqBhpCMjZuHh42WjIqUlpOQmZabp5mwmZCqnI6aj5GOlZCPlZaOkKCQiJWbo6yVlo+UnJ6UoJ2bmJ+glJqfqKekoqOws6bAxsOwsLu2xcXDv82nx8PHw7zW0MzEyop3dmVfXWJeT0xDTEBFRz9BPkI8OjQ+QT09NT02PjMzMzI0MkExN0BCTT5HQENOQ0E9Qzw7ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxpRl9pZ1tdXJOMjIh7h4uGg4x1hZCKgW5+e4F+cX6BepR6kpSVmJCTlqi0xsnAwszCw7nIvbqwq7m7mLK2ubLArqXAo6uwvL2qrqujo56nrK+1saqboKqcopyWn6+zp4yjurq1wbyrqJyypKOolISOqsTDpIKLjoaHhIaVlIx6g4yQjpGgi4uTkI6Hl5+XkpiUlqWfrpyLqZuNlo+RkZSVjZCUkY6hk4aXn5+zn5SblJ+hmqSfmqCboJSYnqekpqekr62lv8PCrqi3tcnDvrbOssS+w7uz0cnIwbV4fHBfW19tVE5JRExMTEpAQT1CRDw1QUQ7OjM9OEIzMzIyNjJBMTVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJoXU1lXGZUY2qajZaKi4iSj4aJeYWTj4FygHuNf3eHgoGPeY2hlqiam5i6vsnIysLSycvCzb3Bs628v6e6v728xLiswamss7y+qrCqpKWjrK61rre2oJ+un6ajmKOzvKmcqLzBo7a3r6uTsKyqrJeGmqqnpZCCjJKklYmAdYmReYSNkY+dn5GOkoqOi5Oil5aalJOhnamekKSZi46Pj5WWiHyOlZKRopqUoKKctqaQn5elpKOln56mmJ6Vl5ulo6ioorKsqLu/w6+ls7fMwLquw7O7vcG5rMLCwb+acXxkXFleXUxNTktHRUNIQUFBREs6NERIOjs0PDdGLjEyMzUyQTI2U0hOPEpCSlFFS0NFRTpFTEI8N0VWPTw9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+bEpfWGFaZGVYnpCdjZaOnpKJin+InpKEd4V/lH5/kIiJkICWoJqup6SYxL7IxMjG0s3Ozcu8wriwury0vcu7w8K3tryttL+6vK6vqKGpqLaur6qyuJqerKKoop2rt7eqpa++xLG9ubOnqrSzra6WlaWtqaCRjpKxxaeUjnyRlX2HkZiPqZiXkpKOkpSSpJySnJiToKGhm5iel4qLj46eiFqPlpeSlqSZZpmkn7OllqOVq6yrqJyfppeZlpiVoqSopp61q6m6vMK0prS1y8G4qrass7u4rqi4ury3hG9xXVtXWFBHS1ROSz9BR0RESEZGODVGTTs+Nz5BSy4zMjAyNUI1NVBXTjxMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVjw+QEJGQnNGaUlSZmRNRqaUnJWhl6iVjJCDhqWSiIGHgpqEg5WQkJOOmqGfr76uoci+xcXIx87Oz9LKvry2sbu7vL/PtsS+uLm3s7O2s7i0rKecq6y5q6mor7CYo66lqKSltcCwq6y0vsO5wLizp7i0t7KvlaStsLCli5OUoI1zwZl8lpmEjpaai7CVmZmUkZGZmKSilJ6alZmnnJqgn5iKjI+VnV9KlpyalJmll1SWsJ+vnZ+lla+vraaboaaUk5mYjp2gpqGZtKmqs7y7u6uwssfAuKWrq62xsaOhsrK0pXNyaF9dUVNNRlFRUFE7SEpIRkdBQz05S1Q/QTo9Rk0vNzUzNDpCNDROV048SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzVGQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVc8OkJDQD1SRVdTdGJWRkiql5mfoaiumJGXh4qnlo6IkoSfh4Sdl46doJqjpbXJtanHvMPEycvJyMzOx7+7s6+6ucDCzbXIu8G5trqyr6+0taeknKu0tauqpq6smqStpqWprLq/qKu3t77BwL64srLCsLe8rKOuta26poialqWbdb6fhJicjpKYmouulqCbmpaUmZ6fqJ2mn5iZqZmgpp2Xj4yQnYJtdZKimpWcop+QrrKiq5aqq5irr6WloaWqkpKZnImVnKKelrCmqaq6tr6zsq6+ubago6aopaacnK2pqY1maWRiVE1OSElPSlZMPUxETUlKQENEPFFVPEFBQkVPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQzo5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2e2ZXPDo9Li5TYUxWSH5lXkhGrJSboZ+7rpiUnouSqpuRkpOIqo2Hop6Mo62Uo6S2x720wbvCwsjJxsLOyMK+urKvubXBw8q2xrLBvLW7rKmtrbGko5mqtbunqqesqp2or6ikq6u+u6itvbS3vse8trW4wLC9wLOqtbasv6aPopaQoJ+7noman5mWnZ2Ptp6om6SimpugmaeksaCanaWcp6mcl5OOlJuKloiMpKGUnKKeobWvpaWTsqyaq62fn6Wkq5KWlaCEkJ6fnJWopKGhs7S6tq2otbKynZ2jpZqXlZmqoZ54ZGBiYExJR0hOUUlNRUZGQlFKSEBER0FWU0RIPEFHUTE6Qjc6QkY3OV1ZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRKiXpJ6ew6ybl6SXmKiblZmajqqWlaimlaytmaGrt8XBu7+4wcLAyMS/zce8vrqysLi0v8PItsCwvLa6t6ekq6ytoaGbq6vEoqWorKaeq6+toqqovrimrb+wt7fHt7S5uL+xvsG2tLK1sL6klqOVkpqTrZ+QoaKkoqKekL6kqJ2oq5ycoJqln7yil6OeoaiqoJyUjJSdk52GjoSNk56koJ22rKWcl7OnmrCpoJurn6KOmpaghY6hmpySpaSal6uxtrKrpaqtrJyYoKCSjpCWqZ+UaWZcY19RSkhLT01IRURJQD1PSEA7RklIW1JPSz1ITlU0QkY4PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLS0wTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9TRjxLeGZjWE6im6ObnsWsoJ6rnZytn5GinpakoKaqq5e3saOqs7bFwr3Atr/BvMnCv8rItri2tLG0tLfCxre/sbi1uragp62rrZ+en6WkwaWhqq6gpKmtsKKmqL21pbG8t7a2xLKzt7q+ssPAt7ittLW1o5yklJGToKyemKGcqKiqoprCrKidq62amp2YpZ+9oZykl6qrq6WgmI2an5KdiI5Xf5aepaGguaunk5m3o5+zoqGcsZihkJuWnoKPoJeXjqKjlZClrrKsqaKipaSVlZ2Yi4+Sk6SfiWNnXGViTkpLS09GRUFHSz49SUE6OEpKTl1RUUk9TFZcOUZJPUVNSThIY1xLQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2FTNlNaa1dzSEU2PXVlXExQnp+hmJ7Dp6Wis6CbsaaSqaOfo5+tqaudvLGprLWyyMPBw7PCw73HxL3Fyr2wsbausbWwv8W1urGwuratm6mwqqucnqahqMGtnK2xnKmirrGqpKi9t6a2u72vt8Sts7TCv7LGs7q3q7W2raqipZWUk6KroJ+fmqeqrq+vu7Gln6mpmJiXkqGjuKCgo5Gur6ukpZ2RoJ2UnY6QjJSdmqKfqLWnp42ZtZyjsJugnbCRoZWZlZuBkqKWkI6goJOLpaywpaainaCekpKak4aLko2cn4BkaF1pZ0tKTUpTQUNASUc7O0Y+OTlOTVVfUlNKPk9eXj1IUEJNTUk4TmRcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQTdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wO3ZdXj9bVV9nckA4PEiWd2VBNJ+knpufwqejqbGgo7SplLGqpqKksqytqbuzrbC0tMe/xMO1v8S+ysW2wcnCtqy1qbG4rMDEtLivrba6pZmrsqyrmaGnmK27tJyosJusn660sqirurKnubS3srnBqrezw720xae+rq23tamorKGWlZGlo6Kil5ekrretsbS2n56opJmUlJOjoLaipKWVrbGxpaikoJ2amZmVl6ign5minq+zoqaNmK+apa2Ym6Cnk56QlpqbhpeglI2QnZ6Ti6ipq6GnoJqelo2PmZCChpaJlZ96ZWtebWtOUU5OVD1DQU5DOzpJPzc3UU5dX1JWUUFXYV1CSVNIV0tIOlRkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2NaMzM5MDZwW2JIMDVKcWpXRFdGjHlmQzukpJygpb+lqK6uoKm1qZy3r6ujqrS2sbC4t7C3t7jFvMPHvbzDwsjBusLGwruqtqWtu67Bw7i4q66yvKOVrrGus5emqJGquqmhp7CdqqCvtLOrqra1rLuss7K6t6y5sMK6vr+mw6qwt6+pq6umnZiYqqChoJGXoLCus6qwuJmbqp+ZlpKXpp+2qKSioq+ws6uxpqqfm5+fm52lnaGYnaO0sJyfkZSmm6GqnJakopibjJealJaXnpSJkZuZlI6pqKefo5uZm5OHj5mLfYyXho+abGluYm5vWFFSWlRBQ0RVQDs6SUE3OlhQZF5QV1dFWV9eTUxTTl5MSj9aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1ERkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZUAxNzQ3Z1lhRihAOG19aVxWO4l7Y0M9qJ+coam8oaqvqqKwt6iks7Kroay1va6zub27vbe2wcK/ycO5xMPBwbnFvsG5sLaorLeyvL+/taqvsrifl6ytqa+YqamOp7uepa2zn6uisbCzrKq1s7W8ra+xtaywtbLAusW3q72vsbesramisaWepaieo5aPmJ+yqbKpqbKZnaebmpSMoKaktK6noqysrbCnsqqwqaKbnqijnpShmZyot6mYmpOSn5qfoqCSraGbm4iXmoyemp2Ui4+Xl5qXpqWjoJ2WlpaTgJCVhHuPk4SMl2dtcmhxc19HWWZWRENOWERaOUhCNT5dUWhcTlpdSFtfXk5NU1hkSktDXWNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7R0RGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FVMTUxPWBWXzgpQzNZVVxoSzWMemZMQKWaoKSstaOsqKWurbWorrK4pqewt8W3sbe/wcK2tbrFvsvEucPBu8C6xbjBurO0rKq6t7u7vrWrr7G3mZmorKysna2rj6u9nquvsaOpn7Gts6+utrG5tqqtr7KotrC0urzKsqq1tLG0sK+nobOfmqisn6SVlZqZsaKtoKWvlqKkmZmSjKKlp7Kpoaaxq6m0pa6vs66jmJ2tp5uXnpqarLmjmJSRj5mdoZmYla6ioJeDlpuPnp2Zl5GKlJOemqWio6GZlpOSlXuMkIV6jYuDi5Nsbnlvdn1hRmBqWklIWlw9e0pHRTZBY1RpW01cYUtcXVtSUlNiYUxLRWBhYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuK0EvSkdQW0czY1hUTEWalp+wqLCprKSjrq21qLayt6Oss7fJu7W7vMC+tbS3w8DMx7zDvbi/wMC4wL2yva6ourq4t8O3rK6yupaXp6+tqKSyqpSvu6SssrKnp6OytLGysbWwt7Oprqyyp7ivtrTDxbaptbWrsK2qp6O2np+nsZ+jlJuYlLGep5ufqY2po52clZelpaS3p6Kxs6unsKetr7SspJigrKicnJ2claq5nJWPj4yZnaKYkZmppaKZhpSYkZ6cmJeXiZeQl5qonaSgkpaSkJV2hJCGe4aDhIyMbnF4dnyAXExlbFxLTmNdPmJ7R0k4R2hXZVtMXmJNWVpXVFhVal1QUEhhXl9QS0dRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSWcyNydGYUxWJS1CLj1FTFE8M3FqTEVEkZikraSsraqlo7Cxs6m2r7Wfq7S5yLquwr3DuLOytcLDzsTAwr61vsHAu7+9tMSpq7qxt7jAvLCttLSeoaexrqamsaWdsbWsqbKwq6iptbqstbK1q7OsqquprKm5rrKwx7+4pLmvqa2tpqetsaWko66jqJydm5qumaOioqOQrJ+joJ+hqaaluKSrtLSkqquprK62rqKdo6iqnKCam5OktJmPio6IkaOhlo+Vn6OXloeQlZWem5mWlYiYk5WZp52hn42TkY6Qd36PhHx9foeKinJ0c39+fVxTY25fTllnXEZElltHOk1uWGJbTmFiT1ZXVldUWWheUVNNY1tbVUtGT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0RlOzYqSGRISis6ST8zQ0lTLD6PbEBISZCaqKmhqK+kpqKzs7CztK+woKutvcy7rsG9x7G0rrTCw9HExb/Cs7/Cw7y/uL3FqK23rLS5vcCxrLOuoqSnrqqopbCjqbCqraqxrq6sq7O7p7awsqmzqaumpaSuuqyqscO5tKu5qamoramnsaWppKOtqaiinpuirJWknZeemaydoqeooaymo62st7GwoKmioKqusKydnqeoqZqjmJmQoaiYh4SPi4ufoZCNj5ifk5KIiZOXoZ2WmZaHl5OTl6WcnZ2MkpCNiX9/iIR7d4CHhYd0dHKJd2xfWWBuY1FzclxLO4R8Rj5XdVhhWU9kXE5WVlVXUVxiX1NQT2hZV1dLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTM5ODsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDI9XkswLklnREY4PEIwNUVLWDFAlF1BTkaVlqynoKmxnKeosLWst7StqqSrqr3JvLG/ucOvsa2zxMPNzsO/wLTAw8S6wbTJxKyvt66zusC+tK+vrKeoqrGpp6ixpbOsqq+trbGusq2zu6W4s6yrrqeroKOesbirqq26tqS1taSqp6ysqq2gqKensLGjpqWhoayWqqGTm6CmnqSiqqOsop6msbasrKGlopqpqq6qnKGlpKSZoJmWkJielIKDkImFnaGNjJCOnJKUjoWPmqWbk5KbjJOSkpSjmpyai4+Li3yGgYKBenWBg4F/dXiKooZ4al5gbmZXZYdkTkBnkkxEYnpXYlhSZlVNVlZWVE9cXWFVS09pV1ZWSEpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC4yLCYwN1haLjBKZ0FBPDxDKzpKT140RIdDSklElpCvpKGqr5eop621qrWwqqSrqqi8wcC5urS8taayr8TJy9G/wbu4v8DDusK6wsSusrWytLzBvbOyr62srae2qqatr6q3raewsK6xq7WqtrantberrKSpqZyknrSzqaiks7Sfta2hqqiqqKynn6usqbi1qamqqaGpoK2bkaqhnaCko6ajqp2cprSup6SpoqOXpKanqpyipKOgmpigkY+PmY5/iI2HhJ6eiYaMjJGRk4+FiZejmo6Nm5GSkI+SoJial42LhH90hoJ/fnh1g397eH5/h5yPcHFmZ3F4XGF0iGpPXZhWSG15VWVWU2RQTVZVVVFPWFtiVklQalVXVEdPWFVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UyMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIvMjIlLzNSYzAyP2Y9Tlg/Qyw/TFRfL0lsOFJGO5WMr6CkqquZqaOtrrK0r6mlr6mou7+8wbKwua2itq/Ix8fQwL+9u7zDvrvEwr+/r7Kzsra+vMKxsrSrtKmltamlrbKyt66irLSxr7G5q7iuqa63rKqeqqugo6G2ramhn6+yobSqn6inqqKqoaGsrai9rquuraGnp5+smY+wopiioainnqebmamwqaKeq6GhkqGio6eYmamlmJiZnY+Lh5WIfY6GhIWkl4aDhI2IkZCShoeWoZeIkp6Sk5CNkZ2Vl4+Lhod4dIGAfHR3eYB7dXR7a4KHpHZpXmVsgXVniIx8UlZvXkt4c1RkU1JfTU1TWmdOTVdZZVlHU2lSUj9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWg6MzhfPWFkP0YxQ1BbWytITztZRDOPjbGgpKWpo6SirKazsrCopLCnqri+wbyxqbmqp66wycbH0MO+wL65v8C9ybzBuLGwtbK6vLnAs7S8rLmso7Smpquwtbexpaa5tKyzu6+8pa2ttqutnKmvpJ+krKqonJ6qsqSzqJqrp6qkqJ2iqaeqvaq0sK6dqaSgrpyas6OWpZylpJ+lmpqoq6Wemqihm5GboKSdmZepqpKZmpKQi4OPhX6Pgn+In4+HgX+NiJORkYaDlZuUhZOjjpSRi5Gbk5aHin+AcXp5fXxodnx6dXFyfmqGeYWIZF9nY3KFe21oeV1eVUFXe21UYVBSWUxMTnB0XUlaW2haRlZmUEM+Sk9EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTtGXUAqjZGwmJ6fqKSioauktrGxpKmwpq25wb22saS5rKiosMLIyMzCt72/tbjBuci2wrW1s7Wyvbm6vbavuba/rKKzpqqqrrS2s6ibubuosL6yuqCutLapq5+tsaOcpaipo52bpbCmr6Cfq6mnoambo6igrbynrrCuoaqipK6enq2mmJ+aoaKcn5uZo6qimpqipJWWlJ+hlpuWpayMn5GQkYyCioCAj4B7mpWNin2AjYiSkY2LhpOYkYaUo4uSkYiQmZCUgYl9eWt9dnh4Ynp6cW9xdHhrgnVrgmdjZ2Juc45tYmpvYG9AXHlsVV5OUVJLSk1UWVZNXF5tV0VZYFBeT0hNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUl4+I5GWrJiel6eioJ+no7evraGvr6isuMO7tK6gua+rqLS6x8rHv7jBva+0v7fEt8OzsLqxssC2u763qrm4vqqktaeoqa+suK+nmLm7o62+tLSgrbe1p6ansLOgnqWmp6CkmZ6sp6ieoKqvp6CmlqKon7G4n6Sxr6CroayknKanqJqbnJ+jlZybmp2pppabnqiRmJOZnZOZlqGqkZuKjpCHfYd/go59fKGNjYl6hI6GjI6NhoqTmo6IlZ+JkZWCjJeNkn2FfHNwfHFzdF94d2lucXFwa4B0ZXpsZ2VkYmaGgGBbcmpyTU2AaVhaTVFMS0hQU1BHTFtgb1RGWVpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VcRk89UlpnSCo/MF1cNSiVm6aYm5Wsnp2ho6C2qq+jtLOpqbnFt7OuoLetraywtcXHwLe/wbmwtb23v7u+sKy+sLO/srzCuKq7urinqLWnp6qvqrGupJe7taOqurWvnrG4r6mlp6+xm6GkoKSjoJabr6WhnqKor6GgoZKjpKK3sKGmsaufq6OumJ2qpaifmJudpJOZm5qdpamZm5ullZSXlZyOk5iiqaKRiouQhnqEfoSLeo6Xio6He4OJhIqOj4aQk5iMjpWZi4+XfoaXjJB6gXtwcndub3Ned3dkbGxsa2qFb2dyaWplaV1kc4FgW2t2aVpKf15bWU5PS0hIU1ZHMzheX2xQRVlWWmVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFRdaEQuPDJkVywxlKGhlpSbqpujoaKhtqmtoLu3pay9xbSwr6O2sKysrrTDw7yzvrq2sLO5uLq3uq+uwLOzua+/wLesvbq1paKyqaaosamrsJ+Zv7Skp7S1qJ6yvKmopamvq5mip5yjpZSXoLGkmZ6kqaicoZ+SpKCkuKmkp66nnaShqJOgqaKhoZmbnJ+SmZuWn6Kqm5qYoJSRlZeajZOTpKmkkImKj4Z6hHuEhXydjYqLh3uChYiJipGGl5KSi5CUlI2OlHqDl5CLd358bHRybGtzYHd0aGhqZ2dwh2hoaGRmaWpgamNqaFtme2JgU3RUXFtSTEpHSVBUQCEqaF9pTUVYVV9gTEpIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEaFtKV0dVYGhCMzc5Z1AnMp6ipJGOo6eZnJ6do7Osp6q6tqasw8G4sayjtq6nra62v7+8ssG2sK2ytra4tratqr2zrrKxvL63r7y7saWftamkpLOmqK2dnMCqp6Svs6mstbueqamssKWYnamdpqSRmKWsoZidpKmhm6Gblp+dp7WmsKquoKCdnaGVoKagoqCam5mbkpidk6WdrKGXlp2Uk42VmIuOmJupoJKJiouJeYV2gYKBnYeLg4l+gIaJh4eRhJeUj46PkZGRjJN6g5WPhnN+fmZ5b2pqa2V0c2tiZ2RkdoFjZWZmZWpqY2tyW19ZXWxjYU5pWFpgVkpHSEtNU1c+OV5saEhEVlRdW0lKR0ZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlbTFpKVmJmQDozQmhIJTWao6CPjKuhlpaglqSysaKyvbahscW8urKxo7esqq2puLy6uq3Asa6urravsrizqau5sa+us7W6tbC4vaymnrSpn6Cwoqitm6K/n7CjrrGvt661nq2vra2imZ2mqKWflZqnpZ+YpKKonZqfmpOcnqyvprqorqKhmpuemZ6kmqSdl56Ym5SYn5KolaqnmpOampKMlZmNlJSbqqeOjoqKj3yCc4GBipiFh32JioaGi42Lk4WVm5OSjo+Rlo6Qf4CNjoNvgX9meW1na2lmcHJrXGdjY3SCYmZnam5sZ2pqaW5dbGxycGBUY2ljZlpJRk1NT1hRUFVhZYBVQVdTWVRHSUZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlBMS0rLjM8O0s2MC4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyY0kaGbjY6vnZmToZqpsa+euL+1oLTBu766saa3sKetpLe4t7asu66sqqu3qrO3rqaytbKuqbC1tbCytbmmqJ+0p5ydqKCnq5qnvZeso66wtbWtraCxrbCooZuco6unm5SbpqOdmqmipJWan5uQm6Sqq6q7oKekoJiamZ2hj2uilpmccIKVmaOAdZKpp56UlJ6QiZiagJaKopB5h5SNg21qf3eDcWyGi4Z+hYyHcV9kYWeEmIVrio2UknR3i4R+g5CAZ4eAZ3VoZVdcaHNuTVBpY2dyhWhfZWZubWpdYGGKj4OEZU5LRDlHVGheSkhRUVVVTEhTYXB0ZUZbUVVQRkhFQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUFAQD0yOEBFPTEsLDA4PUc3MDEuKi4qLzU2OCwjMScyMTQ6Mjc2WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoukmYaVsJuak6Cbqqyqo73Frqm3wre9vK2nt7CkqqK3s7GysLmsqaastKWvtKOpt7W1qKertrKttK2zoaifsqmdoaOZpKWYq7mTpaWvs7etr6WqrqqspKGenKCmppuWoKWkm5unpp2Tnp6Xj52oqaS2sKSjopyWmJeXo4ihjpKahqCHkpygf6V/pqqekpKakYiEc3iNjoWIoXaJjWmXiWZ+c3igb4iHhH6PfX+hoKCZgH2HnnOGjnWbimyHgYNtaWVjemxyYVOFbWJsaZhxWGlxb4hZXmlbbGxbiHJuenKFZoaEWl9HTj9HX05GUlZWUVFSV1VnXU1WSVJST0ZIRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk5LzAxLiouKC00NTczJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3LyiKp5aDnaudmJidn6qpp6q/w66xury3wL+qpbewqKylsrSurrO2qqiksK2ltLKcrrW2tKanp7KwrLKorZ2poLCnn6OimJ+hmq2yk6OlpbW9pq2nq6qsqKWgn5ifpqOZmKWio5icpKiWk6Kbk5OjpaahuKSkoKOYlZOXk5yIr5CXlImpi5ahnIWxgKOsnZOZnZR5gtSogIeVwZzGeXixpbeXZYDAnL95hIV6koR9kJCRynKXu5zFenK1pruQe4Btl7GrsHlobFixrm5labySvG5nem5yj9h+U2tjtrJ+gXOUc5qhqpBXT1diT1ZORlVbWFFQU41dV1tRQV1EUE5FSEk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT46Qjw/QTg6Sj41MioyMkJFLy4zMi4rLygtLzE4Ni0gLzQxNkExPTlXg3cyMVRrXE9bTV5nXD5MMVtdNDEhi6eTgaepn5ecnaWssaiwwr2ytcC1tr7Bq6azrKyopq6zqa62s6anpbSlp7etnLOxtaumpKewraywpqmcpqOvoqCfnZWZnpytq5Odop+zuqOrqaKtrqWhm5qZoaefl5qnn56XnqankZymmZOdoaaiobGjn5+jl5aSl5KZha9raoqNqn5mg5WGrWRwnZ2UmaaUcK6hpH54u31soZB2sV9qtFulgGWckGFng3tngGt5a6llvnFnpot1sWp7sXh0kpRjbm2nbluEoUVoZoeWRXWcYH5nfKSnglpgjKtogJV4eWqnN0qvXFhTbGRbS09YYFxXVjtOi09XVy9JVFNKREZGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MDMuMzNFNC4uNTMvKy8oLjAuOjYvJyQyMDNCLz47VYJ2Mi1WalxPWUxfZ1k6TTVfWDMwG5CilYOtp6Weo6Sqsbestb2+sLbEsbe6waaosKquqKivrqOwuq+jpK2yo6m3p56ysrCjpaGprK6rr6amnaKhr5qhm5aUlpqbrKSVmqGes7OirJyjra2gnZmWn6GonJieo5+bmaGmpI+copmWoJ+qnqemoZqgoZWVkZaQmoW1m7V4hamZtZl2hrObt36TlpaplH9rgaZ7goaIk5STd6tna7Fcq3qNhpR0iXKPh4GBiZCXeIKBi5eLg6COg7B2d59xbGxsfItOpFhIYmKZfmNopl95cnVTk4deUaltY3F9hoBinC5RoW9bU2toYExKXGVZXFpCPrJ7WFhBI01oRkNFQUBBMTk+ODg6ODQ7OTk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QEZCQEFEPEZEOzAyMDE7Ri0wLjk0MCwuKC8zLD44MzEfLzItRDE9PFN9bjMrWGpcT1hNX2dYN0o4YVU1MBuUoJWHs6amoa+pqLKsqbu2wrC7wa24t7+prK2traWssamgrruqoKezraOqtKOmsrKno6Kepqqxp6+npJ2fn66VnpmUlJSYnaygmZmkqLWvoqqPqqiqm52Ul6Clp5qenKKem5+ipKKVm56XmZ2iqZummpyboqGXk5GSk5yD1ZOZuXCwwX7FhnzWlJu7fJqVpY+NnY2ke46IpIOlg3qseY+dVq96iH6fa7lbuneHhH6mgpR7l3qqeI2dj3qxbo6EdJG8hW+UUK+nxYpRoHpjYKpic3KIbZeIYFO1tMiFgIl8Y6QzQp12XVBqaWNQQFhoWmRhSkhNcVFcUU9ZZlpDRT9FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw5O0RIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdIOmFQNzElm6KUmLKoqKa0qqW0qaS8t8Gwub+wtbS6srSnsK+ir7Kln621qJqnuK2ir7Cfs7SwoKSen6apsKizqKObnJ2qlZiXlZaTlqCpnJmWp62wqaOfj62iqJadlZugpaCYoaChoJqhoaeanqGelJiapqCcp5Wbm5+hmJCSlJCdiLJuaLVxq4dujqZytHNytnual6SLj52Non6RoaZ/sXeDkdLSdlyue4V/pG+bqqZrh4V9rX2YmY57sXGSno53s2WXdISeb55nlFHIi1rCXKB5Yl+sYHVzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNlWEFQa2BsaFBWR0o5PVVSWldYSUQ/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE/Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1gTDYyMKKdkqSxraOrvK2mtKantbq8srq+trWzubiypLSyoLCxop6rr6OXpritpLGwnLS3qaClnqGppLGnrKmjmZuZp52Vk5eXkJKhp5+Vk6WqsKail5OtoKaSk5+bo6WelZqlpqCaop+tmaGenZCVm6GdnKWVnZWZop6VmJWRm4Wse3eodqONiIapb62KgqeDmJihipKbi6J/k5qJroSAgrNccrNSrn2CgqN/cth+eIZ+j52Gmpl2r4aHkZyHdrRhmmWagoKVbZJasFhLmnWYeWZgrF51d4homIhrXa93lZ6PeGw1eciusl9CVG9eZ2BFUG1gcG1WVk0uZmVpU1lQO0JFQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTY8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdCX0g6OTmgnpWgubGXtMKuqLKoqbK6t7O3vri3sbS6tKS3sp6zrJ+fqKuelKe1q6iwsaqts6ObqaCfp6G1pqWpopiclKSgk5Kbl5GUoqSakpCmra+moZaZqaCijpChmaekn5WZpKidnKSerJyhnJ+Mk5+anaGZmZuWl6Kgk5ePpp2GqX19pXihjo2CqnCti4GnhpafoYmYmIijg5KIlKt9gIudeW+xWqiCgoifenTZgHeIdKiBjpuMkqR7lI+fhHqyXp1koH6DlW2SXatbWpOAkX9oZ6pjcXuBa5iHc12rWomgjmtvZU9KQ6FcW0x0XWJnTVthX3FzX0tXN0qcmFhHRT1IR0FNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDUuOz4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSF5CMj84o56ZmsGrl7TCrqusqaa0sLewtb65uLGwtbqourOfr6SdpKamnpOpr6iuqLWrqa6hmKCgpqSjuaGiq6CWmpChn5STnpmTmJ6fkIyMqbCwp56Xm6imoIyRo5enqqaUl6innp6goq2koZ6hjJOhmJ+gkp6XnJWdoZWWjaqcj65tcrRzqYt1iqdztHhzs4CRpKORnY6JpIeQd7hwjXuLomprtlqhhWWXl2mgoqdulHK0dJOZfrJqhZGHrWp1s2GdZqJvh5Nrl12tYE2hfIaSUnOja3l/fm+Yh3Fcr1Y8nHdmVG9uLlynT2NTa2VibVljXWFwe2NUW1M+PW5xM0NCQD9MOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKacm568oZyywK+tq6unt6m3rrW/tLqvrre2qsC1qKmgm6WjoZyRqamntKKyp62poJecp5+kq7idoqyalZiOo6KVjJ2gm5icn5GTlKu2saiZlZysqZeMk6WYpKyikZWqsaOfnqarsZmho5CYopagm5aclqGTnKmclJCqmYfUkpq7c7DDgMOGftWWm7h4iJCYjJiLjKeIeqS2dX53dsKCmrJgg7p5wH12uGO1gYyHqX2VgaupcXt/dLyIp6BpnWGmjq+hfox1h6t9vm9zvHSyg3R4gYpumohxbo2kdL1ed31aYXm8a1pWXGp5XmpgZmdjbXhvWVxaQ0BAdEBDRys0RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgYF9fWlBQUktFRko0SExSQEpORUZPQj1FODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmom56jvaGXssOwramqrLGmt6+2w7C4sK24rq3AsKujop2joZybkKijqrKktKWspJ6VmqqYpqy4nKKtl5SfkKSfkoycop6XnZqRlZOvubKslpikqKeUkJaknKOsnZCfqKuemp+oorOfo6WOp6GUopudmJWjmI+vn5GUqZ6FkJi2f4+RjLeVeIKTmrV3bWtuc295kIWPinSfwbu9mnuBsahwgHORuYN9h4aNh418ioeNmHyku7m9nHR5tKN0d5d2dLB1mZ5mh2qNtnRycXi2jF5/en2JaIN5bnpji6xwdYV/WFunakVkWlRmYGNeY1FnZ3BsdUNOUUxDOlpNP0syOy8gOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVzgqT15dPSs6VlUnPjs8qJ6hosCllrXEtKyqqKyqqbmusMWts7Kttaa0uKypoaGlnqCdmZOqo6yqpbWnpp+blaCjnaykvKWgqZaTm5Chm5KPoaehkp2XlJiVsrW3rZmepKSii5KRpZukqpuVqKSlm5mhqKanpKqhkq2el6SemJeXnZ6Pr6iTm6WhjWp9aZqld4ZyfZqOdHlkh3u9vsC6b5ODcpaIYXNrWl+bimFjiI+Va2CAlmRunndjlmyBmpWUZV5gYnCZiGlyi32GlWdrf3J0eH1/Ylx4dIFoUF1ug317i2tYa3qCc0pKb4ZwTnRMRVhdZ2FMW1hmY19PW211aXFSUURFTTtHST1NPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTX1Y0KVBfTCgyPVtPJz8yPqmgqKLCo5u1u7airKWup6e0sazHq6+yqrOivbCwpZ+ip52jm5mZq6auo6S0qaSbmJWgmqatqL2nqKSUk5qVn5mSlqSpqJCekZCYnbCzv6ybp56nooiTkamap6Obmqqgo5mao6eso6Cso5uxm5SnoJeVnZ+dlrCkl6CnmJqQm5uhoZekoZmcmZmZj5WBZ219cXeSmJSShoy2q42HmJaOioyYloeUlYuEk5SSiY6TlJmUmJaZn6GZmpOgnI2CeqWFbWt9kH2AdYuKgXGCeHl2dYl/fIlqc4F0g3Vldn13a296bV9kXXBoTVlaZmpfV1pveW1tZlVPRlI5TllNUk8oKzpLQjYzNT1AQTo6Qz48RU5TU1RWV1haWlxcYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODEwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSiw8LUCzobOjwKGksrK3oKmlsqelr7Sqx6qsr6SzpMCns6CdpKSco5WVn6qmrKKjtqufmJaVn5etqaXAnqqjlZGal56YkpOhnp6ip5OSmqmos8Swmqudq5+PlpaonaqcnJ+rmKCam6Kkr6eipqigr5iXp52ZmaCenZyvoJygpZSWkZeTnp+UoZ2XoI6Wk4qKjY6XrpB8lpyDkoKLq6mFgZmXiYSPnoh6hJCIhpqSiIeKlo+bl42Ql52jlZiSkJyNf45nobOvhYqFdnuSin13eXpvZnmPgYGJa3WBeYhzaXN/e3aDhoJqdWR6ZmBqZWNkZmtZa3tvaWpdU0xQRF5URUA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaW19iY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RcUTA1TlsxN0UzW0c1PCxAtKG5sL+sq6+ysaCqp7Ktoqyyr8Svqaqisa28orObn6aioZyYl6elqaWkpbK0npSTnZmZsKWtvqCropCQnZmZlJGVoZyXqJ2Enqyso7TItKCqpKuXlZeapp2omp6jqpOen52gqq+qpqSso6+bn6CgmKSenJ6crqOYnqeSlpabkKKXlqecmpZlgpJ8ZX6NmpBjeY5taGt7kqWramWbmH1nhoplZWloe46ij2xojZiRo3draoqYop6Xc2tteoSOiHpYZl6Gg15tjIqBdlxoc3d2kX+Igm13gXh/c255hHR2iYeOg3xqh1lebHVlXXOJaWt7cGtjX1JOV0lkWEFKND5GNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJVV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMllDOz8uPaWgury6r6y0saqlqK2usKatrLC7sKimo6ytsJ6slp+jnaKZmaaqnK2jpaeosq6elKKPoq+ltbilraKOjZmgmZOSm6CZmaWWfKWvo6i1xbiloqevnpyUnqKeo5uiqKiRnqCdoaqwq6ykq6Gqm6efp5+rlqCbpa+jlpuolZ+cmpGilZypl519vYOIcrRyhJ2GrWh4ucS4cZSjo3qmmZlyq4J8y8DAu3GMo4iDnnyWmImdwL2Blp2djJzBwXyCfJONmsPAfmylsm+MgW/Ken+bdpCDjoF1eYCAeXF6f4dwd4WMk3lteJRiZ2B4ZF9lgmJec2dsZGRZTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUVNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLiNGWzNQWS9VQUI7LziWo7nDtbCwwaqolKOvqLCuraWys66ppKWlr6ueqpiaop+cmqqmoZ2roqSopKS0pJyikqWtq7ezp62ikZCYnKWSkKChmJyfnYinraWsrsHAsaGprqmWkp6doZmhoqmjkqCgnZ6sr6uup6SkqKGmpZ2sqJGjmqisqZqcp5qqn5WWo5SfoZWbfs6UeHqkgXmVlptfro9ejqiCo6F8p5abc6uDgK9eY42qe6iHhaB0l5OIs2OCq4agjY2zaoSvdX2XiLdig61ao81ukHZ72nt/mXB9iJJ2fWV6h3Z2a3yHbn2FkJF+bYOQYHFscGhgX3llXHFnamRnYFJUUlddS09ENUFIREQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGjqqits6ulsqqrqqKrpq6pn6abmaWYnKKvn6CfqKejpaCesKuanZWmrauwqqirn5SRmp+kko+fpZeep6Ofr6atsanAx7OoqbGulpKdm6GXn6ipnpSgn52drbCprKucqKiloquSq7KWpKGqqZ2ipaSfrp+RmKWXnpmSk5CXoHGFjJd1haiGcbF9nnKsf6KfgaWQn3argn2tf5xzrX+sh4afdpmSe3yXfqqIoYuRi519q3uJlZCggXutV53Fe49wk8F9gZVsdXCMbWV2ZYVvYXducm+JipKOg26TkmZwdXVxYWdtZl9vaGluZ2RXVF1hWlJTQzlKSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08KD0xKTNXQEYhHEc6QzEuK7DTxsays5+coo6joqKsrrauqLGlqKmmraqqp6GjnZmilZ+lq5+hpZ+oqKKenbCsl5qWqaeuq6imp56XlJmjoZKUoa2bnaejr62lrrarus6xraauq5aVnJ2imJ6tq5yWoJmdn6mzq6urnK2rpaOsmq6xoaerraWXpKmnp6+gkJSiopiTkISkaqR1iXqpdHqycIKmipmMcYmgmoakYGFSrIV/roObdq2CqIaFn3uZl4V6ZoCjiaSYhoKjfal+gZaIrl98qVaeo5KBeqOfgHvDrsSLcq+zs7lxYqmvwnRojIyYjoFunJVxb3p4eXBsZmZlcnBmfWpjXVdgalhZVU1NUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NSoyUEtMIyBBOUQ0LCfDydbUv6GZq6egrqKer7SwrqmsoqelqaqqqKSmoJuknp2mp6ejnKuZoqyho5+voZ2akquktK6uoKeanZWTpqKRm6KooKCmnbGmpqmyrbfJsrWqq6mWkZycopifpbOcmaCUnZ+nrK2lsJutq6OjqqGyraGpsrChmainrK2zoZGUoaWWmZB7qWyehId1q3l8sG+CpYyJn5aWoJWB0ri0t8mBgbJfYJSpg6WIh6B6mZWaeKrJdJmklKmpkJKbjYCdiprGxnlnoYKldIGfjoJ9r11vtGKwdUujh22nR4KTZI6QnpJ8cZmVgXF7dX58blxmanNxZoFrX2FZZG5cX1lJTU1LRURBQj5BPEI/STs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqLKtrKSim7K4rKqgpZqopKmrqqefpqaYqqOgr6uepaCsmp6ppZ2ntZ6il5OpqrWxrJuknKCUj6WskZqcp6OhqqeuoqaoqrG1w7Kzqqyok4mXnKSaoaOupZehlZmcpaatnLGerqmnn6uitqygsLiunZqtprCxsKKSlqahmJ6Ngp1OeJqBf596hKN9g6SFh6afnZ+UhLh7fHm5gn/MxsK2eJuhkYuefpqWl4p2n5eKpZekqX+whZ2GoISsfZqVY6ZtpHCPhZCBfJaCcqxgo3JwgJpgvH1SVXSOkqOWe36Uk4x2e3OHgHFdbW54cmqCb1tkX2pvY2VdS01RVEFJSEZJOjlLP0IxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZZWVpbXF9fXl1fX1xaWlpZVVNPSEA4ODIuLCouKyonJz9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmKmrpKq4qq6gm6CssrOlnqCVpa2traqnnKanm6OoobOvo6mnsqCYqKSUorWiopWXoqm0uKOboZyjko+hsZmenKemoaKwrp2mqaO2s8WwramsqZGHkJynnKKknKWWnpiZmqalq5yxoq+lppivpLutobW1rJycs7C2r7CklZyunqKchY/RtcO3eYeOhZGTkICmeZShd4ygkoSlgopxqoaFtW5yaZqknJWKn32YmYaHj3Ovgqabo46mi5Odi5WQm25xsl2ldJN6nGyYf3uZfG2pYaJxcX6fYnOyuGh3j5SmmH2NjpWOen15kINuanlpenNvgXVeZWVvbmZoYEpbWFg8SEhAVTRARj48Kik2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBfXVtaW1hVUlJRRjoyMjMvLysrKEBRUlRVVFNUVldXWFhXVVVVVVFPUVtVJSEyQUgkKSWSc4yKrb2+vLm0npanpK21oaGYlaOnpq2rrJmmo5+moaG2qKOpp7CjlKujjqWto52QmZqqs7OknKOcqJGUl66foJ6npJ2onbaao6uktq3EsKmrqaKMhI6coqCmopWZmZyZm5mnpqiZraivo6WbrKa9rJS8r6ydoa6wt6mwpJinr6GmlnmokH18sHeKgKSliJxtsnChh618oY+DqJWYgKyJha6FoJWqoKKXhp+BmpWAe5J+q4CdmpeLqnedoJKKlJKBeq9epIF9pqdknX98l3Jqr12kanCGmV1gW4ygbZWRppmClY+ajnx8hJqAa26AY390boB6YGdmcW9paGdDWmFbPUtVM1U4QkJDOCQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaV1NQT05JNzA0Mi4qLEFUVlZWVFRVVFVVVFRVVFNUVldXWFZVVVFIRklKIygovZKag6jFwbbAs56arKCtt6WjjpukoqCwsKufpaCerZmfuaGjq6CvqZqtoZCrqKSWiZuQrbCspp6lm62XmI+soaGdpaGapZ2vmaKpp7eqwa+lqKSei4CNm5qfpp6SlJialJuapqWmm6qsraSknqmovqWWwaqpoaCqsLepq6Sesq2mqJd1r36Qi5yFh366rYqZZbCNZZWtfaGPg6eVmoGsioSwhaaapKGikYWhXWxrgbNgf617e4OBsW1nbpmZjYmxW361XKSEa8iiZJ+Ae7tXdrVZsn1SroB6rFeAoW2Xj6ibjJiSmpl8epGgf2R1f2OGeHWBfWJraHJuZ2ZlUFVkXEFWYD5JKD45PTQhIiwlHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFFSVFdaXmBgYGFiXl9cW1hVUE5KR0M1NTMuL0BVWVhXWFdYWFdXV1dWV1dWV1hXV1hZWlpbXFhXV0dCO9KfsrG2vbqzwbKinKympLWooIqaoJ2cs7Oqn6ShnraZobSoqqyesK2eq5yVr6ehjoibj6+rqKahpZmukpiPqJminaWfmqSjppqho6qzqr2vpKienY59i5uVoKCZj5GZm5KamKmgo5qprqilpaKkqLqen8Slo6efqbKzqqyknbmrqquUgKmSo6+Om4CHpJeZkIKAuMO6g46ck4Snl5yCrIqCr4mnnJumq5F+1r3CqmKkv719fqOCg9e7uLWGlpSEnr2+hG2jgm+rhGycgHqysMeDaauwvKx3dqG+vHOAlo6mnZGckpqge4OTnnxjfntlj2d6g3xhbGZta2NRYVtTalxAVWJDTik9OjQvHx8kHyUyIB0kKDA0OTY2Nzg7PkFDRUdJS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PUE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbOzsL+4sbyyopytpqWypp2LmKXAqriyqKLAp6iznZ+ynbqon66vpaaVlLCrl4yCm5GupaKsoKOcqp+XiqOTp56nnJuhqaSZoKKsrqq6raijm5eSfIiZkaWbko6Ql5mPmJOpmqGZqqmhqqego6q6najDop+soamwsqitp564paysmXN2qqS4hmSJoHBorpGLkG5ud6SQmZ+Bda6ZlHCPi3GWqKSbmK+kc21tbWaLeG9ugplwgXpqcWlnipiWmXJpaoWIZ3GGZF2IYmpvWVxmfXamX2FwjZBuZWV/jJOPoZmZmpOZoX2JkZh3Zoh4aY9se4B6ZW1kaG1jS2RYSmtaO1FmRlEnSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERkhLTE1PUVNWXFdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1dXWV1eXl1cXFxdXl1eXVtbVVdeqZWss6i5uLGzqqmhrZ6jsqqYkr+zxcu+t6ufwa2upKKpraC6o6SurK2ljZauqY+LhZaWrJ6mqqCdpKOgkYukk6eZqZqXpKuil5+npqiwu6usmpuSknyEl42lmI2RkJiUjpiVqJWgmamjm7CmnaKruZ+vv6ejsaSqrq+oq6mltaKstpWKoammt52JlqOZiKqbkZWdkqmzmZqiqqCylqKhnZ+inaGlopWsp42Tk42Hk5yclZGZk5mRj5aGgaWbmZaPjJSUjJCHhH5niX50gnVzh4pwp2x6k4+TkYCBjY6Qj52VopeamaWEiZeRdGuRd3KMeHh9emptZmVwZVVgWUBqW0hkYlBZK0Y9KychNzUwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhVV1leYGFjXV5UUUtFQz45PUBBU1hbXFpXWFhYWFhZWFhaWltcXl9fYF5eXl9fYGBgX1lZYKaWqamktLWurqKwo62foLWxkI2syL7Gu7qro6afnaefsqqkt6edqbWnp5GYraKLh4mPm6eVrKSfmaifnpKUo5eomqialaeipJGcqJqhtrunqpmakI18gZWLoJSKlZGWkI+Ul6aRoJupoJy1o52mqranrsCtorWkra2uqqemsLafrLqYkaWjp7aikp6noI6qoI6Tn6OrsJqgo7CosJejoJyjqp+enp2XrJ6TmqKclJCWq5qOmZmXkZegkoihnpeVh5ONkY6Vi4F+ZYuFdYZ0d4eCc5xqho6Sk4+JfYuVkpKYlKOUn5mkhYmbin10l3R8jIBzfIBqb2ZfcWpgW2BabmRQYWZRWjpHR0U+Mj0+OS8qJispJh0mMzE2NjU4OT09P0FBQ0lKR0pLTE1TU1RVWmBgaWFlVlBLQUNCOjlFTVZbXl5bWlxbW1tcXV1eX11eX2BhYmJhYWFgYmJiZGJcW2OXlaOmoq+xq66jqaasn6e1qpCQnaS1vbCtraOkm3yfpLOlprGpl5u4pqOUmaqcjoaKiZyij66eopWon6CSlpmbrouqlo+qmqmNmqmQn7m2pKWZnI2IeYGTi5qTipSRk5CNkpejjZ+fqJ6fuKJ/g661oq6udKK7obCedniep6+4k3Sro56Jf6t/ZFxidqCOpZ+EmH1tkrOdoqatqqNlnZ+Sc3mal3GBmamYbX+jqIplnKadkpeYloyTnZGGnpuRloSTiJCQkomFd2qOhnaFcHqFf39gaIeKk5GKWnWUkGdoj49zfKicnGZ7m4qFeplqhoyEcHqAa3FmYHdwbGtpXGZmYmNxVFs+Tk5OU0c+QFVEOjEvHh8mNDozMDY2Nzg8Oz5AQUFGSEJHRklLTVNUVVlcYGhmZ1dRSjxERzw4VVJbYGFiYF5fX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5WloqCur6urqaWoraKmraWSlau3sbOnm6yorZh0jZ+xoKirp5SXuaCgj5yknpF/iYibnoyrmaKVp6GdjpeSnYV2rY+Jp5yqkpmkipy7s6egmZiLiHV3ko2Wk4mTkZCUjJCUoY+coaeZnLGVgYybtJyzjJKNuaWffaeieaCstH+NjaWeg4uGkLGqr42Ll6SbeoGLrIWcnqGmqKeHlYWYd6WbeoecgZeng4J7nbN6ioahmJqVmJaCkZeXhJuaY3qHkYWPkJKLg21wjod5f3B/gIR9hXOFg5SRd5ZoknSgmnR9mYSjoImYf5WOh4aaa5COh2x5fHJxaGZ5cGpsa1xlbGpndV1eSVRMUkBFNi5bVVU3KSEwOT4+NzQzNDY4Ozo9Pj5AREk/SUVKTEdTWFtZXGJhaGZZUUg5RUw7PmFWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXop6lrKyrp6ygp7CmpqmmmZOvycCyopeoqrefkYWfrZynoqCOkL6emo2fmqCQfYaOmZeHq5yilqChkY2TioWAkqeNh6OepZWZnoegurGnnpuSjoVwdpCJlZCKlI+Pm4uPkqCSmKGklp6rh5+0ibSZrYrKhqisiLaFjK+BrquCqIymmI2dfaiPc3t3nI+nl2iVpHm0i6CdpaeSmMKAf6uImKFynoCapX6XhZWzgaF9oZShkJiXgY+UnIuZkox9hZOHjpaSioNtc4+FfnlxhoCDe4N0hICVgI/FZn+ph4+ja56FpJ2FmoGPkYmMmnGQlYZqeXZ8eGhpdnFoaGxeZHBtZ25ZZ0ddUU0zRTU3TmJkNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05KSkxDUFpdXFdiXmptXFFFPUtNQEljWF1jZmhnYmJiYmRjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUlqGer6anqKWrn6S3sKmrp5qVoKOlrKWYpqy5pLCBoqmdpp6dipS8mpONoZKej3qElpaRh6uZm5uaooWOjHeanI+fkIifpZyYmpmIo7mtpJmcjYx+Ym2PipOQjZCMjZeMkJKgj5SgoJmhp36hp4etnZ+VrY+cm5yQhH+gjKishaONqZmMmn+idYGZlGuCrXZNq3iHjZyRmqemgKmrfYOhe3qnap5/kmxnmIaYt4mefm5gZFmDl4CNfGRoi3KZfXmWbF19l25fUnCDXF9reIJfWGSAfIN/lnCnqmuDo25ypXCfhaBqZ6BtXHCOfmdaYISBY1hRcHdmbnZ0bGpwX2txbmxqWWlPXVhGOUE1SEVfbDUsSURSTU49ODQ4NTk7NkA7Oz5CUD5RUkxNQkpcXV9XXV5jdmBNRDpNT05UYVxcZmZpaWJiZGJkZGJhYmBjZGNhY2prZGJkZGdkYmdlYWNol5Wcn7ifqaOmrJGhtbuqrqOZmKGipa2uoZ6wtqSpk6KhoKecmo6ZtJqQi56MlYt1gZSSjYqnlZWZnp9+k4WFrKWHm5CLmqqZm5uSiaaxp6GVmoiJgGluiIeLjo6Ji42Si5CTo4yUn5+boaR/k4GPoqCToHaclI6ngZ+lfoWnqoKleIl8hJp+onBzlIiWfJ+NeW2Gm4yZj5qomY6HnXuConN2pmaefnekX5h6fZR0om6Yt7S6dJOIg4C1qGSBxrh7cJW2jHKAmqNjc6yrYHxpnbN+bXyGgY2Ci5hxf6NscqN0n4WBpGCdmrSXc32Yn7N1dFyesoNrY3B1eHJpcFlrbXRzZ11qXmJMRT1ENlJCWnMzPVNHYEpSPTwzOTU6OjZEOztASlA/VU1PUUBFX19bWlhgYHxkSEM4TVdVV2JhWmVma2tiYmVhZGRgYWJgZGNfYGNrbmNjZGRoZGJnZmNoaJOWlKK3mKqbk5+NpLe0raygmqKdpKSmr52cs6+tlJmim6GlmpuVnqubi4iSeYuFcYGWjoqQoI+SlJ6YfZGKjqihh5eOipKklZ2bjYypqKWej5eHhH5qe4Z+fY+NgouQkImPlKGDl56fnJ+ei4l3nJihjJ9xoYqGqYeao42Upah8rYx+eqCZeqOTeIF0loiNnH2Wn4abjpiapYWiZKF8iJaQm41tnmibjm+amXuAi6d+c2l0q4Ofg3SqaJWaXZuFdoWeZ6prgLhmXKhvgZxglYxep3Z1h4h+nWeadYaTkpeOgJ9vmpFvqJpeqX95vGx/qlyOhF20aF1vcnt4bGpccWt6emRgZ1hiQlFGTzdXRFJvNUtbW19OWkRAMTUxPDs3SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5cXllkZlhmZ25tYmJlX2FhX19gYGViXmJkb3FgZGVla2VjaWhna2mVm4ips5qmiGOUm6u6sbCsnqacnKmgn6+cnrKprp+YpZyhoJmXlqCjmYaJjWqJgHJ7l4iLlpaDkZSZkHqLhJWknIqVj4aNn5OenYmQqaOgmoySioCAaYGGeH+WjHqIjo6Ij5abf5Oinp+gk5hyaJ+Jno6LcJKMgKmGl52gpJ6le7Cto6K4l3ejs6OkgImUeZ17q5l+oo6cmpaIl3GhfIWNr7V9a5qRoXl+mbWjpKuohJl8m32em390qlpdb3uWi3ieYkx/e3qFY3mXQkyfWKJpcXuObICIg5l1m3iGibGzf4Cbk6d3g55udH6VcJp0a6RelXZIZWRhdHJ/f29mYWxpd3xlZWJRX1deVVdAWkZRaEVUV11iWF5JRD1COEBBOklGOExFWEFXUltXREZiXFpgS2BtfXJFQjxVX2JaZWlWZ2htb2JmZ15hYVxdXmBoYl9lZHZsXWVnZmtkZWxpaWtpk5yAr6yYg1NeoKazubKyqZqjjJysnJ2qlaKtpaOpkKCfnZualpihnZaIh4l3hoJveZWFkZuLfJGTl4hygYmRoZtzkZCBiZqWoZyGj6qcm5WLi4p8g2yEhXGBoYt4hY2Ih5OZlnyTo5+dooithn21hI2dnHullXmpgJSajoiemnunaHdtfpl0oXNyfJ6GmXCTg659o4OlnZiAo29eqGd1omNvpWGc05B9e5l4c3RiooaRf6N0pJB2a4+zjGCCmIlzqrKovH93g21+v6aptF2cbXtwlm1/cqJxXaRnc6ZgaKZtm9SafYabcHt7mGycfXiYc26ppGdhZnpygYVsaGZlb3d4aWFjU1xnUlJiSFhKVWFYVFxma1xlUUVDS01KS0JLRThPQFFOWFNZT1NRYGZlalJkd3l3SUZFY15mWmhqVGloam9jamdgY19dXV1faGJhaWV8ZF5kZ2RrZGpsZmhsaJeaf6+rVFtKfqmvsbOvsqObmYWZqqCipY+mqaGaq4ubmZmUmZOToZiOiIZ7cH2EaH2Pg5WbgXeRjo+Jb3+Gj5OSbJeUfIqTlKWXg4+rm5SSi4aJeYN2iIBugZ+Gd4CShoiZo5d6lKKimZ+Js6Gitot5rKekrqVvqH+ZjYWAmY96pH+hmYaYcp6EpK6vipeMgI2kjZWCraCTdrW2tcmhc5SLgZ9gnpepbXqVh6GcdaKId6B+k5iLgXBNZqOScJqHc6V7eXRhg4FrfaBrcWRfnHF9c5ZoemmztbPGpnKYfXqda5ybq3aFm254eZhqmnx2mXNRRX2zX2p3bHqIZ2toY3V2cW9XX1RZaVFTaUpXTVlUVl5pbG9WZ1dNS0FKTUtIS09CUUtQZWNqbWV0cnN/eXxudYl7e1RRT2xeaVxraVJqaGlsZ2xmY2VfXV1dXmliZGlre19dZGhjamZvbWVpbGWgm4eupYNkP5Ohsqqur7WiopCAmKqio6aNpqifnqeEm5iXjpeQkJyTjoiDemp5h2WDjX+YoHl1j4mMgmmEhZGDjIWdjXqNjJenlISYqpiMkYuCiXqAfYt4cJChhnmClYeJlqCVf5SkppuVlYNmbnicbKJke3Cld5uXcGWmgJSJeqR5n5aDl3Oed4GKlZePuW6RiqJifZiglIhtcmmqa3WgbW+mYJtpi5BploeblnWigX6aYIyGjXVviGJooGWefmmbdW9jZoiBbXGiWV5aYqFsXYiLbXp9c3FkpW14omRnp2iZc4yZcKJwVYmQcKBgZqhVi15UmG5udGxzg25xaWt5dGtwUllXV2ZaVG1KWlBdSVhpaXNqWWtWUVJGVl1MWFNiVWlrX3h0e31wfHxyg3uAc3aNgIR2XlJyYmdicGdQamhobGxuaGRnX11eXWBqYmppdnRdXGNoY2pqc2xma21jnKOXpXlkc2yKpq2jqbCxpp+MgJisnp+njaOinKSjgZaZlI6akIyYkI6Ke4dxgIhoi4t8mZtzdYl+kHtlg4aUiomVmoJ8iYiYqJKBo62RhpCLgop+gICOcmmPpoR9h5ONiZigj4eTqaWciKZ4lZt+pYiWirGXnY+CrpaepHaThXipc6WPhJpupKKMkoSNg7tufaWvg4aFhpOVm598pXpyqJWglmeefm+sZJaKlpN3qG2qooGJdomDeKuRpohrkbBrdrOMqWuKhW1tn56RlF99q4uqdn1+iqSddp98g6SVnaBqm4h4rGifroy2dXi+jaSTWoOnjqthdnN1cnx1cWNrf29obVRXW1ZhYl1sTV1SXkpebW93YFtxWVxgW2d1ZW5vcmJydGB4en55cnmDc4R+gXt7jIGDgHZieGRkbnNkUmtnaG9scmpmaWFfXlxha2JsbHpvXFxiaWJsandtZ2xuYpWkqZuAf52jlqmpnaimraSZioOYrJufpoqcpp6rnoWNm5CHnJGGko2MjXSHe4iEcI2FfpmTdHSGcpGDbn+LkYeFlI99fIOHmaePgKenj4GOiYWVdoKHkm5si6mAg4uUjomcn4mMk6min45/dJOXiH6BeJOuon6BmnCPhXaOiYJ9e3KnjHF+fXqYlpuEkHl7f36HlJWTinaQmJ2gg3t9iWuMhVt5eXJ6cWlufpKKcoB1gY+UlHGHhINljH9ggYCLd3VzlHVveW5th2yDhl51Z3eOZX+AhYynmX10e5VqiYhwgXZ9h3dubmmNdHp8mHiFXGxYeY9pb3hzc3B4eHBdbIdvamhXW2BXXWZrZFdjVV9SYHB5eW1rd2dqa2t3fXJzdXNhb3ZidHuCeHV5gnZ/gICBeYuFg357bn9sZHluXlZuZ2l1a3hqaWllXGBaY2llbHF0blpbYmxkbGx5bmhsb2GOk7anpoqgoZqmo5ilnKuioYSEmK2SnqKKm6ibqpiDgpyMf5eUh46KiY1yg3yPfX6PhHuYj3RyhHGVhXt8kYuGhpCFeX6AiZuljnyooYuFj5CFlYKGjph2coSpho6SnZCJn56IjJqmnp+qg4iNlZp+foiWrKeOkaWPd26bjoF4kG59qIVxfpVxa3B9gqCNgJOOi2hsXIKLi5uano5zlYuIcXRrgnd0gVlyboeRgn5/jGldamV7hoSKgGBpeXube4KLgnWBhYFnd4qGamBvcYB1XnGJgIiOpZOEZYuNg253i4Rxho96cWhpZn2Ee5ZbXWtobnZcfHp4dm90c4NoXW6LbGxjWlpfWlltclxgYlpfXmZ0f3x2cHVka2trfH5zfHl1ZG51aG18fnZ6fHt5eoCBfm+FiYR7fXR+eXN/aVRccWlsdnB1Z2tnZF1hWGpoa2txcm5XW2VubGdzeW9oam1gi4qor6CPoqCZnp2Xnpioo6J+g5mujqCViJ2jkaaVgHyZhn2SmYqJh4eLc36BjHaFi4KEl4pyb4BymIaEfpGDhIaKgXuBhY2coZGDqKKIeI6XiZWKi5yXhIN5rYKRmJqVip6diIigqZ6hoaOKh5ObnKKZlamgpqSekZqFk4t5doyNg6d+f5KQk5SdsqablZ+QjbGSl4Oki4yUmp+JkJuCiJGKa3yOd3hlg4eRi3yJnoSHjJGJiYGFhZB3fHp0mqCJhoqdiYSTfn2KgH90bnOEgX12hYaJjqOPgoSMhoKMkIx9h4yLkYR6boWGfnqZa3NpYXSLcX57d3dwd3WCXV5vh2huYV9aXV1TaXFWZV1dYm1odnx9dG9wZWtqaYB9bnmAcmpwcW1ngXtzgoF4f31/hXptgoyGfHp4e316hHlOZHZqc25wemVrZWNiYFt0ZXBncnFtVl5sdG1oeXpxZ2lrZIyHnLielqGgl5SYmZSYpKCefICarI+fjoahnYyeln55lYR8jpqKh4SEh255gYFzgYh+iZSEbWt+epeHhIOPfoCGhIZ9iIWPnJ+UiKyghHOKkIaSkYuckX2NeqqEjpOYl4+cloeGm6SeoZmchYKSmpmYj5mmn6Scm4+Vfo6HdHqFjYOle32PkJGGmKuhnpSdkI6pjZCAnYuIk5mego+XfoaOg3B4hnJ1YH+EkIZ1jZmBg5CDh4V/hoWVbnl2dJKiioyFmoSDjHN/iXx7cXB6hoJ6doiNg5GkjoSCjoCDiomKd4aJi41+cm6Agn1vaWxuaF56gGh+fXd2d3V8eF1gcX5udWFkW11fUmduVGZcXmJraXd7f3JsbWRramiBf2x0gmxtdXB6cIZ5boeAdoKAfYV2cYKNiH57fHx/fIKLYGh7anVpaYJkamNgaVxkdWhvYnVtbFVjcXllcHp7c2VqbW2LiJ61maCinpKRlZiKmp+fn3t5n6eRnIuHppWMmJl6e42GfYmSg42DgoNufIB5c4CFfouSfWtofYKXiYGIjXx9hoWHfZCDkZ2dk4qpnYFxi4uMkoagoYmFjHynkYmQk5iUlpN4jKKen52VmH6AkJqYkouaoqCimJWQmXyLgnd/go6GoH9+jI2PfJikoqKTmpGQpoyOgZqRiZKWm36Tkn6HjoF1dIJxd2F+gY6GcouXfYmMco1/g4aHj2l4cniMmJGPf5Z+h4lygYZ7e293eomDeXiOi4GUo5KKhI96hoaHhHaDhImJfGh0foF6fHJtbGhffnNpfXZ2dX5zgWtfYXR3cXhlZFlfX1JraVZmWmBhaGp3eoJyZ2xkbGhmgIFrbn5ob3Jsf3mHe2yMgXOBgX6CdHaCjYZ/fHt/gX5/j2lyg250aWGHaGxiX3FWdG9sbmB4aG1XanR2Y3V6e3Jiam96iYyesJGkpJyOj5ePhpygm558d6WhjpiBjaOLiZqWeXyGiH+Din+Jg4F/coB7dHaChX6LkXhnY32Gl4qCiot4fYCOhHmXg5aZmI6XoZx/cIuBkZOFpZuIjYmDppWFk4yXmJKSd5Gdn6CXk5Z5fo6Xl42WmpyjnJeRk5l3jYOBdoOVjZ1+gomNjHOXo5+ilJmPj6GMioKWl4OSlZl+mI18iI2BdnF+bntkgX2LhXGIlICSgmyJhIKBioVmdm97hZGYjHySeIuHe3+Ge3pwfXeIhHiCjoeJlp+UgYKKdoiDg4J3fIOKh3hienp/dX94aG1mYn9qa3h0dXd+cn1kZGFzbnVzbmFaYV9bbWVTZFlhYWlrdnqHcmNrY21maH2CbGl1aW5waYB9gnpukIZyf4ODf3R8g4yBf356goN+fJBtdolzdW1limxqYmJ1VoRpcG5geGdsYmp2cGZ5fHpxYHJshoWPm6yWpqeejYyXh4afk5eZfniqnYuZe5iejIyZkHl8gYx+fYR8gYOBeHR6enR9gISAiYuAZF99i5SHf4SGdH1+i4B+mYaXlpmOpaOZgHOHe5OSiaaPjI6KkqCRhJKQlZeRi4GOl56akY+Qcn+NkZOInJyepZeWi5OVcYuLiWuEl4+ZeoiIj4lvl56bpJSVi4yei4WBkZx/kpKVhpmIe4qKgXpxemx1bHx/jH5uhpOElXhwg4R+f4uAZXJqe3+Wl4N+jXSPh4J4hnx0dn58hH97gYqCipKhj3iDgXSJh32AdHWCiYVxY3x2e3J+cGJwZGV8Y29wd3N5eHR1YndgcGx2bnBdXGBeXmteUV5ZY2FpbnR8imxgamVqY2h3h25nbWlrbWiBfXt4b5CIc4CDhX10gYaJe4N9eoKEfX2OcnmKeHhtbIdraF9pcmOHZ3FvZXdnbmxhemlqfXt4cGF4bYuAmJipn6OonYmKkoaKnYuVmX54r5mNl36flJGXlIh3fnyKfXyAd3iAgHB1dHxwhnyBgYp/fGFcfo+RhoCDgnJ6gIh7kJOKk5OelKedlYJ9gX2NipGjiY6KjZiajYaSmZSVjomHi5Gbko6MjG2EkI+RiJ6ZoaCWlIiVj2yGl4JlhJiOk3qJhJCKcJablKOTkomLmYyBf5CefZKOkoyZjnuKhYd0c3ZscW52fYt0b4aSj5NxdYF8goOJfWZxbXl8mZN8g4h0kImAc4d4bX58f4R7g4qGgYuTpot6hnt9ioR3fnFwgYeEZml6dXZxfGNfcWFrdF9xa3t6em1zcWZ6Xm9tc21zWFtfYGJsW1FYWWVjZ3FygIhnXWppZ2JncY1vZGpoZWlpgXp3dm+OhXSBgoN8dYKIhniFfHiEhXp/iXd+i3t7c3iCamtfcGh0gGtyb21yZ29sZXxjboB6dnFsd3eKfqKXoaehppuGi4uBj5yHk512gqyWk46HoY2WlJCAdHx3hXh5f3Nze4Zsc3B7bop2gIGHb3BbWX6RjYeAf392dYGBgaGHkouVnpmilph5in+AjIicnYqPhpKYloWJlZqQlouLi42Lm4mNj4JtiYuQkImclqGblpOEloZogqGBZYSbiZB+i4OLgXeTmZOfkpGJiJSMfn2Ol3uQjI+OmpJ8ioCCb3ZwbG1vcXyGanSEj5mLcXeAdYKJg3pnc251gJmOeoeEeZOQeXWHc2+HeoSKeImEgIaMmaGGe4N1gYp/eHhua4GEg190dXRycnlbX3FhcWtfcGt+fHFubmtud2FwcGtybVlZYmFib1hRVFtmZ2N1cIWDY11rbWRiZmuSbmBnZ19oa4F1cnNwi4B1f4OAeXaAi4B4hX94iIZ3g4V8hox/e3eKf2pxY3xjhnxucW10amhvbHZ4YHF/eXx0dXSAg36klZmsnqeWhI2Ef5eUg5CgdoyglZOGi5uNlo6LenJ4dYJwcoV0cneJbHBudm2IdoN+gG1tVVGBqpSGg3d+d3KEe4OihJSDlpSZnZObeZJ7g4ySo5mTjomVmZKEh5eajJOKiI2OhpyDj4l7couFio6HnJqfmpSTfpJ8ZoOahWaFn4eRhJGCiXGDkJeQnI+PjIuPjHd6kZB6joqMkpaMfIh8gGt2a29rbG17f2F6fpCYgnd7gniDjX16aHRsc4aVin2HhXuSjnF5g292i3mHi3iHfH+Jjpybg3t6doGKfHZwamyChHtheXFvbXN0Vl9wY3JiYG1venJpcGZndXVpcmxid2VdV2ZhYXNUUU9dZ2VeeXCJfWBdaXJiYmZmkWpfaGVbZ3B+cGxxdIp9dn2GgHV2fox5e4WBeIiDc4aFf4yMg3t6lHhmcWuDYIh9b29remBqbnV/dV90fXmHeHRzhX14oI+ZsJyljoKLf4OaiICNn4CMmpSPhYiYjo+PhHd0d3SAcXCFdHByhHBsandug259fW10c1JNgt/IktaSe3B1hXeFooSVeJaSmp2RmnyUc4WQnqGSk5CJk5yUhn+XloiMjYeQjIebfo2Ad3qMfomMiZybnJqUkniMdGWGkIVrh6GEkYiXg4ZjjJGZj5aLl4yNiopxepOIe46IipORiXmFe39tfGVyb2tte3pcgXqRkIF7foCAh497e2lzanOKjoiAhYR8lIpsfn5tf4l9ioZ7g3h/jJKYmIl8dXeDj3hybWdxgIVua3Vwamt2blRfcGVwWmBtc3lobGtjZ3lzcXFkYHhhYFZsYF93UU5MYmdjXXpxinZdXGV2YWJmZY5kYWdiWWlzc25rcneMfXR6hoJ1dn6Lc3+Gf3uJf3KJiIKQiod8fph2ZXNufGWIfm9wbIBZbG55eXNgdnp7jXdzd4p3eZ6Lmq6an5CChXeIlX59i56IhqCSj4WMmISTj4eBdXhweXFvhXBtb39zZWV5cX1teX1qaGtjpJrB3K7woHJsdoV3hqWHk2+YkpeilpyCknKGi6KXiI2VipCdloOBlpCFiY+AkImIlX2GenR/iXeHhI2bmpiYjY51iXVshIeJfImihJGJnISFXouTmIuPiY6LioSJbXuVgX2IhYmRj4Z2hX1+a31keHZrb3lzWIl7koiGen+BgYaMf3pmcml/iY2JgYJ/ipWEa4B1bYaPgI6CfIF4fY2TkJePdHJ3h4x1c3FndXqEY3VucWNrd2hTYXJobFZgb3V6YXNkYGl/cXNvW2RzYWJXblteeU5NTWVnYl53dIpuXF1leV9gZWWFYGNjX1lqc2tua3N4jH50d4SBeHd7iXGDhH1+iXt0i4mIloaLf36Xc2h1cXlsjHtudHGBV3F6dnlyZHd5h4xpd4CKcn+chpinnKOShH1xjJR4eYyehYahjY98lo2AmoiEe3N4cHRqcIJsam19dV9heXd7cXV7Z2BkfOvatcnD3IdybHSDd4udi49rmpGRnpaUgolxhIifjYSLlYqMmJR8jZOIg4iQe4+LhY6Af3V4g4RyiIGTm5aUl4WLdYZ9boOAh4aXoYKTjJ6DiWGDlI+HioaKjYeBh2l8k399g4OJjo2CcYZ+f3F3aHZzanV4bFqNfZKEhn6ChYKFi4N3YXJrh4GOiYB+fpCPfG2Ba3eEjYSQgXqAe32OkI6Uh21weYyFdGtxa3J5gmF1anBebHdhUmVzaWZTYHF3dWFwYV1ohHJ0a1hoaWNpWW5XXHZNS01mZ15ic3SGa1xcZXlfXmRne2FkX11Za29lbmp0eIp+c3SBfnt2eohzhYJ9f4h3doqGj5iBjIJ7k3Vsd3Z5eJN0bnh7fVh6hnF/b2d4d5KCZHaGhnCJloWZoZqiiod0b5KMcXePnX6LmomKfaB/hJqAgXhydG5vZHJ/aWdteHhcYHl7e3FxgGlhZ2F/1baPkaZ3bnF4fXKUko6JbJuQip2TjId7aYeLmIaBkpGGh5iOfI2NgYGJjXuOjH2IhHpzeoN6cIeAlZmOk5KAh3SChHSBfoiRm56GlY+ffohif5OHhYmFi41/f4JnfJCAfn+CjI+Qfm2DfIN1bG13dXR3dmxjjoKQgYZ/fYaAhYmAcF9xb4R7jYqAe36Qh3pwg2V5gYiFioF6hHx9kYyPkYJtbnmLfnVtbmpsfH9kaWxrWm53WVNqc2liUWNzeG1jZl5aa4VvdWNcaF9lbWBvVVxwT0lPZ2ZcaG9ygG1aXGNzYFtjbHdlZV1dWmxtY21qdHeHf3Fwf3x9dHiGeIWCfYCIdXmJgZKVfIiGdoiAb3h5e4OTb257gXdeg390gm1penSUc2dziHxxkZCDmp+boIaIdnaUf213lJh/iJGEi46afYyad312cW9samF1fWdianV6WmB4fHpscH5lY2dnV52PX3J0l77FhXhylouRgHSZjYeelI2Jc2qIj5WAe5SLgYSbjHyKhn18iIx+kod0h4V2dn2BcXWGgZ6UhpSOgoJxfoZzgnqIlpuWhZKNnYCIZn2TgoGGhIqJcoF9Z32Le3l/f4eLj31pgH2EdmZweXhzeHRsa4+Gi4KMgHqDgoSEgGtecHZ6fYuHhHuAjn9+coBod4GGiYSBd4J6fpSKjot8bWt6iHx2dG9oaH54ZV1yY1lxdFRUb3NpYk5odXlnYV5dWHCBcHVaZWNea25hcVBabFNEVGhiWmxvbnxwWltebWNaY293ZGdcXWBramNsaXN3goNxb357f3R1g3qDgnyChnZ+iYGWkHiDinSBh3J5eX6NkG9ve4FxaoJ5en5ubXx2lWtqeIR0a5OMhZ6YoJmFiG99jHZqeZmPgIOLg5aYinmPlm95c3FsamRgdHtpX2Zye1thc316ZnB6YWVkjrGyd0tjWqXb0phzfJONknqAl42GmpKNh29shZKReXmThoCEmYp8h4B5eIiKg5R/bomGcXN9e2p5hoOlkISSjIJ+bn2BdIF3hJmXk4mSj5SFiHB6koR+hIOJg26BeGiAhXhyf3+Diod8ZXx+hHZjcXOAaXpxb3aajYeEjH14eYGFe4NrXG98cn+Gg4h8hId6iHGAbW+ChY2CgnGDd3+WioyCdmxsfYR+dnplaGp/cmFaeFxacm5PWHJ0Z2BLbnd1Yl5cW1l2f3RwWGdeZ2tyYG9PWGlTP1pnX1txa2d6clxbWWxlWWRxeV9oXV5lbGhma2lxd3+Ib2x/foF1cIJ6gIF/g4B2gYWIl4pxgo1xe4V8enmElIx1a3p/bHB+dX9+b3J8e5Nwb4F/eGeRioKhmJ2Sg4Znh4RwZ3qXin+AhYKaioJ8jY1peHJsbGZfYW96bl9jcHldZGyDemBwdl9kZdXrvoszOj6Mj4BzeoeLkY94hZmOgJSPjX9ubYWMi3V8j3+FgpWJfIN4bnaGhYKVdm2HhGt0e3VleYOEp4yDjouCfG1+cnSCeISaj4qPkZKNjId/e5KIeYCFjoNsgHJpgH94bXx8gYqDd2F5hIJyZHFpf252cnWDnY2CgYeAdHZ+gHOBcFtrfHN3iIGJeoZ/fIh4eXBqhoKOgohwgHd9k4iJfXNtanWAgHV1XGlpeXFZV35UW3JmTVtzcmZcSnJ5cV5cW1pddoB2alpiW2hmb2RqTlhnUj5fZlxedmZgdXFbWVVvZFplcXlbaF5gZm1oamtocHh+jm1qgYR/eW6Ae32Bf4J7doKCjJOFcICLbnh9gHt7iJOJgGl7fmp0fHKGe3N3fn+MeniEfnxri4yDm52WjIKAbY1+bGl/j458fn+DlIJ/fYqIa3VxZ2ljW2Nnc29gYmx1YWhwiXphc3NeYmSboJBuXTZbsLZ1a4GLf5SId4iZiHWQjIp3cG2FgoZ0eYl4iX2TiHp/c2d1h318lm5vhX1odnluZXqJhaSHgIaMiX1tfXR9f3uKl4aAk5CYiYuFinyPinF8foZ8aX5ta4B7eWp6d4KHgXJfd4J+cmRyaHaDbnV8hpaTgn6DgXB4enx1f21XbX11c4mAhXaGdYGJendybId/jn+DcX17fJCGh3ltbWhsgoF0blxoZnVyUlx8T11yXU9cc3BkVkt0eWtYWllaYXKBdmJeXWFnZGlqZk9aaU5BYmVcYXdhXHVuWFhTdWJaZW9zWGpfYmhrZ21saXB3fJNsaYSKfX1wf358gX+Ce3eAgIqMhHF7h29yd4N/e4mNj4RqfntueHl2i3d9eICCh4CDfn56bYSMiJijjYWEe3aLeWtthYqSeX58gpKAgH6Lg3BycGNmXlhnX3BwYGFocWZqb4l0YXNvW2FjanZ7f7+dqKXKuXKHhnSVfnqJlYR1ko6HcnNwg3qCc3WGdIh3lIl5eXFjdoV4f5JocYN2ZnZ1Y2p8hIiegn9+jo18cX1ygnd9j46CdpWNlJCIgoh7iYpseXqAdWh7aWx/eXNpenaAg31nYHeHfWtqdGh8gWp2gY2Sln98f39yfXd8dX9iVXV7cXKHgYF7gnCGiXd3b26BgIt9fHd8enOMhIB0Z3Bna4iBcW9daGN0b0xmd01fb1ZVWnRuYlFQdXljU1hYXWJyg3RdYlxpZWVkbGVRXHFJRGViXGRyX114aFVXVnheW2ZuaVdsXmFqZ2Vvbmlwd3qTbmmIjHl+c3t+eYKBgnx2fYOIhoNwd4NzbneCgn6Ji5R/cYB8eHp6gYt1g3h/gYGChHqAdW59iYubnoh+hnt3h3xodYeNkXp/gHyKhoR3j4BncG5gZVxYZVpuc2FhYXFtbGiJbmBzaVheY22Ad6naqciHiLNzi3pxj3d9iZGCe5SLgHV0dX12f29wf26FdJSGeHVsYHmAeIeNZHGCbmd1bVttfYGQk4CAeJKRfHd6bIVzfY+Kg3KVipGPiIaGe3+GbnV3f21od2VtfHZta3d3f398YGJ4hnpodXZjfnxodYePjpd9doF3coB7fW6AWlZxfG9zgYV9f3driIZzeGpzfoKCfHl7d3pxiX96cmZyZGyLg2xzWmpgdmZJb29NXWNYV1Z5bmJQU3V3WlFWWF5hc4VwXWFjbmVkXm9jVV5zR0NnYF5naV1afGNSVl12W1tnbGJXa2BhbmZmbHBocHZ4j3Rrjo12f3d4fXeBhIF8dX2DiIiDb3F/dXF1foWBiY2Le3d/eIR8fYWHeIh8fYF9hIB7fnJ1eIuOn4yJe4p3dYN6Xn6Hmo15h4R0hoeFd4l7Ym5tXGJbW2FWanRkYVxob3Bnh3FhcWZXXGNrf3zKzoe6omtub4xuc4ZzfoaMgHuShXp5dHl0dHpqbHZjhHaSgnZwZ158gHiKh2RxgGpqcWNYbXuGnIiCgXKXk3Z9em2Gb3+IioZwlo6QiIaMhHt5f3JycH5naHJjbnhxamxyeH18eV1keYB4aXV5Z4J3aHWIjI+WfnOIa3B/gHlufV1Xb3xscn2IeoBtbomAcHZmdn5/foB0em95coV6d3BkcWBtjIFrcldrX3ldSXBsTlhWX1RVfGtiT1R2c1JSVFdeY3aGal5ha2tmY1pvYllkcUhBaV1hZ19cVnxeT1ZmcVpbamhdWGhhX3JmamhxZ3Fzdod5bpSKdX97eH55g4iAdXR/hoWOg3Bve3h3dXqGhYaMhnp8f3WLf32GhISHf35+fYZ/fHh2eXaRlJ9+jX2LbnWAemSEiJiGc5KLcIWFgnqDdWNuallgWl1eVGhzZWFZZHJyZ4FyYWtlV1pfaX94vq57oLduY3WIaXZ9c3uFiHt+jYB3eHN3bnp2ZWpvYId1joFzamJefXZ4ioJlcH1na2taVm94i6OBhX9wmZJwf3ZzgGx+gI+GcpSIjYiFiYV9eXVzcGl6YWptYW12amdra3l3endaZn19eGVyfm6FdGZ2ho2Hl4BxjGhse4N1bXViW216anJ5iXqAZXSGfW1wZ3R9dn1+cHpqeXl/d3ZvZGtgbIp9bG1VamB4VkxsbVBTUGhOWX1oYk9VdmxNUVRVX2h3hGdeYXFpZ2BXal1dbGpKRWtbY2VXWVZ6Wk5Xb2tZXWxlXFplY151ZmxlcWdzcHSBeHCZhXZ/f3h/fIaHfXZ0goiAlYNuc3l7e3NzhYaIiIR5gX12j399hYmOhIGDen6Lg3t3fHZ2mZ2YeoqDh2p2fn1thYWVgXKPgnGGgn6CgHBmbGdYXVpcW1RlcWVfWGNzdWl2cGVlY1dbW2h/cG9ygHOKZWZ6gGt2d3R1hYZ4goV6d3R2bmp6cGFoa2eGdI2EbmZeXntteYh8Z2x3ZmpkVVdzcI6mfIR7dpaPc3txenhseXmPg3WXfIiGhIeEfXVxc21odV1taWBsdWRnZ2l6b3tyWWeBdnVocIB4gnZid4WLfZaCb4xsbnyBcWZzZWBqeGZwdYh5fGF0g3Zpa3BzeW95eHJ7ZX19fXZ1bWJkYGyGfGxqVWliclRMa2xQTU9wSF58ZmFOVnVlS09TWGJseH9mXmdza2VgV2RYY3JeTExsWGRiVVRWdFdNWXdlWl9sYVxbZGVfdmdtYnBqdG9xfnV0mYF4f4B4gH6GhHp9doKDfpiFbnJ0fHt0cYWFj4KAeot2dJGAfIGVjoGFhHx+jIZ6foB2eqOminmJhoVsdX18doSDjXtvhnN6hX2Cg3VvamllVl1bW1pTY29lW1lhdHtqaG1oYGFYXlppgGlsb4BobWJpe3prdXV1cIeCeoF+d3ZuemhqeWpfZW5ogXeQhGdlWGF2aH2GeG5pb2ZmXVVYb2iPqHaBenyQjXh0bn1tcXR4jX53lHSGg4CGiXZqdHdoaW9cbWVebnNfZ2JqeGh7bVttg3J0am+Bfnp4YneFhXmRhnSJc3B6f3JjcWhbbXVkb3GGendhcn9wZ2l3c3Frd3ZzdWKCeXx1dG9jYmFsfHxra1VpYmdUTG5pUEhTa0ZieWZiTVRyXkpOVVpmbXh7Zl9ucmpkXVZhVm9vWEtUaVhnXlhOVmxUS116YFxfbF1dW2JmYHpobGFvb3Zub3d1epd9d4CBeYCAh4Z6eXqDfYGThHFzdH56dnSFiJB+gX2RbHOVgXyDn4V/h32Bf4aCgIp7doSrn396iIiFbHGCe3aBgIJ1b4hufYB0ioBqcG5lZFhfWlpaVWJrZ1xaX3WCaV5tbFxhV1tca4FlcnR9amtebXh3aXZ4c2+HfH5+enZybHpoaXdnXWRzaHp3koBjYlRjbmWBhHV2ZmhpYVdWWWhkkKdufneAi415cG57ZXdteYp6do5xhH5/gIduZHd0ZWhpXWxiXnBvW2hfbHVlemhddIBucmtxe392dmN1hox8iYiBgHlzdn50YXBsWHBxYW5vgnpzY3GAbGFseW5paHl4c3BkhHN4eHNvY2BjbHN9aWtUaF5fVUx1ZFFIVmJIY3dmYkxUcVlLTVhZaWx3e2VlbnJnY1pYXll4Z1VKXWRYaVlZSVdmUEljeVteX21bXl1iZF5/aWpgb3R5bW9udoOXeXKBgH1/iYyGfnZ2hniGjH1zdXWCeXp6goyOfX+FiWp0l4F7i51+foZ6gHt+fIaJc3GPrYx7fIePfmZxiXt0fn13c3CGbHx+bZB6Y3BwYmVeZVZaWVdkZmxgXV10hWhYcG1bXlhaXGx7Y3F3dm5jXG91dWl2d3Jvhnl/gXp3bm90ZWh0ZVtndWZ2dpF5X11SZWVpgYFzfGFiaVxUWF5jZJCkaHh0goWQd2xteGZ2bHuDeXSHcoF5fXmAaWZ3bWFnYV9qYF51a1lmXW9vYnplW3d8a25vcHh5dHVlc4STgImEiXt3cHN9cmF4Y1lubmBub396cmVxgGRebXVoY2Z3enJsbYFzcXtxcGFdZGxufGVpU2dZWlVOemBSS1pZSGN1ZGFKVW5VS01aV2ptc3tkbG10Y2FZWlxieF1UTGReWWpUV0hZYU5Ia3dZX2FuXFxfYmNchWloYm54em1vanaBkHltgn6AgZKIhIF3dYl0i4Z0cnZ2gXh9fX6Mj4F/k35weJaDfZmTeYCBd3l+f3OIhHNwmaF7e3+JlXlldYl6c3l3bHVwf2x5fHCSc15wb2FoYmxUW1pXaWRuZlxccollU3JuW1pZV2BsdmNqdWtrX1tvdXJudXV1a4d9f4F8d29ubGRpcGNba3JkdHaOc1xWU2NfcH59cIBcYWNeU1phXGSSnmVycYWDkHNraXhrbm55eXpxgHZ/c3t6e2RmdmheYlthaFxfd2hXYl9waGF3YVt8dmpqcm54dHR1aXGCloSIgIZ2dGtwfGxmd1dbaWxhb3B+d3Nlb31bYG9wYl5pcH1ranJ9cG92aW5fWmRrbHphZlNmVVhTUXhdU1BZUkhkdGJhR1ZsUUlQWlZsbGx8ZW1vcmFcWlhabXFYU1FnV1dqVFVGWl1PSXN2WWBjbmNZYWFhXoxqY2Vtenlsb2l2eYZ7a4N9gISafIKEeX2Ibo+GcW52en10goJ9i4+Dg5d0eIKUhYGfiXWBgIFzf4Fwh4N2b6KXc3uGjId7ZneLb258cGd5cntsc3ZzjWtedG9iZ2ZrU15cVmhibW1bXHGMZE5vbV1WWFVmaXNoY3VlZV5bcHdvcXZ2emyIfX99iHePc2Nka29hXG5tY3N4h2taVFZhYnZ7e2+EXGNeY1NaYFpjlpRjbnCChYlyaWZ4bWRydXF6a3l0dW97f3ZfZ3NkW15XYmRZYnVlVWBhbWRhcV1cfm9oaXNxdHF1d2xthZWDin2GcnNnb3xvcW9SWmVpZG9xfnRyYmx1VWJxalpebmR7ZGt0e3BxcWhsXlhjaWp4XmVTZFVXUVZvWFJXVFBIZXNgYkZYa09JWFRXbmllfGlseWtiV11WXHVlVFNYaVJaZ1VUSVtaUE55d1tfZW1pWmJhX16PbmJna3l2bm9pdnZ/fmyDgH2GmHt/h4GKf2uTiHJnc4B7dYCDfomOf4yTc32KkYWHn4Z7f4aMc4CGc32CdW6kjHOCjYx3eG56jWBlfXFnenR5bW1xd4NnZHxtY2dnaVRgX1VnYG1wXF5ujmhNaWxgVVZTb2dza2Z4ZWZeWnJ2bnN8eXRuiXt/d5x6eWthZWxtXmBvamVxeX5nWlVXX2t2enlugl5hXWhWWWBYZJyIYmtwgYZ8dmtpdWtbdXBqeWl1cm5vfIFzWWtuYFleVmJkWGVxY1RfYmlhYmxaYH5rZmx0dW9teHdsaIaNgIp8iG5xZnB7bHFsYVhfZ2ZtcX9ycl5pbFNlcGRVYm1heGFvdHp0aW5qaV5XYGZodVxkVWFWVE9ZZ1NPXE9QSWVwXWNHWmpOSmBMWW1lYHhpb4BlYFVfVV52XFVTYWhPXmNVVEtdWlFadnZdX2ZtaFhjYVtejnFjaGp4cXNtZ3Z0eYJzgoN6iI9/fIqIjnpukIp0bHOBdH9/iIWHkoSVj3p9jI+IkZuEgHuMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56enx+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo2NjY2NjY2NjY2NjY6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx9fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMk5OTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjY2NjY2Njo+NjI2NjY6Pj46Ojo6OjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHx9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPi4xMTEwL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhXdlZ2ZmZmhcQ0RERERDR2RoZ2dnZ2drb25tbm5xSisuLi4uK0iFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI4uGh0dHRwaaIWCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgoKDcl1fX19fYVI0NTU1NTQ5XGBfX19fX2VnZ2dnZ2o8GBwcHBwYO4OBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmIiIiIiIeNkJCQkJCQjIeHh4eHh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaIiYiJiYmJioqKioqKiYWDg4ODg4OFioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p8fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkZKRiYeOipCSk5GLkI2OjoWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjY2NjY6Ojo6OjY2NjY2Njo6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQi4WJiYmOiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3d4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCIhYeNiZCJjJCPj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfXt3dnd7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkIiFiIyJj4eOj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fX19fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4SKjIiOh4+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin99d3h6e3p6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2Pio6Ni42Mj4+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgICAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgHt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJh4KIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGiouHh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/fn9/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlJOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTk5KSkpKTk5OTk5SVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGRkpOSk5OTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGSkZGSkpOIhZORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj4+Pj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCSgoKSkJGRjnWGkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPkJCQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQj5CIcISQj5B8dIiQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Oj4xzb4qPinJ4h4+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX1+fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjXdte4+Cc3iGjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH5+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWFhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHc25vhHt1doCFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxZWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d3RiXmRfYWtxZmhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGRUVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoYl1qbF1lZmdlY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGRkhJSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpaandsYm5yamJZWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVtrcmthbXRyZlFRU1BQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1OXWNva1hpc3VwU01PUFBQT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0ZCRkhVYmdsb3BvbWxaTExOTU5PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVDRkdITVpnaGdybm5oZmRgXl5YTEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7PklaXVpcZWxuam9tbWxraWhrZFNHRUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7Oz1LW2ltbm9qb21ramxtZlFHRURHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHN0dHNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozo9SGNvc21ubGtsaFVDPkNGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN0cnF0eHh5fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk5PUpgc3NwaFQ/Ojs9QEFAPTs7Pjw9PEBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5ent9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT48OkJsfWpAOjs+PT4/QEBAPz9BP0BAQUBAQD0/Pz08Ojs9PTw/QEBCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9AO1tuQD5ERT9AQURfZDs9PTs6PT5BQT8/QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pLSFZwcHFzc3R0dXl6e3x8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo6bXdIODs6PT5BO0hkPTw9PDg6O0A/PTw9PDxAPT08PD47PTw9PkFAQkFAQEBCRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJYHBwcnJydHV2eXt9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUj08PUlMRkV1dk43ODg6Oz4/V2pBOzw8Ojo7Pj4+PT03OT89PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3J6Sjtcf4N/enx3Vzw9Pz09PkVodEw6PT4/PT0+TlNVUkxDQEA/PkE9Oz9CQEJDQkBCQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFRT9BR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFHcnprYoOEg4KDgH1ePkBDQEA9SnN7WTo9QUVCQUdmaGxoYV9PQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEVudH2CgoGDfn2Edk1BQ0VAPz5Ze4BdP0NFSUlJV2pqaGloZmdPREdFRUVERUNBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx7fX99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVyQ0RFRENXdYaHh35YR0hKTU1TbXdwaW1vcWVLSklIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ1dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIlsQUFWdIeJh4eHiINXSExOTVRyeHhybm9vbE1HSUdGSEZIRUNEREZFRERISENDQ0ZJS0tMTExMTExJSktKSkhJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiIRWbIWHhoaGh4iIh3xQTE1KW3d6gnFubW1sS0NDQkNGRkVCQD4+QEFCQEJEPz4/REZIREZHSUtJSkhISEdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wcnJ0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMS0pUgYOEhIKChYaGhIKFhYSEhoaGh4eGinVKSkdbZ2hqZmlzenFDPTs6PEFBQD48OTk4PDw8Oz47ODs/QUJAQUNDQkBBQUREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgICAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpJSWWFhISEf4GCg4KDg4SFhYaHiIiIiImMj2dFVmRqbGFlbHiAZTc5NjQ3OTs8Ojg1Njc3ODk3ODc1ODg7Ozs9QDs5OTk9PD47PD1BQ0VISk1MTEdJR09SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaIaEhIF+gYODg4KDhIaJioyMi4uJiouNimVib3BsaGtxbXhRMzg3MzU2ODo4NzY1NjU2NzY3Njc6Njc4ODk6NzU3ODk3OTg2Njo8QEdGSUdJRkVGT1NSU1NST1BQUlRlcHFzdHR2eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDY3ODg9Oj1FQ0JlhYOBgIKDg4ODg4aJi4qJiYqKioqLiouLiHF1dnBwdXBqbks0ODg1NTc2OTk3NzY3NjU6OTo6Ojs3OTg5ODc2Njk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXZ5e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgICAgICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhIWGiYqKiIeHiIiKioyLiouOiHZ4d3Z4cm1tSjg7PDk6Ozk6Ozo6OTs6OT09PT47Ozw8Oj47OTs7PDs8Ozk6PDg6Ojo6OTk5PD88PEFCRElKTUtJS0xXb3JzdXN2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuKjI2NgnV4e3hycWpIQUFCPkBDQUA+PT4+QD8/P0A/QD09P0I+QEE/QT89QEBAPj9BPD48Ozo7Ojk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PDw6Ojs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLi4uMjYyMf3h7enprV0xISEhFRkhHRUNBQEJFQ0NBQkNCP0BESEVDRUNFREFGREZERUZEQEI+PUA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDo3Oj46PDs+Pz8/PUFAQ0RGV4SCg4SFhoaGiImJiIeGhoaHiYmKi4yNjIyMjIyMfnl6d1lOU01LS0lKSkpJRURER0hGRERFRkRCSElLR0hHRkhHRUtJS0lKS0pDRUNDREJBQUNCRENDRERDQT07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtBQkJBOTg8Pjs8Oz5AP0E+QkJHR0lZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2NjY2MjI6Jenp1XVFUT0xOS0pLSEtHREdJSUlFRklGRkVMTE1JSkdHSElKTk1PTExOS0dGR0dFRUNGRUZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4Nzw7Oz06PkA+P0BDRklJUF+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjY2MjIyMjY2EeXp0XlFQTk5MSklGSklFS0lHS0pJSkdHR0tMTkxMSEhJSk1RTk9OTE9LSUdJSkhJRElISEZGR0dJR0NCQUNUbnB1d3d5enh5ent8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDk6PDg9Pjs9QT4/QURISkxVcYOEhYSEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIyMjI12dnhtVFNQTUxJR0RIS0hNTEdLT0xLSkpMTUxPUE5ISUtMT1FRUFFPT0pISkpMSktGR0hHRkZJRkVFQkFCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uKjIyMjIyMjn9kZ21ZWFVRT01MRUZHTVBPUFdVUVBPUVNSTVNUT01TTFBTVVZSU1FQTEpNTU1LTkhHSkZFSEpFREVFQkVDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39URkZHR0dHSEY+QEI9Pz09QkBCQkdWTkZOUFBUWHuGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyNj4yMjG9hY29kSFVTU1JLOztTVFJgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTVJRUFBRTExLSEhKSEVGSUlJSElpcnZ5eHl5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+BgICAf39/gIB/f39+flNISklIR0dGRT8/QUFFQUNHRURFTFhSTVRVVlhafIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH5hiouLiHNialk+W1taVVI/QFdWWVxkYFZZYnJdXVddWlZFUVlaW1lfVFlnUlZWWFVUVlRPT01LTEpJSUxNS09NU290dnh5eHh6enp7enp8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImLjH10c1teXl1UVVNXV1ZbW3WDWVV9kGFcWF1fV0lWXV1bW19ZSFlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBRT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiYqBboaJiIeEioBqXV1eW1ZXVVhUU1hWY5aAUmVyWFpXX2hQYGZbW1hcZ2FHT1poZ11bXF1dV1JPU1BQUlZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE5NS0pFQz9AO1BQWlpbU1NRUFJSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn6BfWBVWVtWVFdUUlJNUE1MZnpbXVRZVVZdWkxUWlVTVF5aWFdXV3pqWFtcXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fHx9fn5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a39+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJVY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eIenBzWk5PUVFNT0xKS0VGSUZDP1RkVX9SUVFOS1FUUU1PWVJNTlFTVlVNUVNSUE9NTEhDSUhSVFVaXGxxdXV1c3N3enp7e3x9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUUxJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVGFze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ2YWBQSEJFRUREREFFUUNFQUM+Q0lHVkBITkxHXWlQSEZORkRFRklHSEJESEdJS0dEQkFEQE9RTVNkcnR2dXN0dXp8e3t7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNQVVlTVVFRVFJPVl9rbHJ2e3t4eXVybnN0c3l4fX+DgIODgoCCgIOBgmxPSUJDPTw+QEFAQD9rUUtgRUZISUVCP0dMTkdNUlVJQkU/Pjw9PD09Pz0/QUNDQD89PUI+Sk5HVW50dHVzdHZ4enx7fHx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXkpKUFBOS0xRUlFUVVVXUVFXVVBYW2FdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZUVCQkM+O0NDQkJEQlxdT3tOT09OS0xNT09RTEtNV01IR0BCPDo3NzU5OT07Ozs4Ojg6PzxCSD9cc3R1dnV2d3l8fHx9fHx9fX59fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BfXVpJSFBSUU9NUFFOUVJUVlhTU1lUT1laXFdZXV5eX2VfXV5xdmteYGdrd29vbGpvbm5sZWJZSEdISENCR0lGRkZETVJPYVdTV1FQU1NSVVtPT1FWUE1JQ0Y/Ojk2NTg3OTc5OjM2NTc5NTxDPmVzc3Z3d3l5e319fHx7fH1+fn17fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BWV15aWE1LVFRTUFFVT0xSU1RXWFRUWVJNWFlaVlhYVlhZXVdXWGhza11WYXRrYWFfXmRhX15ZVVFOT09NSUhKTEpJRkNRUFNaV1RUTlFTWVNcZVVPU1RSTktJSEM/QTk5OTg5Nzg4NTc1Nzg1OTpHbnF0d3h6e3t8fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVlVVVVdQU1RXVFVSXW5fUk5aYFtXWTtEVlhUW2ZKTFBTUk9OTU5OTkxKRlFQVVlTVE9KT09VU1RcVlJVU1JPTUxJSEhGPz88Ojc4NzY1OTk2NzY3NVdwcHN3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF1SVFpXWFVUV1RSWFhZWVlTVU9KR09QT09NUkpPUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBTTUlNS09SUFJSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9xdHd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmhpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSUdFSExISkhGTE1QTUcvRV9SPjM/PmpvYVNSUUBHVFFQUVBRTlFPUVBMSkxMT1BOTlBRUU5QT0pMTU1LR0VFQ0E7PTw8Oj1HNjY3N0RtcHR2eXt7fXx9fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRUZISk1MRUdDT1JDOEVOU11nVFFTQUdVUE9RUVBNTU9NS0xLTE5PT1FMT09NSExLSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydHh7e3t9e3x7eXx6e35+fHt1dHVydnZ6e3h6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05MUVNMVFVUV1dVTExLSTw5ODc7PkA+PD1BQEI9PkVIRkNFRklHSkpARkFBQEZIRUpPSFFSYlxSUFJPU09PUExNT01MTU1OT05bV0tNUU9HSUhDSUpMTEtGRkZFP0JDPjxCRz9CP0FkcHN2enp7e3x7enp3e3d5fn58e3FzdHByc3dzeHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENEPTk3Nzk/Qj47P0JAQD5AREpFQ0dHSUdJRUJCPz49Q0JBR0lETU9iZVFNT05XS0xOS0xOTU1MTE9OU2ROSkxSSUlJRUFISkxNTkpHSUdCQUJAP0VGRUhES25vdnl5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR01NSk1QTVBPSEpEP0E9OTg5Oj9CPzxBQkFBREVHSkZESEhHR0hDRD9CPz9AQT5DRUNLTlJUTEpJTVRGSUlKTEpLTElKTU1PUFJQSkdDTEdDQkpJTE1PTklKSUdDQ0NESEpNTElZcm13eXh6e3p5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9tcG92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFIS0RHSElHSktJSktERkI9Pj06OTo7QEI/PUFCQ0NHRklLSkVJSUZHR0NDO0FAQj5AQENFQ0lNUEhIS0dIS0RISkxNSEpMSElKTEtNXVJISERORkFDSkpNTFBNS0xKS0ZHR0pOTlFOTGJtaXZ2d3p5e3p9cm1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLQ0ZGR0VGRkdFR0JDQD48PTk6OjtAQ0A+QUNFRUlFSUpMRklJR0ZGQ0I7QUJDPkBDRENER0xOSEtOSERIRUlMTk1HSUxHRkdJSUxOS0lHRU5IQkZNS01MT01NTk1LSUhJT1JSU05SZmZmcm9zeHZ7enxsaGpuZWtxbHNwZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lERkZFQ0NCRUBEQj4/Pjo7Oz06PD5DQT5BQ0RGSkZJSExIR0dHRkVDQD1EREI+QUNDQ0VHSUlHTVFKRkZHS05PS0ZISUZFREVJSkhLSUZIT0tDSUxLT01PTk9PTkpKSUxSVVVTT1dkYGBtZ3Byb3J5emdlaGhkaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMSEVFSENCQUJEPUJBPkE9Ojo9Pzo+PUBCPkBBREdKRklGSUhGRkdEQ0JBQUZGQ0JCQ0RFRUdHSEZMUUxJT0pKTUxJR0hFR0VEQ0lJSEtKR0tSTUJOTkxPTk9PTU5PS0tLT1VXVlVTWF9eXGlhbmpuaHJzYmRmZWRoaGZuamZtbWhra21yaXF2dHNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd3dnR3dWpzdW51dHNxcmtrck1HR0ZIQkJBREU8QUBAQzw4Ojw+OT88P0JAQEBERkhFSEZGSEdGRkRDRUNESUVDRkVCRUdFRkdHRUlNS0lRTUpLSEhJRUZISEVDSUpJS0xLUFNORFFST1BRTk9NTlBNTE1TV1ZYWFVYXVpdZGBpY2ppZ2tfZGVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW55TUhHSEhCQkJGRTw/QkJEPDc7PT46PjpAQj4/P0JFRkRHREVIRURGQ0RGRUZKRUVJR0NHSEZIR0VDRktKSE5LTEtISkxGSUlLSEVLS0xNTk9SVE9IU1RSUFJPUU1OUU5NUFdaVlpZVlpdWVhhYGFgXmhlY2BkZWhnamhoaWZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXd1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSEhISURCQ0hFPEBFQkU9ODk+Pj08PEFCPD8+QUFGQ0ZDRElEREVFRkdHR0lGR0tIREhIR0lHRkRIS0lHS0lNS0pLTEhMS0xLSk5LT05PUlVWT0tVVlNQU1FSTE9RUE9UWVpZXFpZW11eXWBjXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdExJS0lLRkJFR0U8QEdDREA6PD5APz4/QkI8QD5CQUZDRUVFSUZGRUdGR0hGSEhJS0pGSkhIS0hGRkxJSEdKR0xMTUxMSU1LTU1NUExQUFFVVldPS1ZVVFJTUVJMT1JSUVZaWl1eW1xeXl5gYGFkXWNgZWZgZWhqZHNzZmpnZmtvcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SktMSkxHQ0VERTxARkREQzs/P0FAQEBDQT9CP0FDSENGRkdJRkpGR0RJSEdJSEpMSEhKSklMSkZKS0hJS0pHS0tNTUpKTUxOTk5QS09QUlVYVk1NVFVUUlFRUE1OVFNSV1tdXl9dXWBfYGFhYGFjZWJkaGJkaWpndotsamlnbG9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ1bndLTExMTUdEQ0FFPD9FRUVDPUFBQ0JCQ0RBQ0VBQUVHQ0hISUhHSkdDR0lHSEpGSU1ISUpNS05MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlJQV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2NoaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAREJFRERGQkNFR0NDSUZDSUpKSUlLR0RLSkdJSklJTEhKSk5MT0tJTEhLTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BhdnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVF93dmlqZ2hmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQj9AQj89REVGRENEQ0VFREZCRkZHREVLRkZKTUxLTExHR01JR0pLSEtLSUtLTkxNTExMSUxNTFtzYmRwXmxtVU1OZnNdZmZxbG50Z3BpX2FZbm5icHBia2pqZm9xdGV0bm9cb3VncE1KcXl2a2Fga2VlbXhsa3ZsbXBzcnBycXBxcnFycnJ0cm1tc25ub3BzdXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElIR0VEP0FCQD5DRkdDRkNGRUZFRENISEhERUtIR0xOTkxNTUZKTkhKS0pJTEtKSktMTU5OTU1KTU1OW3Jvb25wcGxrTVBRbFdNaWJ0cnBhbW51XFlsUFxubVpxbWtvbXh4dHNpcF1fcmtxalV1eXhvY15rZmJncG9qam5vcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0dFRUVCQkI+QEBGSENHRElGRUVCRklISEVITEtHTU1PTE1OR0xNSUxLSUpNSUtKSkpOUE9OTExOTkxcaGR1XWxxV2xOUFFtVFlrXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdHhrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SExGSURFRUNBQj1CQUNGREhHTEhFQ0NIS0lIRkpMTEZOTExTUkxHTExITkpISE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5Zcmtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXnRjd3hyam56aGFhY2ZiYmltdHVwc3V2c3FwcHFvcXR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnNzdnNIS0hJQkVERUFBPkREQkdESElNSUZDRkpMSkdGS05MRk9KS1dRS0dLSkpOSkhKTElLSkhIS01NTU1JS0tLU2tjW2leX2ljcnJaX1lqbl9lZVVrX2NbYWFRYGxoXWpcbmlpZFtvZWRwXVpca1ttcWNwc2xkZ2NjZ2Bgam1xcG50eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVudnFxdXR3ckdHRklERURGQUBCRkVER0JISkxIRkRHS0xJRUZKT0xJUElMWlBKRUhIS01JSEpKS0tJSElGS0tLTEdIS0tMTU1MSktNTlRbXFRQVExQT05PT1ZRT05RTk9RSkpPUFFkcWlUWVZcW1xWWVtdWF1cXGNmYWFlYmNmX19ma25pbXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NER0VFQUVDQERIREZHQ0lLTEhGQ0dLTElFR0lQS0xPS0xXTElFRUhJSkhJS0lNSkhGR0dJR0hJRUZMSUpMT01KUFxXXlBcW2BeTVhZU1xcYl5NWFpNWGFSS1lhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGFhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHJ4cnhzcXJ1cnRPQkNETE1CRERCRUlFR0dGS0pLSEVFSUpLRkVISFBLTU1KTVJJR0VASEZLSUtMSkxKSEZESUZERkdFRkpIQ0pNTExVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOXlxeU1peY15aXWBjYFlfY1tgXltUWFdZXl1jYmNhY2VoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoaGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFSSkpNSUVDQkNHSEZIR0lLSkpJREZLS0tFRklKTktOS0hMTkdHRT5HR0tJS0xKS0tJR0RJRENERUFGSkVBS0xKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFZVVVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR4eXl5eX9+fXl1eXZ2cm56d3Z4WVFLRkRHRUJFR0hGR0hIRkdJR0hHSEtJTERES0tOTUxLSEpKSElGP0dHTktLS01LS0tJRkdDREBEQUhJQ0BKS0hQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUE9cX2FjY2NjYl1kY2JkY2ZYUVZUUVpXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGREZLSkZGRkhHR0lHRkZJTEpORkRLS01OSkxJS0pISEZCSEhRTUxLT01KS0lHR0VEP0VDSUlDQ0hHRVRdWV5YX1lfW11VWFhQXV1RS0pWXlheW11VWWFSUV9fYmJgYGJiYGNiYWRkYlhPUVBRWlJbXV1dXV5fX2NoZ2xqbm5we3t8fnuAgoOEhYSFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBSEZER01SSENRSkVHSEhFRktKTVBFRklKS05MTElLS0lJR0RIS1FPTU1QTExLS0hJQ0RBRURJR0NDSEZEV1VFXFRdU1ZfWE9UVU5aWk1JSlRgYVtfWF5eYV1OWGFcYGBfYmNiXWFiV19fVFBPT09XUVxbW1xcXl9hZmZlbGVvb3d8e4B7fX+AhISEhISEhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+Sk5GREZGSERJUmJQQ1ZeSUdHSERGTUpQUEVJSUpLTkxLSkxLSUpHRUpOUVFOT09NTkxNSEtBREJDREdEQ0NGR0JNSEJLS09PTkxGTUZHSUpIR0xLTU9QSUxPUE9TUEtPU1JVWllXWVhYZFdPU1RQUE5NTlRSWlhYWl1cYGBkZWNnY2tscHNyeXl/e3p/hISEhYSEhISChIB+e4GDgX17hYSGhoaHh4WFhYSEhIKBgH1LSUVFSEZHREtNXUxHR1hMR0hKSEdNTFFQSEtLS0tOTVVOT0pKS0dHS1BTU05QT05PTk5HS0ZgRURfTEVnZEZOXEleW3JtT01VbVlMRFBgVWtXZ0pdV1VeRExRVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalJWVVRbXFtgX2FiYWJfZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUdGSEVFS09TSUpGYFNHSk9KSU9NUlBMTUxMT1JVUk9PSUtOR0hNUVtZT1BQTk9PT0lKUX9RSXxZWXJ0WVFtSHFub2FWUHFxc1BDa3NtcXNwU29fWm5YXVZcWFVraFVdVmNaYFlbX1ZWWH9qdHV1Xl92XldhW1tmW15gYWFhXV9hZ21wbF9wd3R4gYGCg4OCfn1/gHZ4emx2fnR4fYB8foCBgoR8gIN6f4F/fnd3TkpFSE1OQkRMTEZJS0VRVUxLTklLUlhXUU5OT01RVE5PUU9LS05HTU9TW1pUUVJPUFBQSkhaeF1UeGVoWlNVUnZndGxwYm5malFyT013bWpycHNycXJvb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29ycnt8b354boByX2BgYmFaYF9na25rYmxmZ2x3foGAgn17eHeAdHZ6aXJ+bnN8fnd4e36Ag3h8gHV8f3x8c3NOTEdgXUdBRUxNR0pKR0lPTk1NSk5WXllVTFFTTlhaTVNTUk1LT0hRUlRZV1dQVFBQUFFLSGd4bGN4cm1bTE5WeXB1bXVib3ZQZWVKZnZxbXdvgGpmeHdpV3JRaHptaWp6en1seHp/b2hvWXZ2anZ1cIBfcmZ9aWx4fG9eX19iYVpdYmRnaWlkZ2JjZGxscHBzdHNzc3pxcnhibHVncnl7cnJ2eX6Bc3V6bnx9eXhybk5LU3VOQ0JGUFBISktJS1BOTk9NUFpgWldLVFdQYV5SVlFZUkxQSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYVduTHFwXkZoeVd2VEtoeX14YHl7c25hXW1vY1JncXVubXlwd2x2dHRybG5ddH56a215fGt0bHxrcHZ1eF5fX2JeXF9kZGlnZ2VlXmFiaWlpamtub2txb21qcGFjZmNvd3hvbXBzeX9ucXBre3p0cm9tTExbVkhHRUdSUElMTUpLUFFQUFBQV1xZVU1VWVVlWFJSWV1TTE5JVFRXV1lXT1NOTk5RSVJtSGl3S2BkdndWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9acHp7XmB6c2Nyb3hxaGR9aXJ8XlRMbF92dWtpdXt6bX54a3xwXF5eYlteYWRkZmVlZWJaY2Npa2tyc3J2Z2xpaGRnYWFrYWdzcmxnbW1yfWttaGt7dG1ta21PSEtLSEpISFFQTE5PTEtSUlJPU1JXUlZUUFdaVlZUVFRhX1BOTUpUU1RRVlZOTkxNT1BLSFFOUFVMS0xTVFNTVFBWVVFRTlFRWFlSTlBVVFhYWFtbVVJTV1tXWFdaT1NVV1hYUl5ZV15XVVBZUldXV1dYXlpncl5bW1lcXV9jWl9jY2RmZGNjYlpjYmdmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdnanVqaGdpbFBJS0xMTUtKU1FNUVFPTFZVVFBUVVhVWlVRWl1VVVRXVVlXT09LTVZUUU5VU05PTUxRUExKUlFLUU1LTFBSVVNRUlNTSUhMTk9RUlFQUVRWUlhXXFdTUlBSVFVVU1pRTlNSWFZUWVdVWlZUUlZUVFVXWFZcWV1gXVtaWlxcX2NbXWJjZGZkZGRhWWBhY2FiaGhpbWJhZF5fY1xaZFxhbWFeZmVmbXNkaWdqa2VkY2ZoUEpLTE9PTE1TUE5TUVBNWFdVVFVXV1dZVVNcYFZXVllVWFJQUEpOV1NQTlVQTlFOTFNQTU9VU05STk1PUVVRVVFSVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXVlZZW1RQVFVYVVVaVlhaVVNSWFZVV1tYWV5cVVheXF5cW11gYF1bYmJjZ2ZlZGJYX2FiXmBnZGZlYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmdmZGBiY2JPTE1MUVFMT1RPT1NRT1FbWVdXWFpZWFlWXWpkVlhZWldWU1NPSk5WVFBPVFBQUE1NUlJQUlhUUVFPTVBUVk9YUlRVVU9OTVFUVVVUVFJUV1ZbXVxaVlZRUVZYVltbV1FUVlZWVllUWFhWU1NZV1ZaXllcXl5VXlxeYFxbX19fXlpiYmRoZ2RkYlhhYGJeXmZjY2BiXVxcXFxZWltYW2FcX11cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFPVVxaWldbW1xZWltkcW1oZF9bWFVVV1FMTVZTTU5ST1FST0xQU1JVWlVTUFBNUVhXUldTU1NYTU9PUVRYVlVVU1VZWFteXVtbVlFOVVZVW1tXUlNXVldYVlRZW1VUU1pYV1xeWl5fX1RhXGBhXWBiX1xgXWNgY2doZGZgWWNgYV9fZWRfYGJbWlxbXFpaWVhXXFpcW2BeX1teXmFgX2JcWWBbUU5PTlZRUFRRT1RUU1BXXFxcWF5cXlZbXmpxd3mAY1xbVVVXUE1PVlNOUVFPUlRSTFJUVFlbV1VPUk9TWFdUU1VSUlpPUFJSVltWV1dTVlpYXF1bW11WUk1UVVVbXFZSVVZWWFlTVVpcVVNTXVhaXV5cYGBfVmFbY2JdYWReXGJhYl5jZmlkZl1bZGBhYGBjZV9iXllaXltcWllYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVFJRV1JUUFteXl1bYFxgVVxdaGpyfXNsZ1tUV1dRTlJaU1JRVFJUVVRLUldWW1laU09TUVZWVlRPV1JSWlJUVFRYXVdYWVNYXVheXVlaXVRUTlVWV15bWFJVVVlZWVVXWlxWVFdeWl1dYF1iYl1ZX1tlYV9kZF5eY2NhXWVmaWRmXV1kYWBhYWJkYGJeWFpfWlxbWFhYV1dbWVtgXFtbXFtYWVteVl5ZXVFPT1JaUFpUVVZWU1RUXl5gXl5iXGBVXV5ia3l0bH1rWlRZVFBQU1xUVVRVVFZZV0xSW1ddW11ST1VTWFdXVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUlZRWVhZX1taVFVWWllaV1haXFdVW15dXmBhX2NjXF5dXWVhYWZkXl5kY2BcZ2RoZWRhX2RhYGFgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09QVllRXVVWWVdXVVhfX2FhYGNdX1VdXmJlZXWBemhXWFlTVVNWW1hXV1ZWV11YT1VdWl5dXFRSWFNXV1VTVFhSU1ZUWFdYXV5YXVtWXV9YX19YXFZRWFRZWlphWlxWV1hbWltZWVpbWVdeX2BfY2JhZGRcYlxgZmFkZmReX2RiYVtmY2hlY2ZgZl9fYWFhYWBfXlZVXVlbXFtZW1lYXVpbW1hYWVtZWlpdX11UWV1VTlNZVlNcVFZXWVZWXGBhYmNgY15fVltgZGFfenVvaFlaWVRXVFdbWlpbWVhZYFdQVV5cYGBcVFRYUFVXVlRWV1JTVVdaWltfXlpfXFZfX1ldXlldVVJYV1lZXWJaXldYW1xbXFtbWlxaWl9fYGBkYmNkZGJkWmFlYmZmZV5hYmBjXWJjaWRjZ19nXmFhY2FhYF5fWFRbWlpbW1hbWFhcW1pbWFZZWFdcW1tgXVZdXVNPVllWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheXFxaVldYWVxcXV9bWVtiVlVYXl1hY1xSVllQV1dXV1dWU1VUWFxcXmBgXWBcV2FeW15bWl5XVVhYW1pfYFxfWVlcXF1eX1xbXVlbYGFeYGRjZGVlZWJYY2VkaGdkXmNgYGVjXGVpZGVpX2ZdY2JjYWFgX19bWFlaWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWVhbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNZWlhdYGNkX1JYWVBXV1hZWVdWV1ZcXV5gYWBfYl5ZYV1dXllcXllYVVZbXGBeXV9bWl5dXl5hXVtbWlxgYl9iZWNlZmVmYlpkZmZpZ2JfY15hZmRZaGhiZmljZV5iYmNhYGBfXVxaWFxZWVhYWlhXWltaWVdYVVVbXV1dYGBiYnhLWFdbWVZcW1xdWldcXV9gYmRhYmFdYFhiY2JhY2FiXVtcW1hXXFxfXWBfXVtgZF1cWFtiZWNhUlxaT1lYWltbWldaWWBdYGJiYGFjX1xiXV9dW15dWVhUV11eX2BfYFxbXl5gYmNcXFhcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiW2NnX1xpaGJoaWVkYGJhY2FfYF9cXVxZXFlYV1hZWFdcWlpXVlhPWFpdYWNlZnJrf0pZV1xaWl9cW15bWF1bXl9hY2JhYV1iW2JkYmBiYmJcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxeXl5ZWFVbX15dYWJgXltgYWJmY19dVF1gYGNkZGZlZ2VmZmVeZWZoaGdkZGBaZWddYWdoY2hoZmNgYmFjYl9fX11dW1pbWVhYWFZaVlxbWlZWVU1YV1xoaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4SCgoKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKCgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXp7e3t7e3t7enp6enp6enp7e3t7enp7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3p6enp6enp6e3t7e3t6ent8e3t8fH18fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a8homJiYmIkMzT0tLS09PEvb6/vr7AooqMjI2Njol/f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIqU3ebk5OXk5dPMzMzMzM+qjY+PkJCQi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eHh4eHh3d3d3d3d3eHl5eXl5endvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2DhISEhIODgoKCgoKCgn58fX19fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ1dXV5dnZ2ent4e3h3dnd6d3l5en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3l5eXl5eXl5eXl5eXl6e3t7fHx8fHx8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd2eX18fHt5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjYyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3Z6fXx6e3h8enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4OEgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3dnt9e3l7eHx5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp5en16eXt5fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4e3h5enl5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGhIOEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgYGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYF+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiIaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgoGAgYGBgYGAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgYKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgYGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzc3NycnFwb29vb3Bxc3NzcnJycnN0dHRzcXFxcnN0c3R0dHR0c3N0c3NzdHR0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHNzcnFxcXBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3Nzc3NxcHFwcG9ubm5ubm9ub3BwcXFxcXFwcHFyb29ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJzc3NycnBwcHBwcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcXNxcnJxcG58gm9wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcXFwh4ZwcnFvcpiCbnBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXF9oYJwcm+LnnxucHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXWdoXdxd5+cfW9xcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXFwcHBxcHBxcXFxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycZiokG+Co51+cHFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4d3d2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4GDeXJzc3JycnNycnNzc3Nyc3Ryk6mkeYignXxyc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f4B+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn18dnZ3d3Z1eHp4eHh4eHd4eXmftKmkqKiXfXt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgYGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7fHt7ia+mobWrrKN+e3p6eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX19fX2YpZahsqCZp5N9gH99fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYCBgZycjqCvoJ+in4CAgYB+fn9/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImHh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f4CAgYGAl5qOmLGhmJachXx+fn6Afn5+f39+f4CAgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjImGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+foCBfn6fq6WWpJublqCfhn9+fX+Af4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CKioqLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgYGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4KDg4aNn7KooqCYnZ2mqK2ooJmQh4GAgIGAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI+Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODg4aNoK2xppuaoJuenJydoaSjnZSHg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYOLl5mXlpigm52dnZmal5CJhoaHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4SEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODg4SDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGBho6Uk5eanJyblI+Jh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5OSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgYGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SDg4iQk4+VmJKHg4KFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgYKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHh4WGhoaHiJGTkZCOkI6RkYyJiIWBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4GCgoKBgIebiIuHgoKCgYCAgH+BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo+PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIiIeIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAf4OIjoCBgoODgX9/f4GAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYmGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZaIhIKEgoJ/f4yVgoKBgoSDgYGBgoKDg4OCg4ODg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmYuDhYSEhIKAkZmGgoKChIODg4KEhIWEg4ODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSk5CNjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgY+Mg4F/fn18fYycjoCCgYGCgoSUlIyBgoGCg4OBi5yaoZqKgoKCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpOSj42MiIOEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoaGhoaFhoODg4OBgIKCgoGCgH9+f3+BlZeJgH19fX17gZiMgIOBgYGAjpSMkIGCgYKCgYmSkIyWo6OPgYKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWFhYWFhISFgoOCg4KCg4ODgYCAgICAgICVn4p+foB9h4t+hISDhIKDg4KNiYWMgoKDgoOCk5SWmJKXnpyJgYKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf319fX+ChIODhISLmZSamZeWlZKEhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaGhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMioiFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDiZGDhIuFgoGBfn2Bh4aDgH5+f39+f4CDhIOEhJGVg4mWmJaVlIiEhYWFhIWEhoWFhYWGhoaFhoWFhoWFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWFhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+gICEhYSFnZOBgZiZmJiWi4WGhYaFhYaHh4eIhoeHhoaGh4eHhoaHh4aGhoWDg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4mIhYaFg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf359foB/f39/f4CAf3+Af3+FhYihoJubn56SjZCKh4iIiIaGh4iJiYmJiIeGh4eHiYiGh4eHh4aGhYODhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhYSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4OBgICBjImBgIGBgoGBgYGAf4B/f357eoCImqCamqOim4yBjIqIiouKiIiIiYmLi4qKiIeHiIiIh4eIiIeHhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSSkI+RjoqGhYaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCg4OCgoB/fn19fX1+fnx7e5Shl5aZn5+bmIuLiYiJi4qJiYiJiIqKiYuJhoaGhoeFhoiIiIiGhoeEg4KEh4iIiIeFgoKCg4OCg4OEgoGCg4KBhIOEg4GOk5KQj4+LiIWFhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKDg4F+fX1+fn5+fn59fn19gZWTkJeYk5ial42Hh4eIh4eJh4eGiIeGiYmEg4SDhYSEhYWGiIiGhYOCgoOFh4aHhoaEgoODhIKDg4SCgYKBgYGDg4SDhJGSkI6PjouHhYaGhIKBgYGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoOBfXx9f4B/fn5+fXx9fnx6gJGOj5COk5iZioOGhYWDg4WEhISEhISFhIKCgoGEhIGCg4OFhoWEgoKBgoKDg4WEhISFhISGg4ODhYOCg4GCg4OEhYSHkpGPjY+MiYWEhYSFgoGBgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAgIF/f4GEhIODg4KCgH19f4CAgX99fn59fH19e3p6hZCNjI+Ul5SEgIKCgX9+gYGBgoGDgYKBgoKCgYOEgH+AgIGCgoCAgIGAgYKBg4GBgoSDg4SEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgIGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn1/goSEgoOCg4J+fX5/gICBgH59fX19fn18ent7iI+NjY+Phn9+f4CAfn2Af36AgIF/gICBf3+AgYF+fX1/gIF/f35/gIB/gICAgH+AgoCAgoGAgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GBg4SBgoKDgoOEhYCAf3x8fX59fX6AgH59f359foCDg4OCgoGBf319fn+AgIB/fX19fXx7e3t6enp7i4+NkIZ+fn5+f39+f4B/fn9/gH+AgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af39/fn+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhIOCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fX5/fn1+f3+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp6enl/jo6Uin9/f35/f3+AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f36Af39+f3+AgH5+f39/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enp6enmDkI2VjIGCgICBgH+Bf4CAgIGBgoKAfoB+f35+fn6BgIGAf39/f4CAgH+Af4GAfn9/gH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEhIKBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WCgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXx6enl5eXuHiJSVhIOBgoOBgIKAgoGBg4KDg4GBgYCBgH+AgYOBhIKAgIGAgYGBgIGAgoF/gYCBf4CAf4CAgH5/f358fImUkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgIGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fH19fHt5eXl5eXyCh5GEg4KEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoGCgoCBgYCBf4CBgH9+jpOMh4iHiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGBgYGAf4B/f4CAgYB/gIGAf359fX1+fn9+gIOEh4eEhoaGhYaGh4eGh4eIh4eHhn99gICAgoF+fX19fX19fX19fX19fHx+fn58e3l4eHl5en2Bh3+CioSDhISEl5eDg4SBfX6BgYKBgYGCgYOGiIyFg4KCgYSCg4OCg4WEhIWDg4ODgoODgoKCgoODgoKRkIuIiIeJh4aGhIaFhISEg4GCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gICAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHh4eHiIaHh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXl6e31/fIWRg4ODhISUk4CBgX9/f35+hIyAf4CAhIaQiYWEgoKBhYWLgoGChYWGhoSEhYWDhISDg4SDhISEiJKPjImIiImHh4eFhoWEhISCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eXp6enp7f4KAgYGDgoB+fX9/e4iRfHyOloB9fn+ChoqFg4OEg4KDjIl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp5ent8eXh8fX6Af4B/fXt7f359gpWRf4SIfXx+f4KEfHyBgoSDf3+Hg32CgYCCgoCDg4OEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn19fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e35+fn9+fn59fXyAgYB9ho+Bfn2Cfn9+gIJ8fIB/goCBgH58e4qCfYB/foGAgIGCgYKAgICBgH+LlJCMi46OjYiIh4WFhYSDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYWGh4WEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fXx5ent7eHh5e3t6fIKAgX+AgX1/f4B/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSSjY2Ojo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoCBgH+Af36Afn9/f35/gX58e3x8fHx8fHx8fHx9fXx7fXx8fHt8fHx6enl7fHp9hYODgYGBfoB/f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fXx+f4CBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6NjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+ChIaGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fHx8fX59fH19fX19fXx+fH18e318fHp7enx9fX+GhYOBgIB9fn1+f36LhIGHfn18fH9+goJ/fXx9fYF8e318foGEg4GAfn5+fn18fn+AfX6Afn9+hJKNjYyPjYyKhoSFhISEg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOBen5+fH5+gIB+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fX17fHx8e3t6fX6AgIODgn9+f3x8fH18fIGDfox+fHt7fX59fn19fHt7fXx7e3t7gIaEgoSDgX+Afn+CgoJ/f4KCf4CLkI2NjI2LioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f3+Af39/f39/gH+BgYB/fYB/f35/fn5+fn98gn1+fX19e3t9fXx6fHx9gYKBgICAfX19fHx8fHx9fH57f357e3t8fHx9fHt8e3t8fHp6fXp+gn6ChISCgYKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9e3+BgH9+f36Af39+f39+f4B/f39/f39/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5+f35+f358fH18fH18fX57fHt8fHx8fXx9fH18fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJiomKiYWIko+NiYqHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/fn9/f4CAf35+fn1/gH9/f3+AgH+Ag4KAf4CBgICAf3+AgIB+fHl8fn1+fX1+foyGfX1+e3uDg319fXx9fH19fX19fXx9e318fX1+fX59fX59fHt7e3x7fHx7ent7enp6e359goaIh4iKiouLiYyRkI6KiYaFhIKCgoKDg4ODgYGBgYGBgYGBgYGCgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKDg4GAgIGBgIF/gIGCgX9/fn9+foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fX18fH19fX18fX19fn19fn58e3t7fHt9fHt6e3t5enp5ent+f4ODhIiJioiJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2BgX+BgIF/f4B/gIF/gICBgoGBhIOEgoGBgoGCgoCAgYOCgH+Bf31+gH58fn+Ign9+g5GEhIOBf359fI2HfX1+fX19fn58fX18fX1+fn1+f3x9fHt8fX58fHt8fXp6enl5eXp7fn6AgYOHhIiPjouKh4WEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKFhYSCgYGCgYKBgICChIF/foF/fX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Afn19fHx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6ent8fX59f4KAiY6LjIiFhYWEg4KCgoKCgoGBgYKCgYKCgoKCgoKBgIGCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICBg4F/gIGEgX5+gH9+foB+fX5+gIB+gX5/gH9/f4B/fX9/f35/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fn18fHt8fHt7e3x7fHx9fXyKiomJhoaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgH+AgIOBfn6Af31/gH19fn6AgH+Cf4GAgICAgYB9f39/gICAgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8foqHh4WGiIWEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4SDhIOCg4SEhIOFhIGBgIB+gIJ/fn9+gX9+fn+AfX6AfX19fYCAf4GAgYGAgICBgX5+gH+BgICBgYB/fn19fX59fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAiIOEhIWEhISFg4GCgYGCgYCAgoKDgYKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4GDg4ODhYSFg4ODhIODhIWDgX9/gH+AgX59fX5/fn5+foB9fX98fX1+gX+AgICCgICBgIOCgH+AfoCBf4CBf4B/fn59fn5+f31+hYWBgYF/gIOBf36BgH9+f3+Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoKAfoCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CAg4KBgH9+gIB/gIGAgYB/f39/f3+Af4CBgoKCgX+Ag4J/f4OCf3+Af4F/gH58ent6fHt8goF/gn9/gYCCgoGBf39/goB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSDgoSDgYOBgICBf39/f4B8fX1+gH1+f39/f31/fH5+foF/gX9/fn+Af4GDgoOAf3+BgYGCgYGBgICBgICAf4CBgYGCg4GBf4CEgH2Bg4SAgIF/gYGCgH16e3t8fHx/fX+AfH9/fX2BgIB+fX1/fn6CgIGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhIGEhIWEhISBg4KBg4F/gIF+foB+gH19fX6Afn+Afn5/fX99f39/gYCBf398foB+gIGCg4GAgIGDhYKBgIGAf4GAgIGBgIGBgYODgYF/gIOAfoKDhICAgoGCgoSCfnt7fHx8fX19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYSDg4KDgYGDgYCBgX1/gX6BfX19f39/f4B+fn99fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICBgoGAgH6Agn9/gYKDgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3x7fn19f3+Bf4B+gYCAgYKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hYSEhYOCg4SEg4KCgoOBgoKBf4GBfYCAfoB9fn1+f4CAf39/f358foB/gYCBgH9/fX9/fn5/gYB9gICBg4ODf39+fX5+f3+AgICAf4GCgYB/fX+Bf3+AgoKAgYOChIWGhIB+fXx9fHx7eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHWGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1+gICAf39/f3x/f3+BgIGAgH98gH9+fn6Afn1+foGBgoJ+f359fn5+fn9/gH99gIGAfn59f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgoGCgYCBf35+fn6Afn1+fH6AgIB/gICAfIB+gIB/gYGAf32Afn5+f399fX1+gIGBgH5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8e3t7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIKAgICAfX5+f4B9fH58f4CBgICAgIB8gH+Af3+BgH9/fYF/fn9/fn19fH+AgICAfn9+fn59fH5/f39+fH2Af359foCCf39/gH9+goSCgoOFhYKCfn18e3t7fHl3e3l3eHd3eHt7e3t8hYl9e3p3enx9fXx8fX19f358fX5+fX19fH19fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYGBgYKAgoCAgIB+f35/f318fn6AgYKBgICBgX1+gH9+f4F/gH9/gX9/f399fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5fHx8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fn1/foCAgYGCf4KBfX6Bf3+AgX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2EfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGBgYKBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZKNenx9fHt9eXt6enh6gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgYCBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgYCAgH9/f31+fnyBhol8fH57e355ent6e49/d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoGAgoGCgoKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKBgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3p4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x8fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoGAgYKBf4CCgoKCg4GBg4KAgoGAf3+AgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgn+AgICAf4B/gICAf359gH9+f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYKCg4CAgoGEg4OEgYGDgYKCgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYGCgH+AgYB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58e318e31+eHd2eXl6e318fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCgoSEgICDgYaDg4SBgoSAhIOCgoCAgoKEgYGCgYOCf4CAf4GDgoGAgYGAgH+BgYGBgYOAf4CDgn9+f4KBgIB/foGAgX+AgIGAgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/f4R9fX18f316fX97enZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfH9+fn59eXl7enp6eXNydG93cXd5c3d7hYKCgoKDhIKDhIOAgYODhoODg4KChIGEg4GDgICCgYOBgoKBgoF/gICAgoGCgYGCgoCBgICAgoKBhIB+gYOCf3+Ag4KAgX+AgoOCgIGCgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3x7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cXl0dnh0dnuEgoOCg4OEgoSDg4GCgoSGhIKDgoOEgYSDgYOAgYOCgoKCgoGCgH+BgICCgYKBgoKCgYCBgYGCgoKDgH6Bg4J/f4GEhIGDf4KCgYOCgoKBhIODhICCg4KDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoGDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX+AgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgYKDhYWFg4OCg4SChIWCgoGCg4OBgoGCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoKAf4GDgn+AgoSDg4KBgoKBg4KCg4ODg4OEgIKDgoODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKAgYB7fYB+fHl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgYCAgICCgYCAf319fH19fHZyd3h4dnR/dnV9h4eDgoSFg4OEhYSBgoSGhISDgoOEhIGDhYOCgoKDg4GDgYKAgoB9gICBgoOCgoKChIKAgoKDg4KCgYF/goOCgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn+DgoKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHx4dn92d3+Eh4OCg4WDg4SGhIGChoaFhISDg4SEgoSFhIKCg4OEgoOCg4KCgX6AgIKCg4KCg4OEg4GCgoODg4OCgoGBg4J/goOEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fn1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIhoWEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBgoOEgoODhISDgoOChIODgoKCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDg4KDg4OBhIOBg4OEhIOEhIWEhISFhYWFhIODg39+gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB/fXx+gn9/fn5+fn19f39/f4CAgH+AhISEg4SFg4SDhX9+goqLhYWEg4KEhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4SDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKEhYuIhIWEhIWFg4eGhoSEhISFhISEhIOEhIGCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeYN/f39+hISCg4KDgYOEg4SEhYOEhYaEhIZ9g3p9fn+De4WDgYSDgH99fn9+foGDgX17f31+gH59fHx8fX19fXx9fX6Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWDioiFhYWDhoWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhGp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWEgmh6cnNzfIBygoR+g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fX18fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgoKEhoaDhYSGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OFhIaGhoSGhIOEhIZ9cHuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdtenNugId6bX1yc3Zzdm1ud2xweWx1fX9/fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYGAgYCAgIGAgICCg4KCg4WHhYaAgoWDg4WHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29sd314hnBxenBydGaBdX5ue3lzb3l/gH99foF/f3t/fn2AfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIWFhYaGiISEhoeIiIaHhIaGi4mFhIaHh4WDhYSFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIV5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGBf35+f39/en59fH59f39+fYCBg4OAgoOBgoSCgX+BgYB9f3+Bfn9+fn+BgH5+gYKAgIKEh4aDg4eEhISFh4aFhYWFh4aIhYWGhYeHhoaEhoaJiIWEiYqIhYSFhYaFg4WFhIaGhoaGhoN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBhIGAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJiYeFhYaFhoaFhoaEhoaGhoaFhoeHh4aGg4aFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SDhYSFhIWEhoOFhoWFhISFh4aEhIWGhYV9d4WDhISDgYF+f357fHt+e3x9fn9/fXx/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWHhoWFg4SFhoWEhoaHhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaFh4WGhoiGhYiHh4WHhoaIhYWGh4WGhoWDgoWFhoWFg4WDhISGhIaGhIWFg4aGhYaFhIaHhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9fn58fH59gH99f4B+foB/fX18gH1+f35+fn98fH1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSGhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYaGhYKDhYaGhISDhISDhIaEhoaEhYWDhoaFhoWEhoeFhISFhYOEh4aEgoOEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn59fXx/fH5+fH2Bf3x8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoWEhoaHhoiGhISEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFhoiFhoeFh4aHhoeFiIiHh4WGhoeFhoaFgoSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4SHg4SBgoSFg4GAgIB7e319fHx8fn18fHx9fnx9fH59fHx9fHx8fH18fn17fIB/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaGhoWDhISGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4SGhoWHh4eFh4aIiIeHhoeGh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4SCgoJ/gHt8fn18fHx+fXx8fXx9e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoeGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiHh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4aIhoaIhIOEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn5/fH9+fnx8fX99fH19fH57e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fHyJh4OGhYaFhoaGhYSFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaEhIaGh4aFhIOFhYaGhoaGhYaHhoaHh4WDhYWDgYKCgYOFgoN+gYKBf4SCfn5+gH5/fHx9f317fX18fnp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8fImHhIaEhoSGhoWEhYaFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhISHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiYaGiIeHh4aHiIaEhoaGh4WFiIOEhYSGhoWHhYWEg4WFhoaHhoaFhoaGhYaHhIOEhYKBgoGAhIOCgn2BgYB/g4F+f3+AfX98fX1+fXt+fXx9eXp6eXt8fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWGhIaFhYWFhYWDg4GDgYCBgYWCf4B/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeGhoiJhoWIh4mHhoeHhYSGhYWGhYSHhISFhIiGhoiFhYSChYWGhYaGh4SGhoaFhYaCg4OFgICBgICEgIOAfIGAfn6DgH1/f4F9gHx9fn1+e359fHx5enp5en19eXp7e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KBgIKBgICAg4F+fn+AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYWFg4aEhYeDhIaFhIWEh4aGhoWGhIKFhYaGhoaGhIWGhoSFhYKCg4R/foCAgIGAhIB8gX99foJ+foB+gH5/fX1+fX57f317enl6enl6fH15ent7e3p8e3t7e3x9fX18f359fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhIWGhoeHh4WFiIaJh4aEhISChYODhoKDhYWEhoSHhoWGhYWDg4WEhYaFhoSEhISFg4WEgICCg39+f39/f4CEf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXl6eXp7fHl6enp7e3x6e3t7fH19fX2AfX18e32Af318hoOGhoWGhoOEgoWChYGBgH9/gIB+f4GBfH5/f35/gIKCgoSEg4KBgoSBgIOCgYCEhYSCgX+AgoOChIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOEhIWGhIaGhoeGhYOEhIOEhYWFg4SDg4SChISAf4KCf31+fn5+f4R+e398fICBfoGAfX6DfH5+fX1+e357e3p5enp5enp7eXp6ent7fHp8fHt8fn59f4B8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH5/f4J8fX9+fn9/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGChoWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhYWFhIODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYF+gn99f4J8f359fXx8fHt7enp6enl7eXp6eXp6ent8eXt9e3t+f3+BgH1+fX59f4CAgIaDhIWEhYKEgoKEgoGAgoB+fX5/fn9+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFg4WDgoOFhYKEgYOAgYCBgIGCgYCBhIODhoWFh4aFhYSFgoKCg4WEgoGBgYGAhYOBf36Af358fH59fH6DfXt+fH2Af4CDfX2AgX9+f318fH19e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/f4B/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMzMzLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PkJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU1NPU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PD45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT0zNjY6Ozw4QzxBQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWy8vLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU1NTU09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw7OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OR6jZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1svL0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19jX19fa29ra2tra2trb3Nvb3NnX19fX19fX19bW1tbW19rb2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZElJTE5AOTk6NDtAPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTUaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbLzINtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0jYuLi4uLi4uLi4qKioihv729vb29vby8vLy8vbSLioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5FybGlOUmJMTFZNPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS1BGntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXy81OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFhSU1NTU1NTU1NTU1NOeq6qqqqqqqqqqampqaybVFNTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYd2xpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUJAOTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18vNUiwxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpp5cVldXV1dXV1dXV1dXU32wq6urq6urq6uqqqqtnVlYWFdXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDs+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fMzlw5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaqiZmFiYmJiYmJiYmJiYl6Fs6+vr6+vr6+vr6+vsaFjYmJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk6Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzM3EwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Ozs7OzcvMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzLy8vLztLS0tLS0tLS0tLS09PRzM3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo7ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M3Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7OztLTz8/Q1NLPz8/T0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX19fX19fX19bW1tbW1tXV1tbW1tXW1tbW1tfW1tfY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztKrnM/RyJSn0tHHkqvRzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTEJAPT08PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK2nKWk0ZqsnLDRmayastLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/OnZyRnryViJyexJKGnZzNz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4+PDw5Nj9CP0I6NjQ4Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Rv5igm7KuwcmYmMW8yZeZxdDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9COjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/P07SZlqq4pNaUlp/O0ZKZoc/Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PDk2NDo5ODo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8qgo7/KnKWMp63Yqpmq1M/Pz9Srmn6jj6Szn8Ob2q2jv57V0dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD45PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDUrJuni5Wh0IqSnsfLiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbX19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDR0RBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q07aysqWZqtHbpZmz0NujmbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkmxdXG9naGJdT0Y/SEhGRUA8PD4+PD09PDc1Njo5Njo7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXEopmWnauSp5qgrZCnmJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6DH1aKrpJ2xpKWooK+noqmd0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtLQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09PIkY201p2SjbrVmpKOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVaWpbTF9NSkxKVUxGQjw8P0ZFR0tIPTY2Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oz05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR1MjB1dPTucfV09O5yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRExMQD43NzU6ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dHT1NLS0tXU09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj09Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRENJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZJRDxBQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ4ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+PEhGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0RFQ0FMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhRQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29ra2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODg5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ojg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5OTo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Firzd29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3F0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tvc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h1fHZ9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg2NTQzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv72+v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg0NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7Oz4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojc2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBGPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2Njg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm6ubm4t7e2tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NjQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO1tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3trW0tLOztLS1tbS0tLW1tba2tra2tre3t7e3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi3t7e4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+QkA/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utrausr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmpqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3uLe2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BBQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpaWlpaaoqKioqKWnqKinqKinqKipqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7a3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDY1NzM4Ojo6Ojo8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OztAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelpKSioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpaenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6SlpqakpKOioqOioaCfn56enJycnJ2dnZydnp+goqGio6OjoaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5iXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAP0JCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqSkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc1Nzg7PTg6Ojk5Oz07Ozg5PjY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKunpqCdnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5KUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqenp6afm5qboqCalpeVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6Wmpqako6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODk6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/PkFBPkFBPzo5PT46UJ2gn5ybnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+mpp/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6elpKKho6empaWjoqWmpqWmp6amoJuZm6Ggl5KTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6SmpqWlpqempqKdnJ+hn5eRkZCUl5qdmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoKCfoJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3OTk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaSmp6alpaampaWjoKChoaCZkpCPlpuZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaCgn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSk5KRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU5OTg5PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKjoqOkpKampaSko6KhoZ6cm5WSlJicmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+foKChoqOjpKSkpKKhoZ6bmpmXobWemZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NjY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpmXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Cfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKCgoKKkoaKioaGgnpybm5uZn6ubnJqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY6NzU2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaCls6ygoJ+fnpyZmZqam65qdp2dnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJuam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goaCfppKbq5+goJ6bmpmamaiERH+fnp6cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmpiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnqCeYpymnp6cmpqbnKGjUUeDoJ2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODo7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZuapmZdo6CbmpmbnZyudUlMhqCcnJ2cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxRPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8Pjk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmKSAUniimZmanZugpF9WToehnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGgoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFxcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJuYmJmgiFtflJqZm5yco49kWkyBop6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbW0xGPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiZn5ddXXaXmpydnaKBZFlNfqKenp6dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubmpydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc5ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZmaYGFggJadnJ6YdGNVToCin5+fnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmZn2leW2V/nJyejGpfUFKGnpudnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0JAQUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qal5NzaGFUdpOXnIdcVlBXipKOkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkY6Smp6SfaCjlqScbkxPY4aGgo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg4CEoJ2Of2yWpZWfgIl/X3J/gIKSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2OTM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5/gKKLfG5SdZyMjFpxfXx+fXyGjo2Lho2UkYuQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhYCCfZiad1hPTHCUhoJMYHBxd4iFio6LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYB+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYt/iI2Mi4uHkY2jjVUvMD13h3d2QUVea22EkImJkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVGJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmQnqGdk5eboZqdm6KmnGdBWkg7d3lrZ0UwOFlsc5CPi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRfTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6mpr49Kb6F4QXt3ZGFQUVtHYG6KoaGknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipqmnqKN4YMDWpkN7jIB1T22OdlNkf6Oop6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkp6eZnaSlo6KdYn+9wK93nqOalGVMYXhtUXSVoqKgoZ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmVkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioaKnoaaupqadnmqEnLqPptChmbGoWEysk1Nlj6CeoKCenaCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGoqq2xsq+roqKGd359cs/JsZunr2tVqrBiWoemn6WioZ2fopiVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFVcaGRvY21paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKehnpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqevt7e0tbazra6tj4aDbo/NuZWRo5d0VG96c257laaqp6OfnqObnaGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAP0JDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7K3u7u7ubnBuLS1oIh5ZFmft8CmqZ2Id2txb3h4en2GjpKYnKKlpqulpJihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odmtxaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW3wcbMz87Myb6zpJBzZlJEi5eJiYh+eHFuZ2ZsaWtxcnFxcnR8jKnExLuip6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FpYWZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PFx9vj49rLvK+kl4h0WVpRQ2l6bG91bmtlZVlXXlhcY2lpaGVgaIm0wMC5qa+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3b21bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxr7N0dXKuaedlIZyXlFUS0RbZl5ka2VhYGhZVFhSVlhZXFhadJm2u6u0sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Ef2pmaGFrbGdudnJydnJnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/wsHHy8i3lHVlVVBPVEg+XmteX2ViYF1kYVNWVlVTVFdym6uwqqiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3VrbG5kb21pcXhveWppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO5uMObYUlER0tEPVtlYmFoY2BbY19XUU5PT1V/tLqsrqWko6ekoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnZSTiYl+hoiMlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent3bmtpaHZaZ3N4c3pnZ15kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTExMLEwa2DT0ZNRTtNW19la2VfW2BZWFJNVH+iqrm1sqypo6GtqqynrZ+stLS/w765uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl2dmVmampoXmtwbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMfCxpZqWEc/P0deY2JqYFpYV1NVdpm2vru8urysraapu7q5t7+ztbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rraussZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWh2aGpqdW55bF5kW1ZgWUxIRDY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnOxcbGvalyUEswWFNVZmFTTk9wqcjIwsTGwLy+tLGwsMG+vsHGwL63tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2tr7WkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOi5R9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ9eHBnYGtqd21pZnZvdGNdY1VXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwsPCwbyRP092folWTG+ky9TFtr+/wL+6u721s7PAv7m/wrnBt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5gHNwZmVnZGxlYmtub29fWV1XVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvbzFp3drg5CYb6nIyMfRwa+9vbi5u7u+t7Sxur+0vL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX16g3huZmFlYmFjZGRqY2dkW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Aur/AvLvFvbrAxL+9vq9zZX2Ri4nRxb+/yb+wwb+6t7u+ubW4tLi8tb24tbSvs7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhY2Noa2dnamZqXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdaNt7+7w7W6x7a1uLq8uLm2qqOYjn+Dyb+/u8G+uca9wr+8xbi3t7S4tra8u7m2tLe6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVnb2plbGhZWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vM/Ed6fMvce3ubettrS3ubO1sbzJw5VLesq+v769vL/Iw8XFvse4trO1vbi4uL67urm8u7q0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucWdxa3RmY25gXFVIS0pESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTWr3R/usjPwsC4rrS0u723ubG9w8qPQ3TNw8K/vr28x8zHx8THvLTAwcC9u7zAw7rAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFmbGpvdW94ZGhjXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsbJ0ppxcqvS0czKxLW6v8TIvr60v8DAeVJty8bCvsG8v8PMysfFxsG5wrrFv8C/wsi9x8fGxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0cG1tdGxtb2BjX2JiTklNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8TQw7q+vMS+t7zAv8nPx8jKysKHcnOjy8zLzcrGwsPLzsG8uL26sXBjYrvIxMDAv8TAysnDw8PDu7e0wbnAvcLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaahn5uCe3qIe21teHxgcWRcX2BfVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u7q9rDvra+wL6+uqacqbK2w7+lenZ4msTHy8jBw8DAycrBv7u5saF9c2qtyMXEv8DBv8vHw8DIwL2sq8Czu7vBvsDKzsrEvbW8u7m/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXpuc3l0aHBeXF9dWlJGRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vEuW2szr22ucC8q35uaG5scoGVmHN3fJe9v8bAucC8vsXEvb24sbCZkH6Am8rCw7y9v7/Dw76/yL2/pZXDtLa1vb6+zszMwriyuLi3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bXV7cW9qXGBhWlRRQUZJR0tARUNJPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5udm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbR2gLO9trXCpYdpWl1gTVJbWm5zd4CfuLjCurO7t7u9v7q7u66km5mIkX7AxMO+vL+7u7i2wcK2wqCBp7aqsL7CutLJyMOxsLS0tby5vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra8tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z3eG5yYV9nXVtVSj0/P0dHPUdDQzk6NTs5OT48PDk6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmohHiJoK+1nmtlZlZYX0lJTVBTbHeFpbC3vrmytbK7uby2ub60lZynlqFwrsnEwL2/ubOusr27rr+fcnqjjZOcn6XDwr+9rKqvrbK6t7q+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybWBkYlxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/Fq4h8doygmWBUQ1dWSGFrVk9GSWCNoKuvtrq1tLKsvLm4tbjBvYuZsqOmcqXLwr+5urWupayzsKa0oXmEp5eRj5COjpmwtKWoqa7BtbOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3Zzb2ReaFldXlNPTkI/SkNBS0pANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJqRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7WRgniIj29OSj9jWkFOd4CUa01BXIGwtbO1srSvrLu6uLa5v8Z2hKqfm2Wnv7i1srGtrZ+kp6edp6q6xcvTwKSQlJeCg6CgpKW8xKyup7Crr7GxrbGurq+5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2dG12amxdXGtVXlxQTkhER01CR05HODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhHtYRkFOhlpKSlh2jYBjQFKiubO0srCxrbC5uLa7t7q9kKKyrKRzq7Cpq62ro6ignZ6dmJjO5uHh39XGp5GJeW1xl6GpwaaoqKGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusayqqa6vsK2lpqqkqLOurauopqapq6aqp6uyrK+zsauploF/gXdyeWl1dG9lVWJkWF1ST01JQElSRE5DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+xu6qZmZVpTkBSeHFQSUlLZ5uBWUVRrbuxrLOvrqyttraytLWuqaafmpudn6aonqCoqZ+hp5ablpWb28/GxszPzL+bfWxqZXulxqqXoqKfn6WgpKylpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CXlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqaSpq6aprKumoYh5g3x2f3pjeG1uXFFpVVBPR1BNTUNQUkA+Oz40Ojo1Ozo9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2qpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqLzCq6S+aUVSnIJRV0lJX0tTjmBjYoCutaqytK6qq6+wsrOtpZ2Rl5OPmKCfoqCco6SfnaiTmZSTrpxjcpC0xsfHq3xpaW5mlLWLm56foZyhn6Oop5ynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJaTj4+SkZmQlpWYl5+Ym5qbpJmXlJWanaCdp6iloKOioaOfnKCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fYB1dn1ubHtkaFZTZE5KSEdPU05LTkg8RUA9MkA4NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutra6ubq3t7uuqKChqaGqxr/KoVBBcp54T25LS2JldXNfWl5wj7GvrrO1qqasrKObmZSNkZWXmJicn6KinJ2knpqklpaWl6FLLUhaiLPCwauAcYOJg3h9lKKen6aenZ+jpqieo6afqp2qraqup6iwpaOkpqespqGlopuZnq+orrKrpquqoJuYmJiVk5aak5WWmpabl5iYoZ6cnJeboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GfoKWipqCJfIB+d3l8ZXl5YWJTVmFJSUtMU1VKU1FNOT5BNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWdo8fHj1dTSWSjXGV+b3JdUGtjW2RfXWuPtLCwuKymoZydmpSYmpmQjpGVkYyOjZOZopyXopiZlZyEUmt/aWCUr66eg4GdnqOaf6qqpaGwo5qjpqaqoqGqoqmkqLKrsbKruaimq6erq6isrKehoKOxrrKxtKqyr6OZnJ2eoZibm5qYmZuVlpuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWooqejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2mCbWVcU1taTVJLT09WTVRNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp6rpI16VWhydXVxYnZ2WFdjYGNnWVhXZayurK+nn56ioZeRlJygnJmYkpOfnKGjmp6alp6ZnZaYfGuQootecJmYj4uNnqOlp6e3tbCms6yhra2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7W4s7itsrSkoJ2loKyhoaKhoJqZlpagnJuYpaGgnqOhoJ+bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGDf3x4dmp3dl5tW1JhSVJWSEZWV0tDTUg9S0k4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqK6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuioaCkgG6CcGBjWExbU1pNTFBYUkhNTUeXrKqppaCfmpGSlJiYlpaVjIiLjpWdnJ2cnpadmKWfkYGAs8rKk2KDhYaPiJWgo6GuvL64rLS0sLewrrSppqSlrKm5s7W7w7zDwbe7tquusbi3vK+zsLXBvLe+s7O1oqyiqamyqauop6iamZ6aqqegmaign5+oqKWln52qoqKem5+ooKSnrZmgo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mGhX52cm1pd21obl1YW0NXTkpHTUhDRk49Pkw+NDw6Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqamUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOfnYpiV15lYFdNUUc+Pj9DQz8+QlF4qK2pqqagnp+ho56fnpudnJSTlZWenpiUhZ2Zn5mqpY1+gbDU0rF0YXN7g3iNlpmVpcDAvrW5u8DDub27rK6nsa2xwra4wsbAyMrAyr+wubm9uMK+uLS7xsS9w7y4tKqzraqztK+zrqqvo56sqLeyraOwpqGjsLGusKSlrqOhoJqhpqGkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF8dHJrbHVycWhXXFFGVUhESlBJP0VCNEZIOTY8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw8Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfn5V9YF5lYFFHRD1DP0U8Pzk2Tn+qs6eko6KgnqWspp+YnZWSmp6ZlYyKhoiGeGyGn6Khqa2QfXCk1ZR7h0tacHRxgoN6eJO9yMK/xMjN0MjLw7K3tb6yvsW7vszNxszMzNLHvr/Awr3Hx8K4xMrJxMHHv7q0uru1u7ewtrKru7Kuu7fAu7qruK2rqri7tbyurrijpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5WUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrZGlveGtmWlxGTE1FRFRNRUJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEA/QUFBPpKroKeup6KrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9c2phV05FPklZfHBiQj1cjq6soZmbnJ6emZeXmJONj5eXlI+NkIyCg4J2cnBsb42kq66ujoVmg6h/fHZfYmBkaWhjW1J2wMrExMvQ0tXO08m9wL/Du8bFyMXR083T0NPTzMrBxsbGysjPv8nRzcfGycbCvcTBv7+/tb6zrb/Aw8TIxcjEr7+5sri9xMLBu7y8ta6np66ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXVzZWJncm9nX1paRE9NQ0ZRSURDQTU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjk7QUE7Oz43ODY6Oz5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOem52Wa2ZdVElEQD9LhZ6lmoSgsq2jnpyfmpiXlJOUl5GQkI2IhISJh4OAgYGAeXFxbmp2orayl3R9fHp6fnl7koRlXFBsaVo8bs7P0MTN1NXY0dfNxsfJzMPFys/K0tfS19LV1tPUyMzHzM3K083O083GycrLwsfMx8nJxr/Ds7PIxcvLzM/Hyr++v73Bx8XMzMnJwMPArrCzqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuWkIyGkYuAe3J1dmdjZ3dqZVdYUkROR0BJUUM+Qj06MjJBPEU8Nzg8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY5Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hnWNTTEpEQz9CUq3RvbKvppycnKCkoZ2alJSVlIp9eXFsZWJocnBye4WKgHVwbXBybYSkmYZlfHh3f4+XnJBpaGZkqKV1P6TYz9HCz9PW2NXV0svJztDLxs3SytLV19nW2NPW2M3Sys7RzM/RzdPQwMnIy8TMzczPz8bHyLbAy8DSzczQx8rJwMTDyM/N0NHPzcrIzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYWVzY11SXEpLR0FGSUo/O0E4PjU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpaWgoqNbSUBBREFGUHWxr6aalJefnJqgoJ6bnZqViXdpZGFfYGBfXl9fXWFsdXNwb25rcG5yhJCGXl9eWVdxg318XFNxVYq3iWPP1dLQzNDN09fW09XQz9LT0cnT0cjQ19fY0tjS19nU1szPz8nN0szP0cDHxMnHz87S0dLIzM3Ay83G1M/Nz8jFy8fHyczL1NTR1c/SzNPCucWxpai1rqibqKulnbKosLOsrJOPk46Iio6Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUWBKSkNGQ1NOPzw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI8Ojw3NDo+PD9APUZBRD2CpJygpZ6lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu319TV2dnRztC/vMzJtr6up6qooaOsZ0M4PT5EWIKqqJ+XlZeZmpyfnZibnZN9cWVjYl9fYV9eYWBeYWBfYGVtcHBtam1vc3SGfk9PUkpRb3tsfmxTclqSrIKR0NXU0MnPzNLW0tHWzc/V1dHF0dPK0NTV1s7T0djX19fMyM7Eys/Nys3AysHJys7P0MzQzs7Mz9DIzNHRy87Lw8rIys3LzNLTztTS0dDQyr3IubCuu7m1q7awrai4rbO/u7GajqCUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Bva2FkbnBhWFxbSUZGRU1ZRTtAPTMzPDw4Nzg2NTs+QD05PDw4PD45PEA7QDo9OD85ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+ZpaegoKOnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksnxIRkI7Vo2hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYF5fX15cYm1ybm1xcXJydnFUT05NXGF1ZnqFdllng4x0nszS0c3GzszN1MvO0szK1tbQzNDTy8zQ0tPKztHV0tXWysDKwsbNw8nKw83ExsnLy8/Lzs3RztTMx8nQzcnHy8bHwsbKzM7R0cfQz83NzNDFx8G4ub3Dwr3DubKyvrC7w8O1qpiloZiWkZWVkouUjZqRlJSPj5WCiYZ5cXJrbWhgYHFoWVhoVk1HTUlRUUI7RD87Njg6ODo7NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMrV1tna29jMzM/I1tXEwrWvtKigrZd4bG9vdo+ajYyXlZCTkZGVlpWQi3tlYmJiYF1eYWNiYF9fYGFhYF9dW11ncXFvcHFtaW1ycV1KQ01OXVtgcWJIXW9nVpHGzc3GxMbNytHHys3NxdDSz83M1MrHys7Px8bO0svQz8W6xL/Gyr3Dx8nOxcPIwMfOyMTNy83QycXF0MnGwsbJxb/ByM3MzM/DyszJx8zQxMXIu8fDycnCz8C9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+CeG91ZGtgXmZxYVtXYEdJSEdJTVVHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7utpLZ+Z4KGoamTjY2Wj4WDg4OBfYSEf3NfW15dXmBeYGNkY19dXF5fYGBfW1pcYWtycG1taGdpaXeDYEZESEdCP01MUVRnXk6XvcfEwMK/wsfJyMjJx7/Ey8XHyszJxMHKycHBy8/Ey8i/ucG8xsi+wMbPy8TAw7vKx8i7ycbFysG+wsvGxcS+xr69wcTGzMbFvL/Kw8XH0sXBycDKysfIxtDDw8bDrsTLx8PKt7+8urOprKSlmJ+YrKOhppujoJuVfHdzdWZqW2FubVpcWFJETEdDR0RMREZTPzU0MzM1QD0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL64vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srC2bV56e52RipKWhnqAhIV/dXh1cnBfWltcYGBiY2RkZWRgW1xeXV5dX1tZWlxhbnFtaWZna2hsfnFbTUlHOEY/Q1NKVGRYlK+/uLi7ubfAwcHDvb24vL64w8nExsG8xr+3usPIv8HJu7a7u8XDv7zCzsPGvr61wb7Eu73HvMO6tb3GxMLDt8C2tr+/vM3Evba6yLu/vszEwsbDxsnHycbQxsLMx7LHycPOzMDFwr+8srewsqeoqLmwpa2wqq2slHp3eGtlaGBob2RWXllKRkpGSEtBRUJGSkA5OjY1ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1q7e0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1dfNys/FycXHwbrFvayup2Bjd4CSi4iLhHh/hoZ/fYN7dHRjXFxdXl9gYmNiYmRlYl1cW1xeXF5dWltcXWdyb2tkY2lpa3SBbVhLQ05XOTpNRkhbVJWis7CzsrKysrq0u7C2r7OusbrBu8DEu7+6tLG6vsC4x7i0vLbBwr24vcbBw7u1r7O1u7+0xbi7tay5vb7AvbG7trC3urPGvbevvL+1t7XFvb7DxcDExsbHzMW/xca7x8u/z8nHw8XBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpHQkRBREY/PTo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDLzcjJyMrJysTQzdLPzcXHwcXBv7q4ybersJpbZ2+IjoWIiXp4foWGdneBfHNoXV1dXV5gX2BkYV5jZWNfXlxbXlxdXlpbW11fa29sZmNmaGhqd3tfT1FZRTk4RklESmGfl6SnrqqoqqeyrLSvsaetpquyu7m1wrm5ua+qtLm7s8G6r8Cxvby7tbvHucO3raqosLLAtri9sLGosrO1u7yrrranrrauvLKwqriwrruuu7i7wMG+usO/xsPFwLzGwcfKuMXHxb/Hw8K5xMbCu8bJzMuzucK9u7OJdHZ3a2lgYmxpWVdXW0FMTE1KRUFDP0ZBOjo6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc3Sy8PFwcTPxs3Bwsa/xMTDw8rCycq/wLzCurO1tcOvqrGTW2l+koiOj3t4fYmFeXuEgHduXl1cXF1fYF9fZGNiZGNiYF9dWltaWl1aWlpaXGNtbWZkZGRmZ2p6bE9aW0RAOzY6PU2KmpGUn6Sqoaahqairqa+ipZ6prLS1sLy4r7aup623tLO7t7O8r7i5tbK7wbLAr6Wpo6uxs7OovaqrqKusrrW0pqiuoaWwqbOnp6iupqi3rLGzt7q6u7K8vr6+xL+1wcDHyLe+v8W3xcO/u7/Ewr7EyMzKv7/EwMCph3N0c2ppXGFvZFdWWFBIWlNTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDx7m5y8HLvrvJtr3DvrrKuMHDwrW2vLaxr7W8rqirk2NtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9dXVxaWFlbW1hXWVxfZWpkYmNhZGRobXddTEpWVlFRPkJ6nZGOh5mcpaCgnqOjpaWsnpuao6Srsa62tqavq6aps6uzubC1ta22ubKwurqxtqWgpaCmsaisqbmqpaenqKezraCnpp+cpKWsn5+npKGhsa2trLK1s7Owtby2u8HAsrq+w8GxubnCs8C9wLW4u72+vMLHxMPEv7/EoIR4cWxiZmBrb2BVWV9ITmhPVEhGS0Y8PUA9Ojs7ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbq9tqCelZ2gprq2q7Ozu7PEz8nLwsW4t8fAzL+4yre7xbizxbizv8CstryyrKavtK2ho5JpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGBeXFtcXFhZWFhYVlhaXV5jYmBjY2NiZWZrcldQYGdvalp8j5aMi4KWmpyimpydoaOhpZyZoZqdqa6ssLSiqKipq6uktListq+ssrSus7WvsKqfnp+korKkpqq4raKmpp+oraqZn5+emZ2fpZqZo5ycnrCprKiqq6ytsLK4r7i5u7C2vLu6q7OyubO9tLeysbW1v7W9wL3Dwru7vZeEe3NsX2VeZGRYVFdeSVddS1BHSkpHQTw/P0E7PzwwNTYzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67uMHBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uci4uL+3ssK0sbu7rLq6saKfqaunmJ6QbX6Fhn94cm1vbWtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFdXV1dXWFdaXWFiY2NiYmNkZG9sZXR8b0pPgpCUioyFk5qbo5uXmaKkoKKanZ+Zl6yrrK2woKShrKqmobSvsLGsqK+yp7qzprWgop+co6Kto6Kqtqqio6aepqajlpidl5manaCal52cnZytoayoo6Smrauys6q1sLKrsrm1r6qvsrKzt7Ouqa2usbexura6vb+3s7GUhnp2Zl9mX1tZVlNaVUtbUUxKRUhLSUM9P0JCQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+ynaWjmKWxw7W2va20uMLMyMa/xbbBwMfOt8DDvbO5ubLAtrG5u62yta+fmqSqoJSbkHh/g4R/eG9xdHFoZWRoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVVdgYmNhYWJgYGRmcXF2eWA+TGByjYmOiI6Yl5uZkp2dpqGcnaabmpippK2uqZqhoraooJ+tqLWppqetsKS3sKO3oKOcmZmqpqGarbmvo6GknKKgn5OVoZSWlpuZmJaXnJWfqZ6qpKKdo6qqsK2otKyqpq2ysKWrrbOxsLCvr6eop7KtsbSwvLS6t66jlIJ6d2VfYVdZWFNSVEtNXkxQTEdITUxFPUA+PUI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvre9rZ2np6Kqu8C9wLmutLjBzMjFwsO9xbjIzLLBwsGuvLu1u7y1ubmwsLGqnJqhqpWRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1ZVWmJiYGBhX19gYmdwb3RSMSwpP3iOjomMlJiWmpGbm6SioKSknZudpJ2praSeoKG1pqCgoqeyoaWnpa+lsa6rtZ6gnZWVqaGilK2xsZ+io56emJuTi6CTkZOYmJKWmJiXnqebp6KimqSlpaukpbCnpaKrrK2mqa6vr6uoqqqzpqarr7Sxrry2sbCvn5J7eHNlYlxbXVhOTFFIUmFNVlBPSk5PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLyxt6yepaasuLu8wcW6srm1xMnJwMLGxce2xsSzwb/Fq7e3vba9uru1sqytqJmZoKSMinSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVlJUUlRfX11eX1xdXWBhaG9uSSsfKUVvk42Hio6bk5uSl5uhnqmioaKhoaCap6mimJyisKmgoJykqZ2nop6srKqpra2ioaGVmKKanI+rqLCcn6Kfn5eZk4qdkY2Sk5aQmJiTnKGjnKWhopWgoqSlm6OrpaKkqqSqraWtsqmmpaamtaapqK2ztbS5uq+rrJ6Mc3FwYVtXVlZSR1FPSFpcT1JKVEtTTEVHSkM4Ozs9PDk2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Gtnainr7m5s8DIurXAr8XIzLrByczItcm9sb7Dya2xuMG1vMC8tLWqrKaWmpyciYFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSUk5QWFxaW1xcXF1cX2Jrako7Lz1JXIeOhYmJk5SclpabpKSmpKmkp6ShlqOropOXo62nn5uYmp+erpmcqrOfpaafo6OhlJSblpaSqamtmpyfoaCblJCMmY2LkY2SjZaVkJ2hoKOdnKOVm6GjoZiiqKOiqKugq6+krrilo6SirK2qqKuvtLeyvbWzq66YhXV0aVxZWVNVUkZYTFFbWE1VT1BMUVJJT0lCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njg6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7auqKivrpupqKy3tqy8yru2v6zMxsW4wM7Px7PEu7e7wsixrbi/t7y+u7O2pqmglpiZl4h6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFBYWVlZXFtaW11eY3BsTUJPdGxrhICLh4+RmpmVmqakoqqopa2ipZacqZ2Tk6KnpZyXj46Zna2WmKeqmJ+dlKWgnpKRkpGTlaiqpZqYmZ6elo6Mi5OFiI2Dj4uRlZGgnqGkmZaflZqhop6Um6WlqKiooLCwp7G9p5+jrLSqrqevtLC5tcCxrrCrkX9zdGJXVFVOUkpHVlBSUkxMWE5LTE9TR05LQUNGREM+Qjc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7SsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqxtri8vcDDsbCxt660tLuztKOjnZ2Yl5WEgHZrZ2xucW5xam9rZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlRRTU5NUldYWVhYV1pbW2BpamZsZHV2YXt8i4GMi5CUkpejlpumo6Kom6SVnaKYkIydoZmWloWEkZqjj5WjnJWWlYeimpuTjI6KkJqlp5uVlZeckZOIlI6LgYuNgJCLkpKSoZqgopaUmZiVoqaajZmlp6inoaC0sqizuKGdo7asqq2ksrKmtbu0q6yxoop6dG5eTlFRTU9ETk5OUEtGTk5KSk5OUUhNSkFITElIQz45NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4NTg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2sKSnpKqloKmmpLOqorLEtbWys8bFt7rDyszGs6y6vbS4wK+tqbCepq67r62gmpuelZWIfIRuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlJSUFFUUVNVUU5NS0tTV1dWV1dXV1pcYWVaYFtueGV2coV6hYGMiYyXm4qVl6CeoJejk56Zk4uFl5mLc4yCfY2XlYWSmZCTjo17mY+cjIKJgIqYoKOekJOYloWOgpR+fnOKjnqQh5OQkJ2bmpqSlpCejqOjjomaoKGjpJuitK+sr62gmKa4pqWwobGunLG8qqmvqZmEeHRkVk1SUFBNQ1NOTFBNQlBRSElOU05JSkpFS01HS0s+ODQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNDg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKimpaijpqWmpqayp6a0wbivtLDJxLi5wM7GvrOtu8GsrcStqKGmkp2mt62joJGWl5KQfnh/ZldWX2dmaWdobmNpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpHTlNTU1RUU1VYWlxoWFpYaXFrZkZQaYl6jn+FlpGGjoyblZqVlZSRjJSIfpKIXjtWbnuLk4mAjJGMj4aGcouEloF5gXuGlJ2Vg5aOkI+Dhn2TeHFvho1+iYGQjpCXmpmTi5CKnYifmIiIlp6aoaCXp66pramonpats6KlrZmtq5iotKOpraKTf3RuYFtOU1JXTERUSlBMTEZOT0lFTFFNS1BKSU5QR0pKPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebegoq2hpqaqoKepp6OqsKintMK5sLWwx8K4s73Pv7mvrrXCp6rEqqKdmIOUnLGjmpmHlJCLh35zdl1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU5RTUtIRkhOUVFMT1JUVVdZYGBVU2RsY0Y5OHqOioh2gY2Hf4WIl4qUlYmRhYOShHeHfl9JUG13ipGDfYSMioR/f21+f5N3dXZ4hI2acFGNiIqGfH55lHZnd4aIfoqIlYuOkZOXjISKiJWEm42ChJKblp6dlKSjqKmlpJ6bsKqhpKSRpqqWoqqcoaaninduZl5cSFFRU01JVU1TSUxLT0lIRkpOTU1VS1FSUEdKRD03Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMTUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2m6KnnZ+hrqGnqKWnp6+sqrW8tri3s8G7tqe5yLi2qKi1tqqyvKeelY5/iZSplpWLf46Eg354cW9YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERDSU5PaFlOUVNTVVpmXVZhaVpaUUuIfY2AbHd/e3eAh49+kJmLjnmDjX1zfndxbXRwdI2NgHp+iaqEentodnuOcHJteIGLjZJ4e4B7gHdzcpJ4aHWFhISFfJWLiIqNi4B/hIuNgJSEfICPmJSclpGfnameoKGdoKmln52YjaekkqCglp6epIJzaWJdXUpXUFJIS1hST0pNTFJKSkpMUElMUU1SVU5GSUI9Nzg7OTk+PTo7PDk4QD86Oj48Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLi8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZicn7Spr6qlrauwsaq9tLK7uLa6tLGft7qyqp2drKmosq+impGNlIGOnI6Rf3eGeHx2cG9qWUtISUhHRUhIUFRUVFdXU1VVVVVWV1hXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE5RUVNWXmJhYGNWaIGOkomLdGByenBzeoSMeYGYkn5vhI16dXluan2tfHSQin56hpKAfH90ZnV8hmxvaHN8io2HgG16cX1xbXaPcWhxgX6OcESLhYKDhX93eHqMhn2Me3V9jpKPmIuSm5ujlpmdm52eoZyWjYulm46dl46WmJB5b25nY1tYWFVRSlNVVE9QTlBWS05LT09KUU9JT1BMRkQ9Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKawrK6rp6mwr7Gru7irur64s6ynm7CnrJuPlpylqaShmJqOhJJ5iY+Li3ZxfG11cWptalhLRkdFQUBDREhMTE1RUU9RU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFellKTk9RVFhcXmBcWXmZnLx7bXBcdHFpdnODjHZ5iYNtaomQd3J3aGl/gXGWkYqAfZV/SZKZbmd3foJtamRseYWQkoZrc2x8bnJ8hmltcH9zjYmFhnt9fnt3cHV0hoJ5gXlwfI6MipODlpaYmpCTlpaZlp2WjIOJn5KLko2GkJaAb2pvb29ZVlhUUlJZT1JVVFJYVU1PSE1LTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuYmp+krK+iraqota+urLO/q7zCv6aimpWkmJ6NhIuUoaKYmZGTi3OOeoCGjIZ1b3RscW1la2tZTkRGQ0A8Pj5CRkZHS0tLTE9SUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSk1OT1JWWlFXVVObe1iQYGpwXndqaHl1hoVyfoSBcWqWj3JxemlpnI5MeYSRiISNZjF2h3JrfX2DdGZldX6EhIWAZmlsdWtwgHxocXF8bpONj3t0fX1xcW92bYN/d3l1anmIgoiJg5aSkpCLjZGUlI6XjYB5iJeIh4qGgJCIeGxrcGhlWFJbWFlZW05QVVZZWE5JSEVKSkhHQkBHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVtkoiakJmWpKitnrGep7qvq7KwwrG7w8ealo6VmYuOhXqEkJiVjZCMkIdxh4J0h4yGenBzcW9wZHBnX1RGSUM/PDs5Oj9AQURDRUdJS09RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVUtBSE9HXqaqmGdyb2V2Z2x9fIB9doCCgnZvnZJyd35xc5KGNXGcp5yNoKGEooV2cIZ7hnxzjK2NiYFoZmJqbnJtcIN1aW9YdXCOm5F2bX97fW5ybnCAe3N2bmJ1g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2OfHRycW1gXF1eXFpZYV9STltaWFdMSElGSUg/Q0FCSD9DRD07Ojc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTAxMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpGBk4eVkZ2kp56vlaW0qa6wrsGyu8HFlo+MlI+AiHxugZCSiYOKh4+FdYODbJWIiHx1eHhteG53ZGpeSVBHPj83NDQ4Ozo7PT5AQkVIS0xMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1NUEw3Q01QUUJGfGp1cnJud2dwgYJ3eYB/e4h7c56XeHyEfoOYg5qcYIWpnpyLg5COenaHfomIjnOKl4+Ee1xkcXR6fHeKbWhqYnlvhZCCem+BeHWFenB0enhrbmlddoZ9h3yHho5/ipKXg42FjIZ9cYR/hH12d3t8iXhxdHVnaGBbXF5TXGdeV1BUWFtVR0pKRUxHP0ZAREM/QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTQyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIp/k4yRnJ2eppGgq6CxqK/AsrvFupaOkZOHeoZ2a3+LkYN9ioOOjHiDgHOghIp9fYF/cIF+emh3a1JYTEBFMjExMjc2Njg4Ojw+QUVGRkdJS01PUVJTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklLTU5RS0pTWlZPR2B4f3KAcnRrdomGdXiEg3qSg3WdloaEjJCTpIysqUiGrK+uioGAlIqBioGFkqmHgZiYipx0bXyBhod+jmhnaHl/boWHgoVxhIZHbYB3cnl2aG1rX3Z9goh/h4SLeZScm4mKiJF/enWKdnx4bW93foF1dXNtXF5eXGNkWGdmXFVQUFdZUERMS0ZPSUNGQ0NBP0NBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2Nzc4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5COlZeSlqCdrKCmuK+zvLOXjZKLmIt9dHB+iZJ+fYyDkpR9hn6GpIeIf4KIhXiHiX5zhHhfY1dLQjYwLi8yMzEyNDY2ODo9Pj9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s/Pzg0Ll2WcHOjVUZJS0xNT1dfVmtXWVpigYl8i3l8en+LjHqBhIx9lpF/nZ6VkpmZpKySmbuxprrHw6eLjKGljpOJgZF8cYOen5Gdf3eFhYqPh5BpaHCEgXSMhoSKcoaCd4eAe3aEfG12dWZ/lI6GiIiGh4egqqKWiI6Xf3qBiHp5b2dreH58gHVsZl5aW15qXmFnYFpPTE5XUlFIUEpETkdDSkRDQURDQjw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVvZneCen+Mf4GQjoqamqScoaymqq6wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOhICBjIqCiY2Df4p/bHBqXUJBNC4tLy8uLjAyMjM0Nzc4Oz0/QkRISU5RUlRSU1NUUlBPSEVCPDg3LzlDPjw8NjMubJOXTVBISkxLSk5WX196ZGNobZCPg5CKi4SHiJSDjouZh5ycj6CnoqGpkqe0oafBwq3Hr3i5lJp8jaGemISThYKOoZ+UmZGFioWPmpGWbHB1ioyClYyNjnePhHFthYGKlpGChYhyiKCVhpGJjY+WpLSom4yUooKHkoN9f2tqanyCg4N1Y15lYFtobF1tbF9XS0hOUlBOTExGSVBDRE5GQkNFRkM+Ojk2PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnB2kYZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXmAkoiRkn2KhJiSkIOAgIuMiYaQh4SJhnh4f2dNUj4vLy4sLy4tLzAwMDIxMjU2Nzs/Q0VOT1JUUFBRU1FOUElFRD47PDpERj8+PDc1Mjw/UjVISEhMS01OUV5qhHhve3aTko+enJqTm5CdkZiapJqkp5ymqaeos5aqvaq1x8i2yNDPvpugcGmqqZ+Ek5KFnKCam5mmkZGIlaObm3h6fpSYk6GTl5eBlJ57d5WSqrKIjJaefJOdm42RlZijoaW1r5yRmKeGlo+NgIhsc3N9gX5zamJeYmBiaGVgZ2dcUkVKS09OSUlMRkdNQ0hNRkZDQkdFQjs4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbXxhd459e5OOjoqfkpedlpuqmJ6qQkR9h4mHmI14go2Ljo18ioaPkI6BgoCJi4qFkoWDhomBgId2XmJQNTYwLTEvLC4wLy4vLi4wMDE1PkFBTVBSU1FSU1RSTlNMRUVAPD49RkdAQUA4NjYyPDk7RkhHSUlNTlBZaoGKc42Dl5yfq7WxnqimqKOksKits66uqrivsbybscOqucnLt8O/t6WisLOsrKqji5aYhKWmoKOXgaaZjaKqqKWIhZSkoaGqoKSpj5uwi5Wjpre6m6Cir5KinKGdj6Khq66rsrShlKSph5mIkomVeXp+hoFpYmldZmNfZGRfZ2dfW09DSUhTTkZIS0ZKR0ZGSEFLRkRGRkI7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhiV2hvWHmEdoGThYeCnIORkIyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5GOg4SBi4WGiJKGgoWJh4iHh3FuYUBFNjQ8Mi8xMTAtLCstMC4tND9DQU1VUFJTVVVWVU1bUEdIRDw+PkZIQ0RBNzs8NUM7PUZLSUZIUU5QV36OmoCmnKigqLjBvaWvwbOpsL2wtbqzvLK/tLm5orfEp7XIx7W9uLSoo7OtsLGbmZKan4inr6ullHafpJehrLK0mZaqrqivtrqyuqyvtaKxq7G1u7a0rbSfpqeippmor6yxuLe3p5q1qIukjZCSnoZ4goV4W2NmV2djYmRhYWdhW1RKRERMVFBISUlESUdFQUBAS0RCTUc9ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWVFhYld5dHGBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiXmGgIyTjIeEgY5/gYmPhn+GiIaKh5F7eG5dV0BETjw2OjQ1QUI3NjQwLzZDSENRW09RVVdVXFdPX1VJS0tBPz5HS0ZFRDs+QDdENz9CSkpFRlZTT16LnqifrK25rLC5xsSyuMG7sbG+tLW/sryutXOvsqS5xKOvxriws7Gzp6S1tqqwoKKXm6KSpbCupq2rp6SYoa20u6Kosrq1vL/Mv8XFvb2zwbe6t762ure4q6uwpK+orL2vvLrBwauYuaeUrY6Xl6mIfYN+bVhlY1lsZmtmV1xkWVZTSUdGTFBHQ0hJQUhEPj9CQkxAP01EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUVZTWVVadmpwfo6EgI6FbnpzeIdiuaGZo4mUlJaSlJONj5eSh4d7hoGNlYqAhIGKenyKh4Z8ioKCi4SWfXh6dWVQXGRHRUw7UWNhW15TRz87SFBEWmNRUVlYWmdZU2BfTFNQRUE/SUpIRUVBQEM8RTZCPkhHSkxTWlRdkKqysLaywre0t8XKuLm/urazubm1vLK4sMRfc7CksZqeqryopKirqqOisrWhqqiflZaemKCupaempZ+klKOnsbSosrO9tsK+08nJ08bCxczCysPAvby+u7u2tK+4trbCucW9wsevnripoauNpKe1iIGBdGFkZF9ZY2BqZ1NYYVZSVUlFRU1KQT5HRD1LQT1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtKy9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWQc2tycnOH1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaKfoOAgnh7i4OHe4t5gYqCl350fXprZXB1WV5cUGVkYmBlZF1cWFdcTWRtVVJtbV9uX1hnZFRZVUpEQktLSUZISEhHQkk6RD9IS1NUVVxaW5C0u7S6scG6trXHyLe0uLS3uLG1s7KttLWXY3SnnK1vXqKsm5egopuknqqllJ+fkJOOlZiYqJ6moJ6amYOknq2lqrCtuLC9udTRz9fQyszSzM/Oysa/vsHJvMC8wMDExMTJvsfNsqO6sLSumqu3u5iAfG5fYl5aYGNaZGRRXGBTUUpDQUVGRTxARj5BSEI/Qz06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVtZaF9vlpKQlG5rb3R1h7SsoaGfi5mcmYyNlZGakoaKin6IhouQi4h8gYNze4qDhXuJdIKKhpV/c3t5bG11e2hyZWlsaWZqamhgZmlpbFptc5atpLyIhmdcb2ddWlpUSEtOUEpLUEtTUUlMQUpGSk9fXmFmaWCWtMOuta64ubKvwsSzrrevr7qqsbClqrari7WnnJqmmk2ZnYyOn5aRppillYqTk4mQiY+RkZ2boZeblZaHn5qnm6yvqbCotLTU1NTW08zQ09XN0s/MxMHJ0L3JycrJ0cbMzcLP0bevw7zDuaS1ucGihHFlXl9fWmJZWmZaUV1YTlBBQkhFQkg7QUM+QUc/P0E3O0M+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZUmVWc5CQmIJncW94eYOhqp6ml4yam5eLjZWRmo59iYuFjYqJipCHfISCcH+HgYZ7h3KDkouOfXF4dWxweH5xem14c21pgHBtY2ptcHhod3x+y77B36dtY3huY1thYEpQUlVOWV5PXVxOUE5UUFRUXG5tdoJxlay1qrGkrbOoq7q+r6mzpaO3paqtoKuzoo2wrZmXmIyOkZGEjpuBjaaRnImDi4SLiYSLhJSWmJeTm5Gcl5man5+rrKWooqytz9LV0s7M09TUz9TRzsfD1NHGzdLT09fM0dHE0dbFwM7Hx8KovbbOnnxxaGBkX1hiU19bUFFUUU9IPkBGQUJFPEBBPkRDPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxVUU1OWnWGhYp3bHdwfX5/oZ6eoYyMmJOTi4ySj5WFeYWQkI2LiYiQhn6Ce3F+gICHeoR1hZOQiH9vdnNsc317d3tzgnhya4BzcmlwcXp5cnq+y5p9i7GEdnKEdmhhal1DWllbVmVjWGNqU1hcXWBjXWN3en2LgZeoo6Ofnp+mpKmut6mlsqGhraCiraGmsZ6IppqTkpGJjo2IgZOJapSijJmEgYZ+kYODk5eti5WNlJmOhpORnpeosKKhoaWkqcnNz8jDzNHU0tTSztPNxtbSzNTY1tbY1NfVydTazcjX19HKq8LCy411cWViYVpWWlRdUUtHSkpKQDs6O0RBRDxCQz5HQj5CQjo8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7T0xGSlhwgHV9aHJ4coKJgJ2VnZSFi5WJjomIjYaOf3iDk5iKjIiIi4h+gnhze32Ch3d/eoaRlYCDbndwbXZ/dnh9dIV8em2HdnVvfXaEdXh7nbWMO0GKxaV+jHxpZVdJQ2ZjZWNnamNtd1teZmhrbmhtgIKHkYqcnZ+ckJaXnaKjpLCio7GeoaScn6iforGbhZ2RkZGPioqKhoOPg36cm4uNgoSFeZR/gqmVo42SipeSjH6Yi5uSq7OYm5yonKe+w8a5t8fO0tHS0MzSy8jUztDV2tfX2NTZ2M3Y287J2drR1b7Ky7V6eXBnX1tUV1JcWEZHS0lFRT06NzpAQEI6R0Q/RENBQ0I7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjXyXkZ2LfoeSg4mGhImBh3x4hZaWiI6Ch4WHeoR5cXp7g4V1eYWOjZx5i298cHB6gHF7gHGDh4Fujnp1d3x8gnV+fIaHr3NYqcK2jZGCcG1iPV5ocnBxcG54doFlaG9ydXhxeYuGjZORmpWflIaLkpqfmp2onqCrm6GZmJ2knZ6rmYqZi4+RjYR7h4eDhIuNn5mTiIOHfmyZeoSYhoiTjI2UjIZ8nImUkK6qlJaYn5mnr7a9qa6+x8zJyczL0MnD0srU19nX2NfV29fT2dvV0Nra0dbI1MqWfH5ra11cUVVUYUpDRkpIPkE+PTc6PT87PUc8P0FBQURBPj86ODdEQjc1NTQ3OS41NTY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OTlEPkNHUmpebWRiZmt2gIhxkZCagHqAjX6CgYGEfoN7fISYjYeLfYWHgHeCeW97e4aBdHmSno6gdo51gnR1gX50gIRvgZCCb5KEdXyBhXp2hnuJt8Wkwcm5gZaaj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWk5SOl5CCiY6WmZaVpJuXnpWdkpGWop2ZqpWQkImMkYKLg4iIgYWPkZ2bmYmFi4GFmHqIiZ+XkIiNiouCfaGJkYy8oZiTmJmdqaamrp+otr/AwbnIys7Oxc3J0dbV1dnV19vU19na29fb2tnYztvGiH18amxoYlZZV1hOTEVOQzs9PTw4Ojs9OT1ANj0/Pzw+PT05ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs5OjdJUF1bUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWGVhXVtodHp5bIqNknd2eop7fn9+gHyEen2BkYmEhXqEh3t1fXRtfH2GfnN+kp6RnoORe4Z+eI9+eYqKboKagHSZhn2BiYV8fpB6j6mOj8OhvYyco5x9iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CRhIiKkJKTjZyZkpOPlYyLlJ6ck5+UkI2Nj4p+jo2NioOIkpaanp6Ii5SRnZGBi3+lmIiEjYKFhIGlhoqMt5idkZWWoqehnp6dpK+3urWswMbK0MjHzM/T09LY09XXwNfY2dvY2trZ2dfbuHt8e25saFpiXVRRT0lETEI8PD45OTo6OTk7PDY/PT48PTk5OzszN0Q/NzM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw6RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg2ODk/PUNRU1JYXlVYZm1tbWmBjopxcnmKe3p/fH97h3p8e4uGgn10g4V5cnlzbYB+hH53hZuhm52Ukn+MiICYiICckm6IqIV6oYt8kY2DiIScfZqQiYyjo6CQpK+fipCLhYuBkoZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlIuGh4uSkouTk5OOi46Jh5WanI6UlpCKkZOFf4qHkYyKiZyWmKKihpKdlaCKiYiNm5CDh45/g4eGpIWMkbKYnZKUl6Gin5mSnJ2os7mtpr3Cx83Ixs/N0MzP19HR1a7W1dja2Nra19XZ2aBygHdqaV9gWlVYWUNASUM/Pj46NDg6Ozc6OzozOzs/PT43Ozo6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNiem1hfpKDb213i3h5fnqBfYZ7e3eGhH9zcIWCenV2dnSEgoR+f5Kmo5+lopaKnZCVl4uKp5dyirKNhKiShJmThZmMopWfl5KJm56jk6qwn5CUkI2OiJaMbo23hZrEyLKboaWbnJiWkLGRZKTNyJWOhoeIj5KMjJGTiISJiIWVmZqOj5OShpOWg36Pi5mHjZCql5aiooiYnpaaiI6Gl5eJhI6MgX+Hj6SIjpOompeTl5mhmZ+Zk52bo7O1pqO8wr7HxcXJyMnCy9TNzdSp0tHW1dbY2tTS2s6FdYNrZ2FgYFFLVlxCQkdDO0E9ODM3Ozw6OT02NDk6PDo4Mj85OTI6STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0SlE8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCZYNHdYKOfHxtfoh4en56gYGDfnZ2gIJ7bG6Kfnl8d3h8hIaLfoujtKikq7OhlqegpqSWla+ig5C4lZGzmoyhoIykm6+jpZ2YkKeXqZmusKSXlJWUkIuYmpagwI6jybirmqOlrZmRm5yynYaFqKKcl4WIiI2Ui4qSj4aAhYaIkpeTi4qTkoaTl4WDkI+bc5CYspWWo6GInJmTj4qQipaaiIqWjYZ9jJifipCQnJqZk5mYoJSgnZSem6GxrqOkuL+0xMfEvcPDv8fOy8nSp8/M09LQ1tjSz9i8dX16YGNXY1hSSUtPRkJDRDU+Ozc2Oj87PDc9NDI2Njk3NzQ9NTs1PEs8Pjs8QkE3NTw7NTI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdNXF1ZSmhhO0iEi3p6bYWGeXyEeICFgX1weHx9fG9yjHl9gXt4houJhoSSqLytqbO9sKWus7Spo6KwrYqatZ6juaWVrKSXqa24pqWjn5mpmKqksLGqmZiclJWRl6CXmru7rcqhaba4qrCVmJ6iq5KXvaNeqbKCiYmMlIaQfI6NfIOFjY+Tk4iGkpWLjpSMioyWmJGbmbSWlKqdi5uUkY2QkouYmomRnY+Lipafoo2VjZiZnZKcmJ6UoaCUnJ2mrqeipLO4q8LIxLW6vbzGyMjC0KHGyc3NxNfW0MrTo3N9bGBdVmJUUUdEPjxDQUE3Pzg3ND5GPDw2PDM1MzU1NDU0QjM5OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGdIYWBicEpAi4l+gHKHh3yBiXWCioN/bX18fH5wd4d3jYGHe42PjIaMmqvDwLC9xryztMG9tK2ss7aMqLKtrr2rm7ujqK25uKunpqKho6Oqr7Kxqp2co5ibmJeeoqalkqO5r6i/vKytsrmlo6d9iIadrbywgouLipCDj4ORjnmBhpCMjZuHh42WjIqUlpOQmZabp5qxmZCqnI6aj5GOlZCPlZaOkKCQiJSbo6yVlo+UnJ6UoJ6bmJ+glJqfqKekoqOws6bAxsOwsLu2xcTDvsynx8PHw7zW0MzEyop3dmVfXWJeT0xDTEBFRz9BPkI8OjQ+QT09NT02PjMzMzI0MkExN0BCTT5HQENOQ0E9Qzw7ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxpRl9pZ1tdXJOMjIh7h4uGg4x1hpCKgW9+e4F+cX6BepR6kpSVmJCTlai0xsnAwszCw7nIvbqwq7m7l7K2ubLArqXApKuwvL2qrqujo56nrK+1samboKqcopyWn7C0p4yjurq1wburqJyypKSolISOqsTDpIKLjoaHhIaVlIx5g4yQjpGgi4uTkI6Hl5+XkpiUlqWgrpyMqZyNlo+RkZSVjZCUkY6hk4aXn5+zn5SblJ+hmaSfmqCboJSYn6akpaekr62lv8PCrqi3tcnDvrbOssS+w7uz0cnIwbV4fHBfW19tVE5JRExMTEpAQT1CRDw1QUQ7OjM9OEIzMzIyNjJBMTVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJoXU1lXGZUY2qajZaKi4iSj4aJeYaTkIFygHuMf3eHgoGPeY2hlqiam5i6vsnIysLSycvCzb3Bs628v6e6wL28xLiswamts7y+qrGqpKWjrK60rre1oJ+un6aimKO0vKmcqLzBo7a2r6uTsKyqrJeGmqqnpZCCjJKklYmAdYmReYSMkZCdn5GOkoqOi5Oil5aalJOhnqmekKSZi4+Pj5WWiHyOlZKRopqUoKKctqaQn5ekpKOln56mmJ6Vl5ulo6ioorKsqLvAxK+ls7fMwLquw7O7vcG5rMLCwb+acXxkW1peXUxNTktHRUNIQUFBREs6NERIOjs0PDdGLjEyMzUyQTI2U0hOPEpCSlFFS0NFRTpFTEI8N0VWPTw9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+bEpfWGFaZGVYno+djpaOnpKJin+Jn5KEeIV/lH5/kIiJkICWoJqup6SYw77IxMjG0s3Ozcu8wriwur20vcu7xMK2tryttL+6vK6vqKGoqLaurqmyt5qerKKoop2rt7eqpa++xLG9ubOnqrSzra2XlaWtqaCRjpKxxaeUjnyRlXyGkJiPqZiXkpKOkpSSpJySnJiToKGhm5iel4qMj4+eiFqPlpeSlqSZZpmjnrOllqOWq62rp5yfppeZlpiVoaSopp61q6m6vMK0prS1y8G4qrWss7u4rqi4ury3hHBxXVtXWFBHS1ROSz9BR0RESEZGODVGTTs+Nz5BSy4zMjAyNUI1NVBXTjxMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVjw+QEJGQnNGaUlSZmRNRqaUnJWhl6iWjJCDhqWSiIGHgpqDg5WQkJOOmqGfr76uoce+xcXIx87OztLKvru2sbu7vL/PtsS+t7m3s7K1s7i0rKecq6y5q6mosLCYo66lqKSltMCwq6y0vsK5wLmzp7i0t7KvlaStsLCli5OUoI1zwZl9lpmEjpaZi7CVmZmUkZGZmKSilJ6alZmonJqhn5iKjI+VnV9KlpyalJmkl1SWsJ+vnZ+lla+wraWboaWUk5mYjp2fpqGZtKmqs7y7u6uwssfAuKarq62xsaOhsrK0pXNyaF9dUVNNRlFRUFE7SEpIRkdBQz05S1Q/QTo9RU0vNzUzNDpCNDROV048SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzVGQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFg8OkJDQD1SRVdTdGJWRkirl5mfoaiumJGXh4qnlo2IkoSfh4Sdl46doJqjpbXJtanHvMPEycvJyM3Nx7+7s6+6uMDCzbXIu8G5trqyr6+0taeknKu0tauqpq6smqStpqWprLq/qKu3t77BwL63srLDsLe9rKOuta26poialqWbdb6fhJmdjpKYmouulqCbmpaUmp6fqJ2mn5mZqZmgpp2Wj4yQnYJtdZKimpWcop+QrrKiq5aqqpirr6WloaWqkpKZnImVnKKelrCmqaq6tr6zsq6+ubago6eopaacnK2pqY1maWNiVE1OSElPSlVMPUxETUlKQENEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQzo5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXPDo9Li5TYUxWSH5lXkhGrJWcoZ+7rpiUnouTqpuRkZOIqo2Hop6Mo62Uo6S2x720wbvCwsjJxcLOyMK+urKvubXAwsq2xrLBvLW7rKmtrbGjo5mqtbumqqesqp2or6ikq6q9u6isvbS3vse8trW4wLC9wLOqtbesv6aPopaQoJ+7nomaoJiWnZ2Otp6om6SimpugmaeksaCanaWcp6mcl5OOlJuKloiMpKGUnKKeoLWwpKWTsquaq62fn6WkqpKWlaCEkJ6fnJWppaGhs7S6tq2otbKynpyjpZqXlZmqoZ54ZGBhYExJR0hOUUlNRUZGQlFKSEBER0FWU0RIPEFHUTE6Qjc6QkY3OV1ZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRKiXpJ6fw6ybl6SXmaiblZmajqqWlaimlaytmaKrt8XCvL+4wcLAyMS/zca8vrmysLm0v8LItsCwvLe6t6ekq6ytoaGbq6vEoqWorKaeq6+toqqovrimrb6wt7fHt7S5uL+wvsG3tbK1sL6klqOVkpqTrZ+QoaKkoqKekL2kqJ2oq5ycoJqln7yil6OeoaiqoJyUjJSdk52GjoSNk56koJ22rKacl7OnmrCooJyrn6KNmpaghY6hmpySpaWal6uxtrKqpaqtrJyYoKCSjpCWqZ+UaWZcY19RSkhLT0xHRURJQD1PSEA7RklIW1JQSz1ITlU0QkY4PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLS0wTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9TRjxLeGZjWE6im6ObnsWroJ6rnZytn5Ginpakn6aqq5e2saOqs7bFw73Atr/BvMnCv8rItrm1tLG0tLfCxre/sbi1urWgp6yrrJ6en6WkwaWgqq6gpKmtsKKmqL21pbG8t7a2w7Kzt7q+ssPAt7iutLW1o5yklJGToKyemKGcqKiqoprBrKidq62amp2YpZ+9oZykl6qqq6WgmI2an5KdiI1Xf5aepaGguaqnk5m3o5+zoqGcsJihj5uVnoKPoJeXjqKjlZClrrKsqaKipaSVlZyYi4+Sk6SfiWNnXGViTkpLS05GRUFHSz49SUE6OEpKTl1RUUk9TFZcOUZJPURNSThIY1xLQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2FTNlNaa1dzSEU2PXVlXExQnqCgmJ7Dp6Sis6CbsaaSqaOfo56tqaudu7GprLWxyMTBw7PCw73HxL3Fyr2wsbausbWvv8W1urGxurasm6mwqqqbn6ahp8Gtm6yxnKmirrGqpKi9t6a2u72vt8Sts7TCv7LGs7q3q7W2rquipZWVk6KroJ6fmqeqrq6vu7Gln6ipmZiXkqKjt6Cho5GtrqukpZ2RoJ2UnY6QjJSdmqKfqLWnp42ZtZyjr5ufnLCRoZWZlZuAkqKWkI6goZOLpqywpaeinaCekpKak4WLko2cn4BkaF1oZktKTEtTQUNASUc7O0Y+OTlOTVVfUlNKPk9eXj1IUEJNTEk4TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQTdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHddXj9bVV9nckA4PEiWd2VBNJ+knpqgwqejqbGgo7SplbGrpqKksqytqbuzrbC1tMe/xMO1v8S+ysW2wcnCtay1qbC5rL/EtLivrba6ppmrsqyrmKGnmK27tJyosJusn660sqequrKnubS4srnBqrezw720xae+rq23tamorKGWlpGlo6Ghl5ekrretsbS2n56opJmTlJOjoLaipKWVrbGxpaikoJ2amZqVl6ign5minq+zoqaNmK+apayYm5+nk56QlZmbhpeglI2QnZ6Ti6mpq6GnoJqelo2PmZCChpaJlZ96ZWtebGtOUU5OVD1DQU5DOzpJPzc3UU5dX1JWUUJXYF1CSlNIV0tIOlRkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM5MDZwW2JIMDVKcWpXRFdGjHlmQzukpJygpb6lqK6uoKm1qp23r6ujqrS2sbC4t7C3uLjFvcPHvbzDwsjBusLGwrqqtqWtu63Bw7i4qq2yvKOVrrCus5emqJGquqqgprCdqqCvtLOqqra1rLuss7K6t6y5sMK6vb+mw6qwt6+pq6umnZiYqqChoJGXoLCus6qwuJmbqZ+ZlpGXpqC2qKWioq+ws6uxpqqfm5+fmp2lnaGYnaO0sJyfkZSmm6GpnJajopiajJealJaXnpSJkZuZlI6pqaefo5yZm5OHj5mLfoyXhY+bbGluYm5vWFFRWlRBQ0RVQDs6SUE3OlhQZF5RV1dFWV9eTUxTT15MSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1ERkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNzQ3Z1lhRihAOG19aVxWO4l7Y0M9qJ+coam8oKqvqqKwt6iks7Kroa21va+zub27vbe3wcK/ycO5xMPBwLnFvsG4sLaoq7eyvL+/tKqvsrifl6utqa6YqamOp7ufpa2zn6uisbCzrKq1s7W8rbCxtaywtbLAusW2q72vsbesraqjsaWepaieo5aPmJ+yqbKpqbKZnaebmpSMn6aktK6noqysrbCnsqqwqaKbnqejnpWhmZyotqmYmpKSn5meoaCSraGbmoiXmoyemp2Ui4+Xl5qXpqajoJ6WlpaTgJCVhHuPk4OMl2dtcmhxc19HWWZWRENNWERaOUhCNT5dUWhcT1pdR1tfXk5NU1hjSktDXGNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7R0RGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FWMTUxPWBWXzgpQzNZVVxoSzWMemZMQKWZn6SstaOsqKSurbWorrO4pqewt8a3sbe/wcK2tbrFvszFucPBusC6xbjBurO0rKq6t7u6vrWrr7G3mJiorKusnK6rj6u9nauusaOpn7Gts66utbG5tqqtr7KotrC0urzJsqq1tLG0sK+nobOfmqirn6SVlZqZsaKtoKWvlqKkmZmSjKKlp7Kpoaaxq6m0pa6vs66jmJ2tp5uXnpqarLiimJORj5icoZmYla6hn5eDlZqOnp2al5GKlJOemqWjo6GZlpOSlXuMkIV7jYuDi5Nsbnlvdn1hRmBqWklIWls9e0pHRTZBY1RpW01dYUtcXVtSUlNiYUxLRWBhYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuK0EvSkdQW0czY1hUTEWalp+wqLCprKSjrq21qLazt6Oss7fJu7W7u7++tbS3w8DMx7zDvbe/v8G4wL2yva6ourq4t8K3rK6xupaXp66tqaSyqZSvu6SssrKmp6KytLGysbWwt7Oprqyyp7ivtrTDxbaptbWrsK2qp6O2n5+nsJ+jlJuYlLGep5ufqY2pop2blZelpaS3p6Kxs6unsKetr7SspJigrKicnJ2claq5nJWOj4yYnaKYkZmopKGZhpSYkZ6cmJeXiZeQl5uonaWhkpaSkJV2hJCGe4aChI2NbnF4dnyAXExlbFxLT2RdP2J7R0k4R2hXZVxMXmJNWVpXVFhVal1PUEhhXl9QS0dRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSWcyNydGYUxWJS1CLj1FTFE8M3JqTEVEkZmkraSsraqlorCxsqm3r7Wfq7S5yLmuwbzDuLOytcLDzsTAwr61vsDAu7+9tMSpqrmxtrfAvLCstLSeoaexr6ansaWdsbWsqrKwq6iotbqstbK1q7OsqquprKm5rrKxyL+4pLmwqa2tpqitsaWko66jqJydm5qumaOioqOQrJ+joJ+hqaaluKSrtLSkqquprK61rqKdo6iqnKCam5OktZqPiY6IkaOhlo+Wn6OXloeRlZWem5mXlYiYk5WZp52hoI2TkY6Qd36PhH18fYeKinJ0c39+fVxTY25eTlpnXUZElltHOk1uWGFbTWFiTlZXVldVWWheUVNNY1tbVEtGT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0RlOzYqSGRISis6ST8zQ0lTLD6Pa0BISZCaqKmhqK+kpqOzs7CztLCwoKutvcy7rsK9x7K0rrTCw9HExb/Cs77Cw7y/uL3FqK23rLO5vcCxrLKtoqSnrquopbCjqrCqrqqxrq6sq7O7p7ewsaiyqqulpaOvuqyqscK5tKy5qamoramnsaWppKKtqaiinpuirJWlnZeemaydoaeooaymo62strCxoKmioKqtsKydnqenqZqkmJmQoaiYhoSPi4qfoZCNj5iekpKIiZKWoZ2WmZaHl5OTl6WdnZ2MkpCNiX9/iIR8d3+HhYZ1dHKJd2xfWV9uYlFzcVxLO4R8Rj5XdVdhWU9kXE5WVlVXUVxiX1NQTmhZWFdLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTM5ODsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDI9XkswLklnREY4PEIwNUVLWDFAlF1ATkaVlqynoKmxnKeosLWsuLWtqaSrqr3JvLG/ucOvsK2zxMPNzsO/wLPAw8S6wbTJxKyvt66zusC+tK6urKepqrGpp6ixpbOtqq+trbCusq2zu6W3s6ysrqirn6Oesberqq26tqS1taSqp6usqq2gqKamsLGjp6WhoauWqqGTm6CmnqOiqqOsop6msbasrKKlopqpqq6pnKGlpKSZoJmWkJidk4GCkImFnaCNi5COnJGTjYWPmqWbk5KbjJOSkZSjmpyai4+Li3yGgoKBenWBg4F+dXiKooZ4al1fbmZXZYdkTkBnkkxEYnpXYlhSZlVNVlZWVE9cXWFWS09pWFZWSEpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC4yLCYwN1haLjBKZ0FBPDxDKzpKT140RIdCSUlElpCupKGqr5epqK21qrWxqqSrqqm8wcC4urS8taazr8TJy9K/wbu4v7/DusK6wcSusbWytLzBvrOyr62srae3qqatr6q3rqewr66xqrWqtrantLerrKSpqpyknrSzqKiks7Sfta2hqqirqKunn6usqLi1qaqpqaKon62bkaqhnaCkoqaiqp2cprSup6WpoqOXpKanqpyipKOgmpifkY+PmY1/h4yHhJ6eiYaMjJGRk4+FiJejmo6Om5KSkI+SoJiZl42LhH90hoJ/fnh1g397eH5/h52PcHFmZnB3XGF0iGpPXZhWSG15VWRWUmNQTVZUVVFPWFtiVUlRalVXVEdPWFVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UyMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIvMjIlLzNSYzAyP2Y9Tlg/Qyw/TFRfL0lrN1JGO5WMr6CkqqyZqaOtrrK0r6mkr6mou7+8wbKwua2itq/Ix8jQwL+9urzDvrvEwr+/r7KzsrW9vMGysrSrtKmltamlrbOyuK6hrLSxr7G5q7muqq63q6qeqqugo6G2ramhn66yoLSqn6inqqKqoaGsrai9rquuraGnp5+smY+wopiioKinnqebmamwqKKfq6KhkqGioqeZmamlmJiZnY+Lh5WIfY6GhIWkl4aDhI2IkZCShoeWoZeIkZ6Sk5CNkZ2VmI+LhoZ4dIF/fHR3eYB7dXR7a4OHpHZpXmVrgHVniIx8UlZvXkt4c1RkU1FfTU1TWmdOTVdZZVlHU2pSUj9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWg6MzhfPWFkP0YxQ1BbWytIUDtZQzOPjbGgo6Wqo6OirKazsrGopLCnqri+wb2xqbqqp66wycbI0MO+v725v8C9ybzBuLGwtbK6vLm/s7S8rLmso7Smpquxtbexpaa5tKyzvK+8pa2ttautnKmvpJ+krKqonJ2qsqOzqJqrp6mkqJ2iqaepvaq0sK6dqaSgrpyas6KWpJylpJ+lmpqoqqWemqmhm5GboKSdmZaoqZGZmpKQi4KPhX6Pgn+In4+HgX+NiJORkYaDlZuUhZOijpSRi5Gbk5aHin+AcXp5fXtndnx6dXFyfmqGeYWIZF9nY3KFe21oeV1eVUFXe21UYlBSWUtMTnB0XUlaW2haRlZmUEM+Sk9EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpGwmJ6fqKShoauktrGxpKmwpq25wb23saS5rKior8PJyMzCt72/tbjBusi2wrW0srWyvbm6vbauuba/rKKzpqqqrrS2s6ibubuosL6yuqCutLapq5+tsKOcpampo52bpLCmr6Cfqqmnoambo6igrbynrrCuoaqipK6enq2mmJ+boaKcn5uZo6qimpmjo5WWlKChlpuWpayMn5KQkYyCioCAj4B7mpWNin2AjYiSkY2LhpOYkYaUpIqTkoiQmpCUgYl9eWt9dnh4Ynp6cW9xdHhqgnVrgmdjZ2Fuc45tYmpvYG9AXHlrVl5OUVJLSU1UWVZNXF5tV0VZYFBeT0hNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUl4+I5GWrJiel6eioJ+no7evraKvr6isuMO7tK6gua+rqLO6x8rHv7jBva+0v7fEtsOyr7qxssC2u723qrm4vqqktKaoqa+tuK+nl7i8o62+tLSgrbi1p6ansLOfnqWmqKClmJ6sp6ieoKqvp6Cml6Kon7C4n6Sxr6CroayknKanqJqbm56jlZybmp2pppabnqiRmJKZnZOZlqGqkZqKjZCHfYd+go58fKGNjYl6hI2GjI+NhoqTmo6IlKCKkZWCjJeNkn2FfHNwfXFzc194d2lucXFwa4BzZHpsZ2VjYWaGgGBbcmpyTU2AaVhaTVFMS0hQU1BHTFtgb1RGWVpSaE9IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MF1cNSiVm6WYm5Wsn52ho6C2q7CjtLOpqbnFt7OuobitrayvtcXHwLe/wbmwtb23v7u+sKy+sLO/srzCuKq7urinp7Snp6qvq7KvpJe7taSrurWvnrG5r6mlp6+xm6GkoKSjoJabr6ahnqKor6GgoZKkpKG3sKGmsaufq6OumJ2qpaifmJqdpJOZm5qdpamZm5uklZSXlZyOk5eiqaKRioqQhnqEfoSLeY+Xio2He4OJhYqOj4aQk5iMjpWZi5CXfoaXjJB6gXtwcndub3Ned3ZkbGxsa2qFbmZyaWplaF1kc4FgW2t2aVpKf15bWE9PS0hIU1ZHMzleX2xQRVlWWWZNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFRdaEQuPDJkVywxlKGhlpSbqpujoaKhtqqtoLu3pay9xbSwr6O1r6ysr7TDw7yzvrq2sLO5uLq3uq+twLOzuK+/wLesvbq1paKyqaepsamrsJ+Zv7Skp7S1qJ6yvKmopamvq5mip5yjpZSXoLKkmZ6kqamcop+SpKCkuKmlp66nnaWhqJOgqaKhoZmbnJ+RmZuWn6Gqm5qYoJSRlJeajpOTpKikkImKj4Z6hHuEhn2djYqLh3uChYiJipKGl5KSi5CVlI6OlHuDl5CLd358bHRybGtzYXd0aGhqaGdwhmhoaWRmaWlgamNqaFtme2JgU3RUXFtSTEpHSVBUQCEqaF9pTURXVV5gTEpIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z1AnMp6ipJGOo6eZnJ6do7Osp6q6tqesw8G4sayjtq6nra+3v7+8ssG2sK6ytra4tratqr2zrrKwvL63r7u7saWftamlpLOmqK2cnMCqp6Wvs6qstbueqamssKWYnamdpqSRmKWsopidpKmhm6Gblp+dp7WmsKquoKCdnqGVoKagoqCam5mbkpidk6WdrKGXlp2Uk42Vl4uPmJupoJKJiouJeYV2gYKBnYeLg4l+gIaJh4aRhJeUj46PkZGRjJN7g5WPhnN+fmZ5b2pqa2Z0c2tiZ2RkdoFjZWZmZWppY2tyW19ZXWxjYU5pWFpgVkpHSUtNU1g+OV9saEhDVlRcW0lKR0ZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQmhIJTWao6CPjKyhlpaglaSysaKyvbahscW8urKxo7esqq2puLy6uq3Asa6urravs7izqau5sa+us7W6tbC4vKumnrSpn5+voqitm6G/n7CjrrGvt661nq2vra2imZ2mqKWflZqnpZ+YpKKonZqfmpOcnqyvprqorqKhmpuemZ6kmqSdl56Ym5SYn5KolaqnmpOampKMlZmNlJSbqqeOjoqKj3uCc4GBipiFh32JioaGi4yKk4WVm5OSjo+Rl46Qf4CNjoNvgX9meW1na2lmcHJrXGdjY3SBYmZnam5sZ2pqaG5dbGxycGBUY2ljZlpJRkxNT1hRUVVhZYBVQVdTWVRGSUZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlBMS0rLjM8O0s2MC4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyY0kaGbjY6vnZiToZqpsa+euL+1oLTCu766saa3r6etpLa3t7asu66sqqu2qrO3rqaytbGuqbC1tbCztbmmqJ+1p5ydqKCnq5qnvZeso66wtbWtraCxrbCooZuco6unm5SbpqOdmqmipJaan5uQm6Sqq6m7oKekoJiamZ2hj2uilpmccIKVmaN/dZGpp56UlJ6QiZiagJaKopB5h5SNg21pf3eDcWyGi4Z+hYyHcV9kYWeEmIVrio2UknR3i4R+g5CAZ4eAZ3VoZVdcaHNuTVBpY2dyhWhfZWZubWpdYGGKj4OEZU5LRDlHVGheSkhRUFVVTEhTYXB0ZUZbUVVQRkhFQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUFAQD0yOEBFPTEsLDA4PUc3MDEuKi4qLzU2OCwjMScyMTQ6MTc2WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoukmYaVsJubk6Cbqqyqo73Fr6m3wre9vK2mt7ClqqK2s7KysLmsqaastKWvtKOpt7W1qKertrKttK2yoaiesqmdoaOZpKWYq7mTpaWvs7etr6WqrqqspKGenKCmppuWoKWkm5unpp2Tnp6Xj52nqaS2sKSiop2WmJeXo4ihjpKahqCHkpygf6V/paqekpKakYiEc3iNjoWIoXaJjWmXiGZ+c3igb4iHhH6PfX+hoKCZgH2HnnOGjnWbimyHgYNtaWVjemxyYVOFbWJsaZhxWGlxcIhZXmlbbGxbiHJuenKFZoaEWl9HTj9HX05GUlZWUVFSV1VnXU1WSVJST0ZIRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk5LzAxLiouKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3LyiKp5eDnKudmJidnqqpp6q/w6+xury2wL6qpbewqKylsrSurrO2qqiksK2ltLKcrrW2tKanp7KwrLKnrZ2poLCnn6OimJ+hmqyzk6OlpbW9pq2nq6qsqKShoJifpqOZmKWio5icpKiWk6Kbk5Kjpaaht6SkoKOYlZOXk5yIr5CXlImpi5ahnIWxgKOsnZOZnZR5gtSogIeVwZzGeXixpbeXZYDAnL95hIV6koR9kJCRynKXu5zFenK1p7qQe4Btl7GrsHlobFixrm5labySvG5nem5yj9h+U2tjtrJ+gXKUc5qhqpBXT1diT1ZORlVbWFFRU41dV1tRQV1EUU5FSEk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT46Qjw/QTg6Sj41MioyMkJFLy4zMi4rLygtLzE4Ni0gLzQxNkExPTlXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjKeTgaeqn5ecnaWssaiwwr2ytcC1tr7BqqazrKyopq6zqa61s6anpbSlp7itnLOxtaumpKexra2wpqqcpqOvoqCfnZWZnpytq5Odop+zuqOrqaKtrqWhnJqZoaefl5qnn56XnqankZymmZOdoaaiobGjn5+jlpaSl5KZha9raoqNqn5mg5WGrWRwnZ2UmaaUcK6hpH54u31soZB2sV9qtFulgGWckGFng3tngGt5a6llvnFnpot1sWp7sXh0kpRjbm2nbluEoUVoZoeWRXWcYH5nfKSnglpgjKtogJR4eWqnN0qvXFhTbGRbS09YX1xXVjtOik9XVy9JVFNKREZGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MDMuMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWDMwG5CilYOtp6Weo6Sqsbestb2+sLbEsre6waaosKquqKivrqOwuq+jpK2yo6m4p56ysrCjpaGprK6rr6amnqKhr5qhm5aUlpqaq6WVmqGes7OirJyjraygnZmWn6GonJieo5+bmaGmpI+copmWoJ+qnqemoZqgoZaVkZaQmoW1m7V4hamZtZl2hrObt36TlpaplH9rgaZ7goaIk5STd6tna7Fcq3qNhpR0iXKPh4GBiZCXeIKBi5eLg6CPhLB2d59xbGxsfItOpFhIYmKZfmNopmB5cnVTk4deUaltY3F9hoBinC5RoW9bU2toYExKW2RYXFpCPrJ7WFhBI01oRkNFQUBBMTk+ODg6ODQ7OTk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QEZCQEFEPEZEOzAyMDE7RiwwLjg0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o4YVU1MBuUoJWIs6amoa+pqLOsqbu2wrC7wa24t7+prK2traWssamgrruqoKezrKOrtKOmsrKno6Kepqqxp6+npJ2fn66VnpmUlJSXnaygmZmkqLWvoqqPqqiqm52Ul6Clp5qenKKem5+ipKKVm56XmZyiqZqmmpyboqGXk5GSk52D1ZOZuXCwwX7FhnzWlJu7fJqVpY+NnY2ke46IpIOlg3qseY+dVq96iH6fa7lbuneHhH6mgpR7l3qqeI2dj3qxbo6EdJG8hW+UUK+nxYpRoHpjYKpic3KIbZeIYFO1tMiFgIl8Y6QzQp12XVBqaWNQQFhoWmRhSkhNcVBcUU9ZZlpDRT9FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw5O0RIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdIOmFQNzElm6KUmLKoqKa0qqW0qaS8t8Gwub+wtbS6srSnsK+ir7Kln621p5qnuK2ir7Gfs7SwoKSen6apsKizqKObnJ2qlZiXlZWTlaCpnJmWp62wqaOfj62iqJadlZugpaCXoaChoJqhoaebnqGelJiapqCbp5Wbm5+hmJCSlJCdiLJuaLVxq4dujqZytHNytnual6SLj52Non6RoaZ/sXeDkdLSdlyue4V/pG+bqqZrh4V9rX2YmY57sXGSno53s2WXdISeb55nlFHIi1rCXKB5Yl+sYHVzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNlWEFQa2BsaFBWR0o5PVVSWldYSUQ/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1gTDYyMKKdkqWxraOrvK2mtKantbq8sbq+trWzubiypLSyoLCxop6rr6OXpritpLGwnLS3qaClnqGppLGnrKmjmZuZp52Vk5eXkJGhpp+Vk6WqsKailpOtoKaSk5+bo6WelZqlpqCaop+tmaGenZCUm6GdnKWVnZWZop6VmJWRmoWse3eodqONiIapb62KgqeDmJihipKbi6J/k5qJroSAgrNccrNSrn2CgqN/cth+eIZ+j52Gmpl2r4aHkZyHdrRhmmWagoKVbZJasFhLmnWYeWZgrF51d4homIhrXa93lZ6PeGw1eciusl9CVG9eZ2BFUGxgcG1WVk0uZmVpU1lQO0JFQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTY8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdCX0g6OTmgnpWgubCXtMKuqLOoqbK6t7O3vri3sbS6tKS3sp6zrJ+fqKuelKe1q6iwsaqts6ObqaCfp6G1pqWpopiclKSgk5Kbl5GUoaSakpCmra+moZWZqqCijpChmaekn5SZpaicnKSerJyhnJ+Mk5+anaGYmZuWl6Kgk5ePpp2GqX19pXihjo2CqnCti4GnhpafoYmYmIijg5KIlKt9gIudeW+xWqiCgoifenTZgHeIdKiBjpuMkqR7lI+fhHqyXp1koH6DlW2SXatbWpOAkX9oZ6pjcXyCa5iHc12rWomgjmtvZU9KQ6FcW0x0XWJnTlthX3FzX0tXN0qcmFhHRT1IR0FNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDUuOj4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSF9DMj84op6amsGrl7TCrqutqaW0sLewtb65uLGwtbqourOfr6SdpKamnpOpr6iuqLSrqa6hmKCgpqSjuaGiq6CWmpChn5STnpmTl56fkIyMqLCwp56Xm6imoIyRo5enqqaUl6innZ6goq2koZ6hjJShmJ+gkp6XnJWdoZWWjaqcj65tcrRzqYt1iqdztHhzs4CRpKORnY6JpIeQd7hwjXuLomprtlqhhWWXl2mgoqdulHK0dJOZfrJqhZGHrWp1s2GdZqJvh5Nrl12tYE2hfIaSUnOja3h/fm+Yh3Fcr1Y8nHdmVG9uLlynT2NTa2VibVljXWFwe2NUW1I+PW5xM0NCQD9MOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1RkxeODFDOKacm568oZuywK+tq6unt6m3rrW/tLqvrre2qsC1qKmhm6WjoZyRqamntKKyp62poJecp5+kq7ido6yalZiOo6KVjJ2gm5icn5GTlKq2sKiZlZysqZeMk6WYpKyikZWqsaOfnqarsZmho4+Yopafm5aclqGTnKmclI+qmYfUkpq7c7DDgMOGftWWm7h4iJCYjJiLjKeIeqS2dX53dsKCmrJgg7p5wH12uGO1gYyHqX2VgaupcXt/dLyIp6BpnWGmjq+hfox1h6p9vm9zvHSyg3R4gYpumohxbo2kdL1ed31aYXm8a1pWXGp5XmphZmdjbXdvWVxaQ0BAdEBDRys0RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgYF9fWlBQUktFRko0SExSQEpORUZPQj1FODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnm56ivaGXssOwraqqq7Gmt6+2w6+4sK24rq3AsKujop2joZybkKijqbKktKWspJ6VmqqYpqy4nKGtmJSfj6Sekoycop2XnZmRlZKvubKslpikqKeUkJakm6OsnZCfqKufmp+oo7Sfo6WOp6GUopqcmJWjmI+vn5KUqZ6FkJi2f4+RjLeVeIKTmrV3bWtuc295kIWPinSfwbu9mnuBsahwgHORuYN9h4aNh418ioeNmHyku7m9nHR5tKN0d5d2dLB1mZ5mh2qNtXRycXi2jF5/en2JaIN5bnpji6xwdYV/WFunakVlWlRmYGNeY1FnZ3BsdUNOUU1EOltNP0ozOy8gOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVzgqT15dPSs6VlUnPjs8p56hosCllrXDtKuqqKyqqbmusMWts7Kttaazt6upoaGknqCdmZOqo6yqpbWnpp+blaCjnaukvaagqZaTm5ChmpGOoaehkpyXlJiUsbW3rpmepKSii5KRppqlqpuVp6Slm5mhqKWnpKqhkq2el6Sel5eXnZ6Pr6iTm6WhjWp9aZqld4ZyfZqOdHlkh3u9vsC6b5ODcpaIYXNrWl+bimFjiI+Va2CAlmRunndjlmyAmpWUZV5gYnCZiGlyi32GlWdrf3J0eH1/Ylt3dIFoUF1tg317i2tYa3qCc0pKb4ZwTnRMRVhdZ2FMW1dnY19PW210aXFSUURFTTtHSTxNPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTX1Y0KVBfTCgyPVtPJz8yPqmgqKLCo5u1u7ajrKWup6e0sazIq66yqrOivbCxpZ+ip52jm5mZq6auo6S0qKSbmJSgmqWtp76nqKSUk5qVn5mSl6SpqJCekZCYnLCzv62cp56noomTkamaqKOamqqgo5mao6eso6Cso5qxm5SnoJaVnZ+dlrCkl6CnmJqQm5uhoZekoZmcmZmZj5WBZ219cXeSmJSShoy2q42GmJaOioyYloeUlYuEk5SSiY6TlJiUmJaZn6GZmpOgnI2CeqWFbWt9kH2AdYqKgXGCeHl2dYl/fIpqc4F0g3Vld313a296bV9kXXBoTVlaZmpgV1pveG1tZlVPRlI5T1lNUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxcYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSiw8LUCzoLOiwKGksrK3oKmlsqelr7Sqx6qrr6WzpMCns6Cdo6Sco5WVn6qmrKKitqufmJaVn5etqaTAnqujlJGalp2YkpShnp6ip5ORmains8Swmqudq5+PlpaonaqbnJ+rmKGanKKkr6eipqifrpiXp52ZmaCenZuvoJyhpZSWkZeTnp+UoZ2XoI6Wk4qKjY6XrpB8lpyDkoKLq6mFgJmXiYSPnoh6hJCIhpqSiIeKlo+bl42Ql52jlZiSkJyNf45nobOvhYqFdnuSin13eXpvZnmPgYCJanWBeYhzaXN/e3aDhoJqdWR6ZmBqZWNkZmtZbHtvaWpdU0xQRF5URUA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaW19iY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RcUTA1TlsxN0UzW0c1PCxAtKC5sL+srK+ysaCqp7Ksoqyyr8Svqaqisa28orObn6aioZyYl6elqaWkpbK0npSTnZmZr6WtvqCropCQnZmZlJCVoZyXqJyEnquso7TItKCqpKqWlZeapp2omp2jqpSen52gqq+qpqSso6+bn6Chl6SenJ6crqOYnqeSlpabkKKXlqecmpZlgpJ8ZX6NmpBjeY5taGt7kqWramWbmH1nhoplZWloe46ij2xojZiRo3draoqYop6Xc2tteoSOiHpYZl6Gg15tjIqBdlxoc3d2kYCIgm54gnh/c255hHR2iYeOg3xqh1lebHRkXXOJaWt8cGtjX1JOV0lkWEFKND5GNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJVV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMllDOz8uPaagury6r6y0saqlqK2usKatrLC7sKimo62tsJ6rlp+jnaGZmaaqnK2jpaepsq6elKOPoq+ltbmlraKOjZmgmJOSmqCZmaWVfKauo6i0xbiloqevnpyVnqKeo5uiqKiRnqGdoaqwrKylq6Gqm6efqKCslqCbpa+jlpuolJ+cmpGilZypl519vYOIcrRyhJ2GrWh4ucS4cZSjo3qmmZlyq4J8y8DAu3GMo4iDnnyXmYmdwL2Blp2djJzBwXyCfJONmsPAfWylsm+MgW/Ken+bd5CDjoF1eYB/eXF6f4dwd4WMk3lteJRjZ2B4ZGBlgmJec2dsZGRZTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUVNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLiNGWzNQWS9VQUI7LziWo7nDtbCwwaqolKOvqbCuraWys66ppKWlr6qfq5iaop+cmqqmoZyroqSoo6S0pJyikqWtqrazp62hkZCZnKSSkJ+hmJugnYinraWsrsDAsaGpr6mWkp+doZmio6mjkqChnZ6tr6uuqKSkqKGmpZ2sqJGjmqisqZqcp5qqn5WWo5SfoZWbfs6UeHqkgXmVlptfro9ejqiCo6F8p5abc6uDgK9eY42qe6iHhaB0l5OIs2OCq4agjY2zaoSvdX2XiLdig61ao81ukHZ72nt/mXB9iJJ2fWV7h3Z2a3yHbn2FkJF+bYOQYHJtcGhgX3llXHFnaWRnYFJUU1ddS09ENUFIREQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGjqqittKulsqurqqKrpq6qn6abmaWXnKKvn6CeqKeipaCfsKuanZWmrquwqqirn5SRmp+kko+epZiep6Ofrqassai/x7OoqbGulpKdnKGXn6mqnpSgn52drrCprKucqailoquSrLKWpKGqqZ2ipaSfrp+RmKWXnpmSk5CXoHGFjJd1haiGcbF9nnKsf6KfgaWQn3argn2tf5xzrX+sh4afdpmSe3yXfqqIoYuRjJ19q3uJlZCggXutV53Fe49wk8F9gZVsdXCMbWV2ZIZuYXducm+JipKPg26SkWZwdXVxYWdtZl9vaGluZ2RXVF1hWlJTQzlJSUBEPD49QEZFQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08KD0xKTNXQEYhHEc6QzEuK7DTxsays6Ccoo6ioqKsrrauqLGlqKmmraurpqGjnZiilZ+lq5+hpZ+oqKKenbCsl5qWqKeuq6imp56XlJmioZKUoK2bnaejsK2lrbWrus2xraauq5aVnJ2imJ6urJyWoJmen6mzq6urnK2rpaOsmq6xoaerraWXpKmnp6+gkZWiopiTkISkaqR1iXqpdHqycIKmipmMcYmgmoakYGFSrIV/roObdq2CqIaFn3uZl4V6ZoCjiaSYhoKjfal+gpaIrl98qVaeo5KBeqOfgHvDrsSLcq+zs7lxYqmvwnRojIyYjoFunJVxb3p4eXBsZmZlcnBmfWpjXVdgalhZVU1NUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NSoyUEtMIyBBOUQ0LCfDydbUv6GZq6egrqKer7SwrqisoqelqKqrqaSmoJuknp2lp6ejnKuZoqygo5+voZyakquktK6uoKeanZWTpqKRm6KooKCmnbGmpqmyrbfIsrWqq6mWkZ2copifpbOdmaGUnZ+nrK2lsJutq6OjqqGyraGpsrChmainrK2zoZGUoaWWmZB7qWyehId1q3l8sG+CpYyJn5aWoJWB0ri0t8mBgbJfYJSpg6WIh6B6mZWaeKrJdJmklKipkJKbjYGdiprGxnlnoYKldIGfjoJ9r11vtGKwdUujh22nR4KTZI6QnZJ8cZmVgXF7dX58blxmanNxZoFrX2FZZG5cX1lJTU1LRURBQj5BPEI/STs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqbKsrKWim7K4q6qhpZqnpKmrqqafpqaYqqOfrqudpaCsmp6ppZyntZ6il5OpqrWxrJulnKCUj6WskZqcp6OhqqeuoqWnqrC1w7GzqqyolIqXnKWaoaOupZehlZmcpqatnLGerqmnn6yjtqygsbiunZmtprCxsKKSlqahmJ6Ngp1OeJqBf596hKN9g6SFh6afnZ+UhLh7fHm5gn/MxsK2eJuhkYuefpqWl4p2n5eKpZekqX+whZ2GoISsfZqVY6ZtpHCPhZCBfJaCcqxgo3JxgJpgvH1SVXSOkqOXe36Uk4x2e3OHgHFdbW54cmqCb1tkYGlvY2RdS0xRVEFJSEZJOjlLP0IxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZZWVpbXF9fXl1fX1xaWlpZVVNPSEA4ODIuLCouKyonJz9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmKmrpKu4qq6gm6Css7KlnqCVpa2trqqnnKanm6OoobOuoqmmsqCYqaSUo7WiopWXoqm0uKOboZyiko+hsZmenKemoaKwrp2mqaO2s8WxramsqZGHkJynnKKknKWXnpmamqalq5yxoq+lppivpLutoba1rJ2cs7C2r7CklpyunqKchY/RtcO3eYeOhZGTkICmeZShd4ygkoSlgopxqoaFtW5yaZqknJWKn32YmYaHj3Ovgqabo46mi5Odi5WQm25xsl2ldJN6nGyYf3uZfG2pYaJxcX+fYnOyuGh3j5SmmH2NjpWOen15kINuanlpenNvgXVeZWVvbmZoYEpbWFg8SEdAVTRARj48Kik2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBfXVtaW1hVUlJRRjoyMjMvLysrKEBRUlRVVFNUVldXWFhXVVVVVVFPUVtVJSEyQUgkKSWSc4yKrb6+vLm0npanpK20oaGZlKKnpq6qq5imo5+loaC2p6Oop7CjlKujjqSto52Qmpqqs7OknKScqJGUlq6fn56npJ2onbabo6uktqzEsKmrqKGMhI6coqCmopWZmZyZnJmnpqiZraivo6abrKa9rJS8r6yeoa6xt6mwpJmnr6GmlnmokH18sHeKgKSliJxtsnChh618oY+DqJWYgKyJha6FoJWqoKKXhp+BmpWAe5J+q4CdmpeLqnedoJKKlJKBeq9epIF9pqdknX98l3Jqr12ka3CGmV1gW4ygbZWRppmClY+ajnx8hJmAa26AY390boB6YGhmcW9paGdDWWFbPUtUM1U4QkJDOCQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFSU1NWWl1fYWBhYWFdXVtaV1NQT05JNzA0Mi4qLEFUVlZWVFRVVFVVVFRVVFNUVldXWFZVVVFIRklKIygovZKag6jFwrbAs56arKCtt6WjjpukoqCwr6qfpaCerZmeuaGjq6CvqZquoZCrqKSWiZqQra+spp6lm6yXmI+soaGdpaGapZ2vmaKpp7eqwa+kqaOei4CNm5qfpp6SlJmalJuapqWmm6qsraSln6movqSWwaqpoaCqsLepq6Sdsq2mqJd1r36Qi5yFh366rYqZZbCNZZWtfaGPg6eVmoGsioSwhqeapKGikYWhXWxrgbNgf617e4OBsW1nbpmZjYmxW361XKSEa8iiZJ+Ae7tXdrVZsnxSroB6rFeAoW2Xj6ibjJiSmpl8epGgf2R1f2OGeHWBfWJqZ3FuZ2ZlUFVkW0FWYD5JKD45PTQhIiwlHzIuICoxLzA0NTc5OTxBQ0ZISkxOT1FSVFdaXmBgYGFiXl9cW1hVUE5KRkM1NTMuL0BVWVhXWFdYWFdXV1dWV1dWV1hXV1hZWlpbXFhXV0dCO9KfsrG2vbqzwbKinKympLWooIqaoJ2cs7Opn6ShnraZobSoqqyer62eq5uVr6ehjoibjq+rqKahpZmukpiPqJmhnaWfmqSjppqho6qzqr2vpKeenI59i5uVoKCZj5Gam5KamKmgo5qprqilpqKkqLuen8Wlo6efqbKzqqyknbmrqquUgKmSo6+Om4CHpJeZkIKAuMO6g46ck4Snl5yCrIqCr4mnnJumq5F/1r3CqmKkv719fqOCg9e7uLWGlpSEnr2+hG2jgm+rhGycgHqysMeDaauwvKx3dqG+vHOAlo6mnZGckpqge4OTnnxjfntlj2d6g3xhbGZra2NRYVtTalxAVWJDTik9OjQvHx8kHyUyIB0kKDA0OTY2Nzc7PkFDRkdJS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PUE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbOzsL+4sbyyopytpaWypp2LmKXAqriyqKLAp6iznZ+ynbqon62vpaaVlLCrl4yDm5GupaKsoKOcqp+XiqOSpp6nm5uhqaSZoKKsrqq6raijm5aSfIiZkaWbko+RmJmPmJOpm6GZqqmhqqego6q6nqjDop+soamxsqetp564paysmXN2qqS4hmSJoHBorpGLkG5ud6SQmZ+Bda6ZlHCPi3GWqKScmK+kc21tbWaLeG9ugplwgXpqcWlnipiWmXJpaoWIZ3GGZF2IYmpvWVxmfXamX2FwjZBuZWV/jJOPoZmZmpOZoX2JkZh3Zoh4aY9seoB6ZW1kZ21jS2RYSmtaOlFmRVInSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1dXWV1eXl1cXFxdXl1eXVtbVVdeqZWss6i5uLGzqqmhrZ6jsqqYkr+zxcq+t6qfwa2upKKorJ+6o6SurK2ljZauqY+LhZaWrJ2mqqCdpKOgkYukk6eZqZqXpKuil56npqiwu6usmpuSknyEl42ll42RkJiVjpiVqZagmamjm7GmnaKruZ+vwKajsaSrrq+oq6mltaKstpWKoammt52JlqOZiKqbkZWdkqmzmZqiqqCylqKhnZ+inaGlopWsp42Tk42Hk5yclZGZk5mRj5WFgaWbmZaPjJSUjJCHhH5niX50gnVzh4pwp2x6k4+TkYCBjY6Qj52VopeamaWEiZeQdGqRd3KMeHh9emptZWRwZVVgWUBqXEhkYlBZK0Y9KychNzUwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhVV1leYGFjXV5UUUtFQz45PUBBU1hbXFlXWFhYWFhZWFhaWltcXl9fYF5eXl9fYGBgX1lZYKaWqamktLWurqKwo62fn7WxkI2syL7Gu7qro6afnaefsamjtqedqbWnp5GYraKLh4mPm6eVrKSfmaifnpKUo5eomqialaeipJGcqJmitrqoqpiakI18gZWLoJSKlZGWkZCUl6aRoJupoJy2o52mq7enrsCtorWkrq2uqqensbafrLqYkaWjp7aikp6noI6qoI6Tn6OrsJqgo7CosJejoJyjqp+enp2XrJ6TmqKclJCWq5qOmZmXkJegkoihnpeVh5ONkY6Vi4F+ZYuFdYZ0d4eCc5xqhY+Sk4+JfYuVkpKYlKOUn5mkhYmbin1zl3N7jIBzfH9qb2VfcWpgW2BabmRRYWVRWjpHR0U+Mj0+OS8qJispJh0mMzE2NjY4Oj09P0FBQ0lKR0pLTE1TU1RVWmBgaWFlVlBLQUNCOjlFTVZbXl5bWlxbW1tcXV1eX11eX2BhYmJhYWFgYmJiZGJcW2OXlaOmoq+xq66jqaasn6e1qpCPnaS1vbCtraOkm3yfpLKkpbGpl5u4pqOUmaqcjoaKiZyij66eopWon6CSlpmbrouplo+pmqqNmqmQn7m3pKWZnI2IeYGTjJqTipSRlJCOkpejjp+fqJ6fuKN/g6+1oq6udKK7obCedniep6+4k3Sro56Jf6t/ZFxidqCOpZ+EmH1tkrOdoqetqqNlnp+Sc3mamHGBmamYbX+iqYplnKadkpeYloyTnJGGnpuRloSTiI+QkomFd2qOhnaFcHqFf39gaIeJk5GKWnWUkGdoj49zfKicnGZ7m4qFeZlqhYyEb3qAa3FlYHdwbGtpXGZlYmJxVFs+Tk5OU0c+QFVEOjEvHh8mNDozMDY2Nzg8Oz5AQUFGSEJHRklLTVNUVVlcYGhmZ1dRSjxERzw4VVJbYGFiYF5fX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5WloqCur6urqaWoraKnraSSlqu2sbOnm6uorZh0jZ+xoKirp5SXuaCgj5yknpF/iYibnoysmaKVp6GdjpeSnYV2rY+Jp5upkpilipy7tKegmZiLiXV3k42Wk4mTkZCUjZCUoY+coaeZnLGVgIybtJyyjJKNuaWffaeieaCstX+NjaWeg4uGkLCqr42Ll6SbeoGLrIWcnqGmqKeHlYWYd6WbeoicgZeng4J7nLN6ioahmJqVmJaCkZeXhJuZY3qIkIWPkJKLg21wjod5f3B/gIR9hXOFg5SRd5ZoknSgmnR9mYSjoImYf5WNhoWaa4+Oh2x5fHJxaGV5cGpsa1xlbGtmdV1eSVRMUkBFNi5bVVU3KSEwOT4+NzQzNTY4Ozo9Pj5AREk/SUVKTEdTWFtZW2JhaGZZUUg5RUw7PmFWXmJkZmRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXop6lrKyrp6ygp7CmpqmlmZSvyL+xopeoqrefkYWerZynoqCOkL6emoyfmqCQfYaPmJeHrJyhlp+hkY2TiYWAkqeNh6OepJWZn4efurKnnZuSjoVxdpCJlZCKlI+Pm4yPkqCSmKGklp6rh5+0ibSZrYrKhqisiLaFjK+BrquCqIymmI2dfaiPc3t3nI+nl2iVpHm0jKCdpaeSmMKBf6uImKFynoCapX6XhZWzgaF9oZOhkJiXgY+UnIuZkox9hZOHjZaSiYNtc4+FfnlxhoCDe4N0hICVgI/FZn+ph4+ja56FpJ2EmoGOkImMmnGPlIZpeXZ8eGhpdnJoaGxeZHBtZ25ZZ0ddUk0zRTU3TmJkNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05KSkxDUFpdXFdhXmlsXFFFPUtNQEljWF1jZmhnYmJiYmRjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUlqGer6anqKWrn6S3sKmrppqUoKOkrKWYpqy5pLCBoqmdpp6diZS8mZONoZGej3qEl5aRh6uZm5yaooSPjHeanI+fkIifpZyXmpmHo7mtpJqcjIx+Ym2PipOQjZCMjZiMkJKgj5WhoZmgp36hp4etnZ+WrY+cm5yQhH+gjKishaONqZmMmn+idYGZlGuCrXZNq3iHjZyRmqemgKmrfYOhe3qnap5/kmxnmIaYt4mefm5gZFmDl4CNfGRoi3KZfXmWbF19l21fUnCDXF9reIJfWGSAfIN/lnCnqmuDo25ypXCfhaBqZ6BtXHCOfmdaYISBY1hRcHdmbnVza2pwXmtxbmxqWWlPXVlGOUE1SEVfbDUsSURSTU49ODQ4NTk7NkA7Oz5CUD5RUkxNQkpcXV9XXV5idWBNRDpNT05UYVxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5Wcn7ifqaOmrJGhtbuqrqKZmKGipa2voZ6wtqSpk6KhoKecmo6ZtJmQi5+MlYt1gpSSjIqmlZWYnp9+k4WFrKSHm5CLmquZm5uSiKaxp6GVmoiJgGluiIeLjo6Ji42SjJCTo42Un5+coaR/k4GPoqCTn3aclI6ngZ+lfoWnqoKleIl8hJp+onBzlIiWfJ+NeW2Gm4yZj5qomY6HnXuConN2pmaefnekX5h6fZR0om6Yt7S6dJOIg4C1qGSBxrh7cJW2jHKAmqNjc6yrYHxpnbN+bXyGgY2Ci5hxf6NscqN0n4WBpGGdmbSXc32Yn7N1dFyesoNrY3B1d3JpcFlsbXNzZ11qXmJMRT1ENlJCWnMzPVNHYEpSPTwzOTU6OjZEOztASlA/VU1PUUBFX19bWlhgYHxkSEM4TVdVV2JhWmVma2tiYmVhZGRgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJOWlKK3mKqbk5+NpLe0rK2gmqKdpKOmr52cs6+tlJmimqGlmZqVn6ubi4iSeIuFcYCWjYmQoY+TlJ2YfZGKjaihh5eOiZOklZybjYypqKWej5eHhH5qe4d+fZCNgouQkImQlKGDl56gnZ+ei4l3nJihjJ9xoYqGqYeapI2Upah8rYx+eqCZeqOTeIF0loiNnH2Wn4abjpiapYWiZKF8iJaQm41tnmibjm+amXuAi6d9cml0q4Ofg3SqaJWaXZuFdoWeZ6prgLhmXKhwgZxglYxep3Z1h4h+nWeadYaTkpeOgJ9vmpFup5peqX95u2t+qlyOhF20aF1ucnp4bGpccWt5emRhZ1hiQlJGTzdXRFJvNUtbW19OWkRBMjUxPDs3SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5cXllkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FgZGVla2VjaWhna2mVm4ips5qmiGOUm6u6sa+snqacnKmgn6+cnrKprp+YpJuhoJmXlqCjmYaJjWmIgHJ7l4iLlpaEkZWYkHqLhJWknIqUj4aNn5OenYmRqaOgmoySioCAaYGGeH+WjHqJjo6IkJebf5Sinp+gk5hyaJ+Jno6LcJKMgKmGmJ2gpJ6le7Cto6K4l3ejs6OkgImUeZ17q5l+oo6cmpaIl3GhfIWNr7V9a5qRoXl+mbWjpKuohJl8m32em390qlpdb3uWi3ieYkx/e3qFY3mXQkyfWKJpcXuObICIg5l1m3iGibGzf4Cbk6d3g55udH6VcJp0a6RelXZIZWRhdHJ+f29mYWxpd3xlZWJRX1ddVVdAWkZRaEVUV11iWF5JRD1COEBBOklGOExFWEFXUltXREZiXFpgS2BtfXJFQjxVX2JaZWlWZ2htb2JmZ15hYVxdXmBoYl9lY3ZsXWVnZmtkZWxpaWtpk5yAr6yYg1NeoKazubGyqJqijJysnJyqlaKtpaOpkJ+enpualpihnZaIh4l3hoFveZWFkZuLfJGTl4hygYmRoZtzkZCBiZqWoZuFj6qcm5WLi4p8g2yEhXGBoYt4ho2Ih5OZlnyTpKCeooithn21hI2dnHullXmpgJSajoiemnunaHdtfpl0oXNyfJ6GmXCTg659o4OlnZiAo29eqGd1omNvpWGc05B9e5l4c3RiooaQfqN0pJB2a4+zjGCCmIlzqrKovH93g21+v6aptF2cbXtwlm1/cqJxXaRnc6ZgaKZtm9SafoabcHt7mGycfHiYc26ppGdhZXpygIVsaGZkb3Z4aGFjU1xmUVJiSFhKVWFYVFxma1xlUUZDS01KS0JLRThPQFFOWFNZT1NRYGZmalJkd3l3SUZFY15mWmhqVGloam9jamdgY19dXV1faGJhaWV8ZF5kZ2RrZGpsZmhsaJeaf6+rVFtKfqmvsbOvsqObmYWZqqCipY+mqaGaq4ubmZmUmZOToZiOiIV7cH2EaH2Pg5WbgXeRjo+Kb3+Gj5OSbJeUfIqTlKWXg4+rm5SSi4aJeYN2iIBtgZ+Gd4CThoiZo5h7lKKjmZ+Js6Gitot5rKekrqVvqH+ZjYWAmY96pH+hmYaYcp6EpK6vipeMgI2kjZWCraCTdrW2tcmhc5SLgZ9gnpepbXqVh6GcdaKId6B+kpeLgXBNZqOScJqHc6V7eXRhg4FrfaBrcWRfnHF9c5ZoemmztbPGpnKYfXqda5ybq3aFm253eZhqmnx2mHNRRX2zX2p3bHqIZ2toY3V2cW9XX1RZaVBTaUpXTVlUVl5pbG9WaFdNS0FKTUtISk9CUUtQZWNqbWV0cnN/eXxudYl7e1RRT2xeaVxraVJqaGlsZ2xmY2VfXV1dXmliZGlre19dZGhjamZvbWVpbGWgm4eupYNkP5OhsqqurrSiopCAmKqio6aNpqifnqeEm5iXjpeQkJyTjoiDemp5h2WDjX+YoHl1jomMgWmEhZGDjIWdjXqNjJemlISYqpiMkYuBiXqAfYt4cJChhnmClYeJlqCWf5Slp5uVlYNmbnicbKJke3Cld5uXcGWmgJSJeqR5n5aDl3Oed4GKlZePuW6RiqJifZiglIhtcmmqa3WgbW+mYJtpi5BploeblnWigX6aYIyGjXVwiGJooGWefmmbdW9jZoiBbXGiWV5aYqFsXYiLbXp9c3FkpW14omRnp2iZc4yZcKJwVYmQcKBgZqhVi15UmG5udGxzg25xaWt5dGtwUllXV2ZaVG1KWlBdSVhpaXNqWWxXUVJGVlxMWFNiVWlrX3h0e31wfHxyg3uAc3aNgIR2XlJyYmdjcGdQamhobGxuaGRnX11eXWBqYmppdnRdXGNoY2pqc2xma21jnKOXpXlkc2yKpq2jqbCxpp+LgJisnp+njaOinKSjgZaZlI6akIyYkI6Ke4dxgIhoi4t8mJtzdIl+kHtlg4aUioqWmoJ8iYiYqJKBo62RhpCLgol+gICOcmmPpoR9h5ONiZigj4iTqaWciKZ4lZt+pYiWirGXnY+CrpaepHWThXipc6WPhJpupKKMkoSNg7tufaWvg4aFhpKVnJ98pXpyqJWglmeefm+sZJaKlpN3qG2qooGJdomDd6uRpohrkbBrdrOMqWuKhW1tn56RlF99q4uqdn1+iqSddp98g6SVnaBqm4h4rGifro22dXi+jaSTWoOnjqthdXN1cnx1cWNrf29obVRXW1ZhYl1sTV1SXkpebW93YFtxWVtgW2d0ZW5vcmJydGB4en55cnmDc4R+gXt7jIGDgHZieGRjbnJkUmtnaG9scmpmaWFfXlxha2JtbHtvXFxiaWJsandtZ2xuYpWkqZuAf52jlqmpnaimraSZioKYrJufpoqcpp6rnoWNm5CHnJGGko2MjXSHe4iEcI2FfpiTdHSGcpGDbn+LkYeGlI99fIOHmaePgKenj4GOiYWUdoKHkm5si6mAg4yUjomdn4mNk6min45/dJOXiH6BeJOuon6BmnCPhXaOiYJ9e3KnjHF+fXqYlpuEkHl7f36HlJWTinaQmJ6gg3t+iWuMhVt5eXJ6cWlufpKKcoB1gY+Uk3GHhINljH9fgYCLd3VzlHVveW5th2yDhl51Z3eOZX+AhY2omn10e5VqiYhwgXZ9h3dubmiNdHp8mHiFXGxYeY9pb3hzcnB4eHBdbIdvamhXW2BXXWdrZFdjVV9SYHB5eW1rd2Zra2t3fXJydXNhb3ZidHuCeHV6gnWAgICBeYuFg317bn9sZHluXlZuZ2h1a3hqaWllXGBaY2llbHF1blpbYmxkbGx5bmhrb2GOk7anpoqgoZqmo5ilnKuioYSEmK2SnqKKm6ibqpiDgpyMf5eUh46KiY1yg3yPfX6PhHuYj3RzhHGVhXt8kYuGhpCFeX6AiZulj3yooYuFj5CFlYKGjph2coSpho6SnZCJn56IjJumnp+qg4iNlZp+foiWrKeOkaWPd26bjoF4kG59qIVxfpVxa3B9gqCNgJOOi2hsXIKLi5uano5zlYuIcXRrgnd0gVlyboeRgn5/jGpdamV7hoSKgGBpeXube4KLgnWBhYFnd4qGamBvcYB1XnGJgImOpZOEZYuNg253i4Rxho96cWhpZn2Fe5ZbXWtobnZcfHp4dm90c4NoXW6LbGxjWlpfWlltclxgYlpfXmZ0f3x2cHVka2trfH1zfHl1ZG51aG18fnZ6fXt5eoCBfm+FiYR7fXR+eXN/aVRccWlsdnB1Z2tnZF1hWGpoa2txcm5XW2VubGdzeW9oamxgi4qor6CPoqCZnp2Xnpioo6J+g5mujqCViJ2jkaaVgHyZhn2SmYqJh4eLc36BjHaFi4KEl4pyb4BymIaEfpGDg4aKgXuBhY2coZGDqKKIeI6XiJSKi5yXhIN5rIKRmJqVip6diIihqZ6hoaOKh5ObnKKZlamgpqSekZqFk4t6do2Ng6d+f5KQk5SdsqablZ+QjbGSl4OljIyVmp+JkZuCiJGKa3yOd3hlg4eRi3yJnoSHjJCJiYGFhZB3fHp0mqCJhoqdiYSTfn2KgH90bnOEgX12hYaJjqSPgoSMhoKMkIx9h4uKkYR6boSGfnqZa3NpYXSLcX57eHdweHWCXV5vh2lvYF9aXV1TaXJWZV1dYm1odnx9dG9wZWtqaYB9bnmAcmpwcW1ngXtzgoF3f35/hXptgoyGfHp4e316hHlOZHZqc25wemVrZWNiYFt0ZXBmcnFtVl5sdG1oeXpxZ2lrZYyHnLielqGgl5SYmZSYpKCefH+arI+fjoahnYyeln55lYR8jpqKh4SEh255gYFzgYh+iZSEbWt+epeHhIOPfoCGhIZ9iIWPnJ+UiKyghHKKkIaSkYudkX2NeqmEjpOYl4+cloeGm6SeoZmchYKSmpmYj5imn6Scm4+Vfo6HdHqGjYOle32PkJGGmKuhnpSdkI6pjZCAnYyIk5mego+XfoaOg3B4hnJ1YH+EkIZ1jZmBg4+Dh4V/hoWVbnl2dJKiioyFmoSDjHN/iXx8cXF6hoJ6doiNg5GkjoSCjoCDiomKd4aJi41+cm2Agn1vaWxuaF56gGh+fXd2d3Z7eF1gcX5udWFkW11fUmduVWZcXmJraXd7f3JsbWRramiBf2x0gmxsdXB6cIZ5boeBdoKAfYV2cYKNiH57fHx/e4KKYGh7anVoaYJkamNgaVxkdWhvYnVtbFVjcXllcHp7c2VqbW2LiJ61maCin5KRlZiKmp+fn3t4n6eRnIuHppWMmJl6e42GfYmSg42DgoNufIB5c4CFfouSfWtofYKXiYGIjXx9hoSHfY+DkZ2dk4qpnYFwi4uMkoafoYqFjHynkYiQk5iUlpN4jKKen52VmH6AkJqYkouZoqCjmJWQmXyLgnd/go6GoH9+jI2PfJikoqKTmpGQpoyOgZqQiZKWm36Tkn6HjoF1dIJxd2F+gY6GcouXfYmMcoyAg4WGj2l4cniMmJGPf5Z+h4lygYZ7e293eomDeXiOi4KUo5KKhI96hoaHhHaChImJfWhzfoF6fHJtbGhffnNpfXZ2dH10gGtfYHR3cXhlZFlfX1JraVZmWmBhaWp3eoJyZ2xkbGhmgIFrbn5ob3Fsf3mHe2yMgXOAgX6CdHaCjYZ/fHt/gX1/j2lyg250aWGHaGxiX3FWdG9sbmB4aG1XanR2Y3V6e3Jiam96iYyesJGkpJyOj5ePhpygm558d6WhjpiAjaOKiZqWeXyGiH+Din+Jg4F/coB7dHaChX6LkXhnY32Gl4qCiot4fYCOhHmXg5aZmI6XoZt/cIuCkZOFpZuHjImDppWFk4yXmJKSd5Gcn6CXk5Z5fo6Xl42WmpyjnJeRk5l3jYOBdoOVjZ1+gomNjHOXo5+ilJmPj6GMioKWl4OSlZl+mI18iI2BdnF+bntkgX2LhXGHk4CRgmyIg4KAiYVmdm97hZGYi3ySeIuHe3+Ge3pwfXeIhHiCjoeKl5+UgYKLdoiDg4J3fIOKh3hhenp/dX94aG1mYn9qa3h0dHd+cn1jZGFzbnVzbmFaYV5bbWVTZFlhYWlsdnqHcmNrY21maH2CbGl1aG5waoB9gnpukIZygIODf3R8g4yBf356goN+fJBtdolzdW1limxqYmJ1VoRpcG5geGdsYmp2cGZ5fHpxYHJshoWPm6yWpqeejYyXh4afk5eZfniqnYuZepidjIyZkHl8gYx+fYR8gYOBeHR6enR9gISAiYuAZF99i5SHf4SGdH1+i4B+mYaXlZiOpaKYgHOHe5ORiaaPjI6KkqCRhJKQlZeRi4GPl56akY+Qcn+NkZOInJyepZeWi5OVcYuLiWuEl4+ZeoiIj4lvl56bpJSVi4yei4WBkZx/kpKVhpmIe4qKgXpxemx1bHx/jH5uhpODlXdwg4R+f4uAZXJqe3+Wl4N+jXSPh4J4hnx0dn58hH97gYqCi5Khj3iDgXSJh32AdHWCiYVxYnx2e3J+cGJwZGV8Y29wd3N5eHR1YndgcGx2bnBdXGBeXmteUV5ZY2FpbnR8imxgamVrY2h3h25nbWlrbWmCfXt4b5CIdIGEhH10gYaJe4N9eoGEfX2OcnmLeHhtbIdqaF9pcmOHZ3FvZXdnbmxhemlqfXt4cGF4bYuAmJipn6OonYmKkoaKnYuVmX54r5mNl36flJGXlIh3fnyKfXyAd3iAgHB1dHxwhn2BgYp/fGFcfo+RhoCDgnJ6gIh7kJOKk5OdlKadlYJ9gX2NipGjiY6KjZiajYaSmZSVjomIjJGbko6MjG2EkI+RiJ6ZoqCWlIiVj2yGl4JlhJiOk3qJhJCKcJablaOTkomLmYyBf5CefZKOkoyZjnuKhYd0c3ZscW52fYt0b4eRj5NxdYF8goOIfGZxbXl8mZN8g4h0kImAc4d4bX58f4R7g4qGgYuUpot6hnt+ioR3fnFwgYaEZml6dXZxfGNfcWFrdF9xa3t6em1zcWZ6Xm9tc21zWFtfYGJsW1BYWWVjaHJygIhnXWppZ2JncY1vZGpoZWlpgXp3dnCOhXSBgoN8dYKIhXiFfHiEhXp/iXd+i3t7c3iDamtfcGh0gGtyb21yZ29sZXxjboB6dnFsd3eKfqKXoaegppuGi4uBj5yHk512gquVk46HoY2WlJCAdHx3hXh5f3Nze4Zsc3B7bot2gIGHb3BbWX6RjYeAf392dYGBgaGHkouUnpmilZh5in+BjIicnYqPhpKYloWJlZqQl4yLjI2Lm4mNj4JtiYuQkImclqGbl5SEloZogqGBZYSbiZB+i4OLgXeTmZOfk5GJiJSMfn2Ol3uRjI+OmpJ8ioCCb3ZwbG1vcXyGanSEj5mLcXeAdYKJgnlnc251gJmOe4eEeZOQeXWHcm6HeoSKeImEgIaNmqGGe4N1gYp/eHhua4GEg190dXRycnlbX3FhcGtfcGt+fHFubmtud2FwcGtybVlZYmFib1hRVFtmZ2N1cIWDY11rbWRiZmuSbmBnZ19oa4F1cnNxi4B1f4OBeXaAi4B4hX94iIZ3g4V8hot/e3eKf2pxY3xjhnxucW10amhvbHZ4YHF/eXx0dXSAg36klZmsnqeWhI2Ef5eUg5CgdoyglJOGi5uNlo6LenJ4dYJwcoV0cneJbHBudm2IdoN+gG1tVVGBqpSGg3d+d3KDeoOig5SClpSZnZObeZF7g4ySo5mTjomUmZKEh5eajJSLiY6OhpyDj4l7couFio6HnJqfmpWTfpJ8ZoOahWaFn4eRhJGCiXGDkJeQnI+QjYuPjHd6kZB6jouMkpaMfIh8gGt2a29rbG17f2F6fpCXgnd6gniDjHx6aHRsc4aVi32HhXuSj3F5g291i3mIi3iHfH+Jjp2bg3t6doKKfHdwamyChHxheXFvbXN0Vl9wYnJiYG1venJpcGZndXVpcmxid2VdV2ZhYHNUUU9dZ2VeeXCJfWBcaXJiYmZmkWpfaGVbZ3B+cGxxdIp9dn2FgHV1fox5e4WBeIiDc4aFf4yMhHx6lHhmcWuDYIh9b29remBqbnR/dV90fXmHeHRzhX14oI+ZsJyljoKLf4OaiICNn4CMmpSPhYiYjo+PhHd0d3SAcXCFdHByhHBsandug259fW10clJNgt/IktaSe3B1hHaFoYSUeJeSmZ2RmnyUc4WPnqGTk5CKk5yUhn+XloiNjYeRjIebfo2Ad3qMfomMiZybnJqUkniMdGWGkIVrh6KEkYiXg4ZjjJGZj5aLl4yNiopxepOIe46IipORiXmFfH9tfGVyb2tse3pcgXqQkIF7fYCAho56emlzanOKj4mBhYR8lIpsfn5tf4p9ioV7g3h/jZOZmIp8dXeDj3hzbWdwgIVua3VwaWt1blRfcGVwWmBtc3lobGtjZ3lzcHFkYHhhYFZsX193UU5MYmdjXXpxinZdXGV2YWJmZY5kYWdiWWlzc25rcneMfXR6hoJ1dn2Lc3+Gf3uJfnKJiIKQioh8fph2ZXNufGWIfm9wbIBZbG55eXNgdnp7jXZyd4p3eZ6Lmq6an5CChXeIlX59i56IhqCSj4WMmISTj4eBdXhweXFvhHBtb39zZWV5cX1teX1qZ2tjpJrB3K7woHJsdoV3hqSGk2+YkpahlZyCknGGiqKXiY2VipCdloOBlpCFiY+AkImIlX2GenR/iXeHhI2cmpiYjY51iXVshIeJfImihJGJnISFXouTmIuQiY6LioSIbHuVgX2IhYmRj4Z2hX1+a31keHZqbnlzWIl7koiGen+BgYaMf3pmcml/iY2JgoF/ipWEa4F1bYePgY6CfYF4fY6UkZePdHJ3h4x1c3FndXqEY3VucWNrd2hSYXJobFZgb3V6YXJkYGl/cXNvW2RyYWJXbltdeU5NTWVnYl53c4puXF1keV5gZWWFYGNjX1lqc2tua3N4jH50d4SBeHd7iXGDhH1+iXp0i4mIlYaMf36Xc2h1cXlsjHtudHGBV3F6dnlyZHd5hoxpdoCJcn+chpinm6OShH1xjJR4eYyehYahjY98lY2AmoiEe3N4cHNqcIJsam19dV9heHd7cXV7Z2BkfOvatcnD3IdybHSCd4ucio9rmpGQnpaUgYlxhIifjYSLlYqMmJR8jZOIg4iQe4+LhY6Af3V4g4RyiIGTm5aUl4WLdYZ9boOAh4aXoYKTjJ6DiWGDlI+HioaKjYeBh2l8k399g4SJjo2CcYZ+f3F3aHZzanV3bFqNfJKDhn6BhIGFioJ2YXJrh4GOiYF+fpGQfW6Ba3eEjoSQgXqAe32PkY6UiG1weYyFdGtwa3J5gmF1anBdbHdhUmVzaWZTYHF3dWFwYF1ohHJ0a1hoaWNpWW5XXHZNS01mZ15ic3SGa1xcZXleXmRne2FkX11Za29lbmp0eIp+c3SBfnt2eohzhYN8f4h2doqGj5iBjIJ7k3Vsd3Z5eJN0bnh7fVh5hnF/b2d4d5KCZHaGhXCJloWZoZqiiod0b5KMcXePnX6LmomKfaB/hJqAgXhydG5vZHJ/aWZteHhcYHl7e3FxgGphZ2F/1baPkaZ3bnF4fXGUko6Ia5uQip2TjId7aIeKmYaBkpGGh5iOfI2NgYGJjXuPjH2IhHpzeoN6cIeAlZmOk5OAh3SChHSBfoiRm52GlY+ffohigJOHhYiFi41/f4JnfJCAfn+CjI+Qfm2DfIN1bG13dXR3dmxjjoKPgIZ/fYaAhYl/cF9xb4R7jouBfH6QiHpwg2V5gYiFioB6hHx9kY2PkYJtbnmLfnVtbmtre39kaWxrWm53WlNqc2liUWNzeG1jZl5aa4RudGJcaF9lbWBvVVxwT0lPZ2ZcaG9ygG1aXGNzYFxjbHdlZV1dWmxtY21qdHeGgHJwf3x9dHiGeIWCfYCIdXiJgZOVfIiGdoiAb3h5e4OTb257gXdeg390gW1penSUc2dziHxxkZCDmp+boIaIdnaUf213lJh/iJGEio6afYyad312cW9samF1fWdianV6WmB4fHpscH9lY2dnV52PX3Jzlr3FhXdylYuRgHSZjYeelI2Jc2qIjpWAe5SMgYSbjHyKhn18iIx+k4d0h4V2dn2BcXWGgZ6UhpSOgoJxfoZzgnqIlpuWhpONnYCIZn6Tg4GGhIqJcoJ+Z32Le3l/f4eLj31pgH2EdmZweXhzeHRsa4+Gi4KLgHmDgYSEgGtecHZ6fYuHhHuAjn9+coBod4GFiYSBd4J6fpWKjot8bWt6iXx2dG9oaH53ZV1yZFlxdFRUb3NpYk5odXlnYV5dWXCBcHRaZWNea25hcVBabFNEVGhiWmxvbnxwWltebWNaY293ZGdcXWBramNsanN3goNxb357f3R1g3qDgnyChnZ+iYGWkXiDinSBh3J5eX6NkG9ve4FxaoJ5en5ubXx2lWtqeIR0a5OMhZ6YoJmFiG9+jHZqeZmPgIKLgpaYinmPlm95c3FsamRgdHtpYGZye1thcn16ZnB6YWVkjrGyd0tiWqXb0phzfJKNkXl/l4yFmpKNh29shZKRenmThoCEmYp8h4B5eImKg5V/bomGcXN9e2p5hoOlkISSjIJ+bn2BdIF3hJmXkoqTj5SFiHB7k4R+hIOJg26BeGiAhXhyf3+Diod8ZXx+hHZjcXOAaXpxb3aajYaEi313eYGFe4NrXG98cn+Hg4h8hId6iHGAbW+ChYyCgnGDd36WioyDd21sfYR+dnplaGp+cmFaeFtac25PWHJ0Z2BLbnd1Yl5cW1l1fnRvWGdeZmtxX29PWGlTP1pnX1txa2d6clxbWWxlWWRxeV9oXV5lbGhma2lxd3+Hb2x/foF1cIJ6gIF/g4B2gYWIl4pxgo1xe4V8enmElIx1a3p/bHB+dX99b3J8e5Nwb4F/eGaRioKhmZ2Sg4Znh4RwZ3qXin+AhYKaioF8jY1peHJsbGZfYW96bl9jcHlcZGyDemBwdl9kZdXrvoszOj6Mj4BzeoaKkI53hZmOf5SOjX9ubYWMi3V8j3+FgpWJfIN4bnaGhIKVdm2HhGt1e3VleYOEp4yDjouCfG1+cnSCeIOaj4qPkZKNjId/e5KIeYCFjoNsgHJpgH94bXx8gYqDeGJ5hIJyZHFpf252cnWCnYyBgIZ/c3Z+gXOBcFtrfHN4iIGKe4Z/fIh4eXBqhoKOgohwgHd9k4mKfXNtanaAgHV1XGlpeXFZV35UW3JmTVtzcmZcSnJ5cF1cW1pddoB2alpiW2hmb2NqTlhnUj5fZl1edmZgdXFbWVVvZFplcXlbaF5gZm1oamtocHh+jm1qgYR/eW6Be32Bf4J6dYGBjJOFcICLbnh9gHt7iJOJgGl7fmp0fHKGe3N2fn+MeniEfnxri4yDm56XjIKBbY1+bGl/j458foCDlIJ/fYqIa3VxZ2ljW2Nnc29gYmx0YWhwiXphc3NeYmOboJBuXTZbsLZ1a4GKfpSHd4iZh3WQjIp3cG2FgoZ0eYl4iX2TiHp/c2d1iH18lm5vhX1odnluZXqJhaSHgIaMiX1tfXR9f3uKl4aAk5CYiYuFinyQinF8foZ8aX5ta4B7eWp6d4KHgXJgd4J+cmRyZ3aDbnV8hpWSgn6DgHB3enx1f21XbX11c4mAhXaGdIKJendybId/jn+DcX17fJCHh3ltbWhsgoF0blxoZnVyUlx9T11yXU9cc3BkVkt0eWtYWlpaYXKBdmJeXWFnZGlqZk9aaU5BYmVcYXdhXHVuWFhTdWJbZW9zWGpfYmhrZ21saXB3fJNsaYSKfXxwf357gX+Ce3eAgImMhHJ7h29yd4N/e4mNj4RqfntueHl2ind9eICCh4CDfn56bYSMiJijjYWEe3aLeWtthYmSeX58gpKAgH6KhHBycGNmXllnX3BwYGBocWZqb4l0YXNvW2BkanZ7f7+dqKXKuXKGhXSVfnqJlYR0ko6HcnNwg3qCc3WGdIh3lIl5eXFjdoV5f5JocYN1ZnZ1Y2p8hIiegn9+jo18cX1ygnd+kI6CdpWNlJCIgoh7iYpseXqAdWh7aWx/eXNpenaAg31oYHeHfWtqdGh7gWp2gY2SlX98f39yfHd8dH9iVXV7cXKHgoF7gXCGind4b26CgYt9fHd8enOMhIB1Z3BnbIiBcW9daGN0b0xmd01fb1ZUWnRuY1FQdXliUlhYXWJyg3RdYlxpZWVja2RSXHFJRGViXGRxXl14aFZXVnheXGZuaVdsXmFqZ2Vvbmhwd3qTbmmIjHl9c3t+eYKBgn12fYOIhoNwdoNzbneCgn6Ii5R/cYB8eHp6gYt1g3h/gYGChHqAdW59iYubnoh+hnt3h3xodYaNkXp/gHyJhoR2kIBnb25gZVxYZlluc2FhYXFsbGiJbmBzaVleY22Ad6naqciHiLNzi3pxj3Z9iZGBe5SLgHV0dX12f29wf22FdJSGeHVsYHmAeIeNZXGCbmd1bVttfYGQk4CAeJKRfHd6bIVzfo+Kg3KVipGPiIaGe3+GbXV3f21od2VtfHZta3d3f398YWJ4hnpodXZjfnxodYePjpZ9doF2coB6fW2AWlVxfG9zgYV9f3driIZzeGpzf4KCfHl7d3pxiX97cmZzZG2Lg2xzWmpgdmZJb29NXGNYV1Z5bmJQU3V3WVFWWF5hc4VwXWFjbWVjXm9jVV5zR0NnYF5naV1afGNSVl12W1tnbGJXa2BhbmZmbHBocHZ4j3Rrjo12f3Z4fXeBhIF7dH2DiIiDb3F/dXF1foWBiI2Le3d/eIR8fYWHeIh8fYF9hIB7fnJ1eIuOn4yJe4p3dYN6Xn6Hmo15h4R0hoeFd4l7Ym5tXGJbW2FWanRkYVxob3Bnh3FhcGZXXGNrf3zKzoe6omtub4xucoVzfoaMf3uThXp5dHl0dHpqbHZjhHaSgnZwZ158gHiKh2RxgGpqcWNYbXuGnIiCgXKXk3Z9em2Gb3+IioZwlo6QiIaMhHt5f3JycH5naHJjbnhxamxyeH18eV1leYB4aXV5Z4J3aHWIjI+WfnOIanB+gHhufV1Xb3xsc36IeoBubol/cHZmdn5/foB1em95coV6eHFlcWBtjIFrcldrX3ldSXBsTlhWX1VWfGtiT1R2c1JSVFdeY3aGal5ha2tmY1pvYlljcUhBaV1hZ19cVnxeT1ZmcVpbamhdWGhhX3JmamhxZ3Fzdod5bpWKdX97eH55g4iAdXN/hYWOg3Bve3h3dXqGhYaMhnp8f3WLf32Gg4SHf35+fYZ/fHh2eXaRlJ9+jX2LbnWAemSEiJiGc5KKb4WFgnqDdWRuallfW11dVGhzZmFZZHJyZ4FyYWtkV1pfaX94vq57oLduY3WIaXV9c3uFiHt+jYB3eHN3bnp2ZWpvYId1joFzamJefXZ4ioJlcH1na2taVm94i6OBhX5wmZJxf3ZzgGx+gI+GcZSIjYiFiYV9eXVzcGl6YWptYW12amdra3l3endaZn19eGVyfm6FdGZ2ho2Gl4BxjGhse4J0bXViW216anN6iXqAZXSHfW1wZ3R9dn1+cHpqeXl/eHZvZGtgbYl9bG1VamB4VkxsbVBTUGlOWXxoYk9VdmxNUVRVX2d3hGdeYXFpZ2FXaV1dbGpKRWtbY2VXWVZ6Wk5Xb2tZXWxlXFplY151ZmxlcWdzcHSBeHCZhXZ/f3h/fIaHfXZzgod/lYNuc3l7e3NzhYaIiYR5gX12j399hYmOhIGDen6Lg3t3fHZ2mZ2YeoqDh2l2fn1thYWVgXKPgnGGgn6CgHBmbGdYXVtcW1NlcWVfWGNzdWl2cGRlYldbW2h/cG9ygHOKZWZ6gGt2d3R1hYZ4goV6d3R2bmp6cGFoa2eGdI2EbmZeXntueYh8Z2x3ZmpkVldzcI6mfIR7dpaQc3txenhseXqPg3WXfIiGhIeEfXVxc21odV1taWBtdWRnZ2l6b3tyWWeBd3VocIB4gnZid4WLfZWCb4xrbnuBcWVzZWBqeGZwdYh5fGF1g3Zqa3B0eW95eHJ7ZX19fXZ1bWNkYGyGfGxqVWpiclRMa2xQTU9xSF58ZmFOVnVlS05UWGFreH9mXmdzamVgV2RYY3JeTExsWWRiVVRVdFdNWXdlWl9sYVxbZGVfd2dtYm9qdG9xfnV0mYF4f4B4gH6GhHp9doKDfpeFbnJ0fHt0cYWFj4KBeot2dJGAfIGVjoCFhHx+jIZ6foB2e6OminmJhoVsdX18doSDjXtvhnN6hX2Cg3VuamllVl1bW1pTY29lW1hhdHtqaG1oYGFYXlppgGlrcIBobWJpe3prdXV1cIeCeoF+d3ZuemhqeWpfZW5ogXeQhGdlWGF2aH2GeW5pb2ZmXVVYb2iPqHeAenyQjXh0bn1tcXR4jX53lHSGg4CGiXZqc3doaW9cbWVebnNfZ2JqeGh7bVttg3N0am+Bfnp4YneFhXmRhnOIcnB6f3JjcWhbbXVkbnGGendhc4BwZ2l3c3Frd3ZzdWKCeX11dG9jYmJsfXxra1VpYmdUTG5pUEhTbEZieWZiTVRyXkpNVVpmbXh7Zl9tcWpkXVZgVm9vWEtUaVhnXlhOVmxUS116YFxfbF1dW2JlYHpobGFvcHZub3d1eph9d4CBeYCAh4Z6eXqDfYGThHF0dH56dnSFiJB+gX2RbHOVgXuCn4V/h32AfoaCgIp7doSsn396iIiEbHKDe3aBgIJ1b4hufYB0ioBqb25lZFhfWlpaVWJrZ1xaX3aCaV5tbFxhV1tca4FlcnR9ampebXh3aXV4c2+HfH5+enZybHpoaXdnXWRzaHp3koBjYlRjbmWBhHV2ZmhpYVdWWWhkkKhvfneAi415cG57ZndteYp6do5xhH5/gIduZHd0ZWhpXWxiXnBvW2hfbXVlemhddIBucmtxe392dmN1hox8iYiBgHhydn50YXBsWHBxYW5vgnpzY3GAbGFtem5qaHl4c3BkhHR4eHRvY2BjbXN9aWtUaF5fVUx1ZFFIV2JIY3dmYkxUcVlLTFhZaWx3e2VlbnJmY1pYXll3Z1VKXWRYaVlZSVdlUUljeVteX21bXl1iZF5/aWpgbnR4bW9udoOXeXKBgH1/iYyGfnZ2hniGjH10dXWCeXp6gouNfX+FiWp0l4F7ip19foV5gHt+fIaJc3GProx7e4eQfmZxiXt0fn13c3CGbXx+bZB6Y3BwYmVdZVZaWVdkZmxgXV10hmhZcG1bXlhaXGx7YnF3dm1jXG91dWl2d3Jvhnl/gXp3bm90ZWh0ZVtndGZ2dpF5X11SZWVpgYFzfGFiaVxUWF5jZJClaHh0goWQd2xteGZ3bHuDeXSHcoF5fXmAaWV3bWBnYV9qYF51a1lmXW9vYnplW3d8a25vcHh5dHVlc4SUgImDiXt3cHJ9cmF4Y1ptbmBub396c2VxgGRebnVoY2Z3enJrbYFzcXtxcGFdZG1vfWRpU2hZWlVOemBSS1pZSGN1ZGFKVW5VSkxaV2ptc3tkbGx0Y2FZWlxid1xUTGReWWpUV0hZYU5Ia3dZX2FuW1tfYmNdhWloYm54eW1vanaBkHltgn6AgZKIhIF3dYl0jId0cnZ2gXd9fX6Mj4F/k35weJaDfZmSeYCAeHl+f3OHhHNwmaF7e3+JlnlldYl6c3l3bHRwf2x5fHCSc15wb2FnYmxUW1pXaWRuZlxccollU3JtW1lYV2BsdmNqdWpqX1tvdXJudXR1a4d9f4F8d29ubGRpcGNba3JkdHaOc1xWU2NfcH5+cIBcYWNeU1phXGSSn2VycYWDkHNraXhrbm55eXpxgHZ/c3t6e2RmdmheY1thaFxfd2hXYl9waGF3YVt8dmpqcm54dHR1aXGCloSIf4V2c2twe2xmd1dbaWxhb3F+eHNlb35bYHBwYV5pcH1ranJ9cG92aW9gWmRrbXthZlNmVVhTUXhdU1BaUkhkdGJhR1ZsUUlQWlZsbGx8ZW1vcmFbWlhabXFYU1BnWFdqVFVGWl1PSXN2WWBjbmNYYWFhXoxqY2Vtenlsb2l2eYZ7a4N9gISafIKEeX2IbY+GcW92en10goJ9i4+Dg5d0eIKUhoGfiXWBgIF0f4Jwh4N2b6KXc3uGjId7ZneLb258cGd4cXtsc3ZzjWtedG9iZ2ZrU15cVmhibW1bXHGMZE5vbVxWV1VmaXNoY3RlZV5bcHdvcXZ2emyIfX99iHeQc2Nka29hXG5tY3N4h2taVFZhYnd7fG+EXGNeY1NaYFpjlpRjbnCChYlyaWZ4bWRydXF6a3l0dW97f3ZfZ3NkXF9XYmRZYnVlVWBhbWRhcV1dfm9oaXNxdHF1d2xthZSDinyGcnJnbntvcW9SWmRpZG9xfnRzYm11VWJxaltebmV8ZGt1fHBxcWhsXlhjaWp4XmZUZFVXUVZvWFJXVFBIZXNgYkZYa09JWVVXbmllfGlseWtiV1xWXHVlVFNXaVJaZ1VUSVtaUE55d1tfZW1qWmJhXl6PbmJnbHp2bm9pdnZ/fm2DgH2GmHt/h4GKf2uTiHJndIB7dYCDfomOf4yTc32KkYWHn4Z7f4aMc4CGc32CdW6kjHOCjYx3eG56jWBlfXFnenR5bW1xd4NnZHxtY2dnaFNgX1VnYG1wXF5ujmhOamxgVVZTb2dza2Z4ZWZeWnJ2bnN8eXRuiXuAd5x7emthZWxtXmBvamVxeX5nWlVXX2t3enpugl5hXWhWWWBYZJyIYmtwgYZ8dmtpdWtbdXBqeWl1cm5vfIFzWWtuYFleVmJkWGVxY1RfYmlhYmxaYH5rZmx0dW9teHdsaIaNgIp7iG5xZnB7bHFsYVhfZ2dtcX9ycl5pbFNlcWRVYm1heGFvdHp0aW5qaV5XYGZodVxkVWFWVE9ZZ1NPXU9QSWVwXWNHWmpOSmBMWW1lYHhpb4BlYFVeVF52XFVTYWdPXmNVVEtdWlFadnZdX2ZtaFhjYVtejnFjaGp4cnNtZ3Z0eYJzgoN6iI9/fIqIjnpukIp0bHOBdH9/iIWHkoSVj3p9jI+HkZuEgHyNhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo2NjY2NjY2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjY2NjY2NjY2NjY2NjY2Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERDR2RoZ2dnZ2WQoqCgoKCjgGRnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTQ5XGBfX19fXZGmpKSkpKd8XV9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJiYmZmSj5CQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaIiYiJiYmJjY+Pj4+Pj4uIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p8fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkJCQkJCLjpGRiYeOipCSk5GLkIyOj4ePkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjY2NjY6Ojo6NjIyMjIyMjI2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQi4WJioaNhomQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCIhYaKhY6Gi4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfXt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkIiFiIyGjIiIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fX19fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4SIh4aIhYmPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin99d3h6e3p6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2Pio6Ki42Kjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgHt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJh4KIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/fn9/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlJOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTk5KSkpKTk5OTk5SVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGRkpOSk5OTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGSkZGSkpOIhZORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCSgoKSkJGRjnWGkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQj5CIcISQj5B8dIiQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Oj4xzb4qPinJ4h4+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX1+fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjXdte4+Cc3iGjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH5+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHc25vhHt1doCFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxZWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d3RiXmRfYWtxZmhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoYl1qbF1lZmdlY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGRkhJSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpaandsYm5yamJZWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVtrcmthbXRyZlFRU1BQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1OXWNva1hpc3VwU01PUFBQT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0ZCRkhVYmdsb3BvbWxaTExOTU5PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVDRkdITVpnaGdybm5oZmRgXl5YTEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7PklaXVpcZWxuam9tbWxraWhrZFNHRUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7Oz1LW2ltbm9qb21ramxtZlFHRURHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHN0dHNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozo9SGNvc21ubGtsaFVDPkNGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN0cnF0eHh5fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk5PUpgc3NwaFQ/Ojs9QEFAPTs7Pjw9PEBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5ent9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT48OkJsfWpAOjs+PT4/P0FAPz9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9AO1tuQD5ERT9AQURfZDs9PTs6PT9BQT8/QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pLSFZwcHFzc3R0dXl6e3x8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo6bXdIODs6PT5BO0hkPTw9PDg6O0REPDw9PDxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJYHBwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUj08PUlMRkV1dk43ODg6Oz4/V2pBOzw8Ojo7TFI9PT05Oj88PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3J6Sjtcf4N/enx3Vzw9Pz09PkVodEw6PT4/PTxPaEtAPDg8QT8+PkE9Oz9CQEJDQkBCQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFRT9BR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFHcnprYoOEg4KDgH1ePkBDQEA9SnN7WTo9QUVCQVBuXlRQSEFDQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEVudH2CgoGDfn2Edk1BQ0VAPz5Ze4BdP0NFSUpJVGhnZV9gWEZNTUZFRUVERUNBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx7fX99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVyQ0RFRENXdYaHh35YR0hKTU1caWhqZWJnWmFOSUlIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ1dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIlsQUFWdIeJh4eHiINXSExOTWZ2b2hraWxuYUdISEdGSEZIRUNEREZFRERISENDQ0ZJS0tMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiIRWbIWHhoaGh4iIh3xQTE1ObHh2bm1vcXBRP0RDQkNGRkVCQD4+QEFCQEJEPz4/REZIREZHSUtJSkhISEdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMS0pUgYOEhIKChYaGhIKFhYSEhoaGh4eGinVKSVJ0eoN3cG1sblY7Pzs6PEFBQD48OTk4PDw9Oz47ODs/QUJAQUNDQkBBQUREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgICAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpJSWWFhISEf4GCg4KDg4SFhYaHiIiIiImMj2dFWWtvem5sb3FzTzY5NjQ3OTs8Ojg1Njc3ODk3ODc1ODg7Ozs9QDs5OTk9PD47PD1BQ0VISk1MTEdJR09SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaIaEhIF+gYODg4KDhIaJioyMi4uJiouNimdkamxjZWl1gXM8NDg3MzU2ODo4NzY1NjU2NzY3Njc6Njc4ODk6NzU3ODk3OTc3Njo8QEdGSUdJRkVGT1NSU1NST1BQUlRlcHFzdHR2eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDY3ODg9Oj1FQ0JlhYOBgIKDg4ODg4aJi4qJiYqKioqLiouLh3Nxb2ZncHJ9ZTQ2ODg1NTc2OTk3NzY3NjU6OTo6Ojs3OTg5ODc2Njk6OTg4Njg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXZ5e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhIWGiYqKiIeHiIiKioyLiouNh3hzbm9zbXFhOTo7PDk6Ozk6Ozo6OTs6OT09PT47Ozw8Oj47OTs7PDs8Ozk6PDg6Ojo6OTk5PD88PEFCRElKTUtJS0xXb3JzdXN2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuKjI2OhHd1eXJvb11CQkFCPkBDQUA+PT4+QD8/P0A/QD09P0I+QEE/QD89QEBAPj9BPD48Ozo7Ojk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PDw6Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLi4uMjY2NgXt7dnNxVktISEhFRkhHRUNBQEJFQ0NBQkNCP0BESEVDRUNFREFGRUZERUZEQEI+PEA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0RGV4SCg4SFhoaGiImJiIeGhoaHiYmKi4yNjIyMjIyMf3p7dF5PUkxLS0lKSkpJRkRER0hGRERFRkRCSElLR0hHRkhHRUtJS0lKS0pDRUNDREJBQkNCRENDRERDQT07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E+QkJHR0lZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2NjY2NjI6Je3pwXFFSTkxOS0pLSUtHREdJSUlFRklGRkVMTE1JSkdHSElKTk1PTExOS0dGR0dFRUNGRUZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4Nzw7Oz06PkA+P0BDRklJUF+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjY2MjI2MjY2Eenp4ZFBPTU5MSklGSklFS0lHS0pJSkdHR0tMTkxMSEhJSk1RTk9OTE9LSUdJSkhJRElISEZGR0dJR0NCQUNUbnB1d3d5enh5ent8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDk6PDg9Pjs9QT4/QURISkxVcYOEhYSEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIyMjIx2d3RxVVJQTUxJR0RISkhNTEdLT0xLSkpMTUxPUE5ISUtMT1FRUFFPT0pISkpMSktGR0hHRkZJRkVFQkFCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uKjIyMjIyMjn5kYGhdV1VRT01MRUZHTVBPUFdVUVBPUVNSTVNUT01TTFBTVVZSU1FQTEpNTU1LTkhHSkZFSEpFREVFQkVDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09QkBCQkdWTkZOUFBUWHuGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyNj4yMjG9fXm9kSFVTU1JLOztTVFJgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTVJRUFBRTExLSEhKSEVGSUlJSElpcnZ5eHl5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0dGRT8/QUFFQUNHRURFTFhSTVRVVlhafIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH5hiouLiHNiaVk9W1pZVFI/QFdWWVxkYFZZYnJdXVddWlZFUVlaW1lfVFlnUlZWWFVUVlRPT01LTEpJSUxNS09NU290dnh5eHh6enp7enp8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImLjH1zc1teXVxTVVNXV1VbWnWDWVV9kGFcWF1fV0lWXV1bW19ZSFlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiYqBboaJiIeEi4BpXFxdW1ZXVVhUUlhWY5aAUmVyWFpXX2hQYGZbW1hcZ2FHT1poZ11bXF1dV1JPU1BQUlZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRUFJSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn6AfWBUWFtWVFZTUlJNUE1MZnpbXVRZVVZdWkxUWlVTVF5aWFdXV3prWFtcXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fHx9fn5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJVY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eIem9zWk5OUVFNT0xKS0VGSUZDP1RkVX9SUVFOS1FUUU1PWVJNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXV1c3N3enp7e3x9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eXFlVUUxJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVGFze3x/gIGCgYF/fXp7gH+DgoWGh4KGhoaBhIGGhYZ2YV5PR0FFRUREQ0FFUUNFQUM+Q0lHVkBITkxHXWlQSEZORkRFRklHSEJESEdJS0dEQkFEQE9RTVNkcnR2dXN0dXp8e3t7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNQVVlTVVFRVFJPVl9rbHJ2e3t4eXRybnN0c3l4fX+DgIODgoCCgIOBgmxPSUJCPDw+QEFAQD9rUUtgRUZISUVCP0dMTkdNUlVJQkU/Pjw9PD09Pz0/QUNDQD89PUI+Sk5HVW50dHVzdHZ4enx7fHx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXkpKUFFOS0xRUlFUVVVXUVFXVVBYW2FdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZURCQkI+O0NDQkJEQlxdT3tOT09OS0xNT09RTEtNV01IR0BCPDo3NzU5OT07Ozs4Ojg6PzxCSD9cc3R1dXV2d3l8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BfXVpJSFBSUU9NUFFOUVJUVlhTU1lUT1laXFdZXV5eX2VfXV5xdmteYGdrd29vbGpvbm5sZWJZSEdISENCR0lGRkZETVJPYVdTV1FQU1NSVVtPT1FWUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxDPmVzc3Z3d3p5e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BWV15aWE1LVFRTUFFVT0xSU1RXWFRUWVJNWFlaVlhYVlhZXVdXWGhza11WYXRrYWFfXmRhX15ZVVFOT09NSUhKTEpJRkNRUFNaV1RUTlFTWVNcZVVPU1RSTktJSEM/QTk5OTg5Nzg4NTc1Nzg1OTpHbnF0d3h6e3t8fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVlVVVVdQU1RXVFVSXW5fUk5aYFtXWTtEVlhUW2ZKTFBTUk9OTU5OTkxKRlFQVVlTVE9KTk9VU1RcVlJVU1JPTUxJSEhGPz89Ojc4NzY1OTk2NzY3NVdwcHN3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF1SVFpXWFVUV1RSWFhZWVlTVU9KR09QT09NUkpPUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBTTUlMSk9SUFJSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9xdHd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmhpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSUdFSExISkhGTE1QTUcvRV9SPjM/PmpvYVNSUUBHVFFQUVBRTlFPUVBMSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR2eXt7fX19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRUZISk1MRUdDT1JDOEVOU11nVFFTQUdVUE9RUVBNTU9NS0xLTE5PT1FMT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydHh7ent9fHx7eXx6en5+fHt1dHVydnZ6e3h6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05MUVNMVFVUWFdVTExLSTw5ODc7PkA+PD1BQEI9PkVIR0NFRklHSkpARkFBQEZIRUpPSFFSYlxRUFJPU09PUExNT05MTU1OT05bV0tNUU9HSUhDSEpMTEtGRkZFP0JDPjxCRz9CP0FkcHR2enp6e3x7enp3e3d5fn58e3FzdHByc3dzeHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENEPTk3Nzk/Qj47P0JAQD5BREpFQ0dHSUdJRUJCPz49Q0JBR0lETU9iZVFNT05XS0xOS0xOTU1MTE9OU2ROSkxSSUlJRUFISkxNTkpHSUdCQUJAP0VGRUhES25vdnl5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR01NSk1QTVBPSEpEP0E9OTg5Oj9CPzxBQkFBREVHS0ZDSEhHR0hDRD9CPz9AQT5DRUNLTlJUTEpJTVRHSUlKTEpLTElKTU1PUFJQSkdDTEdDQkpJTE1PTklKSUdDQ0NESEpNTElZcm13eXh6e3p5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9tcG92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFHS0RHSEhHSktJSktERkI9Pj06OTo7QEI/PUFCQ0NHRklLSkRJSUZHR0NDO0FAQj5AQENFQ0lNUEhIS0dIS0RISkxNSEpMSElKTEtNXVJISERORkFDSkpNTFBNS01KS0ZHR0pOTlFOTGJtaXZ2d3p5e3p9cm1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLREZFR0VGRkdFR0JDQD48PTk6OjtAQ0A+QUNERUlFSUpMRklJR0ZGQ0I7QUJDPkBDRENER0xOSEtOSERIRUlMTk1HSUxHRkdJSUxOS0lHRU5IQkZNS01MT01NTk1LSEhJT1JSU05SZmZmcW9zeHV7enxsaGpuZWtxbHNwZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lERkZFQ0NCRUBEQj4/Pjo7Oz06PD5DQT5BQ0RGSkZJSExIR0dHRkVDQD1EREI+QUNDQ0RHSElHTVFJRkZHS05PS0ZISUZFREVJSkhLSUZIT0tDSUxLT0xOTU9PTkpKSUxSVVVST1dkYGFtZ3Fyb3J5emdlaGhkaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMSEVFSENCQUJEPEJBPkE9Ojo9Pzs+PkBCPkBBREdKRUlGSUhHRkdEQ0JBQUZGQ0JCQkRFREdHSEZMUUxJT0pKTUxJR0hFR0VEQ0lJSEtKR0tSTUJOTkxQTk9PTU5PS0tLT1VXVlVTWF9eXGlhbWluaHJzYmRmZWRoaGZuamZtbWhra21yaXF2dHNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd3dnR3dWpzdW51dHNxcmprc01HSEZIQkJBREU8QUBAQzw4Ojw+OT88P0JAQEBERkhFSEZGSEdGRkRDRUNESUVDRkVCRUdFRkdHRUlNS0hRTUpLSEhJRUZISEVDSUlJS01LT1NORFFST1BRTk9NTlBNTE1TV1ZYWFVYXVpdZGBpYmppZ2tfZGVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW55TUhHSEhCQkJGRTw/QkJEPDc7PT46PjpAQj4/P0JFRkRHREVIRURFQ0RFRkdKRUVJR0NHSEZIR0VDRkpKR05LTEtISkxGSUlLSEVLS0xNTk9SVE9IU1RSUFJPUU1OUU5NUFdaVlpZVlpdWlhhYGFgXmhlY2BkZWhnamhoaWZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXd1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSEhHSURCQ0hFPEBFQ0U9ODk+Pj08PEFCPD8+QUFGQ0ZDRElEREVFRkdHR0lGR0tIRElIR0lHRkRIS0lHS0hNS0pLTEhMS0xLSU1LT05PUlVWT0tVVlNQU1FSTE9RUE9UWVpZXFpZW15eXWBjXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdExJS0lLRkJFR0U8QEdDREA6PD5APz4/QkE8QD5CQUZDRUVFSUVGRUdGSEhGSEhJS0pGSkhIS0hGRkxISEhKR0xMTUxMSU1LTU1NT0xQUFFVVldPS1ZVVFJSUVJMT1JSUVZbW11eW1xeXl5gYGFkXWNgZWZgZWhqZHNzZmpnZ2tvcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SktMSkxHQ0VERTxARkREQzs/P0JAQEBEQT9CP0FDSENGRkdJRkpGR0RJSEdJSEpMSEhKSklMSkZKTEhJS0pHS0tNTUpKTUxOTk1QS09QUlRYVk1NVFVUUlJRUE1OVFNSV1tdXl9dXWBfYGFhYGFjZWJkaGJkaWpndotsamlnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ1bndLTExMTUdEQ0FEPD9FRUVDPUFBQ0JCQ0RBQ0VBQUVHQ0hISUhHSkdDR0pHSEpGSU1ISUpNS05MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlJQV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAREJFRERGQkNFR0NDSUZDSUpKSUlLR0RLSkdJSklJTEhKSk5MT0tJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BhdnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVF93dmlqZ2hmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQ0VFREZCRkZHREVLRkZKTUxLTExHR01JR0pLSEtLSUtLTkxNTExMSUxNTFtzYmRwXmxtVU1OZnNdZmZxbG50Z3BpX2FZbm5icHBia2pqZm9xdGV0bm9cb3VncE1KcXl2a2Fga2VlbXhsa3ZsbXBzcnBycXBxcnFycnJ0cm1tc25ub3BzdXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElIR0VEP0FCQD5DRkdDRkNGRUZFRENISEhERUtIR0xOTkxNTUZKTkhKS0pJTEtKSktMTU5OTU1KTU1OW3Jvb25wcGxrTVBRbFdNaWJ0cnBhbW51XFlsUFxubVpxbWtvbXh4dHNpcF1fcmtxalV1eXhvY15rZmJncG9qam5vcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0dFRUVCQkI+QEBGSENHRElGRUVCRklISEVITEtHTU1PTE1OR0xNSUxLSUpNSUtKSktPUE9OTExOTkxcaGR1XWxxV2xOUFFtVFlrXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdHhrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SExGSURFRUNBQj1CQUNGREhHTEhFQ0NIS0lIRkpMTEZOTExTUkxHTExITkpJSE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5Zcmtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXnRjd3hyam56aGFhY2ZiYmltdHVwc3V2c3FwcHFvcXR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnNzdnNIS0hJQkVFRUFBPkREQkdESElNSUZDRkpMSkdGS05MRk9KS1dSS0dLSkpOSUhKTElLSkhIS01NTU1JS0tLU2tjW2leX2ljcnJaX1lqbl9lZVVrX2NbYWFRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bgam1xcG50eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVudnFxdnR3ckdHRklERUNGQUBCRkVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRUhIS01JSEpKS0tJSElGS0tLTEdIS0tMTU1MSktNTlRbXFRQVExQT05PT1ZRT05RTk9RSkpPUFFkcWlUWVdcW1xWWVtdWF1cXGNmYWFlYmNmX19ma25pbXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0VFQUVDQERIREZHQ0lLTEhGREdLTElFR0lQS0xPS0xXTElFRUhJSkhJS0lNSkhGR0dJR0hJRUZMSUpMT01KUFxXXlBcW2BeTVhZU1xcYl5NWFpNWGFSS1lhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHJ4cnhzcXJ1cnRPQkNETE1CRERCRUlFR0dGS0pLSEVFSUpLRkVISFBLTU1KTVJIR0VBSEZKSUtMSkxKSEZESUZERkdFRktIQ0pNTExVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOXlxeU1peY15aXWBjYFlfY1tgXltUWFdZXl1jYmNhY2VoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoaGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFSSkpNSUVDQkNHSEZIR0hLSkpJREZLS0tFRklKTktOS0hMTkdIRT5HR0xJS0xLS0tJR0RIRENERUFGSkVBS0xKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFZVVVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR4eXl5eX9+fXl1eXZ2cm56d3Z4WVFLRkRHRUJFR0lGR0hIRkZJR0hHSEtJTERES0tOTUxLSEtKSElGP0dHTktLS01LS0tJRkdDREBEQUhJQ0BKS0hQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYl1kY2JkY2ZYUVZUUVpXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGREZLSkZGRkhHR0lHRkZJTEpORkRLS01OSkxJS0pISUZCSEhRTUxLT01KS0lHR0VEP0VDSUlDQ0hHRVRdWV5YX1lfW11VWFhQXV1RS0pWXlheW11VWWFSUV9fYmJgYGJiYGNiYWRkYlhPUVBRWlJbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYSFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBSEZER01SSENRSkVHSEhFRktKTVBFRklKS05MTElLTElJSERIS1FPTU1QTExLS0hJQ0RBRURJR0NDSEZEV1VFXFRdU1ZfWE9UVU5aWk1JSlRgYVtfWF5eYV1OWGFcYGBfYmNiXWFiV19fVFBPT09XUVxbW1xcXl9iZmZlbGVvb3d8e4B7fX+AhISEhISEhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+Sk5GREZGSERJUmJQQ1ZeSUdHSERGTUpQUEVJSUpLTkxLS0xLSUpHRUpOUVFOT09NTUxNSEtBREFDREdEQ0NGR0JNSEJLS09PTkxGTUZHSUpIR0xLTU9QSUxPUE9TUEtPU1JVWllXWVhYZFdPU1RQUE5NTlRSWlhYWl1cYGFkZWNnY2tscHNyeXl/e3p/hISEhYSEhISChIB+e4GDgX17hYSGhoaHh4WFhYSEhIKBgH1LSUVFSEZHREtNXUxGR1hMR0hKSEdNTFFQSEtLS0tNTVVOT0pKS0dHS1BTU05QT01OTk5HS0ZgRURfTEVnZEZOXEleW3JtT01VbVlMRFBgVWtXZ0pdV1VeRExRVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalJWVVRbXFtgYGFiYWJfZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUdGSEVFS09TSUpGYFNISk9KSU9NUlFMTUxMT1JVUk9PSUxOR0hNUVtZT1BQTk9PT0lKUX9RSXxZWXJ0WVFtSHFub2FWUHFxc1BDa3NtcXNwU29fWm5YXVZcWFVraFVdVmNaYFlbX1ZWWH9qdHV1Xl92XldhW1tmW19gYWFhXV9hZ21wbF9wd3R4gYGCg4OCfn1/gHZ4emx2fnR4fYB8foCBgoR8gIN6f4F/fnd3TkpFSE1OQkRMTEZJS0VRVUxLTklLUlhXUU5OT01RVE5PUU9LS05HTVBTW1pUUVJPUFBQSkhaeF1UeGVoWlNVUnZndGxwYm5malFyT013bWpycHNycXJvb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29ycnt8b354boByX2BgYmFaYF9na25rYmxmZ213foGAgn17eHeAdHZ6aXJ+bnN8fnd4e36Ag3h8gHV8f3x8c3NOTEdgXUdBRU1NSEpKR0lPTk1NSk5WXllVTFFTTlhaTVNTUk1LT0hRUlRZV1dRVFBQUFFLSGd4bGN4cm1bS05WeXB1bXVib3ZQZWVJZnZxbXdvgGpmeHdpV3JRaHptaWp6en1seHp/b2hvWXZ2anZ1cIBfcmZ9aWx4fG9eX19iYVpdYmRnaWlkZ2JjZGxscHBzdHNzc3pxcnhibHVncnl7c3J2eX6Bc3V6bnx9eXhybk5LU3VOQ0JGUFBISktJS1BOTk9NUFpgWldLVFdQYV5SVlFZUkxQSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JncXVubXlwd2x2dHRybG5ddH56a215fGt0bHxrcHZ1eF5fX2JeXF9kZGlnZ2VlXmFiaWlpamtub2txb21qcGFjZmNvd3hvbXBzeX9ucXBre3p0cm9tTExbVkhHRUdSUElMTUpLUFFQUFBQV1xZVU1VWVVlWFJSWV1TTE5JVFRXV1lXT1NOTk5RSVJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9acHp7XmB6c2Nyb3hxaGR9aXJ8XlRMbF92dWtpdXt6bX54a3xwXF5eYlteYWRkZmVlZWJaY2Npa2tyc3J2Z2xpaGRnYWFrYWdzcmxnbW1yfWttaGt7dG1ta21PSEtLSEpISFFQTE5PTEtSUlJPU1JXUlZUUFdaVlZVVFRhX1BOTUpUU1RRVlZOTkxNT1BLSFFOUFVMS0xTVFRTVFBWVVFRTlFRWFlSTlBVVFhYWFtbVVJTV1tXWFdaT1NVV1hYUl5ZV15XVVBZUldXV1dYXlpncl5bW1lcXV9jWl9jY2RmZGNjYlpjYmdmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdnanVqaGdpbFBJS0xMTUtKU1FNUVFPTFZVVFBUVVhVWlVRWl1VVVRXVVlXT09LTVZUUU5VU05PTUxRUExKUlFLUU1LTFBSVVNRUlNTSUhMTk9RUlFQUVRWUlhXXFdTUlBSVFVVU1pRTlNSWFZUWVdVWlZUUlZUVFVXWFZcWV1gXVtaWlxcX2NbXWJjZGZkZGRhWWBhY2FiaGhpbWJhZF5fY11aZFxibWFeZmVmbXNkaWdqa2VkY2ZoUEpLTE9PTE1TUE5TUVBNWFdVVFVXV1dZVVNcYFZXVllVWFJQUEpOV1NQTlVQTlFOTFNQTU9VU05STk1PUVVRVVFSVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXVlZZW1RQVFVYVVVaVlhaVVNSWFZVV1tYWV5cVVheXF5cW11gYF1bYmJjZ2ZlZGJYX2FiXmBnZGZlYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmdmZGBiY2JPTE1MUVFMT1RPT1NRT1FbWVdXWFpZWFlWXWpkVlhZWldWU1NPSk5WVFBPVFBQUE1NUlJQUlhUUVFPTVBUVk9YUlRVVU9OTVFUVVVUVFJUV1ZaXVxaVlZRUVZYVltbV1FUVlZWVllUWFhWU1JZV1ZaXllcXl5VXlxeYFxbX19fXlpiYmRoZ2RkYlhhYGJeXmZjY2BiXVxcXFxZWltYW2FcX11cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFPVVxaWldbW1xYWltkcW1oZF9bWFVVV1FMTVZTTU5ST1FST0xRU1JVWlVTUFBNUVhXUldTU1NYTU9PUVRYVlVVU1VZWFteXVtbVlFOVVZVW1tXUlNXVldYVlRZW1VUUlpYV1xeWl5fX1RhXGBhXWBiX1xgXWNgY2doZGZgWWNgYV9fZWRfYGJbWlxbXFlaWVhXXFpcW2BeX1teXmFgX2NcWWBbUU5PTlZRUFRRT1RUU1BXXFxcWF5cXlZcXmpxd3mAY1xbVVVXUE1PVlNOUVFPUlRSTFJUVFlaV1VPUk9TWFdUU1VSUlpPUFJSVltWV1dTVlpYXF1bW11WUk1UVVVbXFZSVVZWWFlTVVpcVVNTXVhaXV5cYGBfVmFbY2JdYWReXGJhYl5jZmlkZl1bZGBhYGBjZV9iXllaXltcW1hYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVFJRV1JUUFteXl1bYFxgVVxdaGpyfXNsZ1tUV1dRTlJaU1JRVFJUVVRLUldWW1paU09TUVZWVlRPV1JTWlJUVFRYXVdYWVNYXVheXVlaXVRUTlVWV15bWFJVVVlZWVVXWlxWU1deWl1dYF1iYl1ZX1tlYV9kZF5eY2NhXWVmaWRmXV1kYWBhYWJkYGJeWFpfWlxbWFhYV1dbWVtgXFtbXFtYWlteVl5ZXVFPT1JaUFpUVVZWU1RUXl5gXl5iXGBVXV5ia3l0bH1rWlRZVFBQU1xUVVRVVFZZV0xSW1ddW11ST1VTWFdXVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUlZRWVhZX1taVFVWWllaV1haXFdVW15dXmBhX2NjXF5dXWVhYWZkXl5kY2BcZ2RoZWRhX2RhYGFgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09QVllRXVVWWVdXVVhfX2FhYGNdX1VdXmJlZXWBemhXWFlTVVNWXFhXV1ZWV11YT1VdWl5dXFRSWFNXV1VTVFhSU1ZUWFdYXV5YXVtWXV9YX19YXFZRWFRZWlphWlxWV1hbWltZWVpbWVdeX2BfY2JhZGRcYlxgZmFkZmReX2RiYVtmY2hlY2ZgZl9fYWFhYWBfXlZVXVlbXFtZW1lYXVpbW1hYWVtZWlpdX11UWV1VTlNZVlNcVFZXWVZWXGBhYmNgY15fVltgZGFfenVvaFlaWVVXVFdbWlpcWVhZYFdQVV5cYGBcVFRYUFVXVlRWV1JTVVdaWltfXlpfXFZfX1pdXlldVVJYV1lZXWJaXldYW1xbXFxbWlxaWl9fYGBkYmNkZWJkWmFlY2ZmZV1hYmBjXWJjaWRjZ19nXmFhY2FhYF5fWFRbWlpbW1hbWFhcW1pbWFZZWFdcW1tgXVZdXVNPVllWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheXFxaVldYWVxcXV9bWVtiVlRYXl1hY1xSVllQV1dXV1dWU1VUWFxcXmBgXWBcV2FeW15bWl5XVVdXW1tfYFxfWFlcXF1eXlxbXVlbYGFeYGRjZGVlZmJYY2VkaGdkXmNgYGVjXGVpZGVpX2ZdY2JjYWFgX19bWFlaWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWVhbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNZWlhdYGNkX1JYWVBXV1hZWVdWV1ZcXV5gYWBfYl5ZYV1dXllcXllYVVZbXGBeXV9aWl5dXl5hXVxbWlxgYl9iZWNlZmVmYlpkZmZpZ2JfY15hZmRZaGhiZmljZV5iYmNhYGBfXV1aWFxZWVhYWlhXWltaWVdYVVVbXV1dYGBiYnhLWFdbWVZcW1tdWldcXV9gYmRhYmFdYFhiY2JhY2FiXVtcW1hXXFxfXWBfXVtgZF1cWFtiZWNhUlxaT1lYWltbWldaWWBdYGJiYGFjX1xiXV9dW15dWVhUWF1dX2BfYFxbXl5gYmNcXFhcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiW2NnX1xpaGJoaWVkYGJhY2FfYF9cXVxZXFlYV1hZWFdcWlpXVlhPWFpdYWNmZnJrf0pZV1xaWl9cW15bWF1bXl9hY2JhYV1iW2JkYmBiYmJcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxeXl5ZWFVbX15dYWJgXltgYWJmY19dVF1gYWNkZGZlZ2VmZmVeZWZoaGdkZGBaZWddYWdoY2hoZmNgYmFjYl9fX1xdW1pbWVhYWFZaVlxbWlZWVk1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4SCgoKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKCgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7enp6enp6ent8fHx8e3x7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnd3dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXp7e3t7e3p6enp6enp6fH19fHx8fXx7enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29wcHp+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a8homJiYmIkMzT0tLS09haJSoqKioijNvS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29veoB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIqU3ebk5OXl61QTGhoaGxCP7+Xl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXV2d3d3d3d3eHl5eXl5enhvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2DhISEhIOEeHNzc3Nzc32EhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5d3Z2ent4e3h3dnd6eHp5eX16eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3l5eXl5eXl8fX19fX19e3p6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd2eX17e316fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjYyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3Z6fXx7fnl8enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4OEgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3dnt9fHl8enx7d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp5en17e3x7fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4e3h6enl7eXh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGhIOEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgYGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYGAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgYKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgYGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzc3NycnFwb29vb3Bxc3NzcnJycnN0dHRzcXFxcnN0dHR0dHR0c3N0c3NzdHR0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHNzcnFxcXBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3Nzc3NycXFwcG9ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJzc3NycnFxcHBwcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcXNxcnJxcW98gm9wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcXFwh4ZwcnFwc5iCbnBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXF9oYJwcm+LnnxucHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXWdoXdxd5+cfW9xcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXFwcHBxcHBxcXFxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycZiokG+Co51+cHFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4d3d2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4GDeXJzc3JycnNycnNzc3Nyc3Ryk6mkeYignXxyc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f4B+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn18dnZ3d3Z1eHp4eHh4eHd4eXmftKmkqKiXfXt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7fHt7ia+mobWrrKN+e3p6eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX19fX2YpZahsqCZp5N9gH99fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYCBgZycjqCvoJ+in4CAgYB+fn9/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f4CAgYGAl5qOmLGhmJachXx+fn6Afn5+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjImGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+foCBfn6fq6WWpJublqCfhn9+fX+Af4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgYGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4KDg4aNn7KooqCYnZ2mqK2ooJmQh4GAgIGAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI+Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODg4aNoK2xppuaoJuenJydoaSjnZSHg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYOLl5mXlpigmp2dnZmal5CJhoaHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4SEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGBho6Uk5eanJyblI+Jh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5OSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SDg4iQk46UmJKHg4KFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgYKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGTkZCOkI6RkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4GCgoKBgIebh4uHgoKCgYCBgH+BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo+PjpCOiYmHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAf4OIjoCBgoODgYCBgIGAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYmGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZaIhIKEgoJ/f4yVgoKBgoSDgoeIgoKEg4OCg4ODg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmYuDhYSEhIKAkZmGgoKChIOCjJGBgYSFhIOEg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSk5CNjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgY+Mg4F/fn18fYycjoCCgYGCgoSUlIyBgoGCg4GOm4mDg4ODg4ODg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpOSj42MiIOEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlZeJgH19fX17gZiMgIOBgYGAjpSMkIGCgYKCgY6doaWgkYSCg4SCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICVn4p+foB9h4t+hISDhIKDg4KNiYWMgoKDgoODi5KPmaall4SKiIKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf319fX+ChIODhIaPlJWSmKCgmJSGg4SEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaGhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMioiFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDiZGDhIuFgoGBfn2Bh4aDgH5+f39+f4CDhIOEh5iXm5iWmZiak4aEhYWFhIWEhoWFhYWGhoaFhoWFhoWFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWFhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+gICEhYOMm4mNmZmWlJONh4aGhYaFhYaHh4eIhoeHhoaGh4eHhoaHh4aGhoWDg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4mIhYaFg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf359foB/f39/f4CAf3+Af3+GhJaZgH2RmJiXlY+Ih4iIiIaGh4iJiYmJiIeGh4eHiYiGh4eHh4aGhYODhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhYSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4OBgICBjImBgIGBgoGBgYGAf4B/f357eoCLn6GTjZqbl5WSjYmIiouKiIiIiYmLi4qKiIeHiIiIh4eIiIeHhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSSkI+RjoqGhYaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCg4OCgoB/fn19fX1+fnx7e5WjnJuhoZ+QgoqLiYiJi4qJiYiJiIqKiYuJhoaGhoeFhoiIiIiGhoeEg4KEh4iIiIeFgoKBg4OCg4OEgoGCg4KBhIOEg4GOk5KQj4+LiYWFhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKDg4F+fX1+fn5+fn59fn19gZOVlqChm5SHiYiHh4eIh4eJh4eGiIeGiYmDg4SDhYSEhYWGiIiGhYOCgoOFh4aHhoaEgoKDhIKDg4SCgYKBgYGDg4SDhJGSkI6PjouHhIaGhIKBgYGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoOBfXx9f4B/fn5+fXx9fnx6f4+UmZuampWOg4SGhYWDg4WEhISEhISFhIKCgoGEhIGCg4OFhoWEgoKBgoKDg4WEhISFhISGg4ODhYOCg4GCg4OEhYSHkpGPjY+MiYWEhYSFgoGBgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAgIF/f4GEhIODg4KCgH19f4CAgX99fn59fH19e3p6g4+RjpWXmI+BgYKCgX9+gYGBgoGDgYKBgoKCgYOEgH+AgIGCgoCAgIGAgYKBg4GBgoSDg4SEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgIGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn1/goSEgoODg4J+fX5/gICBgH59fX19fn18ent7hoyNkZSWhX9/f4CAfn2Af36AgIF/gICBf3+AgYF+fX1/gIF/f35/gIB/gICAgH+AgoCAgoGAgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GBg4SBgoKDgoOEhYCAf3x9fX59fX6AgH59f359foCDg4OCgoGBf319fn+AgIB/fX19fXx7e3t6enp7iY2Nkol+f39+fn9+f4B/fn9/gH+AgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af39/fn+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhIOCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/fn1+f3+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp6enl/jo6UioJ/f35/f3+AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f36Af35+f3+AgH5+f39/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enp6enmDj4uUlIKCgICBgH+Bf4CAgIGBgoKAfoB+f35+fn6BgIGAf39/f4CAgH9/f4GAfn9/gH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEhIKBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WCgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXx6enl5eXqHiI+Wh4OBgoOBgIKAgoGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGBgIGAgoF/gYCBf4CAf4CAgH5/f358fImUkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgIGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fH19fHt5eXl5eXyChI2HgoKEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoGCgoCBgYCBf4CBgH9+jpOMh4iHiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGBgYGAf4B/f4CAgYB/gIGAf359fX1+fn9+gIOEh4eEhoaGhYaGh4eGh4eIh4eHhn99gICAgoF+fX19fX19fX19fX19fHx+fn58e3l4eHl5en6Bg3+CioSDhISEl5eDg4SBfX6BgYKBgYGCgYOGiIyFg4KCgYSCg4OCg4WEhIWDg4ODgoODgoKCgoODgoKRkIuIiIeJh4aGhIaFhISEg4GCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gICAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHh4eHiIaHh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXl6e31/fIWRg4ODhISUk4CBgX9/f35+hIuAf4CAhIaQiYWEgoKBhYWLgoGChYWGhoSEhYWDhISDg4SDhISEiJKPjImIiImHh4eFhoWEhISCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eXp6ent7f4KAgYGDgoB+fX9/e4iRfHyOln99f3+ChoqFg4OEg4KDjYl/fn+DhIWFg4SGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp5ent8eXh8fX6Af4B/fXt8f359gpWRf4SIfXx+f4KEfHyBgoSDf3+Hg32CgYCCgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn19fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e35+fn9+fn59fXyAgYB9ho+Bfn2Cfn9+gIJ8fIB/goCBgH58e4qCfYB/foGAgIGCgYKAgICBgH+LlJCMi46OjYiIh4WFhYSDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYWGh4WEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fXx5ent7eHh5e3t6fIKAgX+AgX1/f4B/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSSjY2Ojo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoCBgICAf36Afn9/f35/gX58e3x8fHx8fHx8fHx9fXx7fXx8fHt8fHx6enl7fHp9hYODgIGBfoB/f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fXx+f4CBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6NjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+ChIaGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fHx8fX59fHx8fX19fXx+fH18e318fHp7enx9fX+GhYOAgIB9fn1+f36LhIGHfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn18fn+AfX6Afn9+hJKNjYyPjYyKhoSFhISEg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOBen5+fH5+gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fX17fHx8e3t6fX6AgIODgn9+f3x8fH18fIGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgX+Afn+CgoJ/f4KCf4CLkI2NjI2LioiEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f3+Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn1+fX19e3t9fXx6fHx9gYKBgICAfX19fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISCgIKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9e3+BgH9+f36Af39+f39+f4B/f39/f39/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5+f35+f358fH18fH18fX57fHt8fHx8fXx9fH18fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJiomKiYWIko+NiYqHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/fn9/f4CAf35+fn1/gH9/f3+AgH+Ag4KAf4CBgICAf3+AgIB+fHl8fn1+fX1+foyGfX1+e3uDg319fXx9fH19fX19fXx9e318fX1+fX59fX19fHt7e3x7fHx7ent7enp6e35+goaIh4iLiouLiYyRkI6KiYaFhIKCgoKDg4ODgYGBgYGBgYGBgYGCgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEg4GAgIGBgIF/gIGCgX9/fn9+foB+e36Bkox8fX+KgI2Mfn59fX1+fX1+fX18fH19fX18fX19fn19fn58e3t7fHx9fHt6e3t5enl5eXt+f4ODhIeJioiJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2BgX+BgYF/f4B/gIF/gICBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+g5GEhIOBf359fI2HfX1+fX19fn58fX18fX1+fn1+f3x9fHt8fX58fHt8fXp6eXl5eXp7fn6AgYOHhIiPjouLh4WEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKGhYSCgYGCgYKBgICChIF/foGAfX6Bfn1+f4CAfX6AhIB+fn99fn19ioV9fn99fn6Afn19fHx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6ent8fX59f4KAiY6LjIiFhYWEg4KCgoKCgoGBgYKCgYKCgoKCgoKBgIGCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICBg4F/gIGEgX5+gH99foB+fX5+gIB/gX5/gH9/f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fn18fHt8fHt7e3x7fHx9fXyKiomJhoaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgH+AgIOBfn6Af31/gH19fn6AgH+Cf4GAgICAgYB9f39/gICAgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8foqHh4WGiIWEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhIOFhIGBgIB+gIJ/fn9+gX9+fn+AfX6AfX19foB/f4GAgYCAgICBgX5+gH+BgH+AgIB/fn19fX59fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAiIOEhIWEhISFg4GCgYGCgYCAgoKDgYKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4GDg4ODhYSFg4ODhIODhIWDgX9/gH+AgX59fX5/fn5+foB9fX98fX1+gX+AgICCgICBgIOCgH+AfoCBf4CBgIB/fn59fn5+f31+hYWBgYF/gIOBf36BgH9+f3+Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoKAfoCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CAg4KBgH9+gIB/gIGAgYB/f39/f3+Af4CBgoKCgX+Ag4J/f4OCf3+Af4F/gH98enx6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBf3+Af4B8fX1+gH1+f39/fn1/fH5+foB/gYB/fn+Af4GDgoOAf3+BgYCCgYGBgICBgICAf4CBgICCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fH2AfX+AfH9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhYKEhIWEhISBg4KBg4F/gIF+foB+gH19fX6Afn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIGDhIKBgIGAf4GAgIGBgIGBgYODgYF/gIOAfoKDhICAgoGCgoSCfnt7fHx8fX59fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWFgoSEhYSDg4KDgYGDgYCBgX1/gX6BfX19f39/f4B+fn99fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOGhYF/f35+gH+AgYCAgICCgoGAgH6Agn9/gYKDgYGDgoODhYN/fX19fHt8fHl6e3p+eXt5eH9+e3x7fn19f3+Bf4B+gYCAgYKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hYSEhoOChISEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAf39/f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+AgIB/f4GCgYB/fX+Bfn+AgoKAgYOChISGhIB+fnx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB+fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1+gICAf39/f3x/f3+BgIGAgH98gH9+fn6Afn1+foGBgoJ+f359fn5+fn9/gH99gICAfn59f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e3+FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAfIB+gIB/gYGAf32Afn5+f39+fX1+gIGBgH5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIKAgICAfX5+f4B9fH58f4CBgICAgIB8f3+Af3+BgH9/fYF/fn9/fn19fH+AgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t7fHl3e3l3eHd3eHt7ent8hYl9e3p3enx9fXx8fX19f358fX5+fX19fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYGBgYKAgoCAgIB+f35/f318fn6AgYKBgICBgX1+gH9+f4F/gH9/gYB/f399fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5fHx8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fn1/foCAgYGCf4KBfX6Bf3+AgX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2EfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZKNenx9fHt9eXt6enh6gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgYCBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgYCAgH9/f31+fnyBhol8fH57e355ent6e49/d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoGAgoGCgoKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKBgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3p4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x8fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoGAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgn+AgICAf4B/gICAf359gH9+f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYKCg4CAgoGEg4OEgYGDgYKCgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgIGCgH+AgYB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58e318e31+eHd2eXl6e318fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCgoSEgICDgYaDg4SBgoSAhIOCgoCAgoKEgYGCgYSCf4CAf4GDgoGAgYGAgH+BgYGBgYOAf4CDgn9+f4KBgIB/foGAgX+AgIGAgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/f4R9fX18f316fX97enZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfH9+fn59eXl7enp6eXNydG93cXd5c3d7hYKCgoKDhIKDhIOAgIODhoODg4KChIGEg4GDgICCgYOBgoKBgoF+gICAgoGCgYGCgoCAgICAgoKBhIB+gYOCf3+Ag4KAgX+AgoOCgIGCgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3x7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cXl0dnh0dnuEgoOCg4OEgoSDg4GCgoSGhIKDgoOEgYSDgYOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4J/f4GEhIGDf4KCgYOCgoKBhIODhICCg4KDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoGDgYGBgIB+fHyAfXx4fHl6eXp7fX98e3x8fX19fHyAgICAgIGBgYGCgX+AgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgYKDhYWFg4OCg4SChIWCgoGCg4OBgoGCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgoCAgoSDg4KBgoKBg4KCg4ODg4OEgIKDgoODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKAgYB7fYB+fHl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgYCAgICCgYCAf319fHx9fHZyd3h4dnR/dnV9h4eDgoSFg4OEhYSBgoSGhISDgoOEhIGDhYOCgoKDg4GDgYKAgoB9gICBgoOCgoKChIKAgoKDg4KCgYCAgYOCgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn+DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX5+f359fHx4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhIKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOCgoGBg4J/goOEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fn1+gYGAfn59fn1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIhoWEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBgoOEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDg4KDg4OBhIOBg4OEhIOEhIWEhISFhYWFhIODg39+gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB/fXx+gn9/fn5+fn19f39/f4CAgH+AhISEg4SFg4SDhX9+goqLhYWEg4KEhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4SDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKEhYuJhISEhIWFg4eGhoSEhISFhISEhIOEhIGCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeYN/f39+hISCg4KDgoOEg4SEhYOEhYaEhYZ9g3p9fn+De4WDgYSDgH99fn9+foGDgX17f31+gH59fHx8fX19fXx9fX6Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWDioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWEgmh6cnNzfIBygoR+g4N9gX1+f35/goOCfH+BfX+AfX18fHx8fX18fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgoKEhoaDhYSGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhIZ9cHuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdtenNugId6bX1yc3Zzdm1ud2xweWx1fX9+fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYGAgYCAgIGAgICCg4KCg4WHhYaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29sd314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fn2AfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIWFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYSFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39/en59fX59f39+fYCBg4OAgoOBgoSCgX+BgoB9f3+Bfn9+fn+BgH5+gYKAgIKEh4aDg4eEhISFh4aFhYWFh4aIhYWGhYeHhoaEhoaJiIWEiYqIhYSFhYaFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBhIGAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJiYeFhYaFhoaFhoaEhoaGhoaFhoeHh4aGg4aFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SDhYSFhIWEhoOFhoWFhISFh4aEhIWGhYV9d4WDhISDgoF+f357fHt+e3x9fn9/fXx/foCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWHhYWFg4SFhoWEhoaHhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaFh4WGhoiGhYiHh4WHhoaIhYWGh4WGhoWDgoWFhoWFg4WDhISGhIaGhIWFg4aGhYaFhIaHhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9fn58fH59gH59f4B+foB/fX18gH1+f35+fn98fH1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSGhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYaGhYKDhYaGhISDhISDhIaEhoaEhYWDhoaFhoWEhoeFhISFhYOEh4aEgoOEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2Bf3x8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoWEhoaHhoiGhISEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFhoiFhoeFh4aHhoeFiIeHh4WGhoeFhoaFgoSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4SHg4SBgoSFg4GAgIF7e359fHx8fn18fHx9fnx9fH59fHx9fHx8fH18fn17fIB/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4SGhoWHh4eFh4aIiIeHhoeGh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4SCgoJ/gHt9f318fHx+fXx8fXx9e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoeGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4aIhoaIhIOEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9/fnx8fX99fH19fH57e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaGhYSFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFg4aGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYKCgYOFgoN+gYKBf4SCf35+f35/fHx9f317fX18fnp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8fImHhIaEhoSGhoWEhYaFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhISHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFiIOEhYSGhoaIhYWEg4WFhoaHhoeFhoaGhYaGhIOEhYKBgoGAhIODgn2BgYB/g4F+f3+AfH98fX1+fXt+fXx9eXp6eXt9fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWGhIaEhYWFhYWDg4GDgYCBgYWCf4B/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeGhoiJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoiFhYSChYWGhYaGh4SFhoaFhYaCg4OFgICBgICEgIOAfIGAfn6DgH1/f4F9gHx9fn1+e359fHx5enp5en19eXp7e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaFhYWEhYWEg4KBgIKBgICAg4F+fn6AeXp9gIOEhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYWFg4aEhYeDg4aEhIWEh4aGhoWGhIKFhYaGhoaGhIWGhoSFhYKCg4R/foCAgIGAg4B8gX99foJ+foB+gH9/fX1+fX97f317enl6enl6fH15ent7e3p8e3t7e3x9fX18f359fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhIWGhoeHh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWGhYWDg4WEhYaFhoSEhISFg4WEgICCg39+f39/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXl6eXp7fHl6enp7e3x6e3t7fH19fX2AfX18fH2Af318hoOGhoWGhoOEgoWChYGBgH9/gIB+f4GBfH5/f35/gIKCgoSEg4KBgoSBgIOCgYCEhYSCgX+AgoOChIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOEhIWGhIaGhoaGhYOEhIOEhYWFg4SDg4SChISAf4KCf31+fn5+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5enp5enp7eXp6ent7fHp7fHt8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4J8fX9+fn9/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGChoWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFhIODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYF+gn9+f4J8f359fXx8fHt7enp6enl7eXt6eXp6ent8eXt9e3t+f3+BgH1/fX19f4CAgIaEhIWEhYKEgoKEgoGAgYB+fX5/fn5+gH19gH5+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFg4WDgoOFhYKEgYOAgYCBgIGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fH59fH6DfXt+fH2Af4CDfX2AgH9+f318fH19e3t6eXp5eXt5enp5enp7e3t6e319fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMzMzLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PkJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lgZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PD45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT0zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWy8vLy8vKysrLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU09LT09PT09TU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw7OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OR6jZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1svL0NHQ0NDQ0NHR0dHR0dHNysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19jX19fa29ra2tra2trb3Nvb3NnX19fX19fX19bW1tbW1tPS0tPT09PT09TV1NTW1dXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtAPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTUaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbLzJWFhoaGhoaHh4eHh4eCsuLd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0jYuLi4uLi4uLi4qKioihv729vb29vb28vLy8u7/S0tLT09PT0tLT1NPT09vi4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5FybGlOU2JMTFZNPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS1BGntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXy8xuUFNTU1NTVFRUVFRUTKDz6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFhSU1NTU1NTU1NTU1NOeq6qqqqqqqqqqampqaiw0tLS09PT09LS0tLS0tLf6+rr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYd2xpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUJAOTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18vMcVVYV1dXWFhYWFhYWFGh8enp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpp5cVldXV1dXV1dXV1dXU32wq6urq6urq6uqqqqpstLS0tLS0tLS0tLS0tLR3+rq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDs+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fMzXheYWBgYGBhYWFhYWFapO7n5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaqiZmFiYmJiYmJiYmJiYl6Fs6+vr6+vr6+vr6+vrrbS0tLS0tLS0tLS0tLS0d/p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk6Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzMzHxcXFxcXFxcXFxcXFxcrQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Pzs7OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzLy8vLztLS0tLS0tLS0tLS09PS1dPU1tbW1tbW1tbW1tXX2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo7ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M3Nz8/Pz8/Pz8/Pz8/Tz8/OzM3Mz9PS0s7Nz9LOzs7Ozs7OztLTz87R1NTTzs7T08/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX19fX19fX19bW1tbW1tXV1tbW1tbW1tbW1tfW1tbW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvVkpfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztKrnM/SrYODlc/RpaLQzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT08PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK2nKWkypu8uJm1s6CiqtLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/OnZyRnrOmjYGNxp6YlpzHz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4+PDw5Nj9CP0I6NjQ4Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Rv5igm7WYo4qr1rqYop6vsdLPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9COjc0Ojo6OTs7ODs9Pz0+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/P07SZlqq7iq2rm6WxmZaws6nU0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PDk2NDo5ODo6OTc7P0A8PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8qgo7/KnKWMp63Yqpmq1M/Pz9Srmn6jkY2lnJankJmEnZOj1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD45PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDUrJuni5aiqLSqnn+gqYWZpdXR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDR0RBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q07aysqWZq8/YwZyAvK2mmK/W0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkmxdXG9naGJdT0Y/SEhGRUA8PD4+PD09PDc1Njo5Njo7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXEopmWnaeRoZ6emaiWmJq61dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTo6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6DH1aKrpJy4pKujnsOgq6Sb0NLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtLQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09PIko202amPkKzXwo+Nu9TR0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVaWpbTF9NSkxKVUxGQjw8P0ZFR0tJPTY2Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oz05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR1MjB1dLVwL/W0tXFxNXR0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/Pj5BRExMQT43NzU6ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dHT1NLS0tTV09PT1NTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj09Nzg2OTc3ODk5Ozs9P0A8PDg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRENJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZJRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ4ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+PEhGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0RFQ0FMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhRQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29ra2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ojg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Firzd29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc2ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tvc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg2NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv72+v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7Oz4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU5NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU1ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBGPjg7NzI3OTY3NDUzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBCRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO1tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7e3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi3t7e4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6uvsKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo6Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmpqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3uLe2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpaWlpaaoqKioqKWnqKinqKinqKipqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7a3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo5Ojk8Pjo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OztAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelpKSioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpaenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0E/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6SlpqakpKOioqOioZ+fn56enJycnJ2dnZydnp+goqGio6OjoaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5iXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAP0JCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqSkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc1Nzg7PTg6Ojk5Oz07Ozg5PjY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKunpqCdnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6alpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5KUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqanp6afm5qboqCalpeVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6Wmpqako6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODk6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/PkFBPkFBPzo5PT46UJ2gn5ybnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+mpp/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWjoqWmpqWmp6amoJuZm6Ggl5KTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5ODk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6SmpqWlpqempqKdnJ+hn5eRkZCUl5udmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoKCfoJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PTo6Ozc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaSmp6alpaWmpaWjoKChoaCZkpCPlpuZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaCgn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU5ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKjoqOkpKampaSko6KhoZ6cm5WSlJicmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODY4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+foKChoqOjpKSkpKKhoZ6bmpmXobWemZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpmXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6ChoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKCgoKKkoaKioqGgnpybm5uZn6ubnJqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaCls6ygoJ+fnpyZmZqam65qdp2dnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuam5uam5qYmZiYmJiYmJWUk5GQkZCQkJKSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goaCfppKbq5+goJ6bmpqamaiERICfn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmpiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs5Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnqCeYpymnp6cmpqbnKGjUUiEoJ2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZuapmZdo6CbmpmbnZyudUlMhqGcnZ2cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxRPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmKSAUniimZmanZugpF9WToehnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGgoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFxcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJuYmJmgiFtflJqZm5yco49kWk2Bop6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbW0xGPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiZn5ddXXaXmpydnaKBZFlNf6Ken56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp6enZubmpydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZmaYGFggJadnJ6YdGNVT4Gin5+fnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTo7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmZn2leW2V/nJyejGpfUFOGnpuenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOTc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0JAQUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qal5NzaGFUdpOXnIdcVlBXipKOkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaOimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkY6Smp6SfaCjlqScbkxPY4aGgo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg4CEoJ2Of2uWpZWff4l/X3J/gIKSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2OTM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5/gKKLfG5SdZyMjFlxfXx+fXyGjo2Lho2UkYuQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj07Pzo4PDk5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhYCCfZiad1hPTHGUhoJLX3Bxd4iFio6LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYB+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYt/iI2Mi4uHkY2jjVQvMD14h3d3QERda22EkImJkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmQnqGdk5eboZqdm6KmnGdCW0g7eHlrZ0UxOFpsc5CPi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6mpr49KcqJ5QXx4ZGJRU11JYG6KoaGknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipqmnqKN4YMHWpUN8jYJ1T22OdlNkf6Oop6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBEQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkp6eZnaSlo6KdYn+9wK54oKOalWVMYXhtUXSVoqKgoZ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmVkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioaKnoaaupqadnmqEnLqPqNGimrOoWEysk1Nlj6CeoKCenaCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGoqq2xsq+roqKGd359cs/IsJqnr2tVqrBjW4eln6WioZ6gopiVnpufn6ShnJWYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFVcaGRvY21paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKehnpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqevt7e0tbazra6tj4aDbpHMu5STpJZ0VG96c3B9lqaqp6Sgn6ObnaGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQENDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7K3u7u7ubnBuLS1oIh5ZFiftr2mp5qId2txb3h5e36GjpKYnaOlpqulpJihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odmtxaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW3wcbMz87Myb6zpJBzZlJEi5WGhoZ9eHFuZ2ZsaWxycnFycnV9janExLuip6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FpYWZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PFx9vj49rLvK+kl4h0WVpRRGl4a250bmtlZVlXXVhcY2pqaWZhaYq1wcC5qa+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3b21bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxr7N0tXKuaedlIZyXlFUS0RbZV5jamVhYGhZVFhTVllaXVlbdZq3vKy0sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Ef2pmaGFrbGdudnJydnJnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/wsHHy8i3lHVlVVBPVEg+XmxeX2ViYF1kYVNVV1ZVVVhznK2xqqiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3VrbG5kb21pcXhveWppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO5uMObYUlER0tEPVtlYmJpY2BbY19XUk9QUFaAtLqsrqWko6ikoKClmam0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnZSTiYl+hoiMlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent3bmtpaHZaZ3N4c3pnZ15kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTExMLEwa2DT0ZNRTtNW19la2VfW2BZWVNOVYCjq7m1sqypo6GtqaynrZ+stLS/w765uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl2dmVmampoXmtwbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMfCxpZqWEc/P0deY2JqYFpYV1RWd5q3wLu8urysraapu7q5t7+ztbiywca6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rraussZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWh2aGpqdW55bF5kW1ZgWUxIRDY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnOxcbGvalyUEswWFNVZmFTTlBxqcjIwsTHwLy+tLCwsMK+vsHGwL63tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2tr7WkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOi5R9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ9eHBnYGtqd21pZnZvdGNdY1VXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwsPCwbyRP092folWTG+ly9TFtr+/wL+6u721s7PAv7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5gHNwZmVnZGxlYmtub29fWV1XVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvbzFp3drg5CXb6rJyMfRwa+9vbi5u7u+t7Swub6zvL6xubW4vLa8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFlYmFjZGRqY2dkW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Aur/AvLvFvbrAxL+9vq9zZX2RiorRxb+/yb+wwb+6t7u+ubW4tLi8tL24tbSws7yxt7e4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhY2Noa2dnamZqXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz05NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdWNuL+7w7W6x7a1uLq8uLm2qqSYjn6Eyb+/u8G+uca9wr+8xbi2t7S4tra7u7i2tLe6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVncGplbGhZWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vM/Ed6jMvce3ubettrS3ubO1sb3JxJVKe8q+v769vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfWtucWdxa3RmY25gXFVIS0tESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTWrnSAu8jPwsC4rrS0u723ubG9w8qOQ3XNw8K/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXJmbGpvdW94ZGhjXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsbJ0plxcqvR0czKxLW6v8TIvr60v8DAeVJuy8bCvsG8v8PMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0cG1tdGxtb2BjX2JiTklNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQw7q+vMS+t7zAv8nPx8jKysKGcnOjzMzLzcrGwsPLzsG8uL26snBjYrvIxMDAv8TAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIe21teHxgcWRcX2BfVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u7q9rDvra+wL6+uqacqbK2w7+leXV4mcTHy8jBw8DAycrBv7u5saF9c2utyMXEv8DBv8vHw8DIwLrBv8OzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXpuc3h0aHBeXF9dWlJGRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vEuW2szr22ucC8rH1uaG5tcoGVmHN3fJe9v8bAucC8vsXEvb24sbCYkH2Am8rCw7y9v7/Dw7+/x7y8wrWsrrS0vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bXV7cW9qXGBhWlRRQUZJR0tARUNJPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5udm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzrR2gLO9trXCpYdpWl5gTVJbWm5zd4CfuLjCurO7t7u9v7q7u66km5iHkX7AxMO+vL+7u7i2wcK1wbqAoLCsr73Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra8tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z2eG5yYV9nXVtVSj0/P0dHPUdDQzk6NTs5OT48PDk6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmohHiJoK+1nWplZ1ZZYElJTVBTbHeGpbC3vrmytbK7uby2ub60lZyllqFwrsnEwL2/ubOusry6rsF+cKKrpqy6vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybWBkYlxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/Fq4h8dougmWBUQ1hVR2FqVk9FSmCNoKyvtrq1tLKsvLm4tbjBvYuYsKKlcqXLwr+5urWupayzsKmkVICWoZ6lrba0wba1s6WnqqiwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8cHZzb2ReaFldXlNPTkI/SkNBS0pANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJqRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7WRgniHj29OSj9kWUJOd4CUak5BXYGwtbO1srSvrLu6uLa5v8Z2g6qemmSnv7i1srGtrZ+kpqeliEmDj5mYmZ+prbirqqqepKmkq66vp7Crr7GxrbGurq+5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2dG12amxdXGtVXlxQTkhER01CR05HODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e3lYyIhHtYRkFOh1lKSlh3jYFjQVOjubO0srCxrbC5uLa7t7q9kKKyq6Nyq7Cpq62ro6ignZ6dpG9Ke4aJiIWPm6ito6KjnquvoaOpqKGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeWl1dG9lVWJkWF1ST01JQElSRE5DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yvKqZmZVpTkBSeHFQSUlLZpuBWUVSrruxrLOvrqyttraytLWvqaafmpudnqaonqCoqZ+hp5ablad6Ym5se4N+gIibqJ+en6G6pKWdo6OgnqWgpKylpqiloqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CWlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqaSpq6aprKumoYh4g3x2f3pjeG1uXVFpVVBPR1BNTUNQUkE/Oz40Ojo1Ozo9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2qpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3Cq6W+aUVSnYJRV0lKX0lTjmBjYoCutaqytK6qq6+wsrOtpZ2Rl5OPmKCfoqCco6SfnaiUmpWgtZ6Dfo2Ri4N6e4yZnZynqpKqnJ+goZyhn6Oop5ynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJaTj4+SkZmQlpWYl5+YnJmbpJmXlJWanaCdp6iloKOioaOfnaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fIB1dn1ubHxkaVZTZE5KSEdPU05LTkg8RUA9MkA4NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutra6ubq3t7uuqKChqaCqxr/LoVBBc554T25LS2JldHNgWl5wkLGvrrO1qqasrKObmZSNkZWXmJicn6KinJ2knpqklpaVw9rDurahkYyMhHNrepmfsYGbq6GfoKefnZ+jpqieo6afqp2qraqup6iwpaOkpqespqKlopuZnq+orrKrpquqoJuYmJiVk5aak5WWmpabl5iYoZ6cnJaboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJfIB+d3l8ZXl5YWJTVmFJSUtMU1VKU1FNOT9BNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpMfHj1dTSWSkXGV+b3JdUGtjW2RfXWuPtLCwuKymoZydmpSYmpmQjpGVkYyOjZOZopyXopiWquHd1dXRuaGKiot1ZmCOvKFyqq6rpqKxo5qjpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKehoKOxrrKxtKqyrqOZnJ2eoZibm5qYmZuVlpuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2mCbWVcU1taTVJLT09WTVRNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp6rpI16VWlydnVwY3Z2WFdjYGNnWVhXZq2urK+nn56ioJaQk5ugnJmXkpOfnKGjmp6blp6Znb21sr7DxMGxlIB4bGlhjbRxhre4trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7W4s7itsrSkoJ2loKyhoaKhoJqZlpafm5uYpaGgnqOhoJ+bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dmp3dV5tW1JhSVJWSEZWV0tDTUg9S0k4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqK6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuioaCkgG6CcGBjWExbU1pNTFBYUkhNTUiYrKqppaCfmpKRlJiYlpaWjIiLjpSdnJ2dnpadl6yXT1qDo7e8tqJ/bmVoaXKBX6q6vb+6rbW0sLewrrSppqSlrKm5s7W7w7zDwbe7tquusbm3vK+zsLXBvLe+s7O1oqyiqamyqauop6iamZ6aqqegmaegn5+oqKWln52qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhX52cm1pd21oblxYXENXTkpHTUhDRk49Pkw+NDw6Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqamUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOfnYpiV15lYFdNUUc+Pj9DQz8+QlF4qa2pqqagnp+io52fnpudm5STlZSenpiUhZ2Zn5msZkFSWnqjsreogmhhaHFwYIHHvr/Cv7a6u8DDub27rK6nsa2xwra4wsbAyMrAyr+wubm9uMK+uLS7xsS9w7y4tKqzraqztK+zrqqvo56sqLeyraOwpqGjsLGusKSlr6OhoJqhpqGkqqqZnaCZmqKgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF8dHJrbHVycWhXXFFGVUhESlBJP0VCNEZIOTY8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw8Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfn5V9YF5lYFFHRDxDPkU8Pzk2Tn6qs6eko6KgnqWspp+YnZWSmp6ZlYyKhoiGeGyGn6Kkm2xve2phg6aupn9maHmIjH6zx8TCx8HAxcjN0MjLw7K3tb6yvsW7vszNxszMzNLHvr/Aw77Hx8K4xMrJxMHHv7q0uru1u7ewtrKru7KvvLfAu7qruK2rqri7tbyurrijpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5WUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrZGlveGtlWlxGTE1FRFRNRUJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEA/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p+c2phV05FPklZfG9iQj1cjq6soJmbnJ6emZeXmJONj5eXlI+NkIyCg4J2cnBsb42krY10fKKVZWaUnpl5aHyQnaKpwc3LxsjExczQ0tXO08m9wL/Du8bFyMXR083T0NPTzMrBxsfGysjPwMnRzcfGyMbCvcTBv7+/tb6zrb/Aw8PHxcjEr7+5sri9xMLBu7y8ta6np66ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXVzZWJncm9nXlpaRE9NQ0ZRSURDQTU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjk7QUE7Oz43ODY6Oz5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOem52Wa2ZdVElEQD9Lhp6lmoSgsq2jnpyfmpiXlJOUl5GQkI2IhISJh4OAgYGAeXFxbmp2orGIco+4xZtie4qFdHGIlKGlpbjRzMzNz8TN1NXY0dfNxsfJzMPFys/K0tfS19LV1tPUyMzHzM3K083O083GycrKwsfMx8nJxr/Ds7PIxcvLy8/Hyr++v73Bx8XMzMnJwMPArrCzqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuWkIyGkYuAe3J1dmdjZ3ZqZVZYUkROR0BJUUM+Qj06MjJBPEU8Nzg8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+OTo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hnGNTTEpEQz9DUq7RvbKvppycnKCkoZ2alJSVlIp9eXFsZWJocnBye4WKgHVwbXBybYWfhWmEtdeXamx2cnh3g5Cbm5u21NPSz9LD0NPW2NXV0svJztDLxs3SytLV19nW2NPW2M3Sys/RzM/RzdPQwMnIy8TMzczPz8bHyLbAy8DSzczQx8rJwMTDyM/N0NHPzcrIzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYWVyY11SXEpLR0FGSUo/O0E4PjU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpaWgoqJbSUBBREFGUXayr6aalJefnJqgoJ6bnZqViXdpZGFfX19fXl9fXWFsdXNwb25rcG5zgolmbKe1aHxjX2V0cHiIiomKp9XT09HRzNDN09fW09XQz9LT0cnT0cjQ19fY0tjS19nV1szPz8nN0szO0cDHxMnHz87R0dLIzM3Ay83G1M/Nz8nFy8fHyczL1NTR1c/SzNPCucWxpai1rqibqKulnbKosLOsrJOPk46Iio6Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUWBKSkNFQ1NOPzw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD9APUZBRD2CpJygpZ6lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu319TV2dnRztC/vMzJtr6up6qooaOsZ0M4PT5EWIKqqJ+XlZeZmpyfnZibnZN9cWVjYl9fYV9fYWBeYGBfYGVtcHBtam1vc3WAaF6DmIqDWUxaZ2JxeHJqaJfUzNXU0crPzNPW0tHVzc/V1dHF0dPK0NTV1s7T0djY2NfLyM7Eys/NyszAycHJys7P0MzQzs7Mz9DIzNDRy87Lw8rIys3LzNLTztTS0dDQyr3IubCuu7m1q7awrai4rbO/u7GajqCUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Bva2FkbnBhWFxbSUZGRE1ZRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD85ODo/PD04Oz5COjo9PDpBPT08OjY9PT9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+ZpaegoKOnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksnxIRkI7Vo2hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBgYGBgYF5gX15cYm1ybm1wcHJydnNnaXBxZFhQUVdYYWJcV0un0MnS0s7GzszN1MvO0szK1tbQzNDTy8zQ0dPKztHV0tXWyr/KwsbNw8jKw83ExsnLy8/Lzs3RztTMx8nQzcnHy8bHwsbKzM7R0cfQz87OzNDFx8G4ub3Dwr3DubKyvrC7w8O1qpiloZiWkZWVkouUjZqRlJSPj5WCiYZ5cXJrbWhgYHFoWVhoVk1HTElRUUI7RD87Njg6ODo7NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc2Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMrV1tna29jMzM/I1tXEwrWvtKigrZd4bG9wd4+ajYyXlZCTkZGVlpWQi3xlYmJiYF1eYWNiYF9fYGFhYF9dW11ncXFvcHFtaW11bmVxc3J4cFZPTlR5d1VuwcDDzs7HxcfNytHHys3NxdDSz83M1MrHys7Px8fP0svQz8W6xL/Gyr3Dx8nOxcPIwMfOyMTNy83QycXF0MnGwsbJxb/ByM3MzM/DyszJx8zQxcXIu8fDycnCz8G9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+CeG91ZGtgXmZxYVtXYEdJSEdJTVVHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7utpLZ+Z4KGoqqTjY2Wj4WDg4OBfYSEfnNfW15dXmBeYGNkY19dXF5fYGBfW1pcYWtycG1taGdpanNfZXyGhWhXWk5WoJZlm7q2u8fFwcPAw8jJyMjJx7/Ey8XHyszJxMHKycHBy8/Ey8i/ucG8xsi+wMbPy8TAw7vKx8i7ycbFysG+wsvGxcS+xr69wcTGzMbFvL/Kw8XH0sXBycDKysfIxtDDw8bDrsTLx8PKt7+8urOprKSlmJ+YrKOhppujoJuVfHdzdWZqW2FubVpcWFJETEdDR0RMREZTPzU0MzM1QD0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL64vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srC2bV56fJ6RipKWhnqAhIV/dXh1cnBfWltdYGBiY2RkZWRgW1xeXV5dX1tZWlxhbnFtaWZna2huclttcG9ZS11eeaGJbaCxrq3Aubm7ubjAwcHDvb24vL64w8nExsK9xsC3u8PIv8HJu7a7u8XDv7zCzsPGvr61wb7Eu73HvMO6tb3GxMLDt8C2tr+/vM3Evba6yLu/vszEwsbDxsnHycbQxsLMyLLHycPOzMDFw7+8srewsqeoqLmwpa2wqq2slHp3eGtlaGBob2RWXllKRkpGSEtBRUJGSkE5OjY1ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1q7e0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1dfNys/FycXHwbrFvayup2BjdoGSi4iLhHh/hoZ/fYN7dHRjXFxdXmBgYmNiYmRlYl1cW1xeXF5dWltcXWdyb2tkY2lpa3Z3ZmBoYEZmYneBb16XqqiitLG0s7Kys7u0u7C2r7OusbrBu8DEvL+6tLK6vsC4x7i0vLbAwr24vcfBw7u1r7O1u7+0xbi7tay5vb7AvbG7trC3urPGvbevvL+1t7XFvb7DxsDExsbHzMW/xsa7x8u/z8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpHQkRBRUY/PTo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TFy83IxcjNzNDLzcjJyMrJysTQzdLPzcXHwcXBv7q4ybersJpbZ2+IjoaIiXp4foWGdneBfHNoXV1dXV9gX2BkYV5jZWNfXlxbXlxdXlpbW1xfa29sZmNmaGhqeHBTZW5kXVdiXUxamaaimKaor6upq6iyrLSvsaetpquyu7m1wrm6ubCqtLm7s8G5r8Cxvby7tbvHucO3raqosLLAtri9sLGosrO1u7yrrranrrauvLKwqriwrruuu7i7wMG+usO/xsPFwLzGwcfKuMXHxb/Hw8O5xMbCu8bJzMuzucK9u7OJdHZ3a2lgYmxpWVdXW0FMTE1KRUFDP0ZBOjo6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcTPx83Bwsa/xMTDw8rCycq/wLzCurO1tcOuqrGTW2l+koiOj3t4fYmFeXuEgHduXl1cXF1fYF9fZGNiZGNiYF9dWltaWl1aWlpaXGNtbWZkZGRmZ2x5WVJoY0VLWlM+XZifmpOWoKaroqahqqirqq+ipZ6prLS1sLy4r7evqK24tLO7t7O8r7i5tbK8wbLArqWpo6uxs7OovaqrqKusrrW0pqmuoaWwqbOmp6iupqi3rLGzt7q7u7K8vr6+xL+1wcDHyLe+v8W3xcPAu7/Ewr7EyMzKv7/EwMCph3N0c2ppXGFvZFdWWFBIWlNTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDx7m5y8LLvrvJtr3DvrrKt8HDwrW2vLaxr7W8ramrk2NtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9dXVxaWFlbW1hXWVxfZWpkYmNhZGRobnJCRkVEREZTSV6WnJOQipuepaGhnqSkpqWsn5yao6WssrC2tqewq6eqtKuzubC1ta22ubKwurqxtqSgpKCmsaisqbmqpaenqKezraCnp5+cpaasn5+npKGhsa2trLK1s7Swtby2u8HAsru+w8GxubnCs8C9wLW4vL2+vMLHxMPEv8DEoIR5cWxiZmBrb2BVWV9ITmhPVEhGS0Y8PUA9Ojs8ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbq9tqCelZ2gprq2q7Ozu7PEz8nLwsW4t8fAzL+4yre7xbizxbizv8CstryyrKavtK2ho5JpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGBeXFtcXFhZWFhYVlhaXV5jYmBjY2NiZWVtZjM1Qj01R0NulZqPjYSXnJ2jm52doqSipp2aoZqeqq6ssbSjqKmpq6yktListq+ssrSus7WvsKqfnp+korKlpqq4raKmpp+orauZn6CfmZ2fpZqZo5ycnrCprKiqq6ytsLO5r7i5urC2vLu6q7OyubO9tLeysba1v7W9wL3Dwru7vZeEe3NsX2VeZGRYVFdeSVddS1BHSkpHQTw/P0E7PzwwNTYzNjo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67uMHBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uci4uL+3ssK0sbu7rLq6saKfqaunmJ6QbX6Fhn94cm1vbWtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFdXV1dXWFdaXWFiY2NiYmNkZXFSMTo0LzhCXmOMlo2HlZydpZyYm6OloaObnp+YmK2sra6xoKSiraunobWwsbGsqK+yp7qzp7ahop+co6Gto6Kqtqqio6aepqajlpmdl5manaCal52cnZytoayoo6Smrauzs6q1sLKrsrm0r6qvsrKzt7Ouqa2usriwura6vb+3s7GUhnp2Zl9mX1tZVlNaVUtbUUxKRUhLSUM9P0JCQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+ynaWjmKWxw7W2va20uMLMyMbAxbbBwMfOt8DDvbO5ubK/trG5u62yta+fmqOqoZSaj3h/g4R/eG9xdHFoZmRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVVdgYmNhYWJgYGRncFBRPywxKyQ6a6WViZCamZyak56ep6Kcnaabmpmqpq6wqZuiorepoaCuqLWqpqetsKS3sKS3oKOcmZmqpqGarbmwo6GknKKgoJOVoZSWlpyZmJaXnJWfqZ6qpKKeo6qqsa2otKyqp62zsKWrrrOxr7Cvr6eoqLKusrSwvLS6uK6jlIJ6d2VfYVdZWFNSVEtNXkxQTEdITUxFPUA+PUI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvre9rZ2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGuvLu1u7y1ubmwsLGqnJqhqZWRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1ZVWmJiYWBhX19gYmhwaEoxIhwmSkl/louOlZqXnJKcnKSjoaSlnZuepZ6qrqWfoKK2p6GhoqizoqWnpa+lsa6rtZ+hnZaVqaGilK2xsZ+jo56emJyTjKCUkZOYmJKWmJiXnqebp6KimqSlpaukpbCnpaOrrK2mqa6vr6uoqqqzpqarr7Sxrry2sa+vn5J7eHNlYlxbXVhOTFFIUmFNVlBPSk5PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepaasuLu8wcW6srm1xMnJwMLGxce2xsSzwb/Fq7e3vba9uru1sqytqJmZn6OLinSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVlJUUlRfX11eX1xdXl9hamlHOjQvOml8cISLjJCdlZyTmJyin6mjoqKhoqGbqKqjmZ2jsKmhoJ2kqp6oop6srKqprq2ioqKVmKKanJCrqbCcn6Kfn5eZk4qdkY2SlJaQmJiTnKGjnKWhopagoqSlm6OrpaKkqqSrraWusqmmpaemtaaqqK2ztbS5uq+qrJ6Mc3FwYFtXVlZSR1FPSFpcT1JKVEtTTEVHSkM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Nzs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Gtnainr7m5s8DIurXAr8XIzLrByczItcm8sb7Dya2xuMG1vMC8tLWqrKaWmpyciYFyiIN7dGlpaWxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RVVlVUVVVSU05QWVxbW1xcXF1cX2JrSzVCQlJ9hnd7iouLlZWdl5edpKWnpamlqKWhl6SsopSYpK2on5uYmp+erpmcqrOfpaafo6OhlJSblpaSqamtm5yfoaCblJCMmY2MkY2SjZaVkJ2hoKOdnKOVm6GjoZiiqKOiqKugq7Ckrrilo6SjrK2qqKuvtLeyvbWzq66YhXV0aVtZWVNVUkZYTFFbWE1VT1BMUVJJT0pCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njg6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7euqKivrpupqKy3tqy8yru2v6zMxsW4wM7Px7PEu7e7wsixrbi/t7y+u7O2pqmglpiZl4h6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOT1FYWVlZXFtaW11eZmNVWGxtfIF6gIKNiZGTnJuWm6elo6uppq6jppedqp6UlKOnpZyXj46Zna2WmKeqmJ+dlKWgnpKRkpGTlaiqpZqYmZ6elo6Mi5OGiY2Dj4uSlZGgnqGkmZaflZqhop6Um6Wlp6mooLCwprG9p5+jrLSqrqevtLC5tcCxrrCrkX5ydGNWVFVOUUpHVlBSUkxMWE5LTE9TR05LQUNGRUM+Qjc1ODg5Ozk6Nzo6Nzw9Ojs/Pjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7SsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqxt7i8vcDDsbCxt660tLuztKOjnZ2Yl5WEgHZrZ2xucW5xam9rZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlRRTU5NUldYWVhYV1pbW2BqcGpwZXd9eIN9jYKOjZGWk5mkl5ynpKSpnKWXnqOakY2eoZmWloWEkZqjj5WinJWWlYeimpuTjI6KkJqlp5uVlZeckZOIlI6LgYyNgJCLkpKSoZqgopaUmZiVoqaajZmkp6mnoaC0sqizuKGdo7asqq6ksrKmtbu0q6yxoop6c25eTlFRTU9ETk5OUEtGTk5KSk5OUUhNSkFITElIQz45NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2sKSnpKqloKmmpLOqorLEtbWys8bFt7rDyszGs626vbS4wK+uqbCepq67r62gmpuelZWIfIRuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU5NS0tTV1dWV1dXV1pdYWdfY15yeHN8dId9h4OOi46ZnYuWmaGfoZeklJ+alIyGmJmLc42CfY2WloaSmpCTjo17mY+cjIKJgIqYoKOekJOYloWOgpR+fnSKjnqQiJOQkJ2bmpqSlpCejqOjjomaoKGkpJuitK+ssK2fmKa4pqWwobGunLG8qqmvqZmEeHRkVk1SUFBNQ1NOTFBNQlBRSElOU05JSkpFS01HS0s+ODQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNDg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY2Ojg3QTd4t6GjtKimpaijpaWmpqayp6a0wbivtLDJxLi5wM7GvrOsusGsrcStqKKmkp2mt62joJGWl5KQfnh/ZldWX2dmaWdobmNpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpHTlNTU1RUU1VZWl1oXF5bbHVtaUdSa4p8kIGHl5KHkI2dlpuVlZWSjZWIf5OJXztXb3uLk4mAjJKMj4aGcouEloF5gXuGlJ2Vg5aOkI+Dhn2TeHFwho19iYGQjpCXmpmTi5CKnYifmIeIlp6aoaCXp66prampnpats6KlrZmtq5iotKOpraOTf3RuYFtOU1JXTERUSlBNTEZOT0lFTFFNS1BKSU5QR0pKPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebegoq2hpqaqoKapp6OqsKintMK5sLWwx8K4s73Pv7mvrrXCp6rEqqKdmIOUnLGjmpmHlJCLh35zdl1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU5RTUtIRkhOUVFMT1JUVVhZYWNaVmhwZUg7OnuQjIp4go+IgIaJmIuVlYmRhoSThXiIf2BKUW53ipGDfoSMi4R/f21+f5N3dXZ4hI2acFGNiIqGfH55lHZnd4aIfoqIlYuOkZOXjISKiJWEm42ChZKblp6dlKSiqKmlpJ6bsKqhpKSRpqqWoqqcoaaninduZl5cSFFRU01JVU1SSUxLT0lIRkpOTU1VS1FSUEdKRD03Njg6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Nzc3NTM0NDY5Ni8zLy4xMTUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2m6KnnZ+hrqGnqKWnqK+sqrW8tri3s8G7tqe5yLi2qKi1tqqyvKeelY5/iZSplpWLf46Eg354cW9YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERDSU5PaFlPUVNTVVpoZlxkbVxdU02KgI+Cb3mBfHiBiZB/kJmLj3qEjX50f3hybnVwdI6OgXp+iquFentodnuOcHJteIGLjZJ4e4B7gHdzcpJ4aHWFhISFfJWKiIqNi4B/hIuNgJSEfIGPmJSclpGfnameoKGdoKmln52YjaekkqCglp6fpIFzaWJdXUpXUFJIS1hST0pNTFJKSkpMUElMUU1SVU1GSUI9Nzg7OTk+PTo7PDk4QD86Oj48Nz09Nzk5NDc3ODU2NzUyNTE0NzIvMi4sLi8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6qlrauwsaq9tLK7uLa6tLGft7qyqp2drKmosq+impGNlIGOnI6Rf3eGeHx2cG9qWUtISUhHRUhIUFRUVFdWU1VVVVVWV1hXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE5RUVNWXmhtaWhZa4OPlIuMdmJ0e3J1e4WNeoKYkn9whY16dnpua36tfHSQi396hpKAfH90ZnV8hmxvaHN8io2HgG16cX1xbXaPcWhxgX6OcESLhYKDhX93d3qMhn2Me3V9jpKPmIuSm5ujlpmdm52eoZyWjYulm46dl46WmJB4b25nY1tYWFVRSlNVVE9QTlBWS05LT09KUU9JT1BMRkQ9Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKawrK6rp6mwr7Gru7iru764s6ynm7CnrJuPlpylqaWhmJqOhJJ5iY+Li3ZxfG11cWptalhLRkdFQUBDREhMTE1RUk9RU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFellKTk9RVFhdYWdjXnycoL18bnJednNqd3SFjXd6iYRua4qQd3N4aWp/gnGWkYyBfZV/SZKZbmd3foJtamRseYWQkoZrc2x8bnJ8hmltcH9zjYmFhnt+f3t3cHR0hoJ5gXlwfI6MipODlpaYmpCTlpaZlp2WjIOJn5KLko2GkJeAcGpvb29ZVlhUUlJZT1JVVFJYVU1PSE1LTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuYm5+krK+iraqota+urLO/q7zDv6aimpWkmJ6NhIuUoaGYmZGTi3OOeoCGjIZ1b3RscW1la2tZTkRGQ0A8Pj5BRkZHS0tLTE9SUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JWWlFXWFedfluTYmxyYHlraXt2h4Vzf4WDcmuXj3Jye2lqnY5MeYWTiYSNZjF2h3JrfX2DdGZldX+EhIWAZmlsdWtwgHxocXF8bpONj3t0fn1xcW91bYN/d3l1anmIgoiJg5aSkpCLjZGUlI6XjYB5iJeIh4qGgJCIeGxrcGhlWFJbWFlZW05QVVZZWE5JSEVKSkhHQkBHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVtkoiakJmWpKitnrGep7qvq7KwwrG7w8ealo6VmYuOhXqEkJiVjZCMkIdxh4J0h4yGenBzcW9wZHBnX1RGSUM/PDs5Oj9AQURDRUdJS09RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVUtBSVBIX6mtmmp0cWd4aG1+fYF+d4GDg3dwnpJyd4BydJOHNXCdqJ2NoKGEooV2cIZ7hnx0jK6NiYFoZ2JqbnJtcIN1aW9YdXCOm5F2bX97fW5ybnCAe3N2bmJ1g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2OfHNycW1gXF1eXFpZYV9STltaWFdMSElGSUg/Q0FCSD9DRD07Ojc9Ozo7Ozk6OTk7OT88ODg9Ojg7NjY2NTAxMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpGBkoiVkZ2kp56vlaW0qa6wrsGyu8HFlo+MlI+AiHxugZCSiYOKh4+GdYKEbJWIiHx1eHhteG53ZGpeSVBHPj83NDQ4Ozo7PT5AQkVITExMTE5QUVNUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SUkNIfm14dXRweWhyg4R4eoGAfIl7dJ+XeH2FgISZhJqcYYaqnpyLg5COeneIfomIjnSLl4+Ee11kcXR6fHeKbWhqYnlvhZCCem+BeHWFenB0enhrbmlddoZ9h3yHho5/ipKXg42FjIZ9cYR/hH12d3t8iXhxdHVnaGBbXF5TXGdeV1FUWFtVR0pKRUxHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTQyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIp/k4yRnJ2epZGgq6CxqK/AsrvEupaOkZOHeoZ2a3+LkYN9ioOOjHiDgXOghIp9fYF/cIF+emh3a1JYTEBFMjExMzc2Njg4Ojw+QUVGRkdJS01PUVJTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklLTU9RS0pUW1dQSGJ7gXSCdHZteIuHdnmFhHuThHWel4aGjZGUpYysqUiGra+uioGAlIuCi4KEkqmIgZiYipx0bXyBhod+jmhnaHl/boWHgoVxhIZIbIB3cnl2aG1rX3Z9goh/h4SLeZScm4mLiJF/enWKdnx4bW93foF1dXNtXF5eXGNkWGdlXFVQUFdZUERMS0ZPSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NjU2Nzc4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5COlZeSlqCdrKCmuK+zvbOXjZKLmIt9dHB+iZJ+fYyDkpR9hn6GpIeIf4KIhXiHiX5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9Pj9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s/Pzk0Ll2WcHOjVUZJS0xNT1dgV2xYWltkhIt+jXt+fICMjnuChY1+l5KAnp+Wk5qZpa2SmbuxprrHw6eLjKGljpOJgZF8cYOen5Gdf3eFhYuQh5BpaHCEgXSMh4SKcoaCd4iAe3aEfG12dWZ/lI6GiIiGh4egqqKWiY6Xf3qBiHl5b2dreH58gHVsZV5bW15qXmJnYFpPTE5XUlFIUEpETkdDSkRDQERDQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZneCen+Mf4GRjoqam6Sdoaymqq6wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOhICBjIqCiY2Df4p/bHBqXUJANC0tLy8uLzAyMjM0Nzc5Oz0/QkRISU5RUlRSU1NUUlBPSEVCPDg3LzlDPjw8NjMubJOXTVBISkxLSk1WX2F7ZWRpb5OShpOMjYaJipWEj4yaiJ2dkKCoo6Kqk6i1oafBwq3Hr3i5lJp8jaGemYSThYKOoZ+UmZGFioWPmpGWbHB1ioyClYyNjnePhHFthYGKlpGChYhyiKCVhpGJjY+WpLSom4yUooOHkoN9f2tqanyCg4N1Y19lYFtobF5sbF5XS0hOUlBOTExGSVBDRE5GQkNFRkM+Ojk2PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnF2koZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXmAkoiRkn2KhJiSkIOAgIuMiYaQh4SJhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOT1JUUFBRU1FOUElFRD47PDpERj8+PDg1Mjw/UjVISEhMS01OUl5rhnlwfXiWlJKgn5yVnJKekZmbpZulqJ2mqqiptJarvqu1x8i2yNDPvpugcGmrqZ+Ek5KFnKCam5mmkpGIlaObm3h6fpSYk6GTl5eBlJ57d5WSqrKIjJaefJOdm42RlZijoaW1r5yQmKeHlo+NgIhsc3N9gX5zamFeYmBiaGRgaGdcUkVKS09OSUlMRkdNQ0hMRkZDQkdFQjs4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbX1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Ljo18ioaPkI6BgoCJi4qFkoWDhomBgId3XmJQNDYwLTIvLC4wLy4vLi4wMDE1PkFBTVFSU1FSU1VSTlNMRUVAPD49RkdAQUA4NjYyPDk7RkhHSUpNTlFZa4KMdI+FmZ+hrbezoKmoqaSmsamutK+vq7mwsr2bssOrucnLt8O/t6WisLOsraqji5aYhKWmoKOXgaaZjaKqqKWIhZSkoaGqoKSoj5yxi5Wjpre6m6Cir5KinKGdj6Khq66rsrShlKSpiJmIkomVeXp+hoFpYmldZmNfZWReZ2dfW09DSUhTTkZIS0ZKR0ZGSEFLRkRGRkI7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhiV2luWHqEdoGThYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5GOg4SBi4WGiJKGgoWJh4iHh3FuYUBFNjQ8My8xMTAtLCstMC4tND9DQU1VUFJTVVVWVU5bUEdIRDw+PkZIQ0RBODs8NUM7PUZLSUZIUU5QV3+Pm4GonqqjqrrCv6ewwrSqsb6xtruzvbPAtbu6orjFqLXIx7W9uLSoo7StsLGbmZKan4inr6ullHafpJehrLK0mZaqrqivtrqyuqywtaKxrLG1u7a0rbSfpqeippmor6yxuLe4ppq1qIykjpCSn4Z4goV4W2NlV2djYmRhYWdgW1RKRERMVFBISUlESUdFQUBAS0RCTUc9ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWVFiYld5dXGBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiXmGgIyTjIeEgY5/gYmPhn+GiIaKh5B6eG5dV0BFTjw2OjQ1QUI3NjQvLzZDSEJRW09RVVdVXFdQX1VJS0tBPz5HS0ZFRDs+QDdENz9CSkpFRlZTUF6MoKqgrq67r7K7yMWzucO7srK/tbbAs72vtnSws6W6xKOvxriws7Gzp6S1tqqxoKKXm6KSpbCupq2rp6SYoa20u6Kosrq1vL/Mv8XFvb2zwbe6t762ure4q6uwpK+orL2vvLrBwauYuaeUrY6Xl6mIfoN+bVhkYllsZmtmWFxjWVZTSUdGTFBHQ0hJQUhEPj9CQkxAP01EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUVZTWFVadmpwfo6DgI6EbnpzeIdiuaGZo4mUlJaSlJONj5eSh4d7hoGNlYqAhIGKenyKh4Z8ioKBi4OVfXd6dWVQXGRHRUw7UWNhW15TRj87SFBFWmNRUVlYWmdZVGBfTFNQRUE/SUpIRUVBQEQ8RTZCPkhHSkxTWlRdkauzsbezxLm2ucfKubrAu7a0urm1vLO5scVgdLGksZqeqr2ppairqqOisrWhq6iflZafmaCupaempZ+klKOnsbSosrO9tsK+08nJ08bDxczCysPAvby+u7u2tK+4trbCucW9wsevnripoauNpKe1iIGBdGFjY19YY2BqZ1NYYFZSVUlFRU1KQT5HRD1LQT1CQD1HPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtKy9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWPc2xycnOH1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaKfoOAgnh7i4OHe4t5gYqCl35zfXprZnB1WV5cUGVkYmBlZF1bWFdcTWRtVVJtbV9uX1hnZFRZVUpEQktLSUZISEhIQkk6RD9IS1NUVVxaW5K2vbW7s8K8t7bIybi1urW3uLK2s7KttbaYZHWnnK1wXqKsnJigopuknqqllJ+fkJOOlpmYqJ+moJ6amYOknq2lqrCtuLC9udTRz9fQyszSzM/Nysa/vsHJvMC8wMDExMTJvsfNsqO6sLSumqu3u5iAfG1fYl5aYGNaZGNRW2BTUEtDQUVGRTxARj9BSEI/Qz06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVtZaF9vlpKQlG5sb3R1h7SsoaGfi5mcmYyNlZGakoaKin6IhouQi4h8gYNze4qDhXuJdIKKhpV/c3t5bG11e2hyZWlsaWZqamlgZmlpbFptc5atpLyIhmdcb2ddWlpUSEtOUEpLUEtTUUlMQUpGSk9fXmFmaWGXtcSutrC5urOvwsW0rriwsLursrClqrerjLWnnZqnmk2ZnYyOn5aRppillYqTk4mQiY+RkZ2boZealZeHn5qnm6yvqLCotLTU1NTW08zQ09XN0s/MxMHJ0L3JycrJ0cbMzcLP0bevw7zDuaS1ucGihHFlXl9fWmJZWmdaUV1YT1BCQkhFQkg7QEM+QUc/P0E3O0M+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZUmVWc5CQmIJncW95eYOhqp6ml4yam5eLjZWRmo59iYuFjYqJipCHfISCcH+HgYZ7h3KDkouOfXF4dWxxeH5xem14c21pgHBtY2ltcHhpd3x+y77B36dtY3huY1tiYEpQUlVOWV5PXVxOUE5UUFRUXG5tdoJxlqy2q7Klr7Spq7u/sKq0pqS4pqutn6u0o46wrZqXmIyPkpGEjpuBjaaRnImDi4SKiYSLhJSVmJeUm5Gcl5man5+rrKWooqytz9LV0s7M09TU0NTRzsfD1NHGzdLT09fM0dHE0tbFwc7Hx8KovbfOnnxxaGBlX1hiU19bUFFUUU9IPkBGQUJFPEBBPkRDPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxVUU1OWnWGhYp3bHdwfX5/oZ6eoYyMmJOTi4ySj5WFeYWQkI2LiYiQhn6Ce3F+gICHeoR1hZOQiH9vdnJrc317d3tzgnhya4BzcmlvcXp5cXq+y5p9i7GEdnKEdmhha11DWlpbVmVjWGRqU1hcXWBjXWN3en2LgZipo6SgnqCnpaqvuKqls6KhraGjraGmsZ6IppqTkpGJj46IgZOJapSijJmEgYZ+kYODk5eti5WNlZmOhpKRnpeosKKhoaWkqcnNz8jCzNHU0tTSztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMPCy411cWViYVpWWlRcUUtHSkpKQDs6O0RBRDxCQz5HQj5CQjo8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7T0xGSlhwgHV9aHN4coKJgJ2VnZSFi5WJjomIjYaOf3iDk5iKjIiIi4h+gnhze32Ch3d/eoaRlX+DbndwbXV/dXh9dIV8eW2HdnRufXaEdHh7nbWMO0GKxaV+jHxpZVdJQ2ZjZWNnamNtd1teZmhrbmhugIKHkYucnaCckJeYnqOjpbGjpLKfoaWdoKiforGbhZ6SkZGPioyKhoOPhH+cm4yNgoSFeZR/gqmVo4yRiZeSi36Yi5uSq7OYm5yonKe+w8a5tsbO0tHS0MzSy8jUztDV2tfX2NTZ2M3Y287J2drR1b7Ky7V6eXBnX1tUV1JcV0ZHSklFRT06NzpAQEI5R0Q/RENBQ0I7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjXyXkZ2LfoeSg4mGhImBh3x4hZeWiI6Ch4WHeoR5cXp7g4V1eYWOjZx5i3B8b296f3F7gHGDh4Fujnp1d318gnR+fIaHr3NYqcK2jZGCcG1iPV5ocnBxcG54doFlaG9ydXhxeouGjZORmpWflYeLk5ugmp2pnqCrm6GamJ6knp+rmYqai5CRjYR8h4eDhYuOn5mTiIOHfmyZeoSYhoiTjI2UjIZ8nImUkK6qlJaYn5mnr7a9qa2+x8zJyczL0MnD0srU19jX2NfV29fT2tvV0Nra0dbI1MuWfH5ra11cUVVUYUlDRklIPkE+PTc6PT87PUc8P0FBQURBPj86ODdEQjc1NTQ3OS81NTY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OTlEPkNHUmpebWRiZmt2gIhxkZCagHqAjX6CgoGDfoN7fISYjYeLfoWHgHeCeW57e4aBdHmSno6gdo51gnN1gX1zgIRvgZCCb5KEdXyBhXp2hnuJt8Wkwcm4gZabj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWlJSOl5CCiY6WmZaVpJuXnpWdkpGWop2Zq5WQkImMkYKMhIiIgYWPkZ2bmYmFi4GFmHqIiZ+XkIiNiouCfaGJkYy8oZiTmJmcqaamrp+otr/AwbnIys7Oxc3J0dbV1dnV19vU1tna29fa2tnYztvGiH18amxoYlZZV1dOTEVOQzs9PTw4Ojs9OT1ANj0/Pzw+PT05ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs5OjdJUF1bU1VYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWGVhXVtodHp5bIqNknd2eop7foB+f3yEen6CkYmEhXmEh3t1fXRtfH2GfnN+kp6RnoORe4Z+eI9+eIqKboKagHSZhn6BiYR7fpB6j6mOj8OhvYucpJ19iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CRhIiKkJKTjZyZkpOPlYyLlJ6clKCUkI2Nj4t+j42NioOIkpaanp6Ii5SRnZGBi3+lmIiEjYKFhIGlhoqMuJidkZWWoqehnp6dpK+3urWswMbK0MjHzM/T09LY09XXwNfY2dvY2trZ2dfbuHt8e25saFpiXVRQT0lETEI8PD45OTs6OTk7PDY/PT48PTk5OzszN0RAODM3OD42MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw6RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg2ODk/PUNRU1JYXlVYZm1tbWmBjopxcnmKe3p/fH97h3p8e4uGgn10g4V5c3pzbYB+hH53hZuim52Ukn+MiH+Yh4Cbkm6IqIV6oYt8kY2DiIScfZqQioyjoqCQpK+fi5CLhYuBk4ZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlIuGh4uSkouTk5OOi46Jh5WanI+UlpCKkZOGgIuIkYyKiZyWmKKihpKdlaCKiYiNm5CDh45/g4eGpIWMkbOYnZKUl6Gin5qSnJ6osritpr3Cx83Ixs/N0MzP19HR1a7W1dja2Nra19XZ2aBygHdqaV9gWlVZWUNBSUM/Pj46NDg6Ozc6OzozOzs/PT43Ozo6MTpHPTozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOjg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNiem1hfpKDb213i3h5f3qBfIZ8e3eGhH9zcIWCenV3dnSEgoR+f5KmpJ+lopeKnZCUl4uKqJdzirKNhKiShJmThZmMopWfmJKIm56jkqmwn5CUkI2OiJaMbo23hZrEyLKboaWbnJiWkLKRZKTNyJWOhoeIj5KMjJGTiISJiIWVmZqPj5SShpOWg3+Pi5mHjZCql5aiooiYnpaaiI6Gl5eJhI6MgX+Hj6SIjpOompeTl5mhmZ+ZlJ2bo7O0pqO8wr7HxsXJyMnCy9PNzdSp0tHW1tbY2tTS2s6FdYNrZ2FgYFFLVlxCQkdDO0E9ODM3Ozw6OT02NDk6PDo4Mj85OTI6STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0SlE8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCZYNHdYKOfHxtfoh4en56gYGCfnZ2gIJ7bG6Lfnl8d3h8hIaLfoujtKikq7OhlqegpaSWla+ig5C4lZKzmo2hoIykm6+ipJ2YkKeXqZmtsKSXlJWUkIuYmpagwI6jybirmqKlrZmRm5yynYaFqKKcl4WIiI2Ui4qSj4aAhYaIkpiUjIqTkoaTl4aEkZCcc5CYspWWo6GInJmTj4qQipaaiIqWjYZ9jJifipCQnJqZk5mYoJSgnZWfm6GxraOkuL+0xMfEvcPDv8bOysnSp8/M09HQ1tjSz9i8dX15YGNXY1hSSUtPRUJDRDU+Ozc2Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NTI3Nz9ANj8/Nzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OklFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdNXFxZSmhhO0iEi3p6bYWGeXyEeICFgX1weHx9fG9yjHp9gXt4houJhoSSqLytqbO9sKWus7Opo6KwrYqatZ2juaWVraSXqa23pqSjn5mpmKqkr7GqmpmclJWRmKCXmru7rcqhaba3qrCVmJ6iq5KXvaReqbKCiYmMlIaQfI6NfIOFjY+UlIiHkpaLjpWNi4yXmJGbmbSWlKqdi5yUkYyQkouYmomRnY+Lipafoo2VjZeZnZOcmJ6UoaCUnJ2mrqiipLO4q8LIxLa6vbzFyMjC0KHGyc3NxNfW0MrTo3N9bGBdVmJUUUdEPjxDQUE4Pzg3ND5GPDw2PDM1MzU1NDU0QjM5OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGZIYWBicEpAi4l/gHKGh3yBiXWCioN+bX18fH5wd4d3jYGHe42QjIaMmqvDwLC9xryztMG8tKyrs7aMqLKtrr2rm7ujqK25uKumpqKipKOqr7Kxqp2co5ibmJieoqalk6O5r6i/vKytsrmlo6d9iIacrb2wgouLipCDj4ORjnmBhpCMjZuHh42WjIqUlpOQmZabp5qxmZCqnI6aj5GOlZCPlZaOkKCQiJSbo6yVlo+UnJ6UoJ2bmJ+glZufp6ekoqSws6bAxsOwsLu2xcXDv82nx8PHw7zV0MzEyop3dmVfXWJeT0xDTEBFRz9BP0I8OjQ+QT09NT02PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFSkhOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxoRl9pZ1tdXJOMjIh7h4uGg4x1hpCKgW9+e4F+cX6BepR6kpSUmJGTlai0x8nAwszCw7nHvLqvq7m7l7K2ubLBrqXApKuwvLyqrqujo56nrK+1samboKqcopyWn7C0p4yjurq1wburqJyypKSolISOqcTEpIKLjoeIhIaVlIx5g4yQjpGgi4uTkI6Hl5+XkpiUlqWgrpyMqZyOlo+RkJSVjZCUkY6hk4aXn6Cyn5SblKChmaSfmqCboJSZn6ekpqekr62lv8PCrqi3tcnDvrbOssS+w7uz0cnIwbV4fHBfW19tVE5JRExMTEpAQT1CRDw1QUQ7OjM9OEIzMzIyNjNBMTVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJnXE1lXGZUY2qajZaKi4iSj4aJeYaTkIFygHuMf3eHgoGPeY2hlqiam5i6vsnIysLSycvCzb3Bs628v6e6v728xLiswamts7y9qrCqpKWjrK60rre1oJ+un6aimaO0vamcqLzBo7a2r6uTsKyqrJaGmqqnpZGCjJKklYmAdYmReYSMkZCdn5GOkoqOi5Oil5aalJOhnqmekKSZjI+Oj5WWiHyOlZKRopqUoKKctaaQoJelpKOln56mmJ6Vl5ylo6ioorKtqLvAxK+ls7fMwLquw7O7vcG5rcLCwb+acXxkW1pfXkxNTktHRUNIQUFBREs6NERIOjs0PDdGLjEyMzUyQTI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+bElfWGFaZGVYno+djpeOnpKJin+In5KEeIV/lH5/kIiJkICWoZqtp6SYw77JxMjG083Ozcu8wrewur20vcu7xMK2tryttL+5vK6vqKGpqLaurqmyt5qerKKoop2rt7eqpa++xLG9ubOnqrSzra2WlaWtqKCRjpKxxaeVjnyRlXyGkJiPqZiXkpKOkpSSpJySnJiToKGhm5iel4qLjo6diFqPlpeSlqSZZpmjnrOllqKWrK2sp5yfppeYlpiVoaOopp+1q6m6u8O0prS1y8G4qrass7u4rqi4ury3hHBxXVtWV1BHS1ROSz9BR0RESEZGODVGTTs+Nz5BSy4zMjAyNUI1NVBXTjxMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVjw+QEJGQnNGaUlSZmRNRqaUnJahl6iWjJCDh6WSiIGHgpuDg5WQkJOOmqKfr76uoce+xsXIx87Oz9LKvru2sbu7vL/PtsS+t7m3s7K1s7izrKecq6y5q6mosLCYo66lqKSltcGwq620vsO5wLmzp7i0t7KvlaStsK+li5OUoI1zwZl9lpmEjpaZi7CVmZmUkZGZmKSilJ6alZmonJqhn5iJi46UnF9KlpyalJmkl1SWsJ+vnJ+lla+vraaboaaUk5mYjp2fpqGZtKmqs7y8u6uwssfAuKasq62xsaOhsrK0pXNyaF9dUVJMRlFRUFE7SEpIRkdBQz05S1Q/QTo9RU0vNzUzNDpCNDROV048SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzVFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFg8OkJDQD1SRVdTdGJWRkirl5mfoaiumJCXh4qnlo2IkoWfh4Sdl46doJqjpLXJtanHvMTEycvJyMzOx766s6+6uMDBzbXIu8G5trqyr6+ztKeknKu0tauqpq6smqStpqWprLq/qKu3t77BwL63srLDsLe9rKOuta26poibl6Wbdb6fhJmdjpKYmouulqCbmpaUmp6fqJ2mn5mZqZmgpp2Wj4yQnIJtdZKimpWcop+QrrKiq5Wpqpiqr6aloaWqkpKZnImVnKKelrCnqaq6t76zsq6+ubago6eopaacnK2pqY1maWNiVE1NR0lPSlVMPUxETUlKQENEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQzo5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXPDo9Li5TYU1WSH5lXkhGrJScoZ+7rpiUnouTqpuRkZOIqo2Hop6Mo62Uo6S2x720wbvCwsjJxcLOyMK9ubKvubXAw8q2xrLBvLW7rKmtrbGjo5mqtbumqqesqp2or6ikq6q+u6itvbS3vse8trW4wLC9v7Optbesv6WPopeQoZ+8nomaoJiWnZ2Otp6om6WimpugmaeksaCanaWcp6mcl5OOk5uKlomMpKGUnKKfoLWwpaaUsauaq62fn6WkqpKWlaCEkJ6fnJappaGhs7S7tq2otbKynpyjpZqXlZmqoZ54ZF9hYExJRkhOUUlORUZGQlFKSEBER0FWU0RIPEFHUTE7Qjc6QkY3OV1ZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRKiXpJ6fw6ybl6SXmaiblZqajqqWlaimla2smaKrt8XCvL+4wcLAyMS/zca7vrmysLm0vsPItsCwvLa6t6ekq6ytoaGbq6vEoqWorKaeq6+toqqovrimrb6wt7fHt7S4uL6xvsC2tLK1r76jlqOVkpqTrZ+QoaGkoqKekL6kqJ2oq5ycoJqln7yil6OeoaiqoJyVjZWek56HjoSNk56koJ22rKadl7OnmrCooJyrn6KNmpWfhI6hmpySpaWal6uxtrKqpaqtrJyYoKCSj5CWqZ+UaWZcYl5QSkhLT0xIRURJQD1PSEA7RklIW1JQSz1ITlU0QkY4PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLS0wTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGZjWE6im6ObnsWroJ6rnZytn5Ginpakn6aqq5e2saOqs7bFw73Atr/BvMnCv8rItri1tLG0tLfCxre/sbm1uragp6yrrJ6foKWkwaWhqq6gpKmtsKKmqL21pbG8t7a2w7Kyt7q+ssPAuLittLS1o52klJGToKyfmKGdqKiqoprCrKidq62amp2YpZ+9oZykl6urq6WgmY2aoJKeiI5Yf5afpqGguaqnlJm3o5+zoqGcsJihj5qVnoKPoJeWjqKjlZClrrKsqaKipaSVlZyYi4+Sk6SfiWNnXGVhTUpLS09GRUFHSz49SUE5OUpKTl1RUUk9TFZdOUZJPURNSThIY1xLQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2FTNlNaa1dzSEU2PXVlXExQnqCgmJ7Dp6Sis6CbsaeSqqOfo56tqaydu7GprLWxyMTBw7PCw73HxL3Eyr2wsbausbWwwMW1urGxuratmqmwqqqbn6ahp8KtnK2xnKmirrGqpKi9t6a1u72vt8Sts7PCv7LGs7q3q7S2raqippWVk6KroZ+fmaeqrq6vu7Gln6mpmZiXkqKjt6Cho5GurqukpZ6RoZ6UnY6QjZSdmqOfqLWnp42ZtZyjr5ugnLCRoZWYlZuAkqKWj46goZOLpqywpaeinaCekpKak4WLko2cn4BkaF1oZktKTEtTQUNASUc7O0Y+ODlOTVVfUlNKPk9eXj1IUEJNTEk4TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHddXj9bVV9nckA4PEiWd2VBNJ+knpqgwqejqbGgo7SplbGrpqKksqytqbuyrbC1tMe/xMO1v8S+ysW2wMnCtay1qbC5rMDEtLivrba6pZmrsqyrmKGnmK27tJyosJusn660sqequrKmuLO4srnBqreyw720xae+rq23tamnrKGWlpGlo6Ghl5ekrretsbS2n56opJmTlJOjoLaipKWVrbGxpaikoZ2ZmZqVmKign5minq+zoqaNmK+apayYm5+nk56QlZmahpaglYyQnZ6Ti6mpq6GnoZqelo2PmZCChpWJlZ96ZWtebGtOUU5OVD1DQU5DOzpJPzc3UU5dX1JWUUJXYF1CSlNIVktIOlRkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM5MDZwW2JIMDVKcWpWQ1dGjHlmQzukpJygpb+mqK6uoKm1qp23r6ujqrS2sLC4t7C3uLjFvcPHvbzDwsjBusHGwbqqtqWtu63Bw7i4qq2yvKOVrbCus5emqJGquaqhp7CdqqCvtLOqqra1rLqrs7K6t6y4sMG6vb+mw6qwtq6pq6umnZiYqqChoJGXoLCus6qwuJmbqZ+ZlpGXpqC2qKWioq+ws6uxp6ufmp+fm56lnaGYnaO0sJyfkZSmmqGpnJakopiajJaZlJaXnZSJkZuZlI6pqaefo5yZm5OHj5mLfo2Xho+abGluYm5uWFFRWlRBQ0RVQDs7SEA3OlhQZF5RV1dFWV9eTkxTT19MSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNzQ3Z1lhRihAOG19aFxWOol7Y0M9qJ+coam8oKqvqqKwt6mltLKroa21va+zuLy7vbe3wcK/ycO5xMPBwLnFvcG4r7aoq7eyvL+/tKqvsrifl6utqa6YqamOp7ufpa2zn6uisbCzrKq1s7W7rK+xtaywtbLAusW2q7yvsbesraqjsaWepaieo5aPmJ+yqbKpqbKZnaebmpSMn6aktK6noqysrbCnsquxqaKbnqiknpWhmZyotqmYmpKSn5mfoaCSrqGbmoiXmYydmp2Ui4+Xl5qXpqajoJ6XlpaUgJCVhHuPk4OMl2dtcmhxc2BHWWZWRENNWERaOUhCNj5dUWhcT1pdR1teXk9NU1hkSktDXGNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FWMTUxPWBWXzgpQzNZVVxnSzWMemZMQKWZn6SrtqOsqKSurbWpr7O5pqewt8a3sbe/wcK2tbrFvszFucPBusC6xbjBurO0rKq6uLu6vrWrr7G3mJioq6usnK6rj6u9nauusaOqn7Gts66utbG5t6qtr7Kotq+zurzJs6q1tbG0sK+nobOfmqisoKWVlpqZsaKtoKWvlqKkmZmSjKKlp7Kpoaaxq6m0pa6vs66jmZ6tp5uXnpqZrLiimJORj5icoZmYla6hn5aClZmOnp2al5GKlJOemqWjo6CZl5OSlnuMkYV7jYuDi5Nsbnlvdn1iRmBqWklIWls9e0pHRTZBY1RpW01cYUtcXFpSUlJiYUxLRWBhYVFNSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuK0EvSkdQW0czY1hUTEWalp+wqLGprKSjrq21qLezt6OstLfJu7W7u8C+tbS3w8DMx7zDvbe/v8G4wL2yva6ourm4t8K3rK6xupaXp66sqKSyqZSvu6SssrKmp6OytLGysbWwt7Oprqyyp7ivtbPExbaptbWrsK6qp6O2n5+msKCjlJuZlLCep5ufqY2pop2blZelpaS3p6Kws6unsKetr7SspJihrKicnJ2clKq5nJWPj4yYnaKYkZmopKGYhZSXkZ2cmJeXiZeQl5uonaWhkpaSkJZ3hJGGfIaChI2NbnF4dnyAXUxlbFxLT2RdP2J7R0k4R2hXZVtNXmJNWVlXVVhVal1PUEhhXl9QS0dRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGcyNydGYUxWJS1CLj1FTFE8M3JqTEVEkZmkraSsraqmorCxsqq3sLWfq7W5ybmuwbzDuLOytcLDzsTAwr61vsDAu7+9tMSpqrmxtrfAvK+stLSeoaexrqWmsaWesrWsqrKwq6iotbqstbK1q7StqquprKm5rbKwx7+4pbmwqa2tpqitsaWko66jqJydm5qvmaKioqOQrJ+joJ+hqaaluKSrtLSkqquprK61rqKco6irnKCZm5KktZqPiY6IkaOhlo+Wn6OXlYaQlZSem5mXlYiYk5WZp5ygoI2Tko6ReH6PhX18fYeKinJ0c39+fl1TY25eTlpnXUZElltHOk1uWGFbTmFiTlZWVldVWWheUVNNY1pbVEtGT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0RkOzYqSGRISis6ST8zQ0lTLD6Pa0BISZCaqKmhqbCkp6Ozs7C0tbCwoKutvcy7rsK9x7K0rrTCw9HExb/Cs77Cw7y/uL3FqK23rLS4vMCxrLKtoqSnrqqopbGjqrGqrqqxrq6sq7O7p7ewsqmyqqumpaSuuqyqsMK5tKy5qamoramnsaWppKKuqaiinpyirJWlnZiemaydoaeooaymo62strCxoKmioKqtsKydnqenqZqjmJmQoKiYhoSPi4ufoZCNj5iekpKIiJKWoZ2WmZaHl5OTl6Wdnp2MkpCOin9/iIV8d3+HhYd1dHKJd2xfWV9uYlFzcVxLO4R8Rj5XdVdhWU9jXE5VVlVXUVxiX1NPT2hYWFdLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTM5ODsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkswLkpnREY4PEIwNUVLWDFAlF1ATkaVlqynoKmxnKeosLWsuLWtqqSqqr3JvLG/ucOvsK2zxMPNzsO/wLPAw8S6wbTJxKyvt66zusC+tK6urKepqrGppqmxprStqq+trbGusq20u6W3s6ysrqiroKOesberqq25tqS1taSqp6ysqq2gqKansbGkp6WhoayWqqGTm6CmnqOiqqOsop6msbasrKKlopqpqq6pnKGlpKSZoJmWj5idk4GCkImFnaCNi5COnJGTjYWOmaWbk5KbjJOSkZSjmpyai4+LjHyGgoKBenWBg4F+dXeLood4al5fbmZXZYdkTkBnkkxFYnpXYlhSZlVNVlZVVE9cXWFWTE9qWFZWSEpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIdCSUlElpCupKGqr5ioqK21qrWxqqWrqqm9wMC4urS8taazr8TJy9K/wbu4v7/DusK6wcSusbWytLzBvrOxr62srae3qqWtsKu4rqewr66xq7WqtrWntLerrKSqqpyknrSzqKiks7Sfta2hqqirqKunn6urqLm2qaqqqqKpn62bkaqhnaCkoqaiqp6cprSup6WpoqOYpKanqpyipKOgmZifkY6PmY1/h4yHhJ6eiYaMjJGRk4+FiJajmo6Om5KSkI+Sn5iZl42LhIB0h4J/fnh1g397eH5/iJ2PcHFmZnB3XGF0iGpPXZhWSG15VWRWU2RQTVVVVVFPWFtiVklRalVXVEdPWFVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UyMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyQGY9Tlg/Qyw/TFRfL0lrN1JGO5WMr6CkqqyZqaOtrrK0r6qkr6mou7+8wbKwua2itq/Ix8fQwL+9urzDvrvEwsC/rrKzs7a9vMGxsrSrtKmltamlrbOyuK6hrLSxr7G5q7muqq63q6qeqqugo6G1raihn6+yobSqn6inqqKqoaGsrai9rquuraGnqJ+smY+wopiioKinnqebmamwqaKfrKKhkqGioqeZmammmJiZnY+Lh5WIfY6GhIWkl4aDhI2HkJCShYaWoZeIkZ2Rk5CNkZ2VmI+LhoZ4dIF/fXR4eoB7dXR7a4KHpHZpXmVrgHVniIt8UlZwX0t4c1RkU1FfTU1TWmZOTVdZZVlHU2pSUj5CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWg6MzhfPWFkP0YxQ1BbWytIUDtZQzOPjbGgpKWqo6SirKazsrGopLCnqri/wb2xqbqqp62wycbH0MO+wL25v8C9ybzCuLGwtbK6vLnAs7W8rLmso7Smpquxtbexpaa5tK20vK+8pa2ttqutnKmvpJ+krKqonJ2qsqSzqJqrp6mkqJ2iqaepvau0sK6dqaSgr5yas6KWpJulpJ+lmpqoqqWemqmhm5GboKSdmZapqpGZmpOQi4KPhX6Qg4CIn4+HgX+NiJKQkIWClZuUhpOhjZSRi5Gbk5aHin+Acnp5fXtndnx7dXFyfmqGeYWIZF9nY3KFe21neV1eVkJXe21UYlBSWUtMTnB0XUlaW2hZRlZnT0M+S09EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpGwmJ+fqaSioauktrKxpKmwpq25wr23saS5rKmosMLIyMzCt72/tbjBusi2w7W0s7Wyvbm6vbauuba/rKKzpqqqrrS2s6ibubuosb6yuqCutLapq5+tsaOcpaipo52bpbCmr6Cfqqmnoambo6igrbynrrGuoaqipK6enq2mmJ+aoaKbn5uZo6qimpmjo5WWlKChlpuWpqyMn5KPkYyCioCAj4F7mpWNin2AjIeRkI2KhZOYkYaTo4qSkYeQmZCUgYh9emx9dnh4Ynp6cnBxdHhqgnVrgmdjZ2Fuc45tYmpvX3BBXXlrVl5OUVFLSU1TWVZNXF5sV0VYYU9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUl0+I5GWrJifl6ejoZ+no7evraKvr6isuMO7tK6gua+rp7O6x8rHv7jCva+0v7fEtsOysLqxssC2u723qrm4vqqktKaoqa+tuK+nl7i8o62+tLShrbi1p6aosLOgnqWlp6ClmZ6sp6ieoKqvp6Cml6Kon7C4n6Oxr6GroayknKenqJqbm5+ilZycmp2pppabnqiRmJKZnZOZlqGqkZuKjpCHfYd+go58fKGNjYl6hI2Fi46NhYmTmo6IlJ+JkJWCjJeNkXyFfHRwfHFzc194eGpvcXFwa4BzZHpsZ2VjYWaHgGBbcmpyTU6AaVhaTVFMS0hQUlBHTVtfb1RFWVpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MF1bNSiVm6WYnJWsn56ho6C2q7CjtLOpqbrFt7OuobitrauvtcXHwLe/wrmwtb23v7u+sKy+sLO/srzCuKq7urinp7Snp6qvq7KvpJe7taSrurWvnrG5r6mlp6+ynKGkoKSjoJabr6WhnqKor6GgoZKjpKK2sKGmsaufrKOumJ2qpaifmJqdo5Oam5qdpaqam5ullZSXlZyOk5eiqaKRiouQhnqEfoSLeo+Xio2He4OIhImNj4WPk5iMjpWZi4+WfoaXjI96gXtwcnZub3NeeHdlbGxsa2qFbmZyaWplaF1kc4FgW2t2aVpKf15bWE9PS0hIUlVHMzldXmxQRVlVWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFRdaEQuPDJkVywylKGhlpSbqpyjoaKhtqmtoLu3pay+xbSwr6O1r6ysrrTDw7yzv7q3sbO5uLq4uq+uwLOzuK+/wLetvbq1paKyqaepsamrsJ+Zv7Skp7S1qJ6yvKmopamvrJmip5ykpZSXoLGkmZ6kqamcop+SpKCkuKmkp66mnqWhqJOgqaKhoZmbnZ+RmZuWn6Gqm5qYoJSRlJeajpOTpKikkImKj4Z6hHuEhn2djYqLh3uChYeIipKFlpKSi5CVlI6NlHuDmI+Ld358bHRybGtzYXd1aGhqaGdwhmhoaWRmaWlgamNqaFtme2NgU3RUXFtSTEpGSU9TQCEqaF5pTERXVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z1AnMp6ipJGOpKeZnJ6do7Ssp6q6tqesw8G4sayjtq6nra63wL+8ssK2sK6ytra5tratqr2zrrKxvL+3r7u7saWftamlpLOmqK2cnMCqp6Wvs6qstbueqaqrsaWYnqqdpqSRmKWsoZidpKmhm6Gblp+dp7WmsKquoaGdnqGVoKagoqCam5mbkpidk6WdrKGXlp2Uk42Vl4uPmJupoJKJiouJeYV3gYKBnYeLg4l+gIWIh4aRhJeUj46PkZGRjJN7g5WPhnN+fmZ5b2pqa2Z0c2tjZ2RkdoFjZWZmZWppY2tyW19ZXWxkYU5pWFpgVkpHSEtNUlg+OV9saEhDVVRdW0lJR0ZBLjw/OUE4OVJHQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyssMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQmhIJTWao6CPjKyhlpaglqSzsaKyvbahscW8u7Kxo7esqq2puLy7uq3Asa6urravs7izqau5sa+us7a6tq+4vaymnrSpn5+voqitm6G/n7CjrrGvt661nq2vra2imZ2nqaWflZqnpZ+YpKKonZqfmpOcnqyvprqorqKhmpuemZ6kmqSdl56Ym5SYn5KolaqnmpOampKMlZmNlJSbqqeOjoqKj3uCc4GBipiFh3yJioaGioyJkoWVm5OSjo+Rl46Qf4CNjoNvgX9meW1na2lmcHJrXGdjY3SBYmZnam5sZ2pqaG5dbGxycGBUY2ljZllJRkxNT1hSUVVhZYBVQVdTWVRHSUZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlBMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyY0kaGbjY6vnZiToZqpsa+fub+1oLTCu766saa3r6etpLe4t7esu66sqqu3qrO3rqaytbKuqbC2trCztbqmqZ+1p5ydqKCnq5qnvZespK6wtrWsrZ+xrbCpopuco6uom5SbpqOdmqmipJaan5uQm6Sqq6q8n6ekoJiamZ2hj2uilpmccIKVmqN/dZGpp56UlJ6QiJiagJaKopB5h5SNg21pf3eDcWyGi4Z9hYyHcV5jYWeEmIVrio2UknR3i4R+g5CAZ4eAZ3VoZVdcaHNuTVBpY2dzhWhfZWZubWpdYGGKj4OEZU5LRDlHVGheSkdQUFVVTEhTYXB0ZUZbUVVQRkhFQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUFAQD0yOEBFPTEsLDA4PUc3MDEuKi4qLzU2OCwjMScyMTQ6MTc1WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoukmYaVsJuak6Cbqq2qo73Fr6m3wre9va2mt7ClqqK3s7KysLmsqaastKavtKKpt7a2qKestrKutK2zoamfsqmdoaOZpKWYq7mTpaWvs7etrqWprquspaGenKGnppuWoKWkm5unpp2Tnp6Xj52nqaS2sKSjop2WmJeXo4ihjpKahqGHk5ygf6V/paqekpKakYiEc3iNjoWIoXaKjWmXiGZ+c3igb4iHhH6PfX+hoKCZgH2HnnOGjnWbimyHgYNtaWVjemxyYVOFbWJsaZhxWGlxcIhZXmlbbGxbiHJuenKFZoaEWl9HTj9HX01FUlZWUVFSV1VnXU1WSFJST0ZIRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3LyiKp5eDnKudmJidn6qpp6q/w6+xury2wL+qpbewqKylsrSurrK1qailsK2ltLKbrbW2taanqLKwrLKnrZ2poLCnn6OimJ+hmqyzk6Olpba9pq2nq6qsqKWhoJigpqOZmKWio5icpKiWk6Kbk5Kjpaaht6SkoKOYlZOXk5yIr5CXlImpi5ahnIWxgKOsnZOZnZR5gtSogIeVwZzGeXixpbeXZYDAnL95hIV6koR8kJCRynKXu5zFenK1p7qQe4BtlrGrsHlobFixrm5labySvG5nem9yj9h+U2tjtrJ+gXKUc5qhqpBXT1diT1ZORlVbWFFRU41dV1tRQVxEUU5FSEk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT46Qjw/QTg6Sj41MioyMkJFLy4zMi4rLygtLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjKeTgaeqn5ecnqWssqmwwr2ytcC1tr7Bq6e0rKyopq6zqa+1sqanpbSlp7itnLOytqulpKexraywpqqdpqOvoqCfnZWZnpytq5Odop+zuqOqqaKtrqWhnJqaoqefl5qnn56XnqankZymmZOdoaaiobGjn5+jlpaSl5KZha9raoqNqn5mg5WGrWRwnZ2UmaaUca6hpH54u31soZB2sV9qtFulgGWckWBng3tnf2p4a6llvnFnpot1sWp7sXh0kpRjbm2nbluEoUVoZoeWRXWcYH5nfKSnglpgjKtogJV4eWqnN0qvXFhTbGRbS05YX1xXVjtOik9XVy9JVFNKREZGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MDMuMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMwG5CilYOtp6Weo6Sqsbestb2/sLbEsre6waapsKquqKiwrqOwua6jpK2yo6m4p56zs7CjpaCprK+rr6annqOhr5qhm5aUlpqaq6SVmqGftLOiq5yjra2gnpmWoKKonJido5+bmaGmpI+copmXoJ+qnqamoJqgoZaVkZaQmoW1m7V4hamZtZl2hrObt36TlpaplH5rgqZ7goaIk5STd6tna7Fcq3qNhpR0iXKPh4B/iJCXeIKBi5eLg6CPhLB2d59xbGxsfItOpFhIYmKZfmNopmB5cnVTk4deUaltY3F+h4BinC5RoW9bU2toYExLW2RYXFpCPrJ7WFhBI01oRkNFQUBBMTk+ODg6ODQ7OTk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjg0MCwuKC8zLD44MzEfLzItRDE9PFN9bjMrWGpcT1hNX2dXN0o4YVU1MBuUoJWIs6amoa+pp7Ksqbu2wrC7wa24t7+prK2traWssamgrruqoKezrKOrtKOmsrKno6Kep6qxp7CnpZ2enq6VnpmUlJSXnayhmZmkqLWvoqqPqqiqm52Vl6Clp5menaOfm5+jpaOVm56XmZyiqZummpyboqCXk5GSk52D1ZOZuXCwwX7FhnzWlJu7fJqVpY+NnY2ke46IpIOlgnqseY+dVq96iH6farlauXaGhH6mgpR7l3qqeI2dj3qxbo6EdJG8hW+UUK+nxYpRoHpjYKpic3KIbZeIYFO1tMiFgIl8Y6QzQp12XVBqaWNQQFhnWmRhSkhNcVBcUU9ZZllDRD9FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6O0RIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFQNzElm6KUmLKoqKa0qqW0qaS8t8Gwub+xtbS6srSnsK+ir7Kln621qJqnuK2ir7Cfs7SwoKSen6apsKi0qKOanJ2qlZiXlZWTlaCpnJmWp62wqaOfj62jqJadlpuhpZ+XoaGioZqhoqebnqCelJiapqCbp5Wbm5+hmJCSlJCdiLJuaLVxq4dujqZytHNytnual6SLj52Non+RoaZ/sXaDkdLSdlyue4V/pG+bqqZrh4V9rX2YmY57sXGSno54s2WXdISeb55nlFHIi1rCXJ95Yl+tYHZzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNlWEFPa2BsaFBWR0o5PVVSWldYSUM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTDYyMKKdkqWxraOrvK2mtKantru8srq+tra0ubiypLSyoLCxop6rr6OXpritpLGwnLS3qaClnqGppLGnrKmjmZqZp52Vk5eXkJGhpp+Vk6WqsKailpOtoKaSlKCbpKWelJqlp6Gao5+tmaCenpCVm6GdnKWVnZWaop+VmJWRmoWse3eodqONiIapb62KgqeDmJihiZKai6J/k5qJroV/grNccrNSrn2CgqR/cdd9eIV+j52Gmpl2r4aHkZyHd7RhmmWagoKVbZJasFhLmnWYeWZgrV52d4homIhsXa93lZ6PeGw1eciusl9CVG9eZ2BFUGxgcG1WVk0uZmVpU1lQO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTY8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEg6OTmgnpWgubCXtMKtqLOoqbK6t7O3vrm3sbS6tKS3sp6zrJ+fqKuelKe1q6ivsaqts6ObqaCfp6G1pqapopidlKSgk5Kbl5GUoaSakpCmra+moZWZqqCjj5GhmKekoJSapaidnKSerZ2hnJ+Mk56anaCXmZuWl6KglJePpp2GqX19pXihjo2CqnCti4GnhpafoYmXl4ijgpGIlKp8gIudeG+xWqiCgoigeXTYf3aIdKiBjpuMkqR7lI+fhHuyXp1koH6DlW2SXatbWpOAkX9oZ6pkcnuBa5iHc16rWomgjmtvZU9KQ6FcW0x0XWJnTlthX3JzX0tXN0qbllhIRT1HRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDUuOj4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMj84op6amsGrl7TCrqutqaW0sLewtb65ubGwtLmourOfr6SdpKamnpOpsKmvqbSrqa6hmKCgpqSjuaKiq6CWm5Ghn5STnpmTl56fkIyMqLCwp56Xm6imoIySpJamqqeUmKmnnZ6goq2koZ6gjJShmJ+fkZ2XnJWeoZWWjaqcj65tcrRzqYt1iqdztHhzs4CRpKOSnI6JpIeQd7hwjXuLomprtlqhhWWXl2mhoqdtlHK0dJOZfrJqhZGHrWp1s2GdZqJvh5Nrl12tYE2hfIeRUnOjbHl/fm+Yh3Jdr1Y8nHdmVG9uLlynT2NTa2VibVpjXWFwe2NUW1I+PW5wM0NCQD9NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKacm568oZuywK6tq6ynt6m3r7W/tLuvrra1qsC1qKmhm6WjoZyRqamntaKyp62poJecp5+kq7idoqyalZmOo6KVjJ2gm5icn5GTlKq2sKiZlZysqZeMlKWXo6yikZarsaOfnqarsZmhoo+Yopafm5WclqGTnamclI+qmYfUkpq7c7DDgMOGfdWWm7h4iJCYjJeLjKeIeqS2dX53dsKCmrJgg7p5wHx1uGO1gYyHqX2VgaupcXt/dLyIp6BpnWGmjq+hfox1h6p9vm9zvHSyg3V4gYpumohybo2kdL1ed31aYXm8a1pWXGp5XmphZWdjbXhvWVxaQ0BAc0BDRis1RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQj1FODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnm56ivaGXssOwraqrrLGnt6+2w7C4sK25rq3AsKujop6joZybkKijqrKktKWspJ6VmqqYpqy4nKKtl5Sfj6Sfkoycop2XnZqRlpKvubKslpikqKeUkJakm6OtnpGgqKufmp+oo7SfoqSOp6KUopqcl5WjmJCvn5KUqZ6EkJi2f4+RjLeVeIKTmrV3bWtuc295kIWPinSfwbu9mnuBsahxgHORuYN9h4aMh418ioeNmHyku7m9nHR5tKN0d5d2dLB1mZ5mh2qNtXRycXe2jF5/en2JaIN5bnpji6xwdYV/WFunakVlWlRmYGNeY1FnZ3BsdUNOUU1EOlpNP0ozOzAgOD47LjM9QTk5Pz07PEM2QlNZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVzkqT15dPSs6VlUnPjs8p56hosCllrXDtKyrqKyrqbqusMWts7Kttqazt6upoaGlnqCdmZOqo6yppbWnp5+blaCjnaukvaahqZaTm5Chm5GPoaehkpyXlJiUsbW3rZmepKSii5KSppulqpuVqaWlm5mhqKWnpKqgka2el6Sel5eXnZ6Pr6iTm6WhjWp9aZuld4ZyfZqOdHlkh3u9vsC6b5ODcpaIYXNrWl6biWBjiI+Va2CAlmRunndjlmyAmpWUZV5gYnCZiGlyi32GlWdrf3J0eH1/Ylt3dIFoUFxtg317i2tYa3qCc0pKb4ZwTnRMRVhdZ2FMW1dnY19PW210aXFSUURFTTtHST1NPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTX1Y0KVBfTCgzPltPJz8yPqmgqKLCo5u1urajrKWup6e1sazIq6+yqrOivbCxpZ+ip52jm5mZq6auo6S0qKWbl5SgmqWtqL2nqKSUk5uVn5mSl6SpqJCekZCYnLCyv6ycp56noomTkamaqKOamqugo5mao6eso6Cropqxm5SnoJaUnZ+dlrCkl6CnmJuQnJyhoZekoZmcmZmZj5WBZ219cXeSmJSShoy2q42GmJWOioyYloeUlYuEk5SSiY6TlJiUmJaZn6GZmpOgnI2CeqWFbWt9kH2AdYqKgXGCeHl2dYl/fIpqc4F0g3Vld313a296bV9kXXBoTVlaZmpgV1pveG1tZlVQRlM5T1pNUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSiw8LUCzobOiwKGksrK2oKmlsqelsLSqyKqsr6W0pcCns6CdpKSco5WVn6qmrKKjtqufmJaVn5etqaXAnqujlJGbl52XkpShnp6ip5OSmainssSwm6udq5+QlpaonaqcnJ+smKGbnKKkr6eipaefrpiXp52ZmaCenZyvoJyhpZSWkZeTnp+UoZ2XoI6Wk4qKjY6XrpB8lpyDkoKLq6mFgJmXiYSQnoh6hJCIhpqSiIeKlo+bl42Ql52jlZiSkJyNf45nobOvhYqFdnuSin13eXpvZnmPgYCJanWBeYhzaXN/e3aDh4JqdWR6ZmBqZWNkZmtZbHtvaWtdU0xQRF5URkA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9iY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RcUTA1TlsxN0U0W0c1PCxAtKC5sL+srK+ysaCqprKtoqyzr8Svqaqisa27orObn6aioZyYl6elqaWkpbK1npSTnZmZr6WtvqCropCRnZmZlJGVoZyXqJyEn6uso7TItKCqpKuXlpeapp2pm5+kq5Sen52gqq+ppaOroq+bn6CgmKSenJ6crqOYnqeSlpWbkaOXlqecmpZlgpJ8ZX6NmpBjeY5taGt7kqWramWbmH1nhoplZWloe46ij2xojZiRo3draoqYop6Xc2tteoSOiHpYZl6Gg15tjIqBdlxoc3d2kYCIgm13gXh/c215hHR2iYiPg3xqh1lebHRkXnOJaWt8cGtkX1JOWElkWEFKND5GNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMllDOz8uPaagur26r6y0saqlqK2usKatrbC8sKimo62usJ6rlp+jnaGZmaaqnK2jpaepsq2elKOPoq+ltrmlrqKOjpqhmZOSmqCZmaWVfKauo6i0xLiloqevn52VnqKeo5yjqaiSn6Gdoaqwq6ukqqCqm6efp6CslqCbpa+jlpuplJ+bmZGjlZypl519vYOIcrRyhJ2GrWh4ucS4cZSjo3qmmZlyq4J8y8DAu3GMo4iDnnyXmYmdwL2Blp2djJzBwXyCfJONmsPAfWylsm+MgW/Ken+bdpCDjoF1eYCAeXF6f4dwd4WMk3lteJRjZ2B4ZGBlgmJec2dsZGRZTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhDQ0JDRUhJS01OUFNWWV5fX2FfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLiNGWzNQWS9WQUI7LziWo7nDtbCwwKmolKOvqLCuraays66ppKWmr6qeq5iaop+cmqqmoZyroqSoo6S0pJyikqWtq7ezp66ikZCZnKWSkZ+hmJugnYinraWrrsDAsaGpr6mWkp+dopmipKqjk6CinZ6tr6qtp6OjqKGlpZ2sqJGjmqisqZqcp5uqn5SWo5SfoZWbf86UeHqkgXmVlptfro9ejqiCo6F8p5abc6uDgK9eY42qe6iHhaB0l5OIs2OCq4agjY2zaoSvdX2XiLdhg61ao81ukHZ72nt/mXB9h5J2fWV6h3Z2a3yHbn2GkZF+bYOQYHJtcGhgYHpkXHFnaWRnYFJUU1ddS09ENUFIREQ4PjY7QD9BOz03QD4+P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSzAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGjqqets6umsqurqqKrpq6qn6abmaWXnKKvn6CeqKeipaCfsKuanZWmrqywqqirn5SRmp+kko+epJeep6Ofrqassai/x7OoqbGulpKdnKGXn6mqn5Whn52drrCprKqcqKiloquSrLKWpKGqqZ2ipaSfrp+RmKWXnpmTk5GXoHGFjJd1haiGcbF9nnKsf6KfgaWPnnargn2tf5xzrX+sh4afdpmSe3yXfqqHooySjJ1+q3uJlJCfgHutV53Fe49wk8F9gZVtdW+MbWV2ZIVuYXducm+JipKPg26SkWZwdXVxYWdtZV9vaWlvZ2RYVF1hWlJTQzlJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXlxbWlJDPjs5MjQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08KD4xKTNXQEYhHEc6QzEuK7DTxsaytKCdo46joqKsr7auqLGlqKmmraurpqGjnZmilZ+lq5+hpZ+oqKKenbCsl5qWqKeuq6emp56XlJmioZKUoK2bnaeksK2lrbWrus2xraauq5aVnJ2imZ6urJyXoJqen6mzq6urm6yrpaOsmq6xoaerraWXpKmnp6+gkZWiopiTkISkaqR1iXqpdHqycIKmipmMcYmgm4ekYGBSq4V/roObdq2CqIaFn3uZl4V6ZoCjiaSZhoKjfal+gpaHrl98qVaeo5KBeqOfgHvDr8WLcq+zs7lxYqmvwnRojIyYjoJunJVxb3p4eXBtZ2VlcnBmfWpjXVdgalhZVU1NUUxDQ0FCO0NBQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmFhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioyUEtMIyBBOUQ0LCfDydbUv6GZq6egr6KesLSwrqmsoqelqKqrqaSmoJuknp2lp6ejnKuZoqygo5+voZyakqukta+uoKeanZWTpqKRm6KooKCmnbGmpqmyrbfIsrWqq6mWkZ2copmgpbOdmqGUnZ+nrK2ksJutq6OjqqGyraGpsrChmainrK2zoZGUoaWWmZB7qmyehId1q3l8sG+CpYyJn5aWoJWB0ri0uMmBgbJfYJSpg6WIh6B6mZWaeKrJdJmklaipkZOajYGciprGxnlnoYKldIGfjoJ9r11wtGKwdUujh22nR4KTZI+QnpF8cZmVgXF8dX58blxmanNxZoFrX2FZZG5cX1lJTU1LRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqLKtrKWinLK4rKqhpZqnpKmrqqafpqaYqqOfrqudpaCsmp6ppZyntp6il5OpqrWyrJulnKCUj6WskZqcp6OhqqeuoqWnqrC1w7GzqqyolIqXnKWboaOupZehlZmcpqatnLGerqmnn6yjtqygsbiunZqtprCxsKKSlqahmJ6Ngp1OeJqBf596hKN9g6SFh6afnZ+UhLh7e3m5gn/MxsK2eJuhkYuffpqWl4p2n5eKpZikqX+whZ2GoISsfZqVY6ZtpHCPhZCBfZaCcqxgo3NxgJpgvH1SVXSOkqOWe36Uk413e3OGf3Fcbm54cmqCb1tkYGlvY2RdS0xRVEFJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZZWVpbXF9fXl1fX11aWlpYVVNPSEA4ODIuLCouKyonJz9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmKmrpKu5qq6fm6GssrOlnqCVpa2trqqnnKanm6OoobOuoqmmsqCYqaSUo7aiopWXoqm0uKOboZyiko+hsZmenKemoaKwrp2mqaO2s8WxramsqZGHkJyonaKknKWXnpmamqalq5uwoq+lppivpLutoba1rJycs7C2r7CklpyunqKchY/RtcO3eYeOhZGTkICmeZShd4ygkoSlgYpxqoaFtG5yapqknJWKn32YmYaHj3Ovgqaco46mi5Odi5aQm25xsl2ldJN6nGyZf3uZfG2pYaNxcX+fYnOyuGh3j5SmmH2NjpWOen55kINuanlpenNvgXVeZWVvbmZoYEpbWFg8SEhAVTRARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVtbWlhVUlJRRjoyMjMvLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWScoyKrb6/vLq0npanpK21oaKZlKKnpq6qq5imo5+loaG2p6Oop7CjlKujjqStop2Qmpqqs7OknKScqJGUlq6fn56npJ2onbabo6uktqzEsKmrqKGMhI6coqCmo5aZmp2ZnJmnpqeZraivo6WbrKa9rJS8r6yeoa6xt6mwpJmnr6GmlnmokX18sHeKgKSliJxtsnChh618oY+DqJWYgKyJha2FoJWqoKKXhp+BmpWAe5J+q4Cdm5aLq3idoZKKlJKBeq9epIF9pqdknYB8l3Nqr12la3CFmV1gW4ygbZWRppmDlo6ajnx8hJmAa25/Y390boB6YGhmcW9paGdDWWFbPktVM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFSU1NWWl1fYWBgYWFeXVtaWFNQT05JNzA0Mi4qLEFUVlZWVVRVVVVVVFRVVFRUVldXWFZVVVFIRklKIygovZOag6jFwrbAs56arKCtt6WjjpukoqCwr6qfpaCerZmeuaGjq6CvqZmuoZCrqKOWiZqQrrCspp6lm6yXl4+soaGdpaCapZ2umKKpp7eqwa+kqaOei4GOm5qfpp6SlJmblZuapqWmm6qsraSln6movqSWwqupoaCqsLepq6Sesq2mqJd1r36Qi5yFh366rYqZZbCNZZWtfaGPhKeVmoGsioSwhaaapKGikYWhXGxqgbNgf617e4OBsW1nb5mZjIixW361XKSEa8iiZJ+Ae7xYdrRZsn1SroB6rFiAoW6Yj6icjJiSmpp8epGgf2R1f2OGeHWBfWJqZ3FuZ2ZlUFVkXEFVYD5JKD45PTQhIiwlHzIuICoxLzA0NTc5OTxBQ0ZISkxOUFFSVFdaXmBgYGBiXl9cW1hVUE5KRkM1NTMuL0BVWVhXWFdYWFdXWFdWV1dWV1hXV1hZWlpbXFhXV0dCO9KfsrG3vbqzwbKinKympLWpoIqaoJ6cs7Opn6ShnraZoLSoqqyer62drJuVr6ehjoibjq+rqKahpZmukpiPqZminaSemaOjpZmho6qzqr2vpKeenY9+i5uWoaCYj5GanJKamKmgo5qprqimpqKlqLuen8Wmo6efqbOzqqyjnbqrqquUgKmSo6+Om4CHpJeZkIKAuMO6g46ck4Snl5yCrIqCr4innJumq5F/1r3CqmKjv719fqOCg9e6uLWFlZODnr2+hG2jgm+rhGycf3qysMeDaauwvax4d6K+vHOAlo6nnZGckpqge4OTnnxjfntlj2d6g3xhbGZra2NRYVtTalxAVWJDTik9OjQvHx8kHyUyIB0kKDA0OTY2Nzc7PkFDRkdJS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PUE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbOzsL+4sbyyopyupqWypp2LmKXAqriyqKLAp6iznZ+ynbqon62vpaeUlLCrl4yDm5GupaKsoKOcqqCXi6OSpp6mm5qhqaOZoKKsrqq6raijm5eTfYiZkaabko+RmJmPmJSpm6GZqqmhq6ego6q6nqjDop+toqmysqitp564paysmXN2qqW4hmSJoHBorpGLkW5ud6SQmZ+Bda6ZlHCPi3GVqKScmK+kc21tbGaLeG9ugplxgXpqcWlnipeWmHFpaYaIZ3GGZF2IYmpvWVxmfXamX2FxjpFuZWR/jZOPopmZmpOZoX2JkZh3Zoh4aY9se4B6ZW1kZ21jS2RYSmtaOlFmRVInSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1dXWV1eXl1cXFxdXl1eXVtbVVdeqZSss6m5uLKzqqmhrp6js6qYkr+zxcq/t6qfwa2upKKorJ+6o6Suq62mjpeuqY+LhZWWrZ6lqaCdpKOgkYulkqeZqJmXo6uhl52mpqiwu6usmpuSknyElo2lmI2RkZmVjpiWqZagmaqjnLGmnaKruZ+vwKajsaSrrq+oq6mltaKstpWKoaimt52JlqOZiKqbkZWdkqmzmZqjqqCylqKhnZ+inKGlopWsp42Tk4yHk5ydlZGZk5mRj5WFgaWbmJaOi5SUjJCHhH5niX50gnVzh4pwp2x6k5CTkoCBjY+Qj52VopeamaWEiZeQdGqRd3KMeHh9emptZWRwZVVgWUBqXEhkYlBZK0Y9KychNzUwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhVV1leYGFjXV5UUUtFQz45PUBBU1hbXFlXWFhYWFhZWFhaWltcXl9fYF5eXl9fYGBgX1lZYKaWqKqktLaurqGwo62foLaxkI6syL7GvLqro6afnaefsamjtqedqbSmqJGYrKKLh4mPnKeVq6OfmKeenpKUo5eomqeZlKaipZGbp5mitrqoqpiaj4x8gZSLoZSKlZGWkZCUmKaQoJuqoJ22o52mq7enrsCtorWlrq2uqqensbafrLqYkaWkpraikp6noI6qoI6Tn6OrsJqgo7CosJejoJyjqp6enpyWrJ6TmqKblJCWq5qOmZmXkZafkYihnpaVhpKNkY6Vi4F+ZYuFdYZ1eIeCc5xqhY+Sk5CJfYuVkpKYlKOUn5mkhYmbin1zl3R8jIBzfH9qb2VfcWpgW2BabmRRYWVRWjpHR0U+Mj0+OS8qJispJh0mNDE2NjY4Oj09P0FBQ0lKR0pLTE1TU1RVWmBgaWFlVlBLQUNCOjlFTVZbXl5bWlxbW1tcXV1eX11eX2BhYmNhYWFgYmJiZGJcW2OXlaOnoq+xq66jqaasn6e1qpCPnaW1vbCuraOkm3yfpLKkpbGpl5u5pqOTmaqcjoaKiZyjj62dopWon6CSlpmbrouolY+omqqNmamQn7m3pKWZnIyIeYKUjJuTipWSlJGNkpejjZ+fqZ6fuKN/g6+1oq6udKK7obGedneeqK+4k3Sro56JgKt/ZFxidqCPpZ+EmH1tkrOco6etqqNlnp+Sc3mamHCAmKmYbX+iqIplnKadkpiYlo2SnJCGnpuRl4SSh4+QkomFd2qOhnaGcHuFf39gaIeJk5GLWnWUkGdokI9zfKicnGZ7m4qFeZlqhoyEb3qAa3JlYHdwbGtpXGZlYmJxVFs+Tk5OU0c+QFVEOjEvHh8mNDozMDY2Nzg8Oz5AQUFGSEJHRklLTVNVVVldYGhmZ1hRSjxERzw4VVJbYGFiYF5fX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5Wmo6Cur6yrqaWoraKnraSSlqu2sbOnm6uorZh0jZ+xoKirp5SXuaCgj5yknZF/iYibnoyrmaKVp6GdjpaSnoV1rY+Ip5uqkpilipy7tKegmZiLiXV3k42Wk4qTkZGUjZCUoY+coaeZnLKVgIybtJyyjJKOuqWffaeheaCstX+NjaWeg4uGkLCqr42Ll6SbeoGLrIWcnaGnqKeHlYWYd6WbeoicgJengoF7nLN6ioahmJqVmJaCkZeXhJuZY3uHkIWPkJKLg21wjod5gHB/gIR+hXOFg5SReJZoknSgmnV9mYSjoImYf5WNhoWaa4+Oh2x5fHJxaGV5cGpsa1xlbGtmdV1eSVRMUkBFNi5aVVU3KSEwOT4+NzQzNTY4Ozo9Pj5AREk/SUVKTEdTWFtZXGJhaGZaUUg5RUw7PmFWXmJkZmRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXop+mrK2rqKygp7CmpqmlmZSvyL+xopeoqrefkYWerZynoqCOkL6emoyfmqCQfIaPmJeHrJyilp+gkYyTiYWAkqeNh6OepJWZn4efurKnnZuSjoVxdpCJlZCKlJCPm4yQkqCSmKGklp6rh5+0ibSZrYrKh6msiLaFjK+BrquCqIymmI2dfaiPc3t3nI+nl2iVpHm0jJ+epqeSmMKBf6uImKFynoCapX2XhZWzgaF9oZShkJiXgY+UnIuZkot9hZOHjZaSiYNtc4+FfnlxhoCDe4N0hICWgI/FZn+ph4+ja56FpJ2EmoGOkImMmnGPlIZpeXZ8eGhpdnJoaGxeZHBtZ25ZZ0ddUk0zRTU3TmJkNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05JSkxDUFpdXFdhXmlsXFFFPUtNQEpjWF1jZmhnYmJiYmRjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUlqKfr6eoqKWrn6S3sKmrppqUoKOkrKWYpqy5pLCBoqmdpp6diZS9mZONoZKej3mEl5aRh6uZm5uZoYSOjHeanI+fkIiepZyXmpmHo7mtpJqcjIx+Ym2Pi5OQjZCNjZiMkZOgj5WhoZmhp36hp4etnZ+WrY+dnJyQhH+gjKishaONqZmMmn+idYGZlGuCrXZNq3iHjZyRmqimgKmrfYOhe3qnap5/kmtnl4aYt4mefm5gZFmDl4CNfGRoi3KZfXmWbF19l21fUnCDXF9reIJfWGSBfIN/l3CnqmuDo25ypXCfhaBqZ6BtXHCOfmdaYISBY1hRcHdmbnVza2pwXmtxbmxqWWlPXVlGOUE1SERfbDUsSURSTU49ODQ4NTk7NkA7Oz5CUD5RUkxNQkpcXV9XXV5idWBNRDpNT05UYlxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5WdoLigqaOmrJGhtbuqrqKZmKGipa2voZ6wtqSpk6KhoKecmo6ZtJmQi5+MlYt1gZSSjIqmlZWZnp5+koWFrKSHm5CKmaqZm5uSiKaxp6GVmoiJgGluiIeLjo6Ki42SjJGTo42Un5+coqR/k4GPoqCTn3aclY+ngZ+lfoWnqoKleIl8hJp+onBzlIiWfJ+NeW2Gm4yZj5uomY6HnXuConN2pmaefnekX5h6fZR0om6Yt7S6dJOIg4C1qGSBxrh7cJW2jHKAmqNjc6yrYHxpnbN+bXyGgY2Ci5hxf6NscqN0n4WBpGGdmbSXc32Yn7N1dFyesoNrY3B1d3JpcFlsbXNzZ11qXmJMRT1ENlFCWnMzPVNHYEpSPTwzOTU6OTZEOztASlA/VU1PUUBFX19bWlhgYHxkSEM4TVdVV2JhWmVma2tiYmVhZGRgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJOVlKO3mKqbk5+NpLe0ra2gmqKdpKOmr52cs6+tlJmimqGlmZuVn6ubi4iSeIuFcYCWjYmQoY+SlJ2YfZCJjaihh5eOiZKklZybjYypqKWej5eHhH5qe4d+fZCNg4uRkYmQlKGDl56gnZ+ei4l3nJihjJ9xoYqHqYeapI6Vpah8rYx+eqCZeqOTeIF0loiNnH2Wn4abjpibpYWiZKF8iJaQm41tnmibjm+amXqAi6d9cml0q4Ofg3SqaJWaXZuFdoWeZ6prgLhmXKhwgZxglYxep3Z1h4h+nmiadYaTkpeOgJ9vmpFup5peqX95u2t+qlyOhF20aF1ucnp4bGpccWt5emRhZ1hiQlJGTzdXQ1JvNUxbW19OWkRBMjUxPDo3SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5bXllkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FgZGVla2VjaWhna2mVm4mptJqniGOUm6u6sa+snqacnKmgn6+cnrKprp+YpZuhoJmXl6CjmYaJjWqIgHJ7l4iLlpaEkZWYkHqKhJWknIqUj4aMn5OenYmRqaOgmoySioCAaYGGeX+XjHuJjo6IkJebf5Sinp+hk5hyaJ+Jno6LcJKMgamGmJ2hpZ6le7Cto6K4l3ejs6OkgImUeZ17q5l+oo6cmpaIl3GhfIWNr7V9a5qRoXl+mLWipKuohJl8m32em390qlpdb3uWi3ieYkx/e3qFY3mXQkyfWKJqcXuObICIhJl1m3iGibGzf4Cbk6d3g55udH6VcJp0a6RelXZIZWRhdHJ/f29mYWxpd3xlZWJRX1ddVVdAWkZRaEVUV11iWF5JRD1COD9COklGOExFWEFXUltWREZiXFpgS2BtfnJFQjxVX2JaZWlWZ2htb2JmZ15hYVxdXmBoYl9lY3ZsXWVnZmtkZWxpaWtpk5yAsK2ZhFNeoKazubKyqZqijJysnJyqlaKtpaOpkKCfnpualpmhnZaIh4l3hoFveZWFkZuLfJGTlohygIiRoZtzkJCBiZqWoZuFj6qcm5WLi4p8g2yEhXGCoYx4ho2IiJOZlnyTpKCeooithn21hI2dnHullnqpgJSaj4memnunaHdtfpl0oXNyfJ6GmXCTg659pIOlnZmAo29eqWd1omNvpWGc05B9e5l4c3NiooaQfqN0pJB2a4+zjGCCmIlzqrKovH93g21+v6aptF2bbXxwlm1/cqJyXaRnc6ZgaKZtm9SafoabcHt7mGycfHiYc26ppGdhZXpygIVsaGZkb3Z4aGFjU1xmUVJiSFlKVWFXVFxma1xlUUZDS01KS0JLRThPQFFOWFNZT1NRYGZmalJjd3l3SUZFY11lWmhqVGloam9jamdgY19dXV1faGJhaWV8ZF5kZ2RrZGpsZmhsaJeaf6+qVFxLfqmvsbOvsqObmYWZqaCipY+mqaGaq4ubmZmUmZOSoZiOh4V7cH2EaH2Pg5WbgHeRjo+Jb3+FjpKSbJeTfImSlKWXg4+rm5SSi4aJeYN2iIBugp+Gd4CThoiZo5h7lKKjmZ+Js6Gitot6rKekrqVwqYCZjoWAmY96pIChmYaYcp6EpK6vipeMgI2kjZWDraCTdrW2tcmhc5SLgZ9gnpepbXmWh6CbdKKId6B+k5eLgXBNZqOScJuHc6V7eXRhg4FrfqBrcWRfnHF9c5ZoeWmztbTGpnOYfXqda5ybq3aFm253eZhqmnt2mHNRRX2zX2p3bHqIZ2toY3V2cW9XX1RZaVBTaElXTVlUVl5pbG9WaFdOS0FKTUtISk9BUUtQZWNqbWV0cnN/eXxudYl7e1RRT2xeaVxraVJqaGlsZ2xmY2VfXF1dXmliZGlre19dZGdjamZvbWVpbGWhm4iupYNkP5Ohsqqur7WiopCAl6qio6aNpqifnqeEm5iXjpeQj5yTjoiDemp5h2WDjX+YoHl1j4mMgWmEhZGCjIWdjXmNjJemlISZqpiNkYuBiXqAfYt4cJChhnqBlYeJlqCWf5SkppuVlYNmbnicbKJke3Gld5uYcGamgJSJeqR6n5aDl3Oed4GKlZePuW6RiqJifZiglYhucmmqa3WgbW+mYJtpi5BploeblnWigX6aYIyGjXVwiGJooGWefmmbdW9jZoiBbXGiWV5aYqFsXYiLbnp9c3JkpW14omRnp2iZc4yZcKJwVYmQb6BfZqhVi15UmG5udGtzg25xaWx5dGtwUllXV2ZaVG1JWlBdSVhpaXNqWWxXUVJGVlxMWFNhVWlrX3d0e31wfHxyg3uAc3aNgIR2XlJyYmdjcGdQamhoa2xuaGRnX11eXWBqYmppdnVdXGNoY2pqc2xma21jnKOXpXlkc22Lpq2jqbCxpp+LgJirnZ+njaOinKSjgZaZlI6akIuYkI6Ke4dxgIhpi4t8mJtzdYl+kHtkg4eUiYqVmYJ8iIeYqJKBo62RhpCLgol+gICOcmmQpoR9h5ONiJmgj4iTqaWciKZ4lZt+pIiWi7GYnZCCr5efpHWThXipc6WPhJpupKKMkoSNg7tufaWvg4eFhpOVnJ98pXpyqJWglmeefm+sZJaKlpN3qG2qooGJdomDd6uRpohrkbBrdrOMqWuKhW1tn56RlF99q4uqdn5+i6Wedp98g6SVnaBqm4h4rGifroy2dHe+jaSTWoOnjqthdnN1cnx1cWNrf29obVRXW1ZhYl1rTV1SXkpebW93YFtxWVxgW2d0ZW5vcmNydGB3en55cnmDc4R/gXt7jIGDgHZieGRjbnJkUmtnaG9scmpmaWFgXlxha2JtbHpvXFxiaWJsandtZ2xuYpWkqZyBf52jlqmpnaimrqSZioKYrJqfpoqcpp6rnoWNm5CHnJGFko2MjXSHe4iEb42FfpiTdHSGc5KCbX+LkYeGk459e4KHmaePgKenj4GOiYWUdoKHkm5si6mBg4yUjomdn4mMlKmin45/dJOXiH6BeZSuon+BmnGPhneOiYJ9e3KnjHJ+fXqYlpuEkHl7f36HlJWTinaQmJ6gg3t9iWuMhVt5eXJ6cWlufpKJcYB1gY+Uk3GHhIJljH9fgICLd3VzlHVveW5th2yDhl51Z3eOZX+AhIyomn10e5VqiYhwgXZ9h3dubmiNdHp8mHiFXGxYeY9pb3hzcnB4eHBdbIdvamhXW2BXXWZrZFZjVV9SYHB5eW1rd2Zra2t3fXJydXRhb3ZidHuCeHV6gnWAgICBeYuFg317bn9sZHluXlduZ2h1a3hqaWplXGBaY2plbXF0bltbYmxkbGx5bmhrb2GNk7eopomgopqmo5ilnKuioYSEmK2SnqKKm6ibqpiDgpyMf5aUh46KiY1yg3yPfX6PhHuYj3RyhHGVhXt9kouGho+EeX6AiJulj3yoooyGkJCFlYKGjph2coSpho6SnZCJn56IjJumnp+qg4iNlZp+fomWraePkqWPd2+bjoF4kG5+qIVxfpVxa3B9gqCNgJOOi2hsXIKLi5uano5zlYuIcXRrgnd0gVlyboeRgX5/jGpdamV7hoSJgGBpeHqbe4KLgnWBhYFnd4qGamBvcYB1XnGJgIiOppSFZYuNg253i4Rxho96cWhpZnyEe5ZbXWtobnZcfHp4dm90c4NoXW6LbGxjWlpfW1lscVxfYVpfXmZ0f3x2cHVka2trfH1zfHl1ZW51aG18fnd6fHt5eoCAfm+FiYR7fXR+eXN/aFRccWlsdnB1Z2toZF1hWGtoa2txcm5XW2VubGdzeW9oamxgi4qpsKGPoqGanp2Xnpioo6J+g5mujqCViZ2jkaaVgHyYhn2SmYmJhoeKc36BjHaFi4KEl4pyb4BymIaDfpKDhIaJgHqBhI2coZGDqKKIeY6XiJSKi5yXhIN6rYKRmJqVip6dh4ihqZ6hoaOKh5ObnKOZlaqhp6afkpqGlIt6do2Ng6d+f5OQkpSdsqablZ+QjbGSl4OljIyVmp+JkJuCiJGKa3yOd3hlg4aRi3yJnoSHjJCJiYGFhJB3fHp0mqCJhoqdiYSTfn2KgH90bnKEgX12hYWJjqWQgoWMhoKMkIx9iIyKkYR6boSFfnqZa3NpYXSLcX57eHdweHWCXV5viGlvYF9aXV1TaHJWZF1dYm1odnx9dG9wZWtqaX99bnmAcmpwcWxngXtygoB4f31/hHptgoyGfHp4e316g3hOY3Zqc25wemVrZWNiYFt0ZnBncnFtVV1sdG1oeXpxZ2lrZYyHnLmelqGgmJSYmZSYpKGffH+arI+fjoagnYyeln15lYR8jpmKhoOEh255gYFzgYh+iZSEbWt+epeHg4OPfoCHhIV8h4WPnJ+TiKyghHOKkIaSkYudkX2Ne6qEjpOYlo+cl4eHm6SeoZmchYKSmpmYj5mmn6Scm4+Vf46HdHqGjYSle3yOkJGGmauinpSdkI6pjZCAnYyIk5mego+XfoeOg294hnJ1YH+EkIZ0jJmBg4+Dh4V/hYSVbnl2dJKiioyFmoSEjHN/iXx7cXF6hoJ6d4iNg5Gmj4WDjoCDiomKd4aJi41+cm2Agn1vaWxuaF56gGl+fXd2d3Z7eF1gcX5udWBjW11fUmduVWZbXmJraXZ6f3JsbWRramiBf2x0gmxsdXB6cIZ5boeAdoKAfoV2cYKNiH57fHx/e4KKYGh7anVpaYJkamNgaVxjdWhvYnVtbFVjcXllcHp7c2VqbW2LiZ62maCjn5KRlZiLmp+fn3t4n6eRnIuHpZWMmZl6e42GfYmRhIyCgoNufIB5c4GFfouSfWtofYKXiYGIjXt9hoSGfI+CkJ2dk4mpnYFxi4uMkoagoYqFjHyokYmQkpeTlpN4jKKen52VmH6AkJqYkouZoqCjmJWQmXyLgnd/go6GoH9+jIyPfJiloqKTmpGQpoyPgZqQiZKWm36Tkn6HjoF1dIJxd2F+gY6GcYuXfYmMcox/goWGj2h4cniMmJGPf5Z+iIlygYZ7e293eoqDeXiPi4KVpJOKhY97hoaHhHaDhImJfWhzfoF6fHJtbGhffnRpfXZ2dH1zgWtfYHR2cHdkY1lfX1JraVZmWmBhaWp2eYJyZ2xkbGhmgIFrbn5ob3Fsf3mHemyMgXOBgX6BdHaCjYZ/fHt/gX1/j2lyg250aWGHaGxiX3FWdG9sbWB4aG1XanR2Y3V6e3Jiam96iYyesZGlpJyOj5ePhpygm558d6WhjpiAjaOLiZqWeXyGiH+DiX+JgoF/cn97dHaDhX6LkXhnY32Gl4qCiot4fICNg3mWgpaZmI6XoZt/cIyCkZOGpZuHjImDppaFk4uWl5OSdpGdn6CXk5Z5fo6Xl42WmpyjnJeRk5l3jYOBdoOWjZ1+gYmNjHOXo5+ilJmPj6KMioKWl4OSlZl+mI18iI2BdnF+bntkgHyLhXCHk4CRgmyIg4GAiYVmdW97hZGYi3yTeIuIe3+Ge3pwfXeIhXiDj4eKl6GVgYOLdoiEg4J3fIOKhnhhenp/dYB5aG1mYn9qa3h0dHd+cn1jZGFzbnVybWFaYV5bbWVTZFlhYWlrdXmGcmNrY21maH2CbGl1aG5waoB9g3ltkIZygIODfnR8g4yBf356goN+fJBtdolzdW1limxqYmJ1VoRpcG5geGdsYmp2cGZ5fHpxYHJshoWPm62XpqeejYyXh4afk5eZfniqnYuZepedjIyZkHl8gYx+fIR8gYOBeHR5enR9gISAiYuAZF99i5SHf4SGdHx+i399mIaXlZiNpKKYgHOHe5ORiaaPjI6Kk6CShJKQlJeRi4GPl56akY+Qcn+NkZOInJyepZeWi5OVcYuLiWuEl4+ZeoeIj4lvl56bpJSWi4yei4aBkZx/kpKVhpmIe4qKgXlyemx1bHx/i35thZODlXdwg4R+fouAZXJpe3+Wl4N+jXSQh4J4hn10dn58hIB7gYuCi5Ojj3iDgXSJh32AdHaCiYVxYnx2e3J+cGNwZGV8Y29wd3N5eHR1YnZgcGx2bm9cXGBeXmteUV5ZY2FpbnR7imxgamVrY2h3h25nbWlrbWmCfXt3b5CIc4CEhH10gYaJe4N9eoGEfX2OcnqLeHhtbIdqaF9pcmOHZ3FvZXdnbmxheWlrfXt4cGF4bYuAmJipn6SonYqKkoaKnYuVmX54r5mNl32flJGXlIh3fnyKfXyAd3iAgHB1dHxvhn2BgYp/fGFcfo+RhoCDgnJ6gId6j5KJk5Kdk6adlYJ9gX2OipGjiY6KjZiajYaSmZSWjoqIjJGbko6MjG2EkI+RiJ6ZoqCWlIiVj2yGl4JlhJiOk3qJhJCKcJablaOUk4mLmYyBf5CefZKOkoyZjnuKhYdzc3ZscW51fIp0b4eRj5NxdYF8gYGIfGVwbHl8mZN8g4h0kImAc4d4bn98gIV7hIqGgYuUp4x6hnt+i4V4fnFwgYeFZml6dXZxfGNfcWFrdF9xa3t6eWxzcWV5Xm9sc21yWFtfYGJsW1BYWWVjaHJyf4hnXWppZ2JncY1vZGpoZWlpgXp3dW+OhXSBgoN7dYKIhXiFfHiEhXp/iXd/i3t7cniDamtfcGh0gGtyb21yZ29sZXxjboB6dnFsd3eKfqKXoaegppuHi4uBj5yHk512gquVk46HoY2WlJCAdHx3hXh5f3Jze4Zrc3B6bot2gIGHb3BbWX6RjYeAf391dIGAgKCHkouUnpiilZh5in+BjYicnYqPhpKYloWJlZqQl4yMjY2Lm4mNj4JtiYuQkImclqGbl5SEloZogqGBZYSciZB+i4OLgXeTmZOgk5KJiZSNfn2Ol3uRjI+OmpJ8ioCCb3ZwbG1vcHuGaXSEj5mLcXeBdYKIg3lmcm51gJmOe4eEeZOQeXWHc2+IeoSKeYqEgIaNm6KHe4N1got/eHlubIGFg190dXRycnlbX3FhcGtfcGt+fHFubmttdmFwb2txbVlZYmFib1hRVFtmZ2N1cIWDY11rbWRiZmuSbmBnZ19oa4F1cnNwi4B1f4OAeXaAi4B4hX94iIZ3g4V8hot/e3aKf2pxY3xjhnxucW10amhvbHZ4X3F/eXx0dXSAg36klZqtnqeWhY2Ef5eUg5CgdoyglJOGi5uNlo6LenJ5dYJwcoV0cXaIbHBudm2IdoN+gG1tVVGBqpSGgnd/dnGDeoOhg5OClZSZnZObeJF7g4ySo5mTjomVmZKEh5eZjJSLiY6PhpyDj4l7couFio6HnJqfmpSTfpJ8ZoOahWaFn4eRhJGCiXGDkZiQnI+QjYyPjHd7kZB6jouMkpaMfIh8gGt3am5rbGx7f2F6fo+Xgnd7gniDjH15Z3Nsc4aVi32HhXqTj3F5g291i3mIinmIe4CKjp2chHt6doKLfHdxamyChHtheXFvbnN0Vl9wYnJiYG1venFpcGZnc3Vpcmxid2VdV2ZhYXNUUU9dZ2VeeXCJfWBdaXJiYmZmkWpfaGVbZ3B+cGxxdIp9dnyGgHV2fox5e4WBeIiDc4aFfoyMhHx5lXhmcmqDYIh+b29remBqbnR/dV90fXmHeHRzhX14oI+ZsZyljoKLf4OaiICMn4CLmpSPhYiYjo+PhHd0d3SAcW+FdHByhHBraXdug259fW10clJNgt/IktaTe3B1hHaFoYSUeJeSmZ2RmXuUc4WQnqGTlJGKk5yUhn+XloiNjYeRjIebfo2Ad3qMfomMipybnJqTkXiMdGWGj4Vrh6KEkYiWg4ZjjJGZj5aLl4yMiopxepSIe46IipORiXmFfH9tfGVzb2tsenpbgXmQkIF6fn+Aho57e2lzanOKj4mBhYR8lIprfX5tf4p9ioV8hHiAjZOZmIl8dXeDj3hybWdxgIVubHVwaWt2b1NfcGVwWmBtc3lobGtjZ3hycHFkYHhhYFZsX193UU5MYmdjXXpyinZeXWV2YWJlZY5kYWdiWWlzc25rcXaMfHR6hoJ1dn2Lc3+Gf3uJf3KJiIGRi4h8fph2ZXNufGWIfm9wbIBZbG55eXNgdnp7jXZyd4p3eZ6Lm66aoJCChXeIlX58ip6IhqCSj4WMmISTj4eBdHhweXFvhHBtb39zZWV5cX1teX1qZ2tjpJrB3K7woXNsdoV3hqSGk2+YkpailpyBknKGi6KXiI6Wi5CdloOBlpCFiY+AkImIlX2GenR/iXeHhI6cmpiYjY51iXVshIeJfImig5GJnISFXouTmIuQiY+Li4SJbXuWgX2IhYmRj4Z2hX1+a31keHZqbnlzWIl7koiFen6BgYaMf3lmcml/iY2JgoF+i5WEa4F1bYaPgY6CfYF4fo6UkZePdHJ3h4x1c3FndnqEY3VucWNreGhSYXJobFZgb3V6YXJkYGl9cHNvW2RyYWJXbltdeU9NTGVnYl53dIpuXV1keV5fZWWFYGNjX1lqc2tua3N3jH10d4SBeHd7iXGDhH1+iHt0i4mIloaMf36Xc2d1cnlsjHtudHGBV3F6dnlyZHd5hoxpdoCJcn+chpinm6OShH1xjJR3eYyehYWhjY98lo2AmoiEe3N3cHRqcIJsam18dV9heHd7cXV7Z2BkfOvatcnD3IdzbHSCd4ucio9rmpGQnpaUgYlxhYifjYSLlouMmJR8jZOIg4mQe4+LhY6Af3V4g4RyiIKTnJaUl4SLdYZ9boKAh4aYoYKTjJ6DiWGDlI+HioaKjoeBh2l8k399g4SJjo2CcYZ+f3F3aHZzanR3bFqNfZODhX2AhIGEioJ2YXJrh4GOiYF+fpGQfW2Ba3eFjoSQgXuAe32PkY6UiG1weYyFdGtxbHN5gmF1anBebXhhUmVzaWZTYHF3dWFwYF1og3F0a1hoaWNpWW5XXHZNS0xmZ15ic3SGa1xcZXleXmRne2FkX11Za29mb2p0eIp+c3OBfnt2eoh0hYN8f4d2d4qGj5mBjIJ7k3Vsd3Z5eJN0bnh7fVh5hnF/b2d4d5KCZHaGhXCKloWZoZqiioh0b5KMcXePnH6LmomJfaB/hJqAgXhydG5vZHJ/aWZteHhcYHl7e3FxgGphZ2F/1baOkaZ4b3F4fXGUko6Ia5uQip2TjIZ7aYeLmYaBkpGGh5iOfI2NgYGJjXuPjH2IhHpzeoN6cIaAlpqOk5OAh3SChHSBfYiQm56GlY+ffohigJOHhYmFi42AgINnfJCAfn+CjI+Qfm2DfIJ0bG13dXR3dmxjjoGPgIV+fYZ/hIl/cF9xb4R7jouBe36QiHlwg2V5gYiFioB6hHx+ko2PkYJtbnmLfnVtbmtse39kaWxrWm94WlNqc2liUWNzeG1jZl5aa4RudGJcaF9lbWBvVVxwT0hPZ2ZcaG9xgG5bXGNzYFxjbHdlZV1dWmxtY21qc3eGf3JxgHx9dHiGeIWCfYCIdXmJgZOVfImGdoiBcHh5e4STb257gXdeg4B0gW1penSUc2dziHxxkpGDmZ+boIaIdnaUf213lJh/iJCEi46afYyad352cnBsamF1fWdianV6W2B4fHpscH9lY2dnV52PX3Fzlr3FhXdylYuRgHSZjYedlI2Ic2uIj5WAe5SLgYSbjHyKhn18iYx+k4d0h4V2dn2BcXWGgZ6VhpSOgYFxfoZzgnmHlZuWhpONnYCIZn6Tg4GGhIqJcoF9Z32Le3l/f4eLj31pgHyDdmZweXhzd3Rsa4+Gi4KLf3mDgYSEgGtecHZ6fYuHhHuAjn9+coBoeIGFiYSBd4J7f5WKjot8bWt6iXx2dG9paH53ZV1yZFlxdVRUb3NpYk5odXlnYV5dWW+BcHRaZWNea25hcVBabFJEVGhiWmxvbXtwWltebWNaY293ZGdcXWBramNsaXN3gYNyb357f3R1g3qDgnyChnZ+iYGWkXiDinSBiHN5eX6NkG9ve4FxaoJ5en5ubXx2lWtqeIR0a5OMhZ6YoJmFiG9+jHZqeZmPgIKKgpaYinmPlm96c3FsamRgdHtpYGZye1thcn16ZnB6YWVkjrGyd0tiWqXa0phzfJKNkXp/l4yFmpKNhm9shZKReXmThoCEmYp8h4B5eImKg5V/bomGcXN9e2p5hoOlkYSSjIJ+bn2BdIF2g5mXkoqTj5SFiHB7k4R+hIOJg2+BeGiAhXhyf3+Diod8ZXx+g3VjcXOAaXlxb3WZjYaEi3x3eYCEeoJrXG98cn+Hg4h9hYd6iHGAbXCChYyCgnGDd3+WioyDd21sfoR/dnplaGp+cmFaeFtac29PWHJ0Z2BLbnd2Yl5cW1l1fnNwWGdeZmtyX29PWGlTP1lnX1txa2d5clxbWWxlWmNweV9oXV5lbGhmbGlyeH+HcG6AfYF2cIJ7gIF/g392gYWJl4pxgo1xe4Z8enmElIx1a3p/bHB+dX99b3J8e5Nwb4F/eWaSioKhmJ2Rg4Znh4RwZ3qXin+AhYKaioF8jY1peHJsbGZfYW95bWBjb3lcZGyDemFxdl9kZdXrvoszOj6Lj4ByeYaKkI54hpmOf5SOjX9ubYWMi3V9j3+FgpWJfIN4bnaHhIKVdm2HhGt1e3VleYOEp4yDjouCfGx+cnSBeIOaj4qPkZKNjId/e5KIeYCFjoNsgHJpgH94bXx8gYqDeGJ5hIJyZHFpf251cnWCnIyBgIZ/dHZ+gHOBcFtrfHN4iIGKe4Z/fIh3eXBrh4OPgohwgHd9k4mKfXNtanaAgHV1XWlpeXFaV35UW3JmTVtzcmZcSnJ5cV1bW1pedoB2aVpiW2hmb2NqTlhnUj5eZl1edmZfdXFbWVVvZFplcXlbaF5gZ21oamtpcHh+jm1qgoSAeW6Be32Bf4J6dYKBjJOFcICLbnd9gHt7iJOJgGl7fWt0fHKGe3N2fX6MeniEfnxrjIyEm52WjIKBbY1+bGl/j458fn+DlIJ/fYqIa3VxZ2ljW2Nnc29gYWx0YWhwiXphc3ReYmOboJBuXTZbsLZ1aoCJfpSHeIiZh3WQjIp3cG2FgoZ0eYl4iX2TiHp/c2d2iH18lm5vhX1odnluZXqJhaWHgIaMiX1tfXR9f3uKl4aAk5CYiYuFinyQinF8foZ8aX5ta4B7eWp6d4KHgXJgd4J+cmRyZ3aDbnV7hpWSgn2CgHB3enx1f21XbX11c4mAhXaGdIKJendybYiAjn+DcX17fJCHh3lubWhtgoF1bl1oZ3VyUlx9T11yXU9cc3BkVkt0eWtYWVlaYnKBdmFeXWFnZGlqZk9aaU5BYmRcYHdhXXVuWFhTdWJbZW9zWGpfYmhrZ21saXB3fJNsaISKfXxwf357gX+CeneAgImLhHJ7h29xd4R/e4mNj4RqfntueHl2ind9eH+Bh3+Efn56bYSMiJijjYWEfHaLemtthYmTen17gpKAgH6KhHBycGNmXllnX3BwYGFocGZqb4l0YXRvW2BkanZ7f7+dqKXJuHKFhHSVfnqJlYR0ko6HcnNwhHqCc3WGdIh3lIl5eXFkd4Z5f5JocYN1Znd2ZGp8hIiegn9+jo18cX1ygnd+kI6CdpWNlJCIgoh7iYpseXqAdWh7aWx/eXNpenaAg31oYHeIfWtqdGh7gGp2gY2RlX98fn5xfHd8dH9iVXV7cXKHgoF7gXCGiXd4b2+Cgot9fHd8enOMhIB1aHBnbIiBcnBdaGN0b0xmd01fb1ZUWnRuYlFPdXliUlhYXWJxg3RcYl1pZWVja2RSXHFJRGViXGRxXl14aFZXVnheXGZuaVZsXmFqZ2Vvbmhwd3qTbmmIjHl9c3t+eYKBgnx2fYOIhoNwdoNzbneCgn6Ii5R/cYB8eHp6gYt1g3h+gIGChHqAdW99ioubnoh+hnt3hnxodYeNknp/gHyJhoR2j4BncG5gZVxYZlltc2FhYXFsbGiJbmBzaVheY22Ad6naqciHiLNyinlxj3Z9iZGBe5SLgHV0dX52f29wf22FdJSGeHVsYHmAeIeNZXGCbmd1blttfYGQk4CAeJKRfHd6bIVzfo+Kg3KVipGPiIaGe3+GbXV3f21od2VtfHZta3d3f398YGJ4hnpodXZjfntodYaPjpZ9dYB2coB7fW2AWlVxfG9zgYV9f3driIZzeGp0f4OCfHl7d3pxiX97cmdzZG2LhGxzW2pgdmZJb29NXGNYV1Z5bWJQU3V3WVFWWF5hcoVwXWFjbWVjXm9jVV5zR0NnYF5naV1ae2NSVl12W1tnbGJWa2BgbmZmbHBocHZ4j3Rrjo12f3Z4fXeBg4F7dH2DiIiDb3F/dXF1fYWBiY2Le3d/eIR8fYWHeIh8fYF9hIB7fnJ2eIuOn4yJe4p3dYN6Xn6Hmo16h4R0hoeFd4l7Ym5tXGJbW2FVanRkYFtob3Bnh3FhcWZXXGNrf3zKzoe6omtub4tucoVzfoaMf3uThXp5dHp1dHpqbHZjhHaSgnZvZ198gHiKh2RxgGpqcWNYbXuGnImDgXKXk3Z9em2Gb3+IioZwlo6QiIaMhHt5f3JycH5naHJjbnhxamxyeH18eV1leoB4aXV5Z4J3aHWHjI6VfXOHam9+gHhufV1Xb3xsc36IeoBubop/cHZmdn+AfoB1em95coV6eHFlcmBtjIFrclhrX3ldSXBsT1hWX1VWfGtiT1R2c1JSVFdeY3WGal1ha2tmY1pvYlljcUhBaV1hZ19cVXteT1ZmcVpbamhdWGhhX3JmamhxZ3Fzdod5bpWKdX97eH55g4eAdXN/hYWOg3Bwe3h3dXmGhYeMhnp8f3WLf32Gg4SHf35+fYZ/fHh2eXaSlJ9+jX2LbnWAemSEiJiGdJKKb4WGgnqDdWNuallfW11dVWhzZWBZZHJyZ4FyYWtkV1pfaX94vq57oLduYnSHaXV9c3uFiHt+jYB3eHN3b3p2ZWpvYYd1joFzamJefXd4ioJlcH1na2tbVm94i6SBhX9wmZJxf3ZzgGx+gI+GcpSIjYiFiYV9eXVzcGl6YWptYW12amdra3l3endbZ318eWZyfm6FdGZ1ho2GloBwi2dre4J0bXViW216anN6iXqAZXSGfG1wZ3R+d31+cHpqeXl/eHZvZGxhbIl9bG5WamF4VkxsbVBTUGlOWX1oYk9VdmxNUVRVX2h3hGdeYXFpZ2FXaV1dbGpKRWxbYmVXWVR5Wk5Xb2tZXWxlXFplY150ZmxlcWdzcHSBeHCZhXZ/f3h/fIWHfXVzgod/lYNuc3l7e3NyhYaIiYR5gX12j399hYmOhIGDen6Lg3t3fHd2mp2YeoqDh2p2fn1thYWVgXOPgnGGgn+CgHBmbGdXXVtcW1NlcGVfWGNydWl2cGRlYldbW2h/cG9ygHOKZWZ6f2p2d3V1hYZ4goV6d3R2bmt6cGFoa2eGdI2EbmdeX3xueYh8Z2x3ZmpkVldzcI6nfYR7dpaQdHtxenhseXqPg3WXfIiGhIeEfXVxc21odV1taWBtdWRnZ2l6b3tzWWeBdnVocIF4gnZid4WLfZWCb4xrbXuBcWVzZWBqd2ZwdYh5fGF1g3Zqa3F0enB5d3J7ZX19fXZ1bWNlYGyGfG1rVmpjclRMa2xQTU9wR158ZmFOVnVlS05UWGFseH9mXmdzamVgV2RYY3JeTExsWGRiVVRVc1dNWXdlWl9sYVxbZGVfd2dtYm9qdG9xfnV0mYF4f4B4gH6GhHp9doKDfpiFbnJ0fHt1cYWFj4KBeot1dJGAfIGVjoGFhHx+jIZ6foF2e6OminmJhoVsdXx8dYSDjXtvhnR6hX2Cg3VuamllVl1bW1pTY25lXFlidHtqaG1oYGFXXVppgGlrcIBobWJpe3prdXV1cIeCeoF+d3Zue2hqeWpfZW5ogXeQhGdlWGF2aX2GeW5pb2ZmXVVYb2iPqHeBe3yQjnh0bn1tcXR4jX53lHSGg4CGiXZqdHdoaW9cbWVebnNfZ2JqeGh7bVttg3N0am+Bfnp3YXeFhXqRhnOIcnB6f3JjcWhbbXVkbnGGendhc4BwaGp4dHFrd3ZzdWKCeX11dG9jYmJsfXxra1VpYmdUTG5pUEhSbEVheWZiTlRyXkpNVVpmbXh7Zl9tcWpkXVZgVnBvV0pUaVhnXlhOVmxUS116YFxfbF1dW2JlYHpobGFucHZub3d1eph9d4CBeYCAh4Z6eXqDfYGThHF0dH96dnSFiJB+gX2RbHOVgXuCn4V/h32AfoaCgIp7dYSsn396iIiEbHKCenaBgIJ1b4hvfYB0ioBqb25lZFhfWlpaVWJqZ1xaX3WCaV5tbFxhVlpba4FlcnR9ampebXh3aHV4c2+HfH5+enZzbHpoaXdnXWRzZ3p3koBjY1Rkb2aBhHV2ZmhpYVdWWWhkkKhvf3d/io56cG57ZndteYp6do5xhH5/gIduZHd0ZWhpXWxiXnBvW2hfbXVlemhddIBucmtxe392dWJ1hox8iYiAf3hydX50YXBsWHBxYW5vgnpzY3GAbGFte3BqZ3l3c3BkhHR4eHRvY2BjbXN9amxUaV5fVUx1ZFFIV2JHY3dmYkxUcVlLTFhZaWx3e2VlbnJmY1pYXll3ZlRJXWRYaVlZSVdlUUljeVteX21bXl1iZF5/aWpgbnR4bW9udoOXeXKBgH1/iYyGfnV2hniGjH10dXWCeXp6gouNfX+FiWp0loF7ip19foV5gHt+fIaJc3GProx8fIeQfmZxiHp0fn13c3CGbXx+bZB6Y3BwYmVdZVZaWVdjZmtgXV10hmhZcG1bXldZW2x7YnF3dm1jXG50dWh2d3Jvhnl/gXp3b290ZWh0ZVtndWZ2dpF5X11TZWVqgYFzfGFiaVxUWF5jZJClaXl0goWQd2xteGZ3bHuDeXSHcoF5fXmAaWZ3bWFnYV9rYF51a1lmXW9vYnplW3d8a25vcHh5dHVlc4OTgImDiXp2b3J9cmF4Y1lubmBvcH96c2VxgGRfbnZqY2Z4enJsbYFzcXtxcGFdZG1vfWVpVGhZWlVOemBSS1pZSGN1ZGFKVW5VSkxaV2ptc3tkbGx0Y2FZWlxid1xUS2ReWWpUV0hZYU5Ia3dZX2FuW1tfYmNdhWloYm54eW1vanaBkHlug36AgpKIhIF2dYl0i4Z0cXZ2gXd9fX6Mj4F/k35weJaDfZmSeYCAeHl+f3OHhHNwmaJ7e3+JlnlldYh6c3l3bHRwf2x5fHCSc15wb2FnYmxUW1pXaWRtZlxccollU3JtW1lYV2BsdmNqdWpqX1tudHJtdXR1a4d9f4F8d29ubGRpcGNba3JkdHaOc1xXVGRgcX5+cIBcYWNeU1phXGSTn2VycYWDkHNraXhrbm55eXpxgHZ/c3t6e2RmdmheY1thaFxfd2hXYl9waGF3YVt8dmpqcm54dHR0aXGCloSHf4V2c2pwfG1md1dbaWxhb3F/eHNlb35bYXFxYl9pb3xranJ9cG92anBgWmRrbXthZ1RnVVhTUXhdU1BZUkhkdGJhR1ZsUUlQWlZsbGx8ZW1vcmFbWlhabXFYU1BnWFdqVFVGWl1PSXN2WWBjbmNYYWFhXoxqY2Vtenlsb2l2eYZ7a4R9gIWZfIKEeX2IbY+GcW92en10goJ9i4+Dg5d0eIKUhYGfiXWBgIF0f4Jwh4N2b6KXdHuGjId7ZneLb258cGd4cXtsc3ZzjWtedG9iZ2ZrU15cVmhibGxbXHGMZE5vbVxWV1VmaXNoY3RlZV5acHZvcXZ2emyIfX99iHeQc2Nka29hXG5tY3N4h2taVFZiY3d7fG+EXGNeY1RbYFpjl5VjbnCChYlyaWZ4bWRydXF6a3l0dW97f3ZfZ3NkXF9XYmRZYnVlVWBhbWRhcV1dfm9oaXNxdHF1dmxthZSDinyFcXJnbnxvcW9SWmVpZHByf3RzYm11VWNya1xebmR7ZGt1fHBxcWltX1hjaWp4XmZVZFVXUVZvWFJXVFBIZXNgYkZYa09JWVVXbmllfGlseWtiV1xWXHVlVFNXaVJaZ1VUSVtaUE55d1tfZW1qWmJhXl6PbmJnbHp2bm9pdnZ/fm2EgH6Gl3t/h4GKf2uTiHJndIB7doCDfomOf4yTc32KkYWHn4Z7f4aMc4CGc32CdW6kjHOCjYx3eG56jWBlfXFnenR5bW1xd4NnZHxtY2dnaFNgX1VnYGxvXF5ujmhOamxgVVZTb2dza2Z4ZWZeWnJ2bnN8eXRuiXuAd5x7emthZWxtXmBuamVxeX5nWlZYX2x4enpugl5hXWhWWGBYZJyIYmtwgYZ8dmtpdWtbdXBqeWl1cm5vfIFzWWtuYFleVmNkWWVxY1RfYmlhYmxaYH5rZmx0dW9teHZsaIaNgIp7iG1xZnB7bHFsYVhfZ2Zucn9ycl5pbFNmcWVWYm1heGFvdHp0aW5ral9XYGZodVxkVmJWVE9ZZ1NPXU9QSGVwXWNHWmpOSmBMWW1lYHhpb4BlYFVeVF52XFVTYWdPXmNVVEtdWlFadnZdX2ZtaFhjYVtejnFjaGp4cnNtZ3ZzeYNzgoN7iI5+fIqIjnpukIp0bHOCdH9/iIWHkoSVj3p9jI+IkZuEgHyNhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo2NjY2NjY2NjY2NjY2Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OSk5OSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjY2NjY2NjY2NjY2NjY2Oj46Ojo6OjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyRbWZnZ2dnZ32FhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERDR2RoZ2dnZ2WQoqCgoKClXiouLi4uK0iFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJFnX2BgYF9eeYOCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTQ5XGBfX19fXZGmpKSkpKpWFRwcHBwYO4OBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fn1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkY6NjY2NjY2PkJCQkJCQjIeHh4eHhomTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaIiYiJiYmJjY+Pj4+Pj4iCg4OCg4KFioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p8fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkpKSkpKNkJKRiYeOipCSk5GLj4qKkImPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjY2NjY6Ojo6NjIyMjIyMjY6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQi4WHhouKhYiQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCIhYWFiIeFh4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkIiFiI2JhIaJj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp+fHZ2eHx8e3x9fX19fX5+fn5+f35/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4SJiIeIg4qPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6fHp6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2Pio6Ki46Jjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp5ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fn9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJh4KIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWFhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f3+Af4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/gICAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f3+AgH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fn5+f39+fn1+fn5+fn9/f35/f4B/f39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlJOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTk5KSkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGRkpOSk5OTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGSkZGSkpOIhZORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCSgoKSkJGRjnWGkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9+f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQj5CIcIWQj5B8dYiQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj4+QkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Oj4xzb4qPinJ4h4+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fXx+fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjXdte4+Cc3iGjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHc25vhHt1doCFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxZWFhXVFBRUlNSU01NSklGRUhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39+fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d3RiXmRfYWtxZmhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f35+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoYl1qbF1mZmdlY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hJSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpaandtYm5zamFZWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVtrcmxhbnVyZlFRU1BQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1OXWNva1lpc3VwU01PUFBQT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0ZCRkhVYmhsb3BvbWxaTExOTU5PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHR0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICCb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVDRkdITVpnaGdybm5oZmRgXl5YTEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7PklaXVtcZWxua29tbWxraWhrZFNHRUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHp9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+AgICAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7Oz1LXGltbm9qb21ramxtZlFHRURHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHN0dHNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYGCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozo9SGNvc21ubGtsaVVDPkNGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN0cnF0eHh5fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk5PUpgc3NwaFQ/Ojs9QEFAPTs7Pjw9PEBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5ent9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT48OkJsfWpAOjs+PT4/QEFAPz9BQEBAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9AO1tuQD5ERT9AQURfZDs9PTs6PT5BQUA+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKR1ZwcHFzc3R0dXl6e3x8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo6bXdJODs6PT5BO0hkPTw9PDg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUj08PUlMRkV1dk43ODg6Oz4/V2pBOzw8Ojo7Pj8/PT05Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N6Sjtcf4N/enx3Vzw9Pz09PkVodEw6PT4/PTxBU0Q/PDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcG9xdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFHcnprYoOEg4KDgH1ePkBDQEA9SnN7WTo9QUVBQFlhR0M9PUBEREFAPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JCQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dHd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEVvdH2CgoGDfn2Edk1BQ0VAPz5Ze4BdP0NFSUpJamZRTUVDR0ZHRUdFRUVERUNBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVyQ0RFRENXdYaHh35YR0hKTE5pZ1tbVkxITk1ISUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhGSEZRbm5wcXJ1dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIlsQUFWdIeJh4eHiINXSExNVmVkYmBlYE5fSUdHR0dGSEZIRUNEREZFRERISENDQ0ZJS0tMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiIRWbIWHhoaGh4iIh3xQTE1jamloY2ZoZ19AQENDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREZHSUpJSkhISEdJSUlKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMS0pUgYOEhIKChYaGhIKGhYSEhoaGh4eGinVJTW11bWppaWlrSTo8Pjs6PEFBQD48OTk4PDw9Oz47ODs/QUJAQUNDQkBBQUREQkNGSElISEhMTUtHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgICAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpJSWWFhISEf4GCg4KDg4SFhYaHiIiIiImMj2ZRdXh0bW1ub2xENzg5NjQ3OTs8Ojg1Njc3ODk3ODc1ODg7Ozs9QDs5OTk9PD47PD1BQ0VISk1MTEdJR09SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaIaEhIF+gYODg4KDhIaJioyMi4uJiouNim12fIRxb3BvbksyNjg3MzU2ODo4NzY1NjU2NzY3Njc6Njc4ODk6NzU3ODk3OTc3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR2eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDY3ODg9Oj1FQ0JlhYOBgIKDg4ODg4aJi4qJiYqKioqLiouLiHJzfHJxbm9uRDM2ODg1NTc2OTk3NzY3NjU6OTo6Ojs3OTg5ODc2Njk6OTg4Njg2ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXZ6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDg4SEhIWGiYqKiIeHiIiKioyLiouNhWxobG95fWY+Ozs7PDk6Ozk6Ozo6OTs6OT09PT47Ozw8Oj47OTs7PDs8Ozk6PDg6Ojo6OTk5PD88PEFCRElKTUtJS0xXb3JzdXN1eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuKjI2Pf2Zsb3l+XkVDQkFCPkBDQUA+PT4+QD8/P0A/QD09P0I+QEE/QD89QEBAPj9BPD48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ6e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUJBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLi4uMjY2NeXByb3ZdS0xISEhFRkhHRUNBQENFRENBQkNCP0BESEVDRUNFREFGRUZERUZEQEI+PEA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0RGV4SCg4SFhYaGh4mJiIeGhoaHiYmKi4yNjIyMjIyNfHNycFhMUkxLS0lKSkpJRkRER0hHRERFRkRCSElLR0hHRkhHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQD07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E+QkJHR0lZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2NjY2NjI2KeXd1b2NRTkxOS0pLSEtHREdJSUlFRklGRkVMTE1JSkdHSElKTk1PTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/f359fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4ODw7Oz06PkA+P0BDRklJUF+Bg4WFhYaGh4iIiIiIiIeHiIiIiYqMjY2MjI2MjI6FeXx4cllOTU5MSklGSklGS0lHS0pJSkdHR0tMTkxNSEhJSk1RTk9OTU9LSUdJSkhJRElISEZGR0dJR0NCQUNUbnB1d3d5enh5ent8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDk6PDg9Pjs9QT4/QURISkxVcYOEhISFhYaHiIiIiIiHhoiIiIiIiYyMi4yMjIyMjIx5cmJdW1BQTUxJR0RISkhNTEdLT0xLSkpMTUxPUE5ISUtMT1FQUFFPT0pISkpMSkxGR0hHRkZIRkVFQkFCQlxvcnd4eXp5eXl6ent8fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uKjIyMjIyMjX9gXFdXV1VRT01MRUZHTVBPUFdVUVBPUVNSTVNUT01TTFBTVVZSU1FQTEpNTU1MTkdHSkZGSEpFREVFQkVDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09QkBCQkdWTkZOUFBUWHuGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyNj4yMi25fW21kSFVTU1JLOztTVFNgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTVJRUFBRS0xLSEhKSEVGSUlJSElpcnZ5eHl4ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0dGRT8/QUFFQUNHRURFTFhSTVRVVlhafIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH5hiouLiHJhaFg9W1pZVFI/QFdWWVxkYFZZYnJdXVddWlZFUVlaW1lfVFlnUlZWWFVUVlRPT01KTEpJSUxNS09NU29zdnh5eHh6eXp7ent8fXt+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSGhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImLjHxyc1teXVxTVVNXV1VbWnWDWVV9kGFcWF1fV0lWXV1bW19ZSFlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiYqBboaJiIeEi4BpXFxdW1ZXVVhUUlhWY5aAUmVyWFpXX2hQYGZbW1hcZ2FHT1poZ11bXF1dV1JPU1BQUlZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fX1/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRUFJSUlZTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIiHiIeDkY6JiYiGhYiIhn6AfWBUWFtWVFZTUlJNUE1MZnpbXVRZVVZdWkxUWlVTVF5aWFdXV3prWFtcXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fH19fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a39+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJVY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmJh4aDh4eHem9zWk1OUVFNT0xKS0VGSUZDP1RkVX9SUVFOS1FUUU1PWVJNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXV1c3N3enp7e3x9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eXFlVUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ2YV5PRkFFRUREQ0FFUUNFQUM+Q0lHVkBITkxHXWlQSEZORkRFRklHSEJESEdJS0dEQkFEQE9RTVNkcnR2dXN0dXp8e3t7e3x9fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFNPVmBrbHJ2e3t4eXRybnN0c3l4fn+DgIODgoCCgIKBgmxPSUJCPDw+QEFAQD9rUUtgRUZISUVCP0dMTkdNUVVJQUU/Pzw9PD09Pz0/QUNDQD89PUI+Sk5HVW51dHVzdHZ4e3x7fHx8fH19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqamZgW1FSWlxZXkpKUFFOS0xRUlFUVlVXUVFXVVBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZURCQkI+O0NDQkJEQlxdT3tOT09OS0xNT09RTEtNV01IR0BBPDk3NzU5OT07Ozs4Ojg6PzxCSD9cc3R1dXV2d3l8fHx9fHx9fX1+fH59fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BfXVpJSFBSUU9NUFFOUVJUVlhTU1lUT1laW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEdISENCR0lGRkZETVJQYVdTWFFQU1NSVVtPT1FWUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxDPmVzc3Z3d3l5e319fHx7fH1+fn57fn59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BWV15aWE1LVFRTUFFVT0xSU1RXWFRUWVJNV1laVlhYVlhZXVdXWGhza11WYXNrYmFfXmRhX15ZVVFOT09NSUhKTEpJRkNRUFNbV1RUTlFTWVNcZVVPU1RSTktJSEM/QTk5OTg5Nzg4NTc1Nzg1OTlHbXJ0d3h5e3t8fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVlVVVVdQU1VXVFVSXW5eUk5aX1tWWTtEVlhUW2ZKTFBTUk9OTU5OTkxKRlFQVVlTVE9KTk9VU1RcVlJVU1JPTUxJSEhGPz88Ojc4NzY1OTk2NzY2NVdwcHN3eXp7fH19fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG9mZWRjXF1SVFpWV1VUV1RSWFhZWVlTVU9KR09QT09NUkpQUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBTTUlMSk9SUFJSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9xdHd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmhpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSUdFSExIS0hGTE1QTUcvRV9SPjM/PmpvYVNSUUBHVFFQUVBRTlFPUVBMSkxMT1BPTlBRUU5QT0pMTU1LR0VFREI7PT08OT1HNjY3N0RtcHR2eXt7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRUZISk1MRUdDT1JDOEVOU11nVFFTQUdVUE9RUVBNTU9NS0xLTE5PT1FMT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydHh7ent9fHx7eXx6en5+fHt1dHVydnZ6e3h6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtucW1pbWNMT09NUVNMVFVUWFdVTExLSTw5ODc7PkA+PD1BQEI9PkVIR0NFRklHSkpARkFBQEZIRUpPSFFSYlxRUFJPU09PUExNT05MTU1OT05bV0tNUU9HSUhDSEpMTEtGRkZFP0JDPjxCRz9CP0FkcHR2enp6e3x7enp3e3d5fn58e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENEPTk3Nzk/Qj47P0JAQD5ARElFQ0dHSkdJRUJCPz49Q0JBR0lETU9iZVFNT05XS0xOS0xOTU1MTE9OU2ROSkxSSUlJRUFISkxNTkpHSUdCQUJAP0VGRUhES25vdnl5eXt7ent6d3R4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR01NSk1QTVBPSEpEP0E9OTg6Oj9CPzxBQkFBREVHS0ZDSEhHR0hDQz9CPz9AQT5ERUNLTlJUTEpJTVRGSUlKTEpLTElKTU1PUFJQSkdDS0dDQklJTE1PTklKSUdDQ0NESEpNTElZcm13eXh6e3p5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFHS0RHSEhHSktJSktERkI9Pj06OTo7QEI/PUFCQ0NHRklLSkRJSUZHR0NDO0FAQj5AQEJFQ0lNUEhIS0dIS0RISkxNSEpMSElKTEtNXVJISERORkFDSkpNTFBNS01KS0ZHR0pOTlFOTGJtaXZ2d3p5e3p9cm1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLREZFR0VGRkdER0JDQD48PTk6OjpAQ0A+QUNERUlFSUpMRkhIR0ZGQ0I7QUJDPkBDRENER0xOSEtOSERIRUlNTk1HSUxHRkdJSUxOS0lHRU5IQkZNS01MT01NTk1LSEhJT1JSU05SZmZmcW9zeHV7eXxsaGpuZWtxbHNwZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lERkZFQ0NDRUBEQj4/Pjo7Oz06PD5DQT5BQ0VGSkZJSExIR0dHRkVDQD1EREI+QUNDQ0RHSElHTVBKRkZHS05PS0ZISUZFREVJSkhKSUZIT0tESUxLT01PTk9PTkpKSUxSVVVST1dkYGFtZ3Fyb3J5emdlaGhkaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMSEVFSENCQUJEPEJBPkE9Ojo9Pzs9PkBCPkBCREdKRUlGSUhHRkdFQ0JBQUZGQ0JCQkRFREdHSUZMUUxJT0pKTUxJR0hFR0VEQ0lJSEtKR0tSTUJOTkxQTk9PTU5PS0tLT1VXVlVTWF9eXGlhbWluaHJzYmVmZmRoaGZuamZtbWhra21yaXF2dHNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd3dnR3dWpzdW51dHNxcmprc01HSEZIQkJBREU8QUBAQzw4Ojw+OT88P0JAQEBERkhFSEZGSEdGRkRDRUNESUVDR0VCRUdFRkdHRUpNS0hRTUpLSEhJRUZISEVDSUlJS01LT1NORFFST1BRTk9NTlBNTE1TV1ZYWFVYXVpdZGBpYmppZ2tfZWVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW55TUhHSEhCQkJGRTw/QkJEPDc7PT06PjpAQj4/P0NFRkRGREVIRURFQ0RFRkdKRUVKR0NHSEZIR0VDRkpKR05LTEtISkxGSUlLSEVLS0xNTk9SVE9IU1RTUFJPUU1OUU5NUFdaVlpZVlpdWlhhYGFgXmhlY2BkZmhnamhoaWZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXd1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSEhHSURCQ0hFPEBFQkU9ODk+Pj08PEFCPD8+QUFGQ0ZDRElEREVFRkdHR0lGR0tIRElIR0lHRkRIS0lHS0hNS0pLTEhMS01LSU1LT05PUlVWT0tVVlNQU1FSTE9RUE9UWVpZXFpZW15eXWBiXlxhY2tiYGRmZ3KFaGdpZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdExJS0lLRkJFR0U8QEdDREA6PD9APz4/QkE8QD5CQUZDRUVFSUVGRUdGSEhGSEhJS0pGSkhIS0hGRkxJSEhKR0xMTUxMSU1LTU1NT0xQUFFVVldPS1ZWVVNSUVJMT1JSUFZbW11eW1xeXl5gYGFkXWNgZWZgZWhqZHNzZmpnZ2tvcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SktMSkxHQkVERTxARkREQzs/P0FAQEBDQT9CP0FDSENGRkdJRkpGR0RJSEdJSEpMSEhKSklMSkZKS0hJS0pHS0tNTUpKTUxOTk1QS09QUlRYVk1OVFVUUlJRUE1OVFNSV1tdXl9dXWBfYGFhYGFjZWJkaGJkaWpndotsamlnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2bndLTUxMTUdDQ0FEPD9FRUVDPUFBQ0JDQ0RBQ0RBQUVHQ0hISUhHSkdDSElHSEpGSU1ISUpNS05MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNQV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAREJFRERGQkNFR0NDSUZDSUpKSUlLR0RLSkdISklJTEhKSk5MT0tJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BhdnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQ0VFREZCRkZHREVLRkZKTUxLTExHR01JR0pLSEtLSUtLTkxNTExMSUxNTFtzYmRwXmxtVU1OZnNdZmZxbG50Z3BpX2FZbm5icHBia2pqZm9xdGV0bm9cb3VncE1KcXl2a2Fga2VlbXhsa3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BzdXRxc3N0dXV1dHd4dnR0Ym11a3BwbHJycXpLTElIR0VEP0FCQD5DRkdDRkNGRUZFRENISEhERUtIR0xOTkxNTUZKTkhKS0pJTEtKSktMTU5OTU1KTU1OW3Jvb25wcGxrTVBRbFdNaWJ0cnBhbW51XFlsUFxubVpxbWtvbXh4dHNpcF1fcmtxalV1eXhvY15rZmJncG9qam9wcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0dFRUVCQkI+QEBGSENHRElGRUVCRklISEVITEpHTU1PTE1OR0xNSUxLSUpNSUtKSktPUE9OTExOTkxcaGR1XWxxV2xOUFFtVFlrXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SExGSURFRUNBQj1CQUNGREhHTEhFQ0NIS0lIRkpMTEZOTExTUkxHTExITkpJSE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5Zcmtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXnRjd3hyam56aGFhY2ZiYmltdHVwc3V2c3FwcHFvcXR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnRzdnNIS0hJQkVFRUFBPkREQkdESElNSUZDRkpMSkdGS05MRk9KS1dSS0dLSkpOSUhKTElLSkhIS01NTU1JS0tLU2tjW2leX2ljcnJaX1lqbl9lZVVrX2NbYWFRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21xcG50eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVudnFxdnR3ckdHRklERUNGQUBCRkVER0JISkxIRkNHS0xJRUZKT0xJUElMW1FKRUhIS01JSEpKS0tJSElGS0tLTEdIS0tMTU1MSktNTlRbXFRQVExQT05PT1ZRT05RTk9RSkpPUFFkcWlUWVdcW1xWWVtdWF1cXGNmYWFlYmNmX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NER0VFQUVDQERIREZHQ0lLTEhGREdLTElFR0lQS0xPS0xXTElFRUhJSkhJS0lNSkhGR0dJSEhJRUZMSUpMT01KUFxXXlBcW2BeTVhZU1xcYl5NWFpNWGFSS1lhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGFhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHJ4cnhzcXJ1cnRPQkNETE1CRERCRUlFSEdGS0pLSEVGSUpLRkVISFBLTU1KTVJJR0VBSEZKSUtMSk1KSEZESUZERkdFRktIQ0pOTExVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOXlxeU1peY15aXWBjYFlfY1tgXltUWFdZXl1jYmNhY2VoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoaGhX91cXBycnN2eXl6eXl4eHh2cnl2eHJxeHZ1dmFTSkpNSUVDQkNHSEZIR0hLSkpJREZLS0tFRklKTktOS0hMTkdIRT5HR0xJS0xLS0tJR0RIRENERUFGSkVBS0xKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFYVVVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR4eXl5eX9+fXl1eXZ2cm56d3Z4WVFLRkNHRUJFSElGR0hIRkZJR0hHSUtJTERES0tOTUxLSEtKSElGP0dHTktLS01LS0tJRkdDREBEQUhJQ0BKS0hQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYlxkY2JkY2ZYUVVUUVtXWmBfXV5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSkZGRkhHR0lHRkZJTEpORkRLSk1OSkxJS0pISUZCSEhRTUxLT01KS0lHR0VEP0VDSUlDQ0hHRVRdWV5YX1lfW11VWFhPXV1RS0pWXlheW11VWWBSUV9fYmJgYGJiYGNiYWRkYlhPUVFRWlJaXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYSFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHiIeFg4B8eFxTS0NBSEZER01SSENRSkVHSEhFRktJTVBFRklKS05MTElLTElJSERIS1FPTU1QTExKS0hJQ0RBRURJR0NDSEZEV1VFXFRdU1ZfWE9UVU5aWk1JSlRgYVtfWF5eYV1PWWFcYGBfYmNiXWFiV2BfVFBPT09XUVxbW1xcXl9iZmZlbGVvb3d8e4B7fX+AhISEhISEhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGSERJUmJQQ1ZeSUdHSERGTUtQUEVJSUpLTkxLS0xLSUpHRUpOUVFOT09NTkxNSEtBREFDREdFQ0NGR0JNSEJLS09PTkxGTUZHSUpIR0xMTU9QSUxPUE9TT0xQU1JVWllXWVhYZFdPU1RQUE5NTlRSWlhYWl1cYGFkZWNnY2tscHNyeXl/e3p/hISEhYSEhISChIB+e4GDgX17hYSGhoaHh4WFhYSEhIKBgH1LSUVFSEZHREtNXUxHR1hMR0hKSEdNTFFRSExLS0tOTVVOT0pKS0dHS1BTU05QT05OTk5IS0ZgRURfTEVnZEZOXEleW3JtT01VbVlMRFBgVWtXZ0pdV1VeRExRVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalJWVVRbXFtgYGFiYWJgZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRkdGSEVFS09TSUpGYFRISU9KSU9NUlFLTUxMT1JVUk9PSUxNR0hNUVtZT1BQTk9PT0lKUX9RSXxZWXJ0WVFtSHFub2FWUHFxc1BDa3NtcXNwU29fWm5YXVZcWFVraFVdVmNaYFlbX1ZWWH9qdHV1Xl92XldhW1tmW19gYWBhXWBhZ21wbGBwd3R4gYGCg4SCf31/gHZ4emx2fnR4fYB8foCBgoR8gIN6f4F/fnd3TkpFSE1OQkRMTEdJS0VSVkxLTklLUlhXUU1PT0xRVE5PUU9LS05HTVBTW1pTUVJPUFBQSkhaeF1UeGVoWlNVUnZndGxwYm5malFyT013bWpycHNycXJvb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29ycnt8b354boByX2BgYmFaYF9na25rYmxmZ213foGAgn57eHeAdHZ6aXJ+bnN8fnd4e36Ag3h8gHV8f3x8c3NOS0dgXUdBRU1NSEpKR0pQT01NSk5WXllVTFFTTlhaTVNTUk5MT0hRUlRZV1ZQVFBQUFFLSGd4bGN4cm1bS05WeXB1bXVib3ZQZWVKZnZxbXdvgGpmeHdpV3JRaHptaWp6en5seHp/b2hvWXZ2anZ1cIBfcmZ9aWx4fG9eX19iYVtdYmRnaWpkZ2JjZGxscHBzdHNzc3lxcnhibHVncXl7c3J1eX6Bc3V6bnx9eXhybk5LU3VOQ0JGUE9ISktJS1BPT09NUFpgWlhLVFdQYV5SVlFZUkxPSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JocXVubXlwd2x2dHRybG5ddH56a215fGt0bHxrcHZ1eF5fX2JeXF9kZGlnaGVlXmFiaWlpamtub2txb21qcGFjZmNvd3hvbXBzeX5ucXBre3p0cm9tTExbVkhHRUdSUElMTUpLUFFQUFBQV1xYVU1VWVVlWFJSWV5TTE5JVFRXV1lXT1NOTk5RSVJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9acHp7XmB6c2Nyb3hxaGR9aXJ8XlVMbGB2dWtpdXt6bX54a3xwXF5eYlteYWRkZ2VlZWJaY2Npa2tyc3J2Z2xpaGRnYWFrYWdzcmxnbG1yfGttaGt7dG1ta21PSEtLSEpISFFQTE5PTEtSUlJPU1JXUlZUUFdaVlZUVFRhX1BOTUtUU1RRVlZOTkxNT1BLSFFOUFVMS0xTVFRTVFBWVVFRTlFRWFlSTlBVVFhYWFtbVVJTV1tXWFhaT1NVV1hYUl5ZV15WVFBZUldXV1dYXlpncl5bW1lcXV9jWl9jY2RmZGNjYlpjYmdmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdnanVqaGdpbFFJS0xMTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlXT09MTVZUUU5VU05PTUxRUExKUlFLUU1LTFBTVVNRUlNTSUhMTk9RUlFQUVRWUlhXXFdTUlBSVFVWU1pRTlNSWFZUWVZVWlZUUlVTVFVXWFZcWV5gXVxaWlxcX2NbXWJjZGZkZGRhWWBhY2FiaGhpbWJhZF5fY11aZFxibWFeZmVmbXNkaWdqa2VkY2ZoUEpLTE9PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFNQUEpOV1NQTlVQTlFOTFNQTU9VU05STk1PUVVRVVFSVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXVlZZW1RQVFVYVVVaVVdaVlNSV1ZVV1tYWl9cVVheXF5dW11gYF1bYmJjZ2ZlZGJYX2FiXmBnZGZlYV5fXV1eWlpfWl9nYF5dXWNoa2FnZmhmZGBiY2JPTE1MUVFMT1RPT1NRT1FbWVdXWFtZWFhWXWpkVlhZWldWU1NPSk5WVFBPVVBQUE5NUlJQUlhUUVFPTVBUVk9YUlRVVU9OTVFTVlVUVFJUV1ZaXVxaVlZRUVZYVltbV1FUVlZWVllUWFhWU1JZV1ZaXlldX15VXlxeYFxbX19fXlpiYmRoZ2RkYlhhYGJeXmZjZGBiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFPVVxaWldbW1xZWltkcW1oZF9bWFZVV1FMTVZTTU5ST1FST0xRU1JVWlVTUFBNUVhXUldTU1NYTU9PUVRYVlVVU1VYWFteXVtbVlFOVVZVW1xXUlNXVldYVlRZW1VUUlpYV1xeWl5fYFVhXGFhXWBiX1xgXWNhY2doZGZgWWNgYV9fZWRfYGJbWlxbXFlaWVhXXFpcW2BeX1teXmFgXmJcWWBbUU5PTlZRUFRRT1RUU1BXXFxcWF5cXldcXmpxd3mAY1xbVVVXUE1PVlNOUVFPUlRRTFJUVFlbV1VPUk9TWFdUU1VSUlpPUFJSVltWV1dUVlpYXF1bW11WU01UVVVbXFZSVVZWWFlTVVpcVVNTXVhaXV5cYGBgVmFbY2JdYWReXGJhY19jZmlkZl5bZGBhYGBjZV9iXllaXltcW1lYWVZXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVFJRV1JUUFteXl1bYFxgVVxdaGpyfXNsZ1xUV1dRT1JaU1JRVFJUVVRLUldWW1laU09TUVZWV1RPV1JTWlJUVFRYXVdYWVNYXFheXVlaXVRVTlVWV15bWFJVVVlZWVVXWlxWU1deWl1dYF1iYl1ZX1tlYV9kZF5eY2NhXmVmaWRmXl1kYWBhYWJkYGJeWFpfW1xbWFhYV1dbWVtgXFtbXFtYWlteVl5ZXVFPT1JaUFpUVVZWVFRUXl5gXl5iXGBVXV5ia3l0bH1rWlVZVFBQU1xUVVRVVFZZV0xSW1ddW11ST1VTWFdXVFBYUlNXU1ZVVVtdWFtaVVpeWF9eWVxZUVdSWVlZX1taVFVWWllaV1haXVdVW15dXmBhX2RjXF5dXWVhYWZkXl5kY2BcZ2RoZWRiX2RhYGFgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU05QVllRXVVWWVdXVVhfX2FhYGNdX1RdX2JlZXWBemhXWVlTVVNWXFhXV1ZWV11YT1VdWl5dXFRSWFNXV1VTVFhSU1ZUWFdYXV5YXVtWXV9YX19YXFZRWFRZWlphWlxWV1hbWltZWVpbWVdeX2BfY2JhZGRcYlxgZmFkZmReX2RiYltmY2hlY2ZgZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlNZVlNcVFZXWVZWXGBhYmNgY15fVltgZGFfenVvaFlbWVVXVFdbWlpcWVhZYFdQVV5cYGBcVFRYUFVXVlRWV1JTVVdaWltfXlpfXFZfX1pdXlldVVJZV1lZXWJaXldYW1xbXFtbWlxaWl9fYGBkYmNkZGJkWWFmY2ZmZV5hYmBjXmJjaWRjZ19nXmFhY2FhYF5fWFRbWlpbW1hbWFhcW1pbWFdZWFdcW1tgXVZdXVNPVllWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheW1xaVldYWVxcXV9bWVtiVlRYXl1hY1xSVllQV1dXV1dWU1VUWFxcXmBgXWBcV2FeW15bWl5YVVhXW1tfYFxfWFlcXF1eX1xbXVlbYGFeYGVjZGVlZmJYY2VkaGdkXmNgYGVjXGVpZGVpX2ZdY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWVhbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNZWlhdYGNkX1JYWVBXV1hZWVdWV1ZcXV5gYWBfYl5ZYV1dXllcXllYVVdbXGBeXV9aWl5dXl5hXVxbWlxgYl9iZWNlZmVmYlpkZmZpZ2JfY15hZmRaaGhiZmljZV5iYmNhYGBfXV1aWFtZWVhYWlhXWltaWVdYVVVbXV1dYGBiYnhLWFdbWVZcW1xdWldcXV9gYmRhYmFdYFhiY2JhY2FiXVtcW1hXW1xfXWBfXVtgZF1cWFtiZWNhUlxaT1lYWltbWldaWWBdYGJiYGFjX1xiXV9dW15dWVlUWF1dX2BfYFxbXl5gYmNdXFhcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiW2NnYFxpaGJoaWVkYGJhY2FfYF9cXVxZXFlYV1hZWFdcWlpXV1hPWFpdYWNmZnJrf0pZV1xaWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBiYmJcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxeXl5ZWFVbX15dYWJgXltgYWJmY19dVF1gYWNkZGZlZ2VmZmVeZWZoaGdkZGBaZWdeYWdoY2hoZmNgYmFjYl9fX1xdW1pbWVhYWFZaVlxbWlZWVk1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4SCgoKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKCgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ1dXV1dXV1dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7enp6enp6ent8fHx8fHx7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnV0dXV1dXR1dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3p6enp6enp6fH19fX18fHx7fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx4xdTS0tLS1JN7fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmIkMzT0tLS09haJSsrKyolY5KNjYyMjYl/f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXjV5+Tk5OTnmXt/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIqU3ebk5OXl61QTGxsbGxRdlpGQkI+RjH9/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dn5/f39/f395d3d3d3d3eHl5eXl5e3hwb29vcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2EhYSEhIOEeHNzc3Nzc3l9fHx9fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dHR0dHR3dHZ3ent4e3h3dnd6eHp6eX55eHh5eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3l5eXl5eXl8fX19fX19fHt7e3x8fHx8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd2eX18fXp7fnt3d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjYyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3Z6fX18fXx+fHd4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4SEgoKCgoGBgoKCgoKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3dnt9fHl7fX58eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp5en17fH18fnt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4e3h6e3l8eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKCgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mFhIOEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHl5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgYGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veHl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4OBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7e3x8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fX19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYGAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgYGBgoKCgoGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzc3NycnFwb29vb3Bxc3NzcnJycnN0dHRzcXFxcnN0dHR0dHR0c3N0c3NzdHR0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHNzcnFxcXBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3Nzc3NycXFwcG9ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm5ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoKBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJzc3NycnFxcHBwcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycXJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubm5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoCBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcXNxcnJxcW98gm9wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKBgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcXFwh4ZwcnFwc5iCbnBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXF9oYJwcm+LnnxvcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFycXSdoXZxd5+cfW9xcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXFwcHBxcHBxcXFxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycZiokG+Co51+cHFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3Jyc3N1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4GDeXJzc3JycnNycnNzc3Nyc3Ryk6mkeYignXxyc3NzcnNzdHR1dXV1dXR1d3h3d3d3d3h4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f4B+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn18dnZ3d3Z1eHp4eHh4eHd4eXmftKmkqKiXfXt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7fHt7ia+mobWrrKN+e3p6eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX19fX2YpZaisqCZp5N9gH99fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+gIB/f35/f4CAgYCAgYCBgZycjqCwoJ+in4CAgYB+fn9/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f4CAgYGAl5qOmLKhmJachXx+fn6Afn5+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjImGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+f4CBfn6fq6SWpJublqCfhn9+fn+Af4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4KDg4aNn7KooqCYnZ2mqK2ooJmRh4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODg4aNoK2xppuaoJuenJydoaSjnZSHg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgoOLl5qXlpigmp2dnZqamJCJhoeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4SEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj5CSkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGBho6Uk5eanJyblI+Jh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5OSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SDg4iQk46UmJKHg4KFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgYKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGTkpCOkI6RkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgYGCg4GCgoKBgIebh4uHgoOCgYCAgICBgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYmHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAf4OIjoCBgoODgH9/gICAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYmGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZaIhIKEgoJ/f4yVgoKBgoSDgYGAgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkZGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmYuDhYSEhIKAkZmGgoKChIODgoWCgYSFhIODg4KDg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOTk5CNjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgZCMg4F/fn18fYycjoCCgYGCgoWUlIyBgoGCg4KFk4OBg4WDg4SDg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUk5OSj42MiIOEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlpeJgH19fX17gZiMgIOBgYGAjpSMkIGCgYKCgpGUgYGDg4KDg4OCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGVn4p+foB9h4t+hISDhIKDg4KNiYWMgoKDgoOGlpWQjIKCg4SEg4ODg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4SEhISDg4KCg5CUk5KSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhH2GiYB+hYWFhIWCf319fYCDhIOEhIuZoKqom4qEjomDhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaGhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkZKNioiFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDiZGDhIuFgoGBfn2Bh4aDgH5+f39/f3+DhISFipOYoKWkm42Wh4WEhYWFhIWEhoWFhYWGhoaFhoWFhoWFhoaGh4aGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhYWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6Fgn9/f39/f39+gICEhIaVl5WXn5+enZKHiIaGhYaFhYaHh4eIhoeHhoaGh4aHhoaHh4aGhoWDg4SFhYaEhYWGhoeHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4iIhYaFg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf35+f4B/f39/f4CAf3+Af3+FjJybmpeanJuZjoeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4eHh4aHhYODhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhYSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIOBgICBjImBgIGCgoGBgYGAf4B/f357en+Zl4qUmZmYlZSMiYmJiouKiIiIiYmLi4qKiIeHiIiIh4eIiIeHhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSSkI+RjoqGhYaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCgoKCgoB/fn19fX1+fnx7fJqVf4GWmJeVk42JiYiJi4qJiYiJiIqKiYuJhoaGhoeFhoiIiIiGhoeEg4OEh4iIiIeFgoKBg4OCg4OEgoGCg4KBhIOEg4GOk5KQj4+LiYWFhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX1+fn5+fn59fn19gZePjJiWmJeTiYeHh4eIh4eJhoeGiIeHiYmDg4SDhYSEhYWGiIiGhYOCgoOFh4aHhoaEgoKDhIKDg4SCgYKBgYGDg4SDhJGSkI6PjouHhIaGhIKBgYGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoOBfXx9f4B/fn5+fXx9fnx6gpqfnJiNiouDhISGhYWDg4WEhISEhISFhIKCgoGEhIGCg4OFhoWEgoKBgoKDg4WEhISFhISGhIOEhYOCg4GCg4OEhYSHkpGPjZCMiYaEhYSFgoGBgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAgIF/f4GEhIODg4KCgH19f4CAgX99fn59fH19e3p5h6CemoyHiICCgYKCgX9+gYGBgoGDgYKBgoKCgYOEgH+AgIGCgoCAgIGAgYKBg4GBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgIGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5+fn1/goSDgoODg4F+fX5/gICBgH59fX19fn18ent6j5uXlpKJfoB/f4CAfn2Af3+AgIF/gICBf3+AgYF+fX1/gIF/f35/gIB/gICAgH+AgoCAgoGAg4GBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GBg4SBgoKDgoOEhYCAf3x9fX59fX5/gH99f359foCDg4KCgoGBf319fn+AgIB/fn19fXx7e3t6enp7jpeVl4Z+fn9+fn9+f4B/fn9/gH+AgH9+fn5/f359fH5/gH9+fn9/gH9/f39/f3+Af3+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhISCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/fn1+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp6enl/kJCPkZF/f35/f3+AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f3+Af35+f3+AgH5+gH9/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enp6enmCjYmPloeBgICBgH+Bf4CAgIGBgoKAfoB+f35+f36BgIGAf39/f4CAgH9/f4GAfn9/gH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaFhIKBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WCgYODg4WEhISEhIODg4SCgYKCgoB/fn19fX5+gH19fX19fX19fXx6enl5eXuIiYeHiIOBgoOBgIKAgoGBg4ODg4GBgYCBgH+AgYOBhIKAgIGAgYGBgIGAgoF/gYCBf4CAf4CAgH5/f358fImUkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgIGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYSEhYSFhoaGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eXyCgoSFg4KEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoGCgoCAgYCBf4CBgH9+jpOMh4iHiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGBgYGAf4B/f4CAgYB/gIGAf359fX1+fn9+gIOEh4eEhoaGhYaGh4eGh4eIh4eHhn99gICAgoF+fX19fX19fX19fX19fHx+fn58e3l4eHl5en6Bgn+Ci4SDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDg4SDgoODgoKCgoODgoKRkIuIiYeJh4aGhIaFhISEg4GCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gICAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHh4eHiIaHh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXl6fH+AfYaTg4ODhISUk4CAgX9/f35+hIuAf4GAhIaQiYWEgoKBhYWLg4GChYWGhoSEhYWDhISDg4SDhIWEiJKPjImIiImHh4eFhoWEhISCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eXp6ent9gIKBgoGDgoB+fX9/e4iRfHyOln99f3+ChoqFg4OEg4KDjYl/fX+DhIWFg4SGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYOEg4GCgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp5ent8eXl9fn+Af4F/fXt8f359gpWRf4SIfXx+f4KEfHyBgoSDf3+Hg32CgYCCgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4SFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH9+ioJ7ent6eHp7e3x9e35+f39+fn5+fXyAgYB+ho+Bfn2Cfn9+gIJ8fIB/goCBgH58e4qCfYB/foGAgIGCgYKAgICBgH+LlJCMjI6OjYiIh4WFhYSDgoKCgoODgoKDg4KBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYWGhoSEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fXx5ent7eHh5e3t6fIKAgX+AgX1/f4B/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSSjYyNjo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoCBgICAf36Afn9/f35/gX58e3x8fHx8fHx8fHx9fXx7fXx8fHt8fHx6enl7fHt9hYODgIGBfoB/f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fXx+f4CBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6NjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+ChIaGhX9/hYF+f4CAf4B+fn9+f4CAf3+Af399fXx8fX59fH19fX19fXx9fH18e318fHp7enx9fX+GhYOAgIB9fn1+f36LhIGHfn18fH5+goJ/fX19fYF8e318foGEg4GAfn5+fn18fn+AfX6Afn9+hJKNjYyPjYuKhoSFhISEg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fX1+foGBgoOAen5+fH5+gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fX17fHx8e3t6fX6AgIODgn9+f3x8fH18fYGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgX+Afn+CgoJ/f4KCf4CLkI2NjI2LioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f3+Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn1+fX19e3t9fXx6fHx9gYKBgICAfX19fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISCgYKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9e3+BgH9+f36Af39+f39+f4B/f39/f39/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+f358fH18fH18fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJiomKiYWIkY+NiYqHhYWDgoKDg4SDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn1/gH9/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDg319fXx9fH19fX19fnx9fH18fX1+fX59fX19fHt7e3x7fHx7ent7enp6e35+g4WIh4iKi4uKiYyRkI6KiYaFhIKCgoKDg4ODgYGBgYGBgYGBgYGCgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fX19fX18fH19fX18fX19fn19fn58e3t7fHx9fHt6e3t5enl4eXt+f4ODhIeJioiJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgYCAgYOCgH+Bf31+gH58f3+Jgn9+gpGEhIOBf359fI2HfX1+fX18f358fX18fX1+fn1+f3x9fHt8fX58fHt8fXp6eXl5eXp7fn6AgYOHhIiPjouLh4WEhIOCgYKCgoKBgYGBgoKCgYKCgYKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKGhYSCgYGCgYOBgICChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Afn19fHx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiY6LjIiFhYWEg4KCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICBg4F/gIGEgX5+gH99foB+fX5+gIB/gX5/gH9/f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHx8fXt7e3x7fHx9fXyKiomJhoaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKDg4SDhYaDgoF/f4CCgH+AgIOAfn6Af31/gH19fn6AgH+Cf4GAgICAgYB9f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e31+fH18fHx7fHt8foqHh4WGiIWEhYSCgoKBg4GAgIKCg4KCgoODg4OCgoGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoKCg4WDhIOCg4SEhIOFhIGBgIB+gIJ/fn9+gX9+fn+AfX6AfX19foB/f4GAgYCAgICBgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAiIOEhIWEhISEg4GCgYGCgYCAgoKDgYKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4GDg4ODhYSFg4ODhIODhIWDgYCAgH+AgX59fX5/fn5+foB9fX98fX1+gX+AgICCgICBgIOCgH+AfoCBf4CBgIB/fn59fn59f35+hYWBgYF/gIOBf36BgH9+f36Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoKAfoCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX+Af3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CAg4KBgH9+gIB/gIGAgYB/f39/f39/f4CBgoKCgX+Ag4J/f4OCf3+Af4F/gH98e3t6fHt8goB/gn9/gYCCgoGBf39/goB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fnt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhYSEgoSDgYOBgICBf3+Af4B8fX1+gH1+f39/fn1/fH5+foF/gYB/fn+Af4CDg4OBf3+BgYCCgYGBgICBgICAgICBgICCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fH2Afn+AfX9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhYKEhIWEhIOBg4KBg4F/gIF+foB+gH19fX6Afn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgYOCgYF/gIOAfoKDhICAgoGCgoSCfnt7fHx8fX59fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2d3ZzdIaEhIWFgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn99fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgICAgICCgoGAgH6Agn9/gYKDgYGDgoODhYN/fX19fHt8fHl6e3p+eXt5eH9+e3x8fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgYKBgIGBfYCAfoB9fn1+f4CAgH9/f398f4B/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+Af4B/f4GCgYB/foCBfn+AgoKAgYOChIWGhIB+fnx8fHx6eXZ5eXp5dnl2fnx7e3t+fXx/fYB+fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4GBg4J/gX9+f35/gH19fX1+gICAf39/f3yAf3+BgIGAgH98gH9+fn6Af31+foGBgoJ+f359fn5+fn9/gH99gICAfn59f4F+foCCgX+Cg4KDhIeEgIB+fH18fHt8dXh5eHh4eXd7fHt7e3+FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAfIB+gIB/gYCAf32Afn5+f39+fX1+gIGBgH5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGAgICAfX5+f4B9fH58f4CBgICAgIB8f3+Afn+BgH9/foF/fn9/fn19fH+AgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t7fHl3e3l3eHd3eHt7ent8hYl9e3p3enx9fXx8fX19f358fX5+fX19fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYKBgYKAgoCAgIB+f35/f318fn6AgYKBgICBgX1+gH9+f4F/gH9/gYB/f399fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgYGBgoGCgYGBgH+Af39/fX1/foCAgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2EfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZKNenx9fHt9eXt6enh6gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fX17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgYCBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgYCAgH9/f31+fnyBhol8fH57e355ent6e49/d3d5fHx7fXx7fHx8fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXhzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoGAgoGCgoKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKBgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3p4eHl8fHx9e3x8fXx9fHx9fX59fX1+fn9/gH99e3x8fHx8e3p5e3t5eXNydW52cnB4cXZ2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKAf4CAgIB/gn9+gIGAgn+AgICAf4B/gICAf359gH9/f3+Af4B/gIB/gIGBgICAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXx8fXh4dXh4eXt8fH17e3x8fH1+f39/f359fX6Af3+BgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYKCg4CAgoGEg4OEgYGDgYKCgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgIGCgH+AgYB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf4CAf4CHfn58e318e31/eHd2eXl6e3x8fHx7fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enJ2eYWFgoOCg4OCgoSEgICDgIaDg4SBgoSAhIOCgoCAgoKEgYGCgYSCf4CAf4GDgoGAgYGAgYCBgYGBgYOAf4GDgn9+f4KBgIB/foGAgX+AgIGAgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/f4R9fX18f316fX97eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfH9+fn59eXl7enp6eXNydG93cXd5c3d7hYOCg4KDhIKDhIOAgYODhoODg4KChIGEg4GDgICCgYOBgoKBgoF+gICAgoGCgYGCgoCBgICAgoKBhIB+gYOCf36Ag4KAgX+AgoOCgIGCgYOCg4GBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3x7d3x5eXl7en1+fXx9fHx9fn5/gYGAgICBgYGDhIB9gH9/f39+e3t7ent6dHF4cXl0dnh0dnuEgoOCg4OEgoSDg4GCgoSFhIKDgoOEgYSDgYOAgYOCgoKCgoGCgH+BgICCgYKBgoKCgYCBgYGCgoKDgH6Bg4F/f4GEhIGDf4KCgYOBgoKBg4ODhICCg4KDgoKBgoKDgYOEg4SDhIWEhYOEgoGDgoGDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX+AgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgYKDhYWFg4OCg4SChIWCgoGCg4OBgoGCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoKAf4GCgoCAgoSDg4KBgoKBg4KCg4OEg4OEgIKDgoODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKAgYB7fYF+fHl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgYCAgICBgYCAf319fHx9e3Zydnh4dnR/dnV9h4eDgoSFg4OEhYSBgoSGhISDgoOEhIGDhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKAgoKDg4KCgYCAgYOCgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn+DgYKEhIKEg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16enx9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX5+f359fHx4dn92d3+Eh4OCg4aDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOCgoGBg4J/goOEg4OChH+ChIODg4OEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fn1+gYGAfn59fn1+fn5+fn9/gHx9gIGCgoODhYOEg4aEgYKIhoWEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBgoOEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDg4KDg4KBhIOBg4OEhIOEhIWEhISFhYWFhIODg39+gYOAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB/fXx+gn9/fn5+fn19f39/f4GAgH+AhISDg4OFg4SDhX9+goqLhYWEg4KEhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4SDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKEhYqJhISEhIWFgoeGhoSEhISFhIWEhIOEhIGCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOCfYR+fnJ1g4KBdn6DhYB9gXWBeoR/f39/hISCg4KCgYOEg4SEhYOEhYaEhYZ9hHp9fn+De4WDgYSDgX99fn9+foKDgX17f31+gH59fHx8fX19fXx9fX6Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISGhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SFhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgIJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygoR+g4N9gX1+f35/goOCfH+BfX+AfX18fHx8fX18fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgoKEhoaDhYSGiIaGhYKGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhIZ9cHuBcHl2foN/gm55cHVzfHZ5eYZzhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdtenNugId5bX1yc3Zzdm1ud2xweWx1fX9+fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYGAgYCAgIGAgICCg4KCg4WHhoaAgoWDg4WHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB1gnKDfm96eXltb256b29sd314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fn2AfoCAfn6AgIGAfn5/fn6Bf4CAfn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhISDhYeGhIWFhYaGiISEhoeIiIaHhIaGi4mFhIaHh4WEhYSFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39/en59fX99f39+fYCBg4OAgoOBgYSCgH+BgoB9f3+Bfn9+fX6BgH5+gYKAgIKEh4aDg4aEhYSFh4aFhYWFh4aIhYWGhYeHhYaEhoaJiIWEiYqIhYSGhYaFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3B5fX1tfnVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX17fXt8fX1/f319f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFhoaGhYSFhYWFhYaJioeFhYaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhoaFhoSGhIOEhIaEg4GEg4SDhYOFhIWEhoOFhoWFhISFh4aEhIWGhYV9d4WEhISDgoF+f357fHt+fHx9fn9/fX1/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWHhYWFg4SFhoWEhoaGhoWFhoSFhoaGhoSHhoeHhoWHiIiIiIaFh4WGhoiGhYiHiIWHhoaIhYWGhoWGhoWDgoWFhoWFg4SEhISGhIaGhIWFg4aGhYWFhIaGhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9fn58fH59gH59f4B+foB/fX18gH1+f35+fn58fX1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYaGhYODhYaGhISDhISDhIaEhoaFhYWDhoaFhoWEhoeFhISFhYOEiIaEg4OEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn59fXx/fH5+fH2Bf3x8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFhoiFhoeFh4aHhoeFiIiHh4WGhoeFhoaFgoSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGh4WEg4SEg4SHg4SBgoSFg4GAgIB7e35+fHx8fn18fHx9fnx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaFhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4SGhoWHh4eFh4aIiIeHhYeHh4aGh4SChIOEhoWHhYSEhISEhYaGhoaFhYeFhYeFhoWGhYSDhIODhIeBg4CCg4SCgoJ/gHt9fn58fHx+fXx8fXx9e3x8fHx8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoeGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiGhYeHhoaHh4WHhoiIh4aFh4eIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH57e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhYSFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFg4aGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYKCgYOFgoN+gYKBf4SCf39+f35+fHx9f317fX18fnp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8fImHhIaEhoSGhoWEhYWFhISDhIKAg4GGgoGCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiYaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYWEg4WFhoaHhoeFhoaGhYaGhIOEhYKBgoGAhIODgn2BgX9+g4F+f3+AfH98fX1+fXt+fXx9enp6eXt9fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYSDg4GDgYCCgYWCgIB/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeGhoiIhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4WFhoaFhYaCg4OFgYCBgICEgIOAfIGAfn6CgH2Af4F9gHx9fn1+e359fHx5enp5en19eXp7e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaFhYWEhYWEhIKCgIKBgICAg4F+fn6AeXp9gIOEhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYWFg4aEhYeDg4aEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoSFhYKCg4R/foCAgIGAg4B8gX99foJ+foB+gH9/fX1+fX97f317enl6enl6fH15ent7e3p8e3t7e3x9fX18f359fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhIWGhoeHh4WFiIaJh4WEhISChYOEhoKDhoSEhoSHhoaFhYWDg4WEhYaFhoSEhISFg4WEgICCg39+f39/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6enp7e3x6e3t7fH1+fX2AfX18fH2Af318hoOGhoWGhoOEg4aChYGBgH9/gIB+f4GBfH5/f35/gIKCgoSEg4KBgoSBgIOCgYCEhYSCgX+AgoOChIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhIWGhIaGhoaGhYOEhIOEhYWFg4SDg4SChISAf4KCf31+fn5+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5enp5enp7eXp6ent7fHp8fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4J8fX9+fn9/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGChoWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFhIODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYF+gn9+f4J8f359fXx8fHt7enp6enl7eXt6eXp6ent8eXt9e3t+f3+BgH1/fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH5+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgIGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fH59fH6DfXt+fH2Af4CDfX2AgX9+f318fH19e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMzMzLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PkJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PD45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT0zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWy8vLzMvLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU1NTT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw7OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OR6jZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1svLzMzLy8vLy8vLy8vLy8vKysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19jX19fa29ra2tra2trb3Nvb29nX19fX19fX19fX19fW19rb2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtAPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTUaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0jYuLi4uLi4uLi4qKioifu7m5ubm5ubi4uLi4ubCLi4uKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5FybGlOU2JMTFZNPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS1BGntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7s6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFhSU1NTU1NTU1NTU1NPd6ikpKOjo6Ojo6Ojo6WVU1NTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYd2xpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUJAOTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0NLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpp5cVldXV1dXV1dXV1dXU3qppaWlpKSkpKSkpKSml1dXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDs+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzc/R0dLS0tLS0tHS0dHR3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaqiZmFiYmJiYmJiYmJiYl6Crampqampqampqampq55jYWJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk6Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Nzs7Ozs7Ozs7Ozs3Nzc7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs/Ozs7OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzLy8vLzdLS0tLS0tLS0tLS0tLRzczNzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo7ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7OztLTz8/O0NPQztLU1dTQz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX19fX19fX19bW1tbW1tXW1tbW1tbW1tbW1tfX1tjY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvVkpfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rOzc3N0LmDhIvH08Cay8/Ozs7OztKrnM/P0rmPvtScgoSKxs/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT08PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK2nKWj1MCUsJyxlri5r6HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/OnZyRncWkoIuRw5N9fq+w0c7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4+PDw5Nj9CP0I6NjQ4Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Rv5igm7OnnYedutTSzZ6ew9DPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9COjc0Ojo6OTs7ODs9Pz0+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/P07SZlqq5l5yQn6DS08CgoNDPz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PDk2NDo5ODo6OTc7P0A8PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz9Srmn6jkoqsr5GhudevoqnU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD45PDk3NjU5OjY6PDs3PD9APDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDUrJuni5iKoZqtm6nYo6G61NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDR0RBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q07aysqWbm5qmxZii0Z6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkmxdXG9naGJdT0Y/SEhGRUA8PD4+PD09PDc1Njo5Njo7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXEopmWnK+enJubrcefodLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTo6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6DH1aKrpJrPpquknsW0pKbW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtLQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09PIko201syTkKfXuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVaWpbTF9NSkxKVUxGQjw8P0ZFR0tJPTY2Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oz05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR1MjB1dHUyr3V0tHC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRExMQT43NzU6ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dHT1NLS0tPV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj09Nzg2OTc3ODk5Ozs9P0A8PDg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxBQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ4ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+PEhGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0RFQ0FMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhRQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29ra2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ojg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Firzd29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc2ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tvc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg2NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv72+v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7Oz4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PD0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBGPjg7NzI3OTY3NDUzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO1tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7e3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi3t7e4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6uvsKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo6Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmpqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3uLe2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmpqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpaWlpaaoqKioqKWnqKinqKinqKipqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7a3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo5Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OztAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelpKSioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpaenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0E/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6SlpqakpKOioqOioaCfn56enJycnJ2dnZydnp+goqGio6OjoaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5iXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAP0JCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqSkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc1Nzg7PTg6Ojk5Oz07Ozg5PjY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKunpqCdnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5KUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqanp6afm5qboqCalpeVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6Wmpqako6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODk6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/PkFBPkFBPzo5PT46UJ2gn5ybnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+mpp/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWjoqWmpqWmp6amoJuZm6Ggl5KTkpeanJqWl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6SmpqWlpqempqKdnJ+hn5eRkZCUl5udmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoKCfoJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaSmp6alpaWmpaWjoKChoaCZkpCPlpuZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaCgn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU5ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKjoqOkpKampaSko6KhoZ6cm5WSlJicmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODY4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+foKChoqOjpKSkpKKhoZ6bmpmXobWemZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpmXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6ChoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKCgoKKkoaKioqGgnpybm5uZn6ubnJqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY6NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaCls6ygoJ+fnpyZmZqam65qdp2dnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuam5uam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goaCfppKbq5+goJ6bmpmamaiERICfn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmpiZmZiXl5eVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnqCeYpymnp6cmpqbnKGjUUiEoJ2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZuapmZdo6CbmpmbnZyudUlMhqGcnZ2cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxRPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmKSAUniimZmanZugpF9WToehnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGgoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFxcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJuYmJmgiFtflJqZm5yco49kWk2Bop6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbW0xGPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiZn5ddXXaXmpydnaKBZFlNf6Ken56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubmpydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZmaYGFggJadnJ6YdGNVT4Gin5+fnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozg3OTo7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmZn2leW2V/nJyejGpfUVOGnpuenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0JAQUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qal5NzaGFUdpOXnIdcV1BXipKOkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaOimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkY6Smp6SfaCjlqScbk1QY4aGgo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg4CEoJ2OfmqUpZWdfYiAX3J/gIKSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2OTM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5/gKKLe21RdZyMjFpxfXx+fXyGjo2Lho2UkYuQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhYCCfZiad1dOS3KThoNNX29xd4iFio6LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYB+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYt/iI2Mi4uHkY2jjVQvLz14h3d2QURda22EkImJkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmQnqGdk5eboZqdm6KmnGdCW0g7eHlrZ0UxOFpsc5CPi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6mpr49KcqJ5QXx4ZGJRVF5JYG6KoaGknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipqmnqKN4YMHWpUN8joN1T26OdlNkf6Oop6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkp6eZnaSlo6KdYn+9wK55oaSalWVMX3htUXSVoqKgoZ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmVkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioaKnoaaupqadnmqEnLqOqdGimrOoWEytk1Nlj6CeoKCenaCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGoqq2xsq+roqKFd359cs7Gr5mmr2tVqrBjW4eln6WioZ6gopiVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFVcaGRvY21paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKehnpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqevt7e0tbazra6sjoaDbpHMvJSUpZZ0VG96c3B9lqaqp6Sgn6ObnaGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7K3u7u7ubnBuLS1n4d5ZFiftbump5mId2txb3h5e36FjpKYnaOlpqulpJihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odmtxaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW3wcbMz87Myb6zpI9yZlJEi5WFhYV9eHFuZ2ZsaWxycnFycnV9janExLuip6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FpYWZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PFx9vj49rLvK6jlYh0WVpRRGl3am50bmtlZVlXXVhcY2pqaWZhaYu2wcC5qa+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3b21bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxr7N0tXKuaack4VyXlFUS0RbZV5jamVhYGhZVFhTV1laXVlbdZq3vKy0sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Ef2pmaGFrbGdudnJydnJnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/wsHHy8i2k3RjVVBPVEg+XmxfX2ViYF1kYVNVV1ZVVVhznK2xqqiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3VrbG5kb21pcXhveWppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO5uMObYUlER0tEPVtlYWJpY2BbY19XUk9QUFeBtLqsrqWko6ikoKClmam0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnZSTiYl+hoiMlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent3bmtpaHZaZ3N4c3pnZ15kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTExMLEwa2DT0ZNRTtNWl1lbGVfW2BZWVNOVYCjq7m1sqypo6GtqaynrZ+stLS/w765uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl2dmVmampoXmtwbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMfCxpZqWEc/P0ZdYmFqYFpYV1RWd5q3v7u8urysraapu7q5t7+ztbiywca6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rraussZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWh2aGpqdW55bF5kW1ZgWUxIRDY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnOxcbGvalyUEswWFNWZWFTTlBxqcjIwsTHwLy+tLCwsMK+vsHGwL63tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2tr7WkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOi5R9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ9eHBnYGtqd21pZnZvdGNdY1VXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwsPCwbyRP093gIpWTG+ly9TFtr+/wL+6u721s7PAv7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5gHNwZmVnZGxlYmtub29fWV1XVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvbzFp3drgpCXb6vIyMfRwa+9vbi5u7u+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFlYmFjZGRqY2dkW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Aur/AvLvFvbrAxL+9vq9zZH2RiorRxb+/yb+wwb+6t7u+ubW4tLi8tL24tbSws7yxt7e4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhY2Noa2dnamZqXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdWNuL+7w7W6x7a1uLq8uLm2qqSYjX6Eyb+/u8G+uca9wr+8xbi2t7S4tra7u7i2tLe6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVncGplbGhZWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vM/Ed6jMvce3ubettrS3ubO1sb3JxJRJe8q+v769vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfWtucWdxa3RmY25gXFVIS0tESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTWrnSAu8jPwsC4rrS0u723ubG9w8qNQ3XNw8K/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXJmbGpvdW95ZGhjXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsbJ0plxcqvR0czKxLW6v8TIvr60v8DBeFJuy8bCvsG8v8PMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0cG1tdGxtb2BjX2JiTklNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQw7q+vMS+t7zAv8nPx8jKysKGcnOjzMzLzcrGwsPLzsG8uL26sW9jYrvIxMDAv8TAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIe21teHxgcWRcX2BfVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u7q9vDvra+wL6+uqacqbK2w7+leXV4mcTHy8jBw8DAycrBv7u5saB8cmytyMXEv8DBv8vHw8DIwLrCu7mzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXpuc3h0aHBeXF9dWlJGRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vEuG2tzr22ucC8rH1uaG5tcoGVmHN3fJe9v8bAucC8vsXEvb24sbCYkH2Am8rCw7y9v7/Dw7+/x7y8wLSzrrS0vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bXV7cW9qXGBhWlRRQUZJR0tARUNJPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5udm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbN2gbO9trXCpYdpWl5gTVJbWm5zd4CfuLjCurO7t7u9v7q7u66km5iHkH7AxMO+vL+7u7i2wcK1v7q0ra6sr73Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra8tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z2eG5yYV9nXVtVSj0/P0dHPUdDQzk6NTs5OT48PDk6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmohHiKoK+1nWplZ1ZZYElJTVBTbHeGpbC3vrmytbK7uby2ub60lpyllaFxrsnEwL2/ubOusry6rru0s6Wqpqy6vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybWBkYlxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/Fqoh8dYygmWBUQ1hVR2FqVk9FSmCNoKyvtrq1tLKsvLm4tbjBvYuYsKGlcqXLwr+5urWupayzsaaysKidoJ6krba0wba1s6WnqqiwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8cHZzb2ReaFldXlNPTkI/SkNBS0pANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJqRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7WRgniIj29OSj9kWUJOd4CUak5BXYGwtbO1srSvrLu6uLa5v8V1g6qemWOpv7i1srGtrZ+kp6airqaclZiXmZ6orbirqqqepKikq66vp7Crr7GxrbGurq+5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2dG12amxdXGtVXlxQTkhER01CR05HODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhHtYRkFOh1lKSlh3jYFjQVOjubO0srCxrbC5uLa7t7q8j6Gyq6NyrLCpq62ro6ignZ2lmoWflJCUlo6Wnaeto6Kjn6GmoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeWl1dG9lVWJkWF1ST01JQElSRE5DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yvKmZmZVpTkBSeHFQSUlLZ5yBWUVSrruxrLOvrqyttraytLWuqKafmpudnqaonqCoqZ+hp5afkVWBnpGMjpSLlZmip5+foaKhpaWco6OgnqWgpKylpqiloqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CXlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqaSpq6aprKumoYh4g3x2f3pjeG1uXVFpVVBPR1BNTUNQUkE/Oz40Ojo1Ozo9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2qpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3Cq6W+aUVSnYJRV0lKYEpUjmBjYoCutaqytK6qq6+wsrOtpZ2Rl5OPl6CfoaCco6SfnqiUo1VWh5WPi4yUkJaaoKeen5+go6WonJ+goZyhn6Oop5ynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJaTj4+SkZmQlpWYl5+YnJmbpJmXlJWanaCdp6iloKOioaOfnaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fIB1dn1ubHtkaVZTZE5KSEdPU05LTkg8RUA9MkA4NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutra6ubq3t7uuqKChqaCqxr/LoVBBcp53T25LS2NmdXNgWl5wkLGvrrO1qqasrKObmZSNkZWXmJicn6KinJ2knpqkmpM6ZISNjIuOl5SZnqKpnaGgnKanq6KfoKefnZ+jpqieo6afqp2qraqup6iwpaOkpqespqKlopuZnq+orrKrpquqoJuYmJiVk5aak5WWmpabl5iYoZ6cnJaboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJfIB+d3l8ZXl5YWJTVmFJSUtMU1VKU1FNOT9BNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpMfHjldTSWWjW2V+b3JdUWtjW2RfXWuPtLCwuKymoZydmpSXmpmQjpGVkYyOjZOZopyXoqOAPWSAgXt5f5SYnaOjp56mq5+nrq6qpqKxo5qjpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKehoKOxrrKxtKqyrqOZnJ2eoZibm5qYmZuVlpuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2mCbWVcU1taTVJLT09WTVRNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp6rpI16VWlydnVwY3Z2WFdjYGNnWVhXZq2urK+nn56ioJaQk5ugnJmXkpOfnKGjmp6blp6gg2pjZnB6eHV+jJumqaultbKfrbS3trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7W4s7itsrSkoJ2loKyhoaKhoJqZlpafm5uYpaGgnqOhoJ+bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dmp3dV5tW1JhSVJWSEZWV0tDTUg9S0k4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqK6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuioaCkgG6CcGBjWExbU1pNTFBYUkhNTUiYrKqppaCfmpKRlJiYlpaWjIiLjpSdnJ2cnpadnrarf2d/hn11eXuBnbSus8GYqbe4vb+6rbW0sLewrrSppqSlrKm5s7W7w7zDwbe7tquusbm3vK+zsLXBvLe+s7O1oqyiqamyqauop6iamZ6aqqegmaegn5+oqKWln52qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhX52cm1pd21oblxYXENXTkpHTUhDRk49Pkw+NDw6Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqamUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOfnYpiV15lYFdNUUc+Pj9DQz8+QlF4qa2pqqagnp+io52fnpudm5STlZSenpiUhZ2ZoLzVuZWFiIyFenFwbICpu8SckLnDvr/Cv7a6u8DDub27rK6nsa2xwra4wsbAyMrAyr+wubm9uMK+uLS7xsS9w7y4tKqzraqztK+zrqqvo56sqLeyraOwpqGjsLGusKSlr6OhoJqhpqGkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF8dHJrbHVycWhXXFFGVUhESlBJP0VCNEZIOTY8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfn5V9YF5lYFFHRDxDPkU8Pzk2Tn6qs6eko6KgnqWspp+YnZWSmp6ZlYyKhoiGeG2Hn7Pb1LyrnImGi4JyaF1dkM62c63HxcXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxszMzNLHvr/Aw77Hx8K4xMrJxMHHv7q0uru1u7ewtrKru7KvvLfAu7qruK2rqri7tbyurrijpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5WUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrZGlveGtlWlxGTE1FRFRNRUJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEA/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p+c2phV05FPklZfG9iQj1cjq6soJmbnJ6emZeXmJONj5eXlI+NkIyCg4J2cnBtcJG7w8fEwLeWg4KEhHJgV4W5gIDQzMzMx8rFxczQ0tXO08m9wL/Du8bFyMXR083T0NPTzMrBxsfGysjPwMnRzcfGyMbCvcTBv7+/tb6zrb/Aw8PHxcjEr7+5sri9xMLBu7y8ta6np66ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXVzZWJncm9nXlpaRE9NQ0ZRSURDQTU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjk7QUE7Oz43ODY6Oz5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOem52Wa2ZdVElEQD9Lhp6lmoSgsq2jnpyfmpiXlJOUl5GQkI2IhISJh4OAgYGAeXFyb2x7iGeOrba1oY59enpraGVxhF+61NHRzc3O0MTN1NXY0dfNxsfJzMPFys/K0tfS19LV1tPUyMzHzM3K083O083GycrKwsfMx8nJxr/Ds7PIxcvLy8/Hyr++v73Bx8XMzMnJwMPArrCzqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuWkIyGkYuAe3J1dmdjZ3ZqZVZYUkROR0BJUUM+Qj06MjJBPEU8Nzg8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hnGNTTEpEQz9DUq7RvbKvppycnKCkoZ2alJSVlIp9eXFsZWJocnBye4WKgHVwbXFxcHlRWXyYpKOWfm9qY2ZqZl2T2NHS09TSz9HD0NPW2NXV0svJztDLxs3SytLV19nW2NPW2M3Sys/RzM/RzdPQwMnIy8TMzczPz8bHyLbAy8DSzczQx8rJwMTDyM/N0NHPzcrIzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYWVyY11SXEpLR0FGSUo/O0E4PjU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpaWgoqJbSUBBREFGUXayr6aalJefnJqgoJ6bnZqViXdpZGFfX19fXl9fXWFsdXNwcG5scW91gGNad5KbmYVpYV9jaWN5zNTNz9XU1NHRzNDN09fW09XQz9LT0cnT0cjQ19fY0tjS19nV1szPz8nN0szO0cDHxMnHz87R0dLIzM3Ay83G1M/Mz8nFy8fHyczL1NTR1c/SzNPCucWxpai1rqibqKulnbKosLOsrJOPk46Iio6Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUWBKSkNFQ1NOPzw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD9APUZBRD2CpJygpZ6lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu319TV2dnRztC/vMzJtr6up6qooaOsZ0M4PT5EWIKqqJ+XlZeZmpyfnZibnZN9cWVjYl9fYV9eYWBeYWBfYGVtcHBta25xcnZ8YF2AlJiKZ1lZXm11l8fUzsvSzdXU0crPzNPW0tHWzc/V1dHF0dPK0NTV1s7T0djY2NfLyM7Eys/NyszAycHJys7P0MzQzs7Mz9DIzNDRy87Lw8rIys3LzNLTztTS0dDQyr3IubCuu7m1q7awrai4rbO/u7GajqCUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Bva2FkbnBhWFxbSUZGRE1ZRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD85ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+ZpaegoKOnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksnxIRkI7Vo2hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYF5fX15cYm1xbm5xcXJxd3dbZ4ePimJVWWqCkZ2zzc7EzcrS0s7GzszN1MvO0s3L19bQzNHUy8zQ0dPKztHV0tXWysDKwsbNw8jKw83ExsnLy8/Lzs3RztTMx8nQzcnHy8bHwsbKzM7R0cfQz87OzNDFx8G4ub3Dwr3DubKyvrC7w8S1qpiloZiWkZWVkouUjZqRlJSPj5WCiYZ5cXJrbWhgYHFoWVhoVk1HTElRUUI7RD87Njg6ODo6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMrV1tna29jMzM/I1tXEwrWvtKigrZd4bG9wd4+ajYyXlZCTkZGVlpWQi3xlYmJiYF1eYWNiYF9fYGFhYF9dW11ncXFwcXFtaW14aFV4g3xbVGl/kpufrsXGv8HEzs7HxcfNytHHys3NxtHSz83M1MrHys7Px8fP0svQz8W6xL/Gyr3Dx8nOxcPIwMfOyMTNy83QycXF0MnGwsbJxb/ByM3MzM/DyszJx8zQxcXIu8fDycnCz8G9vL+wwcnHub2qsbKnpZ2inJiQm5CjmZeZkZWYiY+CeG91ZGtgXmZxYVtXYEdJSEdJTVVHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7utpLZ+Z4KFoqqTjY2Wj4WDg4OBfYSEfnNfW15dXmBeYGNkY19dXF5fYGBfW1pcYWtycG1taGdpa3FfZW9qWFx3gpGXl6K3urq4u8jFwcPAw8jJyMjJx8HFy8XHys3JxMHKycHBy8/Ey8i/ucG8xsi+wMbPy8TAw7vKx8i7ycbFysG+wsvGxcS+xr69wcTGzMbFvL/Kw8XH0sXBycDKysbIxtDDw8bDrsTLx8PKt7+8urOprKSlmJ+YrKOhppujoJuVfHdzdWZqW2FubVpcWFJETEdDR0RMREZTPzU0MzM1QD0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL64vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srC2bV56fJ6RipKWhnqAhIV/dXh1cnBfWltdYGBiY2RkZWRgW1xeXV5dX1tZWlxibnFuaWZna2ludlxaWlxgc36GhoKSrq+xr67Aubq7ubjAwcHDvb25vL+5xMnFxsK9xsC3u8PIv8HJu7a7u8XDv7zCzsPGvr61wb7Eu73HvMO6tb3GxMLDt8C2tr+/vM3Evba6yLu/vszEwsbDxsnHycbQxsLMyLLHycPOzMDFw7+8srewsqeoqLmwpa2wqq2slHp3eGtlaGBob2RWXllKRkpGSEtBRUJGSkE5OjY1ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1q7e0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1dfNys/FycXHwbrFvayup2BjdoGSi4iLhHh/hoZ/fYN7dHRjXFxdXmBgYmNiYmRlYl1cW1xeXF5dWltcXWdycGtkY2lqanVwSE9cWWhzb2lkk6WmqqijtbG1s7Kys7u1vLC2r7OvsrvCu8HEvL+6tLK6vsC4yLi0vLbAwr24vcfBw7u1r7O1u7+0xbi7tay5vb7AvbG7trC3urPGvbevvL+1t7XFvb7DxsDExsbHzMW/xsa7x8u/z8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpHQkRBRUY/PTo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TFy83IxcjNzNDLzcjJyMrJysTQzdLPzcXHwcXBv7q4ybersJpbZ2+IjoaIiXp4foWGdneBfHNoXV1dXV9gX2BkYV5jZWNfXlxbXlxdXlpbW1xfa29sZmNmaGdqeV9DUExcXFZSc6Ganqaimqepr6upq6izrbWvsaetpqyzu7q2w7m6ubCqtLm7s8K5r8Cxvby7tbvHucO3raqosLLAtri9sLGosrO1u7yrrranrrauvLKwqriwrruuu7i7wMG+usO/xsPFwLzGwcfKuMXHxb/Hw8O5xMbCu8bJzMuzucK9u7OJdHZ3a2lgYmxpWVdXW0FMTE1KRUFDP0ZBOjo6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcTPx83Bwsa/xMTDw8rCycq/wLzCurO1tcOuqrGTW2l+koiOj3t4fYmFeXuEgHduXl1cXF1fYF9fZGNiZGNiYF9dWltaWl1aWlpaXWNtbWZkZGRlZ2x4UT1FTFhfWpellp2fm5WXoaeroqahqqmrqq+ipZ6qrbW2sb24r7evqK24tLO8t7O8sLi5tbK8wbLArqWpo6uxs7OovaqrqKusrrW0pqmuoaWwqbOmp6iupqi3rLGzt7q7u7K8vr6+xL+1wcDHyLe+v8W3xcPAu7/Ewr7EyMzKv7/EwMCph3N0c2ppXGFvZFdWWFBIWlNTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDx7m5y8LLvrvJtr3DvrrKt8HDwrW2vLaxr7W8ramrk2RtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9dXVxaWFlbW1hXWVxfZWpkYmNhZGRobnNGRGSBcF2UmYecrpaSjJyepqGhn6SlpqWsn5ybpKWssrC2tqewq6eqtKuzubC1ta62ubOwurqxtqSgpKCmsaisqbmqpaenqKezraCnp5+cpaasn5+npKGhsa2trLK1s7Swtby2u8HAsru+w8GxubnCs8C9wLW4vL2+vMLHxMPEv8DEoIR5cWxiZmBrb2BVWV9ITmhPVEhGS0Y8PUA9Ojs8ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbq9tqCelZ2gprq2q7Ozu7PEz8nLwsW4t8fAzL+4yre7xbizxbizv8CstryyrKavtK2ho5JpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGBeXFtcXFhZWFhYVlhaXV5jYmBjY2NiZWVsa1l7eV9UXEReYpOkkYeYnZ6km52eoqSipp2aopueqq6ssbSjqKmpq6yktListq+ts7Wvs7WvsKqfnp+korKlpqq4raKmpp+orauZn6CfmZ2fpZqZo5ycnrCprKiqq6ytsLO5r7i5urC2vLu6q7OyubO9tLeysba1v7W9wL3Dwru7vZeEe3NsX2VeZGRYVFdeSVddS1BHSkpHQTw/P0E7PzwwNTYzNjo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67uMHBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uci4uL+3ssK0sbu7rLq6saKfqaunmJ6QbX6Fhn94cm1vbWtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFdXV1dXWFdaXWFiY2NiYmNkZW9mWVhIMiEiXFhfjpSJlp2epZyZm6OloaSbnqCamK2tra6xoKSiraunobWwsbGsqa+zqLqzp7ahop+co6Gto6Kqtqqio6aepqajlpmdl5manaCal52cnZytoayoo6Smrauzs6q1sLKrsrm0r6qvsrKzt7Ouqa2usriwura6vb+3s7GUhnp2Zl9mX1tZVlNaVUtbUUxKRUhLSUM9P0JCQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+ynaWjmKWxw7W2va20uMLMyMbAxbbBwMfOt8DDvbO5ubK/trG5u62yta+fmqOqoZSaj3h/g4R/eG9xdHFoZWRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVVdgYmNhYWJgYGRmcVE6MyEaK2iUj3iRjJGbmZ2alJ+fqKKdnqecmpmqpq6wqpuio7epoaCuqLWqpqeusaS4sKS3oKOcmZmqpqGarbmwo6GknKKgoJOVoZSWlpyZmJaXnJWfqZ6qpKKeo6qqsa2otKyqp62zsKWrrrOxr7Cvr6eoqLKusrSwvLS6uK6jlIJ6d2VfYVdZWFNSVEtNXkxQTEdITUxFPUA+PUI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0usKxvre9rZ2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGuvLu1u7y1ubmwsLGqnJqhqZWRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1ZVWmJiYGBhX19gYmlpPTMtMk5/jZOMk46PlpuYnJOdnaWkoqWmnpyepZ+qrqWfoaO2p6GhoqmzoqWopbCmsa6rtZ+hnZaVqaGilK2xsZ+jo56emJyTjKCUkZOYmJKXmJiXnqebp6KimqSlpaukpbCnpaOrrK2mqa6vr6uoqqqzpqarr7Sxrry2sa+vn5J7eHNlYlxbXVhOTFFIUmFNVlBPSk5PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sba9sLuxt6yepaasuLu8wcW6srm1xMnJwMLGxce2xsSzwb/Fq7e3vba9uru1sqytqJmZn6OLinSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVlJUUlRfX11eX1xdXWBha1g0P010hIqJjJKMjpGelZ2UmZ2joKuko6Oio6GbqaqjmZ2ksamhoJ2lqp6oop+trKqprq2ioqKVmKKanJCsqbCcn6Kfn5eZk4qdkY2SlJaQmJiTnKGjnKWhopWgoqSlm6OrpaKkqqSrraWusqmmpaamtaaqqK2ztbS5uq+qrJ6Mc3FwYVtXVlZSR1FPSFpcT1JKVEtTTEVHSkM4Ozs9PDk2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Gtnainr7m5s8DIurXAr8XIzLrByczItcm8sb7Dya2xuMG1vMC8tLWqrKaWmpyciYFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RVVlVUVVVSU05QWV1bW1xcXF1cX2NoQFJxh3uFhoWPioyMl5aemJiepaappqqmqKWimKSto5SYpK6poJyZm6CfrpmcqrOfpaafo6OhlJSblpaSqamtm5yfoaCblJCMmI2MkY2SjZaVkJ2hoKOdnKOVm6GjoZiiqKOiqKugq7Ckrrilo6SjrK2qqKuvtLeyvbWzq66YhXV0aVtZWVNVUkZYTFFbWE1VT1BMUVJJT0lCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njg6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7euqKivrpupqKy3tqy8yru2v6zMxsW4wM7Px7PEu7e7wsixrbi/t7y+u7O2pqmglpiZl4h6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOT1FYWVlZXFtaW11eZXF5dn9zgIWBiYSPi5KUnZuXnKinpKyqp6+jppieq5+UlKOopp2XkY+anq6WmKeqmJ+dlKWgnpKRkpGTlaiqpZqYmZ6elo6Mi5OGiY2Dj4uSlZGgnqGkmZaflZqhop6Um6Wlp6mooLCwprG9p5+jrLSqrqevtLC5tcCxrrCrkX5ydGNWVFVOUkpHVlBSUkxMWE5LTE9TR05LQUNGRUM+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7SsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqxt7i8vcDDsbCxt660tLuztKOjnZ2Yl5WEgHZrZ2xucW5xam9rZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlRRTU5NUldYWVhYV1pbW2BqdGxyaXuCfIZ/j4SPjpOXlZqlmJ2opaSqnaaXnqSakY6eopqXl4aFkpukj5WinJWWlYeimpuTjI6KkJqlp5uVlZeckZOIlI6LgYyNgJCLkpKSoZqgopaUmZiVoqaajZmkp6mnoaC0sqizuKGdo7asqq6ksrKmtbu0q6yxoop6c25eTlFRTU9ETk5OUEtGTk5KSk5OUUhNSkFITElIQz45NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2sKSnpKqloKmmpLOqorLEtbWys8bFt7rDyszGs626vbS4wK+uqbCepq67r62gmpuelZWIfIRuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU5NS0tTV1dWV1dXVlpdYWlkaGN2fHZ+d4l+iIWPjY+anYyXmqKgopiklaCalIyGmJqLc42Dfo6XloaSmpCTjo17mY+cjIKJgIqYoKOekJOYloWOgpR+fnSKjnqQiJOQkJ2bmpqSlpCdjqOjjomaoKGkpJuitK+ssK2fmKa4pqWwobGunLC7qqmvqZmEeHRkVk1SUFBNQ1NOTFBNQlBRSElOU05JSkpFS01HS0s9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNDg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY2Ojg3QTd4t6GjtKimpaijpaWmpqayp6a0wbivtLDJxLi5wM7GvrOsusGsrcStqKKmkp2mt62joJGWl5KQfnh/ZldWX2dmaWdobmNpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpHTlNTU1RUU1VZWl1oX2NgcXhxa0lTbYt9kYKImJOIkY6el5yVlZWTjZWJf5OJXztWb3yMlIqAjJKMj4aGcouEloF5gXuGlJ2Vg5aOkI+Dhn2TeHFwho19iYGQjpCXmpmTi5CKnYifmIeIlp6aoaCXp66prampnpats6KlrZmtrJins6OpraOTf3RuYFtOU1JXTERUSlBNTEZOT0lFTFFNS1BKSU5QR0pKPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebegoq2hpqaqoKapp6OqsKintMK5sLWwx8K4s73Pv7mvrrXCp6rEqqKdmIOUnLGjmpmHlJCLh35zdl1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU5RTUtIRkhOUVFMT1JUVVhZYGVeW211aUo9O3ySjYt5hJCJgoeKmYyVlImRhoSUhXiIf2BKUW54i5KEfoSMi4R/f21+f5N3dXZ4hI2acFGNiIqGfH55lHZnd4aIfoqIlYuOkZOXjISKiJSFm42ChZKblp6dlKSiqKmlpJ6bsKqhpKSRpqqWoamcoaaninduZl5cSFFRU01JVU1TSUxLT0lIRkpOTE1VS1FSUEdKRD03Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMTUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2m6KnnZ+hrqGnqKWnqK+sqrW8tri3s8G7tqe5yLi2qKi1tqqyvKeelY5/iZSplpWLf46Eg354cW9YTUtNTU5MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERDSU5PaFlOUVNTVVprdGRocWBfVU+Mg5CEcHqCfXmCipGAkZmLj3qFjn90f3hybnVwdI6OgXp+iquFentodnuOcHJteIGLjZJ4e4B7gHdzcpJ4aHWFhISFfJWKiIqNi4B/hIuNgJSEfIGPmJSclpGfnameoKGdoKmln52YjaekkqCflp6fpIFzaWJdXUpXUFJIS1hST0pNTFJKSkpMUEhMUU1SVU1GSUI8Nzg7OTk+PTo7PDk4QD86Oj48Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLi8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6qlrauwsaq9tLK7uLa6tLGft7qyqp2drKmosq+impGNlIGOnI6Rf3eGeHx2cG9qWUtISUhHRUhIUFRUVFdXU1VVVVVWV1hXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE5RUVNWXnF6cGtcboaRlYyMd2N1fXN1fIaOe4KYkn9who57dnpua36tfHSQi396hpKAfH90ZnV8hmxvaHN8io2HgG16cX1xbXaPcWhxgX6OcESLhYKDhX93d3qMhn2Me3V9jpKPmIuSm5ujlpmdm52eoZyWjYulm46dl46WmJB4b25nY1tYWFVRSlNVVE9QTlBWS05LT09LUk9JT1BMRkQ9Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKawrK6rqKmxr7GrvLiru764s6ynm7CnrJuPlpylqaWhmJqOhJJ5iY+Li3ZxfG11cWptalhLRkdFQUBDREhMTE1RUU9RU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFellKTk9RVFhdZG1pYn+fo758cHRfd3RreHWGjnh6ioRua4uReHN4aWp/gnGWkYyBfZV/SZKZbmd3foJtamRseYWQkoZrc2x8bnJ8hmltcH9zjYmFhnt+f3t3cHR0hoJ5gXlwfI6LipODlpaYmpCTlpaZl52WjIOJn5KLko2GkJeAcGpvb29ZVlhUUlJZT1JVVFJYVU1OSE1LTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuYm5+krK+iraqota+urLS/q7zDv6aimpWkmJ6NhIuUoaGYmZGTi3OOeoCGjIZ1b3RscW1la2tZTkRGQ0A8Pj5BRkZHS0tLTE9SUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JWWlFYWlqggV2VY210YXpsanx3iIZ0gIWEc2uYkHNye2lqnY5MeYWTiYSNZjF2h3JrfX2DdGZldX+EhIWAZmlsdWtwgHxocXF8bpONj3t0fn1xcW91bYN/d3l1anmIgoiJg5aSkpCLjZGUlI6XjYB5iJeIh4qGgJCIeGxrcGhlWFJbWFlZW05QVVZZWE5JSEVKSkhHQkBHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVtkoiakJmWpKitnrGep7qvq7KwwrG7w8ealo6VmYuOhXqEkJiVjZCMkIdxh4J0h4yGenBzcW9wZHBnX1RGSUM+PDs5Oj9AQURDRUdJS09RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVUtBSVFIYKqunGx1cmh5aW5/foJ/eIKEhHhxn5Nzd4BydJOHNXCdqJ2NoKGEooV2cIZ7hnx0jK6NiYFoZ2JqbnJtcIN1aW9YdXCOm5F2bX97fW5ybnCAe3N2bmJ1g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2OfHNycW1gXF1eXFpZYV9STltaWFdMSEpGSUg/Q0FCSD9DRD07Ojc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTAxMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpGBkoiVkZ2kp56vlaW0qa6wrsGyu8HFlo+MlI+AiHxugZCSiYOKh4+GdYKEbJWIiHx1eHhteG53ZGpeSVBHPT83NDQ5Ozo7PT5AQkVITExMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01RUkNIgG96d3ZxemlzhIV5e4KBfYp8dKCYeX2FgISZhJqcYYaqnpyLg5COeneIfomIjnSLl4+Ee11kcXR6fHeKbWhqYnlvhZCCem+BeHWFenB0enhrbmlddoZ9h3yHho5/ipKXg42FjIZ9cYR/hH12d3t8iXhxdHVnaGBbXF5TXGdeV1FUWFtVR0pKREtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTQyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIp/k4yRnJ2eppGgqqCxqK/AsrvEupaOkZOHeoZ2a3+LkYN9ioOOjHiDgHOghIp9fYF/cIF+emh3a1JYTEBFMjExMzc2Njg4Ojw+QUVGRkdKS01PUVJTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklLTU9RS0pUW1dRSWR9g3aEdXdueYuId3qGhH2UhXafmIeGjZGUpYysqUiGra+uioGAlIuCi4KEkqmIgZiYipx0bXyBhod+jmhnaHl/boWHgoVxhIZIbIB3cnl2aG1rX3Z9g4h/h4WLeZScm4mLiJF/enWKdnx4bW93foF1dXNtXF5eXGNkWGdlXFVQUFdZUERMS0ZPSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2Nzc4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5COlZeSlqCdrKCmuK+zvbOXjZKLmIt9dHB+iZJ+fYyDkpR9hn6GpIeIf4KIhXiHiX5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9Pj9CRUdISk1OUVNUVVRUVlVTUU9GQz84MCwjh1s/Pzg0Ll2WcHOjVUZJS0xNT1dgWG1YWlxlho2Aj3yAfYGNj3yDho5/mJOAn6CXlJqZpa2Smbuxp7vHw6eLjKGljpOJgZF8cYOen5Gdf3eFhYuQh5BpaHCEgXSMh4SKcoaCd4iAe3aEfG11dWZ/lI6GiIiHiIegqqKWiY6Xf3qBiHp5b2dreH58gHVsZV5bW15qXmJnYFpPTE5YUlFIUEpETkdDSkRDQUREQjw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZneCen+Mf4GRjoqam6Sdoaymqq6wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOhICBjIqCiY2Df4p/bHBqXUJANC0tLy8uLjAyMjM0Nzc4Oz0/QkRISU5RUlRSU1NUUlBPSERCPDg3LzlDPjw8NjMubJOXTVBISkxLSk1WX2F8ZWVqcZWUiJWOj4eKi5aFkI2biZ6ekKGppKKqk6i1oafBwq3Hr3i5lJp8jaGemYSThYKOoZ+UmZGFioWPmpGWbHB1ioyClYyNjnePhHFthYGKlpGChYhxiKCWhpGJjY+WpLSom4yUooOHkoN9f2tqanyCg4N1Y19lYFtobF5sbF5XS0hOUlFOTExGSVBDRE5GQkNFRkM9Ojk2PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnF2koZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXmAkoiRkn2KhJiSkIOAgIuMiYaQh4SJhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOT1JUUFBRU1FOUElFRD47PDpERj8+PDc1Mjw/UjVISEhMS01OUl5sh3pxfnmYlpWioJ2WnZOfkpqcppymqZ2nq6iptJarvqu2x8i3yNDPvpugcGmrqZ+Ek5KFnKCam5mmkpGIlaObm3h6fpSYk6KSl5eBlJ57d5WSqrKIjJeffJSdm42RlZijoaW1r5yQmKeHlo+NgIhsc3N9gX5zamFeYmBiaGRgaGdcUkVKS1BPSUlMRkZNQ0hMRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbX1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Ljo18ioaPkI6BgoCJi4qFkoWDhomBgId3XmJQNDYwLTIvLC4wLy4vLi4wMDE1PkFBTVFSU1FSU1VSTlNMRUVAPD49RkdAQUA4NjYyPDk7RkhHSUlNT1FZbIONdZCGnKCjr7m0oKqpqqWmsqmutLCwrLqwsr2bssOrusnLuMO/t6WisLOsraqji5aYhKWmoKOXgaaZjaKqqKWIhZSkoaCroaSoj5yxi5Wjpre6m6Cir5KinKGdj6Ohq66rsrShlKSpiJmIkomVeXp+hoFpYmldZmNfZWReZ2dfW09DSUhTTkZITEZKR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhiV2luWHqEdoGThYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5GOg4SBi4WGiJKGgoWJh4iHh3FuYUBFNjQ8My8xMTAtLCstMC4tND9DQU1VUFJTVVVWVU5bUEdHRDw+PkZIQ0VBNzs8NUM7PUZLSUZIUU5QV4CQnYKqn62lrLzEwKeww7Wqsb6xtry0vbPAtbu6orjFqLXJx7W9uLSoo7StsLGbmZKan4inr6ullHafpJehrLK0mZaqrqiutruyuqywtaKxrLG1u7a0rrSfpqehppqpr6yxuLe4ppq1qIykjpCSn4Z4goV4W2NlV2djYmRhYWdgW1RKRERMVVFISUpESUdFQUBAS0RCTUc8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWVFiYld5dXGBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiXmGgIyTjIeEgY5/gYmPhn+GiIaKh5B6eG5dV0BFTjw2OjQ1QUI3NjQvLzZDSEJRW09RVVdVXFdQX1VJS0pBPz5HS0ZFRDs+QDdENz9CSkpFRlZTUF6NoaqhrrC9sLO8yca0ucO8srK/tbbAs76vtnSws6W6xKSvxrmws7Gzp6S1tqqxoKKXm6KSpbCupq2rp6SYoa20u6Kosrq1vL/Mv8XFvb2zwbe6t762ure5rKuwpK+prb2wvLrBwauYuaeUrY6Xl6mIfoN+bVhkYllsZmtmWFxjWVZTSUdGTFFHQ0hJQUhEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUVZTWVVadmpwfo6DgI6EbnpzeIdiuaGZo4mUlJaSlJONj5aRh4Z7hoGNlYqAhIGKenyKh4Z8ioKBi4OVfXd6dWVQXGRHRUw7UWNhW15TRj87SFBFWmNRUllYWmdZVGBfTFNQRUE/SUpIRUVBQEQ8RTZCPkhHSkxTWlRdkqy0sri1xbu2usfLubrAu7a0urm2vbO5scVgdLGksZqeqr2ppairqqOisrWgq6iflZafmaCupaempZ+klKOnsbSosrO9tsG+08nJ08bDxczCysPAvr2+u7y3tK+4t7bDucW9wsevnripoauNpKe1iIGBdGFjY19ZY2BqZ1NYYFZSVUlFRU5LQT5HRD1LQT1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCstLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWPc2xycnOH1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaKfoN/gnh7i4OHe4t5gYqCl350fXprZnB1WV5cUGVkYmBlZF1bWFdcTWRtVVJtbV9uX1hnZFRZVUpEQktLSUZISEhIQkk6RD9IS1NUVVxaW5K2vra7tMO8uLfIybm1ubW3uLK2tLOutbWYZHWnnK1wXqKsnJigopuknqqllJ+fkJOOlpmYqJ+moJ6amYOknq2lqrCtuLC9udTRz9fQyszSzM/Oysa/vsLJvcG8wcDExMXKvsfNsqO6sLSumqu3u5iAfG1fYl5aX2NaZGNRW2BTUEtDQUVGRTxARj5BSEJAQz06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVtZaF9vlpKQlG5sb3R1h7SsoaGfi5mcmYyNlZGakYWKin6IhoyQi4h8gYNze4qDhXuJdIKKhpV/c3t5bG11e2hyZWlsaWdqamlgZmlpbFptc5atpLyIhmdbb2ddWlpUSEtOUEpLUEtTUUlMQUpGSk9fXmFmaWGXtcWvt7G5u7Oww8W0r7iwsLursrCmqrerjLWnnZqnmk2ZnYyOn5aRppillYqTk4mQiY+RkZ2boZealZeHn5qnm6yvqLCotLTU1NTW08zQ09XN0s/MxcLJ0L7JycrJ0cfMzcLP0bevw7zDuaS1ucGihHFlXl9fWmJZWmdaUV1YT1BCQkhFQkg7QUM+QUc/P0E3O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZUmVWc5CQmIJncW95eYOhqp6ml4yam5eLjZWRmo59iYuEjYqKipCHfISCcH+HgYZ7h3KDkouOfXF4dWxxeH5xem14c21pgXBtY2ltcHhpd3x+y7/B36dtY3huY1tiYEpQUlVOWV5PXVxOUE5UUFRUXG5tdoJxlq23q7Klr7Spq7u/sKq0pqS4pquuoKu0o46wrZqXmIyPkpGEjpuBjaaRnImDi4SKiYSLhJSVmJeUm5Gcl5man5+rrKWooqytz9LV0s7M09TUz9TRzsfD1NHHzdLT09fM0dHE0tbFwc7Hx8KovbfOnnxxaGBlX1hiU19bUFFUUU9IPkBGQUJFPEBBPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxVUU1OWnWGhYp3bHdwfX5/oZ6eoYyMmJOTi4ySj5WFeYWPkI2KioiQhn6Ce3J+gICHeoR1hZOQiH9vdnJrc317d3tzgnhya4BzcmlvcXp5cXq+y5p+jLKEdnKEdmhha11DWlpbVmVjWGRqU1hcXWBjXWN3en2LgZipo6SgnqCnpaqvuKqls6KhraGjraGnsZ+IppqTkpGJkI6IgZOJapSijJmEgYZ+kYODk5eti5WNlZmOhpKRnpeosKKhoaWkqcnNz8jCzNHU0tTSztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMPCy411cWViYVpWWlVcUUtHSkpKQDs6O0RBRDxCQz5HQj5CQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7T0xGSlhwgHV9aHN4coKJgJ2VnZSFi5WJjomIjYaOf3iDk5iKjIeIi4h+gndze32Ch3d/eoaRlX+DbndwbXV/dXh9dIV8eWyHdnRufXaEdHh7nbWMO0GLxaV+jHxpZVdJQ2ZjZWNnamNtd1teZmhrbmhugIKHkYucnaCckJeYnqOjpbGjpLKfoaWdoKigo7GchZ6SkZGPioyKhoOPhH+cm4yNgoSFeZR/gqmVo4yRiZeSi36Yi5uSq7OYm5yonKe+w8a5tsbO0tHS0MzSy8jUztDV2tfX2NTZ2M3Y287J2drR1b7Ky7V6eXBnX1xUV1JdV0ZHSklFRT06NzpAQEI6RkQ/RENBREI7Pzs7N0RDNzU2NTU7MDY3OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjXyXkZ2LfoeSg4mGhImBh3x4hZeWiI6Dh4WHeoR4cXp7g4V1eYWOjZx5i3B8b296f3F7gHGDh4Fujnp1d318gnR+fIaHr3NYqcK2jZGCcG1iPV5ocnBxcG54doFlaG9ydXhxeouGjZORmpWflYeLk5ugmp2pnqGsm6GamJ6lnp+rmYuai5CRjYR8h4eDhYuOn5mTiISHfmyZeoSYhoiTjI2UjIZ8nImUkK6qlJaYn5mnr7a9qa2+x8zJyczL0MnD0srU19nX2NfV29fT2dvV0Nra0dbI1MuWfH1ral1cUVVUYUlDRklIPkE+PTc6PT87PUc9P0FBQURBPj46ODdEQjc1NTQ3OS41NTY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OTlEPkNHUmpebWRiZmt2gIhxkZCagHqAjX6CgoGDfoN7fISYjYeLfoWGgHeCeW57e4aBdHmSno6gdo51gnN1gX1zgIRvgZCCb5KEdXyBhXp2hnuJt8Wkwcm4gZabj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWlJSOl5CDiY+WmZaVpZyXn5Wek5GXop2Zq5WQkIqMkYKMhIiIgYWPkZ2bmYmGjIGFmHqIiZ+XkIiNiouCfaGJkYy8oZiTmJmdqaamrp+otr/AwbnHys7Oxc3J0dbV1dnV19vU19na29fb2tnYztvGiH18aWtnYVZZV1dOTEVOQzs9PTw4Ojs9OT1ANj0/QDw/PTw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdJUF1bU1VYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWGVhXVtodHp5bIqNknd2eop7foB+f3yEen6CkYmEhXqEh3t1fXRtfH2GfnN+kp6RnoORe4Z+eI9+eIqKboKagHSZhn6BiYR7fpB6j6mOj8OhvYucpJ19iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CShYiKkJKTjZyZkpOQlo2LlZ+clKCUkY2Nj4t+j46NioOIkpaanp6IjJWSnZGBi3+lmYiEjYKFhIGlhoqMuJidkZWWoqihnp6dpK+3urWswMbK0MjHzM/T09LY09XXwNfY2dvY2trZ2dfbuHt8em5raFliXVRQT0lETEI8PD45OTo6OTk7PTY/Pj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw6RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg2ODk/PUNRU1JYXlVYZm1tbWmBjopxcnmKe3p/fH97h3p8e4uGgn10g4V5c3pzbYB+hH53hZuim52Ukn+MiH+Yh4Cbkm6IqIV6oYt8kY2DiIScfZqQioyjoqCQpK+fi5CLhYuBk4ZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlIyGiIuSkouTk5OOi4+Kh5aanI+UlpCKkZOGgIuIkYyKiZyWmKKihpOdlqCKiYiNm5CDiI5/g4eGpIWMkbOYnZKUl6GhnpqSnJ6osritpr3Cx83Ixs/N0MzP19HR1a7W1dja2Nra19XZ2aBygHdqaF9fWlVZWUNBSUM/Pj46NDk6Ozc6OzozOzs/PT43Ozk6MTpHPTozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOjg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNiem1hfpKDb213i3h5f3qBfIZ8e3eGhH9zcIWCenV3dnSEgoR+f5KmpJ+lopeKnZCUl4uKqJdzirKNhKiShJmThZmMopWfmJKIm56jkqmwn5CUkI2OiJaMbo23hZrEyLKboaWbnJiWkLKRZKTNyJWOhoeIj5KMjJKTiYWKiYWWmZqPj5SThpSXg3+Pi5mHjZCql5aiooiZnpaaiI6Gl5eJhI6MgX+Hj6SIjpOompeTl5mhmZ+Zk52bo7O0pqO8wb7HxcXJyMnCy9PNzdSp0tHW1tbY2tTS2s6FdYNrZmBgX1FLVlxCQkdDO0E9ODM3Ozw6OD02NDk6PDo4Mj85OTI6STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0SlE8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCZYNHdYKOfHxtfoh4en56gYGCfnZ2gIJ7bG6Lfnl8d3h8hIaLfoujtKikq7OhlqegpaSWla+ig5C4lZKzmo2hoIykm6+ipJ2YkKeXqZmtsKSXlJWUkIuYmpagwI6jybirmqKlrZmRm5yynYaFqKKcmIWIiI2Ui4uTj4eAhoeIkpiUjIqTk4aUmIaEkZCcc5CYspWWo6GInJmTj4qQipaaiYqWjYZ9jJifipCQnJqZk5mYoJShnZWfm6GxraOkt76zxcfEvcPDv8bOysnSp8/M09HQ1tjSz9i8dX15YGJXYlhSSUtPRUJDRDU+Ozc2Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj8/Nzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OklFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdNXFxZSmhhO0iEi3p6bYWGeXyEeICFgX1weHx9fG9zjXp9gXt4houJhoSSqLytqbO9sKWus7Opo6KwrYqatZ2juaWVraSXqa23pqSjn5mpmKqkr7GqmpmclJWRmKCXmru7rcqhaba3qrCVmJ6iq5KXvaReqrKCiYmMlIaQfI6OfYOGjo+UlIiHkpaLj5WNi4yXmJGbmbSWlaqdi5yUko2QkouYmoqSnY+Lipafoo2VjZeZnZOcmJ6UoaCUnJ2mrqiipLO4q8LIxLa6vbzFyMjC0KHGyc3NxNfW0MrTo3N9bF9cVWFTUUhEPjxDQUE4Pzg3ND5GPDw2PDM1MzU1NDU0QjM5OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGZIYWBicEpAi4l/gHKGh3yBiXWCioN+bX18fH5wd4d3jYGHe42QjIaMmqvCwLC9xryztMG8tKyrs7aMqLKtrb2rm7ujqK25uKumpqKipKOqr7Kxqp2cpJibmJieoqalk6O5r6i/vKytsrmlo6d9iIacrb2wgouLipCDj4ORjnqBh5CNjpyIiI+XjYqUl5SQmpabp5qxmpGrnY6aj5KOlZCPlZaOkKCQiJWcpKyUlo+UnJ6UoJ2bmJ+glZufqKekoqSws6bAxsOwsLu2xcXDv82nx8PHw7zV0MzEyop2dWRfXWJdT0xDTEBFRz5BP0I8OjQ+QT09NT02PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQjVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFSkhOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxoRl9pZ1tdXJOMjIh7h4uGg4x1hpCKgW5+e4F+cX6BepR6kpSUmJGTlai0x8nAwszCw7nHvLqvq7m7l7K2urLAr6XAo6uwvLyqrqujo56nrK+1samboKqcopyWn7C0p4yjurq1wburqJyypKSolISOqcTEpIKLjoeIhIaVlIx6g4yRjpGhjIyUkY6Hl6CYk5mVlqWgrp2MqpyOlo+SkZWVjZCUkY6hk4aXn6Cyn5SblKChmaSfmqCboJSZn6ekpqekr62lv8PCrqi3tcnDvrbOssS+w7uz0cnHwbV3e29eW19tVE5JRE1LS0pAQT1CRDw1QUQ7OjM9OEIzMzIyNjNBMTVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJnXE1lXGZUY2qajZaKi4iSj4aJeYaTkIFygHuMf3eHgoGPeY2hlqiampi7vsnIysLSycrCzb3Bs628v6e6v728xLitwamss7y9qrCqpKWjrK60rra1oJ+un6aimaO0vamcqLzBo7a2r6uTsKyqrJaGmqqnpZGCjJKklYmAdYmReYWNkZCen5KPlIuPi5OjmZeblJOhnqmfkaWajI+PkJWWiHyOlZKRopqVoKKctaaQoJelpKOln56mmJ6Vl5ylo6ioorKtqLvAxK+ls7fMwLquw7O7vcG5rcLCwr+ZcHtjW1lfXkxNTktHRENIQkFBREs6NERIOjs0PDdGLjEyMzUyQTI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+bElfWGFaZGVYno+djpeOnpKJin+In5KEeIV/lH5/kIiJkICWoZqup6OYw77JxMjG083Ozcu8wrewur20vcu7w8G2t7yttMC5vK6vqKGpqLaurqmyt5qerKKoop2rt7eqpa++xLG9ubOnqrSzra2WlaWtqKCRjpKxxaeVjX2RlX2HkZiPqpmXk5OPk5SSpZ2TnZmToKGhnJifmIuMj5CeiFqPlpeSlqSZZpmjnrOllqKWrK2sp5yfppeYlpiVoaOopp+1q6m6u8O0prS1y8G4qrass7u4rqi4ury3hG9wXFpWV1BHTFROSz9BSERESEZGODVGTTs+Nz5BSy4zMjAyNUI1NVBXTjxMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVjw+QEJGQnNGaUlSZmRNRqaUnJahl6iWjJCDh6WSiIGHgpuDg5WQkJSOmqKfr76uoce+xsXIx87Oz9LKvru2sbu7vL/PtcS9t7m3s7K2s7izrKecq6y5q6mor6+Xo66lqKSltcGwq620vsK5wLmzp7i0t7KvlaStsK+li5OUoI1zwZl9l5mEjpaai7GVmpmVkpKZmKWjlZ+alZmonJuhoJmKjI+WnWBKlpyalJmkl1SWsJ+vnJ+lla+vraaboaaUk5mYjp2fpqGZtKmqs7y8u6uwssfAuKasq62xsaOhsrK0pXNxZ15cUFJNRlFRUFE7SEtIRkdBQz05S1Q/QTo9RU0vNzUzNDpCNDROV048SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzVFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFg8OkJDQD1SRVdTdGJWRkirl5mfoaiumJCXh4qnlo2IkoWfh4Sdl46eoJqjpLXJtKnHvMPEycvJyMzOxr66s6+6uMDBzbXIusG5tbqyr6+ztKeknKu0tauqp62smaSupqWprLq/qKu3t77BwL63srLDsLe9rKOutK26poibl6Wadb6fhJidjpKYmouulqGcm5eUmp6gqZ6noJiZqZmhp52XkI2RnYNtdZOimpWcop+QrrKiq5Wpqpiqr6aloaWqkpKZnImVnKKelrCnqaq6t76zsq6+ubago6eopaacnK2pqY1maGNgU01NR0lPSlVMPUxFTUlKQENEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQzo5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXPDo9Li5TYU1WSH5lXkhGrJScoZ+7rpiUnouTqpuRkZOIqo2Hop6Mo6yUo6S2x720wrvDwsjJxcLOyMK9ubKvubXAw8q2xrLBvLW7rKmtrLCjo5mqtbumqqesqp2or6ikq6u+vKitvLS3vsa8trW4wLC9v7Optbesv6WPopeQoZ+8nomaoJmXnZ2Pt56onKWjmpugmqelsqGanaWcp6mdmJSPlJuLlomMpKGUnKKfoLWwpaaUsauaq62fn6WkqpKWlaCEkJ6fnJappaGhtLS6tq2otbKynpyjpZqXlZmqoZ54Y19hX0xJRkhOUUlORUZGQlFKSEBER0FWU0RIPEFHUTE7Qjc6QkY3OV1ZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRaiXpJ6fw6ybl6SXmaiblZqajqqWlaimla2smaKrt8XCvL+3wcLAyMS/zca7vrmysLm0vsPItcCwvLa6t6ekq6utoaGbq6vEoqWorKaeq6+soqqovrimrb6wt7fGt7S4uL6xvsC2tLK1sL6jlqOVk5qTrZ+QoaGkoqOekL6kqJ2oq5ycoJumn72imKSeoqmroJ2VjZWek56HjoSNk56koJ22rKadl7OnmrCooJyrn6KNmpWfhI6hmpySpaSamKuxtbGqpaqtrJyYoKCSj5CWqZ+UaWVcYl5QSkhLT0xIRURJQD1PSEA7RklIW1JQSz1ITlU0QkY4PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLS0wTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGZjWE6im6ObnsWroJ6rnZytn5Ginpakn6aqq5e2saOps7bFwr3AtsDCvMnCv8rItri1tLG0tLfCxre/sbm1uragp6yrrJ6foKWkwaWhqq2gpKmtsKKnqL21pbG7t7a1w7Kyt7q+ssPAuLittLW1o52klJGToK2fmKGdqKiqoprCrKidq62amp2YpqC9oZ2kmKurrKahmY2an5KeiI5Yf5afpqGguaqnlJm3o5+zoqGcsJihj5qVnoKPoJeXjqKjlZClrrOrqaKipaSVlZyYi4+Sk6SfiWNnXGVhTUpLS09GRUFHSz49SUE5OUpKTl1RUUk9TFZdOUZJPURNSThIY1xLQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2FTNlNaa1dzSEU2PXVlXExQnqCgmJ7Dp6Sis6CcsqeSqqOfo56tqaydu7GprLWxyMPBw7PCw77HxL3Eyr2wsbausbWwwMW1urGxuratmqmwqaqbn6ahp8KtnK2xnKqirrGqpKi9t6a2u72vt8Ots7PCv7LGs7q3q7W2rqqippWVlKKroZ+fmaerr6+vu7Gln6mpmZiXk6KkuKCho5Kur6ukpZ6RoZ6UnY6QjZSdmqOfqLWnp42ZtZyjr5ugnLCRoZWYlZuAkqKWkI6foJOLpqywpaeinaCekpKak4WLko2cn4BkaF1oZktKTEtTQUNASUc7O0Y+ODlOTVVfUlNKPk9eXj1IUEJNTEk4TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHddXj9bVV9nckA4PEiWd2VBNJ+knpqgwqejqbGgo7SplbGrpqKksqytqbuyrbC1tMa/xMS2v8S+ysW2wMnCtay1qbC5rMDEtLivrba6pZmrsqyqmKGnmK27tJyosJutn661sqequ7OnubO4srjAqreyw720xae+rq23tamnrKGWlpGlpKGhl5ekrretsbS2n56opJmTlJOjoLejpKWVrrGxpamloZ6bmZqVmKign5minq+zoqaNmK+apayYm5+nk56QlZmahpeglY2QnZ6Ui6mpqqKnoZqelo2PmZCChpWJlZ96ZWpdbGtOUU5OVD1DQU5DOzpJPzc3UU5dX1JWUUJXYF1CSlNIVktIOlRkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM5MDZwW2JIMDVKcWpWQ1dGjHlmQzukpJygpb+mqK6uoKm1qp23r6ujqrS2sLC4t7C3uLfEvcPHvbzDwsfBusHGwbqqtqWtu63Bw7i4qq2yvKOVrbGtspemqJGquaqhp7Cdq6CvtLOqqre1rLuss7K5t6y4sMG6vb+mw6qwtq6pq6umnZiYqqGhoJGXoLCvs6uwuJmbqZ+ZlpKXpqC3qaWioq+xs6uxp6ugnKCfm56lnaGYnaO0sJyfkZSmmqGpnJakopiajJaZlJaXnpSJkpuZlI6pqaego5yZm5OHj5mLfo2Xho+bbGltYm5uWFFRWlRBQ0RVQDs7SEA3OlhQZF5RV1dFWV9eTkxTT19MSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNzQ3Z1lhRihAOG19aFxWOol7Y0M9qJ+coam8oKqvqqOxt6mltLKroa21va+zuLy7vbe2wMK/ycS5xMPAwLnFvcG4r7aoq7eyvL+/tKqvsrifl6ytqK6YqamOp7ufpa2znquisbCzrKq2s7W8rbCxtaywtbLAusW2q7yvsbesraqjsaWepaieo5aPmJ+yqrOpqrKZnaebmpSMoKaktK6noaysrbGns6uxqaObnqiknpWhmpyotqmYmpKSn5mfoaCSraGbmoiXmYydmp6Ui4+Xl5qXp6WjoJ6XlpaUgJCVhHuPk4SNl2dtcmhxc2BHWWZWRENNWERaOUhCNT5dUWhcT1pdR1teXk9NU1hkSktDXGNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FWMTUxPWBWXzgpQzNZVVxnSzWMemZMQKWZn6SrtqOsqKWurbWpr7O5pqewt8a3sbe/wsK2tbrFvszFucPBusC6xbjBurO0rKq6uLu6vrWrr7G3mZioq6usnK6rj6u+nquvsaOqn7Gts66utbG5t6qtrrGntbCzurzJsqq1tbG0sK6moLOgmqisoKWVlpqZsaKtoKWvlqGkmpmSjaKlp7KpoaaxrKq1pa6wtK+jmZ2tp5uXnpuarLiimJORj5icoZmYla6hn5eDlpuOnpyal5GLlJOemaWjo6GZl5OSlnuMkYV7jYuDjJNsbnlvdn1iRmBqWklIWls9e0pHRTZBYlVpW01cYUtcXFpSU1NiYUxLRWBhYFBNSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuK0EvSkdQW0czY1lUTEWalp+wqLGprKSjrq21qLezt6OstLfJu7W7u8C+tbS3w8DMx7vEvbe/v8G4wL2yva6ourm4t8K3rK6yupaXp6+sqKSyqZSvu6SssrKmp6OytLGysbWwt7OprquyprivtbPExbaptbWrsK6pp6K2np+msKCjlJuZlLCep5ufqY2pop6blZelpaS3p6Kws6unsKetr7SspJmhrKicnJ2dlaq5nJWPj4yYnaOYkZiopKGZhpWYkZ2cmJeWiJePl5uonaWhkpaSkJZ3hJGGfIaChI2NbnF4dnyAXUxlbFxKT2RdP2J7R0k4R2dXZltNXmJNWVlXVVhVaV1PUEhhXl9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGcyNydGYUxWJS1CLj1FTFE8M3JrTEVEkZmkraSsraqmo7Cysqq3sLWfq7W5ybmuwbzDuLOytcLDz8TAwr61vsDAu7+9tMSpqrmxtrfAvK+stLSeoaexrqWmsaWesrWtqrKxq6iotbqstbK1q7StqquorKm5rbKwx7+4pbmwqa2tpqetsKWko66jqJydm5qvmaKioqOQrJ+joJ+hqaaluKSrtLSkqquprK62rqKdo6irnKCZm5OktZqPiY6IkaOhlo+Wn6OXloeRlpSem5mWlYeYkpWZp5ygoI2Tko6ReH6PhX19fYeKinJ0c39+fl1TY25eTlpnXUZElltHOk5tWGJbTmFiTlZWVldVWWheUVNNY1pbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0RkOzYqSGRISis6ST8zQ0lTLD6PbEBISZCaqKmhqbCkp6OztLC0tLCwoKutvcy7rsK9x7K0rrTBw9HExr/Bsr7Cw7y/uL3FqK23rLS4vMCxrLKuoaOnrqqopbGjqrCqrquxrq6sq7O7p7ewsqmyqqumpaOtuq2rsMK5tKy5qamoramnsaWppKKuqaiinpyirJWlnZiemayeoqeooaymo62strCxoKmjoKqtsKydnqenqZqjmJmQoKiYhoSPi4ufoJCMjpeekpKIiZKWoZ2WmZaGl5OUl6Wcnp2MkpCOin9/iIR8d4CHhYd1dHKJd2xfWWBuY1FzcVxLO4R8Rj5XdVhgWU9jXE5VVlVXUVxiX1NPT2hZV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTM5NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkswLkpnREY4PEIwNUVLWDFAlF1ATkaVlqynoKmxnKeosLWsuLWtqqSqqr3JvLG/ucOvsK2zw8TOzsO/wLTAw8S6wbTJxKyvt66zusC+tK6urKaoqrGppqmyprStqq+trbGusq20u6W3s6ysrqiroKOesLesqq25tqS1taSqp6ysqq2gqKansbGkp6WhoauWqqGTm6CmnqSjqqOsop6msbasrKKlo5qpq66pnaGlpKSZoJmWj5idk4GCkImFnaCNi5CNnJGTjYWOmaWbk5GbjJOSkpSjmpyai4+LjHyGgoKBenWBhIF+dXeLood4al5gbmZXZodkTkBnkkxFYnpXYlhSZlVNVlZVVE9cXWFWTE9qV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOzo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIdCSUlElpCupKGqr5ipqK21qrWxqqWrqqm8wMC5urS8taazr8PJy9G/wbu5v7/DusK6wcSusbWytLzBvrOxr62srKe3qqWtsKu4rqiwr66xq7WqtrWntLerrKSqqpyknrOzqaiks7Sfta2hqqirqKunn6urqLm2qaqqqaKpn62bkaqhnaCko6aiqp6cprSup6WpoqSYpaanqpyipKOgmZifkY6PmY1/h4yHhJ6eiYaMjJCQk4+FiJajmo6Nm5GSkI+Sn5iZl42LhIB0h4J/fnh1g4B6eH5/iJ2PcHFmZ3F4XGF0iGpPXZhWSG15VWRWU2NQTVVVVVFPWFtiVklRalRWVEdQWVVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UyMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyQGY9Tlg/Qyw/TFRfL0lrN1JGO5WNr6ClqqyZqqOtrrK0r6qkr6mou7+8wbKwua2itq/Ix8jRwL+9urzDvrvEwsC/r7Kzs7a9vMGxsrSrtKmltqmlrbOyuK+irbSxr7G5q7muqq63q6qeqqugo6G1ramhn66yobSqnqinq6OqoaGsrai9rquuraGnqJ+smY+woZiioKimnqebmamwqaKfrKKhkqKio6eZmqmmmJiZnY+Lh5WIfY6GhIWkloaDhI2IkZCShoeWoZeJkZ6Rk5CNkZyVmI+LhoZ4dIGAfXR4eoB7dHR7aoKIpHZpXmVrgXVniIt8UlZwX0t4c1RkU1FfTU1TWmZOTVdZZVlHU2pSUT5CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWg6MzhfPWFkP0YxQ1BbWytIUDtZQzOPjrCgpKWqo6SjrKa0s7GopLCnqri/wb2xqbqqp62wycbI0MO+wL25v8C9ybzCuLGwtbK6vLnAs7W8rLmso7Wnp6yxtriypae5ta20vK+8pa2ttqutnKmvpJ+krKqonJ2qsqSzqJqqp6qkqZ2iqaepvau0sK6dqaSgr5yas6KWpZulpJ+lmpqoqqWemqmhm5GboKSemZepqpGZmpKQi4KPhX6Qg4CIn4+HgX+NiZOQkYaDlZuUhpOijpSRi5Gbk5aHin+Acnp5fnxodnx7dXFxfmqGeoWIZF9nY3KFe21neV1eVkJXe21UYVBSWUtMTnB0XUlaW2hZRlZnT0M+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpKwmZ+fqaSioauktrKxpKmwpq25wr23sKS5rKmosMLIyczCt72/tbjBusi2w7W0s7Wyvbm6vbauuba/rKK0pqqrrrW3tKmcubuosb6yuqCutLapq5+tsaOcpaipo52bpLCmr6Gfqqmnoqqco6igrbynrrGuoaqipK6enqymmJ+aoaKbn5uZo6qimpmjo5WWlJ+hlpyWpqyMn5KPkYyCioCAj4F7mpWMiX2AjYiSkI2Lh5OYkYeUpIqSkYeQmZCUgYh9emx9dnl4Ynp6cnBxc3hqgnVrgmdjZ2Fuc45tYmpvX3BBXXlrVl5OUVFLSU1TWVZNXF5sV0VYYU9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUl0+I5GWq5ifl6eioZ+opLevraKvr6isuMO6tK6gua+rp7O6x8rHv7jCva+0v7fEtsOysLqxssC2u723qrm4vqqktaeoqq+tuK+omLi8pK2+tLShrbi1p6aosLOgnqWlp6GlmZ6sp6ieoKqvp6Cml6Kon7C4n6Oxr6GroayknKemqJqbm5+ilZycmp2pppabnqiRmJKZnZOZlqGqkZuKjpCHfYd+go58fKGNjIl6hI2GjI6NhoqTmo+JlaCJkJWCjJeNkXyFfHRwfHFzdGB4eGpvcXFwa39zZHpsaGVjYWaHgGBbcmpyTU6AaVhaTVFMS0hQUlBHTVtfb1RFWVpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MF1bNSiVm6WYnJWsn56hpKG3q7CjtLOpqbrFt7OuobitrauvtcXHwLe/wrmwtb23v7u+sKy+sLO/srzCuKq7urinqLWop6uvq7KvpJi7tqSrurWvnrG5r6mlp6+ynKGkoKSjoJabr6ahn6Kor6GgopOjpKK2sKGmsaufrKOumJ2qpaifmJqdo5Oam5qdpaqam5ullZSXlZyOk5eiqaKRiouQhnqEfoSLeo+Xio2HeoKIhYqNj4aQk5iMjpaZi4+WfoaXjI96gXtwcnZub3NfeHdlbGxsamqFbmZyaWtlaF1kc4FgW2t2aVpKf15cWE9PS0hIUlVHMzldXmxQRVlVWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFRdaEQuPDJkVywylKGhl5SbqpyjoaKht6qtoLu3pay9xbSxr6O1r6ysrrTDw7yzv7q3sbO5uLq4uq+uwLOzuK+/wLetvbq1paKyqaepsaqtsZ+Zv7Wkp7S1qJ6yvKmopamvrJmip5ykpZSXoLKkmZ6jqKmcop+SpKCkuKmkp66mnqWhqJOgqaKhoZmbnZ+RmZuWn6Gqm5qYoJSRlJeajZSTpKikkImKj4Z6hHuEhn2djYqLh3qBhYiJipKGl5KSi5CVlI6NlHuDmI+Ld358bHRybGxzYXd1aGhqZ2dwh2hoaWRmaWlgamNqaFtme2NgU3RUXFtSTEpGSU9TQCEqaF5pTERXVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z1AnMp6ipJGOpKaanZ6do7Stp6q6tqesxMG4sayjtq6nra63wL+8ssK3sK6ytra5tratqr2zrrKxvL+3rru7saWftqqlpbOnqa2dnMCrp6Wvs6qstbueqaqrsaWYnqqdpqSRmKWsopiepKmhnKGblp+dp7WmsKquoaGdnqGVoKafoaCam5mbkpidk6WdrKGXlp2Uk42Vl4uPmJupn5KJiouJeYV3gYKBnYeLgop9gIWIh4aRhJeUkI6PkZGRjJN7g5WPhnN+fmZ5b2pqa2Z0c2tjZ2RkdoFiZWZmZmppY2tyW19ZXm1kYU5pWFpgVkpHSEtNUlg+OV9saEhDVVRdW0lJR0VBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFlKVmJmQDozQmhIJTWao6CPjK2hl5eglqSzsaKyvbahsca8urKxo7esqq2puLy7uq3Asq6urravs7izqau5sa+us7a6tq+4vaymnrWqn6Cvo6mum6G/oLCjrrGvt661nq2vra2imZ2nqaWflZqnpZ+ZpKKonZqfmpOcnqyvprqorqKhmpuemZ6kmqSdl56Ym5SYn5KolaqnmpOampKMlZmOlJSaqaaOjoqKj3uCc4GBipiFh3yJioaGioyJkoWVm5OSj5CRl46Qf4CNjoNvgX9meW1na2lmcXJrXGhjY3SBYmZnam5sZ2pqaG5dbGxzcGBUY2ljZllJRkxNT1hSUVVhZYBVQVdTWVRHSUZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyY0kaGbjY+wnZmToZqpsa+fub+1oLTCu766saa3r6etpLe4t7etu66tqqu3qrO3rqaytbKuqbC2trCztbqmqZ+1qJydqKCorJqnvZispK6vtrWsrZ+xrbCpopuco6uonJScp6OdmqmipJaan5uQm6Sqq6q8n6ekoJiamZ2hj2uilpmccIKVmqN/dZGpp56UlJ6QiJiagJaKoZB5h5SNg21pf3eDcWyGi4Z9hYyHcV5jYWeEmIZri46UknR3i4R+g5CAZ4eAZ3VoZVdcaHNtTlBqY2dzhWhfZWZubWpdYGGKj4OEZU5LRDlHVGheSkdQUFVVTEhSYG90ZUZbUVVQRkhFQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUFAQD0yOEBFPTEsKzA4PUc3MDEuKi4qLzU2OCwjMScyMTQ6MTc1WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoukmYaVsJubk6Cbqq2qo73Fr6m3wre9va2mt7ClqqK3s7KysbmsqaastKavtKKpt7a2qKestrKutK2zoamfs6mdoaObpaaYq7mUpaWvs7etrqWprquspaGenKGnppuXoKWlm5unpp2Tnp6Xj52nqaS2sKSjop2WmJeXo4ihjpKahqGHk5ygf6V/paqekpKakYiEc3iNjoWIoXaJjWmXiGZ+c3igb4iHhH6PfX+hoKCZgH2InnSHjnWbimyHgYNtaWVjemxyYVOFbWJsaZhxWGlxcIhYXmlbbGxbiHJuenKFZ4aEWl9HTj9HX01FUlZWUVFTV1RnXU1WSFJST0ZIRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3LyiKp5eDnKucmJidn6qpp6q/w6+xury3wL+qpbewqayksrSurrO3qqilsK2ltLKbrbW2taanqLKwrLKnrZ2poLGnn6OimZ+hmqyzlKOlpba9pq2nq6qsqKWhoJigpqOZmaWjpJicpKmWlKKbk5Kjpaaht6SkoKOYlZOXkpyIr5CXlImpi5ahnIWxgKOsnZOZnZR5gtSogIeVwZvHeXixpbeXZYDAnL95hIV6koR8kJCRynKXvJzFenK1pruQe4BtlrGrsHlobFixrm5lab2SvG5nem9yj9h+U2tjtrJ+gXKUc5qhqpBXT1diT1ZORlVbWFFRU4xcV1tQQVxEUU5FSEk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT46Qjw/QTg6Sj41MioyMkJFLy4zMi4rLygtLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjKeTgaeqn5ecnqWssqmwwr6ytb+1tr7Bq6e0rKyppq6zqa+2s6enprSlp7itnLOytqulpKexraywpqqdpqSwoqGfnZaanpytq5Odop+zuqOqqaKtrqWhnJqaoqefl5unoJ+YnqenkZymmpOdoaaiobGjn5+jlpaSl5KZha9raoqNqn5mg5WGrWRwnZ2UmaaUca6hpH54u31roZB2sV9qtFulgGWckWBng3tnf2p4a6llvnJnpox1sWp8sXh0kpRjbm2nbluEoUVoZoeWRXWcYH5nfKSnglpfjKtogJV4eWqnN0qvXFhTbGRbS05YX1xXVjtOiU9XVy9JVFNKQ0ZGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMwG5CilYOtp6Weo6Sqsbestb2/sLbEsre6waapsKquqKivrqOwuq+jpK2yo6m4p56zs7CjpaCprK+rr6annqOhr5uim5aVlpqaq6WVmqGftLOiq5yjra2gnpmWoKKonJido5+bmaGmpI+copmXoJ+qnqamoJqgoZaVkZaQmoW1m7V4hamZtZl2hrObt36TlpaplH5rgqZ7goaIk5STd6tna7Fcq3qNhpR0iXKPh4B/iJCXeIKBi5iLg6CPhLB2d59xbGxsfItOpFhIYmKZfmNopmB5cnVTk4deUKltY3F+h4BinC5RoW9bU2toYExLW2RYXFpCPrF5V1hBI01oRkNFQUBBMTk+ODg6ODQ7Ojk8ODpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjg0MCwuKC8zLD44MzEfLzItRDE9PFN9bjMrWGpcT1hNX2dXN0o4YVU1MBuUoJWIs6amoa+pp7Osqbu2wrC7wa24t7+prK2traatsamgrruqoKe0rKOrtKSmsrOno6Kep6qxp7CnpZ2fn66VnpmUlJWYnaygmZmkqLWvoqqPqqiqm52Vl6ClqJqenKKem5+jpaOVm56XmZyiqZummZyboqCXk5GTk5yD1ZOZuXCwwX7FhnzWlJu7fJqVpY+NnY2ke46IpIOlgnqseY+dVq96iH6farlauXaGhH6mgpR7mHqqeI2dj3qxbo6EdJG8hW+UUK+nxYpRoHpjYKpic3KIbZeIYFO1tMiFgIl8Y6QzQp12XVBqaWNQQFhnWmRhSkhNbk5cUU9ZZllDRD9FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6O0RIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFQNzElm6KUmLKoqKa0qqW0qaS8t8Gwub+xtbS6srSnsa+isLKmn621p5qnua2ir7Cfs7SwoaSen6apsKi0qKObnZ2qlZiXlZWUlqCpnJmWp62wqaOfj62jqJadlpuhpaGYoaGhoZqhoqebnqCelJiapqCbp5Wbm5+hmJCSlJCdiLJuaLVxq4dujqZytHNytnual6SLj52Non+RoaZ/sXaDkdLSdlyue4V/pG+bqqZrh4V9rX2YmY57sXGSno54s2WXdISeb55mlFHIi1rCXJ95Yl+tYHZzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNlWEFPa2BsaFBWR0k5PVVSWldYSUM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTDYyMKKdkqWwrKOrvK2mtKantru8srq+tra0ubiypbSzoLGxop6rr6SXprmtpLGwm7S4qqClnqGppLGnrKmjmZyZp52Vk5eXkZKhpp+Vk6WqsKailpOtoKaSlKCbpKaflZqlpqGao5+tmaCenpCVm6GdnKWVnZWaop+VmJWRm4Wse3eodqONiIapb62KgqeDmJihiZKai6J/k5qJroV/grNccrNSrn2CgqR/cdd9eIV+j52Gmpl2r4aHkZyHd7RhmmWagoKVbZJasFhLmnWYeWZgrV52d4homIhsXa93lZ6PeGw1eciusl9CVG9eZ2BFUGxgcG1WVk0uZmRpU1lQO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTY8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEg6OTmgnpWgubCXtMKtqLOoqbK6t7O3vrm3sbS6tKS3sp+zrJ+eqKuflKe1q6ivsaqttKSbqaCfp6G1pqapopidlKSgk5Kbl5GUoaSakpCmra+moZWZqqCjj5GhmaikoJWZpaidnKSerZ2hnaCNk56anaGYmZuWl6KglJeQpp2GqX19pXihjo2CqnCti4GnhpafoYmXl4ijgpGIlKp8gIudeG+xWqiCgoigeXTYf3aIdKiBjpuMkqR7lI+fhHuyXp1koH6DlW2SXKtbWpOAkX9oZ6pkcnuBa5iHc16rWomgjmtvZU9KQ6FcW0x0XWJnTlthX3JzX0tWN0qblVlHRT1HRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDUuOz4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMj84op6amsCrmLTCrqutqaW0sLewtb65ubGwtbqourSfr6SdpKennpOpsKmvqbSrqq6hmKCgpqSjuaKiq6CWm5Ghn5STnpmTl56fkIyMqLCwp56Xm6imoIySpJeoqqeUl6mnnp6goq2koZ6ijJShmJ+gkp6XnJWeoZWWjqucj65tcrRzqYt1iqdztHhzs4CRpKOSnI6JpIeQd7hwjXuLomprtlqhhWWXl2mhoqdtlHK0dJOZfrJqhZGHrWp1s2GdZqJvh5Nrl1ytX02hfIeRUnOjbHl/fm+Yh3Jdr1Y8nHdmVG9uLlynT2NTa2VibVpjXWFwe2NUWlI+P25wM0NCQD9NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKacm568oZuywK6tq6ynt6m3r7W/tLuvrre2qsC1qKmgmqWjoZyRqqmntaKyp66poJecp5+kq7idoqyalZmOo6KVjJ2gm5icn5GTlKq2sKiZlZysqZeMlKWZpayikZaqsqOfnqarsZmho4+Yopafm5aclqGTnamclJCrmYfUkpq7c7DDgMOGftWWm7h4iJCYjJeLjKeIeqS2dX53dsKCmrJgg7p5wHx1uGO1goyHqX2VgaupcXt/dLyIp6BpnWGmjq+hfox0h6p9vm9zvHSyg3V4gYpumohybo2kdL1ed31aYXm8a1pWXGp5XmphZWdjbXhvWlxZQ0FBc0BDRis1RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQj1FODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnm56ivaGXssOwraqrrLGnt6+2xLC4sK25rq3AsKujoZ6joZybkKijqrKktKWspZ6VmqqYpqy4nKKtl5Sfj6Sfkoycop2XnZqRlpKvubKslpikqKeUkJaknKSsnpCgqKufmp+oo7Ofo6WOp6KUopqcmJWjmJCvoJKUqZ6EkJi2f4+RjLeVeIKTmrV3bWtuc295kIWPinSfwbu9mnuBsahxgHORuYN8hoaMh418ioeNmHyku7m9nHR6tKN0d5d2dLB1mZ5mhmqNtXRycXe2jF5/en2JaIN5bnpji6xwdYV/WFunakVlWlRmYGNeY1FnZ3BsdUNOUE1EO1pNP0ozOzAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEFLTkdFT0Y/Rzw3PjcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVzgqT11dPSs6VlUnPjs8p56hor+llrTDtKyrqKyrqbqusMWts7KttqazuKupoaGlnqCdmZOqo6yppbWnp5+blaCjnaukvaahqZaTm5Chm5GPoaehk5yXlJiUsbW3rZmepKSii5KSppulqpuVqaWlm5mhqKWnpKmhka2flqSel5eXnZ6Pr6iUm6ahjWp9aZumd4dyfZmOdHlkh3u9vsC6b5ODcpaIYHJqWl6biWBjiI+Va2CAlWNtnXdilWyAmpWUZV5gY3Caimlyi32GlWdrf3J1eH1+Ylt3dIFoUFxtg317i2tYa3qCc0pKb4ZwTnRNRVhdZ2FMW1dnY19PW211aXFSUURFTTtHST1NPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFS09IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBfTCgzPltPJz8yPqmgqKLCo5u1urajrKWup6e1sazIq6+yqrOivbCxpp+ip52jm5mZq6auo6S0qKWbl5Sgm6atqL2nqKSUk5uVn5mSl6SoqJCdkZCYnLCyv6ycp56noomTkamaqKOamqugo5mao6eso6Cro5qwm5WnoJaUnZ+dl7ClmKGnmZuQnJyiopiloZmbmZmZj5WBZ219cXeSmJSShYu1qo2GmJWOioyYloeUlYqEk5SRiY6TlJiUmJaaoKGam5SgnI2CeqWFbWt9kXyAdYqKgXGCeHl2dYl/fIpqc4F0g3Vld313a296bWBjXXBoTVlaZmpgV1pveW1tZlRQRlM5T1pNUU8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSiw8LUCzobOiwKGksrK2oKmlsqelsLSqyKqsr6W0pcCms6CdpKSco5WVn6qmrKKjtqufmJaVn5atqaXAnqujlJGbl52XkpShnp6ip5OSmainssSwm6udq5+QlpaonaqcnJ+smKGbnKKkr6eipaifrpiXp52ZmaCenZyvoJyhppWXkpeTn6CUop2XoI6Wk4qKjY6XrpB8lpyDkoKLqqmFgJmXiYSQnoh6hJCHhpqSiIaKlo+bl42RmJ2klpmTkJyNf45nobOvhYqEdnuSin13eXpvZnmPgYCJanWBeYhzaXN/e3aDh4JrdWR5ZmBqZWNkZmtZbHtvaWtdU0xQRF5URUA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9iY2FfXV5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0W0c1PCxAtKC5sL+sq66ysaCqprKtoqyzr8Svqaqisa28orObn6aioZyYl6elqaWkpbK1npSTnZmZr6WtvqCropCRnZmZlJGVoZyXqJyEn6uso7TItKCqpKuXlpeapp2pm5+kq5Sen52gqq+qpqSroq6bn6CgmKSenJ+cr6OYnqeSl5ackaOYl6ecmpdlgpJ8ZX6NmpBjeY5taGt7kqSqamWbmH1nhoplZWloe46hj2tnjZiRo3draouZo5+Yc2xteoSOiHpYZl6Gg15tjIqBdlxoc3d2kYCIgm13gXh/c215hHR2iYiPg3xrh1lebHRkXnOJaWt8cWtkX1JOWElkWEFKND5HNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMllDOz8uPaagur26r6y0saqlqK2usKatrbC8sKimo62usJ6slp+jnaGZmaaqnK2jpaepsq2elKOPoq+ltrmlrqKOjpqhmZOSmqCZmaSVfKauo6i0xLiloqevn52VnqKeo5yjqaiSn6Gdoaqwq6ukq6CqnKefp6CslqGbpbCkl5uplaCdmpGjlp2pl519vYOIcrRyhJ2GrWh4ucS4cZOio3qmmZlyq4J8y8DAu3GMo4iCn32XmYmdwL2Cl52ejZ3CwXyCfJONmsPAfWylsm+MgW/Ken+bdpCDjoF1eYCAeXF6f4dwd4WMk3lueJRjZ2B4ZGBlgmNedGdsZGRZTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhDQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLiNGWzNQWS9WQUI7LziWo7nDtbCwwKmolKOvqLCuraays66ppKWmr6ufqpiaop+cmqqmoZyroqSopKS0pJyikqatq7ezp66ikZCZnKWSkZ+hmJufnYinraWsrsDAsaGpr6mWkp+dopqipKqjk6CinZ6tr6qtp6SkqKGmpZ2sqJGjmqitqZqcqJuroJWWpJWfopacfs6UeHqkgXmVlptfro9ejqeBoqB8p5abc6uDgK9eY42qe6iHhaB1l5OIs2OCq4ahjo2zaoSvdH2XiLdhg61ao81ukHZ72nt/mXB9h5J2fWV6h3Z2a3yHbn2GkZF+bYOQYXJtcGhgYHpkXHFoamRnYFJUU1ddS09DNUFIREQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSzAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGjqqets6umsqurqqOqpq+pn6abmaWXnKKvn6CfqKeipaCfsKuanZWnrqywqqirn5SRmp+kko+epZiep6OfrqassanAx7OoqbGulpKdnKKXn6mqn5Whn52drrCprKqcqKiloquSrLKWpaKqqp2ipaSgrp+RmKaYn5mTk5GXoHGFjJd1haiGcbF9nnKsfqKfgaWPnnargn2tf5xzrX+sh4afdpmSe3yXfqqIooySjJ1+q3uJlJCfgHutV53Fe49wk8F9gZVtdW+MbWV2ZYZvYXducm+JipKPg26SkWZwdXVxYWdtZV9vaWlvZ2RYVF1hWlJTRDlJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXlxbWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNXQEYhHEc6QzEuK7DTxsaytKCdo46joqKsr7auqLGmqKqmraurpqGjnZmilZ+lq5+hpZ+oqKKenbCsl5qWqKeuq6emp56XlJmjoZGUoK2bnaejsK2lrbarus6yraaurJeVnJ2imZ6urJyXoJqen6mzq6urm62rpaOrmq6xoaerraWYpKmoqK+hkZWio5mTkYSkaqR1iXqpdHqycIKmipmMcYmgm4ekYGBSq4V/roObdq2CqIaFn3qZl4Z7ZoCjiaSZhoKjfal+gpaHrl98qVaeo5KBeqOfgHvDr8WLcq+zs7lyYqmvwnRojIyYjoJunJVxb3p4eXBtZ2VlcnBmfWpjXVdgalhZVU1NUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioyUEtMIyBBOUQ0LCfCydXUv6GZq6egr6KesLSwrqmsoqemqKqrqaSmoJuknp2lp6ejnKuaoqyho5+voZyakqukta+uoKeanZWTpqKQmqKooKCmnLGmpqmyrrfIsrWqrKmWkZ2copmgpbOdmqGUnZ+nrK2ksJutq6OjqqGzraGqs7Ghmqinra60oZGUoqaXmpF7qmyehId1q3l8sG+CpYyJn5aWoJWB0ri0uMmBgbJfYJSpg6WIh6B6mJaaeKrJdJqklaipkZOajYGciprGxnlnoYKldIGfjoJ9r11wtGKwdUujh22nR4KTZI+QnpF8cZmVgXF8dX58blxmanNxZoFrX2FZZG5cX1lJTk1LRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqLKtrKWinLK4rKqhpZqopKqrqqafpqaYqqOfrqudpaCsmp6ppZyntp6il5Opq7WyrJulnKCUj6WskZmcqKOhqqeuoqWnqbC1w7Kzqq2ok4qXnKWboaOupZehlZmcpqatnLGer6mnn6yjt6yhsbivnZquprGysaOTlqaimJ6Ogp1OeJqBf596hKN9g6SFh6afnZ+UhLh7e3m5gn/MxsK2eJuhkYuffpqWl4p2npiKpJejqX+whZ2GoISsfZqVY6ZtpHCPhZCBfZaCcqxgo3NxgJpgvH1SVXSOkqOWe36Uk413e3OGf3Fcbm54cmqCcFtkYGlvY2RdTE1RVEFJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZZWVpbXF9fXl1fX11aWlpYVVNPSEA4ODIuLCouKyonJz9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu5qq6fm6GssrOlnqCVpa2trqqnnKanm6OoobOuoqmmsqCYqaSUo7aiopWXoqm0uKOboZyiko+hsZmem6emoaKwrp2mqaK2ssWxramtqZGHkJyonaKknKWXnpmamqalq5uwoq+lp5ivpLusoba2rZ2ctLG3r7Gll5yun6KdhY/RtcO3eYeOhZGTkICmeZShd4ygkoSlgYpxqoaFtG5yaZqknJWKn3yYmYaHj3OvgqWboo6mi5Odi5aQm25xsl2ldJN6nGyZf3uZfG2pYaNxcX+fYnOyuGh3j5SmmH2NjpWOen55kINuanlpenNvgXVeZWVvbmZoYEtbWFg8SEhAVTRARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVtbWlhVUlJRRjoyMjMvLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWSc4yKrb6/vLq0npanpK21oaKZlKKopq6rq5imo5+loaG2p6Oop7CjlKyjjqStop2Qmpqqs7OknKScqJGUl66fn56npJ2onbabo6uktqzEsKmrqaKMhI6coqCmopaZmp2ZnJmnpqeZraivpKabraa9rJS9r6yfoa+yt6mypZqosKKnl3mokX18sHeKgKSliJxtsnChh618oY+Dp5WYgKyJha2FoJWqoKKXhp+AmZWAe5J+q4CdmpaLq3idoZKKlJKBeq9epIF9pqdknYB8l3Nqr12la3CFmV1gW4ygbZWRppmDlo6ajnx8hJmAa25/Y390boB6YGhmcW9paGhDWmFbPktVM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFSU1NWWl1fYWBhYWFeXVtaWFNQT05JNzA0Mi4qLEFUVlZWVVRVVVVVVFRVVFRUVldXWFZVVVFIRklKIygovZOag6jFwrbAs56arKCtt6Wjjpukop+wsKqfpaCerZmeuaGjq6CvqZmuoZCrqKOWiZqQrrCspp6lm6yXl4+soaGdpqGapZ2umKGop7epwa+kqaSei4GOm5qfp5+SlJmblZuapqWmm6qsraSln6movqSWwqyqoqCqsbeorKWesq2nqJd1r36Qi5yFh366rYqZZbCNZZWtfaGPhKaVmoGsioSwhaaapKGhkYWhXGxqgbNgf617e4OBsW1nb5mZjIixW361XKSEa8iiZJ+Ae7xYdrRZsn1SroB6rFiAoW2Yj6ibjJiSmpp8epGff2V1f2OGeHSBfWJqZ3FuZ2ZmUFVkXEFVYD5JKD45PTQhIiwlHzIuICoxLzA0NTc5OTxBQ0ZISkxOUFFSVFdaXmBfYGFiXl9cW1hVUE5KRkM1NTMuL0BVWVhXWFdXWFdXV1dWV1dWV1hXV1hZWlpbXFhXV0dCO9KfsrG3vbqzwbKinKympLWpoIqaoJ6cs7Opn6ShnraZoLSoqqyer62drJuVr6ehjoibjq+rqKahpZmukpiPqZminqWfmqOjpZmgoqqzqb2vpKienY9+i5uWoaGakJGanJKamKmgopqprqimpqKkqbueoMampKigqbOzqq2lnrqsq6uUgKmSo6+Om4CHpJeZkIKAuMO6g46ck4Snl5yCrIqCr4innJumqpB+1b3CqmKjv719fqOChNe6uLWFlZODnr2+hG2jgm+rhGycf3qysMeDaauwvax4d6K+vHOAlo6nnZGbkpqge4OTnXtkfntlj2d5gnxhbGZra2NRYltTalw/VWJDTSk9OjQvHx8kHyUyIB0kKDA0OTY2Nzc7PkFDRkdJS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PUE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbOzsL+4sbyyopyupqWypp2LmKXAqriyqKLAp6iznZ+ynbqon62vpaeUlLCrl4yDm5GupaKsoKOcqqCXi6OSpp6nnJqhqaOZn6Gsrqq6raejmpeTfYiZkaack4+RmJmPmJSpm6GZqqmhq6ego6q7nqjEop+toqiysqeuqZ+5pq2tmXN2qqW4hmSJoHBorpGLkG5ud6SQmZ+Bda6YlHCPi3GVqKOal66kcmxsbGaLeG9ugplxgXpqcWlnipeWmHFpaYaIZ3GGZF2IYmpvWVxmfXamX2FxjpFuZWR/jZOPopmZmZOaon6JkZh3Z4l4aY9reYB6ZW1kZ21jS2VYSmtaOlFmRlEnSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1dXWV1eXl1cXFxdXl1eXVtbVVdeqZSss6m5uLKzqqmhrp6js6qYkr+zxcq/t6qfwa2upKKorJ+6o6Suq62mjpeuqY+LhZWWrZ6mqqCdpKOgkYulkqeZqZqXo6qhlp6mp6iwu6urmpuTk3yElo6mmY6SkZmVjpiWqZagmamjnLGmnaKruZ+vwaejsqWqrrCpq6mltaKstpWKoaimt52JlqOZiKqbkZWdkqmzmZqjqqCylqKhnZ+inKGlopWrp42SkoyHk5ydlZGZk5mRj5WFgaWbmJaOi5SUjJCHhX5niX50gnVzh4pwp2x6k5CTkoCBjY+Qj52VopeamqWEiZeQc2uRd3GMeHd9emptZWRwZVVhWUBqXEhjYlBZK0Y9KychNzUwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhUVlleYGFjXV5UUUtFQz45PUBBU1hbXFlXWFhYWFhZWFhaWltcXl9fYF5eXl9fYGBgX1lZYKaWqKqktLaurqGwo62foLaxkI6syL7GvLqro6afnaefsamjtqedqbSmqJGYrKKLh4mPnKeVrKSfmKeenpKUo5eomqialKahpJGcqZqitrunqpiakI19gZWMopWLlZGWkZCUmKaQoJuqoJ22o52mq7enrsCtoralrq6vq6ensbafrbuYkaWkpraikp6noI6qoI6Tn6OrsJqgo7Cor5ijoJyjqp6enp2XrJ2TmaGblJCWq5qOmZmXkZafkYihnpaVhZKNkY6Vi4F+ZouFdYZ1eIeCc5xqhY+Sk5CJfYuVkpKYlKOTn5mkhYqbin10l3R7jIBzfH9qb2VfcWpgW2BabmRQYWZRWjpHR0U+Mj0+OS8qJispJh0mNDE2NjY4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWFlVlBLQUNCOjlFTVZbXl5bWlxbW1tcXV1eX11eX2BhYmJhYWFgYmJiZGJcW2OXlaOnoq+xq66jqaasn6e1qpCPnaW1vbCuraOkm3yfpLKkpbGpl5u5pqOTmaqcjoaKiZyij66eopWon6CSlpmbrouplo+omaiNmqqQn7q3pKSYnI2JeoKUjZyUi5WSlJGNkpejjZ+fqZ6fuKN/g6+1oq+udKO8orCed3iep6+4lHWso56JgKt/ZFxidqCPpZ+EmH1tkrOco6etqqJlnp+Sc3mal3GBmaiYbX+iqIplnKadkpiYlo2SnJCGnpuQloSSh4+QkomFd2qOh3aGcHuFf39gaIeJk5GLWnWUkGdokI9ze6icnGZ7m4qFeplqhYyEb3qAa3JlYHdwbGtpXGZmYmJxVFs+Tk5OU0c+QFVEOjEvHh8mNDozMDY2Nzg8Oz5AQUFGSEJHRklLTVNUVVldYGhmZ1hRSjxERzw4VVJbYGFiYF5fX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5Wmo6Cur6yrqaWoraKnraSSlqu3sbOnm6uorZh0jZ6xoKirp5SXuaCgj5yknZF/iYianoyrmaGUp6GdjpaSnoR2rY+Ip5upkpmlip27tKigmZiLiXV3k42Xk4qUkZGUjZCUoY+coaeZnLKVgIybtZ2zjJKOuqaffaeieaCstH+OjaWeg4uGkLCqr42Ll6SbeoGLrIWcnaGnqKeHlYWYd6WbeoecgZengoJ7nLJ6ioahmJqVmJaCkZeXhJuZYnqHkIWPkJKLg21wjYd5gHB/gIR+hXOFg5SReJZoknSgmnV9mYWjoImYf5SMhYWaa4+Ohmx5fHFxaGV4cGpsa1xlbGpmdV1eSVRMUkBFNi5aVVU3KSEwOT4+NzQzNTY4Ozo9Pj5AREk/SkVKS0dTWFtZXGJhaGZaUUg5RUw7PmFWXmJkZmRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXop+mrK2rqKygp6+mpqmlmZSvycCxopeoqrefkYWerZynoqCOkL6emoyfmqCQfIWOmJeHqpuglZ+gkYyTiYaAkaeNh6OepJWZn4ifurKonpqSjoVxdpCJlZCKlJCPm4yQkqCSmKGklp6rh5+0ibSarYrKh6msiLaFjbCBr6yCqIymmI2dfaiPc3t3nY+nl2iVpHm0jJ+epqeSmMKBf6uImKFynoCapX2XhZWygaF9oZShkJiXgY+UnIuZkot9hZOHjZaSiYNtco+FfnlxhoCDe4N0hICWgI/FZn+ph4+ja56FpJ2FmoGOj4eLmnGQlIZpeXV8eGhpdnJoaGxeZHBtZ25ZZ0ddUk0zRTQ3TmJkNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05JSkxDUFpdXFdhXmlsXFFFPUtNQEpjWF1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUlqKfr6eoqKWrn6O3sKmrppqUoKSlrKWYpqy5pLCBoqmdpp6diZS9mZONoZKej3mElpWRh6qYmpqZoYSOi3ebnI+fkIiepZyXmpmIpLmupZqcjIx+Ym2Pi5OQjZCNjZiMkZOgj5WhoZmhp36hp4etnaCWrY+dnJyQhYCgjKmshaONqZmMmn+idYGZlGyCrXZNq3iHjZyRmqimgKmrfYOhe3qnap5/kmtnl4aXt4mefm5gZFmDl4CNe2Roi3KZfXmWbF19l21fUnCDXF9reIJfWGSBfIN/l3CnqmuDo25ypXCfhaBqZ6BtW2+MfWdaYISBY1hRcHdmbnVza2pvXWpxbmxqWWlPXVlGOUE1SERfbDUsSURSTU49ODQ4NTk7NkA7Oz5CUD5RUkxNQkpcXV9XXV5idWBNRDpNT05UYlxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5WdoLigqaOmrJGgtruqrqKZmKGjpq2voZ6wtqSpk6KhoKecmo6ZtJmQi5+MlYt1gZOSjIqmlJSYnZ5+koWFrKSHm5CKmaqZm5uSiaexp6KWmoiJgGluiIeLjo6Ki42SjJGTo42Un5+coqR/k4GPoqGUoHaclY+ngqCmf4Wnq4OleIl8hJp+onBzlIiWfJ+NeW2Gm4yZj5uomY6HnXuConN2pmaefnekX5h6fZN0om6Yt7S6dJOIg4C1qGSBxrh7cJW2jHKAmqNic6yrYHxpnbN+bXyGgY2Ci5hxf6NscqN0n4WBpGGdmbOWcn2Yn7N1dFyesoNrY3B1d3Jpb1hrbXNzZ11pXmJMRT1ENlFCWnMzPVNHYEpSPTwzOTU6OTZEOztASlA/VU1PUUBEX19bWlhgYHxkSEM4TVdVV2JhWmVma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJOVlKO3mKqbk5+NpLa0ra2gmqKdpKOmr52cs6+tlJmimqGlmZuVn6ubi4iSeIuFcYGWjYqPoI6SlJ2YfZCJjaigh5eOiZKklZybjYupqKWekJeHhX5qe4d+fZCNg4uRkYmQlKGDl56gnZ+ei4l3nJiijZ9xoYqHqYebpY6Upql9rYx+eqCZeqOTeIF0loiNnH2Wn4abjpibpYWiZKF8iJaQm41tnmibjm+amXqAi6d9cml0q4Ofg3SqaJWaXZuFdoWeZ6prgLhmXKhwgZxglYxep3Z1h4h+nmiadYaTkpeOgJ9vmpFup5pdqX95u2t+qlyOhF20aF1ucnp4a2lccWt5emRgZlhiQlFGTzdXQ1JvNUxbW19OWkRBMjUxPDs3SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5bXllkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FgZGVla2VjaWhna2mVm4mptJqniGOUm6u5sa+snqacnKmgn6+cnrKprp+YpZuhoJmXl6CjmYaJjWqIgHJ7l4iLlpWDkZWYkHqKhJWknIqUj4aMn5OenYmQqaOgmoySioGAaYGGeX+XjHuJjo6IkJebf5Sinp+hk5hyaJ+Jn4+McJKMgamHmJ6hpZ6me7Cto6K4l3ejs6OkgImUeZ17q5l+oo6cmpaIl3GhfIWNr7V9a5qRoXl+mLWipKuohJl8m32em390qlpdb3uWi3ieYkx/e3qFY3mXQkyfWKJqcXuObICIhJl1m3iGibGzf4Cbk6d3g55uc32VcJp0a6RelXZIZWRhdHJ/f29mYGxpd3xlZWFRX1ddVFdAWkZRaEVUV11iWF5JRD1COD9COklGOExFWEFXUltWREZiXFpgS2BtfnJFQjxVX2JaZWlWZ2htb2JmZ15hYVxdXmBoYl9lY3ZtXWVnZmtkZWxpaWtpk5yAsK2ZhFNeoKazubKyqZqijJysnJyqlaKtpaOpkKCfnZualpmhnZaIh4l3hoFveZWFkZuKe5GTlohygIiSoZxzkZCBiZqWoZyFj6mcm5WLi4t9g2yEhXGCoYx4ho2IiJOZlnyTo6Ceooithn21hI6enXullnqpgJWbj4mfm3ynaHdtfpl0oXNyfJ6GmXCTg659pIOlnZmAo29eqGd1omNvpWGc05B9e5l4c3NiooaQfqN0pJB2a4+zjGCCmIlzqrKovH93g21+v6aptF2bbXxwlm1/cqJyXaRnc6ZgaKZtm9SafoabcHp7l2ycfHiXc26ppGdhZXpygIVsaGZkb3Z4aGBjU1xmUVFiSFlKVWFXVFxma1xlUUZDS01KS0JLRThPQFFOWFNZT1NRYGZmalJjd3l3SUZFY11lWmhqVGloam9jamdgY2BcXV1faGJhaWV8ZF5kZ2RrZGpsZ2hsaJeaf6+qVFxLfqmvsbOvsqObmYWZqqGipY+mqaGaq4ubmZmUmZOToZiOh4V7cH2EaH2Pg5SagHeRjo+Jb3+FjpKSbJeTfIqTlKWXg4+rm5STi4aJeYN2iIFugp+GeIGShoiZo5h7lKKjmZ+Js6Gitot6rKekrqVwqYCajoWAmpB7pIChmYaYcp6EpK6vipeMgI2kjZWDraCTdrW2tcmhc5SLgZ9gnpepbXmWh6CbdKKId6B+k5eLgXBNZqOScJuHc6R7eXRhg4FrfqBrcWRfnHF9c5ZoeWiytbTGpnOYfXqda5ybq3aFm253eZhqmnt1mHJRRX2zX2p3bHqIZ2toY3V1cW5XX1RZaVBTaElXTVlUVl5pbG9WaFdOS0FKTUtISk9BUUtQZWNqbWV0cnN/eXxudYl7e1RRT2xeaVxraVJqaGlsaGxmY2VfXF1dXmliZGlre19dZGdjamZvbWVpbGWhm4iupYNkP5Ohsqqur7WiopCAmKujo6aNpqifnqeEm5iXjpeQkJyTjoiDemp5h2WDjX+YoHl1j4mMgWmEhZGCjIWdjXqOjJemlISZqpiNkouBiXqAfYx5cJChhnqClYeJlqCWf5SlqJyVlYNmbnicbKJke3Gld5uYcGemgJWKeqR6n5aDl3Oed4GKlZePuW6RiqJifZmglYhucmmqa3WgbW+mYJtpi5BploeblnWigX6aYIyGjXVwiGJooGWefmmbdW9jZoiBbXGiWl5bYqFsXYiLbnp9cXFkpW14omRnp2iZc4yZcKJwVYmQb6BfZqhUi15UmG5udGtzg25xaWx5dGtwUllXV2ZaVG1JWlBdSVhpaXNqWWxXUVJGVlxMWFNhVWlrX3d0e31wfHxyg3uAc3aNgIR2XlJyYmdjcGdQamhoa2xuaGRnX11eXWBqYmppdnVdXGNoY2pqc21ma21jnKOXpXlkc22Lpq2jqbCxpp+LgJisnp+njaOinKSjgZaZlI6akIyYkI6Ke4dxgIhpi4t8mJtzdYl+kHtkg4eUiYqVmYJ8iYiYqJKBo62RhpCLgop+gICPdGmQpoR9h5SNiJmgj4iTqaadiKZ4lZt+pIiWi7GYnZCCr5efpXaUhnipc6WPhJpupKKMkoSNg7tufaWvg4aFhpOVnJ98pXpyqJWglmeefm+sZJaKlpN3qG2qooGJdomDd6uRpohrkbBrdrOMqWuKhW1tn56SlWB+q4uqdn5+iqSed598g6SVnaBqm4h4rGifroy2dHe+jaSTWoOnjqthdnN1cnx1cWNrf29pbVNXW1ZhYl1rTV1SXkpebW93YFtxWVxgW2d0ZW5vcmNydGB3en55cnmDc4R/gXt7jIGDgHZieGRjbnJkUmtnaG9scmpmaWFgXlxha2JtbHpvXFxiaWJsanhtZ2xuYpWkqZyBf52jlqmpnaimrqSZioKYrJufpoqcpp6rnoWNm5CHnJGGko2MjHOGeoiEb4yEfZmTdHSGc5KCbX+LkYeGk459e4KHmaePgKenj4GOiYWVdoKHkm9si6mBg4yUjomdn4mMlKqin4+AdZSXiH6BeZSuon+BmnGPhneOiYJ9e3KnjHJ+fXqYlpuEkHl7f36HlJWTinaQmJ6gg3t9iWuMhVt5eXJ6cWlufpKJcYB1gY+Uk3GHhIJljH9fgX+Ld3RylHVveW5th2yDhV11Z3eOZX+AhIynmX10e5VqiYhwgXZ9h3dubmiNdHp8mHiFXGxYeY9pb3hzcnB4eHBdbIduamdWW2BXXWZrZFZjVV9SYHB5eW1rd2Zra2t3fXJydXRhb3ZidHuCeHV6gnWAgICBeIuFg317bn9sZHluXlduZ2h1a3hqaWplXGBaY2plbXF0bltbYmxkbGx5bmhsb2GNk7eopomgopqmo5iknKuioYSEmK2SnqKKm6ibqpmDgpyMf5eUh46KiY1xgnyPfX6OhHuYj3RyhHGVhXt9kouGho+EeX6AiJulj3yoooyGkJCFlYOGjph2coSpho6SnZCJn56IjJunn5+qg4mOlZp+fomWraePkaWPd2+bj4F4kG5+qIVxfpVxa3B9gqCNgJOOi2hsXIKLi5uano5zlYuIcXRrgnd0gVlyboeRgX5/jGpdamV7hoSJgGBpeHqae4KKgXWBhYFnd4qGal9vcYF1XnGJgIiNpJSFZYuNg253i4Rxho96cWhpZnyEe5ZbXGtobnZbfHl4dm90c4NoXW6La2tiWlpfW1lscVxfYVpfXmZ0f3x2cHVka2trfH1zfHl1ZG51aG18fnd6fHt5eoCAfm+GioR7fXR+eXN/aFRccWlsdnB1Z2toZF1hWGtoa2txcm5XW2VubGdzem9oam1gi4qpsKGPoqGanp2Xnpioo6J+g5mujqCViZ2jkaaVgHyYhn2SmYqJh4eKcn2BjHaFi4GEl4pyb4BymIaDfpKDhIaJgHqBhI2coZGDqKKIeY6XiZWLi5yXhIN6rYKRmJqVip6dh4ihqp+hoqSLiJObnKOZlaqhp6afkpqGlIx6do2Ng6d+f5KQkpSdsqablZ+QjbGSl4OljIyVmp+JkJuCiJGKa3yOd3hlg4eRi3yJnoSHjJCJiYGFhJB3fHp0maCIhomdiYSTfn2KgH90bnKEgX12hYWJjqSPgoWMhoKMkIx9iIyKkYR6boSFfnqZa3NpYXSKcX57eHdweHWCXV5vh2huX15aXV1TaHJWZF1dYm1odnx9dG9wZWtqaYB9bnmAcmpwcWxngXtygoB4f31/hHttgoyGfHp4e316g3hOY3Zqc25wemVrZWNiYFt0ZnBncnFtVV1sdG1peXpxZ2lrZIyHnLmelqGgmJSYmZSYpKGefH+arI+fjoegnYyeln15lYR8jpmKhoSEhm55gYFzgYd9iZSEbWt+epeHg4OPfoCHhIV8iIWPnJ+TiKyghHOLkIaSkYudkX2Ne6qEjpOYlo+cl4eHm6WfopmchYKSmpmYj5qnn6WdnI+Vf4+IdXuGjYSle3yOkJGGmauinpSdkI6pjZCAnYyIk5mego+XfoaOg294hnJ1YH+EkIZ1jZmBg5CDh4V/hYSVbnl2dJKhiouFmoSEjHN/iXt8cXF6h4J6d4iNg5GljoWDjoCDiomKd4aJi41+cm2Agn1vaWxuaF56f2l+fXd2d3Z7eF1gcX5udGBjW11fUmduVGZbXmJraXZ6f3JsbWRramiBf2x0gmxsdW96cIZ6boeAdoKAfoV2cYKNiH57fHx/e4KKYGh7anVpaYJkamNgaVxjdWhvYnVtbFVjcXllcHp7c2VqbW2LiZ62maCjn5KRlZiLmp6fnnt4n6eRnIuHpZWMmZl6eo2GfYmRhIyCgoNufIB5c4GEfYuSfWtofYKXiYGIjXt9hoSGfJCDkZ2dk4mpnYFxjIuMkoagoYqFjHyokYmQkpeTlpN4jaOfoJ2VmH6AkJqYkoybo6GjmZaQmn2Mg3d/go6GoH9+jIyPfJiloqKTmpGQpoyPgZqRiZKXm36Tkn6HjoF1dIJxd2F+gI6GcouWfYiMcox/goWGj2h4cniLmJGPf5Z+iIlygYZ7fHB3eoqDeXiPi4KVpJOKhY97hoaHhHaDhImJfWhzfoF6fHJtbGhffnRpfXZ2dH1zgWtfYHR2cHdkY1lfX1JraVZmWmBhaGp2eYJxZ2tkbGhmgIBrbn5ob3FsfniHe2yMgXOBgX6BdHaCjYZ/fHuAgX1/j2lyg250aWGHaGxiX3FWdG9sbWB4aG1XanR2Y3V6e3Jiam96iYyesZGlpJyOj5ePhpygm519d6WhjpiAjaOLiZqWeXyGiH+DiX+JgoF/cn97dHaDhX2KkXdnY36Gl4qCiot4fICNg3mXg5aZmI2XoZx/cIyCkZOGpZuHjImDppaFk4uWl5OSdpGdoKGXk5V4fo6Xl42Wm52knZiSlJp4jYSCd4OVjZ1+gYmNjHOXo5+ilJmPj6KMioKWl4OSlpl+mI18iI2BdnF+bntkgHyLhXGHk4CRgmyHg4GAiYVmdW97hpGXi3yTeIuIe3+Ge3pxfXeIhXiDj4eKl6GVgYOLdoiEg4J3fIOKhnhhenp/dYB5aG1mYn9qa3h0dHd+cn1jZGFzbnVybWFaYV5bbGVTZFlhYWhrdnmGcWNrY21maHyDbWl1aG5waYB9g3pukIZygIODfnR8g4yBgH57goN+fJBtdolzdW1limxqYmJ1VoRpcG5geGdsYmp2cGZ5fHpxYHJshoWPm62XpqeejYyXh4afk5eZfniqnYuae5edjIyZkHl8gYx+fIR8gYOBeHR5enR9gIR/iYuAZF99i5SHf4SGdH1+i399mYaXlZiNpKKZgHOHe5ORiaaPjI6Kk6CShJKQlJeRi4GPl5+akY+Pcn+NkZOJnZ2eppeXjJSVcouMiWuEl4+ZeoeIj4lvl56bpJSVi4yei4aBkZx/kpKVhpmIe4qKgXlxemx1bHx/i35uhpODlXhxgoR+fouAZXJpe3+VloN+jXSQh4J4hn11d398hIB7gouCi5Ojj3iDgXSJh32AdHaCiYVxYnx2e3J+cGNwZGV8Y29wd3N5eHR1YndgcGx2bm9cXF9eXmteUF5ZY2FobnR7iWxgaWVrY2l3h25nbWlrbWiBfXt4b5CIc4CEhH10gYaJe4N9eoGEfX2OcnqLeHhtbIdqaF9pcmOHZ3FvZXdnbmxheWlrfXt4cGF4bYuAmJipn6SonYqKkoaKnYuVmH54r5mNmH6flJGXlIh3fnyKfXyAd3iAgHB1dHxvhn2BgYp/fGFcfo+RhoCDgnN7gId6j5KJk5KdlaacloJ9gX2OipGjiY6KjZiajYaSmZSWjoqIjJKcko+Li22EkI+RiJ6ZoqCWlYiWkG2HmINlhZiOk3qJhJCKcJablaOTkomLmYyBf5CdfZKOkoyZjnuKhYdzc3ZscW51fIp0boaRj5NxdYF8gYGIfGVwbHl7mJN8g4h0kImAc4d4bn98gIV7hIuHgouUp4x6hnt+i4V4fnFwgYeFZml6dXZxfGNfcWFrdF9xa3t6eWxzcWZ6Xm9sc21yWFtfYGFsXFBXWGVjZ3Fxf4hnXWlpZ2JncY1vZGpoZWlpgXp3dW+OhXSBgoN7dYKIhXiFfHiEhXp/iXd/i3t7cniDamtfcGh0gGtyb21yZ29sZXxjboB6d3Fsd3eKfqKXoaegppuHi4uBj5yHk512gquVk4+IoY2WlJCAdHx3hXh5f3Jze4Zrc3B6bot2gIGHb3BbWX6RjYeAf392dYCAgKCHkouUnpqilZh4in+BjYicnYqPhpKYloWJlZqQl4yMjY2MnImOkIJsiYuRkYqdlqGbl5SEl4Zpg6KBZYSciZB+i4OLgXeTmZOfkpGJiZSNfn2Ol3uRjI+OmpJ8ioCCb3ZwbG1vcHuGaXSDj5mLcXeAdYKIg3lmcm51f5iOe4eEeZOQeXWHc2+IeoSKeYqFgYaNm6KHe4N1got/eHlubIGFg190dXRycnlbX3FhcGtfcGt+fHFubmtud2Fwb2txbVlZYmFib1lRVFpmZ2N1cISDY11rbmRjZmuSbmBnZ19oa4F1cnNwi4B1f4OAeXaAi4B5hX94iIZ3g4V8hot/e3aKf2pxY3xjhnxucW10amhvbHZ4X3F/eXx0dXSAg36klZqsnqeWhY2Ef5eUg5CgdoyglJOHjJuNlo6LenJ5dYJwcoV0cXaIbHBudm2IdoN+gG1tVVGBq5SGgnd/d3KDeoOhg5OClZSanZObeJJ7g4ySo5mTjomVmZKEh5eZjJSLiY+Ph52EkIp7couFio6InJqfm5WTf5N9Z4SbhmeFn4eRhJGCiXGDkZiQnI+PjIyPjHd7kZB6jouMkpaMfIh8gGt3am5rbGx7f2J6fo+XgXZ7gXiDjH15Z3Nsc4aUi36HhXqSj3F5g291i3mIinmIfICKjp2chHt6doKLfHdxamyChHtheXFvbXN0Vl9wYnJiYG1venFpcGZndXVpcmxid2VdV2ZhYHNUUU9cZmVdeXCIfWBcaXJiYmVmkWpfaGVbZ3B+cGtxdIp9dnyGgHV2fox5e4WBeIiDc4aFfoyMhHx5lXhmcmqDYIh+b29remBqbnR/dV90fXmHeHRzhX14oI+ZsJyljoKLf4Oah4CMn4CLmpSPhYiYjo+PhHd0d3SAcXCFdHByhHBraXdug259fW10c1JNgt/IktaTe3B1hHaFoYSUd5aRmZ2RmXuUc4WQnqGSk5GLk5yUhn+XloiNjYeRjYebfo2Ad3qNfomMipybnJqUknmMdWaHkIVrh6KEkYiWg4ZjjJGZj5WLl4yMiopxepSIe46IipORiXqGfH9tfGVzb2tsenpbgXmQkIF6fn+Aho57e2lzanOKj4mBhYR8lIprfX5tf4p9ioV8hHmAjZOZmIl8dXeDj3hzbWdxgIVubHVwaWp1blNfcGVwWmBtc3lobGtjZ3lzcHFkYHhhYFZsX192UE5MYmdjXXpxiXVdXGV2YWJlZY5kYWdiWWlzc25rcXaMfHR6hoJ1dn2Lc4CGf3uJf3KJiIGRi4h8fph2ZXNufGWIfm5wbIBZbG55eXNgdnp7jXZyd4p3eZ6Lm66aoJCChXeIlX58ip6IhqCSj4WMmISTj4eBdHhweXFvhHBtb39zZWV5cX1teX1qaGtjpJrB3K7woXNsdoV3hqSGk3CXkZahlZyBknKGi6KXiY2Wi5CdloOBlpCFiY+AkYuJlX2GenV/iXiHhI6cmpiYjo92iXVthYiJfImig5GJnISFXouTl4uPiY+Li4SJbXuWgX2IhYmRj4Z2hn5+a31keHZqbnlzWIl7koiFen6BgYaMf3lmcml/iY2JgoF+i5WEa4F1bYaPgY6CfYF4fo6UkZePdHJ3h4x1c3FndnqEY3VucWNqdmhSYXJobFZgb3V6YXJkYGl/cXNvW2RyYWJXbltdeE5NTGVnYl53c4luXFxkeV5fZWWFYGNjX1lqc2tua3N3jH10d4SBeHd7iXGDhH1+iHt0i4mIloaMf36Xc2d1cnlsjHtudHGBV3F6dnlyZHd5hoxpdoCJcn+chpinm6OShH1xjJR3eYyehYWhjY98lo2AmoiEe3N3cHRqcIJsam18dV9heHd7cXV7Z2BkfOvatcnD3IdzbHSCd4ucio9qmZGQnpaUgYlxhYifjYSLlouMmJR8jZOIg4mQe5CLhY6Af3V4g4RyiIKTnJaUl4WMdYZ9b4OBh4aYoYKTjJ6DiWGDlI+HioaKjoeBh2l8k399g4SJjo2Ccod/f3F3aHZzanR3bFqNfZODhX2AhIGEioJ2YXJriIGOiYF+fpGQfW2Ba3eFjoSQgXuAfH2PkY6UiG1weYyFdGtwbHN5gmF1anBebHdhUmVzaWZTYHF3dWFwYF1ohHJ0a1hoaGNpWW1XXHVMS0xmZ15ic3OFalxcZXleXmRne2FkX11Za29mb2p0eIp+c3OBfnt2eohzhYN8f4d2d4qGj5mBjIJ7k3Vsd3Z5eJN0bnh7fVh5hnF/b2d4d5KCZHaGhXCKloWZoZqiioh0b5KMcXePnH6LmomJfaB/hJqAgXhydG5vZHJ/aWZteHhcYHl7e3FxgGlhZ2F/1baOkaZ4b3F4fXGUko6Ia5qPiZ2TjIZ7aYeLmYaBkpGGh5iOfI2NgYGJjXuOjH2IhHpzeoN7cYaAlpqOk5OBiHSChXWCf4mRnJ2GlY+ffohif5OHhYiFi42AgINnfJCAfn+CjI+Qfm2DfIN1bG13dXV4dmxjjoGPgIV+fYZ/hIl/cF9xcIR7jouBe36QiHlwg2V5gYiFioB6hHx+ko2PkYJtbnmLfnVtbmtse39kaWxrWm53WlNqc2liUWNzeG1jZl5aa4RudGJcaF9lbWBvVVxwT0hPZ2ZcaG9ygG5bXGNzYFxjbHdlZV1dWmxtY21qc3eGf3Fwf3x9dHiGeIWCfICHdXmJgZOVfImGdoiBcHh5e4STb257gXdeg4B0gW1penSUc2dziHxxkpGDmZ+boIaIdnaUf213lJh/iJCEi46afYyad352cnBsamF1fWdianV6W2B4fHpscH5lY2dnV52PX3Fzlr3FhXdylYuRgHSYjIedlI2Ic2uIj5WAe5SLgYSbjHyKhn18iYx+k4d0h4V2dn2CcXWGgZ6VhpSPgoJxfodzg3qIlpuWhpONnYCIZn2TgoCGhIqJcoF9Z32Le3l/f4eLj31pgH2EdmZweXh0eHRsa4+Gi4KLf3mDgYSEgGtecHZ6fYuHhHuAjn9+coBoeIGFiYSBd4J7f5WKjot8bWt6iXx2dG9oaH53ZV1yZFlwdFNUb3NpYk5odXlnYV5dWW+BcHRaZWNda25hcVBabFJEVGhiWmxvbnxwWltebWNaY293ZGdcXWBramNsaXN3gYNxbn57f3R1g3qEgnyChXZ+iYGWkXiDinSBiHN5eX6NkG9ve4FxaoJ5en5ubXx2lWtqeIR0a5OMhZ6YoJmFiG9+jHZqeZmPgIKKgpaYinmPlm96c3FsamRgdHtpYGZye1thcn16ZnB6YWVkjrGyd0tiWqXa0phzfJKNkXp/loyFmpKNhm9shZKReXmThoCEmYp8h4B5eImKg5V/bomGcXN9e2p5hoOlkYSTjIJ/bn6CdYJ3hJqXkoqTj5SFiHB6koR+g4SJg2+BeGiAhXhyf3+Diod8ZXx+hHZjcXOAanpxb3WZjYaEi3x3eYCEeoJrXHB8cn+Hg4h9hYd6iHGAbXCChY2CgnGDd3+WioyDd21sfYR+dnplaGp+cmFaeFtacm5OWHJ0Z2BLbnd2Yl5cW1l1fnNwWGdeZmtxX29PWGlTP1lnX1txa2h6clxbWWtlWWNweV9oXV5lbGhmbGlxeH+Hb21/fYF1cIJ7gIF/g392gYWJl4pxgo1xe4Z8enmElIx1a3p/bHB+dH99b3J8e5Nwb4F/eWaSioKhmJ2Rg4Znh4RwZ3qXin+AhYKaioF8jY1peHJsbGZfYW95bV9ib3lcZGyDemFxdl9kZdXrvoszOj6Lj4ByeYaKkI54hZmOf5SOjX9ubYWMi3V9j3+FgpWJfIN4bnaHhIKVdm2HhGt1e3VleYOEp4yDj4yDfW1/c3WCeISaj4uPkZKMjId/e5KIeYCFjoNsgHJpgH54bXx7gYqDeGJ5hIJyZHFpf252cnWCnIyBgIZ/dHZ+gHOBb1trfXN4iIGKe4Z/fIh3eXBrh4KOgohwgHd9k4mKfXNtanaAgHV1XWlpeXFaV35UW3JmTVtzcmZcSnJ5cV1bW1pedoB2aVpiW2dmb2NqTlhmUT1eZl1edmZfdXFbWVVvZFpkcXpcaF5gZ21namtpcHh9jm1qgoSAeW6Be32Bf4J6dYKBjJOFcICLbnd9gHt7iJOJgGl7fWt0fHKGe3N2fX+MeniEfnxrjIyEm52WjIKBbY1+bGl/j458fn+DlIJ/fYqIa3VxZ2ljW2Nnc29gYWx0YWhwiXphc3ReYmOboJBuXTZbsLZ1aoCJfpSHd4iZh3WQjIp3cG2FgoZ0eYl4iX2TiHp/c2d2iH18lm5vhX1odnluZXqJhaWHgIeNiX1tfXR+f3uKl4aBkpCYiYuFinyQinF8foZ8aX5ta4B7eWp6doKHgXJgd4J+cmRyZ3aDbnV8hpWSgn2CgHB3enx1fm1XbX11c4mAhXaGdIKJendybYh/jn+DcX17fJCHh3ltbWhsgoF1bl1oZ3VyUlx9T11yXU9cc3BkVkt0eWtYWVlaYnKBdmFeXWFnZGlqZk9aaE5BYWRcYHdhXHVtWFhTdWJaZW9zWGpfYmhrZ21saXB3fJNsaYSKfXxwf357gX+CeneAgImLhHJ7h29xd4R/e4mNj4RqfntueHl3ind9eICCh3+Efn56bYSMiJijjYWEfHaLemtthYmTen17gpKAgH6KhHBycGNmXllnX3BwYGFocGZqb4l0YXRvW2BkanZ7f7+dqKXJuHKFhHSVfnqJlYR0ko6HcnNwhHqCc3WGdIh3lIl5eXFkd4Z5f5JocYN1Znd2ZGp8hIiegoB/jo59cX5yg3h+kI6Cd5WMlJCIgoh7iYpseXqAdWh7aWx/eXNpenaAg31oYHeIfWtqdGh7gWp2go2RlX98fn5xfHZ8dH5iVXV7cXKHgoF7gXCGiXd4b2+CgYt9fHd8enOMhIB1Z3BnbIiBcnBdaGN0b0xmd01fb1ZUWnRuYlFPdXliUlhYXWJxg3RcYl1pZWVja2RSXHFJRGRiXGRxXlx4aFVXVnheXGZuaVdsXmFqZ2Vubmhwd3qTbmmIjHl+c3t+eYKBgnx2fYOIhoNwdoNzbneCgn6Ii5R/cYB8eHp6gYt1g3h/gYGChHqAdW99ioubnoh+hnt3hnxodYeNknp/gHyJhoR2j4BncG5gZVxYZlltc2FhYXFsbGiJbmBzaVheY22Ad6naqciHiLNyinlxj3Z9iZGBe5SLgHV0dX52f29wf22FdJSGeHVsYHmBeYiNZXGCbmd1blttfYGQk4CBeZKSfXd6bIV0f4+Kg3KViZGPiIaGe3+GbXV3f21od2VtfHZtand2f398YGJ4hnpodXZjfnxodYePjpZ9dYB2coB6fW2AWVZyfW9zgYV9f3driIZzeGp0f4KCfHl7d3pxiX97cmZzZG2LhGxzW2pgdmZJb29NXGNYV1Z5bWJQU3V3WVFWWF5hcoVwXWFjbWVjXm9jVV5yR0JmX15naV1ae2NSVl12W1tna2FXa2BgbmZmbHFocHZ4j3Rrjo12f3d4fXeBg4F7dH2DiIiDb3F/dXF1fYWBiY2Le3d/eIR8fYWHeIh8fYF9hIB7fnJ2eIuOn4yJe4p3dYN6Xn6Hmo16h4R0hoeFd4l7Ym5tXGJbW2FVanRkYFtob3Bnh3FhcWZXXGNrf3zKzoe6omtub4tucoVzfoaMf3uThXp5dHp1dHpqbHZjhHaSgnZvZ198gXmLiGRxgGpqcWNYbXuGnImDgnKXk3d9e22Gb4CJioZwlo6QiIaMhHt5f3JycH5naHJjbnhxamxxd318eV1leoB4aXV5Z4J3aHWIjI6VfXOHam9+gHhufV1XcH1tc36IeoBubop/cHZmdn5/foB1em95coV6eHFlcWBtjIFrclhrX3ldSXBsT1hWX1VWfGtiT1R2c1JSVFdeY3WGal1ha2tmY1pvYlljcEdBaF1hZ19cVnxeT1ZmcVpbamhdWGhhX3JmamhxZ3Fzdod5bpWKdYB7d355g4eAdXN/hYWOg3Bwe3h3dXmGhYeMhnp8f3WLfn2Gg4SHf35+fYZ/fHh2eXaSlJ9+jX2LbnWAemSEiJiGdJKKb4WGgnqDdWNuallfW11dVWhzZWBZZHJyZ4FyYWtkV1pfaX94vq57n7huYnSHaXV9c3uFiHt+jYB3eHN3b3p2ZWpvYYd1joFzamJefXd5i4JlcH1na2tbVm94i6SBhX9wmZJxf3d0gGx/gI+GcpOHjIiFiYV9eXVzcGl6YWptYW12amdra3l3endbZ318eWZyfm6FdGZ2ho2GloBwi2dre4N0bHViW256anN6iXqAZXSGfG1wZ3R9dnx+cHpqeXl/eHZvZGtgbYl9bG5WamF4VkxsbVBTUGlOWX1oYk9VdmxNUVRVX2h3hGdeYXFpZ2FXaV1dbGlKRGpaYmVXWVV5Wk5Xb2tZXWxlXVplY150ZmxlcWZzcHSBeHCZhXaAf3h/fIWHfXVzgod/lYNuc3l7e3NyhYaIiYR5gX12j399hImOhIGDen6Lg3t3fHd2mp2YeoqDh2p2fn1thYWVgXOPgnGGgn+CgHBmbGdYXVtcW1RlcGVfWGNydWl2cGRlYldbW2h/cG9ygHOKZWZ6f2p2d3R0hYZ4goV6d3R2bmt6cGFoa2eGdI2DbWdeX3xveol8aGx3ZmpkVldzcI6nfYR8dpaQc3txe3hseXqPg3WXe4iGhIeEfXVxc21odV1taWBsdWRnZml6b3tyWWeBdnVocIF4gndjeIWLfZWCb4xrbXuBcWZzZWBreGZwdYh5fGF1g3Vpa3F0eW94d3J7ZX19fXZ1bWNkYGyGfG1rVmpjclRMa2xQTU9wR158ZmFOVnVlS05UWGFseH9mXmdzamVgV2RYY3JeTEtrWWRiVlRVc1ZNWXdlWl9sYFxbZGVfd2dtYm9pdG9xfnV0mYF4gIF4gH+GhHp9doKDfpiFbnJ0fHt1cYWFjoKBeot1dJCAfYGVjoCFhHx+jIZ6foF2e6OminmJhoVsdXx8dYSDjXtvhnR6hX2Cg3VuamllVl1bW1pTY25lXFlidHtqaG1oYGFXXlppgGlrcIBobWJpe3prdXV1cIeCeoF+d3Zue2hqeWpfZW5ogXeQhGdlWGF2aX2GeW5pb2ZmXVVYb2iPqHeBenyQjnh0bn1tcXR4jX53lHSGg4CGiXZqc3doaW9cbWVebnNfZ2JqeGh7bVttg3N0am+Bfnp4YneFhXqRhnOIcnB6f3JjcWhbbXVkbnGGendhcoBvZ2l4c3Frd3ZzdWKCeX11dG9jYmJsfXxra1VpYmdUTG5oUEhSbEVheWZiTVRyXkpNVVpmbXl7Zl9tcWpkXVZgVm9vWEtUaVhnX1lOVWxUS116X1xfbF1dW2JlYHpobGFucHZub3d1eph9d4CBeYCAh4Z6eXqDfYGThHF0dH96dnSFiJB+gX2RbHOVgXuCn4V/h32AfoaCgIp7dYSsn396iIiEbHKCenaBgIJ1b4hvfYB0ioBqb25lZFhfWlpaVWJqZ1xaX3WCaV5tbFxhV1tca4FlcnR9ampebXh3aHV4c2+HfH5+enZzbHpoaXdnXWRzZ3p3koBjY1Rkb2aBhHZ2ZmhpYVdWWWhkkKhvf3d/io56cG97ZndteYp6do5xhH5/gIduZHd0ZWhpXWxiXnBwW2dfbXVlemhddIBucmtxe392dmR1hox8iYiAf3hydX50YXBsWHBxYW5vgnpzY3GAa2Bsem5paHl3c3BkhHR4eHRvY2BjbXN9amxUaV5fVUx1Y1FHV2JHY3dmYUxUcVlLTFhZaW13e2VlbnJmY1pYXll3ZlVLXWRYaVhaSVdlUUljeFtdX21bXlxiZF5/aWpgbnR4bW9udoOXeXKBgH1/iYyGfnV2hniGjH10dXWCeXp6goyOfX+FiWp0loF7ip19foV5gHt+fIaJc3GProx8fIeQfmZxiHp0fn13c3CGbXx+bZB6Y3BwYmVdZVZaWVdjZmtgXV10hmhYcG1bXlhaXGx7YnF3dm1jXG50dWl2d3Juhnl/gXp3b290ZWh0ZVtndWZ2dpF5X11TZWVqgoFzfGFiaVxUWF5jZJClaXl0goWQeGxteWZ3bHuDeXSHcoF5fXmAaWV3bWBnYV9rYF51a1lmXW9vYnplW3d8a25vcHh5dHVmc4OTgImDiXp2b3J9cmF4Y1lubmBvcIB6c2VxgGRebXVoY2Z4enJsbYFzcXtxcGFdZG1vfWVpVGhZWlVOeV9SSlpZSGN1ZGFKVW5VSkxbV2ptc3tkbGx1Y2FZWlxid1xUTGReWWpUV0hZYU5IanZYX2FuW1tfYmNdhWloYm54eW1vanaBkHlug36AgpKIhIF2dYl0jIZ0cXZ2gXd9fX6Mj4F/k35weJaDfZmSeYCAeHl+f3OHhHNwmaJ7e3+JlnlldYh6c3l3bHRwf2x5fHCSc15wb2FnYmxUW1pXaWRtZlxccollU3JuW1lYV2BsdmNqdWpqX1tudXNudXR1a4d9f4F8d29ubGRpcGNba3JkdHaOc1xXVGRgcX9+cYFcYWNeU1phXGSTn2VycYWDkHNranhsbm55eXpxgHZ/c3t6e2RmdmheY1thaFxfd2hXYl5waGF3YVt8dmpqcm54dHR1anKCloSHf4V2c2pwfG1md1dbaWxhb3F/eXNlb35aYHBwYV5pb3xranJ9cG92anBgWmRrbXthZ1RnVVhTUXdcUlBZUkhkc2JgR1ZsUUlQWlVrbGt8ZW1vcmFbWlhabXFYU1BnWFdpVFVHWlxPSXN1WGBjbmNYYWFhXoxqY2Vtenlsb2l2eYZ7a4R9gIWZfIKEeX2IbY+GcW92en10goJ9i4+Dg5d0eIKUhYGfiXWBgIF0f4Jwh4N2b6KXdHuGjId7ZneLb258cGd4cXtsc3ZzjWtedG9iZ2ZrU15cVmhibGxbXHGMZE5vbVxWV1VnaXNoY3RlZV5acHZwcnZ2emyIfX99iHeQc2Nka29hXG5tY3N4h2taVFZiY3d8fHCEXGNeY1RbYFpjl5VjbnCChYlyaWZ5bmRydXF6a3l0dW97f3ZfZ3NkXF9XYmRZYnVlVV9gbWRhcV1dfm9oaXNxdHF1d21thZSDinyFcXJnbnxvcW9SWmVpZHByf3VzYmx1VWJxaltebmR7ZGt1fHBxcWltX1hjaWp4XmZVZFVXUVZvWFFXVFBIZXJfYUZYa09JWVRWbmlkfGlseWtiV1xWXHVlVFJWaVJZZ1VUSVpbUE55d1tfZW1qWmJhXl6PbmJnbHp2bm9pdnZ/fm2EgH6Gl3t/h4GKf2uTiHJndIB7dYCDfomOf4yTc32KkYWHn4Z7f4aMc4CGc32CdW6kjHOCjYx3eG56jWBlfXFnenR5bW1xd4NnZHxtZGdnaFNgX1VnYGxvXF5ujmhNaWxgVVZTb2dza2Z4ZWZeWnJ2b3R8eXRuint/d5x7emthZWxtXmBuamVxeX5nWlZYX2x4e3pvg15hXWhWWGBYZJyIYmtwgYZ8dmtqdmxbdXBqeWl1cm5vfIFzWWtuYFleVmNkWWVxY1RfYmlhYmxaYH5rZmx0dW9teHdtaYaNgIp7iG1xZnB7bHFsYVhfZ2ZucoBzcl5pbFNlcGRVYm1heGFvdHp0aW5ral9XYGZodVxkVmJWVE9ZZ1NPXU9QSGVwXWNHWmpOSmBLWG1lX3hpb39lYFVeVF52XFVSYGdQXmJVVEtcWlFadnZdX2ZtaFhjYVtejnFjaGp4cnNtZ3ZzeYNzgoN7iI5+fIqIjnluj4p0bHOCdH9/iIWHkoSVj3p9jI+IkZuEgHyNhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo2NjY2NjY6Ojo6Ojo6Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpSTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjY2NjY2Njo6Ojo6Ojo2Njo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPy8xMTEwL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERDR2RoZ2dnZ2hNQkNDRERDWGhmZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI8tGh0dHRwaaIaCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTQ5XGBfX19gYUE1NjU1NTRNYV9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fn1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmHh4iIiIeOkJCQkJCQjIeHh4eHhomSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaIiYiJiYmJh4WFhYWFhYeJiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p8fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkZKRiYeOipCSk5GLkI6LjYWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjY2NjY6Ojo6Ojo6Ojo6OjY2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQi4WIh4qOiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCIhYWFiI+JjJCPj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkIiFh4eIjIiOj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp+fHZ2eHx8e3x9fX19fX5+fn5+f35/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4SJiIWMiI+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2Pio6Mi42Mjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp5eXt9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fn9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJh4KIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fn5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlJOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTk5KSkpKTk5KTk5SVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGRkpOSk5OTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGSkZGSkpOIhZORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCSgoKSkJGRjnWGkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9+f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQj5CIcIWQj5B8dYiQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Oj4xzb4qPinJ4h4+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjXdte4+Cc3iGjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/f39+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHc25vhHt1doCFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxZWFhXVFBRUlNSU01NSklGRUhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d3RiXmRfYmxxZmhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoYl1qbF1mZmdlY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hJSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpaandtYm5yamFZWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVtrcmxhbXVyZlFRU1BQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1OXWNva1lpc3VwU01PUFBQT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0ZCRkhVYmhrb3BvbWxaTExOTU5PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVDRkdITVpnaGdybm5oZmRgXl5YTEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gH+AgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7PklaXVpcZWxua29tbWxraWhrZFNHRUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7Oz1LW2ltbm9qb21raWxtZlFHRURHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHN0dHNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYGCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozo9SGNvc21ubGpraFVDPkNGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN0cnF0eHh5fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk5PUpgc3RwZ1Q/Ojs9QEFAPTs7Pjw9PEBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5ent9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT48OkJsfGo/OTs+PT4/QEBAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9AO1tuQD5ERT9AQURfZDs9PTs6PT5BQUA+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKR1ZwcHFzc3R0dXl6e3x8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo6bXdJODs6PT5BO0hkPTw9PDg6Oz8/PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUjw9PUlMRkV1dk43ODg6Oz4/V2pBOzw8Ojo7Pj8/PT05Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N5STtcf4N/enx3Vzw9Pz09PkVodEw6PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFHcnlrYoOEg4KDgH1ePkBDQEA9SnN7WTo9QUVBQkJGSEM9PEBEREFAPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEVvdH2CgoGDfn2Edk1BQ0VAPz5Ze4BdP0NFSUlMUU1NS0VDRkdHRUdFRUVERUNBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVyQ0RFRENXdYaHh35YR0hKTmlaT1BOSUdJSEhJSUhIR0dISEVDRUVFRkZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ1dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIlsQUFWdIeJh4eHiINXSEtWc15WUUtISEhIREdHR0dGSEZIRUNEREZFRERISENDQ0ZJS0tMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiIRWbISHhoaGh4iIh3xQSlluZV5dVEdDTUZAQENDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREZHSUpJSkhISEdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMS0pUgYOEhIKChYaGhIKGhYSEhoaGh4eGinVKYGJhYWNlU05YPDw8Pjs6PEFBQD48OTk4PDw9Oz47ODs/QUJAQUNDQkBBQUREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgICAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpJSWWFhISEf4GCg4KDg4SFhYaHiIiIiImMjnFoaGdlZ2lmaEY2ODg5NjQ3OTs8Ojg1Njc3ODk3ODc1ODg7Ozs9QDs5OTk9PD47PD1BQ0VISk1MTEdJR09SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaIaEhIF+gYODg4KDhIaJioyMi4uJiouMjHhtbGloaWpZNTY1NTg3MzU2ODo4NzY1NjU2NzY3Njc6Njc4ODk6NzU3ODk3OTc3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR2eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDY3ODg9Oj1FQ0JlhYOBgIKDg4ODg4aJi4qJiYqKioqLioqLiXZtbW1sbFU3ODU2ODg1NTc2OTk3NzY3NjU6OTo6Ojs3OTg5ODc2Njk6OTg4Njg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXZ6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhIWGiYqKiIeHiIiKioyLiouNiHJub29wZUA+Ojs7PDk6Ozk6Ozo6OTs6OT09PT47Ozw8Oj47OTs7PDs8Ozk6PDg6Ojo6OTk5PD88PEFCRElKTUtJS0xXb3JzdXN2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuKjI2OgnJycXFjR0ZDQkFCPkBDQUA+PT4+QD8/P0A/QD09P0I+QEE/QD89QEBAPj9BPD48Ozo7Ojk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLi4uMjY2NfnJzclNLSktISEhFRkhHRUNBQEJFQ0NBQkNCP0BESEVDRUNFREFGRUZERUZEQEI+PEA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0RGV4SCg4SFhYaGiImJiIeGhoaHiYmKi4yNjIyMjIyLe3p0XmddUEtLS0lKSkpJRkRER0hHRENFRkRCSElLR0hHRkhHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E+QkJHR0lZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2NjY2NjI6Je3h7b2dVTUxNSkpLSEtHREdJSElFRUhGRkVMTE1JSkdHSElKTk1PTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4ODw7Oz06PkA+P0BDRklJUF+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjY2MjI2MjY6CeHJVUlJPTU5LSUlGSklFS0lHS0pJSkdHR0tMTkxMSEhJSk1RTlBOTU9LSUdJSkhJRElISEZGR0dJR0NCQUNUbnB1d3d5enh5ent8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDk6PDg9Pjs9QT4/QURISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIyMjIxzW1ZUUVFPTEtIR0NISkhNTEdLT0xLSkpMTUxPUE5ISUtMT1FRUFFPT0pISkpMSkxGR0hHRkZJRkVFQkFCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uKjIyMjIyMjXxcW1dWV1VRTkxLRUZHTVBPUFdVUVBPUVNSTVNUT01TTFBTVVZSU1JQTEpNTU1LTkdHSkZGSEpFREVFQkVDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09QkBCQkdWTkZOUFBUWHuGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyNj4yLi2xdWm1iR1VTUlFLOztTVFNgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTVJRUFBRS0tLSEhKSEVGSUlJSElpcnZ5eHl4ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0dGRT8/QUFFQUNHRURFTFhSTVRVVlhafIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH5hiouLh29fZ1g8WVpZVFE/QFdWWVxkYFZZYnJdXVddWlZFUVlaW1lfVFlnUlZWWFVUVlRPT01KTEpJSUxNS09NU29zdnh5eHd5eXp7ent8fXt+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+i4mLjHtxclpdXVxTVVNXV1VbWnWDWVV9kGFcWF1fV0lWXV1bW19ZSFlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeEi4BoW1xdWlVXVVhTUlhWY5aAUmVyWFpXX2hQYGZbW1hcZ2FHT1poZ11bXF1dV1JPU1BQUlZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRUFJSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn6AfV9TV1pWU1ZUUlJNUE1MZnpbXVRZVVZdWkxUWlVTVF5aWFdXV3prWFtcXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fH19fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a39+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJVY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHem9yWUxNUFBNT0xKS0VGSUZDP1RkVX9SUVFOS1FUUU1PWVJNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXV1c3N3enp7e3x9e319fX59fX1+fX5/f39/f39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eXFlVUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ2YF5ORUBEREREQ0FFUUNFQUM+Q0lHVkBITkxHXWlQSEZORkRFRklHSEJESEdJS0dEQkFEQE9RTVJkcnR2dXN0dXp8e3t7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFNPVmBrbHJ2e3t4eXRybnN0c3l4fn+DgIODgoCCgIKBgmxOSEFBPDw+QEFAQD9rUUtgRUZISUVCP0dMTkdNUVVJQUU/Pzw9PD09Pz0/QUNDQD89PUI+Sk5HVW51dHVzdHZ4e3x7fHx8fH19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXkpKUFFOS0xRUlFUVlVXUVFXVVBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZURCQUI9O0NDQkJEQlxdT3tOT09OS0xNT09RTEtNV01IR0BBPDk3NzU5OT07Ozs4Ojg6PzxCSD9cc3R1dXV2d3l8fHx9fHx9fX1+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BfXFpJSFBSUU9NUFFOUVJUVlhTU1lUT1laW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEdISENCR0lGRkVETVJQYVdTWFFQU1NSVVtPT1FWUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxDPmVzc3Z3d3l5e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BWV15aWE1LVFRTUFFVT0xSU1RYWFRUWVJNV1laVlhYVlhZXVdXWGhza11WYXNrYmFfXmRhX15ZVVFOT09NSUhKTEpJRkNRUFNbV1RUTlFTWVNcZVVPU1RSTktJSEM/QTk5OTg5Nzg4NTc1Nzg1OTpHbXJ0d3h5e3t8fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVlVVVVdQU1VXVFVSXW5eUk5aX1tWWTtEVlhUW2ZKTFBTUk9OTU5OTkxKRlFQVVlTVE9KT09VU1RcVlJVU1JPTUxJSEhGPz48Ojc4NzY1OTk2NzY3NVdvcHN3eXp7fH19fX18fX18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG9mZWRjXF1SVFpWV1VUV1RSWFhZWVlTVU9KR09QT09NUkpQUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBTTUlMS09SUFJSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9xdHd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSUdFSExIS0hGTE1QTUcvRV9SPjM/PmpvYVNSUUBHVFFQUVBRTlFPUVBMSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR1eXt7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRUZISk1MRUdDT1JDOEVOU11nVFFTQUdVUE9RUVBOTU5NS0xLTE5PT1FMT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydHh7ent9e3x7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUWFdVTExLSTw5ODc7PkA+PD1BQEI9PkVIR0NFRklHSkpARkFBQEZIRUpPSFFSYlxRUFJPU09PUExMT01MTU1OT05bV0tNUU9HSUhDSEpMTEtGRkZFP0JDPjxCRz9CP0FkcHN3enp6e3x7enp3e3d5fn58e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENEPTk3Nzk/Qj47P0JAQD5ARElFQ0dHSUdJRUJCPz49Q0JBR0lETU9iZVFNT05XS0xOS0xNTU1MTE9OU2ROSkxSSElJRUFISkxNTkpHSUdCQUJAP0VGRUhES25vdnl5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR01NSk1QTVBPSEpEP0E9OTg6Oj9CPzxBQkFBREVHS0ZDSElHR0hDQz9CPz9AQT5ERUNLTlJUTEpJTVRGSUlKTEpLTElKTU1PUFJQSkdDTEdDQkpJTE1PTklKSUdDQ0NESEpNTElZcm13eXh6e3p5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFHS0RHSEhHSktJSktERkI9Pj05OTo7QEI/PUFCQ0NHRklLSkRJSUZHR0NDO0FAQj5AQEJFQ0lNUEhIS0dIS0RISkxNSEpMSElKTEtNXVJISERORkFDSkpNTFBNS01KS0ZHR0pOTlFOTGJtaXZ2d3p5e3p9cm1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLREZFR0VGRkdFR0JDQD48PTk6OjpAQ0A+QUNERUlFSUpMRklJR0ZGREI7QUNDPkBDRENER0xOSEtOSERIRUlMTk1ISUxHRkdJSUxOS0lHRU5IQkZNS01MT01NTk1LSEhJT1JSU05SZmZmcW9zeHV7enxsaGpuZWtxbHNwZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lERkZFQ0NDRUBEQj4/Pjo7Oz06PT5DQT5BQ0VGSkZJSExIR0dHRkVDQD1ERUI+QUNDQ0RHSElHTVBKRkZHS05PS0ZISUZFREVJSkhKSUZIT0tDSU1LT01PTk9QTkpKSUxSVVVST1dkYGFtZ3Byb3J5emdlaGhkaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMSEVFSENCQUJEPUJBPkE9Ojo9Pzs9PkBCPkBCREdKRUlGSUhHRkdFQ0JBQUZGQ0JCQkRFREdHSUZMUUxJT0pKTUxJR0hFR0ZEQ0lJSEtKR0tSTUJOTk1QTk9PTU5PS0tLT1VXVlVTWF9eXGlhbWluaHJzYmVmZmRoaGZuamZtbWhra21yaXF2dHNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd3dnR3dWpzdW51dHNxcmprc01HSEZIQkJBREU8QUBAQzw4Oj0+OT88P0JAQEBERkhFSEZGSEdGRkRDRUNESUVDR0VCRUdFRkdHRUpNS0hRTUpLSEhJRUZISEVDSUlJS01LT1NORFFSUFBRTk9NTlBNTE1TV1ZYWFVYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW55TUhHSEhCQkJGRTw/QkJEPDc6Pj06PjpAQj4/P0NFRkRGREVIRkRFQ0RFRkdKRUVKR0NHSEZIR0VDRkpKR05LTEtISkxGSUlLSEVLS0xNTk9SVE9IU1VTUFJPUU1OUU5NUFdaVlpZVlpdWVhhYGFgXmhlY2BkZmhnamhoaWZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXd1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSEhHSURCQ0hFPEBFQkU9ODk+Pj08PEFCPD8+QUFGQ0ZDRElFREVFRkdHR0lGR0tIRElIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5LT05PUlVWT0tVV1NQU1FSTE9RUE9UWVpZXFpZW15eXWBjXlxhY2tiYGRnZ3KFaGdpZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdExJS0lLRkJFR0U8QEdDREA6PD9APz4/QkE8QD5BQUZDRUVFSUVGRUdGSEhGSEhJS0pGSkhIS0hGRkxJSEhKR0xMTUxMSU1LTk1NUExQUFFVVldPS1ZWVVNTUVJMT1JSUFZbW11eW1xeX19hYGFkXWNgZWZgZWhqZHNzZmpnZ2tvcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SktMSkxHQ0VERTxARkREQzs/P0JAQEBDQT9CP0FDSENGRkdJRklGR0RJSEdJSEpMSEhKSklMSkZKS0hJS0pHS0tNTUpKTU1OTk5QS09RUlRYVk1OVFZUUlJRUE1OVFNSV1tdXl9dXWBfYGFhYGFjZWJkaGJkaWpndotsamlnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2bndLTExMTUdEQ0FEPD9FRUVDPUFBQ0JCQ0RBQ0RBQUVHQ0hISUhHSkdDSElHSEpGSUxISUpNS05MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNQV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAREJFRERGQkNFR0NDSUZDSEpLSUlLR0RLSkdISklJS0hKSk5MT0tJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BhdnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQ0ZFREZCRkZHREVLRkZKTUxLTExHR01JR0pLSEtLSUtLTkxNTExMSUxNTFtzYmRwXmxtVU1OZnNdZmZxbG50Z3BpX2FZbm5icHBia2pqZm9xdGV0bm9cb3VncE1KcXl2a2Fga2VlbXhsa3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElIR0VEP0FCQD5DRkdCRkNGRUZFRENISEhERUtIR0xOTkxNTUZKTkhKS0pJTEpKSktMTU5OTU1KTU1OW3Jvb25wcGxrTVBRbFdNaWJ0cnBhbW51XFlsUFxubVpxbWtvbXh4dHNpcF1fcmtxalV1eXhvY15rZmJncHBqam9wcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0dFRUVCQkI+QEBGR0JHRElGRUVCRklISUVITEpHTU1PTE1OR0xNSUxLSUpNSUtKSktPUE9OTUxOTkxcaGR1XWxxV2xOUFFtVFlrXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdXlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SExGSURFRUNBQj1CQUNHREhHTEhFQ0NISklIRkpMTEZOTExTUkxHTExITkpJSE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5Zcmtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXnRjd3hyam56aGFhY2ZiYmltdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnNzdnNIS0hJQkVFRUFBPkREQkdESElNSUZDRkpMSkdGS05MRk9KS1dSS0dLSkpOSUhKTElLSkhIS01NTU1JS0tLU2tjW2leX2ljcnJaX1lqbl9lZVVrX2NbYWFRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydnR3ckdHRklERUNGQUBCRkVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRUhIS01JSEpKS0tJSElHS0tLTEdIS0tMTU1MSktNTlRbXFRQVExQT05PT1ZRT09RTk9RSkpPUFFkcWlUWVdcW1xWWVtdWF1cXGNmYWFlYmNmX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0ZFQUVDQERIREZHQ0lLTEhGREdLTElFR0lQS0xPS0xXTElFRUhJSkhJS0lNSkhGR0dJR0hJRUZMSUpMT01KUFxXXlBcW2BeTVhZU1xcYl5NWFpNWGFSS1lhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CRENCRUlFR0dGS0pLSEVFSUpLRkVISFBLTU1KTVJJR0VBSEZKSUtMSkxKSEZESUZERkdFRktIQ0pOTExVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOX1xeU1peY15aXWBjYFlfY1tgXltUWFdZXl1jYmNhY2VoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoaGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNHSEZIR0hLSkpJREZLS0tFRklKTktOS0hMTkdIRT5HR0xJS0xLS0tJR0RIRENERUFGSkVASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFYVVVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR4eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUJFR0lGR0hIRkZJR0hHSEtJTERES0tOTUxLSEtKSElGP0dHTktLS01LS0tJRkdDREBEQUhJQ0BJSkhQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYlxkY2JkY2ZYUVVUUVtXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGREZLSkZGRkhHR0lHRkZJTEpORkRLS01OSkxJS0pISEZCSEhRTUtLT01KS0lHR0VEP0VDSUlCQkdGRVRdWV5YX1lfW11VWFhPXV1RS0pWXlheW11VWWBSUV9fYmJgYGJiYGNiYWRkYlhPUVFRWlJbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYSFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBSEZER01SSENRSkVHSEhFRktKTVBFRklKS05MTElLTElIR0RIS1FPTU1QTExKS0hJQ0RBRURJR0NCR0ZEV1VFXFRdU1ZfWE9UVU5aWk1JSlRgYVtfWF5eYV1PWWFcYGBfYmNiXWFiV2BfVFBPT09XUVxbW1xcXl9iZmZlbGVvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGSERJUmJQQ1ZeSUdHSERGTUtQUEVJSUpLTkxLS0xLSUpHRUpOUVFOT09NTkxNSEtBREFDREdFQ0JFR0JNSEJLS09PTkxGTUZHSUpIR0xLTU9QSUxPUE9TT0xQU1JVWllXWVhYZFdPU1RQUE5NT1RTWlhYWl1cYGFkZWNnY2tscHNyeXl/e3p/hISEhYSEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHR1hMR0hKSEdNTFFRSEtLS0tOTVVOT0pKS0dHS1BTU05QT05OTk5HS0ZgRURfTEVmZEVOXEleW3JtT01VbVlMRFBgVWtXZ0pdV1VeRExRVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalJWVVRbXFtgYGFiYWJgZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgIODf356e0xJRkdGSEVFS09TSUpGYFRISU9KSU9NUlFMTUxMT1JVUk9PSUtNR0hNUVtZT1BQTk9PT0lKUX9RSXxZWXJ0WVFtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbX1ZWWH9qdHV1Xl92XldhW1tmW19gYWBhXWBhZ21wbGBwd3R4gYGCg4OCf31/gHZ4emx2fnR4fYB8foCBgoR8gIN6f4F/fnd3TkpFSE1OQkRMTEZJS0VSVkxLTklLUlhXUU1PT01RVE5PUU9LS05HTVBTW1pTUVJPUFBQSkhaeF1UeGVoWlNVUnZndGxwYm5malFyT013bWpycHNycXJwb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29ycnt8b354boByX2BgYmFaYF9na25rYmxmZ213foGAgn57eHeAdHZ6aXJ+bnN8fnd4e36Ag3h8gHV8f3x8c3NOS0dgXUdBRU1NSEpKR0pQT01NSk5WXllVTFFTTlhaTVNTUk5LT0hRUlRZV1ZQVFBQUFFLSGd4bGN4cm1bS05WeXB1bXVib3ZQZWVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/b2hvWXZ2anZ1cIBfcmZ9aWx4fG9eX19iYVtdYmRnaWlkZ2JjZGxscHBzdHNzc3lxcnhibHVncXl7c3J2eX6Bc3V6bnx9eXhyb05LU3VOQ0JGUFBISktJS1BPT09NUFpgWldLVFdQYV5SVlFZUkxQSVNUVlhXV09VUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JocXVubXlwd2x2dHRybG5ddH56a215fGt0bHxrcHZ1eF5fX2JeXV9kZGlnZ2VlXmFiaWlpamtub2txb21qcGFjZmNvd3hvbXBzeX5ucXBre3p0c29tTExbVkhHRUdSUElMTUpLUFFQUFBQV1xYVU1VWVVlWFJSWV5TTE5JVFRWV1lXT1NOTk5SSVJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9acHp7XmB6c2Nyb3hxaGR9aXJ8XlRMbGB2dWtpdXt6bX54a3xwXF5eYlteYmRkZ2VlZWJaY2Npa2tyc3J2Z2xpaGRnYGFrYWdzcmxnbW1yfGttaGt7dG1ua21PSEtLSEpISFFQTE5PTEtSUlJPU1JXUlZUUFdaVlZUVFRhX1BOTUtUU1RRVlZOTkxNT1BLSFFOUFVMS0xTVFRTVFBWVVFRTlFRWFlSTlBVVFhYWFtbVVJTV1tXWFhaT1NVV1hYUl5ZV15WVFBZUldXV1dYXlpncl5bW1lcXV9jWl9jY2RmZGNjYlpjYmdmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdnanVqaGdpbFFJS0xMTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlXT09MTVZUUU5VU05PTUxRUExKUVFLUU1LTFBSVVNRUlNTSUhMTk9RUlFRUVRWUlhXXFdTUlBSVFVWU1pRTlNSWFZUWVZVWlZUUlVUVFVXWFZcWV5gXVxaWlxcX2NbXWJjZGZkZGRhWWBhY2FiaGhpbWJhZF5fY11aZFxibWFeZmVmbXNkaWdqa2VkY2ZoUEpLTE9PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFNQUEpOV1NQTlVQTlFOTFNQTU9VU05STk1PUVVRVVFSVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXVlZZW1RQVFVYVVVaVVdaVlNSV1ZVV1tYWl9cVVheXF5dW11hYV5bYmJjZ2ZlZGJYX2FiXWBnZGZlYV5fXV1eWlpgWl9nYF5dXWJoa2FnZmhmZGBiY2JPTE1MUVFMT1RPT1NRT1FbWVdXWFtZWFlWXWpkVlhZWldWU1NPSk5WVFBPVVBQUE1NUlJQUlhUUVFPTVBUVk9YUlRVVU9OTVFUVlVUVFJUV1ZaXVxaVlZRUVZYVltbV1FUVlZWVllUWFhWU1JZV1ZaXlldX15VXlxeYFxbX19fX1piYmRoZ2RkYlhhYGJeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFPVVxaWldbW1xYWltkcW1oZF9bWFZVV1FMTVZTTU5ST1FST0xRU1JVWlVTUFBNUVhXUldTU1NYTU9PUVRYVlVVU1VZWFteXVtbVlFOVVZVW1xXUlNXVldYVlRZW1VUUlpYV1xeWl5fYFVhXGFhXWBiX1xgXWNhY2doZGZgWWNgYV9fZWRfYGJbWlxbXFlaWVhXXFpcW2BeX1teXmFgXmJcWWBbUU5PTlZRUFRRT1RUU1BXXFxcWF5cXlZcXmpxd3mAY1xbVVVXUU1PVlNOUVFPUlRSTFJUVFlaV1VPUk9TWFdUU1VSUlpPUFNSVltWV1dTVlpYXF1bW11WU01UVVVcXFdSVVZWWFlTVVpcVVNTXVhaXV5cYGBgVmFbY2JdYWReXGJhY19jZmlkZl5bZGBhYGBjZV9iXllaXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVFJRV1JUUFteXl1bYFxgVVxdaGpyfXNsZ1xUV1dRTlJaU1JRVFJUVVRLUldWW1paU09TUVZWVlRPV1JTWlJUVFRYXVdYWVNYXVheXVlaXVRVTlVWV15bWVJVVVlZWVVXWlxWU1deWl1dYFxiYl1ZX1tlYV9kZF5eY2NhXmVmaWRmXl1kYWBhYWJkYGJeWFpfW1xbWFhYV1dbWVtgXFtbXFtYWlteVl5ZXVFPT1JaUFpUVVZWU1RUXl5gXl5iXGBVXV5ia3l0bH1rWlVZVFBQU1xUVVRVVFZZV0xSW1ddW11ST1VTWFdXVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUVdSWVhZX1taVFVWWllaV1haXVdVW15dXmBhX2RjXF5dXWVhYmZkXl5kY2BcZ2RoZWRiX2RhYGFgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU05QVllRXVVWWVdXVVhfX2FhYGNdX1RdX2JlZXWBemhXWVlTVVNWXFhXV1ZWV11YT1VdWl5dXFRSV1NXV1VTVFhSU1ZUWFdYXV5YXVtWXV9YX19YXFZRWFRZWlphWVxWV1hbWltZWVpbWVdeX2BfY2JhZGRcYlxgZmFkZmReX2RiYltmY2hlY2ZgZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlNZVlNcVFZXWVZWXGBhYmNgY15fVltgZGFfenVvaFlbWVVXVFdbWlpcWVhZYFdQVV5cYGBcVFRYUFVXVlRWV1JTVVdaWltfXlpfXFZfX1pdXlldVVJZV1lZXWJaXldYW1xbXFtbWlxaWl9fYGBkYmNkZGJkWWFmY2ZmZV5hYmBjXmJjaWRjZ19nXmFiY2FhYF5fWFRbWlpbW1hbWFhcW1pbWFdZWFdcW1tgXVZdXVNPVllWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheW1xaVldYWVxcXV9bWVtiVlRYXl1hY1xSVllQV1dXV1dWU1VUWFxcXmBgXWBcV2FeW15bWl5YVVhXW1tfYFxfWFlcXF1eX1xbXVlbYGFeYGVjZGVlZmJYY2VkaGdkXmNgYGVjXGVpZGVpX2ZdY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWVhbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNZWlhdYGNkX1JYWVBXV1hZWVdWV1ZdXV5gYWBfYl5ZYV1dXllcXllYVVdbXGBeXV9aWl5dXl5hXVxbWlxgYl9iZWNlZmVmYlpkZmZpZ2JfY15hZmRaaWhiZmljZV5iYmNhYGBfXV1aWFxZWVhYWlhXWltaWVdYVVVbXV1dYGBiYnhLWFdbWVZcW1xdWldcXV9gYmRhYmFdYFhiY2JhY2FiXVtcW1hXW1xfXWBfXVtgZF1cWFtiZWNhUlxaT1lYWltbWldaWWBdYGJiYGFjX1xiXV9dW15dWVlUWF1dX2BfYFxbXl5gYmNdXFhcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiXGNnYFxpaGJoaWVkYGJhY2FfYF9cXVxZXFlYV1hZWFdcWlpXV1hPWFpdYWNmZnJrf0pZV1xaWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBiYmJcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxeXl5ZWFVbX15dYWJgXltgYWJmY19dVF1gYWNkZGZlZ2VmZmVeZWZoaGdkZGBbZmdeYWhoYmhoZmNgYmBjYl9fX1xdW1pbWVhYWFZaVlxbWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4SCgoKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKCgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7enp6enp6ent7e3x7e3t7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3p6enp6enp6e3t7e3t7e3t6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmIkMzT0tLS09WehomJiYmGs9bS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIqU3ebk5OXk56WJjIyMjIi/6eXl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eHh4eHh3d3d3d3d3eHl5eXl5eXdvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2EhYSEhISEfnx8fHx8e4GEhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ1dXV5dnZ2ent4e3h3dnd6d3l6en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3l5eXl5eXl6e3t6e3t7enp6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd2eX18fHp5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjYyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3Z6fX1+fXl7enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4SEgoKCgoGBgoKCgoKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3dnt9fHx8enx5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp5en17fH16fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4e3h6e3l5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKCgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mFhIOEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgYGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4OBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7e3x8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYGAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgYGBgoKCgoGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzc3NycnFwb29vb3Bxc3NzcnJycnN0dHRzcXFxcnN0dHR0dHR0c3N0c3NzdHR0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHNzcnFxcXBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3Nzc3NycXFwcG9ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm5ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoKBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJzc3NycnFxcHBwcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubm5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgYKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcXNxcnJxcW98gm9wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKBgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcXFwh4ZwcnFwc5iCbnBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGBgYGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXF9oYJvcm+LnnxvcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKBgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFycXWdoXZxd5+cfW9xcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXFwcHBxcHBxcXFxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgoKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycZiokG+Co51+cHFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4GDeXJzc3JycnNycnNzc3Nyc3Ryk6mkeYihnnxyc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f4B+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn18dnZ3d3Z1eHp4eHh4eHd4eXmftKmkp6mXfXt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7fHt7ia+mobWqrKN+e3p6eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX19fX2YpZaisqCZp5N9gH99fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+gIB/f35/f4CAgYCAgYCBgZycjqCwoJ+in4CAgYB+fn9/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f4CAgYGAl5qOmLGhmJWchXx+fn5/fn5+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjImGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+foCBfn6fq6SXpJublqGfhn99fX+Af4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgYGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4KDg4aOn7KooqCZnZ2mqKyooJmRh4GAgIGAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODg4aNoK2xppuaoJuenJydoaSjnZSHg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYOLl5qXlpigm52dnZmal5CJhoeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4SEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj5CSkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGBho6Uk5eanJyblI+Jh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5OSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SDhIiQk4+UmJKHg4KFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgYKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGTkpCOkI6RkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4GCgoKBgIebiIuHgoKCgYCAgH+BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAf4OIjoCBgoODgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYmGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZaIhIKEgoJ/f4yVgoKBgoSCgYGBgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkZGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmYuDhYSEhIKAkZmGgoKChIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSk5CNjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgZCMg4F/fn18fYycjoCCgYGCgoSUlIyBgoGCg4KBgYGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYSFhYSDg4SDhIOChpSUkpOSj42MiIOEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlpeJgH19fX17gZiMgIOBgYGAjpSMkIGCgYKCgYOCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGVn4p+foB9h4t+hISDhIKDg4KNiYWMgoKDg4KKj4KDg4KDg4OCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhH2GiYB+hYWFhIWCf319fYCDhIODhpiPgoOEhISEhYODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaGhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMioiFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDiZGDhIuFgoGBfn2Bh4aDgH5+f39/f3+DhIONmZWSiISFhIWFhISEhYWFhIWEhoWFhYWGhoaFhoWFhoWFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+gICEhZSbo6uik4eFkIeGh4aGhYaFhYaHh4eIhoeHhoaGh4eHhoaHh4aGhoWDg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4mIhYaFg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf35+f4B/f39/f4CAf3+Af3+Jkp2lpqaik5CSiIeIh4iIiIaGh4iJiYmJiIeGh4eHiYiGh4eHh4aHhYODhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhYSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4OBgICBjImBgIGCgoGBgYGAf4B/f357eYmYl5yhoJ2dmoyIiYmJiouKiIiIiYmLi4qKiIeHiIiIh4eIiIeHhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSSkI+RjoqGhYaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCgoKCgoB/fn19fX1+fXx7fpKbmZ2enJ2Th4iJiYiJi4qJiYiJiIqKiYuJhoaGhoeFhoiIiIiGhoeEg4OEh4iIiIeFgoKBg4OCg4OEgoGCg4KBhIOEg4GOk5KQj4+LiYWFhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX1+fn5+fn59fn19gJWamZuamZKFhoeHh4eIh4eJh4eGiIeGiYmDg4SDhYSEhYWGiIiGhYOCgoOFh4aHhoaEgoKDhIKDg4SCgYKBgYGDg4SDhJGSkI6PjouHhIaGhIKBgYGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoOBfXx9f4B/fn5+fXx9fnx6gJaZmZiVkoKChISGhYWDg4WEhISEhISFhIKCgoGEhIGCg4OFhoWEgoKBgoKDg4WEhISFhISGhIOEhYOCg4GCg4OEhYSHkpGPjY+MiYWEhYSFgoGBgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAgIF/f4GEhIODg4KCgH19f4CAgX99fn59fH19e3t6hpeXlZaPgYGCgYKCgX9+gYGBgoGDgYKBgoKCgYOEgH+AgIGCgoCAgIGAgYKBg4GBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgIGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5+fn1/goSEgoOCg4J+fX5/gICBgH59fX19fn18enx7ipaWk4SAf4B/f4CAfn2Af36AgIF/gICBf3+AgYF+fX1/gIF/f35/gIB/gICAgH+AgoCAgoGBg4GBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GBg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foCDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6e3t8jYyKi5eMfX9+fn9+f4B/fn9/gH+AgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Af3+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhISCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/fn1+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp6enl+jI2KkY+Bf35/f3+AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f36Af39+f3+AgH5+gH9/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enp6enmGjoeCgoOCgICBgH+Bf4CAgIGBgoKAfoB+f35+fn6BgIGAf39/f4CAgH9/f4GAfn9/gH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEhIKBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WCgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXx6enl5eXuFhIKChIOBgoOBgIKAgoGBg4ODg4GBgoCBgH+AgYOBhIKAgIGAgYGBgIGAgoJ/gYCBf4CAf4CAgH5/f358fImUkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgIGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYSEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fH19fHt5eXl5eHyCg4SFg4GEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoGCgoCAgYCBf4CBgH9+jpOMh4iHiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGBgYGAf4B/f4CAgYB/gIGAf359fX1+fn9+gIOEh4eEhoaGhYaGh4eGh4eIh4eHhn99gICAgoF+fX19fX19fX19fX19fHx+fn58e3l4eHl5en+Cgn+Di4SDhISEl5eDg4SBfX6BgYKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDg4SDgoODgoKCgoODgoKRkIuIiIeJh4aGhIaFhISEg4GCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gICAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHh4eHiIaHh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXl5fICAfYeUg4ODhISUk4CBgX9/f35+hIuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhISEiJKPjImIiImHh4eFhoWEhISCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eXp6e3x9gYKBgoGDgoB+fX9/e4iRfHyOln99f3+ChoqFg4OEg4KDjYl/fX+DhIWFg4WGhoSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYOEg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp5ent8eXl9fn+Af4F/fXt8f359gpWRf4SIfXx+f4KEfHyBgoSDf3+Hg32CgYCCgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn19fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e35+f39+fn5+fXyAgYB+ho+Bfn2Cfn9+gIJ8fIB/goCBgH58e4qCfYB/foGAgIGCgIKAgICBgH+LlJCMjI6OjYiIh4WFhYSDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGhoWEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fXx5ent7eHh5e3t6fIKAgX+AgX1/f4B/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gZSSjYyNjo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoCBgICAf36Afn9/f35/gX58e3x8fHx8fHx8fHx9fXx7fHx8fHt8fHx6enl7fHp9hYODgIGBfoB/f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fXx+f4CBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6NjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+ChIaGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhYOAgIB9fn1+f36LhIGHfn18fH9+goJ/fX19fYF8e318foGEg4GAfn5+fn18fn+AfX6Afn9+hJKNjYyPjYyKhoSFhISDg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen5+fH5+gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fX17fHx8e3t6fX6AgIODgn9+f3x8fH18fIGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CLkI2NjI2LioiEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn1+fX19e3t9fXx6fHx9gYKBgICAfX19fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISDgYKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9e3+BgH9+f36Af39+f39+f4B/f39/f39/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+f358fH18fH18fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJioiKiYWIko+NiYqHhYWDgoKDg4SDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn5/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDg319fXx9fH19fX19fnx9e318fX1+fX59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uLiYyRkI6KiYaFhIKCgoKDg4ODgYGBgYGBgYGBgYGCgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fn1+fXx8fH59fX18fX19fn19fn58e3t7fHx9fHt6e3t5enp5eXt+f4ODhIeJioiJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH+AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+g5GEhIOBf359fI2HfX1+fX18fn98fX18fX1+fn1+f3x9fHt8fX58fHt8fXp6eXl5eXp7fn6AgYOHhIiPjouKh4WEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKFhYSCgYGCgYKBf4CChIF/foGAfX6Bfn1+f4CAfX6AhIB+fn99fn19ioV9fn99fn6Afn19fHx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiY6LjIiFhYWEg4KCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICBg4F/gIGEgX5+gH99foB+fX5+gIB/gX5/gH9/f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHx8fXt7e3x7fHx9fXyKiomJhoaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgYCAgIOAfn6Af31/gH19fn6AgH+Cf4GAgICAgYB9f39/gICAgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e31+fH18fHx7fHt8foqHh4WGiIWEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+fn+AfX6AfX19foB/f4GAgYCAgICBgX5+gH+BgH+BgIB/fn19fX59fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAiIOEhIWEhISFg4GCgYGCgYCAgoKDgYKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4GDg4ODhYSFg4ODhIODhISDgYCAgH+AgX59fX5/fn5+foB9fX98fX1+gH+AgICCgICBgIOCgH+AfoCBf4CBgIB/fn5+fn59f35+hYWBgYF/gIOBf36BgH9+f3+Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoKAfoCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf3+Af4CAf4CAg4KBgH9+gIB/gIGAgYB/f39/f3+Af4CBgoKCgX+Ag4J/f4OCf3+Af4F/gH98enx6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBf3+Af4B8fX1+gH1+f39/fn1/fH5+foF/gYB/fn+Af4GDgoOAf3+BgYCCgYGBgICBgICAf4CBgICCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fH2AfX+AfH9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhYKEhIWEhISBg4KBg4F/gIF+foB+gH19fX6Afn+Afn5/fX98f3+AgYCBf398foB+gIGCg4GAgIGDhIKBgIGAf4GAgIGBgIGBgYODgYF/gIOAfoKDhICAgoGCgoSCfnt7fHx8fX59fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWFgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgICAgICCgoGAgH6Agn9/gYKDgYGDgoODhYN/fX19fHt8fHl6e3p9eXt5eH9+e3x7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hYSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAf39/f398f4B/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+AgIB/f4GCgYB/foCBfn+AgoKAgYOChISGhIB+fnx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB+fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1+gICAf39/f3yAf3+BgIGAgH98gH9+f35/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn59f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e3+FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAfIB+gIB/gYCAf32Afn5/f39+fX1+gIGBgH5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIKAgICAfX5+f4B9fH58f4CBgICAgIB8gH+Afn+BgH9/fYF/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3e3l3eHd3eHt7ent8hYl9e3p3enx9fXx8fX19f358fX5+fX19fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYKBgYKAgoCAgYB+f35/f318fn6AgYKBgICBgX1+gH9+f4F/gH9/gYB/f399fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgYGBgoGCgYGBgH+Af39/fX1/foCAgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2EfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZKNenx9fHt9eXt6enh6gYF4eXx8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgYCBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e49/d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoGAgoGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3p4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgn+Af4CAf4B/gICAf359gH9+f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fXh4dXh4eXt8fH17fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYKCg4CAgoGEg4OEgYGDgYKCgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgIGCgH+AgYB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58e318e31/eHd2eXl6fHx8fHx7fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCgoSEgICDgYaDg4SBgoSAhIOCgoCAgoKEgYGCgYSCf4CAf4GDgoGAgYGAgH+BgYGBgYOAf4CDgn9+f4KBgIB/foGAgX+AgIGAgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/f4R9fX18f316fX97enZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfH9+fn59eXl7enp6eXNydG93cXd5c3d7hYKCgoKDhIKDhIOAgIODhoODg4KChIGEg4GDgICCgYOBgoKBgoF+gICAgoGCgoGCgoCBgICAgoKBhIB+gYOBf3+Ag4KAgX+AgoOCgIGCgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cXl0dnh0dnuEgoOCg4OEgoSDg4GCgoSGhIKDgoOEgYSDgYOAgYOCgoKCgoGCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhICChIKDgoKBgoKDgYOEg4SDhISEhYOEgoGDgoGDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX+AgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgYKDhYWFg4OCg4SChIWCgoGCg4OBgoGCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgoCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKAgYB7fYF+fHl8enp6fXx8gX56fHx9fXx6e35+foCAf4GBgYCAgICCgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSBgoSGhISDgoOEhIGDhYOCgoKDg4GDgYKAgoB9gICBgoOCgoKChIKAgoKDg4KCgYCAgoOCgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn+DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16enx9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX5+f359fHx4dn92d3+Eh4OCg4aDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOCgoGBg4J/goOEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fn1+gYGAfn59fn1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIhoWEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBgoOEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDg4KDg4KBhIOBg4OEhIOEhIWEhISFhYWFhIODg39+gYSAfX18fHx8f4F+fn9/f31/fXt8fX19fX1+fn+AgYCBgYB/fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4OFg4SDhX9+goqLhYWEg4KEhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4SDhISFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKEhYuJhISEhIWFgoeGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeoR/f39+hISCg4KCgYOEg4SEhYOEhYaEhYZ9hHl9fn+De4WDgISDgH99fn9+foGDgX17f31+gH59fHx8fX19fXx9fX6Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgIJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYR+g4N9gX1+f35/goOCfH+BfX+AfX18fHx8fXx8fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYSGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhIZ9cHuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdtenNugId5bX1yc3Zzdm1ud2xweWx1fX9+fH6BgIF9gH99gH+Af319fHx9fXx9fn99gH+AgH58f36AgYGAgYCAgIGBgICCg4KCg4WHhoaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29sd314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fn2BfoCAfn6AgIGAfn5/fn6Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIWFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WEhYSFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39/en59fX99f39+fYCBg4OAgoOBgYSCgX+BgoB9f3+Bfn9+fX6BgH5+gYKAgIKEh4aDg4aEhISFh4aFhYWFh4aIhYWGhYeHhYaEhoaJiIWEiYuIhYSGhYaFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3B5fX1tfXVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhYaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEg4GDg4SDhYOFhIWEhoOFhoWFhISFh4aEhIWGhYV9d4WDhISDgoF+f357fHt+e3x9fn9/fXx/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoeFhYWFhoaHiIaEhoWHhYWFg4SFhoWEhoaHhoWEhoSFhoaGhoSHhoeHhoaHiIiIiIaFh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISGhIaFhIWFg4aGhYWFhIaHhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9fn58fH59gH59f4B+foB/fX18gH1+f35+fn98fH1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYaGhYODhYaGhISDhISDhIaEhoaFhYWDhoaFhoWEhoeFhISFhYOEiIaEg4OEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2Bf3x8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFhoiFhoeGh4aHhoeFiIiHh4WGhoeFhoaFgoSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4SHg4SBgoSFg4GAgIF7e359fHx8fn18fHx9fnx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4SGhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4SCgoJ/gHt9f318fHx+fXx9fXx9e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoeGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4aIhoaIhIOEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9/fnx8fX99fH19fH57e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhYSFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeIiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFg4aGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYKCgYOFgoN+gYKBf4SCf39+f35/fHx9f317fX18fnp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8fImHhIaEhoSGhoWEhYWFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhISHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFiIOEhYSGhoaHhYWEg4WFhoaHhoeFhoaGhYaGhIOEhYKBgoGAhIOCgn2BgX9+g4F+f3+AfH98fX1+fXt+fXx9eXp6eXt8fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYSDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeFh4iIhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4WFhoaFhYaCg4OFgYCBgICEgIOAfIGAfn6CgH2Af4F9gHx9fn1+e359fHt5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaFhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIOEhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFhoeGiIiGhYiHiYeGhYWFg4aEhYeDg4aEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoSFhYKCg4R/foCAgIGAg4B8gX99foJ+foB+gH9/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18f359fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhIWGhoeHh4WFiIaJh4WEhISChYOEhoKDhoSEhoSHhoaFhYWDhIWEhYaFhoSEhISFg4WEgICCg39+f39/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7fH19fX2AfX18fH2Af318hoOGhoWGhoOEg4aChYGBgH9/gIB+f4GBfH5/f35/gIKCgoSFg4KBgoSBgIOCgYCEhYSCgX+AgoOChIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhIWGhIaGhoaGhYOEhIOEhYWFg4SDg4SChISAf4KCf31+fn5+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp8fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4J8fX9+fn9/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGChoWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFhIODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYF+gn9+f4J8f359fXx8fHt7enp6enl7eXt6eXp6ent8eXt9e3t+f3+BgH1/fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH5+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgIGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fH59fH6DfXt+fH2Af4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMzMzLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PkJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj08Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PD45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT0zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWy8vLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU09PT09PT09TU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw7OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OR6jZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1svL0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19jX19fa29ra2tra2trb3Nvb29nX19fX19fX19fX19fX1tTT09PT09PT09PT1NTW1dXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtAPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTUaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbLzINtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0jYuLi4uLi4uLi4qKioifu7m5ubm5ubi4uLi4t73T09PT09PT0tLS0tPT09vi4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5FybGlOU2JMTFZNPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS1BGntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXy81OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFhSU1NTU1NTU1NTU1NPd6ikpKOjo6Ojo6Ojo6Kr09LS09PT09LS0tLS0tLf6+rr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYd2xpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUJAOTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18vNUiwxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpp5cVldXV1dXV1dXV1dXU3qppaWlpKSkpKSkpKSjrNLS0tLS0tLS0tLS0tLR3+rq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDs+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fMzlw5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaqiZmFiYmJiYmJiYmJiYl6CrampqampqampqampqLDS0tLS0tLS0tLS0tLS0d/p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk6Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzM3EwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Ozs7OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzLy8vLzdLS0tLS0tLS0tLS0tLS1NPU1tbW1tbW1tbW1tXX2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo7ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M3Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7OztLTz8/P09PPz9DT0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX19fX19fX19bW1tbW1tXW1tbW1tbW1tbW1tfX1tbW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvVkpfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztKrnM/Q0KGWy9PHkqvRzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT08PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK2nKWj1qegq5/PmayastLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/OnZyRnrmelpChtJWGnZzNz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4+PDw5Nj9CP0I6NjQ4Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Rv5igm7WXn6CombW/yZeZxdDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9COjc0Ojo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/P07SZlqq5nKagi5/E05GZoc/Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PDk2NDo5ODo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8qgo7/KnKWMp63Yqpmq1M/Pz9Srmn6jj6Wbx8mU2K2jv57V0dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD45PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDUrJuni5eUn5WVpLvNiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDR0RBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PD05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q07aysqWdhp6vs52l0NujmbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkmxdXG9naGJdT0Y/SEhGRUA8PD4+PD09PDc1Njo5Njo7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXEopmWoI+jm6KcnJGnmJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTo6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6DH1aKrpJy+nqiho56ooqmd0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZSUUtLQD49RDw/Q0Y9NTU3Ozk2Ojs6Oz06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09PIkY202a+NkaXUmpKOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVaWpbTF9NSkxKVExGQjw8P0ZFR0tJPTY2Nzo5Nzk6Ozo7PTk+OTg6ODs9Pj5BPj05PDw6PT4+Oz05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR1MjB1dLVwL3W1NO5yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRExMQT43NzU6ODg4OTk6PD48Pjc6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dHT1NLS0tTV09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj09Nzg2OTc3ODk5Ozs9P0A8PDg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxBQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT0tLS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCREtJTUtGSUU+QkQ4ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+PEhGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0RFQ0FMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTU1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhRQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ7Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIREVAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29ra2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDg3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojs4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ojg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5OTo4Njg4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/hoG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Firzd29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc2ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tvc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg2NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv72+v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTM1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY5PTs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5ubi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU1ODg2ODY8Ojk8PT07Ojg2Njg4Ojc2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBGPjg7NzI4OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2Njg/PkBCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NjQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO1tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7e3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi3t7e4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6uvsKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOj0+QD9AOkBCQkI/P0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3s7CwrayrqqmpqKeoqampqKiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3uLe2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJiZmZmZmpqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OTM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpaWlpaaoqKeoqKWmqKinqKinqKipqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7a3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmJiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8Pjo6QTw3PDgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OztAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutraysrKuqqailo6Slpqalpqenqqimpqenp6iop6eoqKelpKSioaGhoJ+enp+fn5+en6ChoaOlpKOjpKSkpaenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tba2tbWzsK2rqamuq6ilpaamp6WkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiZmpqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PD89P0E/PD9CQz9CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqWlo6KjpaampaWlpqmqqaalo6Slpqako6OioqOioZ+fn56enJycnJ2dnZydnp+goqGio6OjoaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZmJeXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+Pjs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAP0JCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWkpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc1Nzg7PTg6Ojk5Oz07Ozg5PjY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKunpqCdnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5KUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTg9Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Kjo6SkpaampaSkoqGho6Ojo6Kjpaampqanp6afm5qboqCalpeVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6Wmpqako6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODk6ODk3ODg6PTs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/PkFBPkFBPzo5PT46UJ2gn5ybnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+mpp/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqChoKSnp6alo6Kho6empqWjo6ampqamp6amoJuZm6Ggl5KTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKio6WkpaWlpaWlpaSjpKOioqKhoKChoJ6fn5+fn56en6CfnJuamZeVlJSUk5GQkJGSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqcnZ6hpqampaSjoqKmp6emo6SmpqWlpqempqKdnJ+hn5eRkZCUl5udmJaXl5ibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjo6SlpKOkpKSkoqKioaKhoKCfoJ6dnp6dnZ2dnZ2fnpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo4NjU4NDY3ODk9ODg7Ojs/Ozo7PDo6Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpeYl5eanqKioaKjpKSjo6ampaSmp6alpaWmpaWjoKChoaCZkpCPlpuanpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaCgn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpGQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqWlpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6fn6CjpKKhoaKjoqOkpKampaSko6KhoZ6cm5WTlZmcmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODY4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZycnZyenp6foKGgn5+goKChoqOjpKSkpKKhoZ6cmpmXo7efmZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZmJmWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpmXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Cfn6ChoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKChoKGhoKChoaKmoaKioqGgnpybm5uZoamWnJubmZyempaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkZKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQT09Ozo6Ozs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjw6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqWhnqChoqKioaClsq2goJ+fnpyZmZqanK5meJ2dnpuZmpyZl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuam5qam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5KQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCfppOYrJ+gn52bmpqamaqARIGfnp6cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ+enZuampqbmpiZmZiXl5aVlJSTkZGQkJGSkpOTkpOTlJeZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD05ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzo5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm5+iop6bnJ2cnJydnqCfYZmon56cmpqbnKOhT0iEoJ2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+goaCdnJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn56cmZuanJybmpqZlpaWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7QkM5PD8/Ozo5Nzs4ODg3NDg5PDs8ODs7PD06PD45P0E8Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiXmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZuap2pcoqCbmZmbnZyvckpMhqGcnJ2cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mYmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxRPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmKWCU3eimZmanZugo19XToehnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bmpycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGgoZ+fn5+dmZqbnJ2amZiVlpeWlZaWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFxcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJuYmJmgilxgk5uam52co49lWk2Bop6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+QjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbW0xGPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ucmZiZnpldXnWWmpydnaKBZVpNf6Ken56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpubm5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8OT0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnJydnJubm5ubnJqYmZmbYWJgfpWenJ6XdGNVT4Ginp+fnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiZmpiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmZidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk6PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp2dnZyam5ucm5ubmJmZn2ldW2N9nJyei2leUFOHn5uenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yQjpCLi4+PloiIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiqrG3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODo5Ozw6Pj07QEA7PEI8QDo4NDc8O0JAQUI+PjtDRERAQ0M9Pj45YZmVi5GGjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZm5qal5N2bmZWeZSYnYlbVFBZi5KOkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojg7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4yRj4uMj5CRkY6TnZ+Sf6KlmKaddE9QZIeHgo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjpAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg4CFopuMfGaSpZOce4iDY3SAgIKSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2OTM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5+gqOJeWxRc5yNi1hwe3x/fnyFjo2Lho2UkYuQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc5Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhYCCfZmZdVNLS3OThYJMXm9xd4mFio6LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj04ODs6OTo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLgIKJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYB+eoF8g36Cf32Af4OChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYt/iI2Mi4uHkY6ji1AwLzt4hnZ1QEJbam6CkImJkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz86PDg5NTg3NTc5NTo6Ojk8ODo8PTo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmQnqGdk5eboZqdm6KnnGNDX0s8eHhpZkcxNldtcpCPi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkM+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6mqro5JeKp+QHx4ZWJRVmNKXm+KoaGknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dFPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipqmnqKJ2Y8LUpUV9kIR4T22NeFZigKOop6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBEQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqqmkp6eZnaSlo6KeY4G7wK58pKOal2xJXHtwUnSVo6KgoZ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmVkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTtAQUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioKKnoaaupqacn2yDmLmLrNOjm7SsXE2vmlVlkKGeoKCenaCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGoqq2xsq+ro6OHd356c9HEsJmjrWxWp65mXYemoKWioZ2fopiVnpufn6ShnJWYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFVcaGRvY21paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKehnpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqevt7e1tbayrbCtj4eBbZLLvZWVppV0Vm13dXN/laaqp6Shn6ObnaGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7K4u7y8urrCubW0noZ2YVaetbump5mHeG1ycHh5en2EjJGWm6Gmp6ympZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odmtxaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW4wsjO0tDMyL2xo41wZVJEiJSFhYV9eHJvZmVraGtxc3FxcnR7i6nGxruip6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FpYWZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PFx9vk49nJu66jlYZyWVpRRGZ3am50bmtlZVlYXVhcYmlqaGVha4+4wcC5qa+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3bm1bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxr7M0NTKuaaakYRwXFFUS0RbZl5jamViYWhbVVlUV1laXFldeZ64uqu0sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Ef2pmaGFrbGdudnJydXJnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS+w8HHy8m4lXRhVE9PU0g+X2xfX2VjYl9kYlRWV1ZUVVt5oq6wqqirrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3VrbG5kb21pcXhveWppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO5uMOfZktER0tEPVpkYmJqZGFcZF9YU1BQUlyHtrqsrqWko6ikoKClmam0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnZSTiYl+hoiMlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent3bmtpaHZaZ3J4c3pnZ15kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTExMLEwbCKU0dNRTtLWl9mbGdfXGBZWlRPWYenrLi1sqypo6GtqaynrZ+stLS/w765uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl2dmVmampoXmtvbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMfCx51xXEg/P0ReYmFrYltYV1NZgKG5v7u8urysraapu7q5t7+ztbiywca6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWh2aGpqdG55bF5kW1VgWUxIRDY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnOxsbGwK96VU4vVlRXaGFSTlR6ssnIwsTHwLy+tLCwsMK+vsHGwL63tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOi5R9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ9eHBnYGtqd21pZnZvdGNdY1VXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwsLCw8GVQ055g45WUHmtzdPFtr+/wL+6u721s7PAv7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5gHNwZmVnZGxlYmtub29fWV1XVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvrzHpnltgpGWcrTMyMfRwa+9vbi5u7u+t7Swub6zvL6xubW4vLa8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX16g3huZmFlYmFjZGRqY2dkW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8yc/Aur/AvLvFvbrAxL+9v65wYXyRiovRxb+/yb+wwb+6t7u+ubW4tLi8tL24tbSws7yxt7e4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKynpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCnoaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhY2Noa2dnamZqXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz05NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdSMuL+7w7W6x7a1uLq8uLm2q6WYjXyEyb+/u8G+uca9wr+8xbi2t7S4tra7u7i2tLe6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGhoqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVncGplbGhZWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vM/DdqjMvce3ubettrS3ubO1sb3JxZVIfMq+v769vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfWtucWdxa3RmY25gXFVIS0tESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTXrXOAu8jPwsC4rrS0u723ubG9w8qNRHbNw8K/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXJmbGpudW95ZGhjXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsbJ0Zhwc6zR0czKxLW6v8TIvr60v8DAd1Fvy8bCvsG8v8PMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0cG1sdGxtb2BjX2JiTkhOP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XRw7q+vMS+t7zAv8nPx8jKycGFcXOlzMzLzcrGwsPLzsG8uL26sG5jY7zIxMDAv8TAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIe21teHxgcWRcX2BfVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u7q9vDvra+wL6+uqacqbK2w7+leHV4m8TGy8jBw8C/ycrBv7u5saB8cmuuyMXEv8DBv8vHw8DIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpJ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXpuc3h0aHBeXF9dWlJGRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vEt22tzr22ucC8rH1uaG5tcoGVmHN3fJe9v8bAucC8vsXEvb24sbCYj3yAm8rCw7y9v7/Dw7+/x7y8v7S0rrW1vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bXV7cG9qXGBhWlRRQUZJR0tARUNJPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5udm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbJ2gbO9trXCpYdpWl5gTVJbWm5zd4GfuLjCurO7t7u9v7q7u66kmpeGkH7AxMO+vL+7u7i2wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra8tLGso6irqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z2d25yYV9mXVtVSj0/P0dHPUdDQzk6NTs5OT48PDk6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmnhXiKoK+1nWplZ1ZZYElJTVBTbHeGpbC3vrmytbK7uby2ub60lpullaBxrsnEwL2/ubOusry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYVxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/Fqoh8dYygmGBUQ1hVR2FqVk9FSmGNoKyvtrq1tLKsvLm4tbjBvYuXr6GlcqXLwr+5urWupayzsKavraidoJ+lrba1wre2tKWoqqiwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3ZzbmNeZ1ldXlNPTkI/SkNBS0pANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJqRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4vrSQgniIj29OSj9kWUJOd4CUak5BXYGwtbO1srSvrLu6uLa5v8V1gqidmWOpv7i1srGtrZ+kpqaco6WclpmZmp+prrmsq6ufpaikq66vp7Crr7GxrbGurq+5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211amxdXGtUXlxQTkhER01CR05HODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhHtYRkFOh1lKSlh3jYFjQVOjuLO0srCxrbC5uLa7t7q8j6GxqqNyrLCpq62ro6ignZ6dlpehlZGVl4+XnqiupKOkoKKmoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeWh1dG9lVWFkV11ST01JQElSRE5DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yvKqZmZVpTUBSeHFQSUlLZ5yBWURSrruxrLOvrqyttraytLWuqKaempudnqaonqCoqZ+hp5aalpeNm5KMjpSMlpqjqKCfoaKhpqWco6OgnqWgpKylpqiloqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CXlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqaSpq6aprKumoYh4g3x2f3pjeG1uXVFpVVBPR1BNTUNQUkE/Oz40Ojo1Ozo9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2qpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3Cq6W+aUVSnYJRV0lKYEtUjmFjYoGutaqytK6qq6+wsrOtpZ2Rl5OPl6CfoaCco6SfnqiUmZSVipSOio2VkZeboamenp+go6WonJ+goZyhn6Oop5ynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJaTj4+SkZmQlpWYl5+YnJmbpJmXlJWanaCdp6iloKOioaOfnaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fIB1dn1ubHtkaVZSZE5JSEdPU05LTkg8RUA9MkA4NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutra6ubq3t7uuqKChqaCqxr/LoVBBc513UG5LTGNmdXNgWl5wkLGvrrO1qqasrKObmZSNkZWXmJicn6KinJ2knpqklZ2alI2Pj4+Ql5aanqOpnaCgnqanq6KfoKefnZ+jpqieo6afqp2qraqup6iwpaOkpqespqKlopuZnq+orrKrpquqoJuYmJiVk5aak5WWmpabl5iYoZ6cnJaboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJfIB+d3l8ZXl5YWJTVmFISUtMU1VKU1FNOT9BNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpMfHjldTSmWjWmV+b3JdUWtjW2RfXGuPtLCwuKymoZydmpSXmpmQjpGVkYyOjZOZopyWp6WhlZWWkZaWlJuZnaOkqJ+lo56nrq6qpqKxo5qjpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKehoKOxrrKxtKqyrqOZnJ2eoZibm5qYmZuVlpuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2mCbWVcU1taTVFLT09WTVRNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp6rpI16VWlydnVwY3Z2WFdjYGNnWVhXZ62urK+nn56ioJaQk5ugnJmXkpOfnKGjmp6amKNufZeZoJuinpyinKKmq62nq6ikrLS3trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7W4s7itsrSkoJ2loKyhoaKhoJqZlpafm5uYpaGgnqOhoJ+bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dmp3dV5tW1JhSVJWSEZWV0tDTUg9S0k4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqK6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuioaCkgG6CcGBjWExbU1pNTFBYUkhNTUiYrKqppaCfmpKRlJiYlpaWjIiLjpSdnJ2cn5lIR4+fn6ajrqekrKCoq7WwtLCwrba4vb+6rbW0sLewrrSppqSlrKm5s7W7w7zDwbe7tquusbm3vK+zsLXBvLe+s7O1oqyiqamyqauop6iamZ6aqqegmaegn5+oqKWln52qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhX52cm1pd21oblxYXENXTkpHTUhDRk49Pkw+NDw6Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqamUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOfnYlhV15lYFdNUUc+Pj9DQz8+QlF4qa2pqqagnp+io52fnpudm5STlZSenpiUhaZ2KmCSnqOrrrivr66vr7i8u7u4tbjDvr/Cv7a6u8DDub27rK6nsa2xwra4wsbAyMrAyr+wubm9uMK+uLS7xsS9w7y4tKqzraqztK+zrqqvo56sqLeyraOwpqGjsLGusKSlr6OhoJqhpqGkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF8dHJrbHVycWhXXFFGVUhESlBJP0VCNEZIOTY8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfn5V8X15lYFFHRDxDPkU8Pzk2Tn6qs6eko6KgnqWspp+YnZWSmp6ZlYyKhoiGeGyLVzVmhXx5gJa8vLywucHDwsa/vsLGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxszMzNLHvr/Aw77HxsK4xMrJxMHHv7q0uru1u7ewtrKru7KvvLfAu7qruK2rqri7tbyurrijpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5WUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrZGlveGtlWlxGTE1FRFRNRUJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEA/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9c2phV05FPklZfG9iQj1cjq6soJmbnJ6emZeXmJONj5eXlI+NkIyCg4J2cnBscGxUYGtwcm5zj67EvsHMzdDIxMjQzMzMx8rFxczQ0tXO08m9wL/Du8bFyMXR083T0NPTzMrBxsfGysjPwMnRzcfGyMbCvcTBv7+/tb6zrb/Aw8PHxcjEr7+5sri9xMLBu7y8ta6np66ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXVzZWJncm9nXlpaRE9NQ0ZRSURDQTU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjk7QUE7Oz43ODY6Oz5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOem52Wa2ZdVElEQD9Lhp6lmoSgsq2jnpyfmpiXlJOUl5GQkI2IhISJh4OAgYGAeXFxbmp7gGRYd3dybnJ/nb7PzdPKs9HQ0NHRzc3O0MTN1NXY0dfNxsfJzMPFys/K0tfS19LV1tPUyMzHzM3J083O083GycrKwsfMx8nJxr/Ds7PIxcvLy8/Hyr++v73Bx8XMzMnJwMPArrCzqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuWkIyGkYuAe3J1dmdjZ3ZqZVZYUkROR0BJUUM+Qj06MjJBPEU8Nzg8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hnGNUTEpEQz9DUq7RvbKvppycnKCkoZ2alJSVlIp9eXFsZWJocnBye4WKgHVwbXByb4R7doB9dHJ1b3Sez9DTmbbX09HS1NTSz9HD0NPW2NXV0svJztDLxs3SytLV19nW2NPW2M3Sys/RzM/RzdPQwMnIy8TMzczPz8bHyLbAy8DSzczQx8rJwMTDyM/N0NHPzcrIzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYWVyY11SXEpLR0FGSUo/O0E4PjU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpaWgoqJbSUBBREFGUXayr6aalJefnJqgoJ6bnZqViXdpZGFfX19fXl9fXWFsdXNwb25rcG9zg4B7gXltaWhebb7To3/S1tTOz9XU1NHRzNDN09fW09XQz9LT0cnT0cjQ19fY0tjS19nV1szPz8nN0szO0cDHxMnHz87R0dLIzM3Ay83G1M/Mz8nFy8fHyczL1NTR1c/SzNPCucWxpai1rqibqKulnbKosLOsrJOPk46Iio6Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUWBKSkNFQ1NOPzw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD9APUZBRD2CpJygpZ6lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu319TV2dnRztC/vMzJtr6up6qooaOsZkM4PT5EWIKqqJ+XlZeZmpyfnZibnZN9cWVjYl9fYV9eYWBeYWBfYGVtcHBtamxvc3Z9cnmAcmJcU1mjrXKr2s/TzsvSzdXU0crPzNPW0tHWzc/V1dHF0dPK0NTV1s7T0djY2NfLyM7Eyc/NyszAycHJys7P0MzQzs7Mz9DIzNDRy87Lw8rIys3LzNLTztTS0dDQyr3IubCuu7m1q7awrai4rbO/u7GajqCUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Bva2FkbnBhWFxbSUZGRE1ZRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD85ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+ZpaegoKOnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksntIRkI7V42hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYF5fX15cYm1ybm5wcXJxdnRvd3l0Y1tce3eI0dTJzM3EzcrS0s7GzszN1MvO0s3L19bQzNHUy8zQ0tPKztHV0tXWysDKwsbNw8jKw83ExsnLy8/Lzs3RztTMx8nQzcnHy8bHwsbKzM7R0cfQz87OzNDFx8G4ub3Dwr3DubKyvrC7w8S1qpiloZiWkZWVkouUjZqRlJSPj5WCiYZ5cXJrbWhgYHFoWVhoVk1HTElRUUI7RD87Njg6ODo7NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMrV1tna29jMzM/I1tXEwrWvtKigrZd4bG9wd4+ajYyXlZCTkZGVlpWQi3xlYmJiYF1eYWNiYF9fYGFhYF9dW11ncXFvcHFtaW1zcGhydGdmY113wsXHx8TEvcHFzs7HxcbNytHIy83NxtHSz83M1MrHys7Px8fP0svQz8W6xL/Gyr3Dx8nOxcPIwMfOyMTNy83QycXF0MnGwsbJxb/ByM3MzM/DyszJx8zQxcXIu8fDycnCz8G9vL+wwcnHub2qsbKnpZ2inJiQm5CjmZeZkZWYiY+CeG91ZGtgXmZxYVtXYEdJSEdJTVVHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ojo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7utpLZ+Z4KFoqqTjY2Wj4WDg4OBfYSEfnNfW15dXmBeYGNkY19dXF5fYGBfW1pcYWtycG1taGdpanVqY2JeYmVdqMa4v8G5ubi4vcjFwcPAw8fKyMjJyMHFzMbIys3JxMHKycHBy8/Ey8i/ucG8xsi+wMbPy8TAw7vKx8i7ycbFysG+wsvGxcS+xr69wcTGzMbGvL/Kw8XH0sXBycDKysbIxtDDw8bDrsTLx8PKt7+8urOprKSlmJ+YrKOhppujoJuVfHdzdWZqW2FubVpcWFJETEdDR0RMREZTPzU0MzM1QD0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL64vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srC2bF55fJ+RipKWhnqAhIV/dXh1cnBfWltdYGBiY2RkZWRgW1xeXV5dYFtZWlxhbnFtaWZna2lud1xYVl1haarBrbW4sLCxr6/Burq7urjAwcHEvr25vcC5xMrFxsK9xsC3u8PIv8HJu7a7u8XDv7zCzsPGvr61wb7Eu73HvMO6tb3GxMLDt8C2tr+/vM3Evba6yLu/vszEwsbDxsnHycbQxsLMyLLHycPOzMDFw7+8srewsqeoqLmwpa2wqq2slHp3eGtlaGBob2RWXllKRkpGSEtBRUJGSkE5OjY1ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1q7e0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1dfNys/FycXHwbrFvayupmBjdoGSi4iLhHh/hoZ/fYN7dHRjXFxdXmBgYmNiYmRlYl1cW1xeXF5dWltcXWdyb2tkY2lqa3dyT1FXYnGatKuurqSnq6mktbK1s7KztLu1vbG3sLWvsrvCu8HEvL+6tLK6vsC4yLi0vLbAwr24vcfBw7u1r7O1u7+0xbi7tay5vb7AvbG7trC3urPGvbevvL+1t7XFvb7DxsDExsbHzMW/xsa7x8u/z8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpHQkRBRUY/PTo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TFy83IxcjNzNDLzcjJyMrJysTQzdLPzcXHwcXBv7q4ybersJlbZ2+Ij4aIiXp4foWGdneBfHNoXV1dXV9gX2BkYV5jZWNfXlxbXlxdXlpbW11fa29sZmNmaGhse2VJXHWHlKioqKObn6ekm6ipsKypq6mzrbWwsqitp6yzu7q2w7m6ubCqtLm7s8K5r8Cxvby7tbvHucO3raqosLLAtri9sLGosrO1u7yrrranrrauvLKxqriwrruuu7i7wMG+usO/xsPFwLzGwcfKuMXHxb/Hw8O5xMbCu8bJzMuzucK9u7OJdHZ3a2lgYmxpWVdXW0FMTE1KRUFDP0ZBOjo6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcTPx83Bwsa/xMTDw8rCycq/wLzCurO1tcOuqrCSW2l+koiOj3t4fYmFeXuEgHduXl1cXF1fYF9fZGNiZGNiYF9dWltaWl1aWlpaXGNtbWZkZGRmaG15ZG2EkJOboqWumpuhnZaZoqiso6ehq6mrq7Cjpp+prbW2sb24r7evqK24tLO8t7O9sLi5tbK8wbLAr6Wpo6uxs7OovaqrqKusrrW0pqmuoaWvqbOmqKiupqi3rLGzt7q7u7K8vr6+xL+1wcDHyLe/v8W3xcPAu7/Ewr7EyMzKv7/EwMCph3N0c2ppXGFvZFdWWFBIWlNTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDx7m5y8LLvrvJtr3DvrrKt8HEwbS2vLaxr7W8ramrk2RtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9dXVxaWFlbW1hXWVxfZWpkYmNhZGRobXl5gIeGk5iRla2moJiUjp6gp6Kin6SkpqWtn5ybo6WssrC2t6ewrKiqtKuzubC2tq62urOwurqxtqSgpKCmsaisqbmqpaenqKezraCnp5+cpKasn5+npKGhsa2trLK1s7Swtby2u8HAsru+w8GxubnCs8C9wLW4vL2+vMLHxMPEv8DEoIR5cWxiZmBrb2BVWV9ITmhPVEhGS0Y8PUA9Ojs7ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbq9tqCelZ2gprq2q7Ozu7PEz8nLwsW4t8fAzL+4yre7xbizxbizv8CstryyrKavtK2ho5JpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGBeXFtcXFhZWFhYVlhaXV5jYmBjY2NiZWZseXNxalhbb0V7oJ+Ukomanp+lm56eoqSip52bopueqq6ssbWkqKqprKyktList7Css7Wvs7WvsKqfnp+korKlpqq4raKmpp+orauZn6CemZ2fpZqZo5ycnrCprKiqq6ytsLO5r7i5urC2vLu6q7OyubO9tLeysba1v7W9wL3Dwru7vZeEe3NsX2VeZGRYVFdeSVddS1BHSkpHQTw/P0E7PzwwNTYzNjo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67uMHBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uci4uL+3ssK0sbu7rLm6saKfqaunmJ6QbX6Fhn94cm1vbWtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dXWFdaXWFiY2NiYmNkZXBqWEEiOnFoaYeckpKMl56epp2am6OloaSbn6CZmK6tra+yoKSiraunobWwsbKsqbCzqLqzp7ahop+co6Gto6Kqtquio6aepqajlpmdl5manZ+al52cnZytoayoo6Smrauzs6q1sLKrsrm0r6qvsrKzt7Ouqa2usriwura6vb+3s7GUhnp2Zl9mX1tZVlNaVUtbUUxKRUhLSUM9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+ynaWjmKWxw7W2va20uMLMyMbAxbbBwMfOt8DDvbO5ubK/trG5u62yta+fmqOqoZSaj3h/g4R/eG9xdHFoZWRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXVlZYV1hXVVdgYmNhYWJgYGRmckQZHEiKlJCOmZGUjpOcmp6blZ+fp6Kdnaebmpqrp6+wqpyjo7epoaCuqLWqp6eusaS4sKS3oKOcmZmqpqGarbmwo6GknKKgoJOVoZSWlpyZmJaXnJWfqZ6qpKKeo6qqsa2otKyqp62zsKWrrrOxr7Cvr6eoqLKusrSwvLS6uK6jlIJ6d2VfYVdZWFNSVEtNXkxQTEdITUxFPUA+PUI8Ojc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0usKxvre9rZ2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGuvLu1u7y1ubmwr7CqnJqhqZWRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1ZVWmJiYGBhX19gYmpfJTduh4uOjpSSlpCRmJyZnZSenaWkoqWmnpyfpqCrr6afoaO2p6GhoqmzoqWopbCmsa6rtZ+hnZaVqaGilK2xsZ+jo56emJyTjKCUkZOYmJKXmJiXnqebp6KimqSlpaukpbCnpaOrrK2mqa6vr6uoqqqzpqarr7Sxrry2sa+vn5J7eHNlYlxbXVhOTFFIUmFNVlBPSk5PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sba9sLuxt6yepaasuLu8wcW6srm1xMnJwMLGxce2xsSzwb/Fq7e3vba9uru1sqytqJmZn6OLinSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVVRWVlJUUlRfX11eX1xdXWBhbFdch4OJh42LjZWOkJOgl56Vmp6joKuko6OipKKcqqukmp6lsaqhoZ6lqp6oop+trKqprq2ioqKVmKKanJCrqbCcn6Kfn5eZk4qdkY2SlJaQmJiTnKGjnKWhopWgoqSlm6OrpaKkqqSrraWusqmmpaamtaaqqK2ztbS5uq+qrJ6Mc3FwYFtXVlZSR1FPSFpcT1JKVEtTTEVHSkM4Ozs9PDk2NjY6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Gtnainr7m5s8DIurXAr8XIzLrByczItcm8sb7Dya2xuMG1vMC8tLWqrKaWmpyciYFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU05QWV1bW1xcXF1cX2Jrg4l9in+IiIeSjI+OmJigmZmfpqeqp6unqaWimKSupJWYpK+poJyZm6CfrpmcqrOfpqafo6OhlZSblpaSqamtm5yfoaGblJCMmI2MkY2SjZaVkJ2hoKOdnKOVm6GjoZiiqKOiqKugq7Ckrrilo6SjrK2qqKuvtLeyvbWzq66YhXV0aVtZWVNVUkZYTFFbWE1VT1BMUVJJT0lCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7euqKivrpupqKy3tqy8yru2v6zMxsW4wM7Px7PEu7e7wsixrbi/t7y+u7O2pqmglpiZl4h6dIB2d25taG1tbXBnZ2hmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOT1FYWVlZXFtaW11eZHqEeoN3hIiDi4eRjJOWnp2Ynqmopa2rqbCjp5merKCUlKOop52YkI+anq6WmKeqmJ+dlKWgnpKRkpGTlaiqpZqYmZ6el46Mi5OGiY2Dj4uSlZGgnqGkmZaflZqhop6Um6Wlp6mooLCwprG9p5+jrLSqrqevtLC5tcCxrrCrkX5ydGNWVFVOUUpHVlBSUkxMWE5LTE9TR05LQUNGRUM+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7SsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqxt7i8vcDDsbCxt660tLuztKOjnZ2Yl5WEgHZrZ2xucW5xam9rZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlRSTU5NUldYWVhYV1pbW2Bpd3B2bX+Ff4iCkYaQkJSYlpummZ6ppqWrnaaYnqWbko6eopqXl4aFkpukj5WinJaWlYeimpuTjI6KkJqlp5yVlZeckZOIlI6LgYyNgJCLkpKSoZqgopaUmZiVoqaajZmkp6mnoaC0sqizuKGdo7asqq6ksrKmtbu1q6yxoop6c25eTlFRTU9ETk5OUEtGTk5KSk5OUUhNSkFITElIQz45NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2sKSnpKqloKmmpLOqorLDtbWys8bFt7rDyszGs626vbS4wK+uqbCepq67r62gmpuelZWIfIRuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU5NS0tTV1dWV1dXVlpdYWxpbWd7f3qBeoyAioaRjZCbn42Ym6Oho5iklqGblI2HmZqMc42Dfo6XloaSmpCUjo17mY+djIKJgIqYoKOekJOYloWOgpR+fnSKjnqQiJOQkJ2bmpqSlpCdjqOjjomaoKGkpJuitK+ssK2fmKa4pqWwobGunLG8qqmvqZmEeHRkVk1SUFBNQ1NOTFBNQlBRSElOU05JSkpFS01HS0s9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNDg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY2Ojg3QTd4t6GjtKimpaijpaWmpqayp6a0wbivtLDJxLi5wM7GvrOsusGsrcStqKKmkp2mt62joJGWl5KQfnh/ZldWX2dmaWdobmNpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpHTlNTU1RUU1VYW11pZGdkdXx0bUtVbox/k4OKmpWJkpCemJ2VlJaTjZWJgJSJXztWb3yMlIqAjJKMj4aGcouEloF5gXuGlJ2Vg5aOkI+Dhn2TeHFwho19iYGQjpCXmpmTi5CKnYifmIeIlp6aoaCXp66prampnpats6KlrZmtq5iotKOpraOTf3RuYFtOU1JXTERUSlBNTEZOT0lFTFFNS1BKSU5QR0pKPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebegoq2hpqaqoKapp6OqsKintMG5sLWwx8K4s73Pv7mvrrXCp6rEqqKdmIOUnLGjmpmHlJCLh35zdl1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU5RTUtIRkhOUVFMT1JUVVhZYGlkXnF5bEw/PX2Tj416hZKKg4iLmo2WlImRhoSThXmJf2BKUW54i5KEfoSMi4R/f21+f5N3dXZ4hI2acFGNiIqGfH55lHZnd4aIfoqIlYuOkZOXjISKiJSFm42ChZKblp6dlKSiqKmlpJ6bsKqhpKSRpqqWoqqcoaaninduZl5cSFFRU01JVU1SSUxLT0lIRkpOTE1VS1FSUEdKRD03Njg6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMTUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2m6KnnZ+hrqGnqKWnqK+sqra8tri3s8G7tqe5yLi2qKi1tqqyvKeelY5/iZSplpWLf46Dgn54cW9YTUtNTU5LTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERDSU5PaFlOUVNUVVptfWptdmNjWFKOhpKFcXyEfnqDi5KBkpmLjnqFj391f3hzb3VwdI6OgXp+iquFentodnuOcHJteIGLjZJ4e4B7gHdzcpJ4aHWFhISFfJWKiIqNi4B/hIuNgJSEfIGPmJSclpGfnameoKGdoKmln52Yjaejk6Cflp6fpIFzaWJdXUpXUFJIS1hST0pNTFJKSkpMUEhMUU1SVU1GSUI9Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5NDc3ODU2NzUyNTE0NzIvMi4sLi8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6qlrauwsaq9tLK7uLa6tLGft7qyqp2drKmosq+impGNlIGOnI6RfneGd3x3cG9qWUtISUhHRUhIUFRUVFdXU1RVVVVWV1hXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE5RUVNWXnN+dnJhcYmUl42NeWR3fnR2fYePfIOYkX9who97dntva36tfHSQi396hpKAfH90ZnV8hmxvaHN8io2HgG15cX1xbXaPcWhxgX6OcESLhYKDhX93d3qMhn2Me3V9jpKPmIuSmpujlpmdm52eoZyWjYulmo6dl46WmJB4b25nY1tYWFVRSlNVVE9QTlBWS05LT09KUk9JT1BMRkQ9Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzUxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKawrK6rqKmxr7GrvLiru764s6ynm7CnrJuPlpylqaWhmJqOhJJ5iY+Li3ZxfG11cGptalhLRkdFQUBDREhMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFellKTk9RVFhdZW9vZ4OlqcB9cXZgeXZseXeGj3l7i4Vua4uSeHN4aWqAgnGWkYyBfZV/SZKZbmd3foJtamRseYWQkoZrcmx8bnJ8hmltcH9zjYmFhnt+f3t3cHR0hoJ5gXlwfI6LipODlpeYmpCTlpaZl52WjIOJn5KLko2GkJeAcGpvb29ZVlhUUlJZT1JVVFJYVU1OSE1LTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuYm5+krK+iraqota+urLS/q7zDv6aimpWkmJ6NhIuUoaGYmZGTi3OOeoCGjIZ1b3RscG1la2tZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JWWlFYW16lhmGYZW91Ynxta314iYd1gYeFc2uZkXRzfGlqnY5MeYWTiYSOZjF2h3JrfX2DdGZldX+EhIWAZmlsdWtwgHxocXF8bpONj3t0fn1xcW91bYN/d3l1anmIgoiJg5aSkpCLjZGUlI6XjYB5iJeIh4qGgJCIeGxrcGhlWFJbWFlZW05QVVZZWE5JSEVKSkhHQkBHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzM1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVtkoiakJmWpKitnrGep7qvq7KwwrG7w8ealo6VmYuOhXqEkJiVjZCMkIdxh4J0iIyGenBzcW9wZHBnX1RGSUM+PDs5Oj9AQURDRUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVUxCSVFJYq6ynm53dGl6am+Af4OAeYOFhXlyoJR0eIBzdJSHNXCdqJ2PoaGEooV2cIZ7hnx0jK6NiYFoZ2JqbnJtcIN1aW9YdXCOm5F2bX97fW5ybnCAe3N2bmJ1g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2OfHNycW1gXF1eXFpZYV9STltaWFdMSEpGSUc/Q0FCSD9DRD07Ojc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMTEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpGBkoiVkZ2kp56vlaW0qa6wrsGyu8HFlo+MlI+AiHxugZCSiYOKh4+GdYKEbJWIiHt1eHhsd253ZGpeSVBHPT83NDQ4Ozo7PT5AQkVITExMTE5QUVNUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw4RE5SU0RKhHN8eXlze2p0hYZ6fIOCfot9daGZeX6FgISZhJqcYYaqn52Kg5COeneIfomIjnOLl4+Ee11kcXR6fHeKbWhqYnlvhZCCem+BeHWFenB0enhrbmlddoZ9h3yHho5/ipKXg42FjIZ9cYR/hH12d3t8iXhxdHVnaGBbXF5TXGdeV1FUWFtVR0pKREtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIp/k4yRnJ2eppGgqqCxqK/AsrvEupaOkZOHeoZ2a3+LkYN9ioOOjHiDgHOhhIp9fYF/cIF+emh3a1JYTEBFMjExMzc2Njg4Ojw+QUVGRkdKS01PUVJTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9RTEtUXFhSS2eBhXiGd3lveo2JeHuHhX6Wh3agmYeGjpKUpY2sqUiGrrCui4GAlIuCi4KEkqmHgJiYipx0bXyBhod+jmhnaHl/boWHgoVxhIZIbIB3cnl2aG1rX3Z9g4h/h4WLeZScm4mLiJF/enWKdnx4bW93foF1dXNtXF5eXGNkWGdmXFVQUFdZUERMS0ZPSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2Nzc4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5COlZeSlqCdrKCmuK+zvbOXjZKLmIt9dHB+iZJ+fYyDkpR9hn6GpIeIgIKIhXiHiX5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9Pj9CRUdISk1OUVNUVVRUVlVTUU9HQz84MCwjh1s/Pzk0Ll2WcHOjVUZJS01NUFdgWG9ZW11niY+DkX6Bf4OPj3yEh4+AmZSBn6CXlJuapq2Tmbuxp7vHw6iLjKGljpOJgZF8cYOen5Gdf3eFhYuQh5BpaHCEgXSMh4SKcoaCd4iAe3aEfG11dWZ/lI6GiIiHiIegqqKWiY6Xf3qBiHl5b2dreH58gHVsZV5bW15qXmJnYFpPTE5YUlFJUEpETkdDSkRDQUREQjw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZneCen+Mf4GQjoqam6Sdoaymqq6wl5GRhKGUhHh3f4yUfH6ShpKVf4qAkpuOhICBjIqCiY2Df4p/bHBqXUJANC0tLy8uLjAyMjM0Nzc4Oz0/QkRISU5RUlRSU1NUUlBPSERCPDg3LzlDPjw8NjMubJOXTVBISkxMS05WX2J+ZmZrcpiWi5eQkIiLjJeGkY6cip+fkaKppKOrk6m2oqjBwq3Hr3i6lJp8jaGemYSThYKOoZ+UmZGFioWPmZGWbHB1ioyClYyNjnePhHFthYGKlpGChYhxiKCWhpGJjY+WpLSom4yUooOHkoN9f2tqanyCg4N1Y19lYFtobF5sbF5XS0hOUlFNTExGSVBDRE5GQkNFRkM9Ojk2PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnF2koZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXl/koiRkn2KhJiSkIOAgIuMiYaQh4SJhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOT1JUUFBRU1FOUElFRD47PDpERj8+PDg1Mjw/UjVISEhMTE1OUl5tiXtyf3ubmZekop+XnpSgk5udp52nqp6nq6mqtZerv6u2x8i3yNDPvpugcGmrqZ+Ek5KFnKCam5mmkpGIlaKbm3h6fpSYk6KSl5eBlJ57d5WSqrKIjJeffJSdm42RlZijoaW1r5yQmKeHlo+NgIhsc3N9gX5zamFeYmBiaGRgaGdcUkVKS1BPSUlMRkZNQ0hMRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbX1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjox8ioaPkI6BgoCJi4qFkoWDhomBgId3XmJQNDYwLTEvLC4wLy4vLi4wMDE1PkFBTVFSU1FSU1VSTlNMRUVAPD49RkdAQUA4NjYyPDk7RkhHSUpOT1FZbISOdpKInqKmsbu2oqyqq6ans6qvtbGxrbqxs72bssOrusnLt8O/uKWisLOsraqji5aYhKWmoKOXgaaZjaKrqKWIhZSkoaCroaSoj5yxi5Wjpre6m6Cir5KjnaKdj6Ohq66rsrShlKSpiJmIkomVeXp+hoFpYmldZmNfZWReZ2dfW09DSUhTTkZITEZKR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhiV2luWHqEdoGThYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5GOg4SBi4WGiJKGgoWJh4iHh3FuYUBFNjQ8Mi8xMTAtLCstMC4tND9DQU1VUFJTVVVWVU5bUEdHRDw+PkZIQ0VBODs8NUM7PUZLSUdIUU9RV4CRnoOroa+nrr7FwaixxLWrsr+yt721vrTBtru6o7jFqLXIx7W9ubSoo7StsLGbmZKan4inr6ullHafpJehrLK0mZaqrqiutruyuqywtaKxrLG1u7a0rrSgp6ijp5qpr6yxuLe4ppq1qIykjpCSn4Z4goV4W2NlV2djYmRhYWdgW1RKRERMVVFISUpESUdFQUBAS0RCTUc8OTY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWVFiYld5dXCBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiHmGgIyTjIeEgY5/gYmPhn+GiIaKh5B6eG5dVkBFTjw2OjQ1QUI3NjQvLzZDSEJRW09RVVdVXFdQX1VJS0pBPz5HS0ZGRDs+QDdENz9CSkpFRlZUUF6Oo6yisLG/srW+yse1usS9srPAtrfBtL6wt3Sxs6a6xKSwxrmwsrG0qKS1tqqxoKKXm6KSpbCupq2rp6SYoKy0u6Kosrq1vL/Mv8XFvb2zwbe6t762ure5rKyxpbCprb2wvLrBwauYuaeUrY6Xl6mIfoN+bVhkYllsZmtmWFxjWVZTSUdGTFFHQ0hJQUhEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUVZTWVVadmpvfo6DgI6EbnpzeIdiuaGZo4mUlJaSlJONj5aRh4Z7hoGNlYqAhIGKenyKh4Z8ioKBi4OVfXd6dWVQXGRHRUw7UWNhW15TRj87SFBFWmNRUlhYWmdZVGBfTFNQRUE/SUpIRUVBQEQ8RTZCPkhHSkxTWVRdkq22s7m2x7y4u8nMurvAu7e1u7q2vbO5scVgdbKksZqeqr2ppairqqSisrWgq6iflZafmaCupaempZ+jk6OnsbSosrO9tsG+08nJ08bDxczCysPAvby+u7y3tK+4t7bDucW9wsevnripoauNpKe1iIGBdGFjY19ZY2BqZ1NYYFZSVUlFRU5LQD5HRD1LQT1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VBSU1QUktRXWdsa3CPjYWPc2xycnOH1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaKfoN/gnh7i4OHe4t5gYqCl350fXprZnB1WV5cUGVkYmBlZF1bWFdcTWRtVVJtbV9uX1hnZFRZVUpEQktLSUZISEhIQkk6RD9IS1NUVVxaW5K3vre8tcS+ubjJyrq2ubW3ubK3tLOutbaYZHWnnK1wXqKsnJigopuknqqllJ+fkJOOlpmYqJ+moJ6amYOknqylqrCtuLC9udTRz9fQyszSzM/Oysa/vsLKvcG8wcDExMXKvsfNsqO6sLSumqu4u5iAfG1fYl5aX2NaZGNRW2BTUEtDQUVGRTxART5BSEJAQz06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVtZaF9vlpKQlG5sb3R1h7SsoaGfi5mcmYyNlZGakYWKin6IhoyQi4h8gYNze4qDhXuJdIKKhpV/c3t5bG11e2hyZWlsaWdqamlgZmlpbFptc5atpLyIhmdbb2ddWlpUSEtOUEpLUEtTUUlMQUpGSk9fXmFmaWGWtcWwuLK6u7OwxMa1r7iwsLursrGmqrerjLWnnZqnmk6ZnYyOn5aRppillYqTk4mQiY+RkZ2boZealZaHnpqnm6yvqLCotLTU1NTW08zQ09XN0s/MxMLJ0L7JycrJ0cfMzcLP0bevw7zDuaS1ucGihHFlXl9fWmJZWmdaUV1YT1BCQkhFQkg7QUM+QUc/P0E3O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZUmVWc5CQmIJncW95eYOhqp6ml4yam5eLjZWRmo59iYuEjYqKipCHfISCcH+HgYZ7h3KDkouOfXF4dWxxeH5xem14c21pgXBtY2ltcHhpd3x+y7/B36dtY3huY1tiYEpQUlVOWV5PXVxOUE5UUFRUXG5tdoJxlqy3q7Omr7Wpq7u/sKq0paS4pquuoKu0o46wrZqXmIyQk5GEjpuBjaaRnImDi4SKiYSLhJSVmJeUm5Gcl5man5+rrKWooqytz9LV0s7M09TUz9TRzsfD1NHHzdLT09fM0dHE0tbFwc7Hx8KovbfOnnxxaGBlX1hiU19bUFFUUU9IPkBGQUJFPEBBPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxVUU1OWnWGhYp3bHdwfX5/oZ6eoYyMmJOTi4ySj5WFeYWPkI2KioiQhn6Ce3J+gICHeoR1hZOQiH9vdnJrc317d3tzgnhya4BzcmlvcXp5cXq+y5p+jLKEdnKEdmhha11DWlpbVmVjWGRqU1hcXWBjXWN3en2LgZippKShn6CnpaqvuKqlsqGhraGjraGnsZ+IppqTkpGJkY6IgZOJapSijJmEgYZ+kYODk5eti5WNlZmOhpKRnpeosKKhoaWkqcnNz8jCzNHU0tTSztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMPCy411cWViYVpWWlVcUUtHSkpKQDs6O0RBRDxCQz5HQj5CQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7T0xGSlhwgHV9aHN4coKJgJ2VnZSFi5WJjomIjYaOf3iDk5iKjIeHi4h+gndze32Ch3d/eoaRlX+DbndwbXV/dXh9dIV8eWyHdnRufXaEdHh7nbWMO0GLxaV+jHxpZVdJQ2ZjZWNnamNtd1teZmhrbmhugIKHkYucnaCdkJeYnqOjpbGjo7GeoaWdoKigo7GchZ6SkZGPi42LhoOPhH+cm4yNgoSFeZR/gqmVo4yRiZeSi36Yi5qSq7OYm5yonKe+w8a5tsbO0tHS0MzSy8jUztDV2tfX2NTZ2M3Y287J2drR1b7Ky7V6eXBnX1xUV1JdV0ZHSklFRT06NzpAQEI6RkQ/RENBREI7Pzs7N0RDNzU2NTU7MDY3OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjXyXkZ2LfoeSg4mGhImBh3x4hZaWiI6Ch4WHeoR4cXp7g4V1eYWOjZx5i3B8b296f3F7gHGDh4Bujnp1d318gnR+fIaHr3NYqcK2jZGCcG1iPV5ocnBxcG54doFlaG9ydXhxeouGjZORmpWflYeMk5qgmp6pn6Csm6GamJ+lnp+rmYuai5CSjYV9iIeDhYuOoJmTiIOHfmyZeoSYhoiTjI2UjIZ8nImUkK6qlJaYn5mnr7a9qa2+x8zJyczL0MnD0srU19nX2NfV29fT2dvV0Nra0dbI1MuWe31ral1cUVRVYElDRklIPkE+PTc6PT87PUc9P0FBQURBPj46ODdEQjc1NTQ3OS41NjY0MzU1NDIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OTlEPkNHUmpebWRiZmt2gIhxkZCagHqAjX6CgoGDfoN7fISYjYeLfoWGgHeCeW57e4aBdHmSno6gdo51gnN1gX1zgIRvgZCCb5KEdXyBhXp2hnuJt8Wkwcm4gZabj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWlJSOl5GDiY+WmpaWpZyXn5aekpGXop2Zq5WQkIqMkYKMhYiIgYaQkZ6bmYiGjIGFl3qIiZ+XkIiNiouCfaGJkYy8oZiTmJmdqaamrp+otr/AwbnHys7Oxc3J0dbV1dnV19vU1tna29fb2tnYztvGiH17aWtnYVVZVldOTEVOQzs9PTw4Ojs9OT1ANj0/QDw/PTw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWGVhXVtodHp5bIqNknd2eop7foB+f3yEen2CkYmEhXqEh3t1fXRtfH2GfnR/kp6RnoORe4Z+eI9+eIqKboKagHSZhn6BiYR7fpB6j6mOj8OhvYucpJ19iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CShYiKkJOUjpyZkpSQlo2MlZ+clKCUkY2Nj4t+kI6OioSJkpaanp+JjJSSnZGCi4ClmYiEjYKFhIGlhoqMuJidkZWWoqihnp6dpK+3urWswMbK0MjHzM/T09LY09XXwNfY2dvY2trZ2dfbuXt7em5raFliXVRQT0lETEI8PD45OTo6OTk7PTY/Pj48PTk6OzszN0Q/NzM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg2ODk/PUNRU1JYXlVYZm1tbWmBjopxcnmKe3p/fH97h3p8e4uGgn10g4V5c3pzbYB+hH53hZuim52Ukn+MiH+Yh4Cbkm6IqIV6oIt8kY2DiIScfZqQioyjoqCQpK+fi5CLhYuBk4ZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlYyHiIySkouUlJOOi4+Kh5aanI+UlpCKkZOGgIuIko2KipyWmKKihpOdlqCKiYiNm5CDiI6Ag4eGpIWMkbOYnZKUl6GhnpqSnJ6osritpr3Cx83Ixs/N0MzP19HR1a7W1dja2Nra19XZ2aByf3dqaF9eWVVZWUNBSUM/Pj46NDk6Ozc6OzozOzs/PT43Ozk6MDpHPTozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNiem1hfpKDb213i3h5f3qBfIV7e3aFhH9zcIWCenV3dnSEgoR+f5KmpJ+lopeKnZCUl4uKqJdzirGNhKeShJmThZmMopWfmJOImp6jkqmwn5CUkI2OiJaMbo23hZrEyLKboaWbnJiWkLKRZKTNyJaPhoeIkJKNjZKTiYWKiYWWmZqPj5SThpSXg3+Pi5mIjZCqlpejo4iZnpaaiI6GlpeJhI6MgX+Hj6SIjpOompeTl5mhmZ+Zk52bo7O0pqO8wb7HxcXJyMnCy9PNzdSp0tHW1tbY2tTS2s6EdYJrZmBgX1BLVlxCQkdDO0E9ODM3Ozw6OD02NDk6PDo4Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0SlE8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCZYNHdYKOfHxtfoh4en56gYGCfnZ2gIJ7bG6Lfnl8d3h8hIaKfoujtKikqrOhlqegpaSWla+ig5C4lZKzmo2hoIykm6+ipJ2YkKeXqZmtsKSXlJWUkIuYmpagwI6jybirmqKlrZmRm5yynYaFqKKcmIWIiI6UjIqTj4eAhoeIk5iUjIqTk4aUmIaEkZCcdJCYspWWpKGInJmTj4qQipaaiYqWjYZ9jJifipCQnJqZk5mYoJShnZWfm6GxraOkt76zxcfEvcPDv8bOysnSp87M09HQ1tjSz9i8dXx4X2JXYlhSSUtPRUJDRDU+Ozc2Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj8/Nzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OklFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdNXFxZSmhhO0iEi3p6bYWGeXyEeICFgX1weHx9fG9zjXp9gXt4houJhoSSqLytqbK9sKWus7Opo6KwrYqatZ2iuKWVraSXqa23pqSjn5mpmKqkr7GqmpmclJWRmKCXmru7rcqhaba3qrCVmJ6iq5KXvaReqrKCiYqMlIeQfI6OfYOGjpCUlIiHkpaLj5WNi4yXmZKcmbSWlauei5yUko2QkouYmoqSnY+LiZagoo2VjZeZnZOcmJ6UoaCUnJ2mrqiipLO4q8LIxLa6vbzFyMjC0KHGyc3NxNfW0MrTo3N9a19bVWFTUUdEPjxDQUI4Pzg3ND5GPDw2PDM1MzU1NDU0QjM5OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQUVANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGZIYWBicEpAi4l/gHKGh3yBiXWCioN+bX18fH5wd4d3jYGHe42QjIaMmqvCwLC9xryztMG8tKyrs7aMqLKtrb2rm7ujqK25uKumpqKipKOqr7Kxqp2cpJibmJieoqalk6O5r6i/vKytsrmlo6d9iIacrb2wgouLipCDj4ORjnqBh5CNjpyIiI+XjYqUl5SQmpacp5qwmpGrnY6aj5KOlpGPlZeOkaCQiJSbpKyUlo+UnJ6UoZ6bmKCglZqep6ekoqSws6bAxsOwsLu2xcXDv82nx8PHw7zV0MzEyop2dmRfXGJdT0xDTEBFRz5BP0I8OjQ+QT09NT02PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQjVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFSkhOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxoRl9pZ1tdXJOMjIh7h4uGg4x1hpCKgW5+e4F+cX6BepR6kpSUmJGTlai0x8nAwszCw7nHvLqvq7m7l7K2urLAr6XAo6uwvLyqrqujop6nrK+1samboKqcopyWn7C0p4yjurq1wburqJyypKSolISOqcTEpIKLjoaIhIaVlIx6g4yRj5GhjIyUkY+Il6CYk5mUlqWgrpyMqpyOlo+SkZWVjZCUkY+hk4aXn6Cyn5SblKChmaSgmqCboJSYnqekpqekr62lv8PCrqi3tcnDvrbOssS+w7uz0cnHwbV3e29eW15sVE5JRE1LS0pAQT1CRDw1QUQ7OjM9OEIzMzIyNjNBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJnXE1lXGZUY2qajZaKi4iSj4aJeYaTkIFygHuMf3eHgoKPeY2hlqiampi7vsnIysLSycrCzb3Bs628v6e6v728xLitwamss7y9qrCqpKWjrK60rra1oJ+un6aimaO0vamcqLzBo7a2r6uTsKyqrJaGmqqnpZGCjJKklYmAdYmReYWNkZCen5KPlIuPjJSjmZeblJOinqmfkaWajI+PkJWWiHyOlZKSo5qVoKKctaaQoJelpKOln56mmJ6Vl5ylo6ioorKsqLvAxK+ls7fMwLquw7O7vcG5rcLCwr+ZcHtjW1leXU1NTktHRENIQkFBREs6NERIOjs0PDdGLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+bElfWGFaZGVYno+djpeOnpKJin+In5KEeIV/lH5/kIiJkICWoZqup6OYw77JxMjG083Ozcu8wrewur20vcu7w8G2t7yttMC5vK6vqKGpqLaurqmyt5qerKKoop2rt7eqpa++xLG9ubOnqrSzra2WlaWtqKCRjpKxxaeVjX2RlX2HkZiPqpmXk5OOk5WTpZ2TnZmToKKhnJifmIuMj5CeiFqQlpeSlqSZZpmjnrOllqKWrK2sp5yfp5eYlpiWoaOopp+1q6m6u8O0prS1y8G4qrass7u4rqi4ury3hG9wXFpWV1BHTFROSz9BSERESEZGODVGTTs+Nz5BSy4zMjAyNUI1NVBXTjxMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVjw+QEJGQnNGaUlSZmRNRqaUnJahl6iWjJCDh6WSiIGHgpuDg5WQkJSOmqKfr76uoce+xsXIx87Oz9LKvru2sbu7vL/PtcS9t7m3s7K2s7izrKecq6u5q6mor6+Xo66lqKSltcGwq620vsK5wLmzp7i0t7KvlaStsK+li5OUoI1zwZl9l5mEjpaZi7GVmpmVkpKZmaWjlZ+blpqonJuhoJmKjI+WnWBKlpyalZmll1SWsJ+vnJ+lla+vraaboaaUk5mZjp2fpqGZtKmqs7y8u6uwssfAuKasq62xsaOhsrK0pXNxZ15cUFNNRlFRUFE7SEtIRkdBQz05S1Q/QTo9RU0vNzUzNDpCMzROV048SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzVFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFg8OkJDQD1SRVdTdGJWRkirl5mfoaiumJCXh4qnlo2IkoWfh4Scl46eoJqjpLXJtKnHvMPEycvJyMzOxr66s6+6uMDBzbXIusG5tbqyr6+ztKeknKq0tauqp62smaSupqWprLrAqKu3t77BwL63srLDsLe9rKOuta26poibl6Wadb6fhJidjpKYmouulqGcm5eUmp+gqZ6noJmaqpmhp56XkI2RnYNtdZOimpWcop+QrbKiq5Wpqpiqr6aloaWqk5KZnImVnKKelrCnqaq6t76zsq6+ubago6eopaacnK2pqY1maGNgU01NR0lPSlVMPU1FTUlKQENEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQzo5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXPDo9Li5TYU1WSH5lXkhGrJScoZ+7rpiUnouTqpuRkZOIqoyGoZ6Mo6yUo6S2x720wrvDwsjJxcLOyMK9ubKvubXAw8q2xrHBvLW7rKmtrLCjo5mqtLumqqesqp2or6ikq6u+vKitvLS3vsa8trW4wLC9v7Optbesv6WPopeQoZ+8nomaoJmXnZ2Pt5+pnKWjmpyhmqeks6GbnaWcp6mdmJSPlJuLlomMpKKUnKOfoLWwpaaTsauaq62fn6WkqpKWlaCEkJ6fnJappKGhtLW6tq2otbKynpyippqXlZmroZ54Y19hX0xJRkhOUUlORUZHQlFKSEBER0FWU0RIPEFHUTE7Qjc6QkY3OV1ZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRaiXpJ6fw6ybl6SXmaiblZqajqqWlaimla2smaKrt8XCvL+3wcLAyMS/zca7vrmysLm0vsPItb+wvLa6t6ekq6utoaGbq6rEoqWorKaeq6+soqqovrimrb6wt7fGt7S4uL6xvsC2tLK1r76jlqOVk5qTrZ+QoaGkoqOekL6kqZ2prJ2doZumn72imKOeoqmroJ2VjZWek56HjoSNk56koJ22rKaclrKmmbCooJyrn6GNmpWfhI6hmpySpaSamKuxtbGqpaqtrJuYoKGSjpCWqZ+UaWVcYl5QSkhLT0xIRURJQD1PSEA7RklIW1JPSz1ITlU0QkY4PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLS0wTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGZjWE6jm6ObnsWroJ6rnZytn5Ginpakn6aqq5e2saOps7bFwr3AtsDCvMnCv8rItri1tLG0tLfCxre+sbi0uragp6yqq56en6WkwaWhqq2gpKmtsKKnqL21pbG7t7a1w7Kyt7q+ssPAuLittLS1o52klJGToKyfmKGdqKiqoprCrKidrK2bm56YpqC9oZ2kmKurrKahmY2an5KeiI5Yf5afpqGguaqnlJi2o56zoqGcsZigj5qVnoKPoJeWjqKjlZClrrOrqaKipaSVlZyZi4+Sk6SfiWNnXGVhTUpLS09GRUFHSz49SUE5OUpKTl1RUUk9TFZcOEZJPURNSThIY1xLQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2FTNlNaa1dzSEU2PXVlXExQn6CgmJ7Dp6Sis6CcsqeSqqOfo56tqaydu7GprLWxyMPBw7PCw77HxL3Eyr2wsbausbWwwMW1urGwuratmqmwqambnqahp8KtnK2xnKqirrGqpKi9t6a2u72vt8Ots7PCv7LGs7q3q7S2raqippWVlKKroZ+fmaerr6+vu7Kln6mpmZmXk6KkuKCho5Kur6ukpZ6RoZ6UnY6QjZSdmqOfqLWnp42YtJyjr5ugnLCRoZSYlZuAkqKWj46goJOLpqywpaeinaCekpKalIWLko2cn4BkaF1oZktKTEtTQUNASUc7O0Y+ODlOTVVfUlNKPk9eXT1IUEJNTEk4TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHddXj9bVV9nckA4PEiWd2VBNJ+kn5ugwqejqbGgo7SplbGrpqKksqytqbuyrbC1tMa/xMS2v8S+ysW2wMnCtay1qbC5rMDEtLevrba6pZmrsqyqmKGnmK27tJyosJutn661sqequ7OnubO4srjAqreyw720xae+rq23tamnrKGWlpGlpKGhl5ekrretsbS2n5+ppJmTlJOjoLejpKWVrrGxpamloZ6bmZqVl6ign5min6+zo6aMl6+apauXm5+nk52PlZmahpaglYyQnZ6Ui6mpqqKnoZqeloyPmZCBhpWIlZ96ZWpdbGtOUU5OVD1DQU5DOzpJPzc3UU5dX1JWUUFXYFxCSlNIVktIOlRkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM5MDZwW2JIMDVKcWlWQ1dGjHlmQzukpJyhpb+mqK6uoKm1qp23r6ujqrS2sbC4t7C3uLfEvcPHvbzDwsfBusHGwbqqtqWtu63Bw7e3qq2yvKOVrbGtspemqJGquaqhp7Cdq6CvtLOqqre1rLuss7K5t6y4sMG6vb+mw6qwtq6pq6umnZiYqqGhoJGXoLCvs6uwuZmbqZ+ZlpKXpqC3qaWioq+xs6uxp6ugnKCfm56lnaGYnaS0sJyfkJOmmqGpm5ajoZiai5aZlJaXnZSJkpuZlI6pqaego5yZm5OHj5mLfoyXho+bbGltYm5uWFFRWlRBQ0RVQDs7SEA3OlhQZF5QV1dEWV5eTkxTTl9MSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNzQ3Z1lhRihAOGx9aFxWOol7Y0M9qJ+coam8oKqvqqOxt6mltLKroa21va+zuLy7vbe2wMK/ycS5xMPAwLnFvcG4r7aoq7eyvL+/tKqusrifl6ytqK6YqKmOp7ufpa2znquisbCzrKq2s7W8rbCxtaywtbLAusW2q7yvsbesraqjsaWepKieo5aPmJ+yqrOpqrOZnaebmpSNoKaktK6noaysrbGns6uxqaObnqiknpWhmZyotqmYmpKRnpmeoZ+SraCamoeXmYydmp2Ui4+Xl5qXp6ajoJ6XlpaUgZCVhXuPk4OMl2dtcmhxc2BHWWZWRENNWERaOUhCNT5dUWhcTlpdR1teXU9NU1hkSktDXGNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FWMTUxPWBWXzgpQzNZVVxnSzWMemZMQKWZn6SrtqOrqKWurbWprrO4pqewt8a2sLe/wcK2tLrFvszFucPBusC6xLjBurO1rKq6uLu6vrWrr7G3mZioq6usnK6rj6u+nquvsaOqn7Gts66utrG4tqqtrrGntbCzurzJsqq1tbG0sK6moLOgmqisoKSVlZqZsaKtoKWvlqKkmpmSjKKlp7KpoaaxrKq1pK6wtK+jmZ2tp5uXnpqZrLiil5ORj5icoZmYla6hn5aClZmOnpyal5GLlJOemaWjo6GZl5OSlnuMkYV7jYuDjJNsbnlvdn1iRmBqWklIWls9e0pHRTZBYlVpW01cYUpcXFpSU1NiYUxLRWBhYFBNSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuK0EvSkdQW0czY1lUTEWalp+wqLGprKSjrq21qLezt6OstLfJurS7u8C+tLO3w8DMx7vEvbe/wMC4wL2yva6ourm4t8K3rK6yupaXp6+sqKSzqZSvu6SssrKmp6OytLGysbWwt7KprquyprivtbPExbaptbWrsK6pp6K2np+msKCjlJuZlLCep5ufqY2pop2blZelpaS3p6Kws6unsaetr7WspJmgrKicnJ2clKq5nJWPj4yYnaOYkZiopKCYhZOXkZ2cmJeWiJePl5uonaWhkpaSkJZ3hJGGfIaChI2NbnF4dnyAXExlbFxKT2RdP2J7R0k4R2dXZltMXmJMWVlXVVhVaV1PUEhhXl9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGcyNydGYUxWJS1CLj1FTFE8M3JrTEVEkZmkraSsraqmo7Cysqq3sLWfq7W5ybiuwbzDt7OxtcLDz8TAwr61vsHAu7+8tMSoqrmxtrfAvK+stLSeoaexrqWmsaWesrWsqrKxq6iotbqstbK1q7OsqquorKm5rbKwx7+4pbmwqa2tpqetsKWko66jqJudm5qvmaKioqOQrJ+joJ+hqaaluKSrtLSkqquorK62rqKdo6irnKCZm5KktZqPiY6IkaOhlo+Wn6KWlYaQlZSem5mWlYeYkpWZp5ygoI2Tko6ReH6OhH19fYeKinJ0c39+flxTY25eTlpnXUZElltHOk5tWGJaTWFiTlZWVldVWWheUVNNY1pbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0RkOzYqSGRISis6ST8zQ0lTLD6PbEBISZCaqKmhqa+kp6OztLC0tLCwoKutvcy6rsG8x7G0rbPBw9HExr/Bsr7Dwry/uL3FqK23rLS4vMCxrLKuoaOnrqqopbGjqrCqrquxrq6sq7O7p7ewsqmyqaqmpaOtuq2rsMK5tKy5qamoramnsaWppKKuqqihnpujrJWlnZiemaudoaeooaymo62strCxoKmin6qtsKudnqenqZqjmJmQoKiYhoOPi4ufoJCMjpeekpGIiJKWoZ2WmZaGl5OUl6Wcnp2MkpCOin9/iIR9d4CHhYd1dHKJd2xfWWBuY1FzcVxLO4R8Rj9XdVhgWU9jXE1VVlVXUVxiX1NPT2hZV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTM5NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkswLkpnREY4PEIwNUVLWDFAlF1ATkaVlqynoKmxm6iosLWsuLWtqaSrqr3JvLG+uMOvsKyzw8TOzsO/wLTAxMS6wbXJxKyvt66zusC+tK6urKaoqrGppqmyprStqq+trbGusq20u6W4s6ysraeroKOesLesqq25tqS1taSqp6ysqq2gqKansbGkpqWhoauWqqGTm6ClnqOjqqOsop6msbasrKKlo5qpq62pnaGlpKSZoJmWj5idk4GCkImFnaCNi5CNm5CSjYWOmaWbk5GbjJOSkpSjmpyai4+LjHyHgYKCe3WBhIF+dXeLo4d4al5gbmZXZodkTkBnkkxFYnpXYlhSZVVNVlZVVE9cXWFWTE9qV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOzo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIdCSUlElpCupKGpr5ipqK21qrWwqqSrqqm8wMC5ubS8taayr8PJy9G/wbu5wMDCusG6wsSusbWytLzBvrOxr62srKe3qqWtsKu4rqiwr66xq7WqtrWntbesrKSpqpyknrOzqaiks7Sfta2hqqirqKunn6urqLm2qaqqqaGpn62bkaqhnaCjo6aiqp6cprSup6WpoqSXpKanqpyipKOgmZifkY6PmY1+h4yHhZ6eiYWMi5CPko6FiJejmo6Nm5GSkI+Sn5iZl42LhIB0h4F/fnh1g4B6eH5/iJ2PcHFmZ3F4XGF0iGpPXZhWSG15VWRWUmJPTFVVVVFPWFtiVklRalRWVEdQWVVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UyMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyQGY9Tlg/Qyw/TFRfL0lrN1JGO5WNr6ClqayZqqOtrrK0r6qkr6mou7+8wbKwua2itq/Ix8jRwL+9urzDvrvEwcC/r7Kzs7a9vMGysrSrtKmltqmlrbOyuK+irbWxr7G5q7muqq63q6qeqqugo6G1ramhn66yobSqnqinq6OqoaGsrai9rquuraGnqJ+smY+woZiioKinnqebmKmwqaKfrKKhkqGio6eYmqmmmJiZnY+Lh5WIfI2GhIWkloaDg4yHkJCShYeVoJaJkZ2Rk5CNkZyVmI+LhoZ4dIF/fXR4eoB7dHR7aoKIpHZpXmVsgXVniIt8UlZwXkt4c1RkU1FfTU1TWmZOTVdZZVlHU2pSUT5CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWg6MzhfPWFkP0YxQ1BbWytIUDtZQzOPjrCgpKWqoqWjrKa0s7GopLCnqri/wb2xqbqqp62wycbI0MO+wL25v8C9ybzCuLGwtbK6vLnAs7W8rbmso7Wmp6yxtriypqe5ta20vK+8pa2ttautnKmvpJ+krKqonJ2qsqSzqJqqp6qkqZ2iqaepvauzsK6dqaSgr5yas6KWpZulpJ+lmpmoqqWemqmhm5GboKSdmZepqpGZmpKQi4KPhX2Pg4CIno+HgH6MiJKQkYWClJqThpOijZSRi5Gbk5aHin+Acnp5fnxodnx7dXFxfmqGeoWIZF9oY3KFe21neV1eVkJXe21UYVBSWUtMTnB0XUlaW2hZRlZnT0M+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpKwmZ+fqaSioauktrKxpKmwpq25wr23sKS5rKmosMLIyczCt72/tbjBusi2w7W0s7Wyvbm6vbauuba/raKzpqqrrrS3tKmcubuosb6yuqCutLapq56tsaOcpaipo52bpLCmr6Gfqqmnoqqco6igrbynrrGuoaqipK6enqymmJ+aoaKbn5uZo6qimpmjo5WWlJ+hlpyWpqyMn5KPkYyCioCAj4F7mpSMiX1/jIeRkI2KhpKXkYeUo4qSkYeQmZCUgYh9emx9dnl4Ynp6cnBxc3hqgnVrgmdjZ2Fuc45tYmpvX3BBXXlrVl5OUVFLSU1TWVZNXF5sV0VYYU9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUl0+I5GWq5ifl6eioZ+opLevraKvr6isuMO6tK6gua+rp7O6x8rHv7jCva+0v7fEtsOysLqxssC2u723qrq4vqqktaeoqq+tuLComLi8o62+tLShrbe1pqaosLOgnqWlp6GkmZ6sp6ieoKqvp6Cml6Kon7C4n6Oxr6GroayknKemqJqbm5+ilZybmp2pppabnqiRmJKZnZOZlqGqkZuKjpCHfYd/go58fKGMjIl6hI2Fi46NhYmTmo6JlZ+JkJWCjJeNkXyFfHRwfHFzdGB4eGpvcXFwa39zZHpsaGVkYWaHgGBbcmpyTU6AaVhaTVFMS0hQUlBHTVtfb1RFWVpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MF1bNSiVm6WYnJWsn56hpKG3q7CjtLOpqbrFt7OuobitrauvtcXHwLe/wrmwtb23v7u+sKy+sLO/srzCuKq7urinqLWop6uvq7KvpJi7tqSrurWvnrG4r6mlp6+ynKGkoKSjoJabr6ahn6Kor6GgopOjpKK2sKGmsaufrKOumJ2qpaifmJqdo5Oam5qdpaqam5ullZSXlZyOk5eiqaKRiouQhnqDfoSLeY+Xio2HeoKIhImNj4WPk5iMjpaZi4+WfoaXjI96gXtwcnZub3NfeHdlbGxsamqFb2ZyaWtmaF5kc4FgW2t2aVpKf15cWE9PS0hIUlVHMzldXmxQRVlVWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFVdaEQuPDJkVywylKGhl5SbqpyjoaKht6qtoLu3pay9xbSxr6O1r6ysrrTDw7yzv7q3sbO5uLq4uq+uwLOzuK+/wLetvbq1pqKyqaepsaqtsaCZv7Wkp7S1qJ6yvKmopamwrJmip5ykpZSXoLKkmZ6jqKmcop+SpKCkuKmkp66mnqWhqJOgqaKhoZmbnZ+RmZuWn6Gqm5qYoJSRlJaZjZSTpKikkImKj4Z5hHuEhn2djYmKh3qBhIeIipKFlpOTi5CWlI6NlHuDmI+Ld358bHRybGxzYXd1aGhqZ2dwh2hoaWNmampga2NqaFtme2NgU3RUXFtSTEpGSU9TQCEqaF5pTERXVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z1AnMp6ipJGOpKaanZ6do7Stp6q6tqesxMG4sKyjtq6nra62wL+8ssK2sK6ytrW4tratqr2zrrKxvL+3r7y7saWftqqlpbOnqa2dnMCrp6Wvs6qstbueqKqrsaWYnqqdpqSRmKWsopiepKmhnKKclp+dp7WmsKquoaGdnqGVoKafoaCam5mbkpidk6WdrKGXlp2Uk42Vl4uPmJupn5KIiouIeIV2gYKBnYeKgop9f4WIh4aRhJaUkI6PkZGRjJN7g5WPhnN+fmZ5b2tqa2Z1c2tjZ2RkdoFiZWZmZmpqY2tyW19ZXm1kYU5pWFpgVkpHSEtNUlg+OV9saEhDVVRdW0lJR0VBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyssMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFlKVmJmQDozQmhIJTWao6CPjK2hl5eglqSzsaKyvbahsca8urGxo7esqq2puLy7uq3Asq6urrausrizqau5sa+us7a6tq+4vaymnrWpn5+vo6munKG/oLCjrrGvt661nq2vra6imZ2nqaWflZqnpZ+ZpKKonZqfmpScnqyvprqorqKhmpuemZ6kmqSdl56Xm5OYn5KolaqnmpOampKMlZmOlJSaqaaOjYqJjnuBc4GBipiFh3yJiYWFioyJkoSUm5OSj5CRl46Qf4CNjoNvgX9meW1oa2lmcXJrXGhjY3SBYmZnam5sZ2tqaG5dbGxzcGBUY2ljZllJRkxNT1hRUVVhZYBVQVdTWVRGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyY0kaGbjY+wnZmToZqpsa+fub+1oLTCu726saa3r6etpLe3tretu66sqqu2qbO3rqaytbKuqbC2trCztrqmqZ+1qJydqKCorJqnvZispK6vtrWsrZ+xrbCpopuco6uonJScp6SdmqmipJaan5uQm6Sqq6q8n6ekoJiamZ2hj2uilpmccIKVmqN/dZGpp56UlJ6QiJiagJaKoZB5h5SMg21pfnaDcWyGi4Z9hYyHcF5jYWeEmIVri46UknR3i4R+g5CAZ4eAZ3VoZVdcaHNtTlBqY2dzhWhfZWZubWpeX2GKj4OEZU5LRDlHVGheSkdRUFRVTEhSYG90ZUZbUVVQRkhFQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUFAQD0yOEBFPTEsKzA4PUc3MDEuKi4qLzU2OCwjMScyMTQ6MTc1WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoukmYaVsJubk6Cbqq2qo73Fr6m3wre9va2mt7ClqqK2s7GysbmsqaastKWvtKKpt7a2qKestrKutK2zoamfs6qeoKObpaaXq7mUpaWvs7etrqWprquspaGenKGnppuXoKWlm5unpp2Tnp+YkJ6oqaS2sKSjop2WmJeXo4ihjpKahqCHk5ygf6V/paqekpKakYiEc3iNjoWIoXaIjGmXiGZ9c3igb4iHg36OfH+hoKCZgHyHnnSHjnWbimyHgYNtaWVjemxyYVOFbWJsaZhxWGlxcIhYXmlbbGxbiHJuenKFZ4aEWl9HTj9HX01FUlZWUVFTV1RnXU1WSFJST0ZHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3LyiKp5eDnKucmJidn6mpp6q/w6+xury2wL+qpbevqayksrSurrO2qqilsK2ltLKbrbW2taanqLKwrLKnrZ2qoLGnn6KimaChmqyzlKOlpba9pq2nq6qsqKahoJigpqOZmaWjpJicpKmWlKKck5Ojpaaht6SkoKOYlZOXkpyIr5CXlImpi5ahnIWxgKOsnZOZnZR5gtSogIeVwZvHeXixpbeXZIDAnL95hIR5kYR8kJCRynKXvJzFenK1pruQe4BtlrGrsHlobFixrm5lab2SvG5nem9yj9h+U2tjtrJ/gXKUc5qhqpBXT1diT1ZORlVbWFFQUoxcV1tQQVxEUU5FR0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT46Qjw/QTg6Sj41MioyMkJFLy4zMi4rLygtLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjKeTgaeqn5ecnqWssqiwwr6ytb+1tr7Bq6ezrKyppq6zqa62s6enprSlp7etnLOytqulpKexraywpqqdpqOwoqGfnZaanpytq5Odop+0uqOqqaKtrqWhnZqaoqefl5unoJ+YnqenkZymmpOdoaaiobGjn5+jlpaSl5KZha9raoqNqn5mg5WGrWRwnZ2UmaaUca6hpH54u31roY92sV9qtFulgGWckWBmgntmf2p4a6llvnJnpox1sWp8sXh0kpRjbm2nbluEoUVoZoeWRXWcYH5nfKSnglpfjKtogJV4eWqnN0qvXFhTbGRbS05YX1xXVjtOiU9XVy9JVFNKQ0ZGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMwG5CilYOtp6Weo6Sqsbestb2/sLbEsre6waapsKquqKivrqKwuq+jpK2yo6i4p56zs7CjpaCprK+rr6annqOhr5uimpaVlpmaq6WVmqGftLOiq5yjra2gnpqWoKKonJido5+bmaGmpI+copmXoJ+qnqamoJqfoZaVkZaQmoW1m7V4hamZtZl2hrObt36TlpaplH5rgqZ7goaIkpSSd6tna7Fcq3qNhpR0iXKPhoB/iJCXeIKCi5iLg6CPhLB2d59xbGxsfItOpFhIYmKZfmNopmB5cnVTk4deUKltY3F+h4BinC5RoW9bU2toYExLW2RYXFpCPrF5V1hBI01oRkNFQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjg0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o5YVU1MBuVoJWIs6amoa+pp7Osqbu2wrC7wa24t7+prK2traatsamgrruqoKe0rKOrtKSmsrOno6Kep6qxp7CnpZ6fn66VnpmUlZWXnaugmZmkqLWvoqmPqaiqm52Vl6ClqJqenKKem5+jpaOVm56XmZyiqZummZyboqCXk5GTk5yD1ZOZuXCwwX7FhnzWlJu7fJqVpY+NnY2ke46HpIKlgnqseY+dVq96iH6farlauXaGg32mgpN8mHqqeI2dj3qxbo6EdJG8hW+UUK+nxYpRoHpjYKlic3KIbZeIYFO1tMiGgIl8Y6QzQp12XVBqaWNQQFhnWmRhSkhNbk5cUU9ZZllDRD9FPzA9PDU5Ozc0PDw4PTo8QzpGOjo/NjpAQzs2QE9MSDw6O0RIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFQNzElm6KUmbKoqKa0qqW0qaS8t8Gwub+xtbS6srSnsa+isLKmn621p5qnua2ir7Cfs7SwoaSen6apsKi0qKObnZ2qlZiWlZaUlqConJmWqK2wqaOej62iqJadl5ugpaGYoaGhoZqhoqebnqCelJiapqCbp5Wbm5+hmJCSlJCdiLJuaLVxq4dujqZytHNytnual6SLj52Non+RoaV+sHaDkdLSdlyue4V/pG+bqqZrhoR8rX2XmY57sHKSnY54s2WXdISeb55mlFHIi1rCXJ95Yl+tYHZzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNlWEFPa2BsaFBWR0k5PVVSWldYSUM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTDYyMKKdk6WwrKOrvK2mtKantru8srq+tra0ubiypbSzoLGxop6rr6SXprmtpLGwm7S4qqClnaGppLGnrKmjmZyZp52Vk5eXkZGhpp+VkqWrsKailpOtoKWSlKCbpKaflZqlpqGao5+tmaCenpCVm6GdnKWVnZWaop+VmJWRm4Wse3eodqONiIapb62KgqeDmJihiZKai6J/k5qJroV/grNccrNSrn2CgqR/cdd9eIV+jp2Fmpp2r4aJkZyHd7RhmmWagoKVbZJasFhLmnWYeWZgrV52d4homIhsXa93lZ6PeGw1eciusl9CVG9eZ2BFUGxgcG1WVk0uZmRpU1lQO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTY8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEg6OTmgnpWgubCXtMKtqLOoqbK6t7O3vrm3sbS6tKS3sp+zrJ+eqKuflKe1q6ivsaqttKSbqaCfp6G1pqapopidlKSgk5KbmJGUoaSakpCmra+moJWZqaCij5GhmaikoJWZpaidnKSerZ2hnaCNk56anaGYmZuWl6KglJeQpp2GqX19pXihjo2CqnCti4GnhpafoYmXl4ijgpGIlKp8gIudeG+xWqiCgoigeXTYf3aHc6iBjpuNkqR8lpCfhHuyXp1koH6DlW2SXKtbWpOAkX9oZ6pkcnuBa5iHc16rWomgjmtvZU9KQ6FcW0x0XWJnTlthX3JzX0tWN0qblFhHRT1HRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDUuOz4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMj84op6amsCrmLTCrqutqaW0sLewtb65ubGwtbqourSfr6SdpKennpOpsKmvqbWrqq6hmKCfpqSjuaKjq6CWm5Chn5STnpmTl56fj4yLqLCwp52Xm6imn4ySpJeoqqeUl6mnnp6goq2koZ6ijJShmJ+gkp6XnJWeoZWWjqucj65tcrRzqYt1iqdztHhzs4CRpKOSnI6JpIeQd7hvjHuLomprtlqhhWWXl2mhoqdtk3K0dJOYf7JqhZKIrWp1s2GdZqJvh5Nrl1ytX02hfIeRUnOjbHl/fm+Yh3Jdr1Y8nHdmVG9uLlynT2NTa2VibVpjXWFwe2NUWlI+Pm1vM0NCQD9NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKacm5+8oZuywK6tq6ynt6m3r7W/tLuvrre2qsC1qKmgmqWjoZyRqqmntaKyp66poJebp5+kq7idoqyalZmOo6KVjJygm5icn5GTlKq2sKiZlJusqpeMlKWYpayikZaqsqOfnqarsZmho4+Yopafm5aclqGTnamclJCrmYfUkpq7c7DDgMOGftWWm7h4iJCYjJeLjKeIeqS2dX13dsKCmrJgg7p5wHx1uGO1goyHqXyVgaypcXt/dLyIp6BpnWGmjq+hfox0h6p9vm9zvHSyg3V4gYpumohybo2kdL1ed31aYXm8a1pWXGp5XmphZWdjbXhvWlxZQ0FAc0BDRis1RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnm56ivaGXssOwraqrrLGnt6+2xLC4sK25rq3AsKujoZ6joZybkKmjqrKktKWspZ6VmaqYpqy4nKKtl5Sfj6Sfkoycop2XnZqRlZKvubKslpikqKeUkJaknKStnpGgqKufm5+oo7Ofo6WOp6KUopqcmJWjmJCvoJKUqZ6EkJi2f4+RjLeVeIKTmrV3bWtuc295kIWPinSfwbu9mnuBsahxgHORuYN8hoaMh418ioeMl3yku7m9nHV6tKN0d5d2dLB1mZ5mhmqNtXRycXe2jF5/en2JaIN5bnpji6xwdYV/WFunakVlWlRmYGNeY1FnZ3BsdUNOUE1EOlpNP0ozOzAgOD47LjM9QTk5Pz07PEM2QlNZWlpbW1pbXmBiYF1TR0dINERJVEFLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVzgqT15dPSs6VlUnPjs8p56gor+llrTDtKyrqKyrqbqusMWts7KttaazuKupoaGlnqCdmZOrpKyppbWnp5+blaCjnaukvaahqZaTm5ChmpGPoaehk5yXk5eUsbW3rZmepKSii5KSppulqpuVqaSlnJqhqKWnpKmhka2flqSel5eXnZ6Pr6iUm6ahjWp9aZumeIdyfZmOdHlkh3u9vsC6b5ODcpaIYHJqWl6biWBjiI+Va2CAlWNtnXdilWyAmpWUZV5gY3Gaimlyi32GlWdrf3J1eH1+Ylt3dIFoUFxug317i2tYa3qCc0pKb4ZwTnRNRVhdZ2FMW1hnY19PW211aXFSUURFTTtHST1NPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBfTCgzPltPJz8yPqmgqKLCo5u1urajrKWup6e1sazIq6+yqrOivbCxpp+ip52jm5mZq6auo6S0qKSbl5Sgm6atqL2nqKSUk5qVn5mSl6SoqJCdkZCYnLCyv6ycp56noomTkamaqKObmqugo5mbo6eso6Cro5qwm5WnoJaUnZ+dl7ClmKGnmZuQnJyio5iloZmbmZmZj5WBZ219cXeSmJSShYu1qo2GmJWOioyYloeUlYqEk5SRiY6TlJiUmJaaoKGanJShnY6CeqWFbWt9kXyAdYqKgXGCeHl2doqAfIprc4F0g3Vld313a296bWBjXXBoTVlaZmpgV1pveW1tZlRQRlM5T1pNUU8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSiw8LUCzoLOiwKGksrK2oKmlsqelsLSqyKqsr6S0pcCms6CdpKSco5WVn6qmrKKjtqufmJaVn5atqaXAnqujlJGbl52XkpOhnp6ip5KSmainssSwm6udq5+QlpannaqbnJ+smKGbnKKkr6eipaifrpiXp52ZmaCenZyvoJyhppWXkpeTn6CVop2XoI6Wk4qKjY6XrpB8lpyDkoKLqqmFgJmXiYSQnoh6hJCHhpqSiIaKlo+bl42RmJ2klpqTkZ2Nf45nobOvhYqEdnuSin13eXpvZnmQgYCJa3WBeohzaXN/e3aDh4JrdWR5ZmBqZmNkZmtZbHtvaWtdU0xQRF5URUA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9iY2FfXV5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0W0c1PCxAtKC5r7+sq66ysaCqprKtoqyzr8Svqaqisa28orObn6aioZyYl6elqaWkpbK1nZSTnZmZr6WtvqCropCRnZmYlJCUoZyXqJyEnqqro7TItKCqpKuXlpeZpZ2pmp6jq5Sen56gqa+qpqSroq6bn6CgmKSenJ+cr6OYnqeSl5ackaOYl6ecmpdlgpJ8ZX6NmpBjeY5taGt7kqSqamWbmH1nhoplZWloe46hj2tnjZiRo3draouZo5+Yc2xueoSOiHpYZl6Gg15ti4mBdlxoc3d2koCIgm54gniAc215hHR2iYiPg3xrh1lebHRkXnOJaWt8cWtkX1JOWElkWEFKND5HNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMllDOz8uPaWfury6r6y0saqlqK2usKatrbC8sKimo62usJ6slp+jnaGZmaaqnKyjpaeosq2elKOPoq+ltrmlrqKOjpqhmZOSmqCZmaSVe6Wtoqi0xLiloqevn52UnaGeo5uiqaiSn6GeoKmwq6ukq6CqnKefp6CslqGbpbCkl5uplaCdmpGjlp2pl519vYOIcrRyhJ2GrWh4ucS4cZOio3qmmZlyq4J8y8DAu3GMo4iCn32XmYmdwL2Cl52ejZ3CwXyCfJONmsPAfWylsm+MgW/Ken+bd5GDjoF2eYGAeXF6f4dwd4WMk3lueJRjZ2B4ZGBlgmNedGdsZGRZTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2FfXl5eXl9fX15cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLiNGWzNQWS9WQUI7LziWo7nDtbCwwKmolKOvqLCuraays66ppKWmr6ufqpiaop+cmqqnop2roqSopKS0o5yikqatq7ezp66ikZGZnKWSkZ+hl5ufnYimrKSsrcDAsaGpr6mXkZ6copmho6qjk6GinZ2srqqtp6Skp6GmpZ2sqJGjmqitqZqcqJuroJWVpJWgopacfs6UeHqkgXmVlptfro9ejqeBoqB8p5abc6uDgK9eY4yqe6iHhaB1mJOIs2OCq4ahjo2zaoSvdX2XiLdhg61ao81ukHZ72nt/mXB+h5J2fmV7iHZ2a3yHbn2GkZF+bYOQYXJtcGhgYHlkXHFoamRnYFJUU1ddS09DNUFIREQ4PjY7QD9BOz04QD4+P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSzAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGjqqets6umsqurqqOqpq+pn6abmaSXnKKvn6CfqKeipaCfsKyanZWnrqywqqirn5SRmp+kko+epJedp6OfraWrsKjAx7OoqbGulpKcmqGXn6mpn5Whn52crK6orKqcqKikoquSrLKWpaKqqp2ipaSgrp+RmKaZn5mTk5CXoHGFjJd1haiGcbF9nnKsfqKfgaWPnnargn2tf5xyrX6rh4afdpmSe3yXfqqIooySjJ1+q3uJlJCfgHutV53Fe49wk8F9gZVtdW+MbWV2ZYZvYXducm+JipKPg26TkWZwdXVxYWdtZV9vaWluZ2RYU11hWVJTQzlJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNXQEYhHEc6QzEuK7DTxsaytKCdo46joqKsr7auqLGmqKqmraurpqGjnZmhlZ+lq5+hpZ+oqKKenbCsl5qWqKeuq6emp56XlJmjoZGUoKyanaajr6ykrLWqus6yraaurJeUm5yimZ6urJyXoJqen6ixqqurm62rpaOrmq6xoairrqWYpKmoqK+hkZWio5mTkYSkaqR1iXqpdHqycIKmipmMcYmgm4ekYGBSq4V/roObdq2Bp4aFn3qZl4Z7ZoCjiaSZhoKjfal+gpaHrl98qVaeo5KBeqOfgHvDr8WLcq+zs7lyYqmvwnRojIyYjoJunJVxb3p4eXBtZ2VlcnBmfGljXVdgalhZVUxMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmFhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXUv6GZq6egr6KesLSwrqmsoqemqKqrqaSln5uknp2lp6ejnKuaoqyho5+voZyakqujta+uoKeanZWTpqKQmqKnn5+lnLGlpKixrbfIsrWqrKmWkpybopmfpbOdmqGUnZ+mrK2ksJutqqOjqqGzraGqs7Ghmqinra60oZGUoqaXmpF8qWyehId1q3l8sG+CpYyJn5aWoJWB0ri0uMmBgbJfYJSpg6SJh6B6mJaaeKrJdJqklaipkZOajYGciprGxnlnoYKldIGfjoJ9r11wtGKwdUujh22nR4KTZI+QnpF8cZmVgXF8dX58blxmanNxZoFrXmFZZG1cX1lJTUxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqLKtrKWinLK4rKqhpZqopKqrqqafpqWYqqOfrqudpaCsmp6ppZyntp6il5OoqrWyrJulnKCUj6WskZmcp6OfqaeuoaWnqbC1w7Kzqq2ok4qXnKWboaOvpZehlZmcpaatnLGerqimn6yjt6yhsrivnZquprGysaOTlqaimZ6Ogp1OeJqBf596hKN9g6SFh6afnZ+UhLh7e3m5gn/MxsK2eJuhkIuffpqWl4p2npiKpZikqX+whZ2GoISsfZqVY6ZtpHCPhZCBfZaCcqxgo3NxgJpgvH1SVXSOkqOWe36Uk4x2e3OGgHFcbm54cmqBb1tkX2luYmReTExRVEFJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX11aWlpYVVNPSEA4ODIuLCouKyonJz9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu5qq6fm6GssrOlnqCVpa2trqqnnKammqOnobOuoqmmsqCYqaSUo7aiopWXoam0uKOboZyiko+hsZmem6aloKGvrpylqKK2ssWxramtqZGHkJyonKKknKWXnpiamqakq5uwoq6kppivpLusoba2rZ2ctLG3r7Gll5yuoKOchY/RtcO3eYeOhZGTkICmeZShd4ygkoSlgYpxqoaFtG5yapmjnJWKnnyYmYaHj3Ovgqaco46mi5Odi5aQm25xsl2ldJN6nGyZf3uZfG2pYaNxcX+fYnOyuGh3j5SmmH2NjpWOeX55kINuanlpenNvgHVeZWVvbWZnYEpbWFg8SEhAVTRARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVtbWlhVUlJRRjoyMjMvLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWSc4yKrb6/vLq0npanpK21oaKZlKKopq6rq5imop+moKC2p6Oop7CjlKyjjqStop2Qmpqqs7OknKScqJGUl66fn56mopynnbWaoqqktqzEsKmrqaGMhI6coqCmopWZmp2Zm5mmpaiZraiuo6Wbraa9rJS9r6yfoa+yuKmypZqosKKnl3mokX18sHeKgKSliJxtsnChh618oY+Dp5WYgKyJha6Fn5SqoKGXhp+AmZWAe5J+q4Cdm5aLq3idoZKKlJKBeq9epIF9pqdknYB9l3Nqr12la3CFmV1gW4ygbZWRppmDlo6Zjnx8hJmAa25/Y390boB6YGdmcW5oZ2hDWWFbPktVM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFSU1NWWl1fYWBhYWFeXVtaWFNQT05JNzA0Mi4qLEFUVlZWVFRVVFVVVFRVVFNUVldXWFZVVVFIRklKIygovZOag6jFwrbAs56arKCtuKWjjpukop+wsKqfpJ+drZmeuaCjq6CvqZmuoZCrqKOWiZqQrrCspp6lm6yXl4+soaCdpqGapJ2umKGop7epwa+lqaSei4COm5qfpp6SlJmblJuapqWmm6qsrKSln6movqSWwqyqoqCrsriprKWesq2nqJd1r36Qi5yFh366rYqZZbCNZZWtfaCPg6aVmoGsioSwhaaapKGhkISgXGxqgbNgf617e4OBsW1nb5mZjIixW361XKSEa8iiZJ+Ae7xYdrVZsn1SroB6rFiAoW2YkKibjJiSmpp8epGff2V1fmOGeHSBfGFqZ3BtZ2VmT1VkXEFVXz5JKD45PTQhIiwlHzIuICoxLzA0NTc5OTxBQ0ZISkxOUFFSVFdaXmBfYGFhXl9cW1hVUE5KRkM1NTMuL0BVWVhXWFdXWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9KfsrG3vbqzwbKinKympLWooIqaoJ6cs7Opn6OgnrWZoLSoqqyer62drJuVr6ehjoibjq+rqKahpZmukpiPqJmhnaWfmqOjpZmgoqqzqb2wpaienI59i5uWoaCYj5GanJKamKmgopqprqimpqKlqbueoMampKigqrS0q62lnrqsq6uUgKmSo6+Om4CHpJeZkIKAuMO6g46ckoSnl5yCrIqCr4innJumqpB+1b3CqmKjv719fqOCg9e6uLWFlZODnr2+hG2jgm+rhGycf3qysMeDaauwvax4d6K+vHOAlo6mnZGbkpqge4OTnHtkfntlj2d5gnthbGVramNQYltTalw/VGFDTik9OjQvHx8kHyUyIB0kKDA0OTY2Nzc7PkFDRkdJS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PUE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbOzsL+4sbyyopyupqSypp2LmKXAqriyqKG/pqeynJ6xnLqon62vpaeUlLCrl4yDm5GupaKsoKOcqqCXi6OSpp2nnJqhqaOZn6Gsraq6rqijmpaSfIiZkaabko+RmJmPmJSpm6GZqqmhq6ego6q7nqjEop+toqmzs6muqJ+5pq2tmXN2qqW4hmSJoHBorpGKkG5ud6SQmZ+Bda6YlHCPi3GVqKObl66kcmxsbGaLeG9ugplxgXpqcWlnipeWmHFpaYWIZ3GGZF2IYmpvWVxmfXamX2FxjpFuZWR/jZOPoZiZmZOaon6JkZZ2Z4h4aY9reYB5ZW1jZmxiS2VYSmxaOlBlRVInSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWVxeXl1cXFxdXl1eXVtbVVdeqZSss6m5uLKzqqmhrp2jsqmXkr+zxcq/t6uewKytpKKnrJ+6o6Suq62mjpeuqY+LhZWWrZ6mqqCdpKOgkYukkqaYqZqXo6qhlp2mpqevuqysmpuSkXuElo2lmI2RkZmVjpiWqZagmKmjm7GmnaKruZ+vwaejsqWrr7CprKqmtaKstpWKoaimt52JlqOZh6qbkZWdkqmymZqjqqCylqKhnZ+inKGloZWrp42SkoyHk5ydlZGZk5mRj5aGgaWbmJaOi5SUjJCGhH1niX50gnVzh4pwp2x6lJGTkoGBjY+Qj52VopeamqWEiZePc2qRd3GMeHd9emptZGNvZFVhWUBqXEhjYU9ZK0Y9KychNzUwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhVVlleYGFjXV5UUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaWlxcXl9fYF5eXl9fYGBgX1lZYKaWqKqktLaurqGwo62foLWxkI6syL7GvLqro6WenKefsamjtqedqbSmqJGYrKKLh4mPnKeVrKSfmKeenpKUo5anmaialKahpJCbqJmhtbqoq5maj4x8gZSLoZSKlZGWkZCUmKaQoJuqn5y2o52mq7enrsCtoralrq+vq6iosbegrbuYkaWkpraikp6noI6qoI6Sn6Orr5qgo6+or5ijoJyjqp6enpyWq52TmaGblJCWq5qOmZmXkZafkomhnpaVhZKNkY6Vi4B9ZouFdYZ1eIeCc5xqhY+Uk5CJfYuVkpKYlKOTn5mkhYqaiXxzl3N7jIBzfH9qb2RecGpgW2BabmRQYGVQWjpHR0U+Mj0+OS8qJispJh0mNDE2NjY4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWFlVlBKQUNCOjlFTVZbXl5bWlxbW1tcXV1eX11eX19hYWJhYWFgYmJiZGJcW2OXlaOnoq+xq66jqaasn6e1qpCPnaW1vbCuraKjmnqeo7KkpbGpl5u5pqOTmaqcjoaKiZyij66eopWon6CSlpmbrYqplo+omamNmamPnrm2pKWZnIyIeYKUjJuTipWSlJGNkpejjZ+fqZ6fuKN/g6+1oq+udKO8orGfd3ifqLC5lHWso56JgKt/ZFxidqCPpZ+El31tkrOco6etqqJlnp+Sc3mal3CAmKiYbX+iqIplnKadkpiYlo2SnJKGnpuQloSSh4+PkomFd2qOhnaGcHuFf39gaIeKlJKLWnWUkGdokI9ze6icnGZ7m4mEeZlqhYyEb3qAa3JlX3ZxbGtoXGZmYmJwU1s+Tk5OU0c+QFVEOjEvHh8mNDozMDY2Nzg8Oz5AQUFGSEJHRklLTVNUVVldYGhmaFhQSjxERzw4VVJbYGFiYF5fX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5Wmo6CusKyrqaWoraKnraSSlqu2sbOnm6unrJdzjJ2woKirp5SXuaCgj5yknZF/iYibnoysmqKVp6GdjpaSnoR1rY+Ip5upkZekiZy6s6igmZiLiXV3k42Wk4qUkZGUjZCUoY+coaeZnLKVgIybtZ2zjJKOuqagfqeieqGttYCOjaWeg4uGkLGqr4yKl6SbeoCLrIabnaGnqKeHlYWYd6WbeoecgZengoJ7nLJ6ioahmJqVmJaDkZeXhZuZYnqHkIWPkJKLg21wjod5gHB/gIR+hXOFhJWReJZoknSgmnV9mYWjoImYf5SMhYWaa4+Ohmx4e3FxZ2R3b2psa1xla2pmdFxeSVRMUkBFNi5aVVU3KSEwOT4+NzQzNTY4Ozo9Pj5AREk/SUVKTEdTWFtZXGJhaGZaUUg5REw7PmFWXmJkZmRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXop+mrK2rqKygp6+mpqmlmZSvyL+xopeoqbaekISdrJynoqCOkL6emoyfmqCQfIaPmZeHrJyhlp+gkYyTiYaAkaeNh6OdpJSYnoaeurKonpqSjoVxdpCJlZCKlJCPm4yQkp+Sl6Gllp6rh5+0ibSarYrKh6msiLaFjbCBr6yCqIymmI2dfaiPcnt3nI+nl2iVpHm0jJ+epqeSmMKBf6uImKFynoCapX2XhZWygaF9oZShkJmXgY+UnIuZkot9hZOHjpaSiYNtco+FfnlxhoCDe4N0hICWgI/FZn+ph4+ja56FpJ2FmoGOj4eLmnGPlIVoeHV8eGhodnBoaGxeZHBsZ25ZZ0ddUk0zRTQ3TmJkNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05JSkxDUFpdXFdhXmlsXFFFPUtNQEpjWF1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUlqKfr6eoqKWrn6O3sKmrppqUoKOkq6SXpqu4o6+Aoaidpp6diZS9mZONoZKej3mElpaRh6uZm5yZoYSOi3ebnI+fkIiepJyWmpiHo7mupZqcjIx+Ym2Pi5OQjZCNjZiMkZKgj5ShoZmhp36hp4etnaCWrY+dnJyQhYCgjKmthaONqZmMmn+idYCZlGuCrXZNq3iHjZyRmqimgKmrfYOhe3qnap5/kmtnl4aXt4mefm5gZFmDl4CNe2Roi3KZfXmWbF19l21fUnCDXF9reIJfWGSBfIN/lnCnqmuDo25ypXCfhaBqZ6BtW2+MfWdaYISAYlhQb3dmbXRya2pvXWpwbGxqWWlPXVlGOUE1SERfbDUsSURSTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXV5idWBNRDpNT05UYlxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5WdoLigqaOmrJGgtruqrqKZmKGipa2uoZ6vtaOokqGgoKecmo6ZtJmQi5+MlYt1gZSSjIqmlZWZnp5+koWFrKSHm5CKmamZmpuSiKaxp6KWmoiJgGluiIeLjo6Ki42SjJGTo42Un6CcoaR/k4GPoqGUoHaclY+ngqCmf4Wnq4OleIl8hJp+onBzlIiWfJ+NeW2Gm4yZj5uomY6HnXuConN2pmaefnekX5h6fZN0om6Yt7S6dJOIg4C1qGSBxrh7cJW2jHKAmqNic6yrYHxpnbN+bXyGgY2Ci5hxf6NscqN0n4WBpGGdmbOWcn2Yn7N1c1uesoNqYm90dnFpb1hrbHJzZ11pXmJMRT1ENlFCWnMzPVNHYEpSPTwzOTU6OTZEOztASlA/VU1PUUBFX19bWlhgYHxkSEM4TVdVV2JhWmVma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJOVlKO3mKqbk5+NpLa0ra2gmqKdpKOmrp2csq6sk5iimqGkmZuVn6ubi4iSeIuFcYCWjoqQoY+SlJ2YfZCJjaigh5eOiZKklJybjYupqKWekJeHhX5qe4d+fZCNg4uRkYmQlKGDl56gnaCei4l3nJiijZ9xoYqHqYebpY6Upql9rYx+eqCZeqOTeIF0loiNnH2Wn4abjpibpYWiZKF8iJaQm41tnmibjm+amXqAi6d9cml0q4Ofg3SqaJWaXZuFdoWeZ6prgLhmXKhwgZxglYxep3Z1h4h+nmiadYaTkpeOgJ9vmpFup5pdqX95u2t+qlyOhF20Z1xucnp4a2lccWp4eWRgZlhiQlFGTzdXQ1JvNUxbW19OWkRBMjUxPDs2SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5bXllkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FgZGVla2VjaWhna2mVm4mptJqniGOUm6u5sbCsnqacnKmgn6+cnrGprZ6XpJuhoJmXl6CjmYaJjWqIgHJ7l4iMlpaEkZWYkHqKhJWjnIqUj4aMn5KdnYmQqaOgmoySioGAaYGGeX+XjHuJjo6IkJebf5Sjn6Chk5hyaJ+Jn4+McJKMgamHmJ6hpZ6me7Cto6K4l3ejs6OkgIiUeZ17q5l+oo6cmpaIl3GhfIWNr7V9a5qRoXl+mLWipKuohJl8m32em390qlpdb3uWi3ieYkx/e3qFY3mXQkyfWKJqcXuObICIhJl1m3iGibGzf4Cbk6d3g55uc32VcJp0a6RdlXZIZWRgdHF+fm9mYGxpdnxlZWFRX1ddVFdAWkZRaEVUV11iWF5JRD1COD9COklGOExFWEFXUltWREZiXFpgS2BtfnJFQjxVX2JaZWlWZ2htb2JmZ15hYVxdXmBoYl9lY3ZtXWVnZmtkZmxpaGtpk5yAsK2ZhFNeoKazubKyqZqijJysnJyqlKKspKOoj6CenZualpmhnZaIh4l3hoFveZWFkZuLfJGTlohygIiSoZxzkZCBiZqVoZuFj6mcm5WLi4t8g2yEhXGCoYx4ho2IiJOZlnyTpKCeooithn21hI6enXullnqpgZWbj4mfm3ynaHdtfpl0oXNyfJ2GmXCTg659pIOlnZmAo29eqWd1omNvpWGc05B9e5l4c3NiooaQfqN0pJB2a4+zjGCCmIlzqrKovH93g21+v6aptF2bbnxwlm1/cqJyXaRnc6ZgaKZtm9SafoabcHp7mGycfHiXc26ppGdgZXpxgIVsaGZkbnV4aGBjU1xmUVFiSFlKVWFXVFxma1xlUUZDS01KS0JLRThPQFFOWFNZT1NRYGZmalJjd3l3SUZFY11lWmhqVGloam9jamdgY2BcXV1faGJhaWV8ZF5kZ2RrZGptZ2hsaJeaf6+qVFxLfqmvsbOvsqObmYWZqaChpI6mqaGZqoubmZmUmZOSoZiOh4V7cH2EaH2Pg5SagHeRjo+Jb3+Gj5OSbJeTfImSk6WXg4+rm5STi4aJeYN2h4Bugp+Gd4CShoiZo5h7lKOkmZ+Js6Gitot6rKekrqVwqYCajoWAmpB7pIChmYaYcp6EpK6vipeMgI2kjZWDraCTdrW2tcmhc5SLgZ9gnpepbXmWh6CbdKKId6B+k5eLgXBNZqOScJuHc6R7eXRhg4FrfqBrcWRfnHF9c5ZoeWmztbTGpnOYfXqda5ybq3aFm212eJhqmnt1mHJRRX2zX2p2a3qIZmtoY3V1cW5XX1RZaVBTaElXTVlUVl5pbG9WaFdOS0FKTUtISk9BUUtQZWNqbWV0cnN/eXxudYl7e1RRT2xeaVxraVJqaGlsaGxmY2VfXF1dXmliZGlre19dZGhjamZvbWVpbGWhm4iupYNkP5Ohsqqur7WiopCAl6qio6WMpaeenaaDm5iXjpeQj5yTjoiDemp5h2WDjX+YoHl1j4mMgWmEhZKDjIWdjXmNi5amk4SZqpiNkouBiXqAfYt5cJChhnmAlYeJlqCWf5SlqJyVlYNmbnicbKJke3Gld5uYcGemgJWKeqR6n5aDl3Oed4GKlZePuW6RiqJifZmglYhucmmqa3WgbW+mYJtpi5BploeblnWigX6aYIyGjXVwiGJooGWefmmbdW9jZoiBbXGiWl5bYqFtXYiLbnp9c3JkpW14omRnp2iZc4yZcKJvVYmQb6BfZqhUi15UmG5tc2tygm1waWx5dGtwUllXV2ZaVG1JWU9dSVhpaXNrWWxXUVJGVlxMWFNhVWlrX3d0e31wfHxyg3uAc3aNgIR2XlJyYmdjcGdQamhoa2xuaGRnX11eXWBqYmppdnVdXGNoY2pqc21ma21jnKOXpXlkc22Lpq2jqbCxpp+LgJirnZ+mjKOim6OigZaZlI6akIuYkI6Ke4dxgIhpi4t8mJtzdYl+kHtkg4eVioqVmYJ8iIeXqJGBo62RhpCLgop+gICOc2mQpoR9hpONiJmgj4iTqaadiKZ4lZt+pIiWi7GYnZCCr5efpXaUhnipc6WPhJpupKKMkoSNg7tufaWvg4aFhpOVnJ98pXpyqJWglmeefm+sZJaKlpN3qG2qooGJdomDd6uRpohrkbBrdrOMqWuKhW1tn56SlWB+q4uqdn5+i6Wedp98g6SVnaBqm4h4rGierYy2dHe+jaSTWoOnjqthdXJ0cHx1cWNrf29pbVNXW1ZhYl1rTV1SXUpebW93YFtxWVxgW2d0ZW5vcmNydGB3en55cnmDc4R/gXt7jIGCgHZieGRjbnJkUmtnaG9scmpmaWFgXlxha2JtbHpvXFxiaWJsanhtZ2xuYpWkqZyBf52jlqmpnaimrqSZioKYrJqfpYqbpp2pnYWNm5CHnJGFko2MjXSHe4iEb42FfpiTdHSGc5KCbX+LkYeGk459e4KGmKaOf6enj4GOiYWVdoKHkm9si6mBg4yUjomdn4mMlKqin4+AdZSXiH6BeZSuon+Bm3GPhneOiYJ9e3KnjHJ+fXqYlpuEkHl7f36HlJWTinaQmJ6gg3t9iWuMhVt5eXJ6cWlufpKJcYB1gY+Uk3GHhIJljH9fgX+Ld3RylHVveW5th2yEhV51Z3eOZYCAhY2omn10e5VqiYhwgXZ9h3dubmiMc3p8mHiFXGxYeY9pb3hycW94eHBda4duamdWW2BXXWZrZFZjVV9RX3B5eW1rd2Zra2t3fXJydXRhb3ZidHuCeHV6gnWAgICBeIuFg317bn9sZHluXlduZ2h1a3hqaWplXGBaY2plbXF0bltbYmxkbGx5bmhsb2GNk7eopomgopqmo5iknKuioYSEmK2SnqGJm6ebqZiDgpyMf5aUh46KiY1yg3yPfX6PhXuYj3RyhHGVhXt9kouGho+EeX6Ah5qljnyoooyGkJCFlYOGjph3coSpho6SnZCJn56IjJunn5+qhImOlZp+fomWraePkaaPd2+bj4F4kG5+qIVxfpVxa3B9gqCNgJOOi2hsXIKLi5uano5zlYuIcXRrgnd0gVlyboeRgX5/jGpdamR7hoSJgGBpeHqae4KKgXWBhYFnd4qGamFwcYF0XnGKgYiOpZSFZYuNg253i4Rxho96cWhoZXyEe5ZbXGtobnZbfHl4dW5zc4NnXG2La2tiWlpfW1lscVxfYVpfXWV0f3x2cHVka2trfH1zfHl1ZG51aG18fnd6fHt5eoCAfm+GioR7fXR+eXN/aFRccWlsdnB1Z2toZF1hWGtoa2txcm5XW2VubGdzem9oam1gi4qpsKGPoqGanp2Xnpioo6J+g5mujqCViJyikaWVf3yYhn2SmYmJhoeKc36BjHaFjIKEl4pyb4BymIaDfpKDhIaJgHqBhIycoZGDp6KIeY6XiZWLi5yXhIN6rYKRmJqVip6dh4ihqp+hoqOLiJObnKOZlaqhp6afkpqHlYx6do2Ng6d+f5KQk5SdsqablZ+QjbGSl4OljIyVmp+JkJuCiJGKa3yOd3hlg4eRi3yJnoSHjJCJiIGFhJB3fHp0maCIhomdiYSTfn2KgIB1b3KEgn53hYaKj6WQgoWMhoKMkIx9iIyKkYR6bYOFfnqZa3NpYXSKcX56d3dvd3SCXV5vh2huX15aXV1TaHJWZF1dYmxodnx9dG9wZWtqaYB9bnmAcmpwcWxngXtygoB4f31/hHttgoyGfHp4e316g3hOY3Zqc25wemVrZWNiYFt0ZnBncnFtVV1sdG1peXpxZ2lrZIyHnLmelqGgmJSYmZSYpKCefH+arI+fjoagnYueln15lYR8jpmKhoOEh255gYFzgYh+iZSEbWt+epeHhIOQf4CHhIV8h4WPnJ+TiKyghHOLkIaSkYudkX2Ne6qEjpOYlo+cloeHm6WfopqdhYKSmpqYj5mmn6WdnI+Vf4+IdXuGjYSle3yOkJGGmauinpSdkI6pjZCAnYyIk5mego+XfoeOg294hnJ1YH+EkIZ1jZmBg5CDh4V/hYSVbnl2dJKhiouFmoOEjHN/iXt8cnF6h4J6d4mNg5Gmj4WDjoCDiomKd4aJi4x+cW1/gnxvaGxtaF96f2h+fHZ1dnV7eFxfcX5udGBjW11fUmduVGVbXmJraXZ6f3JsbWRramiBf2x0gWxsdW96cIZ5boeAdoKAfoV2coKNiH57fHx/e4KKYGh7anVpaYJkamNgaVxjdWhvYnVtbFVjcXllcHp7c2VqbW2LiZ62maCjn5KRlZiLmp6fnnt4n6eRnIuHpZWLmJl5eo2FfImRhIyCgoNufIB5c4GFfouRfWtofYKXiYGIjnx+hoSGfI+CkJ2dk4mpnYFxjIuMkoagoYqFjHyokYiQkpeTlpN4jaOfoJ2WmX+AkJuZkoyaoqCjmZeQmn2Mg3d/go6GoH9+jIyPfJikoaKTmpGQpoyPgZqRiZKXm36Tkn6HjoF1dIJxd2F+gI6GcouWfYiMcox/goWGj2h4cniLmJGPf5Z9iIpygYZ7fHB3eoqCeHiPi4GUpZKLhY97hYaHhHaDhImJfGdzfYB5e3Fta2dffnNofHV2dHxzgGpeYHR2cHdkY1lfX1JraVVlWWBhaGp2eYJxZ2tkbGhmgIBrbn5ob3FsfnmHemyMgXOBgX6BdHaCjYZ/fHuAgX1/j2lyg250aWGHaGxiX3FWdG9tbWB4aG1XanR2Y3V6e3Jiam96iYyesZGlpJyOj5ePhpygm519d6WhjpiAjaOLiJqWeXuGh36DiX+JgoF/cn97dHaDhX6KkXhnY36Gl4qCiox5fYCNg3mWgpaZmI2XoZx/cIyCkZOGpZuHjImDppWFk4uWmJOSd5GdoKGXlJZ5fo6YmI6WmpyjnZiSlJp4jYSCd4OVjZ1+gYmNjHOXo5+ilJmPj6KMioKWl4OSlpl+mI18iI2BdnF+bntkgHyLhXGHk4CRgmyHg4GAiYVmdW97hZGXi3ySd4uIe3+Ge3pxfXeIg3iDj4eJl6GVgYOLdoiEg4J3fIOKh3hgenl+dH94Z21lYX9qandzdHZ+cXxjY2BzbnVybWFaYV5bbGVSY1lhYWhrdnmGcWNrY21maHyDbWl1aG5waYB9gnltkIZygIODfnR8g4yBgH57goN+fJBtdolzdW1limxqYmJ2VoRpcG5geGdsYmp2cGZ5fHpxYHJshoWPm62XpqeejYyXh4afk5eZfniqnYuZepedi4yYkHl8gYx+fIR8gYOBeHR5enR9gISAiYuAZF99i5WHf4WGdX1+i399mIaXlZiNpKKZgHOHe5ORiaaPjI6Kk6CRg5KQlZeRi4GPl5+akZCQc3+NkpSJnZ2eppeXjJSVcouMiWuEl4+ZeoeIj4lvl52apJSVi4yejIaBkZx/kpKVhpmIe4qKgXlxemx1bHx/i35uhpODlXhxgoR+fouAZXJpe3+Wl4N+jXOPh4J4hn11d398hH97gouDipOjj3iDgXSJh32AdHaCiYVwYnx2e3J9cGJvY2R8Y25wdnN4d3N0YnZgb2x2bm9cXF9eXmpeUF1ZY2FobnR7iWxgaWVrY2l3h25nbGlrbWiBfXt3b5CIc4CEhH10gYaJe4N9eoGEfX2OcnqLeHhtbIdqaF9pcmOHZ3FvZXdnbmxheWlrfXt4cGF4bYuAmJipn6SonYqKkoaKnYuVmH54r5mNl32flJGXk4h3fnuKfXyAd3iAgHB1dHxvhn2BgYp/fGFcfo+RhoCDg3N7gId6j5KJk5KdlaacloJ9gX2OipGjiI6KjZiajYaSmZSWjoqIjJKcko+MjG6EkI+RiJ6ZoqCWlYmWkG2HmINlhZiOk3qJhJCKcJaalKOTkomLmYyBf5CdfZKOkoyZjnuKhYdzc3ZscW51fIp0boaRj5NxdYF8gYGIfGVwbHl8mZN8g4h0kImAc4d4bn98gIV7hIuHgouUp4x6hnt+ioV3fnFwgYeFZml6dXZxfGJfcGFrdF9xant5eWxzcGV5Xm5sc21yWFtfYGFrW1BXWGVjZ3Fxf4hnXWlpZ2JncY1vZGloZWlpgXp3dW+OhXSBgoN7dYKIhXiFfHiEhXp/iXd/i3t7cniDamtfcGh0gGtyb21yZ29sZXxjboB6d3Fsd3eKfqKXoaegppuHi4uBj5yHk512gquVk46HoY2WlI9/c3x2hXh5f3Nze4Zrc3B6bot2gIGIb3FbWX6RjYeAf392dYCAgKCHkouUnpqilZh4in+BjYicnYqPhpKYloWJlZqQl4uLjY2MnImNkINtiYuQkYqdlqGbl5SFl4dpg6KBZYSciZB+i4OLgXeTmJKfk5GJiZSNfn2Ol3uRjI+OmpJ8ioCCb3ZwbG1vcHuGaXSDj5mLcXeAdYKIg3lmcm51gJmOe4eDeZOQeXWHc2+HeoSKeYqFgYeNmqKGe4N1got/d3lubIGFg190dXNxcXlaX3FhcGtecGp9e3FtbWptdmBvb2txbVlZYmFiblhRVFpmZ2N1cISDY11rbmRjZmuSbmBnZ19oa4F1cnNwi4B1f4OAeXaAi4B5hX94iIZ3g4V8hot/e3aKf2pxY3xjhnxucW10amhvbHZ4X3F/eXx1dXSAg36klZqsnqeWhY2Ef5eUg5CgdoyglJOHi5uNlo6LeXF4dIJwcoV0cXaIbHBudm2IdoN+gG5uVVGBq5WHg3h/d3KDeoOggpOClZSanZObeJJ7g4ySo5mTjomVmZKEh5eZjJSLiY+Ph52EkIp8c4uFio6InJqfm5WTf5N9aISbhmeFn4eRhJGCiXGDkZiQnI+PjIyPjHd7kZB6jouMkZaMfIh8gGt3am5rbGx7f2J6fo+XgXZ7gXiDjH15Z3Nsc4aVi36HhXqTj3F5g292i3mIinmIfIGKj52dhHt6doKLfHdxamyChHtheXFubXJ0Vl9wYnJhYG1venFob2Zmc3RpcWtid2VdV2ZgYHJTUU9cZmVdeXCIfWBcaXJiYmVmkWpfaGVbZ3B+cGtxdIp9dnyGgHV2fox5e4WBeIiDc4aFfoyMhHx5lXhmcmuDYIh+b29remBqbnR/dV90fXmGeHRzhX14oI+ZsJuljoKLf4OaiICMn4CLmpSPhYiYjo+PhHZ0d3SAcXCFdHByhHBraXdug259fW11c1JNgt/IktaTe3B1hHaEoIOUd5aRmZ2RmXuUc4WQnqGTk5CJk5yUhn+XloiNjYiRjIebf46Ad3qNfomMipybnJqUknmMdWaHkIVrh6KEkYiXg4ZjjJGZj5WLl4yMiopxepSIe46IipKRiXqGfH9tfGVzb2tsenpbgXmQkIF6fn+Aho57emhyanOKj4mBhYR8lIprfX5tf4t9ioV8g3iAjpSZmYp8dXeDj3hybWdxgIVua3VwaGp1blNfb2VwWmBscnhna2piZnhycHFjX3dgYFZrX152UE5MYWdjXXpxiXVdXGV2YWJlZY5kYWdiWWlzc25rcXaMfHR6hoJ1dn6Lc4CGf3uJf3KJiIGRi4h8fph2ZXNufGWIfm5wbIBZbG55eXNgdnp7jXZyd4p3eZ6Lm66aoJCChXeIlX58ip6IhqCSj4WMmISTjoeBdHhweXFvhG9tb39zZWV5cX1ten1qaGtjpJrB3K7woXNsdoR2haOGk3CXkZahlZyBknKGi6KXiY2VipCdloOBlpCFiY+AkYmJln6HenV/iXiHhI6cmpiYjo92iXVthYiJfImig5GJnISFXouTl4uPiY+Li4SJbXuWgX2IhYmRj4Z2hn5+a31keHZqbnlzWIl7koiFen6BgYaMf3llcml/iY2JgoF+i5WEa4F1bYePgY6DfYF4fo+UkpiPdHJ3h4x1c3FndnqEY3VucWNqdmhSYXFnbFZfb3R6YXJkYGl9cHNvW2NyYGJWbllceE5NTGRmYl53c4luXFxkeV5fZWWFYGNjX1lqc2tua3N3jH10d4SBeHd7iXGDhH1+iHt0i4mIloaMf36Xc2d1cnlsjHtudHGBV3F6dnlyZXd5h41pdoCJcn+chpimm6OShH1xjJR3eYyehYWhjY98lo2AmYiEe3N3cHRqcIFsaW18dV9heHd8cXV8aGBkfOvatcnD3IdzbHSCd4ubiY9qmZGQnpaUgYlxhYifjYSLlYqMmJR8jZOIg4mPe4+KhY+Bf3Z4g4RyiIKTnJaUl4WMdYZ+b4OBh4aYoYKTjJ6DiWGDlI+HioaKjoeBh2l8k399g4SJjo2Ccod/f3F3aHZzanR3bFqNfZODhX2AhIGEioJ2YXJriIGOiYF+fpGQfW2Ba3eEjoSQgnuAfH6PkY+ViG5weYyFdGtxbHN5gmF1am9dbHdhUmVyaWZTYHB2dWFwYF1og3Fza1dnaGJpWG1WW3VMS0xlZ15ic3OFalxcZXleXmRne2FkX11Za29mb2p0eIp+c3OBfnt2eohzhYN8f4d2d4qGj5mBjIJ7k3Vsd3Z5eJN0bnh7fVh5hnGAb2d5d5KDZHaGhXCKloWZoJqiiod0b5KMcXePnH6LmomJfaB/g5mAgXhydG5vZHJ/aWZteHhcYHl7e3FxgGphZ2F/1baOkaZ4bnF3fHGTkY2Ia5qPiZ2TjIZ7aYeLmYaBkpGGh5iOfI2NgYGKjXyPjH2JhHp0eoN7cYaAlpqOk5OBiHWChXSCf4mRnJ2GlI+ffohif5OHhYiFi42AgINnfJCAfn+CjI+Qfm2DfIN1bG13dXV4dmxjjoGPgIV+fYZ/hIl/cF9xb4R7jouBe36QiHlwg2V5gYmFioF6hHx+ko2PkYNtbnmLfnVtbmtse39kaWxqWW53WlNqc2liUWNyeG1jZl5aaoNudGJcaF9kbF9uVVtwT0hPZ2VcZ29xgG1aXGNzYFxjbHdlZV1dWmtsY21qc3eGf3Fwf3x9dHiGeIWCfICHdXmJgZKVfImGdoiBcHh5e4STb257gXdeg4B0gm1penSUc2dziHxxkpGDmZ6boIaIdnaUf213lJh/iJCEi46afIuad352cXBsamF1fGdianV6W2B4fHptcX9lY2hnV52PX3FzlrzEhHdxlIqQgHSYjIedlI2Ic2uIj5WAe5SLgYSbjHyKhn18iYx/k4d0iIV2dn2CcXWGgZ6VhpSPgoJxfodzg3qIlpuWhpKNnICIZn2TgoCGhIqJcoF9Z32Le3l/f4eLj31pgH2EdmZweXh0eHRsa4+Gi4KLf3mDgYSEgGtecHd6fYuHhXuAjn9+coBoeIGGiYSCd4J6f5aLjot8bWt6iHx2dG9paH53ZV1xY1hwdFNUb3NpYk5odXlnYV5dWG+Ab3RZZWNdam1gcE9ZbFJEVGhiWmxvbXtvWVtebWNaY293ZGdcXWBramNsaXN3gYNxbn57f3R1g3qEgnyChXZ+iYGWkXiDinSBiHN5eX6NkG9ve4FxaoJ5en5ubXx2lmtqeIR0a5OMhZ6YoJmFiG9+jHZqeZmPgIKKgpaYinmOlm96c3FsamRgdHtpYGZye1thc316Z3B6YWVkjrGyd0tiWqXa0Zdye5KMkXl/loyFmpKNhm9shZKReXmThoCEmYp8h4B5eImKhJWAb4qHcXR9e2p5hoOlkYSTjIJ/bn6CdYJ3hJqXkoqTj5SFh3B6koR+g4SKg2+BeGiAhXhyf3+Diod8ZXx+hHZjcXOAanpxb3WZjYaEi3x3eYCEeoJrXG98cn+Gg4h9hYd6iHGAbXCChY2Cg3GDd3+Xi42Dd21tfoN/dnplaGp+cmFaeFpZcm5OWHJ0ZmBLbXd1Yl5cW1l1fXJwV2deZmpxX29OV2lTP1lnX1twa2d5cVtbWWtlWWNweV9oXV5lbGhmbGlxeH+Hb21/fYF2cIJ7gIF/g392gYWJl4pxgo1xe4Z8enmElIx1a3p/bHB+dH99b3J8e5Rwb4B/eWaSioKhmJ2Rg4Znh4RwZ3qXin6AhYKZioF8jY1peHJsbGZfYW95bV9ib3lcZGyDemFxdl9kZdXrvosyOj6LjoByeYaJj413hZmOf5SOjX9ubYWMi3V9j3+FgpWJfIN4bnaHhYKWd26HhGt1e3RleYOEp4yDj4yDfW1/c3WCeISaj4uPkZKMi4d/e5KHeICFjYNsgHNpgH54bXx7gYqDeGJ5hIJyZHFpf252cnWCnIyBgIZ/dHZ+gHOBb1prfXN4iIGKe4Z/fIh3eXBrh4KOgolxgHd9lImKfXRtanaAgHV1XGlpeXFaV31TWnJmTVtzcmZcSnF4cF1bW1pddX91aVliW2dlbmJpTVdmUT1eZl1edmZfdXFbWVVvZFpkcHlbaF5gZ21namtpcHh9jm1qgoSAeW6Be32Bf4J6dYKBjJOFcICLbnd9gHt7iJOJgGl7fmt0fHKGe3N3fX+MeniEfnxrjIyEm52WjIKBbI1+a2h/j458fn+DlIJ/fYqIa3VxZ2ljW2Nnc29gYWx0YWhwiXphc3ReYmOboJBuXDVar7V1aoCKfpOHd4iYh3WQjIp3cG2FgoZ0eYl4iX2TiHp/c2d1iH59l29xhX1odnluZXqJhaWHgIeNiX1tfXR+f3uKl4aBkpCYiYuFinyPiXJ8foV8aX5ta4F7eWp6doKHgXJgd4J+cmRyZ3aDbnV8hpWSgn2CgHB3enx1fm1YbX11c4p/hnaGdIKJendybYh/jn+DcX17fJGHiHptbWhtgoF1bl1oZnRyUlx8TlxxXU9cc3BkVkt0eWtYWVlaYXGBdWFdXWBmZGhoZk5aaE5BYWRcYHZhXHVtWFhTdGFbZW9yV2pfYmhrZ21saXB3fJNsaYSKfXxwf357gX+CeneAgImLhHJ7h29xd4R/e4mNj4RqfntueHl3ind9eICCh3+Efn56bYSMiJijjYWEe3aLemtthYmSeX17gpKAgH2KhHBycGNmXllnX3BwYGFocGZqb4l0YXRvW2BkanZ7f76cp6TJuHKFhHOUfXmIlIR0ko6HcnNwhHqCc3WGdIh3lIl5eXFkd4Z6gJJocYR1Znd2ZGp8hIiegoB/jo59cX5yg3h+kI6Cd5WMlJCIgoh6iYlseXp/dWh6aWx/eXNpenaAg31oYHiIfWtqdGh7gWp2go2RlX98fn5xfHZ8dH5iVXV7cXKIgoJ7gXCGiXd4b2+CgYt9fHd8e3SNhIF1aHBnbIiCcnBdaGN0b0xmdkxeb1ZUWnRuYlFPdHliUlhYXWFwgnNbYV1oZWVjamRRW3FJRGRiXGRxXlx4aFVXVndeXGZuaFZsXmFqZ2Vubmhwd3qTbmmIjHl9c3t+eYKBgnx2fYOIhoNwdoNzbneCgn6Ii5R/cYB8eHp6gYt0g3h/gYGChHqAdW99ioubnoh+hnt3hntndYeNkXp/gHyJhoR2j4BncG5gZVxYZlltc2FhYXFsbGiJbmBzaVheY22Ad6naqceGiLNyinlwjnZ9iJCBe5SLgHV0dX52f29wf22FdJSGeHVsYHmBeYiOZXGDb2d1blttfYGQk4CBeZKSfXd6bIV0f4+Kg3KViZGPiIaGe3+GbXV2f21od2ZtfHZtand2f398YGJ4hnpodXZjfnxodYePjpZ9dYB2coB6fW2AWVZyfW9zgoZ+f3driIZzeGp0f4KCfHl7d3lxin97cmdzZG2LhGxzW2pfdmZJb29MW2NYV1Z5bWJQU3V2WVFWWF5gcoRvXGBjbWRjXW9jVF1yR0JmX15maV1ae2NSVlx1W1tna2FWa2BgbmZmbHFocHZ4j3Rrjo12f3Z4fXeBg4F7dH6DiIiDb3F/dXF1fYWBiY2Le3d/eIR8fYWHeId8fYF9hIB7fnJ2eIuOn4yJe4p3dYN6Xn6Hmo15h4R0hoeEd4l7Ym5tXGJbW2FVanRkYFtob3Bnh3FhcWZXXGNrf3zKzoe6omtub4ttcoRyfoaLf3uShXp5dHp1dHpqbHZjhHaSgnZvZ198gXmLiGVxgGpqcWNYbXuGnImDgnKXk3d9e22Gb4CJioZwlo6QiIaMhHt5f3JycH5naHJjbnhxamxxd318eV1leoB4aXV5Z4J3aHWIjI6VfXOHam9+gHhufV1XcH1tc36Je4Btbop/cHZmdn5/foB1e3B4coV7eHFlcmBti4FrclhrX3hdSXBsTldWX1RVfGtiT1R2clFSVFdeYnSGaV1ga2pmYlluYVhjcEdBaF1hZl9cVnxeT1ZlcVlbamhdWGhhX3JmamhxZ3Fzd4d5bpWKdX97d355g4eAdXN/hYWOg3Bwe3h3dXmGhYeMhnp8f3WLfn2GhISHf35+fYZ/fHh2eXaSlJ9+jX2LbnWAemSEiJiGdJKKb4WFgnqDdWNuallfW11dVWhzZWBZZHJyZ4FyYWtkV1pfaX94vq56n7huYnSHaXV8cnqEh3t+jYB3eHN3b3p2ZWpvYYd1joFzamJefXd4ioJlcH1oa2taVm94i6SBhX9wmZJxf3d0gGx/gI+GcpOHjIiFiYV9eXVzb2l5YWptYW12amdra3l3endbZ318eWZyfm6FdGZ2ho2GloBwi2dre4N0bHViW256anN6inuAZXSHfG1wZ3R9dnx+cHpqeHl/eHdvZWxhbIl9bG5WamF4VktrbE9ST2lOWX1oYk9VdWtNUVRVXmZ2hGddYXFoZ2FXaVxca2lKRWpaYmVXWFV5Wk5XbmpZXWxlXFplY150ZmxlcWZzcHSBeHCZhXZ/f3h/fIWHfXV0god/lYNuc3l7e3NyhYaIiIR5gX12j399hImOhIGDen6Lg3t3fHd2mp2YeoqDh2p2fn1shIaVgXKPgnGGgn6CgG9mbGdYXVtcW1RlcGVfWGNydWl2cGRlYldbW2h/cG9ygHOKZWZ6f2p1d3R0hIZ4goV6d3R2bmt6cGFoa2eGdI2EbmZeX3xveol9aG13ZmpkVldzcI6nfYR8dpaQc3txe3hseXqPg3WXfIiGg4eEfXVxc21odV1taWBtdWRnZml6b3tzWWeBdnVocIF4gnZid4WLfZWCb4xrbXuBcWZzZV9reGZxdYl6fWF1g3Vpa3F0eW94d3J7ZXx9fnd1bmNlYGyGfG1rVmpjclRMamtQTE9wSF58ZmFOVnRkS09UWGFrd35mXWdzaWVfV2NXY3FdS0trWGRiVVRVc1ZNWXZlWl9sYFxbZGVfd2dtYnBpdG9xfnV0mYF4f4B4gH+GhHp9doKDfpiFbnJ0fHt0cYWFjoGBeot1dJCAfYGUjoCFhHx+jIZ6foF2e6OminmJhoVsdXx8dYSDjXtvhXN6hX2Cg3VuamllVl1bW1pTY25lW1hidHtqaW1oYGFXXlppgGlsb4BnbWJpe3prdHV1b4aCeoF+d3Zue2hqeWpfZW5ogXeQhGdlWGF2aX2GeW5pb2ZmXVVYb2mPqHeBenyQjnh0bn1tcXR4jX53lHSGg4CFiXZqc3ZoaW9cbWVebnNfZ2JqeGh7bVttg3N0am+Bfnp3YXeFhXqRhnOIcnB6f3JjcWhbbXZkb3KHendhcoBvZ2l4c3Frd3ZzdWKCen12dW9jYmJtfHxra1VpYmdUTG5oUEhSbEVheWZiTVRyX0pNVVllbHh7Zl9tcGpjXVZgVnBvV0pTaFhnXlhNVWxUS116X1xfbF1dW2JlYHpobGFvb3Zub3d1eph9d4CBeYCAh4Z6eXqDfYGThHF0dH56dnSFiJB+gX2RbHOVgXuCn4V/h32AfoaCgIp7dYSsn396iIiEbHKCenaBgYJ1bodvfYB0ioBqb25lZFhfWlpaVWJqZ1xaX3WCaV5tbFxhV1tca4FlcXV9aWpebXh3aHV4c26HfH5+enZzbHpoaXdnXWRzZ3p3koFjY1Rkb2aBhHZ2ZmhqYVdWWWhjkKhvf3d/io56cG97ZndteYp6do5xhH1/f4duZHd0ZWhpXWxiXnBwW2dfbXVlemhddIBucmtxe392dWJ1hox8iYiAf3hydX50YXBsWHByYW9wg3p0Y3GAa2Bsem5paHl3c3Bkg3R4eHRwZGBjbXJ9amxUaV5fVUx1Y1FHV2JHY3dmYUxUcVlLTFhYaGx2emVkbXFmY1pYXVh3Z1RKXGNYaVhYSFdlUUljeFtdX21bXlxiZF5/aWpgb3R4bW9udoOXeXKBgH1/iYyGfnV2hniGjH10dXWCeXp6goyOfX+FiWp0loF7ip19foV5gHt+fIaJc3GProx8fIeQfmZxiHp0fn12cm+GbHx+bZB6Y3BwYmVdZVZaWVdjZmtgXV1zhmlZcW5bXlhaXGx7YnF3dmxjXG50dWh1d3Fuhnl/gXp3b290ZWh0ZVtndWZ2dpJ6X11TZWVqgoFzfGFjaVxUV15iZJClaXl0goWQeGxteWZ3bHuDeXSHcoF4fHmAaWV3bWBnYV9rYF51a1lmXW9vYnplW3d8a25vcHh5dHVlc4OTgImDiXp2b3J9cmF4Y1pub2BvcIB6c2VxgGRebXVoY2Z4enJrbYBzcntxcWFeZW1ufWRpVGhZWlVOeV9SSlpZSGN1ZGFKVW5VSkxaV2lscntkbGxzYmFZWlthd11US2NdWWpTVkdZYU5IanZYX2FuW1tfYmNdhWloYm54eW1vanaBkHlug36AgpKIhIF2dYl0jIZ0cXZ2gXd9fX6Mj4F/k35weJaDfZmSeYCAeHl+f3OHhHNwmaJ7e3+JlnlldYh6c3l3bHRwf2x5fHCSc15wb2FnYmxUW1pXaWRtZlxccYllU3JuW1lYV2BrdWRqdWpqX1tudHJtdHR1a4d9f4F9d29ubGRpcGNba3JkdHaOc1xXVGNfcH9+cYFcYmNeU1phXGSTn2VycYWDkHNranhsbm55eXpxgHZ/c3t6e2RmdmheY1thaFxed2hXYl5waGF3YVt8dmpqcm54dHR0aXGCloSHf4V2c2pwfG1md1dbaWxhcHF/eHNlb35aYHBwYV5pb3xranJ9cW92aW9gW2RrbHthZlRnVVhTUXdcUlBZUkhkc2JgR1ZsUUlQWlVrbGt8ZW1vcmFbWlhZbHBXU1BmV1dpU1RGWlxPSXN1WGBjbmNYYWFhXoxqY2Vtenlsbml2eYZ7a4R9gIWZfIKEeX2IbY+GcW92en10goJ9i4+Dg5d0eIKUhYGfiXWBf4F0f4Jwh4N2b6KXdHuGjId7ZneLb258cGd4cXtsc3ZzjWtedG9iZ2ZrU15cVmhibGxbXHGNZE9vbVxWV1VmaHNoY3RlZV5acHZvcXZ2emyIfYB9iHeQc2Nka29hXG5tY3N4h2taVFZiYnZ8fHCEXGNfY1RaYFpjl5VjbnCChYlyaWZ5bmRydXF6a3l0dW97f3ZfZ3NkXF9XYmRZYXVlVV9gbWRhcV1dfm9oaXNxdHF1dmxthZSDinyFcXJnbnxvcW9SWmVpZHByf3VzYmx1VWJxaltebmR7ZGt0fHFxcWlsX1hkaWp4XmZVZFVXUVZvWFFXVFBIZXJfYUZYa09JWVRWbmlkfGlreGthV1xVW3RkU1JWaFFZZ1RTSFpbUE55d1tfZW1qWmJhXl6PbmJnbHl2bm5pdnZ/fm2EgH6Gl3t/h4GKf2uTiHJndIB7dYCDfomOf4yTc32KkYWHn4Z7f4aMc4CGc32CdW6kjHOCjYx3eG56jWBlfXFnenR5bG1xd4NnZHxtZGdnaFNgX1VnYGxvXF5ujmhNaWxgVVZTb2Vya2Z4ZWVdWnJ2bnN7eXNuinuAd5x7emthZWxtXmBuamVweX5nWlZYX2p3e3pvg19iXmdWWWBYZJyIYmtwgYZ8d2tqdmxbdXBqeWl1cm5ve4FzWGtvYFleVmNkWGVxY1RfYmlhYmxaYH5rZmx0dW9teHZsaIaNgIp7iG1xZnB7bHFsYVhfZ2ducn9zcl5pbFNlcGRVYm1heGFvdHp0aW5ral5XYGZodVxkVmJWVE9ZZ1NPXU9QSGVwXWNHWmpOSmBLWG1lX3hobn5kYFVeVF11W1RSYGdOXmJVU0pcWlFadnZdX2ZtaFhjYVtejnFjaGp4cnNtaHZzeYNzgoN7iI5+fIqIjnluj4p0bHOCc39/iIWHkoSVj3p9jI+IkZuEgHyMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo2NjY2NjY6Ojo6Ojo6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjY2NjY2Njo6Ojo6Ojo6Oj46Ojo6OjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERDR2RoZ2dnZ2hNQkNDRERFOS4uLi4uK0iFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTQ5XGBfX19gYUE1NjU1NTcnGxwcHBwYO4OBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fn1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJiYmZmSj5CQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaIiYiJiYmJh4WFhYWFhYSDg4OCg4KFioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p8fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkJCQkJCLjpGRiYeOipCSk5GLkI2Mj4ePkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjY2NjY6Ojo6Ojo6Ojo6Ojo6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQi4WHh4eMhomQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCIhYWGhY6Gi4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkIiFhoaHjIiIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp+fHZ2eHx8e3x9fX19fX5+fn5+f35/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4SIhoaIhYmPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6fHp6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2Pio6KioyKjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp5ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fn9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJh4KIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWFhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f3+Af4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/gICAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f3+AgH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f4B/f39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJWVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlJOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5KSkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX1+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGRkpOSk5OTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpCSkZGSkpOHhZORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCSgoGSkZGSjnWGkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9+f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQj5CIcISRj5B8dYiQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj4+QkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fX19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Oj4xzb4qPiXJ4h4+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjXZue4+Cc3iGjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHc21ug3p0doCFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxZWFhXVFBRUlNSU01NSklGRUhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39+fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d3RiXmRfYmtxZmhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f35+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoYl5sbF1mZ2dlYmNiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hJSkhISElJSElWcHN1eXp7eXZ2eXp6e31+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWVZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpaa3dtYm5zamJaWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent5dnd4d3p7fX59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVtrcmxhbXRyZ1FRU1BQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1OXGRva1lpc3VwU01PUFBQT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgIB/gWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0ZCRUlWY2drb3BubWxaTUxOTU5PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICCb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVDR0hJTltnaWdybm5pZmRgX19YTEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7PklaXVtdZmxua29tbWxraWlrY1JHRUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+AgICAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7Oz1KW2lubm9qb21ramxsZVBHRURHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHN0dHNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYGCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ojo9R2Juc25ubGtsZ1RCP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VGRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN0cnF0eHh5fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk5PElfc3RxZlI/Ojs9QEFAPTs7Pjw9PEBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5ent9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT48OkJsfWk+Ojs+PT4/QEBAPj9BQEBAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQURGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9APFxuQD5ERT8/QURfZDw9PTs7PT5BQUA+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJDRUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3x8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo7bXdIODs6PT5BOkllPTw9PDg6Oz8/PTw9OzxAPT08PT07PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUdISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUjw8PUlMRkZ1d003ODg6Oz4/V2pBOzw8Ojs7Pj8/PT04Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3J5STtcf4N/enx3Vzw9Pz09PkVodEw6PT4/PT0/QUNAPDk7QT8+PkE9Oz9BQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFHcnlrYoOEg4KDgH1ePkBDQEA9SnN7WTo9QUVBQkJGSEM9PEBEREFAPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEVudH2CgoGDfn2Edk1BQ0VAPz5Ze4BdP0NFSUpKSU1NS0VDRkZHRUdFRUVERUNBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVyQ0RFRENXdYaHh35YR0hKTE5PUFBNSUdJR0hJSUhIR0dISEVDRUVFRkZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ1dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIlsQUFWdIeJh4eHiINXSEpPTk9PTUtHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0ZJS0tMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiIRWbISHhoaGh4iIh3xPWGRMSUlHR0REQ0NAQENDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREZHSUpJSkhISEdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMS0pUgYOEhIKChYaGhIKGhYSEhoaGh4eGinZvaVNNQD5BPz8/PDw8Pjs6PEFBQD48OTk4PDw9Oz47ODs/QUJAQUNDQkBBQUREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgICAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpJSWWFhISEf4GCg4KDg4SFhYaHiIiIiImMjn5sYmFSPjg/QDc3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc1ODg7Ozs9QDs5OTk9PD47PD1BQ0VISk1MTEdJR09SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaIaEhIF+gYODg4KDhIaJioyMi4uJiouNjG9gZGVZQVc9NTY1NTg3MzU2ODo4NzY1NjU2NzY3Nzc6Njc4ODk6NzU3ODk3OTc3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR2eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDY3ODg9Oj1FQ0JlhYOBgIKDg4ODg4aJioqJiYqKioqLiouMhmpma2lmUTc4ODU1ODg1NTc2OTk3NzY3NjU6OTo6Ojs3OTg5ODc2Njk6OTg4Njg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXZ6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhIWGiYqKiIeHiIiKioyLiouOhGtsa2I/PD4/OTk7PDk6Ozk6Ozo6OTs6OT09PT47Ozw8Oj47OTs7PDs8Ozk6PDg6Ojo6OTk5PD88PEFCRElKTUtJS0xXb3JzdXN2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuKjI2OgG1sYEVERkZCQUFCP0BDQUA+PT4+QD8/P0A/QD09P0I+QEE/QD89QEBAPj9BPD48Ozo7Ojk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t9fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKDgoKEhYSFhIaJiYiIhoaGh4iJiouLi4uMjYyNe21rT0tNS0pHSEhFRkhHRUNBQEJFQ0NBQkNCP0BESEVDRUNFREFGRUZERUZEQEI+PUA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0RGV4SCg4SFhYaGiImJiIeGhoaHiYmKi4yNjIyMjI2LeG1hbWRNT0tLS0lJSkpJRkRER0hHRENFRkRCSElLR0hHRkhHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E+QkJHR0lZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2NjY2MjIyHeXllYU9PTUxNSklKSEtHREdJSElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4ODw7Oz06PkA+P0BDRklJUF+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjY2MjIyLjI2GaVJST05OTU5KSEhFSklFS0lHS0pJSkdHR0tMTkxNSEhJSk1RTlBOTU9LSUdJSkhJRElISEZGR0dJR0NCQUNUbnB1d3d5enh5ent8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDk6PDg9Pjs9QT4/QURISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiIiYyMi4yMjIyMjIxhVFVTUFBPTEtIR0NISkdMS0dLT0xLSkpMTUxPUE5ISUtMT1FRUFFPT0pISkpMSkxGR0hHRkZJRkVFQkFCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uKjIyMjIyMjn1aWFVVVlVQTkxLRUZGTE9OUFdVUVBPUVNSTVNUT01TTFBTVVZSU1JQTEpNTU1LTkdHSkZGSEpFREVFQkVDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09QkBCQkdWTkZOUFBUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyNj4yMjGpaWGxjR1RSUlFLOztSU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTVJRUFBRS0tLSEhKSEVGSUlJSElpcnZ5eHl4ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0dGRT8/QUFFQUNHRURFTFhSTVRVVlhafIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqLjH5hiouLh25dZVY7WVpZVFE/QFZVWFxkYFZZYnJdXVddWlZFUVlaW1lfVFlnUlZWWFVUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6enp7ent8fXt+f359fn19fX5+f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+i4mKjHpvcFpcXVxTVVNWVlVbWnWDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f3+Af39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeEi35nWlpcWlVXVVdSUVdWY5aAUmVyWFpXX2hQYGZbW1hcZ2FHT1poZ11bXF1dV1JPU1BQUlZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbU1NRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn6AfF5SV1lWU1ZTUlFMT01LZnlbXVRZVVZdWkxUWlVTVF5aWFdXV3prWFtcXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fHx9fn5/fX19fn19fn9/f4CAf39/f35+enh3dnN1e39/gIB0a39+a3J5XltWVVNST0tGQ0RBTl6DbFZSU05PUU9RVVJTUlJVY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmJh4aDh4eHeW9yWEtNT1BNT0xKS0RFSUVDPlRkVX9SUVFOS1FUUU1PWVJNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXV1c3N3enp7e3x9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eXFlVUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ2YF5NRUBEREREQ0FFUEJDQUM9Q0lHVkBITkxHXWlQSEZORkRFRklHSEJESEdJS0dEQkFEQE9RTVJkcnR2dXN0dXp8e3t7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFNPVmBrbHJ2e3t4eXRybnN0c3l4fn+DgIODgoCCgIKBgmxOSEBBOzw+QEA/QD9rUEpgRUZISUVCP0dMTkdNUVVJQUU+Pzw9PD09Pz0/QUNDQD89PUI+Sk5HVW51dHVzdHZ4e3x7fHx8fX19fXx+fX18fn5/f3+AgH9/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXkpKUFFOS0xRUlFUVlVXUVFXVVBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZURCQUI9OkJDQUFEQlxdT3tOT09OS0xNT09RTEtNV01IR0BBPDk3NzU5OT07Ozs4Ojg6PzxCSD9cc3R1dXV2d3l8fHx9fHx9fX5+fH59fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BfXVpJSFBSUU9NUFFOUVJUVlhTU1lUT1laW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEdISEJBR0lFRUZETVJQYVdSV1FQU1NSVVtPT1FWUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxDPmVzc3Z3d3l5e319fHx7fH1+fn57fn59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BWV15aWE1MVFRTUFFVT0xSU1RYWFRUWVJNV1laVlhYVlhZXVdXWGhza11WYXNrYmFfXmRhX15ZVFFOT05MSUhKTElJRkNRUFNbV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5OTg5Nzg4NTc1Nzg1OTlHbXJ0d3h5e3t8fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVlVVVVdQU1VXVFVSXW5eUk5aX1tWWTtEVlhUW2ZKTFBTUk9NTU5OTkxKRlFQVVlTVE9KTk9VU1RcVlJVU1JPTUxJSEhGPz48Ojc4NzY1OTk2NzY2NVdwcHN3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG9mZWRjXF1SVFpWV1VUV1RSWFhZWVlTVU9KR09QT09NUkpQUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBTTUlMSk9SUFJSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9xdHd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSUdFSExIS0hGTE1QTUcvRV9SPjM/PmpvYVNSUUBHVVFQUVBRTlFPUVBMSkxMT1BPTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR1eXt7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRUZISk1MRUdDT1JDOEVOU11nVFFTQUdVUE9RUVBOTU5NS0xLS05PT1FMT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydHh7ent9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtucW1pbWNMT09NUVNMVFVUWFdVTExLSTw5ODc7PkA+PD1BQEI9PkVIR0NFRklHSkpARkFBQEZIRUpPSFFSYlxRUFJPU09PUExMT01MTUxNT05bV0tNUU9HSUhDSEpMTEpGRkZFP0JDPjxCRz9CP0FkcHN3enp7e3x7enp3e3d5fn58e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENEPTk3Nzk/Qj47P0FAQD5ARElFQ0dHSUdJRUJCPz49Q0JBR0lETU9iZVFNT05XS0xNS0xNTU1MTE9OU2ROS0xSSUlJRUFISkxNTkpHSUdCQUJAP0VGRUhES25vdnl5eXt7enx6d3R4dXh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR01NSk1QTVBPSEpEP0E9OTg6Oj9CPzxAQkFBREVHS0ZDSElHR0hDQz9CPz9AQT5ERUNLTlJUTEpJTVRHSUlKTElLTElKTU1PUFJQS0dDS0dDQklJTE1PTklKSUdDQ0NESUpNTElZcm13eXh6e3p5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFIS0RHSEhHSktJSktERkI9Pj05OTo7QEI/PUJCQ0NHRklLSkRJSUZHR0NDO0FAQj5AQEJFQ0lNUEhIS0dIS0RISUxNSEpMSElKTEtNXVJISERORkFDSkpNTFBNS01KS0ZHR0pNTlFOTGJtaXZ2d3p5e3p9cm1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLREZFR0VGRkdFR0JDQD48PTk6OjpAQ0A+QkNERUlFSUpMRklJR0ZGREI7QUNDPkBDRENER0xOSEtOSERIRUlMTk1HSUxHRkdJSUxOS0lHRU5IQkZNS01MT01NTk1LSEhJT1JRUk5SZmZmcW9zeHV7enxsaGpuZWtxbHNwZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lERkZFQ0NCRUBEQT4/Pjo7Oz06PD5DQT5BQ0VGSkZJSExIR0dHRkVDQD1ERUI+QUNDQ0RHSElHTVBKRkZHS05PS0ZISUZFREVJSkhKSUZIT0tDSU1LT01PTk9PTkpKSUxSVVVST1dkYGFtZ3Byb3J5emdlaGhkaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMSEVFSENCQUJEPUJBPkE9Ojo9Pzo9PkBCPkBCREdKRUlGSUhGRkdFQ0JBQUZGQ0JCQkRFREdHSUZMUUxJT0pKTExJR0hFR0ZEQ0lJSEtKR0tSTUJOTk1QTk9PTU5PS0tLT1VXVlVTWF9eXGlhbWluaHJzYmVmZmRoaGZuamZtbWhra21yaXF2dHNxbXZub3Fyc3dzcnN0dXV2dnZ3dnd3dnR3dWpzdW51dHNxcmprc01HSEZIQkJBREU8QUBAQzw4Oj0+OT88P0JAQEBERkhFSEZGSEdGRkRDRUNESUVDR0VCRUdFRkdHRUpNS0hRTUpLSEhJRUZISEVDSUlJS01LT1NORFFSUFBRTk9NTlBNTE1TV1ZYWFVYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW55TUhHSEhCQkJGRTw/QkJEPDc6Pj46PjpAQj4/P0NFRkRGREVIRURFQ0RFRkdKRUVKR0NHSEZIR0VDRkpKR05LTEtISkxGSUlLSEVLS0xNTk9SVE9IU1VTUFJPUU1OUU5NUFdaVlpZVlpdWVhhYGFgXmhlY2BkZmhnamhoaWZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXd1e359eHZ0d3Z2dnhwbHVwbXN0bm9ycnhOSEhHSURCQ0hFPEBFQkU9ODk+Pj08PEFCPD8+QUFGQ0VDQ0lEREVFRkdHR0lGR0tIRElIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5LT05PUlVWT0tVV1NQU1FSTE9RUE9UWVpZXFpZW15eXWBjXlxhY2tiYGRmZ3KFaGdpZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdExJS0lLRkJFR0U8QEdDREA6PD9APz4/QkE8QD5BQUZDRUVESUVGRUdGSEhGSEhJS0pGSkhIS0hGRkxJSEhKR0xMTUxMSU1LTk1NT0xQUFFVVldPS1ZWVVNSUVFMT1JSUFZbW11eW1xeX19hYGFkXWNgZWZgZWhqY3NzZmpnZ2tvcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SktMSkxHQkVERTxARkREQzs/P0FAQEBDQT9CP0FDSENGRUZJRklGR0RJSUdJSEpMSEhKSklMSkZKS0hJS0pHS0tNTUpKTU1OTk5QS09QUlRYVk1OVFZUUlJRUExOVFNSV1tdXl9dXWBfYGFhYGFjZWJkaGJkaWpndotsamlnbW5zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2bndLTExMTUdDQ0FEPD9FRUVDPUFBQ0JCQ0RBQ0RBQUVHQ0hHSEhHSkdDSElHSEpGSUxISUpNS05MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNQV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltbnNycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAQ0FFRERGQkNFR0NDSUZDSUpKSUlLR0RLSkdISklJS0hKSk5MT0tJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BhdnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQkVFREZCRkZHREVLRkVKTUxLTExHR01JR0pLSEtLSUtLTkxOTExMSUxMTFtzYmRwXmxtVU1OZnNdZmZxbG50Z3BpX2FZbm5icHBia2pqZm9xdGV0bm9cb3VncE1KcXl2a2Fga2VlbXhsa3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnR0Ym11a3BwbHJycXpLTElIR0VEP0FCQD5DRkdCRkNGRUZFRENISEdERUtIR0xOTkxNTEZKTkhKS0pJTEpKSktMTU5OTU1KTU1OW3Jvb25wcGxrTVBRbFdNaWJ0cnBhbW51XFlsUVxtbVpxbWtvbXh4dHNpcF1fcmtxalV1eXhvY15rZmJncHBqaW9wcHJzcHFwcXBycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0dFRUVCQkI+QEBGR0JHRElGRUVCRklISEVITEpHTU1OS01OR0xOSUxLSUpNSUtKSktPUE9OTUxOTkxcaGR1XWxxV2xOUFFtVFlrXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdXlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SExGSURFRUNBQj1CQUNHREhHTEhFQ0NIS0lIRkpMTEZOTExTUkxHTExITkpJSE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5Zcmtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXnRjd3hyam56aGFhY2ZiYmltdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnNzdnNIS0hJQkVFRUFBPkREQkdESElNSUZDRkpMSkdGS05MRU9KS1dSS0dLSkpOSUhKTElLSkhIS01NTU1JS0tLU2tjW2leX2ljcnJaX1lqbl9lZVVrX2NbYWFRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydnR3ckdHRklERUNGQUBCRkVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRUhIS01JSEpKS0tJSElHS0tLTEdIS0tMTU1MSktNTlRbXFRQVExQT05PT1ZRT09RTk9RSkpPUFFkcWlUWVdcW1xWWVtdWF1cXGNmYWFlYmNmX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0ZFQUVDQERIREZHQ0lLTEhGREdLTElFR0lQS0xPS0xXTElFRUhJSkhJS0lNSkhGR0dJR0hJRUZMSUpMT01KUFxXXlBcW2BeTVhZU1xcYl5NWFpNWGFSS1lhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGFhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CRENCRUlFR0dGS0pLSEVGSUpLRkVISFBLTU1KTVJJR0VBSEZKSUtMSkxKSEZESUZERkdFRkpIQ0pOS0xVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOX1xeU1peY15aXWBjYFlfY1tgXltUWFdZXl1jYmNhY2VoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNHSEZIR0hLSkpJREZLS0tFRklKTktOS0hMTkdIRT5HR0xJS0xLS0tJR0RIRENERUFGSkRASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFYVVVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR4eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUJFR0lGR0hIRkZJR0hHSEtJTERES0tOTUxLSEtKSElGP0dHTktLS01LS0tJRkdDREBEQUhJQj9JSkhPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYlxkY2JkY2ZYUVVUUVtXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYWGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSkZGRkhHR0lHRkZJTEpORkRLS01OSkxJS0pISEZCSEhRTUtLT0xKS0lHR0VEP0VDSUlCQkdGRVRdWV5YX1lfW11VWFhPXV1RS0pWXlheW11VWWBSUV9fYmJgYGJiYGNiYWRkYlhPUVFRWlJbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYSFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHiIeFg4B8eFxTS0NBSEZER01SSENRSkVHSEhFRktKTVBFRklKS05MTElLTElIR0RIS1FPTU1QTExKS0hJQ0RBRURJR0NCR0ZEV1VFXFRdU1ZfWE9UVU5aWk1JSlRgYVtfWF5eYV1PWWFcYGBfYmNiXWFiV2BfVFBPT09YUVxbW1xcXl9iZmZlbGVvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGSERJUmJQQ1ZeSUdHSERGTUtQUEVJSUpLTkxMS0xLSUpHRUpOUVFOT09NTkxNSEtBREFDREdFQ0JFR0JNSEJLS09PTkxGTUZHSUpIR0xLTU9QSUxPUE9TT0xQU1JVWllXWVhYZFdPU1RQUE5NT1RTWlhYWl1cYGFkZWNnY2tscHNyeXl/e3p/hISEhYSEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHR1hMR0hKSEdNTFFRSExLS0tOTVVOT0pKS0dHS1BTU05QT05OTk5HS0ZgRURfTEVmZEVOXEleW3JtT01VbVlMRFFgVWtXZ0pdV1VeRExRVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalJWVVRbXFtgYGFiYWJgZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRkdGSEVFS09TSUpGYFRISU9KSU9NUlFMTUxMT1JVUk9PSUxNR0hNUVtZT1BQTk9PT0lKUX9RSXxZWXJ0WVFtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbX1ZWWH9qdHV1Xl92XldhW1tmW19gYWBhXWBhZ21wbGBwd3R4gYGCg4OCf31/gHZ4emx2fnR4fYB8foCBgoR8gIN6f4F/fnd3TkpFSE1OQkRMTEZJS0VRVkxLTklLUlhXUU5PT01RVE5PUU9LS05HTVBTW1pTUVJPUFBQSkhaeF1UeGVoWlNVUnZndGxwYm5malFyT013bWpycHNycXJwb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29ycnt8b354boByX2BgYmFaYF9na25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnN8fnd4e36Ag3h8gHV8f3x8c3NOS0dgXUdBRU1NSEpKR0pQT01NSk5WXllVTFFTTlhaTVNTUk5LT0hRUlRZV1ZQVFBQUFFLSGd4bGN4cm1bS05WeXB1bXVib3ZQZWVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en5seHp/b2hvWXZ2anZ1cIBfcmZ9aWx4fG9eX19iYVtdYmRnaWpkZ2JjZGxscHBzdHNzc3lxcnhibHVncXl7c3J2eX6Bc3V6bnx9eXhybk5LU3VOQ0JGUFBISktJS1BPT09NUFpgWldLVFdQYV5SVlFZUkxQSVNUVlhXV09VUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JocXVubXlwd2x2dHRybG5ddH56a215fGt0bHxrcHZ1eF5fX2JeXV9kZGlnaGVlXmFiaWlpamtub2txb21qcGFjZmNvd3hvbXBzeX9ucXBre3p0c29tTExbVkhHRUdSUElMTUpLUFFQUFBQV1xYVU1VWVVlWFJSWV5TTE5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9acHp7XmB6c2Nyb3hxaGR9aXJ8XlRMbGB2dWtpdXt6bX54a3xwXF5eYlteYmRkZ2VlZWJaY2Npa2tyc3J2Z2xpaGRnYGFrYWdzcmxnbW1yfGttaGt7dG1ua21PSEtLSEpISFFQTE5PTEtSUlJPU1JXUlZUUFdaVlZUVFRhX1BOTUtUU1RRVlZOTkxNT1BKSFFOUFVMS0xTVFRTVFBWVVFRTlFRWFlSTlBVVFhYWFtbVVJTV1tXWFhaT1NVV1hYUl5ZV15WVFBZUldXV1dYXlpncl5bW1lcXV9jWl9jY2RmZGNjYlpjYmdmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdnanVqaGdpbFFJS0xMTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlXT09MTVZUUU5VU05PTUxRUExKUVFLUU1LS1BTVVNRUVNTSUhMTk9RUlFRUVRWUlhXXFdTUlBSVFVWU1pRTlNSV1ZUWVZVWlZUUlVUVFRXWFZcWV5gXVxaWlxcX2NbXWJjZGZkZGRhWWBhY2FiaGhpbWJhZF5fY11aZFxibWFeZmVmbXNkaWdqa2VkY2ZoUEpLTE9PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFNQUEpOV1NQTlVQTlFOTFNQTU9VU05RTk1OUVVRVVFSVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXVlZZW1RQVFVYVVVaVVdaVlNSV1ZVV1tYWl9cVVheXF5dW11gYV5bYmJjZ2ZlZGJYX2FiXWBnZGZlYV5fXV1eWlpgWl9nYF5dXWJoa2FnZmhmZGBiY2FPTE1MUVFMT1RPT1NRT1FbWVdXWFtZWFhWXGpkVlhZWldWU1NPSk5WVFBPVFBQUE1NUlJQUlhUUVFPTU9TVk9YUlRVVU9OTVFUVlVUVFJUV1ZaXVxaVlZRUVZYVltbV1FUV1ZWVllUWFhWU1JZV1VaXlldX15VXlxeYFxbX19fX1piYmRoZ2RkYVhhYGJeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFPVVxaWldbW1xZWltkcW1oZF9bWFZVV1FMTVZTTU5ST1FST0xRU1JVWlVTUFBNUVdXUldTU1NYTU9PUVRYVlVVU1VZWFteXVtbVlFOVVZVW1xXUlRXVldYVlRYW1VUUlpYV1xeWl5fYFVhXGFhXWBiX1xgXWNgY2doZGZgWWNgYV9fZWRfYGJbWlxbXFlaWVhXXFpcW2BeX1teXmFgXmNcWWBaUU5PTlZRUFRRT1RUU1BXXFxcWF5cXldcXmpxd3mAY1xbVVVXUU1PVlNOUVFPUlRSTFJUVFlaV1VPUk9TWFdUU1VSUlpPUFNSVltWV1dUVltYXF1bW11WU01UVVVcXFZSVVZWWFlTVVpcVVNTXVhaXV5cYGBgVmFbY2JdYWReXGJhYl9jZmlkZl5bZGBhYGBjZV9iXllaXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVFJRV1JUUFteXl1bYFxgVVxdaGpyfXNsZ1xUV1dRTlJaU1JRVFJUVVRLUldWW1paU09TUVZWVlRPV1JTWlJUVFRYXVdYWVNYXVheXVlaXVRVTlVWV15bWFJVVVlZWVVXWlxWVFdeWl1dYF1iYl1ZX1tlYV9kZF5eY2NhXmVmaWRmXl1kYWBhYWJkYGJeWFpfW1xbWFhYV1dbWVtgXFtbXFtYWlteVl5ZXVFPT1JaUFpUVVZWU1RUXl5gXl5iXGBVXV5ia3l0bH1rWlVZVFBQU1xUVVRVVFZZV0xSW1ddW11ST1VTWFdXVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUVdSWVhZX1taVFVWWllaV1haXFdVW15cXmBhX2RjXF5dXWVhYWZkXl5kY2BcZ2RoZWRiX2RhYGFgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU05QVllRXVVWWVdXVVhfX2FhYGNdX1RdX2JlZXWBemhXWVlTVVNWXFhXV1ZWV11YT1VdWl5dXFRSV1NXV1VTVFhSU1ZUWFdYXV5YXVtWXV9YX19YXFZRWFRZWlphWVxWV1hbWltZWVpbWVdeX2BfY2JhZGRcYlxgZmFkZmReX2RiYltmY2hlY2ZgZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlNZVlNcVFZXWVZWXGBhYmNgY15fVltgZGFfenVvaFlbWVVXVFdbWlpcWlhZYFdQVV5cYGBcVFRYUFVXVlRWV1JTVVdaWltfXlpfXFZfX1pdXlldVVJZV1lZXWJaXlZXW1xbXFxbWlxaWl9fYGBkYmNkZGJkWWFmYmZmZV5hYmBjXmJjaWRjZ19nXmFiY2FhYF5fWFRbWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNPVllWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheW1xaVldYWVxcXV9bWVtiVlRYXl1hY1xSVllQV1dXV1dWU1VUWFxcXmBgXWBcV2FeW15bWl5YVVhXW1tfYFxfWFlcXF1eX1xbXVlcYGFeYGVjZGVlZmJYY2VkaGdkXmNgYGVjXGVpZGVpX2ZdY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWVhbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNZWlhdYGNkX1JYWVBXV1hZWVdWV1ZcXV5gYWBfYl5ZYV1dXllcXllYVVdbXGBeXV9aWl5dXl5hXVxbWlxgYl9iZWNlZmVmYlpkZmZpZ2JfY15hZmRaaWhiZmljZV5iYmNhYGBfXVxaWFtZWVhYWlhXWltaWVdYVVVbXV1dYGBiYnhLWFdbWVZcW1xdWldcXV9gYmRhYmFdYFhiY2JgY2FiXVtcW1hXW1xfXWBfXVtgZF1cWFtiZWNhUlxaT1lYWltbWldaWWBdYGJiYGFjX1xiXV9dW15dWVlUWF1dX2BfYFxbXl5gYmNdXFhcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiXGNnYFxpaGJoaWVkYGJhY2FfYF9dXVxZXFlYV1hZWFdcWlpXV1hPWFpdYWNmZnJrf0pZV1xaWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBiYmJcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxeXl5ZWFVbX15dYWFgXltgYWJmY19dVF1gYGNkZGZlZ2VmZmVeZWZoaGdkZGBaZmdeYWhoYmhoZmNgYmBjYl9fX1xdW1pbWVhYWFZaVlxbWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4SCgoKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKCgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7enp6enp6ent7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnd3dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3p6enp6enp6e3t7e3t7e3t7e3t7e318fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29wcHp+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmIkMzT0tLS09WehomJiYmJi42MjIyMjol/f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29veoB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIqU3ebk5OXk56WJjIyMjIyPkI+Pj4+Qi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXV2d3d3d3d3eHl5eXl5enhvb29vcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2DhISEhISEfnx8fHx8fHx9fHx9fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5d3Z2ent4e3h3dnd6eHp6eX15eHh5eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3l5eXl5eXl6e3t6e3t7e3t7e3x8fHx8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd2eX18fX16fHt3d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjYyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3Z6fX19fXl8end4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4SEgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3dnt8fXx7enx7d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp5en18fXx7fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4e3h6e3l7eXh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgoGCgoKCgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mFhIOEg4OCgYGBgYKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHl5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgYGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veHl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEgoOFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4OBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fX19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYGAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgYGBgoGCgoGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzc3NycnFwb29vb3Bxc3NzcnJycnN0dHRzcXFxcnN0dHR0dHR0c3N0c3NzdHR0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHNzcnFxcXBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3Nzc3NycXFwcG9ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm5ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoKBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJzc3NycnFxcHBwcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycXJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubm5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoCBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcXRxcnJxcW9+gm5wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcXFwh4hwcnFwdJqBbnBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXF9ooNvcm+Nn3xvcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFycXWeondxd6CcfW9xcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXFwcHBxcHBxcXFxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycZipkG+Co51+cHFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4GDeXJzc3JycnNycnNzc3Nyc3Ryk6mke4mhnXxyc3NzcnNzdHR1dXV1dXR1d3h3d3d3d3h4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f4B+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn18dnZ3d3Z1eHp4eHh4eHd4eXmgtKmmqamXfXt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf39/f359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7fHt7iq+kobWqrKN/e3p6eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX19fX2ZpZaisaCZp5R9gH99fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYCBgZycjaCwoJ+in4CAgYB+fn9/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f4CAgYGAl5uQmLGhmJWdhX1+fn6Afn5+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJioyOjImGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+f39/f39/f4B+foCBfn+hq6WWpJubmKKgh39+fn+Af4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgYGBg4OBgYGCg4KEhIePobKnoaCZnZ2mqKypoZqRh4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI+Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODg4aNn62xppuaoJuenJyeoaSjnZSIg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgoOKl5mXlpigm52enZqal5CJhoeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4SEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj5CSkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGBho6Uk5eanJ2clY+Jh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5OSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SDg4iQlI6UmJGHgoKFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgYKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGTkpCOkI6RkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgYGCg4GCgoKBgIebiIyHgoOCgYCAgH+BgICAgIB/f4CBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gIGAf4OJjoCBgoODgH9/f4CAgICAgICAgoOCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYmGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDipaIhIKEgoF/f4yVgoKBgoSDgYGBgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhoSEg4ODgoSOmYuDhYSEhIKAkZmGgoKChIODgoOBgYSFhIODg4KCg4SEg4SDg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSkpCNjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgZCMg4F/fn18fYycjoCCgYGCgoWUlIyBgoGCg4KCgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYSFhYSDg4SDhIOChpSUkpSSj42MiIOEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlpeJgH19fX17gZiMgIOBgYGAjpSMkIGCgYKCgoGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGVn4p+foB9h4t+hISDhIKDg4KNiYWMgoKDg4OCgoODg4KDg4OCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf319fYCDhIOCg4SDhIODhISEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaGhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKNioiFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDiZGDhIuFgoGBfn2Bh4aDgH5+f39/f3+Dg4SLhoSEhISFhYSEhISEhYWFhIWEhoWFhYWGhoaFhoWFhoWFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+gICDj5eGhYaFhYWFhYaHh4aGhYaFhYaHh4eIhoeHhoaGh4eHhoaHh4aGhoWDg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4iIhYaFg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf35+f4B/f39/f4CAf3+Af4GVlpKPiIiHh4aHiIeIh4iIiIaGh4iJiYmJiIeGh4eHiYiGh4eHh4aHhYODhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhYSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIOBgICBjImBgIGCgoGBgYGAf4B/f357eoqdp6SYjImLi4iJiYmJiouKiIiIiYmLi4qKiIeHiIiIh4eIiIeHhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSSkI+RjoqGhYaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCgoKCgoB/fn19fX1+fnx7fZmnpKKYj5WLiIiKiYiJi4qJiYiJiIqKiYuJhoaGhoeFhoiIiIiGhoeEg4OEh4iIiIeFgoKBg4OCg4OEgoGCg4KBhIOEg4GOk5KQj4+LiYWFhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX1+fn5+fn59fn18gZygnZ2cj4aFhoeHh4eIh4eJh4eGiIeGiYmDg4SDhYSEhYWGiIiGhYOCgoOFh4aHhoaEgoKDhIKDg4SCgYKBgYGDg4SDhJGSkI6PjouHhIaGhIKBgYGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoOBfXx9f4B/fn5+fXx9fnx6g5ybnJWEg4KDg4SGhYWDg4WEhISEhISFhIKCgoKEhIGCg4OFhoWEgoKBgoKDg4WEhISFhISGhIOEhYOCg4GCg4OEhYSHkpGPjY+MiYWEhYSFgoGBgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAgIF/f4GEhIODg4KCgH19f4CAgX99fn59fH19e3p5iZubl4WAgYGBgYKCgX9+gYGBgoGDgYKBgoKCgYOEgH+AgIGCgoCAgIGAgYKBg4GBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5+fn1/goSEgoOCg4J+fX5/gICBgH59fX19fn18enp7jZqVhYKAf39/f4CAfn2Af3+AgIF/gICBf3+AgYF+fX1/gIF/f35/gIB/gICAgH+AgoCAgoGBg4GBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GBg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foCDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp7j5ORmo9+fn9+fn9+f4B/fn9/gH+AgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Af3+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhISCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/fn1+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp6enmAjIyMi4F/f35/f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f36Af39+f3+AgH5+gH9/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enp6enl/hYCAgYGCgICAf3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGAf39/f4CAgH9/f4GAfn9/gH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WCgYODg4WEhISEhIODg4SCgoKCgoF/fn19fX5+gH19fX19fX19fHx6enl5eXqBgoKChYOBgoOBgIKAgoGBg4ODg4GBgoCBgH+AgYOBhIKAgIGAgYGBgIGAgoJ/gYCBf4CAf4CAgH5/f358fImUkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgIGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYSEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fH19fHt5eXl5eXyCg4SFgoGEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoGCgoCAgYCBf4CBgH9+jpOMh4iHiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGBgYGAf4B/f4CAgYB/gIGAf359fX1+fn9+gIOEh4eEhoaGhYaGh4eGh4eIh4eHhn99gICAgoF+fX19fX19fX19fX19fHx+fn58e3l4eHl5eYCCg3+DjISDhISEl5eDg4SBfX6BgYKBgoGCgYSGiIyFg4KCgYSChIOCg4WEhIWDg4SDgoODgoKCgoODgoKRkIuIiIeJh4aGhIaFhISEg4GCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gICAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHh4eHiIaHh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXl5fIGBfoiVg4ODhISUk4CAgX9/f35+hIuAf4GAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhISEiJKPjImIiImHh4eFhoWEhISCgYKCg4ODg4ODgoGBgYGAf4CAgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eXp6e3x+gYOBgoGDgoB+fX9/e4iRfHyOln99f3+ChoqFg4OEg4KDjYl/fX+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYOEg4GBgoKCg4SDg4OBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp5ent8eXl9fX+Af4F/fXt7f359gpWRf4SIfXx+f4KEfHyBgoSDf3+Hg32DgYCCgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4SFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn19fXx8fHx8fHx8fHx8fHx8fXx8fH9+ioJ7ent6eHp7e3x9fH5+f39+fn5+fXyAgYB9ho+Bfn2Cfn9+gIJ8fIB/goCBgH59e4qCfYB/foGAgIGCgIKAgICBgH+LlI+MjI6OjYiIh4WFhYSDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYWGh4WEgIaUiICCgYGBgYB/f39/gH5+foB8fHx8fHx8fHx8fHx8fXx8fHx8fXx5ent7eHh5e3t6fIKAgX+AgX1/f4B/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX18fXt9fX18fXx8fYB/gIB+gH5+gpSSjYyNjo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoCBgICAf36Afn9/f35/gX58e3t8fHx8fHx8fHx9fXx7fXx8fHt8fHx6enl7fHt9hYODgIGBfoB/f4B/hYKBfoB/fn6AhYaCgH5+g4Z/fXx+f4CBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6NjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYCAgYGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+ChIaGhX9/hYF+f4CAf4B+fn9+f4CAf4CAf399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhYOAgIB9fn1+f36MhIGHfn18fH9+goJ/fX19fYF8e318foGEg4GAfn5+fn18fn+AfX6Afn9+hJKNjoyPjYyKhoSFhISDg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOBen5+fH5+gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fX17fHx8e3t6fX6AgIODgn9+f3x8fH18fYGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgX+Afn+CgoJ/f4KCf4CLkI2NjI2LioiEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn1+fX19e3t9fXx6fHx9gYKBgICAfX19fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISCgIKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9e3+BgH9+f36Af39+f39+f4B/f39/f39/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5+f35+f358fH18fH18fn57fHt8fHx8fXx9fH58fXx7e3t8ent8e3x9en1+fn+AgIOHiYmJiomKiYWIko+NiYqHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDg319fX19fH19fX19fnx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+goWIh4iKi4uLiYyRkI6KiYaFhIKCgoKDg4ODgYGBgYGBgYGBgYGCgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fn1+fXx8fH59fH18fX19fn19fn58e3t7fHx9fHt7e3t5enl5eXt+f4ODhIeJioiJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2BgX+BgYF/f4B/gIF/gICBgoGBhYOEgoGBgoGCgYCAgYOCgH+Bf31+gH58f3+Jgn9+g5GEhIOBf359fI2HfX1+fX18fn58fX18fX1+fn1+f3x9fXt8fX58fHt8fXp6eXl5eXp7fn6AgYOHhIiPjouKh4WEhISCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKFhYSCgYGCgYKBf4CChIF/foGAfX6Bfn1+f4CAfX6AhIB+fn99fn19ioV9fn99fn6Afnx9fHx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiY6LjIiFhYWEhIKCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICBg4F/gIGEgX5+gH99foB+fX5+gIB/gX9/gH9/f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHt8fXt7e3x7fHx9fXyKiomJhoaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgYCAgIOAfn6Af31/gH19fn6AgH+Cf4GAgICAgYB9f39/gICAgICAf358fX19fX5+fYJ9gH6CgH1+gIF/fH5+fX19e31+fH18fHx7fHt8foqHh4WGiIWEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+fn+AfX6AfX19foB/f4GAgYCAgICBgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAiIOEhIWEhISEg4GCgYGCgYCAgoKDgYKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn19fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4GDg4ODhYSFg4ODhIODhISDgYCAgH+AgX59fX5/fn5+foB9fX98fX1+gH+AgICCgICBgIOCgH+AfoCBfoCBgIB/fn5+fn59f35+hYWBgYF/gIOBf36BgH9+f36Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoKAfoCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX+Af3+AfX19fn99fn9/f359fnx9fX6Bf3+Af4CAf4CAg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Ag4J/f4OCf3+Af4F/gH98enx6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBf3+Af4B8fX1+gH1+f39/fn1/fH5+foF/gYB/fn+Af4CDgoOBf3+BgYGCgYGBgYCBgICAgICBgICCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fH2Afn+AfH9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhYKEhIWEhIOBg4KBg4F/gIF+foB+gH19fX6Afn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgYODgYF/gIOAfoKDhICAgoGCgoSCfnt7fHx8fX59fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWFgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgICAgICCgoGAgH6Agn9/gYKDgYGDgoODhYN/fX19fHt8fHl6e3p9eXt5eH9+e3x8fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN3dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAf39/f398f4B/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+Af4CAf4GCgYB/fn+Bfn+AgoKAgYSChISGhIB+fnx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB+fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1+gICAf39/f3yAf3+BgIGAgH98gH9+f35/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e3+FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAfIB+gIB/gYCAf32Afn5/f39+fX1+gIGBgH5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIKAgICAfX5+f4B9fH58f4CBgICAgIB8f3+Afn+BgH9/fYF/fn9/fn19fH+AgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+gYSCgoOFhYKCfn19e3t8fHl3e3l3eHd3eHt7e3t8hYl9e3p3enx9fXx8fX19f358fX5+fX19fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYKBgYKAgoCAgIB+f35/f318fn6AgYKBgICBgX1+gH9+f4F/gH9/gYB/f399fXx9f4CAgIB/f39+fn18fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgYGBgoGCgIGBgH+Af39/fX1/foCAgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/foCAf39/f4B/gICAgIB/gYGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh6gYF4eXx8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fX17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoKBgIGBgoGCgYGAgYCBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhol8fH57e355ent6e49/d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXhzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoGAgoGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3p4eHl8fHx9e3x8fX19fH19fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgn+Af4CAf4B/gICAf359gH9+f3+AgIB/gIB/gIGBgICAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fXh4dXh4eXt8fH17fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYKCg4CAgoGEg4OEgYGDgYKCgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgIGCgH+AgYB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf4CAf4CHfn58e318e31/eHd2eXl6e318fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCgoSEgICDgIaDg4SBgoSAhIOCgoCAgoKEgYGCgYSCf4CAf4GDgoGAgYGAgH+BgYGBgYOAf4CDgn9+f4KBgIB/foGAgX+AgIGAgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/f4R9fX18f317fX97enZ6eHl7e3x9fXt8fX19fX5/gIGAgIB/gICAg4OAfH9+fn59eXl7enp6eXNydG93cXd5c3d7hYKCgoKDhIKDhIOAgYODhoODg4KChIGEg4GDgICCgYOBgoKBgoF+gICAgoGCgYGCgoCBgICAgoKBhIB+gYOBf3+Ag4KAgX+AgoOCgIGCgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cXl0dnh0dnuEgoOCg4OEgoSDg4GCgoSFhIKDg4OEgYSDgIOAgYOCgoKCgoGCgH+BgICCgYKBgoKCgYCBgYGCgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhICChIKDgoKBgoKDgYOEg4SDhISEhYOEgoGDgoGDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX+AgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgYKDhYWFg4OCg4SChIWCgoGCg4OBgoGCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgoCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4SDgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKAgYB7fYF+fHl8enp6fXx8gX16fHx9fXx6e35+foB/f4GBgICAgICCgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSBgoSGhISDgoOEhIGDhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKAgoKDg4KCgYCAgYOCgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn+DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16enx9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX5+f359fHx4dn92d3+Eh4OCg4aDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoGCgoODgoOCgoGBg4J/goOEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fn1+fn5+fn9/gHx9gIGCgoODhYOEg4aEgYKIhoWEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBgoOEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDg4KDg4OBhIOBg4OEhIOEhIWEhISFhYWFhIODg39+gYSAfX18fHx8f4F+f35/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4OFg4SDhX9+goqLhYWEg4KEhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4SDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKEhYuJhISEhIWFgoeGhoSEhISFhIWEhIOEhIGCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhYB9gXWBeoR/f39+hYSCg4OCgYOEg4SEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fn9+foGDgX17f31+gH59fHx8fX19fXx9fX6Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN/g4N9gX1+f35/goOCfH+BfX+AfX18fHx8fXx8fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYSGiIaGhYKGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cHuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdtenNugId5bX1yc3Zzdm1ud2xweWx1fX9+fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYGAgYCAgIGAgICCg4KChIWHhoaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29sd314hnBxenBydWaBdX5ue3lzb3l/gH99foGAf3t/fnyAfoCAfn6AgIGAfn5/fn6Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIWFhYaGiISEhoeIiIaHhIaGi4mFhIaHh4WEhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foN0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39/en59fH99f39+fYCBg4OAgoOBgYSCgX+BgoB9f3+Bfn9+fX6BgH5+gYKAgIKEh4aDg4aEhISFh4aFhYWFh4aIhYWGhYeHhYaEhoaJiIWEiYuIhYSGhYaFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhXiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3B5fX1tfXVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX17fXt8fXx/f319f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYWFhYaJioeFhYaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGEg4SDhYOFhIWEhoOFhoWFhISFh4aEhIWGhYV9d4WDhISDgoF+f357fHt+fHx8fX9/fX1/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiYaEhoWHhYWFg4SFhoWEhoaHhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIWFh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4SEhISGhIaFhIWFg4aGhYWFhIaHhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9fn58fH59gH59f4B+foB/fX18gH19f35+fn98fH1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYaGhYODhYaGhISDhISDhIaEhoWFhYWDhoaFhoWEhoeFhISFhYOEh4aDgoOEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2Bf3x8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIiYiFhoiFhoeGh4aHhoeFiIiHh4WGhoeFhoaFgoSEhYaFhYSEhIOEhYWGhoaFhoSGhYaGhYWGh4WEg4SEg4SHg4SBgoSFg4GAgIB7e35+fHx8fn18fHx9fnx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaFhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4SGhoaHhoeFh4aIiIeHhYeHh4aGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4SCgoJ/gHt9fn58fHx+fXx9fXx9e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoeGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4eIhoaIhIOEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH57e3t6e3x8fHt7e357fH17ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhYSFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeIiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaEg4aGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYKCgYOFgoN+gYKBf4SCf35+f35+fHx9f317fX18fnp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8fImHhIaEhoSGhoWEhYWFhISDhIKAg4GGgoGCf3qEjHuAhIWHhoaGhISHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIiHh4aHiIaEhoaGh4WFiIOEhYSGhoaHhYWEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAhIOCgn2BgX9+g4F+f3+AfH98fX1+fXt+fXx9eXp6eXt9fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCgIB/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeFh4iIhoWIh4iHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SFhoaFhYaCg4OFgICBgICDgIOAfIGAfn6CgH2Af4F9gHx9fn1+e359fHt5enp5en19eXp7e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIOEhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFhoeGiIiGhYiHiYeGhYWFg4aEhYeDg4aEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoSFhYKCg4R/foCAgIGAg4B8gH99foJ+foB+gH9/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18f359fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhIWGhoeHh4WFiIaJh4WEhISChYOEhoKDhoSEhoSHhoaFhYWDhIWEhYaFhoSEhYSFg4WEgICCg39+f39/f4CDf3yAfn1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6enp7e3x6e3t7fH1+fX2AfX18fH2Af318hoOGhoWGhoOEg4WChYGBgH9/gIB+f4GBfH5/f36AgIKCgoSEg4KBgoSBgIOCgYCDhYSCgX+AgoOChIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhIWGhIaGhoaGhYOEhIOEhYWFg4SDg4SChISAf4KCf31+fn5+f4R+e398fICBfYGAfX6DfH5+fX1+e357e3p5enp5enp7eXp6ent7fHp8fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4J8fX9+fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGChoWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFhIODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYF+gn9+f4J8f359fXx8fHt7enp6enl7eXp6eXp6ent8eXt9e3t+f3+BgH1/fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH5+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgIGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fH59fH6DfXt+fH2Af4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMzMzLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PkJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU1NPU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PD45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT0zNjY6Ozw4QzxCQT47QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWy8vLy8vKysrLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw7OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OR6jZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1svL0NHQ0NDQ0NHR0dHR0dHNysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fY2djY2NjY2NjY2dnZ2dvc3Nzc3Nzc3dzb29vb29ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtAPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTUaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbLzJWFhoaGhoaHh4eHh4eCsuLd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi3qaenp6enp6enp6enp6mXgIKCgoKCgoKBgYGBgYOLioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5FybGlOU2JMTFZNPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS1BGntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXy8xuUFNTU1NTVFRUVFRUTKDz6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OjoIeEhISEhISEhISEhISIZ0BERERERERDQ0NERENGU1NTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYd2xpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUJAOTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18vMcVVYV1dXWFhYWFhYWFGh8enp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpaKKhoeHh4eHh4eHh4eHimpGSUlJSUlJSUhISEhHSldXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDs+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fMzXheYWBgYGBhYWFhYWFapO7n5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamnkI6Ojo6OjY2NjY2NjZBzUVRUVFRUVFRUVFRVVFZgYmJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk6Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzMzHxcXFxcXFxcXFxcXFxcrQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Pzs7PzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tDQ0NDQz8/Pz8/Pz8/PzcrKysrKysrLy8rLy8vLzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo7ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M3Nz8/Pz8/Pz8/Pz8/Tz8/OzM3Mz9PS0s7Nz9LOzs7Ozs7OztHUz8/O0tLPzs7T08/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dbX19fX19fX19fX19jY19jY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztO7nc/P0qee0M/RpaLQzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK1lZuz1rOeo6bWsKCiqtLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/Rn6CqrtCdmpOdwJ6YlpzHz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4+PDw5Nj9CP0I6NjQ4Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0cWHmrTAmKGctJicop6vsdLPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9COjc0Ojo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Wp5m1tpmWrbmGnpaws6nU0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PDk2NDo5ODo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8qgo7/KnKWMp63Yqpmq1M/Pz8/P1aWZtq2YgaCWeJuEnpOj1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD45PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0Nalmbaum6iInHmfqYWZpdXR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDR0RBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NDVpZq2t7WvppyKva2mmK/W0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkmxdXG9naGJdT0Y/SEhGRUA8PD4+PD09PDc1Njk5Njo7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPQ1qaatMajl5edpaeWmJq61dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HH0telm7HYn6ukm9Cfq6Sb0NLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtLQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09HUtYLD1cWQjbfXwo+Nu9TR0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVaWpbTF9NSkxKVUxGQjw8P0ZFR0tJPTY2Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oz05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dHD1NHUx8PV0dXFxNXR0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRExMQT03NzU6ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS1NLS0tTV09PT1NTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj09Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZJRDxBQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ4ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+PEhGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0RFQ0FMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhRQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29ra2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Firzd29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tvc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg2NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv72+v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7Oz4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7e3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi3t7e4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3uLe2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKinqKinqKipqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7a3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OztAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelpKSioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpaenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6SlpqakpKOioqOioZ+fn56enJycnJ2dnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAP0JCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqSkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc1Nzg7PTg6Ojk5Oz07Ozg5PjY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKunpqCdnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5KUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqenp6afm5qboqCalpeVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6Wmpqako6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODk6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/PkFBPkFBPzo5PT46UJ2gn5ybnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+mpp/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWjoqWmpqWmp6amoJuZm6Ggl5KTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ+hn5eRkZCUl5udmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoKCfoJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaSmp6alpaampaWjoKChoaCZkpCPlpuZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaCgn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKjoqOkpKampaSko6KhoZ6cm5WTlZmcmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+foKChoqKjpKSkpKKhoZ6bmpmWprmfmZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKOmoaKhoqGgnpybm5uZo6aRnJucmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaCmsa6goJ+fnpyZmZqana1heZ2dnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJuam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goKCfppKVrZ+goJ6bmpmamat7Q4Gfnp6cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmpiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnp+hYZaonp6cmpqbm6SfTUmEoJ2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZuZp2xaoKCbmpqbnZyvbktMhqGcnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxRPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmKWEVHSimpmanZuhoWBYToehnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGgoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFxcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJuYmJmgi11gkZqZm52co45lWkyAop6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbW0xGPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiZnpleX3OVmpydnaGAZVpNf6Ken56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZibYWJgfJSenJ6Wc2NVT4Ghnp+fnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmYoGpcWmF7m5yeiWleUFSInpuenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0JAQUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qalpJ4c2tYfJWYnopbVFBZi5KOkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkY6Vn5+SgKSnmaaaeVVPZIeHgo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg4CFpJmLemKOo5KYc4WFaHV/gIKSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2OTM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5+hKKHdmpQcZuNildueXt/fnyFjo2Lho2UkYuQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhYCCfZmYck5HSXOSg4BKXG5vdomFio6LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYB+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYt/iI2Mi4uHkY+jiEwzMjt5hHVyPz1Wam2BkImJkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmQnqGdk5eboZqdm6Knm19FZE49eXdnZEg1NlRucY+Pi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6mproxLgraGQHt7aGNSX3FRW2+KoaGknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipqmnqKJ0aMXSqEmAlYx9T2yKe1pggKOop6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkp6eZnaSlo6KeYoK4v6qFr6OanXdHV4FyUnOUoqKgoZ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmVkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioaKnoaaupqacnm+ClLOIttamnLixYlC0o1ZkkKGeoKCenaCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGoqq2xsq+ro6OJd391eNO7qZOeqGxVoapoX4enoKWioZ2fopiVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFVcaGRvY21paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKehnpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqevt7e1tLayrLCtkIh/bJjHxJecqpJ2WmlzdXV/kqWpp6Sgn6ObnaGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gqrK3u7y8urrCubSznYR0XlGdsK+kopGEd25zcXd4eXyCiY6UmaClp6ympZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odmtwaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW4w8nQ1NHMx7yvoYxtY1JDg41+foB5dW9tZGRpZ2pxcnFxcXJ5ianHx7yip6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FpYGZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PEx9vk49fHua2ilIRvV1hQRGFyZ2tya2hjZVhXXFdbYGhpZ2RgbJK6wL+5qa+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3bm1bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxr7Lz9TLuaWYj4JuWlBUSkNcZl1haGRhYWlcVFhVV1hZW1hffaG4uau0sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Ef2pmaGFrbGdudXJydXJnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS+w8HHy8m6l3RfUk5PUkc9XmxgX2VjYV5kY1RVV1ZUVV1/p66vqqirrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3VrbG5kb21pcXhveWppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO5t8SjakxDRUpEPVlhYWRsZGFcZV9ZU1BQVWGLt7msrqWko6ekoKClmam0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnZSTiYl+hoiMlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent3bmtpaHZaZ3J4c3pnZ15kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTExMLEwbOQVkhNRjtJWF9obWhfXF9ZWlRQXY2qrLi1sqypo6GtqaynrZ+stLS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl2dWVmampoXmtvbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMfCyKN3YEg/P0FeXVxrZFtYVlJdiKi6vrq8urysraapu7q5t7+ztbiywca6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWh2aGpqdG55bF5kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnNxsbHwrWBXVQvVVldbF9RTVeEucrHwsTGwLy+tLCwsMK+vsHGwL63tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOi5R9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ9eHBnYGtqd21pZnZvdGNdY1VXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwcLCxcacTlKAiZVVVIO1ztLFtr+/wL+6u721s7PAv7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5gHNwZmVnZGxlYmtub29fWV1XVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvrzFp3x0gJGUdbzOx8fQwK+9vbi5u7u+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFlYmFjZGRqY2djW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8yc/Aur/AvLvFvbrAxL+9vrFzYYCRiYrPxL/Ayb6wwb+6t7u+ubW4tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhYmNnamdnamZqXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdSMuL+7w7W6x7a1uLq8uLm2s7aejXSEyb+/u8G+uca9wr+8xbi2t7S4tra7u7i2tLe6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVmcGplbGhZWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vM/DdqjMvce3ubettrS3ubO1sbvGx5ZCfMq+v769vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucWdxa3RmY25gXFVIS0tESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTXrXOAu8jPwsC4rrS0u723ubC9w8iMRnbNw8K/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHJmbGpudW94Y2hjXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsbJ0Zhwc6zR0czKxLW6v8TIvr60v8C/d1Nvy8bCvsG8v8PMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0cG1sdGxsbl9jX2JiTkhOP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQwrq+vMS+t7zAv8nPx8jKycGGcXOlzMzLzcrGwsPLzsG8uL26sG9kY7vIxMDAv8TAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIe21teHxgcWNbX2BfVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u7q9rDvra+wL6+uqacqbK2w7+leHV4m8TGy8jBw8DAycrBv7u5saB+c2ytyMXEv8DBv8vHw8DIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO1uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXpuc3h0aHBeXF9dWlJGRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vEt22tzr22ucC8rH1uaG5tcoGVmHJ3fJe9v8bAucC8vsXEvb24sbCZj36CnMrCw7y9v7/Dw7+/x7y8v7S0rrW1vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsbess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bXV7cG9qXGBhWlNRQUZJR0tARUNJPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5udm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbJ1gbO9trXCpYdpWl5gTVJbWm5zdoGfuLjCurO7t7u9v7q7u6+kmpeIkn7AxMO+vL+7u7i2wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra8tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z2d25yYV9mXVtVSj0/P0dHPUdDQzk6NTs5OT48PDk6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmnhHiKoK+1nWplZ1ZZYElJTVBTbHaGpbC3vrmytbK7uby2ub60lZyml6FyrsnEwL2/ubOusry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYVxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/Fqoh8dYygmGBUQ1hVR2FqVk9FSmCNoKyvtrq1tLKsvLm4tbjBvYqXsKGmc6XLwr+5urWupayzsaawraidoJ+lrba1wre2tKWoqqiwtrOyurW7u7u1uLawtsSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3ZzbmNeZ1ldXlNPTkE/SkNBS0pANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJqRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4vrSQgniIj29OSj9kWUJOd4CUak5AXIGvtbO1srSvrLu6uLa5v8V1gamdmmSnv7i1srGtrZ+kpqedpKWclpmZmZ+prrmsq6ufpaikq66vp7Crr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ3c211amxdXGtUXlxQTkhER01CR05HODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhHtYRkFOh1lKSlh3jYFjQFOjubO0srCxrbC5uLa7t7q8j6Gxq6Rzq7Cpq62ro6ignZ6el5eglZKWl4+Yn6iupKOkoKKmoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeWh1dG9lVWFkV11ST01JQElSRE5DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yvKqZmZVoTkBSeHBQSUlLZ5yAWURSrruxrLOvrqyttraytLWuqKaempudn6aonqCoqZ+hp5aalpeOnZOOkJaNl5ukqKCgoqKhpaWco6OgnqWgpKylpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CXlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqaSpq6aprKumoYh4g3x2f3pjd21uXVFpVVBPR1BNTUNQUkA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2qpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3Cq6W9aEVSnYJRV0lKYEpUjWBjYoGutaqytK6qq6+wsrOtpZ2Rl5OPl6CfoqCco6SfnqiUmpWWi5aRjY+Xkpidoqqfn5+go6WonJ+goZyhn6Oop5ynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJaTj4+SkZmQlpWYl5+YnJmbpJmXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fIB1dn1ua3tkaVZSZE5JSEdPU05LTkg8RUA9MkA4NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutra6ubq3t7uuqKChqaCqxr/LoFBBc513UG5LS2NmdHNfWl5wkLGvrrO1qqasrKObmZSNkZWXmJicn6KinJ2knpqklpeXlY+RkZGSmpeboKSqnqGhnqanq6KfoKefnZ+jpqieo6afqp2qraqup6iwpaOkpqespqKlopqZnq+orrKrpquqoJuYmJiVk5aak5WWmpabl5iYoZ6cnJaboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJfIB+d3l8ZXl6YGJTVmFISUtLU1RKU1FNOT9BNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpMfHjldTSmWjWmV+b3JcUWtjW2RfXGqPtLCwuKymoZydmpSXmpmQjpGVkYyOjZOZopyXopiZl5eYlJmYlp2bn6WlqaCmpJ6nrq6qpqKxo5qjpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKehoKOxrrKxtKqyrqOZnJ2eoZibm5qYmZuVlpuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2mCbGZbU1taTVFLT09WTVNNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp6rpIx5VWlydnVwY3Z2WFdjYGNnWFdWZ62urK+nn56ioJaQk5ugnJmXkpOfnKGjmp6blp6anpeaop2koJ6jnqSorK2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7W4s7itsrSkoJ2loKyhoaKhoJqZlpafm5uYpaGgnqOhoJ+bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dmp4dV5tW1JhSVJWSEZWV0pDTUg9S0k4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqK6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuioaCjgG6CcGBjWExbU1pNTFBYUkdMTEeYrKqppaCfmpKRlJiYlpaWjIiLjpSdnJ2cnpadmaafoKelsKmmraKqrbawtbKwrba4vb+6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquusbm3vK+zsLXBvLe+s7O1oqyiqamyqauop6iamZ6aqqegmaegn5+oqKWknp2qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhX52cm1pd21oblxYXENXTkpHTUhDRk49Pkw+NDw6Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqamUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOfnYphV15lYFdNUUc+Pj9DQz8+QlF4qa2pqqagnp+io52enpqdm5STlZSenpiUhZ6doJmro6uxr7mxsbCxsLq9vLy5trjDvr/Cv7a6u8DDub27rK6nsa2xwra4wsbAyMrAyb+wubm9uMK+uLS7xsS9w7y4tKqzraqztK+zrqquo56sqLayraOwpqGjsLGusKSlr6OhoJqhpqGkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF8dHJrbHVycWhXXFFGVUhFSlBJP0VCNEZIOTY8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfn5V8X15lYFFHRDxDPkU8Pzk2Tn6qs6eko6KgnqWspp6XnJSRmp6ZlYyKhoiGeGyKpaKiq6uyvLbDvb6yu8HDwsW/v8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxszMzNLHvr/Aw77HxsK4xMrJxMHHv7q0uru1u7ewtrKru7KvvLe/u7qruK2rqri7tbyurrijpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5WUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrZGlveGtlWlxGTE1FRFRNRUJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEA/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9c2phV05FPklZfG9iQj1cjq6soJmbnJ6emZeXmJKNj5eXlI+NkIyCg4J2cnBtcIelrK20uMS6zcfLvsLMzc3Mx8jQzMzMx8rFxczQ0tXO08m9wL/Du8bFyMXR083T0NPTzMrBxsfGysjPwMnRzcfGyMbCvMPBv7+/tb6zrb/Aw8PHxcfEr7+5sri9xMLCury8ta6np66ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXVzZWJncm9nXlpaRE9NQ0VQSURDQTU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjk7QUE7Oz43ODY6Oz5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOem52Wa2ZdVElEQD9Lhp6lmoSgsq2jnpyfmpiXlJOUl5GQj4yHhISIhoOAgYGAeXFyb2t4ora7ubzKwdPS0sjNztHT0dHQ0NHRzc3O0MTN1NXY0dfNxsfJzMPFys/K0tfS19LV1tPUyMzHzM3J083O083GycrKwsbMx8nJxr/Ds7PIxcvLy8/Hyr++v73Bx8XMzMnJwMPArrCzqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuWkIyGkYuAe3J1dmdjZ3ZqZVZYUkROR0BJUUM+Qj06MjJBPEU8Nzg8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hnGNUTEpEQz9DUq7RvbKvppycnKCkoZ2alJSVlIp9eHFrZWJocnBye4WKgHVwbXFyb4ScrbzH0dHX1tXR1s3U1tbT09HS1NTSz9HD0NPW2NXV0svJztDLxs3SytLV19nW2NPW2M3Sys/RzM/RzdPQwMnIy8TMzczPz8bHyLbAy8DSzczQx8rIwMTDyM/N0NHPzcrIzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYWVyY11SXEpLR0FGSUo/O0E4PjU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpaWgoqJbSUBBREFGUXayr6aalJefnJqgoJ6bnJqViXdpY2FfX19fXl9fXWFsdXNwcG5scG91gHeYuNXX1tfW09fP1dTZ1NTOz9XU1NHRzNDN09fW09XQz9LT0cnT0cjQ19fY0tjS19nV1szPz8nN0szO0cDHxMnHz87S0dLIzM3Ay83G1M/MzsnFy8fHyczL1NTR1c/SzNPCucWxpai1rqibqKulnbKosLOsrJOPk46Iio6Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUWBKSkNFQ1NNQDw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD9APUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu319TV2dnRztC/vMzJtr6up6qooaOsZkM4PT5EWIKqqJ+XlZeZmpyfnZibnJN9cWVjYl9fYV9eYWBeYWBfYGVtcHBta25wdHl2aXypzdTY2NjRxdPS18/TzsvSzdXU0crPzNPW0tHWzc/V1dHF0dPK0NTV1s7T0djY2NfLyM7Eyc/NyszAycHJys7O0MzQzs7Mz8/IzNDRy87Lw8nHys3LzNLTztPS0dDQyr3IubCuu7m1q7awrai4rbO/u7GajqCUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Bva2FkbnBhWFxbSUZGRE1ZRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD85ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksntIRkI7V42hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYF5fX15cYm1xbm5ycnR1enFibZ7H1dTQpMrPztPKzc7EzcrS0s7GzszN1MvO0s3K1tbQzNHUy8zQ0dPKztHV0tXWysDKwcbNw8jKw83ExsnLy8/Lzs3QztTMxsnQzcnHy8bHwsbKzM7R0cfQz87OzNDFx8G4ub3Dwr3DubKyvrC7w8S1qpiloZiWkZWVkouUjZqRlJSPj5WCiYZ5cXJrbWhgYHFoWVhoVk1HTElRUUI7RD87Njg6ODo7NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMrV1tna29jMzM/I1tXEwrWvtKigrZd4bG9wd4+ajYyXlZCTkZGVlpWQi3xlYmJiYF1eYWNiYF9fYGFhYF9dW11ncXFwcXJva3F5dGVun8/Nm5fWycPIyMXGvsLFzs7HxcbNytHIy83NxdDSz83M1MrHys7Px8fP0svQz8W6xL/Gyr3Dx8nOxcPIwMfOyMTNyszQyMXF0MnGwsbJxb/ByM3MzM/DyszJx8zQxcXIu8fDycnCz8G9vL+wwcnHub2qsbKnpZ2inJiQm5CjmZeZkZWYiY+CeG91ZGtgXmZxYVtXYEdJSEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7utpLZ+Z4KFoqqTjY2Wj4WDg4OBfYSEfnNfW15dXmBeYGNkY19dXF5fYGBfW1pcYWtycG5uaWptbnpnVYDAonm7z8O4v8K6urq4vcjFwcPAw8fKyMjJx8DFy8bIys3JxMHKycHBy8/Ey8i/ucG8xsi+wMbPy8TAw7vKx8i7ycbFysG+wsvGxcS+xr69wcTGzMbGvL/Kw8XH0sXBycDKysbIxtDDw8bDrsTLx8PKt7+8urOprKSlmJ+YrKOhppujoJuVfHdzdWZqW2FubVpcWFJETEdCR0RMREZSQDU0MzM1QD0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL64vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srC2bF55fJ+RipKWhnqAhIV/dXh1cnBfWltdYGBiY2RkZWRgW1xeXV5eYFtZWlxibnFuamhpbm1zeVZqlHurw8XArrW4sLGysLDBu7u7ubjAwcHEvr25vb+5xMnFxsK9xsC3u8PIv8HJu7a7u8XDv7zCzsPGvr61wb7Eu73HvMO6tb3GxMLDt8C2tr+/vM3Evba6yLu/vszEwsbDxsnHycbQxsLMyLLHycPOzMDFw7+8srewsqeoqLmwpa2wqq2slHp3eGtlaGBob2RWXllKRkpGSEtBRUJGSkE5OjY1ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1q7e0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1dfNys/FycXHwbrFvayupmBjdoGSi4iLhHh/hoZ/fYN7dHRjXFxdXmBgYmNiYmRlYl1cW1xeXF5dWltcXWdycGxmZWxtb3t4XmaSx7m/t6yvrqWorKqlt7O1s7KztLu1vbG3sLWusrvCu8HEvL+6tLK6vsC4yLi0vLbAwr24vcfBw7u1r7O1u7+0xbi7tay5vb7AvbG7trC3urPGvbevvL+1t7XFvb7DxsDExsbHy8W/xsa7x8u/z8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpHQkRBRUY/PTo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDLzcjJyMrJysTQzdLPzcXHwcXBv7q4ybersJlbZ2+IjoaIiXp4foWGdneBfHNoXV1dXV9gX2BkYV5jZWNfXlxbXlxdXlpbW1xfa29tZ2Voa2xvfm1ouri2s66oq6WcoKelnKmqsaypq6mzrbWwsqitpqyzu7q2w7m6ubCqtLm7s8K5r8Cxvby7tbvHucO3raqosLLAtri9sLGosrO1u7yrrranrrauvLKxqriwrruuu7i7wMG+usO/xsPFwLzGwcfKuMXHxb/Hw8O5xMbCu8bJzMuzucK9u7OJdHZ3a2lgYmxpWVdXW0FMTE1KRUFDP0ZBOjo6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcTPx83Bwsa/xMTDw8rCycq/wLzCurO1tcOuqrCSW2l+koiOj3t4fYmFeXuEgHduXl1cXF1fYF9fZGNiZGNiYF9dWltaWl1aWlpaXGRtbmZlZmdpa3B6ibevtKyjoqSkmJ6inpiao6mso6ehq6msq7Cjpp+qrbS2sb24r7evqK24tLO8t7O9sLi5tbK8wbLAr6Wpo6uxs7OovaqrqKusrrW0pqmuoaWvqbOmqKiupqi3rLGzt7q6u7K8vr++xL+1wcDHyLe/v8W3xcPAu7/Ewr7EyMzKv7/EwMCph3N0c2ppXGFvZFdWWFBIWlNTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDx7m5y8LLvrvJtr3DvrrKt8HEwbS2vLaxr7W8ramrkmNtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9dXVxaWFlbW1hXWVxfZmtlY2VkZmhscYKlpKqimpmeoZGaopiVj5+gp6Kin6Wlp6Wtn5ybpKassrC2t6ewrKiqtKuzubC2tq62urOwurqxtqSgpKCmsaisqbmqpaenqKezraCnp5+cpKasn5+npKGhsa2trLK1s7Owtby2u8HAsru+w8GxubnCs8C9wLW4vL2+vMLHxMPEv8DEoIR5cWxiZmBrb2BVWV9ITmhPVEhGS0Y8PUA9Ojs7ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbq9tqCelZ2gprq2q7Ozu7PEz8nLwsW4t8fAzL+4yre7xbizxbizv8CstryyrKavtK2ho5JpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGBeXFtcXFhZWFhYVlhbXV5kYmFkZWVkaGpshpynpaKWl52TmJ+Vk4mbn6Clm56fo6Wip52aopufqq+tsbWkqKqprKyktList7Css7Wvs7WvsKqfnp+korKlpqq4raKmpqCorauZn6CemZ2fpZqZo5ycnrCprKiqq6ytsLK5r7i5urC2vLu6q7OyubO9tLeysba1v7W9wL3Dwru7vZeEe3NsX2VeZGRYVFdeSVddS1BHSkpHQTw/P0E7PzwwNTYzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67uMHBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uce4uL+3ssK0sbu7rLm6saKfqaunmJ6QbX6Fhn94cm1vbWtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dXWFdaXWFjY2RkZWZnaXGJkIKTq5eWk5edkpONmZ+fpp2bnKSmoaSbn6GbmK6tra6yoKSiraunobWwsbKsqbCzqLqzp7ahop+co6Gto6Kqtquio6adpqajlpmdl5manZ+al52cnZytoayoo6Smrauzs6q1sLKrsrm0r6qvsrKzt7Ouqa2usriwura6vb+3s7GUhnp1Zl9mX1tZVlNaVUtbUUxKRUhLSUM9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+ynaWjmKWxw7W2va20uMHMyMa/xbbBwMfOtsDDvbO5ubK/trG5u62yta+fmqOqoZSaj3h/g4R/eG9xdHFoZWRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXVlZYV1hXVVdhY2RiYmNjY2Zpc3NHTX2QkJKTmpOWkZSdm5+blqCgqKOenqicm5qrp66wqpyjo7epoaCuqLWqp6eusaS4sKS3oKOcmZmqpqGarbmwo6GknKOgoJOVoZSWlpyZmJaXnJWfqZ6qpKKdo6qqsa2otKyqp62zsKWrrrOxr7Cvr6eoqLKusrSwvLS6uK6jlIJ6dmVfYVdZWFNSVEtNXkxQTEdITEtFPUA+PUI8Ojc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0usKxvre9rZ2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGuvLu1u7y1ubmwr7CqnJqhqZWRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1ZVWmJiYWFiYGFjZGtyZWduiI6Pj5aUmJKSmJ2anZWfnqalo6ann52fpqCqr6afoaO2p6GhoqmzoqWopbCmsa6rtZ+hnZaVqaGilK2xsZ+io52emJyTjKCUkZOYmJKXmJiXnqebp6GimqSlpaukpbCnpaOrrK2mqK6vr6uoqqqzpqarr7Sxrry2sa+vn5J7eHNlYlxbXVhOTFFIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sba9sLuxt6yepaasuLu8wcW6srm1xMnJwMLGxce2xcSzwb/Fq7e3vba9uru1sqytqJmZn6OLinSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVlJUUlRfX15fYF1fX2FjaYGPhYWLiY+NjpeQkZOhl56Vm56koaylpKSjo6Kcqqukmp6lsaqhoZ6lqp6oop+trKqprq2ioqKVmKKanJCrqbCbn6Kfn5eZk4qdkY2SlJaQmJiTnKGjnKSgopWgoqSlm6OrpaKkqqSrraWusqmmpaamtKaqqK2ztbS5uq+qrJ6Mc3FwYFtXVlZSR1FPSFpcT1JKVEtTTEVHSUM4Ozs9PDk2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Gtnainr7m5s8DIurXAr8XIzLrByczItcm8sb7Dya2xuMG1vMC8tLWqrKaWmpyciYFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU05QWV1bXF1dXV5eYWNsiIp+i4GKi4mUj5CPmZmhmpqfp6iqqKunqaajmaWvpJWZpa+poJyZm6CfrpmcqrOfpqafo6OhlJSblpaSqamtm5yfoaGblJCMmI2MkY2SjZaVkJ2hoKOdnKOVm6GjoZiiqKOiqKugq7Ckrrilo6SjrK2qqKuvtLeyvbWzq66YhXV0aVtYWVNVUkZYTFFbWE1VT1BMUVJJT0lCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7euqKivrpupqKy3tqy8yru2v6zMxsW4wM7Px7PEu7e7wsixrbi/t7y+u7O2pqmglpiZl4h6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOT1FZWVlZXFxcXV5fZHqGfIR5houFjYmTjZSXn56Znqqopq6sqbCkqJqfrKCVlaSop52YkI+anq6WmKeqmJ+dlKWgnpKRkpGTlaiqpZqYmZ6el46Mi5OGiY2Dj4uSlZGgnqGkmZaflZqhop6Um6Wlp6mooLCwprG9p5+jrLSrrqevtLC5tcCxrrCrkX5ydGNWVFVOUUpHVlBSUkxMWE5LTU9SR05LQUNGREM+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7SsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqxt7i8vcDDsbCxt660tLuztKOjnZ2Yl5WEgHZrZ2xucW5xam9rZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlRRTU5NUldYWVhZWFtbXGBpenR5b4KHgouFk4eRkZWYl5ynmp+qpqarnaeZoKWbko+fo5qXl4aFkpukj5WinJaWlYeimpuTjI6KkJqlp5yVlZeckZOIlI6LgYyNgJCLkpKSoZqgopaUmZiVoqaajZmkp6mnoaC0sqizuKGdo7esqq6ksrKmtbu1q6yxoop6c25eTlFRTU9ETk5OUEtGTk5KSk5OUUlNSkFITElIQz45NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2sKSnpKqloKmmpLOqorLDtbWys8bFt7rDyszGs626vbS4wK+uqbCepq67r62gmpuelZWIfIRuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU5NS0xTV1dWV1hYV1pdYWxscGp+gn2DfI2Bi4eSjpGcoI6ZnKOho5ikl6GclY2HmZqMc42Dfo6XloaSmpCUjo17mY+djIKJgIqYoKOekJOYloWOgpR+fnSKjnqQiJOQkJ2bmpqSlpCdjqOjjomaoKGkpJuitK+ssK2fmKa4pqWwobGunLG8qqmvqZmEeHRkVk1SUFBNQ1NOTFBNQlBRSElOU01ISkpES01GS0s9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNDg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY2Ojg3QTd4t6GjtKimpaijpaWmpqayp6a0wbivtLDJxLi5wM7GvrOsusGsrcStqKKmkp2mt62joJGWl5KQfnh/ZldWX2dmaWdobmNpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpHTlNTU1RVVFZYWl1pZmtneX93cExWb42AlISLmpaJkpCemJ2VlJaUj5aKgJSJXztWb3yMlIqAjJKMj4aGcouEloF5gXuGlJ2Vg5aOkI+Dhn2TeHFwho19iYGQjpCXmpmTi5CKnYifmIeIlp6aoaCXp66prampnpats6KmrZmtq5iotKOpraKTf3RuYFtOU1JXTERUSlBNTEZOT0lFTFFNS09KSU1QRklKPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebegoq2hpqaqoKapp6OqsKintMG5sLWwx8K4s73Pv7mvrrXCp6rEqqKdmIOUnLGjmpmHlJCLh35zdl1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU5RTUtIRkhOUVFNT1JUVVhZYGpoYnV8b01APn6VkI57hpOLg4mMmo2WlImSh4WVhnmJf2BKUW54i5KEfoSMi4R/f21+f5N3dXZ4hI2acFGNiIqGfH55lHZnd4aIfoqIlYuOkZOXjISKiJSFm42ChZKblp6dlKSiqKmlpJ6bsKqhpKSRpqqWoqqcoaaninduZl5cSFFRU01JVU1TSUxLT0lIRkpOTE1US1FRT0ZKRD03Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMTUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2m6KmnZ+hrqGnqKWnqK+sqra8tri3s8G7tqe5yLi2qKi1tqqyvKeelY5/iZSplpWLf46Dgn54cW9YTUtNTU5MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERDSU5PaFlOUVNUVVpugW5weGVlWVKOiJOGcn2Ff3uEi5OBkpmLj3uGj4B1f3hzb3VwdI6OgXp+iquFentodnuOcHJteIGLjZJ4e4B7gHdzcpJ4aHWFhISFfJWKiIqNi4B/hIuNgJSEfIGPmJSclpGfnameoKGdoKmln52Yjaejk6Cflp6fpIFzaWJdXUpXUFJIS1hST0pNTFJKSkpMUEhMUU1SVE1GSUI9Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLi8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6qlrauwsaq9tLK7uLa6tLGft7qyqp2drKmosq+impGNlIGOnI6RfneGd3x3cG9qWUtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE5RUVNWXnWBeXRic4qUl42NemV4f3V3foiQfIOYkoBxho97dntva36tfHSQi396hpKAfH90ZnV8hmxvaHN8io2HgG15cX1xbXaPcWhxgX6OcESLhYKDhX93d3qMhn2Me3V9jpKPmIuSmpujlpmdm52eoZyWjYulmo6dl46WmJB4b25nY1tYWFVRSlNVVE9QTlBWS05LT09KUk9JT1BMRkQ9Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKawrK6rqKmxr7GrvLiru764s6ynm7CnrJuPlpylqaShmJmOhJJ5iY+Li3ZxfG11cGptalhLRkdFQUBDREhMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFellKTk9RVFhdZnBwaYWlqcB9cndhendteneHj3l7i4VvbIySeHN4aWqAgnGWkYyBfZV/SZKZbmd3foJtamRseYWQkoZrcmx8bnJ8hmltcH9zjYmFhnt+f3t3cHR0hoJ5gXlwfI6LipODlpeYmpCTlpaZl52WjIOJn5KLko2GkJeAcGpvb29ZVlhUUlJZT1JVVFJYVU1OSE1LTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuYm5+krK+iraqota+urLS/q7zDv6WimZWkmJ6NhIuUoaGYmZGTi3OOeoCGjIZ1b3RscGxlbGpZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JWWlFZW1+mhmGYZnB3Y3xubH55ioh1gYeFdGyZkXRzfGlqnY5MeYWTiYSOZjF2h3JrfX2DdGZldX+EhIWAZmlsdWtwgHxocXF8bpONj3t0fn1xcW91bYJ/d3l1anmIgoiJg5aSkpCLjZGUlI6XjYB5iJeIh4qGgJCIeGxrcGhlWFJbWFlZW05QVVZZWE5JSEVKSkhHQkBHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVtkoiakJmWpKitnrGep7qvq7KwwrG7w8ealo+VmYuOhXqEkJiVjZCMkIdxh4J0iIyGenBzcW9wZHBnX1RGSUM+PDs5Oj9AQURDRUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVUxCSVFJYq6ynnB5dWp7a3CCgISAeoSFhXlyoJR0eIBzdJSHNXCdqJ2PoaGEooV2cIZ7hnx0jK6NiYFoZ2JqbnJtcIN1aW9YdXCOm5F2bX97fW5ybnCAe3N2bmJ1g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2OfHNycW1gXF1eXFpZYV9STltaWFdMSEpGSUc/Q0FCSD9DRD07Ojc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpGBkoiVkZ2kp56vlaW0qa6wrsGyu8HFlpCMlI+AiHxugZCSiYOKh4+GdYKEbJWIiHt1eHhsd253Y2peSVBHPT83NDQ5Ozo7PT5AQkVITExMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw4RE5SU0RKhHN+enp0fWt1hod7fISDfot9daGZeX6FgISZhJqcYYaqn52Kg5COeneIfomIjnOLl4+Ee11kcXR6fHeKbWhqYnlvhZCCem+BeHWFenB0enhrbmlddoZ9h3yHho5/ipKXg42FjIZ9cYR/hH12d3t8iXhxdHVnaGBbXF5TXGdeV1FUWFtVR0pKREtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIp/k4yRnJ2eppGgqqCxqK/AsrvFupaOkZOHeoZ2a3+LkYN9ioOOjHiDgHOghIp9fYF/cIF+emh2a1JYTEBFMjExMzc2Njg4Ojw+QUVHRkdKS01PUVJTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9RTEtUXFhSS2eBh3qIeHpwe46KeXuIhn6Wh3ahmYeGjpKUpY2sqUiGrrCui4GAlIuCi4KEkqmHgJiYipx0bXyBhod+jmhnaHl/boWHgoVxhIZIbIB3cnl2aG1rX3Z9g4h/h4WLeZScm4mLiJF/enWKdnx4bW93foF1dXNtXF5eXGNkWGdmXFVQUFdZUERMS0ZPSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2Nzc4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5COlZeSlqCdrKCmuK+zvbOXjZKLmIt9dHB+iZJ+fYyDkpR9hn6GpIeIf4KIhXiHiX5zhHhfY1dLQjYwLi8yMzEyNDY2ODo9Pj9CRUdISk1OUVNUVVRUVlVTUU9HQz84MCwjh1s/Pzg0Ll2WcHOjVUZJS01NUFdgWG9ZW11oi5GFk3+CgIOQkX2FiJCAmZSBoKGYlJuapq2Tmbuxp7vHw6iLjKGljpOJgZF8cYOen5Gdf3eFhYuQh5BpaHCEgXSMh4SKcoaCd4iAe3aEfG11dWZ/lI6GiIiHiIegqqKWiY6Xf3qBiHp5b2dreH58gHVsZV5bW15qXmJnYFpPTE5YUlFJUEpETkdDSkRDQUREQjw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZneCen+Mf4GQjoqam6Sdoaymqq6wl5GRhKGUhHh3f4yUfH6ShpKVf4qAkpuOg4CBjIqCiY2Df4p/bHBqXUJANC0tLy8uLjAyMjM0Nzc4Oz0/QkRISU5RUlRSU1NUUlBPSERCPDg3LzlDPjw8NjMubJOXTVBISUxMS05WYGN/ZmZsdJqYjZiRkYmMjZiHko+di6CfkaOqpaOrk6m2oqjBwq3Hr3i6lJp8jaGemYSThYKOoZ+UmZGFioWPmZGWbHB1ioyClYyNjnePhHFthYGKlpGChYhxiKCWhpGJjY+WpLSom4yUooOHkoN9f2tqanyBgoN1Y19lYFtobF5sbF5XS0hOUlFNTExGSVBDRE5GQkNFRkM9Ojk2PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnF2koZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXl/koiRkn2KhJiSkIKAgIuMiYaQh4SJhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOT1JUUFBRU1FOUElFRD47PDpERj8+PDc1Mjw/UjVISEhMTE1OUl5uintygHydmpqlpKCYn5ahlJyep52oqp+orKmqtZerv6u2x8i3yNDPvpugcGmrqZ+Ek5KFnKCam5mmkpGIlaKbm3h6fpSYk6KSl5eBlJ57d5WSqrKIjJeffJSdm42RlZijoaW1r5yQmKeHlo+NgIhsc3N9gX5zamFeYmBiaGRgaGdcUkVKS1BPSUlMRkZNQ0hMRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbX1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjox8ioaPkI6BgoCJi4qFkoWDhomBgId3XmJQNDYwLTEvLC4wLy4vLi4wMDE1PkFBTVFSU1FSU1VSTlNMRUVAPD49RkdAQUA4NjYyPDk7RkhHSUpOT1FZbYWPdpSJoKSnsry3o62rq6aos6uvtbGxrbuxs72bssOrusnLt8O/uKWisLOsraqji5aYhKWmoKOXgaaZjaKrqKWIhZSkoaCroaSoj5yxi5Wjpre6m6Cir5KhnaKdj6Ohq66rsrShlKSpiJmIkomVeXp+hoBpYmldZmNfZWReZ2dfW09DSUhTTkZITEZKR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhiV2luWHqEdoGThYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5COg4SBi4WGiJKGgoWJh4iHh3FuYUBFNjQ8Mi8xMTAtLCstMC4tND9DQU1VUFJTVVVWVU5bUEdHRDw+PkZIQ0VBNzs8NUM7PUZLSUdIUU9QV4CSn4OsorGpsL/GwqmyxbWrsr+yt721v7TBtru6o7jFqLXIx7W9ubSoo7StsLGbmZKan4inr6ullHafpJehrLK0mZaqrqiutruyuqywtaKxrLG1u7a0rrSfpqejp5qpr6yxuLe4ppq1qIykjpCSn4Z4gYV3W2NlV2djYmRhYWdgW1RKRERMVVFISUpESUdFQUBAS0RCTUc9ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWVFiYld5dXCBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiHmGgIySjIeEgY5/gYmPhn+GiIaKh5B6eG5dVkBFTjw2OjQ1QUI3NjQvLzZDSEJRW09RVVdVXFdQX1VJS0pBPz5HS0ZGRDs+QDdENz9CSkpFRlZUUF6Oo6yisbPBtLbAy8i1u8S9srO/trfBtL+wt3Sxs6a6xKSwxrmwsrG0qKS1tqqxoKKXm6KSpbCupq2rp6SYoKy0u6Kosrq1vL/Mv8XFvb2zwbe6t762ure5rKuwpbCprb2wvLrBwauYuaeUrY6Xl6mIfoN+bFhkYllsZmtmWFxjWVZTSUdGTFFHQ0hJQUhEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUVZTWVVadmpvfo6DgI6EbnpzeIdiuaGZo4mUlJaSlJONj5aRh4Z7hoGNlYqAhIGKenyKh4Z9ioKBi4OVfXd6dWVQXGRHRUs7UWNhW15TRj87SFBFWmNRUllYWmdZVGBfTFNQRUE/SUpIRUVBQEQ8RTZCPkhHSkxTWVRdk663tLm3yL64vMnMurvAu7e1u7q2vbO5scVgdbGksZqeqr2ppairqqSisrWgq6iflZafmaCupaempZ+jk6OnsbSosrO9tsG+08nJ08bDxczCysPAvr2+u7y3tK+4t7bDucW9wsevnripoauNpKe1iIGBc2FjY19ZY2BqZ1NYYFZSVUlFRU5LQD5HRD1LQT1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWPc2xycnOH1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaKfoN/gnh7ioOHe4t5gYqCl350fXprZnB1WV1cUGVkYmBlZF1bWFdcTWRtVVJtbV9uX1hnZFRZVUpEQktLSUZISEhIQkk6RD9IS1NUVVxaW5O4v7i9tsW/urjJyrq2ubW3ubK3tLOutbaYZHWnnK1wXqKsnJigopuknqqllJ+fkJOOlpmYqJ+moJ6amYOknqylqrCtuLC9udTRz9fQyszSzM/Oysa/vsLKvcG8wcDExMXKvsfNsqO6sLSumqu4upiAe21fYV1aX2JaZGNRW2BTUEtDQUVGRTxART5BSEJAQz06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVtZaF9vlpKQlG5sb3R1h7OroKGfi5mcmYyMlZGakYWKin6IhoyQi4h8gYNze4qChXuJdIKKhpV/c3t5bG11e2hyZWlsaWdqamlgZmlpbFptc5atpLyIhmdbb2ddWVpUSEtOUEpLUEtTUUlMQUpGSk9fXmFmaWGXtsawuLK6vLSwxMa1r7iwsLursrGmqrerjLWnnZqnmk6ZnYyOn5aRppillYqTk4mQiY+RkZ2boZealZaHnpqnm6yvqLCotLTU1NTW08zQ09XN0s/MxcLJ0L7JycrJ0cfMzcLP0bevw7zDuaS1ucGig3BlXl9fWmFYWmdaUV1YT1BCQkhFQkg7QUM+QUc/P0E3O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZUmVWc5CQmIJncW95eYOgqZ6ml4yam5eLjZWRmo59iYuEjYqKipCHfISCcH+HgYZ7h3KDkouOfXF4dWxxeH5xem54c21pgXBtY2ltcHhpd3x+y7/B36dtY3huY1tiYEpQUlVOWV5PXVxOUE5UUFRUXG5tdoJxlq23q7Omr7WprLu/sKq0pqS4pquuoKu0o46wrZqXmIyRk5GEjpuBjaaRnImDi4SKiYSLhJSVmJeUm5Gcl5man5+rrKWooqytz9LV0s7M09TUz9TRzsfD1NHHzdLT09fM0dHE0tbFwc7Hx8KovbfOnnxwZ19kX1dhU19bUFFUUU9IPkBGQUJFPEBBPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxVUU1OWnWGhYp3bHdwfX5/oZ6eoYyMmJOTi4ySj5WFeYWPkI2KioiQhn6Ce3J+gIGHeoR1hZOQiH9vdnJrc317d3tzgXhya4BzcmlvcXp5cXq+y5p+i7GEdnKEdmhha11DWlpbVmVjWGRqU1hcXWBjXWN3en2LgZippKShn6CnpaqvuKqls6KhraGjraGnsZ+IppqTkpGJko+IgZOJapSijJmEgYZ+kYODk5eti5WNlZmOhpKRnpeosKKhoaWkqcnNz8jCzNHU0tTSztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMPCy411cGViYVlVWlRcUUtHSkpKQDs6O0RBRDxCQz5HQj5CQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7T0xGSlhwgHV9aHN4coKJgJyUnZSFi5WJjomIjYaOf3iDk5iKjIeIi4h+gndze32Ch3d/eoaRlX+DbndwbXV/dXh9dIV8eWyHdnRufXaEdHh7nbWMO0CLxaV+jHxpZVdJQ2ZjZWNnamNtd1teZmhrbmhugIKHkYucnaCdkJeYnqOjpbGjpLKfoaWdoKigo7GchZ6SkZGPi46LhoOPhH+cm4yNgoSFeZR/gqmVo4yRiZeSi36Yi5qSq7OYm5yonKe+w8a5tsbO0tHS0MzSy8jUztDV2tfX2NTZ2M3Y287J2drR1b7Ky7V6eXBmX1tTV1JcV0ZHSklFRT06NzpAQEI6RkQ/RENBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjXyXkJ2LfoeSg4mGhImBh3x4hZaWiI6Dh4WGeoR4cXp7g4Z1eYWOjZx5i3B8b296f3F7gHGDh4Bujnp1d318gnR+fIaHr3NYqsK2jZGCcG1iPV5ocnBxcG54doFlaG9ydXhxeouGjZORmpWflYeMk5qgmp6pn6Gsm6GamJ+lnp+rmYuai5CRjYV9iIeDhYuOoJmTiIOHfmyZeoSYhoiTjI2UjIZ8nImUj66qlJaYn5mnr7a9qa2+x8zJyczL0MnD0srU19nX2NfV29fT2dvV0Nra0dbI1MuWe31qal1cUVRUYElDRklIPkE+PTc6PT87PUc9P0FBQURBPj46ODdEQjc1NTQ3OS41NTY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OTlEPkNHUmpebWRiZmt2gIhxkZCagHqAjX6CgoGDfoN7fISYjYeLfoWGgHaCeW57e4aBdHmSno6gdo51gnN1gX1zgIRvgZCCb5KEdXyBhXp2hnuJt8Wkwcm4gZabj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWk5SOl5GDiY+WmpaWpZyXn5aekpGXop2Zq5WQkIqMkYKMhYiIgYaQkZ6bmYiGjIGFl3qIiZ+XkIiNiouCfaGJkYu8oZiTmJmdqaamrp+otr/AwbnHys7Oxc3J0dbV1dnV19vU19na29fb2tnYztvGiH17aWtnYVVZVldOTEVOQzs9PTw4Ojs9OT1ANj0/QDw/PTw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWGVhXVtodHp5bIqNknd2eop7foB+f3yEen2CkYmEhXqEh3p1fXRtfH2GfnR/kp6RnoORe4Z+eI9+eIqKboKagHSZhn6BiYR7fpB6j6mOj8OhvYucpJx9iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Li5CShYiKkJOUjpyZkpSQlo2MlZ+clKCUkY2Nj4t+kI6Oi4SJkpaanp+JjJSSnZGCi4ClmYiEjYKFhIGkh4uLuJidkZWWoqihnp6dpK+3urWswMbK0MjHzM/T09LY09XXwNfY2dvY2trZ2dfbuXt7em5raFliXVRQT0lETEI8PD45OTo6OTk7PTY/Pj48PTk6OzszN0Q/NzM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg2ODk/PUNRU1JYXlVYZm1tbWmBjopxcnmKe3p/fH97h3p8e4uGgn10g4V5cnpzbYB+hH53hZuim52Ukn+MiH+Yh4Cbkm6HqIV6oIt8kY2DiIScfZqQioyjoqCQpK+fi5CLhYuBk4ZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlYyHiIySkouUlJOOi4+Kh5aanI+UlpCKkZOGgIuIko2KipyWmKKihpOdlqCKiYiNm5CDiI6Ag4eFpIaMkLOYnZKUl6GhnpmSnJ6osritpr3Cx83Ixs/N0MzP19HR1a7W1dja2Nra19XZ2aByf3dqaF9eWVVZWUNBSUM/Pj46NDk6Ozc6OzozOzs/PT43Ozk6MDpHPTozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNiem1hfpKDb213i3h5f3qBfIV7e3aFhH9zcIWBenV2dnSEgoR+f5KmpJ+lopeKnZCUl4uKqJdyirGNhKeShJmThZmMopWfmJOImp6jkqmwn5CUkI2OiJaMbo23hZrEyLKboaWbnJiWkLKRZKTNx5WPhoeIkJKNjZKTiYWKiYWWmZqPj5SThpSXg3+Pi5mIjZCqlpejo4iZnpaaiI6GlpeJhI6MgX+Hj6SJjpSompeTl5mhmZ+Zk52bo7O0pqO8wb7HxcXJyMnCy9PNzdSp0tHW1tbY2tTS2s6EdYJrZmBgX1BLVlxCQkdDO0E9ODM3Ozw6OD02NDk6PDo4Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0SlE8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCZYNHdYKOfHxtfoh4en56gYGCfnZ2gIJ7bG+Kfnl8d3h8hIaKfoujtKikqrOhlqegpaSWla+ig5C4lZKzmo2hoIykm6+ipJ2YkKeXqZmtsKSXlJWUkIuYmpagwI6jybirmqKlrZmRm5yynYaFqKKcmIWIiI6UjIqTj4eAhoeIk5iUjIqTk4aUmIaEkZCcdJGYspWWpKGInJmTj4qQipaaiYqWjYZ9jJifipCQnJqZk5mYoJShnZWfm6GxraOkt76zxcfEvcPDv8bOysnSp87M09HQ1tjSz9i8dXx4X2JXYlhSSUtPRUJDRDU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdNXFxZSmhhO0iEi3p6bYWGeXyEeICFgX1weHx9fG9zjHl9gXt4houJhoSSqLytqbK9sKWus7Opo6KwrIqatZ2iuKWVraSXqa23pqSjn5mpmKqkr7GpmZiblJWRmKCXmbu7rcqhaba3qrCVmJ6jq5KXvaReqrOCiYqMlIeQfI6OfYOGjpCUlIiHkpaLj5WNi4yXmZOcmbSWlauei5yUko2QkouYmoqSnY+LiZWgoo2VjZeZnZOcmJ6UoaCUnJ2lrqiipLO4q8LIxLa6vbzFyMjC0KHGyc3NxNfW0MrTo3N9a19bVWFTUUdEPjxDQUI4Pzg3ND5GPDw2PDM1MzU1NDU0QjM5OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGZIYWBicEpAi4p+gHKGh3yBiXWCioN+bX18fH5wd4d3jYGHe42QjIaMmqvDwLC9xryztMG8tKyrs7aMqLKtrb2rm7ujqK25uKumpqKipKOqr7Kxqp2co5ibmJieoqWlk6O5r6jAu6ytsrmlo6d9iIacrb2wgouLipCDj4ORjnqBh5CNjpyIiI+XjYqUl5SQmpedp5qwmpGrnY6aj5KOlZGPlZeOkaCQiJSbpKyUlo+UnJ6UoZ6bmJ+glZqep6ekoqSws6bAxsOwsLu2xcXDv82nx8PHw7zV0MzEyop2dmRfXGJdT0xDTEBFRz5BP0I8OjQ+QT09NT02PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxoRl9pZ1tdXJOMjIh7h4uGg4x1hpCKgW5+e4F+cX6BepR6kpSUmJGTlai0x8nAwszCw7nHvLqvq7m7l7K2urLAr6XAo6uwvLyqrqujop6nrK+1samboKqcopyWn7Czp4yiurq1wburqJyypKOolISOqcTEpIKLjoaIhIaVlIx6g4yRj5GhjIyUkY+Il6CYk5mVl6WgrpyMqpyOlo+SkZWVjZCUkY+hk4aXn6Cyn5SblKChmaSgmqCboJSYnqekpqekr62lv8PCrqi3tcnDvrbOssS+w7uz0cnIwbV3e29eW15sVE5JRE1LS0lAQT1CRDw1QUQ7OjM9OEIzMzIyNjNBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJnXE1lXGZUY2qZjZaJi4iSj4aJeYaTkIFygHuMf3eGgYKPeY2hlqiampi7vsnIysLSycrCzb3Bs628v6e6v728xLitwamss7y9qrCqpKWjrK60rra1oJ+un6aimaO0vKmbqbzBo7a2r6uTr6uqrJaGmqqnpZGCjJKklYmAdYmReYWNkZCen5KPlIuPjJSjmZeblZSinqmfkaWajI+PkJWWiHyOlZKSo5qVoKKctaaQoJelpKOln56mmJ6Vl5ylo6ioorKsqLvAxK+ls7fMwLquw7O7vcG5rcLCwr+ZcHtjW1leXU1NTktHRENIQkFBQ0s6NERIOjs0PDdGLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+bElfWGFaZGVXnpCdjpeOnpKJin+In5KEeIV/lH5/kIiJkICWoZqup6OYw77JxMjG083Ozcu8wrewur20vcu7w8G2t7yttMC5vK6vqKGpqLaurqmyt5qerKKoop2rt7eppa++xLG9uLOnqrSzra6WlaWtqKCRjpKxxaeVjX2RlX2HkZiPqpmXk5OOk5WTpZ2TnZmUoKKhnJifmIuMj5CeiFqPlpeSlqSZZpmjnrOllqKWrK2sp5yfp5eYlpiWoaOopp+1q6m6u8O0prS1y8G4qrass7u4rqi4ury3hG9wXFpWV1BHTFROSz9BSERESEZGODVGTTs+Nz5BSy4zMjAyNUI1NVBXTjxMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVjw+QEJGQnNGaUlSZmNNRqaUnJahl6iWjJCDh6WSiIGHgpuDg5WQkJSOmqKfr76uoce+xsXIx87Oz9LKvru2sbu7vL/PtcS9t7m3s7K2s7izrKecq6u5q6mor6+Xo66lqKSltcGwq6y0vsO5wLizp7i0t7KvlaStsK+ki5OUoI1zwZl9l5mEjpaZi7GVmpmVkpKZmaWjlZ+blpqonJuhoJmKjI+WnWBKlpyalZmll1SWsJ+vnJ+lla+vraaboaaUk5mZjp2fpqGZtKmqs7y8u6uwssfAuKasq62xsaOhsrK0pXNxZ15cUFNNRlFRUFE7SEtIRkdBQz05S1Q/QTo9RU0vNzU0NDpCMzROV048SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzVFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFg8OkJDQD1SRVdTc2JWRkirl5mfoaiumJCXh4qnlo2IkoWfh4Scl46doJqjpLXJtKnHvMPEycvJyMzOx766s6+6uMDBzbXIusG5tbqyr6+ztKeknKq0tauqp62smaSupqWprLrAqKu3tr7BwL63srLDsLe8rKOuta26pYibl6Wadb6fhJidjpKYmouulqGcm5eUmp+gqZ6noJmaqpmhp56XkI2RnYNtdZOimpSco5+QrbKiq5Wpqpiqr6aloaWqk5KZnImVnKKelrCnqaq6t76zsq6+ubago6eopaacnKypqY1maGNgU01NR0lPSlVMPU1FTUlKQENEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQzo5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXPDo9Li5TYU1WSH5lXkhGrJScoZ+7rpiUnouTqpuRkZOIqoyGoZ6Mo6yUo6S2x720wrvDwsjJxcLOyMK9ubKvubXAw8q2xrHBvLW7rKmtrLCjo5mqtLumqqesqp2or6ikq6q+vKitvLS3vsa8trW4wLC9v7Optbesv6WPopeQoZ+8nomaoJmXnZ2Ptp+pnKWjmpugmqels6GbnaWcqKqdmJSPlJuLlomMpKGUnKKfoLWwpaaTsauaq62fn6WkqpKWlaCEkJ6fnJappKGhtLW6tq2otbKynpyippqXlZmqoZ54Y19hX0xJRkhOUUlORUZHQlFKSEBER0FWU0RIPEFHUTE7Qjc6QkY3OV1ZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRaiXpJ6fw6ybl6SXmaiblZqajqqWlaimla2smaKrt8XCvL+3wcLAyMS/zca7vrmysLm0vsPItb+wvLa6t6ekq6utoaGbq6rEoqWorKaeq6+soqqovrimrb6wt7fGt7S4uL6xvsC2tLK1r76jlqOVk5qTrZ+QoaGkoqOekL6kqJ2prJycoJumn72imKOeoqmroJ2VjZWek56HjoSNk56koJ22rKaclrKmmbCooJyrn6GNmpWfhI6hmpySpaSamKuxtbGqpaqtrJuYoKGSjpCWqZ+UaWVcYl5QSkhLT0xIRURJQD1PSEA7RklIW1JPSz1ITlU0QkY4PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLS0wTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGZjWE6jm6ObnsWroJ6rnZytn5Ginpakn6aqq5e2saOps7bFwr3AtsDCvMnCv8rItri1tLG0tLfCxre+sbi0uragp6yqq56en6WkwaWhqq2gpKmtsKKmqL21pbG7t7a1w7Kyt7q+ssPAuLittLS1o52klJGToKyfmKGdqKiqoprCrKidrK2amp2YpqC9oZ2kmKurq6agmY2an5KeiI5Yf5afpqGguaqmlJi2o56zoqGcsZigj5qVnoKPoJeWjqKjlZClrrOrqaKipaSVlZyZi4+Sk6SfiWNnXGVhTUpLS09GRUFHSz49SUE5OUpKTl1RUUk9TFZcOEZJPURNSThIY1xLQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2FTNlNaa1dzSEU2PXVlXExQn5+gmJ7Dp6Sis6CcsqeSqaOfo56tqaydu7GprLWxyMPBw7PCw77HxL3Eyr2wsbausbWwwMW1urGwuratmqmwqambnqahp8KtnK2xnKqirrGppKe9t6a2u72vt8Ots7PCv7LGs7q3q7S2raqippWVlKKroZ+fmaerr6+vu7Kln6mpmZiXkqKkuKCho5Kur6ukpZ6RoZ6UnY6QjZSdmqOfqLWnp42YtJyjr5ugnLCRoZSYlZuAkqKWj46goJOLpqywpaeinaCekpKalIWLko2cn4BkaF1oZktKTEtTQUNASEc7O0Y+ODlOTVVfUlNKPk9eXT1IUEJNTEk4TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHddXj9bVV9nckA4PEiWd2VBNJ+knpugwqejqbGgo7SplbGrpqKksqytqbuyrbC1tMa/xMS2v8S+ysW2wMnCtay1qbC5rMDEtLevrba6pZmrsqyqmKGnmK27tJyosJutn660saequrOnubO4srjAqreyw720xae+rq23tamnq6CWlpGlpKGhl5ekrretsbS2n5+ppJmTlJOjoLejpKWVrrGypamloZ6bmZqVl6ifnpmin6+zoqaNmK+apauXm5+nk52PlZmahpaglYyQnZ6Ui6mpqqKnoZmeloyPmZCBhpWIlZ96ZWpdbGtOUU5OVD1DQU5DOzpJPzc3UU5dX1JWUUFXYFxCSlNIVktIOlRkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM5MDZwW2JIMDVKcWlWQ1dGjHlmQzukpJygpb+mqK6uoKm1qp23r6ujqrS2sbC4t7C3uLfEvcPHvbzDwsfBusHGwbqqtqWtu63Bw7e3qq2yvKOVrbGtspemqJGquaqhp7Cdq6CvtLOqqre1rLuss7K5t6y4sMG6vb+mw6qwtq6pq6umnZiYqqGhoJGXoLCvs6uwuZmbqZ+ZlpKXpqC3qaWioq+xs6uxp6ugnKCfm56lnaGYnaO0sJufkZSmmqGpm5ajoZiai5aZlJaXnZSJkpuZlI6pqaego5yYm5OHj5mLfoyXho+bbGltYm5uWFFRWlRBQ0RUQDs7SEA3OlhQZF5QV1dEWV5eTkxTTl9MSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNzQ3Z1lhRihAOGx9aFxWOol7Y0M9qJ+coai8oKmvqqKxt6iktLGqoa21va+zuLy7vbe2wMK/ycS5xMPAwLnFvcG4r7aoq7eyvL+/tKqusrifl6ytqK6YqKmOp7ufpa2znquisbCzrKq2s7W8rbCxtaywtLLAusW2q7yvsbesramjsaWepKieo5aPmJ+yqrOpqrOZnaebmpSNoKaktK6noaysrbGnsquxqaObnqiknpSgmZyotqmXmpOSn5meoZ+SraCamoeXmYydmp2Ui4+Xl5qXp6ajoJ6WlpaUgZCVhXuPk4OMl2dtcmhxc2BHWWZWRENNWERaOUhCNT5dUWhcTlpdR1teXU9NU1hkSktDXGNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FWMTUxPWBWXzgpQzNZVVxnSzWMemZMQKSaoKSrtqOrqKSurbWprrO4pqewt8a2sLe/wcK2tLrFvszFucPBusC6xLjBurO1rKq6uLu6vrWrr7G2mZioq6usnK6rj6u+nquvsaOqn7Gts66utrG4tqqtrrGntbCzurzJsqq1tLC0sK6moLOgmqisoKSVlZqZsaKtoKWvlqKkmpmSjKKlp7KpoaaxrKq1pK6wtK+jmZ2tp5uXnpqZrLiil5ORj5icoZmYla6hn5aClZmOnpyal5GLlJOemaWjo6GZl5OSlnuMkYV7jYuDjJNsbnlvdn1iRmBqWklIWls9e0pHRTZBYlVpW01cYUpcXFpSU1NiYUxLRWBhYFBNSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuK0EvSkdQW0czY1hUS0WalqCwp7GprKSjrq20qLezt6OstLfJurS7u8C+tLO3w8DMx7vEvbe/wMC4wL2yva6ourm4t8K3rK6xuZWXp6+sqKSzqZSvu6SssrKmp6OytLCysbSwt7KprquyprivtbPExbaptbWrsK2pp6K2np+msKCjlJuZlLCep5ufqY2pop2blZelpaS3p6Kws6unsaetr7WspJmgrKicnJ2clKq5nJWPj4yYnaOYkZiopKCYhZOXkZ2cmJeWiJePl5uonaWhkpaSkJZ3hJGGfIaChI2NbnF4dnyAXExlbFxKT2RdP2J7R0k4R2dXZltMXmJMWVlXVVhVaV1PUEhhXl9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGcyNydGYUxWJS1CLj1FTFE8M3JrTEREkZmkraOsraqmo7Cysqq3sLWfq7W5ybiuwbzDt7OxtcLDz8TAwr61vsHAu7+8tMSoqrmxtrfAvK+stLSeoaexrqWmsaWesrWsqrKxq6iotLqstLK0q7OsqquorKm5rbKwx7+4pLmwqa2tpqetsKWko66jqJudm5qvmaKioqOQrJ+joJ+hqaaluKSrtLSkqquorK62rqKdo6irnKCZm5KktZqPiY6IkaOhlo+Wn6KWlYaQlZSem5mWlYeYkpWZp5ygoI2Tko6ReH6OhH19fYeKinJ0c39+flxTY25eTlpnXUZElltHOk5tWGJaTWFiTlZWVldVWWheUVNNY1pbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0RkOzYqSGRISis6ST8zQ0lTLD6Paz9ISZCbqamhqa+kp6Ozs7C0tLCwoKutvcy6rsG8x7G0rbPBw9HExr/Bsr7Dwry/uL3FqK23rLS4vMCxrLKtoaOnrqqopbGjqrCqrquxrq6sq7O6prewsqmyqaqmpaOtuqyqsMK5tKy5qKioramnsaWppKKuqqihnpujrJWlnZiemaudoaeooaymo62strCxoKmin6qtsKudnqenqZqjmJmQoKiYhoOPi4ufoJCMjpeekpGIiJKWoZ2WmZaGl5OUl6Wcnp2MkpCOin9/iIR9d4CHhYd1dHKJd2xfWWBuY1FzcVxLO4R7Rj9XdVhgWU9jXE1VVlVXUVxiX1NPT2hZV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkswLklnREY4PEIwNUVLWDFAlF1ATkaVlqynoKmxm6iosLWsuLWtqaSrqr3JvLG+uMOvsKyzw8TOzsO/wLTAxMS6wbXJxKyvt66zusC+tK6urKaoqbGppqmyprStqq+trbGusq2zuqS4s6ysraeroKOesLerqq25tqS1taOpp6ysqq2gqKansbGkpqWhoauWqqGTm6ClnqOjqqOsop6msbasrKKlo5qpq62pnaGlpKSZoJmWj5idk4GCkImFnaCNi5CNm5CSjYWOmaWbk5GbjJOSkpSjmpyai4+LjHyHgYKCe3WBhIF+dXeLo4d4al5gbmZXZodkTkBnkkxEYnpXYlhSZVVNVlZVVE9cXWFWTE9qV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIZCSUlElpGvpKKpr5ipqK21qrWwqqSrqqm8wMC5ubS8taayr8PJy9G/wbu5wMDCusG6wsSusbWytLzBvrOxrq2srKe3qqWtsKu4rqiwr66xq7WqtrWmtLesrKSpqpyknrOzqKiks7Sfta2hqairqKunn6urqLm2qaqqqaGpn62bkaqhnaCjo6aiqp6cprSup6WpoqSXpKanqpyipKOgmZifkY6PmY1+h4yHhZ6eiYWMi5CPko6FiJajmo6Nm5GSkI+Sn5iZl42LhIB0h4F/fnh1g4B6eH5/iJ2PcHFmZ3F4XGF0iGpPXZhWSG15VWRWUmJPTFVVVVFPWFtiVklRalRWVEdQWVVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyP2Y9Tlg/Qyw/TFRfL0lrN1JGO5WNr6ClqayZqqOsrrK0r6qkr6mou7+8wrKvua2itq/Ix8jRwL+9urzDvbvDwb+/r7Gzsra9vMGysrSrtKmltqmlrbOyuK+irbWxr7G5qriuqq63q6qeqqugo6G1ramhn66yobSqnqinq6OqoaGsrai9rquuraGnp5+rmY+wopiioKinnqebmKmwqaKfrKGhkqGio6eYmqilmJiYnI+Lh5WIfI2GhIWkloaDg4yHkJCShYeVoZaJkZ6Rk5CNkZyVmI+LhoZ4dIF/fXR4eYB7dHR7aoKIpHZpXmVsgXVniIt8UlZwXkp4c1RkU1FfTU1TWmZOTVdZZVlHU2pSUT5CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWg6MzhfPWFkP0YxQ1BbWytIUDtZQzOPjrCgpKWqoqWjrKa0s7GopLCnqri+wb2wqLmqp62wycbI0MK9v725v7+9ybzCuLGwtbG6vLnAs7S8rbmso7Wmp6yxtriypqe5ta20vK+7pa2ttautnKmvpJ+krKqonJ2qsqSzqJqqp6qkqZ2iqaepvauzsK6dqaOgrpuas6KWpZulpJ+lmpmoqqWemqmgm5GaoKSdmZepqZGZmpKQi4KPhX2Pg4CIno+HgH6MiJKQkYWClJuUhpOijZSRi5Gbk5aHin+Acnp5fnxodnx7dXByfmqGeoWIZF9oY3KFe21neV1eVkJXe21UYVBSWUtMTnB0XUlaW2hZRlZnT0M+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpKwmZ+fqaSioauktrKxpKmwpq25wr23sKS5rKmosMLIyczBt72/tbjBusi1w7W0s7Wyvbm6vbauuba/raKzpqqrrrS3tKmcubuosb6yuqCutLapq56tsaOcpaipo52bpLCmr6Gfqqmnoqqco6igrbynrrGuoaqio66enqymmJ+aoaKbn5uZo6qimpqjo5WWk5+hlpyWpqyLn5GPkYyCi4CAj4F7mpSMiX1/jIeRkI2KhpOYkYeUo4qSkYeQmZCUgYh9emx9dnl4Ynp6cnBwc3hqgnVrgmdjZ2Fuc45tYmpvX3BBXXlrVl5OUVFLSU1TWVZNXF5sV0VYYU9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUl0+I5GWq5ifl6eioZ+no7evraKvr6iruMK6s62gua+rp7O6x8rHv7fCva+0vrfEtsKysLmxssC2u723qrm4vqqktaeoqq+tuLComLi8o62+tLShrbe1pqaosLOgnqWlp6GkmZ6sp6ieoKqvp6Cml6Kon7C4n6Oxr6GroayknKamqJqbm5+ilZybmp2pppabnqiRmJKYnZOZlqGqkJqJjZCHfYd/go58fKGMjIl6hI2Fi46NhYmTmo6JlZ+JkJWCjJeNkXyFfHRwfHFzdGB4eGlvcHFwa39zZHpsaGVkYWaHgGBbcmpyTU6AaVhaTVFMS0hQUlBHTVtfb1RFWVpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MF1bNSiVm6WYnJWsn56hpKG3q7CjtLOpqbrEt7KuobitrauvtcXHwLe/wbmwtL23v7u+sKy+sLO/sbzCuKm7urinqLWop6uvq7KvpJi7tqSrurWvnrG4r6mlp6+ynKGkoKSjoJabr6ahn6Kor6GgopOjpKK2sKGmsaufrKOul5yqpaifmJqdo5Oam5qdpaqam5ullJSXlZyOk5eiqKGQiYqPhnqDfoSLeY+Xio2HeoKIhImNj4WPk5iMjpaZi4+WfoaXjI96gXtwcnZub3NfeHdkbGxsamqFb2ZyaWtmaF5kc4FgW2t2aVpKf15cWE9PS0hIUlVHMzldXmxQRVlVWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFVdaEQuPDJkVywylKGhl5SbqpyjoaKht6qtoLu3pay9xbSxr6O1r6ysrrTDw7yzv7q3sbO5uLq3uq+uwLO0ua+/wLesvbq1pqKyqaepsaqtsaCZv7Wkp7S1qJ6yvKmopamwrJmip5ykpZSXoLKkmZ6jqKmcop+SpKCkuKmkp66mnqWhqJKfqaKhoZmbnZ+RmZuWn6Gqm5qYoZSRlJaZjZSTpKikkImJjoZ5hHuEhn2djYmKh3qBhIeIipKFlpOTi5CWlI6NlHuDmI+Ld358bHRybGxzYXd0aGhqZ2dwh2hoaWNmaWlgamNqaFtme2NgU3RUXFtSTEpGSU9TQCEqaF5pTERXVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z1AnMp6io5CNpKaanZ6do7Stp6q6tqesxMG3sayjtq6nra62wL+8ssK2sK6ytrW4tratqr2zrrKxvL+3rry7saWftqqlpbOnqa2dnMCrp6SvsqmstbueqKqrsaWYnqqdpqSRmKWsopiepKmhnKKblp+dp7WmsKquoaGdnqGUoKafoaCam5mbkpidk6WdrKGXlp2Tk42Vl4uPmJuon5GIiYuIeIV2gYKBnYeKgop9f4WIh4aRhJaUkI6PkZGRjJN7g5WPhnN+fmZ5b2tqa2Z0c2tjZ2RkdoFiZWZmZmpqY2tyW19ZXm1kYU5pWFpgVkpHSEtNUlg+OV9saEhDVVRdW0lJR0ZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQmhIJTWao6CPjK2hl5eglqSzsaKyvbahsca8urGxo7esqq2puLy7uq3Asq6urrausrizqau5sa+us7a6trC4vaymnbWpn5+vo6munKG/oLCjrrCut661nq2vra6imZ2nqaWflZqnpZ+ZpKKonZqfmpScnqyvprqorqKhmpuemZ6kmqSdl56Xm5OYn5KolaqnmpOampKMlZmNlJSaqaaOjYqJjnuBc4GBipiFh3yJiYWFioyJkoSUm5OSj5CRl46Qf4CNjoNvgX9meW1oa2lmcXJrXGhjY3SBYmZnam5sZ2tqaG5dbGxzcGBUY2ljZllJRkxNT1hRUVVhZYBVQVdTWVRGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyY0kaGbjY+wnZmToZqpsa+fub+1oLTCu726saa3r6etpLe3tretu66sqqu2qbO3rqaytbKuqbC2trCztrqnqJ+1qJydqKCorJqnvZiso66vtbWtrZ+xrbCpopuco6uonJScpqSdmqmipJaan5uQm6Oqq6q8n6ekoJiamZ2hj2uilpmccIKVmqN/dZGpp56UlJ6QiJeZgJaKoZB5h5SMg21pfnaDcWyGi4Z9hYyHcF5jYWeEmIVri46UknR3i4R+g5CAZ4eAZ3VoZVdcaHNtTlBqY2dzhWhfZWZubWpeX2GKj4OEZU5LRDlHVGheSkdRUFRVTEhSYG90ZUZbUVVQRkhFQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUFAQD0yOEBFPTEsKzA4PUc3MDEuKi4qLzU2OCwjMScyMTQ6MTc1WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoqjmYWVsJubk6Cbqq2qo73Fr6m3wre9va2mt7ClqqK2s7GysbmsqaastKWvtKKpt7a2qKestrKutK2zoames6qeoKObpaaXq7mUpaWvs7etrqWprquspaGenKGnppuXoKWlmpunpp2Tnp+XkJ2oqaS2sKSjop2WmJeXo4ihjpKahqCHk5ygf6V/paqekpKakYiEcniNjoWIoXaIjGmXiGZ9c3igb4iHg36OfH+hoKCZgHyHnnSHjnWbimyHgYNtaWVjemxyYVOFbWJsaZhxWGlxcIhYXmlbbGxbiHJuenKFZ4aEWl9HTj9HX01FUlZWUVFTV1RnXU1WSFJST0ZHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3LyiKppaCnKucmJidn6mpp6q/w66xury2wL+qpbevqayksrSurrO2qqilsK2ltLKbrbW2taanqLKwrLKnrZ2pn7Gnn6KimaChmqyzlKOkpbW8pq2nq6qsqKahoJigpqOZmaWjpJicpKmWk6Kck5Kjpaaht6SkoKOYlZOXkpyIr5CXlImpi5ahnIWxgKOsnZOZnZR5gtSogIeVwZvHeXixpbeXZIDAnL95hIR5kYR8kJCRynKXvJzFenK1pruQe4BtlrGrsHlobFixrm5lab2SvG5nem9yj9h+U2tjtrJ/gXKUc5qhqpBXT1diT1ZORlVbWFFQUoxcV1tQQVxEUU5FR0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT46Qjw/QTg6Sj41MioyMkJFLy4zMi4rLygtLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjKaSgKeqn5ecnqWssqiwwr2xtb+1tr7Bq6ezrKyppq6zqa62s6enprSlp7etnLOytqulpKexraywpqqdpqOwoqGfnZaanpytq5Odop+0uqOqqaKtrqWhnZqaoqefl5unoJ+YnqenkZymmpOdoaaiobGjn5+jlpaSl5KZha9raoqNqn5mg5WGrWRwnZ2UmaaUca6hpH54u31roY92sV9qtFulgGWckWBmgntmf2p4a6llvnJnpox1sWp8sXh0kpRjbm2nbluEoEVoZoeWRXWcYH5nfKSnglpfjKtogJV4eWqnN0qvXFhTbGRbS05YX1xXVjtOiU9XVy9JVFNKQ0ZGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMwG5CilYKtp6Weo6SqsbestL2/r7bEsre6waapsKquqKivrqKwuq+jpK2yo6i4p56zs7CjpaCprK+rr6annqOhr5uimpaVlpmaq6WVmqGetLOiq5yjra2gnpmWoKKonJido5+bmaGmpI+copmWoJ+qnqamoJqfoZaVkZaQmoW1m7V4hamZtZl2hrObt36TlpaplH5rgaZ7goaIkpSSd6tna7Fcq3qNhpR0iXKPhoB/iJCXeIKCi5iLg6CPhLB2d59xbGxsfItOpFhIYmKZfmNopmB5cnVTk4deUKltY3F+h4BinC5RoW9bU2toYExLW2RYXFpCPrF5V1hBI01oRkNFQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjg0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o4YVQ1MBuVoJWIs6amoa+pp7Osqbu2wrC7wa24t7+prK2traatsamgrruqoKe0rKOrtKSmsrOno6Kep6qxp7CnpJ6fn66VnpmUlZWXnaugmZmkqLSvoqmPqaiqm52Vl6ClqJqenKKem5+jpaOVm56XmZyiqZummZyboqCXk5GTk5yD1ZOZuXCwwX7FhnzWlJu7fJqVpY+NnY2ke46Ho4KlgnqseY+dVq96iH6farlauXaGg32mgpN8mHqqeI2dj3qxbo6EdJG8hW+UUK+nxYpRoHpjYKlic3KIbZeIYFO1tMiGgIl8Y6QzQp12XVBqaWNQQFhnWmRhSkhNbk5cUU9ZZllDRD9FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6O0RIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFQNzElm6KUmbKoqKa0qqW0qaS8t8Gwub+xtbS6srSnsa+isLKmn621p5qnua2ir7Cfs7SwoaSen6apsKi0qKObnZ2qlZiWlZaUlqConJmWp62wqaOej62iqJadl5ugpaGYoaGhoZqhoqebnqCelJiapqCbp5Wbm5+hmJCSlJCdiLJuaLVxq4dujqZytHNytnual6SLj52No3+RoaV+sHaDkdLSdlyue4V/pG+bqqZrhoR8rX2XmY57sHKSnY54s2WXdISeb55mlFHIi1rCXJ95Yl+tYHZzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNlWEFPa2BsaFBWR0k5PVVSWldYSUM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTDYyMKGdkqWwrKOrvK2mtKantru8srq+tra0ubiypbSzoLGxop6rr6SXprmtpLGwm7S4qqClnaGppLGnrKmjmZyZp52Vk5eXkZGhpp+VkqWqsKailpOtoKWSlKCbpKaflZqlpqGaop+smaCenpCVm6GdnKWVnZWaop+VmJWRm4Wse3eodqONiIapb62KgqeDmJihiZKai6J/k5qJroV/grNccrNSrn2CgqR/cdd9eIV+jp2Fmpp2r4aJkZyHd7RhmmWagoKVbZJasFhLmnWYeWZgrV52d4homIhsXa93lZ6PeGw1eciusl9CVG9eZ2BFUGxfcG1WVk0uZmRpU1lQO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTY8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEg6OTmgnpWgubCXtMKtqLOoqbK6t7O3vri3sbS6tKS3sp+zrJ+eqKuelKe1q6ivsaqttKSbqaCfp6G1pqapopidlKSgk5KbmJGUoaSakpCmra+moJWZqaCij5GhmaikoJWZpaidnKSerJyhnaCNk56anaGYmZuWl6KglJeQpp2GqX19pXihjo2CqnCti4GnhpafoYmXl4ijgpGIlKp8gIudeG+xWqiCgoigeXTYf3aHc6iBjpuNkqR8lpCfhHuyXp1koH6DlW2SXKtbWpOAkX9oZ6pkcnuBa5iHc16rWomgjmtvZU9KQ6FcW0x0XWJnTlthX3JzX0tWN0qblFhHRT1HRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDUuOz4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMj84op6amr+rmLTCrqutqaW0sLewtb64uLGwtbqourSfr6SdpKennZOpsKmvqbSrqq6hmKCfpqSjuaKjq6CWm5Chn5STnpmTl56fj4yLqLCvp52Xm6imn4ySpJeoqqeUl6mnnp6goq2koZ6ijJShmJ+gkp6XnJWeoZWWjqucj65tcrRzqYt1iqdztHhzs4CRpKOSnI6JpIeQd7hvjHuLomprtlqhhWWXl2mhoqdtk3K0dJOYf7JqhZKIrWp1s2GdZqJvh5Nrl1ytX02hfIeRUnOjbHl/fm+Yh3Jdr1Y8nHdmVG9uLlynT2NTa2VibVpjXWBwe2NUWlI+Pm1vM0NCQD9NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKacm567oZuywK6tq6ynt6m3r7W/tLqvrre2qsC1qKmgmqWjoZyRqqmntaKyp66poJebp5+kq7idoqyalZmOo6KVjJygm5icn5GTlKq2sKiZlJysqpeMlKWYpayikZaqsqOfnaarsZmho4+Yopafm5aclqGTnamclJCrmYfUkpq7c7DDgMOGftWWm7h4iJCYjJeLjKeIeqS2dX13dsKCmrJgg7p5wHx1uGO1goyHqXyVgaypcXt/dLyIp6BpnWGmjq+hfox0h6p9vm9zvHSyg3V4gYpumohybo2kdL1ed31aYXm8a1pWXGp5XmphZWdibXhvWlxZQ0FAc0BDRis1RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnm56ivaGXssOwraqrrLGnt6+2w7C4sK25rq3AsKujoZ2ioZubkKmjqrKktKWspZ6VmaqYpqy4nKKtl5Ofj6Sfkoycop2XnZqRlZKvubKslZejp6eUkJaknKSsnpCgqKufm5+oo7Ofo6WOp6KUopqcmJWjmJCvoJKUqZ6EkJi2f4+RjLeVeIKTmrV3bWtuc295kIWPinSfwbu9mnuBsahwgHORuYN8hoaMh418ioeMl3yku7m9nHV6tKN0d5d2dLB1mZ5mhmqNtXRycXe2jF5/en2JaIN5bnpji6xwdYV/WFunakVlWlRmYGNeY1FnZnBsdUNOUE1EOlpNP0ozOzAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVzgqT15dPSs6VlUnPjs8p56gor+llrTDtKyrqKyrqbqusMWts7KttaazuKupoqGlnqCdmZOro6yppbWnp5+blaCjnaukvaahqZaTm5ChmpGPoaehk5yXk5eUsbW3rZmepKSii5KSppulqpuVqaSlnJqhqKWnpKmhka2flqSel5eXnZ6Pr6iUm6ahjWp9aZumeIdyfZmOdHlkh3u9vsC6b5ODcpWHYHJqWl6biWBjiI6Va2CAlWNtnXdilWuAmpWUZV5gY3Caimhyi32GlWdrf3J1eH1+Ylt3dIFoUFxug317i2tYa3qCc0pKb4ZwTnRNRVhdZ2FMWlhnY19PW211aXFSUERFTTtHST1NPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBfTCgzPltPJz8yPqmgqKLCo5u1urajrKWup6e1sazIq6+yqrOivbCxpp+ip5yjm5mZq6auo6S0qKSbl5Sgm6atqL2nqKSUk5qVn5mSl6SoqJCdkZCYnLCyv6ybp56noomTkamaqKObmqugo5mbo6eso6Cro5qwm5WnoJaUnZ+dl7ClmKGnmZuQnJyio5iloZmbmZmZj5WBZ219cXeSl5SShYu1qo2GmJWOioyYloeUlYqEk5SRiY6SlJiTmJaaoKGanJSgnY6CeqWFbWt9kXyAdYqKgXGCeHl2doqAfIpqc4F0g3Vld313a296bWBjXXBoTVhaZmpgV1pveW1tZlRPRlM5T1pNUU8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSiw8LUCzoLOiwKGksrK2oKmlsqelsLSqyKqsr6S0pcCms6CdpKSco5WVn6qmrKKjtqufmJaVn5atqaXAnqujlJGbl52XkpOhnp6ip5KSmainssSwmqudqp+QlpaonaqbnJ+smKGbnKKkr6eipaifrpiXp52ZmaCenZyvoJyhppWXkpeTn6CVop2XoI6Wk4qKjY6XrpB8lpuDkoKLqqmFgJmXiYOPnoh6hJCHhpqSiIaKlo6bl42RmJ2klpqTkZ2Nf45nobOvhYqEdnuSin13eXpvZnmQgYCJa3WBeohzaXN/e3aDh4JrdWR5ZmBqZWNkZmtZbHtvaWtcU0xQRF5URUA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9iY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0W0c1PCxAtKC5r7+sq66ysaCqprKtoqyzr8Svqaqisa28orObn6aioZyYl6elqaWkpbK1nZSTnZmZr6WtvqCropCRnZmYlJCUoZyXqJyEnqqro7TItJ+qpKqWlpeapp2pmp6jq5Sen56gqa+qpqSroq6bn6CgmKSenJ+cr6OYnqeSl5ackaOYl6ecmpdlgpJ8ZX6NmpBjeY5taWt7kqSqamWbmH1nhoplZWloe46hj2tnjZiRo3draouZo5+Yc2xueoSOiHpYZl6Gg15ti4mBdlxoc3d2koCHgm53gniAc215hHR2iIiPg3xrh1lebHRkXnOJaWt8cWtkX1JOWElkWEFKND5HNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMllDOz8uPaWfury6r6y0saqlqK2usKatrbC8sKimo62usJ6slp+jnaGZmaaqnKyjpaeosq2elKOPoq+ltrmlrqKOjpmhmZOSmqCZmaSVe6Wtoqi0xLiloqevn52UnqKeo5uiqaiSn6GeoKmwq6ukq6CqnKefp6CslqGbpbCkl5uplaCdmpGjlp2pl519vYOIcrRyhJ2GrWh4ucS4cZOio3qmmZlyq4J8y8DAu3GMo4iCn32WmImdwL2Cl52ejZ3CwXyCfJONmsPAfWylsm+MgW/Ken+bd5GDjoF2eYCAeXF6f4dwd4WMk3lueJRjZ2B4ZGBlgmNedGdsZGNYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLiNGWzNQWS9WQUI7LziWo7nDtbCwwKmolKOvqLCuraays66ppKWmr6ufqpiaop+cmqqnopyroqSopKS0o5yikqatq7ezp66hkZGZnKWSkJ+hmJufnYimrKSsrcDAsaGpr6mXkZ+dopmho6qjk6GinZ6sr6qtp6Skp6GmpZ2sqJGjmqitqZqcqJuroJWWpJWgopacfs6UeHqkgXmVlptfro9ejqeBoqB8p5abc6uDgK9eY4yqe6iHhaB0l5OIs2OCq4ahjo2zaoSvdX2XiLdhg61ao81ukHZ72nt/mXB+h5J2fmV7iHZ2a3yHbn2GkZF+bYOQYXJtcGhgYHlkXHFoamRnYFJUU1ddS09DNUFIREQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSzAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGjqqets6umsqurqqOqpq+pn6abmaSXnKKvn6CeqKeipaCfsKyanZWnrqywqqirn5SRmp+kko+epZiep6OfraWrsKjAx7OoqbGulpKdm6KXn6mpn5Whn52dra+prKqcqKiloquSrLKWpaKqqp2ipaSgrp+RmKaZn5mTk5CXoHGFjJd1haiGcbF9nnKsfqGegaWPnnargn2tf5xyrX6rh4afdpmSe3yXfqqIooySjJ1+q3uJlJCfgHutV53Fe49wk8F9gZVtdW+MbWV2ZYZvYXducm6JipKPg26TkWZwdXVxYWdtZV9vaWluZ2RYU11hWVJTQzlJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DTxsaytKCdo46joqKsr7auqLGmqKqmraurpqGjnZmhlZ+lq5+hpZ+oqKKenbCsl5qWqKeuq6emp56XlJmjoZGUoK2bnaajr6ykrLWqus6yraaurJeVnJ2imZ6urJyXoJqen6myq6urm62rpaOrmq6xoairrqWYpKmoqK+hkZWio5mTkYSkaqR1iXqpdHqycIKmipmMcYigmoekYGBSrIV/roObdq2Bp4aFn3qZl4Z7ZoCjiaSZhoKjfal+gpaHrl98qVaeo5KBeqOfgHvDr8WLcq+zs7lxYqmvwnRojIyYjoJunJVxb3p4eXBtZ2VlcnBmfGljXVdgalhZVUxMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXUv6GZq6egr6KesLSwrqmsoqemqKqrqaSln5uknp2lp6ejnKuaoqyho5+voZyakqujta+uoKeanZWTpqKQmqKooJ+lnLGlpKixrbfIsrWqrKmWkZ2copmfpbOdmqGUnZ+nrK2ksJutqqOjqqGzraGqs7Ghmqinra60oZGUoqaXmpF8qWyehId1q3l8sG+CpYyJn5aWn5SB0ri0uMmBgbJfYJSpg6SJh6B6mJaaeKrJdJqklaipkZKajYGciprGxnlnoYKldIGfjoJ9r11wtGKwdUujhm2nR4KTZI+QnpF8cZmVgXF8dX58blxmanNxZoFrXmFZZG1cX1lJTUxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqLKtrKWinLK4rKqhpZqopKqrqqafpqWYqqOfrqudpaCsmp6ppZyntp6il5OoqrWyrJulnKCUj6WskZmcqKOgqqeuoaWnqbC1w7Kzqq2ok4qXnKWboaOvpZehlZmcpaatnLGer6mnn6yjt6yhsbivnZquprGysaOTlqaimZ6Ogp1OeJqBf596hKN9g6SFh6afnJ6ThLh7e3m5gn/MxsK2eJuhkIuffpqWl4p2npiKpZikqX+whZ2GoISsfZqVY6ZtpHCPhZCBfZaCcqxgo3NxgJpgvH1SVXSOkqOWe36Uk4x2e3OGgHFcbm54cmqBb1tkX2luYmReTExRVEFJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX11aWlpYVVNPSEA4ODIuLCouKyonJz9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu5qq6fm6GssrOlnqCVpa2trqqnnKammqOnobOuoqmmsqCYqaSUo7aiopWXoam0uKOboZyiko+hsZmem6emoaKwrpylqKK2ssWxramtqZGHkJyonKKknKWXnpiamqakq5uwoq+lp5ivpLusoba1rZ2ctLG3r7Gll5yuoKOchY/RtcO3eYeOhZGTkICmeZShd4ygkYSlgYpxqoaFtG5yapmjnJWKnnyYmYaHj3Ovgqaco46mi5Odi5aQm25xsl2ldJN6nGyZf3uZfG2pYaNxcX+fYnOyuGh3j5SmmH2NjpWOeX55kINuanlpenNvgHVeZWVvbWZnYEpbWFg8SEhAVTRARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVtbWlhVUlJRRjoyMjMvLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWSc4yKrb6/vLq0npanpK21oaKZlKKopq6rq5imop+moKC2p6Oop7CjlKyjjqStop2Qmpqqs7OknKScqJGUl66fn56npJ2onbWaoqqktqzEsKmrqaGMhI6coqCmopWZmp2Zm5mmpaiZraivpKabraa9rJS9r6yeoa+yuKmypZqosKKnl3mokX18sHeKgKSliJxtsnChh618oY+Dp5WYgKyJha6Fn5SqoKGXhp+AmZWAe5J+q4Cdm5aLq3idoZKKlJKBeq9epIF9pqdknYB8l3Nqr12la3CFmV1gW4ygbZWRppmDlo6Zjnx8hJmAa25/Y390boB6YGdmcW5oZ2hDWWFbPktVM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFSU1NWWl1fYWBhYWFeXVtaV1NQT05JNzA0Mi4qLEFUVlZWVFRVVFVVVFRVVFNUVldXWFZVVVFIRklKIygovZOag6jFwrbAs56arKCtuKWjjpukop+vsKqfpJ+drZmeuaCjq6CvqZmuoZCrqKOWiZqQrrCspp6lm6yXl4+soaCdpqGapZ2umKGop7epwa+lqaSei4COm5qfpp6SlJmblJuapqWmm6qsraSln6movqSWw6ypoqCrsriprKWesq2nqJd1r36Qi5yFh326rYqZZbCNZZWtfaCPg6aVmoGsioSwhaaapKGhkISgXGxqgbNgf617e4OBsW1nb5mZjIixW361XKSEa8iiZJ+Ae7xYdrVZsn1SroB6rFiAoW2YkKibjJiSmZl8epCff2V1fmOGeHSBfGFqZ3BtZ2VmT1VkXEFVXz5JKD45PTQhIiwlHzIuICoxLzA0NTc5OTxBQ0ZISkxOUFFSVFdaXmBgYGFiXl9cW1hVUE5KRkM1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9KfsrG3vbqzwbKinKympLWooIqaoJ6cs7Opn6OgnrWZoLSoqqyer62drJuVr6ehjoibjq+rqKahpZmukpiPqJmhnaWfmqOjpZmgoqqzqb2wpaienI59i5uWoaCYj5GanJKamKmgopqprqimpqKkqbueoMampKigqrS0q62lnrqsq6uUgKmSo6+Om3+HpJeZkIKAuMO6g46ckoSnl5yCrIqCr4innJumqpB+1b3CqmKjv719fqOCg9e6uLWFlZODnr2+hG2jgm+rhGycf3qysMeDaauwvax4d6K+vHOAlo6mnZGbkpqfe4KSnHtkfntlj2d5gnthbGVramNQYltTalw/VGFDTik9OjQvHx8kHyUyIB0kKDA0OTY2Nzc7PkFDRkdJS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PUE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbOzsL+4sbyyopyupqSypp2LmKXAqriyqKG/pqeynJ6xnLqon62vpaeUlLCrl4yDm5GupaKsoKOcqqCXi6OSpp2nnJqhqaOZn6Gsraq6rqijmpaSfIiZkaabko+RmJmPmJSpm6GZqqmhq6ego6q7nqjEop+toqmzs6muqJ+5pq2tmXN2qqW4hmSJoHBorpGKkG5ud6SQmZ+Bda6YlHCPi3GVqKObl66kcmxsbGaLeG9ugplxgXpqcWlnipeWmHFpaYWIZ3GGZF2IYmpvWVxmfXamX2FxjpFuZWV/jZOPoZiZmZOZoX6IkZZ3Z4h4aY9reYB5ZW1jZmxiS2VYSmxaOlBlRVInSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWVxeXl1cXFxdXl1eXVtbVVdeqZSss6m5uLKzqqmhrp2jsqmXkr+zxcq/t6qewKytpKKnrJ+6o6Suq62mjpeuqY+LhZWWrZ6mqqCdpKOgkYukkqeYqZqXo6qhlp2mpqewu6ysmpuSkXuElo2lmI2RkZmVjpiWqZagmKmjm7GmnaKruZ+vwaejsqWrr7CprKqmtaKstpWKoaimt52JlqOZh6qbkZWdkqmymZqjqqCylqKhnZ+inKGloZWrp42SkoyHk5ydlZGZk5mRj5WGgaWbmJaOi5SUjJCGhH1niX50gnVzh4pwp2x6lJGTkoGBjY+Qj52VopeamqSEiZaPc2qRd3GMeHd9emptZGNvZFVhWUBqXEhjYU9ZK0Y9KychNzUwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhVVlleYGFjXV5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaWlxcXl9fYF5eXl9fYGBgX1lZYKaWqKqktLaurqGwo62foLWxkI6syL7Fu7mroqWenKefsamjtqedqbSmqJGYrKKLh4mPnKeVrKSfmKeenpKUo5aomqialKahpJCbqJmhtruoq5maj4x8gZSLoZSKlZGWkZCUmKaQoJuqn5y2o52mq7enrsCtoralrq+vq6iosbegrbuYkaWkpraikp6noI6qoI6Sn6Orr5qgo6+or5ijoJyjqp6enpyWq52TmaGblJCWq5qOmZmXkZafkomhnpaVhZKNkY6Vi4B9ZouFdYZ1eIeCc5xqhY+Uk5CJfIuVkpKYlKOTn5mkhYqaiXxzl3N7jIBzfH9qb2RecGpgW2BabmRQYGVQWjpHR0U+Mj0+OS8qJispJh0mNDE2NjY4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOjlFTVZbXl5bWlxbW1tcXV1eX11eX19hYWJhYWFgYmJiZGJcW2OXlaOnoq+xq66jqaasn6e1qpCPnaW1vLCtraKjmnqeo7KkpbGpl5u5pqOTmaqcjoaKiZyij66eopWon6CSlpmbrouqlo+omamNmamPn7q3pKWZnIyIeYKUjJuTipWSlJGNkpejjZ+fqZ6fuKN/g6+1oq+udKO8orGfd3ifqLC5lHWso56JgKt/ZFxidqCPpZ+El31tkrOco6etqqJlnp+Sc3mal3CAmKiYbX+iqIplnKadkpiYlo2SnJKGnpuQloSSh4+PkomFd2qOhnaGcHuFf39gaIeKlJKLWnWUkGdokI9ze6icm2Z6momEeZlqhYyEb3qAa3JlX3ZxbGtoXGZmYmJwU1s+Tk5OU0c+QFVEOjEvHh8mNDozMDY2Nzg8Oz5AQUFGSEJHRklLTVNUVVldYGhmZ1hQSjxERzw4VVJbYGFiYF5fX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5Wmo6Cur6yrqaWoraKnraSSlqu2sbOnm6unrJdzjJ2woKirp5SXuaCgj5yknZF/iYibnoysmqKVp6GdjpaSnoR1rY+Ip5upkZekiZy7tKigmZiLiXV3k42Wk4qUkZGUjZCUoY+coaeZnLKVgIybtZ2zjJKOuqagfqeieqGttYCOjaWeg4uGkLGqr4yKl6SbeoCLrIabnaGnqKeHlYWYd6WbeoecgZengoJ7nLJ6ioahmJqVmJaDkZeXhZuZYnqHkIWPkJKLg21wjoZ5gHB/gIR+hXOFhJWReJZnknSgmnV9mYWjoIiYf5SMhYWaa4+Ohmx4e3FxZ2R3b2psa1xla2pldFxeSVRMUkBFNi5aVVU3KSEwOT4+NzQzNTY4Ozo9Pj5AREk/SUVKTEdTWFtZW2FhaGZaUUg5REw7PmFWXmJkZmRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXop+lrKyrqKygp6+mpqmlmZSvyL+xopeoqbaekISdrJynoqCNkL6emoyfmqCQfIaPmZeHrJyhlp+gkYyTiYaAkaeNh6OdpJSYnoaeurKonpqSjoVxdpCJlZCKlJCPm4yQkp+Sl6Gllp6rh5+0ibSarYrKh6msiLaFjbCBr6yCqIymmI2dfaiPcnt3nI+nl2iVpHm0jJ+epqeSmMKBf6uImKFynoCapX2XhZWygaF9oZShkJiXgY+UnIuZkot9hZOHjpaSiYNtco+FfnlxhoCDe4N0hICWgI/FZn+ph4+ja56FpJ2EmoGOj4eLmnGPlIVoeHV8eGhodnBoaGxeZHBsZmxYZ0ddUk0zRTQ2TmJkNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05JSkxDUFpdXFdhXmlsXFFFPUtNQEpjWF1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUlqKfr6eoqKWrn6O3sKmrppqUoKOkq6SXpqu4o6+Aoaidpp6diZS9mZONoZKej3mElpaRh6uZm5yZoYSOi3ebnI+fkIiepJyWmpiHo7mupZqcjIx+Ym2Pi5OQjZCNjZiMkZKgj5ShoZmhp36hp4etnaCWrY+dnJyQhYCgjKmthaONqZmMmn+idYCZlGuCrXZNq3iHjZyRmqimgKmrfYOhe3qnap5/kmtnl4aXt4mefm5gZFmDl4CNe2Roi3KZfXmWbF19l21fUnCDXF9reIJfWGSBfIN/l3CnqmuDo25ypXCfhaBqZ6BtW2+MfWdaYISAYlhQb3dmbXRya2pvXWpxbWtpWGlPXVlGOUE1SERfbDUsSUNSTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXV5idWBNRDpNT05UYlxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5WdoLigqaOmrJGgtruqrqKZmKGipa2uoZ6vtaOokqGgoKecmo6ZtJmQi5+MlYt1gZSSjIqmlZWZnp5+koWFrKSHm5CKmamZmpuSiKaxp6KWmoiJgGluiIeLjo6Ki42SjJGTo42Un6CcoaR/k4GPoqGUoHaclY+ngqCmf4Wnq4OleIl8hJp+onBzlIiWfJ+NeW2Gm4yZj5uomY6HnXuConN2pmaefnekX5h6fZN0om6Yt7S6dJOIg4C1qGSBxrh7cJW2jHKAmqNic6yrYHxpnbN+bXyGgY2Ci5hxf6NscqN0n4WBpGGdmbOWcn2Yn7N1c1uesoNqYm90dnFpb1hrbXNyZl1pXmJMRT1ENlFCWnMzPVNHX0pSPTwzOTU6OjZEOztASlA/VU1PUUBFX19bWlhgYHxkSEM4TVdVV2JhWmVma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJOVlKO3mKqbk5+NpLa0rK2gmqKdpKOmrp2csq6sk5iimqGkmZqUnqubi4iSeIuFcYCWjoqQoY+SlJ2YfZCJjaigh5eOiZKklJybjYupqKWekJaHhX5qe4d+fZCNg4uRkYmQlKGDl56gnaCei4l3nJiijZ9xoYqHqYebpY6Upql9rYx+eqCZeqOTeIF0loiNnH2Wn4abjpibpYWiZKF8iJaQm41tnmibjm+amXqAi6d9cml0q4Ofg3SqaJWaXZuFdoWeZ6prgLhmXKhwgZxglYxep3Z1h4h+nmiadYaTkpeOgJ9vmpFup5pdqX95u2t+qlyOhF20Z1xucnp4a2lccWt5eWNgZlhiQlFGTzdXQ1JvNUtbWl9OWkRBMjUxOzs2SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5bXllkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FgZGVla2VjaWhna2mVm4mptJqniGOUm6u5sa+snqacnKmgn6+cnrGprZ6XpJuhoJmWlqCjmYaJjWqIgHJ7l4iMlpaEkZWYkHqKhJWjnIqUj4aMn5KdnYmQqaOgmoySioGAaYGGeX+XjHuJjo6IkJebf5Sjn6Chk5hyaJ+Jn4+LcJKMgKmHmJ6hpZ6me7Cto6K4l3ejs6OkgIiUeZ17q5l+oo6cmpaIl3GhfIWNr7V9a5qRoXl+mLWipKuohJl8m32em390qlpdb3uWi3ieYkx/e3qFY3mXQkyfWKJqcXuObICIhJl1m3iGibGzf4Cbk6d3g55uc32VcJp0a6RdlXZIZWRgdHF+fm9mYGxpdnxkZWJRX1ddVFdAWkZRaERTV1xiWF5JRD1COD9COklGOExFWEFXUltWREZiXFpgS2BtfnJFQjxVX2JaZWlWZ2htb2JmZ15hYVxdXmBoYl9lY3ZtXWVnZmtkZmxpaGtpk5yAsK2ZhFNeoKazubKyqJqijJysnJyqlKKspKOoj6CenZuZlpihnZaIh4l3hoFveZWFkZuLfJGTlohygIiSoZxzkZCBiZqVoZuFj6mcm5WLi4t8g2yEhXGCoYx4ho2IiJOZlnyTpKCeooithn21hI6enHullnqpgZWbj4mfm3ynaHdtfpl0oXNyfJ2GmXCTg659pIOlnZmAo29eqGd1omNvpWGc05B9e5l4c3NiooaQfqN0pJB2a4+zjGCCmIlzqrKovH93g21+v6aptF2cbXxwlm1/cqJyXaRnc6ZgaKZtm9SafoabcHl7l2ycfHiXc26ppGdgZXpxgIVsaGZkbnZ4Z2BjU1xmUVFiSFhKVWFXVFtlalxlUUZDS01KS0JLRThPQFFOWFNZT1NRYGZmalJjd3l3SUZFY11lWmhqVGloam9jamdgY2BcXV1faGJhaWV8ZF5kZ2RrZGptZ2hsaJeaf6+qVFxLfqmvsbOvsqObmYWZqaChpI6mqaGZqoqamJiTmZOSoZiOh4V7cH2EaH2Pg5SagXeRjo+Jb3+Gj5OSbJeTfImSk6WXg4+rm5STi4aJeYN2h4Bugp+GeIGShoiZo5h7lKOkmZ+Js6Gitot6rKekrqVwqYCajoWAmpB7pIChmYaYcp6EpK6vipeMgI2kjZWCraCTdrW2tcmhc5SLgZ9gnZepbXqVh6CbdKKId6B+k5eLgXBNZqOScJqHc6R7eXRhg4FrfaBrcWRfnHF9c5ZoeWmztbTGpnOYfXqda5ybq3aFm212eJhqmnt1mHJRRX2zX2p2a3qIZmtoY3V1cW5XX1RZaVBTaElWTVlUVl1oa25WZ1dOS0FKTUtISk9BUUtQZWNqbWV0cnN/eXxudYl7e1RQTmxeaVxraVJqaGlsaGxmY2VgXF1dXmliZGlre19dZGhjamZubWVpbGWhm4iupYNkP5Ohsqqur7WiopCAl6qio6WMpaeenaaDmpeWjpeQj5yTjoiDemp5h2WDjX+YoHl1j4mMgWmEhZKDjIWdjXmNi5amk4OYqpiNkouBiXqAfYt5cJChhnqClYeJlqCWf5SlqJyVlYNmbnicbKJke3Gld5uYcGemgJWKeqR6n5aDl3Ked4GKlZePuW6RiqJifZiglYhtcmmqa3WgbW+mX5ppi5BploeblnWigX6aYIyGjXVwiGJooGWefmmbdW9jZoiBbXGiWl5bYqFtXYiLbnp9c3JkpW14omRnp2iZc4yZcKJvVYmQb6BfZqhUi15UmG5tc2tygm1waWx5dGtwUllXV2ZaVG1JWU9dSVhpaXNqWWtWUVJGVlxMWFNhVWlrX3d0e31wfHxyg3uAc3aNgIR2XlFyYmdjcGdQamhoa2xuaGRnX11eXWBqYmppdnVdXGNoY2pqc21ma21jnKOXpXlkc22Lpq2jqbCxpp+LgJirnZ+mjKOim6OigZaYk46akIuYkI6Ke4dxgIhpi4t8mJtzdYl9kHtkg4eVioqVmYJ8iIeXqJGBo6yQhpGLgop+gICOc2mQpoR9h5SNiJmgj4iTqaadiKZ4lZt+pIiWi7GYnZCCr5eepXaUhnipc6WPhJpupKKMkoSNg7tufaWvgoaFhpOVnJ98pXpyqJWglmaefm+sZJaKlpN3qG2qooGJdomDd6uRpohrkbBrdrOMqWuKhW1tn56SlWB+q4uqdn5+i6Wedp98g6SVnaBqm4h4rGierYy2dHe+jaSTWoOnjqthdXJ0cHx1cWNrf29pbVNXW1ZhYl1rTV1SXUpebW53X1txWVxgW2d0ZW5vcmNydGB3en55cnmDc4R/gXt7jIGCgHZieGRjbnJkUmtnaG9scmpmaWFgXlxha2JtbHpvXFxiaWJtanhtZ2xuYpWkqZyBf52jlqmpnaimrqSZioKYrJqfpYqbpp2pnYWMmo+GnJGFko2MjXSHe4iEb42FfpiTdHSGcpGCbX+LkYeGk459e4KGmKaOf6anjoGOiYWVdoKHkm9si6mBg4yUjomdn4mMlKqin4+AdZSXiH6BeZSuon+Bm3GPhneOiYJ9e3KnjHF9fXqYlpuEj3l7f36HlJWTinaQmJ6gg3t9iWuMhVt5eXJ6cWlufpKJcYB1gY+Uk3GHhIJljH9fgX+Ld3RylHVveW5th2yEhV51Z3eOZYCAhY2omn10e5VqiYhwgXZ9h3dubmiMc3p8mHiFXGxYeY9pb3hycW94eHBda4duamdWW2BXXWZrZFZjVV9RX3B4eWxrdmZra2t3fXJydXRhb3ZidHuCeHV6gnWAgICBeIuFg317bn9sZHluXlduZ2h1a3hqaWplXGBaY2plbXF0bltbYmxkbGx5bmhsb2GNk7eopomgopqmo5iknKuioYSEmK2SnqGJm6ebqZiDgZuLf5aUh46KiY1yg3yPfX6PhXuYj3RyhHCVhXt9kouGho+EeX6Ah5qljnyooYuGkJCFlYOGjph3coSpho6SnZCJn56IjJunn5+qg4iOlZp+fomWraePkaaPd2+bj4F4kG5+qIVwfZVxa3B9gaCNgJOOi2hsXIKLi5uano5zlYuIcXRrgXZ0gVlyboeRgX5/jGpdamR7hoSJgGBpeHqae4KKgXWBhYFnd4qGamFwcYF0XnGKgYiOpZSFZYuNg253i4Rxho96cWhoZXyEe5ZbXGtobnZbfHl4dW5zc4NnXG2La2tiWlpfW1lscVxfYVpfXWV0f3t1cHRka2trfH1zfHl1ZG51aG18fnd6fHt5eoCAfm+GioR7fXR+eXN/aFRccWlsdnB1Z2toZF1hWGtoa2txcm5XW2VubGdzem9oam1gi4qpsKGPoqGanp2Xnpioo6J+g5mujqCViJyikaWVf3uYhX2SmYmJhoeKc36BjHaFjIKEl4pyb4BymIaDfpKDhIaJgHqBhIycoZGDp6KIeY6XiZWLi5yXhIN6rYKRmJqVip6dh4ihqp+hoqOLh5ObnKOZlaqhp6afkpqHlYx6do2Ng6d+f5KQk5SdsqablZ+QjbGSl4OljIyVmp+JkJuCiJGKa3yOd3hlg4eRi3yJnoSHjJCJiIGFhJB3fHp0maCIhomdiYSTfn2KgIB1b3KEgn53hoaKj6WQgoWMhoKMkIx9iIyKkYR6bYOFfnqZa3NpYXSKcX56d3dvd3SCXV5vh2huX15aXV1TaHJWZF1dYmxodXx8c29wZGtqaYB9bnmAcmpwcWxngXtygoB4f31/hHttgoyGfHp5e316g3hOY3Zqc25wemVrZWNiYFt0ZnBncnFtVV1sdG1oeXpxZ2lrZIyHnLmelqGgmJSYmZSYpKCefH+arI+fjoagnYueln15lIN7jpmKhoOEh255gYFzgYh+iZSEbWt+epeHhIOQf4CHhIV8h4WPnJ+Th6ughHOLkIaSkYudkX2Ne6qEjpOYlo+cloeHnKWfopqdhYKSmpmYj5mmn6WdnI+Vf4+IdXuGjYSle3yOkJGGmauhnpSdkI6pjZCAnYyIk5mego+XfoaOg294hnF1YH+EkIZ1jZmBg5CDh4V/hYSVbnl2dJKhiouFmoOEjHN/iXt8cnF6h4N6d4mOg5Gmj4WDjoCDiomKd4aJi4x+cW1/gnxvaGxtaF96f2h+fHZ1dnV7eFxfcX5udGBjW11fUmduVGVbXmJraXZ5f3FsbWRramiBf2x0gWxsdW96cIZ5boeAdoKAfoV2cYKNiH57e3x/e4KKYGh7anVoaYJkamNgaVxjdWhvYnVtbFVjcXllcHp7c2VqbW2LiZ62maCjn5KRlZiLmp6fnnt4n6eRnIuHpZWLmJl5eo2FfImRhIyCgoNufIB5c4GFfouRfWtofYKXiYGIjnx+hoSGfI+CkJ2dk4monYBwjIuMkoagoYqFjHyokYiQkpeTlpN4jaOfoJ2WmX+AkJqYkoyaoqCjmZeQmn2Mg3d/go6GoH9+jIyPfJikoaKTmpGQpoyPgZqRiZKXm36Tkn6HjoF1c4Jwd2F+gI6GcouWfYiMcox/goWGj2h4cniLmJGPf5Z9iIpxgYZ7fHB3eoqDeXmPjIKUpJKLhY97hYaHhHaDhImJfGdzfYB5e3Fta2dffnNofHV2dHxzgGpeYHR2cHdkY1lfX1JraVVlWWBhaGp2eYJxZ2tkbGhmgIBrbn5ob3FsfnmHemyMgXOBgX6BdHaCjYZ/fHp/gX1/j2lyg250aWGHaGxiX3FWdG9tbWB4aG1XanR2Y3V6e3Jiam96iYyesZGlpJyOj5ePhpygm519d6WhjpiAjaOLiJqWeXuGh36DiX+JgoF/cn97dHaDhX6KkXhnY36Gl4qCiox5fYCNg3mWgpaZmI6XoZx+cIyCkZOGpZuHjImDppWFk4uWmJOSd5GdoKGXlJZ5fo6Xl42WmpyjnZiSlJp4jYSCd4OVjZ1+gYmNjHOXo5+ilJmPj6KMioKWl4OSlpl+mI18iI2BdnF9bntkgHyLhXGHk4CRgmyHg4GAiYVmdW97hZGXi3ySd4uIe3+Fe3pxfXeIhHmDj4iKl6GVgYOLdoiEg4J3fIOKh3hgenl+dH94Z21lYX9qandzdHZ+cXxjY2BzbnVybWFaYV5bbGVSY1lhYWhrdnmGcWNrY21maHyDbWl1aG5waYB9gnltkIZygIODf3R8g4yBgH16goN+fJBtdolzdW1limxqYmJ2VoRpcG5geGdsYmp2cGZ5fHpxYHJshoWPm62XpqeejYyXh4afk5eZfniqnYuZepedi4yYkHl8gYx+fIR8gYOBeHR5enR9gISAiYuAZF99i5WHfoSGdX1+i399mIaXlZiNpKKZf3KHe5ORiaaPjI6Kk6CRg5KQlZeRi4GPmJ+akZCQc3+NkZOJnZ2eppeXjJSVcouMiWuEl4+ZeoeIj4lvl52apJSVi4yei4aBkZx/kpKVhpmIe4qKgXlxeWt1bHx/i35uhpODlXhxgoR+fouAZXJpe3+Wl4N+jXOPh4N4hnx1d398hH97gouDi5Ojj3iDgXSJh32AdHaCiYVwYXx2e3J9cGJvY2R8Y25wdnN4d3N0YnZgb2x2bm9cXF9eXmpeUF1ZY2FobnR7iWtgaWVrY2l3h25nbGlrbWiBfXt3b5CIc4CEhH10gYaJe4N9eoGEfX2OcnqLeHhtbIdqaF9pcmOHZ3FvZXdnbmxheWlrfXt4cGF4bYuAmJipn6OonYqKkoWKnYuVmH54r5mNl32flJGXk4h3fnuKfXyAd3iAgHB1dHxvhn2BgYp/fGFcfo+Rhn+Dg3N7gId6j5KJk5Kdk6acloJ9gX2OipGjiI6KjZiajYaSmZSWjoqIjJKcko+MjG6EkI+RiJ6ZoqCWlYmWkG2HmINlhZiOk3qJhJCKcJaalKOTkomLmYyBf5CdfZKOkoyZjnuKhYdzc3ZrcG51fIp0boaRj5NxdYF8gYGIfGVwbHl8mZN8g4h0kImAc4d4bn98gIV7hIuHgouUp4x6hnt+ioV3fnFwgYeEZWh5dXZxfGJfcGFrdF9xant5eWxzcGV5Xm5sc21yWFtfYGFrW1BXWGVjZ3Fxf4dmXWlpZ2JncY1vZGloZWlpgXp3dW+OhXSBgoN7dYKIhXiFfHiEhXp/iXd/i3t7cniDamtfcGh0gGtyb21yZ29sZXxjboB6d3Fsd3eKfqKXoaegppuHi4uBj5yHk512gquVk46HoY2WlI9/c3x2hXh5f3Nze4Zrc3B6bot2gIGIb3FbWX6RjYeAf392dYCAgKCHkouUnpiilZh4in+BjYicnYqPhpKYloWJlZqQl4uLjI2MnImOkINtiYuQkYqdlqGbl5SFl4dpg6KBZYSciZB+i4OLgXeTmJKfk5GJiZSNfn2Ol3uRjI+OmpJ8ioCCb3ZwbG1vcHuGaXSDj5mLcXeAdYKIg3lmcm51gJmOe4eDeZOQeXWHc2+HeoSKeYqFgoeNmqKGe4N1got/d3lubIGFg15zdXNxcXlaX3FhcGtecGp9e3FtbWptdmBwb2txbVlZYmFiblhRVFpmZ2N1cISCYl1rbmRjZmuSbmBnZ19oa4F1cnNwi4B1f4OAeHWAi4B5hX94h4Z3g4V8hot/e3aKf2pxY3xjhnxucW10amhvbHZ4X3F/eXx1dXSAg36klZqsnqeWhY2Ef5eUg5CgdoyglJOGi5uNlo6LeXF4dIJwcoV0cXaIbHBudm2IdoN+gG5uVVGBq5SHg3h/d3KDeoOggpOClZSZnJObeJJ7g4ySo5mTjomVmZKEh5eZjJSLiY+Ph52EkIp8c4uFio6InJqfm5WTf5N9aISbhmeFn4eRhJGCiXGDkZiQm4+PjIyPjHd7kZB6jouMkZaMfIh8gGt2am5rbGx7f2J6fo+XgXZ7gXiDjH15Z3Nsc4aVi32HhXqTj3B5g292i3mIinmIfIGLj52dhHt6doKLfHdxamyChHtgeHFubXJ0Vl9wYnJhYG1venFob2Zmc3RpcWtid2VdV2ZgYHJTUU9cZmVdeXCIfGBcaXJiYmVmkWpfaGVbZ3B+cGtxdIp9dnyGgHV1fox5e4WBeIiDc4aFfoyMhHx5lXhmcmuDYIh9b29remBqbnV/dV90fXmGeHRzhX14oI+ZsJuljoKLf4OZh4CMn4CLmpSPhYiYj4+PhHZ0d3SAcXCFdHByhHBraXdug259fW11c1JNgt/IktaTe3B1hHaEoIOUd5aRmZ2RmXuUc4WQnqGTk5CJk5yUhn+XloiNjYiSjYibf46Ad3qNfomMipybnJqUknmMdWaHkIVrh6KEkYiXg4ZjjJGZj5WLl4yMiotxepSIe46IipKRiXmFfH9se2VzcGtsenpbgXmQkIF6fn+Aho57emhyanOKjomBhIR8lIprfX5tf4t9ioV8g3iAjpSZmYp8dXeDj3hybWdxgIVua3VwaGp1blNfb2VwWmBscnhna2piZnhycHBjYHdgYFZrX152UE5MYWdiXXpxiXVdXGV2YWJlZY5kYWdiWWlzc25rcXaMfHR6hoJ1dn6Lc4CGf3uJf3KJiIGRi4h8fph2ZXNufGWIfm9wbIBZbG55eXNgdnp7jXZyd4p3eZ6Lm66aoJCChXeIlX58ip6IhqCSj4WMmISTjoeBdHhweXFvhG9tb39zZWV5cX1ten1qaGtjpJrB3K7woXNsdoR2haOGk3CXkZahlZyBknKGi6KXiY2VipCdloOBlpCFiY+AkYqJln6HenV/iXiHhI6cmpiYjo92iXRthYiJfImig5GJnISFXouTl4uPiY+Li4SJbXuWgX2IhYmRj4Z2hX1+a31keHVqbnlzWIl7koiFen6BgYaMf3llcml/iY2JgYJ+i5WEa4F1bYaPgY6DfYF4fo+UkpiPdHJ3h4x1c3FndnqEY3VucWNqdmhSYXFnbFZfb3R6YXJkYGl9cHJuW2NyYGJWbllceE5NTGRmYl53c4luXFxkeV5fZWWFYGNjX1lqc2tua3N3jH10d4SBeHd7iXGDhH1+iHt0i4mIloaMf36Xc2d1cnlsjHtudHGBV3F6dnlyZXd5h41pdoCJcn+chpimm6OShH1xjJR3eYyehYWhjY98lo2AmYiEe3N3cHRqcIFsaW18dV9heHd8cXV8aGBkfOvatcnD3IdzbHSCd4ubiY9qmZGQnpaUgYlxhYifjYSLlYqMmJR8jZOIg4mPe5CLhY+Bf3Z4g4RyiIKTnJaUl4WMdYZ+b4OBh4aYoYKTjJ6DiWGDlI+HioaJjYeBh2l8k399g4SJjo2CcYZ+f3F3aHZyaXR3bFqNfZODhX2AhIGEioJ2YXJriICOiYF+fpGQfW2Ba3eEjYSQgnuAfH6PkY+ViG5weYyFdGtxbHN5gmF1am9dbHdhUmVyaWZTYHB2dWFwYF1og3FzaldnaGJpWG1WW3VMS0xlZ15ic3OFalxcZXleXmRne2FkX11Za29mb2p0eIp+c3OBfnt2eohzhYN8f4d2d4qGj5mBjIJ7k3Vsd3Z5eJN0bnh7fVh6hnGAb2d5d5KDZHaGhXCKloWZoJqiiod0b5KMcXePnH6LmomJfKB/hJmAgXhydG5vZHJ/aWZteHhcYHl7e3FxgGphZ2F/1baOkaZ4bnF3fHGTkY2Ia5qPiZ2TjIZ7aYeLmYaBkpGGh5iOfI2NgYGKjXyPjH2JhHp0eoN7cYaAlpqOk5OBiHSChXSCf4mRnJ2GlI+ffohif5OHhYiEio2AgINnfJCAfn+CjI+Qfm2DfIJ0a213dXR3dmxjjoGPgIV+fYZ/hIl/cF9xb4R7jouBe36QiHlwg2V5gYmFioF6hHx+ko2PkYNtbnmLfnVtbmtse39kaWxqWW53WlNqc2liUWNyeG1jZl5aaoNuc2JbZ19kbF9uVVtwT0hPZ2VcZ29xgG1aXGNzYFxjbHdlZV1dWmtsY21qc3eGf3Fwf3x9dHiGeIWCfICHdXmJgZKVfImGdoiBcHh5e4STb257gXdeg4B0gm1penSUc2dziHxxkpGDmZ6boIaIdnaUf213lJh/iJCEi46afYyadn52cXBsamF1fGdianV6W2B4fHptcX9lY2hnV52PX3FzlrzEhHdxlIqQgHSYjIedlI2Ic2uIj5WAe5SLgYSbjHyKhn18iYx/k4d0iYV2dn2CcXWGgZ6VhpSPgoJxfodzg3qIlpuWhpKNnICIZn2TgoCGg4mJcoF9Z32Le3l/f4eLj31pgHyDdmZveXhzd3Rsa4+Gi4KLf3mDgYSEgGtecHd6fYuHhHuAjn9+coBoeIGGiYSCd4J6f5aLjot8bWt6iHx2dG9paH53ZV1xY1hwdFNUb3NpYk5odXlnYV5dWG+Ab3RZZGFdam1gcE9ZbFJEVGhiWmxvbXtvWVtebWNaY293ZGdcXWBramNsaXN3gYNxbn57f3R1g3qEgnyChXZ+iYGWkXiDinSBiHN5eX6NkG9ve4FxaYJ5en5ubXx2lmtqeIR0a5OMhZ6YoJmFiG9+jHZqeZmPgIKKgpaYinqPlm96c3FsamRgdHtpYGZye1thc316Z3B6YWVkjrGyd0tiWqXa0Zdye5KMkXl/loyFmpKNhm9shZKReXmThoCEmYp8h4B5eImKhJWAb4qHcXR9e2p5hoOlkYSTjIJ+bn6CdYJ3hJqXkoqTj5SFh3B6koR+g4OJg2+BeGiAhXhyf3+Diod8ZXx+g3ZjcHOAaXlxb3WZjYaEi3x3eYCEeoJrXG98cn+Hg4h9hYd6iHGAbXCChY2Cg3GDd3+Yi42Dd21tfoN/dnplaGp+cmFaeFpZcm5OWHJ0ZmBLbXd1Yl5cW1l1fXJwV2ZdZmpxX29OV2lTP1lnX1twa2d5cVtbWWtlWWNweV9oXV5lbGhmbGlxeH+Hb21/fYF1cIJ7gIF/g392gYWJl4pxgo1xe4Z8enmElIx1a3p/a29+dH99b3J8e5Rwb4B/eWaSiYKhmJ2Rg4Znh4RwZ3qXin6AhYKZioF8jY1peHJsbGZfYW95bWBib3lcZGyDemFxdl9kZdXrvosyOj6LjoByeYaJj413hZmOf5SPjX9ubYWMi3V9j3+FgpWJfIN4bnaHhYKWd26HhGt1e3RleYOEp4yDj4yDfW1/c3WCeISaj4uPkZKMi4Z+e5KHeICFjYNsgHJpf354bXx7gYqDeGJ5hIJxZHFofm51cnWCnIyBgIZ/dHZ+gHOBb1trfXN4iIGKe4Z/fIh3eXBrh4KOgolxgHd9lImKfXRtanaAgHV1XGlpeXFaV31TWnJmTVtzcmZcSnF4cF1bW1pddX91aVliW2dlbmJpTVdmUT1eZl1edmZfdXFbWVVvZFpkcHlbaF5gZ21namtocHh9jm1qgYR/eW6Be32Bf4J6dYKBjJOFcICLbnd9gHt7iJOJgGl7fmp0fHKGe3N3fX+MeniEfnxrjIyDm52WjIKBbI1+a2h/j458fn+DlIJ/fYqIa3VxZ2ljW2Nnc29gYWx0YWhwiXphc3ReYmOboJBuXDVar7V1aoCKfpOHd4iYh3WQjIp3cG2FgoZ0eYl4iX2TiHp+c2d1iH59l29xhn1odnluZXqJhaWHgIeNiX1tfXR+f3uKl4aBkpCYiIuEiXyPiXJ8foV8aX5ta4B7eWp6doKHgHJgd4F+cWRyZ3WCbnV7hpWSgn2CgHB3enx1fm1XbX11c4p/hnaGdIKJendybYh/jn+DcX17fJGHiHptbWhtgoF1bl1oZnRyUlx8TlxxXU9cc3BkVktzeWpYWVlaYXGBdWFdXWBmZGhoZk5aaE5BYWRcYHZhXHVtWFhTdGFbZW9yV2pfYmhrZ21saXB3fJNsaISJfXxwf357gX+CeneAgImLhHJ7h29xd4R/e4mNj4RqfntueHl3ind9eICCh3+Efn56bYSMiJijjYWEe3aLemtthYmSeX17gpKAgH2KhHBycGNmXllnX3BwYGFocGZqb4l0YXRvW2BkanZ7f76cp6TJuHKFhHOUfXmIlIR0ko2HcnNwhHqCc3WGdIh3lIl5eXFkd4Z6gJJocYR1Znd2ZGp8hIiegoB/jo59cX5yg3h+kI6Cd5WMlI+Igoh6iYlseXp/dWh6aWx/eXNpenaAg31oYHiHfWpqdGh7gGp2gY2RlX98fn5xfHZ8dH5iVXV7cXKIgoJ7gXCGiXd4b2+CgYt9fHd8e3ONhIF1aHBnbIiCcnBdaGN0b0xmdkxeb1ZUWnRuYlFPdHliUlhYXWFwgnNbYV1oZWVjamRRW3FJRGRiXGRxXlx4aFVXVndeXGZuaFZsXmFqZ2Vubmhwd3qTbmmIjHl9c3t+eYKBgnx2fYOIhoNwdoNzbneCgn6Ii5R/cYB8eHp6gYt0g3h/gYGChHqAdW99iYubnoh+hnt3hntndYeNkXp/gHyJhoR2j4BncG5gZVxYZlltc2FhYXFsbGiJbmBzaVheY22Ad6naqceGiLNyinlwjnZ9iJCBe5SLgHV0dX52f29wf22FdJSGeHRsYHmBeYiOZXGDb2d1blttfYGQk4CBeZKSfXd6bIV0f4+Kg3KViZGPh4WFe3+GbXV2f21od2ZtfHZtand2f398YGJ4hnpodXZjfntodYaPjpZ9dYB2coB6fW2AWVZyfW9zgoZ+f3driIZzeGp0f4KCfHl7d3pxin97cmdzZG2LhGxzW2pfdmZJb29MW2NYV1Z5bWJQU3V3WVFWWF5gcoRvXGBjbWRjXW9jVF1yR0JmX15maV1ae2NSVlx1W1tna2FWa2BgbmZmbHFocHZ4jnRrjox1f3Z4fXeBg4F7dH6DiIiDb3F/dXF1fYWBiY2Le3d/eIR8fYWHeId8fYF+hYB7fnJ2eIuOn4yJe4p3dYN6Xn6Hmo15h4R0hoeEd4l7Ym5tXGJbW2FVanRkYFtob3Bnh3FhcWZXXGNrf3zKzoe6omtub4ttcoRyfoaLf3uShXp5dHl1dHpqbHZjhHaSgnZvZ198gXmLiGVxgGpqcWNYbXuGnImDgnKXk3d9e22Gb4CJioZwlo6QiIaMhHt5f3JycH5naHJjbXhxamxxd318eV1leYB3aXV4ZoJ3aHWHjI6VfXOHam9+gHhufV1XcH1tc36Je4Btbop/cHZmdn5/foB1e3B5c4V7eHFlcmBti4FrclhrX3hdSXBsTldWX1RVfGtiT1R2c1JSVVdeYnSGaV1ga2pmYlluYVhjcEdBaF1hZl9cVnxeT1ZlcVlbamhdWGhhX3JmamhxZ3FzdoZ5bpWKdH97d355g4eAdXN/hYWOg3Bwe3h3dXmGhYeMhnp8f3WLfn2GhISHf35/fYd/fHh2eXaRk59+jX2LbnWAemSEiJiGdJKKb4WFgnqDdWNuallfW11dVWhzZWBZZHJyZ4FyYWtkV1pfaX94vq56n7huYnSHaXV8cnqEh3t+jYB3eHJ3b3p2ZWpvYYd1joFzamJefXd4ioJlcH1oa2taVm94i6SBhX9wmZJxf3d0gGx/gI+GcpOHjIiFiYV9eXVzb2l5YWptYW12amdra3l3endbZ318eGVyfW6EdGZ1ho2GloBwi2dre4N0bHViW256anN6inuAZXSHfG1wZ3R9dnx+cHpqeXqAeHZvZWxhbIl9bG5WamF4VktrbE9ST2lOWX1oYk9VdmxNUVRVXmZ2hGddYXFoZ2FXaVxca2lKRWtaYmVXWFV5Wk5XbmpZXWxlXVplY150ZmxlcWZzcHSBeHCZhXZ/f3h/fIWHfXVzgod/lYNuc3l7e3NyhYaIiIR5gX12j399hImOhIGDe36Lg3t3fHd2mp2XeoqDh2p2fn1shIaVgXKPgnGFgn6CgG9mbGdYXVtcW1RlcGVfWGNydWl2cGRlYldbW2h/cG9ygHOKZWZ6f2p1d3R0hIV4gYV6d3R1bmt6cGFoa2eGdI2EbmZeX3xveol9aG13ZmpkVldzcI6nfYR8dpaQc3txe3hseXqPg3WXfIeGg4eEfXVxc21odV1taWBtdWRnZml6b3tyWWeBdnVocIB4gnZid4WLfJWCb4xrbXuBcWZzZWBreGZxdYl6fWF1g3Vpa3F0eW94d3J7ZX19fnd1bmJlYGyGfG1rVmpjclRMamtQTE9wSF58ZmFOVnVlSk9TWGFrd35mXWdzaWVfV2NXYnFdS0trWGRiVVRVc1ZNWXZlWl9sYFxbY2Vfd2dtYnBpdG9xfnV0mYF3f4B4gH+GhHp9doKDfpiFbnJ0fHt0cYWFjoGAeot1dJCAfYGUjoCFhH1+jIZ6foF2e6OlinmJhoVsdXx8dYSDjXtvhXN6hX2Cg3VuamllVl1bW1pTY25lW1hidHtqaW1oYGFXXlppgGlsb4BnbWJpe3prdHV1b4aCeoF+dnVuemhqeWpfZW5ogXeQhGhlWGF2aX2GeW5pb2ZnXVVYb2mPqHeBenyQjnh0bn1tcXR4jX53lHSFg4CFiXZqc3ZoaW9cbWVebnNfZ2JqeGh7bVttg3J0am+Afnl3YXeFhHiQhnOIcnB6f3JjcWhbbXZkb3KHendhcoBvZ2l4c3Frd3ZzdWKCen12dW9jYmJtfHxra1VpYmdUTG5oUEhSbEVheWZiTVRyXkpNVVllbHh7Zl9tcGpjXVZgVW9uV0pTaFhnXlhNVWxUS116X1xfbF1dW2JlYHpobGFvb3Zub3d1eph9d4CBeYCAh4Z6eXqDfYGThHF0dH56dnSFiJB+gX2QbHOVgXuCn4V/h32AfoaCgIp7dYSsn396iIiEbHKCenaBgYJ1bodvfYB0ioBqb25lZFhfWlpaVWJqZ1xaX3WCaV5tbFxhV1tca4FlcXV9aWpebXh3aHV4c26HfH5+enZzbHpnaXdnXWRzZ3p3koFjY1Rkb2aBhHZ2ZmhqYVdWWWhjkKhvf3d/io56cG97ZndteYp6do5xg31/f4duZHd0ZWhpXWxiXnBwW2dfbXVlemhddIBucmtxe351dWJ1hox7iIiAf3hydX50YXBsWHByYW9wg3p0Y3GAa2Bsem5paHl3c3Bkg3R4eHRwZGBjbXJ9amxUaV5fVUx1Y1FHV2JHY3dmYUxUcFlLTFhYaGx2emVkbXFmY1pYXVh2ZlRKXGNYaVhYSFdlUUljeFtdX21bXlxiY15/aWpgbnR4bW9udoOXeXKBgH1/iYyGfnV2hniGjH10dXWCeXp6goyOfX6FiWp0loF7ip19foV5gHt+fIaJc3GProx7e4eQfmZxiHp0fn12cm+GbHx+bZB6Y3BwYmVdZVZaWVdjZmtgXV1zhmhZcW5bXlhaXGx7YnF3dmxjXG50dWh1d3FuhXl/gXp3b290ZWh0ZVtndWZ2dpJ6X11TZWVqgoFzfGFjaVxUV15iZJClaXl0goWQeGxteWZ3bHuDeXSHcoB4fHmAaWV3bWBnYV9rYF51a1lmXW9vYnplW3d8a25ucHh5dHVlc4OTf4iDiXp2b3J9cmF4Y1pub2BvcIB6c2VxgGRebXVoY2Z4enJrbYBzcntxcWFeZW1ufWRpVGhZWlVOeV9SSlpZSGN1ZGFKVG1VSkxaV2lscntkbGxzYmFZWlthdlxUS2NdWWpTVkdZYU5IanZYX2FuW1tfYmNdhWloYm53eW1vanaBkHhtg36AgpKIhIF2dYl0jIZ0cXZ2gXd9fX6Mj4F/k35weJaDfZmSeYCAeHl+f3OHhHNwmaJ6e4CJlXlldYh6c3l3bHRwf2x5fHCSc15wb2FnYmxUW1pXaWRtZlxccYllU3JuW1lYV2BsdmRqdWpqX1tudHJtdHR1a4Z9f4B9d29ubGRpcGNba3JkdHaOc1xXVGRgcX9+cYFcYmNeU1phXGSTn2VycYWDkHNranhsbm55eXpxgHZ/c3t6e2RmdmheY1thaFxed2hXYl5waGF3YVt8dmpqcm94dHN0aXGClYOHf4V2c2pwfG1md1dbaWxhcHF/eHNlb35aYHBwYV5pb3xranJ9cW92aW9gW2RrbHthZlRnVVhTUXdcUlBZUkhkc2JgR1ZrUUlQWlVrbGt8ZW1vcmFbWlhZbHBXU1BmV1dpU1RGWlxPSXN1WGBjbmNYYWFiXYxqY2Vtenlsbml2eYZ6a4R9gIWZfIKEeX2IbY+GcW92en10goJ9i4+Dgpd0eIKUhYGfiXWBf4F0f4Jwh4N2b6KXc3uGi4d7ZneLb258cGd4cXtsc3ZzjWtedG9iZ2VrU15cVmhibGxbXHGNZE5vbVxWV1VnaXRoY3RlZV5acHZvcXZ2emyIfYB9iHeQc2Nka29hXG5tY3N4h2taVFZiY3d8fHCEXGNfY1RaYFpjl5VjbnCChYlyaWZ5bmRydXF6a3l0dW97f3ZfZ3NkXF9XYmRZYXVlVV9gbWRhcV1dfm9oaXNxdHB1dmxthZSCiXyFcXJnbnxvcW9SWmVpZHByf3VzYmx1VWJxaltebmR7ZGt0fHFxcWlsX1hkaWp4XmZVZFVXUVZvWFFXVFBIZXJfYUZYa09JWFRWbmlkfGlreGthV1xVW3RkU1JWaFFZZ1RTSFpbUE55d1tfZW1qWmJgX16PbmFna3l2bm5pdnZ/fm2EgH6Gl3t/h4GKf2uTiHJndIB7dYCDfomOf4uTc32KkYWHn4Z7f4aMc4CGc32CdW6kjHOBjYt3eG56jWBlfXFnenR5bG1xd4NnZHxtY2dnaFNgX1VnYGxvXF5ujmhNaWxgVVZTb2Zza2Z4ZWVdWnJ2bnN7eXNuiXuAd5x7emthZWxtXmBuamVweX5nWlZYX2x4e3pvg19iXmdWWWBYZJyIYmtwgYZ8d2tqdmxbdXBqeWl1cm5vfIFzWGtvYFleVmNkWGVxY1RfYmlhYmxaYH5rZmxzdW9teHZsaIaMf4l7iG1xZnB7bHFsYVhfZ2ducn9zcl5pbFNlcGRVYm1heGFvdHp0aW5ral5XYGZodVxkVmJWVE9ZZ1NPXU9QSGVwXWNHWmpOSmBLWG1lX3hobn5kYFVeVF11W1RSYGdOXmJVU0pcWlFadnZdX2ZtaFhjYVtejnBjaGp3cnNtaHZ0eYJzgoN6iI5+fIqIjnluj4p0bHOCc39/iIWHkoSVj3p9jI+IkZuEgHyMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2NjY2NjY6Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OSk5OSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY6NjI2Njo6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyRbWZnZ2dnZ32FhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCS5KamZmZmZp6bG5tbm5vamZnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJFnX2BgYF9eeYOCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTM/k56cnJycnXdlZ2dnZ2hjX19fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkY6NjY2NjY2PkJCQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaNjo6Ojo6Oi4qKioqJiomIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p8fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkpKSkpKNkJKRiYeOipCSk5GLko6NkYiPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyMjI2NjY2NjY2NjY2NjY2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoWNh4aJhoiQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCQiIuGhYSFh4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkJCIi4SHhIaJj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fX19fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMkIiMhoaIg4qPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6fHp6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2Pi46Mi46Jjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp5ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlJOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTkpKSkpKTk5OTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKRkZGRkpOSkpKTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSko+SkZGSkpOGhZORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCRgoCSkJGSjXWHkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQj5CIcIKQj5B7dYiQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Oj4xzbomPiXJ4h4+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjHZteo+Cc3iGjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHc21tgnl0dYCFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxZWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d3RhXmRfYmpwZmhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoYV9tbF1mZ2dlYmNiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpaa3dsYm9zamJaWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVtqcmtfbHRzZ1FRU1BQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1OXGNua1ppc3VwU01PUFBQT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0VDRUlWYmZrcXBubWxaTUxOTU5PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVDR0hJTltnaGdxbm5pZmRgX19YTEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8PUhZXFteZmxua29tbWxraWlqYlFHRUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7Oz1KWmhubnBqbm1ramxsZE9HRURHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHN0dHNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozo9RWBuc25ubGxsZlFCP0NGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN0cnF0eHh5fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk5PEhcdHVxZVA+Ojs9QEFAPTs7Pjw9PEBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5ent9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT48OkFqfGk9OTs+PT4/QEBAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9APFxuQD5ERT9AQUFbYzw9PTs6PT5BQUA+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3x8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo7bXdIODs6PT5BOklkPTw9PDg6Oz8/PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUjw9PUlMRkZ1d003ODg6Oz4+VmpBOzw8Ojo7Pj8/PT05Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3J5STtcf4N/enx3Vzw9Pz09PkVodEw6PT4/PT0/QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFHcnlrYoOEg4KDgH1ePkBDQEA9SnN7WTo9QUVBQkJGSEM9PEBEREFAPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEVudH2CgoGDfn2Edk1BQ0VAPz5Ze4BdP0NFSUpJSU1NS0VDRkdHRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8ent7fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVyQ0RFRENXdYaHh35YR0hKTUxOT09MSEdIR0hJSUhIR0dISEVDRUVFRkZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ1dnl7e3t6fH1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIlsQUFWdIeJh4eHiINXSExNTE1OTElGR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0ZJS0tMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiINWbISHhoaGh4iIh3xQS0xLSEhGRkREQ0NAQENDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSkhISEdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMS0pUgYOEhIKChYaGg4KGhYSEhoaGh4eGinVLSkZCPz9APz8/PDw8Pjs6PEFBQD48OTk4PDw9Oz47ODs/QUJAQUNDQkBBQUREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgICAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpJSWWFhISEf4GCg4KDg4SFhYaHiIiIiImMj2hDQT04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc1ODg7Ozs9QDs5OTk9PD47PD1BQ0VISk1MTEdJR09SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaIaEhIF+gYODg4KDhIaJioyMi4uJiouMiWBDNzU1NTc2NjY1NTg3MzU2ODo4NzY1NjU2NzY3Njc6Njc4ODk6NzU3ODk3OTc3Njo8QEdGSUdJRkVGT1NSU1NST1BQUlRlcHFzdHR2eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDY3ODg9Oj1FQ0JlhYOBgIKDg4ODg4aJi4qJiYqKioqLiYqKh2ZJNTlANTg4NzQ1Nzg1NTc2OTk3NzY3NjU6OTo6Ojs3OTg5ODc2Njk6OTg4Njg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXZ6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhIWGiYqKiIeHiIiKioyLioqMg2VQWkM6PD0+OTk6Ozg6Ozk6Ozo6OTs6OT09PT47Ozw8Oj47OTs7PDs8Ozk6PDg6Ojo6OTk5PD88PEFCREhJTUtJS0xXb3JzdXN2eHt7fHx7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuKi4uMfWpTPUJERUVCQUBCP0BDQUA+PT4+QD8/P0A+Pz09P0I+QEE/QD89QEBAPj9BPD48Ozo7Ojk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLi4uLjIqLdEVDR0pMSkpHR0hFRkhHRUJBQENFRENBQkJCP0BESEVDRUNFREFGRUZERUZEQEI+PEA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6e319fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0RGV4SCg4SFhYaGiImJiIeGhoaHiYmKi4yNjIyMi4uJWkpQTk5MT0pKS0lJSkpJRUNERkdGRENFRkRCSElLR0hHRkhHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E+QkJHR0lZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2NjYyMi4yBbG1VTk1PTEpMSklKSEpGREdJSElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4Nzw7Oz06PkA+P0BDRklJUF+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjY2MjIyLi459YFhQT05NTE1KSEhFSUlFS0lHSkpJSkdHR0tMTkxMSEhJSk1RTlBOTU9LSUdJSkhJRElISEZGR0dJR0NCQUNUbnB1d3d5enh5ent8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDk6PDg9Pjs9QT4/QURISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIyLi4pfVFRST09OS0pHRkJHSkdMS0ZLT0xLSkpMTUxPUE5ISUtMT1FRUFFPT0pISkpMSktGR0hHRkZIRkVFQkFCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uKjIyMjIuLjn1aWFRUVlRPTUtKREVHTE9OT1dVUVBPUVNSTVNUT01TTFBTVVZSU1FQTEpNTU1LTkdHSkZGSEpEREVFQkVDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09QkBCQkdWTkZOUFBUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyNj4yMjGlZWGtiRlRRUVBKOztSU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTVJRUFBRS0tLSEhKSEVGSUlJSElpcnZ5eHl5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0ZGRT8/QUFFQUNHRURFTFhSTVRVVlhafIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH5hiouLh21cZVY6WVlYU1E/QFZVWFxkYFZZYnJdXVddWlZFUVlaW1lfVFlnUlZWWFRUVlRPT01KTEpJSUxNS09NU290dnh5eHd6eXp7enp8fXt+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+i4mKjHpvcFlbXFtSVFJWVlVbWnWDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeEi35nWVlcWVRWVFdSUVdWY5aAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ11bXF1dV1JPU1BQUlZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn6AfF1RVlhVUlVTUVFMT01LZnlbXVRZVVZdWkxUWlVTVF5aWFdXV3prWFtcXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fHx9fn5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJVY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xV0pMTk9LTktJSkRFSUVDPlRkVX9SUVFOS1FUUU1PWVJNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXV1c3N3enp7e3x9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eXFlVUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11MRD9DQ0NDQkBEUEJDQUM9Q0lHVkBITkxHXWlQSEZORkRFRklHSEJESEdJS0dEQkFEQE9RTVJkcnR2dXN0dXp8e3t7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFNPVmBrbHJ2e3t4eXRybnN0c3l4fX+DgIODgoCCgIKBgmtNRz9AOzs+Pz8/Pz5rUEpgRUZISUVCP0dMTkdNUlVJQkU/Pzw9PD09Pz0/QUNDQD89PUI+Sk5HVW50dHVzdHZ4enx7fHx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXkpKUFFOS0xRUlFUVVVXUVFXVVBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZUNAQEI9OkJDQUFEQlxdT3tOT05OS0xNT09RTEtNV01IR0BCPDk3NzU5OT07Ozs4OTg6PzxCSD9cc3R1dXV2d3l8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BfXVpJSFBSUU9NUFFOUVJUVlhTUllUT1laW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEZGSEJBR0lFRUZETVJQYVdSV1FQU1NSVVtPT1FWUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxDPmVzc3Z3d3l5e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BWV15aWE1LVFRTUFFVT0xSU1RYWFRUWVJNV1laVlhYVlhZXVdXWGhza11WYXNrYWFfXmRhX15ZVFFOT05MSUhKTElJRkNRUFNbV1RUTlFTWVNcZVVPU1NRTktJSEM/QTk5OTg5Nzg4NTc1Nzg1OTpHbnF0d3h5e3t8fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1RWWFhZU1VUTEtUVlVVVVdQU1VXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTFBTU09NTU5OTkxKRlFQVVlTVE9KTk9VU1RcVlJVU1JPTUxJSEhGPz49Ojc4NzY1OTk2NzY3NVdwcHN3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF1SVFpWV1VUV1RSWFhZWVlTVU9KR09QT09NUkpQUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBSTUlMSk9SUFJSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9xdHd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSUdFSExIS0hGTE1QTUcvRV9SPjM/PmpvYVNSUUBHVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR1eXt7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRUZISk1MRUdDT1JDOEVOU11nU1FTQUdVUE9RUVBOTU5NS0xLS05PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydHh7ent9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUWFdVTExLSTw5ODc7PkA+PD1BQEI9PkVIR0NFRklHSkpARkFBQEZIRUpPSFFSYVxRUFJPU09PUExMT01MTUxNT05bV0tNUU9HSUhDSEpMTEpGRkZFP0JDPjxCRz9CP0FkcHN3enp6e3x7enp3e3d5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENEPTk3Nzk/Qj47P0JAQD5ARElFQ0dHSUdJRUJCPz49Q0JBR0lETU9iZVFNT05XS0xNS0xNTU1MTE9OU2ROSkxSSUlJRUFISkxNTkpHSUdCQUJAP0VGRUhES25vdnl5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR01NSk1QTVBPSEpEP0E9OTg6Oj9CPzxAQkFBREVHS0ZDSElHR0hDQz9CPz9AQT5ERUNLTlJUTEpJTVRHSUlKTEpLTElKTU1PUFJQS0dDTEdDQkpKTE1PTklKSUdDQ0NESUpNTElZcm13eXh6e3p5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFIS0RHSEhHSktJSktERkI9Pj05OTo7QEI/PUJCQ0NHRklLSkRJSUZHR0NDO0FAQj5AQEJFQ0lNUEhIS0dIS0RISUxNSEpMSElKTEtNXVJISERORkFDSkpNTFBNS01KS0ZHR0pNTlFOTGJtaXZ2d3p5e3p9cm1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLREZFR0VGRkdFR0JDQD48PTk6OjpAQ0A+QkNERUlFSUpMRklJR0ZGREI7QUNDPkBDRENER0xOSEtOSERIRUlMTk1HSUxHRkdJSUxOS0lHRU5IQkZNS01MT01NTk1LSEhJT1JRUk5SZmZmcW9zeHV7enxsaGpuZWtxbHNwZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lERkZFQ0NCRUBEQj4/Pjo7Oz06PT5DQT5BQ0VGSkZJSExIR0dHRkVDQD1ERUI+QUNDQ0RHSElHTVBKRkZHS05PS0ZISUZFREVJSkhKSUZIT0tDSU1LT01PTk9QTkpKSUxSVVVST1dkYGFtZ3Byb3J5emdlaGhkaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMSEVFR0NCQUJEPUJBPkE9Ojo9Pzo9PkBCPkBCREZKRUlGSUhGRkdFQ0JBQUZGQ0JCQkRFREdHSUZMUUxJT0pKTExJR0hFR0ZEQ0lJSEtKR0tSTUJOTk1QTk9PTU5PS0tLT1VXVlVTWF9eXGlhbWluaHJzYmVmZmRoaGZuamZtbWhra21yaXF2dHNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWpzdW51dHNxcmprc01HSEZIQkJBREU8QUBAQzw4Oj0+OT88P0JAQEBERkhFSEZGSEdGRkRDRUNESUVDR0VCRUdFRkdHRUpNS0hRTUpLSEhJRUZISEVDSUlJS01LT1NORFFSUFBRTk9NTlBNTE1TV1ZYWFVYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW55TUhHSEhCQkJGRTw/QkJEPDc6Pj06PjpAQj4/P0NFRkRGREVIRURFQ0RFRkdKRUVKR0NHSEZIR0VDRkpKR05LTEtISkxGSUlLSEVLS0xNTk9SVE9IU1VTUFJPUU1OUU5NUFdaVlpZVlpdWVhhYGBgXmhlY2BkZmhnamhoaWZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXd1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSEhHSURCQ0hFPEBFQkU9ODk+Pj08PEFCPT8+QUJGQ0VDQ0lEQ0VFRkdHR0lGR0tIRElIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5LT05PUlVWT0tVV1NQU1FSTE9RUE9UWVpZXFpZW15eXWBjXlxhY2tiYGRnZ3KFaGdpZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdExJS0lLRkJFR0U8QEdDREA6PD9APz4/QkE8QD5BQUZDRUVESUVGRUdGSEhGSEhJS0pGSkhIS0hGRkxJSEdKR0xMTUxMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUVFMT1JSUFZbW11eW1xeX19hYGFkXWNgZWZgZWhqZHNzZmpnZ2tvcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SktMSkxHQ0VERTxARkREQzs/P0JAQEBDQT9CP0FDSENGRUZJRklGR0RJSUdJSEpMSEhKSklMSkZKS0hJS0pHS0tNTUpKTUxOTk5QS09RUlRYVk1OVFZUUlJRUExOVFNSV1tdXl9dXWBfYGFhYGFjZWJkaGJkaWpndotsamlnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2bndLTExMTUdEQ0FEPD9FRUVDPUFBQ0JCQ0RBQ0RBQUVHQ0hHSEhHSkdDSElHSEpGSUxISUpNS01MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNQV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAQ0FFRERGQkNFR0NDSUZDSUpKSUlLR0RLSkdISklJS0hKSk5MTktJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BhdnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQkVFREZCRkZHREVLRkVKTUxLTExHR01JR0pLSEtLSUtLTkxOTExMSUxNTFtzYmRwXmxtVU1OZnNdZmZxbG50Z3BpX2FZbm5icHBia2pqZm9xdGV0bm9cb3VncE1KcXl2a2Fga2VlbXhsa3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElIR0VEP0FCQD5DRkdCRkNGRUZFRENISEdERUtIR0xOTktNTUZKTkhKS0pJTEtKSktMTU5OTU1KTU1OW3Jvb25wcGxrTVBRbFdNaWJ0cnBhbW51XFlsUVxtbVpxbWtvbXh4dHNpcF1fcmtxalV1eXhvY15rZmJncHBqam9wcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0dFRUVCQkI+QEBGR0JHRElFRUVCRklISEVITEpHTU1OS01OR0xNSUxLSUpNSUtJSktPUE9OTUxOTkxcaGR1XWxxV2xOUFFtVFlrXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdXlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SExGSURFRUNBQj1CQUNHREhHTEhFQ0NIS0lIRkpMTEZOTExTUkxHTExITkpJSE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5Zcmtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXnRjd3hyam56aGFhY2ZiYmltdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnNzdnNIS0hJQkVFRUFBPkREQkdESElNSUZDRkpMSkdGS05MRU9KS1dSS0dLSkpOSUhKTElLSkhIS01NTU1JS0tLU2tjW2leX2ljcnJaX1lqbl9lZVVrX2NbYWFRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydnR3ckdHRklERUNGQUBCRkVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRUhIS01JSEpKS0tJSElHS0tLTEdIS0tMTU1MSktNTlRbXFRQVExQT05PT1ZRT09RTk9RSklOUFFkcWlUWVdcW1xWWVtdWF1cXGNmYWFlYmNmX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0ZFQUVDQERIREZHQ0lLTEhGREdLTElFR0lQS0xPS0xXTElFRUhJSkhJS0lNSkhGR0dJR0hJRUZMSUpMT0xJUFxXXlBcW2BeTVhZU1xcYl5NWFpNWGFSSllhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CRENCRUlFR0dGS0pLSEVFSUpLRkVISFBLTU1KTVJJR0VBSEZKSUtMSkxKSEZESUZERkdFRkpIQ0pNS0xVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOXlxeU1peY15aXWBjYFlfY1tgXltUWFdZXl1jYmNhY2VoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNHSEZIR0hLSkpJREZLS0tFRklKTktOS0hMTkdIRT5HR0xJS0xLS0tJR0RIRENERUFGSkRASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFYVVVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR4eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUJFR0lGR0hIRkZJR0hHSEtJTERES0tOTUxLSEtKSElGP0dHTktLS01LS0tJRkdDREBEQUhJQj9JSkhPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYlxkY2JkY2ZYUVVUUVtXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSkZGRkhHR0lHRkZJTEpORkRLS01OSkxJS0pISEZCSEhRTUtLT0xKS0lHR0VEP0VDSUlCQkdGRVRdWV5YX1lfW11VWFhPXV1RS0pWXlheW11VWWBSUV9fYmJgYGJiYGNiYWRkYlhPUVFRWlJbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYSFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBSEZER01SSENRSkVHSEhFRktKTVBFRklKS05MTElLTElIR0RIS1FPTU1QTExKS0hJQ0RBRURJR0NCR0ZEV1VFXFRdU1ZfWE9UVU5aWk1JSlRgYVtfWF5eYV1PWWFcYGBfYmNiXWFiV19fVFBPT09XUVxbW1xcXl9iZmZlbGVvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGSERJUmJQQ1ZeSUdHSERGTUtQUEVJSUpLTkxLS0xLSUpHRUpOUVFOT09NTkxNSEtBREFDREdFQ0JFR0JNSEJLS09PTkxGTUZHSUpIR0xLTU9QSUxPUE9TT0xQU1JVWllXWVhYZFdPU1RQUE5NT1RTWlhYWl1cYGFkZWNnY2tscHNyeXl/e3p/hISEhYSEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFSEZHREtNXUxHR1hMR0hKSEdNTFFRSExLS0tOTVVOT0pKS0dHS09TU05QT05OTk5HS0ZgRURfTEVmZEVOW0leW3JtT01VbVlMRFBgVWtXZ0pdV1VeRExRVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalJWVVRbXFtgYGFiYWJgZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRkdGSEVFS09TSUpGYFRISU9KSU9NUlFLTUxMT1JVUk9PSUxNR0hMUFtZT1BQTk9PT0lKUX9RSXxZWXF0WVFtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbX1ZWWH9qdHV1Xl92XldhW1tmW19gYWFhXWBhZ21wbGBwd3R4gYGCg4OCf31/gHZ4emx2fnR4fYB8foCBgoR8gIN6f4F/fnd3TkpFSE1OQkRMTEZJS0VRVkxLTklLUlhXUU1PT01RVE5PUU9LS05HTU9SW1pTUVJPUFBQSkhaeF1UeGVoWlNVUnZndGxwYm5malFyT013bWpycHNycXJwb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29ycnt8b354boByX2BgYmFaYF9na25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnN8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEpKR0pQT01NSk5WXllVTFFTTlhaTVNTUk5LT0hRUlRZV1ZQVFBQUFFLSGd4bGN4cm1bS05WeXB1bXVib3ZQZWVJZnZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/b2hvWXZ2anV1cIBfcmZ9aWx4fG9eX19iYVtdYmRnaWlkZ2JjZGxscHBzdHNzc3lxcnhibHVncXl7c3J2eX6Bc3V6bnx9eXhybk5KU3VOQ0JGUFBISktJS1BPT09NUFpgWldLVFdQYV5SVlFZUkxPSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JocXVubXlwd2x2dHRybG5ddH56a215fGt0bHxrcHZ1eF5fX2JeXV9kZGlnaGVlXmFiaWlpamtub2txb21qcGFjZmNvd3hvbXBzeX5ucXBre3p0c29tTExbVkhHRUdSUElMTUpLUFFQUFBQV1xYVU1VWVVlWFJSWV5TTU1JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9acHp7XmB6c2Nyb3hxaGR9aXJ8XlRMbGB2dWtpdXt6bX54a3xwXF5eYlteYmRkZ2VlZWJaY2Npa2tyc3J2Z2xpaGRnYGFrYWdzcmxnbW1yfGttaGt7dG1ta21PSEtLSEpISFFQTE5PTEtSUlJPU1JXUlZUUFdaVlZUVFRhX1BOTUpUU1RRVlZOTkxNT1BKSFFOUFVMS0xTVFNTVFBWVVFRTlFRWFlSTlBVVFhYWFtbVVJTV1tXWFhaT1NVV1hYUl5ZV15WVFBZUldXV1dYXlpncl5bW1lcXV9jWl9jY2RmZGNjYlpjYmdmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdnanVqaGdpbFFJS0xMTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlXT09MTVZUUU5VU05PTUxRUEtKUVFLUU1LS1BSVVNRUlNTSUhMTk9RUlFRUVRWUlhXXFdTUlBSVFVWU1pRTlNSV1ZUWVZUWlZUUlVUVFRXWFZcWV5gXVxaWlxcX2NbXWJjZGZkZGRhWWBhY2FiaGhpbWJhZF5fY11aZFxibWFeZmVmbXNkaWdqa2VkY2ZoUEpLTE9PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFNQUEpOV1NQTlVQTlFOTFNQTU9VU05RTk1OUVVRVVFSVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXVlZZW1RQVFVYVVVaVVdaVlNSV1ZVV1tYWl9cVVheXF5dW11gYV5bYmJjZ2ZlZGJYX2FiXWBnZGZlYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FPTE1MUVFMT1RPT1NRT1FbWVdXWFtZWFlWXGpkVlhZWldWU1NPSk5WVFBPVFBQUE1NUlJQUlhUUVFPTU9TVk9YUlRVVU9OTVFTVlVUVFJUV1ZaXVxaVlZRUVZYVltbV1FUV1ZWVllUWFhVU1JZV1VaXlldX15VXlxeYFxbX19fX1piYmRoZ2RkYlhhYGJeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFPVVxaWldbW1xYWltkcW1oZF9bWFZVV1FMTVZTTU5ST1FST0xRU1JVWlVTUFBNUVhXUldTU1NYTU9PUVRYVlVVU1VYWFteXVtbVlFOVVZVW1xXUlRXVldYVlRYW1RTUlpYV1xeWl5fYFVhXGFhXWBiX1xgXWNgY2doZGZgWWNgYV9fZWRfYGJbWlxbXFlaWVhXXFpcW2BeX1teXmFgXmJcWWBaUU5PTlZRUFRRT1RUU1BXXFxcWF5cXlZcXmpxd3mAY1xbVVVXUU1PVlNOUVFPUlRSTFJUVFlaV1VPUk9TWFdUU1VSUlpPUFNSVltWV1dUVlpYXF1bW11WU01UVVVcXFZSVFZWWFlTVVpcVVNTXVhaXV5cYGBgVmFbY2JdYWReXGJhYl9jZmlkZl5bZGBhYGBjZV9iXllaXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVFJRV1JUUFteXl1bYFxgVVxdaGpyfXNsZ1xUV1dRTlJaU1JRVFJUVVRLUldWW1paU09TUVZWVlRPV1JTWlJUVFRYXVdYWVNYXFheXVlaXVRVTlVWV15bWFJVVVlZWVVXWlxWVFdeWl1dYF1iYl1ZX1tlYV9kZF5eY2NhXmVmaWRmXl1kYWBhYWJkYGJeWFpfW1xbWFhYV1dbWVtgXFtbXFtYWlteVl5ZXVBPT1JaUFpUVVZWU1RUXl5gXl5iXGBVXV5ia3l0bH1rWlVZVFBQU1xUVVRVVFZZV0xSW1ddW11ST1VTWFdXVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUVdSWVhZX1taVFVWWllaV1haXFZVW15cXmBhXmRjXF5dXWVhYWZkXl5kY2BcZ2RoZWRiX2RhYGFgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU05QVllRXVVWWVdXVVhfX2FhYGNdX1RdX2JlZXWBemhXWVlTVVNWXFhXV1ZWV11YT1VdWl5dXFRSV1NXV1VTVFhSU1ZUWFdYXV5YXVtWXV9YX19YXFZRWFRZWlphWVxWV1hbWltZWVpbWFdeX2BfY2JhZGRcYlxgZmFkZmReX2RiYltmY2hlY2ZgZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlNZVlNcVFZXWVZWXGBhYmNgY15fVltgZGFfenVvaFlbWVVXVFdbWlpcWVhZYFdQVl5cYGBcVFRYUFVXVlRWV1JTVVdaWltfXlpfXFZfX1pdXlldVVJZV1lZXWJaXlZXW1xbXFtbWlxZWl9fYGBkYmNkZGJkWWFmY2ZmZV5hYmBjXmJjaWRjZ19nXmFiY2FhYF5fWFRbWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNPVllWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheW1xaVldYWVxcXV9bWVtiVlRYXl1hY1xSVllQV1dXV1dWU1VUWFxcXmBgXWBcV2FeW15bWl5YVVhXW1tfYFxfWFlcXF1eX1xbXVhbYGFeYGVjZGVlZmJYY2VkaGdkXmNgYGVjXGVpZGVpX2ZdY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWVhbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNZWlhdYGNkX1JYWVBXV1hZWVdWV1ZdXV5gYWBfYl5ZYV1dXllcXllYVVdbXGBeXV9aWl5dXl5hXVxbWlxgYl9iZWNlZmVmYlpkZmZpZ2JfY15hZmRaaWhiZmljZV5iYmNhYGBfXVxaWFxZWVhYWlhXWltaWVdYVVVbXV1dYGBiYnhLWFdbWVZcW1xdWldcXV9gYmRhYmFdYFhiY2JhY2FiXVtcW1hXW1xfXWBfXVtgZF1cWFtiZWNhUlxaT1lYWltbWldaWWBdYGJiYGFjX1xiXV9dW15dWVlUWF1dX2BfYFxbXl5gYmNdXFhcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiXGNnYFxpaGJoaWVkYGJhY2FfYF9cXVxZXFlYV1hZWFdcWlpXV1hPWFpdYWNmZnJrf0pZV1xaWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBiYmJcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxeXl5ZWFVbX15dYWFgXltgYWJmY19dVF1gYGNkZGZlZ2VmZmVeZWZoaGdkZGBaZmdeYWhoYmhoZmNgYmBjYl9fX1xdW1pbWVhYWFZaVlxbWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4SCgoKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKCgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ1dXV1dXV1dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXp7e3t7e3t7e3t7e3t7e3t7e3t7e3p6enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnV0dXV1dXR1dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t8fHx8fHx8ent7e3t6e3t7enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx4xdTS0tLS1JN7fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a8homJiYmKgkU+Pz8/Pzubw76/vr69ytTS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXjV5+Tk5OTnmXt/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjI2DOjIzMzMzLqHSzMzMzMvZ5eXl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dn5/f39/f395d3d3d3d3eHl5eXp6enhvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx2dXV1dXV1foOCgoKCgoOEhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dHR0dHR3dHZ3ent4e3h3dnd6eHp6eX56eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3x8fHx8fHx6eXl5eXl6enp6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eH15fX18fXt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHp9fXx9fXh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4OEgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3d8en17fH18eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHx6fXx7fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4enl6enh7eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGhIOEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgYGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgYGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzc3NycnFwb29vb3Bxc3NzcnJycnN0dHRzcXFxcnN0dHR0dHR0c3N0c3NzdHR0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHNzcnFxcXBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3Nzc3NycXFwcG9ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJyc3NycnFxcHBwcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcXRxcnJxcW5/g25wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcXFwiIhwcXFwdJqAbnBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXF8ooRwcnCOnnxucHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXWeo3hweKCcfW9xcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXFwcHBxcHBxcXFxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycZipkW+Co51+cHFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4GDeXJzc3JycnNycnNzc3Nzc3Nyk6qlfIqhnXxyc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn18dnZ3d3Z1eHp4eHh4eHd4eHmhs6mnqaqXfXt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7fHt7iq+iobWpq6R/e3p6eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX19fX2ZpJahsZ+YppV9gH99fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYCBgZybjJ+woaCinoCAgYB+fn9/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f4CAgYGAl5uQl7CgmJSchnx+fn6Afn5+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjImGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+f3+AfoChrKWXopqcmaKhiIB+fn+Af4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4KEhIiQorKmoKGZnZ2mp6ypoZuSh4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI+Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODg4aNn62vpJqaoJudnJ2doKSinJOHg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYOJlZiWlZifm52enZqZl4+IhoeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4SEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGBhY2Uk5aZnJ2clY+Jh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SDg4ePlY2UmJCGg4KFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgYKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6RkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4GCgoKBgIaZiIyGgoKCgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAf4KJjoCBgoODgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZaIhIKEgoJ/f4yVgoKBgoSDgYGBgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmYuDhYSEhIKAkZmGgoKChIODgoOBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgZCMg4F/fn18fYycjoCCgYGCgoSUlIyBgoGCg4KCgYGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiIOEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlpeJgH19fX17gZiMgIOBgYGAjpSMkIGCgYKCgoGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGVn4p+foB9h4t+hISDhIKDg4KNiYWMgoKDgoOCgoODg4KDg4OCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf319fYCDhIODhIODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkZKMioiFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDiZGDhIuFgoGBfn2Bh4aDgH5+f39/f3+DhIOEhISEhISEhISEhISEhYWFhIWEhoWFhYWGhoaFhoWFhoWFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+gICEhISFhoaGhYWFhoaHh4aGhYaFhYaHh4eIhoeHhoaGh4eHhoaHh4aGhoWDg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4mIhYaFg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf35+f4B/f39/f4CAf3+Af4CJhYaIiIiHh4aGiIeIh4iIiIaGh4iJiYmJiIeGh4eHiYiGh4eHh4aHhYODhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhYSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4OBgICBjImBgIGCgoGBgYGAf4B/f357e4KGh4mKiomJiYiJiYmJiouKiIiIiYmLi4qKiIeHiIiIh4eIiIeHhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSSkI+RjoqGhYaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCgoKCgoB/fn19fX1+fnx7e4uMiIuKi4qJiIiJiYiJi4qJiYiJiIqKiYuJhoaGhoeFhoiIiIiGhoeEg4KEh4iIiIeFgoKBg4OCg4OEgoGCg4KBhIOEg4GOk5KQj4+LiYWFhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX1+fn5+fn59fn19gZeQiIyOh4eFhoeHh4eIh4eJh4eGiIeGiYmDg4SDhYSEhYWGiIiGhYOCgoOFh4aHhoaEgoKDhIKDg4SCgYKBgYGDg4SDhJGSkI6PjouHhIaGhIKBgYGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoOBfXx9f4B/fn5+fXx9fnx6hJqTloqDg4GCg4SGhYWDg4WEhISEhISFhIKCgoGEhIGCg4OFhoWEgoKBgoKDg4WEhISFhISGhIOEhYOCg4GCg4OEhYSHkpGPjY+MiYWEhYSFgoGBgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAgIF/f4CDg4ODg4KCgH19f4CAgX99fn59fH19e3p6iJ2Ng4KBgYCBgYKCgX9+gYGBgoGDgYKBgoKCgYOEgH+AgIGCgoCAgIGAgYKBg4GBgoSDg4WEgYOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgIGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5+fn1/goODgoOCg4J+fX5/gICBgH59fX19fn18ent7ioWCgH9/f39+f4CAfn2Af36AgIF/gICBf3+AgYF+fX1/gIF/fn5/gIB/gICAgH+AgoCAgoGBg4GBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GBg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foCDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp7g4SDfoB/fn59f39+f4B/fn9/gH+AgH9+fX5/f359fH5/gH5+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhISCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/fn1+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp6enl+lpODf4B/f35/f36AgH9+f3+Af4KAf3x+fn9+fn18f3+Af35+f36Af39+f3+AgH5+f39/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH59fX5+fn9+fX19fX18fHx7enp6eXmCi4SAgYGBgICAf3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAgH9/f4GAfn9/gH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WCgYODg4WEhISEhIODg4SCgoKCgoF/fn19fX5+gH19fX19fX19fXx6enl5eXqAgoKChYOBgoOBgIKAgoGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fImUkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgIGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYSEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fH19fHt5eXl5eH2Cg4SFgoGEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoGCgoCAgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGBgYGAf4B/f4CAgYB/gIGAf359fX1+fn9+gIOEh4eEhoaGhYaGh4eGh4eIh4eHhn99gICAgoF+fX19fX19fX19fX19fHx+fn58e3l4eHl5eYCDg3+DjISDhISEl5eDg4SBfX6BgYKBgYGCgYOGiIyFg4KCgYSChIOCg4WEhIWDg4ODgoODgoKCgoODgoKRkIuIiIeJh4aGhIaFhISEg4GCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gICAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHh4eHiIaHh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXl5fIGBfoiWg4ODhISUk4CBgX9/f35+hIuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhISEiJKPjImIiImHh4eFhoWEhISCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eXp6e3x+gYOBgoGDgoB+fX9/e4iRfHyOln99f3+ChoqFg4OEg4KDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYOEg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhYSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp5ent8eXl9fX+Af4B/fHt7fn59gpWRf4SIfXx+f4KEfHyBgoSDf3+Hg32CgYCCgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4ODgoGCg4KDgoKBgYCAf4F+fn19fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9fH5+fn9+fn19fXx/gYB9ho+Bfn2Cfn9+gIJ8fIB/goCBgH58e4qCfYB/foGAgIGCgYKAgICBgH+LlJCMi46OjYiIh4WFhYSDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGh4WEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fXx5ent7eHh5e3t6fIKAgX9/gH1/fn9+fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSSjYyNjo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoCBgICAf36Afn9/f35/gX58e3t8fHx8fHx8fHx9fXx7fXx8fHt8fHx6enl7fHp9hYODgIGBfoB+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fXx+f4CBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6NjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+ChIaGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhYOAgIB9fn1+f36LhIGHfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn18fn+AfX6Afn9+hJKNjYyPjYyKhoSFhISDg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOBen5+fH5+gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fX17fHx8e3t6fX6AgIODgn9+f3x8fH18fIGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CLkI2NjI2LioiEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn1+fX19e3t9fXx6fHx9gYKBgICAfX19fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISDgYKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9e3+BgH9+f36Af39+f39+f4B/f39/f39/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5+f35+f358fH18fH18fX57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJiomKiYWIko+MiYqHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn2AgIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDg319fXx9fH19fX19fXx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+goWIh4iKi4uLiYyRkI6KiYaFhIKCgoKDg4ODgYGBgYGBgYGBgYGCgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fX1+fXx8fH59fH18fX19fn19fn58e3t7fHx9fHt6e3t5enl5eXt+f4ODhIeJioiJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2BgX+BgYF/f4B/gIF/gICBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+g5GEhIOBf359fI2HfX1+fX18fn58fX18fX1+fn1+f3x9fXt8fX58fHt8fXp6eXl5eXp7fn6AgYOHhIiPjouKh4WEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKGhYSCgYGCgYKBf4CChIF/foGAfX6Bfn1+f4CAfX6AhIB+fn99fn18ioV9fn99fn6Afn19fHx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX19gIOAiY6LjIiFhYWEg4KCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICBg4F/gIGEgX5+gH99foB+fX5+gIB/gX5/gH9/f4B/fX5+f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fn18fHt8fXt7e3x7fHx8fXyKiomJhoaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgYCAgIOAfn6Af31/gH19fn6AgH+Cf4GAgICAgYB9f39/gICAgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e31+fH18fHx7fHt8foqHh4WGiIWEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+fn+AfX6AfX19foB/f4GAgYCAgICBgX5+gH+BgH+AgIB/fn19fX59fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAiIOEhIWEhISFg4GCgYGCgYCAgoKDgYKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4GDg4ODhYSFg4ODhIODhISDgYCAgH+AgX59fX5/fn5+foB9fX98fX1+gH+AgICCgICBgIOCgH+AfoCBfoCBgIB/fn5+fn59f35+hYWBgYF/gIOBf36BgH9+f3+Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoKAfoCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf3+Af4CAf4CAg4KBgH9+gIB/gIGAgYB/f39/f3+Af4CBgoKCgX+Ag4J/f4OCf3+Af4F/gH98enx6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBf3+Af4B8fX1+gH1+f39/fn1/fH5+foF/gYB/fn+Af4GDgoOAf3+BgYCCgYGBgYCBgICAf4CBgICCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fH2AfX+AfH9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhIKEhIWEhISBg4KBg4F/gIF+foB+gH19fX6Afn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIGDhIKBgIGAf4KAgIGBgIGBgYODgYF/gIOAfoKDhICAgoGCgoSCfnt7fHx8fX59fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgICAgICCgoGAgH6Agn9/gYKDgYGDgoODhYN/fX19fHt8fHl6e3p9eXt5eH9+e3x7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hYSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAf39/f398f39/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+AgICAf4GCgYB/fn+Bfn+AgoKAgYOChISGhIB+fnx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB+fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1+gICAf39/f3yAf3+BgIGAgH98gH9+f35/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e3+FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAfIB+gIB/gYCAf32Afn5/f39+fX1+gIGBgH5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIKAgICAfX5+f4B9fH58f4CBgICAgIB8f3+Afn+BgH9/fYF/fn9/fn19fH+AgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3e3l3eHd3eHt7ent8hYl9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYKBgYKAgoCAgIB+f35/f318fn6AgYKBgICBgX1+gH9+f4F/gH9/gYB/f399fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgYGBgoGCgIGBgH+Af39/fX1/foCAgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh6gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgYCBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e49/d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoGAgoGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3p4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgn+Af4CAf4B/gICAf359gH9+f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYKCg4CAgoGEg4OEgYGDgYKCgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgIGCgH+AgYB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58e318e31/eHd2eXl6fHx8fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCgoSEgICDgYaDg4OBgoSAhIOCgoCAgoKEgYGCgYSCf4CAf4GDgoGAgYGAgH+BgYGBgYOAf4CDgn9+f4KBgIB/foGAgX+AgIGAgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/f4R9fX18f316fX97enZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfH9+fn59eXl7enp6eXNydG93cXd5c3d7hYKCgoKDhIKDhIOAgIODhoODg4KChIGEg4GDgICCgYOBgoKBgoF+gICAgoGCgYGCgoCBgICAgoKBhIB+gYOBf3+Ag4KAgX+AgoOCgIGCgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cXl0dnh0dnuEgoOCg4OEgoSDg4GCgoSGhIKDg4OEgYSDgIOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhICChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoGDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX+AgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgYKDhYWFg4OCg4SChIWCgoGCg4OBgoGCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgoCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKAgYB7fYF+fHl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICCgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSBgoSGhISDgoOEhIGEhYOCgoKDg4GDgYKAgoB9gICBgoOCgoKChIKAgoKDg4KCgYCAgYOCgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn+DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16enx9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX5+f359fHx4dn92d3+Eh4OCg4aDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOCgoGBg4J/goOEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fn1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIhoWEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBgoOEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDg4KDg4OBhIOBg4OEhIOEhIWEhISFhYWFhIODg39+gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4OFg4SDhX9+goqLhYWEg4KEhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4SDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKEhYuJhISEhIWFgoeGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeYN/f39+hISCg4KDgYOEg4SEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fn9+foGDgX17f31+gH59fHx8fX19fXx9fX6Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygoR+g4N9gX1+f35/goOCfH+BfX+AfX18fHx8fXx8fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYSGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cHuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdtenNugId5bX1yc3Zzdm1ud2xweWx1fX9+fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYGAgYCAgIGAgICCg4KChIWHhoaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29sd314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fnyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIWFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYSFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39/en59fH99f39+fYCBg4OAgoOBgYSCgX+BgoB9f3+Bfn9+fn+BgH5+gYKAgIKEh4aDg4eEhISFh4aFhYWFh4aIhYWGhYeHhYaEhoaJiIWEiYuIhYSFhYaFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX17fXt8fXx/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhYaFhoaFhoaEhoaGhoaFhoeHh4aGg4aFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SDhYSFhIWEhoOFhoWFhISFh4aEhIWGhYV9d4WDhISDgoF+f357fHt+e3x8fX9/fXx/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fIB+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWHhYWFg4SFhoWEhoaHhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaFh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISGhIaFhIWFg4aGhYaFhIaHhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9fn58fH59gH59f4B+foB/fX18gH1+f35+fn98fH1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYaGhYKDhYaGhISDhISDhIaEhoWFhYWDhoaFhoWEhoeFhISFhYOEh4aDgoOEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2Bf3x8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFhoiFhoeFh4aHhoeFiIiHh4WGhoeFhoaEgoSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4SHg4SBgoSFg4GAgIF7e359fHx8fn18fHx9fnx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4SGhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4SCgoJ/gHt9f318fHx+fXx9fXx9e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoeGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4aIhoaHhIOEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9/fnx8fX99fH19fH57e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhYSFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFg4aGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYKCgYOFgoN+gYKBf4SCf35+f35/fHx9f317fX18fnp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8fImHhIaEhoSGhoWEhYaFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhISHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFiIOEhYSGhoaHhYWEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAhIOCgn2BgX9+g4F+f3+AfH98fX1+fXt+fXx9eXp6eXt8fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeFh4iIhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SFhoaFhYaCg4OFgICBgICDgIOAfIGAfn6CgH2Af4F9gHx9fn1+e359fHt5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KBgIKBgICAg4F+fn6AeXp9gIOEhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFhoeGiIiGhYiHiYeGhYWFg4aEhYeDg4aEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoSFhYKCg4R/foCAgIGAg4B8gX99foJ+foB+gH9/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18f359fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhIWGhoeHh4WFiIaJh4WEhISChYOEhoKDhoSEhoSHhoaFhYaDhIWEhYaFhoSEhYSFg4WEgICCg39+f39/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7fH19fX2AfX18fH2Af318hoOGhoWGhoOEg4aChYGBgH9/gIB+f4GBfH5/f36AgIKCgoSEg4KBgoSBgIOCgYCEhYSCgX+AgoOChIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhIWGhIaGhoaGhYOEhIOEhYWFg4SDg4SChISAf4KCf31+fn5+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp8fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4J8fX9+fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGChYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFg4ODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYF+gn9+f4J8f359fXx8fHt7enp6enl7eXp6eXp6ent8eXt9e3t+f3+BgH1/fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH5+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgIGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fH59fH6DfXt+fH2Af4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMzMzLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PkJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtBPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT47QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NXV1NLT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01PSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vKysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fY2djY2NjY2NjY2dnZ2dvc3Nzc3Nzc3dzb29vc2tPS09PT09PU1NTU1NTW1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtAPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi3qaenp6enp6enp6enp6mXgIKCgoKCgoKBgYGBgI/S0tLS0tLS09PT0tPT09zj4uLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5FybGlOU2JMTFZNPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS1BGntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7s6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OjoIaEhISEhISEhISEhISIZ0BERERERERDQ0NEQz9c09PS0tLS0tLS0tLS0tHg7Ovr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYd2xpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUJAODw6PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0dLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpaKJh4eHh4eHh4eHh4eHimpGSUlJSUlJSUhISEhDYNLT0tLS0tLS0tLS0tLR3+vq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDw+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzdDS0tLS0tLS0tHR0dHQ3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamnkI6Ojo6OjY2NjY2NjZBzUVRUVFRUVFRUVFRVUWrS09LS0tLS0tLS0tLS0t/p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Ozs7Ozs7Ozs3Nzc3Nzc7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Ozs7OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tDQ0NDQz8/Pz8/Pz8/PzcrKysrKysrLy8rLzMzM09TU1dXV1dXV1tXW1tbY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7OztHUz8/O0dLOz9LU1dTQz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX1tbW1tbW1tbV1dXV1dbX19fX19fX19fX19jY19bW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztO7nc/P07iez9GcgoSKxs/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK1lZuz1bKXmbm6lbi5r6HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/Rn6CqrtSco6iy0ZJ9fq+w0c7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw5Nj9CP0I6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0cWHmrHVw4aatdXTzZ6ew9DPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Wp5mx1NajmLTU08CgoNDPz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P1KSZsdTVopm01NWwoqnU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NSkmbLV1aKZtdTUo6G61NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDR0RBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NDVpJqz1dWimrbUzZ6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkmxdXG9naGJdT0Y/SEhGRUA8PD4+PD09PDc1Njk5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPQ1aSas9XWo5q218OfoNLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HH0tajm7HW16KbtNqypKbW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09HVtYLD09Wxg8bWuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw8P0dFR0tJPTY2Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oz05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dHD1NLS0MPV0dHC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/Pj5BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS1NLS0tLV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6Njk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxBQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+PEhGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0RFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8Ozk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6OTs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Firzd29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tvc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv72+v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq5urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi3t7e4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3uLe2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKipqqelpKOioqKjoqCioqGhoaCgoaGio6Sjo6WlpqiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7a3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelpKSioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSmpaWnpqWnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6SlpqakpKOioqOioZ+fn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk+NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqSkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoKCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PjY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKunpqCdnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqenp6efm5qboqCalpeVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn5ybnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWjoqWmpqamp6amoJuZm6Ggl5KTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlp6empqKenJ+hn5eRkJCUl5udmJaXlpibmZqampqamZeYmpuhoZ+en52cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoKCfoJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjY4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNAREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaSmp6alpaampaWjoKChoaCZko+OlpuZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5iVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaGhn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9CQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKjoqOkpKampaSko6KhoZ6cm5SZqpybmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+foKChoqKjpKSkpKKhoZ6bmpmaraqemZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6ChoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKKwp6GioqKgnpybm5uarnl6m5ucmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaCkpa2nn6CgnpyZmZqZppNLgZ2dnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuam5qam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goaCfo6J5qqSgoJ6bmpqbnahaSYSfnp6cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+ipKSioJ6enJuampubmpiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnp6obW+rop+cmpqcnKyCS0+Hn56enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZyapIhUhKibmpmbnJ6qZFRRiKCdnZ2cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubnJqamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxRPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmaCTYmKbnZibnZuilmZdUYehnZ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJyZmJmcmWVjfZyYm52cpIdnXFGCop2enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXExGPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ucmZmZmqRoZ2aIl5ycnpx5ZlpUg6Ken56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZifbmVibIadnZ+Qb2NWV4ehn6Cfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmZn3lzcl54mZyhjmFZU1qOnZuenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOTc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0JAQUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qalpKbn5R5mqihqpR8YlJgkJKOkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkY6gn459YompmJpug4drcIiHgo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg3+MqI14aVJwnY+MVm15e4J+f4KSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5+kKB6T0NJdpSDg0lXb3N3gnuGjo2Lho2UkYuQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhYCBgKCUUzQ0O3mFdXJDOE5rb4CHio6LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYB+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYt/iI2Mi4uHkY+hbkZkVT96emdkTDw5TW51jYqJkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmQnqGdk5eboZqdm6KkmFF0sJFIe4d4bVJpf1lXcYiQjJiaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6mprIRfv9isRpKjmpBda4J7Xl6DoqGknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipqmnqKZver3AqprMqJ6zmkhWhHBSeJ+pp6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkqKeanaSlo6KicoGZro7JzrKesLJuU76gVGyUo6KgoZ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmVkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioKOnoaaupqacoI19hXuG0L2Yl6icclKarGdjjqOdoKCenaCjmpaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqmioKKoqq6xsq6rpKmYiHtqnb3Dq66eiXZkcHh6doejpKejoZ2gopmVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFVcaGRvY21paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKehnpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqevt7a0s7aysLKniXVeTpafkI+NgHtzcHNxeHx+hZKdoaSjoqSbnaGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7K2u76/wL/Fv7Wrk3BmWEd3gHN1enFuaWhiYmlpb3Z3eH2DjZijqKympJmhpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odmtxaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW6yNLZ3NXHuq2fkHhcW09FXmtlanBoZGJnWVddWV5mbm5tbWxugajIxruip6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FpYGZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PExdni38+9sKicjXhiVVdNRV5sYWNqZWFiaV1VXFdZWl5jYVxjgKnFwL24qa+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3bm1bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrzHx87QxKuNe29cU1RWS0BebGVmbmViXmZhVVhaWFZXV2KDpba7uau0sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Ef2pmaGFrbGdudXJydXFnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/xMLGycnApIhaTEhKTkg+WmBibHFoYV9lXFhVU1RRVoC2w6+sqqqqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3VrbG5kb21pcXhveWppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIx8bExMO4s8G6oHdMSlFJPU1UYmppbmNfX1pcVVNaf5qtt7SrrqWko6ekoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiMlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent3bmtpaHZaZnJ4c3pnZ15kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDxMLFvbu+kWVWS0JKPV5WWGtnW1pZWFZwkLCxq7i1s6ypo6GtqaynraCstbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl2dWVmaWpoXmpvbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMi/xsa2oGxLWUFScnuAWlJQU2ufvsC6vbu8urysraapu7q5t8CztbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aWpqdG55bF5kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnNxcXFxMnAqo14b4yZnVNPcZ/C0sfEwcTHwby+tLGwsMK+vsHGwL+4tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ9eHBnYGtqd2xpZnVvdGNdY1VXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwcHAws68c2qFmZdakcvLzc/Ftr+/wMC6u721s7PAv7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5gHNwZmVmY2tkYmttb29fWV1XVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvbzCwZmAjpmIf9LLxMjRwa+9vbi5u7u+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFlYmFjY2RqY2djW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Au7/AvLvEvbrAxL+9vba+yKSUZo/NxL/Ayb+wwb+6t7u+ubW4tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhYmNoamdnamVqXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdWNur+7w7W6x7e2ubu8uLm1usTJpkKLyb+/u8G+uca9wr+8xbi2t7S4tra7u7i2tLe6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVmcGplbGhYWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vM/EeKnMvce3ubittrS3ubO1srrFyppGgMq/v769vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucWdxa3RmYm5gXFRIS0tESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTXrnSBu8jPwsC4rrW1u723ubG+w8eOTHvNw8K/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHJmbGpudW94Y2hiXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsfJ0plxdK7R0czKxLW6v8TIvr60vsDAe1lzy8bCvsG8v8PMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGxsbl9jX2FiTkhOP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQwrq+vMS+t7zAv8nPx8jKysGGcnSmzMzLzcrGwsPLzsG8uLy6sXJpZrvIxMDAv8TAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIe21teHxgcWNbX2BfVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u7q9rDvra+wL6+uqacqbK2w8CleXZ5nMTGy8jBw8DAycrBv7u5saGBeHGuyMXEv8DBv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO1uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXpuc3h0aHBeXF9dWlJGRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vEt22tzr22ucC9q31uaG5tcoGVmHN4fZi9v8bAucC8vsXEvb24sa+clYOInMrCw7y9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsbess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bXV7cW9qXGBgWlNQQUZJR0tARUNJPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5udm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbJ2gbO9trXCpYdpWl5gTVJbW250d4KhuLjCurO7t7u9v7q7u66jnp2OmX+/xMO+vL+7u7i2wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z2d29xYV9mXVtVSj0/P0dHPUdDQzk6NTs5OT48PDk6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmnhXiKoK+1nWpmZ1ZZYElJTVBUbHeHprC3vrmytbK8uby2ub61laCrnah0rsnEwL2/ubOusry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYVxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVm5WNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/Fqoh8doyhmGBUQ1hVR2FqVk9FSmGOoayvtrq1tLKsvLm4tbjBvYuas6aqdKbLwr+5urWupayzsaawraidoJ+lrba1wre2tKWoqqiwtrOyurW7u7u1uLawtsSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3ZzbmNeZ1ldXVNPTkE/SkNBSkpANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJqRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7SQgnmIkG9PSj9kWUJOd4CUak5BXIKwtbO1srSvrLu6uLa5v8Z2hKygnGWpv7i1srGtrZ+kpqedpKWclpmZmZ+prrmsq6ufpaikq66vp7Crr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ3c211amxdXGtVXlxQTkhER01CR05GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhHxYRkFPh1lKSlh3jYFjQVOjubO0srCxrbC5uLa7t7u8kKKxq6RzrLCpq62ro6ihnZ2el5eglZKWl4+Yn6iupKOkoKKmoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeWh1dG5lVWFkV11ST01JQElTRU5DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yvKmYmZRoTT9SeHFQSUlLZ5yAWkVTr7uxrLOvrqyttraytLWuqaaempudn6aonqCoqZ+hp5ablpeOnZOPkJaNl5ukqKCgoqKhpaWco6OgnqWgpKylpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CWlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoYh4g3x2f3pjd21uXVFpVVBPR1BNTUNQUkA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3CqqW9aERSnYJRV0lKYEpVjWFkY4GutaqytK6qq6+wsrOtpZ2Rl5OPl6CfoqCco6SfnqiUm5aWjJeRjZCXk5ido6qfn5+go6WonJ+goZyin6OoqJynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJWTkI+RkZmQlpWYl5+YnJmbpJmXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fH91dn1ubHtkaVZSZE5KSEdPU05LTkg8RUA8MkA4NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaCqxr/KoFBBc512T21KS2NmdHNgW2BxkLGvrrO1qqasrKObmZSNkZWWmJicn6KinJ2knpqkl5eXlpCSkZKTmpeboKSqnqGhnqanq6KfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqKlopqZnq+orrKrpquqoJuYmJiVk5aak5WVmpabl5eYoZ6cnJaboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3l8ZXl6YGJTVWFISUpLU1RKU1FNOT9BNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpMbGjFdTSmWkWmV9b3JcUWtjW2VgXmuPtLCwuKymoZydmpSXmpmQjpGVkYyOjZOZopyXo5mal5iZlJmYlp2bn6WmqaCmpJ6nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKehoKOxrrKxtKqyrqOZnJ2eoZibm5qXmZuUlpuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2mCbGZcU1paTVFLT09WTVNNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp+qo4x5VWlxdnVwY3Z2WFhjYGNoWllXZ62urK+nn56ioJaQk5ugm5mXkpOfnKGjm56blp+an5ebop6loZ6kn6Sora2prKmkrLS3trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7a4s7itsrSkoJ2loKyhoaKhoJqYlpWfm5uYpaGgnqOhoJ+bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCgH14dmp4dV5tW1JhSVJVSEZVV0pDTUc9S0k4RTw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCjgG+CcGBjWExbUlpNTFBYUkhNTUeYrKqppaCfmpKRlJiYlpaWjIiLjpWdnZ2cnpeemaafoKilsaqnrqOrrrawtbKxrra4vb+6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquusbm4vK+zsLXCvLe+s7O1oqyiqamyqauop6iamZ6aqqegmaegn5+oqKWknp2qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhX52cm1pd21pblxYXENXTkpHTUhDRk49Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOenYpiV15lYFdNUUc9P0BDQz8+QlF4qa2pqqafnp+io52enZqdm5STlZSenpiUhZ2aoJqrpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyb+wubm9ucK+uLS7xsS9w7y3s6qzraqztK+zrqqvo52sqLaxraOwpqGjsLGusKSlr6OhoJqhpqGkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF8dHJrbHVycWhXXFFGVUhESlBJP0VCNEZIOTU8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw8Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqgn5V8X15lYFFHRTxDPkY8Pjk2Tn6qs6ejo6KgnqWrpp6XnJSRmp6ZlYyKhoiGeG2IoKSiq6y0vLbDvb6zu8HDwsXAv8LGxcXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Aw77HxsK3w8rJw8HHv7q0uru1u7ewtrKqurKuvLi/u7qruK2rqri7tbyurrijpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrZGlveGtlWlxGTE1FRFRNRUNFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz49Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9c2phV09FPklafG9iQj1cjq6soJmbm56emZeXl5KNj5eXlI+NkIyCg4J3cnFtcI+mra60ucW7zcfLvsHMzc3MyMjQzMzMx8rFxszQ0tXO08m9wL/Du8bFyMXR083T0NPTzMrBxsbGysjPwMnRzcfGyMbCvMTBvr+/tr6zrb/Aw8PHxMfEr7+5sri9xMLCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXRzZWJncm9nXlpaRE9NREVQSURDQTU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E/PEA/Pjk7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ2VamZdVElEQT9Lhp6lmYSgsq2jnpyfmpiXlJKUlpGQj4yHhISIhoOAgYGAeXFyb2x5pLa6ub7LwdPR08jNztHT0dLQ0NHRzc7P0MXN1NXY0dfNxsfJzMPFys/K09fR19LV1tPUyMzGzM3J083O083GycrKwsbMx8nJxr/Ds7PIxcvLy8/Hyr++v73Bx8XMzMnJwMPArq+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuWkIyGkYuAe3J1dmdjZ3ZqZVZYUkRORkBJUUM+Qj06MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hnGJUTEpEQz9DUq/RvbKvppycnKCkoZ2alJOVlIl9eHFrZWJocnBye4WKgHVwbnFzcIWzw77F0dDX1tXS1s3U1tbU09HS09TSz9LD0NPW2NXV0svKztHLxs3SytLV1tnW2NPW2M3Sys/RzM/RzNPQwMnIy8TMzczPz8XHyLbAy8DSzczQxsrJwMTDyM7N0NHPzcrIzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYGVyY11SXEpLR0FFSUo+O0E4PjU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoqFaSUBBREFGUXayr6aalJefnJqgoJ6bnJqViXdpY2FfX19fXl9fXWFsdXNwcG9scXF1ksTIx9TW19fW09bQ1dTZ1NTOz9XU1NHRzNHN09fW09XQz9LT0cnT0cjQ2NfY0djS19nU1szPz8nN0svO0cDGxMnHz87R0dLIzM3Ay83G1M/Mz8jEy8fHyMzL1NTR1c/SzNPCucWxpai1rqebqKulnbKosLOtrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYmNpbV9WUWBKSkNFQ1JNQDw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD9APUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu32NTV2dnRztC/vMzJtr6upqqooaOsZkM4PT5EWIKqqJ+XlZeZmpyfnZicnJJ9cWVjYl9fYV9eYWBfYGBfYGVtcHBua29ydneczMHT1dPY2NbZ0dLS18/TzsvSzdXU0crPzNPW0tHVzc/V1dHF0dTK0NTV1s7T0djX19fLyM7Eyc/MyszAycHJys7Oz8vQzs7Mz8/IzNDQy87Lw8rHyc3LzNLTztTS0dDQyr3IubCuu7m1q7awrai4rbO+u7GajqCUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Bva2FkbnBhWFxbSkZGRE1YRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PT9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Onn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksXpIRkI7V42hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYF5gX15cYm1yb29zdHV2eaS/zNXR1tPT2NbOztPLzs7FzsrS0s/Hzs3N1MvO0s3L19bQzNHUy8vQ0tPKztHV0tXVysDKwcbNwsnKw83ExsnLy8/Kzs3QztTMxsnQzcnHy8XHwsbKzM3Q0sfQz87OzNDFx8G4ub3Dw73DubOyvrG7w8S2qpiloZiWkpWVkouUjZqRlJSPj5WCiYZ5cXJrbWhgYHFoWVhoVk1HTElQUUI7RD87Njg6ODo7NTc9PUA7Ojw9OTw9OT09Oj46PDc7PTk7QDw+Oz4+QTw5PT49Qj07Nzc2Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMrV1tna29jMzM/I1tXEwrWvtKigrZd4bG9wd4+ajYyXlZCTkZGVlpWQi3tlYmJiYF1eYWNiYF9gYGFhX19dW11ncnJwcnNwbXJ5pcfTzszQz9PUycTIyMXGv8PFz87HxcfNytHIy87NxtHS0M7M1MrHys7Px8fP0svQz8W6xL/Gyr3DyMrOxcPHwMfNyMTMyszPyMTE0MnGwsbJxb/Bx8zLzM/Cy8zJx8vQxcXHu8fDycnCz8G9vL+wwcnHur2qsbKnpZ2inJiQm5CjmZeZkZWYiY+CeG91ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7utpLZ+Z4KFoqqTjY2Wj4WDg4OBfYSEfnNgW15dXmBeYGNkY19dXV5fYGBfW1pcYGxycW5va2xvb3250cvCws/LzcS6v8O6u7q5vsjGwsPAw8jKycjKyMHFzMbIys3JxMHKycHBy9DFy8i/ucG8xse+wMbPy8TAw7vJx8m8ycfFysG+wsvGxcS+xr29wcPFzMXGvMDJw8XH0sTByb/KysbIxtHDw8bDrsTLx8PKt7+8urSprKSlmJ+YrKOhppujoJuVfHdzdWZqW2FubVpcWFJETEdCR0VMREZTQDU0MzM1QD0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srC2bF55fJ+RipKWhnqAhYV/dXh1cnBfW1tdYGBiZGRkZWRgXFxeXV5eYFtZWlxib3Jua2lrcG9zj8i7mMDMwMbBsLa5sbGzsbDBu7u8urjBwcHEvr25vb+5xMrFxsK9xsC3u8PJv8HJu7a7usbDv7zCzsPGvr61wb3Du73HvMO6tL3GxMLDt8C2tr6/u8zDvba6yLu/vsvDwcbDxsnHycbQxsLMx7LHycPOzcHFw7+9srewsqeoqLmwpa2wqq2slHp3eGtlaGBob2RWXllKRkpGSEtBRkJGSkE5OjY1ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1dfNys7FycXHwbrFvayupmBjdYGSi4iLhHh/hoZ/fYN7dHRjXFxdXmBgYmNiYmRlYl1cW1xeXF5dWltcXmhzcW1nZ25vcnmbjp/Ew7rAuK2wsKaprault7O1tLOztLu2vbK3sLSusrvCvMHEvL+6tLK6vsC4yLi0vLbBwr24vcfBxLu1r7K1ur+0xbi7tay5vb7AvbG7trC3urPGvLevu7+1t7XFvL/DxsDExcbHzMXAxsa7x8vAz8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpGQkRBRUY/PTo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDLzcjJyMrJysTQzdLPzcXHwcXBv7q4ybersJlbZ2+JjoaIiXp4foaGdneBfHNoXV1dXV9gX2BkYV5jZWNfXlxbXlxdXlpbW11fbHBuaWZqbW5ze4q/v7i4tK+qq6adoaimnamqsa2qrKm0rbaws6mup6yzu7q2w7m6ubCrtLm7tMK5r8Cxvry7trzIucO3raqosLLAtri9sLGosbO1u7ysrramrrauu7KxqrmwrruuvLi8wMC+usO/xsPFwLzGwsjLuMXHxb/HxMO6xMbCu8bJzMuzucK9u7OJdHZ3a2lgYmxpWVdXW0FMS01KRUFDQEdBOzo6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcTPx83Bwsa/xMTDw8rCycq/wLzBurO1tcOuqrCSW2l+koiOj3t4fYmFenuEgHduXl1cXF1fYF9fZGNiY2RiYF9eWltaWl1aWlpaXGVub2hmZ2lrbnKErbmwta2ko6WlmZ+jn5iapKqtpKiiq6qsq7Cjpp+qrbW2sb24r7evqK64tLS8uLO8sLi5trK8wbLBr6apo6uxs7SovaqrqKutrrW0pqitoaSvqbKmqKiupai3rLGzt7q6u7K8vr6/xb+1wsHHyLe/wMW3xMPAu7/Ewr7EyMzKv7/EwMCph3N0c2ppXGFvZFdWWFBIWlJTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz83Dx7m5y8LLvrvJtr3DvrrKt8HDwbS2vLaxr7W8ramrkmNtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYF9eXVxaWFlbW1lYWlxfZmtmZGZlaGtvcoWppaujnJqfo5Obo5mWj6ChqKOjn6Wlp6auoJ2bpKassrC3t6ewrKiqtKu0urG2tq62urOwu7qxt6WgpKCnsaisqbqqpaanqKezraCop5+cpKasn5+npKChsa2trLK1s7Sxtb22u8HAsru+w8GyubnCs8C9wLW4vL2+vMLHxMPEv8DEoIR4cWxiZmBrb2BVWV9ITmhPVEhGS0Y8PUA9Ojs7ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wLq9taCelJ2hprq2q7Ozu7PEz8nLwsa4t8fAzL+4yre7xbizxbizv8CstbyyrKavtK2ho5JpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGBeXFtcXFhZWFhYVlhbXV9kY2NmZ2dna21uh52onZOTl56UmaCWlIucoKGmnJ+fo6Wjp56bopyfq7CtsbWkqaqqrKyltLitt7Css7Wvs7avsaqfnp+korKlpqq5raKmpqCorauZoKCemZ2fpZqao5ycnrCprKiqq6ytsLO5r7i5urC2vLu6rLOzubO9tLexsba1v7W9wL3Dwru7vZeEe3NsX2VeZGRYVFdeSVddS1BHSkpHQTw/P0E7PzwwNTUzNjo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67uMHBwbSkpJmapKbAsq+2rLW3xc/IyMDGu7vDw8++uce4uL+3ssK0sbu7rLm6saKfqaunmJ6QbX6Fhn94cm1vbWtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXWJkZGZmZmhpa3KMp5qQkZGYlJiek5SOmqCgp56bnaWmoqWbn6Gama+urq+yoaWjrquoorWwsrKsqbCzqLuzp7aho5+co6Kuo6Kqtqujo6aepqajlpmdl5mbnaCal52cnZytoayoo6SmrauztKq1sLKrs7m0r6qwsrKzt7Ouqa2usrewura6vcC4s7GUhnl1Zl9mX1taVlNaVUtbUUxKRUhLSUM9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+znaWjmKWxw7W2va20ucHMyMa/xbbBwMfOtsDDvbO5ubK/trG5u62ytK+fmqOqoZSaj3h/g4R/eG9xdHFoZWRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqCZkJCNkZOUnJSXkpWenKCclqGhqaOenqicmpqrp6+wq5yjpLiqoaCvqLerp6eusaS4sKS3oKOcmZmrpqGarbmwo6GknKKgn5OUoZSWlpuZmJaXnJWfqZ6qpKKdo6qqsa2otKyqp62zsKWrrrOxr7Cvr6eoqLKusbSwvLS6uK+jlYJ6dmVfYVdZWFNSVEtNXkxQTEdITEtFPUA+PUI8Ojc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0usKxvre9rp2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGuvLu1u7y1ubmwr7CqnJqhqZWRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjY2JjYmJjZmmAko6RiY6QkZeVmZOUmZ6bnpWgn6alo6ann5yfpqCrr6agoqO3qKGhoqmzoqWopbCmsa6stZ+hnZaVqaGilK2xsZ+jo56emJuTi6GUkZOYmJOXmJiXnqebp6GimqSlpaukpbCnpaOrrK2mqa6wr6uoqqqzpqarr7Sxrry2sbCvoJN7eHNlYlxbXVhOTFFIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sba9sLuxt6yepaast7u8wcW6srm1xMnJwMPGxce2xsSzwb/Fq7e3vba9uru1sqytqJmZn6OLinSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVVRWVlJUUlVgYV9gYV9gYGJkaX6OjoaNi5COkJmRk5WimJ+WnKCloaylpKSjpKOdq6ulmp+lsaqhoZ6lqp6oop+urKqprq2ioqKVmKKbnJCrqbCcn6Kfn5eYk4mekY2Sk5aQmJiTnKGjnKSgopWgoqSlm6OrpaKjq6SrraWusqqmpaamtKaqqK2ztbS5urCrrJ6Mc3FwYFtXVlZSR1FPSFpcT1JKVEtTTEVHSkQ4Ozs+PDk2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Ktnainr7m5s8DIurbAr8XIzLrByczItcm8sb3Dya2xuMG1vMC8tLWqrKaWmpyciYFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RVVlVUVVVSUk5RWV1cXV1eXl9fYmRtiYt/jYKLjYuWkJGQm5qhm5ugqKmrqKynqaakmaWvpJWZpa+poJyZm6Cfrpqcq7OgpqafoqShlJSblpaSqaqtm52foaGblJCMmY6MkYySjZaVkJ2hoKOdnKOVm6GjoZiiqKOiqKugq7Ckrrimo6SjrK2pqKuvtLeyvbWzq6+YhXV0aVtYWVJVUkZYTFFbWE1VT1FMUVJJTkpCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7auqKivrpupqKy3tqy8yru2v6zLxsW4wc7Px7PEure7wsixrbi/t7y+u7O2pqmglpiZl4h6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOT1FZWlpaXVxcXV9gZHuIfYZ6iIyGj4qUj5WXoJ+an6uppq+sqLClqZqfraGVlqSop52YkI+anq+XmaeqmaCdlKWhn5KRkpGTlairpZqZmZ6el46Mi5OGiY2Dj4uSlZGgnqGkmZaflZqhop6Um6Wlp6mooLCwprG9qKCjrLSqrqewtLC5tcCxrrGrkH5ydGNWVFZOUkpHVlBSUkxMWE5LTU9SSE5LQUNGREQ+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7SsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqytri8vcDDsbCxt660tLuztKOjnZ2Yl5WEgHZrZ2xucW5yam9rZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlRSTk5OUldYWllZWFxcXWFqfHZ7cYSJg42GlYiSkpaamJ2om6CrpqasnqiZoKack4+fo5qXl4aFkpukkJWjnZaWloiim5uUjI6KkJqlp5yVlZebkZOIlI6LgYyNgJCLkpKSoZqgopaUmZiVoqaajZmkp6mnoaC0sqizuKGdo7esqa2ks7Kmtbu1q6yxo4p6c25eTlFRTU9ETk5OUEtGTk5KSk5OUUlNSkFITEhIQz45NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS3saWnpKqloKmmpLOqorLDtbWys8bGt7rDyszGs6y5vbS4wK+uqbCepq67r62gmpuelZWIfIRuX19mcnB2cWpuaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFpdYW5ucmyAhH+FfY+CjYiSkJKdoY6anaOipJillqKclY2ImZqMc42Dfo6XloaSmpCUjo57mY+djYKJgIqYoKOekJOYloWOg5R+fnSKjnqQiJOQkJ2bmpqSlpCdjqOjjomaoKGkpJuitK+ssK2fmKa4pqWwobGunLG8qqmvqpmDeHRkVk1SUFBNQ1NOTFBNQlBRSElOU01ISkpES01GS0s9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY2Ojg3QTd4t6GjtKimpaijpaWmpqayp6a0wbivtLDJxLi5wM7GvrOsusGsrcStqKKmkp2mt62joJCWl5KQfnh/ZldWX2dmaWdob2NpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpITlRTU1RVVVdZW11paG1oe4F5cU1WcI6BlYWMm5eKk5GfmJ2VlJaUj5aKgJSJXztWb3yMlIqAjJKMkIaGc4uFl4F5gXuGlJ2Vg5aOkZCDhn2TeHFwho19iYGQjpCXmpmTi5CKnYifmIiIlp6aoaCXp66prampnpats6KmrpmsrJiotKOpraOTf3RuYFtOU1JXTERUSlBNTEZOT0lFTFFNS09KSU1QRklKPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqapoKapp6OqsKintMG5sLWwx8K4s73Pv7mvrrXCp6rEqqKdmIOUnLGjmpiHlJCLh35zdl1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU5RTUtJRkhOUVFNT1JUVlhaYGtqZHZ+cU5BP3+VkZB8h5SMhIqNm46WlYmSiIaVh3mJf2BKUW54i5KEfoSNi4WAf21/f5R4dnZ4hI2acFGNiIqGfH54lHZod4aIfoqIlYuOkZOXjISKiJWEm42DhJKblp6dlKSiqKmlpJ6bsKqhpKSSpqqWoqqcoaaoiXZuZ15cSFFRU01JVU1SSUxLT0lIRkpOTE1US1FRT0dKRD03Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2nKOnnZ+hrqGnqKWnqK+sqra8tri3s8G7tqi5yLi2qKi1tqqyvKeelY1/iZSplpWLf46Dgn54cW9YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVlYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRURDSU5PaFlPUVNUVVpugXBzemdmWlOPiZSHc36GgHyFjJOCkpmLj3uGj4B2gHhzb3VxdI6OgXp+iquFentpdnuOcHJteIGLjZJ4e4B7gHdzc5J4Z3WFhISFfJWKiIqNi4B/hIuNgJSEfICPmJSclpGfnameoKGdoKmlnp2Yjaekk6Cflp6fpIFzaWJdXUpXUFJHS1hST0pNTFJKSkpMUEhMUUxSVE1GSUI9Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6qlrauwsaq9tLK7uLa6tLGft7qyqp2drKmosq+impGNlIGOnI6Rf3aGd3x2b29qWUtISEhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnWCenZkdIuVmI2Oe2Z5gHZ4f4iQfIOYkoBxh498d3tva36tfXSQi396hpKBfX90ZnZ8hmxvaHN8io2HgG15cX1xbXaPcWhxgX6OcESLhYKDhX93d3qMhn2Me3V9jpKPmIuSmpujlpmdmp2eoZyWjYulm46dl46WmJB4b25nY1tYWFVRSlNVVE9QTlBWS05LT09KUk9ITlBMRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzUxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKawrK6rqKmxr7GrvLisu764s6ynm7CnrJuPlp2lqaShmJmPhZJ5iY+Li3ZxfG11cGptalhLRkdFQUBDREhMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFhdZW9waoalqsB+c3hie3due3iHj3l7i4ZvbYySeXR5amqAgnGWkYyBfZWASpOZbmh3foJtamRseYWQkoZrcmx8bnJ8hmltcH9zjYmFh3t+f3t3cHR0hoJ5gXlwfI6LipODlpeYmpCTlpaZl52WjIOJn5KLko2GkJeAb2pvb29ZVlhUUlFZT1JUVFJYVU1OSE1LTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuYm5+lra+iraqota+urLS/q7zDv6WimpWkmJ6NhIuUoaGYmZGTi3OOeoCGjIZ1b3RrcGxkbGpZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JWWlFYW1+mh2GZZ3J4ZH1vbH95ioh1gYeFdGyaknR0fGpqnY5NeYWTiYSOZzF2h3Nsfn6DdGZldX+EhIWAZmlsdWtwgHxocXF8bpONj3x0fn1xcW51bYJ/d3l1anmIgoiJg5aSkpCLjZGUlI6XjYB5iJeIh4qGgJCIeGxrcGhlWFJbWFlZW01QVVZZWE5JSEVKSkhHQ0BHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEvKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVtkoiakJmWpKitnrGep7qvq7KwwrG7w8ealo+UmYuOhXqEkJiUjZCMj4Zxh4J0iIyGenBycG9vZHFnX1RGSUM+PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVUxBSVFJYq+yn3B6dmt8bHGCgYSAeoSFhXlyoJV0eIBzdZSHNXGdqJ2OoaGEo4V2cId8h3x0jK6NiYFoZ2JqbnJtcIN1aXBYdXCOm5F2bX97fW1ybnCAe3N2bmJ1g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2Oe3NxcW1gW11eXFpZYV9STltaWFdMSEpGSUc/Q0FCRz9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiVkZ2kp56vlaW0qa6wrsGyu8HFlpCMlI+AiHxugZCSiYOKh4+GdYKEbJWIiHt1eHhtd253ZGpeSVBHPT83NDQ5Ozs7PT5AQkVITExMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9ITE1OUEw3Q01RU0RLhXR/e3t1fmx2h4d7fISDfot9daKaen6GgYSZhJqcYYaqn52Kg5COeneJfomIjnOLl4+Ee11kcXR6fHeKbWhqYnlvhZCCem+BeHWEenB0enhrbmlddoZ9h3yHho5/ipKXg42FjIZ9cYR/hH12d3t8iXhxdHVmZ2BbW15TXGdeV1BUWFtVR0pKRUtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCYnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyNeIp/k4yRnJ2fppGgqqCxqK/AsrvFupaOkZSHe4Z2a3+MkYJ9ioOOjHiDgHOghIp9fYF/cIF+emh2bFJYTEBFMjExMzc2Njg4Ojw+QUVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9RTEtUXVlSS2iCh3qJeXtxfI+LeXyIhn6Wh3ahmoiHj5KUpY2tqUiGrq+ui4GAlIuCi4KEkqmHgJiYipx0bXyBhod+jmhnaHl/boWHgoVxhIZIbIB3cnl2aG1rX3Z9g4h/iISLeZWcm4mLiJF/enWKdnx4bW93foF1dXNtXF5eW2NkWGdlXFRQUFZZUERMS0ZPSUNGQ0NAQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5GOlpeSlqCerKCmuK+zvbOXjZKLmIt9dHB+iZJ+fYyDkpR9hn6GpIeIf4KIhXiHiX5zhHhfY1dLQjYwLi8zMzEyMzY2ODo9Pj9CRUdISk1OUVNUVVRUVlVTUU9HQz84MCwjh1s/Pzg0Ll2WcHOjVUZJS01NUFdgWW9ZXF5pjJKGlICDgYSRkn6FiJGBmpWCoaGYlZuapq2Tmbuxp7vHw6iLjKGljpSJgZF8cYOen5Gdf3eFhYuQh5BpaHCEgXSMh4SKcoaCd4iAe3aEfG52dWZ/lI6HiImHiIehq6KWiY6Xf3qBiHl5cGdreH98f3VsZV5bW15qXmJnYFpPTE5XUlFJUEpETkdDSkRDQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZneDen+Mf4GQjoqam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH6ShpKVf4qAkpuOg4CBjIqCiY2Df4qAbXBqXUJANC0tLy8uLjAyMjM0Nzc5Oz0/QkRISU5RUlRSU1NUUlBPSERCPDg3LzlDPjw8NjMubJOXTVBJSUxMS05WYGN/ZmdtdJuZjpmSkoqNjpmIko+di6CgkqOqpaSsk6m2oqjBwq7Hr3i6lJp8jaGemYSThYKOoZ+UmZGFioWPmZGWbHB1ioyCloyNjnePhHFthYGKlpGDhYhxiKCWhpKJjY+WpLSpm4yUooOHkoN9f2tqanyBgoN1Y15kYFtnbF1sbF5XS0hOUlFNTExGSVBDRE1GQkNFRkI9OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnF2koZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXl/koiRkn2KhJiSkIKAgIuMiYaRh4WJhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOT1JUUFBRU1FOUElFRD47PDpERj8+PDc1Mjw/UjVISEhMTE1OUl5uinxzgXyenJunpaGZoJailJyeqJ6oq5+orKmqtperv6u2yMi3yNDPvpugcGmrqZ+Ek5KFnKCam5mmkpGIlaKbm3h6fpSYk6KTl5eBlJ57d5WSq7KJjZeffJSdm42SlZijoaa1r5yQmKiHlo+NgIhsc3N9gX5zaWBeYmBiaGRgZ2ZcUkVKS1BPSUlMRkZNQ0hMRkdDQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbXxhd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjox8ioaPkI6BgoCJi4qEkoWDh4mBgId2XmJQNDYwLTEvLC4wLy8vLi4wMDE1PkFBTVFSU1FSU1RSTlNMRUVAPD49RkdAQUA4NjYyPDk7RkhHSUpOT1FZbYWPd5SJoaWos7y3pK6rq6aotKuwtrKxrbuxs76cs8OrusnKt8O/uKWisLOsraqji5aYhaamoKOXgaaZjaKrqKWIhZSkoaCroaSoj5yxi5Wjpre6m6CisJKinaKdkKOhq6+ssrWilKSqiJmIkomVeXp+hoBpYmldZmNeZGReZ2dfW09DSUhTTkZITEZKR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhiV2lvWHqFdoGThYiCm4OSkIyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5COg4SBi4WGiJKGg4WJh4iHh3FuYUBFNjQ8My8xMTAtLCstMS4tND9DQU1VUVJTVVVWVU5bUEdIRTw+PkZIQ0VBNzs8NUM7PUZLSUdIUU9QV4GSn4StorGpscDGwqqzxbars7+zuL62v7TBtru6o7jFqLbJx7W+ubSoo7StsLGbmZKan4inr6ullHafpJehrLK0mZaqrqmutruyuqywtaKxrLG1u7e1rrSgp6ijp5qpr6yyube4ppu2qYykjpGTn4Z4gYV3W2NlV2djYmRgYWdgW1RKRERMVVFISUpESUdFQUBAS0RCTUc8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWVFiY1d5dXCBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiHmGgIySjIeEgY5/gYmPh4CGiIWKh5F6eG5dVkBFTTw2OjU2QUI3NjQvLzZDSEJRXFBRVVdVXFZQX1VJTEtBPz5HS0ZGRDs+QDdENz9CSkpFRlZTUF6PpK2jsbPBtbfBzMi1u8S9s7PAtrjBtb+vt3Sxs6W6xKSwxrmxs7G0qKS1tqqxoKKXm6KSpbCupq2rp6SYoKy0u6Kosrq1vL/Mv8XFvb2zwbe6t763ure5rKywpbCprb2wvLrBwauYuaeUrY6Xl6qIfoN+bFhkYllrZmpmV1xjWVZTSUdGTFFHQ0hJQUhEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUVZTWVVadmpvfo6EgI2EbnpzeIdiuaGZo4mUlJaSlJONj5aSh4Z7hoGNlYqAhIGKenyLh4Z9ioKBi4SVfXd6dWVQXGRHRUw7UWNhW15TRj87SFBFWmNRUlhYWmdZVGBgTFNQRUE/SUpIRUVBQEQ8RTZCPkhHSkxTWlRdk664tLq4yL+5vcnMu7zBu7e1u7q2vbS6scZgdbKksZqeq72ppairqqSisrWgq6iflZafmaCupaempZ+kk6KnsbSnsrK9tsG+08nJ08bDxczCysPAvr2+u7y3tK+4t7bDucW9wsevnrmpoauOpKi1iIGBc2BjY19YY2BqZ1JYYFZSVUlFRU5LQD5HRD1KQT1CQD1GPjtIQTc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjISPc2xycnOH1cC1maCNlZiZkY6XkpaWjoaHfYaDjZaKfoN/g3h7i4OHfIt5gYqCl350fXprZnB1WV1cUGVkYmBlZF1bWFdcTWRtVVJtbV9uX1hnZFVZVUpEQktLSUZISEhIQkk6RD9IS1RUVlxaW5K5wLi9tsW/urjJyrq2ubW3ubK3tbOutraYZHWonK1wXqKsnJigopuknqqllJ+gkJOOlpmYqJ+moJ6amYOknqylqrCtuLC9udTRz9bQyszSzM/Oysa/vsLKvcG8wcDExMXKvsjOs6S7sLSvmqu4u5h/e21eYV1aX2JaZGNQW2BTUEtDQUVGRTxART5BSEFARD06RT49Sj8zNzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVxZaF9vlpGQlG5sb3R1h7OroKGfi5mcmYyMlZGbkoWKin6Ih4yQi4l8gYNze4qDhXuJdIKKhpV/c3t5bG11e2hyZWlsaWdqaWhgZmlpbFptc5atpLyIhmdbb2hdWlpUSEtOUEpLUEtTUUhMQUpGSk9fXmJnaWGXt8ewubK6vbWxxMa1r7ixsLursrGnq7erjLannZqnmk6anYyOn5aRppillYqTk4mQiY+RkZ2boZealZaHnpqnm6yvqLCotLTU1dXW08vQ1NXN08/NxcLJ0L7JycrJ0cfMzcLQ0bevw7zEuaW1usKig3BlXl5fWWFYWmZaUV1YT1BCQkhFQkg7QUM+QUc/P0E3O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZUmVWc5CQmIJocW95eYOgqZ6ml4yam5eLjZWRmo59iYuEjYqKi5CIfISCcH+HgYZ7h3KDkouOfXF4dWxxeH5xem54c2xpgXBtY2ptcHhpd3x+y7/B36dtY3huY1thYEpQUlVOWV5QXVxOUE5UUVVUXG5tdoJxlq24rLSmsLWqrLy/sKq0pqS4pquuoKu0o46xrpqXmIyRk5GEjpuBjaaRnImDi4SKiYSLhJSVmJeTm5CcmJman56rrKWooqytz9LV0s7M09TU0NTRzsjD1NHHzdLT09fM0dHF0tbFwM7Hx8KovrfOnntwZ19kXlhhU15aUFFUUU9IPkBGQUJFPEBBPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1OWnWGhYp3bHdvfX5/oZ6eoYyMmJOTi4ySj5aEeYWPkI2KiYiRhn+Ce3J+gIGHeoR1hZOQiH9vdnJrc317d3tzgXhyaoBzcmlvcXp5cXq+y5p+jLKEdnKEdmhha11DWlpbVmVjWWRqVFhcXWBkXmN3en6LgZipo6Whn6CopaqwuKqls6OhraKjraGnsZ+IppqTkpGJkY6IgZOJapSijJmEgYZ+kYODk5eti5WNlJqOhpORnpensKGhoaWkqcjNz8jCzNHU0tTSztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMPCy4x0cGViYVlVWlRcUEtHSUpKQDs6O0RBRDxCQz5HQj5CQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJyUnZSFi5WJj4qIjYeOf3iDk5iKjIiIi4l+g3hze32Dh3d/eoaRlX+DbndwbXV/dnh9dIV8eWyHdnRufXaEdHh7nbWMO0GLxaV+jHxpZVdJQ2ZjZWNnamRud1teZmhrbmlugIOIkIucnaCdkJeYnqOjpbGjpLOfoaWdoKigo7GchZ6SkpKQio6LhoOPhH6cm4yNgoSFepR/gqmVo4yRipeSi36Yi5qSq7OYm5yonKe9w8a5tsbO0tHS0MzSy8nUztDV2tfX2NTZ2M3Y287J2drR1r7Ly7V6eHBmXltTV1JbVkZHSklFRT06NzpAQEI6RkQ/RENBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXOFjXyXkJ2Lf4eSg4mGhYmBh3x4hZaWiI6Ch4WGeoR5cXt7g4Z1eoWOjZx5i3B8b296f3F7gXGDh4Bujnp0d318gnV+e4aHr3NYqcK2jZGCcG5iPV5ocnBxcG54doFlaG9ydXhxeouGjpORm5WflYeMk5ugmp6pn6Gsm6GamZ+lnp+rmYuajJCRjYR9iIeDhYuOoJmTiIOHfmyZeoSZhoiTjI2UjIZ8nImUj66qlJaYn5mnr7a9qa2+x8zJyczL0MnD0srU19jX2NfV29fT2dvV0Nva0dbI1MuWe31qalxbUVRUX0hDRklIPkE+PTc6PT87PUc9P0FBQURBPj86ODdFQjc1NTQ3OS81NjY0MzU1NDIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OTlEP0NHUmpebWRiZmt2gIhxkY+agHqAjX6CgoGDfoN7fISYjYeLfoWGgHaCeW97e4aBdHqSno6gdo51gnR1gX1zgIRvgZCCb5KEdXyBhXp2hnuIt8Wkwcm4gZabj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWlJWPl5GEiY+WmZeWpZyYn5aek5KXo52Zq5WQkImMkYKMhYiIgYaQkZ6bmYiGjIGFl3qIiZ+XkIiNiouCfaGKkYu8oZiUmJmcqaamrp+otr/AwLnHys7Oxc3K0dbV1dnV19vU1tna29fb2trYztvGiH17aWtnYlVYVlZOTEVOQzs9PTw4Ojw+OD1ANj0/QD0/Pjw5ODY3REE2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWGVhXVtodHp5bImMknd2eop7foB+f3yEen2CkYmEhXqEh3p1fXRtfH2GfnR/k56RnoORfIZ+eI9+eIqKboKagHSZhn6BiYV8fZB6j6mOj8OhvYyco5x9iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CShYmLkJKUjp2akpSQlo2MlZ+clKCUkY2Nj4t+kI6Oi4SJkpaanp+JjJSSnZGCi4CmmYiEjYKFhIClh4qLuJidkZWWoqihnp6dpK+3urWswMbK0MjHzM/T09LY09XXwNfY2dvY2trZ2dfbuXt7em1rZ1liXFRQT0lETEI8PD45OTo6OTk7PTY/Pj48PTk6OzszN0RAODM3OD42MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg2ODk/PURSU1JYXlVYZm1tbWmBjopxc3mKe3p/fH97h3p8e4uGgn10g4V5cnpzbYB+hH53hZyim52UkoCMiH+Yh4CckW6HqIV6oIt8kY2DiISbfZqQioyjoqCQpK+fi5CLhYuBk4ZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlYyHiIySk4uUlJOOi4+Kh5abnI+UlpCKkpOGgIuIko2Kip2WmaKihpOdlqCKiYiNnJCDiI5/g4eFpIaMkLOYnZKVl6Gin5mSnJ2osrmspr3Cx83Ixs/N0MzP19HR1a7W1dja2Nra19XZ2aByf3dpaF9eWVRYWUNBSEM/Pj46NDk6Ozc6OzszOzs/PT43Ozk6MTpIPjozNz1ANTE2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNjem1hfpGDb213i3h5f3qBfIV7e3aFhH9zcIWBenV2dnSEg4V+f5KmpJ+mopaKnZCUl4uKqJdzirGNhKeShJmThZmMopWfmJOImp6jkqmwoJCUkI2OiJaMbo23hZrEyLKboaWbnJiWkLKRZKTNyJaPhoeIj5KNjZKTiYWKiYWWmZuPj5SThpSXg3+Pi5mIjZCqlpejo4iZn5aaiI6GlpeKhI6NgX+Ij6SJjZOompeTl5mhmZ+Zk52bo7O0pqO8wb7HxcXJyMnCy9PNzdSp0tHW1tbY2tTT2s6EdYJrZmBgX1BLVlxCQkdDO0E9ODM3Ozw6OD02NDk6PDo4Mj85OTI6STo9NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0SlE8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCZYNHdYKOfXxtfYh4en56gYGCfnZ2gIJ7bG+Lfnl8d3h8hIeLfoujtKikq7OhlqegpaSWla+ig5C4lZKzmY2hoIykm6+ipJ2YkKeXqZmtsKSXlJWUkIuYmpagwI6jybmrmqKlrZmRm5yynYaFqKKdmIWIiI6VjIuTj4eBhoeIk5iUjIqTk4aUmIaEkZCcdJGZspWWpKGInJqTj4qQipeaiYuWjYZ9jJmeipCPnJqZk5mYoJWhnZWfm6GxrqOkt76zxcfEvcPDv8bOysnSp8/N09HQ1tjSz9i8dXx4X2JXYlhSSUtPRUJDRDU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdNW1xZSWhhO0iEinp7bYWGeXyEeICFgX1weHx9fG9zjHp9gnt4hYuJhoOSqLytqbO9r6Wus7Opo6KwrIqatZ2iuKWVraSXqa23pqSjn5mpmKqkr7GqmpiblJWRmKCXmbu7rcqhaba3qrCVmJ6iq5KXvaReqbKCiYqMlIeRfI+OfYOGjpCUlIiHkpaLj5WNi42WmZOdmrSWlauei5yUko2QkouYm4qSnY+LiZWgoY2VjZeZnZOcmZ6VoqCUnJ2lr6ihpbO4q8LIxLa7vbzFyMjC0KHGyc3NxNfW0MvTo3N9a19cVWFTUUdEPjxDQUI4Pzg3ND5GPDw2PDM1MzU1NDU0QjM5OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGZIYWBicElAi4l/gHKGh3yBiXWCioN+bX19fH5wd4d3jYGHe42PjIaMmqvDwLC9xruztMG8tKyrs7eMqLKtrb2rm7qkqK25t6qmpqKipKOqr7Kxqp2co5ibmJeeoqWlkqO5rqjAu6ytsrmlpKd9iIacrb2vgouLipCDjoORjnmBh5CNjpyIiI+XjYqUl5SQmpedp5qwmpGrnY6aj5KOlZCPlZeOkaCQiJSbo6yVlo+UnJ6UoJ6bmKChlJqep6ekoqSws6bBxsOwsLu2xcTDv82nx8PHw7zW0MzEyop2dWRfXGJdT0tDTEBFRz5BP0I8OjQ+QT09NT02PjMzMzI0MkExN0BCTj9HQENOQ0E9Qz07ODZDQjVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxoRl9pZ1pdXJOMjIh7h4uGg4x1hpCKgW5+e4F+cX6BepV6kpSUmJGTlai0x8nAwszBw7rHvLqvq7m7l7K2urPArqXApKuwvLyqrqujo56orK+1sKqboKqcopyWn7C0p4uiurq1wburqJyypKSolISOqcTDpIKLjoeIhIaVlIx5g4yRj5KhjIyUkY+Il6CXkpmVl6agrpyMqpyOlo+SkZWVjpCVkY+hk4aXn6Cyn5SblKChmaSgmqCcoJSYnqekpqekr62lv8TCrqm3tcnDvrbPssW+w7yz0cnHwbV3e29fWl5sVE5JRE1LS0lAQT1CRDw1QUQ7OjM9OEIzMzIyNjNBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJnXE1lXGZUY2qZjZeJi4iSj4aJeYaTkIFygHuNf3eGgYKQeo2hlqiampi7vsnIysLSycrCzbzBs628v6e6v768xLiswamss7u9qrCqpKWjrK60rba1oKCun6WimKO0vKmbqLzBo7W2r6uSr6yqq5aGmqqnpZGCjJOklYqAdYmSeYWNkZCeoJKOlIuPjJSjmZablJSjnqmfkaWajI+PkJWWiH2PlZKSo5qVoKKctaaQn5elpKOln56mmJ6Vl5ylo6ioorKtqLvAxK+ls7fMwLmuw7O7vcG5rcLCwr+ZcHtjW1heXE1NTkpHRENIQkJBQ0s6NERIOjs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+bElfWGFaZGRXnpCdjZeOnpKJin+In5KEeIV/lX5/kIiKkICVoJmup6OYw77JxMjG0s3Ozcu8wrewur20vcu7w8G2t7yts8C5vK6vqKGpqLatrqmyt5qerKKnoZ2rt7eppa++xLG9ubOnqbOzra6WlaWtqKCRjpKxxaeVjX2RlX2HkZiPqpmYk5OOk5WTpZ6TnZmToaKhnJifmIuMj4+eiFqQlpeSlqWZZZijnrOllqKWq62rp5yfp5eYlpiVoaSpp5+2rKm6vMO1prS1y8G4qrass7u4rqi4ury3hG5wXFpWV1BHS1NNSz9BSEVESEZGODVGTTs+Nz5BSi4zMjAyNUI1NVBXTjxMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVjw+QEJGQnNGaUlSZWNMRqWUnJWhl6iWjJCDh6WSiIGHgpuEg5WQkZSOmqKfr76uoce+xsXIx87OztLKvru2sbq7vL/PtcS9t7m3srK2s7ezrKacq6u5q6mor7CXo66kp6SltMGwq6yzvsK5wLmzp7i0t7OvlaStsK+li5OVoY1zwZl9lpmEjpaZi7GVmpqVkpKZmaajlaCblpqpnJuhoJmKjI+WnWBKlpyalZmll1SWsJ+vnJ+llK+vraaboaaUk5mZjp2gp6GZtKmqs728u6uwssfAuKasq62xsaOhsrK0pXNxZ15cUFJNRVFRUFE7SEtJRkdBQz05S1Q/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFg8OkJDQD1SRVdTc2JWRkirl5mfoaiumJCXh4qnlo6Ik4WgiIScl4+eoJujpbXJtKnGvMPEyMvJyMzOx766s665ucHBzbXIu8G5tbqxr6+ytKeknKq0tauppq2smaSupaWorLrAqKu2tr/BwL+4srLDsLe9q6Outa26pYibl6abdr6fhJicjpKYmouulqGcm5eUmp+hqZ6ooJqbqpmhp56XkI2RnYNtdZOimpWdo5+QrrKjq5Wpqpirr6WloaWqk5KZnImVnKKelrGmqau6t72zsq6+ubago6eppaacnKypqY1maGJgU0xNR0hOSlVMPU1FTUlKQENEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXPDo9Li5TYU1WSH5lXkhGrJWcoZ+7rpmUnouTqpuRkpOJqo2GoZ6Mo6yUpKS2x720wbvCwsfJxcLOyMK9ubKvubXAwsq2xrHBvLW7q6mtrLCjo5mqtLqmqqesqp2or6ekq6q+vKitvLS4vsa8trW4wLC9wLOptbarv6WPo5eRoZ+7nomaoJmXnZ2Ptp6pnKWjm5yhmqels6KbnqWcqKqdmJWPlJuLlomMpKGUnKKfobWvpaaTsauaq62fn6WkqpGWlaCEkJ6fnJappKGhtLS6ta2otbKynpyjppqXlZmqoZ54Y19hX0xJRkhOUUlNREZGQlFLSEFER0FWUkRIPEFHUTE7QTc6QkY3OV1ZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRaeXpJ6ew6ybl6SXmaiblZqaj6qWlaimla2smaKqtsXCvL+4wMLAyMS/zca7vrmysLi0v8PItb+wvLe6t6ekq6usoaGbq6rEoqWprKaeq6+soqqov7imrb6wt7fGtrS5uL6yv8G2tLK0r72jlqOVkpuTrZ+QoaGkoqOekL6kqZ2prJ2doJumn72imKOeoqmroJ2WjZWek56HjoSNk56koZ21rKaclrKmmbCpoJurn6GNmpWfhI6hmpuSpaSamKuxtbGqpaqtrJyYoKGSjpCVqJ+UamVcYl5QSkhLT01IRUNJQD1PSEA7R0lIW1JPSz1ITlU0QkU4PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGZjWE6im6SbnsWsoZ+snZytn5KinpaloKaprJe2saOqs7bFwr3Atr/Bu8nCv8rItri1tbG0tLfCxre+sbi1uragp62qq52en6WkwaWgqa6gpKmtsKKmqL21prK8t7a1w7Kzt7q+s8TAuLiutLS0o52klJGToKyfmKGdqKiqoprCramdrK2bm56YpqC9oZ2kmKurq6agmY2Zn5KeiI5Yf5aepqGguKqmlJi2o56yoqGcsJigj5qUnoKPoJeWjqKjlZClrrOrqaKipaWVlZyZi4+Rk6SfiWNnXGVhTUpLS09GRUFGSz49SUE5OUpKTl1RUUk9TFZcOEZJPURNSThIY1xLQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2FTNlNaa1dzSEU2PXVlXExPnqChmJ7Dp6Wis6CcsqeTqqOfo5+sqaydu7GprLWxyMPBw7PCw77HxL3Eyr2wsLausbWwwMW1urGwuratmqmwqambnqahqMKtm6yxnKqirrGqpKe9t6a3u72vt8Ots7PCv7LHs7q3q7S2raqippWVlKKroZ+fmaerr6+vu7Kmn6mpmZmXk6KkuKGho5Kur6ukpZ6SoZ6UnY6QjZSdmqOfp7Snp42YtJyjr5ufnK+RoJSYlJqAkqKWj46goJOLpqywpaeinaCekpKalIWLko2cn4BkaF1oZktKTEtTQkNASUc7O0Y+ODlOTVVfUlNKPk9eXT1IUEJNTEk4TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHddXj9bVV9mckA4PEiWd2VBNJ+kn5ufwqijqrGgo7SplbKrpqKksqytqbuyrbC0tMa/xMS1wMS+ysW2wMnCtau1qbG5rMDFtLiurba6pZmrsquqmKGnl627tZuosJutn660sqequrOnubK4srjAqriywr20xae+rq23tamnrKGWlpGlpKGhl5ekrretsrW2n56opJmUlJOjoLejpKWVrrGypamkoZ6amZqVmKifnpiin6+yoqeNl6+YpauYm5+mkp2PlZiahpaglYyQnZ6Ui6mpqqKnoZmdloyPmZCBhpaJlZ96ZmpdbGtPUU5OVD1CQU5DOzpJPzc3UU5dX1JWUUFXYFxCSlNIVktIOlRkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM5MDZwW2JIMDVKcWpWQ1dGjHlmQzukpJyhpb+mqK6uoKm1qp24r6ukqrS3sbC4t7C3uLfFvcPHvbzEwsfBucHGwbqqtqWtu63Bw7e4qq2yvKOVrbCtspemqJGquaqhp7Cdq6CvtLOqqre1rLuss7K5t6y4sMG6vb+mw6qwtq6pqqumnZiYqqGhoJGXoLCus6uwuZmbqZ+ZlpKXpqC3qaWioq+xs6uxp6ugnKCfm56lnaCXnaS0sJufkJSmmqCpm5ajoJeZi5aZlJaXnZSJkpuZlI6pqaego5yYm5OHj5mLfoyXho+abGptYm5uWFFRWlRBQ0VVQDs7SEA3OlhQZF5QV1dEWV5eTkxTT19MSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNzQ3Z1lhRihAOG19aFxWOol7Y0M9qJ+coam8oaqvqqKxt6mltLKroa21va+zuL27vbe2wcO/ycS5xcPAwLnFvsG4r7aoq7eyvL+/tKqusrifl6ytqK6YqKmOp7ufpa2zn6uisbCzrKq2s7W8rbCxtaywtbHAusW2q7yvsbesrKmisaWepKifo5aPmJ+yqrOpqrOZnaebmpSNoKaktK6noaysrbGnsquxqaObnqiknpSgmZuptqmXmpKSn5meoZ+SraCamYeXmIydmp2Ui4+Wl5qXpqajoJ6WlpeUgZCVhXuPk4OMl2dtc2hwc19HWWZWRENOWERaOUhCNT5dUWhcTlpdR1teXU9NUlhkS0tDXWNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FWMTUxPWBWXzgpQzNZVVxnSzWMemZMQKSan6SstqOsqKSurbWprrO4pqawuMa2sLe/wcK2tLrFvszFucPBusC6xLjBubK1rKq6uLu6vrWrr7G3mZioq6urnK6rj6u+nquvsaOqn7Gtsq6utrK4tqqtrrGnta+0urzJsqq1tLG0r66moLOfmqisoKSVlZqZsaKtoKWvlqGkmZmSjaKlprKpoaaxrKq1pK6wtK+jmZ2tp5uXnZmZrLiil5ORj5mcoZiYlK2hn5aClZmOnp2alpGKlJOemqWjo6GZl5OSlnuMkYV7jYuDi5NsbnlvdXxhRmBqWklIWls9e0pHRTZBYlVpW01cYUpbXFpTU1NiYUxLRWBhYFBMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuK0EvSkdQW0czY1hUS0Walp+vqLGprKWjrq61qbezt6OstLfKurS7u8C+tLO3xMDMx7zEvbe/wMC4wL2yva6ourm4t8K3rK6yuZWXp66sp6SyqpSvu6SssrKmp6Kxs7CysbWwt7KprquyprivtbPExbaptbWrsK2pp6K2n5+msaCklJuYlLCep5ufqY2pop2blZelpaS2p6Kws6unsaetsLWspJmhrKicnJ2blKq5nJWPj4yYnaKYkZiopKCYhZOXkZ2cmJeXiJaPl5uonKShkpaSkJZ3hJGGfIaChIyNbnF4dnx/XUtlbFxKT2RcP2J7R0k4R2dXZltMXmJNWFlXVVhVaV1PT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGcyNydGYUxWJS1CLj1FTFE8M3JrTEREkZmkraSsraumo7Cysqq3sLWfq7W6ybiuwbzDt7OxtcLDz8TAwr60vcHAu7+8tMSoqrmxtrfAvK+stLSdoaexraWmsaWesrWsqrKxq6iotLmstLK1rLOsqquorKm5rbKwx7+4pLmwqa2tpqessKWko66jqZydm5qvmaKioqOQrJ+joJ+hqaaluKSrtLSkqquorK62rqKdo6iqnKCZmpKktJmPiY6IkaOglo6Vn6KWlYaQlZSem5mWlYeXkpWZp5ygoI2Tko6ReH6OhH19fYeKinJ0c39+flxTZG5eTlpnXUZElltHOk5tWGJaTWFiTlZWVldUWWheUVJMZFpbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0RkOzYqSGRISis6ST8zQ0lTLD6Paz9ISZCbqaqhqa+kp6OztLC0tbGwoKutvcy6rsG8x7G0rbTCw9HExb/Bsr7Dwry/uL3FqK23rLS4vMCxrLKuoaOnrqqnpbGjq7Gqrquxrq6sq7K6p7exsqmyqaqmpaOtuqyqsMK5tKy5qKmoramnsKWppKKuqqiinpyirJWlnZeemKudoaeooaymoqystrCxoKmin6qtsKydnqanqZqjl5iQoKiYhoOPi4ufoJCMjpeekpGIiJKWoZ2WmJaGlpOTl6WcnZ2MkpCNin9/iIR9d4CHhYd1dHKJdmxfWWBuY1FzclxLPIR8Rj9XdVhgWU9jXE1VVlVXUVxiX1NPT2hYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkswLklnREY4PEIwNUVLWDFAlF1ATkaVl6ynoamxnKior7WsuLWuqaSrq73Ju7C+uMOvsKyyxMTOzsO/v7TBxMS6wbTJxKyvt66zusC+tK6urKanqbGppqiyprStqrCtrbGvsqyzuqS4s6ysraeroKOesLerqq25tqS1taOpqKysqqygqKansbGjpqWhoauWqqGUm6ClnqOiqqOsop6msbasrKKlo5qpq66pnaGlpKSZn5mVj5idk4GCkImFnaCNi4+Nm5CTjYWOmaWbkpGbi5ORkZSjmpuai4+Li3yHgYKCe3WBhIF+dXiLo4d4a15gbmdXZodkTkBnkkxEYnpXYlhSZVVNVlVVVE9cXWFWS05pV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIZCSUlEl5GvpKKpr5ipqK21qrawqqSrqam8wcC4ubS8taayr8TKy9G/wbu4wMDCusG6wsSusbWytLzBvrOxr62srKi3qqatsKu4rqixsK6xq7WqtbantberrKSpqpyknrOzqKiks7Sfta2hqairqKumn6urqLm2qaqpqaGpn62bkamhnaCjoqaiqp2bprSup6WpoqSXpaanqpyio6OfmZifkY6PmI1+h4yHhZ6eiIWLi5CQko6FiJajmo6NmpGSkI6Sn5eZlo2LhH90h4F/fnh1g4B6eH6AiJ2PcHJnZ3F4XGF0iGlPXZhWSG15VWRWUmJPTFZUVVFPWFtiVkhQalRWVEdQWVVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyP2Y9Tlg/Qyw/TFRfL0lrN1JGO5WNr5+lqqyZqqStrrK0r6qlr6mpu767wbGwua2itq/Jx8jRwL+9urzDvbvDwb+/r7Kzsra9vMGxsrOrs6mltaikrLOyuK+irbWxr7G5qriuqq+3q6qeqqugo6G1ramhn6+yobWqnqinqqOqoaGsrai9r6uuraGnp5+rmY+vopiioKimnqebmKmwqaKfrKKhkqGio6eYmqilmJiYnY+Lh5SIfI2GhIWkloaDgoyHkI+ShYeVoZaJkp2Rk5CNkZyUl4+KhoZ4dIF/fXR4eoF7dHR7aoKIo3ZpXmVsgXVniIt8UldwXkt4c1RkU1FfTU1TWmdOTVdZZVlHU2pSUT5CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWg6MzhfPWFkP0YxQ1BbWytIUDtZQzSPjrCepKWqoqWjrKa0s7GppLCnqri+wbywqLmqp66wycfI0cK9wL65v7+9ybzCuLGwtbK6vLnAs7S8rbmso7Wmp6yxtriypqe5ta20vK+7pa2ttqqtnKmvpJ+lrKuonJ2qsqS0qZqqp6mkqZ2jqaipvauzsK6dqaOgrpuasqKWpJulpJ+lmpmnqqWemqmhm5GboKSdmZaoqZGZmpKQi4KPhX2Pgn+Ino+HgH6MiJKQkYWClJuUhpOijZORi5GakpWHin+Acnp4fnxod3x7dXFyfmmGeoSIZGBoY3KFe21oeV1eVkNYe21UYVBSWUtLTXB0XUlaW2daRlZnT0M+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpKvmJ+eqaSjoaqkt7KxpKmxp625wb21sKS5rKiosMPJyczBt72/tbjBusi1w7W0s7Wyvbm6vbauuba/raKzpqqrrrW3tKmcuruosb+yuqCvtLaprJ6tsaOcpaepo52cpK+mr6Gfq6mnoqqco6mgrbunrrGuoaqio66enqyml5+aoaKbn5qZoqqimpqjo5WWk5+hlpyWpayLn5GPkYyCin9/j4B6mpSMiX1/jIeRkI2KhpOYkYeUo4qRkYeQmZCTgYh9eWx9dnl4Ynt6cnBxc3hqgnVqg2djaGFuc45tYmpwYG9CXXlrVl5OUVFLSU1TWVZNXF5tV0VYYU9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUl09I5GXq5ifl6ejoZ+no7evrqKvsKmrucK6s62gua+rp7O6x8rIv7fBvq+0vrfEtsKysLqxssC2u763qrm4vaqktKaoqq+tubComLi8o62+tLOhrri1p6aosLOgnqSlqKGkmZ6sqKieoKqvp6Cml6KooLC4n6Oxr6GroayknKamqZqam5+ilZybmZ2pppabnqiQl5KYnZOZlqGpkJqJjZCHfYd+go18e6GMjYh5hI2Gi46NhomTmo6JlZ+JkJWDjJaNkX2FfHRwfHFzdGB5eGpvcHFwan9zZHpsaGVkYmaHgGBbcmpxTU6AaVhaTVFMS0hQUlFITVxfb1RFWVpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MF1bNSiVm6WYnJWsn56hpKG3q7CjtLSpqbrFt7OuoLitrqywtcXHwLa/wrmwtL23v7u+sKy+sLO/sr3Cuaq7urinqLWop6uvq7OwpZi7tqSrurWunrG4r6mlp6+ynKGkoKSkoZabr6ahn6Oor6GgopOkpKK3sKGmsaufrKOvl5yqpaifmJqdo5Oam5mcpaqam5uklJSXlZyOk5eiqKGQiYqPhnqDfYOKeY6Xio2HeoKIhImNj4WPk5iMjpaZi46Wf4aXjI95gXtwcnZub3RfeHdlbWxsamqEb2ZyaWtmaF5kdIFgW2t2aVpKf15cWE9PS0hIUlVHMzldXmxRRVlVWWVNSElFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFVdaEQuPDJkVywylKGhl5ScqpykoaKgt6quoLu4pay9xbSxr6O1sKysrrXDw7yzv7q3sbO5uLq3uq+uwLO0ubC/wLitvbq1paKyqaepsautsaCZv7Wkp7W1qJ6yvKmopamwrJmjp5ykpZSYobGlmZ+jqKmcop+TpaCkuKikp66mnqWhqJKfqKKhoZmbnZ+RmpuWn6Gqm5qYoJSQk5aZjZSTo6ekkImJjoZ5hHqEhXydjYmKh3qBhIeJipKFlpOTi5CWlI2NlHyDl46Ld358bHRybGxzYXd1aWlqZ2dvhmhoaWNmaWlgamNqaFxme2NgU3RUXFtTTEpHSU9TQCEqaF5qTURXVV5gS0lHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z1AnMp2ipJCNpKaanZ6do7Stp6q6tqesxMG3sayjtq6nrq62v768ssG3sK6ytra4tratqr2zrrKxvb+3rry7saSftqqlpbOoqq2dnMCrp6WvsqmstbueqKmrsaWYnqmdpqSRmaasopiepKmhm6Gclp+dp7WmsKquoaGdnqGUoKafoaCam5mbkpick6WdrKGXlpyUko2Vl4uPmJupn5GIiYuIeIV2gYKBnYeKgol9f4WIh4aRhJaUkI6QkZGRjJJ7g5WOhnN9fWZ4b2tqa2Z1c2tjZ2RkdoFjZWZmZmpqY2tzW19aXW1kYU5pWFpgVkpHSEtNU1g+OV9saUhDVVRdW0lIRkZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQmhIJTWao6CPi6yhmJeglqSzsaKyvbahsca8urGxpLasqq6ouLu6ua3Asq6urrausrizqay5sa+us7a6trC4vaymnrWpn5+vo6munKLAoLGjrrCut621nq2ura2imp2mqaWflZqnpZ+ZpaKonZqfm5ScnqyvprqorqKhmpuemZ6kmqSdl56Xm5OYn5KolaqnmpOampKMlZmNlJSaqaaOjYqJjnuBdIGBipiFh3yJiYWFioyKkoSUm5OSj5CQlo6Qf4CMjoJwgH5meW1oa2lmcXJrXGhjY3SBYmZnam5sZ2pqaG5dbGx0cGFUY2lkZlpJRkxNT1lRUFZhZYFVQVdTWVRGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyc0kaGbjY6wnpqToZqpsa+fub+1oLTCu726saa2r6itpLa3trasvK+sqqu2qrO4rqaztbKuqbC2trGztbqmqZ+1qJydqKGorJqnvZiso66vtbWsrJ+xra+popucoquonJScpqSdmqqipJaan5yQm6Sqqqq8n6ekoJiamZ2hj2uilpmccIKVmqN/dZGpp56UlJ6QiZeZgJaKoZB5h5SMg21pfnaDcWyGi4Z9hYyHcF5jYWeEmIVri4+UknR3i4R+g49/Z4aAZ3VoZVdcaHNuTlBqY2dzhWhfZWZubWpdYGGKj4SEZk5LRDlHVGdeSkdQUFVVTEhTYXB0ZkZbUVVQRkhFQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUFAQD0yOEBFPTEsKzA4PUc2MDEuKi4qLzU2OCwjMScyMTQ6MTc1WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoujmYWVsJubk6Cbqq2qo73Fr6m4wri9vK2ntrClq6O2srGysLmtqaastKavtaOpuLa2qKestrKutK2zoamfs6qeoKObpaaYq7mUpaWvs7etrqWpraqspaGenKCnppuXoKWlm5unpp2Tn5+YkJ6oqaS2sKSjop2WmJeXo4igjpKZhqCHk5ygf6R/paqekpKakoiEcniNjoWIoXaIjGmXiGZ9c3igb4iHg36OfH+hoKCZgHyHnnSHjnWbimyHgYNsaGVjemxxYVOFbWJsaZhxWGlxcIhYXmlbbGxbiHFuenKFZ4aEWl5HTj9HX01FUlZWUVFSV1VnXk1XSVJSUEZHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3MCiKppaDnKucmZidn6qqp6q/w66xur23wL6qpbewqaylsrSur7K2qqmlsK2ltLOcrbW2taanqLOwrbKnrp2qn7Gnn6KimaGhmq2zlKOlpbW9pqynq6qsqKWhoJifpqOZmaWjpJicpKmWlKOclJOjpKaht6SkoKOYlZOXkpyIr5CXlImpi5ahnIWxgKOsnZOZnZR5gtSogIeVwZvHeXixpbeXZIDAnL95hIR5kYR8kJCRynKXvJzFenK1pruQe4BslrGrsHhoa1ixrm5labySvG5nem9yj9h+U2tjtrJ/gXKVdJqhqpBXT1diUFZORlVbWFFQUo1cV1tRQV1EUU5FR0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjKaSgKeqn5ecnaWssqiwwr2xtb+1t77BqqezrKypp66zqa+1s6anprSlp7ivnLOytqulpKexrq6wpqqdp6OwoqGfnZaanpytq5Oeop+0uqKqqaGtrqWhnZqaoaefl5unoJ+YnqenkZynmpSdoaaiobGjn5+jlpaSl5KZha9raoqNqn5mg5WGrWRwnZ2UmaaUca6hpH54u31roY92sV9qtFulgGWckWBmgntmf2p4a6llvnJnpox1sWp8sXh0kpNjbW2nbluEoEVoZoeWRXWcYH5nfKSnglpfi6tpgJV4eWqnN0qvXFhTbGRbS05YX1xXVjtOiVBXVy9JVFNKREVGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMwG5CilYKsqKWeo6SqsbestL2/r7bEsre6waapsKuuqKmvrqOwuq6jpK2yo6i4qJ6zs7CjpaCqra+sr6ann6Ohr5uimpaVlpqarKWWm6GftLOiq5yira2gnZqXoKGonJido5+cmaGmpI+dopmXoZ+qnqamoJqfoZaVkZaQmoW1m7V4hamZtZl2hrObt36TlpaplH9rgaZ7goaIkpSSd6tna7Fcq3qNhpR0iXKPhoB/iJCXeIKCi5iLg6CPhLB2d59xa2tsfItOpFhIYmKZfmNopmB5cnVTk4deUKltY3F+h4BinC5RoW9bU2toYExLW2RYXFpCP7J5WFhBI01oRkNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o4YVU1MBuVn5WIs6amoa+pp7Osqbu2wrC7wq24tr+qrK2traatsamgrryqoKe0rKOrtaSmsrOnpKKep6qyqLCnpZ6fn62Vn5iUlZWXnaugmZmkqLSuoqmPqaiqm52VmKCkp5qenKKfm6CjpKOVm56XmZ2iqZummZycoqCXk5GTk52D1ZOZuXCwwX7GhnzWlJu7fJqVpY+NnY2ke46HpIKlgnqseY+dVq96iH6farlbuneHhH2mgpN8mHqpeI2dj3uxbo6EdJG8hW+UUK+nxYpRoHpjYKpic3KIbZeIYFO1tMiGgIl8Y6QzQp12XVBqaWRQQFhnWmRhSkhObk5cUk9ZZllDRD9FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6O0RIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSguMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFRNzElm6KUmbKoqKa0qqW0qaS8t8GwucCxtbS6s7Wnsa+isLKmn622qJqnua2jr7Ggs7SxoaSen6epsKi0qKSbnZ2plZiXlZeVlqConJmWp62wqaOfj62iqJael5uhpaGYoaGhoZqhoqabnqGelJmbpp+bp5WbnJ+hmJCRlJGdiLJuaLVxq4dujqZytHNytnual6SLj52No3+RoaV+sHaDkdLSdlyue4V/pG+bqqZrh4V9rX2XmY57sHKSnY54s2WWdISeb55mlFLIi1rCXJ95Yl+tYHZzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPa2BsaFBVSEk5PVZSWldYSUM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTTYyMKGdkqWwrKOrvK2mtKantru8srq/t7azubmypLSzoLGxop6rsKSXprmtpLGwnLS4qqCmnaGppLGorKmkmZuZpp2Vk5eYkpKhpp+VkqWqsKailpOtoKWSlKCbpKaflZumpqGaop+tmaCenpCVm6GdnKaVnZaaop+VmJWRm4Wse3eodqONiIapb62KgqeDmJihiZKai6J/k5mJroV/grNccrNSrn2CgqR/cth+eIZ+j52Fmpp2r4aJkZyHd7RhmmWagoKUbJJasFhLmnWYeWZgrV52d4homIhrXa93lZ6PeGw1eciusl9CVG9eZ2BFUG1fcG1WVk0uZmRpU1hRO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEk6OTmfnpSgubCXtMKtqLOoqbK6t7O4vrm3sbS7taS3sp+zrJ+eqKyflKe1q6iwsauttKSbqaCfqKG1pqapopmdlKOhk5KbmJGUoaSakpCmra+moZWZqZ+ijpGhmailoZWZpamdnKSerJ2hnaCNk56anaGYmZuWl6Kgk5eQpp6GqX19pXihjo2CqnCti4GnhpafoYmXl4ijgpGIlKp8gIudeG+xWqiCgoigeXTZgHeIdKiBjpuNkqR8lpCfhHuyXpxkoH6DlWySXKtbWpOAkX9oZ6pkcnuBa5iHc12rWomgjmtvZU9KQ6FcW0x0XWJnTVthX3J0X0tWN0qblFhHRT1HRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMj84op6amr+rmLTCrqutqaW0sLextb65ubKwtrqourSfr6SdpKennpOqsKmvqbWsqq+hmKGgpqSkuaKjq6CWm5Chn5STnpmTl56ej4yLqLCvp52Xm6imn4ySo5eoq6eVl6mnnp6go62koZ6ijZShmJ+gkp6XnJWeoZWWjqucj65tcrRzqYt1iqdztHhzs4CRpKOSnI6JpIeQd7hvjHuLomprtlqhhWWXl2mgoqdulHK0dJOYf7JqhZKIrWt1s2GdZqJvh5Nql1ytX02hfIeRUnOjbHl/fm+Yh3Fcr1Y8nHdmVG9uLlynT2NTa2VibVpjXWFwe2NUWlI+Pm1vM0NCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKabm527oZuywK+tq6ynt6m3r7XAtLuvrre2qsC1qKmgmqWjoZyRqqmntaOyqK6qoJecp6Clq7mdo62blpmOpKKVjJ2gm5icn5GTlKq2sKiZlJysqZeMk6WZpa2jkZaqsqSfnqarsZmho5CZopagm5acl6GTnamclJCrmYfUkpq7c7DDgMOGftWWm7h4iJCYjJeLjKeIeqO2dX13dsKCmrJgg7p5wHx1uGO1gYyHqX2VgaypcXt/dLyIp6BpnWGmjq+ifox0h6p9vm9zvHSyg3V4gYpumohxbo2kdL1ed31aYXm8a1pWXGp5XmphZWdjbXhvWlxaREFAc0BDRis1RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnmp6ivKGXssOwraqrq7GnuK+2xLC5sKy5rq3Asaujop6joZubkKmkqrKjtKatpZ+WmqqZp6y5naOtmJSgkKWfkoycop2YnZqRlZKvubKslZejp6eUkJaknKStnpGgqKufm5+oo7Ofo6WOqKGUopqcmJWjmJCvoJKUqZ6EkJi2f4+RjLeVeIKTmrV3bWtuc295kIWPinSewbu9mXqBsahwgHORuYN8hoaMh418ioeNl3yku7m9nHV6tKN0dpd2dLB1mZ5mhmqNtXRycXe2jF5/en2JaIN5bnlii6xwdYV/WFunakVlWlRmYGNeY1FoZ3FtdUJOUE1EO1pNP0ozOzAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43MDdMVF9HJ1NiVzgqT15dPSs6VlYnPjs8p56gob+llrTDtKyrqKyrqbqusMWutLGstqa0uKypoaGlnqCdmZOrpK2ppbSnp5+blqCjnaykvqahqpaTnJChmpGPoaehk5yXk5eUsbW3rZmepKSii5KSppulqpuWqaWlnJqhqKWnpKmhkq2elqOel5eXnZ6Pr6iUm6ahjWp9aZumeIdyfZmOdHlkh3u9vsC6b5ODcpWHYXNqWl2aiWFjiI6Va2CAlWNtnXdilWuAmpWUZV5gY3Caimhyi32FlWdqfnJ1eH1+Ylt3dIFoUFxug318i2tYa3uCckpKb4ZwTnRNRVhdZ2FMWlhnY19PW251aXJSUERFTjtIST1NPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBfTCgzPltPJz8yPqmgqKLCo5u1urWjrKWup6e1sazIq6+xqbOivbGxpqCiqJyim5mZrKavo6O0qaWbl5Whm6atqL6nqKWUk5uVn5mSl6SoqJCekZCYnLCyv6ybp56noomTkamaqKOamqygo5mbo6eso6Cro5qxm5SnoJaUnZ+dl7Cll6GnmZuQnJyio5iloZmbmZmZj5WBZ219cXeSl5SShYu1qoyFl5WOioyYloeUlYqEk5SRiY6SlJiUmJaaoKGanJSgnY2CeqWGbGp8kXyAdYqKgXGCeHl2doqAfIpqc4F1g3Vld313a296bWBjXXBoTVhaZmpgV1pwem5tZlRPRlM5T1pNUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCzobOiwKGksrK2oKqmsqelsLSqyKqsr6S0pcCns6CdpKSco5WVoKqnrKOitqufmZaWn5etqqXBnqujlZGbl52XkpOhnp2hp5OSmainssSwmqudq5+Ql5aonaqbnJ+tmaGbnaKkr6eipaifrpiXp5yZmqCenZyvoJyhppWXkpeTn6CVop2XoI6Wk4qKjY6XrpB8lpuDkoKLqqmFgJiXiYOPnoh6hJCHhpqSiIaKlo+bl42RmJ2jlpqTkZ2Nf45mobOvhYqEdnuSin12eXpvZnmQgYCJa3WBeohyaXN/e3aDh4JrdWR5ZmBqZWNkZmtZbHtwaWpcU0xQRF5URkA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9iY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0W0c1PCxAtKC6r7+sq66ysaCrprGtoqyzr8Svqquisq28o7Obn6aioZyZl6ilqaakpbK0npWUnZmZsKWuvqCsopCRnZmZlJGUoZyXqJyEn6qro7TItJ+qpKuWlpeapp2pmp6jrJSen56gqa+qpqSsoq6bn6CgmKSenJ+cr6OYnqeSl5ackaOYl6ecmpdlgpJ8ZX6NmpBjeY5taWt7kqSqamSal31nhoplZWloe46hj2xojZiRo3draouZo56Zc2xueoONh3pYZV6Gg15ti4mBdlxoc3d3koCHgm54gniAc215hHR2iIiPg3xrh1lebHVkXnOJaWt8cWtjXlJOWElkWEFKND5HNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMllDOz8uPaWfury5r6y0saqlqK2tsKatrbC8sKmmo62usJ6slqCjnaKZmaaqnK2jpaipsq2elaOPoq+ltrmmrqOOjpqhmZOSmp+ZmaSVe6Wtoqi0xLiloqevn56UnqKeo5uiqamSn6GeoKqwq6ykq6Cqm6efp6CrlaGbpbCkl5uqlaCcmpGjlp2pl519vYOIcrRyhJ2GrWh4ucS4cZOio3qlmZhzq4J8y8DAu3GMooiDn32WmImdwL2Cl52djZ3CwXyCe5KNmsPAfmylsm6MgW/Ken+bd5GDjoF2eYGAeXF6f4dwd4WMk3lueJRjZl95ZGBlgmNedGhsZGNYTFdJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLiNGWzNQWS9WQUI7LziWo7nDtLCwwKmolKOvqbCuraaztK+ppaWmsKufq5iaop+cmqqnop2soqWopKS0pJ2ikqatq7ezp66ikZGZnKWSkZ+gmJufnYemrKSrrcDAsaGpr6mXkZ+dopqho6qjk6Cinp6tr6qtp6Skp6GmpZ2tqJGkmqitqZqcqZuroJWVpJWgopacfs6UeHqkgXmVlptfro9ejqeBoqB8p5abc6uDgK9eY42qe6eHhaB1l5OIs2OCq4ahjY2zaoSudH2XiLdhgq1ao81tkHV72nt/mXB+iJJ2fmV7iHZ2a3yIbn2GkZF/bYOQYXJscGhgYHlkXHFoamRnYFJUU1ddS09DNUFIREQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NDc3MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSzAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGjqqets6umsqysqqKqp6+poKebmaWXnKKvn6CeqKejpqGfsKyanZWnrqywqqisn5SSm5+kk4+epJedp6OerqWrsKi/x7OoqbGulpKdm6KXn6mqn5Wgn52dra+prKqdqKikoquSrLKWpaKqqp2jpqShr5+RmKaYn5mTk5GXoHGFjJd1haiGcbF9nnKsfqGegaWPnneqgn2tf5xzrX6rh4afdpmSe3yXfqqIooyRjJ1+q3qIlJCfgHutVpzEeo9vksF9gZVtdW+MbWV2ZYZvYXducm+JipKPhG6SkWZwdXVxYWdtZV9vaWluZ2RYU11hWlJTQzlJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MjQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08KD4xKTNWQEYhHEc6QzEuK7DTxsaytKCdo46joqKsr7auqLCmqKqmraurpqGknZmhlaClq5+ipaCoqKOfnbCsl5qWqaeurKinqJ6XlJqjoZKUoK2bnaair6ykrLWquc2yraaurJeVnJ2imJ6trJ2XoJmen6myq6urnKyrpKOsm6+xoqirrqWYpaqoqbChkZWipJmTkYSkaqR1iXqpdHqycIKmipmMcYigmoekYGBSq4R/roObdq2Bp4aGn3qZl4Z7ZoCjiaSZhoKjfal+gZaHrl99qVWdopKBeqKfgHvDr8WLcq+zs7lxYqmvwnRojIyYjoJunJVxbnp4eXBtZ2VlcnBmfGljXVdgalhZVUxMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfDydXVv6GZq6egr6KesLSwrqmsoqemqKqrqaSmn5uknp2mp6ejnKyaoqyho5+vopybk6ukta+uoKianZaUpqOQmqKon6ClnLCmpKixrLbIsrWqrKmWkZ2coZifpLOdmqGUnZ+nrK2lsJutqqOiqqGzraGqs7Chmqinrq60opKVoqaYmpF7qmyehId1q3l8sG+CpIuJn5aWn5SB0ri0uMmAgbJfYJSpg6SJh6B6mJaaeKrJdJqklaipkZOajICciprGx3hmoYKlc4GfjoJ9r11wtGKwdUujhm2nR4KTZI6QnpJ8cZmVgXF8dX58blxmanNxZoFrXmFZZG1cX1lJTkxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqLKtrKWinLK4rKqgpZqopaqrqaafpqaYqqOgrqudpqCsmp6ppZ2ntp+il5OpqrayrZulnKCUj6WskZmcp6KgqaauoaSnqbC1w7Kzqq2ok4mXnaWaoaOupZehlZmcpaatnLGer6mnnqyjt6yhsbivnZquprKysqOTlqeimZ6Ogp1OeJqBf596hKN9g6SEh6aenJ6ThLh7e3m5gn/MxsK2eJuhkIuffpqWl4p2npiKpZikqH+whZ2GoISsfZqUYqVspHCPhJCBfZaCcqxgo3NxgJpgvH1SVXSOkqOWe36Uk4x2fHOGgHFcbm54cmqBb1tkX2luYmReTExRVEFJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX11aWlpZVVNPSEA4ODIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu5qq6fm6GssrOlnqCVpa6trqunnKammqOnobOvoqmnsqCZqqWUorWiopWXoam0uKSbop2jko+hsZmem6akoaKvrpylqKK2ssSxramtqZGHkJynnKKknKWXnpiamqakq5uwoq+lppivpLusoba2rZ2ctLG3sLGll5yun6OchY/RtcO3eYeOhZGTkICmeJShd4ygkYSlgYpxqoaFtG5yapmjnJWKnnyYmYaHj3OvgqWboo2mi5Odi5aQm21xsl2lc5N6m2uZf3uZfG2pYaNxcX+fYnOyuGh3j5SmmH2NjpWNeX55kINuanlpeXJvgHVeZWVvbWZnYEpbWFg8SEhAVTRARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWTc42Krb+/vLq0npanpa21oaKZlaOopq6rrJmmop+moKG2p6Opp7GjlKyjjqWto52Qmpqqs7OknKScqZGUl66fn56mo5ynnLWZoqqktqvDsKmrqaGMhI6coqCmo5WampyZm5mnpaiZramvo6Wbraa9rJS9sKyeoa+yuaqypZqosKKnl3mokH18sHeKgKSliJxtsm+gh618oY+Dp5WYgKyJha6Fn5SqoKGXhp+AmZWAe5J+q4CdmpaLq3idoJKKlJKBeq9eo4F9pqdjnYB8l3Nqr12la3CFmV1gW4ygbZWRppmDlo6ZjXx8hJiAa25/Y390boB6YWdmcW5oZ2hDWmFbPktVM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBgYWFdXVtaWFNQT05JODA1Mi4qLEFUVlZWVVRVVVVVVFRVVFRUVldXWFZVVVFIRklKIygovZOag6nGwrbBs5+arKCtuKWjjpuko5+wsKqfpJ+drZmfuaCjq6CvqZquoZCrqKSWiZuQrrCspp6mm6yXl4+soaCdpaGZpJyumKGop7epwa+lqaSei4COm5qfpp6SlZqblJuapqWlm6qsraSln6qovqSWwqupoqCrsripraWfsq2nqJd2r36Qi5yFh326rYqZZbGNZZWtfaCPg6aVmoGsioSwhaaapKGhkYWgW2xqgbNgf617e4OBsW1nb5mYjIixW361XaSEa8iiZJ+Ae7xYdrVZsn1SroB6rFiAoW2YkKibjJiSmZh8epCef2V1f2OFeHSAfGJqZ3FtZ2VmT1ZkXEFVXz5JKD46PTQhIiwlHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFFSVFdaXmBfYGFiXl9cW1hVUE5KR0M1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7G3vbqzwbOjnKympLaooIqaoJ+ds7Opn6OgnrWZoLSoqqyer62erJuVr6iijoibjq+sqKehppmukpiPqJmhnaSfmaOjppmgoqqzqb2vpKienY99i5uWoaCZkJKanJKamKmgopqprqimpqKlqbueoMampKigqrS0q62lnrqsq6uUgKmSo6+Om3+HpJeZkIKAuMO6g46ckoSnl5yCrIqCr4innJumqpB+1b3CqmKjv719fqOCg9e6uLWFlZODnr2+hGyjgm+rhGycf3qysMeDaauwvax4d6K+vHOAlo6mnZGbkpqfe4KSnHtkfnxljmd5gnthbGVramNQYVtTalw/VWJDTik9OjQvHx8kHyUyIB0kKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PUE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbOzsb+5sr2yoZyupqWypp2MmKW/qriyqKK/p6eynJ6xnLqon62vpqeUlLCsl4yDm5GupaKsoKOcqqCXiqKSpp2nnJqhqKKZn6Gsrqq6raijmpeTfIeZkaabko+RmJiPmJSpm6GZqqmhqqego6q7najFoqCuo6mzs6muqJ+5pq2tmXN1qqS3hmSJoHBorpGKkG5ud6SQmZ+Bda6YlHCPi3GVqKObl66kcm1sbGaLeG9ugplxgXpqcWlnipeWmHFpaYWIZ3GGZF2IYmpvWVxmfXamX2FxjpFuZWV/jZOPoZiZmZOZoX6JkZZ3Z4h4aY5ren95ZWxjZmxiS2RYSmxaOlBlRVInSzorIxwgGyIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVlXV1ZXWVxeXl1cXFxdXl1eXVtbVVdeqZSss6m5uLKzqqmhrp6jsqmXkr6yxMq/t6qfwKytpKGnrKC6o6SurK6njpeuqY+LhZaXrZ2mqqCdo6OgkYukkqaZqJmWo6qglp2mpqewu6ysmpuTknuElo2lmI2RkZmUjpiWqZagmKmjm7GmnaKruZ+vwaejsqWrr7CprKqmtqKstpWKoKiltp2JlqOZh6qbkZWdkqmymZqjqqCylqKhnZ+inKGloZWrp42SkoyHk5ydlZGZk5mRjpWGgaWbmJaOi5SUi5CGhH1niX50gnVzhopwp2x6lJGTkoGBjY+Qj52VopeamaSEiZaPc2qRd3GMeHd8emptZGNvZFVhWUBqXEhjYU9ZK0Y9KychNzUwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhUVlleYGFjXV5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaW1xcXl9fYF5eXl9fYGBgX1lZYKaWqKqltLaurqKwo62foLWxkI6sx77Gu7mro6WenKafsamkt6edqbWnqJGYraKLh4mPnKeVrKSfmKeenpKUo5anmqiZlKahpJCbqJmhtruoq5makIx8gZSLoZSKlZGWkJCUmKaQn5uqn5y2o56nq7enrsGto7alrq+vq6iosregrbuYkaWkpraikp6noI6qoI6Sn6Osr5qgo6+or5ijoJyjqp6enZyWq52TmaGblJCWq5qOmZmWkJafkomhnpWVhZKNkY6Vi4B9ZouFdYZ1eIeCc5xqhY+Uk5CJfIuVkpKYlKOTn5mkhYqaiXxzl3N6i4BzfH9qb2RecGpgW2BZbmRQYGVQWjpHR0U+Mj0+OS8qJispJh0mNDE2NjY4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOjlFTVZbXl5bWlxbW1tcXV1fX11eX2BhYWJhYWFgYmJiZGJcW2OXlaOno6+yrK6jqaatn6e1qpCQnaW1vLCtraKjmnueo7KkpbGpl5u5p6OTmaqcjoaKiZyij66eopWon6CSlpiarYuplo+omamNmamPnrq3pKWZm42IeYGUjJuTipWSlJGNkpejjZ6fqZ6fuKOAhK+1oq+vdKO9o7Gfd3mfqbC5lHWso56JgKp/ZFxidqCPpZ+El31tkrOco6etqqJlnp+Sc3mal3CAmKiXbX+iqIplnKadkpiYloySnJKGnpqQloSSh4+PkomFd2qOhnaGcHuFf39gaIeKlJKLWnWUkGdokI9ze6icm2Z6momEeZlqhIuEb3mAa3JlX3ZwbGtoW2dmYmJwU1w+Tk5OU0c+QFVEOTEvHh8mNDozMDY2Nzg8Oz5AQUFGSEJHRklLTVNUVVldYGhmZ1dRSjxERzw4VVJbYGFiYF5fX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5Wmo6CusKyrqaWorqKmraSSlqu2sbOnm6unrJd0jJ2woKirp5SXuaCgj5yknZF/iYibno2smqKVp6GdjpaRnoR1rY+IppupkZekiZy7tKigmZiLiXV3k42Wk4qTkZGUjJCUoY+boaeZnLKWgIybtZyzjJKOu6agfqeieqGttYCOjaWeg4uGkLGqr4yKl6SbeoCLrIacnaGnqKeHlYWYd6WbeoebgZingoJ7nLJ6ioahmJqVmJaCkZeXhZuZY3qHkIWPkJKLg21wjoZ5gHB/gIR+hXOFhJWReJZnknSgmnV9mYWjn4iYf5SMhYWaa46Ohmx4e3FxZ2R4b2psa1tlbGpldFxeSVRMUkBFNS5aVVU2KSEwOT0+NzQzNTY4Ozo9Pj5AREk/SUVKTEdTWFtZW2FhaGZZUUg5RUw8PmJWXmJkZmRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXop+lrKyrqKyfqLCmpqmlmZSvyL+xopeoqbWekIWdrJynoqCNkL6emo2fmqCQfIaPmZiIrJyilp+hkYyTiYaAkaeNh6KdpJSYnoefurKonpqSjoVxdpCJlZCKlJCPm4yQkp+Sl6Gllp6rh5+0ibSarYrKh6mtiLeFjbCBrqyCqIymmI2dfaiPcnt3nI+nl2iVpHm0jJ+epqeSmMKBf6uImKFynoCapX2XhZWygaF9oZOgkJiXgY6TnIuZkox9hZOHjpaSiYNtco+FfnlxhoCDe4N0hICWgI/FZn+ph4+ja56EpJ2EmoGOj4eLmnGQlIVoeHV8eGhodnFoaGxeZHBtZ21YZ0ddUk0yRDQ2TmJlNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05JSkxDUFpdXFdhXmlsXFFFPUxNQEpkWF1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUlqKfr6eoqKWrn6O3sKmqppqUoKOkq6SXpqu4o7CBoaidpp6diZS9mpONoZKej3mElpaRiKuZm5uZooWOi3ebnI+fkIiepZyWmpiHo7mupZqcjIx+Ym2Pi5OQjZCNjZiMkZKgj5SgoZmhp36hp4etnaCWrY+enJ2RhYCgjKmthaONqZmMmn+jdYCZlGuCrXZNq3iHjZyRmqingKmrfYOhe3qnap5/kmtnl4aXt4mefm5gZFmDl3+Me2Roi3OZfXmWbF19l21fU3CDXF9reIJfWGSBfIN/l3CnqmuDo25ypXCfhaBqZqBtW2+MfWdaYISAYlhQb3dmbXRza2pvXmtxbWtpWGlPXllGOUE0SERfbDUsSUNSTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl5idWBNRDpNT05UYlxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5WdoLigqaOmrJGgtrurraKZmKGipa2uoZ6vtaOok6GgoKecmo6ZtJqQi5+MlYt1gZSSjYqnlpWYnp9/koWFrKSHmpCKmamZmpuSiKaxp6KWmoiJgGluiIeLjo6Ki42SjJGTo42Un6CcoaR/k4GPo6GUoHeclY+ng6Gmf4Wnq4OleIl8hJp+onBzlIiWfJ+NeW2Hm4yZj5uomo+HnXuConN2pmaefnekX5h6fZN0om6Yt7S6dJOHgn+1qGSBxrh7cJW2jHKAmqRjc6yrYHxpnbN+bXyGgY2Ci5hxf6NscqN0n4WBpGCdmbOWcX2Yn7N1c1uesoNqY290dnFob1hrbXNyZl1pXmNMRT1ENlJCWnMzPVNHX0pSPTwzOTU6OjZEOztASlA/VU1PUUBFX15bWlhgYHxkSEM4TFdVV2NhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJOVlKO3mKqbk6CNpLe0ra2gmqKdpKOmrp2csq6sk5ihmqGkmZqUn6ubi4iSeIuFcYCWjoqQoY+SlJ2YfZCJjaigh5eOiZKjlJybjYupqKWekJeHhX5qe4d+fZCNg4uQkYmQlKGDl5+gnaCei4l3nJiijJ9yoYuHqYibpY6Upql9rYx+eqCZeqOTeIF0loiNnH2Wn4abjpibpYaiZKF8iJaQm41tnmibjm+amXuAi6d9cmh0q4Oeg3SqaJWaXZuFdoWdZ6prgLhmXKhwgZxglYxep3Z1h4h+nmiadIWTkpeOgJ9vmpBup5pdqH54u2t+qlyOhF20Z1xucnp4a2lccWt5eWNgZlhiQlFGTzdXRFNvNUtbWl9PWkRAMTUxOzs2SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5bXlllZ1hmZ25tYmJlX2FhX19gYGVjXmJkb3FgZGVla2VjaWhna2mVm4mptJqniGOUm6u6sa+snqacnKmgn6+cnrGprZ2XpJuhoJmWlqGkmYaJjWqIgHJ7l4iLlpaEkZWYkHqKhJWknIqUj4aMnpKdnYmQqaOgmoySioGAaYGGeX+XjHuJjo6IkJebf5Sjn6Chk5hyaJ+Kn4+McJKMgamHmJ6hpZ6me7Cto6K4l3ejs6OkgIiUeZ17qpp/oo6cmpaIl3GhfIWNr7V9a5qRoXl+mbWjpKuohJl8m32dmn90qlpdb3uWi3ieYkx/e3qFY3mXQkyfWKJqcXuObICIhJl1m3iGibGzf4Cbk6d3g51uc32VcJp0a6RdlXZIZWRgdHF+fm5mYGxpdntkZGJRX1hdVVdAWkZRaEVTV1xiWF5JRD1COD9BOklGOExFWEFXUltWREZiXFpgS2BtfnJFQzxVX2JaZmpWZ2htb2JmZ15hYVxdXmFoYl9lY3ZtXWVnZmtkZmxpaGtpk5yAsK2ZhFNeoKazubKyqZqijJysnJyqlKKspKKoj6CenZuZlpihnZaIh4l3hoFveZWFkZuLfJGTlohygIiSoZtzkJCBiZqVoZuFj6mcm5WLi4t9g2yEhXGCoYx4ho2IiJOZlnyUpKGeooithn21hI6enHullnqpgZWbj4mfm3ynaHdtfpl0oXNyfJ2GmXCTg659pIOmnZmBpG9eqGd1omNvpWGc05B9e5l4c3RiooaQfqNzpI91a4+zjGCCmIlzqrKovH93g21+v6aptF2bbnxwlm1/cqJyXaRnc6ZgaKZtm9SafYabcHp7mGycfHiXc26ppGdgZXpxgIRsZ2Zkb3V3Z2FjU1xmUVFiSVhKVWFXU1tlaltlUUZES01KS0JLRThPQFFOWFNZT1NRYWVlalJjd3l3SUZFY11lWmhqVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJeagLCrVFxLfqmvsbSvs6ObmYWZqaChpI6lqaGZqoqamJiTmZOSoZiPiIZ7cH2FaH2Pg5SagXeQjY+Jb3+Fj5OSbJeTfImSk6WWg4+rm5STi4aKeYN2iIBugp+Gd4CShoiao5h7lKOkmp+Js6Gitot6rKekrqVwqYCajoWAmpB7pIChmYaYcp6Eo66vipeMgI2kjZWDraCUdrW1tcmhc5SLgZ9gnZepbXmVh6CbdKKHd6B+k5eLgW9NZqOScJqHc6R7enRhg4FrfaBrcWRfnHF9c5ZoeWmztbTGpnOYfXqda5ybq3aFm212eJhqmnt1mHJQRX2zX2p2a3mHZmtoY3V1cG5XX1RZaVFTaElWTVlUVl1oa25WZ1dOS0JKTUtISk9BUUtQZWNqbWV0c3N+eXxudYl7e1RQT2xeaVxraVJqaGlsZ2xmY2VgXF1dXmliZGlre19dZGhjamZubWVpbGWhm4iupoRlP5Ohsqqur7WiopCAl6qio6WMpaeenaaDm5eWjpeQj5yTjoiDemp5h2WDjX+YoHl1j4iMgWmEhZGDjIWdjXqNi5amk4OZqpiNkouBiXp/fYt5cJChhnqBlYeJlqCWf5SlqJyWloRmbnicbKJkfHGld5uYcGemgJWKeqR6n5aDl3Kfd4GKlZePuW6RiqJifZmglYhtcmmqa3WgbW+mX5ppi5BploeblXSigH2aYIyGjXVviGJooGWefmmbdW9jZoiCbXGiWl5bY6FtXYiLbnp9c3JkpW14omRnp2iZc4yZcKJvVYmQb6BfZqhUi15UmG5tc2tygm1waWx5c2tvUllXV2ZaVG1JWU9dSVhpaXNqWWtWUVJGVlxNWFNhVWlrX3d0e31wfXxyg3uAc3aNgIR2XlFyYmdjcGdQamhoa2xuaGRnX11eXWBqY2ppdnVdXGNpY2pqc21ma21jnKSYpXpkdG2Lp66jqbCxpp+MgJirnZ+mjKOim6OigZaYk46akIuYkI6KfIdxgIlpi4t8mJxzdIl9kHxkgoeUiYmVmYJ8iIeXqJGBo6yQhpGLgop+gICPc2mQpoR9hpSNiJmgj4iTqaadiKZ4lZt+pYiWjLKYnpCCr5efpXaUhnipc6WPhJpupaKMkoSNg7tufaWvg4aFhpOVnJ98pXpyqJWglmaefm+sY5WKlpN3qG2qooGJdoiDd6uRpohrkbBrdrOMqWuKhm1tn56SlWB+q4uqdn5+i6Wedp98g6SVnaBqm4h4rGierYy2dHe+jaSTWYOnjqthdXJ0cXx1cWNrf29obFNXW1ZhYl1rTV1SXUpebW53X1txWVxgW2d0ZW5vcmJxdGB3en55cnmDc4N/gXt7jIGCgHZieGRjbnJkUmtnaG9scmpmaWFgXlxia2JtbHpvXFxiaWJsanhtZ2xuYpWlqpyAf52jlqmqnaimrqSZioKYrJqfpYqbpp2pnYWMmo+HnJGFko2MjXSHe4mEcI2FfpiUdHSFcpKDbX+LkYeGk459e4KGmKaOf6anjoGOiYWVdoKHk29si6mBg4yUjomdn4qMlKujoI+AdZSXiH6BeZSuo3+Bm3GPhneOiYJ9e3KnjHF9fXqYlpuEj3l7f36Hk5WTinaQmJ6gg3t9iWuMhVt5eXJ6cWlufpKJcYB1gY+Uk3GGhIJljH9fgH+Ld3RylHVveW5uh2yEhV51Z3eOZYCAhY2omn10e5VqiYhwgXZ9h3dubWeMc3p8mHiFXGtYeY9pb3hycm94eHBda4duamdWW2BXXWZrZFZiVV9RX3B4eWxrdmZqa2x3fXJydXNhb3VidHuBeHV6g3V/gH+AeIqFg317bX9sZHluX1duZ2h1a3hqaWplXGBaY2plbXF0bltbYmxkbGx5bmhsb2GNlLiopomgopqmpJilnKuioYSEmK2SnqGJm6ebqZiDgZuLf5aUh46KiY1yg3yPfX6PhXuYj3Ryg3CVhXt8kouGho+FeX6Ah5qljnyooYuGkJCFlYOGjph3coSpho6SnZCJn56IjJuon6Cqg4iOlZp+fomWraiPkaaPd2+bj4F4kG5+qIVwfZVxa3B9gaCNgJOOjGhtXYOLi5uano5zlYuIcXRrgXZ0gVlyboaRgX5+jGpdamR7hYSJgGBpeHqae4KKgXWBhYJnd4qGamFwcYF1XnGKgIiOpZSFZYuNg253i4RxhpB6cWdoZXyEe5ZbXGpnbnZbfHl4dW5zc4NnXG2La2tiWlpfW1pscVxfYVpfXWZ0fnt1cHRja2trfH5zfHh1ZG11aG18fnZ6fHt5eoCAfm+GioR7fXN+eXN/aFVccWlsdW91Z2toZF1hWGtobGtxcm1XW2VubGdzem9oam1gi4uqsKCPoqGanp2Xnpioo6J+g5mujqCViJyikaWVf3uYhX2SmYmJhoeKc36BjHaFjIKFl4pxb4BymIaDfpKDhIaKgXqBhYycoZGDp6KIeY6XiZWLi5yYhIN6rYKRl5qVip6diIihqp+hoqOLh5ObnKOZlqqhp6afkpqGlIx6do2Ng6d+f5KQkpOcsqablZ+QjbKTl4OljIyVmp+JkJuCiJGKa3yOd3hlgoaQi3yJnYSHjJCIiICEhJB3fHp0maCIhomdiYSTfn2KgIB1b3KEgX13hoaKj6WQgoWMhoKMkIx9h4yKkYR5bYOFfnqZa3JoYXSKcX56d3dwd3SCXV5vh2huX15aXV1TaHJWZFxdYmxodXt8c29wZGtraoB9bnmAcmpwcGxngXtygoB4f31/hHttgo2GfHl4e316g3hOZHZqcm1wemVrZWNiYFt0ZnBmcnFtVV1sdG1peXpxZ2lrZIyHnLmelqKgmJSYmJSYpKCefH+arI+fjoagnYueln14lIN8jpmKhoOEh255gYFzgYh+iZSEbWt+epeGg4KPf4CHhIZ9h4WOnJ6Th6ughHOLkIaSkYudkn2Ne6qEjpOYlo+cloeHnKWfopqdhYKSmpmZkJqmn6WdnY+Vf4+IdXuGjYSle3yOkJGGmKuhnpSdkI6qjZCAnYyIk5mego+XfoaOg293hnF1YH6Dj4Z1jJiAg4+ChoV+hYSUbnl1dJGhiouFmoSEjHN/iXx8cnF6h4J6d4qOg5Gmj4WDjoCDiomKd4aJi41+cGx/gnxuaGxtaF96f2l+fHZ1dnV7eFxfcH5udWBjW11fUmduVGVbXmJraXZ6fnFsbWRramiBgGxzgWxsdW95b4Z5boeAdoKAfoV2cYKNiH57enx/e4KKYGl8anVoaYJkamNgaVxjdWhvYnVtbFVjcXllcHp7c2VqbW2LiZ63mqGjn5GRlZeLmp6fnnt4n6eRnIuHpZSLmJl5eo2FfImRhIyCgoNufIB5c4GFfouRfWpofYKXiH+HjX1+hoSGfY+CkJydkomonYBwjIuMkoegoYqFjH2okYmQkpeTlpN4jKOgoJ2WmX+AkJqYkoybo6GkmZeRmn2Mg3d/go6Gn39+jIyPfJiloaKTmpGQpoyPgZqRiZKXm36Tkn6HjoF1dIJwd2F9gI2GcYuVfIiMcYx/goWGj2h3cXiLmJGPf5Z9h4pxgYZ7fHB3eoqDeXmPjIKUpZKLhY97hoaHhHaDhImJfGdzfYB5e3Fsa2dffnNofHV2dH1zgGpeYHR2cHdkY1lfX1JraVVlWV9haGp2eYJxZ2tkbWhmgIFrbn1ob3JsfnmHemyMgXOBgX6BdHaCjYZ/fHp/gX1/j2lyg25zaWGHaGxiX3FWdG9tbWB4aG1XanR2Y3V6e3Jiam96iYyespKlpZyOj5ePhpygm518dqWhjpiAjaOLiJqWeXuGh36DiX+JgoF/cn97dHaDhX6KkXhnY32Gl4mAiYt5fYCNg3mXgpaZl42XoZx+cIyCkZSGppuIjImDppWFk4uWl5OSd5GdoKGXk5Z5f46Yl46WmpyknZiSlJp4joSCd4OVjZ1+gYmNjHOXo5+ik5mPj6KMi4OWmIOSlpl+mIx8iI2BdnF9bntkgHyKhXCHk3+RgmyHg4KAiYVldW57hZGXi3yTd4uIe3+FfHpxfXeIhHiEj4iKl6GVgYOLdoiEg4J3fIOKh3hhenl+dH94Z21lYX9qandzdHV9cXxiY2B0bnVybWFaYV5bbGVSY1lgYWhrdnmGcWNqY21laH2DbGh0aG5waYB9gnltkIZxgISDf3R8g4yBgH16goN+fJBtdol0dG1limxqYmJ2VoRpcG5geGdsYmp2cGZ5fHpxYHJshoWPnK2XpqiejYyXh4afk5eZfniqnYuZepedi4uYkHl8gYx+fIN8gYOBeHR5e3R9gYSAiYuAZF99i5SGfoSGdX1+in99mYWXlZiNpKOZf3OHe5SSiqaPjI6Kk6GSg5GQlZeRi4GPl5+ako+Qc3+NkpSJnZ2eppeXjJSVcouNiWuEl4+ZeoeIj4lvl52apJSVi4yfjIaCkpx/kpKVh5mIfIqKgXpxeWt1bHt+i35thZKClHhwgYN+fouAZHFpe3+Wl4R+jHOPh4N4hnx1d398hH97gouEi5Ojj3iDgXSJh32AdHaCiYVwYXx2enF9b2JvY2R8Y25vdnN4d3N0YXZgb2x1bW9cXF9eXmpeUF1ZY2FobXR7iWxgaWZqY2l3iG5mbGlqbWiBfXt3b5CIc4CEhH10gYaJe4N9eoGEfX2OcnqLeHhubIdqaF9pcmOHZ3FvZXdnbmxheWlrfXt4cGF4bYuAmJmqoKOonYqKkYaKnYuVmH54r5mNl32flJGWk4h3fnyKfXyAd3iAgHB1dHxvhn2BgYp/fGFcfo+Shn+Dg3N7gId7j5KJk5Kdk6acloJ9gX2OipKkiY6KjZibjYaRmJSWj4qIjJKcko+LjG2Dj4+RiZ6ZoqGXlYiWkG2HmINmhZiOk3qIhJCKcJaalKOTkomLmYyCf5CdfZKPkoyZjnuKhYdzcnVrcG51fIp0boaQjpJxdYB8gYKIfGRwbHl8mZN9g4hzkImAc4d4bn98f4V7hIuHg4uUp4x7h3t+i4V3fnFwgYeEZWh5dXVwfGJfcGFrdF5xant5eWxzcGV4XW5sc21yWFtfYGFrW1BXWGVjZ3Fxf4dmXWppZ2JncY1vZGlnZWlpgXp3dW+OhXSBgoN7dYKIhXiFfHiEhXp/iXd/i3t7cniDamtgcGh0gGtyb21yZ29sZXxjboB6d3Fsd3eKfqKXoaigppuHjIqBkJyHk512gquVk46HoY2Wk49/dHx3hXh5f3Nze4Zrc3B6bot3gIGIb3FbWX6RjYiAf393dYGBgKCGkYuTnZihlZh4in+BjYmcnYqPhpKYloWJlZmQl4uLjI2MnImNj4JtiYuQkYqdlqGcl5SFl4dpg6KCZYSciZB+i4OLgXeTmJKfk5GJiZWNf36Pl3yRjY+OmpF8ioCDb3VwbG1vcHuFaXODjpiLcXeAdYKJg3lmcm51gJqOe4eDeZOQeXaHc2+IeoSLeYqFgoeNmqKHe4N1got/d3lubIKFg15zdXNxcHlaX3FhcGtecGp9e3FtbWpsdmBvb2pxbVlZYmFiblhRVFpmZ2N2cISCYl1rbmRiZmuSbmBnZmBoa4F1cnNwi4B1f4OAeHWAi4B5hX93h4Z3g4V8h4x/e3eKf2pxY3xjhnxucW10amhvbHZ4X3F/eXx1dXSAg36klZqtnqaWhY2Df5eUg5CgdoyglJOGi5uNlo6LenJ4dIJwcoV0cXaIbHBudm2Jd4N+gG5uVVGBq5SHgniAd3KDeoKhgpOClZSZnJObeJJ7g4ySpJqTjomVmZKEh5eZjJSLiY+Ph52EkIp8couFiY6InJqfm5WUf5N9aISbhmeFn4eShJGCiXGDkZiQnI+QjIyPjXd7kpF6jouMkZaMfIh8gGt2am5rbGx7f2F6fo6WgnZ6gHiDjHx5ZnNrc4aVi36HhXqTjnB5hG92i3mIi3mHfIGLj52dhHx7doKLfXdwamyChHtheXFubXN0Vl9wYnJhYGxuenFocGZmc3RocWthd2VdV2ZhYHJTUU9cZmVdeXCIfGBcaXJiYmVmkWpfaGVbZ3B+cGxxdIp9dnyFgHV1fox5e4WBeIiDc4aFfoyNhHx5lXhmcmuDYIh+b29remBqbnR/dV90fXmGeHRzhX14oI+ZsJyljoKKf4OaiICMnoCLmpSPhYiYj4+PhHd0d3SAcXCFdHByhHBraXdug259fW51c1JNgt/IktaTe3B1g3WEoIOUd5aSmZyRmXuUc4WQn6GTk5GJk5yUhn+XlomOjYiSjYicf46Bd3qMfomMipybnJuVknmMdWaHkIZrh6KEkYiXg4ZjjJGZj5WLl4yMiotxepSIe46IipKRiXmFfH5se2VzcGtrenlbgHmPj4F6fX5/ho57emdyanKKjomBhYR8lIprfX5tf4t+ioV8g3mAjpSZmYl8dXeDkHhybWdxgIVua3VwaGp1blRfb2VwWmBscnhna2tiZnhycHBjX3dgYFZrX152UE5LYWdjXXpxinVdXGV2YWJlZY9kYWZiWWlzc25rcneMfXR6hoJ1dn6Lc4CGf3uJf3KJiIGRi4h8fph2ZXNufWWIfm5wbIBZbG55eXRhdnt7jXZyd4p3eZ+Lm66bn5CChXeIlX59ip2IhqCRj4WMmISTjoeBdHhweXFvhG9tb39zZWV5cX1ten1qaGtjpJrB3K7woXJsdoR2haOGkm+XkZahlpyBknKGi6OXiY6VipGdloOBlpCGipCAkYqJln6HenV/iXiHhI6cmpiZjo92iXVthYiKfImig5GJnISFXouTl4uPiY+Li4WJbXuWgX2IhYmRj4Z2hX19a31keHVqbnlzV4h6koeFeX6AgYaMf3llcml/iY6JgYJ+i5aEa4F1bYeQgY6DfYF4fo+UkpiPdHJ3h4x1c3FndnqEY3VucWNqd2hSYXFnbFZfb3R6YXJkX2h+cHJuWmNyYGJWbllceE5NTGRnYl53c4luXFxkeV5gZGWFYGNjX1lqcmtua3N3jH50d4SBeHd7iXGDhH1+iHt0i4mIloaMf36Xc2d1cnlsi3tudHGBV3F6dnlyZXd5h4xpdoCJcn+ch5innKOShX1xjJR4eYyehIWhjY58lo2AmYeEe3J3cHRqcIFsaW18dV9heHd7cXV8aGBkfOvatcnD3IdybHSBdoubiY5qmZCQnZaUgYlxhYmgjoWLlYqMmJR8jZOIg4mQe5CLhY+Bf3Z4g4RyiIKTnJaUl4aMdYZ9boOBiIaYoYKTjJ6DiWGDlI+HioaJjYeBh2p9lIB9g4SJjo2CcYZ+f3F3aHZyaXR3a1qMfJKChX1/g4CEioJ1YXJqh4CPioF+fpGQfG2Ba3eFjoWRgnuAfH6PkY+ViG5weYyGdWtxbHN5gmB1am9da3dgUmVyaWZTYHB2dGFwYF1og3FzaldnaGJpWG1WW3VMS0xlZ19ic3OFalxcZXleXmRne2FkX11Za25lb2p0eIp+c3OBfnt2eodzhYN8f4d2d4qGj5mBjIJ7k3Vsd3Z5eJN0bnh6fVh6hnGAb2d5d5KCZHaGhXCKloWZoZqiiod0b5OLcnePnH6LmomJfKB/hJl/gXhydG5vZHJ/aWZteHhcX3l7e3FxgGphZmF/1baOkaZ4bnF3fHGTkY2Ha5qPiZyTjIZ7aYeLmYeBkpGGh5iOfI2NgYGKjXyPjH2JhHp0eoN7cYaAlpqOk5SBiHWDhXWCf4mRnJ6GlI+ffohif5OHhYiEio2AgINnfZGAfn+CjI+Qfm2CfIJ0a213dXR3dmtjjYGOgIV+fIV/hIl/cF9xb4R7jouBe36Qh3lwg2V5gYmGi4J6g3x+ko2PkYNubnmLfnVtbmtse35kaWxqWW53WlJqc2liUWNzeGxiZV5aaoNuc2JcaF9kbGBuVVtwTkhPZ2VcZ29xgG1aXGNzYFxjbHdkZV1dWmxsY21qc3eHf3FwgHt9dHiGeIWCfICIdXmJgZKWfImGdomBcHh5e4STb258gXdeg390gm1penOUc2dziHxykpGDmp+boIaIdnaVf213lZh+iJCEio2afYyadn52cXBsamF1fGdianV6W2B4fHptcX9lY2dnV52PX3FzlrzEhHdxlIqQf3OYjIedlI2IdGuIj5WAe5SMgYSbjHyKhn18iYx/k4h1iYV2dn2BcXWGgZ6VhpSPgoJxf4dzg3qIlpuXhpONnICIZn2TgoCGg4mJcoJ+Z32Le3l/f4eLj31pgH2DdmZveXhzd3Nsao6FioGKf3iCgYSEgGtdcHd6fYuIhXuAjn99cYBoeIGGioWDd4J6f5aLjot8bWt6iXx2dG9paH13ZV1xY1hwdFNUb3NpYk5odHhmYV5dWG+Ab3RZZWNdam1gcE9ZbFJEVGhiWmxvbXtvWVtebWNaY3B2ZGdcXWBsamNsaXN3gYJxbn57f3R1g3qEgnyChnZ+iYGWkXiDinSBiHN5eX6NkG9ve4FxaYF5en5ubXx2lmtqeIR0a5SNhZ6YoJmFiG9+jHZqeZmPf4KKgpWXinqPlm96c3BsamRgdHtpYGZye1thc316Z3B6YWVkjrGyd0tiWqXa0Zdye5KMkXl/loyFmZKNhm9shpKRenmTh4GEmYp8h395eImKhJWAb4qHcXR9e2p5hoOlkYWTjYN/bn6CdYJ3hZmXk4qTj5SFh3B7koR+g4OJg2+BeGiAhXhyf3+Diod8ZXx+hHZjcHOAaHlxb3WZjIaDint2eICEeoJrW298cn+Hg4h9hYh6iHGAbXCChY2DhHGDd3+Yi42Dd21tfYN/dnplaGp+cmFaeFtZcm5OWHJzZmBLbXd1Yl5bW1l1fXJwWGheZmpxX29OV2lSP1lnX1twa2d5cVtbWWtlWWNxeV9oXV5lbGhmbGlxeH+Hb21/fYF1cIF7gIF/g392gYWJl4pxgo1xe4Z8enmElIx1a3p/bG9+dIB9b3J8e5Rwb4B/eWaSioKhmJ2Sg4Vnh4NwZ3qXin6AhYKaioF8jY1peHJra2ZfYW95bV9ib3ldZGyDemFxdl9kZdXrvosyOj6LjoByeYaJj413hZiNf5OPjX9ubYWMjHV9j3+FgpWJfIN4bnaHhYOWd26HhGt1e3VleYOEp4yDj4yDfW1/c3WCeISaj4uPkZKMi4Z+e5KHeICFjYNsgHJpgH54bXx7gYqDeGJ5hIFxZHFofm11cXWBm4uBf4V+c3V9gHKAb1prfHN4iIGKe4Z/fId3eXBrhoKOgolxgHd+lYqKfnRtanaAgHV1XGlpeHFaV35TWnJlTFtzcmZbSnF4cF5bWllcdX91aVliW2dlbmJpTVhmUT1eZl1edmZfdXFbWVVvZFplcXlbaF5gZ21naWtpcHh9jm1qgYR/eW6Ae32Bf4J6dYKBjJOFcICLbnd+gXt7iJOJf2l7fWt0fHKGe3N3fX+MeniEfnxrjIyEm52WjIKAbI1+a2h/j457fn+DlYJ/fYqIa3VxZ2ljW2Nnc29gYWx0YWhwiXphc3ReYmOboJBuXDVar7V1aoCKfpOGd4eYh3WPjIp4cG2Fg4d0eYl4iX2TiHp+cmd2iH59l29xhn1odnluZXqJhaWHgIeNiX1tfXV+f3uKl4aBk5CXiIuEiXyPiXF8foV8aX5ta4F7eWp6doKHgHJgd4J+cWRyZ3WCbXV7hpSRgX2Bf293eXt0fWxXbX11c4qAhneGdYGJendybYh/jn+DcX17fJGHiHpubWltgoJ1bl1oZnRyUlx8TlxxXE9cc29kVktzeWtYWVhZYHGAdWFdXWBnZGhoZk5aaE5BYWRcYHZhXHVtWFhTdGFbZW9zV2pfYmhrZ21saXB3fJNsaISJfXxwfn58gX+CeneAgImLhHJ7h29xd4R/e4mNj4NqfntueHl3ind9eICCh3+Efn56bYSMiJijjYWEe3aLeWtthYmSeX17gpKAgH2Kg3BycGJmXllnX3BwYGFocGZqb4l0YXRvW2BkanZ7f76cp6TJuHKFhHOTfXmIlIR0kY2IcnNwhHuDc3WGdIh3lIl5eXBjd4Z5gJJpcoR1Znd2Y2p8hIiegoB/jo99cX5zg3h+kI6Cd5WNlI+Igoh7iYlseXp/dmh6aWx/eXNpenaAg31oYHiIfWpqc2h7gGp2gYyRlH56fX5xe3Z7c31hVXV7cXOIgoF7gnCGiXd3b2+CgYt9fHd8e3SNhIF1aHFobIiCcnBdaGN0b0xmdkxeb1VUWXNuYlFPdHliU1dXXGFwgnNbYV1oZWVjamRRW3FJRGRiXGRxXlx4aFVXVndeXGZuaVZsXmFqZ2Vubmhwd3qTbmmIjHl9cnt+eYKBgnx2fYOIhoNwdoNzbXeCgn6Ji5R/cYB8eHp6gYt0g3h/gYGChHqAdW99iYubnoh+hnt3h3xodYaNkXp/gHyJhoR2j4BncG5fZFxYZlltc2FhYXFsbGiJbmBzaVheY22Ad6nZqceGiLNyinlwjnZ9iJCBepSLgHV0dX53f3Bwf26FdJSGeHRsYHqBeYiOZXGDb2d1blttfYGQk4CBeZGSfXd6bIV0fo+Kg3KVipCOh4WFe3+GbXV2f25od2VtfHZtand2f398YGJ4hnpodXVjfntndYaOjZV8dH91cYB6fGx+WVZyfG90goZ+f3driIZzeGp0f4KCfHl7d3pxin98cmd0ZG2LhG10W2tgdmZJb29MW2NYV1Z4bWJQU3V2WVFVV11gcoRvXGBjbWRjXW9jVF1yR0JmX15maV1ae2NSVlx1W1tna2FWa2BgbmZmbHFocHZ4j3Rrjox1f3Z4fXeBg4F7dH6DiIiDb3GAdXF1foaCiY2Le3d/eIR8fYWHeId8fYF+hYB7fnN2eIuOn42Je4p3dYN6Xn6Hmo15h4R0hoeEd4l6Ym5sW2JbW2FVanRkYFtob3Bnh3FhcWZXXGNrf3zKzoa5omtubottcoVyfoWLf3uShnp5dHp1dXtqbHZjhHaSgnZvZ198gXmLiGVxgGpqcWNYbHuGnImDgnKXlHZ9e22HcICJioZwlo6QiIWLhHt5f3JycH5naHJjbnhxamxxd319el1leoB3aXV5ZoJ2Z3SHi42UfXKGam9+gHhte1xYcH1sc36Je4Ftbol/cHZmdn6AfoB1enB5c4V7eHFlcmBti4Frc1hrX3ldSXBsTldWX1RVfGtiT1R2c1FSVFZdYnSGaVxga2pmYlluYVhjcEdBaF1hZl9cVnxeT1ZlcVlbamhdWGdhX3JmamhxZ3Fzd4d5bpWKdH97d355g4eAdXN/hoWOg3BwfHh3dXmHhoeMhnp8f3WLfn2GhISHf35+fYd/fHh2eXaRk59+jX2LbnWAemSEiJeGc5KKb4WFgnqDdWRuallfW11dVWhzZWBZZHJyZ4FyYWtkV1pfaX94vq56n7duYnSHaXR8cnqEh3t+jYB4eHN3b3t3ZWpvYId1joFzamJefnh4ioJlcH1oa2taVm93i6SBhX9xmZJxf3d0gWx/gY+GcpOHjIeEiYV9eXVzb2l5YWptYW12amdra3l3endbZ358eGVzfm6EdGZ2ho2GlX9vi2ZreoJ0bHRiW256anN6inqBZXSGfW1wZ3R+d3x+cHpqeXqAeHdvZWxhbIl9bG5Wa2F4VkxrbE9ST2lOWX1nYk9VdmxNUVRVXmZ2hGdeYXFoZ2FXaV1ca2lKRWtaYmVXWFV5Wk5XbmpZXWxlXVplY151ZmxlcWZzcHSBeHCZhXZ/f3h/fIWHfXZ0goeAlYNuc3l7e3NzhYeIiIR5gX12j399hImOg4GDe36Lg3t3fHd2mp2XeoqDh2p2fn1shIaUgHKPgnGGgn6CgHBmbGdXXVtcW1NlcGVfWGNydWl2cGRlYldbW2h/cG9yf3OJZWZ6f2p1dnR0hIV4gYV6d3R1bmt6cWJoa2eGdI2DbWZeX3xveol9aG13ZmpkVldzcI6nfYR8dpaQc3tye3lsenqPg3aXfIeGg4eEfXVxc21odV1taV9sdWRnZml6b3tyWWeBd3VocIB4gnZid4WLfJSBbotqbXuAcGVyZV9reGZxdYl6fWF1g3Zpa3F0em94eHJ7ZX1+fnd1bmNlYWyGfG1rVmpjclRMa2xQTE9wSF57ZWFOVnVlS09TV2Brd35mXWdzaWVfV2NXYnFdTEtrWGRiVVRVc1dNWXZlWl9sYFxbY2Vfd2dtYnBpdG9xfnV0mYF3f4B4gH+GhHp9doKDfpiFbnJ0fHt0cYWFj4KAeot1dJCAfYGUjoCFhHx+jIZ6foF2e6OlinmJhoVsdX17dYSDjXpvhXN6hX2ChHVuamllVl1bW1pTY25lW1hidHtqaG1oYGFXX1ppgGlrb39nbGJpe3prdHV1b4aCe4F9dnZuemhqeWpfZW5pgXeQhGdlWGJ3aX6GeW5pb2ZmXVVZcGmPqHeBenyQjnh1b31ucnR4jn53lHSFgoCGiHZqc3ZoaW9cbWVebnNfZ2JqeGh7bVttg3N0am+Afnl3YXaFhHmQhnOIcW95f3FicGhbbXZjcHKHendhcoBvZ2l4c3Frd3Z0dWKCen12dW9jY2JtfHxra1VpYmdUTG5oUEhSbEVheGVhTVRzXkpNVVllbHh7Zl9tcGpkXVZgVW9vV0pTaFhnXlhNVWxUS1x6X1xfa11dW2JlYHpobGFvb3Zub3d1epd9d4CBeYCAh4Z6eXqDfYGThHF0dH56dnSFiJB9gXyQbHOVgXuCn4V/h32AfoaCgIp7doSsn396iIiEbHKCenaBgYJ0bodvfYB0ioBqb25kZFhfWlpaVWJqZ1xaX3WCaV5tbFxhVltca4FlcXR8aWpdbXh3aHV4c26GfH5+enZzbHpoaXhnXWRzaHp3koFjY1Rkb2eBhHZ2ZmhpYVdWWWhkkKhvf3iAi456cG97ZnhueYp6do5xg31/f4ZuZHdzZGlpXWxiXnBvW2dfbXVlemhddIBvcmtxe351dmJ1hYt7iIiAf3dydX5zYHBsWHByYXBwg3tzY3GAa2Bsem9pZ3l3dHBkg3R5eXRxZGFkbXJ+amtUaV5fVUx1Y1FHV2JHY3ZlYUxUcVlLTFhYZ2x2emVlbXFmY1pYXVh3ZlRKXGNYaVhYSFdlUUlieFtdX21bXl1iY16AaWtgb3R4bW9udoOXeXKBgH1/iYyGfnV2hniGjH10dXWCeXp6goyOfX+EiWp0loF7ip19foV5gHt+fIaJc3GProx7e4eQfmZxiHp0fn12cm+GbHt+bZB6Y3BvYmVdZVZaWVdjZmtgXV1zhmlYcG1bXldaXGx7YnF3dWxiW250dWh1d3Juhnl/gXp3b290ZWh0ZVtndWZ2dpJ6YF1TZWZqgoFzfGFjaVxUWF5iZJClaXl0goWQeGxueGZ3bHuDeXSIcoB4fHiAaWZ3bWBoYV9rYF51a1lmXW9vYnplW3d8a25ucHh5dHRlc4OSf4iDiHp2b3F8cWF3Y1pub2BvcIB7cmVxgGRebXVpY2Z4enJsbYB0cnxycWFeZW1ufWVpVGhZWlVOeWBSS1pZSGJ0Y2BKVW5VSkxaVmlscntjbGxzY2FaWlthd1xUS2NdWWpTVkdZYU5IanZYX2FtW1tfYmNdhWloYm54eWxvanaBkHhtgn6AgZKIhIF2dYl0i4Z0cXZ2gnd9fX6Mj4F/k35weJaDfZmSeYCAeHl+f3OIhHNwmaJ7e3+JlnhkdYl5c3l2a3Rwf2x5fHCRcl5wb2BnYmxUW1pXaWRtZlxccolmUnJtW1lYV2BsdmRqdWppX1tudXJtdHV1a4Z9f4B8d29ubGVpcWNba3JkdHaOc1xXVGRgcX9+cYFcYmNeU1phXGSTn2VycYSDkHNranhsbm95eXpxgHZ/c3p6e2RmdmheY1thaFxed2lXYl5waGF3YVt8dmpqcm94dHN0aHGClYOHf4R1cmpwe2xldldbaWxhcHF/eXNlb35aYG9xYl5pb3xranJ9cW92aW9gW2RrbHthZ1RnVVhSUXdcU1BZUkhjc2JgR1ZsUUlQWlZrbGt8ZW1vcmFbWlhZbHBXU1BmV1dpU1RGWlxPSXN1WGBkbWNYYGFiXYxqZGVtenhrb2l1eYV7a4R9gISZfYKEeX2IbY+GcW92en10goJ9i4+Dgpd0eIKThoGfiXWBf4F0f4Jwh4J1b6KXc3uGjId7ZneLb258cGd4cXtsc3ZzjWtedG5hZ2ZrU15cVmhibGxbXHGMZE5vbVxWV1VmaXRoY3RlZV1acHZvcXZ2emyIfYB9iHeQc2Nla29hXW5tZHN4iGtaVFZiY3d8fHCEXGNfY1RaYFpjl5VjbnCDhIlyamd5bmVydXF6a3l0dW96fnZfZ3NkXF9XYmRZYXVmVl9gbWRhcV1dfnBoaXNxdHF1dmtthZOCiXyFcXFmbntvcG5SWmVpZHByf3VzYmx1VWJxa1tebmR7ZGt0fHFxcWlsX1hkaWp4XmZVZVVWUFVvWFJXVFBIZXJfYUZYa09JWFRWbmlkfGlreGthV1xWW3RkU1JXaFFZZ1RTSFpbUE54d1tfZm1qWmJgX16PbmJna3l2bm5pdnZ+fm2EgH6Gl3t/h4GKfmuTiHJndIB7dYCDfomOf4uTc32KkYWHn4Z7f4aMc4CGc32CdW6kjHOBjYx3eG56jWBlfXFnenR5bG1xd4NnZHxtY2ZnaFNgX1VnYGxvXF5ujmhNaWxgVVZTbmZza2Z4ZGVdWnJ2bnN7eXRuiXuBd5x7emxiZWxtXmBvamVxeX9nWlZYX2x4e3pvg19iXmhWWWBYZJyIYmtxgYZ8d2tqdmxbdXBqeWl1cm5ve4BzWGtvX1leV2NkWGVxY1RfYmlhYmxaYH5rZmxzdW9teHZraIWMf4l6iG1wZW97bHFsYlhfZ2ducn9zcl5pbFNlcGRVYm1heGJvdXp0am5ral9YYGZodV1kV2JWU09ZZ1NPXU9PSGVvXWNHWmpOSl9LWG1lX3hobn5kYFVeVF11W1RTYGdOXmJVU0pcWlFadnZdX2ZtaFhjYVtejnFjaGp4cnNtZ3ZzeYNzgoN7iI5+fIqIjnlukIp0bHOCdH9/iIWHkYSVj3p9jI+IkZuEgHyMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2NjY2NjY6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY6NjI2NjY6Pj4+Ojo6NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPi4xMTExL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCS5KamZmZmZp6bG5tbm5xSSwwMC8vLEmFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI8tGh0dHRwaaIaCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTM/k56cnJycnXdlZ2dnZ2s8GBwcHR0YO4OBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmHiIiIiIaNkJCQkJCQjIeHh4eHh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaNjo6Ojo6Oi4qKioqJiYaCgoKCgoKEioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p8fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkpKRiYeOipCSk5GLko6OjoWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyMjI2NjY2NjY2NjY2NjY6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoWOiYmOiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCQiI6NiZGJjJCPj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkJCJjoyJkIiOj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x8fX19fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouLkIiNjImOh4+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2PjI6Ni42Mjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp5eXt9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHt7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx7fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eHiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fn5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlJOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTk5KSkpKTk5OUk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGRkpOTkY+TkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZGSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSko6QkZGRkpN/hJORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCShHmQkZCSiHOJkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQj5CNcHuQj493doiQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo51bIWQh3J4h4+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjXhtdY6BdHaGjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uIcGJneHNvdYKFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d3JcYmlcYmRrZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoYGN0bF5qbmdkYmNiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpba3NrYW10bmVZWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVtlb2taaXN0a1JRU1BQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1OWGJobW5vcHFuU0xPUFBQT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0VDRklWY2ZncW5taGddUU5OTk9PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVFS01NUl9qbWhubW1qaGZjY2NaTEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8PkVUXV9jaWxuaW1sbGpqa2pnXk9HRUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7OztHVl9ucHFrbWtqaW1nWElFRURHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHN0dHNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozs8PVFlcXJzb2xoWEVAP0NGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk5OTxLbntxVkE4Ojw9QEFAPTs7Pjw9PEBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5ent9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT09PDtKbGU5Ojs9PT4/QEFAPz9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9APFxuQD5ERT8/QTpGXz4+PTs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3x8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo7bXdIODs6PT1BPEtkPTw9PDg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUjw8PUlNRkZ1d003ODg6Oz4+V2pBOzw8Ojo7Pj8/PT05Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N5STtdf4N/enx3Vzw9Pz09PkZodEw6PT4/PT0/QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFIcnlrYoOEg4ODgH1ePkBDQEE9SnJ7WTo9QUVBQkJGSEM9PEBEREFAPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JCQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEZvdH2CgoGDfn2Fdk1BQ0VAPz5Ze4BdP0NFSUpJSU1NS0VDRkdHRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVyQ0RFRENXdYaHh35YR0hKTUxOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhGSEZRbm5wcXJ1dnl7e3t6fH1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIpsQUFWdIeJh4eHiINXSExNTE1OTElHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0ZJS0tMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiINWbISHhoaGh4iIh3xQS0xLSEdGRkRFQ0NAQENDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSkhISEdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpUgYOEhIKChYaGhIKGhYSEhoaGh4eGinVJSUZCPz9APz8/PDw8Pjs6PEFBQD48OTk4PDw9Oz47ODs/QUJAQUNDQkBBQUREQkNGSElISEhLTUxHSUpNTU5NSkpLS0pMTFNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWWFhISEf4GCg4KDg4SFhYaHiIiIiImMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1NTc3ODk3ODc1ODg7Ozs9QDs5OTk9PD47PD1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaIaEhIF+gYODg4KDhIaJioyMi4uJiouMiVQ6ODY1Njc2NjY1Njc3MzU2ODo4NzY1NjU2NzY3Njg6Njc4ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGUFNSU1NST1BQUlRlcXFzdHR2eXt7e3x9fn5+f359fX19fX9/f39/f35/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JlhYOBgIGDg4ODg4WJi4qJiYqKioqLiYqKgUc1NjY0Njg4NzQ1Nzg1Njc2OTk3NzY3NjU6OTo6Ojs3OTg5ODc3Nzk6OTg4Nzg2ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXZ6e3t7fX1+f35/fn19fX1+f3+Afn9/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDg4SEhIWGiYqKiIeIiIiKioyKiYmMej48Ojg7PD0+OTo6Ozg6Ozk6Ozo6OTs6OT09PT47Ozw9Oj07OTs7PDs8PDk6PDg6Ojo6OTk5PD88PEFCRElKTEtJS0xXb3JzdXN1eHt7fHx7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMb08+PkJERUVCQUBCP0BCQUA+PT4+QD8/P0A/Pz09P0I/QUE/QD89QEBAPj9BPT48Ozo7OTk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t9fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUJBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLi4qKi4mMYz5ERkpMSkpGR0hFRkdHRUJBQENFQ0NBQkNCP0BESERDRUNFRUFGRUZERUZEQEI+PEA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6e319fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0NGV4SCg4SFhYaGiImJiIeGhoaHiYmKi4yNjIyLioqHVkhNTU5MT0pKS0lJSkpJRUNERkdGRENFRkRCSElLSEhHRkhHRUpJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtBQkJBOTg8Pjs8Oz5AP0E+QkJHR0pZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2NjYyLiox/UE5QT01PTEpMSklJSEpGREZISElFRUhGRkVMTE1JSkdGSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4Nzw7PD06PkA+P0BDRklKUV+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjY2MjIuLio1yTlNRT05NTE1KSEdFSUlFSkhHSkpJSkdHR0tMTkxNSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJR0NCQUNVbnB1d3d5enh5ent8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6PDg9Pjs9QT4/QURISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiIiYyMi4yMjIuLi4tgVFRST09OS0pIRkJHSkdMSkZLT0xLSkpLTUxPUE5ISUtMT1FRUFFPT0pISkpMSktGR0hHRkZIRkVFQkFCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uKjIyMjIuLjn1ZWFRUVVRPTUtKREVGS09OT1dVUVBPUVNSTVNUT01TTFBTVVZSU1FQTEpNTU1LTkdHSkZGSEpEREVFQkVDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQkdWTkZOUFBUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLjGlZV2thRlRRUVBJOztSU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTVJRUFBRS0tLSEhKSEVGSUlJSElpcnZ5eHl4ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0ZGRT8/QUFFQUNHRURFTFhSTVRVVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh21cZVU6WVlYU1E/QFZVWVxkYFZZYnJdXVddWlZFUVlaW1lfVFlnUlZWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd5eXp7ent8fXt+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+i4mKi3lvcFlbXFtSVFJWVlRbWnWDWVV9kGFdWF1eV0lWXV1bW19ZSFlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeEin5nWVlcWVRWVFdSUVdWY5aAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ1xbXF1dV1JPU1BQUVZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbU1NRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2AfFxRVlhVUlVSUVFMT01LZnlbXVRZVVZdWkxUWlVTVF5aWFdXV3prWFtbXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fH19fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVRST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJVY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW5xVkpMTk9LTUtISkRFSUVDPlRkVX9SUVFOS1FUUU1PWVJNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXV1c3N3enp7e3t9e319fX59fX1+fX5/f39/f39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11MRD9DQ0NDQj9EUEJDQEM9Q0lHVkBITkxHXWlQSEZORkRFRklHSENESEdIS0dEQkFEQE9RTVJkcnR2dXN0dXp8e3t7e3x9fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT09MUVNRVVlTVVFRVFNPVmBrbHJ2e3t4eXRybnN0c3l4fn+DgIODgoCCgIKBgmtNRz9AOzs+QEA/Pz5rUEthRUZISUVCP0dMTkdNUVVJQUU/Pzw9PD09Pz0/QUNDQD88PUI+Sk5HVW50dHVzdHZ4enx7fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXkpKUFFOTExRUlFUVlRXUlFXVlBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZUNAQEI9OkJDQkJEQlxdT3tOT05OS0xNT09RTEtNV01IR0BBPDk3NzU5OT07Ozs4OTg5PzxCSD9cc3R1dnV2d3l8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJSFBSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEZGSEJBR0lFRUZETVJQYVdSV1FQU1NSVVtPT1FWUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxDPmVzc3Z3d3l5e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aWE1MVFRTUFFVT0xSU1RXWFRUWFFMV1laVlhYVlhZXVdYWGhza11WYXNrYmFfXmRhX15ZVFFOTk5MSUhKTElJRkNRUFNbV1RUTlFTWVNcZVVPU1NRTktJSEM/QTk5OTg5Nzg4NTc1Nzg1OTlHbXF0d3h5e3t8fX19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcG5tZF1fX1lXT1BYVlZTVFZPT1RWWFhZU1VUTEtUVlVVVVdQU1VXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTE9SUk9NTU5OTk1KRlFQVVlTVE9KTk9VU1RcVlJVU1JPTUxJSEhGPz49Ojc4NzY1OTk2NzY2NVdwcHN3eXp7fH1+fX58fX18fX19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG9mZWRjXF1SVFpWV1VUV1RSWFhZWVlSVU9KR09QT09NUkpQUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBSTUlMS09SUFJSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9xdHd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSUdFSExIS0lGTE1QTUcvRV9SPjM/PmpvYVJSUUBHVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR1eXt7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRkZISk1MRUdDT1JDOEVOU11nU1BTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydHh7ent9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUWFdVTUxLSTw5ODc7PkA+PD1BQEI9PkVIR0NGRklHSkpARkFBQEZIRUpPSFFSYVxRUFJPU09PUExMT01MTUxNT05bV0tNUU9HSUhDSEpMTEpGRkZFP0JDPjxCRz9CP0FkcHN3enp7e3x7enp3e3d5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSEREPTk3Nzk/Qj47P0JAQD5BREpFQ0dHSUZJRUJCPz49Q0JBR0lFTk9iZVFNT05XS0xNS0xNTU1MS09OU2ROSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES25vdnl5eXt7ent6d3R4dXh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ2clZWbnFnbHmEam1xcm5uamhvSEpDR01NSk1QTVBPSEpEP0E9OTg6Oj9CPzxAQkFBREVHSkZDSElHR0hDQz9CPz9AQT5ERUNMTlJUTEpJTVRHSUlKTEpLTElKTE1PUFJQS0dDTEdDQkpJTE1PTklKSUdDQ0NESUpNTElZcm13eXh6e3t5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFHS0RHSEhHSktJSktER0I9Pj06OTo7QUI/PUJCQ0NHRklLSkRJSUZHR0NDO0FAQj5AQENFRElNUEhIS0dIS0RISUxNSEpMSElKTEtNXVJISERORkFESkpNTVBNS01KS0ZHR0pNTlFOTGJtaXZ2d3p5fHp9cm1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLREZFR0VGRkdFR0JDQD48PTk6OjtAQ0A+QkNFRUlFSUpMRklJR0ZGREI7QUNDPkBDQ0NER0xOSEtOSERIRUlMTk1HSUxHRkdJSUxOS0lHRU5IQ0dNS01MT01NTk1LSEhJT1JRUk5SZmZmcW9zeHV7enxsaGpvZWtxbHNwZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pERkZFQ0NCRUBEQT4/Pjo7Oz06PT5DQT5BQ0VGSkZJSExIR0dHRkVDQD1ERUI+QUNDQ0RHSElHTVBKRkZHS05PS0ZISUZFREVJSkhKSUZIUEtESU1LT01PTk9QTkpKSUxSVVVST1dkYGFtZ3Byb3J5emdlaGhkaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMSEVFSENCQUJEPUJBPkE9Ojo9Pzo9PkBCPkBCREdKRUlGSUhGRkdFQ0JBQUZGQ0JCQkRFRUdHSUZMUUxJT0pKTExJR0hFR0ZEQ0lJSEtKR0tSTUJOT01RTk9PTU5PS0tLT1VXVlVTWF9eXGlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWpzdW51dHNxcmprc01HSEZIQkJBREQ8QUBAQzw4OT0+OT88P0JAQEBERkhFSUZGSEdGRkRDRUNESUVDR0VCRUdFRkdHRUpNS0hRTUpLSEhJRUZISEVDSUlJS01LT1NORFFSUFFRTlBNTlBNTE1TV1ZYV1VYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW55TUhHSEhCQkJGRDw/QkJEPDc6Pj46PjpAQj4/P0JFRkRHREVIRkRFRERFRkdKRUVKR0NHSEZIR0VDRkpKR01LTEtISkxGSUlLSEVLS0xMTk9SVFBIU1VTUFNPUU1OUU5NUFdaVlpZVlpdWlhhYGBgXmhlY2BkZmhnamhoaWZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSUhHSUNBQ0hFPEBFQkU9OTo+Pj08PEFCPD8+QUJGQ0VDQ0hFQ0VFRkdHR0lGR0tIREhIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5MT09PUlVWT0tVV1NRU1FSTE9RUE9UWVpZXFpZW15eXmBjXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdE1JS0hKRkJFR0U8QEdDREA6PD5APz4/QkE8QD5BQUZDRUVESUVGRUdGSEhGSEhJS0pGSkhIS0hGRkxJSEhKR0xMTUxMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUVFMT1JSUFZbW11eW1xeX19hYGFkXWNgZWZgZWhqY3NzZmpnZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SkpMSkxHQ0VERTxARkREQzs/P0FAQEBDQT9CP0FDSENGRUZJRklGRkVJSUdJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOTk5QTE9QUlRYVk1OVFZUUlJRUExOVFNSV1teXl9dXWBfYGFhYGFjZWJkaGJkaWpndotsamlnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2bndLTUxLTUdEQ0FEPD9FRUVDPUFBQ0JCQ0RBQ0RBQUVHQ0hHSEhHSkdESElHSEpGSUxISUpNS01MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNQV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luaGNpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAQ0FFRERGQkNFR0NDSUVDSUpKSUlLR0VLSkdISklJS0hKSk5MTktJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BhdnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQkVFREZCRkZHREVKRUVKTU1LTExHR01JR0pLSEtLSUtLTkxOTExMSUxNTFtzYmRwXmxtVU1OZnNdZ2ZxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1KcXl2a2Jga2VlbXhsa3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydnRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElIR0VEP0FCQD5DRkdCRkNGRUZFRENISEdERUtIR0xNTkxNTUZKTkhKS0pJTEpKSktMTU5OTU1KTk1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW51XFlsUVxtbVpxbWtvbXh4dHNpcF1fcmtxalV1eXhwY15rZmJncHBqam9wcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0dFRUVCQkI+QEBGR0JHRElFRUVCRklISEVHS0pHTU1OS01OR0xOSUxLSUpNSUtJSktPUE9OTUxOTkxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRqdXlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SExGSURFRUNBQj1CQUNHREhHTEhFQ0NIS0hIRkpMTEZOTExTUkxHTE1ITkpISE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnRzdnNIS0hJQkVFRUFAPkREQkdESElNSUZDRkpMSUdGSk1MRU9KS1dSS0dLS0pOSUlKTElLSklISk1NTU1JS0tLU2tjW2leX2ljcnJaX1lqb19lZVVrX2NbYWFRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4dHVucXVud3FydnR3ckdHRklERURGQUBCRkVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRUhIS01JSEtKS0tJSElHS0tLTEdIS0tMTU1MSktNTlRbXFRQVExQT05PT1ZRT09RTk9RSklOUFFkcWlUWVdcW1xVWVtdWF1cXGNmYWFlYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0ZGQUVDQERIREZHQ0lLTEhGREdLTEhER0lQS0xPS0xXTElFRUhJSkhJS0lNSkhGR0dJR0hJRUZMSUpMT0xJUFxXXlBcW2BeTVhZU1xcYl5NWFpNWGFSSllhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHh5eXh5eHd4dHF4cnhzcXJ1cnRPQkNFTE1CRENCRUlFR0dGS0pLSEVGSUpLRkVISFBKTU1KTVJJSEVBSEZKSUtMSk1KSEZESUZERkdFRUpIQ0pNS0xVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOXlxeU1peY15aXWBjYFlfY1tgXltUWFdZXl1jYmJhY2VoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSURCQkNHSEZIR0hLSUlJREdLS0tFRklKTktOTEhMTkdIRT5HR0xJS0xLS0tJR0RJRENERUJGSkRASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVpQWl9hYV1eY2FgYmJiY2NlWlFZVlVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUJFR0lGR0hIRkZKR0hHSUtJTERES0pNTUxMSEpKSEpGP0dHTktLS01LS0tJRkdDREBEQUhJQj9JSkhQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYlxkY2JkY2ZYUVVUUltXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYWGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSkZGRkhHRklGRkZJTEpORkRLS0xOSkxJS0pISUZCSElRTUxLT0xKS0lHR0VEP0VDSEhBQkdHRVRdWV5YX1lfW11VWFhPXV1RS0pWXlheW11VWWBSUV9fYmJgYGJiYGNiYWRkYVhPUVFRWlJbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhISFhYWFhISFg4SFh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBSEZER01SSENRSkZISEhFRktKTVBFRklKS05MTElMTEhJR0RIS1FOTUxQTExKS0hJQ0RBRURIR0JBR0VEV1VFXFRdU1ZfWE9UVU5aWk1JSlRgYVtfWF5eYV1PWWFcYGBfYmNiXWFiV19fVFBPT09XUVxbW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGSERJUmJQQ1ZeSUdHSERGTUtQUEVJSUpLTkxMTE1LSkpHRUpOUVFOT09NTkxNSEtBREFDREZEQ0JFRkJNSEJLS09PTkxGTUZHSUpIR0xLTU9QSUxPUE9TT0xQU1JVWllXWVhYZFdPU1RQUE5NT1RSWlhYWl1cYGFkZWNnY2tscHNyenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFSEZHREtNXUxHR1hNSEhKSEdNTFFRSExLS0tOTVVOT0tLS0dHS1BTU05QT05PTk5HS0ZgRURfTEVmZEVNW0leW3JtT01VbVlMRFBgVWtXZ0pdWFVeRExRVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalJWVVRbXFtgYGFiYmJgZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgYOEhIWFgYSFgYODf356e0xJRkdGSEVFS09TSUpGYFRISU9KSU9NUlFLTUxMT1JVUk9PSUtNR0hNUVtZT1BQTk9PT0lKUX9RSXxZWXF0WVFtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbYFZWWH9qdHV1X192X1hhW1tmW19gYWFhXWBiZ21wbGBwd3R4gYGCg4OCf31/gHZ4emx2fnR4fYB8foCBgoR8gIN6f4F/fnd3TkpFSE1OQkRMTEdJTEVRVkxLTklLUlhXUU1PT01RVE5PUVBLS05HTVBTW1pTUVJPUFBQSkhaeF1UeGVoWlNVUnZndGxwYm5malFyT013bWpycHNycXJwb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29zcnt8b354boByX2BgYmFaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnN8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEpLR0pQT01NSk5WXllVTFFTTllaTVNTUk5LT0hRUlNZV1ZQVFBQUFFLSGd4bGN4cm1bS05WeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/b2hvWXZ2anV1cIFgcmZ9aWx4fG9eX19iYVtdY2RnaWlkZ2JjZGxscHBzdHNzc3lxcnhibHVncXl7c3J2eX6Bc3V6bnx9eXdybk5KU3VOQ0JGUFBISktJS1BPT09NUFpgWldLVFdQYV5SVlFZUkxPSVNUVVhXV1BVUE9OUkpMcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JocXVubXlwd2x2dHRybG5ddH56a215fGt0bHxrcHZ1eF5fX2JeXV9kZGlnaGVlXmFiaWlpamtub2txbm1qcGFjZmNvd3hvbXBzeX5ucXBqe3p0c29tTExbVkhHRUdSUElMTUpLUFFQUFBQV1xYVU1VWVVlWFJSWV5TTE5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9bcHp7XmB6c2Nyb3hxaGR9aXJ8XlRMbGB2dWtpdXt7bX54a3xwXF5fYlteYmRkZ2VlZWJaY2Npa2tyc3J3Z2xpaGRnYGFrYWdzcmxnbW1yfGttaGt7dG1ta21PR0tLSUpISFFQTE5PTEtSUlJPU1JXUlZUUFdbVlZUVFRhX1BOTUtUU1RRVVZOTkxNT1BKSFFOUFVMS0xTVFNTVFBWVVFRTlFRWFlSTlBVVFhYWFtaVVJTV1tXWFdaT1NVV1hYUl5ZV15WVFBZUldXV1dYXltncl5bW1lcXV9jWl9jY2RmZGNjYlpjY2ZmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0xNTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlXT09LTVZUUU5VU05PTUxRUEtKUlFLUU1LS1BSVVNRUlNTSUhMTk9RUlFRUVRWUlhXXFdTU1BSVFVWU1pRTlNSWFZUWVZUWlZUUlVUVFVXWFZdWV5gXVxaWlxcX2NbXWJjZGZkZGRhWWBhY2FiaGhpbWJhZF5fY11aZFxibWFeZmVmbXNkaWhra2VkY2ZoUEpLS09PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFNQUEpOV1NQTlVQTlFOTFNQTE9VU05RTk1OUVVRVVFSVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXV1dZW1RQVFVYVVVaVVdaVlNSV1ZVV1tYWl9cVVheXF5dW11gYV5bYmJjZ2ZlZGJYX2FiXWBnZGZlYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FQTE1MUFFMT1RPT1NRT1FbWlhXWFtZWFlWXGpkVlhZWldWU1NPSk5WVFBPVFBQUE5MUVFQUlhUUVFPTU9TVk9XUlRVVU9OTVFTVlVUVFJUV1ZaXVxaVlZRUVZYVltbV1FUV1ZWVllUWFhWU1JZV1ZaXlldX15VXlxeYFxbX19fX1piYmRoZ2RkYlhhYGJeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFPVVxaWldbW1xYWltkcW1oZF9bWVZVV1FMTVZTTU5ST1FST0xQU1JVWlVTUFBNUVhXUldTU1NYTU9PUVRYVlVVU1VZWFteXVtbVlJPVVZWW1tXUlRXVldYVlRYW1RTUlpYV1xeWl5fYFVhXGFhXWBiX11gXWNgY2doZGZgWWNgYV9fZWRfYGNbWlxbXFlaWVhXXFlcW2BeX1teXmFgXmJcWWBaUU5PTlZRUFRST1VUU1BXXFxcWF5cXlZcXmpxd3mAY1xbVVVYUU1PVlNOUVFQUlRSS1FUVFlaV1VPUk9TWFdUU1VSUlpPUFNSVltWVldTVlpYXV5bW15WU05UVVZcXFZSVFZWWFlTVFlcVVNTXVhaXV5cYGBgVmFbY2JdYWNfXGJhYl9jZmlkZl5bZGBhYGFjZF9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVFJRV1JUUFteXl1bYFxgVVxdaGpyfXNsZ1xUV1dRTlJaU1JRVFJUVVRLUlZWW1paU09TUVZWVlRPV1JTWlJUVFRYXVdYWFNYXFheXVlaXVRVTlZXV15bWFJVVVlZWVVXWVxVVFdeWV1dYF1iYl5ZX1tlYV9kZF5eY2NhXmVmaWRmXV1kYWBgYWJkYGJeWFpfW1xbWFhYV1dbWlxgXFtbXFtYWlteVl5ZXVBPT1JaUFtUVVZWVFRUXl5gXl5iXGBVXV5ia3l0bH1rWlVZVVFRU1xUVVRVVFZZV0xSW1ddW11ST1VTWFdXVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUldSWVlZX1taVFVWWllaV1haXFZVWl5cXmBhX2RjXF5dXWVhYWZkXl5kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXFVWWVdXVVhfX2FhYGNdX1RdX2JlZXWBemhYWVlTVVNWXFhXV1ZWV11YT1VdWl5dXFRSV1NXVlVTVFhSU1ZUWFdYXV5YXVtWXV9YX19YXFZRWVRZWlphWVxWV1hbWltZWVpbWFZdX2BfY2JhZGRdYlxgZmFkZmReX2RiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlRZVlNcVFZXWVZWXGBhYmNhY15fVltgZGFfenVvaFlcWlVXVFdbWllcWVhZYFdQVl5cYGBcVFRYUFVXVlRWV1JTVVdaWltfXlpfXFZfX1ldXlleVVNZV1lZXWJaXlZXW1xbXFtbWltZWV9fYGBkY2NkZWJkWWFmY2ZmZV5hYmBjXmJjaWRjZ19nXmFiY2FhYF5fWFRbWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNPVlpWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheW11bVldYWVxcXF9bWVtiVlRYXl1hY1xSVllQV1ZXV1dWU1VUWFxcXmBgXWBcV2FeW15cW15YVlhYW1tfYFxfWFlcXF1eXlxbXVhbYGFeYGVjZGVlZmJYY2VkaGdkXmNgYGVjXWVpZGVpX2ZdY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWlhbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNZWlhdYGNkX1JYWVBXV1hZWVdWV1ZdXV5gYWBfYl5ZYV1dXlldXllYVVdbXGBeXV9aWl5dXl5hXVxbWlxgYl9iZWNlZmVmYlpkZmZpZ2NfY15hZmRaaWljZmljZV5iYmNhYGBfXV1aWFxZWVhYWlhXWltaWVdYVVVbXV1dYGBiYnhLWFdbWVddW1xdWldcXV9gYmRhYmFdYFhiY2JhY2FiXVtcW1hXW11fXWBfXVtgZF1cWFpiZWNhUlxaT1hYWltbWldaWWBdYGJiYGFjX1xiXV9dW15eWVlUWF1eX2BfYFxbXl5gYmNdXFhcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiXGNnYFxpaWJoaWVkYGJhY2FfYF9dXVxZXFlYV1hZWFdcWlpXV1hPWFpdYWNmZnJrf0pZV1xaWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBiY2JcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1cWltbY2BiYmNgYmRhYGNeYFxeXl5aWFZbX15dYWFgXltgYWJlY19dVF1gYGNkZGZlZ2VmZmVeZWZoaGdkZGBbZWdeYWhoYmhoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxbW1ZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WDgoKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKCgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t8fHx8fHx8ent7e3t6enp7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKgkU+Pz8/Pzubw76/vr7BooqMjIyMjYl+f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjI2DOjIzMzMzLqHSzMzMzM+qjZCQkJCSi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eXh4eHh3d3d3d3d3eHl5eXp5eXdvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx2dXV1dXV1foOCgoKCgoB8fH19fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dXV5dnZ2ent4e3h3dnd6d3l5en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3x8fHx8fHx6eXl5eXl6enx7e3x8e3x8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eH15e3t5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgYKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3e3l5e3h8enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4OEgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3d7eXp7d3x5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6d3t5enx5fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4enl5enl5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mFg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgYGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhYWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEgoOFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgYGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzc3NycnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHNzcnFxcXBvbm5tbW1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoKBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3Nzc3NycXFwcG9ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dwcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJyc3NycnFwcnVwcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcnd0cXJycW6Jhm5wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHJwhZNycXFve55+bnBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXF3o5BwcXGVn31vcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcnOcqIFve6KefnBxcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXFwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycZSrm3CDo59+cHFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h3eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzc3Nzc3Nyk7Gqi5WmnXtzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn58dnZ3d3Z1eHp4eHh4eHh4eHypr6Oxra+ffHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx8fHx7j6uZobSkn6mIent6eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX19fX2ZoZWjr5+co5p+f399fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYCBgZmbiZiwoZ2dnYOAgYB/f39/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f4CAgYF/l6SdlKObmZGdiHt9fn6Afn5+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+f3+Afoaor6aemZ2fpqmmj4WBf3+Af4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4KFho2aq6+gm6Odn56ipKqrpZ+Uh4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI+Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEg4aMn6upoJmZop2enp+dnqGgmpCGg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgoKGj5KUlZecnJ6fnpmYk42IhoeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4SEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5GPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGAg4iQlZSQl52akYqGh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SDgoOMm4eQlIqEgoOFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6RkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4GCgoKCgYGIh42DgoOCgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAf3+JkYCBgoODgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZaIhIKEgoJ/gIyVgoKBgoSCgYGBgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmYuDhYSEhIKAkZmGgoKChISDgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgZCMg4F/fn18fYycjoCCgYGCgoWUlIyBgoGCg4OCgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiIOEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlpeJgH19fX17gZiMgIOBgYGAj5SMkIGCgYKCgoGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGVn4p+foB9h4t+hISDhIKDg4KOiYWMgoKDgoKCgoODg4KDg4OCgoKDg4OCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf359fYCChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMi4iFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDiZGDhIuFgoGBfn2Bh4aDgH5+f39/f3+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhYWGhoaFhoWFhoWFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhYWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+gICEhYSFhoaGhYWFhoaHh4aGhYaFhYaHh4eIhoeHhoaGh4aHhoaHh4eGhoWEg4SFhYaFhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4mIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoODhISDgYCAgISEf35+f4B/f39/f4CAf3+Af3+FhYaIiIiHh4eHiIeIh4iIiIaGh4iJiYmJiIeGh4eHiYiGh4eHh4aHhYSDhIWGhoWFhYaGhoeHhYaHhoeGh4eHh4eHh4eHhYeTk5GPkZCLh4aFhYSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIOBgICBjImBgIGCgoGBgYGAf4B/f357eoCGh4iKiomJiYiJiYmJiouKiIiIiYmLi4qKiIeHiIiJh4eIiIeIhoeGhIODhYeHh4aFhYSEhIWFhIWFhoSEhIWFhYaFhoWDiZSTkI+QjoqGhYaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgIWEgoKCgoKCgoB/fn19fX1+fnx7fIOHiYuLioqJiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiGhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoGCg4KBhIOEg4GOk5KQj4+LiYWFhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX1+fn5+fn59fn19fYOHiYqKh4eFhoeHh4eIh4eJh4eGiIeHiYmDg4SDhYSEhYWHiIiGhYODgoOFh4aHhoaEgoKDhIKDhISCgYKBgYGDg4SDhJGSkI6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoKChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoKBfXx9f4B/fn5+fXx9fXx5fIOIiIaEg4KCg4SGhYWDg4WEhISEhISFhIKCgoKEhIGCg4OFhoWEgoGBgoKDg4WEhISFhISGhIOEhYOCg4GCg4OEhYSHkpGPjZCMiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhISFhYaHh4eGgIGBhYODhIWEh4iFgoCAgIF/f4GDg4ODg4KCgH19f4CAgX99fn59fH19e3p6gZCEhIKBgYCBgIKCgX9+gYGBgoGDgYKBgoKCgYOEgH+AgIGCgoCAgICAgYGBg4GBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgIGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5+fn1/goODgoOCg4J+fX5/gICBgH59fX19fn18enl8g4KCgX9/f39+f4CAfn2Af36AgIF/gICBf3+AgYF+fX1/gIGAf36AgICAgICAgH+AgoCAgoGBg4GBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foCDg4KCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gICAf39/fn59f39+f4B/fn9/gH+AgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af39/fn+AgX+Afn9/f4B/fn+Af4WSko+Oj4yLh4mFhIOCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/fn1+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7gIB/gIB/f35/f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f3+Af39+f3+AgH59gH9/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH59fX5+fn9+fX19fX18fHx7enl5eXh9gYCAgYGBgICAf3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAgH9/f4GAfn9/gH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEhIODg4SCgoKCgoF/fn19fX5+gH19fX19fX19fXt6enl5eXqBgoKChYOBgoOBgIKAgoGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqUkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoaEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fH19fHt5eXl4eH2Dg4SFgoGEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoGCgoCAgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgYB/gIGAf359fX1+fn9+gIOEh4eEhoaGhYaGh4eGh4eIh4eHhn99gICAgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX+BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDg4ODgoODgoKCgoODgoKRkIuIiYeJh4aGhIaGhYSEg4GCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gICAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaHh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXl5fIGBfoiWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYSDhISDg4SDhISEiJKPjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CAgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eXp6e3x/gYOBgoGDgoB+fX5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fX+DhIWFg4WFhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gHp5ent8eXl9fX+Af4B/fHt7fn59gpWRf4SIfXx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIKCg4WDg4WFhYWDg4OEgoGCg4KDg4KBgYCAf4F+fn19fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9fH5+fn9+fn19fXx/gYB9ho+BfX2Cfn9+gIJ8fIB/goCCgH58e4qCfYB/foGAgIGCgYKAgICBgH+LlJCMjI6OjYiIh4WFhYSDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fXx5ent7eHh5e3p6fIKAgX9/gX1/fn9+fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSSjYyNjo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoCBgICAf36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fHx8fHt8fHx6enl7fHp9hYODgIGBfoB+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fXx+f4CBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6NjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+ChIaGhX9/hYF+f4CAf4B+fn9+f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhYOAgIB9fn1+f36MhIGHfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn18fn9/fX6Afn9+hJKNjYyPjYyKhoSFhISEg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen5+fH5+gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fX17fHx8ent6fX+AgIODgn9+f3x8fH18fIGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CLkI2NjI2LioiEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn1+fX19e3t9fXx6fHx+gIKBgICAfX19fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISDgYKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/gH9/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+f358fH18fH18fX57fHt8fHx8fXx9fH18fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJiomKiYWIko+MiYqHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx8fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgX9+fHp8fX1+fX1+foyGfX1+e3uDg31+fn19fH19fX19fXx9e318fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uLiYyRkI6KiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fn1+fXx8fH59fH18fX19fn19fn58e3t7fHx9fHt6e3t5enp4eXt+f4ODhIeJioiJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2Bgn+BgYF/f4B/gIF/gICBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+gpGEhIOBf359fI2HfX1+fX18fn58fX18fX1+fn1+f3x9fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiPjouLh4WEhISCgYKCgoKBgYGBgoKCgYKCgYKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Afnx9fHx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiY6LjIiFhYWEhIKCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOBgICBg4F/gIGEgX5+gH9+foB+fX5+gIF/gX9/gH9/f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHx7fHt7e3x7fHx9fXyKi4mIhoaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKDg4SDhYaDgoF/f4CDgYCAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgYB9f39/gICAgICAf358fX19fX5+foJ9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8foqHh4WGiIWEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIKAfn9+gX9+fn+AfX6AfX19foB/f4GAgYGAgICBgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAiIOEhIWEhISFg4GCgYGCgYCAgoKDgYKDhIOEg4OCgYGCgYGDgH+AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4GDg4ODhYSFg4ODhIODhISDgYB/gH+AgX59fX5/fn5+foB9fX98fX1+gH+AgICCgICBgIOCgH+AfoCBfoCBgIB/fn5+fn59f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoKAfoCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OEhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf3+Af4CAf4CAg4KBgH9+gIB/gIGAgYB/f39/f3+Af4CBgoKCgX+Ag4J/f4OCf3+Af4F/gH98enx6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBf3+Af4B8fX1+gH1+f39/fn1/fH5+foF/gYB/fn+Af4GDgoOAf3+BgYCCgYGBgICBgICAf4CBgICCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fHx/fn+AfH9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhIKEhIWEhIOBg4KBg4F/gIF+f4B+gH19fX6Afn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIGDhIKBgIGAf4GAgIGBgIGBgYODgYF/gIOAfoKDhICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgIGBgICCgoGAgH6Agn9/gYKDgYGDgoODhYN/fX19fHt8fHl6e3p+eXt5eH9+e3x7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAgH9/f398f39/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+AgIF/f4GCgYB/fn+Bfn+AgoKAgYOChISGhIB+fnx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fXx+gICAf39/f3yAf3+BgIGAgH98gH9+f36Af31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgICAgICAfIB+gIB/gYCAf32Bf35/f39+fX1+gIGCgX5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDg4ODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgICAgIB8f3+Afn+BgH9/foF/fn9/fn19fH+AgICAfn9+fn99fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3fHl3eHd3eHt7e3t8hYl9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYKBgYKAgYCAgYB+f35/f318fn2AgYKBgICBgX1+gH9+f4F/gH9/gYB/f399fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgYGBgoGCgYGBgH+Af39/fX1/foCAgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKAgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh6gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgYGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e49/d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoGAgoGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3p4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgn+Af4CAf4B/gICAf359gH9+f3+Af4B/gIB/gIGBgICAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXx8fHh4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYKCg4CAgoGEg4OEgYGDgYKDgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgYB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgYGAf4CAf4CHfn58e318e31/eHd2eXl6e318fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCgoSEgICDgYaDg4OBgoSAhIOCgoCAgoKEgYGCgYSCf4CAf4GDgoGBgYGAgH+BgYGBgIOAf4CDgn9+f4KBgIB/foGAgX+AgIGAgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/f4R9fX18f317fX96eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydG93cXd5c3d7hYKCgoKDhIKDhIOAgIODhoODg4KChIGEg4GDgICCgYSBgoKBgoF+gICAgoGCgYGCgoCBgICAgoKBhIB+gYOCf3+Ag4KAgX+AgoOCgIGCgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cXl0dnh0d3uEgoOCg4OEgoSDg4GCg4SGhIKDgoOEgYSDgYOAgYOCgoKCgoGCgH+BgICCgYKBgYKCgYCBgYGCgoKDgH6Bg4F/gIGEhIGDf4KCgYOBgoKBg4ODhICChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoGDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SChIWCgoGCg4OBgoGCf4GAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgoCAgoSDg4KBgoKBg4KCg4OEg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7fYF+fHl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICCgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhIGEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKAgoKDhIKCgYCAgYOCgIGDhYSDgoOAgoKDgoODg4SDhIOAgoOChIOCgn+DgYKEhIKEg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16enx9f31/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX5+f359fHx4dn92d3+Eh4OCg4aDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOBgoGBg4J/goSEg4OChH+ChIODg4KEhIODgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fn1+fX1+fn9/gHx9gIGCgoODhYOEg4aEgYKIh4WEg4KEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4KBhIOBg4OEhIOEhIWEhISFhYWFhIODg39+gYSAfX18fHx8f4F+f35/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4OFg4SDhX9+goqLhYWEg4KEhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4SDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhIWFgoeGhoSFhISFhIWEhIOEg4GCgoODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeoR/f39+hISCg4KCgYOEg4SEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fn99foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SFhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYR+g4N9gX1+f31+goOCfH+BfX+AfX18fHx8fXx8fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdtenNugId5bX1yc3Zzdm1ud2xweWx1fn9/fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYGAgYCAgIGAgICCg4KChIWHhoaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29sd314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fnyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4mFhIaHh4WDhYSFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39/en59fH99f39+fYCBg4OAgoOBgYSCgX+BgoB9f3+Bfn9+fn+BgH5+gYKAgIKEh4aDg4aEhYWGh4aFhYWFh4aIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYaFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX17fXt8fXx/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SDhYSFhIWEhoOFhoWFhISFh4aEhIWGhYV9eIWDhISDgoF+f357fHt+e3x8fX9/fXx/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWHhYWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISGhIaGhIWFg4aGhYaFhIaHhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9fn58fH59gH59f4B+foB/fX18gH1+f35+fn98fH1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYaGhYKDhYaGhISDhISDhIaEhoWFhYWDhoaFhoWEhoeFhISFhYOEh4aDgoOEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2Bf3x8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFhoeFh4aHhoeFiIiHh4WGhoeFhoaEgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4SHg4SBgoSFg4GAgIB7e359fHx8fn18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4SGhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4SCgoJ/gHt9f318fHx+fXx9fXx9e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9/fnx8fX99fH19fH57e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhISFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIh4iGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFg4aGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYKCgYOFgoN+gYKBf4SCf35+f35/fHx9f317fX18fnp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8fImHhIaEhoSGhoWEhYaFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhISHiIeHh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYWEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAhIODgn2BgX9+g4F+f3+AfX98fX1+fXt+fXx9eXp6eXt8fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SFhoaFhYaCg4OFgICBgICDgIOAfIGAfn6CgH2Af4J9gHx9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYWFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoSFhYKCg4R/foCAgIGAg4B7gX99foJ+foB+gH9/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18f359fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhIWGhoeHh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSEhYSFg4WEgICCg39+f39/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7fH19fX2AfX18fH2Af318hoOGhoWGhoOEg4aChYGBgH9/gIB+f4GCfH5/f36AgIKCgoSEg4KBgoSBgIOCgYCEhYSCgX+AgoODhIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SDg4SChISAf4KCf31+f35+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp8fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1+f4J8fX9+fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFg4ODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7eXp6eXp6ent8eXt9e3t+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH5+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMzMzLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU1NPU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT47QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU1NTU09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fY2djY2NjY2NjY2dnZ2djX19fX19fX19bW1tbW19rb2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtAPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzYRtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi3qaenp6enp6enp6enp6axvr29vb29vb28vLy8vbSLioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZNPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OjoIaEhISEhISEhISEhISClayqqqqqqqqqqampqaybVFNTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj87PEJAODw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX183OUisxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpaKJh4eHh4eHh4eHh4eHhZetq6urq6urq6uqqqqtnVlYWFdXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDw+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNz1w5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamnkI6Ojo6OjY2NjY2NjYucsa+vr6+vr6+vr6+vsaFjYmJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3FwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Ozs7OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tDQ0NDQz8/Pz8/Pz8/O0NPS0tLS0tLS0tLS09PRzM3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7OztHUz8/Q1NLPz8/T0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1tbW1tbW1tfW1tjY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztO7nc/RyJSn0tHHkqvRzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK1lZu00ZqsnLDRmayastLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/Rn6Cqr82TiJyexJKGnZzNz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw5Nj9CP0I6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0cWHmrHXvcmYmMW8yZeZxdDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Wp5mx1dKUlp/O0ZKZoc/Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P1aWZsdmwn8Ob2q2jv57V0dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NalmbLWzYqSnsfLiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NDVpZqz1s3bpZmz0NujmbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0Y/SEhHRUA8PD4+PD09PDc1Njk5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPQ1qaatM2Op5qgrZCnmJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQzs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HH0telm7S8o6WooK+noqmd0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09HUtYLE1Z2SjbrVmpKOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw8P0dFR0tIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dHD1NPTucfV09O5yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT03NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS1NLS0tXU09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6Njk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxBQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0RFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Firzd29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tvc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv72+v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi3t7e4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3uLe2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKinqKinqKipqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7a3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelpKSioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6SlpqakpKOioqOioZ+fn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqSkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKunpqCdnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqenp6efm5qboqCalpeVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn5ybnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWjoqWmpqWmp6amoJuZm6Ggl5KTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKenJ+hoJiSkY+Ul5udmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaSmp6alpaanpqWjoKChoZ+ZkpWkmpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaGhn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKjoqOlpKWlpaSko6KhoZ2cmpapqp2bmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+foKChoqako6SkpKKhoZ6bmpmqfX6cmZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKCxtaSgoqGgnpybmpqil1CDnJucmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaChp5Kxop+fnpyZmZqbqmJMh52dnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuam5qam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goaCgn6qBfa6ioJ6bmZqap4xOU4qfnp6cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmpiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnp6il1mJrZ6cmZucnatqVVWKnp2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZybnaJtY56gmZmcnaGaaWBYjKCcnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmZuic2l/opibnJyji2pfWIagnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJyZmJmZqXVwaouXnJ2dm3xoX1yHoZ2enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ucmZiZmKN7bGtvh5ycnpRwZVtfiqGen56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZmfiYuSdH6coKOReGVVYJChn6Cfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmaoKacjWyIsaekeIqGY2GXnJuenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qalqWgiHhba6eWllt0gXx2lJKNkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkJKoj2tUUHKciotOXXR4gIiHgo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg3+TqHo7Lzx4j3p5RzpTb3WBgIKSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5/nplPT1Q/e4RuZk47NVBwen6Fjo2Lho2UkYuQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhYCBgKR1U4F4UHyViXlSaHxSXHWEio6LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYB+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYt/iI2Mi4uHkY2fYY3WwF+mr6SmcHGKf1ZohouJkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmQnqGdk5eboZqdm6KjkWW/0K2V27emwLFUXndpVYSQi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6mqsoFzs6+d0cWimKytcWrFh1B7n6KknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipqmnqKyNfpOEisjOsLOqknRGrrFbcJ2pp6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxkY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkqKaanaSlo6KloYyDb5ixo56ch4F0Y3qMdW2UpKKgoZ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmVkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioKOnoaaupqacqJ2Ba1GMkoB+gnZ0b3BzdH6AkKOhoZ+enaCjmpaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjXnNfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGoqq2xsq6sq6mDcF9Ib3VucXZraWVoZmdxdn6KlqGkpZ+gopmVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFVcaGRvY21paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKehnpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqevt7Wztrq9u6+UamNXSFxrZmpxZ2NjZVpaYWJrdXp+iJSdo6acnaCalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7K3vsXN0MfAtaaTd15dU0dcdGtqcWVgY2laWF5ZXmVucHF0eIWYpq6npZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odmtxaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW80Nzg2cq7r6CReWNcXlNBX2xqcXdnYl5nXlVcXFtbXmVkYmNuibLJwrmhp6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FpYGZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PEwM7X2M66o498b11WWFhMPV5iaHRybWJhZltXV1hYVlhYXXGSsMXLuri3qa+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3bm1bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrrEwMfP0semhV1PS09TTD1WV2hiYHFoYV9YWldYVlReh7HEvbO0tqq1sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Ef2pmaGFrbGdudXJydXFnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/w8PGxsG2ncezjFxTVlBDVlNcYWZwZVhbWl5YWWeQr7+6tqapqamqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3VrbG5kb21pcXhveWppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbDxMS5tL+5u8queV1QTld8dJCXllVUWFdZYYGwt6mrsrSsrqWlo6ekoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5eXt3bmtpaHZaZnJ4c3lmZl5kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDxMLFvre9w8OyfVZMcHeXpZ1OUVNbdKC1t7KtrLi1s6ypo6GtqaynrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVmaWpoXmpvbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMe/xMfDx8iwgGBYkaaSSExtl7PCvL65vLq8urysraapu7q5t7+ytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aWpqdG55bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnNxcXFwsXFzdDHk4uoi0VtucXJzcbFwcTHwby+tLGwsMK+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGtqd2xpZnVvdGNdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwcHAwcXGyc6xjF5pxNDHy8/Ftr+/wMC6u721s7PAv7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVmY2tkYmttbm9eWV1WVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvbzBwb/AyZM/lNLMxcjRwa+9vbi5u7u+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFlYmFjY2RqY2djW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8yc7Bu7/AvLvEvbrAxL+9vLi7wMWrSJXMxMDAyb+wwb+6t7u+ubW4tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhYmNoamdnamVqXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdSNur+7w7W6x7e2ubu8uLm1usPJqUyPyb+/u8G+uca9wr+8xbi2t7S4tra7u7i2tLe6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVmcGplbGhYWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vM/EeKrLvce3ubittrS3ubO1srrFyZxNhMq/v769vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucWdxa3RmYm5gXFRIS0tESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTXrnWCvMjPwsC4rrW1u723ubG+w8eRVH/Nw8K/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHJmbGpudW94Y2hiXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsfJ0plydK7R0czKxLW6v8TIvr60vsC/f2F2y8bCvsG8v8PMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGxsbl9jX2FiTkhOP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQwrq+vMS+t7zAv8nPx8jKysGGc3SmzMzLzcrGwsPLzsG8uLy6sHhxabvIxMDAv8TAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIe21teHxgcWNbX2BfVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u7q9rDvra+wL6+uqacqrK2w8CleXd6nMTGy8jBw8DAycrBv7u5sqKKf3WuyMXEv8DBv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnpuc3h0aHBeXF9dWlJGRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vEt22tzr22ucC8qn1uaG5tcoGWmHR4fZm9v8bAucC8vsXEvb24sa6gn4yOncrCw7y9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bXV7cW9qXGBgWlNQQUZJR0tARUNJPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbJ1gbO9trXBpIZpWl5gTVJbW290eIOiuLjCurO7t7u9v7q7u66ioqaXn4C+xMO+vL+7u7i2wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z2d29xYV9mXVtVSj0/P0dHPUdDQzk6NTs5OT48PDk6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmmhHiKoK+1nGpmZ1ZZYElJTVBUbXiIp7C3vrmytbK8uby2ub61laW1pa12rcnEwL2/ubOusry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYVxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/GqYh8doyhmF9TQ1hVR2FqVk9FSmGOoq2vtrq1tLKsvLm4tbjBvYueuauudabLwr+5urWupayzsaawraidoJ+lrba1wre2tKWoqqiwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3ZzbmNeZ1ldXVNPTkE+SkJASkpANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7SQgnmIkG5OSz9kWUJOd4CUaU1BXYOwtbO1srSvrLu6uLa5v8Z2h7CknGapv7i1srGtrZ+kpqedpKWclpmZmZ+prrmsq6ufpaikq66vp7Crr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211amxdXGtVXlxQTkhER01CRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhHxYRkFPh1lKSlh3jYFiQFOjubO0srCxrbC5uLa7t7u8kaOzraR0rLCpq62ro6ihnZ2el5eglZKWl4+Yn6iupKOkoKKmoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeWh1dG5lVWFkV11ST01JQElSRE5DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yvKmYmZRoTT9SeHFQSUlLaJyAWkVSrruxrLOvrqyttraytLWuqaefmpudn6aonqCoqZ+hp5ablpeOnZSPkJaNl5ukqKCgoqKhpaWco6OgnqWgpKylpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CXlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoYh4g3x2f3pjeG1uXVFpVVBPR1BNTUNQUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3CqqW9aERSnYJRV0lKYEpVjWFkY4GutaqytK6qq6+wsrOtpZ2Rl5OPl6CfoqCco6SfnqiUm5aWjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6OoqJynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJWTkI+RkZmQlpWYl5+YnJmbpJmXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fH91dn1ta3tkaFZSZE5KSEdPU05LTkg8RUA8Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaCqxr/KoFBBc512T21KS2NmdHNgXGBykLGvrrO1qqasq6KbmZSNkZWWmJicn6KinJ2knpqkl5eXlpCSkZGTmpeboKSqnqGhnqanq6KfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqKlopqZnq+orrKrpquqoJuYmJiVk5aak5WVmpabl5eYoZ6cnJaboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3l8ZXl6YGJTVWFISUpLU1RKU1FNOT9BNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpMbGjFdTSmWkWmV9b3JbUWtjW2VhXmuPtLCwuKymoZydmpSXmpmQjpGVkYyOjZOZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKehoKOxrrKxtKqyrqOZnJ2eoZibm5qXmZuUlpuWmZyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2mCbGZbU1paTVFLT09WTVNNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp+qo4x5VWlxdnVwY3Z2WFdjYGNoWllXZ62urK+nn56ioJaQk5ugm5mXkpOfnKGjm56blp+an5ebop6loZ6kn6Sora2orKmkrLS3trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7a4s7itsrSkoJ2loKyhoaKhoJqYlpWfm5uYpaGgnqOhoJ6bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCgH14dmp4dV1tW1JhSVJVSEZVV0pDTUc9S0k4RTw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCjgG+CcGBjWExbUlpMS1BYUkhNTUeYrKqppJ+fmZKSlJiYlpaWjIiLjpWdnJ2dnpeemaafoKilsaqnrqOrrrawtbKxrra4vb+6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquusbm4vK+zsLXCvLe+s7O1oqyiqamyqauop6iamZ6aqqegmaegn5+oqKWknp2qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhX52cm1pd21pbVxYXENXTkpHTUhDRk49Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKOenYpiV15lYFdNUUc9Pj9DQz8+QlF4qa2pqqWfnp+io52enZqdm5STlZSenZiUhZ2aoJqrpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyb+wubm9ucK+uLS7xsS9w7y3s6qzraqztK+zrqqvo52sqLaxraOwpqGjsLGusKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF8dHJrbHVycWhXXFFGVUhESlBJP0VCNEZIOTU8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqgn5V8X15lYFFGRDtDPkY8Pzk2Tn6qs6ejo6KgnqWrpp6XnJSRmp6ZlYyKhoiGeG2IoKSiq6y0vLbDvb6zu8HDwsXAv8LGxcXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Aw77HxsK3w8rJw8HHv7q0uru1u7ewtrKqurKuvLi/u7qruK2rqri7tbyurrijpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrZGlveGplWltGTE1FRFRNRUNFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9c2phV05FPklZfG9hQj1cjq6soJmbm56emZeXl5KNj5eXlI+NkIyCg4J3cnFtcI+mra60ucW7zcfLvsHMzc3MyMjQzMzMx8rFxszQ0tXO08m9wL/Du8bFyMXR083T0NPTzMrBxsbGysjPwMnRzcfGyMbCvMTBvr+/tr6zrb/Aw8PHxMfEr7+5sri9xMLCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXRzZWJncm9mXlpaRE9NREVQSURDQTU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjk7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ2VamZdVElEQD9KhZ6kmYOgsq2jnpyfmpiXlJKUlpGQj4yHhISIhoOAgYGAeXFyb2x5pLa6ub7LwdPR08jNztHT0dLQ0NHRzc7P0MXN1NXY0dfNxsfJzMPFys/K09fR19LV1tPUyMzGzM3J083O083GycrKwsbMx8nJxr/Ds7PIxcvLy8/Hyr++v73Bx8XMzMnJwMPArq+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuWkIyGkYuAe3J1dmdjZ3ZqZFZXUkRORkBJUUM+Qj06MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hm2JUTEpEQz9DUq/RvbKvppycnKCkoZ2alJOVlIl9eHFrZWJocnBye4WKgHVwbnFzcIWzw77F0dDX1tXS1s3U1tbU09HS09TSz9LD0NPW2NXV0svKztHLxs3RytLV1tnW2NPW2M3Sys/RzM/RzNPQwMnIysTMzMzPz8XHyLbAy8DSzczQxsrJwMTDyM7N0NHPzcrIzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYGVyY11SXElLR0FFSUo+O0E4PjU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoqFaSUBBREFGUXaxr6aalJefnJqgoJ6bnJqViXdpY2FfX19fXl9fXWFsdXNwcG9scXF1ksTIx9TW19fW09bQ1dTZ1NTOz9XU1NHRzNHN09fW09XQz9LT0cnT0cjQ2NfY0djS19nU1szPz8nN0svO0cDGw8jGz87R0dLIzM3Ay83G1M/Mz8jEy8fHyMzL1NTR1c/SzNPCucWxpai1rqebqKulnbKosLOtrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYmNpbV9WUWBKSkNFQ1JNQDw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD9APUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu319TV2dnRztC/vMzJtr6upqqooaOrZkM4PT5EWIKqqJ+XlZeZmpyfnZicnJJ9cWVjYl9fYV9eYWBeYWBfYGVtcHBua29ydneczMHT1dPY2NbZ0dLS18/TzsvSzdXU0crPzNPW0tHWzc/V1dHF0dTK0NTV1s7T0djX19fLyM7Eyc/MyszAysDJys7Oz8vQzs7Mz8/IzNDQy87Lw8rHyc3LzNLTztTS0dDQyr3IubCuu7m1q7awrai4rbO+u7Gaj6CUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Bva2FkbnBhWFxaSkZGRE1YRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksXtIRkI7V42hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBhYF5fX15cYm1yb29zdHV2eaS/zNXR1tTT2NbOztPLzs7FzsrS0s/Hzs3N1MvO0s3L19bQzNHUy8vQ0tPKztHV0tXVysDKwcbNwsjKw8zExsjLy8/Kzs3QztTMxsnPzcnHy8XHwsbKzM3Q0sfQz87OzNDFx8G4ub3Dw73DubOyvrG7w8S1qpiloZiWkpWVkouUjZqRlJSPj5WCiYZ5cXJrbWhgYHFoWVhoVk1HTElQUUI7Qz47Njg6ODo7NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMrV1tna29jMzM/I1tXEwrWvtKigrZd4bG9wd4+ajYyXlZCTkZGVlpWQi3xlYWJiYF1eYWNhYGBgYGFhX19dW11ncnJwcnNwbXJ5pcfTz8vQ0NPUycTIycXGv8PFz87HxcfNytHIy87NxtHS0M7M1MrHys7Px8fP0svQz8W6xL/Gyr3DyMnOxcPHwMfNyMTMyszPyMTE0MnGwsbJxb/Bx8zLzM/Cy8zJx8vQxcXHu8fDycnCz8G9vL+wwcnHubyqsLKnpZ2inJiQm5CjmZeZkZWYiY+CeG91ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7utpLZ+Z4KFoqqTjY2Wj4WDg4OBfYSEfnNfW15dXmBeYGNkY19dXV5fYGBfW1pcYGxycW5va2xvb3250cjJys/LzcS6v8O6u7q5vcjGwsPAw8jKyMjKyMHFzMbIys3JxMHKycHBy9DFy8i/ucG8xse+wMbPy8TAw7vJx8m8ycfFysG+wsvGxcS+xr29wcPFzMXGvMDJw8XH0sTByb/KysbIxtHDw8bDrsTLx8TKt7+8urSprKSlmJ+YrKOhppujoJuVfHdzdWZqW2FubVpcWFJETEdCR0VMREZTQDU0MzM1QD0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srC2bF55fJ+RipKWhnqAhYV/dXh1cnBfWltdYGBiY2RkZWRgXFxeXV5eYFtZWlxib3Jua2lrcG9zj8e9ycXLwMbBsLa5sbGzsrHCvLy8urjAwcHEvr25vb+5xMrFxsK9xsC3u8PJv8HJu7a7usbDv7zCzsPGvr61wb3Du73HvMO6tL3GxMLDt8C2tr6/u8zDvba6yLu/vsvDwcbDxsnHycbQxsLMx7LHycPOzMHFw7+9srewsqeoqLmwpa2wqq2slHp2eGtlaGBob2RWXllKRkpGSEtBRkJGSUA5OjY1ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1dfNys7FycXHwbrFvayupmBjdYGSi4iLhHh/hoZ/fYN7dHRjXFxdXmBgYmNiYmRlYl1cW1xeXF5dWltcXmhzcW1nZ25vcnmdvcvBw7rAuK2wsKapraumuLS2tLOzs7u2vbG3sLSusrvCvMHEvL+6tLK6vsC4yLi0vLbBwr24vcfBxLu1r7K1ur+0xbi7tay5vb7AvbG7trC3urPGvLevu7+1t7XFvL/DxsDExcbHy8XAxsa7x8vAzsnHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpGQkRBRUU/PTo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDLzcjJyMrJysTQzdLPzcXHwcXBv7q4ybersJlbZ2+JjoaIiXp4foaGdneBfHNoXV1dXV9gX2BkYV5jZWNfXlxbXltdXlpbW11fbHBuaWZqbW5yfKTGv7i4tK+qq6eeoammnqqssq2qrKm0rbaxs6mup6yzu7q2w7m6ubCrtLm7tMK5r8Cxvry7trzHucO3raqosLLAtri9sLGosbO1u7ysrramrrauu7KxqrmwrruuvLi8wMC+usO/xsPFwLzGwsjLuMXHxb/HxMO6xMbCu8bJzMuzucK9u7OJdHZ3a2lgYmxpWVdXW0FMS01KRUFDQEZBOjo6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcTPx83Bwsa/xMTDw8rCycq/wLzBurO1tcOuqrCSW2l+koiOj3t4fYmFenuEgHduXl1cXF1fYF9fZGNiY2RiYF9eWltaWl1aWllaXGVub2hmZ2lrbnKBrbqwta2lo6ammZ+kn5mbpKqupKiiq6qsqrCjpp+qrbW2sby4r7evqK64tLS8uLO8r7i5tbK8wbLBr6Wpo6uxsrOovaqrqKutrrW0pqitoaSvqbKmqKiupai3rLGzt7q6u7K8vr6+xL+1wcHHyLe+wMW3xcPAu7/Ewr7EyMzKv7/EwMCph3N0c2ppXGFvZFdWWFBIWlJTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz83Dx7m5y8LLvrvJtr3DvrrKt8HDwbS2vLaxr7W8ramrkmNtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYF9eXVxaWFlbW1lYWlxfZmtmZGZlaGtvcoWppauknZugo5Oco5qXkKCiqaOin6Wmp6atoJ2bpKassq+3t6ewrKiqtKu0urG2tq62ubKwurqxt6SgpKCmsaisqbqqpaenqKezraCop5+cpKasn5+npKChsa2trLK1s7Sxtb22u8HAsru+w8GxubnCs8G9wLW4vL2+vMLHxMPEv8DEoIR4cWxiZmBrb2BUWV9ITmhPVEhGS0Y8PUA9Ojs7ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wLq9taCelJ2hprq2q7Ozu7PEz8nLwsa4t8fAzL+4yre7xbizxbizv8CstbyyrKavtK2ho5JpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXV9kY2NmZ2dna21uh52onpSUmZ+UmaGXlYudoKGmnJ+fpKWip56bopufq7CtsbWkqaqqrKyktLitt7Css7avs7WvsKqfnp+korKlpqq5raKmpqCorauZoKCemZ2fpZqao5ycnrCprKiqrK2tsLO5r7i5urC2vLu6q7OzubO9tLexsba1v7W9wL3Dwru7vZeEe3NsX2VeZGRYVFdeSVddS1BHSkpHQTw/P0E7PzwwNTUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67uMHBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uce4t7+3ssK0sbu7rLm6saKfqaunmJ6QbX6Fhn94cm1vbWtiXmFmZl1dXl1dXVxdX2FhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXWJkZGZmZmhpa3KMp5uRkpKZlZmflJWPm6GhqJ6bnaWmoqWboKGama+ura+yoaWjrquoorWwsrKsqa+zp7qzpraho5+co6Gto6Kqtqujo6aepqajlpmdl5mbnaCal52cnZytoayoo6SmrauztKq1sLKrs7m0r6uvsrKzuLOuqa2usrewura6vcC4s7GUhnl1Zl9mX1tZVlNaVUtbUUxKRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+znaWjmKWxwrW2va20uMHMyMa/xbbBwMfOtsDDvbO5ubK/trG5u62ytK+fmqOqoJSaj3h/g4R/eG9xdHFoZWNoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqCakZGOkpSVnZWXk5afnaCclqGhqKSfn6mdm5urpq+wq5yjpLipoKCvqLerp6etsKS3sKS3oKOcmZmqpqGbrbmwo6GknKKgn5OUoZSWlpuZmJaXnJWfqZ6qpKKdo6qqsa2otKyqp62zsKWrrrOxsLCvr6eoqLKusbSwvLS6uK6jlYJ6dmVfYVdZWFNSVEtNXkxQTEdITEtFPUA+PUI8Ojc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0usKxvre9rp2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGuvLu1u7y1ubmwr7CqnJqhqZWRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjY2JjYmJjZmmAk4+Sio+RkpiWm5OUmp+bnpWfn6empKeooJ2fpqCrr6agoqO3qKGhoqmzoqWopbCmsa6stZ6hnZaVqaGilK2xsZ+jo56emJuTi6GUkZOYmJOXmJiXnqebqKGimqSlpaukpbCnpaOrrK2mqa6vr6uoqqqzpqarr7Sxrry2sbCvoJJ7eHNlYlxbXVhOTFFIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sba9sLuxt6yepaast7u8wcW6sbm1xMnJwMPGxce2xsSzwb/Fq7e3vba9uru1sqytqJmZn6OLinSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVVJUUlVgYV9gYV9gYGJkaX+Pj4eOi5GPkZqSk5WjmaCWnKCloa2mpaWkpKOdqqulmp+lsaqhoZ6lqp6oop+urKqpra2ioqKVl6KanJCrqbCcn6Kfn5eYk4mekY2Sk5aQmJiTnKGjnKShopWgoqSlm6OrpaKjq6SrraWusqqmpaamtKaqqK2ztbS5urCrrJ6Mc3FwYFtXVlZSRlBPSFpcT1JKVEtTTEVHSkQ4Ozs+PDk2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByczItcm8sb3Dya2xuMG1vMC8tLWqrKaWmpyciYFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSUk5RWV1cXV1eXl9fYmRtioyBjoONjYyXkZKRnJqhnJugqKmrqKynqaakmaWvpJWZpa+poJyZm6Cerpqcq7Sgpqafo6ShlJOblpaSqaqtm52goaGblJCMmY6MkYySjZaVkJ2hoKOdnKOVm6GjoZiiqKOiqKugq7Ckrrimo6SjrK2pqKuvtLeyvbWzq6+YhXV0aVtYWVJVUkVYTFFbWE1VT1FMUVJJTkpCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7auqKivrpupqKy3tqy8yru2v6zLxsW4wc7Px7PEure7wsixrbi/t7y+u7O2pqmglpiZl4h6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOT1FZWlpaXVxcXV9gZHyJf4h8iY2HkIuVj5aYoZ+aoKuqpq+sqLClqZqfraGVlqSop52YkI+anq+XmaeqmaCdlKWhn5KRkpGTlairpZqZmZ6elo6Mi5OGiY2Dj4uSlZGgnqGkmZaflZqhop6Um6Wlp6mooLCwprG9qKCjrLSqrqewtLC5tcCxrrGrkH5ydGNWVFZOUkpHVlBSUkxMWE5KTE9SR01LQUNGREQ+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7SsprG3qqWisaudqaepsrCktsa0ubqzysW5usHL0Mqytri8vcDDsbCxt660tLuztKOjnZ2Yl5WEgHZrZ2xucW5yam9rZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlRSTk5OUldYWllZWFxcXWFqfXd8coWLhI6HlYiTkpeamJ6om5+rpqasnqiZoKack4+fo5qXl4aFkpukkJWjnZaWloiim5uTjI6KkJqlp5yVlZebkZKHlI6LgYyNgJCLkpKSoZqgopaUmJiVoqaajZmkp6mnoaC0sqizuKGco7esqa2ks7Kmtbu1q6yxo4p6c25eTlFRTU9ETk5OUEtGTk5KSk5OUUlNSkFITEhIQz45NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS3saWnpKqloKmmpLOqorLDtbWys8bGtrrDyszGs6y5vbS4wK+uqbCepq67r62gmpuelZWIfIRuX19mcnB2cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFpdYW5vc22BhX+Ffo+CjYmTkJKdoY6anKOipJillqKclY2ImZqMc42Dfo6XloaSmpCUjo57mY+djIKJgIqYoKOekJOYloWOg5R+fnSKjnqQiJOQkJ2bmpqSlpCdjqOjjomaoKGkpJuitK+ssK2fmKa4pqWwobGunLG8qqmvqpmDeHRkVk1SUFBNQ1NOTFBNQlBRSElOU01ISkpES01GS0s9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKimpaijpaWmpqayp6a0wbivtLDJxLe5wc7GvrOsusGsrcStqKKmkp2mt62joJCWl5KQfnh/ZldWX2dmaWdobmNpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpITlRTU1RVVVdZW11paW9qfIJ6ck1XcY6BloWMnJeLk5GfmJ2VlJaUj5aKgJSJXztWb3yMlIqAjJKMkIaGc4uFl4F5gXuGlJ2Vg5WOkZCDhn2TeHFwho19iYGQjpCXmpmTi5CKnIifmIiIlp6aoaCXp66praionpats6KmrpmsrJiotKOpraOTf3RuYFtOU1JXTERUSlBNTEZOT0lFTFFNS09KSU1QRklKPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqapoKapp6OqsKintMG5sLWwx8K3s73Pv7mvrrXCp6rEqqKdmIOUnLGjmpiHlJCLh35zdl1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU5RTUtJRkhOUVFNT1JUVlhaYGtsZnh/ck9BP3+VkZB8iJSMhIqNm46WlYmSiIaVh3mJf2BKUW54i5KEfoSNi4WAf21/f5R3dXZ4hI2acFGNiIqGfH54lHZod4aIfoqIlYuOkZOXjISKiJSEm42DhJKblp6dlKSiqKmlpJ6bsKqhpKSSpqqWoqqcoaaoiXZuZ15cSFFRU01JVU1TSUxLT0lIRkpOTE1US1FRT0dKRD03Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2nKOnnZ+hrqGnqKWnqK+sqra8tri3s8G7tqi5yLi2qKi1tqqyvKeelY1/iZSplpWLf46Dgn54cW9YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERDSU5PaFlOUVNUVlpugnF0fGhnW1OPiZSIc36GgXyFjJOCkpmLj3uGj4B2gHhzb3VxdI6OgXp+iquFenpodnuOcHJteIGLjZJ4e4B7gHdzc5J4Z3WFhISFfJWKiIqNi4B/hIuNgJSEfICPmJSclpGfnamen6GdoKmlnp2Yjaekk6Cflp6fpIFzaWJdXUpXUFJHS1hST0pNTFJKSkpMUEhMUUxSVE1GSUI8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6qlrauwsaq9tLK7uLa6tLGft7qyqp2drKmosq+impGNlIGOnI6Rf3aGd3x2b29qWUtISEhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnSCe3dldYuVmI2OfGd4gHZ4f4mQfYSYkoBxh498d3tva36tfXSQi396hpKAfH90ZnZ8hmxvaHN8io2HgG15cX1xbXaPcWhxgX6OcESLhYKDhX93d3qMhn2Me3V9jpKPmIuSmpujlpmdmp2eoZyWjYulm46dl46WmJB4b25nY1tYWFVRSlNVVE9QTlBWS05LT09KUk9ITlBMRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKawrK6rqKmxr7GrvLisu764s6ynm7CnrJuPlp2lqaShmJmPhZJ5iY+Li3ZxfG11cGptalhLRkdFQUBDREhMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTk9RVFhdZXBxa4emqsB+dHhie3due3mIkHl8i4ZvbYySeXR5amqAgnGWkYyBfZV/SZKZbmh3foJtamRseYWQkoZrcmx8bnJ8hmltcH9zjYmFhnt+f3t3cHR0hoJ5gXlwfI6LipODlpeYmpCTlpaZl52WjIOJn5KLko2GkJeAb2pvb29ZVlhUUlFZT1JUVFJYVU1OSE1LTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuYm5+kra+iraqota+urLS/q7zDv6WimpWkmJ6NhIuUoaGYmZGTi3OOeoCGjIZ0b3RrcGxkbGpZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JWWlFZXF+nh2GZaHJ5ZH5vbH96i4l2goiGdGyaknR0fGpqnY5NeYWTiYSOZjF2h3Nsfn6DdGZldX+EhIWAZmlsdWtwgHxocXF8bpONj3t0fn1xcW51bYJ/d3l1anmIgoiJg5aSkpCLjZGUlI6XjYB5iJeIh4qGgJCIeGxrcGhlWFJaWFlZW01QVVZZWE5JSEVKSkhHQ0BHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVukoiakJmWo6itnrGep7qvq7KwwrG7w8ealo+UmYuOhXqEkJiUjZCMj4Zxh4J0h4yGeXBycG9vZHFnX1RGSUM+PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVUxBSVFJYq+yn3F6d2t8bHGCgYWBeoSGhnlyoJV0eIBzdZSHNXGdqJ2OoaGEooV2cId8h3xzi62NiYFoZ2JqbnJtcIN1aW9YdXCOm5F2bX97fW1ybnCAe3N2bmJ1g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2Oe3NxcW1gW11eXFpZYV9STltaWFdLSEpGSUc/Q0FCRz9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiVkZ2kp56vlaW0qa6wrsGyu8HFlpCMlI+AiHxugZCSiYOKh4+GdYKEbJWIiHt0eHhtd253ZGpeSVBHPT83NDQ5Ozs7PT5AQkVITExMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01RU0RLhnV/fHt1fmx2iIh8fYSDf4x+daKaen6GgYSZhJqcYYaqn52Kg5COeneJfomIjnOKl4+Ee11kcXR6fHeKbWhqYnlvhZCCem+BeHWFenB0enhrbmlddoZ9h3yHho5/ipKXg42FjIZ9cYR/hH12d3t8iXhxdHVmZ2BbW15TXGdeV1BUWFtVR0pKRUtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIp/k4yRnJ2fppGgqqCxqK/AsrvFupaOkZSHe4Z2a3+MkYJ9ioOOjHiDgHOghIp8fIF/cIF9emh2bFJYTEBFMjExMzY2Njg4Ojw+QUVHRkdKS01PUVFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9RTEtUXVlSS2iDiHuJeXtxfI+MenyJh36Xh3ahmoiHj5KUpY2tqUiGrq+ui4GAk4qCi4KEkqmHgJiYipx0bXyBhod+jmhnaHl/boWHgoVxhIZIbIB3cnl2aG1rX3Z9goh/h4SLeZScm4mLiJF/enWKdnx4bW93foB1dXNtXF5eW2NjWGdmXFRQUFdZUERMS0ZPSUNGQ0NAQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5GOlpeSlqCerKCmuK+zvbOXjZKLmIt9dHB+iZJ+fYyDkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyNDY2ODo9Pj9CRUdISk1OUVNUVVRUVlVTUU9HQz84MCwjh1s/Pzg0Ll2WcHOjVUZJS01NUFdgWHBZXF5pjJOGlICEgYWRkn6FiJGAmpWCoaGYlZuapq2Tmbuxp7vHw6iLjKGlj5SJgZF8cYOen5Gdf3eFhYuQh5BpaHCEgXSMh4SKcoaCd4d/e3aEfG52dWZ/lI6HiIiHiIegqqKWiY6Xf3qBiHp5cGdreH97f3VsZV5bW15qXmJnYFpPTE5XUlFJUEpETkdDSkRDQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZneDen+Mf4GQjoqam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH6ShpKVf4qAkpuOg4CBjIqCiY2Df4qAbXBqXUJANC0tLy8uLjAyMjM0Nzc4Oz0/QkRISU5RUlNSU1NUUlBPSERCPDg3LzlDPjw8NjMubJOXTVBISUxMS05WYGN/ZmdtdJuajpmSkoqNjpmIko+di6CgkqOqpaSsk6m2oqjBwq7Hr3i6lJp8jaGemYSThYKOoZ+UmZGFioWPmZGWbHB1ioyCloyNjnePhHFthYGKlpGDhYhxiKCVhpKJjY+WpLSpm4yUooOHkoN9f2tqanyBgoN1Y15kYFtnbF1sbF5XS0hOUlFNTExGSVBDRE1GQkNFRkI9OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnF2koZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXl/koiRkn2KhJiSkIKAgIuMiYaQh4WJhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOT1JUUFBRU1FOUElFRD47PDpERj8+PDc1Mjw/UjVISEhMTE1OUl5uinxzgX2fnJunpaGZoZeilJyeqJ6oq5+orKmqtperv6u2yMi3yNDPvpugcGmrqZ+Ek5KFnKCam5mmkpGIlaKbm3h6fpSYk6KTl5eBlJ57d5WSq7KJjZeffJSdm42SlZijoaa1r5yQmKiHlo+NgIhsc3N9gX1zaWBeYmBiaGRgZ2ZcUkVKS1BPSUlMRkZNQ0hMRkdDQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbXxhd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjox8ioaPkI6BgoCJi4qEkoWDhomBgIZ2XmJQNDYwLTEvLC4wLy8vLi4wMDE1PkFBTVFSVFFSU1RSTlNMRUVAPD49RkdAQUA4NjYyPDk7RkhHSUpOT1FZbYWPd5SKoqaptLy4pK2srKaotKuwtrKxrbuxs76cs8OrusnLt8O/uKWisLOsraqji5aYhaamoKOXgaaZjaKrqKWIhZSkoaCroaSoj5yxi5Wjpre6m6CisJKinaKdkKOhq6+ssrWilKSqiJmIkomVeXp+hoBpYmldZmNeZGReZ2dfW09DSUhTTkZITEZKR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhiV2lvWHqFdoGThYiCm4OSkIyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5COg4SBi4WGiJKGgoSJh4iHh3FuYUBFNjQ8My8xMTAtLCstMS4tND9DQU1VUVJTVVVWVU5bUEdIRTw+PkZIQ0VBNzs8NUM7PUZLSUdIUU9QV4GSn4Sto7KpscDGwqqzxbars7+zuL62v7TBtru6o7jFqLbJx7W+ubSoo7StsLGbmZKan4inr6ullHafpJehrLK0mZaqrqmutruyuqywtaKxq7G1u7e1rrSgp6ijp5qpr6yyube4ppu2qYykjpGTn4Z4gYV3WmNlV2djYmRgYWdgW1RKRERMVVFISUpESUdFQUBAS0RCTUc8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWVFiY1d5dXCBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiHmGgIySjIeEgY5/gYmPh4CGiIWKh5F6eG5dVkBFTjw2OjU2QUI3NjQvLzZDSEJRXFBRVVdVXFZQX1VJS0tBPz5HS0ZGRDs+QDdENz9CSkpFRlZTUF6PpK2jsbTCtbfBy8i1u8S9s7PAtrjBtb+vt3Sxs6W6xKSwxrmxs7G0qKS1tqqxoKKXm6KSpbCupq2rp6SYoKy0u6Kosrq1vL/Mv8XFvb2zwbe5t763ure5rKywpbCprb2wvLrCwauYuaeUrY6Xl6qIfoN+bFhkYllrZmpmV1xjWVZTSUdGTFFHQ0hJQUhEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUVZTWVVadmpvfo6EgI2EbnpzeIdiuaGZo4mUlJaSlJONj5aSh4Z7hoGNlYqAhIGKenyLh4Z9ioKBi4SVfXd6dWVQXGRHRUw7UWNhW15TRj87SFBFWmNSUllYWmdZVGBgTFNQRUE/SUpIRUVBQEQ8RTZCPkhHSkxTWlRdk664tLq4yL+5vcnMu7vAu7e1u7q2vbS6scZgdbKksZqeq72ppairqqSisrWgq6ielZafmZ+upaempZ+kk6KnsbSnsrK9tsG+08nJ08bDxczCysPAvr2+u7y3tK+4t7bDucW9wsevnrmpoauOpKi1iIGBc2BjY19YY2BqZ1JYYFZSVUlFRU5LQD5HRD1LQT1CQD1GPjtIQTc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjISPc2xycnOH1cC1maCNlZiZkY6XkpaWjoaHfYaDjJaKfoN/g3h7i4OHfIt5gYqCl350fXprZnB1WV1cUGVkYmBlZF1bWFdcTWRtVVJtbV9uX1hnZFVZVUpEQktLSEZISEhIQkk6RD9IS1RUVlxaW5K5wLi9tsW/urjJyrq2ubW3ubK3tbOutraYZHWonK1wXqKsnJigopuknqqllJ+gkJOOlpmXp56moJ6amYOknqylqrCtuLC9udTRz9bQyszSzM/Oysa/vsLKvcG8wcDExMXKvsjOs6S7sLSvmqu4u5h/e21eYV1aX2JaZGNQW2BTUEtDQUVGRTxART5BSEFARD06RT49Sj8zNzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVxZaF9vlpGQlG5sb3R1h7OroKGfi5mcmYyMlZGbkoWKin6Ih4yQi4l8gYNze4qDhXuJdIKKhpV/c3t5bG11e2hyZWlsaWdqaWhgZmlpbFptc5atpLyIhmdbb2hdWlpUSEtOT0pLUEtTUUhMQUpGSk9fXmJnaWGXt8ewuLK6vbWxxMa1r7iwsLursrGnq7erjLannZqnmk6anYyOn5aRppillYqTk4iQiY+RkZ2boZealZaHnpqnm6yvqLCotLTU1dXW08zQ09XN08/NxcLJ0L7JycrJ0cfMzcLQ0bevw7zEuaW1usKig3BlXl5fWWFYWmZaUV1YT1BCQkhFQkg7QUM+QUc/P0E3O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZUmVWc5CQmIJocW95eYOgqZ6ml4yam5eLjZWRmo59iYuEjYqKi5CHfISCcH+HgYZ7h3KDkouOfXF4dWxxeH5xem54c2xpgXBtY2ptcHhpd3x+y7/B36dtY3huY1thYEpQUlVOWV5QXVxOUE5UUVVUXG5tdoJxlq24rLSmsLWqrLy/sKu0pqS4pquuoKu0o46xrpqXmIyRk5GEjpuBjaaRnImDi4SKiYSLhJSVl5eTm5CcmJman56rrKWooqytz9LV0s7M0tTU0NTRzsjD1NHHzdLT09fM0dHF0tbFwM7Hx8KovrfOnntwZ19kXlhhU15aUFFUUU9IPkBGQUJFPEBBPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1OWnWGhYp3bHdvfX5/oZ6eoYyMmJOTi4ySj5aEeYWPkI2KiYeRhn6Be3J+f4GHeoR1hZOQiH9vdnJrc317dntzgXhyaoBzcmlvcXp5cXq+y5p+jLKEdnKEdmhha11DWlpbVmVjWWRqVFhcXWBkXmN3en6LgZipo6Shn6CopaqwuKqls6OhraKjraGnsZ+IppqTkpGJkY6IgZOJapSijJmEgYZ+kYODk5eti5WNlJqOhpORnpensKGhoaWkqcjNz8jCzNHU0tTSztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMPCy4x0cGViYVlVWlRcUEtHSUpKQDs6O0RBRDxCQz5HQj5CQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJyUnZSFi5WJj4qIjYeOf3iDk5iKjIiIi4h+gnhze32Dh3d/eoaRlX+DbndwbXV/dnh9dIV8eWyHdnRufXaEdHh7nbWMO0GLxaV+jHxpZVdJQ2ZjZWNnamNud1teZmhrbmlugIOIkIucnaCdkJeYnqOjpbGjo7KfoaWdoKigo7GchZ6SkpKQio6LhoOPhH6cm4yNgoSFepR/gqmVo4yRipeSi36Yi5qSq7OYm5yonKe9w8a5tsbO0tDS0MvSy8nUztDV2tfX2NTZ2M3Y287J2drR1r7Ly7V6eHBmXltTV1JbVkZHSklFRT06NzpAQEI6RkQ/RENBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXOFjXyXkJ2Lf4eSg4mGhYmBh3x4hZaWiI6Dh4WGeoR5cXp7g4Z1eoWOjZx5i3B8b296f3F7gXGDh4Bujnp0d318gnV+e4aHr3NYqcK2jZGCcG5iPV5ocnBxcG54doFlaG9ydXhxeouGjpORm5WflYeMk5ugmp6pnqCsm6GamZ+lnp+rmYuajJCRjYR9iIeDhYuOoJmTiIOHfmyZeoSZhoiTjI2UjIZ8nImUj66qlJaYn5mnr7a9qa2+x8vJyczLz8nE0srU19nX2NfV29fT2dvV0Nva0dbI1MuWe31qalxbUVRUX0hDRklIPkE+PTc6PT87PUc9P0FBQURBPj46ODZEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OTlEP0NHUmpebWRiZmt2gIhxkY+agHqAjX6CgoGDfoN7fISYjYeLfoWGgHaCeW57e4aBdHqSno2gdo51gnR1gX1zgIRvgZCCb5KEdXyBhXp2hnuIt8Wkwcm4gZaaj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWlJWPl5GEiY+WmZeWpZyXn5aek5KXop2Zq5WQkImMkYKMhYiIgYaQkZ6bmYiFjIGFl3qIiZ+XkIiNiouCfaGKkYu8oJiTl5mdqaamrp+otr/AwLnHyc3Oxc3K0dbV1dnV19vU19na29fb2trYztvGiH17aWtnYlVYVlZOTERNQjs9PTw4Ojw+OD1ANj0/QD0/Pjw5ODY3REE2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWGVhXVtodHp5bImMknd2eop7foB+f3yEen2CkYmEhXqEh3p1fXRtfH2GfnR/kp6RnoORfIZ+eI9+eIqKboKagHSZhn6BiYV8fZB6j6mOj8OhvYuco5x9iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CShYmLkJKUjpyZkpSQlo2MlZ+clKCUkY2Nj4t+kI6Oi4SJkpaanp+JjJSRnZGCi3+lmYiEjYKFhIClh4qLuJidkZWWoqihnp6dpK+3urWswMbK0MjHzM/T09LY09XXwNfY2dvY2trZ2dfbuXt7em1rZ1liXFRQT0lDTEE8PD45OTo6OTk7PTY/Pj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg2ODk/PURSU1JYXlVYZm1tbWmBjopxc3mKe3p/fH97h3p8e4uGgn10g4V5cnpzbYB+hH53hZyhmp2UkoCMiH+Yh4CckW6HqIV6oIt8kY2DiISbfZqQioyjoqCQpK6fipCLhYuBk4ZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlYyHiIySk4uUlJOOi4+Kh5abnI+UlpCKkpOGgIuIko2KipyWmaKihpOdlqCKiYiNnJCDiI5/g4eFpIaMkLOYnZKVl6Ghn5mSnJ2osrmspr3Bx83Ixs/N0MzP19HR1a7W1dja2Nra19XZ2aByf3dpaF9eWVRYWUNBSEM/Pj46NDk6Ozc6OzszOzs/PT43Ozk6MTpIPjozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieW1hfpGDb213i3h5f3qBfIV7e3aFhH9zcISBenV2dnSEg4V+f5KmpJ+lopaKnZCUl4uKqJdzirGNhKeShJmThZmMopWfmJOImp6jkqmvn5GUkI2OiJaMbo23hZrEyLGboaWbnJiWkLKRZKTNyJaPhoeIj5KNjZKTiYWKiYWWmZqPj5SThpSXg3+Pi5mIjZCqlpejo4iZn5aaiI6GlpeKhI6NgX+Ij6SJjZOompeTl5mhmZ+Zk52bo7O0pqO8wb7HxcXJyMnCy9PNzdSp0tHW1tbY2tTT2s6EdYJrZmBgX1BLVlxCQkZDO0E9ODM3Ozw6OD02NDk6PDo4Mj85OTI6STo9NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0SlE8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCZINHdYKOfXxtfYh4en56gYGCfnZ2gIJ7bG6Kfnl8d3h8hIeLfoujs6ikq7KhlqegpaSWla+ig5C4lZKzmY2hoIykm6+ipJ2YkKeXqZmtr6SXlJWUkIuYmpagwI6jybirmqKlrZmRm5yynYaFqKKdmIWIiI6VjIuTj4eBhoeIkpiUjIqTk4aUmIaDkZCcdJGZspWWpKGInJqTj4qQipeaiYqWjYZ9jJieipCPnJqZk5mYn5SgnZWfm6GxrqOkt76zxcfEvcPDv8bOysnSp8/N09HQ1tjSz9i8dXx4X2JXYlhSSUtPRUJDRDU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdNW1xZSWhhO0iEinp7bYWGeXyEeICFgH1weHx9fG9zjHp9gnt4hYuJhoOSqLytqbK9r6Wus7Opo6KwrIqatZ2iuKWVraSXqa23pqSjn5mpmKqkr7CpmpmblJWRmKCXmbu7rcmhaba3qrCVmJ6iq5KXvaNeqbKCiYqMlIeRfI6OfYOGjY+UlIiHkpaLj5WNi4yXmZKdmrSWlauei5yUko2QkouYmoqSnY+LiZWfoY2VjZeZnZOcmJ6VoqCUnJ2lr6ihpbO4q8LIxLa7vbzFyMjC0KHGyc3NxNfW0MrTo3N9a19cVWFTUUdEPjxDQUI4Pzg3ND5GPDw2PDM1MzU1NDU0QjM5OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGZIYWBicElAi4l/gHKGh3yBiXWCioJ+bX19fH5wd4d3jYGHe42PjIaMmqvDwLC9xruztMG8tKyrs7eMqLKtrb2rm7qkqK25t6qmpqGio6Oqr7Kxqp2co5ibmJeeoqWlkqO5rqjAu6ytsrmlpKd9iIacrb2vgouLipCDjoORjnqBh5CNjpyIiI+XjYqUl5SQmpedp5qwmpGrnY6aj5KOlZCPlZeOkaCQiJSbo6yVlo+UnJ6UoJ6bmKChlJqep6ekoqSws6bBxsOwsLu2xcTDv82nx8PHw7zW0MzEyop2dWRfXGJdT0tDTEBFRj5BP0E8OjQ+QT09NT02PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxoRl9pZ1pdXJOMjIh7h4uGg4x1hpCKgW5+e4F+cX6BepV6kpSUmJGTlai0x8nAwszBw7rHvLqvq7m7l7K2urPArqXApKuwvLyqrquiop6nrK+1sKqboKqcopyWn7C0p4uiurq1wburqJyypKSolISOqcTDpIKLjoeIhIaVlIx5g4yRj5KhjIyUkY+Il6CXkpmVl6agrpyMqpyOlo+SkZWVjpCVkY+hk4aXn6Cyn5SblKChmaSfmqCcoJSYnqakpqekr62lv8TCrqm3tcnDvrbOssS+w7uz0cnHwbV3e29fWl5sVE5JRE1LS0lAQT1CRDw1QUQ7OjM9OEIzMzIyNjJBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJnXE1lXGZUY2qZjZeJi4iSj4aJeYaTkIFyf3uNfneHgYKQeo2hlqiampi7vsnIysLSycrCzbzBs627v6e6v768xLiswamss7u9qrCqpKWjrK60rba1oKCun6WimKO0vKmbqLzBo7W2r6uSr6yqq5aGmqmnpZGCjJOklYqAdYmSeYWNkZCeoJKOlIuPjJSjmZablJSjnqmfkaWajI+PkJWWiH2PlZKSo5qVoKKctaaQn5elpKOln56mmJ6Vl5ylo6ioorKtqLvAxK+ls7fMwLmuw7O7vsG4rcLCwr+ZcHtjW1heXE1NTkpHRERIQkJBQ0s6NERIOjs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+bElfWGFaZGRXnpCdjZeOnpKJin+In5KEeIV/lX5/kIiKkICVoJmup6OYw77JxMjG0s3Ozcu8wrewur20vMu7w8G2t7yts8C5vK6vqKGpqLatrqmyt5qerKKnoZ2rt7eppa++xLG9ubOnqbOzra6WlaWtqKCRjpKxxaeVjX2RlX2HkZiPqpmYk5OOk5WTpZ6TnZmToaKhnJifmIuMj4+eiFqQlpeSlqWZZZijnrOllqKWq62rp5yfp5eYlpiVoaSop5+2rKm6vMO1prS1y8G4qrass7u4rqi4ury3hG5wXFpWV1BHS1NNSz9BSERESEZGODVGTTs+Nz5BSi4zMjAyNUI1NVBXTjtMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVjw+QEJGQnNGaUlSZWNMRqWUnJWhl6iWjJCDh6WSiIGHgpuEg5WQkZSOmqKfr76uoce+xsXIx87OztLKvru2sbq7vL/PtcS9t7m3srK2s7ezrKadq6u4q6mor7CXo66kp6SltMGwq6yzvsK5wLmzp7i0t7OvlaStsK6ki5OVoY1zwZl9lpmEjpaZi7GVmpqVkpKZmaajlaCblpqpnJuhoJmKjI+VnGBKlpyalJqll1SWsJ+vnJ+llK+vraaboaaUk5mZjp2gp6KZtKmqs728u6uwssfAuKasq62ysaOhsrK0pXNxZ15cUFJNRVFRUFE7SEtJRkdBQz05S1Q/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFg8OkJDQD1SRVdTc2JWRkirl5mfoaiumJCXh4qnlo6IkoWfiIScl4+eoJujpbXJtKnGvMPEyMvJyMzOx766s665ucDBzbXIu8G5tbqxr6+ytKejm6q0tKuppq2smaSupaWorLrAqKu2tr/BwL+4srLDsLe9q6OutK25pYibl6abdr6fhJicjpKYmouulqGcm5eUmp+hqZ6ooJqbqpmhp56XkI2QnYNtdZOimpWcop+QrrKjq5Wpqpirr6WloKWqk5KZnImVnKKelrGmqau6t72zsq6+ubago6eppaacnKypqY1maGJgU0xNR0hOSlVMPU1ETUlKQUNEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXPDo9Li5TYU1WSH5lXkhGrJWcoZ+7rpiUnouTqpuRkZOJqo2GoZ6Mo6yUpKS2x720wbvCw8jJxcLOyMK9ubKvubTAwsq2xrHBvLW7q6mtrLCjo5mqtLqmqqesqp2or6ekq6u+vKitvLS4vsa8trW4wLC9v7OptbarvqSPopeRoZ+7nomaoJmXnZ2Ptp6pnKWjm5yhmqels6KbnqWcqKqdmJWPlJuLlomMpKGUnKKeobWvpaaTsauaq62fn6WkqpGWlaCEkJ6fnJappKGhtLS6ta2otbKynpyjppqXlZmqoZ54Y19hX0xJR0hNUUlNREZGQVFLSUFER0FWUkRIPEFHUTE7Qjc6QkY3OV1ZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRaiXpJ6ew6ybl6SXmaiblZqaj6qWlaimla2smaKqtsXBvL+4wcPByMS/zca7vrmysLi0v8PItb+wvLe6t6ekq6usoaGbq6rEoqWprKaeq6+soqqov7imrL2wt7fGtrS5uL6wvsG2tLK0r72jlqOVkpuTrZ+QoaGkoqOekL6kqZ2prJ2doJumn72imKOeoqmroJ2WjZWek56HjoSNk56koZ21rKaclrKmmbCpoJurn6GNmpWfhI6hmpuSpaSamKuxtbGqpaqtrJyYoKGSjpCVqJ+UaWVbYl5QSkhLT0xIRUNJQD1PSEA7R0lIW1JPSz1ITlU0QkU4PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGZjV02im6SbnsWroZ+rnZytn5KinpaloKaprJe2saOqs7bFwr3AtsDCvMnCv8rItri1tbG0tLfCxre+sbi1uragp62qq52en6WkwaWgqa6gpKmtr6KmqL21pbG7t7a1w7Kzt7q+scPAuLiutLS0o5yklJGToKyfmKGdqKiqoprCramdrK2bm56YpqC9oZ2kmKurq6agmY2Zn5KeiI5Yf5aepqGguKqmlJi2o56yoqGcsJigj5qUnoKPoJeWjqKjlZClrrOrqaKipaWVlZyZi4+Rk6SfiWNnXGVhTUpLS09GRUFGSz49SUE5OUpKTl1RUUk9TFZcOEZJPURNSThIY1xLQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2FTNlNaa1dzSEU2PXVlXExPnqChmJ7Dp6Wis6CcsqeTqqOfo5+sqaydu7GprLWxyMPBw7PCxL7HxL3Eyr2wsLausbWvwMW1urGwuratmqmwqambnqahqMKtm6yxnKqirrCppKe9t6a2ur2vt8Ots7PCv7HGs7q3q7S2rqqippWVlKKroZ+fmaerr6+vu7Kmn6mpmZmXk6KkuKGho5Kur6ukpZ6SoZ6UnY6QjZSdmqOfp7Snp42YtJyjr5ufnK+RoJSYlJqAkqKWj46goJOLpqywpaeinaCekpKalIWLko2cn4BkaF1oZktKTEtTQkNASUc7O0Y+ODlOTVVeUlNKPk9eXT1IUEJNTEk4TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHddXj9bVV9mckA4PEiWd2VBNJ+kn5ufwqijqbGgo7SplbKrpqKksqytqbuyrbC0tMa/xMS1v8S+ysW2wMnCtau1qbG4rMDFtLiurba6pZmrsquqmKGnl627tZuosJutn660sqequrOnubO4srjAqriywr20xae+rq23tamnrKGWlpGlpKGhl5ekrretsrW2n56opJmUlZOjoLejpKWVrrGypamkoZ6amZqVmKifnpiin6+yoqeNl6+YpauYm5+mkp2PlZiahpaglYyQnZ6Ui6mpqqKnoZmdloyPmZCBhpaJlZ96ZWpdbGtPUU5OVD1CQU5DOzpJPzc3UU5dX1JWUUFXYFxCSlNIVktIOlRkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM5MDZwW2JIMDVKcWpWQ1dGjHlmQzukpJyhpb+mqK6uoKi1qp24r6ukqrS3sbC4t7C3uLfFvcPHvbzEwsfBucHGwbqqtqWtu63Bw7e4qq2yvKOVrbCtspemqJGquaqhp7Cdq5+vtLOqqre1rLurs7K5t6y4sMG6vb+mw6qwtq6pqqumnZiYqqGhoJGXoLCus6uwuZmbqZ+ZlpKXpqC3qaWioq+xs6uxp6ugnKCfm56lnaCXnaS0sJufkJSmmqCpm5akoJeZi5aZlJaXnZSJkpuZlI6pqaego5yYm5OHj5mLfoyXho+abGptYm5uWFFRWlRBQ0VVQDs7SEA3OlhQZF5QV1dEWV5eTkxST19MSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNzQ3Z1lhRihAOG19aFxWOol7Y0M9qJ+coam8oaqvqqKxt6iltLKroa21va+zuLy7vbe2wcO/ycS5xcPAwLnFvsG4r7aoq7eyvL+/tKmvsrifl6ytqK6YqKmOp7ufpa2zn6uisbCzrKq2s7W8ra+xtaywtbG/usW2q7yvsbesrKmisaWepKifo5aPmJ+yqrOpqrOZnaebmpSNoKaktK6noaysrbGnsquxqaObnqiknpSgmZuptqmXmpKSn5meoZ+SraCamYeWmYydmp2Ui4+Wl5qXpqajoJ6WlpeUgZCVhXuPk4OMl2dtc2hwc19HWWZWRENOWERaOUhCNT5dUWhcTlpdR1teXU9NUlhkSktDXWNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfXmFWMTUxPWBWXzgpQzNZVVxnSzWMemZMQKSan6SstqOsqKSurbWprrO4pqawuMa2sLe/wsK1tLrFvszFucPBusC6xLjBubK1rKq6t7u6vrWrrrG3mZioq6urnK2rj6u+nquvsaOqn7Gtsq6utbG4tqqtrrGnta+0urzJsqq1tLG0r66moLOfmqisoKSVlZqZsaKtoKWvlqGkmZmSjaKlprKpoaaxq6q1pK6wtK6jmZ2tp5uXnZmZrLiil5OQj5icoZmYlK2gnpWClJmOnp2alpGKlJOemqWjo6GZl5OSlnuMkYV7jYuDi5Nsb3lvdXxhRmBqWklIWls9e0pHRTZBYlVpW01cYUpbXFpSU1NiYUxLRWBhYFBMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuK0EvSkdQW0czY1hUS0Walp+vqLGprKWjrq61qbezt6OstLfKurS7u8C/tbO3xMDMx7zEvbe/wMC4wL2yva6ourm3t8K3rK6yuZWXp66sp6SyqpSvu6SssrKmp6Kxs7CysbSwt7KprquyprivtbPExbaptbWrsK2pp6K2n5+msaCklJuYlLCep5ufqY2pop2blZelpaS2p6Kws6unsaetr7WspJmhrKicnJ2blKq5nJWOjouYnKKYkZioo6CYhZOXkZ6cmJeXiJaPl5uonKShkpaSkJZ3hJGGfIaChIyNbnF4dnx/XUtlbFxKT2RcP2J7R0k4R2dXZltMXmJNWFlXVVhUaV1QT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSWcyNydGYUxWJS1CLj1FTFE8M3JrTEREkZmkraSsraumo7Cysqq3sLWfq7W6ybiuwbzDt7OxtcLDz8TAwr60vcHAu7+8tMSoq7qxtre/va+stLSdoaexraWmsaWesrWsqrKxq6iotLmstLK1rLOsqquorKm5rbGwx7+4pLmvqa2tpqessKWko66jqZydm5qvmaKioqOQrJ+joJ+hqaaluKSrs7SkqquorK62rqKdo6iqnKCZmpKktJmPiY2HkaOglo6Vn6KWlYaQlJSem5mWlYeXkpWZp5ygoI2Tko6ReH6OhH19fYeKinJ0c39+flxSZG5eTlpnXUZElltHOk5tWGJaTWFiTlZWVldUWWheUVJMZFpbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0NlOzYqSGRISis6ST8zQ0lTLD6Paz9ISZCaqaqhqa+kp6OztLC0tbGwoKutvcy6rsG8x7G0rrTCw9HExb/Bsr7Dwry/uL3FqK23rbS5vMCwrLKuoaOnrqqnpbGjq7Gqrqqwrq6sq7K6p7exsqmyqaqlpaOtuqyqsMK5tKy5qKmoramnsKWppKKuqqiinpyirJWlnZeemKudoaeooaymoqyst7CxoKmin6qtsKudnqanqZqjl5iQoKiYhoOOioufoJCMjpeekpGHiJGVoZ2WmJaGlpOTl6WcnZ2MkpCNin9/iIR9d4CHhYd1dHKJdmxfWWBuY1FzclxLPIR8Rj9XdVhgWU9jXE1VVlVXUVxiX1RPT2hYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkswLklnREY4PEIwNUVLWDFAlF1ATUaVlqynoamxnKior7WsuLWuqaSrq73Ju7C+uMOvsK2yxMTOzsO/v7TBxMS6wbTJxKyvuK6zucC/tK6urKanqbGppqiyprStqrCtrbGvsqyzuqS4s6ysraern6OesLerqq25tqS1taOpqKysqqygqKansbGjpqWhoauWqqGUm6ClnqOiqqOsop6msbesrKKlopqpqq2pnaGlpKSZn5mVj5idk4GCkImFnaCNi4+Nm5CSjIWOmaSbkpGbi5ORkZSjmpuai4+Li3yHgYKCe3WBhIF+dXiLo4d4a15gbmdXZodkTkBnkkxEYnpXYlhSZVVNVlVVVE9cXWJWS05pV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIZCSUhElpCvpKKpr5ipqK21qrawqqSrqam8wcC4ubS8taayr8TKy9G/wbu4wMDCusG6wsSusbaytLvBvrOyr62srKi3qqatsKu4rqewsK6xq7WqtbantberrKSpqpyjnrOzqKiks7Sfta2hqairqKumn6urqLm2qaqpqaGpn62bkamhnaCjoqaiqp2bprSup6WpoqOXpaamqZyio6OfmZifkY6PmI1+h4yHhZ6eiIWLi4+Qko2Fh5ajmo6NmpGSkI6Sn5eZlo2LhH90h4F/fnh1g4B6eH6AiJ2PcHJnZ3F4XGF0iGlPXZhWSG15VWRWUmJPTFZUVVFPWFtiVkhQalRWVEdQWVVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyP2Y9Tlg/Qyw/TFRfL0lrN1JGO5WNr6ClqayZqqStrrK0r6qlr6mpu767wbGwua2itq/Jx8jQwL+9urzDvbvDwcC/r7Kzsra9vMGxsrOrs6mltaikrLOyuK+irbSxr7G5qriuqq+3q6qeqaugo6G1ramhnq+yobWqnqinqqOqoaGsrai9r6uurKGnp5+rmY+vopiioKimnqebmKmwqKKfrKGhkqGioqaYmailmJiYnY+Kh5SIfI2GhIWkloaDgoyHkI+RhYaUoZaJkZ2Qk5CNkZyUl4+KhoZ4dIF/fXR4eoF7dHR7aoKIo3ZpXmVsgXVniIt8UldwXkt4c1RkU1FfTU1TWmdOTVdZZVlHU2pSUT5CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWg6MzhfPWFkP0YxQ1BbWytIUDtZQzSPjrGfpKWqo6WjrKa0s7CppLCnqri+wbywqLmqp66wycbI0MK9wL65v7+9ybzCubGwtbK6vLnAs7S8rbmso7Wmp6yxtriypqe6ta20vK+7pa2ttaqtnKmvpJ+lrKqnnJ2qsqS0qZqqp6qkqZ2iqKipvauzsK2dqaOgrpyasqKWpJukpJ+kmpmnqqWemqmhm5GboKSdmJaoqZGZmZKQi4KPhX2Pgn+Ino+HgH6MiJKQkIWBlJuUhpOijJORi5GakpWHiX6Acnp4fnxod3x7dXFyfmmGeoSIZGBoY3KFe21neV1eVkNYe21UYVBSWUtLTXB0XUlaW2daRVZnT0M+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpKwmZ+eqaSjoaqktrKxpKmxp625wb22sKS5rKiosMPJyMzBt72/tbjBusi2xLa0s7Wyvbm6vbauuba/raKzpqqrrrW3tKmcuruosb+yuqCutLWorJ6usaOcpaepo52cpK+mr6Gfq6mnoamco6igrbunrrGuoaqio62enqymmJ+boaKbn5qZoqqimpqjo5WWk56hlpuVpayLnpGPkYyCin9/j4B6mpSMiX1/jIeQj4yKhpOYkYeUo4mRkYeQmZCTgYh8eWx9dnl4Ynt6cnBxc3hqgnVqg2djaGFuc45tYmlwYG9CXXlrVl5OUVFLSU1TWVZNXF5tV0VYYU9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUl09I5GXrJifl6ajoZ+no7evraKvsKmrucK6s62gua+rp7O6x8rIv7fBvq+0vrfEtsOysLqxssC2u763qrm4vaqktKaoqq+tuLComLi8o62+tLOhrre0pqansLOgnqSlp6GkmZ6sqKieoKqvp6Cml6Kon7C4n6Oxr6Groa2km6amqZqam56ilZybmZ2pppabnqiQl5KYnZOZlqGpkJqJjY+HfYd+go18e6GMjYh5hI2Fio2NhYmTmo6JlZ+IkJWCjJaNkX2Ee3NwfHFzdGB5eGpvcHFwan9zZHpsaGVkYmaHgGBbcmpxTU6AaVhaTVFMS0hQUlFITVxfb1RFWVpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MF1bNSiVm6WYnJWsn56hpKG3q7Cjs7SpqbrFtrKuoLitrqywtcXHwLa/wrmwtL23v7u+sKy+sLO/sr3Cuaq7urinqLWop6uvq7OvpZi7tqSrurWunrC4rqmlp6+ynKGkoKSkoZabr6ahn6Oor6GgopOjpKG3sKGmsKufq6Ovl5uqpaifmJqdo5Oam5mcpamZm5uklJSXlZyOk5eiqKGQiYqPhnqDfYOKeY6Xio2HeoKIhImNj4WPk5iMjpaZio6WfoWXjI96gHpwcXZub3RfeHdlbWxsamqEb2ZyaWtmaF5kdIFgW2t2aVpKf15cWE9PS0hIUlVHMzldXmxRRVlVWWVNSElFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFVdaEQuPDJkVywylKGhl5SbqpykoaKgt6quoLu4pay9xbOwrqO1sKysrrTDw7yzv7q3sbO5uLq4u6+uwLO0ubC/wLitvbq1paKyqaepsqqtsZ+Zv7Wkp7W1qJ2yvKinpamvrJmjp5ykpZSYobGlmZ+jqKmcop+SpJ+juKikp62mnaWhqJKfqKKhoZmbnJ+RmpuWn6Gpm5qYoJSQk5aZjZOTo6ekkImJjoZ5hHqEhXydjYmKh3qBhIeJiZKFlpOSi5CVk4yNlHuCl46Ld357bHRxbGxzYXd1aWlqZ2dvhmhoaWNmaWlgamNqaFxme2NgU3RUXFtTTEpHSU9TQCEqaF5qTURXVV5gS0lHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z1AnMp2ipJCNpKaanZ6do7Ssp6q6t6esxMG2sKyjtq6nrq63v7+8ssG3sK6ytra4trauqr2zrrKxvb+3rry7saSftqqlpbOoqq2dnMCqp6WvsqmstbueqKmrsaWYnqmdpqSRmaatopiepKmhm6Gclp+dp7Wmr6quoaGdnaGUoKafoaCam5mbkpick6Wcq6GXlpyUkoyVl4uPmJqon5GIiYqIeIV2gYKBnYeKgol9gIWIh4aQhJaUkI6QkZCRjJJ7g5WOhnN9fWZ4b2tqa2Z1c2tjZ2RkdoFjZWZmZmpqY2tzWl9aXW1kYU5pWFpgVkpHSEtNU1g+OV9saUhDVVRdW0lIRkZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQmhIJTWao6CPi6yhmJeglqSzsaKyvbahsca8urGxpLasqq6puby7uq3Asq6urrausrizqay5sa+us7a6trC4vaymnrWqoJ+vo6munKK/oLGjrrCut621nq2ura2imp2mqaWflZqnpZ+ZpaKonZqfm5ScnqyvpbqnrqKhmpqdmZ6kmqSdl56Xm5OYn5KolamnmpOampGLlZmNlJSaqKaOjYqJjnuBdIGBipiFh3yJiYWFioyKkoSUm5OSj5CRlo6Qf4CMjoJwgH5meW1oa2lmcXJrXGhjY3SBYmZnam5sZ2pqaG5dbGx0cGFUY2lkZVpJRkxNT1lRUFZhZYFVQVZTWVRGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyc0kaGbjY6wnpqToZmpsa+fub+1oLTCu726saa2r6itpbe4t7etu66sqqu2qrO4raaztbKuqbC2trGztbqmqZ+1qJ2dqKGorJqnvZiso66vtbWsrJ+xra+popucoquonJScpqSdmqqipJaan5yQm6Sqqqm7n6ekoJiZmZ2hj2uilpmccIKVmqN/dZGpp56UlJ6QiJeZgJaKoZB4hpSMg21pfnaDcWyGi4Z9hYyHcF5jYWeEmIVri4+UknR3i4R+g49/Z4aAZ3VoZVdcaHNuTlBqY2dzhWhfZWZubWpdYGGKj4SEZk5LRDlHVGdeSkdQUFVVTEhSYW90ZkZbUVVQRkhFQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4PUc2MDEuKi4qLzU2OCwjMScyMTQ6MTc1WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoujmYWVsJubkqCbqq2qo73Fr6m4wri9vK2ntrClq6O3s7KzsbmtqaastKavtaKpuLa2qKestrKutK2zoamfs6qeoaObpaaYq7mUpaWvs7etrqWpraqspaGenKCnppuXoKWlm5unp52Tn5+YkJ6nqaO1r6Oiop2Wl5eXo4igjpKZhqCHk5ygf6V/paqekpGakYiEcniNjoWIoXaIjGmXiGZ9cnigb4iHhH6OfX+hoKCZgHyHnnSHjnWbimyHgYNsaGVjemxxYVOFbWJsaZhxWGpxcIhZXmlbbGxbiHFuenKFZ4aEWl5HTj9HX01FUlZWUVFSV1VnXk1XSVJSUEZHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3MCiKppaDnKucmZidn6qqp6q/w6+xur23wL6qpbewqaylsrSur7O3qqmlsK2ltLOcrbW2taanqLOwrbKnrp2qoLKon6KimaGhmq2zk6OkpbW8pqynq6qsqKWhoJifpqOZmaWjpJicpKmWlKOck5OjpKaht6OkoKOYlZKXk5yIr5CXlImpi5ahm4WxgKOsnZOZnZR5gtSogIeVwZvHeXixpbeXZH/AnL95hIR5kYR8kJCRynGXvJzFenK1pruQe4BslrGrsHhoa1ixrm5labySvG5nem9yj9h+U2tjtrJ/gXKVdJqhqpBXT1diUFZORlVbWFFQUo1cV1xQQV1EUU5FR0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjKaSgKeqn5ecnaWssqixwr2ytb+1t77BqqezrKypp66zqa+2tKenpbSlp7ivnLOytqulpKexrq6wpqqdp6Swo6GfnZaanpytq5Oeop+zuqKqqaGtrqWhnZqaoaefl5unoJ+YnqenkZynmpSdoaahobCin5+jlpaSl5KZha9raoqNqn5mg5WGrWRwnJ2UmaWUca6hpH54u31roY92sV9qtFulgGWckWBmgntmf2p4a6lkvnJnpox1sWp8sXh0kpNjbW2nbluEoEVoZoeWRXWcYH5ofKSngllfi6tpgJV4eWqnN0qvXFhTbGRbS05YX1xXVjtOiVBXVy9JVFNKREVGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMwG5CilYKsqKWdo6Sqsbestb2/sLbEsre6waapsKuuqKmwrqOwuq+jpK2yo6i4qJ6zs7CjpaCqra+sr6ann6OisJuimpaVlpqaq6WVm6Ges7Ohq5yira2gnZqXoKGonJido5+cmaGmpI+dopmXoZ+qnqamn5qfoZWVkZaQmoW1m7V4hamZtZl2hrObt36TlpaolH5rgaZ7goaIkpSSd6tna7Fbq3qNhpR0iXKPhoB/iJCXeIKCi5iLg6CPhLB2d59xa2tsfItOpFhIYmKZfmNopmB5c3ZTkodeUKltY3F+h4BinC5RoW9bU2toYExLW2RYXFpCP7J5WFhBI01oRkNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o4YVU1MBuVn5WIs6amoK+pp7Ksqru2wrC7wq24tr+qrK2traatsamhrryqoKe0rKOrtaWmsrOnpKKdp6qyqLCnpZ6fn66Wn5iUlZWXnaygmZmkqLSuoamPqaiqm52VmKCkp5qenKKfm6CjpKOVm56XmZ2iqJulmZycoqCWk5GTk52D1ZOZuXCwwX7FhnzWlJu7fJqVpI+NnI2ke46Ho4KlgnqseY+dVq96iH6farlbuneHhH2mgpN8mHqpeI2dj3uxbo6EdJG8hW+UUK+nxYpRoHpjYKlic3OIbZeIYFO1tMiGgIl8Y6QzQp12XVBqaWRQQFhnWmRhSkhObk5cUk9ZZllDRD9FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6O0RIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFRNzElm6KUmbKoqKW0qqW0qaS8t8KwucCxtbS6s7WnsbCisLKmn622qJqnua2jr7Ggs7SwoaSen6epsKi0qKSbnZ2qlpiXlZeVlqCpnJmWp62wqKKfj6yiqJadlpuhpaGYoaGhoZqhoqabnqGelJmbpp+bp5Wbm5+gmJCRlJGdiLJuaLVxq4dujqZytHNytnual6OLj52No3+RoaV+sHaDkdLSdlyue4V/pG+bqqZrh4V9rX2XmY57sHKSnY54s2WWdISeb55mlFLIi1rCXJ95Yl+tYHZ0h2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPa2BsaFBVSEk5PVZSWldYSUM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTTYyMKGdkqWwraOqvK2mtKantru8srq/t7azubmypbSzobGxop+rsKSXprmtpLGwnLS4qqCmnaGppLGorKmkmZuZqJ6Vk5eYkpKhpp+WkqWqsKahlZOtn6WSk6CbpKaflZqlpqGaop+tmaCenZCVm6GdnKWUnZWZop6VmJWRm4Wse3eodqONiIapb62KgqeDmJigiZKaiqJ/k5mJroV/grNccrNSrn2CgqR/cth+eIZ+j52GmZl2r4aJkZyHd7RhmmWagoKUbJJasFhLmnWYeWZgrV52d4domIhrXa93lZ6PeGw1eciusl9CVG9eZ2BFUG1fcG1WVk4uZWRpU1hRO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEk6OTmfnpSgubCWtMKtqLOoqbK6t7O4vrm3sbS7taS4sp60rJ+eqKyflKe1q6ixsauttKSbqaCfqKG1pqapopmdlKShk5KbmJGUoqSako+mra+moJWZqZ+ijpGhmqikoJWZpaidnKSerJyhnaCNk56anaCYmZuWl6Ggk5eQpp6GqX19pXihjo2CqnCti4GnhpafoImXl4ijgpGIlKp8gIudeG+xWqiCgoigeXTZgHeIdKiBjpuNkqR8lpCfhHuyXpxkoH6DlWySXKtbWpOAkX9oZ6pkcnuBa5iHc12sWomgjmtvZU9KQ6FcW0x0XWJnTVthX3JzX0tWNkqblFhHRT1HRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMj84op6amr+rmLTCrqutqaW0sLextb65ubKwtrqou7SfsKSepKennpOqsKmvqbWsqq+hmKGgpqSkuaKjq6CWm5Chn5STnpmTl56fj4yLqLCvpp2Wm6imn4ySo5eoqqaUlqmnnp6go62joZ6ijZShmJ+fkp6XnJWdoZWWjqucj65tcrRzqYt1iqdztHhzs4CRpKOSnI2JpIeQd7hvjHuLomprtlqhhWWXl2mgoqdulHK0dJOYf7JqhZKIrWt1s2GdZqJvh5Nql1ytX02hfIeRUnOjbHl/fm+Yh3Fcr1Y8nHdmVG9uLlynT2NTa2VibVpjXWFwe2NUWlE+Pm1vM0NCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKabm527oZuywK6tq6ynt6m4r7XAtLuvrre2q8C1qKmgm6WkoZyRqqmntaOyp66qoJecp6Ckq7mdo62blpmOpKKVjJ2gm5icnpGSlKq2sKeYlJysqZeMk6WZpayikZaqsqOfnqarsJmho5CZopagm5acl6GSnKmclJCrmYfUkpq7c7DDgMOGftWWm7h4iJCYjJeKjKeIeqO2dX13dsKCmrJgg7p5wHx1uGO1gYyHqX2VgaypcXt/dLyIp6BpnWGmjq+ifox0h6p9vm9zvHSyg3V4gYtumohxbo2kdL1ed31aYXm8a1pWXGp5XmphZWdibXhvWVtZREFAc0BDRis1RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnmp6ivKGXssOwrKqrq7GnuK+2xLC5sK25rq3Asaujop6joZubkKmjqrKktaatpZ6WmqqZpqy5naOtmJSgkKWfkoycop2YnZqRlZKuubKslZejp6eUkJaknKSsnpCgqKufm5+oo7Ofo6WOp6GUopqcl5Wjl4+voJKUqZ6EkJi2f4+RjLeVeIKTmrV3bWtuc295kIWPinSewbu9mnuBsahwgHORuYN8hoaMh418ioeNl3yku7m9nHV6tKN0dpd2dLB1mZ5mhmqNtXRycXe2jF5/en2JaIN5bnlii6xwdYV/WFunakVlWlRmYGNeY1FoZ3FtdUJOUE1EO1pNP0ozOzAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVzgqT15dPSs6VlYnPjs8p56gor+llrTDtKyrqKyrqbqusMWutLKttqa0uKypoaGlnqCdmZOrpK2qprWnp5+blqCjnaykvqahqpaTnJChmpGPoaehk5yXk5eUsbW3rZidpKSiipKSpZulqpuWqKWlnJqhqKWnpKmhkq2elqOel5eXnZ6Pr6iUm6ahjWp9aZumeIdyfZmOdHlkh3u9vsC6b5ODcpWHYXNqWl6biWFjiI6Va2CAlWNtnXdilWuAmpWUZV5gY3Caimhyi32FlWdqfnJ0eH1+Ylt3dIFoUFxug318i2tYbHqCckpKb4ZwTnRMRVddZ2FMWlhnY19PW251aXJSUERFTjtIST1NPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBfTCgzPltPJz8yPqmgqKLBopu1urWjrKWup6e1sazIq6+yqrSivbGxpqCiqJyim5mZrKavpKS1qaWbl5Whm6atqL6nqKWUk5uVn5mSl6SoqJCdkZCYnK+yv6ybp56nooiTkamaqKOamqygo5qbo6eso6Cro5qxm5SnoJaUnZ+dl7Cll6GnmZuQnJyio5iloZmbmZmZj5WBZ219cXeSl5SShYu1qo2GmJWOioyYloeUlYqEk5SRiY6SlJiTmJaaoKGanJSgnY2CeqWGbGp8kHyAdYqKgXGCeHl2doqAfIpqc4F1g3Vld313a296bWBjXXBoTVhaZmpgV1pwem5tZlRPRlM5T1pNUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCzobOiwKGksrK3oKqmsqelsLSqyKqssKS0pcCns6CdpKSco5WVoKqnrKOjtqufmZaWn5etqqXBnqujlZGbl52XkpOhnp2hp5OSmainssSvmqudqp+Ql5annaqbnJ+tmaGbnaKkr6eipaifrpiXp5yZmqCenZyvoJyhppWXkpeTn6CVop2XoI6Wk4qKjY6XrpB8lpuDkoKLqqmFgJmXiYOPnoh6hJCHhpqSiIaKlY+bl42RmJ2jlpqTkZ2Nf45mobOvhYqEdnuSin12eXpvZnmQgYCJa3WBeYhyaXN/e3aDhoJrdWR5ZmBqZWNkZmtZbHtwaWpcU0xQRF5URkA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0W0c1PCxAtKC6r7+tq66ysqCrprGtoqyzr8Svqquisq28o7Obn6aioZyZl6ilqaakpbK0npWUnZmZsKWuvqCsopCRnZmZlJGUoZyXqJyEn6qrorPIs5+qpKqWlpeapp2omp6jq5Sen56gqa+qpqSsoq6bn6CgmKSenJ+cr6OYnqeSl5ackaOYl6ecmpdlgpJ8ZX6NmpBjeY5taWt7kqSqamSal31nhoplZWloe46hj2xojJeRo3draouZo56Zc2xueoONh3pYZV6Ggl5ti4mBdlxoc3d3koCHgm53gnh/c215hHR2iIiOg3xqh1lebHVkXnOJaWt8cWtjXlJOWElkWEFKND5HNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMllDOz8uPaWfury6r6y0saqlqK2tsKatrbC8sKmmo62usJ6slqCjnaKZmaaqnK2jpaipsq2elaOPoq+ltrmlraOOjpqhmZOSmp+ZmaSVe6Wtoqi0xLiloqevnp2UnqKeo5uiqamSnqGeoKqwq6ykq6Cqm6efp6CrlaGbpbCkl5uqlaCcmpGjlp2pl519vYOIcrRyhJ2GrWh4ucS4cZOio3qlmZhzq4J8y8DAu3GMooiDn32WmImdwL2Cl52djZ3CwXyCe5KNmsPAfWulsm6MgW/Ken+bd5GDjoF2eYGAeXF6f4dwd4WMk3lueJRjZl95ZGBlgmNedGhsZGNYTFdJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLiNGWzNQWS9WQUI7LziWo7nDtbCwwKmolKOvqbCuraaztK+ppaWmsKufq5iaop+cmqqnop2soqWopKS0pJ2ikqatq7ezp66ikZGZnKWSkJ+gmJufnIemrKSrrcDAsaCpr6mXkZ6doZmho6qkk6Chnp6tr6qtp6Skp6GmpZ2tqJGkmqitqZqcqZuroJWVpJWgopacfs6UeHqkgXmVlptfro9ejqeBoqB8p5abc6uDgK9eY42qe6eHhaB1l5OIs2OCq4ahjY2zaoSudH2XiLdhg61Zo81tkHV72nt/mXB+iJJ2fmV7h3Z2a3yIbn2FkJF/bYOQYXJscGhgYHlkXHFoamRnYFJUU1ddS09DNUFIREQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSzAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGjqqits6umsqysqqKqp6+poKebmaSXnKKvn6CeqKejpaGfsKyanZWnrqywqqisn5SSm5+kko+epJedp6OerqWrsKi/x7OoqbGulpKdm6KXn6mqn5Wgn52drbCorKqcqKikoquSrLKWpaKqqp2jpqShr5+RmKaYn5mTk5GXoHGFjJd1haiGcbF9nnKsfqGegaWPnneqgn2tf5xzrX6qhoafdpiSe3yXfqqIooyRjJ1+q3qIlJCfgHutVpzEeo9vksF9gZVtdW+MbWV2ZYZvYXducm+JipKPhG6SkWZwdXVxYWdtZV9vaWluZ2RYU11hWlJTQzlJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DTxsaytKCdo46jo6Ksr7auqLCmqKqmraurpqGknZmhlaClq5+ipaCoqKKenbCsl5qWqaeurKinqJ6XlJqjoZGToKybnaair6ykrLWquc2yraatrJeVnJ2imJ6trJ2XoJmenqmyqquqnKyrpKOsm6+xoqirrqWYpaqoqbChkZWipJmTkYSkaqR1iXqpdHqycIKmipmMcYigmoekYGBSq4R/roObdq2Bp4aGn3qZl4Z7ZoCjiaSZhoKjfal+gpWHrl99qVWdopKBeqKfgHvDr8WLcq+zs7lxYqmvwnRojIyYjoJtm5Vxbnp4eXBtZ2VlcnBmfGljXVdgalhZVUxMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfDydXVv6GZq6egr6KesLSwrqmsoqemqKqrqaSmn5uknp2mp6ejnKyaoqyho5+vopybk6ukta+uoKianZaUpqKQmqKon6ClnLCmpKixrLbIsrWqq6mWkZ2coZifpLOdmqGUnZ6nrKylr5utqqOiqqGzraGqs7Chmqinrq60opKVoqaYmpF7qmyehId1q3l8sG+CpIuJn5aWn5SB0ri0uMmAgbJfYJSpg6SIh6B6mJaaeKrJdJmjlaipkZOajICciZrGx3hmoYKlc4GfjoJ9r11wtGKwdUujhm2nR4KTZI6QnpJ8cZiVgXF8dX58blxmanNxZoFrXmFZZG1cX1lJTkxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqLKtrKWinLK4rKqgpZqopaqrqaafpqaYqqOfrqudpqCsmp6ppZ2ntZ+il5OpqrayrZulnKCUj6WskZmcp6KgqaauoaSnqbC1w7Kyqayok4mXnKWaoaOupZehlZmcpaasm7Cerqmnnqyjt6yhsbivnZquprKysqOTlqaimZ6Ogp1OeJqBf596hKN9g6SEh6aenJ6ThLh7e3m5gn/MxsK2eJuhkIuffpqWl4p2npiKpZikqH+whZyFn4SsfZqUYqVspHCPhJCBfZaCcqxgo3NxgJpgvH1SVXSOkqOWe36Tk4x2fHOGgHFcbm54cmqBb1tkX2luYmReTExRVEFJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA4ODIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu5qq+gm6GssrOlnqCVpa6trqunnKammqOnobOvoqmnsqCYqaSUorWiopWXoam0uKSbop2jko+hsZiem6akoaKvrpylqKK2ssSxramtqZGHkJynnKKknKWXnpmZmqakqpuwoq+lppivpLusoba2rZ2ctLG3sLGll5yun6KdhY/RtcO3eYeOhZGTkICmeJShd4ygkYSlgYpxqoaFtG5yapmjnJWKnnyYmYaHj3OvgqWboo2mi5OdipWQm21wsl2lc5N6m2uZf3uZfG2pYaNxcX+fYnOyuGh3j5SmmH2NjpWNeX55kINuanlpeXJvgHVeZWVvbWZnYEpbWFg8SEhAVTRARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWTc42Krb+/vLq0npanpa21oaKZlaOopq6rrJmmop+moKC2p6Opp7GjlKyjjqSto52Qmpqqs7OknKScqZGUl62fn52mo5ynnLWZoqqktqvDsKmqqaGMhI6boqCmo5WampyZm5mnpaeZraivo6Wbraa9rJS9sKyeoa+yuaqypZqosKKml3mokH18sHeKgKSliJxtsm+gh618oY+Dp5WYgKyJha6Fn5SqoKGXhp+AmZWAe5J+q4CdmpaLq3idn5GJlJKAea9eo4F9pqdjnYB8l3Nqr12la3CFmV1gW4ygbZWRppmDlY6ZjXx8hJiAa25/Y390boB6YGdlcW5oZ2hDWmFbPktVM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaWFNQT05JODA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNUVldXWFZVVVFIRklKIygovZOag6nGwrbBtJ+arKCtuKWjjpuko5+wsKqfpJ+drZmfuaCjq6CvqZquoZCrqKSWiZqQrrCspp6mm6yXl4+soaCdpaGZpJyumKGoprapwK+lqaOei4CNm5qfpp6SlZqblJuapqWlm6qsraSln6qovqSWwqupoqCrsripraWfsq2nqJd2r36Qi5yFh326rYqZZbGNZZWtfaCPg6aVmoGsioSwhaaapKGhkIWgW2xqgbNgf617e4OBsW1nb5mYjIixW320XKSDa8iiZJ+Ae7xYdrVZsn1SroB6rFiAoW2Yj6ebjJeRmJh8epCef2V1f2OFeHSAfGFqZ3FtZ2VmT1ZkXEFVXz5JKD46PTQhIiwlHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFFSVFdaXmBgYGFiXl9cW1hVUE5KRkM1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7G3vbqzwbOjnKympLaooIqaoJ+cs7Spn6OgnrWZoLSoqqyer62erJuVr6mijoibjq+sqKehppmukpiPqJmhnaSfmaOjppmgoqmyqb2vpaienY99jJuWoKCZkJKanJKamKmgopqprqimpqKlqbueoMampKigqrS0q62lnrqsq6uUgKmSo6+Om3+HpJeZkIKAuMO6g46ckoSnl5yCrIqCr4innJumqpB+1b3CqmKjv719fqOCg9e6uLWFlJODnr2+hGuigW+rhGycf3qysMeDaauwvax4d6K+vHOAlo6mnJGbkZmee4KSnHtkfnxljmd5gnthbGVramNQYVtTalw/VWJDTik9OjQvHx8kHyUyIB0kKDA0OTY2Nzg6PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PUE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbOzsb+5sr2yoZyupqWypp2MmKW/qriyqKK/p6eynJ6xnLqon62vpqeUlLCsl4yDm5GupaKsoKOcqqCXiqKSpp2nnJqhqKKZn6Gsram5raijmpeTfIeZkaaako+RmJiPmJSpm6GZqqmhqqego6q7najFoqCuo6mzs6muqJ+5pq2tmXN1qqS3hmSJoHBorpGKkG5ud6SQmZ+Bda6YlHCPi3GVqKObl66kcm1sbGaLeG9ugplxgXpqcWlniZaWmHFpaYSHZnCGZF2IYmpvWVxmfXamX2FxjpFuZWV/jZOPoZiZmZKYoX6IkJZ3Z4h4aY5ren95ZWxjZmxiS2RYSmxaOlBlRVInSzorIxwgGyIsKRgbGC0yLjU6NDU3OTw/QUJERUhLTE1PUVNWXFdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWVxeXl1cXFxdXl1eXVtbVVdeqZSss6m5uLKzqqmhrp6jsqmXkr6yxMm+t6qfwKytpKGnrKC6o6SurK6njpeuqY+LhZaXrZ2mqqCdo6OgkYukkqaZqJmWo6qglp2mpqewuqusmpuTknuElo2lmI2RkZmUjpiWqJWgmKmjm7GmnaKruZ+vwaejsqWrr7CprKqmtqKstpWKoKiltp2JlqOZh6qbkZWdkqmymZqjqqCylqKhnZ+inKGloZWrp42SkoyHk5yclJCZk5mRjpWFgaSal5aOi5OTi4+GhH1niX50gnVzhopwp2x6lJGTkoGBjY+Qj5yUoZaamKODiZaPc2qRd3GMeHd8emptZGNvZFVhWUBqXEhjYU9ZK0Y9KychNzUwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhVVlleYGFjXV5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaW1xcXl9fYF5eXl9fYGBgX1lZYKaWqKqltLaurqGvo62foLWxkI6sx77Gu7mro6WenKafsamkt6edqbWnqJGYraKLh4mPnKeVrKSfmKeenpKUo5anmqiZlKahpJCbp5mhtruoq5makIx8gZSLoZSKlZGWkJCUmKaQn5uqn5y2o56nq7enrsGto7alrq+vq6iosregrbuYkaWkpraikp6noI6qoI6Sn6Osr5qgo6+or5ijoJyjqp2enZyWq52TmaGblJCWqpmNmJmXkJaekYignZWVhZKMkI2UioB9ZouFdYZ1eIeCc5xqhY+Uk5CJfIuVkpKXlKKTnpijhYqaiXxzl3N6i4BzfH9qb2RecGpgW2BZbmRQYGVQWjpHR0U+Mj0+OS8qJispJh0mNDE2NjY4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOjlFTVZbXl5bWlxbW1tcXV1fX11eX2BhYWJhYWFgYmJiZGJcW2OXlaOno6+yrK6jqaatn6e1qpCQnaW1vLCtraKjmnueo7KkpbGpl5u5pqOTmaqcjoaKiZyij66eopWon6CSlpiarYuplo+omamNmamPnrq2pKWZm42IeYGUjJqTipWSlJGNkpejjZ6fqZ6fuKOAhK+1oq+vdKO9o7Gfd3mfqbC5lHWso56JgKp/ZFxidqCPpZ+El31tkrOco6etqqJlnp+Sc3mZl3CAmKiXbX+iqIplnKWckZeYloySnJGGnZqPlYOSh46OkomEd2qOhnaGcHuFf39gaIeKlJKLWnWUkGdokI9ze6ebm2Z6momEeZlqhIuEb3mAa3JlX3ZwbGtoW2dmYmJwU1w+Tk5OU0c+QFVEOTEvHh8mNDozMDY2Nzg8Oz5AQUFGSEJHRklLTVNUVVldYGhmZ1dRSjxERzw4VVJbYGFiYF5fX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5Wmo6CusKyrqaWorqKmraSSlqu2sbKnm6unrJd0jJ2wn6irp5SXuaCgj5yknZF/iYibno2smqKUp6GdjpaRnoR1rY+IppupkZekiZy7tKegmZiLiXR3k42Wk4qTkZGUjZCUoI+boaeZnLKWgIybtZyzjJKOu6agfqeieqGttYCOjaWeg4uGkLGqr4yKl6SbeoCLrIacnaGnqKeHlYWYd6WbeoebgZingoJ7nLJ6ioagl5mUmJaCkZeXhJqZYnmHkISNj5GKg21wjoZ5gHB/gIR+hXOFhJWReJZnknSgmnV9mYSin4iYf5SMhYWaa46Nhmx4e3FxZ2R4b2psa1tlbGpldFxeSVRMUkBFNS5aVVU3KSEwOT0+NzQzNTY4Ozo9Pj5AREk/SUVKS0dTWFtZW2FhaGZZUUg5RUw8PmJWXmJkZmRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyYo5+mrK2rqKyfqLCmpqmlmZSvyL+xopeoqbWekISdrJynoqCNkL6emo2fmqCQfIaPmZiIrJyilZ+hkYySiYaAkaeNh6KdpJSYnoefurKnnZuSjoVwdZCJlZCKlJCPm4yQkp+Sl6Gllp6rh5+0ibSarYrKh6mtiLeFjbCBr6yCqIymmI2dfaiPcnt3nI+nl2iVpHm0jJ+epqeSmMKBf6uImKFynoCapX2XhZWygaF9oZOgkJiXgY6Tm4qYkYt8hZOGjZWSiYNtco+FfnlxhoCDe4N0hICWgI/FZn+ph4+ja56Eo5yEmoGOj4eLmnGPk4Vod3R8eGhodnFoaGxeZHBtZ21YZ0ddUk0yRDQ2TmJkNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05JSkxDUFpdXFdhXmlsXFFFPUxNQEpkWF1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUlqKgsKeoqKWrn6O3sKmqppqUoKOkq6SXpqu4o7CAoaidpZ6diZS8mpSNoZKej3mElpaRiKuZm5uZooWOi3eanI+fkIiepZyWmpiHo7mtpJqcjIx+Ym2Pi5OQjZCNjZiMkZKgj5ShoZmhp36hp4etnaCWrY+enJ2RhYCgjKqthaONqZmMmn+jdYCZlGuCrXZNq3iHjZyRmqingKmrfYOhe3qnaZ5/kmtnl4WXt4mefm5gZFmDl3+Me2Roi3KZfXmVbF18lm1fU3CDXF9reIJfWGSBfIN/l3CnqmuDo25ypXCfhaBqZqBtW2+MfWdaYISAYldQb3dmbXRza2pvXmtxbWtpWGlPXlhGOUE0SERfazQsSUNSTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl5idWBNRDpNT05UYlxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5WdoLigqaOmrJGgtrurraKZmKGipa2uoZ6vtaOok6GgoKecmo6ZtJqQi5+MlYt1gZSSjYqnlpWYnp9/koWFq6SHmpCKmamZmpuSiKaxp6GVmoiJgGluiIiLjo6Ki42SjJCSo4yUn6CcoaR/k4GPo6GUoHeclY+ng6Gmf4aoq4OleIl8hJp+onBzlIiWfJ+NeW2Hm4yZj5uomo+HnXuConN2pmaefnekX5h6fZN0om6Yt7S6dJOHgn+1qGSBxrh7cJW2jHF/mqRic6yrYHxpnbN+bXyGgY2Ci5hxf6NscqN0n4WBpGCdmbOWcX2Yn7N1c1uesoNqY290dnFob1hrbXNyZlxpXmNMRD1ENlFCWnIzPVNHX0pSPTwzOTU6OjZEOztASlA/VU1OUUBFX15bWlhgYHxkSEM4TFdVV2NgWmVma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJOWlKO3maubk6CNpLe0ra2gmqKdpKOmrp2csq6sk5ihmaGkmZqUn6ubi4iSeIuFcYCWjoqQoY+SlJ2YfZCJjaegh5eOiZKjlJybjYupqKWej5eHhH5qe4d/fZCNg4uQkYmQlKCDl56gnaCei4l3nJiijJ9yoYuHqYibpY+Vpql9rYx+eqCZeqOTeIF0loiNnH2Wn4abjpibpYaiZKF8iJaQm41snmiajW6amXqAi6d9cmh0q4Oeg3SqaJWaXZuFdoSdZ6pqgLhmXKhwgZxglYxep3Z1h4h+nmiadIWTkpeOgJ9vmpFup5pdqH54u2t+qlyOhF20Z1xucnp4a2lccWt5eWNfZlhiQlFGTzdXQ1JvNUtbWl9PWkRAMTUxOzs2SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5bXlllZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FgZGVla2VjaWhna2mVm4mptZuniGOUmqu5sa+snqacnKmgn6+cnrGprZ2XpJuhoJmWlqGkmYaJjWqIgHJ7l4iLlpaEkZWYkHqKg5WjnIqUj4aMnpKdnYmQqaOgmoyRioCAaYCHeX+XjHuJjo6Ij5abf5Sin6Chk5hyaJ+Kn4+McJKMgamHmJ6hpZ6me7Cto6K4l3ejs6KkgIiUeZ17qpp/oo6cmpaIl3GhfIWNr7V9a5qRoXh+mLSio6uohJl8m32dmn90qlpdb3uWi3ieYkx+e3qFY3mXQkyfWKJqcXuObICIhJl1m3iGibGzf4Cbk6d3g51uc32VcJp0a6RdlXZIZWRgdHF+fm5mYGxpdntkZGFRX1ddVVdAWUZRaERTV1xiWF5JRD1COD9COklGOExFWEFXUltWREZiXFpgS2BtfnJFQzxVX2JaZmpWZ2htb2JmZ15hYVxdXmFoYl9lY3ZtXWVnZmtkZmxpaGtpk5yAsK2ZhFNeoKazubKyqZqijJysnJyqlKKspKKoj6CenZuZlpihnZaIh4l3hoFveZWFkZuLfJGTlohygIiSoJtzkZCBiZqVoZuFj6mcm5WLi4p8g2yEhnGBoYx4ho2IiJOZlnyTo6Ceooithn21hI6enHullnqpgZWbj4mfm3ynaHdtfpl0oXNxfJ6GmXCTg659pIOmnZmApG9eqGd1omNvpWGc05B8e5l4cnNjooaQfqNzpI91a5CzjGCCmIlzqrKnvH93g21+vqaptF2bbnxwlm1/cqJyXaRnc6ZgaKZtm9SafYabcHp7mGycfHiXc26ppGdgZXpxgIRrZ2Zkb3V3Z2BjU1xmUVFiSVdKVGFXU1tlaltlUUZDS01KS0JLRThPQFFOWFNZT1NRYWVlalJjd3l3SUZFY11lWmhqVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJeagLCrVFxLfqmvsbSvs6ObmYWZqaChpI6lqaCZqoqamJiTmZOSoZiPiIZ7cH2EaH2Pg5SagXeQjY+Jb3+Fj5KSbJeTfImSk6WWg4+qm5SSi4WJeYN2iIBugp+Gd4CThoiZopd6lKOkmp+Js6Gitot6rKekrqVwqYCajoWAmpB7pIChmYaYcp6Eo66vipeMgI2kjZWDraCUdrS1tcmhc5SLgZ9gnZepbXmVh6CbdKKHd6B+kpeLgW9MZqOScJuHc6R7enRhg4FrfqBrcWRfnHF9c5ZoeWmztbTGpnOYfXqda5ybq3aFm212eJhqmnt1mHJQRX20X2p2a3mHZmpnY3V1cG5WXlRZaVBSaElWTVlUVl1oa25WZ1dOS0FKTUtISk9BUUtQZWNqbWV0c3N+eXxudYl7e1RQT2xeaVxraVJqaGlsZ2xmY2VgXF1dXmliZGlre19dZGhjamZubWVpbGWhm4iupoRlP5Ohsqqur7WiopCAl6qio6WMpaeenaaDm5eWjpeQj5yTjoiDemp5h2WDjX+YoHl1j4iMgWmEhZGDjIWdjXqNi5amk4OYqZiNkYuBiHp/fYt5cJChhnqBlYeJlqCWf5SlqJyWloRmbnicbKJkfHGld5uYcGemgJWKeqR6n5aDl3KedoGKlZePuW6RiqJifZmglYhtcmmqa3WgbW+mX5ppi5BploeblXSigH2aYIyGjXVviGJooGWefmmbdW9jZoiCbXGiWl9bYqFtXYiLbnp9c3JkpW14omRnp2iZc4yZcKJvVYmQb6BfZqhUi15UmG5tc2tygm1waWx5c2tvUllXV2daU21JWU9dSVhpaXNqWWtWUVJFVlxMWFNhVWlrX3d0e31wfXxyg3uAc3aNgIR2XlFyYmdjcGdQamhoa2xuaGRnX11eXWBqY2ppdnVdXGNpY2pqc21ma21jnKSYpXpkdG2Lp66jqbCxpp+MgJirnZ+mjKOim6OigZaYk46akIuYkI6Ke4ZxgIhoi4t8mJxzdIl9kHxkgoeUiYmVmYJ8iIeXqJGBoqyRhpCKgop+gICPc2mQpoR9hpSNiZmgj4iTqaadiKZ4lZt+pYiWjLKYnpCCr5efpXaUhnipc6WPhJpupKKMkoSNg7tufaWvg4aFhpOVnJ98pXpyqJWglmaefm+sY5WKlpN3qWypooGJdoiDd6qRpodqkbBrdrOMqWuKhm1tn56SlWB+q4uqdn5+i6Wedp98g6SVnaBqm4h4rGierYy2dHe+jaSTWYOmjathdXJ0cXx1cWNrf29obFNXW1ZhYl1rTV1SXUpebW53X1txWVxgW2Z0ZW5vcmJxdGB3en55cnmDc4N/gXt7jIGCgHZieGRjbnJkUmtnaG9scmpmaWFgXlxia2JtbHpvXFxiaWJsanhtZ2xuYpWlqpyAf52jlqmqnaimrqSZioKYrJqfpYqbpZ2pnYWMmo+HnJGFko2MjXSGeoiEcI2FfpiUdHSFcpKDbX+LkYeGk459e4KGmaaOf6amjoGOiYWUdoKHk29si6mBg4yUjomdn4qMlKujoI+AdZSXiH6BeZSuo3+Bm3GPhneOiYJ9e3KnjHF9fXqYlpuEj3l7f36Hk5WTinaQmJ6gg3t9iWuMhVt5eXJ6cWlufpKJcYB1gY+Uk3GGhIJljH9egH+Ld3RylHVueW5thmyEhV51Z3eOZYCAhY2omn10e5VqiYhwgXZ9h3dubWeMc3l8mHiFXGtYeY9pbnhycm94eHBda4duamdWW2BXXGZrZFZiVV9RX3B4eWxrdmZqa2t2fXFydXNhb3VidHuBeHV6g3V/gH+AeIqFg317bX9sZHluXlduZ2h1a3hqaWplXGBaY2plbXF0bltbYmxkbGx5bmhsb2GNlLiopomgopqmpJilnKuioYSEmK2SnqGJm6eaqZiDgZuLf5aUh46KiY1yg3yPfX6PhXuYj3Ryg3CVhXt8kouGho+FeX6Ah5qljnynoYuGkJCFlYOGjph3coSqho2SnZCJn56IjJuon6Cqg4iOlZp+fomWraiPkaaPd2+bj4F4kG5+qIVwfZVxa3B9gaCNgJOOjGhtXYOLi5uano5zlYuIcXRrgXZ0gVlyboaRgX5+jGpdamR7hYSJgGBpd3qae4KKgXWBhYJnd4mFamFwcYF1XnGKgIiOpZSFZYuNg253i4RxhpB6cWdoZXyEepZbXGpnbnZbe3l4dW5zc4JnXG2La2tiWlpfWllscVxfYVpfXWZ0fnt1cHRja2trfH1zfHh1ZG11aG18fnZ6fHt5eoCAfm+GioR7fXN+eXN/aFRccWlsdW91Z2toZF1hWGtobGtxcm1XW2VubGdzem9oam1gi4uqsKCPoqGanp2Xnpioo6J+g5mujqCViJyikaWVf3uYhX2SmYmJhoeKc32BjHaFi4KFl4pxb4BymIaDfZKDhIaKgXqBhYycoZGDpqKIeI6XiZWKi5yYhIN6rYKRl5qVip6diIihq5+hoqOLh5ObnKOZlqqhp6afkpqGlIx6do2Ng6d+f5KQk5ScsqablZ+QjbKTl4OljIyVmp+JkJuCiJGKa3yOd3hlgoaQi3yJnYSHi5CIiICEhJB3fHl0maCIhomdiYSTfn2Kf391b3KEgX13hoaKj6WQgoWMhoKMkIx9h4yKkYR5bYOFfXqZa3JoYXSKcX56d3dwd3SBXV5vh2huX15aXV1UaHJWZFxcYmxodXt8c29wZGtraYB8bnmAcmpwcGxngXtygoB4f31/hHttgo2GfHl4e316g3hOZHZqcm1wemVrZWNiYFt0ZnBmcnFtVV1sdG1peXpxZ2lrZIyHnLmelqKgmJSYmJSYpKCefH+arI+fjoagnYueln14lIN7jpmJhoOEh255gYBygYh+iZSEbWt+epeHhIOQf4CGhIZ9h4WOnJ6Th6ufhHKLkIaSkYudkn2Oe6qEjpOYlo+cloeGm6WfopqdhYKSmpmZkJqmn6WdnY+Vf4+IdXuGjYOkenyOkJGGmKuhnpSdkI6qjZB/nYyIk5mego6XfoaOg293hnF1YH6Dj4Z1jJiAg4+ChoR+hYSUbnh1dJGhiouFmoOEjHN/iHt8cnF6h4J6d4qNg5GmjoWDjoCDiomKd4aJiox+cGx/gnxuaGxtaF96f2l9fHZ1dnV7d1xfcH5udWBjW11eUmduVGVbXmJraXZ6fnFsbWRrameBgGxzgWxsdW95cIV5boeAdoKAfoV2cYKNiH57enx/e4KKYGl8anVoaYJkamNgaVxjdWhvYnVtbFVjcXllcHp7c2VqbW2KiZ63mqGjn5GRlZeLmp6fnnt4n6eRnIuHpZSLmJl5eo2FfImRg42CgoNufH95c4GFfouRfWpofYKYiYGIjnx9hoSGfY+CkJydkomonYBwjIuMkoegoYqFjH2okYmQkpeTlpN4jKOgoJ2WmX+AkJqYkoybo6GkmZeRmn2Mg3d/go6Gn39+jIyPfJiloaKTmpGQpoyPgZqRiZKXm36Tkn6HjoF0dIJwd2F9gI2GcYuVfIiMcYx/goWGjmh3cXiLl5GPf5Z9h4pxgYZ6fHB3eoqDeXmPi4KUpZKLhI96hoaHhXaChImJfGdzfYB5e3Fsa2dffnNofHV2dH1zgGpeYHR2cHdkY1lfXlJraVVlWV9haGp2eYFxZ2tkbWhmgIFrbn1ob3FsfniHemyMgXOBgX6BdHaCjYZ/fHp/gX1/j2lyg25zaWGHaGxiX3FWdG9tbWB4aG1XanR2Y3V6e3Jiam96iIyespKlpZyOj5ePhpygm518dqWhjpiAjaOLiJqWeXuGh36Din+JgoF/cn97dHaDhX6KkXhnY32Gl4qBiox4fYCNg3mXgpaZl42XoJx+cIyCkZSGppuIjImDppWFk4uWl5OSd5GdoKGXk5Z5f46Yl46WmpyknZiSlJp4joSCd4OVjZx9gYmNjHOXo5+ik5mPj6KMi4OWmIOSlpl+mIx8iI2AdnF9bntkgHyKhXCHk3+RgmyHgoGAiYRldW57hZGXi3ySd4uIe3+Fe3pxfXeIhHiDj4iKl6GUgYKKdoiEgoJ3fIOKhnhhenl+dH94Z21lYX9qandzdHV9cXxiY2B0bnVybWFaYV5bbGVSY1lgYWhrdnmGcWJqY21laH2DbGh0aG5waYB9gnltkIZxgISDf3R8g4yBgH16goN+fI9tdol0dG1limxqYmJ2VoRpcG5geGdsYmp2cGZ5fHpxYHJshoWPnK6XpqiejYyXh4afk5eZfniqnYuZepedi4uYkHl8gYt9fIR8gYOBeHR5enN9gISAiYuAZF99i5WHfoSGdH1+in99mYWXlZiNpKKZf3OHe5OSiqaPjI6Kk6GSg5GQlZeRi4GPl5+ako+Qc3+NkpSJnZ2eppeXjJSVcouNiWuEl4+YeoeIj4lvl52apJSVi4yejIaCkpx/kpKVh5mIfIqJgXpxeWt1bHt+i35thZKClHhwgYN9fop/ZHFpe3+Wl4R+jHOPh4J4hXx1d398hH97gouDi5Kjj3iDgXSJh32AdHaCiYVwYXx2enF9b2JvY2R8Y25vdnN4d3N0YXZgb2x1bW9cXF9eXmpeUF1ZY2FobnR7iGtgaWZqY2l3iG5mbGlqbWiBfXt3b5CIc4CEhH10gYaJe4N9eoGEfXyOcnqLeHhubIdqaF9pcmOHZ3FvZXdnbmxheWlrfXt4cGF4bYuAmJmqoKOonYqKkYaKnYuVmH54r5mNl32flJGWk4h3fnuKfHuAd3iAgHB1dHxvhn2BgYp/fGFcfo+Shn+Dg3N6gId6j5KJk5Kdk6adlYJ9gX2NipKkiY6KjZibjYaRmJSWj4qIjJKcko+LjG2Dj4+RiZ6ZoqGXlYiWkG2HmINmhZiOk3qIhJCKcJaalKOTkomLmYyCf5CdfZKPkoyZjnuKhYdzcnVrcG51fIp0boaQjpJxdYB7gYGHe2RwbHl8mZN9g4hzkImAc4d4bn98f4V7hIuHg4uUp4x6h3t9i4V3fnFwgYaEZWh5dXVwfGJfcGFrdF5xant5eWxzcGV4XW5sc21yWFpfX2FrWlBXWGVjZ3Fxf4dmXWppZ2JncY1vZGlnZWlogXp3dW+OhXSBgoN7dYKJhXiFfHiEhXp/iXd/i3t7cniDamtgcGh0gGtyb21yZ29sZXxjboB6d3Fsd3eKfqKXoaigppuHjIqBkJyHk512gquVk46HoY2Wk49/dHx2hXh5f3Nze4Zrc3B6bYp2gIGIb3FbWX6RjYeAf392dYCAgKCGkYuTnZihlZh4in+AjImcnYqPhpKYloWJlZmQl4uLjI2MnImNj4JtiYuQkYqdlqGcl5SFl4dpg6KCZYSciZB+i4OLgXeTmJKfk5GJiZWNf36Pl3yRjY+NmpF8ioCDbnVwbG1vcHuFaXODjpiLcXeAdYKIgnhmcm51gJmOe4eDeZOQeXWHc2+IeoSLeYqFgoeNmqKHe4N1gYt/d3lubIKEgl5zdXNxcHlaX3FhcGtecGp9e3FtbWpsdmBvb2pxbVlYYWBhblhRVFpmZ2N1cISCYl1rbmRiZmuSbmBnZmBna4F1cnNwi4B1f4OAeHWAi4B5hX93h4Z3g4V8h4x/e3eKf2pxY3xjhnxucW10amhvbHZ4X3F/eXx1dXSAg36klZqtnqaWhY2Df5eUg5CgdoyglJOGi5uNlo6LenJ4dIJwcoV0cXaIbHBtdm2IdoN+gG5tVVGBq5SHgniAd3KDeoKhgpOClZSZnJObeJJ7g4ySpJqTjomVmZKEh5eZjJSLiY+Ph52Ej4p8couFiY6InJqfm5WUf5N9aISbhmeFn4eRg5GCiXGDkZiQnI+QjIyPjXd7kpF6jouMkpaMfIh8gGt2am5rbGx7f2F6fo6WgnZ6gHiDjHx5ZnNrc4aVi36HhXqTjnB5g291i3mIi3mHfICLj52dhHx6doGLfHdwamyChHtgeXFubXN0Vl5wYnJhYGxuenFocGZmc3RocWthd2VdVmZgYHJTUU5cZmVdeXCIfF9caXJiYmVmkWpfaGVbZ3B9cGxxdIp9dnyFgHV1fot6e4WAeIiDc4aFfoyNhHx5lXhmcmqDYIh9b29remBqbnR/dV90fXmGeHRzhX14oI+ZsJyljoKKf4OaiICMnoCLmpSPhYiYj4+PhHd0d3SAcHCFdHByhG9raXdug259fW51c1JNgt/IktaTe3B1g3WEoIOUd5aSmZyRmXuUc4WQn6GTk5GJk5yUhn6WlomNjYiSjYicf46Ad3qMfomMipybnJuVknmMdmaHkIZrh6KEkYiXg4ZjjJGZj5WLl4yNiotxepSIe46IipORiXmFfH5se2Vyb2trenlbgHmPj4F6fX5/ho56emdyanKKjomBhYR8lIprfX5tf4p9ioV8g3mAjpSZmYp8dXeDkHhybWdxgIVua3VwaGp1blRfcGVwWmBscnhna2tiZnhycHBjX3dgYFZrX152UE5LYWdjXXpwiXRcXGV2YGFlZY9kYWdiWGlzc25rcneMfXR6hoJ1dn6Lc4CGf3qJf3KJh4GRi4h8fph2ZXNufWWIfm9wbIBZbG55eXNhdnt7jXZyd4p3eZ+Lm66bn5CChXeIlX59ip2IhqCRj4WMmISTjoeBdHdweXFvhG9tb39zZWV5cX1ten1qaGtjpJrB3K7woXJsdoR2haOGkm+XkZahlpyBknKFi6OXiY6VipGdloOAlZCFiZCAkYqJln6HenV/iXiHhI6cmpiZjo92iXVthYiKfImig5CJnISFXouTl4uPiY+Li4WJbXuWgX2IhYmRj4Z2hX19a31keHVqbnlzV4h6koeFeX6AgIWMfnhlcml/iY6JgYJ+i5aEa4F1bYaPgY6DfYF4fo+UkpiPdHJ3h4x1c3FndnqEY3VucWJqd2hSYXFna1Zfb3R6YXJkX2h9cHJuWmNyYGJWbllceE5NTGRnYV53c4luXFxkeV5fZGWFYGNjX1lqcmtua3N3jH50d4SBeHd7iXGDhHx+iHt0i4mHloaMf36Xc2d1cXlti3tudHGBV3F6dnlyZHd5h4xpdoCJcn+ch5innKOShX1xjJR4eYyehIWhjY58lo2AmYeEe3J3cHRqcIFsam18dV9heHd7cXV8aGBkfOvatcnD3IdybHSBdoubiY5qmZCQnZaUgYlxhYmgjoWLlYqMmJR8jZKIg4mQe5CLhY+Bf3Z4g4RyiIKTnJaUl4aMdYZ9boOBiIaYoYKTi56DiWGDlY+HioaJjYiBh2p9lIB9g4SJjo2CcYZ+f3F3aHZyaXR3a1qMfJKChX1/g4CEioJ1YXJqh4CPioF+fpGQfG2Ba3eEjYWRgnuAfH6PkY+ViG5weYyGdWtxbHN5gmB1am9da3dgUmVyaGZTYHB2dGFwYF1og3FzaldnaGJpWG1WW3VMS0xmZ15icnOFaltcZXleXmRne2FkX11Za25lb2p0eIp+c3OBfnt2eodzhYN8f4d2doqGjpmBjIJ7k3Vsd3V5eJN0bnh6fVh6hnGAb2d5d5KCZHaGhXCKloWZoZqiiod0b5OLcnePnH6LmomJfKB/hJl/gXhydG5vZHJ/aWZteHhcX3l7e3FxgGphZmF/1baOkaZ4bnF3fHGTkY2Ha5qPiZyTjIZ7aYeLmYaBkpGGh5iOfI2MgIGKjXyPjH2JhHp0eoN7cYaAlpqOk5OBiHWDhXWCf4mRnJ2FlI6ffohigJOIhYiEio6AgINnfZGAfn+CjI+Qfm2CfIJ0a213dXR3dmtjjYGOgIV+fIV/hIh+b19xb4R7jouBe36Qh3lwg2V5gYmFioF6g3x+ko2PkoRubnmLfnVtbmtse35kaWxqWW53WlJqc2liUWNzeGxiZV5aaoNuc2FbZ19kbF9uVVtwTkhPZ2VcZ25xgGxaW2NzYFxjbHdkZV1dWmxsY21qc3eHf3FwgHt9dHiGeIWCfICHdXmJgZKWfImGdomBcHh5e4STb258gXdeg390gW1penOUc2dziHxykpGDmp+boIaIdnaVf213lZh+iJCEio2afYyadn52cXBsamF1fGdianV6WmB4fHptcX9lY2dnV52PX3FzlrzEhHdxlIqQf3OYjIedlI2IdGuIj5WAe5SMgYSbjHyKhn18iYx/k4h1iYV2dn2BcXWGgZ6VhpSPgoJxf4dzg3qIlpuWhpONnICIZn2TgoCGhIqJcoJ+Z32Le3l/f4eLj31pgH2DdmZveXhzd3Nsao6FioGKf3iCgISDf2pdcHd6fYuIhXuAjn99cYBoeIGGiYSCd4J6f5aLj4x9bWt6iXx2dG9paH13ZV1xY1hwdFNUb3NoYk5odHhmYV5dWG+Ab3NZZWJdam1gcE9ZbFJEVGdhWmxubXtvWVtebGNaY3B2ZGdcXWBsamNsaXN3gYJxbn57f3R1g3qEgnyChXZ+iYGWkXiDinSBiHN5eX6NkG9ve4FxaYF5en5ubXx2lmtqeIR0a5SNhZ6YoJmFiG9+jHZqeZmPf4KKgpWXinqPlm96c3BsamRgdHtpYGVye1thc316Z3B6YWVkjrGyd0tiWqXa0Zdye5KMkXl/loyFmpKNhm9shpKRenmTh4GEmYp8hn94eImKhJWAb4qHcXR9e2p5hoOlkYWTjIN+bn6CdYJ3hZmYk4qSj5SFh3B7koN9g4SKhG+BeGiAhXhyf3+Diod8ZXx+hHZjcHOAaHlxb3WZjIaDint2eICEeYFqW298cn+Hg4h9hYh6iHGAbXCChY2Cg3GDd3+Yi4yEd21tfYR/dnplaGp+cmFaeFtZcm5OWHJzZmBLbXd1Yl5bW1l1fXJvV2ddZmpwX29OV2lSP1lnX1pwa2d5cVtbWWtlWWNxeV9oXV5lbGhmbGlxeH+Hb21/fYF1cIF7gIF/gn92gYWJl4pxgo1xe4Z8enmElIx1a3p/a29+dIB9b3J8e5Rwb4B/eWaSioKhmJ2Sg4Vnh4NwZ3qXin5/hYKZioF8jY1peHJra2ZfYW95bV9ib3ldZGyDemBxdl9kZdXrvosyOj6LjoByeYaJj413hZiNf5OOjX9ubIWNjHV9j3+FgpWJfIJ4bnaHhYOWd26HhGt1e3VleYOEp4yDj4yDfW1/c3WCeISaj4uPkZKMi4Z+e5KHeICFjYNsgHJpgH54bXx7gYqDeGJ5hIFxZHFofm11cXWBm4uBf4V+c3V9gHKAblprfHN4iIGKe4Z/fId3eXBrhoKOgolxgHd+lYqKfnRtanaAgHV1XGlpeHFaV35TWnJlTFtzcmZbSnF4cF5bW1lcdX91aVliW2dlbmJpTFdmUT1eZl1ddmZfdXFbWVVvZFplcXlbaF5gZ21namtpcHh9jm1qgYR/eW6Ae32Af4J6dYKBjJOFcICLbnd+gXt7iJOJf2l7fWt0fHKGe3N3fX+MeniEfnxrjIyEm52WjIKAbI1+a2h/j457fn+DlIJ/fYqIa3VxZ2ljW2Nnc29gYWx0YWhwiXphc3ReYmOboJBuXDVar7V1aoCKfpOGd4eYh3WPjIp3cGyFg4d0eYl4iX2TiHl+cmd2iH59l29whn1odnluZXqJhaWHgIeNiX1tfXV+f3uKl4aBk5CXiIuEiXyPiXF8foV8aX5ta4F7emp6doKHgHJgd4J+cWRyZ3WCbXV7hpSRgX2Bf293eXt0fWxXbX11c4qAhneGdYGJendybYh/jn+DcX17fJGHiHpubWltgoF0bl1oZnRyUlx8TlxxXE9cc29kVktzeWtYWVlaYHGAdWFdXWFnZGhoZk5aaE5BYWRcYHZhXHVtWFhTdGFbZW9zV2pfYmhrZ21saXB3fJNsaISJfXxwfn58gX+CeneAgImLhHJ7h29xd4R/e4mNj4NqfntueHl3ind9eICCh3+Efn56bYSMiJijjYWEe3aLeWtthYmSeX17gpKAgH2Kg3BycGJmXllnX3BwYGFocGZqb4l0YXRvW2BkanZ7f76cp6TIuHKFhHOTfXmIlIR0kY2IcnNwhHuDc3WGdIh3lIl5eXBjd4Z5gJJpcoR1Znd2Y2p8hIiegoB/jo99cX5zg3h+kI6Cd5WNlI+Igoh7iYlseXl/dmh6aWx/eXNpenaAg31oYHiIfWpqc2h7gGp2gYyRlH56fX5xe3Z7c31hVXV7cXOIgoF7gnCGiXd3b2+CgYt9fHd8e3SNhIF1aHFobIiCcnBdaGN0b0tmdkxeb1VUWXNuYlFPdHliU1hYXGFwgnNbYVxoZWRjamRRW3FJRGRiXGNxXlx4aFVXVndeXGZuaVZsXmFqZ2Vubmhwd3qTbmmIjHl9cnt+eYKAgnx2fYOIhoNwdoNzbXeCgn6Ji5R/cYB8eHl6gYt0g3h/gYGChHqAdW99iYubnoh+hnt3h3xodYaNkXp/gHyJhoR2j4BncG5fZFxYZlltc2FhYXFsbGiJbmBzaVheY22Ad6nZqceGh7NyinlwjnZ9iJCBepSKgHV0dX53gG9wf26FdJSGeHRsYHqBeYiOZXGCb2d1blttfYGQk4CBeZGSfXd6bIV0fo+Kg3KVipCOh4WFe3+GbXV2f25od2VtfHZtand2f398YGJ4hnpodXVjfntndYaOjZV8dH91cYB6fGx+WVZyfG90goZ+f3driIZzeGp0f4KCfHl7d3pxin98cmd0ZG2LhG10W2tgdmZJb29MW2NYV1Z4bWJQU3V2WVFWWF1gcoRvXGBjbWRjXW5iVF1yR0JmX15maV1ae2NSVlx1W1tna2FWa2BgbmZmbHFocHZ4j3Rrjox1f3Z4fXeBg4F7dH2DiIiDb3GAdXF1foaCiY2Le3d/eIR8fYWHeId8fYF+hIB7fnN2eIuOn42Je4p3dYN6Xn6Hmo15h4R0hoeEd4l6Ym5sW2JbW2FVanRkYFtob3Bmh3JhcWZXXGNrf3zKzoa5omtubottcoVyfoWLf3uShXp5dHl1dXtqbHZjhHaSgnZvZ198gXmLiGVxgGpqcWNYbHuGnImDgnKXlHZ9e22HcICJioZwlo6QiIWLhHt5f3JycH5naHJjbnhxamxxd318el1leoB3aXV5ZoJ2Z3SHi42UfXKGam9+gHhte1xYcH1sc36Je4Ftbol/cHZmdn6AfoB1enB5c4V7eHFlcmBti4Frc1hrX3ldSXBsTldWX1RVfGtiT1R2c1FSVFZdYnSGaVxga2pmYlluYVhjcEdBaF1gZl9cVnxeT1ZlcFlbamhdWGdhX3Jma2hxZ3Fzd4d5bpWKdH97d355g4eAdXN/hoWOg3Bwe3h3dXmHhoeMhnp8f3WLfn2GhISHf35+fYd/fHh2eXaRk59+jX2LbnWAeWSEiJeGc5KKb4WFgnqDdWRuallfW11dVWhzZWBZZHJyZ4FyYWtkV1pfaX94vq56n7duYnSHaXR8cnqEh3t+jYB3d3N3b3t2ZWpvYId1joFzamJefnh4ioJlcH1oa2taVm94i6SBhX9xmZJxf3d0gWx/gY+GcpOHjIeEiYV9eXVzb2l5YWptYW12amdra3l3endbZ358eGVzfm6EdGZ2ho2GlX9vi2ZreoJ0bHRiW216anN6inqBZXSGfW1wZ3R+d3x+cHpqeXqAeHdvZWxhbIl9bG5Wa2F4VkxrbE9ST2lOWX1nYk9VdmxNUVRVXmZ2hGdeYXBoZ2FXaV1ca2lKRGtaYmRWWFV5Wk5XbmpZXWxlXVplY151Zm1kcmZzcHSBeHCZhXZ/f3h/fIWHfXV0goeAlYJuc3l7e3NzhYeIiIR5gX12j399hImOg4GDe36Lg3t3fHd2mp2XeoqDh2p2fnxshIaUgHKPgnGFgn6CgHBmbGdXXVtcW1RlcGVfWGNydWl1cGRlYldbW2h/cG9yf3OJZGV5f2p0dnR0hIV4gYR6d3N1bmt6cGFoa2eGdI2DbWZeX3xveol9aG13ZmpkVldycI6nfYR8dpaQc3tye3lsenqPg3aWe4eGg4eEfXVxc21odV1taV9tdWRnZml6b3tyWWeBdnVocIB4gnZid4WLfJSBbotqbXuAcGVyZV9reGZxdYl6fWF1g3Zpa3F0em94d3F7ZX1+fnd1bmNlYWyGfG1rVmpjclRMamtQTE5wSF57ZmJOVnVlS09TV2Brd35mXWdzaWVfVmJXYnBdS0trWGRhVVRVc1ZNWXZlWl9sYFxbY2Vfd2dtYnBpdG9xfnV0mYF3f4B4gH+GhHp9doKDfpiFbnJ0fHp0cYWFj4KAeot1dJCAfYGUjoCFhHx+jIZ6foF2e6OlinmJhoVsdX17dYSDjXpvhXN6hX2ChHVuamllVl1bW1pTY25lW1hidHtqaG1oYGFXX1ppf2lsb39nbGFpenprdHV0b4aCe4F9dnVuemhqeWpfZW5pgXeQhGdlWGJ3aX6GeW5pb2ZmXVVYb2iPqHeBenyQjnh1b31ucnR4jn53lHSFgoCGiHZqc3ZoaW9cbWVebnNfZ2JqeGh7bVttg3N0am+Afnl3YXaFhHiPhXOIcW95f3FicGhbbXZjcHKHendhcoBvZ2l4c3Frd3ZzdWKCen12dW9jY2JtfHxra1VpYmdUTG1oUEdSbEVheGZiTVRzXkpNVVllbHh7Zl9tcWpjXFZfVW5vV0pTaFhnXlhNVWxUS1x6X1xfa11dW2JlYHpobGFvb3Zub3d1epd9d4CBeYCAh4Z6eXqDfYGThHF0dH56dnSFiJB9gXyQbHOVgXuCn4V/h32AfoaCgIp7doSsn396iIiEbHKCenaBgYJ0bodvfYB0ioBqb25kZFhfWlpaVWJqZ1xaX3WCaV5tbFxhVltca4FlcnR8aWpdbHh3aHV3cm6HfH5+enZzbHpoaXhnXWRzaHp3koFjY1Rkb2eBhHZ2ZmhpYVdWWWhkkKhvf3iAi456cG97ZnhueYp6do5xg31/f4ZuZHdzZGlpXWxiXnBvW2dfbXVlemhddIBvcmtxe351dmJ1hYt7h4eAf3dydX5zYHBsWHByYXBwg3tzY3GAa2Bsem9paHl3c3Bkg3R5eXRxZGFkbXJ+amxUaV5fVUx0Y1FHV2JHY3dmYUxUcVlLTFhYZ2x2emVlbXFmY1pYXVh2ZlRKXGNYaVhYSFdlUUlieFtdX21bXl1iY16AaWpgbnR4bW9udoOXeXKBgH1/iYyGfnZ2hniGjH10dXWBeXp6goyOfX+EiWp0loF7ip19foV5gHt+fIaJc3GProx7e4eQfmZxiHp0fn12cm+GbHt+bZB6Y3BvYmVdZVZaWVdjZmtgXV1zhmlYcG1bXldaXGx7Y3F3dWxiW250dWh1dnFthXl/gXl3bm90ZWh0ZVtndWZ2dpJ6YF1TZWZqgoFzfGFjaVxUWF5iZJClaXl0goWQeGxueGZ3bHuDeXSIcoB4fHiAaWZ3bWBoYV9rYF51a1lmXW9vYnplW3d8a25ucHh5dHRlc4OSf4eCiHp2b3F8cWF3Y1lub2BvcIB7cmVxgGRebXVpY2Z3eXJrbYB0cntycWFeZW1ufWVpVGhZWlVOeWBSS1pZSGJ1ZGFKVW5USkxaVmlscntjbGxzY2FZWlthd1xUS2NdWWpTVkdZYU5IanZYX2FtW1tfYmNdhWloYW53eWxvanaBkHhtgn6AgZKIhIF2dYl0i4Z0cXZ2gXd8fX6Mj4F/k35weJaDfZmSeYCAeHl+f3OIhHNwmaJ7e3+JlnhkdYl5c3l2a3Rwf2x5fHCRcl5wb2BnYmxUW1pXaWRtZlxccolmUnJtW1lYV2BrdmNqdWppX1ttdHJtdHR0a4Z9f4B8d29ubGRpcWNba3JkdHaOc1xXU2RgcX9+cYFcYmNeU1phXGSTn2VycYSDkHNranhsbm95eXpxgHZ/cnp6e2RmdmheY1thaFxed2lXYl5waGF3YVt7dmpqcm94dHN0aHGClYOGfoR1cmpwe2xldldbaWxhcHF/eXNlb35aYG9xYl5pb3xranJ9cW92aW9gW2RrbHthZ1RnVVhSUXdcU1BZUkhjc2JhR1ZsUUlQWlZrbGt8ZW1vcWFbWlhZbHBXU09mV1dpU1RGWlxPSXJ1WGBkbWNYYGFiXYxqZGRteXhrb2l1eYV7a4R9gISZfYKEeX2IbY+GcW92en10gYJ9i4+Dgpd0eIKThoGfiXWBf4F0f4Jwh4J1b6KXc3uGjId7ZneLb258cGd4cXtsc3ZzjWtedG5hZ2ZrU15cVmhibGxbXHGMZE5vbVxWV1VmaXNoY3RlZV1ab3ZvcXV1emyIfYB9iHeQc2Nla29hXW5tZHN4iGtaVFZiY3d8fHCEXGNfY1RaYFpjl5VjbnCDhIlyamd5bmVydXF6a3lzdW96fnZfZ3NkXF9XYmRZYXVmVl9gbWRhcV1dfm9oaXNxdHF1dmtthZOBiXuFcXFmbntvcG5SWmVpZHByf3VzYmx1VWJxa1tebmR7ZGt0fHFxcWlsX1hkaWp4XmZUZVVWUFVvWFFXVFBIZXJfYUZYa09JWFRWbmlkfGlreGthV1xVW3RkU1JWaFFZZ1RTSFpbUE54d1tfZm1qWmJgX16PbmJna3l2bm5pdnZ+fm2EgH6Gl3t/h4GJfmuTiHJndIB7dX+DfomOf4uTc32KkYWHn4Z7f4aMc4CGc32CdW6kjHOBjYx3eG56jWBlfXFnenR5bG1xd4NnZHxtY2ZnaFNgX1VnYGxvXF5ujmhNaWxgVVZTbmZza2Z4ZGVdWnF1bnN7eHNuiXuBd5x7emxiZWxtXmBvamVxeX9nWlZYX2x4e3pvg19iXmhWWWBYZJyIYmtxgYZ8d2tqdmxbdXBqeWl1cm1ve4BzWGtvX1leV2NkWGVxY1RfYmlhYmxaYH5rZmtzdW9teHZraIWMf4l6h21wZW97bHFsYlhfZ2ducn9zcl5pbFNlcGRVYm1heGFvdHp0am5ral9YYGZodV1kVmJWU09ZZ1NPXU9PSGVvXWNHWmpOSl9LWG1lX3hobn5kYFVeVF10W1RTYGZOXWJVU0pcWlFZdXZdX2ZtaFhjYVtejnFjaGp4cnNtZ3ZzeYNzgoN7iI5+fIqIjnlukIp0bHOCdH9/iIWHkYSVj3p9jI+IkZuEgHyMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH1+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY2NjY2NjY2Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCS5KamZmZmZmeoKCgoKCjgGRnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTM/k56cnJybm6KkpKSkpKd8XV9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJiYmZmSj5CQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaNjo6Ojo6Oj4+Pj4+Pj4uIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p8fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkI+QkJCLjpGRiYeOipCSk5GLkYyOj4ePkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyMjI2NjY2MjIyMjIyMjI2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoWOioaNhomQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCQiI6KhY6Gi4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkJCIjYyGjIiIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x8fX19fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMkIiLh4aIhYmPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2Pi42Ki42Kjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp5eXt9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlJOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTk5KSkpKTk5OTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkpGRkpKTioeUkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkoyLkpGRkpF3hpORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCRiXKKkpCSgHOJkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pc3CMkIx0d4iQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo93a3qQhnR3h4+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjntla4Z+cXWGjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLiouHaF5oZWdjboKFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d29ecmxcaW1nZWhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoXmh1bF1tdW5mYmNiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpdZ29tX2tzdWxZWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVZiaG1zcHBzblJRVFBQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1OVGFlZW5tbWloVE1OT1BQT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0RDRkxaaGxobWxtaWdjW1VST05PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVFUFRVWmRrbWdsbGtqamloaWdbTEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7PkJKWWNobGtvbG1samlqa2lfVElFRUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7OzpGTk1hbXBwdHBqa2lYS0JFRURHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHN0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozs9OztLYG17c2pbRz1AQENGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk5Ojk4QmptSDk3PDw9QEFAPTs7Pjw9PEBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT08PTw7R1w5PDw+PT4/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9APFxuQD5ERT8+QTxFXj0+PTs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo7bXdIODs6PT1BPEtjPTw9PDg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUjw9PUlMRkZ1d003ODg6Oz4+V2pBOzw8Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N5STtdf4OAenx3Vjw9Pz09PkZpdEw6PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFIcnlrYoKEg4KDgHxdPkBDQEA9SnJ7WTo9QUVBQkJGSEM9PEBEREFAPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEZvdH2CgoGDfn2EdUxBQ0VAPz5Ze4BdP0NFSUpJSU1NS0VDRkdHRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVyQ0RFRENXdYaHh35YR0hKTUxOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ1dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIlsQUFWdIeJh4eHiINXSExNTE1OTElHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0ZJS0tMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiINWbISHhoaGh4iIh3xQS0xLSEdGRkRFQ0NAQENDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSkhISEdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpUgYOEhIKChYaGg4KGhYSEhoaGh4eGinVJSUZCPz9APz8/PDw8Pjs6PEFBQD48OTk4PDw9Oz47ODs/QUJAQUNDQkBBQUREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWWFhISEf4GCg4KDg4SFhYaHiIiIiImMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1NTc3ODk3ODc1ODg7Ozs9QDs5OTk9PD47PD1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaIaEhIF+gYODg4KDhIaJioyMi4uJiouMiVQ6ODY1Njc2NjY1Njc3MzU2ODo4NzY1NjU2NzY3Njg6Njc4ODk7NzU3ODk3OTc3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR2eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JlhYOBgIKDg4ODg4WJi4qJiYqKioqLiYqKgUc2NzY0Njg4NzQ1Nzg1Njc2OTk3NzY3NjU6OTo6Ojs3OTg5ODc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXZ6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhIWGiYqKiIeIiIiKioyKiYmMej45ODg7PD4+OTo6Ozg5Ozk6Ozo6OTs6OT09PT47Ozw9Oj07OTs7PDs8PDk5PDg6Ojo6OTk5PD88PEFCRElKTUtJS0xXb3JzdXN2eHt7fHx7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVCQUBCPkBCQUA+PT4+QD8/P0A/Pz09P0I/QUE/QD89QEBAPj9BPT48Ozo7OTk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLioqKi4qLXj5ER0lMSkpGR0dERkdHRUJBQENFQ0NBQkNCP0BESERDRUNFRUFGRUZERUZEQEI+PEA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6e319fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0NGV4SCg4SFhYaGiImJiIeGhoaHiYmKi4yNjIyLioqIVkhNTE5MTkpJS0lJSkpJRUNERkdGRENFRkRCSElLSEdHRkhHRUpJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E+QkJHR0pZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2NjYyLiox/UE5QTkxPTEpMSklJSEpGREZISElFRUhGRkVMTE1JSkdGSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4Nzw7PD06PkA+P0BDRklKUV+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjY2MjIuLio1yTlJQTk1NTExKSEdFSUlFSkhHSkpJSkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dIR0NCQUNVbnB1d3d5enh5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6PDg9Pjs9QT4/QURISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIuLi4tfU1NRTk9NS0pHRUJHSkdMSkZLTktLSkpLTUxPUE5ISUtMT1FRUFFPT0pISkpMSktGR0hHRkZJRkVFQkFCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uKjIyMjIuLjXxYV1NTVVNOTEtKREVGS09OT1dVUVBPUVNSTVNUT01TTFBTVVZSU1FQTEpNTU1LTkdHSkZGSEpEREVFQkVDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQkdWTkZOUFBUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2hYV2thRVJRUVBJOztSU1JgdVxVVlRWWVlSWFhSWmZQVVdaXVJUV1FPTVJRUFBRS0tLSEhKSEVGSUlJSElpcnZ5eHl5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0ZGRT8/QUFFQUNHRURFTFhSTVRVVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh21cZFU6WFhYU1E/QFZVWVxkYFZZYnJdXVddWlZFUVlaW1lfVFlnUlZWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6eXp7enp8fXt+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+i4mKi3lucFlaW1tSU1JWVlRbWnWDWVV9kGBcWF1eV0lWXV1bW19ZSFlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeEin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ1xbXF1dV1JPU1BQUVZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT01LZnlbXVRZVVZdWkxUWlVTVF5aWFdXV3prWFtbXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVRST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJVY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTU5LTUtISkRFSUVDPlRkVX9SUVFOS1FUUU1PWVJNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXV1c3N3enp7e3t9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11MRD9DQ0NDQj9EUEJDQEM9Q0lHVkBITkxHXWlQSEZORkRFRklHSENESEdIS0dEQkFEQE9RTVJkcnR2dXN0dXp8e3t7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFNPVmBrbHJ2e3t4eXRybnN0c3l4fn+DgIODgoCCgIKBgmtNRz9AOzs+QEA/Pz5rUEthRUZISUVCP0dMTUdNUlVJQkU/Pzw9PD09Pz0/QUNDQD88PUI+Sk5HVW50dHVzdHZ4enx7fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXkpKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZUNAQEI9OkJDQkJEQlxdT3tOT05OS0xNT09QTEtNV01IR0BCPDk3NzU5OT07Ozs4OTg5PzxCSD9cc3R1dnV2d3l8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJSFBSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEZHSEJBR0lFRUZETVJQYVdSV1FQU1NSVVtPT1FWUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxDPmVzc3Z3d3l5e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aWE1LVFRTUFFVT0xSU1RXWFRUWFFMV1laVlhYVlhZXVdXWGhza11WYXNrYmFfXmRhX15ZVFFOTk5MSUhKS0lJRkNRUFNbV1RUTlFTWVNcZVVPU1NRTktJSEM/QTk5OTg5Nzg4NTc1Nzg1OTpHbnF0d3h5e3t8fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcG5tZF1fX1lXT1BYVlZTVFZPT1RWWFhZU1VUTEtUVlVVVVdQU1VXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTE9SUk9NTU5OTkxKRlFQVVlTVE9KTk9VU1RcVlJVU1JPTUxJSEhGPz49Ojc4NzY1OTk2NzY3NVdwcHN3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF1SVFpWV1VUV1RSWFhZWVlSVU9JR09QT09NUkpQUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBSTUlMSk9SUFJSU1RRUk9MTEtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9xdHd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSUdFSExIS0lGTE1QTUcvRV9SPjM/PmpvYVJSUUBHVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR1eXt7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRUZISk1MRUdDT1JDOEVOU11nU1BTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydHh7ent9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUWFdVTUxLSTw5ODc7PkA+PD1BQEI9PkVIR0NGRklHSkpARkFBQEZIRUpPSFFSYVxRUFJPU05PUExMT01LTUxNT05bV0tNUU9HSUhDSEpMTEpGRkZEP0JDPjxCRz9CP0FkcHN3enp6e3x7enp3e3d5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSEREPTk3Nzk/Qj47P0JAQD5BREpFQ0dHSUdJRUJCPz49Q0JBR0lFTk9iZVFNT05XS0tNS0xNTU1MS09OU2ROSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES25vdnl5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR01NSk1QTVBPSEpEP0E9OTg6Oj9CPzxAQkFBREVHS0ZDSElHR0hDQz9CPz9AQT5ERUNMTlJUTEpJTVRGSUlKTEpLTElKTE1PUFJQS0dDTEdDQkpKTE1PTklKSUdDQ0NESUpNTElZcm13eXh6e3t5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFHS0RHSEhHSktJSktER0I9Pj06OTo7QUI/PUJCQ0NHRklLSkRJSUZHR0NDO0FAQj5AQENFRElNUEhIS0dIS0RISUxNSEpMSElKTEtNXVJISERORkFESkpNTVBNS01KS0ZHR0pNTlFOTGJtaXZ2d3p5fHp9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLQ0ZFR0VGRkdFR0JDQD48PTk6OjtAQ0A+QkNFRUlFSUpMRklJR0ZGREI7QUNDPkBDQ0NER0xOSEtOSERIRUlMTk1HSUxHRkdJSUxOS0lHRU5IQ0dNS01MT01NTk1LSEhJT1JRUk5SZmZmcW9zeHV7enxsaGpvZWtxbHNwZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pERkZFQ0NCRUBEQj5APjo7Oz06PT5DQT5BQ0VGSkZJSExIR0dHRkVDQD1ERUI+QUNDQ0RHSElHTVBKRkZHS05PS0ZISUZFREVJSkhKSUZIUEtESU1LT01PTk9QTkpKSUxSVVVST1dkYGFtZ3Byb3J5emdlaGhkaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMSEVFSENCQUJEPUJBPkE9OTo9Pzo9PkBCPkBCREdKRUlGSUhGRkdFQ0JBQUZGQ0JCQkRFRUdHSUZMUUxJT0pKTExJR0hFRkVEQ0lJSEtKR0tSTUJOT01RTk9PTU5PS0tLT1VXVlVTWF9eXGlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWpzdW51dHNxcmprc01HSEZIQkJBREQ8QUBAQzw4Oj0+OT88P0JAQEBERkhFSUZGSEdGRkRDRUNESUVDR0VCRUdFRkdHRUpNS0hRTUpLSEhJRUZISEVDSUlJS01LT1NORFFSUFFRTlBNTlBNTE1TV1ZYV1VYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW55TUhHSEhCQkJGRDw/QkJEPDc6Pj46PjpAQj4/P0JFRkRHREVIRkRFQ0RFRkdKRUVKR0NHSEZIR0VDRkpKR01LTEtISkxGSUlLSEVLS0xNTk9SVFBIU1VTUFNPUU1OUU5NUFdaVlpZVlpdWlhhYGBgXmhlY2BkZmhnaWhoaWZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSUhHSUNBQ0hFPEBFQkU8ODo+Pj08PEFCPD8+QUJGQ0VDQ0hFQ0VFRkdHR0lGR0tIREhIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5MT05PUlVWT0tVV1NRU1FSTE9RUE9UWVpZXFpZW15eXmBjXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdE1JS0hKRkJFR0U8QEdDREA6PD5APz4/QkE8QD5BQUZDRUVESUVGRUdFSEhGSEhJS0pGSkhIS0hGRkxJSEhKR0xMTUxMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUVFMT1JSUFZbW11eW1xeX19hYGFkXWNgZWZgZWhqY3NzZmpnZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SkpMSkxHQkVERTxARkREQzs/P0FAQEBDQT9CP0FDSENGRUZJRklGRkRJSUdJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOTk5QTE9QUlRYVk1OVFZUUlJRUExOVFNSV1teXl9dXWBfYGFhYGFjZWJkaGJkaWpndotsamlnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2bndLTUxLTUdEQ0FEPD9FRUVDPUFBQ0JCQ0RBQ0RBQUVHQ0hHSEhHSkdESElHSEpGSUxISUpNS01MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNQV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAQ0FFRERGQkNFR0NDSUVDSUpKSUlLR0VLSkdISklJS0hKSk5MTktJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BhdnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQkVFREZCRkZHREVKRUVKTU1LTExHR01JR0pLSEtLSUtLTkxOTExMSUxNTFtzYmRwXmxtVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1KcXl2a2Jga2VlbXhsa3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElIR0VEQEJCQD5DRkdCRkNGRUZFRENISEdERUtIR0xNTkxNTUZKTkhKS0pJTEpKSktMTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW51XFlsUVxtbVpxbWtvbXh4dHNpcF1fcmtxalV1eXhwY15rZmJncHBqam9wcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0dFRUVCQkI+QEBGR0JHRElFRUVCRklISEVHS0pHTU1OS01OR0xOSUxLSUpNSUpJSktPUE9OTUtOTkxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SExGSURFRUNBQj1CQUNHREhHTEhFQ0NIS0hIRkpMTEZOTExTUkxHTE1ITkpISE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnNzdnNIS0hJQkVFRUFAPkREQkdESElNSUZDRkpMSUdGSk1MRU9KS1dSS0dLS0pOSUhKTElLSklISk1NTU1JS0tLU2tjW2leX2ljcnJaX1lqb19lZVVrX2NbYWFRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydnR3ckdHRklERURGQUBCRkVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRUhIS01JSEpKS0tJSElHS0tLTEdIS0tMTU1MSktNTlRbXFRQVExQT05PT1ZRT09RTk9RSklOUFFkcWlUWVdcW1xVWVtdWF1cXGNmYWFlYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0ZGQUVDQENIREZHQ0lLTEhGREdLTEhER0lQS0xPS0xXTElFRUhJSkhJS0lMSkhGR0dJR0hJRUZMSUpMT0xJUFxXXlBcW2BeTVhZU1xcYl5NWFpNWGFSSllhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNFTE1CRENCRUlFR0dGS0pLSEVFSkpLRkVISFBKTU1KTVJJR0VBSEZKSUtMSkxKSEZESUZERkdFRUpIQ0pNS0xVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOXlxeU1peY15aXWBjYFlfY1tgXltUWFdZXl1jYmNhY2VoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSURCQkNHSEZIR0hLSUlJREZLS0tFRklKTktOTEhMTkdIRT5HR0xJS0xLS0tJR0RJRENERUJGSkRASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFZVVVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUJFR0lGR0hIRkZKR0hHSEtJTERES0pNTUxMSEpKSEpGP0dHTktLS01LS0tJRkdDREBEQUhJQj9JSkhQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYlxkY2JkY2ZYUVVUUltXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGREZLSkZGRkhHRklGRkZJTEpORkRLS0xOSkxJS0pISUZCSEhRTUtLT0xKS0lHR0VEP0VDSEhBQkdHRVRdWV5YX1lfW11VWFhPXV1RS0pWXlheW11VWWBSUV9fYmJgYGJiYGNiYWRkYlhPUVFRWlJbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBSEZER01SSENRSkZISEhFRktKTVBFRklKS05MTElMTEhJR0RIS1FOTU1QTExKS0hJQ0RBRURIR0JBR0VEV1VFXFRdU1ZfWE9UVU5aWk1JSlRgYVtfWF5eYV1PWWFcYGBfYmNiXWFiV19fVFBOT09XUVxbW1xcXl9iZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGSERJUmJQQ1ZeSUdHSERGTUtQUEVJSUpLTkxMTE1LSkpHRUpOUVFOT09NTkxNSEtBREFDREZEQ0JFRkJNSEJLS09PTkxGTUZHSUpIR0xLTU9QSUxPUE9TT0xQU1JVWllXWVhYZFdPU1RQUE5NT1RSWlhYWl1cYGFkZWNnY2tscHNyenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFSEZHREtNXUxHR1hMR0hKSEdNTFFRSExLS0tOTVVOT0tLS0dHS1BTU05QT05PTk5HS0ZgRURfTEVmZEVNW0leW3JtT01VbVlMRFBgVWtXZ0pdV1VeRExRVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalJWVVRbXFtgYGFiYmJgZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRkdGSEVFS09TSUpGYFNISk9KSU9NUlFLTUxMT1JVUk9PSUtNR0hNUVtZT1BQTk9PT0lKUX9RSXxZWXF0WVFtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbYFZWWH9qdHV1X192X1hhW1tmW19gYWFhXWBiZ21wbGBwd3R4gYGCg4OCf31/gHZ4emx2fnR4fYB8foCBgoR8gIN6f4F/fnd3TkpFSE1OQkRMTEZJTEVRVkxLTklLUlhXUU1PT01RVE5PUVBLS05HTVBTW1pTUVJPUFBQSkhaeF1UeGVoWlNUUnZndGxwYm5malFyT013bWpycHNycXJwb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29zcnt8b354boByX2BgYmFaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnN8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEpLR0pQT01NSk5WXllVTFFTTllaTVNTUk5LT0hRUlRZV1ZQVFBQUFFLSGd4bGN4cm1bS01VeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/b2hvWXZ2anV1cIFgcmZ9aWx4fG9eX19iYVtdYmRnaWlkZ2JjZGxscHBzdHNzc3lxcnhibHVncXl7c3J2eX6Bc3V6bnx9eXdybk5LU3VOQ0JGUFBISktJS1BPT09NT1pgWldLVFdQYV5SVlFZUkxPSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JocXVubXlwd2x2dHRybG5ddH56a215fGt0bHxrcHZ1eF5fX2JeXV9kZGlnaGVlXmFiaWlpamtub2txbm1qcGFjZmNvd3hvbXBzeX5ucXBqe3p0c29tTExbVkhHRUdSUElMTUpLUFFQUFBQV1xYVU1VWVVlWFJSWV5TTE5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9bcHp7XmB6c2Nyb3hxaGR9aXJ8XlRMbGB2dWtpdXt7bX54a3xwXF5fYlteYmRkZ2VlZWJaY2Npa2tyc3J3Z2xpaGRnYGFrYWdzcmxnbW1yfGttaGt7dG1ta21PSEtLSUlISFFQTE5PTEtSUlJPU1JXUlZUUFdbVlZUVFRhX1BOTUtUU1RRVVZOTkxNT1BKSFFOUFVMS0xTVFNTVFBWVVFRTlFRWFlSTlBVVFhYWFtaVVJTV1tXWFdaT1NVV1hYUl5ZV15WVFBZUlZXV1dYXltncl5bW1lcXV9jWl9jY2RmZGNjYlpjY2ZmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0xNTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlXT09LTVZUUU5VU05PTUxRUEtKUlFLUU1LS1BSVVNRUlNTSUhMTk9RUlFRUVRWUlhXXFdTU1BSVFVWU1pRTlNSWFZUWVZUWlZUUlVUVFVXWFZdWV5gXVxaWlxcX2NbXWJjZGZkZGRhWWBhY2FiaGhpbWJhZF5fY11aZFxibWFeZmVmbXNkaWhra2VkY2ZoUEpLS09PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFNQUEpOV1NQTlVQTlFOTFNQTE9VU05RTk1OUVVRVVFSVFVOS01PUVRUUlJRVldUWVpbWVNVUlRXV1dZW1RQVFVYVVVaVVdaVlNSV1ZVV1tYWl9cVVheXF5dW11gYV5bYmJjZ2ZlZGJYX2FiXWBnZGZlYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FbWlhXWFtZWFlWXGpkVlhZWldWU1NPSk5WVFBPVFBQUE5MUVFQUlhUUVFPTU9TVk9XUlRVVU9OTVFTVVVUVFJUV1ZaXVxaVlZRUVZYVltbV1FUV1ZWVllUWFhWU1JZV1ZaXVldX15VXl1eYFxbX19fX1piYmRoZ2RkYlhhYGJeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFPVVxaWldbW1xYWltkcW1oZF9bWVZVV1FMTVZTTU5ST1FST0xQU1JVWlVTUFBNUFhXUldTU1NYTU9PUVRYVlVVU1VZWFteXVtbVlJPVVZWW1tXUlRXVldYVlRYW1RTUlpYV1xeWl5fYFVhXGFhXWBiX11gXWNgY2doZGZgWWNgYV9fZWRfYGNbWlxbXFlaWVhXXFlcW2BeX1teXmFgXmJcWWBaUU5PTlZRUFRST1VUU1BXXFxcWF5cXlZcXmpxd3mAY1xbVVVYUU1PVlNOUVFQUlRSS1FUVFlaV1VPUk9TWFdUU1VSUlpPUFNSVltWVldTVlpYXV5bW15WU05UVVZcXFZSVFZWWFlTVFlcVVNTXVhaXV5cYGBgVmFbY2JdYWNfXGJhYl9jZmlkZl5bZGBhYGFjZF9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVFJRV1JUUFteXl1bYFxgVVxdaGpyfXNsZ1xUV1dRTlJaU1JRVFJUVVRLUlZWW1paU09TUVZWVlRPV1JTWlJUVFRYXVdYWFNYXFheXVlaXVRVTlZXV15bWFJVVVlZWVVXWVxVVFdeWV1dYF1iYl5ZX1tlYV9kZF5eY2NhXmVmaWRmXV1kYWBgYWJkYGJeWFpfW1xbWFhYWFdbWlxgXFtbXFtYWlteVl5ZXVBPT1JaUFtUVVZWVFRUXl5gXl5iXGBVXV5ia3l0bH1rWlVZVVFRU1xUVVRVVFZZV0xSW1ddW11ST1VTWFdXVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUldSWVhZX1taVFVWWllaV1haXFZVWl5cXmBhX2RjXF5dXWVhYWZkXl5kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXFVWWVdXVVhfX2FhYGNdX1RdX2JlZXWBemhYWVlTVVNWXFhXV1ZWV11YT1VdWl5dXFRSV1NXVlVTVFhSU1ZUWFdYXV5YXVtWXV9YX19YXFZRWVRZWlphWVxWV1hbWltZWVpbWFZdX2BfY2JhZGRcYlxgZmFkZmReX2RiYltmY2hlY2ZgZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlRZVlNcVFZXWVZWXGBhYmNhY15fVltgZGFfenVvaFlcWlVXVFdbWllcWVhZYFdQVl5cYGBcVFRYUFVXVlRWV1JTVVdaWltfXlpfXFZfX1ldXlleVVNZV1lZXWJaXlZXW1xbXFtbWltZWV9fYGBkYmNkZWJkWWFmY2ZmZV5hYmBjXmJjaWRjZ19nXmFiY2FhYF5fWFRbWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNPVlpWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheW11bVldYWVxcXF9bWVtiVlRYXl1hY1xSVllQV1ZXV1dWU1VUWFxcXmBgXWBcV2FeW15cW15YVlhYW1tfYFxfWFlcXF1eXlxbXVhbYGFeYGRjZGVlZmJYY2VkaGdkXmNgYGVjXWVpZGVpX2ZdY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWlhbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBXV1hZWVdWV1ZdXV5gYWBfYl5ZYV1dXlldXllYVVdbXGBeXV9aWl5dXl5hXVxbWlxgYl9iZGNlZmVmYlpkZmZpZ2NfY15hZmRaaWljZmpjZV5iYmNhYGBfXV1aWFxZWVhYWlhXWltaWVdYVVVbXV1dYGBiYnhLWFdbWVddW1xdWldcXV9gYmRhYmFdYFhiY2JhY2FiXVtcW1hXW1xfXWBfXVtgZFxcWFpiZWNhUlxaT1hYWltbWldaWWBdYGJiYGFjX1xiXV9dW15eWVlUWF1eX2BfYFxbXl5gYmNdXFhcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiXGNnYFxpaWJoamVkYGJhY2FfYF9dXVxZXFlYV1hZWFdcWlpXV1hPWFpdYWNmZnJrf0pZV1xaWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBiY2JcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxeXl5aWFZbX15dYWFgXltgYWJlY19dVF1gYGNkZGZlZ2VmZmVeZWZoaGdkZGBbZWdeYWhoYmhoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxbW1ZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t8fHx8e3x7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t8fHx8fHx8fX19fX18fXx7enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29vb3l+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKgkU+Pz8/P0AwKisrKyoijNvS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29ueYB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjI2DOjIzMzMzNCEaGxsbGxCP7+Xl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXV2d3d3d3d3eHl5eXp5enhvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx2dXV1dXV1dHNzc3Nzc32FhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5d3Z2ent4e3h3dnd6eHp5eX16eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3x8fHx8fHx8fX19fX19e3p6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eH15e316fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgYKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHl7fnl8enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4OEgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3d8eXl8enx7d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHx6e3x7fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4enl6enl7eXh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgYGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzc3NycnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHNzcnFxcXBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3Nzc3NycXBwcG9ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJycnNzcnFven9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcXl7cHJxcHGXg25wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHJxfZ56cHFvhqB8b3BwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFynZ92cHScn31vcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcnCXrJBuf6OffnBxcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycI6xqHqIpqB9cHFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzc3Nzc3NznLOmpKexonZzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn58dnZ3d3Z1eHp4eHh4eHh3d4GrnaG2pqKnhHp5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx8fHx7kqaZo7Ghm6SUent6eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX19fX2VnoqUrJ6en5qAf399fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYCBgJSjnJScm5eOm4N/gYB+f39/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f3+AgYB+mrKpo5ufn6WnkX18fX6Af35+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+f4CBhJWvpp6ln5+epKitn5GHgX+Af4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4KGiZamsamem6Wfnp+gn6OoqKOXh4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI+Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODg4WKmaOfmZiYnZ2eoZ+bnJ2Zk4yFg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYCBh4yRlZiZjZWdm5iUjYeGhoeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGBgYOLlpyHjpuajIeGiIiIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SEgoGEi4qSjoWEg4OFhYWDhISFhYOBgoB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6RkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4GCgoKBgYGAiJGCgoOBgoCAgH+BgICAf4B/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAgICJkYCBgoODgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZaIhIKEgoJ/gIyVgoKBgoSDgYGBgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmIqDhYSEhIKAkpqGgoKChIODgoOBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgY+Mg4F/fn18fYycjYCCgYGCgoWUk4yBgoGCg4OBgYGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiIOEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlZeJgH19fX17gZeMgIOBgYGAj5OMkIGCgYKCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICVn4p+foB9h4t+hISDhIKDg4KOiYWMgoKDgoKCgoODg4KDg4OCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf359fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkZKMioiFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDiZGDhIuFgoGBfn2Bh4aDgH5+f39/fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhYWGhoaFhoWFhoWFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+gICEhYSFhoaGhYWFhoaHh4aGhYaFhYaHh4eIhoeHhoaGh4eHhoaHh4aGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4mIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf35+f4B/f39/f4CAf3+Af3+FhYaIiIiHh4eHiIeIh4iIiIaGh4iJiYmJiIeGh4eHiYiGh4eHh4aHhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhYSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4OBgICBjImBgIGCgoGBgYGAf4B/f357eoCGh4iKiomJiYiJiYmJiouKiIiIiYmLi4qKiIeHiIiJh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+RjoqGhYaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCgoKCgoB/fn19fX1+fnx7fIOHiYuLioqJiIiKiYiJi4qJiYiIiIqKiYuJh4aGhoeFhoiIiYiGhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoGCg4KBhIOEg4GOk5KQj4+LiYWFhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX1+fn5+fn59fn19fYOHiYqKh4eFhoeHh4eIh4eJh4eGiIeGiYmDg4SDhYSEhYWHiIiGhYOCgoOFh4aHhoaEgoKDhIKDhISCgYKBgYGDg4SDhJGSkI6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoKBfXx9f4B/fn5+fXx9fXx5fIOGhoaEg4GCg4SFhYWDg4WEhISEhISFhIKCgoKEhIGCg4OFhoWEgoGBgoKDg4WEhISFhISGhIOEhYOCg4GCg4OEhYSHkpGPjY+MiYWEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhISFhYeHh4eGgIGBhYODhIWEh4iFgoCAgIF/f4CDg4ODg4KCgH19f4CAgX99fn59fX19e3p6foSEhIKBgYCBgYKCgX9+gYGBgoGDgYKBgoKCgYODgH+AgIGCgoCAgICAgYGBg4GBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgIGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5+fn1/goODgoOCg4J9fX5/gICBgH59fX19fn18enp6gIKCgX9/f39+f4CAfn2Af36AgIF/gICBf3+AgIF+fX1/gIF/f35/gICAgICAgH+Agn+AgoGBg4GBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foCDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gIB/f39/fn58f39+f4B/fn9/gH+BgH9+fX5/f359fH5/gH5+fn9/gH9/f3+Af39/fn+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhIOCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/fn1+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7gIB/gIB/f35+f36AgH9+f3+Af4KAf3x+fn9+fn18f3+Af35+f3+Af39+f3+AgH59gH9/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH59fX5+fn9+fX19fX18fHx7enl5eXh9gYCAgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+f36BgIGBf39/f4CAgH9/f4GAfn9/gH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KDg4WDgYODg4WEhISEhIODg4SCgoKCgoF/fn19fX5+gH19fX19fX19fXt6enl5eXmAgoKChIOAgoOBgIKAgoGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqUkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoaEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fH19fHt5eXl4eHyCg4SFgoGEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoGCgoCAgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgYB/gIGAf359fX1+fn9+gIOEh4eEhoaGhYaGh4eGh4eIh4eHhn99gICAgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgYGCgYOGiIyFg4KCgYSChIOCg4WEhIWDg4ODgoODgoKCgoODgoKRkIuIiIeJh4aGhIaFhYSEg4GCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gICAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaHh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXl5fIGBfoiWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYSDhISDg4SDhISEiJKPjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eXp6e3x/gYOBgoGDgoB+fX5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WFhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp5ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfXx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn19fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fXx/gYB9ho+Bfn2Cfn9+gIJ8fIB/goCCgH58e4qCfYB/foGAgIGCgYKAgICBgH+LlJCMjI6OjYiIh4WFhYSDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fXx5ent7eHh5e3t6fIKAgX5/gHx+fn9+fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSSjYyNjo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoGBgICAf36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYODf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fXx+f4CBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6NjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+ChIaGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIOAgIF9fn1+f36LhIGHfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn18fn9/fX6Afn9+hJKNjYyPjYyKhoSFhISDg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen5+fH5+gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fX17fHx8e3t6fX+AgIODgn9+f3x8fH18fIGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CLkI2NjI2LioiEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn1+fX19e3t9fXx6fHx+gIKBgICAfX19fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISDgYKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/gH9/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+f358fH18fH18fX57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJiomKiYWIko+MiYqHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn2AgIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDg31+fn19fH19fX19fXx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uLiYyRkI6KiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fn1+fXx8fH59fH18fX19fn19fn58e3t7fHx9fHt6e3t5enl5eXt+f4ODhIeJioiJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2Bgn+BgYF/f4B/gIF/gICBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+g5GEhIOBf359fI2HfX1+fX18fn58fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiPjouLh4WEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Afn19fHx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX19gIOAiY6LjIiFhYWEg4KCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOBgICAgoF/gIGEgX5+gH9+foB+fX5+gIB/gX5/gH9/f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHx7fHt7e3x7fHx8fXyKi4mIhoaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgYCAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgYB9f39/gICAgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt7foqHh4WGiIWEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+fn+AfX6AfX19foB/f4GAgYGAgICBgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAiIOEhIWEhISFg4GCgYGCgYCAgoKDgYKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4GDg4ODhYSFg4ODhIODhISDgYB/gH+AgX59fX5/fn5+foB9fX98fX1+gH+AgICCgICBgIOCgH+AfoCBfoCBgIB/fn5+fn59f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OEhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf3+Af4CAf4CAg4KBgH9+gIB/gIGAgYB/f39/f3+Af4CBgoKCgX+Ag4J/f4OCf3+Af4F/gH98enx6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBf3+Af398fX1+gH1+f39/fn1/fH5+foF/gYB/fn+Af4GDgoOAf3+BgYCCgYGBgICBgICAf4CBgICCg4GBf4CEgH2BgoSAgIF/gYGCgX16e3t8fHx/fn+AfH9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhIKEhIWEhISBg4KBg4F/gIF+f4B+gH19fX6Afn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIGDhIKBgIGAf4GAgIGBgIGBgYODgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgIGBgICCgoGAgH6Agn9/gYKDgYGDgoODhYN/fX19fHt8fHl6e3p+eXt5eH9+e3x7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAf39/f398f39/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+AgIF/f4GCgYB/fn+Bfn+AgoGAgYOChISGhIB+fnx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fXx+gICAf39/f3yAf3+BgIGAgH98gH9+fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAfIB+gIB/gYCAf32Bf35+f39+fX1+gIGCgX5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgICAgIB8f3+Afn+BgH9/foF/fn9/fn19fH+AgICAfn9+fn99fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3fHl3eHd3eHt7e3t8hYl9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYKBgYKAgYCAgYB+f35/f318fn2AgYKBgICBgX1+gH9+f4F/gH9/gYB/f399fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgYGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH17fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKAgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh6gYF4eXt8fH18fHt8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e49/d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3p4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgn+Af4CAf4B/gICAf359gH9+f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYKCg4CAgoGEg4OEgYGDgYKDgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgYB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58e318e31/eHd2eXl6fHx8fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCgoSEgICDgYaDg4OBgoSAhIOCgoCAgoKEgYGCgYOCf4CAf4GDgoGAgYGAgH+BgYGBgIOAf4CDgn9+f4KBgIB/foGAgX+AgIGAgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/f4R9fX18f316fX97eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydG93cXd5c3d7hYKCg4ODhIKDhIOAgIODhoODg4KChIGEg4GDgICCgYSBgoKBgoF+gICAgoGCgYGDgoCBgICAgoKBhIB+gYOBf3+Ag4KAgX+AgoOCgIGCgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cXl0dnh0d3uEgoOCg4OEgoSDg4GCg4SGhIKDg4KEgoSDgYOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGCgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhICChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoGDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SChIWCgoGCg4OBgoGCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgoCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7fYF+fHl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICCgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhIGEhYOCgoKDg4GDgYKAgoB9gICBgoOCgoKChIKAgoKDhIKCgYCAgYOCgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn+DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16enx9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHx4dn92d3+Eh4OCg4aDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOBgoGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBgoOEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDg4KDg4OBhIOBg4OEhIOEhIWEhISFhYWFhIODg39+gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4OFg4SDhX9+goqLhYWEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4SDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhIWFgoeGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeYN/f39+hISCg4KDgYOEg4SEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fn99foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN/g4N9gX1+f31+goOCfH+BfX+AfX18fHx8fXx8fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdtenNugId5bX1yc3Zzdm1ud2xweWx1fn9/fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYGAgYCAgIGAgICCg4KChIWHhoaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29sd314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fnyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYSFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSCgX+BgoB9f3+Bfn9+fn+BgH5+gYKAgIKEh4aDg4aEhYWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYaFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX16fXt8fXx/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SDhYSFhIWEhoOFhoWFhISFh4aEhIWGhYV9d4WDhISDgoF+f357fHt+e3x8fX9/fXx/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWHhYWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIaFhIWFg4aGhYaFhIaHhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9fn58fH59gH59f4B+foB/fX18gH1+f35+fn98fH1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYaGhYKDhYaGhISDhISDhIaEhoWFhYWDhoaFhoWEhoeFhISFhYOEh4aDgoOEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2Bf3x8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFhoeFh4aHhoeFiIiHh4WGhoeFhoaEgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4SHg4SBgoSFg4GAgIB7e359fHx8fn18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4SGhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4SCgoJ/gHt9f318fHx+fXx9fXx9e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9/fnx8fX99fH19fH57e3t6e3x8fHt7e357fH17ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhISFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIh4iGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFg4aGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYKCgYOFgoN+gYKBf4OBf35+f35/fHx9f317fX18fnp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8fImHhIaEhoSGhoWEhYaFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhISHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYWEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAhIODgn2BgX9+g4F+f3+AfH98fX1+fXt9fXx9eXp6eXt8fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SFhoaFhYaCg4OFgICBgICDgIOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYWFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoSFhYKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18f359fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhIWGhoeHh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSEhYSFg4WEgICCg39+f39/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7fH19fX2AfX18fH2Af318hoOGhoWGhoOEg4aChYGBgH9/gIB+f4GCfH5/f36AgIKCgoSEg4KBgoSBgIOCgYCEhYSCgX+AgoODhIWFh4aGhIWHhYeFhoKDgoKDgYKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SDg4SChISAf4KCf31+f35+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp8fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1+f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFg4ODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7eXp6eXp6ent8eXt9e3t+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT47QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vKysrLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU09LT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0NHQ0NDQ0NHR0dHR0dHNysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fY2djY2NjY2NjY2dnZ2djX19fX19fX19bW1tbW1tPS09PT09PU1NTU1NTW1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtBPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzZaEhoaGhoaHh4eHh4eCsuLd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi3qaenp6enp6enp6enp6axvr29vb29vb28vLy8u7/S0tLS0tLS09PT0tPT09zj4uLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZNPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5uUFNTU1NTVFRUVFRTTKDz6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OjoIaEhISEhISEhISEhISClayqqqqqqqqqqampqaiw0tLS0tLS0tLS0tLS0tHg7Ovr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj87PEJAODw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zOcVRYV1dXWFhYWFhYV1Ch8enp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpaKJh4eHh4eHh4eHh4eHhZetq6urq6urq6uqqqqpstLS0tLS0tLS0tLS0tLR3+vq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDw+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNznheYWBgYGBhYWFhYGBapO7n5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamnkI6Ojo6OjY2NjY2NjYucsa+vr6+vr6+vr6+vrrbS0tLS0tLS0tLS0tLS0t/p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3HxcXFxcXFxcXFxcXFxMvQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Pzs/PzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tDQ0NDQz8/Pz8/Pz8/O0NPS0tLS0tLS0tLS09PS1dTU1dXV1dXV1tXW1tbY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz8/Pz8/Pz8/Pz8/Tz8/OzM3Mz9PS0s7Nz9LOzs7Ozs7OztHUz8/R1NTTzs7T08/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1tbW1tbW1tbW1tfW1tbW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztO7nc/SrYODlc/SpKHQzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK1lZu1ypq8uJm1s5+hqdLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/Rn6CqsMSijICNxZ2XlZzI0M7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw5Nj9CP0I6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0cWHmrPAnois1rqXoZ2wstPPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Wp5m1u6erm6WymZavs6rV0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P1aWZtMGgnZankJqEnZOk1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NalmbLWo7Srn3+gqYWZpNXR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NDVpZqz1snYwZyAvK2mmK/W0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0Y/SEhHRUA8PD4+PD09PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPQ1aWZtMmNoZ+fmaiWmJu71dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQzs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HH0tajmrPCpKqjocOgq6Sc0dPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09HVtYLD2KmPkKzXwo+NvNXS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw8P0dFR0tIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dHC1NLVwb/W0tXFxNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS1NLS0tTV09PT1NTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj0+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6Njk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+PEhGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9CR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg1NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q6ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU5NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU1ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi3t7e4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo6Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsrK2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3uLe2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7a3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo5Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelpKSioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tLa2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6SlpqakpKOioqOioZ+fn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKuopqCdnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqenp6efm5qboqCalpeVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWjoqWmpqWmp6amoJuZm6Ggl5OSkZeanJqWl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlp6empqKenJ+hoJmRkpqWl5qdmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaWmp6alpaenpqWjoKChoJ+ak6avm5qZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaGhn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqSlpKampqSko6KioZ6dmqOKh5ucmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqaupKSkpKKhoZ6bm5+gW4acmZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKCqtLCio6KgnpybmpqpcFCLm5ucmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaGgq5OcrqCgnp2amZqimVNaj5ydnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuam5qam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goaCgoKOhaJesn52bmpucqnNWX4+enp6cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmpiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnp6dqHRopKObm5ucn6FrYmKRnp2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZybmqeCbIGnm5ucnKKSbGRjjZ+cnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmZqmhHZwk5qbnJ2dgmplZYygnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJyZmJmZpo11fHyOmp2flnhmX2WNoZ2enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ucmZiZmZyVlJ17f5yioIaMf2BmkaCen56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZmfqZyKa22uqqFnf4t6Z5efoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmXpqWIcF9qpJSYVmd7fXydnJuenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qal6mZZ0VIdJmDhU9FYHWAlJGNkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkJathD06PHiMdm5ROTVedoKHgo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg36Yo1pebFB5oZaDU2NqRmd4gYKSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5+nYxZmKNvtryxvIJ5mn1OdX6Fjo2Lho2UkouQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhH+CfaB4jNzMs9axnri8ZWJyYWCIi46LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYx/iI2Mi4uIkoqaaLPJtMjUr666p3SLqWpYiIuKkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmRnqGdk5eboZqenKOjk2+pm5HCvraxmI13XcqaVYKPi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6qps6CHkHmUrJSMj315cmednGN4naKknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipamnp6mqjnhXg417eoBwbmtzdnx9dqCpp6Cioq6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkqKaanaSmoqGpnnxoS2l0bnB4amhkamtueoSWpKOgoZ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioaOnoaaupqenr4RsYktdc25vd2diY2VfXmp0fo6boqGfnaCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqmioKGoqa2ws7W8spZvZVxHVnZyc3xnYWRqWlpgY214f4qZoqKhopmWnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY21paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOrqqiutri8wcO9r5l7ZWRbQF1sbnh7a2FfZ1tYYF5hZnBzeYGToqidnqGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7O6xtDa1ca4qJZ9Z2JjVT1eamx2cXJkYmNZV1xfXV1haGprbnuSpa6npZmhpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1pdmtwaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW90uDh0LqlkoNyYVlbW08/V3JpXltubF5dV1lYWlpYWVlbZHKGnbrIvrehp6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFpYGZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PDvMPIztTQwKN+YVVTVVhRRkmCbnqDf15WWFdcW11aV2B8nLK8wMbHt7e3qa+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3bm1bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwcXIyMW/xa2KZVZYVVFJa3WjrKNPVVxfYVxdbJCxxLy9rqmyt6u1sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH6Ef2pmaGFrbGdudXJydXFnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEJCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/xMPGxsCxlMTI0ruLZlVWUVZmoq6dTlZXWFtnh7O3rrCtsqaqqqqrrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3VrbG5kb21pcXhvemppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMS5tMC2s77GyLCAWlRTUJmxkUdPVllxjqa8sKWttLWsr6Wlo6ekoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5eXt3bmtpaHZaZ3J4c3lmZl5kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDxMLFvri9wMLCw6FuVUqNtoVFS1p+oaKntLKtrLi1s6ypo6GtqaynrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVmaWpoXmpvbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMe/xMfExMjLxqxzX3ZfS1eWt7nAvb65vLq8urysraapu7q5t7+ytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aWpqdG55bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnNxcXFw8bFyMzUzIZJTFegycHIzcbEwcTHwby+tLGwsMK+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGtqd2xpZnVvdGNdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwsPBwsbGxsrMe0eFzs3HzNDFtr+/wMC6u721s7PAv7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVnY2pkYmttbm9eWV1WVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvr3BwL/Ax6VKn9LMxcnRwa+9vbi5u7u+t7Sxub6zvL6xubW4u7a8tLW5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFjY2RqY2djW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Bu7/AvLvEvbrAxL+9vLi8wMWvT5nNxMDByb+wwb+6t7u+ubW4tLi8tL24tbSws7yxt7e4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhYmNoamdnaWVpXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdWOu7+7w7W6x7e2ubu8uLm1usTIqlCRyb+/u8G+uca9wr+8xbi2t7S4tra7u7m2tLe6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZmVmcGpla2hYWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vM/FeazMvce3ubittrS3ubO1srrFyp5SiMq/v769vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfWtucWdxa3RmYm5gXFRIS0tESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTXrnaEvcjPwsC4rrW1u723ubG+w8eTWIPOw8K/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHJmbGpudW94Y2diXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsfJ0ZlzdrDR0czKxLW6v8TIvr60vsC/gmZ4y8bCvsG8v8PMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4J0b2xsdGxsbl9jXmFiTkhOP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQwrq+vMS+t7zAv8nPx8jKysKHdXanzMzLzcrGwsPLzsG8uLy6sH13a7zIxMDAv8TAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIe21teHxgcWRbXl9fVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u7rNvDvra+wL6+uqacqrO3w8Cme3l7nsTGy8jBw8DAycrBv7u5saORhXqvyMXEv8DBv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnpuc3h0aHBeXF9cWlFFRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vFt22uzr22ucC8qn1uaG5tdIKXmXR6fpq+v8bAucC8vsXEvb24sq6kp5KSncrDw7y9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bXZ7cW9qXGBgWVNQQUZJR0tARUNIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbJ2grO9trXBpIZpWl5gTlNbXHB1eYSjuLfCurO7t7u9v7q7u6+iqK2epIG+xcO+vL+7u7i2wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z2d29yYV9mXVtVSj0/P0dHPUdDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmnhHiLobC1nGpmZ1ZZX0lJTVBUbnmJqbC3vrmytbK8uby2ub61lqq8q7F3rMrEwL2/ubOusry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXV3dHdybGBjYVxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/GqYd7doyhmF9TQ1lVSGJqVU9FSmOQpK6vtrq1tLKsvLm4tbjBvY2ivq+wdqfLwr+5urWupayzsaawraidoJ+lrba1wre2tKWoqqiwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3ZzbmNeZ1ldXVNPTkE+SkJASkpANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7SQgXmIkG5OSz9lWUJPeIGTaE1CXoSxtbO1srSvrLu6uLa5v8V3irSnnmaqv7i1srGtrZ+kpqedpKWclpmZmZ+prrmsq6ufpaikq66vp7Crr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLavqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211amxdXGtVXVtQTkhER01CRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhHxYRkFPh1hKSll4joNjQVSjubO0srCxrbC5uLa7t7u9kqOzrqR0rLCpq62ro6ihnZ2el5eglZKWl4+Yn6iupKOkoKKmoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh1dG9lVWFkV11RT01IQElSRE1DPTg4NzU6Nzw+Ojs9ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yvKmYmZVoTUBTeXFQSUlLaJyAWkVUr7uxrLOvrqyttraytLWuqaefmpuen6aonqCoqZ+hp5ablpeOnZSPkJaNl5ukqKCgoqKhpaWdo6OgnqWgpKylpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CXlZaYn56em5mml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoYh4g3x2f3pjd2xuXVFpVVBPR1BNTENQUUA+Oz40OTo1Ozk9Ozo5PDk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3CqqW8Z0RTm39RWElLYUpWjmJlZIKvtaqytK6qq6+wsrOtpZ2Rl5OOl6CfoqCco6SfnqiUm5aXjJeRjZCXk5ido6qfn5+go6WonJ+goZyin6OoqJynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJWTkI+RkZmQlpWYl5+YnJmbpJmXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fH91dn1ua3tkaFZSZE5KSEdPU05LTkg8RUA8Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaCqxr/Kn09Bc5hzUG5KTGNmdXRgXGJzkbKvrrO1qqasq6KbmZSNkZWWmJicn6KinJ2knpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqKlopqZnq+orrKrpaqqoJuYmJiVk5aak5WVmpabl5eYoZ6cnJaboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3l8ZXl5YGJTVmFISUpLU1RJU1FNOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpcbGjFdTSmakWmZ9b3JbUWtjXGZiYGyRtLCwuKymoZydmpSXmpmQjpGVkYyOjZOZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKehoKOxrrKxtKqyrqOZnJ2eoZibm5qYmZuUlpuWmZyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1paTVFKT09WTVNNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp+qo4x5VWlyd3VwY3d2WFdjYGRpWlpXZ62urK+nn56ioJaQk5ugm5mXkpOfnKGjm56blp+an5ebop6loZ6kn6Sora2orKmkrLS3trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7a4s7itsrSkoJ2loKyhoaKhoJqYlpWfm5uYpaGgnqOhoJ6bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCgH14dmp3dV5tW1JhSVJVSEZVV0pDTUc9S0g4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCkf2+CcGBjWExbUlpMTFFZUkhOTkiZrKqppJ+fmZKSlJiYlpaVjIiLjpWdnJ2dnpeemaafoKilsaqnrqOrrrawtLKxrra4vb+6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquusbm4vK+zsLXCvLe+s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+oqKWknp2qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhX52cm1pd21obVxYXENXTkpHTUdDRk08Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOenIliV15lYFdNUUc9PkBDRD8+QlJ4qa2pqqWfnp+io52enZqcm5STlZSenZiUhZ2aoJqrpKuysLmysrGysbq9vLy5trjDvr/Cv7a7u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsS9w7y3s6qzraqztK+zrqqvo52sqLaxraOwpqCjsLGusKSlr6OhoJqhpqGkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF8dHJra3VycWhWXFFGVUhESlBJP0VBNEZIOTU8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqgn5V8X15lYFFGRDtDP0Y8Pjk2Tn6qs6ejo6KgnqWrpp6YnJSRmZ2ZlYyKhoiGeG2IoKSiq6y0vLbDvb6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr7HxsK3w8rKw8HHv7q0uru1u7ewtrKqurKuu7i/u7qruK2rqri7tbyurrijpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrZGlveGtlWVtGS0xFRFRNRUNFNzo/OjU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz49Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9cmlhV05FPklafG9hQT1cjq6soJmbm56emZeXmJKNj5eXk46NkIyCg4J3cnFtcI+mra60ucW7zcfLvsHMzc3Mx8nRzMzMx8nFxszQ0tXO08m9wL/Du8bFyMXR083U0NPTzMrCxcbGysjPwMnRzMfGyMbCvMPBv7+/tr6zrb/Aw8PHxcfEr7+5sri8xMLCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXRzZWJncm9mXlpaQ05MREZQSURDQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E/PEA/Pjk7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ6VaWZcVElEQD9Lhp6kmIOgsq2jnpyfmpiXlJKUlpGQj4yIhIOIh4OAgYGAeXFyb2x5pLa6ub7LwdPR08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fS19LV1tPUyMzHzM3K083O083GycrKwsbMx8nJxr/Ds7PIxcvLy8/Hyr++v73BxsXNzMnJwMPArq+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuWkIyGkYuAe3J1dmdjZ3ZqZFZXUURORkBJUUM+Qjw6MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hm2FTTEpEQz9DUrDSvbKvppycnKCkoZ2alJOVlIl9eHFrZWJocm9xe4WKgHVwbnF0cIWzw77F0dDX1tXS1s3U1tfU09HT1NTTz9LE0NPW2NXW0svJztHLxs3RytLV1tnW19PX2M7Sys/RzM/QzNPQwMnIysTMzMzPz8XHyLbAy8DSzczQxsrJwMTDyM7N0NHPzcvIzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYGVyY11SXElKR0FFSUo+O0E4PTU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoqFZSUBBREFGUXayr6aalJefnJqgoJ6bnJqViXdpY2FfX2BfXl9fXWFsdXNwcG9scnF1ksTIx9TW19fW09bQ1dTa1NTOz9XU1NHRzNHO09fW09XQz9LT0cnT0cjQ2NfY0djS19nU1czPz8rN0svP0cDGw8jGz87R0dLIzM3Ay83G08/MzsjEy8fHyczK1NTR1c/SzNPCucWxpai1rqebqKulnbKosLOtrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYmNpbV9WUF9KSkNGQ1JNQDw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD9APUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu32NTV2dnRztC/vMzJtr6upqqooaOrZUM4PT5EWIKqqJ+XlZeZmpyfnZicnJJ9cWVjYl9fYV9eYWBfYGBfYGVtcHBua29yd3eczMHT1dPY2NbZ0dLS18/TzsvSzdXU0cvPzdPW0tHVzc/V1dHF0dTK0NTV1s7T0djX19jLyM7Eyc/MyszAysDJys7Oz8vQzs7Mz8/IzNDQy87Lw8rHyc3KzNLTzdPS0dDQyr3IubCuu7m1q7awrai4rbO+u7Gaj6CUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Bva2FkbnBhV1xaSUZGRE1YRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksXpIRkI7V42hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYV5fX15cYm1yb29zdHZ2eaS/zNXR1tTT2NbOztPLzs7FzsrS0s/Hzs3O1MzO0s3L19bQzNHUy8zQ0tPKztHV0tXVysDKwsXNwsjKw8zExsnKy8/Lzs3QztPMxsnQzcjHy8XHwsbKzM3Q0sfQz87OzNDFx8G4ub3Dw73DuLKyvrG7w8O1qpiloZiWkpWVkouUjZqRlJSPj5WCiYZ5cXJrbWdgYHFoWVhoVk1HTElQUUI7Qz47Njg6ODo6NTc9PUA7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzs8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfDuMrV1tna29jMzM/I1tXEwrWvtKifrZd4bHBxeY+ajYyXlZCTkZGVlpWQi3xlYWJiYF1eYWNhYF9fYGFhYF9dW11ncnJwcnNxbXJ5pcfTz8vQ0NPUysXJycbGv8PFz87HxcfNytLIy87NxtHS0M7M1MrHy87Px8fP0svQz8a6xL/Gyr3DyMnOxcPHwMfNyMTMy8zPyMTE0MnGwsbJxb/Bx8zLzM/Cy8zJx8vQxMXHu8fDyMnCz8G9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+CeG90ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7uto7Z+aIOFpKuTjY2Wj4WDg4OBfYSEfnNfW15eXmBeYGNkY19dXV5fYGBfW1pcYGxycW9va2xvb3250cjJys/LzcS6wMO7u7q6vsnGwsPAw8jKycjKyMHFzMbIys3JxMLLycHBy9DFy8i/ucK7xse+wMbPy8TAw7vJx8m8ycfFysC+wsvGxcS+xr29wcPFzMXGvMDJw8XH0sXByb/KycbIxtHDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhppujoJuVfHdzdGZpWmFubVpcWFJETEZCR0VMREZTQDU0MzM1PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1drY2c/L0s3NzsjBtcO+sa+2bF56faGRipKWhnqAhYV/dnh1cnBfW1tdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lrcG9zj8e9ysXLwMbCsLa6srKzsrHCvLy8urjBwcHEvr25vb+5xMrFxsK9xsC4u8TJv8HJu7e7usbDv7zCzsPGvr61wb3Eu73Hu8O6tL3GxMLDt8C2tr6/u8zDvba6yLu/vsvDwcbCxcnHycbQxsLMyLLHycPOzMDFw7+9srewsqeoqLmwpa2wqq2slHp2d2pkZ2Bob2RWXllKRkpGSEtBRkJGSkA5OjY1ODg1NDs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysnGzc3O0cjQxtXU1dfNys7FycXHwbnFvauupmBkdYOTi4iLhHh/hoZ/foR7dHRjXFxdXmBgYmNiYmRlYl1cW1xeXF5dWltcXmhzcW1nZ25wcnmdvczAw7rAuK2wsaeqraynuLS2tLOztLu2vbG3sLWvsrvCvMHEvL+7tbK6vsC4yLm0u7fBwr24vcfBxLy1r7K2u7+0xbe7tau5vb7AvbG7trC3urPGvLevu7+1t7XFvL7DxcDExcbHy8XAxsa7x8vAz8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjJyMrIysTQzdLPzcXHwcbAv7q3ybaqsJlbZ3CKj4WIiXp4foaGdneBfHNoXV1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaWZqbW5yfKTHwLi4tbCrrKeeoqmnnqqss62qrKq0rbaxs6mup6yzu7q2w7m6urGrtbm7tMK6sMCxvry7trzHucO2raqosLLAtri9sLGnsbO1u7ysrramrrauu7Kxqrmwrruuu7i7wMC+usO/xsPFwLzGwcfLuMXHxb/Hw8O6xMbCu8bJzMuzucK9u7OJc3Z2a2lgYmxpWVdXW0FMS01KRUFDQEZBOjk6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcTQx83Bw8a/xMTDw8rCycq/wLzCurO1tcOuqrCSW2p/koeOj3t4fYmFenuEgXduXl1cXF1fYF9fZGNiY2RiYF9dWltaWl1aWlpaXGVub2hmaGlrbnKBrbqwta6lpKammqCkoJmcpauupKiiq6qsq7Cjpp+qrbS2sb25r7ewqK64tLO8uLS8r7i5trK8wbLBrqWoo6uxsrOovaqrqKutrrW0pqitoaSvqbKmqKiupqi3rLGzt7q6u7K8vr6+xL+1wsHHyLe+wMS3xMO/u7/Ewr7EyMzKv7/DwMCph3N0c2ppXGFvZFdWWFBIWVJTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz83Dx7m5y8HLvrvJtr3DvrrKt8HDwbS2vLaxr7W7rairkmRtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9eXVxaWFlbW1lYWlxfZmtmZGdlaGtvcoWqpaulnpygpJSdpJqXkaGiqaOjn6Wmp6atoJ2cpKatsrC2t6exraiqtKu0urG2tq62ubOwurqxt6WgpJ+msaisqbqqpKenqKeyraCop5+cpKasn5+npKChsa2trLK0s7Swtby2u8HAsru+w8GxubnCs8G+wLW4vL2+vMLHxcPEv8DEoIR4cWxiZmBrb2BUWV9ITmdPVEhGS0Y8PUA9Ojs7ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLS2vbi6wLq9tqCelJ2hprq2q7Ozu7PEz8nLw8a4t8fAzL+4ybe7xbizxbizv8CstbyyrKWvs62ho5FpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGFeXFtcXFhZWFhYVlhbXl9kY2JlZ2dna21viJ2pn5WVmqCVmqKYlYydoaKnnKCfpKWip56bo5ygq7CtsbWkqaqqrKyktLitt7Css7avs7WvsKqfnp+jorKlpqq5raKmpqCorauZoKCemZ2fpZqao5ycnq+pq6iqrK2tsLK4r7i5urC2vLu6q7OyubO9tLaxsba1v7a9wL7Dwru6vZeEe3NrX2VeZGRYVFdeSVdcS1BHSkpHQTw/P0A7PzwwNTUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uce4t763ssK0sbu7rLm6saKeqaunmJ6PbX6Fhn94cm1vbWtiXmFmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGZmZmhpa3KNp5ySk5OalpqglZWQm6KhqJ6cnaWnoqWcoKGbma+urq+yoaWjrqunorWwsrKsqa+zp7qzpraho5+bo6Gto6Kqtqujo6aepaajlpmdl5mbnaCal56dnZytoauoo6Smrauys6q1sLKrsrm0r6qvsrKzt7Ouqa2usrixura6vcC4s7GUhnp1Zl9mXltZVlNaVUtbUUxKRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+znaWjmKWxwrW2va20uMHMyMa/xbbBwMfOt8DEvbO5ubK/trG5u62ytK+fmqSqoJSaj3h/g4R/eG9xdHFoZWNoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqCbkpOPk5WWnpaYk5efnaGclqGhqaSfn6mdnJurp6+wq5yjpLiqoaCuqLaqp6itsaS4sKS3oKOcmZmqp6Gbrbmwo6GknKKgoJOUoZSWlpuZmJaXnJWfqZ6ppKKdo6qqsa2otKyqp62zsKWrrrOxsLCvr6eoqLKusrWwvLS6uK6jlYJ6d2VfYVZZWFNSVEtNXkxQTEdITEtFPUA+PUI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvre9rp2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGuvLu1u7y1ubmwr7CqnJmhqZSRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmJjZmmAlJGTi5CSk5mXnJWVm5+cn5agoKempKeooJ2gpqCqr6afoqO3qKGhoqizoqWopbCmsa2stZ6hnZaVqaKilK2ysZ+jo56emJuTi6GUkZOYmJOXmJiXnqebp6KimqSlpaukpbCnpaOrrK2mqK6vr6uoqqqzpqarr7Sxr7y2sa+voJJ7eHNlYVxbXVhOTFFIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepaast7u8wcW6sbm1xMnJwMPGxce2xcSzwb/Fq7e3vba9uru1squtqJmYn6OLiXSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpaW1lZWltXVVhXVFRWVVJUUlVgYV9gYV9gYWNkaYCRkYePjZKQkpyTlZakmaCXnKCloq2mpaWkpKOdqqulmp+lsaqgoZ6lq56oop+uramprq2ioqKVmKKbnJCrqbGcn6Kfn5eYk4mekY2Sk5aQmJiUnKGjnaShopWgoqWmm6OrpaKkqqOrrqWusqmmpaamtKaqqK2ztbS5urCqrJ6Mc3FwYFtXVlZSRlBPSFpcT1JKVExTTEVHSkQ4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Ktnainr7m5s8DJurXAr8XIzLrByszItcm8sb3Dya2xuMG1vMC8tLWqrKaVmZubiIFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXF1eXl9fYmRtjI2Cj4SOj42YkpOSnJqinJuhqamrqaynqaakmaWvpZWapa+poJyZm6Ger5qcq7Sgpqafo6ShlJOblpaSqaqtmp2goaGblJCMmY6MkYySjZaVkJ6ioKOdnKOVm6CjoZeiqKOjqKugq6+krrimo6SjrK2qqKuvs7eyvbWzq6+YhXRzaFtYWVNVUkVYTFFbWE1VT1FMUVJJTkpDPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzAxNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7evqKevrpupqKy3tqu8yru2v6zLxsW4wc7PyLPEure7wsixrbi/t7y9u7O1pqmglpeYlod6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOT1FZWlpaXVxcXl9gZX2KgIl9io+IkIyWkZeZoqCboKuqpq+sqLGlqZqgraGVlqSop52YkI+anq6XmaeqmaCdlKWhn5KRkpGTlairpZqZmZ6elo6Mi5OGiY2Dj4uSlZGgnqGkmZaflZqhop6Um6WmqKiooLGwprG9qKCjrLSrrqewtbC5tcCxrrGrkX5yc2JWVFZOUkpHVlBSUkxMWE5KTE9SR01LQUNGREQ+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NzYxMzIxLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7SsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqxtre8vcHDsbCxt620tLuztKKjnZ2Xl5SDgHZrZ2xucW5ya3BrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlRSTk5OUldYWllZWVxcXWFqfnh9c4eMhY6Il4mUk5ibmJ6pm6Crpqasnqiaoaack4+fo5qXl4WEkpukkJWjnZaWloiim5uUjI6KkJqlp5yVlZebkZKHlI6LgYyNgJCLkpKSoJqgopaUmZmVoqaZjZmkpqmmoaC0sqizuKGco7esqq6ksrKmtby1q6yxo4l5c25dTlFRTE9ETk5OUEtGTk5KSk5OUUlNSkFITEhIQz45NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSopLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS3saWnpKqloKmmpLOqorLDtbWys8bGtrrDyszGs6y5vbS4wK+tqbCepq66r62fmZqdlZSHe4NuX19mcnB2cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFtdYW5wdG6ChoGHf5CDjoqTkZOdoY+anKOipJmll6KclY2ImZqMc42Dfo6XloaSmpCUjo57mY+djIKJf4qYoKOekJOYloWOg5R+fnSKjnqQh5OQkJ2bmpqSlpCdjqOjjomaoKGkpJuitK+ssK2fmaa4pqaxobCunLC8qqmvqpmDd3NjVk1ST1BNQ1NOTFBNQlBRSElOU01ISkpES01GS0s9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKmmpaijpqWmpqazp6W0wbiwtLDJxLe5wc7GvbOsusGsrcOtqKKmkp2mtq2joI+VlpKQfXd+ZldWX2dmaWdobmNpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpITlRTU1RVVVZZW11qanBrfYN7c05Yco+Cl4aNnJeLlJGgmZ2VlJaVj5eKgJSJXztWb3yMlImAjJKMkIaGc4uFl4F5gXuGk52Ug5WOkZCDhn2TeHFwho19ioGRjY+XmpmTi5CKnYifmIeIlp6aoaCXp66praionpeus6Kmrpmsq5iotKOpraOTf3NuX1tOU1JXTERUSlBNTEZOT0lFTFFNS09KSU1QRklKPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCgrKy0zODU0Nzc5PDo3OTs4NkE5ebego66hpqaqoKapp6Opr6intMK5sLWwx8K3s73Pv7mvrrXCp6rFqqOdmIOUnLGimpiGlI+Lh31zdV1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU5RTUtJRkhOUVFNT1JUVlhaYGxtZ3mAc1BCP3+VkpF9iJWMhIqNm46WlYqSiIaVh3mJf2BKUW54i5KEfoSNi4WAf21/f5R3dXZ4hI2acFGNiIqGfH54lHZod4aIfoqJlouOkZOXjISKiJWEm42ChJKalp6dlKSjqKmlpJ6csaqhpKSRpqmWoqqcoqaoiXZtZl5bSFFRU01JVU1TSUxLT0lIRkpOTE1US1FRT0dKRD03Njg6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKiosNDgzMzk4OTo5OTo6Ojo/OXe2nKOnnZ+hr6GnqKWnqK+sqrW8tri2s8G7tqi5yLi2qKi1tqqyvKeelo1/ipSolpWKfo6Dgn13cG9YTUtNTU5MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1KRURDSU5PaFlPUVNUVVpugnJ1fWloXFSQiZSIdH6GgXyFjJOCkpqLj3uGj4B2gHhzb3ZxdI6OgXp+iquEenpodnuOcHJteIGLjZJ4e4B7gHZzcpJ4Z3WFhISFfJWKiIqNi4B/hIuNgJSEfICPmJWclpGfnamen6CdoKmlnp2YjaekkqCglp6fpIFzaGFdXUpXUFJHS1hST0pMTVJKSkpMUEhMUUxSVE1GSUI8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLi8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6qlrauwsaq9tLK8uLa6tLGft7qyqp2drKmosq+impGNlIGOnI6RfnaGeHx2b29pWEtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnSCe3hmdoyWmI2OfGd5gXZ4gImQfYSYkoFxh498d3tva36tfXSQi397hpKAfH90ZnZ8hmxvaHN8iYyHgG15cX1xbXaPcWhxgX6OcESLhYKDhX93eHqMhn2Me3V9jpKPmIuSmpujlpmcmp2eoZyWjYulmo6dl46WmJB4b25nY1tYWFVRSlNVVE9QTlFWS05LT09KUk9JTlBMRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzUxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoaawrK6rqKmxr7GrvLisu764s6ynm7CnrJuPlp2lqaShmJmPhZJ5iY6LinVxe211cGptalhLRkdFQUBDREhMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFhdZXBybIinqsB+dHlie3hvfHmJkHp9i4ZvbYySeXR5amqAgnGWkYuBfpaASZKZbmh3foJtamRseYWQkoZscmx8bnJ8hmlucH9zjYmFhnt+f3t3cHR0hoJ5gXlwfI6MipSDlpeYmpCSlpeZl52WjIOJnpKLko2GkJaAb2pvb29ZVlhUUlFZT1JUVFJYVU1OSE1KTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrLCjraqota+urLS/q7zDv6WimpWkmJ6NhIuUoaGYmZGTi3OOeoCGjIZ0b3RrcGxkbGpZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXF+nh2GaaXN5ZX5vbX96i4l2goiGdGyaknR0fGpqnY9NeYWTiYSOZzF2h3Nsfn6DdGZldX+EhIWAZ2lsdWtxgHxocXF8bpONj3x0fn1xcW52bYJ/d3l1anmJgoiJg5aSkpCLjZGUlI6XjYB5iJeIhoqGgJCId2trcGhmWFJaV1lZW01QVVZZWE5JSEVKSkhHQ0BHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVukoiakZmWo6itnrGep7qvq7KwwrG7w8ealo+UmYuOhXqEkJiUjZCMj4Zxh4J0h4yGeXBycG9vZHBmX1RGSUM/PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+yoHF7eGx9bHGCgoWBeoSGhnlyoZV0eIFzdZSHNXGdqJ2OoaGEooV2cId8h3x0jK6NiYFoZ2JqbnJtcIJ1aW9YdXCOm5J3bX97fW1ybnCAe3N2bmJ2g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2Oe3NxcW1gXF1eW1lYYF9STltaWFdMSEpGSkc/Q0FCSD9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp5+vlaW0qa6xrsGyu8HFlpCMlI+AiHxugZCSiYOKh4+GdYKEbJWIiHt0eHhsd253Y2leSlBHPj82NDQ5Ozs7PT5AQkVITExMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx2iIh8foWDf4x+daKaen6GgYSZhJucYYaqn52Lg5COeneJfomIjnOLl4+Ee11lcXR6fHeKbWhqYnlvhZCCem+BeHWFenB0eXhrbmlddoZ8h3yHh45/ipKXg42FjIZ9cYR/hH11d3t8iXdwc3RmZ2BbW15TW2deV1BUWFtVR0pKREtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIyRnJ2fppGgqqCxqK/AsrvFupaOkZSHe4Z2a3+MkYJ9ioSPjHiDgHOghIp9fIF/cIB+emd2a1JXTEBFMjExMzY2Njg4Ojw+QUVHRkdKS01PUVFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmiEiHuJeXxxfI+Men2Jh36Xh3ahmoiHj5KUpY2tqkiGrq+vi4GAk4qCi4KEkqmHgJiYipx0bXyBhod9jmhnaHl/boWHgoVxhIZHbIB3cnl2aG1rX3Z9goh/h4SLeZSdnImLiJF/enWLdnx4bXB3foB0dHJsW15eXGNjWGdlXFRPUFZZUERMS0ZOSUNGQ0NAQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5GOlpeSl6CeraGmuK+zvbOXjZKLmIt9dHB+iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9Pj9CRUdISk1OUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01NUFdgWHBZXF5pjZOHlYCEgoWRk36FiJGBmpWCoaGYlZubpq2Tmruxp7vHw6iLjKGlj5SKgZF8cYOen5Gcf3aGhYuQh5BpaHCEgXSNh4SKcYaCd4d/e3aFfW52dWZ/lI6HiIiHiIegq6KWiY6Xf3qCiHl5b2dreH97f3RsZV5bW15qXmJnYFpPS05XUlFJUEpETkdDSkRDQEREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZneDe4CMf4GQjoqam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH6ShZKVf4qAkpuOg4CBjIqCiY2Df4qAbXBqXUJANC0tLy8uLjAyMjM0Nzc4Oz0/QkRISU5RUlNSU1NUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUxMS05WYGN/Z2dtdZ2bj5qSk4uNjpqIk4+di6CgkqOqpaOsk6m2oqjBwq7Hr3i6lJp8jaGemYSThYKOop+TmJKEioWPmZGWbHB1ioyCloyNjnePhHFthYGKlpGDhYhxiKCWhpKJjo+WpLWpm42UooOHk4N9f2tqa32BgoN1Y15kYFtnbF1sbF5XS0dOUlFNTExGSVBDRE1GQkNFRkI9OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnF2koZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXl/koiRkn2KhJiSkIKAgIuMiYaQh4WJhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOUFJUUFBRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZunpaKZoZeilJyeqJ6oq5+orKmqtperv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGam5mnkZGIlaKbm3h6fpSYkqGTl5eBlJ57d5WSq7KJjZeffJSdm42SlZijoqa2r52RmaiHlo+NgYhsc3N9gX1zaWBeYmBiaGRgZ2ZcUkVKS1BPSUlMRkZNQ0hMRkdEQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbX1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJi4qEkoWDhomBgIZ2XmJQNDYwLTEvLC4wMC8vLi4wMDE1PkFCTVFSU1FSU1RSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpOT1FZbYWQd5WKo6eqtL24pK2srKeotKuwtrKyrbuxs72cs8OrusnLt8O/uKWisLOsraqji5aYhaamoKOXgaaZjaKrqKWIhZSkoaCroaSpj5uwi5Wjpre7m6GjsJKinaKdkKOhq6+ssrWilKSqiJmJkomVenp+hoBpYmldZmNeZGReZ2dfW09DSUhTTkZITEZKR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhjV2lvWHqFdoGThYeCm4OSkIyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5COg4SBi4WGiJKGgoSJhoiHh3FuYUBFNjQ8My8xMTAtLCstMS4tND9DQU1VUVJTVVVWVU5bUEdIRDw+PkZIQ0VBODs8NUM7PUZLSUdIUU9QV4GSoISuo7OqssDHw6qzxbass7+zuL62v7TBtru6o7jFqLbJx7W+ubWoo7StsLGbmZKan4inr6ullHafpJehrLK0mZaqrqiutruyuqyvtaKxq7G1u7e1rrSgp6ijp5qpr62yube4p5u2qIykjpGTn4Z4goR3WmNlV2diYmRgYWZgW1VKRERMVVFISUpESUdFQUBAS0RCTUc8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWlFiY1d5dXCBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiHmGgIySjIeEgY5/gYmPh4CGiIWJh5F6eG5dVkBFTTw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFZQX1VJS0tBQD9HS0ZFRDs+QDdENz9CSkpFRlZTUF6PpK2jsbTDtrjBzMm2u8S9s7PAtrjBtb6vt3Sxs6W6xKSwxrmxs7G0qKS1tqqxoKKWm6KSpbCupq2sp6SYoKy0u6Kosrq1vL/Mv8XFvb2zwre5t7+3ure5rKywpbCprb2wvLrCwqyZuqiTrY+Xl6qIfYN+bFhkYllrZmpmV1xjWVZTSUdGTFFHQ0hJQUhEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldTWVVadmpvfo6EgI2EbnpzeIdiuaGZooiUlJaSlJONkJaSh4Z7hoGNlYqAhIGKenyLh4Z9ioKBioOVfXd6dWVQXGRHRUw7UWNhW15TRj87SFBFWmNRUlhYWmdZVGBgTFNQRUE/SUpIRUVBQEM8RTZCPkhHSkxTWlRdk664tbq4yL+6vcnMu7zAvLe1u7q2vbS6scZgdbKksZqeq72qpairq6SisrWgq6eflZafmJ+upaempZ+jlKOnsbSnsrO9tsG+08nJ08fDxczCysPAvr2+u7y3tK+4t7bDucW9wsevnrmqoauOpKi2iIGBc2BjY19YYmBqZ1JYYFZRVUlFRU5LQD5HRD1KQT1CQD1GPjxIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzM0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWPc2xyc3OH1cC1maCNlZiZkY6XkpaWjoaHfYaDjJaKfoN/g3h7i4OHfIt5gYqCl35zfXprZnB1WV1cUGVkYmBlZF1bWFdcTWRtVVJtbV9uX1hnZFVZVUpEQktKSEZISEhHQUk5RD9IS1RUVlxaW5O5wLi9t8bAu7nKyrq2ubW4ubK3tbSutraZZHWonK1wXqKsnJigopuknqullJ+fkJSOlpiXp5+ln56amYOknaylqrCtuLC9udTRztbPyczSzM/Oysa/vsLKvcG8wcDExMXKvsjOs6S7sLSvmqu4u5h/e21eYV1aX2FaZGNQW2BTUEtDQUVGRTxART5BSEFARD06RT49Sj8zNzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU0RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVxZaF9vlpKQlG5sb3V1h7OsoaCfi5mcmYyMlZGbkoWKin6Ih4yQi4l8gYRze4qDhXuJdIKKhpV/c3t5bG11e2hyZWlsaWdqaWhgZmlpbFptc5atpLyIh2dbb2hdWlpUSEtOT0pLUEtTUUhMQUpHSk9fXmJmaWGXt8ewuLK7vbWxxMa1sLiwr7ursrGnq7erjbWnnZqnmk6anYyOn5aRppillYqTk4mQiZCRkZ2boZealZaHnpqnm6yvqLCntLTU1NTW0svQ09XN08/NxcLJ0L7JycrJ0cfMzcLQ0bevw7zEuaW1usKig3BlXl5eWWFYWmZaUV1XT1BCQkhFQkg7QUM+QUc/P0E4O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VWc5CQmIJocW95eYOgqp6lloyam5eLjZWRmo59iYuEjYqKi5CHfISCcH+IgYZ7h3KDkouOfXF4dWxxeH5xe254c2xpgXBtY2ptcHhpd3x+y7/B36duY3huY1thYEpQUlVOWV5QXVxOUE5UUVVUXG5tdoJxlq24rLSmr7aqrLzAsKu0pqS4pquuoKu0o46xrZqXmIyRk5GEjpuBjaaRnImDi4SKiYSLg5SVl5eTnJGcmJmZn56rrKSnoqytz9LV0c3M0tTU0NTRzsjD1NHHzdLT09fM0dHF0tbFwM7Hx8KovrfOnntwZ19kXlhhU15aUFFUUE9IPkBGQUJFPEBCPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1OWnWGhYp3bHdwfX5/oZ6eoYuMmJOTi4ySj5aEeYWQkI2KiYeRhn6Be3J+gIGHeoR1hZOQiH9vdnJrc317dntzgXhyaoBzcmlwcXp5cnq+y5p+jLKEdnKEdmhha11DWlpbVmVjWGRqU1hdXWBkXmN4en6LgZipo6Shn6CopaqwuKqls6OhraGjraGnsZ+JppqTkpGJkY+IgZSJapSijJmEgIV+kYODk5ati5WNlZqOhpKRnpensKGgoaWkqMjOz8jCy9HU0tTSztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMPCy4x0cGViYVlVWlRcUEtHSUpKQDs6O0RBRDxCQz5HQj5CQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJ2VnZSFi5WJj4qIjYePgHiElJiKjIiIi4h+gnhze32Dh3d/eoaRlX+DbndwbXV/dXh9dIV8eWyHdnRufXaEdXh8nbWMO0GLxaV+jHxpZVdJQ2ZjZWNnamRueFteZmhrbmlugIOIkYucnaCdkJeYnqOjprGjo7OfoaWdoKmgo7Gchp6SkpKQio6LhoOPhH6cm4yNgoSFepR+gqmVo4yRipeSi32XipqSq7OYmpyonKe9w8a5tsbO0tDS0MvSy8nUztDV2tfX2NTZ2M3Y287J2drR1r7Ly7V6eHBmXltTV1JbVkZHSklFRT06NzpAQEI6R0Q/RENBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc1NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjX2XkZ2LfoeSg4mGhYmBh3x4hZaWiI6Dh4WGeoR5cXp7hIZ1eoWOjZx5i3B8b296f3F7gXGDh4Bujnp1d318gnV+e4aHr3NYqcK2jZGCcG5iPV5ocnBxcG54doFlaG9ydXhxeoyHjpORm5WflYeMk5ugm56qn6CsnKGamJ+lnp+rmYuajJCRjYR9iIeDhYuOoJmTiISHfm2ZeYSYhoiTjI2UjIZ8nImUj66qlJWYn5mnr7W9qa2+x8vJyczL0MnD0srU19jX2NfV29fT2dvV0Nra0dbI1MuWe31qaVxbUVRUX0hDRklIPkE9PTc6PT87PUc9P0FBQURBPj86ODZEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDY1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OjpEP0NHUmpebWRiZmt2gIhykY+agHqAjX6CgoGDfoN7fISYjYeLfoWGgHaCeW57e4eCdHqSno2gdo51gnR1gX10gIRvgY+Bb5KFdHyAhHp2hnuIt8Wkwcm4gZaaj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWlJWPl5CDiY6WmZeWpZyXn5aek5GXo52Zq5WQkImMkYKMhYiIgYaQkZ6bmYmFjIGGl3qIiJ+Xj4iNiouCfaGKkYy8oZiTl5mdqaamrp+otr/AwLnHys7Oxc3J0dbV1dnV19vU1tna29fb2trYztzGh317aWtnYVVYVlZOTERNQjs9PTw4Ojw+OT1ANj0/QD0/Pjw5ODY3REE2NDU1PTgwNjY1NTQ3NzQ1NjEzODU1NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImMknd2eop8foB+f3yEen2CkYmEhXqEh3p1fnVtfH2GfnN+kp6RnoORfIZ+eI59eIqKboKagHSZhn2BiIR7fZB6j6mOj8OhvYuco519iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CShYmKkJKVj52ak5SQlo2MlZ+clKCUkY2Nj4p+kI6Oi4SJkpaanp+JjJSSnZGCi3+lmYiEjYKFhIGlh4uLuJidkZWWoqihnZ6do6+3urWswMbK0MjHzM/T09LY09XXwNfY2dvY2trZ2dfbuHp7em1rZ1hiXFRQT0lDTEE8PD45OTo6OTk7PTY/Pj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg2ODk/PURSU1JYX1ZYZm1tbWmBjopxc3mKe3p/fH97h3p8e4uGgn10g4V5cnpzbYB+hH53hZyhmp2UkoCMiH+Yh4Cbkm6HqIV6oIt8kY2CiISbfZqQioyjoqCQpK6gi5GLhYuBk4ZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlIyGiIySk4yUlJSPi4+Kh5abnY+VlpCKkpOFgIuIko2KipyWmaKjh5OdlqCKiYiNnJCDiI5/g4eGpIaMkLOYnZKVl6Ghn5mSnJ2osrmspr3Cx83Ixs/M0MzP19DR1K7W1dja2Nra19bZ2Z9xf3ZpaF9eWVRYWUNBSEM/Pj46NDk6Ozc6OzszOzs/PT43Ozk6MTpIPjozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieW1ifpGDb214i3h6f3qBfIV7e3aFhH9zcISBenV2dnSEg4V9fpKmpJ+lopaKnZCUl4uKqJdyirGNhKeShJmThJmMopWfmJOImp6jkqmvn5CVkI2OiJaMbo23hZrEyLKboaWbnJiWkLKRZKTNx5WOhoeJkJKNjZOUiYWKiYWWmZuPkJSThpSXhH+Pi5mIjZCql5ejo4iZn5aaiI6Hl5eKhI6NgX+Ij6WJjZOpmpeTl5mhmZ+Zk52bo7O0pqO8wb7HxcXJyMnCy9PNzdSp0tHW1tbY2tTT2s6Dc4FpZWBfX1BLVlxCQkZDO0E9ODM3Ozw6OD02NDk6PDo4Mj85OjI6STo9NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdYKOfXxtfoh4en56gYGCfnZ2gIJ7bG6Kfnl8d3h8hIeLfoujs6ikq7KhlqegpaSWla6ig5C3lZKzmY2hoIukm6+ipJ2YkKeXqZmtr6SXlZWUkIuYmpagwI6jybirmqKlrZmRm5yynYaFqKKcmIWIiY6VjYuTj4eBhoeIk5iUjIuTk4aUmIaDkZCcdJGZspaXpKGInJqTj4qQi5eaiYqWjoZ9jJmfipCQnJqZk5mYn5SgnZWfm6GyrqOlt76zxcfEvcPDv8bOysnSp87N09LQ1tjSz9i7c3t3XmJXYlhRSUpPRUJDRDU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTw1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdOW1xZSmdhO0iEinp7bYWGeXyEeICFgH1weHx9fG9zjHp9gnt4houJhYSSp7ytqbK9r6Wus7Ooo6KwrIqatZ6iuKWVraSXqa23pqSjn5mpmKqkr7CpmpmclJWRmKCXmbu7rcmgaba4q7CVmJ+iq5KXvaNeqrKCiYqNlYeRfI+OfYOGjo+UlIiHkpaLj5WNi42XmZKdmbSWlauei5yUko2QkoyYm4qSno+LiZWfoo6VjpianZOcmJ6VoqCUnJylr6iipbO4q8LIxLW7vbzFyMjC0aHGyc3NxNbW0MvTonF8al5cVWBTUUdEPz1DQUI4Pzg3ND5GPDw2PDM1MzQ1NDU0QjM6OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo5Nj49NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGVIYmBjcEpAi4p+gHKGh3yBiXWCioJ+bX19fH9wd4d3jYGHe42PjIaMmqvCwLC+xruztMG8tKyrs7aMqLKurr2rm7qkqK25t6umpqKho6Oqr7Kxqp2co5ibmJeeoqWlkqO5rqjAu6ytsrmlpKd9iIacrb2wg4uMi5CDj4ORj3qBh5CNjpyIiI+XjYuVl5SQmpacp5uxmpGrnY6Zj5KOlZCQlpePkaCRiJWbpKyVlo+UnJ6UoZ6bmaChlJqeqKekoaSws6bBxsOwsLu2xcTDvs2nx8PHw7zW0M3Eyol2dWRfXGJdT0tDTEBFRj5BP0I7OjQ+QT09NT02PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxnR2BpZ1pdW5OMjIh7h4uGg4x1hpCKgW5+e4J/cX6BepV6kpSUmJGTlai0x8nAwszBw7rHvLqvq7m7l7K2urPArqXApKuwu7uqrquiop6nrK+1sKqboKqcopyWn7C0p4ujurq1wburqJyypKSolISOqcPEpIKLjoeIhIaVlI16g4yRj5GhjIyUkY+JmKCXk5mUl6agrp2MqpyOlY+SkZWVjpCVkY+hlIaXn6Czn5SblKChmaSfmqCcoJSYnqekpqekr62lv8TCrqm3tcnDvrbOssW+w7uz0cnIwbV3e29fWl5sVE5JRE1LS0lAQT1DRDw1QUQ7OjM9OEIzMzIyNjNBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJnXE1lXGZUY2qZjZaJi4iSj4aJeYaTkIFyf3uNfneHgYKQeo2hlqiampi7vsnIysLSycrCzbzBs627vqe6v768w7iswamss7u9qrCppKWjrK60rba1oKCun6WimKO0vambqLzBo7a2r6uSr6yqq5aGmqmmpZGCjJOllYmAdYqSeYWNkZCeoJKOlIuPjZSjmZeblJSjnqmfkaWajI+Pj5WWiH2PlZKSo5qVoKKctaaQn5elpKOln56mmJ6Vl5ylo6moorKtqLvAxK+ls7fMwLmuw7O7vsG5rcLCwcCZcHtjW1leXE1NTkpHRENIQkJBQ0s6NERIOjs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+a0lfWGFaZGVWno+djpeOnpKJin+Jn5KEeIV/lX5/kIiKkICVoJmup6OYw77JxMjG083Ozcu8wrewury0vMq8w8G2t7yttMC5vK2vqKCpp7atrqmyt5qerKKnoZ2rt7ippa++xLG9ubOnqbOzra6WlaWsp6CRjpKxxaeVjXyRlX2HkZmPqpmYk5OPk5WTpZ6TnZmToaOinJifmYuMj4+eiFqQl5eSlqWZZpmjn7OllqOWrK2rp5yfp5eYlpiVoaSopp62rKm6vMO1prS2y8G4qrass7u4rqi4ur24g25wXFpWV1BHS1NNSz9BSEVER0ZHODVGTTs+Nz5BSi4zMjAyNUI1NVBXTjtMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVzs9QEJGQnJGaUlSZWJMRqaUnJahl6iWjJCDh6WSiIGHgpyEg5WQkZSOmqKfr76uoce+xsXIx87OztLKvru2sbq7vL7OtsS9t7m3srK1s7iyq6acq6u4q6mosLCXo66kp6SltMCwqqyzvsK6wLmzp7izt7OulaWtrq6ki5OVoY1zwZl9lpmEjpaai7GVmpqVkpOZmaajlaCblpqonJuhoJmLjI+WnWBKlpyalJqll1SWsJ+vnJ+llK+vraaboaaUk5mZjp2gp6KZtKmqs728u6uwssfAuKarq62xsaOhsrK0pHJxZ15cUFJNRVFRUFE7SEtJRkhBQz45S1Q/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVg7OkJDQD1SRVdSc2JXRkirl5mfoaiumJCXh4unlo6IkoWfiIScl4+eoJujpbXJtKnGvMPEyMrJyMzOx766s6+5uMDBzbXIusC4tbqxr6+ytKajm6q0tKuppq6smaSupaWorLq/qKu2tr/BwL+4s7LCr7e9q6OutKy4pYibl6abdr6ghJicjpOZmouulqGcm5eVm6ChqZ6ooJqaqpmhp56XkI2RnYNudpOimpWdop+QrrKjq5WpqpirrqWloKWqk5KZnImVnKKelrGnqqu6t72zsq6+ubafo6eopaacnKypqY1laGJgU0xNR0hOSlVMPU1ETUlKQUNEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5TYU1WSH9lXkhGrJScoZ+7rpiUnouTqpuRkpOJq42Hop6MpKyUo6O2x720wbvDw8jJxcLOyMK9ubKvubTAwsq2xrHBvLW7q6mtrK+jopiqtLqmqqesqp2or6ekq6u+vKisvLO4vsa8t7W4wLC9v7OptbarvqSPopeRop+8n4maoJmXnp2Ot5+pnKWjm5yhmqels6KbnaWcqKqemZWPlJqLl4mNpKKUnKKfoLWvpaaTsauaq62fn6WkqpKWlaCEkJ6fnJWppaKhtLW6ta2otbKynpyippqXlZmqoZ54Yl9hX0xJR0hNUUlNRUZGQlJKSEFER0FWU0RIPEFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRaiXpJ6ew6ybl6WXmamclpqaj6qWlaimla2smaGqtsTCvL+4wcPByMS/zca7vrmysLizv8PItcCwvLe5t6ekq6usoaCaqqrEoqWprKaerK+soqqov7imrL2wt7fGtrW5uL6wvsG2tLK0r76jlqOWk5uUrZ+QoaGlo6OfkL6lqZ2orJ2doZumn72imKSeoqmroZ2WjZWek5+Hj4WNk56koJ21rKaclrKnmbCpoJurn6GNmpWfhI6hmpuSpaSamKyxtrGqpaqtrJyYoKGSjpCVqJ+UaWVbYl5QSkhLT0xIRUNJQD1PSEA7R0lIW1JPSz1ITlU0QkY5PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGZjWE2imqObnsWroZ+snZ2tn5KinpakoKeqrJe2sKOqs7bFwr3AtsDCvMnCv8rItri1tbG0tLfBxre+sbi1uragp62qrJ2en6WkwaWgqa6gpKmtr6Kmp722pbG7t7a1w7Kzt7q+scPAuLiutLS0opyklZGToK2fmKGdqKiroprDramerK6bm56YpqC9oZ2kmKurq6ahmY2an5KeiY5Yf5aepqGguKqnk5m3o5+zoqGcsJigj5qUnoKPoJeWjaKklZCmrrOrqaKipaWVlZyZi4+Rk6SfiWNnXGVhTUpLS09GRUFGSz49SUE5OUpKTl1RUUk9TFdcOUZJPURNSThIY1xMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dzSEU2PXVlXExPnp+hmJ7Dp6Wis6GcsqeTqqSfo5+tqaydu7CorLWyyMPBw7PCxL7HxL3Fyr2wsLausbWvv8W1urGwuratmqmxqaqanqahp8Ktm6yxnKqirrCppKe9t6a2ur2vt8Ots7PCv7HGs7q3q7S2raqipZWVlKOroZ+fmaerr6+vu7KmoKmpmZmXkqKkuKGhpJKur6ykpp+SoZ6Vno+RjZWdmqOfp7Snp42YtJyjr5ufnK+RoJSYlJqAkqKWj46goZOLpqywpaeinaCekpKalIWLko2cn4BkaFxoZktKTEtTQkNASUc7O0Y+ODlOTVVeUlNKPk9eXj1IUEJNTEk5TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVV5mckA4PEiWd2VBNJ+kn5ugwqijqrGho7SplrKrpqKksqyuqbuyrbC0tMa/xMS2wMW+ysW2wMnCtau1qbG4rMDEtLeurbe6pZmrsquqmJ+ml627tZuosJutn660sqequrOnurO4srjAqreywry0xae9rq23tamnrKGXlpGlpKGhl5ekr7itsrW2oJ+opJmUlZOjoLejpKWVrrGypamlop6ampqVmKifnpiinq6yoqaNmK+ZpayYm5+mkp2PlZiahpaflIyQnJ6Ui6mpq6KnoZmdloyPmZCBhpaJlZ96ZWpdbGtPUU5OVD1CQU5DOzpJPzc3UU9dXlJWUUFXYFxCSlNIV0tIOlVkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM5MDZwW2JIMDVKcGlWQ1dGjHlmQzukpJyhpb+mp6+voam1qp25r6ukqrS3sbC5trC3uLjFvcPHvbzEwsfBucHHwbqqtqWtu63Bw7e4qq2yvKOVrbCtspelqJGquaqgp7Cdqp+wtLOqqba2rLuss7K5t6y5sMG5vb6mwquwtq6pqqumnZiYqqGhoJGXoLCus6uwuZqbqZ+ZlpKXpqC3qaWioq+xs6uxp6ufm6Cgm56lnaGXnaOzsJufkJSmmqGpm5akoJeZi5aZlJaXnZOIkJuZlI6pqaego5yYm5OHj5mLfoyXho+abGptYm5uWFJRWlRBQ0VVQDs7SEA3OlhQZF5QV1dEWV5eTUxST19LSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNzQ3Z1lgRihAOGx9aFxWOol7Y0M9qJ+coam8oaqwqqOxuKmltbKroay1va+zuLy6vbe2wcK/ycS5xcPBwLnFvsG4r7anq7eyvL+/taqusrifl6ytqK2XqKmOp7ufpa2znquisbCzrKq2s7W9ra+xtaywtbHAucS2q7yvsbesrKmisaWepKifo5aPmJ+yqrOpqrOZnaebmZSNoKaktK6noqysrrGnsqyyqaObn6iknpWgmZuotamXmZKSn5mfoZ+SraCamYeWmYydmp2Tio2Wl5qXp6ajoJ6WlpeUgZCVhXuPk4SMl2dtc2hwc19HWWZWRENOWERaOUhCNT5dUmhcTlldR1teXU9NUlhkSkpDXGNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfXmFWMTUxPWBWXjgpQzNZVVxnSzWMemZMQKSZoKSstqOsqaWurraqrrS5pqawuMa3sbe+wcK1tLvFvszFucPBusC6xLjBubO1rKq6t7u6vrWrrrG2mJioq6qrm62rj6u9nquusaOqn7Gts66utrK5t6qtrrKnta+0urzJsqq1tLG0r66moLOfmaisoKWVlZqZsaKtoKWvlqGkmZmSjaKlprKpoaaxq6q1pK6wta+jmJ6tp5uXnpmZrLiil5OQj5icoZmYlK2gnpWClJmOnp2al5GLlJKemqWjo6GZlpOSlnuMkYV7jYuDi5RsbnlvdXxhRmBqWklIWls9e0pHRTZBYlRpWk1cYUpbXFpSUlNiYUxLRWBhYFBMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuKkEvSkdQW0czY1lUS0SZl5+vqLGprKWjrq61qba0t6OrtLfKurS7ur++tbS3w8HNx7zEvbe/wMC4wL2yva6nurq3t8K3rK6yuJWXpq6rp6OzqpSvuqStsrGmp6Kys7GysbWxt7Kprquyp7ivtbPExLaptLWrsK2pp6K2n56msaCklJuYlLGdp5ufqY2pop2blZelpaS2p6Kws6unsaetsLWspJmhrKicnJ2blKq5nJWOjouYnKKYkZioo6CXhJOXkZ6cmJeWiJaPl5qonaShk5aSkJZ3hZGHfIaChI2NbnF4dnx/XUtlbFxKT2RcP2J7R0k4R2dXZVtNXmJNWFlXVVhUaV1QT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSWcyNydGYUxWJS1CLj1FTFE8M3JrS0RDkZikraSsraumo7Cys6q2sLafq7W6yLmuwbvDt7OytcLDz8TAwr60vcHAur+9s8SoqrmxtrfAvbCss7OdoKewraWmsaWesrWsq7KwrKmotLqstLO1rLSsqauorKm5rbGwx764pLmvqa2tpqessKWjo66jqZydm5qvmaKjoqOQrJ+joJ+hqaaluKSrtLSkqquorK62rqKdo6iqnKCZmpKktJmPiY2HkaOglo6Vn6GWlIaQlJSem5mWlYeYkpWZp52goI2TkY6ReH6OhX19fYeKinJ0c39+flxSZG5eTlpnXUZElltHOk5tWGJbTWFiTlZWVldUWWdeUVJMZFpbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0NlOzYqSGRISis6ST8zQ0lTLD6Paz5ISY+aqaqhqa+kp6OztLG0tbGxoautvcy6rsG7xrG0rbTCw9HExr/Bs77DwrzAuLzFqK23rLO4vMGxrLKtoaSnramopLGjq7Gqr6uxrq6tq7O7p7exsqmyqaumpaOtuqyqsMK5tKy5qKmoramnsKWppKKuqqiinpyirJWknZeemKudoaeooaymoqyrt7GxoKmin6qtsKydnqanqZqjmJmPoKiYhoOOioufoJCMjpeekZCHiJGVoZ2WmJaGlpOTl6WdnZ2MkpCOioB/iIV9d4CHhYd1c3KJdmxfWWBuY1FzclxLPIR8Rj9XdVhgWU9jXE5VVlVXUFxhX1RPT2hYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkswLklnREY4PEIwNUVLWDFAlFxATUaVlqynoamxnKipsLasuLSuqqSrq73Ju7G+t8OvsK2zxMTOzsO/v7TBxMS6wbTJxKyvt66yusC/tK6uq6WoqrCppqiyprStqrCurbGvs6yzuqS4s6ysraeroKKesLerqq26tqS1taOpqKysqqygqKamsbKjpqWhoauWqaCTmqCmnqOiqqSsop6msbesrKKlopqpqq2pnKGlpKSZoJqVj5idk4GCkImFnaCNi4+Nm5CSjIWOmaSck5GbjJORkZSjm5uai46Li3yHgYKCe3WBhIJ+dXeLpId5a15gbmdXZodkTkBnkkxEYnpXYlhSZVVNVlVVVE9cXWFWS05pV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIZBSUhElpGvpKKpr5ipqK21q7awq6Srqqm8wcC4ubO8taayr8TJy9G/wbu5wMDCusG6wsSusbWytLvBvrOyr62rrKi2qqWtsKu5rqiwsK6xq7WqtrWmtLarrKSpqpyjnbOzqKiks7Sgtq6hqairqKumn6urqLm2qampqaGpn62bkaihnaCjoqaiqp2bprSup6WpoqOXpaanqpyio6OgmZifkY6PmI1+h42HhZ6eiIWLi4+PkY2Fh5ajmo6NmpGSkY6Tn5iZlo2LhH90h4GAf3h1hIB7eH6AiJ2PcHJnZ3F4XGF0iGlPXZhWSG15VWRWUmNPTFZUVVFPWFpiVkhQalRWU0dQWVVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyP2Y9Tlg/Qyw/TFRfL0lrN1FFO5WNr6ClqqyZqqStrrO0rqqlr6mpu767wbGvuK2ita/Jx8jQwL+9u7zDvbrDwcC/r7Gzsra9vMGysrOrtKmltaikrbOyuK+irbWxr7G5qriuqq62q6qeqaugo6G1ramhnq+yobWqnqioqqOqoaGsrai9r6yurKGnp5+smY+vopiioKinnqebmKmwqKKfrKKhkqGioqaYmqilmJiYnY+Kh5SIfI2GhIWkloaDgoyHkI+RhYaUoZeJkZ2Qk5CNkZ2Vl4+KhYZ4c4F/fXR4eoF7dHR7aoKIpHZpXmVsgXVniIt8UldwXkt4c1RkU1FfTU1TWmdOTVdZZVlHU2pSUT5CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWk6MzhfPWFkP0YxQ1BbWytIUDtZQzSPjrGfpKWqo6WjrKa0s7CppLCnqri+wbywqLmqp66wycbI0MK9wL65vr68ybzCubGwtbK6vLnAs7S7rbmso7Wmp6yxtriypqe6ta20vK+7pa2ttautnKmvpJ+lrKqnnJ2qsqS0qZqqp6qkqZ2iqKipvau0r62dqaOgrpuasqKWpJukpZ+kmpmnqqWemqmhm5GboKSdmJapqZGZmZKQi4KPhX2PgoCIno+HgH6MiJKQkIWBlJuUhpOijJORi5Gbk5WHiX6Acnp5fnxod3x7dXFyfmmGeoSIZGBoY3KFe21oeV1eVkNYe21UYVBSWUtLTXB0XUlaW2haRVZnT0M+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpKwmZ+fqaWjoaqktrKxpKmxp625wb21sKO5raiosMPJyMzBt73Atbe/usi2w7W0s7Wyvbm6vbatuba/raKzpqqrrrW3tKqduruosb+yuqCvtLaprJ6usaOcpaepo52cpK+mr6Gfqqmnoamco6igrbunrrGuoKuio62enqymmJ+boaKcn5qZoqqimpmjo5WWk56hlpuWpqyLnpGPkYyCin9/j4F7mpSMiX1/jIeQj4yKhpOYkYeUo4mRkYeQmpCTgYh8eWx9dnl4Ynt6cnBxc3hqgnVqg2djaGFuc45tYmpwYG9CXXlrVl5OUVFLSU1TWVZNXF5tV0RYYU9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUl09I5GXrJifl6ejoZ+no7evraKvr6mrucK6s62fua+rqLS6x8rIv7fCvq+0vrbEtsOysLqxssC2u764qbm4vaqktKaoqq+tuLCpmbm8o62+tLOhrre1p6ansLOgnqSlp6GkmZ6sqKieoKqup6Cml6Kon7C4n6Oxr6Groa2km6amqZqam5+jlZybmZ2pppaanqiRmJKYnZOZlqGqkJqJjY+HfYd+go18fKGMjIh5hI2Fio2NhYmTmo6JlZ+IkJWCjJeNkX2Ee3NwfHFzdGB5eGpvcHFwan9zZHpsaGZkYmaHgGBbcmpxTU6AaVhaTVFMS0hQUlFITVxfb1RFWFpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MF1bNSiVm6WYnJWsoJ6hpKG3qrCjtLSpqbrFtrKuoLesra2wtcXHwLa/wrmwtby2vru/r6y+sLO/sr3Duam7urinqLWop6uvq7OvpZm8tqSrurWun7G4r6mlp6+ynKGkoKSkoZabr6ahn6Oor6GgopOjpKK2sKGmsKufq6Ovl5uqpaifmJqdpJOam5mcpamZm5uklJSXlZyOk5eiqaGQiYqPhnqDfYOKeY+Xio2HeoKIhImNj4WPk5iMjpaZio6WfoWXjI96gHpwcXZub3RfeHdlbWxsamqEb2ZyaWtmaV5kdIFgW2t2aVpKf15cWE9PS0hIUlVHMzleXm1RRVhWWWVNSElFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFVdaEQuPDJkVywylKGhl5Sbqp2koaKht6muoLq4pay9xbOwrqO1r62trrTDw7yzv7q3sbO5t7m3uq+uwLO0ua+/wbisvbq1pqKyqaepsqqtsaCawLWkp7W1qJ6yvKmnpamvrJmjp5ykpZSYobGlmZ+kqKmcop+SpJ+juKikp62mnaWhqJKfqKKhoZmbnKCSmpuWn6Gqm5qYoJSQk5aZjZOTo6ikkImJjoZ5hHqDhX2djYmKh3qBhIeJiZKFlpOSi5CVk4yNlHuCl46Ld357bHRxbGxzYXd1aWlqZ2dvhmhoaWNmaWpga2NqaFxle2NgU3RUXFtTTEpHSU9TQCEqaV5qTURXVV5gS0lHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z1AnMp2io5GNpKebnp6do7Wsp6q6t6esxMG2sKyjta6nrq+3v7+8ssG3sK6ytrW4tratqr2zrrKxvb+4rry7saWftqqlpbOoqq2encCrqKWvsqmstbueqKmrsaWYnqmdpqSRmaatopiepKmhm6Gclp+dp7alr6quoaGdnaGUoKafoaCam5mckZick6Wdq6GXlpyUkoyVl4uPmJqpoJGIiYqIeYV2gYKCnYiLgol9f4WIh4aQhJaVkI6QkZCRjJJ7g5WOhnN9fWZ4b2tqa2d1c2tjZ2RkdoFjZWZmZmpqY2tzWl9ZXW1kYU5pWFpgVkpHSUtNUlg+OV9saUhDVVNcW0lIRkZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQmhIJTWao5+QjK2hmJiflqSzsaKxvbahsca8urGxpLesqq6puby7uq3Asq6urrausrizqKu5sa+us7a6trC4vaymnrWqoKCvo6munKLAoLGjrq+tt661nq2ura2imp2nqaWflZqnpZ+ZpaKonZqfm5ScnayvpbqnrqKhmpqdmZ6kmqSel56Ym5SZoJKolamnmpOampGLlZmOlJSZqaeOjYqJj3yCdIGBipiFh3yJiYWFioyKkoSUnJOSj5CRlo6Qf4CMjYJwgH5meW1oa2lncXJrXGhjY3SBYmZoam5sZ2pqaG5dbGx0cGFVY2lkZVpJRkxNT1hRUVZhZYFUQFZTWVVGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyc0kaGajY6wnpqToZmosq+fuL+2oLTCu725saa2sKiupbe4t7etu66sqqu2qrO4raWztbKuqbC3trGztbqmqZ+1qJ2eqKGorJqnvpito66utLWtrJ+xra+popydo6uonJScpqSdmqqipJaan5yQm6Orqqm7n6ekoJiZmZ2hj2uilpmccIKVmqN/dZGpp56UlJ6QiJeZgJaKoZB4hpSMg25pfnaDcWyGi4Z9hIyHcF5jYWeEmIZsi4+UknR3i4R+g49/Z4aAZ3VoZVdcaHNuTlBqY2dzhWdfZGZubWpdYGGKj4OEZU5LRDlGVGdeSkdQUFRVS0hSYG90ZUZaUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzU2OCwjMScyMTQ6MTc1WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoujmYaVsJuck6Cbqq2qo73Fr6m4wri9vK2ntrClq6O3s7KzsbmtqaastKavtaKouLa2qKest7OutK2zoames6qeoaObpaaYq7qVpaWvsratrqSprquspaGfnKCnp5uXoKWlm5unp52Tn5+YkJ6nqqO1r6Oiop2Wl5eXo4igjpKah6GHk5ygf6R/paqekpGakYiEcniNjoWIoXaIjGmXiGZ9cnihb4iHhH6OfX+hoKCZgHyHnnSHjnabimyHgYNsaGVjemtxYVOFbWNsaZhxWWpwb4hYXmlbbGxbiHFuenKFZ4aEWl5HTj9HX01FUlZWUVFSV1RnXk1XSVJTUEZHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3MCiLppaDnKucmZidn6qqp6q/w6+xur23wL+qpbewqa2lsrSur7O3qqmlsK2ltLOcrbW2tKanqLOxrbKorp2qoLKooKOimaGhmq2zlKOkpbW8pqynq6qsqKWhoJigpqOZmaWjpJicpKmWlKOclJOkpaaht6OjoKOYlZOXkpyIr5CYlImpi5ehm4WxgKOsnZOZnZR5g9SogIeVwZvHeXixpbeXZIDAnL95hIR5kIR8kJCRynGXvJzFenK1pruQe4BslrGrsHhoa1ixrm5labySvG5oem9ykNh+U2tjtrJ/gXKVdJqhqpBXT1diUFZORlVbWFFQUoxcV1xQQFxEUU5FR0o8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjaaSgKeqn5ecnaWtsqixwr2ytcC1t77Cq6azraypp66zqa+2tKenpbSlp7eunLOytqqlpKeyrq6xpqqdp6Sxo6KfnZaanp2uq5Seop+zuaOqqaKtrqWhnZuaoqefl5unoJ+YnqenkZynmpOdoaaioLCin5+jlpaSl5KZha9raoqNqn5ng5WGrWRwnZ2UmaWUca6hpH54u31roY92sV9qtFulgGackWBmgnpmf2p4a6lkvnJnpox1sWp8sXh0kpNjbW2nbluEoEVoZoeWRXWcYH5ofKSngllfi6tpgJZ4eWqnN0qvXFhTbGRbS05YX1xXVjtOiU9YVy9JVFRKREZGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMwG5CilYKsp6Weo6SqsrestL2+sLbEsre6wqepsKuuqamwrqOwuq+jpK2yo6i4qJ6zsrCjpaCqra+sr6ann6OisJuim5aVlpqarKWWm6Ges7Kiq5yira2gnZqXoKGonJido5+cmaGmpI+dopqXoJ+qnqamoJufoZWVkZaRmoW1m7V4hamZtZl2hrObt36TlpaolH5sgqZ7goaIkpSSd6tna7Fbq3uPh5R0iXGPhoB/iJCXeIKCi5iMg6CPhLB2d59xa2tsfItOpFhIY2OZfmNopmB5c3VTk4deUKltY3F+h4BinC5RoW9bU2toYExLW2RYXFpCPrF5WFhBI01oRkNFQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o4YVU1MBuVn5WHs6amoK6pp7Ksqbu2wrC7wq24tr+qrK2trqatsamhrruqoKe0rKOrtaWms7Ono6Kdp6qyqLCopZ6fn6+Wn5iUlZWXnayhmZmkqLSuoamPqaiqm52VmKClp5qenKKfm6CjpKOVm56XmZ2iqZulmZycoqCWk5GTk52D1ZOZuXCwwn7FhnzWlJu7fJqVpI+NnI2ke46HpIKlgnqseY+dVq96iH6farlauXaHhH2mgpN8mHqqeY2dkHuxbo6EdJC8hW+UUK+nxYpRoHpjYKlic3OIbZeIYFO1tMiGgIl8Y6QzQp12XVBqaWRQQFhnWmRhSkhObU1bUk9ZZllDRD9FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFRNzElm6KTmLGoqKWzqqW0qaS8t8GwucCxtbO6s7WnsbCjsLKmn621p5qnua2jr7Ggs7SwoKSen6epsKm0qKSbnZ6rl5iXlZeVlaCpnJmWp62wqKKfj6yiqJadlpuhpaGYoaGhoZqhoqabnqGelJmbpqCbp5Wbm5+gmJCRlJGdiLJuaLVxq4dujqZytHNytnual6SLj52No3+RoaV+sHaDkdLSdlyue4V/pG+bqqZrh4V9rX2XmY97sXOSnY95s2WWdISeb55mlFLIi1rCXJ95Yl+tYHZ0h2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPa2BsaFBVR0k4PVZRWldYSUM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTTYyMKGdkqWvraSqvK2mtaWntru8srq/t7WzubqzpbS0obGxop+rr6SXprmtpLGwnLS4qqCmnaGppLKorKmkmZuaqJ6VlJeYkpKip5+WkqWqsKahlZOtn6WSk6CbpKaflZqlpqGaop+tmaCenZCVm6GdnKWUnZWZop6VmJWRm4Wse3eodqOOiIapb62KgqeDmJihiZKaiqJ/k5mJroV/grNccrNSrn2DgqR/cdd9eIV+j52GmZp3r4aKkZyIeLNhmmWagYKUbJJasFhLmnWYeWZgrV52d4domIhrXa93lZ6PeGw1eciusl9CVG9eZ2BFUG1fcG1WVU0uZWNoUlhRO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEk6OTmfnZSfuLCXtMGtqLOoqbK6t7O4v7m3sbS7tKS4s56zrJ+eqKuelKe1q6ixsauttKSbqaCgqKG2p6apopmdlKShk5KbmJGUoqWako+mra+moJWZqZ+ijpGhmqikoJWZpaidnKSerJyhnaCNlJ6anaCYmZuWl6Ggk5eQpp6GqX19pXihj46CqnCti4GnhpafoYmXl4ijgpGIlKp8gIudeG+xWqiCgoigeXTYf3aIdKiBjpuNkqN8lpCfhHuyXpxkoH6DlWySXKtbWpN/kX9oZ6pkcnuBa5iHc12sWomgjmtvZU9KQ6FcW0x0XWJnTVthX3JzX0pWNkqbk1hIRT1HRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMj84oZ2Zmb+rl7TCrqytqaa0sLextb+5ubGwtbqpurSer6SepKennZOqsKmvqbWsqq+hmKGgpqWkuqKjq6CWm5GioJSTnpmTl56fj42LqLCvpp2Wm6imn4ySo5eoqqaUlqmnnp6go62joZ6ijZWhmJ+fkp6XnJWdoZWWjqucj65tcrRyqYx2iqdztHhzs4CRpKOSnI2JpIeQd7hvjHuLomprtlqghWWXl2mhoqdtk3K0dJOYf7JqhZKIrWt1s2GdZqJvh5Jql1ytX02hfIeRUnOjbHl/fm+Yh3Fcr1Y8nHdlVG9uLlynT2NTa2VibVpjXWFwe2NUWlE+Pm1vM0NCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKWam527oZyywK6uq6unt6m4r7XAtbuwrri2qsG1qKigm6WkoZyRqqmntaOyqK+qoJecp6Ckq7ido62blpmPpaOVjJ2gmpicn5GTlKq2sKeYlJysqZeMk6WZpayikZaqsqOfnqarsJmho4+Zopafm5acl6GSnKmclJCrmYfUkpq7c7DDgMOGftWWm7h4iJCYjJiKjKeIeqO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2VgaypcXt/dbyIp6BpnWGmjq+hfox0h6p9vm5zvHSyg3V4gYtumohxbo2kdL1ed31bYXm8a1pWXGp5XmphZWdibXhvWVtZQ0FAckBDRis1RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03Qjmnm56hvKKXscOwraqrrLGnuK+2xLG5sK25rq3Asaujop6joZybkKmjqrKktaatpZ6WmaqZpqy5naOumJSgkKWfkoyco52XnZuRlZKuubKslZejp6eUkJaknKSsnpCgqKufmp6oo7Oeo6WOp6KUopqcl5WjmJCvoJKUqZ6FkJm1f4+RjLeVeIKTmrV3bWtuc295j4SOiXSewbu9mnuBsqhwgHSRuYN8hoaMho17ioeNl3yku7m9nHV6tKN0dpd1dLB1mZ5mhmqNtXRycXe2jF6Aen2KaIN5bXlji6xwdYV/WVunakVlWlRmYGNeY1FoZ3FtdUJNUExEOlpNP0ozOzAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVzgqT15dPSs6VlYnPjs8p56gob+llrTCtKyrqKyrqbqusMWutLKttqa0uKypoaGlnqCdmZOrpK2qprWnp5+blqCjnaykvqahqpeUnJChmpGPoaihk52Yk5eUsbW3rZidpKSiipKSpZulqpuVqKWlm5mgqKamo6mhka2elqOel5eXnZ6PsKiUm6ehjmp+aZuleIdyfZqOdHpkh3u9vsC6b5KCcZWHYXNqWl6bimFjiI6Va2CAlWRtnXdilWuAmpWUZV5gY3GaimlyjH2FlWdqfnJ0eH1+Ylt3dIFoUFxuhH18i2tYbHqCc0pKb4ZwTnRMRVddZ2FMWlhnY19PW251aXJST0RFTjtISD1NPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBfTCgzPVtPJz8yPqigqKHCo5q0ubWjrKWup6e1savIq7CyqrSivbGxpqCiqJyim5mZrKavpKS1qaWbl5Whm6atqL6nqKaVk5uVn5mSl6SpqJCdkY+YnK+yv6ybp56nooiTkamaqKOam6ygo5mZoqesop+ropqxm5SnoJaUnZ+dl7Gkl6GomZyRnZyio5iloZqcmpqZj5WBZ259cXeSl5SRhYu1qo2GmJWOioyYl4eUlYqEkpSRiY6SlJiUmJaaoKGanJShno2CeqSGbGp8kHyAdYqKgXGCeHl2douAfIprc4F0g3Vldn13a296bWBjXXBoTVhaZmpgV1pwem5tZlNPRlM5T1lOUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCzobOhv6GksbK3oKqmsqelsLSqyKutsKS0pcCns6CdpKSco5WVoKqnrKOjtqufmZaWn5etqqXBnquklZKcl52XkpOin56ip5ORmainssSvmqudqp+Ql5annaqbnKCsmKGam6Gkr6ahpaifrpiXp5yZmqCenpyvoJyhppWXkpiTn6CVop2YoI6Wk4qKjY6XrpB8lZuCkoKLqqiGgZmXioSPn4h7hJCHhpqSiIaKlY+bl42RmJ2jlpqTkZ6Nf45mobOvhYqEdnuSin12eXpvZnqRgYCJa3WBeYhzaXN/e3aDhoJrdWR5ZmBqZWNkZmtZbHtwaWpcU0xQRF9URkA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0XEc1PCxAtKC5r7+sq66ysaCrprGtoqyzsMSwqquisq28o7Obn6aioZyZl6elqaakpbK0npWUnZmZsKWuvqCropCRnZqZlJGUopyXqJyEnqqrorPIs5+qpKqWlpeapp2omp+jqpOen52gqa+ppaOroq6bn6CgmKSenJ+dr6OYnqiTl5abkKOYl6ecmpdlgpJ8ZX6NmpBkeY1saGt7kqSqamWamH5nhoplZWloe46hj2tojZeRo3draouZo56Zc2xue4SNh3pYZV6Ggl5ti4mBdlxoc3d3koCHgm54gniAc215hHR2iIiOg3xqh1lebHVkXXOJaWt8cWtjXlJOV0pkWEFKND5HNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMVlDOz8uPaWfury5r6yzsaqlqK2tsKatrbC8sammo62usJ6slqCjnaKZmaarnK2jpaipsq2elaOPoq+ltrmlrqOOjpqhmZOSmqCZmaWVe6Wtoqi0xLikoqevnp2UnqKeo5yjqaiRnqGdoKqwqqukqqCqm6efp6CrlaGbpbCkl5uqlaCdmpGklp2pl55+vYOIcrRyhJ2GrWh4ucS4cZOio3qmmZlzqoJ8y8DAu3GMooiCn32WmImdwL2Cl52djZ3CwXyCfJKNmsPAfWulsm6MgW/Ken+bd5GDjoF2eoGAeXF6f4dwd4WMk3lueJRjZl95ZGBlgmNedGhsZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JRLyNGWzNQWS9VQUI7LziWo7nDtLCwwKmolKOvqbCuraaztK+ppaamsKufq5iaop+cmqqnop2so6WopKS0pJ2ikqatq7izp6+ikZGZnaWSkJ+hmJufnYenrKSrrcDAsaCpr6mXkZ6doZmio6mjkqChnZ2trqmsp6Ojp6GmpZ2tqJGkmqitqZucqZusoJWVpJWgopacf86UeHqkgXmVlptfro9ejqeBoqB9p5abdKuDgK9eY42qe6eHhaB1l5OIs2OCq4ahjo2zaoWvdH2XiLdhg61Zo81tkHV72nt/mXB+iJJ2fmV7iHZ2a3yIbn2FkJF+bYOQYXJscGhgX3lkXHFoamRmYFJUUlddS09DNUFIREQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSzAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGkqqits6umsqysqqOqpq+qoKebmaSWnKKvn6CeqKejpaGfsKyanZWnrqyxqqisoJSSm5+kko+epZidp6OerqSrsKi/x7OoqbGulpKdm6GXn6mqn5Sgn5ydra+nq6mcp6ikoquSrLKWpaKqqp2jpqShsKCSmaaYn5mTlJGXoHGFjJd0hKiHcbF8nXGsfqGegaWPnneqgn2tf5xzrX6rh4afdpiSe3yXfqqIooyRjJ1+q3uJlJCfgHutVpzEeo9vksF9gZVtdW+MbWV2ZYZvYXducm+JipKPg22SkGZwdXVxYWdtZV9vaWluZ2RYU1xhWVFTQzlJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DUxsaytKCco46jo6Ksr7auqLCmqKqmrKurp6KjnZmhlKClq5+ipaCoqKKenbCsl5qWqaeurKimqZ6XlJqjoZGToK2bnaajr6yjrLWquc2yraatrJaVnJ2imJ6urJ2WoJmdn6myqaqqm6yrpKOsm6+xoqirrqWYpaqoqbGikpajpJmTkYSkaqR1iXqpdHqycIKmipmMcYigmoekYGFSq4R/roObdq2BpoaGn3qZl4Z7ZoCjiaSZhoKjfal/gpWHrl99qVWdopKBeqKfgHvDr8WLcq+zs7lxYqmvwnRojIyYjoFtmpRwbnl4eXBtZmVlcXBmfGpjXVdgaVhYVUxMUUxDQ0FCO0NBQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfDydbVv6GZq6ehr6KesLSwrqmsoqemqaqrqaSmoJuknZymp6ejnKyaoqyho5+vopybk6uktbCvoKmbnZaUpqKQmqKooKClnLCmpKixrLbIsrWqq6mVkZ2copifpbOdmqCUnJ+nrKykrpqtqqOiqqGzraGqs7Ghmqinrq62opKWoqaYmpF8qmyehId1q3l8sG+CpIuJn5aWn5SB0ri0uMmAgbJfYJSpg6OIh6B6mJaaeKrJdJmklaipkZOajICciprGx3hmoYKlc4GfjoJ9r11wtGKwdUujhm2nR4KTZI6QnpJ8cZeTgHF7dX58b1tmanJwZYFrXmFZY21cXllJTkxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqbOtrKWinLK4rKqgpZqopaqrqqegpqWYqqOfrqudpqCsmp6ppZ2ntZ+il5OpqrWyrJylnKCUj6WskZmbp6OgqaauoaSnqbC1w7Kzqq2ok4iWnKSaoaOuppihlZicpaarm7Cdrqimn6yjt6yhsbmvnZquprKysqSTl6eimZ6Ogp1OeJqBf596g6N9g6SEhqaenJ6ThLh7fHm5gn7MxsK2eJuhkIuffpqWl4p2npiKpZikqH+whZ2Fn4SsfZqUYqVspHCPhZCBfZaCcqxgo3NxgJpgvH1SVXSOkqOWe36Tkot1e3OFf3Fdbm54cmqBb1tkX2huYmRdTExRVEFJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA4ODIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu5qq+gm6GssrOlnqCVpa6trqqnnaammqOnobOuoqmnsqCYqaSUorWiopWXoam0uaObop2ik4+hsZiem6eloaKvrp2kqKK2ssSxramtqZGHj5unnKKknKWXnpiZmqakqZqvoq6lppivpLusoba3rZ2dtLG3sLKml52un6KdhY/RtcO3eYeOhZGTkIGmeJShd4ygkYSlgYpxqoaEtG5yapmjnJWKnnyYmYaHj3OvgqWboo2mi5OdipWQm21wslylc5N6nGyZf3uZfG2pYaNxcX+fYnOyuGh3j5SmmH2MjZSNeH15j4JuanlpeXJugHVeZWRubWZnYEpbWFg8SEdAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWTc42Krb+/vLq0npanpa21oaKZlaOop66rrJmmop+moKC1p6Opp7GjlKyjjqSto52QmpqqtLSknaScqZGUl62fn52npJ2nnLWaoaqktqvDsKmrqaGMhI2boaCmopWampyYm5mmpKaYrKiuo6Wbraa9rJS9sKyfoq+yuaqzppqosaKml3mokH18sHeKgKSliJxtsm+gh618oY6DqJWZgKyJha6Fn5SqoaGXhp+AmZWAe5J+q4CdmpaLq3idn5GKlJKBeq9do4F9pqdknYB8l3Nqr12la3CFmV1gW4ygbZWRppmClY6YjXt7hJh/bG5/Y350boB6YGdlcW5oZ2hCWmFbPktUM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaWFNQT05JODA1Mi4qLEFUVlZWVFRVVVVVVFRVVFRUVldXWFZVVVFIRklKIygovZKag6nGwrbBtJ+arKCtuKWjjpuko5+wr6qfpJ+drZmeuaCjq6CvqZquoZCrqKSWiZqQrrGspp6mmqyXl4+soaGdpaGapJytmKCoprapwK+lqaSfi4CNm5qfpp6SlJqalJqapaSkmqmsrKSln6qovqSWw6yqoqGrsrmqrqafsq2nqJd2r36Qi5yFh326roqYZbCMZZWtfaGPg6aVmoGsioSwhaaZpKGhkYWgW2xqgbNgf617e4KBsW1nb5mYjIiwW320XKSDa8iiZJ+Ae7xYdrVasn1SroB6rFiAoW6YkKibi5eRl5h8eo+efmV1fmKEeHSAfGFqZnFtZmVmT1ZkXEJVXz5KKD46PTQhIiwlHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFFSVFdaXmBfYGFiXl9cW1hVUE5KRkM1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpcXFhXV0dCO9Kfs7K3vbqzwbOjm6ympLaooIuaoJ+cs7Opn6OgnrWYoLSoqqyer62erJuVr6mijoibjq+sqKehppmukpiPqJqhnqSfmaOjpZmfo6myqb2vpKienI59i5qVoKCZj5Gam5Kal6ifoZqorqimpqOlqbueoMampKihq7S1rK6mnrqsq6uUgKmSo6+Om4CHpJeYkIGAuMO6g46ck4SnlpyCrIqCr4imm5ulqpF+1b3CqmKjv719fqOCg9e6uLWFlJODnr2+hGujgW+rhGycf3qysMeDaquwvax4d6K+vHOBlo6nnJCbkZiee4KSnHtkfntkjmd5gntga2VramJQYVtTalxAVWFDTik9OjQvHh8kHiUyIB0kKDA0OTY2Nzg6PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PEE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbO0sb+5sr2yop2upaWypp2MmKW/qriyqKG/pqeynJ6xnLqon62vpaaUlLCsl4yCm5GupaKsoKOcqqCXiqOSpp6nnJqhqKKZnqGsram5raijmpeSe4eZkaabk46RmJiPmJOomqCYqamhqqeho6q7nqjEoqCuo6qztKqvqZ+5pq2tmXN1qqS3hmSJoHBnrY+Kj21vd6SQmZ+Bda6YlHCPi3GVqKObl66kcm1tbGaLeG9ugplxgXpqcWlniZaVmHFpaYSHZ3CGZF2IYmpvWV1nfnemX2FxjpFuZWV/jZOPopiZmZGYoH6IkJZ3Z4h4aY5reX95ZGxjZmxiS2RYSmtaOlFlRVInSzorIxwgGyIsKRgbGC0yLjU6NDU3OTw/QUJERUhLTE1PUVNWXVdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWts6m5uLKzqqmhrp6jsqmYkr6yxMm+tqqewKyso6GorKC6o6SurK2njZeuqY+LhZWWrZ6mqqCdo6OgkYukkqeZqJmWo6qglpympqewuqusmpuTknuEl42lmI2RkZiUjZeVqJWfmKmjm7GmnqKruZ+vwKeksqWssLGqraqmtqKstpWKoKiltp2JlqOZh6makJSdkqmzmZujq6CxlqKgnaCinKCloZWrp42TkoyHk5yclZCak5iRjpWFgaSal5WNi5OTi4+GhH1niX50gnZ0h4txp2x6lJGTkoGBjZCQj52VoZaamKODiZaOc2qRd3GLeHd8empsZGNvZFVhWUBqW0hjYU9ZK0Y9KychNzQwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhUVlleYGFjXV5VUUpFRD45PUBBU1hbXFpXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqltLaurqKwo62foLWxkI6sx73Fu7mroqaem6afsaijtqedqbWnqZGYraKLh4mPm6iVrKSfmKeenpKUo5eomqiZlKaho5Cap5mhtruoq5makI17gZSLoJSKlZGVkJCTl6WQn5qqoJy2o56nq7enrsGuo7amr6+wrKiosrefrbuYkaWkpraikp6nn42pn42Sn6Osr5uho7Cor5ejoJyjqp6enZyWq52SmaGblJCWqpmNmZmWkJaekYmgnZWUhZKMkI2Ui4B9ZouFdYZ1eYiDc5xqhZCUk5CJfIuWkpKXlKKTnpijhYmaiHtzl3N6i39yfH9qb2RecGphW2BZbmNQYGRQWjpHR0U+Mj09OC8rJispJh0mNDE2NjY4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOjlFTVZbXl5bWlxbW1tcXV1fX11eX19hYWJhYWFgYmJiZGJcW2OXlaSooq+yrK6jqaatn6e1qpCQnaW0vK+traKjmnqdorGkpbGpl5u5p6OUmaqcjoaKiZyjj66eopWnn6CSlpibrouplo+omaiMmKmPn7q2pKWZm42IeYKTi5qTipWSlJCNkpeijZ2eqJ6fuKOAhK+1oq+vdaS9o7Kfd3mfqbC5lHWro56JgKp/ZFxidqCOpJ6El31uk7Odo6etqqNlnZ+Sc3mZlnCAmKiXbH+iqIplnKWckZeYloySnJGGnZqQlYOSh4+PkomEd2qOhnaGcHuGgIBhaYeKlJKLWnWUkGhoj49ze6aammZ6moiEeZlqhIuDb3mAa3FlX3ZwbGtoW2dlYmJwU1w+Tk5OU0c+QFREOTEvHh8mNDozMDY2Nzg8Oz5AQUFGSEJHRklLTVRUVVldYGhmZ1dRSjxERzw4VVJbYGFiYF5gX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5Wmo6CvsKyrqaWorqOmraSSlqu2sLKnm6umrJd0jJ2wn6irp5SXuaCgj5yknZF/iYibno2smqKVp6GdjpaRnoR1rY6IppqpkZekiZy6tKegmZiLiXV3k42Wk4qUkZCUjJCToI6boaeZnLKWgIybtZ2zjJKPu6egfqeieqKttYCOjaWeg4uGkLGqr4yKlqOaeYCLrIacnaKnqaeHlYWYd6WbeoebgZengoJ7nLJ6ioagl5mUmJaCkZeXhJqZY3mHkISOj5GLg21wjod5gHCAgYV/hnSGhJWReJZnknSgmnR9mYSinoiYf5SLhYWaa46OhWx4e3FxZ2R4b2psaltla2pldFxeSVRMUUBFNS5aVFU3KSEwOT0+NzQzNTY4Ozo9Pj5AREk/SkVKS0dTWFtZW2FhaGZZUUg5RUs8PmFWXmJkZmRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXo5+mra6rqKyfqLCmpqmlmZSuyL6xopenqbaekISdrJynoqCNkL6emY2fmqCQfIaOmZiIrJyhlZ+gkY2TiYaAkaeMhqKdpJSYnoafurKnnZuSjoVwdZCJlZCKlJCPm4uPkZ+Sl6Gllp6rh5+0ibSarYrKh6qtiLeFjK+CsKyCqY2lmI2dfaiPcnt3nI+nlmiVpHm0jJ+epqiSmMKBf6uImKFynoCapX2XhZWxgKF9oZOgkJiXgY6Tm4qYkYt8hZOGjZWSiYNtcpCFf3lxhoGEfIR1hIGWgI/FZn+ph4+ja56Do5yDmoGOj4eLmnGOk4Vod3R8d2hodnFoaGteZHBtZ21YZ0ddUk0yRDQ2TmFjNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05JSkxDUFpdXFdhXmptXFFFPUxNQEpkWF1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUl6KfsKepqaarn6O3sKmqppqUoKOkq6SXpau4o7CAoaidpZ6diZS9mZONoZKej3mElpaRiKuZm5uZoYWPjHebnI+ej4eepJyWmpiHo7mupJqcjIx+Ym2Pi5OQjZCNjZiMj5Gfj5ShoZmhp36hp4etnaCWrY+enJ2RhYCgjaqthaONqZmMmn+jdYCZlGuCrHVNq3iHjZyRm6ingKmrfYOhe3qnaZ5/kmtnl4aXtomefm5gZFmDl3+Me2Roi3KZfXmVbF18lm1fU3CDXF9reYNgWWWCfYOAl3CnqmuDo25ypXCfhaBqZqBtW2+MfWdaYIN/YldQb3dmbXRza2pvXmtwbWxpWGlPXlhGOUE0R0ReazQsSUNSTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl5jdmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5adoLigqqSmrJGgtrurraKZmKCipa2uoZ2utqOok6GgoKecmo6ZtJmQi5+MlYt1gZSSjYqmlpWYnp5/koWGrKSHmo+KmKmZmpuSiKaxp6KVmoiJgGluiIiLj46Ki42SjJCRooyUn6CcoaR/k4GPo6GUoHeclo+ng6Gnf4aoq4OleIp8hJp+onBzlIiWe56MeW2Hm4yZkJuomo+HnXuConN2pmaefnekX5h6fZJzom6Yt7S6dJOHgn+1qGSBxrh7cJW3i3GAmqRic6yrYH1pnbN+bnyGgo2Ci5hxf6NscqN0n4WBpGCdmbOWcX2Yn7R0c1uesoNqYm90dnFpb1hrbHJyZl1pXmNMRD1ENlFBWXEzPVNHX0pSPTwzOTU6OjZEOztASlA/VU1OUUBFX15bWlhgYHxkSEM4TFdVVmNhWmVma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO4mauck6CNpLe0ra2gmqKdo6Omrp2csq6sk5igmKGkmZqUn6ubi4iSeIuFcYCWjoqPoZCSlJ2XfZCJjqigh5iOipGjlJybjYupqKWej5eHhH5re4d+fY+Ng4uQkYmPlKCDl56gnaCei4l3nJiijJ9yoYuHqIibpY+Vpql9rYx+eqCZeqOTeIF0loiNnH2Vn4abjpmbpoaiZKF8iJaQm41snmiajW6amXuAi6d9cmh0q4Oeg3SqaJWaXZuFdoSdaKpqgLhmXKhwgZxglYxep3Z1h4l+nmiadYaTkpeOgJ9vmpBtp5pdqH54u2t+qluOhF2zZ1xucnp4a2lccWp4eWNgZlhiQlFGTzdWQ1JvNUtbWl9PWkRAMTUxOzs2SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5bXVllZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtZuniGOUmqu5sa+snqacnKmfn6+cnrGprZ2Xo5qhoJmWlqGkmYaJjWqIgHJ7l4iLlpaEkZSYj3qKhJajnYqUj4aLnpKdnYmQqaOgmoyRioCAaYCGeH+XjHuJjo6Ij5aaf5Sin6Chk5hyaJ+Kn4+McJKMgamHmJ6hpp6me7Cto6K4l3ejs6KkgIiUeZ17qpp/oo6dm5eIl3GhfIWNr7V9a5qRoXh+mLSjo6uohJl8m32dmn90qlpdb3uWi3ieYkx+enqFY3mXQkyeWaJqcnyObYCIhJl1m3iGibGzf4Cbk6d3gp1uc32VcJp0a6RdlXZIZWRhdHF+fm5mYGxpdntkZWJSX1ddVVdAWkZRaERTV1xiWF5JRD1COD9COklGOExFWEFXUltWREZiXFpgS2BtfnJFQzxVX2JaZmpWZ2htb2JmZ15hYVxdXmFoYl9lY3ZsXmVnZmtkZmxpaGtpk5yBsK6ZhFReoKazubKyqZqijJyrnJyqlKKspKKoj56dnZuZlpihnZaIh4l3hoFveZWFkZuLfJGTlohyf4iSoZtzkZCBiJmVoZuFjqmcmpWLi4p8g2yEhXGBoYx4ho2IiJOYlXyTo6Ceo4ithn21hI6enHullnqpgZWcj4mfm3ynaHdtfpl0oXNxfJ6GmXCTg659pIOmnpmAo29eqGd1o2NvpWGc05B8e5l4cnNjooaQfqNzpI92a5CzjGCCmIlzqrKovH93g21+vqaptF6cbn1xl25/cqJyXaRnc6ZhaKZtm9SafYWbcHp7mGycfHiXc26ppGdhZXpxgIRrZ2ZkbnV3Z2BjU1xmUVFiSVdKVGFXU1tlalxlUUZDS01KS0JLRThPQFFOWFNZT1NRYWZlalJjd3l3SUZFY11lWmhqVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJebf7CrVFxLfqmvsbSvs6ObmYWZqaChpI6lqKCYqYqamJiTmZOSoJiOh4Z7cH2EaH2Pg5SagXeQjY+Jb3+Gj5KSbJaTfImSk6WWg4+rm5SSi4WJeoN2h4BugZ+Gd4CShoeZopd7lKOkmp+Js6Gitot6rKekrqVwqICakIWAmpB7pIChmYaYcp6Eo66vipeMf4ykjZWDraGUdrS1tcmhc5SKgZ9gnZepbXmVhqCbdaGHd6B+kpeLgW9MZqOScJuHc6R7enRhg4FrfqBrcWRfnHF9dJdpemmztbTGpnOYfnqda5ybq3aFm212eJhqmXt1mHJQRX20Xmp2a3mIZmpoYnR1cG5WXlRZaVBTaUpWTVlUVl1oa25WaFdOS0FKTUtISk9BUUtQZWNqbWV1c3N/eXxudYl7e1RQT2xeaFtraVJqaGlsZ2xmY2VgXF1cXmliZGlre19dZGhjamZvbWVpbGWhnIivpoRmP5Ohsqqur7WiopCAmKqio6WMpqednaaCm5eWjpeQj5yTjoiDeWp5h2WDjX+YoHl1j4iMgWmEhZKCjIWdjXqNi5amk4OYqZiNkYuBiXqAfYt5cJChhnmBlYeJlqCVf5Slp5yWloRmbnicbKJkfHGld5uYcGemgJWKeqR6n5aDl3KedoGKlJaPuW6QiqJifZmhlYhtcmmqa3WgbW6mX5ppi5BoloealXWigH2aYIyGjXVviGJooGWefmmbdW9jZoiCbXKiWl9bYqFtXYmMbnt+c3JkpW13omRnp2iZc4yZcKJvVYmQb6BfZqhUi15UmG5tc2tygm1waWt5c2tvUllXV2daVG1KWU9dSVhpaXNqWWtWUVJFVlxMWFNhVWlrX3d0e31wfXxyg3t/c3aNgIR2XlFyYmdicGdQamhoa2xuaGRnX11eXWBrY2ppdnVdXGNpY2pqc2xma21jnKSYpnpldG2Lp66jqbCxpp+LgJirnZ+mjaOhm6KigJaZk46aj4uYkI6Ke4ZxgIhoi4t8mJxzdIl9kHtkgoeViomWmYJ8iIeXqJGBoqyRhpCKgop+gICOc2mPpYR9hpSNiJigjoiTqqadiaZ4lZt+pYiWjLKYnpCCr5efpXeUhnipc6WPhJpupKKMkoSMg7tufaWvg4aGhpOVnJ98pXpyqJWglmaefm+rY5aKlZJ4qGypooGJdoiDd6qRpodqkbBrdrOMqWuKhm1tn56SlWB+q4uqdn5/jKWedp99hKSVnaBqm4h3rGeerYy2dHe+jaSTWYOmjathdXJ0cXx0cWNqfm5obFNXW1ZhYl1rTV1SXUpebW52YFtxWVxgW2Z0ZW5vcmJxdGB3en55cnmDc4R/gXt7jIGCgHZieGRjbXNkUmtnaG9scmpmaWFgXlxia2JtbHpvXFxiaWJsandtZ2xuYpWlqp2BgJ6klqmqnaimrqSZiYOYq5qfpYqbpZ2pnYWMmo+HnJGFko2MjXSGeoiEcI2FfpiUdHSFcpKDbX+LkoeGk459e4KGmaaOf6amjoGOioWUdoKHkm9si6mAg4uUjomcn4mMlKqin4+AdZSXiH6BeZSuo3+Bm3GPhXiPioN+e3KnjHF9fXqXlpuEjnh7fn6HlJWTinaQmJ+gg3t9iWuMhVt5eXJ6cGhufpKJcX91gY+Uk3GGhIJljH9egX+Ld3RylHVveW5uh22EhV52aHiOZYCAhY2pm310fJZqiYhwgXZ9hnZubWeMc3l7mHiFXGtYeY9pbnhycm94eHBdbIZuaWdWW2BXXGZrZFZiVV9RX3B4eGxrdmZqa2t2fXFydXNhb3VidHuBeHV6g3WAgX+BeYuFg317bX9sZHhuXlduZ2h1a3hqaWplXGBaY2plbXF0bltbYmxkbGx5bmhsb2GNlLiopouhopqmpJilnKuioYSEmKySnqGJm6eaqZiDgZuLf5aTh46KiY1yg3yPfX6PhXuYj3Ryg3CWhXt9kouGhpCFeX6Ah5qljnynoYuGkJCFlIOGjph3coWphY6RnZCInp6IjJuon5+qg4mOlZp+fomWraiPkqaPd2+ckIJ5kW5+qIVwfZVxa3B9gZ+Mf5OOjGhtXYOLjJybno5zlYuIcXRrgnZ0gVlyboaRgX1+jGpdamR7hYSJgGBpeHqae4KKgXWBhYJnd4qGa2FwcYF2XnKKgYiPppWFZYyPg253i4Rxho96cWdoZXuDepZbXGpnbnZbe3l4dW5zc4JmXG2Ka2tiWlpfWllscVxfYVpfXWZ0fnp0cHRja2trfH1zfHh1ZG11aG18fnZ6fHt6eoCAfm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtobGtxcm1XW2VubGdzeW9oam1gi4uqsKGQo6Ganp2Xnpioo6J+g5mtjaCViJyikaWVf3uYhX2SmYmIhoeKc32AjHaFi4KFl4pxb4BymIaEfpOEg4aKgXqBhYycoZGCpqKIeI6YiJSLi5yXhYN6rIKRl5mUip6dh4ihq56hoaOLiJObnKOZlqqhp6agkpuHlY17d42Ng6d+f5KRkpOcsqablZ6QjbKSl4SljIyVm5+JkJuCiJGKa3yOd3hlgoaQi3yJnYSHi5CIiICEhJB3fHl0maCIhomeioSUfn2KgIB1b3OEgn53hoaKj6aQg4WNh4ONkIx9iIyKkYR5bYOEfXqZanJoYXSKcH16d3dwd3SBXV5vhmhuX15aXV1UaHJWY1xcYmxodXx8c29wZGtraYB8bnmAcmpwcGxngXtygoB4f35/hXttgoyGfHl4e316g3lOZHZqcm1wemVrZWNiYFt0ZnBmcnFtVV1sdG1peXpxZ2lrZIyHnbmelqKhmJSYmJSYpKCee4Caq46fjYagnIueln15lIN7jpmJhoSEhm54gYBzgYh+iZSEbWt+epeHhIOQf4CGhIZ9h4WOnJ6Th6yfhHKLkIaSkYudkX2Ne6qEjZKYlo+cloeGm6afoZqdhoKRmpmYkJqmn6WdnZCWf4+JdXuGjYOkenyOkJGGmKqhnZOdj42qjpGAnYyJk5qego6XfoaOg294hnJ1YX6Dj4Z1i5iBg4+ChoV+hYSUbnl1dJKhiouFmoOEjHN/iXx8cnJ7h4N6eIqOg5KmjoWDjoCDiomKd4aJiox+cW1/gXxuaGxtaF96f2h9fHZ1dnV7d1xfcH1udWBjW11eUWduVGVbXmJraXZ6fnFsbWRramiBgGxzgWxtdW55cIV5boeAdoKAfoV2cYKNiH57enx/e4KKYGl8anVoaYJlamNgaVxkdWhvYnVtbFVjcXllcHp7c2VqbWyLiZ63mqGjn5GRlZeLmp+fnnt4nqeRnIqHpJSLmJl5eo2FfImRg4yCgoJufH95c4GFfYuQfWtofYKYiYCHjXx+hoSGfY+CkJydkompnYBwjIuMk4ehooqFjH2okYiQkpeTlpN4jKOfoJ2WmX+AkJqYkoyao6GjmpeRmn2Mg3d/go6GoH9+jIyPfJikoKGTmZCPpo2PgZqRiZOXm36Tkn6HjoF0dIJwdmB9gI2GcYqVfIiMcYx/goWGjmh3cXiLmJGPfpZ9h4pygYZ7fHF4eoqEenmQi4KVpZOLhI96hoaHhXaChImIfGdzfX95e3Fsa2dffnNofHV2dH1zgGpeYHN2cHdkY1lfXlJraVVlWV9haGp2eYFxZ2tkbWhlgIFrbX5ocHFrfXmHemuMgXOBgX6BdHaCjYZ/fHp/gX1/j2pyg25zaWKHaGxiX3FWdG9tbmB4aG1XanR2Y3V6e3Jiam95iY2espKlpZyOj5ePhp2gm518dqWhjpiAjKKKiJqWeHuGh36DiX+IgoF/cX97dHaDhX6KkXhnY32Gl4qBiYx5fYCNg3mXgpaZl42XoZx+cIyCkZSGppuHjImDppWFk4uWl5OSd5GdoKGXk5Z5fo6Yl46Wmp2knZiSlJp4jYSCd4OWjZ1+gYmNjHKXo56hk5mOj6KMi4OWmIOSlpl+mIx8iI2AdnF9bnpkgHyKhXCGk3+QgmyHgoGAiYRldW97hpKXjHySd4uIe3+FfHtxfneIhXmEj4mKl6KVgYKKdoiEgoJ3fIKKhnhhenl9dH94Z21lYX9qandzdHV9cXxiY2FzbnVybWFaYV5bbGVSY1lgYWhrdnmGcWJqY21laH2DbGh1aW5vZ399gnltkIZxgISDf3R8g4yBgH56goN+fJBtdol0dG1limxqYmN1VoRpcW5geGdsYmp2cGZ5fHpxX3FshoWPnK6XpqiejYyXh4afk5eZfXiqnIqZepedi4yYkHl8gYx+fIN8gIKBeHR5enR9gIR/iYuAZF59i5WHfoSGdX1+in99mYWXlZiNpKOZf3OHe5SSiqePjI6Kk6GSg5GQlJeRi4GPl5+ako+Qc3+NkpSJnZ2eppeXjZWVc4yNiWuFl4+ZeoeIkIlvl52ao5OVio2ejIaCkpx/kpKVh5mIfIqJgXlxemt1bHt+i35thZKClHhwgoN9fop/ZHJpe4CWl4R+jHOPh4N4hn12d398hYB8goyDi5Okj3iDgXSJh32AdHaBiYVwYnx2enF9b2JvY2R8Y25vdnN4d3N0YXVgb2x1bW9cXF9eX2peUF1ZY2FobXR7iGtfaWZqY2h3iG5mbGlqbGeAfXt3bpCIc4CEhH10gYaJe4N9eoGEfX2OcnqLeHhubIdqaF9pcmKHaHFvZXZnbmxheWlrfXt4cGF3bYuAmZmqoKOonYqKkYaKnouVmH53rpmNl32fk5GWlIh3fnuKfXuAdnh/gHB0dHxvhn2BgIp/fGFbfo+Shn+Dg3N6gId6j5KJk5Kdk6aclYJ9gnyOi5KkiY6KjZibjYaRmJOWj4qIjJKcko+LjG6Dj4+RiJ6ZoqGXlomWkW6HmINmhZiOk3qIhJCKcJWalKKSkomLmYyCf5CefZKPkoyZjnuKhIdzcnVrcG51fIp0boaQjpJxdYB7gYGHe2RwbHh9mZN9g4hzkImAc4d5bn99gIV7hYuIg4uVqIx6h3t9i4V3fnFwgYaEZGl5dXVwfGJfcGFrdF5xant5eWxzcGV4XW5sc21yWVpfX2FrWlBXWGVjZ3FxfodmXWppZ2JncY1uZGlnZGlpgXp3dW+OhXSBgoN7dYKIhXiFfHiDhXqAiXd/i3t6cniDamtfcGh0gGpyb21xZ29sZXxjboB6d3Fsd3eKfqKXoaigppuHjIqBj52Hk511gaqVk46HoYyVk5CAdHx2hXh5f3Jze4VrcnB6bYp2gIGHbnFbWH6RjYh/f393dYGBgKCGkYuTnZihlZh4ioCBjYmcnoqPhpKYloWJlZmPlouLjI2MnImNj4NtiYuQkIqdlqGcl5SFmIdqg6KCZYWdipB+i4OLgXeTmJGekZCJiZWNf36PmHyRjY+NmpF8ioCCbnVwbG1vcHuFaXODjpiKcXeAdYKIgnhmcm51gZmOe4iDeZOQeXaHc2+Ie4WLeoqFgoeNm6OHe4N1gYt/d3lubIGEgl5zdXNxcHhaXnFhcGtecGp9e3FtbWpsdmBwb2pxbVpYYWFiblhRVFpmZ2N2b4SCYl1rbmRiZmuSbmBmZl9na4F1cnNwi4B1f4OAeHWAi4B5hX93h4Z3g4V8h4x/e3aKf2pxY3xjhnxucWx0amhvbHZ4X3F/eXx0dXSAgn6klZqtnqeWhY2Df5eUg5CgdYuglJKGi5uMlY6LenJ4dIJwcoVzcXWIa29tdm2IdoN+gG1uVVGBq5WHgnd/d3OCeoKhgpOClZSZnJOaeJJ7g42TpJqTjomVmZKFh5eZjJSLiY+Ph52Ej4p8c4uFiY6InJqfm5WUf5N+aISbhmeFoIeRg5GCiXGDkZePm46PjIyPjXh7kpB6jouMkpaMfIh8gGt2am5rbGx7f2F6fo6WgnZ6gHiDjHx5Z3Nsc4eVin6HhXqTjnF5g292jHqJi3mIfYGLj56dhHx6doGLfXdwamyCg3pheXFubXJ0Vl5wYnJhYGxuenFocGZmc3RocGthd2VdVmZgYHJTUU5cZmVdeXCIfF9caXJiYmVmkmpfaGRbZ3B+cGtxdIp9dnyFgHR1fox5e4aAeIiDc4aFfo2NhHx5lXhmcmqDYIh9b29remBqbnR/dV90fXmGeHRzhXx4oI+ZsJyljoKKf4Oah4CMnn+LmpSPhYiYjo6PhHd0dnOAcG+FdHByhHBrandug259fW11c1JNgt/IktaTfHB1g3aEoIOUd5WSmZyRmXuUc4WQn6GTk5GJkpuUhn6WloiNjYiSjYicf46Ad3qMfomMipybnZuVk3mMdWaHkIZrh6KEkYiXgoVjjJGZjpWKl4uNiotxepSIe42IipORiXmFfH5se2Vyb2trenlbgHmQjoB6fX5/ho56emhyanOKjomBhYR8lIprfX5uf4t+i4Z8g3mAjpSamop8dXeDkHhybWdxgIVua3VwaGp1blNfcGVwWmBscnhna2tiZnhycHBjX3dgYFZrX152UE5LYWdjXXpwiXRcXGV2YGFlZY9jYWZiWGlzc21qcXaMfXR5hoF1dn6Lc4CGf3qJfnKJh4GRi4h8fph2ZXNufWWIfm9wa4BabG55eXNhdnt7jXZyd4p3eZ+Lm66boJCChXeIlX59ip2HhqCRj4WMmISTjoeBdHdweXFuhG9tb39zZWV5cX1teX1qaGtjpJrB3K7voXNsdoR2haOGkm+XkZahlpyBknKFi6OXiY6VipCdloOBlZCFiZCAkYqJln6HenV/iXiHhI6cm5iZjo92iXVthYiKfImig5CJnISFXouTl4qOiY6KioSJbXuWgX2IhYmRj4Z2hX19a31keHVqbnlzV4h6koeFeX6AgIWMfnhlcml/iY6JgYJ+i5aEa4F1bYeQgY+EfYF4fpCVk5iQdHJ3h4x1c3FndnqEY3VucWJqd2hSYXFna1Zfb3R6YXJkX2h9cHJtWmNyYWJWbllceE5NTGRnYl53c4ltXFxkeV5gZGWFYGNjXllqcmtua3J3jH50d4SBeHd7iXGDhHx+iHt0i4mHloaMf36Xc2h1cXlti3pudHCAV3F6dnlxZXh5h4xpdoCJcn+ch5mnnKOShX1wjJR4eYudhIWhjY58lo2AmoiEe3N3cHNqcIFsam18dV9heHd7cXV7Z2BkfOvatcnD3IhzbHSBdoubiY5qmZCQnpaUgYlxhYmgjoWLlYqMmJR8jpOIg4mQe5CLhY+Bf3Z4g4RyiIKTnJeUl4aMdYZ9boOBiIaYoYKTi56DiWGDlI+GiYaJjYeBh2p9lIB9g4SJjo2CcYZ+f3F3aHZyaXR3a1qMfJKDhX1/g4CEioJ1YXNriICPioF+fpGQfG2Ba3iFjoWRgnuAfH6RkpCWiG5weYyGdWtxbHN5gmB1am9da3dgUmVyaGZTYHB2dGFwYF1og3FzaldnaGJpWG1WW3VMS0xmZ19icnOFaVtcZXleXmRne2FkX11Za25mb2lzeIp+c3OBfnp2eohzhYN8f4d2d4qGjpmBjIJ7k3Vsd3V5eJN0bnh7fFh6hnGAb2d5d5KCZHaGhXGKloWZoZqiiodzb5OLcneOnH6LmomJfJ9/hJp/gXhyc25vZHJ/aWZteHhcX3l7e3FxgGphZ2F/1baOkKZ4bnF3fHGTkY2Ha5qPiZ2TjIZ7aYeLmYaBkpGGh5iOfI2NgYGKjXyPjH2JhHp0eoN7cYaAlpqOk5SBiHSDhXWCf4mRnJ2FlI6ffohhf5OHhIiEiY1/gINnfZGAfn+CjI6Qfm2CfIJ0a213dXR3dmtjjYGPf4V+fIR/hIh+b15xcIR7jouBe36Qh3lwg2Z5goqGi4J6g31/k46PkoRubnmLfnVtbmxse35jaWxqWW53WlJqc2liUWNzeGxiZV5aaoNuc2FbZ19kbF9uVVtwTkhPZ2VcZ25xgGxbW2NzYFxjbHdkZV1dWmtsYm1qdHeGf3Fwf3x9dHiGeIWCfICHdXmJgZKWfImGdomBcHd5e4STb218gXdeg390gW1penSUc2dzh3xykpGDmp+boIaIdnaVfm12lJd+iJGEio6afYyadn12cW9samF1fGdianV6WmB4fHptcX9lZGhnV52PXnFzlrzEhHZxlIqQf3OYjIeclI2IdGuIj5WAe5SMgYSbjHyLhn18iYx/k4h1iYV2dn2BcXWGgZ6VhpWPgoJxf4dzg3qIlpuWhpONnICIZX2Sgn+Fg4mJcoJ+Z32Le3l/f4eLj31pgH2DdmZveXhzd3Nsao2FioGKf3mCgISDf2pdcHd6fIuIhXuAjn99coBoeIKGioWCd4J7gJeMj4x9bWt6iXx2dG9paH13ZV1xY1hwdFNUb3NoYk5odHhmYV5dWG+Ab3NZZWJdam1gcE9ZbFJEVGhhWmtubXtvWltebGNaY3B2ZGdcXWBramNsaXN2gYNxbn57f3R1g3qEgnyChXZ+iYGWkXiDinSBiHJ5eX+OkG9vfIFxaYF5en5tbXx2lmtqeIR0a5SNhZ+YoJqFiG59jHZqeJiPf4KKgpWYinqPlm96c3FsamRgdHtpYGZye1thc316Z3B6YWVljrGyd0piWqTZ0Jdye5KMkXl/loyFmpKNhm9shpKRenmTh4GEmYp8h394eImKhJWAb4qHcXR9e2p5hoOlkYSTjYN+bn6CdYJ3hZmYk4qSj5SFh296koN9g4OJg2+CeGiAhXhyf3+Diod8ZX1+hHVjcHOAaHlxb3WYjYWCint2eICEeYFqWm98cn+Hg4h9hYh6iHKAbXCDho2Dg3GDeICYjI2Ed21tfYN/dnplaGp+cmFaeFtZcm5OWHJzZmBLbXd1Yl5bW1l1fXJvV2ddZmpwX29OV2lSP1lnX1twamd5cVtbWWtlWWNxeV9oXV5lbGhmbGlxd3+Hb21/fYB1cIF7gIF/gn92gYWJl4pxgo1xe4Z9enqElIx1anp/bG9+dH99b3J8e5Rwb4B/eGaSioKhmJySgoVnh4RwaHqXiX6AhYKZioF8jY1peHJrbGZfYW95bV9ib3ldZGyDemFxdl9lZdXrvosyOj6LjoByeYaJj413hZiNf5OOjX9ubIWNjHV9j3+FgpWJfIN4bnaHhYOXd26IhGx1e3VmeYKDqIyDj4yDfW1/dHaBeISbj4uPkZKMi4Z+e5KHeICEjYNsgHNpf354bXx7gYqDeGF5hIFxZHFpfm10cXSBm4uAf4R+c3V9gHOAblprfXR4iYKKe4Z/fIh4eXBrh4KOgolxgXh/loqKfnRtanaAgHV1XGlpeHFZV31TWnJlTFtzcmVbSnF4cF5bW1lcdX91aFliW2dlbmJpTVdmUT1eZl1ddmZfdHBbWVVvZFplcXlaaF5gZ21naWxocHh+jmxqgoR/eW6Ae32Af4J6dYKBjJOFcICLbnd+gXt7iJOJgGl7fmt0fHKGe3N3fX+MeniEfnxrjIyDm52WjIGAbI1+a2l/j417fn+DlIJ/fYqIa3VxZ2hjW2Jnc29gYWx0YWhwiXphc3ReY2SboJBuXDVZr7V1aoCKfpOGd4eYh3WPjIp3cGyFg4d0eYl4iX2TiHp/c2d2iH59mG9whn1od3luZXqIhKWHgYeNin5ufnZ+f3uKmIaBk5CXiIuEiXyPiHF7fYV8aX5ta4B7emp6doKHgHJgd4F+cWRyZ3WCbXV7hZWRgXyBfm93eXt0fWxXbX11c4qBhneHdYGJendybYh/jn+Dcn58fZKIiHpubWltgoF1bl1oZnRyUlt7TlxxXE9ccm9kVktzeWtYWVlaYHGBdWBdXWFnZGhoZk5aaE5BYWRcYHZiXHVtWFhTdGFaZG5yV2peYmhrZ21saXB3fJNsaYSKfX1wfn57gX+CeneAgImLhHJ7h29xd4N/e4qNj4NqfntueHl3ind9eICCh3+Df356bYWMiJijjYSDe3aMeWtthImSeX17gpGAgH2Kg3BycGNmXllnX3BwYGFocGZqb4p1YXRvW2FkaXZ7f76cpqPIuHKFhHOTfXmIlIR0kY2IcnNwhHuDc3WGdIh3lIl5eXFjd4Z5gJNpcoR1Znd2Y2p8g4iegoB/jo59cn5zg3d+kI+Cd5WNlI+Hgoh6iYlreHl+dWh6aWx/eXNpenaAg31oYHeHfmpqc2h7gGl2gYyQlH56fX1xe3Z7c31hVXV7cXOJg4J8gnCGind3b2+CgYt9fHh9fHWNhYJ2aHFobIiCcnBdaGN0b0tldkxeb1VUWXNtYlFPdHliU1hYXGFwgnRbYFxoZWRjamRQW3FJRGRiXGNxX1x3aFVXVndeXGVuaFZsXmFqZ2Vvb2hwd3qTbmmIi3l+c3t+eYKBgnx2fYOIhoNwdoNzbXeDg36Ji5R/cYB8eHl6gYt0g3h/gYGChHmAdm9+iYubnoh9hnp3h3xodIaNkXp/f3yJhoR2kIBncG5fZFxYZVltc2FhYXFsbGiJbmBzaVleZG2Ad6naqseGh7NyinlwjnZ9iJCBepSKgHV0dX53gHBxfm2FdJSFeHRsYHqBeYiOZnGDb2d1blttfYGQk4CBeZKSfXh7bYZ0f5CLg3KVipCOh4WFe3+FbXV2f25od2ZtfHZtand2f398YGJ4hnpodXVjfntndIaOjJV7dIB1cYB6fGx+WVZyfG90g4Z/f3hriIZzeGp0f4KCfHl8d3tyioB8c2d0ZG2LhG10W2tgdmZIbm9MW2NYV1Z4bWJQU3V3WVFWWF1gcoRvXGBjbWRjXW5iVF1yR0NmX15maV1ae2JSVlx1W1tna2FWa19hbmZmbHFocHZ4j3Rrjo11f3Z4fXeBg4F7dH2DiIiDb3GAdXF1foaCiY2Ke3d/eIR8fYWHeId8fYF+hIB7fnN2eYyOn4yJeol3dYN5Xn6Gmo15h4N0hoaEd4l7Ym5sW2JbW2FVanRkYFtob3Bnh3JhcWZXXWNrf3zKzoe5omtubottcoVyfoWLf3uShXp5dHl1dXtqbXVjhHaSgXZvZ198gXmLiWVxgWpqcWNYbXuGnImDgnOXlHd+e22HcICJioZwlo6QiIWLg3p5fnFxb31naHJjbnhyamxxd318el1leYB3aXV5ZoJ2Z3SHjI2UfHKHam5+gHhte1xYcH1sc3+KfIFubol/cHZmdn6AfoB1e3F6c4Z7eXFlcmBtjIJsc1hrX3hdSW9sTVdWX1RVfGthT1R2c1FSVFZdYnSFaFxga2pmYlluYVhjcEdBaF1gZl9cVnteT1ZlcFpbamhdV2dgX3JmamhyaHFzd4d4bpWKdH97d355g4eAdXN/hoWOgnBwe3h3dXmHhYeMhnp8f3WLfn2GhISHf35+fYd/fHh1eXeRk59+jH2LbnWAeWSDiJeGdJKKb4WFgnqDdWNuallfW11dVWhzZWBZZHJyZ4FzYmtkV1tgaX94vq57n7dtYnSHaXR8cnqEh3t+jYB4eHN3b3t3ZWpuYId1joByaWJffnh5ioNmcH1oamtbV294iqOBhX9xmZNxgHh0gW1/gZCHcpOHjIeDiIV9eXRyb2h5YWptYW12a2drbHp3endbZ318eGVzfm6EdGV1ho2GlX5wi2ZreoJ0bHRiW216anR7i3qBZnSGfW1wZ3R+d3x+cXtreXuBeXdwZWxhbIl+bW5Wa2B4VktrbE9ST2lOWX1nYk5VdmxNUVRVXmZ2g2ZdYXBoZ2FXaV1cbGlKRWtaYmRWWFV5Wk5XbmpZXWxlXFllY150ZmxkcmdzcHSBeHCZhXaAf3h/fIWHfXVzgoeAlYJuc3l7e3NyhYeIiIR5gX12j399hImOg4GDe36Lg3t3fHd3mp2XeoqDh2l2fnxshIWUgHKPgnGGgn6Cf29mbGdXXVtcW1NlcGVfWGNzdWl1cGRlYldcXGiAcG9ygHOJZWV5f2p0dnR0hIV4goR6d3R1bmt6cGFna2eGdI2DbWZeX3xve4l9aG13ZmlkVldycI2nfIR8dpaQc3xye3ltenqQhHaWe4eGgoaDfXVwcm1ndV1taV9sdWRnZml6b3tyWWeBdnVncIB4gnZid4WLfJSAbotqbXqAcGVyZWBreGZydol6fWF1g3Zpa3F0em94eHJ8ZX1+fnh2bmNlYWyGfG1rVmpiclRMaWtQTE5wSF57ZmFOVXVlS09TV2Brd35lXWdzaWVfVmNXYnBdS0trWGRhVVRVc1dNWXZlWl9rYFxaY2Vfd2dtYnBpdG9xfnV0mYF4gIB4gH6GhHp9doKDfpiFbnJ0fHp0cYWFj4KAeot1dJCAfYGUjoCFhHx+jIZ6foB2e6OlinmIhoVsdXx7dYSCjHpvhXN6hX2Cg3VuamllVl1bW1pTY25lW1hhdHtqaG1oYGJXX1tpgGlrb4BnbGFpenlqdHV0b4aCe4F9dnVuemhqeWpfZW5pgXeQhGhmWGJ3aX6Hem9pb2dmXVVYb2iPp3aBenyQjnh1bn1tcXR4jn53lHSFgn+FiHZqcnZnaG9cbWVebnNfZ2JqeGh7bVttg3N0am+Afnl3YneEhHiPhXOIcXB5f3FicGhbbndkcHOHe3hhcoBwZ2l4c3Frd3ZzdWKCen53dXBjY2NtfH1ra1VpYmdUTG1pUEdSbEVheGZiTVRzXkpNVVllbHh7Zl9tcWpjXFZfVW9vV0pTaFhnXlhNVWxUS1x6X1tfa11dW2JlYHpobGFvb3Vub3d1epd9d4CBeYCAh4Z6eXqDfYGThHF0dH96dnSFiJB9gH2QbHOVgXuCn4V/h32AfoaCgIp7doSsn396iIeEbHKCeXaBgIJ0bodvfYB0ioBqb25kZFhfWlpaVWJqZ1xaX3WCaV5tbFxhVlxca4FlcnR9aWpdbHd2aHV3cm6HfH5+enZzbHpnaXdnXWRzaHp3koFjY1Rkb2eChHd2ZmhqYVdWWWhkkKdufniAi456cG97ZnhueYp6do5xg31+f4ZuZHZzZGhoXWxiXnBvW2debXVlemlddIBvcmtxe351dmN1hYp7h4eAf3dydX5zYHBsWXByYnFxhHt1ZHKAbGBsem9qaHp3dHBkg3R5eXVxZGFkbXN+amxUaV5fVUx0Y1FHV2JHY3dmYUxUcVlLTFhYZ2x2emVlbXFmY1pYXVh2ZlRKXGNYaVhYSFdlUUljeVtdYGxbXlxiZF6AaWpfb3R4bm9udoOXeXKBgH2AiYyGfnZ2hniGjH10dXWCeXp6goyOfX6EiWp0loF7ip19foV5gHt+fIaIc3GProx7e4aQfmZxiHp0fX12cm+GbXt+bY96YnBvYmVdZVZaWVdjZmtgXV1zhmlYcG1bXlhaXGx7Y3F3dm1jW250dGh1dnFthXl/gXl3bm90ZWh0ZVtndWZ2dpJ6YF1TZWZqgoFzfWFjaVxVWF5iZJClaHl0goWQeGxueGZ3bHuDeXSIcoB4e3h/aGV2bWBmYV9qYF51a1llXW9uYnpmW3h8a25ucHd5dHVlcoOSf4eDiHp2b3F8cWF3Y1pub2FwcYF7c2VxgGRebXZpY2Z4enNrbYB0c3xycWJeZW1vfWVpVGhZWlVOeWBSS1pZSGJ1ZGFKVW5USkxaVmlscntjbGxzY2FZWlthd1xUS2NdWWpTVkdZYU5IanZYX2JtW1tfYmNdhWloYW54eWxvanaBkHhtgn6AgpKIhIF2dYl0i4Z0cXZ2gnh8fX6MkIB+k35weJaDfZmSeYCAeHl+f3OIg3NwmaJ7e4CJlXlkdYh5c3l2a3Nwf2x5fHCRcl5wb2FnYmxUW1pXaWRtZlxccolmUnJtW1lYWGBsdmRqdWpqX1ttdHJtdHR0a4Z9f4B8d29ubGRpcGNba3JkdHaOc1xXU2RgcX9+cYJcYWNeU1phXGSTn2VycYSDkHNranhsbm95eXpxgHZ/cnl6emRmdWdeYlthaFxed2lXYl5waGF4YVt7dmpqcm93dHN0aXCBlIOGfoR2cmpwe2xldldbam1icHKAenNlb35bYG9xYl5pb31sanJ9cXB3a3BgW2VrbXthZ1RnVVhSUXdcU1BZUkhjc2JhR1ZsUUlQWlZrbGt8ZW1vcWFbWlhZbHBXU09mV1dpU1RGWlxPSXJ1WWBkbWNYYWBhXoxqY2RteXhrb2l1eYV7a4R9gIWZfYKEeX2IbY+GcW93enx0goJ9i4+DgpZ0eIKThoGfiXWBf4F0f4Jwh4J1b6KXc3uGi4d7ZneLb258cGZ4cXtsc3ZzjWtedG5hZ2ZrU15cVmhibGxbXHGMZE5vbVxWWFVnaXRoY3RlZV1ab3ZvcXV1emyIfYB9iHeQc2Nka29hXW5tZHN4iGtaVFZiY3d8fHCFXGNfY1RaYFpjlpVjbnCDhIlyamd5bmVydXF6a3lzdW56fnVfZnNjW15XYmRZYXVmVl9hbWNhcV1dfm9oaXNxc3B1dWtshJOBiXuFcXJmbntvcG5SWmVqZXFzgHZzYmx2VWJxa1tebmR8ZWt0fHFycmptYFljaWp4XmZUZVVWUFVvWFFXVFBIZXJfYUZYa09JWFRWbmlkfGlreGthV1xVW3RkU1JWaFFZZ1RTSFpbUE54d1tgZmxpWmJgXl6PbmJma3l1bm5pdnZ+fm2EgH6Gl3t/h4GJfmuTiHJndIB6dYCDfomPf4uTcn2KkYWHn4Z7f4aMc4CGc32CdW6kjHOBjYt3eG57jWBkfHFneXN5bW1xdoNnZHxtY2ZnaFNgX1VnYGxvXF5ujmhNaWxgVVZTb2ZzbGV4ZGVdWnF1bnN7eHNuiXuBd5x7emxiZWxtXmBvamVxeX9nWlZYX2x4e3tvg19iXmhWWWBYZJyIYmtxgYZ8d2tqdmxbdXBqeWl1cm1ue4ByWGpuXlldVmJkWGVxZFRfYmliYm1aYH5rZmtzdW5td3ZraIWMf4l6h21xZm97bHFsYlhfaGhvc4Bzc15pbVNlcGRVYm5heWJvdHp0am9sal9YYGZodV1lVmJWU09ZZ1NPXU9PSGVvXWNHWmpOSl9LWG1lX3hobn5kYFVeVF10W1RTYGZOXWJVU0pcWlFZdXZdX2ZtaFhiYVtejnFjZ2p3cXNtZ3ZzeYNzgoN7iI5+fIqIjnlukIp0bHOBc39/iIWHkoSVj3p9jI+IkZuEgHyMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH1+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2NjY2NjY2Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpKTk5OSk5OSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY2NjY2NjY2Pj46Ojo2OjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyRbWZnZ2dnZ32FhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCS5KamZmZmZmeoKCgoKClXiovLy8wLEiFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJFnX2BgYF9eeYOCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTM/k56cnJybm6KkpKSkpKpWFRwcHBwXOoOBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkY6NjY2NjY2PkJCQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaNjo6Ojo6Oj4+Pj4+Pj4iCg4OCgoKFioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkpKSkpKNkJKRiYeOipCSk5GLkIuKkImPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyMjI2NjY2MjIyMjIyMjY6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoaMhYqKhoiQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCQiIyGiIeFh4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkJCIjY2JhIaIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fX19fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMkIiMh4WIg4qPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2PjI6Kio6Jjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp5ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Pjo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWFhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+JiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5OUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpKTk5KSkpKSlJKRlJOVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkpGRkpOUg4WUkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSko6DkpGRk411iZORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCRjm9/kpGRfHSJkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+QeGqEkYpzdoiQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo97Z3GOhHJ1h4+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjnlcaHVwZG+Ijo2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLioqGZGlrXGdqa4OFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d25jdWxbanVuZWhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hnYGdvb2ZscnRqYmNiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXllcYmdqcm9xc21aWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent5dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVJfY2Vtbm5qaFJRVFBQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OT01NVWNrZ2xtbWdlWVFPT1BRT05OT05PUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0VFS1JeaG1nbG1sampmYlxVUE9PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEZGU1tdYWZqbmpvbWtqa2tqamZaS0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7P0BDU15jbWxsbndyamlraF9UTUZFRUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7PDtHS0JOYm1wenNramBLRkJFRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHN0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozs9PDo+TWB0cGNOQz9AQENGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk5Ozo2OFdmQTg4Ozw9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT08PDw6RFk5PDw9PT4/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9APF1uQD5ERT8/QTxGXT0+PTs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo7bXdJODs6PT1BPEtiPTw9PDg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUjw9PUlMRkZ2d043ODg6Oz4+V2lBOzw8Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dnd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N5STtdf4N/eXx3Vjw9Pz09PkVpdE06PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFIcnlrYoKEg4ODgH1dPkBDQEA9SXJ7Wjo9QUVBQkJGSEM9PEBEREFAPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEZvdH2CgoGDfn2EdUxBQ0VAPz5Ye4BdP0NFSUpJSU1NS0VDRkdHRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVxQ0RFRENXdYaHh35YR0hKTUxOT09MSEdISEhJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fH1+fn19fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIptQUFWdIeJh4eHiINXSExNTE1OTElHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0ZJSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3Z3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiINWbIWHhoaGh4iIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSkhISEdJSUlKSUhGSkpKSklKSUpKSkZJTExLSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpVgYOEhIKChYaGhIKGhYSEhoaGh4eGinVJSUZCPz9APz8/PDw8Pjs6PEFBQD48OTk4PDw9Oz47OTs/QUJAQUNDQkBBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWWFhISEf4GCg4KDg4SFhYaHiIiIiImMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODg7Ozs9QDs5OTk9PD47Oz1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaoaEhIF+gYODg4KDhIaJioyMi4qJiouMiVQ6ODY2Njc2NjY0NTc3MzU2ODo4NzY1NjU2NzY3Nzg6Njc3ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JmhYOBgIKDg4ODg4WJioqJiYqKioqLiYqKgUc2NzY0Njg4NzQ1Nzg1Njc2OTk3NjY3NjU6OTo7Ojs4OTg5ODc3Nzk6OTg4Nzg2ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhISGiYqKiIeIiImKiouKiYmMej45ODg7PD0+OTo6PDk6Ozk6Ozo5OTs6OT09PT47Ozw9Oj47OTs7PDs8PDk6PDg6Ojs6OTk5PD88PUFCRElKTUtJS0xXb3JzdXN2eHt7fHx7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUBCPkBCQEA+PT0+QD8+P0A/QD09P0I/QEE/QT89QEBAPj9BPT48Ozo7OTk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t9fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUJBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLi4qKi4qLXj5ER0lLSklGR0dERkhHRUJAQENFQ0JAQkNCP0BESEVDRUNFRUFGRUZERUZEQEI/PEA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6e319fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0RGV4SCg4SFhYaGiImJiIeGhoaHiYmKi4yNjIyLioqIVkhNTE1MT0lJS0lJSkpJRUNERkdGRENFRkRCSElLSEdHRkhHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E+QkJHR0lZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE5QTkxOTEpMSklJSEpGREZISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hHR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4ODw7PD06PkA+P0BDRklJUF+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIuLio1yTlJQTk1NTExKSEdFSUlESkhHS0pISkdHR0tMTkxMSEhJSk1RTlBOTU9LSUdJSkhJRElISEZGR0dIR0NCQUNVbnB1d3d5enh5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0dCPzg/QDg6PDg9Pjs9QT4/QURISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIuLi4tfUlJQTU5NS0pHRUJHSkdMS0ZLTktLSkpMTUxPUE5ISUtMT1FQUFFPT0pJSkpMSkxGR0hHRkZJRkVFQkFCQlxvcnd4eXp6eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxYVlJSVFNPTEtKREVGS09OT1dVUVBPUVNTTVNUT01TTFBTVVZSU1FQTEpNTU1LTkdHSkZGSUpEREVFQkRDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQkdWTkZOUFBUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2hXVWthRVJRUVBJOztSVFJgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTlJQUFBRS0tLSEhKSEVGSUlJSElpcnZ5eHl5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0dGRT8/QUFFQkNHRURFTFhSTVRVVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqLjH1hiouLh2xbZFU6WFhYU1E/QFZVWVxkYFZZYnJdXVddWlVFUVlaW1lfVFlnUlZWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd5eXp7ent8fXt+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+i4mKi3lucFhaXFtSU1JWVlRbWnWDWVV9kGBcWF1eV0lWXV1bW19ZSFlYWVtdWFhZV1JRTlBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVRVVFdSUVdWY5aAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ1xbXF1dV1JPU1BQUVZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT01LZnlbXVRZVVZdWktUWlVTVF5aWFdXV3prWFtbXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVRST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlNVY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTU5LTUtISkRGSEVDPlRkVX9SUVFOS1JUUU1PWVJNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXZ1c3N3enp7e3t9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJWVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz9DQ0NDQj9EUEJDQEM9Q0lHVkBITkxHXWlQSEZPRkRFRklHSENESEdIS0dEQkFEQE5RTVJkcnR2dXN0dXp8e3t7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgmtNRz9AOjs+QEA/Pz5qUUthRUZISUVCP0dMTkdNUVVJQkU/Pzw9PD09Pz0/QUNDQD88PUI+Sk1HVW50dHVzdHZ4enx6fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqamZgW1FSWlxZXkpKUFFOS0xRUlFUVlRXUVFXVlBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZUNAQEI9OkJDQUFEQlxdT3tOT05OS0xNT09RTEtMV05IR0BBPDk3NzY5OT07Ozs4OTg5PzxCSD9cc3R1dnV2eHp8fHx9fHx9fX5+fH59fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJSFBSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEZGSEJBR0lFRUZETVJQYVdSV1FQU1NSVVtPT1FXUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxDPmVzc3Z3d3l5e319fHx7fH19fn57fn59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aWE1MVFRTUFFVT0xSU1RXWFRUWFFMV1laVlhYVlhZXVdYWGhza11WYXNrYWFfXmRhX15ZVFFOTk5MSUhKS0lJRkNRUFNbV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5OTg5Nzg4NTc1Nzg1OTlHbnF0d3h5e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fn9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1RWWFhZU1VUTEtUVlVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTE9SUk9NTU5OTkxKRlFQVVlTVE9KTk9VU1RcVlJVU1JPTUxJSEhGPz88Ojc4NzY1OTk2NzY2NVdwcHN3eXp7fH1+fX58fX18fX19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG9mZWRjXF1SVFpWV1VUV1RSWFhZWVlSVU9JR09QT09NUkpPUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBSTUlMSk9SUFJSU1RRUk9MTEtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9xdHd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSEdFSExIS0lGTE1QTUcvRV9SPjM/PmpvYVJSUUBHVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR2ent7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRUZISk1MRUdDT1JDOEVOU11mU1FTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydXl7ent9fHx7eXx6en5+fHt1dHZydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUWFdVTUxLSTw5ODc7PkA+PD1BQEI9PkVIR0NGRklHSkpARkFBQEZIRUpPSFBSYVxRUFJOU05PUExMT01LTUxNT05bV0tNUU9HSUhDSEpMTEpGRkZFP0JDPjxCRz9CP0FkcHR3e3p7e3x7enp3e3d5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSEREPTk3Nzk/Qj47P0JAQD5BRElFQ0dHSUdJRUJCPz49Q0JBR0lETU9iZVFNTk5XS0tNS0xNTU1MS05OU2RNSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES25vdnl5eXt7ent6d3R4dXh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEpEP0E9OTk5Oj9CPzxAQkJBREVHS0ZDSElHR0hDQz9CPz9AQT5ERURLTVJUTEpJTVRHSUlKTEpLTElKTE1PUFFQS0dDS0dDQkpKTE1PTklKSUdDQ0NESUpNTElZcm13eXh6e3t5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFHS0RHSEhHSktJSktER0I9Pj06Ojo7QUI/PUJCQ0NIRklMSkRJSUZHR0NDO0FAQj5AQEJFRElNUEhIS0dIS0RISUtNSEpMSElKS0pNXFJISERORkFES0pNTVBNS01KS0ZHR0pNTlFOTGJtaXZ2d3t4fHp9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLQ0ZFR0VGRkdFR0JDQD08PTk6OjpBQ0A+QkNFRUlFSUpMRklJR0ZGQ0I7QUNDPkBDQ0NER0xOSEtOSERIRUlMTk1HSUxHRkdJSUxOS0lIRU5JQkZNTE5MT01OTk1LSEhJT1JRU05SZmZmcW9zeHV7eXxsaGpuZWtxbHNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pERkZFQ0NDRUBEQj5APzo7Oz06PT5DQT5BQ0VGSkZJSExIR0dHRkVDQD1FRUI+QkNDQ0RHSElHTVBKRkZHS05PS0ZISkZFREVJSkhLSUZIUEtDSU1MUE1PTk9PTkpKSUxSVVVST1dkYGFtZ3Byb3J5emdlaGhkaWxmcWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMR0VFSENCQUJEPUNCPkA9OTo9Pzo9PkBCPkBCREdKRklGSUhGRkdFQ0NBQUZGQ0JDQkRFRUdHSUZMUUxJT0pKTExJR0hFRkVEQ0lJSEtKR0tSTUJOT01RTk9PTU5PS0tLUFVXVlVUWF9eXGlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWpzdW51dHNxcmprc01HSEZIQkJAREQ8QkFBQzw4Oj0+OT88P0JAQEBERkhFSEZGSEdGRkRDRUNESUVDRkVCRUdFRkdHRUpNS0hRTUpLSEhJRUZISEVDSUpJS01LT1NORFFSUFFRTlBNTlBNTE1TV1ZYWFZYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW95TUhHSEhCQkJGRTxAQ0JEPDc6Pj06PjpAQj4/P0NFRkRGREVIRkRFRERFRkdKRUVKR0NHSEZIR0VDRkpKR01KTEtISkxGSUlLSEVLS0xNTk9SVE9IU1VTUFNPUU1OUU5NUFdaVlpZVlpdWlhhYGBgX2hlY2BkZmhnamhoaWZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSUhHSUNBQ0hFPEBFQkU8ODo+Pj08PEFCPD8+QUJGQ0VDQ0hFQ0VFRkdHR0lGR0tIRElIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5MT05PUlVWT0tVV1NRU1FSTE9RUE9UWVpZXFpZW15eXmBjXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdE1JS0hKRkJFR0U8QEdDREA6PD5APz4/QkE8QD5BQUZDRUVESUVGRUdFSEhGSEhJS0pGSkhIS0hGRkxJSEhKR0xMTExMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUVFMT1JSUVZbW11eW1xeX19hYGFkXWRgZWZgZWhqY3NzZmpnZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SktMSkxHQkVERTxARkREQzs/P0FAQEBDQT9CP0FDSENGRUZJRklGRkRJSUdJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOTk5QTE9QUlRYVk1OVFZUUlJRUExOVFNSV1teXl9dXWBfYGFhX2FjZWJkaGJkaWpndotsa2lnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2bndLTUxLTUdEQ0FEPD9FRUVDPUFBQ0JCQ0RBQ0RBQUVHQ0hHSEhHSkdER0lHSEpGSUxISUpNS01MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNRV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAQ0FFRERGQkNFR0NDSUVDSUpKSUlLR0RLSkdISklJS0hKSk5MTkxJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BidnVodWNhdmBYbnFiZHZpbnpmW2x0YGxrVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQkVFREZCRkZHREVKRUVKTU1LTExHR01JR0pLSEtLSUtLTkxNTUxMSUxNTFtzYmRwXmxtVU1OZnNdZmVxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm5cb3VncE1Kcnl2a2Jga2VlbXhsa3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElIR0VEQEFCQD5DRkdCRkNGRUVFRENISEdERUtIR0xNTkxNTUZKTkhKS0pJTEpKSktMTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW51XFlsUVxtbVpxbWtvbXh4dHNpcF1fcmtxalV1eXhwY15rZmJncHBqam9wcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0hFRUVCQkI+QEBGR0JHRElFRUVCRklISEVHS0pHTU1OTE1OR0xOSUxLSUpNSUpJSktPUE9OTUtOTkxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SE1HSURFRENBQj1CQUJGREdGTEhFQ0NIS0hIRkpMTEZOTExTUkxHTE1ITkpJSE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnRzdnNIS0hJQkVFRUFAPkREQkdESElNSUZDRkpMSUdGSk1MRk9KS1dSS0dLS0pOSUhKTElLSklISk1NTU1JS0tLU2tiW2leX2ljcnJaX1lqb19lZVVrX2NbYWFRYG1oXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydnR3ckdHRklERURGQUBCRkVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRUhIS01JSEpKS0tJSElHS0tLTEdIS0tMTExMSktNTlRbXFRQVExQT05PT1ZRT09RTk9RSklOUFFkcWlUWVdcW1xVWVpdWF1cXGNmYWFlYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0ZGQUVDQENIREZHQ0lLTEhGREdLTEhER0lQS0xPS0xXTElFRUhJSkhJS0lMSkhGR0dJR0hJRUZLSUpLTkxJUFxXXlBcW2BeTVhZU1xcYl5NWVpNWGFSSllhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNFTE1CRENCRUlFR0dGS0pLSEVFSkpLRkVISFBKTU1KTVNIR0VBSEZKSUtLSUxKSEZFSUZERkdFRUpIQ0pNS0xVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOXlxeU1peY15aXWBjYFlfYltgXltUWFdZXl1jYmNhY2VoZWtycG9wcG5ud4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSURCQkNHSEVIR0hLSUlJREZLS0tFRklKTktOTEhMTkdIRT5HR0xJS0tKTEtJR0VJRENERUJGSkRASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFZVlVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUJFR0lGR0hIRkZKR0hHSEtJTERES0pNTUxMSEpKSEpGP0dGTktLS01LS0tJR0dDREBEQUhJQj9JSkhQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYlxkY2JkY2ZYUVVUUltXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSkZGRkhHRklGRkZJTEpORkRLSkxOSkxJS0pISUZCSElRTUtLT01LS0lIR0VEP0VDSEhCQkdHRVRdWV5YX1lfW11VWFhQXV1RS0pWXlheW11VWWBSUV9fYmJgYGJiYGNiYWRkYlhPUVFRWlJbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBR0ZER01SSENRSkZISEhFRktKTVBFRklKS05MTElMTElJR0RIS1FPTU1QTE1LS0hJQ0RBRURIR0JBR0VEV1VFXFVeU1ZfWE5UVU5aWk1KS1RgYVtfWF5eYV1OWWJcYGBfYmNiXWFiV19fVFBOT09XUV1bW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGSERJUmJQQ1ZeSUdHSERGTUtQUEVJSUtLTkxMTE1LSkpHRUpNUVFOT1BNTkxOSEtBREFDREZEQ0JFRkJNSEJLTFBPTkxGTUZHSUpIR0xLTU9QSUxPUE9TT0xRU1JVWllXWVhYZFdPU1RQUE5NT1RTW1lYWl1cYGFkZWNnY2tscHNyenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHR1hMR0hKSEdNTFFRSUxLTEtOTVVOT0tLTEdHS1BTU05QT05PTk9IS0ZgRURfTERmZEVNW0leW3JtT01VbVlMQ1FgVWtXZ0pdWFVeRE1RVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalNXVlRbXFtgYGFhYWJgZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xIRUdGSEVFS09TSUpGYFNHSk9KSU9NUlFLTUxMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUX9RSXxZWXFzWFBtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbYFZWWH9qdHV1X192X1hhW1xmW19hYWFhXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1OQkRMTEdJTEVRVkxLTklLUlhXUU1PT01RVE5PUVBLS05HTVBTW1pUUVJPUFBQSkhaeF1UeGVoWlJUUXZndGxwYm5malFyT013bWpycHNycXJwb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29zcnt8b355b39yX2BgYmFaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEpLR0pQT01NSk5WXllVTFFTTlhaTFNTUk5MUElRUlRZV1dQVFBQUFFLSGd4bGN4cm1bS01VeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en5seHp/b2hvWXZ2anV1cIFgcmd8aWx4fG9eX19iYVtdYmRnaWlkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3V6bnx9eXdybk5LU3ROQ0JGUFBISktKTFFPT09NUFpgWldLVFdQYV5SVlFZUkxPSVNUVlhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JocXVubXlwd2x2dHRybW5ddH56a215fGt0bHxrcHZ1eF5fX2JeXV9kZGlnaGZlXmFiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0cm9tTExbVkhHRUdSUElMTUtMUVFQUFBRV1xYVU1VWVVmWFJSWV5TTE5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9bcHp7XmB6c2Nyb3hxaGR8aXJ8XlRMbGB2dWtpdXx7bX54a3xwXV5fYlteYmRkZ2VlZWJaY2Npa2tyc3J3Z2xpaGRnYWFrYWdzcmxnbW1yfGttaGt7dG1ta21PSEpLSElISFFQTE5PTU1TUlJPU1JXUlZUUFdbVlZUVFRhX1BOTUtUU1NRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFQTlFRWFlSTlBVVFhYWFtaVVJTV1tXWFdaT1NVV1hYUl1ZV15XVFBZUlZXV1dYX1tncl5bW1ldXV9jWl9jY2RmZGNjYlpjY2ZmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0tMTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlXT09MTVZUUE5VU05PTUxRUEtKUlFLUU1LS09SVVJRUlNSSUhMTk9RUlFRUVRWUlhXXFdTU1BRVVVWU1pRT1NSWFZUWVZUWlVUUlVTVFVXWFddWl5hXVtaWlxcYGNbXWJjZGZkZGRhWWBhY2FiaGhpbWNhZF5fY11aZFxibWFeZmVnbXNkaWhra2VkY2ZoUEpLTE9PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFNQUEtPV1NQTlVQTlFOS1NQTE9VU05STk1OUVRRVVFTVFVOS01PUVRUUlJRVldUWVpbWVNVUlRXV1dZW1RPVFVYVVVaVVdZVVJSV1ZVV1tZWl9dVVheXF5dW11hYV5bYmJjZ2ZkZGJYX2BiXmBoZWZlYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FbWlhXWFpaWFlWXGpkVlhZWldWU1NPSk5WVFBPVFBQUE5NUVFQUlhUUVFPTU9TVk9YUlRVVU9OTVFTVVVUVFJUV1ZaXVxaVldRUldYVltbV1FUV1ZWVllUWFhVUlJZV1ZaXVldX15WXl1eYFxbX19fX1piYmRoZ2RkYlliYGFeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFPVVxbWldbW1xZWltkcW1oZF5bWVZVV1FMTVZSTU5ST1FST0xQU1JVWlVTUFBMUFhXUldTU1NYTU9QUlRYVlVVU1VZWFteXVtbVlJPVVZWW1tXUlRXVldYVlRYW1RTUlpYV1xeWl5fYFVhXGFhXWBiX11gXWNgY2doZGZgWmNgYV9fZWRfYGNbWlxbXFlaWVlXXFlcW2BeX1teXmFgXmJcWWBaUU5PTlZRUFRST1VUU1BXXF1cWF5cXlZcXmpxd3mAYlxbVlZYUU1PVlNOUVFQUlRSS1FUVFlaV1VPUU5TWFdUU1VSUlpPUFNTVltWVldUVlpYXV5bW15WU05UVVZcXFZSVFZWWFlTVFlcVVNTXVhaXV5cYGBgVmFbY2JdYWNfXGJhYl9jZmlkZl5bZGBhYGFjZF9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVJRV1JUUFtdXl5bYFxgVVxdaWpyfXNsZ1xVWVdQTlJaU1JRU1JUVVRLUlZWW1paU09TUlZWVlRPV1JTWlJUVFRYXVdYWFNYXFheXVlaXVRVTlZXV15bWFJVVVlZWVVXWVxVVFdeWV1dYF1iYl5ZX1tlYV9kZF5eY2NhXmVmaWRmXl5kYWBgYWJkYGJeWFpfW1xbWFhYWFdbWlxgXFtbXFtYWVteVl5ZXVBPT1JaUFpUVVZWU1RUXl5gX15iXGBVXV5ia3l0bH1rWlVZVVFQU1xUVVRVVFZZV0xSW1ddW11ST1VTWFdXVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUldSWVhZX1paVFVWWllaV1haXFZVWl5cXmBhX2RjXF5dXWVhYWZkXl5kY2BcZ2RoZWRiX2RhYGFgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09RV1lRXVVWWVdXVVhfX2FhYGNdYFRdX2JlZXWBemhYWVlTVlNWXFhXV1ZWV11YT1VdWl5dXVRSV1NXVlVTVFhSU1ZUWFhYXV5YXVtWXV9YX19YXVZRWVRZWlphWVxWV1hbWltZWVpbWFZdX2BeY2JiZWRcYlxgZmFkZmRfYGRiYltmY2hlY2ZhZl9gYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlNcVFZXWVZWXGBhYmNhY19fVltgZGFfenVvaFlcWlVYVFdbWllcWVhZYFdQVl5cYGFcVFRYUFVXVlRWV1JTVVdaWlxfXlpfXFZfX1leXlleVlNZV1lZXWJaXlZXW1xbXFtbWltZWV9fYGBkYmNkZWJkWWJmY2ZmZV5hYmBjXmJjaWRjZ19nXmJiY2FhYF5fWFRbWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNQVlpWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheXF1bVldYWVxcXF9bWVtiVlRYXl1hY1xSVlhQV1ZXV1dWU1VUWFxcXmBgXWBdV2FeW15cW15YVlhYW1tfYFxfWFldXF1eXlxbXVhbYGFeYGRjZGVlZmJYY2VkaGdkXmNgX2VjXWVpZGVpX2ZeY2JjYWFgX19bWFlaWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWlhbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBXV1hZWVdWV1ZdXV5gYWBfYl5ZYV1dXlldXllYVldbXGBeXWBaWl5dXl5hXFtbWlxfYl5iZGNlZmVmYlpkZmZpZ2NfY15hZmVaaWljZmljZV5iYmNhYGBfXV1aWFxZWVhYWlhXWltaWVdYVlVbXV1dYGBiYnhLWFdcWVdcW1xdWldcXV9gYmRhYmFdYFhiY2JhY2FiXVtcW1hXW1xfXWBfXVtgZFxcWFpiZWNhUlxaT1hYWltbWldaWWBdYGJiYGFjX1xiXV9dW15eWVlVWF1eX2BfYFxbXl5gYmNcXFhcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiXGNnYFxpaWJoamVkYGJhY2FfYF9dXVtZXFlYV1hZWFdcW1pXV1hPWFpdYWNmZnJrf0pZV11aWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBiYmJcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxdXl9aWFZbX15dYWFgXltgYWJlYl9dVF1gYGNkZGZlZ2VmZmVeZWZoaGdkZGBbZWdeYWhoYmhoZmNgYmBjYl9fX11dXFpbWVhYWFZaVlxaWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ1dXV1dXV1dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t8fHx8fHx7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnV0dXV1dXR1dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t8fHx8fHx8fX19fX18fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx4xdTS0tLS1JN7fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKgkU+Pz8/P0AwKisrKyolYpKMjI2Njol+f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXjV5+Tk5OTnmXt/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjI2DOjIzMzMzNCEaGxsbGxRdlo+PkJCQi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dn5/f39/f395d3d3d3d3eHl5eXp5e3hub29vcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx2dXV1dXV1dHNzc3Nzc3l9fX19fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dHR0dHR3dHZ3ent4e3h3dnd6eHt6eX15eHh5eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3x8fHx8fHx8fX19fX19fHt7e3t7fHx8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eH16fXp7fXt3d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHp9fH1+fHd4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4OEgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3d8enp7fX58eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHt5fH18fnt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4eXh6e3l8eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzc3NycnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3N0cnFxcHBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3Nzc3NycHFzcG9ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJzcXRzcnFvhoRucG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcXiDcXJycHedf25wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcXFxdqGIcHJwj6F9b3BwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXJvlap/cHegoX1vcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcnCPsZ5wgaWhfXBxcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycIy2qpGbsqZ6cXFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzc3Nzc3N1oKejs6impXh0c3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn58dnZ3d3Z1eHp4eHh4eHd4eIKon6Oxo5ukj3p5enl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fn18e3x8j6ORk6WcoKGWe3t5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX19fX2OoJiWmZyWkJmCf399fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYCBgI+xqqWfoZ+hoYN+gYB+f39/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f3+AgYCDpK6hp6GgoKisnoV+fX6Af35+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjImGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+f4CFj6expJynoaCgoqOrqZyMgoCAf4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4KGi5upqqOdmqKdn6Ggnp+ipaGVhoGAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODgoSHkJiYlpeZnIyUn52bnJqUjIiEg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgoGBhIaOlpeVh4+anJaOiYeGh4eHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj5CSkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGCgYGIkpeOlJqThoeHiIiIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SEgoKCh5KWioSEg4OFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6RkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4GCgoKCgoKBiJGCg4OBgoCAgH+BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAgICIkYCBgoODgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZaIhIKEgoJ/gIyWgoKBgoSDgYGBgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmIqDhYSEhIKAkpqGgoKChIODgoOBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSk4+MjIqFhIODg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgY+Mg4F/fn18fYucjYCCgYGCgoaUk4yBgoGCg4OBgYGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiIOEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlZeJgH19fX17gZeLgIOBgYGAj5OMkIGCgYKCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICVn4p+foB9h4p9hIWDhIKDg4KOiYWMgoKDgoKCgoODg4KDg4OCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUk5KSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf359fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMi4iFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDipGDhIuFgoGBfn2Bh4aDgH5+f35/fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFhoWFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6Fgn9/f39/f39+gICEhYSFhoaGhYWFhYaHh4aGhYaFhYaHh4eIh4eHhoaGh4aHhoaHh4eGhoWEg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoeGh4eHkZSTkZGQi4mIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoODhISDgYCAgISEf35+f4B/f39/f4CAf3+Af3+FhYaIiIiHh4eHiIeIh4iIiIaGh4iJiYmJiIeGh4eHiYiHh4eHh4aHhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoOCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4OBgICBjImBgIGCgoGBgYGAf4B/f357eoCGh4iKiomJiYiJiYmJiouKiIiIiYmKi4qKiIiHiIiIh4iIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaGhoWDiZSTkI+QjoqGhIaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgYSEgoKCgoKCgoB/fn19fX1+fXx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGh4eFhoiIiYiGhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEhIGOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoODhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX5+fn5+fn59fn19fYOHiYqKh4eFhoeHh4eIh4iJh4iGiIeGiYmDg4SDhYSEhYWHiIiGhYOCgoOFh4aHhoaEgoKDhIKDhISCgYKBgYGDg4SDhJGSkI6PjouHhYaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoKBfXx9f4B/fn5+fXx9fXx5fIOGh4eEg4GDg4SFhYWDg4WEhISEhISFhIKCgoKEhIGCg4OFhoWEgoGBgoKDg4WEhISFhISGhIOEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhISFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4F/f4GDg4ODg4KCf319f4CAgX99fn59fH19e3p6foSEhIKBgYCBgYKCgX9+gYGBgoGDgYKBgoKCgYODgH+AgIKDgoCAgICAgYGBg4GBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn1/goODgoOCg4J9fX5/gICBgH59fX19fn18enp6gIKCgX9/f39+f3+Afn2Af3+AgIF/gICBf3+AgYF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foGDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gIB/f4B/fn59fn9+f4B/fn9/gH+AgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af3+Af3+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7gIB/gIB/f35+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f3+Af39+f3+AgH5+f39/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH59fX5+fn9+fX19fX18fHx7enl5eXh+gYCAgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIKBf39/f4CAgH+Af4GAfn9/gH5/f35/gH99fn19e3yGk5KMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KDg4WDgYODg4WEhISEhIODg4SCgoKCgoF/fn19fX5+gH19fX19fX19fHt6enl5eXmAgoKChIOAgoOBgIKBgoGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTj4mJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf39/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGhoeIh4eHhn99gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCCg3+DjYSEhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSCg4OCg4WEhIWDgoODgoODgoKCgoOCgoKSkIuIiIeJh4aGhIaFhYSEg4GCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaHh4eHhoeFf319fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKPjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgoGDgoB+fX5+e4iRfHyOln99f3+ChoqFg4OEgoGDjYl/fX+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fXx8fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfXx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWBhJGRjouMi46KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIKCg4WDg4SFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn19fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fXyAgYB9ho+BfX2Cfn9+gIJ8fIB/goCCgH59e4qCfYB/foGAgIGCgIKAgICBgH+LlJCMjI6OjYiIh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYWGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIKAgX5/gXx+fn9+fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX18fXt9fX18fXx8fYB/gIB+gH5+gZSSjY2Njo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoCBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fHx8fHt8fHx6enl7fHp9hYODf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fX1+gICBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6NjY+OjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+ChIaGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIOAgIF9fn1+f32LhIGGfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn18fn9/fX6Afn9+hJKNjYyPjYuKhoSGhISEg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5+gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fnx7fHx8ent6fX+AgISDgn9+f3x8fH18fYGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CLkI2NjI2LioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn5+fX19e3x9fXx6fHx+gIKBgICAfXx9fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISDgYKBhYaFhYaGh4WBhJGPjYuKi4eIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/gH9/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+f358fX18fHx7fn57fHt8fH18fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJioiLiYWIko+MiYqHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8f4B/f39/f4CAf35+fn2AgIB/f39/gH+Ag4KAf4CBgICAf3+AgX9+fHp8fX1+fX1+foyGfX1+e3uDg31+fn19fH19fX19fXx9e318fX1+fH59fX19fHt7e3x7e3x7ent7enp6e35+g4WIh4iKi4uKiYyRkI6KiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99fn9+e36Bkox8fX+KgI2Mfn59fX1+fn1+fXx8fH59fH18fX19fn19fn58e3t7fHx9fHt7e3t5enl4eXt+f4ODhIeJioeJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2Bgn+BgYF/f4B/gIF/gICBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+g5GEhIOBf359fI2HfX1+fX18fn58fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiPjouLh4WEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKFhYSCgoGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn5/f319fXx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiY6LjIiFhYWEg4OBgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYKCgYGCgoKCgYGBg4ODgoWGhIOBgICAg4F/gIGEgX5+gH9+foB+fX5+gIB/gX9/gH9/f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHx8fHt7e3x7fHx8fXyKi4mIhoaFhISEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgYB9f39/gICAgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fYmHh4WGiIWEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISEhIGBgIB+gIKAfn5+gX9+fn+AfX6AfX19foB/f4GAgYGAgICBgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAiIOEhIWEhISEg4GCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4GDg4ODhYSFg4ODhISDg4SDgYB/gH+AgX59fn5/fn5+foB9fX98fX1+gH+AgICCgICBgIOCgH+AfoCBfoCBgIB/fn5+fn19f35+hYWBgYB/gIOBf36BgH9+f36Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19fn99fn9/f359f3x9fX6Bf3+Af4CAf4CAg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Bg4F/f4OCf3+Af4F/gH98ent6fHt8goB/gn9/gICCgoGBf39/goB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBf3+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4GDg4OAf3+BgYCCgYGBgICAgICAgICBgICCg4GBf4CEgH2Bg4SAgIF/gYGCgH16e3t8fHx/fn+AfH9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhIKEhIWEhISBg4KBg4F/gIF+f4B+gH19fX6Afn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgYODgYF/gIOAfoKDhICAgoGCgoSCfnt8fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgICAgICCgoGAgH6Agn9/gYKDgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3x7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAf39/f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+Af4CAf4GCgIB/foCBfn+AgoGAgYOChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fXx/gICAf39/f3yAf3+BgIGAgH98gH9+fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn59f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXh5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAfIB+gIB/gYCAf32Bf35+f399fX1+gIGCgX5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59gICBgICAgIB8f3+Afn+BgH9/foF/fn9/f319fH+AgICAfn9+fn99fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3fHl3eHd3eHt7e3t8hYl9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYKBgYKAgYCAgYB+f35/f318fn2AgYKBgICBgX1+gH9+f4F/gH9/gYB/gH99fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KBhIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgYGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYGBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/fn+Af39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f356gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoKBgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gIB/f39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgYF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+Afn+AgH9+fX6Afn5/gH9/f4B/f4CBgX+AgYB/gYCBgYOCgYCAgICAfX6AfYCDgnt+fnt8fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoGAgYKBf4CCgoKCg4GBg4KAgoGAf3+AgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgn+Af4CAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBgICAgICBgICBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHh4dXh4eXt8fH18e3x8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgoKCg4CAgoGEg4OEgYGDgYKCgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgICAgYB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKCgoKAgoGBgoGAf4CAf4CHfn58e318e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCgoSEgICDgYaDg4OBgoSAhIOCgoCAgoKEgYGCgYOCf4CAf4GDgoGAgYGAgH+BgYGBgIOAf4CDgn9+f4KBgIB/foGAgX+AgIGBgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/f4R9fX18f317fX97eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCgoKDhIKDhIOAgYODhoODg4KChIGEg4GDgICCgYSBgoKBgoF+gICAgoGCgYGCgoCBgICAgoKBhIB+gYOCf3+Ag4KAgX+AgoOCgIGCgYKCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCg4SGhIKDgoKEgYSDgYOAgYOCgoKCgoGCgH+BgICCgYKBgoKCgYCBgYGCgoKDgH6Bg4F/f4GEhIGDf4KCgYOBgoKBg4ODhIGChIKDgoKBgoKDgYOEg4SDhIWEhYOEgoGDgoGDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SChIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GCgoCAgoSDg4KBgoKBg4KCg4OEg4OEgIKEg4SDgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7fYF+fHl8enp6fXx8gX56fHx9fXx6e35+foCAf4GBgICAgICCgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhIGEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYOCgIGDhYSDgoOAgoKDgoODg4SDhIOAgoOChIOCgn6DgYKEhIKDg4OEhISDhISDhIOFhIODg4KCgHyAgX98fH16enx9gH1/f3x8enx+fX19fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHx4dn92d3+Eh4OCg4aDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KDgX6AgIKCg4KDg4OEg4GCgoODgoOCgoGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSCgYKAfYGCgH18fHt8fIB9fX6Afn59f358fH19fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhYOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4KBhIOBg4OEg4OEhIWEhISFhYWFhIODg39+gYSAfX18fHx8f4F+fn5/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4OFg4SDhX9+goqLhYWEg4KEhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4SDhYSFhYSBhIODhoKDgoOBgoGEg4KDg4WDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhIWFgoeGhoSEhISFhIWEhIOEhIGCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeoR/f39/hISCg4OCgYOEg4SEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fn99foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SFhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN+g4N9gX1+f31+goOCfH+BfX+AfX18fHx8fXx8fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYKGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1ud2xweWx1fX9/fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWHhoaAgoWDg4WHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fnyAfoCAfn6AgIGAfn5/fn6Bf4B/fn2AfX+AgX+Afn5/gYB/foKDgoKEhYeHhH6GhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYSFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSBgX+BgYB9f3+Bfn9+fn+BgH5+gYKAgIKEh4aDg4aEhYWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYaFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhXiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfXVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX16fXt8fX1/f319f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhIaEhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEg4GDg4OEhYSFhIWEhoOFhoWFhISFh4aEhIWGhYZ9d4WEhISDgoF9f357fHt+e3x8fX9+fX1/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoeFhYWFhoaHiIaEhoWHhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIaFhIWFg4aGhYWFhIaGhoSEhYaDhYSChIODhYODgX2Af3x7fH57fHx9f358fH59gH59f4B+foB/fX18gH1+f35+fn98fX1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKEhYaGhISDhISDhIaEhYWFhoWDhoaFhoWEhoeFhYSFhYOEh4aDgoOEg4SCfoGAfHt9fnt8e35+fXt8fn1+fn1/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGiIeJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaEgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGh4WEg4SEg4SHg4SBgoSFg4GAgIB7e35+fHx8fn18fHx9fXx9fH59fH19fXx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaFhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WGhoaHh4eFh4aIiIeHhYeHh4aGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4SCgoJ/gHt9fn58fHx+fXx9fXx9e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4eIhoaIhIOEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH57e3t6e3x8fHt7e357fH17ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhISFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIh4iGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFg4aGh4aFhIOFhYaGhoaGhYaGh4WHh4WDhYWDgYKCgYOFgoN+gYKBf4OBf35+f35/fHx9f317fX18fnp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYWFhISDhIKAg4GGgoGCf3qEjHuAhIWHhoaGhYSHiIeHh4WFh4qHg4eFhoaIhoWHhIaHiYaGiIiHh4aHiIaEhoaGh4WFiIOEhYSHhoaHhYWEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAhIODgn2BgX9+g4F+f3+AfH98fX1+fXt9fXx9eXp6eXt9fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCgIB/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeGh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoiFhYSChYWGhYaGh4SFhoaGhYaCg4OFgYCBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp7e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICBg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiFhYiHiYeGhYWFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhYKCg4N/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18f359fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn1+f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhISGhoeHh4WFiIaJh4WEhISChYOEhoKDhYSFhoSHhoWFhYaDhIWEhYaFhoSEhYSFg4WEgICCg39+f39/f4CDf3uAfX1/gn5/gX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6enp7e3x6e3t7fH1+fX2AfX18fH2Af318hoOGhoaGhYOEg4WChYGBgH9/gIB+f4GCfH5/f36AgIKCgoSEg4KBgoSBgIOCgYCEhYSCgX+AgoODhIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhISGhIaGh4aGhYKEhIOEhYWFg4SDg4SChISAf4KCfn1+f35+f4R+e398fICBfYGAfX6DfH5+fX1+e357e3p5e3p5enp7eXp6ent7fHp8fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1+f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFg4ODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7eXp6eXp6ent8eXt9e3t+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT47QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vKysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fY2djY2NjY2NjY2dnZ2djX19fX19fY19fX19fW19ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtBPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi3qaenp6enp6enp6enp6auubi4uLi4uLi4uLi4ubCKioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZNPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7s6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OjoIaEhISEhISEhISEhISCkqWjo6Ojo6Ojo6Ojo6WVU1JTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj87PEJAODw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0dLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpaKJh4eHh4eHh4eHh4eHhZWmpKSkpKSkpKSkpKSml1dXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDw+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzdDS0tLS0tLS0tHR0dHQ3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamnkI6Ojo6OjY2NjY2NjYyaqqmpqampqampqampq55iYWJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Ozs7Ozs7Ozs3Nzc3Nzc7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs/Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tDQ0NDQz8/Pz8/Pz8/O0NHS0tLS0tLS0tLS0tLRzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7OztHUz8/O0NPQztLU1dTQz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXW1tbW1tbW1tbW1tfX1tjY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztO7nc/P0rmPvtScgoSKxs/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK1lZuz1MCUsJyxlri5r6HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/Rn6CqrtaioIuRw5N9fq+w0c7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw5Nj9CP0I6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0cWHmrHPmIedutTSzZ6ew9DPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Wp5mzyJmQn6DS08CgoNDPz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P1aWZtL6pr5GhudevoqnU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NalmbW/npqtm6nYo6G61NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NDVpZq1xpamxZii0Z6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0Y/SEhHRUA8PD4+PD09PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPQ1aWZs9GanJubrcefodLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQzs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HH0tajmrDZpauknsW0pKbW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09HVtYLD1cyTkKfXuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw8P0dFR0tIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dHC1NLUy73V0tHC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT03NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS1NLS0tPV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj0+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6Njk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ4ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+PEhGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9CR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q6ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU5NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5uLi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU1ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubi4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo5Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelpKSioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tLa2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6SlpqakpKOioqOioZ+fn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqSkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKuopqCdnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqenp6efm5qboqCalpeUmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWjoqWmpqWmp6amoJuZm6Ggl5OSlJmanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKenJ+hoJiQoayXl5udmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaWmp6alpaanpaWjoKChoZ+ZmZqWmJuanpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaGhn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqSlpKalpaSko6KioZ2cnKJqiZucmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqW2qaOkpKKhoZ6amaWBVo6bmpqYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKCnqrCooKGgnpybmp2iWV2UmpucmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaGgpqKAq6Wfnp2amZmnf1VmlZydnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuam5qam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goKCgoJ+qd3atop6cmpqcpGthaZWcn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmpiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJyen56dqIxpjKucm5ucoJduaWuWnZ2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZybmqOReXWfnJqcnaCIa2lrkp+cnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmpqjlHh8hZianJ6ZfWpnbJKfnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJuZmZmaoJyLnoB+mKCchY2BZm2UoJ2enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ucmZmZmpynoZFxZaasoWiBjXlrl5+en56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZihrZJ3ZWaml5pYZ31/eJ2eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmXp6V4Tkpwm4SEUkRheIKdm5uenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qal6uZTjc8dJJ9cFM/NmF6jpKNkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkJatc1RwV3ywqZlaZ25Ia32Igo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg36WpFyFm3zKxbHFnX6delB4goKSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5+kpFyz9fN1aacubxrXXJdZ4CFjo2Lho2UkouQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhH+CfJl3mtG9x9PHwbScd6WoY2KKio6LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYx/iI2Ni4uIkoybb6KmlbmsoqGJhXZhyItaiIqJkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmRnqGdk5eboZqenKOgnYSTfI+ljYWLd3VwbKaXYYGPi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaiprKqqr6eWflhyhnl5gG1raXV4f3h6oKGknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipamop6uphXBSYHRxcnppZmJpa3B8haKpp6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkqKaanaSmoqOwmHBpT1Z4dnR8aGFkZl9fbn2KoKSgoJ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKOnoqatp7CyqXxpY0lSc3V4gWhgY2paW2JrdYORnaGgnaCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqmioKGoqa21ury9rIptZ2FCWm5wfX5uYV9mW1lhYWhweH+NmqChopmWnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY21paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOrqqeuucHGzMW3pY5yaGlaP1Nwb3FsdGhhYVpYX2NhYmpxdnuMn6ednqGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gqrS/ztnbzrqrnIhvYGFiU0NKeWtgYm1sW1tXWlldW1peY2ZmaHePpa+npZmhpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1pdmtwaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW8ztrd1MCkinZlXVlaXFNKQ21qlJ6UVlRYV11cXV1YVVdbaX6VqsHHurahp6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFpYGZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PDub3Axs7RzbeSdWRbWVpXU0lVb6qzpk5VXmFiX19fZneQp7q+wcXFtLa2qa+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3bm1bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvFwcXGwb68zMSwkW9cVVhTUFOhtZtOWVtdXWBtjqq6wbW5qaextau1sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH6Ef2pmaGFrbGdudXJydXFnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEJCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/w8PGxsGxkr+/zs68lWlYV1pMmbmTTFRZV2B/prywpqussqaqqamrrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3VrbG5kb21pcXhvemppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMS5tcC3s7zBxr6peVhVUYq3hkxTVV2EoKa3r6WttLStrqWko6ekoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5eXt3bmtpaHZaZ3J4c3lmZl5kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDxMLFvri9wcO/x72WbFJaaVpRUmSUq5+mtLKtrLi1sqypo6GtqaynrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVmaWpoXmpvbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMe/xMfExMbJzsqcVkhPUGutu7fAvb65vLq8urysraapu7q5t7+ytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aWpqdG55bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnNxcXFw8XEycvR06RSTGCwx8DJzcbEwcTHwby+tLGwsMK+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGtqd2xpZnVvdGNdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwsPBwsbGxsjOikmTzszHzNDFtr+/wMC6u721s7PAv7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVnY2pkYmttbm9eWV1WVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvr3BwMDAxapOpNHMxcnRwa+9vbi5u7u+t7Sxub6zvL6xubW4u7a8tLW5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFjY2RqY2djW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Bu7/AvLvEvbrAxL+9vbi8wMSvU5zMxMDByb+wwb+6t7u+ubW4tLi8tL24tbSws7yxt7e4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhYmNoamdnaWVpXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdWOvL67w7W6x7e2ubu8uLm1usTJqlSTyL+/u8G+uca9wr+8xbi2t7S4tra7u7m2tLe6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZmVmcGpla2hYWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vM/Fea3Lvce3ubittrS3ubO1srvFyp9Vi8q/v769vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfWtucWdxa3RmYm5gXFRIS0tESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTXr3aEvsjPwsC4rrW1u723ubG+w8eUXIbOw8K/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHJmbGpudG94Y2diXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsfJ0Zt0d7HR0czKxLW6v8TIvr60vr+/hWp6y8bCvsG8v8PMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4J0b2xsdGxsbl9jXmFiTkhOP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQwrq+vMS+t7zAv8nPx8jKysKIdneozMzLzcrGwsPLzsG8uLy5r4J8bbzIxMDAv8TAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIe21teHxgcWRbXl9fVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u6rNvDvra+wL6+uqacqrO3w8CmfHp8n8TGy8jBw8DAycrBv7u5saOYin6wyMXEv8DBv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnpuc3h0aHBeXF9cWlFFRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vFtm2uzr22ucC8qn1uaG5tdIKXmXV7f5y+v8bAucC8vsXEvb24sa+nrJeXncrDw7y9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bHZ7cW5pXGBgWVNQQUZJR0tARUNIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbF2grO9trXBpIZpWl5gTlNbXHB2eoWkuLfCurO7t7u9v7q7u6+irLKiqIK+xcO+vL+7u7i2wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z2d29xYV9mXVtVSj0/P0dGPUdDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmmhHiLoa+1nGpmZ1ZZX0lJTVBUb3uLqbC3vrmytbK8uby2ub61lq/AsLV4rMrDwL2/ubOusry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXV3dHdybF9jYVxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/GqId7doyhmF9TQ1lVSGJqVU9FSmWRpa+vtrq1tLKsvLm4tbjBvY2nwrKydqfKwr+5urWupayzsaawraidoJ+lrba1wre2tKWoqqiwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3ZzbmNeZ1ldXVNPTkE+SkJAS0pANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7SQgXmIkG5OSz9lWUJPeIGTaE1DXoWxtbO1srSvrLu6uLa5v8V4jripn2arv7i1srGtrZ+kpqedpKWclpmZmZ+prrmsq6ufpaikq66vp7Crr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211amxdXGtVXVtQTkhER01CRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhXxYRkFPh1hKSll4joNjQVWjubO0srCxrbC5uLa7t7u8kqSzrqR0rLCpq62ro6ihnZ2el5eglZKWl4+Yn6iupKOkoKKmoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh1dG9lVWFkV11RT01IQElSRE1DPTg4NzU6Nzw+OTs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yvKmYmZVoTT9TeHFQSUlLaJ2AWkVVsLqxrLOvrqyttraytLWuqaeemZuen6aonqCoqZ+hp5ablpeOnZSPkJaNl5ukqKCgoqKipaWdo6OgnqWgpKylpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CXlZaYn56em5mml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoYh4g3x2f3pjd2xuXVFpVVBPR1BNTENQUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3CqqW8Z0RTm31RWElLYUpWjWJlZYOvtaqytK6qq6+wsrOtpZ2Rl5OPl6CfoqCco6SfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6OoqJynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJWTkI+RkZmQlpWYl5+YnJmbpJmXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fH91dn1ua3tkaFZSZE5KSEdPU05LTkg8RUA8Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaCrxr/Kn09BdJhxUG5KTGNmdXRgXWJ0krKvrrO1qqasq6KbmZSNkZWWmJicn6KinJ2knpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqKlopqZnq+orrKrpaqqoJuYmJiVk5aak5WVmpabl5eYoZ6cnJaboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3l8ZXl5YGJTVmFISUpLU1RJU1FNOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpcbGjFdTSmakWWZ9b3JbUmtjXGdiYG2RtLCwuKymoZydmpSXmpmQjpGVkYyOjZOZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKehoKOxrrKxtKqyrqOZnJ2eoZibm5qYmZuUlpuWmZyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1paTVFKT09WTVNNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp+qo4x5VWlyd3VwY3d2WFdiYGRpW1pXaK2urK+nn56ioJaQk5ugm5mXkpOfnKGjm56blp+an5ebop6loZ6kn6Sora2orKmkrLS3trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7a4s7itsrSkoJ2loKyhoaKhoJqYlpWfm5uYpaGgnqOhoJ6bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCgH14dmp3dV5tW1JhSVJVSEZVV0pDTUc9S0g4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCkf2+CcGBjWExbUlpMTFFZUkhPTkiZrKqppJ+fmZKSlJiYlpaVjIiLjpWdnJ2dnpeemaafoKilsaqnrqOrrrawtLKxrra4vb+6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquusbm4vK+zsLXCvLe+s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+oqKWknp2qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhX52cm1pd21obVxYXENXTkpHTUdDRk08Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKOenIliV15lYFdNUUc9PkBDRD8+QlJ4qa2pqqWfnp+io52enZqcm5STlZSenZiUhZ2aoJqrpKuysLmysrGysbq9vLy5trjDvr/Cv7a7u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsS9w7y3s6qzraqztK+zrqqvo52sqLaxraOwpqCjsLGusKSlr6OhoJqhpqGkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF8dHJra3VycWhWXFFGVUhESlBJP0VBNEZIOTU8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqgn5V8X15lYFFGRDtDPkY8Pjk2Tn6qs6ejo6KgnqWrpp6YnJSRmZ2ZlYyKhoiGeG2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr7HxsK3w8rKw8HHv7q0uru1u7ewtrKqurKuu7i/u7qruK2rqri7tbyurrmjpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrY2lveGtlWVtGS0xFRFRNRUNFNzo/OjU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9cmlhV05FPklZfG9hQT1cjq6soJmbm56emZeXl5KNj5eXk46NkIyCg4J3cnFtcI+mra60ucW7zcfLv8LMzc3Mx8nRzMzMx8nFxszQ0tXO08m9wL/Du8bFyMXR083U0NPTzMrCxcbGysjPwMnRzMfGyMbCvMPBv7+/tr6zrb/Aw8PHxcfEr7+5sri8xMLCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXRzZWJncm9mXlpaQ05MREZQSURDQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjk7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ6VaWZcVElEQD9Khp6kmIOgsq2jnpyfmpiXlJKUlpGQj4yHhIOIh4OAgYGAeXFyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fS19LV1tPUyMzHzM3K083O083GycrKwsfMx8nJxr/Ds7PIxcvLy8/Hyr++v73BxsXNzMnJwMPArq+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAe3J1dmdjZ3ZqZFZXUURORkBJUUM+Qjw6MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hm2FTTEpEQz9DUrDRvbKvppycnKCkoZ2alJOVlIl9eHFrZWJocm9xe4WKgHVwbnF0cIWzw77F0dDX1tbS1s7U1tfU09HT1NTTz9HE0NPW2NXW0svJztHLxs3RytLV1tnW19PX2M7Sys/RzM/QzNPQwMnIysTMzMzPz8XHyLbAy8DSzczQx8rJwMTDyM7N0NHPzcrIzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYGVyYl1SXElKR0FFSUo+O0E4PTU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoqFZSUBBREFGUXayr6aalJefnJqgoJ6bnJqViXdpY2FfX2BfXl9fXWFsdXNwcG9scnF1ksTIx9TV19fX09fQ1dTa1NTOz9XU1NHRzNHO09fW09XQz9LT0cnT0cjQ2NfY0djS19nU1czPz8rN0svP0cDGw8jGz87R0dLIzM3Ay83G08/Mz8jFy8fHyczK1NTR1c/SzNPCucWxpai1rqebqKulnbKosLOtrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNQDw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD9APUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu32NTV2dnRztC/vMzJtr6upqqooaOrZUM4PT5EWIKqqJ+XlZeZmpyfnZicnJJ9cWVjYl9fYV9eYWBfYGBfYGVtcHBua29yd3eczMHT1dPY2NbZ0dLS18/TzsvSzdXU0crPzdPW0tHWzc/V1dHF0dTK0NTV1s7T0djX19jLyM7Eyc/Mys3AysDJys7Oz8vQzs7Mz8/IzNDQy87Lw8rHyc3LzNLTzdPS0dDQyr3IubCuu7m1q7awrai4rbO+u7Gaj6CUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Bva2FkbnBhV1xaSUZGRE1YRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksXpIRkI7V42hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYV5fX15cYm1yb29zdHZ2eaS/zNXR1tTT2NbOztPLzs7FzsrS0s/Hzs3O1MzO0s3L19bQzNHUy8zQ0tPKztHV0tXVysDKwsXNwsjKw8zExsnKy8/Lzs3QztPMxsnQzcnHy8XHwcbKzM3Q0sfQz87OzNDFx8G4ub3Dw73DuLKyvrG7w8O1qpiloZiWkpWVkouUjZqRlJSPj5WCiYZ5cXJrbWdgYHFoWVhoVk1HTElQUUI7Qz47Njg6ODo6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfDuMrV1tna29jMzM/I1tXEwrWvtKifrZd4bHBxeY+ajYyXlZCTkZGVlpWQi3xlYWJiYF1eYWNhYGBfYGFhYF9dW11ncnJwcnNxbXJ5pcfTz8vQ0NPUysXJycbGv8PFz87HxcfNytLIy87NxtHS0M7M1MrHy87Px8fP0svQz8a6xL/Gyr3Cx8nOxcPHwMfNyMTMy8zPyMTE0MnGwsbIxL/Bx8zLzM/Cy8zJx8vQxMXHu8fDyMnCz8G9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+CeG90ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7uto7Z+aIOFpKuTjY2Wj4WDg4OBfYSEfnNfW15eXmBeYGNkY19dXV5fYGBfW1pcYGxycW9va2xvb3250cjJys/LzcS6wMO7u7q6vsnGwsPAw8jKycjKyMHFzMbIys3JxMLLycHBy9DFy8i/ucK7xse+wMbPy8TAw7vJx8m8ycfFysC+wsvGxcS+xr28wcPFzMXGvMDJw8XH0sXByb/KycbIxtHDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhppujoJuVfHdzdGZpWmFubVpcWFJETEZCR0VMREZTQDU0MzM1PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1drY2c/L0s3NzsjBtcO+sa+2bF56faGRipKWhnqAhYV/dnh1cnBfW1tdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lrcG9zj8e9ysXLwMbCsLa6srKzsrHCvLy8urjBwcHEvr25vb+5xMrFxsK9xsC4u8TJv8HJu7e7usbDv7zBzsPGvr61wb3Du73Hu8O6tL3GxMLCt7+2tr6/u8zDvba6yLu/vsvDwcbCxcnHycbQxsLMyLLHycPOzMDFw7+9srewsqeoqLmwpa2wqq2slHp2d2pkZ2Bob2RWXllKRkpGSEtBRkJGSkA5OjY1ODg1NDs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysnGzc3O0cjQxdXU1dfNys7FycXHwbnFvauupmBkdYOTi4iLhHh/hoZ/foR7dHRjXFxdXmBgYmNiYmRlYl1cW1xeXF5dWltcXmhzcW1nZ25vcnmdvczAw7rAuK2wsaeqraynuLS2tLOztLu2vbG3sLWvsrvCvMHEvL+7tbK6vsC4yLm0u7fBwr24vcfBxLy1r7K2u7+0xbe7tau5vb7AvbG6trC3urPGvLevu7+1t7XFvL7DxcDExcbHy8XAxsa7x8vAz8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjJyMrIysTQzdLPzcXHwcbAv7q3ybaqsJlbZ3CKj4WIiXp4foaGdneBfHNoXV1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaWZqbW5yfKTHwLi4tbCrrKeeoqmnnqqss62qrKq0rbaxs6mup6yzu7q2w7m6urGrtbm7tMK6sMCxvry7trzIucO2raqosLLAtri9sLGnsbO1u7yrrrWmrrauu7Kxqrmwrruuu7i7wMC+usO/xsPFwLzGwcfLuMXHxb/Hw8O6xMbCu8bJzMuzucK9u7OJc3Z2a2lgYmxpWVhXW0FMS01KRUFDP0ZBOjk6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcTQx83Bw8a/xMTDw8rCycq/wLzCurO1tcOuqrCSW2p/koeOj3t4fYmFenuEgXduXl1cXF1fYF9fZGNiY2RiYF9dWltaWl1aWllaXGVub2hmaGlrbnKBrbqwta6lpKenmqCkoJqcpauupKiiq6qsq7Ckpp+qrbS2sb25r7ewqK64tLO8uLS8r7i5tbK8wbLBrqWoo6uxsrOovaqrqKusrrWzpaiuoaSvqbKmqKiupqi3rLGyt7q6u7K8vr6+xL+1wsHHyLe+wMS3xMO/u7/Ewr7EyMzKv7/DwMCph3N0c2ppXGFvZFdXWFBIWVJTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz83Dx7m5y8HLvrvJtr3DvrrKt8HDwbS2vLaxr7W7rairkmRtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9eXVxaWFlbW1lYWlxfZmtmZGdlaGpvcoWqpaylnpyhpJSdpJqXkaGjqaOjn6Wmp6atoJ2cpKatsrC2t6exraiqtKu0urG2tq62ubKwurqxt6WgpJ+msaisqbqqpKenqKeyraCnpp+bpKasn5+npKChsa2trLK0s7Swtby2u8HAsru+w8GxubnCs8G+wLW4vL2+vMLHxcPEv8DEoIR4cWxiZmBrb2BVWV9ITmdPVEhGS0Y8PUA9Ojs7ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLS2vbi6wLq9tqCelJ2hprq2q7Ozu7PEz8nLw8a4t8fAzL+4ybe7xbizxbizv8CstbyyrKWvs62ho5FpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGFeXFtcXFhZWFhYVlhbXl9kY2JlZ2dna21viJ2pn5aVmqGWm6KYlYyeoaKnnKCfpKWip56bo5ygq7CtsbWkqaqqrKyktLitt7Css7avs7WvsKqfnp+jorKlpqq5raKmpqCorauZoJ+emZ2fpZqao5ycnq+pq6iqrK2tsLK4r7i5urC2vLu6q7OyubO9tLaxsba1v7a9wL7Dwru6vZeEe3NrX2VeZGRYVFddSVdcS1BHSkpHQTw/P0A7PzwwNTUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uce4t763ssK0sbu7rLm6saKeqaunmJ6PbX6Fhn94cm1vbWtiXmFmZl1dXl1dXVxdX2FhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3KNp5yTlJSal5qhlpaQm6KhqJ6cnaWnoqWcoKGbma+urq+yoaWjrqunorWwsrKsqa+zp7qzpraho5+bo6Gto6Kqtqujo6aepaajlpmdl5mbnaCal56dnZytoauoo6Smrauys6q1sLKrsrm0r6qvsrKzt7Ouqa2usrixura6vcC4s7GUhnp1Zl9mXltZVlNaVUtbUUxKRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+znaWjmKWxwrW2va20uMHMyMa/xbbBwMfOt8DEvbO5ubK/trG5u62ytK+fmqSqoJSaj3h/g4R/eG9xdHFoZWNoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqCbk5OPk5aWnpaYk5egnaGclqGhqaSfn6mdnJurp6+wq5yjpLiqoaCuqLaqp6itsaS4sKS3oKOcmZmqp6Gbrbmwo6GknKKgoJOUoZSWlpuYmJaXnJWfqZ6ppKKdo6qqsa2otKyqp62zsKWrrrOxsLCvr6eoqLKusrWwvLS6uK6jlYJ6d2VfYVZZWFNSU0tNXkxQTEdITEtFPUA+PUI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvre9rp2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGuvLu1u7y1ubmwr7CqnJmhqZSRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmJjZmmBlZKUi5GTk5qYnJWWnJ+cn5agoKempKeooJ2gpqCqr6afoqO3qKGhoqizoqWopbCmsa2stZ6hnZaVqaKilK2ysZ+jo56emJuTi6GUkZOYmJOXmJiXnqebp6KimqSlpaukpbCnpaOrrK2mqK6vr6uoqqqzpqarr7Sxr7y2sa+voJJ7eHNlYVxbXVhOTFFIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepaast7u8wcW6sbm1xMnJwMPGxce2xcSzwb/Fq7e3vba9uru1squtqJmYn6OLiXSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpaW1lZWltXVVhXVFRWVVJUUlVgYF9gYV9hYWNkaYCSkoiPjZORkpyUlZakmaCXnKCloq2mpaWkpKOdqqulmp+lsaqgoZ6lq56oop+uramprq2ioqKVmKKbnJCrqbGcoKKfn5eYk4qekY2Sk5aQmJiUnKGjnaShopWgoqWmm6OrpaKkqqOrrqWusqmmpaamtKaqqK2ztbS5urCqrJ6Mc3FvYFtXVlVSRlBOSFpcT1JKVEtTTEVHSkQ4Ozs9PDk2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6PDw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm8sb3Dya2xuMG1vMC8tLWqrKaWmpyciYFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSUk5RWV1cXV1eX19fYmRtjI2CkIWOkI2YkpSSnJqinJuhqamrqaynqaakmaWvpZWZpa+poJyZm6Ger5qcq7Sgpqafo6ShlJOblpaSqaqtmp2goaGblJCMmY6MkYySjZaVkJ6ioKOdnKOVm6CjoZeiqKOjqKugq6+krremo6SjrK2qqKuvs7eyvbWzq6+YhXRzaFtYWVNVUkVYTFFbWE1VT1BMUVJJTkpDPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1NzY1NzAxNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7evqKivrpupqKy3tqu8yru2v6zLxsW4wc7PyLPEure7wsixrbi/t7y9u7O1pqmglpiZl4h6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXV1cXl9gZX2KgIl9io+IkIyWkZeZoqCboKuqpq+sqLGlqZqgraGVlqWop52YkI+anq6XmairmaCdlKWhn5KRkpGTlairpZqZmZ6elo6Mi5OGiY2Dj4uSlZGgnqGkmZaflZqhop6Um6WmqKiooLGwprG9qKCjrLSrrqewtbC5tcCxrrGrkX5yc2JWVFZOUkpHVlBSUkxMWE5KTE9SR01LQUNGREQ+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7SsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqxtre8vcHDsbCxt620tLuztKKjnZ2Yl5WEgHZrZ2xucW5ya3BrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqfnh+dIeMhY6Il4mUk5ibmJ6pm6Crpqasnqiaoaack4+fo5qXl4WEkpukkJWjnZaWloiim5uUjI6KkJqlp5yVlZebkZKHlI6LgYyNgJCLkpKSoJqgopaUmJmVoqaZjZmkpqmmoaC0sqizuKGco7esqq6ksrKmtby1q6yxo4l5c25dTlFRTE9ETk5OUEtGTk5KSk5OUUlNSkFITEhIQz44NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSopLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS3saWnpKqloKmmpLOqorLDtbWys8bGtrrDyszGs6y5vbS4wK+tqbCepq66r62fmZqdlZWIfINuX19mcnB2cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFtdYW5wdW+Dh4GHf5CDjoqTkZOdoY+anKOipJmll6KclY2ImZqMc42Dfo6XloaRmpCUjo57mY+djIKJf4qYoKOekJOYloWOg5R+fnSKjnqQh5OQkJ2bmpqSlpCdjqOjjomaoKGkpJuitK+ssK2fmaa4pqaxobCunLC8qqmvqpmDeHRkV01ST1BNQ1NOTFBNQlBRSElOU01ISkpES01GS0s9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKmmpaijpqWmpqazp6W0wbiwtLDJxLe5wc7GvbOsusGsrcOtqKKmkp2mtq2joI+VlpKQfnh+ZldWX2dmaWdobmNpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpITlNTU1RVVVZZW11qanBrfoR7c05Yco+Cl4aNnJeLlJGgmZ2VlJaVj5aKgJSJXztWb3yMlIqBjJKMkIaGc4uFl4F5gXuGk52Ug5WOkZCDhn2TeHFwho19ioGRjY+XmpmTi5CKnYifmIeIlp6aoaCXp66praionpeus6Kmrpmsq5iotKOpraOTf3RvYFxPU1JXTERUSlBNTEZOT0lFTFFNS09KSU1QRklJPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego66hpqaqoKapp6Opr6intMK5sLWwx8K3s73Pv7mvrrXCp6rFqqOdmIOUnLGimpiGlI+Lh35zdV1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNT1JUVlhaYGxuZ3qBc1BCP3+VkpF9iJWMhIqNm46WlYqSiIaVh3mJf2BKUW54i5KEfoSNi4V/f21/f5R3dXZ4hI2acFGNiIqGfH54lHZod4aIfoqJlouOkZOXjISKiJWEm42ChJKalp6dlKSjqKmlpJ6csaqhpKSRpqmWoqqcoqaoiXZuZ19dSFFRU01JVU1TSUxLT0lIRkpOTE1US1FQT0ZJQz03Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2nKOnnZ+hr6GnqKWnqK+sqrW8tri2s8G7tqi5yLi2qKi1tqqyvKeelo1/ipSolpWKfo6Dgn14cW9YTUtNTU5MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3J1fWloXFSQiZSIdH6GgXyFjJOCkpqLj3uGj4B2gHhzb3ZxdI6OgXp+iquFeXtodnuOcHJteIGLjZJ4e4B7gHZzcpJ4Z3WFhISFfJWKiIqNi4B/hIuNgJSEfICPmJWclpGfnamen6CdoKmlnp2YjaekkqCglp6fpIFzaGJdXUpXUFJHS1hST0pMTVJKSkpMUEhMUUxSVE1FSEE9Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6qlrauwsaq9tLK8uLa6tLGft7qyqp2drKmosq+impGNlIGOnI6RfnaGeHx2b29pWEtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnSCe3hmdoyWmI2OfGd5gXZ4gImQfYSYkoFxh498d3tva36tfXSQi397hpKBfH91ZnZ8hmxvZ3N8iYyHgG15cX1xbXaPcWhxgX6OcESLhYKDhX93eHqMhn2Me3V9jpKPmIuSmpujlpmcmp2eoZyWjYulmo6dl46WmJB4b21nY1tYWFVRSlNVVE9QTlFWS05LT09KUk9JTlBMRkQ8PDc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoaawrK6rqKmxr7GrvLisu764s6ynm7CnrJuPlp2lqaShmJmPhZJ5iY6LinVxe211cGptalhLRkdFQUBDREhMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFhdZXBybIinqsB+dHlie3hvfHmJkHp9i4ZvbYySeXR5amqAgnGWkYuBfpaASZKYbmh4foJtaWRseYWQkoZscmx8bnJ8hmlucH9zjYmFhnt+f3t3cHR0hoJ5gXlwfI6MipSDlpeYmpCSlpeZl52WjIOJnpKLko2GkJaAb2pvb29ZVlhUUlFZT1JUVFJYVU1OSE1KTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrLCjraqota+urLS/q7zDv6WimpWkmJ6NhIuUoaGYmZGTi3OOeoCGjIZ0b3RrcGxkbGpZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXF+nh2GaaXN5ZX5vbX96i4l2goiGdGyaknR0fGpqnY9NeYWTiYSOZzF2hnNsfn2DdGZldX+EhIWAZ2lsdWtxgHxocXF8bpONj3x0fn1xcW52bYJ/d3l1anmJgoiJg5aSkpCLjZGUlI6XjYB5iJeIhoqGgJCId2trcGhmWFJaV1lZW01QVVZZWE5JSEVKSkhHQ0BHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVukoiakZmWo6itnrGep7qvq7KwwrG7w8ealo+UmYuOhXqEkJiUjZCMj4Zxh4J0h4yGeXBycG9vZHBmX1RGSUM/PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+yoHF7eGx9bHGCgoWBeoSGhnlyoZV0eIFzdZSHNXGdqJ2OoaGEooV2cId8h3x0jK6NiYFoZ2JqbnJtcIJ1aW9YdXCOm5J3bX97fW1ybnCAe3N2bmJ2g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2Oe3NxcW1gXF1eW1lYYF9STltaWFdMSEpGSkc/Q0FCSD9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp5+vlaW0qa6xrsGyu8HFlpCMlI+AiHxugZCSiYOKh4+GdYKEbJWIiHt0eHhsd253Y2leSlBHPj82NDQ5Ozs7PT5AQkVITExMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx2iIh8foWDf4x+daKaen6GgYSZhJucYYaqn52Lg5CNeneIfomJjnOLl4+Ee11lcXR6fHeKbWhqYnlvhZCCem+BeHWFenB0eXhrbmlddoZ8h3yHh45/ipKXg42FjIZ9cYR/hH11d3t8iXdwc3RmZ2BbW15TW2deV1BUWFtVR0pKREtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIyRnJ2fppGgqqCxqK/AsrvFupaOkZSHe4Z2a3+MkYJ9ioSPjHiDgHOghIp8fIF/cIB+emd2a1JXTEBFMjExMzY2Njg4Ojw+QUVHRkdKS01PUVFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmiEiHuJeXxxfI+Men2Jh36Xh3ahmoiHj5KUpY2tqkiGrq+vi4GAk4uCi4KEkqmHgJiYipx0bXyBhod9jmhnaHl/boWHgoVxhIZHbIB3cnl2aG1rX3Z9goh/h4SLeZSdnImLiJF/enWLdnx4bXB3foB0dHJsW15eXGNjWGdlXFRPUFZZUERMS0ZOSUNGQ0NAQENBPTo4ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5GOlpeSl6CeraGmuK+zvbOXjZKLmIt9dHB+iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyNDY2ODo9Pj9CRUdISk1OUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWHBZXF5pjZOHlYCEgoWRk36FiJGBmpWCoaGYlZubpq2Tmruxp7vHw6iLjKGlj5SKgZF8cYOen5Gcf3aGhYuQh5BpaHCEgXSNh4SKcYWCd4d/e3aFfW52dWZ/lI6GiYiHiIegq6KWiY6Xf3qCiHp5b2dreH97f3RsZV5bW15qXmJnYFpPS05XUlFJUEpETkdDSkRDQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZneDe4CMf4GQjoqam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH6ShZKVf4qAkpuOg4CBjIqCiY2Df4qAbXBqXUJANC0tLy8uLjAyMjM0Nzc4Oz0/QkRISU5RUlNSU1NUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WX2N/Z2dtdZ2bj5qSk4uNjpqIk4+di6CgkqOqpaOsk6m2oqjBwq7Hr3i6lJp8jaGemYSThYKOop+TmJKEioWPmZGWbHB1ioyCloyNjnePhHFthYGKlpGDhYhxiKCVhpKJjo+WpLWpm42UooOHk4N9f2tqa32BgoN1Y15kYFtnbF1sbF5XS0dOUlFNTExGSVBDRE1GQkNFRkI9OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnF2koZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXl/koiRkn2KhJiSkIKAgIuMiYaQh4WJhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOUFJUUFBRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZunpaKZoZeilJyeqJ6oq5+orKmqtperv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGam5mnkZGIlaKbm3h6fpSYkqGTl5eBlJ57d5WSq7KJjZeffJSem42SlZijoqa2r52RmaiHlo+NgYhsc3N9gX1zaWBeYmBiaGRgZ2ZcUkVKS1BPSUlMRkZNQ0hMRkdEQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbX1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJi4qEkoWDhomBgIZ2XmJQNDYwLTEvLC4wMC8vLi4wMDE1PkFCTVFSU1FSU1RSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpOT1FZbYWQd5WKo6eqtL24pK2srKeotKuwtrKyrbuxs72cs8OrusnLt8O/uKWisLOsraqji5aYhaamoKOXgaaZjaKrqKWIhZSkoaCroaSpj5uwi5Wjpre7m6GjsJKinaGdkKOhq6+ssrWilKSqiJmJkomVenp+hoBpYmldZmNeZGReZ2dfW09DSUhTTkZITEZKR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhjV2lvWHqFdoGThYeCm4OSkIyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5COg4WBjIWGiJKGgoSJhoiHh3BuYUBFNjQ8Mi8xMTAtLCstMS4tND9DQU1VUVJTVVVWVU5bUEdIRTw+PkZIQ0VBNzs8NUM7PUZLSUdIUk9QV4GSoISuo7OqssDHw6qzxbass7+zuL62v7TBtru6o7jFqLbJx7W+ubWoo7StsLGbmZKan4inr6ullHafpJehrLK0mZaqrqiutruyuqyvtaKxq7G1u7e1rrSgp6eip5qpr62yube4p5u2qIykjpGTn4Z4goR3WmNlV2diYmRgYWZgW1VKRERMVVFISUpESUdFQUBAS0RCTUc8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWlFiY1d5dXGBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiHmGgIySjIeFgY5/gYmPh4CGiIWJh5F6eG5dVkBFTTw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFZPXlVJS0tBQD9HS0ZGRDs+QDdENz9CSkpFRldUUF6PpK2jsbTDtrjBzMm2u8S9s7PAtrjBtb6vt3Sxs6W6xKSwxrmxs7G0qKS1tqqxoKKWm6KSpbCupq2sp6SYoKy0u6Kosrq1vL/Mv8XFvb2zwre5uL+3ure5rKywpbCqrb2wvLrCwqyZuqiTrY+Xl6qJfYN+bFhkYllrZmpmV1xjWVZTSUdGTFFHQ0hJQUhEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldTWVVadmpwfo6EgI2EbnpzeIdiuaGZo4mUlJaSlJONkJaSh4Z7hoGNlYqAhIGKenyLh4Z9ioKBioOWfXd6dWVQXGRHRUw7UWNhW15TRj87SFBFWmNRUllYWmdZVGBgTFNQRUE/SUpIRUVBQEM8RTZCPkhHSkxTWlRdk664tbq4yL+6vcnMu7zAu7e1u7q2vbS6scZgdbKksZqeq72qpairq6SisrWgq6eflZafmJ+upaempZ+jlKOnsbSnsrO9tsG+08nJ08fCxczCysPAvr2/u7y3tK+4t7bDucW9wsevnrmqoauOpKe2iIGBc2BjY19YYmBpZ1JYYFZRVUlFRU5LQD5HRD1LQT1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWPc2xyc3OH1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaLfoN/g3h7i4OHfIt5gYqCl350fXprZnB1WV1cUGVkYmBlZF1bWFdcTWRtVVJtbV9uX1hnZFVZVUpEQktLSEZISEhHQUk5RD9IS1RUVlxaW5O5wLi9t8bAu7nKyrq2ubW4ubK3tbSutraZZHWonK1wXqKsnJigopuknqullJ+fkJSOlpiXp5+ln56amYOknaylqrCtuLC9udTRztbQyczSzM/Oysa/v8LKvcG8wcDExMXKvsjOs6S7sLSvmqu4u5mAe21eYV1aX2FaY2NQW2BTUEtDQUVGRTxART5BSEFARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVxZaF9vlpKQlG5sb3V1h7OsoaCfi5mcmYyNlZGbkoWKin6Ih4uQjIl8gYRze4qDhXuJdIGKh5V/c3t5bG11e2hyZWlsaWZqaWhgZmlpbFptc5atpLyIh2dbb2hdWlpUSEtOT0pLUEtTUUhMQUpHSk9fXmJmaWGXt8ewuLK7vbWxxMa1sLiwr7ursrGnq7erjbWnnZqnmk6anYyOn5aRppillYqTk4mQiZCRkZ2boZealZaHnpqnm6yvqLCntLTU1NTW0svP1NXN08/NxcLJ0L/KycrJ0cfMzcLQ0bevw7zEuaW2usOig3BlXl5eWWFYWmZaUV1XT1BCQkhFQkg7QUM+QUc/P0E4O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VWc5CQmIJocW95eYOgqp6lloyam5eLjZWRmo59iYuFjYqKi5CHfISCcH+IgYZ7h3KDkouPfXF4dWxxeH5xe254c2xogXBtY2ptcHhpd3x+y7/B36duY3huY1thYEpQUlVOWV5QXVxOUE5UUVVUXG5tdoJxlq24rLSmr7aqrLzAsKu0pqS4pquuoKu0o46xrZqXmIyRk5GEjpuBjaaRnImDi4SKiYSLg5SVl5eTnJGcmJmZn56rrKSnoqytz9LV0c3L0tPU0NTRzsjD1NHHzdLT09fM0dHF0tbFwM7Hx8KovrfPnnpwZl9kXlhhU11aUFFUUE9IPkBGQUJFPEBCPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1OWnWGhYp3bHdwfX5/oZ6eoYuMmJOTjIuTj5aEeYWQkI2LioeRh3+Ce3J+gIGHeoR1hZORiH9vdnJrc317dntzgXdxaoBzcmlwcXp5cnq+y5p+jLKEdnKEdmhha11DWlpbVmVjWGRqU1hdXWBkXmN4en6LgZipo6Shn6CopaqwuKqls6OhraGjraGnsZ+JppqTkpGJkY+IgZSJapSijJmEgIV+kYODk5ati5WNlZqOhpKRnpensKGgoaWkqMjOz8jCy9HU0dTTztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMPDzIx0cGRhYFlVWlRcUEtHSkpKQDs6O0RBRDxCQz5HQj5CQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJ2VnZSFi5WJj4qIjoePf3iDlJiKjYiIi4l+gnhze32Dh3d/eoeRloCDbndwbXV/dXh9dIV8eWyHdnRufXaEdXh8nbWMO0GLxaV+jHxpZVdJQ2ZjZWNnamRueFteZmhrbmlugIOIkYucnaCdkJeYnqOjprGjo7OfoaWdoKmgo7Gchp6SkpKQio6LhoOPhH6cm4yNgoSFepR+gqmVo4yRipeSi32XipqSq7OYmpyonKe9w8a5tsbN0tDS0MzSy8nUztDV2tfX2NTZ2M3Y287J2drR1r7LzLR5d3BmXltTV1JbVkZHSklFRT06NzpAQEI6R0Q/RENBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc1NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjX2XkZ2LfoeSg4mGhYmBh3x4hZaWiI6Dh4WGeoR5cXp7hIZ1eoWOjZ15i3B8b296f3F7gXGDh4Bujnp1d318gnV+e4aHr3NYqcK2jZGCcG5iPV5ocnBxcG54doFlaG9ydXhxeoyHjpORm5WflYeMk5ugm56qn6CsnKGamJ+lnp+rmYuajJCRjYR9iIeDhYuOoJmTiISHfm2ZeYSYhoiTjI2UjIZ8nImUj66qlJWYn5mmr7W9qa2+x8vJyczL0MnD0srU19jX2NfV29fT2dvV0Nra0dbI1MuVe31qaVxbUVRUX0hDRklIPkE+PTc6PT87PUc9P0FBQURBPj86ODZEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDY1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OjpEP0NHUmpebWRiZmt2gIhykY+agHqAjX6CgoGDfoN8fISYjoeLfoaGgHeCeW57e4eCdHqSno2gdo51gnR1gX10gIRvgY+Bb5KFdHyAhHp2hnuIt8Wkwcm4gpabj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWlJWPl5GEiY+WmZeWpZyXn5aek5KXo52Zq5WQkImMkYKMhYiIgYaQkZ6bmYmFjIGGl3qIiJ+Xj4iNiouCfaGKkYy8oZiTl5mdqaamrp+otr/AwLnHyc3Oxc3J0dbV1dnV19vU19na29fb2trYztzGh317aWtnYVVYVlZOTERNQjs9PTw4Ojw+OT1ANj0/QD0/Pjw5ODY3REE2NDU1PTgwNjY1NTQ3NzQ1NjEzODU1NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImMknd2eop8foB+f3yEe36CkYmEhXqEh3p1fXVtfH2GfnN+kp2RnoORfIZ+eI59eIqKboKagHSZhn2BiIR7fZB6j6iOj8OhvYyco519iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CShYmLkJKVj52ak5SQlo2MlZ+clKCUkY2Nj4p+kI6Oi4SJkpaanp+JjJSSnZGCi3+lmYiEjYKFhIGlh4uLuJidkZWWoqihnZ6do6+3urWswMXK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbuHp7em1rZ1hiXFRQT0lDTEE8PD45OTo6OTk7PTY/Pj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYX1ZYZm1tbWmBjopxc3mKe3p/fH97h3t8e4uHgX51g4V5cnpzbYB+hH53hZuhmp6UkoCMiH+Yh4Cbkm6HqIV6oIt8kY2CiISbfZqQioyjoqCQpK6gi5GLhYuBk4ZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlYyHiIySk4yUlJSPi4+Jh5abnY+VlpCKkpOFgIuIko2Kip2WmaKjh5OdlqCKiYiNnJCDiI5/g4eGpIaMkLOYnZKVl6Ghn5mSnJ2osrmspr3Cx83Ixs/M0MzO19DR1K7W1dja2Nra19bZ2Z9xf3ZpaF9eWVRYWUNBSEM/Pj46NDk6Ozc6OzszOzs/PT43Ozk6MTpIPjozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieW1ifpGDb214i3h6f3qBfIZ8e3eGhH9zcIWCenV2dnSEg4V9fpKmo5+lopaKnZCUl4uKqJdyirGNhKeShJmThJmMopWfmJOJmp6jkqmvn5CVkI2OiJaMbo23hZrEyLKboaWbnJiWkLKRZKTNyJaPhoeJkJKNjZOUiYWKiYWWmZuPkJSThpSXhH+Pi5mIjZCql5ejo4iZn5aaiI6Hl5eKhI6NgX+Ij6WJjZOpmpeTl5mhmZ+Zk52bo7O0pqO8wb7IxcXJyMnCytPNzdSp0tHW1tbY2tTT2s6Dc4FpZWBfX1BLVlxCQkZDO0E9ODM3Ozw6OD02NDk6PDo4Mj85OjI6STo9NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdYKOfXxtfoh4en56gYGCfnZ2gIJ7bG6Lf3l8eHh8hIeLfoujs6ijq7KhlqegpaSWla6ig5C3lZKzmY2hoIukm6+ipJ2YkKeWqZmtr6SXlZWUkIuYmpagwI6jybirmqKlrZmRm5yynYaFqKKdmIWIiY6VjYuTj4eBhoeIk5iUjIuTk4aUmIaDkZCcdJGZspaXpKGInJqTj4qQi5eaiYqWjoZ9jJmfipCQnJqZk5mYn5SgnZWfm6GyrqOlt760xcfEvcPDv8bOysnSp87N09LQ1tjSz9i7c3t3XmJXYlhRSUpPRUJDRDU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTw1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdOW1xZSmdhO0iEinp7bYWGeXyEeICFgX1weH19fG9zjXp9gXt4houJhYSSqLutqLK9r6Wus7Ooo6KwrIqatZ6iuKWVrKSXqa23pqSjn5mpmKqkr7CpmpmclJWRmKCXmbu7rcmgaba4q7CVmJ+iq5KXvaNeqbKCiYqNlYeRfI+OfYOGjY+UlIiHkpaLj5WNi42XmZKdmrOWlauei5yUko2QkoyYm4qSno+LiZWfoo6VjpianZOcmJ6VoqCUnJylr6iipbO4q8LIxLW7vbvFyMjC0aHGyc3NxNbW0MvTonF8al5cVWBSUUdEPj1DQUI4Pzg3ND5GPDw2PDM1MzU1NDU0QjM6OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj49NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGVIYmBjcEpAi4p+gHKGh3yBiXWCioJ+bX19fH9wd4d3jYGHe42PjIaMmqvCwLC+xruztMG8tK2rs7aMqLKurr2qm7ukqK25t6umpqKho6Oqr7Kxqp2cpJibmJeeoqWlkqO5rqjAu6ytsrmlpKd9iIacrb2wg4uMi5CDj4ORj3qBh5CNjpyIiI+XjYuVl5SQmpacp5qxmpGrnY6Zj5KOlZCQlpePkaCRiJWbpKyVlo+UnJ6UoZ6bmaChlJqeqKekoaSws6bBxsOwsLu2xcTDvs2nx8PHw7zV0M3Eyol2dWReXGFcT0tDTEBFRj5BP0I7OjQ+QT09NTw2PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxnR2BpZ1pdW5OMjIh7h4uGg4x1hpCKgW5+fIJ/cX6BepV6kpSUmJGTlae0xsnAwszBw7rHu7qvq7m7l7K2urPArqXApKqwu7uqrquiop6nrK+1sKqboKqcopyWn7C0p4ujurq1wburqJyypKSolISOqcPEpIKLjoeIhIaVlI16g4yRj5GhjIyUkY+JmKCXk5mUl6agrp2MqpyOlY+SkZWVjpCVkY+hlIaXn6Czn5SblKChmaSfmqCcoJSYnqakpqekr62lv8TCrqm3tcnDvrbOssW+w7yz0crIwbV2e25eWl1sVE5JQ0xLSklAQT1DRDw1QUQ7OjM9OEIzMzIyNjJBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJnXE1lXGZUY2qZjZaJi4iSj4aJeYaTkIFygHyNfneHgYKQeo2hlqiampi6vsjJysLSycrCzbzBs627vqe6v768w7eswamss7u9qrCppKWjrK60rba2oKCvn6WimKO0vambqLzBo7a2r6uSr6yqq5aGmqmmpZGCjJOllYmAdYqSeYWNkZCeoJKOlIuPjZSjmZeblJSjnqmfkaWajI+Pj5WWiH2PlZKSo5qVoKKctaaQn5elpKOln56mmJ6Vl5ulo6moorKtqLvAxK+ls7fMwLmuw7O7vsG4rcLCwcCZcHtjWlhdXE1MTUlHRENIQkJBQ0s6NERIOjs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+a0lfWGFaZGVWno+djpeOnpKJin+Jn5KEeIV/lX5/kIiKkICVoJmup6OYwr3JxMjG083Ozcu8wrewury0vMq8w8G2truts7+5vK2vqKCpp7atrqmyt5qeraKnoZ2rt7ippa++xLG9ubOnqbOzra6WlaWsp6CRjpKxxaeVjXyRlX2HkZmPqpmYk5OPk5WTpZ6TnZmToaOinJifmYuMj4+eiFqQl5eSlqWaZpmjn7OllqOWrK2rp5yfp5iZlpmVoaSopp62rKm6vMO1prS2y8G4qrass7q4rqi4ur24g25wXFpWV09HS1NNSz9BSEVER0ZHODVGTTs+Nz5BSi4zMjAyNUI1NVBXTjtMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVzs9QEJGQnJGaUlSZWJMRqaUnJahl6iWjJCDh6WSiIGHgpyEg5WQkZSOmqKfr76uoce9xsXIx87OztLKvru2sbq7vL7OtsS9t7i3srK1s7iyq6acq6u4q6mosLCXo66kp6SltMCwqqyzvsK6wLmzp7izt7OulaWtrq6ki5OVoY1zwZl9lpmEjpaai7GVmpqVkpOZmqajlaCblpqonJuhoJmLjI+WnWBKlpyalJqll1SWsJ+vnJ+llK+vraaboaaUk5mZjp2gp6KZtKmqs728u6uwssfAuKarq62xsaOhsrK0pHJwZ15cUFJNRVBQUFE7SEtJRkhBQz45S1Q/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVg7OkJDQD1SRVdSc2JXRkirl5mfoaiumJCXh4unlo6IkoWfiIScl4+eoJujpbXJtKnGu8PEyMrJyMzOx766s6+5uMDBzbXIusC5tbqxr6+ytKajm6q0tKuppq6smaSupaWorLq/qKu2tr/BwL64s7LCr7e9q6OutKy4pYibl6abdr6ghJicjpOZmouulqGcm5eVm6ChqZ6ooJqaqpmhp56XkI2RnYNudpOimpWdop+QrrKjq5Wpqpirr6WloKWqk5KZm4iUnKKelrGnqqu6t72zsq6+ubafo6eopaecnKypqY1laGJgU0xNR0hOSlZMPU1ETUlKQUNEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5TYU1WSH9lXkhGrJScoZ+7rpiUnouTqpuRkpOJq42Hop6MpKyUo6O2x720wbrDw8jJxcLOyMK9ubKvubTAwsq2xrHBvLW6q6itrK+jopmqtLqmqaasqp2or6ekq6q+vKisvLO3vca8trW4wLC9v7OptLarvqSPopeRop+8n4maoJmXnp2Ot5+pnKWjm5yhmqels6KbnaWcqKqemZWPlJqLl4mNpKKUnKKfoLWvpaaTsauaq62fnqWkqpGVlaCDkJ6fnJWppaKhtLW6ta2otbKznpyippqXlZmqoZ54Yl9hX0xJR0hNUUlNRUZGQlJKSEFER0FWU0RIPEFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRaiXpJ6ewqybl6WXmamclpqaj6qWlaimla2smaGqtsTBvL+4wcPByMS/zca7vrmysLizv8PItb+wvLe5t6ekq6usoaGbq6vEoqWorKaerK+soqqov7imrL2wt7bHtrS5uL6wvsG2tLK0r76jlqOWk5uUrZ+QoaKlo6OfkL6lqZ2orJ2doZumn72imKSeoqmroZ2WjZWek5+Hj4WNk56koJ21rKaclrKnmbCooJurn6GNmZWfhY6hmpuSpaSamKyxtrGqpamtrJyYoKGSjpCVqZ+UamVbYl5QSklLT01IRkNJQD1PSEA7R0lIW1JPSz1ITlU0QkY5PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGZjWE2imqObncSroZ+snZ2tn5KinpakoKeqrJe2sKOqs7bFwr3AtsDCvMnCv8rItri1tbG0tLfBxre+sbi1uragp62qrJ2en6WkwaWgqq6gpKmtr6Kmp722pbG7t7a1w7Kzt7q+scPAuLits7S1opyklZGToK2gmaGdqairoprDramerK6bm56YpqC9oZ2kmKurq6ahmY2an5KeiY5Yf5aepqGguKqnk5i3o5+zoqGcr5igj5mUnYKPoJeWjaKklZCmrrOrqaKipaWVlZ2Zi4+Rk6SfiWNmXGVhTUpLS09GRUFGSz49SkE5OUpKTl1RUUo9TFdcOUZJPURNSThIY1xMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dzSEU2PXVlXExPnp+hmJ7Dp6Wis6GcsqeTqqSfo5+tqaydu7CorLWyyMPBw7PCxL7HxL3Fyr2wsbeusbWvv8W1urGwuratmqmxqaqbnqahqMKtm6yxnKqirrCppKe9t6a2uryvt8Sts7PCv7HGs7q3q7S2raqipZWVlKOroZ+fmqerr6+vu7KmoKmpmZmXkqKkuKGhpJKur6ykpp+SoZ6Vno+RjZWdmqOfp7Snp42YtJyjr5ufnK+RoJSXlJqAkqGWj46goZOLpqywpaeinKCekpKblIWLko2cnoBjZ1xoZktKTEtTQkNASUc7O0Y/OTlOTVVeUlNKPk9eXj1IUEJNTEk5TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVV5mckA4PEiWd2VBNJ+kn5ugwqijqrGho7SplrKrpqKksqyuqbuyrbC0tMa/xMS1wMW+ysW2wMnCtqu1qbG4rMDEtLeurba6pZmrsquqmKCnl627tZuosJutn660sqequrOnurO3srjAqreywry0xae+rq23tamnrKGXlpGlpKKil5ekr7itsrW2oJ+opJmUlZOjoLejpKWVrrKypamlop6ampqVmKifn5iinq6yoqaNl6+ZpayYm5+mkp2OlZmbhpeflIyQnJ6Ui6mpq6KnoZmeloyPmZCBhpaJlJ96ZWpdbGtPUU5OVD1CQU5DOzpJQDc3UU9dXlJWUUFXYFxCSlNIV0tIOlVkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM5MDZwW2JIMDVKcGlWQ1dGjHlmQzukpJyhpb+mqK+voam1qp25r6ukqrS3sbC5trC3uLjFvcPHvbzEwsfBucHHwbqqt6Wtu63Bw7e4qq2yvKOVrbCtspemqJGquaqgp7Cdqp+wtLOqqba2rLussrK5t6y5sMG5vb6mw6uwt66oqqumnZiYqqGioJGXoLCus6uwuZqbqZ+ZlpKXpqC3qaWioq+xs6uxp6ufm6Cgm56lnaGXnaOzsJufkJSmmqGpm5ajoJeZipaZlJeYnZOIkJuZlI6pqaegpJuYm5OHj5mLfoyWho6ba2puYm5uWFJRWlRBQ0VVQDs6SUE3OlhQZF5QV1dEWV5eTUxST19LSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNzQ3Z1lgRihAOGx9aFxWOol7Y0M9qJ+coam9oaqwqqOxuKmltbKroa21va+zuLy6vbe2wcO/ycS5xcPBwLnFvsG4r7aoq7eyvL+/taqusrifl6ytqK2XqKmPp7ufpa2znquisbCzrKq2s7W9ra+xtaywtbHAucS2q7yvsbisrKmisaWepKiepJeQmJ+yqrOqqrOZnaebmZSNoKaktK6noqysrrGnsqyyqaObn6iknpWgmZuotamXmZKSn5mfoZ+RrJ+ZmYaWmIyemp2Tio2Wl5qXp6ajoJ6WlZaUgZCVhXuPkoSMl2Ztc2hwc19HWWZWRENOWERaOUhCNj5dUmhcTlpdR1teXU9NUlhkSkpDXGNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfXmFWMTUxPWBWXjgpQzNZVVxnSzWMemZMQKSZoKSst6OsqaWurraqrrS5pqewuMW3sbe+wcK1tLvFvszFucPBur+6xLfBubO1rKq6t7u6vrWrrrG3mZioq6qrm62rj6u9nquusaOqn7Gts66utrK5t6qtrrGnta+0urzJsqq1tLG0r66mobOfmqisoKWVlZqZsaKtoKWvlqGkmZmSjaKlprKpoaaxq6q1pK6wta+jmZ2tp5uXnpmZrLiil5OQj5icoZmYlK2gnpWCk5mNnpyal5GLlJKemqWjoqGZlpOSlnuMkIV7jYuDi5RsbnlvdXxhRmBqWklIWls9e0pHRTZBYlRpWk1cYUpbXFpSUlNiYUxLRWBhYFBMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuKkEvSkdQW0czY1lUS0SZl5+vqLGprKWjrq61qba0t6OstLfJurS7ur++tbS3w8HNx7zEvbe+v8C3v72yva6nurq3t8K3rK6yuZWXp66rp6OzqpSvuqStsrGmp6Kys7GysbWxuLKprquyp7ivtbPExLaptLWrsK2pp6K2n56msaCklJuZlLGep5ufqY2pop2blZelpaS3p6Kws6unsaetsLWspJmhrKibnJ2blKq5nJWPjouZnaKYkZioo6CXhJKWkJ2cmJeWiJaPl5qonaShkpaSkJZ3hJCHfIaChI2NbnF4dnx/XUtlbFxKT2RcP2J7R0k4R2dXZVtNXmJNWFlXVVhUaV1QT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSWcyNydGYUxWJS1CLj1FTFE8M3JrS0RDkZikraStraumo7Cys6q2sLafq7W5ybmuwbvDt7OytcLDz8TAwr61vcC/ur+9s8SoqrmxtrfAvbCstLSdoaewraWmsaWesrWsq7KwrKmotLqstLO1rLSsqauorKm5rbGwx764pLmvqa2tpqitsKWjo66jqZydm5qvmaKjoqOQrJ+joJ+hqaWluKSrtLSkqquorK62rqKdo6iqnKCZmpKktJmPiY2HkaOglo6Vn6GWlIaOlJOdm5mWlYeYkpWZp52goI2TkY6ReH6OhX19fYeKinJ0c39+flxSZG5eTlpnXUZElltHOk5tWGJbTWFiTlZWVldUWWdeUVJMZFpbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0NlOzYqSGRISis6ST8zQ0lTLD6Paz5ISY+aqaqhqbCkqKOztLG0tbGxoaytvcu6rsG7xrG0rbTCw9HExr/Bs77Cwry/uLzFqK23rLO4vMGxrLKuoaSnramopLGjq7Gqr6uxrq6tq7O7p7exsqmyqaumpaOtuqyqsMK5tKy5qKioramnsaWppKKuqqiinpuirJWlnZeemKudoaeooaylo62st7GxoKmin6qtsKydnqanqZqjmJmPoKiYhoOOioufoJCMjZeekZCHiJGVoZ2WmJaGlpOTl6WdnZ2MkpCOioB/iIV9d4CHhYd1c3KJdmxfWWBuY1FzclxLPIR8Rj9XdVhgWU9jXE5VVlVXUFxhX1RPT2hYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkswLklnREY4PEIwNUVLWDFAlFxATUaVlqynoaqynKmpsLasuLSuqqSrq73Ju7G+t8OvsK2zxMTOzsO/v7TBw8S6wLTJxKyvt66yusC/tK6urKaoqrCppqiyprStqrCurbGvs6yzuqS4s6ysraeroKKesLerqq26tqS1taSpp6ysqqyhqKamsbKkpqWhoauWqqGTmqCmnqOiqqSsop6msbesrKKlopqpqq2pnKGlpKSZoJqVj5idk4GCkIiFnaCNi4+Nm5CSjISNmaWck5GbjJORkZSjm5uai46Li3yHgYKCe3WBhIJ+dXeLpId5a15gbmdXZodkTkBnkkxEYnpXYlhSZVVNVlVVVE9cXWFWS05pV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIZBSUhElpGvpKKqsJiqqK21q7awq6Srqqm8wcC4ubO8taayr8TJy9G/wbu5wMDCucG6wsSusbWytLvBvrOyr62srKi2qqWtsKu5rqiwsK6xq7WqtrWmtLarrKSpqpyjnbOzqKiks7Sgtq6hqairqKunoKqrqLm2qaqqqaGpn62bkaihnaCjoqaiqZ2cprSup6WpoqOXpaamqZyio6OfmZifkY6PmI1+h42HhZ6eiIWLi4+PkY2Ehpajmo6NmpGSkY6Tn5iZlo2LhH90h4GAf3h1hIB7eH6AiJ2PcHJnZ3F4XGF0iGlPXZhWSG15VWRWUmNPTFZUVVFPWFpiVkhQalRWU0dQWVVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyP2Y9Tlg/Qyw/TFRfL0lrN1JFO5WNr6ClqqyZq6StrrO0rqqlr6mpu767wbGvuK2ita/Jx8jRwL+9u7zDvbrDwcC/r7Gzsra9vMGysrOrtKmltamkrbOzuK+irbWxr7G5qriuqq62q6qeqqugo6G2raihnq+yobSqnqinqqOqoaGsrai9r6yurKGnp5+smY+vopiioKinnqebmKmwqKKfrKKhkqGioqaYmqilmJiYnY+Kh5WIfY2GhIWkloaDgoyHkI+RhYaVoZeJkp2Rk5CNkZ2Vl4+KhYZ4c4F/fXR4eoF7dHR7aoKIpHZpXmVsgXVniIt8UldwXkt4c1RkU1FfTU1SWmdOTFZZZVhHU2pSUT5CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWk6MzhfPWFkP0YxQ1BbWytITztYQjSPjrGgpKWqo6WjrKa0s7CppLCnqri+wbywqLmqp66wycfI0MK9wL65vr68ybzCubGwtbK6vLnAs7S7rbmso7Wnp6yytrmypqe6ta20vK+8pa2ttautnKmvpJ+lrKqnnJ2qsqSzqJqqp6qkqZ6iqaipvau0r62eqaOgrpyasqKWpJukpZ+kmpmnqqWemqmhm5GboKSdmJapqZGZmpOQioKPhX2PgoCIno+HgH6Mh5KPkIWBlJuUhpOijZSRi5Gbk5WHiX6Acnp5fnxod3x7dXFyfmmGeoSIZGBoY3KFe21oeV1eVkNYe21UYVBSWUtLTXB0XUhaW2dZRVZnT0M+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpOxmZ+fqaWjoaqktrKxpKmxp625wb21sKO5raiosMPJyczBt73Atbe/usi2w7W0s7Wyvbm6vbatuba/raKzp6qrr7W3tKqduruosb+yuaCvtLaprJ6tsaOcpaiqo52cpLCmr6Cfq6mnoamco6igrbunrrGuoaqio62enqyml5+boaKcn5qZoqqimpmjo5WWk56hlpuWpqyLnpGQkYyCi4B/j4F7mpSMiX1/jIeQkIyKhpKYkYeUpIqSkoeQmpCTgYh8eWx9dnl4Ynt6cnBxc3hqgnVqg2djaGFuc45tYmpwYG9CXXlrVl5OUVFLSUxTWVZNXF5tV0RYYU9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUV09I5KXrJmfl6ejoZ+no7evraKvr6mrucK6s62fua+rqLS6x8rHv7fCvq+0vrfEtsOysLqxssC2u764qbm4vaqktaeoqrCtubCpmbm8o62/tLShrre1pqansLOgn6WmqKGkmZ6sqKmeoKqup6Cml6Kon7C4n6SxrqCsoa2km6amqZqam5+jlZybmZ2pppaanqiRmJKYnZOZlqGqkJqJjZCHfYh/go58fKGMjIh5hI2Fio2NhYmTmo6JlZ+JkZWDjJeNkX2Ee3NwfHFzdGB5eGpvcXFwa39zZHpsaGZkYmaHgGBbcmpxTU6AaVhaTVFMS0hQUlFITVtfb1REWFpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MFxbNSiWm6WYnJWsoJ6hpKG3qrCjtLSpqbrFtrKuoLesra2wtsXHwLe/wrmwtby3v7u/r6y+sLO/sr3Duam7urinqLaop6uwrLOwppi8tqOqurWun7G4r6mlp6+ym6GkoKSjoZabr6ahn6Oor6GgopOjpKK2sKGmsaufrKOvl5uqpaifmJqdpJOam5mcpamZm5uklJSXlZyOk5eiqaGQiYqPhnqEfoSKeo+Xio2HeoKIhImNj4WOk5iMjpaZio+XfoaXjI96gHpwcXZub3RfeHdlbWxsa2qEb2ZyaWtmaV5kdIFgW2t2aVpKf15bWE9PS0hIUlVGMjldXm1QRFhWWWVNSElFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFVdaEQuPDJjViwylaKhl5Sbqp2koaKht6muoLq4pay9xbOwrqO1r62tr7TDw7yzv7q3sbO5uLq4uq+uwLO0ua+/wbisvbq1pqKzqqepsqutsaCawLWkprS1qJ6yvKmopamvrJmjp5ykpZSYobKlmZ+kqKmcoqCTpJ+juKikp66mnaWhqJKfqKKhoZmbnKCSmpuWn6Gqm5qYoJSQk5aZjZOTo6ikkImJj4Z5hHuEhn2djYmKh3qBhIeJiZKFlpOTjJCVlI2OlHuDl46Ld357bHRxbGxzYXd1aWlqZ2dvhmhoaWNmaWpga2NqaFxle2NgU3RUXFtTTEpHSU9TQCEqaF5qTENWVV5gS0lHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z08nMp6io5GOpKebnp6do7Wsp6q6t6esxMG2sKyjta6nrq+3wL+8ssG3sK6ytra4tratqr2zrrKxvb+4rry7saWftqulpbSpqq6encCrqKSvsqmstbueqKmrsaWYnqmdpqSRmaatopiepKmhm6Gclp+dp7alr6quoaGdnaGUoKafoaGam5mckZick6Wdq6GXlpyUkoyVl4uPmJqpoJGIiYuIeYV3goKCnYiLgol9gIWIh4aRhJeVkI6QkZGRjJJ7g5WOhnN9fWZ4b2tqa2d1c2tjZ2RkdoFjZWZmZmpqZGtyWl9ZXW1kYU5pWFtgVkpHSUtNUlg+OV9saUhCVFNcW0lIRkZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQmhIJTWao5+QjK2hmJiflqSzsaKxvbahsca8urGxpLesqq6puby7u67Bsq6urrausrizqKu5sa+us7a6trC4va2mnrWqoKCwpKqunKLAoLGkrrCut661nq2ura2imp2nqaWflZqnpZ+ZpaKonZqfm5ScnayvpbqorqKhmpqdmZ6kmqSel56Ym5SZoJKolamnmpOampGLlZmOlJSZqaeOjYqJj3yCc4GBipiFh3yJiYWFioyKkoSUnJOSj5CQlo6Qf4CMjYJwgH5meW1oa2lncXJrXGhjY3SBYmZoam5sZ2pqaG5dbGx0cGFVY2lkZVpJRkxNT1hRUVZhZYFVQFZTWVVGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyc0kaGajY6wnpqToZmosq+fuL+2oLTCu726saa2sKiupbe4t7etu6+sqqu2qrO4raWztbKuqbC3trGztbqnqZ+1qJ2eqKKprZqnvpito66vtbWtrJ+xra+popydo6uonJScpqSdmqqipJaan5yQm6Orqqm7n6ekoJiZmZ2hj2uilpmccIKVmqN/dZGpp56UlJ6QiJeZgJaKoZB4hpSMg25pfnaDcWyGi4Z9hIyHcF5jYWeEmIZsi4+UknR3i4R+g49/Z4aAZ3VoZVdcaHNuTlBqY2dzhWdfZGZubWpeX2GKj4OEZU5LRDlGVGdeSkdQUFRVS0hSYG90ZUZaUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzU2OCwjMScyMTQ6MTc1WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoujmYaVsJuck6Cbqq2qo73Fr6m4wri9va2nt7Clq6S3s7KzsbmtqaastKavtaKouLa2qKest7OutK2zoqmfs6qeoaScpqeYq7qVpqWvs7etrqSprquspaGfnKCnp5uXoKWlm5unp52Tn5+YkJ6nqqO1r6Ojo5yWl5eXo4igjpKah6GHk5ygf6R/paqekpGakYiEcniNjoWIoXaIjGmXiGZ9cnihb4iHhH6OfX+hoKCZgHyHnnSHjnabimyHgYNsaGVjemtxYVOFbWNsaZhxWWpwb4hYXmlba2tbiHFuenKFZ4aEWl5HTj9HX01GUlZWUVFSV1RnXk1XSVJTUEZHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3MCiLppaDnKucmZidn6qqp6m+w6+xur23wL+qpbewqa2ms7Sur7O3q6mlsa2ltLOcrbW2tKanqLOxrbKorp6roLKooKOimqGimq2zlKOlpbW8p6ynq6qsqKWhoJigpqOZmaWjpJicpKmWlKOclJOkpaaht6OjoKSYlJOXkpyIr5CYlImpi5ehm4WxgKOsnZOZnZR5gtSogIeVwZvHeXixpbeXZIDAnL95hIR5kIR8kJCRynGXvJzFenK1pruQe4BslrGrsHhoa1ixrm5labySvG5oem9ykNh+U2pitrJ/gXKVdJqhqpBXT1diUFZORlRbWFFQUoxcV1xQQFxEUU5FR0o8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjaaSgKeqn5ecnaWtsqewwr2ytcC1t77Cq6ezraypp66zqa+2tKenprSlp7iunLOytqqlpKeyrq6xpqqep6Sxo6Kfnpebn52uq5Sdop+zuqOqqaKtrqWhnZuaoaefl5unoJ+YnqenkZynmpOdoaaioLCin5+jlpWSmJKZha9raoqNqn5ng5WGrWRwnZ2UmaWUca6hpH54u31roY92sV9qtFulgGackWBmgnpmf2p4a6lkvnJnpox1sWp8sXh0kpNjbW2nbluEoEVoZoeWRXWcYH5ofKSngllfi6tpgJZ4eWqnN0qvXFhTbGRbS05XX1xXVjtOiU9YVy9JVFRKREZGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMwG5CilYKsp6Weo6Sqsrers72+sLbEsre6waepsKuuqKmwrqOwuq+kpK6yo6m4qJ6zsrCjpaCqra+sr6ann6OisJuim5eVl5ubrKWWm6Ges7Oiq5yira2gnZmXoKGonJido5+cmaGmpI+dopqXoJ+qnqamoJufoZWVkZaRmoW1m7V4hamZtZl2hrObt36TlpaolH5sgqZ7goaIkpSSd6tna7Fbq3uPh5R0iXGPhoB/iJCXeIKCi5iMg6CPhLB2d59xa2tsfItOpFhIY2OZfmNopmB5c3VTk4deUKltY3F+h4BinC5RoW9bU2toYExLW2RYXFpCPrF5WFhBI01oRkNFQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o4YVU1MBuVn5WHs6amoK6pp7Ksqbu2wrC7wq24tr+pq62trqatsamhr7yqoae0rKOrtaWms7Ono6Kdp6qyqLCopZ6fn6+Wn5iUlZWXnayhmZmkqLSuoamPqaipmp2VmKClp5ufnaKfm6CjpKOVm5+XmZ2iqZulmZycoqCXk5GTk52D1ZOZuXCwwn7FhnzWlJu7fJqVpI+NnI2ke46HpIKlgnqseY+dVq96iH6farlauXaHhH2mgpN8mHqqeY2dkHuxbo6EdJC8hW+UUK+nxYpRoHpjYKlic3OIbZeIYFO1tMiGgIl8Y6QzQp12XVBqaWRQQFhnWmRhSkhObU1bUk9ZZllDRD9FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFRNzElm6KTmLGoqKWzqqW0qaS8t8GwucCxtbO6srSmsbCjsLKmn662qJqnua2jr7Ggs7SwoKSen6epsKm0qaScnZ6rl5iXlZeVlaCpnJmWp62wqKOej62ippWel5yhpaGZoqGhoZqhoqabnqGelJmbpqCcp5Wbm5+hmY+RlJGdiLJuaLVxq4dujqZytHNytnual6SLj52No3+RoaV+sHaDkdLRdlyue4V/pG+bqqZrh4V9rX2XmY97sXOSnY95s2WWdISeb55mlFLIi1rCXJ95Yl+tYHZ0h2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPa2BsaFBVR0k4PVZRWldYSUM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTTYyMKGdkqWvraSqvK2mtaWntru8srq/t7WzubmypLS0obGxop+ssKSXprmtpLGwnLS4qqCmnaGppLKorKmkmpyaqJ6VlJeYkpKip5+WkqWqsKailpOtn6SRlKCbpKaflZumpqGaop+tmqCenZCVm6GenKaVnZaZop+VmJWRm4Wse3eodqOOiIapb62KgqeDmJihiZKaiqJ/k5mJroV/grNccrNSrn2DgqR/cdd9eIV+j52GmZp3r4aKkZyIeLNhmmWagYKUbJJasFhLmnWYeWZgrV52d4domIhrXa93lZ6PeGw1eciusl9CU29eZ2BFUG1fcG1WVU0uZWNoUlhRO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEk6OTmfnZWgubCXtMGtqLOoqbK6t7O4v7m3sbS7tKS3s5+0rJ+fqKyflKe1q6ixsauttKSbqaCgqKG2p6apopmdlaShk5KbmJGUoqWako+mra+moJWZqZ+hjZGimailoJSZpaidnKSerJ2hnaCNlJ6anaGYmZyWl6Ggk5iQpp6GqX19pXihj46CqnCti4GnhpafoYmXl4ijgpGIlKp8gIudeW+xWqiCgoigeXTYf3aIdKiBjpuNkqN8lpCfhHuyXpxkoH6DlWySXKtbWpN/kX9oZ6pkcnuBa5iHc12sWomgjmtvZU9KQ6FcW0x0XWJnTVthXnFzXkpWNkqbk1hIRT1HRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMj84oZ2amr+rl7TCrqytqaa0sLextb+5ubGwtbqpurSfsKSepaennpOqsKmvqbWsqq+hmKGgpqWkuqKjq6CXm5GioJSTnpmTl56fj42LqLCvpp2Wm6imnouSpJeoq6eUlqmnnp6go62koZ6hjZWhmJ+gkp2XnJWdoZWWj6ucj65tcrRyqYx2iqZztHhzs4CRpKOSnI2JpIeQd7hvjHuLomtrtlqghWWXl2mhoqdtk3K0dJOYf7JqhZKIrWt1s2GdZqJvh5Jql1ytX02hfIeRUnOjbHl/fm+Yh3Fcr1Y8nHdlVG9uLlynT2NSa2VibVpjXF9vemJUWlE+Pm1vM0NCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKWanJ67oZyywK6uq6unt6m4r7XAtbuvrri2qsG2qamgm6akop2RqqmntaOyp6+qoJecp6Ckq7ido62blpmPpaOVjJ2gmpicn5GTlKq2sKeZlJysqZWLk6WZpa2ikJaqsqOfnqarsJiho4+Zopafm5acl6GSnKmclJCrmYfUkpq7c7DDgMOGftWWm7h4iJCYjJiKjKeIeqO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2VgaypcXt/dbyIp6BpnWGmjq+hfox0h6p9vm5zvHSyg3V4gYtumohxbo2kdL1ed31bYXm8a1pWW2p6XmphZWdhbHduWVtZQ0FAckBDRys1RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnm56ivKGXscOwraqrrLGnuK+2xLG5sa26r67Asaukop6joZybkKmjqrKktaatpZ6WmaqZpqy5naOumJSgkKWfkoyco52XnZuRlZKuubKslZejp6eTkJaknKSsnpCgqKufm5+oo7Oeo6WOp6KUopqcmJWjmI+woJKUqZ6FkJm1gJCRjLeVeIKTmrV3bWtuc295j4SOiXSewbu9mnuBsqhwgHSRuYN8hoaMho17ioeNl3yku7m9nHV6tKN0dpd1dLB1mZ5mhmmNtXRycHe2jF6Aen2KaIN5bXlji6xwdYV/WlunakVkWVNmYGNeY1FnZnBsdUJNUExEOlpNP0ozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVzgqT15dPSs6VlYnPjs8p56gob+llrTCtKyrqKyrqbqusMWutLKut6e0uK2poqGlnqCdmZOrpK2qprWop5+blqCjnaykvqahqpeUnJChmpGPoaihk52Yk5eUsbW3rZidpKSiipKSppulqpuWqaWlnJqhqKamo6mhka2elqOel5eXnZ6PsKiUm6ehjmp+aZymeIdyfZqOdHpkh3u9vsC6b5KCcZWHYXNqWl6bimFjiI6Va2CAlWRtnXdilWuAmpWUZV5hY3GaimlyjH2FlWdqfnJ0eH1+Ylt3dIFoUFxuhH18i2tYbHqCc0pKb4ZwTXVNRVdeZmBLWldnY19PW211aXJST0RFTjtISD1MPzItMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBfTCgzPVtPJz8yPqigqKHCo5q0ubWjrKWup6e1savIq7Cyq7SjvrGypqCiqJyim5mZrKavpKS1qaWbl5Whm6atqL6nqKaVk5uVn5mSl6SpqJCdkY+YnK+yv6ybp56nooiTkamaqKOam6ygo5qao6esop+ropqxm5WnoJeVnZ+dl7Gkl6GomZyRnZyipJimopqcmpqZj5WBZ259cXeSl5SRhYu1qo2GmJWOioyYl4eUlYqEkpSRiY6SlJiUmJeaoKKanJShno2CeqSGbGp8kHyAdYmKgXGCeHl2douAfIprc4F0g3Vldn13a3B7bWBjXXBnTFhaZmpgV1pveW1tZlNPRlM5T1lNUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCzobOhv6GksbK3oKqmsqelsLSqyKussKW1psCntKCdpKSco5WVoKqnrKOjtqufmZaWn5etqqXBnquklZKcl52XkpOin56ip5ORmainssSvmqudqp+QlpaonaqbnKCsmKGbnKKkr6ahpaifrpiXp52ZmqCenpyvoJyhppWXkpiToKGVo56XoI6Wk4qKjY6XrpB8lZuCkoKLqqiGgZmXioSPn4h7hJCHhpqSiIaKlY+bl42RmJ6jlpqTkZ6Nf45mobOvhYqEdnuQinx2eXpvZnqRgYCJa3WBeYhzaXN/enWDh4JrdWR5ZmBpZWNkZmtZbHtvaWpcUkxQRF9URUA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0XEc1PCxAtKC5r7+sq66ysaCrprGtoqyzsMSwqqujs668o7Sbn6aioZyZl6elqaakpbK0npWUnZmZsKWuvqCropCRnZqZlJGUopyXqJyEnqqrorPIs5+qpKqWlpeap52omp+kq5Oen52gqa+ppaOroq6bn6ChmKSenJ+dr6OYnqiTl5ackaSYl6idmpdlgpJ8ZX6NmpBkeY1saGt7kqSqamWamH5nhoplZWloe46hj2tojZeRo3draouZo56Zc2xue4SNh3pYZV6Ggl5si4mAdlxoc3d3koCHgm54gniAc215hHR3iYiOhHxqhllea3RkXXOJaWt8cWtjXlFNV0pkWEFKND1GNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMVlDOz8uPaWfury5r6yzsaqlqK2tsKatrbG8samnpK2vsJ+tl6CjnaKZmaarnK2jpaipsq2elaOPoq+mtrmlrqOOjpqhmZOSmqCZmaWVe6Wtoqi0xLikoqevnp2UnqKeo5yjqaiSnqGdoKqwqqukqqCqm6efqKCslqGbpbCkl5uqlaCdmpKll56qmJ5+vYOIcrRyhJ2GrWh4ucS4cZOio3qmmZlzqoJ8y8DAu3GMooiCn32WmImdwL2Cl52djZ3CwXyCfJKNmsPAfWulsm+MgW/Ken+bd5GDjoF2eoGAeXF6f4dxeIWNk3lueJRjZl95ZGBlgmNedGdsZGJXS1VJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JRLyNGWzNQWS9VQUI7LziWo7nDtLCwwKmolKOvqbCuraaztK+ppaamsaufq5iaop+cmqqnop2so6WopKS0pJ2ikqatq7izp6+ikZGZnaWSkJ+hmJufnYenrKSrrcDAsaCpr6mXkZ6doZmio6qjk6ChnZ6trqmsp6Ojp6GmpZ2tqZKkmqitqZucqZysoJaWpZWhopecf86UeHqkgXmVlptfro9ejqeBoqB8p5abdKuDgK9eY42qe6eHhaB0l5OIs2OCq4ahjY2zaoWvdH2XiLdhg61Zos1ukHV72nt/mXB+iJJ2fmV7iHZ2a3yIb32FkZF+bYOQYHJscGhgX3lkXHFoamNmX1FUUlddS09DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSzAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGkqqittKumsqysq6SrprCqoKebmaWXnKKvn6CeqKejpqGfsKyanZWmrayxqqisoJSSm5+kko+epZidp6OerqSrsKi/x7OoqbGulpKdm6GXn6mqn5Wgn52drrCnq6mcp6ikoquTrLOXpaKqqp2jpqWhsKCSmaaZoJqUlJGXoHGFjJd0hKiHcbF8nXGsfqGegaWPnneqgn2tf5xzrX6rh4afdpiSe3yXfqqIooyRjJ1+q3uJlJCfgHutVpzEeo9vksF9gZVtdW+MbWV2ZYZvYXducm+JipKPg22SkGZwdXVxYWdtZV9vaWluZ2NXU1xhWVJTQzhJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DUxsaytKCco46jo6Ksr7avqLGmqKqnraurp6KjnZmilaClq5+ipaCoqKKfnbCsl5qXqKaurKimqZ6XlJqjoZGToK2bnaajr6yjrLWquc2yraatrJaVnJ2imJ6urJ2WoJmen6qyqaqqm6yrpKOsm6+xoqirrqWYpqqpqbGikpajpJqUkoWkaqR1iXqpdHqycIKmipmMcYigmoekYGFSq4R/roObdq2BpoaGn3qZl4Z7ZoCjiaSZhoKkfal/gpWHrl99qVWdopKBeqKfgHvDr8WLcq+zs7lxYqmvwnRojIyYjoFtmpRwbnl4eXBtZmVlcXBmfGliXVdgaVhYVUxMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfDydbVv6GZq6ehr6KesLSwr6mtoqemqqurqaSmoJuknp2mp6ejnKyaoqyhpJ+vopybk6qjtbCvoKmbnZaUpqKQmqKooKClnLCmpKixrLbIsrWqq6mVkZ2copifpbOdmqCUnZ+nrKykrpqtq6OjqqKzrqKqs7Ghmqmorq+2opKVoqeYm5F8qmyehId1q3l8sG+CpIuJn5aWn5SB0ri0uMmAgbJfYJSpg6OIh6B6mJaaeKrJdJmklaiqkZOajICciprGx3hmoYKlc4GfjoJ9r11wtGKwdUujhm2nR4KTZI6QnpJ8cZeTgHF7dX58bltmanJwZYFqX2FYZG1cXllJTkxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqbOtrKWinLK5rKqhppqopaqrqqegpqWYqqOfr6udpqCsmp6ppZ2ntZ+il5OoqbWyrJylnKCUj6WskZmbp6OgqaauoaSnqbC0wrGzqq2ok4mXnaSaoaOuppihlZmcpqasm7Cdrqmnnqykt6ygsbmvnZuup7Kzs6STl6eimZ+Ogp1OeJqBf596g6N9g6SEhqaenJ6ThLh7fHm5gn7MxsK2eJuhkIuffpqWl4p2npiKpZikqX+whZ2Fn4SsfZqUYqVspHCPhZCBfZaCcqxgo3NxgJpgvH1SVXSOkqOWe36Tkox2e3OFf3FcbW54cmqBb1tkX2huYmRdS0xRVEFJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA4ODIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu5qq+gm6Gss7Oln6CVpa6trqqnnaammqOnobOuoqmnsqCZqaSUorWiopWXoai0uaObop2ik4+hsZiem6eloaKvrp2kqKK2sMOxramtqZGHkJynnKKknKWXnpiZmqakqZqvoa+lppivpbytoba3rZ2dtbK4sLOml52voKOdhY/RtcO3eYeOhZGTkIGmeJShd4ygkYSlgYpxqoaEtG5yapmjnJWKnnyYmYaHj3OvgqWboo6mi5OdipWQm21wslylc5N6nGyZf3uZfG2pYaNxcX+fYnOyuGh3j5SmmH2MjZSOeX15j4JtaXhpeXJugHVdZWRubWZnYEpbWFg8SEdAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWTc42Krb+/vLq0npanpa21oaKZlaOop66rrJmmop+moKC1p6Opp7GjlKyjjqSto52Qmpqos7SknaScqZGUl62fn52npJ2nnLWaoaqktqrCsKmrqaGMhI6coaCmo5WampyYm5mnpaaYrKiuo6Wbraa+rJS9sKyforCyuau0ppqosaOnl3qokH18sHeKgKSliJxtsm+gh618oY6DqJWYgKyJhK6Fn5SqoaGXhp+AmZWAe5J+q4CdmpeLq3idn5GKlJKBeq9do4F9pqdknYB8l3Nqr12la3CFmV1gW4ygbZWRppmClY6Yjnx7hJh/a21/Y350boB6YGdlcW5oZ2dDWmFbPktUM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaWFNQT05JODA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNUVldXWFZVVVFIRklKIygovZOag6nGwrbBtJ+arKCuuKWjjpuko5+wr6qfpJ+drZmeuaCjq6CvqZquoZCrqKSWiZqPrrGspp6mmquWl46soaGdpaGapJytmKCopraov6+lqaSfi4CNm5qfpp6SlJqalJqapqWlm6qsrKSln6qovqSWw6yqoqGrsrmqrqafs66oqZh2r36Qi5yFh326roqYZbCMZZWtfaGPg6aVmoGsioSwhaaZpKGhkYWgW2xqgbNgf617e4KBsW1nb5mYjIixW320XKSDa8iiZJ+Ae7xYdrVasn1SroB6rFiAoW6YkKibi5eRmJh8eo+dfmR0fmKEeHSAfGFqZ3FtZmVlT1VkXEJVXz5KKD45PTQhIiwlHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFFSVFdaXmBfYGFiXl9cW1hVUE5KRkM1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpcXFhXV0dCO9Kfs7K3vbqzwbOjm6ympbaooIuaoJ+cs7Opn6OgnrWYoLSoqqyer62erJuVr6iijoibjq+sqKehppitkZiOqJqhnqSfmaOjpZmfo6qyqLuvpKienI59i5uWoaCZj5Gam5KamKmgopqprqimpqOlqbueoMampKihq7S1rK6mnrusrKyVgKmSo6+Om4CHpJeYkIGAuMO6g46ck4SnlpyCrIqCr4imm5ulqpF+1b3CqmKjv719fqOCg9e6uLWFlJODnr2+hGujgW+rhGycf3qysMeDaquwvax4d6K+vHOBlo6nnJCbkZiee4KSm3pjfXtkjmd5gntgbGVramJQYVpTalxAVWFCTio9OjQvHh8kHiUyIB0kKDA0OTY2Nzg6PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PEE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbS0sb+5sr2yop2upqWypp2MmKW/qriyqKG/pqeynJ6xnLqon62vpqaUlLCsl4yDm5GupaKsoKObqJ6XiqOSpp6nnJqhqKKZnqGsrai4raijm5eSe4eZkqabk46RmJiPmJOpm6GZqqmhqqeho6q7nqjEoqCuo6qztKqvqJ+6p66umnN1qqS3hmSJoHBnrY+Kj21vd6SQmZ+Bda6YlHCPi3GVqKObl66kcm1tbGaLeG9ugplxgXpqcWlniZaWmHJpaYSHZ3CGZF2IYmpvWV1nfnemX2FxjpFuZWV/jZOPopiZmZGYoH6IkJV2Zod4aY5reX95ZGxjZmxiS2RYSmxaOlFlRVInSzorIxwgGyIsKRgbGC0yLjU6NDU3OTw/QUJERUhLTE1PUVNWXVdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqZWts6m5uLKzqqmhrp6jsqmYkr6yxMm+tqqewKyso6GorKC6o6SurK2mjZeuqZCMhZWWrZ6mqqCdo6KekIqkkqeZqJmWo6qglpympqevuqusmpuSknuElo2lmI2RkZiUjZeVqJWfmKqkm7GmnqKruZ+vwKeksqWssLGqraumt6Ktt5aKoKiltp2JlqOZh6makJSdkqmymZqjq6CxlqKgnaCinKCloZWrp42TkoyHk5yclZCak5iRjpWFgaSZl5aOi5OTi4+GhH1niX50gnZ0h4txp2x6lJGTkoGBjZCQj52VoZaamKODiZaNcmmQd3GLeHd8empsZGNvZFVgWEBpW0hjYU9aK0Y9KychNzQwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhVVlleYGFjXV5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKaWqaqktLaurqKwo62foLWxkI6sx73Fu7mroqaem6afsaijtqedqbSnqJGYrKKLh4mPm6iVrKSfmKadnZGUo5eomqiZlKaho5Cap5mhtbuoq5iZj417gZSMoZSKlZGVkJCTl6WQn5uqoJy2o56nq7enrsGuo7amr6+wrKmpsrigrryZkaWkpraikp6nn42pn42Sn6Osr5qgo7Cor5ejoJyjqp6enZyWq52SmaGblJCWqpmNmZmWkJaekYmgnZWUhZKMkI2Ui4B9ZouFdYZ1eYiDc5xqhZCUk5CJfIuWkpKXlKKTnpijhYmZiHtylnN6i39yfH9qb2RecGphW19YbWNQYGRQWjpHR0U+Mj09OC8rJispJh0mNDE2NjY4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWBlVVBKQUNCOjlFTVZbXl5bWlxbW1tcXV1fX11eX19hYWJhYWFgYmJiZGJcW2OXlaSoo6+yrK6jqaatoKe1qpCQnaW0vK+traKjmnqdorGkpbGpl5y4pqOUmaqcjoaKiZyjkK6eopWnnqCRlpibrouplo+omaiMmKmPn7m2pKWYmoyIeYKUjJuTipWSlJCNkpeijZ6fqZ6fuKOAhK+1oq+vdaS9o7Kfd3mgqrG6lHWspJ6JgKp/ZFxidqCOpJ6El31uk7Oco6etqqNlnZ+Sc3mZlnCAmKiXbH+iqIplnKWckZeYloySnJGGnZqQlYOSh4+PkomEd2qOhnaGcHuGgYBhaYeKlJKLWnWUkGhoj49ze6aammZ7moeDeJhqhIuDb3mAa3FlX3ZwbGtoW2ZlYmJwU1w+Tk5OU0c+QFREOTEvHh8mNDozMTY2Nzg8Oz5AQUFGSEJHRklLTVRUVVldYGhmZ1dRSjxERzw4VVJbYGFiYF5gX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5Wmo6CvsKyrqaWprqOmraSSlqu2sLKnm6umrJd0jJ2vn6irp5SXuZ+gj5yknZF/iYmbnoyrmaKUpqCcjZaRnoR1rY6IppqpkZekiJu6s6egmZeKiXV3k42Wk4qUkZCUjJCToI+boaeZnLKWgIybtZ2zjJKPu6egfqeieqKutoCOjqaeg4uGkLGqr4yKlqOaeYCLrIacnaGnqaeHlYWYd6WbeoebgZengoJ7nLJ6ioagl5mUmJaCkZeWhJqZYnmHkISOj5GKg21wjod5gHCAgYV/hnSGhJWReJZnknSgmnR9mYSinoiYf5OKhISZa46OhWx4e3FxZ2R4b2psalpla2pldFxfSVRMUUBFNS5aVFU3KSEwOT0+NzQzNTY4Ozo9Pj5AREk/SkVKS0dTWFtZW2FhaWZZUUg5RUs8PmFWXmJkZmRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXo5+mra6rqKygqLGmpqmlmZSuyL6xopenqbWej4SdrJynoqCNkL6emo2fmqCQfIaOmJeHqpuglJ6fkY2TiYZ/kKeMhqKdpJSYnoaeubCnnZuTjoVwdZCJlZCKlJCPm4yQkp+Sl6Gllp6rh5+0ibSarYrKh6qtiLeFjK+Cr6yCqY2lmI2dfaiPcnt3nI+nlmiVpHm0jJ+epqiSmMKBf6uImKFynoCapX2XhZWxgKF9oZOgkJiXgY6Tm4qYkYt8hZKGjZWSiYNtcpCFf3lxhoGEfIR1hIGWgI/FZn+ph4+ja56Do5yEmoCNjoaKmXGOk4Vod3R8d2hodXFoaGtdY3BtZ21YZ0ddUk0yRDQ2TmFjNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05JSkxDUFpdXFdhXmptXFFFPUxNQEpkWF1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUl6KfsKepqaaroKS4sKmqppqUoKOkq6SXpaq3o6+AoaecpZ6diZS9mZONoZKej3mElpaQhqqYmZqZoISPjHeam46ej4eepJyWmpiGorispJqcjIx+Ym2Pi5OQjZCNjZiMkZKgj5ShoZmhp36hp4etnaCWrY+enJ2RhYCgjaqthaONqZmMmn+jdYCZlGuCrHVNq3iHjZyRm6ingKmrfYOhe3qnaZ5/kmtnl4aXtomefm5gZFmDl3+Me2Roi3KZfXmVbF18lm1fU3CDXF9reYNgWWWCfYOAl3CnqmuDo25ypXCfhaBqZqBsW26LfGZaYIN/YldQb3dmbXRya2pvXWpwbWxpWGlPXlhGOUE0R0ReazQsSUNSTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl5jdmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5adoLigqqSmrJGhtbyrrqKZmKCipayuoZ2utaOokqGgn6abmo6ZtJmQi5+MlYt1gZSSjIqmlZOXnZ1+koWFq6OHmo+KmKmZmpuRh6WwpqGVmoiJgGluiIiLj46Ki42SjJCSo4yUn6CcoaR/k4GPo6GUoHeclo+ng6Gnf4aoq4OleIp8hJp+onBzlIiWe56MeW2Hm4yZkJuomo+HnXuConN2pmaefnekX5h6fZJzom6Yt7S6dJOHgn+1qGSBxrh7cJW3i3GAmqRic6yrYH1pnbN+bnyGgo2Ci5hxf6NscqN0n4WBpGCdmLKVcXyXn7N0c1uesoNqYm90dnFpb1hqbHJyZl1pXmNMRD1ENlFBWXEzPVNHX0pSPTwzOTU6OjZEOztASlA/VU1OUUBFX15bWlhgYHxkSEM4TFdVVmNhWmVma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO4mauck6CNpLe1rq2gmqKdo6Omrpybsq6tk5ihmaGkmZqUn6ubi4iSeIuFcYCWjYqPoY+Rk52YfZCJjaigh5iOipGjlJybjIuoqKWej5eHhH5re4d+fY+Ng4uQkYmQlKCDl56gnaCei4l3nJiijJ9yoYuHqIibpY+Vpql9rYx+eqCZeqOTeIF0loiNnH2Vn4abjpmbpoaiZKF8iJaQm41snmiajW6amXuAi6d9cmh0q4Oeg3SqaJWaXZuFdoSdaKpqgLhmXKhwgZxglYxep3Z1h4l+nmiadYaTkpeOgJ9vmpBtp5lcqH54u2p9qVuOhF2zZ1xucnp4a2lccGp4eWNgZlhiQlFGTzdWQ1JvNUtaWl9PWkRAMTUxOzs2SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5bXVllZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtZuniGOUm6u6srGsnqacnKmfnq6bnrGprJ2XpJqhn5iWlqGkmYaJjWqIgHJ7l4iLlpaEkJOYj3qKhJWjnIqUj4aLnpKdnYmOqKOgmoyRioCAaYCGeH+XjHuJjo6Ij5abf5Sin6Chk5hyaJ+Kn4+McJKMgamHmJ6hpp6me7Cto6K4l3ejs6KkgIiUeZ17qpp/oo6dm5eIl3GhfIWNr7V9a5qRoXh+mLSjo6uohJl8m32dmn90qlpdb3uWi3ieYkx+enqFY3mXQkyeWaJqcnyObYCIhJl1m3iGibGzf4Cbk6d3gp1tcn2Ub5lyaqNdlXZIZWRhc3F+fm5mYGxpdntkZWJSX1ddVVdAWkVRaERTV1xiWF5JRD1COD9COklGOExFWEFXUltWREZiXFpgS2BtfnJFQzxVX2JaZmpWZ2htb2JmZ15hYVxdXmFoYl9lY3ZsXmVnZmtkZmxpaGtpk5yBsK2ZhFNeoKazubOzqZqijJyrnJyplKGspaKoj5+enZqZlpihnZaIh4l3hoFveZWFkJuLfJCRlohyf4iSoJtzkZCBiJmVoZuFjaicmpWLi4p8g2yEhXGBoYx4ho2Ih5OZlnyTo6Ceo4ithn21hI6enHullnqpgZWcj4mfm3ynaHdtfpl0oXNxfJ6GmXCTg659pIOmnpmAo29eqGd1omNvpWGc05B8e5l4cnNjooaQfqNzpI92a5CzjGCCmIlzqrKovH93g21+vqaptF6cbn1xl25/cqJyXaRnc6ZhaKZtm9SafYWbb3h6l2ube3eXc26ppGdhZXlxgIRrZ2ZkbnV3Z2BjU1xmUVFiSVdKVGFXU1tlalxlUUZDS01KS0JLRThPQFFOWFNZT1NRYWZlalJjd3l3SUZFY11lWmhqVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJebf7CrVFxLfqmvsbSws6ObmYWZqaChpI6lqKCYqYqamJiTmZOSoJiOh4Z7cH2EaH2Pg5SagXePjI6Ib36Fj5KSbJeTfImRkqSWg46qmpOSi4WJeoN2h4BugZ+Gd4CTh4iZopd7lKOkmp+Js6Gitot6rKekrqVwqICakIWAm5F7pICimYaYcp6Eo66vipeMf4ykjZWDraGUdrS1tcmhc5SKgZ5gnZepbXmVhqCbdaGHd6B+kpeLgW9MZqOScJuHc6R7enRhg4FrfqBrcWRfnHF9dJdpemmztbTGpnOYfnqda5ybq3WEm211eJhpmnt1mHJQRX20Xmp2a3mIZmpoYnR1cG5WXlRZaVBTaUpWTFlUVl1oa25WaFdOS0FKTUtISk9BUUtQZWNqbWV1c3N/eXxudYl7e1RQTmxeaFtraVJqaGlsZ2xmY2VgXF1cXmliZGlre19dZGhjamZvbGVpbGWhnIivpoRmP5Shs6uvr7aiopCAmKqio6WMpqednaaCm5eWjpeQj5yTjoiDeWp5h2WDjH+XoHl1jYeLgGeDhZGDjIWdjXqMi5Wmk4OXqZiMkYuBiXqAfYt5cJChhnmBloiJlqCVf5Slp5yWloRmbnicbKJkfHGld5uYcGemgJaLe6R6n5aDl3KedoGKlJaPuW6QiqJifZmhlYhtcmmqa3WgbW6mX5ppi5BoloealXWigH2aYIyGjXVviGJooGWefmmbdW9jZoiCbXKiWl9bYqFtXYmMbnt+c3JkpW13omRnp2iZc4yZb6JvU4mQb6BfZqhUi15UmG5tc2tygm1waWt5c2tvUllXV2daVG1KWU9dSVhpaXNqWWtWUVJFVlxMWFNhVWlrX3d0e31wfXxyg3t/c3aNgIR2XlFyYmdicGdQamhoa2xuaGRnX11eXWBrY2ppdnVdXGNpY2pqc2xma21jnKSYpnpldG2Lp66kqbCxpp+LgJirnZ+mjaOhm6KigJaZk46aj4uYkI6Ke4ZxgIhoi4t8mJtzdIh8j3pjgYaUiYmVmYJ8iIeWqJGBoqyRhpCKgop+gICOc2mPpYR9hpSOiZigjoiTqqadiaZ4lZt+pYiWjLKYnpCCr5efpXeUh3mpdKWPhJpupKKMkoSMg7tufaWvg4aGhpOVnJ98pXpyqJWglmaefm+rY5aKlZJ4qGypooGJdoiDd6qRpodqkbBrdrOMqWuKhm1tn56SlWB+q4uqdn5/jKWedp99hKSVnaBqm4h3rGefrYy2dHe+jaSTWYOmjathdXJ0cXx0cWNqfm5obFNXW1ZhYl1rTV1SXUpebW52YFtxWVxgW2Z0ZW5vcWJxdGB3en55cnmDc4R/gXt7jIGCgHZieGRjbXNkUmtnaG9scmpmaWFgXlxia2JtbHpvXFxiaWJsandtZ2xuYpWlqp2BgJ6klqmqnainrqSZiYOYq5qfpYqbpZ2pnYWMmo+HnJGFko2MjXSGeoiEcI2EfpiTdHSFcpKDbH+LkYeGk499e4KFmKaOf6WmjoGOiYWVdoKHkm9si6mAg4uUjomcn4mMlKqjoI+AdZSXiH6BeZSuo3+Bm3GPhXiPioN+e3KnjHF9fXqXlpuEjnh7fn6HlJWTinaQmJ+gg3t9iWuMhVt5eXJ6cGhufpKJcX91gY+Uk3GGhIJljH9egX+Ld3VzlHVveW5uh22EhV52aHiOZYCAhY2pm310fJZqiYhwgXZ9hnZtbWeMc3l7mHiFXGtYeY9pbnhycm94eHBdbIZuaWZWW2BXXGZrZFZiVV9RX3B4eGxrdmZqa2t2fXFydHNhb3VidHuBeHV6g3WAgX+BeYuFg317bX9sZHhuXlduZ2h1a3hqaWplXGBaY2pmbHF1blpbYmxkbGx5bmhsb2GNlLiopouhopqmpJmlnKujoYSEmKySnqGJm6eaqZiDgZuLf5aTh46KiY1yg3yPfX6PhXuXjnNyg3CVhXt9kouGhpCFeH2AhpmkjnynoYuGkJCFloOGjph3coWphY6RnZCInp6IjJuon6Cqg4mOlZp+fomWraiPkqaPd2+ckIJ5kW9+qIVwfZVxa3B9gZ+Mf5OOjGhtXYOLjJybno5zlYuIcXRrgnZ0gVlyboaRgX1+jGpdamR7hYSJgGBpeHqbe4KLgnWBhYJnd4qGa2FwcYF2XnKKgYiPppWFZYyPg253i4Rxho96cGZnZXuDepZbXGpnbnZbe3l4dW5zc4JmXG2Ka2thWVpfWllscVxfYVpfXWZ0fnp0cHRja2trfH1ze3h0ZG11aG18fnZ6fHt6eoCAfm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtobGtxcm1XW2VubGdzeW9oam1gi4uqsKGQo6Ganp6Ynpmoo6N+g5mtjaCViJyikaWVf3uYhX2SmYmIhoeKc32BjHaFi4GElopxb4BymIaEfpKDhIaKgXqAg4uboJCCp6GHeI6YiZWLi5yXhIN6rIKRl5mUip6dh4ihq5+ioqOLiJObnKOZlqqhp6agkpuHlY17d42OhKd+f5KRkpOcsqablZ6QjbKTl4SljIyVm5+JkJuCiJGKa3yOd3hlgoaQi3yJnYSHi5CIiICEhJB3fHl0maGIhomeioSUfn2KgIB1b3OEgn53hoaKj6aQg4WNh4ONkIx9iIyKkYN3bIKEfXqZanJoYXSKcH16d3dwd3SBXV5vhmhuXl5aXV1UaHJWY1xcYmxodXx8c29wZGtraYB8bnl/cWpwcGxngXtygoB4f31/hHttgoyGfHp4fH16g3lOZHdqcm1wemVrZWNiYFt0ZnBmcnFtVV1sdG1peXpxZ2lrZIyHnbmelqKhmJWYmZWZpKGefICaq46ejYafnIueln15lIN7jpmJhoSEhm54gIBygYh+iZSEbWt+epeHhIOQf4CGhIZ9h4SOm52Sh6ufhHKLkIaTkYudkX2Ne6qEjZKYlo+cloeGm6afopqdhoKSmpmYkJqmoKWdnZCWf4+JdXyHjoSle3yOkJGGmKqinpOdj42qjZGAnYyJk5qego6XfoaOg294hnJ1YX+Dj4Z1i5iBg4+ChoV+hYSUbnl1dJKiiouFmoSEjHN/iHx8cnJ7h4N6eIqOg5Kmj4WDjoGDiomKd4aJiox9b2x+gXxuaGxtaF96f2h9e3Z1dnV7d1xfcH1udF9jW11eUWduVGVbXmJraXZ6fnFsbWRrameBgGxzgWxsdW95cIV5boeAdoKAfoV2cYKNiH57e3x/e4KKYGl7anVoaYJkamNgaVxkdWhvYnRtbFVjcXllcHp7c2VqbWyLiZ63mqGjn5KRlpiLmp+fnnt4nqeRm4qGpJOLmJl5eo2FfImRg4yCgoJue394c4GFfYuRfWtofYKYiYCHjXx+hoSHfY+BkJubkYmonIBwjIuMk4ehooqFjH2okYiQkpiUlpN4jKOfoJ2WmX+AkJqYkoyao6GkmpeRmn2MhHiAg46GoH9+jIyPfJikoqKTmZCPpoyOgJqRiZOXm36Tkn6HjoF0dIJwdmB+gI2GcYqVfIiMcYx/goWGjmh3cXiLmJGPfpd9h4pygYZ7fHF4eoqEenmQi4KVpZOLhZB7hoaHhXaChImIe2ZyfH95e3FsamZffnNofHV2dH1zgGpeYHN2cHdkY1lfXlJraVRkWV9haGp2eYFxZmtkbGhlgIFrbX5ob3FsfniHemuMgXOBgX6BdHaCjYZ/fHp/gX1/j2pygm1zaWKHaGxiX3FWdG9tbmB4aG1XanR2Y3V6e3Jiam95iY2espKlpZyOkJiPhp2gm518dqWhjpd/jKKKiJqWeHuGh36DiX+IgoF/cX97dHaChX6KkXhnY32Gl4qBiYx5fYCNg3mWgZWYlo2WoJt+cIyCkZSGppuHjImDppWFk4uXmJOSd5GdoKCXk5Z5fo6Yl46Wmp2knZiSlJp4joSCd4SWjZ1+gYmNjHKXo5+ik5mOj6GLioKWmIOSlpl+mIx8iI2AdnF9bnpkgHyKhXCGk3+QgmyHgoGAiYRldW97hpKXjHyTd4qIe3+FfHtxfneIhXmEj4mKl6KVgYOLdoiEgoJ3fIKKhndgeXh9dH94Z2xlYX9pandzdHZ9cXxiY2FzbnVybWFaYV5bbGVSY1hhYWlsdnmGcWNqY21laH2DbGh1aGxwaYB9gnltkIZxgISDf3R8g4yBgH56goN+fJBtdohzdG5limxqYmN1VoRpcW5geGdsYmp2cGZ5fHpxX3FshoWPnK6XpqiejY2Xh4afk5eZfXiqnIqZepaci4yYkHl8gYx+fIN8gIKBeHR5enR9gIR/iYuAZF59i5WHfoSGdX1+in99mISXlJeMpKKYf3OHe5SSiqePjI6Kk6GSg5GQlZiRi4GPmJ+ako+Qc3+NkpSJnZ2eppiYjZWVcoyNiWuFl4+ZeoeIkIlvl56bpJOVio2ei4aBkpx/kpKVh5mIfIqJgXlxemt1bHx+i35thZKClHhwgoN9fop/ZHJpe4CWl4R+jXOPiIN4hn12d398hYB8goyEjJSkj3iEgnSJh32AdHaBiYRvYXt1enF9b2JvY2R7Ym5vdnN4d3N0YXVgb2x1bW9cXF9eXmteUF1YY2JpbXR7iGtfamZqY2h3iG5mbGhqbGiBfXt3bpCIc4GEhH10gYaJe4N9eoGEfX2OcnqKeHhubIdqaF9pcmKHaHFvZXZnbmxheWlrfXt4cGF3bYuAmZmqoKOonYqKkYaLnouVmH53rpmNl32ek5CWlIh3fnuKfXuAdnh/gHB0dHtvhX2BgIp/fGFbfo+Shn+Dg3N6gId6j5KIkpGck6WclYJ9gn2Oi5KkiY6KjZibjYaRmJOWj4qIjJKdk4+LjG6Dj4+RiJ6ZoqGXlomWkG2HmINmhZiOk3qIhJCKcJWalKOSkomLmYyCf5CefZKPkoyZjnuKhIdzcnVrcG51e4t0boaQjpJxdYB7gICHe2RwbHh9mZN9hIh0kIqAc4d5bn99gIV7hYuIhIyVqIx6h3x+i4V3fnFwgYaEZGl5dHVwfGJfcGFrdF5want5eWxzcGV4XW5sc21yWVpfX2JrWlBXWGVjZ3FxfodmXWloZ2JncY1uZGlnZGlogXp3dW+OhXSBgoN7dYKIhXiFfHiDhXqAiXd/i3t6cniDamtfcGh0gGpyb21xZ29sZXxjboB6d3Fsd3eKfqKXoaigppuHjIqCkJ2Hk511gaqVk46HoIyVk5CAdHx2hXh5f3Jze4VrcnB6bYp2gIGHbnFbWH6RjYh/f393dYGAf6CGkYuSnZihlZh4ioCBjYmcnoqPhpKYloWJlZmPlouLjY2NnYqNj4NtiYuQkIqdlqGcmJWFmIdpg6KCZoWdipB+i4OLgXeTmJKfkZCJiZWNf36PmHyRjY+NmpF8ioCCbnVwbG1vcHuFaXODjpiKcXeAdIGHgnhmcm51gZmOe4iEepOReXaHc2+Ie4WLeoqFgoiOm6OHe4N1got/d3lubIGEgl5zdHJwcHlaXnBgcGpeb2p8e3FtbWpsdmBwb2pxbVpYYWFiblhRVFpmZ2N2b4SCYl1rbWRiZmuSbmBmZl9na4F1cnNwi4B1f4OAeHWAi4B5hX93h4Z3g4V8h4x/e3aKf2pxY3xjhnxucWx0amhvbHZ4X3F/eXx0dXSAgn6klZqtnqaWhY2Ef5eUg5CgdYuglJOGi5qMlY6LenJ4dIJwcoVzcXWIa29tdW2IdoN+gG1uVVGBq5WHgnd/d3ODeoKggpKCk5OYnJOaeJJ7g42TpJqTjomVmZKFh5eZjJSLiY+PiJ6Ej4p8couFiY6InJqfm5aUf5N9Z4SbhmeFoIeRg5GCiXGDkZiQm46PjIyPjXh7kpB6jouMkpaMfIh8gGt2am5rbGx7fmF6fo6Wgnd6gHeCjHx5Z3Nsc4eVin6IhnuTj3F5g292jHqJi3qIfYGLkJ6dhHx7d4KLfXZwamyCg3pheHBubHJ0Vl5vYnJgX2xueXFocGZnc3RocGthd2VdVmZgYHJTUU5cZmVeeXCIfF9caHJiYmVmkmpfaGRbZ3B+cGtxdIp9dnyFgHR1fox5e4aBeIiDc4aFfo2NhHx5lXhmcmqDYIh9b29remBqbnR/dV90fXmGeHRzhXx4oI+ZsJyljoKKf4Oah4CMnn+LmpSPhYiYjo6PhHd0dnOAcG+Fc3Bxg29qaXZug259fW11c1JNgt/IktaTfHB1g3aEoIOTd5WSmZyRmXuUc4WQn6GTk5KKkpuUhn6WlomNjYiRjIicfo6Ad3qMfoiMipycnZuVk3mMdWaIkYZsiKKEkYiXgoVjjJGZj5WKl4uNiotxepSIe46IipORiXmFfH5se2Vyb2treXlcgHmQjoB7fX5+hY16emhyanOKj4mChYR8lIprfX5uf4t+i4Z8hHmBjpSamop8dniDkHhybGdxgIVua3VvaGp0bVJeb2RwWV9rcXdna2tiZnhyb3BjX3dgYFZrX152UE5LYWdjXXpwiXRcXGV2YGFlZY9jYWZiWGlzc21qcXaMfXR5hoJ1dn6Lc4CGf3qJfnKJh4GRi4h8fph2ZXNufWWIfm9wa4BabG55eXNhdnt7jXZyd4p3eZ+Lm6+boJCChXeIlX59ip2HhqCRj4WMmISTjoeBdHdweXFuhG9tbn5yZGV4cH1ten1qaGtjpJrB3K7voXNsdoR2haOGkm+XkZahlpyBknKFi6OXiY6Wi5CdloOBlZCFiY+AkYqJln6He3V/iXiGhI2cm5iZjo91iXVthYiKfYqig5CJnISFXouTmIyPiY6KioSJbXuWgX2IhYmRj4Z2hX19a31keHVpbnhzWIh6koeFeX6Af4SLfnhlcml/iY6JgoJ/i5aFa4F1bYeQgY+Ef4J5f4+Vk5iQdXN3iI11c3BndnqEY3VucGJpdmdRYHFnbFVfbnR5YXJkX2h9cHJuWmNyYWJWbllceE5NTGRnYl53c4ltXFxkeV5gZGWFYGNjXllqcmtua3J3jH50d4SBeHd7iXGDhH1+iHt0i4mHloaMf36Xc2h1cXlti3pudHCAV3F6dnlxZXh5h4xpdoCJcn+ch5mnnKOShX1wjJR4eYudhIWhjY58lo2AmoiEe3N3cHNqb4FraW18dV5heHd7cXV7Z2BkfOvatcnD3IhzbHSBd4ubiY5qmZCQnpaUgYlxhYmgjoWLlouMmJR8jpOIg4mPe5CLhY+Bf3Z4g4Ryh4KTm5eUl4aMdYZ+b4SBiYaYoYKTi56DiWGDlI+HioaJjYeBh2p9lIB9g4SJjo2CcYZ+f3F3aHZyaXN2a1qMfJKDhXx/g4CDiYJ1YXNriIGPioF+fpGQfW2Ba3iFjoWRg3yBfH+QkpCWiG5xeYyGdWxwa3N5gmB1am5da3ZfUWRxaWZTYHB2dGBwYF1ognFzaVdnaGJpWG1WW3VMS0xmZ19icnOFaVtcZXleXmRne2FkX11Za25mb2lzeIp+c3OBfnp2eodzhYN8gId2d4qGjpmBjIJ7k3Vsd3V5eJN0bnh7fFh6hnGAb2d5d5KCZHaGhXGKloWZoZmiiodzb5OLcneOnH6LmomJfJ9/hJp/gXhyc25vZHJ+aGZsd3hbX3l7e3FxgGlgZmF/1baOkKZ4bnF3fHGTkY2Ha5qPiZyTjIZ7aYeLmYaBkpGGh5iOfI2NgYGKjXuPjX2IhHp0eoN7cYeBlpqOk5SBiHSChXWCf4qSnJ2FlI6ffohhf5OIhYmEiY1/gINnfZGAfn+CjI6Qfm2CfIJ0a213dXR2dWpijYGPf4R9fIR/hIh+b19ycIR7joyBfH6QiHlwg2Z5goqGi4J7hH1/k46PkoRub3mMfnVtb2tse35kaWxqWW52WlJpcmliUWJyd2xiZV5aaoNtc2JbZ19kbF9uVVtwTkhPZ2VcZ25xgGxbW2NzYFxjbHdkZV1dWmtsYm1qdHeGf3Fwf3t9dHiGeIWCfYCHdXmJgZKWfImGdomBcHd5e4STb218gXdeg390gW1penSUc2dzh3xykpGDmp6an4aIdnaVfm12lJd+iJGEio6afYyadn12cW9samF1fGZiaXV6Wl93fHptcX9lY2dnV52PXnFzlrzEhHZxlImQfnOYjIeclI2IdGuIj5WAe5SMgYSbjHyLhn18iYx/lIh1iYV1dn2BcXWHgp6VhpWPgoJxfod0g3uJl5yWhpONnICIZX2Sg4CGg4mJcoJ+Z32Le3l/f4eLj31pgH2DdmZveXhzdnJrao2FioGJfniCgISDf2pecXd6fYyJhXuAj39+coBoeIKGioSDeIN7gJeMj4x9bmx6iX13dG9paH13ZV5yY1hwc1NUbnNpYk5ndHhmYF5dWG6Ab3NZZWJdam1gcE9ZbFJEVGhhWmtubXtvWltebGNaY3B2ZGdcXWBramNsaXN2gYNxbn57f3R1g3qEgnyBhXZ+iYGWkXiDinSBiHN5eX+OkG9vfIFxaYF5en5tbXx2lmtqeIR0a5SNhZ+Xn5mFiG59jHZqeJiPf4KKgpWYinqPlm96c3FsamRgdHpoX2Vye1phcnx5ZnB6YWRkjrGyd0piWqTZ0Jdye5GLkXh/loyFmpKNhm9shpKRenmTh4GEmYp8h394eImKhJaAb4qHcXR9e2p5hoSmkYSTjYN+bX2CdoJ4hZqYk4uSj5SFh296koR+g4OJg2+BeGiAhXhyf3+Diod8ZX1+g3VjcHOAaHhwbnSYjYWCiXp2eICEeYFqW3B8coCHhIl9hYh6iHKAbXCDho2Dg3KDeICYjI2Ed21ufoR/d3plaGp+cmFaeFpZcm1OWHJzZmBKbXZ0YV5bW1l1fXJvV2ddZmpwX29OV2lSP1lnX1twamd5cVxaWWtlWWNxeV9oXV5lbGhmbGlxd3+Hb21/fYB1cIF7gIF/gn92gYWJl4pxgo1xe4Z9enqElIx1anp/a29+dH99b3J8e5Rwb4B/eGaSioKhmJySgoVnh4RwaHqXiX5/hYKZioF8jY1peHJrbGZfYW95bV9ib3lcZGyDeWBwdl9lZdXrvosyOj6LjoByeYWIjo12hJiNf5OOjX9ubIWNjHV9j3+FgpWJfIN4bnaHhYOXd26IhGx1e3RmeYODqIyDj4yDfW1/dHWDeYWaj4uPkZKMi4Z+e5KHeYCEjYNsgHNpf354bXx7gYqDeGJ5hIFxZHFpfm10cXSBm4uAf4R9c3V+gHOAb1trfXR4iYKKe4Z/fIh4enFsiIKOgolxgXh/lYqKfnRtanaAgHV1XGlpeHFZV31TWnFlTFtzcmVbSnB3b11bWllddH50aFliW2dlbmJpTVdmUT1eZl1ddmZfdHBbWVVvZFplcXlaaF5gZ21naWxpcHh9jmxqgoR/eW6Ae32Af4J6dYKBjJOFcICLbnd+gXt7iJOJf2h7fmt0fHKGe3N3fX+MeniEfnxrjIyDm52WjIGAbI1+a2l/j417fn+DlIJ/fYqIa3VxZ2hjW2Jnc29fYWx0YWhwiXlgc3ReY2SboJBuXDVZr7V1aoCJfZKGdoaYh3WPjIp3cGyFg4d0eYl4iX2TiHp/c2d2iH59l29whn1od3luZXqIhKWHgYeNin5ufnZ+gHyLl4aBk5CXiIuEiXyPiXJ8fYV8aX5ta4B7emp6doKHgHJgd4F+cWRyZ3WCbXV7hZWRgXyBfm93eXx0fm1XbX52c4qBhneHdYGJendzbomAjn+Dcn58fZKIiHpubWltgoF1bl1oZnRyUlt7TlxxXE9ccm9kVktzeGpXWVlaYXGAdGBdXWBmZGhoZk5aaE5BYWRbYHZhXHVtWFhTdGFaZG5yV2peYmhrZ21saXB3fJNsaYSKfX1wfn57gX+CeneAgImLhHJ7h29xd4R/e4qNj4NqfntueHl3ind9eICCh3+Df356bYWMiJijjYSDe3aMeWtthImSeX17gpGAgH2Kg3BxcGNmXllnX3BwYGBocGZqb4p0YHNvW2FkaXZ7f76cpqPIuHKFg3OUfXiHlIR0kY2IcnNwhHuDc3WGdIh3lIl5eXFjd4Z5gJNpcoR1Znd2Y2p8g4iegoB/jo59cn5zg3l/kI6Cd5WNlI+Hgoh6iYlteXl+dWh6aWx/eXNpenaAg31oYHeHfmpqc2h7gGl2gYyQlH56fX1xe3Z7dH1hVXV8cnOJg4J8gnCGind4cHCDgot9fHh9fHWNhYJ2aHFobIiCcnBdaGN0b0tldkxeb1VUWnNtYlFPdHhhUldYXGFwgnNbYFxoZWRjamRQW3FJRGRhXGRxXlx3aFVXVndeXGVuaFZsXmFqZ2Vvb2hwd3uTbmmIi3l+c3t+eYKBgnx2fYOIhoNwdoNzbXeDg36Ji5R/cIB8eHl6gYt0g3h/gYGChHmAdm9+iYubnoh9hnp3h3xodIaNkXp/f3yJhoR2j4Bnb21fZFxYZVltc2FgYXFsbGiJbV9zaVleZG2Ad6naqseGh7JyinhwjXV7h5CBepSKgHV0dX53gHBxfm2FdJSGeHVsYHqBeYiOZnGDb2d1blttfYGQk4CBeZKSfXh7bYZ1f4+Kg3OVipCOh4WFe3+FbXV2f25od2ZtfHZtand2f398YWJ4hnpodXVjfntndIaOjJV7dIB1cYB6fGx/WVZyfW90g4Z/f3hriIZzeGt1f4OCfHl8d3tyioB8c2d0ZW2LhG10W2tgdmZIbm9MW2NYV1Z4bWJQU3R2WFBVWF5gcYRvXGBibGRjXm5iVF1yR0NmX11maF5ae2JSVlx1W1tna2FWa19hbmZmbHFocHZ4j3Rrjo11f3Z4fXeBg4F7dH2DiIiDb3GAdXF1foaCiY2Ke3d/eIR8fYWHeId8fYF+hIB7fnN2eYyOn4yJeol3dYN5Xn6Gmo15h4N0hoaEd4l7Ym5sW2JbW2FWanRjYFtob3Bnh3FgcWZXXWNrf3zKzoe5omttbottcoVyfYWLf3uShXp5dHl1dXtqbXVjhHaSgndvZ198gXmLiWVxgWpqcWNYbXuGnImDgnOXlHd+e22HcICJioZwlo6QiIWLg3p5fnFxb31naHJjbnhyamxxd318el1leYB3aXV5ZoJ2Z3SHjI2UfHKHam5+gHltfF1YcH1tc3+KfIFubol/cHZnd36Afn91e3F6c4Z7eXFlcmFujIJsc1hrX3hdSW9sTVdWX1RVfGthT1R1clFRVFZeYnSFaFxgamllYlluYVhjcEdBaF1gZl5dVnteT1ZlcFpbamhdV2dgX3JmamhyaHFzdod4bpWKdH97d355g4eAdXN/hoWOgnBwe3h3dXmHhYeMhnp8f3WLfn2GhISHf35+fYd/fHh1eXeRk59+jH2LbnWAeWSDiJeGdJKKb4WFgnqDdGNuallfW11dVGdzZWBZZHJyZ4FyYWtkV1tgaX94vq57n7duYnOHaHR8cnqDh3t+jYB4eHN3b3t2ZWpuYYd1joFzamJffnh5ioNmcH1oamtbV294iqOBhX9xmZNxgHh0gWx/gY+GcpSHjIeDiIV9eXRyb2h5YWptYW12a2drbHp3endbZ318eGVzfm6EdGV1ho2GlX5wi2ZreoN0bHRiW257a3R8i3qBZnSGfW1waHV+d3x9cXtreXuBeXdwZWxhbYl+bW5Wa2B4VktrbE9ST2lOWXxnYk5VdWtNUFRVXmd2g2ZdYW9nZmFXaV1cbGlKRWpaYmRXWVV5Wk5XbmpZXWxlXFllY150ZmxkcmdzcHSBeHCZhXaAf3h/fIWHfXVzgoeAlYJuc3l7e3NyhYeIiIR5gX12j399hImOg4GDe36Lg3t3fHd3mp2XeoqDh2l2fnxshIWUgHKPgnGGgn6Cf29mbGZXXVtcW1RkcGVfWGNydWl2b2RlYldcXGiAcG9ygHOJZWV5f2p0dnNzg4V4gYR6d3R1bmt6cGJna2eGdI2EbmZeX3xve4l9aG13ZmlkVldycI2nfIR8dpaQc3xye3lsenqPhHaXe4eGgoaDfXVwcm1ndV1taV9tdWRnZml6b3tyWWeBdnVncIB4gnVhd4WLfJSBbotqbXqBcWVyZWBseWdydol6fWF1g3Zpa3F1enB5d3J8Zn1+fnh2bmNlYW2GfG1rVmpicVRMamtQTE5wSF57ZWFNVXRkS05TV2Fqd35lXWdyaGVfVmNXYnBdS0trWGNhVFNUc1ZMWXZlWl9rYFxaY2Vfd2dtYnBpc29xfnV0mYF4gIB4gH6FhHp9doKDfpiFbnJ0fHp0cYWFj4KAeot1dJCAfYGUjoCFhHx+jIZ6foB2e6OminmIhoVsdXx7dYSCjHpvhXN6hX2Cg3VuamllVl1bW1pTY25lW1hhdHtqaW1oYGJXX1ppgGlrb4BnbGFoenlrdHR0b4aCe4B9dnVuemlrempfZW5ogXeQhGdlWGJ3aX6Hem9pb2dmXVVYb2iPp3aBenyRjnh1b35ucnR4jn53lHSFgn+FiHZqcnZnaG9cbWVebnNfZ2JqeGh7bVttg3N0am+Afnl3YHaEhHiPhXOIcXB5f3FjcGhbbnZkcHOHe3hhcoBwZ2l4c3Frd3Z0dmODe353dXBjY2Nse3xra1VpYmdUS21pUEdSbEVheGVhTVRyXUtNVVlka3d6ZV9tcGlkXFZfVW9uVklTaFhmXldMVGtUS1x6X1tfa11dW2JlYHpobGFvb3Vub3d1epd9doCBeYB/h4Z6eXqDfYGThHF0dH55dnSFiJB9gH2QbHOVgXuCn4V/h32AfoaCgIp7doSsn4B6iIeEbHKCeXaBgIJ0bodvfYB0ioBqb25kZFhfWlpbVWJqZ1taX3WCaV5ubFxhVlxca4FlcnR9aWpdbHd2Z3R3cm6HfH5+enZzbHpoanhmXWRyZ3p3koFjY1Rkb2eChHd2ZmhqYVdWWWhkkKdufniAi456cHB8ZnhueYp6do5xg31+f4ZuZHZzZGhoXWxiXnBvW2debXVlemlddIBvcmtxe351dWF0hYp7h4eAf3dydX50YXBsWXByYnFxhHt1ZHKAbGBsem9qaHp3dHFlhHR5eXVxZGFkbHJ9amxUaV5eVUx0Y1FHV2JHY3ZlYEtUcFhKTVhYZ2t2emRlbXBmY1pYXVh2ZlNJXGNYaFhYSFZkUEhieVtdYGxbXlxiZF6AaWpfb3R4bm9udoOXeXKBgH1/iYuGfnV2hniGjH10dXWBeXp6goyOfX6EiWp0loF7ip19foV5gHt+fIaIc3GProx8e4aQfmZxiHp0fX12cm+GbXt+bY96YnBvYmVdZVZaWVdjZmtgXV1zhmlZcW5bXlhaXGx7Y3F3dm1jW21zdGh1dnFthXl/gXl3bm90ZWl1ZVtndGZ2dpF6X11TZWZqgoFzfWFjaVxVWF5iZJClaHl0g4aQeGxueWd3bHuDeXSIcoB4e3h/aGV2bWBmYV9qYF51a1llXW9uYnpmW3h8a25ucHd5dHRkcoOSf4eCiHp2b3F8cmF3Y1pub2FwcYF7c2VxgGRebXZpY2Z4enNsbYF0c3xycWJeZW1ufWVpVGhZWlVOeWBSS1pZSGN0Y2BJVG1USk1aVmlscntjbGxzY2FZWlthd1xTSmNdWGlTVkdYYE5HanZYX2JtW1tfYmNdhWloYW54eWxvanaBkHhtgn6AgpKIhIF2dYl0i4Z0cXZ2gXd8fX6MkIB+k35weJaDfZmSeYCAeHl+f3OIg3NwmqJ7e4CJlXlkdYh5c3l2a3Nwf2x5fHCRcl5wb2FnYmxUW1pXaGNtZlxccolmU3JuW1lYWGBsdmRqdWpqX1ttdHFtdHR0a4Z9f4B8d29vbGVpcWNba3JkdHaPc1xWU2RgcX9+cYJcYWNeU1phXGSTn2VycYSDkHRranlsbm95eXpxgHZ/cnl6emRmdWdeYlthaFxed2lXYl5waGF4YVt7dmpqcm93dHN0aXCBlIOGfoR2cmpwfG1ldldbam1icHKAenNlb35bYG9xYl5pb3tra3N9cnB3a3BgW2VrbXthZ1RnVVhSUXdcU1BZUkhjc2JgR1ZsUklQWlVra2t8ZW1vcWFbWlhZbHBXUk9mV1ZoU1RGWVxPSXJ1WWBkbWNYYWBhXoxqY2RteXhrb2l1eYZ7a4R9gIWZfIKEeX2IbY+GcW93enx0goJ9i4+DgpZ0eIKThoGfiXWBf4F0f4Jwh4J1b6KXdHuGi4d7ZneLb258cGZ4cXtsc3ZzjWtedG5hZ2ZrU15cVmhibGxbXHGMZE5vbl1WWFVnaXRoY3RlZV1abnVucHV1emuIfYB9iHeQc2Nla25hXG5tY3N4h2taVFZiY3d8fHCFXGNfY1RaYFpjlpVjbnCDhIpzamd5bmVydXF6a3l0dW56fnVfZnNjW15XYmRZYXVmVl9hbWNhcV1dfm9oaXNxc3B1dWtshJOBiXuFcXJmbntvcW5TWmVqZXFzgHZzYmx2VWJxa1tebmR7ZGt1fHJycmptYFljaWp4XmZUZVVWUFVvWFFXVFBIZXJfYUZYa09JWFRWbWhkfGlrd2phV1xVW3RkU1JWaFFYZVNTSFlaUE54d1tgZmxpWmJgXl6PbmJma3l1bm5pdnZ/fm2EgH6Gl3t/h4GJfmuTiHJndIB7dYCDfomPf4uTcn2KkYWHn4Z7f4aMc4CGc32CdW6kjHOBjYt3eG57jWBkfHFneXN5bW1xdoNnZHxtY2ZnaFNgX1VnYGxvXF5ujmhNaW1gVVZTb2ZzbGV4ZGVdWXF1bXJ7eHNtiXyBd5x7emxiZWxtXmBuamVweX5nWlZYX2x4e3tvg19iXmhWWWBYZJyIYmtxgYZ8d2tqdmxbdXBqeWl1cm1ue4ByWGpuXlldVmJkWGVxZFRfYmliYm1aYH5rZmtzdW5td3ZraIWMf4l6h21xZm97bHFsYlhfaGhvc4Bzc15pbVNlcGRVYm5heGJvdXt1am9sal9YYGZodV1lVmJWU09ZZ1NPXU9PSGVvXWNHWmpOSmBLWG1kX3hobn1kYFVeVF10W1RSX2ZOXGFUU0pbWVFadnZdX2ZtaFhiYVtejnFjZ2p3cXNtZ3ZzeYNzgoN7iI5+fIqIjnlukIp0bHOBc39/iIWHkoSVj3p9jI+IkZuEgHyMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH1+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2Ojo6Njo6Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY6Ojo6Ojo6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPi4xMTExL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCS5KamZmZmZxbQURERERDWGhnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI8tGh0dHRwaaIaCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTM/k56cnJycn1IxNTU1NTRNYV9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmHh4iIiIeOkJCQkJCQjIeHh4eHh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaNjo6Ojo6OiIaGhoWFhYeJiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkZKRiYeOipCSk5GLko+MjoWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyMjI2NjY2Ojo6Ojo6OjY2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoWOh4iNiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCQiIyFho+JjJCPj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkJCIjIeIjIiOj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fX19fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMkIiNh4WMiI+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2PjI+Mi42Mjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp5ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5OUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlZWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTk5KSkpKSlI+OlJOVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkpGRkpKTfIaUkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSko9+j5KRk4hzjJORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCQkHR2kJGQeHSKkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+RfGh9kYl1domQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6OjpCAYmqKfmx0iI+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjndeamZpY2yKjo2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLiouGZG9tW2lya4GGg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d29jcW9hanNxZWhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoY2VrbnNwcnVsY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXllcYGJjbW9wcG1aWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTU9faGZsbm1nZVFQU1BQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OT0xMVmRtZmptbWpnXFNPT1BRT05OT05PUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0dHT1VgaG5obGxrampoZF9WT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVFU15iZmhqbWxzcGppamxramZYSkpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7Pj8/TVleam1sbnlzampsZlxSTEVFRUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7OztHSj5HWWpvd3BraVlHREFFRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozs+PTo7RFhtbF9IQT5BQENGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk6Ozo3N1NjPTc4PDw9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT49PT07RVk5Ozw+PT4/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9APF1uQD5ERT8/QTxFXD09PTs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo7bXZIODs6PT1BPEphPDw9PDg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUjw9PUlMRkZ2d003ODg6Oz4/V2lBOzw8Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N5STtdf4N/eXx3Vjw9Pz09PkZqdU06PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFIcnlrYoKEg4ODgH1dPkBDQEA9SnN8WTo9QUVBQkJGSEM9PEBEREFAPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEZvdH2CgoGDfn2EdUxBQ0VAPz5ZfIBdP0NFSUpJSU1NS0VDRkZHRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVxQkRFRENXdYaHh35YR0hKTUxOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhGSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIpsQUFWdIeJh4eHiINXSExNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0ZJSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3Z3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiINWbISHhoaGh4iIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSkhISEdJSUlKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpVgYOEhIKChYaGhIKGhYSEhoaGh4eGinVJSUZCPz9APz8/PDw8Pjs6PEFBQD48OTk4PDw9Oz47OTs/QUJAQUNDQkBBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWWFhISEf4GCg4KDg4SFhYaIiIiIiImMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODg7Ozs9QDs5OTk9PD47Oz1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaoaEhIF+gYODg4KDhIaJioyMi4qJiouMiVQ6ODY1Njc2NjY0NTc3MzU2ODo4NzY1NjU2NzY3Nzg6Njc3ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BPUlRlcHFzdHR3eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JmhYOBgIKDg4ODg4WJi4qJiYqKioqLiYqKgUc2NzY0Njg4NzQ1Nzg1Njc2OTk3NjY3NjU6OTo7Ojs4OTg5ODc3Nzk6OTg4Njg2ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhISGiYqKiIeIiIiKiouKiYmMej45ODg7PD0+OTo6PDk6Ozk6Ozo5OTs6OT09PT47Ozw9Oj47OTs7PDs8PDk6PDg6Ojs6OTk5PD88PUFCRElKTUtJS0xXb3JzdXN1eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUBCPkBCQEA+PT0+QD8+P0A/QD09P0I/QEE/QT89QEBAPj9BPT48Ozo7OTk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t9fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLioqKi4qLXj5ER0lLSklGR0dERkhHRUJAQENFQ0JAQkNCP0BESEVDRUNFRUFGRUZERUZEQEI/PEA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6e319fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0RGV4SCg4SFhYaGiImJiIeGhoaHiYmKi4yNjIyLioqIVkhNTE1LTkpJS0lJSkpJRUNERkdGRENFRkRCSElLSEdHRkhHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E+QkJHR0lZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE5QTkxOS0pMSklJSEpGREZISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hHR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4Nzw7PD06PkA+P0BDRklJUF+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1yTlJPTkxMTExKSEdFSUlESkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dIRkNCQUNVbnB1d3d5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6PDg9Pjs9QT4/QURISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMi4uLi4tfUlJQTU5NS0pHRUJHSkdMSkZLTktLSkpMTUxPUE5ISUtMT1FQUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkFCQlxvcnd4eXp6eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxYVlJSVFNPTEtKREVGS09OT1dVUVBPUlNTTVNUT01TTFBTVVZSU1FQTEpNTU1LTkdHSkZGSUpEREVFQkRDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQkdWTkZOUFBUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2hXVWthRVJRUVBJOztSVFJgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTlJQUFBRS0tLSEhKSEVGSUlJSElpcnZ5eHl5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0ZGRT8/QUFFQUNHRURFTFhSTVRVVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1E/QFZVWVxkYFZZYnJdXVddWlZFUVlaW1lfVFlnUlZWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6eXp7enp8fXt+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+i4mKi3pucFhaXFtSU1JWVlRbWnWDWVV9kGBcWF1eV0lWXV1bW19ZSFlYWVtdWFhZV1JRTlBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVRVVFdSUVdWY5aAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ1xbXF1dV1JPU1BQUVZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT01LZnlbXVRZVVZdWkxUWlVTVF5aWFdXV3prWFtbXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVRST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlNVY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTU5LTUtISkRGSEVDPlRkVX9SUVFOS1JUUU1PWVJNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXZ1c3N3enp7e3t9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJWVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz9DQ0NDQj9EUEJDQEM9Q0lHVkBITkxHXWlQSEZPRkRFRklHSENESEdIS0dEQkFEQE5RTVJkcnR2dXN0dXp8e3t7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgmtNRz9AOjs+QEA/Pz5qUUthRUZISUVCP0dMTkdNUVVJQkU/Pzw9PD09Pz0/QUNDQD88PUI+Sk1HVW50dHVzdHZ4enx6fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXkpKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZUNAQEI9OkJDQUFEQlxdT3tOT05OS0xNT09RTEtMV01IR0BCPDk3NzU5OT07Ozs4OTg5PzxCSD9cc3R1dnV2eHp8fHx9fHx9fX1+fH59fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJSFBSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEZGSEJBR0lFRUZETVJQYVdSV1FQU1NSVVtPT1FXUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxCPWVzc3Z3d3l6e319fHx7fH19fn57fn59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aWE1MVFRTUFFVT0xSU1RXWFRUWFFMV1laVlhYVlhZXVdXWGhza11WYXNrYWFfXmRhX15ZVFFOTk5MSUhKS0lJRkNRUFNbV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NTc1Nzg1OTlHbXJ0eHh5e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1RWWFhZU1VUTEtUVlVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTE9SUk9NTU5OTkxKRlFQVVlTVE9KTk9VU1RcVlJVU1JPTUxJSEhGPz88Ojc4NzY1OTk2NzY3NVdwcHR3eXp7fH19fX58fX18fX19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG9mZWRjXF1SVFpWV1VUV1RSWFhZWVlSVU9JR09QT09NUkpPUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBSTUlMSk9SUFJSU1RRUk9MTEtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9ydXh4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSUdFSExIS0lGTE1QTUcvRV9SPjM/PmpvYVJSUUBHVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR2ent7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRUZISk1MRUdDT1JDOEVOU11nU1FTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydXl7ent9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUWFdVTUxLSTw5ODc7P0A+PD1BQEI9PkVIR0NGRklHSklARkFBQEZIRUpPSFFSYVxRUFJOU05PUExMT01LTUxNT05bV0tNUU9HSUhDSEpMTEpGRkZFP0JDPjxCRz9CP0FkcHR3e3p6e3x7enp3e3d5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSEREPTk3Nzk/Qj47P0FAQD5BRElFQ0dHSUZJRUJCPz49Q0JBR0lFTU9iZVFNTk5XS0tNS0xNTU1MS05OU2RNSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES25vdnl5eXt7enx6d3N4dXh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEpEP0E9OTk5Oj9CPzxAQkFBREVHS0ZDSElHR0hDQz9CPz9AQT5ERURMTVJUTEpJTVRHSUlKTEpLTElKTE1PUFFQS0dDS0dDQkpKTE1PTklKSUdDQ0NESUpNTElZcm13eXh6e3t5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFIS0RHSEhHSktJSktER0I9Pj06Ojo7QUI/PUJCQ0NIRklLSkRJSUZHR0NDO0FAQj5AQEJFQ0lNUEhIS0dIS0RISUtNSEpMSElKS0pNXFJISERORkFES0pNTVBNS01KS0ZHR0pNTlFOTGJtaXZ2d3t5e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLQ0ZFR0VGRkdFR0JDQD08PTk6OjpAQ0A+QkNERUlFSUpMRklJR0ZGREI7QkNDPkBDQ0NFR0xOSEtOSERIRUlMTk1HSUxHRkdJSUxOS0lIRU5JQkZNTE5NT01OTk1LSUhJT1JRUk5SZmZmcW9zeHV7enxsaGpuZWtxbHNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pERkZFQ0NDRUBEQj5APzo7Oz06PT5DQT5BQ0VGSkZJSExIR0dHRkVDQD1FRUI+QkRDQ0VHSElHTVBKRkZHS05PS0ZISkZFREVJSkhLSUZIUEtDSU1MUE1PTk9PTkpKSE1SVVVST1dkYGFtZ3Byb3J5emdlaGhkaWxmcWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMR0VFSENCQUJEPUJBPkE9OTo9Pzo9PkBCPkBCREdKRklGSUhGRkdFQ0JBQUZGQ0JDQkRFRUdHSEZMUUxJT0pKTExJR0hFRkZEQ0lJSEtKR0tSTUJOT01RT09PTU5PS0tLUFVXVlVUWF9eXGlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWpzdW51dHNxcmprc01HSEZIQkJAREQ8QUBAQzw4OT0+OT88P0JAQEBERkhFSEZGSEdGRkRDRUNESUVDRkVCRUdFRkdHRUpNS0hRTUpLSEhJRUZISUZDSUpJS01LT1NORFFSUFFSTlBNTlBNTE1TV1ZYWFZYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW95TUhHSEhCQkJGRDw/QkJEPDc6Pj46PjpAQj4/P0NFRkRGREVIRkRFRERFRkdKRUVKR0NHSEZIR0VDRkpKR01KTEtISkxGSUlLSEVLS0xNTk9SVE9IU1VTUFNPUU1OUU5NUFdaVlpZVlpdWlhhYGBgX2hlY2BkZmhnamloaWZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSUhHSUNBQ0hFPEBFQkQ9OTo+Pj08PEFCPD8+QUJGQ0VDQ0hFQ0VFRkdHR0lGR0tIQ0lIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5MT05PUlVWT0tVV1NRU1FSTE9RUE9UWVpZXFpZXF9fXmBjXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZvdE1JS0hKRkJFR0U8QEdDREA6PD5APz4/QkE8QD5BQUZDRUVESUVGRUdFSEhGSEhJS0lFSkhIS0hGRkxJSEhKR0xMTExMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUVFMT1NSUFZbW11eW1xeX19hYGFkXWRgZWZgZWhqY3NzZmpnZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SktMSkxHQkVERTxARkREQzs/P0FAQEBDQT9CP0FDSENGRUZJRklGRkRJSEdJSEpNSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOTk5QTE9QUlRYVk1OVFZUUlJRUExOVFNSV1teXl9dXWBfYGFhX2FjZWJkaGJkaWpndotsamlnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2b3dLTUxLTUdEQ0FEPD9FRUVDPUFBQ0JCQ0RBQ0RBQUVHQ0hHSEhHSkdER0lHSEpGSUxISUpNS01MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNRV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAQ0FFRERGQkNFR0NDSUZDSUpKSUlLR0RLSkdISklJS0hKSk5MTkxJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BidnVodWNhdmBYbnFiZHZpbnpmW2x0YGxrVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQkVFREZCRkZHREVLRUVKTU1LTExHR01JR0pLSEtLSUtLTkxNTUxMSUxNTFtzYmRwXmxtVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1Kcnl2a2Jga2VlbXhsa3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElIR0VEQEJCQD5DRkdCRkNGRUZFRENISEdERUtIR0xNTkxNTUZKTkhKS0pJTEpKSktMTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW51XFlsUVxtbVpxbWtvbXh4dHNpcF1fcmtxalV1eXhwY15rZmJncHBqam9wcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0hFRUVCQkI+QEBGR0JHRElFRUVCRklISEVHS0pHTU1OTE1OR0xNSUxLSUpNSUpJSktPUE9OTUtOTUxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SE1HSURFRUNBQj1CQUJGREhHTEhFQ0NIS0hIRkpMTEZOTExTUkxHTExITkpISE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnRzdnNIS0hJQkVFRUFAPkREQkdDSElNSUZDRkpMSUdGSk1MRk9KS1dSS0dLSkpOSUhKTElLSklISk1NTU1JS0tLU2tiW2leX2ljcnJaX1lqb19lZVVrX2NbYWFRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydnR3ckdHRklERURGQUBCRkVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRUhIS01JSEpKSktJSElHS0tLTEdIS0tMTExMSktNTlRbXFRQVExQT05PT1ZRT09RTk9RSklOUFFkcWlUWVdcW1xVWVpdWF1cXGNmYWFlYmNmX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0ZGQUVDQENIREZHQ0lLTEhGREdLTEhER0lQS0xPS0xXTElFRUhJSkhJS0hMSkhGR0dJR0hJRUZMSUpLTkxJUFxXXlBcW2BeTVhZU1xcYl5NWVpNWGFSSllhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNFTE1CRERCRUlFR0dGS0pLSEVFSkpLRkVISFBKTU1KTVNIR0VBSEZKSUtLSUxKSEZFSUZERkdFRUpIQ0pNS0xVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOXlxeU1peY15aXWBjYFlfYltgXltUWFdZXl1jYmNhY2ZoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ1dmFTSkpNSURCQkNHSEVIR0hLSUlJREZLS0tFRklKTktOTEhMTkdIRT5HR0xJS0tKTEtJR0VJRENEREJGSkRASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFZVlVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUJFSElGR0hIRkZKR0hGSEtJTERES0pNTUxMSEpKSEpGP0dGTkpLS01LS0tJR0dDREBEQUhJQj9JSkhQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYlxkY2JkY2ZYUVVUUltXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSkZGRkhHRklGRkZJTEpORkRLSkxOSkxJS0pISUZCSEhRTUtLT01LS0lIR0VEP0VDSEhBQUdHRVRdWV5YX1lfW11VWFhQXV1RS0pWXlheW11VWWBSUV9fYmJgYGJiYGNiYWRkYlhPUVFRWlJbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBR0ZER01SSENRSkZISEhFRktKTVBFRklKS05MTElMTElJR0RIS1FPTU1QTE1LS0hJQ0RBRURIR0JBR0VEV1VFXFVeU1ZfWE5UVU5aWk1KS1RgYVtfWF5eYV1PWWJcYGBfYmNiXWFiV19fVFBOT09XUV1bW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREVGR0RJUmJQQ1ZeSUdHSERGTUpQUEVJSUtLTkxMTE1LSkpHRUpNUVFOT1BNTkxOSEtBREFDREZEQ0JFRkJNSEJLTFBPTkxGTUZHSUpIR0xLTU9QSUxPUE9TT0xRU1JVWllXWVhYZFdPU1RQUE5NT1RTW1hYWl1cYGFkZWNnY2tscHNyenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHR1hMR0hKSEdNTFFRSUxLTEtOTVVOT0tLTEdHS1BTU05QT05PTk9IS0ZgRURfTERmZEVNW0leW3JtT01VbVlMQ1BgVWtXZ0pdWFVeRE1RVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalNXVlRbXFtgYGFhYWJgZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xIRUdGSEVFS09TSUpGYFNISk9KSU9NUlFLTUxMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUX9RSXxZWXFzWFBtSHFub2FWUHFxc1BCa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbYFZWWH9qdHV1X192X1hhW1xmW19hYWFhXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1OQkRMTEZJS0VRVkxLTklLUlhXUU5PT01RVE5PUVBLS05HTVBTW1pUUVJPUFBQSkhaeF1UeGVoWlJUUXZndGxwYm5malFyT013bWpycHNycXJwb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29zcnt8b315b39yX2BgYmFaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEpKR0pQT01NSk5WXllVTFFTTlhaTVNTUk5LT0lRUlRZV1dRVFBQUFFLSGd4bGN4cm1bS01VeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/b2hvWXZ2anV1cIFgcmd8aWx4fG9eX19iYVtdYmRnaWlkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3V6bnx9eXdybk5LU3ROQ0NGUFBISktKS1BPT09NUFpgWlhLVFdQYV5SVlFZUkxPSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JocXVubXlwd2x2dHRybG5ddH56a215fGt0bHxrcHZ1eF5fX2JeXV9kZGlnaGZlXmFiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0cm9tTExbVkhHRUdSUElMTUpLUFFQUFBRV1xYVU1VWVVmWFJSWV5TTE5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9bcHp7XmB6c2Nyb3hxaGR8aXJ8XlRMbGB2dWtpdXx7bX54a3xwXV5fYltfYmRkZ2VlZWJaY2Npa2tyc3J3Z2xpaGRnYGFrYWdzcmxnbW1yfGttaGt7dG1ta21PSEpLSElISFJQTE5PTEtSUlJPU1JXUlZUUFdbVlZUVFRhYFBOTUtUU1NRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFlSTlBVVFhYWFtaVVJTV1tXWFdaT1NVV1hYUl1ZV15WVFBZUlZXV1dYXltncl5bW1lcXV9jWl9jY2RmZGNjYlpjY2ZmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0xMTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlYUE9MTVZUUE5VU05PTUxRUEtKUlFLUU1LS09SVVJRUVNTSUhMTk9RUlFRUVRWUlhXXFdTU1BRVVVWU1pRT1NSWFZUWVZUWVVUUlVUVFVXWFddWl5hXVxaWlxcYGNbXWJjZGZkZWRhWWBhY2FiaGhpbWNhZF5fY11aZFxibWFeZmVmbXNkaWhra2VkY2ZoUEpLTE9PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFNRUEtPV1NQTlVQTlFOS1NQTE9VU05STk1OUVRQVFFTVFVOS01PUVRUUlJRVldUWVpbWVNVUlRXV1dZW1RPVFVYVVVaVVdZVVJSWFZVV1tZWmBdVVheXF5dXF1hYV5bYmJjZ2ZlZGJYX2FiXmBoZWZlYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FbWlhXWFpaWFlWXGpkVlhZWldWU1RPSk5WVFBPVFBQUE5NUVFQUlhUUVFPTU9TVk5XUlRVVU9OTVFTVVVUVFJUV1ZaXVxaVldRUldYVltbV1FUVlZWVllUWFhVUlJYVlZaXVldX15WXl1eYFxcYF9fX1piYmRoZ2RkYlliYGJeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFQVVxaWldbW1xZWltkcW1oZF5bWVZVV1FMTVZTTU5ST1FST0xQU1JVWlVTUFBMUFdXUldTU1NYTU9QUlRYVlVVU1VZWFteXVtbVlJPVVZWW1tXUlRXVldYVlRYW1RTUlpXV1xeWl5fYFVhXGFhXmBiX11gXWNgY2doZGZgWmNgYV9fZWRfYGNbWlxbXFlaWFlXXFlcW2BeX1teXmFgXmJcWWBaUU5PTlZRUFRST1VUU1BXXF1cWF5cX1dcXmpxd3mAYlxbVlZYUU1PVlNOUVFQUlRSS1FUVFlaV1VPUk5TWFdUU1VSUlpPUFNTVltWVldUVlpYXV5bW15WU05UVVZcXFZSVFZWWFlTVFlcVVNTXVhaXV5cYGBgVmJbY2JeYWNfXGJhYl9jZmlkZl5bZGBhYGFjZF9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVJRV1JUUFtdXl5bYFxgVVxdaWpyfXNsZ1xVWFdQTlJaU1JRVFJUVVRLUVdWW1paU09TUlZWVlRPV1JTWlJUVFRYXVdYWFNYXFheXVlaXVRVTlZXV15bWFJVVVlZWVVXWVxWVFdeWV1dYF1iYl5ZX1tlYl9kZF5eY2NhXmVmaWRmXl5kYWBhYmJkYGJeWFpfW1xbWFhYWFdbWlxgXFtbXFtYWlteVl5ZXVBPT1JaUFpUVVZWVFRUXl5gX15iXGBVXV5ia3l0bH1sWlVZVVFQU1xUVVRVVFZZV0xSWlddW11ST1VTWFdWVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUldSWVhZX1paVFVWWllaV1haXFZVWl5cXmBhX2RjXF5dXWVhYWZkXl5kY2BcZ2RoZWRiX2RhYGFgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfX2FhYGNdYFRdX2JlZXWBemhYWVlTVlNWXFhXV1ZWV11YT1VdWl5dXVRSV1NXVlVTVFhSU1ZUWFhYXV5YXVtWXV9YX19YXVZRWVRZWlphWVxWV1hbWltZWVpbWFZdX2BeY2JiZWRcYlxgZmFkZmRfYGRiYltmY2hlY2ZhZl9gYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlNcVFZXWVZWXGBhYmNhY19fVltgZGFfenVvaFlcWlVYVFdbWllcWVhZYFdQVl5cYGFcVFRYUFVXVlRWV1JTVVdaWlxfXlpfXFZfX1leXlleVlNZV1laXWJaXlZXW1xbXFtbWltZWV9fYGBkYmNkZWJkWmJmY2dmZV5hYmBjXmJjaWRjZ19nXmJiY2FhYF5fWFRbWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNQVlpWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheXF1bVldYWVxcXF9bWVtiVlRYXl1hY1xSVllQV1ZXV1dWVFZUWFxcXmBgXWBcV2FeW15cW15YVlhYW1tfYFxfWFldXF1eXlxbXVhbYGFeYGRjZGVlZmJZY2VlaGdkXmNhYGVjXWVpZGVpX2ZeY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWlhbXFhXWV5gYmFlYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBXV1hZWVdWV1ZdXV5gYWFfYl5ZYV1dXlldXllYVldbXGBeXV9aWl5dXl5hXFtbWlxgYl5iZGNlZmVmYlpkZmZpZ2NfY19hZmVaaWljZmljZV5iYmNhYGBfXV1aV1tZWVhYWlhXWltaWVdYVlVbXV1dYGBiYnhMWFdcWVdcW1xdWldcXV9gYmRiYmFdYFhiY2JhY2FiXVtcW1hXW1xfXWBfXVtgZFxcWFpiZWNhUlxaT1hYWltbWldaWWBdYGJiYGFjX1xiXV9dW15eWVlVWF1eX2BfYFxbXl5gYmNcXFhcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiXGRnYFxpaWJoaWZlYGJhY2FfYF9dXVtZXFlYV1hZWFdcW1pXV1hPWFpdYWNmZnJrf0pZV11aWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBiYmJcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxdXl9aWFZbX15dYWFgXltgYWJlYl9dVF1gYGNkZGZlZ2VmZmVeZWZoaGdkZGBbZWdeYWhoYmhoZmNgYmBjYl9fX11dXFpbWVhYWFZaVlxaWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3x7e3t7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t8fHx8fHx8fHx8e3t7e3t6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKgkU+Pz8/Pz11jYmJiYmGs9bS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjI2DOjIzMzMzMHOQjIyMjIi/6eXl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eHh4d3h3d3d3d3d3eHl5eXp5eXdvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx2dXV1dXV1en19fXx8e4GEhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ1dXV5dnZ2ent4e3h3dnd6d3l6en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3x8fHx8fHx7e3t7e3t7enp6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eH15fXp5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHp+fXl7enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4OEgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3d8enx8enx5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHx5fH16fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4eXh6e3l5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh4eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzc3NycnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHN0cnFwcHBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3N0c3NxcHV3b29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJzcnNzcnFvkINucG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcXaMdXJyb32ge25wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcp2VcXFxlaJ7b3BwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXJvj6+Jb3mionpvcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcnCIsqZ2iqyke3BxcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycI2zqKSmsah2cXFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzc3Nzc3N2oaGjtKabpHxzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn58dnZ3d3Z1eHp4eHh4eHd4eIKnn5ynn6Ojknp5enl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fn18fHx8i6GOj5iamZuVe3t5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX1+fX+Ip6ejnaCak5iBf399fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYGBgI2yp6mioKGrpoR+gIB+f39/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f3+AgH+Kqa6fqaOgoaWppIx+fH6Af35+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+f4GIlaqvpJykoaChoaGpq6CNgYCAf4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4OGjJumo52cmp+TmKGgnp2eoaCUhYGAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI+Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYKEjJSWl5eZmIeQnZubnJiRi4eDg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgoCCg4SMlpmViZKZnJKLh4WGh4eHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj5CSkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGCgYGEj5eUlpmQhYeHiIiIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SEgoODhJGWiISFg4OFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4GCgoKCgoKBh5GCg4OBgoCAgH+BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAgICIkoCBgoODgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDipaIhIKEgoJ/gIyWgoKBgoSDgYGBgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmIqDhYSEhIKAkpqGgoKChIODgoOBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSk4+MjIqFhIODg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgY+Mg4F/fn18fYucjYCCgYGDgoWUk4yBgoGCg4OBgYGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiISEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlZeJgH19fX17gZeMgIOBgYGAj5OLkIGCgYKCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICVn4p+foB9h4p9hISDhIKDg4KOiYWMgoKDgoKCgoODg4KDg4OCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUk5KSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf359fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKNioiFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDipGDhIuFgoGBfn2Bh4aDgH5+f35/fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhYWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+gICEhYSFhoaGhYWFhYaHh4aGhYaFhYaHh4eIh4eHhoaGh4aHhoaHh4eGhoWEg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4mIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf35+f4B/f39/f4CAf3+Af3+FhYaIiIiHh4eHiIeIh4iIiIaGh4iJiYmJiIeGh4eHiYiGh4eHh4aHhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoOCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIOBgICBjImBgIGCgoGBgYGAf4B/f357eoCGh4iKiomJiYiJiYmJiouKiIiIiYmKi4qKiIiHiIiIh4iIiIeIhoeGhIODhYeHh4aFhYSEhIWFhIWFhoSEhIWFhYaGhoWDiZSTkI+QjoqGhIaFg4GBgoGCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgYSEgoKCgoKCgoB/fn19fX1+fXx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiGhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEhIGOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX1+fn5+fn59fnx9fYOHiYqKh4eFhoeHh4eIh4eJh4iGiIeGiYmDg4SDhYSEhYWHiIiGhYOCgoOFh4aHhoaEgoKDhIKDhISCgYKBgYGDg4SDhJGSkI6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoKBfXx9f4B/fn5+fXx9fXx5fIOGhoeEg4GDg4SFhYWDg4WEhISEhISFhIKCgoKEhIGCg4OFhoWEgoGBgoKDg4WEhISFhISGhIOEhYOCg4GCg4OEhYSHkpGPjZCMiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhISFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4F/f4GDg4ODg4KCf319f4CAgX99fn59fX19e3p6foSEhIKBgYCBgYKCgX9+gYGBgoGDgYKBgoKCgYODgH+AgIKDgoCAgICAgYGBg4GBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5+fn1/goODgoOCg4J9fX5/gICBgH59fX19fn18enp6gIKCgX9/f39+f3+Afn2Af36AgIF/gICBf3+AgIF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foGDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gIB/f39/fn59fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Af3+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7gIB/gH9/f35+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f3+AgH5+f39/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH59fX5+fn9+fX19fX18fHx7enl5eXh9gYCAgYGBf3+Af3+Bf4GAgIGBgoKAfoB+f35+f36BgIKBf39/f4CAf3+Af4GAfn9/gH5/f35/gH99fn59e3yGk5KMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KDg4WDgYODg4WEhISEhIODg4SCgoKCgoF/fn19fX5+gH19fX19fX19fXt6eXl5eXmAgoKChIOAgoKBgIKAgoGBg4KCg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTj4mJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX1+fHt5eXl5eHyCg4SFgoGEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSEhISEl5eDg4SBfX6BgoKBgoGCgYSGiIyFg4KCgYSCg4OCg4WEhIWDgoODgoODgoKCgoOCgoKSkIuIiIeJh4aGhIaFhYSEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaHh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKPjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgoGDgoB+fX5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfXx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fXx/gYF9ho+Bfn2Cfn9+gIJ8fIB/goCCgH58e4qCfYB/foGAgIGCgYKAgICBgH+LlJCMi46OjIiIh4WFhYSDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3t6fIKAgX5/gXx+fn9+fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSSjY2Njo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYODf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fX1+gICBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6Njo+OjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+ChIaGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIOAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn18fn9/fX6Afn9+hJKNjoyPjYuKhoSGhISEg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5+gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fnx7fHx8ent6fX+AgISDgn9+f3x8fH18fIGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgX+Afn+CgoJ/f4KCf4CLkI2NjI2LioiEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBgICAfXx9fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISCgYKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/gH9/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+f358fX18fHx7fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJioiKiYWIko+MiYqHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx8fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDg31+fn19fH19fX19fXx9e318fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uKiYyRkI6KiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fn1+fXx8fH59fH18fX19fn19fn58e3t7fHx9fHt6e3t5enp4eXt+f4ODhIeJioeJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+g5GEhIOBf359fI2HfX1+fX18f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiPjouLh4WEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn5/f319fXx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiY6LjIiEhYWEg4OBgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYKCgYGCgoKCgYGBg4ODgoWGhIOBgICAg4F/gIGEgX5+gH9+foB+fX5+gIF/gX9/gH9+f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHx8fHt7e3x7fHx8fXyKi4mIhoaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKDg4SDhYaDgoF/f4CCgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgYB9f39/gICAgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fYmHh4WFh4WEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl3dHSAgIKCgoKCg4WDhIOCg4SEhISEhIGBgIB+gIKAfn9+gX9+fn+AfX6AfX19foB/f4GAgYGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4OEhIWEhISEg4GCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFg4ODhISDg4SDgYB/gH+AgX59fn5/fn5+foB9fX98fX1+gH+AgICCgICBgIOCgH+AfoCBfoCBgIB/fn5+fn59f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+Af4CBgoKCgX+Ag4J/f4OCf3+Af4F/gH98e3t6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICBgICAf4CBgICCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fHx/fX+AfX9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhIKEhIWEhISBg4KBg4F/gIF+f4B+gH19fX6Afn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIGDhIKBgIGAf4GAgIGBgIGBgYODgYF/gIOAfoKDhICAgoGCgoSCfnt8fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgICAgICCgoGAgH6Agn9/gYKDgYGDgoODhYN/fX19fHt8fHl6e3p+eXt5eH9+e3x7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAgH9/f398f39/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+AgICAf4GCgYB/fn+Bfn+AgoKAgYOChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fXx/gICAf39/f3yAf3+BgIGAgH98gH9+fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAe4B+gIB/gYCAf32Bf35+f399fX1+gIGCgX5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDg4ODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgICAgIB8gH+Afn+BgH9/foF/fn9/fn19fH+AgICAfn9+fn99fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3fHl3eHd3eHt7e3t8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYKBgYKAgYCAgYB+f35/f318fn2AgYKBgICBgX1+gH9+f4F/gH9/gYB/f399fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgYGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKAgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt7fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoGAgYKBf4CCgoKCg4GBg4KAgoGAf3+AgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBgICAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXx8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgoKCg4CAgoGEg4OEgYGDgYKDgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgYB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgYGAf4CAf4CHfn58en18e31/eHd2eXl6fHx8fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCgoSEgICDgYaDg4OBgoSAhIOCgoCAgoKEgYGCgYOCf4CAf4GDgoGAgYGAgH+BgYGBgIOAf4CDgn9+f4KBgIB/foGAgX+AgIGBgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/gIR9fX17f316fX97enZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCgoKDhIKDhIOAgIODhoODg4KChIGEg4GDgICCgYSBgoKBgoF+gICAgoGCgYGCgoCBgICAgoKBhIB+gYOCf36Ag4KAgX+AgoOCgIGCgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCg4SGhIKDg4KEgoSDgYOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SChIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoSCgoOAf4GDgoCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7fYF+fXl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICCgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhIGEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYOCgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16enx9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHx4dn92d3+Eh4OCg4aDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOBgoGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhYOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhISBg4OEg4OEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4OFg4SDhX9+goqLhYWEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhIWFgoeGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeoR/f39/hISCg4OCgYOEg4SEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fn99foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgIJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN/g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1ud2xweWx1fX9/fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWHhoaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fnyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6GhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foN0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSCgX+BgYB9f3+Bfn9+fn+BgH5+gYKAgIKEh4aDg4aEhYWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYWFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhXiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX16fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhIaEhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOFhoWFhISFh4aEhIWGhYV9d4aDhISDgoF9f357fHt+e3x8fX9+fXx/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWHhYWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIaFhIWFg4aGhYaFhIaHhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9f358fH59gH59f4B+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhoWFhYWDhoaFhoWEhoaFhISFhYOEh4WDgoOEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaEgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4OHg4SBgoSFg4GAgIB7e359fHx8fn18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WGhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4SCgoJ/gHt9f318fHx+fXx9fXx+e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4eIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9/fnx8fX99fH19fH57e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhISFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIh4iGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFg4aGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYKCgYSFgoN+gYKBf4OBf35+f35/fHx9f317fX18fnp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSHhoaHhYWEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAhIODgn2BgX9+g4F+f3+AfH98fX1+fXt9fXx9eXp6eXt9fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYWChYWGhYaGh4SGhoaGhYaCg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICBg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYWFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhYKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18gH59fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhISGhoeHh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSEhYSFg4WEgICCg39+f39/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7fH19fX2AfX18fH2Af318hoOGhoaGhYOEg4aChYGBgH9/gIB+f4GCfH5/f36AgIKCgoSEg4OBgoSBgIOCgYCEhYSCgX+AgoODhIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhYWFg4SDg4SChISAf4KCf31+f35+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp8fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFhIODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7eXp6eXp6ent8eXt9e3t+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT47QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU09PT09PT09TU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fY2djY2NjY2NjY2dnZ2djX19fX19fY19fX19fX1tTT09PT09PU1NTU1NTV1dXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtBPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzYRtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi3qaenp6enp6enp6enp6auubi4uLi4uLi4uLi4t73T09PT09PT09PT09PT09vi4uLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZNPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OjoIaEhISEhISEhISEhISCkqWjo6Ojo6Ojo6Ojo6Kr09LS0tLS0tLS0tLS09Hf6urr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj87PEJAODw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX183OUisxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpaKJh4eHh4eHh4eHh4eHhZWmpKSkpKSkpKSkpKSjrNLS0tLS0tLS0tLS09PR3+rq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDw+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNz1w5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamnkI6Ojo6OjY2NjY2NjYyaqqmpqampqampqampqLDS0tLS0tLS0tLS0tPS0uDp6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3FwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tDQ0NDQz8/Pz8/Pz8/O0NHS0tLS0tLS0tLS0tLS1NTU1dXV1dbW1tbW1tfZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7OztHUz8/P09PPz8/T0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXW1tbW1tbW1tbW1tfX1tXW1tbW19fX19fX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztO7nc/Q0KGWy9LHkqvRzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztK1lZuz1qegq5/PmayastLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/Rn6Cqr8qclpChtJWGnZzNz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw5Nj9CP0I6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0cWHmrO/m6CombW/yZeZxdDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Wp5myzKOgi5/E05GZoc/Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P1aWZsdmYx8mU2K2jv57V0dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NalmbPInJWVpLvNiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NDVpZq3sZqvs52l0NujmbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0Y/SEhHRUA8PD4+PD09PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPQ1aWZt7Gem6KcnJGnmJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQzs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HH0tajmrLJnaiho56ooqmd0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09HVtYLD16+NkaXUmpKOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw8P0dFR0tIPTU1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dHC1NLVwL3W1NO5yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT42NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS1NLS0tTV09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6Njk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZJRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT0tLS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+PEhGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0tAOzs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPkhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQT9KTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BQ0NGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9CR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2tvb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vc3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTY2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk1NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNDY0OTg1NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDQ3Mzc4Njc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q6ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU1ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tre2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2tbW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NDczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsrK2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKeoqKWmqKiop6inqKmpqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo5Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqilpqenp6iop6eoqKelpKSioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaurq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6SlpqakpKOioqOioZ+fn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6enqOkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKunpqCdnJuhoZ6bm5qdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqenp6efm5qcoqCalpWVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWjoqWmpqamp6amoJuZm6Ggl5KdoJeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqenpqKenZ+hoJeYqKKUl5udmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaWmp6alpaampqWjoKChoZ+aoHSPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaGhn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqSlpaympKWko6KhoZ2bpoJhlJmbmZuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqS2taWjpKKhoZ6bnKNdZpqZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqGio6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKCmpZOxoqGgnpybmqeFVW6cmZqcmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaGgoK16jK2fnp2ampymZ11xnJqdnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuam5qam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goaCgoJ+pjWmcp52cmpqfl2pncp2bnp6cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmpiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJyen56dpJZ0famcmpucootraXCbnZ2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZybmqCWe3eRnZqcnpx9amlym56cnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmZqgoHqKhZCZnZ6SgGtmc5qfnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJuZmZmam6CXoH1ymaWbeI6GaXKbn52enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ucmZmZmZyrn4pxYKepnWF6iXl0np6en56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZifrY1wYGmikJNUX3l7haCeoKCfnp2foaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmXp6d0RUZul4B7UD5bdoSdm5uenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbStr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qblqmaTERGcJWCcVJHOGB4jpKNkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKiqoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkJWsdV14X4O2r6Vidn5Lan6Igo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ6Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg3+SqGCOs4zOw6zApYCVelJ6goGSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5+ipdy0NbJ162furNjZHBaboGGjY2Lho2UkouQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKabkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhH+CfZF/kM21ws7Iv6yUfKqsX2iJjI6LjZCZnJSUlKCamp+irbGuqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYx/iI2NjIuIkouYdZiijbSqnZ6HgnBozYBgi4uKkI+Nj5SUmJCVnJqdnqiusrCwtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmRnqGdk5eboZqenKOhnYqQeoajjISJd3RtdqOLZoaPjJiaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaiprKqqr6eZfltmhnh4f21qaHV2fXeEo6GknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipaqop6qsh3FWW3RxcnlpZWJpaXB8i6Opp6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUU9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkqKaZnqWloqKwnnFrUlJ2d3R7aGFlZl5fb3yLoKSgoJ+hoaignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioKOnoaauqLCyrIBoZktOcHV3gGlgYmlaXWJrdYORnaGgnaCjmpaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGnqa22vL69rI1uaGNGVW5vfHxuYF5mWlphYmdweH+OmqChopiWnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY21qaWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqevvMbLzca3po9zaGpcQk5wbnRuc2diYVlYX2NhYmpxdXqOoaicnaGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19fXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7TA1N3by7mrm4dwYGBiVUZFdW5gX21tXFtXWlldW1teYmRlaHiSp6+mpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1pdmtwaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLS3xdLZ1smukXhmXVpbXFRMQWtqjJiPWVRYV1xcXV1YVVhgcomhssXDtLKgp6qsp6uppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFpYGZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PDub2+wcfN0MSgfmldWVhXU0lUbKezqE5VXmFiX19fZnqWr7++vsDCsrW2qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV3bm1bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvFwcXGwLy5zMm5l3NcVVhUUVKcs59OWVxeXWBtjqq7wbK2p6axtau1sq2zramur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH6Ef2pmaGFrbGdudXJydXFnXmBcUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEJCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/w8PGxsGxk7+8y9C/mGpYV1lMkreWTVVZWGB/prywpquus6eqqamrrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3RrbG5kb21pcXhvemppYV1nYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMS5tcC4s7zBxb+pd1dVUYq9j01TVluDoKa3r6WttLStr6Wko6ikoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5eXt3bmtpaHVaZnJ4c3lmZl5kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDxMLFvri9wcO/x7uNY1Fhf2VQU2CNqp+mtLKtrLi1s6upo6GtqaynrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVmaWpoXWpvbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMe/xMfExMbKzsKNUklQUWanurfAvb65vLq8urysraapu7q5t7+ytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aGlpdG15bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnNxcXFw8XEyczT05ZNTVyqx8DIzcbEwcTHwby+tLGwsMK+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGtqd2xpZXVudGNdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwsPBwsbGx8rNf0mPzc3HzNDFtr+/wMC6u721s7PAv7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVnY2pkYmptbm9eWV1WVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvr3BwcDAx6ZNpNHMxcnRwa+9vbi5u7u+t7Sxub6zvL6xubW4u7a8tLW5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFjY2NqYmdjW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Bu7/AvLvEvbrAxL+9vbi7wMSwU57NxMDByb+wwb+6t7u+ubW4tLi8tL24tbSws7yxt7e4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhYmNoamdnaWVpXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdWOvL67w7W6x7e2uLu9ubm1usPIq1SXyL+/u8G+uca9wr+8xbi2t7S4tra7u7m2tLe6tbO4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVmcGpla2hYWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vNDFea3Lvce3ubittrS3urS3s7vFyqBVjsm/v769vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfWtucWdwa3NmYm5gXFRIS0tESkNDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTYr3aEvsjPwsC4rrW1u763urK+wsiWW4jNwsK/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHJmbGpudG53Y2diXGNRS1VIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsfJ0Zt0d7HR0czKxLW6v8TIvr61v8DAh2h9zcbCvsG8v8PMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4J0b2xsdGxsbl9jXmFiTkhOP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQwrq+vMS+t7zAv8nPx8jKysKIdneozMzLzcrGwsPLzsG8ub27sYF6bcDHxMDAv8TAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIe21teHxgcWNbXl9fVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u6rdvDvra+wL6+uqacqrO3xMCmfHp8n8TGy8jBw8DAycrBwLy6sqWWiHmzyMXEv8DBv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnpuc3h0aHBdXF9cWlFFRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vFtm6vzr22ucC8qn1uaG5tdIKXmXV7f5y+v8bAucC8vsXEvb24sa6mq5aUosrDw7y9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bHV7cG5pXF9fWVNQQUZJR0tARUNIPD02Ozk5PDs6Ojs7PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbF2grS9trXBpIZpWl5gTlNbXHB2eoWkuLfCurO7t7u9v7q7u66lrbKhpYfBxcO+vL+7u7i2wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z2d25xYV9mXVtVSj0/P0dGPUdDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmmhHiLorC1nGpmZ1ZZX0lJTVBUb3uLqbC3vrmytbK8uby2ub61mbG+rrN4sMnEwL2/ubOusry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYVxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/GqId7doyhmF9TQ1lVSGJqVU9FSmWRpa+vtrq1tLKsvLm4tbjBvY+sxLS0d6fKwr+5urWupayzsaawraidoJ+lrba1wre2tKWoqqiwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3ZybmNdZlldXVNPTkE+SkJAS0pANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7OQgXmIkG5OS0BlWUJPeIGTaE1DXoWxtbO1srSvrLu6uLa5v8Z+k7qromirv7i1srGtrZ+kpqedpKWclpmZmZ+prrmsq6ufpaikq66vp7Crr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLavqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWxdW2pUXVtQTkhER01CRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhXxYRkFPh1hJSll4joNjQVWjubO0srCxrbC5uLa7t7q9lKe0r6d3rbCpq62ro6ihnZ2el5eglZKWl4+Yn6iupKOkoKKmoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh1dG5lVWFjV11RT01IQElSRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yvKmYmZVoTUBTeXFPSUlMaZ2AWkVVsLqxrLOvrqyttraytLWuqaafmpudn6aonqCoqZ+hp5abl5eOnZSPkJaNl5ukqKCgoqKipaWdo6OgnqWgpKylpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CXlZaYn56em5mml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoYh4g3x2f3pjd2xuXVFpVFBOR1BNTENQUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3BqqW8Z0RTnH5QWElLYUpXjmJlZYOvtaqytK6qq6+wsrOtpZ2Rl5OPl6CfoqCco6SfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6OoqJynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJWTkI+RkZmQlpWYl5+Ym5mbpJmXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fH91dn1ua3tkaFZSZE1KSEdPU05LTkg8RUA8Mj84NTk7Pjs5ODs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaCrxr/Kn09BdZlwUG1KTGRmdnRhXWJ0krKvrrO1qqasq6KbmZSNkZWWmJicn6KinJ2knpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqKlopqZnq+orrKrpaqqoJuYmJiVk5aak5WVmpabl5eZoZ6cnJaboZuemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3l8ZXl5YGJTVWBISUpLU1RJU1FNOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpcfGi1dTSmakWWZ9b3JbUmtkXGdiYG2RtbCwuKymoZydmpSXmpmQjpGVkYyOjZOZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKehoKOxrrKxtKqyrqOZnJ2eoZibm5qYmZuUlpuWmZ2loaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1tZTVFKT09WTVNNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp+qo4x5VWpyd3VwY3d2WFdiYGRpW1pXaK2urK+nn56ioJaQk5ugm5mXkpOfnKGjm56blp+an5ebop6loZ6kn6Sora2orKmkrLS3trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7a4s7itsrSkoJ2loKyhoaKhoJqYlpWfm5uYpaGgnqOhoJ6bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCgHx4dmp3dV5tW1JgSFJVSEZVV0pDTUc9S0g4Rjw3Nzs+PTw6Ozk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCkf2+CcGBjV0tbUlpMTFFZUkhPTkiZrKqppJ+fmZKSlJiYlpaVjIiLjpWdnJ2dnpeemaafoKilsaqnrqOrrrawtLKxrra4vb+6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquusbm4vK+zsLXCvLe+s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+oqKWknp2qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cm1pd21obVxYW0NXTkpHTUdDRk08Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKOenIliV15lYFdNUUc9P0BDRD8+QlJ4qa2pqqWfnp+io52enZqcm5STlZSenZiUhZ2aoJqrpKuysLmysrGysbq9vLy5trjDvr/Cv7a7u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsS9w7y3s6qzraqztK+zrqqvo52sqLaxraOwpqCjsLGusKSlr6OhoJqhpqGkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppqboqSen5ubm5yHhoF7dHJra3VycWhWXFFGVUhESlBJP0VBNEZIOTU8Pjc7PD49PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqgn5V8X15lYFBGRDtDPkY8Pjk2Tn6qsqejo6KgnqWrpp6YnJSRmZ2ZlYyKhoiGeG2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr7HxsK3w8rJw8HHv7q0uru1u7ewtrKqurKuu7i/u7qruK2rqri7tbyurrmjpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIV+enJrY2lveGtlWVtGS0xFRFRMRENFNzo/OjU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9cmlhV05FPklZfG9hQT1cjq6soJmbm56emZeXl5KNj5eXk46NkIyCg4J3cnFtcI+mra60ucW7zcfLv8LMzc3Mx8nRzMzMx8nFxszQ0tXO08m9wL/Du8bFyMXR083U0NPTzMrCxcbGysjPwMnRzMfGyMbCvMPBvr+/tr6zrb/Aw8PHxcfEr7+5sri8xMLCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WBeXRzZWJncm9mXlpaQ05MREZQSURDQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjk7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ6VaWZcVElEQD9Lhp6kmIOgsq2jnpyfmpiXlJKUlpGQj4yHhIOIh4OAgYGAeXFyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fS19LV1tPUyMzHzM3K083O083FycrKwsfMx8nJxr/Ds7PIxcvLy8/Hyr++v73BxsXNzMnJwMPArq+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAe3J1dmdjZ3ZqZFZXUURORkBKUUI+Qjw6MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hm2FTTEpEQz9DU7DSvbKvppycnKCkoZ2alJOVlIl9eHFrZWJocm9xe4WKgHVwbnF0cIWzw77F0dDX1tbS1s7U1tfU09HT1NTTz9HE0NPW2NXW0svJztHLxs3RytLV1tnW19PX2M7Sys/RzM/QzNPQwMjIysTMzMzOz8XHyLa/ysDSzczQx8rJwMTDyM7N0NHPzcrIzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfXhzdnBjYGVyYl1SXElKR0FFSUo+O0E4PTU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoqFZSUBBREFGUXayr6aalJefnJqgoJ6bnJqViXdpY2FfX2BfXl9fXWFsdXNwcG9scnF1ksTIx9TW19fX09bQ1dTa1NTOz9XU1NHRzNHO09fW09XQz9LT0cnT0cjQ2NfY0djS19nU1czPz8rN0svO0cDGw8jGz87R0dLIzM3Ay8zG08/Mz8jFy8fHyczK1NTR1c/SzNPCucWxpai1rqebqKulnbKosLOtrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNQDw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD9APUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu32NTV2dnRztC/vMzJtr6upqqooaOrZUM4PT5EWIKqqJ+XlZeZmpyfnZicnJJ9cWVjYl9fYV9eYWBfYGBfYGVtcHBua29yd3eczMHT1dPY2NbZ0dLS18/TzsvSzdXU0crPzdPW0tHWzc/V1dHF0dTL0NTV1s7T0djX19jLyM7Eyc/MyszAysDJys7O0MvQzs7Mz8/IzNDQy87Lw8rHyc3LzNLTzdPS0dDQyr3IubCuu7m1q7awrai4rbO+u7Gaj6CUkY6NiI6QhZGNmYyRkZWOkYCFiXp2b3Fva2FkbnBhV1xaSUZGRE1YRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksXpIRkI7V46hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYV5fX15cYm1yb29zdHZ2eaS/zNXR1tTT2NbOztPLzs7FzsrS0s/Hzs3O1MzO0s3L19bQzNHUy8zQ0tPKztHV0tXVysDKwsXNwsjKw8zExsnLy8/Lzs3QztPMxsnPzcjHy8XHwcbKzM3Q0sfQz87OzNDFx8G4ub3Dw73DuLKyvrG7w8O1qpiloZiWkpWVkouUjZqRlJSPj5WCiYZ5cXJrbWdgYHFoWVhoVk1HTElQUUI7Qz47Njg6ODo6NTc9PUA7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfDuMrV1tna29jMzM/I1tXEwrWvtKifrZd4bHBxeZCbjYyXlZCTkZGVlpWQi3xlYWJiYF1eYWNhYGBfYGFhYF9dW11ncnJwcnNxbXJ5pcfTz8vQ0NPUysXJycbGv8PFz87HxcfNytLIy87NxtHS0M7M1MrHy87Px8fP0svQz8a6xL/Gyr3Cx8nOxcPHwMfNyMTMy8zPyMTE0MjGwsbIxL/Bx8zLzM/Cy8zJx8vQxMXHu8fDyMnCz8G9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+CeG90ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7uto7Z+aIOFpKuUjo2Wj4WDg4OBfYSEfnNfW15eXmBeYGNkY19dXV5fYGBfW1pcYGxycW9va2xvb3250cjJys/LzcS6wMO7u7q6vsnGwsPAw8jKycjKyMHFzMbIys3JxMLLycHBy9DFy8i/ucK7xse+wMbPy8TAw7vJx8m7ycfFysC+wsvGxcS+xr28wcPFzMXGvMDJw8XH0sXByb/KycbIxtHDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhppujoJuVfHdzdGZpWmFubVpbWFJETEZCR0VMREZTQDU0MzM1PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1drY2c/L0s3NzsjBtcO+sa+2bF96fKGRi5KWhnqAhYV/dnh1cnBfW1tdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lrcG9zj8e9ysXLwMbCsLa6srKzsrHCvLy8urjBwcHEvr25vb+5xMrFxsK9xsC4u8TJv8HJu7e7usbDv7zBzsPGvr61wb3Du73Gu8O6tLzGxMLCt7+2tr6/u8zDvba6yLu/vsvDwcbCxcnHycbQxsLMyLLHycPOzMDFw7+9srewsqeoqLmwpa2wqq2slHp2d2pkZ2Bob2NWXllKRkpGSEtBRUJGSkA5OjY1ODg1NDs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysnGzc3O0cjQxdXU1dfNys7FycXHwbnFvauupmBkdoOTi4iLhHh/hoZ/foR7dHRjXFxdXmBgYmNiYmRlYl1cW1xeXF5dWltcXmhzcW1nZ25wcnmdvczAw7rBuK2wsaeqraynuLS2tLOztLu2vbG3sLWvsrvCvMHEvL+7tbK6vsC4yLm0u7fBwr24vcfBxLy1r7K2ur+0xbe7tau4vb7AvbG6trC3urPGvLevu7+1t7XFvL7DxcDExcbHy8XAxsa7x8vAz8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25dVl5gRktISEpGQkRBRUU/PDo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjJyMrIysTQzdLPzcXHwcbAv7q3ybaqsJlbaHCKj4WIiXp4foaGdneBfHNoXV1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaWZrbm5yfKTHwLi4tbCrrKeeoqmnnqqss62qrKq0rbaxs6mup6yzu7q2w7m6urGrtbm7tMK6sMCxvry7trzIucO2raqosLLAtri9sLGnsbO0u7yrrrWmrrauu7Kxqrmwrruuu7i7wMC+usO/xsPFwLzGwcfLuMXHxb/Hw8O6xMbCu8bJzMuzucK9u7OJc3d2a2lgYmxoWFhXW0FMS01KRUFDP0ZBOjk6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcTQx83Bw8a/xMTDw8rCycq/wLzCurO1tcOuqrCSW2p/koeOj3t4fYmFenuEgXduXl1cXF1fYF9fZGNiY2RiYF9dWltaWl1aWllaXGVub2hmaGlrbnKBrbqwta6lpaenmqCkoJqcpauupKiiq6qsq7Cjpp+qrbS2sb25r7ewqK64tLO8uLS9r7i5trK8wbLArqWoo6uxsrOovaqrqKusrbWzpaiuoaSvqbKmqKiupai3rLGzt7q6u7K8vr6+xL+1wsHHyLe+wMS3xMO/u7/Ewr7EyMzKv7/DwMCph3N0c2ppXGFvY1dWWFBIWVJTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDx7m5y8HLvrvJtr3DvrrKt8HDwbS2vLaxr7W7rairkmRtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9eXVxaWFlbW1lYWlxfZmtmZGdlaGpvcoWqpaylnpyhpJSdpJqXkaGjqaOjn6Wmp6atoJ2cpKassrC2t6exraiqtKu0urG2tq62ubOwurqxt6WgpJ+msairqLmqpKanqKeyraCnpp+bpKasn5+no6Chsa2trLK0s7Swtby2u8HAsru+w8GxubnCs8G+wLW4vL2+vMLHxcPEv8DEoIN4cGxiZmBrb2BVWV9ITmdPVEdGS0Y8PUA9Ojs7ODI2NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLS2vbi6wLq9tqCelJ2hprq2q7Ozu7PEz8nLw8a4t8fAzL+4ybe7xbizxLizv8CstbyyrKWvs62ho5FpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGFeXFtcXFhZWFhYVlhbXl9kY2JlZ2dna21viJ2pn5aVmqGWm6KYlYyeoaKnnKCfpKWip56bo5ugq7CtsbWkqaqqrKyktLitt7Css7avs7WvsKqfnp+jorKlpqm4raKmpqCorauZoJ+emZ2fpZqao5ycnq+pq6iqq62tsLK4r7i5urC2vLu6q7OyubO9tLaxsba1v7a+wL7Dwru6vZeEenNrX2VeZGRYVFddSVdcS09HSkpHQTw/P0A7PzwwNTUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uce4t763ssK0sbu7rLm6saKeqaunmJ6PbX6Fhn94cm1vbWtiXmFmZl1dXl1dXVxdX2FhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3KNp5yTlJSal5qhlpaQm6KhqJ6cnaWnoqWcoKGbma+urq+yoaWjrqunorWwsrKsqa+zp7qzpragop+co6Gto6Kqtqujo6aepaajlpmdl5mbnaCal52cnZytoauno6Omrauys6q1sLKrs7m0r6qvsrKzt7Ouqa2usrixura6vcC4s7GUhXl1Zl9mXltZVlNaVUtbUUxJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+znaWjmKWxwrW2va20uMHMyMa/xbbBwMfOt8DEvbO5ubO/trG5u62ytK+fmqSqoJSaj3h/g4R/eG9xdHFoZWNoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqCbk5OPk5aWnpaYk5egnaGclqGhqaSfn6mdm5urp6+wq5yjpLiqoaCuqLaqp6etsaS4sKS3oKOcmZmqp6GarLmvoqGknKKgoJOUoZSWlpuYmJaXnJWfqZ6ppKKdo6qqsa2otKyqp62zsKWrrrOxsLCvr6eop7KusbSvvLS6uK6jlIF6dmVfYVZZWFNSU0tNXkxQTEdITEtFPUA+PUI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvre9rp2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGuvLu1u7y1ubmwr7CqnJmhqZSRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmJjZmmBlZKUi5GTk5qYnJWWnJ+cn5agoKempKann52gpqCqr6afoqO3qKGhoqizoqWopbClsa6stZ6hnZaVqaGilK2xsZ+jo56emJuTi6GUkZOYmJOXmJiXnqebp6KimqSlpaukpbCnpaOrrK2mqK6vr6uoqqqzpaarr7Sxrry2sa+voJJ6d3JlYVxbXVhOTFFIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepaast7u8wcW6sbm1xMnJwMPGxce2xcSzwb/Fq7e3vba9uru1squtqJmYn6OLiXSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpaW1lZWVtXVVhXVFRWVVJUUlVgYF9gYV9hYWNkaYCSkoiPjZORkpyUlZakmaCXnaCloq2mpaWjpKOdqqulmp+lsaqgoZ6lq56oop+urKmprq2ioqKVl6KbnJCrqbCcn6Kfn5eYk4qekY2Sk5aQmJiTnKGjnaShopWgoqWmm6OrpaKkq6SrrqWusqmmpaamtKapqK2ztbS5urCqrJ6McnBvYFtXVlVSRlBOSFpcUFJJVEtTTEVHSkQ4Ozs9PDk2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTU3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm8sb3Dya2xuMG1vMC8tLWqrKaVmZubiIFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSUk5RWV1cXV1eX19fYmRtjY+DkIWOkI2Zk5SSnJqinJuhqamrqKynqaakmaWvpZWapa+poJyZm6Ger5qcq7Sgpaafo6ShlJOblpaSqaqtmp2goaGblJCMmY6MkYySjZaVkJ2ioKSdnKOVm6CjoZeiqKOjqKugq6+krbemo6SirK2qqKuvs7eyvbWzq6+YhXRzaFtYWVNVUkVYTFFbWE1UTlBMUVJJTkpDPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzAxNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7evqKevrpupqKy3tqu8yru2v6zLxsW4wc7PyLPEure7wsixrbi/t7y9u7O1pqmglpeYlod6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXV1cXl9hZX2LgIp9io+Jko2WkZeZoqCboKuqpq+sqLGlqZqgraGVlqWop52YkI+anq6XmairmZ+dlKWhn5KRkpGTlairpZqZmZ6elo6Mi5OGiY2Dj4uSlZGgnqGkmZaflZqhop6Um6WmqKiooLGwprG9qJ+jrLSqrqewtbC5tcCxrrGrkX5yc2JWVFZOUkpHVlBSUkxMV01KTU9SR01LQUNGREQ+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NzYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqxtre8vcHDsbCxt620tLuztKKjnZ2Xl5SDgHZrZ2xucW5ya3BrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqf3l+dIeMhpCJl4mUlJibmJ6pm6Crpqasnqiaoaack4+fo5qXl4WEkpukkJWjnZaWloiim5uTi46KkJqlp5yVlZebkZKHlI6LgYyNgJCLkpKSoJqhopaUmJmVoqaZjZmkpqmmoaC0sqeyuKGcorasqa2ksrKmtby1q6yxo4l5c25dTlFRTE9ETk5OUEtGTk5KSk5OUUlNSkFITEhIQz44NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS2sKWnpKqloKmmpLOqorLDtbWys8bGtrrDyszGs6y5vbS4wK+tqbCepq66r62fmZqdlZSHe4NuX19mcnB2cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFtdYW5xdW+Dh4GHf5CDjoqUkZOdoY+anKOipJmll6KclY2ImZqMc42Dfo6XloaRmpCUjo57mY+djIKJf4qYoKOekJOYloWOg5R+fnSKjXqQh5OQkJ2bmpqSlpCdjqOjjomaoKGkpJuitK+ssKyfmKW4pqaxobCunLC8qqmvqpmDd3NjVk1ST1BNQ1NOTFBNQlBRSElOUk1ISkpES01GS0s9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKmmpaijpqWmpqazp6W0wbiwtLDJxLe5wc7GvbOsusGsrcOtqKKmkp2mtq2joI+VlpKQfXd+ZldWX2dmaWdobmNpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVZZW11qanFrfoR7c05Yco+Cl4aNnJeLlJGfmJ2VlJaVj5aKgJSJXztWb3yMlIqBjJKMkIaGc4qFl4F5gXuGk52Ug5WOkZCDhn2TeHFwhox9iYGRjZCXmpiTi5CKnYifmIeIlp6aoaCXp66praionpats6Kmrpmsq5iotKOpraOTf3NuX1tOU1JXTERUSlBNTEZOT0lFTFFNS09KSU1QRklJPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego66hpqaqoKapp6Opr6intMK5sLWwx8K3s73Pv7mvrrXCp6rFqqOdmIOUnLGimpiGlI+Lh31zdV1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNT1JUVlhaYGxuZ3qBc1BCP3+VkpF9iJWMhIqNm46WlYqSiIaVh3mJf2BKUW54i5KEfoSNi4V/f25/f5R4dXZ4hI2acFGNiIqGfH54lHZod4aIfoqJlouOkZKWjISKiJWEm42ChJKalp6dlKSjqKmlpJ6bsKqhpKSRpqmWoqqcoqaoiXZtZl5bSFFRU01JVU1SSUxLT0lIRkpOTE1US1FQT0ZJQz03Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2nKOnnZ+hr6GnqKWnqK+sqrW8tri2s8G7tqi5yLi2qKi1tqqyvaaelY1/iZOolpWKfo6Dgn13cG9YTUtNTU5MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3J1fWloXFSQiZSIdH6GgXyFjJOCkpqLj3uGj4B2gHhzb3ZxdI6OgXp+iquFeXtodnuOcHJteIGLjZJ4eoB7gHZzcpJ4Z3WEhISFfJWKiIqNioB/hIuNgJSEfICPmJSclpGfnamen6CdoKmlnp2YjaekkqCglp6fpIFzaGFdXEpXUFJHS1hST0pMTVJKSkpMUEhMUUxSVE1FSEI8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTI0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6qlrauwsaq9tLK8uLa6tLGft7qyqp2drKmosrChmpGNlICNnI6RfnaGeHx2b29pWEtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnSCe3hmdoyWmI2OfGd5gXZ4gImQfYSYkoFxh498d3tva36tfXSQi397hpKBfH91ZnZ8hmxvZ3N8iYyHgGx5cX1xbXaPcWhxgX6OcEOLhYKDhX53d3qMhn2Me3V9jpKPmIuSmpujlpmcmp2eoZyWjYulmo6dl46WmJB4b21mY1pYWFVRSlNVVE9QTlBWS05LT09KUk9JTlBMRkQ8PDc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoaawrK6rqKmxr7GrvLisu764s6ynm7CnrJuPlp2lqaSgmJmPhZJ5iI6LinVxe211cGptalhLRkdFQUBDREhMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTk9RVFhdZXBybIinqsB+dHlie3hvfHmJkHp9i4ZvbYySeXR5amqAgnGWkYuBfpaASZKYbmh4foJtaWRseYWQkoZrc2x8bnJ8hmlucH9zjYmEhnt+f3t2b3R0hoJ5gXlwfI6MipODlpeYmpCSlpeZl52WjIOJnpKLko2GkJaAb2pvbm9YVlhUUlFZT1JUVFJYVU1OSE1KTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrLCjraqota+urLS/q7zDv6WimpWkmJ6NhIuUoaGZmZGTi3OOeoCGjIZ0b3RrcGxkbGpZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXF+nh2GaaXN5ZX5vbX96i4l2goiGdGyaknRzfGpqnY9NeYWTiYSOZzF2hnNsfn2DdGZldX+EhIWAZmlsdWtxgHxocXF8bpONj3x0fn1xcG51bYJ/d3l1anmJgoiJg5aSkpCLjZGUlI6XjYB5iJeIhoqGgJCId2trb2hlWFJaV1lZW01QVVZZWE5JSEVKSkhHQ0BHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVukoiakZmWo6itnrGep7qvq7KwwrG7w8ealo+UmYuOhXqEkJiUjZCMj4Zxh4J0h4yGeXBycG9vZHBmX1RGSUM/PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+yoHF7eGx9bHGDgoWBeoSGhnlyoZV0eIBzdZSHNXGdqJ2OoaGEooV2cId8h3x0jK6NiYBoZ2JqbnJtcIJ1aW9YdXCOm5J3bH96fW1ybnCAe3N2bmJ2g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2Oe3NxcW1gW11eW1lYYF9STltaWFdMSEpGSkc/Q0FCSD9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp5+vlaW0qa6xrsGyu8HFlpCMlI+AiHxugZCSiYOKh4+GdYKEbJWIiHt0eHhsd253Y2leSlBHPj82NDQ5Ozs7PT5AQkVITExMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9ITE1OUEw3Q01SU0RKhnaAfHx2fmx2iIh8foWDf4x+daKZeX6GgYSZhJqcYYaqn52Lg5CNeneIfomJjnOLl4+Eel1kcXR6fHeKbWhqYnlvhZCCem6Bd3SEenB0eXhrbmlddoZ8h3yHh45/ipKXg42FjIZ9cYR/hH11d3t8iXdwc3RmZ2BbW15TW2deV1BUWFtVR0pKREtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIyRnJ2fppGgqqCxqK/AsrvFupaOkZSHe4Z2a3+MkYJ9ioSPjHiDgHOghIp9fIF/cIB+emd2a1JXTEBFMjExMzY2Njg4Ojw+QUVHRkdKS01PUVFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmiEiHuJeXxxfI+Men2Jh36Xh3ahmYiHj5KUpY2sqkiGrq+vi4GAk4uCi4KEkqmHgJiYipt0bXyBhod9jmhnaHl/boWHgoVxhIZHbIB3cnl2aG1rX3Z9goh/h4SLeZSdnImLiJF/enWLdnx4bW93foB0dHJsW15eW2NjWGdlW1RPUFZZUERMS0ZOSUNGQ0NAQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5GOlpeSl6CeraGmuK+zvbOXjZKLmIt9dHB+iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyNDY2ODo9Pj9CRUdISk1OUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWHBZXF5pjZOHlYCEgoWRk36FiJGBmpWCoaGYlZubpq2Tmruxp7vHw6iLjKGlj5SKgZF8cYOen5Gcf3aGhYuQh5BpaHCEgXSNh4SKcYaCd4d/e3aFfW52dWZ/lI6GiYiHiIegq6KWiY6Xf3qCiHl5b2dreH57fnRsZV5bW15qXWFmYFpPS05XUlFJUEpETkdDSkRCQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZneDe4CMf4GQjoqam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH6ShZKVf4qAkpuOg4CBjIqCiY2Df4qAbXBqXUJANC0tLy8uLjAyMjM0Nzc5Oz0/QkRISU5RUlNSU1NUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBJSUtLS05WX2N/Z2dtdZ2bj5qSk4uNjpqIk4+di6CgkqOqpaOsk6m2oqjBwq7Hr3i6lJp8jaGemYSThYKOop+TmJKEioWPmZGWbHB1ioyCloyNjnePhHFthYGKlpGDhYhxiKCVhpKJjo+WpLWpm42UooOHk4N9f2tqanyBgYJ0Yl5kYFtna11sa15XS0dOUlFNTExGSVBDRE1GQUNFRkI9OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnF2koZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXl/koiRkn2KhJiSkIKAgIuMiYWQh4WJhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOUFJUUFBRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZunpaKZoZeilJyeqJ6oq5+orKmqtperv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGam5mnkZGIlaKbm3h6fpSYkqGTl5eBlJ57d5WSq7KIjZeffJSem46SlZijoqa2sJ2RmaiHlo+NgYhsc3N9gH1yaWBdYmBiaGRgZ2ZbUkVKS1BPSUlMRkZNQ0hMRkdEQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbX1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJi4qEkoWDhomBgIZ2XmJQNDYwLTEvLC4wMC8vLi4wMDE1PkFCTVFSU1FSU1RSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpOT1FZbYWQd5WKo6eqtL24pK2srKeotKuwtrKyrbuxs72cs8OrusnLt8O/uKWisLOsraqji5aYhaamoKOXgaaZjaKrqKWIhZSkoaCroaSpj5uwi5Wjpre6m6CjsJKinaKekKOhq6+ssrWilKSqiJmJkomVenp9hX9oYWhcZWNeZGReZmdfWk9DSUhTTkZITEZKR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhjV2lvWHqFdoGThYeCm4OSkIyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5COg4WBjIWGh5KGgoSJhoiHh3BuYUBFNjQ8Mi8xMTAtLCstMS4tND9DQU1VUVJTVVVWVU5bUEdHRDw+PkZIQ0VBNzs8NUM7PUZLSUdIUk9QV4GSoISuo7OqssDHw6qzxbass7+zuL62v7TBtru6o7jFqLbJx7W+ubWoo7StsLGbmZKan4inr6ullHafpJehrLK0mZaqrqiutruyuqyvtaKxq7G1u7e0rrSgp6ijp5qpr62yube4p5u2qIykjpGSn4Z4goN2WmJlV2ZiYmRgYGZgW1RJRERMVVFISUpESUdFQUBAS0RCTUc8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWlFiY1d5dXGBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiHmGgIySjIeFgY5/gYmOhoCGiIWKh5F6eG5dVkBFTjw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFZPXlVJS0pBQD9HS0ZGRDs+QDdENz9CSkpFRldUUF6PpK2jsbTDtrjBzMm2u8S9s7PAtrjBtb6vt3Sxs6W6xKSwxrmxs7G0qKS1tqqxoKKWm6KSpbCupq2sp6SYoKy0u6Kosrq1vL/Mv8XFvb2zwre6uL63ure5rKywprGqrb2wvLvCwqyZuqiTrY+Xl6qJfYJ9a1dkYllrZWpmV1xjWVZTSUdGTFFHQ0hJQUhEPj9CQktAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldTWVVadmpwfo6EgI2DbnpzeIdiuaGZo4mUlJaSlJONkJaSh4Z7hoGNlYqAhIGKenyKh4Z9ioOBioOVfXd6dWVPXGRHRUw7UWNhW15TRj87SFBFWmNRUllYWmdZVGBgTVNQRUE/SUtIRUVBQEM8RTZCPkhHSkxTWlRdk664tbq4yL+6vcnMu7zAu7e1u7q2vbS6scZgdbKksZqeq72qpairq6SisrWgq6eflZafmJ+upaempZ+jlKOnsbSnsrO9tsG+08nJ08fCxczCysPAvr2/u7y3tK+4t7bDucW9wsiwnrmpoauOpKe2iIGBc2BjYl5YYmBpZ1JYYFZRVUlFRU5LQD5HRD1KQT1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzM0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWPc2xyc3OH1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaLfoOAg3h7i4OHfIt5gYqCl350fXprZXB1WV1cUGVkYmBlZF1bWFdcTWRtVVJtbV9uX1hnZFVZVUpEQktLSEZISEhHQUk5RD9IS1RUVlxaW5O5wLi9t8bAu7nKyrq2ubW4ubK3tbSutraZZHWonK1wXqKsnJigopuknqullJ+fkJSOlpiXp5+ln56amYOknaylqrCtuLC9udTRztbQyczSzM/Oysa/v8LKvcG8wcDExMXKvsjOs6S7sLSvmqu4u5mAe21fYV1ZXmFaY2NQW2BTUEtDQUVGRTxART5BSEFARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU0RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVxZaF9vl5KQlG5sb3V1h7OsoaCfi5mcmYyNlZGbkoWKin6Ih4uQi4h8gYRze4qDhXuJdIGJh5V/c3t5a211e2hyZWlsaWZqaWhgZmlpbFptc5atpLyIh2dbb2hdWlpUSEtOT0pLUEtTUUhMQUpHSk9fXmJmaWGXt8ewuLK7vbWxxMa1sLiwr7ursrGnq7erjbWnnZqnmk6anYyOn5aRppillYqTk4mQiZCRkZ2boZealZaHnpqnm6yvqLCntLTU1NTW0svP1NXN08/NxcLJ0L/KycrJ0cfMzcLQ0rivw7zEuaW2usOig3BlXl5eWWBXWWZaUV1XT1BCQkhFQkg7QUM+QUc/P0E4O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VWc5CQmIJocW95eYOgqp6lloyam5eLjZWRmo59iYuFjYqKipCHfISCcH+IgYZ7h3KDkYuPfXF4dWtxeH5xe254c2xogXBtY2ptcHhpd3x+y7/B36duY3huY1thYEpQUlVOWV5QXVxOUE5UUVVUXG5tdoJxlq24rLSmr7aqrLzAsKu0pqS4pquuoKu0o46xrZqXmIyRk5GEjpuBjaaRnImDi4SKiYSLg5SVl5eTnJGcmJmZn56rrKSnoqytz9LV0c3L0tPU0NTRzsjD1NHHzdLT09fM0dHF0tbFwM7Hx8KovrfPnnpwZl9jXVdgU11aUFFUUE9IPkBGQUJFPEBCPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1OW3WGhYp3bHdwfX5/oZ6eoYuMmJOTjIuTj5aEeYWQkI2LioeRh3+Ce3J+gIGHeoR1hZOQiH9vdnJrc3x8d3tzgXdxaoBzcmlwcXp5cnq+y5p+jLKEdnKEdmhha11DWlpbVmVjWGRqU1hdXWBkXmN4en6LgZipo6Shn6CopaqwuKqls6OhraGjraGnsZ+JppqTkpGJkY+IgZSJapSijJmEgIV+kYODk5ati5WNlZqOhpKRnpensKGgoaWkqMjOz8jCy9HU0dTTztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMPDzIx0cGRhYFhUWVRcUEtHSkpKQDs6O0RBRDxCQz5HQj5CQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJ2VnZSFi5WJj4qIjoePf3iDlJiKjYiIi4l+gnhze32Dh3d/eoeRloCDbndwbXV/dnh9dIV8eWyHdnRufXaEdXh8nbWMO0GKxaV+jHxpZVdJQ2ZjZWNnamRueFteZmhrbmlugIOIkYucnaCdkJeYnqOjprGjo7OfoaWdoKmgo7Gchp6SkpKQio6LhoOPhH6cm4yNgoSFepR+gqmVo4yRipeSi32XipqSq7OYmpyonKe9w8a5tsbN0tDS0MzSy8nUztDV2tfX2NTZ2M3Y287J2drR1r7LzLR5d3BmXltTVlJbVkZHSklFRT06NzpAQEI6R0Q/RENBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjXyXkZ2LfoeSg4mGhYmCh3x4hZaWiI+Dh4WGeoR5cXp7hIZ1eoWOjZ15i3B8b296f3F7gXGDh4Bujnp1d318gnV+e4aHr3NYqcK2jZGCcG5iPV5ocnBxcG54doFlaG9ydXhxeoyHjpORm5WflYeMk5ugm56qn6CsnKGamJ+mnp+rmYuajJCRjYR9iIeDhYuOoJmTiIOHfm2ZeYSYhoiTjI2UjIZ8m4iUj66qlJWYn5mnrrW9qa2+x8vJyczL0MnD0srU19jX2NfV29fT2dvV0Nva0dbI1MuVe31qaVxbUFNUXkhDRklIPkE+PTc6PT87PUc9P0FBQURBPj46ODZEQjc1NTQ3OS41NjY0MzU1NDIzMjM2NDY1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OjpEP0NHUmtfbWRiZmt2gIhxkZCagHqAjX6CgoGEf4N8fISYjoeLfoaGgHeCeW97e4eCdHqSno2gdo51gnR1gX10gIRvgY+Bb5KFdHyAhHp2hnuIt8Wkwcm4gpabj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWlJWPl5CDiY6WmZeWpZyXn5aekpKXo52Zq5WQkImNkYKMhYiIgYaQkZ6bmYmFjIGGl3qIiJ+Xj4iNiouCfaGJkIu8oZiTl5qcqaalrp+otr/AwLnHyc3Oxc3J0dbV1dnV19vU19na29fb2trYztzGh317aWtnYVRYVVVNTEROQzs9PTw4Ojw+OT1ANj0/QDw/Pjw5ODY3REE2NDU1PTgwNjY1NTQ3NzQ1NjEzODU1NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eop8foB+f3yEe36CkYmEhXqEh3p1fXRtfH2GfnN+kp2RnoORfIZ+eI59eIqKboKagHSZhn2BiIR7fZB6j6iOj8OhvYyco519iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CShYmKkJKVj52ak5SQloyLlZ+clKCUkY2Nj4p+kI6Oi4SJkpaanp+JjJSSnZGCi3+lmYiEjYOGhIClh4uLuJidkZSWoqehnZ6do6+3urWswMXK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbuHp7em1rZ1hgXFNQT0lDTEI9PD45OTo6OTk7PTY/Pj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg2ODk/PURSU1JYX1ZYZm1tbWmBj4pxc3mKe3p/fH97h3t8e4uHgX51g4V5cnpzbYB+hH53hZuhmp6UkoCMiH+Yh4Cbkm6HqIV6oIt8kY2CiISbfZqQioyjoqCQpK6gi5GLhYyBk4ZXcq2Ln6ubj4OYm4+PjlyCopGCjJ+TlIyGiIySk4yUlJSPi4+Jh5abnY+VlpCLkpOFgIuIko2Kip2WmaKjhpOdlqCKiYiNnJCDiI+Ag4iFpIaMkLOYnZKUl6GhnpmSnJ2osrmspr3Cx87Hxs/M0MzO19DR1K7W1dja2Nra19bZ2Z9xf3ZpaF9eWFRXWENASEM+Pj46NDk6Ozc6OzozOzs/PT43Ozk6MTpIPjozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieW1ifpKDb214i3h5f3qBfIZ8e3eGhH9zcIWCenV2dnSEg4V9fpKmo5+lopaKnZCUl4uKqJdyirGNhKeShJmThJmMopWfmJOJmp6jkqmvn5CVkI2OiJaMbo23hZrEyLKboaWbnJiWkLKRZKTNx5WOhoeJkJKNjZOUiYWKiYWWmZuPkJSThpSXhH+Pi5mIjZCql5ejo4iZn5aaiI6Hl5eKhI6NgX+IkKWJjZOpmpeTlpmhmZ+Zk52bo7O0pqO8wb7IxcXJyMnCytPNzdSp0tHW1tbY2tTT2s6Dc4FpZWBfX09KVVtCQUZDO0E9ODM3Ozw6OD02NDk6PDo4Mj85OjI6STo9NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdYKOfXxtfoh4en56gYGCfnZ2gIJ7bG6Lf3l8eHh8hIeLfoujs6ijq7KhlqegpaSWla6ig5C3lZKzmY2hoIukm6+ipJ2YkKeWqZmtr6SXlZWUkIuYmpagwI6jybirmqKlrZmRm5yynYaFqKKcmIWIiY6VjYuTj4eBhoeIk5iUjIuTk4aUmIaDkZCcdJGZspaXpKGInJmTj4qQi5eaiYqWjoZ9jJmfipCQnJqZk5iYn5SgnZWfm6GyrqOlt760xcfEvcPDv8bOysnSp87N09LQ1tjSz9i7c3t3XmJXYlhQSEpPRUJDRDU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTw1PEw8Pjs8QkE3NTw7NDI3Nz9ANj8/Nzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdOW1xZSmdhO0iEi3p7bYWGeXyEeICFgX1weH19fG9zjXp9gXt4houJhYSSqLutqLK9r6Wus7Ooo6KwrIqatZ6iuKWVrKSXqa23pqSjn5mpmKqkr7CpmpmclJWRmKCXmbu7rcmgaba4q7CVmJ+iq5KXvaNeqrKCiYqNlYeRfI+OfYOGjY+UlIiHkpaLj5WNi42XmZKdmrOWlauei5uUko2QkoyYm4qSnpCMiZWfoo2VjpianZObmJ6UoaCUnJylr6iipbO4q8LIxLW7vbvFyMjC0aHGyc3NxNbW0MvTonF8al5cVWBSUEZEPj1DQUI4Pzg3ND5GPDw2PDM1MzU1NDUzQjM6OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj49NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGVIYmBjcEpAi4p+gHKGh3yBiXWCioJ+bX19fH9wd4d3jYGHe42PjIaMmqvCwLC+xruytMG8tK2rs7aMqLKurr2qm7ukqK25t6umpqKho6Opr7Kxqp2cpJibmJeeoqWlkqO5rqjAu6ytsrmlpKd9iIacrb2wg4uMi5CDj4ORj3qBh5CNjpyIiI+XjYuVl5SQmpacp5qxmpGrnY6Zj5KOlZCQlpePkaCRiJWbpKyUlo+UnJ6UoJ6bmKChlJqeqKekoaOwsqbBxsOwsLu2xcTDvs2nx8PHw7zV0M3Eyol1dGReXGFcT0tCTEBFRj5BP0I7OjQ+QT09NT02PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxnR2BpZ1pdW5OMjIh7h4uGg4x1hpCKgW5+fIJ/cX6BepV6kpSUmJGTlae0xsnAwszBw7nIvLqvq7m7l7K2urPArqXApKqwu7uqrquiop6nq661sKqboKqcopyVnrC0p4uiurq1wburqJyypKSolISOqcPEpIKLjoeIhIaVlI16g4yRj5GhjIyUkY+JmKCXkpmUl6agrp2MqpyOlY+SkZWVjpCVkY+hlIaXn6CznpSblKChmaSfmqCcoJSYnqakpqekr62lv8TCrqm3tcnDvrbOssW+w7yz0crIwbV2em5eWl1sVE5JQ0xKSklAQT1DRDw1QUQ7OjM9OEIzMzIyNjJBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJnXE1lXGZUY2qZjZaJi4iSj4aJeYaTkIFygHyNfneHgYKQeo2hlqiampi6vsjIysLSycrCzbzBs627vqe6v768w7eswamss7u9qrCppKWjq660rra1oJ+un6aimKO0vambqLzAo7a2r6uSr6yqq5aGmqmmpZGCjJOllYmAdYqSeYWNkZCen5OOlIuPjZSjmZeblJSjnqmfkaWajI+Pj5WWiH2PlZKSo5qVoKKctaaRn5elpKOlnp6mmJ6Vl5ulo6moorKsqLvAxK+ls7fMwLmuw7O7vsG4rcLCwcCZcHtjWlhdXE1MTUlHRENIQkJBQ0s6NERIOjs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+a0lfWGFaZGVWno+djpeOnpKJin+Jn5KEeIV/lX5/kIiKkICVoJmup6OYwr3IxMjG083Ozcu8wrewury0vMq8w8G2truts7+5vK2vqKCpp7atrqmyt5qeraKooZ2rt7ippa++xLG9ubOnqbOzra6WlaWsp6CRjpKxxaeVjXyRlX2HkZmPqpmYk5OPk5WTpZ6TnZmToaOinJifmYuMj4+eiFqQl5eSlqWaZpijn7OllqOWrK2rp5ufp5iZlpmVoaSopp62q6m6vMO1pbS2y8G4qrass7q4rqi4ur24g25wXFpWV09HS1NNSz9BSEVER0ZHODVGTTs+Nz5BSi4zMjAyNUI1NVBXTjtMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVzs9QEJGQnJGaUlSZWJMRqaUnJahl6mWjJCDh6WSiIGHgpyEg5WQkZSOmqKfr76uoce9xcTHx87OztLKvru2sbq7vL7OtsS9t7i3srK1s7iyq6acq6u4qqmnr7CXo66kp6SltMCwqqyzvsK5wLmzp7izt7OulaWtrq6ki5OVoY1zwZl9lpmEjpaai7GVmpmVkpOZmqajlaCblpqonJuhoJmLjI+WnWBKlpyalJqll1SWsJ+vnJ+llK+vraWaoaaUk5mZjp2gp6KZtKmqs728u6uwssfAuKarq62xsaOhsrK0pHJwZ15cUFJNRVBQUFE7SEtJRkhBQz45S1Q/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVg7OkJDQD1SRVdSc2JXRkirl5mfoamvmJCXh4unlo6IkoWfiIScl4+eoJujpbXJtKnGu8PEyMrIx8zOx766s6+5uMDBzbXIusC5tbqxr6+ytKejm6q0tKqppq6smaSupaWprbq/qKu2tr7Bv764s7LCr7e9q6OutKy4pYibl6abdr6ghJicjpOZmouvlqGcm5eVm6ChqZ6ooJmaqpmhp56XkI2RnYNudpOimpWdop+QrrKjq5WpqpirrqWkn6WpkpKZm4iUnKKelrCnqau6t76zsq6+ubafo6eopaecnKypqY1laGNgU0xNR0hOSlZMPU1ETUlKQUNEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5TYU1WSH9lXkhGrJScoZ+7r5iUnouTqpuRkpOJq42Hop6MpKyUo6O2x720wbrCw8jJxcLOyMG9ubKvubTAwsq2xrHAvLW6q6itrK+jopiqtLqmqaasqp2or6ekq6u+u6isvLO3vca8trW4wLC9v7OptLarvqSPopeRop+8n4mZoJmWnp2Pt5+pnKWjm5yimqils6GbnaWcqKqemZWPlJqLl4mNpKKUnKKfoLWvpaWTsauarKyfnqSjqZKVlaCDkJ6fnJWppaKhtLW6ta2otbKznpyippqXlZmqoZ53Yl5gXktJR0hNUUlNRUZGQlJKSEFER0FWU0RIPEFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREOccGJHRaiXpJ6ew62bl6WXmamclpqaj6qWlaimla2smaGqtsTBvL+4wcPByMS+zca7vrmysLizv8PItb+vvLe5t6ekqqusoKCaqqrEoqWorKaerK+soqqovrimrL2wt7bHtrS5uL6wvsG2tLK0r76jlqOWk5uUrZ+QoaKlo6OfkL6lqZ2prJ2doZumn72imKSeoqmroZ2WjZWek5+Hj4WNk56koJ21rKWclrKnmbCon5qqnqCNmZWfhY6hmpuSpaSamKyxtrGqpamtrJyZoKGSjpCVqZ+UaWRaYV1QSklLT01IRUNJQD1PSEA7R0lIW1JPSz1ITlU0QkY5PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGZjWE2imqObnsWsoZ+snZ2tn5KjnpakoKeqrJe2sKOqs7bFwr3AtsDCvMnCvsrItri1tLCztLfBxra+sLi0uragp62qq52en6WkwaWgqq6gpKmtr6Kmp721pbG7t7a1w7Kzt7q+scPAuLits7S1opyklZGToK2gmKGdqairoprDramerK6bm56ZpqC9oZ2kmKurq6ahmY2an5KeiY5Xf5WepqGguKqnk5i2o5+zoqCbr5efj5mUnYKPoJeWjaKklZCmrrOrqaKipaWVlZ2Zi4+Rk6SfiWNlW2RgTElLS09GRUFGSz49SkE5OUpKTl1RUUo9TFdcOUZJPURNSThIY1xMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dzSEU2PXVlXExPnp+hmJ7Ep6Wis6GcsqeTqqSfo5+tqaydu7CorLWyyMPBw7PCxL7HxL3Eyr2wsLausLWvv8W1ubCwuratmqmwqamanqahp8Ktm6yxnKqirrCppKe9t6a2ur2vt8Sts7PCv7HGs7q3q7S2raqipZWVlKOroZ+fmairsK6uu7KmoKmpmZmXk6KkuKGhpJKur6ykpp+SoZ6Vno+RjZSdmqOfp7Snp4yYtJyjsJqem66Rn5SXlJqAkqKWj46goZOLpqywpaeinKCekpKblIWLko2cnoBjZltoZktJTUtTQkNASUc7O0Y/OTlOTVVeUlNKPk9eXj1IUEJNTEk5TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVV5mckA4PEiWd2VBNJ+kn5ufwqijqrGho7SplrKrpqKksqyuqbuyrbC0tMa/xMS1wMW+ysS1wMjCtau1qLC4rMDEtLeurLa6pZmrsaupmJ+ml627tZuosJutn660sqequrOnurK3srjAqreywry0xae+rq23tamnrKGXlpGlpKKil5ikr7itsrW2oJ+opJmUlZOjn7ejpKWVrrGypamlop6ampqVmKifn5iinq6yoqaNl66ZpayXmp6lkZuOlJiahZaflIyQnJ6Ui6mpq6KnoZmeloyPmZCBhpaJlJ95ZGldbGpOUE5OVD1CQU5DOzpJQDc3UU9dXlJWUUFXYFxCSlNIV0tIOlVkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM5MDZwW2JIMDVKcGlWQ1dGjHlmQzuko5yhpb+mqK+voam1qp25r6ukqrS3sbC5trC3uLjFvcPHvbzEwsfBucHGwbqqtqWtu63Bw7e3qq2yvKOVrbCtsZalqJGquaqgp7Cdqp+vtLOqqba2rLursrK5t6y5sMG5vb6mw6uwt66oqqumnZiYqqGhoJGXoLCus6uwuZqbqZ+ZlpKXpqC2qaWioq+xs6uxp6ufm6Cgm56lnKGXnaOzsJufkJSmmqGpm5Win5aYipWYk5aXnZOJkJuZlI6pqaegpJuYm5OHjpmLfo2Who6ba2ltYW1uWFFRWlRBQ0VVQDs6SUE3OlhQZF5QV1dEWV5eTUxST19LSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNzQ3Z1lgRihAOGx9aFxWOol7Y0M9qJ+coam9oaqwqqOxuKmltbKroa21va+zuLy6vbe2wcO/ycS5xcPBwLjFvcG4r7anq7eyvL++tamusrifl6ytqK2Xp6mOp7ufpa2znquisbCzrKq2s7W8ra+xtaywtbHAucS2q7yvsbisrKmisaWepKifpJeQmJ+yqrOpqrOZnaebmZSNoKWktK6noqysrrGnsqyyqaObn6eknZWhmJuotamXmZGSn5mfoZ6QrJ+YmIaVmIudmp2Tio2Wl5qXp6ajoJ2WlZaUgY+VhXuPkoSMlmZsc2hwcl9HWWZWRENOWERaOUhCNj5dUmhcTlldR1teXU5NUlhkSkpDXGNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfXmFWMTUxPWBWXjgpQzNZVVxnSzWMemZMQKSaoKSst6OsqaWurraqrrS5pqewuMW3sbe+wcK1tLvFvszFucPBur+6xLjBubO1rKq6t7u6vrWqrbG2mJioq6qrm6yrj6u9nquusaOqn7Gts66utrK5tqmtrrGntbCzurzJsqq1tLG0r66mobOfmqisoKWVlZqZsaKtoKWvlqGkmZmSjaKlprKpoaaxq6q1pK6wta+jmJ2tp5qXnpmZrLiimJOQj5icoZmXlKyfnZSBk5mNnpyalpCKlJKemqWjoqCZlpKSlnuLkIV7jIqDi5JrbnludXxhRmBqWklIWls9e0pHRTZBYlRpWk1cYUpbXVpSUlNiYUxLRWBhYFBMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuKkEvSkdQW0czY1lUS0SZl5+vqLGprKWjrq61qba0t6OstLfJurS7ur++tbS3w8HNx7zEvbe+v8C3v72yva6nurq3t8K3rK2xuZWXpq6rp6OyqpSvuqStsrGnp6Kxs7GysbWxuLKorquyp7ivtbPDxbaptLWrsK2pp6K2n56msaCklJuZlLGdp5ufqY2pop2blZelpaS3p6Kws6unsaetsLWspJmhrKibnJ2blKq4nJWOjouZnaKYkJenop+Wg5KWkJ2cmJeWiJePl5qnnaSgkpaRkJZ2hJCHe4WChIyMbnF4dnx/XUtlbFxKT2RcP2J7R0k4R2dXZVtMXmJNWFlXVFhUaV1QT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSWcyNydGYUxWJS1CLj1FTFE8M3JrS0RDkZikraStraumo7Cys6q2sLafq7W5ybmuwbvDt7OytcLDz8TAwb20vcC/ur+9s8Soqrmxtre/va+rs7OdoKewraWmsKWesrWsq7KwrKmotLmstLO1rLSsqauorKm5rbGwx764pLmvqa2tpqitsKWjo66jqZydm5qvmaKjoqOQrJ+joJ+hqaWluKSrtLSkqquorK62r6Kdo6iqm6CZmpKktJqPiY2HkaOglo6UnqCVk4WOlJOdm5mWlIeYkpWZp5ygn42SkY6Rd36OhXx8fYeKiXF0c359flxSZG5eTlpnXUZElltHOk5tWGFbTWBiTlZXVldUWWdeUVJMZFpbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0NlOzYqSGRISis6ST8zQ0lTLD6Paz5ISY+aqaqhqLCkqKOztLG0tbGxoaytvcu6rsG7xrG0rbTCw9HExr7Asr7Cwry/uLzFqK23rLO4vMGwq7KtoaSnramopLCjq7Gqr6uxrq6tq7O7p7exsqmyqaqmpaOtuqypscK5tKy5qKioramnsaWppKKuqqiinpuirJWknZeemKudoaeooaylo62st7GxoKmin6qtsKydnqanqZmjmJiPoKeYhoOOioufoZCMjZedkJCGiJGVoJ2VmJWGlpOTl6WcnZyLkZCNin9/h4V8d3+HhYd1c3KJdmxfWWBuY1FzclxLPIR8Rj9XdVhgWU9kXE5VVlVXUFxhX1NPTmhYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkswLklnREY4PEIwNUVLWDFAlFxATUaVlqynoaqynKmosLWsuLSuqqSrq73Ju7G+t8OvsK2zxMTOzsO/v7TAw8S6wLTJxKyvt66yusC/s66uq6WoqrCppqiypbStqrCurbGvs6yzuqS4tKysrqeroKKesLerqq26tqS1taSpp6ysqqyhqKamsbKkpqWhoauWqaCTmqCmnqOiqqSsop6msbesrKKlopqpqq2pnKGlpKOYoJqVj5idlIGCkIiFnaCNio6Nmo+Ri4SNmKSckpGbjJORkZSjmpuai46Li3yHgYKCe3WAhIF+dXeLo4d5a15gbmdXZodkTkBnkkxEYnpXYlhSZVVNVlVVVE9cXWFVS05pV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIZBSUhElpGvpKKqsJeqqK21q7awq6Srqqm8wcC4ubO8taayr8TJy9G/wbu5wMDCucG6wsSusbWytLzBvrOyrq2rrKi2qqWtsKq5r6iwsK6xq7WqtrWmtLarrKSpqpyjnbOzqKiktLSgtq6hqairqKunoKqrqLm2qaqpqaGpn62bkaihnaCjoqaiqZ2cprSup6WpoqOXpaanqpyio6OfmZifkY6PmY5+h42HhZ6eiISKi4+OkY2EhpWimo6NmpGSkY6Tn5eYlo2Kg390h4F/f3h1g397eH6AiJ2PcHJnZ3F4XGF0iGlPXZhWSG15VWRWUmNPTFVUVVFPWFpiVkhQalRXU0dQWVVJPklIT1FQeE1OVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyP2Y9Tlg/Qyw/TFRfL0lrN1JFO5WNr5+lqq2Zq6StrrO0rqqlr6mpu767wbGvuK2ita/Jx8jRwL+9urzDvbrDwcC/r7Kzsra9vMGysrOrs6mltamkrbOzua+irbWxr7G5qriuqq62q6qeqqugo6G2rqihnq+yobSqnqinqqOqoaGsrai9r6yurKGnp5+rmI+vopiioKinn6ebmamwqKKfrKGgkqGio6aYmqilmJiYnY+Kh5WIfY2GhIWkl4aCgoyHj46RhYWVoJeJkp2Rk5CNkZ2Vl4+KhYZ4c4F/fXV4eoB7dHR7aoKHo3VpXmVsgXVniIt8UldwXkt4c1RkU1FfTU1TWmdOTFZZZVhHU2pSUj5CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWk6MzhfPWFkP0YxQ1BbWytITztYQjSPjrCfpKWqo6WjrKa0s7CppLCnqri+wbywqLmqp66wycfI0MK9wL65vr68ybzCubGwtbK6vLnAs7S7rbmso7Wnp6yytrmypqe6ta20vK+8pa2ttautnKmvpJ+lrKqnnJ2qsqSzqJqqp6qkqZ6iqKipvau0r62eqaOgrpuasqKVpJukpZ+kmpmoqqWemqmhm5GaoKSdmJapqZGZmZOQioKPhX2PgoCIno+HgH6Mh5GPkIWAlJuUhpOijJSRi5GbkpWHiX6Acnp5fnxod3x6dXBxfmmGeYSIZGBoZHKFe21neV1eVkNYe21UYVBSWEtLTXB0XUhaW2dZRVZnT0M+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpOwmZ+fqaWjoaqktrKxpKmxpq25wb21sKO5raiosMPJyczBt73Atbe/usi2w7W0s7Wyvbm6vbatuba/raKzp6qrr7W3tKqduruosb+yuaCvtLaprJ6tsaOcpaipop2cpLCmr6Cfq6mnoamco6igrbunrrGuoaqio62enqyll5+boKKcn5uZoqqimpmjo5WWk5+hlpuWpqyLnpGQkYyCi4B/j4F7mpSNiX1+jIeQj4yKhZKYkYeUpIqSkoeQmpCTgYh8eWx9dnl4Ynt6cnBwc3hqgnRqgmdjaGFuc45tYmpwYG9CXXlrVl5OUFFKSUxTWVZNXF5tV0RYYU9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUV09I5KXq5ifl6ejoZ+no7evraKvr6mruMK6s62fua+rqLS6x8rHv7fCvq+0vrfEtsOysLqys8C1u764qbm4vauktaeoqrCtubCpmbm8o66/tLShrre1p6ansLOgn6Wmp6ClmZ6sqKmeoKqup6Cml6Kon7C4n6SxrqCsoaykm6amqJqam56jlZ2cmp2pppaanqiRl5KYnZOZlaGqkJqJjZCHfYh/go58fKGMjYl5g42Fio2NhYiTmo6JlZ+JkZWCjJeNkH2Ee3NwfHFzdGB5eGpvcHFwan9zY3psaGZkYWWHgGBbcmpxTU6AaVhaTVBMSkdQUlFITVtfb1REWFpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MFxbNSiWm6WYnJWsn5+hpKG3qrCjtLSpqbnFtrKuoLesra2wtsXHwLe/wrmwtby3v7u/r6y+sLO/sb3Duam7urinqLaop6uwrLOwppm8tqSrurWun7G4r6mlp6+ym6GkoKOkoZabr6ahn6Oor6GgopOjpKK2sKGmsaufrKKul5uqpKiel5qdpJOam5qdpamZm5uklJSXlJyOk5eiqaGQiYqPhXqEfoSKeo+Xio2HeoKIhImMjoWOk5iMjpaZio+Wf4aXi496gHpwcXZucHRfeHdlbWxsa2mEbmZyaWtmaV1jdIFgW2t2aVpKf15bWE9PS0hIUlVGMjldXm1QRFhWWWVNSElFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFVdaEQuPDJjViwylaKhl5SbqZykoaKht6muoLq4pay9xbOwrqO1r62tr7TDw7yzv7q3sLO5uLq4uq+uwLO0ubC/wbisvbq1paKzqqepsqutsaGawLWkp7W1qJ6yvKmopamvrJmjp5ykpZSXobKlmZ+kqKmcoqCTpJ+juKikp66mnaWhqJKfqKGhoJianKCSmpuWn6Gqm5qYoJSQk5aZjZSSo6ikkImJj4Z5hHuEhn2djomKh3qBhIeJiZGFlZOTjJCVlI2OlHuCl46Ld357bHRxbGxzYXd0aGhqZ2dvhWdoaGNmaWpgamNpZ1tle2NgU3RUXFtTTEpHSU9TQCEqaF5qTENWVV5gS0lHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z08nMp6io5GOo6abnp6do7Wsp6q6t6esxMG2sKyjta6nrq+3wL+8ssG2sK6ytra4tratqr2zrrKxvb+4rry7saWftqulpbSpqq6encGrqKWvsqmstbueqamrsaWYnqmdp6SRmKatopiepKmhm6Gclp+dp7alr6quoaGdnaGUoKafoaCZm5mckZmdlKWdq6GXlpyUkoyVl4uPmJqpoJGIiYuIeYV3goKCnYiLgol9f4WIhoaRhJaVkI6QkZGRjJJ7g5WNhnN9fWZ4b2tqa2d1c2tjZ2RkdoBiZWZmZWpqZGtyWl9ZXW1kYU5pWFtgVkpHSUtNUlg+OV9saUhCVFNcW0lIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEIqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQmhIJTWao5+Qi6yhmJiflqSzsaKxvbahsca8urGxpLesqq6puby7u67Asq6urrausrizqKu5sa+us7a6trC4va2mnrWroKCwpKqunKLAoLGkrrCut661nq2vra2imp2nqaWelZqnpZ+ZpKKonZqfm5ScnayvpbqorqKhmpqdmZ6jmqSdl56Ym5SZoJKolamnmpOampGLlJmNlJSZqaeOjYqJj3yCc4GBipiFh3yJiYWFioyKkoSUnJORj5CQlo6Qf4CMjYJwgH5meW1oa2lncXJrXGhjY3OBYWZoam5sZ2pqaG5dbGx0cGFVY2lkZVpJRkxNT1hRUVZhZYFVQFZTWVRGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyc0kaGajY+wnZqToZmosq+fuL+2oLTCu725saa2sKiupbe4t7etu6+sqqu2qrO4raWztbKuqbC3trGztbqnqZ+1qJ2eqKKprZqnvpito66vtLWtrJ+xrbCpopyco6uom5ScpqOdmqmipJaan5yQm6Orqqm7n6ekoJiZmZ2hj2uhlpmccIKVmqN/dZGpp56UlJ6QiJeZgJaKoZB4hpSMg25qfnaDcWyGi4Z9hIyHcF5jYWeEmIZsi4+UknR3i4R+g49/Z4aAZ3VoZVdcaHNuTlBqY2dyhGdfZGZubWpeX2GKj4OEZU5LRDlGVGdeSkdQUFRVS0hSYG90ZUZaUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzU2OCwjMScyMTQ6MTc1WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoujmYaUsJuck6Cbqq2qo73Fr6m4wri9vK2ntrClq6S3s7KzsbmtqaastKavtaKouLa2qKest7OutK2zoqmfs6qeoaScpqaYq7qVpqWvsratrqSprquspaGfnaCnp5uXoKWlm5unp52Tn5+YkJ6nqqO1r6Ojo5yWl5eXo4ihjpKah6GHk5ygf6R/paqekpGakYiEcniNjoWIoXaIjGmXiGZ9cnihb4iHhH6OfX+hoKCZgHyHnnSHjnabimyHgYNsaGVjemtxYVOFbWNsaZhxWWpxb4dYXmlba2tbiHFuenKFZ4aEWl5HTj9HX01GUlZWUVFSV1RnXk1XSVJTT0VHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3MCiLppaDnKudmZidn6qqp6q/w6+xur23wL+qpbewqa2ms7Sur7O3q6mlsa2ltLOcrbW2tKanqLOxrbKorp6roLKooKOimqChmq2zlKOlpbW8p6ynq6qsqKWhoJigpqOZmaWjpJibo6mWlKOclJOkpaaht6OjoKSYlJOXk5uIro+YlImpi5ehm4WxgKOsnZOZnZR5gtSogIeVwZvHeXixpbeXZIDAnL95hIR5kIR8kJCRynGXvJzFenK1pruQe4BslrGrsHhoa1ixrm5labySvG5oem5yj9h+U2pitrJ/gXKVdJqhqpBXT1diUFZORlRbWFFQUoxcV1xQQFxEUU5ER0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjaaSgKeqn5ecnaWtsqixwr2ytcC1t77Cq6azraypp66zqa+2tKenprSlp7iunLOytqqlpKeyrq6xpqqep6Sxo6Kfnpeanpyuq5Sdop+zuqOqqaKtrqWhnZqaoaefl5unoJ+YnaankZynmpOdoaaioLCin5+jlpWSmJKZha9qaoqNqn5ng5WGrWRwnZ2UmaWUca6hpH54u31roY92sV9qtFulgGackWBmgnpmf2p4a6lkvnJnpox1sWp8sXh0kpNjbW2nbluEoEVoZoeWRXWcYH5nfKSngllfi6tpgJZ4eWqnN0qvXFhTbGRbS05XX1xXVjtOiU9YVy9JVFRJQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMwG5CilYKsp6Weo6SqsrestL2+sLbEsre6wqapsKuuqKmwrqOwuq+jpK6yo6m4qJ6zsrCjpaCqra+sr6ann6OisJuim5eVlpqarKWWm6Ges7Oiq5yira2gnZmXoKGonJmdo5+cmaClpI+dopqXoJ+qnqamoJufoZWVkZaRmoW1m7V4hamZtZl2hrObt36TlpaolH5rgaZ7goaIkpSSd6tna7Fbq3uPh5R0iXGPhoB/iJCXeIKCi5iMg6CPhLB2d59xa2tsfItOpFhIY2OZfmNopmB5cnVTkodeUKltY3F+h4BinC5RoW9bU2toYExLW2RYXFpCPrF5WFhBI01oRUJFQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o4YVU1MBuVn5WHs6amoa6pp7Ksqbu2wrC7wq24t8CqrK2trqatsamhr7yqoae0raOrtaSms7Ono6Kdp6qyqLCnpZ6fn6+Wn5iUlZWXnayhmZmkqLSvoqmPqaiqm52VmKClp5qfnKKfm6CjpKOVm5+XmZ2iqZulmZycoqCXk5GTkpyD1ZOZuXCwwn7FhnzWlJu7fJqVpI+NnI2ke46HpIKlgnqseY+dVq96iH6farlauXaHhH2mgpN8mHqqeY2dkHuxbo6EdJC8hW+UUK+nxYpRoHpjYKljdHKIbZeIYFO1tMiGgIl8Y6QzQp12XVBqaWRQQFhnWmRhSkhObU1bUk9ZZlpDRD9FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFRNzElm6KTmLGoqKWzqqW0qaS8t8GwucCxtbS7s7WnsbCjsLKmn662qJqnua6jr7Ggs7SwoKSen6epsKm0qKSbnZ6rl5iXlpeVlaCqnJmWp62wqaOej6yiqJadl5yhpaGYoqGhoZqhoqebnqGelJmbpqCcp5Wbm5+hmY+RlJGciLJuaLVxq4dujqZytHNytnual6SLj52No3+RoaV+sHaDkdLRdlyue4V/pG+bqqZrh4V9rX2XmY97sXOSnY95s2WWdISeb55mlFLIi1rCXJ95Yl+tYHZzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPa2BsaFBVR0k4PVZRWldYSUM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTTYyMKGdkqWvraSqvK2mtaWntru8srq/t7W0urqzpbS0obGxop+ssKSXprqupLGwnLS4qp+mnaGppLKorKmkmZuaqJ6VlJiZkpKip5+WkqWqsKailpOtn6WSlKCbpKaflJqlpqGaop+tmqCenZCVm6GenKWVnZaZop+VmJWRmoWse3eodqOOiIapb62KgqeDmJihiZKaiqJ/k5mJroV/grNccrNSrn2DgqR/cdd9eIV+j56GmZl3r4aKkZyIeLNhmmWagYKUbJJasFhLmnWYeWZgrV93d4domIhrXa93lZ6PeGw1eciusl9CU29eZ2BFUG1fcG1WVU0uZWNoUlhRO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEk6OTmfnZSfuLCXtMGtqLOoqbK6t7O4v7m3srW8taS3s5+0rJ+fqKyflKe1q6ixsauttKSbqaCgqKG2p6apopmdlaWhk5KbmJKUoqWakpCmrK+moJWZqZ+ijpGimailoJWapaidnKSerJ2hnaCNlJ6anaGYmZyWl6Ggk5iQpp6GqX19pXihj46DqnCti4GnhpafoYmXl4ijgpGIlKp8gIudeW+xWqiCgoigeXTYf3aIdKiCjpuNkqN8lpCfhHuyXpxkoH6DlWySXKtbWpN/kX9oZ6pkcnuBa5iHc12sWomgjmtvZU9KQ6FcW0x0XWJmTVthX3JzX0pWNkqbk1hIRT1HRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMj84oZ2Zmb+rl7TCrqytqaa0sLextb+5ubKwt7upurSfsKSepaennpOqsKmvqrWsqq+hmKGgpqWkuqKjq6CWm5GioJSTnpqUl56fj42LqK+vpp2Wm6imn4ySpJeoq6eUl6mnnp6go62koZ6hjZWhmJ+gkp2XnJWdoZWWjqubj65tcrRyqYx2iqZztHhzs4CRpKOSnI2JpIeQd7hvjHuLomtrtlqghWWXl2mhoqdtk3K0dJOYf7JqhZKIrWt1s2GdZqJvh5Jql1ytX02hfIeRUnOjbXp/fm+Yh3Fcr1Y8nHdlVG9uLlynT2NSa2VibVpjXWBwe2NTWlE+Pm1vM0NCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKWam527oZyywK6uq6unt6m4r7XAtbywr7m4q8G2qamgm6ajop2RqqqotqOyp6+qoJecp6Ckq7ido62blpmPpaKVjJ2hm5icn5GTlKu1sKeZlJysqpeMk6WZpa2ikZaqsaSfnqarsJiho5CZopafm5acl6GSnKmclJCqmYfUkpq7c7DDgMOGftWWm7h4iJCYjJiKjKeIeqO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2VgaypcXt/dbyIp6BpnWGmjq+hfox0h6p9vm5zvHSyg3V4gYpumohxbo2kdL1ed31bYXm8a1pWW2p6XmphZWdibXhvWVtZQ0FAckBDRys1RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnm56hvKKXscOwraqqrLGnuK+2xLG6sa66r67Asaukop6jopybkKmkqrKktaatpZ+WmaqZpqy4nKKumJSgkKWfkoyco56XnZuRlZKvubKslZejp6eTkJaknKSsnpGgqKufm5+oo7Oeo6WOp6GUopqcmJWjmI+woJKUqZ6FkJm1gJCRjLeVeIKTmrV3bWtuc295j4SOiXSewbu9mnuBsqhwgHSRuYN8hoaMho17ioeNl3yku7m9nHV6tKN0dpd1dLB1mZ5mhmmNtXRycHe2jF6Aen2KaIN5bXlji6xwdYV/WlunakVlWlRmYGNdY1FnZ3BsdUJNUExEOlpNP0ozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVzgqT15dPSs6VlYnPjs8p56gob+llrTCtKyqqKyrqbuusMWutLKut6e0uK2poqGlnqCdmZOrpK2qprWop5+blqCjnaukvaagqpeUnJChmpGPoqihk52Yk5eUsrW3rZido6OiipKSppulqpuWqaSlnJqhqKamo6mhka2elqOel5eXnZ6PsKiUm6ehjmp+aZymeIdyfZqOdHpkh3u9vsC6b5KCcZWHYXNqWl6bimFjiI6Va2CAlWRtnXdilWuAmpWUZV5hY3GaimlyjH2FlWdqfnJ0eH19Ylt3dIFoUFxuhH18i2tYbHqCc0pKb4ZwTXVNRVddZ2FMWldnY19PW211anFST0RFTjtISD1MPzItMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBfTCgzPVtPJz8yPqigqKHCo5q0ubajrKWup6i1sqvIq7Czq7SjvrGypqCiqJ2jm5mZrKavpKS1qaWbl5WhmqatqL2nqKaVk5uVn5mSl6SpqJCdkY+YnLCyv6ybp52moYiTkamaqKOam6yfo5mao6esop+ropqxm5WnoJeVnZ+dl7Gkl6GomZyRnZyipJimopqcmpqZj5WBZ219cXeSl5SRhYu1qo2GmJWOioyYl4eUlYqEkpSRiY6SlJiUmJeaoKKanJShno2CeqSGbGp8kHyAdImKgXGCeHl2douAfIprc4F0g3Vldn13a3B7bWBjXXBoTVhaZmpgV1pveW1tZlNPRlM5T1lNUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCzobOhv6GksbK3oKmlsqelsLWqyKussKW1psCntKCdpKSco5WVoKqnrKOjtqufmZaVn5atqaXAnquklZKcl52XkpOin56ip5ORmainssSvmqucqp6QlpaonaqbnKCsmKGbnKKkr6ahpaifrpiXp52ZmqCenpyvoJyhppWYkpiToKGVo56XoI6Wk4qKjY6WrY98lZuCkoKLqqiGgZmXioSPn4h7hJCHhpqSiIaKlY+bl42RmJ6klpqTkZ6Nf45mobOvhYqEdnqQinx2eXpvZnqRgYCJa3WBeYhzaXN/enWDh4JrdGR5ZmBpZWNkZmtZbHtwaWpcU0xQRF9URUA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0XEc1PCxAtKC5r7+sq66ysaCqprGtoqyzsMSwqqujs668o7Sbn6aioZyZl6elqaakpbK0npWUnZmZsKatvqCropCRnZqZlJGUopyXqJyEnqqrorPIs5+qpKqWlpeap52omp+kq5Oenp2gqa+ppaOroq6bn6ChmKSenJ+dr6OYnqiTmJeckaSZmKidmpdlgpJ8ZX6NmY9jeY1saGt7kqSqamWamH5nhoplZWloe46hj2tojZeRo3draouZo56Zc2xue4SNh3pYZV6Ggl5si4mAdlxoc3d3koCHgm54gniAc215hHR3iYiOg3tphllea3RkXXOJaWt9cWtjXlJOV0pkWEFKND1GNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMVlDOz8uPaWfury5r6yzsKqlqK2tsKetrbC8samnpK2vsJ+tl6CjnaKZmaarnK2jpaipsq2elaOQoq+mtrmlrqOOjpqhmZOSmqCZmaWVe6WtoqizxLikoqevnp2UnqKeo5yjqamSnqGdoKqwqqukqqCqm6efqKCslqGbpbCkl5uqlaGem5Kll56qmJ5+vYOHcrRyhJ2FrWh4ucS4cZOio3qmmZlzqoJ8y8DAu3GMooiCn32WmImdwL2Cl52djZ3CwXyCfJKNmsPAfWulsm+MgW/Ken+bd5KDjoF2eoGAeXF6f4dxeIWNk3ltd5RjZl95ZGBlgmNedGhsZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JRLyNGWzNQWS9VQUI7LziWo7nDtLCwwKmolKOvqbCuraaztK+ppaamsaufq5iaop+cmqqnop2so6WopKS0pJ2ik6atq7ezp66ikZGZnaWSkJ+hmJufnYenrKSrrcDAsaCpr6mXkZ6doZmio6qjk6ChnZ6trqmsp6Ojp6GmpZ2tqZKkmqitqZucqZysoZaWpZWhopecf86UeHqkgXmUlptfro9ejqeBoqB9p5acdKuDgK9eY42qe6eHhaB0l5OIs2OCq4ahjY2zaoWvdH2XiLhhg61Zo81tkHV72nt/mXB+iJJ2fmV7iHZ2a3yIb36FkZJ+bYKPYHJscGdgX3lkXHFoamNmYFJUUlddS09DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSzAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGkqqittKulsqysq6SrprCqoKebmaWXnKKvn6CfqKejpaGfsKyanZWnrq2xq6isoJSSm5+kko+epZidp6OerqSrsKnAx7OoqbGulpKdm6GXn6mqn5Sgn52drrCnq6mcp6ikoquTrLOXpaKqqZ2jpqWhsKCSmaaZoJqUlJGXoHGFjJd0hKiHcbF8nXGsfqGegaWPnneqgn2tf5xzrX6rh4afdpiSe3yXfqqIooyRjJ1+q3uJlI+fgHutVpzEeo9vksF9gZVtdW+MbWV2ZYZvYXducm+Ki5KQg22SkGZwdXVwYGdtZV9vaWluZ2NXU1xhWVJTQzhJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DUxsaytKCco46jo6Ksr7avqLGmqKqnraurp6KjnZmilaClqp+hpaCoqKKfnbCsl5qWqKevrKimqZ6XlJqjoZGToK2bnaajr6yjrLWqus6yraatrJaVnJ2imJ6urJ2WoJmen6qyqaqqm6yrpKOsm6+xoqirrqWYpqqpqbGikpajpJqUkoWkaqR1iXqpdHqycIKmipmMcYigmoekYGFSq4R/roObdq2BpoaGn3qZl4Z7ZoCjiaSZhoKkfal/gpWHrl59qVWdopKBeqKfgHvDr8WLcq+zs7lxYqmvwnRojYyYj4FtmpRwbnl4eG9sZmVlcXBmfGliXVdgaVhYVUxMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfDydbVv6GZq6ehr6KesLSwr6mtoqemqqurqaSmoJuknp2mp6ajnKuaoqyhpJ+vopybk6qktbCvoKmbnZaUpqKQmqKooKClnLCmpKiyrbfJsrWqq6mVkZ2copifpbOdmqCUnZ+nrKykrpqtq6OjqqKzrqKqs7Ghmqmorq+2opKWoqeYm5F8qmyehId1q3l8sG+CpIuJn5aWn5SB0ri0uMmAgbJfYJSpg6OIh6B6mJaaeKrJdJmklaiqkZOajICbipnGxnhmoYKlc4GfjoJ9r11wtGKwdUujhm2nR4KTZI+QnpJ8cZeTgHF7dX57bltmanJwZYFqX2FYZG1cXllJTkxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqbOtrKWinLK5rKqhppqopaqrqqegpqWYqqOfr6udpqCsmp6ppZ2ntZ+il5OpqrayrJylm5+Uj6WskZmbp6OgqaauoaSnqrC1wrKzqq2ok4mXnaSaoaOuppihlZmcpqasm7Cdrqmnnqykt6ygsbmvnZuup7Kzs6SUl6eimZ+Ogp1OeJqBf596g6N9g6SEhqaenJ6ThLh7fHm5gn7MxsK2eJuhkIuffpqWl4p2npiKpZikqX+whZ2Fn4SsfZqUYqVspHCPhZCBfZaCcqxgo3NxgJpgvH1SVXWPkqSXe36Tkot1e3OFf3FcbW54cmqBb1tkX2huYmRdS0xRVEFJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA4ODIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu5qq+gm6Gss7Oln6CVpa6trqqnnaammqOnobOuoqmmsqCZqaSUorWiopWXoqm1uaObopyhko+hsZiem6eloaKvrp2kqKK2ssSxramtqZGHkJynnKKknKWXnpiZmqakqZqvoa+lppivpbytoba3rZ2dtbK4sLOml52voKOdhY/RtcO3eYeOhZGTkIGmeJShd4ygkYSlgYpxqoaEtG5yapmjnJWKnnyYmYaHj3OvgqWboo6mi5OdipWQmm1wslylc5N6nGyZf3uZfG2pYaNxcX+fYnOyuGh4kJSmmH2MjZSNeH15j4JtaXhpeXJugHVdZWRubWZnYEpbWFg8SEdAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWTc42Krb+/vLq0npanpa21oaKZlaOop66rrJmmop+moKC1p6Kpp7CjlKyjjqSto52QmpqqtLSknaSbp5GUl62fn52npJ2nnLWaoaqktqvDsKmrqaGMhI6coaCmo5WampyYm5mnpaaYrKiuo6Wbraa+rJS9sKyforCyuauzppqosaOnl3qokH18sHeKgaSliJxtsm+gh618oY6DqJWYgKyJhK6Fn5SqoaGXhp+AmZWAe5J+q4CdmpeLq3idn5GJk5KAea9do4F9pqdknYB8l3Nqr12la3CFmV1gW4ygbZWSppmClY6YjXt7hJh/a21/Y350boB6YGdlcW5oZ2dDWmFbPktUM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBgYWFeXVtaWFNQT05JODA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNUVldXWFZVVVFIRklKIygovZKag6nGwrbBs5+arKCuuKWjjpuko5+wr6qfpJ+drZmeuaCjq6CvqZquoZCrqKSWiZqQrrGspp+mmqyXmI+soaGdpaGapZ2tmKCoprapwK+lqaSfi4CNm5qfpp6SlJqalJqapaSkmqmsrKSln6qovqSWw6yqoqGrsrmqrqegs66oqZh2r36Qi5yFh3y6roqYZbCMZZWtfaGPg6aVmoGsioSwhaaZpKGhkYWgW2xqgbNgf617e4KBsW1nb5mYjIiwW320XKSDa8iiZJ+Ae7xYdrVasn1SroB6rFiAoW6YkKibi5eRmJh8eY+dfmR0fmKEeHSAfGFqZ3FtZmVlT1VkXEJVXz5KKD45PTQhIiwlHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFFSVFhaXmBgYGFiXl9cW1hVUE5KRkM1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpcXFhXV0dCO9Kfs7K3vbq0wrOjm6ympbaooIuaoJ+cs7Opn6OgnrWYoLSoqqyer62erJuVr6iijoibjq+sqKeippmukpmPqJqhnaSfmaSjpZmfo6qyqb2vpaienY59i5qVoKCZj5Gam5Kal6ifoZqorqimpqOlqbueoMampKihq7S1rK6mnrutrKyVgKmSo6+Pm4CHpJeYkIGAuMO6g46ck4SnlpyCrIqCr4imm5ulqpF+1b3CqmKjv719fqOCg9e6uLWFlJODnr2+hGujgW+rhGycf3qysMeDaquwvax4d6K+vHSBlo6nnJCbkZideoKRm3pjfXtkjmd5gntgbGVramJQYVpTalxAVWFCTio9OjQvHh8kHiUyIB0kKDA0OTY2Nzg6PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PEE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbO0sb+5sb2yop2upqWypp2MmKW/qriyqKG/pqeynJ6xnLqon62vpqaUlLCsl4yDm5GupaKsoaOcqp+Yi6OSpp6nnJqhqKKZnqGsraq5rqijm5eSe4eZkaabk46RmJiPmJOomqCYqamhqqeho6q7nqjEoqCuo6qztKqwqaC6p66umnN1qqS3hmWJoHBnrY+Kj21vd6SQmZ+Bda6YlHCPi3GVqKObl66kcm1tbGaLeG9ugplxgXpqcWlniZaVmHFpaYSHZ3CGZF2IYmpvWV1nfnemX2FxjpFuZmWAjZOPopiZmZGYn32HkJV2Zod4aY5reX95ZGxjZmxiS2RYSmxaOlFlRVInSzorIxwgGyIsKRgbGC0yLjU6NDU3OTw/QUJERUhLTE1PUVNWXVdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWts6m5ubKzqqmhrp6jsqmYkr6yxMm+tqqewKyso6GorKC6o6SurK2mjZeuqZCMhZWWrZ6mq6Geo6OfkYukkqeZqJmWo6qglpympqevuqysmpuTknuEl42lmI2RkZiUjZeVqJWfmKmjm7GmnqKruZ+vwKeksqWssLGqraunt6Ott5aKoKiltp2JlqKYh6makJSdkqmzmZujq6CxlqKgnaCinKCloZWrp42TkoyHk5yclZCak5iRjpWFgaSal5WNi5OTi4+GhH1niX50gnZ0h4txp2x6lJGTkoGBjpCQj52VoZaamKKDiJWNcmmQd3GLeHd8empsZGNvZFVgWEBqW0hjYU9aK0Y9KychNzQwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhUVlleYGFjXV5VUUpFRD45PUBBU1hbXFpXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqltbaurqKwo62foLWxkI6sx73Fu7mroqaem6afsaijtqedqbSnqJGYrKKLh4mPm6eWrKWgmaeenpKVo5eomqiZlKaho5Cap5mhtbuoq5iakI17gZSLoJSKlZGVkJCTl6WQn5qqoJy2o56nq7enrsGuo7amr6+wrKmps7igrryZkaWkpraikp2mn42pn42Sn6Osr5uho7Cor5ejoJyjqp6enZyWq52SmaGblJCWqpmNmZmWkJaekYmgnZWUhZKMkI2Ui4B9ZouFdYZ1eYiDc5xqhZCUk5CJfYyWkpKXlKKTnpiihImZh3tylnN6i39yfH9qb2RecGphW19ZbmNQYGRQWjpHR0U+Mj09OC8rJispJh0mNDA2NjY4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWBlVVBKQUNCOjlFTVZbXl5bWlxbW1tcXV1fX11eX19hYWJhYWFgYmJiZGJcW2OXlaSoo7CzrK6jqaatoKe1qpCQnaW0vK+traKjmnqdorGkpbGpl5y4pqOUmaqcjoaKiZyjj66fopWnn6GSl5ibrouqlo+omaiMmKmPn7m2paaZm42IeYKTi5qTipWSlJCNkpeijZ2eqJ6fuKOAhK+1oq+vdaS9o7Kgd3mgqrK6lHWspJ6JgKp/ZFxidqCOpJ6El31uk7Odo6etqqNlnZ+Sc3mZlnCAmKiXbH+iqIplnKWckZeYloySnJGGnZqQlYOSh4+PkomEd2qOhnaGcHuGgYBhaYeKlJKLWnWVkWhoj49ze6aamWV5mYeDeJhqhIuDb3mAa3FlX3ZwbGtoXGdlYmJwU1w+Tk5OU0c+QFREOTEvHh8mNDozMTY2Nzg8Oz5AQUFGSEJHRklLTVRUVVldYGhmZ1dRSjxERzw4VVJbYGFiYF5gX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5Wmo6GvsayrqaWprqOmraSSlqu2sLKnm6umrJd0jJ2vn6irp5SXuZ+gj5yknZF/iYibno2rmqKVp6GdjpeRnoR1ro+IppqpkZekiZy6tKigmZiLiXV3k42Vk4qUkZCUjJCToI6boaeZnLKWgIybtZ2zjJKPvKegfqeieqKutoGOjqaeg4uGkLGpr4yKlqOaeYCLrIacnaKnqaeHlYWYd6WbeoebgZengoJ7nLJ6ioagl5mUmJaCkZeWhJqZY3mHkISOj5GKg21wjod5gHCAgYV/hnSGhJWReJZoknSgmnR9mYSinoeYf5OLg4SZa46OhWx4e3FxZ2R4b2psalxma2pldFxfSVRMUUBFNS5aVFU3KSEwOT0+NjQzNTY4Ozo9Pj5AREk/SkVKS0dTWFtZW2FhaWZaUUg5RUs8PmFWXmJkZmRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXo5+mra6rqKygqLGmpqmlmZSuyL6xopenqbWej4SdrJynoqCNkL6emo2fmqCQfIaOmZiIrJyhlp+gkY2TiYaAkaiNh6KdpJSYnoafurKnnpuSjoVwdZCJlJCKlJCPm4yQkp+Sl6Gllp6rh5+0ibSarYrKh6quiLeFjK+CsK6DqY2lmI2dfaiPcnt3nI+nlmiVpHm0jJ+epqiSmMKBf6uImKFynoCapX2XhZWxgKF9oZOgkJiXgY6Tm4qYkYt8hZOGjZWSiYNtcpCFf3lxhoGEfIR1hIGWgI/FZn+ph4+ja56Do5uEmoGOjoaKmXGOk4Vod3R8d2hodXFoaGteZHBtZ21YZ0ddUk0yRDQ2TmFjNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05JSkxDUFpdXFdhXmptXFFFPUxNQEpkWF1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUl6KfsKepqKaroKS4sKmqppqUoKOkq6SXpaq3o6+AoaecpZ6diZS9mZONoZKej3mElpaRiKuZm5uZoYWPjHebnI+fkIiepJyWmpiHo7mupZqcjIx+Ym2Pi5OQjZCNjZiMkZKfj5ShoZmhp36hp4etnaCWrY+enJ2RhYCgjauuhqONqZmMmn+jdYCZlGuCrHVNq3iHjZyRm6ingKmrfYOhe3qnaZ5/kmtnl4aXtomefm5gZFmDl3+Me2Roi3KZfXmVbF18lm1fU3CDXF9reYNgWWWCfYOAl3CnqmuDo25ypXCfhaBpZqBtW26KfGZaYIN/YldQb3dmbXRya2pvXmtwbWxpWGlPXVhGOUE0R0ReazQsSUNSTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl5jdmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5adoLigqqSmrJGhtbyrrqKZmKCipayuoZ2utaKokqGgn6abmo6ZtJmQi5+MlYt1gZSSjYqmlpWYnp5/koWGrKSHm5CKmKmZmpuSiKaxp6KWmoiJgGluiIiLjo6Ki42SjJCSooyUn6CcoaR/k4GPo6GUoHeclo+ng6Gnf4aprISleIp8hJp+onBzlIiWe56MeW2Hm4yZkJuomo+HnXuConN2pmaefnekX5h6fZJzom6Yt7S6dJOHgn+1qGSBxrh7cJW3i3GAmqRic6yrYH1pnbN+bnyGgo2Ci5hxf6NscqN0noSAo2CdmbOWcXyXn7N0c1uesoNqYm90dnFpb1hrbHJyZl1pXmJLRT1ENlFBWXEzPVNHX0pSPTwzOTU6OjZEOztASlA/VU1OUUBEX15bWVhgYHxkSEM4TFdVVmNhWmVma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO4mauck6CNpLe1rq2gmqKdo6Omrpybsa2sk5ihmaGkmZqUn6ubi4iSeIuFcYCWjYqPoZCSlJ2XfZCJjaihh5iOipGjlJybjYupqKWekJeHhX5re4d+fY+Ng4uQkYmPlKCDl56gnaCei4l3nJiijJ9yoYuHqIibpY+Wp6p+rYx+eqCZeqOTeIF0loiNnH2Vn4abjpmbpoaiZKF8iJaQm41snmiajW6amXuAi6d9cmh0q4Oeg3SqaJWaXZuFdoSdaKpqgLhmXKhwgZxglYxep3Z1h4l+nmiadYaTkpeOf59umpBtp5pdqH54u2t+qluOhF2zZ1xucnp4a2lccWp4eWNgZlhiQVFGTzdWQ1JvNUtaWl9PWkRAMTUxOzs2SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5bXVllZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtZuniGOUm6u6srGsnqacnKmfnq6bnrCorJ2XpJqhn5iWlqGkmYaJjWqIgHJ7l4iLlpaEkZSYj3qKhJaknYqUj4aLnpKdnYmQqaOgmoySioCAaYCGeH+XjHuJjo6Ij5aaf5Sin6Chk5hyaJ+Kn4+McJKMgamHmJ6ip5+nfK+to6K4l3ejs6KkgIiUeZ17qpp/oo6dm5eIl3GhfIWNr7V9a5qRoXh+mLSjo6uohJl8m32dmn90qlpdb3uWi3ieYkx+enqFY3mXQkyeWaJqcnyObYCIhJl1m3iGibGzf3+bk6d2gp1uc32Ub5lza6RdlXZIZWRhc3F+fm5mYGxpdntkZWJSXlddVVdAWkVRaERTV1xiWF5JRD1COD9COklGOExFWEFXUltWREZiXFpgS2BtfnJFQzxVX2JaZmpWZ2htb2JmZ15hYVxdXmFoYl9lY3ZsXmVnZmtkZmxpaGtpk5yBsK2ZhFReoKazubOzqZqijJyrnJyplKGrpKGoj5+enZqZlpihnZaIh4l3hoFveZWFkJuLfJGTlohyf4iSoZxzkZCBiJmVoZuFjqmcmpWLi4t8g2yEhXGBoYx4ho2IiJOYlXyTo6Ceo4ithn21hI6enHullnqpgZWcj4qgnHynaHdtfpl0oXNxfJ6GmXCTg659pIOmnpmAo29eqGd1o2NvpWGc05B8e5l4cnNjooaQfqNzpI92a5CzjGCCmIlzqrKovH93g21+vqaptF6cbn1xl25/cqJyXaRnc6ZhaKZtm9SZfYWbcHp6l2ubfHiXc26ppGdhZXlwgIRrZ2ZkbnV3Z2BjVFtmUVFiSVdKVGFXU1tlalxlUUZDS01KS0JLRThPQFFOWFNZT1NRYWZlalJjd3l3SUZFY11lWmhqVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJebf7CrVFxLfqmvsbSws6OcmYWZqaChpI6lqKCYqYqZmJiTmZOSoJiOh4Z7cH2EaH2Pg5SagXeQjo+Jb3+Gj5KSbJeTfImRkqSWg46qmpOSi4WJeoN2h4BugZ+Gd4GShoiZopd7lKOkmp+Js6Gitot6rKekrqVwqICakIWAm5F7pICimYaYcp6Eo66vipeMf4ykjZWDraGUdrS1tcmhc5SKgZ9gnZepbXmVhqCbdaGHd6B+kpeLgW9MZqOScJuHcqR7enRhg4FrfqBrcWRfnHF9dJdpemmztbTGpnOYfnqda5ybq3WEm211eJhpmnp1mHJQRX20Xmp2a3mHZmpoYnR1cG5WXlRZaVBTaUlWTVlUVl1oa25WZ1dNSkJKTUtISk9BUUtQZWNqbWV1c3N/eXxudYl7e1RQTmxeaFtraVJqaGlsZ2xmY2VgXF1cXmliZGlre19dZGhjamZvbGVpbWWhnIivpoRmP5Shs6uvr7aiopCAmKqioqWMpaednaaCmpeWjZeQj5yTjoiDeWp5hmWDjH+XoHl1joiMgWmEhZKCjIWdjXqMi5Wmk4OXqZiMkYuBiXqAfYt5cJChhnmBlYeJlqCVf5Slp5yWloRmbnicbKJkfHGld5uYcGemgJaLe6R6n5aDl3KedoGKlJaPuW6QiqJifZmhlYhtcmmqa3WgbW6mX5ppi5BoloealXWigH2aYIyGjXVviGJooGWefmmadW9jZoiCbXKiWl9bYqFtXYmMb3t+c3JkpW13omRnp2mZc4yZb6JvU4mQb6BfZahUi15UmG5tc2tygm1waWt5c2tvUllXV2daVG1KWU9dSVhpaXNqWWtWUVJFVlxMWFNhVWlrX3d0e31wfXxyg3t/c3aNgIR2XlFyYmdicGdQamhoa2xuaGRnX11eXWBrYmppdnVdXGNpY2pqc2xma21jnKSYpnpldG2Lp66kqbCxpp+LgJirnZ+mjKKhm6KigJaYk42aj4uYkI6Ke4ZxgIhoi4t8mJtzdIl9kHtkgoeViomWmYJ8iIeWqJGBoqyRhpCKgop+gICOc2mPpYR9hpSNiJigjoiTqqadiaZ4lZt+pYiWjLKYnpCCr5efpXeUh3mpdKWPhJpupKKMkoSMg7tufaWvg4aGhpOVnJ98pXpyqJWglmaefm+rY5aKlZJ4qGypooGJdoiDd6qRpodqkbBrdrOMqWuKhm1tn56SlWB+q4uqdn5/jKWedp99hKSVnaBqm4h3rGefrYy2dHe+jaSTWYOmjathdXJ0cHx1cWNqfm5obFNXW1ZhYl1rTV1SXUpebW52YFtxWVtgW2Z0ZW5vcWJxdGB3en55cnmDc4R/gXt7jIGCgHZieGRjbXNkUmtnaG9scmpmaWFgXlxia2JtbHpvXFxiaWJsandtZ2xuYpWlqp2BgJ6klqmqnainrqSZiYOYq5qepImbpZ2pnYWMmo6GnJGFko2MjXSGeoiEb42EfpiTdHSGcpKDbX+LkoeGk499e4KFmKaOf6WmjoGOiYWVdoKHkm9si6mAg4uUjomcn4mMlKqjoI+AdZSXiH6BeZSuo3+Bm3GPhXiPioN+e3KnjHF9fXqXlpuEjnh7fn6HlJWTinaQmJ+gg3t9iWuMhVt5eXJ6cGhufpKJcX91gY+Uk3GGhIJljH9egX+Ld3VzlHVveW5uh22EhV52aHiOZYCAhY2pm310fJZqiYhwgXZ9hnZtbWeMc3l7mHiFW2tYeY9pbndycXB4eHBdbIZuaWdWW2BXXGZrZFZiVV9RX3B4eGxrdmVqa2t2fXFydHNhb3VidHuBeHV6g3WAgX+BeYuFg317bX9sZHhuXlduZ2h1a3hqaWplXGBaY2lmbHF1blpbYmtkbGx5bmhsb2GNlLiopouhopqmpJmlnKujoYSEmKySnqGJmqaaqZiDgZuKfpaTh46KiY1yg3yPfX6PhXuXjnNyg3CVhXt9kouGhpCFeH2AhpmkjnynoYuGkJCFloOGjph3coWphY6RnZCInp6IjJuon6Cqg4mOlZp+fomWraiPkqaPd2+ckIJ5kW9+qIVwfZVxa3B9gZ+Mf5OOjGhtXYOLjJybno5zlYuIcXRrgnZ0gVlyboaRgX1+jGpdamR7hYSJgGBpeHqbe4KLgnWBhYJnd4qGa2FwcYF2XnKKgYiPppWFZYyPg253i4Rxho96cGZnZXuDepZbXGpnbnZbe3l3dW5zc4JmXG2Ka2tiWlpfWllscVxfYVpfXWZ0fnp0b3Rja2trfH1ze3h0ZG11aG18fnZ6fHt6eoCAfm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtobGtxcm1XW2VubGdzeW9oam1gi4uqsKGQo6Ganp6Ynpmoo6N+g5mtjZ+ViJyikaWVf3uYhHySmYmIhoeKc32Ai3aFi4GElopxb4BymIaEfpOEg4aKgXqAg4uboJCCp6GHeI6YiZWLi5yXhYN6rIKRl5mUip6dh4ihq5+ioqOLiJObnKOZlqqhp6egkpuHlY17d42OhKd+f5KRkpOcsqablZ6QjbKTl4SljIyVm5+JkJuCiJGKa3yOd3hlgoaQi3yJnYSHi5CIiICEhJB3fHl0maGIhomeioSUfn2KgIB1b3OEg393hoaKj6aQg4WNh4ONkIx9iIyKkYN3bIKEfXqZanJoYXSKcH16d3dvdnSBXV5vhmhuX15aXV1UaHJWY1xcYmxodXx8c29wZGtqaYB8bnl/cWpwcGxngXtygoB4f31/hHttgoyGfHp4fH16g3lOZHZqcm1wemVrZWNiYFt0ZnBmcnFtVV1sdG1peXpxZ2lrZIyHnbmelqKhmJWYmZWZpKGefICaq46ejYagnIueln15lIN7jpmJhoSEhm54gIBygYd+iZSEbWt+epeHhIOQf4CGhIZ9h4SOm52Sh6ufhHKLkIaTkYudkX2NeqqEjZKYlo+cloeGm6afopqdhoKRmpmYkJqmn6WdnZCWgJCJdnuHjoSle3yOkJGGmKqhnZOdj42qjpGAnYyJk5qego6XfoaOg294hnJ1YX+Dj4Z1i5iBg4+ChoV+hYSUbnl1dJKhiouFmoSEjHN/iHx9cnJ7h4N7eIqOg5Kmj4WDjoGEiomKd4aJiox9b2x+gXxuaGxtZ196f2h9e3Z0dnV7d1xfcH1udWBjW11eUWduVGVbXmJraXZ6fnFsbGRramiBgGxzgWxsdW95cIV5boeAdoKAfoV2cYKNiH57e3x/e4KKYGl8anVoaYJlamNgaVxjdWhvYnRtbFVjcXllcHp6cmVqbWyLiZ63mqGjn5KRlpiLmp+fnnt4nqeRnIqHpZSLmJl5eoyFfImRg4yCgoJue394c4GFfYuRfWtofYKYiYGIjnx+hoSHfY+BkJubkYmonIBwjIuMk4ehooqFjHyokYiQkpeTlpN4jKOgoJ2WmX+AkJqYkoyao6GjmZeRm36NhXiAg46GoH9+jIyPfJikoKGTmZCPpo2PgZqRiZOXm36Tkn6HjoF0dIJwdmB+gI2GcYqVfIiMcYx/goWGjmh3cXiLmJGPfpd9h4pygYZ7fHF4eoqEenmQjIKVpZOLhZB7hoeHhXaChImIe2ZyfH95e3FsamZffnNofHV2c3xzgGpeYHN2cHdkY1lfXlJraVRkWV9haGp2eYFxZmtkbGhlgIFrbX5ob3FsfniHemuMgXOBgX6BdHaCjYZ/fHp/gX1/j2pyg25zaWKHaGxiX3FWdG9tbmB4aG1XanR2Y3V6e3Jiam95iY2espKlpZyOkJiPhp2gm518dqWhjpiAjKKKiJqWeHuGh36DiX+IgoF/cX97dHaChX6KkXhnY32Gl4qCiox5fYCNg3mWgZWYlo2WoJt+cIyCkZSGppuHjYmDppWFk4uWl5OSd5GdoKGYk5Z5fo6Yl46Wmp2knZiSlJt5j4WCd4SWjZ1+gYmNjHKXo56hk5mOj6KMi4OWmIOSlpl/mIx8iI2AdnF9bnpkgHyKhXCGk3+QgmyHgoGAiYRldW97hpKXjHyTd4qIe3+FfHtxfneIhXmEj4mKl6KVgYOLd4iEg4J3fIKKhndgeXh9dH94Z2xlYX9pandzdHV9cXxiY2FzbnVybWFaYV5bbGVSY1hgYWhrdnmGcWNqY21laH2DbGh1aGxwaYB9gnltkIZxgISDf3R8g4yBgH56goN+fJBtdol0dG1limxqYmN1VoRpcW5geGdsYmp2cGZ5fHlxX3FshoWPnK6XpqiejY2Xh4afk5eZfXiqnIqZepedi4yYkHl7gIt9fIN8gIKBeHR5enR9gIR/iYuAZF59i5WHf4WHdH1+in99mISXlJeMpKKYf3OHe5SSiqePjI6KkqCRg5GQlJeRi4GPmKCakpCQc3+NkpSJnZ2eppiYjZWWc42OimuFl4+ZeoeIkIlvl52ao5OVio2ejIaCkpx/kpKVh5mIfIqJgXlxemt1bHx+i35thZKClHhwgoN9fop/ZHJpe4CWl4R+jXOPiIN4hn12d398hYB8goyEjJSkj3iEgnSJh32AdHaBiYRvYXt1enF9b2JvY2R7Ym5vdnN4d3N0YXVgb2x1bm9cXF9eXmteUF1YY2FobXR7iGtfamZqY2h3iG5mbGhqbGiBfXt3bpCIc4GEhH10gYaJe4N9eoGEfX2OcnqLeHhubIdqaF9pcmKHaHFvZXZnbmxheWlrfXt4cGF3bYuAmZmqoKOonYqKkYaLnouVmH53rpmNl32fk5GWlIh3fXuKfHuAdnh/gHB0dHtvhX2BgIp/fGFbfo+ShoCEhHN6gId6j5KIkpGck6WclYJ9gn2Oi5KkiY6KjZeajYWRmJOWj4qIjJKdk4+LjG6Dj4+RiJ6ZoqGXlomWkG6ImYNmhZiOk3qIhJCKcJWalKKSkomLmYyCf5CefZKPkoyZjnuKhIdzcnVrcG51e4t0boaQjpJxdYB7gYGIfGRwbHh9mZN9hIh0kIqAc4d5bn99gIV7hYuIhIyVqIx6h3x+i4V4fnFwgYaEY2h5dHVwfGJfcGFrdF5want5eGxzcGV4XW5sc21zWFpfX2JrWlBXWGVjZ3FxfodmXWloZ2JncY1uZGlnZGlogXp3dW+OhXSBgoN7dYKIhXiFfHiDhXqAiXd/i3t6cniDamtfcGh0gGpyb21xZ29sZXxjboB6d3Fsd3eKfqKXoaigppuHjIqCkJ2Hk511gaqVk46HoYyVk5CAdHt2hXh5f3Jze4VrcnB6bYp2gIGHbnFbWH6RjYiAgIB3dYGAf6CGkYuSnZihlZh4ioCBjYmcnoqPhpKXloWJlZmPlouLjY2NnYqNj4NtiYuQkIqdlqGcmJSFmIdqhKOCZoWdipB+i4OLgXeTmJGekZCJiZWNf36PmHyRjY+OmpJ8ioCCbnVwbG1vcHuFaXODjpiKcXeAdIKIgnhmcm51gZmOe4iEepOReXaHc2+Ie4WLeoqFgoiOm6OHe4N1gYt/eHlvbIGEgl5ydHJwcHhaXnBgcGpeb2p9enBtbWpsdmBwb2pxbVpYYWFiblhRVFpmZ2N2b4SCYl1rbWRiZmuSbmBmZl9na4F1cnNwi4B1f4OAeHWAi4B5hX93h4Z3g4V8h4x/e3aKf2pxY3xjhnxucWx0amhvbHZ4X3F/eXx0dXSAgn6klZqtnqeWhY2Ef5eUg5CgdYuglJOGi5uMlY6LenJ4dIJwcoVzcXWIa29tdW2IdoN+gG1uVVGBq5WHgniAd3ODeoKggpKCk5OYnJOaeJJ7g42TpJqTjomVmJKEhpeZjJSLiY+PiJ6Ej4p8c4uFiY6InJqfmpaUf5N+aIWch2eFoIeRhJGCiXGDkZePm46PjIyPjXh7kpB6jouMkpaMfIh8gGt2am5rbGx7fmF6fo6Wgnd6gHiDjHx5Z3Nsc4eVin6IhnuTj3F5g292jHqJi3qIfYGLkJ6dhHx7d4KLfXdxamyCg3pgeHBubHJ0Vl5vYnJgX2xueXBob2Zmc3RocGthd2VdVmZgYHJTUU5cZmVdeXCIfF9caHJiYmVmkmpfaGRbZ3B+cGtxdIp9dnyFgHR1fox5e4aBeIiDc4aFfoyNhHt5lXhmcmqDYIh9b29remBqbnR/dV90fXiGeHRzhXx4oI+ZsZyljoKKf4Oah4CMnn+LmpOPhYiYjo6PhHd0dnOAcG+Fc3Bxg29qaXZug259fW11c1JNgt/IktaTfHB1g3aEoIOTd5SRmZyQmXuUc4WQn6GTk5CKkpuThn6WloiNjYiRjIicfo6AeHqNfoiMipycnZuVk3qNdWeIkYZsiKKEkYiXgoVjjJGZjpWKl4uNiotxepSIe46IipORiXmFfH5se2Vyb2treXlcgHmQjoB7fX5/ho56emhyanOKj4mChYR8lIprfX5uf4t+i4d8hHmBj5WamYp8dniDkHhzbWdxgIRtanRvaGp0blNeb2RwWV9rcXdma2piZnhyb3BjX3dgYFZrX152UE5LYWdjXXpwiXRcXGV2YGFlZY5jYWZiWGlzc21qcXaMfXR5hoJ1dn6Lc4CGf3qJfnKJh4GRi4h8fph2ZXNufWWIfm9wa4BabG55eXNhdnp7jXZyd4p3eZ+Lm66boJCChXeIlX59ip2HhaCRj4WMmISTjoeBdHdweXFuhG9tbn5yZGV4cH1ten1qaGtjpJrB3K7voXNsdoR2haOGkm+WkZWglZyBknKFi6OXiY6VipCdloOAlZCFiY+AkYqJln6He3V/iXiGhI2cm5iZjo92inZuhYiKfYqig5CJnISFXouTl4qOiY6KioSJbXuWgX2IhYmRj4Z2hX19a31keHVpbnhzWIh6koeFeX6AgIWMfnhlcml/iY6JgoJ/i5aFa4F1bYeQgY+EfoJ6f5CVk5iPdXN3iI11c3FndXqDYnRtcGJpdmdSYXFnbFVfbnR5YXJkX2h9cHJuWmNyYWJXbllceE5NTGRnYl53c4ltXFxkeV5gZGWFYGNjXllqcmtua3J3jH50d4SBeHd7iXGDhH1+iHt0i4mHloaMf36Xc2h1cXlti3pudHCAV3F6dnlxZXd5hoxodoCJcn+ch5mnnKOShX1wjJR4eYudhIWhjY58lo2AmoiEe3N3cHNqb4FraW18dV5heHd7cXV7Z2BkfOvatcnD3IhzbHSBd4ubiY5qmJCPnZaTgYlxhYmgjYSLlYqMmJN8jZOIg4mPe5CLhY+Bf3Z4g4Rzh4KTm5eUl4aMdYd/cISBiYaYoYKTi56DiWGDlI+GiYaJjYeBh2p9lIB9g4SJjo2CcYZ+f3F3aHZyaXN3bFqMfJKDhX1/g4CEioJ1YXNriIGPioF+fpGQfW2Ba3iFjoWRg3yBfH+RkpCWiG5xeoyGdWxxbHJ5gWB0aW5da3ZgUmVxaWZTYHB2dGBvYF1ognFzaVdnaGJpWG1WW3VMS0xmZ19icnOFaVtcZXleXmRne2BkX11Za25mb2lzeIp+c3OBfnp2eohzhYN8gId2d4qGjpmBjIJ7k3Vsd3V5eJN0bnh7fFh6hnGAb2d4d5KCY3aGhXGKloWZoZqiiodzb5OLcneOnH2KmomJfJ9/hJp/gXhyc25vZHJ+aGZsd3hbX3l7e3FxgGphZ2F/1baOkKZ4bnF3fHGTkY2HapmOiZySjIZ7aYeLmYaBkpGGh5iNfI2NgYGKjXuPjX2IhHp0e4N7cYaAlpqOk5SBiHWDhXWDf4qSnJ2FlI6ffohhf5OHhIiEiY1/gINnfZGAfn+CjI6Qfm2CfIJ0a213dHN2dWtjjYGPf4V+fIR/hIh+b19ycIR7joyBfH6QiHlwg2Z5goqGi4J7hH1/k46PkoNub3mMfnVtb2tse35jaGtqWW52WlJqcmliUWJyd2xiZV5aaoNtc2JbZ19kbGBuVVtwTkhPZ2VcZ25xgGxbW2NzYFxjbHdkZV1dWmtsYm1qdHeGf3Fwf3t9dXiGeIWCfYCHdXmJgZKWfImGdomBcHd5e4STb218gXdeg390gW1penSUc2dzh3xykpGDmp+boIaIdnaVfm12lJd+iJGEio6afYyadn12cW9samF1fGZiaXV6Wl93fHptcX9lZGhnV52PXnFzlrzEhHZxlImQfnOYjIadk4yIdGuIj5WAe5SLgYSbjHyLhn18iYx/lIh1iYV1dn2BcXWGgZ6VhpWPgoJyf4d0g3uJl5yWhpONnICIZX2Sgn+Fg4mJcoJ+Z32Le3l/f4eLj31pgH2DdmZveHhzdnNsao2FioGKf3mCgISDf2pecXd6fYyJhXuAj39+coBoeIKGioWDeIN8gJeMj4x9bmx6iX13dG9paH13ZV1xY1hwc1NUbnNpYk5ndHhmYF1cWG6Ab3NZZWJdam1gcE9ZbFJEVGhhWmtubXtvWltebGNaY292ZGdcXWBramNsaXN2gYNxbn57f3R1g3qEgnyBhXZ+iYGWkXiDinSBiHN5eX+OkG9vfIFxaYF5en5tbXx2lWtqeIR0a5SNhZ+YoJqFiG59jHZqeJiPf4KKgpWYinqPlm96c3FsamRgdHpoX2Vye1phcnx5ZnB6YWVljrGyd0piWqTZ0Jdye5GLkXh+lYuFmZKNhm9shpKRenmShoGEmYp8h394eImKhJaAb4qHcXR9e2p5hYOlkYSTjYN/b36CdoJ4hZqYk4uSj5SFh296koN9g4OJg2+CeGiAhXhyf3+Diod8ZX1+g3VjcHKAaHhxb3WYjYWCint2eICEeYFqW3B8coCHhIl9hYh6iHKAbXCDho6Dg3KDeICZjI2Ed21ufoR/d3plaGp9cmBZd1pZcm1OWHJzZmBKbXZ0YV1bW1l0fXJvV2ddZmpwX29OV2lSP1lnX1twamd5cVxaWWtlWWNweV9oXV5lbGhmbGlxd3+Hb21/fYB1cIF7gIF/gn92gYWJl4pxgo1xe4Z9enqElIx1anp/a29+dH99b3J8e5Rwb4B/eGaSioKhmJySgoVnh4RwaHqXiX5/hYKZioF8jY1peHJrbGZfYW95bV9ib3lcZGyDemFxdl9lZdXrvosyOj6LjoByeYWIjo12hJiNf5OOjX9ubIWNjHV9j3+FgpWIfIN4bnaHhYOXd26IhGx1e3RmeYKDqIyDj4yDfW5/dHWDeYWbkIuPkZKMi4Z+e5KHeICEjYNsgHJpf354bXx7gYqDeGJ5hIFxZHFofm10cXSBm4uAf4V+c3V+gHOAb1trfXR4iYKKe4Z/fIh4eXBriIKPg4lxgXh/loqKfnRtanaAgHV1XGlpeHFZV31TWnFlTFtzcmVbSnB3b11bWllddH50aFliW2dlbmJpTFdmUT1eZl1ddmZfdHBbWFRvZFpkcHlaaF5gZ21naWxpcHh9jmxqgoR/eW6Ae32Af4J6dYKBjJOFcICLbnd+gHt7iJOJf2h7fmt0fHKGe3N3fX+MeniEfnxrjIyDm52WjIGAbI1+a2l/j417fn+DlIJ/fYqIa3VxZ2hjW2Jnc29fYWx0YWhwiXphc3ReY2SboJBuXDVZr7V1aoCJfZKGdoaYh3WPjIp3cGyFg4d0eYl4iX2TiHp+cmd2iH59l29whn1od3luZXqIhKWHgYeNin5ufnV+gHyLmIaBk5CXiIuEiXyPiHF7fYV8aX5taoB7emp6doKHgHJgd4F+cWRyZ3WCbXV7hZWRgXyCf293eXx0fm1XbX52c4qBhneHdYGJeXhybYiAj4CEcn58fZKIiHpubWltgoF1bl1oZnRyUlt7TlxxXE9ccm9kVktzeGpXWVlaYXGAdGBdXWBmZGhoZk5aaE5BYWRbYHZhXHVtWFdSdGFaZG5yV2peYmhrZ21saXB3fJJsaYSKfX1wfn57gX+CeneAgImLhHJ7h29xd4N/e4qNj4NqfntueHl3ind9eICCh3+Df356bYWMiJijjYSDe3aMeWtthImSeX17gpGAgH2Kg3BxcGNmXllnX3BwYGBocGZqb4p1YXRvW2FkaXZ7f76cpqPIuHKFg3OUfXiHlIR0kY2IcnNwhHuDc3WGdIh3lIl5eXFjd4Z5gJNpcoR1Znd2Y2p8g4iegoB/jo59cn5zg3l/kY+Cd5WNlI+Hgoh6iYlreHl+dWh6aWt/eXNpenaAg31oYHeHfmpqc2h7gGl2gYyQlH56fn5xe3Z7dH1hVXV8cnOJg4J8gnCGiXd4cG+Cgot+fXh9fHWNhYN2aHFobIiCcnBdaGN0bktldkxeb1VUWnNtYlFPdHhhUldYXGFwgnNbYFxoZWRjamRQW3FJRGRhXGRxXlx3aFVWVHdeXGVuaFZsXmFqZ2Vvb2hwd3uTbmmIi3l+cnt+eYKBgnx2fYOIhoNwdoNybXeCg36Ji5R/cIB8eHl6gYt0g3h/gYGChHmAdm9+iYubnoh9hnp3h3xodIaNkXp/f3yJhoR2j4Bnb21fZFxYZVltc2FgYXFsbGiJbmBzaVleZG2Ad6naqseGh7JyinhwjXV7h5CBepSKgHV0dX53gHBxfm2FdJSGeHRsYHqBeYiOZnGDb2d1blttfYGQk4CBeZKSfXh7bYZ1gJCLg3OVipCOh4WFe3+FbXV2f25od2VtfHZtand2f398YWJ4hnpodXVjfnpndIaOjJV7dIB1cYB6fGx/WVVyfW90g4Z/f3hriIZzeGp0f4ODfXp8d3tyioB8c2dzZW2LhG10W2pfdmVIbm9MW2NYV1Z4bWJQU3R2WFBVWF5gcYRvXGBjbWRjXm5iVF1yR0NmX11maF5ae2JSVlx1W1tna2FWa19hbmZmbHFocHZ4jnRrjo11f3Z4fXeBg4F7dH2DiIiDb3F/dHF1foaCiY2Ke3d/eIR8fYWHeId8fYF+hIB7fnN2eYyOn4yJeol3dYN5Xn6Gmo15h4N0hoaEd4l7Ym5sW2JbW2FWanRjYFtob3Bnh3JhcWZXXWNrf3zKzoe5omttbottcoVyfYWLf3uShXp5dHl1dXtqbXVjhHaSgndwZ158gXmLiWVxgWpqcWNYbXuGnImDgnOXlHd+e22HcICJioZwlo6QiIWLg3p5fnFxb31naHJibXhyamxxd318el1leYB3aXV4ZoJ2Z3SHjI2UfHKHaW5+gHltfF1XcH1tc3+KfIFubol/cHZndn6AfoF1e3F6c4Z7eXFlcmFujIJsc1hrX3hcSW9sTVdWX1RVfGthT1R1clFRVFZeYnSFaFxga2pmYlluYVhicEdBaF1gZl5dVnteT1ZkcFpbamhdV2dgX3JmamhyZ3Bzd4Z4bpWKdH96d355g4eAdXN/hoWOgnBwe3d3dXmHhYeMhnp8f3WLfn2GhISHf35+fYd/fHh1eXeRk59+jH2LbnWAeWSDiJeGdJKKb4WFgnqDdGNuallfW11dVGdzZWBZZHJyZ4FzYmtkV1tgaX94vq57n7duYnOHaHR8cnqDh3t+jYB4eHN3b3t2ZWpuYYd1joFzamJefnh5ioRmcX1oamtbV294iqOBhX9xmZNxgHh0gW1/gZCGcpSHjIeDiIV9eXRyb2h5YWptYG12a2drbHl3endbZ318eGVzfW6EdGV1ho2GlX5wi2ZreoN0bHRiW257a3R8i3qBZnSGfW1wZ3R+d31+cntreXuBeXdwZWxhbYl+bW5Wa2B3VktrbE9ST2lOWXxnYk5VdWtNUFRVXmd2g2ZdYXBoZ2BXaV1ca2hKRWpaYmRXWVV5Wk5XbmpZXWxlXFllY150ZmxkcmdycHSAeHCZhXZ/fnh/fIWHfXVzgoeAlYJuc3h6enNzhYeIiIR5gX12j399hImOg4GDe36Lg3t3fHd3mp2XeoqDh2l2fnxshIWUgHKPgnGGgn6Cf29mbGdXXVtcWlNkcGVfWGNydWl2cGVlYldcXGiAcG9ygHOJZWV5f2p0dnNzg4V4gYR6d3R1bmt6cGJna2eGdI2EbmZeX3xve4l+aGx3ZmlkVldycI2nfIR8dpaQc3xye3ltenqQhHaXe4eGgoaDfXVwcm1ndV1taF9sdWRnZml6b3tyWWeBdnVocIB4gnVhd4WLfJSBbotqbXqBcWVzZWBseWdydol6fWF1g3Zpa3F0enB5eHJ8ZX5+fnh2bmNlYW2GfG1rVmpicVRMaWtQTE5wSF57ZmFNVXRkSk5TV2Fqd35lXWdzaWVfVmNXYnBdS0trWGNiVVRVc1dNWHVkWl9rYFxaY2Vfd2dtYnBpc29xfnV0mYF4f4B4f36FhHp9doKDfpiFbnJ0e3p0cYWFj4KAeot1dZGAfYGUjoCFhHx+jIZ6foB2e6OminmIhoVsdXx7dYSCjHpvhXN6hX2Cg3VuamhlVl1bW1pTY25lW1hhdHtqaW1oX2JXX1tpgGlrb4BnbGFoenlrdHR0b4aCe4B9dnVuemhqeWpfZW5ogXeQhGdlWGJ3aX6Hem9pb2ZmXVVYb2iPp3aBenyRjnh1b35ucXR4jn53lHSFgn+FiHZqcnZnaG9cbWVebXNfZ2FqeGh7bVttg3N0am+Afnl3YHaEhHiPhXOIcXB5f3FjcGhbbnZkcHOHe3hhcoBwZ2l4c3Frd3Z0dWKDe353dXBjY2NtfH1ra1VpYmdUS2xoUEdSbEVheGZiTVRyXUpMVFlka3d6ZV9tcGlkXFZfVW9vV0pTaFhmXlhNVWxUS1t5X1tfa11dW2JlYHpobGFvb3Vub3d1epd9d3+BeYB/h4Z6eXqDfYGThHF0dH55dnSFiJB9gH2QbHOVgXuCn4V/h32AfoaCgIp7doSsn4B6iIeEbHKCeXaBgIJ0bodvfYB0ioBqcG1kZFhfWlpaVWJqZ1taX3WCaV5ubFxhVlxca4FlcnR9aWpdbHd2Z3R3cm6HfH5+enZzbHpnaXhmXWRyZ3p3koFjY1Rlb2eChHd2ZmhpYFdWWWhkkKdufniAi456cHB8ZnhueYp6do5xg31+f4ZuZHZzZGhoXWxiXW9vW2debHRlemlddIBvcmtxe351dWF0hYp7h4eAf3dydX50YXBsWXByYnFxhHt1ZHKAbGBsem9qaHp3dHBkhHR5enVxZGFkbXN+amxUaV5eVUxzY1FHV2JHY3ZmYUtUcFhKS1dYZ2t2emRlbXBmY1pYXVh2ZlRKXGNYaFhZSVdlUUhieFpeYGxbXlxiZF6AaWpfb3R4bm9udoOXeXKBgH1/iIuGfnV2hniGjH10dXWBeXp6goyOfX6EiWp0loF7ip19foV5gHt+fIaIc3GProx8e4aQfmZxiHp0fX12cm+GbXt+bY96YnBvYWVeZVZZWVdjZmtgXV1zhmlZcW5bXldaXGx7Y3F3dm1jW21zdGh1dnFthXl/gXl3bm90ZWh0ZVtndGZ2dpF6X11SZWZqgoF0fWFjaVxUWF5iY5ClaHl0g4aQeGxueWd3bHuDeXSIcoB4e3h/aGV2bWBmYV9qYF10a1llXW9uYnpmW3h8a25ucHd5dHRkcoOSf4eCiHp2b3F8cmF3Y1pub2FwcYF7c2VxgGRebXZpY2Z4enNsbYF0c3xzcWFeZW1vfWVpVGhZWlVOeWBSS1pZSGJ0ZGFJVG1TSUtaV2lscntjbGxzY2FZWlthd1xTS2NdWGlTV0hZYE5HaXVYXmFtW1tfYmNdhWloYW54eWxvanaBkHhtgn6AgZKIhIF2dYl0i4Z0cXZ2gXd8fX6MkIB+k35weJaDfZmSeYCAeHl+f3OIg3NwmqJ7e4CJlXlkdYh5c3l2a3Nwf2x5fHCRcl5wb2BnYmxUWllXaGNtZlxccolmU3JuW1lYWGBsdmRqdWpqX1ttdHFtdHR0a4Z9f4B8d29vbGVpcWNba3JkdHaPc1xXVGRgcX9+cYJcYWNdU1pgXGOTn2VycYSDkHRranlsbm95eXpxgHd/cnl6emRmdWdeYlthaFxed2hXYl1waGF4YVt7dmpqcm93dHN0aXCBlIOGfoR2cmpwfG1ldldbam1icHKAenNlb35bYG9xYl5pb3xsa3N9cnB4a3BgW2VrbXthZ1RnVVhSUXdcU1BZUkhjc2JgR1ZrUUhPWlVra2t8ZW1vcWFbWlhZbHBXUk9mV1dpU1RGWlxPSXJ0WF9jbWNYYWBhXoxqY2RteXhrb2l1eYZ7a4N9gIWZfIKEeX2IbY+GcW93enx0goJ9i4+DgpZ0eIKThoGfiXWBf4F0f4Jwh4J1b6KXdHuGi4d7ZneLb258cGZ4cXtsc3ZzjWtedG5hZ2VrUl1bVmhibGxbXHGMZE5vbl1WWFVnaXRoY3RlZV1abnVucHV1emuIfYB9iHeQc2Nla25hXG5tY3N4h2taVFZiY3d8fHCFXGNfY1RbYFlilpVjbnCDhIpzamd5bmVydXF6a3l0dG56fnVfZnNjW15XYmRZYXVmVV9gbWNhcV1dfm9oaXNxc3B1dWtshJOBiXuFcXJmbntvcW5TWmVqZXFzgHZzYmx2VWJxa1tebmR8ZWt1fHJycmptX1ljaWp4XmZUZVVWUFVuWFJXVFBIZXJfYUZYak5IV1RWbWhkfGlrd2phV1xVW3RkU1JWaFFZZlRTSFpbUE54dlpeZWxpWmJgXl6PbmJma3l1bm5pdnZ/fm2DgH6Gl3t/h4GJfmuTiHJndIB7dYCDfomPf4uTcn2KkYWHn4Z7f4aMc4CGc32CdW6kjHOBjYt3eG57jWBkfHFneXN5bW1xdoNnZHxsY2ZnaFNfX1VnYGxvXF5ujmhNaW1gVVZTb2ZzbGV4ZGVdWXF1bXJ7eHNtiXyBd5x7emxiZWxtXmBuamVweX5nWlZYYGt3e3pvg15iXmdWWWBXY5yIYmtxgYZ8d2tqdmxbdXBqeWl1cm1ue4ByWGpuXlldVmJkWGVxY1ReYmliYm1aYH5rZmtzdW5td3ZraIWMf4l6h21xZm97bHFsYlhfaGhvc4Bzc15pbVNlcGRVYm5heWJvdXt1am9sal9YYGZodV1lVmJWU09ZZlNPXU9PSGVvXWNHWmlNSV9LWG1kX3hobn1kYFVeVF10W1RSX2ZOXWJUU0pcWlFadXVcXmVtaFhiYVtejnFjZ2p3cXNtZ3ZzeYNzgYN7iI1+fIqIjnlukIp0bHOBc39/iIWHkoSVj3p9jI+IkZuEgHyMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH1+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2Ojo6Njo6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6OjY2NjY2NjY2NjY6Ojo6Ojo6Ojo6Ojo6NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCS5KamZmZmZxbQURERERFOS8wMDAwLEiFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTM/k56cnJycn1IxNTU1NTcnHB0dHR0YOoOBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJiYmZmSj5CQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaNjo6Ojo6OiIaGhoWFhYSDg4OCgoKEioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkI+QkJCLjpGRiYeOipCSk5GLkY2Nj4ePkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyMjI2NjY2Ojo6Ojo6Ojo6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoWNh4eMhomQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCQiIyGhY6Gi4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkJCIi4eHjIiIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fX19fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMkIiMhoaIhYmPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2PjI6KioyKjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp5ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWFhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5OUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WVlZWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpKTk5OSkpGSlIiMlJOVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKRkJKRkpOQd4yTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpB3iZKRk4B1jpKRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCQknlujZKOdHaMkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Rf2d4kod1d4uQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo+CYWmGemh0io+Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjndga2JnZG6LjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLiouHZG9uW2pybIGFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3F7eHl7fHt4d3t/eHV3dHR2dXV2d3BjcHBka3JxZGhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoZGVpbXNwcnVrYmNiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpdYGFjbG5vb2taWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTlBeaWZsbmtnY1FQU1BQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OT0xMVWRtZmpta2lmXFNPT1BRT05OT05PUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0dJT1VgaG5oa2xraWpoZF9XT05PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVEUl1iZmhqbmxzb2ppamxraWVVSkpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7Pj4+S1ZcaW1sbnlzampsZltRSkRERUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7OztHSj1GWWtud3BraVlHREJFRURHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozs+PTo7RltubWBJQT5BQENGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk6Ozo3OFZkPzg4PDw9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT49PT07RVk5Ozw+PT4/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9AO11uQD5ERT8/QTxEWz09PTs7PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo7bXdIODs6PT1BPElgPDw9PDg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUjw9PUlNRkZ2d003ODg6Oz4+VWdAOzw8Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dnd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N5STtdf4N/eXx3Vjw9Pz09PkVpdEs6PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUBIcnlrYoKEg4ODgH1dPkBDQEE9SXN8WTo9QUVBQkJGSEM9PEBEREFAPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEZvdH2CgoGDf32EdUxBQ0VAPz5ZfIBdP0NFSUpJSU1NS0VDRkdHRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVxQkRFRENXdYaHh35YR0hKTUxOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+fn19fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIpsQUFWdIeJh4eHiINXSExNTE1OTElHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0ZJSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3Z3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiINWbISHhoaGh4iIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSkhISEdJSUpKSUhGSkpKSklKSUpKSkZJTExLSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpVgYOEhIKChYaGhIKGhYSEhoaGh4eGinVJSUZCPz9APz8/PDw8Pjs6PEFBQD48OTk4PDw9Oz47OTs/QUJAQUNDQkBBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWWFhISEf4GCg4KDg4SFhYaIiIiIiImMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODg7Ozs9QDs5OTk9PD47Oz1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaoaEhIF+gYODg4KDhIaJioyMi4qJiouMiVQ6ODY1Njc2NjY0NTc3MzU2ODo4NzY1NjU2NzY3Nzg6Njc4ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JmhYOBgIKDg4ODg4WJi4qJiYqKioqLiYqLgUc2NzY0Njg4NzQ1Nzg1Njc2OTk3NjY3NjU6OTo7Ojs4OTg5ODc3Nzk6OTg4Nzg2ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhISGiYqKiIeIiIiKioyKiYmMej45ODg7PD0+OTo6PDk6Ozk6Ozo5OTs6OT09PT47Ozw9Oj07OTs7PDs8PDk6PDg6Ojs6OTk5PD88PUFCRElKTUtJS0xXb3JzdXN2eHt7fHx7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUBCPkBCQEA/PT0+QD8+P0A/QD09P0I/QUE/QT89QEBAPj9BPT48Ozo7OTk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLioqKi4qLXj5ER0lLSklGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURFRUFGRUZERUZEQEI/PEA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6e319fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0NGV4SCg4SFhYaGh4mJiIeGhoaHiYmKi4yNjIyLioqIVkhNTE1LTkpJS0lJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHZ3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f3+AgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E+QkJHR0pZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE5QTkxOS0pMSklJSEpGREZISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4ODw7PD06PkA+P0BDRklKUV+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1yTlJPTkxMTExKSEdFSUlESkhHS0pISkdHR0tMTkxMSEhJSk1RTk9OTU9LSUdJSkhJRElISEZGR0dIR0NCQUNVbnB1d3d5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0dCPzg/QDg6PDg9Pjs9QT4/QURISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMi4uLi4tfUlJQTU5NS0pHRUJHSkdMSkZLTktLSkpMTUxPUE5ISUtMT1FRUFFPT0pISkpMSktGR0hHRUZJRkVFQkFCQlxvcnd4eXp6eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxYVlJSVFJPTEtKREVGS09OT1dVUVBPUlNSTVNUT01TTFBTVVZSU1FQTEpNTU1LTkdHSkZGSEpEREVFQkRDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQ0dWTkZOUFBUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2hXVWthRVJRUVBJOztSVFJgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTlJQUFBRS0xLSEhKSEVGSUlJSElpcnZ5eHl5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0ZGRT8/QUFFQUNHRURFTFhSTVRVVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1E/QFZVWVtjYFZZYnJdXVZdWlZFUVlaW1lfVFlnUlZWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6eXp7ent8fXt+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+i4mKi3pucFhaXFtSU1JWVlRaWnSDWVV9kGBcWF1eV0lWXV1bW19ZSFlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVRVVFdSUVdVYpaAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ1xbXF1dV1NOU1BQUVZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT0xLZnlbXVRZVVZdWkxUWlVTVF5aWFdXV3prWFtbXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fH19fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTU5LTUtISkRGSEVDPlRkVX9SUFFOS1JUUU1PWVJNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXZ1c3N3enp7e3t9e319fX59fX1+fX5/f39/f39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1dW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJWVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz9DQ0NDQj9EUEJDQEM9Q0lHVkBITkxHXWlQSEZPRkRFRklHSENESEdIS0dEQkFEQE5RTVJkcnR2dXN0dXp8ent7e3x9fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgmtNRz9AOjs+QEA/Pz5qUUthRUZISUVCP0dMTkdNUVVJQkU/Pjw9PD09Pz0/QUNDQD88PUI+Sk1HVW50dHVzdHZ4enx6fXt8fX19fXx+fX18fn5/f3+AgH9/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqamZgW1FSWlxZXkpKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZUNAQEI9OkJDQUFEQlxdT3tOT05OS0xNT09RTEtMV01IR0BCPDk3NzU5OT07Ozs4OTg5PzxCSD9cc3R1dnV2eHp8fHx9fHx9fX5+fH59fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJSFBRUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEZGSEJBR0lFRUZETVJQYVdSV1FQU1NSVVtPT1FXUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxCPWVzc3Z3d3l6e319fHx7fH1+fn57fn59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01MVFRTUVFVT0xSU1RXWFRUWFFMV1laVlhYVlhZXVdYWGhza11WYXNrYWFfXmRhX15ZVFFOTk5MSUhKS0lJRkNRUFNbV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5OTg5Nzg4NTc1Nzg1OTlHbnJ0eHh5e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fn9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVlVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTE9SUk9NTU5OTUxKRlFQVVlTVE9KTk9VU1RcVlJVU1JPTUxJSEhGPz89Ojg4NzY1OTk2NzY3NVdwcHR3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9JR09QT09NUkpPUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBSTUlMSk9SUFJSU1RRUk9MTEtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9ydXh4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSEdFSExIS0lGTE1QTUcvRV9SPjM/PmpvYVJSUUBHVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR2ent7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkREQUBHSEdIRkZISk1MRUdDT1JDOEVOU11mU1FTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydXl7e3t9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtucW1pbWNMT09NUVNMVFVUWFdVTUxLSTw5ODc7P0A+PD1AQEI9PkVIR0NGRklHSkpARkFBQEZIRUpPSFBSYlxRUFJOU09PUExMT01LTUxNT05bV0tNUU9HSUhDSEpLTEpGRkZEP0JDPjxCRz9CP0FkcHR3e3p6e3x7enp3e3d5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSEREPTk4Nzk/Qj47P0JAQD5BRElFQ0dHSUZJRUJCPz49Q0JBR0lETU9iZVFNTk5XS0xNS0xNTU1MS05OU2ROSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES25vdnl5eXt7enx6d3R4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEpEP0E9OTk5Oj9CPzxAQkJBREVIS0ZDSElHR0hDQz9CPz9AQT5ERUNLTlJUTEpJTVRHSUlKTEpLTElKTE1PUFJQS0dDTEdDQkpKTE1PTklKSUdDQ0NESUpNTElZcm13eXh6e3t5fHZycHVydHh5dnhqcW9qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFIS0RHSEhHSktJSktER0I9Pj06Ojo7QUI/PUJCQ0NIR0pMSkRJSUZHR0NDO0FAQj5AQEJFQ0lNUEhIS0dIS0RISUtNSEpMSElKS0pNXFJISERORkFES0pNTVBNS01KS0ZHR0pNTlFOTGJtaXZ2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLQ0ZFR0VGRkdFR0JDQD08PTk6OjpBQ0A+QkNERUlHS0pMRklJR0ZGREI7QkNDPkBDQ0NFR0xOSEtOSERIRUlMTk1ISUxHRkdJSUxOS0lIRU5JQkZNTE5NT01OTk1LSUhJT1JRUk5SZmZmcW9zeHV7enxsaGpuZWtxbHNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pERkZFQ0NDRUBEQj5APzo7Oz06PT5DQT5BQ0VGSkdKSEtIR0dHRkVDQD1FRUI+QkNDQ0VHSElHTVBKRkZHS05PS0ZISkZFREVJSkhLSUZIUEtDSU1MUE1PTk9PTkpKSE1SVVRST1dkYGFtZ3Byb3J5emdlaGhkaWxmcWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMR0VFR0NCQUJEPUJBPkE9OTo9Pzo9PkBCPkBCREdKRkpGSUhGRkdFQ0JBQUZGQ0JDQkRFRUdHSEZMUUxJT0pKTExJR0hFR0ZEQ0lJSEtKR0tSTUJOT01QT09PTU5PS0tLUFVXVlVUWF9eXGlhbWluaHJzYmVmZWRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWpzdW51dHNxcmprc01HSEZIQkJAREQ8QUBAQzw4OT0+OT88P0JAQEBERkhFSEZGSEdGRkRDRUNESUVDRkVCRUdFRkdHRUpNS0hRTUpLSEhJRUZISUZDSUpJS01LT1NORFFSUFFSTlBNTlBNTE1TV1ZXWFZYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHJodHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW95TUhHSEhCQkJGRTw/QkJEPDc6Pj46PjpAQj4/P0JFRkRGRERIRkRFQ0RFRkdKRUVKR0NHSEZIR0VDRkpKR01KTEtISkxGSUlLSEVLS0xNTk9SVE9IU1VTUFNPUU1OUU5NUFdaVlpZVlpdWlhhYGBgXmhlY2BkZmhnamloamZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSUhHSUNBQ0hFPEBFQkQ9OTo+Pj08PEFCPD8+QUJGQ0VDQ0hFQ0VFRkdHR0lGR0tIQ0lIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5MT05PUlVWT0tVV1NRU1FSTE9RUE9UWVpZXFpZW15eXmBjXlxhY2tiYGRnaHKFaGdqZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZvdE1JS0hKRkJFR0U8QEdDREA6PD5APz4/QkE8QD5BQUZDRUVESUVGRUdFSEhGSEhJS0lFSkhIS0hGRkxJSEhKR0xMTE1MSU1LTU1NT0xQUFFVVldPS1ZWVVNTUVFMT1NSUVZbW11eW1xeX19hYGFkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SktMSkxHQkVERTxARkREQzs/P0FAQEBDQT9CP0FDSENGRUZIRklGRkRJSEdJSEpNSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOTk5QTE9QUlRYVk1OVFZUUlJRUExOVFNSV1teXl9dXWBfYGFhX2FjZWJjaGJkaWpndotsamlnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2b3dLTUxLTUdEQ0FEPD9FRUVDPUFBQ0JCQ0RBQ0RBQUVHQ0hHSEhHSkdER0lHSEpGSUxISUpNS01MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNRV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAQ0FFRERGQkNFR0NDSUZDSUpKSUlLR0RLSkdISklJS0hKSk5MTkxJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BidnVodWNhdmBYbnFiZHZpbnpmW2x0YGxrVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQ0VFREZCRkZHREVLRUVKTU1LTExHR01JR0pLSEtLSUtLTkxNTUxMSUxNTFtzYmRwXmxtVU1OZnNdZmVxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1Kcnl2a2Jga2VlbXhsa3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElIR0VEQEJCQD5DRkdCRkNFRUZFRENISEdERUtIR0xNTkxNTUZKTkhKS0pJTEpKSktMTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW51XFlsUVxtbVpxbWtvbXh4dHNpcFxfcmtxalV1eXhwY15rZmJncHBqam9wcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0hFRUVCQkI+QEBGR0JHRElFRUVCRklISEVHS0pHTU1OTE1OR0xOSUxLSUpNSUpJSktPUE9OTUtOTUxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SE1HSURFRENBQj1CQUJGREhHTEhFQ0NIS0hIRkpMTEZOTExTUkxHTExITkpISE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnRzdnNIS0hJQkVFRUFAPkREQkdDSElNSUZDRkpMSUdGS01MRk9KS1dSS0dLSkpOSUhKTElLSklISk1NTU1JS0tLU2tiW2leX2ljcnJaX1lqb19lZVVrX2NbYWFRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydnR3ckdHRklERURGQUBCRkVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRUhIS01JSEpKSktJSElHS0tLTEdIS0tMTExMSktNTlRbXFRQVExQT05PT1ZRT09RTk9RSklOUFFkcWlUWVdcW1xVWVpdWF1cXGNmYWFlYmNmX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0ZGQUVDQENIREZHQ0lLTEhGREdLTEhER0hQS0xPS0xXTElFRUhJSkhJS0hMSkhGR0dJR0hJRUZMSUpLTkxJUFxXXlBcW2BeTVhZU1xcYl5NWVpNWGFSSllhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGFhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNFTE1CRERCRUlFR0dGS0pLSEVFSkpLRkVISFBKTU1KTVNIR0VBSEZKSUtMSUxKSEZFSUZERkdFRUpIQ0pNS0xVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOXlxeU1peY15aXWBjYFlfYltgXltUWFdZXl1jYmNhY2ZoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSURCQkNHSEVIR0hLSUlJREZLS0tGRklKTktOTEhMTkdIRj5HR0xJS0tKTEtJR0VJRENEREJGSkRASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFZVlVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUNFSElGR0hIRkZKR0hGSEtJTERES0pOTUxMSEpKSEpHP0dGTkpLS01LS0tJR0dDREBEQUhJQj9JSkhQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYlxkY2JkY2ZYUVVUUltXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSkZGRkhHRklHRkZJTEpORkRLSkxOSkxJS0pISUZCSElRTUtLT01LS0lIR0VEP0VDSEhBQUdGRVRdWV5YX1lfW11VWFhQXV1RS0pWXlheW11VWWBSUV9fYmJgYGJiYGNiYWRkYlhPUVFRW1JbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBR0ZER01SSENRSkZISEhFRktKTVBFRklKS05MTElMTElJR0RIS1FPTU1QTE1LS0hJQ0RBRURIR0JBR0VEV1VFXFReU1ZfWE5UVU5aWk1KS1RgYVtfWF5eYV1OWWJcYGBfYmNiXWFiV19fVFBOT1BYUl1bW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREVGR0RJUmJQQ1ZeSUdHSERGTUpQUEVJSUtLTkxLS0xLSkpHRUpNUVFOT1BNTkxOSEtBREFDREZEQ0FFRkJNSEJLTFBPTkxGTUZHSUpIR0xLTU9QSUxPUE9TT0xRU1JVWllXWVhYZFdPU1RQUE5NT1VUW1hYWl1cYGFkZWNnY2tscHNyenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHR1hMR0hKSEdNTFFRSUxLTEtOTVVOT0tLTEdHS1BTU05QT05PTk9IS0ZgRURfTERmY0VNW0leW3JtT01VbVlMQ1BgVWtXZ0pdWFVeRE1RVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhTa1NWVlRbXFtgYGFhYWJgZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xIRUdGSEVFS09TSUpGYFNISk9KSU9NUlFLTUxMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUX9RSXxZWXFzWFBtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbYFZWWH9qdHV1X192X1hhW1xmW19hYWFhXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1OQkRMTEZJS0VRVkxLT0lLUlhXUU5PT01RVE5PUVBLS05HTVBTW1pUUVJPUFBQSkhaeF1UeGVoWlJUUXZndGxwYm5malFyT013bWpycHNycXJwb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29zcnt8b315b39yX2BgYmFaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEpKR0pQT01NSk5WXllVTFFTTlhaTVNTUk5LT0lRUlRZV1dRVFBQUFFLSGd4bGN4cm1bS01VeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en5seHp/b2hvWXZ2anV1cIFgcmd8aWx4fG9eX19iYVteYmRnaWlkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3V6bnx9eXhybk5LU3ROQ0NGUFBISktKS1BPT09NUFpgWlhLVFdQYV5SVlFZUkxPSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JocXVubXlwd2x2dHRxbG1ddH56a215fGt0bHxrcHZ1eF5fX2JeXV9kZGlnaGZlXmFiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0c29tTExbVkhHRUdSUElMTUpLUFFQUFBRV1xYVU1VWVVmWFJSWV5TTE5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUxXa2h9bG1seF9bcHp7XmB6c2Nyb3hxaGR8aXJ7XVVMbGB2dWtpdXt7bX54a3xwXV5eYltfYmRkZ2VlZWJaY2Npa2tyc3J3Z2xpaGRnYGFrYWdzcmxnbW1yfGttaGt7dG1ta21PSEpLSElISFJQTE5PTEtSUlJPU1JXUlZUUFdbVlZUVFRhYFBOTUtUU1NRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFlSTlBVVFhYWFtaVVJTV1tXWFdaT1NVV1hYUl1ZV11WVFBZUldXV1dYX1tncl5bW1lcXV9jWl9jY2RmZGNjYlpjY2ZmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0tMTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlYUE9MTVZUUE5VU05PTUxRUEtKUlFLUU1LS09SVVJRUVNTSUhMTk9RUlFRUVRWUlhXXFdTU1BRVVVWU1pRT1NSWFZUWVZUWVVUUlVUVFVXWFddWl5hXVxaWlxcYGNbXWJjZGZkZGRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmVmbXNkaWhra2VkY2ZoUEpLTE9PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFNRUEtPV1NQTlVQTlFOS1NQTU9VU05STk1OUVRQVFFTVFVOS01PUVRUUlJRVldUWVpbWVNVUlRXV1dZW1RPVFVYVVVaVVdZVVJSWFZVV1tZWl9dVVheXF5dXF1hYV5bYmJjZ2ZkZGJYX2FiXmBoZWZkYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FaWVhXWFpaWFlWXGpkVlhZWldWU1RPSk5WVFBPVFBQUE5NUVFQUlhUUVFPTU9TVk5XUlRVVU9OTVFTVVVUVFJUV1ZaXVxaVldRUldYVltbV1FUVlZWVllUWFhVUlJYVlZaXVldX15WXl1eYFxcYF9fX1piYmRoZ2RkYlliYGFeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFQVVxaWldbW1xZWltkcW1oZF5bWVZVV1FMTVZTTU5ST1FST0xQU1JVW1VTUFBMUFdXUldTU1NYTU9QUlRYVlVVU1VZWFteXVtbVlJPVVZWW1tXUlRXVldYVlRYW1RTUlpXV1xeWl5fYFVhXGFhXmBiX11gXWNgY2doZGZgWmNgYV9fZWRfYGNbWlxbXFlaWFlXXFlcW2BeX1teXmFgXmJcWWBaUU5PTlZRUFRST1VUU1BXXF1cWF5cX1dcXmpxd3mAYlxbVlZYUU1PVlNOUVFQUlRSS1FUVFlbV1VPUk5TWFdUU1VSUlpPUFNTVltWVldUVlpYXV5bW15WU05UVVZcXFZSVFZWWFlTVFlcVVNTXVhaXV5cYGBgVmJbY2JeYWNfXGJhYl9jZmlkZl5bZGBhYGFjZF9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVJRV1JUUFteX15bYFxgVVxdaWpyfXNsZ1xVWFdQT1JaU1JRU1JUVVRLUVdWW1paU09TUlZWVlRPV1JTWlJUVFRYXVdYWFNYXFheXVlaXVRVTlZXV15bWFJVVVlZWVVXWVxVU1ZeWV1dYF1iYl5ZX1tlYl9kZF5eY2NhXmVmaWRmXl5kYWBhYWJkYGJeWFpfW1xbWFhYWFdbWlxgXFtbXFtYWlteVl5ZXVBPT1JaUFpUVVZWVFRUXl5gX15iXGBVXV5ia3l0bH1sWlVZVVFQU1xUVVRVVFZZV0xSWlddW11ST1VTWFdWVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUldSWVhZX1paVFVWWllaV1haXFZUWl5cXmBhX2RjXF5dXWVhYWZkXl5kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfX2FhYGNdYFRdX2JlZXWBemhYWVlTVlNWXFhXV1ZWV11YT1VdWl5dXVRSV1NXVlVTVFhSU1ZUWFhYXV5YXVtWXV9YX19YXVZRWVRZWlphWVxWV1hbWltZWVpbWFZdX19eY2JhZGRcYlxgZmFkZmRfYGRiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlNcVFZXWVZWXGBhYmNhY19fVltgZGFfenVvaFlcWlVYVFdbWllcWlhZYFdQVl5cYGFcVFRYUFVXVlRWV1JTVVdaWlxfXlpfXFZfX1pdXlleVlNZV1laXWJaXlZXW1xbXFtbWltZWl9fYGBkYmNkZWJkWmJmY2dmZV5hYmBjXmJjaWRjZ19nXmJiY2FhYF5fWFRbWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNQVlpWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheXF1bVldYWVxcXF9bWVtiVlRYXl1hY1xSVllQV1ZXV1dWVFZUWFxcXmBgXWBcV2FeW15cW15YVlhYW1tfYFxfWFldXF1eX1xbXVhbYGFeYGRjZGVlZmJZY2VlaWdkXmNhYGVjXWVpZGVpX2ZeY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlNXWVZXWlhbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBXV1hZWVdWV1ZdXV5gYWBfYl5ZYV1dXlldXllYVldbXGBeXV9aWl5dXl5hXFtbWlxfYl5iZGNlZmVmYlpkZmdqZ2NfY19hZmVaaWljZmljZV5iYmNhYGBfXV1aV1tZWVhYWlhXWltaWVdYVlVbXV1dYGBiYnhMWFdcWVdcW1xdWldcXV9gYmRiYmFdYFhiY2JhY2FiXVtcW1hXW1xfXWBfXVtgZFxcWFpiZWNgUlxaT1hYWltbWldaWWBdYGJiYGFjX1xiXV9dW15eWVlVWF1eX2BfX1xbXl5gYmNcXFdcXmBiYmNlZGZkZWZkXGVmaGpnY2FiXGRnYFxpaWJoaWZkYGJhY2FfYF9dXVtZXFlYV1hZWFdcW1pXV1hPWFpdYWNmZnJrf0pZV11aWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBiYmJcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxdXl9aWFZbX15dYWFfXltgYWJlYl9dVFxgYGNkZGZlZ2VmZmVeZWZoaWdkZGBbZWdeYWhoYmhoZmNgYmBjYl9fX11dXFpbWVhYWFZaVlxaWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnZ2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t8fHx8fHx8fHx8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29vb3l+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKgkU+Pz8/Pz11jYmJiYmJi4yMjIyMjYh/f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29ueYB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjI2DOjIzMzMzMHOQjIyMjIyPkJCQkJCQjH9/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXR2d3d3d3d3eHl5eXp5enhvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx2dXV1dXV1en19fXx8fHx9fX19fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5d3Z2ent4e3h3dnd6eHp6eX16eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eH15fX16fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHp9fXl8enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4OEgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3d8e3x7enx7d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHt6fXx7fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl4eXh6enl7eXh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fX19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzcnJycnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHN0cnFwcHBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3Nzc3Nyb357b29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJzdXJycnBzmHtvcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcXSVfHByb4igdnBwcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFycJShdXBznaB2cHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFvibGRbn6koHZwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcnCDs6l8kK+jd3BxcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycI2xp6uor6R0cnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzc3Nzc3N1n6Kis6Wbo3pzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn58dnZ3d3Z1eHp4eHh4eHd4eIClnpqln6Sjj3p5enl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fn18e3x9iqKQkJeal5mSe3t5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX1+fX6GpqmknqCblZV/f399fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYCBgIqxqKmioaGro4J+gIB+f39/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f3+AgICKp66fqKOgoaWppIx/fH6Af35+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B/gIGIlqqupJukoaChoaGpqp+OgYCAf4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4KGjJqmo52cmqCUmaGgnp2eoZ+ShIGAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI+Rj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYKDipKVmJeZmIiQnZubnJiQiYWDg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgoCBgoOMlpmViZGZnJKLh4WGhoeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEg4KCgYGEkJeTlpmQhYeHiIiIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZGPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SEgoODhZGXiYSEg4OFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4GCgoKCgoKBiJGCg4OBgoCAgH+BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAgICJk4CBgoODgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYmGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZaIhIKEgoJ/f42XgoKBgoSDgYGBgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmIqDhYSEhIKAk5uFgoKChIODgoOBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJKSk4+MjIqFhIODg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgY+Mg4F/fn18fIucjYCCgYGCgoWUlIuBgoGCg4OBgYGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUk5SSj42MiISEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlZeJgH19fX17gZeLgIOBgYGAj5OMj4GCgYKCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICVn4p+foB9h4p9hIWDhIKDg4KOiYWMgoKDgoKCgoODg4KDg4OCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUk5KSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf359fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMi4iFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDipGDhIuFgoGBfn2Bh4aDgH5+f35/fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFhoWFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWGho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+gICEhYSFhoaGhYWFhYaHh4aGhYaFhYaHh4eIh4eHhoaGh4aHhoaHh4eGhoWEg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoeGh4eHkZSTkZGQi4mIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf35+f4B/f39/f4CAf3+Af3+FhYaIiIiHh4eHiIeIh4iIiIaGh4iJiYmJiIeGh4eIiYiHh4eHh4aHhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIOBgICBjImBgIGCgoGBgYGAf4B/f357eoCGh4iKiomJiYiJiYmJiouKiIiIiYmKi4qKiIiHiIiIh4iIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+QjoqGhIaFg4GBgoGCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCgoKCgoB/fn19fX1+fXx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGh4eFhoiIiYiGhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEhIGOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODg4ODhYmKiYeFh4WEhYWCgIGEhIKDgoKCg4F+fX5+fn5+fn59fn19fYOHiYqKh4eFhoeHh4eIh4iJh4iGiIeGiYmDg4SDhYSEhYWGiIiGhYODgoOFh4aHhoaEgoKDhIKDhISCgYKBgYGDg4SDhJGSkI6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDg4WHiIuKhoSGhIKGhoKChISDg4ODgoKBfXx9f4B/fn5+fXx9fXx5fIOGh4eEg4GDg4SFhYWDg4WEhISEhYSFhIKCgoKEhIGCg4OFhoWEgoGBgoKDg4WEhISFhISGhIOEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhISFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4F/f4GDg4ODg4KCf319f4CAgX99fn59fX19e3p6foSEhIKBgYCBgYKCgX9+gYGBgoGDgYKBgoKCgYODgH+AgIKDgoCAgICAgYGBg4GBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn1/goODgoODg4J9fX5/gICBgH59fX19fn18enp6gIKCgX9/f39+f3+Afn2Af3+AgIF/gICBf3+AgIF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foGDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gIB/f39/fn59fn9+f4B/fn9/gH+BgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af3+Af3+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/f31+gH+Af36Bf3+BgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7gIB/gH9/f35+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+fn+AgH5+f39/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH59fX5+fn9+fX19fX18fHx7enl5eXh9gYCBgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf3+Af4GAfn9/gH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f3+Af4CAgICAgIB/fn5/gYGBgICEhoeGh4KDg4WDgYODg4WEhISEhIODg4SCgoKCgoF/fn19fX5+gH19fX19fX18fXt6eXl5eXmAgoKChIOAgoOBgIKBgoGBg4KDg4GBgoCBgH+AgYOBhIKAgIGBgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkImJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICBgYGBgH9/f4CAgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSEhISEl5eDg4SBfX6BgoKBgoGCgYSGiIyFg4KCgYSCg4OCg4WEhIWDgoODgoODgoKCgoOCgoKSkIuIiIeJh4aGhIaFhYSEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaHh4eHhoeFf319fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GDhYWGhoSDhYWDhISDg4SDhISEiJKPjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgoGDgoB+fX5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gHp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfXx+f4KEfHyBgoSCgH+Hg32DgX+CgoCDg4SEhISEgoSDhIWBhJGRjouMi46KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fXyAgYB9ho+Bfn2Cfn9+gIJ8fIB/goCCgH59e4qCfYB/foGAgIGCgIKAgICBgH+LlI+MjI6OjYiIh4WFhYSDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYWGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3t6fIKAgX5/gXx+fn9+fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX18fXt9fX18fXx8fYB/gIB+gH5+gpSSjY2Njo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoGBgICAf36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fHx8fHt8fHx6enl7fHp9hYODf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fX1+gICBgH9/fn19fX1+e3x9f39/gH1/fn+MkY2MjY+OjYeEhoaFhISDg4ODgoODg4OCgYGBgYCAgYGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIOAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn18fn9/fX6Afn9+hJKNjYyPjYuKhoSGhISEg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fX1+foGBgoOAen19fH5+gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fH59fnx7fHx8ent6fX+AgISDgn9+f3x8fH18fIGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgX+Afn+CgoJ/f4KCf4CLkI2MjI2LioiEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn1+fX19e3t9fXx6fHx+gIKBgICAfXx9fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISCgYKBhYaFhYaGh4WBhJGPjYqKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4CAf39/f39/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+f358fX18fHx7fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJiomLiYWIko+MiImHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx8fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgX9+fHp8fX1+fX1+foyGfX1+e3uDg31+fn19fH19fX19fXx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uKiYyRkI6KiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99fn9+e36Bkox8fX+KgI2Mfn59fX1+fn1+fX19fH59fH18fX19fn19fn58e3t7fHx9fHt7e3t5enp4eXt+f4ODhIeJioeJjpCOjImJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgYCAgYOCgH+Bf31+gH58f3+Jgn9+g5GEhIOBf359fI2HfX1+fX18f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6enl5eXt7fn6AgYOHhIiPjouKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn5/f319fXx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiY6LjIiEhYWEg4OBgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYKCgYGCgoKCgYGBg4ODgoWGhIOBgICAg4F/gIGEgX5+gH99foB+fX5+gIB/gX9/gH9+f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHx8fHt7e3x7fHx8fXyKi4mIhoaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgYB9f39/gICAgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fYmHh4WFh4WEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoKCg4WDhIOCg4SEhISFhIGBgIB+gIKAfn9+gX9+f3+AfX6AfX19foB/f4GAgYGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4OEhIWEhISFg4GCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFg4ODhISDg4SDgYB/gH+AgX59fn5/fn5+foB9fX98fX1+gH+AgICCgICBgIOCgH+AfoCBfoCBgIB/fn5+fn19f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Ag4J/f4OCf3+Af4F/gH98e3t6fHt8goB/gn9/gICCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDgoOAf3+BgYCCgYGBgICAgICAf4CBgICCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fHx/fn+AfX9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhIKEhIWEhISBg4KBg4F/gIF+f4B+gH19fX6Afn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIGDhIKBgIGAf4GAgIGBgIGBgYOCgYF/gIOAfoKDhICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgICAgICCgoGAgH6Agn9/gYKDgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3x7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAf39/f398f39/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+Af4CAf4GCgYB/fn+Bfn+AgoGAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fXx+gICAf39/f3yAf3+BgIGAgH98gH9+fn5/f31+foGBgoJ+f35+fn5+fn9/gH99gICAfn5+f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAe4B+gIB/gYCAf32Bf35+f399fX1+gIGCgX5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIKBgICAfX5+f4B9fH58gICBgICAgIB8gH+Afn+BgH9/foF/fn9/f319fH+AgICAfn9+fn99fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn19e3t8fHl3fHl3eHd3eHt7e3t8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYKBgYKAgYCAgYB+f35/f318fn2AgYKBgICBgX1+gH9+f4F/gH9/gYB/gH99fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KBhIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgYGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYGBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/fn+Af39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f356gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoKBgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gIB/f39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoGAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBgICAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXx8fHh4dXh4eXt8fH18e3x8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgoGCg4CAgoGEg4OEgYGDgYKCgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgIGAgIGBgIKDgoKAgoGBgoGAf4CAf4CHfn58e318e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICDgYaDg4OBgoSAhIOCgoCAgoKEgYGCgYOCf4CAf4GDgoGAgYGAgH+BgYGBgIOAf4CDgn9+f4KBgIB/foGAgX+AgIGBgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fX97eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCgoKDhIKDhIOAgIODhoODg4KChIGEg4GDgICCgYOBgoKBgoF+gICAgoGCgoGCgoCBgICAgoKBhIB+gYOCf3+Ag4KAgX+AgoOCgIGCgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCg4SGhIKDgoKEgYSDgYOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGCgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SDhISEhYOEgoGDgoKDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SChIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoSCgoOAf4CCgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7fYF+fXl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICCgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhIGEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16enx9gH1/f3x8enx+fX19fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHx4dn92d3+Eh4OCg4aDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoKCgoODgoOBgoGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fH19fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4KBhIOBg4OEg4OEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4OFg4SDhX9+goqLhYWEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhIWFgoeGhoSEhISFhIWEhIOEhIGCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhYB9gXWBeoR/f39/hYSCg4OCgYOEg4SEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fn99foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN/g4N9gX1+fn1+goOBfH+BfX+AfX18fHx8fXx8fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1ud2xweWx1fX9/fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWHhoaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fnyAfoCAfn6AgIGAfn5/fn6Bf4B/fn2AfX+AgX+Afn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSBgX+BgYB9f3+Bfn9+fn+BgH5+gYKAgIKEh4aDg4aEhYWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYWFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX16fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhIaEhYWFhYaHhYWFhYWHh4iGhIaFhoaFhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOFhoWFhISFh4aEhIWGhYV9d4aDhISDgoF9f357fHt+e3x8fX9+fXx/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWHhoWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIaFhIWFg4aGhYWFhIaHhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9f358fH59gH59f4B+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhoWFhYWDhoaFhoWEhoaFhISFhYOEh4WDgoOEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGiIeJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4OHg4SBgoSEg4KAgIB7e359fHx8fn18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WGhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4OCgoJ/gHt9f318fHx+fXx9fXx+e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4eIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9/fnx8fX99fH19fH17e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhISFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFg4aGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYKCgYSFgoN+gYKBf4OBf35+f35/fHx9f317fX18fXp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4qHhIeFhoaIhoWHhYaHiIaGiIiHh4aHiIaEhoaGh4WFh4OEhYSHhoaHhYSEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAhIODgn2BgX9+g4F+f3+AfH98fX1+fXt9fXx9eXp6eXt9fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEhIeHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SGhoaGhYaCg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp7e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICBg4J+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiFhYiHiYeGhYWFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhYKCg4N/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18gH59fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn1+f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYSFhISGhoeHh4WFiIaJh4WEhISChYOEhoKDhYSFhoSHhoWFhYaDhIWEhYaFhoSEhYSFg4WEgICCg39+f39/f4CDf3yAfn1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7fH1+fX2AfX18fH2Af318hoOGhoaGhYOEg4aChYGBgH9/gIB+f4GCfX5/f36AgIKCgoSEg4OBgoSBgIOCgYCEhYSCgX+AgoODhIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhISGhIaGh4aGhYKEhIOEhoWFg4SDg4SChISAf4KCf31+f35+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp8fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4F8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFhIODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7eXp6eXp6ent8eXt9e3t+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU1NPU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nj07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT47QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vKysrLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1NTU1NTU1NTU1NXV1dXV1NTV1dXV1dXV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0NHQ0NDQ0NHR0dHR0dHNysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fV1dXV1dXV1dXV1dXV1djb3N3c3Nzc3dzb29vb29ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtBPDc9OUFDPUA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzZaEhoaGhoaHh4eHh4eCsuLd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi60dTU1NTU1NTU1NTU1NiufIGCgoKCgoKBgYGBgYOLioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZNPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5uUFNTU1NTVFRUVFRTTKDz6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6Oips7T0tLS0tLS0tLS0tLZkTtERERERERDQ0NERENGU1NTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj87PEJAODw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zOcVRYV1dXWFhYWFhYV1Ch8enp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpKfN09LS0tLS0tLR0dHS2ZRASElJSUlJSUhISEhHSldXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw8PDw+Ojo7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNznheYWBgYGBhYWFhYGBapO7n5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamsztPS0tLS0tLS0tHS0tmZTVRUVFRUVFRUVFRVVFZgYmJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj08Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3HxcXFxcXFxcXFxcXFxMvQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Pzs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tXV1dXV1dXV1dTU1NXV0MvLysrKysrLy8rLy8vLzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz8/Pz8/Pz8/Pz8/Tz8/OzM3Mz9PS0s7Nz9LOzs7Ozs7OztPU0M/O0tTPzs7T08/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXU1NTU1NXX19fX19fX19fX19jY19jY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztCmksXR0qig0M/RpKHQzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PUI+QkJAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztKqnayUzrOeo6fWr5+hqdLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DJl5mFpauhmpOdwJ6YlZzI0M7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw5Nj9CP0I6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0aSwvZqLm6GctJicop2wstPPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Q1bmch52WrbmGnpavs6rV0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw9PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P0NGaoo+cgaCWeJuEnZOk1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD09PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NWnpKWsm6iInHmfqYWZpNXR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQTg7Pzw9Ozw8NzU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NLAnaLMtrWvppyKva2mmK/W0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0Y/SEhHRUA8PD4+PD09PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPUpKCPucCjl5edpaeWmJu71dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQzs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HIxqa9lZGoo6ukm9Cfq6Sc0dPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg1MqOk5eQqMmQjbfXwo+NvNXS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw8P0dFR0tIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLUwq+ws9DVx8PV0dXFxNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dTW1tbS0tTV09PT1NTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY1ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUQ/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKinqKinqKmpqqelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6ioqKeoqKelpKSioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnpqWnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqOioZ+fn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqSkoZ+en6CgnZydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWjoqGhoaGio6WnpqanrKunpqCdnJuhoZ6am5udnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqenp6efm5qboqCalZeWmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiYmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWjoqWmpqWmp6amoJuZm6Gglp6ikpianJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQj9EQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWkpainpqKenZ+hn56pn5CUl5udmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6ampaWmp6alpKWmpqWjoKChoZ6neY6PlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2dn5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaGhn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqSlpKuwo6Sko6KhoZyilmGRlZmbmZuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnJ+hoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOqsKuio6KhoZ6apnNfl5qZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCin52bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5ydnZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChrZKopaGgnpybnZ9dZJqbmZqcmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoqKioaGgoKiXgayfnp2amKSIWGaZnJqdnpuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuam5qam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2fnp+goaCgoKCjpG+bpJ2cmpqleWJmmJybnp6cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmpiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnp6enqd5h6SbmpydoHhrZpOdnJ2enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PD45P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZybm5yifoCcmZubnZV1amePn52cnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mZmZqaqn99iZOcnJuIcWhojp+dnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnJ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJyZmJmZmKJ/hoKCmZ6cgXBiaI6fnp2enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ucmZiZmZegm5t8epujm4CHa2WQn56en56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubnJqYmZmbqZyIZ26tqoxog4FslJ+eoKCenp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJmXoKaIdF9lnpaCV3J7epucm5uenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qblaKedFJNb5WEeElZcHeRlJGOkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CRkY+nlVM5QHSJcWdFOlVvgYeGgo2LhomKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGg4CKqHlOaFR0i3dlT1VDX3d+gIKSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgn5+gqBfdYxif6eeiF2Ge1Frf32Fjo2Lho2UkouQl4+Ul5KYoZaelpWbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiKhYCCfYyWY7nUj726qbeHdHxpWX+Gio6LjZCZnJSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYx/iI2NjIuHkomVgoHPxJzVrZqwnl+CcVR6kYmJkI+Nj5SUmJCVnJqdnqiusq+wtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTg3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmRnqGdk5eboZqdm6OhnG6PuqS40bGorpNss6dVdJSPi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVKVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6mpsKN0jZV+sbyzq5WHXZbEbG+coqGknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1lLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipamnqKqvkot2e6eXjo9/emptkXpvlqOop6Cioa6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1ZaTlJOUE9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmZyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkqKaanaSlo6Ghq5R8W2mRfnuAcm9rc3F7e5SdoqKgoZ+hoaignJ6hpaGgpqOinqShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1hPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioKOnoaatp6eirKd9bFNbd29xdmtnZGpmbniBj56goaCenaCjmpaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjX3NfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKhn5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGnqa60t7a5tq6PamNPVm5ra3NoYmRiW2Bmb3aAjZujpaGhopiVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan5+hpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY21qaWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqm0wsbGyMe/s6aSdWJgSk9vcW10Z2BnZ1hdW2BnbG91fomTnKSfoaGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7LA2OHe1ca3qp2RfGdiX0ZSam5xeGhgYmlZW15bXF1hYmFgZnyhvb2opJihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odmxwaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW2v8nV1setmI6CdWVgY1xBUWxodXZtYmNkWllaW1hZW1lXZ421wL+2rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFpYGZzb3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PDub2+wcjQza2AZl1ZV1xVQkpxaG1ncmdhX1hbV1lXVFNijrzCuLe7sLW2qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV2bm1bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvFwcXFwcHAvY5mVlVXUkhEdGtiYG9nWVtZXVteWGOMusW+paWxtqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH6Ef2lmaGFrbGdudnFydXFnXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/w8PGxsGxlMfKtoVeVlRPR2JogIuMVlVdYGFdYoOxwbmusqerqKiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8fnRrbG5kb21pcXhueWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMS5tcC2tcnPo2tVVVFTX5ippVFWW15eZpXAt6ars7WtrqWko6ekoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5eXt2bmtpaHVaZnJ4c3lmZl5kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDxMLFvre9w8q6fVVUVEyPrZ5NVFdXaJa7tLGtrLi1sqypo6GtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVmaWpoXWpvbnl4Y2JhYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMe/xcfDx8KLWFFLhrCTSU9VaKDBvb+5vLq8urysraapu7q5t7+ytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aGlpdG15bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnNxcXEw8XHyad0TXqyikdOeK3MzcbEwcTHwby+tLGwsMK+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGtqd2xpZXVudGNdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFwcHAwMbLw5NkfWRLg8nJy9DFtr+/wMC6u721s7PAv7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVnY2pkYmptbm9eWV1WVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHCvbzBwMDEk1BJc8nOxMjQwa+9vbi5u7u+t7Sxub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFjY2NqYmdjW1paXVlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Bu7/AvLvEvbrAxL+9vLi7v8V5SaDNxL+/yb+wwb+6t7u+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhYmNoamdnaWVpXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdWOvL67w7W6x7e2ubu8uLm1usTKl02lyMC/u8G+uca9wr+8xbi2t7S4tra7u7m2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHFtZWVmcGpla2hYWU9LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vNDFea3Lvce3ubittrS3ubO1srvFyp9QpMm/v769vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfGtucGdwa3NmYm5gXFRIS0tESkNDRz46Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTYrnaEvsjPwsC4rrW1u723ubG+w8eYUaLOw8K/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHFmbGludG53Y2diXGNRS1VIRUVDR0I8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsfJ0Zlzd7HR0czKxLW6v8TIvr60v8DDjVWWz8bCvsG8v8PMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGxsbl9jXmFiTkhOP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQwrq+vMS+t7zAv8nPx8jKysKHdXeozMzLzcrGwsPLzsG8uL26u4Fdi8zGxMDAv8TAysnDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1teHxgcWNbXl9fVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u6rdvCvra+wL6+uqacqrO3xMCme3l8n8TGy8jBw8DAycrBv7u6sq56bHrHxsXEv8DBv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnpuc3h0aHBdXF9cWlFFRURNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vFtm2vzr22ucC8qn1uaG5tdIKXmXV6f5y+v8bAucC8vsXEvb24sbGghntxvMjDw7y9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bHV7cG5pXF9fWVNQQUZJR0tARUNIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbF1grS9tbXBpIZpWl5gTlNbXHB2eoWkuLfCurO7t7u9v7q7u62uop+Kg6/Fw8O+vL+7u7i2wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBe4J6c3Z2d25xYV9mXVtVSj0/P0dGPUdDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmmhHeLorC1nGpmZ1ZZX0lJTVBUb3uLqbC3vrmytbK8uby2ub6yrbCpl5SVx8fDwL2/ubOusry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYVxeT0lCPz1JREZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/GqId7doyhmF9TQ1lVSGJqVU9FSmWRpa+vtrq1tLKsvLm4tbjBvaGxsKSjer/Iwr+5urWupayzsaawraidoJ+lrba1wre2tKWoqqiwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0traxqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3ZybmNdZlldXVNPTkE+SkJAS0pANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7OQgXmIj25OS0BlWUJPeIGTaE1DXoWxtbO1srSvrLu6uLa5v8WMtb+urW6svri1srGtrZ+kpqedpKWclpmZmZ+prrmsq6ufpaikq66vp7Crr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWxdW2pUXVtQTkhER01CRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7e2lYyIhHtYRkFPh1hJSll4joNjQVWjubO0srCxrbC5uLa7t7q+nrC1rq9+rLCpq62ro6ihnZ2el5eglZKWl4+Yn6iupKOkoKKmoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh1dG5lVWFjV11RT01IQElSRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yvKmYmZRoTT9TeXFPSUlMaJ1/WkVVsLqxrLOvrqyttraytLWuqaWdmZqcnqeonqCoqZ+hp5abl5eOnZSPkJaNl5ukqKCgoqKipaWdo6OgnqWgpKylpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKurn6aim6OclZCMj5CQk5CXlZaYn56em5mml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoYh4g3x2f3pjd2xuXVFpVFBOR1BNTENQUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3BqqW8ZkRTnH5QWElLYUlXjWJlZYOvtaqytK6qq6+wsrOtpZ2Rl5OPmKCfoqCco6SfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6OoqJynoaCkn6yorKygqaumoKSopqyjnp6empeaq6aqsaOlqJ6gnJWTkI+RkZmQlpWYl5+YnJmbo5mXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J+fH91dn1ua3tkaFZSZE1KSEdPU05LTkg8RUA8Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaCrxr/Knk5BdpluT21KTGRmdnRhXWJ0krKvrrO1qqasq6KbmZSNkZWWmJicn6KinJ2knpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqKlopqZnq+orrKrpaqqoJuYmJiVk5aak5WVmpabl5eYoZ6cnJaboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3l8ZXl5YGJTVWBISUpLU1RJU1FNOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpMfGi1ZTSmajWWZ9b3JbUmtjXGdiYG2RtLCwuKymoZydmpSXmpmQjpGVkYyOjZOZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKxtKqyrqOZnJ2eoZibm5qYmZuUlpuWmZyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnqCeoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1tZTVFKT09WTVNNQjc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp+qo4x5VWlxd3VvY3d2WFdiYGRpW1pXaK2urK+nn56ioJaQk5ugm5mXkpOfnKGjm56blp+an5ebop6loZ6kn6Sora2orKmkrLS3trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwqKuos7a4s7itsrSkoJ2loKyhoaKhoJqYlpWfm5uYpaGgnqOhoJ6bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCgHx4dmp3dV5tW1JgSFJVSEZVV0pDTUc9S0g4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCjf2+CcGBjV0tbUlpMTFFZUkhPTkiZrKqppJ+fmZKSlJiYlpaVjIiLjpWdnJ2dnpeemaafoKilsaqnrqOrrrawtLKxrra4vb+6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquusbm4vK+zsLXCvLe+s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+oqKWknp2qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cm1pd21obVxYW0NXTkpHTUdDRk08Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKOenIliV15lYFdNUUc9P0BDRD8+QlJ4qa2pqqWfnp+io52enZqcm5STlZSenZiUhZ2aoJqrpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsS9w7y3s6qzraqztK+zrqqvo52sqLaxraOwpqCjsLGusKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhoF7dHJra3VycWhWXFFGVUhESlBJP0VBNEZIOTU8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqgn5V8X15lYFBGRTtCPkY8Pjk2Tn6qsqejo6KgnqWrpZ6XnJSRmZ2ZlYyKhoiGeG2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNPHvr/Awr7HxsK3w8rJw8HGvrq1uru1u7ewtrKqurKuu7i/u7qruK2rqri7tbyurrmjpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrY2lveGtlWVtGS0xFRFRMRENFNzo/OjU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9cmlhV05FPklZfG9hQT1cjq6soJmbm56emZeXl5KMjpaXk46NkIyCg4J3cnFtcI+mra60ucW7zcfLv8LMzc3Mx8nRzMzMx8nFxczQ0tXO08m9wL/Du8bFyMXR083U0NPTzMrCxcbGysjPwMnRzMfGyMXCvMPBvr+/tr6zrb/Aw8PHxcfEr7+5sri8xMLCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpaQ05MREZQSURDQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjk7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ6VaWZcVElEQD9KhZ6kmIOgsq2jnpyfmpiXlJKUlpGQj4yHg4OIh4OAgYGAeXFyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0dfNxsfJzMPFys/K09fS19LV1tPUyMzHzM3K083O083FycrKwcfMx8nJxr/Ds7PIxcvLy8/Hyr++v73BxsXNzMnJwMPArq+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkIuAenJ1dmdjZ3ZqZFZXUURORkBKUUI+Qjw6MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hm2FTTEpEQz9DU7DSvbKvppycnKCkoZ2alJOVlIl9eHBrZWJocm9xe4WKgHVwbnF0cIWzw77F0dDX1tbS1s7U1tfU09HT1NTTz9HD0NPW2NXW0svJztHLxs3RytLV1tnW19PX2M7Sys/RzM/QzNPQwMjHysTMzMzOz8XHyLa/ysDSzczPxsrIv8TDyM7N0NHPzcrIzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGVyYl1SXElKR0FFSUo+O0E4PTU1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoqFZSUBBREFGUXayr6ealJefnJqgoJ6bnJmViXdpY2FfX2BfXl9fXWFsdXNwcG9scnF1ksTIx9TW19fX09bQ1dTa1NTOz9XU1NHRzNDO1NfW09XQz9LT0cnT0cjQ2NfY0dfR19nU1czPz8rN0svO0cDGw8jGz87R0dLIzM3Ay8zG08/MzsjEy8fHyczK1NTR1c/SzNPCucWxpai1rqebqKulnbKosLOtrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNQDw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD9APUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu319TV2dnRztC/vMzJtr6upqqooaOrZUM4PT5EWIKqqJ+XlZeZmpyfnZicnJJ9cGVjYl9fYV9eYWBfYGBfYGVtcHBua29ydneczMHT1dPY2NbZ0dLS18/TzsvSzdXU0crPzNPW0tHWzc/V1dHF0dTL0NTV1s7S0NjY19jLyM7Eyc/MyszAysDIys7O0MvQzs7Mz8/IzNDQy87Kw8rHyc3LzNLTzdPS0dDQyr3IubCuu7m1q7awrai4rbO+u7Gaj6CUkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FlbnBhV1xaSUZGRE1YRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HBsamsramksXlIRkI7V46hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYV5fX15cYm1yb29zdHZ2eaS/zNXR1tTT2NbOztPLzs7FzsrS0s/Hzs3O1MzO0s3L19bQzNHUy8zQ0tPKztHV0tXVysDKwsXNwsjKw8zExsnKy8/Lzs3QztPMxsnPzcjHy8XHwcbKzM3P0cfQz83OzNDFx8G4ub3Dw73DuLKyvrG7w8O1qpiloZiWkpWVkouUjZqRlJSPj5WCiYZ5cXJrbWdgYHFoWVhoVk1HTElQUUI7Qz47Njg6ODo6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfDuMrV1tna29jMzM/I1tXEwrWvtKifrZd4bHBxeZCbjYyXlZCTkZGVlpWQi3xlYWJiYF1eYWNhYGBfYGFhYF9dW11ncnJwcnNxbXJ5pcfTz8vQ0NPUysXJycbGv8PFz87HxcfNytLIy87NxtHS0M7M1MrHy87Px8fP0svQz8a6xL/Gyr3Cx8nOxcPHwMfNyMTMy8zPyMTE0MjGwsbIxL/Bx8zLy87Cy8zJx8vQxMXHu8fDyMnCz8G9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+CeG90ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLnMzMbQ1dXY2tvY0MnPz9HTyMK3u7uto7Z9aIOFpKuUjo2Wj4WDg4OBfYSEfnNfW15eXmBeYGNkY19dXV5fYGBfW1pcYGxycW9va2xvb3250cjJys/LzcS6wMO7u7q6vsnGwsPAw8jKycjKyMHFzMbIys3JxMLLycHBy9DFy8i/ucK7xse+wMbPy8TAw7vJx8m7ycfFysC+wsvGxcS+xr28wcPFzMXFvMDJw8XH0sXByb/KycbIxtHDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhppujoJuVfHdzdGZpWmFubVpbWFJETEZCR0VMREZTQDU0MzM1PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+sa+1bF56fKGRi5KWhnqAhYV/dXh1cnBfW1tdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lrcG9zj8e9ysXLwMbCsLa6srKzsrHCvLy8urjBwcHEvr25vb+5xMrFxsK9xsC4u8PJv8HJu7e7usbDv7zBzsPGvr61wb3Du73Gu8O6tLzGxMLCt7+2tr6/u8zDvLW6yLq/vsvDwcbCxcnHycbQxsLMyLLHycPOzMDFw7+9srewsqeoqLmwpa2wqq2slHp2d2pkZ2Bob2NWXllKRkpGSEtBRUJGSkA5OjY1ODg1NDs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysnGzc3O0cjQxdXU1tfNys7FycXHwbnFvauupV9kdYOTi4iLhHh/hoZ/foR7dHRjXFxdXmBgYmNiYmRlYl1cW1xeXF5dWltcXmhzcW1nZ25vcnmdvczAw7rBuK2wsaeqraynuLS2tLOztLu2vbG3sLWvsrvCvMHEvL+7tbK6vsC4yLm0u7fBwr24vcfBxLy1r7K2ur+0xbe7tau4vb7AvbG6trC3urPGvLevu7+1t7XFvL7DxcDExcbHy8XAxsa7x8vAz8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25dVl5gRktISEpGQkRBRUU/PDo1NjY2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjJyMrIysTPzdLPzcXHwcbAv7q3ybaqsJhbaG+Kj4WIiXp4foaGdneBfHNoXV1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaWZqbW5yfKTHwLi4tbCrrKeeoqmnnqqss62qrKq0rbaxs6mup6yzu7q2w7m6urGrtbm7tMK6sMCxvry7trzIucO2raqosLLAtri9sLGnsbO0u7yrrrWmrrauu7Kxqrmwrruuu7i7wMC+usO/xsPFwLzGwcfLuMXHxb/Hw8O6xMbCu8bJzMuzucK9u7OJc3d2a2lgYmxoWFdXW0FMS01KRUFDP0ZBOjk6OTk2ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcTQx83Bw8a/xMTDw8rCycq/wLzCurO1tcOuqrCRW2p/koeOj3t4fYmFenuEgXduXl1cXF1fYF9fZGNiY2RiYF9dWltaWl1aWllaXGVub2hmaGlrbnKBrbqwta6lpaenmqCkoJqcpautpKiiq6qsq7Cjpp+qrbS2sb25r7ewqK64tLO8uLS9r7i5tbK8wbLArqWoo6uxsrOovaqrqKusrbWzpaiuoaSvqbKmqKiupai3rLGyt7q6u7K8vr6+xL+1wcHHyLe+wMS3xMO/u7/Ewr7EyMzKv7/DwMCph3N0c2ppXGFvY1dWWFBIWVJTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDx7m5y8HLvrvJtr3DvrrKt8HDwbS2vLaxr7W7rairkmRtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYF9eXVxaWFlbW1lYWlxfZmtmZGdlaGpvcoWqpaylnpyhpJSdpJqXkaGjqaOjn6Wmp6atoJ2cpKassrC2t6exraiqtKu0urG2tq62ubKwurqxt6WgpJ+msairqLmqpKenqKeyraCnpp+bpKasn5+no6Chsa2trLK0s7Swtby2u8HAsru+w8GxubnCs8G+wLW4vL2+vMLHxcPEv8DEoIN4cGxiZmBrb2BVWV9ITmdPVEdGS0Y8PUA9Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7Pjk3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLS2vbi6wLq9tqCelJ2hprq2q7Ozu7PEz8nLw8a4t8fAzL+4ybe7xbizxLizv8CstbyyrKWvs62ho5FpcoaFhoB8eHVzb21qaWlwaV9gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dna21viJ2pn5aVmqGWm6KYlYyeoaKnnKCfpKWip56bo5ugq7CtsbWkqaqqrKyktLitt7Css7avs7WvsKqfnp+jorKlpqm4raKmpqCorauZoJ+emZ2fpZqao5ycnq+pq6iqq62tsLK4r7i5urC2vLu6q7OyubO9tLaxsba1v7a+wL7Dwru6vZeEenNrX2VeZGRYVFddSVdcS09HSkpHQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xc/IyMDGu7vDw8++uce4t763ssK0sbu7rLm6saKeqaunmJ6PbX6Fhn94cm1vbWtiXmFmZl1dXl1dXVxdX2FhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3KNp5yTlJSal5qhlpaQm6KhqJ6cnaWnoqWcoKGbma+urq+yoaWjrqunorWwsrKsqa+zp7qzpragop+co6Gto6Kqtqujo6aepaajlpmdl5mbnaCal52cnZytoauno6Omrauys6q1sLKrs7m0r6qvsrKzt7Ouqa2usrixura6vcC4s7GUhXl1Zl9mXltZVlNaVUtbUUxJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vL+znaWjmKWxwrW2va20uMHMyMa/xbbBwMfOt8DEvbO5ubO/trG5u62ytK+fmqSqoJSaj3h/g4R/eG9xdHFoZWNoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqCbk5OPk5aWnpaYk5egnaGclqChqaSfn6mdm5urp6+wq5yjpLiqoaCuqLaqp6etsaS4sKS3oKOcmZmqp6GarLmvoqGknKKgoJOUoZSWlpuYmJaXnJWfqZ6ppKKdo6qqsa2otKyqp62zsKWqrrOxsLCvr6eop7KusbSvvLS6uK6jlIF6dmVfYVZZWFNSU0tNXkxQTEdITEtFPUA+PUI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvre9rp2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGuvLu1u7y1ubmwr7CqnJmhqZSRiouAgHx3cWlscnRwaGhlZGZhXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmJjZmmBlZKUi5GTk5qYnJWWnJ+cn5agn6empKann52gpqCqr6afoqO3qKGhoqizoqWopbClsa6stZ6hnZaVqaGilK2xsZ+jo56emJuTi6GUkZOYmJOXmJiXnqebp6KimqSlpaukpbCnpaOrq62mqK6vr6uoqqqzpaarr7Sxrry2sa+voJJ6d3JlYVxbXVhOTFFIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepaast7u8wcW6sbm1xMnJwMPGxce2xcSzwb/Fq7e3vba9uru1squtqJmYn6OLiXSJiH52bmNhZmloZmdpZmlsYF1cW1paWlpcXVxbXF5fXFpaW1lZWltXVVhXVFRWVVJUUlVgYF9gYV9hYWNkaYCSkoiPjZORkpyUlZakmaCXnaCloq2mpaWjpKOdqqulmp+lsaqgoZ6lq56oop+urKmprq2ioqKVl6KbnJCrqbCcn6Kfn5eZk4qekY2Sk5aQmJiTnKGjnaShopWgoqWlm6OrpaKkq6SrrqWusqmmpaamtKapqK2ztbS5urCqrJ6McnBvYFtXVlVSRlBOSFpcUFJJVEtTTEVHSkQ4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tKy0u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm8sb3DyKyxuMG1vMC8tLWqrKaVmZubiIFyiIN7dGlpamxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSUk5RWV1cXV1eX19fYmRtjY+DkIWOkI2Zk5SSnJqinJuhqamrqKynqaakmaWvpZWZpa+poJyZm6Ger5mcq7Ogpaafo6ShlJOblpaSqaqtmp2goaGblJCMmY6MkYySjZaVkJ2ioKSdm6OVm6CjoZiiqKOjqKugq6+krbemo6SirK2qqKuvs7eyvbWzq6+YhXRzaFtYWVNVUkVYTFFbWE1UTlBMUVJJTklCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7evqKivrpupqKy3tqu8yru2v6zLxsW4wc7PyLPEure7wsiwrbi/t7y9u7O1pqmglpeYlod6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXV1cXl9hZH2LgIp9io+Jko2WkZeZoqCboKuqpq+sqLGlqZqfraGVlqWop52YkI+anq6XmaiqmZ+dlKWhn5KRkpGTlairpZqZmZ6elo2Mi5OGiY2Dj4uSlZGgnqGkmJWflZqhop6Um6WmqKiooLGwprG9qJ+jrLSqrqewtbC5tcCxrrGrkX5yc2JWVFZOUkpHVlBSUkxMV01KTU9SR01LQUNGREQ+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OsprG3qqWisaudqqepsrCktsa0ubqzysW5usHL0Mqxtre8vcHDsa+xt620tLuztKKjnZ2Xl5SDgHZrZ2xucW5ya3BrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqf3l+dIeMhpCJl4mUlJibmJ6pm6CrpqasnqiaoKack4+fo5qXl4WEkpukkJWjnZaWloiim5uTi46KkJqlp5yVlZebkZKHlI6LgYyNgJCLkpKSoJqhopaUmJiVoqaZjZmkpqmmoaC0sqeyuKGcorasqa2ksrKmtby1q6yxo4l5c25dTlFRTE9DTU5OUEtGTk5KSk5OUUhNSkFITEhIQz44NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS2sKWnpKqloKmmpLOqorLDtbWys8bGtrrDyszGs6y5vbS4wK+tqbCepq66r62fmZqdlZSHe4NuX19mcnB2cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFtdYW5xdW+Dh4GHf5CDjoqUkZOdoY+anKOipJmll6KclY2HmZqMc42Dfo6XloaRmpCUjo57mY+djIKJf4qYoKOekJOYloWOgpR+fnSKjXqQh5OQkJ2bmpqRlpCdjqOjjomaoKGkpJuitK+ssKyfmKW4pqaxobCunLC8qqmvqpmDd3NjVk1ST1BNQ1NOTFBNQlBRSElOUk1ISkpES01GS0s9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKmmpaijpqWmpqazp6W0wbiwtLDJxLe5wc7GvbOsusGsrcOtp6Kmkp2mtq2joI+VlpKQfXd+ZldWX2dmaWdobmNpaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVZZW11panFrfoR7c05Yco+Cl4aNnJeLlJGfmJ2VlJaVj5aJgJSJXztWb3yMlIqAjJKMkIaGc4qFl4F5gXuGk52Ug5WOkZCDhn2TeHFwhox9iYGRjZCXmpiTi5CKnYifmIeIlp6aoaCXp66praionpats6Kmrpmsq5iotKOpraOTf3NuX1tOU1JXTERUSlBNTEZOT0lFTFFNS09KSU1QRklJPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego66hpqaqoKapp6Opr6intMK5sLWwx8K3s73Pv7mvrrXCp6rFqqKdmIOUnLGimpiGlI+Lh31zdV1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNT1JUVlhaYGxuZ3qBc1BCP3+VkpF9iJWMhIqNm46WlYmSiIaVhnmJf2BKUW54i5KEfYSNioV/f25/f5R4dXZ4hI2acFGNiIqGfH54lHZod4aIfoqJlouOkZKWjISKiJWEm42ChJKalp6dlKSjqKmlpJ6bsKqhpKSRpqmWoqqcoqaoiXZtZl5bSFFRU01JVU1TSUxLT0lIRkpOTE1US1FQT0ZJQz03Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk4OTo5OTo6Ojo/OXe2nKOnnZ+hr6GnqKWnqK+sqrW8tri2s8G7tqi5yLi2qKi1tqqyvaaelY1/iZOolpWKfo6Dgn13cG9YTUtNTU5MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3J1fWloXFSQiZSIdH6GgXyFjJOCkpqLj3uGj4B2gHhzb3ZwdI6OgXp+iquEeXtodnuOcHJteIGLjZJ4eoB7gHZzcpJ4Z3WEhISFfJWKiIqNioB/hIuNgJSEfICPmJSclpGfnamen6CdoKmlnp2YjaekkqCglp6fpIFzaGFdXEpXUFJHS1hST0pMTVJKSkpMUEhMUUxSVE1FSEE9Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6qlrauwsaq9tLK8uLa6tLGft7qyqp2drKmosrChmpGNlIGOnI6RfnaGeHx2b29pWEtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnSCe3hmdoyWmI2OfGd5gXZ4gImQfYSYkoFxh498d3tva36tfXSQi397hpKBfH91ZnZ8hmxvZ3N8iYyHgGx5cX1xbXaPcWhxgX6OcEOLhYKDhX53d3qMhn2Me3V9jpKPmIuSmpujlpmcmp2eoZyWjYulmo6dl46WmJB4b21mY1pYWFVRSlNVVE9QTlBWS05LT09KUk9ITlBMRkQ8PDc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoaawrK6rqKmxr7GrvLisu764s6ynm7CnrJuPlpylqaSgmJmPhZJ5iI6LinVxe211cGptalhLRkdFQUBDREhMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTk9RVFhdZXBybIinqsB+dHlie3hve3mJkHp9i4ZvbYySeXR5amqAgnGWkYuBfpaASZKYbmh4foJtaWRseYWQkoZrc2x8bnJ8hmlucH9zjYmEhnt+f3t2b3R0hoJ5gXlwfI6MipODlpeYmpCSlpeZl52WjIOJnpKLko2GkJaAb2pvbm9YVlhUUlFZT1JUVFJYVU1OSE1KTU9LQ0lOR0ZAOjk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrLCjraqota+urLS/q7zDv6WimpWkmJ6NhIuUoaGZmZGTi3OOeoCGjIZ0b3RrcGxkbGpZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXF+nh2GaaXN5ZX5vbX96i4l2goiGdGyaknRzfGpqnY9NeYWTiYSOZzF2hnNsfn2DdGZldX+EhIWAZmlsdWtxf3xocXF8bpONj3x0fn1xcG51bYJ/d3l1anmJgoiJg5aSkpCLjZGUlI6XjYB5iJeIhoqGgJCId2trb2hlWFJaV1lZW01QVVZZWE5JSEVKSkhHQkBHRUNHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVukoiakZmWo6itnrGep7qvq7KwwrG7w8ealo+UmYuOhXqEkJiUjZCMj4Zxh4J0h4yGeXBycG9vZHBmX1RGSUM/PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+yoHF7eGx9bHGDgoWBeoSGhnlyoZV0eIBzdZSHNXGdqJ2OoaGEooV2cId8h3x0jK6NiYBoZ2JqbnJtcIJ1aW9YdXCOm5J3bH96fW1ybnCAe3N2bmJ2g3+GgIWQkIqKiZGLkYuLjoN1eIqOgH6DgH2Oe3NxcW1gW11eW1lYYF9STltaWFdMSEpGSkc/Q0FCSD9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp5+vlaW0qa6xrsGyu8HFlpCMlI+AiHxugZCSiYOKh4+GdYKEbJWIiHt0eHhsd253Y2leSlBHPj82NDQ5Ozs7PT5AQkVITExMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx2iIh8foWDf4x+daKZeX6GgYSZhJqcYYaqn52Lg5CNeneIfomJjnOLl4+Eel1kcXR6fHeKbWhqYnlvhZCCem6Bd3SEenB0eXhrbmlddoZ8h3yHh45/ipKXg42FjIZ9cYR/hH11d3t8iXdwc3RmZ2BbW15TW2deV1BUWFtVR0pKREtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIyRnJ2fppGgqqCxqK/AsbrFupaOkZSHe4Z2a3+MkYJ9ioSPjHiDgHOghIp8fIF/cIB+emd2a1JXTEBFMjExMzY2Njg4Ojw+QUVHRkdKS01PUVFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmiEiHuJeXxxfI+Men2Jh36Xh3ahmYiHj5KUpY2sqkiGrq+vi4GAk4uCi4KEkqmHgJiYipt0bXyBhod9jmhnaHl/boWHgoVxhIZHbIB3cnl2aG1rX3Z9goh/h4SLeZSdnImLiJF/enWLdnx4bW93foB0dHJsW15eW2NjWGdlW1RPUFZZUERMS0ZOSUNGQ0NAQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFh5GOlpeSl6CerKGmuK+zvbOXjZKLmIt9dHB+iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyNDY2ODo9Pj9CRUdISk1OUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWHBZXF5pjZOHlYCEgoWRk36FiJGBmpWCoaGYlZubpq2Tmruxp7vHw6iLjKGlj5SKgZF8cYOen5Gcf3aGhYuQh5BqaG+DgXSNh4SKcYWCd4d/e3aFfW52dWZ/lI6GiYiHiIegq6KViY6Xf3qCiHp5b2dreH57fnRsZV1aW11qXWFmYFpPS05XUlFJUEpETkdDSkRCQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZneDe4CMf4GQjoqam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH6ShZKVf4qAkpuOg4CBjIqCiY2Df4qAbXBqXUJANC0tLy8uLjAyMjM0Nzc4Oz0/QkRISU5RUlNSU1NUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WX2N/Z2dtdZ2bj5qSk4uNjpqIko+di6CgkqOqpaOsk6m2oqjBwq7Hr3i6lJp8jaGemYSThYKOop+TmJKEioWPmZGWbHB1iYyCloyNjnePhHFthYGKlpGDhYhxiKCVhpKJjo+WpLWpm42UooOHk4N9f2tqanyBgYJ0Yl5kX1tna11sa15XS0dOUlFNTExGSVBDRE1GQUNFRkI9OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lvgm91hnF2koZ+l5aalJ6enKegqZaTmJ5nZaSafoSSkXl/koiRkn2KhJiSkIKAgIuMiYWQh4WJhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOUFJUUFBRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZunpaKZoZeilJyep56oq5+orKmqtperv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGam5mnkZGIlaKbm3h6fpSYkqGTl5eBlJ57d5WSq7KIjZeffJSdm46SlZijoqa2r52RmaiHlo+NgYhsc3N9gH1yaWBdYV9hZ2RgZ2ZbUkVKS1BPSUlMRkZNQ0hMRkdEQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHRgbX1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJi4qEkoWDhomBgIZ2XmJQNDYwLTEvLC4wMC8vLi4wMDE1PkFCTVFSU1FSU1RSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpOT1FZbYWQd5WKo6eqtL24pK2srKeotKuwtrKyrbuxs72cs8OrusnLt8O/uKWisLOsraqji5aYhaamoKOXgaaZjaKrqKSIhZSkoaCroaSpj5uwi5Wjpre6m6CjsJKinaKekKOhq6+ssrSilKSqiJmJkomVenp9hX9oYWhcZWJdZGReZmdfWk9DSUhTTkZITEZKR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGhjV2lvWHqFdoGThYeCm4OSkIyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5COg4WAi4WGh5KGgoSJhoiHh3BuYUBFNjQ8Mi8xMTAtLCstMS4tND9DQU1VUVJTVVVWVU5bUEdHRDw+PkZIQ0VAODs8NUM7PUZLSUdIUk9QV4GSoISuo7OqssDHw6qzxbass7+zuL62v7TBtru6o7jFqLbJx7W+ubWoo7StsLGbmZKan4inr6ullHafpJehrLKzmJaqrqiutruyuqyvtaKxq7G1u7e0rrSgp6ijp5qpr62yube4ppu2qIykjpGSn4Z4goN2WmJlV2ZhYWNgYGZgW1RJRERMVVFISUpESUdFQUBAS0RCTUc8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWlFiY1d5dXGBlH2EhpN1hX+AjHu/u6O8grSUk42bj4SIj5KJiHmGgIySjIeFgY5/gYmOhoCGiIWKh5F6eG5dVkBFTjw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFZPXlVJS0pBQD9HS0ZGQzs+QDdENz9CSkpFRldUUF6PpK2jsbTDtrjBzMm2u8S9s7PAtrjBtb6vt3Sxs6W6xKSwxrmxs7G0qKS1tqqxoKKWm6KSpbCupq2sp6SYoKy0u6Kosrq1vL/Mv8XFvb2zwre6uL63ure5rKywprGqrb2wvLvBwauZuqiTrY+Xl6qJfYJ9a1dkYllrZWplV1xjWVZTSUdGTFFHQ0hJQUhEPj9CQktAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldTWVVadmpwfo6EgI2DbnpzeIdiuaGZo4mUlJaSlJONkJaSh4Z7hoGNlYqAhIGKenyKh4Z9ioOBioOVfXd6dWVPXGRHRUw7UWNhW15TRj87SFBFWmNRUllYWmdZVGBgTVNQRUE/SUpIRUVBQEM8RTZCPkhHSkxTWlRdk664tbq4yL+6vcnMu7zAu7e1u7q2vbS6scZgdbKksZqeq72qpairq6SisrWgq6eflZafmJ+upaempZ+jlKOnsbSnsrO9tsG+08nJ08fCxczCysPAvr2/u7y3tK+4t7bDucW9wsivnrmpoauOpKi2iIGAc2BjYl5YYmBpZ1JYYFZRVUlFRU5LQD5HRD1LQT1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWPc2xycnOH1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaLfoN/gnh7i4OHfIt5gYqCl350fXprZXB1WV1cUGVkYmBlZF1bWFdcTWRtVVJtbV9uX1hnZFVZVUpEQktLSEZISEhHQUk5RD9IS1RUVlxaW5O4wLi9t8bAu7nKyrq2ubW4ubK3tbSutraYZHWonK1wXqKsnJigopuknqullJ+fkJSOlpiXp5+ln56amYOknaylqrCtuLC9udTRztbQyczSzM/Oysa/v8LKvcG8wcDExMXKvsjOs6S7sLSvmqu4u5mAe2xeYV1ZXmFaY2NRW2BTUEtDQUVGRTxART5BSEFARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVxZaF9vl5KQlG5sb3V1h7OsoaCfi5mcmYyNlZGbkoWKin6Ih4uQi4h8gYRze4qDhXuJdIGJh5V/c3t5a211e2hyZWlsaWZqaWhgZmlobFptc5atpLyIh2dbb2hdWlpUSEtOT0pLUEtTUUhMQUpHSk9fXmJmaWGXt8ewuLK7vbWxxMa1sLiwr7ursrGnq7esjLWnnZqnmk6anYyOn5aRppillYqTk4mQiZCRkZ2boZealZaHnpqnm6yvqLCntLTU1NTW0svP1NXN08/NxcLJ0L/KycrJ0cfMzcLQ0rivw7zEuaW2usOig29kXV1eWWBXWWZaUV1XT1BCQkhFQkg7QUM+QUc/P0E4O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VWc5CQmIJocW95eYOgqp6lloyam5eLjZWRmo59iYuFjYqKipCHfISCcH+IgYZ7h3KDkYuPfXF4dWtxeH5xe254c2xogXBtY2ptcHhpd3x+y7/B36duY3huY1thYEpQUlVOWV5QXVxOUE5UUVVUXG5tdoJxlq24rLSmr7aqrLzAsKu0pqS4pquuoKu0oo6xrZqXmIyRk5GEjpuBjaaRnImDi4SKiYSLg5SVl5eTnJGcmJmZn56rrKSnoqytz9LV0c3L0tPU0NTRzsjD1NHHzdLT09fM0dHF0tbFwM7Hx8KovrfPnnpvZl5iXVdgU11aUFFUUE9IPkBGQUJFPEBCPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1OW3WGhYp3bHdwfX5/oZ6eoYuMmJOTjIuTj5aEeYWQkI2LioeRh3+Ce3J+gIGHeYR1hZOQiH9vdnJrc3x8d3tzgXdxaoBzcmlwcXp5cnq+y5p+jLKEdnKEdmhha11DWlpbVmVjWGRqU1hdXWBkXmN3en6LgZipo6Shn6CopaqwuKqls6OhraGjraGnsZ+JppqTkpGJkY+IgZSJapSijJmEgIV+kYODk5ati5WNlZqOhpKRnpensKGgoaWkqMjOz8jCy9HU0dTTztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMPDzIxzb2RhYFhUWVRcUEtHSkpKQDs6O0RBRDxCQz5HQj5CQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJ2VnZSFi5WJj4qIjoePf3iDlJiKjYiIi4l+gnhze32Dh3d/eoeRloCDbndwbXV/dnh9dIV8eWyHdnRufXaEdXh7nbWMO0GKxaV+jHxpZVdJQ2ZjZWNnamRueFteZmhrbmlugIOIkYucnaCdkJeYnqOjprGjo7OfoaWdoKmgo7Gchp6SkpKQio6LhoOPhH6cm4yNgoSFepR+gqmVo4yRipeSi32XipqSq7OYmpyonKe9w8a5tsbN0tDS0MzSy8nUztDV2tfX2NTZ2M3Y287J2drR1r7LzLR5d29lXltTVlJbVkZHSklFRT06NzpAQEI6R0Q/RENBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjXyXkZ2LfoeSg4mGhYmCh3x4hZaWiI6Dh4WGeoR5cXp7hIZ1eoWOjZ15i3B8b296f3F7gXGDh4Bujnp1d318gnV+e4aHr3NYqcK2jZGCcG5iPV5ocnBxcG54doFlaG9ydXhxeouGjpORm5WflYeLk5ugm56qn6CsnKGamJ+mnp+rmYuajJCRjYR9iIeDhYuOoJmTiIOHfm2ZeYSYhoiTjI2UjIZ7m4iUj66qlJWXn5mnrrW9qa29xsvJyczL0MnD0srU19nX2NfV29fT2dvV0Nva0dbI1MuVenxqaVxbUFNUXkhDRklIPkE+PTc6PT87PUc9P0FBQURBPj46ODZEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OjpEP0NHUmtfbWRiZmt2gIhxkZCagHqAjX6CgoGEf4N8fISYjoeLfoaGgHeCeW57e4eCdHqSno2gdo51gnR1gX10gIRvgY+Bb5KFdHyAhHp2hnuJt8Wkwcm4gpWbj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R2bZOWlJWPl5CDiY6WmZeWpZyXn5aekpKXo52Zq5WQkImNkYKMhYmIgYaQkZ6bmYmFjIGGl3qIiJ+Xj4iNiouCfaGJkIu8oZiTl5qcqaalrp+otr/AwLnHyc3Oxc3J0dbV1dnV19vU19na29fb2trYztzGh3x7aGpmYFRYVVVNTEROQzs9PTw4Ojw+OT1ANj0/QDw/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eop7foB+f3yEe36BkYmEhXqEh3p1fXRtfH2GfnN+kp2RnoORfIZ+eI59eIqKboKagHSZhn2BiIR7fZB6j6iOj8OgvIyco5x9iYR9iXKLin5zppqcmJOFe46QiIRoR3GgpJ2Mi5CShYmKkJKVj5yak5SQloyLlZ+clKCUkY2Nj4p+kI6Oi4SJkpaanp+JjJSSnZGCi3+lmYiEjYOGhIClh4uLuJidkZSWoqehnZ6do6+2urWswMXK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbuHl5eW1rZldgXFNQT0lDTEI9PD45OTo6OTk7PTY/Pj48PTk6OzszN0Q/ODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYX1ZYZm1tbWmBjopxcnmKe3p/fH97h3t8e4uHgX51g4V5cnpzbYB+hH53hZuhmp6UkoCMiH+Yh4Cbkm6HqIV6oIt8kY2CiISbfZqQioyjop+Qo66gi5GLhYuBk4ZXcq2Ln6ubj4OYm4+PjluCopGCjJ+TlIyGiIySk4yUlJSPi4+Jh5abnY+VlpCLkpOFgIuIko2Kip2WmaKjhpOdlqCKiYiNnJCDiI9/g4eFpIaMkLOYnZKUl6GhnpmSnJ2nsrispr3Cx87Hxs/M0MzO19DR1K7W1dja2Nra19bZ2Z9xfnVpZ15dWFRXWENASEM+Pj46NDk6Ozc6OzozOzs/PT43Ozk6MTpIPjozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieW1ifpKDb213i3h5f3qBfIZ8e3eGhH9zcIWCenV2dnSEg4V9fpKmo5+lopaKnZCUl4uKqJdyirGNhKeShJmThJmMopWfmJOJmp2ikqmvn5CVkI2OiJaMbo23hZrEyLKboaWbnJiWkbKRZKTNx5WOhoeJj5KNjZOUiYWKiYWWmZuPkJSThpSXhH+Pi5mIjZCql5ejo4iZn5aaiI6Hl5eKhI6MgX+Hj6WJjZOpmpeTlpmhmZ+Zk52borO0paO8wb7IxcXJyMnCytPNzdSp0tHW1tbY2tTT2s6Dc4FpZF9eXk9KVVtCQUZDO0E9ODM3Ozw6OD02NDk6PDo4Mj85OjI6STo9NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdYKOfHxsfYh4en56gYGCfnZ2gIJ7bG6Lf3l8eHh8hIeLfoujs6ijq7KhlqegpaSWla6ig5C3lZKzmY2hoIukm6+ipJ2YkKeWqJmtr6SXlZWUkIuYmZagwI6jybirmqKlrZmRmpyynYaFqKKcmIWIiY6VjYuTj4eBhoeIk5iUjIuTk4aUmIaDkZCcdJGZspaXpKGInJmTj4qQi5eaiYqWjoZ9jJifipCQnJqZk5iYn5SgnZWfm6GxrqOkt760xcfEvcPDv8bOysnSp87N09LQ1tjSz9i7c3t3XmFWYVdQSEpPRUJDRDU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTw1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdOW1xZSmdhO0iEi3p6bYWGeXyEeICFgX1weHx9fG9zjXp9gXt4houJhYSSqLutqLK9r6Wus7Ooo6KwrIqatJ6iuKWVrKSXqa23pqSjn5mpmKqjr7CpmpmclJWRl6CXmbu7rcmgaba4q7CUmJ6iq5KXvaNeqrKCiYqNlYeRfI+OfYOGjY+UlIiHkpaLj5WNioyWmZKdmrOWlauei5uUko2QkoyYm4qSnpCMiZWfoo2VjpianZObmJ6UoaCUnJylr6iipbO4q8LIxLW7vbvFyMfC0aHGyc3NxNbW0MvTonF8al5bVV9SUEZEPj1DQUE4Pzg3ND5GPDw2PDM1MzU1NDU0QjM6OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGVIYmBjcEpAi4p+gHKGh3yBiXWCioJ+bX19fH9wd4d3jYGHe42PjIaMmqvCwLC+xruytMG8tK2rs7aMqLKurr2qm7ukqK25t6umpqKio6Opr7Kxqp2cpJibmJeeoqWlkqO5rqjAu6ytsrmlpKd9iIacrb2wg4uLi5CDj4ORj3qBh5CNjpyIiI+XjYuVl5SQmpacp5qxmpGrnY6Zj5KOlZCQlpePkaCRiJWbpKyUlo+UnJ6UoJ6bmKChlJqeqKekoaOwsqbBxsOwsLq2xcTCvs2nx8PHw7zV0M3Eyol1dGNdW2FbTktDTEBFRj5BP0I7OjQ+QT09NT02PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxnR2BpZ1pdW5OMjIh7h4uGg4x1hpCKgW5+fIJ/cX6BepV6kpSUmJGTlae0xsnAwszBw7nIvLqvq7m7l7K2urPArqXApKqwu7uqrquiop6nq661sKqboKqcopyVnrC0p4uiurq1wburqJyypKSolISOqcPEpIKLjoeIhIaVlI16g4yRj5GhjIyUkY+JmJ+Xk5mUl6agrp2MqpyOlY+SkZWVjpCVkY+hlIaXn6CznpSblKChmaSfmqCcoJSYnqakpqekr62lv8TCrqm3tcnDvrbOssW+w7yz0crIwbV2em5dWV1rU01JQ0xKSklAQT1DRDw1QUQ7OjM9OEIzMzIyNjJBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJnXE1lXGZUY2qZjZaJi4iSj4aJeYaTkIFygHyNfneHgYKQeo2hlqiampi6vsjIysLSycrCzbzBs627vqe6v768w7eswamss7u9qrCppKWjq660rra1oJ+un6aimKO0vambqLzAo7a2r6uSr6yqq5aGmqmmpZGCjJOllYmAdYqSeYWNkZCen5OOlIuPjZSjmZeblJSjnqmfkaWajI+Pj5WWiH2PlZKSo5qVoKKctaaRn5elpKOlnp6mmJ6Vl5ulo6moorKsqLvAxK+ls7fMwLmuw7O7vsG4rcLCwcCZb3pjWVdcXExMTUlHRENIQkJBQ0s6NERIOjs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+a0lfWGFaZGVWno+djpeOnpKJin+Jn5KEeIV/lX5/kIiKkICVoJmup6OYwr3IxMjG083Ozcu8wrewury0vMq8w8G2truts7+5vK2vqKCpp7atrqmyt5qeraKooZ2rt7ippa++xLG9uLOnqbOzra6WlaWsp6CRjpKxxaeVjXyRlX2HkZmPqpmYk5OPk5WTpZ6TnZmToaOinJifmYuMj4+eiFqQl5eSlqWaZpijn7OllqOWrK2rp5ufp5iZlpmVoaSopp62q6m6vMO1pbS2y8G4qrass7q4rqi4ur24g25vW1hVVk9GS1NNSz9BSEVER0ZHODVGTTs+Nz5BSi4zMjAyNUI1NVBXTjtMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVzs9QEJGQnJGaUlSZWJMRqaUnJahl6mWjJCDh6WSiIGHgpyEg5WQkZSOmqKfr76uoce9xcTHx87OztLKvru2sbq7vL7OtsS9t7i3srK1s7iyq6acq6u4qqmnr7CXo66kp6SltMCwqqyzvsK5wLizp7izt7OulaWtrq6ki5OVoY1zwZl9lpmEjpaai7GVmpmVkpOZmaajlaCblpqonJuhoJmLjI+WnWBKlpyalJqll1SWsJ+vnJ+llK+vraWaoaaUk5mZjp2gp6KZtKmqs728u6uwssfAuaarq62xsaOhsrK0pHJwZl1bT1FMRVBQUFE7SEtJRkhBQz45S1Q/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVg7OkJDQD1SRVdSc2JXRkirl5mfoamvmJCXh4unlo6IkoWfiIScl4+eoJujpbXJtKnGu8PEyMrIx8zOx766s6+5uMDBzbXIusC5tbqxr6+ytKejm6q0tKqppq6smaSupaWprbq/qKu2tr7Bv764s7HCr7e9q6OutKy4pYibl6abdr6ghJicjpOZmouvlqGcm5eVm5+hqZ6ooJmaqpmhp56XkI2RnYNudpOimpWdop+QrrKjq5WpqpirrqWkn6WpkpKZm4iUnKKelrCnqau6t76zsq29ubafo6eopaecnKypqY1lZ2FfUkxNR0dOSlZMPU1ETUlKQUNEPFFVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5TYU1WSH9lXkhGrJScoZ+7r5iUnouTqpuRkpOJq42Hop6MpKyUo6O2x720wbrCwsjJxcLOyMG9ubKvubTAwsq2xrHAvLS6q6mtrK+jopiqtLqmqaasqp2or6ekq6u+u6isvLO3vca8t7W4wLC9v7OptLarvqSPopeRop+8n4mZoJmWnp2Pt5+pnKWjm5yhmqils6GbnaWcqKqemZWPlJqLl4mNpKKUnKKfoLWvpaWTsauarKyfnqSjqZKVlaCDkJ6fnJWppaKhtLW6ta2otbKznpyippqXlZmqoZ53Yl5gXktJRkhNUUlNRUZGQlJKSEFER0FWU0RIPEFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6aF1GREScb2JHRaiXpJ6ew62bl6WXmamclpqaj6qWlaimla2smaGqtsTCvL+3wcPAx8S/zca7vrmysLizv8PItb+vvLa5t6ajq6usoKCaqqrEoqWorKaerK+soqqovrimrL2wt7bHtrS5uL6wvsG2tLK0r76jlqOWk5uUrZ+QoaKlo6OfkL6lqZ2orJ2doZumn72imKSeoqmroZ2WjZWek5+Hj4WNk56koJ21rKWclrKnmbCon5qqnqCNmZWfhY6hmpuSpaSamKyxtrGqpamtrJyZoKGSjpCVqZ+UaWRaYV1QSkdLT0xIRUNJQD1PSEA7R0lIW1JPSz1ITlU0QkY5PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGVjV0yimqObnsWsoZ+snZ2tn5KjnpakoKeqrJe2sKOqs7bEw73Atr/CvMjCvsrItri1tLCztLfBxra+sLi0ubWfpq2qq52en6WkwaWgqq6gpKmtr6Kmp721pbG7t7a1w7Kzt7q+scPAuLits7S1opyklZGToK2gmKGdqairoprDramerK6bm56ZpqC9oZ2kmKurq6ahmY2an5KeiY5Xf5WepqGguKqnk5i2o5+zoqCbr5efj5mUnYKPoJeWjaKklZCmrrKrqaKipaWVlZ2Zi4+Rk6SfiWNlW2RgTElKS05GRUFGSz49SkE5OUpKTl1RUUo9TFdcOUZJPURNSThIY1xMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dzSEU2PXVlXEtOnp+hmJ7Ep6Wis6GcsqeTqqSfo5+tqaydu7CorLWyyMPBwrPCxL3GxL3Eyr2wsLausLWvv8W1ubCwurWsmqiwqamanqahp8Ktm6yxnKqirrCppKe9t6a2ur2vt8Sts7PCv7HGs7q3q7S2raqipZWVlKOroZ+fmairsK6uu7KmoKmpmZmXk6KkuKGhpJKur6ykpp+SoZ6Vno+RjZSdmqOfp7Snp4yYtJyjsJqem66Rn5SXlJqAkqKWj46goZOLpq2wpaeinKCekpKblIWLko2cnoBjZltoZktJTEpTQkNASUc7O0Y/OTlOTVVeUlNKPk9eXj1IUEJMTEk5TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVV5mckA4PEiWd2VBNJ+kn5ufwqijqrGho7SplrKrpqKksqyuqbuyrbC0tMa/xMS2wMS+ysS1wMjCtau1qLC4rMDEtLeurLa6pZmrsaupmJ+ml627tZuosJutn660sqequrOnurK3srjAqreywry0xae+rq23tamnrKGXlpGlpKKil5ikr7itsrW2oJ+opJmUlZOjn7ejpKWVrrGypamlop6ampqVl6ifn5iinq6yoqaNl66ZpayXmp6lkZuOlJiahZaflIyQnJ6Ui6mpq6KnoZmeloyPmZCBhpaJlJ95ZGldbGpOUE1OVD1CQU5DOzpJQDc3UU9dXlJWUUFXYFxCSlNIV0tIOlVkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xXGNaMzM4MDZwW2JIMDVKcGlWQ1dGjHlmQzuko5yhpb+mqK+voam1qp25r6ukqrS3sbC5trC3uLjFvcPHvbzEwcfAucHGwbqqtqWtu63Bw7e3qq2yvKKVrbCtsZalqJGquaqgp7Cdqp+vtLOqqba2rLursrK5t6y5sMG5vb6mw6uwt66oqqumnZiYqqGhoJGXoLCus6uwuZqbqZ+ZlpKXpqC2qaWioq+xs6uxp6ufm6Cgm56knKGXnaOzsJufkJSmmqGpm5Win5aYipWYk5aXnZOJkJuZlI6pqaefpJuYm5OHjpmLfo2Who6ba2ltYW1uWFFRWlRBQ0VVQDs6SUE3OlhQZF5QVldEWV5eTUxSTl9LSj5aZF5OSVFOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNjQ3Z1lgRihAOGx9aFxWOol7Y0M9qJ+coam9oaqwqqOxuKmltbKroa21va+zuLy6vbe2wcO/ycS5xcPAwLjFvcG4r7anq7eyvL++tamusbefl6utqK2Xp6mOp7ufpa2znquisbCzrKq2s7W8ra+xtaywtbHAucS2q7yvsbisrKmisaWepKifpJeQmJ+yqrOpqrOZnaebmZSNoKWktK6noqysrrGnsqyyqaObn6eknZShmJuotamXmZGSn5mfoZ6QrJ+YmIaVmIudmp2Tio2Wl5qXpqajoJ2WlZaUgY+VhXuPkoSMlmZsc2hwcl9HWWZWRENOWERaOUhCNj5dUmhcTlldR1teXU5NUlhkSkpDXGNgUExNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfXmFWMTUwPWBWXjgpQzNZVVxnSzWMemZMQKSaoKSst6OsqaWurraqrrS5pqewuMW3sbe+wcK1tLvFvszFucPBur+6xLjBubO1rKq6t7u6vrWqrbG2mJioq6qrm6yrj6u9nquusaOqn7Gts66utrK5tqmtrrGntbCzurzJsqq1tLG0r66mobOfmqisoKWVlZqZsaKtoKWvlqGkmZmSjaKlprKpoaaxq6q1pK2wta+jmJ2tp5qXnpmZrLiimJOQj5icoZmXlKyfnZSBk5mNnpyalpCKlJKemqWjoqCZlpKSlnuLkIV7jIqDi5JrbnludXxhRmBqWklIWls9e0pHRTZBYlRpWk1cYUpbXVpSUlNiYUxLRWBhYFBMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuKkEvSkdQW0czY1lUS0SZl5+vqLGprKWjrq61qba0t6OstLfJurS7ur++tbS3w8HNx7zEvbe+v8C3v72yva6nurq3t8K3rK2xuZWXpq6rp6OyqpSvuqStsrGnp6Kxs7GysbWxuLKorquyp7ivtbPDxbaptLWrsK2pp6K2n56msaCklJuZlLGdp5ufqY2pop2blZelpaS3p6Kws6unsaessLWspJmhrKibnJ2blKq4nJWOjouZnaKYkJenop+Wg5KWkJ2cmJeWiJePl5qnnaSgkpaRkJZ2hJCHe4WChIyMbnF4dnx/XUtlbFxKT2NcP2J7R0k4R2dXZVtMXmJNWFlXVFhUaV1QT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSWcyNydGYUxWJS1CLj1FTFE8M3JrS0RDkZikraStraumo7Cys6q2sLafq7W5ybmuwbvDt7OytcLDz8TAwb20vcC/ur+9s8Soqrmxtre/va+rs7OdoKewraWmsKWesrWsq7KwrKmotLmstLO1rLSsqauorKm5rbGwx764pLmvqa2tpqitsKWjo66jqZydm5qvmaKjoqOQrJ6joJ+hqaWluKSrtLSkqquorK62r6Kdo6iqm6CZmpKktJqPiY2HkaOglo6UnqCVk4WOlJOdm5mWlIeYkpWZp5ygn42SkY6Rd36OhXx8fYeKiXF0c359flxSZG5eTlpmXUZElltHOk5tWGFbTWBiTlZXVldUWWdeUVJMZFpbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0NlOzYqSGRISis6ST8zQ0lTLD6Paz5ISY+aqaqhqLCkqKOztLG0tbGxoaytvcu6rsG7xrG0rbTCw9HExr7Asr7Cwry/uLzFqK23rLO4vMGwq7KtoaSnramopLCjq7Gqr6uxrq6tq7O7p7exsqmyqaqmpaOtuqypscK5tKy5qKioramnsaWppKKuqqiinpuirJWknZeemKudoaeooaylo62st7GxoKmin6qtsKydnqanqZmjmJiPoKeYhoOOioufoZCMjZedkJCGiJGVoJ2VmJWGlpOTl6WcnZyLkZCNin9/h4V8d3+HhYd1c3KJdmxfWWBuY1FzclxLPIR8Rj9XdVhgWU9kXE5VVlVXUFxhX1NPTmhYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkowLklnREY4PEIwNUVLWDFAlFxATUaVlqynoaqynKmosLWsuLSuqqSrq73Ju7G+t8OvsK2zxMTOzsO/v7TAw8S6wLTJxKyvt66yusC/s66uq6WoqrCppqiypbStqrCurbGvs6yzuqS4tKysrqeroKKesLerqq26tqS1taSpp6ysqqyhqKamsbKkpqWhoauWqaCTmqCmnqOiqqSsop6msbesrKKkopqpqq2pnKGlpKOYoJqVj5idlIGCkIiFnaCNio6Nmo+Ri4SNmKSckpGbjJORkZSjmpuai46Li3yHgYKCe3WAhIF+dXeLo4d5a15gbmdXZodkTkBnkkxEYnpXYlhSZVVNVlVVVE9cXWFVS05pV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIZBSUhElpGvpKKqsJeqqK21q7awq6Srqqm8wcC4ubO8taayr8TJy9G/wbu5wMDCucG6wsSusbWytLzBvrOyrq2rrKi2qqWtsKq5r6iwsK6xq7WqtrWmtLarrKSpqpyjnbOzqKiktLSgtq6hqairqKunoKqrqLm2qaqpqaGpn62bkaihnaCkoqaiqZ2cprSup6WpoqOXpKanqZyio6OfmZifkY6PmY5+h42HhZ6eiISKi4+OkY2EhpWimo6NmpGSkY6Tn5eYlo2Kg390h4F/f3h1g397eH6AiJ2PcHJnZ3F4XGFziGlPXZhWSG15VWRWUmNPTFVUVVFPWFpiVkhQalRXU0dQWVVJPklIT1FQeExOVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyP2Y9Tlg/Qyw/TFRfL0lrN1JFO5WNr5+lqq2Zq6StrrO0rqqlr6mpu767wbGvuK2ita/Jx8jRwL+9urzDvbrDwcC/r7Kzsra9vMGysrOrs6mltaikrbOzua+irbWxr7G5qriuqq62q6qeqqugo6G2rqihnq+yobSqnqinqqOqoaGsrai9r6yurKGnp5+rmI+vopiioKinnqebmamwqKKfrKGgkqGio6aYmqilmJiYnY+Kh5WIfY2GhIWkl4aCgoyHj46RhYWVoJeIkZ2Qk5CNkZ2Vl4+KhYZ4c4F/fXV4eoB7dHR7aoKHo3VpXmVsgXVniIt8UldwXkp4c1RkU1FfTU1TWmdOTFZZZVhHU2pSUj5CTlFhUTpJSExTSXFQTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWg6MzhfPWFkP0YxQ1BbWytITztYQjSPjrCfpKWqo6WjrKa0s7CppLCnqri+wbywqLmqp66wycbI0MK9wL65vr68ybzCubGwtbK6vLnAs7S7rbmso7Wmp6yytrmypqe6ta20vK+8pa2ttautnKmvpJ+lrKqnnJ2qsqSzqJqqp6qkqZ6iqKipvau0r62eqaOgrpuasqKVpJukpZ+kmpqoqqWemqmhm5GaoKSdmJapqZGZmZOQioKPhX2PgoCIno+HgH6Mh5GPkIWAlJuUhZOijJSRi5GbkpWHiX6Acnp5fnxod3x6dXBxfmmGeYSIZGBoZHKFe21neV1eVkJXe21UYVBSWEtLTXB0XUhaW2dZRVZnT0M+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGXEAqjpOwmZ+fqaWjoaqlt7KxpKmxpq25wb21sKO5raiosMPJyczBt73Atbe/usi2w7W0s7Wyvbm6vbatuba/raKzpqurr7W3tKqduruosb+yuaCvtLaprJ6tsaOcpaipop2cpLCmr6Cfq6mnoamco6igrbunrrGuoaqio62enqyll5+boKKcn5uZoqqimpmjo5WWk5+hlpuWpqyLnpGQkYyCi4B/j4F7mpSNiX1+jIeQj4yKhZKYkYeUpImSkoeQmpCTgYh8eWx9dnl4Ynt6cnBwc3hqgnRqgmdjaGFuc45tYmpwYG9BXXlrVl5OUFFKSUxTWVZNXF5tV0RYYU9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmROKT0zUV09I5KXq5ifl6ejoZ+no7ivraKvr6mruMK6s62fua+rqLS6x8rHv7fCvq+0vrfEtsOysLqys8C1u764qbm4vauktaeoqrCtubCpmbm8o66/tLShrre1p6ansLOgn6Wmp6ClmZ6sqKmeoKqup6Cml6Kon7C4n6SxrqCsoaykm6amqJqam56jlZycmp2pppaanqiRl5KYnZOZlaGqkJqJjZCHfYh/go58fKGMjYl5g42Fio2NhYiTmo6JlZ+IkZWCjJeNkH2Ee3NwfHFzdGB5eGpvcHFwan9zY3psaGZkYWWHgGBbcmpxTU6AaVhaTVBMSkdQUlFITVtfb1REWFpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MFxbNSiWm6WYnJWsn5+hpKG3qrCjtLSpqbnFtrKuoLesra2wtcXHwLe/wrmwtby3v7u/r6y+sLO/sb3Duam7urinqLWop6uwrLOwppm8tqSrurWun7G4r6mlp6+ym6GkoKOkoZabr6ahn6Oor6GgopOjpKK2sKGmsaufrKKul5uqpKiel5qdpJOanJqdpamZm5uklJSXlJyOk5eiqaGQiYqPhXqEfoSKeo+Xio2HeoKIhImMjoWOk5iMjpaZio+Wf4aXi496gHpwcXZucHRfeHdlbWxsa2mEbmZyaWtmaV1jdIFgW2t1aVpKf15bWE9PS0hIUlVGMjldXm1QRFhWWWVNSElFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbTc0R0FmW0hURFVdaEQuPDJjViwylaKhl5SbqZykoaKht6muoLq4pay9xbOwrqO1r62tr7TDw7yzv7q3sLO5uLq4uq+uwLO0ubC/wbisvbq1paKzqqepsqutsaGawLWkp7W1qJ6yvKmopamvrJmjp5ykpZSXobKlmZ+kqKmcoqCTpJ+juKikp66mnaWhqJKfqKGhoJianKCSmpuWn6Gqm5qYoJSQk5aZjZSSo6ikkImJj4Z5hHuEhn2djomKh3qBhIeJiZGFlZOTjJCVlI2OlHuCl46Ld357bHRxbGxzYXd0aGhqZ2dvhWdoaGNmaWpgamNpZ1tle2NgU3RUXFtTTEpHSU9TQCEqaF5qTENWVV5gS0lHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRBM0NEZ1tLV0dVYGhCMzc5Z08nMp6io5GOo6abnp6do7Wsp6q6t6esxMG2sKyjta6nrq+3wL+8ssG2sK6ytra4tratqr2zrrKxvb+4rry7saSftqulpbSpqq6encGrqKWvsqmstbueqaqrsaWYnqmdp6SRmKatopiepKmhm6Kclp+dp7alr6quoaGdnaGUoKafoaCZm5mckZidlKWdq6GXlpyUkoyVl4uPmJqpoJGIiYuIeYV3goKCnYiLgol9f4WIhoaRhJaVj46QkZGRjJJ7g5WNhnN9fWZ4b2tqa2d1c2tjZ2RkdoBiZWZmZWpqZGtyWl9ZXW1kYU5pWFtgVkpHSUtNUlg+OV9saUhCVFNcW0lIRkZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQmhIJTWao5+Qi6yhmJiflqSzsaKxvbahsca8urGxpLesqq6puby7uq7Asq6urrausrizqKu5sa+us7a6trC4va2mnrWqoKCwpKqvnKLAoLGkrrCut661nq2vra2imp2nqaWelZqnpZ+ZpKKpnZqfm5ScnayvpbqorqKhmpqdmZ6jmqSdl56Ym5SZoJKolamnmpOampGLlJmNlJSZqaeOjYqJj3yCc4GBipiFh3yJiYWFioyKkoSUnJORj5CQlo6Qf4CMjYJwgH5meW1oa2lncXJrXGhjY3OBYWZoam5sZ2pqaG5dbGx0cGFVY2lkZVpJRkxNT1hRUVZhZYFVQFZTWVRGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyc0kaGajY+wnZqToZmosq+fuL+2oLTCu725saa2sKiupbe4t7etu6+sqqu2qrO4raWztbKuqbC3trGztbqnqZ+1qJ2eqKKprZqnvpito66vtLWtrJ+xrbCpopyco6uom5ScpqOdmqmipJaan5yQm6Orqqm7n6ekoJiZmZ2hj2uhlpmccIKVmqN/dZGpp56UlJ6QiJeZgJaKoZB4hpSMg25qfnaDcWyGi4Z9hIyHcF5jYWeEmIZri4+UknR3i4R+g49/Z4aAZ3VoZVdcaHNuTlBqY2dyhGdfZGZubWpeX2GKj4OEZU5LRDlGVGdeSkdQUFRVS0hSYG90ZUZaUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzU2OCwjMScyMTQ6MTc1WIFsMTZPa1tOXEtbZmI+RzFRZD0qLoujmYaUsJuck6Cbqq2qo73Fr6m3wri9vK2ntrClq6S3s7GzsbmtqaastKavtaKouLa2qKest7OutK2zoqmfs6qeoaSbpqeYq7qVpqWvsratrqSprquspaGfnaCnp5uXoKWlm5unp52Tn5+YkJ6nqqO1r6Ojo5yWl5eXo4ihjpKah6GHk5ygf6R/paqekpGakYiEcniNjoWIoXaIjGmXiGZ9cnihb4iHhH6OfX+hoKCZgHyHnnSHjnabimyHgYNsaGVjemtxYVOFbWNsaZhxWWpxb4dYXmlba2tbiHFuenKFZ4aEWl5HTj9HX01GUlZWUVFSV1RnXk1XSVJTT0VHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3MCiLppaDnKudmZidn6qqp6q/w6+xur23wL+qpbewqayms7SurrO3q6mlsa2ltLOcrbW2tKanqLOxrbKorp6roLKooKOimqGjmq2zlKOlpbW8p6ynq6qtqKWhoJigpqOZmaWjpJicpKmWlKOclJOkpaaht6OjoKSYlJOXk5uIro+YlImpi5ehm4WxgKOsnZOZnZR5gtSogIeVwZvHeXixpbeXZIDAnL95hIR5kIR8kJCRynGXvJzFenK1pruQe4BslrGrsHhoa1ixrm5labySvG5oem5yj9h+U2pitrJ/gXKVdJqhqpBXT1diUFZORlRbWFFQUoxcV1xQQFxEUU5ER0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjaaSgKeqn5ecnaWtsqixwr2ytcC1t77Cq6azrKypp6+zqa+2tKenprSlp7iunLOytqqlpKexrq6xpqqep6Sxo6Kfnpebn52uq5Sdop+zuqOqqaKtrqWhnZqaoaefl5unoJ+YnqenkZynmpOdoaaioLCin5+jlpWSmJKZha9qaoqNqn5ng5WGrWRwnZyTmaWUca6hpH54u31roY92sV9qtFulgGackWBmgnpmf2p4a6lkvnJnpox1sWp8sXh0kpNjbW2nbluEoEVoZoeWRXWcYH5nfKSngllfi6tpgJZ4eWqnN0qvXFhTbGRbS05XX1xXVjtOiU9YVy9JVFRJQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMwG5CilYKsp6Weo6SqsrestL2+sLbEsre6wqapsKuuqamwrqOwuq+jpK6yo6i4qJ6zsrCjpaCqra+sr6ann6OisJuim5eVl5ubrKWWmqGes7Oiq5yira2gnZmXoKGonJmdo5+cmaGmpI+do5qXoJ+qnqamoJufoZWVkZaRmoW1m7V4hamZtZl2hrObt36TlZaolH5rgaZ7goaIkpSSd6tna7Fbq3uPh5R0iXGPhoB/iJCXeIKCi5iMg6CPhLB2d59xa2tsfItOpFhIY2OZfmNopmB5cnVTkodeUKltY3F+h4BinC5RoW9bU2toYExLW2RYXFpCPrF5WFhBI01oRUJFQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o4YVU1MBuVn5WHs6amoa6pp7Ksqbu2wrC7wq24t8CqrK2trqatsamhr7yqoae0raOrtaSms7Ono6Kdp6qyqLCnpZ6fn6+Wn5iUlZWXnayhmZmkqLSvoqmPqaiqm52VmKClp5qfnKKfm6CjpKOVm5+XmZ2iqZulmZycoqCXk5GTkpyD1ZOZuXCwwn7FhnzWlJu7fJmVpI+NnI2ke46Ho4KlgnqseY+dVq96iH6farlauXaHhH2mgpN8mHqqeY2dkHuxbo6EdJC8hW+UUK+nxYpRoHpjYKljdHKIbZeIYFO1tMiGgIl8Y6QzQp12XVBqaWRQQFhnWmRhSkhObU1bUk9ZZllDRD5FPzA9PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFRNzElm6KTmLGoqKWzqqW0qaS8t8GwucCxtbS7s7WnsbCjsLKmn662qJqnua6jr7Ggs7SwoKSen6epsKm0qKScnZ6ql5iXlpeVlaCqnJmWp62wqaOej6yiqJadl5yhpaGYoqGhoZqhoqabnqGelJmbpqCcp5Wbm5+hmY+RlJGciLJuaLVxq4dujqZytHNytnuZl6OLj52No3+RoaV+sHaDkdLRdlyue4V/pG+bqqZrh4V9rX2XmY97sXOSnY95s2WWdISeb55mlFLIi1rCXJ95Yl+tYHZzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPa19saE9VR0k4PVZRWldYSEM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTTYyMKGdkqWvraSqvK2mtaWntru8srq/t7W0urqzpbS0obGxop+ssKSXprqupLGwnLS4qp+mnaGppLKorKmkmpyaqJ6VlJiYkpKip5+WkqWqsKailpOtn6WSlKCbpKaflJqlpqGaop+tmqCenZCVm6GenKWVnZaZop+VmJWRmoWse3eodqOOiIapb62KgqeDmJihiZKaiqJ/k5mJroV/grNccrNSrn2DgqR/cdd9eIV+j56GmZl3r4aKkZyIeLNhmmWagYKUbJJasFhLmnWYeWZgrV93d4domIhrXa93lZ6PeGw1eciusl9CU29eZ2BFUG1fcG1WVU0uZWNoUlhRO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEk6OTmfnZSfuLCXtMGtqLOoqbK6t7O3v7m3srW8taS3s5+0rJ+fqKyflKe1q6ixsauttKSbqaCgqKG2p6apopmdlaWhk5KbmZKUoqSakpCmrK+moJWZqZ+ijpGimailoJWapaidnKSerJ2hnaCNlJ6anaGYmZyWl6Ggk5iQpp6GqX19pXihj46DqnCti4GnhpWfoYiXl4ijgpGIlKp8gIudeW+xWqiCgoigeXTYf3aIdKiCjpuNkqN8lpCfhHuyXpxkoH6DlWySXKtbWpN/kX9oZ6pkcnuBa5iHc12sWomgjmtvZU9KQ6FcW0x0XWJmTVthX3J0X0pWNkqbk1hIRT1HRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMj84oZ2Zmb+rl7TCrqytqaa0sLextb+5ubKwt7upurSfsKSdpaennpOqsKmvqbWsqq+hmKGgpqWkuqKjq6CXm5GioJSTnpqUl56fj42LqK+vpp2Wm6imn4ySpJeoq6eUl6mnnp6go62koZ6hjZWhmJ+gkp2XnJWdoZWWjqubj65tcrRyqYx2iqZztHhzs4CRpKKRnI2JpIeQd7hvjHuLomtrtlqghWWXl2mhoqdtk3K0dJOYf7JqhZKIrWt1s2GdZqJvh5Jql1ytX02hfIeRUnOjbXp/fm+Yh3Fcr1Y8nHdlVG9uLlynT2NSa2VibVpjXWFwe2NTWlE+Pm1vM0NCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKWam527oZyywK6uq6unt6m4r7XAtbywr7m4q8G2qaqgm6ajop2RqqqotqOyp6+qoJecp6Ckq7ido62blpmPpaKVjJ2hm5icn5GTlKu1sKeZlJysqpeMk6WZpa2ikZaqsaSfnqarsJiho5CZopafm5acl6GSnKmclJCqmYfUkpq7c7DDgMOGftWWm7h4h5CXjJiKjKeIeqO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2VgaypcXt/dbyIp6BpnWGmjq+hfox0h6p9vm5zvHSyg3V4gYpumohxbo2kdL1ed31bYXm8a1pWW2p6XmphZWdibXdvWVtZQ0FAckBDRys1RyInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnm56hvKKXscOwraqqrLGnuK+2xLG5sa66r67Asaukop6jopybkKmjqrKktKatpZ+WmaqZpqy5naOumJSgkKWgkoyco56XnZuQlZKvubGslZejp6eTkJaknKStnpGgqKufm5+oo7Oeo6WOp6KUoZqcmJWjmI+woJKUqZ6FkJm1gJCRjLeVeIKTmrV3bWtuc256j4SOiXSewbu9mnuBsqhwgHSRuIN8hoaMho17ioeNl3yku7m9nHV6s6N0dpd1dLB1mZ5mhmmNtXRycHe2jF6Aen2KaIN5bXlji6xwdYV/WlunakVlWlRmYGNdY1FnZ3BsdEJNUExEOlpNP0ozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVjgqT11dPSs6VlYnPjs8p56gob+llrTCtKyqqKyrqbuusMWutLKut6e0uK2poqGlnqCdmZOrpK2pprWop5+blqCjnaykvqahqpeUnJCim5GPoqihk52Yk5eUsrW3rZidpKSiipKSppulqpuWqaSlnJqhqKamo6mhka2elqOel5eXnZ6PsKiUm6ehjmp+aZymeIdyfZqOdHpkh3u9vsC6b5KCcZWHYHJqWl6bimFjiI6Va2B/lWNtnXdilWuAmpWUZV5gY3GaimhyjH2FlWdqfnJ0eH19Ylt3dIFoUFxuhH17i2tYbHqCc0lKb4ZwTXVNRVddZ2FMWldnY19PW211anFST0RFTjtISD1MPzItMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBeTCgzPVtPJz8yPqigqKHCo5q0ubajrKWup6i1sqvIq7Cyq7SjvrGypqCiqJ2jm5mZrKavpKW1qaWbl5Whmqatqb6nqKaVk5uVoJqSl6SpqJCdkY+YnLCyv6ybp52nooiTkamaqKOam6yfo5mao6esop+ropqxm5WnoJeVnZ+dl7Gkl6GomZyRnZyipJimopqcmpqZj5WBZ219cXeSl5SRhYu1qo2GmJWOioyYl4eUlYqEkpSRiY6SlJiUmJeaoKKanJShno2CeqSGbGp8kHyAdImKgXGCeHl2douAe4prc4F0g3Vkd313a3B7bWBjXXBoTVhaZmpgV1pveW5tZlNPRlM5T1lNUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCzobOhv6GksbK3oKmlsqelsLWqyKussKW1psCntKCdpKSco5WVoKqmraOjtqufmZaVn5atqaXBnqujlZKcl56Yk5Sin56ip5ORmainssSvmqucq5+QlpaonaqbnKCsmKGbnKKkr6ahpaifrpiXp52ZmqCenpyvoJyhppWYkpiToKGVo56XoI6Wk4qKjY6WrY98lZuCkoKLqqiGgZiWioSPn4h7hJCHhZmSiIaKlY+bl42Ql56jlpqTkZ6Nf45mobOvhYqEdnqQinx2eXpvZnqRgYCJa3WBeYhzaHN/enWDh4JrdGR5ZmBpZWNkZmtZa3twaWpcU0xQRF9URUA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0XEc1PCxAtKC5r7+sq66ysaCqprGtoqyzsMSwqqujs668o7Sbn6aioZyZl6elqaakpbO1npWUnZmZsKauvqCropCRnZqZk5GVoZyXqJyEnqqrorPIs5+qpKuWlpeap52omp+kq5Oenp2gqa+ppaOroq6bn6ChmKSenJ+dr6OYnqiTmJeckaSZmKidmpdlgpJ8ZX6NmY9jeY1saGt7kqSqamWamH5nhoplZWloe46hj2tojZeRondraouYo56Zc2xueoSNh3pYZV6Ggl5si4mAdlxoc3d3koCHgm54gniAc215hHR3iYiOg3tphllea3RkXXOJaWp9cWtjXlJOV0pkWEFKND1GNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMVlDOz8uPaWfury5r6yzsKqlqK2tsKetrbC8samnpK2vsJ+tl5+jnaKZmaarnK2jpaepsq2elaOQoq+mtrmlrqOOjpqhmZKSm6CZmaWVe6WtoqizxLikoaevnp2UnqKeo5yjqamSnqGdoKqwqqukqqCqm6afqKCslqGbpbCkl5uqlaGem5Kll56qmJ5+vYOHcrRyhJ2FrWh4ucS4cZOio3qmmZlzqoJ8y8DAu3GLooiCn32VmIidwL2Clp2djZ3CwXuCfJKNmsPAfWulsm+MgW/Ken+bd5KDjoF2eoGAeXF6f4dxeIWNk3ltd5RjZl95ZGBlgmNedGhsZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLyNGWzNQWS9VQUI7LziWo7nDtLCvwKmolKOvqbCuraaytK+ppaamsaufq5iaop+cmqqnop2soqWopaS0pJ2ik6atq7izp6+ikZGZnaWSkaChmJufnYenrKSrrcDAsaGpr6mXkZ6doZmio6qjk6ChnZ2trqmsp6Ojp6GlpZ2tqZKkmqitqZucqZysoZaWpZWhopecf86UeHqkgXiUlptfro9ejqeBoqB8p5abdKuCgK9eY42qeqeHhaB0l5OIs2OCq4ahjY2zaoSvdH2XiLhhg61Zo81tkHV72nt/mXB+h5J2fmV7iHZ2a3yIb36FkZJ+bYKPYHJscGdgX3lkXHFoamNmYFJUUlddS09DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w7TC0hUEBGNC4xrcLAv7W0sLiXnZGkqqits6ulsqysq6SrprCqoKebmaWXnKKvn6CfqKejpaGesKybnZWnrq2xqqisoJSSm5+lk4+fpZidp6OerqSrsKjAxrOoqbGulpKdm6GXn6mqn5Wgn5ydra+nq6mcp6ikoquTrLOXpaKqqZ2jpqWhsKCSmaaZoJqUlJGXoHGFjJd0hKiHcbF8nXGsfqGegaWPnneqgn2tf5xyrX6rh4afdpiSenyXfqqIooyRjJ1+q3uJlI+fgHutVpzEeo9vksF9gZVtdW+MbWV2ZYZvYXducm+Ki5KQg22SkGZwdXVwYGdtZV9vaWluZ2NXU1xhWVJTQzhJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DUxsaytKCdo46jo6Ksr7auqLGmqKqnraurp6KjnZmilaClqp+hpaCoqKKfna+smJqWqKevrKimqZ6XlJqjopGUoa2bnaajr6yjrLSquc2yraatrJaVnJ2imJ6urJ2WoJmdn6myqaqqm6yrpKOsm6+xoqirrqWYpaqpqbGikpajpJqUkoWkaqR1iXqpdHqycIKmipmMcYigmoekYGBSq4R/roObdq6BpoaGn3qZloZ7ZoCjiaSZhoKkfal/gpWHrl59qVWdopKBeqKfgHvDr8WLcq+zs7lxYqmvwnRojYyYj4FtmpRwbnl4eG9sZmVlcXBmfGliXVdgaVhYVUxMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfDydbVv6GZq6ehr6KesLSwr6mtoqemqqurqaSmoJuknp2mp6ajnKuaoqyhpJ+vop2bk6qktbCvoKmbnZaUpqOQmqKooKClnLCmpKixrbfIsrWqq6mVkZ2copifpbOdmqCUnJ+nrKykrpqtqqOiqqKzrqKqs7Ghmqmorq+2opKWoqeYm5F8qmyehId1q3l8sG+CpIuJn5aWn5SB0ri0uMmAgbJfX5Spg6OIh6B6mJWaeKrJdJmklaiqkZOajICbipnGxnhmoYKlc4GfjoJ9r11wtGKwdUujhm2nR4KTZI+QnpJ8cZeTgHF7dX57bltmanJwZYFqX2FYZG1cXllJTkxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz0tNU9UUR0cOzxGMiwkp6TAxritqbOtrKWinLK5rKqhppqopaqrqqegpqWYqqOfr6udpqCsmp6ppZ2ntZ+il5OpqrayrJylnKCVkKWskZmcp6OgqaauoaSnqbC1wrKzqq2ok4mXnaSaoaOuppihlZicpaarm7Cdrqimn6ykt6ygsbmvnZuup7Kzs6SUl6eimZ+Ogp1OeJqBf596g6N9g6SEhqaenJ6ThLh7fHm5gn7MxsK2eJuhkYuffpqWlop2npiKpJikqX+whZ2Fn4SsfZqUYqVspHCPhZCBfZaCcqxgo3NxgJpgvH1SVXWPkqSXe36Tkot1e3OFf3FcbW54cmqBb1tkX2huYmRdS0xRVEFJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA4ODIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu5qq+gm6Gss7Oln6CVpa6trqqnnaammqOnobOuoqmmsqCZqaSUo7aiopWXoqm1uaObop2ik5ChsZmenKeloaKvrp2kqKK2ssSxramtqZGHkJynnKKknKWXnpiZmqakqZqvoq6lppivpbytoba3rZ2dtbK4sbOml52voKOdhY/RtcO3eYeOhZGTkIGmeJShd4ygkYSlgYpxqoaEtG5yapmjm5WKnnyYmYaHj3OvgqWboo6mi5OdipWQmm1wslylc5N6nGyZf3uZfG2pYaNxcX+fYnOyuGh4kJSmmH2MjZSNeH15j4JtaXhpeXJugHVdZWRubWZnYEpbWFg8SEdAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWTc42Krb+/u7q0npanpK21oaKZlaOop66rrJmmop+moKC1p6Kpp7CjlKyjjqSuo52QmpqqtLSknaScqJGUl66goJ2npJ2nnLWaoaqktqzDsKmrqaGMhI6coaCmopWampyYm5mmpKaYrKiuo6Wbraa+rJS9sKyforCzuau0ppqosaOnl3qokH18sHeKgaSliJxtsm+gh618oY6Dp5WYgKyIha6Fn5SpoKGXhp+AmZWAe5J+q4CdmpaLqnidn5CJk5KAea9do4F9pqdknYB8l3Nqr12la3CFmV1gW4ygbZWSppmClY6YjXt7hJh/a21/Y350boB6YGdlcW5oZ2dDWmFbPktUM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaWFNQT05JODA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNUVldXWFZVVVFIRklKIygovZKag6nGwrbBs5+arKCuuKWjjpuko5+wr6qfpJ+drZmeuaCjq6CvqZquoZCrqaSWiZqQrrGspp+mmqyXmI+soaGdpaGapZ2tmKCoprapwK+lqaSfi4CNm5qfpp6SlJqalJqapaSkmqmsrKSln6qovqSWw6yqoqGrsrmqrqegs66oqZh2r36Qi5yFh3y6roqYZbCMZZWtfaGPg6aVmoGsioSwhaaZpKGhkYWgW2xqgbNgf617e4KBsWxnb5mYjIiwW320W6SDa8iiZJ+Ae7xYdrRasn1SroB6rFiAoW6YkKibi5eRmJh8eY+dfmR0fmKEeHSAfGFqZ3FtZmVlT1VkXEJVXz5KKD45PTQhIiwlHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFFSVFdaXmBgYGFiXl9cW1hVUE5KRkM1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpcXFhXV0dCO9Kfs7K3vbq0wrOjm6ympbaooIuaoJ+cs7Opn6OgnrWYoLSoqqydr62erJuVr6iijoibjq+sqKeippmukpmPqJqhnaSfmaSjpZmfo6qyqb2vpaienY59i5qVoKCZj5Gam5Kal6ifoZqorqimpqOlqbueoMampKihq7S1rK6mnrutrKyVgKmSo6+Om4CHpJeYkIGAuMO6g46ck4SnlpyCrIqCr4imm5ulqpF+1b3CqmKjv719fqOCg9e6uLWFlJODnr2+g2ujgW+rhGycf3qysMeDaquwvax4d6K+vHSBlo6nnJCbkZideoKRm3pjfXtkjmd5gntgbGVramJQYVpTalxAVWFCTio9OjQvHh8kHiUyIB0kKDA0OTY2Nzg6PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PEE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbO0sb+5sb2yop2upqWypp2MmKW/qriyqKG/pqeynJ6xnLmonq2vpqaUlLCsl4yDm5GupaKsoaOcqp+Yi6OSpp6nnJqhqKKZnqGsraq5rqijm5eSe4eZkaabk46RmJiPmJOomqCYqamhqqeho6q7nqjEoqCuo6qztKqwqaC6p66umnN1qqS3hmWJoHBnrY+Kj21vd6SQmZ+Bda6YlHCPi3GVqKObl66kcm1tbWWKeG9ugplxgXpqcWlniZaVmHFpaYSHZ3CGZF2IYmpvWVxnfnemX2FxjpFuZWSAjZOPopiZmZGYn32HkJV2Zod4aY5reX95ZGxjZmxiS2RYSmxaOlFlRVInSzorIxwgGyIsKRgbGC0yLjU6NDU3OTw/QUJERUhLTE1PUVNWXVdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWts6m5ubKzqqmhrp6jsqmYkr6yxMm+tqqewKyso6GorKC6o6SurK2mjZeuqZCMhZWWrZ6mq6Geo6OfkYukkqeZqJmWo6qglpympqevuqysmpuTknuEl42lmI2RkZiUjZeVqJWfmKmjm7GmnqKruZ+vwKeksqWssLGqraunt6Ott5aKoKiltp2JlqKYh6makJSdkqmzmZujq6CxlqKgnZ+inKCloZWrp42TkoyHk5yclZCak5iRjpWFgaSal5WNi5OSio+GhH1niX50gnZ0h4txp2x6lJGTkoGBjpCQj52VoZaamKKDiJWNcmmQd3GLeHd8empsZGNvZFVgWEBqW0hjYU9aK0Y9KychNzQwLh8cISUyKCo2OTk0Njk7Pj9BQkRFSktLTVBQUVhVVlleYGFjXF5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqltbaurqKwo62foLWxkI6sx73Fu7mroqaem6afsaijtqedqbSnqJGYrKKLh4mPm6eWrKWgmaeenpKVo5eomqiZlKaho5Cap5mhtbuoq5makI17gZSLoJSKlZGVkJCTl6WQn5qqoJy2o56nq7enrsGuo7amr6+wrKmps7igrryZkaWkpraikp2mn42pn42Sn6Osr5uho7Cor5ejoJyjqZ6enZyWq52SmaGblJCWqpmNmZmWkJaekYmgnZWUhZKMkI2UioB9ZouFdYZ1eYiDc5xqhZCUk5CJfYyWkpKXlKKTnpiihImZh3tylnN6i39yfH9qb2RecGphW19ZbmNQYGRQWjpHR0U+Mj09OC8rJispJh0mNDA2NjY4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWBlVVBKQUNCOjlFTVZbXl5bWlxbW1tcXV1fX11eX19hYWJhYWFgYmJiZGJcW2OXlaSoo7CzrK6jqaatoKe1qpCQnaW0vK+traKjmnqdorGkpbGpl5u4pqOUmaqcjoaKiZyjj66fopWnn6GSl5ibrouqlo+omaiMmKmPn7m2paaYm42IeYKTi5qTipWSlJCNkpeijZ2eqJ6fuKOAhK+1oq+vdaS9o7Kgd3mgqrK6lHWspJ6JgKp/ZFxidqCOpJ6El31uk7Odo6etqqNlnZ+Sc3mZlnCAmKiXbH+ip4plnKWckZeYloySnJGGnZqQlYOSh4+OkomEd2qOhnaGcHuGgYBhaYeKlJKLWnWVkWhoj49ze6aamWV5mYeDeJhqhIuDb3mAa3FlX3ZwbGtoXGdlYmJwU1w+Tk5OU0c+QFREOTEvHh8mNDozMTY2Nzg8Oz5AQUFGSEJHRklLTVRUVVldYGhmZ1dRSjxERzw4VVJbYGFiYF5gX2BhYV9cXV9fYGFhYmNkYWJhYWVkY2hkXl1mm5Wmo6GvsayrqaWprqOnraSSlqu2sLKnm6umrJd0jJ2vn6iqp5OXuZ+gj5yknZF/iYibno2rmqKVp6GdjpaRnoR1ro+IppqokZekiZy6tKigmZiLiXV3k42Vk4qUkZCUjJCToI6boKaZnLKWgIybtZ2zjJKPvKegfqeieqKutoGOjqaeg4uGkLGpr4yKlqOaeYCLrIacnaKnqaeHlYWYd6WbeoebgZengoJ7nLF6ioagl5mUmJaCkZeWhJqZY3mHkISOj5GKg21wjod5gHCAgYV/hnSGhJWReJZoknSgmnR9mYSinoeYf5OLg4SZa46OhWx4e3FxZ2R4b2psalxma2pldFxfSVRMUUBFNS5aVFU3KSEwOT0+NjQzNTY4Ozo9Pj5AREk/SUVKS0dTWFtZW2FhaWZZUUg5RUs8PmFWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXo5+mra6rqKygqLGmp6mlmZSuyL6xopenqbWej4SdrJynoqCNkL6emo2fmqCQfIaOmZiIrJyhlp+gkY2TiYaAkaiNh6Kdo5OXnoafurKnnpuSjoVwdZCJlJCKlI+Pm4uQkp+Sl6Cklp6rh5+0ibSarYrKh6quiLeFjK+CsK6DqY2lmI2dfaiPcnt3nI+nlmiVpHm0jJ+epqiSmMKBf6uImKFynoCapX2XhZWxgKF9oZOgkJiXgY6Tm4qYkYt8hZOGjZSSiYNtcpCFf3lxhoGEfIR1hIGWgI/FZn+ph4+ja56Do5uEmoGOjoaKmXGOk4Vod3R8d2hodXFoaGteZHBtZ21YZ0ddUk0yRTQ2TmFjNyYzPEVHRDo2NDY1ODs4Pj09P0JNP05JSkxDUFpdXFdhXmptXFFFPUxNQEpkWF1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUl6KfsKepqKaroKS4saqrp5qUoKOkq6SXpaq3o6+AoaecpZ6diZS9mZONoZKej3mElpaRiKuZm5uZoYWPjHebnI+fkIiepJuVmZiHo7mupZqcjIx+Ym2Pi5OQjZCMjZiMkZKfj5SgoZmhp36hp4etnaCWrY+enJ2RhYCgjauuhqONqZmMmn+jdYCZlGuCrHVNq3iHjZyRm6ingKmrfYOhe3qnaZ5/kmtnl4aXtomefm5gZFmDl3+Me2Roi3KZfXmVbF17lm1fU3CDXF9reYNgWWWCfYOAl3CnqmuDo25ypXCfhaBpZqBtW26KfGZaYIN/YldQb3dmbXRya2pvXmtwbWxpWGlPXVhGOUE0R0ReazQsSUNSTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl5jdmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBiZGNhY2lrZGJkZGdkYmdlYWNol5adoLigqqSmrJGhtbysrqKZmKCipayuoZ2utaKokqGgn6abmY2YtJmQi5+MlYt1gZSSjYqmlpWYnp5/koWGrKSHm5CKmKmYmZqSiKaxp6KWmoiJgGluiIiLjo6Ki42Si5CSooyUnqCcoaR/k4GPo6GUoHeclo+ng6Gnf4aprISleIp8hJp+onBzlIiWe56MeW2Hm4yZkJuomo+HnXuConN2pmaefnekX5h6fZJzom6Yt7S6dJOHgn+1qGSBxrh7cJW3i3GAmqRic6yrYH1pnbN+bnyGgo2Ci5hxf6NscqN0noSAo2CdmbOWcXyXn7N0c1uesoNqYm90dnFpb1hrbHJyZl1pXmJLRT1ENlFBWXEzPVNHX0pSPTwzOTU6OjZEOztASlA/VU1OUUBFX15bWVhgYHxkSEM4TFdVVmNhWmVma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO4mauck6CNpLe1rq2gm6Kdo6Omrpybsa2sk5ihmaGkmZqUnqubi4iSeIuFcYCWjYmPoZCSlJ2XfZCJjqigh5iOipGjk5ybjYupqKWekJeHhX5re4d+fY+Ng4uQkImPlKCDl56gnaCei4l3nJiijJ9yoYuHqIibpY+Wp6p+rYx+eqCZeqOTeIF0loiNnH2Vn4abjpmbpoaiZKF8iJaQm41snmiajW6amXuAi6d9cmh0q4Oeg3SqaJWaXZuFdoSdaKpqgLhmXKhwgZxglYxep3Z1h4l+nmiadYaTkpeOf59umpBtp5pdqH54u2t+qluOhF2zZ1xucnp4a2lccWp4eWNgZlhiQVFFTzdWQ1JvNUtaWl9PWkRAMTUxOzs2SD86Q0hVPllSWV0+RGJeVmBRYWN9akVCOU5bXVllZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtZuniGOUm6u6srCsnaacnKmfnq6bnrCorJ2XpJqhn5iWlqCjmYaJjWqIgHJ7l4iLlpaEkZSYj3qKhJajnYqUj4aLnpKdnYmQqaOgmoySioCAaYCGeH+XjHuIjo6Ij5aaf5Sin6Chk5hyaJ+Kn4+McJKMgamHmJ6ip5+nfK+to6K4l3ejs6KkgIiUeZ17qpp/oo6dm5eIl3GhfIWNr7V9a5qRoXh+mLSjo6uohJl8m32dmn90qlpdb3uWi3ieYkx+enqFY3mXQkyeWaJqcnyObYCIhJl1m3iGibGzf3+bk6d2gp1uc32Ub5lza6RdlXZIZWRhc3F+fm5mYGxpdntkZWJSXlddVVdAWkZRaERTV1xiWF5JRD1COD9COklGOExFWEFXUVtWREZiXFpgS2BtfnJFQzxVX2JaZmpWZ2htb2JmZ15hYVxdXmFoYl9lY3ZsXmVnZmtkZmxpaGtpk5yBsK2ZhFReoKazubOzqZqijJyrnJyplKKrpKGoj5+enZqZlZihnZaIh4l3hoFveZWFkJuLfJGTlohyf4iSoZtzkZCBiZmVoJuFjqmcmpWLi4p8g2yEhXGBoYx4hY2IiJOYlXyTo6Ceo4ithn21hI6enHullnqpgZWcj4qgnHynaHdtfpl0oXNxfJ6GmXCTg659pIOmnpmAo29eqGd1omNvpWGc05B8e5l4cnNjooaQfqNzpI92a5CzjGCCmIlzqrKovH93g21+vqaptF6cbn1xl25/cqJyXaRnc6ZhaKZtm9SZfYWbcHp6l2ubfHiXc26ppGdhZXlwgIRrZ2ZkbnV3Z2BjVFtmUVFiSVdKVGBXU1tlalxlUUZDS01KS0JLRThPQFFOWFJZT1NRYWZlalJjd3l3SUZFY11lWmhpVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJebf7CrVFxLfqmvsbSws6ObmYWZqaCgpI6lqKCYqYqZmJiTmZOSoJiOh4Z7cH2EaH2Pg5SagXeQjo+Jb3+Gj5KSbJeTfImRkqSWg46qmpOSi4WJeoN2h4BugZ+GeICShoeZopd7lKOkmp+Js6Gitot6rKekrqVwqICakIWAm5F7pIChmYaYcp6Eo66vipeMf4ykjZWDraGUdrS1tcmhc5SKgZ9gnZepbXmVhqCbdaGHd6B+kpeLgW9MZqOScJuHcqR7enRhg4FrfqBrcWRfnHF9dJdpemmztbTGpnOYfnqda5ybq3WEm211eJhpmnp1mHJQRX20Xmp2a3mHZmpoYnR1cG5WXlRZaVBTaElWTVlTVl1oa25WZ1dNS0FJTUtISk9BUUtQZWNpbWV1c3N/eXxudYl7e1RQTmxeaFtraVJqaGlsZ2xmY2VfXF1cXmliZGlre19dZGhjamZvbWVpbGWhnIivpoRmP5Shs6uvr7aiopCAmKqioqWMpaednaaCmpeWjZeQj5yTjoiDeWp5hmWDjH+XoHl1joiMgWmEhZKCjIWdjXqMi5Wmk4OXqZiMkYuBiXqAfYt5cJChhnmBlYeJlqCVf5Slp5yWloRmbnicbKJkfHGld5uYcGemgJaLe6R6n5aDl3KedoGKlJaPuW6QiqJifZmhlYhtcmmranWgbW6mX5ppi5BoloealXWigH2aYIyGjXVviGJooGWefmmadW9jZoiCbXKiWl9bYqFtXYmMb3t+c3JkpW13omRnp2iZc4yZb6JvU4mQb6BfZahUi15UmG5tc2tygm1waWt5c2tvUllXV2daVG1JWU9dSFhpaXNqWWtWUVJFVlxMWFNhVWlrX3d0en1wfXxyg3t/c3aNgIR2XlFyYmdicGdQamhoa2xuaGRnX11eXWBrYmppdnVdXGNpY2pqc2xma21jnKSYpnpldG2Lp66kqbCxpp+LgJirnZ+mjKKhm6KigJaYk42aj4uYkI6Ke4ZxgIhoi4t8mJtzdIl9kHtkgoeViomWmYJ8iIeWqJGBoqyRhpCKgop+gICOc2mPpYR9hpSNiJigjoiTqqadiaZ4lZt+pYiWjLKYnpCCr5efpXeUh3mpdKSOhJpupKKMkoSMg7tufaWvg4aGhpOVnJ98pXpxqJWglmaefm+rY5aKlZJ4qGypooGJdoiDd6qRpodqkbBrdrOMqWuKhm1tn56SlWB+q4uqdn5/jKWedp99hKSVnaBqm4h3rGefrYy2dHe+jaSTWYOmjathdXJ0cHx1cWNqfm5obFNXW1ZhYl1rTV1SXUlebm52YFtxWVtgWmd0ZW5vcWJxdGB3en55cnmDc4R/gXt7jIGCgHZieGRjbXNkUmtnaG9scmpmaWFfXlxia2JtbHpvXFxiaWJsandtZ2xuYpWlqp2BgJ6klqmqnainrqSZiYOYq5qepImbpZ2pnYWMmo6GnJGFko2MjXSGeoiEb42EfpiTdHSGcpKDbX+LkoeGk499e4KFmKaOf6WmjoGOiYWVdoKHkm9si6mAg4uUjomcn4mMlKqjoI+AdZSWiH6BeZSuo3+Bm3GPhXiPioN+e3KmjHF9fXqXlpuEjnh7fn6HlJWTinaQmJ+gg3p9iWuMhVt5eHJ6cGhufpKJcX91gY+Uk3GGhIJljH9egX+Ld3VzlHVveW5uh22EhV52aHiOZYCAhY2pm310fJZqiYhwgXZ9hnZtbWeMc3l7mHiFW2tYeY9pbndycXB4eHBdbIZuaWdWW2BXXGVrY1ViVV9RX3B4eGxrdmVqa2t2fXFydHNhb3VidHuBeHV5g3WAgX+BeYuFg317bX9sZHhuXlduZ2h1a3hqaWplXGBaY2lmbHF1blpbYmtkbGx5bmhsb2GNlLiopouhopqmpJmlnKujoYSEmKySnqGJmqaaqZiDgZuKfpaTh46KiY1yg3yPfX6PhXuXjnNyg3CVhXt9kouGhpCFeH2AhpmkjnynoYuGkJCFloOGjph3coWphY6RnZCInp6IjJuon6Cqg4mNlJp+fomWraiPkqaPd2+ckIJ5kW99qIVwfZVxa3B9gZ+Mf5OOjGhtXYOLjJybno5zlYuIcXRrgXZ0gFhyboaRgX1+jGpdamR7hYSJgGBpeHqbe4KLgnWBhYJnd4qGa2FwcYF2XnKKgYiPppWFZYyPg253i4Rxho96cGZnZXuDepZbXGpnbnZbe3l3dW5zc4JmXG2Ka2tiWlpfWllscVxfYVpeXWZ0fnp0b3Rja2tqe31ze3h0ZG11aG18fnZ6fHt6eoCAfm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtobGtxcm1XW2VubGdzeW9oam1gi4uqsKGQo6Ganp6Ynpmoo6J+g5mtjZ+ViJyikaWVf3uYhHySmYmIhoeKc32Bi3aFi4GElopxb4BymIaEfpOEg4aKgXqAg4uboJCCp6GHeI6YiZWLi5yXhYN6rIKRl5mUip6dh4ihq5+ioqOLiJObnKOZlqqhp6agkpuHlY17d42OhKd+fpKRkpOcsqablZ6QjbKTl4SljIyVm5+JkJuCiJGKa3yNd3hlgoaQi3yJnYSHi5CIiICEhJB3fHl0maGIhomeioSUfn2KgIB1b3OEg393hoaKj6aQg4WNh4ONkIx9iIyKkYN3bIKEfXqZanJoYXSKcH16d3dvdnSBXV5vhmhuX15aXV1TaHJVY1xcYWxodXx8c29wZGtqaX98bnmAcWpwcGxngXtygoB4f31/hHttgoyGfHp4fH16g3lOZHZqcm1wemVrZWNiYFt0ZnBmcnFtVV1sdG1peXpxZ2lrZIyHnbmel6KhmJWYmZSZpKGefICaq46ejYagnIueln15lIN7jpmJhoSEhm54gIBygYd+iZSEbWt+epeHhIOQf4CGhIZ9h4SOm52Sh6ufhHKLkIaTkYudkX2Ne6qEjZKYlo+cloeGm6afopqdhYORmpmYkJqmn6WdnZCWgJCJdnuHjoSle3yOkJGGmKqhnZOdj42qjpGAnYyJk5qego6XfoaOg294hXJ0YH+Dj4Z1i5iBg4+ChoV+hYOUbXl1dJKhiouFmoSEjHN/iXx8cnJ7h4N6eIqOg5Kmj4WDjoGDiomKd4aJiox9b2x+gXxuaGxtZ196f2h9e3Z0dnV7d1xfcH1udGBjW11eUWduVGRaXmJraXZ6fnFsbGRrameAgGxzgWxsdG95b4V5boeAdoKAfoV2cYKNiH57e3x/e4KKYGl8anVoaYJlamNgaVxjdWhvYnRtbFVjcXllcHp6c2VqbWyLiZ63mqGkn5KRlpiLmp+fnnt4nqeRnIqHpZSLmJl5eoyFfImRg4yCgoJue394c4GFfYuRfWtofYKYiYGIjnx9hoSHfY+BkJubkYmonIBwjIuMk4ehooqFjHyokYiQkpeTlpN4jKOgoJ2WmX+AkJqYkoyao6GjmZeRm36NhXiAg46GoH9+jIyPfJikoKGTmZCPpo2PgpqRiZOXm36Tkn6HjoF0dIJwdmB+gI2GcYqVfIiMcYx/goWGjmd3cXiLmJGPfpd9h4pygYZ7fHF4eoqEenmQjIKVpZOLhZB7hYaHhXaChImIe2ZyfH95e3FsamZffnNofHV2c3xzgGpeYHN2cHdkY1lfXlJraVRkWV9haGp2eYFxZmtkbGhlgIFrbX5ob3FrfXiGemuMgXOBgX6BdHaCjYZ+fHp/gX1/j2pyg25zaWKHaGxiX3FWdG9tbmB4aG1XanR2Y3V6e3Jiam95iY2espGkpZ2OkJiPhp2gm518dqWhjpiAjKKKiJqWeHuGh36DiX+IgoF/cX97dHaChX6KkXhnY32Gl4qCiox4fYCNg3mWgZWYlo2WoJt+cIyCkZSGppuHjYmDppWFk4uWl5OSd5GdoaGXk5Z5fo6Yl46Wmp2knZiSlJt5j4WCd4SWjZ1+gYmNjHKXo56hk5mOj6KMi4OWmIOSlZl/mIx8iI2AdnF9bnpkgHyKhXCGk3+QgmyHgoGAiYRldW97hpKXjHyTd4qIe4CFfHtxfneIhXmEj4mKl6KVgYOLd4iEg4J3fIKKhndgeXh9dH94Z2xlYX9pandzdHV9cXxiY2FzbnRybWFaYV5bbGVSY1hgYWlrdnmGcWNqY21laH2DbGh1aGxvaYB8gXltkIZxgISDf3R8g4yBgH56goN+fJBtdol0dG1limxqYmN1VoRpcW5geGdsYmp2cGZ5fHlxX3FshoWPnK6XpqiejY2Xh4afk5eZfXiqnIqZepedi4yYkHl7gIt9fIN8gIKBeHR5enR9gIR/iYuAZF59i5WHf4WHdH1+in99mISXlJeMpKKYf3OHe5SSiqePjI6KkqCRg5GQlJeRi4GPmJ+akpCQc3+NkpSJnZ2eppiYjZWWc42OimuFl4+ZeoeIkIlvl52ao5OVio2ejIaCkpx/kpKVh5mIfIqJgXlxeWt1bHx+i35thZKClHhwgoN9fop/ZHJpe4CWl4R+jXOPiIN4hn12d398hYB8goyEjJSkj3iEgnSJh32AdHaBiYRvYXt1enF9b2JvY2R7Ym5vdnN4d3N0YXVgb2x1bm9cXF9eXmteUF1YY2FobXR7iGtfamZqY2h3iG5mbGhqbGiBfHp3bpCIc4GEhH10gYaJeoN9eoGEfX2OcnqLeHhubIdqaF9pcmKHaHFvZXZnbmxheWlrfXt4cGF3bYuAmZmqoKOonoqKkYaKnouVmH53rpmNl32fk5GWlIh3fXuKfHuAdnh/gHB0dHtvhX2BgIp/fGFbfo+ShoCEhHN6gId6j5KIkpGck6WclYJ9gn2Oi5KkiY6KjZeajYWRmJOWj4qIjJKck4+LjG6Dj4+RiJ6ZoqGXlomWkG6ImYNmhZiOk3qIhJCKcJWalKKSkomLmYyCf5CefZKPkoyZjnuKhIdzcnVrcG51e4t0boaQjpJxdYB7gYGIfGRwbHh9mZN9hIh0kIqAc4d5bn99gIV7hYuIhIyVqIx6h3x+i4V4fnFwgYaEY2h5dHVwfGJfcGFrdF5want5eGxzcGV4XW5sc21zWFpfX2JrWlBXWGVjZ3FxfodmXWloZ2JncY1uZGlnZGlogHp3dW+OhXSBgoN7dYKIhXeFfHiDhXqAiXd/i3t6cniDamtfcGh0gGpyb21xZ29sZXxjboB6d3Fsd3eKfqKXoaigppuHjIqBkJ2Hk511gaqVk46HoY2Vk5CAdHt2hXh5f3Jze4VrcnB6bYp2gIGHbnFbWH6RjYiAgIB2dYCAf6CGkYuSnZihlZh4ioCBjYmcnoqPhpKXloWJlZmPlouLjY2MnYqNj4NtiYuQkIqdlqGcmJSFmIdqhKOCZoWdipB+i4OLgXeTmJGekZCJiZWNf36PmHyRjY+OmpF8ioCCbnVwbG1vcHuFaXODjpiKcXeAdYKIgnhmcm51gZmOe4iEepOReXaHc2+Ie4WLeoqFgoiOm6OHe4N1gYt/eHhvbIGEgl5ydHJwcHhaXnBgcGpeb2p9enBtbWpsdmBwb2pxbVpYYWFiblhRU1pmZ2N1b4SCYl1rbWRiZmuSbmBmZl9na4F1cXNwi4B1f4OAeHWAi4B4hX93h4Z3g4V8h4x/e3aKf2pxY3xjhnxucWx0amhvbHZ4X3F/eXx0dXSAgn6klZqtnqaWhY2Ef5eUg5CgdYuglJOGi5uMlY6LenJ4dIJwcoVzcXWIa29tdW2IdoN+gG1uVVGBq5WHgniAd3KCeoKggpKCk5OYnJOaeJJ7g42TpJqTjomVmJKEhpeZjJSLiY+PiJ6Ej4p8couFiY6InJqfmpaUf5N+aIWch2eFoIeShJGCiXGDkZePm46PjIyPjXh7kpB6jouMkZaMfIh8gGt2am5rbGx7fmF6fo6Wgnd6gHiDjHx5Z3Nsc4eVin6IhnuTj3F5g292jHqJi3qIfYGLkJ6dhHx7d4KLfXdxamyCg3pgeHBubHJ0Vl5vYnJgX2xueXBob2Zmc3RocGthd2VdVmZgYHJTUU5cZmVeeXCIfF9caHJiYmVmkmpfaGRbZ3B+cGtxdIp9dnyFgHR1fox5e4aBeIiDc4aFfo2Ng3t5lXhmcmqDYIh9b29remBqbnR/dV90fXiGeHRzhXx4oI+ZsZyljoKKf4Oah4CMnn+LmpOOhYiXjo6PhHZ0dnOAcG+Fc3Bxg29qaXZug259fW11c1JNgt/IktaTfHB1g3aDn4OTd5SRmZyQmXuUc4WQn6GTk5CKkpuThn6WloiNjYiRjIicfo6Ad3qMfoiMipycnZuVk3qNdWeIkYZsiKKEkYiXgoVjjJGZjpWKl4uNiotxepSIe46IipORiXmFfH5se2Vyb2treXlcgHmQjoB7fX5/ho56emhyanOKj4mBhYR8lIprfX5uf4t+i4d8hHmBj5WamYp8dniDkHhzbWdxgIRtanRvaGp0blNeb2RwWV9rcXdma2piZnhyb3BjX3dgYFZrX152UE5LYWdjXXpwiXRcXGV2YGFlZY5jYWZiWGlzc21qcXaMfXR5hoJ1dn6Lc4CGf3qJfnKJh4GRi4h8fph2ZXNufWWIfm9wa4BabG55eXNhdnp7jXZyd4p3eZ6Lm6+boJCChXeIlX59ip2HhaCRj4WMmISSjoeBdHdweXFuhG9tbn5yZGV4cH1ten1qaGtjpJrB3K7voXNsdoR2hKKFkm+WkZWglZyBknKFi6OXiY6VipCdloOAlZCFiY+AkYqJln6HenV/iXiGhI2cm5iZjo92inZuhYiKfYqjhJGJnISFXouTl4qOiY6KioSJbXuWgX2IhYmRj4Z2hX19a31keHVpbnhzWIh6koeFeX6AgIWMfnhlcml/iY6JgoJ/i5aFa4F1bYeQgY+EfoJ6f5CVk5iPdXN3iI11c3FndXqDYnRtcGJpdmdSYXFnbFVfbnR5YXJkX2h9cHJuWmNyYWJXbllceE5NTGRnYl53c4ltXFxkeV5gZGWFYGNjXllqcmtua3J3jH50d4SBeHd7iXGDhH1+iHt0i4mHloaMfn6Xc2h1cXlti3pudHCAV3F6dnlxZXd5hoxodoCJcn+ch5mnnKOShX1wjJR4eYudhIWhjY58lo1/moiEe3J3cHNqb4FraW18dV5heHd7cXV7Z2BkfOvatcnD3IhzbHSBdoqaiY5qmJCPnZaTgYlxhYmgjYSLlYqMmJN8jZOIg4mPe5CLhY+Bf3Z4g4Ryh4KTm5eUl4aMdYd/cISBiYaYoYKTjJ6CiWGDlI+GiYaJjYeBh2p9lIB9g4SJjo2CcYZ+f3F3aHZyaXN3bFqMfJKDhX1/g4CEioJ1YXNriIGPioF+fpGQfW2Ba3iFjoWRg3yBfH+RkpCWiG5xeoyGdWxxbHJ5gWB0aW5da3ZgUmVxaWZTYHB2dGBvYF1ognFzaVdnaGJpWG1WW3VMS0xmZ19icnOFaVtcZXleXmRne2BkX11Za25mb2lzeIp+c3OBfnp2eohzhYN8gId2d4qGjpmBjIJ7k3Vsd3V5eJN0bnh7fFh6hnGAb2d4d5KCY3aGhXGKloWZoZqiiodzb5OLcneOnH2KmomJfJ9/g5l/gXhxc25vZHJ+aGZsd3hbX3l7e3FxgGphZ2F/1baOkKZ4bnF3fHGSkY2HapmOiZySjIZ7aYeLmYaBkpGGh5iNfI2NgYGJjXuPjX2IhHp0eoJ6cIaAlpqOk5SBiHWDhXWDf4qSnJ6GlY+ffohhf5OHhIiEiY2AgINnfZGAfn+CjI6Qfm2CfIJ0a213dHN2dWtjjYGPf4V+fIR/hIh+b19ycIR7joyBfH6QiHlwg2Z5goqGi4J7hH1/k46PkoNub3mMfnVtb2tse35jaGtqWW52WlNpcmliUWJyd2xiZV5aaoNtc2JbZ19kbF9uVFtwTkhPZ2VcZ25xgGxbW2NzYFxjbHdkZV1dWmtsYm1qdHeGf3Fwf3x9dHiGeIWCfX+HdXmJgZKWfIiGdomBcHd5e4STb218gXdeg390gW1penSUc2dzh3xykpGDmp+boIaIdnaVfm12lJd+iJGEio6afIyadn12cW9samF1fGZiaXV6Wl93fHptcX9lZGhnV52PXnFzlrzEhHZxlImQfnOYjIadk4yIdGuIj5WAe5SLgYSbjHyKhn18iYx/lIh1iYV1dn2BcXWGgZ6VhpWPgoJyf4d0g3uJl5yXhpONnICIZX2Sgn+Fg4mJcoF9Z32Le3l/f4eLj31pgH2DdmZveHhzdnNsao2FioGKf3mCgISDf2pecXd6fYyJhXuAj39+coBoeIKGioWDeIN8gJeMj4x9bmx6iX13dG9paH13ZV1xY1hwc1NUbnJpYk5ndHhmYF1cWG6Ab3NZZWJdam1gcE9ZbFJEVGhhWmtubXtvWltebGNaY292ZGdcXWBramNsaXN2gYNxbn57f3R1g3qDgnyBhXZ+iYGWkXiDinSBiHJ5eX+OkG9vfIFxaYF5en5tbXx2lWtqeIR0a5SNhZ+YoJqFiG59jHZqeJiPf4KKgpWYinmPlm96c3BsamRgdHpoX2Vye1phcnx5ZnB6YWVljrGyd0piWqTZ0Jdye5GLkXh+lYuFmZGNhnBshpKRenmShoGEmYp8h394eImKhJaAb4qHcXR9eml5hYOlkYSTjYN/b36CdoJ4hZqYk4qTj5SFh296koN9g4OJg2+BeGiAhXhyf3+Diod8ZX1+g3VjcHKAaHhxb3WYjYWCint2eICEeYFqW3B8coCHhYh9hYh6iHKAbXCDho6Dg3KDeICYjI2Ed21ufoR/d3plaGp9cmBZd1pZcm1OWHJzZmBKbXZ0YV1bW1l0fXJvV2ddZmpwX29OV2lSP1lnX1twamd5cVxaWWtlWWNweV9oXV5lbGhmbGlxd3+Hb21/fYB1cIF6f4F/gn92gYWJl4pxgo1xe4Z8enqElIx1anp/a29+dH99b3J8e5Rwb4B/eGaSioKhmJySgoVnh4RwaHqXiX5/hYKZioF8jYxpeHJrbGZfYW95bV9ib3lcZGyDemFxdl9lZdXrvosyOj6LjoByeYWIjo12hJeNf5OOjX9ubIWNjHV9j3+FgZWIfIN4bnaHhIKWd26IhGx1e3RmeYKDp4yDj4yDfW5/dHaCeYWbj4uPkZKMi4Z+e5KHeICEjYNsgHJpf354bXx7gYqDeGF5hIFxZHFofm10cXSBm4uAf4V+c3V9gHOAb1trfXR4iYKKe4Z/fIh4eXBriIKPg4lygXh/loqKfnRtanaAgHV1XGlpeHFZV31TWnFlTFtycmVbSnB3b11bWllddH50aFliW2dlbmJpTVdmUT1eZl1ddmZfdHBbWVVvZFpkcHlaaF5gZ21naWxpcHh9jmxqgoR/eW6Ae32Af4J6dYKBjJOFcICLbnd+gHt7iJOJf2h7fmt0e3KGe3N3fX+MeniEfnxrjIyDm52WjIGAbI1+a2l/j417fn+DlIJ/fYqIa3VxZ2hjW2Jnc29fYWxzYWhwiXphc3ReY2SboJBuXDVZr7V1aoCJfZKGdoaXhnSPjIp3cGyFg4d0eYl4iXyTiHp+cmd2iH59l29whn1odnltZXmIhKWHgYeNin5tfXZ/gHyLmIaBk5CXiIuEiXyPiHF7fYV8aX5taoB7emp6doKHgHJgd4F+cWRyZ3WCbXV7hZWRgXyCf293eXx0fm1XbX52c4uBhneHdYGJeXhybYiAj4CEcn59fZKIiHpubWltgoF1bl1oZnRyUlt7TlxxXE9ccm9kVktzeGpXWVlaYXGAdGBdXWBmZGhoZk5aaE5BYWRbYHZhXHVtWFhTdGFaZG5yV2peYmhrZ21saXB3fJJsaYSKfX1wfn57gX+CeneAgImLhHJ7h29xd4N/e4qNj4NqfntueHl2ind9eICCh3+Df356bYWMiJijjYSDe3aMeWtthImSeX17gpGAgH2Kg3BxcGNmXllnX3BwYGBncGZqb4p1YXRvW2FkaXZ7f76cpqPIuHKFg3OUfXiHlIN0kIyIcnJwhHuDc3WGdIh3lIh5eXFjd4Z5gJJocoR1Znd2Y2p8g4iegoB/jo59cX5zhHh/kY+Cd5WNlI+Hgoh6iYlreHl+dWh6aWt/eXNpenaAg31oYHeHfmpqc2h7gGl2gYyQlH56fn5xe3Z7dH1hVXV8cnKJg4J8gnCGiXd4cG+Cgot+fXh9fHWNhYN2aHFobIiCcnBdaGN0bktldkxeb1VUWXNtYlFPdHhhUldYXGFwgnNbYFxoZWRjamRQW3FJRGRhXGRxXlx3aFVXVndeXGVuaFZsXmFqZ2Vvb2hwd3uTbmmIi3l+cnt+eYKBgnx2fYOIhoNwdoNybXeCg36Ji5R/cIB8eHl6gYt0g3h/gYGChHmAdm9+iYubnoh9hnp3h3xodIaNkXp/f3yJhoR2j4Bnb21fZFxYZVltc2FgYXFsbGiJbmBzaVleZG2Ad6naqseGh7JyinhwjXV7h4+AepOKgHV0dX53gG9xfm2FdJSGeHRsYHqBeYiOZXGDb2d1blttfYGQk4CBeZKSfXd6bYZ1f5CLg3OVipCOh4WFe3+FbXV2f25od2VtfHZtanZ2f398YWJ4hnpodXVjfnpndIaOjJV7dIB1cYB6fGx/WVVyfW90g4Z+f3hriIZzeGp0f4ODfXp8eHtyioB8c2dzZW2LhG10W2pfdmVIbm9MW2JXV1Z4bWJQU3R2WFBVWF5gcYRvXGBjbWRjXm5iVF1yR0NmX11maF5ae2JSVlx1W1tna2FWa19hbmZmbHFocHZ4jnRrjo11f3Z4fXeBg4F7dH2DiIiDb3F/dHF1foaCiY2Ke3d/eIR8fYWHeId8fYF+hIB7fnN2eYyOn4yJeol3dYN5Xn6Gmo15h4N0hoaEd4l7Ym5sW2JbW2FWanRjYFtob3Bnh3JhcWZXXWNrf3zKzoe5omttbottcoVyfYWKf3uShXp5dHl1dHpqbXVjhHaSgndwZ158gXmLiWVxgWpqcWNYbHuGnImDgnOXlHd+e22HcICJioZwlo6QiIWLg3p5fnFxb31naHJibXhyamxxd318el1leYB3aXV4ZoJ2Z3SHjI2UfHKHaW5+gHltfF1XcH1tc3+Ke4Fubol/cHZndn6AfoF1e3F6dIZ7eXFlcmFujIJsc1hrX3hcSW9sTVdWXlRVe2thT1R1clFRVFZeYnSFaFxga2pmYlluYVhicEdBaF1gZl5dVnteT1ZkcFpbamhdV2dgX3JmamhyZ3Bzd4Z4bpWKdH96d355g4eAdXN/hoWOgnBwe3d3dXmHhYeMhnp8f3WLfn2GhISHf35+fYd/fHh1eXeRk59+jH2LbnWAeWSDiJeGdJKKb4WFgnqDdGNuallfW11dVGdzZWBZZHJyZ4FzYmtkV1tgaX94vq57n7duYnOHaHR8cnqDhnt9jYB4eHN2b3t2ZWpuYYd1joFzamJefnh5ioNmcX1oamtaVm94iqOBhX9xmZNxgHh0gW1/gZCGcpSHjIeDiIV9eXRyb2h5YWptYG12a2dra3p3endbZ318eGVzfW6EdGV1ho2GlX5wi2ZreoN0bHRiW257a3R8i3qBZnSGfW1wZ3R+d31+cXtrenuBeXdwZWxhbYl+bW5Wa2B3VktrbE9ST2hOWXxnYk5VdWtNUFRVXmd2g2ZdYXBoZ2BXaV1ca2hKRWpaYmRXWVV5Wk5XbmpZXWxlXFllY150ZmxkcmdycHSAeHCZhXZ/fnh/fIWHfXVzgoeAlYJuc3h6enNzhYeIiIR5gX12j398hImOg4GDe36Lg3t3fHd3mZ2XeoqDh2l2fnxshIWUgHKPgnGGgn6Cf29mbGdXXVtcW1NkcGVfWGNydWl2cGVlYldcXGiAcG9ygHOJZWV5f2p0dnNzg4V4gYR6d3R1bmp6cGJna2eGdI2EbmZeX3xve4l+aGx3ZmlkVVdycI2nfIR8dpaQc3xye3ltenqQhHaXe4eGgoaDfXVwcm1ndV1taF9sdWRnZml6b3tyWWeBdnVncIB4gnVhd4WLfJSAbotqbXqAcGVyZWBseWZydol7fWF1g3Zpa3F0enB5eHJ8Zn5+fnh2bmNlYW2GfG1rVmpicVRMaWtQTE5wR157ZmFNVXRkSk5TV2Fqd35lXWdzaWVfVmNXYnBdS0trWGNiVVRVc1dMWXZkWl9rYFxaY2Vfd2dtYnBpc29xfnV0mYF3f4B4f36FhHp9doKDfpiFbnJ0e3p0cYWFj4KAeot1dZGAfYGUjoCFhHx+jIZ6foB2e6OlinmIhoVsdXx7dYSCjHpvhXN6hX2Cg3VuamhlVl1bW1pTY25lW1hhdHtqaW1oX2JXX1ppgGlrb4BnbGFoenlrdHR0b4WBen99dnVuemhqeWpfZW5ogXeQhGdlWGJ3aX6Hem9pb2ZmXVVYb2iPp3aBenyRjnh1b35ucnR4jn53lHSFgn+FiHZqcnZnaG9cbWVebXNfZ2FqeGh7bVttg3NzaW+Afnl3YHaEhHiPhHOIcXB5f3FjcWhbbnZkcHOIe3hhcoBwZ2l4c3Frd3Z0dmODe353dXBjY2NtfH1ra1VpYmdUS2xoUEdSbEVhd2ZiTVRyXUpMVFlka3d6ZV9tcGlkXFZfVW5uV0pTaFhmXlhNVWxUS1x6X1tfa11dW2JlYHpobGFvb3Vub3d1epd9d3+BeYB/h4Z6eXqDfYGThHF0dH55dnSFiJB9gH2QbHOVgXuCn4V/h32AfoaCgIp7doSsnn96iIeEbHKCeXaBgIJ0boZvfIB0ioBqcG1kZFhfWlpaVWJqZ1taX3WCaV5ubFxhVlxca4FlcnR9aWpdbHd2Z3R3cm6Ge359eXZzbHpnaXhmXWRyZ3p3koFjY1Rlb2eChHd2ZmhpYFdWWWhkkKdufniAi456cHB8ZnhueYt6do5xg31+f4ZuZHZzZGhoXWxiXW9vW2debHRlemlddIBvcmtxe351dWF0hYp6h4eAf3dydX50YW9sWXByYnFxhHt1ZHKAbGBsem9qaHp3dHFlhHR5enVxZGFkbXN+amxUaV5eVUxzY1FHV2JHY3ZmYUtUcFhKS1dYZ2t2emRlbXBmY1pYXVh2ZlRKXGNYaFhZSVdlUUhieVpdYGxbXlxiZF6AaWpfb3R4bm9udoOXeXKBgH1/iIuGfnV2hniGjH1zdXWBeXp6goyOfX6EiWp0loF7ip19foV5gHp+fIaIc3GPrYx7e4aQfmZxiHp0fX12cm+GbHt+bY96YnBvYWVeZVZZWVdjZmtgXV1zhmlZcW5bXldaXGx7Y3F3dm1jW21zdGh1dnFthXl/gHl3bm90ZWh0ZVtndGZ2dpF6X11SZWZqgoF0fWFjaVxUWF5iY5ClaHl0g4aQeGxueWd3bHuEenSIcoB4e3h/aGV2bWBmYV9qYF10a1llXW9uYnpmW3h8a25ucHh5dHRkcoOSf4eCiHp2b3F8cmF3Y1pub2FwcYF8c2VxgGRebXZpY2Z4enNtboF0c3xzcWFeZW1vfWVpVGhZWlVOeWBSS1pZSGJ0ZGFJVG1TSUtaV2lscntjbGxzY2FZWlthdlxTS2NdWGlTV0hZYE5HanZYX2FtW1tfYmNdhWloYW54eWxvanaBkHhtgn6AgZKIhIF2dYlzi4ZzcXZ2gXd8fX6MkIB+k35weJaDfZmSeYCAeHl+f3OIg3NwmaF7e4CJlXlkdYh5c3l2a3Nwf2t5fHCRcl5wb2BnYmxUWllXaGNtZlxccolmU3JuW1lYWGBsdmRqdWpqX1ttdHFtdHR0a4Z8f4B8d29ubGRpcWNba3JkdHaPc1xXVGRgcX9+cYJcYWNdU1pgXGOTn2VycYSDkHRranlsbm96enpxgHd/cnl6emRmdWdeYlthaFxed2hXYl1waGF4YVt7dmppcm93dHN0aXCBlIOGfoR2cmpwe21ldldbam1icHKAenNlb35bYG9xYl5pb3xsa3N9cnB4a3BgW2VrbXthZ1RnVVhSUXdcU1BZUkhjc2JgR1ZrUUhPWlVra2t8ZW1vcWFbWlhZbHBXUk9mV1dpU1RGWlxPSHJ1WWBkbWNYYWBhXoxqY2RteXhrb2l1eYZ7a4N9gIWZfIKEeX2HbY+GcW93enx0goJ9i4+DgpZ0eIKUhYGfiXWBf4F0f4Jwh4J1b6KXdHuGi4d7ZneLb258cGZ4cXpsc3ZzjWtedG5hZ2VrUl1bVmhibGxbXHGMZE5vbl1WWFVnaXRoY3RlZV1abnVucHV1emyHfYB8iHeQc2Nla25hXG5tY3N4h2taVFZiY3d8fHCFXGNfY1RbYFlilpVjbnCDhIpzamd5bmVydXJ6a3l0dG56fnVfZnNjW15XYmRZYXVmVV9gbWNhcV1dfm9oaXNxc3B1dWtshJOBiHuFcXJmbntvcW5TWmVqZXFzgHZzYmx2VWJxa1tebmR8ZWt1fHJycmptX1ljaWp4XmZUZVVWUFVuWFJXVE9IZXJfYUZYak5IV1RWbWhkfGlrd2phV1xVW3RkU1JWaFFZZlRTSFpbUE54d1tgZmxpWmJgXl6PbmJma3l1bm5pdnZ/fm2DgH6Gl3t/h4GJfmuSiHJndIB7dYCDfomPf4uTcn2KkYWHn4Z7f4aMc4CGc32CdW6kjHOBjYt3eG57jWBkfHFnenN5bG1xdoNnZHxsY2ZnaFNfX1VnYGxvXF5ujmhNaW1gVVZTb2ZzbGV4ZGVdWXF1bXJ7eHNtiXuAd5x7emxhZWxtXmBuamVweX5nWlZYYGt3e3pvg15iXmdWWWBXY5yIYmtxgYZ8d2tqdmxbdnBreWl1cm1ue4ByWGpuXlldVmJkWGVxY1ReYmliYm1aYH5rZmtzdW5td3ZraIWLfoh6h21xZm97bHFsYlhfaGhvc4B0c15pbVNlcGRVYm5heWJvdXt1am9sal9YYGZodV1lVmJWU09ZZlNPXU9PSGVvXWNHWmlNSV9LWG1kX3hobn1kYFVeVF10W1RSX2ZOXWJUU0pcWlFadnZdX2ZtaFhiYVtejnFjZ2p3cXNtZ3ZzeYNzgYN7iI1+fIqHjnlukIp0bHOBc39/iIWHkoSVj3p9jI+IkZuEgHyMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH1+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo6Ojo6Ojo2NjY2NjY6Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpKTk5OSk5OSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjI2Njo6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyRbWZnZ2dnZ32FhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERFQjEvMDAwMC5ccG5tbm5vamZnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJFnX2BgYF9eeYOCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTUzHhwcHB0dG1NqZ2dnZ2hjX19fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkY6NjY2NjY2PkJCQkJCQjIeHiIeHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhoWDg4OEhISEiIqKioqJiomIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkpKSkpKNkJKRiYeOipCSk5CJkI6NkYiPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6Ojo6Ojo+Pj4+OjY2NjY2NjY2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjIiHh4aJhYiQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCRjYaGhYWFh4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkI+Hi4SHhIaIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x8fX19fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjISKhoaIg4qPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiIuMi46Jjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2JiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5OUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTk5OSkpGTkoaTlJOVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKRjpGRkpOFfJSTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpJ8hJKRknh/k5ORkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCQkoJtjZKJcX+RkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+QhGd9koB0fpCPj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo+GaHCPfHR7jo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjoFdaXZtZXuNjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLiouIZ2ZtXmlndIaFg4SHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dXV2d3FgdG5hcHRqZWhrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hnY2ZubV1sdXBlYmNiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpdZmpvcXFzdGVZWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTlFfY2Vub29uYk9RVFBQTk5PTUpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OT0xNUF9oZ21ubGdhUk1OT09QT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0hGSU5YZm1obG1samhjXFdVUU9PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCUFpbXWRpb2lrbGppamlra2NSSEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7Pj49TF5nbGtua29taWlqbGVUSUNERUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7PDtHS0ddbW1ueHFpamhWSEFFRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozs+OzpPaXB6c2xjST1AQENGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk5OjpBV3RxWD83PDw9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT08Pjs7V186Ojw+PT4/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9AO11uQD5ERT8/QTtGWDs9PTs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo7bXdIODs6PT1BO0lbOjw9PDg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUTw9PUlMRUZ1d003ODg6Oz4+UGA7Oz08Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N5STtdf4N/eXx3Vjw9Pz09PkJdakE7PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFIcnlrYoKEg4KDgH1dPkBDQEA+Rm52TTo9QUVBQkJGSEM9PEBEREFAPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEZvdH2CgoGDfn2EdUxBQ0VAPz9XfIFcP0NFSUpJSU1NS0VDRkdHRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVxQkRFRENXdYaHh35YR0hKTUxOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hISEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ1dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIpsQUFWdIeJh4eHiINXSExNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0ZJSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3Z3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiINVbISHhoaGh4iIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSUdISEdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpVgYOEhIKChYaGg4KGhYSEhoaGh4eGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJAQUNDQkBBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWWFhISEf4GCg4KDg4SFhYaHiIiIiImMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc2ODk3ODc2ODg7Ozs9QDs5OTk9PD47Oz1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaoaEhIF+gYODg4KDhIaJiouMi4qJiouMiVQ6ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2NzY3Nzg6Njc3ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JmhYOBgIKDg4ODg4WJi4qJiYqKioqLiYqKgUc2NzY0Njg4NzQ1Nzg1Njc2OTk3NjY3NjU6OTo6Ojs4OTg5ODc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhISGiYqKiIeIiIiKioyKiYmMej45ODg7PD0+OTo6PDk6Ozk6Ozo5OTs6OT09PT47Ozw9Oj07OTs7PDs8PDk5PDg6Ojs6OTk5PD88PUFCRElKTUtJS0xXb3JzdXN2eHt7fHx7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUBCPkBCQEA+PT0+QD8+P0A/QD09P0I/QUE/QT89QEBAPj9BPT48Ozo7OTk7Pz07PD09QUFDQUJDQVhwcXR0dHZ6e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLioqKi4qLXj5ER0lLSklGR0dERkhHRUNAQENFQ0JAQkNCP0BESERDRUNFRUFGRUZERUZEQEI/PEA+PT9APj8+Pz4/Pj46Oz08YHFydHR1d3p6e319fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0NGV4SCg4SFhYaGiImJiIeGhoaHiYmKi4yNjIyLioqIVkhNTE1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3eXh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E+QkJHR0pZhIKDhYWGh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE5QTkxOS0pMSklJSEpGREdISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4Nzw7PD06P0A+P0BDRklKUV+Bg4WEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1yTlJPTkxMTExKSEdFSUlESkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dIR0NCQUNVbnB1d3d5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6PDg9Pjs9QT4/QURISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMi4uLi4tfUlJQTU5NS0pHRUJHSkdMSkZLTktLSkpNTUxPUE5ISUtMT1FRUFFPT0pISkpMSktGR0hHRUdJRkVFQkFCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKREVGS09OT1dVUVBPUVNSTVNUT01TTFBTVVZSU1FQTEpNTU1LTkdHSkZGSEpEREVFQkRDY3B1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9DQkZWTkZOUFBUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2hXVWthRVJRUVBJOztRU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FPTlJQUFBRS0tLSEhKSEVGSUlJSElpcnZ5eHl5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklIR0ZGRT8/QUFFQUNHRURFTFhSTVRVVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1E/QFZVWVtjYFZZYnJdXVZdWlZFUVlaW1lfVFlnUlZWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6eXp7enp8fXt+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+i4mKi3pucFhaXFtSU1JWVlRaWnSDWVV9kGBcWF1eV0lWXV1bW19ZSFlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVRVVFdSUVdVYpaAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ1xbXF1dV1NOU1BQUVZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT0xLZnlbXVRZVVZdWkxUWlVTVF5aWFdXV3prWFtbXF5UUVFQSU5PV1ZYW1pkcHJ2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTU5LTUtISkRGSEVDPlRkVX9SUVFOS1JUUU1PWVFNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXGxxdXZ1c3N3enp7e3t9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1dW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJWVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz9DQ0NDQj9EUEJDQEM9Q0lHVkBITkxHXWlQSEZORkRFRklHSENESEdIS0dEQkFEQE5RTVJkcnR2dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgmtNRz9AOjs+QEA/Pz5qUUthRUZISUVCP0dMTkdNUVVJQkU/Pjw9PD09Pz0/QUNDQD88PUI+Sk1HVW50dHVzdHZ4enx6fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXkpKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZUNAQEI9OkJDQUFEQlxdT3tOT05OS0xNT09RTEtMV01IR0BCPDk3NzU5OT07Ozs4OTg5PzxCSD9cc3R1dnV2eHp8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJSFBSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEZHSEJBR0lFRUZETVJQYVdSV1FQU1NSVVtPT1FXUE1JREY+Ojk2NTg3OTc5OjM2NTc5NTxCPWVzc3Z3d3l6e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LVFRTUFFVT0xSU1RXWFRUWFFMV1laVlhYVlhZXVdXWGhza11WYXNrYWFfXmRhX15ZVFFOTk5MSUhKS0lJRkNRUFNbV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NTc1Nzg1OTlHbnJ0eHh5e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVlVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTE9SUk9NTU5OTkxKRlFQVVlTVE9KTk9VU1RcVlJVU1JPTUxJSEhGPz49Ojc4NzY1OTk2NzY3NVdwcHR3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9JR09QT09NUkpPUE9QTk5PVExNSVBPU1RVMj1YTUlAUT1jYVFTUVBOUFFQTk5NUU5UUlBSTUlMSk9SUFJSU1RRUk9MTEtMTEhDQkE9Ojo4NzY7QjU1NjY6ZG9ydXh4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSUdFSExIS0lGTE1QTUcvRV9SPjM/PmpvYVJSUUBHVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR2ent7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APTs9P0FCQUNAQkVEQUBHSEdIRUZISk1LRUdDT1JDOEVOU11mU1FTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydXl7ent9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUWFdVTUxLSTw5ODc7P0A+PD1BQEI9PkVIR0NGRklHSkpARkFBQEZIRUpPSFBSYVxRUFJOU09PUExMT01LTUxNT05bV0tNUU9HSUhDSEpLTEpGRkZEP0JDPjxCRz9CP0FkcHR3e3p6e3x7enp3e3d5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSEREPTk3Nzk/Qj47P0JAQD5BRElFQ0dHSUZJRUJCPz49Q0JBR0lETU9iZVFNTk5XS0xNS0xNTU1MS05OU2ROSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES25vdnl5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEpEP0E9OTk5Oj9CPzxAQkJBREVHS0ZDSElHR0hDQz9CPz9AQT5ERUNLTlJUTEpJTVRGSUlKTEpLTElKTE1PUFJQS0dDTEdDQkpKTE1PTklKSUdDQ0NESUpNTElZcm13eXh6e3t5fHZycHVydHh5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZHFIS0RHSEhHSktJSktER0I9Pj06Ojo7QUI/PUJCQ0NHRklMSkRJSUZHR0NDO0FAQj5AQEJFQ0lNUEhIS0dIS0RISUtNSEpMSElKS0pNXFJISERORkFES0pNTVBNS01KS0ZHR0pNTlFOTGJtaXZ2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGdkb0ZLQ0ZFR0VGRkdFR0JDQD08PTk6OjpAQ0A+QkNERUlFSUpMRklJR0ZGREI7QkNDPkBDQ0NFR0xOSEtOSERIRUlMTk1ISUxHRkdJSUxOS0lIRU5JQkZNTE5NT01OTk1LSUhJT1JRUk5SZmZmcW9zeHV7enxsaGpuZWtxbHNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pERkZFQ0NDRUBEQj5APzo7Oz06PT5DQT5BQ0VGSkZJSEtIR0dHRkVDQD1FRUI+QkRDQ0VHSElHTVBKRkZHS05PS0ZISkZFREVJSkhLSUZIUEtDSU1MUE1PTk9QTkpKSE1SVVRST1dkYGFtZ3Byb3J5emdlaGhkaWxmcWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMR0VFR0NCQUJEPUJBPkE9OTo9Pzo9PkBCPkBCREdKRkpGSUhGRkdFQ0JBQUZGQ0JDQkRFRUdHSEZMUUxJT0pKTExJR0hFR0ZEQ0lJSEtKR0tSTUJOT01QT09PTU5PS0tLUFVXVlVUWF9eXGlhbWluaHJzYmVmZWRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWpzdW51dHNxcmprc01HSEZIQkJAREQ8QUBAQzw4OT0+OT88P0JAQEBERkhFSEZGSEdGRkRDRUNESUVDRkVCRUdFRkdHRUpNS0hRTUpLSEhJRUZISUZDSUpJS01LT1NORFFSUFFSTlBNTlBNTE1TV1ZXWFZYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW95TUhHSEhCQkJGRDw/QkJEPDc6Pj46PjpAQj4/P0JFRkRGRERIRkRFQ0RFRkdKRUVKR0NHSEZIR0VDRkpKR01KTEtISkxGSUlLSEVLS0xNTk9SVE9IU1VTUFNPUU1OUU5NUFdaVlpZVlpdWlhhYGBgXmhlY2BkZmhnamloamZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnhOSUhHSUNBQ0hFPEBFQkU9ODo+Pj08PEFCPD8+QUJGQ0VCQ0hFQ0VFRkdHR0lGR0tIQ0lIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5MT05PUlVWT0tVV1NRU1FSTE9RUE9UWVpZXFpZW15eXmBjXlxhY2tiYGRnaHKFaGdqZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZvdE1JS0hKRkJFR0U8QEdDREA6PD5APz4/QkE8QD5BQUZCRURESUVGRUdFSEhGSEhJS0lFSkhIS0hGRkxJSEhKR0xMTExMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUVFMT1NSUFZbW11eW1xeX19hYGFkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm52SktMSkxHQkVERTxARkREQzs/P0FAQEBDQT9CP0FDSEJGRUZIRklGRkRJSEdJSEpNSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOTk5QTE9QUlRYVk1OVFZUUlJRUExOVFNSV1teXl9dXWBfYGFhX2FjZWJjaGJkaWpndotsamlnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2b3dLTUxLTUdEQ0FEPD9FRUVDPUFBQ0JCQ0RBQ0RBQUVHQ0hHR0dGSkdER0pHR0pGSUxISUpNS01MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNRV1xaUldQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAQ0FFRERGQkNFR0NDSEVDSElJSElLR0RLSkdISklJS0hKSk5MTkxJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjU1BidnVodWNhdmBYbnFiZHZpbnpmW2x0YGxrVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KSkpGQz9AQj89REVGRENEQkVFREZCRkZHRERKRUVKTExKTExHR01JR0lLSEtLSUtLTkxNTUxMSUxNTFtzYmRwXmxtVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1Kcnl2a2Jga2VlbXhsa3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElIR0VEQEJCQD5DRkdCRkNGRUZFRENISEdERUtIR0xNTktNTUZKTkhKS0pJTEpKSktMTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW51XFlsUVxtbVpxbWtvbXh4dHNpcFxfcmtxalV1eXhwY15rZmJncHBqam9wcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0hFRUVCQkI+QEBGR0JHRElFRUVCRklISEVHTEpHTU1OTE1OR0xNSUxLSUpNSUpJSktPUE9OTUtOTUxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHNTZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SE1HSURFRUNBQjxCQUJGREhHTEhFQ0NIS0hIRkpMTEZOS0xTUkxHTExITkpISE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF1uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnNzdnNIS0hJQkVFRUFAPUNEQkdDSElNSUZDRkpMSUdGSk1MRk9KS1dSS0dLSkpOSUhKTElLSklISk1NTU1JS0tLU2tiWmleX2ljcnJaX1lqb19lZVVrX2NbYWFRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydnR3ckdHRklERURGQUBBRUVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRUhIS01JSEpKSktJSElHS0tLTEdIS0tMTExLSUtNTlRbXFRQVExQT05PT1ZRT09RTk9RSklOUFFkcWlUWVdcW1xVWVpdWF1cXGNmYWFlYmNmX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0ZGQUVDQENIREZHQ0lLTEhGREdLTEhER0lQS0xPS0xXTElFRUhJSkhJS0hMSkhGR0dJR0hJRUZMSUpLTkxJUFxXXlBcW2BeTVhZU1xcYl5NWVpNWGFSSllhWlJfZFxhWFtkZFZWWFxZWlhcVllcXWJeZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNFTE1CRERCRUlFR0dGS0pLSEVFSkpLRkVISFBKTU1KTVNIR0VBSEZKSUtLSUxKSEZFSUZERkdFRUpIQ0pNS0xVX1lgWGBhW2BUWFlUXl5aX1JZXFBeXFlOXlxeU1peY15aXWBjYFlfYltgXltUWFdZXl1jYmNhY2ZoZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSURCQkNHSEVIR0hLSUlJREZLS0tGRklKTktOTEhMTkdIRj5HR0xJS0tKTEtJR0VJRENEREJGSkRASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFZVlVcWV1jYF9fY2RiaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUJFSElGR0hIRkZKR0hGSEtJTERES0pNTUxLSEpKSEpGP0dGTkpLS01LS0tJR0dDREBEQUhJQj9JSkhQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUU9cX2FjY2NjYlxkY2JkY2ZYUVVUUltXWmBfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSkZGRkhHRklGRkZJTEpORkRLSkxOSkxJS0pISUZCSEhRTUtLT01LS0lIR0VEP0VDSEhBQUdGRVRdWV5YX1lfW11VWFhQXV1RS0pWXlheW11VWWBSUV9fYmJgYGJiYGNiYWRkYlhPUVFRWlJbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBR0ZER01SSENRSkZISEhFRktKTVBFRklKS05MTElMTElJR0RIS1FPTU1QTE1LS0hJQ0RBRURIR0JBR0VEV1VFXFReU1ZfWE5UVU5aWk1KS1RgYVtfWF5eYV1OWWJcYGBfYmNiXWFiV19fVFBOT09XUV1bW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREVGR0RJUmJQQ1ZeSUdHSERGTUpQUEVJSUtLTkxLS0xLSkpHRUpNUVFOT1BNTkxOSEtBREFDREZEQ0FFRkJNSEJLTFBPTkxGTUZHSUpIR0xLTU9QSUxPUE9TT0xRU1JVWllXWVhYZFdPU1RQUE5NT1RTW1hYWl1cYGFkZWNnY2tscHNyenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHR1hMR0hKSEdNTFFRSUxLTEtOTVVOT0tLTEdHS1BTU05QT05PTk9IS0ZgRURfTERmY0VNW0leW3JtT01VbVlMQ1BgVWtXZ0pdV1VeRExRVUxMU1ZRUlRYV1RYVVRcVVBmWmhoZFhSalNXVlRbXFtgYGFhYWJgZmhmbmtocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xIRUdGSEVFS09TSUpGYFNISk9KSU9NUlFLTUxMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUX9RSXxZWXFzWFBtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbYFZWWH9qdHV1X192X1hhW1xmW19hYWFhXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1OQkRMTEZJS0VRVkxLT0lLUlhXUU5PT01RVE5PUVBLS05HTVBTW1pUUVJPUFBQSkhaeF1UeGVoWlJUUXZndGxwYm5malFyT013bWpycHNycXJwb2+AXWV6dXhxcXpxfnN9a3V9YlJofGVzc29zcnt8b315b39yX2BgYmFaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEpKR0pQT01NSk5WXllVTFFTTlhaTVNTUk5LT0lRUlNZV1dRVFBQUFFLSGd4bGN4cm1bS01VeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/b2hvWXZ2anV1cIFgcmd8aWx4fG9eX19iYVtdYmRnaWlkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3V6bnx9eXhybk5LU3ROQ0JFUFBISktKS1BPT09NUFpgWlhLVFdQYV5SVlFZUkxPSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExpeX14YHl7c25hXW1vY1JocXVubXlwd2x2dHRxbG1ddH56a215fGt0bHxrcHZ1eF5fX2JeXV9kZGlnaGVlXmFiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0cm9tTExbVkhHRUdSUElMTUpLUFFQUFBRV1xYVU1VWVVmWFJSWV5TTE5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ352VUxXa2h9bG1seF9bcHp7XmB6c2Nyb3hxaGV8aXJ7XVVMbGB2dWtpdXt7bX54a3xwXV5eYltfYmRkZ2VlZWJaY2Npa2tyc3J3Z2xpaGRnYGFrYWdzcmxnbW1yfGttaGt7dG1ta21PSEpLSElJSFFQTE5PTEtSUlJPU1JXUlZUUFdbVlZUVFRhYFBOTUtUU1NRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFhSTlBVVFhYWFtaVVJTV1tXWFdaT1NVV1dYUl1ZV11WVFBZUldXV1dYXltncl5bW1lcXV9jWl9jY2RmZGNjYlpjY2ZmZW1ubXVlZWdjYWZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0xMTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlYUE9MTVZUUE5VU05PTUxRUEtKUlFLUU1LS09SVVJRUVNTSUhMTk9RUlFRUVRWUlhXXFdTU1BRVVVWU1pRT1NSV1ZUWVZUWVVUUlVUVFRXWFddWl5hXVxaWlxcYGNbXWJjZGZkZWRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmVmbXNkaWhra2VkY2ZoUEpLTE9PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFNRUEtPV1NQTlVQTlFOS1NQTU9VU05STk1OUVRQVFFTVFVOS01PUVRUUlJRVldUWVpbWVNVUlRXV1dZW1RPVFVYVVVaVVdZVVJSWFZVV1tZWl9dVVheXF5dXF1hYV5bYmJjZ2ZkZGJYX2FiXmBoZWZkYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FaWVhXWFpaWFlWXGpkVlhZWldWU1RPSk5WVFBPVFBQUE5NUVFQUlhUUVFPTU9TVk5XUlRVVU9OTVFTVVVUVFJUV1ZaXVxaVldRUldYVltbV1FUVlZWVllUWFhVUlJYVlVaXVldX15WXl1eYFxcYF9fX1piYmRoZ2RkYlliYGJeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFQVVxaWldbW1xZWltkcW1oZF5bWVZVV1FMTVZTTU5ST1FST0xQU1JVWlVTUFBMUFdWUVdTU1NYTU9QUlRYVlVVU1VZWFteXVtbVlJPVVZWW1tXUlRXVldYVlRYW1RTUlpXVlxeWl5fYFVhXGFhXmBiX11gXWNgY2doZGZgWmNgYV9fZWRfYGNbWlxbXFlaWFlXXFlcW2BeX1teXmFgXmJcWWBaUU5PTlZRUFRST1VUU1BXXF1cWF5cX1dcXmpxd3mAYlxbVlZYUU1PVlNOUVFQUlRSS1FUVFhaV1VPUk5TWFdUU1VSUlpPUFNTVltWVldUVlpYXV5bW15WU05UVVZcXFZSVFZWWFlTVFlcVFNTXVhaXV5cYGBgVmJbY2JeYWNfXGJhYl9jZmlkZl5bZGBhYGFjZF9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVJRV1JUUFtdXl5bYFxgVVxdaWpyfXNsZ1xVWFdQTlJaU1JRU1JUVVRLUVdWW1paU09TUlZWVlRPV1JTWlJUVFRYXVdYWFNYXFheXVlaXVRVTlZXV15bWFJVVVlZWVVXWVxUU1ZeWV1dYF1iYl5ZX1tlYl9kZF5eY2NhXmVmaWRmXl5kYWBhYWJkYGJeWFpfW1xbWFhYWFdbWlxgXFtbXFtYWlteVl5ZXVBPT1JaUFpUVVZWVFRUXl5gX15iXGBVXV5ia3l0bH1sWlVZVVFQU1xUVVRVVFZZV0xSWlddWlxST1VTWFZWVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUldSWVhZX1paVFVWWllaV1haXFZUWl5cXmBhX2RjXF5dXWVhYWZkXl5kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfX2FhYGNdYFRdX2JlZXWBemhYWVlTVlNWXFhXV1ZWV11YT1VdWl5dXVRSV1NXVlRTVFhSU1ZUWFhYXV5YXVtWXV9YX19YXVZRWVRZWlphWVxVVlhbWltZWVpaWFZdX19eY2JhZGRcYlxgZmFkZmRfYGRiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlNcVFZXWVZWXGBhYmNhY15fVltgZGFfenVvaFlcWlVYVFdbWllcWVhZYFdQVl5cYGFcVFRYUFVXVlRWV1JTVVdaWlxfXlpfXFZfX1pdXlleVlNZV1laXWJaXlZXW1xbXFtbWVpZWl9fYGBkYmNkZWJkWmJmY2dmZV5hYmBjXmJjaWRjZ19nXmJiY2FhYF5fWFRbWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNQVlpWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBsZmheXF1bVldYWVxcXF9bWVtiVlRYXl1hY1xSVllQV1ZXV1dWVFZUWFxcXmBgXWFcV2FeW15cW15YVlhYW1tfYFxfWFldXF1eXlxaXFhbYGFeYGRjZGVlZmJZY2VlaGdkXmNhYGVjXWVpZGVpX2deY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlJXWVZXWlhbXFhXWV5gYmFlYWRhXV5ZYWNiX2FgYF5cXFxXV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBXV1hZWVdWV1ZdXV5gYWBfYl5ZYV1dXlldXllYVldbXGBeXV9aWl5dXl5hXFtbWlxfYl5iZGNlZmVmYlpkZmZpZ2NfY19hZmVaaWljZmljZV5iYmNhYGBfXV1aV1tZWVhYWlhXWltaWVdYVlVbXV1dYGBiYnhMV1dcWVdcW1xdWldcXV9gYmRiYmFdYFhiY2JhY2FiXVtcW1hXW1xfXWBfXVtgZFxcWFpiZWNgUlxaT1hYWltbWldaWWBdYGJiYGFjX1xiXV9dW15eWVlVWF1eX2BfX1xaXl5gYmNcXFdcXmBiYmNlZGZkZWZkXGVmZ2lmY2FiXGRnYFxpaWJoaWZlYGJhY2FfYF9dXVtZXFlYV1hZWFdcW1pXV1hPWFpdYWNmZnJrf0pZV11aWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBiYmJcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pSWVhcXV1bWltbY2BiYmNgYmRhYGNeYFxdXl9aWFZbX15dYWFfXVtgYWJlYl9dVFxgYGNkZGZlZ2VmZmVeZWZoaGdkZGBbZWdeYWhoYmhoZmNgYmBjYl9fX11dXFpbWVhYWFZaVlxaWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ1dXV1dXV1dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3t7e3t6enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnV0dXV1dXR1dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7fHt6enp6enp6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx4xdTS0tLS1JN7fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmJiYyNjY2NjYuwwb6+vr69ytPS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXjV5+Tk5OTnmXt/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyMj5CQkJCQjrvOy8vMzMvb5uXl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dn5/f39/f395d3d3d3d3eHl5eXl5enhvb3BwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH19fX19fXx9gIKCgoKCgoSEhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dHR0dHR3dHZ3ent4e3h3dnh7eHl5eX16eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t6enp6eXl5eXl6enp6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx8e3x7fXx4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3eX19fX1+fXh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4OEgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3d8en18fX58eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCgoKCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en57fHx7fnt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5fHp6enl8eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdXV0dHNzcnJycnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0dHN0cnBwcXBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFyc3JzdHNxc4Nxb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycnJzd3Nzcm+DkW9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHFxcnGRhHBycJePbnBwcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFycIikdW97pJBvcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFwga+MbYenknBxcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcnF9rqJwj6aVcXFxcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycYKyqZChsZJwcnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzc3Nzc3Jzm6qis6erlXJ0c3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn58dnZ3d3Z1eHp4eHh4eHh4d32noKOwn5yhgXt5enl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fn18fHx8iKaXm6ygo6KIenp5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX1+fX6IoJGQnpuVmI9+f399fX2Ag4KAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYGBgYaoqaGanpmYlHyAgYB+f39/fn+Af35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f39/gYCClbClpqGfoqqliX59fX5/f35+f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B/gIKHj6Gyqp6moZ+goqiroJSLhIGAf4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GGi5qprqmjnKShn6KhoKKko56PgoGAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYKDjJmdmZqaoZudoqCcnZqTiIOCg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgoCBhIuUlpmajJKdm5qWjIaGh4eHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEg4GCgYSQmJWIjpqajoeHiIiIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZGPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SEgoKLlo2Tl4yDgoOFhYWDhISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4GCgoKCgoGCkJOEgoOBgoCAgH+BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4B/gICAgH+Ij3+BgoODgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZaIhIKEgoJ/gIqSgIKBgoSDgYGBgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmIqDhYSEhIKAjpiDgoKChIODgoOBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+NjIqFhIODg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgY+Mg4F/fn18fYucjYCCgYGDgoGVmoaCgoGCg4OBgYGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiISEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlZeJgH19fX17gZeMgIOBgYGAi5WSjoCCgYKCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqGg4SDhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICVn4p+foB9h4p9hISDhIKDg4KNiYWNgoKDgoKCgoODg4KDg4OCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf319fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMioiFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDipGDhIuFgoGBfn2Bh4aDgH5+f35/fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFhoWFh4aGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+gICEhYSFhoaGhYWFhYaHh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaHh4aGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4mIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf35+f4B/f39/f4CAf3+Af3+FhYaIiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4eHh4aHhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4OBgICBjImBgIGCgoGBgYGAf4B/f357eoCGh4iKiomJiYiJiYmJiouKiIiIiYmKi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+QjoqGhIaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCgoKCgoB/fn19fX1+fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiGhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoGCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX1+fn5+fn59fn19fYOHiYqKh4eFhoeHh4eIh4eJhoeGiIeGiYmDg4SDhYSEhYWGiIiGhYOCgoOFh4aHhoaEgoKDhIKDhISCgYKBgYGDg4SDg5GSkI6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoKBfXx9f4B/fn5+fXx9fXx5fIOGhoaEg4GDg4SFhYWDg4WEhISEhISFhIKCgoKEhIGCg4OFhoWEgoGBgoKDg4WEhISFhISGhIOEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhISFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4F/f4CDg4ODg4KCf319f4CAgX99fn59fX19e3p6foSEhIKAgYCBgYKCgX9+gYGBgoGDgYKBgoKCgYODgH+AgIKDgoCAgICAgYGBg4GBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5+fn1/goODgoOCg4J9fX5/gICBgH59fX19fn18enp6gIKCgX9/f39+f3+Afn2Af36AgIF/gICBf3+AgIF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foGDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gIB/f39/fn59fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Af3+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7gIB/gH9/f35+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f3+AgH5+f39/fn9+f39+fn59fX19hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH59fX5+fn9+fX19fX18fHx7enl5eXh9gYCAgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf3+Af4GAfn9/gH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KDg4WDgYODg4WEhISEhIODg4SCgoKCgoF/fn19fX5+gH19fX19fX19fXt6eXl5eXmAgoKChIOAgoOBgIKAgoGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkImJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WHgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSCg4OCg4WEhIWDgoODgoODgoKCgoOCgoKSkIuIiIeJh4aGhIaFhYSEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaGh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKPjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgoGDgoB+fX5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfXx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4OCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fXx/gYF9ho+Bfn2Cfn9+gIJ8fIB/goCCgH58e4qCfYB/foGAgIGCgYKAgICBgH+LlJCMi46OjIiIh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3t6fIKAgX5/gXx+fn9+fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSSjY2Njo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4KCgoKChIaHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYODf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fn1+gICBgH9/fn19fX1+e3x9f39/gH1/fn+MkY2MjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fH+GhIOAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn18fn9/fX5/fn9+hJKNjYyPjYuKhoSGhISDg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5+gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fH59fnx7fHx8e3t6fX5/gISDgn9+f3x8fH18fIGDfox+fHt7fX59fn59e3t7fXx7e3t7gIaEgoSDgX+Afn+CgoJ/f4KCf4CLkIyMjI2LioiEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn1+fX19e3t9fXx6fHx+gIKBgICAfXx9fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISCgYKBhYaFhYaGh4WBhJGPjIqKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/gH9/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+f358fX18fHx7fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJiomKiYWIko6LiImHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDg31+fn19fH19fX19fXx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uKiYyRj42KiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fn1+fX19fH59fH18fX19fn19fn58e3t7fHx9fHt6e3t5enl5eXt+f4SDhIeJioeJjpCNi4mJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+g5GEhIOBf359fI2HfX1+fX18f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiPjouKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn5/f319fXx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiY6LjIeEhYWEg4OBgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOBgICAg4F/gIGEgX5+gH99foB+fX5+gIB/gX5/gH9/f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHx8fHt7e3x7fHx8fXyKi4mIhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgYB9f39/gICAgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fYmHhoSFh4WEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIKAfn9+gX9+fn+AfX6AfX19foB/f4GAgYGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4OEhIWEhISFg4GCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFg4ODhISDg4SDgYB/gH+AgX59fX6Afn5+foB9fX98fX1+gH+AgICCgICBgIOCgH+AfoCBfoCBgIB/fn5+fn19f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKFgIOCgoKCgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+Af4CBgoKCgX+Ag4J/f4OCf3+Af4F/gH98enx6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICBgICAf4CBgICCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fHx/fn+AfH9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhIKEhIWEhISBg4KBg4F/gIF+f4B+gH19fX6Afn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIGDhIKBgIGAf4GAgIGBgIGBgYOCgYF/gIOAfoKDhICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgICAgICCgoGAgH6Agn9/gYKDgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3x7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAgH9/f398f39/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+AgICAf4GCgYB/fn+Bfn+AgoGAgYOChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fXx+gICAf39/f3yAf3+BgIGAgH98gH9+fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgn+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAe4B+gIB/gYCAf32Bf35+f399fX1+gIGCgX5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBfoGDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH58f4CBgH+AgIB8gH+Afn+BgH9/foF/fn9/fn19fH+AgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3fHl3eHd3eHt7e3t8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoWFg4WCgYODgYKBgYKAgYCAgYB+f35/f318fn2AgYKBgICBgX1+gH9+f4F/gH9/gYB+gH99fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgYGBgoGCgYGBgH+Af39/fX1/fn+AgYGBf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKAgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoGAgYKBf4CCgoKCg4GBg4KAgoGAf3+AgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9+f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgoGCg4CAgoGEg4OEgYGDgYKDgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/f4CAgICAf3+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58e318e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICDgYaDg4OBgoSAhIOCgoCAgoKEgYGCgYOCf4CAf4GDgoGAgYGAgH+BgYGBgIOAf4CDgn9+f4KBgIB/foGAgX+AgIGAgYGAgICCgYGCgYF/gYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fX97eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCgoKDhIKDhIOAgIODhoODg4KChIGEg4GDgICCgYSBgoKBgoF+gICAgoGCgYGCgoCBgICAgoKBhIB+gYOBf3+Ag4KAgX+AgoOCgIGCgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYKAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCg4SGhIKDg4KEgoSDgYOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SChIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICCgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhIGEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16enx9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHx4dn92d3+Eh4OCg4aDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4OEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4OFg4SDhX9+goqLhYWEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gYGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhIWFgoeGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeYN/f39+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fn99foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgYGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN/g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foF/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdtenNugId5bX1yc3Zzdm1ud2xweWx1fX9/fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWHhoaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fnyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSCgX+BgYB9f3+Bfn9+fn+BgH5+gYKAgIKEh4aDg4aEhISGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYWFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX16fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhIaEhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOFhoWFhISFh4aEhIWGhYV9d4aDhISDgoF9f357fHt+e3x8fX9+fXx/foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWHhYWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIaFhIWFg4aGhYaFhIaHhoSEhYaDhYSChIODhYODgX2Af3t7fH57fHx9f358fH59gH59f4B+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoWHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhoWFhYWDhoaFhoWEhoaFhISFhYOEh4WDgoOEg4SCfoGAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaEgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4OHg4SBgoSEg4KAgIB7e359fHx8fn18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WGhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4OCgoJ/gHt9f318fHx+fXx9fXx+e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4eIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9/fnx8fX99fH19fH17e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhISFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFg4aGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYKCgYSFgoN+gYKBf4OBf35+f35/fHx9f317fX18fXp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4qHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSHhoaHhYSEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAhIODgn2BgX9+g4F+f3+AfH98fX1+fXt9fXx9eXp6eXt9fXp6e3t9fH18fHp6fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SGhoaGhYaCg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICBg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYWFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhYKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18gH59fHx8f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYOEhISGhoeHh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSEhYSFg4WEgICCg39+f39/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7fH19fX2AfX18fH2Af318hoOGhoaGhYOEg4aChYGBgH9/gIB+f4GCfH5/f36AgIKCgoSEg4KBgoSBgIOCgYCEhYSCgX+AgoODhIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhYWFg4SDg4SChISAf4KCf31+f35+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp8fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWFg4ODg4SFhYSBg4GDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7eXp6eXp6ent8eXt9e3t+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT47QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1NTU1NTU1NTU1NXV1dXV1NTV1dXV1dXV1NTU1NXV1NLT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vKysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fV1dXV1dXV1dXV1dXV1djb3N3c3Nzc3dzb29vc2tPS09PT09PU1NTU1NTW1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi60dTU1NTU1NTU1NTU1NiufIGCgoKCgoKBgYGBgI/S0tLS0tLS09PT0tPT09zj4uLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZNPDo6Nzc+Qz44Pjo/P0E9P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7s6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6Oip8/T0tLS0tLS0tLS0tLZkTtERERERERDQ0NEQz9c09PS0tLS0tLS0tLS0tHg7Ovr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0dLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSko6jP09LS0tLS0tLS0tLS2ZRASElJSUlJSUhISEhDYNLT0tLS0tLS0tLS0tLR3+vq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzdDS0tLS0tLS0tHR0dHQ3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamsz9PS0tLS0tLS0tLS09mZTVRUVFRUVFRUVFRVUWrS09LS0tLS0tLS0tLS0t/p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Ozs7Ozs7Ozs3Nzc3Nzc7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tTV1dXV1dXV1dTU1NTV0MvLysrKysrLy8rLzMzM09TU1dXV1dXV1tXW1tbY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7OztPU0M7O0tTPz9LU1dTQz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXU1NTU1NXX19fX19fX19fX19jY19bW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzg5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztCmksXR07mf0NGcgoSKxs/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztKqnayUzbOXmrq6lbi5r6HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjw3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DJl5mFpa+goqey0ZJ9fq+w0c7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEI5NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0aSwvZehx4aatdXTzZ6ew9DPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Q1bmYpNqkmbXU08CgoNDPz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P0NGanbfYopm11NSvoqnU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NWnpKDS1qKZtdTUo6G61NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkFDRkRBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NLAnaLJ1NWimrbUzp6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPUpKCPt9DWo5m218OfoNLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTo6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HIxqa9lZGm2qKatNmxpKfW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg1MqOk5eQptqxg8bWuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGR0tIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLUwq+ws9HT0cPU0tLC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT5BRUxMQT03NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dTW1tbT0tLV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj0+Nzg2OTY3ODk5Ozs9P0A8PDg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc3Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT9AQD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2ODk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQkE+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkhART1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAPEQ+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Slpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqalo6OioqKioaCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpyenZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTY3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKyopqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqanp6afm5qboqCalpaVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWjoqWmpqWmp6amoJuZm6GflpOTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKenJ+gnpuTkZCUl5udmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNAREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChnqm1k5CPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaGhn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9CQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpKSko6KhoJ2to5aTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn56foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjqqmjpKKhoZ2jjYqbmZmYmZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKCioqyvoaGgnpyap3OCnpyamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaGgoaGnoqSfnpyZmqBhfJ+bm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoKCfp5aln52bmp6TWXmgm5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampubmpiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnp6dnaSOm56cmpqkhlh0oZucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZyampmkj5Cam5ucpHlfb6KdnJ2cnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampucm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJmao46NlZmbnaB4aWmcnpydnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJyYmJmZmKWNio+Wm52ceGpllJ+enp2enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ucmZmZmJalj4SJkp2dlHdqZI+gnp6fn56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiWn4yAgoqenol0aGKLn56en6Cfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl56KeXp5nJyEbGJejaCcm5uenZ2dnaGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qalouZk4R3d5ieh21hXYqXkpGNkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZGQj4uRj4uMj5CQkY6NmZuJcpCcnIR7dGSDjYWHgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuMhoqLi4mHhIGGgoCBkp2IeFqHk5ZsbntzgYd9gIGSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgX1/cpiUdGRPdYuMYFxxc4N7fXyGjo2Lho2UkouQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouHiIWEiIiJhH+Cfn2gh19LSXSDfFpKYWt6hISFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkYx/iI2Ni4uHkomPnnhJQkV0eG1VPkxkc4uLjYmJkI+Oj5SUmJCVnJqdnqiusq+wtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmRnqGdk5eboZqdnKKfoJRhU1tKdHJjV0ZFU2x/kJGOi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qqqaeipaipq6qpr6SEVoKNVHR8bFxZbVVfd5afn6GknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6uspKGipamnp6mjdGrAvVB/k4dvX3trVm6boaGop6Cioq6rq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqamkqKaanaSmoqGhm2WHxr1lqaGTl15xg11gl5yZoqKgoJ+goaignJ6hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXFBVT1hPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppKCioaKnoaaupqacn5lfjbW+m8qkk6l1aK9yV42bm5+eoJ+enqCjnZeamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1tVWVFVV1tjXnNfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0I/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGnqa2xsq+ro6OkbYKVlajGnZKhhEasjViGoZ+dnqWkpaCks6WVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY21qaWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKOqqqe4wb65trezrqytr4R9e2ytu6CcmoBXg4Fng6ihl56lopmWsL6gnaGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGpiW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gq7K3z97e2M3JvLe5uq+JeGRqp6Oalop7aGtydnqHi4WFhHZvjbipo6umpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odmxwaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCytLW2u8PX4NjOxr26tq6aeGpQY5SEg4R6cm1oaG5rbGxrZl9ad7K0qrW1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFpYGZzb3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PDub2/xNTPua6ppJ6UgGRfSlx8bnB3b2loYl1fXmFgXlpUbreyqrS8sLW2qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV2bm1bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvFwcXJzMahkY6IfGhXWElTa2VmbmhiZWBZW1haWllVbLO5oqaxtqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH6Ef2lmaGFrbGdudnFydXFnXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/w8PGxsDCr5R0bWRaVldFTmdiYWpkYGdmWVpZWFhUZrO8sqaqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8fnRrbG5kb21pcXhueWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMS5tMe6gFlTU1dVQE9mZGFpZGBmaVtYV1hTYqm4s7WsrqWko6ikoJ+lmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5eXt3bmtpaHVaZnJ4c3lmZl1kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDxMLEwrJ5UUtOTz1RY2JlbWZfZGheWVdXZKq7qri1s6ypo6GtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVmaWpoXWpvbnl4Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcnHyMfCvYJPTU1ATWdeZ2tqYGJhXlxZZKXBu7q8urysraaqu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aGlpdG15bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzMnOxci/fFNORUdvYGFhbGJcXV5bXZvHwsTHwby+tLGwsMG+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGtqd2xpZXVudGJdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jJycXFw65/VE1IamNcX25dVFpZW5LIt7+/wMC6u721s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVnY2pkYmptbm9eWV1WVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwcHAxMHDu4ZUSVlebXmBUFBTVobIw6+9vbi5u7u+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFjZGNqY2djW1paXFlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Bu7/AvLvEvbrAxMG6i1dHTn+VkkVLWn64y76wwb+6t7u+urW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhYmNoamdnamZpXVZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdaOu767w7a5x7e1t7q8urmWbkp4nZFAWpC2vMG+uca8wr+8xbi2t7S4tra7u7m2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVmb2llbGhYWE5LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vNDFeKzLvce4ubittrO2ubO2tLSGfJuJVqC/wL69vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfGtucGdwa3NmYm1gXFRJS0pESkNDRz46Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTXrXWCvcjPwsC4rrW0ur23uLG/v5uVgZfNw8K/vr28x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHFmbGludG54Y2diXGNRS1RIRUVDR0I8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsfJ0ZhxdbDR0czKxLW6v8PIvr60v8OvfGm1zMXCvsG8v8PMysfFxsC5vrzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9jXmBhTklNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQwrq+vMS+t7zAv8nPx8jKysGFc3SozMzLzcrGwsPLzsG8uLy6uXVYtsjGxMDAv8TAysrDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1teHxgcWNbXl9fVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u6rdvCvra+wL6+uqacqrO3xMCleXd6nsTGy8jBw8DAycrBv7u6sLZ2VrXGxcXEv8DBv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnpuc3hzaHBdW15dWVJGRENNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vFtG2vzr22ucC8qn1uaG5tdIKXmHN5fpq+v8fAucC8vsXEvb24sq+ublSpxcbDw7y9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bHV7cG5pW19fWVNQQUZIR0tARUNIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbB1grS9tbXBpIZpWl5gTlNbXHB0eISjuLfCurO7t7u9v7q7u62vrGxXnMXDw8O+vL+7u7i1wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9mXVtUSj0/P0dGPUdDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmlhHiMorC1nGpmZ1VZX0lJTVFUbnmJqLC3vrmytbK8uby2ub6xtKhvX4rBw8fDwL2/ubOvsr26rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYlxeT0lCPz1JREZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/Gp4d7do2il2BTQ1lVSGJqVU9FSmWQo66vtrq1tLKsvLm4tbjBurqcf2x6vMLHwr+5urWupayzsaawraieoKClrba1wre2tKWoq6iwtrOyura7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d3B8b3ZybmNdZ1hdXVNPTUE+SkJBSklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7OQgXmIj25OSkBlWUJQeICTaExDXoOxtbO1srSvrLu6uLa5v8Szn5aCeqi8u7i1srGtrZ+kpqedpKWdlpmZmp+prrmsq6ufpaikq66vp7Csr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWxdW2pUXVxQTkhERkxCRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7i1lYyIhHtYRkJRiFhJSll4joJiQVWkubO0srCxrbC5uLa7t7q/rbGyqp+gua6pq62ro6ihnZ2el5ihlZKWl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJSSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeWl1dG5kVWFjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yu6mYmZRoTUBUeXFPSUlLaJ1/WkVWsbuxrLOvrqyttraytLWuqaKem5udnqennqCoqZ+hp5abl5ePnZSPkJaOl5ukqKCgoqKhpaWdo6OgnqWgpKylpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKurn6aim6OclZCMj5CQk5CXlZaYn56em5mml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3pjd2xuXVFoVFBOR1BNTEJQUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3BqqW9ZkRToYRQWElLYElYjWFlZYSvtaqytK6qq6+wsrOtpZ2Rl5OPmKCeoqCco6SfnaiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6OoqJynoaCkn6yorKygqaumoKSopqyjnZ6empeaq6aqsaOlqJ6gnJWTkI+RkZmQlpWYl5+YnJmbpJmXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dn1ta3tkaFZSZE1KSEdPUk5KTkg8RUA8MkA4NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaCrxr/Lnk5BdZxvUG5KTGNmdnVhXWJzkrKvrrO1qqasq6KbmZSNkZWWmJicn6KinJ2knpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGlopuYnq+orrKrpaqqoJuYmJiVk5aak5WVmpabl5eYoZ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3h8ZHl5YGJTVWBISUpLU1RJUlFNOT9CNjc8NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpMfGi1ZSS2ajWGd9b3JbUmtjXGdiYW2RtLCwuKymoZydmpSXmpmQjpGVkYyOjZOZopyXo5mal5iZlJmYlp2bn6WmqaCmpJ6nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruqimq6erq6msrKegoKOxrrKxtKqyrqOZnJ2eoZmbm5qYmZuUlpuWmZyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHZ2c2iCbGZbU1paTVFKT09VTFNNQjc+Qjc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp+qo4x5VWlxd3VvZHd2WFdiYGRpW1pXaK2urK+nn56ioJaQk5ugm5mXkpOfnKGjm56blp+an5ebop6loZ6kn6Sora2orKmkrLS3trCntKyira2jr6WkpqGpqK61s7K9t7+wrLGuramqtLGwqKuosra4s7itsrSkoJ2ln6yhoaKhoJqYlpafm5uYpaGgnqOhoJ6bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWp3dV5tW1JgSFJVSEZVVkpDTUc9S0g4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCjf2+CcGBjV0xbU1pMTFFZUkhPTkiZrKqppJ+fmZKRk5iYlpaVjIiLjpWdnJ2dnpeemaegoKilsaqnrqOrrrawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXCvLe+s7O1oqyiqaiyqaqop6iamZ6aqqegmaegn5+nqKWkn52qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cm1pdm1obVxYXENXTkpHTUdDRk08Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKOenIliV15lYFdNUUc9P0BDRD8+Q1J4qa2pqqWfnp6io52enZqcm5STlZSdnZiUhZ2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsS9w7y3s6qzraqzta+zrqqvo52sqLaxraOwpqCjr7GusKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhoF7dHJra3RycWhWXFFGVElESlBJP0VBNEZIOTU8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqgn5V8X15lYFBGRTtCPkY8Pjk2Tn6qs6ejo6KgnqWrpZ6XnJSRmZ2YlIyKhoiGeG2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr7HxsK3xMrJw8HGvrq1uru1u7ewtrKqurKuu7e/u7qruK2rqri7tbyurrmjpqOepqWio6mmmZufmZqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrY2hveGtlWltGS0xFRFRNRENFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz49Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9cmlhV05FPklafG9hQT1cjq6soJmbm56emZeXl5KMjpaWk46NkIuCg4J3cnFtcI+mra60ucW7zcfLv8LMzc3Mx8nRzM3Mx8nFxczQ0tXO08m9wL/Du8bFyMXR083T0NPTzMrCxcbGysjOv8jRzMfFx8XCvMPBv7+/tr6zrr/Aw8PHxMfErr+4sri8xMLCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MREZQSURDQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E/PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ6VaWZcVElEQD9Khp6kmIOgsq2jnpyfmpiXlJKUlpGQj4yHg4OIh4OAgYGAeXFyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXX0dfNxsfJzMPFys/K09fS19LV1tPUyMzGzM3J0s3O083FyMrKwcfMx8nIxr/Ds7PIxMvLy8/Hyr++v73Bx8XNzMnJwMPArq+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURORkBKUUI+Qjw6MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxBPz45OkBBOjk+OTo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hm2FTTEpEQz9DVLHRvbKvppycnKCkoZ2alJOVlIl9eHBrZWJocW9xe4WKgHVwbnF0cIWzw77F0dDX1tbS1s7U1tfU09HT1NTTz9HD0NPW2NXW0svJztHLxs3SytLV1tnW19PW2M7Sys/RzM/QzNPQv8jHysTMzMzOz8XGx7a/yr/SzczQxsnIwMTDyM7N0NHPzcrIzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGRyYl1SXElKR0FFSUo+O0E4PTU1ODY7ODU6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoqFZSUBBREFGUXayr6ealJefnJqgoJ6bnJmViXdpY2FfX2BfXl9fXWJsdXRwcG9scnF1ksTIxtTW19fX09bQ1dTa1NTOz9XU1NHRzNDN09fW09XQz9LT0cnT0cjQ19fY0dfS2NnU1szPz8rN0svO0MDGwsjGzs7R0dLIy83AyszG08/MzsjFysfHyMzK1NTR1c/SzNPCucWxpai1rqebqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNPzw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu32NTV2dnRztC/vMzJtr6upqqooaOrZUM4PT5EWIKqqJ+XlZeZmpyfnZicnJJ9cGVjYl9fYV9fYWFfYGBfYGZucHBua29yd3eczMHS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHVzc/V1dHF0dTK0NTV1s7S0NjY2NfLyM7Eyc/MyszAycDIys3O0MvQzc7Lzs/Iy9DQy87KwsnHyczLzNLTzdPS0dDQyr3IubCuu7m1q7awrai4rbO+u7Gaj6CUkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1YRTtAPTMzPDw4Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspayuvrSwwNjS19rc1s7NysPSz8HBsamsramksXlIRkI7V46hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBgYGBgYV5fX15cYm1yb29zdHZ2eaS/zNXR1tTT2NbOztPLzs7FzsrS0s/Hzs3N1MzO083L19bQzNHUy8zQ0tPKztHV0tXVysDKwsXNwsjJw8zDxcjKy8/Kzc3QztPMxsnPzcjHy8XHwcbKzM3Q0cfQz87NzNDFx8G4ub3Dwr3DubKyvrG7w8O1qpiloZiWkpWVkouUjZqRlJSPj5WCiYZ5cXJrbWdgYHFoWVhoVk1HTElQUUI7Qz47Njg5ODo6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzs8Ozw9ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWvtKifrZd4bHBye5GajYyXlZCTkZGVlpWQi3xlYWJiYF1eYWNiYF9fYGFhYF9dW11ncnFxcnNwbXJ5pcfTz8vQ0NPUysXJycbHv8PFz87HxcfNytLIy87OxtHS0M3M1MrHy87Px8fP0svQz8a6xL/Gyr3Cx8nOxMLHwMfNyMTMyszPyMTE0MjGwsbIxb/Bx8zMzM/Cy8zJx8vQxMXHu8fDycnCz8G9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+CeG90ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vbnNzMbQ1dXZ2tvY0MnPz9HTyMK3u7uto7Z9aIOFpKuUjo2Wj4WDg4OBfYSEfnNfW15eXmBeYGNkY19cXV5fYGBfW1pcYGtycm9va2xvb3250cjJys/LzcS6wMO7u7u6vsnGwsPAw8jKycjKyMHFzMbIy83JxMLKycHBy9DFy8i/ucK7xse+v8bPy8O/w7vJx8m7yMfFysC+wsvGxcS+xr28wMPFzMXFvMDKw8XH0sXByb/KycbIxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhppujoJuVfHdzdGZpWmFubVpbWFJETEZCR0RMREZTQDU0MzM1PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+sq+2bF55faKRi5KWhnqAhYV/dnh1cnBfWltdYGBiY2RkZWRgW1xdXV9eYFtZWlxib3Jva2lscG9zj8e9ysXLwMbCsLa6srKzsrHCvLy8urjBwcHEvr25vb+5xMrFxsK9xsC4u8PJv8HJu7e7usbDv7zBzcPGvr61wb3Du73GvMO6tLzGxMLDt8C2tr6/u8zDvLa6yLq/vsvDwcbCxcnHycbQxsLMyLLHycPOzMHFw7+9srewsqeoqLmwpa2wqq2slHp2d2pkZ2Bob2RWXllKRkpFR0tBRUJGSkA5OjY0ODg1NDs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1tfNys7FycXHwbnFvayupV9kdYSTi4iLhHh/hoZ/foR7dHRjXFxdXmBgYmNiYWRlYl1cW1xeXF5dWltcXmhzcW1nZ25vcnmdvczAw7rAuK2wsaeqraynuLS2tLOztLu1vrG2sLWvsrzCvMHEvMC7tbK6vsC4yLm0u7fBwr23vMbBw7y1rrK1ur+0xbe7tau4vb7AvbG7trC2urPFvLevu7+1t7TFvL7CxcDDxcbHy8XAxsa7x8vAz8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjKyMrJysTQzdLPzcXHwcbAv7q4ybaqsJhbaG+Kj4WIiXp4foaGdneBfHNoXV1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaGZrbm5yfKTHwLi4tbCrraeeoqmnnqqss62qrKm0rrexs6mupqyzvLq2w7m6urGrtbm7tMK6sMCxvry7trzHucK3raqosLLAtri9sLGosbO1u7ysrrWmrrauu7Kxqrmwrbuuu7i7wMC+ucO/xsPFwbzGwsjLuMXHxb/Hw8O6xMbCu8bJzMuzucO9u7OJc3d2a2lhYmxoWVdXW0FMS01KRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT05Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXPx83Bw8a/xMTDw8rCycq/wLzCurO1tcOuqrCRW2p/koeOj3t4fYmFenuEgHduXl1cXF1fYF9fZGNhZGNiYF9dWltaWl1aWlpaXGVub2hmZ2lrbnKBrbqwta6lpKenmqCkoJqcpautpKiiq6qsq7Cjpp+qrbW2sb25r7ewqK64tLS8uLS9r7i5tbK8wLLAr6Woo6uxsrOovaqrqKusrbW0pqiuoaSvqbKmqKiupqi3rbGyt7q6u7K8vr6+xL+1wsHHyLe+v8W3xMO/u7/Ewr7EyMzKv7/EwMCph3N0c2ppXWFvZFdWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HKvrvJtr3DvrrKt8HDwbS2vLaxr7W7rairkmRtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYF9dXVxaWFlbW1lYWlxfZmtmZGdlaGpvcoWqpaylnpyhpJSdpJuXkaGjqaOjn6Wmp6atoJ2cpKassrC2t6exraiqtau0ubG2tq62ubKwurqxt6WgpJ+msairqLmqpKanqKeyraCnpp+bpKasnp+no6Chsa2trLK0s7Swtb22u8HAsrq+w8GxubnCs8G+wLW4vL2+vMLHxMPEv8DEoIN4cGxiZmBrb2BVWV5ITmdPVEdGS0Y8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk7Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9tqCelJ2hprq2q7Ozu7PEz8nLwsa4tsfAzL+4ybe7xbizxLizv8CstryyrKWvs62ho5FpcoaFhoB8eHVzb21qamlwaV5gXVxcXF5fX2FjYmBgYGFdXFtcXFhZWFhYVlhbXl9kY2JlZ2dna21vh52pn5WVmqGWm6OYlY2eoaKnnKCfpKWip56bo5ugq7CtsbWkqaqqrKyktLitt7Css7avs7WvsKqfnp+jorKlpqm4raKmpqCorKuZoJ+emZ2fpZqZo5ucnrCpq6erq6ytsLK4r7i5urC2vLu6q7OyubO+tLaysba1v7a+wL3Dwru6vZeEenNrX2VeZGRYVFddSVdcS1BHSkpHQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vDw8++use4uL+3ssK0sbu7rLq6saKeqaunmJ6QbX6Fhn94cm1vbWtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3GMqJyTlJSal5qhlpaQm6KhqJ6cnaWnoqWcoKGbma+urq+yoaWjrqunorWwsrKsqa+zp7qzpragop6co6Gto6Kqtqujo6aepaajlpmdl5mbnaCal52cnZytoqunpKOmrauys6q1sLKrsrm0r6qvsrKzuLOuqayusriwura6vcC4s7GUhXl1Zl9mXltZVlNaVUtbUUtJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+ynaWjmKWxwrW2va20uMLMyMa/xbbBwMfOt8DEvbO5ubO/trG5u62ytK+fmqSqoJSaj3h/g4R/eG9xdHFoZWRoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqGbk5OPlJaWn5eZlJegnqGclqChqaSfn6mdm5urp6+wq5ujpLiqoaCuqLaqp6etsaS4sKS3oKKbmZmqp6GarLmvoqGknKKfoJOUoZSWlpuYl5aXnJWfqp6ppKKdo6qqsK2otKyqp62zsKWrrrOxsLCur6eoqLKtsbSwvLS6uK6jlIF6dmVfYVZZWFNSU0tNXkxPS0dHTExFPUE+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp2np6Kqu8C9wLmutLjBzMfFwsO9xbjIzLLBwsGtvLu1u7y1ubmwr7CqnJmhqZSRiouAgHx3cWlscnRwaGhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmNkZmmBlZKUi5GTlJqYnJWWnKCcn5agn6empKann52gpqCqr6afoqO3qKGhoqizoqWopbClsa6stZ6hnZWVqaGilK2xsZ+jo52emJuTi6GUkZOYmJOXl5mXnqecp6GimqSlpaukpbCnpaOrq62mqa6vr6uoqqqzpqasr7Sxrry1sa+voJJ6d3NlYVxbXVhOTFFHUWFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepaasuLu8wcW6sbm1xMnJwMPGxce2xcSzwr/Fq7e3vba9urq1squtqJmYn6OLiXSJiH52bmNhZmloZmdpZmptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVVRWVVJUUlVgYF9gYV9hYWJlaYCSkoiQjpOSk5yUlZajmaCXnaCloq2mpaWjpKOcqqulmp+lsaqgoZ6lqp6oop+urKmprq2ioqKVl6KbnJCrqbCcn6KfnpeZk4qekY2Sk5aQmJiTnKGjnaShopWgoaSlm6OrpaKkqqOrrqWusqmmpaamtKapqK2ztbS5urCqrJ6McnBwYFtXVlZSRlFOSFlbT1JJVEtTTEVGSUQ4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD42OTg6ODg2NTk6Ozw5Nz88OTU3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7Kwq7Ktnainr7m5s8DJurXAr8XIzLrByszItcm8sb7DyKyxuMG1vMC7tLSqrKaVmpubiIFyiIN7dGlpaWxnamxta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RVVlVUVVVSUk5RWV1cXV1eX19fYmRtjY6DkIaPkI6Zk5SSnJqjnJuhqKmrqKynqaakmaWvpZWZpa+poJyZm6Cer5mcq7Ogpaafo6ShlJOblpaSqaqtmp2goaCblJCMmY6MkYySjZaVkJ6ioaSdm6OVm6CjoZeiqKOjqKugq7Ckrbemo6SirK2qqKuvs7ezvrWzq6+YhXRzaFtYWVNVUkVYTFFbWE1UTlBMUVJJTklCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9NTg6Ozg5NzY5ODk6Njo9OTk1Nzc1NzAxNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7euqaivrpupqKy3tqy8yru2v6zLxsW4wc7PyLPEure7wsiwrbi/t7y9u7O1pqmglpeYlod6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXV1cXl9hZH2LgIp+io+Jko2XkZeZoqCboKuqpq+sqLClqZqfraCVlqWpp52YkI+anq6XmKiqmZ+dlKWhn5KRkpGTlairpZqZmZ6elo2Mi5OGiI2Dj4uSlZGgnqGkmJWflZqhop6Um6WmqKiooLGwprG9qJ+jrLSqrqewtbC5tcCxrrGrkX5yc2JWVFZOUkpHVlBTUUxMV01KTU9SR01LQUNGREM+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NzYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OspbG3qqajsaudqqepsrGktsa0ubqzysW5usHL0Mqxtre8vcHDsa+xt620tLuztKKjnZ2Xl5SDgHZrZ2xucW5xanBrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxdXWFqf3l/dIiMhpCJl4mUk5ibmJ6pm6CrpqasnqiaoKack4+fo5qXl4WEkpujkJWjnZaWloiim5uTi46KkJqkp5yVlZebkZKHlI6LgYuOgJCLkpKSoJqhopaUmJiVoqaZjZmkpqmmoaC0sqeyt6Gcorasqa2ksrKmtby1q6yxo4l5c25dTlFRTE9DTU5OUEtGTk5KSk5OUUhNSkFHS0hIQz44NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2sKWnpKqloKimpbOqorLDtbWys8bGtrrDyszGs6y5vbS4wK+tqbCepq66r66fmZqdlZSHe4NuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFtdYW5ydW+Dh4GIgJGEjoqUkZOeoY+bnKOipJmll6KclY2HmZqMc42Dfo6XloaRmpCUjo57mY+djIKJf4qYoKOekJOYloWNgpR+fnOJjnqQh5OQkJ2bmpqRlpCdjqOjjomaoKGkpJuitK+sr62fmKW4pqaxobCunLC8qqmvqpmDd3NjVk1ST1BOQ1NOTFBMQlBRSElOUk1ISkpESkxGSks9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKmmpqijpqWmpqazp6W0wbiwtLDJxLe5wc7GvbOsusGsrcOtp6Kmkp2mtqyjoI+VlpKQfXd+ZldWX2dmaWdobmNqaGdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVZZW11pa3FrfoR7c05Yco+Cl4aNnJeLlJGfmJ2VlJaVj5aJgJSJXztWb3yMlImAjJKMkIaGc4qFl4F5gXuGk52Ug5WOkZCDhn2TeHFwhYx9iYGRjZCXmpiTi5CJnYifmIeIlp6aoqCXp66praionpets6Kmrpmsq5iotKKpraOTf3NuX1tOU1JXTERUSlBMTEZOT0lFTFFNS09KSUxQRklJPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego66hpqaqoKepp6OpsKintMK5sLWwx8K3s73Pv7mvrrXCp6rFqqOdmIOUnLGimpiGlI+Lh31zdV1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYGxuaHqBdE9CP3+VkpF9iJSNhIqNm46WlYmSiIaVhnmJf2BKUW54i5KEfYSNioV/f25/f5R4dXZ4hI2acFGNiIqGe354lHZnd4aIfoqJlouOkZKWjISJiJWEm42ChJKalp+dlKSjqKmlpJ6bsKqhpKSRpqqWoqqcoqaoiXZtZl5bSFFRU01JVU1SSUxLT0lIRkpOTE1US1FQT0ZJQzw3Njg6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Nzc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKiosNDgzMzk4OTo5OTo6Ojo/OXe2nKOnnZ+hr6KnqKWnqK+tqrW8tre3s8G7tqi6yLi2qKi1tqqyvaeelY1/iZOolpWKfo6Dgn13cG9YTUtNTU5MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3J1fmloXFSPiZSJdH+GgXyFjJOCkpqLj3uGj4B2gHhzb3ZxdI6OgXp+iquEeXtodnuOcHJteIGLjZJ4eoB7gHZzcpJ3aHWEhISFfJWKiIqNioB/hIuNgJSEfICPmJSclpGfnamen6CdoKmlnp2YjKekkqCglp6fpIBzaGFdXUpXUFJHS1hST0pMTVJKSkpMUEhMUUxSVE1FSEE8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTI0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZidn7Spr6mlraywsaq9tLK7uLa6tLGft7qyqp2drKmosrChmpGNlIGOnI6Rf3aGeHx2b29pWEtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnSCe3hmdo2WmI2OfWd5gXZ4gImQfYSYkoFxh498d3tva36tfXSQi397hpKBfH91ZnZ8hWxvZ3N8iYyHgGx5cX1xbXaPcWhxgX6OcEOLhYKDhX93d3qMhn2Me3V9jpKPmIuSmpujlpmdmp2eoZyWjYqkm46el46WmJB3b21mYlpYWFVRSlNVVE9QTlBWS05LT09KUU9ITlBMRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6Woaawra6rqKmxr7GrvLisu764s6ynm7CnrJuPlpylqaSgl5mPhZJ5iI6LinVxe211cGptalhLRkdFQUBDREhMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFhdZXBybIinqsB+dHlie3hvfHmJkHp9i4ZvbYySeXR5amqAgnGWkYuBfpaASZKYbmh4foJtaWRseYWQkoZrc2x8bnJ8hmlucH9zjImEhnt+f3t2b3R0hoJ5gXlwfI6MipODlpeYmpCSlpeZl52WjIOJnpGLko2GkJaAbmlvb29YVlhUUlFZT1JUVFJYVU1OSE5KTU5LQ0hNR0VAOjg5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrbCiraqota+urLS/q7zDv6WimpWkl56NhIuUoaGZmJGTi3OOeoCGjIZ0b3RrcGxkbGpZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXF+niGKaaXN5ZX5wbX96i4l2goiGdGyaknRzfGpqnY9NeYWTiYSOZzF2hnNsfn6DdGZldX+EhIWAZmlsdWtxf3xocXF8bpKNj3x0fn1xcG51bYJ/d3l1anmJgoiJg5aSkpCLjZGUlI6XjYB5iJeIhoqGgJCId2trb2hlWFFaV1lZW01QVVZZWE5JSEVKSkhHQkBHRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEvKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVukoiakZmWpKiun7Kep7qvq7KwwrG7w8ealo+UmYuOhnmEkJiUjZCMj4Zxh4J0h4yGeXBycG9vZHBmX1RGSUM/PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHF7eGx9bHGDgoWBeoSGhnlyoZV0eIBzdZSHNXGdqJ2OoaGEooV2cYd8h3x0jK6OiYBoZ2JqbnJtcIN1aXBYdXCOm5J3bH97fW1ybnCAe3N2bmJ2g3+GgIWQkIqKiZGLkYyLjoN1eIqOgH6DgH2Pe3JwcGxgW11eXFlYYF9STltaWFdMSEpGSUc/QkFCSD9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ6lp5+vlaW0qa6xrsGyu8HGlpCMlI+AiH1ugZCSiYOKh4+GdYKEbJWIiHt0eHhsd253Y2leSlBHPkA3NDQ5Ozs7PT5AQkVITExMTE5QUVJUVVZXWFpYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx3iIh8foWDf4x+daKZeX6GgYWZhJqcYYaqn52Lg5COeneJfomIjnOLl5CEel1kcnR6fHeKbWhqYnlvhpCCem+Bd3SEenB0eXhrbmlddod9h3yHh45/ipKXg42FjIZ9cYR/g311d3t8iXdwc3RmZ2BbW15UXGZeV1BUWFtVR0pLREtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIyRnZ2fppGgqqCxqK/AsbrFupaOkZSHeoV2a3+MkYJ9ioSPjHiDgHOghIp9fIF/cIB+emd2a1JXTEBFMjExMzY3Njg4Ojw+QUVHRkdKS01PUVFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmiEiXuJeXxxfI+Men2Jh36Xh3ahmYiHj5KUpY2sqkiGrq+vi4GAk4qCi4KEkqmHgJiYipt0bX2Bhod9jmhnaHl/boaHgoVxhIZHbIB3cnl2aG1rX3Z9g4h/iISLeZSdnImLiJF/enWLdnx4bW93fX90dHJsW15dW2NjWGdlXFVQUFZZUERMS0ZOSUNGQ0NAQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKysrLzAwK251MjI0MjBMgVw1PTxehHR8fomFiJGOlpeSl6CdrKGmuK+zvbOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9Pj9CRUdISk1OUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzk0Ll2WcHOjVUZJS01OUFdgWHBZXF5pjZOHlYCEgoWRk36FiJGBmpWCoaGYlZubpq2Tmruxp7vHw6iLjKGlj5SJgZF8cYOen5Gcf3aFhYuQiJBpaG+DgHWNh4SLcYaCd4d/e3aFfW52dWaAlI6GiYiHiIegq6KWiY6Yf3qCiXp5b2dreH56f3NsZV5aW11qXWFmYFlPS05XUlFJUEpETkdDSkRCQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZniDe4CMf4GQjoqam6Sdoaymq6+xl5GRhKGUhHh3f4yUfH6ShZKVf4qAkpuOg4CBjIqCiY2Df4l/bXBqXUJANC0tLy8uLzAyMjM0Nzc4Oz0/QkRISk5RUlNSU1NUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISktLS05WX2N/Z2dtdZ2bj5qSk4uNjpqIko+di6CgkqOqpaOsk6m2oqjBw67Hr3i6lJp8jaGemYSThYKPop+TmJKEi4WPmpGWbHB1iYuCloyNj3ePhHFthYGKlpGDhYhyiKCVhpKJjo+WpLWpm42VooOHk4N+gGtqa3yAgYJ0Yl5kX1tna11sa15XS0dPUlFOTExGSVBDRE1GQUNFRkI9Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwgnB1hnF2koZ+l5aalZ6enKegqpaTmJ5nZaSafoSSkXl/koiRkn2KhJiSkYKAgIuMiYaQhoSIhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOUFJUUFBRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZynpaKZoZeilJyep56oq5+orKmqtperv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGam5mnkZGJlqKamnd6fpSYkqGSlpiBlJ57d5WSq7KIjZeffZSdm46SlZijoqa2sJ2RmaiIlo+NgYlsc3J8f31yaWBdYV9hZ2RgZ2ZbUkVKS1BPSUlMRkZNQ0hMRkdEQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHVgbn1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJi4qEkoWDhomBgIZ2XmJQNDYwLTEvLC4wMC8vLi4wMDE1PkFCTVFSU1FSU1RSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpOT1FZbYWQd5WKo6eqtL24pK6srKeotKuwtrKyrbuxs72cs8Osu8nLt8O/uKWjsLKsraqji5aYhaamoKOXgaaZjaKrqKSIhZSkoaCqoKSpj5yxi5Wjp7e6m6CjsJKinaKekKOhq6+ssrWilKSqiJmJkoqWenp9hX9oYWhcZWJdZGNeZmdfWk9ESUhTTkZITEZKR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pvWHqFdoGThYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5COg4WBjIWGh5KGgoSJhoiHh3BuYUBFNjQ8Mi8xMTAtLCstMS4tMz9EQU1VUVJTVVVWVU5bUEdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GSoISuo7OqssDHw6qzxbass7+zuL62v7TBtru6o7jFqLbJx7W+ubSoo7StsbGbmpKan4mnr6ullHafpJehrLKzmJaqraiutruyuqyvtaKxrLG1u7e1rrWgp6ejp5qpr62yube4p5u2qYyljpGToIZ4goN2WmJlV2ZhYWNfYGZgW1RJRERMVVFISUpESUdFQUBAS0RCTUc8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWlFiY1d5dXGBlH2EhpJ1hX+BjHu/u6O8grSUk42bj4SIj5KJiHmGgIySjIeFgY5/gYmOhn+GiYWKh5F6eG5dVkBFTjw2OjQ2QUI3NjQvLzZDSENRXE9RVVdVXFZPXlVJS0pBQD5HS0ZFRDs+QDdENz9CSkpFRldUUF6PpK2jsbTCtrjBzMm2u8S9s7PAt7jBtb6vt3Sxs6W6xaSwxrmxs7G0qKS1tqqxoKKWmqKSpbCtpq2sp6SYoKy0uqKpsrq1u77Mv8XFvb2zwre6uL63ure5rKywprGqrb2wvLrCwqyZuqiUro+XmKuJfoJ9a1dkYllrZWplV1tjWVZTSUdGTFFHQ0hJQUhEPj9CQktAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldTWVVadmpwfo6EgY2DbnpzeIdiuaGZo4mVlJaTlJONkJaSh4Z7hoGNlYqBhIGKenyLh4Z9ioOBioOVfXd5dWVPXGRHRUw7UWNhW15TRj87SFBFW2NRUllYWmdZVGBgTVNQRUE/SUpIRUZBQEM8RTZCPkhHS0xTWlRek6+4tbq4yb+6vcnMu7zAvLe1u7u3vbS6scZgdbKlsZqeq72qpairqqOisrWhq6ielZafmZ+upaempZ+klKKnsbSnsrO9tsG+08nJ08fCxczCysPAvr2/u7y3tK+4t7bDucW9w8iwnrmqoauOpKe2iYGAc2BiYl5YYmBpZlJYYFZSVUlFRU5LQT5HRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWPc2xycnOH1cC1maCNlZmZkY6XkpaWjoaHfYaDjJaLf4N/gnh7i4OHfIt5gYqCl39zfXprZXB1WV1cUGVlYmBlZF1bWFdcTWVtVVJtbV9uX1hnZVVZVUpEQktKSEZISEhHQkk5RD9IS1RUVlxaW5O5wLi9t8bAu7nKyrq2ura4ubK3tbSutraZZHWona1wXqKsnJigo5uknqqllKCfkJSOlpiXqJ+ln56amYOknaylqrCtt7C9udTRztfQyczSzM/OysfAv8LKvcG8wcDExMXKv8jOs6S7sLSvm6u4vJmAemxeYV1ZXmFaY2NRXGBTUEtDQUVGRTxART5BSEFARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVxZaF9vl5KQlG5sb3V1h7OsoaCfi5mcmYyNlZGbkoWKin6Ih4uQi4h8gYRze4qDhXuJdIGJhpV/c3t4a211e2hyZWlsaWZqaWhgZmlobFpudJatpLyIh2dbb2hdWlpUSEtOT0pLUEtTUUhMQUpGS1BfXmJmamKYt8ewuLO7vbWxxMa1sLmwsLursrGnqresjbWnnZunmk+anYyOn5aRppillYqTk4mQiY+RkZ6boZealZaGnpqnm6yvqLCotLTU1NTW0svQ1NXN08/NxcLJ0L7KycrJ0cfMzcPQ0riww7zEuaW2usOig3BkXV1eWWBYWWZaUV1XT1BCQkdEQkg7QUM+QUc/P0E4O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VWc5CQmIJocW95eYOgqp6lloybm5eLjZWRmo59iYuFjYqKipCHfISCcH+IgYZ7h3KDkYuPfXF4dWtxeH5xe254c2xpgXBtY2ltcHhpd3x+y7/C36duY3dvY1thYEpQUlVOWV5QXVxOUE5UUVVUW25tdoJxlq24rLOnsLaqrLzAsKu1pqS4pquuoKu0o46xrZqYmIyRk5GEjpuBjaaRnImDi4SKiYSLg5OVl5aTnJGcmJmZn56rrKSnoqytz9LV0c3M0tPT0NTRzsjD1NHHzdLT09fN0dHF0tbFwM7Hx8OovrfPnnpvZl5jXldgU11aUFFVUE5IPkBGQUJFPEBCP0VEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1OW3WGhYp3bHdwfX5/oZ6eoYuMmZOTjIuTj5aEeYWQkI2LioiRh3+Ce3J+gIGHeYR1hZKRiX9vdnJrc3x8d3tzgXdxa4BzcmlwcXp5cnq+y5p+jLKEdnKEd2hhal1DWlpbVmVjWGRqU1hdXGBkXmN3en6LgZmppKShn6CopaqwuKqltKOhraGjraGnsZ+JppqTkpGJkY+IgZSJapWijJmEgIV9kYODk5ati5WNlZqOhpKRnpensKGgoaWkqMjOz8jCy9HU0dTTztPNxtbTzNTY1tbY1dfVydTazcnX19HKrMPDzIxzcGNhYFhUWlRcUEtHSkpKQDs6O0RBRDxCQz5IQj5CQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJ2VnZSFi5aJj4qIjoePf3eDlJiKjYiIi4l+gnhze32DiHd/eoeRloCDbnhwbXV/dnh9dIV8eW2HdnRufXaEdXh8nbWMO0GLxaV+jHxpZVZJQ2ZjZWNnamRueFtfZmhrbmlugIOIkYudnqCdkJeYn6OkprKjpLOgoaWdoKmgorGchp6SkpKQi4+LhoOPhH6cm4yNg4SFepR+gqmVo4ySipeSi32XipuSq7OYmpyonKe9w8a5tsbN0tDS0MzSy8nUztHV2tfX2NTZ2M3Y287J2trS1b7LzLR5d29lXlpTVlJbV0ZHSklFRT06NzpAQUI6R0RARUNBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjXyXkZ2LfoeSg4mGhYmCh3x4hZeXiY+Dh4WHeoR5cXp7hIZ1eoWOjZx6jHB8b296f3F8gXGDh4Bujnp1d318gnV/e4aHsHRYqcK2jZGCcG5iPV5ocnBxcG54doFlaW9ydXhxeouHjpORm5WglYeMk5ugm5+qn6CtnKGamZ+lnp+rmYuajJCRjYR9iIeDhYuOoJmTiISHfm2ZeYSYhoiTjI2UjIZ7m4iUj66qlJWXn5mnrrW9qa29xsvIyczLz8nD0crU19nX2NfV29fT2dvWz9va0dbJ1MuVenxqaVxbUFNUXkhDRUlIPkE9PTc6PT87PUc9P0FBQURBPj46ODZEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OjpEP0NHUmtfbWRiZmt2gIhxkZCagHqAjX6CgoGEf4R8fISYjoeLfoaGgHeCeW97e4aBdXqSno2gdo51gnR1gX10gIRvgY+Bb5KEdHyAhXp2hnuJt8alwsm4gpabj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R1bZOWlJWPl5CDiY+XmpeWpZyXoJefkpKXo52Zq5WQkYqNkYKMhYmIgYaQkZ6cmYmGjIGGmHqIiJ+Xj4iNioyCfKGJkIu8oZiTl5qcqaalrp+otr/AwLnHyc3Oxc3K0dbV1dnV19vU1tna29fb2trYztzGh3x6aGllYFRYVlVNTEROQzs9PTw5Ojw+OT1ANj0/QDw/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eop7foB+gHyFe36BkYmFhXqEh3t1fXRtfH2GfnN+kp2RnoORfIZ+eI59eYqKboKagHSYhX2BiIV7fZB6j6mOj8OgvIycpJx9iYR9iXKMin5zppqcmJOFe4+QiIRoR3CgpJ2Mi5CShYmLkJKVj5yakpSRlo2LlZ+dlKCUkY6NkIt+kI6Oi4SJkpaan5+JjJSSnZGCi3+lmYiEjYOFhIGlh4uLuJidkZSWoqehnZ6do6+2urWswMXK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbuHl5eW1qZldgXFRQT0hDTEI9PT45OTo6OTk7PTY/Pj48PTk6OzszN0Q/ODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmBjopxcnmKe3p/fH97iHp8e4uHgn51g4V5c3pzbYB+hH13hZuhmp2UkoCMiH+Yh4Cbkm6HqIV6oIt8kY6CiIOcfZqRioyjop+QpK+gi5GLhYuBkoZXcq2Ln6ubj4OYm4+PjluCopGCjJ+TlYyHiIySkoyUlJSPjI+Kh5abnY+VlpGLkpOFgIuIko2Kip2WmaKihpOdlqCKiYiNnJCDiI9/g4eFpIaMkLOYnZKUl6GhnpmSnJ2nsrispr3Cx87Hxs/M0MzO19DR1K7W1dja2Nra19bZ2Z9xfnVoZ15dWFRXWENASEM+Pj46NDk6Ozc6OzozOzs/PD43Ozk6MTpIPjozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieW1ifpKDb213i3h5f3qBfYZ7e3eGhH9zcIWCenV2dnSEg4V9f5Kmo5+lopaKnZCUl4uKqJdyirGMhKeRhJmThZmMopagmJOJm56ikqmvoJGVkI2OiJWLbo23hZrEyLKboaWbnJiWkLKQZKTNx5aPhoeJj5KOjZOUiYWKiYWWmpuPkJSThpSXg3+Pi5mIjZCql5ejo4iZn5ebiI+Hl5eKhI6MgX+Hj6WJjZOpmpeTlpmhmZ+Zk52borO0paO8wb7IxcXJyMnCytPNzdSp0tHW1tbY2tTT2s6DdIFpZF9eXk5LVFpCQUdDO0E9ODM3Ozw6OD42NDk6PDo4Mj85OjI6STo9NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdYKOfHxsfYh4en56gYGCfnZ2gIN8bG+Lf3l8eHh8hIeLfYqjs6ijq7OhlqegpaSWla6ig5C3lZKzmY2hoIykm6+ipJ2YkKeWqJmtr6SXlZaUkIuYmZagwI6jybirm6KmrZmRmpyynYaFqKKcmIWIiY6VjYuTjoiBhoeIkpiUjIuTk4aUmIaDkZCcdJGZspaXpKGInJqUj4qQi5eaiYqWjoZ9jJifipCQnJqZk5iYn5SgnZWfm6GxrqOkt760xcfEvcPDv8bOysnSp87N09LQ1tjSz9i7c3t3XmFWYVdRSUlPRUFCRTU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTw1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdOW1xZSmdgO0iEi3p6bYWGenyEeICFgH1weHx9fG9zjXp9gXt4houJhYOSp7utqLK9r6Wus7Ooo6KwrIqatJ2juKSVrKSWqa23pqSjn5mpmKqjr7CqmpmclJWRl5+Xmbu7rcmgaba4q7CUmJ6jq5KXvaNeqrKCiYqNlIeRfI6OfYOGjY+UlYiHkpaLkJWNioyXmJKdmbOWlaqei5uUko2QkoyZm4qSnpCLiZWfoo2VjZianZOcmZ6UoaCUnJylr6iipbO4q8LIxLW7vbvFyMfC0aHGyc3NxNbW0MvUonF8al5bVF9SUEdEPjxDQUI4Pzg3ND5GPDw2PDM1MzQ1NDUzQjM6OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo5Nj49NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGVHYmBjcEpAi4p/gXKGh32BiXWCioN/bX19fH9wd4d3joKGe42PjIaMmqvCwK+9xruytMG8tK2rs7aMqLKurr2qm7ukqK25t6umpqKio6Opr7Kxq52cpJibmJeeoqWlkqO5rqi/u6ytsrmlo6Z9iIacrb2wg4uMi5CDj4ORj3qBh5CNjpyIiI+XjYuVl5SRmpadp5qxmpGrnY6aj5KOlZCQlpePkaCRiZWbo6yUlo+UnJ6UoJ6bmKChlZqep6ekoaSwsqbBxsOwsLq2xcTCvs2nx8PHw7zV0M3Eyoh0c2NdW2FbTktCTEBFRj5BP0I7OjQ+QT09NTw2PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxmRmBpZ1pdW5OMjIh7h4uHg4x1hpCKgW9+fIJ/cX6BepV6kZSUmJCTlqe0xsm/wszBw7nIvLqvq7m7l7K2urLArqXApKqvu7uqrauiop6nq6+1sKqboKqcopyVnrC0p4uiurm1wburqJyypKOok4WNqcPEpIKLj4eIhIaVlI16g4yRj5GhjIyUkY+Jl5+Yk5mUl6agrp2MqpyOlo+SkZWVjpCVkY+hlIaXn6CznpSalKChmaSfmqCboJSYnqakpqekr62lwMTCrqm3tcnDvrbOssW+xLyz0cnIwbV1eW1dWV1rU01JQ0xLS0lAQT1DRDw1QUQ7OjM9OEIzMzIyNjJBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJmW01lXGZUY2qZjZeKi4iTkIaJeYaTkIFygHyNf3iHgoKQeo2hlqiZmpi6vsfIysLSycrCzb3Bs6y7vqe6v727w7iswamss7u9qrCqo6Wjq660rba1oJ+un6aimKO0vambqLzBo7a2r6uSr6yqq5aGmammpZGCjJOllYmBdYqSeYWNkZCen5OPlIuQjZSjmZeblJSjnqmfkaWajI+PkJWWiH2PlZKSo5uVoKKctaaQn5alpKOlnp6mmJ6Vl5ulo6moorKsqLzAxK+ls7fMwLmuw7O7vsK4rMLCwcCZbnpiWVhdXExMTUpHRENIQkJBQ0s6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+a0lfWGFaZGRWnpCdjpeOnpKJin+In5OEeIV/lX5/kIiKkYCVoZqupqSYw77Iw8jF083Ozcu7wrevur20vMq8w8G2tryts7+5vK6vqKCpp7atrqmyt5qeraKooZ2rt7ippa++w7G9ubOnqbOzrK2WlqSrp6CRjpKxxaeVjnyRlX2HkZmPqpmYk5OPk5WTpZ6TnZmToaOinJifmYuNj4+eiFqQl5eSlqWaZpijn7OllqKWrK2rp5ufppeZlpmVoaSopp62q6m6vMS1pbS2y8G4qbass7u4rqi4ur24g25vW1hVVk9GS1NOSz9BSEVESEZHOTVGTTs+Nz5BSi4zMjAyNUI1NU9WTjtMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVzs9QEJGQnJGaUlSZWJMRqaUnJahl6mWjZCDh6WSiIGHgpyEg5WQkZSOmqKfr76uoce9xcTHxs7OztLKvru2sbq7vL7OtsS9t7i3srK1s7ezrKacq6u4q6mnr7CXo6+kqKSltMCwqqyzvsK5wLmzp7ezt7KulaSsrq6ki5OVoY10wZp9lpmEjpaai7GVmpmVkpOZmaajlaCblpqonJuhoJmLjY+WnWBKlpyalJqll1SWsJ+vnJ+llK+vrKWaoaWUk5mZjp2gp6KZtKmqs7y8u6uwssfAuaWrq62xsaOhsrK0pHFvZlxbT1FMRVBQUVE7SEtJRkhCQz45S1Q/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVg7OkJDQD1RRVdSc2JXRkirl5mgoqivmZCXh4unlo6IkoWfiISdl4+eoJqjpLXItKnGu8PDyMrJx8zOx766sq65uMDBzbXIusC5tbmxr6+ytKejm6q0tKuppq6smaSupaWprLq/qKu2tr7Bv764srLCsLi8q6OutKy4pYibl6abdr6ghJicjpOZmouvlqGcm5eVm5+hqZ6ooJmaqZmhp56XkI2RnYNudpKimpWdop+QrbKjq5WpqpirrqWkoKSokpKZnIiUnKKel7Gnqau6t76zsq29ubago6eopaecnKypqYxlZmFfUkxNR0dOSlZMPU1ETUlKQUNEPFBVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5TYU1VSH9lXkhFrJWcoZ+7rpmUnoyTqpuRkpOJq42Hop6MpK2Uo6O2xr20wbrCwsjIxcLOyMK9ubKvuLTAwsq2xrHBvLS6q6itrK+jopmqtLumqaarqp2or6ekq6q9vKitvLO3vca8trW3wK+9v7OotLarvqSPo5eRop+8n4mZoJmWnp2Pt5+pnKWjm5yhmqils6GbnaWcqKmemZWPlJuLl4mNpKGUnKOeoLSvpaWTsKuZq6yenqSjqZGVlaCDkJ6fnJWppaKhtLS6ta2otbKzn5yippqXlZmqoZ53YV5gXkpJRkhNUUlORUZGQlJLSUFER0FWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6Z1xGQ0Ocb2JHRaeXpJ+fw6ycl6SXmamclpqaj6qWlqimla2tmaGrtsTCu763wcPAx8S+zce7vrmysLizv8PItb+vvLa6t6akqqusoKCaqqvEoqWoq6aeq6+roqmovrimrb2wt7bHtrW5uL6wvsG2tLK0r72jl6OWk5uUrp+QoaKlo6OfkL6lqZ2orJ2doZumn72imaOeoqmroZ2XjZWek5+Hj4WNkp6koJ21rKaclbKnmbCnn5qqnqCNmZWfhI6hmpuTpaSamKyxtrKqpamtrJyZoKGSjpCWqZ+UaWRaYV1PSkhLT01IRURJQT1PSEE7R0lIW1JPSz1IT1U0QkY5PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGVjV0yimqObnsWsoZ+snZyun5KjnpakoKeqrJe2sKOqs7bEwr2/tsDCvMjCvsrItri1tLCztLfBxra+sLi0ubWfpqyqq52en6WkwaWgqa2gpKmtr6Kmp721pbG8t7W1w7Kzt7m+scPAt7ets7S1opyklZGToK2gmKGdqKmroprDramerK6bm56ZpqC+oZ2kmKurq6ahmY2an5KeiY5Yf5WepaGguKqnk5i2o5+zoaCbr5eejpmUnYKPn5eWjqKklZCmrrKrqaKipaWWlZ2Zi4+Rk6SfiWNlW2RgTElKS09GRUFGSj89SkI5OUpLTl1RUUk9TFdcOUZJPURNSThIY1xMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dzSEU2PXVlXEtOnp+hmJ7Dp6Wis6CcsqeTqqSfo5+tqaydu7CprLWyx8PBwrPCxL3GxLzFyrywsLausLWvv8W1ubCwurWsmqiwqamanqahp8Ktm6ywnKqirrCppKe9t6a2uryutsOts7PCv7HGs7q2q7S1raqipZWVlKOroZ6fmqirsK6vu7KmoKmpmZmXk6KkuaChpJKur6ylpp+SoZ6Vno+RjpWdmaOfp7Smp42YtJyjr5qem66RnpSXlJqAkqGVj46goZOLpqywpaeinKCek5KblIWLko2cnoBjZltoZUtJTEpTQkNASEc7O0Y/OTlOTVVeUlNKPk9eXj1IUEJMTEk5TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVV5mckA4PEiWd2VBNJ+kn5ugwqijqrKho7WplrKrpqKlsqyuqbuyrbC1tMa/xMS1wMW+ysS2wMjCtau1qLC4rMDEtLeurLa5pZmrsquql5+ml627tZuosJutn660saequrKnubO3srjAqreywryzxae+rq23tKmnrKGXlpGlpKKil5ikrritsbW2oJ+opJmUlZOkoLeipKWWrbGypaqmoZ6ampuWmKifn5iinq+yoqaNl66ZpayXmZ6lkZuOlJiahZaflIyQnJ6Ui6mpqqKnoZmeloyPmZCBhpaJlJ95ZWldbGlOUE1OVD1DQU1DOjpJQDc3UU9dXlJWUUFXYFxCSlNIVktIOlVkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVKcGlWQ1dGjHlmQzuko52hpr+mp6+voKm1q525r6ukqrS3sbC5t7C3uLjFvcPHvbzEwcfAucHGwbqqtqWtu63Bw7e4qq2yu6KVrbCtspalp5Gruaqgp7Cdqp+wtLKqqba1rLussrK5t6y5sMK6vb6mwqqwt6+pqqumnZiYqqGhoJGYoLCus6uwuZqbqZ+ZlpKXpqC2qaWioq+xs6uxp6ufm6Cgm56lnKGXnaOzsJqfkJOlmqGpmpWin5aYiZSYk5aXnZOIkJuZlI6pqKefo5yYm5OHjpmLfo2WhY+ba2ltYW1uWFFRWlVBQ0VUQDs7SEE3OlhQZF5QVldEWV5eTUxSTl5LSj5aZF5OSFBOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNjQ3Z1lgRig/OGx9aFtWOol7Y0M9qJ+coam9oaqwqqOxuKmltbKroa21va+zuLy6vbe2wcK/ycS5xcPAwLjEvsG4r7aoq7eyvL+/tKmusbefl6utqK2Xp6mPp7ufpa2znquisbCzrKm2s7W8ra+xtaywtbHAusS2q7yusbirrKmisaWepKmfo5eQmZ+yqrOpqrOZnaebmZSNoKaktK6noaysrbGnsqyyqaSbn6iknpShmJuotamXmZKSn5meoZ6QrJ+YmIaVmIudmpyTio2Wl5qXpqWjoJ2WlZaUgY+VhXuPkoOMl2Zsc2hwcl9HWWZWRENOWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGNgUEtNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfXmFVMTUwPWBWXjgpQzNZVVxnSzWMemZMQKSaoKSst6SsqaWurraprrO5pqexuMa3sbe+wcK1tLrFvszFucPAur+6xLjBubK1rKq6t7q6vrWqrbG2mZinq6qrm6yrj6u9nquusaOqn7Cts66utrG5tqmtrrCntrCzu7zJsqq1tLG0r66mobOfmqitoKWVlZqZsaOtoKWvlqGkmZmSjaKlp7Kpoaaxq6m1pa6wta+jmZ2tp5qXnpmZrLijmJSRj5icoZiXlKyfnZSBk5mNnp2alpCKlJOemqWjoqCZlpKSlnuLkIV7jIuDjJNrbnhudXxhRmBqWUlIWls9e0pHRTZBYlRpWk1cYUpbXVpSUlJiYExLRV9hYFBMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuKkIvSkdQW0gzY1lVS0SZl6CwqLGprKWjrq61qbe0uKOstLfKu7S7ur++tLS3w8HNx7vDvbe+v8C4v72xva6nurm3t8K3rK2xuZWXpq6rp6OyqZSvuqStsrGnp6Kys7CysLSxt7KorquxprivtbPDxbaptLWrsK2pp6K2n56msaCklJuZlLGep5ufqY2pop2blZelpaW3p6Kxs6unsaessLWspJmhrKibnJ2blKq5nJWOjouZnaKYkJemoZ+WhJKXkJ2cmJaWiJeQl5uonaSgkpaRkJZ2hJCHfIWChI2MbnF4dnx/XUtlbFxLT2NcP2J7R0k4R2dXZVtMXmJNWFlXVFhUaV1QT0hhXl9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSWcyNydGYUxWJS1CLj1FTVE8M3JrSkRDkZmkraStraunpLCys6q3sLafq7W5ybmuwbvCt7OytcLDz8TAwb61vcC/ur+9s8SoqrmwtrfAva+ss7OcoKewraWmsKWesrWsq7KwrKmotLmstLK1rLOsqayorKm5rrGwx764pbmvqa2tpqitsKWjo66jqZydnJqvmaKjoqOQrJ6jn5+hqqamuKWrtLSkqauoq6+2rqKdo6iqm6CampKktJqPiY2IkqOglY2UnaCUk4WOlJOdm5iWlYeYkpWZp5ygn42SkY6Rd36OhX18fYeKinF0cn59flxSZG9eTlpmXUZElltHOk5tWGFbTWBhTlZXVldUWWdeUVJMY1pbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0NkOzYqSGRISis6ST8zQklTLD6Paz1HSI+bqaqiqa+kqKSztLG0tbGxoaytvcy6rsG8x7G0rbTCw9HFxr7Asr7Bwry/uLzFqK23rLO4vMGwrLKtoKSnramopLCjqrGqr6uxrq+tq7O7p7exsqmyqaulpaOtuqyqscK5tKy6qKioramosaWppKKuqqiinpuirJWknZeemKudoaepoayloqyrt7GxoKiin6qusKydnqanqZmjmJmPoKeYhoOOioufoI+LjJacj4+GiJGVoJ2WmJWGlpOTl6WcnZyMkZCNin9/iIV9d3+HhYd0c3KJdmxfWWBuY1FzclxLPIR8Rj9XdVhgWU5jXE5VVlVXUFxiXlNPTmdYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkowLklnREY4PEIwNUVLWDFAlFs/TUaVl6ynoqqynKmpsLasuLWuqqWrq73JvLG+t8Ovsa2zxMTOzsO/v7TAw8S6wLTJxKyvt66yucC/s66uq6WnqrCpp6ixpbStqrCurbGvs6yzu6S4tKysrqern6OesLerqq26tqS2taSpp6ysqq2hqKamsbKkpqWhoauWqaCUmqCmnqSiqqSsop6msbesraKkopqoqq2pnKGlpKSZoJmVj5idlIGCkIiFnaCNi46MmY+Qi4SNmKSckpGbjJOSkpSjmpuai46Li3yHgYKDe3SAhIJ+dHiMpId5a15gbmdXZodkTkBnkkxEYnlXYlhSZVVNVlVWVE9cXWFVS05pV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxDKzpKT140RIZASEhEl5KvpKOqsJeqqa21q7axq6Srqqm8wcC4ubO8taazr8TJy9G+wbu5wL/CucG6wsSusbWys7vBvrOyrq2rrKe2qqWtr6u5r6iwsK6xq7WqtrWntbarrKSpqpyjnbOzqKiktLSgtq6hqairqKynoKusqLm2qaqpqaGpn62bkaihnaCkoqaiqZ2cprSup6WpoqOXpKamqZyipKOfmZmfkY6PmY5+h42HhZ6eiIWKi4+OkI2EhpWjmo6Nm5GSkY+Sn5eZlo2Kg390h4F/f3h1g397eH6AiZ6Pb3FnZ3F4XGF0iGlPXZhWSG14VWRWUWJPTFVUVVFPWFtiVkhQalRXVEdQWVVJPklIT1FQeExOVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjEmLzJSYzAyP2Y9Tlg/Qyw+TFRfL0lrNlFFO5WNr6Clqq2Zq6Str7O0rqqlr6mpur67wbGvuK6itq/Jx8jRwL+9urzDvrrDwcC/r7KzsrW9vMGysrOrs6mltaikrbOzua+jrbWxr7G5qriuqq62q6qeqqufo6C2ramhn6+zobSqnqinqqOqoaGsrai9r6yurKGnp5+rmI+vopiioKinnqebmaqwqKKfrKGhkqGio6aYmqiml5eYnY+Kh5WIfY2GhYSkl4WCgoyHj46RhIWUoZeIkZ2Qk5GNkZ2Vl4+KhYZ4dIF/fXV5eoB7dHR7aoKHo3VpXmVsgnVniIt8UldwXkp4c1NkU1FeTU1SWmdOTFZZZVhHU2lSUT5CTlFhUTpJSExTSXFQTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTGg6MzhfPWFkP0YxQ1BbWytITzpXQjSQjrGfpKaro6akrKa0s7Cpo7Cnqri+wLywqLmqp66wycbI0MK9wL65vr+8ybzCubCwtbK6vLnAs7S7rbmto7Wmp6yxtrmyp6e6ta21vK+8pa2ttautnKmvo5+lrKunnJ6qs6SzqJqqp6mkqZ2jqaipvay0r66dqaOgrpuasqOWpJukpZ+kmpqoqqWemqmhm5GaoKWdmJapqZGYmZOQioKPhX2PgoCIno+Gf36Mh5GPkISAk5uUhZOijJSRi5Gbk5WHiX6Acnp5fnxpd3x6dXBxfmmGeYSIZGBoY3OFem1neV1eVUJXemxUYVBSWUtLTXB0XUhaW2dZRVZmUEM+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTxGW0Aqj5OxmZ+fqKWkoaukt7KypKiwp6y4wb21sKO5rKiosMPJyczBt73Atbe/usi2w7W0s7Wyvbm6vbatuba/raKzpqurr7W4tKqduruosr+yuqCvtLaprJ6tsKKcpaipo56cpLGmsKCfqqmnoqqbo6igrbyorrCuoauio66enqyml5+boaOcn5uao6mimpmjo5WWk5+hlpuWpqyLnpGQkYyCi4B/joF7mpSNiXx/i4aQj4yJhZKYkYeUo4qSkoeQmpCTgYh8eWx9dnl4Ynt6cnBwc3hqgnRqg2dkaGFvc45tYmpwYG9BXHhrVV5OUFFKSUxTWldNXF5tV0RXYE9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmRPKT0zUVw9I5KYq5ifl6ekop+opLivrqKvr6mruMK6sq2fuK+rqLS6x8rHv7fCvrC0vrfEtsOyr7qys8C1u764qbm4vquktaeoqrCtubCpmbm8o66/tLShrri1p6ansLOgn6Smp6GlmZ+tqKmeoKqvp6Cml6OpoLC4n6Sxr6Groaykm6amqZqam56jlZycmp2pppaanqeRl5KYnZOZlaGqkJqJjZCHfYd+go18fKGMjYl5g4yFioyNhYiTmo6JlZ+IkZWCi5eNkH2Fe3NwfHFzdGB5eGpvcHFwan9zY3psaWZkYWaGgGBbcmpxTE1/aVhaTVBMSkhQUlFJTVtfb1REWFpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MFxaNSiWnKWYnJatoJ+hpKG3q7CjtLSpqLnFtrKuoLesraywtcXHwLe/wrqxtb23v7u/r6y+sLS/sr3Duam7u7inqLWop6uwrLOwppm8tqSru7Wun7G4sKmlp6+ym6GkoKOkoZacsKahn6Knr6KgopOjpaK3sKGmsaufrKKumJyqpKiel5qdpJOanJqdpamZnJuklJSXlJyOk5eiqaGQiYuPhnqEfYSKeY6Xio2HeoKIhIiMjoWNlJmMjpaZio+XfoaXi496gHpwcXZvb3RfeHdlbWxsammEbmZyaWxmaV1kc4FgW2t1aVpJfV1bWE9PS0hHUlVGMjldXm1QRFdWWWVNSElFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzlkbTg0R0FmW0hURFVdaEQuPDJjViwylaKhl5Sbqp2koaKguKquoLq4pqy9xbOwr6O1sK2tr7TDw7yzv7q4sbO5uLq4uq+uwLO0ubC/wbisvbu1pqKzqqepsqutsaGawLWkp7W1qJ6yvKmopqmvrJmjp5yjppSYobKlmZ+jqKmcoqCTpKCkuKikp66mnqWgqJKfqKKhoJibnaCSmpuWoKGqm5uYoZSRlJaZjZSSo6ikkImKj4Z5hHuEhn2djYqKh3qBhIiIiJGFlZOTjJCVlI2OlHuDl46Ld357bHRxbGxzYXh0aGhqZ2dwhmdoaWRmaWpgamJqZ1tle2NgU3NUXFtTTEpHSU9TQCEqaF1qTENWVV5gS0lHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRCM0NEZ1tLV0dVYGhCMzc5Z08nMp6jo5GOo6ebnZ6do7Wtpqq5t6esw8G2sKyjta6nrq+3wL+8scG2sa6ytra4t7atqr20r7Kxvb+4rry8saWftqulpbSpqq6fncGrqKWwsqmstbueqaqrsaWYnqqdpqSRmaetopiepKmhm6Kdl6Cdp7alr6qvoaGdnaGUoKafoaCZm5mckpmdlKWdq6GXlp2Uk42Vl4uPmJqooJKIiouIeYV3goKCnIiLgol8f4SIhoWRhJaVj46QkZGRjJN7g5WNhXN9fWZ4b2tqbGd1c2tjZ2RkdoBiZWZmZWpqZGtxWl5ZXW1kYU5oV1pgVkpHSEtNUlg+OV9saUhCVFNcW0lIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQmhIJTWbo5+Qi6yhmJiglqW0saGxvbehsca8urGxpLesq66puby7uq2/sa+urravs7izqKy6sa+utLa6tq+5vq2mnrWroKCwpKuvnaLAoLGjrrCut661nq2vrK2imp2nqaWelZuopZ+ZpKKpnZqgm5ScnqyvpbqorqKhmpqdmZ6jmqSdl56Ym5SZoJKolqqnmpOampGLlJmNlJSZqaeOjoqJj3yCc4GBi5iFh3yJiYSFioyKk4STnJKSkJCRlo6Qf4CMjYNwgH5meW1oa2pncXJrXGhkY3OBYWZoam5sZ2tqaG1cbGt0cWFUYmhkZVpJRkxNT1hRUVZhZYFUQFZTWVRGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUpmQyc0kqGajY6wnZqToZqpsq+fuL+2oLTCu725saa2sKiupbe4t7esuq6tqqu3qrS5rqaztbKuqbG3trGztbqnqZ+2qZ2eqaKprZqnvpito66vtbWtrJ+xra+popyco6uom5Wcp6OdmqmipJaaoJyRnKSrqqm7n6ekoJiZmZ2hj2uhlpmccYKVmqOAdZKpp56UlJ6QiJeZgJaKoZB4hpSMg25qfnaDcWyGi4Z9hIuGb15jYWeEl4Zri4+Uk3V3i4R+g5B/Z4aAaHVpZldcaHNuTlBqZGdyhGdfZGZubWpeYGGKkISFZU5LRDhGVGdeSkdQUFRVS0hTYW90ZUZaUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzU2OCwjMScyMTQ6MTc2WYFsMTZPa1tOXEtbZmI+RzFRZD0rLoykmYaVsJuck6Gbqq2qo73Er6m3wri9vK2ntrClq6S3s7GzsLitqqestKawtaOouLa1qKest7OutK2zoqqftKueoaScpqeYq7qVpqWvsretrqSprquspaGfnKCnp5uXoaWlm5unp52Tn5+YkJ6oqqO1r6Ojo5yWl5eXo4ihjpKah6GHk52gf6V/pqqekpGakYiEcniNjoWIoXaJjWmXiGZ9cnihcIiHhH6NfH+hoKCZgHuHnnSIjnabimyHgYNtaGVjemxxYlSGbWNsaZhxWWpxb4dYXmlba2tbiHFuenKGZ4aEWl5GTT9HX01GUlZWUVFSV1VnXk1XSVJTT0VHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3MCiLppeDnKudmZmdn6qqp6m+w66yury3wL+qpLewqayms7SurrO2q6mlsa2ltbScrra2tKWnqbOxrbKor5+robKpoKOjmqGjmq2zlKOkpba8p6ynq6qsqKWhoJigpqOZmaajpJicpKmWlKOclJOkpaaht6OjoKSYlJOXk5uIro+YlImpi5eim4WxgKOsnZOZnZR5gtSogIeVwZvHeXixpbeXZIDAnL95hIR5kIR8kJCRynGWvJzFe3K2pruQe4BslrGrsHhoa1ixrm5labySvG5oem5yj9h+U2pitrJ+gXKUdJqhqpBXT1dhT1ZORlRbWFFQUoxcV1xQQFxEUU5FR0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjaaSgaapn5ecnqWtsqiwwr2ytcC1t7/Cq6azrKypp6+zqa+2s6ioprWmp7ivnLOytqqlpKixrq6xpqqep6SxpKGgnpeboJ2uq5SdoZ+0uqOqqaKtrqWinZqaoaefl5uooJ+YnqenkZynm5SdoaaioLCin5+jlpWSmJKZha9qaoqNqn5nhJWGrWRwnZyTmaWUca6hpH54u31roZB2sV9qtFulgGackWBmgnpmf2p4a6lkvnJnpox2sWp8sXh0kpNjbW2nbluEoEVoZ4eWRXWcYH5nfKSngllfi6tpgJV4eWqnN0qvXFdTbWNbS05XX1xXVjtOiU9XVy9JVFNJREVGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMxG5GhlYOsp6Weo6WqsristL2+r7bEsre6wqaosKuuqamwrqOxuq+kpa6zo6m5qJ6zsrCjpaCqra+sr6ann6OisJuim5eVl5ubrKWWm6GetLOiq5yira2gnpqXoKKonZmepJ+cmqGnpI+do5qXoJ+qnqamoJufoZWVkZaRmoW1m7V4hamZtZl3h7Obt36TlZaolH5rgaZ7goaIkpSSeKtna7Fbq3uPh5R0iHGPhoB/iJCXeIOCi5iMg6CPhLB2d59xa2tsfItOpFhIY2OZfmNopmB5cnVTkodeUKltY3F+h4BinC5Rom9bU2toYExLW2RYXFpCPrF4V1hBI01oRUNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o4YVU1MBuVn5SIs6amoa6pp7Osqru2wrC7wq24t8GqrK2urqausqmhr7yqoae0raSrtaSmsrOno6GdqKqyqLCopZ6fn6+Wn5mUlZaYnayimpmkqLSvoqmPqaiqm56VmKClp5qfnKKfm6CjpaOVm56Ymp2iqpulmZyboqCWk5GTkpyD1ZOZuXCwwn7GhnzWlJu7fJmVpI+NnI2ke46Ho4KlgnqseY+dVq96iH6farlauXeGg3ymgpN8mHqqeY2dkHuxbo6EdJC8hW+UUK+nxYpRoHpjYKljdHKIbZeIYFO1tMiGgIl8Y6QzQp12XVBqaWRQQFhnWmRhSkhNbEtbUk9ZZllDRD5FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFRNzIlm6GTmLGoqKWzqqW1qKS8t8GwucCxtbS7s7WnsbCjsLKmn662qJuoua6jr7Ggs7SwoKSen6iqsam0qaScnZ6ql5iXlpeVlqCpnZqWqK2wqaOej6yiqJael5yhpaGYoqGhoZqioqebnqGelZmbpqCcp5Wbm5+hmI+SlJGciLJuaLVxq4dvjqZytHNytnuZl6OLjpyNon6RoaV+sHaDkdLRdlyue4V/pG+bqqZrh4R8rX2XmY97sXOSnY95s2WWdISeb55mlFLIi1rCXJ95Yl+tYHZzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamRmWEFPa19saE9VR0k5PVZSW1hYSUM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTTYyMKGckaWwraSqvK2mtaWntru8srq/t7a0urqzpbSzobGxop+sr6SYprqupLGxnLS4qp+mnaKqpLKorKqkmpyaqJ6VlJiYkpKip5+WkqWrsKailpOtn6WSlKGbpKaflJqlpqGao5+tmqCenZCWm6GdnKWVnZaZop+VmJaSmoWse3eodqOOiYepb62KgqeDmJihiZKaiqJ/k5mJroV/grNccrNSrn2DgqR/cdd9eIV9jp6GmZp3r4aKkZyIeLNhmmWagYKUbJJasFhLmnWYeWZgrV93d4domIhrXq93lZ6PeGw1eciusl9CVG9eZ2BFUG1fcG1WVU0uZWNpU1lRO0JEQUw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEk5ODifnZSguLCXtMGtqLOoqbK6t7O4v7m3srW8taW3s5+0rJ+fqKuflae2q6ixsauttKSbqaCgqKG2p6aqo5melaWhlJObmZKUoqWakpCmrK+moJWZqZ+ij5GimailoJWapaidnKSerZ2hnaCNlJ6bnaGYmZyWlqKgk5iQpp2GqX19pXihj46DqnCti4GnhpWfoYiXl4ijgpGIlKp8gIudeW+xWqiCgoigeXTYf3aHc6eBjpuNkqR8lpCfhHuyXpxkoH6DlWySXKtbWpN/kX9oZ6pkcnuBa5iHc12sWomgjmtvZU9KQ6FcW0x0XWJmTVthX3J0X0pWNkqbk1hIRT1IRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4wMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMT84oZ2Zmb+rl7TCrqutqaa0sLewtb+5ubKwt7ypurSfsKSepaennpOqsKmwqbWsq6+hmKGgpqWkuqKjq6CXm5GioJWUnpqUmJ6gj42LqK+vpp2Wm6imn4ySpJeoq6eUl6mnnp+go62koZ6hjZWhmZ+gkp2XnJWeoZWWjqubj65tcrRyqYx2iqZztHhzs4CRpKKRnI2JpIeQd7hvjHuLomtrtlqghWWXl2mhoqdtk3K0dJOYf7JqhZKIrWt1s2GdZqJvh5Jql1ytYE2hfIeRUnOjbXp/fm+Yh3Fcr1Y8nHdlVG9uLlynT2NSa2VibVpjXWBwe2NUWlE+Pm1vM0JCQD9NOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs8MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKWam526oZyywK6tq6unt6m4r7XAtbywr7m4q8G2qaqgm6akoZ2RqqqotqOyqK+qoJecp6Ckq7ido62blpmPpaOVjZ2hm5icn5CTlKu1sKeZlJysqpeMk6WZpa2ikZaqsaOgnqersJiho5CZopefm5acl6GTnKqclJCrmYfUkpq7c7DDgMOGftWWm7h4h5CXjJiKjKeIeqO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+hfox0h6p9vm5zvHSyg3V4gYtumohxbo2kdL1ed31bYXm8a1pWW2p6XmphZmdibXdvWVtZQ0FAcj9DRys1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy02QTmnmp6hvKKXscOwraqqrLGnuK+2xbG6sa67sK7Bsqykop6joZybkamkqrKktaatpJ+WmqqZpqy4naOumJWhkKWgkoyco56XnZqQlZKvubGslZejp6eUkZaknaStnZCgqKufm5+po7Oeo6WOp6KVopqcl5WjmI+woJKUqp6FkJm1gJCRjLeVeIKTmrV3bWtuc255j4SOiXSewbu9mnuBsqhwgHSRuIN8hoaMho17i4aNl3yku7m9nHV6tKN0dpd1dLB1mZ5mhmmNtnRycHe2jF6Aen2KaIN5bnlji6xwdYV/WVunakVkWVNmYGNdY1FnZnFtdUJNUE1EO1pNPkozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVjgqT11dPSs6VlYnPjs8p56goL+llrTDtKyrp6yrqbuusMavtbOut6e0uK2poqGlnqCdmZSrpK2qprWop5+blqCjnqykvqehqpeUnZCim5GPoqihk52Xk5eUsrW3rZido6Sii5KRppymq5uWqKSlnJqhqKano6mhka2el6Sel5eXnZ6PsKiUnKeijmp+aZymeIdzfZqPdHplh3q9vsC6b5KCcZWHX3JqWl6aiWFjiI6Va2B/lWNtnXdilWuAmpWUZV5gY3GbimlyjH2GlWdqfnJ0eH19Ylt3dIFoUFxuhH17i2tYbHuCc0lKb4ZwTnVNRVddZmBMW1hnY19PW211aXFSUERFTjxIST1MPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBeTCgzPVtPJz8yPqifqKHBo5u0urajrKWup6i1sazIrK+zq7WjvrGyp6CiqZ2im5qZrKaupKW1qaWbmJWhm6etqb6oqaaVlJyVoJqSl6SpqJCdkY+XnLCyv6ybp52noomTkambqaSbm6ugo5mao6eso5+ropqwm5WnoJaVnZ+dl7GkmKGomZyRnZyjo5mmopqcmpqZj5aBZ219cXeSl5SRhYq1qo2GmJWPioyYl4eUlYqEkpSRiY6SlJiUmJeaoKKanJShnY2CeqWGbGp8kHyAdImKgXGCeHl2douAe4prc4F0g3Vkd313a3B7bWBjXXBnTVlZZmpgV1pwem5sZlNPRlM5T1pNUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LkCzoLOiv6GjsbK3oKmlsqelsLWqyaussaW1psCotKGdpKWco5WWoKqmrKOjt6ufmZaWn5etqqbBn6yklZKcl56Yk5Sin56ippORmainssSvmqucqp+PlpapnqucnKCsmKGbnKKkr6eipaierpiXp52ZmqGenpywoJyippWYk5iToKGVo56XoI6Wk4qKjY6WrY98lZuCkoKLqqiGgZiWioSPn4h7hJCHhZmSiIaKlY+bl42Ql56jlpqTkZ2Nfo5mobOvhYqEdnqQinx2eXpvZnqRgYCJa3WBeYhyaHN/enaDiIJrdGR5ZmBqZWNkZmtZa3twaWpcU0xQRF9VRUA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0XEc1PCxAtKC5r76sq66ysqCqprGtoqyzsMWwqqyjs668pLScn6WioZ2Zl6ilqaakpbO1npWUnZmZsKauvqCsopCRnpqZk5GVoZyXqJyEnqmrorPIs5+qo6qXlpeap52om56kq5Oen52gqa+qpqOroq2bn6ChmaSenJ6dr6OYnqiTmJeckaSZmKidmpdlgpJ8ZX6NmY9jeY1saGt6kaSra2WamH5nhYplZWloe46hj2tojZeRo3hraouYo56Yc2xueoSNh3pYZV6Fgl5si4qAdlxoc3d3koCHgm54gniAc215hHR3iYiOg3tphllea3RkXXOJaWp8cWxjXlJOV0pkWEFKND1GNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMVlDOz8uPaWfury5r6yzsKqlqK2tsKeurbC9samnpK2vsJ+tl5+jnaGamaernK2jpaipsq6elaOQoq+mt7mlrqOOjpqhmZKSm6CZmaWVe6Wsoqi0xLikoaeun56VnqOeo5yjqqiSnqGdoKqwqqujqqCpm6afqKGslqGbpbCkl5yrlaGem5Kll56qmJ5+vYOHcrRyhJ2GrWh4ucS4cZOio3ummJlzqoJ8y8DAu3GLooiCn32VmImewL2Clp2djZ3CwXuCe5KNmsPAfWqlsW+MgW/Ken+bd5KDjoF2eoGAeXF6f4dxeIWNk3ltd5RjZl94ZGBlgmNedGdtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLyNGWzNQWS9VQUI7LziWo7jDtbCvwKmolKOvqbCuraayta+ppaamsKugq5iaop+cm6qnopyso6WopaS0pJ2ikqauq7izp6+ikZGanaWSkaChl5ufnYemq6SrrcDAsKCpr6mXkp+dopmho6qjk6ChnZ2trqmspqOjp6Glpp6tqZKkm6mtqZudqpysoZaXpZaho5ecf86UeHqkgXmVlptfro9ejqeBoqB8p5WbdKuDgK9eY42qeqeHhaB0l5OIs2OCq4agjo2zaoSudH2Xh7hhg61Zo81ukHV72nt/mXB+iJJ2fmV7iHZ2a32Ibn6FkZJ+bYKPYHFrcGdgX3lkXHFoamNmYFJUUldeS09DNUFIRUQ5PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w7TC0hUEBGNC4xrcK/v7W0sLeXnZGkqqits6ulsqysq6Srp6+qoKebmaSXnKKvn6CeqKejpaGesKybnpWnrq2xqqisoJSSm5+lk4+fpZedp6OeraSqsKjAxrOoqbGulpKdnKKXn6mqn5Shn5ydra+nq6mcp6ikoquSrbSXpqKqqZ2jpqWhsKCSmqeaoJqUlJGXoHGFjJd0hKiHcbF8nXGsfqGegaWPnneqgn2tf5xyrX6rh4afdpiSenyXfqqIooyRjJ1+q3uJlI+fgHutVpzEeo9vksF9gZVtdXCMbWV2ZYZvYXducm+Ki5KQg22RkWVwdHVwYGdtZWBvaWluZmNXU11hWVJTQzlKSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DUxsaytJ+do46jo6Gsr7auqbGnqKqnraurp6KjnZmilaCmq5+hpaCoqKKfnbCsmJqWqKevrKinqZ6XlJqjopGUoa2bnaajr6yjq7Squs2yraaurJaUnJ2imZ+urJ2WoJmdn6myqaqqm6yrpKOsm7CxoqisrqWYpqqpqbGikpajpZqUkoSkaqR1iXqpdHqycIKliZmMcYigmoekYGBSq4R/roObdq6BpoaGn3qZloZ7ZoCjiaSZhYKjfal+gZWHrl98qFWdopKBeqKfgHvDr8WMc6+zs7lxYqmvwnRojY2Yj4FtmpNwbnl4d29sZmVlcnBmfGliXVdgaVhYVUxNUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NzQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfDydbVv6GZq6ehr6KesLSwr6mtoqemqqurqaSmoJuln5ymp6ajnKyaoqyhpJ+vop2akqqktbCuoKmbnZaUp6SQmqKooKClnLGmo6exrLbIsrWqrKqVkZ2copmgpbOdmqCUnJ+nrKukrpqtqqOiq6KzrqKqs7Ghmqmorq+2o5OWo6eYm5F8qmyehId1q3l8sG+CpIqJn5aVn5SB0ri0uMmAgbJfX5Spg6SIh6B5mJWaeKrJdJmjlaepkJOajH+biprGxnhloYKlc4GfjoJ9r15wtWOxdUujhm2nR4KTZI+QnpJ8cJeTgHF7dX17bltmanNxZoFqX2FZZG1cXllJTk1LRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz4tNU9UUR0cOzxGMiwkp6TBxritqbKtrKWinLK5rKqhppuopaqrqqegpqWYqqOfrqudpqCsmp6ppZ2ntp+il5OoqrayrJumnKCVkKWskZmcp6OfqaauoaOnqbC0wrKzqq2ok4mXnaSaoaOvppehlJicpaarm7Cerqimn6yjt62hsrmvnZuup7Kzs6SUl6ejmZ+Ogp1OeJqBf596g6N9g6SEh6efnJ6ThLh7fHm5gn7MxsK2eJuhkYuffZqWlop2npiKpJijqH6whZ2Fn4SsfZqUYaVso3CPhZCBfZeDcqxgpHNxgJpgvH1SVXWOkqSXfH2Tkot1enOFf3FcbW94cmqCb1pkX2huY2RdS01RVEJJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA4ODIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu4q6+gm6Gss7Omn6CVpq6trqqnnaamm6OnoLKuoqmmsqCZqqSUo7aiopWXoqm0uKScop2ik5ChsZmenKeloaKvrp2kqKG2ssOxramtqZGHkJynnKKknKWWnZiZmqakqZqvoq6lppivpbytobe3rZ6dtbK4sLOmmJ2voaOehY/RtcO3eYeOhZGTkIGmeJSid4ygkYSlgYpxqoaEtG5yapmjm5WKn3yYmYaHj3OvgqWboo2mi5OdiZWQmm1wslylc5N6nGyZf3uZfW6pYaNxcX+fYnOyuGh4j5SmmX6MjZOMeH15joJtaXhqeXNugHRdZGRubWZnYEpbWVg8SEdAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVZWVFFPUVtVJSEyQUgkKSWTc42Krb+/u7q1npanpK21oaOZlaOpp66qq5mmop+moaC1p6Opp7CjlKyjjqSto52QmpqqtLSknaScqJGUl66goJ6mo5ynnLSaoaqjtqvDsKmrqaGMhI6coaCmopWampuYm5mmpKaYrKiuo6Wbrae+rJS9sKyforCyuauzp5qosaSnmHqokH18sHeKgaSliJxtsm+hh618oY6DqJWYgKyIha6Fn5SpoKGWhp+AmZWAe5J+q4CdmpaLqnidoI+JlJKAea9do4F8pqdknYB8l3Rrr12la3CFmV1gW4ygbZWSp5mDlI2XjHt7g5d/a2x/Y351bYB6YGdlcW5oZ2hDWmFbPUtUM1U4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaWFNQT05JODA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNUVlZXWFZVVVFIRklKIygovZKahKnGwrbBtJ+arKCuuKWjjpukop+wr6qfpJ+drZmeuKCjq6CvqZquoZCrqaSWiZqPrrCsp5+nmqyXmI+soqGdpaGapJytmJ+oprapwK+lqaSfi4COm5qfpp6SlZqalJqapqSkmqmsrKSloKqov6WXw6yqoqGrsrmqrqegs66oqZh2r36Qi5yFh3y6roqYZbCMZZWtfaGPg6aVmoGsioSwhaWZpKGhkYWgW2xqgbNgf617e4KBsWxnb5mXjIixW320W6SDa8iiZZ+Ae7tZdrVasn1Sr4B6rFiAoW6YkKibi5eRl5d8eY+dfmRzfmKEeHSAfGFqZ3FtZmVlT1VkXEJVXz5KKD45PTQhIiwlHzIuICoxLzA0NTc5OTxBQ0ZISkxOUFBSVFdaXmBfYGFiXl9cW1hVUE5KRkM1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7K3vbu0wbOjm6ympbaooIuaoJ+cs7Opn6OfnbWYoLOoqquer62erJuVr6mijoibjq+sqKeip5mukpmPqJminaWfmaOipZmfo6qyqb2vpaienY59i5uVoKCZkJKam5GamKmgoZmorqempqOlqbufoManpamhq7S1rK6mnrutrKyVgKmSo6+Om4CHpJeYkIGAuMO6g46ck4SnlpyCrIqCr4imm5ulqpF+1b3CqmKjv719fqOCg9e6uLWFlJODnr2+hGqjgW+rhG2df3qysMeDaquwvax4d6K+vHSBlo6nnJCbkZideoKRm3pjfXtkjWd5gntga2VramJQYVtTalxAVWFDTio9OjQvHh8kHiUyIB0kKDA0OTY2Nzc7PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PEE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbO0sb+5sb2yop2upqWypp2MmKW/qrixqKG/pqaynJ6xnLmonq2vpaeUlLCsl4yDm5GupqOsoaScqZ+Yi6OSpp6nnJqgqKKYnqCsraq5rqijm5eSe4eZkaabk4+RmJiPmJSpmqCYqamhqqehoqu7nqnFo6Cvo6qztKqvqaC6p66umnN1qqS3hmWJoHBnrY+Kj21veKSPmZ+Bda6ZlXCPi3GVqKObl66kcm1tbWWKeG9tgplxgXpqcWlniZaVmHFpaYSGZ3CGZF2JY2pvWV1nfnemYGJxjpFvZmSAjZOPopiYmZKXn32Hj5V2Zod4aI5reX95ZGxjZmxiS2RXSmxZOlFlRVInSzorIxwgGiMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXVdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqZWts6m5ubKzqqmhrp6jsqmYkr6yw8i+tqqewKuso6CnrJ+6o6StrK2mjZeuqZCMhZWWrZ6mq6Gfo6OgkYukkqeZqJmWo6mglpympqivuqysmpuTknuElo2lmI2RkpiUjpiVqJWfmKmjm7GnnqOsup+wwaeks6assLGqraunuKOtt5aKoKiltp2JlqKYh6makJSdk6qzmZujq6CxlqGhnZ+inKCkoZWrp42TkoyHkpyclJCak5iRjpWFgaSZl5WNi5OSio+GhH1nin90gnZ0h4xxp217lJGUkoGBjpCQj52UoZaZl6KDiJWNcmmQd3CLeHd8empsZGNvZFVgWEBpW0hjYU9aK0Y9KychNzQwLh8cISUyKCo2OTk0Njk7Pj9BQkRGSktLTVBQUVhVVlleYGFjXF5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqltbaurqKwpK2foLWxkI6sxr3Eu7iqoqWem6aesKijtqedqbWmqJGYrKKLiImPnKeWrKWgmaeenpOVo5aomqiZlKaho5CbqJmhtbuoq5makI18gZSLoZSKlZKVkJCUl6WQn5qqoJy2o56orLenrsGuo7enr6+wrKmpsrigrryZkaWkpraikp2mn42pn42Sn6Osr5uho7Cor5ejoJyjqZ6enZyWq52SmaGblJCWqpmNmZmWkJaekYmgnZWUhZKMkI2UioB9ZouGdYZ2eYiDc5xqhpCUlJCJfYyWkpKXk6GTnZeihImZh3pylnN6in9yfH9qb2RecGphW19ZbmNQYGVQWjpHR0U+Mj0+Ny8rJispJh0mNDA2NjU4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWBlVVBKQUNCOjlFTVZbXl5bWlxbW1tcXV1fX11eX2BhYWJhYWFgYmJiZGJcW2OXlaSoo7CzrK6jqaetoKe1qpCQnaWzu6+srKKjmnqdorGkpbCplpu4pqOTmaqcjoaKiZyjkK6fo5Wnn6CSlpibroqqlo+omaeMmaiPn7m2paaZnI2JeYKTi5qTipWSlJCNkpeijZ6eqZ6fuKSAhK+1orCvdaS+o7Kgd3mgqrG7lHWspJ6JgKp/ZFxidqCOpJ6El35uk7Odo6etqqNlnZ+Sc3mZl3CAmKiXbH+iqIplnKWckZeYloySnJCGnZqQlYOSho+OkomEd2qOh3aGcXyGgIBhaYiKlJKLWnaVkWhoj45yeqaamWV5mYeCeJhqg4qDb3mAa3FlX3ZwbGtoXGZlYmJwU1w+Tk5OU0c+QFRDOjEvHh8mNDozMTY2Nzg8Oz5AQUJGSEJHRklLTVRUVVldYGhmZ1dRSjxERzs4VVJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mm5Wmo6GvsayrqaWprqOnraWSlqu2sLKmmqqnq5dzjJ2wn6irp5OXuaCgj5yknZF/iIibno2rmqKUp6GejpeRnoV1ro+IppqokZekiZy6tKigmZiLiXV3k42Wk4qUkZCUjJCToI6boKeZnLKWgIyctZ2zjJKPvKegfqeieqKut4GOjqaeg4uGkLGpr4yKlqOaeYGLrIacnaKnqaeHlYWYd6WbeoebgZemgoJ7nLF6ioWgl5mUmJWCkZeWhJqZY3mHkISOj5GKg21wj4d5gHGAgYV/hnSGhJWSeJZoknSgmnR9mYShnoeYf5OKg4OZa46NhWx4e3FxZ2R4b2psaltla2pmdFxfSVRMUUBFNS5ZVVU3KSEwOT0+NjQzNTY4Ozo9Pj5ARElASkVKS0dTWFpZW2FgaGZZUUg5RUw7PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXo5+mrq6rqKygqLGmp6qlmZSuyL6woZamqbWekISdrJynoqCNkL6emo2fmqCQfYaPmZeIrJyhlp+gkY2TiIaAkaiNh6Kco5OXnoafurKnnpuSjoVwdZCJlZCKlI+Pm4uPkp+Sl6Cklp6siJ+0ibSarYrKh6quiLeFjK+CsK6DqY2lmI2dfKiPcnt3nI+nlmiVpHm0i5+epqiSmMKBf6uImKFxnoCZpH2XhZWxgKF8oZSgkJiWgI6Tm4qYkYt8hZKGjZSSiYNtc5CFf3pyhoGEfIR1hIGXgI/FZn+ph4+ja56DopuEmoGNjoWKmXGOk4Vod3R8d2hodXFnaGteZHBtZ21YaEddUk0yRTQ2TmFjNyYzPERHRDk2NDY1ODs4Pj09PkJMP05JSkxDUFpdXFdhXWpsXFFFPUtNQEpkWV1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUl6KfsKipqKWroKS5saqrppqUoKOkqqOWpaq3o6+AoaecpZ6diZS9mpONoZGdkHmElpaRiKuZm5uZoYWPjHabnI+fkIiepJuVmZiHo7mupJmcjIx+Ym2Pi5OQjZCMjZiLkJKfj5SgoZmhqH6hp4etnaCWrY+enJ2RhYCgjaquhqONqZmMmn6idYCZlGuCrHVNq3iHjZ2Rm6ingKmrfYOhe3qnaZ5/kmtnl4aXtomefW5gZFmDln+Me2Roi3KZfXmVbF17lm1fU3CDXF9reYNgWWWCfYOAl3CnqmuDo25ypXCfhJ9pZqBtW26KfGZaYIN/YldQb3dmbXRya2pvXmpwbWxqWGlPXVhGOUE0R0RfazQsSUNRTU49ODQ4NTk7NkA7Oz1BTz5RUkxNQkpcXV9XXl5idmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBjZGNhY2lrZGJkZGdkYmdlYWNol5adoLmhqqOmrJGhtrysrqOZl6CipaytoZ2utaOokqGgoKabmY2YtJmQi5+MlYx1gZSSjIqmlpWYnp5/koWFrKSHm5CKmKmYmZqSiKaxp6KVmoiJgGluiIiLjo6Ki42Si5CSooyUnqCcoqV/k4GPo6GUoHeclo+ng6Gnf4aprISleIp8hJp9onBzlIiWe56MeW2HnIyZkJuomo+HnXuConN2pmaefnakX5h6fZJzom6Yt7S6dJKHgn+1qGSBxrh7cJW3i3GAmqRjc6yrYH1qnbN+bnyGgo6Ci5hxf6NscqNznoSApGCdmbOWcXyXn7R0c1uesoNqYm90dnJob1hrbHNzZl1pXmJLRT1ENVFBWnIyPVNHX0pSPTwzOTU6OjZEOztASVE/VU1OUUBFX15bWVhgYHxkSEM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO4mauck6CNpLe1rq2gm6Kco6OmrZybsa2sk5ehmaGkmZqUnqubi4mSeIuGcICWjYmPoZCSlJ2XfZCJjqigh5iOipGjk5ybjYypqKWekJaHhH5re4d/fZCNg4uQkImPlKCDl56gnaCfi4l3nJiijJ9yoYuHqIibpY+Wp6p+rYx+eqCZeqOTeIF0loiNnH2WoIebjpmbpoaiZKF8iJaQm41snmibjW6amXuAiqd9cmh0q4Odg3SqaJWaXZuFdoSdaKpqgLhmXKhwgZxhlYxep3Z2iIl/nmiadYaTkpeOf59umpBtp5pdqX54u2t+qluOhF20Z1xucnl4a2lccWp5eWNgZlhiQVFFTzdWQ1JuNEtaWl9OWkRAMTUxOzs3SD86Q0hVP1lSWV0+RGJeVmBRYWN9aUVCOU5bXVhkZlhmZ25tYmJlX2JhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtZuniWOUm6u6srCsnaacnKifnq6bnrCorJ2XpJqhn5iWlqCjmYaJjWqIgHJ7l4iLlpaEkZSYj3qKhJajnYqUj4aLnpKdnImQqaOgmoyRioCAaYCGeX+XjHuIjo6Ij5aaf5Oin6Chk5hyaJ+Kn4+McJKMgamHmJ6ip5+nfK+to6K4l3ejs6KkgIiUeZ17q5p/oo6dm5eIl3GhfIWNr7V9a5qRoXh+mLSjo6uohJl8m32dmX50qlpdb3uWi3ieYkx+enqFY3mXQkyeWaJqcXyObYGJhJl1m3iGibGzf3+bk6d2gp1uc32Ub5lza6RdlXZIZWNgc3F+f25mYGxpdntkZWJSXlddVVdAWUZRZ0RTV1tiWF5JRD1COD9BOklFOExFV0FWUVtWREZiXFpgS2BtfnFFQzxVX2JaZWpWZ2htb2JmZ15hYVxdXmFoYl9lY3ZsXmVnZmtkZmxpaGtpk52Bsa2ZhFReoKazubOzqZqijJyrnJyplKGrpKKoj5+enZqZlZignZaIh4l3hYFueZWFkJuLfJGTlohyf4iSoZtzkZCBiZmVoJuFjqmcmpWLi4p8hGyEhXGCoYx4hY2IiJKYlXyTo6Geooiuhn21hI6enHullnqpgZWcj4qgnHynaHdtfpl0oXNxfJ6GmXCTg659pIOmnpqAo29eqGd1o2NvpWGc05B8e5l4cnNjooWQfqNzo491a5CzjGCCmIlzqrKovH93g21+vqaptF6cbn1xl26Ac6JyXaRnc6ZhaKZtm9SZfYWbcHl6l2ube3iXc26ppGdgZXlwgIRrZ2ZkbnZ3Z2BjU1tmUVFiSVdJVGBXU1tlalxlUUZDS01KS0JKRThQQFFOV1JZT1NRYGZlaVNjd3l3SUZFY15lWmhpVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJebf7GrVFxLfqmvsbSws6ObmYWZqKCgpI6kqKCYqYqZmJiTmZOSoJiOiIZ7cH2EaH2Pg5SagXeRjo+Jb3+Gj5OSbJeTfIiRkqSWg46qmpSSi4WJeYN3iIBugp+Hd4CThoiZopd7lKKkmp+Js6Gitot6rKekrqVwqICakIWAm5F7pIChmYaYcp6Eo66vipeMgIykjZaDrqGUdrW1tcmhc5SKgZ9gnZepbXmVhqCbdaGHd6B+kpeKgG9MZqOScJuHcqR7eXRhg4JrfqBrcWRgnHJ+dJdpemmztbTGpnOYfnqda5ybq3WEm211d5hpmnp1mHJQRX20Xmp2a3mIZmpoYnR1cG5WXlRZaVBTaElVTFlTVV1oa25WZ1dNS0FKTUtISk5BUUtQZWNpbWV1c3N/eXxudYl7e1RQTmxeaFtraVJqaGlsZ2xmY2VfXF1cXmliZGlre19dZGhjamZvbWVpbGWhnIivpoRmP5Shs6uvr7aiopCAl6mioqWMpaednaaCmpeWjZeQj5yTjoiDeWp5hmWDjH+XoHl1j4mMgWmEhZKDjIWdjXqMipWmk4OXqZiMkYuBiXqAfYt5cJChhnmBlYeJlqCWf5SlqJyWloRmbnicbKJkfHGld5uYcGemgJaLe6R6n5aDl3KedoGKlJaPuW6QiqJifZmhlYhtcmmranWgbW6mX5ppi5BoloealXWigH2aYIyGjHRviGJooGWefmmadW9jZoiCbXKiWl9bY6FtXYmMb3t+c3JkpW13omRnp2iZc4yZb6JvU4mQb6BfZahUi15UmG5tc2tygm1waWt5c2tvUllXV2ZaU21JWE9dSVhpaHNqWWtWUVJFVlxMWFJhVWhqX3d0en1wfHxyg3t/c3aNgIR2XlFyYmdicGdQamhoa2xuaGRnX11eXWBrY2ppdnVdXGNpY2pqc2xma21jnKSYpnpldG2Lp66kqbCxpp+LgJernZ+ljKKhmqKigJaYk42aj4uYkI6Ke4ZxgIhoi4t8mJtzdIl9kHtkgoeViomVmYJ8iIaWqJCBoqyRhpCKgop+gICOc2iPpYR9hpSNiZigjoiTqqediaZ4lpt/pIiWjLKYnpCCr5efpXeUh3mpdKSOhJpupKKMkoSMg7tufaWvgoaGhpOWnJ98pXpxqJWglmaefm+rY5aKlZJ3qGypooGJdYeCd6uRpodqkbBrdrOMqWuKhm1tn56SlWF/q4uqdn9/jKWedp99hKSVnaBqm4h3rGefrY22dHe+jaSTWYOmjathdXJ0cHx0cWNqfm5obFNWW1ZhYl1rTV1SXUldbW12YFtxWVxgWmd0ZW5vcWNxdGB4en55cnmDc4R+gHt7jIGCgHZieGRjbXNkUmtnaG9scmpmaWFfXlxia2JtbHtvXFxiaWJsandtZ2xuYpWlqp2BgJ6klqmqnainrqSZiYOYq5qepImapZ2pnYWMmo6GnJGFko2MjXSGeoiEb42EfpiTdHSGcpKDbX+LkoeGk498e4GFmKaOf6WmjoGOiYWVdoKHkm9si6mBg4uUjomcn4mNlKujoI+AdZSWiH6BeZSuo3+Bm3GPhXiPioN+e3KmjHF9fXqXlpuEjnh7fn6HlJWTinaQmJ+gg3p9iWuMhVt5eHJ6cGhufpKJcX90go+Uk3GFg4JljH9egX+Ld3VzlHVveW5uh22EhV52aHiOZYCBhY6pm310fJZqiYhvgHZ9hnZtbWeMc3l7mHiFW2tYeY9pbndycW94eHBdbIZuamdWWmBXXWVrY1ZhVV9RX3B4eWxrdmVqa2p2fHFydHNhb3VidHuBeHV6g3aAgH+AeIuFg317bX9sZHhuXlduZ2h1a3hqaWpkXGBaY2plbHF1blpbYmtkbGx5bWhsb2GOlLiopouhopqmpJmlnKuioYSEmKySnqGJmqabqZiDgZuKfpaTh46KiY1yg3yPfX6PhXuXjnNyhHCVhXt9kouGhpCFeH5/hpmkjnynoYuGkJCFloOGjph3coWpho6SnZCInp6IjJuon6Cqg4mNlJp+fomWraiPkqaPd2+dkYJ5kW99qIVwfZVxa3B9gZ+Mf5OOjGhtXYOLjJybno5zlYuIcXRrgXZ0gVlyboeRgX1+jGpdamR6hYOIgF9peHqbe4KLgnWBhoJnd4qGa2FwcoJ2X3KLgYmPppWFZoyPg253i4Rxho96cGZnZHuDepZbXGpnbnZbe3l3dW5zc4JmXG2Ka2xjWVleW1lscVxfYVpeXWZ0fnt1b3Rja2tqe31ye3h0ZG10aG18fnZ6fHx6eoCAfm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtobGtxcm1XW2VtbGdzeW9oam1gi4upsKGQo6Ganp6Ynpmoo6J+g5itjZ+ViJuikaWVf3uYhHySmYmIhoeKc32Ai3aFi4GElopxb4BymIaEfpOEg4aKgXqAg4uboJCCp6KIeI6YiZWLi52XhYN6rYKRmJmUip6dh4ihq5+ioqOLh5ObnKOZlqqhp6agkpuHlY17d42OhKd+f5KRkpOcsqablZ6QjbKTmISljIyVm5+JkJuCiJGKa3yNd3hlgoaQinyJnYSHi5CIiICFhJB3fHl0mqGIhomeioSUfn2LgYF1cHOFg393h4eKkKaRhIWNh4ONkIx9iIuJkIJ3bIKEfXqZanJoYXSKcH16d3ZvdnSBXV5vh2hvYF5aXF1TaHJVY1xcYWxodXx8c29wZGtqaX98bnl/cWlwcGxmgHtygoB4f31/hXttgoyGfHp4fH16g3lOZHZqcm1wemRrZWJiYFt0ZnBmcnFtVV1sdG1peXpxZ2lrZYyHnbmel6KhmJWZmJSZpKGefH+aq46ejYagnIueln15lIN7jpmJhoSEhm54gIBygYd+iZSEbWt+epeHhIOQf4CGhIZ9hoOOm52Sh6ufg3KKkIaTkYydkX2NeqqEjZKYlo+cl4eGm6afopqdhoORmpmZkJqmoKWdnZCWgJCKdnuHjoSle3yOkJGGmKqhnZOdj42qjpGAnoyJk5qego6XfoaOg293hXF1YX6Cj4Z1i5iAg4+ChoV+hYOUbXh1dJKiioyFmYWEjXSAiXx9cnJ7h4R7eIuOhJKmj4aDj4GEioqKd4aIiox8b2t+gXxuaGxtZ156f2h9e3Z0dnV7d1xgcH1udWBjW11eUWduVGVbXmFraXZ6fnFsbGRramiAgGxzgWxsdG95b4V5bYeAdoKAfoV2cYKNiH57e3x/e4KKYGl7anVoaYJlamNgaVxkdWhvYnRtbFVjcXllcHp6cmVqbW2LiZ63mqGkn5KRlpeLmp+fnnt4nqeRnIqHpZSLmJl5eoyFfImRg4yCgoJufH94c4GFfYuRfWtofYKYiYGIjnx+hoSHfY+BkJubkYinnX9wi4uMk4ehoYqFjXyokYiQkpeTlpN4jKOgoZ2Wmn+BkJqYkoyao6GjmpeRm36NhXiAg46HoH99jI2QfJikoKGTmZCPpo2QgZuRiZOXm32Skn6HjoF0c4JwdmB9f42GcoqVfIiMcYx/goWGjmh3cXiMmJGPf5Z+h4pygYZ8fHF5e4uEenqRjIOWpZOLhpB8hoaHhXaChImIemVyfH94enFsamZefnNofHV2dHxzgGpeYHR2cHhkY1lfXlJraFRlWV9haGp2eIFxZmtkbGhmgIFrbn5ob3FrfniGemuMgXOBgX6BdHaCjYZ+fHp/gX1/j2pyg25zaWKHaGxiX3FWdG9tbmB4aG1XanR2Y3V7enJia295iY2espGkpZ2OkJiPhp2hm518dqWhjpiAjKKKiJqWeHuGh36DiX+JgoF/cX97dHaChX6KkXhnY32Gl4qCio14fYCMg3mWgZWYlo2WoJt+b4yCkZSGppuHjYmEppWFk4uWl5OSd5GdoaGXlJd6fo6Yl46Wmp2knZiSlJt5j4WCd4SWjZ1+gYmNjHOXo56hk5mOj6KMjIOXmIOSlpl+mI18iI2BdnF9bnpkgHyKhXCGkn+QgmyHgoGAiYRldW97h5KXjHyTeIuJe3+GfHtxfneJhXmEkIqLl6KVgoSMd4iEg4J3fIKKhnZgeHh9dH54Z2xkYX9pandzdHV9cXxiY2FzbnVzbWFaYV5bbGVSY1hgYWlrdnmGcWJqY21laX2DbGh1aGxvaYB9gXltkIZxgIODf3R8g4yBgH56goN+fJBtdol0dG1limxqYmN1VoRpcW5geGdsYmp2cGZ5e3lxX3JshoWPnK6XpqiejY2Xh4afk5eZfXiqnYqZepedi4yYkHl7gYt9fIN7gIOBeHR5enN9gIR/iYuAZF59i5WHf4WHdX1+in99mISXlJeMpKGYf3KHe5SSiqePjI6Kk6CSg5KQlJeRi4GPmKCakpCRc3+NkpSJnZ2eppeXjZWWc42OimuFl4+ZeoeIkIlvl52ao5OVio2fjIeCkpx/k5KVhpmIfIqJgXpxeWt1bHt9i35thZKClHdwgoN9fop/ZHJpe4CWl4R+jXOQiIN4h352eIB9hoB8g42EjJSkj3mEgnSJh32AdHaBiYRuYXt1enF9b2FvY2R7Ym5vdnN4d3N0YXVfb2x1bm9cW19eXmteUF1YY2FobXR7iGtfamZqY2l3iG5mbGhqbGiBfXt3b5CIc4GDhH10gYaJeoN9eoGEfX2OcnqLeHhubIdraF9pcmKHaHJvZnZnbmxheWlrfXt4cGF4bYuAmZmqoKOonoqLkoaKnouVmH13rpmNl32flJGWlIh3fnuKfHuAdnd/gHB0dHtvhX2BgIp+fGFcfpCShoCEhHN6gIZ6j5KIkpGck6WclYJ+gX2Oi5KkiY6KjZiajYaRmJOWj4qIjJKck5CMjW6Dj4+RiZ6ZoqGXlomWkW6ImYRmhZiOlHqJhZCLcJWalKKSkomLmoyCf5GefZKPkouZjnuKhIdzcnVrcW50e4t0boWQjZJxdIB7gYGIfGRwbHh9mZN9hIh0kIqAc4h5b4B9gIZ8hYyJhIyVqIx7iHx+i4V4fnFwgYaEY2h5dHVwfGJecGBrdF5want5eGxzcGV4XW1sc21zWFpeX2JrWlBXWGVjZ3Fxf4dmXWloZ2JncY5uZGlnZGlogXp3dW+OhXSBgoN7dYOJhXeFfHiEhXqAind/i3t7cniDamtfcGh0gGtyb21xZ29sZXxjboB5dnFsd3eKfqKXoaigppuHjIuBkJyHk5x1gaqVk46HoY2Wk5CAdHt2hXh5f3Jze4VrcnB6bYp2gIGHbnFbWX6SjYiAgIB2dYCAgKCGkIuSnZihlJh4in+BjYmcnoqPhpKYloWJlZmPlouLjY2NnYqOkINtiYuQkYmclqGcmJWFl4hphKOCZoWdipF+i4OLgXeTmJGekZCJiZWOf36QmHyRjY+NmpJ8ioCCbnVwbG1vcHuFaXODjpiKcHd/dIKIgnhmcm91gZmOfIiEepSReXaIdHCJe4WMeouGg4mOm6OIfIR2got/eHhvbIGEgl5yc3JxcHhaXnBgcGpeb2p9enBtbWpsdmBwb2pybVpYYWFiblhRVFpmZ2N1cISCYl1rbWRiZmuTbmBmZl9na4F1cnNwi4B1f4OAeHWAi4B4hX93h4Z3g4V8hox/e3aKf2pxY3xjhnxvcW10amhvbHZ4X3F/eXt0dXSAgn6klZqtnqaWhYyEf5eUg5CfdYuglJOGi5uMlY2LenJ4dIJwcoV0cXWIa29tdW2IdoN+gG1uVVGBq5WHgniAd3OCeoKggpKCk5OYnJKaeJJ7g42TpJqTjomVmZKEh5eZjJSLiY+PiJ6EkIp8c4uFiY6InJqfmpaUgJN/aIWch2eFoIeSg5GDiXGDkZePm46PjIyQjXh7kpB6jouMkZaMfIh8gGt2am5ra2x6f2F6fo6WgnZ6gHiDjHx5Z3NsdIeVi36IhnuTkHF6hHB2jHqJjHqJfYKMkJ6dhXx8d4KMfXdxamyCg3pgeG9tbHJ0Vl5vYnJgX2xueXBob2Zmc3RocGthd2VdVmZgYHJTUU5cZmVdeXCIfF9caHJiYmVmkmpfaGRbZ3B+cGtwdIp9dnyFgHR1f4x5e4aBeIiDc4aFfoyMhHt5lXhmcmqDYIh+b29re2BqbnR/dV90fXiGeHRzhXx4oI+ZsJylj4KKf4OaiICMn3+LmpOOhYiXjo6PhHZ0d3OAcG+FdHBxg3BqaXZug259fG11c1JNgt/IktaTfHB1g3aDn4KTd5SRmZyQmXuUc4WQn6GTk5CKk5uUhn6WloiNjYiRjIicf46Ad3qMfoiLipycnZuVk3qNdmeJkodsiKOEkoeXg4ZjjJGZjpWKl4yNiotxe5SIe46IipORinqFfH5se2Vyb2preXlcgHmQjoF6fX5/ho56emhzanOKjomBhYV9lYtrfn9ugIt+i4d8hHqCj5Wamop8dniDkHlzbWdxgIRtanRvaGp0blNeb2RwWV9rcnhma2piZnhyb3BjX3dgYFZrX153UE5LYWdjXXpxiXRcXGV2YGFlZY9kYGViWGlzc25rcXaMfXR5hoF1dn6Lc4CGf3uJfnKJh4GRioh8fph2ZXNufGWHfm9wa39abG55eXNhdnp7jXZzd4p3eZ+Lm6+boJCChXeIlX59ip2HhZ+RjoWMl4STjoeBdHdweXFuhG9tbn5yZGR4cX1teX1qaGxjpJrB3K7voXNsdYR2hKKFkm+WkJWglZyBknGGi6OXiY6VipCdloOAlZCFiY+AkYqJln6HenV/iXiGhI2cm5iZjo92inZuhomLfYqjhJGJnYWFXouTl4qPiY6Li4SKbXyWgX2IhYmRj4Z2hX19a31keHVpbnhzWIh6koaGeX6AgIWLfnhmc2p/iY6JgoKAjJaFa4F2boiQgo+EfoF6f5CVk5mQdHN4iI11c3FndXqDYnRtcGJqdmdSYHFnbFVfbnR5YXJjX2h9cHJuW2NyYGJXblpceE5NTGRnYV52c4ltXFxkeV5gZGaFYGNiXllqcmtua3J3jH50d4SBeHd7iXGDhH1+iHt0i4mIloeMfn6Yc2h1cXlsi3pudHGBV3F6dnlxZXd5hoxpd4CJcn+ch5mnnKOShH1wjJR4eYudhIWhjY17lo1/mYiEe3J3cHNqb4FraW18dF5geHd7cXV7Z2FlfOvatcnD3IhzbHSBd4qaiI1pmJCPnZaTgYlxhYmgjYSLlYqMmJR8jZOIg4mPe5CLhY+Cf3Z4g4Ryh4KTm5aUmIaMdYd/cISCiYeYoYOUjJ+DiWGDlI+HioaKjYeBh2l9lH99g4SJjo6CcYZ+f3F3aHZyaXN3bFqMfJKChn1/g4CEiYJ1YXNriIGPioF+f5KQfW2CbHiGj4aSg3yAfYCRk5CWiG9xeoyGdWxxbHJ5gWB0aW5da3ZgUmVyaWZTX3B2dGBvYF1ognByaldnaGJpWG1WXHVNS0xlZ15icnOFaVtcZXleXmRne2BkX1xZa25mb2lzeIp+c3OBfnp2eohzhYN9gId2d4qGjpiBjIF7k3Zsd3V5eJN0bnh7fVl6hnGAb2d4d5KCZHaGhXGKlYWZoZqiiod0b5OLcneOnH2KmomJfJ9/g5l/gXhxc25vZHJ+aWZsd3hbXnl7e3FxgGphZ2F/1baOkKd4b3F3fHGSkIyHapmOiZySjIZ7aYiLmoeBkpGGh5iNfI2NgYGJjXuPjX6JhXp0e4J6cIaAlpmOk5SCiXWDhnaDf4qTnJ+GlY+ffohhgJOHhYiEio6Af4NnfZGAfn+CjI+Qfm2CfIJ0a212dHN2dWtijYGPf4V+fIR+g4d+b19ycIV7joyBfH6RiHpwg2Z5g4qGi4N8hH6AlI+QkoRub3qMfnVub2tse35jaGtqWW52WlJpcmpiUWJyeGxiZV1aaoNtc2FbZ19kbF9uVFtwTkhPZ2VcZ25xgGxbW2NzYFxjbHdkZV1dWmxsYm1qdHeGf3Fvf3x8dHiGeIWCfYCHdXmJgZKWfIiGdomBcHd5e4OTb218gXdeg390gW1penSUc2dzh3xykZGDmp+boIaIdnaVfm12lJd+iJCDio2afIuadn12cW9samF1fGdiaXV6Wl94fHptcX9lZGhnV52PXnFzl7zFhHZxlImQfnKXjIadk4yIdGuJj5aBe5SLgYSbjHyLhn18iYx/lIh1iYV2dn2BcXWGgZ6UhpWPg4Nxf4h0g3uJmJyXhpOOnYCIZX2TgoCGhImJcoF9Z32Le3l/f4eMj31pgH2DdmZveHhzdnNsao2FioGKf3iCgIOCf2pecXh6fYyJhXuBj4B+coFpeIKHi4WEeYN8gZiMj4x9bmx7iX13dG9paH13ZV1xY1hvc1NTbnNpYU5mdHhmYF1cWG6AbnNZZWJdam1gcE9ZbFJEVGhhWmtubXtvWltebWNaYm93Y2ZcXWBramNsaXN2gYNxbn57f3R1g3qDgnyBhXZ+iYGWkXiDinSBiHJ5eX6NkG9vfIFxaYF5en5tbXx2lWtqeIR0bJONhZ+YoJmFiG59jHZqeJiPf4KKgpWXinmPlm96c3BsamRgc3ppYGVye1pgcnx5Z3B6YWVljrGyd0piWqTa0Jdye5GLkHh+lYuFmZGNhm9shpKSenmShoGEmIp8h394eImKhJaAb4qHcXR+eml5hYOlkYSTjYN/b36DdoN4hZuYk4qSkJSFh3B7koN9g4OJg2+BeGiAhXhyf3+Di4d8ZX1+g3ZjcHOAaHhwb3SYjIWCint2eH+DeYFqXHB9coCHhYh9hol6iHKBbnGDho6EhHOEeICZjI2EeG5ufoR/d3tlaGp9cmBZd1pZcW5OWHJzZ2BKbHZ0YV1bW1l0fXJvV2ddZmpwX29OV2lSP1lmX1pwa2d5cVtbWGtlWWNweV9oXF5lbGhmbGlxd3+Hb2x/fYB1cIF6gIF/gn92gYWJl4pxgo1xe4Z8enmEk4x0anp/a29+dH99b3J8e5RvboB/eGeSioKhmZySgoZnh4RwaHqWiX5/hYKZioF8jYxpeHJrbGZfYW94bV9ib3lcZGyDemFxdl9lZdTqvooyOj6LjoByeYWIjo12g5eNfpOOjX9ubIWNjHZ9j3+FgpWJfIN4bnaGhIOXd26IhGt1e3RmeYKDp4yDj4yEfW5/dHaDeYWbkIuQkZKMi4Z+e5KHeICEjYNsgHJpf354bXx7gYqEeGF5hIFxZHFofm10cXWBm4uAf4V+c3Z9gHKAb1tsfnR4iYKKe4Z/fIh4enFsiIOPg4pygXl/louKfnRta3aAgHV2XWlpeHFZV3xTWnFlTFtycmVbSnB3b1xbWllddH50aFliW2dlbmNpTVdmUT1eZlxddmVfdHBbWVVvZFllcHlaaF5fZ21namxpcHh9jmxpgoR/eW6Ae32Bf4J6dYKBjJOFcICLbnd+gHt7iJOJf2h7fmp0e3KGe3N3fX+MeXiEfnxrjIyDm52WjIGAbI5+a2l/jo17fn+DlIJ/fYqIa3VxZ2hjW2Jncm9fYWxzYWhwiXphc3ReY2SboI9uXDVZr7V1aoCJfZKGdoaXhnSPi4p3cG2Fg4d1eYp4iX2TiHp/c2d2iH5+mG9whn1odnltZXmIhaWHgYeNin5ufnV/gHyLmYeCk5CYiIuEiXyPiXF7fYV8aX5ta4B7emp6doKHgHJgd4F+cWRyZ3WCbXV7hZSRgXyBf293eXx0fmxXb352c4uBhneHdYGJenhybomAj4CFcn59fpKIiXpubmltgoJ1bl1oZnRyUlt7TlxxXE9ccnBjVktzeGpXWVlaYXGAdGBdXWBnZGhpZk5aaE5BYWRbYHZhXHRtWFhTdGFaZG5yV2peYWhrZ21saXB3fJJraISJfH1wfn57gX+CeneAgImLhHJ7h29xd4N/e4qNj4Nqfntud3l2ind9eICCh3+Df356bYSMiJijjYSDe3aMemtthImReX17gpGAgH6Kg3BycGNmXllnX3BwYGBncGZqb4p1YXRvW2FkanZ7f76cpqPIuHGFhHOUfXiGlIJ0kI2IcnJwhHuDdHWHdIh3lIh5eXFjd4Z6gJNpcoR1Znd2Y2p8g4iegoB/j499cn9zhHh/kZCCeJaNlI+Hgoh7iYlseHl+dWh6aWt/eXNpenaAg31oYHeHfWprdGh7f2l2gYuQlH56fn5we3Z7c35iVXZ8cnKJg4J8gnCGiXd4cHCDgox+fXl+fHWOhYJ1aXFpbIiCcnBeaGNzbktldUxeb1VUWXNuYlBPc3hhUldYXGFwgnNbYVxoZWRjamRQW3FJRGRhXGRxXl13aFVXVndeXGVuaFZrXmFqZ2Vvb2lwd3uTbmmIjHl+c3t+eIKBgnx2fYOIhoNwdoNybneCg36Ji5N/cIB8eHl6gYx0g3h/gYGChHmAdm9+iYuanoh9hXp3h3xodIaNkXp/f3yJhoR2j4Bnb21fZFxYZVltcmFgYXFsa2iJbmBzaVleZG2Ad6naqceGh7JxiXhwjXV7h4+AepOKgHV0dX53gHBxf22FdJSGeHVsYHqCeYiOZnGDb2d1blttfYGQk4CBeZKTfXh7bYd1gJCLg3OWipGOh4WFe4CFbXV2f25od2Vte3ZtanZ2f398YWJ4hnpodHVjfXpndYaOjJV7dIB1cYB6fGx/WVZzfW90g4Z+f3hriIZzeWt0f4ODfXp9eHtyi4B8cmd0ZW2Lg210W2tfdWVIbm5MW2JXV1Z4bWJPU3R2WFBVWF5hcYRvXGBjbWRjXW5iVF1yR0NmX11maF1aemNSVlx1W1tna2FWal9gbmZma3FocHZ4jnRrjox1f3Z4fneBg4F7dH6DiIiDb3F/dHF1foaCiY2Ke3d/eIR8fIWHeId8fYF+hYB7fnN2eYyOn42Jeop2dYN5Xn6Gmox5h4N0hYaFd4l6Ym5sW2JbW2FWanNjYFtnbm9nh3JhcWZXXWNrf3zKzoe5omptbYpscYRxfISKfnuShXp5dHl1dXtqbXVjhHaSgndwZ159gnmLiWVxgWtqcWNYbHuGnImDgnOXlHd+e26HcYGJi4dxlo6QiIWLg3t5fnFxb31naHJibnhxamxxeH18el1leYB3aXV4ZoJ2Z3SHi42UfHKHaW9+gHhtfF1YcX5tc3+Ke4Fubol/cXZnd3+Bf4F2fHF6dIZ8eXJmc2Fui4Jsc1hrX3dcSW9rTldWXlRVe2thT1R1clFRVFZeYnSFaFxga2pmYlluYVhicEdBaF1gZl5dVXteT1ZkcFlbamhdV2dgX3Jma2dyZ3Bzd4Z4bpWKdH96eH55goeAdXOAhoWOgnBwe3d3dXqHhoeMhnp8f3WLfn2FhISHf35+fYd/fHh1eXeRk59/jH2LbXWAeWSDiJeGc5KKb4WFgXqDdGNuallfW11dVGdzZWBZZHJyZ4FzYmtlV1pgaX93vq57n7duYnOGaHR8cnqDhnp9jH94eHN2b3t2ZWpuYYd1joFzamJefnh5ioNmcX1oamtaVm94iqOBhX9xmZNxgHh1gW2AgZCHcpSIjIeDiIV9eXVyb2h5YWptYG12amdrbHp3endbZ318eGVyfW6EdGV1hYyGlX9vi2ZreoN0bHRiXG98a3R8i3qBZnSGfW1xaHV+eH1/cnxsenqBendwZWxibYl+bW5Wa2B3Vktqa09ST2hOWXxoYk5VdWpMUFRVXmZ2g2ZdYXBoZ2BXaV1ba2hKRWpaYmRXWVV5Wk5XbmpZXWxlXFllY150Zm1kcWZycHSAd3CahHZ/fnh/fIWHfXVzgoh/lYJuc3h6enNzhYeJiIR4gH12j399hImOhIKEe36Lg3t3fHd3mp2XeoqDh2l3fnxshIWUgHKPgnGGgn6Cf29mbGdXXVtcW1RkcGVfWGNzdWl1cGRlY1dcXGiAcG9ygHOJZGV4fml0dnNzg4V4gYR5d3R1bmt7cGJoa2eGdI2EbmZdX31ve4l9aGx3ZmlkVVdycI2nfIR8dpaQc3xze3lte3qQhHaXfIeGgoaDfXVwcm1ndV1taF9sdWRnZml6b3tyWWeBd3RncIB4gnVid4WKfJSAbotqbXqAcGVyZWBseWZydol7fWF1g3Zpa3F0enB5eHJ9Zn5/f3h2bmNlYW2GfG1rVmtjcVNMaWtQTE5wR157ZmFNVXRjSk5TV2Bqd31lXWdzaWVfVmNXYXBdTEtrWGNhVVRVc1dNWHVkWl9rYFxaY2Vfd2ZtYnBpc29yfnR0mYF3f4B4f36GhHp9doKEfpiFbnJ0e3p0cYWFj4KAeot1dJF/fYGUjoCFhHx+jIZ6foB2e6OlinmIhoVsdXx7dYSCjHpuhXN6hX2Bg3VuamhlVl1bW1pTYm5lW1hhdHtqaG1oX2JXX1tpgGprb4BnbGFoeXlrdHR0b4WBen99dnVuemhqeWpfZW5ogXePhGdlWGJ3aX6Gem9pb2ZmXVVYb2iPp3aBenyQjnl1b35vcnV5jn93lHSFgn+FiHVqcnZnaG9cbWVebXNfZ2FqeGh7bVttg3NzaW+Afnl3YXeEhHiPhHOIcW95f3FicGhbbnZkcHOIe3hhcoBwZ2p4c3Frd3Z0d2ODe353dnBkY2NufH1ra1VqY2dTS2xoUEdSbEVheGVhTVNyXUpNVFlla3d6ZV5tcGlkXVZfVW5uV0tTaFhmXlhNVWxVS1x5X1tfa11dW2JlYHpobGFvb3Vub3d1epd9d4CBeoB/h4Z6eXqDfoGThHF0dH56d3SFiJB9gH2QbHOVgXuCn4V/h32AfoaCgIp7doSsn396iIeEbHKCenaBgIF1bodvfIBziYBqb21kZFhfWlpaVWJqZ1taX3WCaV5tbFxhVlxca4FmcnR9aWpda3Z2aHR3cm6Ge359eXZybXpoaXdmXWRyZ3p3koFjY1Rlb2aChHd2ZmhpYFdWWWhkkKdufniAi456cHB8ZnhueYt6do5xg31+f4ZuZHZzZGhoXWxiXW9vW2dfbXVlemhddIBvcmtxe351dWJ0hYp6h4aAf3dydX50YXBsWXByYnFxhHt1ZHKAbGFsem9qaHl3dHJmhXV6enVxZGFkbnN+amxUaV9eVExzY1FHV2JHYnZlYEtUcFhKTFhYZ2t2emRlbnBmY1pYXVh2ZVRKXGNYaFhZSVdlUUhieFpdX2xbXlxiZF6AaWpfb3R5bW9udoOXeXKBgH1/iIuGfXZ2hniHjH1zdXWBeXp6goyOfX6EiWp0loF7ip19foV5gHp+fIaIc3GProx7e4aQfmZyiHp0fX12cm+GbHt+bI96YnBvYWVeZVZZWVdjZmtgXV1zhmlYcG1bX1dbXGx7Y3B3dmxiW21zdGd1dnFthXl/gHl3bm90ZWl0ZVtndGZ2dpF6X11SZmZqgoF0fWFjaVxUWF5iY5ClaHl0goWQeG1ueWd3bXuEenSIcoB4fHh/aGV2bWBmYV9qYF10a1llXW9vYnplW3d8a25ucHh4dHRkcoOSfoeCiHp2b3F9cmF3ZFpub2FwcYF8c2VxgGRebnZpY2Z5enRtboF1c31zcWJeZm5vfWVpVGlZWVROeF9SSlpZSGJ0Y2BJVG1USUxaVmlscntibGxzYmFZWlthdltTS2RdWGlTV0hZYE5HaXVYXmFtW1tfYmNdhWloYW54eWxva3aBkHhtg36AgZKIhIF2dYl0jIZzcXZ2gXd8fX6Mj4B+k35weJaDfZmSeYCAeHl+f3OIg3NwmaJ7en+JlXlkdYh5c3h2bHRvfmx5fHCRcl5wbmBnYmxUWlpXaGNtZVxccolmUnJtW1pYWGBsdmRpdWpqXlptc3FsdHR0a4Z8foB8d29ubGRpcWNba3JkdHaPc1tXVGRgcn9+coJcYWNdU1pgXGSTn2VycYWEkXRsanlsb296e3txgHZ/cnp6emRldWdeYlthaFxed2hXYl1vaGF3YVt8dmppcm93dHN0aHCBlIKGfoR2cmpwe2xmdldcam1icHKAenNlb35bYHBxYl5pcHxsbHR+cnF4a3BgXGVsbXthZ1RnVVdSUHZbU1BaUkhjc2JgR1ZrUUlQWlVra2t8ZW1vcWBbWlhZbHBXUlBmV1doU1RGWlxPSHJ1WF9jbWNYYWBhXoxqY2RteXhrb2l1eYZ7a4N9gIWZfIKEeX2Ibo+GcW93enx0goJ8i4+DgpZ0eIKUhYGfiXWBgIF0f4Jwh4J1b6KXdHuGi4d7ZniLb257b2Z4cHpsc3ZzjWtedG5hZ2VrU11bVWdibGxbXHGMZE5vbVxWWFVnaXRoYnRlZV1abnVucHV1emyHfH98iHeQc2Nla29hXG5tY3N4h2taVFZjY3d8fHCFXGNfY1RbYFpjlpVjbnCDhYpzamh6bmVydnN7a3l0dW96fnVfZnJjW15XYmRZYXVmVV9gbWRhcV1dfnBoaXNxc3B1dWtthJOBiHuFcXJmbnxvcW5TWmVqZXFzgHZzYmx2VWJxa1tebmV8ZWx1fHJycmptYFlkamp4XmZUZVVWUFVuWFFXVFBIZXJfYUZXak9IWFRWbWlkfGlrd2thV1xVW3RjU1JXaVFZZlRTSFpbUE54d1tfZmxpWmJgXl6PbmJma3l1bm9pdnZ/fm2DgH6Hl3t/h4GKf2uTiHJndIB7dYCDfYmPf4uTcn2KkYWHn4Z7f4aMc4CGc32CdW6ljHOBjYx3eG57jWBkfHFmenN5bG1xdoNnZHxsY2ZnaFNfX1RnYGxvXF5ujmhNaWxgVVZTb2Zza2V4ZGVdWXB0bXJ7eHNtiHuAd5x7emxhZWxtXmBuamVweX5nWlZYYGt4e3tvg15iXmdWWWBYZJyIYmtxgYd9d2tqd2xbdnFreWl1cm1ve4ByWGptX1ldVmJkWGVxY1ReYWliYmxaYH5sZmtzdW5td3ZraIWMf4h6h21xZW97bHFsYlhfaGhvc4B0c15pbVNlcGVVYm5heWJwdXt1a29sal9YYWdodV1lVmJWU05ZZlNPXU9PSGVvXWNHWWlNSV9LWG1kX3hobn1kYFVeVF10W1RSYGZOXWFUU0pcWlFadXVdX2ZtaFhiYVtejnFjZ2p3cXNuaHZzeYNzgoN7iI1+fIqHjnpukIp0bHOCdH9/iIWHkoSVj3p9jI+IkZuEgHyMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH1+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo6Ojo6Ojo2NjY2NjY6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo2NjI2NjY6Pj4+Ojo6NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPi4xMTExL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERFQjEvMDAwMC5ccG5tbm5xSSwwMC8vLEmFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI8tGh0dHRwaaIaCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTUzHhwcHB0dG1NqZ2dnZ2s8GBwcHR0YO4OBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmHiIiIiIaNkJCQkJCQjIeHiIeHh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhoWDg4OEhISEiIqKioqJiYaCgoKCgoKEioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkpKRiYeOipCSk5CKkI2OjoWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6Ojo6Ojo+Pj4+OjY2NjY2NjY6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjIiIiImOiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCRjYiNiZCJi5CPj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkI+HjYyJj4aNj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+f35/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjISLjImNho+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8e319fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiIuOjI2Ljo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7e3x9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3p7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6e3t8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e318fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7fH1+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fn5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6Qj42KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJWVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlJOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTk5KSkpKTlJKTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkpKRkpKDkJOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpKSkpKLipKSjXqRkpKRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCRkoh3kZKEd4+RkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pi26KkXp1jJCPj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Oj4+KaICPdnWJj46Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjYlpd4x1dYaNjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHgGhtgXFzgYWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dXV2d3VoYGdgZGluZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoZl9rbGBqaGlnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN2eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpcY3RtZXFwZV1aWV9bWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent5dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVJocGxhcHVrVFBRVFBQTk5PTUtNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1OVGZsbmNvc3JXTk5OT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0ZCRUlNYWhrcXFvbllMTlJWUE9PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVBS09HSE5haGZwb2toY15jaFdISEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7Pj5AVF5ZXWhtaW5tbGpqbGxWRkJERUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7PDxFWWZpa29qbW1qamtsV0JGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dXNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozs8Tmlub2ttbGlpbFVAP0NGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojg3SWlvbXBua2tXPDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9PT08Smdyd3NsXD89PT4/QEFAPz9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXR0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9AO11uQD5ERT8+R1t5clRAPDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo7bXZIODs6PT5APWdcOTw9PDg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUTw9PUlMRUZ2dk03ODg6PD8/U1U5Oz08Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N5STtdf4N/eXx3Vjw9Pz0+P0JVWzo7PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFIcnlrYoKEg4KDgH1dPkBDQEA/PlpjPjs9QUVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEZvdH2CgoGDfn2FdUxBQ0VAPz9QcnZMP0NFSUpJSU1NS0VERkdIRkdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRWVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVxQkRFRENXdYeIiH9YR0hKTUxOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+fn19fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIpsQUFVdIeJh4eHiINXSExNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElISEdIRkZGSEpJSUlJSF1vb3FydHZ3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiINVbIWHhoaGh4iIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD0+QEFBQEJEPz4/REZIREVHSUpJSUhISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpVgYOEhIKChYaGg4KGhYSFhoaGh4iGinVJSUZCPz9APz8+PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTo/QUJAQUNDQkBBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTFNscHF0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf3+AflFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWWFhISEf4GCg4KDhISFhYaHiIiIiYmMjmZCQj44ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODg7Ozs9QDs5OTk9PD47Oz1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaoaEhIF+gYODg4KDhIaJiouMi4qJiouMiVQ6ODY1Njc2NjY0Njc2MzU2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JmhYOBgIGDg4ODg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2Ojk3NjY3NjU6OTo7Ojs4OTg5ODc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXd5e3p7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhISGiYqKiIeIiImKioyKiYmMej45ODg7PD0+OTo7Ozg5Ozk6Ozo5OTs6OT09PT47Ozw9Oj47OTs7PDs8PDk5PDg6Ojs6OTk5PD88PEFCRElKTUtJS0xXb3JzdXR2eHt7fHx7fX9/fn9+fX19fX5/f39+f39/f39/gH+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkFDRUVBQUFCPkBCQEA+PT0+QD8/P0A/QD09P0I/QUE/QUA9QEBAPj9BPT48Ozo7OTk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLi4qKi4qLXj5DR0lLSklGR0dERkhHRUJAQENFQ0JBQkNCP0BESERDRURFRUJGRUZERUZEQEI/PEA+PT9APj8/Pz4/Pj46Oz08YHFxdHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0RGWIWCg4SFhYaGh4mJiIeGhoaHiYmKi4yNjIyLioqIV0dMTU1LTklJS0lJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJAQUNCRENDRERDQD07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f3+AgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E/QkJHR0lZhYKDhYWGh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1PTkxOS0pMSklJSEpGREdISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA5ODw7Oz06P0A+P0BDRklJUF+Cg4WEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1yTlFPTkxMS0xKSEdFSklESkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJR0NCQUNVbnB1d3d5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDk6PDg9Pjs9QT4/QURISkxVcYOEhISFhYaHiIiIiIiHhoiIiIiJiYyMi4yMi4uLi4tfUlJQTU5NS0pHRkJHSkdMSkZLTktKSkpNTUxPUE5ISUtMT1FRUFFPT0pISkpNSkxGR0hHRkdIRkVFQkFCQlxvcnd4eXp5eXl6ent8fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxYVlJSVFJPTEtKREVGS09OT1dVUVBPUVNSTVNUT01STFBTVVZSU1FQTEpNTU1LTkdHSkZGSUpEREVFQkRDY3B1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHSEdHSEY+QEI9Pz09Qj9DQ0ZWTkZOT1BUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2hXVmthRVJRUVBJOztRU1JgdV1VVlRWWVlSWVhSWmZQVVdaXVJUV1FQTlJRUFBRS0xLSEhKSEVGSUlJSElpcnZ5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklJR0ZGRT8/QUFFQkNHRURFTFhSTVRVVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1E/QFZVWVxkYFZZYnJdXVZdWlZFUVlaW1lfVFpnUlZWWFVUVlRPT01KTEtJSUxNS09NU29zdnh5eHd6eXp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3lucFhaW1pSVFJWVlRaWnWDWVV9kGBcWF1fV0lWXV1bW19ZSVlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin9mWVlcWVNVVFdSUVdWY5aAUWVyWFpXX2dQYGZbW1hcZ2FHT1poZ1xbXF1dV1NOU1BQUVZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT01LZnlbXVRZVVZdWkxUWlRTVF5aWFdXV3prWFtbXF5UUVFQSU5PV1ZYW1pkcXN2dnR0dnh5eXt7fH19fX5/fX19fn19fn9/f4CAf39/gH5+e3h3dnN1e39/gIB0a35+a3J5XltWVVRST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmJh4aDh4eHeW1xVklLTU5LTUtISkRGSEVDPlRjVX9SUVFOS1JUUU1PWVFNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXG1ydXZ1dHR3e3p6e3t9e319fX59fX1+fX5/f39/f39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJWVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz9DQ0NDQj9EUEJDQEM+QkhHVkBITk1HXWlRSEZPRkRFRkhHSENESEdIS0dEQkFEQU9RTVNkc3R2dXN0dnp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT09MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgmxNRz4/Ozs+QEA/Pz5qUUthRUZISUVCP0dMTUdNUVVJQkU/Pzw9PD09Pz0/QUNDQD88PUI+Sk1HVW51dXVzdHZ4enx7fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXkpKUFFOS0xRUlFUVVRXUVFXVVBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZUNAQEI9OkJDQUFEQlxdT3tOT05OS0xNT09RTEtMV01IR0BBPDk3NzU5OT07Ozs4OTg5PztCSD9cc3R1dnV2eHp8fHx9fHx9fX1+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJSFBSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eX2VgXV5xdmteYGdrd29vbGpvbm5sZmJZSEZGSEJBR0lFRUZETVJPYVdSV1FQU1NSVVtPT1FXUE1JREY+Ojk2NTg3OTc5OjM2Njc5NTxCPWVzdHZ4d3l6e319fHx7fH19fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01MVFRTUVFVT0xSU1RXWFRUWFJMWFlaVlhYVlhZXVdYWGhza11WYXNrYWFfXmRhX15ZVVFNT05MSUhKS0lIRkNRUFNbV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NTc1Nzg1OTlHbXF0eHh6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1RWWFhZU1ZUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTFBSUk9NTU5OTkxKRlFQVVlTVE5KT09VU1RcVlJVU1JPTUxJSEhGPz49Ojc4NzY1OTk2NzY3NVdwcHN3eXp7fH19fX18fX18fX19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG9mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9JR09QT09NUkpPUFBQTk5PVExNSVBPU1RVMj1YTUlBUT1jYVFTUVBOUFFQTk5NUU5UUlBSTUlMS09RUFJSU1RRUk9MTEtMTEhDQkE9Ojo4NzY7QjQ1NjY6ZG9xdXd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVVFTRkZBRkdHSEZKREhKSEdFSExIS0lGTE1QTUcvRV9SPjNAPmpvYVJSUUBGVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PT08OT1HNjY3N0RtcHR2eXt7fHx9fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dXVllZVlFRUU9APjs9P0FCQUNAQkVEQUBHSEdIRkZISk1LRUdDT1JDOEVOU11mU1FTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydXl7e3t9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtucW1pbWNMT09NUVNMVFZUV1dVTExLST05ODc7P0A+PD1BQEI9PkVIR0NGRklHSkpARkFBQEZIRUpPSFBSYlxRUFJOU09PUExMT01LTUxNT05bV0tNUU9HSUhDSUpMTEpGRkZFP0JDPjxCRj9CP0FkcHR3e3p7e3x7enp3fHd5fX57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj47P0JAQD5BRElFQ0hHSUZJRUJCPz49Q0JBR0pFTU9iZVFNTk5XS0xNS0xNTU1MS05OU2RNSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES25vdnl5eXt7ent6d3R4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEtFP0I9OTk5Oj9CPzxAQkJBREVHS0ZDSElHR0hDQz9CPz9AQT5ERUNLTlFUTEpJTVRHSUlKTEpLTElKTE1PUFJQS0dDTEdDQkpKTE1PTUlKSUdDQ0NESEpNTElZcm13eXh6e3t5fHZycHVydHl5dnhqcW5rbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZXFISkNHSEhHSktJSktER0I9Pj06Ojo7QEI/PUJCQkNIRkpMSkRJSUZHR0NDO0FAQj5AQENEQ0lNUEdJS0dIS0RISUtNSEpMSElKS0pNXVJISERORkFDS0tNTVBOS01KS0ZHR0pNTlFOTGJtaXZ2d3t5e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkb0ZLREZFR0VGRkdFR0JDQD08PTk6OjpAQ0A+QkNERUlGSkpMRkhJR0ZGREI7QkNDPkBERENFR0xOSEtOSERIRUlMTk1ISUxHRkdJSUxOS0pIRU5JQkZNTE9NT01OTk1LSUhJT1JRUk5SZmZmcW9zeHV7enxsaGpuZmtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pDRUZFQkNCRUBEQj5APzo7Oz06PT5DQT5BQ0VHSkZJSEtIR0dHRkVDQD1FRUI+QkRDQ0VHSElHTVBKRkZHS05PS0ZISUZFREVJSkhLSUdIUEtESU1MUE1PTk9PTktKSE1SVVVST1dkYGFtZ3Byb3J5emdlaGhkaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJMSERFR0NCQEJEPUJBPkA9Ojo9Pzs+PkBCPkFCREdLRklGSUhGRkdFQ0NBQUZGQ0JDQkRFRUdHSEZMUUxJT0pKTExJR0hFRkVEQ0lJSEtKR0tSTUJOT01QT09PTk9PS0tLT1VXVlVUWF9eXGlhbWluaHJzYmVmZWRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWpzdW51dHNxcmprc01HR0ZIQkJAREU8QUBAQzw4OT0+OT88P0JAQEBERkhFSEZGSEdFRURDRUNESUZDRkVCRUdFRkdHRUpNS0hRTUpLSEhJRUZISUZDSUpJS01LUFNORFFSUFFSTk9NTlBNTE1TV1ZXWFZYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW96TUhHSEhCQkJGRTxAQkJEPDc6Pj06PjpAQj4/P0NFRkRGRERIRkRFQ0RFRUdKRUVKR0NHSEZIR0VDRkpKR01KTEtISkxGSUlLSEVLS0xMT09SVE9JU1VTUVNQUU1OUU5NUFdaVlpZVlpdWlhhYGBgXmhlY2BkZmhnaWloamZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN1bnByc3lOSUlHSURBQ0hFPEBFQkU9ODo+Pj08PEFCPT8+QUJGQ0VCQ0hFQ0VFRkdHR0lGSEtIQ0lIR0lIRkRIS0lHS0hNTEpLTEhMS01LSk5MT05QUlVWT0tVV1RRVFFSTE9RUE9UWVpaXFpZXF5eXmBjXlxhY2tiYGRnaHKFaGdqZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdU1JS0hKRkJFR0U8QEdDREA6PD5APz4/QkI8QD5BQUZDRURESUVGRUdFSEhGSEdJS0pGSkhIS0hGRkxISEhKR0xMTExMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW1xeX19hYGFkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd292SktMSkxHQkVERTxARkREQzs/P0FAQEBEQT9CP0FDSEJGRUZIRklGRkRJSEdJSEpNSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOTk5QS09QUlVYVk1OVFZUU1JRUExOVFNSV1teXl9dXWBfYGFhX2FjZWJjaGJkaWpndotsa2lnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2b3dLTUxMTUdDQ0FEPD9FRUVDPUFBQ0JCQ0VBQkRBQUVHQ0dIR0dGSkdDR0pHR0pGSUxISUpNS01MR0tJSEtLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAQ0FFRERGQkJFR0NDSUZDSEpKSUlLR0RLSkdISklJS0hKSk5MTkxJTEhKTEtaZkpkXEtsU0hPTl9uVWtzW3FwYndjUlBhdnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KS0pGQj9AQj89REVGRENDQkVFREZCRUZIQ0RKRUVKTE1LTExHR01JR0lLSEtLSUtKTkxNTUxMSUxNTFtzYmRwXmxtVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1Kcnl2a2Jga2VlbXhta3ZtbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEQEFCPz5CRkdCRkNFREVFRENISEdERUtHR0xNTktNTUdKTkhKS0pJTEtKSktMTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW92XFlsUVxtbVpxbWtvbXh4dHNpcFxfcmtxalV1eXhwY15rZmJncHBqaW9wcHJzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hFRUVCQkI9QEBGR0JHRElFRURCRklISEVHS0pHTU1OS01OR0xNSUxLSUpNSUpKSktPUE9OTUtOTUxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHRUZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSURFRUNBQjxCQEJGREdGTEhFQ0NIS0hIRkpMTEZOS0xTUkxHTExITkpISE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF5uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnNzdnNIS0hJQkVFRUFAPkNEQkdDSElNSUZDRkpMSUdGSk1MRk9KS1dSS0dLSkpOSUhKTElLSklISk1NTUxJS0tLU2tiWmleX2ljcnJaX1lqb19lZVVrX2NbYWFRYGxoXWpcb2ppZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRklERURGQUBBRUVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRkhIS01JSEpJS0tJSElHS0tMTEZIS0tMTExLSUtMTlRbXFRQVExQT05PT1ZRT09RTk9RSklOUFFlcmlUWVdcW1xVWVpdWF1cXGNmYWFlYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzSENFR0ZGQUVDP0NIREZHRElLTEhGREdLTEhER0hQS0xPS0xXTElGRUhJSkhJS0lMSkhGR0dJR0hJRUZMSUpLTkxJT1xXXlBcW2BeT1hZU1xcYl5NWVpNWGFSSllhWlNgZFxhWFtkZFZWWFxZWlhcVllcXWJeZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRUlFR0dGS0pLSEVFSkpKR0VISFBKTU1KTVNJSEZBSEZKSUtMSUxKSEZFSUdERkdFRUpIQ0pNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOXlxeU1teY15aXWBjYFlfYltgXltUWFdZXl1jYmNhY2ZpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNHR0VIR0hLSUlJREZLS0tGRklKTktOTEhMTkhIRj5HR0xJS0xKS0tJR0VJRENEREJHSkRASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV5eY2FgYmJiY2NlWlFZVlVcWl1jYF9fY2ViaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUJFSElGR0hIRkZKR0hGSEtJTERES0pNTUxMSEpKSEpHP0dGTkpLS01LS0tJR0dDREBEQUhJQj9JSkhPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU5eUU9cX2FjZGNjYlxkY2JkY2ZYUVVUUltYWmFfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0VLSkZGRkhHR0lGRkZJTEpORURLSkxOSkxJS0pISUZCSEhRTUtLT01LS0lIR0VEP0VDSUhBQUdGRVRdWV5YX1lfW11VWFhQXV1RS0pWXlheW11WWWBSUV9fYWJhYGJiYGNiYWRkYlhPUVFRW1NbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBR0ZER01SSENRSkZISEhFRktKTVBFR0lKS05MTElMS0lJR0RIS1FPTU1QTE1LS0hJQ0RBRURIR0JBR0VDV1VFXFReU1ZfWE5UVU5aW01KS1RgYVtfWF5eYV1PWWJcYGBfYmNiXWFiV19fVFBOT1BYUl1bW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREVGR0RJUmJQQ1ZeSUdHSERGTUpQUEVJSUtLTkxLS01MSkpHRUpNUVFOT1BNTkxOSEtBREFDREZEQ0FFRkJNSEJLTFBPTkxGTUZHSUpIR0xMTU9QSUxPUE9TUExRU1JVWllXWVhYZFdPU1RQUE5NT1VUW1lZW11cYGFkZWNnY2tscHNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHR1hNR0hKSEdNTFFRSUxLTEtOTlVOT0tLTEdHS1BUU05QT05PTk9IS0ZgRURfTERmY0VNW0leW3JtT01VbVlMQ1BgVWxXZ0pdV1VeRExRVUxNVFZRUlRYV1RYVVRcVVBmWmhoZFhTa1NWVlVbXFtgYGFhYWJgZmhmbmxocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09TSUtGYFRISk9KSU9NUlFLTUxMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUX9RSXxZWXJzWFBtSHFub2FWUHFxc1BDa3NtcXRwU29fW25YXVZcWFVraFVdVmNaYFlbYFZVV39qdHV1X192X1hhXFxmW19hYWFhXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1OQkRMTEZKTEZSVkxLTklLUlhXUU5PT01RVE5PUVBLS05HTVBTW1pUUVJPUFBQSkhaeF1UeGVoWVJUUXZndGxwYm5malFyT013bWpycHNycXJwb2+AXWZ6dXhxcXpxfnN9a3V9YlJnfGVzc29zcnt8b315b39yX2BgYmFaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpQTk1NSk5WXllVTFFTTllaTVNTUk5MT0lRUlRZV1dQVFBQUFFLSGd4bGN4cm1aS01VeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JSaXtsaWp6en1seHp/cGhvWHZ2anV1cIBgcmd9aWx4fG9eX19iYVtdYmRnaWpkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3V6bnx9eXhybk5LU3ROQ0JFUFBISktKTFFPT09NUFpgWlhLVFdQYV5SVlFZU0xPSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VEtoeH14YHl7c25hXm1vY1JncXVubXlwd2x2dHRxbG1cdH56a215fGt0bXxrcHZ1eF5fX2JeXV9kZGlnaGVlXmFiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0cm9tTExbVkhHRUdSUElMTUtMUVFRUFBRV1xZVU1VWVVmWFJSWV5UTU5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUtXa2h9bG1seGBbcHp7XmB6c2Nyb3hxaGV8aXJ8XVRLbGB2dWtpdnx7bX54a3xwXV5eYltfYmRkZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmxnbW1yfGttaGt7dG1ta21PSEpLSElJSFFQTE5PTEtTU1NPU1JXUlZUUFdbVlZUVFRhYFBOTktUU1NRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFhRTlBVVFhYWFtbVVJTV1tXWFdaT1NVV1dYUl1ZV11WVE9ZUldXV1hZXltncl5bW1lcXV9jWl9jY2RmZGNjYlpjY2ZmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0xMTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlYUE9MTVZUUU5VU05PTUxRUEtKUlJLUU1LS09SVVJRUVNTSUhMTk9RUlFRUVRWUlhXXFdTU1BRVVZWU1pRT1NSV1ZUWVZUWVVUUlVUVFRXWFddWl5hXVxaWlxcYGNcXWJjZGZkZWRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmVmbXNkaWhra2VkY2ZoUEpLTE9PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFRRUEtPV1NQTlVQTlFOS1NQTU9WVE5RTk1OUVRQVVFTVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXV1dZW1RPVFVYVVVaVVdZVVJSWFZVV1tZWl9dVVleXF5dXF1gYV5bYmJjZ2ZkZGJYX2FiXmBoZWZkYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FaWVhXWFpaWFlWXGpkVlhZWldWVFRQS09WVFBPVFBQUE5NUVFQUlhUUVFPTU9TVk5XUlRVVU9OTVFTVVVUVFJUWFZaXVxaVldRUldYVltbV1FUVlZWVllUV1hVU1JYVlVaXVldX15WXl1eYFxcYF9fX1piYmRoZ2RkYVliYGJeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFQVVxaWldbW1xZWltkcW1oZF9bWVZWWFJMTVZTTU5ST1FST0xQU1JVWlVTUFBMUFdWUldTU1NYTU9QUlRYVVVVU1VZWFteXVtbVlJPVVZWW1tXUlRXVldYVlRYW1RTUlpXVlxeWl5fYFVhXGFhXWBiYF1gXWNhY2doZGZgWWNgYV9fZWRfYGNbWlxbXFlaWFlXXFlcW2BeX1teXmFgX2JcWWBaUU5PTlZRUFRST1VUU1BXXF1cWF5cX1dcXmpxd3mAY1xbVlZZUU5PVlNOUVFQUlRSS1FUVFlaV1VPUk5TWFdUU1RSUlpPUVNTVltWVldUVlpYXV5cXF5WU05UVVZcXFZSVFZWWFlTVFlcVFNTXVhaXV5cYGBgVmJbY2JeYWNfXWJhYl9kZmlkZl5bZGBhYGFjZV9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVJRV1JUUFtdXl5bYFxgVVxdaWpyfXNsZ1xVWFdRT1JaU1JRVFJUVVRLUVdWW1paU09TUlZWVlRPVlJTWlJUVVRYXVdYWFNYXFheXVlaXVRVTlZXV19bWFJVVVlZWVVXWVtUU1ZeWV1dYF1iYl5ZYFtlYl9kZF9eY2NhXWVmaWRmXV5kYWBhYmNkX2JeWFpfW1xbWFhYWFdbWlxgXFtbXFtYWlteVl5ZXVBPT1JaUFpUVVZWVFRUXl5gX15iXGBVXV5ia3l1bX1sWlVZVVFRU1xUVVRVVFZZV0xSWlddWlxST1VTWFZWVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUldSWVhZX1paVFVWWllaV1hZXFZUWl5cXmBhX2RjXF5dXWVhYmZkXl9kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfYGFhYGNdX1RdX2JlZXaCe2hYWVlTVlNWXFdXV1ZWV11YUFVdWl5dXVRTWFNXVlRTVFhSU1ZUWFhYXV5YXVtWXV9YX19YXVZRWVRZWlphWVxVVlhbWltZWVpaWFZdXl9eY2JhZGRcYlxgZmFkZmRfYGRiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlNcVFZXWVdWXGBhYmNhY15fVltgZGFfenVvaFlcWlVXVVdbWllcWVhZYFdQVl5cYGFcVFVYUFVXVVNXVlJTVVdaWlxfXlpfXFZfX1pdXlleVlNZV1laXWJaXlZXW1xbXFtbWVpZWV5fYGBkYmNlZWJkWmJmY2dmZV5hYmBjXmNjaWRkZ19nXmJiY2FhYF5fWFRaWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNQVlpWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBrZmheXF1bVldYWVxcXF9bWVtiVlRYXl1hY1xSVllRV1ZXVldWVFZUWF1cXmBgXWFcV2FeW15cW15YVlhYW1tfYFxfWFldXF1dXlxaXFhbX2FeYGRjZGZmZmJZY2VlaGdkXmNgYGVjXWZpZGVpX2deY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlJXWVZXWlhbXFhXWV5gYmFlYWRhXV5ZYmNiX2FgYV5cXFxXV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBYV1hZWVdWWFZdXV5gYWBfYl5ZYV1dXlldXllYVldbXGBeXV9aWl5dXl5hXFtbWlxgYl5iZGNlZmVmYlpkZmdpZ2NfY15hZmRaaWliZmljZV5iYmNhYGBfXV1aV1tZWVhYWlhXWltaWVdYVlVbXV1dYGBiYnhMV1dcWVdcW1xdWldcXV9gYmRiYmFdYFhiY2JgY2FiXVtcW1hXW1xfXWBfXVtgZFxcWFpjZWNgUlxZT1hYWltaWldaWWBdYGJiYGFjX1xiXV9dW15eWVlVWF1eX2BfX1xaXl5gYmNcXFdcXmBiYmNlZGdlZWZkXGVmaGlmY2JiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVtZXFlYV1hZWFdcW1pXV1hQWFpdYWNmZnJrf0pZV11bWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBjY2JcW1taV1hpcWBcYF9dXGFjX15ZWWRlZGFTX1pRWVhcXVxbWltbY2BjYmNgYmRhYGNeYFxeXl9aWFZbX15dYWFfXVtgYWJlYl9dVFxgYGNkZGZkZ2ZlZmVeZWZoaGdkZGBbZmdeYWhoY2hoZmNgYmBjYl9fX11dXFpbWVhYWFZaVlxaWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3t7e3p7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7fHt6enp6enp7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmJiYyNjY2NjYuwwb6+vr7BooqMjIyMjYl+f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyNj5CQkJCQjrvOy8vMzM+qjZCQkJCSi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eXh4eHh3d3d3d3d3eHl5eXl5endvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH19fX19fXx8gIOCgoKCgoB8fX19fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCg4GCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dXV5dnZ2ent4e3h3dnh7eHl5en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t6enp6enl5eXl6enx7fHx8e3x8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx7e3t5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3eXx6e3h7enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3d8eXl7d3x5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en97eXt5fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5fHt5eXl5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKCgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4SEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZF90fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHd8e3t7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidX18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJycXBvcHFxcXN0c3NzcnFxcHBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoKBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4b3BwcnJycnFxcHBxcXFycnNzc3NxcXJwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm5ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3JycnGFc29vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBxcnJ6e3FxeJZxb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFycH6WcW+DnHJvcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFwdqR7bpCfdm9wcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXB2qohvmaF6b3FwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycHarlXGdon1wcnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzc3Nzc3N0equie56ifXJ0c3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn58dnZ3d3Z1eHp4eHh4eHh4eHiUsqWkq6d+e3t5enl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fn18fHx9f6amorKkqIt6e3t6eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX19fX6GqJyjq5qem35/f398fH2Ag4KAgH99fX18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgYCBgY2jk6Ctn6GfhH+AgYB+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f39/gYGAip6MlK6clpuHfX59fn9/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+f4ODgH6IpaKZn5uWnJSDhYmNhX+Af4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSkpCLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GEi5CWmKSupqKbnaCnqaGhoJKBf4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYKElKmwsKSdop2en6Gio5+SgoOCg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgoCClJ+fnZmhnZ2gn52dk4eHh4eHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKh4KCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgoGCjZSVl5+dnqGem5WIh4mIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZGPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEhISEiJOWnZeanpyShIOFhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4KCgoKCi5WXi5GcloSBgoCAgH+BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4F/gIB/h5KKj5KFgYODgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDipaIhIKEgoF+gomMgoKCgoSDgYGBgoKDg4KBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmYuDhYSEhIKAio6AgoKChIODgoOBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqEhIODg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgI+Mg4F/fn18fYycjYCCgYKCg4CPk4GCgoKCg4OBgYGCg4WDg4ODg4OEhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiISEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlZeJgH19fX17gZeMgIOBgYGBgpmZhIGCgYKCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqHg4ODhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICVn4p+foB9h4p+hISDhIKDg4OFjY2FgoKDg4KDg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUk5KSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhYWCgH59fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhoaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMi4iFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDipGDhIuFgoGBfn2Bh4aEgH5+f39/f3+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWGhoWFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhYWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6Fgn9/f39/f39+gICEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4aHhoaGhoeGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4mIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CBgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISEgYCAgISEf35+f4B/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4aHh4aHhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCMh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIOBgICBjImBgIGCgoGBgYGAf4B/f357eoCGiIiKiomJiYiJiYmJiouKiIiIiYmLi4qKiIeHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI6QjoqGhIaFg4GBgoGCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgYSEgoKCgoKCgoB/fn19fX1+fXx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYqJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoODhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX5+fn5+fn59fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeHiYiDg4SDhYSEhYWGiIiGhYOCgoOFh4aHhoaEgoKDhIKDhISCgYGBgYGDg4SDg5GSkI6PjouHhIaGg4KBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiYuKhoSGhIKGhoKChISDg4ODgoKBfn19f4B+fn5+fXx9fXx5fIOGhoeEg4GDg4SFhYWDg4WEhISEhISFhIKCgoKEhIGCg4OFhoWEgoKBgoKDg4WDhISFhISGhISEhYOCg4GCg4OEhYSHkpGPjY+MioWEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4F/f4GDg4ODg4KCf31+f4CAgX99fn59fX19e3p6foSEhIKBgYCBgYKCgX9+gYGBgoGDgYKBgoKCgYODgH+AgIKDgoCAgIGAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5+fn5/goODgoODg4J9fX5/gICBgH59fX19fn18enp6f4KCgX9/f39+f3+Afn2Af3+AgIF/gICBf39/gIF+fX1/gIGAf36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fX5/gH99f359foGDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gICAf39/fn59fn9+f4B/fn9/gH+BgH9+fn5/f359fH5/gH9+fn9/gH9/f3+AgH+Afn+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhISCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYKEhIGCgYODgoODgYB/fH5/f31+gH+Af36Bf3+BgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7gIB/gH9/f35+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f3+Af39+f3+AgH9+gH9/fn5+f39+fn59fHx9hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gYCBgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf3+Af4GAfn9/gH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KDg4WDgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXt6eXl5eXmAgoKChIOBgoKBf4GAgYGBg4KCg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIF/goJ/gYCBf4B/f4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4KCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgoGCg4GBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGhoeIh4eHhn99gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjISDhISEl5eDg4SBfX6BgoKBgYGCgYOGiIyFg4KCgYSChIOCg4WEhIWDgoSDgoODgoKCgoOCgoKSkIuIiYeJh4aGhIaFhYSEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeIiIaGh4eHhoeFf319fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fYGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhISEiJKPjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CAgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgoGDgoB+fX5+e4iRfHyOloB9fn+ChoqFg4OEgoGDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfXx+f4OEfHyBgoSCgH+Hg32DgX+CgoGDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIKCg4WDg4SFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9fH59fn99fX19fHx/gYF9ho+Bfn2Cfn5+gIJ8fIB/goCCgH59e4qCfYB/foGAgIGCgYKAgIGBgH+LlJCMi46OjYiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/f4B8eoGBeHuAgoGDhYSDhYWGh4SFgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIKAgX5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gZSSjYyNjo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgICAgH9/f317en2AgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoCBgICAf36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYODgIGBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY6NjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+ChIaGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIOAgIF9fn1+f36MhIGGfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn18fn9/fX6Afn9+hJKNjIyPjYuKhoSGhISEg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fnx7fHx8e3t6fX+AgISDgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaEgoSDgX+Afn+CgoJ/f4KCf4CLkI2MjI2LioiEhISDhISDg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gH+BgYB/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9e3x8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISCgYKBhYaFhoaGh4WBhJGPjYqKi4eIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/f39/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+fn58fHx8fH18fn57fHt8fHx8fXx9fH58fXx7e3t8ent8e3t9en1+fn+AgIOHiYmJiomKiYWIkY6MiImHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn2AgIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDg31+fn19fH19fXx9fnx9e318fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4eLi4uKiYyRj42KiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEg4GAgIGBgIF/gIGCgn9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3t5enl4eXt+f4ODhIeJioeJjpCNi4mJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf319gH58f3+Jg39+g5CEhIOBf359fI2HfX1+fX18f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiOjoqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKFhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX59gIKAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOBgICAg4F/gIGEgX5+gH9+foB+fX5+gIF/gX5/gH9+f4B/fX9/f39/gH5/f4B+fH18fH5+fn6Bf4B9goB8fYCAfXt9fX18fHx8fHt7e3x7fHx8fXyKioiIhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKEg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgYB9f39/gICBgICAf358fX19fX5+fYJ9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx6fHt8fYmHh4WFh4WEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIKAfn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+f3+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4OEhIWEhIOFg4GCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xeXh7eHl1dX2Cg4KDg4ODhYSFg4ODhISDg4SDgYB/gH+AgX59fX6Afn5+foB9fX98fX1+gH+AgICCgICBgIOCgH+AfoCBfoCBgIB/fn5+fn19f35+hYWBgYB/gIOBf36BgH9+f36Af359e3p7enx7eoKFgIOCgoKDgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgIB/f39/f3+Af4CBgoKCgX+Ag4J/f4OCf3+Af4F/gH98enx6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICBgICAgICBgYGCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fHx/fn+AfX9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYGEhIWEhISBg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2d3ZzdIaEhIWEgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF+fnx+f35+f4GCf4GBgoOHhYF/f35+gICBgYCAgICBgoGAgH6Agn9+gYKDgYGDgoODhYN/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAf39/f398f39/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+f3+AgIB/f4GCgIB/fYCBfn+AgoKAgYOChIWGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1/gICAf39/f3yAf3+BgIGAgH98gH9+fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn59f4F+foCCgX+Cg4KDhIeEgIB+fH18fHt8dXh5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgICAgICAe4B+gIB/gYCAf32Bf35+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDg4ODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWGhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH+AgIB8gH+Afn+BgH9/foF/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af319foCCf36AgH9+goSCgoOFhYKCfn19e3t8fHp3fHl3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB+gH99fXx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KBhIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGg4WDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoGAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBf4CAgICBgYGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgoGCg4B/goGEg4OEgYGDgYKDgYGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/f4CAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGCgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICDgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fX97eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIODhoODg4KChIGEg4GCgICCgYSBgoKBgoF/gYCAgoGCgYGCgoCBgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCg4WGhIKDg4OEgoSDgYOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SChIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhIGEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHyAgX98fH16enx+gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4OEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYKGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhIWFg4eGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeYN/f39+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fn99foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISFhIGDhIWDhIaEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN/g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgoKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1ud2xweWx1fX9/fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWHhoaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fnyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSCgX+BgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhISGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYWFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemtzfG52goGBfn5/fX16fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WFhISFh4aEhIWGhYV9d4aDhISCgYF9f357fHt+e3x8fX9+fXx+foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIaFhIWFg4aGhYaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH57fHx9f358fH59gH99f4B+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhoWFhYWDhoaFhoWFhoaFhISFhYOEh4WDgoOEg4SBfoCAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaEgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4OHg4SBgoSEg4KAgIB7e359fHx8fn18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WGhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWGhYSDhIODhIeBg4CCg4OCgoJ/gHt9fn18fHx+fXx9fXx+e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH17e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhISFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFhIaGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYOCgYSFgoN+gYGBf4OBf35+f31/fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFhoaHhoaFhoaGhYaHhIOEhYKBgoGAhIODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SGhoaGhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7e3t9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYWFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhYKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhIWFg4WEgYGDg39+f4B/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7fH19fX2AfX18fH2Af318hoOGhoaGhYOEg4aChYGBgH9/gIB+f4GCfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhYWFg4SDg4SChISAf4KCf31+f35+f4R+e399fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1+f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SFhYSBg4KDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7enp6eXp6ent8eXt9e3t+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt9fH2Bf4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEM6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU1NPU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT47QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fV1dXV1dXV1dXV1dXV1dbX19fX19fX19bW1tbW19ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE5AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzYRtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi60dTU1NTU1NTU1NTU1NXJu729vb29vb29vb29vrSKioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZNPDo6Nzc+Qz44Pjo/P0E9P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6Oip8/T0tLS0tLS0tLS0tLUv6iqqqqqqqqqqqqqqqybU1JTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX183OUisxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSko6jP09LS0tLS0tLS0tLS1MGpq6urq6urq6urq6uunVhXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNz1w5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamsz9PS0tLS0tLS09PT09XCra+vr6+vr6+vr6+vsaFiYWJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3FwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tTV1dXV1dXV1dTT09PU09LS0tLS0tLS0tLS09PRzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDdAQTw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7OztPU0M/Q1NLPz8/T0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXU1NTU1NTW1dbW1tbW1tbW1tfW1tjY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztCmksXTyJSn0tHHkqvRzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztKqnayUyZqsnLDRmayastLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q+QDk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DJl5mFpqeXiJyexJKGnZzOz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEI5NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0aSwvZeiwMmYmMW8yZeZxtDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhFQD9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Q1bmYptaUlp/O0ZKZoM7Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P0NGanbuzn8Ob2q2jv57V0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NWnpKDTzYqSnsfLiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NLAnaLI1c3bpZmz0NujmbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPUpKCPuMiPp5qgrZCnmJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HIxqa9lZSMp6WooK+noqmd0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg1MqOk5eQqKGSjbrVmpKOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGR0tIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLUwq+ws9LUucfV09O5yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dTW1tbS0tXU09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUtBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERJO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c251cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4uLe3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKinqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqalo6OioqKioaCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpyenZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaampqanp6afm5qboqCalpaVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Gfl5KTkpeanJqXl5eYm5qZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ+hn5eRkZCUl5qdmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoaCZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSko6KhoZ6cm5WTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojc4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6SkpKKhoZ6bmpmYmZmYmZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoaGfnpybm5qbm5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhn5+fnpyZmaKdm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCfoJ+foKCgoJ6bmZyxnpqbnJubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cnJydnp6dnJ2kop+cmpmjrJ6cnJycnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5ubnZyampubqaObmpqco4uenZ2dnJ2cnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJmbmqaimpmbnpd0npydnpydnJydnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ucnJyYmJmZmpmjnpmZm6GOZJudnZ+enp2enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZmZmJiYoZqXmpyjglyYoJ2enp6fn56dnZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmKKVlJuco3hakKKdnZ6en6Cfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiYl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eikY6dm6FxW4Wlnp6cm5uenZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqbm5ybmJmamJiZm5qaloySnY6ImZWcb2J2npaVkpGNkpGPlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCQj4uRj4uMj5CQkY6KiJaNfouKjnRoaYuIjIWHgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mHhIGGgoCCiZWQiXqKf4V2amSCgId9gIGSkIaEhIWNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgX1/c3yNjIR6i4SFc2pghop5fXyGjY2Lho2UkouQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouGiIaEiIiKhH+Cf3p7hod+d4eAgm9nW4KLgoSFio+LjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Ni4uHkoqHhpaIdmyBhX5oY1h/jo6KjYmJkI+Oj5SUmJCVnJqdnqiusq+wtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdNT19eXE5VVWJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmQnaCdk5eaoZqdnKKhlY+hi3NsfpiIZWBZgZGRjpGOi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkRQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqaeipaiprKqpr6CdppF8e4udmnJiX4eXlJefn6GknpuapKekqauurKWkqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uq6qspKGipamnp6ioqZyNeHuWjpZ4cG2TnZeeoaGop6Cioq6rq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9TZVxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKemqKmnqaikp6aZnaSmoqGgpKaKemZhjYOFY3Bzi52Wn5qZoqKgoJ+goaignJ6hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXFBVT1hPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaatp6acnaacemZWTn57eU5faniam5yZm5+eoJ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1tVWVFVV1tjXnNfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirr6moqqiioKGoqq6xs66roqGskmtRSkl3dG9FUWFrkKOdnZ+dnqSioqGgopiVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY21qaWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjoKKqqqevt7a1tbazrquvq4JcSENHcmlmQ0ZYZn6fmpyblqKnpaepn6ObnqGalp6knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtop2gqrK4vb28u7q/tK6xvJ5xUFdNRG9hX0hET2BvlZaTmpajq6i2raKjpKumpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odmxwaGlpYlpTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCxtLW2vMHIwLu9xrq5uLyNYVmOckNsYF9OUldaZpGflqKkqKeguqaqq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFpYGZ0b3RpdGRpZGJbTEs+Ojk4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHEx8PDub3D1NbHwMK8u7q6iFZ7wqpObm5nUVtkXVyIrKinrKKLlLWmq7S8sLW2qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBiX15rY2JueHV2bm1bYlJWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwtXg2sq1vLzAwJJQi8C/YX2CeV1KaXBTerO4qJyCb5awo6axtqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH6Ef2lmaGFrbGdudXFydXFnXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcS/w8LL29nKs8G8wMalVYKionCcj4V8RXeOVWursJR6Y3GrtKaqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8fnRrbG5kb21pcXhueWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExM3Pw724uL7Fr2N0e2uLt5KImVd7j11rkIVyYVqNt7WsrqWko6ikoJ+lmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5eXt3bmtpZ3VaZnJ4c3lmZl1kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTFy8Krqa2yt55wcW1cpLiQiJ1oZ3JoaGplXldopLq1s6ypoqGtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpnXWpvbnh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNzs/Mw8fGyMnIyMnHxcvLr5eZnJ2OdnBjYKqqjIuUcGBkZ2FdXFhVi7u8urysraaqu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aGlpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8LLy8jHzsObhoiDeWdfTWChmYeMi3NlYF5YV1hVZ7TJwLy+tLCwsMG+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVudGJdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8m8vMjHyc3Iw8jKtH5xal1RUEJcjIJ/gn1vZltYVFVVVInCwMC6ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVmY2pkYmptbm9eWV1WVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIyMPFxMDDwsGSXlJNSEtBVXZpbnNvaGddWFRWU2CpwLi5u7u+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFjY2NqYmdjW1paXFlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ys/Bu7/AvLvGr25JRkRIQE1kWWBnZmJoZFlTUluMv7+6t7u+ubW4tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWRhYmNoamZnaWVpXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1u8G4vrm/vLy3tLevrre1ub+7wteNur66w7W5x7ecYEFARTtKXFNYYWFgZ2hcUlN+tMW8wb+8xLe2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeXFtZWVmb2llbGhYWE5LS0tSSkxIRDk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vNDEdarLvce4ubett49QQEE4TFhTU11fXmVoXVNhocHIw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfGtucGdxa3NmYm1gXFRJS0pESkNDRz45Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8u8C3qq2krrC4u7K9vrvEtrW4tbe/vsS8wsTXrHKAvcjPwsC3rbWtfU8/OE1VUlNeYFthYl5VjLi9x8vHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHFmbGludG54Y2diXGNRS1RIRUVDR0I8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm8xsnKwsfJ0pZucq7S0czKxLW6v66CTDxMV09UX2BZWltWb7e9wMPMysfFxsC5vrzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9jXmBhTklNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8XQwrq+vMS+t7zAv8nPx8jKysGEcHKmzMzLzcrGwsLJvnVHR15QUlpiVlFSXKLCv8XAysnCw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3xgcWNbXl9fVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8t7u5rdvCvra+wL6+uqacqrO3xMCldnR3ncTGy8jBw8C/ycumbEtdUlBWZk5KWY/EwMDBv8rHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnpuc3hzaHBdW15dWVJGRENNSUFEPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vFtG2vzr22ucC8qn1uaG5tdIKYl3B3fJi+v8bAuL+8vcTDvKh0ZlhWY3BNW5DAxLy9v7/Dwr6+x7y8v7S0rrW1vL6/zs3LwreyuLe3vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV7cG5pW19fWVNQQUZIR0tARUNIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzbB1grS9tbXBpIZpWV5gTlNbXG9ydoKguLfCurO6t7q8vrq9sY1uZnSEb5m/xMK9u766uri1wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrq6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9mXVtUSj0/P0dGPUdDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsmlhHiMorC1nGpmZ1VZX0lJTVFUbHWHprC3vrmytbG7uLu1ucCvn3Z5mq29w8XDwLy/ubOusry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYlxeT0lCPz1JREZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/Gp4d7do2hl19TQ1lVSGJqVU5ESWSOoayvtrq1s7Gru7i4tLjBu7uCdZu3vMHGwr65ubWtpayzsaawraieoJ+lrba1wre2tKWoq6iwtrOyura7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3ZybmNdZ1hdXVNPTUE+SkJBSklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7OQgXmIj21NSkBlWUJQeIGTZ0xCXYKwtbO1srSvrLu5uLa5v8K3jXWErrW6u7i1srGtrJ+kpqedo6WdlpmZmp+prrmsq6ufpaikq66vp7Csr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWxdW2pUXVxQTkhERkxCRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7i1lYyIhXtXRUJRiFhJSlh4jYFhQFakubO0s7CxrbC5uLa7t7q+sayqpK6tuK6pqqyro6ihnZ2dl5ehlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVWFjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yu6mYmZRnTD9UeXFOSUlLaJ1+WEVYs7uxrLOvrqyttraytLWuqKKdm5ubnKennp+oqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKurn6aim6OclZCMj4+Qk5CXlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3pjd2xuXVFoVFBOR1BNTEJQUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3BqqW9ZkVToYRQV0lLX0lYi2BlZoSvtaqytK6qq6+wsrOtpZyQlpKOl5+eoaCco6SfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6empeaq6aqsaOlqJ6gnJWTkI+RkJiQlpWYl5+YnJmbpJmXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dn1ta3tkaFVSZE1KSEdPUk5KTkg8RUA8Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaCsxr/Lnk5BdZxuT21KTWNmdnRgXWJzkbKvrrO1qqasq6KbmZSNkJWWmJebn6Ghm52knpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGlopuYnq+orrKrpaqqoJuYmJiVk5aak5WVmpabl5eYoZ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3h8ZHl5YGJTVWBISUpLU1RJUlFNOT9CNjc8NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpcfGi1ZSS2ajWGZ9b3JbUWtjXGdiYGyRtLCwuKymoZydmpSXmpmPjZCVkYuNjZOZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKwtKqyrqOZnJ2eoZmbm5qYmZuUlpuWmZyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1paTVFKT09VTFNNQjc+Qjc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp+qo4t4VGpxd3ZvZHd2WFdiYGRpW1tWZ62urK+nn56ioJaQk5ugm5iXkZKfnKGjm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7itsrSkoJ2ln6yhoaKgoJqYlpafm5uYpKGgnqOhoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWp3dV1tWlFgSFJVSEZVVkpDTUc9S0g4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCjfm6CcGBjV0xbUlpMTFFZUkhPTUearKqppJ+fmZKRk5iYlpWVjIiKjpWdnJ2dnpaemqagoKilsaqnrqOrrrawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+np6Wkn52qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cm1pdm1obVxYXENXTkpHTUdDRk08Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKOem4hhV15lYFdNUUY9P0BDRD8+QlF3qa2pqqWfnp6io52enZqcm5STlJSdnZiUhZ2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsS9w7y3s6qzraqzta+zrqqvo52rp7ayraKwpqCjr7GusKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhoF7dHJra3RycWhWXFFGVElESlBJP0VBNEZIOTU8Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqgn5V8X15lYFBGRTtCPkY8Pjk2Tn6qs6ejo6GgnqWrpZ6XnJSRmZ2YlIyKhoiGeG2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr7HxsK3xMrJw8HGvrq1uru1u7ewtbKqurKuu7e/u7qruK2rqri6tbyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrY2hveGtlWltGS0xFRFNNREJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm5p9cmlhV05FPklafG9hQT1cjq6soJmbm56emZeXl5KMjpaXk46NkIuCg4J3cnFtcI+mra60ucW7zcfLv8LMzc3Mx8nRzM3Mx8nFxczQ0tXO08m9wL/Du8bFyMXR083T0NPTzMrCxcbGysjOv8jRzMfFx8XCvMPBv7+/tr6zrr/Aw8PHxMfErr+4sri8xMLCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MREVQSURDQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ2VaWZcVElEQD9Kh56kmIOgsq2jnpyfmpeWlJKUlpGQj4yHg4OIh4OAgYGAeXFyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fS19LV1tPUyMzGzM3J0s3O083FyMrKwcfMx8nIxr/Ds7PIxMvLy8/Hyr++v73Bx8XNzMjJwMO/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxBPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hm2FTTEpEQz9DVLHRvbKvppycnKCkoZ2alJOVlIl9d3BrZWJocW9xe4WKgHVwbnF0cIWzw77F0dDX1tbS1s7U1tfU09HT1NTTz9LD0NPW2NXW0svJztHLxs3SytLV1tnW19PX2M7Sys/RzM/QzNPQv8jHysTMzMzOz8XGx7a/yr/SzczQxsnIwMTDyM7N0NHPzcrIzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGRyYl1SXElKR0FFSUo+O0E4PTU1ODY7ODU6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoqBZSUBBREFGUXeyr6ealJefnJqgoJ6bnJmViXdpY2BfX2BfXl9fXWJsdXRwcG9scnF1ksTIxtTW19fX09bQ1dTa1NTOz9XU1NHRzNDN09fW09XQz9LT0cnT0cjQ19fY0dfS2NnU1szPz8rN0svO0MDGwsjGzs7R0dLIy83AyszG08/MzsjFysfHyMzK1NTR1c/SzNPCucWxpai1rqebqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNPzw+NDM6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpa63qKu319TV2dnRztC/vMzJtr6upqqooaOqZUM4PT5EWIKqqJ+XlZeZmpyfnZicnJJ9cGVjYl9fYV9eYWBfYGBfYGZtcHBua29yd3eczMHS1dPY2NbZ0dLS18/TzsvSzdXU0crPzNPW0tHWzc/V1dHF0dTK0NTV1s7S0NjY19fLyM7Eyc/MyszAycDIys3O0MvQzc7Mzs/Iy9DQy87KwsnHyczLzNLTzdPR0dDQyr3IubCuu7m1q7awrai4rbO+u7Gaj6CUkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1YRTtAPTMzPDw4Nzg2NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspayuvrSwwNjS19rc1s7NysPSz8HAsKmsramksXlIRkI7V46hm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBgYWBgYV5fX15cYm1yb29zdHZ2eaS/zNXR1tTT2NbOztPLzs7FzsrS0s/Hzs3N1MzO083L19bQzNHUy8zQ0tPKztHV0tXVysDKwsXMwsjJw8zDxcjKy8/Kzc3QztPMxsnPzcjHy8XGwcbKzM3Q0cbQzs7NzNDFx8G4ub3Dwr3DubKyvrG7w8O1qpiloZiWkpWVkouUjZqRlJSPj5WCiYZ5cXJrbWdgYHBoWVhoVk1HTElQUUI7Qz47Njg6ODo6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWvtKifrZd4bHBye5GajYyXlZCTkZGVlpWQi3xlYWJiYF1eYWNiYF9fYGFhYF9dW11ncnFxcnNwbXJ5pcfTz8vQ0NPUysXJycbGv8PFz87HxcfNytLIy87OxtHS0M3M1MrHy87Px8fP0svQz8a6xL/Gyb3Cx8nOxMLHwMfNyMTMyszPyMTE0MjGwsbIxL/Bx8zMzM/CysvJx8vQxMXHu8fDycnCz8G9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd290ZGtgXmZwYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vbnNzMbQ1dXZ2tvY0MnPz9HTyMK2u7uto7Z9aIOFpKuUjo2Wj4WDg4OBfYSEfnNfW15eXmBeYGNkY19cXV5fYGBfW1pcYWtycm9va2xvb3250cjJys/LzcS6wMO7u7q6vsnGwsPAw8jKycjKyMHFzMbIy83JxMLKycHBy9DFy8i/ucG7xse+v8bPy8O/w7vJx8m7yMfFysC+wsvGxcS+xr28wMPFzMXFvMDJw8XH0sXByb/KycbIxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhppujoJuVe3dydGZpWmFubVpcWFJETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+sa+2bF55faKRi5KWhnqAhYV/dnh1cnBfWltdYGBiY2RkZWRgW1xdXV9eYFtZWlxib3Jva2lscG9zj8e9ysXLwMbCsLa6srKzsrHCvLy8urjBwcHEvr25vb+5xMrFxsK9xsC4u8PJv8HJu7e7u8bDv7zBzcPGvr61wb3Du73Gu8O6s7zFxMLDt7+1tr6/u8zDvLW6yLq/vsvDwcbCxcnHycbQxsLMx7LHycPOzMHFw7+9srewsqeoqLmwpa2wqq2slHp2d2pkZ2Bob2NWXllKRkpFR0tBRUJGSkA5OjY0Nzg1NDs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1tfNys7FycXHwbnFvautpV9kdYSTi4iLhHh/hoZ/foR7dHRjXFxdXmBgYmNhYWRlYl1cW1xeXF5dWltcXmhzcW1nZ25vcnmdvczAw7rAuK2wsaeqraynuLS2tLOztLu1vrG2sLWvsrzCvMHEvMC7tbK6vsC4x7m0u7bBwr23vMbBw7y1rrK1ur+0xLe7tau4vb7AvbG6trC2urPFvLauu7+1t7TFvL7CxcDDxcbHy8XAxca7x8vAz8nHw8bBw7fDvb22ub7Hv6y1u7W3to55dHhnZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjKyMrJysTQzdLPzcXHwcbAv7q3ybaqsJhbaG+Kj4WIiXp4foaGd3eBfHNoXV1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaGZrbm5yfKTHwLi4tbCrraeeoqmnnqqss62qrKm0rrexs6mupqyzvLq2w7m6urGrtbm7s8K6sMCxvry8trzHucK3raqosLLAtri9sLGosbO1u7yrrrWmrravu7Kwqrmwrbuuu7i7wMC+ucO/xsPFwbzGwsjKuMXHxb/Hw8O6xMbCu8bJzMuzucK9u7OJc3Z2a2lhYmxoWVdXW0FMS01KRUFDP0ZBOjk6OTk1NzU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXPx83Bw8a/xMTDw8rCycq/wLzCurO0tcOuqbCRW2p/koeOj3t4fYmFenuEgHduXl1cXF1fYF9fZGNiZGNiYF9dWltaWl1aWllaXGVub2hmZ2lrbnKBrbqwta6lpKenmqCkoJqcpautpKiiq6qsq7Cjpp+qrbW2sb25r7ewqK64tLS8uLS8r7i5tbK8wLLAr6Woo6uxsrOovaqrqKusrbSzpqiuoaSvqbKmp6iupai3rbGyt7q6u7K8vr6+xL+1wsHHyLe+v8W3xMO/u7/Ewr7EyMzKv7/DwMCph3N0cmppXWFvY1dWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HLvrvJtr3DvrrKt8HDwbS2vLaxr7W7rairkmRtiIOHi4B6fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9eXVxaWFlbW1lYWlxfZmtmZGdlaGpvcoWqpaylnpyhpJSdpJuXkaGjqaOjn6Wmp6atoJ2cpKassrC2t6exraiqtau0ubG2tq62ubKwurqxtqWgpJ+msaerqLmqpKenqKeyraCnpp+bpKasnp+no6Chsa2trLK0s7Swtb22u8HAsrq+w8GxubnCs8G+wLW4vL2+vMLHxMPEv8DEoIN4cGxiZl9rb2BVWV5ITmdPVEdGS0Y8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9tqCelJ2hprq2q7Ozu7PEz8nLwsa4tsfAzL+4ybe7xbizxLizv8CstbyyrKWvs62ho5JpcoaFhoB8eHVzb21qamlwaV5gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dna21vh52pn5WVmqGWm6KYlY2eoaKnnKCfpKWip56bo5ugq7CtsbWkqaqqrKyktLitt7Css7Wus7WusKqfnp+jorKkpqm4raKmpqCorKuZoJ+emZ2fpZqZo5ybnrCpq6erq6ytsLK4r7i5urC2vLu6q7OyubO+tLaysba1v7a+wL3Dwru6vZeEenNrX2VeZGRYVFddSVdcS1BHSkpHQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vDw8++use4uL+3ssK0sbu8q7m6saKeqaunmJ6QbX6Fhn94cm1vbWtiXmFmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3GMqJyTlJSal5qhlpaQm6KhqJ6cnaWnoqWcoKGbma+urq+yoaWjrqunorWwsrKsqK+zp7qzpragop6co6Gto6Kqtqujo6aepaajlpmdl5mbnaCal52cnZytoqunpKOmrauys6q1sLKrsrm0r6qvsrKzuLOuqayusriwura6vcC4s7GUhXp1Zl5lXltZVlNaVUtbUUtJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+ynaWjmKWxwrW2va20uMLMyMa/xbbBwMbOt8DEvbO5ubO/trG5u6yytK+fmqSqoJSaj3h/g4R/eG9xdHFoZWNoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqGbk5OPlJaWn5eZlJegnqGclqChqaSfn6mdm5urp6+wq5ujpLiqoaCuqLaqp6etsaS4sKS3oKKbmZmqpqGarLmvoqGknKKfoJOUoZSWlpuYl5aXnJWfqp6ppKKdo6qqsK2otKuqp62zsKWrrrOxsLCur6eoqLKtsbSwvLS6uK6jlIF6dmReYVZZWFNSU0tNXkxPS0dHTExFPUE+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp2np6Kqu8C9wLmutLjBzMfFwsO9xbjIy7LBwsGtvLu1u7y1ubmwr7CqnJmhqZSRiouAgHx3cWlscnRwaGhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmNkZmmBlZKUi5GTlJqYnJWWnKCcn5agn6empKann52gpqCqr6afoqO3qKGhoqizoqWopbClsK6stJ6hnZWVqaGilK2xsZ+jo52emJuTi6GUkZOYmJOXl5mXnqecp6GimqSlpaukpbCnpaOrq62mqa6vr6uoqqqzpqasr7Sxrry1sa+voJJ6d3JlYVxaXVhOTFFHUWFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepaasuLu8wcW6sbm1xMnJwMPGxce2xcSywr/Fq7e3vba9urq1squtqJmYn6OLiXSJiH52bmNhZmloZmdpZmptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVVJUUlVgYF9gYV9hYWNlaYCSkoiQjpOSk5yUlZajmaCXnaCloq2mpaWjpKOdqqulmp+lsaqgoZ6lqp6oop6trKmprq2ioqKVl6KbnJCrqbCcn6KfnpeZk4qekY2Sk5aQmJiTnKGjnaShopWgoaSlm6OrpaKkqqOrrqWusqmmpaamtKapqK2ztbS5urCqrJ6McnBvYFtXVlVSRlFOSFlbT1JJVEtTTEVGSUQ4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm8sb7DyKyxuMG1vMC7tLSqrKaVmpuciIFyiIN7dGlpamxnamtta2psZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSUk5RWV1cXV1eX19fYmRtjY6DkIaPkI6Zk5SSnJqjnJuhqamrqKynqaakmaWvpZWZpa+poJyZm6Cer5mcq7Ogpaafo6ShlJOblpaSqaqtmpyfoaCblJCMmY6MkYySjZaVkJ6ioKOdm6OVm6CjoZehqKOjqKugq7Ckrbemo6SirK2qqKuvs7ezvrWzq6+YhXRzaFtYWVNVUkVYTFFbWE1UTlBMUFFJTklCPT8/QT89NzU3OTk8PDk3Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7auqKivrpupqKy3tqy8yru2v6zLxsW4wc7PyLPEure7wsiwrbi/t7y9u7O1pamglpeYl4d6dIB2d25taG1tbXBnZ2lmZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXV1cXl9gZH2LgIp+io+Jko2XkZeZoqCboKuqpq+sqLClqZqfraCVlqSpp52YkI+anq6XmKiqmZ+dlKWhnpKRkpGTlaeqpZqZmZ6elo2Mi5OGiI2Dj4uSlZGgnqGkmJWflZqhop6Um6WlqKiooLGwprG9qJ+jrLSqrqewtbC5tcCxrrGqkX5yc2JWVFVOUkpHVlBSUUxMV01KTE5SR01LQUNGREM+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OspbG3qqWisaudqqepsrGktsa0ubqzysW5usHL0Mqxtre8vcHDsa+xt620tLuztKKjnJ2Xl5SDgHZrZ2xucW5xanBrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqf3l/dIiMhpCJl4mUk5ibmJ6pm6CrpqasnqiaoKack4+fo5qXl4WEkpujkJWjnZaWloiim5uTi46KkJqkp5yVlZebkZKHlI6LgYuOgJCLkpKSoJqgopaUmJiVoqaZjZmkpqimoaC0sqeyt6Gcorasqa2ksrKmtby1q6uxo4l5c25dTlFRTE9DTU5OUEtGTk5KSk1OUUhNSkFHS0hIQz44NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS2sKWnpKqloKimpbOqorLDtbWys8bGtrrDyszGs6y5vbS3wK+tqbCepq66r66fmZqdlZSHe4NuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFtdYW5xdW+Dh4GIgJGEjoqUkZOeoY+bnKOipJmll6KclY2HmZqMc42Dfo6XloaRmpCUjo57mY+djIKJf4qYn6OekJOYloWNgpR+fnOJjnqQh5OQkJybmpqRlpCdjqOjjomaoKGjpJuitK+sr62fmKW4pqaxobCunLC8qqmvqpmDd3NjVk1ST1BOQ1NOTFBMQlBRSElNUk1ISkpESkxGSks9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMDI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKmmpaijpqWmpqazp6W0wbiwtLDJxLe5wc7GvbOsusGsrcOtp6Gmkp2mtqyjoI+VlpKPfnh+ZldWX2dmaWdobmNqaGdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVZZW11panFrfoR7c05Yco+Cl4aNnJeLlJGfmJ2VlJaVj5aJgJSJXztWb3yMlImAjJKMkIaGc4qFl4F5gXuGk52Tg5WOkZCDhn2TeHFwhYx9iYGRjY+XmpiTi5CJnYifmIeIlp6aoaCXp66praionpets6KmrZmsq5iotKKpraOTfnRuX1tOU1JXTERUSlBMTEZOT0lFTFFNS09KSUxQRklJPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego66hpqaqoKepp6OpsKintMK5sLWwx8K3s73Pv7mvrrXCp6rFqaOdmIOUnLGimpiGlI+Lh31zdV1QTFFVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYGxuaHqBdE9CP3+VkpF9iJSNhIqNm46WlYmSiIaVhnmJf2BKUW54i5KEfYSNioV/f25+f5R4dXZ4hI2Zb1GNiIqGe354lHZnd4aIfoqJlouOkZKWjIOJiJWEm42ChJKalp6dlKSjqKmlpJ6bsKqhpKSRpqqWoqqcoqaoiXVtZl5bSFFRU01JVU1TSUxLT0lIRkpOTE1US1FQT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2nKOnnZ+hr6GnqKWnqK+tqrW8tre3s8G7tqi6yLi2qKi1tqqyvaaelY1/iZOolpWKfo6Dgn14cG5YTUtNTU5MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3N1fmloXFSPiZSJdH+GgXyFjJOCkpqLj3uGj4B2gHhzb3ZwdI6OgXp+iquEeXtodnuOcHJteIGLjZJ4eoB7gHZzcpJ3aHWEhISFe5WKiIqNioB/hIuNgJSEfICPmJSclpGfnamen6CdoKmlnp2YjKekkqCglp6fpIByaGFdXUpXUFJIS1hST0pMTVJKSkpMUEhMUUxSVE1FSEE8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc6ODc3NTo8Ozd2rpmjoZicn7Spr6mlraywsaq9tLK7uLa6tLGft7qyqp2drKmosrChmpGNlIGOnI6Rf3aGeHx2b29pWEtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnSCe3hmdo2WmI2OfWd5gXZ4gImQfYSYkoFxh498d3tva36tfXSQi397hpKBfH91ZnZ8hWxvZ3N8iYyHgGx5cX1xbXaPcWhxgX6OcEOLhIKDhX93d3qMhn2Me3V9jpKPmIuSmpujlpmdmp2eoZyWjYqkm46el46WmJB3b21mYlpYWFVRSlNVVE9QTlBWS05LTk9KUU9ITlBMRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKavrK6rqKmxr7GrvLisu764s6ynm7CnrJuPlpylqaSgl5mPhZJ5iI6LinVxe211cGptalhLRkdFQUBDREhMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTk9RVFhdZXBybIinqsB+dHlie3hvfHmJkHp9i4ZvbYySeXR5amqAgnGWkYuBfpaASZKYbmh4foJtaWRseYWQkoZrc2x8bnJ8hmlucH9zjImEhnt9fnt2b3R0hYJ5gXlwfI6MipODlpeYmpCSlpeZl52WjIOJnpGLko2GkJaAbmlvb29YVlhUUlFZT1JUVFJYVUxOSE1KTU5LQ0hNR0VAOjg5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrbCjraqota+urLS/q7zDv6WimZWkl56NhIuUoaGZmJGTi3OOeoCGjIZ0b3RrcGxkbGpZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXF+niGKaaXN5ZX5wbX96i4l2goiGdGyaknRzfGpqnY9NeYWTiYSOZzF2hnNsfn6DdGZldX+EhIWAZmlsdWtxf3xocXF8bpKNj3xzfXxxcG51bYJ+d3l1anmIgoiJg5aSkpCLjZGUlI6XjYB5iJeIhoqGgJCId2trb2hlWFFaV1lZW01QVVZZWE5ISEVKSkhHQkBHRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw0Nzc1NDc4aU84OzVukoiakZmWo6iunrKep7qvq7KwwrG7w8ealo+UmYuOhnmEkJiUjZCMj4Zxh4J0h4yGeXBycG9vZHBmX1RGSUM/PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHF7eGx9bHGDgoWBeoSGhnlyoZV0eIBzdZSHNXGdqJ2OoaGEooR2cYZ8h3x0jK2OiYBnZ2JqbnJtcIN1aXBYdXCOm5J3bH96fW1ybnCAe3N2bmJ2g3+GgIWQkIqKiZGLkYyLjoN1eIqOgH6DgH2Pe3JwcGxgW11eXFlYYF9STltaWFdMSElGSkc+QkFCSD9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp56vlaW0qa6xrsGyu8HGlpCMlI+AiH1ugZCSiYOKh4+GdYKEbJWIiHt0eHhsd253Y2leSlBHPkA3NDQ5Ozs7PT5AQkVITExMTE5QUVJUVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx3iIh8foWDf4x+daKZeX6GgYWZhJqcYYaqn52Lg5CNeneIfomIjnOKl4+Del1kcnR6fHeKbWhqYnlvhpCCem6Bd3SEenB0eXhrbmlddod8h3yHh45/ipKXg42FjIZ9cYR/g311d3t8iXdwc3RmZ2BbW15UXGZeV1BUWFtVR0pLREtHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIyRnZ2fppGgqqCxqK/AsbrFupaOkZSHeoV2a3+MkYJ9ioSPjHiDgHOghIp8fIF/cIB+emd2a1JXTEBFMjExMzY3Njg4Ojw+QUVHRkdKS01PUVFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmiEiHuJeXxxfI+Men2Jh36Xh3ahmYiHj5KUpY2sqkiGrq+vi4GAk4qCi4KEkqmHgJiYipt0bX2Bhod9jmhnaHl/boaHgoVxhIZHbIB3cnl2aG1rX3Z9goh/h4SLeZSdnImLiJF/enWLdnx4bW93fX90dHJsW15dW2NjWGdlXFVQUFZZUERMS0ZOSUNGQ0NAQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fomFiJGOlpeSl6CdrKGmuK+zvLOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9Pj9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWHBZXF5pjZOHlYCEgoWRk36FiJGBmpWCoaGYlZubpq2Tmruxp7vHw6iLjKGlj5SJgZF8cYOen5Gcf3aFhYuQiJBpaG+DgHWNh4SLcYWCd4d/e3aFfW52dWaAlI6GiYiHiIehq6KWiY6Yf3qCiXp5b2dreH56fnNsZV5aW11qXWFmX1lPS05XUlFJUEpETkdDSkRCQUREQTs6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZniDe4CMf4GQjoqam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH6ShZKVf4qAkpuOg4CBjIqCiY2Df4l/bXBqXUJANC0tLy8uLzAyMjM0Nzc4Oz0/QkRISk5RUlNSU1NUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WX2N/Z2dtdZ2bj5qSk4uNjpqIko+di6CgkqOqpaOsk6m2oqjBw67Hr3i6lJp8jaGemYSThYKPoZ+TmJKEi4WPmpGWbHB1iYuCloyNj3ePhHFthYGKlpGDhYhyiKCWhpKJjo+WpLWpm42VooOHk4N9f2tqa3yAgYJzYl5kX1tna1xsbF5XS0dPUlFOTExGSVBDRE1GQUNFRkI9Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NDU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwgnB1hnF2koZ+l5aalZ6enKegqZaTmJ5nZaSafoSSkXl/koiRkn2KhJiSkYKAgIuMiYaQhoSIhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ2Nzs/Q0VOUFJUUFBRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZynpaKZoZeilJyep56oq5+orKmqtpervqu2yMi3ydHPvpugcGmrqZ+Ek5KFnKGam5mnkZGJlqKamnd6fpSYkqGSlpiBlJ57d5WSq7KIjZeffZSdm46SlZikoqa1sJ2RmaiIlo+NgYhsc3J8f31xaF9dYV9hZ2RgZ2ZbUUVKS1BPSUlMRkZMQ0hMRkZDQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHVgbnxhd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJi4qEkoWDhomBgIZ2XmJQNDYwLTEvLC4wMC8vLi4wMDE1PkFBTVFSU1FSU1RSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpOT1FZbYWQd5WKo6eqtL24pK6srKeotKuwtrKyrbuxs72cs8Osu8nLt8O/uKWjsLKsraqji5aYhaamoKOXgaaZjaKrqKSIhZSkoaCqoKSpj5yxi5Wjp7e6m6CjsJKinaOekKOhq6+ssrWilKSqiJmJkoqVeXp9hX9oYWhcZWJdZGNeZ2ZfWk9ESUhTTkZITEZKR0VGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pvWHqFdoGThYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5COg4WBjIWGh5KGgoSJhoiHh3BuYUBFNjQ8Mi8xMTAtLCstMS4tMz9DQU1VUVJTVVVWVU5bUEdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GSoISuo7OqssDHw6qzxbass7+zuL62v7TBtru6o7jFqLbJx7W+ubSoo7StsbGbmpKan4mnr6ullHafpJehrLKzmJaqraiutruyuqyvtaKxrLG1u7e1rrWgp6ejqJqpr62yube4p5u2qYyljpGTn4Z4goN1WmJkVmZhYWNfYGZfW1RJRERMVVFISUpESUdFQUBASkRCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWlFiY1d5dXGBlH2EhpJ1hX+AjHu/u6O8grSUk42bj4SIj5KJiHmGgIySjIeFgY5/gYmOhoCGiYWKh5F6eG5dVkBFTTw2OjQ2QUI3NjQvLzZDSENRXE9RVVdVXFZPXlVJS0pBQD5HS0ZFRDs+QDdENz9CSkpFRldUUF6PpK2jsbTCtrjBzMm2u8S9s7PAt7fBtb6vt3Sxs6W6xaOwxrmxs7G0qKS1tqqxoKKWmqKSpbCtpq2rp6SYoKy0u6Kpsrq0u77Mv8XFvb2zwre6uL63ure5rKywprCqrb2wvbvCwqyZuqiUro+XmKuJfYJ9a1djYllqZWplV1tjWVZTSUdGTFFHQ0hJQUhEPj9CQktAQE1DOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldTWVVadmpwfo6EgY2DbnpzeYdiuKGZo4mVk5aTlJONkJaSh4Z7hoGNlYqBhIGKenyKh4Z8ioOBioOVfXd5dWVPXGRHRUw6UWNhW15TRj87SFBEW2NRUllYWmdZVGBgTVNQRUE/SUpIRUZBQEM8RTZCPkhHSkxTWlRdk6+4tbq4yb+6vcnMu7zAvLe1u7u2vbS6scZgdbKlsZqeqr2qpairqqOisrWhq6ielZafmZ+upaempZ+jlKKnsbSnsrO9tsG+08nJ08bCxczCysPAvr2/u7y3tK+4t7bDusa9w8iwnrmpoauOpKe2iYB/cmBiYl5YYV9pZ1JYYFZRVUlFRU5LQT5HRD1LQT1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUktRXWdsa3CPjYWPc2xycnOH1cC1maCNlZiZkY6XkpaWjoaHfYaDjJaLf4N/g3h7i4OHe4t5gYqCl390fXprZXB1WV1cUGVlYmBlZF1bWFdcTWVtVVJtbV9uX1hnZVVZVUpEQktLSEZISEhHQkk5RD9IS1RUVlxaW5K5wLi9t8bAu7nKyrq2ura4ubK3tbSutraZZHWonK1wXqGtnJigopuknqqllKCfkJSOlpiXqJ+ln56amoOknaylqrCtt7C9udTRz9fPyczSzM/OysbAv8LKvcG8wcDExMXKv8jOs6S7sLSvm6u4vJl/emxeYVxZXWFaY2NRXGBTUEtDQkVGRTxART5BSEFARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUVxZaF9vl5KQlG5sb3V1h7OsoaGfi5mcmYyNlZGbkoWKin6IhoyQi4h8gYRze4qDhXuJdIGJhpV/c3t4a211e2hyZWlsaWZqaWhgZmlobFpudJatpLyIh2dbb2hdWlpUSEtOT0pLUEtTUUhMQUpGS1BfXmJmaWKYt8ewuLO7vbWxxMa1sLmwsLursrGnqresjbWnnZunmk+anYyOn5WRppillYqTk4mQiY+RkZ6boZealZaGnpqnm6yvqLCns7TU1NTW0svQ1NXN08/NxcLJ0L7KycrJ0cfMzcLQ0riww7zEuaW2usOigm9kXV1eWWBYWWVaUV1XT09CQkdEQkg7QUM+QUc/P0E4O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VWc5CQmIJocW95eYOgqp6ll4ybm5eLjZWRmo59iYuEjoqKi5CHe4SCcH+IgYZ7h3KDkYuPfXF4dWtxeH5xe214c2xpgXBtY2ltcHhpd3x+y7/C36duY3dvY1thYEpQUlVOWV5QXVxOUE5UUVVUW25tdoJxlq24rLOnsLaqrLzAsKu1pqS4pquuoKu0o46xrZqYmIyRk5GEjpuBjaaRnImDi4SKiYSLg5OVl5aTm5GcmJmZn56rrKSnoqytz9LV0c3M0tPT0NTRzsjD1NHHzdLT09fN0tHF0tbFwM7Hx8KovrfPnnpvZl5iXldfU11aT1BUUE5IPkBGQUJFPEBCPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1OW3WGhYp3bHdwfX5/oZ6eoIuMmZOTjIuTj5aEeYWPkI2LioiRh3+Ce3J+gIGHeYR1hZKRiX9vdnJrc3x8d3tzgXdxa4BzcmlwcXp5cnq+y5p+jLKEdnKEd2hhal1DWlpbVmVjWGRqU1hdXGBkXmN3en6LgZmppKShn6CopaqwuKqltKOhraGjraGnsZ+JppqTkpGJkY+IgZSJapWijJmEgIV9kYODk5ati5WNlZqOhpKRnZensKGgoaWkqMjOz8jCy9HU0dTTztPNxtbTzNTY1tbY1NfVydTazcnX19HKrMPDy4xzb2NgX1hUWVNcUEtHSkpKQDs6O0RBRDxCQz5IQj5CQjs7OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJ2VnZSFi5aJj4qIjoePf3eDk5mKjYiIi4l+g3hze32DiHd/eoeRloCDbnhwbXV/dnh9dIV8eW2HdnRufXaEdXh8nbWMPEGLxaV+jHxpZVZJQ2ZjZWNnamRueFtfZmhrbmlugIOIkYudnqCdkJeYn6OkprKjpLOgoaWdoKmgorGchp6SkpKQi46LhoOPhH6cm4yNg4SFepR+gqmVo4ySipeSi32XipqRq7OYmpunnKe9w8a5tsbN0tDS0MvSy8nUztHV2tfX2NTZ2M3Y287J2trS1b7LzLR4d29lXVpSVlFaV0ZHSklFRT06NzlAQUI5R0RARUNBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUa25ucGJwcXSGjXyXkZ2LfoeSgomGhYmBh3x4hZaWiI+Dh4WHeoR5cXp7hIZ1eoWOjZx6jHB8b296f3F8gXGDh4Bujnp1d318gnV/e4aHsHRYqcK2jZGCcG5iPV5ocnBxcG54doFlaW9ydXhxeouHjpORm5WglYeMk5ugm5+qn6CtnKGamZ+lnp+rmYuajJCRjYR9iIeDhYuOn5mTiISHfm2ZeYSYhoiTjI2UjIZ7m4iUj66qlJWXn5mnrrW9qa29xsvIyczLz8nD0crU19nX2NfU29fT2dvWz9va0dbJ1MuVentpaFxaUFNUXUhDRUlIPkE9PTc6PT87PUc9P0FBQURBPj46ODZEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OjpEP0NHUmtfbWRiZmt2gIhxkZCagHqAjX6CgoGEfoN8fISYjoeLfoaGgHeCeW57e4aBdXqSno2gdo51gnR1gX10gIRvgY+Bb5KEdHyAhXp2hnuJt8alwsm4gpabj3dwZU5mY4F6gXeGopCKeHl2e4N/e4R1bZOWlJWPl5CDiY+XmpeWpZyXoJefkpKXo52Zq5WQkIqNkYKMhYmIgYaQkZ6cmYmFi4GGmHqIiJ+Xj4iNioyCfKGJkIu8oZiTl5qcqaalrp+otr/AwLnHyc3Oxc3K0dbV1dnV19vU19na29fb2trYztzGh3x6aGllYFRYVlVNTEROQzs9PDw5Ojw+OT1ANj0/QDw/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eop7foB+f3yFe36BkYmEhXqEh3t1fXRtfH2GfnN+kp2RnoORfIZ+eI59eYqKboKagHSYhX2BiIV7fZB6j6mOj8OgvIyco5x9iYR9iXKMin5zppqcmJOFe46QiIRoR3CgpJ2Mi5CShYmKkZKVj5yakpSRlo2LlZ+dlKCUkY2NkIt+kI6Oi4SJkpaan5+JjJSSnZGCi3+lmYiEjYOFhIGlh4uLuJidkZSWoqehnZ6do6+2urWswMXK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbuHl5eW1qZldgXFRQT0hDTEI9PT45OTo6OTk7PDY/Pj48PTk6OzszN0Q/ODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmBjopxcnmKe3p/fH97iHp8e4uHgn51g4V5c3pzbYB+hH13hZuhm52UkoCLiH+Yh4Cbkm6HqIV6oIt8kY6CiIOcfZqRioyjop+QpK6gi5GLhYuBkoZXcq2Ln6ubj4OYm4+PjVuCopGCjJ+TlYyHiIySkoyUlJSPjI+Kh5abnY+VlpGLkpOFgIuIko2Kip2WmaKihpKdlqCKiYiNnJCDiI9/g4eFpIaMkLOYnZKUl6GhnpmSnJ2nsrispr3Cx87Hxs/M0MzO19DR1K7W1dja2Nra19bZ2Z9xfnVoZ15dWFRXWENASEM+Pj46NDk6Ozc6OzozOzs/PD43Ozk6MTpIPjozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieG1ifpKDb213i3h5f3qBfIZ7e3eGhH9zcIWCenV2dnSEg4V9f5Kmo5+lopaJnY+Ul4uKqJdyirGMhKeRhJmThZmMopagmJOJm52ikqmvn5GUkI2OiJWLbo23hZrEyLKcoaWbnJiWkLKQZKTNx5aPhoeJj5KOjZOUiYWKiYWWmpuPkJSThpSXg3+Pi5mIjZCql5ejo4iZnpebiI+Hl5eKhI6MgX+Hj6WJjZOpmpeTlpmhmZ+Zk52borO0paO8wL7IxcXJyMnCytPNzdSp0tHW1tbY2tTT2s+Dc4BpZF9eXk5LVFpCQUdDO0E9ODM3Ozw6OD02NDk6PDo4Mj85OjI6STo9NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdYKOfHxsfYh4en56gYGDfnZ2gIN8bG6Lf3l8eHh8hIeLfYqjs6ejqrKhlqefpaSWla6ig5C3lZKzmY2hoIykm6+ipJ2YkKeWqJmtr6SXlJaUkIuYmZagwI6jybirmqKmrZiRmpyynYaFqKKcmIWIiY6VjYuTjoiBhoeIkpiUjIuTk4aUmIaDkZCcdJGZspaXpKGInJqTj4qQi5eaiYqWjoZ9jJifipCQnJqZk5iYn5SgnZWfm6GxrqOkt720xcfEvcPDv8bOysnSp87N09LQ1tjSz9i7c3t3XmFWYVdRSUlPRUFCRTU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTw1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1Njc9OkpGREdOW1xZSWZgO0iEi3p6bYWGenyEeICFgH1weHx9fG9yjXp9gXt4houJhYOSp7utqLK9r6Sts7Ooo6KwrIqatJ2juKSVrKSWqa23pqSjn5mpl6mjr7CqmpiclJWRl5+Xmbu7rcmgaba4q7CUmJ6jq5KXvaNeqrKCiYqNlIeRfI6OfYOGjY+UlYiHkpaLj5WNioyXmJKdmrOWlauei5uUko2QkoyZm4qSnpCLiZWfoo2VjZianZOcmZ6UoaCUnJylr6iipbO3q8LIxLW6vbvFyMfC0aHGyc3NxNbW0MvUonF8aV5bVF9SUEZEPjxDQUE4Pzg3ND5GPDw2PDM1MzU1NDU0QjM6OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGVHYmBicElAi4p/gXOGh32BiHWCioN/bX19fH9wd4Z3jYGHe42PjIaMmarCwK+9xruytMG8tK2rs7aMqLKurr2qm7ukqK25t6umpqKio6Opr7Kxqp2cpJial5eeoqWlkqO5rqi/u6ytsrmlo6Z9iIacrb2wg4uMi5CDj4ORj3qBh5CMjpyIiI+XjYuVl5SRmpadp5qxmpGrnY6Zj5KOlZCQlpeOkaCRiZWbo6yUlo+UnJ6UoJ6bmKChlZqep6ekoqSwsqbBx8OwsLq2xcTCvs2nx8PHw7zV0M3Eyoh0c2NdWmBbTktCS0BERj5BP0I7OjQ+QT09NT02PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxmRmBpZ1pdW5OMjIh7h4uHg4x1hpCKgW9+fIJ/cX6BepV6kZSUmJCTlae0xsm/wszBw7nHvLqvq7m7l7K2urLArqXApKqvu7uqrauiop6nq6+1sKqbn6qboZuVnq+zp4uiurm1wburqJyypKOok4WNqcPEpIKLj4eIhIaVlI16g4yRjpGhjIyUkY+Jl5+Yk5mUl6agrp2MqpyOlY+SkZWVjpCVkY+hlIaXn6CznpSalKChmaSfmqCboJSYnqakpqekr62lwMTCrqi3tcnDvrbOssW+xLyz0cnIwbV1eW1dWVxqU01JQ0xLSkpAQT1CRDw1QUQ7OjM9OEIzMzIyNjJBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJmW01lXGZUY2qZjZeKi4iTkIaJeYaTkIFygHyNf3iHgoKQeY2hlqiampi6vsfIysLSyMrCzb3Bs6y7vqe6v727w7iswamss7u9qrCqo6WjrK20rba1oJ+unqaimKOzvKmbqLzBo7a2r6uSr6yqq5aGmammpZGCjJOllYmBdYqSeYWNkZCdn5OPlIuQjZSjmZeblJSjnqmfkaWajI+PkJWWiH2PlZKSo5uVoKKctaaQn5alpKOlnp6mmJ6Vl5ulo6moorKsqLzAxK+ls7fMwLmuw7O7vsK4rMLCwcCZbnpiWVddW0xLTUpHRENJQkJBQ0s6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+a0lfWGFaZGRWnpCdjZeOnpKJin+In5OEd4V/lX5/kIiKkH+VoZqupqOYwr3Iw8jF08zOzcu7wrevur20vMq8w8G2tryts7+5vK6vqKCpp7atrqmyt5qeraKooZ2qt7eppK++w7G9ubOnqbOzrK2WlqSrp6CRjpKxxaeVjnyRlX2HkZmPqpmYk5OPk5WTpZ6TnZmToaOinJifmYuNj4+eiFqQl5eSlqWaZpijn7OllqKWrK2rp5ufppeYlpmVoaSopp62q6m6u8S1pbS2y8G4qbass7u4rqi4ur24g25vW1hVVk9GS1NOSz9BSEVESEZHODVGTTs+Nz5BSi4zMjAyNUI1NU9WTjtMRktSTE9HR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVzs9QEJGQnJGaUlSZWJMRqWUnJahl6mWjZCDh6WSiIGHgpyEg5WQkJSOmqKfr76uoca9xcTHxs7OztLKvru2sbq7vL7OtsS9t7i3srK1s7ezrKacq6u4qqinr7CXo66kp6SktMCwqqyzvsK5wLmzp7ezt7KulaSsrq6ki5OVoY10wZp9lpmEjpaai7GVmpmVkpOZmaajlaCblpqonJuhoJmLjY+WnWBKlpyalJqll1SWsJ+vnJ+llK+vrKWaoaWUk5mZjp2gp6KZtKmqs7y8u6uwssfAuaWrq62xsaOhsrK0pHFvZlxbT1FMRVBQUFE7R0tIRkhCQz45S1Q/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVg7OkJDQD1RRVdSc2JXRkirl5igoqivmZCXh4unlo6IkoWfiISdl46eoJqjpLXItKnGusPDyMrIx8zOxr66sq65uMDBzbXIusC5tbmxr6+ytKejm6q0tKqppq6smaSupaWorLq/qKu2tr7Bv764srLCsLi8q6OutKy4pYibl6abdr6ghJicjpOZmouvlqGcm5eVm5+hqZ6ooJmaqZmhp56XkI2RnYNudpKimpWdop+QrbKjq5WpqpirrqWkoKSokpKZnIiUnKKel7Gnqau6tr6zsq29ubago6eopaecnKypqYxkZmFfUktMR0dOSlZMPU1ETUlLQUNEPFBVPEFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVhSUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5TYU1VSH9lXkhFq5WcoZ+7rpmUnoyTqpuRkpOJqo2Hop6MpK2Uo6O2xr20wbrBwsfIxcLOyMG9ubKvubTAwsq2xrHBvLS6q6itrK+jopmqtLumqaarqp2or6ekqqq9vKesvLO3vca8trW3wK+9v7OotLarvqWPopeRop+8n4mZoJmWnp2Pt5+pnKWjm5yhmqils6GbnaWcqKmemZWPlJuLl4mMpKGUnKKeoLSvpaWTsKuZq6yenqSjqZGVlaCDkJ6fnJWppaKhtLS6ta2otLKynpyippqXlZmqoZ53YV5gXkpJRkhNUUlORUZGQlJLSUFER0BWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6Z1xGQ0Ocb2JHRaeXpJ+fw6ycl6SXmamclpuaj6qWlqemla2smaKrtsTCu763wcLAx8S+zce7vbmysLizv8PItb+vvLa6t6akq6usoKCaqqvEoqWoq6aeq6+roqmovrimrb2wt7bHtrW5uL6wvsG2tLK0r72jlqOWk5uUrp+QoaKlo6OfkL2lqZ2prJ2doZumn72imaOeoqmroZ2XjZWek56Hj4SNk56koJ21rKaclbKnmbCnn5qqnqCNmZWfhI6hmpuSpaSamKyxtrKqpamtrJyYoKGSjpCWqZ+UaWRaYV1PSkdLT0xIRURJQT1PSEE7R0lIW1JPSz1IT1U0QkY5PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGVjV0yimqObnsWsoZ+snZyun5KjnpakoKepq5e2sKOqsrXEwr2/tsDCu8jCvsrItri1tLGztLfBxra+sLi0ubWfpqyqq52en6WkwaWgqa2gpKmtr6Kmp721pbG8t7W1w7Kzt7m+scPAt7ets7S1opyklZGToK2gmKGdqKmroprDramerK2bm56ZpqC9oZ2kmKurq6ahmY2an5KeiY5Xf5WepaGguKqnk5i2o5+zoaCbr5eejpmUnYKPn5eWjqKklZClrrKrqaKipaWWlZyZi4+Rk6SfiWJlW2RgTElKSk9GRUFGSz49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIY1xMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dzSEU2PXVlXEtOnp+hmJ7Dp6Wis6CcsqeTq6Sgo5+tqaydu7CorLWxyMPBwrPCxL3Gw7zFyrywsLausLWvv8W1ubCwurWsmqiwqamanqahp8Ktm6ywnKqirrCppKe9t6a2uryutsOts7PCv7HGs7q2q7S1ramhpZWVlKOroZ6fmqirsK6vu7KmoKmpmZmXk6KkuKChpJKur6ylpp+SoZ6Vno+QjZWdmaOfp7Smp42YtJyjr5qem66RnpSXlJqAkqGVj46foZOLpqywpaainKCek5KalIWLko2cnoBiZltoZUtJTEpTQkNASEc7O0Y/OTlOTVVeUlNKPk9eXj1IUEJMTEk5TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVV5mckA4PEiWd2VBNJ+kn5ugwqijqrKho7WplbKrp6KlsqyuqbuyrLC1tMa/xMS1wMS+ysS2wMjCtau1qLC4rMDEtLeurLa5pZmrsquql5+ml627tZuosJutn660saequrKnubO3srjAqreywryzxae+rq23tKmnq6GWlpGlpKKil5ikrritsbW2oJ+opJmUlZOjoLeipKWWrbGypaqmoZ6ampqWmKifn5iinq+yoqaNl66ZpayXmZ6lkZuOlJiahZaflIyQnJ6Ui6mpqqKnoJmeloyPmZCBhpaJlJ95ZGldbGlOUE1OVD1DQU1DOjpJQDc3UU9dXlJWUUFXYFxCSlNIVktIOlVkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVKcGlWQ1dGjHlmQzuko52hpr+mp6+voKm1qp25r6ujqrS3sbC5t6+2uLfEvcPHvbzDwcfAucHGwbqqtqWtu63Bw7e4qq2yu6KVrbCtspalp5Gruaqgp7Cdqp+wtLKqqba1rLussrK5t6y5sMK6vb6mwqqwt6+pqqumnZiYqqGhoJGYoLCvs6uwuZqbqZ+ZlpKXpqC2qaWioq+xs6uxp6ufm6Cgm56lnKGXnaOzsJqfkJOlmqGpmpWin5aYiZSYk5aXnZOIkJuZlI+pqKefo5uXm5OHjpmLfo2WhY+ba2ltYW1uWFFRWlRBQ0VUQDs7SEE3OlhQZF5QVldEWV5eTUxSTl5LSj5aZF5OSFBOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNjQ3Z1lgRig/OGx9aFtWOol7Y0M9p5+coam9oaqwqqOxuKmltLOroa21va+zuLy6vba2wMK/ycS4xMLAwLjEvcG4r7aoq7eyvL+/tKmusbefl6utqK2Xp6mPp7ufpa2znquisbCzrKm2s7W8ra+xtaywtbHAusS2q7yvsbirrKmisaWepKmfo5eQmZ+yqrOpqrOZnaebmZSNoKaktK6noaysrbGnsqyyqaSbn6ijnZShmJuotamXmZKSnpmeoZ6QrJ+YmIaVmIudmpyTio2Wl5qXpqWjoJ2WlZeUgI+UhXuPkoOMlmZscmhwcl9HWWZWRENOWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJgUEtNTlhXWFBKVlZXTD1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfXmFVMTUwPWBWXjgpQzNZVVxnSzWMemZMQKSaoKSst6SsqaWurrapr7O5pqawt8W3sba+wcK1tLrFvszFucPAur+6xLjBubK1rKq6t7q6vrWqrbG2mZinq6qrm6yrj6u8nayusaOqn7Cts66utrG5tqmtrrCnta+zu7zJsqq1tLG0r66moLOfmqitoKWVlZqZsaOtn6WvlqGkmZmSjaKlp7Kpoaaxq6m1pa6wta+jmZ2tp5qXnpmZq7ijl5ORj5icoZiXlKyfnZSBk5mNnZ2alpCKlJOemqWjoqCZlpKTlnuLkIV7jIuDi5JrbnhudXxhRmBqWUlIWVo9e0pHRTZBYlRpWk1cYUpbXVpSUlJiYExLRV9hYFBMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBWYS41KENeUVwuKkIvSkdQW0gzY1lVS0SZlqCwqLGprKWjrq61qbe0uKOrtLfKu7S7ur++tLS3w8HNx7vDvbe+v8C4v72xva6nurm3t8K3q62xuZWXpq6rp6OyqZSvu6StsrGnp6Kys7CysLSxt7KorquxprivtbPDxbaotLWrsK2pp6K2n56msaCklJuZlLGep5ufqY2pop2blZelpaW3p6Kxs6unsaessLWspJmgrKibnJ2blKq4m5SOjouYnKKYkJemoZ+WhJKWkJ2cmJaWiJeQl5uonaSgkpaRkZd2hJCHfIWChI2MbnF4dnx/XUtlbFxLT2NcP2J7R0k4R2dXZVtMXmJNWFlXVFhUaV1QT0hhXl9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSWcyNydGYUxWJS1CLj1FTVE8M3JrSkRDkJmkraStraunpLCys6q3sLafq7W5ybmuwbvCt7OytcLDz8TAwb61vcC/ur+9s8Soqrmwtre/va+rs7OcoKewraWmsKWesrWtq7KwrKmotLmstLK1rLOsqayorKm5rbGwx763pLmvqa2tpaitsKWjo66jqZydnJqvmaKjoqOQrJ6jn5+hqqamuKWrtLSkqauoq6+2rqKdo6iqm6CZmpKktJmPiY2HkaKglY2UnaCUk4WPlJKdm5iWlYeYkpWZp5ygn42SkY6Rd36OhX18fYeKinF0cn59flxSZG9eTlpmXUZElltHOk5tWGFbTWBhTlZXVldUWWdeUVJMY1pbVEtHT1RTTkdJVlNcTjtQXkpCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0NkOzYqSGRISis6ST8zQklTLD6Paz1HSI+bqaqhqa+kqKSztLG0tbGxoautvMu6rsC7x7G0rbTCw9HFxr7Asr7Bwry/uLzFqK23rLO4vMCwq7KtoKSnramopLCjqrGqr6ywrq+tq7O6prawsqmyqaulpaOtuqyqscK5tKu5qKioramosaWppKKuqqiinpuirJWknZedmKudoaepoayloqyrt7GxoKiin6qusKydnqanqJmjmJiPoKeYhoOOioueoY+LjJacj4+Gh5CVn52WmJWGlpOTl6ScnZyLkY+Oin9/h4V9d3+HhYd0c3KJdmxfWWBuY1FzclxLO4R8Rj9XdVhgWU5jXE1VVlVXUFxiXlNPTmdYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XkowLklnREY4PEIwNUVLWDFAlFs/TUaVl6ynoqqynKmpsLasuLWuqqWrqr3Ju7C+t8Kvsa2zxMPOzsO/v7TAw8S6wLTJxKyvt66yucC/s62tq6WnqrCpp6ixpbStq7CurbGvs6yzuqS4s6ysrqern6OesLerqq26tqS1taSpp6ysqq2hqKamsbKkpqWhoauWqaCTmqCmnaSiqqSsop6msbesrKKkopqoqq2pnKGlpKOYoJmVj5idk4GCkIiFnKCNi46MmY+Qi4SNmKObkpGbjJOSkpSimZuai42Li3yGgYGDe3SAhIJ+dHiMpId5a15gbmdXZodkTkBnkkxEYnlXYlhSZVVNVlVVVE9cXWFVS05pV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlhaLjBKZ0FBPDxDKzpKT140RIZASEhElpKvpKKqsJeqqa21q7axq6Srqqm8wMC4ubO8taazr8TJy9G+wbu5wL/CucG6wsSusbWys7vBvrOxrq2rrKe2qqWtr6u5r6ixsa6xq7WqtrWntLarrKSpqpyjnbOzqKiktLSgta2hqairqaynoKusqLm2qaqpqaGpn62bkaihnaCkoqaiqZ2cprSup6WpoqOXpKanqZyipKOfmZifkY6PmY1+h4yHhJ6eiIWKi4+OkI2EhpWimo6Nm5GSkY+Sn5eZloyKg390hoF/f3h1g397eH6AiZ6Pb3FnZ3F4XGF0iGlPXZhWSG14VWRWUWJPTFVUVVFPWFtiVkhQalRWVEdQWVVJPklIT1FQeExOVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJSYzAyP2Y9Tlg/Qyw+TFRfL0lrNlFFO5WNr6Clqq2Zq6Str7O0rqqlr6mpur67wLGvuK6itrDJx8jQwL+9u7zDvrrDwcC/r7KzsrW9vMKysrOrs6mltamlrbOzua+jrraxr7G5qriuqq62rKqeqqufo6C2raihnq+zobSqnqinqqOqoaGsrai9r6yurKGnp5+rmI+vopihoKinnqebmaqwqKKfrKGhkqGio6aYmqill5eYnY+Kh5WIfI2GhYSkl4WCgoyHj46RhIWUoJeIkZ2Qk5GNkZyVl4+KhYZ4dIF/fXV4eoB6dHR6aYKHo3VpXmVsgnVniIt9UldwXkp4c1NkU1FeTU1SWmdOTFZZZVhHU2lSUT5CTlFhUTpJSExTSXFQTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTWg6MzhfPWFkP0YxQ1BbWytITzpWQjSQjrGfpKaro6akrKa0s7Cpo7Cnqri+wLywqLmqp66wycbI0cO9wL65vr+8ybzCubCwtbK6vLnBs7S7rbmto7Wmp6yxtrmyp6e6ta21vK+8pa2ttautnKmvo5+lrKqnnJ6qs6SzqJqqp6mkqZ2jqaipvay0r66dqaOgrpuasqOVpJukpZ+kmpqoqqWemqmhm5GaoKSdmJapqZGYmZOQioKPhX2PgoCIno+Gf36Mh5GPkISAk5uUhZOijJSRi5Gbk5WHiX6Acnp5fnxpd316dXFxfWiGeYSIZGBoY3OFem1neV1eVUJXemxUYVBSWUtLTXB0XUhaW2dZRVZmUEM+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSTElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTtFWj8qj5OwmZ+fqKWkoaukt7KypKiwp6y4wb21sKO5rKiosMPJyczBt73Atbe/usi2w7W0s7Wyvbm6vretuba/raKzpqqrr7W4tKqeu7uosr+yuqCvtLapq56tsKKcpaipop6cpLGmsKCfqqmnoqqbo6igrbyorrCuoauio66enqyml56aoaOcn5uao6mimpmjo5WWk56hlpuWpqyLnpGQkYyCi4B/joF7mpSNiXx/i4aQj4yJhZKYkYeUo4qSkoeQmpCTgYh8eWx9dnl4Ynt6cXBwc3hpgXRqg2dkaGFvc45tYmpwYG9BXHhrVV5OUFFKSUxTWldNXV5tV0RXYE9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKkw+Kh00OSYnLjM0LjArLzQmLDokNDBBaFoxM1M9ZV9ETDZLVmRPKTwyUFs9I5KYq5ifl6ekop+opLivrqKvr6mruMK6sq2fuK+rqLS6x8vHv7fCvrC0vrfEtsOyr7qys8C2u764qbm4vquktaeoqrCtubCpmrq8pK6/tLShrre1p6ansLKgn6Smp6ClmZ+tqKieoKqvp6Cml6Opn7C4n6Sxr6Groaykm6amqZqam56jlZycmp2pppaanqeRl5KYnZOZlaGqkJqJjZCHfYd+go18fKGMjYl5g4yFioyNhYiTmo6JlZ+IkZWCi5eNkH2Fe3NwfHFzdGB5eGlvcHFvan9zY3psaWZkYWaGgGBbcmpxTE1/aVhaTVBMSkhQUlFJTlxfb1REWFpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo/MFpaNSiWnKWYnJatoJ+hpKG3q7CjtLSpqLnFtrKuoLesraywtcbIwLe/wrqxtb23v7u/r6y9sLS/sr3Duqm7u7inqLaop6uwrLOwppq8t6Sru7Wun7C4r6mlpq+xm6GkoKOjoZabsKahnqKnr6KgopOjpaK3sKGmsaufrKKumJyqpKiel5qdpJOanJqdpamZnJuklJSXlJyOk5eiqaGQiYqPhXqEfYSKeY6Xio2HeoKIhIiMjoWNlJmMjpaZio+XfoaXi496gHpwcXZvb3RfeHdlbGxsammEbmZyaWxmaV1kc4FgW2t1aVpJfV1bWE9PS0hHUlVGMjleXm1QRFdWWWVNSElFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCI4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbDg0R0FmW0hURFVdaEQuPDJiViwylaKhl5Sbqp2koaKgt6quoLq4pqy9xbOwr6O1sK2tr7XExLyzv7q4sbO5uLq4uq+uwLO0uLC/wbisvbq1pqKzqqepsqutsaGbwLakp7W1qJ6yvKmopqivrJmjp5yjppSYorKlmZ6jqKmcoqCTpKCkuKikp66mnqWgqJKfqKKhoJibnaCSmpuWoKGqm5uYoZSRlJaZjZOSo6ikkIiKjoV5hHuEhn2djYqKh3qBhIiIiJGFlZOTjJCVlI2OlHuDl46Ld357bHRxbGxzYXh0aGlqZ2ZvhmdoaWRmaWpgaWJqZ1tle2NgU3NUXFtTS0pHSU9TQCEqaV5qTENWVV5gS0lHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPzAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRCM0NEZ1tLV0dVYGhCMzc5Zk8nMp6jo5GOo6ebnZ6do7Wtpqq5t6esw8G2sKyjta6nrq+3wMC8ssG3sa6yt7a4t7atqr2zr7Kxvb+4rry8saWftqulpbOpqq6fnsGrqKWwsqmstbueqaqrsaWXnqqdpqSRmaetopiepKmhnKKdl6Cdp7amr6qvoaGdnaGUoKWfoaCZm5mckpmdlKWdq6GXlp2Uk42Vl4uPmJqooJKIioqIeYV3goKBnIiLgol8f4SIhoWRhJaVj46PkZGRjJJ7g5WNhXN9fWZ4b2tqbGd1c2tjZ2VkdYBiZWZmZWpqZGtxWl5ZXW1kYU5oV1pgVkpHSUtNUlg+OV9saUhCVFNcW0lIRkZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQDozQWZIJTWbo5+Qi6yhmJiglqWzsaGxvbehsca8urGxpLarq66pub27u67Asq+urbavs7izqKu5sa+utLa6trC5vq2mnrWroKCwpKuunaPBoLGjrrCut661nq2vrK2imZynqaSelZuopZ+ZpKKonZqgm5ScnaywprmorqKhmpqdmJ2jmqSdl56Ym5SZoJKolqqnmpOampGLlJmNlJSZqaeOjoqJj3uCc4GBipiFh3yJiYSFioyKk4STnJKSj5CRlo6QgICMjYNwgH5meG1oa2pncXJrXGhjY3OBYWZoam5sZ2tqZ21cbGt0cWFUYmhkZVpJRkxNT1hRUVZhZIFUQFZTWVRGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUplQyc0kqGajY6wnZqToZmpsq+fuL+2oLTCu725saa2sKiupLe4t7etu6+tqqu3qrS5rqaztbKuqbG3trGztbqnqZ+2qZ2eqaKprJuov5ito66vtbWtrZ+xra+popuco6uom5Wcp6OdmqmipJaaoJyQm6Orqqm7n6ekoJiZmZ2gj2uhlpiccYKVmqOAdZKpp56UlJ6QiJeZgJaKoZB4hpSMg25qfnaDcWyGi4Z9hIuGb15jYWeEl4Zri4+Uk3V3i4R+g5CAZ4aAaHVpZldcaHNuTlBqY2dyhGdfZGZubGpeYGGKkISFZU5LRDhGVGdeSkdQUFRVS0hTYW90ZUZbUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzU2OCwjMScyMTQ6MTc2WIFsMTZPa1tOXEtbZmI+RzFRZD0rL4yjmYaVsJuck6Gbqq2qo73Er6m3wri9vK2ntrClq6S4s7KzsbmtqqestKawtaOouLa1qKest7OutK2zo6qftKueoaScpqeZrLuVpqWvsretrqWprauspaGfnKCnppuXoaWlm5unp52Tnp+YkJ6nqqO1r6Ojo5yWl5iXo4ihjpKah6GHk52gf6V/pqqekpGakYiDcniMjoWIoXaJjWmXiGZ9cnihb4iHhH6NfH+hoKCZgHuHnnSIjnabimyHgYJtaGVjemxxYVSGbWNsaZhxWGpwb4dYXmlba2tbiHFuenKGZ4aEWl5GTT9HX01GUlZWUVFSV1VnXk1YSlJST0VHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3LyiLppeDnKudmZmdn6qqp6m+w66yury3wL+qpLewqaymsrWur7O2q6mlsa2ltbOcrbW2tKWnqbOxrbKor5+robKpoKOimqGim660laOkpba8pq2nq6qsqKWhoJigpqOZmaaipJicpKmWlKOclJOkpaaht6OjoKSYlJOYk5yIro+YlImpi5eim4WxgKOsnZOZnZR5gtSof4eVwZvHeXixpbeXZIDAnL95hIR5kIR8kJCRynGWvJzFe3K2pruQe4BslrGrsHloa1ixrm5labySvG5oem5yj9h+U2pitrJ+gXKUdJqhqpBXT1dhT1ZORlRbWFFQUoxcV1xQQFxEUU5FR0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjaWTgKapn5ecnqWtsqiwwr2ytcC1t7/Cq6azrKypp6+zqa+2s6ioprWmp7ivnLOytqqlpKixrq6xpqqep6SxpKGgnpebn52urJSdoZ+0uqKqqKGtrqWinZqZoaefl5unoJ+YnqenkZynmpSdoaaioLCin5+jlpWSmJKZha9qaoqNqn5nhJWGrWRwnZyTmaWUca6hpH54u31roZB2sV9qtFulgGackWBmgnpmf2p4a6lkvnJnpox2sWp8sXh0kpRjbW2nbVuEoEVoZ4eWRXWcYH1nfKSngllfi6tpgJV4eWqnN0qvXFdTbWNbS05XX1xXVjtOiU9XVy9JVFNJREVGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMxG5GhlIKsp6Weo6WqsrestL2+r7bEsre6wqaosKuuqamwrqOxuq+kpa6zo6m5qJ6zsrCjpaCqra+sr6ann6OisJuim5eVl5qbraWWm6GetLOhq5uira2gnpmWoKGonJiepJ+cmaGnpI+dopqXoJ+qnqamoJufoZWVkZaRmoW1m7V4hamZtZl3h7Obt36TlZaolH5rgaZ6goaIkpSSeKtna7Fbq3uPh5R0iHGPhoB/iJCXeIOCi5eMg6CPhLB2d59xa2tsfItOpFhIY2OZfmNopmB5cnVTkodeUKltY3F+h4BinC5Rom9bU2toYExLW2RYXFpCPrF4V1hBI01oRUNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o4YVU1MBuVn5SIs6amoa6pp7Osqbq2wrC7wq24t8GqrK2urqausqmhr7yqoae0raSrtaSmsrOno6GdqKqyqLCopZ6fn6+Wn5mUlZaYnayhmpmjqLSuoqmPqaiqm56Vl6Ckp5qenKKfm6CjpaOWm56YmZ2iqpulmpyboqCWk5GTkpyD1ZOZuXCwwn7GhnzWlJu7fJmVpI+NnI2ke46HpIKlgnqseY+dVq96iH6farlauXeGg3ymgpN8mHqqeY2dkHuxbo6EdJC8hW+UUK+nxYpRoHpjYKpic3KIbZeIYFO1tMiGgIl8Y6QzQp12XVBpaGRQQFhnWmRhSkhNbEtbUk9ZZllDRD5FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFRNzIlm6KTmLGoqKW0qqW1qKS7t8GwucCxtbS7s7WnsbCjsLKmn662qJuoua6jr7Ggs7SwoKSen6iqsam0qaScnZ6ql5iXlpeVlqCpnZqWp62wqKOfj6yiqJael5uhpaGYoqGhoZqioqebnqGelZmbpqCbp5Wbm5+hmI+SlJGciLJuaLVxq4dvjqZytHNytnuZl6OLjpyNon6RoKV+sHaDkdLRdlyue4V/pG+bqqZrhoR8rX2XmY97sXOSnY95s2WWdISeb55mlFLIi1rCXJ95Yl+tYHZzh2KXiF5Zyp1vv4F1TUu1U1XGZFNRamNmWEFPa19saE9VR0k5PVZSW1dYSEM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTTYyMKGckaWwraSqu62mtaWntru8srq/t7a0urqzpbSzobGxop+sr6SYprqupLGxnLS4qp+mnaGqpLKorKqkmpyaqJ6VlJiYkpKip5+WkqWrr6ailpOsn6WSlKCbpKaflJqlpqGao5+tmqGfnpCWm6GdnKWVnZWZop+VmJaSmoWse3eodqOOiYepb62KgqeDmJihiZKaiqJ/k5mIroV/grNccrNSrn2DgqR/cdd9d4R9jp6GmZl3r4aKkZyIeLNhmmWagYKUbJJasFhLmnWYeWZgrV53d4domIhrXq93lZ6PeGw1eciusl9BVG9eZ2BFUGxfcG1WVU0uZWNpU1lROkFEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEk5ODifnZSguLCXtMGtqLOoqbK6uLS4v7m3srW8taW3s5+0rJ+fqKuflae2q6ixsauttKSbqaCgqKG2p6aqo5melaWhlJObmZKUoqWakpCmrK6moZWaqZ+ij5GimailoJWapaidnKSerZ2hnaCNlJ6bnaCYmZyWl6Kgk5iQpp2GqX19pXihj46DqnCti4GnhpWfoYiXl4ijgpGIlKp8gIudeW+xWqiCgoigeXTYf3aHc6eBjpuNkqR8lpCfhHuyXpxkoH6DlWySXKtbWpN/kX9oZ6pkcnuBa5iHc12sWomgjmtvZU9KQ6FcWkx0XWJmTVthX3J0X0pWNkqbk1hIRT1IRkFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4wMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMT84oZ2Zmb+rl7TCrqutqaW0sLextb+5ubKwt7ypurSfsKSepaennpOqsKmwqbWsq6+hmKGgpqWkuqKjq6CXm5GioJWUnpqUmJ6gj42LqK+vpp2Xm6emn4ySpJenqqeUl6mnnp+go62koZ6hjZWhmZ+gkp2XnJWeoZWWjqubj65tcrRyqYx2iqZztHhzs4CRpKKRnI2JpIeQd7hvjHuLomtrtlqghWWXl2mhoqdtk3K0dJOYf7JqhZKIrWt1s2GdZqJvh5Jql1ytYE2hfIeRUnOjbXp/fm+Yh3Fcr1Y8nHdlVG9uLlynT2JSa2VibFpjXWBwe2NUWlE+Pm1vM0JCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs8MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKWam526oZyywK6tq6unt6m4r7XAtbywr7m4q8G2qaqgm6akoZ2RqqqotqOyqK+qoJecp6Ckq7ido62blpmPpaOVjZ2gm5icn5CTlKu1r6eZlJusqZeMk6WYpKyikZaqsaOgnqersZmho5CZopefm5acl6GTnKqclJCrmYfUkpq7c7DDgMOGftWWm7h4h5CXjJiKjKeIeqO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gYpumohxbo2kdL1ed31bYXm8a1pWW2p6XmphZmdibXdvWVtZQ0FAcj9DRys1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy02QTmnmp6hvKKXscOwraqqrLGnuK+2xbG6sa67sK7Bsaukop6joZybkamkqrKktaatpJ+WmqqZpqy4naOumJWhkKWgko2co56XnZqQlZKvubGslZejp6eUkZaknKOsnpGgqKufnJ+po7Oeo6WOp6KVopqcl5WjmI+woJKUqZ6FkJm1gJCRjLeVeIKTmrV3bWtuc255j4SOiXSewbu9mnuBsqhwgHSRuIN8hoaMho17ioaNl3yku7m9nHV6tKN0dpd1dLB1mZ5mhmmNtXRycHe2jF6Aen2JaIN5bXlji6xwdYV/WVunakRkWVNmYGNdY1FnZnFtdUJNUE1EO1pNPkozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVjgqT11dPSs6VlYnPTs8p56goL+llrTDtKyrp6yrqbuusMavtbOut6e0uK2poqGlnqCdmZSrpK2qprWop5+blqCjnqykvaahqpeUnZCim5KPoqiik52Xk5eUsrW2rZido6Sii5KRppulqpuWqKSlnJqhqaeno6mhka2el6Sel5eXnZ6PsKiUm6ehjmp+aZymeIdzfZqPdHplh3q9vsC6b5KCcZWHX3JqWl6aiWFjiI6Va2B/lWNtnXdilWt/mpWUZV5gY3GbimlyjH2GlWdqfnJ0eH19Ylt3dIFoUFxuhH17i2tYbHqCc0lKb4ZwTnRNRVddZmBMW1hmY19PW211aXFST0RFTTxIST1MPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBeTCgzPVtPJz8yPqifqKHBo5u0urajrKWup6i1sazIrK+zq7WjvrGyp6CiqZ2im5qZrKaupKW1qaWbmJWhm6etqb6nqaaVlJyVoJqTl6WpqJCdkY+XnLCyv6ybp52noomTkamaqKObm6ugo5qbo6eto5+ropqwm5WnoJaVnZ+dl7GkmKGnmJyRnZyjo5mmopqcmpqZj5aBZ219cXeSl5SRhYq1qo2GmJWPioyYl4eUlYqEkpSRiY6Rk5iUmJeaoKKanJShnY2CeqWGbGp8kHyAdImKgXGCeHl2douAfIprc4F0g3Vkd313a3B6bWBjXXBnTVlZZmlgV1pwem5sZlNPRlM5T1pNUk8oKzpKQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCzoLOiv6GjsbK3oKmlsqelsLWqyaussaW1psCntKGdpKWco5WWoKqmrKOjt6ufmZaWn5etqaXBnquklZKcl56Yk5Sin56ip5ORmainssOvmqucqp+PlpapnaqcnKCsmKGbnaKlsKeipaierpiXp52ZmqGenpywoJyippWYk5iToKGVo56XoI6Wk4qKjY6WrY98lZuCkoKLqqiGgZiWioSPn4h7hJCHhZmSiIaKlY6bl42Ql56jlpqTkZ2Nfo5mobOvhYqEdnqPinx2eXpvZnqRgYCJa3WBeYhyaHN/enaDh4JrdGR5ZmBqZWNkZmtZa3twaWpcUkxQRF9VRUA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0XEc1PCxAtKC5r76sq66ysqCqprGtoqyzsMWwqqyjs668pLScn6WioZ2Zl6ilqaakpbO1npWUnZmZsKatvqCsopCRnpqZlJGVoZyXqJyEnqmrorPIs5+qo6qXlpeap52om56kq5Oen52gqq+qpqOroq2bn6ChmaSenJ6dr6OYn6iTmJeckaSZmKidmpdlgpJ8ZX6NmY9jeY1saGt6kaSra2WamH5nhYplZWloe46hj2tojZeRondraouYo56Yc2xueoSNh3pYZV6Fgl5siomAdlxoc3d3koCHgm54gniAc215hHR3iYiOg3tphllea3RkXXOJaWp8cWxjXVJOWEpkWEFKND1GNz9GRDcxPD0/QUQ7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMVlDOz8uPaWfury5r6yzsKqlqK2tsKeurbC9samnpK2vsJ+tl5+jnaGamaernK2jpaipsq6elaOQoq+mt7mlrqOOjpqhmZOSm6CZmKSVe6Wsoqizw7ekoaeun56VnqOeo5yjqqiSnqGeoKqxqqujqqCpm6afqKGslqGbpbCkl5yqlaGem5Kll56qmJ5+vYOHcrRyhJ2GrWh4ucS4cZOio3ummJlzqoJ8y8DAu3GLooeCn32VmImewL2Clp2djZ3CwXuCe5KMmsPAfWqlsW+MgG/Ken+bd5KDjoF2eoF/eXF6f4dxeIWNk3ltdpNjZl94ZGBlgmNedGdtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLyNGWzNQWS9VQUI7LziWo7jDtbCvwKmolKOvqbCuraayta+ppaamsKufq5iaop+cm6qnopyso6WopaS0pJ2ikqauq7izp6+ikZGanaWSkaChl5ufnYemq6Srrb/AsaCpr6mXkp+dopmho6qjk6Chnp6tr6mspqOjp6Glpp6tqZKkm6mtqZydqpysoZaXpZaho5ecf86UeHqkgXmVlptfro9ejqeBoqB8p5WbdKuDgK9eY42qeqeHhaB0l5KIs2OCq4agjo2zaoSudH2Wh7hhg61Zo81uj3V72nt/mXB+iJJ2fmV7iHZ2a32Ibn6FkZJ+bYGPYHFrcGdgX3lkXHFoamNmYFJUUldeS09DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w7TC0hUEBGNC4xrcK/v7W0sLeXnZGkqqits6ulsqysq6Srp6+qoKebmaSXnKKvn6CeqKejpaGesKybnpWnrq2xqqisoJSSm5+lk4+fpZedp6OeraSqsKjAxrOoqbGulpKdnKKXn6mqn5Shn52drrCoq6mcp6ekoquSrbSXpqKqqZ2jp6WhsKCSmqeaoJqUlJGXoHGFjJd0hKiHcbF8nXGsfqGegaWPnneqgn2tf5xyrX6rh4afdpiSenyXfqqIooyRjJ1+q3uJk4+fgHutVpzEeo9vksF9gZVtdXCMbWV2ZYZvYXducm+Ki5KQg22RkWVwdHVwYGdtZV9vaWluZmNXU11hWVJTQzlJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DUxsaytJ+do46jo6Gsr7auqbGnqKqnraurp6KjnZmilaCmq5+hpaCoqKKfnbCsl5qWqKevrKinqZ6XlZqjopGUoa2bnaajr6yjq7Squs2xraauq5aUnJ2imJ+urJ2WoJmen6qzqaqqm6uqpKOsm7CxoqisrqWYpqqpqbGikpajpZqUkoSkaqR1iXqpdHqycIKliZmMcYigmoekYGBSq4R/roObdq6BpoaGn3qZloZ7ZoCjiaSZhYKjfal+gZSHrl58qVWdopKBeqKfgHvDr8WMc6+zs7lxYqmvwnRojY2Yj4FtmpNwbnl4d29sZmVlcnBmfGliXVdgaVhYVU1NUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NzQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfDydbVv6GZq6ehr6KesLSwr6mtoqemqqurqaSmoJuln5ymp6ajnKyaoqyhpJ+vop2akqqktbCuoKmbnZaUpqOQmqKooKClnLGmo6exrLbIsrWqrKmVkZ2copmgpbOdmqCUnZ+nrKykrpqsqqOiq6KzrqKqs7Ghmqqorq+2o5OWo6eYm5F8qmyehId1q3l8sG+CpIqJn5aVn5SB0ri0uMmAgbJfX5Spg6SIh6B5mJWaeKrJdJmjlaepkJOajH+biZrGxnhloYKlc4GfjoJ9r15wtWOxdUujhm2nR4KTZI+QnpJ8cJeTgHF7dX17bltlanNxZoFqX2FZZG1cXllJTUxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz4tNU9UUR0cOzxGMiwkp6TBxritqbKtrKWinLK5rKqhppuopaqrqqegpqWYqqOfrqudpqCsmp6ppZ2ntp+il5OoqrayrJumnKCVkKWskZmcp6OfqaauoaOnqbC0wrGzqq2ok4mXnKSaoaOvppihlZmcpaarm7Cerainnqyjt62hsrmvnZuvp7Ozs6SUl6ejmZ+Ogp1OeJqBf596g6N9g6SEh6efnJ6ThLh7fHm5gn7MxsK2eJuhkYuffZqWlop2npiKpJijqH6whZ2FnoSsfZmUYaVso3CPhZCBfZeDcqxgpHNxgJpgvH1SVXWOkqSXfH2Tkot1enOFf3FcbW94cmqCb1pkX2huY2RdS01RVEJJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu4q6+gm6Gss7Omn6CVpq6trqqnnaammqOnoLKuoqmmsqCZqqSUo7aiopWXoqm0uKScop2ik5ChsZmenKeloaKvrp2kqKG2ssOxrqmtqZGHkJynnKKknKWXnpmamqakqZqvoq6lppivpbytobe3rZ2dtbK4sLOmmJ2voaOehY/RtcO3eYeOhZGTkIGmeJSid4ygkYSlgYpxqoaEtG5yapmjm5WKn3yYmYaHj3OvgqWboo2mi5OdiZSQm21wslylc5N6nGyZf3uZfW6pYaNxcX+fYnOyuGh4j5SmmX6MjZOMeH15joJtaXhpeXNugHRdZGRubWZnYEpbWFg8SEdAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVZWVFFPUVtVJSEyQUgkKSWTc42Krb+/u7q1npanpK21oaOZlaOpp66qq5mmop+moaC1p6Opp7CjlKyjjqSto52QmpqqtLSknaScqZGUl62goJ6mo5ynnLSaoaqjtqvDr6mrqaGMhI6coaCmopWampyZm5mnpaaYrKiuo6Wbrqe+rJS9sKyforCzuau0p5qosaSnmHqokH18sHeKgaSliJxtsm+hh618oY6Dp5WYgKyIha6Fn5SpoKGWhp+AmZWAe5J+q4CdmpaLqnidoI+Jk5KAea9do4F8pqdknYB8l3Rrrl2la3CFmV1gW4ygbZWSp5mDlI2XjHt7g5d/a2x/Yn50bYB6YGdlcW5oZ2hDWmFbPUtUMlU4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaWFNQT05JNzA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNUVlZXWFZVVVFIRklKIygovZKahKnGwrbBtJ+arKCtuKWjjpukop+wr6qfpJ+drZmeuKCjq6CvqZquoZCrqaSWiZqPrrCspp+nmqyXmI+soqGdpaGapJytmJ+oprapwK+lqaOfi4COm5qfpp6SlZqalJqapqWkmqmsrKOkoKqov6SXw6yqoqGrsrmqrqegs66oqZh2r36Qi5yFh3y6roqYZbCMZZWtfaGPg6aVmoGsioSwhaWZpKGhkYWgW2xqgbNgf617e4KBsWxnb5mXjIiwW320W6SDa8iiZZ+Ae7xZdrVasn1Sr4B6rFiAoW6YkKibi5eRl5d8eY6dfmRzfmKEeHSAfGFqZ3FtZmVlT1VkXEFUXz5KKD45PTQhIiwlHzIuICoxLzA0NTc5OTxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE1KR0M1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7K3vbu0wbOjm6ympbaooIuaoJ+cs7Opn6OfnbWYoLOoqquer62erJuVr6iijoibjq+sqKeip5mukpmPqJminaWfmaOipZmfo6myqLyvpaienY59i5uVoKCZj5Kam5GamKmgoZmorqelpqOlqbufoManpamhq7S1rK6mnrutrKyVgKmSo6+Om4CHpJeYkIGAuMO6g46ck4SnlpyCrIqCr4imm5ulqpF+1b3CqmKjv719fqOCg9e6uLWFlJODnr2+hGqjgW+rhG2df3qysMeDaquwvax4d6K+vHSBlo6nnJCbkZideoKRm3pjfXtkjWd5gntga2VramJQYVtTalxAVWFDTio9OjQvHh8kHiUyIB0kKDA0OTY2Nzc7PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM/PEE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbO0sb+5sb2yop2upqWypp2MmKW/qrixqKG/pqaynJ6xnLmonq2vpaeUlLCrl4yDm5GupqOsoaScqZ+Yi6OSpp6nnJqgqKKYnqCsraq5rqijmpeSe4eZkaabko6RmJiPmJSpmqCYqamhqqehoqu7nqnFo6Cvo6qztKqvqaC6p66umnN1qqS3hmWJoHBnrY+Kj21veKSPmZ+Bda6ZlXCPi3GVqKObl66kcm1tbWWKeG9tgplxgHlpcWlniZaVmHFoaYSGZ3CGZF2JY2pvWV1nfnemYGJxjpFvZWSAjZOPopiYmZKXn32HjpV2Zod4aI5reX95ZGxjZmxiS2RXSmxZOlFlRVInSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXVdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWts6m5ubKzqqmhrp6jsqmYkr6yw8i+tqqewKuso6CnrJ+6o6StrK2mjZeuqZCMhZWWrZ6mqqGfo6OgkYukkqeZqJmWo6mglpylpqevuqusmpuSknuEl42lmI2RkZiUjpiVqJWfmKmjm7GnnqOsup+wwaeks6assLGqraunuKOtt5aKoKiltp2JlqKYh6makJSdk6qzmZujq6CxlqGhnZ+inKCkoZWrp42TkoyHkpyclJCak5iQjpWFgaSal5WNi5KSio+GhH1nin90gnZ0h4twp217lJGTkoGBjpCQj52UoZaZl6KDiJSNcmmQd3CLeHd8empsZGRvZFVgWEBpW0hjYU9aK0Y9KychNzQwLh8cISUyKCo2OTk0Njk7Pj9BQkRGSktLTVBQUVhVVlleYGFjXF5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKaWqaqltbaurqKwpK2foLWxkI6sxr3Eu7iqoqWem6aesKijtqedqbWmqJGYrKKLiImPnKeWrKSgmaeenpOVo5aomqiZlKaho5CbqJmhtbqnq5iakI18gZSLoJSKlJGVkJCUl6WQn5qqoJy2o52nrLenrsGuo7enr6+wrKmpsrigrryZkaWkpraikp2mn42pn42Sn6Osr5uho7Cor5ejoJyjqZ6enZyWq52SmaGblJCWqpmNmZmWkJaekYmgnZWUhZKMkI2UioB9ZouGdYZ2eYiDc5xqhpCUlJCJfYyWkpKXk6GTnZeihIiYh3pylnN6in9yfH9qb2RecGpgW19ZbmNQYGVQWzpHR0U+Mj09Ny8rJispJh0mNDA2NjU4Oj09P0FBQ0lKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOjlFTVZbXl5bWlxbW1tcXV1fX11eX2BhYWJhYWFgYmJiZGJcW2OXlaSoo7CzrK6jqaetoKe1qpCQnaWzu6+srKKjmnqdorGkpbCplpu4pqOTmaqcjoaKiZyjkK6fo5Wnn6CSlpibroqqlo+omaeMmaiPnrm2pKWYm42JeYKTi5qTiZWSlJCNkpeijZ6eqZ6euKSAhK+1orCvdaS+o7Kgd3mgqrG7lHWspJ6JgKp/ZFxidqCOpJ6El35uk7Odo6etqqNlnZ+Sc3mZl3CAmKiXbH+iqIplnKWckZeYlYuRnJCGnZqQlYOSho+OkomEd2qOh3aGcXyGgIBhaYeKlJKLWnWVkGhoj45yeqaZmWV5mYeCeJhqg4qDb3mAa3FlX3ZwbGtoXGZlYmJwU1w+TU5OU0c+QFRDOjEvHh8mNDozMTY2Nzg8Oz5AQUJGSEJHRklLTVRUVVldYGhmZ1dQSjxERzs4VVJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mm5Wmo6GvsayrqaWprqOnraWSlqu2sLKmmqqnq5dzjJ2wn6irp5OXuaCgj5yknZF/iIibno2smqKUp6GejpeRnoR1ro+IppqokZekiJu6tKegmZiLiXV3k42Wk4qUkZCUjJCToI6boKeZnLKWgIyctZ2zjJKPvKegfqeieqKut4GOjqaeg4uGkLGpr4yKlqOaeYGLrIacnaKnqaeHlYWYd6WbeoebgZemgoJ7nLF6ioWgl5mUmJWBkZeWhJmZY3mHkISOj5GKg21wj4d5gHGAgYV/hnSGhJWSeJZoknSgmnR9mYShnoeYfpKLg4OZa46NhWx4e3FxZ2R4bmpsaltla2pmdFxfSFRMUUBFNS5ZVVU3KSEwOT0+NjQzNTY4Ozo9Pj5ARElASkVKS0dTWFtZW2FgaGZZUUg5RUw7PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXo5+mrq6rqKygqLGmp6qlmZSuyL6woZamqbWej4OdrJynoqCNkL6emo2fmqCQfYaPmZeIrJyhlp+gkY2TiIaAkaiNh6Kco5OXnoaeurKnnpuSjoVwdZCJlZCKlI+Pm4uPkp+Sl6Cklp6siJ+0ibSarYrKh6quiLeFjK+CsK6DqY2lmI2dfKiPcnt3nI+nlmiVpHm0i5+epqiSmMKBf6uImKFxnoCZpH2XhZWxgKF8oZSgkJiWgI6Tm4qXkYt8hZKGjZSSiYNtc5CFf3pyhoGEfIR1hIGXgI/FZn+ph4+ja56DopuDmoCMjoWKmXCOk4Vod3R8d2hodXFnaGteZG9tZ21YaEddUk0yRTQ2TmFjNyYzPERHRDk2NDY1ODs4Pj09PkJMP05JSkxDUFpdXFdhXWpsXFFFPUtNQEpkWV1jZmhnYmJiYmNjYF9iYWJjY2NlaWljYmJiZWNhZmNiYmmUl6KfsKipqKWroKS5saqrppqUoKOkqqOWpaq3o69/oaecpZ6diZS9mpONoZGdkHmElpaRiKuZm5uZoYWPjHabnI+fkIiepJuVmZiGormupJmcjIx+Ym2Pi5OQjZCMjZiLkJKfj5SgoZmhqH6hp4etnaCWrY+enJ2RhYCgjaquhqONqZmMmn6idoCZlGuCrHVNq3iHjZ2Rm6ingKmrfYOhe3qnaZ5/kmtnl4aXtomefW5gZFmDln+Me2RoinKZfXmVbF17lm1fU3CDXF9reYNgWWWCfYOAl3CnqmuDo25ypXCfhJ9pZZ9sW26KfGZaYIN/YldQb3dmbXRya2pvXmpwbWxqWGlPXVhGOUE0R0RfazQsSUNRTU49ODQ4NTk7NkA7Oz1BTz5RUkxNQkpcXV9XXl5idmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBjZGNhY2lrZGJkZGdkYmdlYWNol5adoLmhqqOmrJGhtrysrqOZl6CipaytoZ2utaKokqGgn6abmY2YtJmQi5+MlYx1gZSSjIqmlpWYnp5/koWFrKSHm5CKmKiYmZqRh6Wxp6KVmoiJgGluiIiLjo6Ki42Si5CSooyUnqCcoqV/k4GPo6GUoHeclo+ng6Gnf4aprISleIp8hJp9onByk4iWe56MeW2HnIyZkJuomo+HnXuConN2pmaefnakX5h6fZJzom6Yt7S6dJKHgn+1qGSBxrh7cJW3i3GAmqRjc6yrYH1qnbN+bnyGgo6Ci5hxf6NscqNznoSApGCcmLOWcXyXn7R0c1uesoNqYm90dnJob1hrbHNzZl1pXmJLRT1ENVFBWnIyPVNHX0pSPTwzOTU6OjZEOztASVE/VU1OUUBFX15bWVhgYHxkSEM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO4mauck6CNpLe1rq2gm6Kco6OmrZybsa2sk5ehmaGkmZqUnqubi4mSeIuGcICWjYmPoZCSlJ2XfZCJjqigh5iOipGik5uajIqoqKWej5aHhH5re4d/fZCNg4uQkImPlKCDl56gnaCfi4l3nJiijJ9yoYuHqIibpY+Wp6p+rYx+eqCZeqOTeIF0loiNnH2WoIebjpmbpoaiZKF8iJaQm41snmibjW6amXuAiqd9cmh0q4Odg3SqZ5SaXZuFdoSdaKpqgLhmXKhwgZxhlYxep3Z2iIl/nmiadYaTkpeOf59umpBtp5ldqH54u2t+qluOhF20Z1xucnl4a2lccWp5eWNgZlhiQVFFTjdWQ1JuNEtaWl9OWkRAMTUxOzs3SD86Q0hVP1lSWV0+RGJeVmBRYWN9aUVCOU5bXVhkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtZuniWOUm6u6srCsnaacnKifnq6bnrCorJ2XpJqhn5iWlqCjmYaJjWqIgHJ7l4iLlpaEkZSYj3qKhJajnYqUj4WLnZGcnIiPqKOgmYuRioCAaYCGeX+XjHuIjo6Ij5aaf5Oin6Chk5hyaJ+Kn4+McJKMgamHmJ6ip5+nfK+to6K4l3ejs6KkgIiUeZ17q5p/oo6dm5eIl3GhfIWNr7V9a5qRoXh+mLSjo6uohJl8m32dmX50qlpdb3uWi3ieYkx+enqFY3mXQkyeWaJqcXyObYGJhJl1m3iGibGzf3+bk6d2gZ1tcn2Ub5lzaqRdlXZIZWNgc3F+f25mYGxpdntkZWJSXlddVVZAWUZRZ0RTV1tiWF5JRD1COD9BOklFOExFV0FWUVtWREZiXFpgS2BtfnFFQzxVX2JaZWpWZ2htb2JmZ15hYVxdXmFoYl9lY3ZsXmVnZmtkZmxpaGtpk52Bsa2ZhFReoKazubOzqZqijJyrnJyplKGrpKGoj5+enZqZlZignZaIh4l3hYFueZWFkJuLfJGTlohyf4iSoZtzkZCAiJiUn5qEjqmcmpSKi4p8g2yEhXGCoYx4hY2IiJKYlXyTo6Geooiuhn21hI6enHullnqpgZWcj4qgnHynaHdtfpl0oXNxfJ6GmXCTg659pIOmnpqAo29eqGd1o2NvpWGc05B8e5l4cnNjooWQfqNzo491a5Czi2CCmIlzqrKovH93g21+vqaptF6cbn1xl26Ac6JyXaRnc6ZhaKZtm9SZfYSab3h6l2ube3eXc22ppGdgZXlwgIRrZ2ZkbnZ3Z2BjU1tmUVFhSFdJVGBXU1tlalxlUUZDS01KS0JKRThQQFFOV1JZT1NRYGZlaVNjd3l3SUZFY15lWmhpVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJebf7GrVFxLfqmvsbSws6ObmYWZqKCgpI6kqKCYqYqZmJiTmZOSoJiOiIZ7cH2EaH2Pg5SagXeRjo6Jb3+GkJOSbJeTfIiRkaOVg46qmpSSi4WJeYN2iIBugp+Hd4CThoiZopZ6k6Kkmp+Js6Gitot6rKekrqVwqICakIWAm5F7pIChmYaYcp6Eo66vipeMf4ykjZaDrqGUdrS1tcmhc5SKgZ9gnZepbXmVhqCbdaGHd6B+kZaKgG9MZqOScJuHcqR7eXRhg4FrfqBrcWRgnHJ+dJdpemmztbTGpnOYfnqda5ybq3WEm211d5hpmnp1mHFQRX20Xmp2a3mIZmpoYnR1cG5WXlRZaVBTaElVTFlTVV1oa25WZ1dNSkFKTUtISk5BUUtQZWNpbWV1c3N/eXxudYl7e1RQTmxeaFtraVJqaGlsZ2xmY2VfXF1cXmliZGlre19dZGhjamZvbWVpbGWhnIivpoRmP5Shsquvr7aiopCAl6mioqWMpaednaaCmpeWjZeQj5yTjoiDeWp5hmWDjH+XoHl1j4mMgWmEhZKDjIWdjXqMipWlkoOXqZeMkYuBiXqAfYt5cJChhnmBlYeJlqCVf5SlqJyWloRmbnicbKJkfHGld5uYcGemgJaLe6R6n5aDl3KedoGKlJaPuW6QiqJifZmhlYhtcmmranWgbW6mX5ppi5BoloealXWigH2aYIuFjHRviGJooGWefmmadW9jZoiCbXKiWl9bY6FtXYmMb3t+c3JkpW13omRnp2iZc4yZb6JvU4mQb6BfZadUi15UmG5tc2tygm1waWt5c2tvUllXV2ZaU21JWE9dSVhpaHNqWWtWUVJFVlxMWFJhVWhqX3d0en1wfHxyg3t/c3aNgIR2XlFyYmdicGdQamhoa2xuaGRnX11eXWBrY2ppdnVdXGNpY2pqc2xma21jnKSYpnpldG2Lp66kqbCxpp+LgJernZ+ljKKhmqKigJaYk42aj4uYkI6Ke4ZxgIhoi4t8mJtzdIl9kHtkgoeViomVmYJ8iIaWp5CAoayQhZCKgop9gICOc2iPpYR9hpSNiJigjoiTqqediaZ4lpt/pIiWjLKYnpCCr5efpXeUh3mpdKSOhJpupKKMkoSMg7tufaWvgoaGhpOWnKB8pXpxqJWglmaefm+rY5aKlZJ3qGypooGJdYeCd6uRpodqkbBrdrOMqWuKhm1tn56SlWF/q4uqdn9/jKWedp99hKSVnaBqm4h3rGefrY22dHe+jaSTWYOmjathdXJ0cHx0cWNqfm5obFNWW1ZhYl1rTV1SXUldbW12YFtxWVtgWmd0ZW5vcWNxdGB4en55cnmDc4R+gHt7jIGCgHZieGRjbXNkUmtnaG9scmpmaWFfXlxia2JtbHpvXFxiaWJsandtZ2xuYpWlqp2BgJ6klqmqnainrqSZiYOYq5qepImapZ2pnYWMmo6GnJGFko2MjXSGeoiEb42EfpiTdHSGcpKDbX+LkoeGk498e4GFl6WNf6WmjoGOiYWVdoKHkm9si6mBg4uUjomcn4mNlKujoI+AdZSWiH6BeZSuo3+Bm3GPhXiPioN+e3KmjHF9fXqXlpuEjnh7fn6HlJWTinaQmJ+gg3p9iWuMhVt5eHJ6cGhufpKJcX90go+Uk3GFg4JljH9egX+Ld3VzlHVveW5uh22EhV52aHiOZYCBhY6pm310fJZqiYhvgHZ9hnZtbWeMc3l7mHiEW2tYeY9pbndycW94eHBdbIZuamdWWmBXXWVrY1ZhVV9RX3B4eWxrdmVqa2p2fHFydHNhb3VidHuBeHV6g3aAgH+AeIuFg317bX9sZHhuXlduZ2h1a3hqaWpkXGBaY2plbHF1blpbYmtkbGx5bWhsb2GOlLiopouhopqmpJmknKuioYSEmKySnqGJmqabqZiDgZuKfpaTh46KiY1yg3yPfX6PhXuXjnNyhHCVhXt9kouGhpCFeH5/hpijjXunoYuGkJCFloOGjph3coWpho6SnJCInp6HjJuon6Cqg4mNlJp+fomWraiPkqaPd2+dkYJ5kW99qIVwfZVxa3B9gZ+Mf5OOjGhtXYOLjJybno5zlYuIcXRrgXZ0gVlyboeRgX1+jGpdamR6hYOIgF9peHqbe4KLgnaBhoJnd4qGa2FwcoJ2X3KLgYmPppWFZoyPg253i4Rxho96cGZnZHuDepZbXGpnbnZbe3l3dW5zc4JmXG2Ka2xjWVleW1lscVxfYVpeXWZ0fnt1b3Rja2tqe31ye3h0ZG10aG18fnZ6fHx6eoCAfm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtobGtxcm1XW2VtbGdzeW9oam1gi4upsKGQo6Ganp6Ynpmoo6J+g5itjZ+ViJuikaWVf3uYhHySmYmIhoeKc32Ai3aFi4GElopxb4BymIaDfpOEg4aKgXqAg4ubn4+Cp6GHeI6YiZWLi52XhYN6rYKRmJmUip6dh4ihq5+ioqOLiJObnKOZlqqhp6agkpuHlY17d42OhKd+f5KRkpOcsaablZ6QjbKTmISljIyVm5+JkJuCiJGKa3yNd3hlgoaQinyJnYSHi5CIiICFhJB3fHl0mqGIhomeioSUfn2LgYF1cHOFg393h4eKkKaRhIWNh4ONkIx9iIuJkIJ3bIKEfXqZanJoYXSKcH16d3ZvdnSBXV5vh2hvYF5aXF1TaHJVY1xcYWxodXx8c29wZGtqaX98bnl/cWlwcGxmgXtygoB4f31/hXttgoyFfHp4fH16g3lOZHZqcm1wemRrZWJiYFt0ZnBmcnFtVV1sdG1peXpxZ2lrZYyHnbmelqKhmJWZmJSZpKGefH+aq46ejYagnIueln15lIN7jpmJhoSEhm54gIBygYd+iZSEbWt+epeGg4OQf4CGhIZ8hoONm52Sh6qfg3KKkIaTkYudkX2NeqqEjZKYlo+cl4eHm6afopqdhoORmpmZkJqmoKWdnZCWgJCKdnuHjoSle3yOkJGGmKqhnpOdkI6rjpGAnoyIk5qego6XfoaNgm93hXF1YX6Cj4Z1i5iBg4+ChoR+hYOUbXh1dJKiioyFmYWEjXSAiXx9cnJ7h4R7eIuOhJKmj4aDj4GEioqKd4aIiYx8b2t+gXxuaGxtZ156f2h8e3Z0dnV7d1xgcH1udWBjW11eUWduVGVbXmFraXZ6fnFsbGRrameAgGxzgGtsdG95b4R5bYaAdoKAfYR2cYKNh357e3x/e4KKYGl7anVoaYJlamNgaVxkdWhvYnRtbFVjcXllcHp6cmVpbW2LiZ63mqGjn5KRlpeLmp+fnnt4nqaRm4qHpZSLmJl5eoyFfImRg4yCgoJufH94c4GFfYuRfWtofYGXiIGIjnx9hYSHfI+Aj5ubkYinnX9wi4uMk4ehoYqFjXyokYiQkpeTlpN4jKOgoZ2Wmn+AkJqYkoyao6GjmpeRm36NhHiAg46HoH99jI2PfJikoKGTmZCQp42QgZuRiZKXm32Skn6GjYF0c4JwdmB9f42GcoqVfIiMcYx/goWGjmh3cXiMmJGPf5Z+h4pygYZ8fXB4e4uEenqRjIOWpZOLhpB8hoaHhXaChIiIemVyfH94enFsamZefnNofHV2dHxzgGpeYHR2cHhkY1lfXlJraFRlWV9haGp2eIFxZmtjbGhlf4FrbX1ob3FrfXiGemuLgXOBgX6BdHaCjYZ+fHp/gX1/j2pyg25zaWGHaGxiX3FWdG9tbmB4aG1XanR2Y3V7enJiam55iY2espKlpZyOkJiPhp2hm518dqSgjpd/jaKKiJqWeHuGh36DiX+JgoF/cX97dHaChX6KkXhnY32Gl4qCio14fYCMg3mWgJWXlo2VoJt+b4yCkZSGppuHjYmEppWFk4uWl5OSd5GdoaGXlJd6fo6Yl46Wmp2knZiSlJt5j4WCd4SWjZ1+gYmNjHOXop6ik5mOj6KMjIOXmIOSlpl+mI18iI2BdnF9bnpkgHyKhXCGkn+QgmyHgoGAiYRldW97h5KXjHyTeIuJe3+GfHtxfneJhXmEkIqLl6KVgoSMd4iEg4J3fIKJhXZgeHh9dH54Z2xkYX9pandzdHV9cXxiY2FzbnVzbWFaYV5bbGVSY1hgYWlrdnmGcWJqY21laH2DbGh0aGxvaYB8gXltkIZxgIODf3R8g4yBf356goN+fJBtdol0dG1limxqYmN1VoNpcW5geGdsYmp2cGZ5e3lxX3JshoWPnK6XpqiejY2Xh4afk5eZfXiqnIqZepedi4yYkHl7gIt9fIN7gIOBeHR4enN9gIR/iYuAZF59i5WHfoWHdH1+iX99l4SXk5aMo6GYf3KHe5SSiqePjI6Kk6CSg5KQlJeRi4GPmKCakpCRc3+NkpSJnZ2eppeXjZWWc42OimuFl4+ZeoeIkIlvl52ao5OVio2fjIeCkpx/kpKVhpmIfImJgXlxeWt1bHt9i35thZKClHdwgoN9fop/ZHJpe4CWl4R+jXOQiIN4h351eIB9hoB8g4yEjJSkj3mEgnSJh32AdHaBiIRuYXt1enF9b2FvY2R7Ym5vdnN4d3N0YXVfb2x1bm9cW19eXmteUF1YY2FobXR7iGtfamVqY2h3iG5mbGhqbGiBfHt3b5CHc4GDhH1zgYaJeoJ9eoGEfX2OcnqLeHhubIdraF9pcmKHaHJvZXZnbmxheWhrfXt4cGF3bYuAmZmqoKOonYqLkoaKnouVmH13rpiMl32elJGWlIh3fnuKfHuAdnd/gHB0c3tvhX2BgIp/fGFcfo+Rhn+EhHN6gIZ6j5GHkpGbkqWclYJ+gX2Oi5KkiY6KjZiajYaRmJOWjoqIjJKck5CMjG6Dj4+RiZ6ZoqGXlomWkW6ImYRmhZiOlHqJhZCLcJaalKKSkomLmoyCf5GefJKPkouZjnuKhIdzcnVrcW50e4t0boWQjZJxdIB7gYGIfGRwbHh9mZN9hIh0kIqAc4h5b4B9gIZ8hYyIhIyVqIx7iHx+i4V4fnFwgIWDY2h5dHVwfGJecGBrdF5want5eGtzcGV4XW1sc21zWFpeX2JrWlBXWGVjZ3Fxf4dmXWloZ2JncY1vZGlnZGlogHp3dG6OhXSBgoN7dYKJhXeFfHiEhXqAiXd/i3t7cnmDamtfcGh0gGtyb21xZ29sZXxjboB5dnFsd3eKfqKXoaigppuHjIuBkJyHk5x1gaqUko6HoI2Wk5CAdHt2hXd4f3Jze4VrcnB6bYp2gIGHbnFbWH6RjYiAgIB2dYCAf6CGkIqSnJehlJh4in+BjYmcnoqPhpKYloWJlZmPlouLjY2NnYqOkINtiIqQkYmclqGcmJWFl4hqhKOCZoWdipF+i4OLgXeTmJKfkpGJiZWOf36QmHuRjY+NmpJ8in+CbnVwbG1vcHuFaXODjpiKcHd/dIKIgnhmcm91gZmOfIiEepSReXaIdHCJe4WMeouGg4mOm6OIfIR2got/eHhva4GDgV5yc3JxcHhaXnBgcGpeb2l8enBtbWpsdmBwb2pybVpYYWFiblhRVFpmZ2N1cISCYl1rbWRiZmuTbWBmZl9na4F1cXJwi4B1f4OAeHWAi4B4hX93h4Z3g4V7hox/e3aKgGpxY3xjhnxvcW10amhvbHZ3X3F/eXt0dXSAgn6klZqtnqaWhYyDf5eUg5CfdYuflJOGi5qMlY2LenJ4dIJwcoV0cXWIa29tdW2IdoN+gG1uVVGBq5SHgniAdnKCeYGggpGBk5KYnJKaeJJ7g42TpJqTjomVmZKEh5eZjJSLiY+PiJ6EkIp8coqFiY6InJqfmpaUgJN+aIWch2eFoIeSg5GDiXGDkZePm46QjYyQjXh7kpB6jouMkZaMfIh8gGt2am5ra2x6f2F6fo6WgnZ6gHiDjHx5Z3NsdIeVi36IhnuTkHF6hHB2jHqJjHuJfYKMkJ6dhXx8d4KMfXdxamyBgnlgeG9tbHJ0Vl5vYnJgX2xueXBncGZmc3RocGthd2VdVmZgYHJTUU5cZmVdeXCIfF9caHJiYmVmkmpfaGRbZ3B+cGtwc4p9dnyFgHR1f4x5e4aBeIiDc4aFfoyMhHt5lXhncmqDYIh+b29remBqbnR/dF90fXiGeHRzhXx4oI+ZsJylj4KKf4OaiICMn3+LmpOOhYiXjo6PhHZ0dnOAcG+Fc3Bxg3BqaXZug259fG11c1JNgt/IktaTfHB1g3WDoIKTd5WRmZuQmXuUc4WQn6GTlJCKk5uUhn6WloiNjYiRjYicf46Ad3qMfoiLipycnZqVk3qNdmeJkYdsiKOEkoeXg4ZjjJGZjpWKl4yNiotxe5SIe46IipKRiXmFe35se2Vyb2preXlcgHmQjoF6fX5/ho56eWhzanOLj4mBhYV9lYtrfn5ugIt+i4d9hHqBj5Wamop8dniDkHlzbWZwgINtanRvaGp0blNeb2RwWV9rcnhma2piZnhyb3BjX3hgYFZrX152UE5LYGdjXXpxiXRcXGV2YGFlZY9kYGVhWGlzc21qcXaMfHR5hoJ1dn6Lc3+Gf3uJfnKJh4GRioh8fph2ZXNufGWHfm9wa39ZbG55eXNhdnp7jXZzd4p3eZ+Lm6+boJCChXeIlX59ip2HhZ+RjoWMl4STjoeBdHdweXFuhG9tbn5yZGR4cX1teX1qaGxjpJrB3K7voXNrdYN1hKKFkm+WkJWglZyBkXGGi6OXiY6Wi5CdloOAlZCFiY+AkoqJln6HenV/iXiGhI2cm5iYjo92inZuhomLfYqjhJGJnYWFXouTl4qPiY6Li4SKbXyWgX2IhYmQj4Z2hX19a31keHVpbnhzWIh6koaGeX6AgIWLfnhlc2p/iY6JgoKAjJaFa4F2boiQgo+Ef4J6f5CVk5mQdHN4h411c3FndXqDYnRtcGJqdmdSYHFnbFVfbnR5YXJjX2h9cHJuW2NyYWJXblpceE1NTGRnYV52c4ltXFxkeV5gZGaFYGNiXllqcmtua3N3i310d4SBeHd7iXGDhH1+iHt0i4mIloeMfn6Yc2h1cXlsi3pudHCAV3F6dnlxZXd5hoxpd4CJcn+ch5mnnKOShH1wjJR4eYudhIWhjY17lo1/mYiEe3J3cHNqb4FraW18dF5geHd7cXV7Z2FlfOvatcnD3IhzbHSBdoqaiI1pmI+PnZWTgYlxhYmgjYSLloqMmJR8jZOIg4mPe5GLhY+Cf3Z4g4Nyh4KTm5aUmIaMdYd/cISCiYaYoYOUjJ+DiWGDlI+HioaKjYeBh2l9lH99g4SJjo2CcYZ+f3F3aHZyaXN3bFqMfJKChn1/g4CEiYJ1YXNriIGPioJ+f5KQfW2CbHiGj4aRg32BfYCSk5CWiG9xeoyGdWxxbHJ4gV90aW5da3ZgUmVyaWZTX3B2dGBvYF1ognByaldnaGNpWG1WXHVMS0xlZ15icnOFaVtcZXleXmRne2BkX1xZa25mbml0d4p+c3OBfnp2eohzhYJ8gId2d4qGjpiBjIF7k3Zsd3V5eJN0bnh6fVh5hXGAb2d4d5KCZHaGhXGKlYWZoZqiiod0b5OLcneOnH2KmomJfJ9/g5l/gXhxc21vZHJ+aWZsd3hbXnl7e3FxgGphZ2F/1baOkKZ4bnF3e3CSkIyHapmOiJySjIV7aYiLmoeBkpGGh5iNfI2NgYGJjnuQjX6JhXp0e4J6cIaAlpmOk5SBiHWDhnaDf4qSnJ+GlY+ffohhgJOHhYiEio6Af4NnfZGAfn+CjI6Qfm2CfIJ0a212dHN2dWtijYGPf4V+fIR/hIh+b19ycIV7j4yCfH6RiHpwg2Z5g4qGi4N8hH6AlI+QkoRub3mMfnVub2tsen1jaGtqWW52WlJpcmpiUWJyeGxiZV1aaoNtc2FbZ19kbF9uVFtwTkhPZ2VcZ25xgGxbW2NzYFxjbHdkZV1dWmxsYm1qc3aHf3Fvf3x8dHiGeIWCfYCHdXmJgZKWfIiGdomBcHd5e4OTb218gXdeg390gW1penSUc2dzh3xykZGDmp+boIaIdnaVfm12lJd+iJCDio2afIuadn12cW9samF1fGdiaXV6Wl94fHptcX9lZGhnV52PXnFylrzEhHZxlImQfnKXjIack4yIc2uJj5aBe5SLgYSbjHyLhn18iYx/lIh1iYV2dn2BcXWGgZ6UhpWPg4Jxf4h0g3uJmJyXhpOOnYCIZX2TgoCGhImJcoF9Z32Le3l/f4eLj3xpgH2DdmZveHhzdnNsao2FioGKf3iCgISDf2pecXh6fYyJhXuBj4B+coFpeIKHi4WEeIN8gZiMj4x9bm17iX13dG9oaH12ZFxxY1hvc1NTbnNpYU5mdHhmYF1cWG6AbnNZZWJdam1gcE9ZbFJEVGhhWmtubXtvWltebWNaYm93Y2ZcXWBramNsaXN2gYNxbn57f3R1g3qDgnyBhXZ+iYGWkXiDinSBiHJ5eX6NkG9vfIFxaYF5en5tbXx2lWtqeIR0bJONhZ+YoJmFiG59jHZqeJiPf4KKgpWXinmPlm96c3BsamRgc3poX2Vye1pgcnx5Z3B6YWVljrGyd0piWqTZ0Jdxe5GLkHh9lYuFmZGNhm9shpKSenmShoGEmIp8h394eImKhJaAb4qHcXR+eml5hYOlkYSTjYN/b36DdoN4hZuYk4qSkJSFh3B7koN9g4OJg2+BeGiAhXhyf3+Diod8ZX1+g3ZjcHOAaHhwb3SYjIWCint2eICEeYFqXHB9coCHhYl9hol6iHKBbnGDho6EhHOEeICZjI2EeG5ufoR/d3tlaGp9cWBZd1pZcW5OWHJzZ2BLbHZ0YV1bW1l0fXJvV2ddZmpwX29OV2lSP1lmX1pwa2d5cVtbWGtlWWNweV9oXF5lbGhmbGlwd3+Hbmx/fYB1cIF6gIF/gn92gYWJl4pxgo1xe4Z8enmEk4x0anp/a29+dH99b3J8e5RvboB/eGeSioKhmZySgoZnh4RwaHqWiX5/hYKZioF8jYxoeHJrbGZfYW94bV9ib3lcZGyDemFxdl9lZdTqvooyOj6LjoByeYWIjo12g5eNfpOOjX9ubIWNjHZ9j3+FgpWJfIN4bnaHhIOXd26IhGx1e3RmeYKDp4yDj4uEfW5/dHaDeYWbkIuQkZKMi4Z+e5KHeICEjYNsgHJpf354bXx7goqEeGF5hIFxZHFofm10cXWBm4uAf4V+c3Z9gHOAb1tsfnR4ioKLe4aAfIh4enFsiIOPg4pygXl/louKfnRta3aAgHV2XWlpeHBZV3xTWnFlTFtycmVbSnB3b1xbWllddH50aFliW2dlbmNpTVdmUT1eZlxddmZfdHBbWVRvZFllcHlaaF5fZ21namxpb3d9jmxpgoR+eW6Ae3yAf4J6dYKBjJOFcICLbnd+gHt7iJOJf2h7fWp0e3KGe3N3fX+MeXiEfXxrjIyDm52WjIGAbI5+a2l/jo17fn+DlIJ/fYqIa3VxZ2hjW2Jncm9gYWxzYWhwiXphc3ReY2SboI9uXDVZr7V1aoCJfZKGdoaXhnSPi4p3cG2Fg4d1eYl4iX2TiHp/c2d2iH5+mG9whn1odnltZXmIhKWHgYeNiX5ufnV/gHyLmYeCk5CYiIuEiXyPiHF7fYR8aX5ta4B7emp6doKHgHJgd4F+cWRyZ3WCbXV7hZSRgXyBf293eXx0fmxXb352dIuBhneHdYKJenhybomAjoCFcn59fpKIiXpubmltgoJ1bl1oZnRyUlt7TlxxXE9ccnBjVktzeGpXWVlaYXGAdGBdXWBnZGhpZk5aaE5AYWRbYHZhXHRtWFdTdGFaZG5yV2peYWhrZ21saXB3fJJraISJfHxwfn57gX+CeneAgImLhHF7h29xd4N/e4qNj4Nqfntud3l2ind9eICCh3+Dfn56bYSMiJijjYSDe3aMemtthImReX17gpGAgH6Kg3BycGNmXllnX3BwYGBncGZqb4p1YXRvW2FkanZ7f76cpqPIuHGFhHOUfXiGlIJ0kI2IcnJwhHuDdHWHdIh3lIh5eXFjd4Z6gJNpcoR1Znd2Y2p8g4iegoB/j499cn5zhHh/kZCCeJaNlI+Hgoh6iYlseHl/dWh7aWt/eXNpenaAg31oYHeHfWprdGh7f2l2gYuQlH56fn5we3Z7c35iVXZ8cnOKhIJ9g3CGind4cHCDgox+fXl+fHWOhYJ1aXFpbIeCcnBeaGNzbktldUxeb1VUWXNuYlBPc3hhUldYXGFwgnNbYVxoZWRjamRQW3FJRGRhXGNxXl13aFVXVXddW2VuaFZrXmFqZ2Vvb2lwdnuTbmmIjHl9cnt+eIKBgnx2fYOIhoNwdoNybneCg36Ji5N/cIB8eHl6gYx0g3h/gYGChHqAdW9+iYuanoh9hXp3h3xodIaNkXp/f3yJhoR2j4Bnb21fZFxYZVltcmFgYXFsa2iJbmBzaVleZG2Ad6naqceGh7JxiXhwjXV7h4+AepOKgHV0dX53gHBxf22EdJSGeHVsYHqCeYiOZnGDb2d1blttfYCQk4CBeZKSfXh7bYd1gJCLg3OWipGOh4WFe4CFbXV2f25od2Vte3ZtanZ2f398YWJ4hnpodHVjfXpndYaOjJV7dIB1cYB6fGx/WVZzfW90hId/gHlriIZzeWt0f4ODfXp9eHtyi4B8cmd0ZW2Kg210W2tfdWVIbm5MW2JXV1Z4bWJPU3R2WFBVWF5hcYRvXGBjbWRjXW5iVF1yR0NmX11maF1aemNSVVx1W1tna2FWal9gbmZma3FocHV4jnRrjox1f3Z4fneBg4F7dH6DiIiDb3F/dHF1foaCiY2Ke3d/eIR8fIWHeId8fYF+hYB7fnN2eYyOn42Jeop2dYN5Xn6Gmox5h4N0hYaFd4l6Ym5sW2JbW2FWanNjYFtnbm9nh3JhcWZXXWNrf3zKzoe5omptbYpscYRxfISKfnuShXp5dHl1dXtqbXVjhHWRgndwZ159gnmLiWVxgWtqcWNYbHuGnIiCgnOXlHd+e26HcYGJi4dxlo6QiIWLg3t5fnFxb35naHJibnhxamxxd318el1leYB3aXV4ZoJ2Z3SHi42UfHKHaW9+gHhtfF1YcX5tc4CLfIFub4l/cXZnd3+Bf4F2fHF6dIZ8eXJmc2Fui4Jsc1hrX3dcSW9rTldWXlRVe2thT1R1clFRVFZeYnSFaFxga2pmYlluYVhicEdBaF1gZl5dVXteT1ZkcFlbamhdV2dgX3Jma2dyZ3Byd4Z4bpWKdH96d355goeAdXOAhoWOgnBwe3d3dXqHhoeMhnp8f3WLfn2FhISHf35+fYd/fHh2eXeRk59/jH2LbXWAeWSDiJeGc5KKb4WFgXqDdGNuallfW11dVGdzZWBZZHJyZ4FzYmtlV1pgaX93vq57n7duYnOGaHR8cnqDhnp9jH94eHN2b3t2ZWpuYId1joFzamJefnh5ioNmcX1oamtaVm94iqSBhX9xmZNxgHh1gW2AgZCHcpSIjIeDiIV9eXRyb2h6YWptYG12amdra3l3endbZ318eGVyfW6EdGV1hYyGlX9vi2ZreoN0bHRiXG98a3R7i3uCZnWHfW1xZ3V+eH1/cnxsenqBendwZWxibYl+bW5Wa2B3Vktqa09ST2hOWXxoYk5VdWpMUFRVXmZ2g2ZdYXBoZ2BXaV1ba2hKRWtaYmRXWVV5Wk5WbWpZXWxlXFllY150Zm1kcWZyb3SAd3CahXZ/fnd/fIWHfXVzgoh/lIJuc3h6enNzhYeJiIR4gH12j398hImOhIKEe36Lg3t3fHd3mp2XeoqDh2l3fnxshIWUgHKPgnGGgn6Cf29mbGdXXVtcW1RkcGVfWGNzdWl2cGVlYldcXGiAcG9ygHOJZGV4fml0dnNzg4V4gYR5d3R1bmt7cWFna2eGdI2EbmZdX31ve4l9aGx3ZmlkVVdycI2mfIR8dpaQc3xze3lte3qQhHaYfIeGgoaDfXVwcmxndV1taF9sdWRnZml6b3tyWWeBd3VncIB4gnVid4WKfJSAbotqbXqAcGVyZWBseWZyd4p7fmJ1g3Zpa3F0enB5eHJ9Zn5/f3h2bmNlYW2GfG1rVmtjcVNMaWtQTE9wR157ZmFNVXRjSk5TV2Bqdn1lXWdzaWVfVmNXYXBdTEtrWGNhVVRUc1dMWHVkWl9rYFxaY2Vfd2ZtYnBpc25xfnR0mYF3f4B3f36GhHp9dYKEfpeFbnJ0e3p0cYWFj4KAeot1dJCAfYGUjoCFhHx+jIZ6foB2e6OlinmIhYRsdXx7dYSCjHpuhXN6hX2Bg3VuamhlVl1bWlpTYm5lW1hhdHtqaG1pX2JXX1ppgGprb4BnbGFoeXlrdHR0boWBen99dnVuemhqeWpfZW5pgXePhGdlWGJ3aX6Hem9pb2ZmXVVYb2iPp3aBenyQjnl1b35vcnV5jn93lHSFgn+FiHVqcnZnaG9cbWVebXNfZ2FpeGh7bVttgnJzaW+Afnl3YXeEhHiPhHOIcW95f3FicGhbbndkcHOIfHlic4BwZ2p4c3Jrd3Z0d2ODe353dnBkY2NufH1rbFZqY2dTS2xoUEdSbEVheGZhTVNxXUlNVFlla3d6ZV5tcGlkXVZfVW5uV0tTaFhmXlhNVWxVSlx5X1tfa11dWmJlYHpobGFvb3Vub3d1eph9d4CBeoB/h4Z6eXqDfoGThHF0dH56dnSFiJB9gH2QbHOUgXuCn4V/h32AfoaCgIp7doSsn396iIeEbHKCenaBgIF1bodvfIBziYBqb21kZFhfWllaVWJqZ1taX3WCaV5tbFxhVlxca4FmcnR9aWpda3Z2aHR3cW2Ge359eXZybHpoaXdmXWRzaHp3koFjY1Rlb2aChHd2ZmhpYFdWWWhkkKdufniAi456cHB8ZnhueYt7do5xhH1+f4ZuZHZzZGhoXWtiXW9vW2dfbHVlemhddIBvcmtxe351dWJ0hYp6h4aAf3dydX50YXBsWXBzYnFyhXx0ZHKAbGFsem9qaHl3dHFmhXV6enVwZGFkbnN+amxVal5eVExzY1FHV2JHYnZmYUtUb1dKTFhYZ2t2emRlbnBmY1pYXVh2ZVRKXGNYaFhZSFdlUUhieFpdX2xbXlxhZF5/aWpgb3R4bW9udoOXeXKBgH1/iIuGfXZ2hniHjH1zdXWBeHp6goyOfX6EiWp0loF7ip19foV5gHp+fIaIc3GProx7e4aQfmZyiHp0fX12cm+GbHt+bI96YnBvYWVeZVZZWVdjZmtfXV1zhWhZcG5aXldaXGx7Y3B3dmxiW21zdGd1dXBthXl/gHl3bm90ZWl0ZVtndWZ2dpF6X11SZmZqgoFzfWFjaVxUWF5iY5ClaHl0goWQeG1ueWd3bXuEenWIcoB4fHh/aGV2bWBmYV9qYF10a1llXW9vYnplW3d7a25ucHh4dHRkcoOSfoeCiHp2b3F9cmF3ZFpucGFwcYJ8c2ZygGRebnZpY2Z5enRtboF1c3xzcWJeZm5vfWVqVGlZWVROeF9SSlpZSGJ0Y2FJVG1TSUxaVmlscntibGxzYmFZWlthdlxTS2RdWGlTV0dZYE5HaXVYXmFtW1tfYmJdhWhoYW54eWxuanaBkHlug36AgZKIhIF2dIl0jIZzcXd2gXd8fX6Mj4B+k35weJaDfZmSeYCAeHl+f3OIg3NwmaJ7en+JlXlkdYh5c3h2bHRvfmx5fHCRcl5wbmBnYmxUWllXaGNtZVxccYllU3JuW1pYWGBsdmRpdWpqXlptc3FsdHN0aoZ8foB8d29ubGRpcWNbanJkdHaPc1tWU2RgcX9+cYFcYWNdU1pgXGOSn2VycYWEkXRsanlsb296e3pxgHZ+cnp6emRldWdeYlphZ1xed2hXYl1vaGF3YVt7dmppcm93dHN0aHCBlIKGfoR2cmpwe2xmdldbam1icHOBenNmb35bYHBxYl5pcHxsa3N+cnF4a3BgXGVsbXthaFRnVVdSUHZbU1BaUkhjc2JgR1VqUEhPWlVra2t8ZW1vcWBbWlhZbHBXUlBmV1dpU1RGWlxPSHJ1WF9jbWNYYWBhXYtpY2RteXhrbml1eYZ7a4N9f4SZfIKEeX2Ibo+GcW93enx0goJ8i4+DgpZ0eIKUhYGfiXWAgIF0f4Jwh4J1b6KXdHuGi4d7ZniLb257b2Z4cHpsc3ZzjWtedG5hZ2VrUl1bVWdibGxbXHGMZE9vbl1WWFVnaXRoYnRlZV1abnVucHV1emuHfH98iHeQc2Nla29hXG5tY3N4h2taVFZiY3d8fHCFXGNfY1RbYFljlpVjbnCDhYpzamh6bmVydnN7bHp0dW96fnVfZnJjW15XYmRZYXVlVV9gbWRhcV1dfnBoaXNxc3B1dWtthJOBiHuFcXJmbnxvcW5TWmVqZXF0gXZzYm12VWJxa1tebmV8ZWx1fHJycmptYFlkamp4X2dUZVVWUFVuWFFXVFBIZXJfYUZXaU5IWFRWbWlkfGlrd2thV1xVW3RjU1JXaFFZZlRTSFpaUE54d1tfZmxpWmJgXl6PbmJma3l1bm9odnZ/fm2DgH6Gl3t/h4GKf2uTiHJndIB7dYCDfYmPf4uTcn2KkYWHn4Z7f4aMc4CGc32CdW6ljHOBjYt3eG56jGBkfHFmenN5bG1xdoNnZHxsY2ZnaFNfXlRnYGxvXF5ujmhOaW1gVFZTb2Zza2V4ZGVdWXB0bXJ6eHNtiHuAd5x7emthZWxtXmBvamVweX5nWlZYYGt3e3tvg15iXmdWWWBXZJyIYmtxgYd9d2tqd2xbdnFreWl1cm1ve4ByWGptX1ldVmJjWGVxY1NeYWliYmxaYH5sZmtzdW5td3ZraIWMf4h6h21xZW97bHFsYlhfaGhvdIFzcl5pbVNlcGVVYm5heWJwdnt1a29sal9YYWdodV1lVmJWU05ZZlNPXU9PSGVvXWNHWWlNSV9LWG1kX3hobn1kYFVeVF10W1RSYGZOXWFUU0pcWlFZdXVdX2ZtaFhiYVtejnFjZ2p3cXNtaHZ0eYNzgoN6iI1+fIqHjnpukIp0bHOCdH9/iIWHkoSVj3p9jI+IkZuEgHyMhHJ/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH1+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo6Ojo6Ojo2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjIyNjY2NjY6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERFQjEvMDAwLyyApKCgoKCjgGNnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTUzHhwcHBwcGH6ppKSkpKd8XF9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9enp6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJiYmZmSj5CQkJCQjIeHiIeHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhoWDg4OEhISDjJCPj4+Pj4uIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkI+QkJCLjpGRiYeOipCSk5CKj4yOj4ePkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6Ojo6Ojo+Pj4+NjIyMjIyMjI2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjIiHioaNhomQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCRjYiKhY6Gi4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkI+HjYyGjIiIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjISJh4aIhYmPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiIqKi42Kjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSTkpOTk5KSkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGRkpOSkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpKSkpGRkZGSk5OSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJCRkZCRkZKNkJKRkZCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQj4+Pj4iPkH2MkJCPj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Oj46Oe42MdoqPjo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjI5zh4pzhY6MjY2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg26CgnB/iIWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dXV2d3VxZm1qcXNvZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoZ2xnaWZybmhnY2JiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpeXGVmXnJsXV5aWV9bWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTlBTYWJZa2RUUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFloaGJpYlFPT05PUFBRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLS0ZDRkpNY3JrZ3BqVU5NTE1PT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQD9AQlBsc21pc3FfT0tLUkxISEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7Pj1CSUI8T2lwbWRydGZFSl5URkJERUVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7O0FZUT5FZm1pYHBxaVJhZkVFRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dXNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5OkdbU1NjampucW1qaG1UPkNGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ok1jY2lsanJvbWtsY0A9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Qzs9Pl1tb3BtcW5sa2xPOz4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9AO11tPz5DS2ZycW9wbmprXTw6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/QkZEPjw8PUA9ODo7bXZIODw5S2tyb3Bua2dHOzg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBZUTw9PUlMRUZ1dk03ODk4SmxycnBtUzs8Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N5STtdf4N/eXt3Vjw+Pz09SmZ3bVI9PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFIcnlrYoKEg4KDgH1dPkBDQEE+RXRWOzw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEZvdH2CgoGDfn2EdU1BQ0VAQEFOdmpIQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVwQkRFRENYdYaIiX5YR0lKTExOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ1dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3d/hIWDhIlsQUFWdIeJh4eHiINXSExNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3Z3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiINVbISHhoaGh4eIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSUhISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpVgYOEhIKChYaGg4KGhYSEhoaGh4iGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJAQUNDQkBBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWWFhISEf4GCg4KDhISFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODg7Ozs9QDs5OTk9PD47Oz1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaoaEhIF+gYODg4KDhIaJiouMi4qJiouMiVQ7ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JmhYOBgIKDg4ODg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6OTo7Ojs4OTg5Nzc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXd5e3p7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXGEgIGDhISEhISGiYqKiIeIiIiKioyKiYmMej45ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT47Ozw9Oj47OTs7PDs8PDk5PDg6Ojs6OTk5PD88PUFCRElKTUtJS0xXb3JzdXR2eHt7fHx7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUFCPkBCQEA+PT0+QD8/P0A/QD09P0I/QUE/QUA9QEBAPj9BPT48Ozo7OTk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKCgoKEhYSFhIaJiYiIhoaGh4iJiouLioqKi4qLXj5DR0lLSklGR0dERkhHRUJAQENFQ0NBQkNCP0BESERDRURFRUFGRUZERUZEQEI/PEA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0RGWIWCg4SFhYaGiImJiIeGhoaHiYmKi4yNjIyLioqIV0dMTU1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E/QkJHR0lZhYKDhYWGh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSklJSEpGREdISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0dGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA5ODw7PD06P0A+P0BDRklJUF+Cg4WEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1yTlFPTUxMS0xKSEhFSklESkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVbnB1d3d5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDk6PDg9Pjs9QT4/QURISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMi4uLi4tfUlJQTU5NS0pHRkJHSkdMSkZLTktLSkpNTUxPUE5ISUtMT1FRUFFPT0pISkpMSktGR0hHRUdIRkVFQkFCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxYVlJSVFJPTEtKREVGS09OT1dVUVBPUVNSTVNUT01TTFBTVVZSU1FQTEpNTU1LTkdHSkZGSUpEREVFQkRDY3B1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9DQkZWTkZOUFBUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2hWVWthRVJRUVBJOztRU1JgdV1VVlRWWVlSWVhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLSEhKSEVGSUlJSElpcnZ5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklJR0ZGRT8/QUFFQkNHRURFTFhSTVRVVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1E/QFZVWVxkYFZZYnJdXVZdWlZFUVlaW1lfVFpnUlVWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6eXp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRUREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSVFJWVlRaWnWDWVV9kGBcWF1fV0lWXV1bW19ZSVlYWVtdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent6fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUhGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNVVFdSUVdWY5aAUWVyWFpXX2dQYGZbW1hcZ2FHT1poZ1xbXF1dV1NOU1BQUVZWVlZZWm5ydHd2dnV4eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlRTVF5aWFdXV3prWFpbXF5UUVFQSU5PV1ZYWlpkcXN2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVRST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTU5LTUtISkRGSEVDPlNjVX9SUVFOS1JUUU1PWVFNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXG1ydXZ1dHN3e3p7e3t9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJWVGJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz9DQ0NDQj9EUEJDQEM+QkhHVkBITk1HXWlRSEZPRkRFRkhHSEJDSEdIS0dEQkFEQU9QTVNkc3R2dXN0dnp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz8/Ozs+QEA/Pz5qUUthRUZISUVCP0dMTUdNUVVJQkU/Pzw9PD09Pz0/QUNDQD88PUI+Sk1GVW51dXVzdHZ4enx6fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXkpKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2dgbnJqbWxxdXt6fXt4enx8eHd4ZEJAQEI9OkJDQUFEQlxdT3tOT05OS0xNT09RTEtMV01IR0BCPDk3NzU5OT07Ozs4OTg5PztCSD9cc3R1dnV2eHp8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJSFBSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eYGVgXV5xdmteYGdrd29vbGpvbm5sZmJYR0ZGSEJBR0lFRUZETVJQYVdSV1FQU1NSVVtPT1FXUE1JREY+Ojk2NTg3OTc5OjM2Njc5NTxCPWVzc3Z3d3l6e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LVFRTUVFVT0xSU1RXWFRUWFJMV1laVlhYVlhZXVdXWGhza11WYXNrYWFfXmRhX15ZVVBNT05MSUhKS0lIRkNRUFNaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NTc1Nzg1OTlHbnF0d3h6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTFBSUk9NTU5OTkxKRlFQVVlTVE5KT09VU1RcVlJVU1JPTUtJSEhGPz49Ojc4NzY1OTk2NzY3NVdwcHN3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9JR09QT09NUkpPUFBQTk5PVExNSVBPU1RVMjxYTUlBUT1jYVFTUVBOUFFQTk5NUU5UUlBSTUlMS09SUFJSU1RRUk9MTEtMTEhDQkE9Ojo4NzY7QjQ1NjY6ZG9xdXd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkZBRkdHSEZKREhKSEdFSExIS0hGTE1QTUcvRV9SPjNAPmpvYVJSUUBGVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RtcHR2eXt7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmFlUFNUUlNUT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRUZISk1LRUdDT1JDOEVOU11mU1FTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5U3BydHh7ent9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUV1dVTExLSD05ODc7P0A+PD1BQEI9PkVIR0NGRklHSkpARkFBQEZIRUpPSFBSYVxRUFJOU09PUExMT01LTUxNT05bV0tNUU9HSUhDSUpMTEpGRkZEP0JDPjxCRj9CP0FkcHN3enp7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj47P0JAQD5BRElFQ0dHSUZJRUJCPz49Q0JBR0pFTU9iZVFNTk5XS0xNS0xNTU1MS05OU2RNSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES25vdnl5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEtFP0I9OTk5Oj9CPzxAQkJBREVHS0ZDSUlHR0hDQz9CPz9AQT5ERUNLTlFUTEpJTVRGSUlKTEpLTElKTE1PUFJQS0dDS0dDQkpKTE1PTUlKSUdDQ0NESUpNTElZcm13eXh6e3t5fHZycHVydHl5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZXFIS0NHSEhHSktJSktER0I9Pj06Ojo7QEI/PUJCQkNIRkpMSkRJSUZHR0NDO0FAQj5AQENEQ0lNUEdJS0dIS0RISUtNSEpMSElKS0pNXVJISERNR0FES0tNTVBOS01KS0ZHR0pNTlFOTGJtaXZ2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkb0ZLREZFR0VGRkdFR0JDQD48PTk6OjpAQ0A+QkNERUlGSkpMRklJR0ZGREI7QkNDPkBERENFR0xOSEtOSERIRUlMTk1ISUxHRkdJSUxOS0pIRU5JQkZNTE9NT01OTk1LSUhJT1JRUk5SZmZmcW9zeHV7enxsaGpuZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pDRUZFQkNCRUBEQj5APjo7Oz06PT5DQT5BQ0VHSkZJSEtIR0dHRkVDQD1FRUI+QkRDQ0VHSElHTVBKRkZHS05PS0ZISkZFREVJSkhLSUZIUEtESU1MUE1PTk9PTktKSE1SVVRST1dkYGFtZ3Byb3J5emdlaGhjaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0d2xqdXVtcnZxbG5sZXJNSERFR0NCQEJEPUJBPkE9Ojo9Pzs+PkBCPkBCREdLRklGSUhGRkdFQ0JBQUZGQ0JDQkRFRUdHSEZMUUxJT0pKTExJR0hFRkVEQ0lJSEtKR0tSTUJOT01QT09PTk9PS0tLT1VXVlVUWF9eXGlhbWluaHJzYmVmZWRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWpzdW51dHNxcmprc01HR0ZIQkJAREU8QUBAQzw4OT0+OT88P0JAQEBERkhFSEZGR0ZFRURDRUNESUZDRkVCRUdFRkdHRUpNS0hRTUpLSEhJRUZISUZDSUpJS01LT1NORFFSUFFSTk9NTlBNTE1TV1ZXWFZYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bW91b3JzdXFxaW96TUhHSEhCQkJGRTw/QkJEPDc6Pj46PjpAQj4/P0NFRkRGRERHRURFQ0RFRkdKRUVJR0NHSEZIR0VDRkpKR01KTEtISkxGSUlLSEVLS0xMT09SVE9IU1VTUVNQUU1OUU5NUFdaVlpZVlpdWlhhYGBgXmhlY2BkZmhnamloamZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN0bnBycnlOSUhHSURBQ0hFPEBFQkU9ODo+Pj08PEFCPD8+QUJGQ0VCQ0lFQ0VFRkdHR0lGR0tIQ0hIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5MT05QUlVWT0tVV1RRVFFSTE9RUE9UWVpZXFpZW15eXmBjXlxhY2tiYGRnaHKFaGdqZmptbnBvbnNyanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZwdU1JS0hKRUJFR0U8QEdDREA6PD5APz4/Q0I8QD5BQUZDRURESUVGRUdFSEhGSEdJS0lGSkhIS0hGRkxISEhKR0xMTExMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUFZbW11eW1xeX19hYGFkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd292SktMSkxHQkVERTxARkREQjs/P0FAQEBDQT9CP0FDSEJGRUZIRklGRkRJSEdJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOTk5PS09QUlVYVk1OVFZUU1JRUExOVFNSV1teXl9dXWBfYGFhX2FjZWJjaGJkaWpndotsamlnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2b3dLTUxMTUdDQ0FEPD9FRUVDPUFBQ0JCQ0VBQkRBQUVHQ0dIR0dGSkdDSElHR0pGSUxISUpNS01MR0tJSExLTlFLUlFNU01LTk5PUFBPVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5gYl5gZWFhY2luZ2JpaGhueHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xOTExMR0VBQEQ+PkRFRkNAQ0FFRERGQkJFR0NDSUZDSEpKSUlLR0RLSkdISklJS0hKSk5MTkxJTEhKTUtaZkpkXEtsU0hPTl9uVWtzW3FwYndjUlBhdnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5TE5KS0pGQz9AQj89REVGRENEQkVFRUZCRUZIQ0RKRUVKTE1LTExHR01KR0lLSEtLSUtKTkxNTUxMSUxNTFtzYmRwXmxtVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1Kcnl2a2Jga2VlbXhtbHZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0JCPz5CRkdCRkNFREVFRENISEdERUtHR0xNTktNTUdKTkhKS0pJTEtKSktNTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW92XFlsUVxtbVpxbWtvbXh4dHNpcFxfcmtxalV1eXhwY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hFRUVCQkI9QEBGR0JHRElFRURCRklISEVHS0pHTU1OS01OR0xOSUxLSUpNSUpKSktPUE9OTUtOTUxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHRUZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSURFRUNBQjxCQEJGREdGTEhFQ0NIS0hIRkpMTEZOS0xTUkxHTE1ITkpISE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF5uWGF0X25ub29xcm9udXN0dGpbXnRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eHR1a291bXRvbnNzdnNIS0hJQkVFRUFAPkNEQkdDSElNSUZDRkpMSUdGSk1MRk9KS1dSS0dLSkpOSUhKTElLSklISk1NTUxJS0tLU2tiWmleX2ljcnJaX1lqb19lZVVrX2NbYWFRYGxoXWpcb2ppZFtwZmRwXFpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRklERURGQUBBRUVER0JISkxIRkRHS0xJRUZKT0xJUElMW1FKRkhIS01JSEpJS0tJSElHS0tMTEZIS0tMTExLSUtMTlRbXFRQVExQT05PT1ZRT09RTk9RSklOUFFlcmlUWVdbW1xVWVpdWF1cXGNmYWFlYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzSENFR0ZGQUVDP0NIREZHQ0lLTEhGREdLTEhER0hQS0xPS0xXTElFRUhJSkhJS0lMSkhGR0dJR0hJRUZMSUpLTkxJT1xXXlBcW2BeT1hZU1xcYl5NWVpNWGFSSllhWlNgZFxhWFtkZFZWWFxZWlhcVllcXWJeZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRUlFR0dGS0pLSEVFSkpKR0VISFBKTU1KTVNJSEZBSEZKSUtMSUxKSEZFSUdERkdFRUpIQ0pNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOXlxeU1teY15aXWBjYFlfYltgXltUWFdZXl1jYmNhY2ZpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNHR0VIR0hLSUlJREZLS0tGRklKTktOTEhMTkhIRj5HR0xJS0tKS0tJR0VJRENEREJGSkRASkxKT1tjWV9eYV9SVFJXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV5eY2FgYmJiY2NlWlFZVlVcWl1jYF9fY2ViaG9tbmxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLRkNHRUJFSElGR0hIRkZKR0hGSEtJTERES0pOTUxLSEpKSEpHP0dGTkpLS01LS0tJR0dDREBEQUhJQj9JSkhPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU5eUU9cX2FjZGNjYlxkY2JkY2ZYUVVUUltYWmFfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0VLSkZGRkhHR0lGRkZJTEpORURLSkxOSkxJS0pISUZCSEhRTUtLT01LS0lIR0VEP0VDSEhBQUdGRVRdWV5YX1lfW11VWFhQXV1RS0pWXlheW11WWWBSUV9fYWJhYGJiYGNiYWRkYlhPUVFRW1NbXV1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0NBR0ZER01SSENRSkZISEhFRktKTVBFR0hKS05MTElMS0lJR0RIS1FPTU1QTE1LS0hJQ0RBRURIR0JBR0VDV1VFXFReU1ZfWE5UVU5aW01KS1RgYVtfWF5eYV1PWWJcYGBfYmNiXWFiV19fVFBOT1BYUl1bW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREVGR0RJUmJQQ1ZeSUdHSERGTUpQUEVJSUpLTkxLS01MSkpHREpNUVFOTk9NTkxOSEtBREFDREZEQ0FFRkJNSEJLTFBPTkxGTUZHSUpIR0xMTU9QSUxPUE9TUExRU1JVWllXWVhYZFdPU1RQUE5NT1VUW1lZW11cYGFkZWNnY2tscHNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHR1hNR0hKSEdNTFFRSUxLS0tOTlVOT0tLTEdGS1BTU05QT05PTk9IS0VgRURfTERmY0VNW0leW3JtT01VbVlMQ1BgVWxXZ0pdV1VeRExRVUxNVFZRUlRYV1RYVVRcVVBmWmhoZFhTa1NWVlVbXFtgYGFhYWJgZmhmbmxocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09TSUtGYFRISk9KSU9NUlFLTUxMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUH9RSXxZWXJzWFBtSHFub2FWUHFxc1BDa3NtcXRwU29fW25YXVZcWFVraFVdVmNaYFlbYFZVV39qdHV1X192X1hhXFxmW19hYWFhXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1OQkRMTEZKTEZRVkxLTklLUlhXUU5PT01RVE5PUVBLS05HTVBTW1pUUVJPUFBQSkhaeF1UeGVoWVJUUXZndGxwYm5malFyT013bWpycHNycXJwb2+AXWZ6dXhxcXpxfnN9a3V9YlJnfGVzc29zcnt8b315b39yX2BgYmFaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpQTk1NSk5WXllVTFFTTllaTVNTUk5MT0lRUlRZV1dQVFBQUFFLR2Z4bGN4cm1aS01VeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JSaXtsaWp6en1seHp/b2dvWHZ2anV1cIBgcmd9aWx4fG9eX19iYVtdYmRnaWpkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3V6bnx9eXhybk5LU3ROQ0JFUFBISktKTFFPT09NUFpgWlhLVFdQYV5SVlFZU0xPSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VEtoeH14YHl7c25hXm1vY1JncXVubXlwd2x2dHRxbG1cdH56a215fGt0bXxrcHZ1eF5fX2JeXV9kZGlnaGVlXmFiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0cm9tTExbVkhHRUdSUElMTUtMUVFRUFBRV1xZVU1VWVVmWFJSWV5UTU5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUtXa2h9bG1seGBbcHp7XmB6c2Nyb3hxaGV8aXJ8XVRLbGB2dWtpdnx7bX54a3xwXV5eYltfYmRkZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmxnbW1yfGttaGt7dG1ta21PSEpLSElJSFFQTE5PTEtTU1NPU1JXUlZUUFdbVlZUVFRhYFBOTktUU1NRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFhRTlBVVFhYWFtbVVJTV1tXWFdaT1NVV1dYUl1ZV11WVE9ZUldXV1hZXltncl5bW1lcXV9jWl9jY2RmZGNjYlpjY2ZmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0xMTUtKU1FNUVBPTFZVVFBUVVhVWVVRWl1WVVRXVVlYUE9MTVZUUU5VU05PTUxRUEtKUVJLUU1LS09SVFJRUVNTSUhMTk9RUlFRUVRWUlhXXFdTU1BRVVVWU1pRT1NSV1ZUWVZUWVVUUlVUVFRXWFddWl5hXVxaWlxcYGNcXWJjZGZkZWRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmVmbXNkaWhra2VkY2ZoUEpLTE9PTE1TUE5TUVFNWFdVVFVXV1daVVNcYFZXVllVWFRRUEtPV1NQTlVQTlFOS1NQTU9VVE5RTk1OUVNQVFFTVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXV1dZW1RPVFVYVVVaVVdZVVJSWFZVV1tZWl9dVVleXF5dXF1gYV5bYmJjZ2ZkZGJYX2BiXWBoZWZkYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FaWVhXWFpaWFlWXGpkVlhZWldWVFRQS09WVFBPVFBQUE5NUVFQUlhUUVFPTU9TVk5XUlRVVU9OTVFTVVVUVFJUWFZaXVxaVldRUldYVltbV1FUVlZWVllUWFdUU1JYVlVaXVldX15WXl1eYFxcYF9fX1piYmRoZ2RkYVliYGJeXmZjY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZWJkX19gXFBNTk5SUU1SUk9TVFFQVVxaWldbW1xZWltkcW1oZF9bWVZWWFFMTVZTTU5ST1FST0xQU1JVWlVTUFBMUFdWUldTU1NYTU9QUlRYVVVVU1VZWFteXVtbVlJPVVZWW1tXUVRXVldYVlRYWlRTUlpXVlxeWl5fYFVhXGFhXWBiYF1gXWNhY2doZGZgWWNgYV9fZWRfYGNbWlxbXFlaWFlXXFlcW2BeX1teXmFgX2JcWWBaUU5PTlZRUFRST1VUU1BXXF1cWF5cX1dcXmpxd3mAY1xbVlZYUU5PVlNOUVFQUlRSS1FUVFlaV1VPUk5TWFdUU1RSUlpPUVNTVltWVldUVlpYXV5cXF5WU05UVVZcXFZSVFZWWFlTVFlcVFNTXVhaXV5cYGBgVmJbY2JeYWNfXWJhYl9kZmlkZl5bZGBhYGFjZV9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVJRV1JUUFtdXl5bYFxgVVxdaWpyfXNsZ1xVWFdRT1JaU1JRVFJUVVRLUVdWW1laU09TUlZWVlRPVlJTWlJUVVRYXVdYWFNYXFheXVlaXVRVTlZXV19bWFFUVVlZWVVXWVtUU1ZeWV1dYF1iYl5ZYFtlYl9kZF9eY2NhXWVmaWRmXV5kYWBhYmNkX2JeWFpfW1xbWFhYWFdbWlxgXFtbXFtYWlteVl5ZXVBPT1JaUFpUVVZWVFRUXl5gX15iXGBVXV5ia3l1bX1sWlVZVVFRU1xUVVRVVFZZV0xSWlddW1xST1VTWFZWVFBYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUldSWVhZX1paU1RWWllaVlhZXFZUWl5cXmBhX2RjXF5dXWVhYmZkXl9kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfYGFhYGNdX1RdXmJlZXaCe2hYWVlTVlNWXFdXV1ZWV11YUFVdWl5dXVRSWFNXVlRTVFhSU1ZUWFhYXV5YXVtWXV9YX19YXVZRWVRZWlphWVxVVlhbWltYWVlaWFZdXl9eY2JhZGRcYlxgZmFkZmRfYGRiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlNcVFZXWVdWXGBhYmNhY15fVltgZGFfenVvaFlcWlVXVVdbWllcWVhZYFdQVl5cYGFcVFVYUFVXVVNXVlJTVVZaWlxfXlpfXFZfX1pdXlleVlNZV1laXWJaXlZXW1xbXFtbWVpZWV5fYGBkYmNlZWJkWmJmY2dmZV5hYmBjXmNjaWRkZ19nXmJiY2FhYF5fWFRaWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNQVlpWVlpVWFVYV1hdX2JhZGFkYF5ZWWFkYmBrZmheXF1bVldYWVxcXF9bWVtiVlRYXl1hY1xSVlhRV1ZXVldWU1ZUWFxcXmBgXWFcV2FeW15cW15YVlhYW1tfYFxfWFldXF1dXlxaXFhbX2FeYGRjZGZmZmJZY2VlaGdkXmNgYGVjXWZpZGVpX2deY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlJXWVZXWlhbXFhXWV5gYmFlYWRhXV5ZYWNiX2FgYV5cXFxXV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBYV1hZWVdWWFZdXV5gYWBfYl5ZYV1dXlldXllYVldbXGBfXV9aWl5dXl5hXFtbWlxgYV5iZGNlZmVmYlpkZmdpZ2NfY15hZmRaaWliZmljZV5iYmNhYGBfXV1aV1tZWVhYWlhXWltaWVdYVlVbXV1dYGBiYnhMV1dcWVdcW1xdWldcXV9gYmRiYmFdYFhiY2JgY2FiXVtcW1hXW1xfXWBfXVtgZFxcWFpjZWNgUlxZT1hYWltaWVhaWWBdYGJiYGFjX1xiXV9dW15eWVlVWF1eX2BfX1xaXl5gYmNcXFhbXmBiYWNlZGdlZWZkXGVmaGlmY2JiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVtZXFlYV1hZWFdcW1pXV1hQWFpdYWNmZnJrf0pZV11aWl9cW15cWF1bXl9hY2JhYV1iW2JkYmBjY2JcW1taV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pRWVhcXVxbWltbY2BjYmNgYmRhYGNeYFxeXl9aWFZbX15dYWFfXVtgYWJlYl9dVFxgYGNkZGZkZ2ZlZmVeZWZoaGdkZGBbZmdeYWhoY2hoZmNgYmBjYl9fX11dXFpbWVhYWFZaVlxaWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t8fHx8e3x7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnd3dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7fH19fHx8fXx6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoKDgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29wcHp+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmJiYyNjY2NjZBGKCoqKioii9vS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29veoB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyNj5CQkJCQlDsWGhoaGxCP7+Xl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXV2d3d3d3d3eHl5eXl5enhvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH19fX19fX19dnNzc3Nzc32FhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5d3Z2ent4e3h3dnh7eHp5eX16eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t6enp8fX19fX19e3p6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx8e316fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3eXx7fnl8enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3d8eXl8enx7d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en97e3x7fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5fHt6enl7eXh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnBwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBxcXJycXFxcHBwb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXB1cnBwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXpxb4t2b3BwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFxjXNzmHhwcXFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJycXCXe3agf3BycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdJ+Ce6SHcXR0c3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en58fn58dnZ3d3Z1eHp4eHh4d3d3d3h/p4yIppB3fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3t8fX6pkoallXp7e3t5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fX18fH98gquciqKVfX1/f398fH2Ag4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAgICAgoCar6inp5V/f3+AgYB+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f39/gYGAhaympa+mn4J/fn9+fn5/f35/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f4B+fn+Bf36PqZmiqpujj3+Afn+Af4CAf4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GDg4KBgZ+hk5+kmJ+YgICEjoJ/gIGAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYOLi4WBmJ2KnaqbnZqEiJuSgoOCg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYWVm4ySnZOdrpmTnp+fmoiHh4eHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OBg4WEgo2lqqypo52lmZ2kop2Qh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZGPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg5OmqKGcn5qbnp+eloSEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4KChJGXlpidmZyenJqMgICAgH6BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg4F/g42SlpqXm6Cdk4SDgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDiZeIhIKFhpCWmZecn5uIgYSDgYGAgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRj42Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhYSEg4ODgoSOmYuDhYSEipOZlZqckIKChIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhIODg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgY+Mg4F/fn18fYycjYCCgYKDh5KNkY6DgYGCg4OBgYGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiISEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlZeJgH19fX17gZiMgIOAgYKAhImIgYGCgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqHg4ODhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICVn4p+foB9h4p+hISDhIKDg4OChIOAgoKDg4KCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhin+MhX2GiYB+hYWFhIWCf35+fX+DhIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDipGDhIuFgoGBfn2Bh4aDgH5+f39/f3+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFhoWFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9+fX6FgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoaGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4mIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgISEf35+f4B/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4OBgICBjImBgIGCgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYmLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+QjoqGhYaFg4GBgoKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCgoKCgoB/fn19fX1+fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX5+fn5+fn59fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeGiYmDg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaDgoKDhIKDg4SCgYKBgYGDg4SDg5GSkI6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoKBfn19f4B+fn5+fXx9fXx5fIOGhoeEg4GDg4SFhYWDg4WEhISEhISFhIKCgoGEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4J/f4CDg4ODg4KCf31+f4CAgX99fn59fX19e3p6foSEhIKBgYCBgYKCgX9+gYGBgoGDgYKBgoKCgYODgH+AgIKDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDg4SBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn2AgoODgoOCg4J9fX5/gICBgH59fX19fn18enp6gIKCgX9/f39+f3+Afn2Af36AgIF/gICBf39/gIF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foGDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gICAfn9+fn59fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhISCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7gIB/f39/f35+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn59fHx9hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDgoKDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gYCAgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf39/f4GAfn9/gH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KDg4WDgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXt6eXl5eXmAgoKChIOBgoOBf4GAgYGBg4KDg4GBgoCBgH+AgYOBg4KAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fImTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYKIhYKBgYGCg4GBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjISDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDgoODgoODgoKCgoOCgoKSkIuIiYeJh4aGhIaFhYSEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaGh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKPjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgoGDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWBhJGSjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYB9ho+Bfn2Cfn5+gIJ8fH9/goCCgH58e4qCfYB/foGAgICCgYKAgIGBgH+LlI+Mi46OjIiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIKAgX5/gXx+fn9/fYCCgYCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSSjIyNjo+KhYaGhYSEhYOCg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYODf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/fn+MkY6MjY6NjYeEhoaFhISEg4KDgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIOAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19fn9/fX6Afn9+hJKNjIyPjYuKhoSGhISDg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fnx7fHx8e3t6fX6AgIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaEgoSDgX+Afn+CgoJ/f4KCf4CLkI2Mi42LiYeEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gH+BgYB/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBf4CAfHx9e3x8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6ChISCgYKBhYaFhYaGh4WBhJGPjYqJi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/gH9/f4GCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f359f358fHx8fH18fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJiomKiYWIko6MiImHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDg319fX19fH19fXx9fnx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uKiYyRj42KiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEg4GAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3t5enl5eXt+f4SDhIeJioeJjo+Ni4mJhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e318fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiOjYqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOBgICAg4F/gIGEgX5+gH9+foB+fX5+gIB/gX5/gH9/f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHx8fHt7e3x7fHx8fXyKioiIhYWFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgYB9f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx6fHt8fYmHh4WFh4WFhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIKAfn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4OEhIWEhIOEg4GCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFg4ODhISDg4SCgYB/gH+AgX59fX6Afn5+foB9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn19f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKFgIOCgoKDgoOBgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Ag4J/f4OCf3+Af4F/gH98e3t6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fHx/fn+AfH9/fX2BgIB+fX1/f36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYGEhIWEhISBg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIGDhIKBgIGAf4KAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF+fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICBgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAgH9+f398f39/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+fn+AgICAf4GCgYB/fn+Bfn+AgoKAgYOChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1/gICAf39/f3yAf3+BgIGAgH98gH9+fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgX+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAe4B+gIB/gYGAf32Afn5+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDg4ODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH+AgIB8gH+Afn+BgH9/foF/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3fHl3eHd3eHt7e3t8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzb3h3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB/f399fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH17fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHt8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5dHV1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBf4CAgICBgYGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg4B/goGEg4OEgYGDgYKDgYGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/f4CAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGCgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICDgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fX97eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGCgoCBgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCg4SGhIKDg4OEgoSDgYOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfXx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SChIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhIGEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhIWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4OEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhIWFgoeGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeYN/f39+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fn99foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISFhIGDhIWDhIWDioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN/g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgoKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1ud2xweWx1fX9/fH6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWHhoaAgoWDg4WHhoOFhYWGh4eEg4aGiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99foGAf3t/fnyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmlveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSCgX+BgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhISGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYWFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG52goGBfn5/fX16fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WFhISFh4aEhIWGhYV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIaFhIWFg4aGhYaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH57fHx9f358fH59gH99f4B+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aIhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhoWFhYWDhoaFhoWFhoaFhISFhYOEh4WDgoKFg4SBfoCAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaEgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4OHg4SBgoSEg4KAgIB7e359fHx8fn18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WGhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaFhYeFhYeFhoWGhYSDhIODhIeBg4CCg4OCgoJ/gHt9fn18fHx+fXx9fXx+e3x8e3x8fX17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhYeHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH17e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhISFhYWFhYSDgYSBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYiDhIaFhIaGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhYWDgYOCgIOFgoN+gYGBf4OBf35+f31/fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GGg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB7e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SGhoaGhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYWFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhYKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhIWFg4WEgICDg39+f4B/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7fH19fX2AfX18fH2Af318hoOGhoaGhYOEg4aChYGBgH9/gIB+f4GCfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhYWFg4SDg4SChISAf4KCf31+f35+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SFhYSBg4KDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7enp6eXp6ent8eXt9e3t+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gICAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vKysrLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1NTV1dTU1NTU1dXV1dXV1dXV1dXV1dXV1NTU1NTU09LT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0NHQ0NDQ0NHR0dHR0dHNysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fV1dXU1NTU1dXV1dXV1dbX19fX19fX19bW1tbW1tPS09PT09PU1NTU1NTW1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzZaEhoaGhoaHh4eHh4eCsuLd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi60dPT09PT09PT09TU1NXJu729vb29vb29vb29vL/S0tLS0tLS09PT0tPT09zj4uLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E9PkA3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5uUFNTU1NTVFRUVFRTTKDz6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6Oip8/T0tLS0tLS0tLS0tLUv6iqqqqqqqqqqqqqqqiw0tLS0tLS0tLS0tLS0tHg7Ovr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zOcVRYV1dXWFhYWFhYV1Ch8enp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSko6jP09LS0tLS0tLS0tLS1MGpq6urq6urq6urq6uqsdHS0tLS0tLS0tLS0tLR3+vq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7PDw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNznheYWBgYGBhYWFhYGBapO7n5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamsz9PS0tLS0tLS09PT09XCra+vr6+vr6+vr6+vrrbS0tLS0tLS0tLS0tLS0t/p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3HxcXFxcXFxcXFxcXFxMvQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Pzs/PzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tTV1dXV1dXV1dTT09PU09LS0tLS0tLS0tLS09PS1dTU1dXV1dXV1tXW1tbY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz8/Pz8/Pz8/Pz8/Tz8/OzM3Mz9PS0s7Nz9LOzs7Ozs7OztPU0M7R1NTTzs7T08/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXU1NTU1NTW1dbW1tbW1tbW1tfW1tbW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztCmksXUrYODlc/SpKHQzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPTo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztKqnayVw5u8uJm0s5+hqdLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q+QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DJl5mFpp+ojoCNxZ2YlZzI0M7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PD06Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0aSwvZqMo4ms1rqYop2wstPPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Q1bmbi6utm6WymZavs6rV0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P0NGaoKWknJankJqEnZOk1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NWnpKDVpLSrn3+gqYWZpNXR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NLAnaLI18rZwZyAvK2mmK/W0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPUpKCPucOPoZ+fmaiWmJu71dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HIxqa9lZOTqKuin8Ogq6Sc0dPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQT49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg1MqOk5eQqquNj6zYwo+NvNXS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGR0tIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLUwq+ws9DWwL/W0tXFxNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dTW1tbS0tXV09PT1NTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc3Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2ODk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Slpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIFza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioaCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpyenZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYm5qZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6Kkpqempaampqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5qdmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjntqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo7PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6OjpKKhoJ6bmZmYmZmZmZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/OzpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoaGfnpybmpqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampuam5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56bmpqbnJ2cm5ucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmpmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZmanZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmYm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmJubnJyhnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQlJmZmJWbppabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhIyWi4yKkZyLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZCOloKMfo6SjIiFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32GjZmbkISMe42Kj4p6fX2Gjo2Kho2UkouQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouGiIWEiIiJhH+Cf3p8eomVkZCChWmGhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6JkIt/h42Mi4qHkoqHho2blouRiH9fhoWIjI6LjoqJkI+Oj5SUmJCVnJqdnqiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVWJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampmQnaCdk5eaoJmdm6KhlZCbrJGTm5h7WYaPiZGRjpKOi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6qpr6GaoKyKjqGfdlmDmY2YlJigoKGknpuapaekqauvrKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66vqqqrpKGipKmnpqmooqakhYano3Rbc6CZnZifoaKpp6Cioq6sq6qnra+opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKelp6mnqaijp6aZnKSmoqGhoaGlnIKCoaJyY2aZn56Wn5uaoqKgoZ+hoqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXFBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6yppJ+ioKKmoaaupqadn5+fpZKAfp2dcWhfjaKhm5yanKCeoZ+enqCjmZabmKSioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjXnNfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirsKmoqqihn6Cnqa2wsq+so6Kmoa6KfH6lnm9qXISkpaKenaCen6Wiop6fopiVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltaYF9aXFZcaGRuY25qaWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu5g3d9sqZsaVh+paKjmpycl6KopaGfnqObnaGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eWpiW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0uHpycbCvZ2ZUgaWen5aVmpekqqamoaSjpKumpZmhpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odWtxaGlpYVlTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCxtLW1vLy+vLy+xrq4t7q9tK53bmWst2tgUo2tpaWdl6Skp6ikrqSrq7W1r7Ogp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFpYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsLDub2/wMC9v8S9vLq9vrapfnVporZ1YFacta6uqqqnrKenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5rY2Jud3V2bmxbYlFWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr63pol+fZWjhG1qqrysr6+0qaqmqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbWZudXFydXFnXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PJsJaIe4aMkYl5gKG4sJ+asK6spK2wtKeqqaiqrayppqWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3RrbG5kb21pcXhueWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+8u77EvsXIxsbExMS5tMC3tLvFy52CeGZ2hIZ8bHyGpraqmaK3sKawu7WsrqWko6ikoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ4c3lmZl1kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GycW/w8DLzc/Kx8TDxMLEvri9yr2JbmFTYn1+aVVncI2zqp2mtLOsssC1s6ypo6GtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVmaWpoXWtvbnh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczOz8/Mw8fGyMnIx8rOysnHyMe/xsukeV5OSFR3dV5EWWJ5p7fAvr65rLnBurysraaqu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aGppdG14bF1kW1ZgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzsfMycLCx8HM1dfNy8rOxcm8imtQRT9OcGhYPU5cbJXEzMbGsJm6xLu+tLCwsMG+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVudGJdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8S/v77Ey8jKy8m8vMjGydXb1c3JycXJp3ZaTFdFSmhdVj1JVmN7vNDGsJCJucK7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVmY2pkYmptbm9eWVxWVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIycPL2dPIw8LBxqJpTGKVakhhVlhBTVVeaa/WvZN2hby6u7u+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFjZGRqY2djW1paXFlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba4tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ytHBvc/TvLS8vb2ubEaAvo9KYFdaRFRfW1+ixqN7aJPDt7u+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWNgYmNoamdnaWZpXVZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tbGwtbe1u8G4vrm/vLy3tLevrre1ub+7wtaLur/C2bmhpa+0uHdJg6uOTGhlY0JVc2BXkZ+CbGWoxr+8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeHFtZWVmb2llbGhYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vNDEc6nLvtzNmo+WorCBTXF+cFd/eHFOVoFlVXh2a2NuwcbFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfGtucGdwa3NmYm1gXFRJS0pESkJDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC4u7K9vrvEtrW4tbfAvsS8wsTYq3B/vMjU3rKEhY+ZfVVjZlZymYJ+blV0Y1pjYmFchdLHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHJmbGludG54Y2diXGNRS1RIRUVDSEM8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLm9x8rKw8fJ0pRsca3R0NvUknZ8f3ReYl1OlaWDhIlUXV1cWVlYYarSycfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9jXmBhTklNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8bTw7q+vMS+t7zAv8nQx8jKysCCbm+jy8vP4LhzamtnYGBXVaihgIOSXlhZVlFVUnnGy8nDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIem1td3tfcGNbXl9fVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8tru5qtvDvra+wL6+t6KYpq+zwsCjdHJ0mcTHytbXhldVUU9QRVufkXmDiWdaVE9OT1acycvGwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnpuc3hzZ3BdW15dWVJFRENNSUFFPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vGtWyrzby1ucC8p3psZ25qcn+Vlm10d5W9v8bB1ahVQkA+QjlaiX1xf39pW1NMTE52t8DBwr6/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f312bHV7cG5pW19fWlNQQUZIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnAzrF2gLK8tbbBoYVpWl9fTFJbW21ucn2duLfCuL27c0Q1NTk0UnJqanNwZF9XTEtcoMC6ube2wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3V2d25xYF9mXVtUSj0/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsqmhHeKoa+0mGhjZlVZYEpKTVBUanOEo6+3vrmztp5oNzA1M0ZdVV5kYmBiXU9MdrS/uLKusry6rru0s6arqK26vrjLwr++rKuwr7O7t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYlteT0hCPz1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/Gp4h7do2hlF5TQllUSGJsV1BGSWOLn6qvtrq1tLKtlFAzMTFBUEZRV1hYYGBQXJi5urStpayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybWNdZ1hcXVJOTkE+SkJBSklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4v7OQgXmIjmtOSkBoWEJPd4OWbExCV36wtLO1srSvrq13TDAwP0U7RVZXUVhdUXywsrGsrJ6kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c210aWxdW2pUXVxQTUhERkxCRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7i1lY2JhHlWRkFSiFdKSlZ2jIBhP1WnuLO0srCxrbC5pHtALT5ae5enopJzVVqVq6yro6egnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVWFjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yu6mYmZVoTUBWem5PSUlMZpp/V0VVr7uxrLOvrqyttbegZmeTqaefmpueoH93nZ6nqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKurn6ajm6OclZCMj4+Qk5CXlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3pjd2xuXFFoVFBOR1BNTEJPUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3Bqqa9ZEVVooNQWUlLYUpYiWNmZoGstaqytK6qqq6wrauwp5yPlpGNlp6goJ+ao6SfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6aqsaOlqJ6gnJWTkI+RkJiQlpWYl5+Ym5mbpJmXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dn1ta3tkaFVRY01KSEdPUk1KTkc8RUA8MkA4NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaCsxsDKmk5Cd51uT29LTmJmdXJgX2Z0jbCvrrO1qqarqqKcmJKMj5SVlpeanqKhm5yknpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmpabl5eYoZ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3h8ZHl5YGJSVWBISUpLU1RJUlBMOT9BNjc8NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpcbGiFdSS2aiXml+cnZZUmtjXWlmZWqLtLCwuKymoJudmZSXmZiOjZCUkIqNjZOYopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKwtKqyrqKZnJ2eoZmbm5qYmZuUlpuWmZyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1paTVFKT09VTFNMQTc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp+qo415VWxydXVtYnVyWFlgX2RpXWBYYqyurK+nn52hn5aQk5ufmpiWkZKem6Gjm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7itsrSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqOhoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWp3dV1sWlJgSFJVSEZVVkpCTEc9S0g4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCjfm+BbmBkV01bUlhLS1FXUUlST0OXrKqppJ+emJKSk5iXlZSUi4eKjZSdnJ2dnpeemaafoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+np6Wkn52qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cm1pdm1obVxYXENXTkpHTUdDRk08Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOfnIhhV19mYFZNT0U8Pj9DQz49QlF3qK2pqqWfnZ2io52fnZmbm5OSlJOdnZiUhZ2aoJqrpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsS9w7y3s6mzraqzta+zrqqvo52rp7axraKwpqGjr7GtsKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhoF7dHJra3RycWhWXFFGVEhESlBJP0VBNEZIOTU7PjY7PD49PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfn5N7YF5lX1BFRTpEQEY8Pjk2Tn6qs6ejo6GgnqWrpZ6XnJSRmZ2YlIyKhoiGeG2IoKOiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr7HxsK3xMrJw8HGvrq0urq1u7ewtbKqurKuu7e/u7qruK2rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrY2hveGtlWltGS0xFRFNNREJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdnJl7cmlgVU5EPkpcfXBiQT1cjq6soJmbm56emZeXl5KMjpaXk46NkIuCg4J3cnFtcI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxczR0tXO08m9wL/Du8bFyMXR083T0NPTzMrCxcbGysjOv8jRzMfGx8XBvMPBv7+/tr6zrr/Aw8PHxMfErr+4sri8w8LCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MREVQSURDQDU1NTg6Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ6VaGRbU0hEQD9MiqGpmoOgsq2jnpyfmpeWlJKUlpGQj4yHg4OIh4OAgYGAeXFyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fS19LV1tPUyMzGzM3J0s3O083FyMrKwcbLx8nIxr/Ds7PIxMvLy8/Hyr++v73Bx8TMzMjJwMO/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxBPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hm2JTS0lEQj9EVrPSvbKwppycnKCkoZ2alJOVlIl9d3BrZWJocW9xe4WKgHVwbnF0cIWzw77F0dDX1tbS1s3U1tfU09HT1NTTz9HD0NPW2NXW0svJztHLxs3SytLV1tnW19PX2M7Sys/RzM/QzdPQv8jHysTMzMzOz8XGx7a/yr/SzczQxsnIwMTDyM7N0NHPzcrIzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGRyYl1SXElKR0FFSUo+O0E4PTQ1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoqBZSUBBREBHUXmyrqealJefnJqgoJ6bnJmViXdpY2BfX2BfXl9fXWJsdXRwcG9scnF1ksTIxtTW19fX09bQ1dTa1NTOz9XU1NHRzNHN09fW09XQz9LT0cnT0cjQ19fY0dfS2NnU1szPz8rN0svO0MHGw8jGzs3R0dLJzM3AyszG08/MzsjFysfHyMzK1NTR1c/SzNPCucWxpai1rqebqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpq63qKu319TV2dnRztC/vMzJtr6upqqooaOrZUM4PT5FWIKqqJ+YlZeZmpyfnZicnJJ9cGVjYl9fYV9fYWBfYGBfYGZucHBua29yd3eczMHS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHF0dTK0NTV1s7S0NjY19fLyM7Eyc/NyszAysDIys3O0MvQzs7Mzs/Iy9DQy87KwsnHyczLzNLTzdPR0dDQyr3IubCuu7i1qrawrai4rbO+u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1YRTtAPTMzPD04Nzg1NTs+QD05PDw4Oz45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HAsKmsramksXpKSEM9WIyhm5WTl5uenp6ck5aXlIhrXl5eYWRiYGBhYWBgYV5fX15cYm1yb29zdHZ2eaS/zNXR1tTT2NbOztTLzs7FzsrS0s/Hzs3N1MvO083L19bQzNHUy8zQ0tPKztHU0tXVysDKwsXMwsjJw8zDxcjKys/KzczQztPMxsjPzMjHy8XGwcbKzM3Q0cbQzs3NzM/Fx8G4ub3Dw73DubKyvrG7w8O1qpiloZmWkZWVkouUjZqRlJSPj5SCiYZ5cXJrbWdgYHBoWVhoVkxGTElQUEI7Qz47Njc6ODo6NTc9PUE8Ojw8OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWvtKifrpV4b3N1gpKZjYyXlZCTkZGVlpWQi3xlYWJiYF1eYWNiYF9fYGFhYF9dW11ncnJxcnNwbXJ5pcfTz8vQz9PUysXJycbGv8PGz87HxcfNytLIy87OxtHS0M3M1MrHy87PyMfP0svRz8a6xL/Gyb3Cx8nOxcLIwMfNyMTMyszPyMTE0MjGwsbIxL/Bx8zMzM/CysvIx8vQxMXHu8fDyMnCz8G9vL+wwcnGub2qsbKnpZ2inJiQm5CjmZeZkZWYiY+Cd290ZGtgXmZwYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLrNzcbQ1dXZ2tvY0MnPz9HTyMK2u7uto7Z9aIOEpauTjY2Wj4WDg4OBfYSEfnNgW15eXmBeYGNkY19cXV5fYGBfW1pcYGtycm9va2xvcH250cjJys/LzcS6wMO7u7q6vsnGwsPAw8jLycjKyMHFzMbIy83JxMLKycHCzNDFy8i/ucG7xsi+v8bPy8O/w7vJx8i7yMbFysC9wsvGxcS+xr28wMPFzMXFvMDKwsXH0sXAyb/KycbIxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhpZujoJuUe3dydGZpWmFubFpcWFJETEZCR0RMREZTQDU0MzM0Pz0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+sa+1bF96fqSQipKWhnqAhYV/dnh1cnBfW1tdYGBiY2RkZWRgW1xdXV9eYFtZWlxib3Jva2lscG9zj8e9ycXMwMbCsLa6srKzsrHCvLy8urjBwcHFvr25vb+5xMrFxsK9xsC4u8TJv8HJu7e7u8bDv7zBzcPGvr61wb3Dur3Gu8O6s7zFxMLCt7+1tr6/u8zDvLW6yLq/vsvEwcbCxcnGycbQxsLMx7LHycPOzMHFw8C9s7ewsqeoqLmwpa2wqq2slHp2d2pkZ2Bob2NXXllKRkpGSEpBRUJFSUA5OjY0ODg1NDs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1tfNys/FycXHwbnFvautpV9ldYaTi4iLhHh/hoZ/foR7dHRjXFxdXmBgYmNhYWRlYl1cW1xeXF5dWltcXmhzcW1nZ25wcnmdvczAw7rAuK6wsaeqraynuLS3tLOztLu1vrK3sLWvsrzCvMHEvMC7tbK6vsC4x7m0u7bBwry4vcbBw7u1r7K2ur+0xLe7tau4vb3AvbG6trC2urPFvLauu7+1t7TFvL7DxcDDxcbIy8XAxsa7x8vAz8nHw8bCw7fDvb22ub7Hv6y1urW3to55dHhnZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjKyMrJysTQzdLPzcXHwcXAv7q3ybaqsJlbaXGMj4WIiXp4foaGd3eBfHNoXV1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaGZrbm5yfKTHv7m4tbCrraeeoqmnnquts62qrKm0rrexs6mupqyzvLq2w7m6urGrtbm7tMK6sMCxvry7trvHucK2raqosLLAtri9sLGosrO1u7yrrrWmrravu7Kwqrmwrbuuu7i7wMC+ucK/x8PFwLzGwsjKuMXHxb/HxMO6xMbCu8bJzMuzucK9u7OJc3Z2a2lhYmxoWVhXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj49OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXQx83Bw8a/xMTDw8rCycq/wLzCurO0tcOuqbCRW2p/koeOj3t4fYmFenuEgHduXl1cXF1fYF9fZGNhZGNiYF9dWltaWl1aWlpaXGVub2hmZ2lrbnKBrbmwta6lpKenmqCkoZqcpayupKiiq6qtq7Cjpp+qrbW2sb25r7evqK64tLS8uLS8r7i5tbK8wbLArqWpo6uxsrOovaqrqKutrbSzpqitoaSvqbKmp6iupqi3rLGyt7q6vLG8vb6+xL+1wsHHyLe/wMW3xMO/u7/Ewr7EyMzKv7/EwMCph3N0cmppXWFvY1dWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9CO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HKvrvJtr3DvrrKt8HDwbS2vLaxr7W7rairk2VtiIOHi4B7fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9dXVxaWFlbW1lYWlxfZmtmZGdlaGpvcoWppaulnpuhpZSepZuYkaGjqqOjoKWmp6atoJ2cpKassrC2t6ewrKiqtKu0urG2tq62ubKvurqxtqWgpJ+msaerqLmqpKenqKeyraCnpp+bpKasnp+npKChsa2trLK0s7Swtby2u8HAsrq+w8GyubnDs8G9wLW4vL2+vMLHxMPEv8DEoIN4cGxiZl9rb2BVWV5ITmdPVEhFS0Y8PT89Ojs7ODI1NTM2OTo4Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9tqCelZ2hprq2q7Ozu7PEz8nLwsa4tsfAzL+4ybe7xbizxLizv8CstbyyrKWvs62ho5JpcYaFhoB8eXVzb21qamlwaV5gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1vh52on5WVmqGWnKOZlo2foaOnnKCgpKWip56bo5ugq7CtsbajqaqqrKyktLmtt7Css7Wus7WusKqfnp+jorKkpqm4raKmpqCorKuZn6CemZ2fpZqZo5ybna+pq6eqrKytsbK4r7i5u7C2vLy6q7OzubO+tLaysba1v7a+wL3Dwru6vZeEenNsX2VeZGRYVFddSVdcS1BHSUpHQTw/P0A7PzwwNDUzNTo7OTo4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vDw8++use4uL+3ssK0sbu8q7m6saKeqaunl56QbX6Fhn94cm1vbWtiXmFmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3GNp5yTlJSbmJuil5aRnKKiqJ6cnaWnoqWcoKGbma+urq6yoKairqunorWxsrKsqK+zp7qzpragop6co6Gto6Kqtaqio6aepaajlpmel5mbnaCal52dnZytoqunpKSmrauztKq1sLOrsrm0r6qvsrKzuLOuqayusriwu7a6vcC4s7GUhXl1Zl5lXltZVlNaVUtbUUtJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+znaWjmKWxwrW2va20uMLMyMa/xbbBwMbOt8DEvbO5ubO/trG5u6yytK+fmqSpn5Saj3h/g4R/eG9xdHFoZWNoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqGbk5SPlJeXoJeZlZegnqGdlqChqaSfn6mdm5urp6+wq5ujpLiqoaCuqLaqp6etsaS4sKS3oKKbmZmqpqGarLivoqGknKKfoJOUoZSWlpuYl5aXnJWfqp6ppKKdo6qqsK6otKuqp62zsKWrrrOxsLCur6eoqLKtsbSwvLS6uK6jlIF5dWReYVZZWFNSVEtNXkxPS0dHTExFPUE+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp2nqKOqu8C9wLmutLjBzMfFwsO9xbjIy7LBwsGtvLu1u7y1ubmwr7CqnJmhqJSRiouAgHx3cWlscnRwaGhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjY2JjYmNkZmmBlpOVi5KUlJyZnZaWnKCcn5agn6empKann52gpqCqr6afoqS3qKGhoqi0oqWopbClsa6stJ6hnZWVqaGilK2xsZ+io52emJuTi6GUkZOYmJOXl5iXnqecp6GimqSlpaukpbCnpaOrq62mqa6vrquoqqqzpqasr7Sxr7y1sa+voJJ6d3JlYVxaXVhOTFJIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxuKyepaett7u8wcW6sbm1xMnJwMPGxce2xcSywr/Fq7e3vba9urq1squtqJmYn6OLiXSJiH52bmNhZmloZmdpZmptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVVNVUlVgYF9gYV9hYWJlaoCTk4mQjpSTlJ2VlpekmaCXnaCloq2mpaWjpKOcqqulmp+lsaqgoZ6lq56oop6trKmprq2ioqKVmKObnJCrqbCcoKKfnpeZk4qekY2Sk5aQmJiUnKGjnaShopWgoqSmm6OrpaKkqqOrrqWusqmmpaamtKapqK2ztbS5uq+qrJ6McnFvYFtXVlZSR1FPSFpbT1JJVEtTTEVGSUQ4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTU3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm8sb7DyKyxuMG1u8C7tLSqrKaVmpuciIByiIN7dGlpamxnamtta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV5eX19fYmRtjo+EkYePkI6ak5WSnJujnJuhqKmrqKynqaakmaWvpZWZpa+qoJyZm6Cer5mcq7Ogpaafo6ShlJOblpaSqaqtmpygoaCblJCMmY6MkIyRjZaVkJ2ioKOdnKOVm6CjoZeiqKOiqKugq7Ckrbelo6Sira2qqKuvs7ezvrWzq6+YhXRzaFtZWVNVUkVYTFFbWE1UTlBMUFFJTklCPT8/QT89NzU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzAxNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7auqKivrpupqKy3tqy8yru2v6zLxsW4wc7PyLPEure7wsiwrbi/t7y9u7O1pamglpeYl4d6dIB2d25taG1tbXBnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXV1cXl9gZH6MgYt/i4+Jko2XkZeZoqCboKyqpq+sqLClqZqfraCVlqSpqJ2YkI+anq6XmKiqmZ+dlKWhnpKRkpGTlaeqpZqZmZ6elo2Mi5OGiY2Dj4uSlZGgnqGkmJWflZqhop6Um6Wlp6iooLGxprG8p5+irLWrrqewtbC4tcCxrbGrkX5yc2JWVFVOUkpHVlBSUUxMV01KTE5SR01LQUNGREM+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NzYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA5f7OspbG3qqWisaudqqepsrGktsa0ubqzysW5usHL0Mqxtri7vcHDsa+xt620s7uztKKjnJ2Xl5SDf3drZ2xucW5xanBrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/dYiMhpCKl4mUk5ibmZ6pm6CrpqasnqiaoKack4+fo5uXl4WEkpujkJWjnZaWloiim5uUi46KkJqkp5yVlZebkZKHlI6LgYuNgJCKkpKSoJqgopaUmJmVoqaZjZmkpqimoaC0sqeyt6Gcoresqq6ksrKmtby1rKuxo4l5c21dTlFRTE9DTU5OUEtGTk5KSk1OUUhNSkFHS0hIQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS2sKSnpKqloKimpbOqorLDtbWys8bGt7rDyszGs6y6vbS3wK+tqbCepq26r66fmZqdlZSHe4NuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFtdYW9zdnCEiIKIgJGEjoqUkZSeoY+bnKOipJill6KclY2HmZqMdI2Dfo6XloaRmpCUjo57mY+djIKJf4mYn6OekJOYloWNgpR+fnSKjnqQh5OQkJ2bmpqSlpCdjqOjjomaoKGjpJuitK+sr62fmKW4pqaxobCunLC7qqmvqpmDd3NjVk1ST1BOQ1NOTFFMQlBRSElNUk1ISkpESkxGSko9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKimpaijpqWnpqezp6W0wbiwtLDJxLe5wc7GvbOsusGrrcOtp6Gmkp2mtqyjoI+VlpKPfnh+ZVdWX2dmaWdobmNqaGdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpITlNTU1RVVVZZW11pbHJsf4V8dE5Yco+Cl4aNnZeLlJGfmJ2VlJaVj5aJgJOKXztXb3yMlImAjJKMkIaGc4qFl4F5gXuGk52Tg5WOkZCDhn2TeHFwhY19iYGRjY+XmpmTi5CJnYifmIiHlp6aoaCXp66pramonpats6KmrZmsq5ios6KpraOTfnJuYFtOU1JXTERUSlBMTEZOT0lFTFFNS09KSUxQRklJPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepqKOqsKintMG5sLWwx8K3s73Pv7mvrrXCp6rFqaOdmIOUm7GimpiGlI+Lh31zdV1QTFJVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1vaXuCdFFCQH+VkpF9iZWNhIqNm46WlYmSiIaVhnmJf2BKUW54i5KEfYSNioV/f25+f5R4dXZ4hI2Zb1GNiIqGe354lHZnd4aIfYqJlYuNkZKXjISKiJWEmoyChJKalp6dlKSjqKmlpJ6asKuhpKSRpqqWoqqcoqaoiXVtZl5bSFFRU01JVU1TSUxLT0lIRkpOTE1US1FQT0ZJQzw3Njg6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6OnnZ+hr6GnqKWnqLCtqra8tre3s8G7tqe6yLi2qKi1tqqyvKaelY1/iZOolpWKfo6Dgn14cG5YTUtNTU5LTVFXW1xaWFpVVVZWVldZWVhYWVlYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1KRERESU5PaFlOUVNUVVpug3N2fmppXFWPiZSJdH+GgXyFjJOCkpqLj3uGj4B2gHhzb3ZxdI2OgXp+iquFeXpodnuOcHJteIGLjZJ4eoB7gHZycpJ3aHWEhISFe5WJiIqNi4B/hIuMgJSDfICPmJSclpGenamen6CdoKmlnp2YjKekk6Gglp6fpIByaGFcXUpXUFJHSlhST0pMTVJKSkpMUElMUUxSVE1FSEE8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpmjopicn7Spr6mlraywsqq9tLK7uLa6tLGft7qyqp2drKmosq+hmpGNlICOnI6Rf3aGeHx2b29pWEtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnSCe3hmd42XmI2PfWh5gXZ4gImQfYSYkoFyh498d3tva36tfHOQin97hpKBfX90ZnZ8hmxvaHN9iYyIgGx5cX1xbXaPcWhxgX6OcEOLhIKDhX93d3qLhX2Me3V+jpKPmIqSmpujlpmdmp2eoZyWjYqkm46el46WmJB3b21lYlpYWFVRSlNVVE9QTlBWS05LTk9KUU5IT09MRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKavrK6rqKmxr7GrvLisu765s6ynm7CnrJuPlpylqaSgl5mOhZJ5iI6LinVxfG11cGptalhLRkdFQUBDRElMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTk9RVFhdZXBybIinqsB+dXljfHhvfHmIkHp9i4ZvbYySeXR4amqAgnGWkYuBfpaASZOYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmltcH9zjYmEhnt9fnt2b3RzhYJ5gXlwfI6MipSDlpeYmpCSlZeZl52WjIOJnpGLko2GkJaAb2pub25YVlhUUlFZT1JUVFNYVU1OSE5LTU5LQ0hOR0U/Ojg5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrbCjrKqota+urLS/q7zCv6aimZWkl56NhIuUoaGYmJGTi3OOeoCGjIZ0b3RrcWxkbGpZTkRGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXGCniGKaaXR6ZX5wbX96i4l2goiGdGyakXRzfGprnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtxf3xocXF8bpOOj3xzfXxxcG52bYJ/d3l1anmJgoiJhJaSkpCLjZGUlI6XjYB5iJeIhoqGgJCId2trb2hlWFFaV1lZW01QVVZZWE5JSEVKSkhHQkBGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw1Nzc1NDc4aU84OzVukoiakZmWpKiunrKfp7uvq7KwwrG7w8ealo+UmYuOhnmEkJiUjZCMj4Zxh4J0h4yGenBycG9vZHBmX1RGSUM/PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHJ8eG19bHGDgoWBeoSGhnlyoZV0eIBzdZSHNXGdqJ2OoaGEooR2cIZ8h3xzjK2NiYBnZ2JqbnJtcIN1aW9YdXCOm5J3bH96fW1ybnCAenN2bmJ2g36GgIWQkIqKiZGLkYyLjoN1eIqOgH6DgH2Pe3JwcGxgW1xeXFlYYV9STltaWFdMSEpGSkc+QkFCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBk4iWkZ2kp56vlaW1qq6xrsGyu8HGlpCMlI+AiH1ugZCSiYOKh4+FdYKEbJWIiHt0eHhsd253Y2leSlBHPkA3NDQ5Ozs7PT5AQkVITExMTE5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx3iIh8foWDf4x+dqKZeX6GgYWZhZucYYaqn52Lg5CNeneIfomIjXOKl5CDel1kcnR6fHeKbWhqYnlvhpCCem6Bd3SEenB0eXdrbmldd4d8h3yHh49/i5KXg42FjIZ9cYR/g311d3t8iXdwc3RlZ19bW15UXGdeV1FVWFtVR0pKRExHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIySnJ2fppGgq6CxqK/AsbrFupaOkZSHeoV2a3+MkYJ9ioSOjHiDgHOhhIt9fYF/cIB+emd2a1JXTEBFMjExMzY3Njg4Ojw+QUVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxxfI+Men2Jh36Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkqiHgJiYipt0bXyBhod9jmhnaHh/boWHgoVxhIZHbIB3cnl2aG1rX3d9g4l/iIWLepWdm4mLiJF/enWLdnx4bW93fX90dHJsW11dW2NjWGdmXFVPUFZZUERMS0ZOSUNGQ0NBQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFiJGPlpiSl6GdrKGmuK+zvLOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9Pj9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYCEgoWRk36FiJGBmpWCoaGYlZuapa2Tmruxp7vHw6iLjKGlj5SJgZF8cYOen5Gcf3aFhYqQiJBpaG+DgHSMh4SLcYWCd4d/e3aFfW52dWaAlI+GiYmHiIehqqKWiY6Yf3qCiXp5b2dreH56fnJqZF5aWl1qXWFmYFlPS05XUlFIUEpETkdDSkRCQEREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzIwT4NfND87bnVwZniDe4CMgIGRjoqam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOg4CBjIuCiY2Df4l/bXBqXUJBNC0tLy8uLzAyMjM0Nzc5Oz0/QkRISk5RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2aj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jaGemYSThYKPoZ+TmJKEi4WPmZGWbHB1iYuCloyNj3ePhHFthYGKlpGDhYhyiKGWh5OJjo+WpbWpm42VooOHk4N9f2tqa3yAgYFzYV1jXlpma1xsa15XS0dPUlFOTUxGSVBDRE1GQUNFR0I+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwgnB1h3F2koZ+l5aalZ6enKegqZaTmJ5nZaSafoSSkXmAkoiQkn2KhJiSkYKAgIuNiYWQhoSIhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ1Nzs/Q0VOUFJUUFFRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZyopaKZoZeilZ2fqJ6oq6CorKmqtZerv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGam5mnkZGJlaKamnh6fpSYkqGSlpiBlJ57d5WSq7OIjZeffZSenI6Tlpmkoqa2sJ2RmaiIlo+NgYhsc3J8f3xxaGBcYF5iZ2NgaGdbUkVKS1BPSUpMRkZNQ0hMRkZDQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHVgbn1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJjIqEkoWDhomBgIZ3X2JQNDYwLTEvLC4wMC8vLi4wMDE1PkFBTVFSU1BSU1VSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpOT1FZbYaQd5WLo6eqtL24pK6srKeotKuwtrKyrbuxs76cs8Osu8nLt8O/uKWjsLKsraqji5aYhaamoKOXgaaZjaKqqKSIhZSkoaCqoaSpj5yxi5Wjp7e7m6CjsJOjnaOekaSiq6+ts7WilKSqiJmJkoqVeXp+hX5nYGhcZWJdZGNfZmZfWk9ESUhTT0ZITEZKR0VGSEFLRUNGR0E7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoGThYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5GPg4WAi4WGh5KGgoSJhoiHh3FuYUBFNjQ8Mi8xMTAtLCstMS4tMz9EQU1VUVJTVVVXVU5bUEdHRTw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqscHHw6qzxbass7+zuL62v7TBtru7pLjGqLbJx7W+ubSoo7StsbGbmZKan4mor6ullHafpJehq7GzmZaqraiutruyuqyvtaKxrLG1vLe1rrWgp6ejqJqpsK2yuri4p5u2qYyljpGTn4Z4goN1WWFkVmVhYWNgYWZfW1RJRERMVVFISUpESUdFQUBASkRCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWlFjZFd5dXGBlH2Fh5N2hX+AjHu/u6O8grSUk42bj4SIj5KJiXmGgIyTjYeEgY5/gYmOhoCGiYWKh5F6eG5dVkBFTTw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFZPXlVJS0pBQD5HS0ZFRDs+QDdENz9CSkpFRldUUF6Ppa6jsbTDtrjBzMm2u8S9s7PAt7fBtb+wt3Sxs6a6xaSwxrmxs7G0qKS1tqqxoKKWm6KSpbCupq2rp6SYoKyzuqKpsrq0u77Mv8XFvb2zwre6uL+3ure5rKywprCqrb6wvbvCwqyZuqiUro+Xl6uJfYJ8aldiYVdqZWplV1tkWVZTSUdGTFFHQ0dJQUhEPj9CQktAQE1DOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldUWVVadmpwf4+EgY6EbnpzeYdiuKGZooiVk5aTlJONkJaSh4d7hoGNloqAhIGKenyLh4Z8ioOBioOVfXh6dWVPXGRHRUw6UWNhW15TRj87SFBEWmNRUVlYWmdZVGBgTVNQRUE/SUpIRUZBQEM8RTZCPkhHSkxTWlRdk6+4tbq4yb+6vcnMu7zBvLe1u7u3vbS6scZhdbKlsZqeqr2qpairqqOisrWhq6iflZafmJ+upaempZ+jlKKmsbSnsrK9tsG908nK08bCxcvBysPAvr2/u7y3tK+4t7bDusW9w8iwnrmqoquOpai2iYF/cl9hYl1XYV9oZlJYYVZSVUlFRU5LQT5HRD1LQj1CQD1GPTtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWdsbHGQjYWQc2xycnOI1cC1maCNlZiZkY6XkpaWjoaHfYaDjJaKf4N/g3h7i4OHe4t5gYqCl390fXprZXB1WV1cUGVlYmBlZF1bWFdcTWRtVVJtbV9uX1hnZVVZVUtEQUtLSEZJSEhHQkk5RD9IS1RUVlxaW5K5wLi9t8bAu7nKyrq3ura4ubK3tbSutraZZHWonK1wXqGtnJigopuknqqllKCfkJSOlpiXqJ+ln56amoSknaylqrCst7C9udTRz9fPyczRzM/OysbAvsLKvcG8wcDExMXKv8jOtKS7sLSvm6u5vJp/emxdYFxZXmFZY2NRXGBTUEtDQkVHRTxART5BSEFARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaV9wl5KQlG9sb3V1h7OsoaGfi5mcmYyNlZGbkoWKin6IhoyQi4l8gYRze4qDhnuJdIGJhpV/c3t4a211e2hyZWlsaWZqaWhgZmlobFpudJetpLyIh2dbb2hdWlpUSEtOT0pLUUtUUUhMQUpHS1BfXmJmaWGXt8ewuLO7vbWxxMe1sLmwsLursrGnqresjbannZunmk+anYyOoJaRppillYqTk4mQiY+RkZ6boZealZaHnpqmm6yvqK+ns7TU1NTW0svP1NXO08/NxcLJ0L/KycrJ0cfMzcLQ0riww7zEuaW2usSigm9jXFxeWGFYWWVaUV1XT09CQkhFQkk7QUM+QUc/P0E4O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VXc5CQmIJocW95eYOgqp6ml4ybm5eLjpWRmo59iYuEjoqKi5CHfISCcH+HgYZ7h3KDkYuPfnF4dWtxeH5xe214c2xpgXBtY2lucHhpd3x+y7/C36dtY3huY1thYEpQUlVOWV5QXl1NUE5UUVVUXG5udoJyl624rLOnsLaqrLzAsau1pqS4pquuoau0o46xrpqYmIyRk5GEjpuBjaeSnImDi4SKiYSLg5OVmJeTm5GcmJmZnp6rrKSnoaytz9LV0c3M0tPU0NTRzsjD1NHIzdLT09fN0tHF0tbFwM7Hx8OovrfQnnpvZl1iXVdgU11bT1BUUE5IPkFGQUJFPEBCPkVEPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WGhYp3bHdwfX5/oZ6eoYuNmZOTjIyTj5aFeYWPkI2LioiRh3+Ce3J+gIGHeYR1hZKRiX9vdnJrc3x7d3xzgXdxa4BzcmhvcXp5cnu+y5t+jLKDdnKEdmhhal1DWlpbV2ZkWGVrU1hdXWBkXmN4e36LgZmqpKShn6CopaqwuKqltKOhraGjraKnsZ+JppqUkpGJkY6IgZSJa5WijZmEgIV9kYODk5ati5WNlZmOhZKQnZensKGgoaSkqMjOz8jCy9HU0dTTztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMTDy4tzb2NgX1hUWlNcUEpHSUpKQDs6O0VCRDxCQz5IQj5CQjs7OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJ2VnZSFi5aJj4qIjoePf3iEk5mKjYiIi4l+gnhze32Dh3d/eoeRloCDbnhwbXV/dnh+dIV8eW2HdnRufXaEdXl7nbaMPEGLxqV+jXxpZVZJQ2ZjZWNoamRveFtfZmlrbmlugIOJkYudnqCdkJeYn6OkprKkpLOgoaWdoKmgorGchp6SkpKQi46LhoOQhH6cm4yNg4SFepR+gqmVo4ySipeSi32XipqRqrOYmpunnKe9w8a5tsbN0tDS0MzSy8nUztDV2tfX2NTZ2M3Y287J2trS1b/LzLR4dm9lXVlSVlFaVkZHSklFRT06NzlAQUI5R0RARUNBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGFxcXOGjXyXkZ2LfoeSgomGhYqBh3x4hZaWiI+Dh4WHeoR4cXp7hIZ1eoWOjZx6jHB8b296f3F8gXGDh4Bujnp1d318gnV/fIeIsHRZqcK2jJKCcG5iPV5ocnBxcG54d4FlaW9ydXhyeouHjpSSm5WglYeMk5ugm5+qn6CtnKGamZ+lnp+smYuajJGRjYR9iIeDhYuOn5mTiISHfm2ZeYSYhoiTjI6UjIZ7m4iTj66qlJWXnpinrrW9qa29xsvIyczLz8jD0crU1tjX2NfV29fT2dvW0Nva0dbJ1MuVeXtpaVtaUFJUXkhCRUlJPkE9PTc6PT87PUc9P0FBQURBPj46ODZEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmt2gIhxkZCagHqAjX6CgoGEfoN8fISXjoeLfoaGgHeCeW57e4aBdXqSno2gdo91gnR1gX10gIRvgY+Bb5KEdHyBhXp2hnuJt8alwsm3gZabj3dwZU5mY4F6gXeGopCLeHl3e4N/fIR1bpOWlJWPmJCDio+WmpeXpZyXoJefk5KXo52Zq5WQkIqNkYKMhYmIgYWQkZ6cmYmFi4GGmHqJiJ+Xj4iOioyCfKGJkIu8oZiTl5qcqaalrp+otb7AwLnHyc3Oxc3J0dbW1dnV19vU19na29fb2tnYztzGhnp6aGlkYFRXVlVNSkRORDs9PDw5Ojw+OT1ANj0/QDw/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eot8foB+f3yFe36BkYmEhXqEiHt1fXRtfH2GfnN+kp2RnoOSfIZ+eI59eYqKboKagHSYhX6BiYV8fpB6j6mPkMOgvIyco5x9iYR9iXOMin5zppqcmJSFe4+QiYRoR3CgpJ2Mi5CShYmLkJKVj5yakpSRl42MlZ+dlKGUkY2NkIt+kI6Oi4SIkpWan5+JjJSSnpGCi3+lmYiEjoOGhIClhoqLuJidkZWWoqehnZ6do662urWrv8bK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfct3h4eGxqZFdgW1RQTkdDTEI9PT45OTo6OTk7PTY/Pj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmBjopxcnmKe3p/fH97iHt8e4uHgn51g4Z5c3pzbYB+hH13hZuhm52UkoCLiH+Yh4Cckm6HqIV6oIt8kY6DiIScfpqRio2jop+QpK6gi5GLhYuBkoZXcq2Ln6ubj4OYm5CQjluCopGCjJ+TlYyHiIySk4yUlJSPjI+KiJabnY+VlpGLkpSGgIuIko2JipyWmaKihpKdlqGLioiNnJCDiI+Ag4eFpIaMkLOYnZKUl6GhnpmSnJ6nsbispbzCx83Hxs/M0MzO18/R1K7W1dja2Nra19bZ2p9vfHVoZ1xdWFNXWENASUQ+Pj46NDk6Ozc6OzozOzs/PD43Ozk6MTlHPTozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieG1ifpKDb213i3h5f3qBfIZ8e3eGhH9zcIWCenV2dnSEg4V9f5Kmo5+lopaJnY+Ul4uKqJdyirGMhKeRhJmThZmLopagmJOJm52hkqmvn5GUkI2NiJWLbo23hZrEyLKcoaWbnJiWkLKQZKTNx5aPhYeJkJKOjZOUiYWKioaWmpuPkJSThpSXhH+Pi5mIjZCql5ejo4iZnpabiY+Hl5eKhI6NgX+Hj6WJjZOpmpeTlpmhmZ+Zk52bo7O0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6Ccn9oY19dXk5KVFpCQUdEO0E9ODM3Ozw6OD02NDk6PDo4Mj85OjI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj46RU1GSFJXU1JCY4FGdYKPfXxtfoh4en56gYGDfnZ2gIN8bG6Lf3l8eHh8hIeLfYqjs6ejqrKhlqefpaSWla6ig5C4lZKzmY2hoIylm6+jpJ2YkKeWp5mtr6SXlJaUkIuYmZagwI6kybirm6KmrZiRmpyynYaFqKKcmIWIiY6VjYuTjoiBhoeIk5iUjIuTk4aUmIaEkZCcdJGZspaXpKGInJmTj4qQi5eaiYqWjoZ9jJieiZCQnJqZk5iYoJSgnZWfm6GxrqKkt760xcfEvcPDv8bNysnSp87N09LQ1tjT0Ni7cnl2XGBVX1dQSElORUJDRTY+Ojc2Oj87PDc9NDI2Njk3NzQ9NTw1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1NjY9OkpGREdOW1xZSWZgO0iEi3p6bYWGenyEeICFgX5weHx9fG9yjXp9gXt4houJhYOSp7utqLK9r6Wts7Ooo6KwrIqatZ2juKSVraSWqa23pqSjn5mpmKmjr7CqmpiclJWRl5+Xmbu7rcmgaba4q7CUmJ6jq5OXvqNeqrKCiYqNlIeRfI6OfYOGjo+UlYiHkpaLj5WNi4yXmJKdmbSWlauei5uUko2QkoyZm4qSnpCLiZWgoY2UjZianZOcmZ6UoaCUnJ2lr6ihpbO4q8LIxLW6vbvFx8fC0aHGyc3NxNfW0cvToXB6aF1ZU15ST0ZEPjxDQUI4Pzg3ND5GPDw2PDM1MzU1NDU0QjM6OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGVHYmBicElAi4p+gXOGh32BiHWCioN/bX19fH9wd4Z3jYGHe42PjIaMmarCwK+9xruztMG8tK2rs7aMqLKurryqm7ukqK25uKumpqKho6Oor7Kxq52cpJibmJeeoqWlkaO5rqi/vKytsrmlo6d9iIacrb2wg4uMi5CDj4ORj3qBh5CMjpyIh4+XjYuVl5SRmpadp5qxmpGsnY6aj5KOlZCQlpeOkaCRiZWbo6yUlo+UnJ6UoJ6bmKChlZqep6ekoqSwsqbBx8OwsLq2xcTCvs2nx8PHw7zV0c3Eyoh0c2JcWmBbTUpCTEBFRz9BP0I7OjQ+QTw9NT02PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxmRmBpZ1pdW5OMjIh7h4uGg4x1hpCKgW9+fIJ/cX6BepV6kZSUmJCTlae0xsm/wszBw7nHvLqvq7m7l7K2urLArqXApKuvu7yqrauiop2nqq60sKqbn6qboZuVn7C0p4uiurm1wburqZyypaSolIWNqcPEpIKLj4eIhIaVlI16g4yRjpGhjIyUkY+Jl5+Xk5mVl6agrp2MqpyOlo+SkZWVjpCVkY+hlIaXn6CynpSalKChmaSfmqCcoJSYnqakpqekr62lwMTDrqi3tcnDvrbOssS+xLyz0crIwrV0eW1cWFxqU01IRExLS0pBQT1DRDw1QUQ7OjM9OEIzMzIyNjNBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJmWk1lXGZUY2qZjZeKjIiSkIaJeYaUkIFygHyNf3iHgoKQeY2hlqiampi6vsjIysHSycrCzL3Bs6y7vqe6v728xLeswamssru9qrCpo6WjrK2zrba1oJ+vnqWimKO0vKmbqLzBo7a2r6uSr6yrrJeGmammpZGCjJOllYmBdYqSeYWNkZCen5OPlIuQjZSjmZeclZSjnqmfkaWajI+PkJWWiH2PlZKSo5uVoKKctaaQnpelpKOlnp6mmJ6Vl5ulo6moorKsqLzAxK+ls7fMwLmuxLO7vsK4rMLDwsCYbXlhWFdcW0tLTUpGRERJQkJBQ0s6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djZeOnpKJin+Jn5OEd4V/lX9/kIiKkH+VoZqupqOYwr3Iw8fF083Ozcu7wrevur20vMq8w8G1tryts7+5vK6vqKCop7atramxt5qeraKnoZ2rt7eppa++w7G9ubOnqrSzra6WlqSrp6CRjpKxxaeVjnyRlX2HkZmPqpmYk5OPk5WTpZ6TnZmToaOinJifmYuNkI+eiFqQl5eSlqWZZZijnrKllqKWrK2rp5ufppeYlpmVoaSppp+2q6m6vMS1pbS2y8G4qbassrq4rqi4ur24g2xuWldUVU5GSlNOSz9CSEVESEdHOTVGTTs+Nz5BSi4zMjAyNUI1NVBWTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVzs9QEJGQnFGaUlSZWJMRqWUnJahl6mWjZCDh6aTiIGHgpyEg5WQkJSOmqKfr76uoca9xcTGxs7OztLKvru2sbq7vL7OtsS9t7m3srK1s7izrKacq6u4qqinr7CXo66kp6SktMCwqqyzvsK5wLmzp7i0uLKulaSsrq6ki5OVoY10wZp9lpmEjpaai7GVmpmVkpOZmaajlZ+blpqonJyhoJqLjZCWnWBKlpyalZqlllSWsJ+vnJ+llK+vrKaaoaaUk5mZjp2gp6KZtKmqs7y8u6uwssfAuKWrq62xsaOhsrK0pHFuZlxaTlBLRFBQUFE7R0pJR0hCQz45S1U/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVg7OkJDQD1RRVdSc2JXRkiql5mgoqivmZGXh4unlo6IkoWfh4Sdl46eoJqjpLXItKnGusPDx8rIyMzNxr66sq65uMDBzbbIusG5trqxr66ytKejm6qztKqopq2smaSupaSorLq/qKu2tr7Bv764srLDsbm9rKOutKy4pYibl6abdr6ghJicjpOZmouul6Gcm5eVm5+hqZ6ooJmaqZmip56YkI2RnYNudpKimpWdop6QrbKjq5WoqpirrqWkn6Wpk5KZnIiVnKKel7Gmqau6tr6zsq29ubago6eopaecnKypqYxjZWFfUktNR0hOSVVMPU1ETkpLQkNEPFFVPUFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVlTUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5SYE1VSH9lXkhFq5ScoZ+7r5mUnoyTqpuRkpOJq42Hop6MpK2Uo6O2xr20wbrCwsfIxcHNyMG9ubKvubTAwsq1xrHBvLW6q6itrLCjopmqtLqmqaarqp2or6ejqqq9vKesvLO3vca8t7W4wLC9wLOotLarvqWPopeRop+8n4mZoJmWnp2Pt5+pnKWjm5yhmqils6GbnaWcqKqemZWPlJuLl4mMpaKUnaKeoLSvpaWTsKuZq6yenqSjqZGVlaCDkJ6fnJappKKhtLW7ta2otbKznpyipZqXlZmqoZ53YV1gXUpJRkhNUUlNRUZHQlJMSUFFR0BWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6Z1xGQ0OccGJHRaeXpJ+fw6ybl6SXmamclpuaj6qWlqemla2tmaGrtsTCu763wcLAx8O9zce7vbmyr7izv8PItb+vvLa6t6ajqqytoKCaqqrEoqWoq6aeq6+soqmovrimrb2wt7bHtrW5uL+wvsG2tLK0r72jlqOWk5uUrp+QoaKlo6OfkL2lqZ2prJ2doZumn72imaOeoqmroZ2WjZWek56Hj4SNk56koJ21rKaclbKnmbCnn5qqnqCNmZWfhI6hmpuTpaSamKyxtrKqpaqtrJyYoKCSjpCWqZ+UaGNaYl1OSUhLT0xIRURJQT1QSUE8R0lIW1JPSz1IT1U0QkY5PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGVjV02imqOcnsWsoZ+snZyun5KjnpaloKepq5e2sKKqsrXEwr2/tsDCu8jCvcrItri1tLCztLfBxra+sLi0ubWfpqyqq52dnqWjwaWgqa2gpKmtr6Kmp721pbG8t7a1w7Kzt7q+scPAt7ets7S1opyklZGToK2gmKGdqKmroprDramerK2bm56ZpqC9oZ2kmKurrKahmY2an5KeiY5Xf5aepaGguKqnk5i2o5+zoaCbr5eejpmUnYKPn5eWjqKklZClrrKrqaKipqWVlZyYi4+Rk6SfiWJlW2RgTElKS09GRUFGSz49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIY1xMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dzSEU2PXVlXEtOnp+hmZ7Dp6Wis6CcsqeTq6SgpJ+tqaydu7CorLWxx8PBwrPCxL3Gw7zEyryvsbatsLWvv8W1ubGwurWsmqiwqamanaWhp8Ktm6ywnKqirrCppKe9t6a2uryutsOts7PCv7HGs7q2q7S1ramhpZWVlKOroZ6fmqirsK6vu7KmoKmpmZmYk6KkuKChpJKur6ylp5+SoZ6Vno+QjZSdmqKfp7Smp42YtJyjr5qem66RnpSXlJqAkqGWj46foZOLpqywpaeinKGekpKak4WLko2cnoBiZltoZkpJTEpTQkNASUc7O0c/OTlOTVVeUlNKPk9eXT1IUEJMTEk5TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVV5mckA4PEiWd2VBNJ+kn5ugw6ikqrKho7WplbKrp6KksqyuqbuyrLC1tMa/xMS1wMS9yMO2wMjCtau1qLC4rMDEtLeurLa5pZmrsauqmJ+ml627tZuosJutn660saequrKnubO3srjAqreywryzxae+rq23tKmnq6GWlpGlpKKil5ikrritsbW2oJ+opJmVlZOkoLeipKWWrrKypqqmoZ6bmpqWmKienpihnq+yoqaNl66ZpayXmZ6lkZuOk5iahZaflIyQnJ6Ui6mpqqKnoJmeloyOmZCChpaJlJ95ZGlda2pNUE5OVD1DQU5DOjpJQDc3UU9dXlJWUUFXYFxCSlNIVktIOlVlXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVKcGlWQ1dGjHlmQzukpJ2hpr+mqK+voKm1qp25r6ujqrS3sbC5t6+2uLjFvcPHvbzDwcbAucHGwbqqtqStu63Bw7i4qq2yu6KVrbCtspalp5Cquaqgp7CdqqCwtLKqqba1rLussrK5t6y5sMK6vb6mwqqwt6+pqqumnZiYqqGhoJGYoLCvs6uwuZqbqaCZlpKXpqG3qaWioq+xtKuyqKufm6Cgm56lm6GXnaOzsJqfkJOlmqGpmpWin5aYiZSYk5aXnZOIkJuZlI+pqKefo5uXm5OHjpmLfo2WhY+ba2ltYWxuV1BSWlRBQ0VUQDs7SUE3OlhQZF5QVldEWV5dTUxSTl5LSj5aZF5OSFBOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNjQ3Z1lgRig/OGx9aFtWO4l7Y0M9p5+coqm9oaqwqqOxuKmltLOroa21va+zuLy6vba2wMK/ycS4xMK/wLjEvsG3r7Woq7eyvL+/tamusbefl6utqK2Wp6iOp7ufpa2znquisbCzrKm2s7W9ra+xtaywtbHAusS2q7yvsbirrKmisaWepKmfo5eQmZ+yqrOpqrOZnaebmpWNoKaktK6noaysrbGns62yqaOcn6ijnZOgmJuotamXmZKSn5mfoZ6QrJ+YmIaVmIudmp2Tio2Wl5qXpqWjoJ2WlZeUgY+UhXuPkoOMlmZscmdwcl9HWWZWRENNWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJgUEtNTlhXWFBKVlZXTT1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FVMTUwPWBWXjgpQzNZVVxnSzWMemZMQKSZoKSst6SsqaWurrapr7O5pqawt8W3sbe+wcK1tLrFvszFuMK/ur+6xLjBubK1rKq6t7q6vrSqrrC1mJinq6qrm6yrj6u8nayusaOqn7Cts66utrG5t6mtrrGnta+zu7zJsqq1tLG0r66moLOfmqitoKWVlZqZsaOtn6WvlqGkmZmSjaKlp7Kpoaaxq6m1pa+xta+jmZ2tp5qXnpmZrLijl5OQj5icoZiXlKyfnZSBk5mNnZ2alpCKk5KemqWhoaCZlpKTlnuLkIZ7jIqDi5JrbnhudnxhRmFqWUlIWVs9e0pHRTZBYlRpWk1cYUpbXVpSUlJiYExLRV9hYFBMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENeUVwuKkIvSkdQW0gzY1lVS0SZlqCwqLGprKWjrq61qbe0uKOrtLfJu7S7u7++tLS3w8HNx7vDvLa+v8C4v7yxva6nurm3t8G2q62xuJSXpq6rp6OyqZSvu6StsrGnp6Kys7CysLSxuLOprquyp7ivtbPDxbaotLWrsK2pp6K2n56msaCklJuZlLGep5ufqY2pop2blZelpaW3p6Kxs6unsaiusLWspJmgrKibm5yblKm4nJSOjouZnKKYkJemoZ+WhJKWkJ2cmJaWiJaPl5unnKOgkpaRkZd2hJCHe4WBhI2MbnF3dnx/XUxlbFxLTmNcP2J7R0k4R2dXZVtMXmJNWFlXVFhUaV1PT0hhXl9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydGYUxWJS1CLj1FTVE8M3JrSkRDkJmlrqStraunpLCys6q3sLafq7W5ybmuwbzCt7OytcLDz8S/wb20vcC/ur+8s8Soqbmwtra/vK+ss7KcoKewraWmsKWesrWtq7KwrKmotLmstLK1rbSsqauorKm5rbGwx763pLmvqa2tpaitsKWjo66jqZydnJqvmaKjoqOQrJ6jn5+hqqWmuaWrtLSkqauprK+2rqKdo6iqm5+ZmpKktJqPiY2HkaKglo2UnqCUk4WOlJKdm5iWlYeXkpWZppufn42SkY6Rd36OhXx8fYeKinJ0cn59flxTZG9eTlpmXUZElltIO05tWGFbTWBhTlZXVldUWWdeUVJMY1pbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGRISis6ST8zQklTLD6Paz1ISI+bqqqiqa+kqKOytLG0tbGxoautvMu6rsC7x7G0rbTCw9HFxb7Asr7Bwry/t7zEp623rLO4vMCwq7KtoKSnramopLCjqrGqr6ywrq+tq7O6prawsqmyqaumpaOtuqyqscK5tKu5qKioramosaWppKKuqqiinpuirJWknZeemKudoaepoaylo62st7GxoKiioKuusKydn6eoqZmkmJmPoKeYhoOOiYufoY+LjJacj4+Gh5CVoJ2WmJWHlpOTl6ScnZyLkY+Oin9/iIZ8d3+HhYd0c3KJdmxfWWBuY1FzcVxLO4R8Rj5XdVhgWU5jXE1VVlVXUFxiXlNPTmdYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLklnREY4PEIwNUVLWDFAlFs/TUaVmK2noqqynKmor7asuLWuqqWrqr3Ju7C+uMOvsa2zxMPOzsO+v7TAw8S6wLTJxKyvt66yucC/tK6uq6WnqrCpp6ixpbStq7CurbGvs6yzuqS4s6ysrqeroKKesLerqq26tqS1taSpp6ysqq2hqKamsbKkpqWhoauWqaCTmqCmnqSiqqSsop+nsbesrKKkopupqq2pnKKlpKSYoJmWj5idk4GCj4iFnKCMio6MmY+Qi4SNmKSbkpGbjJOSkZSimZuZio6Li3yGgYKDenSAhIJ+dHeMpId5a15gbmdXZYdkTkBnkkxEYnlXYlhSZVVNVlVVVE9cXWFVS05pV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxDKzpKT140RIZASEhEl5KvpKOqsJeqqKy1q7axq6Srqqm8wMC4ubO8taazr8TJy9G/wbu5wL/DucG6wcSusbWys7vBvrOxrqyrq6i2qqWtr6u5r6ixsa6xq7WqtrWntLarrKSpqp2jnbOzqKiktLSgta2hqairqaynoKusqLm2qaqpqaGpn62bkaihnaCkoqaiqZ2cprSup6WpoqOYpKamqZyipKOfmZifkY6PmY5+h4uGhJ6eiIWLi46OkI2EhpWjmo6Nm5GSkY+Sn5eYloyKg390hoF/f3h1g397eH+BiJ2Pb3FnZ3F4XGBziGpPXZhWSG14VWRWUWJPTFVUVVBPWFtiVUhQalRWVEdQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJRYzAyP2Y9Tlg/Qyw+TFRfL0prNlBFO5WOsKClqq2Zq6SsrrO0rqqlr6mpur67wLGvuK6itrDJx8jQwL69u7zCvbrDwcC/rrKysrW9vMKysrOqs6iktaikrLOzua+jrraxr7G5qriuqq62rKueqqyfo6C2raihnq+zobSqnqinqqSqoaGsrai9r6yurKGnp5+rmI+vopiioKinnqebmaqwqaOfrKKhk6Kio6aYmamll5eYnY+Kh5WIfY2GhISkloWCgouGjo6RhIWUoJeIkZ2Qk5CNkZyUlo+KhYV4dIF/fXV4eYB7dHN6aYKHo3VpXmVsgnVniIx9UlhwXkp4c1NkU1FeTU1SWWZOTFZZZVlGU2lSUj9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTGg6NDhfPWFkP0YxQ1BbWytITzpWQjSQj7GgpKaro6akrKa0s7Cpo7Cnqri+wLywqLmqp66wycbI0cK9v765vr+8ybzCubCwtLG6u7nBs7S7rLiso7Wmpquxtrmyp6e6ta21vK+8pa2ttautnKmvo5+lrKqnnJ6qs6SzqJqqp6mkqZ2jqaipvay0r66dqaOgrpuasqOVpJukpZ+kmpqoq6Wem6qhm5KboKSdmJapqZGYmZOQioKPhX2PgoCIno+Gf32LhpCPkISAk5uUhZOijJSSi5GakZSHiX5/cXp5fnxpd3x6dXFxfWiGeISHZGBoY3KFem1neV1eVkJXem1UYVBSWUtLTnF0XUhaW2dZRVVmUEQ+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSDElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTtFWj8qj5OxmZ+fqKWkoaukt7KypKiwp6y4wb21sKO5rKiosMPJyczBtr2/tbe/usi2w7W0s7Wxvbi6vretubW/raGzpqmqr7W4tKqeu7uosr+yuqCvtLaprJ+usKKcpaipop6cpLGmr6Cfqqmooqqbo6igrbyorrCuoauio66enqyml56aoaOcn5uao6qimpqkpJWWlJ+hlpuWpqyLnpGQkYyCi4B/joF7mpSNiXx+i4WOj4yJhZKYkYeUo4mSkoeQmY+TgYh8eWt9dnl4Ynt6cXBxc3hpgXNqg2dkaGFvc45tYmpwYHBBXHhrVl5OUFFKSk1TWVZNXV5tV0RYYE9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDBCaFkxM1M9ZV9ETDZLV2VPKTwzUFs9I5KYrJmfl6ekop+opLivrqKvr6mruMK6sq2fuK+rqLS6x8vHv7fBvq+0vrfEtsOxrrmyssC1u764qbm3vauktaenqbCtubCpmrq8pK6/tLShrre1p6ensLOgn6Smp6ClmZ6tp6ieoKmup6Cml6Opn7C4n6Sxr6Groaykm6amqZqam56jlZycmp2pppabn6iSmJOYnZOZlaGqkJqJjZCHfYd+go18fKGMjIh5g4yEiYyNhIeTmo6JlZ+JkZWCi5aMkH2Ee3NvfXFzdGB5eGlvcHFvan9yZHpsaWZkYWaGgGBbc2pyTU1/aVhaTVBMSkhQUlBJTlxfb1REWFpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpoSCo/MFpZNSiWnaWYnJatoJ+hpKG3q7CjtLSpqLnFtrKuoLesraywtcbIwLe/wbmwtL23v7u/r6u9sLS/sb3Duqm7urenqLaopqqwrLOwppq8t6Sru7Wun7C4r6mmp6+xm6GkoKOjoZacr6ahn6Knr6KgopOjpaK3sKGmsaufrKKumJyqpKiel5qdpJOanJqdpqqZnJyklZWXlZyOk5eiqaGQiYqPhXqEfYSKeY6Xio2GeYKHhIiMjoSMk5mMjpaZio+WfoaXi496gHpwcndvb3RfeHdkbGxsammEbmZzaWtmaV1kc4FgW2t1aVpJfV5bWE9PS0hHUlVGMjleXm1QRFhWWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbDg0R0FmW0hURFVdaEUuPDJiVSwylqOhl5Sbqp2koaKgt6quoLq4pqy9xbOwr6O1sK2tr7XExLyzv7q3sLO5uLq4uq6tv7O0uK+/wbisvbq1pqKzqqaosqutsaGbwLWkp7W1qJ6yvKqopqmvrJmjp5yjppSYorKkmZ+kqKmcoqCTpKCkuKikp66mnqWgqJKfqKKhoJibnaCSmpuWoKGqm5uZoZSRlJaZjZSSo6ikkImKjoV5hHuEhn2djYqKhnmAhIiIiJGElJOTjJCVlI2OlHuDl46Ld357bHRybGxzYXh0aGhqZ2ZvhWdoaWNmaWpgaWJqZ1tle2NgU3NUW1tTS0pHSU9TQCEqaV5qTENWVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRCM0NEZ1tLV0dVYGhCMzc5ZU8nMp6jo5GOo6ebnZ6do7Wtpqq5t6esw8G2sKyjta6nrq+3wMC8ssG2sa6ytra4t7asqb2zr7Kxvb+4rru8saWftqulpLSpq66fnsKrqKWwsqmstLueqaqrsaWYnqqdpqSRmaatopiepKmhnKKdl6Cdp7amr6qvoaCdnaGUoKWfoaCZm5mckpmdlKWdrKKYlp2Uk42Vl4uPmJqooJGIiYuIeYV3goKBnIiLgol8f4SIhoWRg5WVj46QkZGRjZJ7g5WNhXN9fWZ4b2tqbGd1c2tjZ2RkdYBiZWZmZWpqZGtxWl5ZXW1kYU5oV1pgVkpHSUtNUlg+OV9saUhCVFNcW0lIRkVBLjw/OUE4OVJHQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFlKVmJmQTozQWdIJTWao56Qi6yhmJiglqWzsaKxvbehsca7ubGxpLarq66pub27u67Asq+urbavs7izqKu5sa+ttLa6trC5vq2mnrWroKCwpauunqTCoLKjrrCut621nq2vrK2imZynqaSelZuopZ+ZpaOonZqgm5Scna2wprmorqKgmpqemZ6jmqSdl56Ym5SaoJKolqqnmpOampGLlZmNlJSZqaeOjYqJj3yCdIKBipiFh3yJiYSEioyIkoSTnJKSj5CRlo6Qf4CMjYJwgH9meW5oa2pncXJrXGhjY3OBYWZoam5sZ2tqZ21cbGx1cWFUYmhkZVpJRkxNT1hRUVZhZYFUQFZTWVRGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUplQyc0kqCajo6wnZqToZmpsrCfuMC2oLTCu725saa2sKiupLe4t7etu6+tqqu3qrS5rqWztbGuqbG3trGztbqnqZ+2qZ2eqaOqrZypwJmto66vtbWtrZ+xra+popuco6uom5Wcp6OdmqmipJaaoJyQm6Orqqm7n6ikn5eamZ6hj2uilpiccYKWm6SAdZKpp56UlJ6QiJeZgJaKoZB4hpSMg25qfneDcWyGi4Z9hIuGb15jYGeEl4Zri5CUk3V3i4R+g49/Z4aAaHVpZldcaHNuTlBqY2dyhGdfZGZubGpeYGCKkISGZ09LRDhGVGdeSkdRUFVVS0hTYW90ZUZbUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzU2OCwjMScyMTQ6MTc2WIFsMTZPa1tOXEtbZmI+RzFRZD0rL4yjmYeUsJuck6Gbqq2ro73Fr6m3wri9va2ntrClq6S4s7KzsbmtqqestKawtaOouLa1qKest7OutK2zo6qftKueoaScp6eZrLuVpqWvsretrqWorquspaGfnKCnppuXoaWlm5unp52Tnp+YkJ6oqqO1r6Ojo5uWl5iXo4ihjpKah6GHlJ2hf6V/pqqekpGakYiDcniNjoWIoXaJjWmXiGZ9c3ihb4iHhH6NfH+hoJ+ZgHuHnnSIjnabimyHgYNsaGVjemxxYlSGbWNsaZhxWGpwb4dYXmlba2tbiHFuenKGaIeEWl5GTT9HX01GUlZWUVFSV1RnXk1YSlJST0VHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3LyiMppeDnKudmZmdn6qqp6m/w66xury3wL+qpbewqaymsrWur7O2q6mlsa2ltbOcrbW2tKanqbOxrbKor5+robKpoKOjmqKjnK61laSkpba8pqynqqqsqKWhoJigpqOZmaajpJicpKmWlKKclJOkpaagtqOjoKOYlJKXk5uIro+YlImpi5eim4WxgKOsnZOZnZR5gtSof4eVwZvHeXixpbeXZIDAnL95hIR5kIR8kJCRynGWvJzFe3K2p7qQeoFslrGrsHloa1ixrm5labySvG5oem5yj9h+U2pitrJ/gXKUdZqhqpBXT1dhT1ZORlRbWFFQUoxcV1xQQFxEUU5FR0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjaaTgaapn5ecnqWtsqiwwr2ytcC1t7/Cq6azrKypp6+zqq+2s6ioprWmp7ivnbOytqqlpKexrq6xpqqep6SxpKGgnpecoJ6vrZWeoZ+0uqKqqKGtrqWinZqZoaefl5unoJ+YnqenkZynm5SdoaaioK+in5+jlpaSl5GYha9qaoqNqn5nhJWHrWRwnZyTmaWUca6hpH54u31roY92sV9qtFulgGackWBmgnpmf2p4aqllvnJnpox2smp8sXh0kpNjbW2nbVuEoEVoZ4eWRXWcYH1ofKSngllfi6tpgJV4emqnN0qvW1dTbWNbS09YX1xXVjtOiE9XVy9JVFNJREVGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMxG5GilYKsp6Weo6WqsrestL2+sLbEsri7wqepsKuuqamwrqSwuq+kpa6zo6m5qZ6zsrCjpaCqra+ssKann6OisJuim5eVl5qcraaXm6GetLOhq5uira2gnpqWoKGonJiepKCcmaGnpJCdo5qXoJ+rn6amn5qfoZaVkJaQmYW1m7V4hamZtZl3h7Obt36TlZaolH5rgaZ6goaIkpSSd6tna7FbrHuPh5R0iHGPhoCAiJCXeIOCi5eMg6CPhLB2d59xa2tsfItOpFhIY2OZfmNopmB5cnVTkodeUKltY3F+h4BinS5Rom5bU2toYExLXGRYXFpCPrB4V1hBI01oRUNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dXN0o5YVU1MBuVn5SIs6amoa6pp7Osqbu2wrC7wq24t8GqrK2urqausqmhr7yqoae0raSrtaWmsrOno6KeqKqyqLCopZ6fn6+Wn5mVlZaYnq2impqjqLSuoamPqaiqm56Vl6Ckp5qenaOfm6CjpaOVm5+Ymp2iqpummZuboqCWkpGTk5yD1ZOZuXCwwn7GhnzWlJu7fJmVpI+NnI2ke46HpIKlgnqseY+dVq97iX6farlauXeGg3ymgpN8mHqqeY2ckHuxbY6EdJC8hW+UUK+nxYpRoHpjYKpic3KIbZeIYFO1tMiGgIl8Y6QzQp12XVFqaGRQQFhnWmRhSkhNbEtbU09ZZlpDRD9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tdT19mVDdHOmFRNzIlm6KTmLGoqKW0qqW0qKS8t8GwucCxtrW8s7WnsbCjsLKmn662qJuoua6jr7Ggs7SwoKSen6iqsam0qaScnZ6ql5iXlpeVlqGrnZuWp62wqKOej6yiqJael5uhpaGYoaGioZqioqebnqGelZmbpqCcp5Sbmp+hmI+SlZGdiLJuaLVxq4dvjqZytHNytnuZl6OLjpyNon6RoaV+sHaDkdLRdlyufIZ/pG+bqqZrhoR8rX2XmY97sXOTnY95s2WWdISeb55mlFLIi1rCXJ95Yl+tYHZzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPa19saE9VR0k5PVdSW1dYSEM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCT1RfZVA1Rz1hTTYyMKGckaWwraSqu62mtKWntru8srq/t7a1urqzpbS0obGxop+ssKSYprqupLGxnbS4qp+mnaKqpbKoraqkmpyaqJ6VlJiYkpKjqKCXkqWrr6ailpOtn6WSlKGbpKaflJqmpqGao5+tmqCenZCWm6GdnKWUnJWZop+VmZaSm4Wse3eodqOOiYepb62KgqeDmJihiZKaiqJ/k5mJroV/grNccrNSrn2DgqR/cdd9d4R9jp2HmZl3r4aKkZyIeLNhmmWagYKUbJJasFhLmnWYeWZgrV53d4domIhrXq93lZ6PeGw1eciusl9BVG9eZ2BFUGxfcG1WVU0uZWNpU1lROkFEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD5WX2NONkdDYEk5ODifnZSguLCXtMGtqLKoqrK6uLS4v7m3sra8taS3s5+0rJ+fqKuflae2q6ixsauutKSbqaCgqKG2p6aqo5melaWhlJObmZKUoqWak5CmrK6moJWZqZ+ij5GimailoJWZpaidnKSerZ2hnaCNlJ6bnaCYmZyVl6Kgk5iRpp2GqX19pXihj46DqnCti4GnhpWfoYiXl4ijgpGIlKp8gIudeW+xWqiCgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH6DlWySXKtbWpN/kX9oZ6pkcnuBa5iHc12sWomgjmtuZU9KQ6FcWkx0XmJmTVphX3J0X0pWNkqak1lIRT1IRkFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4wMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8yVV9iTDdGSV9DMT84oZ2Zmb+rl7TCrqutqaW0sLixtb+5urOxt7ypurSfsKSepaennpSqsamwqbWsq6+hmKGgpqSkuqKjq6CXm5GioJWUnpqUmJ6gj42MqK+vpp2Wm6imn4ySpJenqqeUl6mnnp+go62koZ6hjZWhmZ+gkp2XnJWeoZWWj6ubj65tcrRyqYx2iqZztHhzs4CRpKKRnI2JpIeQd7hvjHuLomtrtlqghWWXl2mhoqdtk3K0dJOYf7JqhZOIrWt1s2GdZqJvh5Jql1ytYE2hfIeRUnOjbXp/fm+Yh3Fcr1Y8nHdmVG9uLlynT2JSa2VhbVliXGFwe2NUWlE+Pm1wM0JCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs8MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFDOKWam526oZyywK6tq6unt6m4r7XAtbyxr7m4qsC1qaqgm6ajoZ2SqqqotqOyqK6qoJecp6Clq7ido62blpmPpaOVjZ2gm5icn5CTlKu1r6eZlJysqpeMk6WZpKyikZeqsqSgnqersJiho5CZopegm5abl6GTnKqclJGrmYfUkpq7c7DDgMOGftWWm7h4h5CXjJiKjKeIeqO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gYpumohxbo2kdL1dd31bYXm8a1pWW2p6XmpgZGZibXdvWVtZQ0FAcj9DRys1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnmp6hvKKXscOwraqqrLGnua+2xLG6sq67sK7Asaykop6joZybkamkqrKktaatpJ+WmqqZpqy4nKKumJWhkKWgko2co56YnZuQlZKvubGslZejp6eUkZaknKOsnpGgqKufm5+oorOeoqWOp6KUoZqcl5akmI+woJKUqp6FkJm1gJCRjLeVeIKTmrV3bWtuc255j4SOiXSewbu9mnuBsqhwgHSRuIN8hoaLh417ioaNl3yku7m9nHV6tKN0dpd1dLB1mZ5mhmmNtXRycHe2jF5/en2JaIN5bXlii6xwdYV/WVunakRkWVNmYGNdY1BnZnFtdUJOUExEO1pMPkozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVjgqT11dPSs6VlYnPTs8p56goL+llrPDtKyrp6yrqbuusMavtbOut6e0uK2poqGlnqCdmZSrpK2qprWop5+blqCjnqykvqahq5eUnZCim5KPoqiik52Xk5eUsrW2rZido6Sii5KRppulqpuWqKSlnJqhqKWmo6mhkq2fl6Oel5aXnZ6PsKmUm6ehjmp+aZymeIdzfpqPdHplh3q9vsC6b5KCcZWHX3JqWl6aiWFjiI6Va2B/lWNtnHZilGt/mpWUZV5gY3GbimlyjH2GlWdqfnJ0eH19Ylt3dIFoUFxug3x7i2tYbHqCcklKb4VwTXRNRVddZmBMW1hnY15PW211aXFRT0RFTTtISTxMPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBeTCgzPVtPJz8yPqifqKHBo5u0urajraWup6i1sazIrLCzq7WjvrGyp6CiqZ2im5qZrKaupKW1qaWbmJWhm6etqL6nqaaVlJyVoJqTmKWpp5GdkY+XnLCyv6ybp52noomTkamaqKSbm6ugo5mbo6asop+qopqwm5WmoJaVnZ+dl7GlmKGnmJyRnZyjo5mmopqcmpqZj5aBZ219cXeSl5SRhYq1qo2GmJWPioyYl4eUlYqEkpORiY2Rk5iUmJeaoKKanJShnY6CeqWFbGp8kHyAdImKgXGCeHl2doqAe4lqc4F0g3Vjd312a3B7bWBjXXBnTVlZZWpfV1pwem5tZlNPRlM5T1pOUk8oKzpKQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCzoLOiv6KksbK3oKqlsqelsLWqyautsaW1psCntKGdpKWco5WWoKqmrKOjt6ufmZaWn5etqaXAnquklZKcl56Yk5Sin52ip5ORmainssOvmqucqp+Plpapnaqbm6CtmKGbnKKkr6ahpKierZiXpp2ZmqGenp2woJyippWYkpiToKGVo56XoI6Wk4qKjY6WrY98lZuCkoKLqqiGgZiWioSPn4h7hJCHhZmQh4aJlY6bl42QmJ6klpqTkZ2Nf41mobOvhYmEdnqPinx2eXpvZ3mQgYCJa3WBeYhyaHN/enaDiIJrdGR5ZmBpZGJkZmpZa3twaWpcU0xQRF9VRkA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0XEc1PCxAtKC5r76sq66ysqCqprGtoqyzsMWwqqyjs668pLScn6WioZ2Zl6ilqaakpbO1npWUnZmZsKauvqCro5CRnpqZlJGVoZyWqJyEnqmrorPIs5+qo6qXlpeap52omp2jq5Oen52gqq6ppaOroa2bn6ChmaWenJ6dsKSYn6iTmJeckaSZmKidmpdmg5J8ZX6NmY9jeY1saGt6kaSra2WamH5nhYplZWloe46hjmtojJeRondraouYo5+Zc2xueoSMh3pYZV6FgV5siomAdlxoc3d3kYCHgm54gniAc215g3R3iIiOg3tqhllea3RkXXOJaWp8cWxjXVFNV0pkWEBKND1GNz9GRDcxPD0/QUQ8PERHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMVlDOz8uPaWfury5r6yzsaqlqK2usKaurbC9samnpK2vsJ+tl5+jnaGamaernK2jpaipsq6elaOQoq+mtrmlrqOPjpqhmZOSm6CZmKSVe6Wsoqizw7ekoaeun56VnqOeo5uiqamSnqGeoKqvqqujqp+om6afqKGslqGbpbCkl5yqlaGem5Kll56qmJ5+voOHcrRyhJ2GrWh4ucS4cZOio3ummJlzqoJ8y8DAu3GLooeCn3yVmImewL2Clp2ejZ3CwXuBe5KNmsPAfWulsW+MgG/Ken+bd5GDjoF2eoF/eXF6f4dxeIWMk3ltd5NiZl94ZF9lgmNedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLyNGWzNQWS9VQUI7LziWo7jDtbCvwKmolKOvqbCuraayta+qpaamsKufq5iaop+cm6qnopyso6WopaS0pJ2ik6atrLezp6+ikpGanaWSkaChl5ufnIemq6Srrb/AsaCpr6mXkp+dopmhoqmjk6ChnZ6trqispqOip6ClpZ6tqZGkm6mtqpydqpysoZaXpZWho5ecf86UeHqkgXmVlptfro9ejqeBoqB8p5WbdKuDgK9eY42qeqeHhaB0l5KIs2OCq4ahjo2zaoSudH2Wh7hhgq1Zo81uj3V72nt/mXB+iJN2fmV7iHZ2a32Ibn6FkZJ+bYGPYHFrcGdgX3lkXHFoamRmYFJUUldeS09DNUFIRUQ4PjY7QD9BOz03QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w7TC0hUEBGNC4xrcLAv7W0sLeXnpGkqqits6umsqytrKSrp7CqoKebmaWXnKKvn6CeqKejpqGesKybnpWnrq2xqqisoJSSm5+lk4+fpZeeqKOeraSqsKjAxrOoqbGulpKdnKKXnqiqn5Wgn5ydrq+nqqmbp6ekoauSrLSWpqKqqZ2jp6WhsKGTmqeaoJqUlJGXoHGFjJd0hKiHcbF8nXGsfqGegaWPnnergn2tf5xyrX6rh4afdpiSenyXfqqIooyRi51+q3uJk4+fgHutVpzEeo9vksF9gZVtdXCMbWV2ZYZvYXducm+Ki5KQg22RkGRvdHVwYGdtZV9vaWluZmNXU11hWVJTQzlJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DUxsaytJ+do46jo6Gsr7auqLCnqaqorqurp6KknZmilZ+mq5+hpaCoqKKfnbCsl5qWqKevrKinqZ6XlJqjopKUoa2bnaajr6yjq7Squs2xraauq5aUnJ2imZ6srJ2WoJmdnqmxqampm6upo6Ksm6+xoqisrqWYpqqpqbGikpejpZqUkoSkaqR1iXqpdHqycIKliZmMcYigmoekYGBSrIR/roObdq6BpoaGn3qZloZ7ZoCjiaSZhoGjfal+gZSHrl58qVWdopKBeqKfgHvDr8WMc6+zs7lxYqmvwnRojY2Yj4FtmpNvbXl4d29sZmVlcXBmfGliXVdgaVhYVU1NUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NzQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfDydbVwKGZq6ihr6KesLSwr6mso6imqqqrqaSmoJuknp2lp6ajnKyaoqyhpJ+vop2akqqktbCuoKmbnZaUp6OQmqKon6CmnLGmo6exrLbIsrWqrKmVkZ2copmfpLOdmqCUnJ+nq6ujrpqsqaKhqqOzraKqs7Ghmqqorq+2o5OWo6eYm5F8qmyehId1q3l8sG+CpIuJn5aVn5SB0ri0uMmAgbJfX5Spg6SIh6B5mJWaeKrJdJmjlaepkJKbjH+biZrGxnhloYKlc4GfjoJ9r15wtWOxdUujhm2nR4KTZI+QnpJ8cJeTf3B7dX17bltlanJxZoFqX2FZZG1cXllJTUxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz4tNU9UUR0cOzxGMiwkp6TBxrmtqbKtrKWinLK5rKqhppuopqqsqaagpqWYq6OfrqudpqCsmp6ppZ2ntp+il5OoqrayrJumnKCVkKWtkZmcpqKgqqauoaOnqbC0wrGzqq2ok4mXnKSaoKKuppihlZicpaarmq+draimnqyjt6yhsrmvnZuvp7Ozs6WUmKejmZ+Ogp1OeJqBf596g6N9g6SEh6efnJ6ThLh7fHm5gn7MxsK2eJuhkYuffZqWlop2npiKpJijqH6whZyFnoSsfZmUYaVso3CPhZCBfZeDcqxgpHNxgJpgvH1SVXWOkqSXe32Tkot1enOFf3FcbW53cmqBb1pkX2huY2RdS01RVEJJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamrpKu4q6+gnKGss7Omn6CVpa6trqqnnaammqOnobKuoqmmsqCZqaSUo7aiopWXoqm0uKScop2jk5ChsZmenKakoaKvrp2kqKG2ssOxrqmtqZGHkJynnKKinKWXnpiZmaWkqJquoa6lppewpbytobe3rZ2dtbK4sLOnmJ6voaOehY/RtcO3eYeOhZGTkIGmeJSid4ygkoSlgYpxqoaEtG5yapmjm5WKn3yYmYaHj3OvgqWboo2mi5OdiZSQm21wslylc5N6nGyZf3uZfW6pYaJxcX+fYnOyuGh4j5SmmH6MjZOLeH15joJtaXhpeHNuf3RdZGRubWZnYEpbWFg8SEdAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVZWVFFPUVtVJSEyQUgkKSWTc42Krb+/u7q1npeopK21oaOZlaOpp66qq5mlop+loKC1pqKpp7CjlKyjj6Wto52QmpqqtLSknaSdqZKUl66goJ2mo5ynnLSaoaqjtqvDr6mrqaGMhI6coaCloZWampyYmpmmpKaYq6etoqSbrae+rJW9sKyforCzuau0p5upsaSnmHqokH18sHeKgaSliJxtsm+hh618oY+DqJWYgKyIha6Fn5SpoKGWhp+AmZWAe5J+q4CdmpaKqnidoI+Jk5KAea9do4F8pqdknYB8l3Rrrl2la3GFmV1gW4ygbZWSp5mClI2XjHt7g5d/a2x/Yn10bYB6YGdlcW5oZ2hDWmFbPUtUMlU4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaWFNQT05JNzA1Mi4qLEFUVlZWVVRVVVVVVFRVVFNUVlZXWFZVVVFIRklKIygovZKahKnGwrbBtJ+arKCuuKWkjpuko6Cvr6qfpJ+drZmeuKCjq6CvqpquoZCqqaSWiZuQrrCsp5+nm62YmI+soqGdpaGZpJytmJ+oprapwK+lqaOei4CNm5qfpp2SlZqalJqapaOkmqisrKOkn6qovqSXw6yqoqGssrqrrqegs66oqZh2r36Qi5yFh3y6roqYZbCMZZWtfaGPg6aVmoGsioSwhaWZpKGhkIWgW2xqgbNgf617e4KAsWxnbpmXjIiwW320W6SDa8iiZZ+Ae7xZdrVasn1Sr4B6rFiAoW2Yj6ibi5iRlpZ7eY6dfmRzfmKDd3SAfGFqZnFtZmVlT1VkXEJUXj5JKD45PTQhIi0lHzIuICoxLzA0NTc5OTxBQ0ZISkxOUFBSVFdaXmBfYGFiXl9cW1hVUE5KR0M1NTMvL0BVWlhXV1dYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7K3vbu0wrOjm6ympbaooYuaoJ+ds7OpnqOgnbWYoLOoqquer66fq5uVr6iijoibjq+sqaeip5muk5mPqJqinaWfmaOipZmfo6myqLyvpaidnI59i5uVoKCZj5Kam5KZl6ieoZmorqempqOlqbufoManpamhq7S2ra6mnrutrKyVgKmSo6+Pm4CHpJeYkIGAuMO6g46dk4SnlpyCrIqCr4imm5ulqpB+1b3CqmKjv719fqOCg9e6uLWFlJODnr2+hGqjgW+rhG2df3qysMeDaquwvax4d6K+u3SAlo6mnZCckZeceYKRm3pjfXtkjGZ5gntga2VramJQYltTalxAVGFCTik9OjQvHh8kHiUyIB0kKDA0OTY2Nzc7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSUM/PEE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbO0sb+5sr2yop2upqWzpp6LmKW+qbexqKG/pqaynJ6xnLmonq2vpqeVlLCsl4yDm5GupqOtoaScqqCYi6OSp56nnJqgqKKYnqCsraq5rqijmpaSe4eZkaabko6RmJiPmJOomaCYqamhqqeho6u7nqnFo6Cvo6uztauvqaC6p66umnN1qqS3hmWJoHBnrY+Kj21vd6SQmZ+Bda6ZlXCPi3GVqKObl66kcm1tbWWKeG9tgplxgHlpcWlniZaVmHFoaYSGZ3CGZF2JY2pvWV1nfnemYGJxjpFvZmSAjZKOopiYmZGWnnyHjpV2Zod4aI1qeX55ZGxjZmxiS2VYSmxZOlFlRVInSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXVdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWts6q6ubKzqqmhrp6ksqmYkr2yxMi+tqqewKuso6GnrJ+6o6StrK2mjpauqZCMhZWXrZ6mqqKfo6OgkYykkqeZqJmWo6mglpylpqevuqusmpuSknuEl42lmI2RkZiUjZiVp5SfmKmjm7GnnqOsup+wwaeks6assbKrraunuKOtt5aKoailtp2JlqKYh6makJSdk6qzmZujq6CxlqGhnaCinKCkoZWrpoySkoyHkpyclJCak5iQjZWGgaSal5WNi5OSio+GhH5nin90gnZ0h4xxp217lJGUk4GBj4+Pj52UoZaZl6KCiJSNcmmQd3CLd3Z8empsZGRvY1VgWUBpW0hjYU9aK0Y9KyYhNzQwLh8cISUyKCo2OTk0Njk7Pj9BQkRGSktLTU9QUVhUVlleX2FjXV5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaWltcXl9fYF5eXl9fYGBgX1lZYKaWqaqltbeurqKwpK2goLWxkI6rxr3EuriqoqWdm6aesamjtqedqbWnqJGYrKKLiImPnKiWrKShmaeenpOVo5eomqiZlKaho5CbqJmhtbqoq5makI18gZSLoJSKlJGVkJCTl6WPn5qqoJy2o52nrLenr8Guo7emr6+wrampsrigrryZkaajpraikp2mn42pn42Sn6Osr5qho7Gor5ejoJyjqZ6enZyWq5ySmaGblJCWqpmNmZmWkJWekYmgnZWUhZKMkIyUioB+ZoyGdYZ2eYiDc5xqhpCUlJGKfYyWkpKYk6GTnpeihIiYh3pylnN6in9xe39qbmRfcGlgW2BabWNQYGRQWzpHR0Q9Mj09Ny4qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOjlFTVZbXl5bWlxbW1tcXV1fX11eX2BhYWNhYWFgYmJiZGJcW2OXlaSoo7CzrK6jqaetoKi1qpCQnaa0u6+srKKjmnqdorGkpbCplpu5p6OUmaqcjoaKiZyjkK6fo5aooKGSl5ibr4uqlo+omaeMmaiPnrm2pKWZm42JeYKTi5qTiZWSlJCNkZaijJ6eqZ6fuKSAhK+1orCvdKS+o7KgeHqgqrG7lHWspJ6JgKp+ZFxidqCOpJ6El35uk7Oco6euqqNlnZ+Tc3mZl3CAmKiXbH+iqIplnKWckZeYlouRm5GGnZqQlYKSh46OkomFd2uPh3aGcXyGgIBhaYeKlJKLW3aVkWdokI5ye6aZmWV5mYeCeJhqhIqCbnl/a3BlYHZva2toXGZlYmJvU1w+Tk5OUkc9QFRCOTEvHh8mNDozMTY2Nzg8Oz5AQUJGSEJGRklLTVRUVVlcX2hmZ1dRSjxERzs4VVJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mm5Wmo6GwsayrqaWoraOnraSSlau2sLKmmqqnq5dzjJ2wn6irp5OXuaCgj5yknZF/iIibno2rmqOVp6KejpeRnoV1rpCIppqokZekiJy6tKigmZiLiXV3k4yVkomTkZCUjI+ToI6boKeZnLOWgIyctZ2zjJKPvKehfqeieqKut4GOjaaeg4uFj7Gpr4yKlqOaeYGLrIacnaKnqaeHlYWYd6WbeoebgZemgoF7nLF6ioWgl5mUmJaBkJaWhJmZY3mHkISNj5KKg21wj4d5gHGAgYV/hnSGhJWSeJZok3SgmnR9mYShnYeYfpKLg4OZa46NhWt4e3FwZ2R3bmlsaltla2plc1xeSVRMUUBFNS5ZVFU2KSEwOT0+NjQzNTY4Ozo9Pj5AREg/SUVKS0dTWFpZW2FhaGZZUUg5RUw7PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyXo5+mrq6rqKygqLCmp6mlmZSux76woZamqbWej4OdrJynoqCNkL6emY2fmqCQfYaPmZeIq52ilp+gkY2TiYaAkaiOh6Kco5OXnoaeurKnnpuSjoVwdZCIk4+Jk4+Pm4uPkZ6Rl6Gklp6siJ+0ibSarYvKh6quiLeFjbCCsK6DqY2mmY2dfKiPcnt3nI+nlmiVpHm0i5+epqiSmcKBf6uImKFxnoCZpH2XhZWxgKF8oZSgkJiWgI6Tm4qXkYt8hZOGjZWTiYNtc5GFf3pyhoGEfIR0hYKXgY/FZoCph4+ja56DopqDmoCMjoWKmXCNk4Vod3R7dmdodXBnZ2xeY29sZ21YaEddUUwyRTQ2TWBjNyYzPERHRDo2NDY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQEpkWV1jZmhnYmJiYmRjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmUl6KfsKipqKWroKS5sKqrppqUoKSlq6OWpaq3o69/oaecpZ6diZS9mpONoZGdkHmElpaRh6uZm5uZoYWPjHebnI+gkYiepJuVmZiGormupJmcjIx/Ym2PipKPjI+MjZiLkJGejpSgoZmhqH6hp4etnaCWro+enZ2RhoGgjaquhqSNqpqMmn6idoCZlGuCrHVNq3iHjZ2Rm6ingKqrfYOhe3qnaZ5/kmtnl4aXtomefW5gZFmDln+Me2RoinKZfXmVbF17l21fU3CEXF9seYNgWWWCfYSBmHGnqmuDo25ypXCfhJ9qZZ9sW26KfGZaX4N/YldQb3ZlbXRxampvXmpvbWxqWGlPXVhFOUE0R0NeazQsSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl9jdmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBjZGNhYmlrZGJkZGdkYmdlYWNol5adoLmhqqOmrJKhtryrrqKZl6Cipq2toZ2utaKokqGgoKacmY6YtJmQi56MlYx1gZSSjYqmlpWYnp5/koWGrKSHnJGKmKmYmZqSh6Wxp6KVmoiJgGluiIeKjY2Ji42Si5CSoYuUnqCcoqV/k4GPo6GUoHeclo+ng6Gnf4aprISleYp9hJp9onByk4iWe56MeW2HnIyZkJuomo+HnXyConN2pmaefnakX5h6fZJzom6Yt7S6dJKHgn+1qGSBxrh7cJW3i3GAm6Rjc6yrYH1qnbN+bn2Hg46Ci5dxgKNsc6RznoSApGCdmbOWcXyXn7R0c1uesoNqYm90dXFob1hrbHJzZl1pXmJLRD1ENVFBWXEzPVNHX0pSPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWldgYHxkSEM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO4mauck6CNpLi1rq2gm6Kco6OmrZybsa2sk5ehmaGkmZqUnqubi4mSeIuGcICWjYqPoJCTlJ2XfZCJjqigh5iPipGik5uajIuoqKWej5aHhH5re4d+fY+Ng4uQkImPlKCClp6gnaCfi4l3nJiijKByoouIqYicppCWp6p+rox9eqCZeqOTeIF0loiNnH2WoIebjpmbpoaiZKF8iJaQm41snmibjW6amXuAiqd9cmh0q4Odg3SqZ5SaXZuFdoSdaKpqgLhmXKhwgZxhlYxep3Z1iYp/nmiadYeTkpiOf59umpBtp5ldqH54u2t+qluOhF20Z1xucXp4a2lbcWp4eWNgZlhiQVBFTjdWQlJuNEtaWl9OWkNAMTUxOzs3SD86Q0dUP1lSWV0+RGJeVmBRYWN9aUVCOU5bXVhkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtZuniWOUm6y6srCsnaacnKifnq6bnrCorJ2XpJqhn5iWlqCjmYaJjWqIgHJ7l4iLlpaEkZSYj3qKhJaknYqUj4WLnZGcnImPqKOgmYuRioCAaYGHeH+Wi3uIjo6Ij5aaf5Sjn6Cik5hyaJ+Kn4+McZKMgamImZ+jp5+nfLCto6K4l3ejs6KkgIiUeZ17q5p/oo6dm5eJl3GhfIWNr7V9a5qRoXh+mLSjo6uohJl8m32dmn50qlpdb3uWi3ieYkx+enqFY3mXQk2fWaJqcXyObYGJhJl1m3mHibGzf3+bk6d1gZ1ucn2Ub5lzaqRdlXZIZWNgc3F+fm5lYGxodnxkZWJSXlddVFZAWUVRZ0RTV1tiWF5JRD1COD9COklFOExEV0FWUVtWREZiXFpgS2BtfnFFQzxVX2JaZWpWZ2htb2JmZl5hYVxdXmFoYl9lZHZsXmVnZmtkZmxpaGtpk52Bsa2ZhFRfoKezubOzqZqijJyrnJyplKGrpKGoj5+enZqZlZignZaIh4l3hYFueZWFkJuLfJGTlohygImToZxzkZCBiJiUn5qEjqmcmpSKi4p8g2yEhXGBoIt4hY2Ih5KZlXyTo6Gfo4iuhn21hI6enXullnqpgZadkIqgnHynaHZtfpl0oXNxfJ6GmXCTg659pIOmnpqBo29eqGd1o2NvpWGc05B8epl4cnNjooWQfqNzo491a5Czi2CCmIlzqrKovH93g21+vqaptF6cbn1xl2+Bc6JyXaNndKZhaKZtm9SZfISbb3h6l2ube3eXcm2ppGdgZXlwgIRrZ2ZkbXV4Z2BjVFtmUVFiSVdJVF9XU1tlalxkUEVDS01KS0JKRThQP1BNV1NYT1JSYGZlaVJjd3l3SUZFY11kWmhpVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJebgLGrVFxLfqmvsbSws6OcmYWZqKCgo42kqKCYqYqZmJiTmZOSoJiOiIZ7cH2EaH2Pg5SagXeRjY6Jb3+GkJOSbJeUfYiRkaOVg46qmpSSi4WJeYN2h4Bugp+GeICThoiZopd6k6KkmqCJs6Gitot6rKekrqVwqYCaj4aBnJJ8pICimYaYcp6Eo62uipeMgIykjZaDrqKVdrW1tcmhc5SKgZ9gnZepbXmVhp+adaGHd6B+kZaKgG9MZqOScJqHcqR7eXRhg4JsfqBrcWRgnHJ/dJdpe2mztbTGpnOYfnudapubq3WDmmx0d5dpmnp1mHJQRH2zXmp2a3mHZmpnYnR0cW5WXlRZaE9RaElVTFlTVV1oa25WZ1dNSkFKTUtISk5BUUpQZGNpbWV0cnN+eXtudYl7e1RQT2xeaFtraVJqaGlsZ2xnY2VfXF1cXmliZGhre19dZGhjamZvbWVpbGWhnImwp4RmP5Shsquvr7aiopCAl6mioqWMpaednaaCmpeWjZeQj5yTjoiDeWp5hmWDjH+XoHl1j4iMgWmEhZKDjIWdjXqMipWlkoOXqZeMkYuBiXqAfYt4cJChh3mBlYeJlqCWf5SlqJyWloRnbnicbKJkfHGld5uYcGengZeMe6V6n5aDl3KedoGJlJaPuW6QiqJifZmilYhtcmmranWgbW6mYJtpi5BoloealXWigH2aYIuFjHRviGJooGWefmmadW9jZoiCbnKiWl9bY6FuXYmMb3t/c3JkpW13omRnp2iYc4uYbqFvU4iPb6BfZadUi11UmG1tc2tygmxwaGt4c2tvUlhXVmZZUm1JWE9dSVhpaHNqWWtWUVJFVlxMWFJhVGhqXnd1enxwfHxyg3t/cnaNgIR2XlFyYmdicGdQamhoa2xuZ2RnX11eXWBrY2ppdnVdXGNpY2pqc2xma21jnKWZpnpldG2Lp66kqbCxpp+LgJernZ6ljKKhmqKigJaYk42aj4uYkI6Ke4dxgIhoi4t8mJtzdIp9kHxkgoeVioqVmYJ8iIaWp5CBoqyQhZCKgop9gICPc2iPpoR9hpSNiZigjoiSqqediaZ4lpx+pYmWjLKYnpCCr5efpXiViHqpdKWPhJpupKKMkoSMg7tufaWvgoaGh5OWnJ98pXpxqJWglmeefm+rY5aKlZJ3qGypooGJdYeCd6uRpohrkbBrdrOMqWuKhm5tn56SlWF/q4uqdoB/jKafd599haWVnaBpmod2rGeerYy3c3e+jaSTWYOmjathdXJ0cHx0cWJqfm5obVNWW1VhYVxrTV1SXUldbW12YFtxWVtgWmdzZW5vcWNxdGB3en55cnmDc4R/gHt7jIGCgHZieGRjbXNkUmxnaG9scmlmaWFfXlxia2JtbHpvXFxiaWJsandtZ2xuYpWmqp2BgJ6klqmqnainrqSZiYOYq5qepImapZ2pnYWMmo6GnJGFko2MjXSGeoiEb42EfpiTdHSGcpKDbX+LkoeGlI98e4GFl6WNf6WmjoGOiYWVdoKHkm9si6mBg4yUjomcn4mNk6ujoJCAdZSXiH6BeZSuo3+Bm3GPhXmQi4R/e3KmjHF9fXqXlpuEjnh7fn6HlJWTinaQmJ+gg3p9iWyMhVt5eHF5cGhufpKJcX90go+Uk3GFg4JljX9fgX+Ld3VzlHVveW5uh22Ehl53aXiNZoGCho6pm350fJdqiYhvgHZ9hnZtbGeMc3l7mHiEW2tYeY9obndycW94eG9dbIZuaWdWWmBXXGVrY1ZhVV9RX3B4eWxrdmVqa2p2fHFydHNhb3Vic3uBeHV5gnWAgH+AeIuFg317bX9sZHhuXlduZ2h1a3hqaWpkXGBaY2plbHB1blpbYmtkbGx5bWhsb2GOlLmpp4uhopqmpJmknKuioYSEmKySnaCJmqabqZiDgZuKfpaTh46KiY1yg3yPfX6PhXuXjnRyg3CWhXt9kouGhpCFeH5/hpijjXunoYuGkJCFloOGjpd2coWqho6SnJCInp6IjJuooKCrg4mOlJp+fomWraiPk6aPd2+dkYN6km9+qIVwfZVxa3B8gZ+Mf5OOjGhtXYOLjJubno5zlYuIcXRrgnZzgFlyboeRgX1+jGpdamR7hYOIgF9peHube4KLgnaBhoJoeYuHa2FxcoN3X3OMgomQp5WGZoyPg253i4Rxho96b2VnZHqDepZbXGpnbnZbe3h3dW5zc4JmXG2Ka2xiWVleWlhsclxfYVpeXWZ0fnt1b3Rja2tqe3xye3h0ZG10Z2x7fnZ6fHt6en9/fm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtoa2pxcm1XW2VubGdzeW9oam1gi4yqsaKQo6Ganp6Xnpmoo6J+g5itjZ+Uh5uikaWVf3uYhHySmYmIhoeKc32Ai3aFi4GElopxb4BymIaEfpKEg4aKgXqAg4ubn4+CpqGHeI6YiZWLi5yXhIN6rYKRmJmUip6dh4ihq6CioqOLiJObnKOZlqqhp6agkpuHlo57eI6OhKd+f5KRkpOcsaablZ6QjbKTmISljIyVm5+JkJuCiZGKa3yNdndlgoaQinuJnYSHi4+IiICFhJB3fHl1mqGIhoqfi4WUf36MgYB2cHSGhH94iIeLkKaQhIWNiIONkIx9iIuJkIF2bIKEfHmZanJoYXSKcH16d3ZvdnSBXV5vhmhuX15aXF1TaHJWY1xcYWxodXx8c29wZGtqaX97bXh/cWlvcGxmgHtygoB4f32AhHptg4yGfHp4fH16g3lOZHZrc21wemRrZWJiYFt0ZnBmcnJtVV1sdG1peXpxZ2lrZYyInbqflqKhmJWZmJSZpKCee3+aq46ejYWfnYueln15lIN7jpmJhoSEhm54gIBygYh+iZSEbWt+epeGhIOQf4CGhIZ8h4ONm52Sh6qfg3KKkIaTkoydkX2Ne6qEjZKYlo+cl4aGm6egopqdhoORmpmZkJqmoKadnZCWgJCKdnyHjoSle3yOkJGGmKqhnpOdkI6rjpGAnoyJk5qego6XfoaNgm94hXF0YH+Cj4Z1i5eAg4+ChoR+hYOUbnh1dJKhi4yFmoWEjXSAiXx8cnJ7iIR7eYuOhJOnj4aEj4KEioqKd4aIiYt8b2t+gHtuaGxtZ156f2h8e3Z0dnV7d1xgcH1udWBjWl1eUWdtU2VbXmFraXZ6fnFsbGRrameAf2xzgGxsdG94boR5boeAdoKAfYR2cYKNiH57e3x/e4KKYGl7anVoaYJkamNgaVxkdWhvYnVtbFRjcXllcHp6cmVpbW2Lip+3mqGjn5KRlpeLmp+fnnt4nqaQm4qGpJSLmJl5eo2FfImRg4yCgYJtfH94c4GFfYuRfWtofYGXiIGIjnx+hoSHfI+Aj5ubkYinnX9wi4uMk4ehoYqFjXyokYiQkpeTlpN4jKOhoZ6Wmn+AkJqYk4ybo6GkmpeRm36NhHh/g4+HoIB9jIyPfJikoKGTmZCQp42PgZuRiZKXm32Skn6GjYF1dIJwdmB9f42GcoqVfIiLcox/goWGjmh3cXiMmJKPf5d+iItygYZ8fXB4e4uEenqRjYOWppOLhpF8hoaHhXaChImIemVye395enFsamZefnNofHV2dHxzgGpeYHR2cHhkY1lfXlNraFRkWV9haGp2eIFxZmtjbGhlf4BqbX5obnFrfXeGemuMgXOBgX2BdHaCjYZ+fHt/gX1/j2pyg25zaWGHaGxiX3FWdG9tbmB4aG1XanR2Y3V7e3Jiam55iY2fspKlpZyOkJiPhpygm5x8dqSgjZd/jKKKiJqWeHuGh36DiX+JgoB/cX97dHaDhX6KkXhnY32Gl4qCio14fYCMg3mWgJWXlo2WoJt+b4yCkZSGppuIjYmEppWFk4uWl5OSdpGeoaGYlJd6fo6Yl46Wm52knZiSlJt5j4WCd4SXjZ1+gYmNjHOXop6ik5mOj6KMjIOXmIOSlpl+mI18iI2BdnF9bnpkgHyKhXCGk3+QgmyHgoGAiYRldW98h5KXjX2TeIuJe3+GfHtxfneJhXmEkIqLmKKVgYSNd4iEg4J3fIKJhnZfeHd9dH54Z2xkYX9pandzdHV9cXxiY2FzbnVzbWFaYV5ba2RSYlhgYWlrdnmGcWNqY21laHyDbGh0aGxvaH98gnltkIZxgIODf3R8g4yBf356goN+fJBtdol0dG1limxqYWN1VoRpcW5geWdsYmp2cGZ5fHpxYHJshoWQnK2XpqiejY2Xh4afk5eYfXiqnIqZepeci4yYkHl7gYt9fIN7gIKAeHR4enN9gIR/iYuAZF59i5WHf4WHdH1+in99l4SXk5aMo6GYf3KHe5OSiqePjI6Kk6GShJKQlJeRi4GPmKCakpCRdH+NkpSJnZ2ep5iYjZWWc42OimuFmI+ZeoeIkIlvl52ao5OVio2fjIeCkpx/kpKVhpmIfImJgXpxeWt1bHt9i35uhZKClHdvgoN9fop/ZHJqe4CWl4R/jXSQiYN4h351eIB9hoB8g4yFjZSkkHmFgnSJh32AdHaBiIRuYHt1enF9b2FvY2R7Ym5vdnN4d3N0YXZfb2x1bm9cXF9eXmpeT11YY2FobXR7iGtfamVqY2h3h21mbGhpbGiAfHp3b5CHc4GDhH1zgYaJeoJ9eoGEfX2OcnqLeHhubIdraF9pcWOHaHFvZXdobmxheWhrfXt4cGF3bYuBmZqqoKSonYqKkYaKnoqVl313rpiMl36ek5GWlIh3fnuKfXuAdnh/gHB0c3tvhn2BgIp/fGFcfo+Rhn+DhHN6gIZ6j5GHkpGbkqWblYJ+gXyOi5KkiY6KjZibjYaRmJOWjomJjJOdk5CMjW6DkI+RiZ6ZoqGXloqXkW6ImYRmhpmOk3qJhZCKcJaalKKSkomLmoyCf5GefJKPkouZjnuKhId0c3VrcW50e4t0boWQjpJxdIB7gYKIfGRxbHl9mZR9hIh0kIuAc4h5b4B9gIZ8hYyIhY2VqI17iH1+i4V4fnFwgIWDY2h4dHVwfGJecGBrdF5xanp4eGtzcGV4XW1sc21zWVpeYGJqWlBXWGVjZ3Fxf4dmXWloZ2JncY5vZGlnZWpogHp3dG6OhXSBgYJ7dYKJhXeFfHiEhXqAiXd/i3t6cnmDamtfcGh0gGtyb21xZ29sZXxjboB5dnFsd3eKf6KYoqihppuHjIqBkJyGk5x1gaqUko6HoIyWk5CAdHx2hXd4f3Jze4Vrcm96bop2gIGHbnFbWX6RjYh/gIB2dYCAf6CGkIqSnJehlJh4in+BjYmdnoqPhpKYloWJlZmPloyLjY6NnYqOkINtiIqQkYmclqGbmJWGmIhphKOCZoWdipF+i4OLgXeTmJKfkpGJiZWOf36Ql3yRjY+NmpJ9in+CbnZwbG1vcHuFaXODjpeKcHd/dIKJgnhmc292gZmOfImEepSReXaIdHCJe4WMeouGg4mPnKOIfIR3got/eHhva4GDgV1yc3FwcHhaXnBgcGpeb2l8enBtbWpsdmBwb2pybVpYYWFiblhRU1pmZ2N1cISCYl1qbWRiZmuSbWBmZl9oaoF1cXJwi4B1f4KAeHWAi4B4hX93h4Z3g4V7hox/e3aKf2pxY3xihnxvcWx0amhvbHZ3X3F/eXt0dXSAgn6klZqtn6eWhY2Df5eUg5CfdYuflJOGi5uMlY2LenJ4dIJwcoV0cXWIbG9sdW2Id4N+gG1uVVGBq5SHgniAdnKCeYGggpGBk5KYnJKaeJJ7g42TpJqTjomVmZOFh5eZjJSMiY+PiJ6FkIp8coqFiY6InJqfm5aUgJR/aIWch2eGoIiShJGDiXGDkZePm46QjYyQjXh7kpB6jouMkZaMfIh8gGt2am5ra2x6f2F5fo6VgXZ6gHeDjXx5Z3RsdIeVi3+IhnuUkHF6hHB2jHqJjHuJfYKMkZ+dhX18eIKMfXdxamyBgnlfd29tbHJzVl5vYnJgX2xueXBncGZmc3RocWthd2VdVmZhYHJTUE5cZmVdeXCIfF9daHJiYmVmkmlfaGRbZ3B+cGtwc4p9dnyFgHR1f4x5e4aAeIiDc4aFfoyMhHt5lXdmcmqDYIh+b29remBqbnR/dF90fXmGeHRzhXx4oI+ZsJyljoKKf4OaiICMnn+LmpOPhIiYjo6PhHZ0dnOAcG+Fc3Bxg3BraXZug259fG11c1JOgt/IktaTfG90hHaDoIKTd5WRmZuQmnuUc4WQn6GTk5CKk5uUhn6WlYiNjYiRjYmcgI6BeHqMfoiMipycnZuVk3mNdmeIkYdsiKOEkoeXg4ZjjJGZjpWKl4yNiotxe5SIe46IipKRiXmFe35se2Vyb2treXlcgHmPjoB6fX5/ho56eWhza3OLj4mChYV9lYxrfn5ugIt+i4d9hHqBj5aamop9d3iDkHlzbWdwgIRtanRvaGp0blNeb2RwWV9rcnhma2piZnhycHBjX3hgYFZrX152T05MYGdjXXlxiXRcXGV2YGFlZY9kYGZhWGlzc25rcXaMfHR5hoJ1dn6Lc3+Gf3uJfnKJh4GRioh8fph2ZXNtfGWIfm9wbIBabG55eXNhdnp7jXZzd4p3eZ+Lm66boJCChXeIlX59ip2HhZ+RjoWMl4STjoeBdHdweXFuhG9tbn5yZGR4cX1ten1qaGxjpJrB3K7voXNrdYR2haKFkm+WkJWglJyBknGGi6OXiY6VipCdloOAlZCFiY+AkoqKl3+He3V/iXiGhI2cm5iZj492inZuhoiLfYqjhJGJnYWFXouUl4qPiY6Li4SKbXyWgX2IhYmQj4Z2hX19a31keHVqbnhzWIh6koeFen5/gIWLfnhlc2p/iY6JgoKAjJaFa4F2boiQgo+Ef4J6f5CWk5mQdXR4iI11c3FndXqDYnRtb2JpdmdSYHFnbFVfbnR5YXJjX2h9cHJuW2NyYWJXblpcd01NTGRnYV52c4ltXFxkeV5gZGaFYGNiXllqcmtua3J2jH10d4SBeHd7iXGDhH1+iHt0i4mIloeMfn6Yc2h1cXlti3pudHCBWHF6dnlxZXd5hoxpd4CJcn+ch5mnnKOShHxwjJR4eYudhIWhjY57lY1/mYiEe3J3cHNqb4FraWx8dF5geHd7cXV7Z2FlfOvatcnD3IhzbHOBd4qaiI1pmI+PnZWTgYlxhYmgjYSLlYqMmJR8jZOIg4mPe5GLhpCCf3Z4g4Nyh4KTm5aUmIaMdod/cISBiYeZoYOUjJ6DiWGDlY+HiYaKjYeBh2l9lH99g4SJjo2CcYZ+f3F3aHZyaXN3bFqMfJKChXx/g4CEioJ1YXRsiIGPioJ+f5KQfW2CbHiGj4aRg32BfYCSk5CXiW9yeo2GdWxxbHJ4gV9zaW5ca3ZgUmRyaWZTX3B2dGBvYF1ognFzaldnaGNpWG1WW3VMSkxlZ15icnOFaVtcZXleXmRne2BkX1xZa25lb2pzd4p+c3OBfnp2eohzhYJ8gId2d4qGjpiBjIF7k3ZsdnV5eJN0bnh6fVh5hXGAb2d5d5KCZHaGhXGKlYWZoZuiioZzb5KLcneOnH2KmomJfJ9/g5l/gXhxc25vZHJ+aGZsd3dbX3l7e3FxgGlhZ2F/1baOkKZ4bnF3e3CSkIyHapmOiJySjIV7aYiLmoeBkpGGh5iNfI2NgYGJjnyQjX6KhXp1e4J6cIaAlpmOk5SBiHWDhnaDf4qTnZ6GlY+ffohhgJOHhYiEio6Af4NnfZGAfn+CjI+Qfm2CfIJ0a212dHN2dWtijYGPf4V+fIR/hId+cF9zcYV7j4yCfH6RiHpwg2Z5g4qGi4N8hH6AlI+Rk4RucHqMf3Vub2tsen1iaGppWG12WlJpcmpiUWJyeGxiZV1ZaoNtc2JcZ19kbF9uVFtvTkhPZ2VcZ25xgGxbXGNzYFxjbHdkZV1dWmxsYm1qc3aHf3Fvf3x8dHiGeIWCfYCHdXmJgZKWfIiGdomBb3d5e4STcG18gXdeg390gW1pe3OUc2dzh3xykZGDmp+boIaHdnaUfm12lJd+iJGDio2afIuadn12cW9samF0fGdiaXV6Wl94fHptcX9lZGhoV52PXnFylrzDg3VxlImQfnKXjIack4yIc2uJj5aBe5SLgYSbjHyLhn18iYx/lIh1iYV2d32BcXWGgZ6UhpWPg4Jyf4h1hHuJmJyXhpOOnYCIZX2TgoCGhImJcoF9Z32Le3l/f4eLjnxpgHyDdmZveHhzdnNsao2FioGKf3iBgISDf2tecnh6fYyJhXuBj4B+coFpeIKHi4WEeIN8gZeNkIx9bm17iX13dW9oaH12ZFxwYldwc1NTbnNpYU5mdHhmYF1cWG6Ab3NZZWJdam1gcE9Za1FEU2dhWmtubXtvWltebWNaYm93Y2ZcXWBsamNtanN2goNxbn57f3R1g3qDgnyBhXZ+iYGWkXiDinSBiHJ4eX6NkG9vfIFxaYF5en5tbXx2lWtqeIR0bJOMhp+YoJmFiG59jHZqeJiPf4KKg5WXiXmOlm96c3BsamRgdHpoYGVxelphcn15Z3B6YWVlj7Gyd0piWqTZ0JZxe5CLkHh9lYuFmZGNhm9shpKSenmShoGEmIp8h394eImKhJaAcIyIcXR9eml5hYOlkYSTjYN/b36DdoN3hZuYk4qSkJSFh3B7koN9g4OJg2+BeGiAhXhyf3+DioZ7ZX1+hHVkcHOAaHhwb3WYjIWCint2eICEeYFrXHF9coCHhYl9hol6iHKBbnGDho6EhHOEeICZjY2EeG5vf4R/d3tlaGp9cWBZd1pYcW5OV3JzZ2BLbHZ0YV1bW1l0fXJvV2ddZmpxX29OV2hRP1lmX1pwa2d5cVtbWGtlWWNweV9oXF5lbWhmbGlxd3+Hb2x/fYB1cIF6gIF/gn92gYWJl4pxgo1xe4Z8eXmDk4x1anp/a29+dH99b3J8e5RvboB/eGeSioKhmZ2RgoZnh4NvaHqWin6AhYKZioF8jYxpeHJrbGZfYW95bV9ib3lcZGuCemFxdl9lZtTqvooyOj6LjoByeYWIjo12g5eNfpOOjX9ubIWNjHZ9j3+FgpWJfIN4bnaHhIOXd2+JhWx1e3RmeYKDp4yDj4uEfW5/dHaDeYackIuQkZKMi4Z+e5KHeICEjYNsgHJpf354bXx7gYqDd2F5hIFxZHFofm10cXWBm4uAf4V+cnV9gHKAb1ttfnR4ioKLe4Z/fIh4enFsiIOPg4pygXl/louLf3Rua3eAgHV1XGlpd3BZV3xTWnFlTFtycmVbSnB3b1xbWllddH51aFliW2dmbmNpTFdmUT1eZlxddWVfdHBbWVVvZFlkcXlaaF5fZ21namtpcHd9jmxpgoR+eW6Ae3yAf4J6dYKBjJOFcICLbnh+gHp7iJKJf2h7fmt0e3KGe3N3fX+MeXiEfXxrjIyDm52WjIGAbI5+a2h+jo17fn+DlIJ/fYqIa3VxZ2hjW2Jncm9gYWx0YWhwiXlic3ReY2SboI9uXDVZr7V1aoCJfZKGdoaXhnSPi4p3cG2Fg4d1eYl4iX2TiHp/c2d2iH5+mG9xhn5odnltZXmIhKWHgIeNiX5ufnV/gH2MmYeCk5CYiIuEiXyPiHF7fYR8aX5ta4B7emp6doGHgXJgd4F+cWRyZ3WCbXR7hZSRgXyBf253eXx0fmxYb392dIuBhneHdYGJenhzbomAjoCFcn59fpOJiXpubmpugoJ1bl1nZnNxUVt7TlxxXE9ccnBkVktzeGpXWVlaYXGAdGBdXWBnZGhpZk5ZaE1AYWRbYHZhXHRtWFhTdGFaZG9yV2peYWhrZ21saXB3fJJraISJfHxwfn57gX+CeneAgImLhHF7h29xd4N/e4mNj4Nqfntud3l2ind9eICCh3+Dfn56bYWMiJijjYSDe3WLeWtshImSeX17gpGAgH6Kg3BycGNmXllnX3BwYGBncGZqb4p0YXRvW2FkanZ7f76cpqPIuHGFhHOUfXiGlIJ0kI2IcnJwhHuDdHWHdIh3lIh5eXFjd4Z6gJNpcoR2Znd2Y2p8g4iegn9/jo59cn5zhHmAkZCCeJaNlI+Igoh6iYlseHl/dWh7aWt/eXNpenaAgn1oYHeHfWprdGh7f2l2gYyQlH56fn5we3Z7c35iVnd9cnOKhIJ8gnCGiXd4cHCDgox+fXl+fHWOhoN2aXFpbYiCcnBdaGNzbkpldUxeb1ZUWXNuYlFPc3hhUlhYXWJwgnNbYV1oZWRjamRRWnBJRGRhW2NwXl13aFVXVndeXGVuaFZrXmFqZ2Vvb2hwdnqSbmmIjHl9cnt+eIKBgnx2fYOIhoNwdoNybneCgn6Ji5N/cIB8eHl6gYx1g3h/gYGChHqAdW9+iYuanoh9hXp3hntndIWMkHp/f3yJhoR2j4Bnb25fZFxYZVltcmFgYXFsa2iJbmBzaVleZG2Ad6naqceGh7JxiXhwjXV7h4+AepOKgHV0dX53gHBxf22EdJSGeHVsYHqCeYiPZnGDb2d2blttfYCQk4CAeJKSfXh7bYd1gJCLg3OWipGOh4WFe4CFbXV2f25od2Vte3ZtanZ3f398YGJ4hnpodHVjfnpndIWOjJV7dH91cYB6fGx/WVZ0fW90hId/gHhriIZzeGt1f4ODfXp9eHtyi4F9c2d0ZW6LhG10W2pfdWRIbm5MW2JXV1Z4bWJQU3R2WFBVWF5hcYRvXGBjbWVjXm5iVFxyR0JmX11maF1aemNSVlx1W1tna2FWal9gb2Zma3FocHV4jXRrjox1f3Z4fneBg4F7dH6DiIiDb3F/dHF1foWCiY2Ke3d/eIR8fIWHeId8fYF+hIB7fnN2eYyOn42Jeol2dIN5Xn2FmYx5h4N0hYaFd4l7Ym5sW2JbW2FWanNjYFxnbm9mh3FhcWZXXWNrf3zKzoi5omptbYpscYRyfISKfnuShXp5dHl1dXtqbHVjhHWRgndwZ159gnqLiWVygmtqcWNYbHuGnIiCgXOXlHd+e26HcYGKi4dxlo6QiIWLg3t5fnFxb35naHJibnhxamtxd3x8eVxleYB3aXV4ZoJ2Z3SHi42UfHKGaW9+gHhtfF1YcX5sc4CLfIFubol/cXZod3+Bf4F2fHF6dId8enJmc2FujIJsc1hrX3dbSW5rTVZVXlRVe2thT1R1clFRVFZeYnSFaFxgbGpmY1luYVhicEdBaF1gZl9dVXteT1ZkcFpbamhdV2dfXnJma2dyZ3BydoV4bpWKdH96eH55goeAdXOAhoWOgnBwe3h2dHmGhoaLhnp8f3WLfn2FhISHf35+fYd/fHh2eXeSk59/jHyLbXaAeWODh5eGc5KKb4WFgXqDdGNuallfW11dVGdzZWBZZHJyZoFzYmtlV1tgaX93vq57oLdtYnOGaHR8cnqDhnp9jH94eHN2b3t2ZWpuYId1joFzamJefnh5i4RmcX5oamtaVm94iqSBhX9xmZNxgHh1gW2AgpGHcpSIjIeDiIV9eXRyb2h6YWptYG12a2dqa3l3endbZ318eGVyfW6EdGV1hYyGlX9vi2ZreoN0bHRiXG97anR7i3uBZXSGfW1xZ3V+eH1/cnxsenqBenhwZmxibop+bW5Wa2B3VUpqa09ST2hOWXxoYk5VdmpMUFRVX2d2g2ZdYHFoZ2FXaV1ba2hKRWtaYmRXWVV5Wk5XbmpZXWxlXFpkYl50Zm1kcWdyb3SAd3CZhXZ/fnd/fIWHfXVzgoh/lIJuc3h6eXJyhYeIiIR5gX12j398hImOhIKEe36Lg3t3fHd3mp2XeoqDhml3fXxsg4STgHKPgnGGgn6Bf29mbGdXXVtcW1RkcGVfWGNzdWl2cGVlYldcXGiAcG9ygHSJZWV4fml0dnNzg4R4gYR5d3R1bmt7cGFna2eGdI2EbmZdX31we4l+aW13ZmlkVVdycI2mfIR8dpaQc3xze3lte3uRhHaYfIeGg4aDfXVwcmxndV1taF9sdWRnZml6b3tyWWeBd3VncIB3gnVid4WKfJSAbotqbXqAcGVyZWBteWZyd4p7fmJ1gnZpa3F0enB5eHJ9Zn5/f3l3bmNlYm6GfG1rVmpicFNLaWtPTE9wR157ZmFNVXRjSk5TV2Fqdn5lXGdzaWVgVmNXYnBdTEtrWGNhVVRVc1dMWXVkWl9rYVxbY2Rfd2ZtYnBpc25xfnR0mYF3f4B3f36GhXp9dYKEfpeFbnJ0e3p0cISFj4GAeot1dJGAfYGUjoCFhH1+jIZ7foB2e6OlinmIhYRsdXx7dYOCjHpuhXN6hH2Bg3VuamhlVl1bWlpTYm5lW1hic3tqaG1pX2JXX1ppgGprb4BobGFoeXhrdHR0boWBe399dnVtemhqeWpfZW5ogXaPhGdlWGJ3aX6He29pb2dmXVVYb2iPp3aBenyQjnl1b35vcnV4jn93lHSFgn+FiHZqcnZnaG9cbWVebXNfZ2FpeGh7bVttgnJzaW+Afnl3YXeEhHiPhHOIcW95f3FicGhcb3dkcXOIfHhic4BwZ2p4c3Jrd3Z0d2ODe393dm9kY2NufH1rbFVpYmZTS21oT0dSbEVheGZhTVNyXUlNVFlla3d6ZV5tcGlkXFZfVW5uV0tUaFhmXlhNVWxUSlx5X1tfa11dWmJlYHpobGFvb3Vub3d1eph9d4CBeoB/h4Z6eXqDfoGThHF0dH56dnSFiJB9gH2QbHOVgXyDn4V/h32AfoaCgIp7doSsn396iIeEbHKCenaAgIF1bodvfH9ziYBqb21kZFhfWllaVWJqZ1taXnWBaV5tbFxhVlxca4FmcnR9ampda3Z2Z3R3cW2Fe319eXZybHpoaXhmXWRzaHp3koFjY1RlcGeChXd3ZmhqYFdWWWhkkKdufniAi456cHB8ZnhueYt7do5xhH1+f4ZuZHZzZGhoXWtiXW9vW2dfbHVlemhddIBvcmtxe311dWJ0hYp6h4aAf3dydX50YXBsWXF0YnFyhXx0ZHJ/bGFsem9qaHl3dHFmhXV6enVwZGFkbnN+aWxUaV5dVEtzY1FHV2JHYnZmYUtUb1dKTFhYZ2x2emRlbnBmY1pXXVh2ZVRKXGNYaFhZSVdlUUhieFpdX2xbXlxhZF5/aWpgb3R4bW9udoOYeXKBgH1/iIuGfXV2hniHjH1zdXWCeHp6goyOfX6EiWp0l4F7i519foV6gXp+fIaIc3GProx7e4aQfmZyiHp0fHx2cm+GbHt+bI96YnBvYWVdZVZZWVZjZmtgXVxzhWlZcG5aXldaXGx7Y3B3dmxiW21zdGd1dXBthHh+gHl3bm50ZWl0ZVtndWZ2dpF6X11SZWZqgoJ0fWJjaVxUWF5iY5ClaHl0goWQeG1ueWd3bXuEenWIcoB4fHh/aGV2bWBmYV9qYF10a1llXW9vYnplW3d7a25ucHd4c3RkcoOSfoeCiHp2b3J9cmF3ZFtvcGJwcYJ8c2ZxgGRebnZpY2Z5enRtboF1dH1zcWJeZm5vfWRqU2hYWVRNd19RSlpZSGJ0Y2FJVG1TSUxaV2lscntibGxzYmFZWlthdltTS2RdWGlTV0hZYE5HaXVYXmFtW1tfYmJdhWhoYW54eWxuanaBkHlug36AgZKIhIF2dIl0jIZzcXd2gXd8fX6Mj4B+k35weJaDfZmSeYCAeHl9f3SIg3NwmaJ7en+JlXlkdYh5c3h1bHRvfmx5fHCRcl5wbmBnYmxUW1pXaGNtZlxccYhlU3JuW1pYWGBtd2RpdWpqXlptc3FtdHN0aoV8fn98d25ubGRpcWNbanJkdHaPc1tXU2RhcoB/coJdYmNdU1pgW2OTn2VycYWEkXRsanlsb296e3pxgHZ+cnp6emRmdmdeYlphZ1xed2hXYl5vaGF3YVt7dmppcm53c3N0aHCBlIKGfoR2c2pwfGxmdldca21icHOBenNmb35bYG9xYl9pcHxsa3N+cnF4a3BgW2VsbXphZ1NnVVdSUHZbUlBaUkhjc2JgR1VqUEhPWlZrbGt8ZW1vcWBbWlhZbHBXUlBmV1dpU1RGWlxPSHJ1WF9jbWNYYWBhXYtqY2RteXhrbml1eYZ7a4N9f4SZfIKEeX2Ibo+GcW93enx0goJ8i4+DgpZ0eIKUhYGfiXWAgIFzf4Fwh4J1b6KXdHuGi4d7ZniLb257b2Z4cHpsc3ZyjGtedG5hZ2VrUl1bVmdibGxaXHGMZE9vbl1WWFVnanVoYnRlZV1abnVucXV1emuHfH98iHeQc2Rka25hXG5tY3N4h2taVFZiY3h9fXGFXWNfY1RbYFljlpVjbnCDhYpzamh6bmVydnN7bHp0dW96fnVfZnJjW15XYmRZYXVlVV9gbWRhcV1dfnBoaXNxc3B1dWtthJOBiHuFcXJmbnxvcW5TW2ZqZnF0gXZzYmx2VWJxaltfbmV8ZWx1fHJyc2ptYFlkamp3XmZUZFVWUFRtV1FXVFBIZXJfYUZXaU5IWFRWbmlkfGlrd2thV1xVW3RkU1JXaFFZZlRTSFpaUE14d1tfZWxpWmJgXl6PbmJma3l1bm9odnZ/f22DgH6Gl3t/iIGKf2uTiHJndIB7dYCDfYmPf4uTcn2KkYWHn4Z7f4aMc4CGc32Ddm6ljHOBjYt3eG56jGBkfHBmenN5bG1xdoJnZHtsY2ZnaFNeXlRnYGxvW15ujWhOaW1gVFZTb2d0bGV4ZGVdWXB0bXJ6eHNtiHuAdpx7emthZWxtXmBvamVweX5nWlZYYGt4fHtwhF9iXmdWWWBXZJyIYmtxgYd9d2tqd2xbdnFreWl1cm1ve4ByWGpuX1ldVmJjWGVxY1NeYWliYmxaYH5sZmtzdW5td3ZraIWMf4h6h21xZnB8bHFsY1lgaGlvdIFzcl5pbFJlcWRUYm5heWJwdnt1a3Bta19YYWdodFxlVmFWU05YZVJPXE9PSGVvXWNHWWlNSV9LWG1kYHhobn1kYFVeVF10W1RSYGZOXWFUU0pcWVBZdXZdX2ZtaFhjYVtejnBjZ2p3cXNtaHZ0eoNzgoN6iI1+fIqHjnpukIp0bHOCdH9/iIWHkoSVj3p9jI+IkZuEgHyMhHN/gXN0eHFuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo6Ojo6Ojo2NjY2NjY2Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpKTk5OSk5OSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjIyNjY2NjY2Pj46Ojo2OjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHx9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyRbWZnZ2dnZ32FhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERFQjEvLy8vLyyApKCgoKClXiovLy8wLEiFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJFnX2BgYF9eeYOCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTUzHx0dHR0cGH6ppKSkpKpWFRwcHBwXOoOBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkY6NjY2NjY2PkJCQkJCQjIeHiIeHhomTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhoWDg4OEhISDjJCPj4+Pj4iCg4OCgoKFioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkpKSkpKNkJKRiYeOipCSk5CKj4uKkImPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6Ojo6Ojo+Pj4+NjIyMjIyMjY6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjIiGhYmJhYiQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCRjYaGh4WFh4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkI+HjI2JhIaIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjISKhoaIg4qPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiIqJio6Jjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpKSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f35+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpKSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9+fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyNjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4qKh4eJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHV2d3VycHFrbHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoZ21lamZoZWhnY2JiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpeXF1eYmlgXV5aWV9bWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent5dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVBQXFdebFdVUlFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBgV11yVU9PT05PUFBRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLTGNUW3RWS1BNTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NHZlRVdVNKUExJSUpISEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gH+AgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7Pj48RUQ9P0pjW1VwS0RGSEdGR0JERERGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs7PDxITD0+VWRiXmdPQUVFRkRGRkRGSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dXNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYGCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozs+PEhibWhmbGBGQz9MQ0NGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc9PTg5VWxya2pwa041Slg+QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN1c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/Q0BPQjxYbnFubHNxW0NjVT0/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9AO11tP1JZSlJrb2tncnJmX2pIOz5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0ZEPjw8PUA9ODo7bnZHQWJdXGluaGNxbmtsZj45Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fX1+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBaUTw8PUtOSEh2dk04V2poa25qb3FubWxWOjo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAQ3N5SDxfgIOAent3VjtDYHN0cm91cW5vYEE/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUBIcnlrZYOEg4ODgH1dPj9HaHh1cnNwbWxMPkVCQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dHd6fHt8e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEZvdH6CgoGEfn2EdUxCQ0NPbHd4e3pxX0VFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWhzfYF8f4R+eYVyQ0RFRUNkgoeHiIVeRklKTExOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAgHiAhIWDhIltQUFXdYWIh4eHiYJXSExNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCgoODhYaGiINVbYaIhoeGh4iJiHxQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSUhISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpWgYSEhIKChoaGhIKGhYWFhoaGh4iGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJAQUNDQkBBQkREQkNGSElISEhMTUtHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWaFhISEf4GDg4KDhISFhYaHiIiIiImMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODg7Ozs9QDs5OTk9PD47Oz1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaYaEhIF+gYODg4KDhIaJiouLi4qJiouMiVQ6ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JmhYOBgIGDg4ODg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6Ojo6Ojs4OTg5ODc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXd5e3p7fH1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXKEgIGDhISEhISGiYqKiIeIiImKioyKiYmMej45ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozw9Oj47OTs7PDs8PDk6PDg6Ojs6OTk5PD88PUFCRElKTUtJS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUFCPkBCQEA+PT4+QD8/P0A/QD09P0I/QUE/QT89QEBAPj9BPT48Ozo7OTk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKDgoKEhYSFhIaJiYiIhoaGh4iJiouMi4qKi4qLXj5ER0lLSklGR0dERkhHRUJAQENFQ0NBQkNCP0BESEVDRURFRUFGRUZERUZEQEI/PEA+PT9APj8/Pz4/Pj46Oz08YHFydHR2d3p5en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0NGWIWCg4SFhoaGiImJiIeGhoaHiYmKi4yNjIyLioqIV0hMTU1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fX5/fn5+fX5/gH9/gIB/f3+AgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E/QkJHR0pZhYKDhYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1PTUtOS0pMSklJSEpGREdISElFRUhGRkVMTE1JSkdHSElKT01OTExOS0dHR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4ODw7PD06P0E+QEBDRklKUWCCg4WEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSEdFSkhESkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dIRkNCQUNVbnB1d3d5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0dCPzg/QDg6PDg9Pjs9QT4/QERISkxVcYOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMi4uLi4tfUlJQTU5NS0pHRkJHSkdMSkZLT0xLSkpNTUxPUE5ISUtMT1FQUFFPT0pJSkpMSkxGR0hHRUdJRkVFQkBCQlxvcnd4eXp5eXl6ent8fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFZ5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKREVGS09OT1dWUVBPUVNSTVNUT01TTFBTVVdSU1FQTEpNTU1LTkdHSkZGSEpEREVFQkRDY3B1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9DQ0ZWTkZOUFBUWHuGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMj4uLi2dWVWthRVJRUVBJOztRU1JgdV1VVlRWWVlSWVhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLSEhKSEVGSUhJSElpcnZ5eXp5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklJR0dGRT8/QUFFQkNHRURFTFhSTVRVVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1E/QFZVWVxkYFZZYnJeXVZdWlZFUVlaW1lfVFpnUlVWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6eXp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3lucFhaW1pSVFJWVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSVlYWVtdWFhZV1JRTlBRTU1PU1FRVVJhc3N2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUlGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin9mWVlcWVNVVFdSUVdWY5aAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ1xbXF1dV1JPU1BQUVZWVlZZWm5ydHd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbU1NRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlRTVF5aWFdXV3prWFpbXF5UUVFQSU5PV1ZYWlpkcXN2dnR0dnh5eXt7fH19fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVRST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTU5LTUtISkRGSEVDPlNjVX9SUVFNS1JUUU1PWVFNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXG1ydXZ1c3N3e3p6e3t9e319fX59fX1+fX5/f39/f39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJWVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz9DQ0NDQj9EUEJEQEM+QkhHVkBITk1HXWlRSEdPRkRFRkhHSEJDSEdIS0dEQUFEQE9QTVNkc3R1dXN0dXp8ent7e3x9fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiW1hTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFNPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz8/Ozs+QEA/Pz5rUUthRUZISUVCP0dMTUdNUVVJQkU/Pjw9PD09Pz0/QUNDPz48PUI+Sk1GVW51dXVzdHZ4enx7fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqamZgW1FSWlxZXklKUFFOS0xRUlFUVlRXUlFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXt4enx8eHd4ZEJAQEI9OkJDQUFEQlxdT3tOT09OS0xNT09RTEtMV05IR0BCPDk3NzU5OT07Ozs4OTg5PztCSD9cdHR1dnV2eHp8fHx9fHx9fX5+fH59fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eYGVgXV5xdmteYGdrd29vbGpvbm5sZmJYR0ZGSEJBR0lFRUZETVJQYVdSWFFQU1NSVVtPT1FXUE1KQ0Y+Ojo2NDg3OTc5OjM2Njc5NTxCPWVzc3Z3d3l6e319fHx7fH1+fn57fn59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01MVFRTUVFVT0xSU1RXWFRUWFFMWFlaVlhYVlhZXVdXWGhza11WYXNrYWFfXWRhX15ZVVBNT05MSUhKS0lIRkNRUFNaV1RUTlFTWVNcZVVPU1RRTkxJSEM/QTk5ODg5Nzg4NTc1Nzg1OTlHbnJ0eHh6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTFBSUk9NTU5OTkxKRlFQVVlTVE5KT09UU1RcVlJVU1JPTUtJSEhGPz89Ojc4NzY1OTk2NzY2NVdwcXR3eXp7fH1+fX18fX18fX19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG9mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9JR09QT09NUkpPUFBQTk5PVExNSVBPU1RVMjxYTUlBUT1jYVFTUVBOUFFQTk5NUU5UUlBSTUlMS09RUFJSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjQ1NjY7ZXBydnd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkZBRkdHSEZKREhKSEdFSExIS0hGTE1QTUcvRV9SPjNAPmpvYVJSUUBGVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3NkRucXV3ent7fHx9fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRUZISk5LRUdDT1JDOEVOU11mU1FTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSExMSUtLTEtIRkZFRDxBQT47QEU7PDg5VHFydHl7e3t9fHx7eXx6en5+fHt1dHZydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtucW1pbWNMT09NUVNMVFVUV1dVTExLSD05ODc7P0A+PD1AQEI9PkVIR0RGRklHS0pARkFBQEZIRUpPSFBSYVxRUFJOU09PUExMT01LTUxNT05bV0tNUU9HSUhDSUpMTEpGRkZFP0JDPjxCRj9CP0FkcXV3e3p7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj47P0FAQD5BRElFQ0hISUdJRUJCPz49Q0JBSEpFTU9iZVFNTk5XS0xNS0xNTU1MS05OU2RNSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES29wd3p5eXt7ent6d3R4dXh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEtFP0I9OTk5Oj9CPzxAQkFBREVHS0ZDSUlHR0hDQz9CPz9AQT5ERUNLTlFUTEpJTVRHSUlKTEpLTElKTE1PUFJQS0dDS0dDQkpKTE1PTUlKSUdDQ0NESUpNTElac214eXh6e3t5fHZycHVydHl5dnhqcW9rbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxanFoZXFIS0RHSEhHSktJSktER0I9Pj06Ojo7QEI/PUJCQkNIRkpMSkRJSUZHR0NDO0FAQj5AQENEQ0lNUEdJS0dIS0RISUtNSEpMSElKTEtNXVJJSERNR0FES0tOTVBOS01KS0ZHR0pNTlFOTGNuaXd2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkb0ZLREZFR0VGRkdFR0JDQD48PTk6OjpAREA+QkNERUlGSkpMRklJR0ZGREI7QkNDPkBERENFR0xOSEtOSERIRUlMTk1ISUxHRkdJSUxOS0pIRU5JQkZNTE9NT01OTk1LSEhKT1JRUk5SZmdmcm9zeHV7enxsaGpuZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pDRUZFQkNCRUBEQj5APjo7Oz06PT5DQT5BQ0VHSkZJSEtIR0dHRkVDQD1FRUI+QkNDQ0VHSElHTVBKRkZHS05PS0ZISkZFREVJSUhLSUZIUEtESU1MUE1PTk9PTkpKSU1SVVRST1dkYGFtZ3Byb3J5emdlaGhjaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NCQEJEPEJBPkE9Ojo9Pzs+PkBCPkBCREdLRklGSUhGRkdFQ0JBQUZGQ0JDQkRFRUdHSEZMUUxJT0pKTExJR0hFRkVEQ0lISEtKR0tSTUNOT01RT09PTk9PS0tLT1VXVlVUWGBeXGlhbWluaHJzYmVmZWRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNxcmprc01HR0ZIQkJAREU8QUFAQzw4OT0+OT88P0JAQEBERkhFSEZGR0ZFRURDRUNESUVDRkVCRUdFRkdHRUpNS0hRTUpLSEhJRUZISUZDSUlKS01LT1NORFFSUFFSTk9NTlBNTE5TV1ZXWFZYXVpdZGBoYmppZ2tfZWVmY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaW96TUhHSEhCQkJGRTxAQkJEPDc6Pj46PjpAQj4/P0NFRkRGRERHRURFQ0RFRkdKRUVJR0NHSEZIR0VDRkpKR01KTEtISkxGSUlLSEVLS0xNT09SVE9JU1VUUVNQUU1OUU5NUVdaVlpZVlpdWlhhYGBgXmhlY2BkZmhnamhoamZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN1bnByc3lOSUhHSURBQ0hFPEBFQkU9ODo+Pj08PEFCPT8+QUJGQ0VCQ0lFQ0VFRkdHR0lGR0tIQ0hIR0lHRkRIS0lHS0hNS0pLTEhMS01LSk5MT05QUlVWT0tVVlRRVFFSTE9RUE9UWVpaXFpZW15fXmBiXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZxdU1JS0hKRUJFR0U8QEdDREA6PD5APz4/QkI8QD5BQUZDRURESUVGRUdFSEhGSEdJS0lGSkhIS0hGRkxISEhKR0xMTExMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW1xeX19hYGFkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm92SktMSkxHQkVERTxARkREQjs/P0FAQEBEQT9CP0FDSEJGRUZIRklGRkRJSUdJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTkxOTk5QS09QUlVYVk1OVFZVU1JRUExOVFNSV1teXl9dXWBfYWFhYGJkZWFjaGJkaWpndotsa2lnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV1ZXFza3BxanJ2b3dKTUxMTUdEREFEPD9FRUVDPUFBQ0JCQ0VCQkRBQUVHQ0dISEdGSkdDR0lHR0pGSUxISUpNS01MR0tJSExLTlFLUlFMU01LTk5PUFBPVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5gYl5gZWFhYmhtZ2JpaGhteHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xNTExMR0VBQEQ+PkRFRkNAQ0FFRERGQ0NFR0NDSUZDSEpKSUlLR0VLSkdISklJS0hKSk5LTkxJTEhKTUtaZkpkXEtsU0hPTl9uVWtzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVGB3dWhqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5S05KS0pGQz9AQj89REVGRENDQkVFRUZCRkZIQ0RKRUVKTU1LTExHR01JR0lLSEtLSUtKTkxNTUxMSUxMTFtzYmRwXmxtVU1OZnNdZmVxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1Kcnl2a2Jga2VlbXlta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEQEJCPz5DRkdCRkNFREVFRENISEdERUtHR0xNTktNTUdKTkhKS0pJTEtKSktNTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW92XFlsUVxtbVpxbWtvbXh4dHNpcFxfcmtxalV1eXhwY15rZmJncXBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hFRUVCQkI9QEBGR0JHRElFRURCRklISEVHS0pHTU1OS01OR0xOSUxLSUpNSUtKSktPUE9OTUtOTUxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHRUZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdnYWRqdXlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSURFRENBQjxCQUJHREdGTEhFQ0NIS0hIRkpMTEZOS0xTUkxHTExITkpISE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF5uWGF0X25ub29xcm9udXN0dGpbXXRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnNIS0hJQkVFRUFAPkNEQkdDSElNSUZDRkpMSUdGS01MRk9KS1dSS0dLSkpOSUhKTElLSklISk1NTU1JS0tLU2tiWmleX2ljcnJaX1lqb19lZVVrX2NbYWJRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVudnFydXR3ckhIRklERURGQUBBRUVER0JISkxIRkRHS0xJRUZKT0xJT0lMW1FKRkhIS01JSEpJS0tJSElHS0tMS0ZIS0tMTExLSUtMTlRbXFRQVExQT05PT1ZRT09RT09RSklOUFFkcWlUWVdbW1xVWVpdWF1cXGNmYWFmYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzSERFR0ZGQUVDP0NIREZHQ0lLTEhGREdLTEhER0hQS0xPS0xXTElFRUhJSkhJS0hMSkhGSEdKR0hJRUZMSUpLTkxJT1xXXlBcW2BeT1hZU1xcYl5NWVpNWGFSSllhWlNgZFxhWFtkZFZWWFxZWlhcVllcXWJfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1BQ0RCRElFR0dGS0pLSEVFSkpKR0VISFBKTU1KTVNJSEZBSEZKSUtMSUxKSEZFSkdERkdFRkpIQ0pNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOXlxeU1teY15aXWBjYFlfYltgXltUWFhZXl1jYmJhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSURCQkNGR0VHR0lLSklJREZLS0tGRklKTkpOTEhMTkhIRj5HR0xJS0tKTEtJR0VJRENDRUFGSkRASkxKT1tjWV9eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV5eY2FgYmJiY2NlWlFZVlVcWV1jYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLR0NHRUJFR0hGR0hJRkdKR0hGSEtJTERES0tOTUxMSEpKSEpHP0dGTktLS01LS0tJR0dDREBEQUhJQj9JSkhPXWFaW2RdX1RRU1hdXFxcX1pLV1xMUlxZSU1eUE9cX2FjZGNjYlxkY2JkY2ZYUVVUU1tYWmFeXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYWGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSUZGR0lHR0lGRkZJTEpORURLSkxOSkxJS0pISUdCSEhRTUtLT0xLS0lIR0VEP0VDSEhBQUdGRVRdWV5YX1lfW11VWFhQXV1RS0pXXlheW11WWmBSUV9fYmJhYGJiYGNiYWRkYlhPUVFSW1NbXV1dXV9fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSENSS0ZISEhFRktKTVBFR0lKS05MTElMS0lJSERIS1FPTU1QTE1LS0hJQ0RBRURIR0JBR0VDV1VFXFRdU1ZfWE5UVU5aW01KS1VgYVtfWF9eYV1PWWJdYGBfYmNiXWFiV19fVFBOUFFYUl1bW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREVGR0RJUmJQRFdfSUdHSERGTUpQUEZKSUpLTkxLS01MSkpHRUpNUVFOTk9NTkxOSEtBREFDREZEQ0FFRkJNSENMTFBPT0xGTUZHSUpIR0xMTU9QSUxPUFBTUExQVFNVWllXWVhYZFdPU1RQUE9OUFVUW1hZWl1cYGFkZWNnY2tscHNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHSFlNR0hKSEdOTFFRSUxKS0tOTlVOT0tLTEdHS1BTU05QT05PTk9IS0VgRURfTERmY0VNW0lfXHNtT01WbVlMQ1BgVWxXZ0pdV1VeRE1RVUxNVFZRU1RYV1RYVVRcVVBmWmhoZFhTa1NWVlVbXFtgYGFiYmJgZmhmbmxocnp8fX6BhISEg4ODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09TSUtGYFRISk9KSU9NUlFLTEtMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUH9RSXxZWXJzWFBtSHFucGFWUHFxc1BCa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbYFZVV39qdHV1X2B3YFhhXFxmW19hYWFhXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEZKTEZRVkxLT0lLUlhXUU5OTkxRVE5PUVBLTE9HTVBTW1pUUVFPUFBQSkhaeF1UeGVoWVJUUXZndGxwYm5malFyT013bWpycHNycXJwb3CBXWZ6dXhxcXpxfnN9a3V9YlJnfGVzc29zc3x9b315b39yX2BgYmJaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpQT01NSk5WXllVTFFTTlhaTFNTUk5MUElRUlRZV1dRVFBQUFFLSGZ4bGN4cm1aS01VeXB1bXVibnZQZGVJZnZxbXdvgGpmeHhpWHNSaXttaWp6en5seHp/b2dvWHZ2anV1cIBgc2h8aWx4fG9fX19jYlpeY2RmaWpkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3V6bnx9eXhybk5LU3ROQ0JFUFBISktKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSVNUVVhXV09VUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExoeH14YHl7c25hXm1vZFJncnVubXlwd2x2dHRxbG1cdH56a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGZlXmFiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0cm9tTExbVkhHRUdSUEpMTUtMUVFRUFBRV1xZVU5WWVVmWFJSWV5UTU5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUtXa2h9bG1seGBbcHp7XmB6c2Nyb3hxaGV8aXJ7XVRLbGB2dWtpdXt7bX54a3xwXV5eYlteYmRkZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtobW1yfGttaGt7dG1ta21PSEpLSElJSFJQTE5PTEtTU1NPU1JXUlZUUFdaVlZUVFRhYFFPTktUU1NRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFhRTlBVVFhYWFtbVVJTV1tXWFdaT1NVV1dYUl1ZV11WVE9ZUldXV1hZX1tncl5bW1lcXV9jWl9jY2RmZGNjYlpjY2ZmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0tMTUtKU1FNUVBPTFZWVFBUVVhVWVVSWl1WVVRXVVlYUE9MTVZUUU5VU05PTUxRT0pJUVJLUU1LS09SVFJRUVNTSUhMTk9RUlFRUVRWUlhXXFdTU1FSVVVWU1pRT1NSV1ZUWVZUWVVUUlVUVFRXWFddWl5hXVxaWlxcYGNcXWJjZGdlZWRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkZGZoUEpLTE9PTE1UUE5TUVFNWFhVVFVXV1daVlRcYFZXVllVWFRRUEtPV1NQTlVQTlFOS1NQTE5VVE5RTk1OUVNQVFFTVFVOS01PUVRUUlJRVldVWVpbWVJVUlRXV1dZW1RPVFVYVVVaVVdZVVJSWFZVV1tZWl9dVVleXF5dXF1gYV5bYmJjaGZlZGJYX2BiXWBoZWZkYV5fXV1eWlpfWl9nYF5dXWNoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FbWlhXWFpaWFhWXWpkVlhZWldWVFRPS09WVFBPVFBQUE5NUVFPUVhUUlFPTU9TVk5XUlRVVU9OTVFTVVVUVFJUWFZaXVxaVlZRUldYVltbV1FUVlZWVllUWFdUU1JYVlVaXVldX15WXl1eYFxcYF9fX1piYmRoaGVkYVliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SUk9TVFFQVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST0xQU1FVWlVUUFBMUFdWUldTU1NYTU9QUlRYVVVVU1VZWFteXVtbVlJPVVZWW1tXUVRXVldYVlRYWlRTUlpXVlxeWl9fYFVhXGFhXWBiX1xgXWNhY2dpZGVgWWNgYV9fZWVfYGNbWlxbXFlaWVlXXFlcW2BeYFteXmFgX2JcWWBaUU5PTlZRUFRRT1VUU1BXXFxcWF5cX1dcXmpxd3mAY1xbVlZYUk5PV1NOUVFQUlRSS1FUVFlaV1VPUk5TWFZUU1RSUlpPUVNTVltWVldUVlpYXV5cXF5WU05UVVZcXFZSVFZWWFlTVFlcVFJSXVhaXV5cYGFgV2JbY2JeYWNfXGJhYl9kZ2pkZl5bZGBhYGFjZV9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVJSV1JUUFtdXl1bYFxgVVxdaWpyfXNsZ1xVWVdRT1JbU1JRVFJUVVRLUVdWW1laU09TUlZWVVNPVlJTWlJUVVRYXVdYWFNYXFheXVlaXVVVTlZXV15bWFFUVVlZWVVXWVtUU1ZeWV1dYF1iY19ZYFtlYl9kZF5eY2NhXWVnamRmXl5kYWBhYmNkX2JeWFpfW1xbWFhYWFdbWlxgXVtbXFtYWlteVl5ZXVBPT1JaUFpUVVZWU1RUXl5gXl5iXGFVXV5ia3l0bH1sWlVaVVFRU1xUVVRWVFZZV0xSWlZdW1xST1VTWFdWU1BYUlNXU1ZVVVtdWFtZVVpeWF9eWVxZUldSWVhZX1paU1RWWllaVlhZXFZVWl5cXmBhX2RkXV5dXWVhYmZkXl5kY2BcZ2VoZWRiX2RhYGFgYmJfYF5XWF5aXFxaWVlXVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXWBemhYWVpUVlNWXFhXV1ZWV11YUFVcWV5dXVRSWFJXVlRSVFhSU1ZUWFhYXV5YXVtVXl9YX19YXVZRWVRZWlphWVxVVlhbWlpYWVlaWFZdXl9eY2JhZWVcYlxgZmJkZmRfX2RiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVlbXFtZW1lZXVtbW1hYWVtZWlpdX11UWV1VTlNaVlNcVFZXWVdWXGBhYmNhZF9fVltgZGFfenVvaFlcWlVXVVdbWllcWVhZYFdQVV5bYGFcVFVYUFVXVVNWVlJTVVZaWlxfXlpfXFZfX1pdXlleVlNZV1laXWJaXlZXW1xbXFtbWVpZWV5fYGBkYmNlZWJkWmJmY2dmZV5hYmBjXmNjaWRkZ19nXmJiY2FhYF5fWFRaWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNQVlpWVlpVWFVYV1hdX2JhZGFkYV5ZWWFkYmBsZmheXF1bVldYWVxcXF9bWVtiVlRXXl1hY1xSVlhRV1ZXVlZWU1ZUWFxcXmBgXWFdV2FeW15cW15YVlhYW1tfYFxfWFldXF1eXlxaXFhbX2FeYGRjZGZmZmJZY2VlaGdkXmNgX2VjXWZpZGVpX2ZeY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlJXWVZXWllbXFlXWV5gYmFkYWRhXV5ZYWNiX2FgYV9cXF1YV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBXVlhZWVdWV1ZcXV5gYWBfYl5ZYV1dXlldXVlYVldbXGBfXV9aWl5dXl5hXFtbWltfYV5iZGNlZmVmYlpkZmdpZ2NfY15hZmVaaWliZmljZV5iYmNhYGBfXV1aV1tZWVhYWlhXWltaWVdYVlVbXV1dYGBiYnhMV1dcWVddXFxdWldcXV9gYmRiYmFdYFhiY2JgY2FiXlxcXFhXW11fXWBfXVtgZFxcWFpjZWNgUlxZT1hXWVtaWVhaWWBdYGJiYGFjX1xiXV9dW15eWVlVWF1eX2BfX1xaXl5gYmNcXFhbXWBiYWNlZGdlZWZkXGVmaGlmY2JiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVtZXFlYV1hZWFdcW1pXV1hQWFpdYWNmZnJrf0pZV11aWl9dXF5cWV1bXl9hY2JhYV1iW2JkYmBjY2JdXFtaV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pRWFdcXVxbWltbY2BjYmNgYmRhYGNeYFxeXl9aWFZbX15dYWFfXVtgYWJlYl9dVFxfYGNkZGZkZ2ZlZmVeZWZoaGdkZGBbZmdeYWhoY2hoZmNgYmBjYl9fX11dXFpbWVhYWFZaVlxaWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WDgYODgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ1dXV1dXV1dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t8fHx8fHx7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnV0dXV1dXR1dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7fH19fX18fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx4xdTS0tLS1JN7fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmJiY2NjY2NjZBGKCsrKyolY5KMjI2Njol+f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXjV5+Tk5OTnmXt/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyMj5CQkJCQlDsWGxsbGxRdlo+PkJCQi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dn5/f39/f395d3d3d3d3eHl5eXl5e3hub29vcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH19fX19fX19dnNzc3Nzc3l9fX19fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dHR0dHR3dHZ3ent4e3h3dnh7eXt6eX15eHh5eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t6enp8fX19fX19fHt7e3t7fHx8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx9fnp7fXt3d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3eX18fH1+fHd4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3d8eXl7fX58eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en97fHx8fnt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5fHt7enl8eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGCgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnNyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdXNzdHZzdHNzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3d2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh9g3qGiHl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHh4eXl5eHp6enp6ent7e3x9fnx7e3p7fHuSf4ySeXt7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8e359fJqFkJp/fn1/f398fH2Ag4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CAgYCAf36AgoGBooeTn4WAf3+AgX9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjIiGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35+gICAgIOmiZaih35/fn5+fX5/f35/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjImGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn+Af39/hKiMlKOJfoCAfn5+f4CAf4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSkpCKiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgYGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GBgYKCgX+FqZGQool+gYF/f39/gIGAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChYWDg5aro6Ggh4GCgoKDgoOCg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYCDhIGNrKmrsKWSh4eGiYiHiIeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKh4KCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OCg4WEhIGCgpuonaWqoKCLhomTi4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSLioSFpJ2UoKKXoZWDkZiGhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCgoeXkoOZl46cn5eemZGdkoCBgH+BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSNg5OpmJSWkKCml5ieoZyLf4B/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDipeIh56rqZ+aoauWmZ+dmYeCgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhoSEg4ODgoSOmYuEj6CioJyfo5mcnZyThIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgY+Mg4F/fn18fYycj4GHkZKTlpyZm5yak4OCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiISEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlpeJgH19fX18gpeLgYODjZCTl5ecn5mJgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqHg4ODhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICVn4t+f4B9h4t+hISDhIKJjpKOiY6clIODgoKCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZGhioCLhX2GiYF/hoWFhYaHg35+fYOHhISDg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDipGDhIuFg4KBf36Ch4aEgX9/gICAgICEhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGJgX9/fn6FgoCAgICAgIB/gYGEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4aHhoaGhoaGhoWEg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgIWFf39+f4B/gICAgICAgICBgH+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIOBgICBjYiBgIGCgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYmKi4qKiIiHiIiIh4eIh4eIhoeGhIODhYeHh4aFhYSEhIWFhIWFhoSEhIWFhYaFhoWDiZSTkI+QjoqGhYaFg4GBgYGCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgYSEgoKCgoKCgoB/fn19fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEhIGOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoODhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX5+fn5+fn59fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeGiYmDg4SDhYSEhYWGiIiGhYOCgoOFh4aHhoaEg4KDhIKDhISCgYGBgYGDg4SDg5GSkI6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoKBfXx9f4B+fn5+fXx9fXx5fIOGh4eEg4KDg4SFhYWDg4WEhISEhISFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4J/f4GDg4ODg4KCf319f4CAgX99fn59fX19e3p6foSEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYOEgH+AgIKDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDgoSCgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn2AgoODgoOCg4J9fX5/gICBgH59fX19fX18enp6gIKCgX9/f39+f3+Afn2Af3+AgIF/gICBgH+AgYF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDg4OEhYCAf3x9fX59fX6AgH99f359foGDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gIB/fn9/fn59fn9+f4B/fn9/gH+AgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhISCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7gIB/f39/fn5+fn6AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn59fHx9hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enp5eXl9gYCAgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+f36BgIKBf39/f4CAf3+Af4GAfn+AgH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODgoODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXt6eXl5eXmAgoKChIOBgoKBf4GAgYGBg4KCg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCg4GBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCCg3+DjISDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDgoODgoODgoKCgoODgoKSkIuIiYeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaGh4eHhoeFf319fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GDhYWGhoSDhYWDhYSDg4SDhISEiJKOjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgoGDgoB+fX5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fX+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWBhJKRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIKCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn5+gIJ8fH9/goCCgH58e4qCfYB/foGAgICCgYKAgYGBgH+LlI+Mi46OjYiHh4WFhYSDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIJ/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gZSRjIyNjo6KhYaGhYSEhYODg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2MjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIOAgIF9fn1+f36MhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKNjIyPjYuJhoSGhISEg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gH9+f39+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fnx7fHx8ent6fX+AgIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CLkI2Mi42MioeEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gH+BgYB/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/f39/f4GCgH5+gYCAf39/fn9/fn2DfHx9fXx/fX19fXt8fn5/fn5+f358fHx8fH18fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3x9en1+fn+AgIOHiYmJioiKiYWIkY6MiImHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35/fn1/gIB/f39/gH+Ag4KAf4CBgICAf39/gH9+fHp8fX1+fX1+foyGfX1+fHuDgn19fXx9fH19fXx9fnx9e318fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uLiY2Rjo2JiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEg4GAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fX1+fXx8fH59fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4ODhIeJioiJjpCNi4iIhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgYCAgYOCgH+Bf31+gH58f3+Jgn9+gpCEhIOBf359fI2HfX1+fX18f358fX18fX1+fn1+f3x9fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiOjYqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKFhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn59fn6Af319fXx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICAg4F/gIGEgX5+gH9+foB+fX5+gIF/gX5/gH9/f4B/fX9/f3+AgH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHt8fHt7e3x7fHx8fXyKioiIhYWFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgYB9f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx6fHt8fYmGhoWFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoKCg4WDhIOCg4SEhISFhIGBgIB+gIKAfn9+gX9+f3+AfX6AfX19foB/f4GAgYGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4KEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFg4ODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKEf4OCgoKCgoSCgYGAgIKBgICCgoOBgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Bg4F/gIOCf3+Af4F/gH98e3t6fHt8goB/gn9/gYCCgoGBf35/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH5+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fHx/fn+AfX9/fX2BgIB+fX2Af36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4KAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgYSEhYODg4GDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9/gYKDgYGDgoODhYN/fX19fHt8fHl6e3p+eXx5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAf39+f398f39/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+fn+AgICAf4GCgIB/foCBfn+AgoKAgYOChIWGhIB+fXx8fHx7eXZ5eXp5d3l2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eX13eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1/gICAf39/f3yAf3+BgIGAgH98gH99fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn59f4F+foCCgX+Cg4KDhYeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gICAe4B+gIB/gYGAf32Afn5+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e314d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHJ5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59gICBgH9/gIB8gH+Afn+BgH9/foF/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+gYSCgoOFhYKCfn19e3t8fHl3fHl3eHd3eHt7e3t8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFyb3h3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB/gH99fnx9f4CAgIB/f39+fn18fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/fn+Af39/f4B/gICAgIB/gYCAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKBgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf31+gH9/gIKAgICAgH9/gIB/fn1+gH59gIB/f39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhol8fH57e355ent6e45+eHd5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5eXt6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgYKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBgICAgICBgYCBgoGBgIGAgIB/f4B+f31+fX5+e318fXt8fHh4dnh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg4B/goGEg4OEgYGDgYKCgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCf3+AgoB/f4CAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGCgIKCgoKAgoGBgYGAf3+Af4CHfn58en18e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICDgYaDhIOBgoSAhIOCgoCAgoKEgYGCgYSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGAgYKDgoKDgYODgoGAgYB/gIR9fX18f316fX96eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGCgYCBgICAgYKBhIB+gYOCf36Ag4KAgX6AgoOCgIGBgYKCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoWGhIKDg4KEgoSDgYOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYKDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBg4ODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SChIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GCgYCAgoSDg4KBgoKBg4KCg4OEg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX56fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhIGEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOBgoGBg4J/goSEg4OChH+ChIODg4OEg4OEgoCDhIOEg4OCgoOCgoSDgoOEhISEhISFhIODhIWEhYSDgYKAfYGCf318fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgIKEhIWDgoKDg4OBhIOBg4OEg4OEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODhoKDgoOBgoGEg4KDg4WDg4SFhIWFh4eGh4WFhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CCgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhISFgoeGhoSFhISFhIWEhISEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhYB9gXWBeYN/f39+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgISDgH99fX5+foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SFhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN+g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZzhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1ud2xweWx1fX9/fX6BgIF9gH99gH+Af319fHx9fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYGAf3t/fnyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgX+Afn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4mFhIaHh4WDhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foN0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fX6BgH5+gYKAgIGEh4aDg4aEhYSGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYWFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhXiFeHlrc355e2tyg4eDenxte3l5dH6Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goGBfn5/fX16fXt8fX1/f319f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYWFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHh4aDh4aFhYOEhoaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISGh4aEhIWGhIV9d4WEhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGhoWGhoWDg4WFhoWFg4WEhISFhIWFhIWFg4aGhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3x7fH57fHx9f358fH59gH99f4B+foB/fX18gH1+f35+fn58fX1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SGhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aIhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhYWDhoaFhoWFhoaFhISFhYOEh4WDgoKFg4SBfoCAfHt9fnt8e35+fXt8fn1+fn1/fn19fn59fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoeGhoSEhoaHhoiGhIWFhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGiIeJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaEgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4OHg4SBgoSEg4GAgIB7e359fHx8fn18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaFhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoWHhoeFh4aIiIeHhYeHh4aGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhYWHhYSDhIODg4eBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx+e3x8e3x8fH17e3t9fHt+fHt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhoeHhoaHh4WHhoiIh4aFh4eHhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH17e3t6e3x8fHt7e357fH17ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYiKh4WHhoeHiIeFiIWGh4iGhoeHhoeHiIiHhYaHhoeFhYeDhIaFhIaGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhoWDgYOCgIOFgoN+gYGBf4OBf35+f35+fHx9f317fX18fXp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYWFhISDhIKAg4GFgoGCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4qHg4eFhoaIhoWHhIaHiYaGiIiHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAg4OCgn2BgYB+g4F+f3+AfH98fX1+fXt9fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCBgYWCgIB/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeGh4iJhoWIh4iHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SGhoaGhYaDg4OFgYCBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiFhYiHiYeGhYWFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhoKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfoCCgn1+f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhISFhoeIh4WFiIaJh4WEhISChYOEhoKDhYSFhoSHhoWFhYaDhIWEhYaFhoSDhIWFg4WFgYCDg39+f4B/f4CDf3uAfX1/gn6AgX1+gX5+fn19f3t/fHt6eXp6eXp7fHl6enp7e3x6e3t7e31+fX2AfX18fH2Af318hoOFhoaGhoOEg4WChYGBgH9/gIB+f4GCfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWFh4aGhIWHhYeFhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhYWFg4SDg4SChISAf4KCfn1+f35+f4R+e398fICBfYGAfX6DfH5+fX1+e358e3p5enp5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SFhYSBg4KDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7enp6eXp6ent8eXt9e3t+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1NTV1dTU1NTU1dXV1dXV1dXU1NXV1dXV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vKysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fV1dXU1NTU1dXV1dXV1dXY2NfX19fY19fX19fW19ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi60dPT09PT09PT09TU1NXHt7m5uLi4uLi4uLi4ubCKioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E9PkA3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7s6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6Oip8/T0tLS0tLS0tLS0tLUvaCjo6Ojo6Ojo6Ojo6WVU1JTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0dLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSko6jP09LS0tLS0tLS0tLS1b6ipaWkpKSkpKSkpKSml1dXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7PDw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzdDS0tLS0tLS0tHR0dHQ3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamsz9PS0tLS0tLS09PT09XApqioqampqampqampq55iYWJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Ozs7Ozs7Ozs3Nzc3Nzc7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs/Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tTV1dXV1dXV1dTT09PU09LS0tLS0tLS0tLS0tLRzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7OztPU0M/O0NPQztLU1dTQz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXU1NTU1NTW1tbW1tbW1tbW1tfX1tjY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztCmksXR0rmPvtScgoSKxs/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPTo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztKqnayUzcGUsJyxlri5r6HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q+QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DJl5mFpbCmoIuRw5N9fq+w0c7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PD06Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0aSwvZibnIedutTSzZ6ew9DPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Q1bmamJ2Qn6DS08CgoNDPz8/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P0NGaoKGsr5GhudevoqnU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NWnpKO7npqtm6nYo6G61NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NLAnaLLxZamxZii0Z6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPUpKCPuMubnJubrcefodLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HIxqa9lZGqqauknsW0pKbW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQT49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg1MqOk5eQp8+SkKfXuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGR0tIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLUwq+ws9DVy73V0tHC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dTW1tbT0tPV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioaCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpyenZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYm5qZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5qdmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6OjpKKhoJ6bmZmYmZmZmZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoaGfnpybmpqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampuam5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56bmpqbnJ2cm5ucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmpmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZmanZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmYm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkouQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6JkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJCVnJqdnqiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVWJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6KhlZCboKSjmpONiIiLiZGRjpKOi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6qpr6Gbn6Gjo6CanqCclI2YlJigoKGknpuapaekqauvrKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66vqqqrpKGipKmnpqmoo6Kdm5ukoaWoo6CYnZifoaKpp6Cioq6sq6qnra+opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKelp6mnqaijp6aZnKSmoqGhoaGgnpmZn6CmpqOinp6Wn5uaoqKgoZ+hoqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXFBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6yppJ+ioKKmoaaupqadn5+foKqemZybqqShpJ+hm5yanKCeoZ+enqCjmZabmKSioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjXnNfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirsKmoqqihn6Cnqa2wsq+so6KmoaqyoaSio6uipaSipaOenaCen6Wiop6fopiVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltaYF9aXFZcaGRuY25qaWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu3taSysbCboqeeoqOjm52cl6KopaGfnqObnaGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eWpiW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7WzuLKetrS5f52qpKKfoJeVmpekqqamoaSjpKumpZmhpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odWtxaGlpYVlTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCxtLW1vLy+vLy+xrq4t7q9tLCsk7G7uWuPuLKqpqafmKSkp6ikrqSrq7W1r7Ogp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFpYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsLDub2/wMC9v8S9vLq9vrOppYeuwbdher7As6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5rY2Jud3V2bmxbYlFWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6wr56ArbyyXmm2w7qtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbWZudXFydXFnXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtbuUfaq1pV5hoLy7saCbsa+spKyutKeqqaiqrayppqWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3RrbG5kb21pcXhueWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+8u77EvsXIxsbExMO4tMC3tLzBwrnBh3uzxaJhYYa5u7asm6O3sKastLWsrqWko6ikoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ4c3lmZl1kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GycW/w8DLzc/KxsTDw8HEvri+wcPBun18v9WmZGJysbO0qp+ntLKuq7i1s6ypo6GtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVmaWpoXWtvbnh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczOz8/Mw8fGyMnIyMnHxcnHyMe/xcfEx7J0dr3XpGVjZq60t7fAvr66vbq8urysraaqu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aGppdG14bF1kW1ZgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzsfMycLCx8LLy8jGzMrOxcbFw8iqbHCy159jY161xMHIzMbEwcTHwby+tLCwsMG+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVudGJdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8S/v77Ey8jKy8m8vMjHyc3Iw8jJycXFw8LCo2Vpn9KaYGFevs/Hy87Et7+/wMC7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVmY2pkYmptbm9eWVxWVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nIycPFxMDDwcLBw8LDwZxkY4fHnlteY8TNxcjQwa69vri5u7u+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFjZGRqYmdjW1paXFlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba4tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8ytLAu8DBvLvFvbvBxMSjaWR4vaNbXGvGxcDAyb+wwb+7uLu+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWNgYmNoamdnaWVpXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tbGwtbe1u8G4vrm/vLy3tLevrre1ub+7wdmKssK7w7W6x7e2ubvApnZyd6adaGmAxsC/u8G+uca8wsC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeHFtZWVmb2llbGhYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vNHGdqDMvce3ubiut7W+sZ2FhIKTlXt/mcXAv769vL/JwsfIvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfGtucGdwa3NmYm1gXFRJS0pESkJDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC4u7K9vrvEtrW4tbfAvsS8wsTYrXJ7tsnPwsC4r7W+v6COhH2HhI+BhJmwwsK/vr28x8bLysTHvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHJmbGludG54Y2diXGNRS1RIRUVDSEM8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vbyyvL68xbixuLq9x8rJwsjJ0pZvcKnS0czKxLW7ya+IeHBlfXmFb3OAiLXEvsG8wL+3ysnFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9jXmBhTklNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0u8fSwrm+vMS+t7zBv8jPxsjKysCEcHKizcvLzcrGxcGVcGJZT2xze1dYaHKZv8HAv8SopMjEw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIem1td3tfcGNbXl9fVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8tru4rtzCvra+wL69tJ6Uoquvv76jdnR3otDJy8jBw8OmeFxNRkFfb3BJRVhhfarFv8GyiJnIw8DIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnpuc3hzZ3BdW15dWVJGRENNSUFFPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vIrWyxzb21ucC8pHZqZ2xob3yRlG50eaLRxsjBuL+9h2JMQkE6VGhkRTpOWGiSw8C0kHKeyL6/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f312bHV7cG5pW19gWVNQQUZIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnA0Klyg7S9trW/noRoWV9eS1FaWmtvcn2jzb66ubS9tHhQQFFlQEtcWUc5R1Nce7y5nHJprLy1wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3V2d25xYF9mXVtUSj0/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5wsuggnaLorCzkWZgZVVZX0tKTU9TbHOEpce7oqOtuLCERUBwllFFUlFLOkpSVWyqoX9kcravsry6rru0s6arqK26vrjLwr++rKuwr7O7t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYVteT0hCPz1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt7/FooZ5dY2ijltSQVhUR2FtWVNHSWONo6rDxpmEkKOwpUJHe5pfQlBRTjlTWlJhi39pX4m3payzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybWNdZlhcXVJOTkE+SkJBSklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i4wrCOf3iHjmhOSUFrV0JPdYWZcE1DVn2wu9GuenaCoaZGSGh3WEJYWFs8VmNSWm9oYF+hs56kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c210aWxdW2pUXVxQTUhERkxCRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7izkoyIg3dVRUBUiVZKSlN1i39iQFmpubLHz5JnbIOES0ZTVUlkkZ+pnpd7UVZeXFdyr6ehnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yuqeYmZZoTD9ggGpOSUlNZ5p/VkdZrbqxr9K6clthZFFFUHCVqaWempyen4FUUFNTlK+fp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKurn6ajm6OclZCMj4+Qk5CXlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3pjd2xuXFFoVFBOR1BNTEJPUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqL3Bqaa9YUJco31PWklLYUtbiWZtc46vtam80pdVT09QbqKwp5yPlZGOl56ijlNJXKWknaiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6aqsaOlqJ6gnJWTkI+RkJiQlpWYl5+Ym5mbpJmXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dn1ta3tkaFVRY01KSEdPUk1KTkc8RUA8Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaCrxcDJlk5Cdp1rUXFMUGFnd3BfYGuBmbCwrsa6XT5glKWemJKMj5SVl5ebn6aLUHKgnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmpabl5eYoZ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3h8ZHl5YGJSVWBISUpLU1RJUlBMOT9BNjc8NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWcpMbGhldSTWSfXm59dXlXUWtjXmpnbHiOtK+0wn+EoZ+dmZSXmZiPjZCUkIuNkIGKoZ2Xo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKwtKqyrqKZnJ2eoZmbm5qYmZuUlpuWmZyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1paTVFKT09VTFNMQTc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp+qo495V3N1cnRpX3JuWFldXmRnWWJfaKyuq7Coo5+ioJaQk5ugmpiWkZKem6Glm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7itsrSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqOhoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWp3dV1sWlJgSFJVSEZVVkpCTEc9S0g4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCifm97aWBjV01bUlVISk9VUEdSU0qZrKqppJ+fmZKRk5iYlpWUi4eKjZSdnJ2dnpeemaafoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+np6Wkn52qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cm1pdm1obVxYXENXTkpHTUdDRk08Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKOfnIhfVl9mX1VMTEQ6Pj5CQz4+Q1N4qa2pqqWfnp+io52enZqcm5OSlJOdnZiUhZ2aoJqrpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsS9w7y3s6mzraqzta+zrqqvo52rp7axraKwpqGjr7GtsKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhoF7dHJra3RycWhWXFFGVEhESlBJP0VBNEZIOTU7PjY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfn5N7YGBmXk5ERTxKRUg8Pzo2Tn6qs6ejo6GgnqWrpZ6XnJSRmZ2YlIyKhoiGeG2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr7HxsK3xMrJw8HGvrq0urq1u7ewtbKqurKuu7e/u7qquK2rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrY2hveGtlWltGS0xFRFNNREJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdnJl7cmlfVExEPktggnNlQj1cjq6soJmbm56emZeXl5KMjpaXk46NkIuCg4J3cnFtcI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxczR0tXO08m9wL/Du8bFyMXR083T0NPTzMrCxcbGysjOv8jRzMfGx8XBvMPBv7+/tr6zrr/Aw8PHxMfErr+4sri8w8LCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MREVQSURDQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ6VaGRbU0hDQEBNkKewnIOgsq2jnpyfmpeWlJKUlpGQj4yHg4OIh4OAgYGAeXFyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fR19LV1tPUyMzGzM3J0s3O083FyMrKwcbLx8nIxr/Ds7PIxMvLy8/Gyr++v73Bx8TMzMjJwMO/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxBPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hm2BSS0hEQ0BGWLbSvLKvppycnKCkoZ2alJOVlIl9d3BrZWJocW9xe4WKgHVwbnF0cIWzw77F0dDX1tbS1s3U1tfU09HT1NTTz9HD0NPW2NXW0svJztHLxs3SytLV1tnV19PX2M7Sys/RzM/QzdPQv8jHysTMzMzOz8XGx7a/yr/SzczPxsnIv8TDyM7N0NHPzcrIzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGRyYl1SXElKR0FFSUo+O0E4PTQ1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWfoqFZST9BQ0FJU3yyraaZlJefnJqgoJ6bnJmViXdpY2BfX2BfXl9fXWJsdXRwcG9scnF1ksTIxtTW19fX09bQ1dTa1NTOz9XU1NHRzNHN09fW09XQz9LT0cnT0cjQ19fY0dfS2NnU1szPz8rN0svO0MHGw8jGzs3R0dLJzM3AyszG08/MzsjEysfHyMzK1NTR1c/SzNPCucWxpai1rqebqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpq63qKu319TV2dnRztC/vMzJtr6upqqooaOrZ0M5PT5HWoOrp5+XlZeZmpyfnZicnJJ9cGVjYl9fYV9fYWBfYGBfYGZucHBua29yd3eczMHS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHF0dTK0NTV1s7S0NjY19fLyM7Eyc/NyszAysDIys3O0MvQzs7Mzs/Iy9DQy87KwsnHyczLzNLTzdPR0dDQyr3IubCuu7i1qrawrai4rbO+u7Gaj6CUkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1YRTtAPTMzPDw4Nzg2NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HAsKmsramksHpLSkU/Wo2hm5WTl5uenp6ck5aXlIhrXl5eYWRiYGBgYWBgYV5fX15cYm1yb29zdHZ2eaS+zNXR1tTT2NbOztTLzs7FzsrS0s/Hzs3N1MvO083L19bQzNHUy8zQ0tPKztHV0tXVysDKwsXMwsjJw8zDxcjKys/KzczQzdPLxsjPzMjHy8XGwcbKzM3Q0cbQzs3NzM/Fx8G4ub3Dw73DubKyvrG7w8S1qpilopmWkZWVkouUjZqRlJSPj5SCiYZ5cXJrbWdgYHBoWVhoVkxGTElQUUI7Qz47Njc6ODo6NTc9PUA7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWvtKigrpN4cnZ7i5WajYyXlZCTkZGVlpWQi3xlYWJiYF1eYWNiYF9fYGFhYF9dW11ncnJxcnNwbXJ5pMbTz8vQz9PUysXJycbGv8PGz87HxcfNytLIy87OxtHS0M3M1MrHy87PyMfP0svRz8a6xL/Gyb3Cx8nOxcLIwMfNyMTMysvPyMTE0MjGwsbIxL/Bx8zMzM/CysvIx8vQxMXHu8fDyMnCz8G9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd290ZGtgXmZwYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLrNzcbQ1dXZ2tvY0MnPz9HTyMK2u7uto7Z8ZoODp6yTjo2Wj4WDg4OBfYSEfnNgW15eXmBeYGNkY19cXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsnGwsPAw8jLycjKyMHFzMbIy83JxMLKycHCzNDFy8i/ucG7xsi+v8bPy8O/w7vJx8i7yMbFysC9wsvGxcS+xr28wMPFzMXFvMDKwsXH0sXAyb/KycbIxtDDw8bDr8TLx8TKt7+8urSprKSlmJ+YrKOhpZujoJuUe3dydGZpWmFubFpcWFJETEZCR0RMREZTQDU0MzM0Pz0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+sa+1a195f6aQipKWhnqAhYV/dnh1cnBfW1tdYGBiY2RkZWRgW1xdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsLa6srKzsrHCvLy8urjBwcHFvr25vb+5xMrFxsK9xsC4u8TJv8HJu7e7u8bDv7zBzcPGvr61wb3Dur3Gu8K6s7zFxMLCt7+1tr6/u8zDvLW6yLq/vsvEwcbCxcnGycbQxsLMx7LHycPOzcHFw8C9s7ewsqeoqLmwpa2wqq2slHp2d2pkZ2Bob2NWXllKRkpGSEpBRUJFSUA5OjY0ODg1NDs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1tfNys/FycXHwbnFvautpF9ldIeTi4iLhHh/hoZ/foR7dHRjXFxdXmBgYmNhYWRlYl1cW1xeXF5dWltcXmhzcW1nZ25vcnmdvczAw7rAuK6wsaeqraynuLS3tLOztLu1vrK3sLWvsrzCvMHEvMC7tbK6vsC4x7m0u7bBwry4vcbBw7u1r7K2ur+0xLe7tKu4vb3AvbG6trC2urPFvLauu7+1t7TFvL7DxcDDxcbIy8XAxsa7x8vAz8rHw8bCw7fDvb22ub7Hv6y1urW3to55dHhnZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjKyMrJysTQzdLPzcXHwcXAv7q3ybaqsJhbaHGMj4WIiXp4foaGd3eBfHNoXV1dXV9gX2BkYV5jZWNfX1xbXlxdXlpcW11fbHBuaGZrbW5yfKTHv7m4tbCrraeeo6qnnquts62qrKm0rrexs6mupqyzvLq2w7m6urGrtbm7tMK6sMCxvry7trvHucK2raqosLLAtri9sLCnsrO1u7yrrrWmrravu7Kwqrmwrbuuu7i7wMC+ucK/x8PFwLzGwsjKuMXHxr/HxMO6xMbCu8bJzMuzucK9u7OJc3Z2a2lhYmxoWVhXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXQx83Bw8a/xMTDw8rCycq/wLzBurO0tcOuqbCRXGp+koeOj3t4fYmFenuEgHduXl1cXF1fYF9fZGNhZGNiYF9dWltaWl1aWlpaXGVub2hmZ2lrbnGBrbmwta6mpainmqCloZqcpayupKiiq6qtq7Ckpp+qrbW2sb25r7evqK64tLS8uLS8r7i5tbK8wbLArqWpo6uxsrOovaqrqKutrbSzpqitoaSvqbKmp6iupqi3rLGyt7q6vLG8vb6+xL+1wsHHyLe/wMW3xMO/u7/Ewr7EyMzKv77EwMCph3N0cmppXWFvY1dWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HKvrvJtr3DvrrKt8HDwbS2vLaxr7W7rairk2VsiIOHi4B7fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9dXVxaWFlbW1lYWlxfZmtmZGdlaGpvcoWppauloJyipZSepZuYkaGjqqOjoKWmp6atoJ2cpKatsrC2t6ewrKiqtKu0urG2tq62urKvurqxtqWgpKCmsaerqLmqpKenqKeyraCnpp+bpKasnp+npKChsa2trLK0s7Swtby2u8HAsrq+w8GyubnDs8G9v7W4vL2/vMLHxMPDvsDEoIN4cGxiZl9rb2BVWV5ITmdPVEdFS0Y8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo2Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9tqCelZ2hprq2q7Ozu7PEz8nLwsa4tsfAzL+4ybe7xbizxLizv8CstbyyrKWvs62ho5JpcYaFhoB8eXVzb21qamlwaV5gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1vh52poJeWm6KWnKOZlo2foaOnnKCgpKWip56bo5ugq7CtsbajqaqqrKyktLmtt7Css7Wus7WusKqfnp+korKkpqm4raKmpqCorKuZn6CemZ2fpZqZo5ybna+pq6eqrKytsbK4r7i5u7C2vLy6q7OzubO+tLaysba1v7a+wL3Dwbu7vZeEenNsX2VeZGRYVFddSVdcS1BHSUpHQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vDw8++use4uL+3ssK0sbu8q7m6saKeqaunl56QbX6Fhn94cm1vbWtiXmFmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3GNp52UlZWbmJuil5aRnKKiqJ6cnaWnoqWcoKGbma6urq6yoKairqunorWxsrKsqK+zp7qzpragop+co6Gto6Kqtaqio6aepaajlpmel5mbnaCal52dnZytoqunpKSmrauztKq1sLOrsrm0r6qvsrKzuLOuqayusrixu7a6vb+3s7GUhXl1Zl5lXltZVlNaVUtbUUtJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+znaWjmKWxwrW2va20uMLMyMa/xbbBwMbOt8DEvbO5ubO/trG5u6yytK2emqSpn5Saj3h/g4R/eG9xdHFoZWNoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqGck5WQlZeXoJeZlZegnqGdlqChqaSfn6mdnJqrp6+wq5ujpLiqoaCuqLaqp6etsaS4sKS3oKObmZmqpqGarLivoqGknKKfoJOUoZSWlpuYl5aXnJWfqp6ppKKdo6qqsK6otKuqp62zsKWrrrOxsK+ur6aoqLKtsbSwvLS5t66jlIF5dWReYVZZWFNSVEtNXkxPS0dHTExFPUE+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp2nqKOqu8C9wLmutLjBzMfFwsO9xbjIy7LBwsGtvLu1u7y1ubmwr7Cpm5mhqJSRiouAgHx3cWlscnRwaGhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmNkZmmBlpOWjJKUlJuZnZaWnKCcn5agn6empKann52fpqCqr6afoqS3qKGhoqi0oqWopbClsa6stJ6hnZWVqaGilK2xsZ+io52emJuTi6GUkZOYmJOXl5iXnqecp6GimqSlpaukpbCnpaOrq62mqa6vrquoqqmzpqasr7Sxr7y1sa+voJJ6d3JlYVxaXVhOTFJIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxuKyepaett7u8wcW6sbm1xMnJwMPGxce2xcSywr/Fq7e3vba9urq1squsp5iYn6OLiXSJiH52bmNhZmloZmdpZmptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVVNVUlVgYF9gYV9hYWNlaoCUk4qQjpSTlJ2VlpekmaCXnaCloq2mpaWjo6Kcqqulmp+lsaqgoZ6lq56oop6trKmprq2ioqKVmKObnJCrqbCcoKKfnpeZk4qekY2Sk5aQmJiUnKGjnaShopWgoqSmm6OrpaKkqqOrrqWusqmmpaamtKapqK2ztbS5uq+prJ6McnFvYFtXVlZSR1FPSFpbT1JKVEtTTEVGSUQ4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6PDw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm8sb7DyKyxuMG1u8C7tLSqrKaVmpuciIByiIN7dGlpamxnamtta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV1eX19fYmRtjpCEkYePkY+ak5WTnJujnJuhqamrqKynqaakmaWvpZWZpa+qoJyZm6Cer5mcq7Ogpaafo6ShlZOblpaSqaqtmpyfoaCblJCMmY6MkYyRjZaVkJ2ioKOdnKOVm6CjoZeiqKOiqKugq7Ckrbelo6Sira2qqKuvs7ezvrWyq6+YhXRzaFtZWVNVUkVYTFFbWE1UTlBMUFFJTklCPT8/QT89NzU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1NzY1NzAxNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7auqKivrpupqKy3tqy8yru2v6zLxsW4wc7PyLPEure7wsiwrbi/t7y9u7O1pqmglpeYl4d6dIB2d25taG1tbXBnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXV1cXl9gZH6MgYt/i5CKko2XkZeZoqCboKuqpq+sqLClqZqfraCVlqSpqJ2YkI+anq6XmKiqmZ+dlKWhnpKRkpGTlaeqpZqZmZ6elo2Mi5OGiY2Dj4uSlZGgnqGkmJWflZqhop6Um6Wlp6iooLGxprG8p5+jrLWrrqewtbC4tcCxrbGrkX5yc2JWVFVOUkpHVlBSUUxMV01KTE5SR01LQUNGREM+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OspbG3qqWisaudqqepsrGktsa0ubqzysW5usHL0Mqxtri7vcHDsa+xt620s7uzs6KjnJ2Xl5SDf3drZ2xucW5xanBrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/dYmNh5CKl4mUlJibmZ6pm6CrpqasnqiaoKack4+fo5uXl4WEkpujkJWjnZaWloiim5uUi46KkJqkp5yVlZebkZKHlI6LgYuNgJCKkpKSoJqgopaUmJmVoqaZjZmkpqimoaC0sqeyt6Gcoresqq2ksrKmtby1rKuxo4l5c21dTlFRTE9DTU5OUEtGTk5KSk5NUUhNSkFHS0hIQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS2sKSnpKqloKimpbOqorLDtbWys8bGt7rDyszGs6y6vbS3wK+tqbCepq26r62fmZqdlZSHe4NuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFtdYW9zdnCEiIKIgJGEj4uUkZSeoY+bnKOipJmll6KclY2HmZqMc42Dfo6XloaRmpCUjo57mY+djIKJf4mYn6OekJOYloWNgpR+fnSKjnqQh5OQkJ2bmpqSlpCdjqOjjomaoKGjpJuitK+sr62fmKW4pqaxobCunLC7qqmvqpmDd3NjVk1ST1BOQ1NOTFFMQlBRSElOUk1ISkpESkxGSko9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKimpaijpqWnpqezp6W0wbiwtLDJxLe5wc7GvbOsusGrrcOtp6Gmkp2mtqyjn4+VlpKPfnh+ZVdWX2dmaWdobmNqaGdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVZZW11pbHJsf4V8dE5YcpCDl4eOnZeLlJGfmJ2VlJaVj5aJgJOKXztXb3yMlImAjJKMkIaGc4qFl4F5gXuGk52Tg5WOkZCDhn2TeHFwhY19iYGRjY+XmpmTi5CJnYifmIiHlp6aoaCXp66pramonpats6KmrZmsq5ios6KpraOTfnJuYFtOU1JXTERUSlBMTEZOT0lFTFFNS09KSUxQRklJPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepqKOqsKintMG5sLWwx8K3s73Pv7mvrrXCp6rFqaOdmIOUm7CimZeGlI+Lh31zdV1QTFJVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1vaXuCdFFCQH+VkpJ9iZWNhIqNm46WlYmSiIaVhnmJf2BKUW54i5KEfYSNioV/f25+f5R4dXZ4hI2Zb1GNiIqGe354lHZnd4aIfYqJlYuNkZKXjISKiJWEmoyChJKalp6dlKSjqKmlpJ6asKuhpKSRpqqWoqqcoqaoiXVtZl5bSFFRU01JVU1TSUxLT0lIRkpOTE1US1FQT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6OnnZ+hr6GnqKWnqLCtqra8tre3s8G7tqe6yLi2qKi1tqqyvKaelY1/iZOolpWKfo6Dgn14cG5YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXFWPiZSJdH+HgXyFjJOCkpqLj3uGj4B2gHhzb3ZwdI2OgXp+iquFeXpodnuOcHJteIGLjZJ4eoB7gHZycpJ3aHWEhISFe5WKiIqNi4B/hIuMgJSDfICPmJSclpGenamen6CdoKmln52YjKekk6Gglp6fpIByaGFcXUpXUFJISlhST0pMTVJKSkpMUEhMUUxSVE1FSEE8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpmjopicn7Spr6mlraywsqq9tLK7uLa6tLGft7qyqp2drKmosq+hmpGNlIGOnI6Rf3aGeHx2b29pWEtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnWDfHhmd42XmI2PfWh5gXZ4gImQfYSYkoFyh498d3tva36tfHOQin97hpKBfX90ZnZ8hmxvaHN9iYyIgGx5cX1xbXaPcWhxgX6OcEOLhIKDhX93d3qLhX2Me3V+jpKPmIqSmpujlpmdmp2eoZyWjYqkm46el46WmJB3b21lYlpYWFVRSlNVVE9QTlBWS05LTk9KUU5IT09MRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKavrK6rqKmxr7GrvLisu765s6ynm7CnrJuPlpylqaSgl5mOhZJ5iI6LinVxfG11cGptalhLRkdFQUBDRElMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTk9RVFhdZXBybYinqsB+dXljfHhvfHmIkHp9i4ZvbYySeXR4amqAgnGWkYuBfpaASZOYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmltcH9zjYmEhnt9fnt2b3RzhYJ5gXlwfI6MipSDlpeYmpCSlZeZl52WjIOJnpGLko2GkJaAb2pub25YVlhUUlFZT1JUVFNYVU1OSE5LTU5LQ0hOR0U/Ojg5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrbCjrKqota+urLS/q7zCv6aimZWkl56NhIuUoaGYmJGTi3OOeoCGjIV0b3RrcWxkbGpZTkVGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXGCniGKaaXR6ZX9wbX96i4l2goiGdGyakXRzfGprnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtxf3xocXF8bpOOj3xzfXxxcG52bYJ/d3l1anmJgoiJhJaSkpCLjZGUlI6XjYB5iJeIhoqGgJCId2trb2hlWFFaV1lZW01QVVZZWE5JSEVKSkhHQkBGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw1Nzc1NDc4aU84OzVukoiakZmWpKiunrKfp7uvq7KwwrG7w8ealo+UmYuOhnmEkJiUjZCMj4Zxh4J0h4yGenBycG9vZHBmX1RGSUM/PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHJ8eGx9bXKDgoWBeoSGhnlyoZV0eIBzdZSHNXGdqJ2OoaGEooR2cIZ8h3xzjK2NiYBnZ2JqbnJtcIN1aW9YdXCOm5J3bH96fW1ybnCAenN2bmJ2g36GgIWQkIqKiZGLkYyLjoN1eIqOgH6DgH2Pe3JwcGxgW1xeXFlYYV9STltaWFdMSEpGSkc+QkFCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBk4iWkZ2kp56vlaW1qq6xrsGyu8HGlpCMlI+AiH1ugZCSiYOKh4+FdYKEbJWIiHt0eHhsd253Y2leSVBHPkA3NDQ5Ozs7PT5AQkVITExMTE5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8foWDf4x+dqKZeX6GgYWZhJucYYaqn52Lg5CNeneIfomIjXOKl5CDel1kcnR6fHeKbWhqYnlvhpCCem6Bd3SEenB0eXdrbmldd4d8h3yHh49/i5KXg42FjIZ9cYR/g311d3t8iXdwc3RlZ19bW15UXGdeV1FVWFtVR0pKRExHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIySnJ2fppGgq6CxqK/AsbrFupaOkZSHeoV2a3+MkYJ9ioSOjHiDgHOhhIt9fYF/cIB+emd2a1JXTEBFMjExMzY3Njg4Ojw+QUVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxyfI+Men2Jh36Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkqiHgJiYipt0bXyBhod9jmhnaHh/boWHgoVxhIZHbIB3cnl2aG1rX3d9g4l/iIWLepWdm4mLiJF/enWLdnx4bW93fX90dHJsW11dW2NjWGdmXFVPUFZZUERMS0ZOSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFiJGPlpiSl6GdrKGmuK+zvLOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9Pj9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYCEgoWRk36FiJGBmpWCoaGYlZuapa2Tmruxp7vHw6iLjKGlj5SJgZF8cYOen5Gcf3aFhYqQiJBpaG+DgHSMh4SLcYWCd4d/e3aFfW52dWaAlI+GiYmHiIehqqKWiY6Yf3qCiXp5b2dreH56fnJqZF5aWl1qXWFmYFlPS05XUlFIUEpETkdDSkRCQEREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZniDe4CMgIGRjoqam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOg4CBjIuCiY2Df4l/bXBqXUJBNC0tLy8uLzAyMjM0Nzc4Oz0/QkRISk5RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2aj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jaGemYSThYKPoZ+TmJKEi4WPmZGWbHB1iYuCloyNj3ePhHFthYGKlpGDhYhyiKGWh5OJjo+WpbWpm42VooOHk4N9f2tqa3yAgYFzYV1jXlpma1xsa15XS0dPU1FOTUxGSVBDRE1GQUNFR0I+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwgnB1h3F2koZ+l5aalZ6enKegqZaTmJ5nZaSafoSSkXmAkoiQkn2KhJiSkYKAgIuNiYWQhoSIhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ1Nzs/Q0VOUFJUUFFRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZyopaKZoZeilZ2fqJ6oq6CorKmqtZerv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGam5mnkZGJlaKamnh6fpSYkqGSlpiBlJ57d5WSq7OIjZeffZSenI6Tlpmkoqa2sJ2RmaiIlo+NgYhsc3J8f3xxaGBcYF5iZ2NgaGdbUkVKS1BPSUpMRkZNQ0hMRkZDQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHVgbn1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJjIqEkoWDhomBgIZ3X2JQNDYwLTEvLC4wMC8vLi4wMDE1PkFBTVFSU1BSU1VSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpOT1FZbYaQd5WLo6eqtL24pK6srKeotKuwtrKyrbuxs76cs8Osu8nLt8O/uKWjsLKsraqji5aYhaamoKOXgaaZjaKqqKSIhZSkoaCqoaSpj5yxi5Wjp7e7m6CjsJOjnaOekaSiq6+ts7WilKSqiJmJkoqVeXp+hX5nYGhcZWJdZGNfZmZfWk9DSUhUT0ZITEZKR0VGSEFLRkNGRkE6ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoGThYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5GPg4WAi4WGh5KGgoSJhoiHh3FuYUBFNjQ8Mi8xMTAtLCstMS4tMz9EQU1VUVJTVVVXVU5bUEdHRTw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqscHHw6qzxbass7+zuL62v7TBtru7pLjGqLbJx7W+ubSoo7StsbGbmZKan4mor6ullHafpJehq7GzmZaqraiutruyuqyvtaKxrLG1vLe1rrWgp6ejqJqpsK2yuri4p5u2qYyljpGTn4Z4goN1WWFkVmVhYWNgYWZfW1RKREVMVVFISUpESUdFQUBAS0RCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWlFjZFd5dXGBlH2Fh5N2hX+AjHu/u6O8grSUk42bj4SIj5KJiXmGgIyTjYeEgY5/gYmOhoCGiYWKh5F6eG5dVkBFTTw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFZPXlVJS0pBQD5HS0ZFRDs+QDdENz9CSkpFRldUUF6Ppa6jsbTDtrjBzMm2u8S9s7PAt7fBtb+wt3Sxs6a6xaSwxrmxs7G0qKS1tqqxoKGWm6KSpbCupq2rp6SYoKyzuqKpsrq0u77Mv8XFvb2zwre6uL+3ure5rKywprGqrb6wvbvCwqyZuqiUro+Xl6uJfYJ8aldiYVdqZWplV1tkWVZUSUdHTFFHQ0hJQUhEPj9CQktAQE1DOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldUWVVadmpwf4+EgY6EbnpzeYdiuKGZo4mVk5aTlJONkJaSh4Z7hoGNloqBhIGKenyKh4Z8ioOBioOVfXh6dWVPXGRHRUw6UWNhW15TRj87SFBEWmNRUVlYWmdZVGBgTVNQRUE/SUpIRUZBQEM8RTZCPkhHSkxTWlRdk6+4tbq5yb+6vcnMu7zBvLe1u7u3vbS6scZhdbKlsZqeqr2qpairqqOisrWhq6ielZafmJ+upaempZ+jlKKmsbSnsrK9tsG908nK08bCxcvBysPAvr2/u7y3tLC5t7bDusW9w8iwnrmqoquOpai2iYB/cV9iYl1XYV9oZlJYYVZSVUlFRU5LQT5HRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWdsbHGQjYWQc2xycnOI1cC1maCNlZiZkY6XkpaWjoaHfYaDjJaKf4N/g3h7i4OHe4t5gYqCl390fXprZXB1WV1cUGVlYmBlZF1bWFdcTWRtVVJtbV9uX1hnZVVZVUtEQUtLSEZJSEhHQkk5RD9IS1RUVlxaW5K5wLm9t8bAurjKy7q3ura4ubK3tbSutraZZHWonK1wXqGtnJigopuknqqllKCfkJSOlpiXqJ+ln56amoSknaylqrCst7C9udTRz9fPyczRzM/OysbAvsLKvcG8wcDExMXKv8jOtKS7sLSvm6u5vJp/eWxdYFxZXmFZY2NRXGBTUEtDQkVHRTxART5CSEJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaV9wl5KQlG9sb3V1h7OsoaGfi5mcmYyNlZGbkoWKin6Ih4yQi4l8gYRze4qDhXuJdIGJhpV/c3t4a211e2hyZWlsaWZqaWhgZmlobFpudJetpLyIh2dbb2hdWlpUSEtOT0pLUUtUUUhMQUpHS1BfXmJmaWGXt8ewubO7vrWxxMe1sLmwsLursrGnqresjbannZunmk+anYyOoJaRppillYqTk4mQiY+RkZ6boZealZaHnpqmm6yvqK+ns7TU1NTW0svP1NXO08/NxcLJ0L/KycrJ0sfMzcLQ0riww7zEuaW2usSigm5jXFxeWGFYWWVaUV1XT09CQkhFQkk7QUQ+QUc/P0I3O0M+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VXc5CQmIJocW95eYOgqp6ml4ybm5eLjpWRmo59iYuFjoqKi5CHfISCcH+IgYZ7h3KDkouPfnF4dWtxeH5xe214c2xpgXBtY2lucHhpd3x+y7/C36dtY3huY1thYEpQUlVOWV5QXl1NUE5UUVVUXG5udoJyl624rLSnsLarrLzAsau1pqS4pquuoau0o46xrpqYmIyRk5GEjpuBjaeSnImDi4SKiYSLg5OVmJeTm5GcmJmZnp6rrKSnoaytz9LV0c3M0tPU0NTRzsjD1NHIzdLT09fN0tHF0tbFwM7Hx8OovrfQnnpuZV1iXVdgU11bT1BUUE5IPkFGQUJFPEBCPkVEPkA/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WGhYp3bHdwfX5/oZ6eoYuNmZOTjIyTj5aFeYWPkI2LioiRh3+Ce3J+gIGHeYR1hZORiX9vdnJrc3x7d3xzgXdxa4BzcmhvcXp5cnu+y5t+jLKDdnKEdmhhal1DWlpbV2ZkWGVrU1hdXWBkXmN4e36LgZmqpKShoKGopqqwuKqltKOhraGjraKnsZ+JppqUkpGJkY6IgZSJa5WijZmEgIV9kYODk5ati5WNlZmOhZKQnZensKGgoaSkqMjOz8jCy9HU0dTTztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMTDy4tzb2JgX1hUWlNcUEpHSUlKQDs6O0VCRDxCRD5IQj9CQzs7OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJ2VnZSFi5aJj4qIjoePf3iElJmKjYiIi4l+gnhze32Dh3d/eoeRloCDbnhwbXV/dnh+dIV8eW2HdnRufXaEdXl7nbaMPEGLxqV+jXxpZVZJQ2ZjZWNoamRveFtfZmlrbmlugIOJkYudnqCdkJeYn6OkprKkpLOgoaWdoKmgorGchp6SkpKQi46LhoOQhH6cm4yNg4SFepR+gqmVo4ySipeSi32XipqRqrOYmpunnKe9w8a5tsbN0tDS0MzSy8nUztDV2tfX2NTZ2M3Y287J2trS1b/LzLR4dm5kXVlSVlFaVkZHSkpFRT06NzlAQUI6SERARUNBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGFxcXOGjXyXkZ2LfoeSgomGhYqBh3x4hZaWiI+Dh4WHeoR5cXp7hIZ1eoWOjZ16jHB8b296f3F8gXGDh4Fujnp1d318gnV/fIeIsHRZqcK2jJKCcG5iPV5ocnBxcG54d4FlaW9ydXhye4uHjpSSm5WglYeMk5ugm5+qn6CtnKGamZ+lnp+smYuajJGRjYR9iIeDhYuOoJmTiISHfm2ZeYSYhoiTjI6UjIZ7m4iTj66qlJWXnpinrrW9qa29xsvIyczLz8jD0crU1tnX2NfU29fT2dvWz9va0dbJ1MuVeXtoaFtZUFJUXkhDRUlJPkE+PTc6PT87Pkg9P0FBQURBPj46ODZEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmt2gIhxkZCagHqAjX6CgoGEfoN8fISXjoeLfoaGgHeCeW57e4eBdXqSno2gdo91gnR1gX10gIRvgY+Cb5KEdHyBhXp2hnuJt8alwsm3gZabj3dwZU5mY4F6gXeGopCLeHl3e4N/fIR2bpSWlJWPmJCDio+WmpeXppyXoJefk5KXo52Zq5aRkIqNkYKMhYmIgYWQkZ6cmYmFi4GGmHqJiZ+Xj4iOiouCfKGJkIu8oZiTl5qcqaalrp+otb7AwLnHyc3Oxc3K0dbW1dnV19vU19na29fb2tnYztzGhnp5Z2hlYFRXVlVNS0RORDs8PTw5Ojw+OT1ANj0/QDw/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eot8foB+f3yFe36BkYmEhXqEiHt1fXRufH2GfnR+kp2RnoOSfIZ+eI59eYqKboKagHSYhX6BiYV8fpB6j6mPkMOgvIyco5x9iYR9iXOMin5zppqcmJSFe4+QiYRoR3GhpJ2Mi5CShYmLkJKVj52ak5WRl42MlZ+dlKGUko6NkIt+kI6Oi4SIkpaan5+JjJSSnpGCi4CmmYiEjoOGhIClhoqLuJidkZWWoqehnZ6do662urWrv8bK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfct3h4d2tpZFdgW1RQT0hETEI9PT45OTo6OTk7PTY/Pj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmBjopxcnmKe3p/fH97iHt8e4uHgn51g4Z5c3pzbYF+hX13hZuhm52UkoCLiH+Yh4Cckm6HqIV6oIt8kY6DiIScfpqRio2jop+QpK6gi5GLhYuBkoZXcq2Ln6ubj4OYm5CQjlyCopGCjJ+TlYyHiIySk4yUlJSPjI+KiJabnY+VlpGLkpSGgIuIko2JipyWmaOjhpKdlqGLioiOnJCDiI+Ag4eFpIaMkLOYnZKUl6GhnpmSnJ6nsbispbzCx83Hxs/Mz8zO18/R1K7W1dja2Nra19bZ2p9vfHRnZ1xdWFNXWENASUQ+Pj46NDk6Ozc6OzozOzs/PT43Ozk6MTlHPTozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieG1ifpKDb213i3h5f3qBfIZ8e3eGhH9zcIWCenV2dnSEg4V9f5Kmo5+lopaJnY+Ul4uKqJdyirKNhKeRhJmThZmLopagmJOJm52hkqmvn5GUkI2NiJWLbo23hZrEyLKcoaWbnJiWkbKRZKTNx5aPhYeJkJKNjZOUioWKioaWmpuPkJSThpWXhH+Pi5mIjZCql5eko4iZnpabiY+Hl5eKhI+NgX+Hj6WJjZOpmpeTlpmhmZ+Zk52bo7O0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6Ccn9oY19dXk5KVFpCQUdEO0E9ODM3Ozw6OD02NDk6PDo4Mj85OjI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj46RU1GSFJXU1JCY4FGdYKPfXxtfoh4en56gYGDfnZ2gIN8bG6Lf3l8eHh8hIeLfYqjs6ejqrKhlqefpaSWla6ig5C4lZKzmY2hoIylm6+jpJ2YkKeWp5mtr6SXlJaUkIuYmZagwI6kybirm6KmrZiRm5yynYaFqKKcmIWIiY6VjYuTj4iBhoeIk5iUjIuTk4aUmIaEkZCcdJGZs5aXpaGInJmTj4qQi5eaiYqWjoZ9jJieiZCQnJqZk5iYoJSgnZWfm6GxrqKkt760xcfEvcPDv8bNysnSp87N09LQ1tjT0Ni7cnl2XGBVX1dQSElORUJDRTU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTw1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1NjY9OkpGREdOW1xZSWZgO0iEi3p6boWGenyEeICFgX5weHx9fG9yjXp9gXt4houJhoOSp7utqLK9r6Wts7Ooo6KwrIqatJ6juKSVraSWqa23pqSjn5mpmKmjr7CqmpiclJWRl5+Xmbu7rcmhaba4q7CUmJ6jq5OXvqNeqrKCiYqNlIeRfI6OfYOGjo+UlYiHk5eMkJWNi4yXmJKdmbSXlquei5uUko2QkoyZm4qSnpCLiZWgoY2UjZianZOcmZ6UoaCUnJ2lr6ihpbO4q8LIxLW6vbvFx8jC0aHGyc3NxNfW0cvToXB6aF1ZU15ST0ZEPjxDQUI4Pzg3ND5GPDw2PDM1MzQ1NDU0QjM6OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGVHYmBicElAi4p+gXOGh32BiHWCioN/bX19fH9wd4d3jYGHe42PjIaMmarCwK+9xruztMG8tK2rs7aMqLKurryqm7ukqK25uKumpqKho6Oor7Kxq52cpJibmJeeoqWlkqO5rqjAu6ytsrmlpKd9iIecrL2wg4yMi5CDj4ORj3qBh5CMjpyIh4+XjYuVl5SRmpadp5qxmpGsnY6aj5KOlJCQlpeOkaCRiZWbo6yUlo+UnJ6UoJ2bmKChlZqep6ekoqSwsqbBx8OvsLq2xcTCvs2nx8PHw7zV0c3Eyoh0c2JcWV9bTUpCTEBFRz9BP0I7OjQ+QTw9NT02PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxmRmBpZ1pdW5OMjIh7h4uGg4x1hpCKgW9+fIJ/cX6BepV6kZSUmJCTlae0xsm/wszBw7nHvLqvq7m7l7K2urLArqXApKuvu7yqrauiop2nqq60sKqbn6qboZuVn7C0p4uiurq1wburqZyypaSolIWOqsPEpIKLj4eIhIaVlI16g4yRjpGhjIyUkY+Jl5+Xk5mVmKagrp2MqpyOlo+SkZSVjpCVkY+hlIaXn6CynpSalKChmaSfmqCcoJSZnqakpqekr62lwMTDrqi3tcnDvrbOssS+xLyz0crIwrV0eW1cWFxpU0xIRExLS0pBQT1DRDw1QUQ7OjM9OEIzMzIyNjNBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJmWk1lXGZUY2qZjZeKjIiSkIaJeYaUkIFygHyNf3iHgoKQeY2hlqiampi6vsjIysHSycrCzLzBs627vqe6v728xLeswamssru9qrCpo6WjrK2zrba1oJ+vnqWimKO0vKmbqLzBo7a2r6uSsK2rrJeGmqqmpZGCjJOllYmAdYqSeYWNkpCen5OPlIuQjZSjmZeclZSjn6qfkaWajI+PkJWWiHyPlZKSo5uVoKKctaaQnpelpKOlnp6mmJ6Vl5ulo6moorKsqLzAxK+ls7fMwLmuxLO7vsK4rMLDwsCYbXlhWFdcW0tLTUpGRERJQkJBQ0s6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djZeOnpKJin+Jn5OEd4V/lX9/kIiKkH+VoZqupqOYwr3Iw8fF083Ozcu7wbevur20vMq8w8G1tryts7+5vK6vqKCop7atramxt5qeraKnoZ2rt7eppa++w7G9ubOnqrSzra6WlqWsqKCRjpKxxaeVjnyRlX2HkZiOqZmYk5OPk5WTpZ6TnZmToaOinJifmYuNkI+eiFqQlpeSlqWZZZijnrKllqKWrK2rp5ufppeYl5mVoaSppp+2q6m6vMS1pbS1y8G4qbassrq4rqi4ur24g2xuWldUVU5GSlNOSz9CSEVESEdHOTVGTTs+Nz5BSi4zMjAyNUI1NVBWTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVzs9QEJGQnFGaUlSZWJMRqWUnJahl6mWjZCDh6aTiIGHgpyEg5WQkJSOmqKfr76uoca9xcTGxs7OztLKvru1sbq7vL7OtsS9t7m3srK1s7izrKacq6u4qqinr7CXo66kp6SktMCwqqy0vsK5wLmzp7i0uLKulaWtr66li5OVoY10wZp+l5mFjpaZirGVmpmVkpOZmaajlZ+blpqpnZyhoJqLjZCWnWBKlpyalZqlllSWsJ+vnJ+llK+vrKaaoaaUk5mZjp2gp6KZtKmqs7y8u6uwssfAuKWrq62xsaOhsrK0pHFuZlxaTlBLRFBQUFE7R0pJR0hCQz45S1U/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVg7OkJDQD1RRVdSc2JXRkiql5mgoqivmZGXh4unlo6IkoWfh4Sdl4+eoJqjpLXItKnGusPDx8rIyMzNxr66s665uMDBzbbIusG5trqxr66ytKejm6qztKqopq2smaSupaSorLq/qKu2t7/Bv764srLDsbm9rKOutay5poicmKabdr+ghZmdjpOZmYqul6Gcm5eVm5+hqZ6ooJmaqpqip56YkI2RnYNudpKimpWdop6QrbKjq5WoqpirrqWkn6Wpk5KZnIiVnKKel7Gmqau6tr6zsq2+ubago6eopaecnKypqYxjZWFfUktNR0hOSVVMPU1ETkpLQkNEPFFVPUFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVlTUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5SYE1VSH9lXkhFq5ScoZ+7r5mUnoyTqpuRkpOJq42Hop6MpK2Uo6O2xr20wbrCwsfIxcLNyMK9ubKvubTAwsq1xrHBvLS6q6itrLCjopmqtLqmqaarqp2or6ejqqq+vKesvLO3vca8t7W4wLG9wLOptbervqWPo5eRop+8n4maoJmWnp2Ot5+pnKWjm5yhmqils6GbnaacqKqemZWPlJuLl4mMpaKUnaKeoLSvpaWTsKuZq6yenqSjqZGVlaCDkJ6fnJappKKhtLW7ta2otbKznpyipZqXlZmqoZ53YVxfXUpIRkdNUUlNRUZHQlJMSUFFR0BWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6Z1xGQ0OccGJHRaeXpJ+fw6ybl6SXmamclpqaj6qWlqemla2tmaGrtsTCu763wcLAx8S+zce7vbmyr7izv8PItb+vvLa5t6ajqqytoKCaqqrEoaSoq6aeq6+soqmov7imrb2wt7bHtrW5uL+xv8G2tLO0r76jl6OWk5uUraCRoaKlo6OfkL6lqZ2prJ2doZumn72imaOfoqmroZ2WjZWek56Hj4WNk56koJ21rKaclbKnmbCon5qqnqCNmZWfhI6hmpuTpaSamKyxtrKqpaqtrJyYoKCSjpCWqZ+UaGNZYV1OSUdKTktIRURJQT1QSUE8R0lIW1JPSz1IT1U0QkY5PkhHNUNiW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGVjV0yimqOcnsWsoZ+snZyuoJOjn5eloKepq5e2sKKqsrXEw73Atr/Cu8jCvsrItri1tLCzs7fBxra+sLi0ubWfpqyqq52dnqWjwaWgqa2gpKmtr6Kmp722prG8t7a1w7Kzt7m+ssPAt7ius7W1o52klZGToK2gmaKdqairo5rDramerK2bm56ZpqC9op2lmKurrKahmY2an5KeiY5Xf5aepaGguKqnk5i2o5+zoaCbr5eejpmUnYKOn5eWjqKklZCmrrOrqaKipqWVlZyYi4+Rk6SfiWJlWmNgTEhKSk5GRUFGSz49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIY1xMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dzSEU2PXVlXEtOnp+hmZ7Dp6Wis6CcsqeTqqSgpJ+tqaydu7CorLWxx8TBwrPCw7zGw7zEyr2vsbatsLSvv8W1ubGwubWsmqiwqamanaWhp8Ksm6yxnKqirrCppKe9t6a3uryutsOts7PCv7LGs7q3rLS2raqippaVlKOsop+fmqirsK+vvLKmoKmpmZmYk6KkuKChpJOvr6ylp5+SoZ6Vno+QjZWdmqKfp7Smp42YtJyjr5qem66RnpSXlJqAkqGWj46foZOLpqywpaeinKGekpKak4WLko2cnoBiZltnZUpJTEpSQUNASUc7O0c/OTlOTVVeUlNKPk9eXT1IUEJMTEk5TmRdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVV5mckA4PEiWd2VBNJ+kn5ugw6ikqrKho7WplrKrpqKksqyuqbuyrLC1tMa/xMS1wMS9ycS1wMjCtau1qLC4rMDEtLeurLa5pZmrsauqmJ+ml627tJuosJutn660sqequrOnurO3srjAqreywry0xae+rq23taqorKGXlpGmpaKjmJilr7iusrW2oJ+opJmVlZOkoLeipaaWrrKypqqmoZ6bmpqWmKifoJihnq+yoqaNl66ZpayXmp6lkZuOk5eZhZaflIyQnJ6Ui6mpqqKnoJmeloyOmZCChpaJlJ95ZGlda2pNUE1OVD1DQU5DOjpJQDc3UU9dXlJWUUFXYFxCSlNIVktIOlVlXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVKcGlWQ1dGjHlmQzukpJ2hpr+mqK+voKm1qp25r6qjqrS3sbC5t6+2uLjFvcPHvbzDwcbAuMHGwbqqtqStu63Bw7i4qq2xu6KVrbCtspalp5Cquamgp7CdqqCwtLKqqba1rLyssrK5t6y5sMK6vb6mw6uwt6+pq6umnpiYq6KioJGYobGvs6uxupucqaCZlpKXpqG3qaWjoq+xtKuyqKufm6Cgm56lnKKWnaOzsJqfkJOlmqGpmpWin5aYiZSYk5aXnZOIkJuZlI+pqKefo5uXm5OHjpmLfo2WhY+ba2ltYWxuV1BRWlRBQ0VUQDs7SUE3OlhQZF5QVldEWV5dTUxSTl5LSj5aZF5OSFBOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNjQ3Z1lgRig/OGx9aFtWO4l7Y0M9p5+coqm9oaqwqqOxuKmltLKroa21va+zuLy6vba2wMK/ycS5xMHAwLjEvcG3r7Woq7eyvL+/tamusbael6utqK2Wp6iOp7ufpK2znquisbCzrKm2tLW9ra+xtaywtbHAusS2q7yvsbirraqjsaaepKqgpJeQmZ+zqrOqq7OanaebmpWNoKaktK6noq2trrGns62yqaScn6iknpWhmJuotamXmZKSn5meoZ6RrJ+YmIWVmIudmp2Tio2Wl5qXpqWjoJ2WlZeUgY+UhXuPkoOMlmZscmdwcl9GWWZWRENNWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJgUEtNTlhXWFBKVlZXTT1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FVMTUwPWBWXjgpQzNZVVxnSzWMemZMQKSZoKSst6SsqaWurrapr7O5pqawt8W3sbe+wMG1tLrFvszFucK/ur+5xLjBubK1rKq6tru5vrWqrbG2mZinq6qrm6yrj6u9nqyusaOqn7Cts66utrG5t6mtrrGota+zu7zJsqq1tLG0r66nobOgmqitoKWVlZqZsqOtoKavlqGkmpqSjaKlp7KpoqeyrKq2pa+xta+kmZ2tp5qYn5mZrLijl5OQj5icoZiXlKyfnZSBk5mNnZ2alpCKlJOemqWioqCZlZGTlXqLkIZ7jIqDi5JrbnhudntgRWFqWUlIWVs9e0pHRTZBYlRpW01cYUpbXVpSUlJiYExLRV9gYFBMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENeUVwuKkIvSkdQW0gzY1lVS0SZlqCwqLKpraWjrq61qbe0uKOrtLfJu7S7u7++tLS3w8DMyLvDvLa+vsC4v7yxva6nurm3tsO3q62yuZWXpq6rp6OxqpSvu6StsrKnp6Kys7CxsbWxuLOprquxp7ivtbTDxbaptLWrsK2qp6O2n5+nsqCklJuZlLKep5ygqo2po56blpilpaW3p6KytKynsaetsLWspZmgrKibnJ2blKm4nJSOjouZnKKYkJemoZ+Wg5KWkJ2cmJaWiJeQl5uonaSgkpWQkJZ2hJCHe4WBhI2MbnF3dnx+XEtlbFxLTmNcP2J7R0k4R2dXZVtMXmJNWFlXVFhUaV1PT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydGYUxWJS1CLj1FTVE8M3JrSkRDkJmlrqWtrqunpLCys6q3sLafq7W5ybmuwbzCt7OxtcLDzsW/wb20vb+/ur+8s8SoqbmwtrbAva+rs7OcoKewraWmsKWesratq7KwrKmotLmstLK1rbSsqayorKm5rrGxx7+4pLmvqa2tpqitsKakpK6jqZydm5qwmaKjoqOQrJ6koJ+iqqamuaWstbWkqauprK+2r6Oeo6iqm6CampKktJqPiY2HkaKglo2UnqCUk4WOk5Kdm5iWlYiYk5WZp5ygn4ySkI2Qd36OhXx8fYeKinJ0cn59fVtSZG9eTlpmXUZElltIO05tWGFbTWBiTlZXVldUWWdeUVJMY1pbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGRISis6ST8zQklTLD6Paz1ISI+bqqqiqrCkqKSztLG0tbGxoautvMu6rsC7x7G0rbTCwtHFxb7Asr7Bwry/t7zEp6y3rLO4vMCwq7KtoKSnramopLCjq7Gqr6ywrq+uq7O6p7awsqmyqaulpaSvuqyqscK5tau5qKiorKqosaWqpKKuqqiinpuirJWknZiemaydoqepoq2mo62st7GyoKmioKuusKyen6eoqZmkmJmPoKeYhoOPioufoY+LjJacj4+Gh5CVoJ2WmJWHlpOTl6ScnZyLkY+NiX9+iIZ8d3+HhYd0c3KJdmxfWWBuY1FzcVxLO4R8Rj5XdVhgWk9jXE5VVlVXUFxiXlNPTmhYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLklnREY4PEIwNUVLWDFAlFs/TUaVl62noqqynKmpsLasuLWuqqWrqr3Ju7C+t8KvsKyzxMPOzsO+v7TAwsS6wbTJxKyvt62yuL++s62uq6WnqrCpp6ixpbSuq7CurbGws6yzuqS4s6ysrqern6Kfsbirqq26t6W1taOpp6ysqq2hqaemsbKjpqWhoayWqqGUm6CmnqSiq6Sto5+nsbetraOlopupqq6pnaKlpKSYoJmWj5idk4GCkImFnKCMio6MmY+Qi4SNmKSbkpGbjJOSkZSimZuaio6KinyGgYKDenSAhIJ+dHeMpId5a15gbmdXZYdkTkBnkkxEYnlXYlhSZVVNVlVVVE9cXWFVS01pV1ZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxDKzpKT140RIZASEhEl5KvpKOqsJirqa21q7axq6Srqqm8wMC4ubO7taWyr8TJy9G/wbu5wL/CucG6wcSusrWxs7vAvrOxrqyrq6i2qqWtsKu5sKmxsa+yrbaqtrWntLasrKSpqpyjn7WzqKiktLSgta2hqairqaunoKurqLm2qaqpqaKpoK2bkqmhnaCkoqajqp6dprWuqKaqoqOXpaenqpyipKOfmZifkY6PmY5+h4yHhJ6eiIWLi4+OkI2EhpWjmo6Nm5GSkY+Sn5eZloyKg390hoF/f3h1g397eH+BiJ2Pb3FnZ3F4XGBziGpPXZhWSG14VWRWUmNQTVVUVVBPWFtiVUhQaVRWVEdQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJRYzAyP2Y9Tlg/Qyw+TFRfL0prNlBFO5WOsKClq62aq6WtrrO0r6qlr6mpur67wLGuuK6hta/Jx8jRwL69u7zCvbrDwb+/rrKysbW9vMKxsrOqs6iktamlrbOzubCjrbayr7K5qriuqq61q6ueqqyfo6C2raihn6+zobSqnqinqqSroaKsrai9r6yuraGnqJ+rmZCvoZiioainn6ibmaqwqaOfrKKhk6Kjo6eYmqill5eZnY+Kh5WIfY2FhISkloWCgouHj46RhISUoJeIkZ2Qk5GNkZ2Ul4+KhYV4dIF/fXV4eYB7dHN6aYKHpHVpXmVsgnVniIx9UlhwXkp4c1NkU1FeTU1SWWZOTFZZZVlGU2lSUj9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTGg6NDhfPWFkP0YxQ1BbWytITzpWQjSQj7GgpKaro6akrKa0s7GqpLCnqri+wLyvpriqp66wycbI0cO9v765vr+8ybzBuLCwtLG6u7nBs7S7rLisorSmp6yytrmzp6a7ta21vK+8pq2stautnKmvpKClrKqnnJ6qs6SzqJqqp6mkqZ6jqaipvay0r66dqaSgrpybsqOVpJykpZ+kmpqoq6Wem6qhm5KboaWdmJepqZGYmpOQioKPhX6Pgn+Ino+Gf32Mh5GPkIR/k5uUhZOijJSRi5GbkpWHiH5/cXp5fnxpd3x6dXFxfWiGeYWIZGBoY3KFem1neV1eVkJXem1UYU9SWEtMTnF0XUhaW2dZRVVmUEQ+S05EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSDElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTtFWj8qj5OxmZ+fqaWkoaukt7Kypamwp6y4wb21r6K5raiosMPJyczBtr2/tbe/usi2w7W0s7Wxvbi6vretubW/raGzpqqrsLW4tKqdu7yosr+yuaCvs7WqrJ+usKOcpaipop6cpbGmr6CfqqmooqqcpKmgrbyorrCuoaujpK6enq2ml5+boaOcn5uao6qimpqkpJWWlJ+ilpuWpqyLnpGQkYyCi4GAjoB6mpSNiXx+i4aPj4yKhJKYkYeUo4qSkoeQmo+TgYd8eWt9dnl4Ynt6cXBxc3hpgXRrg2dkaGFvc45tYmpwYHBBXHhrVl5OUVFKSk1TWVZNXV5tV0RYYE9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDBCaFkxM1M9ZV9ETDZLV2VPKTwzUFs9I5KYrJmfl6ekop+opLivrqKvr6iquMK5sq2fua+rqLS6x8rIv7fBvq+0vrfEtsOxr7qyssC1u764qbm3vauktKeoqrCuubGqmbq9pK+/tLSgrre1pqensLOgnqSmp6GlmZ6tp6ieoKmup6Gnl6OpoLC4n6Sxr6GsoKyknKanqZqam5+jlZ2cmp2pppabn6iSmJOYnZKZlqGqkJqJjpCHfYh/go58e6GMjIh5g4yFioyNhYeSmo6JlZ+IkZWCi5eMkX2Ee3NvfXFzdGB5eGlvcHFvan9zZHtsaWZkYWaGgGBbc2pyTU1/aVhaTVBMSkhQUlFJTlxfblNEWFpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpoSCo/MFpZNSiWnaWYnJatoJ+hpKG3q7CktLOoqLnEtbGuoLesrq2wtcbIwLe/wbmwtL23v7u/r6u9sLS/sb3Duqm7urenqLWop6uwrbOxp5m8t6Sru7avn7G3sKmlp6+ym6GkoKOkoZebr6ahn6Knr6KgopOkpaK3sKGmsaufrKKul5yqpamel5qdpZObnJqdpqqZnJyklZWXlZyOk5eiqaGQiYqQhnqEfoSKeY6Xio2GeYKHhIiMjoWNk5iMjpaZio+XfoaXi496gHpwcndub3RfeHdkbGxsammEbmZzaWtmaV1kc4FgW2t1aVpJfV5bWE9PSkhIUlVGMjlfXmxQRFhWWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbDg0R0FmW0hURFVdaEUuPDJiVSwylqOhl5Scqp2loaKgt6quoLq4pau9xbKvrqO1r6ytr7XExLyzv7q3sLO5uLq4u66twLO0uK+/wbisvbq1pqKzqqeqs6utsqKawLalp7S1qZ6yu6mnpqmvrJmip5yjppSYorKkmZ+kqKmcoqCTpaCkuKikp66nnqWgp5KfqaKhoJmbnaCSm5yWoKGrm5uZoZSRlJaajpSSo6ikkIiKj4Z5hHyFhn2djYqKhnmAhIiIiJGFlZOSjJCVlI2OlHuDmI+Ld357bHRybGxzYXh0aGhqZ2ZvhWdoaWNmaWpgaWJqZ1tle2NgU3NUW1tTTElHSU9TQCEqaV5qTENWVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRCM0NEZ1tLV0dVYGhCMzc5ZU8nMp6jo5GOpKebnp6do7Wtpqq6t6arw8G2r6yjta6nr6+3wMC8ssG2sa6ytra4t7Wsqb2zr7Kxvb+4rru7saWetqulpbSpq66gnsKrqKWvs6qstbudqKqrsaWYnqqepqSRmaatopiepKmhnKKdl6Cdp7Wmr6quoaGenKGVoKafoaCZm5mckpmdlKWdrKKYlp6Uk42Vl4yPmJqpoJGIiouJeYV3goKBnIiLgol8f4SIhoWRhJaVj46QkZGRjJJ7g5WOhnJ9fWZ4b2tqbGd1c2tjZ2VkdYBiZWZmZWpqZGtxWl5ZXW1kYU5oV1pgVkpHSUtNUlg+OWBsaUdCVFNcW0lJR0ZBLjw/OUE4OVJHQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFlKVmJmQTozQWZIJTWao56Qi6yhmJiglqW0saKxvbagsMa7ubGxpLesqq6pub27u63Asq+urbavs7eypqq5sa+ttLa6trC4va2mnbWqn6CwpauunqTCoLKkrrGvt621nq2vra6imZ2oqqWelZuopZ+ZpaOonZqgm5ScnayvpbmnraKhmpuemZ6jmqSdl56Ym5SaoJKolqqnmpObnJKMlZmNlJSZqKeNjYqJj3yCdIKBipiFh3yJiYSEioyIkoSTnJKSj5CRlo6Qf4CMjYNvgH9meW5oa2pncXJrXGhjY3OBYWVoam5sZ2tqZ21cbGx1cWFUYmhkZVpJRkxNT1hRUVZhZYFUQFZTWVVGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUplQyc0kqCajo6wnZqToZqpsrCfuMC1n7PCu725saa2r6iupbe4t7esu6+tqqu3qrS4raSxtbGuqbG3trGztbqnqJ+2qZyeqaOqrZypwJmtpK6wtrWtrZ+xrbCqopucpKyom5Wcp6OdmqmipJaaoJyQm6Oqqam7nqakoJiamZ6hj2uilpiccYKWm6SAdZKpp56UlZ+RiZeZgJaKoI95hpSMg25qfneDcWyGi4Z9hIuGb15jYGeEl4Zri5CUk3V3i4R+g49/ZoaAaHVpZldcaXNuTlBqY2dyhGdfZGZubGpeYGCKkISGZ09LRDhFVGdeSkdRUFVVS0hTYW90ZUZbUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzU2OCwjMScyMTQ6MTc2WIFsMTZPa1tOXEtbZmI+RzFRZD0rL4yjmYeUsJuck6Cbqq2ro73Fr6i2wri9va2ntrClq6S4s7KzsLmtqqestKawtKKnt7W1qKest7OutK2zoqmftKudoaScp6eZrLuVpqWvs7itrqWorquspaGfnKGnppuYoaalm5unp52Tnp+YkJ6oqaK1r6Oio52Wl5iXo4ihjpKah6GHlJ2hf6V/pqqdkpKbkoiEcniNjoSIoXaIjWmXiGZ9c3ihb4iHhH6Ne3+hoJ+ZgHuHnnSIjnabimyHgYNtaGVjemxxYlSGbWNsaZhxWGpwb4dYXmlba2tbiHFuenKGaIeEWl5GTj5GX01GUlZWUVFSV1RnXkxYSlJSUEVHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3LyiMppeDnKudmZmdn6qqp6m/w66xury3wL+qpbewqaymsrWur7O2q6mlsa2ltbKbrLS2tKanqbOxrbKnr5+qoLKpoKSjmqKjnK61laSlpra9p62nqqqsqKaioJigp6OZmaajpJicpKmWlKKclJOkpaagtqOkoKOYlZOYk5yIro+YlImpi5eim4WxgKOsnJOanpV5gtSof4eUwZvHeXixpbeXZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQeoFslrGrsHloa1ixrm9labySvG5oem5yj9h+U2pitrJ/gXKUdZqhqpBXT1dhT1ZORlRbWFFQUoxcV1xQQFxEUE5FR0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjaaTgaapn5ecnqWtsqmwwr2ytcC1t7/Cq6a0ra2pp6+zqq+2tKioprWmp7itnLKwtaqlpKexrq6xpqqep6SxpKKhnpecoJ6vrZWeop+0uqOrqaGtrqWinZuaoqifmJuooJ+YnqenkZynm5SdoaaioK+in5+jlpaTmJKZha9qaoqNqn5nhJWHrWRwnZyUmqaVca6hpH53u3xroY92sV9qtFulgGackWBmgXpmf2p4aqllvnJnpox2smp8sXh0kpNjbW2nbVuEoEVpZ4eWRXWcYH1ne6Sngllfi6tpgJV4emqnN0qvW1dUbGNbS09YX1xXVjtOiE9XVi9IU1NKREVGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMxG5GilYKsp6Weo6WqsristL2+sLbEsre6wqepsKuvqamwrqSwurCkpa6zo6m4qJ6ysbCjpaCqra+ssKann6OisJyjnJiVl5ucraaXm6KetLOhrJyira2gnpqXoKKpnJmepKCcmaGnpJCdo5qXoJ+rn6amn5qfoZaVkZeRmoW1m7V4hamZtZl3h7Obt36TlpaplH5rgaZ6goWIk5SSd6tna7FbrHuPh5R0iHCPhoB/iJCXeIOCi5eMg6CPhLB2d59xa2tsfItOpFhIY2OZfmNopmB5cnVTkodeUKltY3F+h4BinS5RoW5bVGtnYExLXGRYXFpCPrB4V1hBI0xoRUNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dXN0o5YVU1MByVn5SIs6amoa6pp7Osqbu2wrC8wq24t8GqrK2urqausqmhr7yqoae0raSrtaWmsrKno6KeqKqyqLCopZ6fn66Wn5mVlZaYnq2impqkqLWvoamPqaiqm56VmKClqJqfnKOfm6CjpaOVm5+Ymp2iqpummp2boqCXk5GTk5yD1ZOZuXCwwn7GhnzWlJu7fJmVpI+NnI2ke46HpIKlgnqseY+dVq97iX6farlauXeHhH2mgpN8mHqqeY2cj3uxbY6EdJC8hW+UUK+nxYpRoHpjYKpic3KHbZeIYFO1tMiGgIl8Y6QzQp12XVFqaGNQQFhmWmRhSkhNbEtbU09ZZlpDRD9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tcUF9mVDdHOmFRNzIlm6KTmLGnqKWzqqW0qKS8t8GwusCxtbW8s7WnsbCjsLKmn662qJuoua6jr7Ggs7OvoKSen6epsKi0qaScnZ6ql5iXlpeVlqGqnZuXqK2wqaOfj6yip5ael5yhpaGYoaGioZqioqebnqGelZmbpqCcp5Wcm5+hmZCSlZGdiLJuaLVxq4dvjqZytHNytnuZl6OLjpyNon6RoKV+sHaDkdLRdlyufIZ/pG+bqqZrhoV9rX2XmY97sXOTnY54s2WWdISeb55mlFLIi1rCXJ95Yl+tX3Zzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPal9saU9VR0k5PVdSW1dYSEM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCTlRfZVA1Rz1hTTYyL6GckaWvrKSqu62mtKWntru8srq/t7a1urqzpbS0obGxop+ssKSYprqupLGxnbS3qJ+mnaKqpLGnrKmkmpyaqJ6VlJiYkpKjqKCXk6arsKailpOtn6WSlKGbpKaglJqmpqGao5+tmqCenZCWm6GdnKWVnZWaop+WmZaSm4Wse3eodqOOiYepb62KgqeDmJihiZKaiqJ/k5mJroV/grNccrNSrn2DgqR/cdd9d4V/j52GmZl3r4aKkZyHd7RhmmWagYKUbJJasFhLmnWYeWZgrV52d4domIhrXq93lZ6PeGw1eciusl9BVG9eZ2BFUGxfcW1WVU0uZWNpU1lROkFEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6ODifnZSguLCXtMGtqLKoqbK6uLS4v7m3sra9taW4s5+0rJ+fqKuflae2q6ixsquttKObqaCgqKG1pqaqo5melaWhlJOcmZKVoqWak5CnrK+moJWZqZ+ij5GimaimoJWZpaidnKSerZ2hnaCNlJ6bnaCYmZyWl6Kgk5iRpp2GqX19pXihj46DqnCti4GnhpWfoYiXl4ijgpGIlKp8gIudeW+xWqiCgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH6DlWySXKtbWpN/kX9oZ6pjcnuBa5iHcl2sWomgjmtuZU9KQ6FcWkx0XmJlTVphX3JzX0pWNkqak1lIRT1IRkFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4wMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8xVV9iTDdGSV9DMT44oZ2Zmb6rl7TCrqutqaW0sLixtb+5urOxt7yqu7SfsKSepaennpSqsamwqrWsq6+hmKGgpqSjuaKjq6CXm5GioJWUn5qUmJ+gj42MqbCvpp2Wm6imn4ySpJeoq6eUl6mnnp+go62koZ6hjZWhmZ+gkp2XnJWeoZWWj6ubj65tcrRyqYx2iqZztHhzs4CRpKKRnI2JpIeQd7hvjHuLomtrtlqghWWXl2mhoqdtk3K0dJOYf7JqhZOIrWt1s2GdZqJvh5Jql1ytYE2hfIeRUnOjbHl/fm+Yh3Fcr1Y8nHdmVG9uLlynT2JSa2VhbFliXGBwe2NUWlE+Pm1wM0JCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs8MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VfYUw1Rk1eODFCOKWam526oZuywK6tq6unt6m4r7TAtbyxr7m4q8G2qaqgm6akoZ2SqqqntqOyqK6qoJecp6Clq7mdo62blpmPpaOVjZ2hm5mcn5CTlKu2r6eZlJysqpeMk6WZpayjkZeqsqSgnqersJiho5CZopegm5abl6GTnKqclJGrmYfUkpq7c7DDgMOGftWWm7h4h5CXjJiKjKeIeqO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gIpumohxbo2kdL1dd31bYXm8a1pWW2p6XmpgZGZibXdvWVtZQ0FAcj9DRys1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnmp6hvKKXscOwraqqrLGnua+2xbG6sq67sK7Bsqykop6joZybkaqkqrKktKatpJ+WmqqZpqy4nKKumJWhkKWgko2co56YnZqQlpOvubGslZejqKeUkZaknKStnpGgqKufm5+po7OeoqWOp6KUoZqcl5WkmI+woJKVqp6FkJm2gJCRjLeVeIKTm7V3bmtuc255j4SOiXOewbu9mnuBsqhwgHSRuIN8hoaLh417ioaNl3yku7m9nHV6tKN0dpd1dLB1mZ5mhmmNtXRycHe2jF5/eX2JaIN5bXlii6xwdYV/WVunakRkWVNmYGNdY1FnZnFsdUJOUExEO1pMPkozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVjgqT11dPSs6VlYnPTs8p56goL+llrTDtKyrp6yrqbuusMavtbOut6e1uK2po6GlnqCdmZSspK2qprWoqJ+blqCjnqykvqahq5eUnZCim5KPoqiik52XkpiUsrW2rZidpKSii5KRppulq5uWqKSlnJqhqaano6mhkq2fl6Oel5aXnZ6PsKmUnKeijmp+aZymeIdzfpqPdHplh3q+vsC6bpKDcZSGX3JqWl6aiWFkiI6Va2B/lWNtnHZilGt/mpWUZV5gY3GbimlyjH2GlWdqfnJ0eH19Ylt3dIFoUFxug3x7i2tYbHqCcklKb4VwTXRNRVddZmBMW1hnY15PW211aXFRT0RFTTtISTxMPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBeTCgzPVtPJz8yPqifqKHBo5u0urajraWup6i1sazIrLCzrLWjvrGypqCiqZ2im5qZrKeupKS1qaWbl5Whm6etqL6nqaaVlJyVoJqTmKWpp5GekI+YnLCyv6ybpp6noomTkamaqKSam6ufo5mbo6etop+qopqwm5WmoJaVnZ+dl7GlmKKomZyRnZyjo5mmopqcmpqakJaBZ219cXeRl5SRhYq1qo2GmJWOioyYl4eUlYqDkpORiY2Rk5iUmJeaoKKanJShnY6CeqWFbGp8kHyAdImKgXGCeHl2doqAe4lqc4F0g3Vjd312a3B7bWBjXXBnTVlZZWpfV1pvem1tZlNPRlM5T1pOUk8oKzpKQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCzoLOiv6KksbK3oKqlsqelsLWqyautsaW1psCotKGepKWco5WWoKumrKOjtqygmZaWn5etqaXAnquklZKcl56Yk5Sin56ip5ORmKinssOvmqudq56PlpapnqqcnKCsmKGanKKlr6ahpKierZiXpp2ZmqGenp2woJ2ippWYk5iUoKGVo56XoI6WlIuKjY6WrY98lZuCkoKLqqiGgZiWioSPn4h7hJCGhZmQh4aJlY6bl42QmJ6klpqTkZ2Nf41mobOvhYmEdnqPinx2eXpvZ3mQgYCJa3WBeYhyaHN/enaDiIJrdGR5ZmBpZGJkZmpZa3twaWpcU0xQRF9VRkA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0XEc1PCxAtKC5r76sq66ysqCqprGtoqyzsMWwqq2js668pLScn6ejoZ2Zl6imqaakprO1npWUnZmZsKauvqCro5CRnpqZlJGVoZyXqZyEnqmsorPIs5+qpKuWlpeap52om5+kq5Sen52gqq6ppaOroa2bn6ChmaWenJ6dsKSZn6iTmJidkaWZmKidmpdmg5J8ZX6OmY9jeY1saGt6kaSra2WamH5nhYplZWloeo2hjmtojJeRondraouYo5+Zc2xueoSMh3pYZV6FgV5siomAdlxoc3d3kYCHgm54gniAc215g3R3iIiOg3tqhllea3RkXXOJaWp8cWxjXVFNV0pkWEBKND1GNz9GRDcxPD0/QUQ8PERHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMVlDOz8uPaWfury5r6yzsaqlqK2usKaurbC9samopK2vsZ+tl5+knqGamaarnKyjpqipsq6elaOQoq+mtrmlrqOPjpqhmZOSm6CZmaWWe6Wsoqizw7ekoqevnp6VnqOeo5yjqqiRnqGeoKqvqqujqp+om6afqKGslqGbpbCkmJyqlaGempOll56qmJ5+voOIcrRyhJ2GrWh4ucS4cZOio3ummJlzqoJ8y8DAu3GLooeCn3yVmImewL2Clp2ejZ3CwXuBe5KNmsPAfWulsW+MgG/Ken+bd5GDjoF2eoF/eXF6f4dxeIWMk3ltd5NiZl94ZF9lgmNedGhtZGJYTFZJUVpIT0UySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLyNGWzNQWS9VQUI7LziWo7jDtbCvwKmolKOvqbCvraayta+qpqamsaufq5ibo6Ccm6qnop2roqWopaS0o52ik6atrLezp6+ikpGanaWSkaChl5yfnYenq6Srrb/AsKGpr6mXkp+dopmio6qjkqChnZ6trqispqOjp6GlpZ6tqZGkm6mtqpydqpysoZaXpZaho5ecf86UeXqkgXmVlptfro9ejqeBoqB8p5WbdKuDgK9eY42peqeHhaB0l5KIs2OCq4ahjo2zaoSudH2Wh7hhgq1Zo81uj3V72nt/mXB+iJN2fmV7h3Z2a32Ibn6FkZJ+bYGPYHFrcGdgX3lkW3BoamRmYFJUUldeS09DNUFIRUQ4PjY7QD9BOz03QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w7TC0hUEBGNC4xrcLAv7W0sLiYnpGkqqittKumsqytrKSrp7CqoKebmaWXnKKvn6CeqKejpqGesKybnpWnrq2xqqisoJSSm5+lk4+fpZeeqKOerqSrsKjAxrOoqbGulpKdnKKXn6mqnpShn5ydrq+nqqmbp6ekoquSrLSWpqKrqp6jp6ahsKCTmqeaoJqUlJGXoHCFjJd0hKiHcbF8nXGsfqGegaWPnnergn2tf5xyrX6rh4afdpiSenyXfqqIooyRi51+q3uJk4+fgHutVpzEeo9vksF9gZVtdXCMbWV2ZYZvYXducm+Ki5KQg22QkGVvdHVwYGdtZF9vaWluZmNXU1xhWlFRQjlJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DUxsaytJ+do46jo6Gtr7auqLCnqaqorqurp6KknZmilZ+mq5+ipaCoqKKfnbCsl5qWqKevrKinqZ6XlJqjopKUoa2bnaajr6yjrLWqus2xraeurJaUnJ2imJ+urJyWoJmdnqmxqampm6uqpKOsm6+xoqisrqaZpquqqrGikpejpJqUkoSkaqR1iXqpdHqycYKliZmMcYigmoekYGBSrIR/roObdq6BpoaGn3qYloZ7ZoCjiaSZhoGjfal+gZSHrl58qVWdopKBeqKfgHvDr8WMc6+zs7lxYqmvwnRojY2Yj4FtmpJwbnl3d29sZmRlcXBme2hjXVdgalhYVEtNUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NzQsJiQiICgnIistIiQuITMtJkBEV0gsRys2NioxUEtMIyBBOUQ0LCfDydbVwKGZq6ihr6KesLWwr6mso6imqqqrqaSmoJuknp2lp6ajnKyaoqyhpJ+vop2akqqktbCuoKmbnZaUp6OQmqKon6CmnLGmo6exrLbIsrWqrKmVkZ2copmgpbOdmqGUnJ+nq6ujrpqsqqOiq6OzraKqs7Ghm6qor7C2o5OWo6eYm5F8qmyehId1q3l8sG+CpIuJn5aVn5SB0ri0uMmAgbJfX5Spg6SIh6B5mJWaeKrJdJmjlaepkJKbjH+biZrGxnhloYKlc4GfjoJ9r15wtWOxdUujhm2nR4KTZI+QnpJ8cJeSgHB6dHx7bVtmanJxZoFqXmJZY21cXlhITUxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz4tNU9UUR0cOzxGMiwkp6TBxrmtqbOurKWinLK5rKqhppuopqqsqaagpqWYq6OfrqudpaCsmp6ppZ2mtZ+il5OoqrayrJumnKCVkKWtkZmcp6OgqqeuoqOnqrC0wrKzqq2ok4mXnaWboaOuppehlZmdpaarmq+drainnqyjt6yhsrmvnZuvp7O0s6SUmKikmp+Ogp1OeJqBf596g6N8gqSEh6efnJ6ThLh7fHm5gn7MxsK2eJuhkYuffZmWl4p2npiKpJijqH6whZyFnoSsfZmUYaVso3CPhZCBfZeDcqxgpHNxgJpgvH1SVXWOkqSXfH6SkYp0enOEfnBbbW53cmqBb1pkX2huY2RdS01RVEJJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamspKu5q6+gnKGss7Omn6CVpa6trqqnnaammqOnobKuoqimsqCZqaSUorWio5WXoqm0uKScop2jk5ChsZmenKemoaKvrp2kqKK1ssOxraqtqpGHkJynnaOknKWXnpmZmqakqJquoa6lppiwpbytobe3rZ6dtbK5sbOnmJ6woqSehY/RtcO3eYeOhZGTj3+meJSid4ygkoSlgYpxqoaEtG5yapmjm5WKn3uWmIaHj3OvgqWboo2mi5OdiZSQm21wslylc5N6nGyZf3uZfW6pYaJxcX+fYnOyuGh4j5SmmH6MjJOKd3x5jYFtaXhpeHNuf3RdZGRubWZoYEpbWFg8SEdAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVZWVFFPUVtVJSEyQUgkKSWTc42Krb+/u7q1npeopK21oaOZlaOpp66qq5mlop+loKC1pqKop7CjlKujjqSto52QmpqqtLSknaSdqZKUl66goJ6mpJynnLWaoKqjtavDsKmrqaKMhI6coqGmopWam5yZnJmmpKaYq6eto6Wbrae+rJW+sK2fo7Czuqy0p5upsaWnmHqokH18sHeKgaSliJtssW+hh618oY+DqJWYgKyIha6Fn5SpoKGWhp+AmJWAe5J+q4CdmpaKqnidoI+Jk5KAea9do4F8pqdknYB8l3Rrrl2la3GFmV1gW4ygbZWRp5mDlIyWi3p6gpZ+a2x/Yn10bX96YGdlcW9oZ2hDWWBbPUtUMlU4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaWFNQT05JNzA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNUVlZXWFZVVVFIRklKIygovZKahKnGwrfBtJ+braCuuKWkjpuko6Cvr6qfpJ+drZmeuaCiqqCvqpqtoZCqqKSWiZuQrrCsp5+nm62YmI+soqGdpaKapZytmJ+oprapwK+lqqSfi4COnJqfpp6SlZqalJubpqSkmqisrKOkoKqovqSXw6yqoqGssrqrrqegs6+pqph2r36Qi5yFh326rYqYZLCMZZWtfaGPg6aVmoGsioSwhaWZpKGhj4SgW2xqgbNgf617e4KAsWxnbpmXjIiwW320W6SDa8iiZZ+Ae7xZdrVasn1Sr4B6rFiAoW2Yj6iaipeRlpZ7eI2cfmRzfmKDd3SAfGFqZnFuZmVlT1VjW0JUXj5JKD45PTQhIi0lHzIuICoxLzA0NTc5OTxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE5KR0M1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7K3vbu0wrOjnKympbaooYuaoJ+ds7OpnqOgnbWYoLOoqqudr66fq5uVr6iijoibjq+sqaeip5muk5mPqJqinqWfmqOjpZmfo6myqLyvpaienY59i5uVoKCZj5Kam5KbmKmfoZmorqelpqOlqbufoManpamhq7S2ra6nn7ytrayVgamSo6+Pm4CGpJeYkIGAuMO6g46dk4SnlpyCrIqCr4imm5ulqY9+1b3CqmKjv719fqOCg9e6uLWFlJODnr2+hGqjgW+rhG2df3qysMeDaquwva14d6K+u3SAlo6mnI+bkpedeoGQm3pjfXtkjGZ5gntga2VramJQYltTalxAVGFCTik9OjQvHh8kHiUyIB0kKDA0OTY2Nzc7PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSUM/PEE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbO0sb+5sr2zop2upqWzpp6LmKW+qbexqKG/pqaynJ6xnLmonq2vpqeVlLCsl4yDm5GupqOsoaScqqGYi6OSp56nnJqhqKKYnqCsraq5rqijm5eTe4eZkaabko6RmJiPmZSqmqCYqamhqqeho6u7nqnFo6Cvo6uztauwqqC7qK+vmnN1qqS3hmWJn3BnrY+Kj21vd6SQmZ+Bda6ZlXCPi3GVqKObl62jcm1tbWWKeG9tgplxgHlpcGlniZaVmHFoaYSGZ3CGZF2JY2pvWV1nfnemYGJxjpJvZmSAjZKOopiXmZGWn32HjpV2Zod4aI1qeX55ZGxjZmxiS2RYSmtZOlFlRVInSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXVdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWts6q6ubKzq6mirp6ksqmYkr2xw8i+tqqewKuso6GnrJ+6o6StrK2mjpauqZCMhZWXrZ6mqqKfo6OgkYykkqeZqZmWo6qglpylpqevuqusmpuTk3uEl42lmI2RkZiUjpiWqJSfmKmjm7GnnqOsup+wwaeks6assbKrrqyouaSuuJaKoailtp2JlqKXh6makJSdk6qzmZujq6CxlqGhnaCinKCkoZWqpoySkoyHkpyclJCak5iQjpWGgaSZl5WNi5OSio+GhH5nin90gnZ0h4xxp2x7lZGUk4GBj4+Pj52UoJaYlqGDh5ONcWmQd3CKd3Z8empsZGRvY1VgWEBpW0hjYU9aK0Y9KyYhNzQwLh8cISUyKCo2OTk0Njk7Pj9BQkRGSktLTU9QUVhVVlleX2FjXV5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaWltcXl9fYF5eXl9fYGBgX1lZYKWWqaqltbeurqKwpK2foLWxkI6rxbzEu7iqoqWdm6aesamjtqedqbWnqJGYrKKLiImPnKeWrKShmaeenpOVo5eomqmZlKaho5CbqJmhtbqoq5makI18gZSLoJSKlJGVkJCTl6WPn5qqoJy2o52nrLenr8Guo7emr6+wraqqs7mhr72Zkqajpraikp2mno2pn42Sn6Osr5qho7Gor5ejoJyjqZ6enZyWq52SmaGblJCWqpmNmZmWkJafkYmgnZWUhZKMkIyUioB+ZoyGdYZ2eYiDc5xqhpGUlJGKfYyWkpKYk6GTnZagg4eXh3pylnN5iX9xe39qbmRfcGlgW2BZbWNQYGRQWzpHR0Q9Mj09Ny4qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOjlFTVZbXl5bWlxbW1tcXV1fX11eX2BhYWJhYWFgYmJiZGJcW2OXlaSoo7CzrK6jqaetoKi1qpCQnaSzu6+srKKjmnqdorGkpbColpu4p6OUmaqcjoaKiZyjkK6fo5aooKGSl5ibrourlo+omaeMmaiPnrm2pKWZm42JeYKUi5qTiZWSlJCNkZaijJ6eqZ6fuKSAhK+1orCvdKS+o7KgeHqgqrK7lXatpJ+KgKp+ZFxidp+OpJ6El35uk7Oco6euqqNlnZ+Tc3mZl3CAmKiXbH+iqIplnKWckZeYlYuSnJGGnZqQlYKSh46OkomFd2uPh3aGcXyGgIBhaYiLlZOLW3aVkWdokI5ye6WYmGR5mIaCeJhpg4qCbnl/a3BlYHZva2toW2ZlYmJvU1w+Tk5OUkc9QFRCOTEvHh8mNDozMTY2Nzg8Oz5AQUJGSEJGRklLTVRUVVlcX2hmZ1dRSjxERzs4VVJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mm5amo6GwsayrqaWoraOnraSSlqu1r7Kmmqqmq5dzjJ2wn6iqppSWuaCgj5yknZF/iIibno2rmqOVp6KejpeRnoV1rpCIppqokZekiJy6tKigmZiLiXV3k4yWk4qUkZCUjI+ToI6boKeZnLOWgIyctZ2zjJKPvKehfqeieqOvt4GOjqaehIuFj7Gpr4yJlqOaeYGLrIacnaKnqaeHlYWYd6WbeoebgZemgoF7nLF6ioWgl5mUmJaCkZeWhJmZY3mHkISNj5KKg21wj4d5gHGAgYV/hnSGhJaSeJZok3SgmnR8mYOgnIaYfpKJgoOZao2MhWt4e3FwZ2R3bmlsa1tla2plc1xeSVRMUUBFNS5ZVFU2KSEwOT0+NjQzNTY4Ozo9Pj5AREg/SUVKS0dTWFpZW2FhaGZZUUg5RUw7PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyYo5+mrq6rqKygqLCmp6mlmZSuxr2woZamqbWej4OdrJynoqCNkL6emY2fmqCQfYWOmZeIq52ilqChko2TiYaAkaiOh6Kco5OXnoaeurKnnpuSjoVwdZCJlZCKlI+Pm4uPkZ+Sl6Cklp6siJ+0ibSarYvKh6quiLeFjbCDsa6DqY2mmI2dfKiPcnt3m4+nlmiVpHm0i5+epqiSmcKBf6uImKFxnoCZpH2XhZWxgKF8oZSgkJiWgI6Tm4qXkYt8hZOGjZWTiYNtc5GFf3pyhoGEfIR0hYKXgY/FZoCph4+ja56DoZmDmoCMjIOJmHCOkoVod3R7dmdodXBnZ2xeY29sZ21YZ0ddUUwyRTQ2TWBjNyYzPERHRDo2NDY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQEpkWV1jZmhnYmJiYmRjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS5sKqrppqUoKOkqqSWpam2o69/oaecpZ6diZS9mpONoZGdkHmElpaRh6uZm5uaooWPjHebnI+gkYiepJuVmZiGormupZqcjIx/Ym2Pi5OQjZCMjZiLkJGfj5SgoZmhqH6hp4etnaCWro+enZ2RhoGgjauvhqSNqpqMmn6idoCZk2qCrHVNq3iHjZ2Rm6ingKqrfYOhe3qnaZ5/kmtnl4aXtomefW5gZFmDln+Me2RoinKZfXmVbF17l21fU3CEXF9seYNgWWWCfYSBmHGnqmuDo25ypXCfg55pZZ9sW22Je2VZX4N/YldQb3ZlbXRyampvXmpvbWxqWGlPXVdFOUE0R0NeazQsSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl9jdmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBjZGNhYmlrZGJkZGdkYmdlYWNomJadoLmhqqOmrJKhtryrrqKZl6Chpa2toZ2ttaKokqGgoKacmY6YtJmQi56MlYt1gZSRjYqmlpWYnp9/koWGrKSHnJGKmKmYmZqSh6Wxp6KVmoiJgGluiIeLjo6Ki42Si5CSooyUnqCcoqV/k4GPo6GUoHeclo+ng6Gnf4aprYWleYp9hJp9onByk4eWe56MeW2HnIyZkJuomo+HnXyConN2pmaefnakX5h6fZJzom6Yt7S6dJKHgn+1qGSBxrh7cJW3i3GAm6Rjc6yrYH1qnbN+bn2Hg46Ci5dxgKNsc6RznoN/pGCdmbOVcHyXnrR0c1uesoNqYm9zdXFob1hrbHJzZl1pXmJLRD1ENVFBWXEzPVNHX0pSPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWldgYHxkSEM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mauck6CNpLi1rq2gm6Kco6Omrpybsa2sk5ehmaGkmZqUnqubi4mSeIuFcICWjYqPoJCTlJ2XfZCJjqigh5iPipGik5uajIuoqKWej5aHhH5re4d/fY+Ng4uQkImPlKCClp6gnaCfi4l3nJiijKByoouIqYicppCWqKt/rox9eqCZeqOTeIBzloiNnH2WoIebjpmbpoaiZKF8iJaQm41snmibjW6amXuAiqd9cmh0q4Odg3SqZ5SaXZuFdoSdaKpqgLhmXKhwgZxhlYxep3Z1iYp/nmiadYeTkpiOf59umpBtp5ldqH53u2t+qluOhF20Z1xucXl3a2lbcWp4eWNgZlhiQVBFTjdWQlJuNEtaWl9OWkNAMTUxOzs3SD86Q0dUP1lSWV0+RGJeVmBRYWN9aUVCOU5bXVhkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtpuoiWOUm6y6srCsnaacnKifnq6bnrCoq52XpJqhn5iWlqCjmYaJjWqIgHF7l4iLlpaEkZSYj3qKhJaknYqUj4WLnZGcnImPqKOgmYuRioCAaYGGeX+XjHuIjo6Ij5aaf5Sjn6Cik5hyaJ+Kn4+McZKMgamImZ+jqKCofbCto6K4l3ejs6Kjf4iUeZ17q5p/oo6dm5eJl3GhfIWNr7V9a5qRoXh+mLSjo6uohJl8m32dmn50qlpdb3uWi3ieYkx+enqFY3mXQk2fWaJqcXyObYGJhJl1m3mHibGzf3+bk6d1gZ1ucnyUb5lyaqRdlXZIZWNgc3B9fW5lYGxodnxkZGFRXlZdVFZAWUVRZ0RTV1tiWF5JRD1COD9COklFOExEV0FWUVtWREZiXFpgS2BtfnFFQzxVX2JaZWpWZ2htb2JmZl5hYVxdXmFoYl9lZHZsXmVnZmtkZmxpaGtpk52Asa6ZhFNfoKezubOzqZqijJyrnJyplKGrpKGoj5+enZqZlZignZaIh4l3hYFueZWFkJqLfJGTlohygImToZxzkZCBiJiUn5qEjqmcmpSKi4p8g2yEhXGBoYx4hY2Ih5KZlXyTpKGfo4iuhn21hI6enXullnqpgpadkIqhnX2naHZtfpl0oXNxfJ2FmXCTg659pIOmnpqBo29eqGd1o2NvpWGc0pB8epl4cnNjooWQfqNzo491a5Czi2CCmIlzqrKovH93g21+vqaptF6cbn1xl2+Bc6JyXaNndKZhaKZtm9SZfISbb3h5l2ubeneXcm2ppGdgZXlwf4NrZ2ZkbXV3Z2BiU1tlUVFhSVdJVF9XU1tlalxkUEVDS01KS0JKRThQP1BNV1NYT1JSYGZlaVJjd3l3SUZFY11kWmhpVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJebgLGrVFxLfqmvsbSws6OcmIWZqKCgo42kqKCYqYmZmJiTmZOSoJiOiIZ7cH2EaH2PgpSagXeRjY6Jb3+GkJOSbJeUfYiRkaOVg46qmpSSi4WJeYN2iIBugp+Gd4CThoiZopd6lKOlmp+Js6Gitot6rKekrqVwqYCakIWBnJJ8pICimYaYcp6Eoq2uiZeMgIykjZaDraGUdrW1tcmhc5SKgZ9gnZapbXmVhp+adaGHd6B+kZaKgG9MZqOScJqHcqR7eXRhg4JsfqBrcWRgnHJ/dJdpe2q0tbTGpnOYfnudapubq3WDmmx0d5dpmnp1mHJQRH2zXmp2a3iHZmpnYnR0cW5WXlRZaE9SaElVTFlTVV1oa25WZ1dNSkFKTUtISk5BUUpQZGNpbWV0cnN+eXtudYl7e1RQT2xeaFtraVJqaGlsZ2xmY2VfXF1cXmliZGhre19dZGhjamZvbWVpbGWhnImwp4RmP5Shsquvr7Wio5CAl6mioqWMpaednKWCmpeWjZeQj5yTjoiDeWp5hmWDjH+XoHl1j4iMgWmEhZKDjIWdjXqMipWlkoOXqZeMkYuBiXqAfYt5cJChhnmBlYeJlqCWf5WmqZyWloRnbnicbKJkfHGld5yYcGengZeMe6V6n5aDl3KedoGJlJaPuW6QiqJifZihlYhtcmmranWgbW6mYJtoipBoloealXWigH2aYIuFjHRviGJooGWefmmadW9jZoiCbnKiWl9bY6FuXYmMb3t/c3JkpW13omRnp2iYc4uYbqFvU4iPb6BfZadUi11UmG1tc2txgW1waGt4c2tvUlhXVmZZU21JWE9dSFhpaHNqWWtWUVJFVlxMWFJhVGhqXnd1enxwfHxyg3t/cnaNgIR2XlFyYmdicGdQamhoa2xuZ2RnX11eXWBrY2ppdnVdXGNpY2pqc2xma21jnKWZpnpldG2Lp66kqbCxpp+LgJernZ6ljKKhmqKigJaYk42aj4uYkI6Ke4dxgIhoi4t8mJtzdIp9kHxkgoeVioqVmYJ8iIaWp5CBoqyQhZCKgop9gICOc2iPpoR9hpSNiZigjoiTq6ediaZ4lpx/pYmWjLKYnpCDr5efpXiViHqpdKWPhJpupKKMkoSMg7xufKWvgoaFhpKWnJ98pXpxqJWglmeefW6rY5aKlZJ3qGypooGJdYeCd6uRpohrkbBrdrOMqWuKhm5tn56SlWF/q4uqdoB/jKafd599haWVnaBpmod2rGeerYy3c3e+jaSTWYOmjathdXJzb3t0cWJqfm5obVNWW1VhYVxrTV1SXUlebW12YFtxWVtgWmdzZW5vcWNxdGB3en55cnmDc4R/gHt7jIGCgHZieGRjbXNkUmxnaG9scmlmaWFfXlxia2JtbHpvXFxiaWJsandtZ2xuYpWmqp2BgJ6klqmqnainrqSZioOYq5qepImapZ2pnISMmo6GnJGFko2MjXSGeoiEb42EfpiTdHSGcpKDbX+LkoeGlI98e4GFl6WNf6WmjoGOiYWVdoKHkm9si6mBg4uUjomcn4mNlKukoJCAdZSXiX+BeZSuo3+Bm3GPhnmQi4R/e3KmjHF9fXqXlpuEjnh7fn6IlJWTinaQmJ+gg3p9iWyMhVt5eHF5cWhufpKJcX90go+Uk3GFg4JljX9fgX+Ld3VzlHVveW5uh22Ehl53aXiNZoGCho6pm350fJdqiYhvgHZ9hXZtbGeMc3l7mHiEW2tYeY9obndycW93eG9dbIZuaWdWWmBXXGVrY1VhVV9SX3B4eWxrdmVqa2p2fHFydHNhb3Vic3uBeHV5gnWAgH+AeIuFg317bX9sZHhuXlduZ2h1a3hqaWpkXGBaY2plbHB1blpbYmtkbGx5bmhsb2GOlLmpp4uhopqmpJmknKujoYSEmKySnaCJmqaaqJiCgZuKfpaTh46KiY1yg3yPfX6PhXuXjnRyg3CWhXt9kouGhpCFeH5/hpijjXunoYuGkJCFloOGjph3coWqho6SnJCInp6IjJuooKCrg4mOlJuAfomWraiPk6aQeG+dkYN6km9+qIVwfZVxa3B8gZ+Lf5KOjGhtXYOLjJubno5zlYuIcXRrgnZzgFlyboeRgX1+jGpdamR7hYOIgF9peHube4KLgnaBhoJoeYuHa2FxcoN3X3OMgomQp5WGZoyPg253i4RxhY15b2VnZHqDepZbXGpnbnZbe3h3dG1zcoJmXG2Ka2xiWVleWlhscVtfYVpeXWZ0fnt1b3Rja2tqe3xye3h0ZG10Z2x7fnZ6fHt6en9/fm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtoa2pxcm1XW2VubGdzem9oam1gi4yqsaGQo6Ganp6Ynpmoo6J+g5itjZ+Uh5uikKWVf3uYhHySmYmIhoeKc32Ai3aFi4GElopxb4BymIaEfpOEg4aKgXqAg4ubn4+CpqGHeI6YiZWLi52XhYN6rYKRmJmUip6dh4ihq6CioqOLiJOcnaOZlqqhp6agkpuIl458eI6OhKd+f5KRkpOcsaablJ6QjbKTmISljIyVm5+JkJuCiZGKa3yNdndlgoaQinuJnYSHi4+IiICFhJB3fHl1mqGIhoqfi4WUf36MgYB2cHSGhH94iIeLkKaRhIWNiIONkIx9iIuIj4F2bIKEfHmZanJoYXSKcH16d3Zvd3SBXV5vhmhuX15aXF1TaHFVY1xcYWxpdXx8c29wZGtqaX97bXh/cWlvcGxmgHtygoB4f32AhHptg4yGfHp4fH16g3lOZHZrc21wemRrZWJiYFt0ZnBmcnJtVV1sdG1oeXpxZ2lrZY2Inbqfl6KhmJWZmJSZpKCee3+aq46ejYWfnIueln15lIN7jpmJhoSEhm54gIBygYh+iJSEbWx+epeGhIOQf4CGhIZ8h4ONm52Sh6qfg3KKkIaTkoydkX2Ne6qEjZKYlY+cl4aGm6egopqdhoORmpqZkJqmoKadnZCWgZGKd3yIjoSle3yOkJGGmKmhnZOdj42rjZGAnoyJk5qego6XfoaNgm94hXF0YH+Cj4Z1i5eAg4+ChoR+hYOUbnl1dJKii4yFmoWEjXSAinx8cnJ7iIR7eYyPhJOnj4aEj4KEioqKd4aIiYt8b2t+gHttaGxtZ155f2h8e3Z0dXV7d1xgcH1udWBjWl1eUWZtU2VaXmFraXZ6fnFsbGRrameAf2xzgGxsdG94boR5boeAdoKAfYR2coONiH57e3x/e4KKYGl7anVoaYJkamNgaVxkdWhvYnVubFRjcXllcHp6c2VpbW2Lip+3m6Kkn5KRlpeLmp+fnnt4nqaQm4qGpJSLmJl5eo2FfImRg4yCgYJtfH94c4GFfYqRfWtofYGXiIGIjnx+hoSHfI+Aj5ubkYinnX9wi4uMk4ehoYqFjXyokYiPkpeTlpN4jKOhoZ6Wmn+AkJqYk4ybo6GkmpeRm3+OhXmAg4+HoIB9jIyPfJekoKCTmZCPpo2PgZuRiZKXm36Skn6GjYF1dIJwdmB9f42GcoqVfIiLcox/goWGjmh3cXiMmJKPf5d+iItzgod8fHB5e4yEenuSjYOWppOLhpF8hoaHhXaCg4iHemVye354enBsamZefXNofHV1c3xygGpeYHR2cHhkY1lfXlNraFRkWV9hZ2p2eIFxZmtjbGhlf4BqbX5obnFrfXeGemuMgXOBgX2BdHaCjYZ+fHt/gX1/j2pyg25zaWGHaGxiX3FWdG9tbmB4aG1XanR2Y3V7e3Jiam55iY2fspKmpZyOkJiPhpygm5x8dqSgjZd/jKKKiJqWeHuGh36DiX6IgoB/cX97dHaChX6KkXhnY32Gl4qCio14fYCMg3mWgJWXlo2WoJt+b4yCkZSGppuIjYmEppWFkouWl5OSdpGeoaGYlJd6fo6Yl46Wm52knZmTlJx6kIaDeIWXjZ1+gYmNjHOXop6hk5mOj6KMi4OWmIOSlpl+mI18iI2BdnF9bnpkf3yKhXCGk3+QgmyHgoGAiYRldW98h5KXjX2TeIuJfICHfHtxfniKhXmFkYqLmKKVgYSNd4iEg4J3fIGJhnZfeHd9c313ZmxkYX5pandzdHR9cXxiY2FzbnVzbWFaYV5ba2RSYldgYWhrdnmGcWJqY21laHyDbGh0aGxvaH98gnltkIZxgIODf3N8g4yBf356goN+fJBtdoh0dG1limxqYWN1VoRpcW5geWdsYmp2cGZ5fHpxYHJshoWQnK6XpqiejY2Xh4afk5eYfXiqnIqYeZeci4yYkHl7gYt9fIN7gIKAeHR5enN9gIR/iYuAZF59i5WHf4WHdH1+in99l4SXk5aMo6GYf3KHe5OSiqePjI6Kk6GSg5GQlJeRi4GPmKCakpCRdH+NkpSJnZ2ep5iYjZWWdI6Oi2yGmI+ZeoeIkIlvl52ao5OVio2fjIaBkpx/kpKVhpmIfImJgXpxeWt1bHt9i35uhZKClHdvgoN9fop/ZHJqe4CWl4R/jXSQiYN5h351eIB9h4B8hI6FjJSkkHmFgnSJh32AdHaBh4NuYHt1enF8b2FuY2V7Ym5vdnJ3d3N0YXZfb2x1bm9cXF9eXmpeT11XY2FobXR7iWtfamVqY2h3h21mbGhpbGiAfHp3b5CHc4GDhH1zgYaJeoJ9eoGEfX2OcnqKeHhubIdraF9pcWOHaHFvZXdobmxheWhrfXt4cGF3bYuBmZqqoKOonYqKkYaKnoqVl313rpiMln2ek5GWlIh3fnuKfXyAdnd/gHB1dHtvhn2BgIp/fGFcfo+Rhn+DhHN6gIZ6j5GHkpGbkqWblYJ+gXyOi5KkiY6KjZibjYaRmJOWjomJjJOdk5CMjW6DkI+RiZ6ZoqGXloqXkW+ImYRnhpmOlHqJhZCKcJWalKGSkoiLmYyCf5CefJKPkouZjnuKhId0c3VrcW51e4t0boWQjpJxdIB7gYKIfGRxbHl9mZR9hIh0kIuBdIh5b4B+gYd8hY2KhY2VqI17iH1+i4V4fnFwgIWDY2h4dHZwe2JecGFrdV5xanp4eGxycGV4XW1sc21zWVpeYGJqWlBXV2VjZ3Fxf4dmXWloZ2JncY5vZGlnZWpogHp3dG6OhXSBgYJ7dYKIhXeFfHiEhXqAiXd/i3t6cnmDamtfcGh0gGtyb21xZ29sZXxjboB5dnFsd3eKf6KYoqigppuHjIqBkJyGk5x1gaqUko2GoIyWk5CAdHx2hXd4f3Jze4Vrc3B6bop2gIGHbnFbWX6RjYh/gIB2dYCAf6CGkIqSnJehlJh4in+BjYmdnoqPhpKYloWJlZmPl4yLjY6NnYqOkINtiIqQkYmclqGbmJWGmIhqhaODZ4adipF+i4OLgXeTmJGekZCIiZWNf36Pl3yRjY+NmpJ8in+CbnZwbG1ucHuFaXODjpeKcHd/dIKJgnhmc292gZmOfImEepSReneIdHCJe4aNeouHhImPnKOIfIR3got/eHhva4GCgV1yc3FxcXhaXnBgcWteb2l8eXBtbWpsdmBwb2pybVpYYWFiblhRU1pmZ2N1cISCYl1qbWRiZmuSbWBmZl9oaoF1cXJwi4B1f4KAeHWAi4B4hX93h4Z3g4V7hox/e3aKf2pxY3xihnxvcWx0amhvbHZ3X3F/eXt0dXSAgn6klZqtnqaWhYyDf5eUg4+fdYuflJOFipuMlY2LenJ4dIJwcoRzcXWIbHBtdW2Id4N+gG1uVVGBq5SHgniAdnKCeYGggpGBk5KYnJKaeJJ7g42TpJqTjomVmZOFh5eZjJSMiY+PiJ6FkIp8coqFiY6InJqfm5aUgZR/aYadiGeGoYiShJGDiXGDkZePmo2PjIuPjXd7kpB6jouMkZaMfIh8gGt2am5ra2x6fmF5fo6VgXZ6gHeDjXx5Z3RsdIeVi3+IhnuUkHF6hHB3jHqKjHqJfoOMkZ+dhX18eIKMfXdxamyBgnlfd29tbHJzVl5vYnJhX2xueXBncGZmc3RocWthd2VdV2ZhYHJTUE5cZmVdeHCIfF9caHJiYmVmkmlfaGRbZ3B+cGtwc4p9dnyFgHR1f4x5e4aBeIiDc4aFfoyMg3t5lXdmcmqDYIh+b29remBqbnR/dF90fXmGeHRzhXx4oI+ZsJylj4KKf4OaiH+Lnn+LmpOPhIiYjo6PhHZ0dnOAcG+Fc3Bxg29raXZtgm59fG11c1JOgt/IktaTfG90hHaDoIKTd5WRmZuQmnuUc4WQn6GTk5CJk5uUhn6WlYiNjYiRjYicgI6BeHqMfoiMipycnZuVk3qOdmiJkodsiKOFkoeXg4ZjjJGZj5WJloyNiotxe5SJeo2IipKRiXmFe35se2Vyb2treXlcgHmPjYB6fX5/ho56eWhza3OLj4qChYV9lYxrfn5ugIx/jId9hHuDkJWamop8d3iDkXlzbWZwf4NsanRvaGp0bVNeb2RwWWBrcXdma2piZnhycHBjX3hgYFZrX152T05LYGZjXXlxiXRcXGV2YGFlZY9kYGZhWGlzc25rcXaMfHR5hoJ1dn6Lc3+Gf3uJfnKJh4GQioh8fph2ZXNtfGWIfm9wbIBabG55eXNhdnp7jXZzd4p3eZ+Lm66boJCChXeIlX58iZyHhZ+RjoWMl4STjoeBdHdweXFuhG9tbn5yZGR4cHxten1qaGxjpJrB3K7voXNrdYR2haKFkm+WkJWglJyBknGGi6OXiY2VipCdloOAlZCFiY+AkoqKl3+He3V/iXiGhI2cm5iZj493jHZuhomLfYqjhJGJnYWFXouUl4qPiI6Li4SJbHyWgX2IhYmQj4Z2hX19a31keHVqbnhzWIh6kYaFen5/gIWLfnhlc2p/io6Kg4J/jJaFa4F2boiRgpCFf4J7gJGWk5mQdXR4iI11c3FndXmCYnRtb2JpdmdSYHFnbFVfbnR5YHJjX2h9cHJuW2NyYWJXblpcd01NTGRmYV52c4ltXFxkeV5gZGaFYGNiXllqcmtua3J2jH10d4SBeHd7iXGDhH1+iHt0i4mIlYaMfn6Yc2h1cXlti3pudHCBWHF6dnlxZXd5hoxpd4CJcn+ch5innKOShHxwjJR4eYudhIWhjY57lY1/mYiEe3J3cHNqb4FraWx8dF5geHZ7cHV7Z2FlfOvatcnD3IhzbHOBd4qaiI1pmI+PnZWTgYlxhYmgjoWKlYqNmJR8jZOIg4mPe5GLhpCCf3Z4g4Nyh4KTm5aUmIaMd4h/cIWCiYeZooOUjJ6DiWGDlY+HiYaJjYeAh2l9lH99g4SJjo2CcYZ+f3F3aHZyaXN3bFqMfZKBhXx/g4CEioJ1YXRsiIGPi4J+f5KRfW2CbHiGkIaThH2BfoGSk5CXiW9yeo2GdWxxa3J4gF9zaW5ca3ZgUmRyaWZTX3B2dGBvYF1ognFzaldnaGNpWG1XW3VMSkxlZ19icnOFaVtcZXleXmRne2BkX1xZa25lb2pzd4p+c3OBfnp2eohzhYJ8gId2d4qGj5iCjIF7k3ZsdnV5eJN0bnh6fVh5hXGAb2d5d5KCZHaGhXGKloWZoZuiioZzb5KLcneOnH2KmomJfJ9/g5l/gXhxc25vZHJ+aGZsd3dbX3l7enFxgGlhZ2F/1baOkKZ4bnF3e3CSkIyHapmOiJySjIV7aYiLmoeBkpGGh5iNfI2NgYGJjnyQjX6KhXp1e4J6cIaAlpmOk5SBiHWDhnaDgIuTnZ+GlY+ffohhgJOHhYiEiY1/f4NnfZB/fn+Ci4+Qfm2CfIJ0a212dHN2dWtijYGOf4V+fIR/hId+cF9zcYV8j42CfH+SiXpwg2Z5g4qHjIN8hH6AlJCRk4RucHqMf3Vub2psen1iaGppWGx1WlJpcmpiUWJyeGxhZV1aaoNtc2JcZ19kbF9uVFtvTkhPZ2VcZ25xgGxaW2NzYFxjbHdkZV1dWmxsYm1qc3aHf3Fvf3x8dHiGeIWCfYCHdXmJgZKVfIiGdomBb3d5e4STcG18gXdeg390gW1pe3OUc2dzh3xykpGDmp+boIaHdnaUfm12k5d+iJGDio2afIuadn12cW9samF0fGdiaXV6Wl93fHptcX9lZGhoV52PXnFylrzDg3VxlImQfnKXjIack4yIc2uJj5aBe5SMgYSbjHyLhn18iYx/lIh1iYV2d32BcXWGgZ6UhpWPg4Jyf4h1hHyJmJ2Yh5OOnYCIZX2TgoCFg4mJcoF9Z36Le3h+f4eLjnxpgHyDdmZveHhzdnNsao2FioGKf3iBgISDf2tecnh6fo2KhXuCj4B+coBpeIOHi4aEeIN8gZeNkIx9bm17iX13dW9oZ3x2Y1xwYldvclNTbnNpYU5mdHhlYF1cWG6Ab3NZZWJdam1gcE9Za1FEU2dhWmtubXtvWltebWNaYm93ZGZcXWBsamNtanN2goNxbn57f3R1g3qDgnyBhXZ+iYGWkHiDinSBiHJ4eX6NkG9vfIFxaYF5en5tbXx2lWtqeIR0bJSNhZ6YoJmFiG59jHZqeJiOf4KKgpWXiXmOlm96c3BsamRgdHtoYGVxelphcn15Z3F6YWVlj7Gyd0piWqTZ0JZxe5CLkHh+lYuFmZGNhm9shpKSenmShoCEmIp8h394eImKhJaAb4uIcXR9eml5hYOlkYSTjYN/b36DdoR5hZuYk4uSkJSFh3B7koN9g4OJg26BeGiAhHhyf3+CioZ7ZX1+hHVkcHOAaHhwb3WYjYWCint2eICEeYFrXHF9coGIhYl9hol6iHKAbnGEh46EhXOEeICZjY2EeG5vf4R/d3tlaGp9cF9Zd1pYcW1OV3JzZ2BLbHZ0YF1bW1l0fXJvV2ddZmpxX29OV2hRP1lnX1twamd5cVtbWGtlWWNweV9oXF5lbWhmbGlxd3+Hb2x/fYB1cIF6f4F+gn92gYWJl4pxgo1xe4Z8eXmDk4x1anp/a29+dH99b3J8e5RvboB/eGeSioKhmZ2RgoZnh4NvZ3qViX5/hYGZioF8jYxpeHJrbGZfYW95bV9ib3lcZGuCemFxdl9lZtTqvooyOj6LjoByeYWIjo12g5eMfpKOjX9ubIWNjHZ9j3+FgpWJfIN4bnaGhIOXd2+IhWt1e3RmeYKDp4yDj4uEfW5/dHaDeYackIyQkZKMi4Z+e5KHeICEjYNsgHJpf354bXx7gYqDd2J5hIFxZHFofm10cXWBm4uAf4V+cnV9gHKBcFttfnR4ioOLe4eAfIh4enFsiIOPhItygXl/l4uLf3Rua3eAgHV1XGlod3BZV3xTWnBlTFpycmVbSnB3b1xaWllddH51aFliW2dmbmNpTFdmUT1eZlxddWVfdG9aWVRvZFlkcXlaaF5fZ21namxpcHd9jmxpgoR+eW6Ae32Bf4J6dYKBjZOFcICLbnh+gHp7iJKJf2h7fWp0e3KGe3N3fX+MeXiEfXxrjIyDm52WjIGAbI5+a2h+jox7fn+DlIJ/fYqIa3VxZ2hjW2Jncm9gYWx0YWhwiXlic3ReY2SboI9uXDVZr7V1aoCJfZKGdoWWhXOOi4p3cG2Fg4d1eYl4iX2TiHp/c2d2iH5+mG9xhn5odnltZXmIhKWHgIeNiX5ufnZ/gHyMmYeCk5CYiIuEiXyPiHF7fYR8aX5ta4B7eml6doGHgXJgd4F+cWRyZ3WCbXR7hZSRgXyBf253eXx0fm1Yb392dIyChneIdoKJenhzbomBj4GFcn59fpOJiXpubmpugoJ1blxnZnNxUVt7TlxwXE9bcnBkVktzeGpXWVlaYXGAdGBdXWBnZGhpZk5ZaE1AYWRbYHZhXHRsV1dTdGFaZG9yV2peYWhrZ21saXB3fJJraISJfHxwfn57gYCCeneAgIqLg3F7h29xd4N/e4mNj4Nqfntud3l2ind9eICCh3+Dfn56bYWMiJijjYSDe3WLeWtshIiReH17gZGAgH6Kg3BycGNmXllnX3BwYGBncGZqb4p0YXRvW2FkanZ7f76cpqPIuHGFhHOUfXiGk4JzkY2IcnJwhHuDdHWHdIh3lIh5eXFjd4Z6gJNpcoR2Znd2Y2p8g4iegn9/jo59cn5zhHmAkZCCeJaNlI+Igoh7iYlseXl/dWh7aWt/eXNpenaAgn1oYHeHfWprdGh7f2l2gYyQlH56fn5we3Z7dH5iVnd9cnOKhIJ8g3GGind4cHCDgo1/fXl+fXaOhoN2aXFpbYiCcnBdaGNzbkpldUxeblVUWXNuYlFPc3hhUlhYXWJwgnNbYV1oZWRjamRRWnBJRGRhW2NwXl13Z1RWVnddW2VuaFZrXmFqZ2Vvb2hwdnqSbmmIjHl9cnt+eIGBgXx2fYSIhoNwdoNybneCgn6Ji5N/cIB7d3l6gYx1g3h/gYGChHqAdW9+iYuanoh9hXp3hntndIWMkHp/f3uJhoR2j4Bnb25fZFxYZVltcmFgYXFsa2iJbmBzaVleZG2Ad6naqceGh7JxiXhwjXV7h4+AepOKgHV0dX53gHBxf22EdJSGeHVsYHqCeYiPZnGDb2d2blttfYCQk4CAeJKSfXh7bYd1gJCLhHSWipGOh4WFe3+FbHV2f21od2Vte3ZtanZ3f398YGJ4hnpodHVjfnpndIWOjJV7dH91cYB6fG1/WVZ0fm91hId/gHlsiIZ0eGt1f4OEfXt9eHtyi4F9c2d0ZW6LhG10W2pfdWRIbm5MW2JXVlV4bWJQU3R2WFBVWF5hcYRvXGBjbWVjXm5iVFxyR0JmX11maF1aemJRVVx1W1tna2FWal9gbmZma3FocHV4jnRrjo11f3Z4fneBg4F7dH6EiIeDb3F/dHF1foWCiY2Ke3d/eIN8fIWHeId8fYF+hIB7fnN2eYyOn42Jeol2dIN5Xn2FmYx5hoN0hYaFd4l7Ym5sW2JbW2FWanNjYFxnbm9mh3FhcWZXXWNrf3zKzoi5omptbYpscYRyfIWKf3uRhXp5dHl1dXtqbHVjhHWRgndwZ159gnqLiWVygmtqcWNYbHuGnIiCgXOXlHd+e26IcYGKi4dxl46QiIWLg3t5fnFxb31maHJibnhxamtxd3x8eVxleYB3aXV4ZoJ2Z3SHi42UfHKGaW9+gHlufF1Ycn9tdICLfIJvb4l/cXZod3+Bf4F2fXF6dId8enJmc2FujIJsc1hrX3dbSW5rTVZVXlRVe2thT1R1clFRVFZeYnSFaFxgbGpmY1luYVhicEdBaF1gZl9dVXteT1ZkcFlbamhdV2hgX3Jma2hyZ3Byd4Z4bpWKdH96eH55goiAdXOAhoWNgnBwe3h3dXmGhoaLhnp8f3WLfn2FhISHf35+fYd/fHh2eXeSk59/jHyLbXaAeWODh5eGc5KLb4WFgXqDdGNuallfW11dVGdzZWBZZHJyZoFzYmtlV1tgaX93vq57oLdtYnOGaHR8cnqDhnt9jH94eHN2b3t2ZWpuYId1joFzamJefnh5i4RmcX5oamtaVm94iqSBhX9xmZNxgHh1gm2AgpGHc5WIjIeEiIV9eHRybmh5YGptYG12a2dqa3l3endbZ318eGVyfW6EdGV1hYyGlX9vi2ZreoN1bXRiXG98a3V8jHyBZnWHfW1xZ3V+eH5/cn1senqBenhwZmxibop+bW5Wa2B3VUpqa09STmhOWXxoYk5VdmpMUFRVX2d2g2ZdYHFoZ2FXaV1ba2hKRWtaYmRXWVV5Wk5WbWpZXWxlXFplY150Zm1kcWdyb3WBd3CZhXZ/fnd/fIWHfXVzgoh/lYJuc3h6enNzhYeIiIR5gX12j398hImOhIKEe36Lg3t3fHd3mp2XeoqDhml3fXxsg4STgHKPgnGFgn6Bf29mbGZXXVtcW1RkcWVfWGNzdWl1cGVlY1dcXGiAcG9ygHSJZWV4fml0dnNzg4V4gIR5d3R1bmt7cGFna2eGdI2EbmZdX31we4l+aW13ZmlkVVdycI2mfIR8dpaQc3tzfHpue3uQhXaYfIeGg4aDfHRwcmxndVxtaF9sdGRnZml6b3tyWWeBd3RncIB3gnVid4WKfJSAbotqbXqBcWZzZWBtemdzd4p8fmJ1g3Zpa3F0enB5eXN9Zn5/f3l3bmNmYm6GfG1rVmpicFNLaWtPTE5wR157ZmFNVXRjSk5TV2Fqdn5lXGdzaWZgVmNXYnBdTEtrWGNhVVRVc1ZMWHVkWl9rYVxbY2Vfd2ZtYnBpc25yf3R0moF3f4B3f36GhXp9dYKEfpeFbnJ0e3p1cYSFj4GAeot1dJGAfYGUjoCFhH1+jIZ7foB2e6OlinmIhYRsdXx7dYOCjHpuhXN6hH2Bg3VuamhlVl1bWlpUYm5kW1hic3tpaG1pYGJXX1ppgGprb4BobGFoeXhrdHR0boWBe399dnVtemhqeWpfZW5ogXaPhGdlWGJ3aX6He29pb2dmXVVYb2iPp3aBenyQjnl1b35vc3V5j4B3lXSFgn+FiHZqcnZnaG5bbGRdbHNfZ2FpeGh7bVptgnJzaW+Afnl3YXeEhHiPhHKIcW95f3JjcWhcb3dkcXOIfHhic4BwZ2p4c3JseHd1d2SDe393dm9kZGNufH1rbFVpYmZTS21oT0dSa0VheGdhTVNxXUlNVFlla3d7ZV5tcWlkXVZfVW5uV0tUaFhmXlhOVWxUSlx5X1tfa11dWmJlYHpobGFvb3Vub3d1eph9d4CBeoB/h4Z6eHqDfoGThHF0dH56dnSFiJB9gH2QbHOVgXyDn4V/h32AfoaCgIp7doSsn396iIeEbHKCenaAgIF1bodvfH9ziYBqb21kZFhfWllaVWJqZ1taXnWBaV5ubFxiVlxca4FmcnR9aWpda3Z2Z3R3cW2Fe319eXZybHpoaXhmXWRzaHp3koFjY1RlcGeChXd3ZmhqYFdWWWhkkKdufniAi456cHB8Znlveox7do5xhH1+f4ZuZHZzZGhoXGtiXW9vW2dfbHVkemhddIBvcmtxe311dWJ0hYp6h4Z/f3dydX91YXBsWXF0YnFyhXx1ZHJ/bGFsem9qaXp4dXJmhXV6enVwZGFkbnN+aWxUaV5dVEtzY1FHVmFHYnZmYUtUb1dKTFhYZ2x2emRlbnFmY1pXXVh2ZVRKXGNYaFhZSVdlUUhieFpdX2xbXlxhZF5/aWpgb3R4bW9udoOYeXKBgHx/iIuGfXV2hniHjH10dXWCeHp6goyOfX6EiWp0l4F7i519foV6gXp+fIaIc3GProx7e4aQfmZyiHp0fHx2cm+GbHt+bI96YnBvYmVdZVZZWVdkZmtgXVxzhWhYcW5aXldaXGx7Y3B3dmxiW21zdGd1dXBthHh+gHl3bm50ZWl0ZVtndWZ2dpF6X11SZWZqgoJ0fWJjaVxUWF5iY5ClaHl0goWQeG1ueWd4bXyFe3WIcoB4fHh/aGV2bWBmYF5qX11za1llXW9vYnplW3d7a25ucHd4c3RkcoOSfoeCiHp2b3J9cmJ4ZFtvcGJxcYJ8c2ZxgGRebnZpZGd5enRub4F1dH1zcWJfZm5vfWRqU2hYWVRNd19RSllZSGJ0ZGFJVG1TSUxaV2lscntibGxzY2FaWlthdltTS2RdWGlTV0dZYE5HaXVYXmFtW1tfYmJdhWhoYW54eWxuanaBkHlug36AgZKIhIF2dIl0jIZ0cnd2gXd8fX6Mj4B+k35weJaDfZmSeYCAeHl9f3SIg3NwmaJ7en+JlXlkdYh5c3h1bHRvfmx5fHCRcl5wb2BnYmxUW1pXaGNtZlxccYhlUnJuW1pYWGBsd2RpdWpqXlptc3FtdHN0aoV8fn98d25ubGRpcWNbanJkdHaPc1tXU2RhcoB/coJdYmNdU1pgW2OTn2VycYWEkXRsanlsb3B6fHtxgHd/cnp6emRmdmddYlphZ1ted2hXYl5vaGF3YFt7dmppcm53c3N0aHCBlIKGfoR2cmpwfG1md1dca21icXOBenNmb35bYG9xYl9qcX1sbHR+c3F4a3BhXGVsbHphZ1NnVVdSUHZbUlBZUkljc2JgR1VqUEhPWlZrbGt8Zm1vcWFcWlhZbHBXUlBmV1dpU1RGWlxPSHJ1WF9jbWNYYWBhXYtqY2RteXhrbml1eYZ7a4N9gISZfIKEeX2Ibo+GcW93enx0goJ8i4+DgpZ0eIKUhYGfiXWAgIFzf4Fwh4J1b6KXdHuGi4d7ZniLb257b2Z4cHpsc3ZyjGtedG5hZ2VrUl1bVmdibGxaXHGMZE9vbl1WWFVnanRoYnRlZV1abnVucXV1eWuHfH98iHeQc2Rka25hXG5tY3N4h2taVFZiY3h9fXGFXWNfY1RbYFljlpVjbnCDhYpzamh6bmVzdnN8bHp0dW96fnVfZnJjW15WYmRYYXVlVV9gbWRhcV1dfnBoaXNxc3B1dWtthJOBiHuEcXJmbn1wcm9TW2ZqZnF0gXdzYmx2VWJxaltfbmV8ZW12fHNyc2ptYFpkamp3XmZUZFVWUFRtV1FXU1BIZXJfYUZYaU5IWFRWbmlkfGlreGtiV1xVW3RkU1JXaFFZZlRTSFpaUE14d1tfZWxpWmJgXl6PbmJma3l1bm9odnZ/f2yDgH2Gl3t/iIGKf2uTiHJndIB7dYCDfYiOf4uTcn2KkYWHn4Z7f4aMc4CGc32Ddm6ljHOBjYt3eG56jGBkfHBmenN5bG1xdoJnZHtsY2ZnaFNeXlRnYGxvW15ujWhOam1gVFZTb2d0a2V4ZGVdWXB0bXJ6eHNtiHuAdpx7emthZWxtXmBvamVweX5nWlZYYGt4fHtwhF9iXmdWWWBXZJyIYmtxgYd9d2treGxbdnFseml2c25ve4ByWGpuX1ldVWFjV2RxY1NeYWliYmxaYH5sZmtzdW5td3ZraIWMf4h6h21xZnB8bXJtY1lgaGlvdIF0cl5pbFJlcWRUYm5iemNxdnt1a3Bta19YYWdodFxlVmFWU05YZVJPXE9PSGVwXWNGWWlNSV9LWG1kYHhobn5kYFVeVF10W1RSYGZOXWFUU0pcWVBZdXZdX2ZtaFhjYVtejnBjZ2p3cXNtaHZ0eoNzgYN6iI1+fIqHjnpukIp0bHOCdH9/iIWGkYSVj3p9jI+IkZuEgHyMhHN/gXN0eHFuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Njo6Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6Ojo+Pj46OjY6Ojo6Ojo6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHx9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPi4xMTExL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERFQjEvLzAwMC8+RERERERDWGhnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI8tGh0dHRwaaIWCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTUzHx0dHRwcHC43NTU1NTRNYV9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmHh4iIiIeOkJCQkJCQjIeHiIeHh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhoWDg4OEhISEhYWGhYWFhYeJiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkZKRiYeOipCSk5CJkI+MjoWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6Ojo6Ojo+Pj4+Ojo6Ojo6OjY2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjIiHh4iNiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCRjYaFho+JjJCPj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkI+Hi4eIjIiOj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjISLh4aMiI+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiIuMi42Mjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpKSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHV2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoZ21namdoZWhnY2JiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpeXVlZXmJhXl5aWV9bWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVBRUVFRUlZWUlFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUU9OTU9PT05PUFBRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLSk5JTk5MTU9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NFU0JVUEhLT0tJSUpISEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7Pj48RUQ9P0ZZQ1tWPkVFR0dHR0JERERGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs7PDxITD09Q11EXmE+QURERkNGRkRGSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dXNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozw+PTpDYD5ca0NBQj9BQENGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6OjY5Ojk5OkZnQFxtPzk4PDw9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PT0/RDs+PT47RmlLXG0+Ojw+PT8/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5AQT9AO11wQj5ERj9NZFhdZT49PTs8Pj5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0ZEPjw8PUA9ODo6bndKNzw5RVpjYGBkSTs8PUQ6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUBbUTw8PUxQSUh2d083ODlUaG1naGxgQTtOUTk7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNARXV5SDxhgYSAent3XEY9QWVydGxtcm1PRmZPOj0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUFJc3lrZoSEg4KDgH1gWFFGYnFycW91cWBgaUpAQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEdwdH2CgoGDfn2EdEpTZlhhcXJ0dnx0a21jSUpJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWlzfYF8f4R+eYZxQkhkbWx2gYaHh4R0a1ZJTUxOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHuAf3iAhIWDhIptQE9zgYWHh4eHiIZnSkxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExOW3yCg4SDhYeFh4JWbISHh4eGh4iJiHxRS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSUhISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpWgoSEhIKChoaFg4KFhYWFhoaGh4iGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJAQUNDQkBBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWaFhISEf4CDg4KDhISFhYaHiIiIiImLjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODg7Ozs9QDs5OTk9PD47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaoaEhIF+gYODg4KDhIaJiouLi4qJiouMiVQ7ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JmhYOBgIGDg4ODg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6OTo6Ojs4OTg5ODc3Nzk6OTg4Njg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXd5e3p7fH1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PXKEgIGDhISEhISGiYqKiIeIiImKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8PDk6PDg6Ojs6OTk5PD88PUFCRElKTUtJS0xXb3JzdXR1eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7Pz5IfoSCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUFCPkBCQEA+PT4+QD8/P0A/QD09P0I/QUE/QT89QEBAPj9BPT48Ozo7OTk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlKDgoKEhYSFhIaJiYiIhoaGh4iJiouLi4qKi4qLXj5ER0lLSklGR0dERkhHRUJBQENFQ0NBQkNCP0BESEVDRURFRUFGRUZERUZEQEI/PEA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0NGWIWCg4SFhoaGiImJiIeGhoaHiYmKi4yNjIyLioqIV0hMTU1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E/QkJHR0pZhYKDhYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSklJSEpGREdISElFRUhGRkVMTE1JSkdHSElKT01OTExOS0dHR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0VHRz08QEA4ODw7PD06P0E+QEBDRklKUWCCg4WEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSEhFSklESkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJR0NCQUNVbnB1d3d5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6PDg9Pjs9QT4/QEVISkxXcoOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIuLi4tfUlJQTU5NS0pHRkJHSkdMSkZLT0xLSkpNTUxPUE5ISUtMT1FRUVFPT0pJSkpMSkxGR0hHRUdJRkVFQkBCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBSEtMUFd5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKREVGS09OT1dWUVBPUVNSTVNUT01TTFBTVVdSU1FQTEpNTU1LTkdHSkZGSEpEREVFQkRDY3B1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9DQkZWTkZPUFBUWXyGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMj4uLi2dWVWthRVJRUVBJOztRU1JgdV1VVlRWWVlSWVhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLSEhKSEVGSUhJSElpcnZ5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklJR0dGRT8/QUFFQkNHRURFTFhSTVRWVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1E/QFZVWVxkYFZZYnJeXVZdWlZFUVlaW1lfVFpnUlVWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNTWFpaXFx5hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSVFJWVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSVlYWVtdWFhZV1JRTlBRTU1PU1FRVVJhc3N2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUlGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNVVFdSUVdWY5aAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ1xbXF1dV1JPU1BQUVZWVlZZWm5ydHd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlRTVF5aWFdXV3prWFpbXF5UUVFQSU5PV1ZYWlpkcXN2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVRST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTU5LTUtISkRGSEVDPlNjVX9SUVFOS1JUUU1PWVFNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXG1ydXZ1c3N3e3p7e3t9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJWVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz9DQ0NDQj9EUEJEQEM+QkhHVkBITk1HXWlRSEZPRkRFRkhHSEJDSEdIS0dDQkFEQE9QTVNkc3R1dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiW1hTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFNPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz8/Ozs+QEA/Pz5rUUthRUZISUVCP0dMTUdNUVVJQkU/Pjw9PD09Pz0/QUNDPz48PUI+Sk1GVW51dXVzdHZ4enx6fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXklKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXt4enx8eHd4ZEJAQEI9OkJDQUFEQlxdT3tOT09OS0xNT09RTEtMV01IR0BCPDk3NzU5OT07Ozs4OTg5PztCSD9cdHR1dnV2eHp8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eYGVgXV5xdmteYGdrd29vbGpvbm5sZmJYR0ZGSEJBR0lFRUZETVJQYVdSWFFQU1NSVVtPT1FXUE1KQ0Y+Ojo2NDg3OTc5OjM2Njc5NTxCPWVzc3Z3d3l6e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01MVFRTUVFVT0xSU1RXWFRUWFFMWFlaVlhYVlhZXVdXWGhza11WYXNrYWFfXWRhX15ZVVBNT05MSEhKS0lIRkNRUFNaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1OTlHbnF0d3h6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTFBSUk9NTU5OTkxKRlBQVVlTVE5KT09UU1RcVlJVU1JPTUtJSEhGPz89Ojc4NzY1OTk2NzY2NVdwcHN3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9JR09QT09NUkpPUFBQTk5PVExNSVBPU1RVMjxYTUlBUT1jYVFTUVBOUFFQTk5NUE5UUlBSTUlMS09RUFFSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjQ1NjY7ZXBxdHd4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkZBRkdHSEZKREhKSEdFSExIS0hGTE1QTUcvRV9SPjNAPmpvYVJSUUBGVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3NkRucXR2eXt7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRUZISk5LRUdDT1JDOEVOU11mU1FTQUdVUE9RUVBNTU5MSkxLTE5PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5VHFzdXl7e3t9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUV1dVTExLSD05ODc7P0A+PD1BQEI9PkVIR0RGRklHSkpARkFBQEZIRUpPSFBSYVxRUFJOU09PUExMT01LTUxNT05bV0tNUU9HSUhDSUpMTEtGRkZEP0JDPjxCRj9CP0FkcXV4e3p7e3x7enp3fHd5fX57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj47P0JAQD5BRElFQ0hHSUdJRUJCPz49Q0JBR0lETU9iZVFNT05XS0xNS0xNTUxMS05OU2RNSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES29wd3p5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEtFP0I9OTk5Oj9CPzxAQkJBREVHS0ZESUlHR0hDQz9CPz9AQT5DRUNLTlFUTEpJTVRGSUlKTEpLS0lJTE1PUFJQS0dDS0dDQkpKTE1PTUlKSUdDQ0NESUpNTElac214eXh6e3t5fHZycHVydHl5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxanFoZXFIS0RHSEhHSktJSktER0I9Pj06Ojo7QEI/PUJCQ0NHRkpMSkVJSUZHSENDO0FAQj5AQENFRElNUEdJS0dIS0RISUtNSEpMSEhKTEtNXVJJSERNRkFES0tOTVBOS01KS0ZHR0pNTlFOTGNuaXZ2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkb0ZLREZFR0RFRUdFR0JDQD48PTo7OjpAREA+QkNERUlGSkpMRklJR0ZGREI7QkNDPkBDQ0NFR0xOSEtOSERIRUlMTk1ISUxHRUZJSUxOS0pIRU5IQ0dNTE9NT01OTk1MSUhKT1JRUk5SZmdmcm9zeHV7enxsaGpuZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pERkZFQkJCRUBEQj4/Pjo7Oz06PT5DQT9BQ0VHSkZJSUxIR0dHRkVDQD1FRUI+QkRDQ0VHSElHTVBKRkZHS05PS0ZISkZFREVJSUhLSUZIUEtESU1MUE1PTk9PTkpKSU1SVVRST1dkYGFtZ3Byb3J5emdlaGhjaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NCQUJEPEJBPkE9Ojo9Pzs+PkBCP0BCREdLRklHSUhGRkdFQ0JBQUZGQ0JDQkRFREdHSEZMUUxJT0pKTEtJR0hFRkVEQ0lISEtKR0tSTUJOT01RT09PTk9PS0tLUFVXVlVUWGBeXGlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNxcmprc01HR0ZIQkJAREU8QUFAQzw4OT0+OT88P0I/QEBERkhFSEZGR0ZFRURDRUNESUZDRkVCRUdFRUZHRUpNS0hRTUpLSEhJRUZISUVDSUlKS01LT1NORFFSUFFSTk9NTlBNTE5TV1ZXWFZYXVpdZGBoYmppZ2tfZWVnY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaW96TUhHSEhCQkJGRTxAQkJEPDc6PT46PjpAQj4/P0NFRkRGRERHRUNFQ0RFRkdKRUVJR0NHSEZIRkVDRkpKR01KTEtJSkxGSUlLSEVLS0xNTk9SVE9JU1VUUVNQUU1OUU5NUVdaVlpZVlpdWlhhYGBgXmhlY2BkZWhnamloamZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN0bnByc3lOSUhHSURBQ0hFPEBFQkU9ODo+Pj08PEFCPD8+QUJGQ0VCQ0hEQ0VFRkdHR0lGR0tIQ0hIR0lHRkRIS0lHS0hNS0pLTEhMS01LSU1MT05PUlVWT0tVVlRRVFFSTE9RUE9UWVpZXFpZW15fXmBiXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZxdU1JS0hKRUJFR0U8QEdEREA6PD5APz4/Q0I8QD5BQUZDRURESERGREdFSEhGSEdJS0pGSkhIS0hGRkxISEhKR0xMTExMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUlFMT1NSUVZbW11eW1xeX19hYGFkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm92SktMSkxHQkVERTxARkREQjs/P0FAQEBEQT9CP0FDSEJGRUZHRUlFRkRJSUdJSEpNSEhKSklMSkZKS0hJSkpHS0tNTUpKTkxOTk5PS09QUlVYVk1OVFZVU1JRUExOVFNSV1teXl9dXWBfYWFhYGJjZWFjaGJkaWpndotsa2lnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2b3dKTUxMTUdEREFEPD9FRUVDPUFBQ0JCQ0VCQkRBQUVHQ0hISEdGSkZDR0lHR0pGSUxISkpNS01MR0tJSExLTlFLUlFMU01LTk5PUFBPVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5gYl5gZWFhYmduaGJpaGhteHZsaGptb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xNTExMR0VBQEQ+PkRFRkNAQ0FFRERGQ0NFR0NDSUZDSEpKSUlLRkRLSkdISklJS0dKSk5LTkxJTEhKTUtaZkpkXEtsU0hPTl9uVWtzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVGB3dWlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5S05KS0pGQz9AQj89REVGRENEQkVFRUZCRkZIQ0RKRUVKTE1LTE1HR01JSElLSEtKSUtKTkxNTUxMSUxNTFtzYmRwXmxtVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1Kcnl2a2Jga2VlbXlta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0JCPz1DRkdCRkNFREVFRENISEdERUtHR0xNTUtNTUdKTkhKS0pJTEtKSktNTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW92XFlsUVxtbVpxbWtvbXh4dHNpcFxfcmtxalV1eXhwY15rZmJncXBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hFRUVCQkI9P0BGR0JHRElFRURCRklISEVHS0pHTU1OTE1OSExNSUxLSEpNSUtKSktPUE9OTUtOTUxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHRUZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdoYWRqdXlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR3SU1HSURFRUNBQjxCQUJGREdGTEhFQ0NIS0hIRkpMTEZOS0xTUkxITExITkpJSE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF5uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2diYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRIS0hJQkVFRUFAPkNDQkdDSElNSUZDRkpMSUdGSk1MRk9KS1dSS0dLSkpOSUhKTElLSklISk1NTU1JS0tLU2tiWmleX2pjcnJaX1lqb19lZVVrX2NbYWJRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRklERURGQUBBRURER0JISkxIRkRHS0xJRUZKT0xJT0lMW1FKRkhIS01JSEpKS0tJSElHS0tMS0ZIS0tMTExLSUtMTlRbXFRQVExQT05PT1ZRT09RT09RSklOUFFkcWlUWVdbW1xVWVpdWF1cXGNmYWFmYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzSENFR0ZGQUVDP0NHQ0VHQ0lLTEhGREdLTEhER0hQS0xPS0xXTElFRUhJSkhJS0lMSkhGSEdKR0hJRUZMSUlLTkxJT1xXXk9cW2BeT1hZU1xcYl5NWVpNWGFSSllhWlNgZFxhWFtkZFZWWFxZWlhcVllcXWJfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRElER0dGS0pLSEVFSkpKR0VISFBKTU1KTVNJSEZBR0ZKSUtLSUxKSUZFSkdERkdFRUpIQ0pNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOXlxeU1teY15aXWBjYFlfYltgXltUWFhZXl1jY2JhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklJREZLS0tGRklKTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRENDRUFGSkRASkxKT1tjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV5eY2FgYmJiY2NlWlFZVlVcWV5kYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLR0NHRUJFR0hGR0hJRkdKR0hGSEtJTERES0tOTUxMSEpKSEpHP0dGTkpLS01LS0tJR0dDREBEQUhJQT9JSkhPXWFaW2RdX1RRU1hdXFxcX1pLV1xMUlxZSU1eUE9cX2FjZGNjYlxkY2JkY2ZYUVVUU1tYWmFeXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSUZGR0hHR0lGRkZJTEpORURLSkxOSkxJS0pISUdCSEhRTUtLT01LS0lIR0VEP0VDSEhBQUdGRVRdWV5YX1lfW11VWFhQXV1RS0pXXlheW11WWmBSUV9fYmJhYGJiYGNiYmRkYlhPUVFSW1NbXl1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSENSS0ZISEhFRktKTVBFR0lKS05MTElMS0lJSERIS1FPTU1QTE1LS0hJQ0RBRURIR0JBR0VDV1VFXFRdU1ZfWE5UVU5aW01KS1VgYVtfWF9eYV1PWWJdYGBfYmNiXWJiV19fVFBOUFFYUl1cW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREVGR0RJUmJQRFdfSUdHSERGTUpQUEZKSUpLTkxLS0xLSkpHRUpNUVFOTk9NTkxOSEtBREFDREZEQ0FFRkJNSENMTFBPT0xGTUZHSUpIR0xMTU9QSUxPUFBTUExQVFNVWllXWVhYZFZPU1RQUE9OUFVUXFlZWl1cYGFkZWNnY2tscHNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHSFlNR0hKSEdOTFFRSUtLS0tOTlVOT0tLTEdHS1BTU05QT05PTk9IS0VgRURfTERmY0VNW0lfXHNtT01WbVlMQ1BgVWxXZ0pdV1VeRExRVUxNVFZRU1RYV1RYVVRcVFBmWmhoZFhTa1RXVlVbXFtgYGFiYmJgZmhmbmxocnp8fX6BhISEg4ODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09TSUtHYFRISk9KSU9NUlFLTEtMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUH9RSXxZWXJzV1BtSHFucGFWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbYFZVV39qdHV1X2B3YFhhXFxmW19hYWFhXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEZKTEZSVkxLTklLUlhXUU5OTkxRVE5PUVBLTE9HTVBTW1pUUVJPUFBQSkhaeF1UeGVoWVJUUXZndGxwYm5malFyT013bWpycHNycXJwb3CBXWZ6dXhxcXpxfnN9a3V9YlJnfGVzc29zc3x9b315b39yX2BgYmJaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpQTk1NSk5WXllVTFFTTlhaTFNTUk5MUElRUlRZV1dQVFBQUFFLR2Z4bGN4cm1aS0xVeXB1bXVibnZQZGVJZnZxbXdvgGpmeHhpWHNSaXttaWp6en1seHp/b2dvWHZ2anV1cIBgc2h8aWx4fG9eX19jYlpdYmRnaWplZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3V6bnx9eXhybk5LU3ROQ0JFUFBISktKTFBPT1BNUFpgWlhLVFdQYV5SVlFZU01QSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRpYlduTHFwXkZoeVd2VExoeH14YHl7c25hXm1vZFJncnVubXlwd2x2dHRxbG1cdH56a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGZlXmFiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0cm9tTExbVkhHRUdSUEpMTUtMUVFRUVBRV1xZVU5WWVVmWFJSWV5UTU5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZWWGxPbmx7c2FqZ392VUtXa2h9bG1seGBbcHp7XmB6c2Nyb3hxaGV8aXJ7XVRLbGB2dWtpdXt7bX54a3xwXV5eYlteYmRkZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtobW1yfGttaGt7dG1ta21PSEpLSElJSFJRTE5PTUxUU1NPVFJXUlZUUFdaVlZUVFRhYFFPTktUU1NRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFhRTlBVVFhYWFtbVVJTV1tXWFdaT1NVV1dYUl1ZV11WVE9ZUldXV1hZX1tncl5bW1lcXV9jWl9jY2RmZGNjYlpjY2ZmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0xMTUtKU1FNUVBPTFZWVFBUVVhVWVVSWl1WVVRXVVlYUE9MTVZUUU5VU05PTUxRUEtKUVJLUU1LS09SVFJRUVNTSUhMTk9RUlFRUVRWUlhXXFdTU1FSVVVWU1pRT1NSV1VUWVZUWVVUUlVUVFRXWFddWl5hXVxaWlxcYGNcXWJjZGdlZWRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkY2ZoUEpLTE9PTE1UUE5TUVFNWFhVVFVXV1daVlRcYFZXVllVWFRRUEtPV1NQTlVQTlFOS1NQTU9VVE5RTk1OUVNQVFFTVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXV1dZW1RPVFVYVVRZVVdZVVJSWFZVV1tZWl9dVVhfXV5dXF1hYV5bYmJjaGZlZGJYX2BiXWBoZWZkYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FbWlhXWFpaWFlWXWpkVlhZWldWVFRPS09WVFBPVFBQUE5NUVFQUlhUUlFPTU9TVU9XUlRVVU9OTVFTVVVUVFJUWFZaXVxaVlZRUldYVltbV1FUVlZVVlhUV1dUU1JYVlVaXVldX15WXl1eYFxcYGBfX1piYmRoaGVkYVliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZGJkX19gXFBNTk5SUU1SUk9TVFFQVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST0xQU1JVWlVUUFBMUFdWUldTU1NYTU9QUlRYVVVVU1VZWFteXVxbVlJPVVZWW1tXUVRXVVdYVlRYWlRTUVpXVlxeWl9fYFVhXGBhXWBiX1xgXWNhY2doZGZgWWNgYV9fZWVfYGNbWlxbXFpaWVlXXFlcW2BeYFteXmFgX2JcWWBaUU5PTlZRUFRST1VUU1BXXFxcWF5cX1dcXmpxd3mAY1xbVlZYUk5PV1NOUVFQUlRSS1FUVFlaV1VPUk5TWFZUU1RSUlpPUVNTVltWVldUVlpYXV5cXF5WU05UVVZcXFZSVFZWWFlTVFlcVFJSXFdaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZmlkZl5bZGBhYGFjZV9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFtdXl1bYFxgVVxdaWpyfXNsZ1xVWVdRT1JbU1JRVFJUVVRLUVdWW1laU09TUlZWVVNPVlJTWlJUVVRYXFdYWFNYXFheXVlaXVRVTlZXV15bWFFUVVhZWVVXWVtUU1ZdWV1dYF1iY15ZYFtlYl9kZF5eY2NhXWVmaWRmXV5kYWBhYmNkX2JeWFpfW1xbWFhYWFdbWlxgXVtbXFtYWlteVl5ZXVBPT1JaUFpVVVZWVFRUXl5gXl5iXGFVXV5ia3l0bH1sWlVaVVFRU1xUVVRVVFZZV0xSWlZdW1xST1VTWFdWU1BYUlNXU1dWVVtdWFtZVVpeWF9eWVxZUldSWVhZX1paU1RWWllaVlhZXFZVWl1cXmFhX2RkXV5dXWVhYmZkXl5kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVpXVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXWBemhYWVpUVlNWXFhXV1ZWV11YUFVcWV5dXVRSWFJXVlRSVFhSU1ZUWVhZXV5YXVtVXl9YX19YXVZRWVRZWlphWVxVVlhbWlpYWVlaWFZdXl9eY2JhZWVdYlxgZmJkZmRfX2RiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlNaVlNcVFZXWVdWXGBhYmNhZF9fVltgZGFfenVvaFlcWlZYVVdbWllcWVhZYFdQVV5bYGFcVFVYUFVWVVNWVlJTVVdbWlxfXlpfXFZfX1pdXlleVlNZV1laXWJaXlZXW1xbXFtbWVtZWV5fYGBkYmNlZWJkWmJmY2dmZV5hYmBjXmNjaWRkZ19nXmJiY2FhYF5fWFRaWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNQVlpWVlpVWFZYV1hdX2JhZGFkYV5ZWWFkYmBsZmheXF1bV1hYWVxcXF9bWVtiVlRXXl1hY1xSVlhRV1ZWVlZWU1ZUWFxcX2BgXWBdV2FeW15cW15YVlhYW1tfYFxfWFldXF1dXlxaXFhbX2FeYGRjZGZmZmJZY2VlaGdkXmNgX2VjXWZpZGVpX2deY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9cXF1YV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBYV1hZWVdWWFZdXV5gYWFfYl5ZYV1dXlldXllYVldbXGBfXV9ZWV5dXl5hXFtaWVxfYl9iZGNlZmVmYlpkZmdpZ2NfY15hZmRaaWliZmljZV5iYmNhYGBfXV1aV1tZWVhYWlhXWltaWVdYVlVbXV1dYGBiYnhMV1dcWVddXFxdWldcXV9gYmRiYmFdYFhiY2JgY2FiXlxcXFhXW11fXWBfXVtgZFxcWFpjZWNgUlxZT1hXWVtaWVhaWWBdYGJiYGFjX1xiXV9dW15eWllVWF1dX2BfX1taXl5gYmNcXFdbXWBiYWNlZGdlZWZkXGVmaGlmY2JiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVtZXFlYV1hZWFdcW1pXV1hQWFpdYWNmZnJrf0pZV11aWl9dXF5cWV1bXl9hY2JhYV1iW2JkYmBjY2JdXFtaV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pRWVdcXVxbWltbY2BjYmNgYmRhYGNeYFxdXl9aWFZbX15dYWFfXVtgYWJlYl9dU1xfYGNkZGZkZ2ZlZmVeZWZoaGdkZGBbZmdeYWhoY2hoZmNgYmBjYl9fX11dXFpbWVhYWFZaVlxaWlZWVU1YV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WDgYODgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3x7e3t7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7fHx8e3t7fHx8e3t7e3t6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmJiY2NjY2NjY2LiYmJiYmGs9bS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyMkJCQkJCQkI2MjIyMjIi/6eXl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eHh4d3h3d3d3d3d3eHl5eXl5eXdvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH19fX19fX19fHx8fHx8e4GEhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ1dXV5dnZ2ent4e3h3dnh7eHl6en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t6enp6e3t7e3t7enp6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx8fXp5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3eX1+fXl7enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3d8enx8enx5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en57fX16fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5fHp6e3l5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh4eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3t5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8e358fX5+fn5+fn1/f398fH2Ag4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAf35/gYCAgH+AgYGAf3+AgX9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35+gH9/gICEf4OBfn9/fn5+fX5/f35/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5/f4x+jYV+f39/fn5+f4CAf4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GCgYGAgH+Bl4KUjH5/gIF/f39/gIGAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChISCgoaehpeUgIKBgYKCgoOCg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYCBg4GCiqGImZqHh4aGhoaHiIeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OCg4WEg4GBgYGLo4qanImGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4OCgI2jiZeciISEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4KCgoKBjaOPlpmEgoOBgYGBgH6BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgYSOhIGAgIWfpqmol4KCgYOGg39/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKEhIKDipeJhIOEmK2nq6ygjoGChJCEgYGAgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KFhoSEg4ODgoSOmY+FhYmloZmlo5ueiYKUlYSDgoGBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgY+Mg4F/fn18fY2dmZOEiJ+UkJ+clJ2Vkp6OgoOBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiISEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+BlpeJgH19fX58gpeToZ2Mk5KNmJqUmaGhm4eBgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqHg4ODhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICWn4t+f4B9h4t/hIaVqKWfkpGVj4mVoJ2ZhIKCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZKgioCMhX2GiIGAhomcoaKQg39+foKWnZGCg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDipCChIqFg4KBf3+DiI+PhoB/f4CAf4KOhoODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIGCgoGIgX+AgH+Ggn9/gICAgICAgICDhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoaGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAgIWFf39/f4CAgICAgICAgICBf3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4OBgICBjIiBgIGCgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYmLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+QjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCAgISEgoKCgoKCgoB/fn19fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEhIGOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWCgIGDhIKDgoKCg4F+fX5+fn5+fn59fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeGiYmDg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaEgoKDhIKDg4SCgYGBgYGDg4SDg5GSkI6PjouHhIaGg4KBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKChISDg4ODgoKBfXx9f4B+fn5+fXx9fXx5fIOGh4eEg4GDg4SFhYWDg4WEhISEhISFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4J/f4GDg4ODg4KCf319f4CAgX99fn59fH19e3p6foSEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYOEgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY+Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn2AgoODgoOCg4J9fX5/gICBgH59fX19fn18enp6gIKCgX9/f39+f3+Afn2Af3+AgIF/gICBf3+AgYF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDg4OEhYCAf3x9fX59fX6AgH99f359foGDg4KCgoGBf319fn+AgIB/fn19fXx7e3t6enl6gICAfn9/fn59fn9+f4B/fn9/gH+AgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhISCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7gIB/f39/fn5+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn59fHx9hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gYCAgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXt6enl5eXmAgoKChIOBgoOBf4GAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCg4GBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjISDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDgoODgoODgoKCgoODgoKSkIuIiYeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaGh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhYSDg4SDhYSEiJKOjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgYGDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWBhJKSjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn5+gIJ8fH9/goCCgH58e4qCfYB/foGAgICCgYKAgIGBgH+LlI+Mi46OjYiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIJ/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSRjIyNjo6KhYaHhYSEhYODg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2MjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKNjIyPjYuKhoSGhISDg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gH9+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX+AgIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaFgoSDgn+Afn+CgoJ/f4KCf4CKj4yMi42Mi4iEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gH+BgYB/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4WBhJGOjIuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/gH9/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fH18fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+f3+AgIOHiYmJiomKiYWIkY2LiImHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn19fX19fH19fXx9fnx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+goWIh4iKi4uLiY2Rjo2JiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEg4GAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjpCNi4iIhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiOjYqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fHx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICAg4F/gIGEgX5+gH9+foB+fX5+gIB/gX5/gH9/f4B/fX9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHt8fHt7e3x7fHx8fXyKioiIhYWFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CCgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgYB9f39/gICBgICAf358fX19fX5+fYJ9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx6fHt8fYmGhoWFh4WFhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIKAfn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4KEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYWFg4ODhISDg4SCgYB/gH+AgX59fX5/fn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKEf4OCgoKDgoSCgYGAgIKBgICCgoOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Ag4F/gIOCf3+Af4F/gH98e3t6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fHx/fn+AfH9/fX2BgIB+fX2Af36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIGDhIKBgIGAf4KAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODg4KDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF+fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKDgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAgH9/f398fn9/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+fn+AgICAf4GCgYB/fn+Bfn+AgoKAgYOChISGhIB+fXx8fHx7eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1/gICAf39/f3yAf3+BgIGAgH98gH99fn6Af31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgX+Cg4KDhIeEgIB+fH18fHt8dXh5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgICAgIF/e4B+gIB/gYGAf32Afn5+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDg4ODhoSAgX58fXx8e314d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHJ5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH9/gYB8gH+Afn+BgH9/foF/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3fHl3eHd3eHt7e3t8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFyb3h3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/gH18fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB/f399fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gYGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgYKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBf4CAgICBgICBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHh4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg39/goGEg4OEgYGDgYKDgYGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/f4CAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEf4CDgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fX96eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGDgYCBgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoWGhIKDg4OEgoSDgYOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4SDgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhICEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgYSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+ChIODg4KDgIKFg4ODg4SDg4SDgIOEhIWDgoKDg4KBhIOBg4OEg4OEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+fn5/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CCgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhISFgoeGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeYN/f39+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fX5+foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SFhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN/g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoaHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZzhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1ud2xweWx1fX9/fX6BgIF9gH99gH+Af319fHx9fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB1gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYGAf3t/fXyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foN0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcmpveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhISGh4aFhYWFh4aIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYWFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhXiFeHlrc355e2tyg4eDenxte3p5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX16fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEg4GDg4SEhYSFhIWEhoOGh4WGhISGh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFg4aGhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH57fHx9f358fH59gH99f4B+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhoKDhYaGhISDhISDhIaEhYWFhYWDhoaFhoWFhoaFhISFhYOEh4WDgoKFg4SBfoCAfHt9fnt8e35+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoeGhoSEhoaHhoiGhIWEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaEgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4OHg4SBgoSEg4GAgIB7e359fHx8fn18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaFhYeFhYeFhoWHhYSDhIODhIeBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx+e3x8e3x8fX17e3t9fHt+fHt8f319fH19f318enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH17e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fHyJh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYiKh4WHhoeHiIeFiIWGh4iGhoeHhoeHiIiHhYaHhoeFhYeDhIaFhIaGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhoWDgYOCgIOFgoN+gYGBf4OBf35+f31/fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4qHg4eFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoeHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SGhoaGhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhoKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhIWFg4WFgYCDg39+f4B/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp6fHl6ent7e3x6e3t7e31+fX2AfX18fH2Af318hoOGhoaGhoOEg4aChYGBgH9/gIB+f4CCfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWFh4aFhIaHhYeFhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SDg4SDhYSAf4KCf31+f35+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjo9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDo8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1NTV1dTU1NTU1dXV1dXV1dXU1NXV1dXV1NTU1NTU09LT09PU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fV1dXU1NTU1dXV1dXV1dXY2NfX19fY19fX19fX1tPS0tPT1NTT09PT1NTV1dXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzYRtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLi60dPT09PT09PT09TU1NXHt7m5uLi4uLi4uLi4t73T0tLT09LS0tLS0tPT09vi4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E9PkA3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6Oip8/T0tLS0tLS0tLS0tLUvaCjo6Ojo6Ojo6Ojo6Gr0tLS09LS0tLS0tLS0tDf6+vr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj87PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX183OUisxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSko6jP09LS0tLS0tLS0tLS1b6ipaWkpKSkpKSkpKSjrdLS0tLS0tLS0tLS09LQ3+vq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7PDw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNz1w5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqamsz9PS0tLS0tLS09PT09XApqioqampqampqampqLDS0tLS0tLS0tLS0tPT0d/q6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3FwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0tTV1dXV1dXV1dTT09PU09LS0tLS0tLS0tLS0tLT1NXW1tbW1tbW1tbW1tbY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7OztPU0M/P09PPz8/T0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dXU1NTU1NTW1tbW1tbW1tbW1tfX1tbW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7OztCmksXS0KGWy9PHkqvRzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPTo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7OztKqnayUzqigq5/PmayastLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q/QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DJl5mFpqSflpChtJWGnZzOz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PD06Nj9CQEI6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0aSwvZqKnaCnmbS/yZeZxtDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Q1bmZnaWejKDE0pKZoM7Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/P0NGanb2bxcmU2a2jv57V0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0NWnpKLGnZOWo7vNiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NLAnaLNspuus52l0NujmbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptPUpKCPu6yfmqGcnJGnmJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HIxqa9lZOYoamfop6ooqmd0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQT49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg1MqOk5eQqrONkKXUmpKOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGR0tIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLUwq+ws9HWwL3W1NO5yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dTW1tbS0tTV09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT0tLS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioaCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpyenZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpual5eYmZqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYm5qZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5qdmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6OjpKKhoJ6bmZmYmZmZmZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoaGfnpybmpqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampuam5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk8PD45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56bmpqbnJ2cm5ucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmpmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZmanZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmYm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkouQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiChouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6JkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjomJkI+Oj5SUmJCVnJqdnqiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVWJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6KhlZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJ2boJ2krLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6qpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapaekqauvrKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66vqqqrpKGipKmnpqmoo6Kcm5ukoKWoo6CYnZifoaKpp6Cioq6sq6qnra+opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKelp6mnqaijp6aZnKSmoqGhoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+hoqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXFBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6yppJ+ioKKmoaaupqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZabmKSioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdnhiX1xVWVFVV1tjXnNfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6usqKirsKmoqqihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpufn6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltaYF9aXFZcaGRuY25qaWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnaGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eWpiW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKumpZmhpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odWtxaGlpYVlTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCxtLW1vLy+vLy+xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1r7Ogp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFpYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsLDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5rY2Jud3V2bmxbYlFWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbWZudXFydXFnXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppqWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3RrbG5kb21pcXhueWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+8u77EvsXIxsbExMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKastLWsrqWko6ikoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ4c3lmZl1kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GycW/w8DLzc/KxsTDw8HEvri+wcPAxL/Bz8/Ox6uvtrS1q6CntLOuq7i1s6ypo6GtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVmaWpoXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczOz8/Mw8fGyMnIyMnHxcnHyMe/xcfExMnMytLP0868uLa0uLjBvr66vbq8urysraaqu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd2aGppdG14bF1kW1ZgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzsfMycLCx8LLy8jGzMrOxcbFw8XKx8rQzdDMx8TAw8LJzcfFwcTHwby+tLCwsMG+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVudGJdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8S/v77Ey8jKy8m8u8jGyM3Iw8jJycXFw8LAxbXCycrIvsXHyM3Gy8/Ft8DAwMC7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVmY2pkYWptbm9eWVxWVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDuri5vL7Bx8HGu7nH0MrExMDDwcLBw8LDvr+ht8HBwaC6x8zLxcjRwrC+vri6u7u+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFjZGNqYmdjW1paXFlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba4tLS1v7u9v7m+urq0wLi1t7Kuuru3wLe8y9S3u8DBvLvFvbvBxL+/kqe9wrt6qcDJxMDAysCxwb+7t7u+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWNgYmNoamdmaWVpXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tbGwtbe1u8G4vrm/vLy3tLevrre1ub+7wd6Xfsm8w7W6x7e2ubu9vYqbvca2YJXAxcC/vMG+uMa8wr+8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOBeHFtZWVmb2lla2hYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5uru/vNDLfYC4xMe3ubiut7W4vbWAkb3IrFZ8wMbAwL+9vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfGtucGdwa3NmYW1gXFRJS0pESkJDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7K9vrvEtrW4tbfAvsS8wsTWqnR3kMbPwsC4r7W1u8OqeYm/yZ1VZrXLw8K/v769x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgHJmbGludG54Y2diW2NRS1RIRUVDSEM8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7G5vL2yvL68xbixt7m+ysrIw8bLzopzdI7M0czKxLW6wMTOl3GFwceQWFqXzsbCv8K8wMPMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmBiTklNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjo6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0vM/MvLq+vMS+t728sK+/vcHLybF6dXqNxszLzcrGwsTL04Rtgr++hl5YesrGxMHBv8XAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIem1td3tfcGNbXV9fVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8tsC4y9i9vra/wL+vhXZve3aEl7SZcXl7j7/Hy8jBw8HAyctzaXu5tHxhV2jGxsXEv8DBv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnpuc3hzZ3BdW15dWVJFRENNSUFFPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2u7vFcnzBzLy2ucOth2dbY15QW19wf292fJK6v8bAucC8vsbCZWFyrbN1YVZhwcfDw7y9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f312bHV7cG5pW19gWVNQQUZIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnFynRnhrW9traebmpnVV9bSUxRU15vc4GeuLjCurO7t7u+vWFaZKC0d11UZ8LDxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxsLW0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3V2d25xYF9mXVtUSj0/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLW3x8Z8dGmFpbaYYlNFX1FNaWVTTEhQcXiIobC3vrmytbK8urtnVVeYvH5TUHLBxMbEwL2/ubOvsby6rru0s6arqK26vrjLwr++rKuwr7O7t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYVteT0hCPz1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8O5hXpubo6gb09JQmtSQ1x7h4dbRleIpqewtrq1tLKsvLq6dFVQhbeBTFSCv8HHw7+5urWtpa22saawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybWNdZlhcXVJOTkE+SkJBSklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i6vZGBd3KFfldGQleIUUtOYX2HflFDT4a6srO1srSvrLu6uoRmW3ifgVxxl7m7vbi2srGtq6Ctrqido6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c210aWxdW2pUXVxQTUhERkxCRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1sr+hh4OEfWZMQFV6cExKTE6Hq29WP3O+ubO0srCxrbC6t6uOg3SFpampqa2uuK+qq62so6istKedl5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+1qpONkJtjRVadeVJXSFFhSXx/Y2N3rrmyrLOvrqytt6mVjZ2kqaSfnJydnaeonqCoqKGpt7GflpePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKurn6ajm6OclZCMj4+Qk5CXlZaYn56empmml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3pjd2xuXFFoVFBOR1BNTEJPUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqrmynqK1UUF6nXdYa0pVY2l2dWRqep2ytKqytK6qq6mSlKuvp52Ql5OPmKCeoaCcpKWtp6mgmpaXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6aqsaOlqJ6gnJWTkI+RkJiQlpWYl5+Ym5mbpJmXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dn1ta3tkaFVRY01KSEdPUk1KTkc8RUA8Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqKCwwbm9fE9LbKpcan5xdlNeb2FgbWiAlrGvrrO1qqehoaOdmZSNkJWXmJicn6Kim5+tqpCXl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmpabl5eYoZ+cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3h8ZHl5YGJSVWBISUpLU1RJUlBMOT9BNjc8NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWdocPBgFVWZnB9dm1menJUX2JkamxibHCUtLCwuKymoZ2empWYmpmQjpGVkYyOjpSco4x2l5qal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKwtKqyrqKZnJ2eoZmbm5qYmZuUlpuWmZ2loaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1paTVFKTk9VTFNMQTc+Qzc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp6xpZB7bYZwYmVXUVxVV0tOVVpUT19ZbLSzq6+nn56ioJeRlJugm5iXkpOfnKGkmIZsdZ2bn5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7itsrSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqOhoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWp3dV1sWlJgSFJVSEZVVkpCTEc9S0g4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaGihGRaX2lhVk5QRj8/QURFQkdSTE+otqqppJ+fmZKSlJiYlpWVjIiLjpWdnZ55YYafmaafoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+np6Wkn52qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cm1pdm1obVxYXENXTkpHTUdCRk08Pkw+NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOfmYFfXmZgUkVFPEs8RjxCPz5AQU16qa2pqqWfnp6io56fnZqcm5STlZSdnpiWfXSTopqrpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsO8w7y3s6mzraqzta+zrqqvo52rp7axraKwpqGjr7GtsKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhoF7dHJra3RycWhWXFFGVEhESlBJP0VBNEZIOTU7Pjc7PD88PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfoIl2amFXTkQ/TF9+bF9DPDM1S3uqsqejo6GgnqWrpZ6XnJSRmZ2YlIyKhoiGeG+CnaSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr7HxsK3xMnJw8HGvrq0urq1u7ewtbKqurKuu7e/u7qquK2rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrY2hveGtlWltGS0xFRFNNREJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdnJlxamBVSUVAQVKNnqSKUEdeja6soZmbm56emZeXl5KMjpaXk46NkIuCg4J3cnFtcY6mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxczR0tXO08m9wL/Du8bFyMXR083T0NPTzMrCxcbGysjOv8jRzMfFx8XBvMPBv7+/tr6zrr/Aw8PHxMfErr+4sri8w8LCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MREVQSURDQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ6UZVhQTEVEQUZevtbDo5Ojs66jnpyfmpeWlJKUlpGQj4yHg4OIh4OAgYGAeXFyb2x5pLa6ub3LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fR19LV1tPUyMzGzM3J0s3O083FyMnKwcbLx8nIxr/Ds7PIxMvLy8/Gyr++v73Bx8TMzMjJwMO/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxBPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hm1xMQ0RGREtVeLq4q6+vppycnKCkoZ2alJOVlIl9d3BrZWJocW9xe4WKgHVwbnF0cIWzwr3E0dDX1tbS1s3U1tfU09HT1NTTz9HD0NPW2NXW0svJztHLxs3SytLV1tnV19PX2M7Sys/RzM/QzdPQv8jHysTMzMzOz8XGx7a/yr/SzczPxsnIv8TDyM7N0NHPzcrIzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGRyYl1SXElKR0FFSUo+O0E4PTQ1ODY7ODY6PEA+Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWfoqNeRTtBQklabJqurKiblJefnJqgoJ6bnJmViXdpY2BfX19fXl9fXWJsdXRwcG9scnF1ksTHxdTW19fX09bQ1dTa1NTOz9XU1NHRzNHN09fW09XQz9LT0cnT0cjQ19fY0dfS2NnU1szPz8rN0svO0MDGw8jGzs3R0dLJzM3AyszG08/MzsjEysfHyMzK1NTR1c/SzNPCucWxpai1rqebqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpq63qKu319TV2dnRztC/vMzJtr6upqqooaOwc0RAQT9TbZ2wqJ+XlZeZmpyfnZicnJJ9cGVjYl9fYV9fYWBfYGBfYGZucHBua29yd3ecy8DS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHF0dTK0NTV1s7S0NjY19fLyM7Eyc/NyszAycDIys3O0MvQzs7Mzs/Iy9DRy87KwsnHyczLzNLTzdPR0dDQyr3IubCuu7i1qrawrai4rbO+u7Gaj6CUkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1YRTtAPTMzPDw4Nzg2NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HAsKmsramlqn9iZ2Jph52fm5WTlpuenp6ck5aXlIhrXl5eYWRiYGBgYWBgYV5gX15cYm1yb29zdHZ2eaS9y9XR1tTT2NbOztTLzs7FzsrS0s/Hzs3N1MvO083L19bQzNHUy8zQ0tPKztHV0tXVysDKwsXMwsjJw8zDxcjKys/KzczQzdPLxsjPzcjHy8XGwcbKzM3Q0cbQzs3NzM/Fx8G4ub3Dw73DubKyvrG7w8S1qpilopmWkZWVkouUjZqRlJSPj5SCiYZ5cXJrbWdgYHBoWVhoVkxGTElQUUI7Qz47Njc6ODo6NTc9PUE8Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWvtKifrYlzhIehw6qWjIyXlZCTkZGVlpWQi3xlYWJiYF1eYWNiYGBfYGFhYF9dW11ncnJxcnNwbXJ5pMbTz8vQz9PUysXJycbGv8PGz87HxcfNytLIy87OxtHS0M3M1MrHy87PyMfP0svRz8a6xL/Gyb3Cx8nOxcLIwMfNyMTMysvPyMTE0MjGwsbIxL/Bx8zMzM/CysvIx8vQxMXHu8fDyMnCz8G9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd290ZGtgXmZwYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLrNzcbQ1dXZ2tvY0MnPz9HTyMK2u7utpLVzY3+AtqyQjo2Wj4WDg4OBfYSEfnNgW15eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvcH240cjJys/LzcS6wMO7u7q6vsnGwsPAw8jLycjKyMHFzMbIy83JxMLKycHCzNDFy8i/ucG7xsi+v8bPy8O/w7vJx8i7yMbFysC9wsvGxcS+xr28wMPFzMXFvMDKwsXH0sXAyb/KycbIxtDDw8bDr8TLx8TKt7+8urSprKSlmJ+YrKOhpZujoJuUe3dydGZpWmFubFpcWFJETEZCR0RMREZTQDU0MzM0Pz0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+sbCxZWV6i7aQi5KWhnqAhYV/dnh1cnBfW1tdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsLa6srKzsrHCvLy8urjBwcHFvr25vb+5xMrFxsK9xsC4u8TJv8HJu7e7u8bDv7zBzcPGvr61wb3Dur3Gu8K6s7zFxMLCt7+1tr6/u8zDvLW6yLq/vsvEwcbCxcnGycbQxsLMx7LHycPOzcHFw8C9s7ewsqeoqLmwpa2wqq2slHp2d2pkZ2Bob2NXXllKRkpGSEpBRUJFSUA5OjY0ODg1NDs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1tfNys/FycXHwLnFvauvnlxpcpeUi4iKhHh/hoZ/foR7dHRjXFxdXmBgYmNiYmVlYl1cW1xeXF5dWltcXmhzcW1nZ25wcnmdvczAw7rAuK6wsaeqraynuLS3tLOztLu1vrK3sLWvsrzCvMHEvMC7tbK6vsC4x7m0u7bBwry4vcbBw7u1r7K2ur+0xLe7tKu4vb3AvbG7trC2urPFvLauu7+1t7TFvL7DxcDDxcbIy8XAxsa7x8vAz8rHw8bCw7fDvb22ub7Hv6y1urW3to55dHhnZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjKyMrJysTQzdLPzcXHwcW/vrm3ybaqsZJcbXWRjoaJiXp4foaGd3eBfHNoXV1dXV9gX2BkYV9kZWNfX1xbXlxdXlpcW11fbHBuaGZrbW5yfKTHv7m4tbCrraeeo6qnnquts62qrKm0rrexs6mupqyzvLq2w7m6urGrtbm7tMK6sMCxvry7trvHucK2raqosLLAtri9sLCnsrO1u7yrrrWmrravu7Kwqrmwrbuuu7i7wMC+ucK/x8PFwLzGwsjKuMXHxr/HxMO6xMbCu8bJzMuzucK9u7OJc3Z2a2lhYmxoWVhXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXQx83Bw8a/xMTDw8rCycq+wLzBurK0tMOuqbCOX2+AkIiOkHt4fYmFenuEgHduXl1cXF1fYF9fZGJiY2NiYF9eWltaWl1aWlpaXGVub2hmZ2lrbnGBrbmwta6mpKenmqCloZqcpauupKiirKqtq7Ckpp+qrbW2sb25r7evqa64tLS8uLS8r7i5tbK8wbLArqWpo6uxsrOovaqrqKutrbSzpqiuoaSvqbKmp6iupqi3rLGyt7q6vLG8vb6+xL+1wsHHyLe/wMW3xMO/u7/Ewr7EyMzKv77EwMCph3N0cmppXWFvY1dWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9CO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HKvrvJtr3DvrrKt8HDwbS1u7WwrrS7raeqkWlph4SHi4B7fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9eXVxaWFlbW1lYWlxfZmtmZGdlaGpvcoWppauloJuhpZSepZuYkaGjqqOjoKalqKWtoJ2cpKassrC2t6ewrKiqtKu0urG2tq62ubKwurqxtqWgpKCmsaerqLmqpKenqKeyraCnpp+bpKasnp+npKChsa2trLK0s7Swtby2u8HAsrq+w8GyubnDs8G9v7W4vL2/vMLHxMPDvsDEoIN4cGxiZl9rb2BVWV5ITmdPVEdFS0Y8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9tqCelZ2hprq2q7Ozu7PEz8nLwsa4tsfAzL+4ybe7xbizxLizvsCrtbuxq6Sus62foZBnbIaGhoB8eXVzb21qamlwaV5gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1vh52poJeVmqGWnKOZlo2foaOnnKCgpKaip56bopufq7CtsbajqaqqrKyktLmtt7Css7Wus7WusKqfnp+korKkpqm4raKmpqCorKuZn6CemZ2fpZqZo5ybna+pq6eqrKytsbK4r7i5u7C2vLy6q7OzubO+tLaysba1v7a+wL3Dwbu7vZeEenNsX2VeZGRYVFddSVdcS1BHSUpHQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vDw8++use4uL+3ssK0sbu7q7i5sKGeqKunlp2Qa32Ghn94cm1vbWtiXmFmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1hYWFhaXmJkZGVmZmhpa3GNqJ2TlJSbmJuil5aRnKKiqJ6cnaWmoqWcoKCbma6urq6yoKairqunorWxsrKsqK+yp7qzpragop+co6Gto6Kqtaqio6aepaajlpmel5mbnaCal52dnZytoqunpKSmrauztKq1sLOrsrm0r6qvsrKzuLOuqayusrixu7a6vb+3s7GUhXl1Zl5lXltZVlNaVUtbUUtJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+znaWjmKWxwrW2va20uMLMyMa/xbbBwMbOt8DEvbO5ubO/trG4uqyxtK6emaOpn5OZjXSAhIR/eG9xdHFoZWNoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqGck5WQlZeXoJeZlZegnqGdlqGhqaSfnqidnJqrp6+wq5ujpLiqoaCuqLaqpqetsKS4sKS3oKObmZmqpqGarLivoqGknKKfoJOUoZSWlpuYl5aXnJWfqp6ppKKdo6qqsK6otKuqp62zsKWrrrOxsK+ur6aoqLKtsbSwvLS5t66jlIF5dWReYVZZWFNSVEtNXkxPS0dHTExFPUE+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvre9rp2nqKOqu8C9wLmutLjBzMfFwsO9xbjIy7LBwsGtvLu1u7y1uLmvrq+pm5igqJSQiYh/gX13cWlscnRwaGhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjY2JjYmNkZmmBlpOWjJKUlJuZnZaWnKCcn5ahoKampKann52fpqCqr6afoqS3qKGhoqi0oqWopbClsa6stJ6hnZWVqaGilK2xsZ+io52emJuTi6GUkZOYmJOXl5iXnqecp6GimqSlpaukpbCnpaOrq62mqa6vrquoqqmzpqasr7Sxr7y1sa+voJJ6d3JlYVxaXVhOTFJIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxuKyepaett7u8wcW6sbm1xMnJwMPGxce2xcSywr/Fq7e3vba9urq1squsp5iXnqOLiHOJiH93bmNhZmloZmdpZmptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVVNVUlVgYF9gYV9hYWNlaoCUk4qRjpSTlJ2VlpekmaCXnaGloa2mpKSjo6Kcqqulmp+lsaqgoZ2lq56ooZ6trKmprq2ioqKVmKObnJCrqbCcoKKfnpeZk4qekY2Sk5aQmJiUnKGjnaShopWgoqSmm6OrpaKkqqOrrqWusqmmpaamtKapqK2ztbS5uq+prJ6McnFvYFtXVlZSR1FPSFpbT1JKVEtTTEVGSUQ4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm8sb7DyKyxuMG1u8C7tLOpq6aVmpuciIByiIN7dGlpamxnamtta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV1eX19fYmRtjpCEkYePkY+ak5WTnJujnJuhqamrqKynqKakmaWvpZWZpa+qoJyZm6Cer5qcq7Ogpaafo6ShlZOblpaSqaqtmpyfoaCblJCMmY6MkYyRjZaVkJ2ioKOdnKOVm6CjoZeiqKOiqKugq7Ckrbelo6Sira2qqKuvs7ezvrWyq6+YhXRzaFtZWVNVUkVYTFFbWE1UTlBMUFFJTklCPT8/QT89NzU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1NzY1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7auqKivrpupqKy3tqy8yru2v6zLxsW4wc7PyLPEure7wsiwrbi/t7y9urK0pamglpeYl4d6dIB2d25taG1tbXBnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXV1cXl9gZH6MgYt/jJGKko2XkZeZoqCboKuqpq6sqLCkqZqfraCVlqSpqJ2YkI+anq6XmKiqmZ+dlKWhnpKRkpGTlaeqpZqZmZ6elo2Mi5OGiY2Dj4uSlZGgnqGkmJWflZqhop6Um6Wlp6iooLGxprG8p5+jrLWrrqewtbC4tcCxrbGrkX5yc2JWVFVOUkpHVlBSUUxMV01KTE5SR01LQUNGREM+QTc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OspbG3qqWisaudqqepsrGktsa0ubqzysW5usHL0Mqxtri7vcHDsa+xt620s7qysqGinJ2Xl5SDf3drZ2xucW5xanBrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domOh5CKl4mUlJibmZ6pm6CqpqWsnqiaoKack4+fo5uXl4WEkpujkJWjnZaWloiim5uUi46KkJqkp5yVlZebkZKHlI6LgYuNgJCKkpKSoJqgopaUmJmVoqaZjZmkpqimoaC0sqeyt6Gcoresqq2ksrKmtby1rKuxo4l5c21dTlFRTE9DTU5OUEtGTk5KSk5NUUhNSkFHS0hIQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS2sKSnpKqloKimpbOqorLDtbWys8bGt7rDyszGs6y6vbS3wK+tqbCepq26r6yemJmclJOHe4NuX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFtdYW9zdnGFiIKIgJGEj4uUkZSeoY+bnKOipJmll6KclY2HmZqMc42Dfo2XloaRmpCUjo57mY+djIKJf4mYn6OekJOYloWNgpR+fnSKjnqQh5OQkJ2bmpqSlpCdjqOjjomaoKGjpJuitK+sr62fmKW4pqaxobCunLC7qqmvqpmDd3NjVk1ST1BOQ1NOTFFMQlBRSElOUk1ISkpESkxGSko9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKimpaijpqWnpqezp6W0wbiwtLDJxLe5wc7GvbOsusGrrcOtp6Kmkp2mtq2ino6UlZGOfnh+ZVdWX2dmaWdobmNqaGdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVZZW11pbHJtf4V8dE5YcpCDl4eOnZeLlJGfmJ2VlJaVj5aJgJOKXztXb3yLlImAjJKMkIaGc4qFl4F5gXuGk52Tg5WOkZCDhn2TeHFwhY19iYGRjY+XmpmTi5CJnYifmIiHlp6aoaCXp66pramonpats6KmrZmsq5ios6KpraOTfnJuYFtOU1JXTERUSlBMTEZOT0lFTFFNS09KSUxQRklJPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepqKOqsKintMG5sLWwx8K3s73Pv7mvrrXCp6rFqaOdmIOUm7CimZaFk46Khn1zdV1QTFJVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1waXuCdFFCQH+VkpJ9iZWNhIqNm46WlYmSiIaVhnmJf2BKUW54ipGEfYSNioV/f25+f5R4dXZ4hI2Zb1GNiIqGe354lHZnd4aIfYqJlYuNkZKXjISKiJWEmoyChJKalp6dlKSjqKmlpJ6asKuhpKSRpqqWoqqcoqaoiXVtZl5bSFFRU01JVU1TSUxLT0lIRkpOTE1US1FQT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6OnnZ+hr6GnqKWnqLCtqra8tre3s8G7tqe6yLi2qKi1tqqyvKaelo5/iZOolZSJfY2DgXx3cG5YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVlYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXFWPiZSJdH+HgXyFjJOCkpqLj3uGj4B2gHhzb3ZxdI2NgXp+iquFeXpodnuOcHJteIGLjZJ4eoB7gHZycpJ3aHWEhISFe5WKiIqNi4B/hIuMgJSDfICPmJSclpGenamen6CdoKmln52YjKekk6Gglp6epIByaGFcXUpXUFJISlhST0pMTVJKSkpMUEhMUUxSVE1FSEE8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpmjopicn7Spr6mlraywsqq9tLK7uLa6tLGft7qyqp2drKmosq+hmpGOlIGNm42QfnaFd3t1bm5pWUtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnWDfHhmd42XmI2PfWh5gXZ4gImPfYSYkoFyh498d3tva36tfHOQin97hpKBfX90ZnZ8hmxvaHN9iYyIgGx5cX1xbXaPcWhxgX6OcEOLhIKDhX93d3qLhX2Me3V9jpKPmIqSmpujlpmdmp2eoZyWjYqkm46el46WmI93b21lYlpYWFVRSlNVVE9QTlBWS05LTk9KUU5IT09MRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKavrK6rqKmxr7GrvLisu765s6ynm7CnrJuPlpylqaSgl5mPhZJ6iI2KiXVwe210cGlsalhLRkdFQUBDRElMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTk9RVFhdZXBybYinqsB+dXljfHhvfHmIkHp9i4ZvbYySeXR4amqAgnGWkYuBfpaASZOYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmltcH9zjYmEhnt9fnt2b3RzhYJ5gXhwfI6MipSDlpeYmpCSlZeZl52WjIOJnpGLko2GkJZ/bmlub25YVlhUUlFZT1JUVFNYVU1OSE5LTU5LQ0hOR0U/Ojg5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrbCjrKqota+urLS/q7zCv6aimZWkl56NhIuUoaGYmJGTi3OOeoCFi4V0bnRrcGxka2pZTkVGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXGCniGKaaXR6ZX9wbX96i4l2gYiGdGyakXRzfGprnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtxf3xocXF8bpOOj3xzfXxxcG51bYJ/d3l1anmJgoiJhJaSkpCLjZGUlI6XjYB5iJeIhoqGgJCIdmpqb2hlWFFaV1lZW01QVVZZWE5JSEVKSkhHQkBGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw1Nzc1NDc4aU84OzVukoiakZmWpKiunrKfp7uvq7KwwrG7w8ealo+UmYuOhnmEkJiUjZCMj4Zxh4J0h4yFem9ycG5vZHBmX1RGSUM/PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHJ8eGx9bXKDgoWBeoSGhnlyoZV0eIBzdZSHNXGdqJ2OoaGEooR2cIZ8h3xzjK2NiYBnZ2JqbnJscIN1aW9YdXCOm5J3bH97fW1xbXCAenN1bmJ2g36GgIWQkIqKiZGLkYyLjoN1eIqOgH6DgH2PenFwb2tgW1xeXFlYYV9STltaWFdMSEpGSkc+QkFCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBk4iWkZ2kp56vlaW1qq6xrsGyu8HGlpCMlI+AiH1ugZCSiYOKh4+FdYKEbJWIh3t0eHhsd253Y2leSVBHPkA3NDQ5Ozs7PT5AQkVITExMTE5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8foWDf4x+dqKZeX6GgISZhJucYYaqn52Lg5CNeneIfomIjXOKl5CDel1kcnR6e3eKbWhqYnlvhpCCem6Bd3SEenB0eXdrbmldd4d8h3yHh49/i5KXg42FjIZ9cYR/g311d3t8iXZwc3RlZ19bW15UXGdeV1FVWFtVR0pKRExHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIySnJ2fppGgq6CxqK/AsbrFupaOkZSHeoV2a3+MkYJ9ioSOjHiDgHOhhIt9fYF+cIB+emd2a1JXTEBFMjExMzY3Njg4Ojw+QUVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxyfI+Men2Jh36Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkqiHgJiYipt0bXyBhod9jmhnaHh/boWHgoVxhIVHbIB3cnl2aG1rX3d9g4h/iIWLepWdm4mLiJF/enWLdnx4bW93fX9zc3JsW11dW2NjWGdmXFVPUFZZUERMS0ZOSUNGQ0NBQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFiJGPlpiSl6GdrKGmuK+zvLOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9Pj9CRUdISkxOUVNUVVRUVlVTUU5HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYCEgoWRk36FiJGBmpWCoaGYlZuapa2Tmruxp7vHw6iLjKGlj5SJgZF8cYOen5Gcf3aFhYqQiJBpaG+DgHSMh4SLcYWCd4d/e3aFfW52dWaAlI+GiYmHiIehqqKWiY6Yf3qCiXp5b2dreH56fnJqZF5aWl1qXWFmYFlPS05XUlFIUEpETkdDSkRCQEREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZniDe4CMgIGRjoqam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOg4CBjIuCiY2Df4l/bXBqXUJBNC0tLy8uLzAyMjM0Nzc4Oz0/QkRISk5RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2aj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jaGemYSThYKPoZ+TmJKEi4WPmZGWbHB1iYuCloyNj3ePhHFthYGKlpGDhYhyiKGWh5OJjo+WpbWpm42VooOHk4N9f2tqa3yAgYFzYV1jXlpma1xsa15XS0dPU1FOTUxGSVBDRE1GQUNFR0I+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwgnB1h3F2koZ+l5aalZ6enKegqZaTmJ5nZaSafoSSkXmAkoiQkn2KhJiSkYKAgIuNiYWQhoSIhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ1Nzs/Q0VOUFJUUFFRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZyopaKZoZeilZ2fqJ6oq6CorKmqtZerv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGam5mnkZGJlaKamnh6fpSYkqGSlpiBlJ57d5WSq7OIjZeffZSdnI6Tlpmkoqa2sJ2RmaiIlo+NgYhsc3J8f3xxaGBcYF5iZ2NgaGdbUkVKS1BPSUpMRkZNQ0hMRkZDQkdFQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHVgbn1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJjIqEkoWDhomBgIZ3X2JQNDYwLTEvLC4wMC8vLi4wMDE1PkFBTVFSU1BSU1VSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpOT1FZbYaQd5WLo6eqtL24pK6srKeotKuwtrKyrbuxs76cs8Osu8nLt8O/uKWjsLKsraqji5aYhaamoKOXgaaZjaKqqKSIhZSkoaCqoaSpj5yxi5Wjp7e7m6CjsJOinaOekaSiq6+ts7WilKSqiJmJkoqVeXp+hX5nYGhcZWJdZGNfZmZfWk9DSUhUT0ZITEZKR0VGSEFLRkNGR0E7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoGThYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5GPg4WAi4WGh5KGgoSJhoiHh3FuYUBFNjQ8Mi8xMTAtLCstMS4tMz9EQU1VUVJTVVVXVU5bUEdHRTw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqscHHw6qzxbass7+zuL62v7TBtru7pLjGqLbJx7W+ubSoo7StsbGbmZKan4mor6ullHafpJehq7GzmZaqraiutruyuqyvtaKxrLG1vLe1rrWgp6ejqJqpsK2yuri4p5u2qYyljpGTn4Z4goN1WWFkVmVhYWNgYWZfW1RKREVMVVFISUpESUdFQUBAS0RCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWlFjZFd5dXGBlH2Fh5N2hX+AjHu/u6O8grSUk42bj4SIj5KJiXmGgIyTjYeEgY5/gYmOhoCGiYWKh5F6eG5dVkBFTTw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFZPXlVJS0pBQD5HS0ZFRDs+QDdENz9CSkpFRldUUF6Ppa6jsbTDtrjBzMm2u8S9s7PAt7fBtb+wt3Sxs6a6xaSwxrmxs7G0qKS1tqqxoKGWm6KSpbCupq2rp6SYoKyzuqKpsrq0u77Mv8XFvb2zwre6uL+3ure5rKywprGqrb6wvbvCwqyZuqiUro+Xl6uJfYJ8aldiYVhqZWplV1tkWVZUSUdHTFFHQ0hJQUhEPj9CQktAQE1DOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldUWVVadmpwf4+EgY6EbnpzeYdiuKGZo4mVk5aTk5ONkJaSh4Z7hoGNloqBhIGKenyLh4Z8ioOBioOVfXh6dWVPXGRHRUw6UWNhW15TRj87SFBEWmNRUVlYWmdZVGBgTVNPRUE/SUpIRUZBQEM8RTZCPkhHSkxTWlRdk6+4tbq5yb+6vcnMu7zBvLe1u7u3vbS6scZhdbKlsZqeqr2qpairqqOisrWhq6ielZafmJ+upaempZ+jlKKmsbSnsrK9tsG908nK08bCxcvBysPAvr2/u7y3tLC5t7bDusW9w8iwnrmqoquOpai2iYB/cV9hYl1XYV9oZlJYYVZSVUlFRU5LQT5HRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWdsbHGQjYWQc2xycnOI1cC1maCNlZiZkY6XkpaWjoaHfYaDjJaKf4OAg3h7i4OHe4t5gYqCl390fXprZXB1WV1cUGVlYmBlZF1bWFdcTWRtVVJtbV9uX1hnZVVZVEpEQUtLSEZJSEhHQkk5RD9IS1RUVlxaW5K5wLm9t8bAurjKy7q3ura4ubK4tbSutraZZHWonK1wXqGtnJigopuknqullKCfkJSOlpiXqJ+ln56amoSknaylqrCst7C9udTRz9fPyczRzM/OysbAv8LKvcG8wcDExMXKv8jOtKS7sLSvm6u5vJp/eWxdX1xYXWBZY2NRXGBTUEtDQkVHRTxART5CSEJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaV9wl5KQlG9sb3V1h7OsoaGfi5mcmYyNlZGbkoWKin6Ih4yQi4l8gYRze4qDhXuJdIGJhpV/c3t4a211e2hyZWlsaWZqaWhgZmlobFpudJetpLyIh2dbb2hdWllUSEtOT0pLUUtUUUhMQUpHS1BfXmJmaWGXt8ewubO7vrWxxMe1sLmwsLurs7GnqresjbannZunmk+anYyOoJaRppillYqTk4mQiY+RkZ6boZealZaHnpqmm6yvqK+ns7TU1NTW0svP1NXO08/NxcLJ0L/KycrJ0sfMzcLQ0riww7zEuaW2usSigm5jXFxdWGBXWGZaUV1XT09CQkhFQkk7QUQ+QUc/P0I3O0M+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VXc5CQmIJocW95eYOgqp6ml42bm5eLjpWRmo59iYuFjoqKi5CHfISCcH+IgYZ7h3KDkouPfnF4dWtxeH5xe214c2xpgXBtY2lucHhpd3x+y7/C36dtY3huY1thYEpQUlVOWV5QXl1NUE5UUVVVXG5udoJyl624rLSnsLarrLzAsau1pqW4p6yuoau0o46xrpqYmIyRk5GEjpuBjaeSnImDi4SKiYSLg5OVmJeTm5GcmJmZnp6rrKSnoaytz9LV0c3M0tPU0NTRzsjD1NHIzdLT09fN0tHF0tbFwM7Hx8OovrfQnnpuZV1iXFZgUl1bT1BUUE5IPkFGQUJFPEBCPkVEPkA/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WGhYp3bHdwfX5/oZ6eoYuNmZOTjIyTj5aFeYWPkI2LioiRh3+Ce3J+gIGHeYR1hZORiX9vdnJrc3x7d3xzgXdxa4BzcmhvcXp5cnu+y5t+jLKDdnKEdmhhal1DWlpbV2ZkWGVrU1hdXWBkXmN4e36LgZmqpKShoKGopqqwuKqltKOhraKjraKnsZ+JppqUkpGJkY6IgZSJa5WijZmEgIV9kYODk5ati5WNlZmOhZKQnZensKGgoaSkqMjOz8jCy9HU0dTSztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMTDy4tzb2JgX1hUWVJcUEpHSUlKQDs6O0VCRDxCRD5IQj9CQzs7OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJ2VnZSFi5aJj4qIjoePf3iElJmKjYiIi4l+g3h0e32Dh3d/eoeRloCDbnhwbXV/dnh+dIV8eW2HdnRufXaEdXl7nbaNPEGLxqV+jXxpZVZJQ2ZjZWNoamRveFtfZmlrbmlugIOJkYudnqCdkJeYn6OkprKkpLOgoaWeoamgorGchp6SkpKQi46LhoOQhH6cm4yNg4SFepR+gqmVo4ySipeSi32XipqRqrOYmpunnKe9w8a5tsbN0tDS0MzSy8nUztDV2tfX2NTZ2M3Y287J2trS1b/LzLR4dm5kXVlSVVBaVkZHSkpFRT06NzlAQUI6SERARUNBREI7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGFxcXOGjXyXkZ2LfoeSgomGhYqCh3x4hZaXiI+Dh4WHeoR5cXp7hIZ1eoWOjZ16jHB8b296f3F8gXGDh4Fujnp1d318gnV/fIeIsHRZqcK2jJKCcG5iPV5ocnBxcG54d4FlaW9ydXhye4uHjpSSm5WglYeMk5ugm5+qn6CtnKKamZ+lnp+smYuajJGRjYR9iIeDhYuOoJmTiISHfm2ZeYSYhoiTjI6UjIZ7m4iTj66qlJWXnpinrrW9qa29xsvIycvLz8jD0crU1tjX2NfU29fT2dvWz9va0dbJ1MuVeXtoaFtZUFJTXkhDRUlJPkE+PTc6PT87Pkg9P0FBQURAPj46ODZEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmt2gIhxkZCagHqAjX6CgoKEfoR8fISXjoeLfoaGgHeCeW57e4eBdXqSno2gdo91gnR1gX10gIRvgY+Cb5KEdHyBhXp2hnyJt8alwsm3gZabj3dwZU5mY4F6gXeGopCLeHl3e4N/fIR2bZOWlJWPmJCDio+WmpeXppyXoJefk5KXo52Zq5aRkIqNkYKMhYmIgYWQkZ6cmYmFi4GGmHqJiZ+Xj4iOiouCfKGJkIu8oZiTl5mcqaamrp+otb7AwLnHyc3Oxc3K0dbW1dnV19vU19na29fb2tnYztzGhnp5Z2hlYFRXVlVNS0ROQzs8PTw5Ojw+OT1ANj0/QDw/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eot8foB/gH2Fe36BkYmEhXqEiHt1fXRufH2GfnR+kp6Rn4OSfIZ+eI59eYqKboKagHSYhX6BiYV8fpB6j6mPkMOgvIyco5x9iYR9iXOMin5zppqcmJSFe4+QiYRoR3CgpJ2Mi5CShYmLkJKVj52ak5WRl42MlZ+dlKGUko6NkIt+kI6Oi4SIkpaan5+JjJSSnpGCi4CmmYiEjoOGhIClhoqLuJidkpWWoqehnZ6do662urWrv8bK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfct3h4d2tpZFdgW1RQT0hETUI9PT45OTo6OTk7PTY/Pj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmAjopxcnmKe3p/fX98iHp8e4uHgn51g4Z5c3pzbYF+hX13hZuhm56UkoCLiH+Yh4Cckm6HqIV6oIt8kY6DiIScfpqRio2jop+QpK6gi5GLhYuBkoZXcq2Ln6ucj4OYm5CQjlyCopGCjJ+TlYyHiIySk4yUlJSQjI+KiJabnY+VlpGLkpSGgIuIko2JipyWmaOjhpKdlqGLioiOnJCDiI+Ag4eFpIaMkLOYnZKUl6Ghn5mSnJ6nsbispbzCx83Hxs/Mz8zO18/R1K7W1dja2Nra19bZ2p9vfHRnZ1xdWFNXWENASUQ+Pj46NDk6Ozc6OzozOzs/PT43Ozk6MTlHPTozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieG1ifpKDbm13i3h5f3qBfIZ8e3eGhH9zcIWCenV2dnSEg4V9f5Kmo5+lopaJnY+Ul4uKqJdyirKNhKeRhJmThZmLopagmJOJm52hkqmvn5GVkI2NiJWLbo23hZrEyLKcoaWbnJiWkbKRZKTNx5aPhYeJkJKNjZOUioWKioaWmpuPkJSThpWXhH+Pi5mIjZCql5eko4iZnpabiY+Il5eKhI+NgX+Hj6WJjZOpmpeTlpmhmJ+Zk52bo7O0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6Ccn9oY19dXk5KVFpCQUdEO0E9ODM3Ozw6OD02NDk6PDo4Mj85OjI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj46RU1GSFJXU1JCY4FGdYGOfXxtfoh4en56gYGDfnZ2gIN8bG6Lf3l8eHh8hIeLfYqjs6ejqrOhlqefpaSWla6ig5C4lZKzmY2hoIylm6+jpJ2YkKeWp5mtr6SXlZaUkIuYmZagwI6kybirm6KmrZiRm52ynYaFqKKcmIWIiY6VjYuTj4iBhoeIk5iUjIuTk4aUmIaEkZCcdJGZs5aXpaGInJmTj4qQi5eaiYqWjoZ9jJieiZCQnJqZk5iYn5SgnZWfm6GxrqKkt760xcfEvcPDv8bNysnSp87N09LQ1tjT0Ni7cnl2XGBVX1dQSElORUJDRTU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTw1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1NjY9OkpGREdOW1xZSWZgO0iEi3p7boWGenyEeICFgX5weHx9fW9zjXp9gXt4houJhoOSp7usqLK9r6Wts7Ooo6KwrIqatJ6juKSVraSWqa23pqSjn5mpmKmjr7CqmpmclJWRl5+Xmbu7rcmhaba4q7CUmJ6jq5OXvqNeqrKCiYqNlIeRfI6OfYOGjo+UlYiHk5eMkJWNi4yXmJKdmbSXlquei5uUko2QkoyZm4qSnpCLiZWgoY2UjZianZObmJ6UoaCUnJ2lr6ihpbO4q8LIxLW6vbvFx8jC0aHGyc3NxNfW0cvToXB6aF1ZU15ST0ZEPjxDQUE4Pzg3ND5GPDw2PDM1MzU1NDU0QjM6OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGVHYmBicElAi4p+gXOGh32BiHWCioN/bX19fH9wd4d3jYGHe42PjIaMmarCwK+9xruztMG8tK2rs7eMqLKurryqm7ukqK25uKumpqKho6Oor7Kxq52cpJibmJeeoqWlkqO5rqjAu6ytsrmlpKd9iIecrL2wg4yMi5CDj4ORj3qBh5CMjpyIh4+YjYuVl5SQmpadp5qxmpGsnY6aj5KOlJCQlpeOkaCRiZWbo6yUlo+UnJ6UoJ2bmKChlJqep6akoqSwsqbBx8OvsLq2xcTCvs2nx8PHw7zV0c3Eyoh0c2JcWV9bTUpCTEBFRz9BP0I7OjQ+QTw9NT02PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxmRmBpZ1pdW5OMjIh7h4uGg4x1hpCKgW9+fIJ/cX6BepV6kZSUmJCTlae0xsm/wszBw7nHvLqvq7m7l7K2urLArqXApKuvu7yqrauiop2nqq60sKqbn6qboZuVn7C0p4uiurq1wburqZyypaSolIWOqsPEpIKLj4eIhIaVlI16g4yRjpGhjIyUko+Jl5+Xk5mVmKagr52MqpyOlo+SkZSVjZCVkY+hlIaXn6CynpSalKChmaSfmqCcoJSYnqakpqakr62lwMTDrqi3tcnDvrbOssS+xLyz0crIwrV0eW1cWFxpU0xIRExLS0pBQT1DRDw1QUQ7OjM9OEIzMzIyNjNBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJmWk1lXGZUY2qZjZeKjIiSkIaJeYaUkIFygHyNf3iHgoKQeY2hlqiampi6vsjIysHSycrCzLzBs627vqe6v728xLeswamssru9qrCpo6WjrK2zrba1oJ+vnqWimKO0vKmbqLzBo7a2r6uSsK2rrJeGmqqmpZGCjJOllYmAdYqSeoWNkZCen5OPlIuQjZSjmZeclZSjn6qfkaWajI+PkJWWiHyPlZKSo5uVoKKctaaQnpelpKOlnp6mmJ6Vl5ulo6inorKsqLzAxK+ls7fMwLmuxLO7vsK4rMLDwsCYbXlhWFdcW0tLTUpGRERJQkJBQ0s6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djZeOnpKJin+Jn5OEd4V/lX9/kIiKkH+VoZqupqOYwr3Iw8fF083Ozcu7wbevury0vMu8w8G1tryts7+5vK6vqKCop7atramxt5qeraKnoZ2rt7eppa++w7G9ubOnqrWzra6WlqWsqKCRjpKxxaeVjnyRlX2IkZmPqpmYk5OPk5WTpZ6TnZmToaOinJifmYuNkI+eiFqQlpeSlqWZZZijnrKllqKWrKyrp5ueppeYl5iVoaSopp+2q6m6vMS1pbS1y8G4qbassrq4rqi4ur24g2xuWldUVU5GSlNOSz9BR0RESEZHOTVGTTs+Nz5BSi4zMjAyNUI1NVBWTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVzs9QEJGQnFGaUlSZWJMRqWUnJahl6mWjZCDh6aTiIGHgpyEg5WQkJSOmqKfr76uoca9xcTGxs7OztLKvru1sbq7vL7PtsS9t7m3srG1s7izrKacq6u4qqinr7CXo6+kp6SktMCwqqy0vsK5wLmzp7m1uLKulaWtr66li5OVoY10wZp+l5mFj5aajLGVmpmVk5OZmaWjlZ+blpqpnZyhoJqLjZCWnWBKlpyalZqlllSWsJ+vnJ+llK+urKaaoKWUk5mZjpyfp6KZtKmqs7y8u6uwssfAuKWrq62xsaOhsrK0pHFuZlxaTlBLRFBQUFE7R0pJR0hCRD45S1U/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVg7OkJDQD1RRVdSc2JXRkiql5mgoqivmZGXh4unlo6IkoWfh4Sdl4+eoJqjpLXItKnGusPDx8rIyMzNxr66s665uMHBzbbIusG4tbqxr66ytKejm6qztKqopq2smaSupaSorLq/qKu2t7/Bv764srLDsbm9rKOutay6poicmKabdr+ghZmdjpOZmouvl6Gcm5eVm5+hqZ6ooJmaqpqip56YkI2RnYNudpKimpWdop6QrbKjq5WoqpeqrqWkn6Wpk5KZnIiUnKKelrGmqau6tr6zsq2+ubago6eopaecnKypqYxjZWFfUktNR0hOSVVMPUxETkpLQkNEPFFVPUFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVlTUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5SYE1VSH9lXkhFq5ScoZ+7r5mUn4uTqpuRkpOJq42Hop+MpK2Uo6O2xr20wbrCwsfIxcLNyMK9ubKvubTBwsq1xrHBvLS6q6itrLCjopmqtLqmqaarqp2or6ejqqq+vKesvLO3vca8t7W4wLG9wLOptberv6WPo5iRoqC8n4maoJmXnp6Pt5+pnKWjm5yhmqils6GbnaacqKqemZWPlJuLl4mMpaKUnaKeoLSvpaWTsKuZq6yenqOjqZGVlaCDkJ6enJWppKKhtLS6ta2otbKznpyipZqXlZmqoZ53YFxfXUpIRkdNUUlNRUZGQlJMSkFFR0BWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6Z1xGQ0OccGJHRaeXpJ+fw6ybl6SXmamclpqaj6qWlqimla2tmaGrtsTCu763wcLAx8S+zce7vbmyr7izv8PItb+vvLa5t6ajqqytoKCaqqrEoaSoq6aeq6+soqmov7imrb2wt7bHtrW5uL+xv8G2tLO0r76jl6SXlJyUrqCRoaKlo6OfkL6lqZ2orJ2doZumn72imaOfoqmroZ2WjZWek56Hj4WNk56koJ21rKaclbKnma+on5qpnqCNmZWfhI6hmpuTpaSamKyxtrGqpaqtrJyYoKCSjpCWqJ6UaGJZYV1OSUdKTktIRURJQT1QSUE8R0lIW1JPSz1IT1U0QkY5PkhHNUNhW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGVjV0yimqOcnsWsoZ+snZ2uoJOjn5eloKepq5e2saOqsrXEw73Atr/Cu8jCvsrItri1tLCzs7fBxra+sLi0ubWfpqyqq52dnqWjwaWgqa2fpKmtr6Kmp722prG8t7a1w7Kzt7m+ssPAt7ius7W1o52llpKUoa6gmaKdqairo5rDramerK2bm56ZpqC9op2lmKurrKahmY2an5KeiY5Xf5aepaGguKqnk5i2o5+yoaCbrpaejpmUnYKOn5eVjqKklZCmrbKrqaGipaWVlZyYi4+Rk6SeiWFkWmNgTEhKSk5GRUFGSz49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dzSEU2PXVlXEtOnp+hmZ7Dp6Wis6Gcs6eTqqSgpJ+tqaydu7CorLWxx8TBwrPCw7zGw7zEyr2vsbatsLSvv8W1ubGwubWsmqiwqamanaWhp8Ksm6yxm6qirrCppKe9t6a3uryutsOts7PCv7LGs7q3rLS2raqippaVlaSsop+fmqirsK+vvLKmoKmpmZmYk6KkuKChpJOvr6ylp5+SoZ6Vno+QjZWdmqKfp7Smp42YtJyjr5qem66QnpOXlJqAkqGVj46foZOLpqywpaahnKCekpKak4WLko2cnn9hZVtnZUpJTEpSQUNASUc7O0c/OTlOTVVeUlNKPk9eXT1IUEJMTEk5TWNdTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVV5mckA4PEiWd2VBNJ+kn5ugw6ikqrKhpLWplbKsp6KksqyuqbuyrLC1tMa/xMS1wMS9ycS1wMjCtau1qLC4rMDEtLeurLa5pZmrsauqmJ+ml627tJuosJutn660sqequrOnurO3srjAqreywry0xae+rq23taqorKGXl5KmpaKjmJilr7iusrW2oJ+opJmVlZOkoLeipaaWrrKypqqmoZ6bmpqWmKifoJihnq+yoqaNl66ZpauXmp2kkZuOk5eZhZaflIyQnJ6Ui6mpqqKnoJidlIyOmZCChpaJlJ94Y2hda2pNUE1OVD1DQU5DOjpJQDc3UU9dXlJWUUFXYFxCSlNIVktIOlRkXU5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVKcGlWQ1dGjHlmQzukpJ2hpr+mqK+voam1qp25sKujqrS3sbC5t6+2uLjFvcPHvbzDwcbAuMHGwbqqtqStu63Bw7i4qq2xu6KVrbCtspalp5Cquamgp7CdqqCwtLKqqba1rLyssrK5t6y5sMK6vb6mw6uwt6+pq6unnpiZq6KioJGYobGvs6uxupucqaCZlpKXpqG3qaWjoq+xtKuyqKufm6Cgm56lnKKWnaOzsJqfkJOlmqCompWhnpWYiZSYk5aXnJOIkJuZlI6pqKefo5uXmpKGjpmLfo2WhY+bamhsYWxuV1BRWlRBQ0VUQDs7SUE3OlhQZF5QVldEWV5dTUxSTl5LSj5aZF5OSFBOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNjQ3Z1lgRig/OGx9aFtWO4l7Y0M9p5+coqm9oaqvq6OxuKmltbOsoa21va6zuLy6vba2wMK/ycS5xMHAwLjEvcG3r7Woq7eyvL+/tKmusbael6utqK2Wp6iOp7ufpK2znquisbCzrKm2tLW9ra+xtaywtbHAusS3q7yvsbirraqjsaaepaqgpJeQmZ+zqrOqq7OanaebmpWNoKaktK6noq2trrGns62yqaScn6iknpWhmJuotamXmZKSn5meoJ6Qq56Xl4WVmIudmZyTio2Wl5qXpqWioJ2VlZaTgI+UhXuPkoOMlmVscmdwcl9GWWZWRENNWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJfUExNTlhXWFBKVlZXTT1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FVMTUwPWBWXjgpQzNZVVxnSzWMemZMQKSZoKSst6Ssqaaurrapr7S6p6awt8W3sba+wMG1tLrFvszFucK/ur+5xLjBubK1rKq6tru5vbSqrbC1mJinq6qrm6yrjqu9nquusaOroLGts66utrG5t6mtrrGota+zu7zJsqq1tLG0r66nobOgmqitoKWVlpqasqOtoKavlqGkmpqSjaKlp7KpoqeyrKq2pa+xta+kmZ2tp5qYn5mZrLijl5OQj5icoZiXlKuenJOAk5iNnZyalpGKlJOemqWhoaCYlZGTlXqLkIV7jIqDi5JrbnhudXtgRWFqWUlIWVs9e0pHRTZBYlRpW01cYEpbXVpSUlJiYExLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENeUVwuKkIvSkdQW0gzY1lVS0SZlqCwqLKpraWkrq61qbe0uKSrtLfJu7S6ur++tLS3w8DMyLvDvLa+vsC4v7yxva6nurm3tsG2q62xuJSXpq6rp6OxqpSvu6SssrKnqKOys7CxsbWxuLOorquxp7ivtbTDxbaptLWrsK2qp6O2n5+nsqCklZualbKep5ygqo2po56blpilpaW3p6KytKynsaeusLWspZmgrKibnJ2blKm4nJSOjouZnKKXkJiloJ6Vg5GVkJ2cmJaViJeQl5unnKOgkpWQkJZ2hJCHe4WBhI2LbXF3dXx+XEtlbFxLTmNcP2J7R0k4R2dXZVtNXmJNWFlXVFhUaV1PT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydGYUxWJS1CLj1FTVE8M3JrSkRDkJmlrqWtrqunpLCys6q3sLafq7W5ybmuwbzCt7OxtcLDzsW/wb20vb+/ur+8s8Soqbmwtra/vK+rs7KcoKewraWlsKWesrWsq7KwrKmotLmstLK1rLStqayoq6m5rbGxx7+4pLmvqa2tpqitsKakpK6jqZyenJuwmqKjo6ORrJ6koJ+iqqamuaWstbWlqquorK+2r6Oeo6iqm6CampKktJqPiY2HkaKglY2UnZ+TkoSOkpKdm5iVlIeYk5WZppufn4ySkI2Qd36OhXx8fYeKiXF0cn59fVxTZG9eTlpmXUZElltIO05tWGFbTWBiTlZXVldUWWdeUVJMY1pbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGRISis6ST8zQklTLD6Paz1ISI+bqqqiqrCkqKSztLG0tbGxoautvcu6rsC7x7G0rbTCwtHFxb7Asr7Bwry/t7zEp6y3rLO4u8Cwq7KtoKSnramopLCjqrGqr6ywrq6trLO7p7awsqmyqaulpaOtuqyqscK5tau5qKiorKqosaWqpKKuqqiinpyjrJWknZiemaydoqepoq2mo62suLGyoamioKuusKyen6eoqZmkmJmPoKeYhoOPioufoI+LjJabjo6Fh5CVoJ2Wl5WGlpOTl6ScnZyKkY+NiX9+iIZ8d3+HhYZ0c3GJdmxfWWBuY1FzcVxLO4R8Rj5XdVhhWU5jW05VVlVXUFxiXlNPTmhYV1dLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLklnREY4PEIwNUVLWDFAlFs+TUaUl62noqqynKmpr7asuLWuqqWrqr3Iu7C9t8KvsKyzxMPOzsO+v7TAwsS6wbTJxKyvt62yuL++s62uq6WnqrCpp6ixpbSuq7CurbGvsq2zu6S4s6ysrqern6KesLerqq26tqW1taOpp6ysqq2hqaemsbKkpqahoayWqqGUm6CmnqSiq6Sto5+nsbetraOlopupqq6pnaKlpKSYoJmWj5idk4GCkImFnKCMio6MmY2Qi4OMl6ObkpCbjJOSkZSimZuZio6KinyGgYKDenSAhIJ+dHeLpIh5a15gbmdXZYdkTkBnkkxEYnlXYlhSZVRNVlVVVE9cXWFVS01pV1VXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxDKzpKT140RIZASEhElpKvpKOqsJirqa21q7axq6Wsqqm8wMC4uLO7taWyr8TJy9G/wbu5wL/CucG6wcSusrWxs7vAvrOxrqyrq6i2qqWtr6u5sKixsa+xq7WqtrWntLasrKSpqpyjnrOzqKiktLSgta2hqairqKunoKurqLm2qaqqqqKpoK2bkqmhnaCkoqajqp6dprWuqKaqoqOXpaenqpyipKOfmZifkY6PmY5+h4yHhJ6eh4SKio6NkIyEhpWimo6MmpGSkY+Sn5eYlouKg390hoF/f3h1g397eH6AiJ2Pb3FnZ3F4XGBziGpPXZhWSG14VWRWUmJQTVVUVVBPWFtiVUhQaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJRYzAyP2Y9Tlg/Qyw+TFRfL0lrN1BFO5WOsKClqq2Zq6WsrrO0r6qlr6mour68wLCuuK6hta/Jx8jRwL69u7zCvbrDwb+/rrKysbW8vMKxsrOqs6iktamlrbOzubCjrraxr7K6q7muqq61q6qeqaufoqC2raihn6+zobSqnqinqqOqoaKsrai9rqyuraGnqJ+rmZCvoZiioainn6ibmaqwqaOfrKKhk6Kjo6eYmqill5eZnY+Kh5WIfY2GhYSkloWCgouGjo2QhISToJaIkZ2Qk5CNkZyUl4+JhYV4dIF/fXV4eYB7dHR6aYGGo3VpXmVsgnVniIt8UlhwXkp4c1NkU1FeTU1SWWZOTFZZZVlGU2lSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNTIjMiknLCUuOy4mMS4wLTE0JSwwTGg6NDhfPWFkP0YxQ1BbWytITzpWQjSQj7GgpKaro6akrKa0s7GqpLCnqri+wbuvp7mqp66wycbI0cK8v765vr+8ybzBuLCwtLG6u7jAsrO7rLisorSmp6yytrmzp6e7ta22vbC8pq2stautnKmvo5+lrKqnnJ6qs6SzqJqqp6mkqZ2jqaepvaqzr66dqaSgrpybsqOVpJykpZ+kmpqoq6Wem6qhm5KboaWdmJepqZGYmpOQioKPhX6PgoCIno+Gf32Lh5COj4R/k5uThZOijJSSi5GbkpWHiH5/cXp5fnxpd3x6dXFxfWiGeISHZGBoY3KFem1neV1eVkJXem1UYU9SWEtMTnF0XUhaW2dZRVVmUEQ+Sk5EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSDElGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTtFWj8qj5SxmZ+fqaWkoaukt7Kypaixp6y4wb21sKO5raiosMPJyczBtr2/tbe/usi2w7W0s7Wxvbi6vratubW/raGzpqqrsLW4tKuevLyossCzuqCvs7WqrJ6usKOcpaipop6cpbGmr6CfqqmooqmbpKigrbunrbCuoaujpK6enq2ml5+boaOcn5uao6qimpqkpJWWlJ+ilpuWpqyLnpGQkYyCi4GAj4F7mpWNiXx+i4aOjYuKhJKYkYeUo4mSkoeQmo+TgYd8eWt9dnl4Ynt6cXBxc3hpgXNqg2dkaGFvc41tYmlwYHBBXHhrVl5OUVFKSk1TWVZNXV5tV0RYYE9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDBCaFkxM1M9ZV9ETDZLV2VPKjwyUFs9I5KZrJmfl6ekop+no7ivrqKvr6mruMK6s62fua+rqLS6x8rIv7fBvq+0vrfEtsOxr7qyssC1u763qbm3vauktKeoqrCuubGqm7u9pLDAtbShrre1pqensbOgnqSmp6GlmZ6tp6ieoKmup6Cml6OooLC4n6Kxr6GsoayknKanqZqam5+jlZ2cmp2pppabn6iSmJOYnZKZlqGqkJqJjpCHfYh/go59fKGNjYh5g4yFiYyMhYeSmo6JlZ+JkZWCi5eMkX2Ee3NvfXFzdGB5eGlvcHFvan9yY3psaWZkYWaGf2BbcmpyTU1/aVhaTVBMSkhQUlFJTlxfblNEWFpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpoSCo+L1pZNSiXnaWYnJatoJ+hpKG3q7GktLSpqLnEtbKuoLesrq2wtcbIwLe/wbmwtL23v7u/r6u9sLS/sb3Duam7urenqLWop6uwrbOxp5q9t6StvLavn7G3sKilp6+xm6CkoKOkoZebr6ahn6Knr6KgopOkpKO3sKGmsaufrKOvmJyqpamel5qdpZObnJqdpqqZnJyklZWXlZyOk5ejqaGQiYqQhnqEfoSKeo+Xio2GeYKHhIiLjoWNk5iMjpaZio+WfoaXi496gHpwcndub3RfeHdkbGxsammEbWVyaWtmaV1kc4BfWmt1aVpJfV5bWE9PSkhIUlVGMjlfXmxQRFhWWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbDg0R0FmW0hURFVdaEUuOzJiVSwylqOhl5Scqp2loaKgt6quoLq4pqy9xbOvrqK1r6ytr7TDxLyzv7q3sLO5uLq4u66twLO0uK+/wbisvLq1pqKzqqeps6utsqKcwbalqLW1qZ6yu6qnpqmvrJmip5yjppSYorKkmZ+kqKmcoqCTpaCkuaikp66nnqWhqJKfqaKhoJmbnaCSm5yWoKGrm5uZoZSRlJaajpSTo6ikkIiKj4Z5hHyFhn2djYqLhnmAhIeIh5GFlZOSjJCVlI2OlHuDmI+Ld357bHRybGxzYXh0aGhqZ2ZvhWdnaGNmaWpgaWJpZlple2NgU3NUW1tTTElHSU9TQCEqaV5qTENWVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRCM0NEZ1tLV0dVYGhCMzc5ZU8nMp6ko5GOpKebnp6do7Wsp6q5t6esw8G2sKyita6nr6+3wMC8ssG2sa6ytra4t7asqr2zr7Kxvb+3rru7saWetqulpbSpq66gn8KrqKWws6qstbudqKqrsaWYnaqepqSRmaatopiepKmhnKKdl6Cdp7amr6quoaGenaGVoKafoaCZm5mckpmdlKWdrKKYl56Uk42Vl4yPmJqpoJGIiYuJeYV3goKCnYeLgol8f4SIhoSQhJaVj46QkZGRjZN7g5WOhnJ9fWZ4b2tqbGd1c2tjZ2RkdX9hZGZmZWpqY2pxWV5YXm1kYU5oV1pgVklHSEtNUlg+OWBsaUdCVFNcW0lJR0VBLjw/OUE4OVJHQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQWZIJTWbpJ+QjK2hmZiglqS0saKxvbehsca7ubCxo7esqq6pub27u63Asq+urbavs7izqKu5sa+utLa7tq+4va2mnbWroKGwpauunqTCoLKkrrGvt621nq2vra6imZ2oqqWelZuopZ+ZpaOonZqgnJScna2wprmorqOhmpqemZ6jmqSdl56Ym5SaoJKolaqnm5ObnJKMlZmNlJSZqKeNjYqJj3yCdIKBi5iFh3yJiYSEioyIkoSTnJKSj5CRlo6Qf4CMjYNvgH9meW5oa2pncXJrXGhjYnJ/YWVoam5sZ2ppZmxcbG11cWFUYmhkZVlJRkxNT1hRUVZhZYFUQFZTWVVGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUllQyc0k6Kajo6wnZqToZqpsrCfuMC2oLTCu725saW2r6iupbe4t7esu6+tqqu3qrS5rqWztbGuqbG2trCytbqnqJ+2qZ6eqaKqrZypwJmtpK6wtrWtrZ+xrbCqopuco6yom5Wcp6OdmqmipJaaoJyRm6Orqqm7n6ikoJiamZ6hj2uilpiccYKWm6SAdpGpp56VlZ+RiZeZgJaKoI95hpSNg25qfneDcWyGi4Z9hIuGb15jYGeEl4Zri5CUk3V3i4R+g49/ZoaAaHVpZldcaXNuTlBqY2ZxhGdfZGZubGleX1+JkISGZ09LRDhFVGdeSkdQUFVVS0hTYW90ZUZbUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzU2OCwjMScyMTQ6MTc2WIFsMTZPa1tOXEtbZmI+RzFQZD0rL42kmYeVsJuck6Cbqq6ro73Fr6m3wri9vK2mtrClq6S4s7KzsLmtqqestKawtaOouLa1qKestrKutK2zoqmftKueoqScp6iarLuVpqWvs7itrqWorquspaGenKCnppuYoaalm5unp52TnqCZkJ6oqqO1sKOjo52Wl5iXo4ihjpKah6GHlJ2hf6V/pqqekpKbkoiEcniNjoSIoXaIjWmXiGZ9c3ihb4iHhH6Ne3+hoJ+ZgHuHnnSIjnabimyHgYNtaGVjemxxYlSGbWNsaZhxWGpvboZYXmlba2pbiHBteXKGaIeEWl5GTj5GXk1FUlZWUVFSV1RnXkxYSlJSUEVHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxV2E3LyiMppeDnKydmZmdn6qqp6m/w66xury3wL6qpLewqaymsrWur7O2q6mlsa2ltbOcrbW2tKanqbOxrbKnr5+qoLKon6SjmqGjnK61laSlpra9pqynqqqsqKaioJigp6OZmaajpJicpKmWlKKclZOjpaagt6SkoKOYlZOYk5yIro+YlImpi5eim4WxgKSsnJOZnZV5gtSof4eUwZvHeXexpbeXZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQeoFslrGrsHloa1ixrm9labySvG5oeW1yj9h+U2pjtrJ/gXGUdZqhqpBXT1dhT1ZORlRbWFFQUoxcV1xQQF1FUU5FR0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVxdNDEhjaaTgaapn5ecnaWssqiwwr2ytcC1t77Cq6a0ra2pp6+zqq+2tKioprWmp7ivnbOytqqlpKexrq2xpqqep6SxpKKhnpeboJ6vrZWeop+0uqKqqKGtrqWinZuaoqifmJuooJ+YnqenkZynm5SdoaeioLCjn5+jlpaTmJKZha9qaoqNqn5nhJWHrWVxnZyUmaWVca6hpH53u3xroY92sV9qtFulgGackWBmgXpmf2p4aqllvnJnpox2smp8sXh0kpNjbW2nbVuEoEVpZ4eWRXWcYH1ne6Sngllfi6tpgZV4emqnN0qvW1dUbGNbS05XX1xXVjtOiE9XVi9JVFRKREVGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMxG5GilYKsp6Weo6Spsbess72+sLfEsri6wqepsKuvqamwr6SwurCkpa6zo6m5qZ6zsrCjpaCqra+rr6ann6OisJyjnJiVl5ucraaXm6GetLOhq5uira2gnpmXoKKpnJmepKCcmaGnpJCdo5qXoZ+sn6anoJufoZaVkZeRmoW1m7V4hamZtZl3h7Obt36TlZWolH5rgaZ6goWIkpSSd6tna7FbrHuPh5R0iHCPhoCAiJCXeIOCi5eMg6CPhLB2d59xa2tsfItOpFhIY2OZfmNopmB5cnVTkodeUKltY3F+h4BinS5RoW5bVGtnYExLW2RYXFpCPrB4V1hBI01pRUNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o5YVU1MByVn5SIs6Wmoa6pp7Osqbu2wrC8wq24t8GqrK2urqausqmhr7yqoae0raSrtaWmsrOno6KeqKqyqLCnpZ6fn6+Wn5mVlZaYn62impqkqLWvoamPqaiqm56VmKClqJqfnKOfm6CjpaOVm5+Ymp2jq5ummp2boqCXk5KTk5yD1ZOZuXCwwn7GhnzWlJu7fJmVpY+NnI2ke46HpIKlgnqseY+dVq97iX6farlauXeGhH2mgpN8mHqqeY6cj3uxbY6EdJC8hW+UUK+nxYpRoHpjYKpic3KHbJeIYFO1tMiGgIl8Y6QzQp12XVFqaGNQQFhmWmRhSkhNbEtbU09ZZlpDRD9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREMuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tcUF9mVDdHOmFRNzIlm6KTmLGnqKWzqqW0qKS7t8GwusCxtbW8s7WnsbCjsLOmn662qJuoua6jr7Ggs7SwoKSen6epsKi0qaScnZ6ql5iXlpeVlqGrnpqXqK2wqaOfj6yip5ael5yhpaGXoaGioZuioqebnqGelZmbpqCcp5Wcm5+hmZCSlZGdiLJuaLVxq4dvjqZytHNytnuZmKSMj5yNon6RoKV+sHaDkdLRdlyufIZ/pG+bqqZrhoV9rX2XmY97sXOTnY54s2WWdISeb55mlFLIi1rCXJ95Yl+tX3Zzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPal9saU9VRkk5PVdSW1dYSEM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkE+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCTlRfZVA1Rz1hTTYyL6GckaWvrKSqu62mtKWntru8srq/t7a1urqzpbS0obGyo5+ssKSYprqupLGxnbS4qp+mnaKqpLGnrKmkmpyaqJ6VlJiYkpKjqKCXk6aqsaailpOtn6WSlKGbpKaflJqmpqGbo5+tmqCenZCWnKKenKWVnZWaop+WmZaSm4Wse3eodqOOiYepb62KgqeDmJmhiZKaiqJ/k5mJroV/grNccrNSrn2DgqR/cdd9d4V/j52GmZl3r4aKkZyHd7RhmmWagYKUbJJasFhLmnWYeWZgrV52d4dnmIhrXq93lZ6PeGw1eciusl9BVG9eZ2BFUGxfcW1WVU0uZWNpU1lROkFEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6ODifnZSguLCXtMGtqLOoqbK6uLO4v7m3sra9taW4s5+0rJ+gqKuflae2q6ixsquutKSbqaCgqKG1pqaqo5melaWhlJOcmZKVoqWak5CnrK+moJWZqZ+ij5Gimailn5SZpaidnKWerJ2hnaCNlJ+bnqCYmZyWl6Kgk5iRpp2GqX19pXihj46DqnCti4GnhpWgoYmXl4ijgpGIlKp8gIudeW+xWqiCgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH6DlWySXKtbWpN/kX9oZ6pjcnuBa5iHcV2sWomgjmtuZU9KQ6FcWkx0XmJlTVphX3JzX0pVNkqak1lIRT1IRkFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOz4wMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8xVV9iTDdGSV9DMT44oZ2Zmb6rl7TCrqutqaW0sLixtb+5urOxt7yqu7SfsKSepaennpSqsamwqrWsq6+hmKGgpqSjuaKjq6CXm5GioJWUn5qUmJ+gj42MqbCvpp2Xm6imn4ySpJeoqqaTl6mnnp+ho62koZ6hjZShmJ+gkp2XnJWeoZWWj6ubj65tcrRyqYx2iqZztHhzs4CRpKKSnI2JpIeQd7hvjHuLomtrtlqghWWXl2mhoqdtk3K0dJOYf7JqhZOIrWp1s2GdZqJvh5Jql1ytYE2hfIeRUnOjbHl/fm+YhnBcr1Y8nHdmVG9uLlynT2JSa2VhbFliXGBwe2NTWVE+Pm1wM0JCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs8MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VfYUw1Rk1eODFCOKWam526oZuywK6tq6unt6m4r7TAtbyxr7m4q8G2qaqgm6akoZ2SqqqntqOyqK6qoJecp6Clq7mdo62blpmPpaOVjZ2hm5mcn5GTlKu2r6eZlJysqpeMk6WZpayhkZeqsqSgnqirsJiho5CZopegm5abl6GTnKqclJGrmYfUkpq7c7DDgMOGftWWm7h4iJCXjJiKjKeIeqO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gIpumohxbo2kdL1dd31bYXm8a1pWW2p6XmpgZGZibXdvWVtZQ0FAcj9DRys1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnmp6hvKKXscOwraqqq7Gnua+2xLG6sq67sK7Bsqylop6joZybkaqkqrKktKetpJ+WmqqZpqy4nKKumJWhkKWgko2co56YnZqQlpOvubCrlZejqKeUkJaknKSsnZGgqKufm5+po7OeoqWOp6KUoZqcl5WkmI+woJKVqp6FkJm2gJCRjLiVeIKTm7V3bmtuc255j4SOiXOewbu9mnuBsqhwf3SRuIN8hoaLh417ioaNl3yku7m9nHV6tKN0dpd1dLB1mZ5mhmmNtXRycHe2jF5/eX2JaIN5bXlii6xwdYV/WVunakRkWVNmYGNdY1FnZnFsdUJOUExEO1pMPkozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVjgqT11dPSs6VlYnPTs8p56goL+llrTDtKyrp6yrqbuusMavtbOut6e1uK2po6KmnqCdmZSspK2qprWoqJ+blqCjnqykvqahq5eUnZCim5KPoqiik52XkpiUsrW2rZidpKSii5KRppulq5uWqKSlnJqhqaano6mhkq2fl6OemJeXnZ6PsKmUnKeijmp+aZyneIlzfpqPdHplh3q+vsC6bpKDcZSGX3JqWl6aiWFkh46Va2B/lWNtnHZilGt/mpWUZV5gY3GbimlyjH2GlWdqfnJ0eH19Ylt3dIFoUFxug3x7i2tYbHqCcklKb4VwTXRNRVdcZmBMW1hnY15PW211aXFST0RFTTtISTxMPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBeTCgzPVtPJz8yPqifqKHBo5u0urajraWup6i1sazIrLCzrLWjvrGypqCjqZ2jm5qZrKeupKS1qaWbl5Whm6etqL6nqaaVlJyVoJqTmKWpp5GekI+YnLCyv6ybpp6noomTkamaqKSam6ufo5mbo6etop+qopqwm5WmoJeVnZ+dl7ClmKKomZyRnZyjpJmno5qcmpqakJaBZ219cXeRl5SRhYq1qo2GmJWOioyXl4eUlYqDkpORiY2Rk5iUmJeaoKKanJShnY6CeqWFbGp8kHyAdImKgXGCeHl2doqAe4lqc4F0g3Vjd312a3B7bWBjXHBnTVlZZWpfV1pvem1tZlNPRlM5T1pOUk8oKzpKQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCyoLOiv6KksbK3oKqlsqelsLWqyautsaW1psCotKCepKWcpJaWoKumrKOjtqygmZaWoJetqaXAnquklZKcl56Yk5Sin56ip5ORmKinssOvmqudq56PlpapnqqcnKCsmKGanKKlr6ahpKierZiXpp2ZmqGenpywoJ2ippWYk5iUoKKWo56XoI6WlIuKjY6WrY98lZuCkoKLqqiGgZiWioSOn4h7hJCGhZmQh4aJlY6bl42QmJ6klpqTkZ2Nf41mobOvhYmEdnqPinx2eXpvZ3mQgYCJa3WBeYhyaHN/enaDiIJrdGN5ZmBpZGJkZmpZa3twaWpcU0xQRF9VRkA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0XEc1PCxAtKC5r76sq66ysqCqprGtoqyzsMWwqq2js668pLScoKaioZ2Zl6imqaakprO1npWUnZmZsKauvqCro5CRnpqZlJGVoZyXqZyEnqmsorPIs5+qpKuWlpeap52om5+kq5Sen52gqq6ppaOroa2bn6ChmaWenJ+dr6OZn6iTmJidkaWZmKmempdmg5J8ZX6OmY9jeY1saGt6kaSra2WamH5nhYplZWloeo2hjmtojJeRondraouYo5+Zc2xueoSMh3pYZV6FgV5siomAdlxoc3d3kYCHgm54gniAc215g3R3iIiOg3tqhVlea3RkXXOIaGp8cWxjXVFNV0pkWEBKND1GNz9GRDcxPD0/QUM7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMVlDOz8uPaWfury5r6yzsaqlqK2usKaurbC9samopK2vsZ+tl5+jnqGamaarnKyjpqipsq6elaOQoq+mtrmlrqOPjpqhmZOSm6CZmaWWe6Wsoqizw7ekoqevnp6VnqOeo5yjqaiRnqGeoKqvqqujqp+om6afqKGslqGbpbCkmJyqlaGempOlmJ6rmZ5+voOIcrRyhJ2GrWh4ucS4cZOio3ummJlzqoJ8y8DAu3GLooeCn3yVmImewL2Clp2ejZ3CwXuBe5KNmsPAfWulsW+MgG/Ken+bd5GDjoF3eoF/eXF6f4dxeIWMk3ltdpJiZl94ZF9kgGJedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLyNGWzNQWS9VQUI7LziWo7jDtbCvwKmolKOvqbCvraayta+qpqamsaufq5iaoqCcm6qnop2roqWopaS0o52ik6atrLezp6+ikpGanaWSkaChl5yfnYenq6Srrb/AsKGpr6mXkp+dopmio6qjkqChnZ6trqispqOip6ClpZ6tqZGkm6mtqpydqpysoZaXpZaho5icf86UeXqkgXmVlptfro9ejqeBoqB8p5WbdKuDgK9eY42peqeHhaB0l5KIs2OCq4ahjo2zaoSudH2Wh7hhgq1Zo81uj3V72nt/mXB+iJN2f2V7iHZ2a32Ibn6FkZJ+bYGOYHFrcGdgX3hkW3BoamRmYFJUUldeS09DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w7TC0hUEBGNC4xrcLAv7W0sLiYnpGkqqittKumsqytrKSrp7CqoKebmaWXnKKvn6CeqKejpaGfsKybnpWnrq2xq6isoJSSm5+lk4+fpZeeqKOerqSrsKjAxrOoqbGulpKdnKKXoKmqnpShn5ydrq+nqqmbp6ekoauSrbSWpqKrqp6jp6ahsKCSmqeaoZuUlJGXoHCFjJd1hKiHcbF8nXGsfqGegaWPnnergn2tf5xyrX6rh4afdpiSenyXfqqIooyRi51+q3uJk4+fgHutVpzEeo9vksF9gZVtdXCMbWV2ZYZvYXducm+JipGQg22Qj2RvdHVwYGdtZF9vaWluZmNXU1xhWlJTQzlJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK7DUxsaytJ+do46jo6Gtr7auqLCnqaqorqurp6KknZmilZ+mq5+ipaCoqKKfnbCsl5qWqKevrKinqZ6XlJqjopKUoa2bnaajr6yjrLWqus2xraeurJaUnJ2imJ+urJyWoJmdnqmxqampm6upo6Ksm6+xoqisrqaZpquqqrGikpejpZuUkoWkaqR1iXqpdHqycIKliZmMcYigmoekYGBSrIR/roObdq6BpoaGn3qYloZ7ZoCjiaSZhoGjfal+gZSHrl58qVWdopKBeqKfgHvDr8WMc6+zs7lxYqmvwnRojYyYj4FtmpJvbXl3d29sZmRlcXBme2hjXVdgalhYVU1NUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NzQsJiQiICgnIistIiQuITMtJkBEV0gsRys2NioxUEtMIyBBOUQ0LCfDydbVwKGZq6ihr6KesLWwr6mso6imqqqrqaSmoJuknp2lp6ajnKyaoquhpJ+vop2akqqktbCvoKmbnZaUp6OQmqKon6CmnLGmo6exrLbIsrWqrKqVkZycoZmfpbOdmqGUnJ+nq6ujrpqsqaKhqqOzraKqs7Gim6qor7C2o5OWpKeYm5F8qmyehId1q3l8sG+CpIuJn5aVn5SB0ri0uMmAgbJfX5Spg6SIh6B5mJWaeKrJdJmjlaepkJKbjH+biZrGxnhloYKlc4GfjoJ9r15wtWOxdUujhm2nR4KTZI+QnpN8cJeSf3B6dHx7bVtmanJxZoFqXmJZY21cXllJTUxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz4tNU9UUR0cOzxGMiwkp6TBxrmtqbOurKWinLK5rKqhppuopqqsqaagpqWYq6OfrqudpaCsmp6opZ2mtZ+il5OoqrayrJulnaCVkKWtkZmcp6OgqqeuoqOnqrC0wrKzqq2ok4mXnKSaoaOuppehlZicpaarmq+draimnqyjt6yhsrmvnpuvp7O0s6WUl6ejmZ+Ogp1OeJqBf596hKN8gqSEh6efnJ6ThLh7fHm5gn7MxsK2eJuhkYuffZqWl4p2npiKpJijqH6whZyFnoSsfZmUYaVso3CPhZCBfZeDcqxgpHNxgJpgvH1SVXWOkaOXfH6SkYp0enOEfnBbbW53cmqBb1pkX2huYmRdS01RVEJJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamspKu5q6+gnKGss7Omn6CVpa6trqqnnaammqOnobKuoqimsqCZqaSUorWio5WXoam0uaSbo52jk5ChspmenKemoaKvrp2kqKK1ssOxraqtqpGHkJymnKOknKWXnpmZmaWkqJquoa6lppewpbytobe3rZ6etbK5sbOnmJ2voaOeho/RtcO3eYeOhZGTj4CmeJSid4ygkoSlgYpxqoaEtG5yapmjm5WKn3yYmYaHj3OvgqWboo2mi5OdiZSQm21wslylc5N6nGyZf3uZfW6pYaJxcX+fYnOyuGh4j5OmmH6MjJOKd3x5jYFtaXhpeHNuf3RdZGRubWZoYEpaWFg8SEdAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVZWVFFPUVtVJSEyQUgkKSWTc42Krb+/u7q1npeopK21oaOZlaOpp66qq5mlop+loKC1pqKop7CjlKujjqSto52QmpqqtLSknaWdqZKUl66goJ6npJynnLWaoKqjtqvDsKmrqaKMhI6coaCmopWam5yZmpmmpKaYq6etoqWbrae+rJW+sK2fo7Czuqy0p5uosaSnmHqokH18sHeKgaSliJxtsm+hh618oY+DqJWYgKyIha6Fn5SpoKGWhp+AmZWAe5J+q4CdmpaKqnidoI+Jk5KAea9do4F8pqdknYB8l3Rrr12la3GFmV1gW4ygbpWRppmDlI2Wi3p6gpZ/a2x/Yn10bX96YGdlcW9oZ2hDWWBbPUtUMlU4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaV1NQT05JNzA1Mi4qLEFUVlZWVVRVVVVVVFRVVFNUVlZXWFZVVVFIRklKIygovZKahKnGwrfBtJ+brZ+uuKWkjpuko6Cvr6qfpJ+drZieuaCiqqCvqZmtoZCqqKSWiZuQrrCspp+nm62YmI+soqGdpqKapZ2tmJ+oprapwK+lqqSfi4CNm5qgpp6SlZqalJqapaOjmairq6Okn6movqSXw6yqoqGssrqrrqegs6+pqph2r36Qi5yFh326rYqYZbCMZZWtfaGPg6aVmoGsioSwhaWZpKGhkIWgW2xqgbNgf617e4KAsWxnbpmXjIiwW320W6SDa8iiZZ+Ae7xZdrVasn1Sr4B6rFiAoW2Yj6iaipeQlpZ7eI2cfWRzfWKDd3SAfGFqZnFuZmVlT1VjW0JUXj5JKD45PTQhIiwlHzIuICoxLzA0NTc5OTxBQ0ZISkxOUFBSVFdaXl9gYGFiXl9cW1hVUE5KR0M1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7K3vbu0wbOjnK2mpbaooYuaoJ+ds7OpnqOgnbSYoLOoqqudr62dq5uVr6mijoibjq+sqaeip5muk5mPqJqinqWfmaOjpZmeo6myqLyvpaienY58i5qVoaCZkJKam5KZl6ieoJioraelpaOlqbufoManpamhq7S2ra6nn7ytrayVgamSo6+Pm4CGpJeYkIGAuMO6g46dk4Wnl5yCrIqCr4imm5qlqpB+1b3CqmKjv719fqOCg9e6uLWFlJODnr2+hGqjgW+rhG2df3qysMeDaquwva14d6K+u3SAlo6mnI+akZaceYGQmnljfXpkjGZ5gntga2VramJQYltTalxAVGFCTik9OjQvHh8kHiUyIB0kKDA0OTY2Nzc7PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSUM/PEE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbO0sb+5sr2zop2upqWzpp2LmKW+qbexqKG/pqaym56xnLmonq2upaaVlLCsl4yDm5GupqOsoaScqqGYi6OSp56onJqhqaKZnqCrram5rqijm5eTe4eZkaabk4+RmJiPmJOpmZ+Yqaigqqaho6u7nqnFo6Cvo6uztauwqqC7qK+vmnN1qqS3hmWJn3BnrY+Kj21vd6SQmZ+Bda6ZlXCPi3GVp6ObmK6kcm1tbWWKeG9tgplxgHlpcWlniZaVmHFoaYSGZ3CGZF2JY2pvWV1nfnemYGJxjpJvZmSAjZKOopiXmJCVnnyHjpR1ZoZ3aI1qeX55ZGxjZmxiS2RYSmtZOlFlRVInSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWts6q6ubKzq6mirp6jsqmYkr2xw8i+tqqewKuso6CnrJ+6o6StrKymjpauqZCMhZWXrZ6mqqKfo6OgkYykkqeZqZmWo6qglpylpaevuqusmpuSknuElo2ll42RkZiUjZiVp5Sel6iimrCmnqKsup+wwaeks6assbKrraunuaSuuJaKoailtp2JlqKXh6makJSdk6qzmZujq6CylqKhnaCinKCkoZWrpoySkoyHkpyclJCak5iQjZWGgaSZl5WNi5OSio+GhH5nin90gnZ0h4xxp2x7lZGUk4GBj4+Pj52UoJWYlqCCh5OMcGiPdnCKd3Z8empsZGRvY1VgWEBpW0hjYU9aK0Y9KyYhNzQwLh8cISUyKCo2OTk0Njk7Pj9BQkRGSktLTVBQUVdUVlleX2FjXV5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqltbeurqKwpK2foLWxkI6rxbzEu7iqoqWdm6WdsKmjtqedqbSmp5GYrKKLiImPnKeWrKShmaeenpOVo5eomqmZlKaho4+ap5mhtbqoq5makI18gZSLoZSKlZGVkJCTl6WPnpmon5y2o52nrLenr8Guo7emr6+wramps7mhr72Zkqajpraikp2mno2pn42Sn6Osr5qho7Gor5ekoJyjqZ6enZyXq5ySmaGbk5CWqpmNmZmWkJWekYmgnZWUhZKMkIyUioB+ZoyGdYZ2eYiDc5xqhpGUlJGKfYyWkpKYk6GTnZagg4eXhnlxlXJ5iX9xe39qbmRfcGlgW2BZbWNQYGRQWzpHR0Q9Mj09Ny4qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fX11eX2BhYWNhYWFgYmJiZGJcW2OXlaSoo7CzrK6jqaetoKi1qpCQnaSzu6+srKKjmnqdorGkpbColpu4pqKUmaqcjoaKiZyjkK6fo5aooKGSl5ibrourlo+omqiMmKiPnrm2pKWZm42JeYGTjJqTipWRlJCNkZaijJ2eqJ6fuKR/hK+1orCvdKS+o7KgeHqfqbK7lXatpJ+KgKp+ZFxidp+OpJ6El35uk7Oco6euq6Jlnp+Tc3mZl3CAmKiXbH+ip4llnKWckZeYlouRm5GGnZqQlYKSh46OkomFd2uPh3aGcXyGgIBhaYiLlZOLW3aVkWdokI5ye6WYmGR5mIaBd5dpg4qCbnl/a3BlYHZva2toW2ZlYmJvU1s+Tk5OUkc9QFRCOTEvHh8mNDozMTY2Nzg8Oz5AQUJGSEJGRklLTFNUVVlcX2hmZ1dRSjxERzs4VVJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mm5amo6GwsayrqaWoraOnraSSlqu1r7Gmmqqmq5dzjJyvn6iqppSWuKCgj5yjnZF/iIibno2rmqOVp6KejpeRnoV1rpCIppqnkZajiJu6tKigmZiLiXV3k42Wk4qUkZCUjI+ToI6an6aZnLKWgIyctZ2zjJKPvKehfqeieqKut4GOjqaehIuFj7Gpr4yJlqOaeYGLrIacnaKnqaiHlYaYdqWbeoebgZemgoF7nLF6ioWgl5mUmJaBkJaWhJmZY3mHkISNj5KKg21wj4d5gHGAgYV/hnSGhJaSeJZok3SgmnR9mYOgnIaYfpGJgYOYao2MhWt4e3FwZ2R3bmlsa1tla2plc1teSVRMUUBFNS5ZVFU2KSEwOT0+NjQzNTY4Ozo9Pj5AREg/SUVKS0dSWFpZW2FhaGZZUUg5RUw7PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyYo5+mrq6rqKygqLCmp6mlmZSuxr2woZamqLWej4Ocq5ymoZ+NkL6emY2fmqCQfYWOmZeIq52ilqChko2TiYaAkaiOh6Kco5OWnYafubKnnpuSjoVwdZCJlZCKlI+Pm4uPkZ+Slp+klp6siJ+0ibSarYrKh6quiLeFjbCDsa6DqY2mmI2dfKiPcnt3m46mlmiVpHm0i5+epqiSmcKBf6uImKFxnoCZpH2XhZWxgKF8oZSgkJiWgI6Tm4qXkYt8hZOGjZWTiYNtc5GFf3pyhoGEfIR0hYKXgY/FZoCph4+ja56DoZmCmYCLjIOJmHCOkoVod3R7dmdodXBnZ2xeY29sZ2xYZ0ddUUwyRTQ2TWBjNyYzPERHRDo2NDY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQEpkWV1jZmhnYmJiYmRjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS5sKqrppqUoKOkqqOWpKm2o69/oKecpZ6diZO8mZONoJGdkHmElpaRh6uZm5uaooWPjHebnI+gkYiepJuVmJeGoritpZqcjIx/Ym2Pi5OQjZCMjZiLkJGfj5OfoZmhqH6hp4etnaCWro+enZ2RhoGgjauvhqSNqpqMmn6idoCZk2qBq3VNq3iHjZ2Rm6ingKqrfYOhe3qnaZ5/kmtnl4aXtomefW5gZFmDln6Me2RoinKZfXmVbF17l21fU3CEXF9seYNgWWWCfYSBmHGnqmuDo25ypXCfg55pZZ9sW22Je2VZX4N/YldQb3ZlbXRyampvXmpvbWxpWGlPXVdFOUE0R0NeazQsSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl9jdmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBjZGNhYmlrZGJkZGdkYmdlYWNomJadoLmhqqOmrJKhtryrrqKZl6Chpa2toJyttaKokqCfn6abmY6YtJmQip6MlYt1gZSRjYqmlpWYnp9/koWGrKSHnJGKmKiXmZqRh6WwpqKVmoiJgGluiIeLjo6Ki42Si5CSooyTnqCcoqV/k4GPo6GUoHeclo+ng6Gnf4aprYWleYp9hJp9onByk4eVep2MeW2HnIyZkJuomo+HnXyConN2pmaefnakX5h6fZJzom6Yt7S6c5KHgX+1qGSBxrh7cJW3i3GAm6Rjc6yrYH1qnbN+bn2Hg46Ci5dxgKNsc6RznoN/pF+dmbOVcHyXnrR0c1uesoNqYm9zdXFob1hrbHJzZlxpXmJLRD1ENVFBWXEzPVNHX0pSPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWldgYHxkSEM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mauck6CNpLi1rq2gm6Kco6Olrpybsa2sk5egmKCkmZqTnqubi4iReIuFcICWjYqPoJCTlJ2XfZCJjqigh5iPipGik5uajIuoqKSej5aHhH5re4d/fY+Ng4uQkYmPlKCClp2gnaCfi4l3nJiijKByoouIqYicppCWqKt/rox9eqCZeqOTeIBzloeMnH2WoIebjpmbpoaiZKF8iJaQm41snmibjW6amXuAiqd9cmhzqYKcgnOqZ5SaXZuFdoSdaKpqgLhmXKhwgZxhlYxep3Z1iYp/nmiadYeTkpiOf59umpBsp5lcqH53u2t+qluOhF20Z1xucXl3a2lbcWp4eWJfZlhiQVBFTjdWQlJuNEtaWl9OWkNAMTUxOzs3SD86Q0dUP1lSWV0+RGJeVmBRYWN9aUVCOU5bXVhkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtpuoiWOUm6y6srCsnaacnKifnq6bnbCoq52Xopmhn5iWlqCjmYaJjGqIgHF7l4iLlpaEkZSYj3qKhJaknYqUj4WLnZGcm4mPqKOgmYuRioCAaYGGeX+XjHuIjo+Ij5aaf5Oin6Cik5hyaJ+Kn4+McJKMgamImZ+jqKCofbCto6K4l3ejs6Kjf4iUeJ16q5p/oo6dm5eJl3GhfIWNr7V9a5qRoXh+mLSjo6uohJl8mnycmX5zqlpdb3uWi3ieYkx+enqFY3mXQk2fWaJqcXyObYGJhJl1m3mHibGzf3+bk6d1gJ1tcXyUb5lyaqRdlXZIZWNgc3B9fW5lYGxodnxjZGFRXlZdVFZAWUVRZ0RTV1tiWF5JRD1COD9COklFOExEV0FWUVtWREZiXFpgS2BtfnFFQzxVX2JaZWpWZ2htb2JmZl5hYVxdXmFoYl9lZHZsXmVnZmtkZmxpaGtpk52Asa6ZhFNfoKezubOzqZqijJyrnJypk6GrpKGoj56dnJqZlZihnZaHhol3hYFueZWFkJqLfJGTlohygImToZxzkZCBiJiUn5qEjqicmpSKi4p8g2yFhXGBoYx4hY2IiJKZlXySpKGfo4iuhn21hI6enXullnqpgpadkIqhnX2naHZtfpl0oXNxfJ2FmG+Tgq59pIOmnpqBo29eqGd1o2NvpWGc05B8epl4cnNjo4WQfqJyoo51a4+zi2CCmIlzqrKovH93g21+vqaptF6cbn1xl2+Bc6JyXaNndKZhaKZtm9SZfIObb3d5l2ubeneXc22ppGdgZXlwf4NrZ2ZkbXV4Z2BiU1tlUVFiSVdJVF9XU1tlalxkUEVDS01KS0JKRThQP1BNV1NYT1JSYGZlaVJjd3l3SUZFY11kWmhpVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJebf7GrVFxLfqmvsbSws6OcmIWYqKCgo42kqKCYqYmZl5iTmZKSoJiOh4V7cH2EaH2PgpSagXeRjY6Jb3+GkJOSbJeUfYiQkaOVg46qmZSSioWJeYN2h4Bugp+Gd4CThoiZopd5k6Kkmp+Js6Gitot6rKekrqVwqYGakIWBnJJ8pICimYaYcp6Eoq2uiZeLf4ykjZaDrqKUdrW2tcmhc5SKgZ9gnZepbXmVhp+adaGHd6B+kZaKgG9MZqOScJqHcqR7eXRhg4JsfqBrcWRgnHJ/dJdpe2mztbTGpnOYfnudapubq3WDmmx0d5dpmnp1mHJQRH2zXmp2a3iHZmpnYnR0cW5WXlRZaE9SaElVTFlSVV1oa25WZ1dNSkFKTUtISk5BUUpQZGNpbWV0cnN+eXtudYl7e1RQT2xeaFtraVJqaGlsZ2xmY2VfXF1cXmliZGhre19dZGhjamZvbWVpbGWhnImwp4RmP5Shsquvr7Wio4+Al6mioqWMpaednKWCmZeWjZeQj5uSjoiCeWp5hmWDjH6WoHl1j4iMgWmEhZKDjIWdjXqMipSlkoOXqJeMkIqBiXqAfYt4cJChhnmBlYeJlqCWf5SlqJyWloRnbnicbKJkfHGld5yYcGengZeMe6V6n5aDl3KedoGJlJaPuW6QiqJifZmilYhtcmmranWgbW6mYJtpi5BoloealXWigH2aYIuFjHVviGJooGWefmmadW9jZoiCbnKiWl9bY6FuXYmMb3t/c3JkpW13omRnp2iYc4uYbqFvU4iPb6BfZadUi11UmG1tc2txgW1waGt4c2tvUlhXVmZZU21JWE9dSFhpaHNqWWtWUVJFVlxMWFJhVGhqXnd1enxwfHxyg3t/cnaNgIR2XlFyYmdicGdQamhoa2xuZ2RnX11eXWBrY2ppdnVdXGNpY2pqc2xma21jnKWZpnpldG2Lp66kqbCxpp+LgJernJ6ljKKhmqKigJWYk42aj4qXkI6Le4dxgIhoi4t7l5pzdIp9kHtkgoeVioqVmYJ8iIWWpo+BoauQhY+Jgop9gICPc2iPpoR9hpSNiJigjoiSqqediaZ4lpx+pYmWjLKYnpCDr5efpXiWiHqpdKWPhJpupKKMkoSMg7xufKWvgoaGh5OWnJ98pXpxqJWglmeefm+rY5aKlZJ3qGypooGJdYeCd6uRpohrkbBrdrOMqWuKhm5tn56SlWF/q4uqdoB/jKafd599haWVnaBpmod2rGeerYy3c3e+jaSTWYOmjathdXJzb3t0cWJqfm5obVNWW1VhYVxrTVxSXUldbW13YFtxWVtgWmdzZW5vcWNxdGB3en55cnmDc4R/gHt7jIGCgHZieGRjbXNkUmxnaG9scmlmaWFfXlxia2JtbHpvXFxiaWJsandtZ2xuYpWmqp2BgJ6klqmqnainrqOZiYKXq5qepImapZ2pnISMmo6GnJGFko2LjHSGeoiEb4yEfZeTdHSGcpKCbX+LkoeGlI98e4GFl6SNf6WljoGNiYSUdYKHkm9si6mBg4uUjomcn4mNk6ujoJCAdZSXiH6BeZSuo3+Bm3GPhnmQjIR/e3KmjHF9fXqXlpuEjnh7fn6IlJWTinaQmJ+gg3p9iWyMhVt5eHF5cGhufpKJcX90go+Uk3GFhIJljX9fgX+Ld3VzlHVveW5uh22Ehl53aXiNZoGCho6pm350fJdqiYhwgHZ8hXZtbGeMc3l7mHiEW2tYeY9obndycW93eG9dbIZuaWdWWmBXXGVrY1VhVV9RX3B4eWxrdmVqa2p2fHFydHNhb3Vic3uBeHV5gnWAgH+AeIuFg317bX9sZHhuXlduZ2h1a3hqaWpkXGBaY2plbHB1blpbYmtkbGx5bmhsb2GOlLmpp4uhopqmpJmknKuioISEl6ySnaCJmqaaqJiCgZuKfpaTh46JiI1ygnyPfX6OhHqXj3Ryg3CVhXt9k4uGhpCFeH5/hpiijHumoIuFj5CElYKGjpd3coWqho6SnJCInp6IjJuooKCrg4mOlJp+fomWraiPk6aQeHCdkYN7km9+qIVwfZVxa3B8gZ+Lf5KOjGhtXYOLjJubno5zlYuIcXRrgnZzgFlyboeQgX1+jGpdamR7hYOIgF9peHube4KLgnaBhoJoeYuHa2FxcoN3X3OMgomQp5WGZoyPg253i4RwhY15b2VnZHqDepZbXGpnbnZbe3h3dG1zcoJmXG2Ka2xiWVleWlhscVtfYFpeXWZ0fnt1b3Rja2tqe3xye3h0ZG10Z2x7fnZ6fHt6en9/fm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtoa2pxcm1XW2VubGdzem9oam1gjIyqsaKQo6Ganp6YnpmooqF9gpitjZ+Uh5uikKWVf3uXhHySmIiIhoaKcnyAi3aFi4GElYpxb4BymIaEfpKEg4aKgXqAg4uano+CpqCGeI6XiJWLi52XhIN6rYKRmJmUip6dh4ihq6CioqOLiJObnKOZlqqhp6agkpuIl458eI6OhKd+f5KRkpOcsaablJ6QjbKTmISljIyVm5+JkJuCiZGKa3yNdndlgoWQinyJnYSHi4+IiICFhJB3fHl1mqGIhoqfi4WUf36MgYB2cHSGhH94iIeLkKaQhIWNiIONkIx8h4qIj4F2bIKEfHmZanJoYXSKcH16d3Zvd3SBXV5vhmhuX15aXF1TaHFVY1tcYWxodXx8c29wZGtqaX97bXh/cWlvcGxmgHtygoB4f32AhHptg4yGfHp4fH16g3lOZHZrc21wemRrZWJiYFt0ZnBmcnJtVV1sdG1oeXpxZ2lrZY2InbqflqKhmJWZmJSZpKCee3+Zq46ejYWfnIqelnx4lIJ7jpmJhoSEhm14gIBygYd+iJOEbWx+epeGhIOQf4CGhIZ8h4ONmpyShqmeg3KKj4WSkYudkX2Ne6qEjZKYlY+cl4aGm6egopqdhoORmpmZkJqmoKadnZCWgZGKd3yHjoSle3yOkJGGmKmhnZOcj42qjpGAnoyJk5qego6XfoaNgm94hXF0YH6Cj4Z1i5eAg4+ChoR+hYOUbnl1dJKii4yFmoSEjXSAinx8cnJ7iIR7eYyOhJOnj4aEj4GEi4qKd4WHiYt8b2t+gHttaGxtZ155f2h8e3Z0dXV7d1xgcH1udWBjWl1eUWZtU2VaXWFqaXZ5fnFrbGRrameAf2xzgGxsdG94boR5boeAdoKAfYR2coKNiH57e3x/e4KKYGl7anVoaYJkamNgaVxkdWhvYnVubFRjcXllcHp6c2VpbW2Lip+3mqGjn5KRlpeLmp+fnnt4naaQm4qGpJSLmJl4eo2Fe4mRg4yCgYJtfH54c4CFfYqQfGtofYGXiIGIjnx+hoSHfI+Aj5qbkYimnH9wi4qLkoegoYqFjHyokYiPkpeTlpN4jKOhoZ6Wmn+AkJqYk4ybo6GkmpeRm36OhXmAg4+HoIB9jIyPfJekoKCSmZCPpo2PgZuRiZKXm36Skn6GjYF1dIJwdmB9f42GcoqVfIiLcox/goWGjmh3cXiMmJKPf5d+iIpzgod8fHB5e4yFenuRjYOWppOLhpF8hoeHhXWCg4iHemVye354enBsamZefXNofHV1c3xygGpeYHR2cHhkY1lfXlJraFRkWV9hZ2p2eIFxZmtjbGhlf4BqbX5obnFrfXeGemuMgXOBgX2BdHaCjYZ+fHt/gX1/j2pyg25zaWGHaGxiX3FWdG9tbmB4aG1XanR2Y3V7e3Jiam55iY2fspKlpZyOkJiPhpygm5x8dqSgjZd/jKKKiJqWeHuGh36DiX6IgoB/cX96dHWChX6JkHhnY32Gl4qCio14fYCMg3mWgJWXlYyWn5p9b4uBkZOGppuHjImEppWFkouWl5OSdpGeoaGYlJd6fo6Yl46Wm52knZmTlJx6kIWDeISXjZ1+gYmNjHOXop6hkpiOj6KMi4OWmIOSlpl+mI18iI2BdnF9bnpkf3yKhXCGk3+QgmyHgoF/iYRldW98h5KXjX2TeIuJfICHfHtxfniKhnmFkYqLmKKVgYSNd4mFg4J2e4GJhnZfeHd9c313ZmxkYX5pandzdHR9cXxiY2FzbnVzbWFaYF5ba2RSYldgYWhrdXiGcGJqY21laHyDbGh0aGxvaH98gnltkIZxgIODf3N8g4yBf356goN+fJBtdoh0dG1limxqYWN1VoRpcW5geWdsYmp2cGZ5fHpxYHJshoWQnK2XpqiejY2Xh4afk5eYfXeqnIqYeZeci4uYj3l7gIt9fIN7gIKAeHR4enN9gIN/iIuAZF59i5WHf4WHdH19iX99l4SWk5aMo6CXfnKHepORiqePjI6Kk6CRg5GQlJeRi4GPmKCakpCRdH+NkpSJnZ2ep5iXjZWWdI6PimyGmI+ZeoeIkIlvl52ao5OVio2fjIaBkpx/kpKVhpmIfImJgXpxeWt1bHt9i35uhZKClHdvgoN9fop/ZHJqe4CWl4R/jXSQiYN5h351eIB9h4F9g42FjZSkkHiFgnSJh32Ac3WAh4NuYHt1enF8b2FuY2R7Ym5vdnJ3d3N0YXZfb2x1bm9cW19dXmpeT11XY2FobXN6iWtfamVqY2h3h21mbGhpbGiAfHp3b5CHc4GDhH1zgYaJeoJ9eoGEfX2OcnqKeHhubIdraF9pcWOHaHFvZXdobmxheWhrfXt4cGF3bYuBmZqqoKSonYqKkYaKnoqVl313rpiMln2ek5GWk4h3fXuKfHyAdnd/gHB0c3pvhXyBgIp+fGBcfo+Rhn+DhHN6f4Z6j5GHkZGbkqSblIF9gHuNipKkiY2KjZiajIaRmJOWjomJjJOdk5CMjW6DkI+RiZ6ZoqGXlomWkW+ImoRnhpmOk3qJhZCKcJWalKGSkoiLmYyCf5CefJKPkouZjnuKhId0c3VrcW51e4t0boWQjpJxdIB7gYGIfGRxbHl9mZR9hIh0kIuBdIh5b4B+gYd8hYyJhY2VqI17iH1+i4V3fnBvgIWDY2h4dHVve2JecGBqdF5xanp4eGxycGV4XW1sc21zWFpeX2FqWlBXV2VjZ3Fxf4dmXWloZ2JncY5vZGlnZWpogHp3dG6OhXSBgYJ7dYKIhXeFfHiEhXqAiXd/i3t6cnmDamtfcGh0gGtyb21xZ29sZXxjboB5dnFsd3eKf6KYoqihppuHjIqBkJyGk5x0gaqUko2GoIyWk5B/dHt2hXd4f3Jze4Vrcm95bYp2gICGbnFbWX6RjYh/gIF2dYB/f6CGj4qRnJegk5d3iX6AjIidnoqPhpKYloWJlZmPl4yLjY6NnYqOkINtiIqQkYmclqGbmJWFl4hqhaODZ4adipF+i4OLgXeTmJGekZCIiZWNf36Pl3yRjY+NmpJ8in+CbnZwbG1ucHuFaXODjpeKcHd/dIKJgnhmc292gZmOfImEepSReneIdHCJe4aNe4uGhImPnKOIfIR3gouAeHhuaoCCgV1yc3Fwb3haXnBgcGpeb2l8eXBtbWpsdmBwb2pybVlYYWFhblhRU1pmZ2N1cISCYl1qbWRiZmuSbWBmZl9oaoF1cXJwi4B1f4KAeHWAi4B4hX93h4Z3g4V7hox/e3aKf2pxY3xihnxvcWx0amhvbHZ3X3F/eXt0dXSAgn6klZqtn6eWhYyDf5eUg4+fdYqflJKGipuMlY2LenJ4dIFwcoRzcXWIbG9sdW2IdoN9f21uVVGBq5SHgniAdnKCeYGggZGBkpKXm5GaeJF6goySpJqTjomVmZKEh5eZjJSMiY+PiJ6FkIp8coqFiY6InJqfm5aUf5R/aYadiGeGoYiShJGDiXGDkZePmo2PjIuPjXd7kpB6jouMkZaMfIh8gGt2am5ra2x6fmF5fo6VgXZ6gHeDjXx5Z3RsdIeVi3+IhnuUkHF6hHB3jHqKjXuJfoOMkZ+dhX18eIKMfXZwaWuBgnlfd29ta3FzVl5vYnFhX2xueXBncGZmc3RocWthd2VdVmZhYHJTUE5cZmVdeHCIfF9caHJiYmVmkmlfaGRbZ3B+cGtwc4p9dnyFgHR1f4x5e4aBeIiDc4aFfoyMg3t5lXdmcmqCYIh+b29remBqbnR/dF90fXmGeHRzhXx4oI+ZsJylj4KKf4OaiH+Lnn+KmZOOhIiYjo6PhHZ0dnOAcG+Fc3Bxg29raXZtgm59fG10c1JOgt/IktaTfHB0gnWDn4KTd5SQmJqPmHuTcoWQn6GTk5CJk5uUhn6WlYiNjYiRjYicgI6BeHqMfoiMiZybnZuVk3mNdmiJkodsiKOFkoeXg4ZjjJGYjpWJloyNiotxe5SJeo2IipKRiXmFe35se2Vyb2preXlbgHmPjYB6fX5/ho56eWhza3OLj4qChYV9lYxsfn9vgIx/jId9hHmBj5aamop8d3iDkHlzbWZwf4NsanRvaGlzbVNeb2RwWWBrcXdma2piZnhycHBjX3hgYFZrX112UE5LYGZjXXlxiXRdXGV2YGFlZY9kYGZhWGlzc25rcXaMfHR5hoJ1dn6Lc3+Gf3uJfnKJh4GQioh8fph2ZXNte2WHfm9wbIBabG55eXNhdnp7jXZyd4p3eZ+Lm66boJCChXeIlX58iZyHhZ+QjoWMl4STjoeBdXdweXFuhG9tbn5yZGR4cHxten1qaGxjpJrB3K7voXNrdYN1hKKFkW6Vj5Sfk5uBkXCFi6OXiY2VipCdloOAlZCFiY+AkoqKl3+He3V/iXiGhI2bm5iZj492inZuhomLfYqjhJGJnYWFXouUl4qOiI6Li4SJbHyWgX2IhYmQj4Z2hX19a31kd3VqbXhzV4h6kYaFen5/gIWLfnhlc2p/io6Kg4J/jJaFa4J1boiRgpGFf4J5f5CWk5mQdXR4iI11c3FndXmCYnRtb2JodWdSYHFnbFVfbnR5YHJjX2h9cHJuW2NyYWJXbllcd01NTGRmYV52c4ltXFxkeV5gZGaFYGNiXlhqcmtua3J2jH10d4SBeHd7iXGDhH1+iHt0i4mIlYaMfn6Yc2h1cHhsi3pudHCBWHF6dnlxZXd5hoxpdoCJcn+ch5innKOShHxwjJR4eYudhIWhjY57lY1/mYiEe3J3cHNqb4FraWx8dF5geHZ7cHV7Z2BlfOvatcnD3IhzbHOAdoqaiI1pl4+OnJSSgYhwhYigjoWKlYqNmJR8jZOIg4mPe5GLhpCCf3Z4g4Nyh4KSm5aUmIaMdod/cIWCiYeZooOUjJ6DiWGDlY+GiYaJjYeAh2l9lH99g4SJjo2CcYZ+f3F3aHVyaXN3a1qMfZKBhXx/g4CEioJ1YXRsiIGPi4J+f5KRfW6CbHmGkIaThH2BfH+Sk5CXiW9yeo2GdWxwa3J4gF9zaW5canZgUmRyaWZTX3B2dGBvYF1ognFzaldnaGNpWG1XW3VMSkxlZ19icnOFaVtcZXleXmRne2BkX1xZa25lb2pzd4p+c3OBfnp2eohzhYJ8f4Z2d4qGj5iCjIF7k3ZsdnV4eJN0bnh6fVh5hXGAb2d5d5KCZHaGhXGKloWZoZuiioZzb5KLcneOnH2KmoiJe59/g5l/gXhxc25vZHJ+aGZsd3dbX3l7enFxf2lhZ2F/1baOkKZ4bnF3e3CSkIyHapiNiJuRi4V7aIeLmYaBkpGGh5iNfI2NgYGJjnyQjH6KhXp1e4J6cIaAlZmOk5SBiHWDhnaDgIuTnZ+GlY+ffohhf5OHhIiEiY1/f4NnfZB/fn+Ci4+Qfm2CfIJ0a212dHN2dWtjjYGOf4V+fIR/hId+cF9zcYV8j42CfH+SiXpxg2Z6hIqHjIN8hX1/lJCRk4RucHqMf3Vtbmpsen1iaGppWGx1WlJpcmpiUWJyeGxhZV1aaoNtc2JcZ19kbF9uVFpvTkhPZ2VcZ25xf2taW2NzYFxjbHdkZV1cWmxsYm1qc3aHf3Fvf3x8dHiGeIWCfX+HdXmJgZKVfIiGdomBb3d5e4STcG18gXdeg390gW1pe3OUc2dyiH1ykpGDmp+boIaHdnaUfm12k5d9h5CDio2afIuadn12cW9samF0fGdiaXV6Wl93fHptcX5lY2hoV52PXnFylrzDg3VxlIiQfnKWi4ack4yHcmqIj5aAe5SMgYSbjHyLhn18iYx/lIh1iYV2d32BcXWGgZ6UhpWPg4Jyf4h1hHyJmJ2Yh5OOnYCIZn2Tgn+Fg4mJcoF9Z36Le3h+f4eLjnxpgHyDdmVveHhydnNsao2FioGKf3iBgISDf2tecnh6fo2KhXuCj4B+coBpeYOHi4aEeYR8gJeNkIx9bm17iX13dG5oZ3x2Y1xwYldvclNTbnNpYU5mdHhlYF1cWG6Ab3NZZWJdam1gcE9Za1FEU2dhWmtubXtuWVtebWNaY293ZGZcXWBsamNsanN2goNxbn57f3R1g3uDgnyBhXZ+iYGWkHiDinSBiHJ4eX6NkG9vfIFxaYF5en5tbXx2lWtqd4R0bJSNhZ6YoJmFiG59jHZqeJiOfoGKgpWXinmOlm96c3BsamRgdHtoX2Vxelpgcn15Z3F6YWVlj7Gyd0piWqTZ0JZxe5CKkHd9lIuEmZGLhW5rhZKSenmShoCEmIp8h394eImKhJaAb4yIcXR9eml5hYOlkISTjYN/b36DdoR5hZuYk4uSkJSFh3B7koJ9goOJg26BeGiAhXhyf3+CioZ7ZX1+hHVjcHJ/aHhwb3WYjYWCint2eICEeYFrXHF9coGIhYl9hol6iHKBbnGEh46EhXOEeICZjY2EeG5vf4R/dnplaGp9cF9Zd1pYcW1OV3JzZ2BLbHZ0YF1bW1l0fXJvV2ddZmpxX25OV2hRP1lnX1twamd4cFpaWWtlWWNweV9oXF5lbWhmbGlxd3+Hb2x/fYB1b4J7f4F+gn92gYWJl4pxgo1xe4Z8eXmDk4x1anp/bG9+dH99b3J8e5RvboF/eGaSioKhmZ2RgoZnh4NvZ3qViX5/hYGZioF8jYxpeHJrbGZfYW94bV9ib3hcZGuCemFxdl9lZdTqvooyOj6LjoBxeYWHjo12g5aMfpKNjH9tbIWNjHZ9j3+FgpWJfIN4bnaGhIOXd2+IhWt1e3RmeYKDp4yDj4uEfW5/dHaDeYackIyQkZKMi4Z+e5KGd3+EjYNsgHJpf354bXx7gYqDd2J5hIFxZHFofm10cXWBm4uAf4V+cnV9gHKBcFttfnR4ioOLe4eAfIh4enFsiIOQhItygXl/l4uLf3Rua3Z/gHV1XGlod3BZV3xTWnBlTFpycmVbSnB3blxaWllddH51aFliW2dmbmNpTFdmUT1eZlxddWVfdHBaWVRvZFlkcXlaaF5fZ21namxpcHd9jmxpgoR+eW6AfH2Bf4J6dYKBjZOFcICLbnh+gHp7iJKJf2h7fWp0e3KGe3N3fX+MeXiEfXxrjIyDm52WjIGAbI5+a2h+jox7fn+DlIJ/fYqIa3VxZ2hjW2Jncm5gYWtzYWhwiXlhc3ReY2SboI9uXDVZr7V0aYCIfJKGdoWWhXOOiol3cG2Fg4d1eYl4iX2TiHp/c2d2iH5+mG9xhn5odnltZXmIhKWHgIeNiX5ufnZ/gHyMmYeCk5CYiIuEiXyPiHB7fYR7aH5ta4B7eml6doGHgXJgd4F+cWRyZ3WCbXR7hZSRgXyBf253eXx0fm1Yb392dIyChneIdoKJenhzbomBj4GFcn59fpOJiXpubmptgYJ1bl1nZnNxUVt7TlxwXE9bcnBkVktzeGlXWVlaYXGAdGBdXWBnZGhpZk5ZaE1AYWRbYHZhXXVtWFdTdGFaZG9yV2peYWhrZ21saXB3fJJraISJfHxwfn57gYCCeneAgIqLg3F7h29xd4N/e4mNj4Nqfntud3l2ind9eICCh3+Dfn56bYWMiJijjYSDe3WLeWtshIiReH17gZGAgH6Kg3BycGNmXllnX29wYGBncGZqb4p0YXRvW2FkanZ7f76cpqPIuHGFg3OTfHiGk4JzkYyHcnJwhHuDdHWHdIh3lIh5eXFjd4Z6gJNpcoR2Znd2Y2p8g4iegn9/jo59cn5zhHmAkZCCeJaNlI+Igoh7iIlreHl+dWd6aGt/eXNpenaAgn1oYHeHfWprdGh7f2l2gYyQlH56fn5we3Z7dH5iVnd9cnOKhIJ8g3GGind4cHCDgo1/fXl+fXaOhoN2aXFpbIeCcnBdaGNzbkpldUxeblVUWXNuYlFPc3hgUlhYXWJwgnNbYV1oZWRjamRRWnBJRGRhW2NwXl13aFVXVXddW2VuaFZrXmFqZ2Vvb2hwdnqSbmmIjHl9cnt+eIGBgXx2fYSIhoNwdoNybneCgn6Ji5N/cIB7d3l6gYx0g3h/gYGChHqAdW9+iYuanoh9hXp3hntndIWMkHp/f3uJhoR2j4Bnb25fZFxYZVltcmBgYHBsa2iJbmBzaVleZG2Ad6naqceGh7JxiXhvjHV7ho6AepOJf3V0dX53gHBxf22EdJSGeHVsYHqCeYiPZnGDb2d2blttfYCQk4CAeJKSfXh7bYd1gJCLhHSWipGOh4WFe3+FbHR2f21nd2Vte3VtanZ3f398YGJ4hnpodHVjfnpndIWOjJV7dH91cYB6fG1/WVZ0fm91hId/gHlsiIZ0eGt1f4OEfXt9eHtzi4F9c2d0ZW2KhG10W2pfdWRIbm5MW2JXVlV4bWJQU3R2V1BVWF5hcYRvXGBjbWVkXm5iVFxyR0JmXl1maF5be2JRVVx1W1tna2FWal9gbmZma3FocHV4jnRrjo11f3Z4fneBg4F7dH6EiIeDb3F/dHF1foWCiY2Ke3d/eIN8fIWHeId8fYF+hIB7fnN2eYyOn42Jeol2dIN5Xn2FmYx5hoN0hYaFd4l7Ym5sW2JbW2FWanNjYFtnbm9mh3FhcWZXXWNrf3zKzoi5omptbYpscYRxfISJfnuRhHl5dHl1dXtqbHVjhHWRgndwZ159gnqLiWVygmtqcWNYbHuGnIiCgXOXlHd+e26IcYGKi4dxl46QiIWLg3t5fnFxb31maHFibXhxamtxd3x8eVxleYB3aXV4ZoJ2Z3SHi42UfHKGaW9+gHlufF1Ycn9tdICLfIJvb4l/cXZod3+Bf4F3fXF6dId8enJmc2FujIJsc1hrX3dbSW5rTVZVXlRVe2thT1R1clBRVFZeYnSFaFxgbGpmY1luYVhicEdBaFxfZV9dVnteT1ZkcFlbamhdV2hgX3Jma2hyZ3Byd4Z4bpWKdH96eH55goiAdXOAhoWNgnBwe3h3dXmGhoaLhnp8f3WLfn2FhISHf35+fYd/fHh2eXeSk59/jHyLbXaAeWODh5eGc5KLb4WFgXqDdGNuallfW11dVGdzZWBZZHFxZoFzYmtlV1tgaX93vq57oLdtYnOGaHN7cXmChXt9jH53eHN2b3t2ZWpuYId1joFzamJefnh5i4RmcX5oamtaVm94iqSBhX9xmZNxgHh1gm2AgpGHc5WIjIiEiIV9eHRybmh5YGptYG12amdqa3l3endbZ318eGVyfW6EdGR1hYyGlX9vi2ZreoN1bXRiXG98a3V8i3yBZnWHfW1xZ3V+eH5/cn1renqBenhwZmxibol+bW5Wa2B3VUpqa09STmhOWXxoYk5VdWpMUFRVX2d2g2ZdYHFoZ2FXaV1ba2hKRWtZYWNXWVV5Wk5WbWpZXWxlXFplY150Zm1kcWdyb3WBd3CZhXZ/fnd/fIWHfXVzgoh/lYJuc3h6enNzhYeIiIR5gX12j398hImOhIKEe36Lg3t3fHd3mp2XeoqChml3fXxsg4STgHKPgnGFgn6Bf29mbGZXXVtcW1RkcGRfV2NydWl1cGVlY1dcXGiAcG9ygHSJZGR4fml0dXNzgoR4gIR5dnR1bmt7cGFna2eGdI2EbmZdX31we4l+aW13ZmlkVVdycI2mfIR8dpaQc3tzfHpue3uQhXaYfIeGg4aDfHRwcmxndVxtaF9sdGRnZml6b3tyWWeBd3VncIB3gnVid4SKfJSAbotqbXqBcWZzZWBtemdzd4p8fmJ1g3Zpa3F0enF5eXN9Zn5/f3l3bmNmYm6GfG1rVmpicFNLaWtPTE5wR157ZmFNVXRjSk5TV2Fqdn5lXGdzaWZgVmNXYnBdTEtrWGNhVVRVc1ZMWHVkWl9rYVxbY2Vfd2ZtYnBpc25xfnR0moF3f4B3f36GhXp9dYKEfpeFbnJ0e3p1cYSFj4GAeot1dJGAfYGUjoCFhH1+jIZ7foB2e6OlinmJhYNrdXx7dYOCjHpuhXN5hH2Bg3VuamhlVl1bWlpUY25lW1hic3tpaG1pYGJXX1ppgGprb4BobGFoeXhqc3R0bYSBe399dnVtemhqeWpfZW5ogXaPhGdlWGJ3aX6He29pb2dmXVVYb2iPp3aBenyQjnl1b35vc3V5j4B3lXSFgn+FiHZqcnZnaG5bbGRdbHNfZ2FpeGh7bVptgnJzaW+Afnl3YHeEhHiPhHKIcW95f3JjcWhcb3dkcXOIfHhic4BwZ2p4c3JseHd1d2SDe393dm9kZGNufH1rbFVpYmZTS21oT0dSa0VheGdhTVNxXElNVFlla3d7ZV5tcWlkXVZfVW5uV0tUaFdmXlhOVWxUSlx5X1tfa11dWmJlYHpobGFvb3Vtb3Z1eph9d4CBeoB/h4Z6eHqDfoGThHF0dH56dnSFiJB9gH2Qa3OVgXyDn4V/h32AfoaCgIp7doSsn396iIeDa3KCenaAgIF1bodvfH9ziYBqb21kZFhfWllaVWJqZ1taXnWBaV5ubFxhVlxca4FmcnR9aWpda3Z1Z3R3cWyFe319eXZybHpoaXhmXWRzaHp3koFjY1RlcGeChXd3ZmhqYFdWWWhkkKdufniAi456cHB8Znlveox7do5xhH1+f4ZuZHZzZGhoXGtiXW9vW2dfbHVkemhddIBvcmtxe311dWF0hYp6h4Z/f3dydX91YXBsWXF0YnFyhXx1ZHJ/bGFsem9qaXp4dXJmhXV6enVwZGFkbnN+aWxUaV5dVEtzY1FHVmFHYnZmYUtUb1dKTFdYZ2t2emRlbnFmY1pXXVh2ZVRKXGNXaFhZSVdlUUhieFpdX2xbXlxhZF5/aWpgb3R4bW9tdoOYeXKBgHx/iIuGfXV2hniHjH10dXWCeHp6goyOfX6EiGpzl4F7i519foV6gXp+fIaIc3GProx7e4ePfWVyiHp0fHx2cm+GbHt9bI96YnBvYmVdZVZZWVdkZmtgXVxzhWhYcW5aXldaXGx7Y3B3dmxiW2xyc2d0dXBshHl+gHl3bm50ZWl0ZVtndWZ2dpF6X11SZWZqgoJ0fWJjaVxUWF5iY5ClaHl0goWQeG1ueWd4bXyFe3WIcoB4fHh/aGV2bWBmYF5qX11za1llXW9vYnplW3d7a25ucHd4c3RkcoOSfoeCiHp2b3J9cmJ4ZFtvcGFxcYJ8c2ZxgGRebnZpZGd5enRub4F1dH1zcWJfZm5vfWRqU2hYWVRNd19RSllZSGJ0ZGFJVG1TSUxaV2lscXtibGxzY2FaWlthdltTS2ReWGlTV0dZYE5HaXVYXmFtW1tfYmJdhWhoYW54eWxvanaBkHltg36AgZKIhIF2dIl0jIZ0cnd2gXd8fX6Mj4B+k35weJaDfZmSeYCAeHl9f3SIg3NwmaJ7e3+IlHhkdYh5c3h1bHRvfmx5fHCRcl5wb2BnYmxUW1pXaGNtZlxccYhlUnJuW1pYWGBsd2RpdWpqXlptc3Fsc3NzaoV8fn98d25ubGRpcWNbanJkdHaPc1tXU2RhcoB/coJdYmNdU1pgW2OTn2VycYWEkXRsanlsb3B6fHtxgHZ/cnp6emRmdmddYlphZ1ted2hXYl1vaGF3YFt7dmppcm53c3N0aHCBlIKGfoR2cmpwfG1md1dca21icXOBenNmb35bYG9xYl9qcX1sbHR+c3F4a3BhXGVsbHphZ1NnVVdSUHZbUlBZUkljc2JgR1VqUEhQWlVra2t8ZW1vcWFcWlhZbHBXUlBmVldpU1RGWlxPSHJ0WF9jbWNYYWBhXYtqY2RteXhrb2l1eYZ7a4N9gISZfIKEeX2Ibo+GcW93enx0goJ8i4+Dgpd0d4KUhYGfiXWAgIFzf4Fwh4J1b6KXdHuGi4Z7ZXiLb257b2Z4cHpsc3ZyjGtedG5hZ2VrUl1bVmdibGxaXHGMZE9vbl1WWFVnanRoYnRlZV1ZbXRtcHV1eWqHfH98iHeQc2Rka25hXG5tY3N4h2taVFZiY3h9fXGFXWNfY1RbYFljlpVjbnCDhYpzamh6bmVzdnN8bHp0dW96fnVfZnJjW15WYmRYYXVlVV9gbWRhcV1dfnBoaXNxc3B1dWpthJOBiHuEcXJmbn1wcm9TW2ZqZnF0gXdzYmx2VWJxaltfbmV8ZW12fHNyc2ptYFpkamp3XmZUZFVWUFRtV1FXU1BIZXJfYUZYaU5IV1RWbWhkfGlreGtiV1xVW3RkU1JXaFFZZlRTSFpaUE14d1tfZWxpWmJgXl6PbmJma3l1bm9odnZ/f2yDgH2Gl3t/iIGKf2uTiHJndIB7dYCDfYiOf4yTc3yKkYWHn4Z7f4aMc4CGc32Ddm6ljHOBjYt2d216jGBkfHBmenN5bG1xdoJnZHtsY2ZnaFNeXlRnYGxvW15ujWhOam1gVFZTb2dza2V4ZGVdWG90bHJ6d3JsiHuAdpx7emthZWxtXmBvamVweX5nWlZYYGt4fHtwhF9iXmdWWWBXZJyIYmtxgYd9d2treGxbdnFseml1c25ve4ByWGpuX1ldVWFjV2RxY1NeYWlhYmxaYH5sZmtzdW5td3ZraIWMf4h6h21xZnB8bXJtY1lhaGlvdIF0cl5pbFJlcWRUYm5iemNxdnt1a3Bta19YYWdodFxlVmFWU05YZVJPXE9PSGVwXWNGWWlNSV9LWG1kX3hobn5kYFVeVF10W1RSYGZOXWFUU0pcWVBZdXZdX2ZtaFhjYVtejnBjZ2p3cXNuZ3Z0eoNygYN6iI1+fIqHjnpukIp0bHOCdH9/iIWGkYSVj3l+jI+IkZuEgHyMhHN/gXN0eHFuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Njo6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjY6Ojo6Ojo+Pjo6Pj46OjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHx9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERFQjEvLy8vMC8+RERERERFOC4vLzAwLEiFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTUzHx0cHBwcHC43NTU1NTYnGxwcHR0YOoOBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJiYmZmSj5CQkJCQjIeHiIeHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhoWDg4ODg4ODhYWGhYWFhYSDgoKCgoKEioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkI+QkJCLjpGRiYeOipCSk5CJj46Nj4ePkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6Ojo6Ojo+Pj4+Ojo6Ojo6Ojo6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjIiGhoeMhomQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCRjYeGhY6Gi4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMio6QkI+Hi4eHjIiIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjISKhoaIhYmPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiIuKioyKjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpKSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHV2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoZ21namdoZWhnY2JiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpeXVlZXmJhXl5aWV9bWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVBRUVFRUVZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PUFBRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpISEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo7Pj48RUQ9P0VBP0BBQERFR0dHR0JERERGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs7PDxITD09QUBAQ0Q9QURERkNGRkRGSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dXNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTc5Ozw+PTs8Ozg6QEBBQj9BQENGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6OjY5Ojk6Ozw/Nz07Ojo4PDw9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Ozw9P0A9PT0/UT49PT08QUw7TEI5Ozw+PT4/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREA9PD5AQT9BO1p5Tz1DRT5EWDxZTjs8PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0ZEPjw7PUA9OTo6b3dZNzs6PEdePWBcOTs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BxcnJydHV2ent9fX1+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUNfSTw7RmNnX1d3d1g3ODg4TWJCZWg8Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAT3x0RkZ1hoaGgnx3WTw9PzxTakdnaz47PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUBVdnpwdoSDg4GCgH1ZPkBDPlNvTGRoPTs9QUVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQFB0c3+DgIGEfHyFbUZCQ0RCUmlkc3JJQENFSElJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFR2xzfYB5f4WAfYZzRkNERE1nfYeIiH5YR0hRUExOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHYHp/gHyChIaFhYtsQEBWd4aIh4eHiIJYUl5OTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTEtOXHyDhYSEhIWGiIBWbIWHhoeGh4iIh35pVktLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSUhISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpag4SEhYCBhYeGg4KFhYSFhoaGh4iGiXtLSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJAQUNDQkBBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWiFhIWEf4CDg4KDhISFhYaHiIiIiYmMjWZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc1ODg7Ozs9QDs5OTk9PD47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaYaFhIGAgoSDg4KDhIaJiouLi4qJiouMiVQ6ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JohYOBgYKDg4ODg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6Ojo6Ojs4OTg5ODc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXd5e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PnaEgYKDg4SEhISGiYqKiIeIiImKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8PDk6PDg6Ojs6OTk5PD88PUFCRElKTUtJS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7Pz1KgYOCgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUFCPkBCQEA+PT4+QD8/P0A/QD09P0I/QUE/QT89QEBAPj9BPT48Ozo7OTk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlWEgoKEhYSFhIaJiYiIhoaGh4iJiouLi4qKi4qLXj5ER0lLSklGR0dERkhHRUJBQENFQ0NBQkNCP0BESEVDRURFRUFGRUZERUZEQEI/PEA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0NFWoWCg4SFhoaGiImJiIeGhoaHiYmKi4yNjIyLioqIV0hMTU1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHZ3enh7fHx9fX5+f39+fX19fX5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E/QkNHR0pbhYKDhYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1PTUtOS0pMSUlJSEpGREdISElFRUhGRkVMTE1JSkdHSElKT01OTExOS0dHR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4ODw7PD06P0E+QEBDRklKUWCCg4WEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSEhFSklESkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJR0NCQUNVbnB1d3d5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6PDg9Pjs9QT4/QEVJS01WcoOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIuLi4tfUlJQTU5NS0pHRkJHSkdMSkZLT0xLSkpNTUxPUE5ISUtMT1FRUVFPT0pJSkpMSkxGR0hHRUdJRkVFQkBCQlxvcnd4eXp5eXl6ent8fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBSExNUVd5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKREVGS09OT1dWUVBPUVNSTVNUT01TTFBTVVdSU1FQTEpNTU1LTkdHSkZGSEpEREVFQkRDY3B1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQ0dWTkZPUVFVWXyGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMj4uLi2dWVWthRVJRUVBKOztRU1JgdV1VVlRWWVlSWVhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLSEhKSEVGSUhJSElpcnZ5eXp5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklJR0dGRT8/QUFFQkNHRURFTFhSTVRWVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A+QFZVWVxkYFZZYnJeXVZdWlZFUVlaW1lfVFpnUlVWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JWVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSVlYWVtdWFhZV1JRTlBRTU1PU1FRVVJhc3N2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUlGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ1xbXF1dV1JPU1BQUVZWVlZZWm5ydHd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlRTVF5aWFdXV3prWFpbXF5UUVFQSU5PV1ZYWlpkcXN2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVRST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTU5LTUtISkRGSEVDPlNjVX9SUVFOS1JUUU1PWVFNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXG1ydXZ1c3N3e3p7e3t9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJWVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz9DQ0NDQj9EUEJEQEM+QkhHVkBITk1HXWlRSEZPRkRFRkhHSEJDSEdIS0dDQkFEQE9QTVNkc3R1dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiW1hTUVBVUnNXZVtPT09MUVNRVVlTVVFRVFNPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz8/Ozs+QEA/Pz5rUUthRUZISUVCP0dMTUdNUVVJQkU/Pjw9PD09Pz0/QUNDPz48PUI+Sk1GVW51dXVzdHZ4enx6fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXklKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXt4enx8eHd4ZEJAQEI9OkJDQUFEQlxdT3tOT09OS0xNT09RTEtMV01IR0BCPDk3NzU5OT07Ozs4OTg5PztCSD9cdHR1dnV2eHp8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eYGVgXV5xdmteYGdrd29vbGpvbm5sZmJYR0ZGSEJBRklFRUZETVJQYVdSWFFQU1NSVVtPT1FXUE1KQ0Y+Ojo2NDg2OTc5OjM2Njc5NTxCPWVzc3Z3d3l6e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01MVFRTUVFVT0xSU1RXWFRUWFFMWFlaVlhYVlhZXVdXWGhza11WYXNrYWFfXWRhX15ZVVBNT05MSEhKS0lIRkNRUFNaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NTc1Nzg1OTlHbnF0eHh6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVlhUW2ZKTFBSUk9NTU5OTkxKRlBQVVlTVE5KT09UU1RcVlJVU1JPTUtJSEhGPz89Ojc4NzY1OTk2NzY2NVdwcHN4eXp7fH19fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9KSE9QT09NUkpPUFBQTk5PVExNSVBPU1RVMjxYTUlBUT1jYVFTUVBOUFFQTk5NUE5UUlBSTUlMS09RUFFSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjQ1NjY7ZXBxdXh4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkZCRkdHSEZKREhKSEdFSExIS0hGTE1QTUcvRV9SPjNAPmpvYVJSUUBGVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3NkRucXR2ent7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRUZISk5LRUdDT1JDOEVOU11mU1FTQUdVUE9RUVBNTU5MSkxLTE5PT1FNT09NSExMSUtLTEtIRkZFRDxBQT47QEU7PDg5VHFzdXl7e3t9fHx7eXx7en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUV1dVTExLSD05ODc7P0A+PD1AQEI9PkVIR0RGRklHSkpARkFBQEZIRUpPSFBSYVxRUFJOU09PUExMT01LTUxNT05bV0tNUU9HSUhDSUpMTEpGRkZEP0JDPjxCRj9CP0FkcXV4e3p7e3x7enp3fHh5fX57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj47P0FAQD5BRElFQ0hISUdJRUJCPz49Q0FBR0lETU9iZVFNT05XS0xNS0xNTUxMS05OU2RNSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES29wd3p5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEtFP0I9OTk5Oj9CPzxAQkFBREVHS0ZESUlHR0hDQz9CPz9AQT5DRUNLTVFUTEpJTVRGSUlKTEpLS0lJTE1PUFJQS0dDS0dDQkpKTE1PTUlKSUdDQ0NESUpNTElac214eXh6e3t5fHZycHVydHl5dnhqcW9qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxanFoZXFIS0RHSEhHSktJSktER0I9Pj06Ojo7QEI/PUJCQ0NHRkpMSkVJSUZHSENDO0FAQj5AQENFQ0lNUEdJS0ZIS0RISUtNSEpMSEhKTEtNXVJJSERNRkFES0pOTVBOS01KS0ZHR0pNTlFOTGNuaXZ2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkb0ZLREZFR0RFRUdFR0JDQD48PTo7OjpAREA+QkNERUlGSkpMRklJR0ZGREI7QkNDPj9DQ0NFR0xOSEtOSERIRUlMTk1ISUxHRUZJSUxOS0pIRU5IQ0dNTE9NT01OTk1MSUhKT1JRUk5SZmdmcm9zeHV7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pERkZFQkJCRUBEQj4/Pjo7Oz06PT5DQT9BQ0VHSkZKSUxIR0dHRkVDQD1FRUI+QUNDQ0VHSUlHTVBJRkZHS05PS0ZISkZFREVJSUhLSUZIUEtESU1MUE1PTk9PTkpKSU1SVVRST1dkYGFtZ3Byb3J5emdlaGhjaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NCQUJEPUJBPkE9Ojo9Pzs+PkBCP0BCREdLRklHSUhGRkdFQ0JBQUZGQ0JDQkRFREdHSEZMUUxJT0pKTEtJR0hFRkVEQ0lISEtKR0tSTUNOT01RT09PTk9PS0tLUFVXVlVUWGBeXGlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNxcmprc01HR0ZIQkJBREQ8QUFAQzw4OT0+OT88P0I/QEBERkhFSEZGR0ZGRURDRUNESUZDRkVCRUdFRUZHRUpNS0hRTUpLSEhJRUZISEVDSUlKS01LT1NORFFSUFFRTk9NTlBNTE5TV1ZXWFZYXVpdZGBoYmppZ2tfZWVnY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaW96TUhHSEhCQkJGRTxAQkJEPDc6PT46PjpAQj4/P0NFRkRGRERHRUNFRERFRkdKRUVJR0NHSEZIRkVDRkpKR01KTEtISkxGSUlLSEVLS0xNTk9SVE9JU1VUUVNQUU1OUU5NUVdaVlpZVlpdWlhhYGBgXmhlY2BkZWhnamloamZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN1bm9yc3lOSUhHSURBQ0hFPEBFQkU9ODo+Pj08PEFCPD8+QUJGQ0VCQkdEQ0VFRkdHR0lGR0tIQ0hIR0lHRkRIS0lHS0hNS0pLTEhMS01LSU1MT05PUlVWT0tVVlRRVFFSTE9RUE9UWVpZXFpZW15fXmBjXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZxdU1JS0hKRUJFR0U8QEdDREA5PD5APz4/Q0I8QD5BQUZDRURDSERGREdFSEhGSEdJS0pGSkhIS0hGRkxISEhKR0xMTExMSU1LTU1NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW1xeX19hYGFkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm92SktMSkxHQkVERTxARkREQjs/P0FAQEBEQT9CP0FDSEJFREZIRUlFRkRJSEZJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTkxOTk5QTE9QUlVYVk1OVFZVU1JRUExOVFNSV1teXl9dXWBfYWFhYGJkZWFjaGJkaWpndotsa2lnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2b3dKTUxMTEdEQ0FEPD9FRUVDPUFBQ0JCQ0VCQkRBQUVHQ0hHSEdGSkZDR0lHR0pGSUxISkpNS01MR0tJSExLTlFLUlFMU01LTk5PUFBPVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5gYl5gZWFhYmduaGJpaGhteHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xNTEtMR0VBQEQ+PkRFRkNAQ0FFRERGQ0NFR0NCSUZDSEpJSElLRkRLSkdISklJS0dKSk5LTkxJTEhKTUtaZkpkXEtsU0hPTl9uVWtzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVGB3dWlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5S05KS0pGQz9AQj89REVGRENEQkVFRUZCRkZIRERKRUVKTExKTE1HR01JSElLSEtKSUtKTkxNTUxMSUxMTFtzYmRwXmxtVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1Kcnl2a2Jga2VlbXlta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEQEJCPz1DRkdCRkNFREVFRENISEdERUtHR0xNTUtNTUdKTkhKS0pJTEtKSktNTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW92XFlsUVxtbVpxbWtvbXh4dHNpcFxfcmtxalV1eXhwY15rZmJncXBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0dFRUVCQkI9P0BGR0JHRElFRURCRklISEVHS0pHTU1OS01OSExNSUxLSEpNSUtKSktPUE9OTUtOTUxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHRUZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdoYWRqdXlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR3SU1HSURFRENBQjxCQUJGREdGTEhFQ0NIS0hIRkpMTEZOS0xTUkxHTExITkpJSE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF5uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2diYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRIS0hJQkVFRUFAPkNDQkdDSElNSUZDRkpMSUdGS01MRk9KS1dSS0dLSkpOSUhKTElLSklISkxNTU1JS0pLU2tiWmleX2pjcnJaX1lqb19lZVVrX2NbYWJRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRklERURGQUBBRURER0JISkxIRkRHS0xJRUZKT0xJT0lMW1FKRkhIS01JSEpKS0tJSElHS0tMS0ZISkpMTExLSUtMTlRbXFRQVExQT05PT1ZRT09RT09RSklOUFFkcWlUWVdbW1xVWVtdWF1cXGNmYWFmYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzSERFR0ZGQUVDP0NHQ0VHQ0lLTEhGREdLTEhER0hQS0xPS0xXTElFRUhJSkhJS0lMSkhGSEdKR0hJRUZMSElLTkxJT1xXXk9cW2BeT1hZU1xcYl5NWVpNWGFSSllhWlNgZFxhWFtkZFZWWVxZWlhcVllcXWJfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRQQkNETE1CQ0RCRElER0dGS0pLSEVFSkpKRkVISFBKTE1KTVNJSEZBR0ZKSUtLSkxKSUZFSkdERkdFRUpHQ0pNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOXlxeU1teY15aXWBjYFlfYltgXltUWFhZXl1jY2JhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklJREZLS0tFRUhJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRENDRUFGSkRASktJT1tjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV5eY2FgYmJiY2NlWlFZVlVcWV5kYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFLR0NHRUJFR0hGR0hJRkdKR0hGSEtJTERES0tOTUxMSEpKSEpHP0dGTktLS01LS0tJR0dDREBEQUhJQT9JSkdPXWFaW2RdX1RRU1hdXFxcX1pLV1xMUlxZSU1eUE9cX2FjZGNjYlxkY2JkY2ZYUVVUU1tYWmFeXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYWGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSUZGR0hHR0pGRkZJTEpORURLSkxOSkxJS0pISUdCSEhRTUtLT01LS0lIR0VEP0VDSEhBQUdGRVRdWV5YX1lfW11VWFhQXV1RS0pXXlheW11WWmBSUV9fYmJhYGJiYGNiYmRkYlhPUVFSW1NbXl1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSENSS0ZISEhFRktKTVBFR0lKS05MTElMS0lJR0RIS1FPTU1QTE1LS0hJQ0RBRURIR0JBRkVEV1VFXFRdU1ZfWE5UVU5aW01KS1VgYVtfWF9eYV1PWWJdYGBfYmNiXWJiV19fVFBOUFFYUl1cW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREVGR0RJUmJQRFdfSUdHSERGTUpQUEZKSUpLTkxLS0xLSkpHRUpNUVFOT1BNTkxOSEtBREFDREZEQ0FERkJNSENMTFBPT0xGTUZHSUpIR0xMTU9QSUxPUFBTUExQVFNVWllXWVhYZFZPU1RQUE9OUFVUXFlZWl1cYGFkZWNoY2tscHNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHSFlNR0hKSEdOTFFRSUtLS0tOTlVOT0tLTEdHS1BTU05QT05PTk9IS0VgRURfTERmY0RNW0lfXHNtT01WbVlMQ1BgVWxXZ0pdV1VeRE1RVUxNVFZRU1RYV1RYVVRcVFBmWmhoZFhUa1RXVlVbXFtgYGFiYmJgZmhmbmxocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09TSUtHYFRISk9KSU9NUlFLTEtMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUH9RSXxZWXJzV1BtSHFucGFWUHFxc1BCa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbYFZVV39qdHV1X2B3YFhhXFxmW19hYWFhXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEZKTEZSVkxLT0lLUlhXUU5OTkxRVE5PUVBLTE9HTVBTW1pUUVJPUFBQSkhaeF1UeGVoWVJUUXZndGxwYm5malFyT013bWpycHNycXJwb3CBXWV6dXhxcXpxfnN9a3V9YlJnfGVzc29zc3x9b315b39yX2BgYmJaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEtKSEpQTk1NSk5WXllVTFFTTlhaTFNTUk5MUElRUlRZV1dQVFBQUFFLR2Z4bGN4cm1aSkxVeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpWHNRaHptaWp6en5seHp/b2dvWHZ2anV1cIBgc2h8aWx4fG9eX19jYltdYmRnaWpkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3V6bnx9eXhybk5LU3ROQ0JFUFBISktKTFBPT1BNUFpgWlhLVFdQYV5SVlFZU01QSVNUVlhXV1BVUE9OUkpLcm91dXF1cWRoYFZuTHFwXkZoeVd2VExoeH14YHl7c25hXm1vZFJncnVubXlwd2x2dHRxbG1cdH56a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGVlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0cm9tTExbVkhHRUdSUEpMTUtMUVFRUVBRV1xZVU5WWVVmWFJSWV5UTU5JVFRXV1lXT1NOTk5RSFJtSGl3S2BkdnZVV2xPbmx7c2FqZ392VUtXa2h9bG1seGBbcHp7XmB6c2Nyb3hxaGV8aXJ7XVRLbGB2dWtpdXt7bX54a3xwXV5eYlteYmRkZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtobG1yfGttaGt7dG1ta21PSEpLSElJSFJQTE5PTUxUU1NPVFJXUlZUUFdaVlZUVFRhYFFPTktUVFNRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFhRTlBVVFhYWFtbVVJTV1tXWFdaT1NVV1dYUl1ZV11WVE9ZUldXV1hZX1tncl5bW1pcXV9jWl9jY2RmZGNjYlpjY2ZmZm1ubXVmZmdjYGZfXWdgZGxoZmdraG96aGdna3VqaGdpbFFJS0tMTUtKU1FNUVBPTFZWVFBUVVhVWVVSWl1WVVRXVVlYUE9MTVZUUU5VU05PTUxRUEtKUVJLUU1LS09SVFJRUVNTSUhMTk9RUlFRUVRWUlhXXFdTU1FSVVVWU1pRT1NSV1VUWVZUWVVTUlVTVFRYWVddWl9hXVxaWlxcYGNcXWJjZGdlZGRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkY2ZoUEpLTE9PTE1UUE5TUVFNWFdVVFVXV1daVlRcYFZXVllVWFRRUEtPV1NQTlVQTlFOS1NQTU9VVE5RTk1OUVNQVFFTVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXV1dZW1RPVFVYVVRZVVdZVFJSV1VVV1xaW19dVllfXV5dXF1hYV5bYmJjaGZlZGJYX2BiXWBoZWZkYV5fXV1eWlpfWl9nYF5dXWNoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FaWVhXWFpaWFlWXWpkVlhZWldWVFRPS09WVFBPVFBQUE5NUVFQUlhUUlFPTU9TVU9XUlRVVU9OTVFTVVVUVFJUWFZaXVxaVlZRUldYVltbV1FUVlZWVllUV1dUUlJYVlVaX1pdX19XX11eYFxcYGBfX1piYmRoaGVkYVliYGJeXmZkZGBiXVxcXFxZWltYW2FbXl1cX2JfX2JkZGJkX19gXFBNTk5SUU1SUk9TVFFPVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST0xQU1JVWlVUUFBMUFdWUldTU1NYTU9QUlRYVVVVU1VZWFteXVxbVlJPVVZWW1xXUVRXVVZYVlRYWlRTUVpXVlxeW19fYFZiXGBhXWBiX1xgXWNhY2dpZGZgWWNgYV9fZWVfYGNbWlxbXFpaWVlXXFlcW2BeYFteXmFgX2JcWWBaUU5PTlZRUFRST1VUU1BXXFxcWF5cX1dcXmpxd3mAY1xbVlZYUk5PV1NOUVFQUlRSS1FUU1laV1VPUk5TWFZUU1RSUlpPUVNTVltWVldUVlpYXV5cXF5WU05UVVZcXFZSVFZWWFlTVFlcVFJSXFdaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2lkZl5bZGBhYGFjZV9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFtdXl1bYFxgVVxdaWpyfXNsZ1xVWVdRT1JbU1JRVFJUVVRLUlZVW1laU09TUlZWVVNPVlJTWlJUVVRYXFdYWFNYXFheXVlaXVVVTlZXV15bWFFUVVhYWFVXWVtUU1ZdWV1dYF1iY15ZYFtlYl9kZF5eY2NhXWVmaWRmXl1kYWBhYWNkX2JeWFpfW1xbWFhYWFdbWlxgXVtbXFtYWVteVl5ZXVBPT1JaUFpVVVZWVFRUXl5gXl5iXGBVXV5ia3l0bH1sWlVaVVFRU1xUVVRWVFZZV0xSWlZdW1xST1VTWFdWU1BYUlNXU1ZWVVtdWFtZVVpeWF9eWVxZUldSWVhZX1paU1RWWllaVlhZXFZVWl1cXmBhX2RkXV5dXWVhYmZkXl5kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVpYVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXWBemhYWVpUVlNWXFdXV1ZWV11YUFVcWV5dXVRSWFJXVlRSVFhSU1ZUWVhZXV5YXVtVXl9YX19YXVZRWVRZWlphWVxVVlhbWlpYWVpaWFZdXl9eY2JhZWVdYlxgZmJkZmRfX2RiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlNaVlNcVFZXWVdWXGBhYmNhZF9fVltgZGFfenVvaFlcWlZYVVdbWllcWVhZYFdQVV5bYGFcVFVYUFVWVVNWVlJTVVdbWlxfXlpfXFZfX1pdXlleVlNZV1laXWJaXlZXW1xbXFtbWVtZWV5fYGBkYmNlZWJkWmJmY2dmZV5hYmBjXmNjaWRkZ19nXmJiY2FhYF5fWFRaWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNQVlpWVlpVWFVYV1hdX2JhZGFkYV5ZWWFkYmBsZmheXF1bV1hYWVxcXF9bWVtiVlRXXl1hY1xSVlhRV1ZWVlZWU1ZUWFxcX2BgXWFdV2FeW15cW15YVlhYW1tfYFxfWFldXF1eXlxaXFhbX2FeYGRjZGZmZmJZY2VlaGdkXmNgX2VjXWZpZGVpX2deY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTlJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9cXF1YV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBYV1hZWVdWWFZdXV5gYWFfYl5ZYV1dXlldXllYVldbXGBfXV9ZWV5dXl5hXFtaWVxfYV9iZGNlZmVmYlpkZmdpZ2NfY15hZmRaaWliZmljZV5iYmNhYGBfXV1aV1tZWVhYWlhXWltaWVdYVlVbXV1dYGBiYnhMV1dcWVddXFxdWldcXV9gYmRiYmFdYFhiY2JgY2FiXlxcXFhXW11fXWBfXVtgZFxcWFpjZWNgUlxZT1hXWVtaWVhaWWBdYGJiYGFjX1xiXV9dW15eWllVWF1dX19fX1taXl5gYmNcXFdbXWBiYWNlZGdlZWZkXGVmaGlmY2FiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWFdcW1pXV1hPWFpdYWNmZnJrf0pZV11aWl9dXF5cWF1bXl9hY2JhYV1iW2JkYmBjY2JdXFtaV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pRWVdcXVxbWltbY2BjYmNgYmRhYGNeYFxdXl9aWFZbX15dYWFfXVtgYWJlYl9dU1xfYGNkZGZkZ2ZlZmVeZWZoaGdkZGBbZmdeYWhoY2hoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WDgYODgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnd3dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3t7fHx8e3t7e3p7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29wcHp+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmJiYyMjIyMjY2LiYmJiYmJi4yMjIyMjYh+f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29veoB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyNj4+Pj4+QkI2MjIyMjIyPkJCQkJCRi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXV2d3d3d3d3eHl5eXl5enhvb29vcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH19fX19fX19fHx8fHx8fHx9fX19fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5dnZ2ent4e3h3dnh7eHp6eX15eHh5eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t6enp6e3t7e3t7e3t7e3t7e3x8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx8fX16fHt3d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3eXx9fXl8end4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3d8enx8enx7d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en58fXx7fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5fHt6enl7eXh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8e358fX5+fn5+fXx/f398fH2Ag4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAf35/gYCAgH+AgYF/fn+AgX9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35+gH9/gH9/f39+f39+fn5+fX5/f35/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5/fn5/f35/fn9/fn5+f4CAf4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GCgYGAgH9/f4CAgH9/gIF/f39/gIGAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChISCg4KHg4OCgIKBgYKCgoOCg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYCBg4GChIWFhYaGh4aGhoaHiIeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OCg4WEg4GBgYKFh4aHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4ODgoaNg4yHhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCg4KBgoKBiJOAkoiBgoOBgYGBgH+BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKAgoORh4B/gH+LmoCVjn+CgoODgIB/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoKDg4KDiZmMg4KEgY+cg5iSgoKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4OFhYSDg4GAf4OPmo+DhYSCkpyEl5SEgoKChIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+AhJCJg4B+fHx7e4ydjoCCgoGRm4SVlYSCgoGCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiISEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+Fm5SIf319fIGAgZWIgIOCf4+ckpiUgYGCgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqHg4ODhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgISbnol+g4F9iYl+goODhIKIn6Chk4mBgoKBhIeCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgpWgiIKNhX6DhX9/hoaFhZyfhn59fX+Cg4eWjIODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDi5KChIaEiYF/f36CiIaFiH98fn9/f3+InZqEhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhIKBgIGEgX9/foCKgn5/f39/f39+f4WejYOFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoaGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZSTkZGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISEgYCAgYyHgH5+f4F/f4B/f4CAf3+AfoOHhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIOBgICDiYWCgIGCgoGBgYGAf4B/f357eYCGiIiKiomJiIiJiYmJiouKiIiIiYmLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+QjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgn+AgoWEgoKCgoKCgoB/fn19fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHh4eEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWDgYKEhIODgoKCg4F+fX5+fn5+fn18fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeGiYmDg4SDhYSEhYWGiIiGhYOCgoOFh4aHhoaEg4KDhIKDg4SCgYKBgYGDg4SDhJGSkY6PjouHhYaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoGChISDg4ODgoKBfXx9f4B/fn5+fXx9fXx5fIOGh4eEg4GDg4SFhYWDg4WEhISEhYSFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4F/f4GDg4ODg4KCf319f4CAgX99fn59fX19e3p6foSEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYOEgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY6Pj4uIhYWDgoSCgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn6AgoODgoOCg4J9fX5/gICBgH59fX19fX18enp6gIKCgX9/f39+f3+Afn2Af3+AgIF/gICBgH+AgYF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/gIGCg4SBgoKDg4OEhYCAf3x9fX59fX5/gH99f359foGDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enl6gICAfn9/fn59fn9+f4B/fn9/gH+BgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhISCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7gIB/f39/fn5+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn59fHx9hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gYCAgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn59e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXt6enl5eXmAgoKChIOBgoKBf4GAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCg4GBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjISDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDgoODgoODgoKCgoODgoKSkIuIiYeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaGh4eHhoeFf319fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GDhYWGhoSDhYWDhYSDg4SDhYSEiJKOjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgYGDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEgoGDjYl/fX+DhIaFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg3yCgX+CgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn5+gIJ8fH9/goCCgH58e4qCfYB/foGAgICCgYKAgIGBgH+LlI+Mi46OjYiHiIWFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIJ/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX19fXx8fYB/gIB+gH5+gpSRjIyNjo6KhYaHhYSEhYODg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoCBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fHx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2MjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKNjIyPjYuKhoSGhISDg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gH9+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaFgoSDgn+Afn+CgoJ/f4KCf4CLkI2Mi42Mi4iEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gH+BgX9/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4WBhJGPjYuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/gH9/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+fn58fHx8fH18fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3x9en1+fn+AgIOHiYmJiomKiYWIkY6MiImHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4OAf4CBgICAf3+AgX9+fHp8fX1+fX1+foyGfX1+e3uDgn19fX19fH19fXx9fnx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uLiY2Rjo2JiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEg4GAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjpCNi4iIhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYSEgoGBgoGCgYCAgYOCgH+Bf31+gH58f3+Jgn9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiOjYqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fHx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICAg4F/gIGEgX5+gH9+foB+fX5+gIB/gX5/gH9+f4B/fH9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHt8fHt7e3x7fHx8fXyKioiIhYWFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgYCAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx6fHt8fYmGhoWFh4WFhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIODg4SEhISFhIGBgIB+gIKAfn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4KEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFg4ODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKEf4OCgoKDgoSCgYGAgIKBgICCgYOBgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Bg4F/gIOCf3+Af4F/gH98e3t6fHt8goB/gn9/gYCCgoGBf35/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH5+f39/fn1/fH5+foF/gX9/fn+Af4CDgoOAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fHx/fX+AfH9/fX2BgIB+fX2Af36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4KAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF+fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXx5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN3dnN0hoSEhoOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAgH9+f398fn9/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+fn+AgICAf4GCgIB/foCBfn+AgoKAgYOChIWGhIB+fXx8fHx6eXZ5eXp5d3l2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eX13eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1/gICAf39/f3yAf3+BgIGAgH98gH99fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgX+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gIF/e4B+gIB/gYGAf32Afn5+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/g35+gICBf4GDgoODhoSAgX58fXx8e314d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHJ5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH+AgYB8gH+Afn+BgH9/foF/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af319foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3fHl3eHd3eHt7e3t8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6enp4c3d1cXFycHh3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB/f399fnx9f4CAgIB/f39+fn18fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYGBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf4CAgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gYGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKBgIGBgoGCgYGAgICBgH5+f3+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/f31+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CBgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXZ2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKAf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gH9/gIGBf4CAgICBgICBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHh4dXh4eXt8fH18e3x8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg39/goGEg4OEgYGDgIKCgoGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCf3+AgoB/f4CAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEf4CDgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f317fX96eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGDgYCBgICAgYKBhIB+gYOCf36Ag4KAgX6AgoOCgIGBgYKCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoWGhIKDg4KEgYSEgYOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYKDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBg4ODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GCgYCAgoSDg4KBgoKBg4KCg4OEg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX56fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhICEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgYSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOBgoGBg4J/goSEg4OChH+ChIODg4OEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+ChIODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4OEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODhoKDgoOBgoKEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhIWFgoeGhoSFhYSFhISEhIOEg4GCg4ODhISGhIWEg4OEhIR8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhYB9gXWBeoR/f39+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fX5+foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SFhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBygYN/g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZzhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1ud2xweWx1fX9/fX6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYGAf3t/fXyAfoCAfn6AgIGAfn5/fn6Bf4B/fn2AfX+AgX+Afn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSBgX+BgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhISGh4aFhYWFh4aIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYWFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3p5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX16fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYWFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHh4aDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFg4aGhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH57fHx9f358fH59gH99f4B+foB/fX18gH1+f35+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhYWDhoaFhoWFhoaFhISFhYOEh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fn1/fn19fn59fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoeGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4OHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWHhYSDhIODhIeBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx+e3x8e3x8fX17e3t9fHt+fHt8f319fH19f318enp7e3x8iIeChoaGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH17e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhoWDgYOCgIOFgoN+gYGBf4OBf35+f35+fHx9f317fX18fXp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WEh4qHg4eFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFhoaHhoaFhoaHhYaGhIOEhYKBgoGAg4OCgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCgIB/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeGh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SGhoeGhYaDg4OFgYCBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp7e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiFhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhoKCg4N/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfoCCgn1+f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhIWFg4WFgYCDg39+f4B/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7e31+fX2AfX18fH2Af318hoOFhoaGhoOEg4WChYGBgH9/gIB+f4CBfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWFh4aFhIaHhYeFhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SDg4SDhYSAf4KCf31+f35+f4R+e398fICBfYGAfX6DfH5+fX1+e357e3p5enp5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4F8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f399fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU1NPU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vKysrLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1NXU1NTV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5PkNFPzw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0NHQ0NDQ0NHR0dHR0dHNysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fb29vb29vb29vb29vb29zc3Nvc29vb29zb29vb29ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzZaEhoaGhoaHh4eHh4eCsuLd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0j4yMjIyMjIyMjIyMjI2IgYKBgYGBgYGBgYGBgYOLioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E9P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5uUFNTU1NTVFRUVFRTTKDz6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFpVVlZWVlZWVlZWVlZXTkNDQ0NDRERDQ0NERENGU1NTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zOcVRYV1dXWFhYWFhYV1Ch8enp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpZ5fWVpaWlpaWlpaWlpaW1NISEhISEhISEhISEhHSldXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNznheYWBgYGBhYWFhYGBapO7n5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaqjaGRlZWVlZWVlZWRkZWVdU1RUVFRUVVRUVFRVVFZgYmJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3HxcXFxcXFxcXFxcXFxMvQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Pzs7Pzs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzMzMzMzMvLy8vLy8vLy8rLzMvLzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz8/Pz8/Pz8/Pz8/Tz8/OzM3Mz9PS0s7Nz9LOzs7Ozs7O0NTSz8/O0tTPzs7T08/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX19bX19fX19bW1tbW1tbX19fX19fX19fX19jY19jY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Oz8qWpdHP0qig0M/RpKHQzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8+cqp2s1rKeo6fWr5+hqdLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q/QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DLlIianciempOdwJ6YlZzI0M7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEI6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0b3ImZusmqGctJicop2wstPPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Sl5SirZqWrbmGnpavs6rV0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Ts5vEna2YgaCWeJuEnZOk1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo8Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0c6NkKOcnaiInHmfqYWZpNXR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NHL2qickbmvppyKva2mmK/W0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJjqWaoKWml5edpaeWmJu71dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HKu6Gmp5zNoKukm9Cfq6Sc0dPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09OekI2218WQjbfXwo+NvNXS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGR0tIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0rrE1dHUx8PV0dXFxNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLV1NLS0tTV09PT1NTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKQzxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEFCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioaCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpyenZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpqampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpual5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYm5qZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5qdmJaXlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7PDs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6OjpKKhoJ6bmZmYmZmZmZmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoaGfnpybmpqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampuam5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56bmpqbnJ2cm5ucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmpmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZmanZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmYm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZRUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6JkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVWJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6KhlZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6qpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapaekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RXT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66vqqqrpKGipKmnpqmoo6Kcm5ukoKWoo6CYnZifoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKelp6mnqaijp6aZnKSmoqGhoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+hoqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXFBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6yppJ+ioKKmoaaupqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKSioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndiX1xVWVFVV1tjXnNfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PUA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6KvqqqsqKirsKmoqqihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltaYF9aXFZcaGRuY25qaWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustq+zsKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnaGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6hmZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eWpiW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKumpZmhpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odWtxaGlpYVlTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCxtLW1vLy+vLy+xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1r7Ogp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFpYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsLDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5rY2Jud3V2bmxbYlFWXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFBOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbWZudXFydXFnXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppqWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3RrbG5kb21pcXhueWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKastLWsrqWko6ikoKClmaq0sb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ4c3lmZ11kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDw8HEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6ypo6GtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpnXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMnIyMnHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraaqu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9jYWd1aGppdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxczQzcfMycLCx8HLy8jGzMrOxcbFw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwLu+tLCwsMG+vsHGv764tsPCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVudGJdYlRXVVNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBwsO/v77Ey8jKy8m8vMjIyc3Iw8jJycXFw8LBwsfHycrHzMjHyM3Gy8/Ft8C/wMC7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVmY2pkYWptbm9eWVxWVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDubi5vL3Bx8HGu7jO3c7DxMDDwcLBw8LDvr3CwMDBwsvDxszLxcjRwrC+vri6u7u+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFjZGNqYmdjW1paXFlRT0U9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba4tLS1v7u9v7m+urq0wLi1t7Kuuru2wLfA3p6Qwr/BvLvFvbvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWNgYmJnamdmaWVpXlZWVFlPU0xGOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OTmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tbGwtbe1u8G4vrm/vLy3tLevrre0t7+60MN9hsq+w7W6x7e2ubu9ubq2u8XFyr25xcC/vMG+uMa8wr+8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHFtZWVmb2lla2hYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJmUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e2tbm5ubm/v9edd4GpxMe3ubiut7W4urS3s7vFxsvBvMbAwL+9vL/Iw8XFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfGtucGdwa3NmYW1gXFRJS0pESkJDRz86Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGNj46Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9vrvEtrW4t7rDv8W8wc7EgHd5lMbPwsC4r7W1vL64urK+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9u7u/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFmbGludG54Y2diW2NRS1RIRUVDSEM8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C5vr6yvL68xLeyurCjp7mzvcfMonR5epfP0czKxLW6wMTIv7+1v8G/xsa/y8bDv8K8wMPMysfFxsC5vbzEv7+/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmBiTklNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLGzwNzbxbm+vMS+uKB3a29xa4CVuIdzfn+ZyszLzcrGwsTLzcW/ub25ucDDv8jGxMHBv8XAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIem1td3tfcGNbXV9fVEk+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLW8tsGKrdjEvrbAvp19ZFpnUk5YXHZ8dH6Cn8PGy8jBw8HAycrIwbu7sLO9vcDFxsXEv8DBv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXpuc3hzZ3BdW15dWVJGRENNSUFFPUg7OzU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZfFvrq2w7zGwr6/yMW3tbi3trm7tK+3t7K1s7e5vLu2usC3ZW6mycC2t4ZiYGZUZF1OTlFUaHR7iKS+v8bAucC8vsXEwLW6srCtv7m/w8fDw729v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f312bHV7cG5pW19gWVNQQUZIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLjLtW1nb5i1uIRZTkZmTE90amBPTVh0eo6suLfCurO7t7u9wbWeva6wsLazucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3V2d25xYF9mXVtUSj0/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa4zbZ5dWVznKJeTkdVekxIZn6Ug1tDdYmZq7G3vrmytbK8ub+qiLyzs7efqLi9w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHdybF9jYVteT0hCPz1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmztsezgHlxbIt2UUVHdH9NTk9fioFwRlJ+prSwtrq1tLKsvLm+n3e5vLm3dpS9vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybWNdZlhcXVJOTkE+SkJBSklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7e9uY2Cenp5ZEtHe3xhTUlRZaelYU5KcK67sLO1srSvrLu4wYxvrcW4rVx2uba8vLi2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c210aWxdW2pUXVxQTUhERkxCRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7+dh4eLiFpEdpdyW1pJXmBSkXFubaDBuLO0srCxrbC5uL9yZ6DCsrCnpbGuua6qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+2qZaPk6hPSn2zbGpxXWtedXFjY26HsbmxrbOvrqyttre0XYOlq6SenZ2cnqionqCoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKurn6aim6OclZCMj4+Qk5CXlZaYn56empiml5OPkpadoqCloqakp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3pjd2xuXFFoVFBOR1BNTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqbOzoq2VTFRypnN0fYxzTm5tZXBwbpOotqqytK6qq6+wsKGxpp2RmJSPmKCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6aqsaOlqJ6gnJWTkI+RkJiQlpWYl5+Ym5mao5mXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dn1ta3tkaFVRY01KSEdPUk1KTkc8RUA8Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqKCtwb+oV1p4dW5xWl9kYlxZW2lsYmZzg7KvrrO1qqasq6OemZSNkZaXmZmcoKKinJ2lnpukl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmpabl5eYoZ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9d3h8ZHl5YGJSVWBISUpLU1RJUlBMOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWdnr+3eGNyfGZnZVdaWlFKR0tPUExVYl+bsrCwuKymoZydmpSXmpqQjpGVkYyOjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKwtKqyrqKZnJ2eoZmbm5qYmZuUlpuWmZyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1paTVFKTk9VTFNMQTc+Qjc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuimp6pp52HYVhmaFxOSkZEPkBCRUJDTFZPfbGtrK+nn56ioJaQk5ugm5mXkpOfnKGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7itsrSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqOhoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFJVSEZVVkpCTEc9S0g4Rjw3Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaCef2NlZlhKQklPZlJLQUM+QEZJSF+jqqqppJ+fmZKRk5iYlpaVjIiLjpWdnZ2dnpeemaafoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+np6Wkn52qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cm1pdm1obVxYXENXTkpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKOgi3drX1JLQ0RWf4t/aEY9Ojo5OFGFqq2pqqWfnp+io52enZqcm5STlZSenpiUhp2aoZqrpKyysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsO8w7y3s6mzraqzta+zrqqvo52rp7axraKvpqGjr7GtsKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHJra3RycWhWXFFGVEhESlBJP0VBNEZHOTU7Pjc7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfn3VpXlRKRkRGZ7PEwY1dUElCT3uqsqejo6GgnqWrpZ6XnJSRmZ2YlIyKhoiGeG2IoKSiq6uzvLbDvr6zu8HDwsXAv8LGxsXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr7HxsK3xMnJw8HGvrq0urq1u7ewtbKqurKuu7e/u7qqt62rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrY2hveGtlWltGS0xFRFNNREJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdnJdqV05LSUhIU33Ry7STnI6Clq+toZmbm56emZeXl5KMjpaXk46NkIuCg4J3c3FucY6lrLC5vcW7zcfLv8LMzs3Mx8nRzM3Mx8nFxczR0tXO08m9wL/Du8bFyMXR083T0NPTzMrCxcbGysjOv8jRzMfFx8XBvMPBv7+/tr6zrr/Aw8PHxMfErr+4sri8w8LCury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MREVQSURDQDU1NTg6Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOenJ6TXE1DRklJWWaSuqyNg7S5sayjnpyfmpeWlJKUlpGQj4yHg4OIh4OAgYGAeXJycGx4psHKysXKwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fR19LV1tPUyMzGzM3J0s3O083FyMnKwcbLx8nJxr/Ds7PIxMvLy8/Gyr++v73Bx8TMzMjJwMO/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJBPEU8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxBPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hnl5IPkRFV2aGrJ+eoa2ro5ycnKCkoZ2alJOVlIl9d3BrZWJocW9xe4WKgHZwbnFzb4jDz83I0dDX1tbS1s3U1tfU09HT1NTTz9HD0NPW2NXW0svJztHLxs3SytLV1tnV19PX2M7Sys/RzM/QzNPQv8jHysTMzMzOz8XGx7a/yr/SzcvPxsnIv8TDx87N0NHPzcrIzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGRyYl1SXElKR0FFSUo+O0E4PTQ1ODY7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoalwR0VFSGKEvMSqq6qblJefnJqgoJ6bnJmViXdpY2BfX2BfXl9fXWJsdXNxcG9scnF1j73JxdTW19fX09bP1dTa1NTOz9XU1NHRzNHN09fW09XQz9LT0cnT0cjQ19fY0dfS2NnU1szPz8rN0cvO0MDGw8jGzs3R0dHIzM3AyszG087MzsjEysfHyMzK1NTR1c/SzNPBucWxpai1rqebqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpq63qKu319TV2dnRztC/vMzJtr6upqqooaOvgmJranqcwr+uqJ+XlZeZmpyfnZicnJJ9cGVjYl9fYV9eYWBfYGBfYGZtcHBua29yd3eZyr/S1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHF0dTK0NTV1s7S0NjY19fLyM7Eyc/NyszAycDIys3O0MvQzc7Mzs/Iy9DQy87KwsnHyczKy9LTzdPR0dDQyr3IubCuu7i1qrawrai4rbO+u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1YRTtAPTMzPDw4Nzg2NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HAsKmsramnlnuIjKnNzrGbmpWUlpuenp6ck5aXlIhrXl5eYWRiYGBhYWBgYV5fX15dYm1yb29zdHV2eaS9y9XQ1dPT2NbOztTLzc7FzsrS0s/Hzs3N1MvO083L19bQzNHUy8zQ0tPKztHV0tXVysDKwsXMwsjJw8zDxcjKys/KzczQzdPLxsjPzcjHy8XGwcbKzM3Q0cbQzs3NzM/Fx8G4ub3Dw73DuLKyvrG7w8O1qpilopmWkZWVkouUjZqRlJSPj5SCiYZ5cXJrbWdgYHBoWFhoVkxGTElQUUI7Qz47Njc6ODo6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWvtKigrnhlg4O6zqqUjYyXlZCTkZGVlpWQi3xlYWJiYF1eYWNhYGBfYGFhYF9dW11ncnFxcnNxbnJ5o8XSzsvQz9PUysXJycbGv8PGz87HxcfNytLIy87OxtHS0M3M1MrHy87PyMfP0svRz8a6xL/Gyb3Cx8nOxcLIwMfNyMTMysvPyMTE0MjGwsbIxL/Bx8zMzM/CysvIx8vQxMXHu8fDyMnCz8C9vL+wwcnGub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd290ZGtgXmZwYVtXYEdISEdJTVRHP0o9NjQzNTU9PTQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLrNzcbQ1dXZ2tvY0MnPz9HTyMK2u7utpLBmZnyM0auQjo2Wj4aDg4OBfYSEfnNgW15eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3230MfJys7LzcS6wMO7u7q6vsnGwsPAw8jLycjKyMHFzMbIy83JxMLKycHCzNDFy8i/ucG7xsi+v8bPy8O/w7vJx8i7yMbFysC9wsvGxcS+xry8wMPFzMXFvMDKwsXH0sXAyb/KycbIxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhpZujoJuUe3dydGZpWmFubFpbWFJETEZCR0RMREZTQDU0MzM0Pz0zOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srKkXWpzpriOipKXhnqAhYV/dnh1cnBfW1tdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lrcG9yj8W8ycTLv8bBsLa6srKzsrHCvLy8urjBwcHFvr25vb+5xMrFxsK9xsC4u8TJv8HJu7e7u8bDv7zBzcPGvr61wb3Dur3Gu8K6s7zFxMLCtr+1tb6/u8zDvLW6yLq/vsvEwcbCxcnGycbQxsLMx7LHycPOzcDFw8C9s7ewsqeoqLmwpa2wqq2slHp2d2pkZ2Bob2NWXllKRkpGSEpBRUJFSUA5OjY0ODg1NDs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztLKysrHzc3O0cjQxtXU1tfNys/FycXHwLnFvauvkl1udqiSi4iLhXiAhoZ/foR7dHRjXFxdXmBgYmNiYmVlYl1cW1xeXF5dWltcXmhzcW1nZ25vcnicvMu/wrrAt66wsaeqraynuLW3tLOztLu1vrK3sLWvsrzCvMHEvMC7tbK6vsC4x7m0u7bBwry4vcbBw7u1r7K2ur+0xLe7tKu4vb3AvbG6trC2urPFvLauu7+1t7TFvL7DxcDDxcbIy8XAxsa7x8u/z8nHw8bCw7fDvb22ub7Hv6y1urW3to55dHhnZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjKyMrJysTQzdLPzcXHwcXAvrm3ybaqsIhecYGXjYWIiXt4foaGdneBfHNoXV1dXV9gX2BkYV9jZWNfX1xbXlxdXlpcW11fa3BuaWZqbW5ye6TGvri3tK+rrKeeoqqnnquts62qrKm0rrexsqmupqyzvLq2w7m6urGrtbm7tMK6sMCxvry7trvHucK2raqosLLAtri9sLCnsrO1u7yrrrWmrravu7Kwqrmwrbuuu7i7wMC+ucK/x8PFwLzGwcfKuMXHxb/HxMO6xMbCu8bJzMuzucK9u7OJc3Z2a2lgYmxoWVdXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXQx83Bw8a/xMTDw8rBycq+v7zAurK0tMOuqbCMaGyEkoeOj3t4foqFenuEgHduXl1cXF1fYF9fZGNiY2NiYF9dWltaWl1aWlpaXGRub2hnaGlrbnGBrLivtK2lpKenmqCloZqcpauupKiirKqtqrCkpp+qrbW2sb25r7evqa64tLS8uLS8r7i5tbK7wbLArqWpo6uxsrOovaqrqKutrbSzpqiuoaSvqbKmp6iupqi3rLGyt7q6vLG8vb6+xL+1wsHHyLe/wMW3xMO/u7/Ewr7EyMzKv77EwMCph3N0cmppXGFvZFdWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HKvrvJtr3DvrrJt8HDwbS1u7WwrrS7raepjWlghoSHi4B7fX9+eHR+fHN3ZV9dXFxeX2BeX2NjYWJgYV9eXVxaWFlbW1lYWlxfZmtmZWdlaGpvcoWppKqlnpuhpZSepJuYkaGjqqOjoKalqKWtoJ2cpKassrC2t6ewrKiqtKu0urG2tq62ubKvurqxtqSgpKCmsaerqLmqpKenqKeyraCnpp+bpKasnp+no6Chsa2trLK0s7Swtby2u8HBsrq+w8GyubnDs8G9v7W4vL2+vMLHxMLDvsDEoIN4cWxhZl9rb2BUWV5ITmdPVEdFS0Y8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9taCelZ2hprq2q7Ozu7PEz8jLwsa4tsfAzL+4ybe7xbizxLizvsCrtbuxq6SusqygoY1kb4eFhoB8eXVzb21qamlwaV5gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1vh5yon5WVmqGWnKKZlo2foaOnnKCgpKaip56bopufq7CtsbajqaqqrKyktLmtt7Css7WusrWusKqfnp+korKkpqm4raKmpqCorKuZn6CemZ2fpZqZo5ybna+pq6eqrKytsbK4r7i5u7C2vLy6q7OzubO+tLaysba1v7a9wL3Dwbu7vZeEenNsX2VeZGRYVFddSVdcS1BHSUpHQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vDw8++use4t763ssG0sbu7q7i5sKGeqKqml56QZn6Fhn94cm1vbWtiXmFmZl1dXl1dXVxdX2FhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3GMp5yTlJSbmJuil5aRnKKiqZ6cnaWmoqWcoKCbma6urq6yoKairqunorWxsrKsqK+yp7qzprWgop+co6Gto6Kqtaqio6aepaajlpmel5mbnaCal52dnZytoqunpKSmrauztKq1sLOrsrm0r6qvsrKzuLOuqayusrixura6vb+3s7GUhXl1Zl5lXltZVlNaVUtbUUtJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+znaWjmKWxwrW2va20uMLMyMa/xbbBwMbOt8DEvbO5ubK/trG4uqyxtK2emaOon5Kah25/g4R/eG9xdHFoZWNoZGNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqGbk5SPlZeXoJeZlZegnqGdlqGhqaSfnqidnJqrp6+wq5ujpLiqoaCuqLaqpqetsKS4sKS3oKKcmZmqpqGarLivoqGknKKfoJOUoZSWlpuYl5aXnJWfqp6ppKKdo6qqsK6otKuqp62zsKWrrrOxsK+ur6anp7KtsbSwvLS5t66jlIF5dWReYVZZV1NSVEtNXkxPS0dHTExFPUE+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp2nqKOqu8C9wLmutLjBzMfFwsO9xbjIy7LBwsGtvLu0u7y0uLmvrq+om5igp5OQioB8gHx3cWlscnRwaGhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmNkZmmBlpOVi5KUlJyZnZaWnKCcn5ahoKampKann52fpqCqr6afoqS3qKGhoqi0oqWopbClsa6stZ6gnZWVqaGilK2xsZ+io52emJuTi6GUkZOYmJKXl5iXnqecp6GimaOlpaukpbCnpaOrq62mqa6vrquoqqmzpaasr7Sxr7y1sa+voJJ6d3JlYVxaXVhOTFJHUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3NzYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepaett7u8wcW6sbm1xMnJwMPGxce2xcSywr/Fqre3vba9urq1squsppiXnqGLiHOFh352bmNhZmloZmdpZmptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVVNUUlVgYF9gYV9hYWJkaoCTk4mQj5STlJ2VlpekmaCXnaGloa2mpKSjo6Kcqqulmp+lsaqgoZ2lq56ooZ6trKmprq2ioaKVmKObnJCrqbCcoKKfnpeZk4qekY2Sk5aQmJiTnKGjnaSgopWgoqSmm6OrpaKkqqOrrqWusqmmpaamtKapqK2ztbS5uq+prJ6McnFvYFtXVlVSR1FPSFlbT1JJVEtTTEVGSUQ4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7Kvq7Gtnainr7m5s8DIurXAr8XIzLrByszItcm8sb7DyKyxuMG1u8C7tLOpqqSUmZqbh39xiIN7dGlpamxnamtta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV1eXl9fYmRtjo+EkYePkY+ak5WTnJujnJuhqamrqKynqKakmaSvpZWZpa+qn5yZm6Cer5qcq7OgpaafoqOhlJOblpaSqamsmpyfoaCalJCMmY6MkIyRjZaVkJ2hoKOdm6OVm6CjoZeiqKOiqKugq7Ckrbelo6Sira2qqKuvs7ezvrWyq6+YhXRzaFtYWVNVUkVYTFFbWE1UTlBMUFFJTklCPD8/QT89NzU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62ns7auqKivrpupqKy3tqu8yru2v6zLxsW4wc7PyLPEure7wsiwrbi/t7y9urK0paiflZaXlYZ5dIB2d25taG1tbXBnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXVxcXl9gZH6MgYt/jJGKko2XkZeZoqCboKuqpq6sqLCkqZqfraCVlqSop52XkI+anq6XmKiqmZ+dlKWgnpKQkpGTlaeqpZqZmZ6elY2Mi5OGiY2Dj4uSlZGgnqGjmJWflZqhop6Um6Wlp6iooLGxprG8p5+jrLWrrqewtbC4tcCxrbGrkX5yc2JWVFVOUkpHVlBSUUxMV01KTE5SR01LQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OspbG3qqWisaudqqepsrGktsa0ubqzysW5usHL0Mqxtri7vcHDsa+xt620s7qysqGim5yWlpOCfnZrZ2xucW5xanBrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domOh5CKl4mUlJibmZ6pm6CqpqWsnaiaoKack4+fo5uXl4WEkpujkJWjnZaWloiim5uUi46KkJqkp5yVlZebkZGHlI6LgYuNgJCKkpKSoJqgopaUmJmVoqaZjZmkpqimoaC0sqeyt6Gcoresqq2ksrKmtby1rKuxo4l5c21dTlFRTE9DTU5OUEtGTk5KSk5NUUhNSkFHTEhHQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2pqS2sKSnpKqloKilpbOqorLDtbWys8bGt7rDyszGs6y6vbS3wK+tqbCepq25rqyemJmclJKGeoJtX19mcnB1cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhYWFtdYW9zdnGFiIKIgJGEj4uUkZSeoY+bnKOipJmll6KclY2HmJqMc42Dfo2XloaRmpCUjo57mY+cjIKJf4mYn6OekJOYloWNg5R+fnSKjnqQh5OQkJ2ampqRlZCdjqKjjomaoKGjpJuitK+sr62fmKW4pqaxobCunLC7qqmvqpmDd3NjVk1ST1BOQ1NOTFFMQlBRSElOUk1ISkpESkxGS0o9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKimpaijpqWmpqazp6W0wbiwtLDJxLe5wc7GvbOsusGrrcOtp6Kmkp2mtauino6UlZGOfXZ9ZVdWX2dmaWdobmNqaGdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVZZW11pbHJtf4V8dE5YcpCDl4eOnZeLlJGfmJ2VlJaVj5aJgJOJXztWb3yLlImAjJKMkIaGc4qFloF5gXuGk52Tg5WOkZCDhn2TeHFwhY19iYGRjY+XmpmTi4+JnIifmIiHlp6aoaCXp66pramonpats6KmrZmsq5ios6KpraOTfnJuYFtOU1JXTERUSlBMTEZOT0lFTFFNS09KSU1QRklJPTc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKeoqKOqsKintMG5sLWwx8K3s73Pv7mvrrXCp6rFqaKdmIOUm6+hmJaFk46KhnxydV1RTFJVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1waXuCdFFCQH+VkpJ9iZWNhIqNm46WlYmSiIaVhnmJf2BKUW54ipGEfYSNioV/f25+f5R3dXZ4hI2Zb1GNiIqGe354lHZnd4aIfYqJlYuNkZKXjISKiJWEmoyChJKalp6dlKSjqKmlpJ6asKuhpKSRpqqWoqqcoqaoiXVtZl5bSFFRU01JVU1TSUxLT0lIRkpOTE1US1FRT0ZJQz03Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6OnnZ+hr6GnqKWnqK+tqrW8tre3s8G7tqe5yLi2qKi1tqqyvKadlo5/iZOolZSJfY2DgXx3cG5YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXFWPiZSJdH+HgXyFjJOCkpqLj3uGj4B2gHhzbnVwdI2NgXp+iquFeXpodnuOcHJteIGLjZJ4eoB7gHZycpJ3aHWEhISFe5WKiIqNi4B/hIuMgJSDfICPmJSclpGenamen6CdoKmln52YjKekk6Gglp6epIByaGFcXUpWT1JHSlhST0pMTVJKSkpMUEhMUUxSVE1FSEE8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpmjopicn7Spr6mlrKuwsaq9tLK7uLa6tLGft7qyqp2drKmosq+hmpGNlICNm42QfnaFd3t1bm5oWEtISUhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnWDfHhmd42XmI2PfWh5gXZ4gImPfYSYkoFxh498d3tva36tfHOQin97hpKBfX90ZnZ8hmxvaHN9iYyIgGx5cX1xbXaPcWhxgX6OcEOLhIKDhX93d3qLhX2Me3V9jpKPmIqSmpujlpmdmp2eoZyWjYqkm46el46WmI93b21lYlpYWFVRSlNVVE9QTlBWS05LTk9KUU5IT09MRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg7PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKavrK6rqKmxr7GrvLisu765s6ynm7CnrJuPlpylqaSgl5mOhJJ5iI2KiXVwe210cGlsaVdLRkdFQUBDRElMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTk9RVFhdZXBybYinqsB+dXljfHhvfHmIkHp9i4ZvbYySeXR4amqAgnGWkYuBfpaASZOYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmltcH9zjYmEhnt9fnt2b3RzhYJ5gXhwfI6MipSDlpeYmpCSlZeZl52WjIOJnpGLko2GkJZ/bmlub25YVVhUUlFZT1JUVFNYVU1OSE5LTU5LQ0hOR0U/Ojg5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrbCjrKqota+urLS/q7zCv6aimZWkl56NhIuUoaGYmJGTi3OOen+Fi4V0bnRrcGxka2pYTkVGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXGCniGKaaXR6ZX9wbX96i4l2gYiGdGyakXRzfGprnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtxf3xocXF8bpONj3xzfXxxcG51bYJ/d3l1anmJgoiJhJaSkpCLjZGUlI6XjYB5iJeIhoqGgJCIdmpqb2hlWFFZV1lZW01QVVZZWE5JSEVKSkhHQkBGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw1Nzc1NDc4aU84OzVukoiakZmWpKiunrKfp7uvq7KwwrG7w8ealo+UmYuOhnmEkJiUjZCMj4Zxh4Jzh4yFem9ycG5vZHBmX1RGSUM/PDs5Oj9AQURDRUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHJ8eGx9bXKDgYWBeoSGhnlyoZV0eIBzdZSHNXGdqJ2OoaGEooR2cIZ8h3xzjK2NiYBnZmJqbnJscIN1aW9YdXCOm5J3bH97fW1xbXCAenN1bmJ2g36GgIWQkIqKiZGLkYyLjoN1eIqOgH6DgH2PenFwb2tgW1xeXFlYYF9STltaWFdMSEpGSkc+QkFCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBk4iWkZ2kp56vlaW1qq6xrsGyu8HGlpCMlI+AiH1ugZCSiYOKh4+FdYKDbJWIh3t0eHhsd253Y2leSVBHPkA3NDQ5Ozs7PT5AQkVITExMTE5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8foWDf4x+dqKZeX6GgISZhJucYYaqn52Lg5CNeneIfomIjXOKl5CDel1kcXR6e3eKbWhqYnlvhZCCem6Bd3SEenB0eXdrbmldd4d8h3yHh49/i5KXg42FjIZ9cYR/g311d3t8iXZwc3RlZ19bW11UXGdeV1FVWFtVR0pKRExHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIySnJ2fppGgq6CxqK/AsbrFupaOkZOHeoV2a3+MkYJ9ioSOjHiDgHOhhIt9fIF+cIB+emd2a1JXTEBFMjExMzY3Njg4Ojw+QUVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxxfI+Men2Jh36Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkqiHgJiYipx0bXyBhod9jmhnaHh+boWHgoVxhIVHbIB3cnl2aG1rX3d9g4h/iIWLepWdm4mLiJF/enWLdnx4bW93fX9zc3JsW11dW2NjWGdmXFVPUFZZUERMS0ZOSUNGQ0NBQENBPTk3Nzo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8fYmFiJGPlpiSl6GdrKGmuK+zvLOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9Pj9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYCEgoWRk36FiJGBmpWCoaGYlZuapa2Tmbuxp7vHw6iLjKGlj5SJgZF8cYOen5Gcf3aFhYqQiJBpaG+DgHSMh4SLcYWCd4d/e3aFfW52dWaAlI+GiYmHiIehqqKWiY6Yf3qCiXp5b2dreH56fnJqZF5aWl1qXWFmYFlPS05XUlFIUEpETkdDSkRCQEREQTw5ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZniDe4CMgIGRjoqam6Sdoaymq6+wl5GRg6GUhHh3f4yUfH+ShpKVf4qAkpuOg4CBjIuCiY2Df4l/bXBqXUJBNC0tLy8uLzAyMjM0Nzc4Oz0/QkRISk5RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2aj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jaGemYSThYKPoZ+TmJKEi4WPmZGWbHB1iYuCloyNj3ePhHFshIGKlpGDhYhyiKGWh5OJjo+WpbWpm42VooOHk4N9f2tqa3yAgYFzYV1jXlpma1xsa15XS0dPU1FOTUxGSVBDRE1GQUNFRkI+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwgnB1h3F2koZ+l5aalZ6enKegqZaTmJ5nZaSafoSSkXmAkoiQkn2KhJiSkYKAgIuNiYWQhoSIhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjQ1Nzs/Q0VOUFJUUFFRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZyopaKZoZeilZ2fqJ6oq6CorKmqtZervqu2yMi3ydHPvpugcGmrqZ+Ek5KFnKGam5mnkZGJlaKamnh6fpSYkqGSlpiBlJ57dpWSq7KIjZeffZSdnI6Tlpmkoqa2sJ2RmaiIlo+NgYhsc3J8f3xxaGBcYF5iZ2NgaGdbUkVKS1BPSUpMRkZNQ0hMRkZDQkdEQDo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHVgbn1hd459e5SOjoqfkpeelpuqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJjIqEkoWDhomBgIZ3X2JQNDYwLTEvLC4wMC8vLi4wMDE1PkFBTVFSU1BSU1VSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpOT1FZbYaQd5WLo6eqtL24pK6srKeotKuwtrKyrbuxs76cs8Osu8nLt8O/uKWjsLKsraqji5aYhaamoKKXgaaZjaKqqKSIhZSkoaCqoaSpj5yxi5Wjp7e7m6CjsJOinaOekaSiq6+ts7WilKSqiJmJkoqVeXp+hX5nYGhcZWJdZGNfZmZfWk9DSUhUT0ZITEZKR0VGSEFLRkNGRkE6ODY9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoGThYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMjoqKeoeCh5GPg4WAi4WGh5KGgoSJhoiHh3FuYUBFNjQ8Mi8xMTAtLCstMS4tMz9EQU1VUVJTVVVXVU5bUEdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqscHHw6qzxbass7+zuL62v7TBtru7o7fFqLbJx7W+ubSoo7StsbGbmZKan4mnr6ullHafpJehq7GzmJaqraiutruyuqyvtaKxq7G1u7e0rrWgp6ejqJqpsK2yuri4p5u2qYyljpGTn4Z4goN1WWFkVmVhYWNgYWZfW1RKREVMVVFISUpESUdFQUBAS0RBTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRldRSkxbWlFjZFd5dXGBlH2Eh5N2hX+AjHu/u6O8grSUk42bj4SIj5KJiXmGgIyTjYeEgY5/gYmOhoCGiYWKh5F6eG5dVkBFTTw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFZPXlVJS0pBQD5HS0ZFRDs+QDdENz9CSkpFRldUUF6Ppa2jsbTDtrjBzMm2u8S9s7PAt7fBtb+wt3Sxs6a6xaSvxrmxs7G0qKS1tqqxoKGWm6KSpbCupq2rp6SYoKyzuqKpsrq0u77Mv8XFvb2zwre6uL63ure5rKywprGqrb6wvbvCwqyZuqiUro+Xl6uJfYJ8aldiYVhqZWplV1tkWVZUSUdHTFFHQ0hJQUhEPj9CQktAQE1DOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldUWVVadmpwf4+EgY6EbnpzeYdiuKGZo4mVk5aTk5ONkJaSh4Z7hoGNloqBhICKenyLh4Z8ioOBioOVfXh6dWVPXGRHRUw6UWNhW15TRj87SFBEWmNRUVlYWWdZVGBgTVNPRUE/SUpIRUZBQEM8RTZCPkhHSkxTWlRdk6+4tbq5yb+6vcnMu7zAvLe1u7u3vbS6scZgdbKlsZqeqr2qpairqqOisrWhq6ielZafmJ+upaempZ+jlKKmsbSnsrK9tsG908nK08bCxcvBysPAvr2/u7y3tLC5t7bDusW9w8iwnrmqoquOpai2iYB/cV9iYl1XYV9oZlJYYVZSVklFRU5LQT5HRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ0MjY/OEA+R0tSVFNRUE9RUVBKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWdsbHGQjYWQc2xycnOI1cC1maCNlZiZkY6XkpaWjoaHfYaDjJaKf4N/gnh6i4OHe4t5gYqCl390fXprZXB1WV1cUGVlYmBlZF1bWFdcTWRtVVJtbV9uX1hnZVVZVEpEQUtLSEZJSEhHQkk5RD9IS1RUVlxaW5K5wLm9t8bAurjKy7q3uba4ubK3tbSutraYZHWonK1wXqGtnJigopuknqullKCfkJSOlpiXqJ+ln56amoSknaylqrCst7C9udTRz9fPyczRzM/OysbAv8LKvcG8wcDExMXKv8jOtKS7sLSvm6u5vJp/eWxdX1xYXWBZY2NRXGBTUEtDQUVGRDxART5CSEJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0k7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaV9wl5KQlG9sb3V1iLOsoaGfi5mcmYyNlZGbkoWKin6Ih4yQi4l8gYNze4qDhXuJdIGJhpV/c3t4a211e2hyZWlsaWZqaWhgZmlobFpudJetpLyIh2dbb2hdWllUSEtOT0pLUUtUUUhMQUpHS1BfXmJmaWGXt8ewubO7vrWxxMe1r7mwsLursrGnqresjbannZunmk+anYyOoJaRppillYqTk4mQiY+RkZ6boZealZaHnpqmm6yvqK+ns7TU1NTW0svP1NXO08/NxcLJ0L/KycrJ0sfMzcLQ0riww7zEuaW2usSigm5jXFxdWGBXWGZaUV1XT09CQkhFQkk7QUQ+QUc/P0I3O0M+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAtMTM0OT05NywuLDE7Rks9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VXc5CQmIJocW95eYOgqp6ml42bm5eLjpWRmo59iYuFjoqKi5CHfISCcH+HgYZ7h3KDkouPfnF4dWtxeH5xe214c2xpgXBtY2lucHhpd3x+y7/C36dtY3huY1thYEpQUlVOWV5QXl1NUE5UUVVUXG5udoJyl624rLSnsLarrLzAsau1pqW4p6yuoau0o46xrpqYmIyRk5GEjpuBjaaRnImDi4SKiYSLg5OVmJeTm5GcmJmZnp6rrKSnoaytz9LV0c3M0tPU0NTRzsjD1NHIzdLT09fN0tHF0tbFwM7Hx8OovrfQnnpuZV1iXFZgUl1bT1BUUE5IPkFGQUJFPEBCPkVEPkA/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk+NTkwMTAyMi0yRE4zKS8zLjMyPU4yMzhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WGhYp3bHdwfX5/oZ6eoYuNmZOTjIyTj5aFeYWPkI2LioiRh3+Ce3J+f4GHeYR1hZORiX9vdnJrc3x8dnxzgXdxa4BzcmhvcXp5cnu+y5p+jLKDdnKEdmhhal1DWlpbV2VkWGVrU1hdXGBjXWN4e36LgZmqpKShoKGopqqwuKqltKOhraKjraKnsZ+JppqUkpGJkY6IgZSJapWijZmEgIV9kYODk5ati5WNlZmOhZKQnZensKGgoaSkqMjNz8jCy9HU0dTSztPNxtbSzNTY1tbY1NfVydTazcnX19HKrMTDy4tzb2JgX1hUWVJcUEpHSUlKQDs6O0VBRDxCRD5IQj9CQzs7OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS07UjAxNy81MzJGRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN4coKJgJ2VnZSFi5aJj4qIjoePf3iElJmKjYiIi4l+g3hze32Dh3d/eoeRloCDbnhwbXV/dnh9c4V8eW2HdnRufXaEdXl7nbWMPEGLxqV+jXxpZVZJQ2ZjZWNoamRveFtfZmhrbmlugIOJkYudnqCdkJeYn6OkprKkpLOgoaWeoamgo7Gchp6SkpKQi46LhoOQhH6cm4yNg4SFepR+gqmVo4ySipeSi32XipqRqrOYmpunnKe9w8a4tsbN0tDS0MzSy8nUztDV2tfX2NTZ2M3Y287J2trS1b/LzLR4dm5kXVlSVVBaVkZHSkpFRT06NzlAQUI6SERARUNBQ0I7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJTMzkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGFxcXOGjXyXkZ2LfoeSgomGhYqCh3x4hZaXiI+Dh4WHeoR5cXp7hIZ1eoWOjZ16jHB8b296f3F7gXGDh4Fujnp0d3x8gnV/fIeIsHRYqcK2jJKCcG5iPV5ocnBxcG54d4FlaW9ydXhye4uHjpOSm5WglYeMk5ugm5+qn6CtnKKamZ+lnp+smYuajJGRjYR9iIeDhYuOoJmTiISHfm2ZeYSYhoiTjI2Ui4Z7m4iTj66qlJWXnpimrrW9qa29xsvIycvLz8jD0crU1tnX2NfU29fT2dvWz9va0dbJ1MuVeXtoaFtZUFJTXkhDRUlJPkE+PTc6PT87Pkg9P0FBQURBPj46ODZEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzRCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmt2gIhxkZCagHqAjX6CgoKEfoR8fISXjoeLfoaGgHeCeW57e4eBdHmSno2gdo91gnR1gX10gIRvgY+Cb5KEdHyBhXp2hnyJt8alwsm3gZabj3dwZU5mY4F6gXeGopCLeHl3e4N/fIR2bZOWlJWPmJCDio+WmpeXppyXoJefk5KXo52Zq5aRkIqNkYKMhYmIgYWQkZ6cmYmFi4GGl3qIiJ+Xj4iNiouCfKGJkIu8oZeTl5mcp6Wlrp6otb7AwLnHyc3Oxc3K0dbW1dnV19vU19na29fb2tnYztzGhnp5Z2hlYFRXVlVNS0ROQzs8PTw5Ojw+OT1ANj0/QDw/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eot8foB/gH2Fe36BkYmEhXqEiHt1fXRufH2GfnR+kp6Rn4OSfIZ+eI59eYqKboKagHSYhX6BiYV8fpB6j6mPkMKgvIyco5x9iYR9iXOMin5zppqcmJSFe4+QiYRoR3CgpJ2Mi5CShYmLkJKVj52ak5WRl42MlZ+dlKGUko6NkIt+kI6Oi4SIkpaan5+JjJSSnpGCi3+lmYiEjoKGhIClhoqLuJidkZWWoaagnZ6do662urWrv8bK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfct3h4d2tpZFdgW1RQT0hETUI9PT45OTo6OTk7PTY/Pj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmAjopxcnmKe3p/fX98iHp8e4uHgn50g4Z5c3pzbYF+hX13hZuhm56UkoCLiH+Yh4Cckm6HqIV6oIt8kI6DiIScfpqRio2jop+QpK6gi5GLhYuBkoZXcq2Ln6ubj4OYm5CQjlyCopGCjJ+TlYyHiIySk4yUlJSPjI+KiJabnY+VlpGLkpSFgIuIko2Jip2WmaOjhpKdlqGKioiOnJCDiI+Ag4eFpIaMkLOYnJKUl6GgnpmSnJ2nsbispbzCx83Hxs/Mz8zO18/R1K7W1dja2Nra19bZ2p9vfHRnZ1xdWFNXWENASUQ+Pj46NDk6Ozc6OzozOzs/PT43Ozk6MTlHPTozNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieG1ifpKDbm13i3h5fnqBfIZ8e3eGhH9zcIWCenV2dnSEgoR9f5Kmo5+lopaJnY+Ul4uKqJdyirKMhKeRhJmThJmLopagmJOJm52hkqmvn5GVkI2NiJWLbo23hZrEyLKcoaWbnJiWkbKRZKTNx5aPhYeJkJKNjZOUioWKioaWmpuPkJSThpWXhH+Pi5mIjZCql5eko4iZnpabiI+Hl5eKhI+MgX+Hj6WJjZOomZaTlpmhmJ+Zk5yborO0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6Ccn9oY19dXk5KVFpCQUdEO0E9ODM3Ozw6OD02NDk6PDo4Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj46RU1GSFJXU1JCY4FGdYGOfXxtfoh4en56gYGDfnZ2gIN8bG6Lf3l8eHh8hIeKfYqjs6ejqrOhlqefpaSWla6ig5C4lZKzmYyhoIykm6+jpJ2YkKeWp5mtr6SXlZaUkIuYmZagwI6kybirm6KmrZiRm52ynYaFqKKcmIWIiY6VjYuTj4iBhoeIkpiUjIuTk4aUmIaEkZCcdJGZs5aXpaGInJmTj4qQipeaiYqWjoZ9jJieiZCQnJqZk5iYn5SgnZWem6GxrqKkt760xcfEvcPDv8bNysnSp87N09LQ1tjT0Ni7cnl2XGBVX1dQSElORUJDRTU+Ojc2Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODk1NjY9OkpGREdOW1xZSWZgO0iEi3p7boWGenyEeICFgX5weHx9fW9zjXp9gXt4houJhoOSp7usqLK9r6Wts7Ooo6KwrIqZtZ2juKSVraSWqa23pqSin5mpmKmjr7CpmpmclJWRl5+Xmbu7rcmhaba4q7CUmJ6jq5OXvqNeqrKCiYqNlIeRfI6OfYOGjo+UlYiHkpeMkJWNi4yXmJKdmbSXlqudi5uUko2QkoyZm4qSnpCLiZWgoY2UjZianZObmJ6UoaCUnJ2lr6ihpbO4q8LIxLW6vbvFx8jC0aHGyc3NxNfW0cvToXB6aF1ZU15ST0ZEPjxDQUE4Pzg3ND5GPDw2PDM1MzU1NDU0QjM5OkJNOkE7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGVHYmBicElAi4p+gXOGh32BiHWCioN/bX19fH9wd4d3jYGHe42PjIaMmarCwK+9xruztMG8tK2rs7aMp7Kurryqm7ukqK25uKumpqKho6Oor7KxqpycpJibmJeeoqWlkqO5rqjAu6ytsrmlpKd9iIecrL2wg4yMi5CDj4ORj3qBh5CMjpyIh4+XjYuVl5SQmpadp5qxmpGsnI6aj5KOlJCQlpeOkaCRiZWbo6yUlo+UnJ6UoJ2bmKChlJqep6akoqSwsqbBx8OvsLq2xcTCvs2nx8PHw7zV0c3Eyoh0c2JcWV9bTUpCTEBFRz9BP0I7OjQ+QTw9NT02PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxmRmBpZ1pdW5OMjIh7h4uGg4x1hpCKgW9+fIJ/cX6BepV6kZSUmJCTlaezxsm/wszBw7nHvLqvq7m7l7K2urLArqXApKuvu7yqrauiop2nqq60sKqbn6qboZuVn7C0p4uiurq1wburqZyypaSolIWOqsPEpIKLj4eIhIaVlI16g4yRjpGhjIyUko6Il5+Xk5mVmKagr52MqpyNlY+SkZSVjZCVkY+hlIaXn6CynpSalKChmaSfmqCcoJSYnqakpqakr62lwMTCrai3tcnDvrbOssS+xLyz0crIwrV0eW1cWFxpU0xIRExLS0pBQT1DRDw1QUQ7OjM9OEIzMzIyNjJBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJmWk1lXGZUY2qZjZeKjIiSkIaJeYaUkIFygHyNf3iHgoKQeY2hlqiampi6vcjIysHSycrCzLzBs627vqe5v728xLeswamssru9qrCpo6WjrK2zrba1oJ+unqWimKO0vKmbqLzBo7a2r6uSsK2rrJeGmqqmpZGCjJOllYmAdYqSeoWNkZCen5OPlIuPjZSjmZeclZSjn6qfkaWajI+PkJWWiHyPlZKSo5uVoKKctaaQnpelpKOlnp6mmJ6Vl5ulo6inorKsqLzAxK+ls7fMwLmuxLO7vsG4rMLDwsCYbXlhWFdcW0tLTUpGRERJQkJBQ0s6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUY3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djZeOnpKJin+Jn5OEd4V/lX9/kIiKkH+VoZqupqOYwr7Iw8fF083Ozcu7wbevuby0vMu8w8G1tryts7+5vK6vqKCop7atramxt5qeraKnoZ2rt7eppa++w7G9ubOnqrWzra6WlqWsqKCRjpKxxaeVjn2RlX2IkZmPqpmYk5OPk5WTpZ6TnZmToaOinJifmYuMj4+eiFqQlpeSlqWZZZijnrKllqKWrKyrp5ueppeYl5iVoaSopp+2q6m6vMO0prO1y8G4qbassrq4rqi3ur24g2xuWldUVU5GSlNOSz9BR0RESEZHOTVGTTs+Nz5BSi4zMjAyNUI1NVBWTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxoVzs9QEJGQnFGaUlSZWJMRqWUnJahl6mWjZCDh6aTiIGHgpyEg5WQkJSOmqKfr76uoca8xcTGxs7OztLKvru1sbq7vL7PtsS9t7m3srG1s7izrKacq6u4qqinr7CXo6+kp6SktMCwqqy0vsK5wLmzp7m1uLKulaWtr66li5OVoY10wZp+l5mFj5aajLGVmpmVk5OZmaWjlZ+blpqpnZyhoJqLjY+WnWBKlpyalZqlllSWsJ+vnJ+llK+urKaaoKWUk5mZjpyfp6KZtKmqs7y8u6qwssfAuKWrq62xsaOhsbK0pHFuZlxaTlBLRFBQUFE7R0pJR0hCRD45S1U/QTo9RU0wNzU0NDpCMzROV088SktPVU5RSk9ISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBDQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aVg7OkJDQD1RRVdSc2JXRkiql5mgoqivmZGXh4unlo6IkoWfh4Sdl4+eoJqjpLXItKnGusPDx8rIyMzNxr66s665uMHBzLbIusG4tbqxr66ytKejm6qztKqopq2smaSupaSorLq/qKu2t7/Bv764srLDsbm9rKOutay6poicmKabdr+ghZmdjpOZmouvl6Gcm5eVm5+hqZ6ooJqaqpqip56YkI2RnYNudpKimpWdop6QrbKjq5WoqpeqrqWkn6Wpk5KZnIiUnKKelrGmqau6tr6zsq6+ubago6eopaecm6ypqYxjZWFfUktNR0hOSVVMPUxETkpLQkNEPFFVPUFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVlTUFFUSlFKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5SYE1VSH9lXkhFq5ScoZ+7r5mUn4uTqpuRkpOJq42Hop+MpK2Uo6O2xr20wLrCwsfIxcLNyMK9ubKvubTAwsq1xrHBvLS6q6itrLCjopmqtLqmqaarqp2or6ejqqq+u6esvLO3vca8t7W4wLG9wLOptberv6WPo5eRoqC8n4maoJmXnp6Pt5+pnKWjm5yhmqils6GbnaacqKqemZWPlJuLl4mMpaKUnaKeoLSvpaWTsKuZq6yenqOjqZGVlaCDkJ6enJWppKKhtLS6ta2otbKznpyipZqXlZmqoZ53YFxfXUpIRkdNUUlNRUZGQlJMSkFFR0BWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6Z1xGQ0OccGJHRKeXpJ+ew6ybl6SXmamclpqaj6qVlaimla2tmaGrtsTCu762wcLAx8S+zce7vbmyr7izv8PItb+vvLa5t6ajqqytoKCaqqrEoaSoq6aeq6+soqmov7emrb2wt7bHtrW5uL+xv8G2tLO0r76jl6OWlJyUrqCRoaKlo6OfkL6lqZ2orJ2doZumn72imKOfoqmroZ2WjZWek56Hj4WNk56koJ21rKaclbKnma+on5qpnqCNmZWfhI6hmpuTpaSamKyxtrGqpaqtrJyYoKCSjpCWqJ6UaGJZYV1OSUdKTktIRURJQT1QSUE8R0lIW1JPSz1IT1U0QkY5PkhHNUNhW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwwTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW9SRjxLeGViVkyimqOcnsWsoZ+snZ2uoJOjn5aloKapq5e2saOqsrXEw72/tb/Cu8jCvsrItri1tLCzs7fBxra9sLi0ubWfpqyqq52dnqWjwaWgqa2fpKmtr6Kmp721prG8t7a1w7Kzt7m+ssPAt7ius7W1o52klZKUoa6gmaKdqairo5rDramerK2bm56ZpqC9op2lmKurrKahmY2Zn5KeiY5Xf5aepaGguKqnk5i2o5+yoaCbrpaejpmUnYKOn5eVjqKklZCmrbKrqaGipaWVlZyYi4+Rk6SeiWFkWmNgTEhKSk5GRUFGSz49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dySEU2PXVlXEtNnp+hmJ7Dp6Wis6GcsqeTqqSgpJ+sqaydu7CorLWxx8TBwrPCw7zGw7zEyr2vsbatsLSvv8S1ubCwubWsmqiwqamanaWhp8Ksm6yxm6qirrCppKe9tqa3uryutsOts7PCv7LGs7q3rLS2raqippaVlaSsop+fmqirsK+vvLKmoKmpmZmYk6KkuKChpJOvr6ylp5+SoZ6Vno+QjZWdmqKfp7Smp42YtJyjr5qem66QnpOXlJqAkqGVj46foZOLpqywpaahnKCekpKak4WLkY2cnn9hZVtnZUpJTEpSQUNASUc7O0c/OTlOTVVeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVV5mckA4PEiWd2VBNJ+jn5ugw6ikqrKho7SplbKsp6KksquuqbuyrLC1tMa/xMO1wMS9ycS1wMjCtau1qLC4rMDEtLeurLa5pZmrsauqmJ+ml627tJuosJutn660saequrKnurO3srjAqreywry0xae+rq23taqorKGXl5KmpaKjmJilr7iusrW2oJ+opJmVlZOkoLeipaaWrrKypqqmoZ6bmpqWmKifoJihnq+yoqaNl66ZpauXmp2kkZuOk5eZhZaflIyQnJ6Ui6mpqqKnoJieloyOmZCBhZWJlJ94Y2hda2pNUE1OVD1DQU5DOjpJQDc3UU9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdITlA/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVKcGhWQ1dGjHlmQzuko5yhpr+mqK+woam1qp25sKujqrS2sbC5t6+2uLjEvcPHvbzDwcbAuMHGwbqqtqStu63Awre3qqyxu6KVrbCtspalp5Cquamgp7CdqqCwtLKqqba1rLyssrK5t6y5sMK6vb6mw6uwt6+pq6unnpiZq6KioJGYobGvs6uxupucqaCZlpKXpqG3qaWjoq+xtKuyqKufm6Cgm56lnKKWnaOzsJqfkJOlmqCompWhnpWYiZSYk5aXnJOIkJuZlI6pqKefo5uXm5OHjpmLfYuWhY+bamhsYWxuV1BRWlRBQ0VUQDs7SUE3OlhQZF5QVldEWV5dTUxSTl5LSj5aY15OSFBOW1VZUEtTV1pJP0RYUERGPk4/PUlHR1FQQj1DRkJNPzoyRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT4qJys9XHA9PjEuMWVbZEAxNjQ3Z1lgRig/OGx9aFtWO4l7Y0M9p5+coqm9oaqwq6OxuKmltbOsoKy0va6zuLy6vba2wMK/yMS5xMHAwLjEvcG3r7Woq7eyvL6/tKmusbael6utqK2Wp6iOp7ufpK2znquisbCzrKm2tLW9ra+xtaywtbHAusS3q7yvsbisraqjsaaepaqgpJeQmZ+zqrOqq7OanaebmpWNoKaktK6noq2trrGns62yqqScn6iknpWhmJuotamXmZKSn5meoJ6Qq56Xl4WVmIudmZyTio2Wl5qXpqWioJ2VlZeTgI+UhXqOkoOMlmVscmdwcV9GWWZWRENNWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJfUExNTlhXWFBKVlZXTT1FVUpFREFNP0FGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCslMisqNUsxLidfX2FVMTUwPWBWXjgpQzNZVVxnSzWMemZMQKSaoKSst6OsqaWurrapr7S6p6awt8W3sba+wMG1tLrFvszFucK/ur+5xLjBubK1rKq6tru5vrSqrbC1mJinq6qrm6yrjqu9nquusaOroLGts66utrG5t6mtrrGota+zu7zJsqq1tLG1sK+nobOgmqitoKWVlpuasqOtoKavlqGkmpqSjaKlp7KpoqeyrKq2pa+xta+kmZ2tp5qYn5mZrLiil5OQj5icoZiXlKuenJOAk5iNnZyalpGKlJOemqWhoaCYlZGTlXqLkIV7jIqDi5JrbnhtdXtgRWFqWUlIWVs9e0pHRTZBYlRpW01cYEpbXVpSUlJiYExLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENeUVwuKkIvSkdQW0gzY1lUSkSZlqCwqLGpraWkrq61qLe0uKSrtLfJu7S6ur++tLS3w8DMyLvDvLa+vsC4v7yxva6nurm3tsG2q62xuJSXpq6rp6KxqpSvu6SssrKnqKOys7CxsbWxuLOorquxp7ivtbTDxbaptLWssa6qp6O2n5+nsqCklJyalbKep5ygqo2po56blpilpaW3p6KytKynsaeusLWspZmgrKibnJ2blKm4nJSOjouZnKKXkJiloJ6Vg5GVkJ2cmJaViJeQl5unnKOgkpWQkJZ2hJCHe4WBhI2LbXF3dXt+XEtlbFxLTmNcP2J7R0k4R2dXZVtNXmJNWFlXVFhUaV1PT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydGYUxWJS1CLj1FTVE8M3JqSkNDkJmlrqWtrqunpLCys6q3sLagq7W5ybmuwbzCt7OxtcLDzsW/wb20vb+/ur+8s8Soqbmwtra/vK+rs7KcoKewraWlsKWesrWsq7KwrKmotLmstLK1rLStqayoq6m5rbGxx7+4pLmwqa2tpqitsKakpK6jqZyenJuvmqKjo6OQrJ6koJ+iqqWmuaWstbWlqquorK+2rqOeo6iqm6CampKktJqOiY2HkaKglY2UnZ+TkoSOkpKdm5iVlIeYk5WZppufn4ySkI2Qd36OhXx8fYeKiXF0cn59fVxTZG9eTlpmXUZEllpHO05tWGFbTWBiTlZXVldUWWdeUVJMY1pbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGRISis6ST8zQklTLD6PazxHSI+bqqqiqbCkqKSztLG0tbGxoautvcu6rsC7x7G0rbTCwtHFxb7Asr7Bwry/t7zEp6y3rLO4u8Cwq7KtoKSnramopLCjqrGqr6ywrq+urLO7p7awsqmyqaulpaOtuqyqscK5tau5qKioraqosaWqpKKuqqiinpyjrJWknZiemaydoqepoqylo62suLGyoKmioKuusKyen6eoqZmkmJmPoKeYhoOPioufoI+LjJabjo6Fh5CVoJ2Wl5WGlpOTl6ScnZyKkY+NiX9+iIZ8d3+HhYZ0c3GIdWxfWWBuY1FzcVxLO4R8Rj5XdVhhWU5jW05VVlVXUFxiXlNPTmhYV1dLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLklnREY4PEIwNUVLWDFAlFo+TEWUl62noqqynKmpr7asuLWuqqWrqr3Iu7C9t8KvsKyzxMPOzsO+v7TAwsS6wbTJxKyvt62yuL++s62uq6WnqrCpp6ixpbSuq7CurbGws62zu6S4s6ysrqern6KesLerqq26tqW1taOpp6ysqq2hqaemsbKjpqWhoayWqqGUmqCmnqSiq6Ssop+nsbetraOlopupqq6pnaKlpKSYoJmWj5idk4KCkImFnKCMio6MmY2Qi4OMl6ObkpCbjJOSkZSimZuZio6KinyGgYKDenSAhIJ+dHeLo4d4al5gbmdXZYdkTkBnkkxEYnlXYlhSZVRNVlVVVE9cXWFVS01pV1VXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxDKzpKT140RIY/SEZElpKvpKOqsJirqa21q7axq6Wrqqm8wMC4uLO7taWyr8TJy9G/wbu5wL/CucG6wcSusrWxs7vAvrOxrqyrq6i2qqatr6u5sKixsa+yrLaqtrWntLasrKSpqpyjnrOzqKiktLSgta2gqairqKunoKurqLm2qaqqqaKpoKybkqmhnaCkoqajqZ2cprWuqKapoqOXpaenqpyipKOfmZifkY6PmY5+h4yHhJ6eh4SKio6NkIyEhpWimo6MmpGSkY+Sn5eYlouKg390hoF/f3h1g397eH6BiJ2Pb3FnZ3F4XGBziGpPXZhWSG14VWRWUmJQTVVUVVBPWFtiVUhQaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKigvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg/Qyw+TFRfL0pqNk9EO5WOsKClq62Zq6WsrrO0r6qlr6mour68wLCuuK6hta/Jx8jRwL69u7zCvbrDwb+/rrKysbW8vMKxsrOqs6iktamlrbOzubCjrraxr7K6q7muqq61q6qeqaufoqC2raihn6+zobSqnqinqqOqoaKsrai9r6yuraGnqJ+rmZCvoZiioainn6iamaqwqaOfrKKhk6Kjo6eYmqill5eYnY+Kh5WIfY2GhYSkl4WCgouGjo2QhISToJaIkZ2Qk5CNkZyUl4+JhYV4dIF/fXV4eYB7dHN6aYGGo3VpXmVrgXVniIt8UlhwXkp4c1NkU1FeTU1SWWZOTFZZZVlGU2lSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8Pkg3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGg6MzhfPWFkP0YxQ1BbWytITjlVQTSQj7GfpKaro6akrKa0srGqpLCnqri+wbuvp7mqp66wycbI0cK8v765vr+8ybzBuLCwtLG6u7jAsrO7rLisorSmp6yytrmzp6e7ta22vbC8pq2stautnKmvo5+lrKqnnJ6qs6SzqJqqp6mkqZ2jqaepvqu0r66dqaSgrpybsqOVpJykpZ+kmpqoq6Wem6qhm5KboaWdmJepqZGYmpOQioKPhX6PgoCIno+Gf32Lh5COj4R/k5uThZOijJSSi5GbkpWHiH5/cXp5fnxpd3x6dXBwfWiFeISHZGBnY3KFem1neV1eVkJXem1UYU9SWEtMTnF0XUhaW2dZRVVmUEQ+Sk5EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mYkFKN0dTYFUqPTtEWD4qj5SxmZ+fqaWkoaukt7Kypaixp6y4wb21sKO5raiosMPJyczBtr2/tbe/usi2w7W0s7Wxvbi6vratubW/raGzpqqrsLW4tKuevLyossCzuqCvs7WqrJ6usKOcpaipop6cpbGmr6CfqqmooqmbpKigrbyorrCuoaujpK6enq2ml5+boaOcn5uao6qimpqkpJWXlJ+ilpuWpqyLnpGQkYyCioGAj4B7mpWNiXx+i4aOjYuKhJKYkYeUo4mSkoeQmo+TgYd8eWt9dnl4Ynt6cXBxcnhogHNqg2dkaGFuc45tYmlwYHBBXHhrVl5OUVFKSk1TWVZNXV5tV0RYYE9eUEhNREY7N0hFS088cmhKSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDBCaFkxM1M9ZV9ETDZLV2VPKjwyT1o9IpKZrJmfl6ekop+no7ivrqKvsKmruMK6s62fua+rqLS6x8rIv7fBvq+0vrfEtsOxr7qyssC1u763qbm3vauktKeoqrCuubGqm7u9pLDAtbShrre1pqensbOgnqSmp6GlmZ6tp6ieoKmup6Cml6OooLC4n6Oxr6GsoayknKamqJqam5+jlZ2cmp2pppabn6iSmJOYnZKZlqGqkJqJjpCHfYd/go58fKGNjYh5g4yFiYyMhYeSmo6JlZ+JkZWCi5eMkX2Ee3NvfXFzdGB5eGlvcHBvaX5xY3psaWVjYWaGf2BbcmpyTU1/aVhaTVBMSkhQUlFJTlxfblNEWFpSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpoSCo+L1lYNSiXnaWYnJasoJ+hpKG3q7GktLSqqLnEtbKuoLesrq2wtcbIwLe/wbmwtL23v7u/r6u9sLS/sb3Duam7urenqLWop6uwrbOxp5q9t6StvLavn7G3sKilp6+xm6CkoKOkoZebr6ahn6Knr6KgopOkpKO3sKGmsaufrKOvmJyqpamfl5qdpZObnJqdpqqZnJyllpWXlZyOk5ejqaGQiYqQhnqEfoSKeo+Xio2GeYKHhIiLjoWNk5iMjpaZio+WfoaXi496gHpwcndub3RfeHdkbGxraWiDbWZyaWtlaFxjc4BfWmt1aVpJfV5bWE9PSkhIUlVGMjlfXmxQRFhWWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIqOysxMzljbDg0R0FmW0hURFVdaEUuOzJhVCwylqOhl5Scqp2loaKgt6quoLq5pqy9xLOwrqK1r6ytr7TDxLyzv7q3sLO5uLq4u66twLO0uK+/wbisvLq1pqKzqqeps6utsqKbwbalqLW1qZ6yu6qnpqmvrJmip5yjppSYorKkmZ+kqKmcoqCTpaCkuaikp66nnqWhqJKfqaKhoJmbnaCSm5yWoKGrm5uZoZWSlZaajpSTo6ikkIiKj4Z5hHyFhX2djYqLhnmAhIeIh5GFlZOSjJCVlI2OlHuDmI+Ld357bHRybGxzYXh0aGhqZ2VvhGdnaGNmaGpfaGJpZlple2NgU3NUW1tTTElHSU9TQCEqaV5qTENWVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRCM0NEZ1tLV0dVYGhCMzc4ZE4nMp6ko5GOpKabnp6do7Wsp6q5t6isw8C2sKyita6nr6+3wMC8ssG2sa6ytra4t7asqr2zr7Kxvb+3rru7saWetqulpbSpq66gn8KrqKWws6qstbudqKqrsaWYnaqepqSRmaatopiepKmhnKKdl6Cdp7amr6quoaGenaGVoKafoaCZm5mckpmdlKWdrKKYl56VlI6Vl4yPmJqpoJGIiouJeYV3goKCnYeLgol8f4SIhoSQhJaVj46QkZGRjZJ7g5WOhnJ9fWZ4b2tqbGd1c2tjZ2RjdH9hZGVmZWlqY2pxWV5YXm1kYU5oV1pgVklHSEtNUlg+OWBsaUdCVFNcW0lJR0ZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQWZIJTWbpJ+QjK2hmZiglqS0saKxvbehsca7ubCxo7esqq6pub27u63Asq+urbavs7izqKu5sa+utLa7tq+4va2mnbWroKGwpauunqTDoLKkrrGvt621nq2vra6imZ2oqqWelZuopZ+ZpaOonZqgnJScna2wprmorqOhmpqdmZ6jmqSdl56Ym5SaoJKolquom5OcnJKMlZmNlJSZqKeNjYqJj3yCdIKBipiFh3yJiYSEioyIkoSTnJKSj5CRlo6Qf4CMjYNvgH9meG5oa2pncXJrXGhjYnJ/YGRnam1sZ2ppZmxcbG11cWFUYmhkZVlJRkxNT1hRUVZhZYFUQFZTWVVGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUllQyc0k6Kajo6wnZqToZqpsrCfuMC2oLTCu725saW2r6iupbe4t7esu6+tqqu3qrS5rqWztbGuqbG2trCytbqnqJ+2qZ6eqaKqrZypwJitpK6wtrWtrZ+xrbCqopuco6yom5Wcp6OdmqmipJaaoJ2Rm6Orqqm7n6ikoJiZmZ6gj2uilpiccYKWm6SAdZKqp56VlZ+RiZeZgJaKoI95hpSNg25qfneDcWyGi4Z9hIuGb15jYGeEl4Zri5CUk3V3i4R+g49/ZoaAaHVpZldcaXNuTlBqY2ZxhGZeZGZubGleX1+JkISGZ09LRDhFVGdeSkdQUFVVS0hTYW90ZUZbUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzU2OCwjMScyMTQ6MTc2WIFsMTZPa1tOXEtbZmI+RzFQZD0rL42kmYeVsJuck6Cbqq6ro73Fr6m3wri9vK2mtrClq6S4s7KzsLmtqqestKawtaOouLa1qKestrKutK2zoqmftKueoqScp6iarLyVpqWvs7itrqWorquspaGenKCnppuYoaalm5unp52TnqCYkJ6oqqO1sKOjo52Wl5iXo4ihjpKah6GHlJ2hf6V/p6uek5KbkoiEcniNjoSIoXaIjWmXiGZ9c3ihb4iHhH6Ne3+hoJ+ZgHuHnnSIjnabimyHgYNtaGVjemxxYlSGbWNsaZhxWGpvboZXXmlba2pbiHBteXKGaIeEWl5GTj5GXk1FUlZWUVFSV1RnXkxYSlJST0VHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxVmE3LyiMppeDnKydmZmdn6qqp6m/w66xury3wL6qpLewqaymsrWur7O2q6mlsa2ltbOcrbW2tKanqbOxrbKnr5+qoLKon6SjmqGjnK61laSlpra9pqynqqqsqKaioJigp6OZmaajpJicpKmWlKKclZOjpaagt6SkoKOYlZOYk5yIro+YlImpi5eim4WxgKStnpSanpV5gtSof4eUwZvHeXexpbeXZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQeoFslrGrsHloa1ixrm9labySvG5oeW1yj9h+UmtjtrJ/gXGUdZqhqpBXT1dhT1ZORlRbWFFQUoxcV1xQQF1FUU5ER0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjaaTgaapn5ecnaWssqiwwr2ytcC1t77Cq6a0ra2pp6+zqq+2tKioprWmp7ivnbOytqqlpKexrq2xpqqep6SxpKKhnpeboJ+vrZWeop+0uqKqqKGtrqWinZuaoqifmJuooJ+YnqenkZynm5SdoaeioLCjn5+jlpaSmJKZha9qaoqNqn5nhJWHrWVwnp2UmqaVca6hpH53u3xroY92sV9qtFulgGackWBmgXpmf2p4aqllvnJnpox2smp8sXh0kpNjbW2nbVuEoEVpZoeWRXWcYH1ne6Sngllfi6tpgZV4emqnN0qvW1dUbGNbS05XX1xXVjtOiE9XVi9JVFRJQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjUvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMxG5GilYKsp6Weo6Spsbess72+sLfEsre6wqepsKuvqamwr6SwurCkpa6zo6m4qZ6zsrCjpaCqra+rr6ann6OisJyjnJiVl5ucraaXm6KetLOhq5uira2gnpmXoKKpnJmepKCcmaGnpJCdo5qXoZ+sn6anoJufoZaVkZeRmoW1m7V4hamZtZl3h7Obt3+UlpeplH5rgaZ6gYWIkpSSd6tna7FbrHuPh5R0iHCPhoCAiJCXeIOCi5eMg6CPhLB2d59xa2tsfItOpFhIY2OZfmNopmB5cnVTkodeUKltY3F+h4BinS5RoW5bVGtnYExLXGRYXFpCPrB4V1hBI01pRUJEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05HOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o5YVU1MByVn5SIs6Wmoa6pp7Osqbu2wrC8wq24t8GqrK2urqausqmhr7yqoae0raSrtaWmsrOno6Kdp6qyqLCnpZ6fn6+Wn5mVlZaYn62impqkqLWvoamPqaiqm56VmKClqJmfnKOfnKCjpKOWm5+Ymp2jq5ummp2boqCXk5KTk5yD1ZOZuXCwwn7GhnzWlJu7fJqWpZCNnI2ke46Go4KlgnqseY+dVa97iX6farlauXeGg3ymgpN8mHqqeY6cj3uxbY6EdJC8hW+UUK+nxYpRoHpjYKpic3KHbJeIYFO1tMiGgIl8Y6QzQp12XVFqaGNQQFhmWmRhSkhNbEtbU09ZZlpDRD9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tcUF9mVDdHOmFRNzIlm6KTmLGnqKWzqqW0qKS7t8GwusCxtbW8s7WnsbCjsLOmn662qJuoua6jr7Ggs7SwoKSenqepsKi0qaScnZ6rl5mXlpeVlqGrnpqXqK2wqaOfj6yip5ael5yhpaGXoaGioZuioqebnqGelZmbpqCcp5Wcm5+hmZCSlZGdiLJuaLVxq4dvjqZytHNytnuamKSMj5yNon6QoKV+sHaDkdLRdVuufIZ/pG+bqqZrhoR8rX2XmY97sXOTnY54s2WWdISeb55mlFLIi1rCXJ95Yl+tX3Zzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPal9saU9VRkk5PVdSW1dYSEM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SEk5MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCTlRfZVA1Rz1hTTYyL6GckaWvrKSqu62mtKWntru8srq/t7a1urqzpbS0obGyo5+ssKSYprqupLGxnbS4qp+mnaGqpLGnrKmkmpyaqZ6WlZiYkpKjqKCXk6aqsaailpOtn6WSlKGbpKaflJqmpqGbo5+smqGfnpCWnKKenKWVnZWaop+WmZaSm4Wse3eodqOOiYepb62Kg6iDmZmhiZKaiqJ/kpiJroV/grNccrNSrn6DgqR/cdd9d4R9jp2HmZl3r4aKkZyHd7RhmmWagYKUbJJasFhLmnWYeWZgrV52d4dnmIhrXq93lZ6PeGw1eciusl9BVG9eZ2BFUGxfcW1WVU0uZWNpU1lROkFEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6ODifnZSguLCXtMGtqLOoqbK6uLO4v7m3sra9taW4s5+0rJ+gqKuflae2q6ixsquutKSbqaCgqKG1pqaqo5melaWhlJScmZKVoqWak5CnrK+moJWZqZ+ij5GimaimoJWZpaidnKSerJ2hnaCNlJ+bnqCYmZyWl6Kgk5iRpp2GqX19pXihj46DqnCtjIKnhpagoYqXl4ijgpGHlKp8gIudeW+xWqeDgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH6DlWySXKtbWpN/kX9oZ6pjcnuBa5iHcV2sWomgjmtuZU9KQ6FcWkx0XmJlTVphX3JzX0pVNkqak1lIRT1IRkFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUFINktJTkBJS0BFTjo6QDQuOj4xMDIxNDQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8xVV9iTDdGSV9DMT44oZ2Zmb6rl7TCrqutqaW0sLixtb+5urOxt7yqu7SfsKSepaennpSqsamwqrWsq6+hmKGgpqSjuaKjq6CXm5GioJWUn5qUmJ+fj42MqbCvpp2Xm6imn4ySpJeoq6eUl6mnnp+ho6ykoZ6hjZShmJ+gkp2XnJWeoJWWj6ubj65tcrRyqYx2iqZztHl0s4CSpKKSnI2JpIePdrhvjHuLomtrtlmhhmWXl2mhoqdtk3K0dJOYf7JqhZOIrWt1s2GdZqJvh5Jql1ytYE2hfIeRUnOjbHl/fm+YhnBcr1Y8nHdmVG9uLlynT2JSa2VhbFliXGBwe2NTWVE+Pm1wM0JCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSTZJSlA/SE5DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VfYUw1Rk1eODFCOKWam526oZuywK6tq6unt6m4r7TAtbyxr7m4q8G2qaqgm6akoZ2SqqqntqOyqK6qoJecp6Ckq7mdo62blpmPpaOWjZ2hm5mcn5CTlKu2r6eZlJysqpeMk6WZpayjkZeqsqOgnqersJiho5CZopegm5abl6GTnKmclJGrmYfUkpq7c7DDgMOGftWWnLh4iJCYjJeJjKeIeqO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gIpumohxbo2kdL1dd31bYXm8a1pWW2p6XmpgZGZibXdvWVtZQ0FAcj9DRys1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmnmp6hvKKXscOwramqq7Gnua+2xbG6sq67sK7Bsqylop6joZybkaqkqrKktKatpJ+WmqqZpqy4nKKtmJWhkKWgk42co56YnZqQlpOvubGrlZejqKeUkJaknKStnpGgqKufm5+po7Keo6WOp6KUoZqcl5WkmI+woJKVqp6FkJm1gJCRjLiVeIKTm7V3bmxuc255j4SOiXOewbu8mnuBsqhwgHSRuIN8hoaLh417ioaNl3yku7m9nHV6s6N0dpd1dLB1mZ5mhmmNtXRycHe2jF5/eX2JZ4N5bXlii6xwdYV/WVunakRkWVNmYGNdY1FnZnFsdUJOUExEO1pMPkozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVjgqT11dPSs6VlYnPTs8p56goL+llrTDtKyqp6yrqbuusMWvtbOut6e1uK2po6KmnqCdmZSspK2qprWoqJ+blqCjnqukvqahqpeUnZCim5KPoqiik52XkpiUsrW2rZidpKSii5KRppulq5uWqKSlnJqhqaano6mhkq2fl6Oel5eXnZ6PsKmUnKeijmp+aZyneIlzfpqPdHplh3q9vsC6bpKDcZSGYHJqWl6aiWFkh46Va2B/lWNtnHZilGt/mpWUZV5gY3GaiWhyjH2GlWdqfnF0eH19Ylt3dIFoUFxug3x7i2pYa3qCcklKb4VwTXRNRVdcZmBMW1hnY15PW211aXFST0RFTTtISTxMPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltcXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SlJfSSdTYFY0KVBeTCgzPVtPJz8yPqigqKHBo5q0urairKWup6i1sazIrLCzrLWjvrGypqCjqZ2jm5qZrKeupKS1qaWbl5Whm6esqL6nqaaVlJuVoJmTmKWpp5GekI+YnbCyv6ybpp6noomTkamaqKSam6ufo5mbo6etop+qopqwm5WmoJeUnZ+dl7ClmKKomZyRnZyjpJmno5qcmpqakJaBaG59cXeRl5SRhYq1qo2GmJWOioyXl4eUlYqDkpORiY2Rk5iUmJeaoKKam5SgnY6CeqWGa2l8kHyAdImKgXGCeHl2doqAe4pqc4F0g3Vjd312a3B7bWBjXHBnTVlZZWpfV1pvem1tZlNPRlM5T1pOUk8oKzpKQjYzNT1AQTk6Qz48RU5TU1RWV1hZWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0omUl5TMTBUXjorPThcSyw8LUCyoLOhv6KksbK3oKmlsqelsLWqyautsaW1psCotKCepKWcpJWWoKumrKOjtqygmZaWoJetqaXAnquklZKcl56Yk5Sin56ip5ORmKmnssOvmqudq56PlpapnqqcnKCsmKGanKKlr6ahpKierZiXpp2ZmqGenpywoJ2ippWYk5iToKKWo56XoI6WlIuKjY6XrY98lZuCkoKLqqiGgZiWioSOn4h7hJCGhZmQh4aJlY6bl42QmJ6jlpmTkZ2Nf41mobOuhImEdnqPinx2eXpvZ3mQgYCJa3WBeYhyaHN/enaDiIJrdGN5ZmBpZGJkZmpZa3twaWpcU0xQRF9VRkA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTU1EL1RdUTA1TVsxN0U0XEc1PCxAtKC5r76sq66ysqCqprGtoqyzsMWwqq2js668pLScoKaioZ2Zl6ilqaakprO1npWUnZmZsKauvqCro5CRnpqZlJGVoZyXqZyEnqmsorTIs5+qpKuWlpeap52om5+kq5Senpyfqq6ppaOroa2bn6ChmKWenJ+dr6OZn6iTmJidkaWZmKmempdmg5J8ZX6Omo9jeY1saGt6kaSra2WamH5nhYplZWloeo2hjmtojJeRondraouYo5+Yc2xueoSNhnlYZV2FgV5siomAdlxoc3d3kYCHgm53gniAc215g3R3iIiOg3tqhVlea3RkXXOJaWp8cWxjXVFNV0pkWEBKND1GNz9GRDcxPD0/QUM7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUpbSi83Wk82KUVZL0RPMVlDOz8uPaWfury5r6uzsKqlqK2usKaurbC9samopK2vsZ+tl5+jnqGamaarnKyjpqipsq6elaOQoq+mtrmlrqOPjpqhmZOSm6CZmaWWe6Wsoqizw7ekoqevnp6VnqOeo5yjqaiRnqCdn6qvqqujqp+om6afp6CslqGbpbCkmJyqlaGempOlmJ6rmZ5+voOIcrRyhJ2GrWh4ucS4cZOio3ummJlzqoJ8y8DAu3GLooeCn3yVmImewL2Clp2ejZ3BwXuBe5GMmsK/fWulsW+MgG/Ken+bd5GDjoB2eYF/eXF6f4dxeIWMk3ltdpJiZl94ZF9lgmNedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0JQLyNGWzNQWS9VQUI7LziWo7jDtbCvwKmolKOvqbCvraayta+qpqamsaufq5iaoqCcm6qnopyroqWopaS0o52ikqatrLezp6+ikpGanaWSkaChl5yfnYenq6Srrb/AsKGpr6mXkp+dopmio6qjkqChnZ2trqispqOip6ClpZ2tqZGkm6mtqpydqpysoZaXpZaho5icf86UeXqkgXmVlptfro9ejqeBoaB8p5WbdKuDgK9eY42qeqeHhaB0l5KIs2OCq4ahjo2zaYSudH2Wh7hhgq1Zo81uj3V72nt/mXB+iJJ1f2V7iHZ2a32Ibn6FkZJ+bYGOYHFrcGdgX3lkW3BoamRmYFJUUldeS09DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w7TC0hUEBGNC4xrcK/v7W0sLeYnpGkqqittKumsqytrKSrp7CqoKebmaWXnKKvn6CfqKejpaGfsKybnpWnrq2xq6isoJSSm5+lk4+fpZeeqKOerqSqsKi/xrOoqbGulpKdnKKXoKmqnpSgn5ydrq+nqqmbp6ekoauSrbSWpaOqqp6jp6ahsKCSmqeaoZuUlJGXoHCFjJd1haiHcbB8nXKsfqGegaWPnnergn2tf5xyrX6rh4afdpiSenyXfqqIooyRi51+q3uJk4+fgHutVpzEeo9vksF9gZVtdXCMbWV2ZYZvYXducm+JipGQg22Qj2RvdHVwYGdtZF9vaWluZmNXU1xhWlJTQzlJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz1XSi08Jz4xKTNWQEYhHEc6QzEuK6/UxsaytJ+do46jo6Gsr7auqLCnqaqorqurp6KknZmilZ+mqp+ipZ+oqKKfnbCsl5qWqKeurKinqZ6XlJqjopKUoa2bnaajr6yjrLSpuc2xraeurJaUnJ2imJ+urJyWoJmdnqmxqampm6upo6Ksm6+xoqisrqaZpquqqrGikpejpZuUkoWkaqR1iXqpdHqycIKliZmMcIigmoekYGBSrIR/roKadq6BpoaGn3qYloZ7ZoCjiaSZhoGjfal+gZSHrl58qVWdopKBeqKfgHvDr8WMc6+zs7lxYqmvwnRojYyYj4FtmpJvbXl3d29sZmRlcXBme2hjXVdfaVhYVU1NUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NzQsJiQiICgnIistIiQuITMtJkBEV0gsRys2NioxUEtMIyBBOUQ0LCfCydXVwKGZq6ihr6KesLWwr6mso6imqqqrqaSmoJuknp2lp6ajnKyaoquhpJ+vop2akqqktbCvoKmbnZaUp6OQmqKon6CmnLGmo6ixrLbIsrWqrKmVkZydopmfpbOcmqCUnJ+nq6ujrpqsqaKhqqOzraKqs7Ghm6qor7C2o5OWpKeYm5F8qmyehId1q3l8sG+CpIuJn5aVnpSB0ri0uMmAgbJeX5Spg6SIh6B5mJWaeKrJdJmjlaepkJKbjH+biZrGxnhloYKlc4GfjoJ9r15vtWOxdUujhm2nR4KTZI+QnpN8cJeSf3B6dHx7bVtmanJxZoFqXmJYY21cXllJTUxLRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Njg1LykoJSYlJCYpLDRFTlBQTUZLSlZGKkwwLz4tNU9UUR0cOzxGMiwkp6TAxrmtqLKurKWinLK5rKqhppuopqqsqaagpqWYq6OfrqudpaCsmp6opZ2mtZ6il5OoqrayrJulnKCVkKWtkZmcp6OgqqeuoqOnqbC0wrGyqq2ok4mYnaSaoaOupZehlZicpaarmq+draimnqyjt6yhsbmvnZuvp7O0s6SUmKikmp+Ogp1OeJqBf596hKN8gqSEhqaenJ6ThLh7fHm5gn7MxcK2eJqhkYuffZqWl4p2npiKpJijqH6whZyFnoSsfZmUYaVso3CPhZCBfZeDcqxgpHNxgJpgvH1SVXWOkaOXfH6SkYp0enOEfnBbbW53cmqBb1pkX2huYmRdS01RVEJJSEZJOjlLPkIxMDg4NjY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMzpQW1QcGzY/SCwtIIuHmamspKu5q6+gnKGss7Omn6CVpa6trqqnnaammqOnobKuoqimsqCZqaSUorWio5WXoam0uaSbo52jk5ChspmenKemoaKvrp2kqKG1scOxraqtqZGHkZymnKOknKWXnpiZmaWkqJquoa6lppewpbytobe3rZ2dtbK5sbOnmJ6woqSeho/RtcO3eYeOhZGTj4CmeJSid4ygkoSlgYpxqoaEtG5yapmjm5WKn3yYmYaHj3OvgqWboo2mi5OdiZSQm21wslylc5N6nGyZf3uZfW6pYaJxcX+fYnOyuGh4j5OmmH6MjJOKd3x5jYFtaXhpeHNuf3RdZGRubWVoYEpaWFg8SEdAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVtaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVZWVFFPUVtVJSEyQUgkKSWSc42Krb+/u7q1npeopK21oaOZlaOpp66qq5mlop+loKC1pqKop7CjlKujjqSto52QmpqqtLSknaWdqZGUl66goJ6npJynnLWaoKqjtavCsKmrqaGMhI+boaCmopWZmpyYmpmmpKaYq6etoqWbrae+rJW9sKyfo7Czuqy0p5upsqWomHqokH18sHeKgaSliJxtsm+hh618oY6Dp5WYgKyIha6Fn5SooKGWhp+AmZWAe5J+q4CdmpaKqnidoI+Jk5KAea9do4F8pqdknYB8l3Rrrl2la3GFmV1gW4ygbpWRppmDlI2Wi3p6gpZ/a2x/Yn10bX96YGdlcW9nZ2hDWWBbPUtUMlU4QkJDNyQkMysnJzMsIC82Njc0MzU5QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaWFNQT05JNzA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNUVlZXWFZVVVFIRklKIygovJKahKnGwrfBtJ+brZ+uuKWkjpuko6Cvr6qfpJ+drZieuaCiqqCvqZmtoZCqqaSWiZqQrrCspp+nm62YmI+soqGdpqKapZ2tmJ+opbaov6+lqaSei4COm5qgpp6SlJqak5qapaOjmairq6Okn6movqSXw6yqo6Gssrqrrqegs6+pqph2r36Qi5yFh326rYqYZLCMZZWtfaCPg6aVmoGsioSwhaWZpKGhkIWgW2xqgbNgf617e4KAsWxnbpmXjIiwW320W6SDa8iiZZ+Ae7xZdrVasn1Sr4B6rFiAoW2Yj6iaipeQlpZ7eI2cfWRzfWKDd3SAfGFqZnFtZmVlT1VjW0JUXj5JKD45PTQhIiwlHzIuICoxLzA0NTc5OTxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE1KR0M1NTMuL0BVWlhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7K3vbu0wbOjnK2mpbaooYuaoJ+ds7OpnqOgnbSXoLOoqqudr62dq5uVrqiijoibjq+rqKaip5muk5mPqJqhnqWfmaOjpZmeo6myqLyvpKienY58i5qVoaCZj5Kam5GZl6ieoJioraelpaOlqbufoManpamhq7S2ra6nn7yurayVgamSo6+Om4CGpJeYj4CAuMO6g46dk4Wnl5yCrIqCr4imm5qlqpB+1b3CqmKjv718fqOCg9e6uLWFlJODnr2+hGqjgW+rhG2df3qysMeDaquwva14d6K+u3SAlo6mnI+akZaceYGQmnljfXpkjGZ5gntga2VramJQYltTalxAVGFCTik9OjQvHh8kHiUyIB0kKDA0OTY2Nzc7PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSUM/PEE/NT1TWVhYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbO0sb+5sr2zop2upqWzpp2LmKW+qbexqKG/pqaxm56xnLmonq2upaaVlK+sl4yDmpGupqOsoaScqqGYi6OSpp6onJqhqaKZnqCrram5raijm5eTe4eZkaabk4+RmJiOmJOpmZ+Yqaigqqaho6u7nqnFo6Cvo6uztauwqqC7qK+vmnN1qqS3hmWJn3BnrI+Kj21vd6SQmZ+Bda6ZlXCPi3GVp6ObmK6kcm1tbWWKd25tgplxgHlpcWlniZWVmHFoaYSGZ3CGZF2JY2pvWV1nfnemYGJxjpJvZmSAjZKOopiXmJCVnnyHjpR1ZoZ3aI1qeX55ZGxjZmxiS2RYSmtZOlFlRVInSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBgYV1dW1RQTEhEPTpBQjdNWFpaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWts6q6ubKzq6mirp6jsqmYkr2xw8i+tqqewKyso6CnrJ+6o6StrKymjpatqZCMhZWWrJ6lqqGfo6OgkYykkqeZqZmWo6qglpylpaevuqusmpuSknuElo2ll42RkZiTjZiVp5Sel6iimrCmnqKsup+wwaiks6assbKrrqyouaOuuJaKoailtp2JlqKXhqmakJSdk6qzmZujq6CylqKhnaCinKCkoZWrpoySkoyHkpyclJCZk5iQjZWGgaSZl5WNi5OSio+GhH5nin90gnZ0h4xxp2x7lZGUk4GBj4+Pj52UoJWYlqCCh5OMcGiPdnCKd3Z8empsZGRvY1VgWEBpW0hjYU9aK0Y9KyYhNzQwLh8cISUyKCo2OTk0Njk7Pj9BQkRGSktLTVBQUVdUVlleX2FjXV5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqltbeurqKwpK2foLWxkI6rxbzEu7iqoqWdm6WdsKmjtqedqbSmp5GYrKKLiImOnKeWq6ShmaeenpOVo5eom6mZlKaho4+ap5mhtbqoqpiakI18gZSLoZSKlJGVkJCTl6WPnpmon5y2o52nrLeorsGuo7enr6+wraqqs7mhr72Zkqajpraikp2mno2pn42Sn6Osr5qho7Gor5ekoJyjqZ6enZyXq5ySmaGbk5CWqpmNmJiWkJWekYignZWUhZKMkIyUioB+ZoyGdYZ2eYiDc5xqhpGUlJGKfYyWkpKYk6GTnZagg4eXhnlxlXJ5iX9xe39qbmRfcGlgW2BZbWNQYGRQWzpHR0Q9Mj09Ny4qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fX11eX2BhYWJhYWFgYmJiZGJcW2OXlaSno7CzrK6jqaetoKi1qpCQnaSzu6+srKKjmnqdorGkpbColpu4pqKUmKmcjoaKiZuikK6eo5Wnn6GSl5ibrourlo+omqiMmKiPnrm2pKWYm42JeYGTjJqTipSRk5CNkZaijJ2eqJ6fuKR/hK+1oq+vdaS+o7KgeHqgq7K7lXetpJ+KgKp+ZFxidp+OpJ2Dl35uk7Oco6euq6Jlnp+Sc3mZl3CAmKiXbH+ip4llnKWckZeYlouRm5GFnZqQlYKSh46OkomFd2uPh3aGcXyGgIBhaYiLlZOLW3aVkWdokI5ye6WYmGR5mIaBd5dpg4qCbnl/a3BlYHZva2toW2ZlYmJvU1s+Tk5OUkc9QFRCOTEvHh8mNDozMTY2Nzg8Oz5AQUJGSEJHRklLTFNUVVlcX2hmZ1dRSjxERzs4VVJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mm5amo6GwsayrqaWoraOnraSSlqu1r7Gmmqqmq5dzi5yvn6iqppSWuKCgj5yjnZF+iIibnY2rmqOVp6KejpeRnoV1rpCIppqnkZajiJu6tKegmZiLiXR2k42Wk4qUkZCUjI+ToI6an6aZnLKWgIyctZ2zjJKPvKehfqeieqOvt4GOjqefhIuFj7Gpr4yJlqKaeYGLrIacnaKnqaiHlYaYdqWbeoebgZemgoF7nLF6ioWgl5mUmJaBkJaWhJmZY3mHkISNj5KKg21wj4d5gHGAgYV/hnSGhJaSeJZok3SgmnR8mYOgnIaYfpGJgYOYao2MhWt4e3FwZ2R3bmlsa1tla2plc1teSVRMUUBFNS5ZVFU2KSEwOT0+NjQzNTY4Ozo9Pj5AREg/SUVKS0dSWFpZW2FhaGZZUUg5RUw7PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJyYo5+mrq2rqKygqLCmp6mlmZSuxr2woZamqLWej4Ocq5ymoZ+NkL6emY2fmqCQfYWOmZeIq52ilp+gkY2TiYaAkaiOh6Kco5OWnYafubKnnZqSjoVwdZCJlZCKlI+Pm4uPkZ+Slp+klp6siJ+0ibSarYrKh6quiLeFjbCDsa6DqY2mmI2dfKiPcnt3m46mlmiVpHm0i5+epqiSmcKBf6uImKFxnoCZpH2XhZWxgKF8oZSgkJiWgI6Tm4qXkYt8hZOGjZWTiYNtc5GFf3pyhoGEfIR0hYKXgY/FZoCph4+ia56DoZmCmYCLjIOJmHCOkoVod3R7dmdodXBnZ2xeY29sZ2xYZ0ddUUwyRTQ2TWBjNyYzPERHRDo2NDY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQEpkWV1jZmhnYmJiYmRjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS5sKqrppqUoKOkqqOWpKm2o69/oKecpZ6diZO8mZONoJGdkHmElpaRh6uZm5uZoYWPjHebnI+gkYiepJuVmJeGoritpZmbjIx/Ym2Pi5OQjZCMjJeLkJGfj5OfoZmhqH6hp4etnaCWro+enZ2RhoGgjauvhqSNqpqMmn6idoCZk2qBq3VNq3iHjZ2Rm6ingKqrfYOhe3qnaZ5/kmtnl4aXtomefW5gZFmDln6Me2RoinKZfXmVbF17l21fU3CEXF9seYNgWWWCfYSBmHGnqmuDo25ypXCfg55pZZ9sW22Je2VZX4N/YldQb3ZlbXRyampvXmpvbWxpWGlPXVdFOUE0R0NeazQsSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl9jdmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBjZGNhYmlrZGJkZGdkYmdlYWNomJadoLmhqqOmrJKhtryrrqKZl6Chpa2toJyttaKokqCfn6abmY6YtJmQip6MlYt1gZSRjYqmlpWYnp5/koWGrKSHnJGKmKiXmZqRh6WwpqKVmoiJgGhuiIeLjo6Ji42Si5CSooyTnqCcoqV/k4GPo6GUoHeclo+ng6Gnf4aprYWleYp9hJp9onByk4eVep2MeW2HnIyZkJuomo+HnHuConN2pmaefnakX5h6fZJzom6Yt7S6c5KHgX+1qGSBxrh7cJW3i3GAm6Rjc6yrYH1qnbN+bn2Hg46Ci5dxgKNsc6RznoN/pF+dmbOVcHyXnrR0c1uesoNqYm9zdXFob1hrbHJzZlxpXmJLRD1ENVFBWXEzPVNHX0pSPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWldgYHxkSEM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO4mauck6CNpLi1rq2gm6Kco6Olrpybsa2sk5egmKCkmZqTnqubi4iReIuFcICWjYqPoJCTlJ2XfZCJjqigh5iPipGik5uajIuoqKSej5aHhH5reoZ/fY+Ng4uQkYmPlKCClp2gnaCfi4l3nJiijKByoouIqYicppCWqKt/rox9eqCZeqOTeIBzloeMnH2WoIebjpmbpoaiZKF8iJaQm41snmibjW6amXuAiqd9cmhzqYKcgnOqZ5SaXZuFdoSdaKpqgLhmXKhwgZxhlYxep3Z1iYp/nmiadYeTkpiOf59umpBsp5lcqH53u2t+qluOhF20Z1xucXl3a2lbcWp4eWJfZlhiQVBFTjdWQlJuNEtaWl9OWkNAMTUxOzs3SD86Q0dUP1lSWV0+RGJeVmBRYWN9aUVCOU5bXVhkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtpuoiWOUm6y6srCsnaacnKifnq6bnbCoq52Xopmhn5iWlqCjmYaJjGqIgHF7l4iLlpaEkZSYj3qKhJajnYqUj4WLnZGcm4mPqKOgmYuRioCAaYGGeX+XjHuIjo6Hj5aaf5Oin6Cik5hyaJ+Kn4+McJKMgamImZ+jqKCofbCto6K4l3ajs6Kjf4iUeJ16q5p/oo6dm5eIl3GhfIWNr7V9a5qRoXh+mLSjo6uohJl8mnycmX5zqlpdb3uWi3ieYkx+enqFY3mXQk2fWaJqcXyObYGJhJl1m3mHibGzf3+bk6d1gJ1tcXyUb5lyaqRdlXZIZWNgc3B9fW5lYGxodnxjZGFRXlZdVFZAWUVRZ0RTV1tiWF5JRD1COD9COklFOExEV0FWUVtWREZiXFpgS2BtfnFFQzxVX2JaZWpWZ2htb2JmZl5hYVxdXmFoYl9lZHZsXmVnZmxkZmxoaGtpk52Asa6ZhFNfoKezubOzqZqijJyrnJypk6GrpKGoj56dnJqZlZihnZaHhol3hYFueZWFkJqLfJGTlohygImToJxzkZCBiJiUn5qEjqicmpSKi4p8g2yFhXGBoYx4hY2Ih5KZlXySpKGfo4iuhn21hI6enXullnmpgpadkIqhnX2naHZtfplzoHNxfJ2FmG+Tgq59pIOmnpqBo29eqGd1o2NvpWGc05B8epl4cnNjooWQfqJyoo51a4+zi2CCmIlzqrKovH93g21+vqaptF6cbn1xl2+Bc6JyXaNndKZhaKZtm9SZfIObb3d5l2ubeneXc22ppGdgZXlwf4NrZ2ZkbXV4Z2BiU1tlUVFhSVdJVF9XU1tlalxkUEVDS01KS0JKRThQP1BNV1NYT1JSYGZlaVJjd3l3SUZFY11kWmdpVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJebf7CrVFxLfqmvsbSws6OcmIWYqKCgo42kqKCYqYmZl5iTmZKSoJiOh4V7cH2EaH2PgpSagXeRjY6Jb3+GkJOSbJeUfYiQkaOVg46qmZSSioWJeYN2h4Bugp+Gd4CShoiZopd5k6Kkmp+Js6Gitot6rKekrqVwqYGakIWBnJJ8pICimYaYcp6Eoq2uiZeLf4ykjZaDrqKUdrS1tcmhc5SKgJ9gnZepbXmVhp+adaGHd6B+kZaKgG9MZqOScJqHcqR7eXRhg4JsfqBrcWRgnHJ/dJdpe2mztbTGpnOYfnudapubq3WDmmx0d5dpmnp0mHFQRH2zXmp2a3iHZmpnYnR0cW5WXlRZaE9SaElVTFlSVVxna25WZ1dNSkFKTUtISk5BUUpQZGNpbWV0cnN+eXtudYl7e1RQT21daFtraVJqaGlsZ2xmY2VfXF1cXmliZGhre19dZGhjamZvbWVpbGWhnImvp4RmP5Shsquvr7Wio4+Al6mioqWMpaednKWCmZeWjZeQj5uSjoiCeWp5hmWDjH6WoHl1j4iMgWmEhZKDjIWdjXqMipSlkoOXqJeMkIqBiXqAfYt4cJChhnmBlYeJlqCWf5SlqJyWloRnbnicbKJkfHGld5yXcGengZeMe6V6n5aDl3KedoGJlJaPuW6QiqJifZmilYhtcmmranWgbG6mYJtpi5BoloealXWigH2aYIuFjHVviGJooGWefmmadW9jZoiCbnKiWl9bY6FuXYmMb3t/c3JkpW13omRnp2iYc4uYbqFvU4iPb6BfZKdUi11UmG1tc2txgW1waGt4c2tvUlhXVmZZU21JWE9dSFhpaHNqWWtWUVJFVlxMWFJhVGhqXnd1enxwfHxyg3t/cnaNgIR2XlFzYWdicGdQamhoa2xuZ2RnX11eXWBrY2ppdnVdXGNpY2pqc2xma21jnKWZpnpldG2Lp66kqbCxpp+LgJernJ6ljKKhmqKigJWYk42aj4qXkI6Le4dxgIhoi4t7l5pzdIp9kHtkgoeVioqVmYJ8iIWWpo+BoauQhY+Jgop9gICPc2iPpYR9hpSNiJigjoiSqqediaZ4lpx+pYmWjLKYnpCDr5efpXiWiHqpdKWPhJpupKKMkoSMg7xufKWvgoaGh5OWnJ98pXpxqJSglmeefm+rY5aKlZJ3qGypooGJdYeCd6uRpohrkbBrdrOMqWuKhm5tn56SlWF/q4uqdoB/jKafd599haWVnaBpmod2rGeerYy3c3e+jaSTWYOmjathdXJzb3t0cWJqfm5obVNWW1VhYVxrTVxSXUldbW12YFtxWVtgWmdzZW5vcWNxdGB3en55cnmDc4R/gHt7jIGCgHZieGRjbnNkUmxnaG9scmlmaWFfXlxia2JtbHpvXFxiaWJsandtZ2xuYpWmqp2BgJ6klqmqnainrqOZiYKXq5qepImapZ2pnISMmo6GnJGFko2LjHSGeoiEb4yEfZeTdHSGcpKCbX+LkoeGlI98e4GFl6SNf6WljoGNiYSUdYKHkm9si6mAg4uUjomcn4mNk6ujoJCAdZSWiH6BeZSuo3+Bm3GPhniQjIR/e3KmjHF9fXqXlpuEjnh7fn6IlJWTinaQmJ+gg3p9iWuMhVt5eHF5cGhufpKJcX90gY+Tk3GFhIJljH9fgX+Ld3VzlHVveW5uh22EhV53aXiNZoGCho6pm350fJdqiYhwgHZ8hXZtbGaMc3l7mHiEW2pYeY9obndycW93eG9dbIZuaWdWWmBXXGVrY1VhVV9RX3B3eWxqdmVqa2p2fHFydHNhb3Vic3uBeHV5gnWAgH+AeIuFg317bX9sZHluXlduZ2h1a3hqaWpkXGBaY2plbHB1blpbYmtkbGx5bmhsb2GOlLmpp4uhopqmpJmknKuioISEl6ySnaCJmqaaqJiCgZuKfpaTh46JiI1ygnyPfX6OhHqXj3Ryg3CVhXt9k4uGhpCFeH5/hpiijHumoIuFj5CElYKGjpd3coWqho6SnJCInp6IjJuooKCrg4mNlJp+fomWraiPk6aQeHCdkYN7km9+qIVwfZVxa3B8gZ+Lf5KOjGhtXYOLjJubno5zlYuIcXRrgnZzgFlyboeQgX1+i2ldaWR7hYOIgF9peHube4KLgnaBhoJoeYuHa2FxcoN3X3OMgomQp5WGZoyPg253i4RwhY15b2VmY3mDepZbXGlmbnZbe3h3dG1zcoJmXG2Ka2xiWVleWlhscVtfYFpeXWZ0fXt0b3Nja2tqe3xye3h0ZG10Z2x7fnZ6fHt6en9/fm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtoa2pxcm1XW2VubGdzem9oam1gjIyqsaKQo6Ganp6YnpmooqF9gpitjZ+Uh5uikKWVf3uXhHySmIiIhoaKcnyAi3aFi4GElYpxb4BymIaEfpKEg4aKgXqAg4uano+CpqCGeI6XiJWLi52XhIN6rYKRmJmUip6dh4ihq6CioqOLiJKbnKOZlqqhp6agkpuIl458eI6OhKd+f5KRkpOcsaablJ6QjbKTmISljIyVm5+JkJuCiJGJa3yNdndlgoWQinyJnYSHi4+IiICFhJB3fHl1mqGIhoqfi4WUf36MgYB2cHSGhH94iIeLkKaQhIWNiIONkIx8h4qIj4F2a4GDfHmZanJoYHOKcH16d3Zvd3SBXV5vhmhuX15aXF1TaHFVY1tcYWxodXt8cm5wZGtqaX97bXh/cWlvcGxmgHtygoB4f32AhHptg4yGfHp4fH56g3hOZHZrc21wemRrZWJiYFt0ZnBmcnJtVV1sdG1oeXpxZ2lrZY2InbqflqKhmJWZmJSZpKCee3+Zq46ejYWfnIqelnx4lIJ7jpmJhoSEhm14gIBygYd+iJOEbWt+epeGhIOQf4CGhIZ8h4ONmpyShqmeg3KKj4WSkYudkX2Ne6qDjZKXlY+cl4aGm6egopqdhoORmpmZkJqmoKadnZCWgZGKd3yHjoSle3yOkJGGmKmhnZOcj42qjpGAnoyJk5qego6XfoaNgm94hXF0YH6Cj4Z1i5eAg4+ChoR+hYOUbXl1dJKii4yFmoSEjXSAinx8cnJ7iIR7eYyOhJOnj4aEj4GEi4qKd4WHiYt8bmt9gHttaGxtZ155f2h8e3Z0dXV7d1xgcH1udWBjWl1eUWZtU2VaXWFqaXZ6fnBrbGRrameAf2xzgGxsdG94boR5boeAdoKAfYR2coONiH57e3x/e4KKYGl7anVoaYJkamNgaVxkdWhvYnVubFRjcXllcHp6c2VpbW2Lip+3mqGjn5KRlpeLmp+fnnt4naaQm4qGpJSLmJl4eo2Fe4mRg4yCgYJtfH54c4CFfYqQfGtofYGXiIGIjnx+hoSHfI+Aj5qbkYimnH9wi4qLkoegoYqFjHyokYiPkpeTlpN4jKOhoZ6Wmn+AkJqYk4ybo6GkmpeRm36OhXmAg4+HoIB9jIyPfJekoKCSmZCPpo2PgZuRiZKXm36Skn6GjYF1dIJwdmB9f42GcoqVfIiLcox/goWGjmh3cXiMmJKPf5d+iIpzgod8fHB5e4yFenuRjYOWppOLhpF8hoeHhXWCg4iHemVye394enBsamZefXNofHV1c3xygGpeYHR2cHhkY1lfXlJraFRkWV9hZ2p2eIFxZmtjbGhlf4BqbX5obnFrfXeGemuLgXOBgX2BdHaCjYZ+fHt/gX1/j2pyg25zaWGHaGxiX3FWdG9tbmB4aG1XanR2Y3V7e3Jiam55iY2fspKlpZyOkJiPhpygm5x8dqSgjZd/jKKKiJqWeHuGh36DiX6IgoB/cX96dHWChX6JkHhnY32Gl4qCio14fYCMg3mWgJWXlYyWn5p9b4uBkZOGppuHjImEppWFkouWl5OSdpGeoaGYlJd6fo6Yl46Wm52knZmTlJx6kIaDeISXjZ1+gYmNjHOXop6hkpiOj6KMi4OWmIOSlpl+mI18iI2BdnF9bXpkf3yKhXCGk3+QgmyHgoF/iYRldW98h5KXjX2TeIuJfICHfHtxfniKhnmFkYqLmKKVgYSNd4mFg4J2e4GJhnZfeHd9c313ZmxkYX5pandzdHR9cXxiY2FzbnVzbWFaYF5ba2RSYldgYWhrdXiGcGJqY21laHyDbGh0aGxvaH98gnhtkIZxgIODf3N8g4yBf356goN+fJBtdoh0dG1limxqYWN1VoRpcW5geWdsYmp2cGZ5fHpxYHJshoWQnK2XpqiejY2Xh4afk5eYfXeqnIqYeZeci4uYj3l7gIt9fIN7gIKAeHR4enN9gIN/iIuAZF59i5WHf4WHdH19iX99l4SWk5aMo6CXfnKHepORiqePjI6Kk6CRg5GQlJeRi4GPmKCakpCRdH+NkpSJnZ2ep5iXjZWWdI6OimyGmI+ZeoeIkIlvl52ao5OVio2fjIaBkpx/kpKVhpmIfImJgXpxeWt1bHt9i35uhZKClHdvgoN9fop/ZHJqe4CWl4R/jXSQiYN5h351eIB9h4F9g42FjZSkkHiFgnSJh32Ac3WAh4NuYHt1enF8b2FuY2R7Ym5vdnJ3d3N0YXZfb2x1bm9cW19dXmpeT11XY2FobXN6iWtfaWVqY2h3h21mbGhpbGiAfHp3bpCHc4GDhH1zgYaJeoJ9eoGEfXyOcnqKeHhubIdraF9pcWOHaHFvZXdobmxheWhrfXt4cGF3bYuBmZqqoKSonYqKkYaKnoqVl313rpiMln2ek5GWk4h3fXuKfHyAdnd/gHB0c3pvhXyBgIp+fGBcfo+Rhn+DhHN6f4Z6j5GHkZGbkqSblIF9gHuNipKkiY2KjZiajIaRmJOWjomJjJOdk5CMjW6DkI6RiZ6ZoqGXlomWkW+ImoRnhpmOk3qJhZCKcJWalKGSkoiLmYyCf5CefJKPkouZjnuKhId0c3VrcW51e4t0boWQjpJxdIB7gYGIfGRxbHl9mZR9hIh0kIuBdIh5b4B+gYd8hYyJhY2VqI17iH1+i4V3fnBvgIWDY2h4dHVve2JecGBqdF5xanp4eGxycGV4XW1sc21zWFpeX2FqWlBXV2VjZ3Fxf4dmXWloZ2JncY5vZGlnZWpogHp3dG6OhXSBgYJ7dYKIhXeFfHiEhXqAiXd/i3t6cnmDamtfcGh0gGtyb21xZ29sZXxjboB5dnFsd3eKf6KYoqihppuHjIqBkJyGk5x0gaqUko2GoIyWk5B/dHt2hXd4f3Jze4Vrcm95bYp2gICGbnFbWX6RjYh/gIF2dYB/f6CGj4qRnJegk5d3iX6AjIidnoqPhpKYloWJlZmPl4yLjY6NnYqOkINtiIqPkYqclqGbmJWFl4hqhaODZ4adipF+i4OLgXeTmJGekZCIiZWNf36Pl3yRjY+NmpJ8in+CbnZvbG1ucHuFaXODjpeKcHd/dIKJgnhmc292gZmOfImEepSReneIdHCJe4aNe4uGhImPnKOIfIR3gouAeHhuaoCCgV1yc3Fwb3haXnBgcGpeb2l8eXBtbWpsdmBwb2tybVlYYWFhblhRU1pmZ2N1cISCYl1qbWRiZmuSbWBmZl9oaoF1cXJwi4B1f4KAeHWAi4B4hX93h4Z3g4R7hox/e3aKf2pxY3xihnxvcWx0amhvbHZ3X3F/eXt0dXSAgn6klZqtn6eWhYyDf5eUg4+fdYqflJKGipuMlY2LeXJ4dIFwcoRzcXWIbG9sdW2IdoN9f21uVVGBq5SHgniAdnKCeYGggZGBkpKXm5GaeJF6goySpJqTjomVmZKEh5eZjJSMiY+PiJ6FkIp8coqFiY6InJmfm5aUf5R/aYadiGeGoYiShJGDiXGDkZePmo2PjIuPjXd7kpB6jouMkZaMfIh8gGt2am5ra2x6fmF5fo6VgXZ6gHeDjXx4Z3RsdIeVi3+IhnuUkHF6hHB3jHqKjXuJfoOMkZ+dhX18eIKMfXZwaWuBgnlfd29ta3FzVl1vYnFgX2xueXBncGZmc3RocWxhd2VdVmZhYHJTUE5cZmVdeHCIfF5caHJiYmVmkmlfaGRbZ3B+cGtwc4p9dnyFgHR1f4x5e4aBeIiCc4aEfoyMg3t5lXdmcmqDYIh+b29remBqbnR/dF90fXmGeHRzhXx4oI+ZsJylj4KKf4OaiH+Lnn+KmZOOhIiYjo6OhHZ0dnOAcG+Fc3Bxg29raXZtgm59fG10c1JOgt/IktaTfHB0gnWDn4KTd5SQmJqPmHuTcoWQn6GTk5CJkpuUhn6WlYiNjYiRjYicgI6BeHqMfoiMiZybnZuVk3mNdmiJkodsiKOFkoeXg4ZjjJGYjpSJloyNiotxe5SJeo2IipKRiXmFe35se2Vyb2preXlbgHmPjYB6fX5/ho56eWhza3OLj4qChYV9lYxsfn9vgIx/jId9hHqCj5Wamop8d3iDkHlzbWZwf4NsanRvaGlzbVNeb2RwWV9rcXdma2piZnhycHBjX3dgYFZrX112T05LYGZjXXlxiXRcW2V2YGFlZY5jYWZhWGlzc25rcXaMfHR5hoF1dn6Lc3+Gf3uJfnKJh4GQioh8fph2ZXNtfGWIfm5wa4BabG55eXNhdnp7jXZyd4p3eZ+Lm66boJCChXeIlX58iZyHhZ+QjoWMl4STjoeBdHdweXFuhG9tbn5yZGR4cHxten1qaGxjpJrB3K7voXNrdYN1hKKFkW6Vj5Sfk5uBkXCFi6OXiY2VipCdloOAlZCFiY+AkoqKl3+He3V/iXeGhI2bmpiZjo92inZuhomLfYqjhJGJnYWFXouUl4qOiI6LioSJbHyWgX2IhYmQj4Z2hX19a31kd3VqbXhzV4h6kYaFen5/gIWLfnhlc2p/io6Kg4J/jJaFa4J1boiRgpGFf4J6gJGWk5mQdXR4iI11c3FndXmCYnRtb2JodWdSYHFna1VfbnR5YHJjX2h9cHJuW2NyYWJXbllcd01NTGRmYV52c4ptW1xkeF5gZGWFX2NiXlhqcmtua3J2jH1zd4SBeHd7iXGDhH1+iHt0i4iIlYaMfn6Yc2h1cXlti3pudHCBWHF6dnlxZXd5hoxpdoCJcn+ch5innKOShHxwjJR4eYudhIWhjY57lY1/mYeEe3J3cHNqb4FraWx8dF5geHZ7cHV7Z2BlfOvatcnD3IhzbHOAdoqaiI1pl4+OnJSSgYhwhYigjoWKlYqNmJR8jZOIg4mPe5GLhpCCf3Z4g4Nyh4KSm5aUmIaMdod/cIWCiYeZooOUjJ6DiWGDlY+GiYaJjYeAh2l9lH99g4SJjo2CcYZ+f3F3aHVyaXN3a1qMfZKBhXx/g4CEioJ1YXRsiIGPi4J+f5KRfW6CbHmGj4aThH2BfYCSk5CXiW9yeo2GdWxwa3J4gF9zaW5canZgUmRxaGZTX3B2dGBvYF1ognFzaldnaGNpWG1XW3VMSkxlZ19icnOFaFtcZXleXmRne2BkX1xZa25lb2pzd4p+c3KBfnp2eohzhYJ8f4Z2d4qGj5iCjIF7k3ZsdnV5eJN0bnh6fVh5hXGAb2d5d5KCZHaGhXGKloWZoZuiioZzb5KLcneOnH2KmoiJe59/g5l/gXhxc25vZHJ+aGZsd3dbX3l7enFxf2lhZ2F/1baOkKZ4bnF3e3CSkIyHapiNiJuRi4V7aIeLmYaBkpGGh5iNfI2NgYGJjXyQjH6KhXp1e4J7cIaAlZmOkpSBiHWDhnaDgIuTnZ+GlY+ffohhf5OHhIiEiY1/f4NnfZB/fn+Ci4+Qfm2CfIJ0a212dHN2dWtjjYGOf4V+fIR/hId+cF9zcYR8j42CfH+SiXpxg2Z6g4qHjIN8hX6AlI+Rk4RucHqMf3Vtbmpsen1iaGppWGx1WlJpcmliUWJyeGxhZV1aaoNtc2JbZ19lbF9uVFpvTkhPZ2VcZ25xgGxaW2NyX1xja3dkZV1cWmxsY21qc3aHf3Fvf3x8dHiGeIWCfX+HdXmJgZKVfIiGdomBb3d5e4STcG17gXdeg390gW1pe3OUc2dyiH1ykpGDmp+boIaHdnaUfm12k5d9h5CDio2afIuadn12cW9samF0fGdiaXV6Wl93fHptcX5lY2hoV52PXnFylrzDg3VxlIiQfnKWi4ack4yHcmqIj5aAe5SMgYSbjHyKhn18iYx/lIh1iYV2d32BcXWGgZ6UhZSPg4Jyf4h1hHyJmJ2Yh5OOnYCIZn2Tgn+Fg4mJcoF9Z36Le3h+f4eLjnxpgHyDdmVveHhydnNsao2FioGKf3iBgISDf2tecnh6fY2KhXuCj4B+coBpeYOHi4aEeYR8gZiNkIx9bm17iX13dG5oZ3x2Y1xwYldvclNTbnNoYU5mdHhlYF1cWG6Ab3NZZWFeam5gcE9Za1FEU2dhWmtubXxuWltebGJaY292Y2ZcXWBsaWNsanN2goNxbn57f3R1g3uDgnyBhXZ+iYGWkHiDinSBiHJ4eX6NkG9vfIFxaYF5en5tbXx2lWtqd4R0bJSNhZ6YoJmFiG59jHZqeJiOfoGKgpWXinmOlm96c3BsamRgdHtoX2Vxelpgcn15Z3F6YWVlj7Gyd0piWqTZ0JZxe5CKkHd9lIuEmZGLhW5rhZKSenmShoCEmIp8h394eImKhJaAb4yIcXR9eml4hYOlkISTjIN/b36DdoR5hZuYk4uSkJSFh3B7koJ9goOJg26BeGiAhXhyf3+CioZ7ZX1+hHVjcHJ/aHhwb3WYjYWCint2eICEeYFrXHF9coGIhYl9hol6iHKBbnGEh46EhXOEeYGZjY6EeG5vf4R/dnplaGp9cF9Zd1pYcW1OV3JzZ2BLbHZ0YF1bW1l0fXJvV2ddZmpxX25OV2hRP1lnX1twamd5cVpaWWtlWWNweV9oXF5lbWhmbGlxd3+Hb2x/fYB1b4J7f4F+gn92gYWIl4pxgo1xe4Z8eXmDk4x1anp/a29+dH99b3J8e5RvboF/eGaSioKhmZ2RgoZnh4NvZ3qViX5/hYGZioF8jYxpeHJrbGZfYW94bV9ib3hcZGuCemFxdl9lZdTqvooyOj6LjoBxeYWHjo12g5aMfpKNjH9tbIWNjHZ9j3+FgZWJfIN4bnaHhIOXd2+IhWt1e3RleYKDp4uDjouEfW5/dHaDeYackIyQkZKMi4Z+e5KGd3+EjYNsgHJpf354bXx7gYqDd2J5hIFxZHFofm10cXSBmoqAf4V+cnV9gHKBcFttfnR4ioOLe4eAfIh4enFsiIOPhItygXl/l4uLf3Rua3eAgHV1XGlod3BZV3xTWnBlTFpycmVbSnB3blxaWllddH51aFliW2dlbmNpTFdmUT1eZlxddWVfdHBaWVRvZFlkcXlaaF5fZ21namxpcHd9jmxpgoR+eW6AfH2Bf4J6dYKBjJOFcICLbnh+gHp7iJKJf2h7fWp0e3KGe3N3fX+MeXiEfXxrjIyDm52WjIGAbI5+a2h+jox7fn+DlIJ/fYqIa3VxZ2hjW2Jncm5gYWtzYWhwiXlhc3ReY2SboI9uXDVZr7V0aYCIfJKGdoWWhXOOi4l2cGyFg4d1eYl4iXySiHp/c2d2iX5+mG9xhn5odnltZXmIhKSGgIeNiX5ufnZ/gHyMmYeCk5CYiIuEiXyPiHB7fYR7aH5ta4B7eml6doGHgXJgd4F+cWRyZnWCbXR7hZSRgXyBf253eXx0fm1Yb392dIyChneIdoKJenhzbomBj4GFcn59fpOJiXpubmpugoJ1bl1nZnNxUVt7TlxwXE9bcnBkVUtzeGlXWVlaYXGAdGBdXWBnZGhpZk5ZaE1AYWRbYHZhXXVtWFdTdGFaZG9yV2peYWhrZ21saXB3fJJraISJfHxwfn57gYCCeneAf4qLg3F7h29xd4N/e4mNj4Nqfntud3l2ind9eICCh3+Dfn56bYWMiJijjYSDe3WLeWtshIiReH17gZGAgH6Kg3BycGNmXllnX29wYGBncGZqb4p0YXRvW2FkanZ7f76cpqPIuHGFg3OTfHiGk4JzkYyIcnJvg3uDdHWHdIh3k4h5eXFjd4d6gJNpcoR2Znd1Y2p8g4edgX9/jo59cn5zhHmAkZCCeJaNlI+Igoh7iIlreHl+dWd6aGt/eXNpenaAgn1oYHeHfWprdGd7f2l2gYyQlH56fn5we3Z7dH5iVnd9cnOKhIJ8g3GGind4cHCDgo1/fXl+fXaOhoN2aXFpbYiCcnBdaGNzbkpldUxeblVUWXNuYlFPc3hgUlhYXWJwgnNbYV1oZWRjamRRWnBJRGRhW2NwXl13aFVXVXddW2VuaFZrXmFqZ2Vvb2hwdnqSbmmIjHl9cnt+eIGBgXx2fYSIhoNwdoNybneCgn6Ji5N/cIB7d3l6gYx0g3h/gYGChHqAdW9+iYuanoh9hXp3hntndIWMkHp/f3uJhoR2j4Bnb25fZFxYZVltcmBgYHBsa2iJbmBzaVleZG2Ad6naqceGh7JxiXhvjHV7ho6AepOJgHV0dH53gHBxf22EdJSGeHRrYHqCeYiPZnGDb2d2bVttfYCQk3+AeZKSfXh7bYd1gJCLhHSWipGOh4WFe3+FbHR2f21nd2Vte3VtanZ3f398YGJ4hnpodHVifXpndIWOjJV7dH91cYB6fG1/WVZ0fm91hId/gHlsiIZ0eGt1f4OEfXt9eHtzi4F9c2d0ZW6LhG1zW2pfdWRIbm5MW2JXVlV4bWJQUnR2V1BVWF5hcYRvXGBjbWRjXm5iVFxyR0JmX11maF5be2JRVVx1W1tna2FWal9gbmZma3FocHV4jnRrjox1fnZ4fneBg4F7c36EiIeDb3F/dHF1foWCiY2Ke3d/eIN8fIWHeId8fYF+hIB7fnN2eYuOn42Jeol2dIN5Xn2FmYx5hoN0hYaFd4l7Ym5sW2JbW2FWanNjYFtnbm9mh3FhcWZXXWNrf3zKzoi5omptbYpscYRxfISJfnuRhXp5c3l1dXtqbHVjhHWRgndvZl59gnqLiWVygmtqcWNYbHuFm4iCgXOXlHd+e26IcYGKi4dxl46QiIWLg3t5fnFxb31maHFibXhxamtxd3x8eVxleYB3aXV4ZoF2Z3SHi42UfHGGaW9+gHlufF1Ycn9tdICLfIJvb4l/cXZod3+Bf4F3fXF6dId8enJmc2FujIJsclhrX3dbSW5rTVZVXlRVe2thT1R1clBRVFZeYnSFaFxgbGpmY1luYVhicEdBaF1gZl9dVnteT1ZkcFlbamhdV2hgX3Jma2hyZ3Byd4Z4bpWKdH96eH55goiAdXJ/h4WNgnBwe3h3dXmGhoaLhnp8f3WLfn2FhISHf35+fYd/fHh2eXeRk59/jHyLbXaAeWODh5eGc5KLb4WFgXmCdGNuallfW11dVGdzZWBZZHFxZoFzYmtlV1tgaX93vq57oLdtYnOGaHN7cXmChXt9jH93eHJ2b3t2ZWpuYId1joFzamJefnh5i4RmcX5oamtaVm94iaOBhH9xmZNxgHh1gm2AgpGHc5WIjIiEiIR9eHRybmh5YGptYG12amdqa3l3endbZ318eGVyfW2EdGV1hYyGlX9vi2ZreoN1bXRiXG98a3V8i3yBZnWHfW1xZ3V+eH5/cn1renqBe3hwZmxibol+bW1Wa2B3VUpqa09STmhOWXxoYk5VdWpMUFRVX2d2g2ZdYHFoZ2FXaV1ba2hKRWtaYmRXWVV5Wk5WbWpZXWxlXFplY150Zm1kcWdyb3WBd3CZhXZ/fnd/fIWHfXVzgol/lYJuc3h6enNzhYeIiIR5gX12j398hImOhIKEe36Lg3t3fHd3mp2XeoqDhml3fXxsg4STgHKPgnGFgn6Bf29mbGZXXVtcW1RkcGRfV2NydWl1cGVlY1dcXGh/cG9ygHSJZGR4fml0dXNzgoR4gIR5dnN1bmt6cGFna2eGdI2DbmZdX31we4l+aW13ZmlkVVZyb42mfIR7dpaQc3tzfHpue3uQhXaYfIeGg4aDfHRwcmxndVxtaF9sdGRnZml6b3tyWWeBd3VncIB3gXVid4SKfJSAbotpbXqBcWZzZWBtemdzd4p8fmJ1g3Zpa3F0enF5eXN9Zn5/f3h3bmNmYm6GfG1rVmpicFNLaWtPTE5wR157ZmFNVXRjSk5TV2Fqdn5lXGdzaWZgVmNXYnBdTEtrWGNhVVRVc1ZMWHVkWl9rYVxbY2Vfd2ZtYnBpc25yf3R0moF3f4B3f36GhHp9dYKEfpeFbnJ0e3p1cYSFj4GAeot1dJB/fIGUjoCFhH1+jIZ7foB2e6OlinmIhYRsdXx7dYOCjHpuhXN5hH2Bg3VuamhlVl1bWlpTYm5kW1hic3tpaG1pYGJXX1ppgGprb4Bna2FoeXhqc3R0bYSBe399dnVte2hqeWpfZW5ogXaPhGdlWGJ3aX6He29pb2dmXVVYb2iPqHeBenyQjnl1b35vc3V5j4B3lXSFgn+Fh3VqcnZnaG5bbGRdbHJfZ2FpeGh7bVptgnJzaW+Afnl3YHeEhHiPhHKHcW95f3JjcWhcb3dkcXOIfHhic4BwZ2p4c3JseHd1d2SDe393dm9kZGNufH1rbFVpYmZTS21oT0dSa0VheGdhTVNxXElNVFlla3d7ZV5tcWlkXVZfVW5uV0tUaFdmXlhOVWxUSlx5X1tfa11dWmJlYHpobGFvb3VucHd1eph9d4CBeoB/h4Z6eHqDfoGThHF0dH56dnSFiJB9gH2Qa3OVgHuCn4V/h32AfoaCgIp7doSsn396iIeEbHKCenaAgIF1bodvfH9ziYBqb21kZFhfWllaVWJqZ1xaXnWBaV5ubFxhVlxca4FmcXR9aWlda3Z1Z3R3cWyFe319eXZybHpoaXhmXWRzaHp3koFjY1RlcGeChXd3ZmhqYFdWWWdjj6dufneAi456cHB8Znlveox7do5xhH1+f4ZuZHVzZGhoXGtiXW9vW2dfbHVkemhddIBvcmtxe311dWF0hYp6h4Z/f3dydX91YXBsWXF0YnFyhXx1ZHJ/bGFsem9qaXp4dXJmhXV6enVwZGFkbnN+aWxUaV5dVEtzY1FHVmFHYnZmYUtUb1dKTFdYZ2t2emRlbnFmY1pXXVh2ZVRKXGNXaFhZSVdlUUhieFpdX2xbXlxhZF5/aWpgb3R4bXBudoOYeXKBgHx/iIuGfnV1hnmHi310dXWCeHp6goyOfX6EiGpzl4F6ip19foV6gXp+fIaIc3GProx7e4aPfmZyiHp0fHx2cm+GbHt9bI96YnBvYmVdZVZZWVZjZmtgXVxzhWhYcW5aXldaXGx7Y3B3dmxiW2xyc2d0dXBshHl+gHl3bm50ZWl0ZVtndWZ2dpF6X11SZWZqgoJ0fWJjaVxUWF1iY5ClaHh0goWQeG1ueWd4bXyFe3WIcoB4fHh/aGV2bGBmYF5qX11za1llXW9vYnplW3d7a25ucHd4c3RkcoOSfoeCiHp1b3J9cmJ4ZFtvcGFxcYJ8c2ZxgGRebnZpZGd5enRub4F1dH1zcWJfZm5vfWRqU2hYWVRNd19RSllZSGJ0ZGFJVG1TSUxaV2lscXtibGxzY2FaWlthdltTS2ReWGlTV0dZYE5HaXVYXmFtW1tfYmJdhWhoYW54eWxva3aBkHltg36AgZKIhIB2dIl0jIZ0cnd2gXd8fX6Mj4B+k35weJaDfJmSeYCAeHl9f3SIg3NwmaJ7e3+IlXhkdYh5c3h1bHRvfmx5fHCRcl5wb2BnYmxUW1pXaGNtZlxccYhlUnJuW1pYWGBsd2NpdWpqXlptc3Fsc3NzaoV8fn98d25ubGRpcWNbanJkdHaOc1tXU2RhcoB/coJdYmNdU1pgW2OSn2VycYWEkXRsanlsb3B6fHtxgHZ/cnp5eWRldWhdYlphZ1ted2hXYl1vaGF3YFt7dmppcm53c3N0aHCBlIKGfoN1cmpwfG1md1dca21icXOBenNmb35bYG9xYl9qcX1sbHR+c3F4a3BhXGVsbHphZ1NnVVdSUHZbUlBZUkljc2JgR1VqUEhQWlVra2t8ZW1vcWFcWlhZbHBXUlBmVldpU1RGWlxPSHJ0WF9jbWNYYWBhXYtqY2RteXhrb2l1eYZ7a4N9gISZfIKEeX2Ibo+GcW93enx0goJ8i4+Dgpd0d4KUhYGfiXWAgIFzf4Fwh4J1b6KXdHuGi4Z7ZXiLbm57b2Z4cHpsc3ZyjGtedG5hZ2VrUl1bVmdibGxaXHGMZE9vbl1WWFVnanRnYnRlZV1ZbXRtcHV1eWqHfH98iHeQc2Rka25hXG5tY3N4h2taVFZiY3h9fXGFXWNfY1RaYFljlpVjbnCDhYpzamh6bmVzdnN8bHp0dW95fnVeZnJjW15WYmRYYXVlVV9gbWRhcV1dfnBoaXNxc3B1dWpthJOBiHuEcXJmbn1wcm9TW2ZqZnF0gXdzYmx2VWJxaltfbmV8ZW12fHNyc2ptYFpkamp3XmZUZFVWUFRtV1FXU1BIZXJfYUZYaU5IV1RWbWhkfGlreGtiV1xVW3RkU1JXaFFZZlRTSFpaUE14d1tfZWxpWmJgXl6PbmJma3l1bm9odnZ/f2yDgH2Gl3t/iIGJfmuTiHJndIB7dYCDfYiOf4yTc3yKkYWHn4Z7f4aMc4CGc32Ddm6ljHOBjYt2d216jGBkfHBmenN5bG1xdoJnZHtsY2ZnaFNeXlRnYGxvW15ujWhOam1gVFZTb2dza2V3ZGVdWG90bHJ6d3JsiHuAdpx7emthZWxtXmBvamVweH5nWlZYYGt4fHtwhF9iXmdWWF9XZJyIYmtxgYd9d2treGxbdnFseml1c25ve4ByWGpuX1ldVWFjV2RxY1NeYWlhYmxaYH5sZmtzdW5td3ZraIWMf4h6h21wZnB8bXJtY1lhaGlvdIF0cl5pbFJlcWRUYm5iemNxdnt1a3Bta19YYWdodFxlVmFWU05YZVJPXE9PSGVwXWNGWWlNSV9LWG1kX3hobn5kYFVeVF10W1RSYGZOXWFUU0pcWVBZdXZdX2ZtaFhjYVtejnBjZ2p3cXNuZ3Z0eoNygYN6iI1+fIqHjnlukIp0bHOCdH9/iIWGkYSVj3l+jI+IkZuEgHyMhHN/gXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2NjY2NjY6Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpKTk5OSk5OSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjI2MjI2MjY2NjY2Njo6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyRbWZnZ2dnZ32FhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCTqWvra2trrB/a25ubm5vamZnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJFnX2BgYF9eeYOCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTNBqba0tLS0t3xlaGdnZ2hjX19fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkY6NjY2NjY2PkJCQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaPkJCQkJCRi4qKioqJiomIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkpKSkpKNkJKRiYeOipCSk5CKkY6NkYiPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyLi4yMjIyNjY2NjY2NjY2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoeJh4aJhYiQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCPhoiGhYWFh4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkI+JhoWHhIaIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4aIhoaIg4qPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiY6Mi46Jjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7e3x9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpKSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4en16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHV2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lmZmdnZ2hoZ21namdoZWhnY2JiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2FjX1xfXWBdXlpeXVlZXmJhXl5aWV9bWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTVFBNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHRzdXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PUFBRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpISEpJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUVAPjo7Pj48RUQ9P0VBP0BBQERFR0dHR0JERERGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs8PDxITD09QUE/QkM9QURERkNGRkRGSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dXNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OTg6PDw+PTs7Ojg6QEBBQj9BQENGRENDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1cnF0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzk6Ojc4Ojk6Ozs4Nzg5Ozo4PDw9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09P0A9PTtLZUA9PT49PDw8Ozs6Ozw+PT4/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/PT5APz0/PWt4VD1DRT8+QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0ZEPzw8PUBNTEZId3VZNzw6PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+fn5+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQEluUDs9ZIGCfnV6dlM3ODg6PD4/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkM/V3t5UmWEg4ODhHx4Ujw9Pz1CRkFEPzs8PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUBZdHd7goGBg3yAg3tMP0BDP0pSPU1HPDw9QUVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8e31/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBP1J1c36Ae4CEe36GYkBDQ0U+T1tMbWhJQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTElHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRmt1fn95goSFhYZ9SkRGREJjfoWIiX5YR0hKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHXXh/goOEhIaGh41qQUJWdIWHh4eHh4JXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExMWH+EhYWAg4aHiX1TbYSHhoaGh4eHh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUpJSUhISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpehISFhH+Bg4aGhIKGhYSEhoaGh4eGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJAQUNDQkBBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSWqGhYWCgIOBgoKDhISFhYaHiIiIiYmMjmZEQz04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc1ODg7Ozs9QDs5OTk9PD47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJZ4aFgn+Ag4SDgoKDhIaJiouMi4qJiouMiV4/NzY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzU3ODk3OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JqhIGAgYKDg4ODg4WJioqJiYqKioqLiYmKgkg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6OTo6Ojs4OTg5Nzc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2txcnR0dXd5e3t7fH1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I5QXuEgIKDhISEhISGiYqKiIeIiIiKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8PDk5PDg6Ojs6OTk5PD88PUFCRElKTUtJS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7Pz1Qg4KBgoSFhIWGiImIh4aGhoiJiImLjIuJioqMbDw7PkFDRUVBQUFCPkBCQEA+PT4+QD8/P0A/QD09P0I/QUE/QT89QEBAPj9BPT48Ozo7OTk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQlmFgoKEhYSFhIaJiYiIhoaGh4iJiouLioqKi4mLXj5ER0lLSklGR0dERkhHRUJAQENFQ0NBQkNCP0BESEVDRURFRUFGRUZERUZEQEI/PEA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFARERFXoaCg4SFhoaGiImJiIeGhoaHiYqKi4yNjIyLioqIV0hMTU1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E/QkNISEpdhoKDhYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlJSEpGREdISElFRUhGRkVMTE1JSkdHSElKT01OTExNS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw7PD06P0A+QEBDRkpKUWOCg4WEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSEhFSklESkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVbnB1d3d5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6PDg9Pjs9QT4/QEVJS01WcoOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIuLi4tfUVFQTU5NS0pHRkJHSkdMSkZLT0xLSkpNTUxPUE5ISUtMT1FRUVFPT0pJSkpMSkxGR0hHRUdJRkVFQkBCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBSExNUVd5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVVFSVFJPTEtKREVGS09OT1dWUVBPUVNSTVNUT01TTFBTVVdSU1FQTEpNTU1LTkdHSkZGSEpEREVFQkRDY3B1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQ0dWTkZPUVFVWXyGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVWthRVJRUVBKOztRU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FQTVJQUFBRS0tLSEhKSEVGSUhJSElpcnZ5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flNISklJR0dGRT8/QUFFQkNHRURFTFhSTVRWVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLhmxbZFU6WFhYU1A+QFZVWVtjYFZZYnJeXVZdWlZFUVlaW1lfVFlnUlVWWFRUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6enp7enp8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JWVlRaWnSDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVtdWFhZV1JRTlBRTU1PU1FRVVJhc3N2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUlGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWFNWVFdSUVdVYpaAUWVyWFpXX2hQYGZbW1hcZ2FHT1poZ1xbXF1dV1JPU1BQUVZWVlZZWm5ydHd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVVhUUlRSUVFMT0xLZnlaXVRZVVZdWkxUWlRTVF5aWFdXV3prWFpbXF5UUVFQSU5PV1ZYWlpkcXN2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVRST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTU5LTUtISkRGSEVDPlNjVX9SUVFOS1JUUU1PWVFNTlFTVVVNUVNSUE9NTEhDSUhSVFVaXG1ydXZ1c3N3e3p7e3t9e319fX59fX1+fX5/f3+Af39/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUExJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz9DQ0NDQj9EUEJDQEM+QkhHVkBITk1HXWlRSEZPRkRFRkhHSEJDSEdIS0dDQkFEQE9QTVNkc3R1dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiW1hTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz8/Ozs+QD8/Pz5rUUphRUZISUVCP0dMTUdNUVVJQkU/Pjw9PD09Pz0/QUNDPz48PUI+Sk1GVW51dXVzdHZ4e3x6fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FSWlxZXklKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXt4enx8eHd4ZEJAQEI9OkJDQUFEQlxdT3tOT09OS0xNT09RTEtMV01IR0BCPDk3NzU5OT07Ozs4OTg5PztCSD9cdHR1dnV2d3l8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV2ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eYGVgXV5xdmteYGdrd29vbGpvbm5sZmJYR0ZGSEJBRklFRUZETVJQYVdSWFFQU1NSVVtPT1FXUE1KQ0Y+Ojo2NDg2OTc5OjM2Njc5NTxCPWV0dHZ3d3l5e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01MVFRTUVFVT0xSU1RXWFRUWFFMWFlaVlhYVlhZXVdXWGhza11WYXNrYWFfXWRgX15ZVVBNT05MSEhKS0lIRkNRUFNaV1RUTVFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1OTlHbnJ1eHh6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVVdUW2ZKTFBSUk9NTU5OTkxKRlBQVVlTVE5KT09UU1RcVlJVU1JPTUtJSEhGPz89Ojc4NzY1OTk2NzY2NVdwcHN4eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydnVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9KSE9QT09NUkpPUFBQTk5PVExNSVBPU1RVMjxYTUlBUT1jYVFTUVBOUFFQTk5NUE5UUlBSTUlMS09RUFFSU1RRUk9MTUtMTEhDQkE9Ojo4NzY7QjQ1NjY7ZXBxdXh4e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVCRkdHSEZKREhKSEdFSExIS0hGTE1QTUcvRV9SPjNAPmpvYVJSUUBGVVFQUVBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PTw8OT1HNjY3NkRucXR2ent7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRUZISk5LRUdDT1JDOEVOU11mU1FTQUdVUE9RUVBNTU5MSkxLTE5PT1FNT09NSExMSUtLTEtHRkZFRDxBQT47QEU7PDg5VHFzdXl7e3t9fHx7eX17en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT09NUVNMVFVUV1dVTExLSD05ODc7P0A+PD1BQEI9PkVIR0RGRklHSkpARkFBQEZIRUpPSFBSYVxRUFJOU09PT0xMT01LTUxNT05bV0tNUU9HSUhDSUpMTEpGRkZEP0JDPjxCRj9CP0FkcXV4e3p7e3x7enp3fHh5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj47P0JAQD5BRElFQ0hHSUdJRUJCPz49Q0JBR0lETU9hZVFNT05XS0xNS0xNTUxMS05OU2RNSkxSSUlJRUFISkxNTkpHSUZCQUJAP0VGRUhES29wd3p5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEtFP0I9OTk5Oj9CPzxAQkJBREVHS0ZESUlHR0hDQz9CPz9AQT5DRUNLTVFUTEpJTVRGSUlKTEpLS0lJTE1PUFJQS0dDS0dDQkpKTE1PTUlKSUdDQ0NESUpNTElac214eXh6e3t5fHZycHVydHl5dnhqcW5qbGxudHRtdHV7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxanFoZXFIS0RHSEhHSktJSktER0I9Pj06Ojo7QEI/PUJCQ0NHRkpMSkVJSUZHR0NDO0FAQj5AQENFQ0lNT0dIS0ZIS0RISUtNSEpMSEhKTEpNXVJJSERNRkFES0pOTVBOS01KS0ZHR0pNTlFOTGNuaXZ2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkb0ZLREZFR0RFRUZFR0JDQD48PTo7OjpAREA+QkNERUlGSkpMRklJR0ZGREI7QkNDPj9DQ0NFR0xOR0tOSERIRElMTk1ISUxHRUZJSUxOS0pIRU5IQ0dNTE9NT01OTk1MSUhKT1JRUk5SZmdmcm9zeHV7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0pERkZFQkJCRUBEQj4/Pjo7Oz06PT5DQT9BQ0VHSkdJSUxIR0dHRkVDQD1FRUI+QUNDQ0VHSElHTVBJRkZGS05PS0ZISkZFRERJSUhLSUZIUEtESU1MUE1PTk9PTkpKSU1SVVRST1dkYGFtZ3Byb3J5emdlaGhjaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NCQUJEPUJBPkE9Ojo9Pzs+PkBCP0BCREdKRkpHSUhGRkdFQ0JBQUZGQ0JDQkRFREdHSEZMUUtJT0pKTEtJR0hFRkVEQ0lISEtKR0tSTUNOT01RT09PTk9PS0tLUFVXVlVUWGBeXGlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNxcmprc01HR0ZIQkJBREQ8QUFAQzw4OT0+OT88P0I/QEBERkhFSEZGR0ZFRURDRUNESUZDRkVCRUdFRUZHRUpNS0hRTUpLSEhJRUZISEVDSUlKS01LT1NORFFSUFFRTk9NTlBNTE5TV1ZXWFZYXVpdZGBoYmppZ2tfZWVnY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaW96TUhHSEhCQkJGRTxAQkJEPDc6PT46PjpAQj4/P0NFRkRGRERHRUNFQ0RFRkdKRUVJR0NHSEZIRkVDRkpKR01KTEtJSkxGSUlLSEVLS0xNTk9SVE9JU1VUUVNQUU1OUU5NUVdaVlpZVlpdWlhhYGBgXmhlY2BkZWhnamloamZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN0bnByc3lOSEhHSURBQ0hFPEBFQkU9ODo+Pj08PEFCPD8+QUJGQ0VCQkdEQ0VFRkdHR0lGR0tIQ0hIR0lHRkRIS0lHS0hNS0pLTEhMS01LSU5MT05PUlVWT0tVVlRRVFFSTE9RUE9UWVpZXFpZW15fXmBiXVxhY2tiYGRnaHKFaGdpZmptbnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXZxdU1JS0hKRUJFR0U8QEdDREA5PD5APz4/Q0I8QD5BQUZDRURDSERGREdFSEhGSEdJS0pGSkhIS0hGRkxISEhKR0xMTExMSU1LTk1NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW1xeX19hYGFkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtydm92SktMSUxHQkVERTxARkREQjs/P0FAQEBEQT9CP0FDSEJFREZHRUlFRkRJSEZJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOTk5QS09QUlVYVk1OVFZVU1JRUExOVFNSV1teXl9dXWBfYWFhYGJjZWFjaGJkaWpndotsa2lnbW9zcXBxcHByeXZydXV0c21tc3NtcXJvdHV0cnBzd3R1dXd2dXV0ZXFza3BxanJ2b3dKTUxMTEdEQ0FEPD9FRUVDPUFBQ0JCQ0VCQkRBQUVHQ0hHSEdFSkZDR0lHR0pGSUxISkpNS01MR0tJSExLTlFLUlFMU01LTk5PUFBPVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5gYl5gZWFhYmduaGJpaGhteHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJxcXV2dXN3eXd1dHVjbXRrb3BqcXRvd0xNTEtMR0VBQEQ+PkRFRkNAQ0FFRERGQ0NFR0NCSUZDSEpKSElLRkRLSkdISklJS0dKSk5LTkxJTEhKTUtaZkpkXEtsU0hPTl9uVWtzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmW2x0YGxqVGB3dWlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxcnF5S05KS0pGQz9AQj89REVGRENEQkVFRUZCRkZIQ0RKRUVKTExKTE1HR01JSElLSEtKSUtKTkxNTUxMSUxNTFtzYmRwXmxtVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9cb3VncE1Kcnl2a2Jga2VlbXlta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0JCPz1DRkdCRkNFREVFRENISEdERUtHR0xNTUtNTUdKTkhKS0pJTEpKSktMTU5OTU1KTU1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW92XFlsUVxtbVpxbWtvbXh4dHNpcFxfcmtxalV1eXhwY15rZmJncXBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW5ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0dFRUVCQkI9P0BGR0JHRElFRURCRklISEVHS0pHTU1OTE1OSExNSUxLSEpNSUtKSkpPUE9OTUtOTUxcaGR1XWxxV2xOUFFtVVprXmtsdmFsZHRUZWNObVlsXHRwa2lseGp3dWhwXV5ya2hXYmN3fG9jYGdoYWRqdXlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR3SU1HSURFRUNBQjxCQUJGREdGTEhFQ0NIS0hIRkpMTEZNS0xTUkxHTUxITkpJSE5ISkpJSE5PTU5MSk1NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF5uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2diYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRIS0hJQkVFRUFAPkNDQkdDSElNSUZDRkpMSUdGSk1MRk9KS1dSS0dLSkpOSUhKTElLSklISkxNTU1JS0pLU2tiWmleX2pjcnJaX1lqb19lZVVrX2NbYWJRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRklERURGQUBBRURER0JISkxIRkRHS0xJRUZKT0xJT0lMW1FKRkhIS01JSEpKS0tJSElHS0tLS0ZISkpMTExLSUtMTlRbXFRQVExQT05PT1ZRT09RT09RSklOUFFkcWlUWVdbW1xVWVtdWF1cXGNmYWFmYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzSENFR0ZGQUVDP0NHQ0VHQ0lLTEhGREdLTEhER0hQS0xPS0xXTElFRUhJSkhJS0lMSkhGSEdKR0dJRUZMSElLTkxJT1xXXk9cW2BeT1hZU1xcYl5NWVpNWGFSSllhWlNgZFxhWFtkZFZWWFxZWlhcVllcXWJfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRElER0dGS0pLSEVFSkpKR0VISFBKTE1KTVNJSEVBSEZKSUtLSUxKSUZFSkdERkdFRUpHQ0pNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOXlxeU1teY15aXWBjYFlfYltgXltUWFhZXl1jY2JhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklJREZLS0tGRUhJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRENDRUFGSkRASktJT1tjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtQWl9hYV1eY2FgYmJiY2NlWlFZVlVcWV5kYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkRHRUJFR0hGR0hJRkdKR0hGSEtJTERES0pOTUxMSEpKSEpHP0dGTkpLS01LS0tJR0dDREBEQUhJQT9JSkdPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUE9cX2FjY2NjYlxkY2JkY2ZYUVVUU1tYWmFeXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0VLSUZGR0hHR0lGRkZJTEpORURLSkxOSkxJS0pISUdCSEhRTUtLT0xLS0lIR0VEP0VCSEhBQUdGRFRdWV5YX1lfW11VWFhQXV1RS0pXXlheW11WWmBSUV9fYmJgYGJiYGNiYmRkYlhPUVFSW1NbXl1dXV5fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSENSS0ZISEhFRktKTVBFR0lKS05MTElMS0lJR0RIS1FPTUxQTE1LS0hJQ0RBRUNIR0JBRkVCVlVFXFRdU1ZfWE5UVU5aW01KS1VgYVtfWF9eYV1PWWJdYGBfYmNiXWJiV19fVFBOUFFYUl1cW1xcXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREVGR0RJUmJQRFdfSUdHSERGTUpQUEVKSUpLTkxLS0xLSkpHRUpNUVFOT1BNTkxOSEtBREFDREZEQ0FERkFMSENMTFBPT0xGTUZHSUpIR0xMTU9QSUxPUFBTUExQVFNVWllXWVhYZFZPU1RQUE9OUFVUXFlZWl1cYGFkZWNoY2tscHNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXUxHSFlNR0hKSEdOTFFRSUtKS0tOTlVOT0tLTEdHS1BTU05QT05OTk9IS0VgRURfTERmY0RNW0heXHNtT01WbVlMQ1BgVWxXZ0pdV1VeRExRVUxNVFZRU1RYV1RYVVRcVFBmWmhoZFhTa1RXVlVbXFtgYGFiYmJgZmhmbmxocnp8fX6BhISEhIODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09TSUtHYFRISk9KSU9NUlFLTEtMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUH9RSXxZWXJzV1BtSHFucGFWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlbYFZVV39qdHV1X2B3YFhhXFxmW19hYWFhXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEZKTEZSVkxLT0lLUlhXUU5OTkxRVE5PUVBLTE9HTVBTW1pUUVJPUFBQSkhaeF1UeGVoWVJUUXZndGxwYm5malFyT013bWpycHNycXJwb3CBXWV6dXhxcXpxfnN9a3V9YlJnfGVzc29zc3x9b315b39yX2BgYmJaYGBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gHV8f3x8c3NOS0ZgXUdBRU1NSEtKSEpQTk1NSk5WXllVTFFTTllZTFNTUk5MUElRUlRZV1dRVFBQUFFLR2Z4bGN4cm1aSkxVeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3NRaHptaWp6en1seHp/b2dvWHZ2anV1cIBgc2h8aWx4fG9eX19jYltdYmRnaWpkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3V6bnx9eXhybk1KU3ROQ0JFUFBISktKTFBPT1BNUFpgWlhLVFdQYV5SVlFZU01QSVNUVlhXV1BVUE9OUkpLcm91dXF1cWRoYFZuTHFwXkZoeVd2VEtoeH14YHl7c25hXm1vZFJncnVubXlwd2x2dHRxbG1cdH56a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGVlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0cm9tS0tbVkhHRUdSUEpMTUtMUVFRUVBRV1xZVU5WWVVmWFJSWV5UTU5JVFRXV1lXT1NOTk5RSFJtSGl3S2BkdnZVV2xPbmx7c2FqZ392VUtXa2h9bG1seGBbcHp7XmB6c2Nyb3hxaGV8aXJ7XVRLbGB2dWtpdXt7bX54a3xwXV5eYlteYmRkZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtobG1yfGttaGt7dG1ta21PSEpLSElJSFJQTE5PTUxUU1NPVFJXUlZUUFdaVlZUVFRhYFFPTktUVFNRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFhRTlBVVFhYWFtbVVJTV1tXWFdaT1NVV1dYUl1ZV11WVE9ZUldXV1hZX1tncl5bW1lcXV9jWl9jY2RmZGNjYlpjY2ZmZm1ubXVmZmdjYGZfXWdgZGxoZmdraG96aGdna3VqaGdpbFFJS0xMTUtKU1FNUVBPTFZWVFBUVVhVWVVSWl1WVVRXVVlYUE9MTVZUUU5VU05PTUxRUEtKUVJLUU1LS09SVFJRUVNTSUhMTk9RUlFRUVRWUlhXXFdTU1FRVVVWU1pRT1NSV1VUWVZUWVVTUlVTVFRXWFddWl5hXVxaWlxcYGNcXWJjZGdlZGRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkY2ZoUEpLTE9PTE1UUE5TUVFNWFdVVFVXV1daVlRcYFZXVllVWFRRUEtPV1NQTlVQTlFOS1NQTU9VVE5RTk1OUVNQVFFTVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXV1dZW1RPVFVYVVRZVVdZVFJSV1VVV1tZWl9dVVhfXV5dXF1hYV5bYmJjaGZlZGJYX2BiXWBoZWZkYV5fXV1eWlpfWl9nYF5dXWNoa2FnZmhmZGBiY2FQS01MUFFMT1RPT1NRT1FaWVhXWFpaWFlWXWpkVlhZWldWVFRPS09WVFBPVFBQUE5NUVFQUlhUUVFPTU9TVU9XUlRVVU9OTVFTVVVUVFJUWFZaXVxaVlZRUldYVltbV1FUVlZVVlhUV1dUUlJYVlVaXVldX15WXl1eYFxcYGBfX1piYmRoaGVkYVliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZGJkX19gXFBNTk5SUU1SUk9TVFFQVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST0xQU1JVWlVUUFBMUFdWUldTU1NYTU9QUlRYVVVVU1VZWFteXVxbVlJPVVZWW1xXUVRXVVdYVVNYWlRTUVpXVlxeWl9fYFVhXGBhXWBiX1xgXWNhY2doZGZgWWNgYV9fZWVfYGNbWlxbXFpaWVlXXFlcW2BeYFteXmFgX2JcWWBaUU5PTlZRUFRST1VUU1BXXFxcWF5cX1dcXmpxd3mAY1xbVlZYUk5PV1NOUVFQUlRSS1FUU1haV1VPUk5TWFZUU1RSUlpPUVNTVltWVldUVlpYXV5cXF5WU05UVVZcXFZSVFZWWFlSU1lcVFJSXFdaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZmlkZl5bZGBhYGFjZV9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFtdXl1bYFxgVVxdaWpyfXNsZ1xVWVdRT1JbU1JRVFJUVVRLUlZVW1laU09TUlZWVVNPVlJTWlJUVVRYXFdYWFNYXFheXVlaXVRVTlZXV15bWFFUVVhYWFRWWFtUU1ZdWV1dYF1iY15ZYFtlYl9kZF5eY2NhXWVmaWRmXV5kYWBhYWNkX2JeWFpfW1xbWFhYWFdbWlxgXVtbXFtYWlteVl5ZXVBPT1JaUFpVVVZWVFRUXl5gXl5iXGBVXV5ia3l0bH1sWlVaVVFRU1xUVFRVVFZZV0xSWlZdW1xST1VTWFdWU1BYUlNXU1ZWVVtdWFtZVVpeWF9eWVxZUldSWVhZX1paU1RWWllaVldZXFZVWl1cXmFhX2RkXV5dXWVhYmZkXl5kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVpXVl1aXV5aWVtcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXWBemhYWVpUVlNWXFhXV1ZWV11YUFVcWV5dXVRSWFJXVlRSVFhSU1ZUWVhZXV5YXVtVXl9YX19YXVZRWVRZWlphWVxVVlhbWlpYWVlaWFZdXl9eY2JhZWVdYlxgZmJkZmRfX2RiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlNaVlNcVFZXWVdWXGBhYmNhZF9fVltgZGFfenVvaFlcWlZYVVdbWllbWVhZYFdQVV5bYGFcVFVYUFVWVVNWVlJTVVdbWlxfXlpfXFZfX1pdXlleVlNZV1laXWJaXlZXW1xbXFtbWVtZWV5fYGBkYmNlZWJkWmJmY2dmZV5hYmBjXmNjaWRkZ19nXmJiY2FhYF5fWFRaWlpbW1hbWFhcW1pbV1dZWFdcW1xgXVZdXVNQVlpWVlpVWFZYV1hdX2JhZGFkYV5ZWWFkYmBsZmheXF1bV1hYWVxcXF9bWVtiVlRXXl1hY1xSVlhRV1ZWVlZWVFZUWFxcX2BgXWBdV2FeW15cW15YVlhYW1pfYFxfWFldXF1dXlxaXFhbX2FeYGRjZGZmZmJZY2VlaGdkXmNgX2VjXWZpZGVpX2deY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTVJXWVZXWlhbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9cXF1YV1tbXV1fX1xaXWNYWlhdYGNkX1JYWVBYV1hYWFdWWFZdXV5gYWFfYl5ZYV1dXlldXllYVldbW2BfXV9ZWV5dXl5hXFtaWVxfYl9iZGNlZmVmYlpkZmdpZ2NfY15hZmRaaWliZmljZV5iYmNhYGBfXV1aV1tZWVhYWlhXWltaWVdYVlVbXV1dYGBiYnhLV1dcWVdcXFxdWldcXV9gYmRiYmFdYFhiY2JgY2FiXlxcXFhXW11fXWBfXVtgZFxcWFpjZWNgUlxZT1hXWVtaWVhaWWBdYGJiYGFjX1xiXV9dW15eWllVWF1dX2BfX1taXl5gYmNcXFdbXWBiYWNlZGdlZWZkXGVmaGlmY2FiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWFdcW1pXV1hPWFpdYWNmZnJrf0pZV11aWl9cXF5bWF1bXl9hY2JhYV1iW2JkYV9jY2JdXFtaV1hpcWBcYF9dXGFjX15ZWWNlZGFTX1pRWVdcXVxbWltbY2BjYmNgYmRhYGNeYFxdXl9aWFZbX11cYWFfXVtgYWJlYl9dU1xfYGNkZGZkZ2ZlZmVeZWZoaGdkZGBbZmdeYWhoY2hoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ1dXV1dXV1dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3p6ent7e3t7e3t6enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnV0dXV1dXR1dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3p6ent6enp6enp6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoGCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx4xdTS0tLS1JN7fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmIjbG1tLS0s7O7vr6+vr69ytPS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXjV5+Tk5OTnmXt/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIuRu8C/wMC/v8nMzMzMzMvb5uXl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dn5/f39/f395d3d3d3d3eHl5eXp6enhvb3BwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2AgYGBgYCAgYKCgoKCgoSEhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dHR0dHR3dHZ3ent4e3h3dnh7d3p6eX16eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3p6enp6eXp5eXl5eXl6enp6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx7fH17fXx4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHx9fX1+fXh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3d6fH17fX58eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en18fHx7fnt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5e3h6enl8eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBvbm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3t5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8e358fX5+fn5+fX1/f398fH2Ag4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAf35/gYCAgH+AgYF/fn+AgX9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35+gH9/gIB/f39+f39+fn5+fX5/f35/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5/fn5/f39/fn9/fn5+f4CAf4CBf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GCgYGAgH9/f4CAgH9/gIF/f39/gIGAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChISCgoKHg4OCgIKBgYKCgoOCg4OCg4ODg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYCBg4GChYWFhYaGh4aFhoaHiIeHhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OCg4WEgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkZKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSDg4ODgoOEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCh4KBgoKCgYGBgoGCgoOBgYCAgH6BgICAgIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKBgYaaiIB/gICAf4CCgYCBgoODgH9/f4CAgICAgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgYOEgoKCgYGFjp2Mg4KEgoF/gIKBgoKBgoSDgYGAgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KGhYSDgX59fICTnY2DhYSDh4WBgIGCg4KChIODgoGBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhISDg4GBgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+AhZSLhX58fX1+e42fi4GCgYGLi3+GhIKCgoGCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42MiISEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f36GnpeHfX+AfouFgJGEgYOBf4+SgZOLgIGCgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5KNjYqHg4ODhIGBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIScoIiBjIJ9hoV9goSDhIKBlJiCiYiAgoKDg4KCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZSfhYSIhIeBgH5+hYWFhIWOhX19fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OTkpKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDiJCBgoGChX9/fn2Ch4aDgH5+f39/f3+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4KAgICJhH9+fX+FgX9/gIB/f39+gICEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoaGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkZGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgYCAg42Gg4B+foB/f3+AgICAf3+Af3+FhYaIiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIOAgIGFhIKDgoGBgoGBgYF/f4B/f357eoGLjImKiomJiIiJiYmJiouKiIiIiYmLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+QjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoCBhIWEgoKCgoKCgoB/fn19fX1/fnx6fI+MiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWDg4WEg4SDgoKCg4F+fX5+fn5+fn19fn19foOHiYqKh4eFhoeHh4eIh4eJhoiGiIeGiYmDg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaDgoKDhIKDg4SCgYKBgYGDg4SDg5GSkY6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhYCBhIODg4ODgoKBfXx9f4B/fn5+fXx9fXx5fIOGhoeEg4GDg4SFhYWDg4WEhISEhISFhIKCg4GEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4F/f4KDg4ODg4KCf319f4CAgX99fn59fX19e3p6foSEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYOEgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn6Ag4ODgoOCg4J9fX5/gICBgH59fX19fn18enp6f4KCgX9/f39+f3+Afn2Af36AgIF/gICBf3+AgIF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODg4GBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fX6AgH99f359foCDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enl6gICAfn9+fn59fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/fn+Af4WSko+Oj4uLh4mFhISCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5/f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7gIB/f39/fn5+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn59fHx9hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gYCAgIGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXt6enl5eXmAgoKChIOAgoOBf4GAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCg4GBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDgoODgoODgoKCgoODgoKSkIuIiYeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaGh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhYSDg4SDhYSEiJKOjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODg4GBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWBhJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn5+gIJ8fH9/goCCgH58e4qCfYB/foGAgICCgYKAgIGBgH+LlI+Mi42OjYiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSRjIyNjo6KhYaGhYSEhYODgoKDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2MjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399f39/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf3+Af399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fH+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKNjIyPjYuKhoSGhISDg4ODgoKCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gH9+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaFgoSDgn+Afn+CgoJ/f4KCf4CKj4yMi42Mi4iEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gH+BgYB/fYB/f35/fn5+f398gn5+fX19enx9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4WBhJGOjIuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/gH9/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/f35+fn58fHx8fHx7fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJiomKiYWIkY2LiImHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn19fX19fH19fX19fnx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+goWIh4iKi4uLiY2Rjo2JiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36Bkox8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjpCNi4iIhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Jgn9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiOjYqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fX19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fHx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGBgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICAgoF/gIGEgX5+gH9+foB+fX5+gIB/gX5/gH9/f39/fH9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHt8fHt7e3x7fHx8fXyKioiIhYWFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYKCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx6fHt8fYmGhoWFh4WFhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4KEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFg4ODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKEf4OCgoKDgoSCgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Ag4F/gIOCf3+Af4F/gH98e3t6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgX+BgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fHx/fn+AfH9/fX2BgIB+fX2Af36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4KAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF+fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfYCAfoB9fn1+f4CAgH9+f398fn9/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+fn+AgICAf4GCgYB/foCBfn+AgoKAgYOChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1/gICAf39/f3yAf3+BgIGAgH98gH99fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn59f4F+foCCgX+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhISDgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gIF/e4B+gIB/gYGAf32Afn5+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/g35+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHJ5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH+AgYB8gH+Afn+BgH9/foF/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+goSCgoOFhYKCfn18e3t8fHl3fHl3eHd3eHt7e3t8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFycHh3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB/f399fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8e3p6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn5/gX+Af4CCf4CAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/gYF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt8fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg39/goGEg4OEgYGDgIKDgYGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/f4CAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEf4CDgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYB/goGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fX96eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGDgYCBgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoWGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fH19fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhICDhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgYSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4GCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+ChIODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4OEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4SFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhIWFgoeGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIB9gXWBeYN/f39+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fX5+foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISFhIGDhIWDhIWDioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWEgmh6cnNzfIBygYN/g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYZyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId6bX1yc3Zzdm1ud2xweWx1fX9/fX6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYGAf3t/fXyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYSFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhISGh4aFhYWFh4aIhYWGhYeHhYaEhoaJiIWEiYuIhoSGhYWFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxtenl5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX16fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFg4aGhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH57fHx9f358fH59gH99f4B+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoeHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhYWDhoaFhoWFhoaFhISFhYOEh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoeGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaEgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaGhYWGhoWEg4SEg4OHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaFhYeFhYeFhoWHhYSDhIODhIeBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx+e3x8e3x8fH17e3t9fHt+fHt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiIiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGiIaGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH17e3t6e3x8fHt7e357e317ent+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhoWDgYOCgIOFgoN+gYGBf4OBf35+f31/fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2AfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SGhoaGhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhYKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhIWFg4WFgYCDg39+f4B/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp6fHl6ent7e3x6e3t7e31+fX2AfX18fH2Af318hoOGhoaGhoOEg4aChYGBgH9/gIB+f4CCfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWFh4aFhIaHhYeFhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SDg4SDhYSAf4KCf31+f35+f4R+e398fICBfYGAfX6DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn9+f4J8f359fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1NXU1NTV1NTU1NTU09LT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vKysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fb29vb29vb29vb29vb29zc3Nvc29vb29zb29vb2tPS09PT09PU1NTU1NTV1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0j4yMjIyMjIyMjIyMjI2IgYKBgYGBgYGBgYGBf4/T0tLS0tLS09PT0tPT0t3j4uLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7s6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFpVVlZWVlZWVlZWVlZXTkNDQ0NDRERDQ0NEREBc0tPS0tLS0tLS0tLS0tDg7Ovr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj47PUI/ODw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0dLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpZ5fWVpaWlpaWlpaWlpaW1NISEhISEhISEhISEhEYNHT0tLS0tLS0tLS0tLQ3+vq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzdDS0tLS0tLS0tHR0dHQ3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaqjaGRlZWVlZWVlZWRkZWVdU1RUVFRUVVRUVFRVUWvS09LS0tLS0tLS0tLS0t7p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Ozs7Ozs7Ozs3Nzc3Nzc7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Pzs7Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzMzMzMzMvLy8vLy8vLy8rLzMvN1NTU1dXV1dXV1tXW1tbY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7O0NTSz8/P0dPPz9LU1dTQz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX19bX19fX19bW1tbW1tbX19fX19fX19fX19jY19bW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Oz8qWpdHP0rif0dGcgoSKxs/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8+cqp2t1bKXmLi6lbi5r6HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q/QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DLlIiancydo6ix0ZJ9fq+w0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEI6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0b3ImZnCxYibttXTzZ6ew9DPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Sl5Sfy9elm7XU08CgoNDP0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Ts5vEmNTVopq11NSvoqnU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0c6NkJ7C16KZtdTTo6G61NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NHL2qiZr9qimrbUzp6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJjqWanrTZo5q118OfodLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HKu6Gmp5zL16KbtNmypKbW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09OekI221tWyhMbWuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0rrE1dLS0cTV0dHC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/Pj5BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLV1NLS0tPV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw9OTs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ojg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc2ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+fn5+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo7PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/OzpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6ChoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QT4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampuam5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cm5ucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnp6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiZl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTpGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVnJqdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVWJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipKmnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqaqppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6mnqaijp6aZnKSmoqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6yppJ+ioKKmoaaupqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnNfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6KvqqqtqKirsKmoqqihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PjxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustq+zsKuxsrGin6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopKGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6impidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYW1odWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCxtLW2vLy+vLy+xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsLDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0NERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb21ocXhveWppYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbDxMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsb7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ3c3lmZ11kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDw8HEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbO/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpnXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMnIyMnHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraequ7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBx8HLy8jGzMrNxcbFw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVvdGJdYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw5PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBwsO/v77Ey8jKy8m8utXWyczIw8jJycXFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVnZGplYWptbm9eWVxWVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDubi5vL3Bx8HGucrKnMHGw8DEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e9xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmdjW1paXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba4tLS1v7u9wLm+urq0wLi1t7Kuuru2wLnam368wr7AvLvEvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+urW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vsvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCnoaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWNgYmJnamdmaWVpXVZWVFlPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tbGwtbe1u8G4vrm/vLy3tLevrre1uL3JyoOEpce6w7W6x7i2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGhoqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHFtZWVmb2lla2hYWE5LS0tSSUxIQzk9OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88OTc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7e5t7q7uru/0al7f4m6v8e3ubitt7W4urS4s7vFxsvBvMbAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJidnqSclpyjnJ6hnKaWfn+HfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2kr7C2ubK9vrvEtre3ppinpqe2xMiMeX6FucnPwsC4rrW1vL64urK+xMTKxcHKw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFmbGludG54Y2diW2NRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QD06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKqqo7C60dO0u768xbq0jm5ocGNreZ+se3uChbvR0czKxLW6wMPIv761v8G/xsa/y8bDv8G8wMPMysfFxsC5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmBhTkhNP0VAP0RDPDs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPEFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLGzxLLG2by9u8etjnhjYmpOUlpgfnl/hYm8yszLzcrGwsTLzsK8ub25ucDDv8jGxMHBv8XAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLW8uL1pd73Ov7ivb1liZFNsZ1NRUVtzfYSPu8PHy8jBw8HAycrCwLu6sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKyr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpJ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXpuc3hzZ3BdW15cWVFFRENNSUFFPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u8HAdGl9q762cFZKVmpJWoF3c1RQZnyFmry9v8bAucC8vsXEvb25srCuuLe/w8fDw7y9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f312bHV6cG5pW19fWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkNCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnJv3p3aX+pl1ZPSnd0TVFseYN7UFSCiaG3uLfCurO7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGso6irqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9mXVpUSjw/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa4yMCDfnNxk2xPSFyJaE9PT4GufV1LeKSosbK3vrmytbK8uby2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZxbF9jYVtdT0hBPj1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8S7jIN7eH5hSWCMal5RT16Bro5eUE57trawtrq1tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybWNdZlhcXVJOTUE+SUJBSklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i6wZuMhYl+U02InnhqWlZsXnWHbm96pby2sbS1srSvrLu6uLa6wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxCRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7yqkI2WmkxVir1ke4KJZ2J7amJtdqC+uLK0s7CxrbC5uLa+uLu/srKyrrGuua+qq62so6ihnZ6el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+ysKSapJ1MYH6PeWx5fWNhamt0eW2CpLeyrbOvrqyutrazvLWvqqSem5ycnqionqCoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKurn6aim6OclZCMj4+Qk5CXlZaYn56empiml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR1BNTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6SsqbS/s7NvYYVvaWlXY11eU1RZY2FccXuitqqytK6qq6+wsrWtpZ6SmJSPmKCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6aqsaOlqJ6gnJWTkI+RkJiQlpWYl5+Ym5mao5mXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01KSEdPUk1KTkc8RUA9Mj83NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqKGmw8OQVXVuZm9mV1tRSEVHSUxLTmFle7Ovr7O1qqasq6KcmZSOkZaXmZmcoKKinJ2lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmpabl5eYoZ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHl5YGJSVWBJSUpLU1RJUlBMOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWenbuyg31hX21hVEhGUUtJRElHRUpVWVylsrCwuKymoZydmpSXmpqQjpGVkYyOjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKxtKqyr6KZnJ2eoZmbm5qYmZuUlpuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVbU1pZTVFKTk9VTFNMQTc+QjY4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpuim56jp6F/Z2hfVEdJVn1+aFNHQ0JGTFBTirGurK+nn56ioJeRk5ugnJmXkpOfnKGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7itsrSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqOhoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFJVSEZVVkpCTEc9S0g4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKYnpuhoaGPd2pbUUpGTHGgp6BsTkVCQD9CVIOgq6qppJ+fmZKSk5iYlpaVjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+nqKWkn52qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JXTkpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKSgeWdcUk1LSlKN2dnAj3VkVklEU5GsqK2pqqWfnp6hop2fnZqcnJSTlZSenpiUhZ2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsO8w7y3s6mzraqztK+zrqqvo52rp7axraKwpqGjr7GtsKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHJra3VycGhXW1FFVEhESlBJP0VBNEZIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfn5qgnm5WTkxOTVZnodC7oJe4ppCJmK64rqejo6GgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Aw77HxsK3w8nJwsHGvrq0urq0u7ewtbKqurKuu7e/u7qqt62rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrY2hveGpkWltGS0xFRFNMREJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaKdnJVgTkZKTFZrfqe4qoaM1NbGv7eon5qcm56emZeXl5KMjpeXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxczQ0tXO08m9wL/Du8bFyMXR1M3T0NPTzMrCxsbHysjOv8jRzMfFx8XBvMPBvr++tb6zrr+/wsPHxMfErr+4sri8w8HBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURDQDU1NTg6Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOfnJ6UXEpCSExoeam4oZB/scu7r6minpyfmpiWlJKUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fR19LV1tPTyMzHzM3J0s3O083FyMnKwcbLx8jJxr/Ds7PIxMvKy8/Gyr++v73Bx8TMzMjJv8O/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxBPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2gomxKSkxVdaLN0ruhpLOqo5ycnKCkoJ2alJSVlIl8d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDW1tbS1s3U1tfU09HT1NTTz9LD0NPW2NXW0svJztHLxs3SytLW1tnV19PW2M7Sys/RzM7QzNLPv8jHysPMzMzOz8XGx7a/yr/RzcvPxsnIv8PDyM7Mz9DPzcrHzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGRyYl1SXElKR0FFSEk+O0E4PTQ1ODU7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoayBZXJ2kLPR29G9r6mZlZignJqgoJ6bnJmViXdpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTOz9XU1NHRzNDN09fW09XQz9LT0cnT0cjQ2NfY0djS19nV1szPz8rN0svO0MDGwsfFzs3R0dHIzM3AyszF087LzsjEysfGyMzK09PR1c/SzNPBucWxpai1rqebqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV5WUF9KSkNGQ1JNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpq63qKu319TV2dnRztC/vMzJtr6upqqooaWhgoqStNLS1cKtpqCXlpiam5yfnZicnZN9cWVjY19fYV9fYWBfYGBfYGZucHBua29yd3eczMHS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHF0dTK0NTV1s7S0NjY2NfLyM7Eyc/MyszAyb/Hyc3Oz8vQzc7Mzs/Iy9DQys7KwsnHyczKy9HSzNPR0c/Qyr3IubCuu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1XRTtAPTMzPD04Nzg2NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HAsKmsramngWyIh8DVzLCbm5aUl5uenp+clJaYlIhrXl5eYWRiYGBhYWBgYV5fX15dYm1yb29ydHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Hzs3N1MzO083L19bQzNHUy8zQ0tPKztHV0tXVyr/JwcXMwsjJwszDxcjKys/KzczQzdPLxsjPzcjHy8XGwcXKzM3P0cbQzs3NzM/Fx8G4ub3Dw73DubOyvrG7w8S1qpilopmWkZWVkouUjZqRlJSPj5SCiYV5cHFrbWdgYHBoWFhoVkxGTElQUEI7Qz47Njc6ODk6NTc9PUA7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWvtKigrGpofpPW0KqVjo2YlpGTkpGWlpaQi3xlYWJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytLIy87NxtHS0M7M1MrHy87Px8fP0svRz8W6xL/Gyb3Cx8nOxcLIwMfNyMTMysvPyMTE0MjGwsbIxL7Ax8zLy87Cy8vIx8vQxMXIu8fDycjCz8G9vL+wwcnHub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd290ZGtgXmZwYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLrNzcbQ1dXZ2tvY0MnPz9HTyMK2u7utpaVfbXeq1KqQjo6XkIeEhISCfoWFf3NgW15eXmBeYGNkY19dXV5fYGBfW1pcYGtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsnGwsPAw8jKycjKyMHFzMbIy83JxMLLycHCzNDFzMi/ucG7xse+v8bPy8O/w7vJx8i7yMbFysC9wsvGxcS+xry8wMPFzMXFu8DKwsXH0sXByb/KycbIxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhpZujoJuUe3ZzdGZpWmFubFpbWFJETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srKVXnB3uLSPi5OXh3uBhYaAdnh1cnBfW1tdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsba6srKzsrHCvLy8urjBwcLFvr25vb+5xMrFxsK9xsC4u8TJv8LJu7e7usXDv7zBzcPGvb21wb3Dur3Gu8K6s7zFxMHCtr+2tb2/u8zDvLW6yLq/vsvEwcbCxsnGyMbQxsLMx7LHycPOzcHFw8C9s7ewsqeoqLmwpa2wqq2slHl2d2pkZ2Bob2NWXllKRkpGSEpBRUJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztHKysrHzc3O0cjQxtXU1tfNys/FycXHwbnFvauvhmBzg7CSjImLhXmBh4eAfoR8dHRjW1xdXmBgYmNiYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLW3tLOztLy2vbG3sLWvsrvCvMHEvL+6tbO6vsC4x7m0u7bBwry4vcbBw7u1rrK2ur+0xLe7tau4vb3AvbG6tq+2urPFvLeuu7+1t7TFvL7DxcDDxcbIy8XAxsa7yMu/z8rHw8bCw7fDvb22ub7Hv6y1urW3to55dHhmZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjKyMrJysTQzdLPzcXHwcXAvrq4ybWpsYZoc5OejIaJint5foaGd3iCfXRpXl1dXV9gX2BkYV9kZWNfX1xbXlxdXlpbW11fbHBtaGZqbW5yfKTHv7i4tbCrrKeeoqqnnquts62qrKm0r7ewsqmupqyyvLq2w7m6urGrtbm7tMK6sMCxvry7trvHucK2raqosLLAtri9sLCnsrO1u7yrrrWlrrWuu7Kwqbmwrbuuu7i7wMC9ucK/x8PFwbzGwsjLuMXHxb/Gw8O6xMbCu8bJzMuzucK8u7OIc3Z2a2lhYmxoWVdXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXPx87Bw8a/xMTDw8rBycq+v7zAurK0tMOuqa+Ja2OJk4iOkHx4foqFenuEgXduXl1cXV1fYF9fZGJhY2NiYF9dW1taWl1aWlpaXGVub2hmZ2lrbnKBrbmwta6mpaenmqCloZqcpauupKiirKqsqrCjpp+qrbW2sb25r7evqa64tLS8uLS8r7i5tbK7wbLArqWpoquxsrOovaqrqKusrbSzpqitoaSvqbKmp6iupqi3rLGyt7q6u7K8vb6+xL+1wsHHyLe/wMW3xMK/u7/Ewr7EyMzKv77EwMCph3N0cmppXWFvZFdWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HLvrvJtr3DvrrJt8HDwbS1u7WwrrS7raioimNni4SIi4B7foB+eHR/fHN3ZV9dXFxeX2BeX2NjYWJgYF9dXVxaWFpbW1lYWlxfZmtmZWdlaWtvcoWqpayloJyipZSepJuYkqGjqqSin6alqKWtoJ2cpaassq+2t6ewq6iqtKu0urG2ta62ubKvurqxtqSgpJ+msaerqLmqpKanqKeyraCnpp+bpKasnp+no6Chsa2trLK0s7Swtby2u8HBsrq+w8GyubnDs8C9v7W4u72+vMLHxMLDvsDEoIN4cGthZl9rb2BUWV5ITmdPVEhFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLS1vbi6wLq9taCelZ2hprq2q7Ozu7PEz8jLwsa4t8fBzL+4ybe7xbizxLizvsCrtbuxq6Susqygoo1he4eGhoF8eXV0b21rampxaV5gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1viJ2poJeWm6GWm6KYlo2eoaOnm5+gpKaiqJ6bopufq7CssbajqaqqrKyktLmtt7Css7WusrWusKqfnZ+korKkpqm4raKmpp+orKuZn6CemZ2fpZqZo5ybna+pq6eqrKytsbK4r7i5u7C2u7u6q7OzurO9tLaxsbW0v7a9wL3Dwbu7vZeDe3NrX2VeZGRYVFddSVdcS1BHSUlGQTw/P0A7PzwwNDUzNjo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vEw8++uce4t763ssG0sbu7q7i5sKGeqKqml56JZYOFhn94cm5wbmtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1hYWFhaXmJkZWVmZmhpa3KNp52UlZWbmJuilpaRnKKiqJ2bnaWmoqacoKCbma6ura6yoKWirqunorWxsrKsqK+yp7qzprWgop6bo6Gto6Kqtaqio6adpqajlpmel5mbnaCal52dnZytoaunpKSmrauztKq1sLOrsrm0r6qvsrKzt7Ouqayusriwura6vb+3s7GUhXl1ZV5lXltZVlNaVUtbUUtJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+ynaWkmKWxwrW2va20uMLMyMa/xbbBv8fOt8DEvbO5ubK/trG4uqyxtK2emaOon5KafWiAg4R/eG9xdHFpZmRoZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqKclJSQlZeXoJeZlZignqGclqGiqaSfn6mdnJqrp6+wqpujpLiqoaCuqLaqpqetsKS4sKS3oKKbmZmqpqGarLiwoqGknKKfn5OUoZSWlpuYl5aXnJWfqp6qpKKdo6qqsK6otKuqp62ysKWrrrOxsLCur6anp7KusbSwvLS5t66jlIF5dWReYVZZV1NSVEtNXkxPS0dHTExFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri9rp2nqKOqu8C9wLmutLjBzMfFwsO9xbfIzLLBwsGtvLu0u7y0uLmvrq+om5igp5OQinR7gHx3cWlscnRwaWhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmNkZmqBlpOVjJKUlJuZnZaWnKCcoJahoKempKann52fpqCqr6afoqS3qKGhoqi0oqWopbClsK2rtJ6gnZWVqaGilK2xsZ+io52emJuTi6GUkZOYmJKXl5iXnqecp6GimaOlpaukpbCnpaOrq62mqa6vrquoqqmzpaasr7Sxr7y1sa+uoJJ6dnJkYVxaXVhOTFJIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxuKyepaett7u8wcW6sbm1xMnJwMPGxse2xsSzwr/Fqre3vba9urq1squsppiXnqKLiHJ9iH52bmNiZmloZmhqZ2ptYF1cW1paWlpcXVxbXF5fXFpZW1lZWVtXVVhXVVRWVVNUUlVgYF9gYV9gYWNkaYGUk4mRj5STlJ2UlZekmaCXnaGmoq2mpKSjo6KcqqulmZ+lsaqgoZ2lq52noZ6trKmprayhoqKVmKObnJCrqbCbn6KfnpeZk4mekY2Sk5aQmJiTnKGjnaSgopWgoqSmm6OrpaKkqqSrrqWusqmmpaamtKapqK2ztbS5uq+prJ6LcnBvYFtXVlVSR1BPSFpbT1JJVEtTTEVGSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4tMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm9sb7EyayxuMG1u8C7tLOoqaSUmZqbiH5wh4N7dGlpaWxnamtta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV5eX19fYmRtjpCEkYeQkY+Zk5WTnJujnJuhqamrqKynqKakmaWupJSZpa+pn5uZm6Cerpmcq7OgpaafoqOhlZOblpaSqaqtmpygoaCalJCMmY6MkYyRjZaVkJ2hoKOcm6OVm6CjoZeiqKOiqKugq6+jrbelo6OirK2qqKuvs7ezvrWzq6+YhHRzaFtYWFNVUUVYTFFbWE1UTlBMUFFJTklCPD8/QT88NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDAtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62os7auqaevrpupqKu3tqy7yru2v6zLxsW4wc7PyLPEu7e7w8ixrbi/t7y9urKzo6eelJaXlYZ4c4B2d25taG1ubXBnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXV1cXl9gZH6NgYt/jJCKko2XkZeZoqCboKuqpq6sqK+kqZqfrKCVlqSop52XkI+anq6WmKiqmZ+dlKWgnpKQkpGTlaerpZqZmZ6elY2Mi5OGiY2Dj4uSlZGgnqGjl5WflZqhop6Um6Wlp6iooLGwprG8p5+jrLSrrqewtbC5tcCxrbGrkH1yc2JWU1ZOUklGVlBSUUxMV01KTE5SR01KQUNGREM+QDY1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OsprG3qqaisKudqqepsrGltsa0ubqzysW5usHL0Muxtri8vsHDsbCyt620s7qysaGhmpuXlpKCfnZrZ2xucW5xanBrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWFxcXWFqgHp/domNh5CKl4mUlJibmZ6pm6CqpqWrnaiaoaWbk4+fo5uXl4WEkpujj5SjnZaWloiim5uTi46KkJqkp5yVlZebkZGHlI6LgYuNgJCKkpKSoJqfopWUmJmVoqaZjZmkpqimoZ+0sqiyt6Gcoresqq2ksrKmtby1rKuxo4l4c21dTlFRTE9DTU5OUEtGTk5KSk5NUUlNSkFHTEhHQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSopLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2saWno6mloKilpbOqorLDtbWys8bGt7rDyszGs6y6vbS3wK+tqbCepq25rqudmJmclJKFeoFtX19mcnB2cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhZWFtdYW9zdnGFiIKIgJGEj4uUkZSeoY+bnKOho5ill6KclY2HmJqMc42Dfo2XloaRmZCUjo57mY+cjIKJf4qYn6OekJOYloWNgpR+fnSKjnqQh5OQkJ2amZqRlZCdjqKjjomaoKGkpJuitK+sr6yfmKW4pqaxobGunLC8qqmvqpmCd3NjVk1ST1BNQ1NOTFFNQlBRSElOUk1ISkpDSkxGS0s8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKmmpaijpqWmpqazp6a0wbiwtLDJxLe5wc7FvrOsusGrrcOtqKKmkp2mtauhnI6UlZGOfHZ9ZVdWX2dmaWdobmNqaGdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5YcpCDl4aOnZeLlJCfmJ2VlJaVj5aJgJOJXztXb3yLlImAjJGMkIaGc4qFloF5gXqFlJ2Ug5WOkZCDhn2TeHFwhY19iYGRjY+XmpiTio+JnIifmIiHlp6aoaCXp6+praion5ats6Kmrpmsq5iotKKpraOTfXJuYFtOU1JWTERUSlBNTEZOT0lFTFFNS09KSU1PRklJPDc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCgrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepqKOqsKintMG5sbWwx8K3s73Pv7mvrrXCp6rFqaOdmIOUm66gmJWFk46KhntydFxRTFJVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1waXuCdFBCQH+VkZF9iZSNhIqNm42WlYmSiIaVhnmIf2BKUW54ipGEfYSNioV/f25+f5R3dXV3hI2ZcFGNiIqGe354lHZod4aIfYqJlYuNkZKWi4SKiJWEmoyChJKblp6dlKSjqKmlpJ6bsKqhpKSRpqqWoqqcoqaoiXRtZ15bSFFRUk1JVU1TSUxLT0lIRkpOTE1US1FQT0ZJQzw3Njg6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Nzc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6OnnZ+ir6GnqKWnqK+sqrW8tri3s8G7tqe5yLi2qKi1tqqyvKaelY5/iZOnlZSJfY2DgXx2b21YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+HgXyFjJOBkpmLj3uGj4B2f3hzbnVwdI2OgXp+iquFeXpodnuOcHJteIGLjZJ4eoB7gXZycpJ3Z3WEhISEe5WJiIqMi4B/hIuMgJSDfIGPmJWclZGfnamen6CdoKmln52Yjaekk6Gflp6epIByaGFcXUpWT1JHSlhST0pMTVJKSkpMUElMUUxSVExFSEE8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpmjopicn7Spr6mlrKuwsaq9tLK7uLa6tLGft7qyqp2drKmosq+hmpGNlICNm42QfnaFd3t1b25oWEtISEhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnWDfHhmd42XmI2PfWh5gXZ4gImPfYSYkoFxh498d3tva36tfXOQi397hpKBfX90ZnZ8hmxvaHN8iYyIgGx5cX1wbXWPcWlxgH6OcEOLhIKDhX93d3qLhX2Me3V+jpKPmIqSmpujlpmdmp2eop2WjYulm4+el46WmI93b21lYlpYV1RRSlNVVE9QTlBWS05LTk9KUU5ITk9LRUM8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzUxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKavrK6rqKmxr7GrvLisu765s6ynm7CnrJuPlpylqaSgl5mOhJJ5iI2KiXVwe210cGlsaVdLRkdFQUBDRElMTE1RUlBRU1RUVFVWV1dXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXljfHhvfHmIkHp9i4ZvbYySeXR4amqAgnGWkYuBfpaASZOYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmltcH9zjYmEhnp9fnt2b3RzhYJ5gXhwfI6MipSDlpeYmpCSlZeZl56XjIOJn5GLko2GkJZ/bmlub25YVVdUUlFZT1JUVFNYVU1OSE5LTU5LQ0hOR0U/Ozk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrbCirKqota+urLS/q7zCv6aimZWkl52NhIuUoaGYmJGTi3OOen+Fi4V0bnRrcGxka2pYTkVGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXGCniGKaaXR6ZX9wbX96i4l2gYiGdGyaknRzfGprnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtxgHxncXF7bpONj3tzfXxxcG51bYJ/eHl1anmJgoiKhJaTkpCLjZGUlI+XjoB5iJeIhoqGgJCIdmpqb2hlWFFaV1lZW01QVVZZWE5JSEVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw1Nzc1NDc4aU84OzVukoiakZmWpKiunrKfp7uvq7KwwrG7w8ealo+UmYuNhXmEkJiUjZCMj4Zxh4Jzh4yFem9ycG5vZHBmX1RGSUM/PDs5Oj9AQURERUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHJ8eGx9bXKDgYWBeoSGhnlyoZV0eIFzdZSHNXGdqJ2OoaGEooV2cIZ8h3xzjK2NiYBnZmJqbnJtcIN1aW9YdXCOmpJ3bH97fW1xbXCAenN2bmN2hH6GgIWQkYqLiZGLkYyLj4N1eIuPgH6DgH6PenFwb2tgW1xeW1lYYF9STltaWFdMSEpGSkc/Q0FCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkrKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBk4iWkZ6kp56vlaW1qq6xrsGyu8HGlpCMlJCAiH1ugZCSiYOKh4+FdYKDbJWIh3t0eHhsd253Y2leSVBHPkA3NDQ5Ozs8PT5AQkVITExMTE5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8foWDf4x+dqKZeX6GgYWZhJucYYaqn52Lg5COeneIfomIjXOKl4+Eel1kcXR6e3eKbGdqYnlvhY+Cem6Bd3SEenB0endrbmled4d9h3yIh4+Ai5KXg42FjYd9cYR/hH11d3t8iXZwc3RlZ19bW11TW2ZeV1FVWFtVR0pKRExHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIySnZ2fppGgq6CxqK/AsbrFupaOkZSHeoV2a3+MkYJ9ioSOjHiDgHOhhIt9fYF+cIB+emd2a1JXTEBFMjExMzY3Njg4Ojw+QUVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxxfI+Men2Jh36Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkaiHgJiYipxzbXyBhod9jmhnaHh+boWHgoVxhIVHa4B3cnl2aG1rX3d9g4l/iIWMepWem4mLiJF/enWLdnx4bW93fn9zc3JsW11dW2NjWGZlXFVQUFZZUERMS0ZOSUNGQ0NBQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFiJGPlpiSl6GdrKGmuK+zvLOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEzMzY2ODo9P0BCRUdISkxOUVRUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYGEgoWRk36FiJGBmpWCoKGXlZuapa2Tmruxp7vHw6iKjKGlj5SJgZF7cYOen5Gcf3aFhYqPiJBpaG+DgHWNh4SLcYaCd4eAe3aFfW52dWeAlI+GiYiIiIehq6GWiY6Yf3qCiXp6b2dreH56fnJqZF5aWl1qXGFmX1lPS05XUlFIUEpETkdDSkRCQEREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZniDe4CMgIGRj4uam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOg4CBjIuCiY2Df4l/bXBqXUJBNC0tLy8uLzAyMjM0Nzc5Oz0/QkVISk5RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISkxLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jaGemYSThYKOoZ+UmZKEioWPmJGWbHB1iYuCloyNj3aPhHFshYGKlpKDhYhyiaGWh5OJj4+WpbWpm42VooOHk4R9f2tqa3yAgYFzYV1jXlpma1xra15XS0dPU1FOTUxGSVBDRE1GQUNFR0I+OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwgnB1h3F2koZ+mJaalZ+fnKegqpaTmJ5nZaSafoSSkXmAkoiQkn2KhZmSkYKAgIuNiYWQhoSIhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjU1Nzs/Q0VOUFJUUFFRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZuopqKZoZeilZ2fqJ6pq5+orKmqtZerv6u2yMi3ydHPvpugcGmrqZ+ElJKGnKGampmnkZGIlaKamnh6fpSYkqGSl5eBlJ57dpWSq7OJjZegfZSenI6Tlpmkoqa2sJ2RmaiIlo+OgYhsc3J8f3xxaGBcYF5iZ2NgZ2dcUUVKS1BPSUpMRkZNQ0hMRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHVgbn1hd459fJSOjoqfkpeelpyqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJjIqEkoWDhomBgIZ3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VSTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpNT1FZbYaQd5WLo6eqtL24pa6srKeotKuwt7Kyrbuxs76cs8Ssu8nLuMS/uKWjsLKsrauki5aYhaamoKKXgaaZjaKqqKSIhZSkoaCqoaSpjpyxi5Wjp7e7m6CjsJOjnaOekaSiq6+ts7WilaWqiJmJkoqWenp+hX5nYGhcZWJdZGNfZmZeW09DSUhUT0ZITEZKR0VGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoGUhYiCnIOSkI2S2sidlnNWl4iPiJyPfIaMjoqKeoiCh5GOg4WAi4WGh5KGgoSJhoiHh3FuYUBFNjQ8Mi8xMTAtLCstMS8tND9EQU1VUVJTVVVXVU5bUEdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHHw6uzxrass7+zuL62v7TBtru7pLjGqbbJx7W+ubSoo7StsbGcmpKan4mnr6uklXafpJehq7GzmJaqrqiutruyuqyvtaKxrLG1vLe1rrWgp6ijqJupsK2yuri4p5u2qYykjpGToId4goN1WWFkVmVhYWNgYWVfWlVKREVMVVFISUpESUdFQUBAS0RBTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxbWlFjZFd6dXGClH2FhpN2hX6AjXu/u6O8grSUk42bj4SIj5KJiXmGgIyTjIeFgY5/gYmOhoCGiYWKh5F6eG5dVkBFTTw2OjQ2QUI3NjUwLzZDSENRXE9RVVdVXFZPXlVJS0pBQD9HS0ZFRDs+QDdENz9CSkpFR1dUUF6Ppa2jsbTDtrjBzMm2vMW9s7PAt7jCtb+wuHSytKa6xaSwxrmxs7G0qKS1tqqxoKKWm6KSpbCupa2sp6SYoKyzuqKpsrq1u77Mv8XFvb2zwre6uL+3ure5rK2wprGqrb6wvbvCwqyZuqiUro+YmKuJfoJ8aldiYVhqZWplV1tjWVZUSUdHTFFHQ0hJQUhEPj9CQktAQE1DOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh203P0ZRTEFMUldUWVVad2pwf4+EgY6FbnpyeYhiuKGZo4mVk5aTk5ONkJeSh4d7hoGNlYqAhICKenyLh4Z8ioOBioOVfXd5dWVPXGRHRUw6UWRhW15TRj87SFBEWmNRUVlYWWdZVGBgTVNPRUE/SUpIRUZBQEM9RTZCPkhHS0xTWlRdk6+4tbq5ycC7vcnMu7zAvLe1vLu3vrW6ssZgdbOlsZqeq72qpairqqOisrWhq6ielZafmKCupaenpZ6klKKnsbSnsrK8tsG908nK08bCxczCysPAvr2/u7y3tLC5t7fDusa9w8mwnrmqoqyPpai3iYF/cV9hYVxXYV9oZlJYYVZSVUlFRk5LQT5HRD1LQj1CQD1GPTtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzM1MjY/OEA+R0tSVFRSUFBRUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWhsbHGQjYWQdG1zcnOI1cC1maCNlZiZkY6XkpaWjoaHfYaDjJaLf4N/gnh6i4OHe4t5gYqCl390fXprZXB1WV1cUGVlYmBlZF1bWFdcTWRtVVJtbV9uX1hnZVVZVEpEQUtKSEZISEhIQkk5RD9IS1RUVlxaW5K5wLm9t8bAu7nKy7q3uba4ubO4tbSutraZZHWonq1wXqKsnJiho5uknqullKCfkJSOlpiXqJ+mn5+amYSknaylqrCtt7C9udTRz9fPyczSzM/OysfAv8LKvcG9wsDFxMbKv8jOtKS7sLWwm6y5vZp/eWxdX1tYXWFZY2NRW2BTUUtDQUVGRDxART5CSEJAQz06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaV9wl5KRlG9sb3V1iLOsoaGfi5mcmYyNlZGbkoWKin6Ih4yQi4l8gYRze4mDhnyJdIKKhpV/c3t4bG11e2hyZWlsaWZqaWhgZmlobVptdJetpLyIh2dbb2hdWllUSEpOUEpLUUxUUUlMQUpHS1BfX2JmaWGYt8ewubO7vrayxMe1r7mwsLuss7Gnqresjbannpunmk+bnYyOoJaRppillYqTk4mQiY+RkZ6boZiblZeHnpqmm6yvqK+ns7TU1NXW0svP09XO08/NxcLJ0L/KycvJ0sjNzcLQ0riwxLzEuqa2u8Sjgm5jXFxdWGBXWGZaUV1XTlBDQkhFQkk7QUQ+QUg/P0I3O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OT05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VXc5CQmINocW95eYOgqp6ml42bm5eLjpWRmo59iYuFjoqKi5CIfISCcH+HgYZ7h3KDkouPfXF4dWxxeH5xe214c2xpgXBtY2ltcHlpd31+y7/C36dtY3huY1thYEpQUlVOWV5QXV1OUU5UUVVUXG5ud4Jylq64rLSnsLarrb3Asau1pqW4p6yuoay0o46xrpqYmIyRlJGEjpuBjaaRnImDi4SKiYSLg5SVmJeUm5GcmJmZnp6rrKSnoaysztLV0c3M0tPU0NTRzsjD1NHIzdLT09fN0tHF0tbGwM7HyMOpv7jQnnluZV1iXFZfUl1bT1BUUE5IPkFGQUJFPEBCPkVFPj8/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WGhYp3bXdwfX6AoZ6eoYuNmZOTjIyTj5aEeYWQkI2LioiRh3+Ce3J+gIKHeoV1hZORiX9vdnNsc3x7dnxzgXdxa4BzcmlvcXp5cnu+y5p+jLKDdnKEdmhhal1DWlpbVmZkWGVrVFhdXGBjXWN4e3+LgZmqpKShoKGppqqxuKqltKOiraKjraKnsZ+JppqUkpGKko6IgpOJa5WijZmEgIV+kYODk5ati5WNlZmOhZKQnZensKGgoaSkqMfNz8jCy9DT0dTSztPNxtbSzNTY1tbY1dfVydTazcnX1tHKrcTDzIpyb2JgX1hTWVJcUEpHSUlKQDs6O0VBRDxCRD5IQj9CQjs7OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN5coKJgZ2VnZSFi5aJj4qIjoePf3eElJmLjYiIi4l+g3hze32Dh3eAe4eRl4GDbndwbXV/dnh9c4V8eW2HdnRvfXaEdXl7nbWMPEGLxqV+jXxpZVZJQ2VjZmNoamRveVtfZmhrbmlugIOJkYudnqCdkJeYn6OjprKkpLOgoqWeoamgorGchp6SkpKQi46LhoOPhH6cm4yNg4SFepR+gqmVo4ySipiSi32XipqRq7OYmpunnKe9w8a4tsbN0tDS0MzSy8nUztDV2tfX2NTZ2M3Y287J2trS1r/MzLR3dm5kXVlSVVBZVkZHSkpFRT06NzlAQUI6SERARUNBREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGFxcXOGjXyXkZ2LfoeSg4mGhYqCh3x4hZaXiI+Dh4aHeoR5cXp7hIZ1eoWOjZ16jHB8b3B6f3J8gXGDh4Fujnp0d318gnV/fIeIsHRYqcK2jJKCcG5iPV5ocnBxcG54d4JlaW9ydXhye4uHjpSSm5agloeMk5ugm5+qn6CtnKKamZ+lnp+smYuajJGSjYV9iIeDhIuOoJmTiISHfm2ZeYSYhoiTjI2VjIZ7m4iTj66qlJWXnpimrra9qK29xsvIycvL0MnD0crU1tjX2NfV29fT2dvWz9va0dbI1cuVeXtoaFtZUFNTXUhDRUlJPkE+PTc6PT87Pkg9QEFBQURBPj46ODZEQjc1NTQ3OS41NjY0MzU1NDIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OTlEP0NHUmtfbWRiZmt2gIhxkZCbgHmAjn6DgoKFf4R8fISXjoeLfoaHgHeCeW57e4aBdHqSno2hdo91gnR1gX10gIRvgZCCb5KEdHyBhXp2hnuJt8akwsm4gZabj3dwZU5mY4F6gXeGopCLeXl3e4N/fIR2bZSWlJWPl5CDiY+WmpeXppyYoJefk5KXo52aq5aRkYuNkoOMhYmIgYWQkZ6cmYmFjIGGl3uIiJ+XkImNiouCfKGJkIu8oZeTl5mcqKalrp6ntb7AwLnHyc3Oxc3K0dbV1NnV19vU1tna29fb2tnYztvGhnp5ZmhkX1RXVlVNS0RNQzs9PTw5Ojw+OT5BNj4/QD0/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPT1AOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eop8foB/gH2Fen6CkYmEhXqFiHt1fXRufH2GfnR/kp6Rn4OSfIZ+eI59eIqKboKagHSYhX6BiYV8fpB6j6mPkMOgvIycpJx9iYR9iXOMin5zppqcmZSFe4+QiYRoR3GhpJ2Mi5CShYiLkZKVj52ak5WRl42MlZ+dlKGUko6OkIt+kI+Oi4SIkpaan5+JjJSSnpGCi3+mmYiFjoKGhIClhoqMuJidkZSWoaegnZ6do662urWrv8XK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfct3h4d2ppZFZgW1NPTkhETEI9PT45OTo6OTk8PTZAPj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmBj4pxcniKe3t/fX98iHp8e4uHgn51g4Z5c3pzbYF+hH13hpuhm56UkoCLiH+Yh4Cckm6HqIV6oIt8kI6DiIScfpqRio2joqCQpK+gi5GLhYuBkoZXcq2Ln6ycj4OYm5CQjlyDopGCjJ+TlYyGiIySk4yUlZSQjI+KiJabnY+VlpGLkpSGgIuJko2Jip2WmaOjhpOdlqGLioiOnJCDiI+Ag4eFpIaMkLOYnJKUl6GhnpmSm52nsbispbzBx83Hxs/Mz8zP18/R1K7W1dja2dra19bZ2p9vfHRnZlxdWFNWV0NASUQ+Pz46NDk6Ozc6OzozOzw/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieGxifpKDbm13i3h5fnqBfYZ8e3aGhIBzcIWCe3Z2dXSEg4V9fpKmo56mopaJnZCUlouKqJdyirKMhKeRhJmThJmMopagmZOJmp2ikqmvn5GVkI6NiJWLbo23hJrEyLKdoqWbnJiWkbKQY6TNyJWOhoeJkJKOjZOUioWKioaWmpuPkJSTh5WYhICPi5mIjZCql5eko4iZnpabiY+Hl5eLhY+MgX+Gj6WJjZOomZaTlpihmJ+Zk52borK0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6Ccn9oYl5dXU5JVFlBQkdEO0E9ODM3Ozw6OD02NDk6PDo4Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdoGOfXxtfoh4en56goKDfnZ2gIJ8bG6Lf3p8eHh8hIeKfoqjs6ejqrOhlqefpaOWla6ig5C4lZKzmYyhoYykm6+jpJ2YkKeWp5msr6SXlZaVkIuYmZagwI6jybmrm6OmrZiRm52ynYWFqKKcmIWJiY6VjYuTj4iBhoeJk5iVjIuUk4eUmIaEkZCcdJGZs5aXpaGInJqTkIqRipebiYqWjoZ9jJieiZCQnJqZk5iXn5SgnZWem6CxrqKkt760xcfEvcPDv8bNysnSps7N09LQ1tjT0Ni7cnl2XWBVX1ZPSEpOREJDRTU+Ojc3Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OklFTkVEOjZBQEJTPjlETzMyMzU2NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdOW1xZSmZgO0iEi3p7boWGenyEeIGFgX5weHx+fW9yjXp9gXx4houJhoSSp7usqLK9r6Sts7Ooo6KwrIqatJ2juKSVraSXqa23pqSjn5mpl6mjr7CpmpmclJWRl6CYmru7rsqhara4q7CUmJ+jq5OXvqNeqrKCiYqNlIeRfI6OfYOGjo+UlYiHk5eMkJWNi4yXmJKdmbSXlqudi5yUko2QkoyZm4qRnpCLiZWfoY2UjZianZObmJ6UoaCUnJylr6ihpLO4q8LIxLW6vbvFx8fC0aDGyc3NxNfW0cvUoXB6aFxaU15RT0VDPjxDQUI4Pzg3NT5GPDw1PDM1MzQ1NDU0QjM5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQUVANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRHYmBicEpAi4p/gXOGh32CiHWDioJ/bX19fH9wd4d3jYGHe42PjIaMmarCwK+9xruztMG8tK2rs7aLp7Ktrryqm7ukqK25uKumpqKho6Oor7KxqpycpJial5eeoqWlkqS6rqnAvK2tsrmlpKd9iIecrL2wg4yMi5CDj4ORj3qBiJCNjpyIh4+XjYuVl5SQmpadp5qxmpGsnI6aj5KOlZGQlpeOkaCRiZSbo6yUlo+UnJ2Sn52bmKChlJqep6akoqSwsqbBxsOvsLq2xcTCvs2mx8PHw7zV0c3Eyoh0c2JcWV9bTUpCTEBFRz5BP0I7OjQ+QTw9NT02PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQjVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxlR2BpZ1pdXJOMjIh7h4uGg4x1hpGKgW9+e4F/cX6BepV6kpSUmJCTlaezxsm/wszBw7nHvLqvq7m6l7K2urLArqXApKuvu7yqrauiop2nqq60sKqbn6qboZuVn7C0p4ujurq2wbysqJyypaSolIWOqsPEpIKLj4eIhIaVlI16g42Rj5GhjIyUko6Il5+Xk5mVmKagr52MqpyNlY+SkZSVjpCVkY+hlIaXn6CynpSalKCgmKSfmqCboJSYnqakpqakr62lwMTCrqi3tcnDvrbOssS+xLyz0crIwrV1eW1cWFxpU0xIRExLS0pBQT1DRDw1QUQ7OjM9OEIzMzIyNjNBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJmWk5lXGZUY2qZjZeKjIiSkIaJeYaUkIFygHyNf3iHgoKQeY2hlqiampi6vcfIycHSycrCzbzBs627vqe6v728xLeswamss7u+qrCpo6WjrK2zrba1oJ+unqWimKO0vKmbqL3Bo7e3sKuSsK2rrJeGmqqmpZGCjJOllYmBdoqSeoWNkpCen5OPlIuPjZSjmZeclZSjn6qfkaWajI+PkJWWiHyPlZKSo5qVoKKctaaQnpelo6Klnp2mmJ6Vl5ulo6inorKsqLzAxK+ls7fMwLmuxLO7vsG4rMLDwsCZbXlhWFdcW0tLTUpGRERJQkJBREw6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djpeOnpKJin+JoJOEeIV/lX9/kIiKkH+WoZmupqOYwr7Hw8fF083Ozcu8wrewubyzvMu8w8G1truts7+5vK6vqKCop7atramxt5qeraKnoZ2rt7eppbC/xLG+ubOnqrWzra6WlqWsqKCRjpKxxaeVjn2RlX2IkZmQqpmYk5OPk5WTpZ6TnZmToaOinJifmYuMj4+eiFqQlpeSlqWZZZijnrKllqKWrKyqp5ueppeYl5iVoaSopp+2q6m6vMO1prO1y8G4qbassrq4rqi3ur24gmxuWldUVU5GSlNOSz9BR0RESEdHOTVGTTs+Nz1ASi4zMjAyNUI1NVBWTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs9QEJGQnFGaUlSZWJMRqWUnJahl6mWjZGDh6aTiIKHgpyEg5WQkJSOmqKfr76uoca8xcTGxs7OztLKvru2sbq7u77PtsS9t7i3srG1s7izq6acq6u4qqinr7CXo6+kp6SktcCwqqy0v8O6wLqzp7m1uLKulaWtr6+li5OVoY10wZp+l5mFj5aajLGVmpqVk5OZmaWjlZ+blpqpnZyhoJqLjY+WnWBKlpyalZqlllSWsJ+vnJ+llK+urKWaoKWUk5mZjpyfp6KZtKmqs7y8vKqwssfAuKWrq62xsaOhsbK0pHBuZlxaTlBLRFBQUFE7R0pJR0hDQz46S1U/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiql5mgoqivmZGXh4unlo6Jk4Wfh4Sdl4+eoJqjpLXItKnGusLDx8nIyMzNxr67s665uMDBzbbIusG4tbqwr6+ztKajm6qztKqopq2smaSupaSnrLq/qKu1t7/Bv765s7LEsbm9rKOutay6poicmKabdr+ghZmdjpOZmouvl6GcnJeVm5+hqZ6ooJqaqpqip56YkI2RnYNudpKimpWdop6QrrKiq5WoqpeqrqWkn6WokpKZnIiUnKKelrGmqau6tr6zsq6+ubago6eopaecm6ypqYxiZWFfUktNR0hOSVVMPUxETkpLQkNEPFFVPUFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5SYE1VSH9lXkhFq5ScoZ+7r5mUn4uTqpuRkpOJq42Hop+MpK2Uo6O2xr20wbrCwsfIxcLNyMG9ubKvubTAwsq1xbHBvLS6qqitrbCiopmqtLumqaarqp2or6ejqqq+u6etvLS3vce8t7W4wbG9wLOptberv6WPo5iRoqC8n4maoJmXnp6Pt5+pnKWjm5yhmqils6GbnaacqKqemZaPlJuLl4mMpaKUnaKeoLSvpaWTsKuZq6uenaSjqJGVlaCDj56enJWppKKhtLS6ta2otbKznpyipZqXlZiqoZ53YFxfXUpIRkdNUUlNRUZGQlJMSkJFR0BWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6Z1xGQ0OccGJHRaeXpJ+ew62bl6SXmamclpqaj6qWlaemla2tmaGrtsTCu763wcLAx8S+zca7vbmyr7izv8LItb+vu7a4tqakqqytoKCaqqrEoqWoq6aeq6+soqmov7emrb2wt7bHtrW4uL+xv8G2tLO0r76jl6OWlJyUrqCRoqKlo6OfkL6lqZ2oq52doJumn72imKOfoqmroZ2XjZWek56Hj4WNk56koZ21rKWclbKnma+nn5qpnqCNmZWfhI2gmpuTpaSamKuxtbGqpaqtrJyYoKCSjpCWqJ6UaGJZYV1PSUdKTkxIRURJQT1QSUE8R0lIW1JPSz1IT1U0QkY5PkhHNUNhW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDPEM+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROm5SRjxLeGViV0yimqOcnsWsoZ+snZ2uoJOjn5aloKapq5e2saOqsrXExL2/tr/Cu8jCvsrItri1tbCzs7fBxra+sLi0uLWfpqyqrJ2dnqWjwaWgqq2fpKmtr6Kmp721pbG8uLa2w7Kzt7m+ssPAt7ius7W1o52llZKUoa6gmaKdqairo5rDramerK2bm56ZpqG9op2lmKurrKahmY2Zn5KfiY9Xf5afpqGguKqnk5i2o5+yoaCbrpaejpmUnYKOn5eVjqKklZCmrrKrqaGipaWVlZ2Yi4+Rk6SeiWFkWWNgTEhKSk5GRUFGSz49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dySEU2PXVlXEtOnp+hmJ7DqKWis6GcsqiTq6SgpJ+tqaydu7CorLWxyMXBwrPCw7zGw7zEyryvsLatsLSvv8S0ubGwubSsmaiwqamanaWhp8Ktm6yxm6qirrCppKe9tqa3u72vt8Oss7PCv7LGs7q3rLS2raqippaWlaSsop+fmqirsK+vvLKmoKmomZmYk6KkuKChpJOvr6ylp5+SoZ6Vno+QjZWdmqOfp7Ompo2YtJyjrpqem66QnpOXlJqAkaGWjo2foZOLpqywpaahnKCekpKak4WLko2cnn9hZVtnZUpJTEpSQkNASUc7O0c/OTlPTVVeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ+jn5ugw6ikqrKho7SqlbOsp6KksqyuqbuyrLC1tMbAxMO1wMS9ycS1wMjBtKu1qK+4rL/EtLeurLa5pZmrsauqmJ+ml627tJuosJutn660saequbKnurO3srnAqreywry0xae+r623taqorKGXl5KmpaKjmJilr7iusrW2oJ+ppJmVlZOkoLejpKaWrrKyp6umoZ6bmpuWmKifoJiinq+yoqaNl66ZpauXmZ6kkZuNk5eahZWelIyPnJ6Ui6mpqqGnoJielYyOmZCBhZWJlJ94Y2hda2pNUE1OVD1DQU5DOjpJQDc3Uk9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJcGhWQ1dGjHlmQzuko5yhpr+mqK+woam1q525sKujqrS2sbC5t6+2uLjFvsPHvbzEwcbAuMDGwLqptqSsu6zAwre3qayxuqKVrbCtspalp5Cquamgp7CdqqCwtLKqqba2rbuss7O6t6y5sMK6vb6mw6uwt6+pq6unnpiZq6KioJGYobGvs6uxupucqaCZlpKXpqG3qaWjorCxtKuyqKufm6Cgm56lnaKXnaOzsJqfkJOlmqCompSinpWYiZSYk5aWnJOIkJuZlI6pqKafopuXm5OHjpmLfYyWhY+bamhsYWxuV1BRWlRBQ0VUQDs7SUE3OlhQZF5QVldEWV5dTUxSTl5LSj5aY15OSFBOW1VZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT0qJys9XHA9PjEuMWVbZEAxNjQ3Z1lgRig/OGx9aFtWO4l7Y0M9p5+coam9oaqvq6OxuKmltbOsoK21va6zuLy6vba2wMO/yMS5xMHAwLjEvcC3r7Wnq7exu76/tKmusbael6utqK2Wp6iOp7ufpK2znquisbCzrKm2tLW9ra+xtaywtbHAusW3q7yvsbisraqjsaafpaqgpJeQmaCzqrOqq7OanaebmpWOoKaktK6noq2trrGns62yqqScn6iknpWhmZuotamXmZKSn5meoJ6Qq56XmIWVl4udmZuTio2Wl5qXpqSioJ2WlZeTgI+UhXuOkoOMlmVscmdwcV9GWWZWRENNWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7R0RGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2FVMTUwPWBWXjgpQzNZVFxnSzaMemZMQKSaoaSstqStqaWvrraqr7W6p6awt8W3sbe/wMG1tLrFvszFucK/ur+5w7fAuLG0q6m6trq5vrSqrbG1mJinrKqrm6yrjqu9nquusaOroLGts66utrK5t6qtrrGota+zu73Ksqq2tbG0r66nobOgm6itoKWVlpuasqOtoKavl6GkmpqSjaKlp7KpoqeyrKq2pa6xta+kmZ2tp5qYn5mZrLijl5OQj5icoZiXlKufnJOBk5iNnZyalY+JlJOemqShoaCYlpGTlXqLj4V7jIqDi5JrbnhtdXtgRWFqWUlIWVo9e0pGRDZBYlRpW01cYEpbXVpSUlJiYExLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENfUVwuKkIvSkdQW0gzY1lUS0SZl6CxqLGqraakr661qbe0uaSrtLfJurS6u7++tLS3w8DMyLvDvLa9v7+3vruwvK2nuri3tsK2q62xt5SXpq6rp6OxqpSvu6SssrKnqKOys7CxsbWxuLOprquxp7ivtbTDxbaptbassK2pp6O2n6CnsaCklJyalbGep5ygqo6po56blpilpaW3p6KytKynsqetsLWspZmgrKibnJ2blKq4nJSOjouZnKKXkJiloZ6Vg5GVkJ2cmJaUh5eQl5qmm6OgkpaQkJV2hJCHe4WBhI2LbXF3dXt+XEtlbFxLTmNcPmJ7R0k4R2dXZltMXmJNWFlXVFhUaV1PT0hhXV9QSkhRVlVSS0lXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydHYkxWJS1CLj1FTFE8M3JrSkNDkZmlrqWtrqunpbGys6q3sbegq7W5yLiuwbzDt7OxtcLCzsW/wb20vb+/ur67scOnqbiwtra/vK+rs7Kcn6exraalsKWesrWsq7KwrKmotLmstLK1rLStqqyoq6m4rbGwx7+4pbmwqa2tpaitsKakpK+kqZyenJuvmaOjoqORrJ6koJ+iqqWmuaWstbWlqquorK+2rqOdo6mqm6CampKktJqPiY6HkaKglY2UnaCUkoWOkpKdm5iVk4aXk5WZppqen4ySkY6Qd36NhXx8fYeKiXF0cn59fVxTZG9eTllmXEZElltHO05tWGJbTWBiTlZXVldUWWdeUVJMY1pbVEtHT1RTTkdJV1NcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGVISis6ST8zQklTLD6PazxHSI+cqquiqbGkqaWztLG0tbKyoautvcu6rsC7x7G0rbTCwtHFxb7Asr3Awry/t7zEp6y3rLO4vMCwq7GtoKOnraqopLCjqrGqr6ywrq+urLO7p7awsqmyqaulpaOtuqyqscK5tay6qKmoraqosaWqpKOuqqiin5yjrJWlnpiemaydoaepoqylo62suLGyoKmioKuvsKyen6eoqZmkmJmPoKeYhoSPioueoI+LjJWbjo2Fh5CVoJ2WmJWGlpOTl6SbnJyLkpCNiX5+h4V8d3+HhYZ0c3GIdWtfWWBuY1FzcVxLO4R8Rj5XdFhgWk5jW05VVlVXUFxiXlNPTmhYV1dLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLkpnREY4PEIwNUVLWDFAlFo+TEWVmK2ooaqznKqqsLatuLWuq6Wqqr3Iu7G9t8KvsKyzxMPOzsO+v7TAwsO6wLPIxKyut62yuMC+s62uq6SnqrCpp6ixpbSuq7CurbGws62zu6S4s6ysrqeroKKesLeqqq26tqW2taOqp6ysqq2hqaemsrKkpqahoayWqqGVmqCmnqSiq6Ssop+nsbetraOlopuqq66pnaKlpKSYoJmWj5idk4KDkImFnaCMio6LmI2PioOMl6ObkpCbjJOSkZSimZuZio6LinyGgIGDenSAhIJ+dHeMpIh4al5gbmdXZYdjTj9nk0xFYnlXYlhSZVRNVlVVVE9cXWFVS01pV1VXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxDKzpKT140RIY+SEZEl5KwpaOqsZirqq21q7axq6Wsqqm8wMC4uLO7taWyr8TJy9G/wbu5v7/BucG6wcSusbWxs7rAvrOxrq2rq6i2qqaur6u5sKixsa+yrLaqtrWntLasrKSpq5yjnrSyqKiktLSgtq2gqairqaunoKusqbm2qaqqqqKpoKyckqmhnaCkoqajqZ2cprWuqKapoqOYpaanqpyipKOfmZifkY6PmY5/h42HhZ6eh4SKio2Mj4yEhpSimo6MmpGSkY+Sn5aYlouKg390hoF/f3h1g397eH+BiJ2Pb3FnZ3F4XGBziGpPXplWSG14VWRWUWJQTVVUVVFPWFtiVUhQaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg+Qyw+TFRfL0pqNk9EO5WOsKClq66arKWtrrO0r6ulr6mour68wLCuuK2htq/Jx8jRwL69urzCvbrDwb+/rrKysbW8vMKxsbOrs6iktamlrbOzubCjrraxr7K6q7muqq62rKqeqayfoqC2raihn6+zobSqnqinqqOroaKsrai9r6yuraGnqJ+rmZCvoZiioainn6iamaqxqaOfraKhk6Kjo6eYmqmlmJeZnY+Kh5WIfY2GhYSkl4WCgouGjo2QhISToJaIkZ2Qk5CNkZyUl4+JhYV4dIF/fXV4eYB7dHN6aYGGo3VpXmVrgXVniIx9U1hwXkp4c1NkU1FeTU1SWWZOTFZZZVlGU2lSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGg6NDhfPWFkP0YxQ1BbWytITjlVQTSQj7GfpKaspKekrKa0srGqpLCnqri+wbuvp7mqpq6wycfI0cO8v764vr+8ybzBuLCwtbG6u7jAsrO7rbitorSmp6yytrmzp6e7ta22vbC8pq2stautnKmvo5+lrKunnJ6qs6SzqJqqp6mkqZ6jqaepvqu0r66dqaSgrpybsqOVpJykpZ+kmpqoq6Wem6qhm5KboaWdmJepqJKYmpOQioKPhX6PgoCIno+Gf32Lh5COkIR/k5uThZOijJSSi5GakZWHiH5/cXp5fnxpeHx6dXBwfWiFeISIZGFoY3KFem1neV1eVkJXem1UYVBSWEtLTnF1XUhaW2dZRVVmUEQ+Sk5EQ0E5SEdLUz9qYUpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtL0dqSTE0WD1mY0JKN0dTYFUqPTtEWD8qj5SxmZ+gqaWkoaukt7Kypqmxp6y4wb21sKO5rKioscPJyc3Btr2/tbe/uci2w7W0s7Wxvbi6vratuba/raGzpqqrsLW4tauevLyossCzuqCvs7WqrJ+usKOcpaipo56cpbGmr6CfqqmooqqcpKigrbyorrCuoaujpK6enq2ml5+boaOcn5uaoqqjmpqkpJWXlJ+ilpuXpquLnpGQkYyCioGAj4B7mpWNiXx+i4aPjoyKhJKYkYeUo4mSkoeQmY+TgIh8eWt9dnl4Y3t6cXBxcnhogHRqg2dkaGFuc45tYmlwYHBBXHhsVV5PUVFKSk1UWVdNXV5tV0RYYE9eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDBCaFkxM1M9ZV9ETDZLV2VPKjwzT1k9I5KZrJmfmKekop+no7ivrqOvsKmruMK6s62fuK+rqLS7yMvIv7fCvq+0vbfEt8Oxr7qys8C1u763qbm4vauktKeoqrCuubGqm7u9pLDAtbShrre1pqensbOgnqSmp6GlmZ6tp6ieoKmup6CnmKSooLC4n6Oxr6GsoayknKanqZqam5+jlZ2cmp2pppebn6iSmJOYnpOZlqGpkJqJjpCHfYd/go58fKGNjYh5g4yEiYyMhYiSmo6JlZ+JkZWCi5aMkXyEe3NvfXFzdGB5eGlvcXBvaX5xY3psaWVjYGaGf2BbcmpyTU1+aFhaTVBMSkhQUlBJTlxfblREWFtSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpoSCo+L1lYNSiXnaWYnZatoKChpKG3q7Gks7SqqLnEtbKuoLesrq2wtcbIwbe/wbmwtLy3v7u/r6u9sLS/sb3Duam7urenqLWop6uwrbOxp5q9t6StvLavn7G3sKilp7Cym6CkoKSkoZecr6ahn6Knr6KgopOkpKO3sKGmsaufrKOvmJyqpamel5qdpZObnJqdpquanJyllpWXlZ2OlJejqKGQiYqQhnqFfoSLeo+Xio2GeYKHhIiLjoWNk5iMjpaZio+WfoaXi495gHpwcndvb3RfeXdkbGxraWiDbWVyamtlaFxjc4BfWmt1aVpJfV1bWE9PSkhIUlVGMjlfXmxQRFhWWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0R0FmW0hURFVdaEUuOzJgVCwylqOhl5WcqZ2loaKgt6qvoLq5pqy9xLOwrqK1r6yur7TExL2zv7q3sLO5uLq4u66uwLO0uK+/wbisvbq1pqKzqqeps6uusqKbwbalqLW1qZ6yu6qnpqmwrJmip5ykppSYorKkmZ+kqKmcoqCTpaCkuaikp66nnqWhqJKfqaKhoJmbnaCSmpyWoKKrm5uZoZWSlZaajZSTo6ekj4iKj4Z5hHyFhX2djYqLhnmAhIeIiJGFlZOSjJCVlI2OlHuDl46Kd357bHRybGx0Ynh1aGhqZ2VvhGdoaGRmaWpgaGJpZlple2NgU3NUW1tTTElHSU9TQCEqaV5qTENWVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRCM0NEZ1tLV0dVYGhCMzc4Y04nMp6ko5KOpKacnp6do7Wtp6q6t6isw8C2sKyita2nr6+4wMC9scG3sa6yt7a4t7asqr2zr7Kxvb+3rru7saWftqulpbSpq66gn8KrqKWws6qstLqdqKqrsaWYnaqepqSRmaatopiepKmhnKKdl6Cdp7amr6quoaGenaGVoKafoqCZm5mckpmdlKWeraOYl56VlI6VmIyPmJqooJGIiYqIeYV3goKCnYeLgol8f4SIhoWQhJaVj46QkZGRjZJ7g5WNhnN+fWZ4b2trbGh1c2tjZ2RjdH9iZGVmZWlqY2lxWV5YXW1kYU5oV1pgVklHSEtNUlg/OWBsaUdCVVNcW0lJR0VBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFlKVmJmQTszQWZIJTWbpKCRjK2hmZiglqW0saKxvrehsca7ubCxo7arq66pub28u63Asq+urbavs7izqKu4sa6utLa7tq+4va2mnbWroKGxpauvn6TDoLKkrrGvt621na2vra6jmZynqqWelZuopZ+ZpaKnnJqgnJScna2wprmorqOimpqemZ6jmqSdl56Ym5SaoZKolaypm5SbnJKMlZmOlJSZqaeNjYqJj3uCdIKBipiFh3yJiYSEioyIkoWTnJKSj5CRlo6Qf4CNjYJvgX9meW5oa2pncXJrXGhkYnKAYGRnam1sZ2ppZmxcbG11cWFUYmhjZVlJRkxNT1hRUFVhZYFUQFZTWVVGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDo2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUllQyc0k6Kbj46wnZqToZqpsrCfuMC2oLTCu725saW2r6mupbe5t7isu6+tqqu3qrS5rqWytbGuqbG2trCytbqnqJ+2qZ6eqqKqrZypwJitpK6wtrWsrJ6xrbCqopuco6yom5Wcp6Odmqmio5WaoJ2Rm6Orqqm7n6ekoJiamp6hj2uilpiccYKWnKSAdpGrqJ6VlZ+RiZeZgJeLoI95hpOMg21pfneDcWyGi4Z9hIuGb15jYGeEl4Zri5CUknV3i4R+g49/ZoeAaHVpZldcaXNuTlBqZGZxhGZeZGZubGleX1+JkISGaE9LRDhFVGdeSkdQUFVVS0dTYG90ZUVbUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc2MDEuKi4qLzY2OCwjMScyMTQ6MTc2WIFsMTZPa1tOXEtbZmI+RzFQZD0rL42kmYeVsJuck6Cbqq2ro73Fr6m3wri9vK2ntrCmq6S4tLKzsLmtqqestKawtaOouLa1qKestrKutK2zoqmftKueoqScp6iarLyVpqWvs7itraSorquspaGenKCop5uYoaalm5unp52Sn6CZkZ6oqqO1sKOjo52WmJiXo4ihj5Kah6GHlJ6hf6V/p6uek5KbkoiEcniMjoSIoXaIjGmXiGZ9c3ihb4iHhH6Ne3+hoJ+Zf3uInnSIjnabimyHgYNtaGVjemxxYlSGbWNtaZhxWGpwboZXXmlba2pbiHBteXKGaIeEWl5GTj5GXk1FUlZXUVFSV1RnXkxZS1JST0VHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxVmE3LyiMppeEnKydmZmdn6uqqKq/w66xury3wL6qpLexqqyms7Wur7O2q6mlsa2ltbOcrbW2tKWnqLOxrbKnr5+qoLKon6SjmqKknK61laSlpra9pqynqaqsqKaioJmfpqOZmaajpJicpKmWk6KclZOjpaaht6SkoKSYlZOYlJyIrpCYlImpi5ejnIWxgKStnpSanpV5gtSof4eUwZvHeXixpbeXZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4FslrGrsHloa1ixrm9labySvG5oem1yj9h+U2pjtrJ/gXGUdZqhqpBXT1dhT1ZORlRbWFFQU4tcV1tQQFxFUU5ER0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjqaTgaapn5ecnaWtsqmxwr2ytcC1t77Cq6a0ra2pqK+0qq+2tKinprWmp7ivnbOxtaqlpKexrq2xpqqep6SxpKKhn5ecoJ+vrZWeop+0uqKpqKCtrqWinZuaoaifmJuooJ+YnqenkZynm5SdoaejoLCjn6CjlpaSmJKZhbBraoqNqn5nhJaHrWVxnp2VmqaVca6hpH53u3xroY92sV9qtFulgGackWBmgXpmf2p4aqllvnJnpox2sWp8sXh0kpNjbW2nbluEoEVpZ4eWRXWcYH5ne6Ongllfi6tpgZV4emqnN0qvW1dUbGNbS05XX1xXVjtOiE9XVi9JVFNJQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMxG5KilYKsp6Weo6SqsbettL2+sLfEsri6wqepsKyvqamxr6SwurCkpa6zo6m4qZ6zsrCjpaCqra+rr6ann6OisJyjnJiVmJudraaXm6KetLOhqpuhra2gnpqXoKKpnJmepKCcmaGnpJCdo5uYoZ+sn6amoJugoZaVkZaRmoa1m7V4hamZtZl3h7Obt3+TlpeplH5rgaZ6gYWIkpSSd6tnarFbrHuPh5R0iHCPhoB/iJCXeIOCi5eMg6CPhbB2d59xa2psfItOpFhIY2OZfmNopmB5cnVTkoZeUKltY3F+h4BinS5Rom5bVGtnYExLXGRYXFpCPrB4V1hBI01oRUJEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o5YVU1MByWn5SIs6amoa6pp7Osqru2wrC8wq24t8GqrK2ur6ausqmhr7yqoae1raOrtaWmsrOno6Kdp6qyqLCnpZ6gn6+Wn5mVlpeYn62impqkqLWvoamPqaipm56VmKClqJqfnaOfnKCipaOVm56Ymp2jq5ummZuboqCXk5GTk52D1ZOZuXCwwn7GhnzWlJu7fJqWpZCNm4ykeo2Ho4KlgnqseY+dVa97iX6farlauXeGg32mgpN8mHqqeY2dj3uxbo6EdJC7hW+UT6+nxYpRoHpjYKpic3KHbJeHX1O1tMiGgIl8Y6QzQp12XVFqaGRQQFhmWmRhSkhNbEtaU09ZZlpDQz9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw5O0RIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tcUF9mVDdHOmFRODIlnKGTmLGoqKWzqqW0qKW8t8GwusCxtbW8s7ansbGjsbOmn662qJuouq6ir7Ggs7SwoKSenqepsKi0qaWcnZ6rl5mXl5eWl6GqnZqXqK2wqaOfjqyip5ael5yhpaGYoqGioZqioqebnqCelZmbpqCcp5Sbmp+hmZCSlZGdiLJuaLVxq4hwjqZytHNytnuamKSNj5uNon6QoKV+sHaDkdLRdVuufIZ/pG+bqqZrhoV9rX2XmY97sXOTnY54s2WWdIWebp5mlFLIi1rCXJ95Yl+tYHdzh2KXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPal9saVBVRkk5PVdSW1dYSEM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCTlRfZVA1Rz1hTTYyL6KdkaSvrKSqu62mtKWotru8sru/t7a0u7uzpbW0orKyo5+ssKSYprqupLGwnLS4qqCmnaGqpLGnrKqlmp2aqZ6WlZiZk5Oip6CXk6aqsaahlpKsn6WSlKGbpKaflZump6Gao5+tmqCenpCWnKKenKWUnJWaop+VmJaSm4Wse3eodqOPioepb62Kg6iDmZmiipKZi6J+kpiJroV/grNccrNSrn6DgqR/cdd9d4R+j52GmZp3r4aKkZyHd7RhmmWagoGVbJJasFhLmnWYeWZgrV53d4dnmIhqXa93lZ6PeGw1eciusl9BVG9eaGBFUGxfcG1WVU0vZWNpU1lRO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6ODifnZSguLCYtMGtqLKnqrK6uLS4v7q4s7a9taW4tKC0rJ+gqKuflae2rKiwsauttKSbqaCgqKG1pqaqo5melaWhlJScmZOWo6Wbk5CnrK+moJWYqZ+ij5GimaimoJWapqmenaSerJ2gnaCNlJ+bnqCYmZyWl6KglJiRp52GqX19pXmhj4+DqnCtjIKnhpagoYqXl4ijgZCIlKp8gIudeW+xWqiDgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH2ClGySXKtbWpN/kX9oZ6pkc3uBa5iHcV2sWomgjmtuZU9KQ6FcWkx0XmNmTVphX3N0X0pVNUqakllIRT1IRkFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOj4xMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8xVV9iTDdGSV9DMT44oZyZmb6smLTCrqutqaa0sLixtb+6urOxt7yqu7WgsaSepaennpOqsamvqrWsq6+hmKGgpqSjuaKjq6GXnJGioJWUn5qUmaCgkI2MqbCvpp2Xmqemn42SpJeoq6eUl6qon5+go62joJ2hjZWhmJ+gkp2XnJWeoZWXj6ubj65tcrR0qYx3iqZztHl0s4CSpKOSnIyJpIeOdrhvjHuLomtrtlqhhmWXl2mgoqdtlHK0dJOYf7JqhpKIrWt1s2GdZqJuhpJql1ytYE2hfIeRUnOjbHl/fm6Yhm9cr1Y8nHdmVG9uLlynT2JSa2VibVliXGBxfGNTWVA+Pm1vM0JCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VfYUw1Rk1eODFCOKWam527opyywK6tq6unt6m4r7XAtbyxr7m4q8G3qqqgm6akoZ2Sq6qntaOyqK6qoJecqKCkq7mdo62clpmPpaOWjZ2hnJmdn5GTlau2r6eZlJusqZeMk6WZpayjkZersqSgnqirsJmhoo+Zopegm5abl6GTnamclJGrmYfUkpq7dLHEgMOGfdWWnLh4iJGXjJeJjKeHeaO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gIpumohwbY2kdL1dd31bYXm8a1pWW2p6XmlgZGZibXhvWVtZQ0FAcj9DRis1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC45Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QTmmmZ6ivKKXscOwramqrLGnuK+2xLG7sq67sK7Bsqylop6joZybkaqkqrKktaetpJ+WmqqZpqy4nKKumZWhkKWgk42co56YnpqQlpKvubCrlZejqKeUkZalnKStnpGgqKufnKCppLOeoqSOp6KUoZqcl5WkmI+woJKVqp6FkJm1gJGRjbiVeIKTm7V3bmxuc255j4SOiXOewbu8mnuBsqhwgHSRuYN8hoaLh417ioaNl3yku7m9nHV6s6N0dpd1dLB1mJ5mhmmNtnRycHe2jF5/en2JZ4N5bXlii6xwdYV/WVunakVkWlRmYGNdYlFnZ3FtdUJNUExEO1pMP0ozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEFLTkdFT0Y/Rzw3PjcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVjgqT11dPSs7VlYnPTs8pp2gob+llrTDtKyqp6yrqbuusMavtbSvuKe1uK2po6KmnqCdmZSspK2qprWoqJ+blqCjnqykvqahqpiVnJGim5KPoaiik52XkpiUsrW2rZidpKSii5KSppulq5uWqKSlnJuiqaamo6igka2elqKel5eXnZ6PsKmUnKeijmp+aZyneIlzfpqOdXplh3u9vsC6bpKDcZSGX3JqWl6aiWFkh46Va2CAlWNtnHZilGt/mpWUZV5gY3GbimhyjH2GlWdqfnF0eX18Ylt3dIFoUFxug3x7i2pYbHmCcklKb4VwTXRNRVddZmFMW1hnY15PW211aXFST0RFTjtISTxNPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVERlVFS09IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SVJfSSdTYFY0KVBeTCgzPltPJz8yPqifqKHBo5q0urajrKWup6i1sqzIrLCzrLWjvrGypqCjqZ2jm5qZrKeupKS1qqWbmJWim6atqL6nqaaWlJuVoJqTmKWpp5GekI+YnLCyv6ybpp6noomTkaqaqKSam6ufo5mbo6etop+qoZmwm5SmoJeUnZ+dl7ClmaKomZyRnpyjpJmno5qcmpuakJaCaG58cXaRl5SRhIm0qY2GmJWOioyXl4eUlYqDkpORiY2RlJmTmJeaoKKbm5SgnY6CeqSFa2p8kHyAdImKgXGCeHl2doqAe4pqc4F0g3Vkd312a3B7bWBjXHBoTVlZZWpfV1lvem1tZlNPRlM5T1pOUk8oKztKQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5TMTBUXjorPThdSyw8LUCyoLOhv6KksbK3oKmlsqelsLWqyautsaa1psCotKCepKWcpJWWoKumrKOjt6ygmZaWoJetqqXAnquklpKcl56Yk5Sin56ip5KRmainssOvmqudq56PlpapnqqcnKCsmKGbnaKlr6aipKeerZiWpp2ZmqGenpywoJ2ip5aYk5mUoKKWo5+XoI6WlIuKjY6XrY97lZuCkoGJqaiFgZiWioSOn4h7hJCGhZmQh4aJlY6bl42QmJ6jlpqTkZ2Nfo1morOuhYmEdnqPin12eXpvZ3mQgYCJa3WBeYhyaHR/enaDiIJrdGN5ZmBpZGNkZmpYa3twaWpcUkxQRF9VRkA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl1dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi8pKyo3JSs8KDZDTUxEL1RdUTA1TVsxN0U0XEc1PCxAtKC5r76tq66ysqCqprKtoqyzsMWwqqyjs6+9pLScoKaioZ2Zl6ilqKakprO1npWUnpmZr6auvqCro5GRnpqZlJGVoZyXqZ2FnqmsorPItKCqpKuWlpiap52om5+kq5Sen56gqq6ppaKqoa2bnp+hmKWenJ+dr6SZn6iTmJedkqWamKmempdmg5J8ZX6Omo9jeI1saGt6kKOra2WamH5nhYplZWloeo2hjmtojJeRondraouYo5+Yc2xueoSNhnlYZV2FgV5rioqBdltoc3d3kYCHgm54gniAc215hHR3iIiPg3tqhVhea3RkXXOIaWp8cWxjXVFOV0lkWEBKMz1GNz9GRDcxPD0/QUM7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUvKisnNiokOycvQUlbSS83Wk82KUVZL0RPMVlDOz8uPaWfury5r6uzsKulqK2usKaurrC9samopK2wsZ+tl5+jnqGamaaqm6yjpqips66elaOQoq+mtrmlrqOPjpqhmZOSmqCZmaWWe6Wsoqizw7ikoqevnp6VnqOeo5yjqaiRnqGeoKqvqquiqZ+om6Wep6CslqGbpbCkmJyrlqGem5OlmJ6rmZ5+voOIcrRyhZ6GrWh4ucS4cZKho3ummJlzqoJ8y8DAu3GLooeDn3yVmIiewL2Clp2ejZ3BwXuBepGMmsK/fWulsW+MgW/Ken+bd5GDjoB2eYF/eXF6f4dxeIWMk3ltdpJiZl94Y19lgWJedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5IW0wqI0NQLyNGWzNQWS9VQUI7LziWo7jDtbCvwKmplKOvqbCvraayta+rpqamsaufq5iaoqCcm6qnopyroqWopKS0pJ2jk6aurLezp6+ikpGanaWSkaChl5yfnYemq6Srrb/AsKGpr6mXkp+dopmio6qjkqChnp2trqmspaOipqCkpZ2tqZGkm6mtqpydqpysopaXpZaho5icf86UeXqlgnmVlptfro9ejqeAoaF9p5abdKuDgK9eZI2peqeHhaB0l5KIs2OCq4ahjo2zaYSudHyWh7hhgq1Zo81uj3V723t/mXB+iJJ1f2V7h3Z2a32Ibn6FkZJ+bYGOYHFrcGZgX3hkW3BoamNmYFJUUlddSk9DNUFIRUQ4PjY7QD9BOz04QD4+P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKy0tSjAnO1w6TC0hUEBGNC4xrcLAwLW0sLeYnpGkqqittKumsqysrKSsprCqoKebmqaYnKKwn6GfqKejpqGesKybnpamrq2xq6isoJSSm5+lk4+fpZeeqKOerqSrsKi/xrOoqbGulpKdnKKXoKmqn5Sgnpydra+nqqmbp6ajoauSrbSWpqKrqp6jp6ahsKGSmqeaoZuUlJGXoHCFjJd1haiHcbF8nXGsfqGfgqWPnnergn2tf5xyrX6rh4afdpiSenyXfqqIooyRi51+q3uIk4+ggHqtVpzEeo9vksF9gZVtdXCMbWZ2ZYZvYXducm+JipGQg22Qj2VvdHZvYGZtZF9vaWluZmNXU1xhWlJSQzhJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5dXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScgJzQeNS0mNz5XSi09Jz4xKTNWQEYhHEc6QzEuK6/UxseytJ+do46jo6GsrravqbCnqaqorqurp6KjnZmilZ+mq5+ipZ+oqKKfnbCsl5uWqKevrainqZ6XlJqjopKUoa2bnaajrqyjrLWpuc2yraaurJaUnJ2imJ+urJ2Wn5mdn6mxqampm6upo6Krm6+xoqisrqaZpquqqrGjk5ejpZuUkoWkaqR1iXqpdHqycIKliZmMcIigmoekX2BSq4R/roKbdq6Bp4aGn3qYloV7ZoCjiaSZhoGjfal+gJSHrl58qFWdopKBeqKfgHvDr8WMc6+zs7lxYqmvwnRojYyYj4FtmpJvbnl4d25sZmVkcXBme2hjXVdfaVhYVExMUUxDQ0FCO0NBQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NzQsJiQiICgnIistIiQuITMtJkBEV0gsRys2NioxUEtMIyBBOUQ0LCfCydXWwKGZq6ihr6KesLWwr6mso6imqqurqaSmoJuln52lp6ajnKyaoquhpJ+vop2bk6qktrCuoKmbnZaUp6OQmqKon6CmnLCmo6ixrLbIsrWqrKqVkZydopmfpbOdmqCTnJ+nq6ujrpqsqKKhqqKzraKqs7Ghm6qor6+2o5OXpKeYm5F8qmyehId1q3l8sG+CpIuJn5aVn5WB0ri0uMmAgbJeX5Spg6SHh6B6mJWZeKrJdJmjlaepkJKbjH6biZrGxndloYKlc4GfjoJ9r15vtWOxdUujhm2nR4KTZI+QnpN8cJeSfnB7dX16bVxmanJxZoFqXmJYY21cXllJTU1LRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTk9QTUZMSlZGKkwwLz4tNE9UUR0cOzxGMiwkqKTBxrmtqLKurKWinLK5rKqhppuopqqsqaegpqWYqqOfrqudpqCsmp+ppZ2mtZ6il5OnqrWyrJumnKCVkKWtkZmcp6OgqqeuoaOnqbC0wrKzqq2ok4mYnaSaoaOupJahlZicpaarmq+draimnqyjt6yhsrmvnZuvp7O0s6WVmKikmp+Ogp1OeJqBf596hKN8gqSEh6efnJ6ThLh8fHm5gn7MxcK2eJuhkIuffpqWl4p2npiKpJijqH6whZyEnoSsfZmUYaVso3CPhZCBfZeDcqxgpHNxgJpgvH1SVXWOkaOXfH6SkYl1enOEfnBcbW53cmqBb1pkX2huYmRdS0xRVEFIR0ZJOjlLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMjpQW1QcGzY/SCwtIIyHmamspKu5q6+gnKGss7Smn6CVpa6urqmmnaammqOnobKuoammsqCZqKSUorWio5WXoam0uaSbo56jk5ChspmenKemoaKvrZ2kqKK1scOxraqtqZGHkZymnKOknKSWnpiZmaWkqJquoa2lppivpbytore3rZ6etbK5srOnmZ6woqSeho/RtcO3eYeOhZGTj4CmeJSid4ygkoSlgotxq4aEtG5yapmjnJWJn3yYmYaHj3OvgqWboo2mi5OdiZSQm21wslylc5N6nGyZf3uZfW6pYaJxcX+fYnOyuGh4j5OmmH6MjJKLeH15jYFtaXdpeHNuf3RdZGRubWVoYEpaV1g8R0dAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVZWVFFPUVtVJSEyQUgkKSWSc4yKrr+/u7u1npeopK22oaKZlaOpp66pq5mloZ+loKC1p6Kpp7CjlKujjqSto52Qmpqps7SknaadqZKUl66goJ6npJynnLWaoKqjtqvCsKmrqqGMhI6boaCmopWYmZyYmpimpKaYq6etoqWbrae+rJW+sK2fo7Czuqy0p5upsqWomHqokH18sHeKgaSliJxtsm+hh618oY+DqJaZgKyJhK6Fn5SpoKKWhZ+AmZWAe5J+q4CdmpaKqnidoI+Jk5KAea9do4F8pqdknYB8l3Rrrl2la3GFmV1gW4ygbpWRppmDlI2Wi3p6gpZ+a21+Yn10bn96YGdlcW9nZ2hDWWBbPUpTMlU4QkJDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFdXVtaWFNQT05JNzA1Mi4qLEFUVlZWVVRVVVVVVFRVVFNUV1dXWFZVVVFIRklKIygovJKahKnGw7bBtJ+braCuuKWkjpuko6Cvr6qfo56drZieuaCiq6CvqpmtoZCqqaSWiZqQrrCspp+nm6yYmI+soqGdpqKapZytmJ+opraov6+lqaSejICOm5qgpp6SlJmak5qapaSjmairq6Okn6movqSXw6yqo6Kss7qsr6ehtLCpqpl2r36Qi5yFh326roqYZbCMZZWtfaGPg6eVmoGsioSwhaWZpKGikISgW2xqgbNgf617e4KAsWxnbpmXjIixW320W6SDa8iiZZ+Ae7xZdrVasn1Sr4B6rFiAoW2Yj6iaipeQlZZ7eI2cfWRzfWKDd3SAfGFqZnBtZmVlT1VjW0FUXj5JKD45PTQhIi0lHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBfYGFiXl9cW1hVUE1KR0M1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7K3vbu0wbOjnK2mpbaooYuZoJ+ds7OpnqKfnbSYoLOoqquesK6dq5uVrqmijoibjq+sqKaip5muk5mPqJqhnqWfmqOjpZmeoqmyqLyvpKienY98i5uVoaCZj5Kam5GZl6ieoZioraelpaOlqbufoManpamiq7S2ra6noL2ura2WgamSo6+Om4CGpJeYkIGAuMO6g46ck4Wnl5yCrIqCr4imm5qlqpF+1b3CqmKjv718fqOCg9e6uLWFlJODnr2+hGqjgW+rhG6df3qysMeDaquwva14d6K+u3SAlo6mnI+akJWceYGQmnlifHpkjGZ5gntga2VramJQYltTalxAVGFCTik9OjQvHh8kHiUyIB0kKDA0OTY2Nzg7PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSUM/PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbS0sb+5sr2zop2upqWzpp2MmKW/qrexqKG/pqaxm56xnLmonq2upaaVlK+sl4yDmpGvpqOsoaScqqGYi6OSpp6nnJqhqKKZnqCrram5raijm5eTe4eZkaabk4+RmJiOmJOpmZ+Yqaigqqaho6u7nqnFo6Cvo6uztauwqqG8qLCwmnR1qqS3hmWJn3BnrY+Kj21vd6SQmZ+Bda6ZlXCQjHGVp6ObmK6kcm1tbWWKd25tgplxgHlpcWlniZaVmHFoaYWGZ3CGZF6JY2pvWV1nfnemYGJxjpJvZmSAjZKOopiXmJCVnnyHjpR1ZYZ3aI1qeX55ZGxjZmxiS2RYSmtZOlBlRVInSzorIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBgYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJSts6q6ubKzqqmirp6ksqmYkr2xw8i+tqqewKuso6Cmq5+6o6StrKymjpatqo+MhZWXrZ+lqqGfo6OgkYykkqeZqZmWo6qglpylpaevuqusmpuSknuEl42ll42RkZiTjZiVp5Sel6iimrCmnqKsup+wwqiks6assbKrrqyouaSvuJaKoailtp2JlqKYh6makJSdk6qzmZujrKCylqKgnqCinKCkoZWrpoySk4yHkpyclJCZk5iQjpWGgaSal5WNi5OSio+GhH5ni390gnZ0iIxxp218lZGUk4GBj4+Pj52UoJWXlqCCh5OMcGiPdnCKd3Z8empsZGRvY1VgWUBpWkdiYE9aK0Y9KyYhNzQwLh8cISUyKCo3OTk0Njk7Pj9BQkRGSktLTU9QUVdUVlleX2FjXV5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqltbivrqKwpK2foLWxkY6rxbzEu7iqoqWdm6adsKijtqedqbSmp5GYrKOLiImPnKeWq6ShmaeenpOVo5eom6mZlKahpJCap5mhtbqoqpiakI18gZSMoZSKlJGVkJCTl6WPnpmon5y2o52nrLenrsKuo7emr6+wraqqtLqir72Zkqajprajkp2mno2pn42Sn6Osr5qho7Gor5ekoJykqp6dnZyXq5ySmaGbk5CWqpmNmJiWkJaekYignZWUhZKMkIyUi4F+ZoyGdYZ2eYiDc5xqh5GUlJGKfYyWkpKYk6GSnJagg4eXhnlxlXJ5iX9xe39qbmRfcGlgW2BZbWJQYGNQWzpHR0Q9Mj09Ny4qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZcXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlaSno7CzrK6jqaetoKi1qpCPnKWzu6+srKGimXqdorCkpbGplpu4pqKUmamcjoaKiZuikK6eo5ann6GSl5ibrourlo+omaiMmKiPnrm2pKWYm42JeYGTjJqTipSRk5CNkZaijJ2eqJ6fuKR/hK+1orCvdKS+o7KgeHqgq7O8lXaupJ+KgKp+ZFxidp+OpJ6El35uk7Oco6iuq6JlnqCTc3mZlnCAmKiXbH+ip4llnKWbkJeYlouRm5GFnZqQlYKSh46OkomFeGuQh3aGcXyGgYBhaYiLlZOLW3aVkWdokI5yeqSYmGR5mIaBd5dpg4qCbnl/a3BlX3Zva2toW2ZjYmJvU1s+Tk5OUkc9QFRCOTEvHh8mNDozMTY2Nzg8Oz5AQUJGSEJHRklLTFNUVVlcX2hmZ1dRSjxERzs4VVJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJWmo6GwsayrqaWoraOnraSSlqu1r7Gmmqqmq5dzi5yvn6iqp5OWuKCgj5yknZF+iIiano2rmqOUp6KejpeRnoV1rpCIppqokZajiJu6tKegmZiLiXR2k42Vk4qUkJCUjI+ToI6an6aZnLKWgIyctZ20jJKPvaehfqeieqOvuIGOjqefhIuFj7Gpr4yJlqOaeYGLrIacnaKnqqiHlYaYd6WbeoebgZemgoF7nLF6ioWfl5mUmJaBkJaWhJmaY3mHkISOj5KLg25xkIh5gXGAgYZ/hnSHhZaSeJZok3SgmnR8mYOfnIaYfpGJgYKYao2MhGt4e3FwZ2R3bmlsa1tlamllclteSVRMUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj5ARElASUVKS0dSWFpZW2FhaGZaUUg5RUw7PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2Yo5+mrq6rqKygqLCnp6qlmZSuxr2woJWlqLWej4Ocq5ymoZ+NkL6emY2fmqCQfYWOmZeIq52ilZ+gkY2TiYaAkaiOh6Kco5OWnYafubKnnZqSjoVwdY+Ik5CKlI+Pm4uPkZ+Slp+klp6siJ+0ibSarovKiKuuibeFjbCDsa+EqY2nmI2dfKiPcnt3m46mlmiVpHm0i5+epqiSmcKBf6uImKFxnoCapH2XhZWxgaF8oJOfj5iXgI6Tm4mYkot8hZOGjZWTiYNtc5GGgHtyhoGFfYV0hYKXgY/FZoCph4+iap6DoJiBmX+Ki4OImG+MkoRnd3R7dmdodXBnZ2xeY25sZmxYaEdcUUwyRTQ2TWBjNiY0PERHRDo2NDY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQEpkWV1jZmhnYmJiYmRjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS5saqrppqUoKOkqqKVo6m2o69/oKecpZ6diZO8mZONoJGdkHmElpaRh6uZm5qZoYWPjHebnI+gkYiepJuVmJeGoritpZmbjIx/Ym2PipKPjZCMjJeLkJGfj5OfoZmhqH6hp4etnqCWro+fnZ2RhoGgjauvh6SNqpqMmn6jdoCYk2uBq3VNq3iHjZ2Rm6ingaqrfYOhe3qnaZ5/kmtnl4aXtoiefW1gY1iDl3+Me2Rni3OZfXmWbF18l25fU3GEXGBseYNgWWWCfYSBmHGnqmuDo25ypXCfg55oZJ9sWmyIemVZX4J+YVdQb3ZlbnRyampvXmpvbGtoV2lPXVdFOUE0R0NeazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl9idmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBjZGNhYmlrZGJkZGdkYmdlYWNomJadoLmhqqOmrJKhtryrrqKZl6Chpaysn5yttaOokqCfn6abmY6YtJmQi56MlYt1gZSRjYqmlpWXnp5/koWGrKSHnJGKmKiXmZqRh6WwpqKVmoiJf2huiIeKjo6Ji42Si5CSooyTnqCcoqV/k4GPo6GUoHeclpCng6GngIaqroWleYt9hJp9onBzk4eWe56MeW2Hm4yZkJuomo+HnXyConN2pmaefnekX5h6fJJzom6Yt7S6dJKHgYC2qGSBxrh7cJW3jHGAm6Rjc6yrYH1qnbN+bn2Hg46Ci5dxgKNsc6RznoN/pF6dmbOWb3uXnrN0cluesoJpYm90dXFob1hrbHJyZVxpXmJLRD1ENVFBWXEyPFJGX0pSPTwzOTU6OjZEOztASVA/VE1OUUBEX15bWlhgYHxkSEM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mayck6CNpLi1rq2gm6Kco6OkrJuasa2sk5egmKCkmZqTnqubi4iSeIuFcICWjYqPoJCTlJ2XfZCJjqihh5iPipGik5uajIuoqKSej5aGg31qeoZ/fY+MgouQkImPlKCClp2gnaCfi4l3nJiijKByoouIqYicp5GXqKt/rox9eqCZeqOTeIBzl4iMnH2Wn4abjZmbpoajZKF8iZaQm41snmiajW6amXp/iqd9cmdzqoOdgnOqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxep3Z1iYp/nmiadYeTkpiOf55umZBrpplcqH53u2p9qVqOhF2zZ1xucXl3a2lbcWl4eWNfZVdiQVBFTjdWQlJtNEpaWl9OWkNAMTUxOzs3SD86Q0dUP1lSWV0+RGJeVmBRYWR9aUVCOU5bXVhkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mVnImqtpuoiWOUm6y6srCsnaacnKefna2anbCoq52Xopmhn5iWlqCjmYaJjWmIgHF7l4iLlpaEkpWYj3qKhJajnYmUj4WLnZGcm4mPqKOgmYuQiX9/aYGGeX+Wi3qIjY6Hj5aaf5Oin6Cik5hyaJ+KoI+McJKMgqmImZ+jqaCofbCtpKK4l3ajs6Kjf4iUeJ16q5p+oo6dm5eIl3KhfIWNr7V9a5qRoXh+mLSjo6uohJh7mnycmX5zqlpdb3uXi3ieYk1/e3uFY3qXQk2fWaJqcnyObYGJhJl1m3mHibGzf3+akqZ0f51tcXyUb5lyaaNdlXZIZWNgc3B9fm5lYGxodnxkY2BRXlZdVFZAWUVRZ0RSV1tiWF5JRD1COEBCOklFOExEV0FWUVtWREZiXFpgS2BtfnJFQzxVX2JaZWpWZ2hsbmJmZl5hYVxdXmFoYl9lZHZsXmVnZmtkZmxoaGtpk52Bsa6ZhFNfoKezubOzqZqii5upnJuokqGrpKGoj56dnJqZlZihnZaHh4l3hYFueZWFkJqLfZGSlohygImSoJxykZCAiJiUn5qEjqicmpSKiol7g2uEhXGBoIt3hY2Ih5KZlXySpKGfo4iuhn21hI+enXumlnqpgpadkIuhnn6naHdtfplzoHNxfJ2FmG+Tgq59o4OmnpqBo3BeqWd1o2NvpWGc05B8epl4cnNjooWPfqJyoo51a4+zi2CCmIpzqrKovH93g21/v6aqtF6cb35xl2+Bc6JyXaNndKZhaKZtm9OYe4Obbnd5l2ubenaXcmyppWdfZXlwf4RrZ2ZkbXZ4aF9hUltlUVFiSVdJVF9XU1tlalxkUEZDS0xKS0JKRThQP1BNV1NYT1JSYGZlaVJkeHl3SUZFY11kWWhqVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJibf7CsVFxLfqmvsrWws6OcmIWYp6Cgo42kqKCYqYmZl5iTmZOSoJeNiIV7cH2EaH2PgpOagXeRjY6JcH+GkJOSbJeTfIiQkaOVg46qmpSSioWJeYN1iIBugp+Gd3+ShoiZopd5k6Kkmp+Js6Gitot6rKekrqVwqYCakIWBnJJ9pICimYaYcp6EoqyuiZeLgIykjZaDrqKUdrW2tcmhc5SKgJ9hnpepbXmVh5+adaGHd6B9kJaKgW9MZqKScJqIc6R7eXRhg4JsfqBscmRgnHJ/dJdpe2mztbTGpnOYfnudapubq3WCmm10d5dpmnl0mHFQRXyzXmp1aniHZmpnYnR0cW5WXlRZaFBSaElVTFhSVlxna25WZ1dNSkFKTUpISk5BUUpQZWNpbWV0cnN+eXtudYl7e1RQT21daFtraVJqaGlsZ2xnY2VfXF1cXmliZGhre19dZGdjamZvbWVpbWWinImvp4VmP5Shs6uvr7WiopCAl6iioqSMpaednKWCmZeWjZeQkJuSjYiDeWp5hmWDjH6XoHl1j4iMgWmEhZKDjIWdjXqMipSlkoKXqZeMkYuAiXl/fIt5cJChhnmAlYeJlqCWf5SlqJyWloRnbnicbKJkfHGld5yYcGengZeMe6V6oJaDl3KfdoCJlJaPuW6QiqJifZmilYhucmmranWgbG6mYJtpi5BoloealXWigH2aX4uFjHVviGJooWWef2mbdW9jZoiCbnKiWl9bZKFuXomMb3t/c3JkpW54omRnp2iYc4uYbqFvU4iPb6BeZKdUi11TmG1tcmpxgW1waGt4c2twUlhXV2ZZU21JWE9cSFhpaHNqWWtWUVJFVlxMWFJhVWhqXnd1enxwfHxyg3t/cnaNgIR2XlFzYWdicGdQamhoa2xuZ2RnX11eXWBrYmppdnVdXGNoY2pqc2xma21jnaWYpnpldG2Lp66lqrCxpp+LgJaqnJ6ljKKhmqKigJWYk42aj4uXkI2Ke4ZxgIhoi4t8l5pzdIp9kHtlg4eVioqVmYJ8iIWWpo+BoquQhZCKgYp9f3+Oc2mPpYR8hZONiJigjoiSqqeeiaZ4lpx+pYmWjLKYnpCDr5efpXiWiHqpdKWPhJpupaKMkoSMg7xufKWvgoaFhpSXnKB8pXpxqJSglmeefm+sY5aKlZJ3qGypooGJdoeCd6uRpohrkbBrdrOMqWuKhm5tn56SlWF/q4uqdoB/jaefd599haSVnaBpmod2rGeerYy2c3e+jKSTWYOmjathdXFzb3t0cWJqfm5obFNWW1VhYVxrTVxSXUldbW12YFtxWVtgWmdzZW5vcmNxdGB3e355cnmDc4R/gHt7jIGCgHZieGRjbnNkUmxnaG9scmlmaWFfXlxia2JsbHpvXFxiaWJsandtZ2xuYpWmqpyBgJ6klqmqnqinrqOZiYKXqpmepImapZ2pnYSLmo+FnJGFko2LjXSFeoiDb42EfZaTdHSGcpKCbX+MkoeGlI99e4GEl6SNf6WljYCNiYSUdYKHkm9si6mAg4uUjomcn4mNk6ukoJCAdZWXiH6BeZSuo3+Bm3GPhniQjIWAe3KnjHF9fXqXlpuEjnh7fn2IlJWTinaQmJ6gg3p9iWyMhVt5eXJ5cWhufpKJcX90gY+Uk3GFg4FljX9fgYCMd3VzlHVveW9uh22Ehl93aXiOZoGCho6qnH50fZdqiYhvgHZ8hXZtbGeMc3h7l3eEW2pYeI9obXdxcG93eG9dbIZuaWdWWmBXXGVrY1VhVV5RX3B3eWxqdmVqamp1fHFydHNhb3Vic3uBeHV5gnWAgH+AeIuFg317bX9sZHluXlduZ2h1a3hqaWpkXGBaY2plbHB1blpbYmtkbGx5bWhsb2GOlbqpp4uhopqmpJmknauioIODl6uRnaCJmqaaqJiCgZuLfpaUh46JiI1ygnyPfX6PhHqXjnRyg3CVhXt9kouGhpCFeH6AhpiijHunoYuFj4+ElYKGjpd3coWqho6SnJCInp6IjJuooKCrg4mOlZp+fomWraiPkqeQeHCekYN7k29+qYVwfZVxam98gZ+Lf5KOjGhtXYOLjJuano5zlYuIcXRrgnZzgFlyboeQgX1+i2ldaWN6hYOIgF9peHubfIOMg3aBhoJoeYuHa2Fxc4N3YHOMgomQp5WGZo2Pg252i4NwhY15b2VmY3mCepVaXGlmbnZbenl3dG1zcoJmXG2Ka2xiWVleWllscVtfYFleXWZ0fXt0b3Nja2tpe3xxe3h0ZG10aGx8fnV5fHt6en9/fm+GioR7fXN+eXN/aVRccWlsdW91Z2toZF1hWGtoa2pxcm1XW2VubGdzem9oam1gjIyrsaKQo6Gan56Ynpmpo6F9g5erjJ+Uh5uikKWVf3uXhHySmYiJhoaKcn2Ai3aFi4GElopxb4BymIaEfpKEg4aKgXqAg4qano+CpqCHeI2XiJWLi5yXhYN6rYKRmJmUip6dh4ihq6CioqOMiJObnKOZlqqhp6agkpuIl498eY+OhKh+f5KRkpOcsKWalJ2QjbKTmISmjIyUmp+JkJuCiZGKa3yOdndlgoaQinyJnYSHi4+HiICEg5B3fHp1mqKJh4uei4WUf36MgYF2cXSGhYB4iIeKkaaRhIaOiIONkIx8h4qIj4F2a4GDe3mZaXJoYHOKcH16dnVvd3SBXV5vh2huX19aXF1TaHFVY1tbYWxodXt8cm5wZGtqaH97bXh/cWlvcGxmgXtygYB4gH2AhHptg4yGfHp4fH56g3hOZHZrc21wemRrZWJiYFt0ZnBmcnFsVV1sdG1oeXpxZ2lrZY2InbqflqKhmJWZmJSYpKCde4CZqo2ejYWfnIqelnx5lIJ7jpmJhoOEhm14gYBygId+iJOEbWt+epeGhIOQfoCGhIZ9h4OMmpySh6qegnGKj4WSkYuckX2Ne6qEjZKXlY6cloaGm6egopqdhoOSmpmZkJqmoKadnZCXgZGKd32IjoWle3yPkJGGmKqhnZOcj42rjZGAnoyIkpmego6XfoaNgm94hXF0YH+Dj4Z1i5eAg4+ChoR+hYOUbnl1dJOii42FmoSEjXSAin18cnN7iIR7eYyOhJOnj4aEj4KDiomJdoWHiYt7bmt9f3ttaGtsZ155fmd8e3ZzdXV7d1xgcH1udWBjW1xeUWZtU2VaXWFraXZ6fnFrbGRrameAgGxzgGxsdG94boR5boaAdoKAfYR2cYKNiH57e3x/e4KKYGl7anVoaYJkamNgaVtjdWhvYnVtbFRicXllcHp6c2VqbW2Lip+4mqGjn5KSlpeLmp+enXt4nqWQm4mGpJSLmJl5eo2FfImRg4yCgYJtfH94coCFfYqQfGtofYGXiIGIjnx+hoSHfI+Aj5qbkYinnH9wi4qLkoagoYqFjHyokoiPkpeTlpJ3jaOhoZ6Wmn+BkJqZk4ybo6GkmpeRm3+OhHmAhI+HoYB+jI2PfJekoKCSmZCPpo2PgZuRiZKXm36Skn6GjYF1dIJwdmB9gI2GcoqVfIiLcox/goWGjmh3cXiMmJKPf5d+iIpzgod8fHF5eoyFenuSjYOWppOLhpF8hYaHhHWCg4iHeWRye354eXBsamZefXJofHV1c3xygGpeYHR2cHhkY1leXlJraFRkWF5hZ2p2eIFxZmtjbGhlgIBqbX5obnFrfXeGeWuLgXKBgX2BdHaCjYZ+fHt/gX1/j2pyg25zaWGHaGxiX3FVdG9tbmB4aG1XanR2Y3V7e3Jiam96iY2fspKlpZyOkJiPhp2gmpx8dqSgjZZ/jKKKiJqWeHuGh36DiX6IgoB/cH97dHWChX6JkHhnY32Gl4qCio14fYCMg3mWgJWXlYyWoJp9b4uBkJOGpZuHjImDppaFkoqVl5KRdpGeoaGYlJh6f46Yl46Wm52knpmTlJx6j4WDeIWXjZ5+gYqOjHOXop6hkpiOj6KMi4OWmIOSlpl+mI18iI2BdnF9bXpkgHyKhXCGk3+QgmyHgoF/iYRldW98h5KXjX2TeIuJfICHfHxyf3iKh3mFkYqLmKKVgoSMd4iEgoF2e4GJhXReeHd8c313ZmtkYH5panZzdHR9cXxjY2FzbnVzbWFZYF5bbGRSYldfYGhrdXmGcGJqY21laHyDbGh0aGxvaH98gnhtkIZxgIKCf3R8g4yBf356goN+fJBtdoh0dG1limxqYWN1VoNpcW5geWdsYmp2cGZ5fHpxYHJshoaQna6XpqiejY2Xh4agk5eYfXepnIqYeZeci4uYkHl8gIt9fIN7gIKAeHN4enN9gIR/iIuAZF59i5WHfoSHdH1+in99mISWk5aMo6GXfnKHe5ORiqaPjI6KkqCRg5GPlJeRioGPmKCakpCSdICNkpSJnZ2ep5iYjZWXdI2OimyGmJCZeoeIkIlvl52ao5OVio2fjIaBkpx/kpKVhpmIfImJgXpxeWp1bHt+i35uhZKClHdvgoN9fop/ZHJqe4CWl4R/jXSQiYN5h352eIB9hoF9hI6FjJSkkHmFg3SJh31/c3WAh4NtYHp1eXB7b2FuYmR7YW5vdnJ3d3N0YnZgb2x1bm9dW15dXmpeT11XYmFobXN6iWtfaWVqY2h3iG1mbGhqbWiAfHp3bpCHc4CDhH10gYaJeoJ9eoGEfXyOcnqKeHhubIdraF9pcmOHaHFvZXdobmxhemhrfXt4cGF3bYuBmZqqoKSonYqKkYaKnoqVl312rZiMln2ek5GWk4h3fnuKfHuAdnd/gHB0c3pvhX2BgIp+fGBcfo+Rhn+DhHN6gIZ6j5GHkZGbkqSblIF9gHyNipKkiI2KjZeajYWRmJOVjomJjJOdk5CMjW6EkI+RiZ6ZoqGXlomXkm+JmYRnhpqPlHqJhZCKcJaalKGSkoiLmYyCf5CefJKPkouZjnuKhId0c3VrcW51fIt0boWQjpJxdIB7gYGIfGRxbHl9mZR9hIh0kIuBdIh5bn99gId9hY2KhY2VqI17iH1+i4V3fXBvgIWDY2h3c3RuemJeb2BqdF5wanp4eGxycGV5XW1sc21zWFpeX2FqWlBXWGRjZ3Fxf4dmXWloZ2JncY5vZGlnZWpogHp3dG6OhXOAgYJ7dYKIhXeFfHiEhXqAiXd/i3t6cnmDamtfcGh0f2txbm1xZ29sZXtiboB5dnFsd3eKf6OYoqihppuHjIqBj52Gk5x0gKmUkYyGoIyVk5B/dHt2hXh4f3Jze4Vrcm95bYl2gICGbnFbWX6RjYiAgIB2dYB/f6CGj4qRnJegk5d3iX6AjIicnYmPhpKXlYSIlJmPlouLjY6NnYqOkIRuiYuPkYqclqGbmJWFmIhrhaODZ4adipF/i4SLgXeTmJGekZCIiZWNf36Pl3yRjY+NmpJ8in+CbnZva21vcHuFaXODjpeKcHd/dIKJgnhmc292gZmOfImEepSReneIdHCIe4aMe4uHhImPnKOIfIR3gouAeHhuaoCCgV1ycnBvb3daXnBgb2peb2l8eXBtbWptdmBwb2tybVlYYWFiblhRU1llZmN1cISCYl1qbWRiZmuSbWBmZl9oa4F1cnJwi4B0f4KAeHaAi4B4hX93h4Z3g4R7hox/e3aKf2pxY3xihnxvcGx0amhvbHZ3X3F/eXt0dXSAgn+llZqtn6eWhY2Df5eVg4+fdYqfk5KFipqMlY2LenJ4dIJwcoVzcXWIbG9tdW2Id4N9f21uVVGBq5SHgniAdnKCeYKggZGBk5KXm5GaeJF6goySpJqTjoiVmJKEhpaZjJOLiY+PiJ6FkIp8c4uFiY+InJmfm5aUgJR/aYaciGiHoYiShJGDiXGDkZePmo2PjIuPjXd7kpB6jouMkZaMfIh8gGt2am1ra2x6fmF5fo6VgXZ6gHeDjXx5Z3RsdIeVi3+IhnuUkHF6hHB3jHqKjHuJfoOMkZ+dhXx9eIKLfXZwaWuBgnlfd25sa3FyVV1uYnFgX21ueXBncGZnc3VocGthd2VdVmZgYHJTUE5cZmVdeHCIfF9daHJiYmVmkmpfaGRbZ3B+cGtxc4p9dnyFgHR1f4x5e4aBeIiCc4aEfoyMhHt5lXdmcmqDYId+b29remBqbnR/dF90fXmGeHRzhXx4oI+ZsJylj4KKf4OaiICLnn+KmZOOhIiXjY6PhHZ0dnOAcG+Fc3Bxg29qaXZtgm59fG11c1JOgt/JktaTfHB0gnWDoIKSd5SQmJuPmHuTcoWQn6GTk5CKkpuUhn6WlYiNjYiRjYicgI6BeHqMfoiMipybnZuVk3mNd2iJkodsiaSFk4iXg4ZjjJGYjpSKloyNiotxe5SJeo2IipKRiXmFe35se2Vyb2preXlbgHmPjoB6fX5/ho56emhza3OLj4qChYV9lYxsfn9vgIx/jIh9hHqCkJaam4t8d3iDkHlzbWZwf4NsaXRuZ2hzbVNebmRwWV9rcXdma2piZnhzb3BjX3dgYFZrX152UE5MYGZjXXlxiXRcW2V2YGFlZY5jYWZhWGlzc25rcXaLfHR6hoF1dn6Lc3+Gf3qIfnKJh4GRioh8fph2ZXNufGWHfm5wa4BabG55eXNgdnp7jXZyd4p3eZ+Lm66boJCChXeIlX99iZyHhZ+RjoWMl4STjoeBdXdweXFuhG9tbn5yZGR4cHxten1qaGxjpJrB3K7voXNrdYN1hKGFkW6Vj5SflJuBkXCFi6OXiY6VipCdloOAlZCFiY+AkoqKl3+He3V/iXiGhI2bmpiZjpB2i3dvh4mLfYukhZKJnYWFXouUl4qOiY6LioSJbHyWgX2IhYmQj4Z2hX19a31kd3VqbXhzV4h6kYaFen5/gIWMfnllc2p/io6Kg4J/jJaFa4J1boiRgpGFf4J6gJGWlJmQdHR4iI11dHFndXmCYnRtb2FodWZSYHBna1VfbnR5YHJjX2h9cXJtWmJyYWJXbllcd01NTGNmYV52c4ptW1xkeV5gZGaEX2NjXlhqcmtua3J3i31zd4SBeHd7iXGDhH1+iHt0i4mIloaMfn6Yc2h1cXlti3pudHCBWHF6dnlxZHd5hoxpdoCJcn+ch5innKOShH1wjJR4eYudhIWhjY58lYx/moiEe3J3cHNqb4FraWx8dF5geHZ7cHV7Z2BlfOvatcnD3IhzbHOAdomaiI1pl4+OnJSSgYhwhYigjoSLlYqNmJR8jZOIg4mPe5GLhpCCf3Z4g4Ryh4KSm5aUmIaMdod/cYWCiYeZooOUjJ6DiWGDlY6GiYaJjYeAh2l9lH99g4SJjo2CcYZ+f3F3aHVyaXN3a1qMfZKBhXx/g4CEioJ2YnRsiIGPi4J+f5KRfW6CbHmGj4aThH2BfYCSk5GXiW5yeoyGdWxxa3J4gF90aW5canVgUmRxaGZTX3B2dGBvYF1ognFyaVdnaGNpWG1XW3VMSkxlZl5icnOFaFtcZXleXmRnemFkX1xZa25lb2p0d4p+c3OBfnp2eohzhYN8f4d2d4qGj5iBjYJ7k3Zsd3V5eZN0bnh6fVh5hXGAb2d4d5KCZHaGhXGKloWZoZuiioZzb5KLcneOnH2KmoiJe59/g5l/gXhxc25vZHJ+aGZsd3dbX3l7enFxf2lhZ2F/1baOkKZ4bnF3e3CSkIyHapiNiJuRi4Z7aIeLmYaBkpGGh5iNfI2NgYGKjXyQjH6KhXp1e4J6cYaAlZmOk5SCiXWEh3eEgIuTnZ+Glo+ffohhf5OHhIiEiY1/f4NnfZB/fn+Ci4+Qfm2CfIJ0a212dHN2dWtjjYGOf4V+fIR/hIh/cF9zcYV8j42CfH+SiXpxg2Z6g4qHjIN8hX6AlY+Rk4RucHmMf3Vtbmpren1iaGppWGt1WlJpcmliUGJyeGxhZV1aaoNtc2JbZ19kbF9uVFpvTkhPZmRcZ25xgGxaW2NyX1xjbHdkZV1cWmxsYm1pc3aGf3Fuf3x8dHiGeIWCfICHdXmJgZKWfImGdomBb3h5e4STcG17gXdeg390gW1penOUc2dyiH1ykpGDmp+boIaHdnaUf212k5d9h5CDio2ZfIuadn12cW9samF0fGdiaXV6Wl94fHptcX5lY2hoV52PXnFylrzDg3VxlIiQfnKWi4abkoyHcmqIj5aAe5SMgYSbjHyKhn18iYx/lIh1ioZ2dn2BcXWGgZ6UhZSPg4NygIh1hXyJmJ2Yh5SOnYCIZn2Tgn+Fg4mJcoF9Z36Le3h+f4eLjnxpgHyDdmVveHhzdnNsao2FioGKf3iBgISDf2tecnh6fo2KhXuCj4B+coBpeYOHi4aEeYR8gZiNkIx9bm17iX13dG5oZ3x2Y1xxYlduclNTbnNoYU1mdHhlYF1cWG6Ab3NZZWFeam1gcE9Za1FEU2dgWmtubXxuWltebGNaYm93ZGdcXWBsamNraXN2gYNwbX58f3R1g3uDgnyChXZ+iYGWkXiDinSBiHJ5eH6NkG9vfIFxaYF5en5tbHx2lWtqd4R0bJSNhZ6YoJmFiG59jHZqeJiOfoGKgpWXiXmOlm96c3BsamRgdHtoX2Vxelphcn15Z3F6YWVlj7Gyd0piWqTZ0JZxe5CKkHd9lIuEmZGMhW5rhZKSenmShoGEmIp8h394eImKhJaAcIyIcXR9eml5hYOlkISTjYN/b3+Dd4R5hZuZlIuTkJSFh3B7koJ9goOJg26BeGiAhHhyf3+DioZ7ZX1+hHVjcHJ/aHhwb3WYjYaCint2eICEeYFrXHF9coGIhYl9hol6iHKBbnGEh46EhXOEeYGZjY2EeG5vfoSAd3plaGp8cF9Zd1pYcGxOV3FzZ2BKbHZ0YF1bW1l0fXJvV2ddZmpxX25OV2hRP1lmXlpva2d5cVpaWWtlWWNxeV9oXF5lbWhla2hxd3+Hbmt/foB1b4J7gIF+g392gYWJl4pxgo1xe4Z8eXmEk4x1anp/bG9+dH99b3J7e5RvboF/eGaTioOhmZySgoZnh4NvaHqViH1/hIGYiYF8jYxpeHJrbGZfYW94bV9ib3hcZGyDemFxdl9lZdTqvooyOj6LjoBxeYWHjo12g5aMfpKNjH9tbIWMi3V9j3+FgpWJfIN4bnaHhIOXd2+IhWt1e3RmeYKDp4uCj4uEfW6AdXeDeYackIyQkZKMi4Z+e5KGd3+EjYNsf3JogH54bXx7gYqDd2F5hIFxZHFofm10cXSBm4uAf4V+cnV9gHOBcFttfnR4ioOLe4eAfIh4enFsiIOPhItygnqAl4uLf3Rua3eAgHV1XGlod3BYVntTWW9kTFpycmVbSXB3blxaWllddX50aFliW2dlbmNpTFdmUT1eZVxddWVfdHBaWVRvZFlkcXlaaF5gZ21naWxpcHd9jmxpgoR+eW6AfHyBf4J6dYKBjZOFcICLbnh+gHt7iJKJf2h7fmt0e3KGe3N3fX+MeXiEfXxrjI2Em52WjIGAbI5+a2h+jYx6fn+DlIF+fYqIa3VxZ2hjW2Jncm5gYWtzYWhwiXpic3ReY2SboI9uXDVZr7V0aYCIfJKGdoWWhXOPi4l2cG2FgoZ0eYl4iXySiHp/c2d2iX5+mG9xhn5odnltZXmIhKSHgIeNiX5ufnaAgXyMmYeCk5CYiYuEiXyPiHB7fYR7aH5saoB7eml6doGHgXJgd4F+cWRyZnWCbXV7hJSRgXyBf253eXx0f21Yb392dIyChneIdoKJenhzbomBj4GFc399f5OJiXpubmpugoJ1bl1nZnNxUVp6TVpvXE5bcnBkVUtzeGlXWVlaYXGAdGBdXWBmZGhpZk5ZaE1AYWRbYHVhXHRtWFdTdGFaZG9yV2peYmhrZ21saXB3fJJsaYSJfHxwfn57gX+CeneAf4qLg3F7h29xd4N/e4mNj4Nqfntud3l3ind9eICCh3+Dfn56bYWMiJijjYSDe3WLeWtshIiQeH17gZF/f36Kg3BycGNmXllnX29wYGBncGZqb4l0YXRvW2FkanZ7f76cpqPIuHGFg3OTfHiGk4JzkIyIcnJwhHuCc3WHdIh3k4h5eXFjd4d6gJNpcoR2Znd2Y2p8g4eegX9/jo99cn90hXmAkZCCeJaNlI+Igoh7iIlreHl+dWd6aGx/eXNpenaAgn1oYHeHfWprdGd7gGl2gIuQlH56fn5we3Z7dH5iVnd9cnOKhIJ8g3GGind4cHCDgo1/fXl+fXaOhoN2aXFpbYiCcnBdaGNzbkpkdUtdblVTWXNuYlFPc3hgUlhYXGFvgnNbYVxoZWVjamRRWnBJRGNhWmNwXl13aFVWVXdeW2VuaFZrXmFqZ2Vvb2hwdnqSbmmIjHl9cnt+eYKBgXx2fYOIhoNwd4NybnaCg32Ji5N/cIB8eHl6gYx0g3h/gYGChHqAdW9+ioubnoh9hXp3hntndIWLkHp+f3uIhYR2j4Bnb25fZFxYZVltcmBgYHBsa2iJbmBzaVleZG2Ad6naqceGh7JxiXhvjHV7ho6AepOJgHV0dX53f29xf22EdJSGeHRrYHqCeYiPZnGDb2d2blttfYGQlH+AeZGSfXl7bYd2gJCLhHSWipGOh4WFe3+FbHR2f21ndmVte3VtanZ3f398YGJ4hXlodHVifXtndIaOjJV7dH91cYB6fG1/WVZ0fm91hId/gHlsiIZ0eGt1f4OEfXt9eXtzi4F9c2d0ZW6LhG1zW2pfdWRIbm5MWmFXVlV4bWJQUnR2V1BVWF5hcYRvXGBjbWRkXm5iVFxyR0JmX11maF1aemJRVVx1W1tna2FWal9gbmZma3FocHV4jnRrjox1f3Z4fXeBg4F7c32DiIeDb3F/dHF1foWBiY2Ke3d/eIN8fIaHeId8fYF+hIB7fnN2eYyOoI2Jeol2dIN5Xn2FmIx5hoN0hYaEd4l7Ym5sW2JbW2FWanNjYFtnbm9mh3FhcWZXXGNrf3zKzoe5oWptbYpscYRxfIOJfnuRhXp5c3l1dXtqbHVjhHWRgndvZl59gnqLiWVygmtqcWNYbHuGm4iCgXOXlHd/fG2IcYGKi4dxl46QiIWLg3t5fnFxcH1maHFibXhxamtxd3x8eVxkeYB3aXV4ZoF2Z3SHi42UfHGGaW9+gHlufF1Ycn9tdICLfIJvb4l/cXZod3+Bf4F2fXJ7dYd8enJmc2FujIJsclhrX3dbSW5rTVVUXlRVe2thT1R1clBRVFZeYnSFaVxga2pmY1luYVhicEdBaFxgZl9dVXtdT1VkcFpbamhdV2hgX3Jma2hyZ3Byd4Z4bpWKdH96eH54g4d/dXJ/hoWNgnBwe3h3dXqGhYaMhXp8f3WLfn2GhISHf35+fYd/fHh2eXiRk6B/jH2LbXaAeWODhpaFc5GKb4WFgXqDdGNuallfW11dVGdzZWBZZHFyZoFzYmtlV1tgaX94vq57oLdtYnOGaHN7cXmChXt9jH93eHJ2b3t2ZWpuYId1joFzamJefnh5i4RmcX5oamtaVm93iqOBhH9xmZNxgXl0gm2AgpGHc5WIjIiEiYV9eHRybmh5YGptYG12amdqa3l3endbZ318eGVyfW2EdGV1hYyFlX9vi2ZreoN1bXRiXG98a3V8i3yBZnWHfW1xZ3V+eH5/cn1se3uBenhwZmxibol+bW1Wa2B3VUpqa09RTmhNWXxoYk5VdWpMUFRVXmZ1g2ZdYHBoZ2FXaV1ba2hKRWtaYWRXWVV5WU5WbWpZXWxlXFplY150Zm1kcWdyb3WBeHCZhXZ/fnd/fIWHfXVzgoiAlYJuc3h6enNzhYaIiIN4gX12j398hIqOhIKEe36Lg3t3fHd3mp2XeoqChml3fXxsg4STf3KPgnCFgn6Bf29mbGdXXVtcW1RkcGRfV2JydWl1cGVlYldcXGh/cG9ygHOJZGR4fml0dXNzgoR4gIR5dnN1bmt6cGFna2eGdI2DbmZdX31we4l+aW13ZmlkVVZyb42mfIR7dpaQdHxzfHpte3uQhXaYfIeGgoaDfHRwcmxndFxsaF5sdGRnZml6b3tyWWeAdnVncIB3gXVid4SKfJSAbotqbXqBcWZzZWBtemdzd4p8fmJ1g3Zpa3F0enB6eXN+Zn5/f3l3bmRmYm6GfG1rVmpicFNLaGpPS05wR157ZmFNVXRjSk5TV2Fqdn5lXGdzaWVgVmNXYnBdTEtrWGNiVVVVc1ZMWHVkWl9rYVxaY2Vfd2ZtYnBpc25yf3V0moF3f4B3f36FhXp8dYKEfpeFbnJ0fHp0cYSFj4GAeYt1dJF/fIGVjoCFhH1+jIZ7foB2e6OlinmIhoRrdXx6dYOCi3luhXN5hH2Bg3VuamhlVl1bWlpTYm5kW1hhc3tpaG1pYGJXX1tqgGlrb4Bna2FoeXhqc3R0boSBen99dXVuemhqeWpfZW5ogXaPhGdlWGJ3aX6He29pb2dmXVVYb2eOqHeBenyQjnl1b35vcnV5j4B3lXSFgn+Fh3VqcnZnaG5bbGRdbXNfZ2FqeGh7bVptgnJzaW+Afnl3YHeEhHePhHKIcW95gHJjcWlcb3dkcXSIfHhic4BwZ2p4c3JseHd1eGSDe394dnBkY2NufH1rbFVpYmZTS2tnT0dSa0VheGdhTVNxXEpNVFlla3d7ZV5tcWlkXVZgVW5uV0tTaFdmXlhOVWxUSlx5X1tfa11dW2NlYHpobGFvb3Vub3h1eph9d4CBeoB/h4Z6eXqDfoGThHF0dH95dnSFiJB9gHyQa3OVgHuCn4V+h32Af4aCgIp7doSsn396iIiDa3KBeXWAgIFzboZufH9ziYBqb21kZFhfWllaVWJqZ1taXnWCaV5tbFxhVlxcbIFlcXR9aWlda3Z2Z3R3cm2Fe319eXVybHloaXhmXWRzaHp3koFjY1RlcGeChXd3ZmhqYFdWWWdjj6dufneAi456cHB8Znhveo18do5xhH1+f4ZuZHZzZGhoXGtiXW9vW2dfbXVkemhddIBvcmtxe311dWF0hYp6h4eAf3dydX91YXBtWXF0YnFyhXx1ZHJ/bGFsem9qaXt5dnJmhXZ7enVxZWFlbXN+aWxUaV5dVEtyYlBGVmFHYnZnYUtUb1dKTFdYZ2t2emRlbnFmY1pXXVl2ZVVKXGNXaFhZSVdlUUhieFpdX2xbXlxhZF5/aWpgb3R4bm9udoOXeXKBgHx/iIuGfnV1hnmHjH1zdXWCeXp6goyOfX6EiWlzloF6ip19foV6gXp/fIaIc3GProx7e4ePfWVxh3lzfHx1cW6FbHt+bI96YnBvYmVdZVZZWVZjZmtgXVxzhWhYcG5aXldaXGx7YnB2dmxiW2xzc2d1dXBshHl+gHl3bm50ZWl0ZVtndWZ2dpF6X11SZmZrg4J0fWJjaVxUWF1iY4+laHh0goWQeG1ueWd3bXyFe3WIcoB4fHh/aGV2bWBmYF5qX11za1llXW9vYnplW3d7a25ub3d4c3RkcoOSfoeCiHp2b3J9c2J4ZFtvcGFxcYJ8c2ZxgGRebnZpZGd5e3Vub4J1dH1zcWJfZm5vfWRqU2hYWVRNd19RSllYSGJ1ZGFJVG1TSkxaV2lscXtibGxzY2FZWVthdltTTGNdWGlTV0hZYU5HaXVYXmFtW1tfYmJdhWhoYW54eWxvanaBkHhtgn6AgZKIhIF2dIl0jIZzcXd1gnd8fX6Mj4B+k35wd5WDfJmSeYCAeHl+f3SIg3NwmaJ7en+JlHhkdYh4c3h1a3Nufmx5fHCRcl5wb2BnYmxUW1pXaGNtZlxccYllU3JuW1pYWGBsdmNpdWpqXlptc3Fsc3NzaoV8fn98dm5ubGRpcWNbanJkdHaOc1tXU2VhcoB/coJdYmNdU1pgW2ORnmVycYWEkXRsanptb3B7fHxxgHd/cnp5eWRldWhdYlpgZ1tedmhXYl1waGF3YFt7dmppcm53c3J0aHCBlIKGfoR2cmpwfW1md1dca21icXOBenNmb35bYG9xYl9qcX5sbHV+c3F4a3BhXGVsbHphZ1NnVVdSUHVbUU9ZUkljdGJgR1VqUElQWlVra2t8ZW1vcWFbWlhZbHBXU09mV1dpU1RGWlxPSHJ1WF9jbWNYYGBhXYtqY2RteXhrb2l1eYZ7a4N9f4SZfIKEeX2Ibo+GcW93en10goJ8i4+Dgpd0d4KThYGfiXWAgIFzf4Jxh4J1b6KXdHuGi4Z7ZXeKbm57b2Z3cHpsc3ZyjGtedG5hZ2VrUl1bVWdhbGxaXHCMZE9vbl1WWFVnanRnYnRlZV1ZbnRucHV1eWuHfH98iHaPc2Rka25hXG5tY3N4h2taVFZjZHh9fXGFXGNfY1RaYFljlZVjbnCDhYpzamh7b2Zzd3N8bHp0dW95fnVeZnJjW15WYWRZYXRlVV9gbWRhcV1dfnBoaXNxc3B0dWpthJOBiHuFcXJmbn1wcm9UW2ZqZnF0gXdzYmx2VWJxaltfb2Z9Zm13fXNzc2ptYFpkamp3XmZUZFVWUFRtV1FWU1BIZHNfYUZYaU5IV1RWbWhkfGlreGtiV1xVW3RkU1JXaFFZZlRTSFpaUE14d1tfZWxpWWJgXl6PbmJma3l1bm9odnZ/f2yDf32Gl3t/iIGKfmuTiHJndIB7dYCDfYiOf4uTcnyKkYWHn4Z7f4aMc4GGc32Ddm6ljHOBjYt2d216jGBkfHBmeHJ5bG1xdoJnZHtsY2ZnaFNfXlVnX2xvW15ujWhOaW1gVFZTb2dzbGZ3ZGVdWHB0bHJ6d3JtiHt/dpx6eWthZWxtXmBvamVweH5nWlZYYGx4fHtwg19iXmdWWF9XZJuIYmtxgYd9d2treW1cd3Fseml2c25ve4ByWGpuX1ldVWJjWGRxYlNeYWhiYmxaYH5sZmtzdW5td3ZraIWLfoh6iG1xZXB9bXJtY1lhaGlvdIF0cl5pbFJlcWRUYm5iemNxd3t2a3Bta19YYWdodFxlVmFWU05YZVJPXE9PSGVwXWNGWWlNSV9LWG1kX3hobn5kYFReVF11XFRTYGZOXWFUU0pcWVBZdXZdX2ZtaFhjYVtejnBjZ2p3cXNuZ3Z0eoNygYJ5iI1+fIqIjnpukIp0bHOCdH9/iIWGkYSVj3l+jI+HkZuEgHyMhHKAgXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2NjY2NjY6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjI2MjI2MjY2NjY2Njo6Pj4+Ojo6NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPi4xMTExL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCTqWvra2trrB/a25ubm5xSiwwMC8vLEmFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI8tGh0dHRwaaIWCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTNBqba0tLS0t3xlaGdnZ2s9Gh0dHBwYO4OBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmHh4iIiIeOkJCQkJCQjIeHh4eGh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaPkJCQkJCRi4qKioqJioaDg4OCgoKEioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkZKRiYeOipCSk5CKkY6OjoWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyLi4yMjIyNjY2NjY2NjY6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoeKiYmOiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCPhouNiZCJi4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkI+JiIyJj4eNj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4aJjIiNho+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiY2Ni42Ljo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fH1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fn9/fn59fX9/f39+fn+AgIB/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJSUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJWVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f35+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9+fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyNjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt9fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhJR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHV2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2hoZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN2eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1LS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUVZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0pISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUVAPjo7Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs7PDxITD09QUE/QkM9QURERkNGRkRHSUhDP0A/QEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgICAf4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs9Ozc4Ozw+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1c3F0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5Nzo6QD84Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09Pz8+PT1qaT49PT08PDw8Ozw6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEtJSUlJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQj89P0JERD8+PT4+QEA8SnhzTD1DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0ZFSj88O1JvbWdleHNIODw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUdISEhKSUpLSkpOTElJX3BxcnJydHV2ent9fXx+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIF2TU5OTU5OTExOUE5MPkE8PD0/PkJDPz9BQUFCQE16Yz1XgYWGhoJ5ckY4ODg6Oz0/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISEpKSkxKRkZncG9xcXR2dXd7fH19fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXtOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkM/Vnd7Z32DgoN+gn52Rz09Pz49PkNEPzs8PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcG9xdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkVDRUBXdXR/gX2Cg3mBhXJEQEBDQEA/QEA+PTw9QUVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQE50cn59eIKFgYOGXz1DQ0VAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTUpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWZ3gIGBhIWHhoiES0NFRENXdYaJin5YR0hKTExOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIRkhJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHWHOBhIWFg4WIiI1lP0FWdIeJh4eGh4JXSUxNTE1NTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExKWIKFhoSBgoaIinxUbIWHhoaGh4eHh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUtJSUdISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpjhoaGg4GDgoSEg4OFhYSEhYaGh4eGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSmyHhoSBg4aAgYKDg4SFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QDs5OTk9PT48PD1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaIaDgX+Ag4SEhIODhIaJiouLi4qJiouMiVQ6ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzU4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0VyhYCAgYKDg4SDg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6OTo6Ojw4OTg5Nzc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT1BSV2txcnR0dXd5e3t7fH1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I5RoCEgIOEhYSEhISGiYqKiIeHiImKioyKiYmMej45ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8Ozk6PDg6Ojs6OTk5PD88PUFCRElKTUtKS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7Pz1UhYOCg4WGhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUFCPkBCQEA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEBAPz9BPT48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhxcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUJBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQl2Hg4OFhoWFhIaJiYiIhoaGh4iJiouLioqKi4qLXj5ER0lLSklGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURFRUFGRUZFRkZEQEI/PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6e319fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFARERFYYeDg4WFhoaGiImJiIeGhoaHiYqKi4yNjIyLioqIV0hMTU1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E/QkNISEpfhYKDhYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlJSEpGREdISElFRUhGRkVMTE1JSkdHSElKT01OTExNS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/f359fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4ODw7PD06P0A+QEBDRkpKUGeDg4WEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSEdFSkhESkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVbnF1dnd5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0dCPzg/QDg6PDg9Pjs9QT4/QEVJS01Wc4ODhISFhYaHiIiIiIiHhoiIiIiIiYyMi4yMi4uLi4teUVFQTU5NS0pHRkNHSkdMSkZLT0xLSkpNTUxPUE5ISUtMT1FQUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkBCQlxvcnd4eXp5eXl6ent8fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBSExNUVd5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVVJSVFJPTEtKRUVGS09OT1dWUVBPUVNSTVNUT01TTFBTVVdSU1FQTEtNTU1LTkdHSkZGSEpEREVFQkRDY3B1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQ0ZWTkZPUVFVWXyGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOzpRU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FQTlJQUFBRS0xLR0hJSEVGSUhJSElqcnZ5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f4CAgICAf39/gIB/f39+flRISklJR0dGRT8/QUFFQkNHRURFTFhSTVRWVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A+QFZVWVxkYFZZYnJeXVZdWlZFUVlaW1lfVFlnUlVWWFVUVlRPT01KTEpJSUxNS09NU29zdnh5eHd5eXp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3lucFhaW1pSU1JWVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVxdWVhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH+AgICAgH9/f4CAf4B4eX1ZTktJSUlGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWFNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaW1hcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm5ydHd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlVTVF5aWFdXV3prWFpcXF5TUFBQSU5PV1ZYWlpkcXN2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3F5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUFFNS1JUUk1PWVFNTlFTVVVNUVNSUE5MTEhDSUhSVFVaXG1ydnZ1c3N3e3p6e3t9e319fX59fX1+fX5/f3+AgIB/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUUxJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5DQ0NDQj9EUEJEQEM+QkhHVkBITk1HXWlQSEZPRkRFRkhHSEJDSEdISkdDQkFEQE9QTVJkc3V2dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWViXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz4+Ojs+QEA/Pz5rUEthRUZISUVCP0dMTkdNUVVJQkU/Pjw9PD09Pz0/QUNCPz48PUI+Sk1GVW51dXVzdHZ4e3x6fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqamZgW1FSWlxZXklKUFFOS0xRUlFUVlRXUVFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXp4enx8eHd4ZEJAQEE9OkJDQUFEQltcT3tOT09OS0xNT09RTEtMV01IR0BBPDk3NzU5OT07Ozs4OTg5PztBSD9cdHV1dnV2d3l8fHx9fHx9fX1+fH59fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eYGVgXV5xdmteYGdrd29vbGpvbm5sZmJZR0ZGSEJBRklFRUZETFFPYVdSWFFQU1NSVVtPT1FWUE1KQ0Y+Ojk2NDg2OTc5OjM2Njc5NjxCPWZ0dXZ3d3l5e319fHx7fH19fn57fn59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01MVFRTUVFVT0xSU1RXWFRUWFJMWFlaVlhYVlhZXVdXWGhza11WYXNrYWFfXWRgX15ZVVBNT05MSUhKS0lIRkNQT1NaV1RUTVFTWVNcZVVPU1RSTktJSEM/QTk5ODg5Nzg4NDc1Nzg1ODlHbnN1eHh6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZX1tWWTtEVVdUW2ZKTFBSUk9NTU5OTkxKRlBQVVlTVE5KTk9VU1RcVlJVU1JOTUxJSEhGPz89Ojc4NzY1OTk2NzY2NVdxcXR3eXp7fH19fX58fX18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG9mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9KSE9QT09NUkpPUFBQTk5PVExNSVBPU1RVMjxYTUlBUT1jYFFTUVBOUFFQTk5NUE5UUlBSTUlMS09RUFFSU1RRUk9MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVCRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjNAPmpvYVJSUUBGVFFQUVBRTlFPUE9MSkxMT1BOTlBRUU5RT0pMTU1LR0VFREI7PT08OT1HNjY3N0RucXV3enx7fHx9fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MRUdDT1JDOEVOU11nU1FTQUdVUE9RUVBNTU5MSkxLTE5PT1FNT05NSU1MSUtMTEtHRkZFRDxBQT47QEU7PDg5VHFydXl7e3t9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtucW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E/PD1BQEI9PkVIR0RGRklHS0pARkFBQEZIRUpPSFFSYVxRUFJOU09PT0xMT01LTUxNT05bV0tNUU9ISkhDSUtNTEpGRkZFP0JDPjxCRj9CP0FkcXV4e3p7e3x7enp3fHd5fX57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj47PkFAQD5BRElFQ0hHSUdJRUJCPz48Q0FBR0lETU9hZVFNT05XS0xNS0xNTUxMS05OU2RNSkxSSUlJRUFIS01NTktHSUZCQUJAP0VGRUhES29wd3p5eXt7ent6d3R4dXh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPSEtFP0I9OTk5Oj9CPzxBQkJBRERHS0ZESUlHR0hDQz9CPz9AQT5DRUNLTlFUTEpJTVRGSUlKTEpLS0lJTE1PUFJQS0dDS0dDQkpKTE1PTklKSUdDQ0NESUpNTElac214eXh6e3t5fHZycHVydHl5dnhqcW9rbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxanFoZXFIS0NGSEhHSktJSktER0I9Pj06Ojo7QUI/PUJDQ0NIRkpMSkVJSUZHR0NDO0FAQj5AQENFQ0lNUEdIS0ZIS0RISUtNSEpMSEhKTEtNXVJJSERNRkJFS0tOTVBOS01KS0ZHR0pNTlFOTGNuaXd2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkb0ZLQ0ZFR0RFRUZFR0JDQD48PTo7OjpAREA+QkNFRUlGSkpMRklJR0ZGQ0I7QkNDPj9DQ0NFR0xOSEtOSERIRUlNTk1HSUxHRUZJSUxOS0pIRU5IQ0dNTE5NUE1OTk1MSUhKT1JRUk5SZmdmcm9zeHV7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lDRUZFQkNCRUBEQj4/Pjo7Oz06PT9DQT9BQ0ZHSkdJSUxIR0dHRkVDQD1FRUI+QUNDQ0VHSElHTVBJRkZHS05PS0ZISUZFRERJSUhLSUdIUEtESk1MUE5QTk9PTkpKSU1SVVRST1dkYWFtZ3Byb3N5emdlaGhjaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NCQUJEPUJBPkE9Ojo9Pzo+P0BCP0BCRUdKRkpHSUhGRkdFQ0JBQUZGQ0JCQkRFREdHSEZMUUxJT0pKTEtJR0hFRkVEQ0lISEtKSEtSTUNPT05RUFBPTk9PTEtLUFVXVlVTWGBeXWlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNxcmtrc01GRkVIQkJBREQ8QUFAQzw4OT0+Oj88P0I/QEBERkhFSEZGR0ZFRURDRUNESUZDRkVCRUdFRUZHRUpNS0hRTUpLSEhJRUZJSEVDSUlKS01LUFNORFFTUVFST1BNTlBNTE5TV1ZXWFZYXltdZGBoYmppZ2tfZWVnY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUhHR0hCQkJGRTxAQ0JEPDc6PT47PjpAQj4/P0NFRkRGRERHRUNFQ0RFRkdKRUVJR0NHSEZIRkVDRkpKR01KTEtJSkxGSUhLSEVLS0xNTk9TVE9JU1VUUVRQUU1OUU5NUVdaVlpZVlpeWlhhYGBgXmhlY2BkZWhnamhoamZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dnhwbHVwbXN1bm9zc3lOSUhHSURBQ0hFPEBFQ0U9ODo+Pj49PUFCPT8+QUJGQ0VCQ0dEQ0VFRkdHR0lGSEpIQ0hIR0lHRkRIS0lHS0hNS0pLTEhMSk1LSU5MT05PUlVWT0tVVlRRVFFSTE9RUE9UWVpZXFpZXF9fXmBjXVxhY2tiYGRnaHKFaGdpZmptbnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJodXFrcnRscXdxdU1JS0hKRUJFR0U8QEdEREA5PD5AQD8/QkI8QD5BQUZDRURDSERGREdFSEhGSEdJS0pGSkhIS0hGRkxISEhKR0xMTExMSU1LTU5NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW1xeYF9hYGJkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd292SktMSkxHQkVERTxARkREQjs/P0FBQUBEQUBCP0FDSEJFREZHRUlFRkRJSEZJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOT05PTE9QUlVYVk1OVFZVU1JRUExOVFNSV1teXl9dXWBgYWFhYGJkZWJjaWJkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV0c3BzdnR1dXd2dXV1ZXFza3BxanJ2b3dKTUxMTUdEQ0FEPD9FRUVDPUFBQ0JBQ0VBQ0RBQUVHQ0hHSEdFSkZDR0pHR0pGSUxISUpNSk1MR0tJSExLTlFLUlFMU01LTk5PUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV9gYl9gZWFhY2luaGJpaGhteHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJycXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTEtMR0RBQEQ+PkRFRkNAQ0FFRERGQ0JFR0NCSUZDSEpKSElLRkRLSkdISUlJS0dKSk9LTkxJTEhKTUtaZkpkXEtsUkhPTl9uVWxzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmXGx0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj89REVGRENDQkVFRUZCRkZHQ0RKRUVKTExKTE1HR01KSEpKSEtKSUtKTkxNTUxMSUxNTFtzYmRwXmxsVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9ccHVncE1Kcnl2a2Jga2VlbXhta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnR0Ym11a3BwbHJycXpLTElJR0VEQEFCPz1CRkdCRkNFREVFRENISEdERUtHR0xNTUpNTUZKTkhJS0pJTEpKSktNTU5OTU1LTk1NW3Jvb25wcGxrTlBRbFdOaWJ0cnBhbW92XFlsUVxtbVpxbWtvbXh4dHNpcFxgc2xxalV1eXhwY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hFRUVCQkI9P0BGR0JHRElFRURCRklISEVHS0pHTU1OS01OSExOSUxLSUpNSUtJSktPUE9OTUxOTUxcaGR1XWxxV2xOT1FtVVprXmtsdmFsZHRUZWNObVlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdoYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR3SU1HSURFRENBQjxCQEJGREdGTEhFQ0NIS0hIRkpMTEZNS0xSUkxHTU1ITkpJSE5ISkpJSE5PTU5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF5uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2diYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRIS0hJQkVFRUFAPkNDQkdDSElNSUZDRkpMSUdGSk1MRk5KS1dSS0dLSkpOSUhKTElLSklISkxNTU1JS0tLU2tiWmleX2pjcnJaX1lqb19lZVVrX2NbYWJRYG1oXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVudnFydXR3c0hIRklERURGQUBBRURER0JISkxIRkRHS0xJRUZKT0xJT0lMW1FKRkhIS01JSEpKS0tJSElHS0tLS0ZISkpMTExLSUtMTlRbXFRQVE1QT05PT1ZRT09RT09RSkpPUFFkcWlUWVdbW1xVWVtdWF1cXGNmYWFmYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eHh1dnFydW92cnRzdXVzR0NFR0ZGQUVDP0NHREVHQ0lLTEhGREdLTEhER0lQS0xPS0xXTUlFRUhJSkhJS0lMSkhGSEdKR0dJRUZMSElLTkxJT1xXXk9cW2BeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZF1iWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1BQ0RCRElFR0dGS0pLSEVFSkpKRkVISFBKTE1KTVNJSEVBSEZKSUtLSUxKSUZFSkhFRkdFRUpHQ0pNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOX1xeU1teY19aXWBjYFlfYltgXltUWFhaX15kYmJhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSURCQkNGR0VHR0lKSklJREZLS0tFRkhJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRURERUFGSkRASktJT1tjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtRW19hYV1eY2FgYmJiY2NlWlJZVlVcW15jYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkNHRUJFR0hGR0hJRkdKR0hGSEtJTERDS0tOTUxMSEpKSEpHP0dGTkpLS0xLS0tJR0hEREBEQUhJQT9JSkdPXWFaW2RdX1RRUlddXFxcX1pLV1xMUlxZSU1eUFBdX2FjY2NjYlxkY2JkY2ZYUVVUU1xYW2FfXl5hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1CQElGQ0ZLSUZGRkhHR0pGRkZJTEpORUNLSkxOSkxJS0pISUdCSEhRTUtLT0xLS0lIR0VEP0RCSEhBQUdGRFRdWV5YX1lfW11VWFhQXV1RS0pXXlheW11WWmBSUV9fYmJgYGJiYGNiYmRkYlhPUVFSW1NcXl1dXV9fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSENRSkZISEhFRktKTVBFR0lKS05MTElMS0lJR0RIS1FPTUxQTE1LS0hJQ0VARENIR0JBRkVCVlVFXFReU1ZfWE5UVU5aW01KS1VgYVtfWF9eYV1PWWJcYGBfYmNiXWJiV19fVFBPUFFYUl1cW1xeX2BhZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJUmNQRFZeSUdHSERGTUpQUEZKSUpLTkxLS0xLSkpHRUpNUVFOT1BNTkxOSEtBREBCQ0ZEQ0FERUFMSENMTFBPT0xGTUZHSUpIR0xMTU9RSUxPUFBTUExRU1JVWllXWVhYZFZPU1RQUE9OUFVUXFlZWl5eYWFlZmNoZGtscHNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXkxHR1hNSEhKSEdOTFFRSUxLS0tOTlVOT0tLTEdHS1BTU05QT05PTk9IS0VgRENfTERmY0RNW0heXHNtT01WbVlMQ1BgVWxXZ0pdWFZeRExRVUxNVFZRUlRYV1RYVVRcVFBmWmhoZFlUa1RXVlVbXFxgYGFiYmJgZmhmbmxocnp8fX6BhISEg4ODg4F9fHpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09USUtHYVRISk9KSU9NUlFLTUtMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUH9RSXxZWXJzWFBtSHFub2FWUHFxc1BCa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlaX1ZVV39qdHV1X2F2X1hiXFxmW19hYWFiXmBiZ21wbGBwd3R4gYGCg4SCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdJTEZSVkxLT0lLUlhXUU5PT0xRVE5PUVBLTE9HTVBSWlpUUVFPUFBQSkhaeF1UeGRoWVJUUXZndGxwYm5ma1FyT013bWpycHNycXJwb3CAXWV6dXhxcXpxfnN9a3V9YlJofGVzc29zc3x9b355b39yYGBgYmJaYWBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpQT01NSk5WXllVTFFTTllZTFNTUk5MUElRUlRZV1dQVFBQUFFLR2Z4bGN4cW1aSkxVeXB1bXVibnZQZGVJZnZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/cGdvWHZ2anZ1cIBhc2h9aWx4fG9fX19jYlteY2RnaWpkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3Z6bnx9eXhybk5KU3ROREJFUFBJS0tKTFBPT09NUFpgWlhLVFdQYV5SVlFZU01QSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRoYVZuTHFwXkZoeVd2VExoeH14YHl7c25hXm1vZFJncnVubXlwd2x2c3RxbG1cc356a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGVlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX5ucXBqe3p0cm9tS0tbVkhHRUdSUEpMTUtMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZVV2xPbmx7c2FqZ392VUtXa2h9bG1seGBbcHp7XmB6c2Nyb3hxaGR8aXJ7XVRLbF92dWtpdXt7bX54a3xwXV5eYlteYmRlZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtobW1yfGttaGt7dG1ta21PR0pLSEpISFJRTE5QTUxUU1JPU1NXUlZUUFdaVlZUVFRhYFFPTktUU1NRVVZOTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFhRT1BVVFhYWFtbVVNTV1tXWFdaT1NVV1dYUV1YVl1VU09YUldXV1haYFtncl5bXFtdXV9jWl9jY2VmZGNjYlljY2ZmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0tMTUtKVFJNUVFQTFZWVFBUVVhVWVVSWl1WVVRXVVlYUE9MTldUUU5VU05QTUxRUEtKUVJLUU1LS09SVFJRUVNTSUhNTk9RUlFRUVRWUlhXXFdTU1FSVVVWU1pRTlNSWFVUWVZUWVVTUlVTVFVYWVdeWl9hXVxbWlxcYGNcXWJjZGdlZGRhWWBhY2FiaWhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkZGZoUEpLTE9PTE1UUU9UUVFNWFdVVFVXV1daVlRcYFZXVllVWFRRUEtPWFNQTlVQTlFOS1NQTU9VVE5RTk1OUVNQVFFTVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXV1dZW1RPVFVYVVRZVVdZVFJSV1VVV1xZW2BeVllfXV5dXF1hYV5bYmJjaGZlZGJYYGBiXWBoZWZkYV5fXV1eWlpfWl9nYF5dXWNoa2FnZmhmZGBiY2FQS01MUFFMT1RQUFNRT1FaWVhXWFpaWFhWXWpkVlhZWldWVFRPS09WVFBPVFBQUU5NUVFQUlhUUlFPTU9TVU5XUlRVVU9OTlFTVVVUVFJUWFZaXVxaVlZRUldYVltbV1FUVlZVVllUV1dUUlJYVlVaX1peYF9WXl1eYFxcYGBfX1piYmRoaGVkYlliYGJeX2ZkZGBiXVxcXFxZWltYW2FbXl1cX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST0xQU1JVWlVUUFBMUFdWUVdTU1NYTU9QUlRYVVVVU1VZWFteXVtbVlJPVVdWW1xXUVRXVVdYVlRYWlRTUVlXVlxeW19fYFVhXGBhXWBiX1xgXWNhY2dpZGZgWmNgYV9fZWVfYGNbWlxbXFlaWVlXXFlcW2BeX1teXmFgX2JcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWF5cX1dcXmpxd3mAY1xbVlZYUk5PV1NOUVFQUlRSTFFUU1laV1VPUk5TWFZUU1RSUlpPUVNTVltWVldUVlpYXV5cXF5WU05UVlZcXFZSVFZWWFlTVFlcVFJSXFhaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2lkZl5bZGBhYGFjZV9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFtdXl1bYFxgVVxdaWpyfXNsZ1xVWVdRT1JbU1JRVFJUVVRLUlZVW1laU09TUlZWVVNPVlJTWlJUVVRYXFdYWFNYXFheXVlbXlVVTlZXV15bWFFVVVhYWFVXWVtUU1ZdWV1dYV5jY15ZYFtlYl9kZF5eY2NhXWVmaWRmXl5kYWBhYmNkX2JeWFpfW1xbWFhYWFdbWlxgXVtbXFtYWVteVl5ZXVBPT1JaUFpVVVdWU1RUXl5gXl5iXGBVXV5ia3l0bH1sWlVaVVFRU1xUVVRVVFZZV0xSWlZdW1xST1VTWFZWU1BYUlNXU1dWVltdWFtZVVpeWF9eWVxaUldSWVhZX1pZU1RWWllaVlhZXFZVWl1cXmBhX2VkXV5dXWVhYmZkXl9kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVpYVl1aXV5bWltcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXWBemhYWVpUVlNWXFdXV1ZWV11YUFVcWV5dXVRTWFJYVlNSVFhSU1ZTWVhYXV5YXVtVXl9YX19YXFZSWVRZWlpgWFtUVlhbWlpYWVpaWFZdXl9eY2JhZWVdYlxgZmJkZmRfYGRiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVpbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlNcVFZXWVdWXGBhYmNhZF9fVltgZGFfenVvaFlcWlZYVVdbWllcWVhZYFdQVV5bYGFcVFVYUFVWVVNWVlJTVVdbWlxfXlpfXFZfX1pdXlleVlNZV1laXWJZXVVWW1xbXFtbWVtZWV5fYGBkYmNlZWJkWmJmY2dmZV5hY2BjXmNjaWRkZ19nXmJiY2FhYF5fWFRaWlpbW1hbWFhcW1pbV1daWFdcW1xgXVZdXVNQVlpWVlpVWVVYV1hdX2JhZGFkYV5ZWWFkYmBsZmheXF1bV1hYWVxcXF9bWVtiVlRXXl1hY1xTVllQVlZWVlZWVFZUWFxcX2BgXWBdV2BeW15cW15YVlhYW1tfX1teV1hdXF1eXlxaXFhbX2FeYGRjZGZmZmJZY2VlaGdkXmNhYGVjXWZpZGVpX2ZeY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTVJXWVZXWllbXFlXWV5gYmFkYWRhXV5ZYWNiX2FgYV9cXF1YV1tbXV1fX1xaXWNYWVhdYGNkX1JYWVBYV1hYWFdWV1ZdXV5gYWFfYl5ZYV1dXlldXllYVldbXGBfXV9ZWV5dXl5hXVtaWVxfYV9iZGRlZmdnYlpkZmdpZ2NfY15hZmVaaGljZmljZV5iYmNhYGBfXV1aV1tZWVhYWllXWltaWVdYVlVbXV1dYGBiYnhLV1dcWFddXFxdWldcXV9gYmRiYmFdYFhiY2JgY2FiXlxcXFhXW11fXWBfXVtgZFxcWFpjZWNhUlxZT1hXWVtaWVhaWWBdYGJiYGFjX1xiXV9dW19eWllVWF1dX2BfX1taXl5gYmNcW1dbXWBiYmNlZGdmZWdkXGVmaGlmY2FiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXV1hPWFpdYWNmZnJrf0pZV11aWl9dXF5cWF1cXl9hY2JhYV1iW2JkYV9jY2JdXFtaV1hqcWBcYF9dXGFjX15ZWWNlZGFUX1pRWVdcXVxbWltbY2BjYmNgYmRhYGNeYFxeXl9aWFZbX11cYWFfXVtgYWJlYl9dU1xfYGNkZGZlZ2ZlZmVeZWZoaGdkZGBbZmdeYWhoYmhoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3p6ent7e3t7e3p7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3p6ent6enp6e3p7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmIjbG1tLS0s7O7vr6+vr7BoYqMjIyMjYl+f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIuRu8C/wMC/v8nMzMzMzM+qjZCQkJCSi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEg4GCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eHh4eHh3d3d3d3d3eHl5eXp6endvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2AgYGBgYCAgYKDg4ODg398fHx9fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ1dXV5dnZ2ent4e3h3dnh7d3p5en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3p6enp6eXp5eXl5enp6e3x7e3x8e3x8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx6fHt5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHt5e3h8enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3d6e3l7d3x5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en17eXx4fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5e3h5eXl5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4OBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnJxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbW1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgYOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4GGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f4B+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fn17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioaGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/gICAgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gIB/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4KCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjImGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn1/f35/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSkpCLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChISCg4KHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYCBg4GChIWFhYaGh4aFhoaHh4eGhoaHh4aFhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OCg4WEgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSDg4ODgYOEhYSEhYWEg4KEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGGjYKCgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/f4CBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSEhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYKBgoKBgo+bhYB/gICAfoCCgYCBgoODgH9/f4CAgH+AgIGAgoOCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIKDgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgoGAf3+FlpuIhIKEgoF/gIKBgoKBgoSCgYGBgYKDgoKCg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkZGRjo2Mh4WEg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4SEg4GAgoOKiIaAfX19e3+XnImDhYSEhIKBgIGCg4KChISDgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhISFhISEg4SDg4SRlJOSko+MjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgICGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+AhpmQhn1+fn6Hfo2chYGCgIGCgoGAgoKCgoKCg4OCgoGCg4WDg4ODg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYSFhYSDg4ODhIOChpSUkpSSj42Lh4SEg4OCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH5+f36Gnp2GgImAf4eBgIyCgYOBgICBgoSDgYGCgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCgoOCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIOaoYiFiYODgYB9gYSDhIODg4OCgICAgoKDg4KCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhISDhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZCdhIKChId+fn19hIWFhIWEf319fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDhoyCgH+AhYB9fXuCh4aDgH9+fn5/f3+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4KAf4SNhH99fYCGgX9/gIB/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoeGhoWEg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgICBhYSDg4F/gIB/f3+AgICAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4F/gIOFg4GCgoKCgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYmLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+RjoqGhYaFg4GBgYGCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODg4KDhISEgoKCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYSDg4WDg4SDgoKCg4F+fX1+fn5+fn18fn19fYOHiYqKh4eFhoeHh4eIh4eJh4iGiIeGiYiDg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaDgoKDhIKDg4WCgYGBgYGDg4SDhJGSkY6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhYCChIODg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GDg4SFhYWDg4WEhISEhISFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4OEhYOCg4GCg4OEhYSHkpGPjZCMiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4GAgIGDg4ODg4KCf319f4CAgX99fn59fH19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYOEgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn6AgoODgoODg4J9fX5+gICBgH59fX19fn18enp6f4KCgH9/f39+f3+Afn2Af3+AgIF/gICBf3+AgYF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fn6AgH99f359foCDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gIB/fn9+fn59fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7f39+f39/fn1+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enp5eXl9gH+AgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIKBf39/f4CAf3+Af4GAfn9/gH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f3+Af4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEhIODg4SCgoKCgoB+fn19fX5+gH19fX19fX19fXt6eXl5eXmAgoKChIOAgoOBf4GAgYGBg4KCg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f359fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f4CAgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCg4GBgYGEg4KDgoKCgoCBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf39/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCCg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDgoODgoODgoKCgoODgoKSkIuIiYeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaGh4eHhoeFf319fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GDhYWGhoSDhYWDhYSDg4SDhISEiJKOjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODgoGBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWChJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIKCg4WDg4SFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHyAgYF9ho+Bfn2Cfn5+gIJ8fH9/goCCgH58e4qCfYB/foGAgIGCgYKAgYGBgH+Lk4+Mi42OjYiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYWGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX19fXx8fYB/gIB+gH5+gZORjIyNjo6KhYaGhYSEhYODgoKDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoCBgICAf36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fHx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY6MjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgYGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKNjIyPjYuKhoSFhISEg4ODgoKCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gH9+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fICDfYx+fHt7fX59fn59e3t7fXx6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CKj4yMi42Mi4iEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gICBgYB/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9e317f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYKBhYaFhYeGh4aBhJGOjIuKi4eHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fHx7fn56fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9en1+fn+AgIOHiYmJi4mLiYWIkY2LiImHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx8fHx8f4B/f39/f4CAf35/fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgX9+fHp8fX1+fX1+foyGfX1+e3uDgn1+fn19fH19fX19fnt9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uLiY2Rjo2JiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCAgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4ODhIeJioiJjpCNi4iIhYSEgoGCgoKCgoKBgoKCgoGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Ign9+gpCEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f3x9fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiOjYqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/fn5+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYGBgYCAgYKCgoKFhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1/f4CAfX5/hIB+fn99fn19ioV9fn59fn6Af319fHx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYKCgYGCgoKCgYGBg4ODgoWGhIOAgICAg4F/gIGDgX5+gH9+foB+fX5+gIB/gX5/gH9+f39/fH9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHt8fHt7e3x7fHx8fXyKioiIhYWFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx6fHt8fomGhoWFh4WEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dXSAgIKCgoKCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgYGAgICCgX5+gH+BgH+AgIB/fn19fX18fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4KEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFg4ODhISDg4SCgYB/gH+AgX59fX5/fn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f36Af359e3p7enx7eoKEf4OCgoKDgoSCgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Bg4F/gIOCf3+Af4F/gH98e3t6fHt8goB/gn9/gYCCgoGBf35/gYB+gYKCg4GBg4OCg4KEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhYSEgoSDgYOBgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fHx/fn+AfX9/fX2BgIB+fX2Af36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgYOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgYSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF+fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9/gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN3dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398fn9/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+fn+AgICAf4GCgIB/foCBfn+AgoGAgYSChIWGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1/gICAf39/f3yAf3+BgIGAgH98gH99fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn59f4F+foCCgX+Cg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4F8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhIOCgoSCgYGCgYCCgYCBf35+fn6Afn1+fH+AgIB/gIF/e4B+gIB/gYCAf32Afn5+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/g35+gICBf4GDgoODhoSAgX58fXx8e3x4eHt4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHJ5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59gICBgH+AgYB8gH+Afn+BgH9/foF/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af319foCCf36AgH9+gYSCgoOFhYKCfn18e3t8fHl3fHl3eHd3eHt7e3t8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6enp4c3d1cXFycHh3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB/f39+fnx9f4CAgIB/f39+fn18fn9/f399fX9/fX5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn6AgX+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9e3x9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GBf4CAgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f3+Af39/f4B/gICAgIB/gICBgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH19fn5+fXx6fHx7fX17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKBgIGBgoGCgYGAgICBgH5+f3+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59f4B/f39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXhzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CBgX+AgYB/gYCBgYOCgICAgICAfX6AfYCDgnt+fnt7fXt6fHt7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBgICAgH+BgICBgYGBgIGAgIB/f4B+f31+fX5+e318fXx8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX6Af4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYGCg4B/goGEg4OEgYGDgYKCgYGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCf3+AgoB/f4CAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31/eHd2eXl6fH18fH17fH19fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICDgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYB/goGBgYKDgoKDgYODgoGAgYB/gIR9fX17f316fX96eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYOBgoKBgoF+gYCAgoGCgYGCgoCBgICAgoKBhIB+gYOCf36Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoWGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4J/f4GEhIGDf4KCgYOBgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhIWEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3x6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GCgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fX18gX16fHx9fXx6e35+foB/f4GBgICAgICBgYCAf319fHx9fHZydnh5dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhICDhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4SDhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHyAgX98fH16ent9gH5/f3x8enx+fX19fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgYSFhYKCg4OEgoOCg4KDgX6AgIKCg4KDg4OEgoKCgoODgoOBgoGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fH19fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgIKEhIWDgoKDg4OBhIOBg4OEg4OEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhYB+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODhoKDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CCgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISEhISFg4eGhoSEhISFhIWEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhYF9gXWBeYN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgX99fn5+foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhIOFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SFhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGdHB1cnN0g3Z7fXWBf4KDgIJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBzgYR+g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9gH99gH+Af319fHx9fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KChIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYGAf3x/fXyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgX+Afn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4mFhIaHh4WEhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fH99f39+fYCBg4OAgoOBgYSBgX+BgYB9f3+Bfn9+fX+BgH5+gYKAgIGEh4aDg4aEhYWGh4aFhYWFh4aIhYWGhYeHhYaEhoaJiIWEiYqIhoSGhoWFg4WFhIaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX16fXt8fX1/f319f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYaHh4iGhIaFh4aGhYSFhYSFhYaJioeFhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhoaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WDhISFhIWFhIWFg4aGhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH57fHx9f358fH59gH99f4B+foB/fX18gH1+f35+fn98fX1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYWGhIWGhoeHhYeGiYiGhoeHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoWDhoaFhoWFhoaFhISFhYOEh4WDgoKFg4SBfoCAfHt9fnt8e31+fXt8fn1+fn1/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFhoeFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYSGhoaFhoSGhYaHhYWGhoWEg4SEg4SHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fXx8fH18fn17fIF/fXx9fH18fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaFhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoWHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhYWHhYSDhIODg4eBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4eHhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4SDg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e318e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYiKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaEhIaGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhoWDgoKCgIOFgoN+gYGBf4OBf35+f31+fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2AfHt7e3t8e4mHhIaEhoSGhoWEhYWFhISDhIKAg4GFgoGCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIiHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAg4OCgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCgIB/f318e4GEhYWGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeGh4iJhoWIh4iHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYaGh4SGhoeGhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp7e3x7fHt7ent9fXx9fH9+fnt7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiFhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhoKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfoCCgn1+f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYSFhISGhoeIh4WFiIaJh4WEhISChYOEhoKDhYSFhoSHhoWFhYaDhIWEhYaFhoSDhISFg4WFgYCDg39+f4B/f4CDf3yAfX1/gn6AgX5+gX5+fn19f3t/fHt6eXp6eXp6fHl6enp7e3x6e3t7fH1+fX2AfX18fH2Af318hoOGhoaGhoOEg4WChYGBgH9/gH9+f4CBfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYSCgX+AgoODhIWFh4aFhYaHhYeGhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SDg4SDhYSAf4KCfn5+f35+f4R+e398fICBfYGAfX2DfH5+fX1+e358e3p5e3p5enp7eXp6ent7fHp7fHx7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4F8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBg4GDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSCg4KDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn99f4J8f399fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3t+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt9fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fb29vb29vb29vb29vb29jW19fX19fX19bW1tbW19ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzYRtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0j4yMjIyMjIyMjIyMjImiv7y9vb29vb29vb29vrSKioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFpVVlZWVlZWVlZWVlZSfK6qqqqqqqqqqqqqqqybU1JTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj47PUI/ODw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX183OUisxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpZ5fWVpaWlpaWlpaWlpaVoCvq6urq6urq6urq6uunVhXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNz1w5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaqjaGRlZWVlZWVlZWRkZGGGsq+vr6+vr6+vr6+vsaFiYWJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3FwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Pzs7Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzMzMzLz9PT0tLS0tLS0tLS09PRzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7O0NTSz8/Q1NLPz8/T0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX19bX19fX19bW1tbW1tXV1tXW1tbW1tbW1tfW1tjY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Oz8qWpdHRyJSn0tHHkqvRzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8+cqp2t0ZmsnLDRmayastLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q/QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DLlIiancSUiJyexJKGnZzOz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEI6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0b3ImZnCv8mYmMW8yZeZxtDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Sl5SfzNKUlp/O0ZKZoM7Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Ts5vEmNmvn8Kb2q2jv53V0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0c6NkJ7DzouTnsfLiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NHL2qiZr8/bpZmz0NuimbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Nzk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJjqWaoKuRp5mgrZComJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NDc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HKu6Gmp5+xpKSooK+noqmc0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09OekI221pyRjrrVmpGOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0rrE1dPTucfW09O4yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLV1NLS0tXU09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSkJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampuam5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cm5ucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnp6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVWJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipKmnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6mnqaijp6aZnKSmoqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6yppJ+ioKKmoaaupqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnNfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6KvqqqsqKirsKmoqqihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustq+zsKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYW1odWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCxtLW2vLy+vLy+xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsLDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb21ocXhveWppYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbDxMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ3c3lmZ11kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDw8HEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpnXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMnIyMnHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraequ7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBzsPKysjGzMrNxcbFw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVvdGJdYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBwsO/v77Ey8jKy8m6ztPIyM3Iw8jJycXFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVnZGplYWptbm9eWVxWVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDubi5u77Bx8HFw9OJqc/ExMHEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e9xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmdjW1paXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba4tLS1v7u9wLm+urq0wLi1t7Ouuru2vsy2hJ7SvL/BvLvEvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+urW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vsvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCnoaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWNgYmJnamdmaWVpXVZWVFlPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tbGwtbe1u8G4vrm/vLy3tLewrre1uL/Pm4GKtcG6w7W6x7i2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGhoqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2hYWE5LS0tSSUxIQzk9OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7i0rbiytr3FxYeBgJ/Evse3ubitt7W4urS4s7vFxsvBvMbAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz89PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2kr7G2urG9vrvEtrecfneCdISTwax7gYKcycbPwsC4rrW1vL64urK+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG54Y2diW2NRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuro7C71Nq7ur68xrKdd2NsZFBbYX2PeoWGmcvO0czKxLW6wMPIv761v8G/xsa/y8bDv8G8wMPMysfFxsC5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmBhTkhNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPEFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLGzxKKy27+8vbp9ZG9gYHNbVFVYbHyGiJvIyMzLzcrGwsTLzsK8ub25ucDDv8jGxMHBv8XAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLW8t8Fvb7DNwbR6WkpkY0twfm5gUVl4gougxcLHy8jBw8HAycrCwLu6sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKyr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXptc3hzZ3BdW15cWVFFRENNSUFFPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7/HfW92pL+bVVJPg2dPXHyBg2xGa4KQrMO9v8bAucC8vsXEvb25srCuuLe/w8fDxLy9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG5pW19fWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnHyIJ/bn+lc1FMYpVfUVFVjpZ2TmWLnK64uLjCurO7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9mXVpUSjw/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa4x8iKg3h0jWFMYopxXE9WZLC6d1ZQfq+wsrG3vrmytbK8uby2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZxbF9jYVtdT0hBPj1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8PDkYh/f3lWUY6Ua21WZXBnlH5xbV6HvLOwtrq1tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybWNdZlhcXVJOTUE+SUJBSklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i5w6KQiZB+Sl6Yw3SBipBddnxpanSKtLu1sbS1srSvrLu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxCRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1sruvlJCdlkxijZR2cIB6Y2psc356c566ubK0s7CxrbC5uLa8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+ytKadqo5XgW9ualxoX11WWV5nY2mAl7iyrbOvrqyutraytLWvqqSem5ycnqionqCoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKurn6aim6OclZCMj4+Qk5CXlZaYn56empiml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR1BNTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6WsqbHAt69oeHhrc2hZXlBKSEpMUU9aa26itqqytK6qq6+wsrOupZ6SmJSPmKCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6aqsaOlqJ6gnJWTkI+RkJiQlpWYl5+Ym5mao5mXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01KSEdPUk1KTkc8RUA9Mj83NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqKGlxMOOYGVjcmNUTEZdSVBGTUtLU15dfLavr7O1qqesq6KcmZSOkZaXmJmcoKKinJ2lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmpabl5eYoZ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHl5YGJSVWBJSUpLU1RJUlBMOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6Xn6WenbmxhXpnamNWSFBejntsU0tHR05UVGSrsrCwuKymoZydmpSXmpqQjpGVkYyOjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKxtKqyr6KZnJ2eoZmbm5qYmZuUlpuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVbU1pZTVFKTk9VTFNMQTc+QjY4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpyim56jp5p9bF1UTElVg6qxn2hQRkNDR01elLCtrK+nn56ioJeRk5ugnJmXkpOfnKGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7itsrSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqShoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFJVSEZVVkpCTEc9S0g4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKZnpuhoaGGbmBVUE5PXKvg2rqPdWJTSEJNi5maq6qppJ+fmZKSk5iYlpaVjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+nqKWkn52qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JXTkpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKSgdFlST1JSXXW40rqgqbmehHmJrsSjqK2pqqWfnp6hop2fnZqcnJSTlZSenpiUhZ2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsO8w7y3s6mzraqztK+zrqqvo52rp7axraKwpqGjr7GtsKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHFra3VycGhXW1FFVEhESlBJP0VBNEZIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfn5qgnGZQSU5QXXWNsr2ph6Lc1s7U2ci0rqejo6GgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcfN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Aw77HxsK3w8nJwsHGvrq0urq0u7ewtbKqurKuu7e/u7qqt62rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrZGhveGpkWltGS0xFRFNMREJFNzo/OzU0OTk3OD4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaKdnJRdS0VMU3WFs7akkonF49zRxLWmn5mcm56emZeXl5KMjpeXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxczQ0tXO08m9wL/Du8bFyMXR1M3T0NPTzMrCxsbHysjOv8jRzMfFx8XBvMPBvr++tb6zrr+/wsPHxMfErr+4sri8w8HBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURDQDU1NTg6Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOfnJ6WY0pJTVx+qtHQtqCz08y6r6iin52fmpiWlJKUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fR19LV1tPTyMzHzM3J0s3O083FyMnKwcbLx8jJxr/Ds7PIxMvKy8/Gyr++v73Bx8TMzMjJv8O/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxBPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2gpXddZ2iDsNLa2tbKurKqo56dnaGloJ2alJSVlIl8d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HT1NTTz9HD0NPW2NXW0svJztHLxs3SytLW1tnV19PW2M7Sys/RzM7QzNLPv8jHysPMzMzOz8XGx7a/yr/RzcvPxsnIv8PDyM7Mz9DPzcrHzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGVyYl1SXElKR0FFSEk+O0E4PTQ1ODU7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoaqJgZKvztTZ2s+8r6iblpignJuhop+bnJmViXdpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV19fX09bP1dTa1NTOz9XU1NHRzNDN09fW09XQz9LT0cnT0cjQ2NfY0djS19nV1szPz8rN0svO0MDGwsfFzs3R0dHIzM3AyszF087LzsjEysfGyMzK09PR1c/SzNPBucWxpai1rqebqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpq63qKu319TV2dnRztC/vMzJtr6upqqooaaVe5OSxdbS1cKtpqGYlZeZmp2gnpmcnZJ9cWVjY19fYV9fYWBfYGBfYGZucHBua29yd3eczMHS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHF0dTK0NTV1s7S0NjY2NfLyM7Eyc/MyszAyb/Hyc3Oz8vQzc7Mzs/Iy9DQys7KwsnHyczKy9HSzNPR0c/Qyr3IubCuu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1XRTtAPTMzPD04Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HAsKmsrammdml/lNPWzbCcm5aVl5uenp+dlJaYlIhrXl5eYWRiYGBhYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Hzs3N1MzO083L19bQzNHUy8zQ0tPKztHV0tXVysDJwcXMwsjJwszDxcjKys/KzczQzdPLxsjPzcjHy8XGwcXKy8zP0cbQzs3NzM/Fx8G4ub3Dw73DubOyvrG7w8S1qpilopmWkZWVkouUjZqRlJSPj5SCiYV5cHFrbWdgYHBoWFhoVkxGTElQUEI7Qz47Njc6ODk6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWvtKihqGRvfKjZ0KqVjo2YlpGTkpGWlpaQi3xlYWJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytLIy87NxtHS0M7M1MrHy87Px8fP0svQz8W6xL/Gyb3Cx8nOxcLIwMfNyMTMysvPyMTE0MjGwsbIxL7Ax8vLy87Cy8vIx8vQxMXIu8fDycjCz8G9vL+wwcnHub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd290ZGtgXmZwYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLrNzcbQ1dXZ2tvY0MnPz9HTyMK2u7utppxeb3e60KuQjo6XkIeEhISCfoWFf3NgW15eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsnGwsPAw8jKycjKyMHFzMbIy83JxMLLycHCzNDFy8i/ucG7xse+v8bPy8O/w7vJx8i7yMbFysC9wsvGxcS+xry8wMPEy8XFu8DKwsXH0sXByb/KycbIxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhpZujoJuUe3ZzdGZpWmFubFpbWFJETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjAtMO+srKNYHKBv7CQi5OXh3uBhYaAdnh1cnBfW1tdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsba6srKzsrHCvLy8urjBwcLFvr25vb+5xMrFxsK9xsC4u8TJv8LJu7e7usXDv7zBzcPGvb21wb3Dur3Gu8K6s7zFxMHCtr+2tb2/usvDvLW6yLq/vsvEwcbCxsnGyMbQxsLMx7LHycPOzcHFw8C9s7ewsqeoqLmwpa2wqq2slHl2d2pkZ2Bob2NWXllKRkpGSEpBRUJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztHKysrHzc3O0cjQxtXU1tfNys/FycXHwLjFvauvfmR1kLWSjImLhXmBh4eAfoR8dHRjW1xdXmBgYmNhYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLW3tLOztLy2vbG3sLWvsrvCvMHEvL+6tbO6vsC4x7m0u7bBwry4vcbBw7u1rrK2ur+0xLe7tau4vb3AvbG6tq+2urPFvLeuu7+1t7TFvL7DxcDDxcbIy8XAxsa7yMu/z8rHw8bCw7fDvb22ub7Hv6y1urW3to55dHhmZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjKyMrJysTQzdLPzcXHwcXAvri3ybWpsIJtcZeajYaJint5foaGd3iCfXRpXl1dXV9gX2BkYV5kZWNfX1xbXlxdXlpbW11fbHBuaGZqbm5yfKTHv7i4tbCrrKeeoqqnnquts62prKm0r7ewsqmupqyyvLq2w7m6urGrtbm7tMK6sMCxvry7trvHucK2raqosLLAtri9sLCnsrO1u7yrrrWlrrWvu7Kwqbmwrbuuu7i7wMC9ucK/x8PFwbzGwsjLuMXHxb/Gw8O6xMbCu8bJzMuzucK8u7OIc3Z2a2lhYmxoWVdXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXPx83Bw8a/xMTDw8rBycq+v7zAurKztMOuqa6GaGSKkoiOkHx4foqFenuEgXduXl1cXV1fYF9fZGNiY2NiYF9dW1taWl1aWlpaXGRub2hmZ2lrbnKBrbmwta6mpaenmqCloZqcpauupKiirKqsqrCjpp+qrbW2sb25r7evqa64tLS8uLS8r7e5tbK7wbLArqWpoquxsrOovaqrqKusrbSzpqiuoaSvqbKmp6iupqi3rLGyt7q6u7K8vb6+xL+1wsHHyLe/wMW3xMK/u7/Ewr7EyMzKv77EwMCph3N0cmppXWFvZFdWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HLvrvJtr3DvrrJt8HDwbS1u7WwrrS7rainh19xjoOIi4B7foB+eHR/fHN3ZV9dXFxeX2BeX2NjYWJgYF9dXVxaWFpbW1lYWlxfZmtmZWdlaWtvcoWqpayloJyipZSepZuYkaGjqqSin6alqKWtoJ2cpaassq+2t6ewq6iqtKu0urG2ta62ubGvurqxtqSgpJ+msaerqLmqpKeoqKeyraCnpp+bpKasnp+no6Chsa2trLK0s7Swtby2u8HBsrq+w8GyubnDs8C9v7W4u72+vMLHxMLDvsDEoIN4cGthZl9rb2BUWV5ITmdPVEdFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLS1vbi6wLq9taCelZ2hprq2q7Ozu7PEz8jLwsa4t8fBzL+4ybe7xbizxLizvsCrtbuxq6SusqyfoophgoeGhoF8eXV0b21rampxaV5gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1viJ2poJeWm6KWnKOZlo2foaOnm5+gpKaiqJ6bopufq7CssbajqaqqrKyktLmtt7Css7WusrWusKqfnZ+korKkpqm4raKmpp+orKuZn6CemZ2fpZqZo5ybna+pq6eqrKytsbK4r7i5u7C2vLy6q7OzurO9tLaxsbW0v7a9wL3Dwbu7vZeDe3NrX2VeZGRYVFddSVdcS1BHSUlGQTw/P0A7PzwwNDUzNjo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vEw8++uce4t763ssG0sbu7q7i5sKGdqKqmlp2CZYKFhn94cm5wbmtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1hYWFhaXmJkZGVmZmhpa3KNp52UlZWbmJuil5aRnKKiqJ2bnaWmoqacoKCbmK6ura6yoKWirqunorWxsrKsqK+yp7qzprWgop6bo6Gto6Kqtaqio6adpqajlpmel5mbnaCal52dnZytoaunpKSmrauztKq1sLOrsrm0r6qvsrKzt7Ouqayusriwura6vb+3s7GUhXl1ZV5lXltZVlNaVUtbUUtJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+ynaWjmKWxwrW2va20uMLMyMa/xbbBv8fOt8DEvbO5ubK/trG4uqyxtK2dmKOonpKad2mBg4R/eG9xdHFpZmRoZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqKclJSQlZeXoJeZlZegnqGclqGiqaSfn6mdnJqrp6+wqpujpLiqoaCuqLaqpqetsKS3sKS3oKKbmZmqpqGarLiwoqGknKKfn5OUoZSWlpuYl5aXnJWfqp6qpKKdo6qqsK6otKuqp62zsKWrrrOxsLCur6anp7KusbSwvLS5t66jlIF5dWReYVZZV1NSVEtNXkxPS0dHTExFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri9rp2nqKOqu8C9wLmutLjBzMfFwsO9xbfIzLLBwsGtvLu0u7y0uLmvr6+nm5ifp5KPinB6gHx3cWlscnRwaWhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmNkZmqBlpOVjJKUlJuZnZaWnKCcoJahoKempKann52fpqCqr6afoqS3qKGhoqi0oqWopbClsK2rtJ6gnZWVqaGilK2xsZ+io52emJuTi6GUkZOYmJKXl5iXnqecp6GimaOlpaukpbCnpaOrq62mqa6vrquoqqmzpaasr7Sxr7y1sa+uoJJ6dnJkYVxaXVhOTFJIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxuKyepaett7u8wcW6sbm1xMnJwMPGxse2xsSzwr/Fqre3vba9urq1squrpZiXnaGKh3F8iH52bmNhZmloZmhqZ2ptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVVRWVVNUUlVgYF9gYV9gYWNkaYGUk4mQjpSTlJ2VlpekmaCXnaGmoq2mpKSjo6KcqqulmZ+lsaqgoJ2lq52nop6trKmprayhoqKVmKObnJCrqbCbn6KfnpeZk4qekY2Sk5aQmJiTnKGjnaSgopWgoqSmm6OrpaKkqqSrrqWusqmmpaamtKapqK2ztbS5uq+prJ6LcnBvYFtXVlVSR1FPSFpbT1JKVEtTTEVGSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6PDw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm9sb7EyayxuMG1u8C7tLOoqaSUmJmah35wh4N7dGlpamxnamtta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV1eXl9fYmRtjpCEkYePkY+ak5WTnJujnJuhqamrqKynqKWkmaWupJSZpa+pn5uZm6Cerpmbq7OgpaafoqOhlZOblpaSqaqtmpyfoaCalJCMmY6MkYySjZaVkJ6hoKOcm6OVm6GjoZeiqKOiqKugq6+jrbelo6OirK2qqKuvs7ezvrWzq6+YhHRzaFtYWFJVUUVYTFFbWE1UTlBMUFFJTklCPD8/QT88NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62os7auqaevrpupqKy3tqy8yru2v6zLxsW4wc7PyLPEu7e7w8ixrbi/t7y9urKzo6eelJWWlIV4c4B2d25taG1ubXBnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXVxcXl9gZH6NgYt/jJCKko2XkZeZoqCboKuqpq6sqK+kqJqfrKCVlqSop52XkI+anq6WmKiqmZ+dlKWgnpKQkpGTlaerpZqZmZ6elY2Mi5OGiI2DkIuRlZGgnqGjl5WflZqhop6Um6Wlp6iooLGwprG8p5+jrLSrrqewtbC5tcCxrbGrkH1yc2JWU1ZOUklGVlBSUUxMV01KTE5SR01KQUNGREM+QDY1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OsprG3qqaisKudqqepsrGltsa0ubqzysW5usHL0Muxtri8vsHDsbCyt620s7qysaGhmpuWlZKBfnZrZ2xucW5xanBrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domNh5CKl4mUlJibmZ6pm6CqpqWrnaiZoaWbk4+fo5uXl4WEkpujj5SjnZaWloiim5uTi46KkJqkp5yVlZebkZGHlI6LgYuNf5CKkpKSoJqfopWTmJiVoqaZjZmkpqimoZ+0sqiyt6Gcoresqq2ksrKmtby1rKuxo4l4c21dTlFRTE9DTU5OUEtGTk5KSk5NUUlNSkFHTEhHQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2saWno6mloKilpLOqorLDtbWys8bGt7rDyszGs6y6vbS3wK+tqbCepq25rqudmJmblJKFeoFtX19mcnB2cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhZWFtdYW9zdnGFiIKIgJGEj4uUkZSeoY+bnKOho5ill6KclY2HmJqMc42Dfo2XloaRmZCUjo57mY+cjIKJf4qYn6OekJOYloWNgpR+fnSJjnmQh5OPkJ2amZqRlZCdjqKjjomaoKGkpJuitK+sr6yfmKW4pqaxobGunLC8qqmvqpmCd3NjVk1ST1BNQ1NOTFFNQlBRSElOUk1ISkpDSkxGS0s8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKmmpaijpqWmpqazp6a0wbiwtLDJxLe5wc7FvrOsusGrrcOtqKKmkp2mtauhnI6UlZGOfHZ9ZVdWX2dmaWdobmNqaGdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5YcpCDl4aOnZeLlJCfmJ2VlJaVj5aJgJOJXztXb3yLlImAjJGMkIaGc4qFloF5gXqFlJ2Ug5WOkZCDhn2TeHFvhY19iYGRjY+XmpiTio+JnIefmIeIlp6aoaCXp6+praion5ats6Kmrpmsq5iotKKpraOTfXJuYFtOU1JWTERUSlBNTEZOT0lFTFFNS09KSU1PRklJPDc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepp6OpsKintMG5sbWwx8K3s73Pv7mvrrXCp6rFqaOdmIOUm66gmJWFk46KhntydFxRTFJVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1waXuCdFBCQH+VkZF9iZSNhIqNm42WlYmSiIaVhnmIf2BKUW54ipGEfYSNioV/f25+f5R3dXV3hI2ZcFGNiIqGe354lHZod4aIfoqIlYqNkZKWi4SKiJSEmoyChJKblp6dlKSjqKmlpJ6bsKqhpKSRpqqWoqqcoqaoiXRtZ15bSFFRUk1JVU1TSUxLT0lIRkpOTE1US1FQT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6OnnZ+ir6GnqKWnqK+tqrW8tri3s8G7tqe5yLi2qKi1tqqyvKaelY5/iZOnlZSJfY2DgXx2b21YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+HgXyFjJOBkpmLj3uGj4B2f3hzbnVwdI2OgXp+iquFeXpodnuOcHJteIGLjZJ4eoB7gXZycpJ3Z3WEhISEe5WJiIqMi4B/hIuMf5SDfIGQmJWclZGfnamen6CdoKmln52Yjaekk6Gflp6epIBzaGBcXEpWT1JHSlhST0pMTVJKSkpMUElMUUxSVExFSEE8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3ODU2NzUyNTE0NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpmjopicn7Spr6mlraywsaq9tLK7uLa6tLGft7qyqp2drKmosq+hmpGNlICNm42QfnaFd3t1b25oWEtISEhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnWDfHhmd42XmI2PfWh5gXZ4gImPfYSYkoFxh498d3tva36tfXOQi397hpKBfX90ZnZ8hmxvaHN8iYyIgGx5cX1wbXWPcWlxgH6OcEOLhIKDhX93d3qLhX6Me3V+jpKPmIqSmpujlpmdmp2eop2WjYulm4+el46WmI93b21lYlpXV1RRSlNVVE9QTlBWS05LTk9KUU5ITk9LRUM8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYxMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKavrK6rqKmwr7GrvLisu765s6ynm7CnrJuPlpylqaSgl5mOhJJ5iI2KiXVwe210cGlsaVdLRkdFQUBDRElMTE1RUlBRU1RUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFhdZXBybYinqsB+dXljfHhvfHmIkHp9i4ZvbYySeXR4amqAgnGWkYuBfpaASZOYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmltcH9zjYmEhnp9fnt2b3RzhYJ5gXhwfI6MipSDlpeYmpCSlZeZl56XjIOJn5GLko2GkJZ+bmlubm5XVVdUUlFZT1JUVFNYVU1OSE5LTU5LQ0hOR0U/Ozk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQzMi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrbCirKqota+urLS/q7zCv6aimZWkl52NhIuUoaGYmJGTi3OOen+Fi4V0bnRrcGxka2pYTkVGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlFZXGCniGKaaXR6ZX9wbX96i4l2gYiGdGyaknRzfGprnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtxgHxncXF7bpONj3tzfXxxcG51bYJ/eHl1anmJgoiKhJaTkpCLjZGUlI+XjoB5iJeIhoqGgJCIdmpqb2hkV1FaV1lZW01QVVZZWE5JSEVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyMzQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw1Nzc1NDc4aU84OzVukoiakZmWpKiunrKfprqvq7KwwrG7w8ealo+UmYuNhXmEkJiUjZCMj4Zxh4Jzh4yFem9ycG5vZHBmX1RGSUM/PDs5Oj9AQURERUdJTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHJ8eGx9bXKDgYWBeoSGhnlyoZV0eIFzdZSHNXGdqJ2OoaGEooV2cIZ8h3xzjK2NiYBnZmJqbnJtcIN1aW9YdXCOmpJ3bH97fW1xbXCAenN2bmN2hH6GgIWQkYqLiZGLkYyLj4N1eIuPgH6DgH6Pe3Jwb2xgW1xdW1lYYF9STltaWFdMSEpGSkc/Q0FCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEyNTM0NzQ1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBk4iWkZ6kp56vlaW1qq6xrsGyu8HGlpCMlJCAiH1ugZCSiYOKh4+FdYKDbJWIh3t0eHhsd253Y2leSVBHPkA3NDQ5Ozs8PT5AQkVITExMTE5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8foWDf4x+dqKZeX6GgYWZhJucYYaqn52Lg5COeneIfomIjXOKl4+Eel1kcXR6e3eKbGdqYnlvhY+Cem6Bd3SEenB0endrbmled4d9h3yIh4+Ai5KXg42FjYd9cYR/hH11d3t8iXZwcnNmZ19bW11TW2ZeV1FVWFtVR0pKRExHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODU2NTMyNDQwMDQ2NDU1NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcT0yMzMzMUV+VzQ9OVyMeIqAlIySnZ2fppGgq6CxqK/AsbrFupaOkZSHeoV2a3+MkYJ9ioSOjHiDgHOhhIt9fYF+cIB+emd2a1JXTEBFMjExMzY3Njg4Ojw+QUVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxxfI+Men2Jh36Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkaiHgJiYipxzbXyBhod9jmhnaHh+boWHgoVxhIVHa4B3cnl2aG1rX3d9g4l/iIWMepWem4mLiJF/enWLdnx4bW93fn9zc3FrW15dW2NjWGZlXFVQUFZZUERMS0ZOSUNGQ0NBQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFiJGPlpiSl6GdrKGmuK+zvLOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1dLQjYwLi8yMzEyMzY2ODo9P0BCRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYGEgoWRk36FiJGBmpWCoKGXlZuapa2Tmruxp7vHw6iKjKGlj5SJgZF7coSen5Gcf3aFhYqPiJBqaG+DgHWNh4SLcYaCd4eAe3aFfW52dWeAlI+GiYiIiIehq6GWiY6Yf3uCiXp6b2dreH55fnJqZF5bW11pXGFmX1lPS05XUlFJUEpETkdDSkRCQEREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZniDe4CMgIGRj4uam6Sdoaymq6+wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOg4CBjIuCiY2Df4l/bXBqXUJBNC0tLy8uLzAyMjM0Nzc5Oz0/QkVISk5RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISkxLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jaGemYSThYKPop+UmZKEioWPmJGWbHB1iYuCloyNj3aPhHFshYGKlpKDhYhyiaGWh5OJj4+WpbWpm42VooOHk4R9f2tqa3yAf4FzYV1jX1pmalxra15XS0dPU1FOTUxGSVBDRE1GQUNFR0I+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwgnB1h3F2koZ+mJaalZ+fnKegqpaTmJ5nZaSafoSSkXmAkoiQkn2KhZmSkYKAgIuNiYWQhoSIhXh4fmdNUj4vLi4sLy4tLzAwMDIxMjU1Nzs/Q0VOUFJUUFFSU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZuopqKZoZeilZ2fqJ6pq5+orKmqtZerv6u2yMi3ydHPvpugcGmrqZ+ElJKFnKGampmnkZGIlaKamnd6fpSYkqGSl5eBlJ57dpWSq7OJjZegfZSenI6Tlpmkoqa2sJ2RmaiIl5COgYhsc3N8fnpxaGBcYV9hZmNgZ2dcUUVKS1BPSUpMRkZNQ0hMRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHVgbn1hd459fJSOjoqfkpeelpyqmJ6qQkR9h4mHmI14go2Kjo18ioaPkI6BgoCJjIqEkoWChomBgIZ3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUpNT1FZbYaQd5WLo6eqtL24pa6srKiptKuwt7Kyrbuxs76cs8Ssu8nLuMS/uKWjsLKsrauki5aYhaamoKKXgaaZjaKqqKSHhZOkoaCqoaSpjpyxi5Wjp7e7m6CjsJOjnaOekaSiq6+ts7WilaWriJqJkoqWent+hH1mYGhcZWJdY2NeZmZeW09DSUhUT0ZITEZKR0VGSEFLRkNGRkE6ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoGUhYiCnIOSkI2S2sidlnNWl4iPiJyPfIaMjoqKeoiCh5GOg4WAi4WGh5KGgoSJhoiHh3FuYUBFNjQ8Mi8xMTAtLCstMS8tND9EQU1VUVJTVVVXVU5bUEdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHHw6uzxrattL+zuL62v7TBtru7pLjGqbbJx7W+ubSoo7StsbGcmpKan4mnr6uklXafpJehq7GzmJaqraiutruyuqyvtaKxrLG1vLe1rrWgp6ijqJupsK2yuri4p5u3qY2ljpGToId5gYJ0WGFkVmVhYGJfYGVfWlVKREVMVVFISkpESUdFQUBAS0RBTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxbWlFjZFd6dXGClH2FhpN2hX6AjXu/u6O8grSUk42bj4SIj5KJiXmGgIyTjIeFgY5/gYmOhoCGiYWKh5F6eG5dVkBFTTw2OjQ2QUI3NjUwLzZDSENRXE9RVVdVXFdQX1VJS0pBQD9HS0ZFRDs+QDdENz9CSkpFR1dUUF6Ppa2jsbTDtrjBzMm2vMW9tLTAt7jCtb+wuHSytKa6xaSwxrmxs7G0qKS1tqqxoKKWm6KSpbGupa2sp6SYoKyzuqKpsrq1u77Mv8XFvb2zwre6uL+3ure5rK2wprGqrb6wvbvCwqyZuqiUro+YmKuJfoF6aldiYVhqZGhkVlpjWVZUSUdHTFFHQ0hJQUhEPj9CQktAQE1DOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZRTEFMUldUWVVad2pwf4+EgY6FbnpyeYhiuKGZo4mVk5aTk5ONkJeSh4d7hoGNlYqAhICJenyLh4Z8ioOBioOVfXd5dWVPXGRHRUw6UWRhW15TRj87SFBEWmNRUVlYWWdaVGBgTVNPRUE/SUpIRUZBQEM9RTZCPkhHS0xTWlRdk6+4tbq5ycC7vcnMu73Au7e1vLu3vrW6ssZgdbOlsZqeq72qpairqqOisrWhq6eelZafmKCupaenpZ6klKKnsbSnsrK8tsG908nK08bCxczCysPAvr2/u7y3tLC5t7fDusa9w8mwnrmqoqyPpai3iYF+cV9hYVxXYV9oZlJYYVZSVUlFRU5LQT5HRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFRSUFBRUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWhsbHGQjYWQdG1zcnOI1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaLf4N/gnh6i4OHe4t5gYqCl390fXprZXB1WV1cUGVlYmBlZF1bWFdcTWRtVVJtbV5vX1hnZVVZVEpEQUtLSEZISEhIQkk5RD9IS1RUVlxaW5K5wLm9t8bAu7nKy7q2ura4ubO4tbSutraZZHWonq1wXqKsnJiho5uknqullJ+fkJSOlpiXqJ+mn5+amYSknaylqrCtt7C9udTRz9fPyczSzM/OysfAv8LKvcG9wsDFxMbKv8jOtKS7sLWwm6y5vZp/eWxdYFtYXWFaY2JRW2BTUUtDQUVGRDxART5CSEJAQz06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaV9wl5KRlG9sb3V1iLOsoaGfi5mcmYyMlZGbkoWKin6Ih4yQi4l8gYRze4mDhnyJdIKKhpV/c3t4bG11e2hyZWlsaWZqaWhgZmlobVptdJetpLyIh2dbb2hdWllUSEpOUEpLUUxUUUlMQUpHS1BfX2JmaWGYt8ewubO7vrayxMe2sLmxsLuss7Gnqresjbannpunmk+bnYyOoJaRppillYqTk4mQiY+RkZ6boZiblZeHnpqmm6yvqK+ns7TU1NXW0svP09XO08/NxcLJ0L/KycvJ0sjNzcLQ0riwxLzEuqa2u8Sjgm5jXFxdWGBXWmZaUFxXTlBDQkhFQkk7QUQ+QUg/P0I3O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OT05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VXc5CQmINocW95eYOgqp6ml42bm5eLjZWRmo59iYuFjoqKi5CIfISCcH+HgYZ7h3KDkouPfXF4dWxxeH5xe214c2xogHBtY2ltcHlpd31+y7/C36dtY3huY1thYEpQUlVOWV5QXV1OUU5UUVVUXG5ud4Jylq64rLSnsLarrb3Asau1pqW4p6yuoay0o46xrpqYmIyRlJGEjpuBjaaRnImDi4SKiYSLg5SVmJeUm5GcmJmZnp6rrKSnoaysztLV0c3M0tPU0NTRzsjD1NHIzdLT09fN0tHF0tbGwM7HyMOpv7jQnnluZV1iXFZfUl1bTk9TUE5IPkFGQUJFPEBCPkVFPj8/Oj09PTxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WGhYp3bXdwfX6AoZ6eoYuNmZOTjIuTj5aEeYWQkI2LioiRh3+Ce3J+gIKHeoV1hZORiX9vdnNsc3x7dnxzgXdxaoBycmlvcXp5cnu+y5p+jLGDdnKEdmhhal1DWlpbVmZkWGVrVFhdXGBjXWN4e3+LgZmqpKShoKGppqqxuaqmtKOiraKjraKnsZ+JppqUkpGKko6IgpOJa5WijZiEgYV+kYODk5ati5WNlZmOhZKQnZensKGgoaSkqMfNz8jCy9DT0dTSztPNxtbSzNTY1tbY1dfVydTazcnX1tHKrcTDzIpyb2JgX1hTWVJbT0pHSUlKQDs6O0VBRDxCRD5IQj9CQjs7OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN5coKJgZ2VnZSFi5aJj4qIjoePf3eElJmLjYiIi4l+g3hze32Dh3eAe4eRl4GDbndwbXV/dnh9c4V8eWyHdnRvfXaEdXl7nbWMPEGKxqV+jXxpZVZJQ2VjZmNoamRveVtfZmhrbmlugIOJkYudnqCdkJeYn6OjprKkpLOgoqWeoamgorGchp6SkpKQi46LhoOPhH6cm4yNgoSFepR+gqmVo4ySipiSi32XipqRq7OYmpunnKe9w8a4tsbN0tDS0MzSy8nUztDV2tfX2NTZ2M3Y287J2trS1r/MzLR3dm5kXVlSVVBZVkVGSklFRT06NzlAQUI6SERARUNBREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGFxcXOGjXyXkZ2LfoeSgomGhYqCh3x4hZaXiI+Dh4aHeoR5cXp7hIZ1eoWOjZ16jHB8b3B6f3J8gXGDh4Bujnp1d318gnV/fIeIsHRYqcK2jJKBcG5iPV5ocnBxcG54d4JlaW9ydXhye4uHjpSSm5agloeMk5ugm5+qn6GtnKKamZ+lnp+smYuajJGSjYV9iIeDhYuOoJmTiISHfm2ZeYSYhoiTjI2VjIZ7m4iTj66qlJWXnpimrra9qK29xsvIycvLz8nD0crU1tjX2NfU29fT2dvWz9va0dbI1cuVeXpoaFtZUFNTXUhCRUlJPkE+PTc6PT87Pkg9QEFBQURBPj86ODdEQjc1NTQ3OS41NjY0MzU1NDIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2FWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OTlEP0NHUmtfbWRiZmt2gIhxkZCbgHmAjn6DgoKFf4R8fISXjoeLfoaHgHeCeW57e4aBdHqSno2hdo91gnR1gX10gIRvgZCBb5KEdHyBhXp2hnuJt8akwsm4gZabj3hwZU5mY4F6gXeGopCLeXl3e4N/fIR2bZSWlJWPl5CDiY+WmpeXppyYoJefk5KXo52Zq5aRkYuNkoOMhYmIgYWQkZ6cmYmFi4GGl3uIiJ+XkImNiouCfKGJkIu8oZiTl5mcqKalrp6ntb7AwLnHyc3Oxc3K0dbV1NnV19vU19na29fb2tnYztvGhnp5ZmhkX1RXVlVNS0RNQzs9PTw5Ojw+OT5BNj4/QDw/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs6OjdJUF1aUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eop8foB/gH2Fen6CkYmEhXqFiHt1fXRufH2GfnR/kp6Rn4OSfIZ+eI59eIqKboKagHSYhX6BiYV8fpB6j6mPkMOgvIyco5x9iYR9iXOMin5zppqcmZSFe4+QiYRoR3GhpJ2Mi5CShYiLkZKVj52ak5WRl42MlZ+dlKGUko6OkIt+kI+Oi4SJkpaan5+JjJSSnpGCi3+mmYiFjoKGhIClhoqMuJidkZSWoaegnZ6do662urWrv8XK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfct3h5d2ppZFZgW1NPTkhETEI9PT45OTo6OTk8PTZAPj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmBj4pxcniKe3t/fX98iHp8e4uHgn51g4Z5c3pzbYF+hH13hpuhm56UkoCLiH+Yh4Cckm6HqIV6oIt8kI6DiIScfpqRio2joqCQpK+fi5GLhYuBkoZXcq2Ln6ycj4OYm5CQjlyDopGCjJ+TlYyGiIySk4yUlZSQjI+KiJabnY+VlpGLkpSGgIuJko2Kip2WmaOjhpOdlqGLioiOnJCDiI+Ag4eFpIaMkLOYnJKUl6GhnpmSm52nsbispbzBx83Hxs/Mz8zP18/R1K7W1dja2dra19bZ2p5vfHRnZlxdWFNWV0NASUQ+Pz46NDk6Ozc6OzozOzs/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieG1ifpKDbm13i3h5fnqBfYZ8e3aGhIBzcIWCe3Z2dXSEg4V9fpKmo56mopaJnZCUlouKqJdyirKNg6aRhJmThJmMopagmZOJmp2ikqmvn5GUkI6NiJWLbo23hJrEyLKdoqWbnJiWkbKQY6TNyJWOhoeJkJKOjZOUioWKioaWmpuPkJSTh5WYhICPi5mIjZCql5eko4iZnpabiY+Hl5eLhY+MgX+Gj6WJjZOomZeTlpihmJ+Zk52borK0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6Ccn9oYl5dXU5JVFlBQkdEO0E9ODM3Ozw6OD02NDk6PDo4Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj48ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdoGOfXxtfoh4en56goKDfnZ2gIJ8bG6Lf3p8eHh8hIeKfoqjs6ejqrOhlqefpaOWla6ig5C4lZKymYyhoYykm6+jpJ2YkKeWp5msr6SXlJaVkIuYmZagwI6jybmrm6OmrZiRm52ynYWFqKKcmIWJiY6VjYuTj4iBhoeJk5iVjIuUk4eUmIaEkZCcdJGYspaXpaGInJqTkIqRipebiYqWjoZ9jJieiZCQnJqZk5iXn5SgnZWem6CxrqKkt760xcfEvcPDv8bNysnSps7N09LQ1tjT0Ni7cnl2XWBVX1ZPSEpOREJDRTU+Ojc3Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OklFTkVEOjZBQEJTPjlETzMyMzU2NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdOW1xZSWZgO0iEi3p7boWGenyEeIGFgX5weHx+fW9yjXp9gXx4houJhoSSp7usqLK9r6Sts7Ooo6KwrIqatJ2iuKSVraSXqa23pqSjn5mpl6mjr7CqmZiclJWRl6CYmru7rsqhara4q7CUmJ+jq5OXvqNeqrKCiYqNlIeRfI6OfYOGjo+UlYiHk5eMkJWNi4yXmJKcmbSXlaudi5yUko6QkoyZm4qRnpCLiZWfoY2UjZiZnJKbmJ6UoaCUnJylr6ihpLO4q8LIxLW6vbvFx8fC0aDGyc3NxNfW0cvUoXB6aFxaU15RT0VEPjxDQUE4Pzg3NT9GPDw1PDM1MzQ1NDU0QjM5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRHYmBicEpAi4p/gXOGh32CiHWDioJ/bX19fH9wd4d3jYGHe42PjIaMmarCwK+9xruztMG8tK2rs7aMp7Ktrb2qm7ukqK25uKumpqGio6Oor7Kxqp2cpJibl5eeoqalkqS6rqnAvK2tsrmlpKd+iIacrb2wg4yMi5CDj4ORj3qBiJCNjpyIh4+XjYuVl5SQmpedqJqxmpGsnI6aj5KOlZGQlpeOkaCRiZSbo6yUlo+UnJ2ToJ2bmKChlJqep6akoqSws6fBxsOvsLq2xcTCvs2mx8THw7zV0c3Eyoh0cmFbWV9bTUpCTEBGRz5BP0I7OjQ+QTw9NT02PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQjVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFSkhOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxlR2BpZ1pdXJOMjIh7h4uGg4x1hpGKgW9+e4F/cX6BepV6kpSUmJCTlaezxsm/wszBw7nHvLqvq7m7l7K3urLArqXApKuvu7yqraujo56nqq60sKqboKqboZuVn7C0p4ujurq2wbysqJyypaSolIWOqsTEpIKLj4eIhIaVlI16g42Rj5GhjIyUko6Il5+Xk5mVmKagrp2MqpyOlo+SkZWVjZCVkY+hlIaXn6CynpSalJ+hmKSfmqCboJSYnqWjpqakr66lv8TCrqi3tcnDvrbOssS/xLyz0cnIwrV0eGxcWFtpUkxIRExLS0pBQT1DRDw1QUQ7OjM9OEIzMzIyNjNBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJmWk5lXGZUY2qZjZeKjIiSkIaJeYaUkIFygHyNf3iHgoGQeo2hlqiampi6vcfIycHSycrCzbzBs627vqe6wL68xLeswamss7u+qrCppKWjrK2zrba1oJ+unqWimKOzvambqL3Bo7e3sKuSsK2rrJeHmqqnpZGCjJOllYmBdoqSeoWNkpCen5OPlIuPjZSjmZeclZWjnqmfkaWajI+Pj5WWiHyPlZKSo5qVoKKctaaQnpeko6Klnp2mmJ6Vl5uko6inorKsqLzAxK+ls7fMwLmuxLO7vsK4rcLDwsCZbXlhWFdbW0tLTUpGRERJQkJBREw6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djpeOnpKJin+JoJOEeIV/lX9/kIiKkICWoZmupqOYwr7Hw8fF083Ozcu8wrewuby0vMu8w8G1truts7+5vK6vqKCop7atramyt5qerKKnoZ2rt7ippLC/xLG+ubOnqrWzra6XlqWsqKCRjpKxxaeVjn2RlX2IkZmQqpmYk5OPk5WTpZ6TnZmUoaOinJifmIuMj4+eiFqQlpeSlqSZZZijnrKllqKWrKyqp5ueppeYlpiVoKOopZ+2q6m5vMO1prO1y8C4qrassrq4rqi4ur24gmtuWldUVE5GSlNOSz9CSERESEdHOTVGTTs+Nz1ASi4zMjAyNUI1NVBWTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs9QEJGQnFGaUlSZWJMRqWUnJahl6mWjZGDh6aTiIKHgpyEg5WQkJOOmqKfr76uoca8xcTGxs7OztLKvru2sbq7vL/PtsS9uLi3srG1s7izq6acq6u4qqinr7CXo66kp6SktcCwq6y0v8O6wLqzp7m1uLKulaWtr6+li5OVoY10wZp+l5mFj5aajLGVmpqVk5OZmaWjlZ+blpqpnZyhoJmKjI+WnWBKlpyalZqlllSWsJ+vnJ+llK+uq6WaoKWUk5iYjpyfpqKZtKmqs7y8vKqwssfAuKWrq62xsaOhsrK0pHBtZlxaTlBLRVBQUFE7SEpJR0lDQz46S1U/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiql5mgoqivmZGXh4unlo6Jk4Wfh4Sdl46doZqjpLXItKnGusLDx8rIyMzNxr67s665uMHBzbXHusG4tbqwr6+ztKajm6q0tKqopq6smqStpaSnrLq/qKu2t77Bv765s7LEsbm9rKOutay6poicmKabdr+ghZmdjpOZmouvl6GcnJeVm5+hqZ6ooJqaqpmhp56YkI2RnYNudpKimpWdop6QrrKiq5WoqpeqraOjn6WokpKZnIiUnKKel7Gnqau6tr6zsq2+ubego6eopaecnK2pqYxiZWBfUUtNR0hOSVVMPU1ETkpLQkNEPFFVPUFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5SYE1VSH9lXkhFq5WcoZ+7r5mUn4uTq5uRkpOJq42Hop+MpK2Uo6O2xr20wbrCwsfIxcLNyMG9ubKvubTAwsq1xbHBvLS6qqitrbCio5iqtLumqaarqp2or6ejqqq+vKetvLS4vce8t7W3wbG9wLOptberv6WPo5iRoqC8n4maoJmXnp6Pt5+pnKWjm5yhmqils6GbnqacqKqemZWPlJuLl4mMpaKUnaKeoLSvpaWTsKuZq6udnaSjqJGVlaCDj56em5WppKGhtLS6ta2otbKznpyipZqXlZmqoZ53YFxfXUpIRkdNUUlNRUZHQlJMSkJFR0BWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6Z1xGQ0OccGJHRaeXpJ+ew62bl6WYmamclpqaj6qWlaemla2tmaGrtsTCu763wcLAx8S+zca7vbmyr7izv8LItb+vu7a4tqakqqutoKCaq6rEoqWoq6aeq6+soqmov7emrb6xuLbHtrW5uL+yv8G3tbO0r76jl6OWlJyUrqCRoqKlo6OfkL2kqZ2oq52doJumn72imKOfoqmroZ2XjZWek56Hj4WNk56koZ21rKaclrKnma+nn5qpnqCNmZWfhI2gmpuTpaSamKuxtbGqpaqtrJyYoKCSjpCWqJ6UaGJZYV1PSUdKTkxIRURJQT1QSUE8R0lIW1JPSz1IT1U0QkY5PkhHNUNhW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDPEM+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROm5SRjxLeGViV0yimqOcnsWsoZ+snp2uoJOjn5aloKapq5e3saOqs7XExL2/tr/Cu8jCvsrItri1tbCzs7fBxra+sLi0uLWfpqyqrJ2dnqWkwaWgqq2fpKmtr6Kmp721pbG8ube2w7Kzt7m/ssTAuLius7W1o52llZKUoa6gmaKdqairo5rCramerK2bm56ZpqG9op2lmKurrKahmY2Zn5KfiY9Xf5afpqGguKqnk5i1o5+yoaCbrpaejpmUnYKOn5eVjqKklZCmrrKrqaGipaWVlZ2Yi4+Rk6SeiWFkWWNgTEhKSk5GRUFGSz49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dySEU2PXVlXEtOnp+hmZ7DqKWitKKcsqiTq6SgpJ+tqaydvLGorLWxyMXBwrPCw7zGw7zEyryvsLatsLSvv8S0ubGwubSsmaiwqamanaWhp8Ktm6yxm6qirrCppKe9tqa3u72vt8Ots7LCwLLHs7q3rLS2raqippaWlaSsop+fmqirsK+vu7KmoKmomZmYk6KkuKChpJOvr6ylp5+SoZ6Vno+QjZWdmqOfp7Ompo2YtJujrpqem62QnpOXlJqAkqGWjo2foZOLpqywpaahnKCekpKak4WLko2cnn9hZVtnZUpJTEpSQkNASUc7O0c/OTlPTVVeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ+jn5ygw6ikqrKho7SqlbOsp6KksqyuqbuyrLC0tMbAxMO1wMS9ycS1wMjBtKu1qK+4rL/EtLeurLa5pZmrsauql5+ml627tJuosJutn660sqequbKnurO3srnAqrexw720xqe+r623taqorKGXl5KmpaKjmJilr7iusrW2oJ+opJmVlZOkoLejpKaWrrKyp6umoZ6bmpuWmKifoJiinq+yoqaNl66ZpauXmZ6kkZuNk5eahZaflIyPnJ6Ui6mpqqGnoJmelYyOmZCBhZWJlJ94Y2hda2pNUE1OVD1DQU5DOjpJQDc3Uk9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJcGhWQ1dGjHlmQzuko52hpr+mqK+voam0q525sKujqrS2sbC5t7C3uLjEvcPHvbzEwcbAuMDGwLqptqSsu6zAwre3qayxuqKVrbCtspalp5Gquamgp7CdqqCvtLOqqba2rbuss7O6t6y4sMO6vr+mw6uwt6+pq6unnpiZq6KioJGYobGvs6uwuZqcqaCZlpKXpqG3qaWjorCxtKuyqKufm6Cgm56lnaKXnaOzsJqfkJOlmqCompSinpWYiZSYk5aXnZSIkJuZlI6oqKafo5uXm5OHjpmLfYyWhY+bamhsYWxuV1BRWlRBQ0VUQDs7SUE3OlhQZF5QVldEWV5dTUxSTl5LSj5aY15OSFBOW1VZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT0qJys9XHA9PjEuMWVbZEAxNjQ3Z1lgRig/OGx9aFtWO4l7Y0M9p5+coqm9oauwq6OxuKmltbOsoK21vK6zuLy6vba2wMK/yMS5xMHAwLjEvcC3r7anq7exu76/tKmusbael6utqK2Xp6iOp7ufpK2znquisbCzrKm2tLW9ra+xtaywtLHBusW3q7yvsbisraqjsaafpaqgpJeQmaCzqrOqqrOanaebmpWOoKaktK6noqytrrGns62yqqScn6iknpWhmZuotamXmZKSn5meoJ6Qq56Xl4WVl4udmZyUio2Wl5qXpqWioJ2WlZeTgI+UhXuOkoOMlmVscmdwcV9GWWZWRENNWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7R0RGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2FVMTUwPWBWXjgpQzNZVFxnSzaMemZMQKSaoKSstqStqaWvrraqr7W6p6awt8W3sbe+wcK0tLrFvszFucLAub65w7fAubK1rKq6trq5vrSqrbG1mJinrKqrm6urjqu9nauusaOroLCts66utrK5t6qurrKota+zu73Ksqq2tbG0r66nobOgm6itoKWVlpuasqOtoKavl6GkmpqSjqOlp7OpoaayrKq2pa6xta+kmZ2tp5qYn5mZrLijl5OQj5icoZiXlKufm5KAk5iMnZyZlpGKlJOemqWioaCYlpGTlXqLj4V7jIqDi5JrbnhtdXtgRWFqWUlIWVo9e0pGRDZBYlRpW01cYEpcXVpSU1JiYUxLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENfUVwuKkIvSkdQW0gzY1lUS0SZl6CxqLGqraakr661qbe0uaSss7fKurS6ur++tLO3w8DMyLzDvLa9v7+3v7yxva6nuri3tsK2q62xt5SXpq6rp6OwqpSvu6SssbKnqKOxtLCxsbWxuLOprquyp7evtbTDxbaptbassK2pp6O2n6CnsaCklJyalbGep5ygqo6po56blpimpqW4p6KxtKynsqetsLaspJmgrKibnJ2blKq4nJSOjouZnKKXkJiloZ2UgpKWj5ycmJaViJeQl5qnnKOgkpaQkJV2hJCHe4WBhIyLbXF3dXt+XEtlbFxLTmNcPmJ7R0k4R2dXZltMXmJNWFlXVFhUaV1PT0hhXV9QSkhRVlVSS0lXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydHYkxWJS1CLj1FTFE8M3JrSkNDkZmlrqWtrqunpbGys6q3sbegq7W5ybiuwbvCt7KxtcLCzsXAwb20vL+/ur+8ssSoqbiwtra/vK6rs7Kcn6exraalr6WdsrWsq7GxramotLqstLK1rLStqqyorKm4rbGwx7+4pbmwqa2tpaitsKakpK+kqZyenJuvmaOjoqORrJ6joKCiqqamuaWstbWkqquorK+2rqOdo6mqm6CampKktJqPiY2HkaKglY2UnaCTkYSOk5KdmpiVlIeXk5WZp5ufnoySkY6Qd36NhX18fIeKiXF0cn59fVxTZG9eTllmXEZElltHO05tWGJbTWBiTlZXVldUWGdeUVJMY1pbVEtHT1RTTkdJV1NcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGVISis6ST8zQklTLD6PazxHSI+cqquiqbGkqaWztLG0tbKyoautvMy6rsC7x7G0rLTCwtHFxr7Asr3Awry/t7zEp6y3rLO4u8Cwq7GtoKOnraqopLCjqrGqr6ywr7Cvq7O7p7axsqmyqaumpaOtuqyqscK5tay6qKmoraqosaWqpKOuqqiin5yjrJWlnpiemaydoqepoqymo62suLGyoKmioKuvsaydn6eoqZmjmJmPoKeYhoSPioueoI+LjJacj46Gh5CUn52WmJWGlpOTl6SbnJyLkpCNiX5+h4V8d36HhYZ0c3GIdWtfWWBuY1FzcVxLO4R8Rj5XdFhgWk5jW05VVlVXUVxiXlNPTmhYV1dLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLkpnREY4PEIwNUVLWDFAlFo+TEWVmK2ooaqznKqqsLatuLWuq6Wqqr3JvLG9t8KvsayzxMPOzsO+v7PAwsO6wLPIxKyut62yuMC+s62uq6SnqrCpp6ixprSuqrCurbGwtK20u6S4s6ysrqeroKKer7eqqq26tqW2taOqp6ysqq2hqaemsrKkpqahoayWqqGVmqCmnqSiqqWtop+nsbetrqOlopuqq62pnKGlpKSYoJqWj5idk4KDkImFnKCMio6MmY6Qi4OMl6ObkpCbjJOSkZSimZuZio6LinyGgIGDenSAg4F+dHeMo4h4al5gbmdXZYdjTj9nk0xFYnlXYlhSZVRNVlVVVE9cXWFVS01pV1VXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxDKzpKT140RIY+SEZEl5KwpaOqsZirqq21q7axq6Wsqqm8wMC4uLO7taWysMTJy9G/wbu4v7/BucG6wcSusbWxs7rAvrOxrq2rq6i2qqaur6q5sKixsa+yrbaqt7antLesrKSpq5yjnrOzqKiktLSgtq2gqairqaunoKusqbm2qaqqqqKpoKyckqmhnaCkoqajqp6cp7WuqKaqoqOYpaanqpyipKOfmZmgkY6PmY5/h4yHhZ6eh4SKio6NkI2DhpSimo6MmpGSkY+Sn5aYlouKg390hoF/f3l0g396eH+BiJ2Pb3FnZ3F4XGBziGtPXplWSG14VWRWUWJQTVVUVVBPWFtiVUhQaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg+Qyw+TFRfL0pqNk9EO5aOsKGmq66arKWtrrO0r6ulsKqpur67wLCuuK2htq/Jx8jRwL68urzCvbrDwb+/rrKysbW8u8KxsbOrs6iktamlrbOyubCjrreyr7K5q7mvqa22rKqeqayfoqC1raihn6+yorSqnqinqqOroaKsrai9r6yuraKoqKCsmZCvoZiioKinnqibmaqwqaOfraKhk6Kjo6eYmqmlmJeZnY+Kh5WIfY2GhIOjl4WCgouGjo2RhISToJaHkJyQk5CNkZyUl4+KhoV4dIF/fHV4eYB7dHN6aYGGo3VpXmVrgXVmiIt9UlhwXUp4c1NkU1FeTU1SWWZOTFZZZFhGU2lSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwvS2c6NDhfPWFkP0YxQ1BbWytITjlVQTSRj7KgpKaspKekrKa0srGqpLGoqri+wbuvp7mqpq6wycfI0cO8v764vr+8ybzBuLCwtbG6u7jAsrO7rbitorSnp6yytrmzqKi8ta21vLC9pqystautnKmvo5+kq6qnnJ6qsqSzqJqqp6mkqZ6jqaepvau0r66dqaSgrpybsqOVpJylpZ+km5qpq6Wem6qhm5KboaWdmJepqJKYmpOQioKPhX6Pgn+HnY+Gf36Mh5COkIR/k5uThZOhjJSSi5GakZWGiX5/cnt5fXxod3x6dXBwfWiFeISIZGFoY3KFeWxmeF1dVUFWem1UYVBSWEtLTnF1XUhaW2dZRVVmUEQ+Sk5EQ0E5SEdLUz9qYUpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtL0ZqSTE0WD1mY0JKN0dTYFUqPTtEWD8qj5SxmZ+gqaWkoaukt7Kypqmxp6y4wb21sKO5rKioscPJyc3Btr2/tbe/uci2w7W0srWxvbi6vratuba/raGzp6qrsLW4taufvbypsr+zu6Cvs7WprJ+usKOcpKiqop6cpLCmsKCfq6mooqqcpKigrbunrrCuoKujpK6enq2ml5+boaOcn5yao6qjmpqkpJWXlJ+ilpuXpquLnpGQkYyCioGAj4B7mZSNiXx/i4aPjoyKhJKYkYaUo4mSkoeQmY+TgIh8eWx9dnh4Y3t6cXBxcnhogHRqg2dkaGFuc41sYWlvX28/W3hsVV5PUVFKSk1UWVdNXV5sV0RYYE9eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDBBaFkxM1M9ZV9ETDZLV2VPKjwzT1k9I5OZrJmfmKekop+no7ivrqOvsKqruMK6s62fuK+rqLS7yMvIv7fCvq+0vbfEt8Oxr7qys8C1u763qbm4vauktKipqrCuubGqm7u9pLC/tbWhrra1pqensbOgnqSmp6GlmZ+sqKmeoKqvp6GnmKSooLC4n6Sxr6CroayknKanqZqanJ+jlZ2dmp6pppebn6iSmJOYnpOZlqGpkJqJjpCHfYd/go59fKCMjIh4g4uFiYyMhYiSmo6JlZ6IkJSCi5aMkXyFe3NwfXFzdGB5eGlvcXBvaX5xY3psaWVjYGaFfl9ac2pxS0x+aFhaTVBMSkhQUlBJTlxfblNEWFtSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUyPGZkMjRNP2VdRk89UlpoSCo+L1lYNSiXnaaZnZatoKChpKG3q7Gks7SqqLnFtbKuoLesrq2wtcbIwbe/wbmwtLy3v7u/r6u9sLS/sb3Duam7urenqLWoqKuwrbOwp5q+t6WtvLWvnrC3sKilp7Cym6CkoKSkoZecr6ahnqKnr6KgopOkpKO3sKGmsauerKOvmJyqpamemJuepZObnZqdpqqanJyllpWXlZ2OlJejqKGQiYqQhnqFfoSKeo6Xio2GeIGHhIiLjoWNk5iNjpaYio6VfoaXi495gHtwcndvb3RfeXdkbGxraWiDbWVyamtlaFxjc39fWmx2aVpIfV1bWE9PSkhIUlVGMjleXmxQRFhWWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0R0FmW0hURFVdaEUuOzJgVCwylqOhl5WcqZ2loaKgt6qvoLq5pqy9xbOwrqK1r6yur7TExL2zv7q3sLO5uLq4uq6uwLO0uK+/wbisvbq1pqKzq6ips6uusqOcwramqba0qZ6yu6mmpqmwrJmip5ykppSYobKlmZ6kqamcoqCTpaCkuaikp66nnaWhqJOfqaKhoJmbnaCSm5yXoKKrm5uZoZWSlZaajZSTo6ekj4iKj4Z5hHyFhXycjYmKhniAg4eIiJGFlZOSjJCVlI2Nk3uDl46Kd357bHRybGxzYXh1aGhqZ2VvhGdoaGRmaWpgaGJpZlplemNhUnNUW1tTTElHSU9TQCEpaV5qTENWVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRCM0NEZ1tLV0dVYGhCMzc4Y04nMp6ko5KOpKacnp6do7Wtp6q6t6isw8G3sKyitK2nr6+3wMC9scG3sa6yt7a4t7asqr2zr7KxvcC3rry8saWftqympbSpq66gn8Osqaaws6ustLqdqKqrsaWYnaqep6WRmaatopmepKmhm6Kdl6Cdp7alr6quoaGenaGVoKafoqCZnJqckpqelaaeraOYl56VlI6UmIyPmJqooJGIiYqIeYV3goKCnIeLgol7foSIhoWQhJaVj4+PkZGRjJJ7g5WNhnN+fWZ4b2tqbGd1c2tjZ2RjdH9iZGVmZWlqY2lwWV5YXWxkYU1oV1pgVklHSEtNUlg+OV9saUdCVVNcW0lJR0ZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTszQWVIJTWbpKCRjK6gmZiglqW0saKxvrehsca8ubCxo7arq66pub28u63Asq+urbavs7izqKu5sq+ttLa7tq+4va2mnrWroKGxpauvn6XDoLKjrrGvt621na2vrK6jmZynqqWflZuopZ+ZpaOpnZqgnJSbna2wprmorqOimpqemZ6jmqSdl56Ym5SaoZKolaypm5ScnJKMlZmOlJSZqaeNjYqJj3uCdIKBipiFh3yJiISEioyIkoWTnJKSj5CRlo6Qf4CNjYJvgX9meW1oa2pncXJrXGhkYnKAYGRnam1sZ2poZmxcbG11cWFUYmhjZVlJRkxNT1hRUFVhZYFUQFZTWVVGSEZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDo2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUllQyc0k6Kbj46xnZuToZqpsrCfuMC2obTCvL25saW2r6mupbe5t7isu6+tqqu3qrS5rqWztrKvqbG2trGytbqoqZ+2qZ6fqqKqrZyqwZmupK6wtrWsrJ6xra+qo5uco6yonJWcp6OdmqmjpZaaoJ2Rm6Orqqm7n6ekoJiamp6hj2uilpiccYKWnKSAdpGrqJ6WlqCRiZeZgJeLoI95hpOMg21pfneDcGyGioZ9hIuGb15jYGeEl4Zri5CUknV3i4R+g49/ZoeAaHVpZldcaXNuTlBqZGZxg2ZeZGZubGleXl+JkIWHaE9LRDhFVGdeSkdQUFVVS0dTYG90ZUVbUVVQRkhGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsKzA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTZPa1tOXEtbZmI+RzFQZD0rL42kmYeVsZuck6Cbqq2ro73Fr6m3w7i9vK2ntrCmq6S4tLKzsbmtqqettKawtaOouLe2qaestrOutK2zoqmftKueoqScp6iarbyVp6Wvs7etraSorqqrpqGenKCop5yXoaalm5unp52Tn6CZkJ6nqqO1sKOjo52WmJiXo4ihj5Kah6GHlJ6hf6V/p6uek5Ock4mEcniMjoSIoXaIjGmXiGZ9c3igb4iHhH6NfH+hoJ+Zf3uInnSIjnabimyHgYNtaGVjemxxYlSGbWNtaZhxWGpwboZXXmlba2pbiHBteXKHaYeEWl5GTj5GXk1FUlZXUVFSV1RnXkxZS1JSUEVHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKS4xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxVmE3LyiMppeEnKucmZmdn6uqqKq/w6+yur23wL6qpLevqqyms7Wur7O2q6mlsa2ltbOcrbW3taanqLOxrbKor5+qobOpoKSkmqKkna+2laSmpra8pqynqaqsp6aioJmfpqOZmaajpJicpKmWlKKclJOipaaht6SkoKSYlZOYlJyIrpCYlImpi5ejnIWxgKStnpSanpV5gtSof4eUwZvHeXixpbeXZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4FslrGrsHloa1ixrm9labySvG5oem1yj9h+U2pjtrJ/gHGUdZqhqpBXT1dhT1ZORlRbWFFQU4tcV1tQQFxFUU5ER0k8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtdNDEhjqaTgaapnpednaWtsqmxwr2ytcC1t77Cq6azrKypqK+0qq+2s6inprWmp7iunbOytqumpKeyrq2xpqqep6SypKKin5ecoJ+wrZWeo5+0uaKpqKGtrqSinpuaoaifmJuooZ+YnqenkZynm5SdoaaioLCjn6CjlpaSmJKZhbBraoqNqn5nhJaHrWVxnp2VmqaVca6hpH53u3xroY92sV9qtFulgGWckWBmgXpmf2p4aqllvnJnpox2sWp8sXh0kpNjbW2nbluEoEVpZ4eWRXWcYH5ne6Ongllfi6tpgJR4emqnN0qvW1dUbGNbS05XX1xXVjtOiE9XVi9JVFNKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMxG5KilYKspqWfo6SqsbettL2+sLfFsri6wqepr6uuqamxrqSwurCkpK6zo6m5qZ6zs7GkpaCqrbCsr6aon6OisZ2knZiVmJudrqeXm6GftLKhqpuhra2gnpqXoKKpnZmepKGcmaGnpJCdo5qXoJ+rnqanoJugoZaVkZaRmoa1m7V4hamZtZl3h7Obt3+TlpeplX5rgaZ6gYWIkpSSd6tnarFbrHuOh5R0iXCPhoB/iJCXeIOCi5eMg6CPhbB2d59xa2psfItOpFhIY2OZfmNopmB5cnVSk4ZeUKltY3F9hoBinS5Rom5bVGtnYExLXGRYXFpCPrB4V1hBI01oRkNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjg0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dYN0o5YVU1MByWn5SIs6amoq6pp7Osqru2wrC8wq24t8GqrK2urqausqmhr7yqoae1raOrtaSls7Ono6Kdp6qyqLCopZ6gn6+Wn5mVlpeYn66jmpqkqLSuoamPqaipm56VmKClqZqfnaOfnKCipaOVm56Ymp2iqpylmpuboqCXk5GTk52D1ZOZuXCwwn7GhnzWlJu7fJqWpZCNm4ykeo2Ho4KlgnqseY+dVa97iX6farlauXeGg32mgpN8mHqqeY2dj3uxbo6EdJC7hW+UT6+nxYpRoHpjYKpic3KHbJeHX1O1tMiGgIl8Y6QzQp12XVFqaGRQQFhmWmRhSkhNbEtaU09ZZlpDQz9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw5O0RIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tcUF9mVDdHOmFRODIlnKGTmLGoqKWzqqW0qKW8t8GwusCxtbW8s7ansbGjsbOmn6+2qJuouq6ir7Ggs7SwoKSenqepsKm0qaWcnZ6rl5mXl5eWl6KrnpqXqK2wqKOfjqyip5ael5yhpqKYoqGioZqioqebnqCelZmapqCcp5Wbm5+hmZCSlZGdiLJuaLVxq4hwjqZytHNytnuamKSNj5uNon6QoKV+sHaDkdLRdVuufIZ/pG+bqqZrhoV9rX2XmY97sXOTnY54s2WWdIWebp5mlFLIi1rCXJ95Yl+tYHdzhmKXiF5Zyp1vv4F1TUu1U1XGZFRRamNmWEFPal9saVBVRkk5PVdSW1dYSEM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCTlRfZVA1Rz1hTTYyL6KdkaSvrKSqu62mtKWotru8sru/t7a0u7uzpbW0orKyo6CssKSYprqupLGwnLS4qaCmnaGqpbKorKqlmp2aqZ6WlZiZk5OjqaCXk6arsKWilpKsn6WSlKGcpaeglZump6Gao5+tmqCenpCWm6KenKWUnJaaop+VmJaSm4Wse3eodqOPioepb62Kg6iDmZmiipKZi6J+kpiJroV/grNccrNSrn6DgqR/cdd9d4R+j52GmZp3r4aKkZyHd7RhmmWagoGVbJJasFhLmnWYeWZgrV53d4dnmIhqXa93lZ6PeGw1eciusl9CVG9eaGBFUGxfcG1WVU0vZWNpU1lRO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6ODifnZSguLCYtMGtqLKnqrK6uLS4v7q4s7a9taW4tKC1rZ+gqauflae2rKiwsauttKSbqaCgqKK1p6aqo5melaWhlJScmZOWo6abk5CnrK+loZWYqZ+ij5GimqmmoZWapqmenaSerJ2gnaCNlJ6bnqCYmJuWl6KglJiRp52GqX19pXmhj4+DqnCtjIKnhpagoYqXl4ijgZCHlKp8gIudeW+xWqiDgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH2ClGySXKtbWpN/kX9oZ6pkc3uBa5iHcV2sWomgjmtuZU9KQ6FcWk10XWNmTVphX3N0X0pVNUqakllIRT1IRkFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8xVV9iTDdGSV9DMT44oZyZmb6smLTCrqutqaa0sLixtb+6urOxt7yqu7WgsaWepaennpOqsamvqrWsqq6hmKGgpqSkuqKjq6GXnJGioJWUn5qUmZ+gkI2MqbCvpp2Xmqemn42SpJioq6iUl6qon5+go62joJ2hjZShmJ+gkpyXnJWeoZWXj6ubj65tcrR0qYx3iqZztHl0s4CSpKOSnIyJpIeOdrhvjHuLomtrtlqhhmWXl2mgoqdtlHK0dJOYf7JqhpKIrWt1s2GdZqJuhpJql1ytYE2hfIeRUnOjbHl/fm6Yhm9cr1Y8nHdmVG9uLlunT2JTa2VibVliXGBxfGNTWVA+Pm1vM0JCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs8MDAwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VfYUw1Rk1eODFCOaSam527opyywK6tq6unt6m4r7XAtbyxr7m4q8G3qquhnKekop2Sq6qntaOyqK6qoZecqKCkq7mdo62clpmPpaOWjZ2hnJmdn5GTlau2r6eZlJusqZeMk6aapa2jkZersqOgnqirsJmgoo+Yopefm5abl6GTnamclJGrmYfUkpq7dLHEgMOGfdWWnLh4iJGXjJeJjKeHeaO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gIpumohwbY2kdL1dd31bYXm8altWW2l5XmlgZGZibXhvWVtZQ0FAcj9DRis1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC45Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QDmnmp6ivKKXscOwramqrLGnuK+2xLG7sq67sK7Bsqylo56koZybkaqkqrKktaetpJ+WmqqZpqy5naOumZWhkKWgk42co56YnpqQlpKvubCrlZejqKeUkZalnaStnpGgqKugnKCppLKeo6WOpqKVoZmcl5WkmI+woJKVqp6FkJm1gJGRjbiVeIKTm7V3bmxuc255j4SOiXOewbu8mnuBsqhwgHSRuYN8hoaLh417ioaNl3yku7m9nHV6s6N0dpd1dLB1mJ5mhmmNtnRycHe2jF6Aen2JZ4N5bXlii6xwdYV/WFunakRlWlRmYGNdYlFnZnFtdUJNUExEO1pMPkozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEFLTkdFT0Y/Rzw3PjcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVjgqT11dPSs7VlYnPTs8p56hob+llrPDtKyqp6yrqbuusMavtbSvuKe1uK2po6Kmn6CdmZSspK2qprWoqJ+blqCjnqykvqahqpiVnJGim5KPoaiik52XkpiUsrW2rZiepKSii5KSppylq5yWqaWmnZuiqaamo6mhkq2fl6Oel5eYnp6PsKmUnKeijmp+aZyneIlzfpqOdXplh3u9vsC6bpKDcZSGX3JqWl6aiWFkh46Va2CAlWNtnHZilGt/mpWUZV5gY3GbimhyjH2GlWdqfnF0eX18Ylt3dIFoUFxuhH17i2pYbHmCcklKb4VwTXRNRVddZmFMW1hnY15PW212anJST0RFTjtISTxNPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVERlVFS09IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SVJfSSdTYFY0KVBeTCgzPltPJz8yPqigqKHBo5q0urajrKWup6i1sqzIrLCzrLWjvrGypqCjqZ2jm5qZrKeupKW1qqWbmJWim6atqb+oqaaWlJuVoJqTmKWpp5GekI+YnLCyv6ybp56noomTkaqbqKSbm6ygo5qbo6esop+qopqwm5Wmn5aUnZ+dl7ClmaKomZyRnpyjpJmno5qcmpuakJaCaG58cXaRl5SRhIm0qY2GmJWOioyXl4eUlYqDkpORiY2RlJmTmJeaoKKbm5SgnY6CeqSFa2p8kHyAdImKgXGCeHl2doqAe4lqc4F0g3Vkd312a3B6bWBjXHBoTVlZZWpfV1lwem5uZlNPRlM5T1pOUk8oKzpKQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5TMTBUXjorPThdSyw8LUCyoLOhv6KksbK3oKmlsqelsLWqyautsaa1psCotKCepaWcpJaVoKunrKOjt6ygmZaWoJetqqbBn6yklpKcl56Yk5Sin56ip5KRmainssOvmqudq56PlpapnqucnaCtmKGbnaKlr6ahpKifrZiXpp2amqCenpywoJ2ip5aYk5mUoKKWo5+XoI6WlIuKjY6XrY97lZuCkoGJqaiFgZiWioSOn4h7hJCGhZmQh4aJlY6bl42QmJ6jlpqTkZ2Nfo1morOuhYmEdnqPin12eXpvZ3mQgYCJa3WBeYhyaHR/eXWDiIJrdGN5ZmBpZGNkZmpYa3twampcUkxQRF9VRkA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl1dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RdUTA1TVsxN0U0XEc1PCxAs6C5r76tq66ysqCqprKtoqyzsMWwqqyjs6+9pLScoKeioZ2Zl6imqaakprO1npWUnpmZr6auvqCro5GRnpqZlJGVoZyXqZ2FnqmsorPItKCqpKuWlpiap56pnKCkq5Sen56gqq6ppqOroq2bn6ChmqWenJ+dr6SZn6iTmJedkqWamKmempdmg5J8ZX6Omo9jeI1saGt6kKOra2WamH5nhYplZWloeo2hjmtojJeRondraouYo5+Yc2xueoSNhnlYZV2FgV5rioqBdltoc3d3kYCHgm54gniAc215hHN2iImPg3tqhVhea3RkXXOIaWt8cWxjXVFOV0lkWEBKND5GNz9GRDcxPD0/QUM7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSS83Wk82KUVZL0RPMVlDOz8uPaWfury5r6uzsKulqK2usKaurrC9samopK2wsZ+tl6CknqGamaarnKyjpqips66elaOQoq+mtrmlrqOPjpqhmZOSmqCZmaWWe6Wsoqizw7iloqevn56VnqOfpJykqqiSnqGeoKqvqqujqqCom6afqKGslaGbpbCkmJyrlqGem5OlmJ6rmZ5+voOIcrRyhZ6GrWh4ucS4cZKho3ummJlzqoJ8y8DAu3GLooeDn3yVmIiewL2Clp2ejZ3BwXuBepGMmsK/fWulsW+MgW/Ken+beJGDjoB2eYF/eXF6f4dvd4WMk3ltdpJiZl94Y19lgWJedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX15cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5IW0wqI0NQLyNGWzNQWS9VQUI7LziWo7jDtbCvwKmplKOvqbCvraayta+rpqamsaufq5iboqCcm6qnop2roqWppaS0pJ2jk6aurLi0p6+ikpGZnaWSkaChl5yfnYemq6Srrb/AsaGqr6qXkp+eopmipKqjk6Chnp2trqmspqOjpqClpZ2uqZGkm6mtqpydqpysopaYpZaho5icf86UeXqlgnmVlptfrY9ejqeAoaB8p5WbdKuDgK9eZI2peqeHhaB0l5KIs2OCq4ahjo2zaoSudHyWh7hhgq1Zo81uj3V723t/mXF+iJJ1f2V7h3Z2a32Ibn2FkJJ+bYGOYHFrcGZgX3hkW3FoamNmYFJUUlddSk9DNUFIRUQ4PjY7QD9BOz04QD4+P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKy0tSjAnO1w6TC0hUEBGNC4xrcLAwLW0sLeYnpGkqqmttKqlsqysrKSsprCqoKebmqaYnKKwn6CfqKejpqGfsKybnpamrq2xq6isoJSSm6Clk4+epZeeqKOerqSrsKi/xrOoqbGulpOdnaKXoKmqn5Whnp2drq+nqqmbp6ajoauSrbOWpqOrqp6jp6ahsKGSmqeaoZuUlJGXoHCFjJd1hKiHcbB8nXKsfqGfgaWPnnergn2tf5xyrX6rh4afdpiSenyXfqqIooyRi51+q3uIk4+ggHqtVpzEeo9vksF9gZVtdXCMbWZ2ZYZvYXducm+JipGQg22Rj2Vvc3VvYGZtZF9uaWluZmNXVFxhWlJSQzhJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz5XSi09Jz4xKTNWQEYhHEc6QzEuK6/UxseytJ+do46jo6KtrrauqLGnqaqorqurp6KjnZmilZ+mq5+ipZ+oqKKfnrCsmJuWqKevrainqZ6XlZqkopKUoa2bnaajrqyjrLWpuc2yraaurJeVnJ2imZ+urJ2WoZmen6mxqampm6upo6Krm6+xoqisrqaZpquqqrGjk5ejpZqUkoWkaqR1iXqpdHqycYKliZmMcIigmoekX2BSq4R/roKbda6Cp4aGn3qYloV7ZoCjiaSZhoGjfal+gJSHrl58qFWdopKBeqKfgHvDr8WMc6+zs7lxYqmvwnRojYyYj4FtmpJvbnh3d25sZmVkcXBme2ljXFdfaVhYVExMUUxDQ0FCO0NBQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmFhYF9eXVxdW1NJQjY3OTk2NzQsJiQiICgnIistIiQuITMtJkBEV0gsRys2NioxUEtMIyBBOUQ0LCfCydXWwKGZq6ihr6KfsLWwrqmso6imqqurqaSmoJuln52lp6ajnKyaoquhpJ+vop6bk6qktrCuoKmbnZaVp6SRm6Gon6CmnLCmo6ixrLbIsrWqrKqVkp2dopmfpbOdmqGUnJ+mq6ujrpqsqKKhqqKzraKqs7Kim6qor6+2o5OWpKeYm5F8qmyehId1q3l8sG6CpIuJoJaVn5WB0ri0uMmAgbJeX5Spg6SHh6B6mJWZeKrJc5mjlaipkJKbjH6biZrGxndloYKlc4GfjoJ9r15vtWOxdUujhm2nR4KTZI+QnpJ7cJeSfnB6dHx6bVxmanJxZoFpXmFYY21cXllJTU1LRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE9UUR0cOzxGMiwkqKTBxrmtqLKurKWinbK5rKqhpZuopqqsqaegpqWYqqOfrqudpqCsmp+ppZ2ntZ+il5Ooq7ayrJumnKCWkaatkZmcp6OgqqeuoaKmqbC0wrKzqq2olImYnaWboqOvpZehlZmcpaWrmq+draimnqyjt6yhsbmwnZuvp7O0s6WVmKikm6COgp1OeJqBf596hKN8gqSEhqaenJ6ThLh8fHm5gn7MxcK2eJqgkIuffpqWl4p1npeKpJmkqH6whZyEnoSsfZmUYaVso3CPhZCBfZeDcqxgpHNxgJpgvH1SVXWOkaOWe32SkYl1eXKEfnBbbG53cmqBblpjX2huYmRdS0xRVEFIR0ZJOjlLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMjpQW1QcGzY/SCwtIIyHmamspKu5q6+gm6Gss7Smn6CVpa6urqmmnaammqOnobKuoammsqCZqKSUorWio5WXoam1uaSbo56jk5CisZmenKemoaKvrpyjp6K1scOxraqtqpGHkZynnaOknaWXnpiZmaWjqJquoa2lppivpbytore3rp2etbK5srOnmZ6woqSeho/RtcO3eYeOhZGTj4CmeJSid4ygkoSlgotxq4aEtG5yaZmjnJWJn3yYmYaHj3KugqWboo2mi5OdiZSQm21wslylc5N6nGyZf3uZfW6pYaJxcX+fYnOyuGh4j5OmmH2LjJKLeHx4jYFsaHdpeHNuf3RcZGRubWVoYEpaV1g8R0dAVTNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVZWVFFPUVtVJSEyQUgkKSWSc4yKrr+/u7u1npeopK22oaKZlaOpp66pq5mloZ+loKC1p6Kpp7CjlKujjqSto52QmpqqtLSknaadqZKVl66goJ6npJynnLWZn6mjtqvCsKmrqaKNhI+coqGmo5aZmpyYm5ilpKaYq6etoqWbrae+rJW+sK2fo7Czuqy0p5upsqWomHqokH18sHeKgaSliJxtsm+hh618oY+DqJaZgKyJhK6Fn5SooKKWhZ+AmZWAe5J9q4CdmpaKqnidoI+Jk5KAea9do4F8pqdknYB8l3Rrrl2la3GFmV1gW4ygbpWRp5mClI2Wi3p5gZZ/amx+Yn10bn95YGZlcW9oZ2hDWWBbPUpTMlU4QkJDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaWFNQT05JNzA1Mi4qLEFUVlZWVVRVVVVVVFRVVFNUV1dXWFZVVVFIRklKIygovJKahKnGw7bBtJ+braCuuKWkjpuko6Cvr6qfo56drZieuaCiq6CvqpqtoZCqqaSWiZqQrrGspp+om62YmI+toqGepaKapZytmJ+opraov6+lqaSfjICOm5qgpp6SlJmalJqapaOjmairq6Okn6movqSXw6yqo6Kss7qsr6ehtLCpq5l2r36Qi5yFh326rYqYZLCMZZWtfaCPg6aVmoGsioSwhaWZpKGikISgW2xqgbNgf617e4KBsWxnbpmXjIixW320W6SDa8iiZZ+Be7xZdrVasn1Sr4B6rFiAoW2XjqiaipeQlZZ6eI2cfWRzfWGDeHOAfGFpZnBtZmVlT1VjW0FUXj1JKD45PTQhIiwlHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE1KR0M1NTMuL0BVWVhXWFdXWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7K3vbu0wbOjnK2mpbaooYuZoJ+ds7OpnqKfnbSYoLOoqquesK2eq5uVrqmijoibjq+sqKajqJmuk5mPqZqhnqWfmqOjpZmfoqmyqLyvpaienY98i5uVoaCZkJGam5GZl6ieoZioraelpaOlqbufoManpamiq7S2ra6noL2ura2WgamSo6+Om4CGpJeYj4GAuMO6g46ck4Wnl5yCrIqCr4imm5qlqpF+1b3CqmKjv718fqOCg9e6uLWFlJODnr2+hGqjgW+rhG6df3qysceDaquwva14d6K+u3SAlY2mnI+akJWceYGQmnlifXpjjGd4gXtga2VramJQYltTalxAVGFCTSk8OjQvHh8kHiUyIB0kKDA0OTY2Nzg7PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSUM/PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbS0sb+5sr2zop2upqWzpp2MmKW/qrexqKG/pqaxm56xnLmonq2vpaeVlK+sl4yDmpGvpqOsoaWcqqGYi6OSpp6nnJqhqKKZnqCrram5rqikm5eTe4eZkaabk4+RmJiPmJOpmZ+Yqaigqqaho6u7nqnFo6Cvo6uztauwqqG8qLCwmnR1qqS3hmWJn3BnrI+Kj21vd6SQmZ+Bda6ZlXCQjHGVp6ObmK6kcm1tbWWKd25tgplxgHlpcWlniZaVmHFoaYWGZ3CGZF6JY2pwWV1nfnemYGJxjpJvZmSAjZKOopeXmJCVnnyHjpR1ZYZ3aIxqeH55ZGxjZmxiS2RYSmtZOlBlRVEnSzkrIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJSts6q6ubKzqqmirp6ksqmYkr2xw8i9tamewKuso6Cmq5+6o6StrKymjpatqo+MhZWXrZ+lqqKfo6OgkYylk6eZqJmWo6qglpylpaevuqusmpuTknuEl42ll42RkJiUjZiVp5Sel6iimrCmnqKtuqCxwqiktKassbKrrqyouaSvuJaKoailtp2JlqKYhqmakJSdk6qzmZuiq6CylqKgnqCinKCkoZWrpoySk4yHkpyclJCZk5iQjpWGgaSal5WNi5OSio+GhH5ni4B0g3Z0iIxxp218lZGUk4GBj4+Pjp2UoJWXlaCCh5OMcGiPdm+Kd3Z8emlsZGRvY1VgWUBpWkdiYE5ZKkU9KyYiNzQwLh8cISUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5VUUpFRD45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqltbivrqKwpK2foLWxkY6rxbzEureqoaWdm6adsKijtqedqbSmp5GYrKOLiImPnKeWrKShmqeenpOVo5epmqiZlKehpJCap5mhtbqoq5iakI18gZSMoZSKlJGVkI+Tl6WPnpmon5y2o52nrbiosMKuo7inr6+wraqqtLqir72Zkqajprajkp2mno2pn42Sn6Osr5qhorCor5ekoJykqp6dnZyXq5ySmaGbk5CWqpmNmJiWkJaekYignZWUhZKMkIyUi4F+ZoyHdYd2eYiDc5xqh5GUlJGKfYyWkpKYk6GSnJWgg4aXhnlxlXJ4iX9xe35qbmRfcGlgW2BZbWJQYGRQWjpHRkU9Mz09Ny4qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZcXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlaSno7CzrK6jqaetoKi1qpCPnKWzuq6rq6GimXqdorCkpbGplpu4pqOUmamcjoaKiZuikK6epJaooKGSl5mbrouqlo+omaiMmKiPnrm2pKWYm42JeYGTjJqTipWRlJCNkpaijJ2eqJ6fuKR/hLC2o7GwdKS/pLKgeHqgq7O8lXaupJ+KgKp+ZFxidp+OpJ2Dl35uk7Oco6etq6JlnqCTc3mZlnCAmKiXbH+ip4llnKWbkJeYlouRm5GFnZqQlYKSh46OkomFeGuQh3aHcXyGgYBhaYiLlZOLW3aVkWdoj45yeqSYmGV4mIaBd5dpg4mCbnl/a3BlX3Vva2toXGZjYmJvUls+TU5OUkc9QFRCOTEvHh8mNDozMTY2Nzg8Oz5AQUJGSEJHRklLTFRVVVlcX2hmZ1dRSjxERzs4VVJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJWmo6GwsayrqaWpraOnraSSlqu1r7Glmqqmq5dzi5yvn6irp5OWuKCgj5yjnZF+iIiano2rmqOVp6KejpeSnoV1rY+IppqokZajiJu6tKigmZiLiXV2k46Wk4qTkZCUjI+ToI6an6aZnLKWgIyctZ61jZKPvaihfqeieqOvuIGOjqefhIuFj7Gpr4yJlqKaeYGLrIacnaKnqaiHlYaYd6WbeoebgZemgoF7nLF6ioWfl5mUmJaBkJaWhJmaY3mHkISOj5KLg25xkIh6gXGAgYZ/hnSHhZaSeJZok3SgmnR8mYOfm4aYfpGJgYKYao2MhGp4e3FwZ2R3bmlsaltlamllclteSFNMUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj5ARElASUVKS0dSWFpYW2FhaGZZUUg5RUw7PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2Yo5+mrq6rqKygqLCnp6qlmZSuxr2woZanqLWej4Ocq5ynoqCNkL6emY2fmqCQfYWOmZeIq52ilaChko2UiYaAkaeNhqKco5OWnYafubKnnZqTj4VwdZCKlZCKlI+Pm4uPkZ+Rlp+klp6siJ+0ibSarovKh6uuibeFjbCDsa+EqY2nmI2dfKiPcnt3m46mlmiVpHm0i5+epqiSmcKBf6uImKFxnoCapH2XhZWxgaF8oJOfj5iXgI6Tm4mYkot8hZOGjZWTiYNtc5GGgHtyhoGFfYV0hYKXgY/FZoCph4+iap6Cn5iBmYCKi4OImG+NkoRnd3R7dmdodXBnZ2teYm5sZmxYaEdcUUwyRTQ2TWBjNiY0PERHRDo2NDY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQEpkWV1jZmhnYmJiYmNjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS5saqrppqUoKOkqqKWpam2o69/oKecpZ6diZS9mZONoJGdkHmDlpaRh6uZm5qaoYWPjHebnI+fkIiepJuVmJeGoritpZmbjY1/Ym2Qi5OQjY+MjJeLkJGfj5OfoZmhqH6hp4etnqCWro+fnZ2RhoGgjauvh6SNqpqMmn6jdoCYk2uBq3VNq3iHjZ2Rm6ingaqrfYOhe3qnaZ5/kmtnl4aXtoiefW1gY1iDl3+Me2Rni3OZfXmWbF18l25fU3GEXGBseYNgWWWCfYSBmHGnqmuDo25ypXCfg51nZJ9sWmyIemVZX4J+YVdQb3ZlbnRyampvXmpvbGtoV2lPXVdFOUE0R0NeazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl9idmBNRDpNT01UYlxcZmZpaWJiZGJkZGJhYmBjZGNhYmlrZGJkZGdkYmdlYWNomJadoLmhqqOmrJKitryrrqKZl6ChpaysoJ2utaOokaCfoKacmY6YtJmQi56MlYt1gZSRjYqmlpWXnp5+k4WGrKSHm5CKmKiXmZqRh6WwpqKVmYiJgGluiIeLjo6Ji42Si5CSooyTnqCcoqV/k4GPo6GUoHeclpCng6GngIaqroWleYt9hJp9onBzk4eWe56MeW2Hm4yZkJuomo+HnXyConN2pmaefnekX5h6fJJzom6Yt7S6dJKHgYC2qGSBxrh7cJW3jHGAm6Rjc6yrYH1qnbN+bn2Hg46Ci5dxgKNsc6RznoN+o16dmbOWb3uXnrN0cluesoJpYm90dXFobllrbHNyZVxpXmJLRD1ENVFBWXEyPFJGX0pTPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWlhgYHxkSEM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mayck6COpbi1rq2gm6Kco6OlrZuasa2sk5egmKCkmpqUnqubi4iSeIuFcICWjYqPoJCTlJyWfZGJjqihh5iPipGik5uajIuoqKSej5aHhH5re4Z+fY+Ng4uQkImPlKCClp2gnaCfi4l3nJiijKByoouIqYicp5GXqKt/rox9eqCZeqOTeIBzl4iMnH2Wn4abjZmbpoajZKF8iZaQm41snmiajW6amXp/iqd9cmdzqoOdgnOqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxep3Z1iYp/nmiadYeTkpiOf55umZBrpplcqH53u2p9qVqOhF2zZ1xucXl3amhbcGp5eWJfZlhiQVBFTjdWQlJtNEpaWl9OWkRAMTUxOzs3SD86Q0dUP1lSWV0+RGJdVmBRYWR9aUVCOU5bXVhkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2RjaWhna2mVnImqtpuoiWOVnKy6srCsnaacnKefnq6anbCoq52Xopmhn5mWlqCjmYaJjWmIgHF7l4iLlpaEkpWXjnmKhJajnYmUj4WLnZGcm4mPqKOgmouRioCAaYGGeH+WjHuIjY6Hj5aaf5Oin6Cik5hyaJ+KoI+McJKMgqmImZ+jqaCofbCtpKK4l3ajs6Kjf4iUeJ16q5p+oo6dm5eIl3KhfIWNr7V9a5qRoXh+mLSjo6uohJh7mnycmX5zqlpdb3uXi3ieYk1/e3uFY3qXQk2fWaJqcnyObYGJhJl1m3mHibGzf3+akqZ0f51tcXyUb5lyaaNdlXZIZWNgc3B9fW1kX2tpd3xkZGFSXlZdVFZAWUVRZ0RSV1tiWF9JRD1COEBCOklFOExEV0FWUVtWREZhXFpgS2BtfnJFQzxVX2JaZWpWZ2hsbmJmZl5hYVxdXmFoYl9lZHZsXmVnZmxkZWxoaGtpk52Bsa6ZhFNfoae0urOzqZqii5upnJypk6GrpKGoj56dnJqZlZihnZaHh4l3hYFueZWFkJqLfZGTlYdygImSoJxykZCAiJiUn5qEjqicmpWKi4p8g2yFhXGBoYx4hY2Ih5KZlXySpKCfo4iuhn21hI+enXumlnqpgpadkIuhnn2naHdtfplzoHNxfJ2FmG+Tgq59o4OmnpqBo3BeqWd1o2NvpWGc05B8epl4cnNjooWPfqJyoo51a4+zi2CCmIpzqrKovH93g21/v6aqtF6bb35xl2+Bc6JyXaNndKZhaKZtm9OYe4Obbnd5l2ubenaXcmyppWdfZXlwf4RqZmZjbnZ4aGBjU1tlUVFiSVdJVF9XU1tlalxlUUVDS0xKS0JKRDhQP1BNV1NYT1JRYGVlaVJkeHl3SUZFY11kWWhqVGloam9jamdgY2BcXV1faGJhaGV8ZF5kZ2RrZGptZ2hsaJibf7CsVFxLfqmwsrWws6OcmIWYpqCgo42kqKCYqYmZl5iTmZOSoJeOh4V7cH2EaH2Pg5OagXeRjY6JcH+Gj5OSbJeTfIiQkaOVg46qmpSSioWJeYN2h4BugZ+Gd4CShoiZopd5k6Kkmp+Js6Gitot6rKekrqVwqYCakIWBnJJ9pICimYaYcp6EoqyuiZeLgIykjZaDrqKUdrW2tcmhc5SKgJ9hnpepbXmVh5+adaGHd6B9kJaKgW9MZqKScJqIc6R7eXRhg4JsfqBscmRgnHJ/dJdpe2mztbTGpnOYfnudapubq3WCmm10d5dpmnl0mHFQRXyzXmp2a3iHZmpnYnR1cW5WXlRZaFBSaElVTFhSVl1na25WZ1dNSkFKTUpISk5BUUpQZWNpbWV0cnN+eHtudYl7e1RQT21daFtraVJqaGlsZ2xmY2VfXFxcXmliZGhre19dZGdjamZvbGVpbGWinImvp4VmP5Shs6uvr7WiopCAl6iioqSMpaednKWCmZeWjZeQkJuSjoiDeWp5hmWDjH6WoHl1j4iMgWmEhZKDjIWdjXqMipSlkoOXqZeMkYuAiXqAfYp4cJChhnmBlYeJlqCWf5SlqJyWloRnbnicbKJkfHGld5yYcGengZeMe6V6oJaDl3KfdoCJlJaPuW6QiqJifZmilYhucmmranWgbG6mYJtpi5BoloealXWigH2aX4uFjHVviGJooWWef2mbdXBkZoiCbnKiWl9bZKFuXomMb3t/c3JkpW54omRnp2iYc4uYbqFvU4iPb6BeZKdUi11TmG1tc2txgW1waGt4c2tvUlhXV2ZZU21JWE9cSFhpaHNqWWtWUVJFVlxMWFJhVWhqXnd1enxwfHxygnt/cnaNgIR2XlFzYWdicGdQamhoa2xuZ2RnX11eXWBrYmppdnVdXGNoY2pqc2xma21jnaWYpnpldG2Lp66lqrCxpp+LgJaqnJ6ljKKhmqKigJWYk42aj4uXkI6Ke4dxgIhoi4t8l5pzdIp9kHtlg4eVioqVmYJ8iIWWpo+BoqyQhZCKgYp9gICPc2mPpYR9hpSNiJigjoiSqqeeiaZ4lpx+pYmWjLKYnpCDr5efpXiWiHqpdKWPhJpupaKMkoSMg7xufKWvgoaFhpOWnKB8pXpxqJSglmeefm+sY5aKlZJ3qGypooGJdoeCd6uRpohrkbBrdrOMqWyLhm5tn56SlWF/q4uqdoB/jaefd599haSVnaBpmod2rGeerYy2c3e+jKSTWYOmjathdXJzb3t0cWJqfm5obFNWW1VhYV1rTV1SXUldbG12YFtxWVtgWmdzZW5vcmNxdGB3e355cnmDc4N+gXt7jIGCgHZieGRjbnNkUmxnaG9scmlmaWFfXlxia2JsbHpvXFxiaWJsandtZ2xuYpWmqpyBgJ6klqmqnqinrqOZiYKXqpmepImapZ2pnYSLmo+FnJGFko2MjXSGeoiDb42EfZaTdHSGcpKCbX+MkoeGlI99e4GEl6SNf6WljoGNiYSUdYKHkm9siqiAgouUjomcn4mNk6ujoJCAdZWXiH6BeZSuo3+Bm3GPhniQjIWAe3KnjHF9fXqXlpuEjnh7fn2IlJWTinaQmZ+gg3p9iWyMhVt5eXJ5cWhufpKJcX90gY+Uk3GFg4FljX9fgYCMd3VzlHVvem9uh22Ehl93aXiOZoGCho6qnH50fZdqiYhvgHZ8hXZtbGeMc3h7l3eEW2pYeI9obXdycW93eG9dbIZuaWdWWmBXXGRrZFVhVV5RX3B3eWtqdmVqamp1fHFydHNhb3Vic3uBeHV5gnV/gH+AeIuFg317bX9sZHluXlduZ2h1a3hqaWlkXGBaY2plbHB1blpbYmtkbGx5bWhsb2GOlbmopouhopqmpJmknauioIODl6uRnaCJmqaaqJiCgZuLfpaUh46JiI1ygnyPfX6PhHqXjnRyg3CVhXt9kouGhpCFeH6AhpiijHunoYuFj4+ElYKGjpd3coSphY2SnJCInp6IjJuooKCrg4mOlZp+fomWraiPkqeQeHCekYN7k29+qYVwfZVxam98gZ+Lf5KOjGhtXYOLjJybno5zlYuIcXRrgnZzgFlyboaQgX1+i2ldaWN6hYOIgF9peHubfIOMg3aBhoNpeYuHa2Fxc4N3YHOMgomQp5WGZo2Pg252i4NwhY15b2VmY3mCepVaXGlmbnZbenl3dG1zcoJmXG2Ka2xiWVleWllrcVteYFleXWZzfXtzb3Nja2tpe3xxe3d0ZG10aGx8fnV5fHt6eX+Af2+GioR7fXN+eXN/aVRccWlsdW91Z2tnZF1hWGtoa2pxcm1XW2VubGdzem9oam1gjIyqsKGQo6Gan56Ynpmpo6F9g5erjJ+Uh5uikKWVf3uXhHySmYiIhoaKcn2Ai3aFi4GElopxb4BymIaEfpKEg4aKgXqAg4qano+CpqCHeI6XiJWLi52XhIN6rIGQl5mUip6dh4ihq6CioqOMiJObnKOZlqqhp6agkpuIl498eY+OhKh+f5KRkpOcsKWalJ2QjbKTmISmjIyVm5+JkJuCiZGKa3yOdndlgoaQinyJnYSHi4+HiICEg5B3fHp1mqKJh4ufi4aVf36MgYB2cXSGhYB4iIeKkaaRhIaOiIONkIx8h4qJj4F2a4GDe3mZaXJoYHOKcH16d3Zvd3SBXV5vh2huX19aXF1TZ3FVY1tbYWxodHt8cm5wZGtqaH97bXh/cWlvcGxmgXtygYB3gH1/hHptgoyGfHp4fH56g3hOZHZrc21wemRrZWJiYFt0ZnBmcnFsVV1sdG1oeXpxZ2lrZY2InbqflqKhmJWZmJSYpKCde3+Zqo2ejYWfnIqelnx5lIJ7jpmJhoSEhm14gYBygId+iJOEbWt+eZeGhIOQfoCGhIZ9h4ONmpySh6qeg3KKj4WSkoudkX2NeqmDjZKXlY6cloaGm6egopqdhoOSmpmZkJqmoKadnZCXgZKLd32IjoWle3yPkJGGmKqhnZOcj42qjpKAnoyJk5qego6XfoeOgm94hXF0YH+Dj4Z0i5eAg4+ChoR+hYSUbnl1dZOii42Gm4WFjnSAin19cnN7iYR7eYyOhJOnj4aEj4KDioqKdoWHiIt8bmt9f3ttaGtsZ155fmd8e3Z0dXV7d1xgcH1udWBjWlxeUWZtU2VaXWFraXZ5fnBrbGRraWeAgGxzgGxsdG94boR5boaAdoKAfYV2cYKNiH57enx/e4KKYGl7a3VoaYJkamNgaVtjdWhvYnVtbFRicXllcHp6cmVqbW2Lip+4mqGkn5OSlpeLmp+enXp3naWQm4mGpJSLmJl5eo2FfImRg4yCgYJte394coCFfYqQfGtofICXiIGIjnx+hoSHfI+Bj5qbkYinnH9wi4qLkoegoYqFjHynkYePkpeTlpJ3jaOhoZ6Wmn+BkJqZk4ybo6GkmpeRm3+OhXmAhI+HoYB+jI2PfJekoKCSmZCPpo2QgpuRiZKXm36Skn6HjoF1dIJwdmB9gI2FcYqVfIiMco1+goWFjmh4cnmMmZKQgJh+iItygod8fXF6fIyFenuSjYOWpZOLhpF8hYaHhXWCg4iIemVxen95enBsamZefXJofHV1c3xygGpeYHR2cHhkY1leXlJraFRkWF5hZ2p2eIFxZmtjbGhlf4BqbX5ob3FrfXeGemuLgXKBgX2BdHaCjYZ+fHp/gX1/j2pyg25zaWGHaGxiX3FVdG9tbmB4aG1XanR2YnV6e3Fiam96iY2fspKlpZ2OkJiPhp2gmpx8daOgjZZ/jKKKiJqWeHuGh36DiX6IgoB/cH97dHWChX6JkHhnY3yFl4qCio14fYCMg3mWgJWXlYyWoJp9b4uBkJOGppuHjImDpZWEkoqVl5KRdpGeoaGYlJh6f46Yl46Wm52knpmTlJx6kIaDeIWXjZ5+gYqOjHOXop6hkpiOj6KMjIOWmIOSlpl+mI18iI2BdnF9bXpkgHyKhXCGk3+QgmyHgoF/iYRldW98h5OYjX2UeIyJfICHfXxygHmKh3mFkYqLmKKWgoSMd4iEg4J2e4GJhXVgd3d9dH13ZmtkYH5panZzdHR9cXxjY2FzbnVzbWFZYF5bbGRSYldfYGhrdXmGcGNqY21maHyDbGh0aGxvaH98gnhtkIZxgIKCf3R8g4yBf356goN+fJBtdYl0dG1limxqYWN1VoNpcW5geGZsYmp2cGZ5e3lxYHJshoWQna6Ypqiejo2Xh4agk5eYfHepnIqYeZeci4uYkHl8gIt9fIN7gIKAeHN4enN9gIR/iIuAZF58ipWHfoSHdH1+in99mISWk5aMo6GXfnKHe5ORiqePjI6KkqCRg5GPlJeRioGPmKCakpCSdICNkpSJnZ2ep5iYjZWXdI6PimyGmJCZeoeIkIlvl52ao5OVio2fjIaCkpx/kpKVhpmIe4qJgXpxeWp1bHt+i35thZGClHdwgoN9fouAZHJqfIGXmIV/jnSRiYN5h352eIF+h4F9hI6FjZSkkHmFg3SJh32Ac3SAh4NtYXp0enF8b2FuY2R7YW5vdnJ3d3N0YnZgb2x1bm9dW15dXmpeT11XYmFobXN6iWtfamVqY2h3iG1mbGhqbWiAfHp3bpCHc4CDhH10gYaJeoJ9eoGEfX2OcnmLeXhubIdraF9pcmOHaHFvZnZnbWxhemhqfHp4cGF3bYuBmZqqoKSpnYqKkYaKnoqVl312rZiMln2ek5GWk4h3fnuKfHuAdnd/gHB0c3pvhX2BgIp+fGBcfo+Rhn+DhHN6gIZ6j5GHkZGbkqSblIF9gHyNipKkiY2KjZeajYWRmJOVjomJjJOdk5CMjW6EkI+RiZ6ZoqGXlomXkm+KmoVnhpqPlHqJhZCKcJaalKGSkoiLmYyCgJGefJKPkouZjnuKhId0c3VrcW51fIt0boaQjZFxdIB7gYKIfGVxbXl+mpR9hYl0kYuBdIl5b4F+gYd9hY2KhY2WqI17iH1+i4V3fXBvgIWDY2h3c3VwemJecGFqdF5wanp4eGxycGV5XW1sc21zWFpeX2FqWlBXWGRjZ3Fxf4dmXWloZmJncY5uZGlnZWpogHp3dG6OhXOAgYJ7dYKIhXiEfHeDhXqAiXd/i3x7cnmDamtfcGh0f2txbm1xZ29sZXtibX95dnFsd3eKf6OYoqihp5uHjIqBj52Gk5x0gKmUkYyGoIyVk5B/dHt2hXh4f3Jze4Vrcm95bYl2gICGbnFbWX6RjYiAgIB2dYB/f6CGj4qRnJegk5d3iX6AjIicnoqPhpKXlYSIlJmPlouLjY6NnYqOkIRuiYuPkYqclqGbmJWFmIhrhqSDZ4adipF/i4SLgXeTmJGekZCIiZWOf36Pl3yRjY+NmpJ8in+Cb3Zva21vcHuFaXODjpeKcXeAdIKIgnlmdG92gpqPfImFepWSeneJdHCJfIeNe4uHhImPnKOIfIR3gouAeHhuaoCCgF1ycnFwcHhaXnFhb2peb2l8eXBtbWptdmBwb2tybVlYYWFiblhRU1llZmN1cISCYl1rbWRiZmuSbWBnZl9oa4F1cnJwi4B0f4KAeHaAi4B5hX93h4Z2g4V8h4yAe3aKf2pxY3xihnxvcGx0amhvbHZ3X3F+eXt0dXSAgn+llZqtn6eWhY2Df5eVg4+fdYqfk5KFipqMlY2LenJ4dIJwcoVzcXWIbG9tdW2Id4N9f21uVVGBq5SHgniAdnKCeYKggZGBk5KXm5GaeJF6g4ySpJqTjomVmJKEhpaZjJOLiY+PiJ6FkIp8c4uFiI+InJmfm5aUgJR/aYadiGiHoYiShJGDiXGDkZePmo2PjIuPjXd7kpB6jouMkZaMfIh8gGt2am1ra2x6fmF5fo6VgXZ6gXeDjHx5Z3RsdIeWjH+IhnuUkXF6hXB4jXuLjXuJfoONkZ6ehXx9eIKLfXZwaWuBgnhfd29ta3FyVV5wYnFgX21ueXBncGZnc3VocGthd2VdVmVgYHJTUE5cZWRdeHCIfF9caHJiYmVmkmpfaGRbZ3B+cGtxc4p9dnyFgHR1f4x5e4WAeIiDc4aFfoyMg3t5lXdmcmqDYId+b29remBqbXR/dF90fXiGeHRzhXx5oZCasZymjoOKf4OaiICLnn+KmZOOhIiXjY6OhHZ0dnOAcG+Fc3Bxg29qaXZtgm59fG11c1JOgt/JktaTfHB0g3WDn4KSd5SQmJuPmHuTcoaQn6GTk5CKkpuUhn6WlYiNjYiRjYicgI6BeHqMfoiMipybnZuVk3mNd2iKkohsiaSFkoiXg4ZjjJGYjpSKloyNiotxe5SJe46IipKRiXmFe35se2Vyb2preXlbgHmPjoB6fn5/ho56emhza3OKj4mBhYV9loxsfn9vgY1/jYh+hHuDkJaam4t8d3iDkHlzbWZwf4NsaHRvZ2hzbFNeb2VwWV9rcXhma2piZnhzb3BjX3dgYFZrX152UE5MYGZjXXlxiXRcW2V2YGFlZY5jYWZhWGlzc25rcXaLfHR6hoF1dn6Lc3+Gf3uJf3KJh4GRioh8fph1ZXNufGWIf29wbIBabG55eXNgdnp7jXZyd4p3eZ+Mm6+boJCChXeIlX99iZyHhZ+RjoWMl4STjoeBdXdweXFuhG9tbn5yZGR4cHxten1qaGxjpJrB3K7voXNrdYN1hKGFkW6Vj5SflJuBkXGGi6OXiY6VipCdloOAlZCFiY+AkoqKl3+He3V/iXiGhI2bmpiZjpB2i3dvh4qMfoukhZKJnYWFXouUl4qOiY6LioSJbHuXgn2IhYmQj4Z2hX19a31jeHVpbXhzV4h6kYaFen5/gIWMfnllc2p/iY6JgoOAjJeGbIJ2bomRg5GFf4J6gJGWlJmQdHR4iI11dHFndXmCYXNsb2FodWZSYHFna1VebXN5YHJjX2h9cXJtWmJyYWJXblpcd01NTGNmYV52c4ptW1xkeV5gZGaEX2NjXlhqcmtua3J3i31zd4SBd3d8iHGDhH1+iHt0i4iIloaMfn6Xcmd1cXltjHtvdHCBWHF6dnlxZHd5hoxpdoCJcoCdiJmonKOShH1wjJR4eYudhIWhjY58lYx/mYeEe3N3cHNqb4FraWx8dF5geHZ7cHV7Z2BlfOvatcnD3IhzbHOAdomaiI1pl4+OnJSSgYhxhomgjoSLlYqNmJR8jZOIg4mPe5GLhpCCf3Z4g4Ryh4KSm5aUmIaMdod/cYaDioeaooOUjJ6DiWGDlY6GiYaJjYeAh2l9lH99g4SJjo2CcYZ+f3F3Z3ZyaXN3a1qMfZKBhXyAg4CEioJ2YnRsiIGPioJ+gJORfW6CbHmHkIeThH2BfoGSlJGXiW5yeoyGdWxxa3J4gF9yaG5canVgUWVyaWZTX292dF9vYF1ognFyaVdnaGNpWG1XW3VMSkxlZl5icnOFaFtcZXleXmRnemFkX1xZa25lbmp0d4p+c3OBfnp2eodzhYN8f4d3doqGj5iCjYJ7knRrd3V5eZN1b3h6fVh5hXGAb2d4d5KCZHaGhXGKloWZoZuiioZzb5KLcneOnH2KmoiJe59/g5l/gXlyc25vZHJ+aWZsd3dbX3l7enFxf2lhZ2F/1baOkKZ4bnF3e3GSkIyHapiNiJuRi4Z6aIiLmYaBkpGGh5iNfI2NgYGKjXyQjH6KhXp1e4J6cYaAlZmOk5SCiXWEh3eEgIuTnZ+Glo+ffohhf5OHhIiEiY1/f4JmfZGAfn+Ci4+Qfm2CfIJ0a212dHN2dWtjjYGOf4V+fIR/hIh/cF9zcYV8j42CfH+SiXpxg2Z7hIuHjYR8hX6BlY+Rk4RucHmMf3Vtbmpren1iZ2lpWGt1WlJpcmliUGJyeGxhZV1aaoNtc2JbZ19kbF9uVFpvTkhPZmRcZ25xgGxaW2NyX1xjbHdkZV1cWmxrYm1qc3aGf3Fvf3x8dHiFeIWCfICIdXmJgZKWfImGdomBb3h5e4STb258gXdeg390gW1penOUc2dyiH1ykpGEmp+boIaHdnaUf212k5d9h5CDio2ZfIuadn53cW9samF0fGdiaXV6Wl94fHptcX5lY2hoV52PXnFylrzEhHZxlIiQfnKWi4abkoyHcmqJj5aAe5SMgYSbjHyKhn18iYx/lIh1ioZ2dn2BcXWGgZ6UhZSPg4NygIh1hXyKmZ2Yh5SOnYCIZn2Tgn+Fg4mJcoF9Zn6Le3l+f4eLjnxpgHyDdmZveHhzdnNsao2FioGKf3iCgIWDf2tecnh6fY2KhnyCj4F+coFpeYSIjIaFeYR9gZiNkIx9bm17iX13dG5oZ3x2Y1twYlduclNTbnNoYU1mdHhlYF1cWG6Ab3NZZWFeam1gcE9Za1FEU2dgWmtubXxuWltebGNaYm93ZGdcXWBsaWNsaXN2gYNxbn58f3R1g3qDgnyChXZ+iIGWkXiDinSBiHJ5eH6NkG9ufIFxaYF5en5tbHt1lWtqd4R0bJSOhp6YoJmFiG59jHZqeJiOfoGKgpWXiXmOlm96c3BsamRgc3poYGVxelphcn15Z3F6YWVlj7Gyd0piWqTZ0JZye5CKkHd9lIuEmZGMhW5shpORenmShoGEmIp8h394eImKhJaAcIyIcXR9eml5hYOlkISTjYN/b3+Dd4R5hpyZlIuTkJWFh3B7koJ9goOJg26Bd2iAhXhyf3+DioZ7ZX1+hHVjcHJ/aHhwb3WYjYaCinx2eICEeYFrXHF+coGIhYl+hol7iXKBbnGFh4+FhXOEeoKZjY2EeG5vfoSAd3plaGp8cF9YdlpYcGxOV3FzZ2BKbHZ0YF1bW1l0fXJvV2ddZmpwYG9OV2hRP1lmXlpva2d5cVpaWWtlWWNxeV9oXF5lbWhla2lxd3+Hb2x/foB1b4J7gIF+g392gYWIl4pxgo1xe4Z8eXmEk4x1anp/bG9+dH99b3J7e5RvboF/eGaTi4OhmZySgoZnh4NwaHqViH1+hIGYiYF8jYxpeHJrbGZfYW54bV9ib3hcZGyDemFxdl9lZdTqvooyOj6LjoBxeIWIjo12g5aMfpKNjH9tbIWNjHZ9j3+FgpWIfIJ4bnaHhIOXd2+IhWt1e3RmeYKDp4uCj4uEfW6AdHaEeoedkYyQkpOMioZ+e5KGd3+EjYNsf3JogH54bXx7gYqDd2J5hIFxZHFofm10cXSBm4uAf4V+c3V9gHOBcFttf3V5i4OLe4eAfIh4enFsiYSQhItygnqAl4uLf3Rua3eAgHV1XGlod3BYVntTWnBkTFtycmVbSXB4b1xaWllddX50aFliW2dlbmNpTFdmUT1eZVxddWVfdHBaWVRvZFlkcXlaaF5gZ21naWxpcHd9jmxpgoR+eW6AfHyBf4J6dYKAjZOFcICLbnd+gHt7iJKJf2h7fmp0e3KGe3N3fX+MeXiEfXxrjI2Em52WjIGAbI5+a2h+jYx6fn+DlIF+fYqIa3VxZ2hjW2Jncm5gYWxzYWhwiXpic3ReY2SboI9uXDVZr7V0aYCIfJKGdYWWhXOPiol2cGyFg4d1eYl4iXyTh3p+c2d2iX5+mG9xhn5odnltZXmIhKSHgIeNiX5ufnV/gX2MmYiClJKZiIqEiXyPiHB7fYR7aH5saoB7eml6doKHgHJgd4F+cWRyZnWCbXV7hJSRgXyBf253eXx0f21Yb4B3dYyChniIdoKJenhzboqBkIGGc399f5OJiHpubmpugoJ1bl1nZXNxUVp6TlxvXE9cc3BkVUtzeGlXWVlaYXGAdGBdXWBmZGhpZk5aaE5AYWRbYHVhXHRtWFdTdGFaZG9yV2peYmhrZ21saXB3fJJsaYSJfHxwfn57gX+CeneAf4qLg3F7h29xd4R/e4mNj4Nqfntud3l3ind9eICCh3+Dfn56bYWMiJijjYSDe3aMeWtshIiQeH17gZF/f36Kg3BycGNmXllnX29wYGBncGZqb4l0YXRvW2FkanZ7f76cpqPIuHGFg3KSfHiGk4JzkYyHcnJvg3uDdHWHdIh3k4h5eXFjd4d6gJNpcoR2Znd1Y2p8g4eegX9/jo99cn9zhHmAkpGDeJaOlY6Hgoh7iIhreHl+dWd6aGx/eXNpenaAg31oYHeHfWprdGd7gGl2gIuQlH56fX5we3Z7dH5iVnd+c3OKhIJ9g3GHind4cXCEgo1/fnl+fXaOhoN2aXFpbYiCcnBdaGJybkpkdUxeblVUWnNuYlFPc3hgUlhYXGFvgnNbYVxoZWVja2RRW3BJRGNhWmNwXl13aFVWVXdeW2VuaFZrXmFqZ2Vvb2hwdnqSbmmIjHh9cnt+eYKBgXx2fYOIhoNwd4NybneDgn2Ji5N/cIB8eHl6gYx0g3h/gYGChHqAdW9+ioubnoh9hXp3h3tndIWLkHp+f3uIhYR2j4Bnb25fZFxYZVltcmBgYHBsa2iJbmBzaVleZG2Ad6naqceGh7JxiXdvjHV7ho6AepOJf3V0dH53gHBxf22EdJSFeHRrYHqCeYiPZnGDb2d2blttfYCQlH+BeZKTfnl7bId2gZGMhHSWipGNhoWFe3+EbHV2f21ndmVte3Vtand2f398YGJ4hXlodHVifXtndIaOjZV7dIB1cX96fG1/WVZ0fnB1hYd/gXlsiYZ0eWx1gIOEfnt9eXtzi4F8c2d0ZW6LhG1zW2pfdWRIbm5MWmFXVlZ4bWJQUnR2V1BVWF5hcYRvXGBjbWRkXm9iVF1yR0JmX11maF1aemJRVVx1W1tna2FWal9gbmVma3FocHV4jnRrjo11fnZ4fXeBg4F7c32DiIeDb3F/dHF1f4WBiY2Ke3d/eIN8fIaHeId8fYF+hIB7fnN2eYyOoI2Jeol2dYN5Xn2FmIx5hoN0hYaEd4l7Ym5tXGJbW2FWanNjYFtnbm9mh3FhcWZXXGNrf3zKzoe5oWptbYpscYRxfISJfnuRhXl5c3l1dXtqbHVjhHWSgXZvZl59gnqLiWVygmtqcWNYbXqGm4iCgnSYlXh/fG2IcYKKjIhymI6Qh4SLg3t4fXFxcH1maHFibXhxamtxeH18elxkeYB3aXV4ZoF2Z3SHi46VfHGHam59gXlufF1Ycn9tdIGLfIJvb4p/cXZod3+BgIF3fXF7dYd8enJmc2FujIJsclhrX3dbSW5rTVVUXlRVe2thT1R1clBRVFZeYnSFaVxga2pmY1luYVhicEdBaFxgZl9dVXtdT1VkcFpbamhdV2hgX3JlamhyZ3Byd4Z4bpWKdH96d354g4d/dXJ/hoWNgnBwe3h3dXqGhYaMhXp8f3WLfn2GhISHf35+fYd/fHh2eXiRk6B/jH2LbXaAeWODhpaFc5GKb4WFgXqDdGNua1pfW11dVGdzZWBZZHJyZoFzYmtlV1tgaX94vq57oLdtYnOGaHN7cXmChXt9jH93eHJ2b3t2ZWpuYId1joByaWJef3h5i4RmcX5oamtaVm93iqOBhH9ym5RygXl0gm6BgpKIdJWIjIeDiIV9eHRybmh5YGptYG12amdqa3l3endbZ318eGVyfW2EdGV1hY2Gln9vi2ZqeoN1bXRiXG98a3V9jHyBZnWHfW5xaHV/eH5/c31se3uBenhwZmxibol+bW1Wa2B3VUpqa09RTmhNWXxoYk5VdWpMUFRVXmZ1g2ZdYHBoZ2FXaV1ba2hKRGpaYWRXWVV5WU5WbWpZXWxlXFplY150ZWxkcWdyb3WBeHCZhXZ/fnd/fIWHfXVzgoiAlYJuc3l7enNzhYaIiIN4gX12j398hIqOhIKEe36Lg3t3fHd3mp2XeoqChml3fXxsg4STgHKPgnCFgn6Bf29mbGdYXVtcW1RkcGRfV2JydWl1b2VlYldcXGh/cG9ygHOJZGR4fml0dXNygoR4gIR5d3R1bmt6cWJna2eGdI2DbWZeX31we4l+aW13ZmlkVVdyb42nfIR8dpeRdHxzfHpufHuRhXeZfYeFgoaDfXRwcmxndFxsaF5sdGRnZml6b3tyWWeAdnRncIB3gXVid4WKfJSAbotqbXqBcWZzZWBtemdzeIp8fmJ2g3Zqa3F0e3F6eXR9Zn5/f3l3bmRmYm6GfG1rVmpicFNLaWpPS05wR157ZmFNVXRjSk5TV2Fqdn5lXGdzaWVgVmNXYnBdTEtrWGNiVVVVc1ZMWHVkWl9rYVxaY2Vfd2ZtYnBpc25yf3R0moF3f4B3f3+GhHp8dYKEfpeFbnJ0fHp0cYSFj4GAeYt1dJF/fIGVjoCFhH1+jIZ7foB2e6OlinmIhoRrdXx7dYOCjHpvhXN5hH2Bg3VuamhlVl1bWlpTYm5kW1hhcnppaGxoX2JXX1tqgGlrb4Bna2BoeXhqc3R0boSBen99dXVuemhqeWpfZW5ogXaPg2ZlWGJ3aX6He29pb2dmXVVYb2iPqXeBenyQjnl1cH9wcnV5jn94lXWGgn+Fh3VqcnZnaG5bbGRdbXNfZ2FqeGh7bVptgnJzam+Afnl3YXeEhHePhHKIcW95f3JjcWlccHhkcXSIfHhic4BwZ2p4c3JseHd1eGSDe394dnBkY2NufH1rbFVpYmZTS2xoT0dSa0VheGdhTVNxXEpNVFlla3d7ZV5tcWlkXVZgVm5uV0tTaFdmXlhOVWxUSlx5X1tfa11dW2NlYHpobGFvb3Vub3h1eph9d4CBeoCAh4V6eXqDfoGThHF0dH95dnSEiJB9gHyQa3OVgHuCn4V+h32Af4aCgIp7doSsn396iIiDa3KCenaBf4F1boZufH9ziYBqb21kZFhfWllaVWJqZ1taXnSBaV5ta1xhVlxcbIFlcXR9aWlca3Z2Z3R3cm2Fe319eXVybHloaXhmXWRzaHp3koBiYlRlcGeChXd3ZmhqYFdWWWdjj6hvfneAi456cHF+aHhveYx7d49yhH1+f4ZuZHZzZGhoXGtiXW9vW2dfbXVkemhddIBvcWtxe311dWF0hYp6h4eAf3dydX91YXBtWnJ0YnFyhXx1ZXKAbGFsem9qaXt5dnJmhXZ7enVxZWFlbXN+aWxUaV5dVEtzY1BHVmFHYnZnYUtUb1dKTFdYZ2t2emRlbnFmY1pXXVl2ZVVKXGNXaFhZSVdlUUhieFpdX2xbXlxhZF5/aWpgb3R4bm9udoOXeXKBgHx/iIuFfXV1hnmHjH1zdXWCeXp6gouOfX6EiWlzloF6ip19foV6gXp/fIaIc3GProx7e4ePfWVyiHp0fXx2cm+FbHt+bI96YnBvYmVdZVZZWVZjZmtgXVxyhGhYb21aXldaXGx7YnB3dm1iWmxzc2d1dXBshHl+gHl3bm50ZWl0ZVtndWZ2dpF5Xl1SZmZrg4J0fWJjaVxUWF1iY5ClaHh0goWQeG1vemh4bXuEe3WJc4B4fHh/aGV2bWBmYF5qX11za1llXW9vYnplW3d7a25ub3d4c3RkcoOSfoeCiHp2b3J9c2J4ZFtvcWJxcYJ8c2dygGRebnZpZGd5e3Vub4J1dH1zcWJfZm5vfWRqU2hYWVRNd19RSllYSGJ1ZGFJVG1TSkxaV2lscXtibGxzY2FZWVthdltTTGNdWGlTV0hZYU5HaXVYXmFtW1tfYmJdhWhoYW54eWxvanaBkHhtgn6AgZKHg4F2dIl0jIZzcXd1gnd8fX6Mj4B+k35wd5WDfJmSeYCAeHl+f3SIg3NwmaJ7en+JlHhkdYh5c3h1bHRvfmx5fHCRcl5wb2BnYmxUW1pXaGNtZlxccYllU3FtWlpYWGBsdmNpdWppXlltc3Fsc3NzaoV8fn98dm5ubGRpcWNbanJkdHaOc1tXU2VhcoB/coJdYmNdU1pgW2OSn2VycYWEkXRsa3ptb3B7fHxxgXd/cnp5eWRldWhdYlpgZ1tedmhXYl1waGF3YFt7dmlpcm53c3J0aHCBlIKGfoR2cmpwfW1md1dca25icXOBenNnb35bYG9xYl9qcX5sbHV+c3F4a3BhXGVsbHphZ1NnVVdSUHVbUlBZUkhjdGJgR1VqUElQWlVra2t8ZW1vcWFbWlhZbHBXU09mV1dpU1RGWlxPSHJ1WF9jbWNYYGBhXYtqY2RteXhrb2l1eYZ7a4N9f4SZfIKEeX2Ibo+GcW93en10goJ8io6Cgpd0d4KThYGfiXWAgIFzf4Jxh4J1b6KXdHuGi4Z7ZXiLb257b2Z4cHpsc3ZyjGtedG5hZ2VrUl1bVWdhbGxaXHCMZE9ubVxWWFVnanRnYnRlZV1ZbnRucHV1eWuHfH98iHaPc2Rka25hXG5tY3N4h2taVFZjZHh9fXGFXGNfY1RaYFljlZVjbnCDhYpzamh7b2Zzd3N8bHp0dW95fnVeZnJjW15WYWRZYXRlVV9gbWRhcV1dfm9oaXNxc3B0dWpthJKBiHuFcXJmbn1wcm9UW2ZrZnF0gXdzY2x2VWJxaltfb2Z9Zm13fXNzc2ptYFpkamp3XmZUZFVWUFRtV1FXU1BIZHNfYUZYaU5IV1RWbWhkfGlreGtiV1xVW3RkU1JXaFFZZlRTSFpaUE14d1tfZWxpWWJgXl6PbmJmbHl1bm9odnZ/f2yDf32Gl3t/h4GKfmuTiHJndIB7dYCCfIiOf4uTcnyKkYWHn4Z7f4aMc4GGc32Ddm6ljHOBjYt2d216jGBlfHBmenN5bG1xdoJnZHtsY2ZnaFNfXlVnX2xvW15ujWhOaWxfVFZTb2dzbGZ4ZGRcWHB0bHJ6d3JtiHt/dpx6eWthZWxtXmBvamVweH5nWlZYYGx4fHtwg19iXmdWWF9XZJuIYmtxgYd9d2treG1cd3Fse2p2c25ve4ByWGpuX1ldVWJjWGRxYlNeYWhiYmxaYH1rZmtzdW5td3ZraIWLfoh6iG1xZXB9bXJtY1lhaWlvdIF0c19pbFNlcWRUYm5iemNxd3t2a3Bta19YYWdodFxlVmFWU05YZVJPXE9PSGVwXWNGWWlNSV9LWG1kX3hobn5kYFReVF11XFRTYGZOXWFUU0pcWVBZdXZdX2ZtaFhjYVtejnBjZ2p3cXNuZ3Z0eoNygYJ5h41+fImHjnpukIp0bHOCdH9/h4SGkYSVj3l+jI+HkZuEgHyMhHKAgXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjI2MjI2NjY2NjY2NjY6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCTqWvra2tra6kn6CgoKCjgGNnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTNBqba0tLS0taijpKSkpKd8XF9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJmZmZmSj5CQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaPkJCQkJCRj4+PkI+Pj4uIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkI+QkJCLjpGRiYeOipCSk5CKkYyOj4ePkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyLi4yMjIyMjIyMjIyMjI2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoeKioaNhomQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCPhouLho6Gi4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkI+JiI2GjImJj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4aIh4aIhomPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiY2Ki4yJjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHV2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2hoZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUVAPjo7Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs8OjY4Ozw+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1c3F0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5ODk6Tj84Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GBgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09Pj49O0Z5Xzs9PT08PDw8Ozs6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEtJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NERD8+PT1ASUhDWHlvQz5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0ZFTkA6QGV+fnhyd28+OTw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fX1+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE5MPkE8PD0/PkJDPz9BQUFCQE17ZkBrh4SEg4J6cD85ODg6Oz0/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkM/VXV5cYGBgoJ8hIByQj09Pz09PkNEPzs8PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUBVdXSBf3yDg3yFhWhBQUBDQEA/QEA+PTw9QUVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQExzc39/fYOFhoaHXz5DQ0VAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTUpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRWZ3gYOEhYaHh4mES0RFRENXdYaJin5YR0hKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHWHSChIaEgoWIiI1jQEJVdIeJh4eGh4JXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExKW4SGh4OBg4aIiX1XbISHhoaGh4eHh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUtJSUdISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEllh4eGgYOFgIGCg4SFhYSEhYaGh4eGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSmyHhoOAg4SAgYODg4SFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QDs5OTk9PT48PD1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaYWBgH6AgoSEhIODhIaJiouMi4qJiouMiVQ7ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzU4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0V2hX+AgYODg4ODg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6OTo6Ojw4OTg5Nzc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2tycnR0dXd5e3t7fH1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I5SIKDgIOEhYSEhISGiYqKiIeIiIiKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8PDk7PDg6Ojs6OTk5PD88PUFCRElKTUtKS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7PzxXhoOCg4WGhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUFCPkBCQEA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEBAPz9BPT48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhxcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQmCHg4OFhoWFhIaJiYiIhoaGh4iJiouLioqKi4qLXj5ER0lLSklGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURFRUFGRUZFRkZEQEI/PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFARERFY4iDg4WFhoaGiImJiIeGhoaHiYqKi4yNjIyLioqIV0hMTU1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AP0E/QkNISEpghoKDhYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlJSEpGREdISElFRUhGRkVMTE1JSkdHSElKT01OTExNS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw7PD06P0A+QEBDRkpKUGiDg4WEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSEdFSklESkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVbnF1dnd5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH9/f39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6PDg9Pjs9QT4/QEVJS01Wc4OEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIuLi4teUVFQTU5NS0pHRkNHSkdMSkdLT0xLSkpNTUxPUE5ISUtMT1FRUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkBCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBSExNUVd5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVVJSVFJPTEtKRUVGS09OT1dWUVBPUVNSTVNUT01TTFBTVVdSU1FQTEtNTU1LTkdHSkZGSEpEREVFQkRDY3B1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQ0ZWTkZPUVFVWXyGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOzpRU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLR0hJSEVGSUhJSElqcnZ5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f4CAgICAf39/gIB/f39+flRISklJR0dGRT8/QUFFQkNHRURFTFhSTVRWVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A+QFZVWVxkYFZZYnJeXVZdWlZFUVlaW1lfVFlnUlVWWFVUVlRPT01KTEpJSUxNS09NU29zdnh5eHd6enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JWVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVxdWVhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH+AgICAgH9/f4CAf4B4eX1ZTktJSUlGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWFNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaW1hcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm5ydHd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlVTVF5aWFdXV3prWFpcXF5TUFBQSU5PV1ZYWlpkcXN2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUVFOS1JUUk1PWVFNTlFTVVVNUVNSUE5MTEhDSUhSVFVaXG1ydnZ1c3N3e3p7e3t9e319fX59fX1+fX5/f39/gH9/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lWUUxJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5DQ0NDQj9EUEJEQEM+QkhHVkBITk1HXWlQSEZPRkRFRkhHSEJDSEdISkdDQkFEQE9QTVJkc3V2dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWViXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz4+Ojs+QD8/Pz5rUUthRUZISUVCP0dMTkdNUVVJQkU/Pjw9PD09Pz0/QUNCPz48PUI+Sk1GVW51dXVzdHZ4e3x6fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXp4enx8eHd4ZEJAQEE9OkJDQUFEQlxdT3tOT09OS0xNT09RTUtMV01IR0BCPDk3NzU5OT07Ozs4OTg5PztBSD9cdHV1dnV2d3l8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eYGVgXV5xdmteYGdrd29vbGpvbm5sZmJZR0ZGSEJBRklFRUZETVJQYVdSWFFQU1NSVVtPT1FWUE1KQ0Y+Ojo2NDg2OTc5OjM2Njc5NjxCPWZ0dXZ3d3l5e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01MVFRTUVFVT0xSU1RXWFRUWFFMWFlaVlhYVlhZXVdXWGhza11WYHRrYWFfXWRgX15ZVVBNT05MSUdKS0lIRkNRUFNaV1RUTVFTWVNcZVVPU1RSTktJSEM/QTk5ODg5Nzg4NDc1Nzg1ODhHbnN1eHh6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5OTkxKRlBQVVlTVE5KT09VU1RcVlJVU1JOTUxJSEhGPz89Ojc4NzY1OTk2NzY2NVdxcXR3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9KR09QT09NUkpPUFBQTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFFQTk5NUE5UUlBSTElMS09RUFFSU1RRUk9MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB0dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVCRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjNAPmpvYVJSUUBGVFFQUVBRTlFPUE9MSkxMT1BOTlBRUU5RT0pMTU1LR0VFREI7PTw8OT1HNjY3NkRucXV3enx7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JDOEVOU11nU1FTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSU1MSUxLTEtHRkZFRDxBQT47QEU7PDg5VHFzdXl7e3t9fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E/PT1BQEI9PkVIR0RGRklHS0pARkFBQEZIRUpPSFFSYVxRUFJOU09PT0xMT01LTUxNT05bVktNUU9ISkhDSUpMTEtGRkZEP0JDPjxCRj9CP0FkcXR3e3p7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj87P0FAQD5BRElFQ0hHSUdJRUJCPz48Q0JBR0lETU9hZVFNT05XS0xNS0xNTU1MS05OU2RNSkxSSUlJRUFISkxNTktHSUZCQUJAP0VGRUhES29wd3p5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBQSEtFP0I9OTk5Oj9CPzxBQkJBRERHS0ZESUlHR0hDQz9CPz9AQT5DRUNLTlFUTEpJTVRGSUlKTEpLTElJTE1PUFJQS0dDTEdDQ0pKTE1PTklKSUdDQ0NESUpNTElac214eXh6e3t5fHZycHVydHl5dnhqcW5qbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxanFoZXFIS0NGSEhHSktJSkxER0I9Pj06Ojo7QUI/PUJCQ0NIRkpMSkVJSUZHR0NDO0FAQj5AQENFQ0lNUEdIS0ZIS0RISUtNSEpMSEhKTEtNXVJJSEROR0JFS0tOTVBOS01KS0ZHR0pNTlFOTGNuaXd2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkb0ZLQ0ZFR0RFRUZFR0NDQD48PTo7OjpAREA+QkNFRUlGSkpMRklJR0ZGREI7QkNDPkBDQ0NFR0xOSEtOSERIRUlMTk1HSUxHRUZJSUxOS0pIRU9JQ0dNTE5NUE1OTk1MSUhJT1JRUk5SZmdmcm9zeHV7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lDRUZFQkNCRUBEQj4/Pjo7Oz06PT9DQT9BQ0ZHSkdJSUxIR0dHRkVDQD1FRUI+QURDQ0VHSElHTVBJRkZHS05PS0ZISkZFRERJSUhLSUdIUEtESk1MUE5PTk9PTkpKSE1SVVRST1dkYWFtZ3Byb3N5emdlaGhjaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NCQUJEPUJBPkE9Ojo9Pzo+PkBCP0BCRUdKRkpHSUdGRkZFREJBQUZGQ0JCQkRFREdHSEZMUUxJT0pKTEtJR0hFRkVEQ0lISEtKSEtSTUNPT05RUE9PTk9PS0tLUFVXVlVUWGBeXWlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNxcmtrc01GRkVIQkJBREQ8QUFAQzw4OT0+Oj89P0I/QEBERkhFSEZGR0ZGRURDRUNESUZDRkVCRUdFRUZHRUpNS0hRTUpLSEhJRUZJSEVDSUlKS01LUFNORFFTUVFSTk9NTlBNTE5TV1ZXWFZYXltdZGBoYmppZ2tfZWVnY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hCQkJGRTxAQ0JEPDc6PT47PjpAQj4/P0NFRkRGRERHRUNFQ0RFRkZKRUVJR0NHSEZIRkVDRkpKR01KTEtJSkxGSUhLSEVLS0xNTk9SVE9JU1VUUVRQUU1OUU5NUVdaVlpZVlpeWlhhYGBgX2hlY2BkZWhnamloamZobmxsbm1xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9yc3lNSEhHSURBQ0hFPEBFQ0U9ODo+Pjw8PEFCPD8+QUJGQ0VCQkhEQ0RFRkZHR0lGR0tIQ0hIR0lHRkRIS0lHS0hNS0pLTEhMSk1LSU5MT05PUlVWT0tVVlRRVFFSTE9RUE9UWVpZXFpZXF9fXmBjXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtJS0hKRUJFR0U8QEdEREA5PD5APz4/Q0I8QD5BQUZDRURDSERGREdGSEhGSEhJS0pFSkhIS0hGRkxISEhKR0xMTExMSU1LTU5NT0xQUFFVVldPSlZWVVNTUlFMT1JSUVZbW11eW1xeYF9hYGJkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cXV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd292SUpMSUxHQkVERTxARkREQjs/P0FAQEBEQUBCP0FDSEJFREZIRUlFRkVJSEZJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOT05PTE9QUlVYVk1OVFZVU1JRUE1OVFNSV1teXl9dXWBgYWFhYGJkZWJjaGJkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV0c3BzdnR1dXd2dXV0ZXFza3BxanJ2b3dKTUxLTUdEQ0FEPD9FRUVDPUFBQ0JCQ0ZCQ0RBQUVHQ0hHSEdGSkZDR0pHR0pGSUxISUpNS01MR0tJSExLTlFLUlFMU01LTk5PUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV9gYl9gZWFhY2luaGJpaGhteHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJycXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0RBQEQ+PkRFRkNAQ0FFRERGQ0NFR0NCSUVCSEpKSElLRkRLSkdISUlJS0dKSk9LTkxJTEhKTUtaZkpkXEtsUkhPTl9uVWxzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmXGx0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj89REVGRENEQkVFREdCRkZHQ0RKREVKTExKTE1HR01KSEpKSEtKSUtKTkxNTUxMSUxNTFtzYmRwXmxsVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9ccHVncE1Kcnl2a2Jga2VlbXhta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0JCPz1CRkdCRkNFREVFRENISEdERUtHR0xNTUpNTEZKTkhJS0pJTEpKSktNTU5NTU1LTk1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW92XFlsUVxtbVpxbWtvbXh4dHNpcFxgc2xxalV1eXhwY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hFRUVCQkI9Pz9GR0JHRElFRURCRklISEVHS0pHTU1OS01OR0xOSUxLSUpNSUtKSktPUE5OTUxOTUxcaGR1XWxxV2xOT1FtVVprXmtsdmFsZHRUZWNObVlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdoYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR3SU1HSURFRUNBQjxCQEJGREdGTEhFQ0NIS0hIRkpMTEZNS0xSUkxHTU1ITkpJSE5ISkpJSE5PTk5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF5uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2diYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRIS0hJQkVFRUFAPkNDQkdDSElNSUZDRkpMSUdGSk1MRk9KS1dSS0dLSkpOSUhKTElLSklISkxNTUxJS0tLU2tiWmleX2pjcnJaX1lqb19lZVVrX2NbYWJRYGxoXWpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3c0hIRklERURGQUBBRURER0JISkxIRkRHS0xJRUZKT0xJT0lMW1FKRkhIS01JSEpJS0tJSEpHS0tLS0dISkpMTExLSUtMTlRbXFRQVE1QT05PT1ZRT09RT09RSkpPUFFkcWlUWVdbW1xVWVtdWF1cXGNmYWFmYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzR0NFR0ZGQUVDP0NHREVHQ0lLTEhGREdLTEhER0lQS0xPS0xXTUlFRUhJSkhJS0hMSkhGSEhKR0dJRUZMSElLTkxJT1xXXk9cW2BeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZF1iWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHh5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRElFR0dGS0pLSEVFSkpKR0VISFBKTE1KTVNJSEVBSEZKSUtLSUxKSEZFSkhFRkdFRUpHQ0pNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOX1xeU1teY19aXWBjYFlfYltgXltUWFhaX15kYmJhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh2cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklJREZLS0tFRkhJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRURERUFGSkRASktJT1tjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtRW19hYV1eY2FgYmJiY2NlWlJZVlVcW15jYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkNHRUJFR0hGR0hJRkdKR0hGSEtJTERDS0pOTUxMSEpKSEpHP0dGTkpLS01LS0tJR0hEREBEQUhJQT9JSkdPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUFBdX2FjY2NjYlxkY2JkY2ZYUVVUU1xYW2FfXl9hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1CQElGQ0ZLSUZGR0hHR0pGRkZJTEpORUNLSkxOSkxJS0pISUdCSEhRTUtLT01LS0lIR0VEP0VCSEhBQUdGRFRdWV5YX1lfW11VWFhQXV1RS0pXXlheW11WWmBSUV9fYmJgYGJiYGNiYmRkYlhPUVFSW1NcXl1eXl9fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSENSS0ZISEhFRktKTVBFR0lJS05MTElMS0lJR0RIS1FPTUxQTE1LS0hJQ0VBRUNIR0JBRkVCVlVFXFReU1ZfWE5UVU5aW01KS1VgYVtfWF9eYV1PWWJcYGBfYmNiXWJiV19fVFBPUFFYUl1cXF1eX2BhZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJUmNQRFdfSUdHSERGTUpQUEZKSUpLTkxLS0xLSkpHRUpNUVFOT1BNTkxOSEtBREFDREZEQ0FERUFMSENMTFBPT0xGTUZHSUpIR0xMTU9RSUxPUFBTUExRU1JVWllXWVhYZFZPU1RQUE9OUFVUXFlZW15eYWFlZmNoY2ttcXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXkxHSFlNR0hKSEdOTFFRSUxKS0tOTlVOT0tLTEdHS1BTU05QT05PTk9IS0VgRURfTERmY0RNW0heXHNtT01WbVlMQ1BgVWxXZ0pdWFZeRExRVUxNVFZRUlRYV1RYVVRcVFBmWmhoZFlUa1RXVlVbXFxgYGFiYmJgZ2lnbmxocnp8fX6BhISEhIODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09USUtHYFRHSk9KSU9NUlFLTUtMT1JVUk9PSkxOR0hNUVtZT1BQTk9QT0lKUH9RSXxZWXJzWFBtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlaX1ZVV39qdHV1X2F2X1hiXFxmW19hYWFiXmBiZ21wbGBwd3R4gYGCg4SCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdJTEZSVkxLT0lLUlhXUU5PT01RVE5PUVBLTE9HTVBTW1pUUVJPUFBQSkhaeF1UeGRoWVJUUXZndGxwYm5ma1FyT013bWpycHNycXJwb3CAXWV6dXhxcXpxfnN9a3V9YlJofGVzc29zc3x9b355b39yYGBgYmFaYWBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpQT01NSk5WXllVTFFTTllZTFNTUk5MUElRUlRZV1dRVFBQUFFLR2Z4bGN4cW1aSkxVeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/cGdvWHZ2anZ1cIBhc2h9aWx4fG9fX19jYlteYmRnaWpkZ2JjZGxscHBzdHNzc3lxcnhibHVncnl7c3N1eX6Bc3Z6bnx9eXhybk5KU3ROQ0JFUFBJS0tKTFBPT09NUFpgWlhLVFdQYV5SVlFZU01QSVNUVVhXV1BVUE9OUkpLcm91dXF1cWRoYVZuTHFwXkZoeVd2VEtoeH14YHl7c25hXm1vZFJncnVubXlwd2x2c3RxbG1cc356a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGVlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tS0tbVkhHRUdSUEpMTUtMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZVV2xPbmx7c2FqZ392VUtXa2h9bG1seGBbcHp7XmB6c2Nyb3hxaGR8aXJ7XVRLbF92dWtpdXt7bX54a3xwXV5eYlteYmRlZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtobG1yfGttaGt7dG1ta21PR0pLSEpISFJRTE5QTUxUU1JPU1NXUlZUUFdaVlZUVFRhYFFPTktUU1NRVlZPTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFhRTlBVVFhYWFtbVVNTV1tXWFdaUFNVV1dYUV1YVl1VU09YUldXV1haYFtncl5bXFtdXl9jWl9jZGVmZGNjYlljY2ZmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0tMTUtKVFJNUVFQTFZVVFBUVVhVWVVSWl1WVVRXVVlYUE9MTldUUU5VU05QTUxRUEtKUVJLUU1LS09SVFJRUVNTSUhNTk9RUlFRUVRWUlhXXFdTU1BRVVVWVFpRTlNSV1VUWVZUWVVTUlVTVFVYWVdeWl9hXVxbWlxcYGNcXWJjZGdlZGRhWWBhY2FiaWhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkY2ZoUEpLS05PTE1UUU9UUVFNWFdVVFVXV1daVlRcYFZXVllVWFRRUEtPWFNQTlVQTVJOS1NQTU9VVE5RTk1OUVNQVFFTVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXV1dZW1NPU1VXVVRZVVdZVFJSV1VVV1xZWmBdVllfXV5dXF1hYV5bYmJjaGZlZGJYYGBiXWBoZWZkYV5fXV1eWlpfWl9nYF5dXWJoa2FnZmhmZGBiY2FQS01MUFFMT1RQUFNRT1FaWVhXWFpaWFlWXWpkVlhZWldWVFRPS09WVFBPVFBQUU5NUVFQUlhUUlFPTU9TVU5XUlRVVU9OTlFTVVVUVFJUWFZaXVxaVlZRUldYVltbVlBTVlVVVlhUV1dUUlJYVlVaX1peYF5WXl1eYFxcYGBfX1piYmRoaGVkYlliYGJeX2ZkY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST0xQU1JVWlVUUFBMUFdWUVdTU1NYTU9QUlRYVVVVU1VZWFteXVxbVlJPVVZWW1tXUVNXVVZYVVNYWlRTUVlXVlxeW19fYFVhXGBhXmBiX1xgXWNhY2dpZGVgWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFlcW2BeX1teXmFgX2JcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWF5cX1dcXmpxd3mAY1xbVlZYUk5PV1NOUVFQUlRSTFFUU1laV1VPUk5TWFZUU1RSUlpPUVNTVltWVldUVlpYXV5cXF5WU05UVlZcXFZRVFZWWFlSU1lcVFJSXFhaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2lkZl5bZGBhYGFjZV9iX1laXltcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFpdXl1bYFxgVVxdaWpyfXNsaFxVWVdRT1JbU1JRVFJUVVRLUlZVW1laU09TUlZWVVNPVlJTWlJUVVRYXFdYWFNYXFheXVlbXlRVTlZXV15bWFFUVVhYWFRWWFtUU1ZdWV1dYV5jY15ZYFtlYl9kZF5eY2NhXWVmaWRmXV5kYWBhYmNkX2JeWFpfW1xbWFhYWFdbWlxgXVtcXFtYWlteVl5ZXVBPT1JaUFpVVVdWVFRUXl5gXl5iXGBVXV5ia3l0bH1sWlVaVVFRU1xUVFRVVFZZV0xSWlZdW1xST1VTWFZWU1BYUlNXU1dWVltdWFtZVVpeV19eWVxaUldSWVhZX1pZU1RWWllaVldZXFZUWl1cXmBhYGVkXV5dXWVhYmZkXl9kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVpXVl1aXV5bWltcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXWBemhYWVpUVlNWXFhXV1ZWV11YUFVcWV5dXVRTWFJYVlNSVFhSU1ZUWFhYXV5YXVtVXl9YX19YXFZSWVVZWlphWVxVV1daWlpYWVpaWFZdXl9eY2JiZWVdYlxgZmJlZmRfYGRiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVpbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlRcVFZXWVdWXGBhYmNhZF9fVltgZGFfenVvaFpcWlZYVVdbWllbWlhZYFdQVV5bYGFcVFVYUFVWVVNWVlJTVVdaWlxfXlpfXFZfX1pdXlleVlNZWFlaXWJaXlZXWltbW1pbWVtZWV5fYGBkY2RlZWJkWmJmY2dmZV5hY2BjXmNjaWRkZ19nXmJiY2FhYF5fWFRaWlpbW1hbWFhcW1pbV1daWFdcW1xgXVZdXVNQVlpXVlpVWFVYV1hdX2JhZGFkYV5ZWWFkYmBsZmheXF1bV1hYWVxcXF9bWVtiVlRXXl1hY1xTVlhQVlZWVlZWU1ZUWFxcX2BgXWFdV2BeW15cW15YVlhYW1tfYFxfWFhdXF1dXlxaXFhbX2FeYGRjZGZmZmJZY2VlaGdkXmNhYGVjXWZpZGVoX2deY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTVJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYmNiX2FgYV9cXF1YV1tbXV1fX1xaXWNYWVhdYGNkX1JYWVBYV1hYWFdWV1ZdXV5gYWFfYl5ZYV1dXlldXllYVldbXGBfXV9ZWV5dXl5hXVtaWVxfYl9iZGRlZmdnYlpkZmdpZ2NfY15hZmRaaGljZmljZV5iYmNhYGBfXV1aV1tZWVhYWllXWltaWVdYVlVbXV1dYGBiYnhLV1dcWVddXFxdWldcXV9gYmRiYmFdYFhjZGJgY2FjXlxcXFhXW11fXWBfXVtgZFxcWFpjZWNhUlxZT1hXWVtaWVdaWmBdYGJiYGFjX1xiXV9dW19eWVlVWF1dX2BfX1taXl5gYmNcW1dbXWBiYmNlZGdmZWdkXGVmaGlmY2FiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXV1hQWFpdYWNmZnJrf0pZV11aWl9dXF5cWV1cXl9hY2JhYV1iW2JkYV9jYmJdXFtaV1hqcWBcYF9dXGFjX15ZWWNlZGFUX1pRWVdcXVxbWltbY2BjYmNgYmRhYGNeYFxeX19aWFZbX11cYWFfXVtgYWJlYl9dU1xfYGNkZGZlZ2ZlZmVeZWZoaGdkZGBbZmdeYWhoYmhoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3p6ent8fHx8e3x7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnd3dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3p6e319fX18fXx6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29wcHp+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmIjbG1tLS0tLhRJisrKyoii9vS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29veoB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIuRu8C/wMC/xEkUGxsbGxCO7+Xl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEg4GCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXV2d3d3d3d3eHl5eXl5enhvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2AgYGBgYCBd3Nzc3Nzc32FhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5dnZ2ent4e3h3dnh7eHp5eX16eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3p6enp6eXp8fX19fX19e3p6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx6e316fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHt6fXl8enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3d6e3l8ent6d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en18fH17fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5e3h7enl7eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChISCg4KHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYCCg4GChYWFhYaGh4aFhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OCg4SEgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoWEg4ODgYOEhYSEhYWEg4KEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgICNjIGBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYKBgoGAg5aWg4B/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAgoOCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIKDgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKBgoSEgn99fXyHmpiGhIKEgoF/gIKBgoKBgoSCgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4SFg4GBg4OLiIV+fHx9fn+ZmoaEhYSEhIKBgIGCg4KChISDgoKBgYSFhIODg4KCg4SEg4ODg4OFhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhIODg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+AhpqRhnyCf4KKfpCag4GCgYGCgoGAgoKCgoGCg4OCgYGCg4WDg4ODg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYSFhYSDg4SDhIOChpSUkpSSj42Lh4SEg4OCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f36FnZ6Fg4uAgIWAgYmBgYOBgYGBgoSDgYGCgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIKZoYeEhYiHf39+gYSDhIKDg4OCgICAgoKCgoKCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgpCcg4CAgYF+fn19hIWFhIWCf319fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDhouBgH+Di4F9fXyDh4aDgH5/fn5/f3+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4J/f4WHhIF/foGFgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoaGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgH+ChYKChIKBgIB/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEg4F/gISEg4GBgYGCgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYmLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+RjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODgoGDhIODgoKCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYSBgoSDg4ODgoKCg4F+fX1+fn5+fn19fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeGiYiDg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaDgoKDhIKDg4SCgYKBgYGDg4SDhJGSkY6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhYCChIODg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GDg4SFhYWDg4WEhISEhISFhIKCg4GEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4KAgIKDg4ODg4KCf319f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYOEgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn2AgoODgoOCg4J9fX5+gICBgH59fX19fn18enp6f4KCgH9/f39+f3+Afn2Af3+AgIF/gICBf3+AgIF+fX1/gIF/f36AgIB/gICAgH+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fn6AgH99f359fn+Cg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enl6gIB+fn9/fn58fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7f35+f39/fn1+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gH+AgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXt6enl5eXmAgoKChIOAgoOBf4GAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f359fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDgoODgoODgoKCgoODgoKSkIuIiYeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaGh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhYSDg4SDhYSEiJKOjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAf4CBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WFhYODgoGBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWChJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn5+gIJ8fH9/goCCgH58e4qCfYB/foGAgIGCgYKAgYGBgH+Lk4+Mi42OjYiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYWGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSRjIyNjY6KhYaGhYSEhYODgoKDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2MjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKNjIyPjYuKhoSFhISDg4ODgoKCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gH9+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CKj4yMi42LioiEhISDg4ODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gICBgYB/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYKBhYaFhYeGh4aBhJGOjIuKi4eIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fHx7fn57fHt8fHx8fXx9fH58fXx7e3t8eXt8e3t9e31+fn+AgIOHiYmJi4mLiYWIkY2LiImHhYWDgoKDhISDgoKCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn1+fn19fH19fX19fnx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+goWIh4iKi4uLiY2Rjo2JiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjpCNi4iIhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58fn+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiOjYqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIOAgICAgoF/gIGDgX5+gH9+foB+fX5+gIB/gX5/gH9/f39/fH9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHt8fHt7e3x7fHx8fXyKioiIhYWFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6Af31/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx6fHt8fomGhoWFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dXSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4KEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKEf4OCgoKDgoSCgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Ag4F/gIOCf3+Af4F/gH98e3t6fHt8goB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fHx/fn+AfH9/fX2BgIB+fX2Af36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4KAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398fn9/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+fn+AgICAf4GCgYB/fn+Bfn+AgoKAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9/f35/gH19fX1/gICAf3+Af3yAf3+BgIGAgH98gH99fn5/f31+foCBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhIOCgoSCgYGCgYCCgYCBf35+fn6Afn1+fH+AgIB/gIF/fIB+gIB/gYCAf32Af35+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4eHt4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHJ5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59gICBgH+AgYB8gH+Afn+BgH9/foF/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+gYSCgoOFhYKCfn58e3t8fHl3fHl3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFycHh3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB/f399fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn6AgX+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4CAgICAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/gYF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHt7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg4B/goGEg4OEgYGDgIKDgYGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/f4CAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICDgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYB/goGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fX96eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGCgoCBgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4KBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoWGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhIWEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fX18gX16fHx9fXx6e35+foB/f4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhICEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fX19fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEg4KCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCf318fHt8fIB9fX6Afn59f358fH19fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/f3x9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+ChIODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4KBhIOBg4OEg4SEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+fn9/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISDhIWFg4eGhoSFhISFhIWEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIF9gXWBeYN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgYSDgH99fX59foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhIOFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SFhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBzgoN/g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYGAf3x/fXyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKGhoaFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhIWGh4aFhYWFh4aIhYWGhYeHhYaEhoaJiIWEiYqIhoSGhoWFg4WGhYaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYaHh4iGhIaFh4aGhYSFhYSFhYaJioeFhYaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFg4aGhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH17fHx9f358fH59gH99f4B+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYaGhYWGhIWGhoeHhYeGiYiGhoeHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhYWDhoaFhoWFhoaFhISFhYOEh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fn1/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoSGhYaHhYWGhoWEg4SEg4OHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWHhYSDhIODhIeBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fXt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4SDg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e318e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhoWDgoKCgIOFgoN+gYGBf4OBf35+f31/fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2AfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWHhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYeGh4SGhoaGhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhIeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhoKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOFhISGhoeIh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhIWFg4WFgYCDg39+f4B/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp6fHl6ent7e3x6e3t7e31+fX2AfX18fH2Af318hoOGhoaGhoOEg4aChYGBgH9/gIB+f4CCfH5/f36AgIGCgoSFg4KBgoSBgIOCgYCEhYSCgX+AgoODhIWFh4aFhIaHhYeGhoKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SDg4SDhYSAf4KCf31+f35+f4R+e398fICBfYGAfX2DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SFhYSBg4KDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn99f4J8f359fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vKysrLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU09LT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0NHQ0NDQ0NHR0dHR0dHNysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fb29vb29vb29vb29vb29jW19fX19fX19bW1tbW1tPS09PT09PU1NTU1NTW1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzZaEhoaGhoaHh4eHh4eCsuLd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0j4yMjIyMjIyMjIyMjImiv7y9vb29vb29vb29vL/S0tLS0tLS09PT0tPT09zj4uLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5uUFNTU1NTVFRUVFRTTKDz6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFpVVlZWVlZWVlZWVlZSfK6qqqqqqqqqqqqqqqiw0tLS0tLS0tLS0tLS0tHg7Ovr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zOcVRYV1dXWFhYWFhYV1Ch8enp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpZ5fWVpaWlpaWlpaWlpaVoCvq6urq6urq6urq6uqsdHS0tLS0tLS0tLS0tLR3+vq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNznheYWBgYGBhYWFhYGBapO7n5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaqjaGRlZWVlZWVlZWRkZGGGsq+vr6+vr6+vr6+vrrbS0tLT0tLS0tLS0tLS0t/p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3HxcXFxcXFxcXFxcXFxMvQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Pzs/Ozs/PzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzMzMzLz9PT0tLS0tLS0tLS09PS1NTU1dXV1dXV1tXW1tbY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz8/Pz8/Pz8/Pz8/Tz8/OzM3Mz9PS0s7Nz9LOzs7Ozs7O0NTSz87R1dTTzs7T08/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX19bX19fX19bW1tbW1tXV1tXW1tbW1tbW1tfW1tbW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Oz8qWpdHTrYODlc/SpKHQzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8+cqp2ty5q6uJm1s5+hqdLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q/QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DLlIianryijICNxZ6YlZzI0M7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEI6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0b3ImZusoIis1rqZoZ2wstPPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Sl5Sisaitm6aymZavs6rV0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Ts5vEmsGinZWnkJqEnZOk1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0c6NkJ7Ep7Srn3+gqYWZpNXR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NHL2qiZsM7awZyAvK2mmK/W0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Nzk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT48Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJjqWaoKeRoZ+gmaiWmJu71dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NDc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HKu6Gmp563pKujnsOgq6Sc0dPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09OekI222aePj6zYwo+NvNXS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0rrE1dLVv7/W0tXFxNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLV1NLS0tTV09PT1NTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUhJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdITk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6WlpKSkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSkoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampuam5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cm5ucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnp6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9bXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVWJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipKmnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6mnqaijp6aZnKSmoqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6yppJ+ioKKmoaaupqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnNfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6KvqqqsqKirsKmoqqihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustq+zsKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYW1odWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCxtLW2vLy+vLy+xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsLDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlZGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0NERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb21ocXhveWppYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbDxMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ3c3lmZ11kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDw8HEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpnXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIyMnHxcnHyMe/xcfExMfIytPP0sy8uLa0uLjBvr66vbq8urysraequ7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLCycHKysjGzMrNxcbFw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVvdGJdYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBwsO/v77Ey8jKy8e91NPHyM3Iw8jJycXFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVnZGplYWptbm9eWVxWVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDubi5u73Bx8HEzb+Qy8bFxMHEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e9xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmdjW1paXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba4tLS1v7u9wLm+urq0wLi1uLOuuru2v9GfiMDOu7/BvLvEvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+urW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vsvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWNgYmJnamdmaWVpXVZWVFlPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0FAQz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5OSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tbGwtbe1u8G4vrm/vLy3tLewrbe2uMTLjIWbyL27w7W6x7i2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGhoqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2hYWE5LS0tSSUxIQzk9OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb++vLKtr6yxsLe8t7u9wcS5t7m4sLq0ubzJuoOFhrXEvse3ubitt7W4urS4s7vFxsvBvMbAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3ubG9vrvEtrilh4CLe46cxaN8g4Wxy8bPwsC4rrW1vL64urK+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG54Y2diW2NRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuro7C4ydO2ur68xrSieGVyZVVgZoeNfYeHqs7O0czKxLW6wMPIv761v8G/xsa/y8bDv8G8wMPMysfFxsC5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmBhTkhNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPEFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLGzv8vI2769vbyBanZgZ3ZeV1Zcc4CJi6jMyMzLzcrGwsTLzsK8ub25ucDDv8jGxMHBv8XAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLW8tcaQccHTwLR9W0xvYVB8f3ViVmB+hpGpxsLHy8jBw8HAycrCwLu6sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKyr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXptc3hzZ3BdW15cWVFFRENNSUFFPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7vSl3KDtcKbWFRWjWJSZICEhW1JcoaXtMK9v8bAucC8vsXEvb25srCuuLe/w8fDxLy9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra20t6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG5pW19gWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPkNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnC15h/couudlJPbJlaUlVampR3TG6OorS4uLjCurO7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9mXVpUSjw/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w9WdiX14lWBOao11XVFdbLq1dVRXj7i1srG3vrmytbK8uby2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZxbF9jYVtdT0hBPj1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8DKn4mBfYBYWJKPZ3Fgd3J6l3dua1+LvbOwtrq1tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybWNdZlhcXVJOTUE+SUJBSklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i5xauViYx4TGagw32Gm5Bdf3lsdXmJsbq1sbS1srSvrLu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxCRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7u3lpOgik1okpN2b3lyaGlrdoF3eKW8uLK0s7CxrbC5uLa8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usqq+jpKOhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yt6adqJNYgHBzbWRrX1lXWFtiX2yBm7myrbOvrqyutraytLWvqqSem5ycnqionqCoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKurn6aim6OclZCMj4+Qk5CXlZaYn56empiml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR1BNTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6WsqbDAsbN8eHZydGVXVk9JSUtOT09ca3CmtaqytK6qq6+wsrOupZ6SmJSPmKCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6aqsaOlqJ6gnJWTkI+RkJiQlpWYl5+Ym5mao5mXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01KSEdPUk5KTkc8RUA9Mj83NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaGmx8SmYWZpcmBST0pwVVZKT0pMVF5dgbevr7O1qqesq6KcmZSOkZaXmZmcoKKinJ2lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmpabl5eYoZ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHl5YGJSVWBJSUpLU1RJUlBMOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWenLu8fW9pamFUSldwnIt6WUxGR05UVGiusrCwuKymoZydmpSXmpqQjpGVkYyOjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKxtKqyr6KZnJ2eoZmbm5qYmZuUlpuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVbU1pZTVFKT09VTFNMQTc+QjY4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpyim56pq5Z9a11UTU1cncTLqW9ZTEVDR01hmLCtrK+nn56ioJeRk5ugnJmXkpOfnKGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7itsrSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqShoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFJVSEZVVkpCTEc9S0g4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKZnpuhoaOKb19VUlFVacDj0rSdh29ZSkVUkZidq6qppJ+fmZKSk5iYlpaVjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqegmaegn5+nqKWkn52qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JXTkpHTUdDRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKOid1lSUVRWaIPAzLOYsciwlIqYucWiqa2pqqWfnp6hop2fnZqcnJSTlZSenpiUhZ2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6u8DEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsO8w7y3s6mzraqztK+zrqqvo52rp7axraKwpqGjr7GtsKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHFra3VycGhXW1FFVEhESlBIP0VBNEZIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfn5qhnWhQS1BRaYGctbqnh7Pg29bb2si0rqejo6GgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Aw77HxsK3w8nJwsHGvrq0urq0u7ewtbKqurKuu7e/u7qqt62rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrZGhveGpkWltGS0xFRFNMREJFNzo/OzU0OTk3OD4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaKdnJVdTEdOWH6TwLikkJjV5NvRxLSmn5qcm56emZeXl5KMjpeXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxszR0tXO08m9wL/Du8bFyMXS1M3T0NPTzMrCxsbHysjOv8jRzMfFx8XBvMPBvr++tb6zrr+/wsPHxMfErr+4sri8w8HBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURDQDU1NTg6Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOfnJ6WYUpKTmaKutfTv6/A1Mu5rqiin52fmpiWlJKUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NbY0tfNxsfJzMPFys/K09fR19LV1tPTyMzHzM3J0s3O083FyMnKwcbLx8jJxr/Ds7PIxMvKy8/Gyr++v73Bx8TMzMjJv8O/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxBPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2gpHVdZ22NvNjc2tbLurKqo52dnaGloJ2alJSVlIl8d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDW1tbS1s3U1tfU09HT1NTTz9HD0NPW2NXW0svJztHLxs3SytLW1tnV19PW2M7Sys/RzM7QzNLPv8jHysPMzMzOz8XGx7a/yr/RzcvPxsnIv8PDyM7Mz9DPzcrHzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGVyYl1SXElKR0FFSEk+O0E4PTQ1ODU7ODY6PEA+Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWfo6yKf5Oz0tXa2s+8rqiblZignJuhop+bnJmViXdpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV19fX09bP1dTa1NTOz9XU1NHRzNHN1NfW09XQz9LT0cnT0cjQ2NfY0djS19nV1szPz8rN0svO0MDGwsfFzs3R0dHIzM3AyszF087LzsjEysfGyMzK09PR1c/SzNPBucWxpai1rqebqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpq63qKu319TV2dnRztC/vMzJtr6upqqooaWcgJSWx9jT1sKtpqGYlZeZm52gnpmdnZN9cWVjY19fYV9fYWBfYGBfYGZucHBua29yd3eczMHS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHG0dTK0dTV1s7S0NjY2NfLyM7Eyc/MyszAyb/Hyc3Oz8vQzc7Mzs/Iy9DQys7KwsnHyczKy9HSzNPR0c/Qyr3IubCuu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1XRTtAPTMzPD04Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HAsKmsramnf2yBlNPWzbCbm5aVl5uenp+dlJaYlIhrXl5eYWRiYGBhYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Hzs3N1MzO083L19bQzNHUy8zQ0tPKztHV0tXVysDJwcXMwsjJwszDxcjKys/KzczQzdPLxsjPzcjHy8XGwcXKzM3P0cbQzs3NzM/Fx8G4ub3Dw73DubOyvrG7w8S1qpilopmWkZWVkouUjZqRlJSPj5SCiYV5cHFrbWdgYHBoWFhoVkxGTElQUEI7Qz47Njc6ODk6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWvtKigqmhvfafZ0KqVjo2YlpGTkpGWlpaQi3xlYWJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytLIy87NxtHS0M7M1MrHy87Px8fP0svQz8W6xL/Gyb3Cx8nOxcLIwMfNyMTMysvPyMTE0MjGwsbIxL7Ax8zMy87Cy8vIx8vQxMXIu8fDycjCz8G9vL+wwcnHub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd290ZGtgXmZwYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLrNzcbQ1dXZ2tvY0MnPz9HTyMK2u7utpaJfb3i50KuQjo6XkIeEhISCfoWFf3NgW15eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsnGwsPAw8jKycjKyMHFzMbIy83JxMLLycHCzNDFy8i/ucG7xse+v8bPy8O/w7vJx8i7yMbFysC9wsvGxcS+xry8wMPFzMXFu8DKwsXH0sXByb/KycbIxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhpZujoJuUe3ZzdGZpWmFubFpbWFJETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+srKRX3KAvrCQi5OXh3uBhYaAdnh1cnBfW1tdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsba6srKzsrHCvLy8urjBwcLFvr25vb+5xMrFxsK9xsC4u8TJv8LJu7e7usXDv7zBzcPGvb21wb3Dur3Gu8K6s7zFxMHCtr+2tb2/u8zDvLW6yLq/vsvEwcbCxsnGyMbQxsLMx7LHycPOzcHFw8C9s7ewsqeoqLmwpa2wqq2slHl2d2pkZ2Bob2NWXllKRkpGSEpBRUJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztHKysrHzc3O0cjQxtXU1tfNys/FycXHwbnFvauvg2N1j7WSjImLhXmBh4eAfoR8dHRjW1xdXmBgYmNhYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLW3tLOztLy2vbG3sLWvsrvCvMHEvL+6tbO6vsC4x7m0u7bBwry4vcbBw7u1rrK2ur+0xLe7tau4vb3AvbG6tq+2urPFvLeuu7+1t7TFvL7DxcDDxcbIy8XAxsa7yMu/z8rHw8bCw7fDvb22ub7Hv6y1urW3to55dHhmZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjKyMrJysTPzdLPzcXHwcXAvrq4ybaqsIFrcpmcjYaJint5foaGd3iCfXRpXl1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaGZqbm5yfKTHv7i4tbCrrKeeoqqnnquts62prKm0r7ewsqmupqyyvLq2w7m6urGrtbm7tMK6sMCxvry7trvHucK2raqosLHAtri9sLCnsrO1u7yrrrWlrrWuu7Kwqbmwrbuuu7i7wMC9ucK/x8PFwbzGwsjLuMXHxb/Gw8O6xMbCu8bJzMuzucK8u7OIc3Z2a2lhYmxoWVdXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXPx83Bw8a/xMTDw8rCycq+v7zAurK0tMOuqa6Ga2SKkoiOkHx4foqFenuEgXduXl1cXV1fYF9fZGNiY2NiYF9eW1taWl1aWlpaXGRub2hnZ2lrbnKBrbmwta6mpaenmqCloZqcpauupKiirKqsqq+jpp+qrbW2sb25r7evqa64tLS8uLS8r7e5tbK7wbLArqWpoquxsrSovaqrqKusrbSzpqiuoaSvqbKmp6iupqi3rLGyt7q6u7K8vb6+xL+1wsHHyLe/wMS3xMK/u7/Ewr7EyMzKv77EwMCph3N0cmppXWFvZFdWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HLvrvJtr3DvrrKt8HDwbS1u7WwrrS7rainiGBtjYOIi4B7foB+eHR/fHN3ZV9dXFxeX2BeX2NjYWJgYF9eXVxaWFpbW1lYWlxfZmtmZWdlaWtvcoWqpayloJyipZSepZuYkaGjqqSin6Wlp6WtoJ2cpaassq+2t6ewq6iqtKu0urG2ta62ubGvurqxtqSgpJ+msairqLmqpKeoqKeyraCnpp+bpKasnp+npKCgsa2trLK0srSwtby2u8HBsrq+w8GyubnDs8C9v7W4u72+vMLHxMLDvsDEoIN4cGthZl9rb2BUWV5ITmdPVEdFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9taCelZ2hprq2q7Ozu7PEz8nLwsa4t8fBzL+4ybe7xbizxLi0vsCrtbuxq6SusqyfoYthgIeGhoF8eXV0b21rampxaV5gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1viJ2poJeWm6KWnKOZlo2eoaOnm5+fo6WiqJ6bopufq7CssbajqaqqrKyktLmtt7Css7WusrWusKqfnZ+korKlpqm4raKmpp+orKuZn6CemZ2fpZqao5ybna+pq6eqq6ytsbK4r7i5u7C2vLy6q7OzubO9tLaxsbW0v7a9wL3Dwbu7vZeDe3NrX2VeZGRYVFddSVdcS1BHSUlGQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vEw8++uce4t763ssG0sbu7q7i5sKGdqKqmlp2FZoKFhn94cm5wbmtiXmJmZl1dXl1dXVxdX2FhYmNjYmFfXFtbWlpZWFhXV1hYWFhaXmJkZGVmZmhpa3KNp52UlZWbmJuil5aRnKOiqJ2bnaWmoqacoKCbmK6ura6yoKWirqynorWxsrKsqK+yp7qzprWgop6bo6Kto6Kqtaqio6adpqajlpmel5manaCal56cnJusoauno6SmrauztKq1sLOrsrm0r6mvsrKzt7Ouqayusriwura6vb+3s7GUhXl1ZV5lXltZVlNaVUtbUUtJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+ynaWjmKWxwrW2va20uMLMyMbAxbbBv8fOt8DEvbO5ubK/trG4uqyxtK2dmKOonpGaemmBg4R/eG9xdHFpZmRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqKclJSQlZeXoJeZlZihnqGclqGiqaSfn6mdnJqrp6+wqpujpLiqoaCuqLaqpqetsKS3sKS3oKKbmZmqpqGarLiwoqGknKKfn5OUoZSVlpuYl5aXnJWfqZ2po6Gdo6qqsK6otKuqp62zsKWrrrKxsLCur6anp7KusbSwvLS5t66jlIF5dWReYVZZV1NSVEtNXkxPS0dHTExFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri9rp2nqKOqu8C9wLmutLjBzMfFwsO9xbfIzLLBwsGuvLu1u7y1uLmvr6+nm5ifp5KPinJ6gHx3cWlscnRwaWhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjY2JjYmNkZmqBlpOVjJKUlJuZnZeXnKCcoJahoKalpKann52fpqCqr6afoqS3qKGhoqi0oqWopbClsK2rtJ6gnZWVqqGilK2xsZ+io52emJuTi6GUkZOYmJOXl5iXnaabp6GimaOlpaukpbCnpaOrq62mqK6vrquoqqmzpaasr7Sxr7y1sa+uoJJ6dnJkYVxaXVhOTFJIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ3ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxuKyepaett7u8wcW6sbm1xMnJwMPGxse2xsSzwr/Fq7e3vba9u7q1squrpZiXnaGKh3F7h352bmNhZmloZmdqZ2ptYF1cW1paWlpcXVxbXF5fXFpZW1pZWltXVVhXVFRWVVNUUlVgYF9gYV9gYWNkaYGUk4mRj5STlJ2VlpekmaCXnKCloq2mpKSjo6KcqqulmZ+lsaqgoZ2lq52nop6trKmprayhoqKVmKObnJCrqbCbn6KfnpeZk4qekY2Sk5aQmJiTnKGinaSgoZWgoqSmm6OrpaKkqqSrrqWtsqmmpaamtKapqK2ztbS5uq+prJ6LcnBvYFtXVlVSR1FPSFpbT1JKVEtTTEVGSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm9sb7EyayxuMG1u8C7tLOoqaSUmJmah35wh4N7dGlpamxnamtta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV1eX19fYmRtjpCEkYeQkY+ak5WTnJujnJugqKmrqKynqKWkmaWupJSZpa+pn5uZm6Cerpmbq7OgpaafoqOhlZOblpaSqaqtmpyfoaCalJCMmY6LkIySjZaVkJ6hoKOcm6OVm6GjoZeiqKOiqKugq6+jrbelo6OirK2qqKuvs7ezvrWzq6+YhHRzaFtYWFJVUUVYTFFbWE1UTlBMUFFJTklCPD8/QT88NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62os7auqaevrpupqKy3tqy8yru2v6zLxsW4wc7PyLPEu7e7w8ixrbi/t7y9urKzo6eelJWWlIV4c4B2d25taG1ubXBnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXV1cXl9gZH6NgYt/jJCKko2XkZeZoqCboKyqpq6sqK+kqJqfrKCVlqSop52XkI+anq6WmKiqmZ+dlKWgnpKQkpGTlaerpZqZmZ6elY2Mi5OGiI2DkIuRlZGgnqGjl5WflZqhop6Um6Wlp6iooLGwprG8p5+jrLSrrqewtbC5tcCxrbGrkH1yc2JWU1ZOUklGVlBSUUxMV01KTE5SR01KQUNGREM+QDY1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OsprG3qqaisKudqqepsrGltsa0ubqzysW5usHL0Muxtri8vsHDsbCyt620s7qysaGhmpuWlZKBfnZrZ2xucW5xanBrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domNh5CKl4mUlJibmZ6pm6CqpqWrnaiZoaWbk4+fo5uXl4WEkpujj5SjnZaWloiim5uTi46KkJqkp5yVlZebkZGHlI6LgYuNf5CKkpKSoJqfopWTmJiVoqaZjZmkpqimoZ+0sqiyt6Gcoresqq2ksrKmtby2rKuxo4l4c21dTlFRTE9DTU5OUEtGTk5KSk5NUUlNSkFHTEhHQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2saWno6mloKilpLOqorLDtbWys8bGt7rDyszGs6y6vbS3wK+tqbCepq25rqudmJmblJKFeoFtX19mcnB2cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhZWFtdYW9zdnGFiIKIgJGEj4uUkZSeoY+bnKOho5ill6KclY2HmJqMc42Dfo2XloaRmZCUjo57mY+cjIKJf4qYn6OekJOYloWNgpR+fnSJjnmQh5OPkJ2amZqRlZCdjqKjjomaoKGkpJuitK+sr6yfmKW4pqaxobGunLC8qqmvqpmCd3NjVk1ST1BNQ1NOTFFNQlBRSElOUk1ISkpDSkxGS0s8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd4t6GjtKmmpaijpqWmpqazp6a0wbiwtLDJxLe5wc7FvrOsusGrrcOtqKKmkp2mtauhnI6UlZGOfHZ9ZVdWX2dmaWdobmNqaGdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5YcpCDl4aOnZeLlJCfmJ2VlJaVj5aJgJOJXztXb3yLlImAjJGMkIaGc4qFloF5gXqFlJ2Ug5WOkZCDhn2TeHFvhY19iYGRjY+XmpiTio+JnIefmIeIlp6aoaCXp6+praion5ats6Kmrpmsq5iotKKpraOTfXJuYFtOU1JWTERUSlBNTEZOT0lFTFFNS09KSU1PRklJPDc1OTk5OTk6Nzo7Oj4+ODo9PTc6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepp6OpsKintMG5sbWwx8K3s73Pv7mvrrXCp6rFqaOdmIOUm66gmJWEk46KhntydFxRTFJVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1waXuCdFBCQH+VkZF9iZSNhIqNm42WlYmSiIaVhnmIf2BKUW54ipGEfYSNioV/f25+f5R3dXV3hI2ZcFGNiIqGe354lHZod4aIfoqIlYqNkZKWi4SKiJSEmoyChJKblp6dlKSjqKmlpJ6bsKqhpKSRpqqWoqqcoqaoiXRtZ15bSFFRUk1JVU1TSUxLT0lIRkpOTE1US1FQT0ZJQzw3Njg6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6OnnZ+ir6GnqKWnqK+tqrW8tri3s8G7tqe5yLi2qKi1tqqyvKaelY5/iZOnlZSJfY2DgXx2b21YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+HgXyFjJOBkpmLj3uGj4B2f3hzbnVwdI2OgXp+iquFeXpodnuOcHJteIGLjZJ4eoB7gXZycpJ3Z3WEhISEe5WJiIqMi4B/hIuMf5SDfIGQmJWclZGfnamen6CdoKmln52Yjaekk6Gflp6epIByaGBcXEpWT1JHSlhST0pMTVJKSkpMUElMUUxSVExFSEE8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5NDc3OTU2NzYyNTI1NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpmjopicn7Spr6mlraywsaq9tLK7uLa6tLGft7qyqp2drKmosq+hmpGOlIGOm42QfnaFeHt1b25oWEtISEhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnWDfXlnd42XmI2PfWh5gXZ4gImPfYSYkoFxh498d3tva36tfXOQi397hpKBfX90ZnZ8hmxvaHN8iYyIgGx5cX1wbXWPcWlxgH6OcEOLhIKDhX93d3qLhX6Me3V+jpKPmIqSmpujlpmdmp2eop2WjYqlm4+el46WmI92bm1lYlpXV1RRSlNVVE9QTlBWS05LTk9KUU5ITk9LRUM8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ6WoKavrK6rqKmwr7GrvLisu765s6ynm7CnrJuPlpylqaSgl5mPhJJ6iI2KinZxfW50cGlsaVdLRkdFQUBDRElMTE1RUlBRU1VUVFVWV1dXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXljfHhvfHmIkHp9i4ZvbYySeXR4amqAgnGWkYuBfpaASZOYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmltcH9zjYmEhnp9fnt2b3RzhYJ5gXhwfI6MipSDlpeYmpCTlpeZl56XjIOJn5GLko2GkJZ+bWhtbm5XVVdUUlFZT1JUVFNYVU1OSE5LTU5LQ0hOR0U/Ozk5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp+lrbCirKqota+urLS/q7zCv6aimZWkl52NhIuUoaGYmJGTi3OOeoCFi4Z1b3VscGxka2pYTkVGQ0A8Pj5BRkZHS0tLTVBSUlJUVVRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX9wbX96i4l2gYiGdGyaknRzfGprnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtxgHxncXF7bpONj3tzfXxxcG51bYJ/eHl1anmJgoiKhJaTkpCLjZGUlI+XjoB5iJeIhoqGgJCHdmpqbmdkV1FaV1lZW01QVVZZWE5JSEVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCw1Nzc1NDc4aU84OzVukoiakZmWpKiunrKfprqvq7KwwrG7w8ealo+UmYuNhXmEkJiUjZCMj4Zxh4J0h4yFeXBzcW5vZHBmX1RGSUM/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHJ8eGx9bXKDgYWBeoSGhnlyoZV0eIFzdZSHNXGdqJ2OoaGEooV2cIZ8h3xzjK2NiYBnZmJqbnJtcIN1aW9YdXCOmpJ3bH97fW1xbXCAenN2bmN2hH6GgIWQkYqLiZGLkYyLj4N1eIuPgH6DgH6PenFwb2tfWlxdW1lYYF9STltaWFdMSEpGSkc/Q0FCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBk4iWkZ6kp56vlaW1qq6xrsGyu8HGlpCMlJCAiH1ugZCSiYOKh4+FdYKEbJWIh3t1eHhsd253Y2leSVBHPkA3NDQ5Ozs8PT5AQkVITExMTE5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8foWDf4x+dqKZeX6GgYWZhJucYYaqn52Lg5COeneIfomIjXOKl4+Eel1kcXR6e3eKbGdqYnlvhY+Cem6Bd3SEenB0endrbmled4d9h3yIh4+Ai5KXg42FjYd9cYR/hHx1d3t9iXVvcnNlZl9bW11TW2ZeV1FVWFtVR0pLRUtHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcj0yMzMzMUV+VzQ9OVyMeIqAlIySnZ2fppGgq6CxqK/AsbrFupaOkZSHeoV2a3+MkYJ9ioSOjHiDgXOhhIt9fYF/cIB+emd2a1JXTEBFMjExMzY3Njg4Ojw+QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxxfI+Men2Jh36Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkaiHgJiYipxzbXyBhod9jmhnaHh+boWHgoVxhIVHa4B3cnl2aG1rX3d9g4l/iIWMepWem4qLiJF/enWLdnx3bW93fn9zcnFqWl1cW2NjWGZlXFVQUFZZUERMS0ZOSUNGQ0NBQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyImJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFiJGPlpiSl6GdrKGmuK+zvLOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1ZLQjYwLi8yMzEzMzY2ODo9P0BCRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYGEgoWRk36FiZGBmpWCoKGXlZuapa2Tmruxp7vHw6iKjKGlj5SJgZF7coSen5Gcf3aFhYqPiJBqaG+DgHWNh4SLcYaCd4eAe3aFfW52dWeAlI+GiYiIiIehq6GWio6Yf3uCiXp6b2dreH54fXFqY11aWl1pXGFmX1lPS05XUlFJUEpETkdDS0RDQEREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/i1suMzEwT4NfND87bnVwZniDe4CMgIGRj4ubm6Scoaymq6+wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOg4CBi4uCiY2Df4l/bHBqXUJBNC0tLy8uLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISkxLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jaGemYSThYKPop+UmZKEioWPmJGWbHB1iYuCloyNj3aPhHFshYGKlpKDhYhyiaGWh5OJj4+WpbWpm42VooOHk4R9f2tqa3yAf4ByYVxiXllmalxra15XS0dPU1FOTUxGSVBDRE5GQkNFR0I+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwgnB1h3F2koZ+mJaalJ+fnKegqpaTmJ5nZaSafoSSkXmAkoiQkn2KhZiSkYKAgIuNiYWQhoSIhXh4f2dNUj4vLi4sLy4tLzAwMDIxMjU1Nzs/Q0ZOUFJUUFFSU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZuopqKZoZeilZyfqJ6pq5+orKmqtZerv6u2yMi3ydHPvpugcGmrqZ+ElJKFnKGampmnkZGIlaKamnd6fpSYkqGSl5eBlJ57dpWSq7OJjZegfZSenI6Tlpmkoqa2sJ2RmaiIl5COgYhsc3N8fnpwZ2BbX15hZmNgZ2dcUUVKS1BPSUpMRkZNQ0hMRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHVgbn1hd459fJSOjoqfkpeelpyqmJ6qQkR9h4mHmI14go2Kjox7ioaPkI6BgoCJjIqEkoWChoiBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUlNT1FZbYaQd5WLo6eqtL24pa6srKeotKywt7Kyrbuxs76cs8Ssu8nLuMS/uKWjsLKsrauki5aYhaamoKKXgaaZjaKqqKSHhZOkoaCqoaSpjpyxi5Wjp7e7m6CjsJOjnaOekaSiq6+ts7WilaWriJqJkoqWent+hH1mX2dbZGFdY2NeZmZeW09DSUhUT0ZITEZKR0VGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoGUhYiCm4OSkI2S2sidlnNWl4iPiJyPfIaMjoqJeoiCh5GOg4WAi4WGh5KGgoSJhoeHh3FuYUBFNjQ8Mi8xMTAtLCstMS8tND9EQU1VUVJTVVVXVU5bUEdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHHw6uzxrass8Czub62v7TBtru7pLjGqbbJx7a+ubSoo7StsbGcmpKan4mnr6uklXafpJehq7GzmJaqraiutruyuqyvtaKxrLG1vLe1rrWgp6ijqJupsK2yuri4p5u3qY2ljpGToId5gYJ0WGBjVWVhYGJfYGVfWlVKREVMVVFISkpESUdFQUBAS0RBTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxbWlFjZFd6dXGClH2FhpN2hX6AjXu/u6O8grSUk42bj4SIj5KJiXmGgIyTjIeFgY5/gYmOhoCGiIWKh5F6eG5dVkBFTTw2OjQ2QUI3NjUwLzZDSENRW09RVVdVXFdQX1VJS0pBQD9HS0ZFRDs+QDdENz9CSkpFR1dUUF6Ppa2jsbTDtrjBzMm2vMW9s7PAt7jCtb+wuHSytKa6xaSwxrmxs7G0qKS1tqqxoKKWm6KSpbGupq2sp6SYoKyzuqKpsrq1u77Mv8XFvb2zwre6uL+3ure5rK2wprGqrb6wvbvCwqyZuqiUro+YmKuJfoF6aVZhYFdpZGhkVlpjWVZUSUdHTFFHQ0hJQUhEPj9CQktAQE1DOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZRTEFMUldUWVVad2pwf4+EgY6FbnpyeYhiuKGZo4mVk5aTk5ONkJeSh4d7hoGNlYqAhICJenyLh4Z8ioKBioOVfXd5dWVPXGRHRUw6UWRhW15TRj87SFBEWmRRUVlYWWdaVGBgTVNPRUE/SUpIRUZBQEM9RTZCPkhHS0xTWlRdk6+4tbq5ycC7vcnMu73AvLe1vLu3vrW6ssZgdbOlsZqeq72qpairqqOisrWhq6eelZafmZ+upaenpZ6klKKnsLOnsrK8tsG908nK08bCxczCysPAvr2/vLy3tLC5t7fDusa9w8mwnrmqoqyPpai3iYF+cV5hYVxWYV5nZVJYYVZSVUlFRU5LQT5HRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFRSUFBRUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWhsbHGQjYWQc2xzcnOI1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaLf4N/gnh6i4OHe4t5gYqCl390fXprZXB1WV1cUGVlYmBlZF1bWFdcTWRtVVJtbV5vX1hnZVVZVEpEQUtLSEZISEhIQkk5RD9IS1RUVlxaW5K5wLm9t8bAu7nKy7q2ura4ubO4tbSutraZZHWonq1wXqKsnJiho5uknqullJ+fkJSOlpiXqJ+ln5+amYOknaykqrCtt7C9udTRz9fPyczSzM/OysfAv8LKvcG9wsDFxMbKv8jPtKS7sLWwm6y5vZp+eGtcX1xZXWFZYmJRW2BTUUtDQkVGRTxART5CSEJAQz06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaV9wl5KRlG5sb3V1iLOsoaGfi5mcmYyMlZGbkoWKin6Ih4yQi4l8gYRze4mDhnyJdIKKhpV/c3t4bG11e2hyZWlsaWZqaWhgZmlobVptdJetpLyIh2dbb2hdWllUSEpOUEpLUUxUUUlMQUpHS1BfX2JmaWGYt8ewubO7vrayxMe2sLmxsLuss7Gnqresjbannpunmk+bnYyOoJaRppillYqTk4mQiY+Qkp6boZiblZaHnpmmm6yvqK+ns7TU1NXW0svP09XO08/NxcLK0L/KycvJ0sjNzcLQ0riwxLzEuqa2u8SigW1iW1xdWGBXWWVZUFxXTlFDQkhFQkg7QUQ+QUg/P0I3O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OT05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VXc5CQmINocW95eYOgqp6ml42bm5eLjZWRmo59iYuFjoqKi5CIfISCcH+HgYZ7h3KDkouPfXF4dWxxeH5xe214c2xogHBtY2ltcHlpd31+y7/C36dtY3huY1thYEpQUlVOWV5QXV1OUU5UUVVUXG5ud4Jylq64rLSnsLarrb3Asau1pqW4p6yuoay0o46xrpqYmIyRlJGEjpuBjaaRnImDi4SKiYSLg5SVmJeUm5Gcl5mZnp6rrKSnoaysztLV0c3M0tPU0NTRzsjD1NHIzdLT09fN0tHF0tbGwM7HyMOpv7jQnXhtZFxhXFZfUl1aTk9TUE5IPkFGQkJFPEBCP0VFPj8/Oj09PTxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WGhYp3bXdwfX6AoZ6eoYuNmZOTjIuTj5aEeYWQkI2LioiRh3+Ce3J+gIKHeoV1hZORiX9vdnNsc3x7dnxzgXdxaoBycmlvcXp5cnu+y5p+jLGDdnKEdmhhal1DWlpbVmZkWGVrVFhdXGBjXWN4e3+LgZmqpKShoKGppqqxuaqmtKOiraKjraKnsZ+JppqUkpGKko6IgpOJa5WijZiEgYV+kYODk5asi5WNlZmOhZKQnZensKGgoKSkqMfNz8jCy9DT0dTSztPNxtbTzdTY1tbY1dfVydTazcnX1tHKrcTDy4lxbmJfX1dTWVJbT0pHSUlKQDs6O0VCRDxCRD5IQj9CQjs7OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN5coKJgZ2VnZSFi5aJj4qIjoePf3eElJmLjYiIi4l+g3hze32Dh3eAe4eRl4GDbndwbXV/dnh9c4V8eWyHdnRvfXaEdXl7nbWMPEGKxqV+jXxpZVZJQ2VjZmNoamRveVtfZmhrbmlugIOJkYudn6CdkJeYn6OjprKkpLOgoqWeoamgorGchp6SkpKQi46LhoOPhH6cm4yNgoSFepR+gqmVo4ySipiSi32XipqRq7OYmpunnKe9w8a4tsbN0tDS0MzSy8nUz9HV2tfX2NTZ2M3Y287J2trS1r/MzLR2dW1jXFlSVVBZVkVGSklFRT06NzpAQUM6R0VARUNBREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc1NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGFxcXOGjXyXkZ2LfoeSgomGhYqCh3x4hZaXiI+Dh4aHeoR5cXp7hIZ1eoWOjZ16jHB8b3B6f3J8gXGDh4Bujnp1d318gnV/fIeIsHRYqcK2jJKBcG5iPV5ocnBxcG54d4JlaW9ydXhye4uHjpSSm5agloeMk5ugm5+qn6GtnKKamZ+lnp+smYuajJGSjYV9iIeDhYuOoJmTiIOHfm2ZeYSYhoiTjI6VjIZ7m4iTj66rlJWXnpimrra9qK29xsvIycvLz8nE0srU1tjX2NfU29fT2dvW0Nva0dbI1cyVeHpoZ1pZT1JTXUhCRUlJPkE+PTc6PT87Pkg9QEFBQURBPj46ODdEQjc1NTQ3OS41NjY0MzU1NDIzMjM2NDY1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmt2gIhxkZCbgHmAjn6DgoKFf4R8fISXjoeLfoaHgHeCeW57e4aBdHqSno2hdo91gnR1gX10gIRvgZCBb5KEdHyBhXp2hnuJt8akwsm3gZWbj3hwZU5lY4J6gXeGopCLeXl3e4N/fIR2bZSWlJWPl5CDiY+WmpeXppyYoJefk5KXo52aq5aRkYuNkoOMhYmIgYWQkZ6cmYmFi4GGl3uIiJ+XkImNiouCfKGIkIu8oZiTl5mcqKalrp6ntb7AwLnHyc3Oxc3K0dbV1NnV19vU19na29fb2tnYztvGhXl4ZWhjX1NWVlVNS0RNQzs9PTw5Ojw+OT5BNj4/QDw/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU1NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdIUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eop8foB/gH2Fen6CkYmEhXqFiHt1fXRufH2GfnR/kp2Rn4OSfIZ9eI59eIqKboKagHSYhX6BiYV8fpB6j6mPkMOgu4yco5x9iYR9iXKMin5zppqcmZSFe4+QiYRoR3GhpJ2Mi5CShYiLkZKVj52ak5WRl42MlZ+dlKGUko6OkIt+kI+Oi4SIkpaan5+Ji5SRnZGCi3+mmYiFjoKGhICkhoqLuJidkZSWoaegnZ6do662urWrv8XK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfct3d3dmlpZFZfWlNPTkhETEI9PT45OTs6OTk8PTZAPj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmBj4pxcniKe3t/fX98iHp8e4uHgn51g4Z5c3pzbYF+hH13hpugmp6UkoCLh3+Yh4Cckm6HqIV6oIt8kI6DiIScfpqRio2jop+Qo66fi5GLhYuBkoZXcq2Ln6ycj4OYm5CQjlyDopGCjJ+TlYyGiIySk4yUlZSQjI+KiJabnY+VlpGLkpSGgIuJko2Kip2WmaOjhpOdlaCLioiOnJCDiI+Ag4eFpIWLkLOYnJKUl6GhnpmSm52nsbispbzBx83Hxs/Mz8zP18/R1K7W1dja2dra19bZ2Z5ue3NmZVtcV1JWV0NASUQ+Pz46NDk6Ozc6OzozOzs/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieG1ifpKDbm13i3h5fnqBfYZ8e3aGhIBzcIWCe3Z2dXSEg4V9fpKmo56lopaJnZCUlouKqJdyirKNg6aRhJmThJmMopagmZOJmp2hkqivn5GUkI6OiJWLbo23hJrEyLKdoqWbnJiWkbKQY6TNyJWOhoeJkJKOjZOUioWKioaWmpuPkJSTh5WYhICPi5mIjZCql5eko4iZnpWbiY+Hl5eLhY+MgX+Gj6SIjZOomZeTlpihmJ+Zk52borK0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6BcX5nYl1dXE5JVFlBQkdEO0E9ODM3Ozw6OD02NDk6PDo4Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdoGOfXxtfoh4en56goKDfnZ2gIJ8bG6Lf3p8eHh8hIeKfoqjs6ejqrOhlqefpaOWla6ig5C4lZKymYyhoYykm6+jpJ2YkKeWp5msr6SXlJaVkIuYmZagwI6jybmrm6OmrZiRm52ynYWFqKKcmIWJiY6VjYuTj4iBhoeJk5iVjIuUk4aUmIaEkZCcdJGYspaXpaGInJqTkIqRipebiYqWjoZ9jJieiZCQnJqZk5iXn5SgnZWem6CxrqKkt760xcfEvcPDv8bNysnSps7N09LQ1tjT0Ni6cXh1XF9UX1VPSEpOREJDRTU+Ojc3Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdOW1xZSmZgO0iEi3p7boWGenyEeIGFgX5weHx+fW9yjXp9gXx4houJhoSSp7usqLK9r6StsrOoo6KwrIqatJ2iuKSVraSXqa23pqSjn5mpl6mjr7CpmZiclJWRl6CYmru7rsqhara4q7CUmZ6jq5OXvaNeqrKCiYqNlIeRfI6OfYOGjpCUlIiHk5aMkJWNi4yXmJKcmbSXlqudi5yUko2RkoyZm4qRnpCLiZWfoY2UjZiZnJKbmJ6UoaCUnJylr6ihpLO4q8LIxLW6vbvFx8fC0aDGyc3NxNfW0cvUoW95Z1tZU15QT0VDPjxDQUI4Pzg3NT9GPDw1PDM1MzU1NDU0QjM5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo5Nj49NDdUS0NVUUo3PDpJQUVANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRHYmBicEpAi4p/gXOGh32CiHWDioJ/bX19fH9wd4d3jYGHe42PjIaMmarCwK+9xruzs8C8tK2rs7aLp7Ktrb2qm7ukqK25uKumpqGio6Oor7Kxqp2cpJibl5eeoqalkqS6rqnAvK2tsrmmpKd+iIacrb2wg4yMi5CDj4ORj3qBiJCNjZyIh4+XjYuVl5SRmpedqJqxmpGsnI6aj5KOlZGQlpeOkaCRiZSbo6yUlo+UnJ2ToJ2bmKChlJqep6akoqSws6fBxsOvsLq2xcTCv82mx8THw7zV0c3EyodycmBaWV5aTEpCTEBGRz5BP0I7OjQ+QTw9NT02PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQjVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxlR2BpZ1pdXJOMjIh7h4uGg4x1hpGKgW9+e4F/cX6BepV6kpSUmJCTlaezxsm/wszBw7nHvLqvq7m6l7K2urLArqXApKuvu7yqraujo56nqq60sKqboKqboZuVn7C0p4ujurq2wbysqJyzpaSplIWOqcTEpIKLj4eIhIaVlI16g42Rj5GhjIyUko+Il6CYk5mVmKagrp2MqpyOlo+SkZWVjZCVkY+hlIaXn6CynpSalJ+hmKSfmqCboJSYnqWjpqakr66lv8TCrqi3tcnDvrbPssS/xLyz0cnIwrVzd2tbV1tpUUxIRExKS0pBQT1DRDw1QUQ7OjM9OEIzMzIyNjJBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJmWk5lXGZUY2qZjZeKjIiSkIaJeYaUkIFygHyNf3iHgoGQeo2hlqiampi6vcfIycHSycrCzbzBs627vqe6v768xLeswamss7u+qrCppKWjq62zrba1oJ+unqWimKOzvambqL3Bo7e3sKuTsa2rrJeHmqmnpZGCjJOllYmBdoqSeoWNkpCen5OPlIuPjZSjmZeclZWjnqmfkaWajI+Pj5WWiHyPlZKSo5qVoKKctaWQnpeko6Klnp2mmJ6Vl5uko6inorKsqLzAw6+lsrfMwLmvxLO7v8K4rcLDwsCYbHhgV1ZaWkpLTUpGRERIQkJBREw6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djpeOnpKJin+JoJOEeIV/lX9/kIiKkICWoZmupqOYwr7Hw8fF083Ozcu7wrewubyzvMu8w8G1truts7+5vK6vqKCop7atramyt5qerKKnoZ2rt7ippLC/xLG+ubOnqrW0rq6XlqWsqKCRjpKxxaeVjn2RlX2IkZmQqpmYk5OPk5WTpZ6TnZmUoaOinJifmIuMj4+eiFqQlpeSlqSZZZijnrKklqGWrKyqp5ueppeYlpiVoKOopZ+2q6m5u8O0pbO1y8C4qrassru4rqi4ur24gmttWVZUVE1FSlNOSz9CSEVESEdHOTVGTTs+Nz1ASi4zMjAyNUI1NVBWTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs9QEJGQnFGaUlSZWJMRqWUnJahl6mWjZGDh6aTiIKHgpyEg5WQkJOOmqKfr76uoca8xcTGxs7OztLKvru2sbq7u77PtsS9uLi3srG1s7izq6acq6u5qqinr6+Xo66kp6SktcCwq6y0v8O6wLqzp7m1uLOvlaWtrq6li5OVoY10wZp+l5mFj5aajLGVm5qVk5OamaWjlaCblpqpnZyhoJmKjI+WnWBKlpyalZqlllSWsJ+unJ+klK+uq6WaoKWUk5iYjpyfpqKZtKmqs7y7u6qwsse/uaasrK2xsaOhsrK0pG9sZVtZTk9LRU9QUFE7SEpIR0lDQz46S1U/QTo9RU0wNzU0NDpCMzROV088SktOVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiql5mgoqivmZGXh4unlo6Jk4Wfh4Sdl46doZqjpLXItKnGusLDx8rIx8zNxr67s665uMDBzLXHusG4tbqwr6+ztKajm6q0tKmopq2smqStpaSorLq/qKu2t77Bv765s7LEsrm9rKOutay5poicmKabdr+ghZmdjpOZmouvl6GcnJeVm5+hqZ+ooJmaqpmhp56YkI2RnYNudpKimpWdop6QrrKiqpSoqpeqraOjn6WokpKZnIiUnKKel7Gnqau6tr2zsq2+ubego6eopaecnK2pqYxiZF9eUUpMRkhOSVVMPU1ETkpLQkNEPFFVPUFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5SYE1VSH9lXkhFq5WcoZ+7r5mUn4uTq5uRkpOJq42Hop+Mo62Uo6O2xr20wbrCwsfIxcLNyMG9ubKvubTAwsq1xbHBvLS6qqitrLCio5iqtLulqaasqp2or6ejqqq+vKetvLS4vce8t7W3wbG+wLSptberv6WPo5iRoqC8n4maoJmXnp6Pt5+pnKWjm5yhmqils6GbnqacqKqemZWPlJuLl4mMpaKUnaKeoLSvpaSTr6uZq6udnaSjqJGVlaCDj56em5WppKGhtLS6ta2otbKznpyjpZqXlZmqoZ52XltfXUpIRkdNUUlNRUZHQlJMSkJFR0BWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoFkVDQ5LTE6Z1xGQ0OccGJHRaeXpJ+ew62bl6WYmamclpqaj6qWlaemla2tmaGrtsTCu763wcLAx8S+zca7vbmyr7izv8LItb+vu7a4tqakqqutoKCaq6rEoqWoq6aeq6+soaiov7emrb6xuLbHtrW5uL+yv8G3tLO0r76jl6OWlJyUrqCRoqKlo6OfkL2kqZ2oq52doJumn72imKOfoqmroZ2XjZWek56Hj4WNk56koZ21rKWblbGnma+nn5qpnqCNmJSeg42gmpuTpaSamKuxtbGqpaqtrJyYoKCSjpCWqJ6UZ2JYYF1OSEdKTktIRURJQT5QSEA8R0lIW1JPSz1IT1U0QkY5PkhHNUNhW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROm5SRjxLeGViV0yimqOcnsWsoZ+snp2uoJOjn5aloKapq5e2saOqs7XExL2/tr/Cu8jCvsrItri1tbCzs7fBxra+sLi0uLWfpqyqq52dnqWkwaWgqq2fpKmsr6Kmp721pbG8ube2w7Kzt7m/ssTAuLius7W1o52llZKUoa6gmaKdqairo5rCramerK2bm56ZpqG9op2lmKurrKahmY2Zn5KfiY9Xf5afpqGguKqmk5i1o5+yoaCbrpaejpiUnYGOn5eVjqKklZCmrrKrqaGipaWVlZ2Yi4+Rk6SeiWBkWWNgS0hKSk5GRUFGSj49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0hANUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dySEU2PXVlXEtOnp+hmZ7DqKWitKKcsqiTq6SgpJ+tqaydu7CorLWxyMXBwrPCw7zGw7zEyryvsLatsLSvv8S0ubGwubSsmaiwqamanaWhp8Ktm6yxnKmjrbCppKe9tqa3u72vt8Ots7LCwLLHs7q3rLS2rqqippaVlaSsop+fmqirsK+vu7KmoKmomZmYk6KkuKChpJOvr6ylp5+SoZ6Vno+QjZWdmqOfp7OmpoyYs5ujrpqem62QnpOWk5l/kaGWj42foZOLpqywpaahnKCekpKak4WLko2cnn9gZVpnZUpJTEpSQkNASUc7O0c/OTlPTVVeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTj47QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ+jn5ygw6ikqrKho7SqlbOsp6KksqyuqbuyrLC0tMbAxMO1wMS9ycS1wMjBtKu1qK+4rL/EtLeurLa5pZmrsauql5+ml627tJuosJutn620sqequbKourO3srnAqrexw720xqe+r623tamorKGXl5KmpaKjmJilr7iusrW2oJ+opJmVlZOkoLejpKaWr7Kyp6umoZ6bmpuWmKifoJiinq+yoqaMl66YpKuXmZ6kkZuNk5aZhJWelIyPnJ6Ui6mpqqGnoJmelYyOmZCBhZWJlJ94Y2hcampNUE1OVD1DQU5DOjpJPzc3Uk9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJcGhWQ1dGjHlmQzuko52hpr+mqK+voam0q525sKujqrS2sbC5t7C3uLjEvcPHvbzEwcbAuMDGwLqptqSsu6zAwre3qayxuqKVrbCtspalp5Gquamgp7CdqqCvtLOqqba2rbuss7O6t6y4sMO6vr+mw6uwt66pq6umnpiZq6KioJGYobGvs6uwuZqcqaCZlpKXpqG3qaWjo7CxtKuyqKufm6Cgm56lnaKXnaOzsJqfj5OlmqCpmpSinpWYiZOXkpWWnJOIkJuZlI6oqKafo5uXm5OHjpmLfYyWhY+bamhsYGxuV1BRWlRBQ0VUQDs7SEE3OlhQZF5QVldEWV5dTUxSTl5LSj5aY15OSFBOW1VZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT0qJys9XHA9PjEuMWVbZEAxNjQ3Z1lgRig/OGx9aFtWO4l7Y0M9p5+coqm9oauwqqOxuKqltbOsoK21vK6zuLy6vba2wMK/yMS5xMHAwLjEvcC3r7anq7exu76/tKiusbael6utqK2Xp6iOp7ufpK2znquisLCzq6m2tLW9ra+xtaywtLHBusW3q7yvsbisraqjsaaepamgpJeQmaCzqrOqqrOanaebmpWOoKaktK6noq2trrGns62yqqScn6ijnpWhmZuotamXmZGSnpmeoJ6Qq56Xl4WUl4qcmJuTio2Wl5qXpqWioJ2WlZeTgI+UhXuOkoOMlmVscmdvcV5GWWZWRENNWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2FVMTUwPWBWXjgpQzNZVFxnSzaMemZMQKSaoKSstqStqaWurraqr7W6p6awt8W3sbe+wcK0tLrFvszFucLAub65w7fAubK0q6m6trq5vbSprbC1mJinrKqrm6urjqu9nauusaOroLCts66ttrK5t6qurrKota+zu73Ksqq2tbG0r66nobOgm6itoKWVlpuasqOtoKavl6GkmpqSjqOlp7OpoaayrKq2pa6xta+kmZ2tp5qYn5mZq7eil5OQjpecoZeWk6uem5J/kpeMnZyalpCJlJKemaWioaCYlpGTlXqLj4V7jIqDi5JqbXhtdXtgRWFqWUlIWVo9e0pGRDZBYlRpW01cYEpcXVpSU1JiYUxLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENfUVwuKkIvSkdQW0gzY1lUS0SZl6CxqLGqraakr661qbe0uaSss7fKurS6ur++tLO3w8DMyLzDvLa9v7+3v7yxva2nuri3tsG2qqyxt5SXpq6rp6OwqpSvu6SssbKnqKOxtLCxsLWxuLOprquyp7evtbTDxbaptbassK2pqKO2oKCnsaCklJyalbGep5ygqo6po56blpimpqW4p6KxtKynsqetsLaspJmgrKibnJ2blKm4nJSOjoqYnKKXj5eloJ2UgpGVj5ycmJaUh5aPl5qnnKOgkpaQkJV2hJCHe4WBhIyLbXB3dXt+XEtlbFxLTmNcPmJ7R0k4R2dXZlxNXmJNWFlXVFhUaV1PT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydHYkxWJS1CLj1FTFE8M3JrSkNDkZmlrqWtrqunpLCys6q3sbegq7W5ybiuwbvCt7KxtcLCzsXAwb20vL+/ur68ssSnqbiwtra/vK6qs7Kcn6exraalr6WdsrWsq7GxramotLqss7K1rLStqqyorKm4rbGwx7+4pbqwqa2tpaitsKakpK+kqZyenJuvmaOjoqORrJ6joKCiqqamuaWstbWkqquorK+2rqOdo6iqm6CampKks5mOiY2HkKKglI2TnJ+TkYSNkpKdmpmVk4eXkpWZp5ufnoySkY6Qd36NhX18fIeJiHBzcX59fVxTZG9eTllmXEZElltHO05tWGJbTF9iTlZXVldUWGdeUVJMY1pbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGVISis6ST8zQklTLD6PazxHSI+cqquiqbGkqaWztLK0tbKyoautvMy6rsC7x7G0rLTCwtHFxr7Asr3Awry/t7vEp6y3rLO4u7+vqrGtoKOnraqopLCjqrGqr6ywr7Cvq7O7p7awsqmyqaumpaOtuqyqscK5tay6qKioraqosaWppKOuqqiin5yjrJWlnpiemaydoqepoqymo62suLGyoKmioKuvsaydn6enqZmjmJmPoKeYhoSOiouen46LjJWbjo2Fho+Un5yVl5SGlpOTl6SbnJyLkpCNiX5+h4V8d36HhYZ0cnGIdWtfWWBuY1FzcVxLO4R8Rj5XdFhgWk5jXE5VVlVXUVxiXlNPTmhYV1dLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLkpnREY4PEIwNUVLWDFAlFo+TEWVmK2ooaqznKqqsLWtuLWuq6Wqqr3JvLG+t8KvsayzxMPOzsO+v7PAwsO6wLPIw6uut62yuL++sq2tq6SnqrCpp6ixprSuqrCurbGwtK20u6S3squsrqeroKKer7eqqq26tqW2taOqp6ysqq2hqaemsrKkpqahoayWqqGVmqCmnqSiqqWtop+nsbetrqOlopuqq62pnKGlpKSYoJqVj5ick4GCj4iFnJ+Lio2LmI2PioKLl6OakZCai5OSkZOimZuZio6LinyGgIGDenSAhIF9c3aLo4h4al5gbmdXZYdjTj9nk0xFYnlXYlhSZVRNVlVVVE9cXWFVS01pV1VXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxDKzpKT140RIY+SEZEl5KwpaOqsZirqq22q7axq6Wsqqm8wMC4uLO7taWysMTJy9G/wbu4v7/BucG5wMStsbWxs7q/vbKwrq2rqqi2qqaur6q5r6ixsa+yrbaqt7ems7WrrKSpq5yjnrOzqKiktLSgtq2gqqirqaynoKusqbm2qaqqqqKpoKyckqmhnaCko6ajqp6cp7WuqKaqoqOYpaanqpyipKOfmZifkI6PmI1+h4yGhJ6dhoOKiY2Nj4yChZSimY2MmZCRkY+Sn5aYlouKg390hoF/f3l0g396d36Ah52Pb3FnZ3F4XGBziGtPXplWSG14VWRWUmJPTVVUVVBPWFtiVUhQaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg+Qyw+TFRfL0pqNk9EO5aOsKGmq66arKWtr7O1r6ulsKqpur68wLGuuK2htq/Jx8jRwL68urzCvbrDwL6/rrGysbW8usGxsbKrs6iktamlrbOyubCjrbaxsLO6q7mvqa21q6qeqayfoqC1raihn6+yorSqnqinqqSqoaKsrai9r6yuraKoqKCsmZCwoZiioKennqibmaqwqaOfraKhk6Kjo6eYmqmlmJeZnY6Kh5SIfY2GhISkloSBgoqGjYyQg4OToJaHkJyQkpCNkZyUl4+KhoV4dIF/fHV4eYB7dHN6aICGo3VpXmVrgXVniIt9U1hwXkp4c1NkU1FeTU1SWWZOTFZZZFhGU2lSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGc6NDhfPWFkP0YxQ1BbWypITTlVQTSRj7KgpKaspKekrKe0srGqpLGoqri+wbyvqLmqpq6wycfJ0cO8v764vr+8ybvAuLCvtLG6u7fAsrO7rLisorSnp6yytrmzp6i8ta62vbC9pqystautnKmvo5+kq6qnnJ6qsqSzqJqqp6qkqZ2jqaepvau0r66dqaSgrpybs6OVpJylpZ+km5qpq6Wem6qhm5KcoaWdmJepqJKYmpOQioKPhX6Pgn+Ino+Ffn2LhpCNj4R/kpqThZOhjJORi5GakZWGiX5/cnt5fXxod3x6dXBwfWiFeISIZGFoY3KFem1meF1eVkJXem1UYVBSWEtLTnF1XUhaW2dZRVVmUEQ+Sk5EQ0E5SEdLUz9qYUpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mY0JKN0dTYFUqPTpEWD8qj5SxmZ+gqaWloault7Kypqmxp6y4wb21sKO5rKioscPJyc3Btr2/tbe/uci2w7WzsbWxvbe5vbWtubW+raGzp6qrsLW4tKufvbyps8Czu6Cvs7Wpq56tsKOcpKiqo56cpbCmsKCfq6mooqqbpKigrbunrrCuoKujpK6enq2ml5+boaOcn5yao6qjmpqkpJaXlJ+ilpuXpquLnpGQkYyCioCAj4B7mpWNiHt+i4WOjYuKg5GXkIaUo4mRkYeQmY+TgIh8eWx9dnh4Y3t6cXBxcnhogHRqg2dkaGFuc45tYWlwYHBBXHhsVV5PUVFKSk1UWVdNXV5sV0RYYE9eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDFCaFkxM1M9ZV9ETDZLV2VPKTsyT1k9I5OZrJmfmKeko5+opLivrqOvsKqruMK6s66fuK+rqLS7yMvIv7fCvq+0vbfEtsOxrrmxs8C0ur23qbm4vauktKipqrCuubGqm7u9pLDAtbWhrra1pqansbOgnqSmp6GlmZ+sqKmeoKqvp6GmmKOooLC4n6OxrqCroayknKanqZqam5+jlZ2dmp6pppeboKiSmZOZnpOZlqGpkJqJjpCGfYd/go59fKGNjIh4gouEiYuLhYeSmY6JlZ6IkJWCi5eMkXyFe3NwfXFzdGB5eGlvcXBvaX5xY3psaWVjYGaGf19ac2tyTEx+aFhaTVBMSkhQUlBJTlxfblNEWFtSZ09IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo+L1lYNSiXnaaZnZatoKChpKG3q7Gks7SqqLnFtrOuoLesrq2wtcbIwbe/wbmwtLy3v7u+r6u9r7S/sLzCuKm7urenqLWoqKuwrLOwp5q+t6WtvLawnrC3sKilp6+xm6CkoKSkoZecr6ahnqKnr6KgopOkpKO3sKGmsaqerKOvmJyqpamemJqepZObnZqdpqqanJyllpWXlZ2OlJejqKGQiYuPhHqFfoSKeo6Xio2GeIGGg4iLjYWNk5eMjpaYio+WfoaXi495gHtwcndvb3RfeXdkbGxraWiDbWVyamtlaFxjc39fWmx2aVpIfV1bWE9PSkhIUlVGMjpfXmxQRFhWWWVNSUlFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0R0FmW0hURFVdaEUuOzFgVCwylqOhl5WcqZ2loaOht6qvoLq5pqy9xbOwr6O1r6yur7TExL2zv7q3sLO5uLq4uq6tv7O0uK+/wbisvbq0pqKzq6ips6uusaOcwbamqba1qp6yu6mmpqiwrJmip5ykppSYobKlmZ6kqamcoqCTpZ+kuaikp62mnqWhqJOfqaGhoJmbnaCSm5yXoKKrm5uZoZWSlZaajZSTo6ekj4iKjoV5hHyFhXycjYmKhniAg4eHh5GFlZKSjJCVlI2OlHuDl46Kd357bHRybGxzYXh1aGhqZ2VvhGdoaGRmaWpfaGJpZlplemNhUnNUW1tTTElHSU9TQCEral5qTENWVV5gS0lIRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRCM0NEZ1tLV0dVYGhCMzc4Y04nMp6ko5KOpKacnp6epLWsp6q6t6isw8G3sKyitK2nr6+3wMC9scG3sa6xtra4t7Wsqryzr7KxvcC3rry8saWftqympbSpq66goMOrqaaws6ustLqdqKqqsaaYnaqep6WRmaatopmepKqhm6Kdl6Ccp7alr6quoKGdnaGVoKafoaCZm5qckpqelaaeraOYl56VlI6UmIyPmJqnn5GIiYqIeIV3goKCnIeLgol7foSHhoSQhJWVj4+PkZGRjZJ7g5WNhnN+fWZ4b2tqbGd1c2tjZ2RjdH9hZGVmZWlqY2lwWV5YXWxkYU1oV1pgVklHSEtNUlg/OWBsaUdCVVNcW0lIRkZBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyssMEEqSksuLyorMzcyMig1NyQrNy43MjY4NV15TjI+SGlaTFpKVmJmQTozQWVIJTWbpKCRjK6gmZiglqW0saKxvrehsca8ubCxo7arq66pub28u63Asq+urbavs7izp6u5sK6utLa7tq+4va2mnrWroKGwpauvn6XDobOlr7Gvt621na2vrK6jmZynqqWflZuopaCZpaOpnZqgnJSbnaywpbmnraKhmpqemZ6jmqWdlp6Ym5SaoZKolaypm5ScnJKMlZmOlJSYqKaNjYqJj3uCdIKBipiFh3yJiISEiYyIkoSUnJKSj5CRlo6Qf4CNjYJvgX9meW1oa2pncXJrXGhjYXJ/YGRnam1sZ2poZmxcbG11cWFUYmhjZVlJRkxNT1hRUFVhZYFUQFZTWVRGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDo2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUlkQic0k6Kbj46xnZuToZqpsrCfuMC2obTCvL25saa2r6mupbe5t7isu6+tqqu3qrS4raWztbGuqbG2trGytbqoqZ+2qZ6fqqKqrZyqwZmupa+wtrWsrJ6xra+qo5uco6yonJWcp6SdmqmjpZaaoJ2Rm6Orqqm6n6akoJiamp6hj2uilZiccYKWnKSAdpGrqJ6WlqCRiZeZgJeLn494hZOMg21pfneDcGyGioZ9hIqGb11kYGeEl4Zri5CUknV3i4R+g49/ZoeAaHVpZldcaXRuTlBqZGZxgmZeZGZubGleXl+JkIWHaE9LRDhFVGdeSkdQUFVVS0dTYG90ZUVbUVVQRkdGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTZPa1tOXEtbZmI+RzFQYjwrL42kmYeVsZuck6Cbqq2ro73Fr6m3w7i9vK2ntrCmq6S4tLKzsbmtqqestKawtaOnt7a1qKestrOutK2zoqmftKueoqWcp6iarr2Vp6avs7etraSorqqrpqGenKCop5yXoaamnJynp56Tn6CZkJ6nqqO0r6Oio5yWmJiXo4ihj5Kah6GHlJ6hf6V/p6uek5Ock4mEcniMjoOHoHaIjGmXiGZ9c3igb4iHg36MfH+hoJ+Zf3uInnSIjnabimyHgYNtaGVjemxxYlSGbWNtaZhxWGpwboZXXmlba2pbiHBteXKHaYeEWl5GTj5GXk1GUlZXUVFSV1RnXkxZS1JSUEVHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxVmA3LyiMppeEnaydmZmdn6uqqKq/w6+yur23wL6qpLexqqyms7Wur7O2q6mlsa2ltbOcrLW2tKWnqLOxrbKor5+qobOpn6SjmqKjna+2laSmpra8pqynqaqsp6aioJmgp6SZmaajpJmcpKqXlKKclJOipaagtqSjoKOYlZOYlJyIrpCYlImpi5ejnIWxgKStnpSanpV5gtSof4eUwJvHeXixpbeXZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4FslrGrsHhoa1ixrm9labySvG5oem1xj9h+U2pjtrJ/gHGUdZqhqpBXT1dhT1ZORlRbWFFQU4tcV1tQQFxFUU5ERkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtcNDEhjqaTgaeqn5ednaWtsqmxwr2ytcC1t77Cq6a0ra2pqK+0qq+2s6inprWlp7iunLKxtaqlpKeyrq2xpqqep6SypKGhn5ecoKCwrZWeo5+0uaKpqKGtrqSinpuaoqmgmJuooZ+YnqinkZynm5SdoaaioLCjnp+jlpaSmJKZhbBraoqNqn5nhJaHrWVxnp2VmqaVca6hpH53unxroY92sV9qtFulgGWckWBmgXpmf2p4aqllvnJnpox2sWp8sXh0kpNjbW2nbVuEoEVpZ4eWRXWcYH1me6Ongllfi6tpgJR4emqnN0qvW1dUbGNaS09XX1xXVjtOiE9XVi9JVFNKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMxG5KilYKtp6Wfo6SqsbettL2+sLfFsri6wqepsKyvqamxrqSwurCkpK6zo6m5qZ6zs7CjpaCqrbCsr6ann6OisZyjnJiVmJydrqeXm6GftLKhqpuhra2gnpqXoKKqnZmepKGcmqGnpJCdo5qXoJ+rn6WmoJqfoZWVkZaRmoW1m7V4hamZtZl3h7Obt3+TlpeplX5rgaZ6gYWHkpSSd6tnarFbrHuOh5R0iHCOhoB/iJCXeIOCi5eMg6CPhbB2d59xa2psfItOpFhIY2OZfmNopmB5cnVSk4ZeUKltY3F9hoBinS5Rom5bVGtnYExLXGRYXFpCPrB4V1hBI01oRkNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjg0MCwuKC8yLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2dXN0o5YVU1MByWn5SIs6amoq6pp7Osqru2wrC8wq24t8GqrK2ur6ausqmhr7yqoae1raOrtaSms7Ono6Kdp6qyqLCnpZ6gn7CXoJqVlpeYn66jmpqkqLSuoamPqaipm56VmKClqZqfnaOfnKCjpaOVm56Ymp2iqpylmpuboqCWk5GTk52D1ZOZuXCwwn7GhnzWlJu7fJqWpZCNm4ykeo2Ho4KlgnqseY+dVa97iX6farlauXeGg32mgpN8mHqqeY2dj3uxbo6EdJC7hW+UT6+nxYpRoHpjYKpic3KHbJeHX1O1tMiGgIl8Y6QzQp12XVFqaGRQQFhmWmRhSkhNbEtaU09ZZlpDQz9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw5O0RIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSguMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tcUF9mVDdHOmFRODIlnKGTmLGoqKWzqqW0qKW8t8GwusCxtbW8s7ansbGjsbOmn6+2qJuouq6ir7Ggs7SwoKSenqepsKm0qaWcnZ6rmJmYl5eWl6KrnpqXqK2wqKOfjqyip5ael5yhpqKYoqGioZqioqebnqCelZmapqCcp5Wbm5+gmJCSlZGdiLJuaLVxq4hwjqZytHNytnuamKSNj5uNon6QoKV+sHaDkdLRdVuufIZ/pG+bqqZrhoV9rX2XmY97sXOTnY54s2WWdIWebp5mlFLIi1rCXJ95Yl+tYHdzhmKXiF5Zyp1vv4F1TUu1U1XGZFRRamNlWEFPal9saVBVRkk5PVdSW1dYSEM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCTlRfZVA1Rz1hTTYyL6KdkaSvrKSqu62mtKWotru8sru/t7a0u7uzpbW0orKyo6Csr6SYprqupLGwnLS4qaCmnaGqpbKorKqlmp2aqZ+WlZiZk5OjqaCXk6arsKWilpKsn6WSlKGcpaeglZump6Gao5+tmqCenpCWm6KenKWUnJWZop6VmJaSm4Wse3eodqOPi4epb62Kg6iDmZmiipKZi6J+kpiJroV/grNccrNSrn6DgqR/cdd9d4R+j52GmZp3r4aKkZyHd7RhmmWagoGVbJJasFhLmnWYeWZgrV53d4dnmIhqXa93lZ6PeGw1eciusl9CVG9eZ2BFT2tfcG1WVU0vZWNpU1lRO0FEQEw6NT85MT08MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTY8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6ODifnZSguLCYtMGtqLKnqrK6uLS4v7q4s7a9taW4tKC1rZ+gqauflae2rKiwsauttKSbqaCgqKK1p6aqo5melaWilJScmZOWo6abk5CnrK+loZWYqZ+ij5GimqmmoZWapqmenaSerJ2gnaCNlJ6bnqCYmJuVl6GglJiRp52GqX19pXmhj5CDqnCtjIKnhpagoYqXl4ijgZCHlKp8gIudeW+xWqiDgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH2ClGySXKtbWpN/kX9oZ6pkc3uBa5iHcV2sWomgjmtuZU9KQ6FcWk10XWJmTVphX3N0X0pVNUqakllIRT1IRkFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8xVV9iTDdGSV9DMT44oZyZmb6smLTCrqutqaa0sLixtb+6urOxt7yqu7WgsaWepaennpOqsamvqrWsqq6hmKGgpqSkuqKjq6GXm5GioJWUn5qUmZ+gkI2MqbCvpp2Xmqemn42SpJioq6iUl6qon5+go62joJ2hjZShmJ+gkpyXnJWdoZWXj6ubj65tcrR0qYx3iqZztHl0s4CSpKOSnIyJpIeOdrhvjHuLomtrtlqhhmWXl2mgoqdtlHK0dJOYf7JqhpKIrWt1s2GdZqJuhpJql1ytYE2hfIeRUnOjbHl/fm6Yhm9cr1Y8nHdmVG9uLlunT2JTa2VibFpiXGBxfGNTWVA+Pm1vM0JCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs8MDAwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VfYUw1Rk1eODFCOaWam527opyywK6tq6unt6m4r7XAtbyxr7m4q8G3qquhnKekop2Sq6qntaOyqK6qoZecqKCkq7mdo62clpmPpaOWjZ2hnJmdn5GTlau2r6eZlJusqZeMk6aapa2kkpersqSgnqirsJmhoo+Yopegm5abl6GTnKmclJGrmYfUkpq7dLHEgMOGfdWWnLh4iJGXjJeJjKeHeaO2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gIpumohwbY2kdL1dd31bYXm8alpWW2l5XmlgZGZibXhvWVtZQ0FAcj9DRis1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy03QDmmmZ6ivKKXscOwramqrLGnuK+2xLG7s667sK7Bsqylo56koZybkKqkqrKktaetpJ+WmqqZpqy5naOumZWhkKagk42co56YnpqQlpKvubCrlZejp6eUkZalnaStnpGgqKugnJ+ppLKeoqSOpqGUoZmcl5akmI+woJKVqp6FkJm1gJGRjbiVeIKTm7V3bmxuc255j4SOiXOewbu8mXqBsqhwgHSRuYN8hoaLh417ioaNl3yku7m9nHV5s6N0dpd1dLB1mJ5mhmmNtnRycHe2jF6Aen2JZ4N5bXlii6xwdYV/WFunakRkWlRmX2NdYlBnZnFtdUJNUExEO1pMPkozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEFLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdMVF9HJ1NiVjgqT11dPSs7VlYnPTs8pp2gob+mlrPDtKyqp6yrqbuusMavtbSvuKe1uK2qo6Kmn6CdmZOspK2qprWoqJ+blqCjnqykvqahqpiVnJGim5KPoaiik56XkpiUsrW2rZidpKSii5KSppylq5yWqaWmnZuiqaemo6igkayel6Oel5eYnZ6PsKmUnKeijmp+aZyneIlzfpqOdXplh3u9vsC6bpKDcZSGX3JqWl2aiWFkh46Va2CAlWNtm3ZilGt/mpWUZV5gY3GbiWhyjH2GlGZqfnF0eX18Ylt3dIFoUFxuhH17i2pYbHmCcklKb4VwTXRNRVdcZmFMW1dmY15PWm12anJST0RFTjtISTxNPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SVJfSSdTYFY0KVBeTCgzPltPJz8yPqifqKHBo5q0urajrKWup6i1sqzIrLC0rLWjvrGyp6CjqZ2jm5qZrKeupKW1qqWbmJWim6atqb+oqaaWlJuVoJqTmKWpqJGekI+YnLCyv6ybp52noYmTkaqbqaScm6ygo5qbo6esop+qoZmvmpWmn5aUnZ+dl7ClmaKomZyRnpyjpJmno5qcmpuakJaCaG58cXaRl5SRhIm0qY2FmJWOioyYl4eUlYqDkpKQiY2RlJmTmJeaoKGam5SgnY6CeqSFbGl8kHyAdImKgXGCeHl2doqAe4lqc4F0g3Vkd312a3B6bWBjW29oTVhYZWpfV1lwem9uZlNPRlM5T1pOUk8oKzpKQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5TMTBUXjorPThdSyw8LUCyoLOhv6KksbK3oKmls6elsLWqyautsaa1psCotKGepaWcpJaVoKunrKOjt6ygmZaWoJetqqbBn6yklpKcl56Yk5Sin56jp5KRmainssOvmaudq56PlpapnqucnqCtmKGbnaKlr6ahpKeerJiXpp2ZmqGenpywoJ2ip5aYk5mUoKKWo5+XoI6WlIuKjY+WrY97lZuCkoGJqaiFgJiWioSOn4h7hJCGhZmQh4aJlY6bl42QmJ6jlpmSkJ2Nfo1lobOuhYmEdnqPin12eXpvZ3mQgYCJa3WBeYhyaHR/enaDiIJrdGN4Zl9oZGNkZmpYa3txampcUkxQRF9VRkA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl1dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RdUTA1TVsxN0U0XEc1PCxAtKC5r76tq66ysqCqprKtoqyzsMWwqqyjs6+9pLScoKeioZ2Zl6imqaakprO1npWUnpmZr6auvqCro5GRnpqZlJGVoZyXqZ2FnqmsorPItJ+ppKqWlpiap56pnKCkq5Sen56gqq6ppaKqoaybn6CgmKWenJ6cr6SZn6iTmJedkqWamKmempdmg5J8ZX6Omo9jeI1saGt6kKOra2SZmH5nhYplZWloeo2hjmtnjJeRondraouYop+Yc2xueoSNhXlYZV2FgV5rioqBdltoc3d3kYCHgm54gniAc215hHR3iImPg3tohFhdanNkXXOIaWp8cWxjXVFOV0lkWEBKND5GNz9GRDcxPD0/QUM7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSS83Wk82KUVZL0RPMVlDOz8uPaWfury5r6uzsKulqK2usKeurrC9samopK2wsaCtl6CknqGamaarnKyjpqips66elaOQoq+mtrmlrqOPjpqhmZOSmqCZmaaWe6Wsoqizw7iloqevn56VnqOfpJykqqiSnqGeoKqvqaqiqZ+nm6afp6CslaGbpbCkmJyrlqGem5OlmJ6rmZ5+voOIcrRyhZ6GrWh4ucS4cZKho3ummJlzqoJ8y8DAu3GLooeDnnyVmIiewL2Clp2djZzBwXuBepGMmsK/fWulsW+MgW/Ken+beJGDjoB2eYF/eXF6f4dweIWMk3lsdZFiZV54ZF9lgWJedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5IW0wqI0NQLyNGWzNQWS9VQUI7LziWo7jDtbCvwKmplKOvqbCvraayta+rpqamsaugq5iboqCcm6qnop2roqWppaS0pJ2jk6aurLi0p6+ikpGZnaWSkaChmJygnYemq6Srrb/AsaGqrqqWkp+dopmipKqjk6Chnp2srqmrpaOipaCkpZytqZGkm6iuqpydqpysopaXpZaho5icf86UeXqlgnqVlptfrY9ejqeAoaB8p5WbdKuDgK9eZI2peqeHhZ90l5KIs2OCq4agjY2yaoSudHyWh7hhgq1Zo81uj3V723t/mXF+iJJ1f2V7iHZ2a32Ibn6FkJJ+bICNX3Bqb2ZgX3hkXHFoamNmYFJUUlddSk9DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc3MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKy0uSjAnO1w6TC0hUEBGNC4xrcLAwLW0sLeYnpGkqqmttKumsqytrKSsprCqoKebmqaYnKKwn6CfqKejpqGfsKybnpamrq2xq6isoJSSm5+lk4+epZedqKOerqSrsKi/xrOoqbGulpOcnKKXoKmqn5Whnp2drq+nqqibpqajoKqSrbOWpqOrqp6jp6ahsKGSmqeaoZuUlJGXoHCFjJd1hKiHcbB8nXKsfqGfgaWPnnergn2tf5xyrX6rh4afdpiSenyXfqqIoYuRi5x+q3uIko6ggHqtVpzEeo9vksF9gZVtdXCMbWZ2ZYZvYXducm6IipGPg22QjmRuc3VvYGZtZF9uaWluZmNXVFxhWlJSQzhJSUBEPD48QEVEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz5XSi08KD0xKTNWQEYhHEc6QzEuK6/UxseytJ+do46jo6KtrravqbCnqaqorqurp6KjnZmilZ+mq5+ipZ+oqKKfnrCtmJuWqKevrainqZ6XlZqkopKUoa2bnaejrqyjrLWpuc2yraaurJeVm5yimZ+urJ2WoZmen6mxqamomqqoo6Grm6+xoqisrqaZpquqqrGjk5ejpZqUkoWkaqR1iXqpdHqycYKliZiMcIigmoekX2BSq4R/roKbda6Cp4aGn3qYloV7ZoCjiaSYhoGjfal+gJSGrl58qFWdopKBeqKfgHvDr8WMc6+zs7lxYqmvwnVojIuXj4FsmZFubXh3d25sZmVkcXBme2ljXFdfaVhYVExMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXWwKGZq6ihr6KfsLWwr6mso6imqqurqaSmoJuln52lp6ajnKyaoquhpJ+vo56bk6qktrCuoKmbnZeVp6SRm6Kon6CmnLCmo6ixrLbIsrWqrKqVkZydopmfpbOdmqGUnJ+mq6uirZmrqKGhqaKzraKqs7Kim6qor6+2o5OWpKeYm5F8qmyehId1q3l8sG6CpIuIn5aVn5WB0re0uMmAgbJeX5Spg6SHh6B6mJWZeKrJc5mjlKepkJKbjH6aiZrGxndloYKlc4GfjoJ9r15vtWOxdUujhm2nR4KTY46PnZJ7cJaRfW96dHx6bVxmanJxZoFpXmFYY21cXllJTU1LRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTk9QTUZMSlZGKkwwLz4tNE9UUR0cOzxGMiwkqKTBxrmtqLKurKWinbK5rKqhppuopqqsqaegpqWYqqOfrqudpqCsmp+ppZ2ntZ+il5Ooq7ayrJumnKCVkKatkZibpqKgqqeuoaOnqbC0wrKzqq2olImXnaWboqOvpZehlZmcpaWrmq6crKelnqujt6yhsbmwnZuvp7O0s6WVmKikm6COgp1OeJqBf596hKN8gqSEhqaenJ6ThLh7fHm5gn7MxcK2eJqgkIuffpqWl4p1npeKpJijqH6whZyEnoOsfZmUYaVso3CPhZCBfZeDcqxgpHNxgJpgvH1SVXWPkaOWe32RkIhzenKEfnBbbG53cmqBblpjX2huYmRdS0xRVEFISEZJOjlLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMjpQW1QcGzY/SCwtIIyHmamspKu5q6+gm6Gss7Smn6CVpa6urqmmnaammqOnobKuoammsqCZqKSUorWio5WXoam1uaSbo52jk5CisZmdm6akoaKvrZ2kqKK1scOxraqtqpGHkZynnaOknaWXnpiZmaWjqJmtoaykpZevpbytore3rp2etbK5srOnmZ6woqSeho/RtcO3eYeOhZGTj4CmeJSid4ygkoSlgotxq4aEtG5yaZmjnJWJn3yYmYaHj3KugqWboo2mi5OdiZSQmm1wslylc5N6nGyZf3uZfW6pYaJxcX+fYnOyuGh4j5OlmH2Li5GKd3x4jYFsaHdpeHNuf3RcZGRubWVoYEpaV1g8R0dAVDNARj48Kig2My4wMTMpJjQ6Ozw9P0BDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWSc4yKrr+/u7u1npeopK22oaOZlaOpp66pq5mloZ+loKC1p6Kpp7CjlKujjqSto52QmpqqtLSknaacqZKUl66gn52lo5ynnLWaoKqjtqvCsKmrqaKNhI+coqGmo5aZmpyYm5ilpKaYqqasoaSbrKe+rJW+sK2fo7Czuqy0p5upsqWomHqokH18sHeKgKSliJxtsm+gh618oY+DqJaZgKyJhK6Fn5SooKKWhZ+AmZWAe5J9q4CdmpaKqnidoI+Ik5KAea9do4F8pqdknYB8l3Rrr12la3GFmV1gW4ygbpWRppmCk4uVinl5gpZ/amx+Yn10bn95YGZlcW9oZ2hDWWBbPUpUMlQ4QkJDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaWFNQT05JNzA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNTVldXWFZVVVFIRklKIygovJKahKnGw7bBtJ+braCuuKWkjpuko6Cvrqmfo56drZieuaCiq6CvqpqtoZCqqaSWiZqQrrCspp+om62YmI+toqGepaGapZytmJ+opraov6+lqaSfjICOm5ugpp6SlJmalJqapKOjmairq6KjnqmovqSXw6yqo6Kss7qsr6ehtLCpq5l2r36QipyFh3y6rYmYZLCMZZWtfaCPg6eWmoGsioSwhaWZpKGikISgW2xqgbNgf617e4KBsWxnbpmXi4ixW320W6SDa8iiZZ+Be7xZdrVasn1Sr4B6rFiAoW2XjqiaiZaPlJV5d42bfWNyfWGDeHOAfGFpZnBtZmVlT1VjW0FUXj1JKD45PTQhIiwlHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE1KR0M1NTMuL0BVWVhXWFdXWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7K3vbu0wbOjnK2mpbapoYuZoJ+ds7KonqKfnbSYoLOoqquesK2erJuVrqmijoibjq+tqKajqJmuk5qPqZqhnqWfmaOjpZmeoqmyqLuvpaienY98i5uWoaCakJGam5GZl6eeoZioraakpKKkqbueoManpamiq7S2ra6noL2ura2WgamSo66Om4CGpJeYj4GAuMO6g46ck4Snl5yCrIqCr4imm5qlqpF+1b3CqmKjv718fqOCg9e6uLWFk5KCnr2+hGqjgW+rhG6cf3qysceDaquwva14d6K+u3SAlY2mm46Zj5WbeICPmXlifHpjjGd4gXtga2VramJQYltTalxAVGFCTSk8OjQvHh8kHiUyIB0kKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSUM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbS0sb+5sr2zop2upqazpp6MmKW/qrewp6C/pqaxm56xnLmonq2vpaeVlK+sl4yDmpGvpqOsoaWcqqCYi6OSpp6nnJqhqKKZnqCrram5rqikm5eTe4eZkqabk4+RmJiPmJOomZ+Yqaifqaahoqq7nqnFo6Cvo6uztauwqqG8qLCwmnR1qqS3hWWJn29nrI+Kj21vd6SQmZ+Bda+ZlXCQjHGVp6ObmK6kcm1tbWWKd25tgplxgHlpcGlniZWVl3FoaYWGZ3CGZF6JY2pwWV1nfnemYGJxjpJvZmSAjZKOopeWl4+UnXuGjZN0ZYZ3aIxqeH55ZGxjZmxiS2RYSmtZOlBlRVEnSzkrIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJSts6q6ubKzqqmirp+ks6qYkr2xw8i9tamewKuso6Cmq5+6o6StrKymjpatqo+MhZWXrZ+lqqKfpKSgkYylk6eZqJmWo6qglpylpqevuausmpuTknuEl42mmI6RkJiUjZeVp5Sel6iimq+mnaKsuZ+wwaiks6assbKrrqyouaSvuJaKoailtpyJlqGXhqmakJSdk6qzmZujrKGzl6KgnqCinKCkoZWrpoySk4yHkpyclJCZk5iQjpWFgKSal5WNi5OSio+GhH1ni4B0g3Z0h4xxp218lZGUk4GBj4+Pjp2ToJWWlZ+BhpOLcGeOdm+Kd3Z8emlsZGRvY1VgWUBpWkdiYE5ZKkU9KyYiNzQwLh8cISUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5VUUpFQz45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqltbivrqKwpK2gobaxkI6rxLvEureqoaWdm6adsKijtqedqbSmp5GYrKOLiImPnKeWrKShmqeen5OVo5epmqiZlKehpJCap5mhtbqoq5iakI18gZSMoZSKlJGVkI+Tl6WPnpmon5u1o52mq7eorsKuo7emr6+wraqqtLqir72ZkqajprWikZ2mno2pn42Sn6Osr5qho7GpsJikoZykqp6dnZyXq5ySmaGbk5CWqpmNmJiWkJaekYignZSUhZKMkIyUi4B+ZoyHdYd2eYiDc5xqh5GUlJGKfYyWkpKYkqCRm5WfgoaXhXhxlHJ4iX9xe35qbmRfcGlgW2BZbWJQYGRQWjpHRkU9Mz09Ny4qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZcXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlaSno7CzrK6jqaetoKi1qpGQnKOyuq6rq6GimXqdorCkpbGplpu4pqOUmamcjoaKiZuikK6epJaooKGSl5mcrouqlo+omaiMmKiPnrm2pKWYm42JeYGUjJuTipWRlJCNkZahjJ2eqJ6et6N/g6+1orCvdKS+o7KgeHqgq7O8lXaupJ+KgKp+ZFthdp+OpJ2Dl35uk7Oco6iuq6NlnqCTc3mZlnCAmKiXbH+ip4llnKWbkJeYlouRm5CFnZqQlIKSh46OkomFd2uPh3aHcXyGgYBhaYiLlZOLW3aVkWdoj41xeqOXlmR4mIaAdpdog4mCbnl/a3BlX3Zva2toXGZjYmJvUls+TU5OUkc9QFRCOTEuHh8mNDozMTY2Nzg8Oz5AQUJGSEJHRklLTFRVVVlcX2hmZ1dRSjxERzw5VlJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqaWpraOnraWSlqq0rrGlmammq5Zzi5yvn6irp5OWuKCgj5yknZF+iIiano2rmqSVp6KejpeSnoV1rpCJppqokZajiJu6tKigmZiLiXV2k46Wk4qTkZCUjI+Sn42an6aZm7KWgIybtZ20jJKPvaehfqeieqOvuIGOjqefhIuFj7Cpr4yJlqKZeYGLrIacnaKoqqiIlYaYd6WbeoebgZemgoF7nLF6ioWfl5mUmJaBkJaWhJmaYnmHkISOj5KLg25xkIh6gXGAgYZ/hnSHhZaSeJZok3SgmnR8mYOem4WYfpGJgYKXaY2MhGp4e3FwZ2R3bWlsaltlamllclteSFNMUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dSWFpYW2FhaGZZUUg5REs8PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2Yo5+mrq6rqKygqLCnp6qlmZStxrywoZWlqLSdj4Ocq5unoqCNkL6emY2fmqCQfYWOmZeIq52jlqChko2UiYaAkaiOh6Kco5OWnYafubKnnZqTj4VwdZCKlZCKlI+Pm4uPkZ6Rlp+jlZ2siJ+0ibSarovKiKuuibeFjbCDsa+EqY2nmI2dfKiPcnt3m46mlmiVpHm0i5+ep6mSmcKBf6uImKFxnoCapH2XhZWxgaF8oJOfj5iXgI6Tm4mYkot8hZOGjZWTiYNtc5GFgHtyhoGFfYV0hYKXgY/FZoCph4+iap6Cn5iBmYCKi4OImG+NkoRnd3R7dmdodXBmZ2teYm5sZmxYZkZcUEwyRTQ2TWBjNiY0PERHRDo2NDY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQEpkWF1jZmhnYmJiYmNjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS5saqrppqUn6KkqqKVo6m2oq9/oKacpZ6diZS9mZONoJGdkHmDlpaRh6uZnJuaoYWPjHebnI+gkYiepJuVmJeGoritpZmbjY1/Ym2Qi5OQjY+MjJeLkJGejpOfoJihqH6hp4etnaCWro+fnZ2RhoGgjauwh6SNqpqMmn6jdoCYk2uBq3RNq3iHjZ2Rm6mogqqrfYOhe3qnaZ5/kmtnl4aXtoiefW1gY1iDl3+Me2Rni3OZfXmWbF18l25fU3GFXGBseYNgWWWCfYSBmHGnqmuDo25ypXCfg51nZJ9sWmyIemVZX4J+YVdQb3ZlbXRxampvXmpvbGtoV2hOXVdFOUE0R0NeazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl9idmBNRDpNT01UYlxbZmZpaWJiZGFkZGJhYmBiZGNhYmlrZGJkZGdkYmdlYWNomJadoLmhqqOmrJKitryrrqKZl5+hpaysn5yttKKnkaCfn6acmY6YtJmQi56MlYt1gZSRjYqmlpaYnp5/k4WGrKSHnJGKmKiXmZqRh6WwpqKVmYiJgGluiIeLjo6Ji42Si5CRoYyTnp+boqV/k4GPo6GUoHeclpCng6GngIaqroWleYt9hJp9onBzk4eWe56MeW2Hm4yZkJupm4+HnXyConN2pmaefnekX5h6fJJzom6Yt7S6dJKHgYC2qGSBxrh7cJW3jHGAm6RjdKyrYH1qnbN+bn2Hg46Ci5dxgKNsc6RznoN+o16dmbOWb3uXnrN0cluesoJpYm9zdXFob1lrbHJyZVxoXWJLRD1ENVFBWXEyPFJGX0pTPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWlhgYHxkSUM4TFdVVmJhWmVma2tiYmVhZGNgYWJgY2NfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mayck6COpbi1rq2gmqKco6OkrJuasayrkpegmKCkmpqUnqubi4iSeIuFcICWjYqPoJCTlJ2XfZGJjqihh5iPipKjk5uajIuoqKSej5aHhH5re4Z+fY+Ng4uQkImPk5+Cl56gnaCfi4l3nJiijKByoouIqYicp5GXqKx/rox9eqCZeqOTeIBzl4iMnH2Wn4abjZmbpoajZKF8iZaQm41snmiajW6amXp/iqd9cmdzqoOdgnOqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxep3Z1iYp/nmiadYeTkpiOf55umZBrpplcqH53u2p9qVqOhF2zZ1xtcXh3a2lbcGl4eGJeZVdiQVBETzdWQlJtNEpaWl9OWkRAMTUxOzs3SD86Q0hVP1hSWV0+RGJdVmBRYWR9aUVCOU5bXllkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2RjaWhna2mVnImqtpuoiWOVnKy6srCsnaabm6efna2anbCnq52Xopmhn5mWlqCjmYaJjWmIgHF7l4iLlpaEkpWYj3qKhJajnYmVkIaLnZGcm4mPqKOgmouRioCAaYGGeH+WjHuIjY6HjpWafpSjn6Cik5hyaJ+KoI+McJKMgqmImZ+jqaGofbCtpKK4l3ajs6Kjf4iUeJ16q5p+oo6dm5eIl3KhfIWNr7V9a5qRoXh+mLSjo6uohJh7mnycmX5zqlpdb3uXi3ieYk1/e3uFY3qYQk2fWaJqcnyObYGJhJl1m3mHibGzf3+akqZ0f51tcXyUb5lyaaNdlXZIZWNgc3B8fW5lYGtodntiY2BRXlZcVFZAWUVRZ0RSV1tiWF9JRD1COEBCOklFOExFWEFWUVtWREZhXFpgS2BtfnJFQzxVX2JaZWpWZ2hsbmJmZl5hYVxdXmBoYl9lY3ZsXmVnZmxkZWxoaGtpk52Bsa6ZhFNfoae0urOzqZqii5upnJuokqGro6Cnjp6dnJqZlZihnZaHh4l3hYFueZWFkJqLfZGSlohygImSoJxykZCBiJiUn5qEjqicmpWKi4p8hGyEhXGBoYx4hY2Ih5KYlHyTpKCeo4iuhn21hI+enXumlnqpgpadkIuhnn2naHdtfplzoHNxfJ2FmG+Tgq59o4OmnpqBo3BeqWd1o2NvpWGc05B8epl4cnNjooWPfqJyoo51a4+zi2CCmIpzqrKovH93g21/v6aqtF6bb35xl2+Bc6JyXaNndKZhaKZtm9OYeoKbbnd5l2ubenaXcmyppWdfZHlwfoRrZ2ZjbXZ3Zl9hUltlUVFiSVdJVF9XU1tlalxlUUVDS0xKS0JKRDhQQFFOV1NYT1JRYGVlaVJkeHl3SUZFY11lWmhqU2loam9jamdgYl9cXV1faGJhaGV7ZF5kZ2RrZGpsZmhsaJibf7CsVFxLfqmwsrWws6OcmIWYpqCgoo2kqJ+XqImZl5iTmZOSoJeNiIV7cH2EaH2Pg5OagXeRjY6JcH+Gj5KSbJeTfIiQkaOVg46qmpSSioWJeYR2h4BugZ+Gd4CShoiZoZZ5k6KjmqCJs6Gitot6rKekrqVwqYCakIWBnJJ9pICimYaYcp6EoqyuiZeLgIykjZaDrqKUdrW2tcmhdJSKgJ9hnpepbXiWhp+adaGHd6B9kJaKgW9MZqKScJqIc6R7eXRhg4JsfqBscmRgnHJ/dJdpe2mztbTGpnOYfnudapuaq3SCmm1zd5dpmnl0mHFQRXyzXmp1aniHZmpnYnR0cG1VXVNZaFBSaElVTFhSVl1na25WZ1dNSkFKTUpISk5BUUpQZWNpbWV0cnN+eHtudYl7e1RQT21daFtraVJqaGlsZ2xmY2VfXFxcXmliZGhre19dZGdjamZubWVpbGWinImvp4VmP5Sis6uvr7WiopCAl6iioaOLpKadnKWBmpeWjZeQkJuSjYiDeWp5hmWDjH6WoHl1j4iMgWmEhZKDjIWdjXqMipSlkoKXqZeMkYuAiXqAfYt5cJChhnmAlIeJlp+Uf5Slp5yWloRnbnicbKJkfHGld5yYcGengZeMe6V6oJaDl3KfdoCJlJaPuW6QiqJifZmilYhucmmqa3WgbG6mYJtpi5BoloealXWigH2aX4uFjHVviGJooWWef2mbdXBkZoiCbnKiWl9bZKFuXomMb3t/c3JkpW54omRnp2iYcouYbqFvUoiPb6BeZKdUi11TmG1tcmpxgWxwaGt4c2tvUVdWVmZZU21JWE9cSFhpaHNqWWtWUVJFVlxMWFJhVWhqXnd1enxwfHxygnt/cnaNgIR2XlFzYWdicGdQamhoa2xuZ2RnX11dXWBqYmppdnVdXGNoY2ppcmxma21jnaWYpnpldG2Lp66lqrCxpp+LgJaqnJ6kjKGhmqGhgJWYk42aj4uXkI2Ke4ZxgIhoi4t8l5pzdIp9kHtlg4eVioqVmYJ8iIWWpo+BoquQhZCKgYp9gICOc2mPpYR9hZONiJifjYeSqqaeiaZ4lpx+pYmWjLKYnpCDr5efpXiWiHqpdKWPhJpupaKMkoSMg7xufKWvgoaFhpOWnKB9pnpxqJSglmeefm+rYpaKlZJ3qGypooGJdoeCd6uRpohrkbBrdrOMqWyLhm5tn56SlWF+q4uqdoB/jaefd599haSVnaBpmod1q2aerYy2c3e+jKSTWYOmjathdXFzb3t0cGJqfm5obFJVWlVgYV1rTV1SXUldbG12YFtxWVtgWmdzZW5vcmNxdGB3e355cnmDc4N+gXt7jIGCgHZieGRjbnNkUmxnaG9scmlmaWFfXlxhamJsbHpvXFxiaWJtaXdtZ2xuYpWmqpyBgJ6klqmqnqinrqOZiYKXqpmdo4mapZyonYSLmo+FnJGFko2LjXSFeoiDb42EfZaTdHSGcpKCbX+LkoeGk499e4GEl6SNf6WljYCNiYSUdYOHkm9siqiAgouTjYicnomMk6qjoJCAdZWXiH6BeZSuo3+Bm3GPhniQjIWAe3KnjHF9fXqXlpuEjnh7fn2IlJWTinaQmZ+hhHt9iWuMhVt5eXJ5cGhufZGJcX90gY+Uk3GFg4FljX9fgYCMd3VzlHVvem9uh22Ehl93aHiOZoGCho6qnH50fZdqiYhvf3V8hHVtbGaMc3h7l3eEW2pYeI9obXdxcG93d29dbIZtaWdWWV9XXGRrZFVhVV5RX3B3eWtqd2Vqamp1fHFxdHNhb3Vic3uBeHV5gnV/gH+AeIuFg317bX9sZHluXlduZ2h1a3hqaWlkXGBaY2llbHB1blpbYmtka2t5bWhsb2GOlbqpp4uhopqmpJmknauioIODl6uRnaCJmqaaqJiCgZuLfpaUh46JiI1ygnyPfX6PhHqXjnRyg3CVhXt9kouGhpCFeH6AhpiijHunoYuFj4+ElYKGjpd3coSphY2SnI+Inp6Hi5qnoKCrg4mOlZp+fomWraiPkqeQeHCekYN7k29+qYVwfZVxam98gZ+Lf5KOjGhtXYOLjJybn49zlYuIcXRrgnZzf1lyboaPgX1+i2ldaWN6hYOIgF9peHubfIOMg3aBhoNpeYuHa2Fxc4N3YHOMgomQp5WGZo2Pg252i4NvhIx4bmRmY3mCepVaXGlmbnZbenl3dG1zcoJmXG2Ka2tiWVldWlhrcVteYFleXWZzfXtzb3Rjamppe3xxend0ZG10aGx8fnV5fHt6eX+Af2+GioR7fXN+eXN/aVRccWlsdnB1Z2tnZF1hWWpoa2pxcm1XW2VubGdzeW5oam1gjIyrsaKQo6Gan56Ynpmpo6F9g5erjJ+Uh5uikKSUf3uXhHySmYiJhoaKcn2Ai3aFi4GElopxb4BymIaEfpKDhIaKgXqAg4qano+CpqCHeI2XiJWLi5yXhYN6rIGQl5mTiZ6dh4ihqp+ioqOMiJObnKOZlqqhp6agkpuIl498eY+OhKh+f5KRkpOcsKWalJ2QjrKTmISmjIyVm6CJkJuCiZGKa3yOdndlgoaQinyJnYSHi4+HiICEg5B3fHp1mqKJh4ufi4aVf36MgYB2cXSGhYB4iIeKkaaRhIaOiIONkIx8hoqHjoB1a4GDe3mZaXJoYHOKcH16dnVvd3SBXF5vh2huX15aW1xTZ3FVY1tbYWxodHt8cm5wY2ppaH97bXh+cWhvcGxmgXtygYB3gH1/hHttgoyGfHp4fH56g3hOZHZqc25we2VrZWJiYFtzZnBmcnFsVV1sdG1peXpwZ2lrZY2InbqflqKhmJWZmJSYpKCde3+Zqo2djYWfnIqelnx4lIJ7jpmJhoOEhm14gYBygId+iJOEbWx+epeGhIOQfoCGhIZ9h4OMmpySh6qegnGKj4WSkYuckX2NeqmDjZKXlY6bloaGm6agopqdhoOSmZmYkJqmn6adnZCXgZKLd32IjoWle3yPkJGGmKmhnJOcj42qjpKAno2Jk5qfg4+Xf4eOgm94hXF0YH6Dj4V0i5eAg46ChoR+hYSUbnl1dZOii42Gm4WFjnSAin19cnN7iYR7eYyOhJOnj4aEj4KDiomJdYSHiIp7bmp9f3ttaGtsZ155fmd8e3ZzdXV6dlxgcH1tdGBiWlxeUWZtU2VaXWFraXZ5fnBrbGNrameAgGtygGxrdG94boR5boaAdoKAfYV2coKNiH57enx/e4KKYGl7a3VoaYNlamNgaVtjdWhvYnVtbFRicXlkcHp6cmVqbW2Lip+4mqGkn5OSlpeLmp+enXp3naWQm4mGpJSLmJl5eY2FfImRg4yCgYJtfH94coCFfYqQfWtofYGXiIGIjnx+hoSHfI+Aj5qakYinnH9wi4qLkoagoYqFjHynkYePkpeTlpJ3jaOgoZ2Wmn+BkJmYk4yaoqGjmpeRm3+OhXmAhI+HoYB+jI2PfJekoKCSmZCPpo2QgZuRiZOYm36Skn6HjoF1dIJwdmB9gI2FcYqVfIeLcYx+goWFjmh4cnmMmZKQgJh+iItygod8fXF6fIyFe3uSjYOWpZOLhpF8hYaHhHWBgoaHeWRxen54eXBsamZefXJofHV1c3xzf2peYHN2cHdkY1leXlJqaFRkWF5hZ2p2eIFxZmtjbGhlf4BqbX5ob3BqfXeFemuLgXKBgX2BdHaCjYZ+fHp/gX1/j2pyg25zaWGIaWxiX3FVdG9tbmB4aG1XanR2YnV6e3Fia296iY2fs5KlpZ2OkJiPhp2gmpx8daOgjZZ/jKKKiJqWeHuGh36DiX6IgoB/cH97dHWChX6JkHhnY32Gl4qCio14fYCMg3mWgJSWlY2Wn5p9b4uBkJOGpZuHjImDpZWEkoqVl5KRdpGdoaGYlJh6f46Ylo6WmpyknpmTlJt6kIaDeIWXjZ5+gYqOjHOXop2gkpiOj6KMjIOXmIOTlpp/mI18iI2BdnF9bXpkgHyKhXCGkn+QgmuHgoF/iYRldW98h5OYjX2UeIyJfICHfXxygHmKh3mFkYqLmKKWgoSMd4iEgoF2eoCIhHRfd3d8c313ZmtkYH5panZzc3R9cHtjY2BzbXVybWFZYF5bbGRSYldfYGhrdXmGcGNqY2xmaHyDa2h0aGxvaH98gXltkIZxgIKCf3R8g4yBf356goN+fJBtdYl0dG1limxqYWN1VoNpcW5geGZsYmp2cGZ5e3lxYHJshoWQna6Ypqiejo2Xh4afk5eYfHepnIqYeZeci4uYkHh7gIt9fIN7gIKAeHN4enN9gIR/iIqAZF59i5WHfoSHdH1+in99mISWk5aMoqCXfnKHe5ORiqaPjI6KkqCRg5GPlJeRioGPmKCakpCSdICNkZOJnJ2eppiYjZWXdI6PimyGmJCZeoeIkIlvl52ZopOUioyfjIaCkpx/k5KVh5mIe4mJgXpxeWp1bHt9i31thZGCk3dvgYN9fouAZHJqfIGXmIV/jnSRiYN5h352eIF+h4F9hI6FjZSkkHmFg3SJh31/cnR/hoJsYHp0eXB7b2FuYmR7YW5vdnJ3d3NzYXZfbmt1bm9dW15dXmpdT11XYmFobXN6iWtfamVqY2h3h21mbGhqbGeAfHp3b5CHc4CDhH10gYaJeoJ9eoGEfX2OcnmLeXhubIdraF9pcmOHaHFvZnZnbWxhemhqfHp4cGF3bYuBmZqqoKSpnYqKkYaKnoqVl312rZiMln2ek5GWk4h3fXuKfHuAdnd/gHB0c3pvhX2BgIl9e2Fcfo+Rhn+DhHN6gIZ6j5GHkZGckqSblIF9gHyNipKkiI2KjZeajYWRmJOVjomJjJOdk5CMjW6EkI6RiJ6ZoaCXlomWkm+KmoVnhpqPlHqJhZCKcJaak6GSkoiLmYyCgJGefZKQk4yZj3uJhId0c3VrcW51e4p0boaQjZFxdIB7gYKIfGVxbXl+mpR9hYl0kYuBdIl5b4F+gYd9hY2KhY2WqI17iH1+i4V3fXBuf4SCYmd3c3RuemJeb2BqdF5wanp4eGxycGV4XW1sc21zWFpeX2FqWk9XWGRjZ3Fxf4dmXWloZmJncY1uZGlnZWlogHp3dW+OhXOAgYJ7dYKIhXiEfHeDhXqAiXd/i3x7cnmDamtfcGh0f2txbm1xZ29sZXtibX95dnFsd3eKf6OYoqihp5uHjIqBj5yGk5x0gKqUkYyGoIyVk5B/dHt2hHd4f3Jze4Vrcm95bYl2gICGbXBbWX6RjYiAgIB2dYB/f6CGj4qRnJegk5d3iX6AjIicnYmPhpKXloSIlJmPlouLjY6NnYqOkIRuiYuPkYqclqCbmJWFmIhrhqSDZ4adipF/i4SLgXeTmJGdkZCIiZWOf36PmHyRjY+NmpJ9in+Cb3Zva21vcHqFaXODjpeJcHeAdIKIgnlmdG92gZqPfImFepWSeneJdHCKfIeNe4uHhImPnKOIfIR3gouAeHhuaX+Bf1xxcnFvb3daXnBgb2peb2l8enBtbWptdmBwb2pxbVlYYWFibVdRU1llZmN1cISCYl1rbWRiZmuSbWBmZl9na4F1cXJwi4B0f4KAeHaAi4B5hX93h4Z2g4V8h4yAe3aKf2pxY3xjhnxvcGx0amhvbHZ3X3F+eXt0dXR/gn+llZqtn6eWhY2Df5eVg4+edYqfk5KFipqMlY2LenJ3dIJwcoVzcXWIbG9tdW2Id4N9f2xtVVGBq5SHgniAdnKCeYKggZGBk5KYm5GaeJF6goySpJqTjoiVmJKDhpaZjJOLiY+PiJ6FkIp9c4uFiI+InJmem5aUgJR/aYadiGiHoYiShJGDiXGDkZeOmo6PjIuPjXd7kpB7joyNkZaNfIh8gGt2am1ra2x6fmF5fY6VgXZ6gXeDjHx5Z3VsdYeWjH+IhnuUkXF6hXB4jXuLjXuJfoONkZ6ehXx9eIKLfXZwaGuAgXdedm9ta3ByVV1uYnFgX21ueXBncGZnc3VocGthd2VdVmVgYHJTUE5bZmVdeHCIfF9caHJiYmVmkWlfaGRbZ3B+b2txc4p9dn2FgHR1f4x5e4WAeIiDc4aFfoyMg3t5lXhmcmqDYId+b29remBpbnR/dF90fXiGeHRyhXx5oZCasZymjoOKf4OaiICLnn6KmZKOhIiXjY6OhHZ0dnOAcG+Fc3Bxg29qaXZtgm59fG11c1JOgt/JktaTfHB0g3WDoIKSd5SQmJuPmHuTcoWQn6GTk5CKkpuThX6WlYiNjYiRjYicgI6BeHqMfoiMiZubnJqVk3mNd2iKkohsiaSFk4iXg4ZjjJGYjpSJlouNiotxe5SJe42IipORinqFe35se2Vyb2preXlbgHmPjYB6fX5/ho56emh0a3SLkIqChoV9loxsfn9vgY1/jYh+hHqDkJaam4t8d3iDj3hybGVwf4JraHRvZ2hzbFNebmRwWV9rcXhma2piZnhzb3BjX3dgYFZrX152UE5MYGZjXXlxinRcW2V2YGFlZY5jYWZhWGlzc25rcXaLfHR5hoF1dn6Lc3+Gf3qJf3KJh4GRioh8fph2ZXNufGWIf29wbIBabG55eXNgdnp7jXZyd4p3eZ+Mm6+boJCChXeIlX99iZyGhJ+QjoWMl4STjoeBdXdweXFuhG9tbn5yZGR4cHxten1qaGxjpJrB3K7voXNrdYN1hKGFkW6Vj5SflJuBkXCFi6OXiY6VipCdlYKAlZCFiY+AkoqKl3+He3V/iXiGhI2bmpeZjpB2i3dviIqMfoukhZKJnYWFXouUl4qOiI6LioSJbHuXgn2IhYmRj4Z2hX19a31jeHVpbXhzV4h6kYaEeX5/gIWMfnlmdGqAio+Kg4OAjJeGbIJ2bomRg5GFf4J6gJGWlJmQdHR4h411c3BmdHmBYXNsb2FodWZSYHBna1VebXN5YHJjX2h9cXJtWmJyYWJXblpcd01NTGNmYV52c4ptW1xkeV5gZGaEX2NjXlhqcmtua3J3i31zd4SBeHd8iHGDhH1+iHt0i4iIlYaMfn6Xc2h1cXlsjHtudHCBWHF6dnlxZHd5hoxpdoCJcoCdiJmonKOShH1wjJR4eYudhISgjY58lYx/mYeEe3N3cHNqb4FraWx8dF5geHZ7cHV7Z2BlfOvatcnD3IhzbHOAdomaiI1pl4+OnJSSgYhwhYigjoSLlYqMmJN8jZKIg4mPe5GLhpCCf3Z4g4Ryh4KSm5aTmIaMdod/cYaDioeaooOUjJ6DiWGDlY6GiYWJjIeAh2l9lH99g4SJjo6CcYZ+f3F3Z3ZyaXN3a1qMfZKBhHx/g4CEioJ2YnRsiYKQi4J/f5ORfW6CbHmHkIeThH2BfoGSlJGXiW5yeoyGdWxwanF3f15zaG5canVgUmRxaGZTX292dF9vYF1ognFyaVdnaGNpWG1XW3VMSkxlZl5icnOFaFtcZXleXmRnemFkX1xZa25lbmp0d4p+c3OBfnp2eodzhYN8f4d3doqFj5iBjYJ7k3Zsd3V5eZN1bnh6fVh5hnGAb2d4d5KCZHaGhXGKloWZoZuiioZzb5KLcneOnH2JmYiJe59/g5l/gXlyc25vZHJ+aWZsd3dbX3h6enFxf2lhZ2F/1baOkKZ4bnF3e3GSkIyHapiNiJuRi4Z7aIeLmYaBkpGGh5eNfI2MgICJjXyQjH6KhXp1e4J6cYWAlJiOkpOBiXWEh3eEgIuUnZ+Glo+ffohhf5OHhIeDiY1/f4JmfZGAfn+CjI+Qf22CfIJ0a212dHN2dWtjjYGOf4R+fIR/hIh/cGBzcYZ8j42CfH+SiXpxg2Z7hIuHjYR8hX6BlY+Rk4RucHmMfnVtbmlqeXxhZ2lpWGt1WlJpcmliUGJyeGxhZV1aaoNtc2JbZ19kbF9uVFpvTkhPZmRcZ25xgGtaW2NyX1xjbHdkZV1cWmxrYm1qc3aGf3Fvf3x8dHiFeIWCfICIdXmJgZKVfIiGdoiBcHh5e4STb217gXdeg390gW1penOUc2dyiH1ykpGEmp+boIaHdnaUf212k5d9h5CDio2ZfIuadn53cW9samF0fGdiaXV6Wl94fHltcX5lY2hoV52PXnFylrzEhHZxlIiQfnKWi4abkoyHcmqIj5aAe5SMgYSbjHyKhnx7iYx/lIh1ioZ2dn2BcXWFgZ2ThZSPg4NygIh1hXyKmZ2Yh5SOnYCIZn2Tgn+Fg4mJcYF9Zn6Le3l+f4eLjn1pgHyDdmZveHhzdnNsao2FioGJf3iBgIWDf2tfcnl7fo2KhnyCj4F+coFpeYSIjIaFeYR9gZiNkIx9bm17iX13dG5nZnt1YltwYlduclNTbnNoYU1mdHhlYF1cWG6Ab3NZZWFeam1gcE9Za1FEU2dgWmtubXxuWltebGNaYm93ZGdcXWBsaWNsaXN2gYNxbn58f3R1g3qDgnyChXZ+iIGWkHiDinSBiHJ5eH6NkG9ve4FxaYF5en5tbHt1lWtqd4R0bJSOhp6YoJmFiG59jHZqeJiOfoGKgpWXiXmOlm96c3BsamRgc3poYGVxelphcn15Z3F6YWVlj7Gyd0piWqTZ0JZye5CKkHd+lIqEmZGMhW5rhZKRenmShoCEmIp8h394eImKhJaAcIyIcXR9eml5hYOkkISTjIN+b3+Dd4R5hpyZlYuTkJSFh3B7koJ9goOIg26Bd2iAhXhyf3+Diod8ZX1+hHVjcHJ/aHhwb3WYjIWCinx2eICEeYFrXHF+c4GIhYl+hol7iXKBbnGFh4+FhXOEeoKZjY2EeG5vfoR/dnpkZ2l7b15YdlpYcGxOV3FzZ2BKbHZ0YF1bW1l0fXJvV2ddZmpwYG9OV2hRP1lmXlpvamd6cVpaWWtlWWNxeV9oXF5lbWhla2lxd3+Hb2x/foB1b4J7gIF/g392gYWIl4pxgo1xe4Z8eXmEk4x1anp/bG9+dX99b3J7e5RvboF/eGaTi4OhmZySgoZnh4NwZ3qViH1+hIGYiYF8jYxpeHJrbGZfYW54bV9ib3hcZGyDemFxdl9lZdTqvooyOj6LjoBxeIWIjo12g5aMfpKNjH9tbIWNjHZ9j3+FgZWIfIJ4bnaHhIOXd2+IhWx1e3RmeYKDpouCj4uDfW6AdXeEeoedkYyRkpOMi4Z+e5KGd3+EjINrf3JogH54bXx8goqEd2J5hIFxZHFofm10cXSBm4uAfoV+c3V9gHOBb1ttf3V4i4OLe4eAfIh4enFsiYSQhItygnqAl4uLf3Rta3eAgHV1XGhndm9YVntSWW9kTFpycmVbSXB4b1xaWllddX50aFliW2dlbmNpTFdmUT1eZVxddWVgdXBaWVRvZFlkcXlaaF5gZ21naWxpcHd9jmxpgoR+eW6AfHyBf4J6dYKBjZOFcICLbnd+gHt7iJKJf2h7fWp0e3KGe3N3fX+MeXiEfXxrjI2Em52WjIGAbI1+a2h+jYx6fn+DlIF+fYqIa3VxZ2hjW2Jncm5gYWtzYWhwiXpic3ReY2SboI9uXDVZr7V0aYCIfJKGdYWWhXOPiol2cGyFg4d1eYl4iXyTh3p+c2d2iX5+mHBxhn5odnltZXmIhKSGgIeNiX5ufnaAgX2MmoiClJGYiYuEiXyPiHB7fYR7aH5saoB7eml6doGHgHJgd4F+cWRyZnWCbXV7hJSRgXyBf253eXx0f21YcIB3dYyChniIdoKJenhzboqBkIGGc399f5OJiHpubWpugoJ1bl1nZHJwUVp6TVpvXE5bcnBkVUtzeGlXWVlaYXGAdGBdXWBmZGhpZk5aaE5AYWRbYHVhXXVtWFdTdGFaZG9yV2pdYWhrZ21saXB3fJJsaYSJfHxwfn57gX+CeneAf4qLg3F7h29xd4R/e4mNj4Nqfnttd3h2ind9eICCh3+Dfn56bYWMiJijjYSDe3WLeWtshIiQeH17gZF/f36Kg3BycWNmXllnX29wYGBncGZqb4l0YXRvW2FkanZ7f76cpqPIuHGFg3KSfHiGk4JzkYyHcnJvg3uDdHWHdIh3k4h5eXFjd4d6gJNpcoR2Z3d1Y2p8goedgX9/jo99cn90hXqAkpGDeZaOlY+Igoh7iIhreHl+dWd6aGx/eXNpenaAg31oYHeHfWpqc2d7gGl2gIuQlH56fX5we3Z7dH5iVnd9cnOKhIJ9g3GHind4cXCEgo1/fnl+fXaOhoN2aXFpbYiCcnBdZ2FxbUpldUtdblVTWXNuYlFPc3hgUlhYXGFvgnNbYVxoZWVja2RRW3BJRGNhWmNwXl14aFVWVXdeW2VuaFZrXmFqZ2Vvb2hwdnqSbmmIjHh9cnt+eYKBgXx2fYOIhoNwd4NybneDgn2Ji5N/cIB7eHl6gYx0g3h/gYGChHqAdW9+ioubnoh9hXp3hntndIWLkHp+f3uIhYR2j4Bnb25fZFxYZVltcmBgYHBsa2iJbmBzaVleZG2Ad6naqceGh7JxiXdvjHV7ho6AepOJf3V0dX53gHBxf22EdJSGeHVrYHqCeYmPZnGEcGd2blttfICQk3+AeZGSfXl7bYh3gZKMhHSWipGOh4WFe3+EbHV2f21ndmVte3Vtand2f398YGJ4hXlodHVifXtndIaOjJV7dIB1cX96fG1/WVZ0f3B1hYd/gXlsiYZ0eWx1gIOEfnt9eXtzi4F8c2d0ZW6LhG1zW2pedGRHbW1MWmFXVlV4bWJQUnR2V1BVWF5hcYRvXGBjbWRkXm9iVF1yR0JmX11maF1be2JRVVx1W1pna2FWal9gbmVma3FocHV4jnRrjo11fnZ4fXeBg4F7c32DiIeDb3F/dHF1f4WBiY2Ke3d/eIN7fIWHeId8fYF+hIB7fnN2eYyOoI2Jeol2dIN5Xn2FmIx5hoN0hYaEd4l7Ym5tXGJbW2FWanNjYFtnbm9mh3FhcWZXXGNrf3zKzoe5oWptbYpscYRxfISJfnuRhXl5c3l1dXxqbHVjhHWSgndvZl59gnqLiWZygmtqcWNYbXqFm4iBgXOXlHd/fG6JcoKLjIhymI6RiYWLg3t4fXFxcH1maHFibXhxamtxeH18elxkeYB3aXV4ZYJ2Z3SHi42UfHGHam59gXlufF1Ycn9udIGLfIJvb4p/cXZod3+BgIF3fXF7dYd8enJmc2FujIJsclhqXXZbSG1qTVVUXlRVe2thT1R1clBRVFZeYnSFaVxga2pmY1luYVhicEdBaFxgZl5dVntdT1VkcFpbamhdV2hgX3JlamhyZ3Byd4Z4bpWKdH96d354g4d/dXJ/hoWNgnBwe3h3dXqGhYaMhXp8f3SLfn2GhISHf35+fYd/fHh2eXiRk6B/jH2LbXWAeWODhpaFc5GKb4WFgXqDdGNuallfW11dVGdzZWBZZHFyZoFzYmtlV1tgaX94vq57oLdtYnOGaHN7cXmChXt9jH93eHJ2b3t2ZWpuYId1joFzamJef3h5i4RncX5oa2taVm93iaOBhH9xmZNxgHl1g26Bg5KIc5WIjYiEiYV9eHRybmh5YGptYG12amdqa3l3endbZ318eGVyfW2EdGV1hYyFlX9vi2ZqeoN1bXRiXHB9bHV9jHyBZnWHfW5xaHV/eH5/c31se3uBenhxZmxibol+bW5Wal92VUppak9RTmhNWXxoYk5VdWpMUFRVXmZ1g2ZdYHBoZ2FXaV1ba2hKRGpaYWRXWVV5WU5WbWpZXWxlXFllY150ZWxkcWdyb3WBeHCZhXZ/fnd/fIWHfXVzgoiAlYJuc3l7enNzhYaIiIN4gX11j358hIqOhIKEe36Lg3t3fHd3mp2XeoqChml2fXxsg4SSf3KPgnCFgn6Bf29mbGdXXVtcW1RkcGRfV2JydWl1cGVlYldcXGh/cG9ygHOJZGR4fml0dXNygoR4gIR5d3R1bWt6cWJna2eGdI2DbmZdX31we4l+aW14ZmlkVVdyb42mfIN7dpaQdHxzfXtufHyRhXeZfIiGg4aDfXRwcmxndFxsaF5sdGRnZml6b3tyWWeAdnRncIB3gXVid4WKfJSAbotqbXqBcWZzZWFue2dzeIp8fmJ2g3Zqa3F1e3F6enR9Zn5/f3l3bmRmYm6FfG1qVmlhb1JKaGpPS05wR157ZmFNVXRjSk5TV2Fqdn5lXGdzaWVgVmNXYnBdTEtrWGNhVVRVc1ZMWHVkWl9rYVxaY2Vfd2ZtYnBpc25yf3V0moF3f4B3f3+GhHp8dYKEfpeFbnJ0fHp0cYSFj4GAeot1dJB/fIGVjoCFhH1+jIZ7foB2e6OlinmIhoRrdXx6dYOBi3lvhXN5hH2Bg3VuamhlVl1bWlpTYm5kW1hhc3tpaG1pYGJXX1tqgGlrb4Bna2BoeXhqc3R0boSBen99dXVuemhqeWpfZW5ogXaPhGdlWGJ3aX6He29pcGdmXVVYb2eOqHeBenyQjnl1cH9wc3Z6j4B4lXWGg4CFiHZqcnZnaG5bbGRdbXNfZ2FqeGh7bVptgnJzam+Afnl3YXeEhHePhHKIcW95f3FjcGhccHhkcXSIfHhjc4BwZ2p5dHJseHd2eGSDe394dnBkY2NufHxra1VoYWVTSmtnT0dSa0VheGdhTVNxXEpNVFlla3d7ZV9tcWlkXVZgVm5uV0tTaFdlXlhOVWxUSlx5X1tfa11dW2NlYHpoa2Fvb3Vub3h1eph9d4CBeoCAh4V6eXqDfoGThHF0dH95dnSEiJB9gHyQa3OVgHuCn4V+h32Af4aCgIp7doSsn396iIiDa3KBeXWAf4F0boZufH9ziYBqb21kZFhfWllaVWJqZ1taXnWCaV5tbFxhVlxcbIFlcXR9aWlca3Z1Z3R3cm2Fe319eXVybHloaXhmXWVzaHp3koFjY1RlcGeChXd3Z2lqYFdWWWdjj6dufneAi456cHF9aHpveo18d49yhH1/f4ZuZHVzZGhoXGtiXW9vW2dfbXVkemhddIBvcWtxe311dWF0hYp6h4eAf3dydX91YXBtWnJ0YnFyhXx1ZXKAbGFse29qaXt5dnJmhXZ7enVxZGFlbXN+aWxUaF5cVEtyYlBGVmFHYnZnYUtUb1dKTFdYZ2t2emRlbnFmY1pXXVl2ZVVKXGNXZ1hZSVdlUUhieFpdX2xbXlxhZF5/aWpfbnR4bm9udoOXeXKBgHx/iIuFfXV1hnmHjH1zdXWCeXp6gouOfX6EiWlzloF6ip19foV6gXp/fIaIc3GProx7e4ePfWVxh3lzfHt1cm+FbHt+bI96YnBvYmVdZVZZWVZjZmtgXVxzhWhYcG5aXldaXGx7YnB3dm1iWmxzc2d0dXBshHl+gHl3bm50ZWl0ZVtodWZ2dpF6X11SZmZrg4J0fWJjaVxUWF1iY4+laHh0goWQeG1vemh4bnyFe3WJc4B4fHh/aGV2bWBmYF5qX11za1llXW9vYnplW3d7a25ub3d4c3RkcoOSfoeCiHp2b3J9c2J3ZFtvcWJxcYJ8c2dygGVebnZpZGd5e3Vub4J1dH1zcWJfZm5vfWRpU2dYWFRNd19RSllYSGJ1ZGFJVG1TSkxaV2lscntibGxzY2FZWVthdltTTGNdWGlTV0hZYU5HaXVYXmFtW1tfYmJdhWhnYW54eWxvanaBkHhtgn6AgZKHg4F2dIl0jIZzcXd1gnd8fX6Mj4B+k35wd5WDfJmSeYCAeHl+f3SIg3NwmaJ7en+JlHhkdYh4c3d1bHRvfmx5fHCRcl5wb2BnYmxUW1pXaGNtZlxccYllU3JuW1pYWGBsdmNpdWppXlltc3Fsc3NzaoV8fn98dm5ubGRpcWNba3JkdHaOc1tXU2VhcoB/coJdYmNeU1pgW2ORnmVycYWEkXRsa3ptb3B7fHxxgXd/c3p6emRldWhdYlpgZ1tedmhXYl1waGF3YFt7dmlpcm53c3J0aHCBlIKGfoR2cmpwfW1md1dca25icXOBenNnb35bYHBxYV9qcX5sbHV+c3F4a3BhXGVsbHphZ1NmVFdRT3VbUU9ZUkhjdGJgRlVqUElQWlVra2t8ZW1vcWFbWlhZbHBXU09mV1doU1RGWlxPSHJ0WF9jbWNYYGBhXYtqY2RteXhrb2l1eYZ7a4N9f4SZfIKEeX2Ibo+GcW93en10goJ8io6Cgpd0d4KThYGfiXWAgIFzf4Jxh4J1b6KXdHuGi4Z7ZXeKbm56bmZ4cHprc3ZyjGtedG5hZ2VrUl1bVWdhbGxaXHCMZE9vbl1WWFVnanRnYnRlZV1ZbnRtcHV1eWuHfH98iHaPc2Rka25hXG5tY3N4h2taVFZjZHh9fXGFXGNfY1RaYFljlZVjbnCDhYpzamh7b2Zzd3N8bHp0dW96fnVeZnJjW15WYWRZYXRlVV9gbWRhcV1dfm9oaXNxc3B0dWpthJKBiHuFcXJmbn1wcm9TW2ZrZnF0gXdzY2x2VWJya1pfb2Z9Zm13fXNzc2ptYFpkamp3XmZUZFRVUFRtV1FWU1BIZHNfYUVYaU5IV1RWbWhkfGlreGtiV1xVW3RkU1JXaFFZZVRTSFpaUE14dlpfZWxpWWJgXl6PbmFmbHl1bm9odnZ/f2yDf32Gl3t/h4GKfmuTiHJndIB7dYCCfIiOf4uTcnyKkYWHn4Z7f4aMc4GGc32Ddm6ljHOBjYt2d216jGBke3BmenN4bG1xdoJnZHtsY2ZnaFNfXlVnX2xvW15ujWhOaW1gVFZTb2dzbGZ4ZGRcWHB0bHF6eHJtiHt/dpx6eWthZWxtXmBvamVxeH5nWlZYYGx4fHtwg19iXmdXWF9XZJuIYmtxgYd9d2treG1cd3Fse2p2c25ve4ByWGpuX1ldVWJjWGRxYlNeYWhiYmxaYH1rZmtzdW5td3ZraIWLfoh6iG1xZXB9bXJtY1lhaWlvdIF0c19pbFNlcWRVYm5iemNxd3t2a3Btal9YYWdodFxlVWFVUk5YZVJPXE9PSGVwXWNGWWlNSV9LWG1kX3hobn5kYFReVF11XFRTYGZOXWFUU0pcWVBZdXVdX2VtaFhjYVtejnFiZ2p3cXNuZ3Z0eoNygYJ5h41+fImHjnpukIp0bHOCdH9/h4SGkYSVj3l+jI+HkZuEgHyMhHKAgXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fn5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2NjY2NjY2Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpKTk5OSk5OSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjI2MjI2NjY2NjY2NjY2Pj46Ojo2OjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyRbWZnZ2dnZ32FhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCTqWvra2tra6kn6CgoKClXiovLy8wLEiFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJFnX2BgYF9eeYOCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTNBqba0tLS0taijpKSkpKpWFRwcHBwXOoOBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fn1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkY6NjY2NjY2PkJCQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaPkJCQkJCRkI+QkI+Pj4iCg4OCgoKFioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkpKSkpKNkJKRiYeOipCSk5CKkIuLkImPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyLi4yMjIyMjIyMjIyMjY6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoeIhYmLhoiQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCPhoqGh4eFh4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkI+JiI6IhIaIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4aHh4WIg4qPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiY2Kio6Jjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Pjo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHV2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2hoZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUVAPjo7Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs8PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs9Ojc6PDw+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1c3F0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5ODk7Szs5Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBgIGAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz4+PD09Pj49Ok16Ujo9PT08PDw8Ozs6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEtJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDREE/Pj1ASEdAXnppPT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISktLTEtJS0pKSFZwb3Fzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VESD87QGN8e3VzeGw5OTw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BxcnJydHV2ent9fX1+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE5MPkE8PD0/PkJDPz9BQUFCQEVzYj9rhYSEhIF5bDs5ODg6Oz0/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISEpKSkxKRkZncG9xcXR2dXd7fH19fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkM/TXR6bYCAg4F7g35wQD09Pz49PkNEPzw8PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SG1vcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDRUBOc3WAfnuDg3yEhGhBQUBDQEA/QEA+PTw9QUVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQElyc39+fYSFhYWGXT5DQ0VAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVHRkZKTk5LSklHR0hLTUpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRGZ2gISFhYWHh4mCSkRFRENXdYaJin5YR0hKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpHWXmChYeEgYaJiYxhQEJVdIeJh4eGh4JXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExMYISHiIOBg4eIiXtXbISHhoaGh4eHh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUtJSUdISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTElkh4eFgYOFgIGBg4SGhYSEhYaGh4eGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSmyHhoJ/g4OBgYODg4SFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QDs5OTk9PT48PD1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJaYWBgH6AgoSEhIODhIaJiouMi4qJiouMiVQ7ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzU4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0V1hX+AgYODg4ODg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6OTo6Ojw4OTg5Nzc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09SV2tycnR0dXd5e3t7fH1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I5R4GDgIOEhYSEhISGiYqKiIeIiIiKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8PDk7PDg6Ojs6OTk5PD88PUFCRElKTUtKTExXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7PzxWhoOCg4WGhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUFCPkBCQEA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEBAPz9BPT48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhxcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQmCHg4OFhoWFhIaJiYiIhoaGh4iJiouLioqKi4qLXj5ER0lLSklGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURFRUFGRUZFRkZEQEI/PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFARERFZIiDg4WFhoaGiImJiIeGhoaHiYqKi4yNjIyLioqIV0hMTU1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AQEE/QkNISEpghoKDhYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlJSEpGREdISElFRUhGRkVMTE1JSkdHSElKT01OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA5ODw7PD06P0A+QEBDRkpKUGiDg4WEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSEdFSklESkhHTEpISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVbnF1dnd5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH9/f39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDk6PDg9Pjs9QT4/QEVJS01Wc4ODhISFhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIuLi4teUVFQTU5NS0pHRkNHSkdMSkdLT0xLSkpNTUxPUE5ISUtMT1FRUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkBCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBSExNUVd5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVVJSVFJPTEtKRUVGS09OT1dWUVBPUVNSTVNUT01TTFBTVVdSU1FQTEtNTU1LTkdHSkZGSEpEREVFQkRDY3B1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQ0ZWTkZPUVFVWXyGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOzpRU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLR0hJSEVGSUhJSElqcnZ5eXp5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f4CAgICAf39/gIB/f39+flRISklJR0dGRT8/QUFFQkNHRURFTFhSTVRWVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A+QFZVWVxkYFZZYnJeXVZdWlZFUVlaW1lfVFlnUlVWWFVUVlRPT01KTEpJSUxNS09NVHB0dnh5eHd6enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNTWFpaXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JWVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVxdWVhZV1JRTVBRTU1PU1FRVVJidHN2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH+AgICAgH9/f4CAf4B4eX1ZTktJSUlGQkRAQTpQUVFXWFBQT1FTVFRYWFlaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWFNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaW1hcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm9zdHd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUlVTVlRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlVTVF5aWFdXV3prWFpcXF5TUFBQSU5PV1ZYWlpkcXR2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUVFOS1JUUk1PWVFNTlFTVVVNUVNSUE5MTEhDSUhSVFVaXG1ydnZ1c3N3e3p7e3t9e319fX59fX1+fX5/f39/gIB/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lVUUxJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5DQ0NDQj9EUEJEQEM+QkhHVkBITk1HXWlQSEZPRkRFRkhHSEJDSEdISkdDQkFEQE9QTVJkc3V2dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWViXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz4+Ojs+QEA/Pz5rUUthRUZISUVCP0dMTUdNUVVJQkU/Pjw9PD09Pz0/QUNCPz48PUI+Sk1GVW51dXVzdHZ4e3x6fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXp4enx8eHd4ZEJAQEE9OkJDQUFEQlxdT3tOT09OS0xNT09RTEtMV05IR0BCPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV1dnV2d3l8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eYGVgXV5xdmteYGdrd29vbGpvbm5sZmJZR0ZGSEJBRklFRUZETVJQYVdSWFFQU1NSVVtPT1FWUE1JQ0Y+Ojo2NDg2OTc5OjM2Njc5NjxCPWZ0dXZ3d3l5e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01MVFRTUVFVT0xSU1RXWFRUWFJMWFlaVlhYVlhZXVdXWGhza11WYHRrYWFfXWRgX15ZVVBNT05MSUdKS0lIRkNRUFNaV1RUTVFTWVNcZVVPU1RRTkxJSEM/QTk5ODg5Nzg4NDc1Nzg1ODhHbnJ1eHh6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5OTkxKRlBQVVlTVE5KT09UU1RcVlJVU1JOTUxJSEhGPz89Ojc4NzY1OTk2NzY2NVdxcXR3eXp7fH1+fX58fX18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9KR1BQT09NUkpPUFBQTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFFQTk5NUE5UUlBSTElMS09RUFFSU1RRUk9MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjNAPmpvYVJSUUBGVFFQUVBRTlFPUE9MSkxMT1BOTlBRUU5RT0pMTU1LR0VFREI7PTw8OT1HNjY3N0RucXV3enx7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JDOEVOU11nU1FTQUdVUE9RUVBNTU5MSkxLTE5PT1FNT09NSU1MSUxLTEtHRkZFRDxBQT47QEU7PDg5VHFzdXh7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E/PD1BQEI9PkVIR0RGRklHS0pARkFBQEZIRUpPSFFSYVxRUFJOU09PUExMT0xKTUxNT05bVktNUU9ISkhDSUpMTEtGRkZEP0JDPjxCRj9CP0FkcXR3enp7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj47PkFAQD5BRElFQ0hHSUdJRUJCPz48Q0JBR0lETU9hZVFNT05XS0xOS0xNTExMS05OU2RNSkxSSUlJRUFISkxNTktHSUZCQUJAP0VGRUhES29wd3p5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNvdXRscHByb29vcnZ2clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPR0tFP0I9OTk5Oj9CPzxBQkJBRERHS0ZESUlHR0hDQz9CPz9AQT5DRUNLTlFUTEpJTVRGSUlKTEpKS0lJTE1PUFJQS0dDTEdDQ0pKTE1PTUlKSUdDQ0NESUpNTElac214eXh6e3t5fHZycHVydHl5dnhqcW5qbGxudHRtc3V7c3R4cm9ucW52c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxanFoZXFIS0NGSEhHSktJSkxER0I9Pj06Ojo7QUI/PUJCQ0NIRkpMSkVJSUZHR0NDO0FAQj5AQENFQ0lNT0dIS0ZIS0RISUtNSEpMSEhKTEtNXVJJSEROR0JFS0tOTVBOS01KS0ZHR0pNTlFOTGNuaXd2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkb0ZLQ0ZFR0RFRUZFR0NDQD48PTo7OjpAREA+QkNFRUlGSkpMRklJR0ZGQ0I7QkNDPkBDQ0NFR0xOSEtOSERIRUlNTk1HSUxHRUZJSUxOS0pIRU9JQ0dNTU5NUE5PT01MSUhJT1JRUk5SZmdmcm9zeHV7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lDRUZFQkNCRUBEQj4/Pjo7Oz07PT9DQT9BQ0ZHSkdKSUxIR0dHRkVDQD1FRUI+QURDQ0VHSElHTVBJRkZHS05PS0ZISkZFRERJSUhLSUZIUEtESk1MUE5PTk9QTkpKSE1SVVRST1dkYWFtZ3Byb3N5emdlaGhjaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NCQUJEPUJBPkE9Ojo9Pzs+PkBCP0BCRUdKRklHSUdGRkZFREJBQUZGQ0JCQkRFREdHSEZMUUxJT0pKTEtJR0hFRkVEQ0lISEtKR0tSTUNPT05RUE9PTk9PS0tLUFVXVlVTWGBeXWlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNxcmtrc01GRkVIQkJBREQ8QUFAQzw4OT0+Oj89P0I/QEBERkhFSEZGR0ZGRUNDRUNESUZDRkVCRUdFRUZHRUpNS0hRTUpLSEhJRUZJSEVDSUlKS01LUFNORFFTUVFSTk9NTlBNTE5TV1ZXWFZYXltdZGBoYmppZ2tfZGVmY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hCQkJGRTxAQ0JEPDc6PT47PjpAQj4/P0NFRkRGRERHRUNFQ0RFRkZKRUVJR0NHSEZIRkVDRkpKR01KTEtISkxGSUhLSEVLS0xNTk9SVE9JU1VUUVRQUU1OUU5NUVdaVlpZVlpeWlhhYGBgX2hlY2BkZWdnamloamZobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9yc3lNSEhHSURBQ0hFPEBFQ0U9ODo+Pjw8PEFCPT8+QUJGQ0VCQkhDQ0RFRkZHR0lGR0tIQ0hIR0lHRkRIS0lHS0hNS0pLTEhMSk1LSU5MT05PUlVWT0tVVlRRVFFSTE9RUE9UWVpZXFpZXF9fXmBjXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtJS0hKRUJFR0U8QEdEREA5PD5APz4/Q0I8QD5BQUZDRUVDSERGREdGSEhGSEhJS0pFSkhIS0hGRkxISEhKSExMTExMSU1LTU5NT0xQUFFVVldPSlZWVVNTUlFMT1JSUVZbW11eW1xeYF9hYGJkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd292SUpMSUxHQkVERTxARkREQjs/P0FAQEBEQUBCP0FDSEJFRUZHRUlFRkVJSEZJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOT05PTE9QUlVYVk1OVFZVU1JRUE1OVFNSV1teXl9dXWBgYWFhYGJkZWJjaGJkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV0c3BzdnR1dXd2dXV0ZXFza3BxanJ2b3dKTUxLTUdEQ0FEPD9FRUVDPUFBQ0JCQ0VBQ0RBQUVHQ0hHSEdGSkZDR0pHR0pGSUxISUpNS01MR0tJSExLTlFLUlFMU01LTk5PUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV9gYl9gZWFhY2luaGJpaGhteHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJycXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0RBQEQ+PkRFRkNAQ0FFRERGQ0NFR0NCSUVCSEpJSEhLRkRLSkdISUlJS0dKSk9LTkxJTEhKTUtaZkpkXEtsUkhPTl9uVWxzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmXGx0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj89REVGRENEQkVFREZCRkZHQ0RKREVKTExKTE1HR01KSEpKSEtKSUtKTkxNTUxMSUxNTFtzYmRwXmxsVU1OZnNdZ2VxbG50Z3BpX2FZbm5icHBia2pqZ29xdGV0bm9ccHVncE1Kcnl2a2Jga2VlbXhta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0JCPz1CRkdCRkNFREVFRENISEdERUtHR0xNTUpNTEZKTkhJS0pJTEpKSktNTU5NTU1LTk1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW92XFlsUVxtbVpxbWtvbXh4dHNpcFxgc2xxalV1eXhwY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hFRUVCQkI9Pz9GR0JHRElFRURCRklISEVHS0pHTU1OS01OR0xOSUxLSUpNSUtKSktPUE5OTUxOTUxcaGR1XWxxV2xOT1FtVVprXmtsdmFsZHRUZWNObVlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdnYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR3SU1HSURFRUNBQjxCQEJGREdGS0dFQ0NIS0hIRkpMTEZOS0xSUkxHTU1ITkpJSE5ISkpJSE5PTk5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF5uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRIS0hJQkVFRUFAPkNDQkdDSElNSUZDRkpMSUdGSk1MRk9KS1dSS0dLSkpOSUhKTElLSklISkxNTUxJS0tLU2tiWmleX2pjcnJaX1lqb19lZVVrX2NbYWJRYG1oXGpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3c0hIRklERURGQUBBRURER0JISkxHRkRHS0xJRUZKT0xJT0lMW1FKRkhIS01JSEpJS0tJSEpHS0tLS0dISkpMTExLSUtMTlRbXFRQVE1QT05PT1ZRT09RT09RSkpOUFFkcWlUWVdbW1xVWVtdWF1cXGNmYWFmYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzR0NFR0ZGQUVDP0NHREVHQ0lLTEhGREdLTEhER0lQS0xPS0xXTUlFRUhJSkhJS0hMSkhGSEhKR0dJRUZMSElLTkxJT1xXXk9cW2BeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZF1iWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHh5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRElFR0dGS0pLSEVFSkpKR0VISFBKTE1KTVNJSEVBSEZKSUtLSUxKSEZFSkhFRkdFRUpHQ0pNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOX1xeU1teY19aXWBjYFlfYltgXltUWFhaX15kYmJhY2VpZWtycG9wcG5vd4eGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklJREZLS0tFRkhJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRURERUFGSkRASktJT1tjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtRW19hYV1eY2FgYmJiY2NlWlJZVlVcW15jYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkNHRUJFR0hGR0hJRkdKR0hGSEtJTERDS0pNTUxMSEpKSEpHP0dGTkpLS01LS0tJR0hEREBEQUhJQT9ISUdPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUFBdX2FjY2NjYlxkY2JkY2ZYUVVUU1xYW2FfXl9hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1CQElGQ0ZLSUZGR0hHR0pGRkZJTEpORUNLSkxOSkxJS0pISUdCSEhRTUtLT01LS0lIR0VEP0VCSEhBQUZFRFRdWV5YX1lfW11VWFhQXV1RS0pXXlheW11WWmBSUV9fYmJgYGJiYGNiYmRkYlhPUVJSW1NcXl1eXl9fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHiIeFg4B8eFxTS0JBR0ZER01SSENSS0ZISEhFRktKTVBFR0lJS05MTElMS0lJR0RIS1FPTUxQTExLS0hJQ0VBRUNIR0JBRkVCVlVFXFRdU1ZfWE5UVU5aW01KS1VgYVtfWF9eYV1PWWJcYGBfYmNiXWJiV19fVFBPUFFYUl1cXF1eX2BhZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJUmNQRFdfSUdHSERGTUpQUEZKSUpLTkxLS0xLSkpHRUpNUVFOT09NTkxOSEtBREFDREZEQ0FERUFMSENMTFBPT0xGTUZHSUpIR0xMTU9RSUxPUFBTUExRU1JVWllXWVhYZFZPU1RQUE9OUFVUXFlZW15eYWFlZmNoY2ttcXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXkxHSFlNSEhKSEdOTFFRSUxKS0tOTlVOT0tLTEdHS1BTU09QT05PTk9IS0VgRURfTERmY0RNW0heXHNtT01WbVlMQ1BfVWxXZ0pdWFZeRExRVUxNVFZRUlRYV1RYVVRcVFBmWmhoZFlUa1RXVlVbXFxgYGFiYmJgZmlnbmxocnp8fX6BhISEg4ODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09USUtHYFRISk9KSU9NUlFLTUtMT1JVUk9PSkxOR0hNUVtZT1BQTk9QUEpLUH9RSXxZWXJzWFBtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlaX1ZVV39qdHV1X2F2X1hiXFxmW19hYWFiXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdJTEZSVkxLT0lLUlhXUU5PT01RVE5PUVBLTE9HTVBTW1pUUVJPUFBQS0haeF1UeGRoWVJUUXZndGxwYm5ma1FyT013bWpycHNycXJwb3CAXWV6dXhxcXpxfnN9a3V9YlJofGVzc29zc3x9b355b39yX2BgYmFaYWBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpQT01NSk5WXllVTFFTTllZTFNTUk5MUElRUlRZV1dQVFBQUFFLR2Z4bGN4cW1aSkxVeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/cGdvWHZ2anZ1cIBhc2h9aWx4fG9fX19jYlteYmRnaWpkZ2JjZGxscHBzdHNzc3lxcnhibHRncnl7c3N1eX6Bc3V6bnx9eXhybk5KU3ROQ0JFUFBJS0tKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSVNUVVhXV1BVUE9OUkpMcm91dXF1cWRoYVZuTHFwXkZoeVd2VEtoeH14YHl7c25hXm1vZFJncnVubXlwd2x2c3RxbG1cc356a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGVlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tS0tbVkhHRUdSUEpMTUtMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZVV2xPbmx7c2FqZ392VUtXa2h9bG1seGBbcHp7XmB6c2Nyb3hxaGR8aXJ7XVRLbF92dWtpdXt7bX54a3xwXV5eYlteYmRlZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtobG1yfGttaGt7dG1ta21PR0pLSEpISFJRTE5QTUxTU1JPU1NXUlZUUFdaVlZUVFRhYFFPTktUU1NRVlZPTkxNT1BKSFFOUFVMS0tTVFNSVFBWVVFRTlFRWFhRTlBVVFhYWFtbVVNTV1tXWFdaUFNVV1dYUV1YVl1VU09YUldXV1haYFtncl5bXFtdXl9jWl9jY2VmZGNjYlljY2ZmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0tMTUtKVFJNUVFQTFZWVFBUVVhVWVVSWl1WVVRXVVlYUE9MTldUUU5VU05QTUxRUEtKUVFLUU1LS09SVFJRUVNTSUhNTk9RUlFRUVRWUlhXXFdTU1BSVVVWVFpRTlNSV1VUWVZUWVVTUlVTVFVYWVdeWl9hXVxbWlxcYGNcXWJjZGdlZGRhWWBhY2FiaWhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkY2ZoUEpLS05PTE1UUU9UUVFNWFdVVFVXV1daVlRcYFZXVllVWFRRUEtPWFNQTlVQTVJOS1NQTU5VVE5RTk1OUVNQVFFTVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXV1dZW1NPU1VXVVRZVVdZVFJSV1VVV1xZWmBdVllfXV5dXF1gYV5bYmJjaGZlZGJYYGBiXWBoZWZkYV5fXV1eWlpfWl9nYF5dXWNoa2FnZmhmZGBiY2FQS01MUFFMT1RQUFNRT1FaWVhXWFpaWFhWXWpkVlhZWldWVFRQS09WVFBPVFBQUU5NUVFPUlhUUlFPTU9TVU5XUlRVVU9OTlFTVVVUVFJUWFZaXVxaVlZRUldYVltbVlBTVlVVVlhUV1dUUlJYVlVaX1peYF5WXl1eYF1cYGBfX1piYmRoaGVkYlliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST0xQU1JVWlVUUFBMUFdWUVdSU1NYTU9QUlRYVVVVU1VZWFteXVxbVlJPVVdWW1tXUFNXVVZYVVNYWlRTUVlXVlxeW19fYFVhXGBhXmBiX1xgXWNhY2hpZWZgWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFlcW2BeX1teXmFgX2JcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWF5cX1dcXmpxd3mAY1xbVlZYUk5PV1NOUVFQUlRSTFFUU1laV1VPUk5TWFZUUlRSUlpPUVNTVltWVldUVlpYXV5cXF5WU05UVlZcXFZRVFZWWFlSU1lcVFJSXFhaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2lkaF5cZGBhYGFjZV9iX1laXltcW1lYWVdXWltaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFpdXl1bYFxgVVxdaWpyfXNsaFxVWVdRT1JbU1JRVFJUVVRLUlZVW1laU09TUlZWVVNOVlJTWlJUVVRYXFdYWFNYXFheXVlbXlRVTlZXV15bWFFUVVhYWFRWWFtUU1ZdWV1dYV5jY15ZYFtlYl9kZF5eY2NhXWVmaWVnXl1kYWBhYmNkX2JeWFpfW1xbWFhYWFdbWlxgXVtbXFtYWlteVl5ZXVBPT1JaUFpVVVdWVFRUXl5gXl5iXGBVXV5ia3l0bH1sWlVaVVFRU1xUVFRVVFZZV0xSWlZdW1xST1VTWFZWU1BXUlNXU1dVVltdWFtZVVpeV19eWVxaUldSWVhZX1paU1RWWllaVldZXFZUWl1cXmBhYGVkXV5dXWVhYmZkXl9kY2BcZ2RoZWViX2RhX2FgYmJfYF5XWF5aXFxaWVpXVl1aXV5bWltcW1dZXF1WWFddU09QV1lQXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXWBemhYWVpUVlNWXFhXV1ZWV11YUFVcWV5dXVRTWFJYVlNSVFhSU1ZUWFhYXV5YXVtVXl9YX19YXFZSWVVZWlphWFxVV1daWlpYWVpaWFZdXl9eY2JiZWVdYlxgZmJlZmRfYGRiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVpbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlRcVFZXWVdWXGBhYmNhZF9fVltgZGFfenVvaFpcWlZYVVdbWllbWVhZYFdQVV5bYGFcVFVYUFVWVVNWVlJTVVdaWlxfXlpfXFZfX1pdXlleVlNZWFlaXWJZXlZXWltbW1pbWVtZWV5fYGBkY2RlZWJkWmFmY2dmZV5hY2BjXmNjaWRkZ19nXmJiY2FhYF5fWFRaWlpbW1hbWFhcW1pbV1daWFdcW1xgXVZdXVNQVlpXVlpVWVVYV1heYGJhZGFkYV5ZWWFkYmBsZmheXF1bV1hYWVxcXF9bWVtiVlRXXl1hY1xTVllQVlZWVlZWU1ZUWF1cX2BgXWFdV2BeW15cW15YVlhYW1tfYFteWFhdXF1dXlxaXFhbX2FeYGRjZGZmZmJZY2VlaGdkXmNhYGVjXWZpZGVoX2ZeY2JjYWFgX19bWFlbWVpaWFlYV1tbWltXWFpUWV1cWmBcVV5iTVJXWVZXWllbXFlXWV5gYmFkYWRhXV5ZYWNiX2FgYV9cXF1YV1tbXV1fX1xaXWNYWVhdYGRkX1JYWVBYVlhYWFdWV1ZdXl5gYWFfYl5ZYV1dXlldXllYVldbXGBfXV9ZWV5dXl5hXVtaWVxfYl9iZGRlZmdnYlplZ2dpZ2NfY15hZmRaaGljZmljZV5iYmNhYGBfXV1aV1tZWVhYWllXWltaWVdYVlVbXV1dYGBiYnhLV1dcWFddXFxdWldcXV9gYmRiYmFdYFhiY2JgY2FjXlxdXFhXW11fXWBfXVtgZFxcWFpiZWNhUlxZT1hXWVtaWVdaWWBeYWJiYGFjX1xiXV9dW19eWVlVWF1dX2BfX1taXl5gYmNcW1dbXWBiYmNlZGdmZWdkXGZoaGlmY2FiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXV1hQWFpdYWNmZnJrf0pZV11aWl9dXF5cWF1cXl9hY2JhYV1iW2JkYV9jYmJdXFtaV1hqcWBcYF9dXGFjX15ZWWNlZGFUX1pRWVdcXVxbWltbZGFjYmNgYmRhYGNeYFxeX19aWFZbX11cYWFfXVtgYWJlYl9dU1xfYGNkZGZlZ2ZlZmVfZmdpaGdkZGBbZmdeYWhoYmhoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ1dXV1dXV1dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3p6ent8fHx8fHx7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnV0dXV1dXR1dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3p6e319fX18fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx4xdTS0tLS1JN7fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmIjbG1tLS0tLhRJisrKyolYpKMjI2Njol+f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXjV5+Tk5OTnmXt/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIuRu8C/wMC/xEkUGxsbGxRdlo+PkJCQi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEg4GCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dn5/f39/f395d3d3d3d3eHl5eXp6e3hub29vcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2AgYGBgYCBd3Jzc3Nzcnl9fX1+fn19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dHR0dHR3dHZ3ent4e3h3dnh7eHt6eX15eHh5eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3p6enp6eXp8fX19fX19fHt7e3t7fHx8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx7fXp7fXt3d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHx8fH1+fHd4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3d6fHp7fX58eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en18fHx8fnt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5e3h6enl8eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYGAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChISCg4KHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYCCg4GChYWGhYaGh4aGhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OCg4SEgoGBgYKEhYiHh4eGhoiHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCg4SEg4ODgYOEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKCgYGPiIGBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/f4CBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYKBg4KAhJmRgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIKDgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoOEgn9+fX2Im5WFhIKEgoF/gIKBgoKBgoSDgYGBgYKDgoKCg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4SFg4GBg4KJiIV+fHx9foGamISEhYSEhIKBgIGCg4KChISDgoKBgYSFhIODg4KCg4SEg4ODg4OFhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+NjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAf3+Ag5eRhn2BfoKJfpKYgoKCgYGCgoGAgoKCgoKCg4OCgoGCg4WDg4ODg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUk5SSj42Lh4SEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9/f3+Dm56FhIp/gIR/gomCgYOBgYGBgoSDgYGCgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGYooeFhImGfn5+gYODhIKDg4OCgICAgoKCg4KCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgZCdhICAgYF9fX19hYWFhIWCf319fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDho6CgH+FjIF9fX2Dh4aDgH5/fn5/f3+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4F/gIaGg4B/f4GGgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoaGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhISDgH+DhoOCg4KBgIB/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiYiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIKAgYWEg4GCgYGCgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYqLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+RjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODg4KDhIODgoKCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYSCgoSDg4ODgoKCg4F+fX1+fn5+fn19fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeGiYiDg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaDgoKDhIKDg4SCgYKBgYGDg4SDhJGSkY6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhYCChIODg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GDg4SFhYWDg4WEhISEhISFhIKCg4GEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4GAgIKDg4ODg4KCf319f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYOEgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn2AgoODgoODg4J9fX5+gICBgH59fX19fn18enp6f4KCgH9/f39+f3+Afn2Af3+AgIF/gICBf3+AgIF+fX1/gIF/f36AgIB/gICAgX+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fn5/gH99f359foCCg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enl6gIB+fn9/fn58fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7f35+f39/fn1+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gH+AgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf3+Af4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXt6enl5eXmAgoKChIOAgoKBf4GAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGBgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f359fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDgoODgoODgoKCgoODgoKSkIuIiYeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaHh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhYSDg4SDhISEiJKOjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAgICAgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WGhYODgoGBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWChJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn5+gIJ8fH9/goCCgH58e4qCfYB/foGAgIGCgYKAgYGBgH+Lk4+Mi42OjYiHh4WFhISDgoKBgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpORjIyNjY6KhYaGhYSEhYODgoKDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKCg4aHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2LjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fXx8fX59fH19fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKMjIuOjYuKhoSFhISEg4ODgoKCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gH9+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CKj4yMi42LioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gICBgYB/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH57f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYOBhYaFhYaGh4aBhJGOjIuKi4eIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fHx7fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3t9e31+fn+AgIOHiYmJioiLiYWIkY6LiImHhYWDgoKDhISDgoKCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn1+fn19fH19fX19fnx9e318fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uLiYyQjo2JiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH59fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjY+Ni4iIhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH+AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiNjIqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKFhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAg4F/gIGDgX5+gIB9foB+fX5+gIB/gX5/gH9+f39/fH9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHt8fHt7e3x7fHx8fXyJioiIhYWFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fYmFhoWFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dXSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX18fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAhoKEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFg4ODhISDg4SCgYB/gH+AgX59fX5/fn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f36Af359e3p7enx7eoKEf4OCgoKCgoOBgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Bg4F/gIOCf3+Af4F/gH98e3t6fHt8gYB/gn9/gYCCgoGBf35/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH5+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OBf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fHx/fX+AfH9/fX2BgIB+fX2Af36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYGEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4KAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgYSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+fn+AgICAf4GCgIB/fn+Bfn+AgoKAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9/f35/gH19fX1/gICAf39/f3yAf3+BgIGAgH98gH99fn5/f31+foCBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhIOCgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gIF/e4B+gIB/gYGAf32Af35+f399fX1+gIGBgH5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4eHt4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHJ5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH+AgYB8gH+Afn+BgH9/foF/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+gYSCgoOFhYKCfn58e3t8fHl3fHl3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFycHh3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB/f399fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGBf4KBfX6Bfn6AgX+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/gYF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHt7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg4B/goGEg4OEgYGDgIKDgYGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/foCAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31/eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICDgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYB/goGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fX96eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGCgoCBgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoWGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH+BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3x6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfoGAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fX18gX56fHx9fXx6e35+foB/f4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhICEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4SDhIOAgoOChIOCgn6DgoKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoKCgoODgoOBgoGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fX19fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+ChIODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4SEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+fn9/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODhoKDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgH+Bg39+fnx+fn1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISDhIWFg4eGhoSEhYSFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhYF9gXWBeYN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WCgYSDgH99fX59foGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhIOFhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SFhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBzgoN/g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9gH99gH+Af319fHx9fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYGAf3x/fXyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WEhYWFhIKGhoaFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fX+BgH5+gYKAgIKEh4aDg4aEhYWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYqIhoSGhoWFg4WGhYaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYaHh4iGhIaFh4aGhYSFhYSFhYaJioeGhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWEhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFg4aGhoaFhIaHhoSEhYaChISChIODhYODgn2Af3t7fH57fHx9f358fH59gH99foB+foB/fX18gH1+f35+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhYWDhoaFhoWFhoaFhIOFhYKEh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fnx/fn19fn58fXx/fH5+fH2BgH18fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoSGhYaHhYWGhoWEg4SDgoOHg4SBgoSEg4GAgIB7e35+fHx8fX18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaFhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeGhoiFhoWHhYSDhIODg4eBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4eHiIaGhIaFg4SDg4ODhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYiKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhIOFhYaGhoaGhYaGh4eHh4WDhoWCgYKCgIOFgoN+gYGBf4OBf35+f31/fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFgoGCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIiHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFhoaHhoaFhoaHhoaGhIOEhYKBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4iHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYeGh4SGhoaFhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp7e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhIeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiFhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhoKCg4N/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfoCCgn1+f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYSFhISGhoeIh4WFiIaJh4WEhISChYOEhoKDhYSFhoSHhoWFhYaDhIWEhYaFhoSDhIWFg4WFgYCDg39+f4B/f4CDf3uAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp7fHl6ent7e3x6e3t7e31+fX2AfX18fH2Af318hoOGhoaGhoOEg4WChYGBgH9/gIB+f4CBfH5/f36AgIGCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWFh4aFhIaHhYeFhYKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SDg4SDhYSAf4KCf31+f35+f4R+e398fICBfYGAfX2DfH5+fX1+e357e3p5enp5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SFhYSBg4KDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn99f4J8f399fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZLPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU1NPU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vKysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fb29vb29vb29vb29vb29nX19fX19fX2NfW19fW19ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0j4yMjIyMjIyMjIyMjIqguri4uLi4uLi4uLi4ubCKioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7s6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFpVVlZWVlZWVlZWVlZSeaejo6Ojo6Ojo6Ojo6WVU1JTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0dLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpZ5fWVpaWlpaWlpaWlpaV3yopKSkpKSkpKSkpKSml1dXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzdDS0tLS0tLS0tHR0dHQ3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaqjaGRlZWVlZWVlZWRkZGGDrKmpqampqampqampq5xiYWJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Ozs7Ozs7Ozs3Nzc3Nzc7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Pzs/Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzMzMzLztLS0tLS0tLS0tLS0tLQzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7O0NTSz8/O0NPQztLU1dTQz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX19bX19fX19bW1tbW1tXW1tbW1tbW1tbW1tfX1tjY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Oz8qWpdHP0rmPvtScgoSKxs/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8+cqp2s1cCUsJyxlri5r6HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q/QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DLlIianM6joIuRw5N9fq+w0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEI6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0b3ImZm7moedutTSzZ6ew9DPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Sl5SgvpmQn6DS08CgoNDP0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Ts5vEm76pr5GhudevoqnU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0c6NkKGsoJqtm6nYo6G61NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NHL2qiboJqmxZii0Z6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Nzk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT07Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJjqWan6+enJubrcefodLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NDc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HKu6Gmp5zPpquknsW0pKbW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09OekI221suSkKfXuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0rrE1dHUy73V0tHC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLV1NLS0tPV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87OTg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VFQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqY21nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW2tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQEJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampuam5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cm5ucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9bXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVWJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipKmnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSmoqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaaupqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6KvqqqsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustq+zsKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaioq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYW1odWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCxtLW2vLy+vLy+xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsLDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb21ocXhueWppYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbDxMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ3c3hmZ11kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/KxsTDw8HEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpnXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMnIyMnHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraequ7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBx8HKysjGzMrNxcbFw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVvc2JdYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBwsO/v77Ey8jKy8i7usjHyc3Iw8jJycXFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVnZGplYWptbm9eWVxWVk5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbCubvDubi5u73Bx8HEyMbHycPFxMDEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmZjWlpaXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba4tLS1v7u9wLm+urq0wLi1t7Kuury2x9S5y77Bu7/BvLvEvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYh9cWNgYmJnamdmaWVpXVZWVFlPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tbGwtbe1u8G4vrm/vLy3tLevrre1t9PAmNS7v7y7w7W6x7i2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2hYWE5LS0tSSUxIQzk9OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8t7u9wcS5t7e2tbm5ubrStIy4w8LCvse3ubitt7W4urS4s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+HfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2kr7C4u7K9vrvEtrW4trjAwMW7zaiElcLLycbPwsC4rrW1vL64urK+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG54Y2diW2NRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD8+Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuro7G5vb6yur68xbixuLi2w7m/w8SfhIu5yszO0czKxLW6wMPIv761v8G/xsa/y8bDv8G8wMPMysfFxsC5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmBhTkhNP0VAP0RDPDs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0vMK9zcS9u8S/ubGVio56iJWtl4WMrsbJyMzLzcrGwsTLzsK8ub25ucDDv8jGxMHBv8XAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qIem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPz9BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLW8trq8xsjbwrW/vLCManFxWGJmeImKjajBxsLHy8jBw8HAycrCwLu6sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gXptc3hzZ3BdW15cWVFFRENNSUFFPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7y9utKywcm2tJJ0eWhifmlbWlxwio+pu8G9vsbAucC8vsXEvb25srCuuLe/w8fDxLy9v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG5pW19gWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnBwLfQtqbGto5nUm5uT3OLf3deWX6Ssbm3uLfCurO7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9lXVpUSjw/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+2ybSWsaFnWFWLcFNdeoKHgE1omLW2srK3vrmytbK8uby2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZxbF5iYFtdT0hBPj1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u8ayk56FWFNnnGZSV1eSqX5YWqfDubOwtrq1tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybWNcZlhcXVJOTUE+SUJBSklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6r628s7i6t7vPuZiTclJljnxmVGJtpb2GY1N2nru2sbS1srSvrLu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxCRk5GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5ura5u7W1s7W5x76gkmRSi5lyenmLcoKSdXB1baLBuLO0s7CxrbC5uLa8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jpKOhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmZ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+yssC+rJxWXpTElYGYkmZ1dXaAfn2vv7ixrLOvrqyutraytLWvqqSem5ycnqionqCoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKqrn6aim6OclZCMj4+Qk5CXlZaYn56empiml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR09NTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6Wsqqe9ybWkVmSFk35pdGxnY2ZrdXFwkK6zs6qytK6qq6+wsrOupZ6SmJSPmKCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6WpsaOlqJ6gnJWTkI+RkJiQlpWYl5+Ym5mao5mXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01KSEdOUk5KTkc8RUA9Mj83NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaKftM/ArF14dXh0ZGlZUE9TUldXYHeGqbWur7O1qqasq6KcmZSOkZaXmZmcoKKinJ2lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmpabl5eYoZ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHl5YGJSVWBJSUpLU1RJUlBMOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6XnqWenqnNzZlvenZ0Y1NNVEhQSVBNTFVkZ4i1sLCwuKymoZydmpSXmpqQjpGVkYyOjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKwtKmxr6KZnJ2eoZmbm5qYmZuUlpuWmZyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVbU1pZTVFKTk5UTFNMQTc+QjY4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpyim56kyrBoamtzYlJTVYV1alNPSkpRVlljp6+trK+nn56ioJeRk5ugnJmXkpOfnKGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7issrSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqOhoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFJVSEZVVkpCTEc9S0g4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnZ6amZKZnpuhoayYeG5rYFRMWHqqsKBsUkhFR0xRVo2rqqqppJ+fmZKSk5iYlpaVjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLa9s7O1oqyiqaiyqauop6iamZ6aqqefmaegn5+nqKWkn52qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JXTkpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6anKSgn4htYFVQUVui3eDDjXBbS0RARGGWsK2pqqWfnp6hop2fnZqcnJSTlZSenpiUhZ2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsO8w7u3s6mzraqztK+zrqquo52rp7ayrKKwpqGjr7GtsKSlr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHFra3VycGhXW1FFVEhESU9IPkVBNEZIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJqfoJqfn5RzYldTVFlts9zGsKusjG1VW4GssKajo6GgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr7HxsK3w8nJwsHGvrq0urq0u7ewtbKqurKuu7e/urqqt62rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9eXFrZGhveGpkWltGS0xFRFNMREJFNzo/OzU0OTk3OD4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbKyuKehoauqoZyeoaGdm52JX1NRVVluh7XFs5Se2Mqso7CsoJmcm56emZeXl5KMjpeXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXS083T0NPTzMrCxcbGysjOv8jRzMfFx8XBvMPBvr++tb6zrb+/wsPHxMfErr64sri8w8HBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeHRzZWJncm9mXlpZQ05MQ0VQSURDQDU1NTg6Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopKisraqgnaOfnJ2bfFNKT1Jng6K2sqWJrcy7sayjnpyfmpiWlJKUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K0tfR19LU1tPTyMzHzM3J0s3O083FyMnKwcbLx8jJxr/Ds7PIxMvKy87Fyr++v73Bx8TMzMjJv8O/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ0dmhjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2hpXFORU1Vd5PFyq6co7GpopydnKCkoJ2alJSVlIl8d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HT1NTTz9HD0NPW2NXW0svJztHLxs3RydLV1tnV19PW2M7Syc/RzM7QzNLPv8jHysPMzMzOz8XGx7a/yr/RzcvPxcnIv8PDyM7Mz9DPzcrHzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdm9jYGVyYl1SXElKR0FFSEk+O0E4PTQ1ODU7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWfoax4TUlOXoS329W4raqalJefm5ugoZ+bnJmViXdpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTOz9XU1NHRzNDO09fW09XQz9LT0cnT0cfQ2NfY0djS19nV1szPz8nN0svO0MDGwsfFzs3R0dHIy83AyszF087MzsjEycbGyMzK09PR1c/SzNPBucWxpai1rqeaqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1JNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpq63qKu319TV2dnRztC/vMzJtr6upqqooqOzi1tlbYm318avpp+XlZeZmp2gnJmcnZN9cWVjY19fYV9fYWBfYGBfYGZtcHBua29yd3ebzMDS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHG0dTK0NTV1s7S0NjY2NfLyM7Eyc/MyszAyb/Hyc3Oz8vQzc7Lzs7Hy9DQys7KwsnGyczKy9HSzNPR0c/Qyr3IubCuu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHp1b3Bua2FkbnBhV1xaSUZGRE1XRTtAPTMzPD04Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HAsKmsramjs5t4iqfO1LObm5WTl5uenp6clJaYlYhrXl5eYWRiYGBhYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHUy8zQ0dPKztHV0tXVyr/JwcXMwsjJwszDxcjKys/KzczQzdPLxsjPzMjHy8TGwcXKzM3P0cbQzs3NzM/Fx8C4ub3Dw73DubOyvrG7w8S1qpilopmWkZWVkouUjZqRlJSPj5SCiYV5cHJrbWdgYHBoWFhoVkxGTElQUEI7Qz47Njc6ODk6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXEwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWvtKigq6OIjZK41KyUjY2YlZCUkpGWlpaQi3xlYWJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytLIy87NxtHSz87M1MrHy87Px8fP0svQz8W6xL/Gyb3Cx8nOxcLIwMfNyMTMysvPyMTE0MjGwsbIxL7Ax8zMy87Cy8vIx8zQxMXHu8fDycjCz8G9vL+wwcnHub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd290ZGtgXmZwYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLrNzcbQ1dXZ2tvY0MnPz9HTyMK2u7uto7WSaICIxK6QjY6Xj4aDhISCfoWFf3NgW15eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsnGwsPAw8jKycjKyMHFzMbIy83JxMLLycHCy9DEy8i/ucG7xse+v8bPy8O/w7vJx8i7yMbFysC9wsvGxcS+xby8wMPFzMXFu8DKwsXH0sTAyL/KycbIxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhpZujoJuUe3ZzdGZpWmFubFpbWFJETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcO+sa+5gmJ+j7aPipKXh3qAhYaAdnh1cnBfW1tdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsLa6srKzsrHCvLy8urjBwcHEvr25vb+5xMrFxsK9xsC4u8TJv8LJu7e7usXDv7zBzcPGvb21wb3Dur3Gu8K6s7zFxMHCtr+1tb2/u8zDvLW6yLq/vsvDwcXCxsnGyMbQxsLMx7LHycPOzcHFw8C9s7ewsqeoqLmwpa2wqq2slHl2d2pkZ2Bob2NWXllKRkpGSEpBRUJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfFwsTIztHKysrHzc3O0cjQxtXU1tfNys/FycXHwbnFvausrm9ldo+Ti4iKhXmAhoaAfoR8dHRjW1xdXmBgYmNhYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLW3tLOztLq0vbG3sLWvsrvCvMHEvL+6tbO6vsC4x7m0u7bBwry4vcbBw7u1rrK2ur+0xLe7tau4vb2/vbG6tq+2urPFvLeuu7+1t7TFvL7DxcDDxcbIy8XAxsa7x8u/z8rHw8bCw7fDvb22ub7Hv6y1urW3to55dHhmZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy83IxcjNzNDMzcjKyMrJysTPzdLPzcXHwcXAvrm4ybaqr6NlaXWMj4aIiXt4foaGd3iCfXRpXl1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaGZqbm5yfKTHv7i4tbCrrKeeoqqnnquts62pq6m0rrawsqmupqyyvLq2w7m6urGrtbm7tMK6sMCxvry7trvHucK2raqosLHAtri9r7CnsrO0u7yrrbWmrrWvu7Kwqbmwrbuuu7i7wL+9ucK/x8PFwbzGwcfLuMXHxb/Gw8O6xMbCu8bJzMuzucK8u7OIc3Z2a2lhYmxoWVdXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXPx83Bw8a/xMTDw8rBycq+wLzBurK0tcSvqq+bYWx/kYiOj3t4foqGenuEgXduXl1cXV1fYF5fZGNiY2NiYF9dW1taWl1aWlpaXGRub2hmZ2lrbnKBrbmwta6mpaenmqCkoJqcpauuo6eiq6qsqrCjpp+qrbW2sb25r7evqa63tLS8uLS8r7e5tbK7wbLArqWpoquxsrOovaqrqKusrbSzpqitoaSvqbKmp6iupai3rLGyt7q6u7K8vb++xL+1wsDHyLe/wMS3xMK/u7/Ewr7EyMzKv77DwMCph3N0cmppXWFvZFdWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HLvrvJtr3DvrnKt8HDwbS2vLaxr7W8rqipl2VviIOIi4B7foB+eHR/fHN3ZV9dXFxeX2BeX2NjYWJgYF9eXVxaWFpbW1lYWlxfZmtmZWdlaWtvcoWqpayloJyipZSepJuYkqGjqqSin6Wlp6WtoJ2bpKassq+2t6ewq6iqtKq0urG2ta62ubGvurqxtqSgpJ+msaerqLmqpKeoqKeyraCnpp+bpKasnp+npKCgsa2trLK0srSwtby2u8HBsrq+w8GyubnDs8C9v7W4u72+vMLHxMLDvsDEoIN4cGthZl9rb2BUWV5ITmdPVEdFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9taCelZ2hprq2q7Ozu7PEz8nLwsa4t8fBzL+4ybe7xbizxLezv8CstryyrKWvtK2gopRseIWGhoF8eXVzb21ramlxaV5gXVxcXF5fX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1viJ2poJeWm6GWm6KYlo2eoaOnm5+fo6WiqJ6bopufq7CssbajqaqprKyktLmtt7Css7WusrWusKqfnZ+korKkpqm4raKmpp+orKqZn6CemZ2fpZqao5ybna+pq6eqq6ytsLK4r7i5u7C2u7u6q7OzubO9tLaxsbW0v7a9wL3Dwbu7vZeDe3NrX2VeZGRYVFddSVdcS1BHSUlGQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vEw8++uce4t763ssG0sbu7rLq6saKeqaunl52QcX+Fhn94cm5wbmtiXmJmZlxdXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZWVmZmhpa3KNp52UlZWbmJuilpaRnKKiqJ2bnaWmoqacoKCamK6ura6yoKWiraunobWxsrKsqK+yp7qzprWgop6bo6Kto6Kptaqio6adpqajlpiel5manaCal52cnJusoauno6Smrauzs6q0sLKqsrm0r6mvsrKzt7Ouqayusriwura5vb+3s7GUhXl1ZV5lXltZVlNaVUtbUUtJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+ynaWjmKWxwrW2va20uMLMyMbAxbbBv8fOt8DEvbO5ubK/trG4uq2yta+fmqOqoZKZjXl/g4R/eG9xdHFoZmRoZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqKclJSQlZeXoJeZlZignqGclqGiqaSfnqmcmpqrp6+wqpujpLipoJ+uqLaqpqetsKS3sKS3oKKbmZmqpqCarLiwoqGknKKfn5OVoZSVlpuYl5aXnJWfqZ2po6Gdo6qqsK2otKuqpq2ysKWqrrKxsK+ur6anp7KusbSvvLS5t66jlIF5dWReYVZZV1NSVEtNXkxPS0dHTExFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri9rp2np6Oqu8C9wLmutLjBzMfFwsO9xbfIzLLBwsGtvLu1u7y1ubmwsLGqnJmhqZWQiYyBgHx3cWlscnRwaGhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2JjYmJjYmNkZmqBlpOVjJKUlJuZnZaWnKCcoJahoKalpKann5yfpqCqr6afoqS3qKGhoqi0oqWopbClsK2rtJ6gnZWVqqGhlK2xsZ+io52emJuTi6GUkZOYmJKXl5iXnaabp6GimaOlpaukpbCnpaOrq62mqK6vrquoqqmzpaasr7Sxrry1sa+uoJJ6dnJkYVxaXVhOTFJIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxuKyepaett7u8wcW6sbm1xMnJwMPGxse2xsSzwr/Fq7e3vba9u7u2s62tqJmYn6OLiHOJiH52bmNhZmloZmhqZ2ptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVVJUUlVgYF9gYV9gYWNkaYGUk4mRj5STlJ2UlZekmaCXnKCloa2mpKSjo6KcqqulmZ+lsaqgoJ2lq52nop6trKmprayhoqKVmKObnJCrqbCbn6KfnpeZk4qekY2Sk5aQmJiTnKGinaSgoZWgoaSmm6OrpaKkqqSrrqWtsqmmpaamtKapqK2ztbS5uq+prJ6LcnBvYFtXVlVSR1FPSFpbT1JJVEtTTEVGSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7Kwq7Ktnainr7m5s8DIurXAr8XIzLrByszItcm8sb3EyayxuMK1vMG8tLWrrKaVmZubh39yiIN7dGlpamxnamtta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV1eXl9fYmRtjpCEkYeQkY+Zk5WTnJujnJugqKmrqKynqKWjmKSupJSZpa+pn5uZm6Cerpmbq7OgpaafoqOhlZOblpaSqamtmpyfoaCalJCMmY6MkIySjZaVkJ6hoKOcm6OVm6GjoZehqKOiqKugq6+jrbelo6OirK2qqKuvsreyvbWzq6+YhHNzaFtYWFJVUUVYTFFbWE1UTlBMUFFJTklCPD8/QT88NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62os7auqaevrpupqKy3tqy8yru2v6zLxsW4wc7PyLPEure7w8ixrLi/t7y+u7S3p6qglpaYlYV5dIB2d25taG1ubXBnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVU1NOUFFZWlpaXVxcXl9gZH6NgYt/jJCKko2XkZeZoqCboKuqpq6sqK+jqJqfrKGVlqSop52XkI+anq6WmKiqmZ+dlKWgnpKQkpGTlaeqpZqZmZ6elY2Mi5OGiI2DkIuRlZGgnqGjl5WflZqhop6Um6Wlp6iooLGwprG8p5+jrLSrrqewtbC5tcCxrbGrkH1xcmJWU1ZOUklGVlBSUUxMV01KTE5SR01KQUNGREM+QDY1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OsprG3qqaisKudqqepsrGltsa0ubqzysW5usHL0Muxtre8vsHDsbCyuK20tLu0tqWknZyXlpKBfnZrZ2xucW5xanBrZGVnZV5aWVpZWlpaWlpaWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domNh5CKl4mUlJibmZ6pm6CqpqWrnaeZoKWbk4+fo5uXl4WEkpujj5SjnZaWloiim5uTi46KkJqkp5yVlZeckZGHlI6LgYuNf5CKkpKSoJqfopWTmJiVoqaZjJmkpqimoZ+0sqiyt6Gcoresqq2ksrKltby1q6uxo4l4cm1dTlFRTE9DTU5OUEtGTk5KSk5NUUlNSkFHTEhHQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjg3Njo5OTk5ODQ5ODhBN3e2p6S2saWno6mloKilpLOqorLDtbWys8bGt7rDyszGs6y5vbS3wK+tqbGepq66sLChm5udlZOGeoJtX19mcnB2cWluaWVnaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhZWFtdYW9zdnGFiIKIgJGEj4uUkZSeoY+bnKOho5illqKblY2HmJqMc42Dfo2XloaRmZCUjo57mY+cjIKJf4qYn6KekJOYloWNgpR+fnSJjnmQh5OPkJ2amZqRlZCdjqKjjomaoKGjo5uitK+sr6yfmKW4pqaxobGunLC7qqmvqpmCdnJiVU1ST1BNQ1NOTFFNQlBRSElOUk1ISkpDSkxGS0s8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTE3NjQ3ODk6OjY1Ojg3QTd4t6GjtKmmpaijpqWmpqazp6a0wbivtLDJxLe5wc7FvrOsusGrrcOtqKKnkp2mt66lopCWl5OPfXd9ZVdWX2dmaWdobmNqaGdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5YcpCDl4aNnJeLlJCfmJ2VlJaUjpaJgJOJXztXb3yLlImAjJGMkIaGc4qFloF5gXqFlJ2Ug5aOkZCDhn2TeHFvhY19iYGRjY+XmpiTio+JnIefmIeIlp6aoaCXp6+praion5ats6Kmrpmsq5intKKpraOTfnJtX1tOU1JWTERUSlBNTEZOT0lFTFFNS09KSU1PRklJPDc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepp6OpsKintMG5sLWwx8K3s73Pv7mvrrXCp6rFqaOdmYOUnLGknZqIlJCMh3xzdV1RTFJVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1waXuCdFBCQH+VkZF9iZSNhIqNm42WlYmSiIWVhnmIf2BKUW54ipGEfYSNioV/f25+f5R3dXV3hI2ZcFGNiIqGe354lHZod4aIfoqIlYqNkZKWi4SKiJSEmoyChJKalp6clKSjqKmlpJ6bsKqhpKSRpqqWoamcoqaoiXVsZV5bSFFRUk1JVU1TSUxLT0lIRkpOTE1US1FQT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6KnnZ+ir6GnqKWnqK+tqrW8tri3s8G7tqe5yLi2qKi1tqqyvKaelo5/ipSpl5iNf46EhH13cW5YTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+HgXyFjJOBkpmLj3uGj4B2f3hzbnVwdI2OgXp+iquFeXpodnuOcHJteIGLjZJ4eoB7gHZycpJ3Z3WEhISEe5WJiIqMi4B/hIuMf5SDe4GQmJWclZGfnamen6CdoKmln52Yjaekk6Cflp6epIByaGBcXEpWT1JHSlhST0pMTVJKSkpMUEhMUUxSVExFSEE8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3OTU2NzUyNTI1NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpijoZicn7Spr6mlraywsaq9tLK7uLa6tLGft7qyqp2drKmosq+hmpGOlIGOnI+UgXiIen13cHBpWEtISEhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnWDfXlnd42XmI2PfWh5gXZ4gImPfYSYkoFyh498d3tva36tfXOQi397hpKBfX90ZnZ8hmxvaHN8iYyIgGx5cX1wbXWPcWlxgH6OcEOLhIKDhX93d3qLhX2Me3V+jpKPmIqSmpujlpmdmp2eop2WjYqlm4+el46WmI92bm1lYlpXV1RRSlNVVE9QTlBWS05LTk9KUU5ITk9LRUM8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ+WoKavrK6rqKmwr7GrvLisu765s6ynm7CnrJuPlpylqaSgl5mPhZJ6iY+MjXhyf292cWxua1hLRkdFQUBDRElMTE1RUlBRU1VUVFVWVldXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTk9RVFheZXBybYinqsB+dXljfHhvfHmIkHp9i4ZvbYySeXR4amqAgnGWkYuBfpaASZOYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmltcH9zjYmEhnp9fnt2b3RzhYJ5gXhwfI6MipSDlpeYmpCTlZaZl56XjIOJn5GLko2GkJZ+bWhtbm5XVVdUUlFZT1JUVFNYVU1OSE5KTU5KQ0hOR0U/Ojg5Ozk5Oj48OTw7Ojo9Pjo4Ojs5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp6lrbCirKqota+urLS/qrvCv6aimZWkl52NhIuUoaGYmJGTi3OOeoCGjYh2cHZtcW1mbGtZTkVGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX9wbX96i4l2gYiGdGyakXRzfGprnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtxgHxncXF7bpONj3tzfXxxcG51bYJ+d3l1anmJgoiJg5aTkpCLjZGUlI+XjoB5iJeIhoqGgJCHdmpqbmdkV1FaV1lZW01QVVZZWE5JSEVKSkhGQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCs1Nzc1NDc4aU84OzVukoiakZmWpKiunrKfprqvq7KwwrG7w8ealo6UmYuNhXmEkJiUjZCMj4Zxh4J0h42Ie3FzcW9wZnFnX1RGSUM/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHJ8eGx9bXKDgYWBeoSGhnlyoJVzeIBzdZSHNXGdqJ2OoaGEooV2cIZ8h3xzjK2NiYBnZmJqbnJtcIN1aW9YdXCOmpJ3bH97fW1xbXCAenN1bmN2g36GgIWQkYqLiZGLkYyLj4N1eIuPgH6DgH6PenFwb2tfWlxdW1lYYF5STltaWFdMSEpFSkc/Q0FCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoeWkZ6kp56vlaW1qq6xrsGyu8HGlo+MlJCAiH1ugZCSiYOKh4+FdYKEbJWIiXx1eHhtd253ZGleSVBHPkA3NDQ4Ozs8PT5AQkVITExMTU5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8foWDf4x+dqKZeX6GgYWZhJucYYaqn52Lg5COeneIfomIjXOKl4+Eel1kcXR6e3eKbGdqYnlvhY+Cem6Bd3SEenBzendrbmled4d9h3yIh4+Ai5KXg42FjYd9cYR/hHx1d3t9iXVvcnNlZl9bW11TW2ZeV1FVWFtVR0pKREtHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyMeIp/lIySnZ2fppGgq6CxqK/AsbrFupaOkZSHeoV2a3+MkYJ9ioSOjHiDgHOhhIt9fYF/cIF+emh2a1JXTEBFMjExMjY3Njg4Ojw+QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxxfI+Men2Jh36Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkaiHgJiYipxzbXyBhod9jmhnaHh+boWHgoVxhIVHa4B3cXl2aG1rX3Z9g4l/iIWMepWem4qLiJF/enWLdnx3bW93fn9zcnFqWl1cW2NjWGZlW1VPUFZZUERMS0ZOSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFiJGPlpeSl6GdrKGmuK+zvLOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiX5zhHhfY1ZLQjYwLi8yMzEyMzY2ODo9Pz9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYGEgoWRk36FiZGBmpWCoKGXlZuapa2Tmruxp7vHw6iKjKGlj5SJgZF7coSen5Gcf3aFhYqPiJBqaG+DgHWNhoSLcYaCd4eAe3aFfW52dWeAlI+GiYiIiIehq6GWiY6Yf3uBiXp6b2dreH54fXFqY11aWl1pXGFmX1lPS05XUlFJUEpETkdDS0RDQURDQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnVwZniDe4CMgIGQj4uamqScoaymq6+wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOg4CBi4uCiY2Df4p/bHBqXUJBNC0tLy8uLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jaGemYSThYKPop+UmZKEioWPmJGWbHB1iYuBloyNj3aPhHFshYGKlpKDhYhyiaGWh5OJj4+WpbWpm42VooOHk4R9f2tqa3yAf4ByYVxiXllmalxra15XS0dPU1FOTUxGSVBDRE5GQkNFR0I+OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwgnB1h3F2koZ+l5aalJ+fnKegqpaTmJ5nZaSafoSSkXmAkoiQkn2KhZiSkYKAgIuNiYWQh4SIhXh4f2dNUj4vLi4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFSU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZuopqKZoZeilZyfqJ6pq5+orKmqtZerv6u2yMi3ydHPvpugcGmrqZ+ElJKGnKGampmnkZGIlaKamnd6fpSXkaGSl5eBlJ57dpWSq7OJjZegfZSenI6Tlpmkoqa2sJ2RmaiIl5COgYhsc3N8fnpwZ2BbX15hZmNgZ2dcUUVKS1BPSUpMRkZNQ0hMRkZDQkdEQDo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcHVgbn1hd459fJSOjoqfkpeelpyqmJ6qQkR9h4mHmI14go2Kjox7ioaPkI6Bg4CJi4qEkoWDhoiBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUlNT1FZbYaQd5WLo6eqtL24pa6srKeotKywt7Kyrbuxs76cs8Ssu8nLuMS/uKWjsLKsrauki5aYhaamoKKXgaaZjaKqqKSHhZOjoaCqoKSpjpyxi5Wjp7e7m6CjsJOjnaOekaSiq6+ts7WilaWqiJqJkoqVent+hH1mX2dbZGFdY2NeZmZeW09DSUhUT0ZITEZKR0VGSEFLRkNGRkE6ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqEdoGUhYiCm4OSkI2S2sidlnNWl4iPiJyPfIaMjoqJeoiCh5GOg4WAi4WGh5KGgoSJhoeHh3FuYUBFNjQ8Mi8xMTAtLCstMS8tND9EQU1VUVJTVVVXVU5bUEdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHHw6uzxbass8Czub62v7TBtru7pLjGqbbJx7a+ubSoo7StsbGcmpKan4mnr6qklXafpJehq7GzmJaqraiutbuyuqyvtaKxrLG1vLe1rrWgp6ijqJupsK2yuri4p5u3qY2ljpGToId5gYJ0WGBjVWVhYGJfYGVfWlVKREVMVVFISkpESUdFQUBAS0RBTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxbWlFjZFd6dXGClH2FhpN2hX6AjXu/u6O8grSUk42bj4SIj5KJiXmGgIyTjIeFgY5/gYmOhn+GiIWKh5F6eG5dVkBFTTw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFdQX1VJS0pBQD9HS0ZFRDs+QDdENz9CSkpFR1dUUF6Ppa2jsbTDtrjBzMm2u8S9s7PAt7jCtb+wuHSytKa6xaSwxrmxs7G0qKS1tqqxoKKWm6KSpbGtpa2sp6SYoKyzuqKpsrq1u77Mv8XFvb2zwre6uL+3ure5rK2wprGqrb6wvbvCwqyZuqiUro+YmKqJfoF7alZhYFdpZGhkVlpjWVZUSUdHTFFHQ0hJQUhEPj9CQktAQExDOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZRTEFMUldUWVVad2pwf4+EgY6FbnpyeYhiuKGZo4mVk5aTk5ONkJeSh4d7hoGNlYqAhICJenyLh4Z8ioKBioOVfXd5dWVPXGRHRUw6UWRhW15TRj47SFBEWmRRUVlYWWdaVGBgTVNPRUE/SUpIRUZBQEM9RTZCPkhHS0xTWlRdk6+4tbq5ycC7vcnMu73Au7e1vLu3vrW6ssZgdbOlsZqeq72qpairqqOisrWhq6eelZaemJ+upaenpZ6klKKnsLOnsrK8tsG908nK08bCxczCysPAvr2/u7y3tLC5t7fDusa9w8mwnrmqoqyPpai3iYF+cV5hYFxWYV5nZVJYYVZSVUlFRU5LQT5HRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFNRUE9RUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWhsbHGQjYWQc2xzcnOI1cC1maCNlZiZkY6XkZaWjoaHfYaDjJaLf4N/gnh6i4OHe4t5gYqCl390fXprZXB1WV1cUGVlYmBlZF1bWFdcTWRtVVJtbV5vX1hnZVVZVEpEQUtLSEZISEhIQkk5RD9IS1RUVlxaW5K5wLm9t8bAu7nKy7q2ura4ubO4tbSutraZZHWonq1wXqKsnJihopuknqullJ+fkJSPlpiXqJ+ln56amYOknaykqrCtt7C9udTQz9fPyczSzM/Oyse/v8LKvcG9wsDFxMXKv8jPtKS7sLWwm6y5vZp+eGtcX1tYXWBZYmJRW2BTUUtDQkVGRTxART5CSEJAQz06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEvMDA2OjQ3N0BJT0o7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaV9wl5KRlG5sb3V1iLOsoaGfi5mcmYyMlZGbkoWKin6Ih4yQi4l8gYRze4mDhnyJdIKKhpV/c3t4bG11e2hyZWlsaWZqaWhgZmlobVptdJetpLyIh2dbb2hdWllUSEpOUEpLUUxUUUlMQUpHS1BfX2JmaWGYt8ewubO7vrayxMe2sLmxsLuss7Gnqresjbannpunmk6bnYyOoJaRppillYqTk4mQiY+Qkp6boZiblJaHnpmmm6yvqK+ns7TU1NTW0cvP09XO08/MxcLK0L/KycvJ0sjNzcLQ0riwxLzEuqa2u8SigW1iW1tdV19XWWVZUFxXTlFDQkhFQkg7QUQ+QUg/P0I3O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OD05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2VXc5CQmINocW95eYOgqp6ml42bm5eLjZWRmo59iYuFjoqKi5CIfISCcH+HgYZ7h3KDkouPfXF4dWxxeH5xe214c2xogHBtY2ltcHlpd31+y7/C36dtY3huY1thYEpQUlVOWV5QXV1OUU5UUVVUXG5ud4Jylq64rLSnsLarrb3Asau1pqW4p6yuoay0o46xrpqYmIyRlJGEjpuBjaaRnImDi4SKiYSLg5SVmJeUm5Ccl5mZnp6rrKSnoaysztLV0c3M0tPU0NTRzsjD1NHIztLT09fN0tHF0tbGwM7HyMOpv7jQnXhtZFxhXFVeUV1aTk9TUE5IPkFGQkJFPEBCP0VFPj8/Oj09PTxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk+NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WGhYp3bXdwfX6AoZ6eoYuNmZOTjIuTj5aEeYWQkI2LioiRh3+Ce3J+gIKHeoV1hZORiX9vdnNsc3x8dnxzgXdxaoBycmlvcXp5cnu+y5p+jLGDdnKEdmhhal1DWlpbVmZkWGVrVFhdXGBjXWN4e3+LgZmqpKShoKGppqqxuaqmtKOiraKjraKnsZ+JppqUkpGKko6IgpOJa5WijZiEgYV+kYODk5asi5WNlZmOhZKQnZensKGgoKSkqMjNz8fBy9DT0dTTztPNxtbTzdTY1tbY1dfVydTazcnX1tHKrcTDy4lxbmJfX1dSWFJbT0pHSUlKQDs6O0VCRDxCRD5IQj9CQjs7OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTU7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV9aHN5coKJgZ2VnZSFi5aJj4qIjoePf3eElJmLjYiIi4l+g3hze32Dh3eAe4eRl4GDbndwbXV/dnh9c4V8eWyHdnRvfXaEdXl7nbWMPEGKxqV+jXxpZVZJQ2VjZmNoamRveVtfZmhrbmlugIOJkYudn6CdkJeYn6OjprKkpLOgoqWeoamgorGchp6SkpKQi46LhoOPhH6cm4yNgoSFepR+gqmVo4ySipeSi32XipqRq7OYmpunnKe9w8a4tsbN0tDS0MvSy8nUz9HV2tfX2NTZ2M3Y287J2trS1r/MzLR2dW1jXFlSVVBZVUVGSklFRT06NzlAQUM6R0VARUNBREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFZPUUpBSkY/MSooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGFxcXOGjXyXkZ2LfoeSgomGhYqCh3x4hZaXiI+Dh4aHeoR5cXp7hIZ1eoWOjZ16jHB8b3B6f3F8gXGDh4Bujnp1d318gnV/fIeIsHRYqcK2jJKBcG5iPV5ocnBxcG54d4JlaW9ydXhye4uHjpSSm5agloeMk5ugm5+qn6GtnKKamZ+lnp+smYuajJGSjYV9iIeDhYuOoJmTiIOHfm2ZeYSYhoiTjI6UjIV7m4iTj66qlJWXnpimrrW8qK29xsvIycvLz8jE0srU1tjX2NfU29fT2dvWz9va0dbI1cyVeHpoZ1pZT1JTXUhCRUlJPkE+PTc6PT87Pkg9QEFBQURBPj46ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmt2gIhxkZCbgHmAjn6DgoKFf4R8fISXjoeLfoaHgHeCeW57e4aBdHqSno2hdo91gnR1gX10gIRvgZCBb5KEdHyBhXp2hnuJt8akwsm3gZWbj3hwZU5lY4J6gXeGopCLeXl3e4N/fIR2bZSWlJWPl5CDiY+WmpeXppyYoJefk5KXo52Zq5aRkYuNkoOMhYiIgYWQkZ6cmYmFi4GFl3uIiJ+XkImNiouCfKGIkIu8oZiTl5mcqKalrp6ntb7AwLnHyc3Oxc3K0dbV1NnV19vU19na29fb2tnYztvGhXl4ZWhjX1JWVlVNS0RNQzs9PTw5Ojw+OT5BNj4/QDw/Pjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdIUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eop8foB/gH2Fen6CkYmEhXqFiHt1fXRufH2GfnR/kp2Rn4OSfIZ9eI59eYqKboKagHSYhX6BiYV8fpB6j6mPkMOgu4yco5x9iYR9iXKMin5zppqcmZSFe4+QiYRoR3GhpJ2Mi5CShYiLkZOVj52ak5WRl42MlZ+dlKGUko6OkIt+kI+Oi4SIkpaan5+JjJSRnZCCi3+mmYiFjoKGhICkhoqLuJidkZSWoaegnZ6do662urWrv8XK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfct3d3dmlpZFZfWlNPTkhETEI9PT45OTo6OTk8PTZAPj48PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmAjopxcniKe3t/fX98iHp8e4uHgn51g4Z5c3pzbYF+hH13hpugmp6UkoCLh3+Yh4Cckm6HqIV6oIt8kI6DiIScfpqRio2jop+Qo66fi5GLhYuBkoZXcq2Ln6ycj4OYm4+QjluDopGCjJ+TlYyGiIySk4yUlZSQjI+KiJabnY+VlpGLkpSGgIuJko2Kip2WmaOihpOdlaCLioiOnJCDiI+Ag4eFpIWLkLOYnJKUl6GhnpmSm52nsbispbzBx83Hxs/Mz8zP18/R1K7W1dja2dra19bZ2Z5ue3NmZVtcV1JWV0NASUQ+Pz46NDg6Ozc6OzozOzs/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieGxifpKDbm13i3h5fnqBfYZ8e3aGhIBzcIWCe3Z2dXSEg4V9fpKmo56lopaJnZCUlouKqJdyirKNg6aRhJmThJmMopagmZOJmp2hkqivn5GUkI6OiJWLbo23hJrEyLKdoqWbnJiWkbKQY6TNyJWOhoeJkJKNjZOUioWKioaWmpuPkJSTh5WYhICPi5mIjZCql5eko4iZnpabiY+Hl5eLhY+MgX+Gj6SIjZOomZeTlpihmJ+Zk52borK0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6BcX5nYl1dXE5JVFlBQkdEO0E9ODM3Ozw6OD02NDk6PDo4Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdoGPfXxtfoh4en56goKDfnZ2gIJ8bG6Lf3p8eHh8hIeKfoqjs6ejqrOhlqefpaOWla6hg5C4lZKymYyhoYykm6+jpJ2YkKeWp5msr6SXlJaVkIuYmZagwI6jybmrm6OmrZiRm52ynYWFqKKcmIWJiY6VjIuTj4iBhoeJk5iVjIuUk4aUmIaEkZCcdJGYspaXpKGInJqTkIqRipebiYqWjoZ9jJieiZCQnJqZk5iXn5SgnZWem6CxrqKkt760xcfEvcPDv8bNysnSps7N09LQ1tjT0Ni6cXh1XF9UX1VPSEpOREJDRTU+Ojc3Oj87PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdOW1xZSmZgO0iEi3p7boWGenyEeIGFgX5weHx+fW9yjXp9gXx4houJhoSSp7usqLK9r6StsrOoo6KwrIqatZ2iuKSVraSXqa23pqSjn5mpl6mjr7CpmZiclJWRl6CYmru7rsqhara4q7CUmJ6jq5OXvaNeqrKCiYqNlIeRfI6OfYOGjpCUlIiHk5aMkJWNi4yXmJKcmbSXlqudi5yUko6RkoyZm4qRnpCLiZWfoY2UjZiZnJKbmJ6UoaCUnJylr6ihpLO4q8LIxLW6vbvFx8fC0aDGyc3NxNfW0cvUoW95Z1tZU15QTkVDPjxDQUE4Pzg3NT9GPDw1PDM1MzU1NDU0QjM5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRHYmBicEpAi4p/gXOGh32CiHWDioJ/bX19fH9wd4d3jYGHe42PjIaMmarCwK+9xruzs8C8s6yrs7aLp7Ktrb2qm7ukqK25uKumpqGio6Oor7Kxqp2cpJibl5eeoqalkqS6rqnAvK2tsrmmpKh+iIacrb2wgoyMi5CDj4ORj3qBh5CNjZyIh4+XjYuVl5SRmpedqJqxmpGsnI6aj5KOlZCQlpeOkaCRiZSbo6yUlo+UnJ2ToJ2bmKChlJqep6akoqSws6fBxsOvsLq2xcTCv82mx8THw7zV0c3EyodycmBaWV5aTEpCS0BGRz5BP0I7OjQ+QTw9NT02PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRT9DRlxlR2BpZ1pdXJOMjIh7h4uGg4x1hpGKgW9+e4F/cX6BepV6kpSUmJCTlaezxsm/wszBw7nHvLqvq7m6l7K2urLArqXApKuvu7yqraujo56nqq60sKqboKqboZuVn7C0p4ujurq2wbysqJyypaSolIWOqcTEpIKLj4eIhIaVlI16g42Rj5GhjIyUkY6Jl5+Yk5mVmKagrp2MqpyOlo+SkZWVjpCVkY+hlIaXn6CynpSalJ+hmKSfmqCboJSYnqWjpqakr66lv8TCrqi3tcnDvrbPssS/xLyz0cnIwrVzd2tbV1tpUUxIQ0xKS0pBQT1DRDw1QUQ7OjM9OEIzMzIyNjJBMDVJRU0+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJmWk5lXGZUY2qZjZeKjIiSkIaJeYaUkIFygHuNf3iHgoGQeo2hlqiampi6vcfIycHSycrCzLzBsq27vqe6v768xLeswamss7u+qrCppKWjq62zrba1oJ+unqWimKOzvambqL3Bo7e3sKuTsayrrJeHmqmnpZGCjJOllYmBdoqReoWNkpCen5OPlIuPjZSjmZeclZWjnqmfkaWajI+Pj5WWiHyPlZKSo5qVoKKctaWQnpeko6Klnp2mmJ6Vl5uko6inorKsqLzAw6+lsrfMwLmvxLO7vsK4rcLDwsCYbHhgV1ZaWkpLTUpGRERIQkJBREw6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djpeOnpKJin+JoJOEeIV/lX9/kIiKkICWoZmupqOYwr7Hw8fF083Ozcu7wbewubyzvMu8w8G1truts7+5vK6vqKCop7atramyt5qerKKnoZ2rt7ippLC/xLG+ubOnqrWzra6XlqWsqKCRjpKxxaeVjn2RlH2IkZmQqpmYk5OPkpWTpZ2TnZmUoaOinJifmIuMj4+eiFqQlpeSlqSZZZijnrKklqGWrKyqp5ueppeYlpiVoKOopZ+2q6m5u8O0pbO1y8C4qrassrq4rqi3ur24gmttWVZUVE1FSlNOSz9BSEVESEdHOTVGTTs+Nz1ASi4zMjAyNUI1NVBWTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs9QEJGQnFGaUlSZWJMRqWUnJahl6mWjZGDh6aTiIKHgpyDg5WQkJOOmqKfr76uoca8xcTGxs7OztLKvru2sbq7u77PtsS9uLi3srG1s7izq6acq6u5qqinr6+Xo66kp6SktcCwq6y0v8O6wLqzp7m1uLOvlqWtrq6li5OVoY10wZp9lpmFj5aajLGVm5qVkpOZmaWjlZ+blpqpnZyhoJmKjI+WnWBKlpyalZqlllSWsJ+unJ+klK+uq6WaoKWUk5iYjpyfpqKZtKmqs7y7u6qwsse/uaasq62xsaOhsbK0pG9sZVtZTk9LRU9QUFE7R0pIR0lDQz46S1U/QTo9RU0wNzU0NDpCMzROV088SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiql5mgoqivmZGXh4unlo6JkoWfh4Sdl46doZqjpLXItKnGusLDx8rIx8zNxr67s665uMDBzLXHusG4tbqwr6+ztKajm6q0tKmppq2smqStpaSorLq/qKu2t77Bv765s7LEsrm9rKOutay5poibmKabdr+fhJmdjpOZmouvl6Gcm5aVm5+hqZ+noJmaqpmhp56YkI2RnYNudpKimpWdop6QrrKiqpSoqpeqraOjn6WokpKZnIiUnKKel7Gnqau6tr2zsq2+ubego6eopaecm6ypqYxiZF9eUUpMRkhOSVVMPU1ETkpLQkNEPFFVPUFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li5SYE1VSH9lXkhFq5WcoZ+6r5mUn4uTq5uRkpOJq42Hop+Mo62Uo6O2xr20wbrCwcbIxcLNyMG9ubKvuLTAwsq1xbHBvLS6qqitrLCio5iqtLulqKarqp2or6ejqqq+vKetvLS4vce8t7W3wbG+wLSptberv6WPopiRoqC8n4maoJmXnp6Pt5+pnKWim5yhmqils6GbnaWcqKqemZWPlJuKlomMpKKUnaKeoLSvpaSTr6uZq6qdnaSjqJGVlZ+Dj56em5WppKGhtLS6ta2otbKznpyipZqXlZiqoZ52XltfXUpIRUZNUUlNRUZHQlJMSkJFR0BWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDPzU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE6Z1xGQ0OccGJHRaeXpJ+ew62bl6WYmamclpqaj6qWlaemla2tmaGrtsTCu763wMLAx8S+zca7vbmyr7izv8LItb+vu7a4tqakqqutoKCaq6rEoqSoq6aeq6+soaiov7emrb6xuLbHtrW5uL+yv8G3tLO0r76jl6OWlJyUrqCRoqKlo6OfkL2kqZ2oq52doJumn72imKOeoqmroZ2WjZWek56Hj4SNk56koJ21rKWblbGnma6mnpmpnZ+NmJSeg42gmpuTpaSamKuxtbGqpaqtrJyYoKCSjpCWqJ6UZ2JYYF1OSEdKTktIRURJQT5QSEA8R0lIW1JPSz1IT1U0QkY5PkhHNUNhW0tDTlJVV1ZRWFRSVUhAOFFRUE06R0A0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROm5SRjxLeGViVkyimqOcnsWsoZ+snp2uoJOjn5aln6apq5e2saOqs7XExL2/tr/Cu8jCvsrItri1tbCzs7fBxra+sLi0uLWfpqyqq52dnqWkwaSfqa2fpKmsr6Kmp721pbG8ube2w7Kzt7m/ssTAuLius7W1o52llZKUoa6gmaKdqairo5rCramerK2bm56ZpqG9oZ2kmKurrKahmY2an5KeiY5Xf5afpqGguKqmk5i1o5+xoJ+arpaejpiUnYGOn5eVjqKklZCmrrKrqaGipaWVlZ2Yi4+Rk6SeiWBkWWNgS0hKSk5FRUFGSj49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dySEU2PXVlXEtOnp+hmZ7DqKWitKKcsqiTq6Sgo5+tqaydu7CorLWxyMXBwrPCw7zGw7zEyryvsLatsLSvv8S0ubGwubSsmaiwqamanaWhp8Ksm6ywnKmjrbCppKe9tqa3u72vt8Ots7LCwLLHs7q3rLS2rqqippaVlaSsop+fmqirsK+vu7KmoKmomZmYk6KkuKChpJOvr6ylp56SoZ6Uno+QjZWdmqKep7OmpoyYs5ujrpqdm62QnpOVk5l/kaGWj42foZOLpqywpaahnKCekpKak4WLko2cnn9gZVpnZUpJTEpSQkNASUc7O0c/OTlPTVVeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ+jn5ygw6ikqrKho7SqlbOsp6KksqyuqbuyrLC0tMbAxMO1v8S9ycS1wMjBtKu1qK+4rL/Ds7eurLa5pZmrsauql5+ml627tJunsJutn620sqequbKourO3srnAqrexw720xqe+r623tamoq6GXl5KmpaKimJilr7iusrW2oJ+opJmVlZOkoLeipKWWr7Gyp6qmoZ6bmpqWl6ifn5ihnq+yoqaMl66YpKqXmZ6kkJqNk5eZhJWelIyPnJ6Ui6mpqqGnoJmelYyOmZCBhZWJlJ94Y2hcampNUE1OVD1DQU5DOjpJPzc3Uk9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJcGhWQ1dGjHlmQzuko52hpr+mqK+voam0q525sKujqrS2sbC5t7C3uLjEvcPHvbzEwcbAuMDGwLqptqSsu6zAwre3qayxuqKVrbCtspalp5GquamgprCdqqCvtLOqqba2rbuss7O6t6y4sMO6vr+mw6uwt66pq6unnpiZq6KioJGYobGvs6uwuZqcqaCZlpKXpqG3qaWjorCxtKuyqKufm6Cgm52lnKGXnaOzsJqfj5Olmp+ompSinZSXiZOXkpWWnJOIkJuZlI6oqKafo5uXm5OHjpmLfYyWhY+bamhsYGxuV1BRWlRBQ0VUQDs7SEE3OlhQZF5QVldEWV5dTUxSTl5LSj5aY15OSFBOW1VZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT0qJys9XHA9PjEuMGRaZEAxNjQ3Z1lgRig/OGx9aFtWO4l7Y0M9p5+coqm9oauwq6OxuKqltbOsoK21vK6zuLy6vba2wMK/yMS5xMG/v7jEvcC3r7anq7exu76/tKiusbael6utqK2Xp6iOp7ufpKyznquisLCzq6m1tLW9ra+xtaywtLHBusW3q7yvsbisraqjsaaepKmfpJeQmZ+zqrOqqrOanaebmpWOoKaktK6noaytrrGns62xqqScn6ijnpWhmZuotamXmZGSnpmdn52Qqp2Wl4SUl4qcmJuTio2Wl5qXpqWioJ2WlZeTgI+UhXuOkoOMlmVscmdvcV5GWWZWRENNWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2FVMTUwPWBWXjgpQzNZVFxnSzaMemZMQKSaoKSstqStqaWurraqr7W6p6awt8W3sba+wcK0tLrFvszFucLAub65w7fAubK0q6m6trq5vbSprbC1mJinq6qrm6urjqu9nauusaOroLCts66ttrK5t6qurrKota+zu73Ksqq2tbG0r66nobOgm6itoKWVlZqasqOtoKavl6GkmpqSjqKlp7KpoaayrKq2pa6xta+kmZ2tp5qYn5mZq7eil5OQjpecoZeWk6uempJ/kpeMnZyZlZCJlJKemaWioaCYlpGTlXqLj4V7jIqDi5JqbXhtdXthRWBqWUlIWVo9e0pGRDZBYlRpW01cYEpbXVpSU1JiYUxLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENfUVwuKkIvSkdQW0gzY1lUS0SZl6CxqLGqraakr661qbe0uaSss7fKurS6ur++tLO3w8DMyLzDvLa9v7+3v7yxva2nuri3tsG2qqyxt5SXpq6rp6OwqpSvu6SssbKnqKOxtLCxsLWxuLKprquyp7evtbTDxbaptbassK2pqKO2oKCnsaCklJuZlbGep5ygqo6po56blpimpaW3p6KxtKynsqetsLaspJmgrKibnJ2blKm4nJSOjoqYnKKXj5eln52UgpGVj5ybl5WUh5aPl5qnnKOgkpaQkJV2hJCHe4WBhIyLbXB3dHt+XEtlbFxLTmNcPmJ7R0k4R2dXZlxNXmJNWFlXVFhUaV1PT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydHYkxWJS1CLj1FTFE8M3JrSkNDkJmlrqWtrqunpLCys6q3sbegq7W5ybiuwLvDt7KxtcLCzsXAwb20vL+/ur68ssSnqbiwtra/vK6qs7KcoKewraalr6WdsrWsq7GxramotLqstLK1rLSsqqyorKm4rbGwx7+4pbqwqa2tpaitsKakpK+jqZyenJuvmaOjoqORrJ6joKCiqqWmuaWstbWkqquorK+2rqOdo6iqm6CampKks5mOiY2HkKKglI2TnJ+TkYSNkpKdmpiUk4eXkpWZp5ufnoySkY6Qdn6NhX18fIeJiHBzcX18fVxTZG5eTllmXEZElltHO05tWGJbTF9iTlZXVldUWGdeUVJMY1pbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGVISis6ST8zQklTLD6PazxHSI+cqquiqbGkqaWztLK0tbKyoautvcy6rsC7x7G0rLTCwtHFxr7Asr3Awry/t7vEp6y3rLO4u7+vqrGtoKOnraqopLCjqrGqr6ywr7Cvq7O7praxsqmyqaumpaOtuqyqscK5tay6qKioraqosaWppKKuqqiin5yjrJWlnpiemaydoqepoqymo62suLGyoKmioKuvsaydn6enqZmjmJmPoKeYhoSOiouen46LjJWbjo2Fho+Un5yVl5SGlpOTl6SbnJyLkpCNiX5+h4V8d36HhYZ0cnGIdWtfWWBuY1FzcVxLO4R8Rj5XdFhgWk5jXE5VVlVXUVxiXlNPTmhYV1dLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMzU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLkpnREY4PEIwNUVLWDFAlFo+TEWVmK2ooaqznKqqsLWtuLWuq6Wqqr3JvLG9t8KvsayzxMPOzsO+v7PAwsO6wLPIw6uut62yuL++sq2tq6SnqbCpp6ixprSuqrCurbGwtK20u6S4s6ysrqeroKKer7eqqq26tqW2taOqp6yrqq2hqKamsbKkpqahoayWqqGVmqCmnqSiqqWtop+nsbetrqOlopuqq62pnKGlpKSYoJqVj5ick4GCj4iFnJ+Lio2LmI2PioKLl6OakZCai5OSkZOimZuZio6LinyGgIGDenSAhIF9c3aLo4d4al5gbmZXZYdjTj9nk0xFYnlXYlhSZVRNVlVVVE9cXWFVS01pV1VXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjQ5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxDKzpKT140RIY+SEZEl5KwpaOqsZirqq22q7axq6Wsqqm8wMC4uLO7taWysMTJy9G/wbu4v7/BucG5wMStsbWxs7q/vbKwrq2rq6i2qqatr6q5r6ixsa+yrbaqt7emtLerrKSpqpyjnrOzqKiktLSgtq2gqqirqKunoKurqLm2qaqqqqKpoKyckqmhnaCko6ajqp6cp7WuqKaqoqOYpaanqpyipKOfmZifkI6PmI1+h4yGhJ6dhoOKiY2Nj4yChZSimY2MmZCRkY+Sn5aYlouKg390hoF/f3l0g396d36Ah52Pb3FnZ3B4XGBziGtPXplWSG14VWRWUmJPTVVUVVBPWFtiVUhQaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg/Qyw+TFRfL0pqNk9EO5aOsKGmq66arKWtr7O1r6ulsKqpur68wLCuuK2htq/Jx8jQwL68urzCvbrDwL6/rrGysbW8usGxsbKrs6iktamlrbOzubCjrbaxsLO6q7mvqa22rKqeqayfoqC1raehn6+yorSqnqinqqOqoaKsrai9r6yuraKoqKCsmZCwoZiioKennqibmaqwqaOfraKhk6Kio6eYmqmlmJeZnY6Kh5SHfY2GhISkloSBgoqGjYyQg4OToJaHkJyQk5CNkZyUl46KhoV4dIF/fHV4eYB6dHN5aH+Go3VpXmVrgXRniIt9U1hwXkp4c1NkU1FeTU1SWWZOTFZZZFhGU2lSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNikoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGc6MzhfPWFkP0YxQ1BbWypITTlVQTSRj7KgpKaspKekrKe0srGqpLGoqri+wbyvp7mqpq6wycfI0cO8v764vr+8ybvAuLCvtLG6u7fAsrO7rLisorSnp6yytrmzp6i8ta62vbC9pqystautnKmvo5+kq6qnnJ6qsqSzqJqqp6mjqZ2jqaepvau0r66dqaSgrpybs6OVpJylpZ+km5qpq6Wem6qhm5KboaSdmJepqJKYmpOQioKPhX6Ogn+Ino+Ffn2LhpCNj4R/kpqThZOhjJSSi5GakZWGiX6Acnt5fXxod3x6dHBwfGeEeISIZGFnY3GFem1meF1eVkJXem1UYVBSWEtLTnF1XUhaW2dZRVVmUEQ+Sk5EQ0E5SEdLUz9qYkpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mY0FKN0dTYFUqPTpEVz4qj5SxmZ+gqaWloault7Kypqmxp6y4wb21sKO5raioscPJyc3Btr2/tbe/uci2w7WzsbWxvbe5vbWtubW+raGzp6qrsLW4tKufvbyps8Czu6Cvs7Wpq56tsKOcpKiqo56cpLCmsKCfq6mnoqqbpKigrbunrrCuoKujpK6enq2ml5+boaOcn5yao6qjmpqkpJaWlJ+hlpuXpquLnpGQkYuCioB/joB7mpWNiHt+i4WOjYuKg5GXkIaUo4mSkoeQmY+TgIh8eWx9dnh4Y3t7cXBwcndnf3Nqg2dkZ2Btc45tYWlwYHBBXHhsVV5PUVFKSk1UWVdNXV5sV0RYYE9eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDUuLj0tKks+Kh00OSYnLjM0LjArLzMmLDokNDFCaFkxM1M9ZV9ETDZLVmRPKTsyT1g9I5OZrJmfmKeko5+opLivrqOvsKqruMK6s62fuK+rqLS6yMvIv7fCvq+0vbfEtsOxrrmxs8C0ur23qbm4vauktKipqrCuubGqm7u9pLDAtbWhrra1pqansbOgnqSmp6GlmZ6sqKmeoKqup6CmmKOon7C4n6OxrqCroayknKanqZqam5+jlZ2dmp6pppeboKiSmJOYnpOZlqGpkJmJjo+GfYd+go59fKGNjIh4gouEiYuLhYeSmY6JlZ6IkZWCi5eMkXyFe3NwfXFzdGB5eGlucHBuaH1xY3psaWVjX2WFf19ac2tyTEx+aFhaTVBMSkhQUlBJTlxfblNEV1pSZ09ITEVGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy02Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo+L1hXNSiXnaaZnZatoKChpKG3q7Gks7SqqLnEtbOun7esrq2wtcbIwLe/wbmwtLy3v7u+r6u9r7S/sLzCuKm7urenqLWoqKuwrLOwp5q+t6WtvLawnrC3sKilp6+xm6CkoKSkoZabr6ahnqKnr6GgopOkpKK3r6GmsaqerKOvmJyqpamemJqepZObnZqdpqqanJyllpWXlJyOk5ejqKGQiIuPhXqEfoSKeo6Xio2GeIGGg4iLjYWNk5eMjpaYio+WfoaXi495gHpwcndvb3RfeXdkbGxraWiCbWVyamtkaFtic39fWmx2aVpIfV1bWE9PSkhIUlVGMjpfXmxQQ1dWWWVNSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0R0FmW0hUQ1RdaEUuOzFfUywylqOhl5WcqZ2loaOht6qvoLq5pqy9xLOwr6K0r6yur7TExLyzv7q3sLO5uLq4uq6tv7O0uK+/wbisvbq0pqKzq6ips6uusaOcwbamqba1qp6yu6mmpqiwrJmip5ykppSYobKlmZ6kqamcoqCTpZ+kuaikp62mnqWhqJOfqaGhoJmbnaCSm5yXoKKrm5uZoZWSlJaajZOTo6ekj4iKjoV5hHyEhXycjYmKhniAg4eHh5GFlZKSjJCVlI2OlHuDl46Kd357bHRybGxzYXh1aGdpZ2VuhGdoaGRmaGpfZ2JpZlplemNhUnNUW1tTTElHSU9TQCEral5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhASz0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LDExOTUsJi41LTgwNTc2YHRCM0NEZ1tLV0dVYGhCMzc4Yk4nMp6ko5KOpKacnp6epLWsp6q6t6isw8C3sKyitK2nr6+3wMC9scG3sa6xtra4t7Wsqryzr7KxvcC3rru7saWftqympbSpq66goMOrqaaws6ustLqdqKqqsaaYnaqep6SRmaatopmdpKqhm6Kdl6Ccp7alr6quoKGdnaGVoKafoaCZm5qckpqelaaeraOYl56VlI2Ul4yPmJqnn5GIioqHeIV3goKCnIeLgol7foSHhoSQhJWVj4+PkZGRjZJ7g5WNhnN+fWZ4b2tqbGd1c2tiZ2RjdH9iZGVmZWlqY2hwWV5YXWxkYU1oV1pgVklHSEtNUlg/OWBsaUdCVVNcW0hIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E9LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQGRHJTWbpKCRjK6gmZiglqW0saKxvrehsca7ubCxorarq66puL28u63Asq+urbavs7izp6u5sK6utLa7tq+4vaymnrWroKGwpauvn6XDobOlr7Gvt621na2vrK6jmZynqqWflZuopZ+ZpKOpnJqfnJSbnaywpbmnraKhmpqemZ6jmqWdlp6Ym5SaoZKolaypm5ScnJKMlZmOlJSYqKaNjYqJjnuCdIKBipiFh3yJiISEiYyIkoSUnJKSj5CRlo6Qf4CNjYJvgX9meW1oa2pncXJrXGhkYnJ/YGRnam1sZ2poZmxcbG11cWFUYmhjZVlJRkxNT1hRUFVhZYFUQFZTWVRGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDo2IzMqKTYuNTU0NjVafF0xOUtqW01bS1hkZEBBMUlkQic0k6Kbj46xnZuToZqpsq+fuMC2oLTBu725saW2r6mupbe5t7isu6+tqqu3qrS4raWztbGuqbG2trGytbqnqZ+2qZ6fqqKqrZyqwZmupa+wtrWsrJ6xra+qo5uco6yonJWcp6SdmqmjpZWaoJ2Rm6Orqqm6n6akoJiamp6hj2uilZiccYKWnKSAdpGrqJ6WlqCRiZeZgJeLn494hZOMg21pfneDcGyGioZ9hIqGb11kYGeEl4Zri5CUknV3i4R+g49/ZoeAaHVpZldcaXRuTlBqZGZxgmZeZGZubGleXV+JkIWHaE9LRDhFVGdeSkdQUFVVS0dTYG90ZUVbUVVQRkdGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTZPa1tOXEtbZmI+RzFPYjwrL42kmYeVsZuck6Cbqq2ro73Fr6m3wri9va2ntrCmq6S3tLKzsbmtqqestKawtaOnt7a1qKestrOutK2zoqmftKueoqWcp6iarr2Vp6avs7etraSorqqrpqGenKCop5yXoaamnJunp52SnqCZkJ6nqqO0r6Oio5yWmJiXo4ihj5Kah6GHlJ6hf6V/p6uek5Ock4iEcniMjoOHoHaIjGmXiGZ9c3igb4iHg36MfH+hoJ+Zf3uInnSIjnabimyHgYNtaGVjemxxYlSGbWNtaZhxWGpwboZXXmlba2pbiHBteXKHaYeEWl5GTj5GXk1GUlZXUVFSV1RnXkxZS1JSUEVHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdTI1UmtbTlxMXGdfPUsxVmA3LyiMppeEnaydmZmdn6uqqKq/w6+yuby3wL+qpLexqqyms7Wur7O2q6mlsa2ltbOcrLW2tKWnqLOxrbKor56qobOpn6SjmqKjna+2laSmpra8pqynqaqsp6aioJmgp6SZmaajpJmcpKmWk6KclJOipaagtqSjoKOYlZOYlJyIrpCYlImpi5ejnIWxgKStnpSanpV5gtSof4eUwJvHeXixpbeXZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4Fsl7GrsHhoa1ixrm9labySvG5oem1xj9h+U2pjtrJ+gHGUdZqhqpBXT1dhT1ZORlRbWFFQU4tcV1tQQFxFUU5ERkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cyMVRrXE9bTV5nXD5MMVtcNDEhjqWTgaeqn5ednaWtsqmxwr2ytb+1t77Cq6a0ra2pqK+0qq+2s6inprWlp7iunLKxtaqlpKeyrq2xpqqep6SypKGhn5ecoKCwrZWeo5+0uaKpqKGtrqSinpuaoqmgmJuooZ+YnqenkZynm5SdoaaioLCjnp+jlpaSmJKZhbBraoqNqn5nhJaHrWVxnp2VmqaVca6hpH53unxroY92sV9qtFulgGWckWBmgXpmf2p4aqllvnJnpox2sWp8sXh0kpNjbW2nbVuEoEVpZ4eWRXWcYH1me6Ongllfi6tpgJR4emqnN0qvW1dUbGNaS09XX1xXVjtOiE9XVi9JVFNKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVfWTMxG5KhlYKsp6Wfo6SqsbettL2+sLfFsri6wqeosKyvqamxrqSwuq+kpK6zo6m5qZ6zs7CjpaCqrbCsr6aon6OisZyjnJiVmJydrqeXm6GftLKhqpuhra2gnpqXoKKqnZmepKGcmqGnpJCdo5qXoJ+rn6WmoJqfoZWVkZaRmoW1m7V4hamZtZl3h7Obt3+TlpeplX5rgaZ6gYWHkpSSd6tnarFbrHuOh5R0iHCOhoB/iJCXeIOCi5eMg6CPhbB2d59xa2psfItOpFhIY2OZfmNopmB5cnVSk4ZeUKltY3F9hoBinS5Rom5bVGtnYExLXGRYXFpCPrB4V1hBI01oRkNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjg0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0o5YVU1MByWn5SIs6amoq6pp7Osqru2wrC8wq24t8GqrK2ur6ausqmhr7uqoae1raOrtaSms7Ono6Gdp6qyqLCopZ6gn7CXoJqVlZeZn66jmpqkqLSuoamPqaipm56VmKClqZqfnaOfnKCipaOVm56Ymp2iqpylmpuboqCWk5GTk52D1ZOZuXCwwn7GhnzWlJu7fJqWpZCNm4ykeo2GooGlgnqseY+dVa97iX6farlauXeGg32mgpN8mHqqeY2dj3uxbY6EdJC7hW+UT6+nxYpRoHpjYKpic3KGbJeHX1O1tMiGgIl8Y6QzQp12XVFpaGRQQFhmWmRhSkhNbEtaU09ZZlpDQz9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw5O0RIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tcUF9mVDdHOmFQNzIlnKGTmLGoqKWzqqW0qKW8t8GwusCxtbW8s7ansbGjsbOmn6+2qJuouq6ir7Ggs7SwoKOenqepsKm0qaWcnZ6rmJmYl5eWl6KrnpqXqK2wqKOfjqyip5ael5yhpqKYoqGioZqioqebnqCelZmapqCcp5Wbm5+gmJCSlZGdiLJuaLVxq4hwjqZytHNytnuamKSNj5uNon6Pn6R+sHaDkdLRdVuufIV/pG+bqqZrhoV9rX2XmY97sXOTnY54s2WWdIWebp5mlFLIi1rCXJ95Yl+tYHZzhmKXiF5Zyp1vv4F1TUu1U1XGZFRRamNlWEFPal9saVBVRkk5PVdSW1dYSEM/SjwyPzs1PTw0Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCTlRfZVA1Rz1hTTYyLqKdkaSvrKSqu62mtKWotru8sru/t7a0u7uzpbS0orKyo6Csr6SYprqupLGwnLS4qaClnaGqpbGorKqlmp2aqZ+WlZiZk5OjqaCXk6arsKWilpKsn6WSlKGcpKeglZump6Kao5+tmqCenpCWm6KenKWUnJWZop6VmJaSm4Wse3eodqOPi4epb62Kg6iDmZmiipKZi6J+kpeHroV/grNccrNSrn2CgqR/cdd9d4R+j52GmZp3r4aKkZyHd7RhmmWagoGVbJJasFhLmnWYeWZgrV53d4dnmIhqXa93lZ6PeGw1eciusl9CVG9daGBFT2tfcW1WVU0vZWNpU1lRO0FEQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTY8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6NzefnZSguLCYs8GtqLKnqrK6uLS4v7q4s7a9taW4tKC1rZ+gqauflae2rKiwsauttKSbqZ+fqKG1p6aqo5melaWilJScmZOWo6abk5CnrK+loZWYqZ+ij5GimqmmoZWapqmenaSerJ2gnaCNlJ6bnqCYmJuVl6GglJiRp52GqX19pXmhj5CDqnCtjIKnhpagoYqXl4ijgZCHlKp8gIudeW+xWqiDgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH2ClGySXKtbWpN/kX9oZ6pjcnuBa5iHcV2sWomgjmtuZU9KQ6FcWk10XWNmTVphX3N0X0pVNUqakllIRT1IRkFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8xVV9iTDdGSV9DMT03oZyZmb6smLTCrqutqaa0sLixtb+6urOxt7ypu7WgsaWepaennpOqsamvqrWsqq6hmKGgpqSkuaKjq6GXm5GioJWUnpuUmaCgkI2MqbCvpp2Xmqemn42SpJioq6iUl6qon5+go62joJ2hjZShmJ+gkpyXnJWdoZWXj6ubj65tcrR0qYx3iqZztHl0s4CSpKOSnIyJpIeOdbhvjHuLomtrtlqhhmWXl2mgoqdtlHK0dJOYf7JqhpKIrWt1s2GdZqJuhpJql1ytYE2hfIeRUnOjbHl/fm6Yhm9cr1Y8nHdmVG9uLlunT2JSa2VibFpiXGBxfGNTWVA+Pm1vM0JCQD9MOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs8MDAwLzc1LCssNDI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VfYUw1Rk1eOTFBOKWam527opyywK6tq6unt6m4r7XAtbyxr7m4q8G3qquhnKekop2Sq6qntaOyqK6qoZecqKCkq7mdo62clpmPpaOWjZ2hm5mdn5GTlau2r6eZlJusqZeMk6aapa2kkpers6SgnqirsJmhoo+Yopegm5abl6GTnKmclJGrmYfUkpq7dLHEgMOGfdWWnLh4iJGXjJeJjKeHeaK2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gIptmohwbY2kdL1dd31bYXm8alpWW2l5XmlgZGZibXhvWVtZQ0FAcj9DRis1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy02QDmmmZ6ivKKXscKwramqrLGnuK+2xLG6sq67sK7Bsqylo56koZybkKqkqrKktaetpJ+WmqqZpqy5naOumZWhkKagk42co56YnpqQlpKvubCrlZejp6eUkZalnaStnpGhqKugnJ+ppLKeoqSOpqGUoZmcl5akmI+woJKVqp6FkJm1gJGRjbiVeIKTm7V3bmxuc255j4SOiXKewbu8mXqBsqhwgHSRuYN8hoaLh417ioaNl3yku7m9nHV5s6N0dpd1dLB1mJ5mhmmNtnRycHe2jF5/eX2JZ4N5bXlii6xwdYV/WFunakRkWlRmX2NdYlBnZnFtdUJNUExEO1pMP0ozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVzgqT11dPSs7VlYnPTo8pp2gob+llrPCtKyqp6yrqbuusMavtbSvuKe1uK2qo6Kmn6CdmZOspa2qprWoqJ+blqCjnqykvqahqpiVnJGim5KPoaihk56XkpiUsrW2rZidpKSii5KSppylq5yWqaWmnZuiqaemo6igkayel6Oel5eYnZ6PsKmUnKeijmp+aZyneIlzfpqOdXplh3u9vsC6bpGCcZSFX3JqWl2aiWFkh46Va2B/lWNtm3ZilGt/mpWUZV5gY3GbiWhyjH2GlGZqfnFzeX18Ylt3dIFoUFxug3x7impYbHmCcklKb4VwTXRNRVdcZmFMW1dmY15PWm12anJST0RFTjtISTxNPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMDs6LjAtNzY9NSYiLyoyLCU7OC03SVJfSSdTX1Y0KVBeTCgzPltPJz8yPqifqKHBo5q0urajrKWup6i1sqzIrLCzrLWjvrGypqCjqZ2jm5qZrKeupKW1qqSbmJWim6atqb+oqaaWlJuVoJqTmKWpqJGekI+YnLCyv6ybp52noYmTkaqbqKScm6ygo5qbo6esop+qoZmvmpWmn5aUnZ+dl7ClmaKomZyRnpyjpJmno5qcmpqakJaCaG58cXaQl5SRhIq0qY2FmJWOioyYl4eTlYqDkpKQiY2RlJmTmJeaoKGam5SgnY6CeqSFbGl8kHyAdImKgXGCeHl2doqAe4lqc4F0g3Vkd312a3B6bWBjW29oTVhYZWpfV1lwem9uZlNPRlM5T1pOUk8oKztKQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7Mzg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5UMTBUXjorPThdSyw8LUCyoLOhv6KksbG3oKmls6elsLWqyautsaa1psCotKGepaWcpJaVoKunrKOjt6ygmZaWoJetqqbBn6yklpKcl56Yk5Sinp6jp5KRmainssOvmaudq56PlpapnqucnqCtmKGbnaKlr6ahpKeerJiXpp2ZmqGenpywoJ2ip5aYk5mUoKKWo5+XoI6WlIuKjY6WrY97lJuCkYGKqaiFgJiWioSOn4h7g5CGhZmQh4aJlY6bl42QmJ6jlpmSkJ2Nfo1lobOuhImEdnqPin12eXpvZ3mQgYCJa3WBeYhyaHR/enaDiIJrdGN4Zl9oZGNkZmpYa3txampcUkxQRF9VRkA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1VWVlhaXF9hY2FfXl1dXl1YVkpLTEJJT01SSjs8Ojc4Ni8yOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAtKC5r76tq62xsqCqprKtoqyzsMWwqqyjsq+8pLScoKeioZ2Zl6imqaakpbO1npWUnpmZr6auvqCro5GRnpqZlJGVoZyXqZ2FnqmsorPHs5+ppKqWlpiap56pnKCkq5Sen56gqq6ppaKqoaybn6CgmKWenJ6cr6SZn6iTmJedkqWamKmempdmg5J8ZX6Omo9jeIxsaGp6kKOra2SZmH5nhYplZWloeo2hjmtnjJeRondraouYop+Yc2xueoSNhXlYZV2FgV5rioqBdltoc3d3kYCHgm54gniAc215hHR3iImPg3tohFhdanNkXXOIaWp8cWxjXVFOV0lkWEBKMz1GNz9GRDcxPD0/QUM7O0RHSEhJTE5QUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSS42Wk82KUVZL0RPMVlDOz8uPaWfury5r6uzsKulqK2usKeurrC9samopK2wsJ+tl6CknqGamaarnKyjpqips66elaOQoq+mtrmlrqOPjpqhmZOSmqCZmaaWe6Wsoqizw7iloqevn56VnqOfpJykqqiSnqGeoKqvqaqiqZ+nm6afp6CslaGbpbCkmJyrlqGem5OlmJ6rmZ5+voOIcrRyhZ2GrWh3ucS4cZKho3ummJlzqoJ8y8DAu3GKooeDnnyVmIiewL2Clp2djZzBwXuBepGMmsK/fWulsW+MgW/Ken+beJGDjoB2eYF/eXF6f4dweIWMk3lsdZFiZV54ZF9lgWJedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQT8/PTY0NjgyNzYqJiUjKSomLisqKTEwHzkqIz5IW0wqI0NQLyNGWzNQWS9VQUI7LziWo7jDtLCvv6mplKOvqbCvraaytq+qpqamsaugq5iboqCcm6qnop2roqWppaS0pJ2jk6aurLi0p6+ikpGZnaWSkZ+hmJugnYemq6Srrb/AsaGqrqqXkp+dopmipKqjk6Chnp2srqmrpaOipaCkpZytqZGkm6iuqpydqpysopaXpZaho5icf86UeXqlgXmVlptfrY9djqeAoaB8p5WbdKuCgK9eZIypeqeHhZ90l5KIs2OCq4agjY2yaoSudHyWh7hhgq1Zo81uj3V723t/mXF+iJJ1f2V7iHZ2a32Ibn6FkJJ+bICNX3Bqb2ZgX3hkW3FoamNmYFJUUlddSk9DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w6TC0hUEBGNC4xrcLAwLW0sLeYnpGkqqmttKumsq2trKSsprCqoKebmqaYnKKwn6CfqKejpqGfsKybnpamrq2xq6isoJSSm5+lk4+epZedqKOerqSrsKi/xrOoqbGulpOdnaKXoKmqn5Whnp2drq+nqqibpqajoKqSrLOWpqKqqp6jp6ahsKGSmqeaoZuUlJGXoHCFjJd1hKiHcbB8nXKsfqGfgaWPnnergn2tf5xyrX6rh4afdpiSenyXfqqIoYuRi5x+q3uIko6ggHqtVpzEeo9vksF9gZVtdXCMbWZ2ZYZvYXducm6IipGPg22QjmRuc3VvYGZtZF9uaWluZmNXU1xgWlJSQzhJSUBEPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi08Jz0xKTNWQEYhHEc7QzEtK6/UxseytJ+do46jo6KtrravqbGnqaqorqurp6KjnZmilZ+mq5+ipZ+oqKKfnrCtmJuWqKevrainqZ6XlZqkopKUoa2bnaejrqyjrLWpuc2yraaurJeVnJ2imZ+urJ2WoZmen6mxqamomqqoo6Grm6+xoqirrqaZpquqqrGjk5ejpZqUkoWkaqR1iXqpdHqycYKliZiMcIegmoekX2BSq4R/roKbda6BpoaGn3qYloV7ZoCjiaSYhoGjfal+gJSGrl58qFWdopKBeqOfgHvDr8WMc6+zs7lxYqmvwnVojIuXj4FsmZFubXh3d25sZmVkcXBme2ljXVZfaVhYVExMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXWwKGZq6ihr6KfsLWwr6mto6inqqurqaSmoJuln52lp6aknKyaoquhpJ+vo56bk6qktrCuoKmbnZeVp6SRm6Gon6CmnLCmo6ixrLbIsrWqrKqVkp2dopmfpbOdmqGUnJ+mq6uirZmrqKGhqaKyraKqsrKhm6qor6+2o5OWpKeYm5F8qmyehId1q3l8sG6CpIuIn5aVnpWB0re0uMmAgbJeX5Spg6SIh6B6mJWZeKrJc5mjlKepkJKbjH6aiZrGxndloYKlc4KgjoJ9r15vtWOxdUujhm2nR4KTY46PnZJ7cJaRfW96dHx6bVxmanJxZoFpXmFYY21cXllJTU1LRURBQj5BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE9UUR0cOzxGMiwkqKTBxrmtqLKurKWinbK5rKqhppuopqusqaegpqWYqqOfrqudpqCsmp+ppZ2ntZ+il5Ooq7ayrJumnKCVkKatkZmcp6OgqqeuoaOnqa+0wrKzqq2olImXnaWboqOvpZehlZmcpaWrmq6crKelnqujt6ygsbiwnZuvp7O0s6WVmKikm6COgp1OeJqBf596hKN8gqSEhqaenJ6ThLh7fHm5gn7MxcK2eJqgkIuffpqWl4p1npeKpJijqH6whZuEnoSsfZmUYaVso3CPhZCBfZeDcqxgpHNxgJpgvH1SVXSOkaOWe32RkIhzenKEfnBbbG53cmqBblpjX2huYmRdS0xRVEFISEZJOjlLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFZYWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9VRjxFMjpQW1QcGzY/SCwtIIyHmamspKu5q6+gm6Gss7Smn6CVpa+urqmmnaammqOnobKuoammsqCZqKSUorWio5WXoam1uaSbo52jk5CisZmenKeloaKvrZ2kqKK1scOxraqtqpGGkZynnaOknaWXnpiZmaWjqJmtoaykpZeupbusobe3rp2etrO5sbOnmZ6woqSeho/RtcO3eYeOhZGTj4CmeJSid4ygkoSlgotxq4aEtG5yaZmjnJWJn3yYmYaHj3KugqWboo2mi5OciJOQmm1wslylc5N6nGyZf3uZfW6pYaJxcX+fYnOyuGh3j5OlmH2Li5GKd3x4jYFsaHdpeHNuf3RcZGRtbWVoYEpaV1g8R0dAVDNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXl9fXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKSWSc4yKrr+/vLu1npeopK22oaOZlaOpp66pq5mloZ+loKC1p6Kpp7CjlKujjqSto52QmpqqtLSknaacqZKUl66goJ6mpJ2nnLWaoKqjtavCsKmrqaKNhI+coqGmo5aZmpyYm5ilpKaYqqasoaSbrKa9rJS9sK2fo7Czuqy0p5upsqWomHqokH18sHeKgaSliJxtsm+gh618oY+DqJaZgKyIhK6Fn5SooKKWhZ+AmZWAe5J9q4CdmpaKqnidn46Ik5KAea9do4F8pqdknYB8l3Rrrl2la3GFmV1gW4ygbZSQppmCk4uVinl5gpZ/amx+Yn10bn95X2ZlcW5nZ2hDWWBbPUpUMlQ4QkJDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaWFNQT05JNzA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNTVldXWFZVVVFIRklKIygovJKahKnGw7bBtJ+braCuuKWkjpuko6Cvrqmfo56drZieuaCiq6CvqpqtoZCqqaSWiZqQrrGspp+om62YmI+toqGepaGapZytmJ+opraov6+lqaSfjICOm5ugpp6SlJmalJqapKOjmaeqq6KjnqmovqSXw6yqo6Krs7qsr6ehtLCpq5l2r36QipyFh3y6rYmYZLCMZZWtfaCPg6eWmoGsioSwhaWZpKGikISgW2xqgbNgf617e4KBsWxnbpmXi4ixW320W6SDa8iiZZ+Be7xZdrVasn1Sr4B6rFiAoW2XjqiaiZaPlJV5d42bfWNyfWGDeHN/fGBpZnBtZmVlT1VjXEFUXj1JKD45PTQhIiwlHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGBiXl9cW1hVUE1KR0M1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7K3vbu0wbOjnK2mpbapoYuZoJ+ds7KonqKfnbSYoLOoqquesK2drJuUrqmijoibjq+tqKajqJmuk5qPqZqhnqWfmaOjpZmeoqmyqLuvpaienY98i5qWoaCakJGam5GZl6eeoJinrKakpKKkqbueoManpamiq7S2ra6noL2ura2WgamSo66Om4CGpJeYj4GAuMO6g46ck4Snl5yCrIqCr4imm5qlqpF+1b3CqmKjv718fqOCg9e6uLWFk5KCnr2+hGqjgW+rhG6cf3qysceDaquwva14d6K+u3SAlY2mm46Zj5WbeICPmXlifHpjjGd4gXtga2VramJQYltTaVxAVGFCTSk8OjQvHh8kHiUyIB0kKDA0OTY2Nzg7PkFDRkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSUM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q8lbS0sb+5sr2zop2upqazpp6MmKW/qrewp6C/pqaxm56xnLmonq2upaeUlK+sl4yDmpGvpqOsoaWcqqCYi6OSpp6nnJqhqKKZnqCrram5rqikm5eTe4eZkaabk4+RmJiPmJOomZ+XqKifqaahoqq7nqnFo6Cvo6uztauwqqG8qLCwmnR1qqS3hWWJn29nrI+Kj21vd6SQmZ+Bda+ZlXCQjHGVp6ObmK6kcm1tbWWKd25tgplxgHlpcGlniZWVl3FoaYWGZ3CGZF6JY2pwWV1nfnemYGJxjpJvZmSAjZKOopeWl4+UnXuGjZN0ZYZ3aIxqeH54ZGxjZmxiS2RYSmtZOlBlRVEnSzkrIxwgGyMsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJSts6m6ubKzqqmirp+ks6qYkr2xw8i9tamewKuso6Cmq5+6o6StrKyljZatqo+MhZWXrZ+lqqKfpKSgkYylk6eZqJmWo6qglpylpqevuausmpuTknuEl42ml42RkJiUjZeVp5Sel6eimq+mnaKsuZ+wwaiks6assbGrrqyouaSvuJaKoailtpyJlqGXhqmakJSdk6qzmZujrKGzl6KgnqCinKCkoZWrpoySk4yHkpyclJCZk5iQjpWFgKSal5WNi5OSio+GhH1ni4B0g3Z0h4xxp218lZGUk4GBj4+Pjp2ToJWWlZ+BhpOLcGeOdm+Kd3Z8eWlrZGRvY1VgWUBpWkdiYE5ZKkU9KyYiNzQwLh8cISUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5VUUpFQz45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqktbiurqKwpK2gobaxkI6rxLvEureqoaWdm6adsKijtqedqbSmp5GXrKOLiImPnKeWrKShmqeen5OVo5epmqiZlKehpJCap5mhtbqoq5iakIx7gZSMoZSKlJGVkI+Tl6WPnpmonpu1o52mq7eorsKuo7emr6+wraqqtLqir72ZkqajprWikZ2mno2pn42Sn6Osr5qho7GpsJikoZykqp6dnZyXq5ySmaGbk5CWqpmNmJiWkJaekYignZSUhZKMkIyUi4B+ZoyHdYd2eYiDc5xqh5GUlJGKfYyWkpKYkqCRm5WfgoaXhXhxlHJ4iX9xe35pbmRfcGlgW19ZbWJQYGRQWjpHRkU9Mz09Ny4qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlaSno7CzrK6jqaetoKi1qpGQnKOyuq6rq6GimXqdorCkpbGplpu4pqOUmamcjoaKiZuikK6epJaooKGSl5mcrouqlo+omaiMmKiPnrm2pKWYm42IeYGTjJuTipWRlJCNkZahjJ2dp52euKN/g6+1orCvdKS+o7KgeHqgq7O8lXaupJ+KgKp+ZFthdp+OpJ2Dl35uk7Oco6iuq6NlnqCTc3mZlnCAmKiXbH+ip4llnKWbkJeYlouRm5CFnZqQlIKSh46OkomFd2uPh3aHcXyGgYBhaYiLlZOLW3aVkWdoj41xeqOXlmR4mIaAdpdog4mCbnh+anBlX3Vva2toXGVjYmJvUls+TU5OUkc9QFRCOTEuHh8mNDozMTY2Nzg8Oz5AQUJGSEJHRklLTFRVVVlcX2hmZ1dRSjxERzw5VlJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqaWpraOnraWSlqq0rrGlmammq5Zzi5yvn6irp5OWuJ+gj5yjnZF+iIiano2rmqSVp6KejpeSnoV1rpCJppqokZejiJu6tKigmZiLiXV2k46Wk4qTkZCUjI+Sn42an6aYm7KWgIybtZ20jJKPvaehfqeieqOvuIGOjqefhIuFj7Cpr4yJlqKZeYGLrIacnaKoqqiIlYaYd6WbeoebgZemgoF7nLF6ioWfl5mUmJaBkJaWhJmaYnmHkISNj5KLg25xj4h6gXGAgYZ/hnSHhZaSeJZok3SgmnR8mYOem4WYfpGJgYKXaY2MhGt4enBwZ2R3bWlsaltkamllclteSFNMUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dSWFpYW2FhaGZZUUg5REs8PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2Yo5+mrq6rqKygqLCnp6qlmZStxrywoZWlqLSdj4Ocq5unoqCNkL6emY2fmqCQfYWOmZeIq52jlqChko2TiYaAkaiOh6Kco5OXnoafubKnnZqTj4VwdZCKlZCKlI+Pm4uPkZ6Rlp+jlZ2siJ+0ibSarovKiKuuibeFjbCDsa+EqY2nmI2dfKiPcnt3m46mlmiVpHm0i5+ep6mSmcKBf6uImKFxnoCapH2XhZWxgaF8oJOfj5iXgI6Tm4mYkot8hZOGjZWTiYNtc5GFgHtyhoGFfYV0hYKXgY/FZoCph4+iap6Cn5iBmYCKi4OImG+NkoRnd3R7dmdodXBmZ2teYm5sZmxYZkZcUEwyRTQ2TWBjNiY0PERHRDo2MzY1ODs4Pj09PkJMP05JSktDUFpdXFdiXmpsXFFFPUtNQEpkWF1jZmhnYmJiYmNjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS4saqrppqUn6KkqqKVo6m2oq9/oKacpZ6diZS9mZONoJGdkHmDlpaRh6uZnJuaoYWPjHebnI+gkYiepJuVmZiGoritpZmbjY1/Ym2Qi5OQjY+MjJeLkJGejpOfoJihqH6hp4etnaCWro+fnZ2RhoGgjauvh6SNqpqMmn6idYCYk2uBq3RNq3iHjZ2Rm6mogqqrfYOhe3qnaZ5/kmtnl4aXtoiefW1gY1iDl3+Me2Rni3OZfXmWa118l25fU3GFXGBseYNgWWWCfYSBmHGnqmuDo25ypXCfg51nZJ9sWmyIemVZX4J+YVdQb3ZlbXRxampvXmpvbGtoV2hOXVdFOUE0R0NeazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpcXV9XXl9idmBNRDpNT01UYlxbZmZpaWJiZGFkZGJhYmBiZGNhYmlrZGJkZGdkYmdlYWNomJadoLmhqqOmrJKhtryrrqKZl5+hpaysn5yttKKnkaCfn6acmY6YtJmQi56MlYt1gZSRjYqmlpaYnp5/k4WGrKSHnJGKmKmYmZqSh6WwpqKVmYiJgGluiIeLjo6Ji42Si5CRoYyTnp+boqV/k4GPo6GUoHeclpCng6GngIaqroWleYt9hJp9onBykoeWe56MeW2Hm4yZkJupm4+HnXyConN2pmaefnekX5h6fJJzom6Yt7S6dJKHgYC2qGSBxrh7cJW2jHGAm6RjdKyrYH1qnbN+bn2Hg46Ci5dxgKNsc6RznoN+o16dmbOWb3uXnrN0cluesoJpYm9zdXFob1lrbHJyZVxoXWJLRD1ENVFBWXEyPFJGX0pTPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWlhgYHxkSUM4TFdVVmJhWmVma2tiYmVhZGNgYWJgY2NfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mayck6COpbi1rq2gmqKco6OkrJuasayrkpegmKCkmpqUnqubi4iSeIuFcICWjYqPoJCTlJ2XfZGJjqihh5iPipKjk5uajIuop6Sej5aHhH5re4Z+fY+Ng4uQkImPk5+ClpygnaCfi4l3nJiijKByoouIqYicp5GXqKx/rox9eqCZeaOTeIBzl4iMnH2Wn4abjZmbpoajZKF8iZaQm41snmiajW6amXp/iqd9cmdzqoOdgnOqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxep3Z1iYp/nmiadYeTkpiOf55umZBrpplcqH53u2p9qVqOhF2zZ1xtcXh3a2lbcGl4eGJeZVdiQVBETzdWQlJtNEpaWl9OWkRAMTUxOzs3SD86Q0hVP1hSWV0+RGJdVmBRYWR9aUVCOU5bXllkZlhmZ25tYmJlX2FhX19gYGVjXmJkb3FfZGVla2RjaWhna2mVnImqtpuoiWOVnKy6srCsnaabm6efna2anbCnq52Xopmhn5mWlqCjmYaJjWmIgHF7l4iLlpaEkpWYj3qKhJajnYmVj4aLnZGcm4mPqKKgmouRioCAaYGGeH+WjHuIjY6HjpWafpOhnqCik5hyaJ+KoI+McJKMgqmImZ+jqaGofbCtpKK4l3ajs6Kjf4iUeJ16q5p+oo6dm5eIl3KhfIWNr7V9a5qRoXh+mLSjo6uohJh7mnycmX5zqlpdb3uXi3ieYkx/e3uFY3qYQk2fWaJqcnyObYGJhJl1m3mHibGzf3+akqZ0f51tcXyUb5lyaaNdlXZIZWNgc3B8fW5lYGtodntiY2BRXlZcVFZAWUVRZ0RSV1tiWF9JRD1COEBCOklFOExFWEFWUVtWREZhXFpgS2BtfnJFQzxVXmJaZWpWZ2hsbmJmZl5hYVxdXmBoYl9lY3ZsXmVnZmxkZWxoaGtpk52Bsa6ZhFNeoae0urOzqZqii5upnJuokqGro6Cnjp6dnJqZlZihnZaHh4l3hYFueZWFkJqLfZGTlohygImSoJxykZCBiJiUn5qEjqicmpWKi4p8hGyEhXGBoYx4hY2Ih5KYlHySo6Ceo4iuhn21hI+enXumlnqpgpadkIuhnn2naHdtfplzoHNxfJ2FmG+Tgq59o4OmnpqBo3BeqWd1o2NvpWGc0498epl4cnNjooWPfqJyoo51a4+zi2CCmIpzqrKnvH93g21/v6aqtF6bb35xl2+Bc6JyXaNndKZhaKZtm9OYeoKbbnd5l2ubenaXcmyppWdfZHlwfoRrZ2ZjbXZ3Zl9hUltlUVFhSVdJVF9XU1tlaltlUUVDS0xKS0JKRDhQQFFOV1NYT1JRYGVlaVJkeHl3SUZFY11lWmhqU2loam9jamdgYl9cXV1faGJhaGV7ZF5kZ2RrZGpsZmhsaJibf7CsVFxLfqmvsrWws6OcmIWYpqCgoo2kqJ+XqImZl5iTmZOSoJeNiIV7cH2EaH2Pg5OagXiRjY6JcH+Gj5KSbJeTfImRkqOVg46qmpSSioWJeYR2h4BugZ+Gd4CShoiZoZZ5k6KjmqCJs6Gitot6rKekrqVwqYCakIWBnJJ9pICimYaYcZ6EoqyuiZeLgIykjZaDrqKUdrW2tcmhdJSKgJ9hnpepbXiWhp+adaGHd6B9kJaKgW9MZqKScJqIc6R7eXRhg4JsfqBscmRgnHJ/dJdpe2mztbTGpnOYfnudapuaq3SCmm1zd5dpmnl0mHFQRXyzXmp1aniHZmpnYnR0cG1VXVNZaFBSaElVTFhSVl1na25WZ1dNSkFKTUpISk5BUUpQZWNpbWV0cnN+eHtudYl7e1RRT2xeaFtraVJqaGlsZ2xmY2VfXFxcXmliZGhre19dZGdjamZubWVpbGWinImvp4VmP5Shs6uvr7WiopCAl6iioaOLpKadnKWBmpeWjZeQkJuSjYiDeWp5hmWDjH6WoHl1j4iMgWmEhZKDjIWdjXqMipWlkoKXqZeMkYuAiXqAfYt5cJChhnmAlIeJlp+Uf5Slp5yWloRnbnicbKJkfHGld5yYcGengZeMe6V6oJaDlnKfdoCJlJaPuW6QiqJifZmilYhucmmqa3WgbG6mYJtpi5BoloealXWigH2aX4uFjHVviGJooWWef2mbdXBkZoiCbnKiWl9bZKFuXomMb3t/c3JkpW54omRnp2iYcouYbqFvUoiPb6BeZKdUi11TmG1tcmpxgWxwaGt4c2tvUVdWVmZZU21JWE9cSFhpaHNqWWtWUVJFVlxMWFJhVWhqXnd1enxwfHxygnt/cnaNgIN2XlFzYWdicGdQamhoa2xuZ2RnX11dXWBqYmppdnVdXGNoY2ppcmxma21jnaWYpnpldG2Lp66lqrCxpp+LgJaqnJ6kjKGhmqGhgJWYk42aj4uXkI2Ke4ZxgIhoi4t8l5pzdYl9kHtlg4eVioqVmYJ8iIaWppCBoquQhZCKgYp9gICOc2mPpYR9hZONiJifjYeSqqaeiaZ4lpx+pYmWjLKYnpCDr5efpXiWiHqpdKWPhJpupaKMkoSMg7xufKWvgoaFhpOWnKB9pnpxqJSglmeefm+rYpaKlZJ3qGypooGJdoeCd6uRpohrkbBrdrOMqWyLhm5tn56SlWF+q4uqdoB/jaefd599haSVnaBpmod1q2aerYy2c3e+jKSTWYOmjathdXFzb3t0cGJqfm5obFJVWlVgYV1rTV1SXUldbG12YFtxWVtgWmdzZW5vcmNxdGB3en55cnmDc4N+gXt7jIGCgHZieGRjbnNkUmxnaG9scmlmaWFfXlxhamJsbHpvXFxiaWJtaXdtZ2xuYpWmqpyBgJ6klqmqnqinrqOZiYKXqpmdo4mapZyonYSLmo+FnJGFko2LjXSFeoiDb42EfZaTdHWGcpGDbX+LkoeGk499e4GFl6WNf6WljYCNiYSUdYOHkm9siqiAgouUjomcnomMk6qjoJCAdZWXiH6BeZSuo3+Bm3GPhniQjIWAe3KnjHF9fXqXlpuEjnh7fn2IlJWTinaQmZ+hhHt9iWuMhVt5eXJ5cGhufZGJcX90gY+Uk3GFg4FljX9fgYCMd3VzlHVvem9uh22Ehl93aHiOZoGCho6qnH50fZdqiYhvf3V8hHVtbGaMc3h7l3eEW2pYeI9obXdxcG93d29dbIZtaWdWWV9XXGRrZFVhVV5RX3B3eWtqd2Vqamp1fHFxdHNhb3Vic3uBeHV5gnV/gH+AeIuFgn17bn9sZHluXlduZ2h1a3hqaWlkXGBaY2llbHB1blpbYmtka2t5bWhsb2GOlbqpp4uhopqmpJmknauioIODl6uRnaCJmqaaqJiCgZuLfpaUh46JiI1ygnyPfX6PhHqXjnRzhHCVhXt9kouGhpCFeH6AhpmjjHunoYuFj4+ElYKGjpd3coSphY2SnJCInp6Hi5qnoKCrg4mOlZp+fomWraiPkqeQeHCekYN7k29+qYVwfZVxam98gZ+Lf5KOjGhtXYOLjJybn45zlYuIcXRrgnZzf1hyboaPgX1+i2ldaWN6hYOIgF9peHubfIOMg3aBhoNpeYuHa2Fxc4N3YHOMgomQp5WGZo2Pg252i4NvhIx4bmRmY3mCepVaXGlmbnZbenl3dG1zcoJmXG2Ka2tiWVldWlhrcVteYFleXWZzfXtzb3Rjamppe3xxend0ZG10aGx8fnV5fHt6eX+Af2+GioR7fXR+eXJ/aFRccWlsdnB1Z2tnZF1hWWpoa2pxcm1XW2VubGdzeW5oam1gjIyrsaKQo6Gan56Ynpmpo6F9g5erjJ+Uh5uikKSUf3uXhHySmYiJhoaKcn2Ai3aFi4GElopyb4BymIaEfpKDhIaKgXqAg4qbn4+CpqCHeI2XiJWLi5yXhYN6rIGQl5mUip6dh4ihqp+ioqOMiJObnKOZlqqhp6agkpuIl498eI+OhKh+f5KRkpOcsKWalJ2QjrKTmISmjIyVm6CJkJuCiJGKa3yOdndlgoaQinyJnYSHi4+HiICEg5B3fHp1mqKJh4ufi4aVf36MgYB2cXSGhYB4iIeKkaaRhIaOiIONkIx8hoqHjoB1a4GDe3mZaXJoYHOKcH16dnVvd3SBXF5vh2huX15aW1xTZ3FVY1tbYWxodHt8cm5wY2ppaH97bXh+cWhvcGxmgHtygYB3gH1/hHttgoyFfHp4fH16g3hOZHZqc25we2VrZWJiYFtzZnBmcnFsVV1sdG1peXpwZ2lrZY2InbqflqKhmJWZmJSYpKCde3+Zqo2djYWfnIqdlnx4lIJ7jpmJhoOEhm14gYBygId9iJOEbWt+epeGhIOQfoCGhIZ9h4ONm52Sh6qegnGKj4WSkYuckX2NeqmDjZKXlY6bloaGm6agopqdhoOSmZmYkJqmn6adnZCXgZKLd32IjoWle3yOkJGGmKmhnJOcj42qjpKAno2Ik5qfg4+XfoaOgm94hXF0YH6Dj4V0i5eAg46ChoR+hYSUbnl1dZOii42Gm4WFjnSAin19cnN7iYR7eYyOhJOnj4aEj4KDiomJdYSHiIp7bmp9f3ttaGtsZ155fmd8e3ZzdXV6dlxgcH1tdGBiWlxeUWZtU2VaXWFraXV5fnBrbGNrameAf2tygGxrdG54boR5boaAdoKAfYV2cYKNh317enx/e4KLYGl7a3VoaYNlamNgaVtjdWhvYnVtbFRicXlkcHp6cmVqbW2Lip+4mqGkn5OSlpeLmp+enXp3naWQm4mGpJSKmJl4eo2FfImRg4yCgYJtfH94coCFfYqQfWtofYGXiIGIjnx+hoSHfI+Aj5ubkYinnH9wi4qLkoagoYqFjHynkYePkpeTlpJ3jaOgoZ2Wmn+BkJmYk4yaoqGjmpeRm3+OhXmAhI+HoYB+jIyPfJekoKCSmZCPpo2QgZuRiZOYm36Skn6HjoF1dIJwdmB9gI2FcYqVfIeLcYx+goWFjmh4cnmMmZKQgJh+iItygod8fXF6fIyFenuSjYOWpZOLhpF8hYaHhHWBgoaHeWRxen54eXBsamZefXJoe3V1c3xzf2peYHN2cHdkY1leXlJqaFRkWF5hZ2p2eIFxZmtjbGhlf4BqbX1nbnBqfXeFemuLgXKBgX2BdHaCjYZ+fHp/gX1/j2pyg25zaWGIaWxiX3FVdG9tbmB4aG1XanR2YnV6e3Fia296iY2fs5KlpZ2OkJiPhp2gmpx8daOgjZZ/jKKKiJqWeHuGh36DiX6IgoB/cH97dHWChX6JkHhnY32Gl4qCio14fYCMg3mWgJWXlY2Wn5p9b4uBkJOGpZuHjImDpZWEkoqVl5KRdpGdoaGYlJh6f46Ylo6WmpyknpmTlJt6kIaDeIWXjZ5+gYqNjHOXop2gkpiOj6KMjIOXmIOTlpp/mI18iI2BdnF9bXpkgHyKhXCGkn+QgmuHgoF/iYRldW98h5OYjX2UeIyJfICHfXxygHiKh3mFkYqLmKKWgoSMd4iEgoF2eoCIhHRfd3d8c313ZmtkYH5panZyc3R9cHtjY2BzbXVybWFZYF5bbGRSYldfYGhrdXmGcGNqY2xmaHyDa2h0aGxvaH98gXhtj4ZxgIKCf3R8g4yBf356goN+fJBtdYl0dG1limxqYWN1VoNpcW5geGZsYmp2cGZ5e3lxYHJshoWQna6Ypqiejo2Xh4afk5eYfHepnIqYeZeci4uYj3h7gIt9fIN7gIKAeHN4enN9gIR/iIqAZF59i5WHfoSHdH1+in99mISWlJaMoqCXfnKHe5ORiqaPjI6KkqCRg5GPlJeRioGPmKCakpCSdICNkZOJnJ2eppiYjZWXdI6PimyGmJCZeoeIkIlvl52ZopOUioyfjIaCkpx/k5KVh5mIe4mJgXpxeWp1bHt9i31thZGCk3dvgYN9fouAZHJqfIGXmIV/jnSRiYN5h352eIF+h4F9hI6FjZSkkHmFg3SJh31/cnR/hoJsYHp0eXB7b2FuYmR7YW5udXJ3d3NzYXZfbmt1bm9dW15dXmpdT11XYmFobXN6iWtfamVqY2h3h21lbGhpbGeAfHp3b4+Hc4CDhH10gYaJeoJ9eoGEfX2OcnmLeXhubIdraF9pcWOHaHFvZXZnbWxhemhqfHp4cGF3bYuBmZqqoKSpnYqKkYaKnoqVl312rZiMln2ek5GWlIh2fXuKfHuAdnd/gHB0c3pvhX2BgIl+fGFcfo+Rhn+DhHN6gIZ6j5GHkZGbkqSblIF9gHyNipKkiI2KjZeajYWRmJOVjomJjJOdk5CMjW6EkI6RiJ6ZoaCXlomWkm+KmoVnhpqPlHqJhZCKcJaak6GSkoiLmYyCgJGefZKPk4yZjnuJhId0c3VrcW51e4p0boaQjZFxdIB7gYKIfGVxbXl+mpR9hYl0kYuBdIl5b4F/gYd9hY2KhY2WqI17iH1+i4V3fXBuf4SCYmd3c3RuemJeb2BqdF5waXp4eGxycGV4XW1sc21zWFpeX2FqWk9XWGRjZ3Fxf4dlXWloZmJncY1uZGlnZGlogHp3dW+OhHOAgYJ7dYKIhXiEfHeDhXqAiXd/i3x7cnmDamtfcGh0f2txbm1xZ29sZXtibX95dnFsd3eKf6KYoqihp5uHjIqBj5yGk5x0gKqUkYyGoIyVk5B/c3t2hHd4f3Jze4Vrcm95bYl2gICGbnBbWX6RjYiAgIB2dYB/f6CGj4qRnJegk5Z3iX6AjIicnYmPhpKXloSIlJmPlouLjY6NnYqOkIRuiYuPkYqclqCbmJWFmIhrhqSDZ4adipF/i4SLgXeTmJGdkZCIiZWOf36PmHyRjY+NmpJ9in+Cb3Zva21vcHqFaXODjpeJcHeAdIKIgnlmdG92gpqPfImFepWSeneJdHCKfIeNe4uHhImPnKOIfIR3gouAeHhuaX+Bf1xxcnFvb3daXnBgb2peb2l8eXBtbWptdmBwb2pxbVlYYWFibVdRU1llZmN1cISCYl1rbWRiZmuSbWBmZl9na4F1cXJwi4B0f4KAeHaAi4B5hX93h4Z2g4V8h4yAe3aKf2pxY3xihnxvcGx0amhvbHZ3X3F+eXt0dXR/gn6llZqtn6eWhY2Df5eVg4+edIqfk5KFipqMlY6LenJ3dIJwcoVzcXWIbG9tdW2Id4N9f21uVVGBq5SHgniAdnKCeYKggZGBk5KYm5GZeJF6goySpJqTjoiVmJKDhpaZjJOLiY+PiJ6FkIp9c4uFiI+InJmem5aUgJR/aYadiGiHoYiShJGDiXGDkZeOmo6PjIuPjXd7kpB6jouNkZaNfIh8gGt2am1ra2x6fmF5fY6VgXZ6gXeDjHx5Z3VsdYeWjH+IhnuUkXF6hXB4jXuLjXuJfoONkZ6ehXx9eIKLfXZwaGuAgXdedm9ta3ByVV1uYnFgX21teXBncGZnc3VocGthd2VdVmVgYHJTUE5bZmRdeHCIfF5caHJiYmVmkWlfZ2RaaHB+b2txc4p9dn2FgHR1f4x5e4aAeIiDc4aFfoyMg3t5lXhmcmqDYId+b29remBpbXR/dF90fHiGeHNyhXx5oZCasZymjoOKf4OaiICLnX6KmZKOhIiXjY6OhHZzdnOAcG+Fc3Bxg29qaXZtgm59fG10c1JOgt/JktaTfHB0g3WDoIKSd5SQmJuPmHuTcoWQn6GTk5CKkpuThX6WlYiNjYiRjYicgI6BeHqMfoiMiZubnJqVk3mNd2iKkohsiaSFkoiXg4ZjjJGYjpSJlouNiotxe5SJe42IipORiXqFe35se2Vyb2preXlbgHmPjYB6fX5/ho56emh0a3SLkIqChoV9loxsfn9vgY1/jYh+hHqDkJaam4t8d3iDj3hybGVwf4JraHRvZ2hzbFNebmRwWV9rcHhma2piZnhzb3BjX3dgYFZrX112T01LYGZjXXlxinRcW2V1YGFlZY5jYWZhWGlzc25rcXaLfHR5hoF1dn6Lc3+Gf3uJf3KJh4GRioh8fph2ZXNufGWIf29wa4BZa255eXNgdnp7jXZyd4p3eZ+Mm6+boJCChXeIlX58iZyHhJ+QjoWMl4STjoeBdXdweXFuhG9tbn5yZGR4cHxtenxqaGxjpJrB3K7voXNrdYN1hKGFkW6Vj5SflJuBkXCFi6OXiY6VipCdlYKAlZCFiY+AkoqKl3+He3V/iXiGhI2bmpeZjpB2i3dviIqMfYukhZKJnYWGXouUl4qOiI6LioSJbHuXgn2IhYmRj4Z2hX19a31jeHVpbXhzV4h6kYaEeX5/gIWMfnlmdGqAio+Kg4OAjJeGa4F2bomSg5GFf4J6gJGWlJmQdHR4h411c3BmdHmBYXNsb2FodWZSYHBna1VebXN5YHJjX2h9cXJtWmJyYWJXblpcd01NTGNmYV52c4ptW1xkeF5gZGaEX2NjXlhqcmtua3J3i31zd4SBeHd8iHGDhH1+iHt0i4iIlYaMfn6Xc2h1cXlsjHtudHCBWHB6dnlxZHd5hoxpdoCJcoCdiJmonKOShH1wjJR4eYqdg4SgjY58lYx/mYeEe3N3cHNqb4FraWx8dF5geHZ7cHR6Z2BlfOvatcnD3IhzbHOAdoqaiI1pl4+OnJSSgYhwhYigjoSLlYqMmJN8jZKIg4mPe5GLhpCCf3Z4g4Ryh4KSm5aTmIaMdod/cIaDioeaooOUjJ6DiWGDlY6GiYWJjIeAh2l9lH99g4SJjo2CcYZ+f3F3Z3ZyaXN3a1qMfZKBhHx/g4CEioJ2YnRsiYKQi4J/f5ORfW6CbHmHkIeThX2BfoGSlJGXiW5yeoyGdWxwanF3f15zaG5canVgUmRxaGZTX292dF9vYF1ognFyaVdnaGNpWG1XW3VMSktlZl5icnOFaFtcZXleXmRnemFkX1xZa25lbmp0d4p+c3OBfnp2eodzhYJ8f4d3doqFj5iBjYJ7k3Zsd3V5eZN1bnh6fVh5hnGAb2d4d5KCZHaGhXGKloWZoZuiioZzb5KLcnaOm32JmYiJe59/g5l/gXlyc25vZHJ+aWZsd3dbX3h6enFxf2lhZ2F/1baOkKZ4bnF3e3GSkIyHapiNiJuRi4Z7aIeLmYaBkpGGh5eNfI2MgICJjXyQjH6KhXp1e4J6cYWAlJiOkpOBiXWEh3eEgIuUnZ+Glo+ff4hhf5OHhIeDiY1/f4JmfZF/fn+CjI+Qfm2CfIJ0a212dHN2dWtjjYGOf4R+fIR/hIh/cGBzcYZ8j42CfH+SiXpxg2Z7hIuHjYR8hX6BlY+Rk4RucHmMfnVtbmlqeXxhZ2lpWGt1WlJpcmliUGJyeGxhZV1aaoNtc2JbZ19kbF9uVFpvTkhOZmRcZ25xgGtaW2NyX1xjbHdkZV1cWmxrYm1qc3aGf3Fvf3x8dHiFeIWCfICIdXmJgZKVfIiGdoiBcHh5e4STb217gXdeg390gW1penOUc2dyiH1ykpGEmp+boIaHdnaUf212k5d9h5CDio2ZfIuadn53cW9samF0fGdiaXV6Wl94fHltcX5lY2hoV52PXnFylrzEhHVxlIiQfnKWi4abkoyHcmqIj5aAe5SMgYSbjHyKhnx7iYx/lIh1ioZ2dn2BcXWFgZ2ThZSPg4NxgIh1hXyKmZ2Yh5SOnYCIZn2Tgn+Fg4mJcYF9Zn6Le3l+f4eLj31pgHyDdmZveHhzdnNsao2FioGJf3iBgIWDf2tfcnl7fo2KhnyCj4F+coFpeYSIjIaFeYR9gZiNkIx9bm17iX13dG5nZnt1YltwYlduclNTbnNoYU1mdHhlYF1cWG6Ab3NZZWFeam1gcE9Za1FEU2dgWmtubXxuWVtebGNaYm93ZGZbXWBsaWNsaXN2gYNxbn58f3R1g3qDgnyBhXZ+iIGWkHiDinSBiHJ5eH6NkG9ve4FxaYF4en5tbHt1lWtqd4R0bJSOhp6YoJmFiG59jHZpeJiOfoCKgpWXiXmOlm96c3BsamRgc3poX2Vxelpgcn15Z3F6YWVlj7Gyd0piWqTZ0JZye5CKkHd9lIqEmZGMhW5rhZKRenmShoCEmIp8h394eImKhJaAcIyIcXR9eml5hYOkkISTjIN+b3+Dd4R5hpyZlYuTkJSFiHB7koJ9goOIg26Bd2iAhXhyf3+Diod8ZX1+hHVjcHJ/aHhwb3WYjIWCinx2eICEeYFrXHF/c4GIhYl+hol7iXKBbnGFh4+FhXOEeoKZjY2EeG5vfoR/dnpkZ2l7b15YdlpYcGxOV3FzZ2BKbHZ0YF1bW1l0fXJvV2ddZmpwYG9OV2hRP1lmXlpvamd6cVpaWWtlWWNxeV9oXF5lbWhla2lxd3+Hb2x/foB1b4J7gIF+gn92gYWIl4pxgo1xe4Z8eXmEk4x1anp/bG9+dH99b3J7e5RvboF/eGaTi4OhmZySgoVnh4NwZ3qWiH1+hIGYiYF8jYxpeHJrbGZfYW54bV9ib3hcZGyDemFxdl9lZdTqvooyOj6LjoBxeIWIjo12g5aMfpKNjH9tbIWNjHZ9j3+FgZWIfIJ4bnaHhIOXd26IhWx1e3RmeYKDpouCj4uDfW6AdXeEeoedkYyRkpOMi4Z/e5KGd3+EjYNrf3JogH54bXx7gYqDd2J5hIFxZHFofm10cXSBm4uAfoV+c3V9gHOBb1ttf3V4i4OLe4eAfIh4enFsiYSQhItygnqAl4uLf3Rta3eAgHV1XGhndm9YVntSWW9kTFpycmVbSXB4b1xaWllddX50aFliW2dlbmNpTVdmUT1eZVxddWVgdXBaWVRvZFlkcXlaaF5gZ21namtpcHd9jmxpgoR+eW6AfHyBf4J6dYKBjZOFcICLbnd+gHt7iJKJf2h7fWp0e3KGe3N3fX+MeXiEfXxrjI2Em52WjICAbI1+a2h+jYx6fn+DlIF+fYqIa3VxZ2hiW2Jncm5gYWtzYWhwiXpic3ReY2SboI9uXDVZr7V0aYCIfJKGdYWWhXOPiol2cGyFg4d1eYl4iXyTh3p+c2d2iX5+mG9xhn5odnltZXmIhKSGgIeNiX5ufnaAgX2MmoiClJGYiYuEiXyPiHB7fYR7aH5saoB7eml6doGHgHJgd4F+cWRyZnWCbXV7hJSRgXyBf253eXx0fmxYcIB3dYyChniIdoKJenhzboqBkIGGc399f5OJiHpubWpugoJ1blxnZHJwUVp6TVpvXE5bcnBkVUtzeGlXWVlaYXGAdGBdXWBmZGhpZU5aaE5AYWRbYHVhXXVtWFdTdGFaZG9yV2pdYWhrZ21saXB3fJJsaYSJfHxwfn57gX+CeneAf4mLg3F7h29xd4R/e4mNj4Nqfnttd3h2ind9eICCh3+Dfn56bYWMiJijjYSDe3WLeWtshIiQeH17gZF/f36Kg3BycWNmXllmX29wYGBncGZqb4l0YXRvW2FkanZ7f76cpqPIuHGFg3KSfHiGk4JzkYyHcnJvg3uDdHWHdIh3k4h5eXFjd4d6gJNpcoR2Z3d1Y2p8goedgX9/jo99cn90hXqAkpGDeZaOlY+Igoh7iIhreHl+dWd6aGx/eXNpenaAg31oYHeHfWpqc2d7gGl2gIuQlH56fX5we3Z7dH5iVnd9cnOKhIJ9g3GHind4cXCEgo1/fnl+fXaOhoN2aXFpbYiCcm9dZ2FxbUpldUtdblVTWXNuYlFPc3hgUlhYXGFvgnNbYVxoZWVja2NQW3BJRGNhWmNwXl13aFVWVXdeW2VuaFZrXmFqZ2Vvb2hwdnqSbmmIjHh9cnt+eYKBgXx2fYOIhYNwd4NybneDgn2Ji5N/cIB7eHl6gYx0g3h/gYGChHqAdW9+ioubnoh9hXp3hntndIWLkHp+f3uIhYN2j4Bnb25fZFxYZVltcmBgYHBsa2iJbmBzaVleZG2Ad6naqceGh7JxiXdvjHV7ho6AepOJf3V0dX53gHBxf22EdJSGeHVrYHqCeYiPZnKEcGd2blttfICQk3+AeZGSfXl7bYh3gZKMhHSWipGOh4WFe3+EbHV2f21ndmVte3Vtand2f398YGJ4hXlodHVifXtndIaOjJV7dIB1cX96fG1/WVZ0f3B1hYd/gXlsiYZ0eWx1gISEfnt9eXtzi4F8c2d0ZW6LhG1zWmledGRHbW1MWmFXVlV4bWJQUnR2V1BVWF5hcYRvXGBjbWRkXm9iVF1yR0JmX11maF1be2JRVVx1W1pna2FWal9gbmVma3FocHV4jnRrjo11fnZ4fXeBg4F7c32DiIeDb3F/dHF1f4WBiY2Ke3d/eIN7fIWHeId8fYF+hIB7fnN2eYyOoI2Jeol2dIN5Xn2FmIx5hoN0hYaEd4l7Ym5tXGJbW2FWaXNjYFtnbm9mh3FhcWZXXGNrf3zKzoe5oWptbYpscYRxfISJfnuRhXl5c3l1dXxqbHVjhHWSgndvZl59gnqLiWZygmtqcWNYbXqFm4iBgXOXlHd/fG6JcoKLjIhymI6RiYWLg3t4fXFxcH1maHFibXhxamtxeH18elxkeYB3aXV4ZYJ2Z3SHi42UfHGHam59gXlufF1Ycn9udIGLfIJvb4p/cXZod3+BgIF3fXF7dYd8enJmc2FujIJrcldqXXZbSG1qTVVUXlRVe2thT1R1clBRVFZeYnSFaVxga2pmY1luYVhicEdBaFxgZl5dVntdT1VkcFpbamhdV2hgX3JlamdyZ3Byd4Z4bpWKdH96d354g4d/dXJ/hoWNgnBwe3h3dXqGhYaMhXp8f3SLfn2GhISHf35+fYd/fHh2eXiRk6B/jHyLbXWAeWODhpaFc5GKb4WFgXqDdGNuallfW11dVGdzZWBZZHFyZoFzYmtlV1tgaX94vq57oLdtYnOGaHN7cXmChXt9jH93eHJ2b3t2ZWpuYId1joFzamJef3h5i4RncX5oamtaVm93iaOBhH9xmZNxgHl1g26Bg5KIc5WIjYiEiYV9eHRybmh5YGptYG12amdqa3l3enZaZ318eGVyfW2EdGV1hYyFlX9vi2ZqeoN1bXViXHB9bHV9jHyBZnWHfW5xaHV/eH5/c31se3uBenhxZmxibol+bG1WaV92VUppak9RTmhNWXxoYk5VdWpMUFRVXmZ1g2ZdYHBoZ2FXaV1ba2hKRGpaYWRXWVV5WU5WbWpZXWxlXFllY150ZWxkcWdyb3WBeHCZhXZ/fnd/fIWHfXVzgoiAlYJuc3l7enNzhYaIiIN4gX11j358hIqOhIKEe36Lg3t3fHd3mp2XeoqChml2fXxsg4SSf3KPgnCFgn6Bf29mbGdXXVtcW1RkcGRfV2JydWl1cGVlYldcXGh/cG9ygHOJZGR4fmlzdXNygoR4gIR5d3R1bWt6cWJna2eGdI2DbmZdX31we4l+aW14ZmlkVVdyb42mfIN7dpaQdHxzfXtufHyRhneZfIiGg4aDfXRwcmxndFxsaF5sdGRnZml6b3tyWWeAdnRncIB3gXVid4WKfJSAbotqbXqBcWZzZWFuemdzeIp8fmJ2g3Zqa3F1e3F6eXR9Zn5/f3l3bmRmYm6FfG1qVWlhb1JKaGpPS05wR157ZmFNVXRjSk5TV2Fqdn5lXGdzaWVgVmNXYnBdTEtrWGNhVVRVc1ZMWHVkWl9rYVxaY2VfdmZtYnBpc25yf3V0moF3f4B3f3+GhHp8dYKEfpeFbnJ0fHp0cYSFj4GAeYt1dJB/fIGVjoCFhH1+jIZ7foB2e6OlinmIhoRrdXx6dYOBi3lvhXN5hH2Bg3VuamhlVl1bWlpTYm5kW1hhc3tpaG1pYGJXX1tqgGlrb4Bna2BoeXhqc3N0boSBen99dXVuemhqeWpfZW5ogXaQhWdlWGJ3aX6He29pcGdmXVVYb2eOqHeBenyQjnl1cH9wc3Z6j4B4lXWGg4CFiHZqcnZnaG5bbGRdbXNfZ2FqeGh7bVttgnJzam+Afnl3YXeEhHePhHKIcW95f3FjcGhccHhkcXSIfHlic4BwZ2p5dHJseHd2eGSDe394dnBkY2NufH1ra1VoYWVTSmtnT0dRa0VgeGdhTVNxXEpNVFlla3d6ZV9tcWlkXVZgVm5uV0tTaFdlXlhNVWtUSlx5X1tfa11dW2NlYHloa2Fvb3Vub3h1eph9d4CBeoCAh4V6eHmDfoGThHF0dH95dnSEiJB9gHyQa3OVgHuCn4V+h32Af4aCgIp7doSsn396iIiDa3KBeXWAf4F0boZufH9ziYBqb21kZFhfWllaVWJqZ1taXnWCaV5tbFxhVlxcbIFlcXR9aWlca3Z1Z3R3cmyFe319eXVybHloaXhmXWVyaHp3k4FjY1RlcGeChXd3ZmhqYFdWWWdjj6dufneAi456cHF9aHpveo18d49yhH1/f4ZuZHVzZGhoXGtiXW9vW2dfbXVkemhddIBvcWtxe311dWF0hYp6h4eAf3dydX91YXBtWnJ0YnFyhXx0ZXKAbGFse29qaXt5dnJmhXZ7enVxZGFlbXN+aWxUaF5cVEtyYlBGVmFHYnZnYUtUb1dKTFdYZ2t2emRlbnFmY1pXXVl2ZVVKXGNXZ1hZSFdlUEhieFpdX2xbXlxhY15/aWpfbnR4bm9udoOXeXKBgHx/iIuFfnV1hXiHjH1zdXWCeXp6gouOfX6EiWlzloF6ip19foV6gXp/fIaIc3GProx7e4ePfWVxh3lzfHt1cm6GbHt+bI96YnBvYmVdZVZZWVZjZmtgXVxzhWhYcG5aXldaXGx7YnB3dm1iWmxzc2d0dXBshHl+gHl3bm50ZWl0ZVtndGZ2dpJ6X11SZWZrg4J0fWJjaVxUWF1iY4+laHh0goWQeG1vemh4bnyFe3WJc4B4fHh/aGV2bWBmYF5qX11za1llXW9vYnplXHd7a25ub3d4c3RkcoOSfoeCiHp2b3J9c2J3ZFtvcGJxcYF8c2dygGRebnZpZGd5e3Vub4J1dH1zcWJfZm5vfWRpU2dYWFRNd19RSllYSGJ1ZGFJVG1TSkxaVmlscntibGxzY2FZWVthdltTTGNdWGlTV0dZYE5HaXVYXmFtW1tfYmJdhWhnYW54eWxvanaBkHhtgn6AgZKHg4F2dIl0jIZzcXd1gnd8fX6Mj4B+k35wd5WDfJmSeYCAeHl+f3SIg3NwmaJ7en+JlHhkdYh4c3d1a3Nufmx5fHCRcl5wb2BnYmxUW1pXaGNtZlxccYllU3JuW1pYWGBsdmNpdWppXlltc3Fsc3NzaYV8fn98dm5ubGRpcWNba3JkdHaOc1tXU2VhcoB/coJdYmNdU1pgW2ORnmVycYWEkXRsa3ptb3B7fHxxgXd/c3p6emRldWhdYlpgZ1tedmhXYl1waGF3YFt7dmlpcm53c3J0aHCBlIKGfoR2cmpwfW1md1dca25icXOBenNmb35bYHBxYV9qcX5sbHV+c3F4a3BhXGVsbHphZ1NmVFdRT3VbUU9YUUhjdGJgRlVqUElQWlVqa2t8ZW1ucWFbWlhZbHBXU09mV1doU1RGWlxOSHJ0WF9jbWNYYGBiXYtqY2RteXhrb2l1eYZ7a4N9f4SZfIKEeXyHbY+GcW93en10goJ8io6Cgpd0d4KThYGfiXWAgIFzf4Jxh4J1b6KXdHuGi4Z7ZXeKbm56bmZ3cHprc3ZyjGtedG5hZ2VrUl1bVWdhbGxaXHCMZE9vbl1WWFVnanRnYnRlZV1ZbnRtcHV1eGqGfH98iHaPc2Rka25hXG5tY3N4h2taVFZjZHh9fXGFXGNfY1RaYFljlZVjbnCDhYpzamh7b2Zzd3N8bHp0dW96fnVeZnJjW15WYWRZYXRlVV9gbWRhcV1dfm9oaXNxc3B0dWpthJKBiHuFcXJmbn1wcm9TW2ZrZnF0gHZzY2x2VWJya1peb2Z9Zm13fXNzc2ptYFpkamp3XmZUZFRVUFRtV1FWU09HZHNfYUVYaU5IV1RWbWhkfGlrd2tiV1xVW3RkU1JXaFFZZVRTSFpaUE14dlpfZWxpWWJgXl6ObmFmbHl1bm9odnZ/f2yDf32Gl3t/h4GJfmuTiHJndIB7dYCCfIiOf4uTcnyKkYWHn4Z7f4aMc4GGc32Ddm6ljHOBjYt2d216jGBke3BmeXJ4bG1xdoJnZHtsY2ZnaFNfXlVnX2xvW15ujWhOaW1gVFZTb2dzbGZ4ZGRcWHB0bHF6eHJsiHt/dpx6eWthZWxtXmBvamVxeX5nWlZYYGx4fHtwg19iXmdXWF9XZJuIYmtxgYd9d2treG1cd3Fse2p2c25ve4ByWGpuX1ldVWJjWGRxYlNeYWhiYmxaYH1rZmtzdW5td3ZraIWLfoh6iG1xZXB9bXJtY1lhaWlvdIF0c15pbFNlcWRVYm5iemNxd3t2a3Btal9YYWdodFxlVWFVUk5YZVJPXE9PSGRwXWNGWWlNSV9LWG1kX3hobn1kYFReVF11XFRTYGZOXWFUU0pcWVBZdXVdX2VtaFhjYVtejXBjZ2p3cXNuZ3Z0eoNygYJ5h41+fImHjnlukIp0bHOCdH9/h4SGkYSVj3l+jI+HkZuEgHyMhHKAgXN0d3Fuk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2Ojo6Njo6Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjI2MjI2Mjo6Ojo6Ojo6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPi4xMTExL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCTqWvra2trrFhQERERERDWGhnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI8tGh0dHRwaaIWCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTNBqba0tLS0uFkwNTU1NTRNYV9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmIiIiIiIeOkJCQkJCQjIeHh4eHh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaPkJCQkJCRiYWGhoaGhYeJiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkZKRiYeOipCSk5CKkY+MjoWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyLi4yMjIyOjo6Ojo6OjY2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoeKiIiNiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCPhoqFho+JjI+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkI+Jh4eIjIiOj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4aIh4aMiI+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiY6Mi42Mjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9+f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHV2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2hoZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUVAPjo7Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs5OTo4ODs9OTc5Ozs+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1c3F0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08Ojc5Ojo5ODk5OTg4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Oz09P0A+PE1MOTw9PT08PDw8Ozs6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NEREE+PT5AQT8+am9CPT9DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0ZEQDw8PUBEREVteUk2Ojw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz9BQUFCQUBBWEA+W3h8e3l5Uzc6ODg6Oz0/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNBP0Z4WGOEhISDgntfOz49Pz49PkNEPzs8PT4/PT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fHx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDREE/SnR4gIGCgXuDgWg/QUBDQEA/QEA+PTw9QUVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt7fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQUBMc3yAe4KDfoWFWT5DQ0VAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVGRkZKTk5LSklHR0hLTUpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRUpwfX99g4WGhodoQUVFRENXdYaJin5YR0hKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpITXJ/g4SEgoWHiIpVQUFVdIeJh4eGh4JXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0ZJS0tMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTExMZ4CEhoOAhIiJjHBObYSHhoaGh4eHh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUtJSUdISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3J0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMTEpTgIWGgoCChIaHg4CGhYSEhYaGh4eGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkREQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISEpKSl2FhYSAgoWAgoKDhISFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QDs5OTk9PT48PD1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lJYIaEgX6AgoSDgoKDhIaJiouMi4qJiouMiVQ7ODY1Njc2NjY0NTc3MzQ2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzU3OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt7e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0JehICAgIKDg4ODg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6OTo6Ojw4OTg5Nzc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09RV2tycnR0dXd5e3t7fH1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PGqGgYKDhISEhISGiYqKiIeIiIiKioyKiYmMej46ODg7PD0+OTo6Ozg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8PDk7PDg6Ojs6OTk5PD88PUFCRElKTUtKS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojo7Pz5FeoSBgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUBCPkBCQEA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEBAPz9BPT48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhxcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PT9AQ1CBg4OEhYSFhIaJiYiIhoaGh4iJiouLioqKi4qLXj5ER0lLSklGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURFRUFGRUZFRkZEQEI+PEA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUFAQ0RGVoOCg4WFhoaGiImJiIeGhoaHiYqKi4yNjIyLioqIV0dMTU1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AQEE/QkJHR0pZhIKDhYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlJSEpGREdISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA5ODw7PD06P0A+QEBDRklJUGCCg4WEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSEdFSklESkhHTEpISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVbnF1dnd5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH9/f39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDk6PDg9Pjs9QT4/QURHSkxWcoOEhISEhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIuLi4teUVFQTU5NS0pHRkNHSkdMSkdLT0xLSkpNTUxPUE5ISUtMT1FRUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkBCQlxvcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBR0tMUFd5hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVVJSVFJPTEtKRUVGS09OT1dWUVBPUVNSTVNUT01TTFBTVVdSU1FQTEtNTU1LTkdHSkZGSEpEREVFQkRDY3B1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj9CQ0ZWTkZNT1BUWXyGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOzpRU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLR0hJSEVGSUhJSElqcnZ5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0dGRT8/QUFFQkNHRURFTFhSTVRVVlhbfIaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A+QFZVWVxkYFZZYnJeXVZdWlZFUVlaW1lfVFlnUlVWWFRUVlNPT01KTEpJSUxNS09NU29zdnh5eHd6enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH9/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNTV1paXFx4hYSFhYWFhoeHh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JWVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUlGQkRAQTpQUVFXWFBQT1FTVFRXWFhaW26BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWFNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaW1hcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm5ydHd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUVVTVVRXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlVTVF5aWFdXV3prWFpcXF5TUFBQSU5PV1ZYW1pkcXN2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAf39/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUVFOS1JUUk1PWVFNTlFTVVVNUVNSUE5MTEhDSUhSU1RaXG1ydnZ1c3N3e3p7e3t9e319fX59fX1+fX5/f39/gH9/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lVUUxJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5DQ0NDQj9EUEJEQEM+QkhHVkBITk1HXWlQSEZPRkRFRkhHSEJDSEdISkdDQkFEQE9QTVNkc3V2dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWViXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHJ2e3t4eXVybnN0c3l4fn6DgIODgoCCgIKBgWtMRz4+Ojs+QD8/Pz5rUUthRUZISUVCP0dMTUdNUVVJQkU/Pjw9PD09Pz0/QUNCPz48PUI+Sk1GVW51dXVzdHZ4e3x6fXx8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXp4enx8eHd4ZEJAQEE9OkJDQUFEQlxdT3tOT09OS0xNT09RTEtMV01IR0BCPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV1dnV2d3l8fHx9fHx9fX5+fH19fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJUVlhTUllUTllaW1dZXV5eYGVgXV5xdmteYGdrd29vbGpvbm5sZmJZR0ZGSEJBRklFRUZETVJQYVdSWFFQU1NSVVtPT1FWUE1JQ0Y+Ojo2NDg2OTc5OjM2Njc5NjxCPWZ0dXZ3d3l5e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01MVFRTUVFVT0xSU1RXWFRUWFFMWFlaVlhYVlhZXVdXWGhza11WYHRrYWFfXWRgX15ZVVBNT05MSUdKS0lIRkNRUFNaV1RUTVFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1ODhHbnJ1eHh6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BYVlZTVFZPT1VWWFhZU1VUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5OTkxKRlBQVVlTVE5KTk9UU1RcVlJVU1JOTUxJSEhGPz89Ojc4NzY1OTk2NzY2NVdxcXR3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1VUV1RSWFhZWVlSVU9KR1BQT09NUkpPUFBQTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFFQTk5NUE5UUlBSTElMS09RUFFSU1RRUk9MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVXVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjNAPmpvYVJSUUBGVFFQUVBRTlFPUE9MSkxMT1BOTlBRUU5RT0pMTU1LR0VFREI7PTw8OT1HNjY3NkRucXV3enx7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JDOEVOU11mUlFTQUdVUE9RUVBNTU5NS0xLTE5PT1FNT09NSU1MSUxLTEtHRkZFRDxBQT47QEU7PDg5VHFzdXh7ent8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0A/PD1BQEI9PkVIR0RGRklHS0pARkFBQEZIRUpPSFBRYVxRUFJOU09PUExMT01LTUxNT05bVktNUU9ISkhDSUpMTEtGRkZEP0JDPjxCRz9CP0FkcXR3enp7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj47PkFAQD5BRElFQ0hHSUdJRUJCPz48Q0JBR0lETU9hZVBMTk5XS0xOS0xNTU1MS05OU2RNSkxSSUlJRUFISkxNTktHSUZCQUJAP0VGRUhES29wd3p5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPR0tFP0I9OTk5Oj9CPzxBQkJBRERHS0ZESUlHR0hDQz9CPz9AQT5DRUNLTlFUS0pITVRGSUlKTEpLTElJTE1PUFJQS0dDTEdDQ0pKTE1PTklKSUdDQ0NESUpNTElac214eXh6e3t5fHZycHVydHl5dnhqcW5qbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxanFoZXFIS0NGSEhHSktJSkxER0I9Pj06Ojo7QUI/PUJCQ0NIRkpMSkVJSUZHR0NDO0FAQj5AQENFQ0lNT0dIS0dIS0RISUtNSEpMSEhKTEtNXVJJSEROR0JFS0tOTVBOS01KS0ZHR0pNTlFOTGNuaXd2d3t4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkb0ZLQ0ZFR0RFRUZFR0NDQD48PTo7OjpAREA+QkNFRUlGSkpMRklJR0ZGREI7QkNDPkBDQ0NFRktNSEtOSERIRUlMTk1HSUxHRUZJSUxOS0pIRU9JQ0dNTU5NUE5PT01MSUhJT1JRUk5SZmdmcm9zeHV7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lDRUZFQkNCRUBEQj4/Pjo7Oz07PT9DQT9BQ0ZHSkdJSUxIR0dHRkVDQD1ERUI+QURDQ0VHSElHTVBJRkZHS05PS0ZISkZFRERJSUhLSUZIUEtESk1MUE5PTk9QTkpKSE1SVVRST1dkYWFtZ3Byb3N5emdlaGhjaWxncWxmbG1naWtsc2xwdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NCQUJEPUJBPkE9Ojo9Pzs+PkBCP0BCRUdKRkpHSUdGRkZFREJBQUZGQ0JCQkRFREdHSEZMUExJT0pKTEtJR0hFRkVEQ0lISEtKR0tSTUNPT05RUE9PTk9PS0tLUFVXVlVUWGBeXWlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNxcmtrc01GRkVIQkJBREQ8QUFAQzw4OT0+Oj89P0I/QEBERkhFSEZGR0ZGRUNDRUJESUZDRkVCRUdFRUZHRUlNS0hRTUpLSEhJRUZJSEVDSUlKS01LUFNORFFTUVFSTk9NTlBNTE5TV1ZXWFZYXltdZGBoYmppZ2tfZGVmY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hCQkJGRTxAQ0JEPDc6PT47PjpAQj4/P0NFRkRGRERHRUNFQ0RFRkZKRUVJR0NHSEZIRkVDRkpKR01KTEtJSkxGSUhLSEVLS0xNTk9SVE9JU1VUUVRQUU1OUU5NUVdaVlpZVlpeWlhhYGBgX2hlY2BkZWdnamloamZobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9yc3lNSEhHSURBQ0hFPEBFQ0U9ODo+Pjw8PEFCPD8+QUJGQ0VCQkhDQ0RFRkZHR0lGR0tIQ0hIR0lHRkRIS0lHS0hNS0pLTEhMSk1LSU5MT05PUlVWT0tVVlRRVFFSTE9RUE9UWVpZXFpZW19fXmBjXlxhY2tiYGRnaHKFaGdpZmptbnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtJS0hKRUJFR0U8QEdEREA5PD5APz4/Q0I8QD5BQUZDRUVDSERGREdGSEhGSEhJS0pFSkhIS0hGRkxISEhKSExMTExMSU1LTU1NT0xQUFFVVldPSlZWVVNTUlFMT1JSUVZaW11eW1xeYGBhYGFkXWRgZWZgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd293SUpMSUxHQkVERTxARkREQjs/P0FAQEBEQUBCP0FDSEJFRUZHRUlFRkVJSEZJSEpMSEhKSklMSkZKS0hJSkpHS0tNTUpKTUxOTk5PTE9QUlVXVk1OVFZVU1JRUE1OVFNSV1teXl9dXWBgYWFhYGJkZWJjaGJkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV0c3BzdnR1dXd2dXV0ZXFza3BxanJ2b3dKTExLTUdEQ0FEPD9FRUVDPUFBQ0JCQ0VBQ0RBQUVHQ0hHSEdGSkZDR0pHR0pGSUxISUpNS01MR0tJSExLTlFLUlFMU01LTk5PUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV9gYl9gZWFhY2luaGJpaGhteHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJycXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0RBQEQ+PkRFRkNAQ0FFRERGQ0NFR0NCSUVCSEpJSEhLRkRLSkdISUlJS0dKSk9LTkxJTEhKTUtaZkpkXEtsUkhOTl9uVWxzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmXGx0YGxqVF93dmlqZ2lmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj89REVGRENEQkVFREZCRkZHQ0RKRUVKTExKTE1HR01KSEpKSEtKSUtKTkxNTUxMSUxNTFtzYmRwXmxsVU1OZnNdZ2VxbG50Z3BpX2FZbm1icHBia2pqZ29xdGV0bm9ccHVncE1Kcnl2a2Jga2VlbXhta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0JCPz1CRUZCRkNFREVFRENISEdERUtHR0xNTUpNTEZKTkhJS0pJS0pKSktNTU5NTU1LTk1NW3Jvb25wcGxrTVBRbFdOaWJ0cnBhbW92XFlsUFttbVpxbWtvbXh4dHNpcFxgc2xxalV1eXhwY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hFRUVCQkI9Pz9FR0JHRElFRURCRklISEVHS0pHTU1OS01OR0xOSUxLSElNSUtKSktPUE5OTUxOTUxcaGR1XWxxV2xOT1FtVVprXmtsdmFsZHRUZWNObFlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdnYWRpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSURFRUNBQjxCQEJGQ0dGS0dFQ0NIS0hIRkpMTEZOS0xSUkxHTU1ITkpHSE5ISkpJSE5PTk5MSk5NSlpzcHBvcXFtbE9RUm5ZcWtnb29xcW9tdF5uWGF0X25vcG9xcm9udXN0dGpbXXRjd3hyam56aGFhY2ZiYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRIS0hJQkVFRUFAPkNDQUVDSElNSUZDRkpMSUdGSk1LRk9KS1dSS0dLSkpOSUhKTElLSklISkxNTUxJS0tLU2tiWmleX2pjcnJaX1lqb19lZVVrX2NbYWJRYG1oXGpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRklERURGQUBBRURDRkJISkxHRkNGS0xJRUZKT0xJT0lMW1FKRkhIS01JSEpJS0tJSEpHS0tLS0dISkpMTExLSUtMTlRbXFRQVE1QT05PT1ZRT09RT09RSkpOUFFkcWlUWVdbW1xVWVtdWF1cXGNmYWFmYmNlX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzR0NFR0ZGQUVDP0NHREVHQ0lLTEhGREdKTEhER0lQS0xPS0xXTUlFRUhJSkhJS0hMSkhGSEhKR0dJRUZMSElLTkxJT1xXXk9cW2BeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZF1iWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRElFR0dGS0pLSEVFSkpKR0VISFBKTE1KTVNJSEVBSEZKSUtLSUxKSEZFSkhFRkdFRUpHQ0pNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOX1xeU1teY19aXWBjYFlfYltgXltUWFhaX15kYmJhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklJREZLS0tFRkhJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRURERUJGSkRASktJT1tjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtRW19hYV5eY2FgYmJiY2NlWlJZVlVcW15jYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkNHRUJFR0hGR0hJRkdKR0hGSEtJTERDS0pNTUxMSEpKSEpHP0dGTkpLS01LS0tJR0hEREBEQUhJQT9ISUdPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUFBdX2FjZGNjYlxkY2JkY2ZYUVVUU1xYW2FfXl9hYV9kbGttampsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1CQElGQ0ZLSUZGR0hHR0pGRkZJTEpORUNLSkxOSkxJS0pISUdCSEhRTUtLT01LS0lIR0VEP0VCSEhBQUZGRFRdWV5YX1lfW11VWFhQXV1RS0pXXlheW11WWmBSUV9fYWJhYGJiYGNiYmRkYlhPUVJSW1NcXl1eXl9fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSENSS0ZISEhFRktKTVBFR0lJS05MTElMS0lJR0RIS1FPTUxQTExLS0hJQ0VBRUNIR0JBRkVCVlVFXFRdU1ZfWE5UVU5aW01KS1VgYVtfWF9eYV1PWWJcYGBfYmNiXWJiV19fVFBPUFFYUl1cXF1eX2BhZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJUmNQRFdfSUdHSERGTUpQUEZKSUpLTkxLS0xLSkpHRUpNUVFOT09NTkxOSEtBREFDREZEQ0FERUFMSENMTFBPT0xGTUZHSUpIR0xMTU9RSUxPUFBTUExRU1JVWllXWVhYZFZPU1RQUE9OUFVUXFlZW15eYWFlZmNoY2ttcXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXkxHSFlNR0hKSEdOTFFRSUxKS0tOTlVOT0tLTEdHS1BTU05QT05PTk9IS0VgRURfTERmY0RNW0heXHNtT01WbVlMQ1BfVWxXZ0pdWFZeRExRVUxNVFZRUlRYV1RYVVRcVFBmWmhoZFlUa1RXVlVbXFxgYGFiYmJgZ2lnbmxocnp8fX6BhISEhIODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09USUtHYFRISk9KSU9NUlFLTUtMT1JVUk9PSkxNR0hNUVtZT1BQTk9QUEpLUH9RSXxZWXJzWFBtSHFub2FWUHFxc1BDa3NtcXNwU29fW25YXVZcWFVraFVdVmNaYFlaX1ZVV39qdHV1X2F2X1hiXFxmW19hYWFiXmBiZ21wbGBwd3R4gYGCg4SCf31+gHZ4emx2fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdJTEZSVkxLT0lLUlhXUU5PT01RVE5PUVBLS05HTVBTW1pUUVJPUFBQS0haeF1UeGRoWVJUUXZndGxwYm5ma1FyT013bWpycHNycXJwb3CAXWV6dXhxcXpxfnN9a3V9YlJofGVzc29zc3x9b355b39yX2BgYmFaYWBna25rYmxmZ213foGAg357eHeAdHZ6aXJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpQT01NSk5WXllVTFFTTllZTFNTUk5MUElRUlRZV1dRVFBQUFFLR2Z4bGN4cW1aSkxVeXB1bXVibnZQZGVKZnZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/cGdvWHZ2anZ1cIBhc2h9aWx4fG9fX19jYlteYmRnaWpkZ2JjZGxscHBzdHNzc3lxcnhibHRncnl7c3N1eX6Bc3V6bnx9eXhybk5KUnROQ0JFUFBJS0tKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSVNUVVhXV1BVUE9OUkpMcm91dXF1cWRoYVZuTHFwXkZoeVd2VEtoeH14YHl7c25hXm1vZFJncnVubXlwd2x2c3RxbG1cc356a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGVlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tS0taVkhHRUdSUEpMTUtMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5JVFRWV1lXT1NOTk5RSFJtSGl3S2BkdnZVV2xPbmx7c2FqZ392VUtXa2h9bG1seGBbcHp7XmB6c2Nyb3hxaGR8aXJ7XVRLbF92dWtpdXt7bX54a3xwXV5eYlteYmRlZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtobG1yfGttaGt7dG1ta21PR0pLSEpISFJRTE5QTUxTU1JPU1NXUlZUUFdaVlZUVFRhYFFPTktUU1NRVlZPTkxNT1BKSFFOUFVMS0tTVFJSVFBWVVFRTlFRWFhRTlBVVFhYWFtbVVNTV1tXWFdaUFNVV1dYUV1YVl1VU09YUldXV1haYFtncl5bXFtdXl9jWl9jY2VmZGNjYlpjY2ZmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFFJS0tMTUtKVFJNUVFQTFZVVFBUVVhVWVVSWl1WVVRXVVlYUE9MTldUUU5VU05QTUxRUEtKUVJLUU1LS09RVFJRUVNTSUhNTk9RUlFRUVRWUlhXXFdTU1BRVVVWVFpRTlNSV1VUWVZUWVVTUlVTVFVYWVdeWl9hXVxbWlxcYGNcXWJiZGdlZGRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkY2ZoUEpLS05PTE1UUU9UUVFNWFdVVFVXV1daVlRcYFZXVllVWFRRUEtPWFNQTlVQTVJOS1NQTU5VVE5RTk1OUVNQVFFTVFVOS01PUVRUUlJRVldVWVpbWVNVUlRXV1dZW1NPU1VXVVRZVVZZVFJSV1VVV1xZWmBdVllfXV5dXF1gYV5bYmJjaGZlZGJYYGBiXWBoZWZkYV5fXV1eWlpfWl9nYF5dXWNoa2FnZmhmZGBiY2FQS01MUFFMT1RQUFNRT1FaWVhXWFpaWFlWXWpkVlhZWldWVFRPS09WVFBPVFBQUU5NUVFPUlhUUlFPTU9TVU5XUlRVVU9OTlFTVVVUVFJUWFZaXVxaVlZRUldYVltcVlBTVlVVVlhUV1dUUlJYVlVaX1peYF5WXl1eYF1cYGBfX1piYmRoaGVkYlliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST0xQU1JVWlVUUFBMUFdWUVdTU1NYTU9QUlRYVVVVU1VZWFteXVxbVlJPVVZWW1tXUVNXVVZYVVNYWlRTUVlXVlxeW19fYFVhXGBhXmBiX1xgXWNhY2dpZGVgWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFlcW2BeX1teXmFgX2JcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWF5cX1dcXmpwd3l/Y1xbVlZYUk5PV1NOUVFQUlRSTFFUU1laV1VPUk5TV1ZUUlRSUlpPUVNTVltWVldUVlpYXV5cXF5WU05UVlZbW1ZRVFZWWFlSU1lcVFJSXFhaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2lkZl5cZGBhYGFjZF9iX1laXltcW1lYWVdXWltaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFpdXl1bYFxgVVxdaGpyfXJsaFxVWVdRT1JbU1JRVFJUVVRLUlZVW1laU09TUlZVVVNOVlJTWlJUVVRYXFdYWFNYXFheXVlbXlRVTlZXV15aV1FUVVhYWFRWWFtUU1ZdWV1dYV5jY15ZYFtlYl9kZF5eY2NhXWVmaWRmXV5kYWBhYmNkX2JeWFpfW1xbWFhYWFdbWlxgXVtbXFtYWlteVl5ZXVBPT1JaUFpVVVdWVFRUXl5gXl5iXGBVXV5ia3l0bH1sWlVaVVFRU1xUVFRVVFZZV0xSWlZdW1xST1VTWFZVU1BXUlNXU1dVVltdWFtZVVpeV19eWVxaUldSWVhZX1pZU1RWWllaVldZXFZUWl1cXmBhYGVkXV5dXWVhYmZkXl9kY2BcZ2RoZWRiX2RhX2FgYmJfYF5XWF5aXFxaWVpXVl1aXV5bWltcW1dZXF1WWFddU09QV1lQXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXWBemhYWVpUVlNWXFhXV1ZWV11YUFVcWV5dXVRTWFJYVlNSVFhSU1ZUWFhYXV5YXVtVXl9YX19YXFZSWVVZWlphWFxVV1daWlpYWVlaWFZdXl9eY2JiZWVdYlxgZmJlZmRfYGRiYltmY2hlY2ZhZl9fYWFhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlNaVlRcVFZXWVdWXGBhYmNhZF9fVltgZGFfenVvaFpcWlZYVVdbWllbWVhZYFdQVV5bYGFcVFVYUFVWVVNWVlJTVVdaWlxfXlpfXFZfX1pdXlleVlNZWFlaXWJZXlZXWltbW1paWVtZWV5fYGBkY2RlZWJkWmJmY2dmZV5hY2BjXmNjaWRkZ19nXmJiY2FhYF5fWFRaWlpbW1hbWFhcW1pbV1daWFdcW1xgXVZdXVNQVlpWVlpVWFVYV1heYGJhZGFkYV5ZWWFkYmBsZmheXF1bV1hYWVxcXF9bWVtiVlRXXl1hY1xTVlhQVlZWVlZWU1VUWF1cX2BgXWBdV2BeW15cW15YVlhYW1tfX1tfWFhdXF1dXlxaXFhbX2FeYGRjZGZmZmJZY2VlaGdkXmNhYGVjXWZpZGVoX2deY2JjYWFgX19bWFlbWVpaWFlYV1tcWltXWFpUWV1cWmBcVV5iTVJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9cXF1YV1tbXV1fX1xaXWNYWVhdYGNkX1JYWVBYVldYWFdWV1ZdXV5gYWFfYl5ZYV1dXlldXllYVldbXGBeXF9ZWl5dXl5hXVtaWVxfYl9iZGRlZmdnYlpkZmdpZ2NfY15hZmRaaGljZmljZV5iYmNhYGBfXV1aV1tZWVhYWllXWltaWVdYVlVbXV1dYGBiYnhLV1dcWFddXFxdWldcXV9gYmRiYmFdYFhiY2JgY2FjXlxcXFhXW11fXWBfXVtgZFxcWFpjZWNhUlxZT1hXWVtaWVdaWmBdYGJiYGFjX1xiXV9dW19eWVlVWF1dX19eX1taXl5gYmNcW1dbXWBiYmNlZGdmZWdkXGVmaGlmY2FiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXV1hQWFpdYWNmZnJrf0pZV11aWl9dXF5cWV1bXl9hY2JhYV1iW2JkYV9jYmJdXFtaV1hqcWBcYF9dXGFjX15ZWWNlZGFUX1pRWVdcXVxbWltbY2BjYmNgYmRhYGNeYFxeX19aWFZbX11cYWFfXVtgYWJlYl5cU1xfYGNkZGZlZ2ZlZmVeZWZoaGdkZGBbZmdeYWhoYmhoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3p6ent7e3x7e3t7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3p6e3t8e3t7e3t6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmIjbG1tLS0s7WVh4mJiYmGs9bS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIuRu8C/v7+/wZqKjIyMjIi/6eXl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eHh4eHh3d3d3d3d3eHl5eXp5eXdvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2AgYGBgICBfnx8fHx9fIGEhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ1dXV4dnZ2ent4e3h3dnh7d3l6en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3p6enp6eXp6e3t7e3t7enp6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx7fHp5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHx9fXl7enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3d6fHx8enx5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6en18fH16fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5e3h6e3l5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh4eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+LiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChISCg4KHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYCCg4GChYWFhYaGh4aFhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OCg4WEgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4ODgYOEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgYKEgYKBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYiHhIGCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoKBiJGCgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKCgoKEgoKDgoKLmIeFhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgYKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KEhYSDgX9+fIibi4OEhYSEhIKBgIGCg4KChIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgIONhX58fn9/f5mPgYKCgYGCgoGAgoKCgoGCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42Lh4SEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+Ag5aKfYB/gop/jY2BgYOBgYGBgoSDgYGCgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgICCmo2Ci4KCg4B/hIODhIKDg4OCgICAgoKCg4KCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhYODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgoKYjISFh4d9f36AhoWFhIWCf319fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhIaFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWEg5KIgYGAhH9/fn2Fh4aDgH5/fn5/f3+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoGCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISEhoOBgISMgn59fYGGgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoaGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoOEhIODgoCBhYSDgoB+foB/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiIiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eGhYODhYSEhIOBgIOFg4KDgoGBgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYqLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+RjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODg4CBhYSEgoKCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWDgoSEg4SDgoKCg4F+fX1+fn5+fn19fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeHiYiDg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaDgoKDhIKDg4SCgYKBgYGDg4SDhJGSkY6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGhoKCg4ODg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GDg4SFhYWDg4WEhISEhISFhIKCg4GEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoCAf4KAgIGDg4ODg4KCf319f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYOEgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhouTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn2AgoODgoOCg4J9fX5+gICBgH59fX19fn18enp6f4KCgH9/f39+f3+Afn2Af3+AgIF/gICBf3+AgIF+fX1/gIF/f36AgIB/gICAgH+Agn+AgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fn6AgH99f359foGDg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enl6gIB+fn9+fn58fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af39/fn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f31+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7f35+f39/fn1+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH59gH9/fn5+f39+fn99fHx9hZOSjoyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoKBgYKAgYODg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gH+AgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEhIODg4SCgoKCgoF+fn19fX5+gH19fX19fX19fXt6enl5eXmAgoKChIOAgoOBf4GAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoWGhoaFhoWBgYODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WEhIWDgoODgoODgoKCgoODgoKSkIuIiYeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgH+AgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWGhoeHhoeHiIaGh4eHhoeFfn19fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKOjImIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAgICBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSDhYR+fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3yAgoOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYiJh4WGhYODgoGBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYCCgH59fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWChJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+fn1+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn5+gIJ8fH9/goCCgH58e4qCfYB/foGAgIGCgYKAgICBgH+Lk4+Mi42OjYiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGh4SEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSRjIyNjY6KhYaGhYSEhYODgoKDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKCg4aHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2LjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKNjIuOjYuKhoSFhISDg4ODgoKCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gH9+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CKj4yMi42LioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gICBgYB/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH17f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYOBhYaFhYaGh4aBhJGOjIuKi4eIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fHx7fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3t9e31+fn+AgIOHiYmJi4mLiYWIkY2LiImHhYWDgoKDhISDgoKCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foB/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn1+fn19fH19fX19fnx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+goWIh4iKi4uLiYyQjo2JiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjY+Ni4iIhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58fn+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiNjIqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGDgX5+gIB9foB+fX5+gIB/gX5/gH9/f39/fH9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXt9fX18fHt8fHt7e3x7fHx8fXyJioiIhYWFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fYmFhoWFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp+fXl4dXSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAhoKEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl1dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKEf4OCgoKDgoOBgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXV0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX9/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Ag4F/gIOCf3+Af4F/gH98e3t6fHt8gYB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fHx/fX+AfH9/fX2BgIB+fX2Af36CgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYGEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4KAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fH19fn16fn19eH5/f3x8fH5+foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgYSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4ODf39+fX5+fn+AgICAf4GCgYB/fn+Bfn+AgoKAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFhIODg4ODgoGCg4KBg4J/gX9/f35/gH19fX1/gICAf3+Af3yAf3+BgIGAgH98gH99fn5/f31+foCBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZweHlyeIWFhYWDhIOCgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gIF/e4B+gIB/gYGAf32Af35+f399fX1+gIGBgH5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fXx7fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH+AgYB8gH+Afn+BgH9/fYB/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+gYSCgoOFhYKCfn58e3t8fHl3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFycHh3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB/f399fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGBf4KBfX6Bfn6AgX+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/gYF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoOCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e45+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICCgoF/gYGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHt7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgYKBf4CBgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg4B/goGEg4OEgYGDgIKDgYGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/foCAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31/eHd2eXl5fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICDgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYB/goGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fX96eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGCgoCBgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn6AgYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoWGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fX18gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhICEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgYSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoGCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/f3x9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+ChIODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4SEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgH+Bg39+fnx+fX1/gYB/fnx8f39+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhISChIOGgIKFhYqJhISDhIWFg4eGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIF9gXWBeYN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WCgYSDgH99fX59fYGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhIOFhIGDhIWDhIWDioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBzgoN/g4N9gX1+fn1+goOCfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugId5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYGAf3x/fXyAfoCAfn6AgIGAfn5/fn6Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKGhoaFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhIWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYqIhYSGhoWFg4WGhYaGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJiYeGhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoSHhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFg4aGhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH17fHx9f358fH59gH99f4B+foB/fX18gH1+fn5+fn58fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYSGhIWGhoeHhYeGiYiGhoeHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhYWDhoaFhoWFhoaFhIOFhYOEh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fnx/fn19fn58fXx/fH5+fH2BgHx8fH18fHx+ent7fH6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoSGhYaHhYWGhoWEg4SEg4OHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWHhYSDhIODhIeBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19f318enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4SDg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhoWCgYKCgIOFgoN+gYGBf4OBf35+f31/fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiIaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFhoaHhoaFhoaGhYaGhIOEhYKBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChYWGhYeGh4SGhoaGhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhIeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIKFhYaGhoaGhIWGhoWFhoKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhIWFg4WFgYCDg39+f4B/f4CDf3yAfX1/gn2AgX5+gX5+fn19f3t/fHt6eXp6eXp6fHl6ent7e3x6e3t7e31+fX2AfX18fH2Af318hoOGhoaGhoOEg4aChYGBgH9/gIB+f4CCfH5/f36AgIGCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWFh4aFhIaHhYeFhYKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SDg4SDhYSAf4KCf31+f35+f4R+e398fICBfYGAfX2DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SFhYSBg4KDgoSDg4B/gIF+fX1+fnx+g358fnx8gYB+gn99f4J8f359fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWDgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYGAhYOBf36Af358fX59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZMPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXV1NTU1NTU09LT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fb29vb29vb29vb29vb29nX19fX19fX2NfW19fX1tPS09PT09PU1NTU1NTW1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzYRtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0j4yMjIyMjIyMjIyMjIqguri4uLi4uLi4uLi4t73S0tLS0tLS09PT0tPT09zi4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6ODc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OknFpVVlZWVlZWVlZWVlZSeaejo6Ojo6Ojo6Ojo6Gr0tLS0tLS0tLS0tLS0tHf6urr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX183OUisxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpZ5fWVpaWlpaWlpaWlpaV3yopKSkpKSkpKSkpKSjrNLS0tLS0tLS0tLS0tLR3urq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNz1w5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaqjaGRlZWVlZWVlZWRkZGGDrKmpqampqampqampqLDS0tLT0tLS0tLS0tLS0d7p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3FwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Pzs/Pzs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0c3MzMzMzMzMzMzMzMzLztLS0tLS0tLS0tLS0tLS1NTU1dXV1dXV1tXW1tbY2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7O0NTSz87P09PPztDU0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbX19bX19fX19bW1tbW1tXW1tbW1tbW1tbW1tfX1tXW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Oz8qWpdHPz6KXytLGkqvRzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8+cqp2s16igq6DOma2as9LOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q/QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9DLlIiancKclZChs5WGnZ3Oz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/P0b3ImZurnZ+nmbTAyZeZxtDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz8/Sl5Sgw6KgjKDF05GYoM7Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Ts5vEmNqXxcmU2Kyjv53V0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX19jY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0c6NkKC2oJSVobvNiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NHL2qidi5+vs52l0NuimbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njo7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT07Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJjqWao5CimqKcnJGomJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojg6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HKu6Gmp52+nqmgop6poqmc0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk3Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09OekI222a6OkaXUmpGOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0rrE1dLVwb3W09O4yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzY7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLV1NLS0tTV09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2trZ2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg3OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87Ojg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb2tvb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19jY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VGQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tna2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb29vc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tra2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqZG1nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PD0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW1tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmJiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/P0A6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiZmpqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkJGSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpGQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampuam5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJycnJycnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZycnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJycnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVJYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRU1JU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVGJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFRgTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqamon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipamnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSmoqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaaupqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6impqinqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqGin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6KvqqqsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Sgpaisp6alpaOjp6SVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3cH15ZltbYF9aXFZcaGRvY25paWJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustq+zsKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKOnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaGhqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eHhjW1JZVF9fYmxodWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2tLqxqq60sbCxtLW2vL2+vLy9xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipaenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyak5aUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsPDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbCnvLy+xcTGycfFxrvEwcXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87MzMfBw8fHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjIeSi5iYlZqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb2xocXhveWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJCQT1AQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGwMXHy8jUy8rHxr+7u77EvsXIxsbExMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZKJlZGXlZSZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ4ent2bmtpZ3VaZnJ3c3hmZl1kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/JxsPDxMLEvre+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpnXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIx8nHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraequ7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBxsHLy8fGzMnNxcbFw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVuc2JcYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBw8S/v77Ey8jKy8i8u8jHyc3Iw8jJycXFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JwZmVnZGplYmptbm5eWFxWVU5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbBubvDuri5vL7BxsHGurnJycPFxMDEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmZjWllZXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m9urq0v7i1t7Kvu7y3wLe9wr/Bu7/BvLvFvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+urW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYd9cWNgYmJnamdmaWVpXVZVU1lPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tbGwtbe1u8G4vri/vL23tbewrri2ub+7wL+3wby7w7a6yLi2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2hYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8tru8wMS5t7e3tbq5urvAvsPAusTCvse4ubitt7W4urS4s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9v7vEt7a4tre/v8S8wtLKxsfKycbPwsG4rrW1vL64urK+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG53Y2diXGNRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD89Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuro7C5vb6zvL68xbiyuLm9x8nKws3ZyMvJyMzO0czKxLW6wMPIv761v8G/xsa/y8bDv8G8wMPMysfFxsC5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9jXmFhTkhNP0VAP0RDPDs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPEFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0vMO8urq+vMS/t72/vcfMxsbXx6vUxcTKyMzMzcrGwsPLzsK8ub26ucDDv8jGxMHBv8XAysnDw8TDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPj5BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8trq9wby7v7a/wb+8vrrAysLG08CUwsO/xcLHy8jBw8DAycrCwLu7sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKyr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnptc3hzZ3BdW15cWVFFRENNSUFFPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7u9usO7t7y2ucG6uri4tcTBxMm5jJ28ucG9v8fAucC8vsXEvb65srCuuLe/w8fDxL29v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG5pXF9gWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnBwLe9ubjAtrXAs7Wysqqupre5r4uPr7a4uLjCurS7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nrK+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9lXVpVSjw/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDo7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+3ura20cCywLewnZCMfneKjp+MjKW1s7K3vrmztbK8uby2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZybF5iYFtdT0hBPj1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u7y4udLMsL+soYBsfW1gZ2l6io6lt7Owtrq1tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybmNcZlhcXVJOTUE+SUJASklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6rqy8sri5t7u/vL7VxbKpgXh+X2yHamNeYXqRqb22sbS2srSvrbu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxCRk1GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5urW5u7W1s7W7vL/Czb2ggGRahF1WhYqMfGFbkK/GubS0s7CxrbC5uLa8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jo6OhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmJ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PTw8OjpAPTw8O0A+QkBBPz45NTg7PEZCQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+ysrq4yMWzh2NZa5ZcV2R4iYt5SoK3xrmyrbOwr6yutraytLWvqqSem5ycnqionqCoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKqrnqWjm6OclZCMj4+Qk5CWlZaYn56empmml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR09NTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6Wtqqi1r8vHpnNXXYSPV1ZhZrKldlBot762s6qytK6qq6+wsrOupZ6SmJSPmKCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6apsaOlqJ6gnJWTkI+RkJiQlpWYlp+Ym5mbo5mXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01JSEdOUk5KTkc7RUA9Mj83NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENBRD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiXl5ahqKyutre6ubq3t7uuqKChqaKgrajCxpliWn+KdmVkenWvo3ZmX3ebr7Sur7O1qqetrKOcmZSOkZaXmJmcoKKinJ2lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmZabl5eYoJ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHh5YGJSVV9ISUlLU1RJUlBMOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OSnJ6kqK6trKurr6qvqZ6Xn6WenqWkvcOVVmibl3SLmYlvjH51fXl6oqqzsbCwuK2noZydmpSXmpqQjpGVkYyOjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKwtKmxr6KZnJ2eoZmbm5qYmZuUlpuWmJyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVbU1pZTVFKTk5VTFJMQTc+QjY4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkZyYoZ2qoqegnqehpZ+ckpyim5+hocLIkVFzpbSAhIZ4aXBxe4N4f6ipsK6urLCnoJ+ioJeRlJugnJmXkpOfnKGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7issbSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqShn56anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFFVSEZVVkpCTEc9S0g4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOfmaidrp+nnpyhnp6ampKZnpyiop/HzY9UdoqKc29qYFtdXF5lYW6NoKqoqqyqpZ+fmZKSk5iYlpaVjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqaqop6iamZ6aqqefmaagn5+nqKWknp2qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JWTUpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiZqqCxoreksKafnp2dl5iVmZ6bnKOgxtGTYXx6eWhgV0xJS05QT1Fca4Oqr66pqqagnp6hop2fnZqcnJSTlZSenpiUhZ2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsO8w7u3s6mzraqztK+zrqquo52rp7axrKKvpqGjr7GtsKSkr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHFra3VycGhXW1FFVEhESU9IPkVBNEVIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw8Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goJycmJufoJufoMTIh3F4dmdWUlJuV1dOTURHYY2srqajo6KgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Aw77HxsK3w8nJwsDGvrq0urq0u7ewtrKqurKuu7e+urqqt62rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrZGhveGplWltGS0xFRFNMREJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbOyuKehoauqoZyeoaKem5qznWtscGhVUFx8ppV5Uk1nlK6soJmcm56emZeXl5KMjpeXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXS083T0NPTzMrCxcbHysjOv8jRzMfFx8XBvMPAvr6+tb6zrb+/wsLGxMfErr64sri8xMHBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURDQDU1NTg6Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E/PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopaisraqgnaOfnJ2ZrJVybWNXTlJotNPTpI2ks66kn52fmpiWlJKUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K0tfR19LU1tPTyMzHzc3J0s3O08zFx8nKwcbLxsjIxb/Ds7PIxMvKys7Fyr++v73Bx8TMzMjJv8O/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK2zt6yuo56jop2gpKyYemZYU1JYd9PXv7Kvp52cnaCkoJ2alJSVlIl8d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HT1NTTz9HD0NPW2NXW0svJztHLxs3RydLV1tnV19PW2M7Sys/RzM7QzNLPv8fGysPMzMvOz8XGx7a/yr/RzMvPxcnHv8PDyM7Mz9DPzcrHzbi3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGVyYl1SXElKR0FFSEk+O0A4PTQ1ODU7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wcWxtaihpKWgoqu1j2daVFVWaJO5rqSalZignJqgoZ+bnJmViXdpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTOz9XU1NHRzNDO09fW09XQz9LT0cnT0cfQ2NfY0djS19nV1szPz8rN0svOz7/FwsfFzs3R0NHIy83AyszF087LzsjEycbGyMzK09PR1c/SzNPBucWxpai1rqeaqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1FNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpq63qKu319TV2dnRztDAvMzJtr6upqqooaSxtH9VUFNSZZOtpp+Ylpiam52gnZmcnZN9cWVjY19fYV9fYWBfYGBfYGZtcHBua29yd3ebzMDS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHG0dTK0NTV1s7S0NjY2NfLyM3Eyc/Mysu/yb/Hyc3Oz8vQzc7Lzs7Hy8/Qys7KwsnGyczKy9HSzNPR0c/Pyr3IubCuu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1XRTtAPDMzPD04Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PT9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspKyuvrSwwNjS19rc1s7NysPSz8HAsaqsraqlsaltTUpOWJKgm5WUl5yen5+dlJaYlIlrXl5eYWRiYGBgYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHUy8zQ0dPKztHV0tXVysDKwcXMwsjJwszDxcjKys7KzczQzdPLxcjPzMjHysTGwMXKy83P0cbQzs3NzM/Fx8C4ub3Dw73DubOyvrG7w8S1qpilopmWkZWVkouUjZqRlJSPj5SCiYV4cHFrbWdgYHBoWFhoVkxGTElQUEI7RD47Njc6ODk6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc2Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXFwsG/u7WyscfCuMvV1dna29jMzM/I1tXEwrWwtaihq6qtYUhEUYubjYyYlZCUkpGWlpaQi3xlYmJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytLIy87NxtHSz87M1MrHy87Px8fP0svQz8W6xL7Gyb3Cx8nOxMLIwMfNx8PLysvPx8PE0MjGwcXHxL7Ax8vLy87CysvIx8zQxMXHu8fDyMjCz8G9vL+wwcnHub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd250ZGtgXmZwYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vLrNzcbQ1dXZ2tvY0MnPz9HTyMK3vLyupbOns2RJS4KYjo2Wj4aDhISCfoWFf3NgXF5eXmBeYGNkY19dXV5fYGBfW1pcYGtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsnGwsPAw8jKycjKyMHFzMbIy83JxMLLycHCy9DEy8i/ucG7xce9v8bPy8O/w7vJxsi7yMbEyr+9wsvGxcS+xby8v8PEy8XEvMDJwsXH0sTAyL/KycbHxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhpZqjoJuUe3ZzdGZpWmFubFpbWFJETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMvP0czHwsPGzc7OzNXP1dnY2c/L0s3NzsjBtcS/s7G3q7l1V3mWjJOXhnqAhYaAdnh1cnBfWltdYGBiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsLa6srKzsrHCvLy8urjBwcHFv725vb+5xMrFxsK9xsC4u8TJv8LJu7e7usXDvrzBzcPGvb21wb3DurzGu8K5s7zFxMLCtr+1tb2/usvDvLW6yLq/vcvDwcXCxcjGyMbQxsLMx7LHycPOzcHFw8C9srewsqeoqLmwpa2wq62slHl2d2pkZ2Bob2NWXllKRkpGSEpBRUJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfGw8TIztHKysrHzc3O0cjQxtXU1tfNys/FycXHwbrHvq2usq6whniRjYqLhXiAhoaAfoR8dHRjW1xdXmBgYmNhYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLW3tLOztLq1vrK3sLWvsrvCvMHEvL+6tbO6vsC4x7m0u7bAwry4vcbBw7u1rrK2ur60xLe7tau4vb2/vbC6tq+2urLFvLauu7+0trTFvb7CxcDDxcbIy8XAxsa7x8u/z8rHw8bCw7bDvb22ub7Hv6y1urW3to54dHhmZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy87IxcjNzNDMzcjKyMrJysTPzdLPzcXHwcXBwLu5y7itsLGvl3+PkIaJint4foaGd3iCfXRpXl1dXV9gX2BkYV5kZWNfX1xbXlxdXlpbW11fbHBtaGZqbW5yfKTHv7i4tbCrrKeeoqqnnquts62pq6m0rbaxsqmupqyyvLq2w7m6urGrtbm7tMK6sL+xvby7trzHucK2raqosLG/tbe8r7CnsrO0u7yrrbWlrrauurGwqriwrbuuu7i7wL+9ucK/x8PFwbzGwcfLuMXHxb/Gw8O5xMbCu8bJzMuzucK8urKIcnZ2a2lhYmxoWVhXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxc7Sy8PFwcXPx83Bw8a/xcXDw8rCycq/wL3Cu7S2tsWxq7Cuqnx2k4iPkHx4foqFenuEgXdvXl1cXV1fYF5fZGNiY2NiYF9dW1taWl1aWlpaXGVub2hmZ2lrbnKBrbmwta6mpaenmqCkoJqcpauuo6eiq6qsqrCjpp+qrbS2sb25r7evqK63tLS8uLO8r7i5tLG8wbHArqWooquxsrOnvKqrqKusrbSzpaitoaSvqbKlp6itpai3rLCyt7q6u7G7vb6+xL+1wsDHyLe/wMS3xMK/u7/Ewr7EyMzKv77DwMCphnJ0cmppXWFvZFdWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XQz8zDyLq6y8HLvrvKt77Ev7vKuMHEwra4vreysLa+sKqqqp1ug4OIi4B7foB+eHR/fHN3Zl9dXF1eX2BeX2NjYWJgYF9eXVxaWFpbW1lYWlxfZmtmZWdlaWtvcoWqpaymoJyhpZSdpJuYkqGjqqOin6WlqKauoJ2bpKWrsq+2t6ewrKeqtKq0urG2ta62ubGvurmxt6Sfo5+msaerqLmqpKenqKeyraCnpp+bpKasnp+npKCgsa2trLK0srSwtby2u8HBsrq+w8GyubnCs8C9v7W4u72+vMLHxMLDv7/EoIN3cGthZl9rb2BUWV5ITmdPVEhFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzc4NjY2Ozo6Ozk7Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9taCelZ2hprq2q7Ozu7PEz8nLwsa4t8fBzL+4yri8xrm0xbi0wMKuuL60rqext7Gjo6aPdIaGhoF8eXV0b21rampxaV5gXVxcXF5gX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1viJ2poJeVmqGWm6KYlo2eoaKmm5+fo6WiqJ6bopueqrCtsbWiqaqpq6uktLmtt7Css7WusrWusKqfnZ6jorKkpqm4raKmpp+orKqZn6CemZ2fpZqao5ybna+pq6eqq6ytsLK4r7i5u7C2u7u6q7OzubO9tLaxsbW0v7a9wL3Dwbq7vZeDenJrX2VeZGRYVFddSVdcS1BHSUlGQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xs/IyMDGu7vEw8++uci5ub+4s8K1sr29rry8tKShq66rmaCfin+Ghn94cm5wbmtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZWVmZmhpa3KNqJ2UlJSbmJuhlpaRnKGiqJ2bnaWmoqacoKCamK2ura6yoKWiraumobSwsbGsqK+yp7qzprahop6bo6Gto6Gptaqio6adpaajlpiel5manaCal52cnJusoaumo6Smrauzs6q0sLKqsrm0r6mvsrKzt7Ouqayusriwura5vb+3srGUhXl1ZV5lXltZVlNaVUtcUUxJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+znaWjmKWxwrW2va20uMLMyMbAxbfCwMfOt8DEvrS6urPAt7O6vK+1t7Ghnaeto5edmIt/hIR/eG9xdHFpZmRoZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hXVldhZGVjZGVkZGhqdqKclJSPlJaXn5eZlJifnqGclqGhqKOfnqmcmpqrp6+wq5ujo7eqoJ+uqLappqetsKS3sKS3n6KbmJiqpqGarLiwoqGknKKgoJOVoZSVlpuYl5aXnJWfqZ2po6Gdo6qqsK6otKuqpq2ysKWqrrKxsK+ur6anp7KusbSvvLS6t66jlIF5dWReYVZZV1NSVEtNXkxQS0dHTExFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp2np6Oqu8C9wLmutLjBzMfFwsO9xrjIzLLBw8Kuvby2vL22uruzs7SsnpykrJeUjZGFgH13cWlscnRwaWhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2NjY2JjYmNkZmqBlpOVi5GUk5uZnJaWm6Ccn5Wgn6alpKann5yfpqCqr6afoqO2qKChoqi0oaWopbClsK2stZ6gnZWUqaGilK2xsZ+io52dmJuTi6GUkZOYmJKXl5iXnaabp6GimaOlpaukpbCnpaOrq62mqK6vrquoqqmzpaasr7Sxrry1sa+voJJ6dnJkYVxaXVhOTFJIUmFNV1BPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepaett7u8wcW6sbm1xMnJwMPGxsi2xsSzwsDGrLi4vre+vL24trCwq5ybo6aPjXaLh391bmNiZmloZmhqZ2ptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRWVVJVUlVgYF9gYV9gYWNkaYGTk4iQjpSSk5yUlZajmaCWnKCloa2mpKSio6KcqqulmZ6lsamgoJ2lq56noZ6tramprq2hoaKUl6ObnJCrqbCbn6KfnpeZk4qekY2Sk5aQmJiTnKGinaSgoZWgoaSmm6OrpaKkqqSrrqWtsqmmpaamtKapqK2ztbS5uq+qrJ6LcnBvYFtXVlZSR1BPSFpcT1JJVEtTTEVGSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njo4Njk4OTg5OzlAOXu1tK20u7Kvq7Gtnainr7m5s8DIurXAr8bJzbvByszItcq9sb7Eyq6yucO3vcK+t7eusKmZnqCfioV1iIN7dGlpaWxnamxta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV5eXl9fYmRtjo+EkYeQkY6Zk5SSnJqinJugp6iqqKqmqKWjmKSupJSZpa+pn5uZm6CerpmbqrOfpaafoqOhlJOblpaSqamtmpyfoaCalJCMmY6LkIySjZaVkJ6hoKOcm6KVm6CioJiiqKOiqKugq6+krrelo6SirK2qqKuvsreyvbWzq6+YhHNzaFtYWFNVUUVYTFFbWU1VTlBMUFFJTklCPD8/QT88NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s66os7auqaevrZupqKy3tqy7yru2v6zMx8a5wc7PyLTFvLe7xMmyrrnBuL7Avba5qq6kmpyemol/d392d25taG1ubXBoZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVVFNOUFFZWlpaXVxcXl9gZH6NgYt/jJCKko2XkZeZoqCbn6qppq6qp6+jp5mfrKCVlqSop52XkI+anq6Wl6eqmZ+dlKWhnpKQk5KTlaeqpZqZmZ2dlo2MjJSGiI2DkIuSlZGgnqCjl5WflZqgop2Tm6Wlp6iooLGwprG8p6CjrLSrrqewtbC5tcCxrbGrkX1xcmJWU1ZOUklGVlBSUkxMWE1KTE5SR01KQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OtprG3qqaisKudqqepsrGktsa0ubqzy8a6u8LL0MuxuLi8vsHEsrGzua62tr22uaeooaKenpiFhnlqZ2xucW5xanBrZGZnZV5aWVpZWlpaW1paWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domNh5CKl4mUlJebmZ2omp+ppaSqnaeYoKWbko+eopqXloWEkpqjj5OinJaWloiimpqTi46LkJqkp5yVlZebkJKHlI6MgYuNf5CKkpKSoZqfopWUmJiVoqWZjJmkpqimoZ+0sqiyt6Gdoresqq2ksrKltbu1q6uxo4l4cm1dTlFRTE9DTU5OUEtGTk5KSk5NUUlNSkFHTEhHQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjc3Njo5OTk5ODQ5ODhBN3e2p6S2sKSno6mloKmlpLOqorLDtbWys8bGt7rDyszGs627vrW4wbCuqrKfqLC9srKkn6ClnZuLf4pwXl9mcnB2cWluaWVoaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhZWFtdYW9zdnGFiIKIgJGEjoqUkZOdoI+am6Kho5iklqGblY2HmJqMc42CfY2XloWQmZCUjo57mY6cjIKKgImYn6KekJOYloSOgpN+fnSJjnmQh5OQkJ2amZqQlZCdjqKjjomaoKGjo5uitK+sr6yfmaW4pqaxobGunLC7qqmvqpmCdnJiVU1ST1BNQ1NOTFFNQlBRSElOU01ISkpDSkxGS0s8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTE3NjQ3ODk6OjY1Ojg3QTd4t6KjtKilpqijpqWmpqazp6W0wbivtLDJxLe5wc7FvrOtu8KsrsSuqaOok5+oubCopZWcnpuWgn2EZ1dWX2dmaWdobmNqaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5Yco+Cl4aNnJeLk5Cfl52VlJaUjpaJf5OJXztXb3uLlImAi5KMkIaGc4qEloF5gnqFlJ2Ug5aOkI+Dhn2SeHJvhY19iYGRjY+XmZiTio+JnIeel4eIlp6aoaCXp6+praionpets6Kmrpmsq5intKKpraOTfnJtX1tOU1JWTERUSlBNTEZOT0lGTFFNS09KSU1QRklJPDc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepp6KpsKintMG5sLWwx8K3s73Pv7mvr7bDqKvGqqSemoSVnbSmn56MmpeUjYF4e15QTFJVWVpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1waXuCdFBCQX+VkZF9iZSMhIqNmo2VlYqSiIWVhniIf2BKUW54ipGEfYSNiYV/f25+f5R3dXV3hI2ZcFGNiIqHfH54k3Zod4aIfoqIlYqNkJGWi4SKiJSEmoyBhJKalp6clKSjqKmlpJ6bsKqhpKSRpqqWoamcoqaoiXVsZV5bSFFRUk1JVU1TSUxLT0lIR0tOTE1US1FRT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6KnnZ+hrqGnqKWnqK+tqra8tri3s8K7tqi6yLi2qKi1tqqzvqiflo+Ai5WrmZqQg5SKioN9dnRaTUtNTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+HgXyFjJKBkpmLj3uGj4B1f3hzbnVwdI2NgXl9iqqFeXpodnuOcHJteIGLjJJ4eoB7gHZycpJ3aHWEhISEe5WJiIqMioB/hIuMf5SDe4CPmJWclZGfnamen6CdoKmln52Yjaekk6Cflp6epIByZ2BcXEpWT1FHSlhST0pNTVJKSkpNUEhMUUxSVExFSEE8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3OTU2NzUyNTI1NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpijoZicn7Spr6mlraywsaq9tLK7uLa7tbKgt7qyqp2drKmos7Cim5KPlYGPnpGWhHuNf4J8dnVuWktISEhHRUhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnWDfXlnd42XmI6PfWd5gXZ4gImPfISYkoFyh498dntva36tfHOQin97hpKBfX90ZnZ8hmxvaHN8iYyHgGx5cX1wbXWPcWlxgH6OcEOLhIKDhX93d3qLhX2LenV+jpKPmIqSmpujlpmdmp2eop2WjYqlm4+el46WmI92bmxlYlpXV1RRSlNVVE9QTlBWS05LTk9KUU5ITk9LRUM8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ+WoKavrK6rqKmwr7GrvLisu765s62om7CnrJuPlpylqaWhmJqQhpN6ipGOj3p1gnJ6dnBxb1pLRkdFQUBDRElMTE1RUlBRU1VUVFVWV1dXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXlie3hufHmIkHl8i4VvbYyReHN4amqAgnKWkYuBfZaASZOYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmltcH9zjYmEhnp9fnt2b3RzhYJ5gXdwfI6MipSDlpeYmpCTlZaZl56XjIOJn5GLko2GkJZ+bWhtbm5XVVdUUlFZT1JUVFNYVU1OSE5KTU5LQ0hOR0U/Ojg5Ozk5Oj48OTw7Ojo9Pjo4Ojs5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDQ1Njc0ODVIQTg5NXeZkZuZmp6lrbCirKqota+urLS/q7zCv6aimpWkl52NhIuUoaGZmZGUi3SOeoGHjop4c3lvdXBqbm5bTkVGQ0A8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX5wbX96i4l2gYiGdGyakXRze2prnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtxgHxncXF7bpONj3tzfXxxcG51bYJ+d3l0aXmJgoiJg5aTkpCLjZGUlI+XjoB5iJeIhoqGgJCHdmpqbmdkV1FaV1lZW01QVVZZWE5JSEVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCs1Nzc1NDc4aU84OzVukoiakZmWpKiunrKfprquq7KwwrG7w8eblo+VmYuNhXmEkJiUjZCMj4Zxh4J0iI6JfHN1cnFxaHJqYVRGSUM/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHF8eG19bHKDgYWBeoSGhnlyoJV0eIBzdZSHNXGdqJ2OoaGEooV2cIZ8h3xzjK2NiYBoZmJpbnJtcIN1aW9YdXCOmpJ3bH97fW1xbXCAenN2bWJ2hH+GgIWQkYqLipKLkYyLj4N1eIuPgH6DgH6PenFwb2teWlxdW1lYYF5STltaWFdMSEpFSkc/Q0FCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoeWkZ6kp56vlaW1qa2xrsGyu8HGl5CMlJCAiH1ugZCSiYOKh4+FdYKEbJaJin13eXlueHB4ZmpeSVBHPkA3NDQ4Ozs8PT5AQkVJTExMTU5QUVNVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8fYWDf4x+dqKZeX6GgYWZhJucYYaqn52KgpCOeneIfomIjnOKl4+De1xkcXR6e3eKbGdqYnlvhY+Cem6Bd3SEenB0eXdrbmldd4d9h3yIh4+Ai5OXg42FjYZ9cYR/hHx1d3t9iXVvcnNlZl9bWl1TW2ZeV1FVWFtVR0pKREtHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyNeIp/lIySnZ2fppGgq6CxqK/AsbrFupaOkZSHeoV2a3+MkYJ9ioSOjHiDgHOhhYx+foJ/cIB+eml3a1JXTEBFMjExMjY3Njg4Ojw/QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxxfI+MenyJhn6Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkaiHgJiYipxzbHyBhod9jmhnaHh+boWGgoVxhIVHa4B3cnl2aG1rX3Z9g4h/iIWMepWenIqLiJF/e3WLdnx3bW93fn9ycnFrWlxcW2NjWGZlW1VPUFZZUERMS0ZOSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFiJGPlpeSl6GdrKGmuK+zvbOXjZKLmIt9dHB/iZJ+fYyCkpR9hn6GpIeIf4KIhXiHiH5zhHhfY1ZLQjYwLi8yMzEyMzY2ODo9Pz9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzk0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYGEgoWRk36FiZGBmpWCoaGXlZuapa2Tmruxp7vHw6iLjKGlj5SJgZF7coSen5Gcf3aFhYqPh5BpaG+DgHSMhoSLcYaCd4eAe3aFfW52dWeAlI+GiYiHiIehq6KWiY6Yf3uCiXp6b2dreH54fXFqY11aWl1pXGFmX1lPS05XUlFJUEtETkdDS0RDQURDQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnVwZ3iDe4CMgIGQj4uamqScoaymq6+wl5GRhKGUhHh3f4yUfH+ShpKVf4qAkpuOg4CBi4uCiY2Df4p/bHBqXUNBNC0tLy8uLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jaGemYSThYKPop+UmZKEioWPmJGWbHB1iYuBlYyNj3aPhHFshYGKlpKDhYhyiaGWhpOKj4+WpbWpm42VooOHk4R+f2tqa3yAf4ByYFxiXllmalxra15XS0dPU1FOTUxGSVBERE5GQkNFR0I+OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuaFlwg3B1h3F2koZ+l5aalJ+fnKegqpaTmJ5nZaSafoSSkXmAkoiQkn2KhZiSkYKAgIuNiYWQh4SIhXh4f2dNUj4vLi4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFSU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZuopqKZoZeilZyfqJ6pq5+orKmqtZerv6u2yMi3ydHPvpugcGmrqZ+ElJKGnKGampmnkZGIlaKamnd6fpSXkaGSlpeBlJ57dpWSq7OJjZegfZSenI6Tlpmkoqa2sJ2RmaiIl5COgYhsc3N8fnpvZ19bX15hZmNgZ2dcUUVKS1BPSUpMRkZNQ0hMRkZDQkdEQDo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcXVgbn1id459fJSOjoqfkpeelpyqmJ6qQkR9h4mHmI14go2Kjox7ioaPkI6Bg4CJi4qEkoWDhoiBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49R0dAQUA4NjYyPDk7RkhHSUlNT1FZbYaQd5WLo6eqtL24pa6srKeotKyxt7Kyrbuxs76cs8Ssu8nLuMS/uKWjsLKsrauki5aYhaamoKKXgaaZjaKqqKSHhZOjoKCqoKSpjpyxi5Wjp7e7m6CjsJOjnaOekaSiq6+ts7WilaWriZqKk4qVent+hH1mX2dbZGFdY2NeZmZeW09DSUhUT0ZITEZLSEVGSEFLRkNGRkE6ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljWGpwWHqFdoGUhYiCm4OSkI2S2sidlnNWl4iPiJyPfIaMjoqJeoiCh5GOg4WAi4WGh5KGgoSJhoeHh3FuYUBFNjQ8Mi8xMTAtLCstMS8tND9EQU1VUVJUVVVXVU1bUEdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHHw6uzxbass8CzuL62v7TBtru7pLjGqbbJx7a+ubSoo7StsbGcmpKan4mnr6qklXafpJehq7GzmJapraiutbuyuqyvtaKxrLG1vLe1rrWgp6ejqJupsK2yuri4p5y3qY2lj5KToIZ5goJ0WGBjVWVhYGJfYGVfWlVKREVMVVFJSkpESkhFQUBAS0RBTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxbWlFjZFd6dXGClH2FhpN2hn6AjXu/u6O8grSUk42bj4SIj5KJiXmGgIyTjIeFgY5/gYmOhn+FiIWKh5F6eW5dVkBFTTw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFdPX1VJS0pBQD9HS0ZFRDs+QDdENz9CSkpFR1dUUF6Ppa2jsbTDtrjBzMm2u8S9s7TBt7jCtb+wt3SxtKa6xaSwxrmxs7G0qKS1tqqxoKKWm6KSpbGtpa2sp6SYoKyyuqKosrm1u77Mv8XFvb2zwre6uL+3ure5ra2xprGqrb6wvbvCwqyZu6iVrY+YmKqJfoJ6aVdhYFdpZGhkVlpjWVZUSUdHTFFHRElKQUhEPj9CQktAQExDOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZRTEFMUldUWlZad2pwf4+EgY6FbnpzeIhiuKGao4mVlJaTlJONkJeSh4d7hoGNlYqAhIGKenyLh4Z9ioKBi4SVfXh5dWVPXGRHRUw6UWRhW15TRj47SFBEWmRRUVlYWmdaVGBhTVNPRUE/SUpIRUZBQEM9RTZCPkhHS01TWlRelK+4tbq5ycC7vcnMu73Au7e1vLu3vrW6ssZgdbKlsZqeq76qpairqqOisrWhq6eelZaemJ+upaempZ+kk6KnsLOosrK8tsG908nJ08bCxczCysPAvr2/u7y3tLC5t7fDusa+w8mwnrqqoqyPpai2iYF+cV5hYFxWYV5nZVJYYVZSVUlFRU5LQD5HRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzM1MjY/OEA+R0tSVFRSUE9RUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWdtbHGQjYWQc21zcnOI1cC1maCNlZmakY6XkZaWjoaHfYaDjJaLf4N/g3h7i4SHe4t5gYqCl390fXprZXB2WV1cUGVlYmBlZF1bWFdcTWRtVVJtbl9vX1hnZVVZVEpEQUtLSEZISEhIQkk5RD9IS1RUVl1aXJO5wLm9t8bAu7nKy7u3ura4ubO4tbWutraZZHWpnq1wXqKtnJihopuknqullJ+fkJSPlpiXqJ+ln56amYOknaykqrCtt7C8uNTQztbPyczSzM/OysfAv8LKvcG9wsDFxMbKv8nPtKS7sbWwm6y5vZp+eGpcX1tYXWBZYmJRW2BTUUtDQkVGRTxART5CSEJAQz06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaWBvl5KRlG5sb3R1h7OsoaGfi5mcmY2NlZGbkoWKin6Ih4yQjIl8gYNze4qDhXyKdIKKhpV/c3t4bG11fGlzZWlsaWZqamlgZmlobVptdJetpLyHh2dbb2hdWllUSEpOUEpLUUxUUUhMQUpHS1BfX2JnamKXt8ewubO7vrayxMe2sLmxsLuss7Gnq7esjbannpynmk6bno2OoJaRppillYqTk4iRiY+Qkp6boZiblZaHnpmmmqyvqK+ns7PT1NTW0cvP09XO08/MxsPK0L/KycvJ0sjNzcPR0riwxL3Euqa3u8SigG1iW1tcV19XWWVZUFxXTlFDQkhFQkg7QUQ+QUg/P0I3O0Q+QEg9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OT05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2ZXc5CQmYNocW95eYOgqp6ml42bm5iLjZWRmo59iYuFjoqKi5CIfISCcH+HgYZ7h3KDkouPfXF4dWxweH9ye254c2xpgHBtY2ltcHlpd31+y7/C36dtY3hvZFthYEpQUlVOWV5QXV1OUE5UUVVUXG5ud4Nylq64rLSosLarrb3Asau1pqW4p6yuoKy0pI+xrpuYmIyRlJGEj5uBjaaRnImDi4SKiYSKg5SVmJeUm5Gbl5mZnp6rrKSnoaysztLV0c3M0tPU0NTRzsjD1NHIztLT09bN0tHF0tbGwM7IyMOpv7jQnXhsZFxhXFVeUV1aTk9TUE5IPkFGQkJFPEBCP0VFPj8/Oj09PTxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WHhot3bXdwfX6AoZ6eoYuNmZOTjIyTkJaFeYaQkI2LioiRh3+Ce3J+gIKHeoV2hZORiX9vdnNsc3x8d3xzgnhxa4BycmlvcXp5cnu+y5p+jLGDdnKFd2hhal1DWlpbV2ZkWGVrVFhdXGBjXWN4e3+LgZmqpKSioKGppqqxuaumtKOiraKjraGnsZ+JppuVk5GKko6IgpSJa5WijZmEgYZ+kYODk5asi5WNlZmOhZKQnZensKKgoKSkqMfNz8fBy9DT0dTSztPNxtbTzdTY1tbY1dfVydTazcnX1tHKrcTDzIpxbWJfXldSWFJbT0pHSUlKQDs6O0VCRDxCRD5IQj9CQjs7OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV+aXN5coKJgZ2VnpSFi5aJjoqIjoiPgHiDlJmLjYiIi4l+g3hze32Eh3eAe4eRl4GDbndwbXV/dnh9dIZ8eWyHdnVvfXaEdXl7nbWMPEGKxqV+jXxqZVdJQ2VjZmNoamRveVtfZmhrbmlugISIkYyen6CekZeYn6OjprKkpbOgoqWeoaiforGch5+SkpORi46LhoOPhH6cm4yNgoSFepR+gqqVo4ySipiSi32XipqRq7OXmpunnKe9w8W5tsXN0tDRz8vSy8nUz9HV2tfX2NTZ2M3Y287J2trS1r/MzbV2dW1jXFhRVVBZVUVGSklFRT06NzpAQUM6R0VARUNBREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGJxcXOGjXyXkZ2LfoeSgomGhYqCiH15hZeXiI+Dh4aHeoR5cXp7hIZ2eoaOjZ16jHB8b3B6f3J7gHGEh4Bujnp1d318gnV/fIeJsHRZqcK2jJKBcG5jPV5ocnBxcG54d4JlaW9ydXhye4uHjpOSm5agloiMk5ugm5+qn6GtnKKamZ+lnp+smYyajJGSjoV9iIeDhYuOoJmTiIOHfm2ZeYSZhoiTjI2VjIZ7m4iTj66rlJWXnpimrrW8qK29xsvIycvLz8nD0crU1tjX2NfV29fT2tvW0Nva0dbJ1cyUd3lnZ1pZT1JTXUhCRUlJPkE+PTc6PT87Pkg9QEJBQURBPj86ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmt2gIhxkZCbgHmAjn6DgoKEfoR8fYSYjoeMfoaHgHeCeW57e4eCdHqSno2hdo91gnR1gX10gIRvgpCCb5KEdHyBhXp2h3yJuMalw8m3gZWbj3hwZU5lY4J6gXeGopCLeXl3e4R/fIR2bZSWlJWPmJGDiY+WmpeXppyYoJefk5KXo52Zq5aRkYuNkoOMhYmIgYaQkZ6cmYmFi4GFl3uIiZ+XkImNiouCfKGIkIu8oZiTl5mcqKalrp6ntb7AwLnHyc3Oxc3K0dbV1NnV19vU19na29fb2tnYztvHhXl3ZWhjX1NWVlVNS0RORDs9PTw5Ojw+OT5BNj4/QD1APjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdIUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWVhXVtodHp5bImNknd2eop8foB/f3yFe36CkYqFhnqFiHt1fXVtfX2GfnR/kp6Rn4OSfIZ9eI9+eYuKb4ObgHSZhn2BiYV8fpF7kKmOkMOgvIyco5x9iYR9iXKMi39zppqcmZSFe4+RiYRpR3GhpJ2Mi5CShYiLkZOVj52ak5WRl42MlZ+dlKGUko6OkIt+kI+Oi4SIkpaan5+JjJSRnZCCjH+mmYiFjoKGhICkhoqLuJidkZSWoaegnZ6do662urWrv8XK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbt3d3dmlpZFZeWlNPTkhETEI9PT45OTs6OTk8PTZAPj49PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmBjopxc3iKe3t/fX97iHt9e4uHg351hIZ5c3p0bYF+hH13hpuhm56UkoCLh3+Yh4Cckm6IqYV6oIt8kI6DiIScfpqRiY2jop+Qo66fi5GLhYuBkoZXcq2Ln6ycj4SYnJCQjlyDopGCjZ+TlYyHiIySk4yUlZSQjI+KiJabnY+VlpGLk5SGgIuJko2Kip2WmaOihpOdlaCKioiOnJCDiI+Ag4eFpIWLkLOYnJKUl6GhnpmSm52nsbispbzBx83Hxs/Mz8zP18/R1K7W1dja2dra19bZ2Z5ue3NmZVtcV1JVV0NASUQ/Pz46NDk6Ozc6OzozOzw/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieGxifpKDb213i3h6f3uBfYZ8e3aGhYBzcIWCe3Z3dnSEg4V9f5Kmop+mopaJnZCUl4qKp5dyirKNhKeShJmThJqMo5agmJOJm52hkqivn5GUkI6OiJWLbo23hJrEyLKdoqWbnZiWkbKQZKTNyJWOhoeJkJKNjZOUioWKioaWmpuPkJSTh5WYhICPi5mIjpCql5eko4iZnpaaiY+Gl5eLhY+MgX+Gj6WIjZOomZeTlpihmJ+Zk52borK0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6BcX1nYl1dXE5JVFlBQkdEO0E9ODM3Ozw6OD02NDk6PDo3Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4FGdoGPfXxtfoh4en57goKDf3Z2gIN8bW6Lf3p8eHh8hIeKfoujs6ejqrOhlqefpaSWla6ig5G4lZGzmoyhoYykm7CjpJ2YkaeWp5msr6SXlJaVkIuYmZehwI6jybmrnKOmrZmSm52ynYWFqKKcmIWJiY6VjIuTj4iBhoeJk5iVjIuUk4aVmIaEkZCcdZGYspaXpKGInZqTkIqQipebiYqWjoZ9jJieiZCQnJqZk5iXn5SgnZWem6CxrqKkt760xcfEvcPDv8bNysnSps7N09LR1tjT0Ni6cXh0W19UX1VPSEpOREJDRTU+Ojc3Oj88PDc9NDI2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdOW1xZSmZgO0iEi3p6boWGenyEeYGGgX5weHx+fW9yjXp9gXx4houJhoSSp7usqLK9r6Sts7Ooo6GwrIqatZ2iuKWVraSXqa24p6Sjn5qpl6mjr7CpmZiclJWRl6CYmru7rsqhara4q7CUmZ+jrJOXvaNeqrKDioqNlIeRfI6OfYOGjo+UlYiIk5aMkJaNi4yXmJOdmbSXlqudi5yUko6RkoyYm4qRnpCLiZWfoY2UjZiZnJKbmJ6UoaCUnJylr6ihpLO4q8LIxLW6vbvFx8fC0aDGyc3NxdfW0cvUoW95Z1tZU11QT0VDPjxDQUI4Pzg3NT9HPTw2PDM1MzQ1NDU0QjM5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRHYmBicEpAi4p/gXOGh32CiHWDioJ/bXx9fX9wd4d3joKHe42PjIaMmarCwK+9xruztMC8tK2rs7aMqLKtrb2rm7ukqK25uKumpqKipKKpr7Kxqp2cpJibmJeeoqalkqS6r6nAvK2tsrmmpKh+iIacrbywg4yMi5CDj4ORjnqBh5CNjZyJiI+XjYuVlpSRmpedqJqxmpGsnI6aj5KOlZCQlpeOkaCRiZSbo6yUlo+UnJ2ToJ2bmKChlJqep6akoqOws6fBxsOvsLq2xcTCv82mx8THw7zV0c3FyodycWBaWF5aTEpCS0BGRz5BP0I7OjQ+QT09NTw2PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRD9DRlxlR2BpZ1pdXJOMjIh7h4yHg4x1hpGKgW9+e4F/cX6Be5V6kpSUmJCTlaezxsm/wszCw7nHvLuvq7m7l7K3urLArqXApKuvu7yqraujo56nq660sKmboKqboZuWn7C1p4ujuru2wbysqJyypaSolIWOqcTDpIKLj4eIhIaVlI16hI2Rj5GijIyUkY6Jl5+Yk5mVmKagrp2MqpyOlo+SkZWVjZCVkY+hlIaXn6CynpSalJ+hmKSfmqCboJSYnqWjpqakr66lv8TDrqi3tsnDvrbPssS/xLyz0cnIwrVzd2tbVlpoUUxIQ0xLS0pBQT1DRDw1QUQ7OzM9OEIzMzIyNjNBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJlWU5lXGZUY2qZjZeKjIiTkIaJeYaUkIFygHyNf3iHgoKQeo6hlqiampi6vsfIycHSycrCzb3Cs627vqe6v727w7eswamss7u+qrCqpKWkrK6zrba1oJ+un6WimKOzvambqL3BpLe3sKuTsayrrJeHmqmnpZGCjJOllYmBdoqReoWNkpCen5OPlIuPjZSjmZaclJSjnqqfkaWajI+Pj5WWiHyPlZKSo5qVoKKctaWQnpeko6Klnp2mmJ6Wl5uko6mnorKsqLzAxK+lsrfMwLmvxLO7vsK4rcLDwsCYa3hgV1ZaWkpLTUpGRERIQkJBREw6NERIOTs0PDdFLjEyMzUyQjI2U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djpeOnpKJin+JoJOEeIV/lX9/kIiKkICWoZmupqSYwr3Hw8fF083Ozcu8wrewuby0vMu8w8G2truts7+5vK6vqKCpqLatrqmyt5qerKKnoZ6rt7iqpbC/xbG9ubOnqrWzra6XlqWsqKCRjpKyxaeVjn2SlX2IkpmQqpmYk5OPkpWTpZ6SnZmUoaOinJifmIuMj4+eiFqQlpeSlqSZZZijnrOllqGWrKyqp5ueppeYlpiVoKSopZ+2q6m5u8O0pbO1y8C4qrassrq4rqi4ur24gmptWVZTVE1FSlJOSz9BSEVESEdHOTVGTTs+OD1ASi4zMjAyNUI1NVBXTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs9QEJGQnBFaUlSZWJMRqWUnJeil6mWjZGDh6aTiIKHgpyDg5WQkJSPmqKfr76voca8xcTGxs7OztLKvru2sbq7vL/PtcO9uLi3srG1s7izq6acq6y5qqmnr6+Xo66kp6SltcCwq6y0v8O6wLqzp7m1uLOvlqWtrq6ki5OVoY10wZp9l5mEj5aajLGVm5qVkpOZmaWjlKCbl5qpnJyhoJmKjZCWnGBKlpyalZqlllSWsJ+vnJ6klK+uq6WaoKWUk5mYjpygp6KZtKmqs7y7u6qwsse/uaasq62xsaOhsbK0pG9sZFtZTk9LRU9QUVE7R0pIR0lDQz46S1U/QTo9RU0wNzU0NDpCMzROV088SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiql5mgoqivmZGXh4unlo6Ik4Wfh4Sdl46doZujpLXItanGusLDx8rIyMzNxr67s665uMHBzbXHusG4tbqwrq+ztKakm6q0taqppq2smqStpaSorLq/qKu2t77Cv765s7LEsrm9rKOutay5poibl6abdr+fhJmdjpOZmouul6Gcm5aVm5+hqZ6nn5maqpmhp56YkI2RnYNudpKimpWdop6QrrKiqpSoqpeqraOjn6WokpKZnIiUnKKdlrGnqau6tr2zsq2+ubego6eopaecm6ypqYxhZGBeUUpMRkhNSVZMPU1ETkpLQkNEPFFWPUFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li1SYE1VSH9lXkhFq5WcoZ+7r5mUn4uTq5uRkpOJq42Hop+MpK2Uo6O2xr60wLrCwsfIxcLNyMG9ubKvuLTAwsq1xbLBvLS6qqitrbCjo5iqtLumqaarqp2prqejqqu+vKitvLS4vse8t7a4wbG+wbSptbervqWPopiSoqC8n4maoJmXnp6Pt5+pnKWim5yhmqils6GbnaacqKqemZWPlJuLl4mMpKKUnaKeoLWvpaSSr6uZq6qdnaSjqJGVlZ+Dj56em5WppKGhtLS6ta2otbKznpyipZqXlZiqoZ52X1tfXUpIRUZNUUhNRUZHQlJMSUJFR0FWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDQDU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE5Z1xGQ0OccGJHRaeXpJ+ew62bl6WYmamclpubj6qWlaemla2smaKrtsTCvL63wcLAx8S+zca7vbmysLizv8LItb+wvLa4tqakq6ytoaGaqqrFoqSpq6aerK+roqmov7emrb6xuLbHtrW5uMCzv8K3tbO0r76jl6OWlJyUrqCQoaOlo6OfkL2kqZ6oq52doJumn72imaOfoqmroZ2WjZWek56Hj4SNk5+koJ61rKWblbGnma6mnpmpnZ+NmJSehI2gmpuTpaSamKuxtbGrpaqtrJyYoKCSjpCVqJ6UZ2JYYF1OSEdKTktIRURJQT5QSEA8R0lIW1JPSz1IT1U0QkY5PkhHNUNhW0tDTlJVV1ZRWFRSVUlAOFJRUE06R0E0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNDZAOTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROm5SRjxLeGViVkyimqOcnsWsoZ+snp2uoJKjn5aln6aqrJe2saOqs7bExL2/tb/Cu8jCvsrItri1tLCzs7fBxba+sbi1uLWfpqyqrJ2dnqWkwaSfqq2gpKmtr6KmqL21pbG8uba2xLK0uLq/s8TBuLius7W1o52llZKUoa6gmaKeqKiro5rCramerK2bm56ZpqG+oZ2kmKurrKaimY2an5KfiY5Xf5afpqGguKqmk5i1o5+xoJ+arpaejpiTnYGOn5eVjqKjlpCmrrKrqaGipaWVlZ2Yi4+RkqSeiWBjWWNgS0hKSk5FRUFGSj49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dyR0U2PXVlXEtOnp+hmZ7DqKWitKKcsqiTq6Wgo5+tqaydu7CorLaxyMXBwrLCw73Gw7zEyryvsLatsLSvv8S0ubGwubSsmaiwqaqanaWhqMGsm6ywnKqjrrGppKi9tqa3u76vt8SttLPDwLPHtLu3rLS2raqippaVlaSsop+fmqirsK+vu7KmoKmompmYk6KkuaChpJOvr6ylp5+SoZ6Vno+QjZWemqKep7SmpoyYs5ujrpqdm62QnpOVk5l/kaGWj42foZOLpqywpaahnKCekpKak4WLkY2cnn9gZVpnZUpJTEpSQkNASUc7O0c/OTlPTVVeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ+jn5ygw6mkqrKho7SqlrOsp6KksqyuqbuxrbC1tMbAxMO1wMS9ycS1wMjBtKu1qK+4rL/Ds7eurLa5pZmrsquqmJ+ml627tJunsJutoK60sqerubKnurO4srnAqreyxL61xqi/r623tamnrKGXl5KmpaKimJilr7iusrW2oJ+opJqVlZOkoLeipKWWr7Gyp6qmop+bmpuWl6ifoJihnq+yoqaMl66YpKqXmZ6kkJqNk5eZhZWelIyPnJ2Ti6mpqqGnoJmelYyOmY+BhZWIlJ94YmhcampNUE1OVD1DQU5DOjpJPzc3Uk9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJcGhWQ1dGjHlmQzujo52hpr+nqK+voam1q526saujqrS2sbC5t7C3uLjEvcPHvbzEwcbAuMDGwLmptqSsu6zAwre3qqyxuqKVrbGtspalp5GquamfprCdq6CwtLOqqra2rbuss7O5t6y4sMO7vr+mw6uwt66pq6umnpiZq6KioZGXobGvs6ywuZqcqaCZlpKXpqG3qaWjorCxtKuzqKyfm6Cgm52lnaKXnaOzsJqfj5Olmp+ompSinZSXiZOWkpWWnJOIkJqZlI6oqKafo5uXm5OGjpiLfYyWhY6aamhsYGxuV1BRWlRBQ0VUQDs7SEE3OlhQZF5QVldFWV9dTUxSTl5LSj5aY15OSFBPXFVZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT0qJys9XHA9PjEuMGRaZEAxNjQ3Z1lgRig/OGx9Z1tWO4l7Y0M9p5+doqm9oquwq6OxuKqltrSsoK21va6zuLu6vba2wMK/yMS5xMLAwLjEvcG3r7Wnq7exu76/tKmusbael6uuqK6XpqiOp7ufpKyznqyisbCzrKq2tLW9rrCxtaywtbLBu8W3q72vsbisraqjsaaepamfpJiQmZ+zqrOrqrOanaebmpWOoKaltK6noa2trrGntK2yqqScn6ijnpWimZuotamXmZGSnpmdn52Qqp2Wl4SUloqdmZyTio2Wl5qXpqWioJ2WlZeTf4+UhXuOkoOLlmVscmdvcV5GWWZWRENNWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2BVMTUwPWBWXjgpQzNZVFxnSzaMemZMQKSaoaSstqStqqavrreqr7W6p6ext8W3sbe9wcK1tLrFvszFucLAur65xLfAubK0q6m6tru5vrSprbC1mJinrKqsm6urj6u9nauusqOrn7CttK6ttrK5uKqur7Kota+0vL3Ks6q2tbG0sK+nobOgm6itoKaWlpqasqOtoKWvl6GkmpqSjqOlp7OpoaazrKm1pa+xta+kmZ2tp5qYn5qZq7eil5ORjpecoZeWlKuempJ/kpeMnZyZlpCJlJKemaWioaCYlpGTlXqKj4V7jIqDi5JqbXhtdXthRWBqWUlIWVo9e0pGRDZBYlRpW01cYUpbXVpSUlJiYUxLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENfUVwuKkIvSkdQW0gzY1lVS0SZl6GxqLGqraakr662qbe0uaSstLfJu7S6ur+/tLO3w8DMyLzDvLe9v7+3v7yxva2nurm3tsK2qqyxt5SXpq6rqKOwqpSvuqOssbOnqKOytLGxsLWxuLSqrquyp7evtrTExraptrassK2pp6O2oKCnsaGklJyZlbGep5ygqo6oo56clpimpqW4p6KytaynsaeusLaspJmgrKibnJ6clKm4nJSOjoqYm6KXj5iln52UgpGVj5ybl5aViJaPl5qnnKOgkpaQkJV2hJCHe4WBhIyLbXB3dHt+XEtlbFxLTmNcPmJ7R0k4R2dXZlxMXmJNWFlXVFdUaV1PT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydHYkxWJS1CLT1FTFE8M3JrSUNDkJmlrqWtrqunpbGztKq3sbegq7W5ybmuwLvCuLOxtcLCzsXAwb20vb+/ur68ssSnqbmwtra/vK6rs7KcoKexraalr6WesrWrqrGyraqptLuttLK1rLStqqyoram5rbKxyMC4pbqwqa2tpaiusKalo6+kqZyenJuvmaOjoqORrJ6joKCiqqamuaWstbalqquora+2rqOdo6mqm6CampKks5mOiY2HkKGglIyUnJ+TkYSNkpKdmpiVk4eXkpWZp5ufnoySkY6Qdn2OhXx8fIeJiHBzcX18fVxTZG5eTllmXEZElltHO05tWGJbTGBiTlZXVldUWWddUVJMY1pbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGVISis7SD8zQkhTLD6QaztHSI+cqquiqbGkqaWztLG0tbKyoayuvcy6rsC6x7G0rbTCwtHFxr7Asr3Awry/t7vEp6y3rLO4u8Cvq7GtoKOnraqopLCkq7Kqr6ywr7Cuq7O8p7axsqmyqaumpaOtuqyqscO6tq27qaioraqps6WppKOuqqiin52krJWlnpiemaydoqiqoqymo62suLGyoamioKyvsaydn6eoqZmkmZmPoKeYhoSOiouen46KjJWbjo2Fho+Un5yVl5SGlpOTl6SbnJyKkpCNiX59h4V8d36HhYZzcnGIdWtfWWBuY1FzcVxLO4R8Rj9XdFhhWk5jW05WVlVXUVxiX1NPTmhYV1dLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMjU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLkpnREY4PEIwNUVLWDFAlVo+TEWVmK2ooaqznKqqsLatuLWuq6Wrqr3Ju7C9t8KvsayzxMPOz8O/vrO/wsO6wLPIw6uut62yuL++sq2tq6SnqrCpp6ixprSvqrCurbKxtKy0u6S4s6ysrqeroKOesLerqq27t6W3tqSqp6ysq66hqaemsbKkp6aioqyWqqGUm6CmnqSiq6Wtop+nsbetrqOmopuqq62pnKKlpKSZoJqWj5ick4KCj4iFnJ+Lio6LmI2PioKLl6OakZCajJOSkZOimZuaio6LinyFgIGDenSAhIF9c3aLo4d4al5gbmZXZYdjTj9nk0xFYnlXYllSZVRNVlVWVE9cXWFVS01pV1ZXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjM5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxCKzpKT140RIY+SEZEl5KwpaOqsZirqq22rLaxq6Wsqqm8wMC4uLO7taayr8TJy9G/wbq4v7/CucG5wMStsbWxs7q/vbKwrq2rq6e2qqatr6q5sKixsq6yrbeqt7emtLerrKSpqpyjnrOzqKiktLWgt66gqqirqayooKusqbm2qaqpqqOpoKyckqqhnaCko6ajqp6cp7WuqKaqo6OYpaenqpyjpKOgmpigkY6PmI1/h4yHg52dhoSKio2Nj4yDhZSimY2MmZCRkY+Sn5aYlouKg390hoB+f3h0g396d36BiJ2Pb3FnZ3F4XGBziGtPXplWSG14VWRWUWNPTVVUVVBPWFtiVUhQaVVWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs5Nyo0Oj0rLTMzMSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg+Qyw+TFRfL0ppNU9EO5aOsKGmq66aq6WssLS1r6umsKqpur67wLCuua6ht6/Jx8jQwb69u7zCvbrDwL6/rrKysbW8usGxsbKrs6iktKilrbOyubCjrbaxsLK7q7qvqa22rKqeqqyfo6C2raihn6+yorSqnqinqqOqoaKsrai9r6yuraKoqKCsmZCwopiioKennqebmaqxqaOgraKhlKOjo6eYmqmlmJiYno6Kh5SIfY2GhIOjloSBgYuGjoyQg4OToJaIkJyQk5CNkZyUl46KhoV4dIF/fHV4eYB6dHN5aH+GpHVpXmRrgXRniIx9U1hwXkt4c1NlU1FeTU1SWWZOTFZZZFhGU2lSUT9DTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS4tNSkoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGc6NDhfPWFkP0YxQ1BbWytITTlVQTSRj7KgpKespKejrKe1s7GrpbGoqri+wLyvp7mqpq+wycfI0cO8v765vr+8ybvBuLCvtLG6u7fAsrO7rLisorSnp6yytrmzp6i8ta62vrC9pqystautnKmvpKClraunnJ6qsqSzqJurp6mjqZ2kqaipvay0r66dqaSgrpybs6OVpJylpZ+km5upq6afm6qim5OcoaWemJepqZKYmpSQioKPhX6Ogn+HnY+Ffn2LhpCNj4R/k5qThZKhjJSRi5GakZWGiX5/cnt6fnxoeHx6dXBwfGeEeISIZGFnYnKFem1neF1dVkFXem1UYVBSWEtMTnF1XUhaW2dZRVVmUEQ+Sk5EQ0E5SEdLUz9qYUpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEmLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mY0FKN0dTYFUqPTlEVz4qj5SxmZ+gqaaloKqluLOzpqmxp624wb21r6K4raiosMLJyczBtr3Atbe/uci1w7WzsbWxvbe5vbWtuba/raGzp6ursLW4taufvbyps8G0vKCvs7Wqq5+tsKOcpaiqo56bpLCmsKCfq6mooamcpKihrbuorrCuoKujpK6en62ml5+boaOcoJyapKqjm5ulpZaXlZ+ilpuXpqyMnpGRkYuCioCAjoB7mZSMiHt+i4WOjYuKg5KYkYaToomSkoeQmY+TgIh8eWx+dnl4Y3t7cXBwcndogHNqg2dlZ2Btc41sYWlvYG9AW3hrVV5PUVFKSk1UWVdNXV5sV0RYYE9eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTc4OzIoMDkvLDQvLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDFCaFkxM1M9ZV9ETDZLVmRPKjsyTlg9I5OZrJmgmKeko5+npLiwr6SvsKqruMK6s62fuK+rqLS6yMvIv7fCvrC0vbfEtsOxrrmxs8C0ur23qbm4vauktKipqrCuubGqm7u9pLDBtbahrra1pqensbOgnqSmp6GlmZ+sqKmeoKqvp6CmmKOpoLG5n6OxrqCroayknKanqZqam5+jlZ2dm56pppecoKiSmZSYnpOZlqGqkZqIjo+GfYd/go59fKCMjIh4gouEiYuLhYeSmo+IlZ6IkZWCjJeMkXyFe3NwfXF0dGB5eGlucHBuaH1xY3ttaWVjX2WFfl9ac2tyTEx+aFhaTlBMSkhQUlBJTlxfblNEV1pSaE9IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy86OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo+MFhWNSiXnaaZnZasoKChpKK4q7KltLSqqbnEtbOtn7etrq2wtcbIwbe/wrmxtLy2v7u+r6u9r7S/sLzCuKm7urenqLWpqKuwrbOwp5q+t6WtvLeyn7C3sKilp6+xm6GkoKSkoZebr6ahnqOor6GgoZOkpKK3sKGmsaqerKOvmJyqpamemJqepZObnZuep6uanZ2llpaYlJ2Ok5eiqKKQiIuPhXqEfoSLeo6Xio2GeIGHg4iLjYWNk5iNjpaYio+XfoaXi495gXpwcndvb3RfeXdkbGxraWiCbWVya2tlaFpic39eWmx2aVpIfV1bWE9PSkhIUlVGMjpfXmxQQ1dWWWVMSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0R0JnW0hUQ1RdaEUuOzFfVCwylqOhl5WdqZ6moaOhuKqvobu5pqy9xLOvrqK1r62tr7TExL2zv7q3sbO5uLq4uq6tv7O0uK+/wbisvbq0pqKzq6iqs6uusqOcwbalqbe3q56yu6mmpaivq5mip5ylppSYobKlmZ6kqqmcoaCUpZ+kuaikp62mnqWhqJOfqaKhoZmbnaCSm52XoKKrnJuZoZWTlZabjpOTo6ekj4iKjoZ5hHyFhXycjYmKhniAg4eHh5GFlZOSjJCVk42OlHuCl46Kd357bHVybWxzYnl1aGdpZ2VuhGdnaGRmaGpfZmJpZlplemNgUnNUW1tTTElHSU9TQCEral5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LTExOTUsJi41LTgwNTc2YHRCM0NEaFtLV0dVYGhCMzc4Yk0nMp6ko5KOpaacnp6epLWtqKq6t6isw8C3r6yhta6nr6+3wcC9ssG3sa6ytrW4t7Wsqryzr7KxvcC3rry8saWftqymprSpq66hoMOsqaextKystLqdqKqrsaWYnqqeqKWRmaatopmdpKqhm6Kdl6Cdp7amsKquoKGdnaGVoKafoqCZm5qckpqelaaeraKYl56VlI6VmIyPmJqnoJCHioqIeIV3goKCnIeLgol7foSIhoSQhJaVj4+QkZCRjZN7g5WNhnJ+fWd5cGtqbGd1c2tiZ2RjdH9hZGVmZWlqY2hvWV5YXWxkYU1oV1tgVklHSEtMUlg+OWBsaUdCVVNdW0lIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyssMEEqSksuLyorMzcyMig1NyQrNy43Mjc4NVx5TjI+SGlaTFpKVmJmQTozQGVHJTWbpKCRjK6gmpigl6W0sqOyvrehscW7ubCxorarq6+pub69vK3Asq+urravs7iyp6u5sa6utLa7trC4va2mnrWroKGxpauvn6XEobOlr7Kvt621na2vrK6imZ2nqqWflZuopqCZpKOpnJqfnJWcna2wprqoraKhmpqemZ+kmqWdlp6Ym5SaoZKolq2pm5SdnJOMlZmOlJSYp6eNjYqJjnuCdIKBipiFh3yJiISEioyIkoWTnJOSj5CRlo6Qf4CNjYNvgX9meW5oa2pncXJrXGhjYnJ/YGRnam1sZ2pnZGxcbG12cWFUYmhjZVpJRkxNT1hRUFVhZYFUQFZTWVVGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOktqW01bS1hkZEBBMUlkQyc0k6Kbj4+xnZuUoZqpsrCfucC2oLTBu725saW2r6mupbe5uLmtu6+tqqu3qrS5raWytbGuqbG3trGztbqoqZ+2qZ6fqqKqrZyqwpmvpa+xtrWsrJ6xra+qopudpKyonJWcp6SdmamjpZWaoJ2RnKOrqqm7n6akoJiamp6ij2uilZiccYOWnKSAdpGrqJ6WlqGRiZeZgJeKn494hZONg21pfneDcGyGioZ9hIqGb11kYGeEl4Zri5CUknV3i4R/g5B/ZoiAaHZpZlhdaXRuTlBqZGZxgmZeZGZubGleXV6JkIWIaE9LRDhFVGdeSkhQUFVVS0hTYG90ZUVbUVVQRkdGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTVPa1tOXEtbZmI+RzFPYjwrL42kmYeVsZudk6Ccqq2ro73Fr6m3wri9va2ntrCmq6S4tLO0sbmtqqestKawtaKnuLa1qKestrOutK2zoqmftKueoqScp6iarr2VqKewtLitraSorqqrpqKfnKGop5yXoaamnJunp52SnqCZkJ6oqqO1sKOio5yWmJiYpImhj5Kah6GIlJ6hf6V/p6yelJOdk4iDcniNjoOHoHWIjWmXiGZ9c3igb4iHg36MfH+hoJ+Zf3uHnnSIjnabimyIgoNtaWVke21yYlSGbWNtaZhxWGpwboZXXmlba2pbiHBteXKHaYeEWl5GTj5GXk1FUlZWUVBSV1RnXkxZS1JSUEVHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdDE1UmtbTlxMXGdfPUsxVWA3LyiMppeEnaydmZmdn6uqqKq/w6+yuby3wL+qpLexqqyms7Wur7O2q6mlsa2ltbObrLW2tKWnqLOxrbKor5+qobOpoKSkmqKknbC3laWmp7a9pqynqaqsp6aioJmgqKSZmaajpZmcpamWk6KclJOjpqagtqSjoKOYlZOYk5yIrpCYlImpi5iknIaxgKStnpSan5V5gtSof4eUwJvGeHexpbeXZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4FslrGrsHlobFixrm9labySvG5oem1xj9h+U2pjtrJ+gHGUdZqhqpBXT1hhT1ZORlRbWFFQU4tcV1tQQFxFUU5ERkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cxMVRrXE9bTV5nXD5MMVpcNDEhjqaTgaeqn5ednaWtsqmxwr2ytb+1uL/Cq6a0ra2pqK+0qq+2s6inpralp7ivnLKytaqlpKeyr66xpqqep6SypKKin5ecoJ+xrpWfo6C0uqKpqKGtrqWinZuaoqqgmJuooZ+YnaiokZynmpSeoqejoLCjnp+jlpaSmJKZhbBraoqNqn5nhZaHrWVxnp2VmqeWca6hpH53unxroY92sV9qtFulgGWckWBmgXpmf2l4aqllvnJnpox2sWp8sXh1kpRjbW2nblyEoEVpZ4eWRXWcYH1me6Ongllfi6tpgJJ4emqoOEqvW1dUbWNbTE9YX1xXVjtOiE9XVi9JVFNKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVeWTMxG5KilYKsp6Wfo6SqsbettL2+sLfFsri6wqeosKyvqamxr6SxurCkpK+zo6m5qZ6zsrCjpaCqrbCsr6aon6OisZ2knZiVmJudr6iXnKKftLOhq5uhra2gnpqXoKOqnZmepKGcmaGnpJCdo5uYoZ+sn6WmoJqfoZWVkZaRmoa1m7V4hamZtZl3h7Obt3+TlperlX5rgaZ6gYWGkZSSd6tnarFbrHuOh5R0iHCOhoF/iJCXeIOCi5eMg6CPhbB2d59xa2psfItPpVhIY2OZfmNopmB5cXVSk4ZeUKltY3F9hoBhnS9Som5bVGtnYExLXGNYXFpCPrB4V1hBI01oRkNEQUBBMTk+ODk6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQUFEPEZEOzAyMDI7RiwwLjg0MCwuKC8yLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0o4YVU1MByXoJSIs6amoq6pqLOsqru2wrC8wq24t8GqrK2vrqeus6qir7yqoae1raOrtaSlsrOoo6Gdp6qyqLCopp6goLCWoJqWlpeaoK+jm5qkqLWuoamPqaepmp2WmKClqZufnaOfnKCipaOVm56YmZ2iqpulmpyaoqCWk5GTk52E1ZOZuXGwwn/GhnzWlJy7fJuWppCNnIykeo2GooGlgnqseY+dVq97iX6farlauXeGg32mgpN8mHqqeY6dkHuxbo6EdJC7hW6VUK+nxYpRoHpjYKpic3KGbJeHX1O1tMiFgIl8Y6QzQp11XVBqaGRQQFhmWmRhSkhNa0paU09ZZlpDQz9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0tcUF9mVDdHOmFQNzIlnKKTmbGoqKWzqqW0p6S8t8GxusCytrS8s7ansrGjsbOmoK+1qJuouq6ir7GgsrSxoaSenqipsKm0qaWcnp6sl5mZl5eWmKKsnpuXqa2wqKOfjqyip5admJyhpqKYoqGjoZqioqebnqCelZmapaCcp5Wbm5+gmJCSlZCdiLJuaLVxq4hwjqZytHRztnubmKSNj5yNon6Pn6R+sHWDkdLRdVuufIV/pG+bqqZrhoV9rX2XmY97sXOTnY94s2WWdIWebp5mlFLJi1rCXJ95Yl+tX3ZzhmKXiF5Zyp1vv4B1TUu1U1XGZFRRamNmWEFPal9saVBVRkk4PVdSW1ZZSUM/SjwyPzs1PTw1Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUU+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHJoOSdXaVxCTlRfZVA1Rz1hTTYyLqKdkaWvrKSqu6ymtaWntru8sru/uLe1u7u0prW0orKyo6Csr6SYprqupLGwnLS4qqClnaGqpbKorKqlmp2bqZ+WlZiZkpOjqqGXk6ersKWilpKsn6WSlKGcpKeglZunp6Kao5+tmqCenpCVm6GdnKWVnZWZop6VmZaSm4Wse3eodqOPi4epb62Kg6eEmpmiipKZi6J+kpeHroV/grNccrNSrn2CgqR/cdd9d4R+j52GmZp3r4aKkZyId7RhmmWagoGVbJJbsFdLmnWYeWZgrV52d4dnmIhqXa93lZ+PeGw1eciusl9CVG9dZ2BFUGxgcW1WVU0uZWJoU1lQO0JEQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6NzegnZSguLCYs8GsqLKnqrK6uLS5vrm4s7a9tqa4tKC1raCgqauflae2rKiwsauttKSbqZ+gqKK1p6aqpJmelaWilJScmpKWo6ablJCnra+loZWYqZ+ij5GimqmmoZWapqmenaSerJ2gnaCNlJ6bnqGYmZyWl6GglJiRpp2GqX19pXmhj5CDqnCtjIGmhpagooqXl4ijgZCHlKp7f4udeW+xWqiDgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH2ClG2TXKtcW5N/kX9oZ6pjcnuAapiGcV2rWomgj2tuZU9KQ6FcWk10XWJmTVphX3J0X0pVNUqaklhIRT1IRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8xVV9iTDdGSV9DMT03opyamr+smLTCrqutqKa0sLixtr+5urOxuL2qu7WgsaWfpqennpOqsamvqrWtqq+hmKGgpqSkuqKjrKGXm5GjoJWVn5uVmaCgkI6MqbCvpp2Xmqimn42SpJioq6iVmKmon5+go62joJ2hjZSgmJ+gkpyXnJWdoZWWj6ubj65ucrR0qYx3iqZztHl0tIGTpaOSnIyJpIeOdbhvjHuLomtrtlqhhmWXl2mgoqdtlHK0dJOYf7JqhpKIrWt1s2GdZqJuhpJrl1ytYE6hfIeRUnOjbHl/fm6YhnBcr1Y8nHdmVG9uLlunT2JSa2VibFpiXGBwfGNTWVE+Pm1vMkJCQD9NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssMzI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VfYUw1Rk1eOTFBOKWam527opyywK6tq6unt6m4r7XBtb2xr7q5rMG2qquhnaekop2Sq6qntaOyqK6qoZecqKClq7mdo62clpmQpaOWjp6hnJmen5GTlau2r6eZlJusqZeMlKaapa2jkpersqSgnqirsJmhoo+YoZegm5abl6GTnKmdlJCqmYfTk5q7dLHEgMOGfdWWm7h5iZKZjJeJjKeHeaK2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+ifox0h6t9vm5zvHSyg3V4gIptmohxbY2kdL1dd31bYXm8alpWW2l5XmlhZGZibXlvWVtZQ0FAcj9DRis1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy02QDmmmZ6ivKKXscKwramqrLGnuK+3xbG7sq68sK7Bsqylo5+koZybkKqkqrKktaetpJ+WmqqZpqy5naOumZWhkKagk42co56YnpqQlpOvubCrlZejp6eUkJalnaStnpGgqKugm5+ppLKeoqSNpqGUoZqbl5akmI+woJKVqZ+FkJm1gJGRjbiVeIKTm7V3bmxvc255j4SOiXOewbu8mXqBsqhwgHSRuYN8hoaLh417ioaNl3yku7m9nHV5s6N0dpd1dLB1mJ5mhmmNtnRycXe2jF5/eX2IZ4N5bXlii6xwdIV/WFunakRkWVRmX2NdY1FnZ3FtdUJNUE1EO1pMP0ozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PjcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NhVzgqT11dPSs7VlYnPTo8pp2gob+mlrPCtKuqqKyrqbuuscavtbSuuKe1ua2po6Onn6CdmJOspK2qprWoqJ+blqCjnqylvqehqpiVnJGim5KPoaihk56XkpiUsrW2rJidpKSii5KSppylq5yWqaWmnJmgqKemo6igkayel6Oel5aYnZ6PsKmTnKeijmp+aZyneIlzfpuOdXplh3u+v8C6bpKCcZWFX3JqWl2aiWFkh46Va2B/lWNtnHZilGuAmpWUZV5fY3GbiWhyjHyGlGZqfnF0eX59Ylt4dIFoUFxug3x7impYbHmBcklKb4VwTnNNRVdcZmFMW1dmY15PWm12anJST0RFTTxISTxNPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMTs6Li8tNzY9NSYiLyoyLCU7OC03SVJfSSdTX1Y0KVBeTCgzPltPJz8yPqifqKHBpJq0urajrKaup6i1sqzIrLCzrLakvrKzpqCkqp2jm5mZrKeupKW1qqSbmJWim6atqb+oqaaWlJuWoJqTmKWpp5GekI+YnLCyvqybp52noomTkaqbqKSbm6ygpJqaoqesop+poZmvmpWmn5aUnZ+dl7GlmaKomZyRnpyjpJmno5qdmpqakJaCaG59cXaRl5SRg4m0qY2FmJWOioyYloeTlYqDk5OQiI2RlJmTmZeaoKGam5Sfm42CeqSFbGl7kH2AdYmLgnKCeHl2doqAe4lqc4F0g3Vkd312a3B6bWBjW29nTFhZZWpfV1lwem9uZlNPRlI5T1pOUk8oKztKQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7NDg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5UMTBUXjorPThdSyw8LUCyoLOhv6KksbG3oKmms6elsLWqyautsqa1psCotKGepaacpZWVoKunrKOjt6ygmZaWoJetqqbBn6yklpKcl56YlJSinp6jqJKQmainssOvmqudqp6Pl5apnqucnaCtmKGbnKKlr6ahpKeerJiXpp2ZmqGenpywoZ2ip5WYk5mUoKKWo5+YoY6WlIuKjY+XrY97lZuCkYCJqaiFgJiWioSOn4h7g5CGhZqRh4aJlY6bl46QmJ6jlpmSkJyNfo1lobOuhImEd3uQin13eXpvZ3mQgYCJa3WBeYhyaXN/eXWDh4JrdGN4Zl9oZGNkZmpYa3twamtcU0xQRF9VRkA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1RWVlhaXF9hY2FfXV1dXl1YVkpLTEJJT01SSjs8Ojc4Ni8zOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAtKC5r76sq62xsqCqprKtoqyzsMawq62ks6+8pLScoKeioZ2Zl6imqaakpbO1npWUnpmZr6auvqCso5GRnpqZlJKWoZyXqZ2FnamsorTHs5+ppKqWlpiap56pnKCkq5Sen56gqq6opqOroaybn6CgmKSenJ+csKSZn6iTmJedkqWamKmfm5dmg5J8ZX6Pmo9jeIxsaGp6kKOra2SZl35nhYplZWloeo2hjmtojJeRondraouYop+Yc2xueoSMhnlYZV2Fgl5si4qCdltoc3d3kYCHgm54gnh/c215hHN3iIiOg3tphVhdanNkXXOIaWt8cW1jXVFOV0lkWEBKMz1GNz9GRDcxPD0/QUM7O0RHSEhJTE5PUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSS42Wk82KUVZL0RPMVlCOz8uPaWfury5r6uzsKulqK2usKeurbC9saqopa2wsJ+tmKCknqKamqesnKyjpqips66elaOQoq+mtrmlrqOPjpqhmZOSm6CYmaaWe6Wsoqizw7eloqevn56VnqOfpJykqqiSnqGeoKqvqqqjqp+nm6afp6CslqGcpbGkl5yrlqGem5Oll56rmZ5+voOIcrRyhZ6FrWh3ucS4cZKho3ummJhzqoJ8y8DAu3GKo4eCnnyWmIiewL2Clp2djZzBwHuBepGMmsK/fWulsm+MgW/Ken+bd5GDjoB2eYF/eXF7gIZweIWMk3lsdpFiZV54ZF9lgWJedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2FfXl5eXl9fX11cU01QR1VOQUA/PTY0NjgyNjYqJiUjKSomLisqKTEwHzkqIz5IW0wqI0NQLyNGWzNQWS9VQUI7LziWo7jDtLCvv6mplKOvqbCvraayta+qpqelsaufq5iboqCcm6qnop2roqWppaS0pJ2jk6aurLi0p6+ikpGZnaWSkaChl5ugnYemqqSrrb+/saGprqmXkp+eopmipKqjk6Chnp2srqispqOipaCkpZytqJGkm6mtqpyeqp2topaXpZaho5idf86UeXqlgXqWlptfrY9djqiAoKF8p5WadKuDgK9eZIypeqiHhZ90l5KIs2OCq4agjY2zaoSudHyWh7hhgq1Zo81ukHV723t/mXF+iJJ1f2V7iHZ2bH2Hbn2FkJF+bIGNX3Bqb2ZgX3hkXHFoamNmYFJUU1deSk9DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w6TC0hUEBGNC4xrcLAwLW0sLeYnpGjqqmttKumsq2trKSsprCqoKebmqaYnKKvn6GfqKejpqGfsKybnpamrq2wq6isoJSSm5+lk4+epZedqKOerqSrsKi/xrOoqbGulpKenKKXoaqqn5Whnp2cra6nqqibpqWjoaqSrLOWpaKqqp6kqKahsaKTmqeaoJqUlJGXoHCFjJh1hKiHcbB8nXKsfaCfgaWPnnergn2tf5xyrX6rh4afdpiSe3yXfqqIoYyRi5x+q3uIko6ggHqtVpzEeo9vksF9gZVtdXCMbWZ3ZYZvYXducm6IipGPg22QjmRuc3VvYGZtZF9vaGpuZmNXU1xgWlJSQzlJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MjQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi08KD0xKTNWQEYhHEc7QzEtK6/UxseytJ+do46joqKtrravqbGnqauorqurpqKjnZqjlp+mq5+ipqCoqKKfnrCsmJuXqKivrKinqZ6XlZqkopKUoa2bnaejrqyjrLWpuc2yraaurJaVnJ2imZ+urJ2WoZmenqmwqKmomqqoo6Krm6+xoqisr6aap6yqqrKjk5ejpZqUkYSkaqR1iXqpdXqycYKliZiMcIefmoekX2BSq4R/roKbda6Cp4aGn3qZl4V7ZoCjiaSZhoGjfal/gZSGrl58qFWdopKBeqOfgHvDr8WMc6+0s7lxYqmvwnVojIyXjoFsmZFubXh3d25rZmRkcXBme2ljXVZfaVhYVExMUUxDQ0FCO0NBQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXWwKGZq6ihr6KfsLWwr6qto6inqqurqaSmoJuln52mp6aknayaoquhpJ+vop6bk6qktrCuoKmbnZeVp6SRm6Gon6CmnLCmo6ixrLbIsrWprKqVkZydopmgpbSdmqGUnJ+mqquirZmrp6GhqqKzraKqs7KinKupr6+3pJSWo6eYm5J8qmyehId1q3l8sG6CpIuIn5aVnpWB0re0uMmAgbJeX5Spg6SHh6B6mJWZeKrJc5mjlKipkJOajH6aiZrGxndloYKlc4GfjoJ9r15vtWOxdUujhm2nR4KTZI6PnJJ7cJaRfW96dHx6bVtlanJxZoFpXmFYY21cXllJTExLRURCQj1BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE5UUR0cOzxGMiwkqKTBxrmtqbOurKWinbK5rKqhppuopqusqaagpqWYqqOfrqydpqGsmp+ppZ2ntaCjmJOoq7ayrJumnKCWkaatkZmcp6OgqqauoaOnqbC0wrGyqq2olImYnaWboqSupZehlZmcpaWqmq6crKalnqyjt6ygsrmwnpyvp7O0tKaVmKikm6COgp1OeJqBf596hKN8gqSEhqaenJ6UhLh7fHm5gn/MxsO2d5uhkIuffpqWl4l2n5eKpJikqH6whZyEnoSsfZmUYaVso3CPhZCBfZeEcqxgpHJxgJpgvH1SVXWOkaOWe3ySj4hzenKEfXBcbG53cmqBblpjX2huYmRdTExRU0FIR0ZJOTlLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFdZWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9URjxFMjpQW1QcGzY/RywtIIyHmamspKu5q6+gm6Gss7Smn6GVpq+urqmmnaammqOnobKuoqmnsqCZqKSUorWjpJaXoqq1uaSco52jk5CisZmenKaloaKvrZ2kqKK1scOxraqtqpGHkZynnaOknKWXnpiZmaWjqJmtoaykpZivpbusobe3rp6etbK5srSomZ6woqSeho/RtcO3eYeOhZGTj4CmeJSid4ugkoWlgotxq4aFtG5yaZmjnJWJn3yXmYaHkHOugqWboo2mi5OciJSQmm1wslylc5N6nGyZf3uZfm6pYaJxcX+fYnOyuGh3j5OkmH2Ki5GKd3x4jYFsaHdpeHNuf3RcZGRtbWVoYEpaV1g8SEY/VDNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpaWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgjKSWSco2Krr+/vLu1npeopK22oaKZlaOpp66pq5mloZ+loaC1p6Kpp7CjlKujjqStpJ+QmpqqtLSknaacqZKUl66goJ6mpJynnLWaoKqjtavCr6mrqaKMhI+coqCmo5WZmpyYm5imo6aYqqasoaSbraa9rJW+sK2fo7Czuqy1qJypsqWpmHqnkX18sHeKgKSliJxtsm+gh617oY+DqJWagKyJha6FoJSooaKXhZ+AmZWAe5J+q4CdmpaLq3idoI+Ik5J/ea9do4F8pqdknoB8l3Rrrl2la3GFmV1gW4ygbZSQpZiBk4yVinl5gZZ+amx9Yn10bX95X2ZlcG5nZ2hCWV9bPUpTMlQ4QkJDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaV1NQT05JNzA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNTVldXWFZWVVFIRklKIygovJKahKnGw7bBtJ+araCuuKWjjpuko6Cvrqmfo56drZieuaCiq6CvqpqtoJCqqaWWiZqQrrCspqCom62YmY+toqGdpaGZpJytmJ+opbaov66kqaOfjICOm5ufpp6SlJmalJmZpKOjmaeqq6KjnqmovqSXw6yro6Kss7qsr6iitLCqq5l2r36QipyFh3y6rYmYZLCMZZWtfaGPg6eWm4GtioSwhaaZpKGikISgW2xqgbNgf617e4KAsmxnbpmXi4ixW320W6SDa8iiZZ+Be7xZdrVasn1Sr4B6rFiAoW2XjqeaiZaPlJV6eI2bfGNzfGGDeHN/fGBpZnBtZmVlT1VjXEFUXj1IKD45PTQhIS0kHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE5KR0M1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7G3vbu0wbOjnK2mpbapoIuZoJ+ds7GonqKfnbSYoLOoqquesK2eq5qUrqiijoibjq+sqaejqJmvk5qPqZqhnqWemaOipZmfo6myqLyvpaienY58i5qWoaCZkJGam5GYlqieoJinrKakpKKkqbueoManpamiq7S2ra+ooL2vrq6XgamSo66Om4CGpJeYkIGAuMO6g46dk4SnmJ2CrIqCr4mmm5qlqpF+1b3CqmKjv718fqOCg9e6t7WFk5KCnr2+hGqjgW+rhG6df3qysceDa6uwvax4d6K+u3SAlY2lm46Zj5WbeICQmXlifHpjjGd4gXtga2VramJQYltTaVxAVGBCTCk8OjUvHx8kHiUyIB0kKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbS0sb+6sr2zop2upqWzpp2MmKW/qbawp6G/pqaxm56xnLmon62upaeUk6+sl4yDmpGupqOsoqWcqqCYi6OTpp6nm5qgqKKZnqCsrKm4raejmpeTe4eZkqabk4+RmJiPl5OomZ+XqKifqaahoqu7nqnFo6Cvo6uztauxq6K9qbCwm3R2qqS2hWWJn29nrI+Kj21vd6SQmqCBdbCalnCQjXKWp6ObmK6kcm1tbGWKeG5tgplxgHppcGlmiZaVmHFoaYWGZ3CGZF2KY2lvWV1nfnimYGJyj5JvZmSAjZOOoZeWl4+UnHyGjpR0ZYZ3Z4xqeH54ZGxjZmxiS2RYSmtZOlBkRFAnSjorIxwgGiIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWttKq7urKzqqmirp6ks6qYkr2xw8i+tKmev6uso6Cmq5+6o6StrK2ljZatqpCMhZWXrZ+lqqKfpKSgkYulkqeZqZmWo6qglpylpqevuaqrmpuTknuEl46ml46RkJiUjZeUppOel6eimrCmnaKsuaCwwqiks6assbKrr62puqWwuZeLoamltpyJlqGXhqmakJSdk6qzmZujrKGzl6OhnqGinKCkoZWrpoySk4yHkpyclJCZk5iQjpWEf6Sal5WOi5OSio+GhH5ni4B0g3Z0h4xxp218lZKUk4GBj4+PjpyToJSWlJ+BhpOLcGeOdm6Jd3V8eWlrZGRvY1VgWUBpWkdiYE5YK0U9KyYhNjQwLx8cISUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5UUUpFQz45PUBBU1hbXFlXWFhYWFhZWFhaWltcXl9fYF5eXl9fYGBgX1lZYKWWqamltriurqKwpa2foLaxkI6qxLvFurepoaWdm6WdsKijtqedqbWmp5GYrKOLiImPnKeWrKSimqien5OVo5eomqmZlKahpJCap5mhtLmnqpiakIx7gZSMoZSKlJGVkI+Sl6SOnpmonpu1o52mrLeor8Kuo7emr6+wraqrtbuisb6akqakprWikZ2mno2pn42Sn6OssJuhpLKpsJmloZ2kq56enZyXq5ySmaKblJCWqpmNmJiWkJaekYegnZWUhZKMkI2Vi4F+Zo2HdYd2eYiEdJxqh5GVlZKKfYyWkpKXkqCRmpSeg4aWhXhxlHJ4iX5xe35pbmRfcGlgW19ZbWJQYGRPWTlHRkU9Mjw9OC8qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlaSno7G0rK6jqaetoKi1qpCPnKOyu66qq6GimXqcorCkpbGplpu4pqOUmKmcjoaKiZuikK6fpJeooKGSl5mbrouqlo+omaiMmKiOnri2o6WYm42IeYGTjJuTipWRlJCNkZahi52dp52euKN/g6+1orCvdKS+o7KgeHqhrLO9lneupaCKgKp+ZFthdp+OpJ2Dl35uk7Oco6ivq6Nln6CUdHqalnCAmKiXbH6iqIplnaWbkJeYlouSm5CEnZqQlIOSh46OkomFd2uQiHaHcXyGgYBhaYmLlZOMW3aVkWdoj41yeaKWl2V3l4aAdpdogomCbnl+anBlX3Zva2toW2VjYWFvUlo9TU1OUkY9QFRCOTEvHh8mNDozMDY2Nzg8Oz5AQUJGSEJHRklLTFRVVVldYGhnZ1hRSTxERzw5VlJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqaWpraOnraWSlqq0rrGlmammqpdzi5yvn6irp5OWuJ+gj5yknpB+iIibno2smqSVqKKejpeRnoV0ro+IpZqokZajiJu5s6egmZmLiXV2k42Wk4qTkZCUjI+Tn42anqWYm7KWgIybtZ20jJKPvaehfqeieqSwuYGOjqefhIuFj7Cpr4yJlqKZeYGLrIacnaKoqqiIlYeZd6WbeoebgZemgoF7nLJ6ioafl5mUmJaBkJaWhJmaY3mHkISNj5KLg25xkIh6gXGAgYZ/hnSHhZaSeJZok3SgmnR8mYKdmoWYfZGJgYKYaYyMhGp4enBwZ2R4bmlsaltkaWllcltdSFRMUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dSWFpYW2FhaGZZUUg5REs8PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2Yo5+mrq6rqKygqLCnp6qlmZStxryvoJWlqLSdj4Ocq5unoqCNkL6emY2fmqGQfIWOmZeIrJ2jlqGhko6UiYaAkaiOh6Kco5OWnYaeubGnnZqTj4VwdZCJlJCKlI+Pm4uOkZ6RlZ6jlZ2siJ+0ibSarovKiKuvibeFjbCDsa+EqY2nmI2dfKiPcnt3m46mlmiVpHm0i5+epqiTmcKCf6uImKFxnoCapX2XhZWxgaF8oJOfj5iXgI6Tm4mYkot8hZOGjZSTiYNtc5KGgHtyhoGEfYV1hoKYgY/FZoCph4+iap2BnpeAmYCKi4OImG+NkoRnd3R7dmdodXBnaGteYm5sZmtYZ0dcUUwyRTQ2TWFjNyY0PERHRDo2MzY1ODs4Pj08PkJMP05JSktDUFpdXFdiXmpsXFFFPUtNQEpkWF1jZ2hnYmJiYmNjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS5saqrp5qUn6KkqqKVpKm2oq9/oKacpZ6diZS8mZONoJGdj3mDlpaRiKuZnJuaooWPjHebnI6gkYiepJuVmJeGorispZmbjY1/Ym2Qi5OQjY+MjJeLj5GfjpKeoJmhqH6hp4etnaCWrpCgnp2RhoKgjayvh6SNqpqMmn6idYCYk2uBq3RNq3iHjZ2Sm6iogqqrfoShe3qnaZ5/kmxnl4aXtYiefW1gY1iDl3+Me2Rni3OZfXmWa118l25fU3GFXGBseYNgWWWCfoSBmHGnqmuDo25ypXCfgpxnZJ5sWmyIemVZX4J+YVdQb3ZlbXRxampuXmpvbGtoV2hOXVhFOUA0R0ReazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpbXV9XXl9idmBNRTpNT01UYlxbZmdpaWJiZGFkZGJhYmBiZGNhYmlrZGJkZGdkYmdlYWNomJadoLmgqqOmrJGhtryrr6KZl5+hpayrn5yttKKnkaCfn6abmY2YtJmQi56MlYt1gZSRjIqmlpaYn55/k4WGrKOHnJGKmKmYmZqRh6WwpqKVmYiJgGluiIeLjo6Ji4yRi4+RoYyTnZ+boqV/k4GPo6GUoHeclpCng6KogIaqrYWleYt9hJp9onBykoeWe56MeW2Hm4uZkZypm4+HnXyConN2pmaefnekXph7fZJzom6Yt7S6c5KHgYC2qGSBxrh7cJW2jHGAm6RjdKyrYH1qnbN+bn2Hg4+Ci5dxgKNsc6RznoJ9o16cmbOWb3uXnrN0cluesoJpYm9zdXFoblhrbHJyZFxoXWFLRD1ENVFBWnEyPFJGX0pTPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWVhgYHxkSUM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mauck6COpbi2ra6gmqKco6Okq5uasayrkpegmKCkmZqUnqubi4iReIuFcICWjYmPoZCTlJ2XfZGKjqigh5iPipKik5uajIqop6Sej5aHhH5re4Z+fY+Ng4uPj4mOk5+ClpygnaCfi4l3nJiijaByoouIqYicp5GYqat/rox9eqCZeaOTeIBzl4iMnH2Wn4abjpmcp4ejZKF9iZaQm4xsnmiajW6amXp/iqd9cmdzqoOdgnOqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxep3Z2iYqAnWiadYeTkpiOf55tmZBqpplcqH53u2p9qVqOhF2zZ1xucXh3a2lbcGp5eGFeZFZhQVBFTzdWQlJuNEpaWV5OWkRAMTUxOzs3SD86Q0dVP1hSWF0+RGJdVmBRYWN9akVCOU5bXllkZlhmZ21tYmJlX2FhX19gYGVjXmJkb3FfZGVla2RjaWhna2mVnImqtpuoiWOVnKy6srCsnaabm6efnayZnbCnq52Xopmhn5mWlqCjmYaJjWmIgHF7l4iLlpeEkpWYj3qKhJajnImVkIaLnZGcm4iPqKKfmoyRioCAaYGGeX+WjHuIjY6HjpWaf5OhnqCik5hyaJ+KoI+McJKMgqmImaCkqqGofbCtpKK4l3ajs6Kjf4iUeJ16qpp+oo+enJiJmHKhfYWNsLV9a5qRoXh+mLSjo6uohJh7mnycmn5zqlpdb3uXi3ieYkx/e3uFZHqYQk2fWaJqcnyOboGKhJl1m3mHibGzf36akqZ0fp1tcXyUb5lyaaNdlXZIZWNgc3B9fW5mX2todntiY19QXVZcVFZAWUVRZ0VSVlxhWF9JRD1COEBBOklFOExFWEFWUVpWREZhXFpgS2BtfXJFQzxVXmJaZWpWaGhtb2JmZl5hYFxdXmBoYl9lY3ZsXmVnZmxkZWxoaGtplJ2Bsa6ZhFNfoae0urOzqZqii5upnJynkqCro6Cnj56dnJqZlZihnZaHh4l3hYFueZWFkJqLfZGTlohygImSoJtykpCBiJmUn5qEjqibmZWLiop8g2yEhXGBoYx4hY2Ih5GXlHySo6Ceo4iuhn21hI+enXumlnqpgpaekYuinX2naHdtfplzoHNxfJ2FmG+Tgq59o4Onn5uBpHBeqWh1o2NvpWGc0498epl4cnNjooWPfqJyoo51a4+zi2CCmIpzqrKnvH93g21/v6aqtF6cb35yl2+Bc6JyXaNndKZgaKZsmtOYeoKbbnd5l2ubeXaXcmyppWdfZHlwf4NrZ2ZjbnZ3Zl9hUVplUFFhSFdJVF9XU1tkaltlUUZDS0xKS0JKRDhQQFBNWFNYT1JRYGVlaVJkeHl3SkZFY11lWmhqU2loam9jamZgY19cXV1faGJhaGV7ZF5kZ2RrZGpsZmhsaJibf7CsVFxLfqmvsrWws6OcmISXpqCgo4ykp5+XqImZl5iTmZORoJeNiIV7cH2EaH2PgpOagXeRjo6JcH+Gj5OSbJiUfImRkqOVg46qmpOSi4WJeYN2h4BugZ6Gd4CShYeYoZZ5k6KjmqCJs6Gitot6rKekrqVwqYCbkYaBnJJ8pICimYaYcZ6Eoq2uiZeLgIykjZaDrqKUdrW2tcmhdJSLgp5hnZepbXmVh5+adaGHd6B9kJaKgW9MZqOScJqIc6V7eXRig4JsfqBscmRgnHJ/dJdqe2mztbTGpnOYfnqdapuaq3SCmm1zd5dpmXl0mHFQRH2zXmp1aniHZmtnYnR0cG1WXVNYZ09SaElVTFhSVl1na25WZ1dNSkFKTUpISk5BUUpQZGNpbWV0cnN+eHtudYl7e1RRTmxeaFtraVJqaGlsZ21mY2VfXFxcX2liZGhre19dZGdjamZubWVpbGWinImvp4VmP5Shsqyvr7Wioo9/lqeioaOLpKacm6WBmpeWjZeQj5uSjYiDeWp5hmWDjH6Wn3l1j4iMgWmEhZKDjIWdjXqMipWlkoKXqZeMkYuAiXl/fIt5cI+ghnmBlIaIlp+Uf5Slp5yWloRnbnicbKJkfHGleJyYcGingpiMfKV6oJaDlnKfdoCJlJWPuW6QiqJifZmilolucmmqa3WgbW+mYJtpi5BploealXWigH2aX4uFjHVviGJooWWef2mbdXBkZ4iCbnOiWl9bZKFuXYmMb3t/c3JkpW54omRmp2iYcouYbqFvUoiPbqBeZKdUi11UmG1tcmpxgW1waGt4c2tvUVhWVWVZU21JWE9cSFhpaHNqWWtWUVJFVlxMWFJhVWhqXnd1enxwfHxygnt/c3aNgIN2XlFzYWdicGdQamhoa2xvaGRnX11dXWBqYmppdnVdXGNoY2ppcmxma21jnaWZpnpldG2Lp66lqrGxpp+Lf5aqnJ2ki6GhmaGhgJWYk42aj4uXkI2Ke4ZxgIhoi4p8l5pzdIl9kHtlg4eViomWmYJ8iIaWppCBoquQhZCKgYp9f3+Oc2mPpYR9hZOMh5ifjYeSqqaeiaZ4lpx+pYmWjLKZnpGDr5efpXmXiHmpdKWPhJpupaKMkoSMg7xufaWvgoaGh5SXnaB9pnpxqJSglmeefm+sY5aKlZJ3qGypooGJdoeCd6uRpohrkbBrdrOMqWyLhm5un56RlWJ/q4uqd4B/jaefd599haSVnaBpmod1q2aerYy2c3a+jKSTWYOmjathdXFzb3t0cWJqfm5obFNWWlVgYFxqTFxSXUlebG12YFtxWVtgWmdzZW5vcWNxdGB3en55cnmDcoN+gXt7jIGCgHZieGRjbnNkUmxnaG9tcmlmaWFfXlxhamJsbHpvXFxiaWFtaXdtZ2xuYpWmqp2BgJ6klqqqnqinrqOZiIGWqpmdo4mapJyonYSLmo+FnJGFko2LjXSFeoiDb42EfZeTc3WGcpGDbX+LkoaGlI99e4KFl6WNf6WljYCNiYSUdYKHkm9si6iAgouTjYicnomMk6qjoJCAdJSXiH6BeZSvpH+CnHGPhnmSjISAe3KnjHF9fXqXlpuEjXh7fn6IlJWTineRmaChhHt9iWuMhVt5eXN5cGlufpKJcX90gY+Uk3GFg4JljX9fgYCMeHZ0lHVve29uiW6Ehl93aXiOZoKCho6qnH50fZdqiYhvf3V8hHVtbGaMc3d7l3eEW2pYeY9obndxcG93eG9dbIZtaWdWWl9XXGRrZFVhVV5RX3B3eWtqd2Vqamp1fHBxdHNhb3Vic3uBeHV6gXV/gH+BeYuFgn17bX9sZHluXlduZ2h1a3hqaWlkXGBaY2llbHB1blpbYmtka2t5bWhsb2GOlbqpp4uhopumpJmknauioIODlqqRnaCImaaaqJiDgZuLfpaUh46KiI1ygnyPfX6PhHqXjnRyhHCVhXt9kouGhpCFeH6AhpijjHunoYuFj4+ElYKGjpd3cYSqhY2RnI+Hnp6Hi5qooKCrg4mOlZt/foqXraiQk6eQeHGek4N7k29+qYVwfZVxam98gZ+Lf5KOjGhtXYOMjJycn45zlYuIcXRrgnZ0gFlyboaQgX1+i2ldaWN6hYOIgF9peHucfIONg3aBh4NpeYyIa2Jxc4N3X3KNgomQp5WGZo2Pg253i4NvhIx4bmRmY3mCepVaXGlmbnZbenh3dG1zcoJmXG2Ka2tiWlldWVhrcVteYFleXWZzfXtzb3Rjamppe3xyend0ZG10aGx7fnV6fHt5eX+Af3CGioR7fXN+eXJ/aFRccWlsdnB1Z2tnZF1hWWpoa2pxcm1XW2VubGdyeW9oam1gjIyrsaGQo6Gan56Ynpmpo6F9gparjJ6Uh5qhkKSUf3uYhHySmYiIhoaKcn2Ai3aFi4GElopyb4BymIaEfpKDhIaKgXqAhIuan4+CpqCHeI2XiJWLi5yXhYN6rIGQl5mTiZ6dh4ihq5+ioqOLiJObnaOZlqqiqKehk5yJmJB8eY+OhKh+f5KRkpOcsaWalJ2QjrKTmISmjIyWnKCJkZuCiZKKa3yOdndlgoaQinyJnYSHi4+HiICFhJB3fHt1m6OJiIufi4aVf36NgoF2cXSGhX94iYeKkaaRhIaOiIOMkIt7homHjoB1a4GDe3mZaXJoYHSKcH16dnVvd3SBXV1vh2huX19aW1xSZ3FVY1tbYWxodHt8cm5wZGppaH97bXh+cGhvb2xmgHtygYB3f31/hHttg4yGfHp4fH56g3hOZHZqc25xe2VrZWJiYFtzZnBmcnFsVV1sdG1oeHpwZ2lrZY2InrqflqKhmJWZmJSYpKCde3+YqY2ejIWfnIqdlnx4lIJ7jpmJhoOEhm14gYBygId+iJOEbWt+epeHhIOQfoCGhIZ9h4ONm52RhqmegnGKj4WSkYuckX2NeqmDjJGXlY6bloaGm6agopqdhoOSmpmYkJqmoKaenpCWgZKLd32IjoSle3yPkJCFmKqgnJOcj42qjpKAno2JlJqfg46XfoaOgm94hnF1YX6Ej4Z0i5eAgo6ChoR+hYSUbnl2dZSjjI6Gm4WFjnWAi319c3N8iYR7eYyPhJOnj4aEj4KDiomJdYWGh4l7bmp9f3ttaGtsZ155fmd8e3Z0dXV6d1xgcH1tdGBjWlteUWZtU2VaXWFqaXV5fnBsbGNqameAf2tyf2tqc254boR5boaAdoKAfYV2cYKNiH57enyAe4KLYGl7a3VoaYNlamNgaVtjdWhvYnVta1RicXllb3l6cmVqbW2Lip+4mqGkn5ORlpeLmp+enXt3nKWQm4mGpJSKmJl4eY2FfImRg4yCgoJse394coCFfYqQfGtofYKXiYGIjnx+hoSHfI+Aj5ubkIemnH9wi4qLkoagoYqFjHynj4aOkpeTlpJ3jaOgoZ2Wmn+BkJmYk4yaoqGjmpiRm36OhXqBhI6HoH9+jIyOfJekoKCSmZCPpo2QgZuRiZOXnH6SkX2GjYB1dIFwdmB9gI6GcYqVfIeKcYx+goWFjmh4cnmNmZKQgJd+iItzgoh9fXJ6fIyFe3qRjYOWpZOLhZF8hYaHhXWBgoWGeWRxen54eXBsaWZefXNofHV1c3xyf2peYHR2cHdkY1hdXlJqaFRkWF5gZ2p2eIFxZmtjbGdlf4BqbX1nbXBqfXeGemuLgXKBgX2BdHaCjYZ/fHqAgX1/j2lyg250aWKIaWxiX3FVdG9tbmB4aGxXanR2YnV6e3Fia295iY2fs5KlpZ2OkJiPhp2gmpx8daOfjZd/jKGKiJqWeHuGh36DiX6IgoF/cH56dHWChX6JkHdnY32Gl4uCio14fYCNg3mWgJWXlY2Vn5p9b4uBkJOGpZuHjImDpZODkYqWl5KRdpGdoaGYlJh6f46Xlo6WmpyknZmTlJt6kIaEeYWWjZ19gYqNi3KXop6gkpiOj6KMjIOXmIOTlpp/l4x7iIyAdnF9bXpjgHyLhXCGk3+PgWuHgoF/iYRmdm99iJOZjn6UeIyJfYCIfXxygHmKhnqEkYqLmKKWgYOMd4iEgoF2e4CHg3Rfd3d8c313ZmtjYH5panZzdHV9cXxjY2FzbnVybWFZX11aa2RSYldfYGhrdXmGcGJqY2xmaHyDa2h0aGxvaH98gXhtj4ZxgIKCf3R8g4yBgH56goN+fJBtdYl0dG1limxqYmN1VoNpcG5geGdsYWp2cGZ5e3lxX3FshYWQna6Yp6iejo2Xh4Wfk5aYfXaom4mYeZaci4yYj3h7gIt9fIN7gIKBeHN4eXN9gIN/iIqAZF59i5WIfoWIdH1+in9+mISWk5aMo6CXfnGHe5OQiqaPjI6Kkp+QgpCPlJeRioGPmKCakpCSdICNkZOJnJ2eppiYjpWWdI6Pi22GmI+ZeoeIkIlvl52aopOUioyfjIaCkpx/k5KWh5mIe4mJgXlxeWp1bHt/i35thZGCk3dvgoN9fouAZXNqfYGXmIV/jnSRiYR6iH52eIF+h4F9g42FjZSkkHmFgnSJh31/cnR/hYFsYHp0eXB8b2FuYmR7YW5vdnN3d3NzYXZgb2t1bm9dW15dXWpdT11XYmFobXN6iWtfaWVqY2h3iG1mbGhpbGeAfHp3b4+Hc4CDhH10gYaJeoN9eoGEfX2OcnmLeXhubIdraF9pcmOHaHFvZXZnbWxhemhrfHt4cGF3bYuBmZqqoaSpnoqKkYaKnoqVl312rJeMlnyek5GWlIh2fXuKfHuAdnd/gG90c3pvhX2BgIl+fGFcfo+RhoCEhHN6gIZ6j5GHkZGbkqSak4F9gHyNiZGjiI2KjZeZjIWRmJOVjomJjJOdk5CMjW6EkI6RiJ6ZoaCXlomXkW+KmoVnhpmOlHqJhZCKcJaak6GSkoiLmYyCgJGefZKPk4yaj3uKhIZzc3VrcW51fIt0boaQjZFxdIB8gYKIfGVxbXp+m5R+hYl0kYuBdIl6b4F/goh9hYyKhY2WqI17iH1+i4V3fnBufoOBYmd3c3RuemJdb2BqdF5wanp4eGxycGV5XW1sc21zWFpdX2FqWk9XV2RjZnFxf4hlXWloZ2JncY1uZGlnZGlogHp3dW+OhHOBgYN7dYKIhXiFfHeDhXqAind/i3t7cnmDamtfcGhzf2txbm1xZ29rZXtibn95dnBrdneJf6OYoqihp5uIjIqBj5yGk5x0gKmUkY2GoIyVk5B/c3t2hHd4f3Jze4Vrcm95bYl2f4CGbnFbWX6SjYiAgYF2dYB/f6CGj4qRnJegk5Z3iX6AjIecnYmPhpKXlYOIlJmPlouLjY6NnYqOkIRuiYuPkYqclqCbmJWGmIhrhaSEZ4edipF+i4SLgXeTmJGdkZCIiZWOf36PmHyRjZCOmpJ9i4CCbnZva21vcHuGaXODjpeKcXeAdIKIgnlndG92gpuPfYqFepWSeneKdXGKfIeNe4uGhImPnKOIfIR2gYuAeHhuan+AflxxcnFvb3haXW9gb2peb2l8enBtbWptd2Bwb2pxbVlYYGFhbVdRU1llZmJ1cISCYl1rbWRjZmuSbWBmZl9na4F1cXJwi4B0f4KAeHaAi4B5hn93h4Z2g4V8hoyAe3aKf2pxYnxihXxvcGx0amhubHZ3X3F+eXt0dXN/gn6llZqtn6eWhYyDfpaUg4+edImfk5KFipqMlY2LenJ3dIJvcoVzcXWIbG5sdW2Id4N9f21uVVGBq5SHgnmAdnKCeYKggpGBkpGXm5GZd5B6gouRo5qTjoiVmJGDhpaZi5OLiI+PiJ6FkIp8c4uFiI+InJmem5aUgJR/aYadiWiHoIiShJGDiXGDkZePmo2PjIuPjXd7kpB7joyNkpeNfIh8gGt2aW1rbGx6f2J5fY6VgXZ6gXeDjHx5aHVtdYiWjH+JhnuUkXJ6hXF4jnuLjXuJfoONkZ+ehX19eIGLfXdwaGuAgHded29ta3FyVl1uYXFhX21ueXBncGZmdHVocWthd2VdVmVgYHJTUE5bZWRdeHCIfF5caHFiYmVmkWlfZ2RbaHB+b2txc4p9dn2FgXR1f4x5e4aAeIiDc4aFfoyMhHx5lXhmcWqDX4d+b29remBpbXR/dF90fHiGd3NzhXx5oZCasZyljoKKf4KZiICLnX6KmJKOhIiXjo6OhHZ0dnOAcG+Fc3Bxg29qaXVtgm59fG11c1JOgt/JktaTfG90g3WDn4KRdpSQmJuPmHuTcoWQn6GTk5CJkpuThX2VlYeMjYeSjYmcf46BeHqMf4iMipubnJqVk3mNd2mJkohtiaSFk4iYg4ZjjJGYjZSJlouNiYtwepWJfI6JipKRiXqFfH5tfGVyb2treXlbgHmPjoF6fn5/ho56emh0bHWMkIqDhoV9loxsfn9vgYx/jYh+hHuDkZabm4t8d3iDj3hzbGVwf4JraXRvZ2hzbVNebmRwWl9rcXhma2tiZ3hzb3FjX3dgYFZrX152T01LYGZjXXlxinRcW2V2YGFlZY5jYGZiWGlyc21rcXaLfHR5hoJ1dn6Lc3+Gf3uJf3KJh4GRioh9fpl2ZXNufWWIf29wa4Baa255eXNgdnp7jXZyd4p3eZ+Mm6+boJCChXiIlH58iZyHhJ6QjoWMl4STjoeBdHdweXBuhG9tbn5yY2R4cHxuenxqaGxjpJrB3K7voXNrdYN1hKGEkW6Vj5SflJqBkXCFi6OXiY6VipCdlYOAlI+EiI+AkoqKl36He3V/iXiGhY6bmpeZjo91indwh4mMfoylhZOKnYWGXouUl4mOiI6LioSJbHyXgn2IhYmRj4Z2hX5+a31jeHRpbXhzV4h6kYeFeX5/gIWMfnlmdGuBi4+LhIOAjJeGbIJ2bomRg5GFf4J7gZGXk5mQdHR4h4x1c3FmdHmBYXNtb2FodWZSYHBna1VebXN5YHJjYGl9cXJuWmJyYWJXblpcd01NTGNmYV52c4ptW1xkeF5gZGaEX2NjXllpcmtua3J3i31zd4SBeHd8iHGDhH19iHt0i4iIlYeMf3+Yc2h1cXltjHtudHCAV3B5dnlxZHZ4hoxpdoCKcoCdiJmnnKOShHxwjJR4eYqdg4SfjY58lY2AmYeEe3J3cHNqb4FraWx8dF5geHZ7cHR6Z2BlfOvatcnD3IhzbHOAdoqaiIxpl4+OnJSSgYhwhYigjoSKlYqMl5N8jZKIgoiPepGLho+CgHd4g4Ryh4KTm5aTmIaMdYd/cYaCioiao4SVjZ+EiWGDlY+FiIaJjIeAh2h9lH99g4SJjo2CcYZ+f3J3Z3ZyaHN3a1qMfZKChXyAg4CEioJ2YnRtioKRjIN/f5ORfW6CbHmHkIeThH2CfoGTlJGXiW5yeoyFdGxwanF3f15zaG5caXVfUmRxaGZTX292dF9vYF1ognFyaldnaGNpWG1XW3VMSkxlZl5icnOFaFtcZXleXmRnemFkX11Za25lbmp0d4p+c3KBfnp2eodzhYN8f4d3doqFj5iCjYJ7k3Zsd3Z5eJN1bnh6fVh5hXGAb2d4dpGCZHaGhXGKloaZoZuiioZzb5KLcnaOm32JmYiJe59/hJl/gXhxdG5vZHJ+aGZsd3dbX3h7enFxf2lhZ2F/1baOkKZ4bnF3e3GSkIyGapiNiJuRi4Z7aIeLmYaBkpCGhpeNe4yMgICJjXuQjX6JhXp1e4N7cYaAlZmOkpOBiXWEh3eEgIuTnqCHlpCffohhf5OHg4eDiY1/f4JmfZGAfn+CjI+Qfm2DfIJ0a213dXN2dWtjjYGOf4V+fIR/hIh/cGBzcoZ8kI6DfX+SiXpxg2Z7hIuHjYR8hX+BlI+Rk4RucHmMfnRsbmlqeXxhZ2lpWGt1WlJpcmliUGJyeGxiZV5aaoNuc2JbZ19kbV9uVFpvTkhOZmRcZ25xgGtaW2NzX1xjbHdkZV1dWmxsYm1qc3aGf3Fvf3x8dHiFeIWDfICHdXmJgZKVfImGdomBcHh5e4STb217gHZeg390gW1penOUc2dyiH1ykpGEmp+boIaGdXWUfm12k5d9h5CDio2ZfIyadn52cW9samF0fGdiaXV5WmB3e3ltcX5lY2hoV52PXnFylrzEhHZxlIiPfXGWi4abkoyHcmqIj5aAe5SMgYSajHyKhXx7iYt/lIh1iYZ2d32BcnWGgZ6UhZSPg4NygIl1hXyKmZ6Zh5WOnICIZn2Tgn6Eg4mJcoF9Zn6MfHl/f4eLj31pgH2DdmZveXhzdnNsa46FioGKf3iCgIWDf2tfcnl7fo6LhnyCj4F+coFpeYSIjIaFeYR9gpiMkIx9bm17iX12c25nZnt1YltwYlducVNTbnNoYU5mdHhlYF5dWW+Ab3NZZWFeam5gcE9Za1FEU2dgWmtubXxuWVtebWNaYm93ZGdcXWBraWNsanN2gYNwbX98f3R1g3qDgnyChXZ+iIGWkHiEi3SBiHJ5eX6NkG9ve4BxaYF4en5tbHt1lWtqeIR0bJONhZ+YoJmEiG59jHZqeJiOfoCJgpSXiXmPlm96c3BsaWRgc3poX2Vxelpgcnx5Z3F6YWVlj7Gyd0piWqTZ0JZxe5CKj3d9k4qEmJGMhW5rhZKSenmShoGEmIp8hn94d4mKhJaAb4uIcXV+emp5hYOlkISSjIN/b3+DdoR5hpuZlYyUkZSEiHB7koJ8goOIg26Bd2iAhHhyf4CDiod8ZX1+hHZjcHOAaHhwb3WZjYaDinx2eICEeYFrXHF/c4KJhop+hol7iXKBbnGFh4+FhXOFeoKZjY2EeG5vfoR/dnlkZ2l7cF5YdlpYcGxOV3FzZ2BLbHZ0YF1cWll0fXNvV2ddZmpxYG9OV2hSP1lmXlpvamd6cVpaWWtlWmNxeV9oXF5lbGhla2lxd3+Hbmx/foB1b4J7gIJ+gn92gYWIl4pxgo1xe4Z8enmEk4x1anp/a29+dH99b3J7epNwb4F/eGeSi4OhmZySgoVmhoNvZ3mViH1+hIGYiYF8jYxpeHJra2ZfYW95bV9ib3hcZGuCemFxdl9lZdTqvYsyOj6Ljn9xeIWIjo12gpWMfpKNjH9tbIWMi3V9j3+FgZWIfIJ4bnaHhIOXd26IhWx1e3RmeYKDp4uCjouEfW6AdXeFeoedkY2RkpOMi4Z/e5KGd3+DjIJrf3JogH54bXx8gYqDd2F5hIFxZHFofm11cXWBm4uAf4WAc3V+gXOBb1xuf3V5i4OLe4eAfIh4enFsiYSQhItyg3qAlouKf3Rta3eAgHR0XGhndm9YVntSWXBkTFpycmVbSXB4b1xbW1lddH50aFliW2dlbmNpTVdmUT1eZVxddWZgdXBaWVRvZFlkcXlaaF1fZm1naWtpcHd9jmxpgoR+eW6AfHyBf4J6dYKBjZOEcICLbnd9gHt7iJKJf2h7fWpze3KGe3N3fn+MeniEfXxrjI2Em52WjICAbI19a2h+jYt6fn6Dk4J+fYqIa3VxZ2hiW2Jnc29fYWtzYGhwiHpic3ReY2SboI9uXDVar7V0aYCIfJKGdoWVhXOOiol2cGyFgoZ0eYl4iXyTiHp+cmd1iX5+mG9xhn5odnluZnmHhKSHgIaMiX5uf3aAgn6NmoiClJGYiYuEiXyPiHB7fYR7aH5sa4B7eml6doGHgHJgd4F+cWRyZnSCbXV7hpWRgXyCgW93en11fmxZcIB3dYyChniIdoKJenhzboqBkIGGc399f5OIiXpubWpugoF0bVxnZHJwUVp6TVtvXE9ccm9kVUtzeGlXWVpaYXGAdGBdXWBmZGhpZk5aaE1AYGNbYHZhXXVtWFdTdGFaZG9yV2peYmhrZ21saXB3fJJsaYSJfHxwfn57gX+CeneAf4qLg3F7iG9xd4N/e4mNj4Nqfnttd3h2ind9eICCh3+Dfn56bYSMiJijjYSDenWLeGtsg4eQeH16gZGAgH6Kg3BycWNmXllmX29vX2BncGZqb4l0YXRvW2FkanZ7gL+cpqTIuHGFg3KSfHiGkoJzkIuHcXJvg3qCc3WHdIh3lIh5eXBjd4d6gJNpcoR2Z3d1Y2p8goidgX9/jo99c4B0hXqBkpCDeZaOlY+Igoh7iIhreHl+dGd6aGx/eXNpenaAg31oYHeHfWprdGd6gGl2gYyRlH56fn5wfHd8dH5iVnh+c3OKhIJ9g3GHind4cXCEgo1/fnl+fXaOhYN2aXFpbYiBcG9dZ2FxbUpldUtdbVVUWnNuYlFPc3hgUlhYXWFvgnNbYVxoZWVja2RRW3BJQ2NgW2NwXl14aFVWVXdeW2VuaFZrXmFpZ2VubmhwdnqSbmmIjHh9cnt+eYKBgXx2fYOIhoNwd4RybXeDgn2Ji5N/cIB7d3l6gYx0g3h/gYGChHqAdW9+ioubnoh9hXp3hXtndIWMj3l+f3uIhYN2j4BncG5fZFtYZVltcmFgYHBsa2iJbmF0aVleZG6Ad6naqseGh7JxiXdvjHV7ho1/epKJf3RzdH53f29xf22EdJSGeHVrYHqCeYmPZnGEcGd2blttfICQk3+AeZGSfXh7boh3gZKNhXSWipGOh4WFe3+EbHR2fm1ndmVte3Vtand2f398YWJ4hXlodXVifXtndYaOjZV7dIB2cYB7fW1/WVd1f3B1hYd/gXlsiYZ0eWx1gISEfnt9eXtzi4F9c2d0ZW6Lg2tzWmledGRHbW1MWmFXVlZ3bWJQUnR2V1BWWF5hcYRvXGBjbWRkXm9jVV5yRkJlX11maF1bemJRVVx1W1pna2FWal9gbmVma3FocHV4jnRrjo11fnZ4fXeBg4F7c32DiIeDb3KAdHF1foWBiY2Ke3d/d4N7fIWHeId8fYF+hIB7fnN2eYyOoI2Jeol2dIN4Xn2FmIt4hoN0hYaEd4l7Ym5tW2FaW2FWaXNjYFtnbm9mh3FhcWZXXGNrf3zKzoe5oWptbYpscYRxfIOJfnqQhHl4c3l1dXxqbHVjhHWSgndvZl59gnqLimVygmtqcWNYbXqFm4iCgXOWk3Z+fG+KcYKLjYhymI6RiYWLg3t4fXFxb3xmaHFibXhxamtxeH18el1leYB3aXZ4ZoJ3Z3SHjI6Ue3GHam9+gHlufF1Zc39udIGLfIJvb4p/cXZod3+BgIF3fXF7dYd9enJmc2Fui4FqcldqXnZbSG1qTVZUXlNVe2thT1R1clBRVFdeYnSFaV1ga2pmY1luYVlkcEdAZ1xgZl9cVXpdT1VkcFpbamhdV2hgXnJma2dxZ3Byd4Z4bpWKdH96d354g4d/dXJ/hoWOg3Bwe3h2dXqGhYaMhXp8f3SLfn2GhISHf35+fYd/fHh2eXiRk59/jHyLbXV/eGSChpWFc5GKb4WFgXqDdGNuallfWl1dVGdyZGBYZHFyZoFzYmtlV1tgan94vq57oLZuYnOGaHN7cXmBhHp9i353d3J2b3t2ZWpuYId1joFzamJef3h5i4RmcX9oa2taVm93iaOBhH9xmZJxgHl2hG6Bg5OJc5WIjYiEiYV9eHRybmh4YGptYG12amdqa3l3enZaZ318eGVyfm6EdGV1hY2Gln5vjGdreoN1bXRiXXF9bHV9jHuBZnWHfW5xaHV/eH5/c31se3uCe3hvZWxibol9a21WaV92VUppak9RTmhNWHtoYU5VdWpMUFRVX2Z1g2ZeYHBoZ2FXaV1cbGhKRGpZYWRXWVR4WU5WbWpZXWtkXFllY150ZmxkcWdyb3WBeHCZhXZ/fnd/fIWHfXVzgoiAlYNuc3l7enNyhYaIiIN4gX11j358hIqOhIKEe36Lg3t3fHd3mp2XeoqChml2fXtsg4SSf3GOgXCFgn6Bf3BmbGdXXVpcW1NkcGReV2JydWl1cGVlYldcXGl/cG9ygHOJZGR4fml0dXRygYN3gIN5dnN1bWt6cWJna2eGdI2DbmZdX31we4l/aW14Z2pkVVdyb42mfIR7dpaQdHxzfXxufHyShneZfIiGg4aDfXRwcWxndFxsaF5sdGRnZml6b3tyWWeAdnVocIB4gnZid4WLfJSAboxqbXuCcWZzZWFuemdzeIp8fmJ2g3Zqa3F1e3F6enR9Zn5/gHl3bmNmYm6GfGxqVWlib1JKaGpPS05vR157ZmFNVXRjSk5TV2Fqdn5lXWdzaWVgVmNXY3BdTEtqWGNhVVRUc1ZMWHVkWl5rYFxaY2VfdmdtYnBpc25yf3V0moF3f4B3f3+GhHp8dIKEfpeFbnJ0fHp0cYSFj4GAeYt1dJB/fIGVjoCFhH1+jIZ7foB2e6OlinmIhoRrdXx6dYOBi3puhHN5hH2Bg3VuamhlVl1bWlpTYm1kW1hhc3tpaG1pYGJXX1tqgGlrcIBna2BoeXhqc3R0boSAen98dXVuemhqeWpfZW5ogXaQhGdlWGJ3an6He29pcGdmXVVYb2eOqHeBenyRjnl1cH9wc3Z6j4B4lXWGg4CFiHZqcXVnaG5bbGRdbXJfZ2FqeGh7bVtugnJ0am+Afnl4YXeFhHiPhXOIcm95gHJjcWlccXhkcnSJfHlic4BwZ2p5dHFseHh1eGSDe395d3FkZGNufH1ra1VoYWVSSmtnT0dRa0VheGdhTVNyXUpNVFpla3Z6ZV9tcWlkXVZgVm5uV0tTaFdlXlhOVWxUSlx5X1tfa11dW2NlYHlobGBvb3Vub3h1eph9d4CBeoCAh4Z6eHmCfoGThHF0dH95dnSEiJF9gHyQa3OVgHuCn4V+h32Af4aCgIp7doSrn396iIiDa3KBeXWAf4F0boZufIBzioBqb21kZFhfWllaVGFqZ1taXnSCaV5tbFxhVlxcbIFlcXR9aWlca3Z1Z3N2cm2Fe318eHVybHlnaXhmXWVyaHp3k4FjY1RlcGeChXd3Z2hqYFdWWWdjj6dufneAi497cHF+aHpveo18d49yhH1/f4ZuZHVyZGhoXGthXG9vXGdfbXVkemhddIBvcmtxe311dmJ0hYt7iIeBgHhydX91YXBtW3J0Y3FzhX11ZXKAbGFse29qaXt6dXJmhXZ7e3ZxZWJlbXN+aWxUZ11cVEtyYlBGVmFHYndnYUtUb1dKTFhYZ2t1emRlbnFmZFpXXVh2ZlVKXGNXZ1hZSVdlUEhieFpdX2xbXlxhY15+aWpfbnR4bm9udoOXeXKBgHx/iYyGfnV1hnmHjH1zdXWCeXp6goyOfX6EiWlzloF6ip19foV6gXp/fIaIc3GPrYx7e4ePfWVxh3lzfHt1cm6FbHt+bI96YnBvYmVdZVZZWVZjZmtfXVxyhWhYcG5bXldaXGx7YnB3dm1iWmxzc2d0dXBshHh+f3h3bm50ZGl0ZVtndGZ2dpJ5X11SZmZqg4J0fmJjaVxUWF5iY4+kaHh0g4aReG1ve2l4bnyFe3WJc4B4fHh/aGR2bGBmYF5qX1xza1llXW9vYnplW3d8a25ub3d4c3Rkc4OSfoeDiXt2cHJ+c2J4ZFxwcGJxcoJ9dGdygGVebnZpZGZ5fHVub4J1dH10cmJfZm5vfWRpU2dYV1NNd19RSllYSGJ1ZGFJVG1TSk1aV2lscXtibGxzY2JaWlthd1xTTGNdWGlTV0hZYE1GaXVYXmBsW1tfYmJchGlnYW54eWxvanaBkHhtg36AgZOIhIF2c4h0jIZzcXd1gnd8fX6MkIB+k35wd5WDfJmSeYCAeHp+gHSIg3RwmaJ7en+JlHhkdYd4c3h1a3Nufmt4fHCRcl5wb2BnYmxUW1pXaGNtZlxbcYllU3JuW1pYWGBsdmNpdWppXlltc3Bsc3NzaYR8fn57dm9ubGRpcWNba3JkdHaOc1tXU2VhcoB/coJdYmNdU1pgXGORn2VxcYWEkXRsbHtub3B7fHxxgXd/c3p6emNldWhdYlpgZ1tedmhXYl1vaGF3YFt7dmlqcm53c3J1aHGClYOGfYN2c2pxfW5md1hdbG5jcnOBenRnb35bYHBxYV9qcX1sbHV+c3F4a3BhXGVsbHphZ1NmVFZRUHVbUU9YUUhjdGJgRlVrUElQWlVra2p8ZW1ucWBbWlhZbHFXU09mV1doU1RGWVxOSHJ1WF9jbWNYYGBhXYtqY2RteXhrb2l1eYZ7a4N9f4SafIKEeXyHbo+GcW93en10goJ8i4+Cgpd0d4KThYGfiXWBgIF0f4Jxh4J1b6KXc3uGi4Z7ZXeKbm16bmZ3cHprc3ZyjGtedG5hZ2VrUl1bVmdhbGtaXHCMZE9vbl1WWFVnanRnYnRlZV1ZbXRtb3V0eGqGfH97h3aPc2Rka25hXW5tY3N4h2taVFZjZHh9fXGGXWNfY1RaYFlilZVjbnCDhYp0a2h8cGZzd3N8bHp0dW96fnVeZXJjW15WYWRYYXRlVV9gbWRhcV1dfnBoaXNxc3B0dmtthJOBiHqEcXNnb35xc29UXGdrZnF0gXdzY2x2VWJya1peb2Z9ZW13fXNzc2ttYFpkamp3XmZUZFRVUFRtV1FWU09HZHNfYUVYaU9IV1RWbWhkfGlrd2phV11VW3RkU1JXaFFZZVRTSFpaUE14dlpfZWxpWWJgXl6ObmFma3l1bm9odnZ/f2yDgH2Hl3uAh4GJfmuTiHJndIB7dYCCfYiOf4uTcnyKkYWHn4Z7f4aMc4GGc36Cdm6ljHKBjYt2d216jGBke3BmeHJ4bG1xdoJnZHtsY2ZnaFNfXlVnX2xuW15tjWhOaW1gVFZTb2dzbGZ4ZGRcWG9zbHF6d3Jsh3t/dpt6eWthZWxtXmBvamVxeX5nWlZYYGx4fHtwhF9iXmdXWF9XZJuIYmtwgYd9eGxreW5cd3Fse2p2c25ve4ByWGltXlldVWJjV2RwY1NeYWhhYmxaYH5rZmtzdW5td3ZsaYWMf4l5h21xZnF9bnNuY1phaWlvdIJ0c19pbFNlcWRVYm5iemNxd3t2a3Bta2BZYWdodFxlVWFVUk5YZVJPXE9PSGRwXWNGWWlNSV9LWG1kX3hobn1jX1RfVF11XFRTYGZOXWFUU0pcWVBZdHVdX2VsaFhjYVtejXFjZ2p4cXNuZ3Z0eoNygoN6iI5+fImHjXlukIp0bHOCdH9/h4WGkoSVj3l+jI+HkZuEgHyMhXOAgXN0eHJvk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjY2NjY2NjY2Ojo6Njo6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjI2MjI2Mjo6Ojo6OjY6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERCTqWvra2trrFhQERERERFOC4vLy8vK0iFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTNBqba0tLS0uFkwNTU1NTcnHB0dHR0YOoOBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fX59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJiYmZqSj5CQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaPkJCQkJCRiYWFhYWFhYSDg4OCgoKEioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkI+QkJCLjpGRiYeOipCSk5CKkY2Nj4ePkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYyLi4yMjIyOjo6Ojo6Ojo6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx9fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQjoeJh4eMh4qQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCPhoqHho6GjI+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkI+Jh4iHjIiJj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4aHh4aIhomPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH1+fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiY2KioyJjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Pjo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJh4KHjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWFhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9/f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f35/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eX1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyNjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHR2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2loZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent5dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHR0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUVAPjo8Pj48RUQ+P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnJ0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTk7OzpAOzs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTk1NTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dXNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ozs4OTo4Nzo8OTc4Ozs+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1c3FzeHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08OTc5Ojk5ODg6Ojc4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Ozw8Pj89PD07Ojw9PT08PDw8Ozs6Ozw+PT4/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXFxdXV0dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDQ0A+PD0/QUA/PDs+PT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl7e3t9fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VEPz07PEA/PDtLRzg4Ojw5PT1APTo8Ozs8Ozg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BxcnJydHV2ent9fXx+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz9BQUFCQUA9PD07Pj45N2RsOzg6ODg6Oz0/Pzw7Ozw7Ojs7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fH19fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXtOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNBQD9AQD09RklKa3lNPD49Pz09PkNEPzs8PT5APT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx9fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBfVFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkVDREJAQENbQVF0fYF9e1w/QEBDQEA/QEA+PTw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD9AQT9AQ0ZFQ0JCQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcG9xcHJ1dHd6fHt8fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQUJAQW9jf4SFgoN+aT9CQ0VAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHREVGRkZKTk5LSklHR0hLTEpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgICAgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBFRkNKdoCCgYR7gIV0RERFRENXdYaJin5YR0lKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpJSVF2gXyAhIGDiHBEQ0FVdIeJh4eGh4JXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNDREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTEtKVXiBfoKEhoaHg1VObISHhoaGh4eHh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUtJSUdISUdJSUlKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N1dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tMS0pYfYOEhIGDh4eIfX+GhYSEhoaGh4eGinVJSUZCPz9APz8+PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkVEQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3J0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISElJS1F2hIaEfoGFg4OEhISFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QDs5OTk9PT47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0lMSHGGhYF+gYOCg4KDhIaJiouLi4qJiouMiVQ7ODY1Njc2NjY0NTc3MzQ2ODo4NzY1NjU2NzY3Nzg6Nzc3ODk7NzY4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQ0RLe4aEgYKDg4ODg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6Ojo6Ojw4OTg5Nzc3Nzk6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09RV2tycnR0dXd6e3t7fH1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3O0I6PU1+hIKDhISEhISGiYqKiIeIiImKioyKiYmMej46ODg7PD0+OTo6Ozg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8Ozk7PDg6Ojs7OTk5PD88PEFCRElKTUtKS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw7ODk5ODk6Ojk7Pz9BSn2DgoSFhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUBCPkBCQEA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEBAPj9BPD48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhxcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs9PD5ARENVgoOEhYSFhIaJiYiIhoaGh4iJiouLi4qKi4qLXj5ER0lLSUlGR0hERkhHRUNAQENFQ0JAQkNCP0BESEVDRURFRUFGRUZERkZEQEI+PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p5en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PUE/QkNHRWiEg4WFhoaGiIiIiIeGhoaHiYqKi4yNjIyLioqIV0dMTE1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkdHRUtJS0lLS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHZ3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTg8Pjs8Oz5AQEE/QkJGRktKdYSDhYWHiIiJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlJSEpGREdISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA5ODw7PD06P0A+QEBDREhIUFt/hIWEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSUdFSkhESkhHS0pISkdHR0tMTkxMSEhJSk1QTk9OTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVbnF1dnd5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0dCPzg/QDk6PDg9Pjs9QT4/QUNGSEpUcYOEhISFhYaHiIiIiIiHhoiIiIiJiYyMi4yMi4uLi4teUlJQTU5NS0pHRkNHSkdMSkdLT0xLSkpNTUxPUE5ISUtMT1FQUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkBCQlxwcnd4eXp5eXl6ent8fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgICAf39/VUVDRUVHR0VEOz9BOz08OUA+PkBCR0dBRklJTlR4hYODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKRUVGS09OT1dWUVBPUVNSTlNUT01TTFBTVVZSU1JQTEtNTU1LTkdHSkZGSEpEREVFQkRDY3F1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkVHR0dHSEY+QEI9Pz09Qj9CQ0ZWTkVMTk1RVnuGhIWFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOztRU1JgdV1VVlRWWVlTWVhSWmZQVVdaXVJUV1FQTlJQUFBRS0xLR0hJSEVGSUhJSElqc3Z5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0dGRT8/QUBFQkNHRURFTFhSTVNUU1ZYfIaFh4aFhoeIiIeIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A/QFZVWVxkYFZZYnJeXVddWlZFUVlaXFlfVFlnUlVWWFRUVlNPT01KTEpJSUxNS09NU290dnh5eHd6eXp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH5/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNTV1lYWll4hYSFhYWFhoeIh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JXVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUlGQkRAQTpQUVFXWFBQT1FTVFRXWFhZWm6BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin9mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaW1hcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm9zdXd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUVVSVVNXX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlRTVF5aWFdXV3prWFpcXF5TUFBQSU5PV1ZYW1pkcXR2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAgH9/gH5+enh3dnN1e39/gIB0a35+a3J5XlxWVVNST0tGQ0RBTV6DbFZSU05PUU9RVVJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmJh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUFFOS1JUUU1PWVFNTlFTVVVNUVNSUE5MTEhDSUhSU1RaXW1ydnZ1c3N3e3p7e3t9e319fX59fX1+fX5/f39/f4B/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lVUUxJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5DQ0NDQj9EUENDQEM+QkhHVkBITk1HXWlRSEZPRkRFRkhHSEJDSEdISkdEQkFDQE9QTVJkdHV2dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWViXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHN2ent4eXVybnN0c3l4fn6DgIOCgoCCgIKBgWtMRz4+Ojs+QD8/Pj5qUEthRUZISUVCP0dMTUdNUVVJQkU/Pjw9PD09Pz0/QUNCPz88PUI+Sk1GVW91dXZzdHZ4e3x6fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXp4enx8eHd4ZEJAQEE9OkJDQUFDQVtcT3tOT09OS0xNT09RTEtMV01IR0BCPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV1dnV2d3l8fHx9fHx9fX1+fH59fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJTVlhTUllUTllaW1dZXF9fYGVgXV5xd2teYGdrd29vbGpvbm5sZmJZR0ZGSEJBRklFRUZDTFFPYVdSWFFQU1NSVVtPT1FWUE1JQ0Y+Ojo2NDg2OTc5OjM2NTc5NTxCPWZ0dHZ3d3l5e319fHx7fH19fn57fn59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LVFRTUFFVT0xSU1RXWVRUWFFMWFlZVlhYVlhZXVdXWGhza11WYHRrYWFfXWRgX15ZVVBNT05MSUdKS0lIRkNQT1NaV1RUTVFTWVNcZVVPU1RSTkxJSEM/QTo5ODg5Nzg4NDc1Nzg1ODlHbnJ1eHh6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BXVlZTVFZPT1VWWFhZU1VUTEtUVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5OTkxKRlBQVVlTVE5KTk9UU1RcVlJVU1NPTUxJSEhGPz89Ojc4NzY1OTk2NzY2NVdxcXR3enp7fH1+fX58fX18fX19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG9mZWRjXF5SVFpWV1RTVlRSWFhZWVlSVU9KR1BQT09NUkpPUFBQTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFFQTk5NUE5UUlBSTElMS09RUFFSU1RRU09MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjNAPmpvYVJSUUBGVFFPUFBRTlFPUE9MSkxMT1BOTlBRUU5QT0pNTU1LR0VFREI7PT08OT1HNjY3N0RucXV3ent7fHx9fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JDOEVOU11nU1FTQUdVUE9SUVBNTU5MSkxLTE5PT1FNT09NSU1MSUxLTEtHRkZFRDxBQT47QEU7PDg5VHFzdXl7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtucW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E/PT1BQEI9PkVIRkRGRklHS0pARkFBQEZIRUpPSFFSYVxRUFJOU09PUExMT01LTUxNT05bVktNUU9ISkhDSUpMTEtGRkZFP0NDPj1CRz9CPkFkcXR3e3p7e3x7enp3fHd5fX57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj87P0FAQD5BRElFQ0hHSUdJRUJCPz48Q0JBR0lETU9hZVBNT05XS0xOS0xNTUxMS05OU2RNSkxSSElKRkFJSkxNTktHSUZCQUJAP0VGRUhETG9wd3p6eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xMSU1QTVBPR0tFP0I9OTk5Oj9CPzxBQkJBRERHS0ZESUlHR0hDQz9CPz9AQT5DRUNLTlFUS0pJTVRGSUlKTEpLS0lKTE1PUFJQS0dDTEhEQ0pKTE1PTUlKSUdDQ0NESUpNTElac214eXh6e3t5fHZycHVydHl5dnhqcW5qbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZXFIS0NGR0dHSktJSkxER0I9Pj06Ojo7QUI/PUJCQ0NIRkpMSkVJSUZHR0NDO0FAQj5AQENFQ0lNT0dIS0ZIS0RISUtNSEpMSElKTEpNXVJJSEROR0JFS0tOTVBOS01KS0ZHR0pNTlFOTGNuaXd2dnt4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkcEZLQ0ZFRkRFRUZFR0NDQD48PTo7OjpAREA+QkNFRUlGSkpMRklJR0ZGQ0I7QkNDPkBDQ0NFR0xOSEtOSERIRUlMTk1HSUxHRkZJSUxOS0pIRU9JQ0dNTU5NUE5PT01MSUhJT1NRUk5SZmdmcm9zeHV7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lDRUVEQkNCRUBEQj4/Pjo7Oz07PT9DQT9BQ0ZHSkdKSUxIR0dHRkVDQD1FRUI+QURDQ0VHSUlHTVBJRkZHS05PS0ZISUZFRERJSUhLSUZIUEtESk1MUE5PTk9QTkpKSU1SVVVST1dkYWFtZ3Byb3N5emdlaGhjaWxncWxmbG1naWtsc21wdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NBQUJEPEJBPkE9Ojo9Pzs+P0BCP0BCRUdKRklHSUdGRkZFRENBQUZGQ0JCQkRFRUdHSEZMUExJT0pKTEtJR0hFRkVEQ0lISEtKR0tSTUNPT05RUE9PTk9PS0tLUFVXVlVTWF9eXWlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNwcmtrc01GR0VHQkJBREQ8QUFAQzw4OT0+Oj89P0I/QEBERkhFSEZGSEZFRUNDRUJDSUZDR0VBRUdFRkZHRUpNS0hRTUpLSEhJRUZISEVDSUlKS01LUFNORFJTUVFSTk9OTlBNTE5TV1ZXWFZYXVpdZGBoYmppZ2tfZGVmY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hCQkJGRTxAQ0JEPDc6PT47PjpAQj4/P0NFRkRGRERHRUNFQ0RFRkZKRUVJR0JHSEZHRkVDRkpKR01LTEtISkxGSUhKSEVLS0xMTk9TVE9JVFVUUVRQUU1OUU5NUVdaVlpZV1pdWlhhYGBgX2hlY2BkZWdnamhoamZobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9zc3lNSEhHSURCQ0hFPEBFQkQ8ODo+Pjw8PUJCPT8+QUJGQ0VCQkhDQ0RFRkZHR0lGR0pIQ0lIR0lHRkRIS0lHS0lNS0pLTEhMSk1LSU5MTk5PUlVWT0xWVlRRVFFSTE9RUE9UWVpZXFpaXF9fXmBjXlxhY2tiYGRnaHKFaGdpZmpubnBvbnNxanR1eHJzc3RybnBxdnJxdHJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtJS0hKRUJFR0U8QEdEREA5PD5APz4/Q0I8QD5BQUZDRURDSERGREZGSEhGSEdJS0pFSkhIS0hGRkxISEhKSE1MTExMSU1LTU5NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW11eYGBhYGJlXWRgZWdgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXd1dXV3dnV3c2d0cmtxcmtyd293SUpMSUtHQkVERTxARkREQjs/P0FAQEBEQUBCP0FDSEJFREZHRUlFRkVJSEZJSEpMSEhKSklLSkZKS0hJSkpHS0tNTUpKTUxNTk5PTE9QUlVXVk1OVFZVU1JRUE1OVFNSV1teXl9dXmBgYWFhYGNkZWJjaWNkaWpndotsa2lobW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV0c3Bzd3R1dXd2dXV1ZXFza3BxanJ2cHdKTUxMTUdDQ0FEPD9FRUVDPUFBQ0JCQ0VBQ0RBQUVHQ0hHSEdGSkZER0pHR0pGSUxISUpNSk1MR0tJSEtLTlFLUlFMU01LTk1OUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV9gYl9gZWJhY2luaWNpaGhteHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJycXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0VBQEQ+PkRFRkM/Q0FFQ0RGQ0NFR0NCSUVCSEpJSEhLRkRLSkdISkhJS0dKSk5LTkxJTEhKTUtaZkpkXEtsUkhPTV9uVWxzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmXGx0YGxrVV93dmlqaGhmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj89REVGQ0NDQkVFREZCRkZHRERKRUVKTExKTE1HR01KSEpLR0tKSUpKTkxNTUxMSUxNTFtzYmRwXmxsVU1OZnNeZ2ZxbG50Z3BpX2FZbm1icHBia2pqZ29xdGV0bm9cb3VncE1Lcnl2a2Jha2VlbHhta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0FCPz1CRUdCRkNFREVFRENISEdERUtIR0tNTUpNTEZKTkhKS0pJS0pKSktNTU5NTU1LTk1NW3Jvb25wcGxrTlBRbFhOaWJ0cnBhbW92XFlsUFttbVpxbWtvbXh4dHNpcFxgc2xxalV1eXhvY15rZmJncHBqaW9wcHJzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hGRUVCQUI9Pz9FR0JHRElFRURCRklISEVHS0pHTU1OS01OR0xOSU1LSElNSUtKSktOT05OTUxOTUxcaGR1XWxxV2xOUFFuVVprXmtsdmFsZHRUZWNObFlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdoYWRpdHlrb25xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSUVFRENBQjxCQEJGQ0dGS0dFQ0NIS0hIRkpMS0ZNS0xSUkxHTU1ITkpISE5ISkpJSE5PTk5MSk1NSlpzcHBvcXFtbE9RU29ZcWtnb29xcW9tdF5uWGF0X25vcG9xcm9vdXN0dGpbXnRjd3hyam56aGFhY2ZhYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnRzdnRIS0hKQ0VFRUBAPkNDQUZDSEpNSUZDRkpMSUdGS01MRk9KS1dSS0dLSkpOSUhKTElLSklISkxNTUxJS0tLU2tiWmleX2pjcnJaX1pqb2BlZVVrX2NbYWJRYG1oXGpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga25wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVudnFydXR3ckhIRkpERURGQUBBRURDR0JISkxHRkNGS0xJRUZKT0xJT0lMW1FKRkhIS01JSEpJS0tJSElHS0tLS0dISkpMTExLSUtMTlRbXVRQVU1RUE5PT1VSUE9RT09RSkpOUFFkcWlUWVdbW1xVWVtdWF1cXGNmYWFmYmNmX19ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV6eXh1dnFydW92cnRzdXVzR0NFR0ZGQUVDP0NHREVHQ0lLTEhGREdKTEhER0lQS0xPS0xXTUlGRUhJSkhJS0hMSkhGSEhKR0dJRUZLSElLTkxJT1xXXk9cXGBeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZF1iWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRElFR0dGS0pLSEVFSkpKRkVISFBKTE1KTVJJSEVBSEZKSUtLSUxKSEZFSkhFRkdFRUpHQkpNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOX1xeU1teY19aXWBjYFlfYltgXltUWVhaX15kYmJhY2ZpZWtycG9wcG5ud4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklJREZLS0tFRklJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRURERUJGSkRASktKT1tjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtRW19hYV1eY2FgYmJiY2NlWlJYVlZcW15jYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl4eX9+fXl1eXZ2cm56d3Z4WFFKRkNHRUJFR0hGR0hJRkdKR0hGSEtJTERESkpNTUxMSEpKSEpHP0dGTktLS01LS0tJR0hEREBEQUhJQT9JSkdQXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUVFdX2FjY2NjYlxkY2JkY2ZYUVZVU1xYW2FfXl9hYV9kbGttamtsbnZ+dYF6fISFhYWFhYWGhoWGhYWGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1CQElGQ0ZLSUZGR0lHR0pGRkZJTEpORURKSkxOSkxJS0pJSUdCSEhRTUtLT0xLS0lIR0VEP0VCSEhBQUdGRFRdWV5YX1hfW11VWFhQXV1RS0pXXlheW11WWmFSUl9fYmJgYGJiYGNiYmRkYlhPUlFTXFNcXl1eXl9fYGRoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSERSS0ZISEhERktKTVBFR0lKS05MTElMS0lJR0RIS1FPTUxQTExLS0hJQ0VBRUNIR0JBRkVCVlVFXFRdU1ZgWE5UVU5aW01KS1VgYVtfWF9eYl1PWWJcYGBfYmNiXWJiV19fVFBPUFFZU15cXF1dXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJUmNRRFdfSUdHSERGTUpQUEZKSUpLTkxMS01LSkpHRUpOUVFOT09NTk1OSEtBREFDREZEQ0FERUFMSENMTFBPT01GTUZGSEpIR0xMTU9QSUxPUFBTUExRU1JVWllXWVhYZFZPU1RQUE9OUVVUXFlZW11cYWFlZmNoZGtscXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXk1HSFlNSEhKSEdNTFFRSUxKS0tOTVVOT0tLTEdHS1BTU05QT05PT09ITEZgRURfTERmY0RNW0heXHNtT01WbVlMQ1BfVWxXZ0pdV1VeRExRVUxNU1ZRUlRYV1RYVVRcVFBmWmhoZFlUa1RYV1VbXFtgYGFiYmJgZ2lnbmxocnp8fX6BhISEg4ODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09USktHYFRISk9KSU9NUlFLTUtMT1JVUk9PSkxNR0hNUVtZT1BQTk9QUEpLUX9RSXxZWXJzV1BtSHFub2FWUHFxdE9Ca3NucXRwU29fW25YXVZcWFVraFVdVmNZYFlaX1ZVV39qdHV1X2F2X1ljXFxmW19hYWFiXmBiZ21wbGBwd3R4gYGCg4SCf31+gHZ4em12fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdKTEZSVkxMT0hLUlhXUU5PT0xRVE5PUVBLS05HTVBTW1pUUVJPUFBQS0haeF1UeGRoWVJTUHZndGxwYm5ma1JyT0x3bWpycHNycXJwb3CAXWZ6dXhxcXpxfnJ9a3V9YlJofGVzc29zc3x9cH55b39yX2BgYmJbYWBoa25rYmxmZ213foGAg357eHeAdHZ6aHJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEtRT01OSk5WXllVTFFTTllZTFNTUk5MUElRUlRZV1dRVFBQUVJLR2d4bGN4cW1aS0xUeXB1bXVibnZQZGVJZXZxbXdvgGpmeHhpWHJSaXttaWp6en5seHp/cGdvWHZ2anZ1cIBhc2h9aWx4fG9fX19jYlxfZGVmaWpkZ2JjZGxscHBzdHNzc3lxcnhibHRncnl7c3N1eX6Bc3V6bnx9eXhybk5KUnROQ0JFUFBIS0xKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSlNUVVhXV1BVUE9OU0pLcm91dXF1cWRoYVZuTHFwXkdoeVd2VEtoeX14YHl7c25hXm1vZFNncnVubXlwd2x2c3RxbG1cc356a215fGx1bXxrcHZ1eF5fX2JeXV9lZGpoaGVlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tTEtaVkhHRUdSUEtMTktMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5KVFRWV1lXT1NPTk5RSVJtSGl3S2BkdnVVV2xPbmx7cmFqZ392VUtXa2h9bG1seGBbcHp7X2B6c2Nyb3hxaGR8aXJ7XVRLbF92dWtpdXt7bX54a3xwXV5eYlteYmRlaGZlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtobW1yfGttaGt7dG1ta21PR0pLSEpISFJRTU9QTUxTU1JPU1JXUlZUUFdaVlZUVFRhYFFPTktUU1NRVlZPT01OT1BKSFFOUFVMS0tSU1JSVFBWVVFRT1JSWFhRTlBVVFhYWFtbVVNTV1tXWFdaUFNVV1dYUV1YVl1VU09YUlZXV1haYFtncl5bXFtdXV9jWl9jY2VnZWNjYlpjY2dmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFBJS0tMTUtKVFJNUlFQTFZWVFBUVVhVWlVSWl1WVVRXVVlYUE9MTldVUU5VU05QTkxRUEtJUVFLUU1LS09RVFJRUVNTSUlNTk9RUlFRUVRWUlhXXFdTU1BSVVVWVFpRTlNSV1VUWVZUWVVTUlVTVFVYWFdeWl9hXVxbWl1dYGNcXWJiZGdlZWViWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkZGZoUUpLS05PTE1UUU9UUVFNWFdVVFZYV1daVlRcYFZXVllVWFRRUEtPWFRRTlVQTlFOS1NQTU5VU05STk1OUVNQVFFTVFVOTE5PUVRUUlJRVldVWVpbWVNVUlRYV1dZW1NPU1VXVVRZVVZZVFJSV1VWWFxZW2BdVllfXV5dXF1gYV5bYmJjaGZlZWJYYGBiXWBoZWZkYV5fXV1eWlpfWl9nYF5eXWNoa2FoZmhmZGBiZGJQS01MUFFMT1RQUFRRT1FaWVhXWVpaWFlWXWpkVlhZWldWVFRPS09XVVBPVFBQUU5NUVFPUlhTUlFPTU9TVU5XUVRVVU9OTlFTVVVUVFJUWFZaXVxaVlZRUldYVltcVlBTVlVVVllUV1dUUlJYVlZbX1peYF9WX11eYFxcYGBfX1piYmRoaGVlYlliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTk5SUFJST0xQU1JVWlVUUFBMUFdVUVZSU1NYTU9QUVRYVVVVU1VZWFteXVxbVlJPVVZWW1tXUVNXVVZYVVNYWlRTUVlXV11fW19fYFZiXGBhXmBiX1xgXWNhY2dpZWdhWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFlcW2BeX1teXmFgX2NcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWV5cX1dcXmpwd3l/Y1xbVlZZUk5PV1NOUVJRU1RSTFFUU1lbV1VPUk5TWFZTUlRSUlpPUVNTVltWVlZUVlpYXV5cXF5WU05UVlZbXFZRVFZWWFlSU1lcVFJSXFhaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2lkaF5cZWBhYGFjZF9iX1laX1tcW1lYWVdXWltaYV1dW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFpdXl1cYFxgVVxdaGpyfXJsaFxVWVdRT1JbU1JRVFNVVVRLUlZVWlpaU09TUlVVVVNOVlJTWlJUVVRYXVdYWFNYXFheXVlbXlVVTlZXV15aV1FVVVhYWFRWWFtUUlZdWV1dYV5jY19ZYFtlYl9kZF5eY2NhXmVmaWVnXl1kYWFhYmNkX2JeWFtfW1xbWFhYWFdbWltgXVtbXFtYWlteVl5ZXVBPT1JaUFtVVVdWVFRUXl5gX15iXGBVXV5ia3l0bH1sWlVaVlFRVFxUVFRVVVZZV0xSWlZcWlxSUFVTV1VVU09XUlNXU1dWVltdWFtZVVpeWF9eWVxaUldSWVhZYFpZU1VWWllaVldZXFVUWl1cXmBhYGVkXV5dXWVhYmZkXl9kY2BcZ2RoZmViX2RhX2FhYmJfYF5XWF5aXFxaWVpXVl1aXV5bWltcW1dZXF1WWFddU09QV1lQXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXaCe2hYWVpUVlRWXFhXV1ZWV11YT1VcWV5dXVRTWFJXVVNSU1hSU1ZUWVhYXV5YXVtVXl9YX19YXFZRWVVZWlphWFxVVldaWlpYWVlaWFZdXl9eY2JiZWVdYlxgZmJlZmRfYGRiYltmYmhmY2ZhZl9fYWJhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlNaV1RcVVZXWVdWXGBhYmNhY19fVltgZGFfenVvaFpcWlZYVlhbWllcWlhZYFZPVF1bYGFcVVVZUFRWVFJWVlJTVVdbW1xfXlpfXFZfX1pdXlleVlNZWFpZXWJZXlZXWltbW1paWVtZWV9fYGBkY2RlZWJkWmJmY2dmZV5hY2BjXmNjaWVkZ19nXmJiY2FhYF5fWFRaWlpbW1hcWFhcW1pbV1daWFdcW1xgXVZdXVNPVlpWVlpWWVVYV1heYGJhZGFkYV5ZWWFkYmBrZmheXF1bV1dZWlxcXF9bWVtiVlNXXl1hY1xTVllQVlVVVVZWU1ZUWF1dX2BgXWFdV2BeW15cW15YVlhYW1pfX1tfWFhdXF1dXVtaXFhaX2FeYGRjZGZmZmJZY2ZlaGdkXmNhX2VjXWZpZGVpX2deY2JjYWFgX19bWFlbWVpaWFpYV1tbWltXWFpUWV1cWmBcVV5iTVJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYmNiX2FgYV9dXV1YV1tbXV1fX1xaXWNYWVhdYGNkX1JZWVBXVldYWFdWV1ZdXV5gYWFfYl5ZYV1dXlldXllYVVdbW2BeXV9ZWV5dXl5gW1paWVtfYV9iZGRlZmdnYlpkZmdpZ2NfY15gZmVaaGljZmljZl9iYmNhYGBfXV1aV1tZWVhYWllXWltaWVdYVlVbXV1dYGBiYnhLV1dcWVddXFxdWldcXV9gYmRiY2FdYFhiY2JgY2FjXlxdXFhXW11fXWBfXVtgZFxcWFpjZWNhUlxZT1hWWVtaWVdaWmBeYWJiYGFjX1xiXV9dW19eWVlUWF1dX19eX1taXl5gYmJcXFdbXWBiYmNlZGdmZWdkXGVmaGlmY2FiXGNnYFxpaWJoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXVlhQWFpdYWNmZnJrf0pZV11bWl9dXF5cWV1bXl9hY2JhYV1iW2JkYV9jYmJdXFtaV1hqcWBcYF9dXGFjX15ZWWNlZGJUX1pRWVdcXVxbWltbY2BjYmNgYmRhYGNeYFxeX19aWFZbX11cYWFfXVtgYWJlYl5cU1xfYGNkZGZlZ2ZlZmVfZmZoaGdkZGBbZmdeYWhoYmhoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3p6ent7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnd3dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7e3t7e3p6e3t8e3t7e3t7enp7e3t8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29wcHp+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmIjbG1tLS0s7WVh4mJiYmKjI2NjY6Ojol/f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29veoB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIuRu8C/v7+/wZqKjIyMjIyOkI+PkJCQi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4OEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXV2d3d3d3d3eHl5eXp5enhvb29vcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fH2BgYGBgYCBfnx8fHx8fH19fX1+fn19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5d3Z2ent4e3h3dnh7d3p6en55eHh5eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3p6enp6eXp6e3t7e3t7e3t7e3t7e3x8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3eXx7fHx6fXp3d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d3fHt8fXl9eXd4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3d6fHx8ent6d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6enx8fXx7fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5e3h6enl7eXh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZWZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoKCgoGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcIqQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uJg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMj4uKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiYeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIjIuJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjIiGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjImGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSkpCLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChISCgoKHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFg4SEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OCgYODgYCCg4GChYWFhYaGh4aFhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoOCg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj5CSkYyKh4KCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEg4OCg4WDgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJGPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoKCg4SDgoKDg4OCgoSEg4ODgoOEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGTkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGDgoKBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYmHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgYGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+fn+AgYGBgoGAgYKCgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIKDgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYKBgoKEgoKDhIKDhYWGhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgoKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GBg4KDhYWDg4OEgoiOg4WEhYSEhIKBgIGCg4KChIODgoKBgYSFhIODg4KCg4SEg4ODg4OFhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOTko+NjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCBgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgIGDgoGAgYF/ipmFgYKCgYGCgoGAgoKDgoKCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGBgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42Lh4SEg4OCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+AgICDgYB/fnuBmIyAgYOBgIGBgoSDgYGBgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGAgYmDfn5/gn2PlYKDhIKDg4OCgICAgoKCgoKCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOFhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhIODgYGCg4ODg4ODgoGBgoKCgoKCg4KBgYGBgICAgICAf4CBgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgoGDj4OBgX+KhIOShYWEhIWCf319fX+ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWEhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMi4iFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhISDg4ODhIWEgoWSgoqGhYKBfoKGh4aDgX5/fn5/f3+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoKCg4ODg4OCg4KBgYKDg4OCgIGBgYGAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDh5KChoSHfn5/f4WFgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGh4aGhoWEg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4OEhISFhIOCgoODhIOHjYGBf4eCfn5+gIB/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiIiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGh4eHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eHhYODhYSDhISEgYCBi4WAf4CBgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYqLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+RjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeHhISFhIODhYOBgIODgoKCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEhIGOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWFgoCCg4ODgoKCg4F+fX1+fn5+fn19fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeHiYiEg4SDhYSEhYWGiIiGhYOCgoSFh4aHhoaEgoKDhIKDg4SCgYGBgYGDg4SDhJGSkY6PjouHhYaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiYuKhoSGhIKGh4N/gYSDg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GCg4SFhYWDg4WEhISEhISFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4OEhYOCg4GCg4OEhYSHkpGPjY+MioWEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoGAgIKAf4GDhIODg4KCf319f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYODgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhoyTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5/fn1+g4SDgoODg4J9fX5/gICBgH59fX19fn18enp6f4KCgH9/f39+f3+Afn2Af3+AgIF/gICBf39/gYF/fX1/gIF/f35/gIB/gICAgX+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fn6AgH99f359fn+Dg4OCgoGBf319fn6AgIB/fn19fXx7e3t6enp6gIB/fn9+fn59fn9+f4B/fn9/gH+AgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f35+gH+Af36Bf3+AgYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7f35+f39/fn1+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZOSjYyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoOBgYKAgYKDg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enp5eXl9gH+AgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIGBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEhIKCg4SCgoKCgoF/fn19fX5+gH19fX19fX19fHt6eXl5eXmAgoKChIOAgoOBgIKAgYGBg4KDg4GBgoCBgH+AgYOChIKAgIGBgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoeFhYWBgYODg4KCgH19fX19fX5+fX19fX19fH19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgYB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGhoeIh4eHhn99gYCBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WFhIWDgoODgoODgoKCgoODgoKSkIuIiYeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359f35/gX+AgoGFhYWHhoeHhoeHiIaHh4eGh4eGf319fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomXhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKOi4mIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYCAgICBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSEhYR/fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3x/goOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fX+DhIWFg4WGhYSFhYOEhYWGhISOkY+LioqMiYiJh4WGhYODgoGBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgoGDgX99fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32DgX+CgoCDg4SEhISEgoSDhIWChJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+f31+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn5+gIJ8fH9/gYCBgH59e4qCfYB/foGAgIGCgYKAgICBgH+Lk4+Mi42OjYiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX18fXt9fX18fXx8fYB/gIB+gH5+gZORjIyNjY6KhYaGhYSEhYODgoKDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fHx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2LjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fXx8fX59fHx9fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKMjIuOjYuKhoSFhISEg4ODgoKCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CKj4yMi42LioiEhISDhISDg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gICBgYB/fYB/f35/fn5+f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH17f357e3t8fHx9fHx7e3t8fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4aChJGOjIuKi4eIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f35+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fHx7fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3x9en1+fn+AgIOHiYmJioiLiYWIkY2LiImHhYWDgoKDhISDgoKCgYGCgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foF/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgYB+fHp8fX1+fX1+foyGfX1+e3uDgn1+fn19fH19fX19fnx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uLiYyQjo2JiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5/f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn59foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjY+Ni4iIhYSEgoGCgoKCgoKBgoKCgoGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58fn+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiNjIqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGDgX5+gIB+foB+fX5+gIB/gX5/gH9/f39/fH9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCAfXx9fX18fHt8fHt7e3x7fHx8fXyJioiIhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgH+AgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fomFhoWGh4WEhYSCgoKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp9fXl4dXSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgYGAgICCgX5+gH+BgH+AgIB/fn19fX18fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAh4KEhIWEhISFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl0dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX5/fn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f36Af359e3p7enx7eoKEf4OCgoKCgoOBgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXZ0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX+Af3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Ag4F/gIOCf3+Af4F/gH98e3x6fHt8gYB/gn9/gYCCgoGBf35/gYB+gYKCg4GBg4OCg4KEgoGBgYCBgoB+gIB/f31+fn19fX59fnt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOBgICBf3+AfoB8fX1+gH5+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OBf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fH1/fX+AfH9/fX2BgIB+fX2Af36BgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fX19fn16fn19eH5/f3x8fH59foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgYSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN3dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4SDf39+fX5+fn+Af4CAf4GCgYB/fn+Bfn+AgoKAgYSChIWGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFg4ODg4ODgoGCg4KBg4J/gX9/f35/gH19fX1/gICAf39/f3yAf3+BgIGAgH99gH99fn5/f31+foCBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4F8fHp7e3t6e3d2eHVyc3ZxeHlyeIWFhYWDhIOCgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gIF/fIB+gIB/gYCAf32Af35+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fX17fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH+AgYB8gH+Afn+BgH9/fYB/fn9/f319fICAgIGAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+gYSCgoOFhYKCfn19e3t8fHl3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6enp4c3d1cXFycHh3cXuFhoSFg4WCgYODgYGBgYKAgYCAgYB+f35/gH18fn2AgIKBgICBgX1+gH9+f4F/gH9/gYB/gH99fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn6AgX+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYGBgYGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/foCAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f356gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fX17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKCgIGBgYGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhol8fH57e355ent6e41+d3d5fHx7fXx8fHx7fXx9fX19fH18fn5+f39+fHt8fXt9fXt5ent6eXhzdHVuc3FweHJ1eoWGg4OCg4KAgICBgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYSDgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgIKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKAf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9+f3+AgIB/gIB/gIGBgICAgICBgIGBgYKBgIGAgIB/f4B+f31+fX5+e318fXx8fHh4dXh4eXt8fH17fHx8fH1+f39/f359fX6Af4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg4B/goGFg4OEgYGDgIKDgoGAgIGCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/foCAgICAgH+AgIB/gICAgICAgH+AgYGAgICAgIGBgIKCgoKAgoGBgYGAf3+Af4CHfn58en18e31/eHd2eXl6fH19fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7enl0cXVud3B1enJ2eYWFgoOCg4OCg4SEgICCgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgICBgYGBgIOBfoCDgn9+f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fYB6eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKChoODg4KChIGEg4GCgICCgYOBgoKBgoF+gYCAgoGCgYGCgoCBgICAgoKBhIB+gYOCf3+Ag4KAgX6AgoOCgIGBgYKCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn5/gYGAgICBgYGEhIB9gH9/f39+e3t7ent6c3B4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoSGhIKDg4KEgYSEgYOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBg4ODhIGChIKDgoKBgoKDgYOEg4SEhIWEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH96e3x6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhYWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GCgYCAgoSDg4KBgoKBg4KCg4OEg4OEgIKEg4SDgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fX18gX56fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoWFhISDgoOEhICEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fX19fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChoaFhISDg4SEgoSFhYKCg4OEgoOCg4KDgX6AgIKCg4KDg4OEgoGCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoODhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fH19fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/f3x9gYGCgoODhoOEg4aEgYOIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KDg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgYKDhIWDgoKDg4KBhIOBg4OEg4SEhIWEhISFhYWFhIODhH99gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4GAgH+AhISDg4SFg4SDhX9/goqLhYSEg4KEhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KDg4WCgYSEhYWGhIKAg4eEg4SDhYSFhYSBhIODhoKDgoOBgoKEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgH+Bg39+fnx+fX1/gYB/fnx8fn9+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhYSChIOGgIKFhYqJhISDhIWFg4eGhoSEhISFhIWEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIF9gXWBeoN/f39/hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WCgYSDgX9+fn59fYGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISGhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDg4WFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGc3B1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBzgoN+g4N9gX1+fn1+goOBfH+AfX+Afn18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhoOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugIh5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9f359gH+Af319fHx9fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOGhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253Z3d6bnB1gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYF/f3x/fXyBfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgX+Afn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4mFhIaHh4WEhYWFhIKFhYSFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgX+BgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhYWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYqIhYSGhoWFg4WFhIWGhoaGhYN4i3lyiHp7cHCFhXiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX17fXt8fX1/f319f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYaHh4iGhIaFh4aGhYSFhYWFhYaJiYeGhIaFhoaFhoaEhoaGhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhoaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFh4aHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoWGhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGhoWGhoWDgoWFhoWFg4WDhISFhIWFhIWFg4aHhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH57fHx9f358fH59gH99foB+foB/fX18gH1+fn5+fn58fX1+e3x8f3x7e31/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYSGhIWGhoeHhYeGiYiGhoiHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoaDhoaFhoWEhoaFhISFhYOFh4WDgoKFg4SBfoCAfHt9fnt8e31+fXt8fn1+fnx/fn19fn59fXx/fH5+fH2BgHx8fH18fHx+ent7fX6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGiIeJiIaGiIeIioiFh4iFhoeFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoWGhYaHhYWGhoWEg4SEg4SHg4SBgoSEg4GAgIF7e359fHx8fX18fHx9fXx9fH59fH19fHx8fH18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaFhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4aGh4SChIOEhoWGhYSEhISEhYaGhoaGhYeFhYeFhYWHhYSDhIODg4eBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoeHhoaHh4WHhoiIh4aFh4eIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhIOFhYaGhoaGhYaGh4aHh4WDhoWDgYOCgIOFgoN+gYGBf4OBf35+f35/fHx9f317fX18fXp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4qHhIeFhoaIhoWHhIaHiYaGiIiHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYSEg4WFh4aHhoaFhoaGhYaGhIOEhYKBgoGAg4OCgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaEhYWFhYWDg4GDgYCCgYWCgIB/f318e4GEhYWGhIWEg4eIhoaGhYSGiYaChoSGhoaFhYeFh4iIhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChoWGhYeGh4SGhoaGhYaDg4OFgYCBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp7e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhIaFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIOGhYaGhoaGhIWGhoWFhYKCg4N/foCAgIF/g4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYOFhISGhoeIh4WFiIaJh4WEhISChYOEhoKDhYSFhoSHhoWFhYaDhIWEhYaFhoSDhYSFg4WFgYGDg39+f4B/f4CDf3uAfX1/gn2AgX1+gX59fX19f3t/fHt6eXp6eXp6fHl6enp7e3x6e3t7fH1+fX2AfX18fH2Af318hoOGhoaGhoSFg4WChYGBgH9/gIB+f4CCfX5/f36AgIGCgoSEg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWGiIaFhIaHhYeFhYKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SDg4SDhYSAgIKCf319f35+f4R+e398fICBfYGAfX2DfH5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHx7fX59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4F8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SFhYSBg4KDgoSDg4B/gIF+fXx+fnx+g358fnx8gYB+gn99f4J8f359fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWEgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYKAhYOBf36Af358fH59fH6DfXt9fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZMPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dXU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vKysrLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXU1dTV1NTU1NXU1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0NHQ0NDQ0NHR0dHR0dHNysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19jc3d3d3d3d3d3d3d3d3dzb3Nvb29vc29vb29vb29ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzZaEhoaGhoaHh4eHh4eCsuLd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLmzeHNzc3Nzc3Nzc3Nzc3N6goGBgYGBgYGBgYGBgYOLioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5uUFNTU1NTVFRUVFRTTKDz6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OlmTIpKysrKysrKysrKyspNUVDQ0NEQ0NDRENDQ0NGU1NTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7P0M+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zOcVRYV1dXWFhYWFhYV1Ch8enp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpps4LzAwMDAwMDAwMDAwLztJSEhISEhISEhISEhHSldXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNznheYWBgYGBhYWFhYGBapO7n5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaugRT0+Pj4+Pj4+Pj4+Pj1IVVRUVFRVVFRUVFVVVFZgYmJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPjs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3HxcXFxcXFxcXFxcXFxMvQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Oz87Pzs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0crKysrKysrKycnJycnJysvLy8vLy8vLy8vLzMzLzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz8/Pz8/Pz8/Pz8/Tz8/OzM3Mz9PS0s7Nz9LOzs7Ozs7Ozs7P0c7O0tTPzs7T08/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbY19fX19fX2NfW19fX19bX19fX19fX19fX19jY19jY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Ozs7RwafR0qig0M/RpKHQzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs7SqY+t0c7Ozs6bt7akosCTnqzTzs7Ozs/P0Z2PxbSeo6fWr5+hqdLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q/QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/P07qvqrifmpOdwJ6YlZzI0M7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Pz9OfsZ2omqGctJicop2wstPPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz9HAnImen5uWrbmGnpavs6rV0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Uo6KBoJibgaCWeJuEnZOk1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDRxJ+Be5qFn6iInHmfqYWZpNXR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q1auvvMDTdrSwppyKva2mmK/W0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njo7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT07Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJh3+FoJWml5edpaeWmJu71dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HG09PVnJjCoqukm9Cfq6Sc0dPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg0tHS16iHzsaQjbfXwo+NvNXS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dLPxdTUx8PV0dXFxNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS09TS0tTV09PT1NTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87Ojg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VGQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2lpeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCCd3R8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqZG1nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW1tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampubm5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cnJucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVGJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFNfTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipamnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSmoqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaatpqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6qsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paGJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaChqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYWxodWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2s7qxqq60sbCxtLW2vL2+vLy9xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyak5aUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsPDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbGnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb2xocXhveWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ3c3hmZ11kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/JxsPDxMLEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpnXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIx8nHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraequ7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBxsHLy8fGzMnNxcbGw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXVuc2JcYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBw8S/v77Ey8jKy8i8u8jHyc3Iw8jJycbFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JvZmVnZGpkYWptbm5eWFxWVU5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwsbCvsbBubvDuri5vL7BxsHGurnJycPFxMDEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmZjWllZXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m9urq0v7i1uLOvu7y3wLe9wr/Bu7/BvLvFvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+urW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYd9cWNgYmJnamdmaWVpXVZVU1lPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1usG4vri/vL23tbewrri2ub+7wL+3wby7w7a6yLi2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWRmb2lla2hYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8tru8wMS5t7e3tbq5urvAvcPAusTCvse4ubitt7W4urS3s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg+PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9v7vEt7a4tre/v8S8wsXFx8fKycbPwsG4rrW1vL64u7K+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG53Y2diXGNRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD89Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuqo7C5vb6zvL68xbiyuLm9x8nKw8fIxsbJyMzO0czKxLW6wMPIv7+1v8G/xsa/y8bDv8G8wMPMysfFxsG5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9jXmFhTkhNP0VAP0RDPDs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPEFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0vMO8urq+vMS/t72/vcfMxsfJxsa/xMTKyMzMzcrGwsPLzsK8ub26ucDDv8jGxMHBv8XAysnDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPj5BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8trq9wby7v7a/wb+8v7rAy8LHyMC/vLy/xcLHy8jBw8DAycrCwLu7sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKyr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnptc3hzZ3BdW15cWVFFRENNSUFFPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT0+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7u9usO7t723ucC7uri4tcXBwsO7uLO0usG9v8fAucC8vsXEvb65srCuuLe/w8fDxL29v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG5pXF9gWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnBwLe9ubi5trW/s7SyuLG7wcDDuMCwr7W4uLjCurS7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nrK+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9lXVpVSjw/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+3ure2trK0wLaytLizusDBwr7YwLSxtLK3vrmztbK8uby2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZybF5iYFtdT0hBPj1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u7y4trq2scC6t7m4ubvBwcPQ0rTItLSwtrq1tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybmNcZlhcXVJOTUE+SUJASklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOyrba6rqy8sri5t7u/vbm+wLS/u7y6uL7CvMLJ1cmXzsS0srS2srSvrbu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxCRk1GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5urW5u7W1s7W7vMC7vsC0v7m5urG7xbzBy83CjqfJubS0s7CxrbC5uLa8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jo6OhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmJ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OzpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+ysrq6t7e4uLu0r7SssK+knLC2t42JtbqyrbOwr6yutraytLWvqqSem5ycnqionqCoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKqrnqWjm6OclZCMj4+Qk5CXlZaYn56empmml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR09NTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6Wsqqi1srGvvcqypqitlYuNdnB/hJ+MhaG3tKuytK6qq6+wsrOupZ6SmJSPmKCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6apsaOlqJ6gnJWTkI+RkJiQlpWYlp+Ym5mbo5mXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01JSEdOUk5KTkc7RUA9Mj83NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiYl5ahqKyutre6ubq3t7uuqKChqaGgrauqpb3Uq6KdnIBsgXRhY2Vyg4qbt7Wvr7O1qqetrKOcmZSOkZaXmZmcoKKinJ2lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmZabl5eYoJ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHh5YGJSVV9ISUlLU1RJUlBMOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OTnJ6kqK6trKurr6qvqZ6XnqWdnqWmpJ/Az6mSfHeBXmuRdW9lX26QoL60sbGwuK2noZydmpSXmpqQjpGVkYyOjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKwtKmxr6KZnJ2eoZmbm5qYmZuUlpuWmJyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVbU1pZTVFKTk5VTFJMQTc+QjY4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkpyYoZ2qoqegnqehpZ+ckpyim5+ho5+ewseZeGNhilxXgouQiGxSianDs62trLCnoJ+ioJeRlJugnJmXkpOfnKGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7issbSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqShn56anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFFVSEZVVkpCTEc9S0g4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOemaidrp+nnpyhnZ6ampKZnpyhoqCfp8m5iGFadpdaWGFtkI9+TnS0xrOnqqyqpZ+fmZKSk5iYlpaVjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqefmaagn5+nqKWknp2qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JWTUpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiaqqCxoreksKafnp2dl5iVmZ6bnKOfna7RqnNZZIyJWFtvabetdlpZoLqzrq6pq6agnp6hop2fnZqcnJSTlZSenpiUhZ2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsO8w7y3s6mzraqztK+zrqquo52rp7axrKKvpqGjr7GtsKSkr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHFra3VycGhXW1FFVEhESU9IPkVBNEVIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goZ2cmJufoJugn52szp5gX4iHd3iFh3WejXJyc5SwrqekpKKgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Aw77HxsK3w8nJwsDFvrm0ubq0u7ewtbKqurGuu7e+urqqt62rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqefnp+inZiZlJiUiIR9enFrZGhveGplWltGS0xFRFNMREJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz49Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbOyuKehoauqop2eoaKenJuercmYVm+fmXmSnH9renqNprKqoJqdnJ+empeYl5KMj5eXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXS08zT0NPTzMrCxcbHysfOv8jRzMfFxsTBu8PAvr6+tb2zrb+/wsLGxMfErr64sri8xMHBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uMkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURDQDU1NTg6Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E/PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5iboqydn66mpbGqxcbMzs2/sMGopaisraqhnaOfnJ2aprfMkVR5oKR6e25mb5Gpsaykn52gm5iXlJOUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K0tfR19LU1tPTyMzHzc3J0szO08zFx8nKwcXLxsjIxb7CsrPIxMvKys7Fyr++v73Bx8TMzMjJv8O/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK20uKyuo56ko5+gpKrDzopYeoaEbmhxkK6vpZ2dnaGloZ6alZSWlIp9d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HT1NTSz9HD0NPW2NXW0svJztHLxs3RydLV1tnV19PW2M7Sys/RzM7QzNLPv8fGysPMzMvOz8XGx7bAyr/RzMvPxcnHv8PCyM7Mz9DPzcrIzri3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGVyYl1SXElKR0FFSEk+O0A4PTQ1ODU7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wsWxtqiipaahoqu1z8+PZHt9b26Ura2clZignJuhop+cnZqWindpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTOz9XU1NHRzNDO09fW09XQz9LT0cnT0cfQ2NfY0djS19nV1szPz8nN0cvOz7/FwsfFzs3R0NHIy8zAysvF087LzsjEycbGyMzK09PR1c/SzNLBucWxpai1rqeaqKylnbKosLOsrJOPk46Iio+Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1FNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr62qqqudpq64qKu319TV2dnRztDAvMzJt7+vp6upo6SxtNHHjG92cYSprKGYlpiam52hnZqcnpN9cWVjYl9fYWBfYWBfYGBfYGZtcHBua29yd3ebzMDS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHG0dTK0NTV1s7S0NjY2NfLyM3DyM7Mysu/yb/HyM3Oz8vQzc7Lzs7Hy8/Qys7KwsnGyczKy9HSzNPR0c/Qyr3IubCuu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1XRTtAPDMzPD04Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWspa2uvrSwwNjS19rc1s/Ny8TT0MLBsaqtrqulsrHEoW1sbpChnJWTl5yen5+dlJaYlIlrXl5eYWRiYGBgYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHUy8zQ0dPKztHV0tXVyr/KwcXMwsjJwszDxcjKys7KzczQzdPLxcjPzMjHysTGwMXKy83P0cbQzs3NzM/Fx8C3ub3Dw73DubOyvrG7w8S1qpilopmWkZWVkouUjZqRlJSPj5SCiYV4cHFrbWdgYHFoWVhoVkxGTElQUEI7RD47Njc6ODk6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzs8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXFw8G/u7WyscfCuMvV1dna29jMzc/I1tXFw7ewtamiray4vKFvbY6ajYyXlZCUkpGWlpaQjHxlYmJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytLIy87NxtHSz87M1MrHy87Px8fP0svQz8W6xL7Gyb3Cx8nOxMHHwMfNx8PLysvPx8PE0MjGwcXHxL7Ax8vLy87CysvIx8zQxMXHu8fDyMjCz8G9vL+wwcnHub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd250ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vbrNzcbQ1dXZ2tvY0MrP0NLUycS4vLyupbaqvrqhd4mWjo2Wj4aDhISCfoWFf3RgXF5eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsnGwsPAw8fKycjKyMHFzMbIy83JxMLLycHCy9DEy8i/ucG7xce9v8bPy8O/w7vJxsi7yMbEyr+9wsvGxcS+xby8v8PEy8XEvMDJwsXH0sTAyL/KycbHxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhpZqjoJuUe3ZzdGZpWmFubVpbWFJETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMvP0czHwsPHzc7OzNXP1dnY2dDM087O0MrDtsS/tLK6r762iH2VjJOXhnqAhYaAdnh1cnFfWltdYGBiZGRkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsLa6srKzsrHCvLy8urjAwcHFvr25vb+5xMrFxsK9xsC4u8TJv8LJu7e7usXDvrzBzcPGvr61wb3DurzGu8K5s7zFxMLCtr+1tb2/usvDvLW6yLq/vcvDwcXCxcjGyMbQxsLMx7LHycPOzcHFw8C9srewsqeoqLmwpa2wq62slHl2d2pkZ2Bob2NWXllKRkpGSEpBRUJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfGw8TIztLLysrHzc7P0snQxtXU1tfOzNDGy8fJxLzIv66wtrS3r4KMjYqLhXiAhoaAfoR8dHVkXFxdXmBgYmNhYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLW3tLKztLq1vrG3sLWvsrvCvMHEvL+6tbO6vsC4x7m0u7bAwry4vcbBw7u1rrK2ur60xLe7tau4vb2/vbC6tq+2urLFvLauu7+0trTFvb7CxcDDxcbIy8XAxsa7yMu/z8rHw8bCw7bDvb22ub7Hv6y1urW3to54dHhmZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy87IxsnOzNDMzsjKycvJysTPzdLPz8bJxMnEwr67zLqusre0squMkIaJiXt4foaGd3iCfXRoXl1dXV9gX2BkYV5kZWNfX1xbXlxdXlpbW11fbHBuaGZqbm5yfKTHv7i4tbCrrKeeoqqnnquts62pq6m0rbawsqmupqyyvLq2w7m6urGrtbm7tMK6sL+xvby7trzHucK2raqosLG/tbe8r7CnsrO0u7yrrbWlrrauurGwqriwrbuuu7i7wL+9ucK/x8PFwbzGwcjLuMXHxb/Gw8O5xMbCu8bJzMuzucK8urKIcnZ2a2lhYmxoWVhXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxs7Sy8PGwsXQx87CxMbAxcXDw8rCycvBwr/Fvre5ucezr7S2r62mkYmPkXx4foqFenuEgXdvXl1cXV1fYF5fZGNiY2NiYF9dW1taWl1aWlpaXGRub2hmZ2lrbnKBrbmwta6mpaenmqCkoJqcpauuo6eiq6qsqrCkpp+qrbW2sb25r7evqK63tLS8uLS8r7i5tLG8wbHArqWooquxsrOnvKqrqKusrbSzpaitoaSuqbKlp6itpai3rLCyt7q6u7G7vb6+xL+1wcDHyLe/wMS3xMK/u7/Ewr7EyMzKv77DwMCphnJ0cmppXWFvZFdWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XR0M3EyLq6zMLMv7zKt77Ev7vLuMLEw7e6wLq1s7nCtbGys6epk4OJjYF8foB+eHR/fHN3Zl9dXF1eX2BeX2NjYWJgYF9dXVxaWFpbW1lYWlxfZmtmZWdlaGtvcoWqpaymoJyhpZSdpJuYkqGjqqOin6Wlp6Wsn52bpKassq+2t6ewrKeqtKq0urG2ta22ubGvurmxt6SfpJ+msaerqLmqpKeoqKeyraCnpp+bpKWsnp+npJ+gsa2trLK0srSwtby2u8HBsrq+w8GyubnCs8C9v7W4u72+vMLHxMLDv7/EoIN3cGthZl9rb2BUWV5ITmdPVEdFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9taCelJ2hprq2q7Ozu7PE0MnLw8e5uMnCzcC5y7i8xrm1xrm1wMOwusG3squ0u7aqrK6lm4SHh4F9enV0b21rampxaV5gXVxcXF5gX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1viJ2poJeVmqGWm6KYlo2eoaKmm5+fo6Whp56bopufqrCtsbWiqaqpq6uktLmtt7CssrWusrWusKqfnZ6jorKkpqm4raKmpp+orKqZn6CemZ2fpZqao5ybna+pq6eqq6ytsLK4r7i5u7C2u7u6q7OzubO9tLaxsbW0v7a9wL3Dwbq7vZeDenJrX2VeZGRYVFddSVdcS1BHSUlGQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xtDIyMHHvLzFxM+/usi5ucC5tMO2sr2+sL6/uKiksLSxoaipnoiGh4B4c25wbmtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3KNqJ2UlJSbmJuhlpaRnKGiqJ2bnaWmoaWcoKCamK2ura6yoKWiraumobSwsbGsqK+yp7qzprahop6bo6Gto6Gptaqio6adpaajlpiel5manZ+al52dnJysoaumo6Smrauzs6q0sLKqsrm0r6mvsrKzt7Ouqayusriwura5vb+3srGUhXl1ZV5lXltZVlNaVUtcUUxJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+znaWjmKWxwrW2va20uMLNyMfAxrfBwMjPuMLFvrS7u7TAuLS7vbG3urWloayzqqCnpJR8hISAeXBydHFpZmRoZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYWFhYVldhZGVjZGVkZGhqdqKclJSPlJaXn5eZlJifnqGclqGhqKOfnqmcmpqqpq+wq5ujo7eqoJ+uqLappqetsKO3sKS3n6KbmJiqpqGarLiwoqGknKKgoJOVoZSVlpuYl5aXnJWfqZ2po6Gdo6qqsK6otKuqpq2ysKWqrrKxsLCur6anp7KusbSvvLS6t66jlIF5dWReYVZZV1NSVEtNXkxQS0dHTExFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp2np6Oqu8C9wLmutLjCzcnGw8S+xrjJzLPCw8Kvvb23vb63u7y1tbexoqGqs56elpuGgHx4cmptcnRwaWhlZGZiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2NjYmJjYmNkZmqBlpOVi5GUk5uZnJaWm6Ccn5Wgn6alpKannpyfpZ+qr6afoqO2qKChoqi0oaWnpK+lsK2stZ6gnZWUqaGilKyxsZ6io52dmJuTi6GUkZOXmJKXl5iWnaabpqGimaOlpaukpbCnpaOrq62mqK6vrquoqqmzpaarr7Sxrry1sa+voJJ6dnJkYVxaXVhOTFJIUmFNV1BPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepKett7u8wcW6sbm1xcrLwcTHx8i3xsW0w8DHrLi5v7i/vb65uLK0r6Cgqq2Wln+Rh391bmRiZ2loZmhqZ2ptYF1cW1paWlpcXVxbXF5fXFpZW1lZWVtXVVhXVFRXVlNUUlVgYF9gYV9gYWNkaYGTk4iQjpSSk5yUlZajmaCWnKCloa2lpKOio6GbqqulmZ6lsamgoJ2lq56noZ6sramorq2ioaKUl6ObnJCqqLCbn6KfnpeZk4qekY2Sk5WQmJiTm6GinKSgoZWgoaSmm6OrpaKkqqSrrqWtsqmmpaamtKapqK2ztbS5uq+qrJ6LcnBvYFtXVlZSR1FPSFpcT1JJVEtTTEVHSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6PDw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njo4Njk4OTg5OzlAOXu1tK20u7Kvq7Gtnaenr7m5s8DIurXAr8bJzbvCy8zItsq+sr/Fyq6zusS4vsO/ubmwtK+eo6inlI59i4R8dWlpaWxnamxta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV1eXl9fYmRtjo+EkYeQkY6Zk5SSnJqinJugp6iqqKqmqKWjmKSupJSZpa+pn5uZm6Cer5mbqrOfpaafo6OhlJOblpaSqKmsmpyfoaCalJCMmY6MkIySjZaVkJ6hoKOcm6KVm6CioJiiqKOiqKugq6+krrelo6SirK2qqKuusreyvbWzq6+YhHNzaFtYWFJVUkVYTFFbWU1VTlBMUFFJTklCPD8/QT88NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s66os7auqaevrZupqKy3tqy8yru2v6zMx8a5ws/Px7TFvLi8xMqyrrrCub/Bv7i7rLKpn6KmopSKfYF3eG9uaG1ubXBoZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVVFNOUFFZWlpaXVxcXl9gZH6NgYt/jJCKko2XkZeZoqCbn6qppq6qp6+jp5mfrKCVlqSop52XkI+anq6Wl6eqmZ+clKWhnpKQk5KTlaeqpJqZmZ2dlo2MjJSGiY2DkIuSlZGgnqCjl5WflZqgop2Tm6Wlp6iooLGwprG8p6CjrLSrrqewtLC5tcCxrbGrkX1xcmJWVFZOUklHVlFSUkxMWE1KTE5SR01LQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OtprG3qqaisKudqqepsrGktsa0ubqzy8a6u8LL0MqyuLm9v8LFs7K0uq+3t7+4u6qsp6qmpqGQkn9rZ21ucm5xanBrZGZnZV5aWVpZWlpaW1paWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domNh5CKl4mUlJebmZ2omp+ppaSqnaeYoKWbko+eopqXloWEkpqjj5OinJWWlYeimpqTi46LkJqjppuVlZebkJKHlI6MgYuNgJCKkpKSoZqfopWUmJiVoqWZjJikpqimoZ+0sqiyt6Gdoresqq2ksrKmtbu1q6uxo4l4cm1dTlFRTE9DTU5OUEtGTk5KSk5NUUlNSkFHTEhHQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjc3Njo5OTk5ODQ5ODhBN3e2p6S2sKSno6mloKmlpLOqorLDtbWys8fGuLvEys3GtK27vra5wbGvq7OfqbG+tLWno6WspqaVipd2X2Bnc3F2cWluaWVoaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhZWFtdYW9zdnGFiIKIgJGEjoqUkZOdoI+am6Kho5iklqGblY2HmJqMc42CfY2XloWQmZCTjo57mY6cjIKKgImYn6KekJOYloSOgpN+fnSJjnqQh5OQkJ2amZqQlZCdjqKjjomaoKGjo5uitK+sr6yfmaW4pqawobCunLC7qqmvqpmCdnJiVU1ST1BNQ1NOTFFNQlBRSElOU01ISkpDSkxGS0s8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTE3NjQ3ODk6OjY1Ojg3QTd4t6KjtKilpqijpqWmpqazp6W0wbivtLDKxbi6wc/GvrOtu8Ktr8WvqqSpk6CpurKqqJmgpaShjIeSbFdXX2hnaWdobmNqaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5Yco+Cl4aNnJeLk5Cfl52VlJaUjpaJf5OJXztXb3uLlImAi5KMj4WGc4qEloF5gnqFlJ2Ug5aOkI+Dhn2SeHJvhY1+iYGRjY+XmZiTio+JnIeel4eIlp6aoaCXp6+praionpets6KmrZisq5intKKpraOTfnJtX1tOU1JWTERUSlBNTEZOT0lGTFFNS09KSU1QRklJPDc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepp6KpsKintMG5sLWwyMO4tL7PwLmvr7bDqKzHq6WfmoSXnrWooaCQn52cmIyDiGNRTVJWWlpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1waXuCdFBCQX+VkZF9iZSMhIqNmo2VlYqSiIWVhniIf2BKUW54ipGEfYSNiYV/f25+f5R3dXV3hI2ZcFGNiIqHfH54k3Zod4aIfoqIlYqNkJGWi4SKiJSEmoyBhJKblp6clKSjqKmlpJ6bsKqhpKSQpaqWoamcoqaoiXVsZV5bSFFRUk1JVU1TSUxLT0lIR0tOTE1US1FRT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6KnnZ+hrqGnqKWnqK+tqra8tri3s8K8t6i6ybm2qKm2t6uzvqigmJCBjJasm5yShpmQkoyHgIBfTUxOTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+HgXyFjJKBkpmLj3uGj4B1f3hzbnVwdI2NgXl9iqqFeXpodnuOcHJteIGLjJJ4eoB7gHZzcpJ3Z3WEhISEe5WJiIqMioB/hIuMf5SDe4CPmJWclZGfnamen6CdoKmln52YjKekk6Cflp6epIByZ2BcXEpWT1JHS1hST0pNTVJKSkpNUEhMUUxSVExFSEE8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3OTU2NzUyNTI1NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpijoZicn7Spr6mlraywsaq9tLK7uLa7tbKgt7uzq52eraqqtLCjnJOQloOQn5KYhn6ShIqDfn54YEtJSUhHRkhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUVNWXnWDfXlnd42XmI6PfWd5gXZ4gImPfISYkoFyh498dntva36tfHOQin97hpKBfX90ZnZ8hmxvaHN8iYyHgGx5cX1wbXWPcWlxgH6OcEOLhIKDhX93d3qLhX2LenV+jpKPmIqSmpujlpmdmp2eop2WjYqlm4+el46WmI92bmxlYlpXV1RRSlNVVE9QTlFWS05LTk9KUU5ITk9LRUM8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXoJ+WoKavrK6rqKmwr7GrvLisu765s62om7GnrZyQlp2mqqWimZuRhpN7i5KPkXx3hnaAfHh5eGBLRkdGQUBDRElMTE1RUlBRU1VUVFVWV1dXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFhdZXBybYinqsB+dXlie3hufHmIkHl8i4VvbYyReHN4amqAgnKWkYuBfZaASZOYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmltcH9zjYmEhnp9fnt2b3RzhYJ5gXdwfI6MipSDlpeYmpCTlZaZl56XjIOJn5GLko2GkJZ+bWhtbm5XVVdUUlFZT1JVVVNYVU1OSE5KTU5LQ0hOR0U/Ojg5Ozk5Oj48OTw7Ojo9Pjo4Ojs5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp6lrbCirKqota+urLS/q7zCv6aimpWlmJ6OhYyWoqKZmZKVjXSPe4KIjot5dXtxenRwdHZhT0VHREA8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX5wbX96i4l2gYiGdGyakXRze2prnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtxf3xncXF7bpONj3tzfXxxcG51bYJ+d3l0aXmJgoiJg5aTkpCLjZGUlI+XjoB5iJeIhoqGgJCHdmpqbmdkV1FaV1lZW01QVVZZWU5JSEVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCs1Nzc1NDc4aU84OzVukoiakZmWpKiunrKfprquq7KwwrG7w8eblo+VmYuNhnqFkZmVjpGNkYhyiIN2iY6KfXR1c3V0bHZuZVVGSUQ/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT09RVkxBSVFJYq+zoHF8eG19bHKDgYWBeoSGhnlyoJV0eIBzdZSHNXGdqJ2OoaGEooV2cIZ8h3xzjK2NiYBoZmJpbnJtcIJ1aW9YdXCOmpJ3bH97fW1xbXCAenN2bWJ2hH+GgIWQkYqLipKLkYyLj4N1eIuPgH6DgH6PenFwb2tgW1xdW1lYYF9TTltaWVhMSEpFSkc/Q0FCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoeWkZ6kp56vlaW1qa2xrsGyu8HGl5CMlJCBiX1ugpGSiYSLiI+HdoOFbZaJi354eXpwenJ7aW1eSlBHPkA3NDQ4Ozs8PT5AQkVJTExMTU5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8fYWDf4x+dqKZeX6GgYWZhJucYYaqn52KgpCOeneIfomIjnOKl4+De1xkcXR6e3eKbGdqYnlvhY+Cem6Bd3SEenB0eXdrbmldd4d9h3yIh4+Ai5OXg42FjYZ9cYR/hHx1d3t9iXVvcnNlZ19bWl1TW2ZeV1FVWVxWR0pKREtHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyNeIp/lIySnZ2fppGgq6CxqK/AsbrFupaOkZSIeoV2a4CMkoN+i4SPjXmDgXSihYx+foKAcoKAfGt4a1NXTEBFMjExMjY3Njg4Ojw/QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxxfI+MenyJhn6Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkaiHgJiYipxzbHyBhod9jmhnaHh+boWGgoVxhIVHa4B3cnl2aG1rX3Z9g4h/iIWMepWenIqLiJF/e3WLdnx3bW93fn9ycnFrW11cW2NjWGdlXFVQUFdZUERMS0ZOSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFiJGPlpeSl6GdrKGmuK+zvbOXjZKLmIt9dHB/iZN/fYyDk5V9hn6GpYiJgIOIhnmIi391hnhfY1ZLQjYwLi8yMzEyMzY2ODo9Pz9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzk0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYGEgoWRk36FiZGBmpWCoaGXlZuapa2Tmruxp7vHw6iLjKGlj5SJgZB7coOdn5GcfnaFhYqPh5BpaG+DgHSMhoSLcYaCd4eAe3aFfW52dWeAlI+GiYiHiIehq6KWiY6Yf3uCiXp6b2dreH54fXFqY11aWl1pXGFmX1pPTE5YUlFJUEtETkdDS0RDQURDQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnVwZ3iDe4CMgIGQj4uamqScoaymq6+wl5GRhKGUhHh3f4yUfX+ShpOWf4qAkpuOhIGCjIuCio6EgIp/bHBqXUNBNC0tLy8uLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jKGemISShYKPoZ+TmJKEioWPmJGWbHB1iYuBlYyNj3aPhHFshYGKlpKDhYhyiaGWhpOKj4+WpbWpm42VooOHk4R+f2tqa3x/f4ByYFxjXllmalxsa15YS0hPU1FOTUxGSVBERE5GQkNFR0I+OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuaFlwg3B1h3F2koZ+l5aalJ+fnKegqpaTmJ5nZaSafoSSknqAkYmRkn2KhZmSkYOAgIuNiYaRh4WIhXh4f2dNUj4vLi4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFSU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZuopqKZoZeilZyfqJ6pq5+orKmqtZerv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGampmnkZGIlaKamnd6fpSXkaGSlpeBlJ57dpWSq7OJjZegfZSenI6Tlpmkoqa2sJ2RmaiIl5COgYhsc3N8fnpvZ19bYF5hZmNgZ2dcUkVLS1BPSUpMRkZNQ0hMRkZDQkdEQDo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcXVgbn1id459fJSOjoqfkpeelpyqmJ6qQkR9h4mHmI14go2Ljo17ioaPkI6Cg4CJjIqFk4WDhoiBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49R0dBQUA4NjYyPDk7RkhHSUlNT1FZbYaQd5WLo6eqtb24pa6srKeotKyxt7Kyrbuxs76cs8Ssu8nLuMS/uKWjsLKsraqji5aYhaamoKKXgqaZjaKqqKSHhZOjoKCqoKSpjpyxi5Wjp7e7m6CjsJOjnaOekaSiq6+ts7WilaWriZqKk4qVent+hH1mX2dbZGFdY2NeZmZfW09ESkhUT0ZITEZLSEVGSEFLRkNGRkE6ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljWGpwWHqFdoGUhYiCm4OSkI2S2sidlnNWl4iPiJyPfIaMj4uKeoiCh5GOg4WAi4WFiJKGgoSJhoeHh3FuYUBFNjQ8Mi8xMTAtLCstMS8tND9EQU1VUVJUVVVXVU1bUEdHRDw+PkZIQ0RANzs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHIxKuzxbass8CzuL62v7TBtru7pLjGqbbJx7a+ubSoo7StsbGbmZKan4inr6qklHafpJehq7GzmJapraiutbuyuqyvtaKxrLG1vLe1rrWgp6ejqJupsK2yuri4p5y3qY2lj5KToIZ5gYJ0WGBjVWVhYWJfYGZfW1RKREVMVlFJSkpESkhFQUBAS0RBTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxbWlFjZFd6dXGClH2FhpN2hn6AjXu/u6O8grSUk42bj4SIj5OJiXmHgIyTjIeFgY5/gYmPhn+FiIWKh5F6eW5dVkBFTjw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFdPX1VJS0pBQD9HS0ZFQzs+QDdENz9CSkpFR1dUUF6Ppa2jsbTDtrjBzMq2u8S9s7TBt7jCtb+wt3SxtKa6xaSwxrmxs7G0qKS1tqqxoKKWm6KRpbGtpa2rp6SYoKyzuqKosrm1u77Mv8XFvb2zwre6uL+3ure5ra2xprGqrb6wvbvCwqyZu6iVrY+YmKqJfoF7aVZhYFdpZGlkVltjWVZUSUhHTFFHRElKQUhEPj9CQktAQExDOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZRTEFMUldUWlZad2pwf4+EgY6FbnpzeIhiuKGao4mVlJaTlJONkJeSh4d7h4GNlYqAhIGKenyLh4Z9ioKBi4SVfXh6dWVPXGRHRUw6UWRhW15TRj47SFBEWmRRUVlYWmdaVGBhTVNPRUE/SUpIRUZBQEM9RTZCPkhHS01TWlRelK+4tbq5ycC7vcrMu73Au7e1vLu3vrW6ssZgdbKlsZqeq76qpairqqSisrWhq6eelZaemJ+upaempZ+kk6KnsLOosrK8tsG908nJ08bCxczCysPAvr2/u7y3tLC5t7fDusa+w8mwnrqqoqyPpai2iYF9cV5hYFxWYV5nZVJYYVZSVklFRk1LQD5IRD1LQj1CQD1GPTtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFRSUE9RUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWdtbHGQjYWQc2xzcnOI1cC1maCNlZmakY6XkZaWjoaHfYeDjZaLf4N/g3h7i4SHe4t5gYqCl390fXpsZXB2WV1cUGVlYmBlZF1bWFdcTWRtVVJtbl9vX1hnZVVZVEpEQUtLSEZISEhIQkk5RD9IS1RUVl1aXJO5wLm9t8bBu7nKy7u3ura4ubO4tbWutraZZHWpnq1wXqKtnJihopuknqullJ+fkJSPlpiXqJ+ln56amYOknaykqrCtt7C8uNTQztbPyczSzM/OysfAv8LKvcG9wsDFxMbKv8nPtKS7sbWwm6y5vZp+eGpcX1tYXWBZYmJRW2BTUUtDQkVGRTxARj5CSUJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaWBvl5KRlG5sb3R1h7OsoaGfi5mcmY2NlZGbkoWKin+Ih4yQjIl8gYNze4qDhXyKdIKKhpV/c3t5bG11fGlzZWlsaWZqamlgZmlobVptdJetpLyHh2dbb2hdWllUSEpOUEpLUUxUUUhMQUpHS1BfX2JnamKXt8ewubO7vraxxMe2sLmxsLuss7Gnq7esjbannpynmk6bno2OoJaRp5illYqTk4iRiY+RkZ2boZiblZaHnpmmmqyvqK+ns7PT1NTW0cvP09TO08/MxsPK0L/KycvJ0sjNzcPR0rivxLzEuqa3u8SigG1iW1tcV19XWWVZUFxXTlFDQklFQ0k7QUQ+QUg/P0E3O0Q+QEk9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OT05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2ZXc5CQmYNocW95eYOgqp6ml42bm5iLjZWRmo59iYyFjoqKi5CIfISCcH+HgYZ7h3KDkouPfnF5dWxweH9ye254c2xpgHBtY2ltcHlpd31+y7/C36dtY3hvZFthYEpQUlVOWV5QXV1OUE5UUVVUXG5ud4Nylq64rLSosLarrb3Bsau1pqW4p6yuoay0pI+xrpuYmIyRlJGEj5uBjaeRnImDi4SKiYSKg5OVmJeUm5GbmJmZnp6rrKSnoaysztLV0c3M0tPT0NTRzsjD1NHIztLT09bN0tHF0tbGwc/IyMOpv7jQnXhsZFxhXFVeUV1aT09UUE5IPkFHQkNGPEFCP0ZFPkA/Oj09PTxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8yNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WHhot3bXdwfX6AoZ6eoYuNmZOTjIyTkJaFeYWQkI6LioiRh3+Ce3J+gIKHeoV2hZORiYBwd3Nsc3x8d3xzgnhxa4BycmlvcXp5c3u+y5p+jLGDdnKFd2hhal1DWlpbV2ZkWGVrVFhdXGBjXWN4e3+LgZmqpKSioKGop6qxuaumtKOiraKjrqKnsZ+JppuVk5GKko6IgpSJa5WijZmEgYZ+kYODk5eti5WNlZmOhZKQnZensKKgoKSkqMfNz8fBy9DT0dTSztPNxtbTzdTY1tbY1dfVydTazcrY1tHKrcTDzIpxbWJfXldSWFJbUEpHSklKQDs6O0VDRDxDRD5IQz9DQjs7OTw5R0M0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV+aXN5coKJgZ2VnpSFi5aJjoqIjoiPgHiDlJmLjYiIi4l+g3hze32Eh3eAe4eRl4GEb3hwbXV/dnh9dIZ8eWyHdnVufXaEdXl7nbWMPEGKxqV+jXxqZVdJQ2VjZmNoamRveVtfZmhrbmlugISIkYyen6CekZeYn6SkprKkpbOgoqWeoamgorGch5+SkpORi46LhoOPhH6cnIyNgoSFepR+gqqVo4ySipiSi32XipqRq7OYmpunnKe9w8W5tsXN0dDRz8vSy8nUz9HV2tfX2NTZ2M3Y287J2trS1r/MzbV2dW1jXFhSVVBZVUZGSklFRT06NzpAQUI6R0VARURCREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGJxcXOGjXyXkZ2LfoeSgomGhYqDiH15hZeXiY+Dh4aHeoR5cXp7hIZ2eoaOjZ16jHB9b3B6f3J7gHGEh4Bujnp1d318gnV/fIeJsHRZqsK3jZKBcG5jPV5ocnBxcG54d4JlaW9ydXhye4uHjpOSm5agloiMk5ugm5+qn6GtnKKamp+mn5+smYyajJGTjoV9iIeDhYuOoJmTiIOHfm2ZeYSZhoiTjI6VjIZ7m4iTj66qlJWXnpimrrW8qK29xsvIycvLz8jD0crU1tjX2NfV29fT2tvW0Nra0dbI1cyUd3lnZlpZT1JTXUhCRUlJPkE+PTg6PT87Pkg9QEJBQURBPj86ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmt2gIhxkZCbgHmAjn6DgoKFf4R8fYSYjoeLfoaHgHeCeW57e4eCdHqSno2hdo92g3R1gX10gIRvgpCCb5KEdXyBhXp2h3yJuMalw8q4gpacj3hwZU5lY4J6gXeGopCLeXl3e4R/fIR2bZSWlJWPmJGDiY+XmpeXppyYoJefk5KXo52Zq5aRkYuOkoOMhYmIgYaQkZ6cmYmFi4GFl3uIiZ+XkImOiouCfKGIkIu8oZiTl5mcqKalrZ6ntb7Av7jHyc3Oxc3K0dbV1NnV19vU19na29fb2tnYztvHhXl3ZWdjXlJWVlVNS0RORDs9PTw5Ojw+OT5BNz4/QD1APjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdIUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWZhXVtodHp5bImNknd2eop8foB/gH2Fe36CkYqFhnqFiHt1fXVtfX2GfnR/kp6Rn4OSfIZ9eI9+eYuKb4ObgHSZhn2CioV8fpF7kKmOkMOgvYycpJx+ioR9iXKMi39zppqcmZSFe4+RiYRpR3GhpJ2Mi5CShYiLkZOVj52bk5SRl42MlZ+dlKGUko6OkIx+kI+Oi4SIkpaan5+JjJSRnZCCjH+mmYiFjoOGhICkhoqLuJidkZSWoqegnZ2do662urSrv8XK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbt3d3dmlpY1VeWlNPTkhETEI9PT45OTs6OTk8PTZAPj49PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmBjopxc3iKe3t/fYB8iHt9e4uHg351hIZ5c3p0bYF+hH13hpuhm56UkoCMh3+Yh4Cckm6IqYV6oIt8kY+DiYScfpqRiY2jop+QpK+gi5GLhouBkoZXcq2Ln6ycj4SYnJCQjlyDopGCjZ+TlYyHiIySk4yUlZWQjI+KiJabnY+VlpGLk5SGgIuJko2Kip2XmaOihpOdlaCKioiOnJCDiI+Ag4eFpIWLkLOYnJKUl6GhnpmSm52nsbispLzBx83Hxs/Mz8zP18/R1K7W1dja2dra19bZ2Z5ue3NlZVtbVlJVV0NASUQ/Pz46NDk6Ozc6OzozPDw/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieGxifpKDb213i3h6f3uBfYZ8e3aGhYBzcIWCe3Z3dnSEg4V9f5Kmop+mopeKnZCUl4qKp5dyirKNhKeShJmUhZqMo5agmJOJm56ik6mwoJGVkI6OiJWLbo23hJrEyLKdoqWbnZiWkbKQZKTNyJWOhoeJkJKOjZOUioWKioaWmpuPkJSTh5WYhH+Pi5mIjpCql5eko4iZnpaaiY+Gl5iKhY+Ngn+Gj6WIjZOpmpeTl5mhmJ+Zk5yaorK0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6BcX1mYVxcXU5JVFlBQkdEO0E+ODM3Ozw6OD02NDo6PDo3Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4JHdoGPfXxtfoh4en57goKDf3Z2gIN8bW6Lf3p8eHh8hIeKfoujs6ejqrOil6efpaSWla6ig5G4lZGzmo2hoYylm7CjpJ2YkaeWqJmsr6SYlZaVkIuYmZehwI6jybmrnKOmrZmSm52ynYWFqKKcmIWJiY6VjYuTj4iBhoeJk5iVjIuUk4aVmIaEkZCcdZGYspaXpKGInZqTkIqQipebiYuWjod9jJieiZCQnJqZk5iYn5SgnZSem6CxrqKkt760xcfEvcPDv8bNysnSps7N09LR1tjT0Ni6cXh0W19UX1VPSEpOREJDRTU+Ojc3Oj88PDc9NDM2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdOW1xZSmZgO0iEi3p6boWGenyEeYGGgX5weHx+fW9yjXp+gnx4houJhoSSp7usqLK9r6Wts7Ooo6GwrIqatZ2iuKWVraSXqa24p6Wjn5qpl6mjr7CqmpmclJWRl6CYmru7rsqhara4q7CUmZ+jrJOXvaNeqrKDioqNlIeQfI6OfYOGjo+UlYiIk5aMkJaNi42XmJOdmbSXlaudi5yUko6RkoyZm4qSnpCLiZWfoY2UjZianZKcmJ6UoaCUnJ2lr6ihpbO4q8LIxLW6vbvFx8fC0aDGyc3NxdfW0cvUoW95Z1tZUl1QT0VDPjxDQUI4Pzg4NT9HPTw2PDM1MzQ1NDU0QjM5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRHYmBicEo/i4p/gXOGh32CiXWDioJ/bXx9fX9wd4d3joKHe42PjIaMmarCwK+9xruztMC8tK2rs7aMqLOtrb2rm7ukqK25uKunpqKipKKpr7Kxq52cpJibmJeeoqalkqS6r6nAvK2tsrmlpah+iIacrbywg4yMi5CDjoORj3qBh5CNjZyJiI+XjYuVlpSRmpedqJqxmpGsnI6aj5KOlZCQlpeOkaCRiZSbpKyUlo+UnJ2ToZ2bmKChlJqep6akoqSws6fBxsOvsLq2xcTCv82mx8THw7zV0c3FyodycWBaWF5aTEpCS0BGRz5BP0I7OjU+QT09NTw2PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRD9DRlxlR2BpZ1pdXJOMjIh7h4yHg4x1hpGKgW9+e4F/cX6Be5V6kpSUmJCTlaezxsm/wszCw7nHvLuvq7m7mLO3urLArqXBpKuwvL2rrqujo56nq660sKqcoKqcoZuWn7C1p4ujuru2wbysqZyypaSplIWOqcTDpIKLj4eIhIaVlI16hI2Rj5GijIyUkY6Jl5+Yk5mVmKagrp2MqpyOlo+SkZWVjZCVkY+hlIaXn6CynpSalJ+gmKSfmqCboJSYnqWjpqakr66lwMTDrqi3tsnDvrbPssS/xLyz0cnIwrVzd2tbVlpoUUxIQ0xLS0pBQT1DRDw1QUQ7OzM9OEIzMzIyNjJBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJlWU5lXGZUY2qZjZeKjIiTkIaJeYeUkIFygHyNf3iHgoKQeo6hlqiampi6vsfIycHSycrCzb3Cs628vqi6v727w7eswqmss7y+qrCqpKWkrK6zrba1oJ+vn6WimKOzvambqL3BpLa3sKyTsa2srZeHmqmnpZGCjJOllYmBdoqReoWNkpCen5OPlIuPjZSjmZaclJSjnqqfkaWajI+Pj5WWiHyPlZKSo5qVn6GctaWQnpelo6Klnp2mmJ6Wl5uko6mnorKsqLzAxK+lsrfMwLmvxLO7vsK4rcLDwsCYa3hgV1ZaWkpLTUpGRERIQ0JBREw6NERIOTs0PDdFLjEyMzUyQjI1U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djpeOnpKJin+KoJOEeIV/lX9/kIiKkICWoZmupqSYwr3Hw8fF083Ozcu8wrewuby0vcu8w8G2t7yts8C6vK6vqKCpqLatrqmyt5ueraKnoZ6rt7iqpbC/xbG9ubSoqrW0rq+XlqWsqKCRjpKyxaeVjn2SlX2IkpmQqpmYk5OPkpWTpZ6SnZmUoaOinJifmIuMj4+eiFqQlpeSl6WZZZijn7OllqGWrKyqp5ueppeYlpiVoKSopZ+2q6q6u8O0pbO1y8C4qrassrq4rqi4ur24gmptWVZTVE1FSlJOSz9BSEVESEhIOTVGTTs+OD1ASi4zMjAyNUM1NU9WTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs9QEJGQnBFaUlSZWJMRqWUnJeil6mWjZCDh6aTiIKHgpyDg5WQkJSPmqKfr76voca8xcTGxs7OztLKvru2sbq7u77PtcO9uLm3srG1s7izq6acq6y5qqmnr6+Yo6+kp6SltcCwq6y0v8O6wLq0qLm1ubOvlqWtrq6ki5OVoY10wZp9l5mEj5aajLGVm5qVkpOZmaWjlKCbl5qpnJyhoJmKjZCWnGBKlpyalZqlllWXsJ+vnJ6klK+urKWaoKWUk5mYjpygp6KZtKmqs7y7u6qwsse/uaasq62xsaOhsbK0pG9sZFtZTk9LRU9QUVE7SEpJR0lDQz46S1U/QTo9RU0wNzU0NDpCNDRNV088SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiql5mgoqivmZGYh4uolo6Ik4Wfh4Sdl46doZujpLXItanGusLDx8rJyMzNxr67s665ucHBzLXHusG5tbqwr6+ztaekm6q0taqppq2smqSupaSorLq/qKu2t77Cv765tLPEsrm9rKOvtay5poibl6abdr+fhJmdjpOZmouul6Gcm5aVm5+hqZ6nn5maqpmhp56YkI2RnYNudpKimpWdop6QrrKiqpSoqpeqrqSkn6WokpKZnIiUnKKdlrGnqau6tr2zsq2+ubego6eopaecm6ypqYxhZGBeUUpMRkhNSVZMPU1FTktMQkNEPFFWPUFBQkRPMTg9Nzc/Qjc1VVhOP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li1SYE1VSH9lXkhFq5WcoZ+7r5mUn4yTq5uRkpOJq42Hop+MpK2Uo6O2xr60wLrCwsfIxcLNyMG+ubKvuLTAwsq1xbLBvLS6qqmtrbCjo5iqtLumqaarqp2pr6ejqqu+vKitvbS4vse8t7a4wbK+wbSptbervqWPopiSop+8n4maoJmXnp6Pt5+pnKWim5yhmqils6GbnaacqKqemZWPlJuLl4mMpKKUnaKeobWvpaSTr6uZq6qdnaSjqJGVlZ+Dj56em5WppKGhtLS6ta2otbKznpyipZqXlZiqoZ52X1tfXUpIRUZNUUlNRUZHQ1NMSkJFR0FWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkRASkpOTzlDQDU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE5Z1xGQ0OccGJHRaeXpJ+ew62bl6WYmqmclpubj6qWlaemla2smaKrtsTCvL63wcLAx8O/zca7vbmysLizv8LItb+wvLa4tqakq6ytoaGaqqrFoqSpq6aerK+roqmov7inrb6xuLbHtrW5uMCyv8K3tbO0r76jl6OWlJuUrqCQoaOlo6OfkL2kqZ6oq52doJumn72imaOfoqmroZ2WjZWek56Hj4SNk5+koJ61rKWblbGnma6mnpmpnZ+NmJSehI2gmpuTpaSamKuxtbGrpaqtrJyYoKCSjpCVqJ6UZ2JYYF1OSEdKTktIRURJQD5RSUE8R0lIW1JPSz1IT1U0QkY5PkhHNUNhW0tDTlJVV1ZRWFRSVUlAOFJRUE06R0E0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNDZAOTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROm5SRjxLeGViVkyimqOcnsWsoZ+snp6uoJKjn5aln6aqrJe2saOqs7bExL2/tb/Cu8jCvsrHtbi1tLCzs7fBxba+sbi1uLWfpqyqrJ2dnqWkwaSfqq2gpKmtr6KmqL21pbG9uba2xLK0uLq/s8TBuLius7W1o52llZGUoa6gmaKeqKiro5rCramerK2bm56ZpqC+oZ2kmKurrKaimY2an5KfiY5Xf5afpqGguKqmk5i1o5+xoJ+arpaejpiTnYGOn5eVjqKjlpCmrrKrqaGipaWVlZ2Yi4+RkqSeiWBjWWNgS0hKSk5FRUFGSj49SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dyR0U2PXVlXEtOnp+hmZ7DqKWitKKdsqiTq6Wgo5+tqaydu7CorLaxyMXBwrLCw73Gw7zEybyvsLatsLSvv8S0ubGwurSsmaiwqaqanaWhqMGsm6ywnKqjrrGppKi9tqe3u76vt8SttLPDwLPHtLu3rLS2raqippaVlKSsop+fmqirsK+vu7KmoKmompmYk6KkuaChpJOvr6ylp5+SoZ6Vno+QjZWemqKep7SmpoyYs5ujrpqdm62QnpOVk5l/kaGWj42foZOLpqywpaahnKCekpKak4WLkY2cnn9gZVpnZUpJTEpSQkNASUc7O0c/OTlPTVVeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ+joJygw6mkqrOhpLSqlrOsp6KksqyuqbuxrbC1tMbAxMO1wMS9ycS1v8jCtKu1qK+4rL/Ds7eurLe6pZmrsquqmJ+ml627tJunsJutoK60sqerubOourS4srnAqreyxL61xqi/r623tamnrKGXl5GmpaKimJilr7iusrW2oJ+opJqVlZOkoLeipKWWr7Gyp6qmop+bmpuWl6ifoJihnq+yoqaMl66YpKqXmZ6kkJqNk5eZhZWelIyPnJ2Ti6mpqqGnoJmelYyOmY+BhZWIlJ94YmhcampNUE1OVD1DQU5DOjpJPzc3Uk9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJcGhWQ1dGjHlmQzukpJ2ipr+nqK+woam1q526saujqrS2sbC5t7C3uLjEvcPHvbzEwcbAuMDFwLqptqSsu6zAwre3qqyyu6KVrbGtspalp5GquamfprCdq6CwtLOqqba2rbyts7O5t6y4sMO7vr+mw6uwt66pq6unnpiZq6GioZGXobGvs6ywuZqcqaCZlpKXpqG3qaWjorCxtKuzqKyfm6Cgm52lnaKXnaOzsJqfj5Olmp+ompSinZSXiZOWkpWWnJOIkJqZlI6oqKafo5uXm5OGjpiLfYyWhY6aamhsYGxuV1BRWlRBQ0RUQDs7SEE3OlhQZF5QVldFWV9dTUxSTl5LSj5aY15OSFBPXFVZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT0qJys9XHA9PjEuMGRaZEAxNjQ3Z1lgRig/OGx9Z1tWO4l7Y0M9qJ+doqq9oquwq6OxuKqltrSsoK21va6zuLu6vba2wMK/yMS5xMLAwLjEvcG3r7Wnq7exu76/tKmusbefl6uuqK6XpqiOp7ufpKyznqyisbCzrKq2tLW+rrCxtaywtbLBu8W3q72vsbisraqjsaaepaqfpJiQmZ+zqrOrqrOanaebmpWOoKaltK6noa2trrGntK2yqqScn6ijnpWimZuotamXmZGSnpmdn52Qqp2Wl4SUloqdmZyTio2Wl5qXpqWioJ2WlZeTf4+UhXuOkoKMlmVscmdvcV5GWWZWRENNWERaOUhCNj5dUWhcTlldR1teXU5NUlhkSkpDXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2BVMTUwPWBWXjgpQzNZVFxnSzaMemZMQKSaoaSstqWtqqavrreqr7W7qKext8W3sbe9wcK1tLrFvszGucLAur65w7fAubK0q6m6tru5vrSprbC1mJinrKqsm6urj6u+nqyusqOrn7Cts66utrK5uKqur7Kota+0vL3Ks6q2tbG0sK+oorOgm6itoKaWlpqasqKtoKWvl6GkmpqSjqOmqLOpoaazrKq2pa+xta+kmZ2tp5qYn5qZq7eil5ORjpecoZeWlKuempJ/kpeMnZyZlpCJlJKemaWioaCYlpKTlXmKj4V7jIqDipJqbXhtdXthRWBqWUlIWlo9e0pGRDZBYlRpW01cYUpbXVpSUlJiYUxLRV5gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENfUVwuKkIvSkdQW0gzY1lVS0SZl6GxqLGqraakr662qbe1uqSstLfJu7S6ur+/tLO3w8DMyLzDvLe9v7+3v7yxva2nurm3tsK2qqyxt5SXpq6rqKOwqpSvu6StsbOnqKOytLGysbWxuLOprquyp7evtrTExraptrassK2qqaS2oKCnsaGklJyZlbGep5ygqo6po56clpimpqW4p6OytayosqeusbaspZmgrKibnJ6clKm4nJSOjoqYm6KXj5iloJyUgpGVj52bl5aViJaPl5qnnKOgkpaRkJV1hJCHe4WBhIyLbXB3dHt+XEtlbFxLTmNcP2J7R0k4R2dXZlxMXmJNWFlXVFdUaV1PT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydHYkxWJS1CLT1FTFE8M3JrSUNDkJmlrqWtr6uopbGztKu3sregq7W5ybmuwLvCuLOxtcLDzsXAwb20vb+/ur68ssSnqbmwtra/vK6rs7KcoKexraalr6WesrWsq7GyraqptLustbO1rbSsqqyoram5rbKxyMC4pbqwqa2tpamusKalo6+kqZyenJuvmqOjoqORrJ6joKCiqqamuaSstbalq6yora+2rqOeo6mqm6CampKks5mOiY2HkKGglIyUnJ+SkYONkpKdmpiVk4eXkpWZp5ufnoySkY2Qdn2OhXx8fIeJiHBzcX18fVxTZG5eTllmXEZElltHO05tWGJbTGBiTlZXVldUWWddUVJMY1pbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGVISis7SD8zQkhTLD6QaztHSI+cqquiqrGkqaWztLG1tbKyoquuvcy6rsC6x7G0rbTCwtHFxr7Asr3Awry/t7vEp6y3rLO4u8Cvq7GtoKOnraqopLCkq7Kqr6ywr7Cuq7O8p7exsqmzq6ympaOtuqyqscO6tq27qaioraqps6WppKOuqqiin52krZWlnpiemaydoqiqoq2mpK2ruLKyoamioKyvsayeoKeoqZmkmZmPoKeYhoSOiouen46KjJWbjo2Eho+Un5yVl5SGlpOTl6SbnJyLk5GNiX5+h4V8d36HhYZzcnGIdWtfWWBuY1FzcVxLO4R8Rj9XdFhhWk5jW05WVlVXUVxiX1NPTmdYV1dLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMjU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLkpnREY4PEIwNUVLWDFAlVo+TEWVmK2ooquznKqqsLatubavq6arqr3Ju7C9t8KvsayzxMPOz8O/v7TAwsO6wLPIw6uut62yuL++sq2tq6SnqrCpp6ixprSvqrCurbKxtKy0vKS4s62srqisoKOesLerqq27t6W3tqSqp6ysq66hqaemsbKkp6aioqyXqqGVm6CmnqSiq6Wto5+nsbiurqOmopuqq66pnaKlpKSZoJqWj5ick4KCj4iFnJ+Lio6LmI2PioKLl6OakZCajJOSkZOimZuZio+Li3yGgYGDenSAhIF9c3aLo4d4al5gbmZXZYdjTj9nk0xFYnlXYllSZVRNVlVWVE9cXWFVS01oVlZXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjM5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxCKzpKT140RIY+SEZEl5KwpaOrsZirqq22rLayrKasqqm8wMC4uLO7taayr8TJy9K/wbu5wL/CucG5wMStsbWxs7q/vbKwrq2rq6e2qqatr6q5sKixsq6yrbeqt7entLerrKSqq5yjnrOzqKiktLWgt66gqqirqayooKusqbm2qaqpqqOqoK2ckqqhnaCkoqajqp6dp7SvqKaqoqOYpaenqpyjpKOgmpigkY6PmI1/h4yHg52dhoSKio2Nj4uChZSimo2MmZCRkY+Sn5aYloyLhH90h4F+f3h0g396d36BiJ2Pb3FnZ3F4XGFziGtPXplWSG14VWRWUWNPTVVUVVBPWFtiVUhQaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg+Qyw+TFRfL0ppNU9EO5aOsaGmq66arKWtsLS1r6umsKqpur67wLCuua6ht6/Jx8jRwL69u7zCvbrDwL6/rrKysbW8usGxsbKrs6iktKilrbOzubCjrreysLK7q7qvqq62rKqeqqyfo6C2raihn6+zorWqnqinqqOqoaKsrai9r6yuraKoqKCsmZCwopiioKeonqebmaqxqqOgraKhlKOjo6eYmqmlmJiYno6Kh5SIfY2GhISkloSBgYuGjoyQg4OToJaIkJyQk5CNkZyUl46KhoZ4dIF/fHV4eYB6dHN5aH+GpHVpXmRrgXRniIx9U1hwXkp4c1NlU1FeTU1SWmZOTFZZZFhGU2lSUT9DTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNSkoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGc6NDhfPWFkP0YxQ1BbWypITTlVQTSQj7KhpKaspKekrae1s7GrpbGoqri+wLyvp7mqpq+wycfI0cO8v765vr+8ybvBuLCwtLG6u7fAsrO7rLisorSnp6yytrmzqKi9tq62vrC9p62staytnKmvpKClraunnJ6rs6W0qJurp6mjqZ2kqaipvay0r66dqqSgrpybs6OVpJylpZ+km5upq6afm6qim5OcoaWemJepqZKYmpSQioKPhX6Pg4CIno+Ffn2LhpCNj4R/k5qThZKhjJSRi5GakZWGiX5/cnt6fnxoeHx6dXBwfGeEeISIZGFnYnKFem1neF1dVUBXem1UYVBSWEtMTnJ1XUhaW2dZRVVmUEQ+Sk5EQ0E5SEdLUz9qYUpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEnLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mY0FKN0dTYFUqPTlEVz4qj5SymaCgqaaloauluLOzpqmxp624wb21r6K4raiosMLJyczBtr3Atbe/uci1w7WzsrWyvLe5vbWtuba/raGzp6ursLW4tayfvr2qs8G0vKGvs7Wqq5+tsKOcpaiqo56bpbGnsKCfq6mooamcpKihrbuorrGuoKujpK6en62ml5+boaOcoJyapKqjm5ulpJaXlZ+ilpuXpqyMnpGRkYuCioCAjoF7mpSNiHt+i4WOjYuKg5KYkYaToomSkoeQmY+TgIh8eWx+dnl4Y3t7cXBwcndogHNqg2dlZ2Btc41sYWlvYG8+WnhrVV5PUVFKSU1UWVdNXV5sV0RYYE9eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTY4OzIoMDkvLDQvLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDFCaFkxM1M9ZV9ETDZLVmRPKjsyTlg9I5OZrZqgmKeko5+opLiwr6SvsKqruMK6s62fuK+rqLS6yMvIv7fCvrC0vbfEtsOxrrmys7+0ur23qbm4vauktKipqrGuurGrnLy9pbDBtbair7e1pqensbOgnqSlp6GlmZ+sqKmeoKqvp6CmmKOpoLG5n6Oxr6GsoayknKanqZqam5+klZ2dm56qp5icoKmTmZSYnpOZlqGqkZqIjo+GfYd/go59fKGMjYh4gouEiYuLhYeSmo+IlZ6IkZWCjJeMkXyFe3NwfXF0dGB5eGlucHBuaH1xY3ttaWVjX2WFfl9ac2tyS0t/aFhaTlBMSkhQUlBJTlxfblNEWFpSaE9IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy46OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPWZkMjRNP2VdRk89UlpnSCo+MFhWNSiXnqeanZasoKChpKK4q7KltLSqqbnEtbOtn7etrq2wtcbIwbe/wrmxtLy2v7u+r6u9sLO+sbzCuKm7urenqLWpqKuxrbOxqJu+t6atvLeyn7G4sKilp6+xm6GkoKSkoZecr6ehn6Oor6GgoZOkpKK3sKGmsaufrKOvmJyqpamel5qepZObnZuep6ybnZ2ml5aYlJ2Ok5eiqKKQiIuPhXqEfoSLeo6WiY2GeIGHg4iLjYWNk5iNjpaYio+XfoaXi495gXpwcndvb3RfeXdkbGxraWiCbWVya2tlaFpic39eWmx2alpIfV1bWE9PSkhIUlVGMjpfXmxQRFhWWWVMSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0R0JnW0hUQ1RdaEUuOzFfVCwylqOimJWdqZ6moaOhuKqvobu5pqy9xLOvrqK1r62tr7TExL2zv7q3sbO5uLq4uq6tv7O0uK+/wbisvbq0pqKzq6iqs6uusqOdwramqbe3q5+yu6mmpaivq5mip5ylppSYobOmmZ6lqqmcoaCUpZ+kuaikp62mnqWhqJOfqaKhoZmbnaGSm52XoKOsnJuaopaTlZabjpOTo6ekj4iKjoZ5hHyFhn2cjYmKhniAg4eHh5GFlZOSjJCVk42OlHuCl46Kd357bHVybWxzYnl1aGdpZ2VuhGdnaGRmaGpfZmJpZlpme2NhUnNUW1tTTElHSU9TQCEral5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LTExOTUsJi41LTgwNTc2YHRCM0NEaFtLV0dVYGhCMzc4Yk0nMp6kpJKOpaacnp6epLWtqKq6t6isw8C3r6yhta6nrq+3wcC9ssG3sa+ytrW4t7Wsqry0r7KxvcC3rry8saWftqymprWpq6+hoMSsqqextKustLqeqKqrsaWYnaqeqKWRmaauo5iepKqhm6Kdl6Cdp7amr6quoaGdnaGVoKafoqCZm5qckpqelaaerqOYl5+WlI6VmIyPmJqnoJCHioqIeIV3goKCnIeLgol7foSIhoSQhJaVj4+QkZCRjZN7g5WNhnJ+fWd5cGtqbGd1c2tiZ2RidH9iZGVmZWlqY2dvWV5YXW1kYU1oV1tgVklHSEtMUlg+OWBsaUdCVVNcW0lIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQWRHJTWcpKCRjK6gmpigl6W0sqOyvrehscW7ubCxo7asq66pub69vK3Asq+vrravs7myp6u5sa+us7a7trC5vqylnrWroKGxpauvn6XEobOlr7Kvt621nq2vrK6imZ2nqqWflZuopqCZpKOpnJqfnJWcna2wprmnraKhmpqemZ+kmqWdlp6Ym5SaoZKolq2pm5SdnJOMlZmOlJSYp6eNjYqJjnuBdIKCipiFh3yJiISEioyIkoWTnJOSj5CRlo6Qf4CNjYNvgX9meW5oa2pncXJrXGhjYXJ/YGRnam5sZmpnZGxcbG12cWFUYmhjZVpJRkxNT1hRUFVhZYFUQFZTWVVGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOktqW01bS1hkY0BBMUlkQic0k6Kcj4+xnZuUoZqpsrCfucC2oLTBu725saa2sKmupbe5uLmtu6+tq6u3qrS5raWytbGvqbG3trGztrunqZ+2qZ2fqqOqrZ2qwpmvpa+xtrWsrJ6xra+qopudpKyonJWcp6SemqmjpZWaoJ2RnKOrqqm6n6akoJiamp6ij2uilZiccYOWnKSAdpGrqJ6WlqGRiZeZgJeKn494hZONg21pfneEcmyGioZ9hIqGb11kYGeEl4Zri5CUknV3i4R/g5B/ZoiAaHZpZlhdaXRuTlBqY2ZxgmZeZGZubGleXV6JkIWIaE9LRDhFVGdeSkhQUFVVS0hTYG90ZUVbUVVQRkdGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTVPa1tOXEtbZmI+RzFPYjwrL42kmoeVsZudk6Ccqq2ro73Fr6m3wri9vK2ntrGmq6S4tLO0sbmuqqestKWwtaKnuLa1qKestrOutK6zoqmftKueoqWcp6ibrr2VqKewtLitrqSorqqrpqKfnKGop5yXoaamnJynp52SnqCZkJ6oqqO0r6Oio5yWmJiYpImhj5Kah6GIlJ6hf6V/p6yflJOdk4iDcniNjoOHoHWIjWmXiWZ+c3mgb4iHg36MfH+hoKCZf3uHnnSIjnabimyIgoNtaWVke21yYlSGbWNtaZhxWGlwboZXXWlba2pbiHBteXKHaYeEWl5GTj5GXk1FUlZWUVBSV1RnXkxZS1JSUEVHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdDE1UmtbTlxMW2dfPUsxVWA3LyiNppeEnaydmZmdn6uqqKq/w6+yuby3wL+qpLexqqyms7Wur7O2q6mlsa2ltbObrLW2tKanqLOxrbKorp6qobOpoKSkmqKknbC3laWmp7a9pqynqaqsp6aioJmgqKSZmaajpZmcpamWk6KclJOjpqahtqSjoKOYlZOYk5yIrpCYlImpi5ijnIaxgKSunpWbn5V5gtSof4eUwJvGeHexpbeWZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4FslrGrsHlobFixrm9labySvG5oem1wj9h+U2titrJ+gHGUdZqhqpBXT1hhT1ZORlRbWFFQU4tcV1tQQFxFUU5ERkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cxMVRrXE9bTV5nXD5MMVpcNDEhjqaTgaeqn5ednaWtsqmxwr2ytb+1uL/Cq6a0ra2pqK+0qq+2tKiopralqLmvnLKytqqlpKeyr66xpquep6SypKKhn5ecoaCxrpWfo6C0uqKqqKGtrqWinZuaoqqgmJuooZ+YnqinkZynmpSeoqejoLCjnp+jlpaSmJKZhbBraoqNqn5nhZaHrWVxn56VmqeWca6hpH53unxroY92sV9qtFulgGWckWBmgXpmgGl4aqllvnJnpox2sWp8sXh1kpRjbW2nblyEoEVpZ4eWRXWcYH1me6Omgllfi6tpgJJ4emqoOEqvW1dUbWNaTE9YX1xXVjtOiE9XVi9JVFNKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVeWTMxG5KilYKsp6Wfo6SqsbettL2+sLfFsri6w6epsKyvqamxr6SxurCkpa+zo6m5qZ6zsrCjpaCqrbCsr6aon6OisZyjnZiVmJ2dr6iXnKKftLOhq5uhra2gnpqXoKOqnZmepKGcmqGnpJCdo5uYoaCsn6amoJqfoZWVkZaRmoa1m7V4hamZtZl3h7Obt3+Ul5erln5rgaZ6gYWGkZSSd6tnarFbrHuOh5R0iHCOhoCAiJCXeIOCi5eMg6CPhbB2d59xa2psfItPpVhIY2OZfmNopV95cXVSkodeUKltY3F9hoBhnS9Som5bVGtnYExLXGNYXFpCPrB4V1hBI01oRkNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQUFEPEZEOzAyMDE7RiwwLjg0MCwuKC8yLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0o4YVU1MByXoJSIs6amoq6pqLOsqru2wrC8wq24t8KrrK2vrqeus6qir7yroqe1raOrtqWlsrOoo6Gdp6qyqLCopp6goLCWoJqWlpeaoK+jm5qkqLWuoamPqaiqm52WmKCmqZufnaOfnKCjpaOVm5+Ymp6jq5ulmpyaoqCWk5GTk52E1ZOZuXGwwn/GhnzWlJy7fJuXp5CNnIykeo2GooGlgnqseY+dVq97iX6farlauXeGg32mgpN8mHqqeY6dkHuxbo6EdJC7hW6VUK+nxYpRoHpjYKpic3KGbJeHX1O1tMiFgIl8Y6QzQp11XVBqaGRQQFhmWmRhSkhNa0paU09ZZlpDQz9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREIuMDA0ODMrLSguMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0pbUF9mVDdHOmFQNzIlnKKTmbGoqaWzqqW0qKS8t8GxusCytrW9tLaosrGjsbOmoK+2qZuouq6jsLKhsrSxoaSenqepsam0qaWcnp6sl5mZl5eWmKKsnpuXqa2wqKOfjqyiqJedmJyhp6KYoqGjoZuioqebnqCelZmbpqGcp5Wbm5+gmJCSlZCdiLJuaLVxq4hwjqZytHRztnubmaaNj5yNon6Pn6R+sHWDkdLRdVuufIV/pG+bqqZrhoV9rX2XmY97sXOTnY94s2WWdIWebp5mlFLJi1rCXJ95Yl+tX3ZzhmKXiF5Zyp1vv4B1TUu1U1XGZFRRamNmWEFPal9saVBVRkk4PVdSW1ZZSUM/SjwyPzs1PTw1Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHJoOSdXaVxBTlRfZVA1Rz1hTTYyLqKdkaWwraWqu62ntaWntru8sru/uLe1u7u0prW0orKyo6CssKWYp7qupLKxnbS4qqClnaGqpLKorKqlmp2bqZ+WlZiZkpOjqqGXk6ersKWilpKsn6aTlKGcpaeglZunp6Kao5+umqGenpCWnKKenKWVnZWZop6VmZaSm4Wse3eodqOPi4epb62Kg6eDmpqjipKZi6J+kpeHroV/grNccrNSrn2CgqR/cdd9d4R+j52GmZp3r4aKkZyId7RhmmWagoGVbJJbsFdLmnWYeWZgrV52d4dnmIhqXa93lZ+PeGw1eciusl9CVG9dZ2BFUGxgcW1WVU0uZWJoU1lQO0JEQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wMzMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6NzegnZSguLGYs8GtqLKnqrK6uLS5vrm4s7a+tqa4tKC1raCgqayglae2rKixsquttKSbqZ+gqKK1p6aqpJmelaWilJScmpKWo6ablJCnra+loZWYqZ+ij5GimqmmoZWapqmdnaSerZ2hnKCNlJ+bnqGYmZyWl6GglJiRpp2GqX19pXmhj5CDqnCtjIGmhpahooqXloijgZCHlKp7f4udeW+xWqiDgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH2ClG2TXKtcW5N/kX9oZ6pjcnuAapiGcV2rWomgj2tuZU9KQ6FcWk10XWJmTVphX3J0X0pVNUqaklhIRT1IRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8xVF9iTDdGSV9DMT03opyamr+smLTCrqutqKa0sLixtr+5urOxuLyqu7WgsaWfpqenn5Sqsamwqratqq+hmKGgpqSkuqKjq6GXm5GjoJWVn5uVmaCgkI6MqbCvpp2Xm6emn42SpJiorKiVmKmonp+gpK2joZ6hjpWhmJ+gkpyXnJWdoZWWj6ubj65ucrR0qYx3iqZztHl0tIGTpaOTnIyJpIeOdbhvjHuLomtrtlqhhmWXl2mgoqdtlHK0dJOYf7JqhpKIrWt1s2GdZqJuhpJrl1ytYE6hfIeRUnOjbHl/fm6YhnBcr1Y8nHdmVG9uLlunT2JSa2VibFpiXGBwfGNTWVE+Pm1vMkJCQD9NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssMzI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eOTFBOKWam527opyywK6tq6unt6m4r7XBtb2ysLq4q8G2qquhnaekop2Sq6untqOzqK6qoZecqKClq7mdo62clpmQpaOWjp6hm5men5GTlau2r6eZlJusqZeMlKaapa2jkZersqSgnqirsJmhopCZopegm5abl6GTnKmdlJCqmYfTk5q7dLHEgMOGfdWWm7h5iZGYjZeJjKeHeaK2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+ifox0h6t9vm5zvHSyg3V4gIptmohxbY2kdL1dd31bYXm8alpWW2l5XmlhZGZibXlvWVtZQ0FAcj9DRis1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy02QDmnmp+ivKKYscKwramqrLGoua+3xbK8s6+8sK7Bsq2mo5+koZ2ckaqlqrKktaetpKCWmqqZpqy5naOumZWhkKagk42co5+Zn5qQlpOvubCrlZejp6eUkJalnaStn5GgqKufnJ+ppLKeoqSOp6KUoZqcl5akmI+woJKVqZ+FkJm2gJGSjbiVeIKTm7V3bmxuc295j4SOiXOewbu8mXqBsqhwgHSRuYN8hoaLh417ioaNl3yku7m9nHV5s6N1dpd1dLB1mJ5mhmmNtnRycXe2jF5/eX2IZ4N5bXlii6xwdIV/WFunakRkWVRmX2NdY1FmZnFtdUJNUE1EO1pMP0ozPDAgOD47LjM9QTk5Pz07PEM2QlNZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PjcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVzgqT11dPSs7VlYnPTo8pp2hob+mlrPCtKuqqK2rqruvscawtrSvuKe1ua6rpKKnn6CdmZSspK2qprWoqJ+clqCjnqylvqehqpeVnJGim5KPoaiilJ6XkpiUsrW2rZidpKSii5KSppylq52WqaWmnJuiqaemo6ihkqyel6Kel5eYnZ6PsKmTnKeij2t+aZyoeYlzfpuOdXplh3u+v8C6bpKCcZWFX3JqWl2aiWFkh46Va2B/lWNtnHZilGuAmpWUZV5fY3GbiWhzjXyGlGZqfnF0eX59Ylt4dIFoUFxug3x7impYbHmBcklKb4VwTnNNRVdcZmFMW1dmY15PWm12anJST0RFTTxISTxNPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMTs6LjAtNzY9NSYiLyoyLCU7OC03SVJfSSdTX1Y0KVBeTCgzPltPJz8yPqifqKHBpJq0urajrKaup6i1sqzIrbG0rbakvrGzp6Gkqp2jnJqarKeupKW1qqSbmJaim6atqb+oqaWVlJuWoJqTmKWpqJKfkI+YnLCyv6ybp52noomTkaqbqKScnKyfo5qbo6esop+qopqum5WmoJaVnZ+dl7GlmaKomZyRnpyjpZqno5qdmpqakJaCaG59cXaRl5SRg4m0qY2FmJWOioyYl4eTlYqDk5OQiI2RlJmTmZeaoKGam5SgnI6CeqSFbGl7kH2AdYmLgnKCeHl2dYqAe4lqc4F0g3Vkd312a3B6bWBjW29nTFhZZWpfV1lwem9uZlNPRlI5T1pOUk8oKztKQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7NDg5LDI7ODEwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5UMTBUXjorPThdSyw8LUCyoLOiv6KksbG3oKmms6elsLWqyayusqa1psCotKGepaacpZaWoKunrKOjt6ygmZeWoJetqqbBn6yklpKcl56YlJSinp6jqJKQmainssOwmqudqp6Pl5apnqucnqGtmKGbnaKlr6WhpKieq5iXpp2ZmqGenpywoZ2ip5WYlJmUoaOWpJ+YoY6WlIuKjY+XrY97lZuCkYCJqaiFgJiWioSOn4h7g5CGhZqRh4aJlY6bl46QmJ6jlpmSkJ2Nfo1lobOuhImEd3uQin13eXpvZ3mQgYCJa3WBeYhyaXN/eXWDh4JrdGN4Zl9oZGNkZmpYa3twamtcU0xQRF9VRkA/Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1RWVlhaXF9hY2FfXV1dXl1YVkpLTEJJT01SSjs8Ojc4Ni8zOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAtKC5r76sq62xsqCqprKtoqyzsMaxrK2ks6+8pLScoKeioZ2Zl6imqaakpbO1npWVnZmZr6auvqCso5KSnpqZlJKWoZyXqZ2FnamsorTHs5+ppKqWlpiap56pnKClq5Sfn52gqq6opKOroaybn5+gmKWenJ+csKSZn6iTmJidkqWamamfm5dmg5J8ZX6Pmo9jeIxsaGp6kKOra2SZl35nhYplZWloeo2hjmtojJeRondraouYop+Yc2xueoSMhnlYZV2Fgl5si4qCdltoc3d3kYCHgm54gnh/c215hHN3iIiOg3tphVhdanNkXXOIaWt8cW1jXVFOV0lkWEBKMz1GNz9GRDcxPD0/QUM7O0RHSEhJTE5PUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSS42Wk82KUVZL0RPMVlCOz8uPaWfury5r6uzsKulqK2usKeurbC9squopa2wsJ+tmKCknqKamqesnKyjpqips66elqOQoq+mtrmlrqOQj5qhmZOSm6CYmaaWe6Wsoqi0w7iloqevn56VnqOeo52kqqiSn6GeoKqvqamjqp6nm6aep6CslqGcpbGkmJyrlqGfm5OlmJ+rmZ5+voOIcrRyhZ6FrWh3ucS4cZKho3ummJhzqoJ8y8DAu3GKo4eCnnyWmIiewL2Clp2djZzBwHuBepGMmsK/fWulsm+MgW/Ken+bd5GDjoB2eYF/eXF7gIZweIWMk3lsdpFiZV54ZF9lgWJedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQUA/PTY0NjgyNjYqJiUjKSomLisqKTEwHzkqIz5IW0wqI0NQLyNGWzNQWS9VQUI7LziWo7jDtLCvv6mplKOvqbCvraaytrCrpqelsaugq5iboqCcm6qnop2roqWppaW0pJ6jk6aurLi0p6+jkpKZnaWSkaChl5ugnYemq6Srrb/AsaGprqmXkp+eopmjpKqjk6Chnp2srqerpqOhpZ+kpJytqZGkm6mtqpydq52topeYppeipJidf86UeXqlgXqWlptfrY9djqiAoKF8p5WadKuCgK9eZIypeqiHhZ90l5KIs2OCq4agjY2zaoSuc3yWh7hhgq1Zo81ukHV723t/mXF+iJJ1f2V7iHZ2bH2Hbn2FkJF+bICNX3Bqb2ZgX3hkXHFoamNmYFJUU1deSk9DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NDc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1s6TC0hUEBGNC4xrcLAwLW0sLeYnpGjqqmttKumsq2trKSsprCqoaebmqaYnKKvn6GfqKejpqGfsKybnpamrq2wq6isoJSSm5+lk5CfpZedqKOerqSrsKi/xrOoqbGulpKenKKXoaqqn5Whnp2cra6mqaibpqajoKqSrLOWpaKqqp6kp6eisaKTm6eboZuVlJGXoHCFjJh1hKiHcbB8nXKsfaCfgaWPnnergn2tf5xyrX6rh4afdpiSe3yXfqqIoYuRi5x+q3qIko6ggHqtVpzEeo9vksF9gZVtdXCMbWZ3ZYZvYXducm6IipGPg2yPjmRtc3VvYGZtZF9vaGpuZmNXU1xgWlJSQzlJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MjQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi08KD0xKTNWQEYhHEc7QzEtK6/UxseytJ+do46joqKtrravqbGnqauorqurpqKjnZqjlp+mq5+ipqCoqKKfnrCsmJuXqKivrKinqZ6XlZqjopKUoa2bnaejrqyjrLWpuc2yraaurJaVnJ2imZ+urJ2WoZmenqmwp6mpmqqoo6Grm6+xoqisr6aZpquqq7Kkk5ikppuVkoWkaqR1iXqpdXqycYKliZiMcIefmoekX2BSq4R/roKbda6Cp4aGn3qZl4V7ZoCjiaSYhoGjfal/gZSGrl58qFWdopKBeqOfgHvDr8WMc6+0s7lxYqmvwnRojIyXjoFsmJFubHh4d25rZmRkcXBme2ljXFZfaVhYVExMUUxDQ0FCO0NBQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXWwKGZq6ihr6KfsLWwr6mto6inqqurqaSmn5uln52mp6aknayaoquhpJ+vop6bk6qktrCuoKmbnZeVpqOQmqKon6CmnLCmo6ixrLbIsrWprKqVkZydopmgpbSdmqGUnJ+mqqqirZmqqKGhqaKzraKqs7KinKqosLC3pZSXpKiZnZJ8qmyehId1q3l8sG6CpIuIn5aVnpWB0re0uMmAgbJeX5Spg6SHh6B6mJWZeKrJc5mjlKipkJOajH6aiZrGxndloYKlc4GfjoJ9r15vtWOxdUujhm2nR4KTZI6PnJJ7b5WQfW55dHx6bVtlanJxZoFqXmFYY21cXllJTExLRURCQj1BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE5UUR0cOzxGMiwkqKTBxrmtqbOurKWinbK5rKqhppuopqusqaagpqSYq6OfrqydpqGsmp+ppZ2ntaCjmJOoq7ayrJumnKCWkKatkpqcp6OgqqatoaOnqbC0wrGyqq2olImYnaWboqSupZehlZmcpaWpma6crKelnqujt6ygsrmwnpyvqLS0tKaWmKmkm6GPgp1OeJqBf596hKN8gqSEhqaenJ6UhLh7fHm5gn/MxsO2d5uhkIuffpqWl4l2n5eKpJikqH6whZuEnoSsfZmUYaVso3CPhZCBfZeEcqxgpHJxgJpgvH1SVXWOkaOWe3yRjodyeXKDfXBcbG53cmqBb1pjX2huYmRdTExRU0FIR0ZJOTlLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFdZWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9URjxFMjpQW1QcGzY/RywtIIyHmamspKu5q6+gm6Gss7Smn6GVpq+urqmmnaWlmqOnobKuoqmnsqCZqKSUorWjpJaXoqq1uaSco52jk5Chspmem6aloaKurJykqKK1scOxraqtqpGHkZynnaOknKWXnpiZmaWjp5itoaykpZeupbusobe3rp6etbO5srSomZ+xoqWfh4/RtcO3eYeOhZGTj4CmeJSid4ugkoWlgotxq4aFtG5yaZmjnJWJn3yXmYaHkHOugqWboo2mi5OciJSQmm1wslylc5N6nGyZf3uZfm6pYaJxcX+fYnOyuGh3j5OkmH2Ki5CIdnt4jYFsaHdpeHNugHVdZGRtbWVoYEpaV1g8SEY/VDNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgjKSWSco2Krr+/vLu1npeopK22oaKZlaOpp66pq5mloZ6moaC1p6Kpp7CjlKujjqStpJ6RmpqqtLSknaacqZKUl66goJ6mpJynnLSZoaqjtavCr6mrqaKMhI+coqCmo5WZmpyYm5imo6WXqaasoaSbrKa9rJW+sK2fo7C0u6y1qJ2qs6WpmXuokX18sHeKgaSliJxtsm+gh617oY+DqJaZgKyJha6FoJSooaKXhZ+AmZWAe5J+q4CdmpaLqnidoI+Ik5J/ea9do4F8pqdknoB8l3Rrrl2la3GFmV1gW4ygbZSQpZiBk4uTiXh5gZZ+amx9Yn10bYB6YGdlcG5nZ2hCWV9bPUpTMlQ4QkJDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaV1NQT05JNzA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNTVldXWFZVVlFIRklKIygovJKahKnGw7bBtJ+araCuuKWjjpuko6Cvrqmfo56drZieuaCiq6CvqpqtoJCqqaWWiZqQrrCspqCom62YmY+toqGdpaGapZytmKCopbaov66kqaOfi4CNm5ufpp6SlJmZk5qapKOjmKeqqqKjnqmovqSXw6yro6Kss7ussKiitbGqrJl2r36QipyFh326rYmYZLCMZZWtfaGPg6eWm4GtioSwhaaZo6GikYWgW2xqgbNgf617e4KAsmxnbpmXi4ixW320W6SDa8iiZZ+Be7xZdrVasn1Sr4B6rFiAoW2XjqeaipaPk5R5eI2bfGNzfGGDeHOAfGFpZnBtZmVlT1VjXEFUXj1IKD45PTQhISwkHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE5KR0M1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7G3vbu0wbOjnK2mpbapoIuZoJ+ds7GonqKfnbSYoLOoqquesK2eq5qUrqiijoibjq+sqaejqJmvk5qPqZqhnqWfmqSjpZmeo6myqLyvpaienY58ipqWoaCZkJGZmpGZl6ien5enrKWkpKKkqbueoManpamirLW3rq+ooL2vrq6XgamSo66Om4CGpJeYkIGAuMO6g46dk4SnmJ2CrIqCr4mnnJqlq5F+1b3CqmKjv718fqOCg9e6t7WFk5KCnr2+hGqjgW+rhG6df3qysceDa6uwvax4d6K+u3SAlY2lm4+ZjpSad4CQmXlifHpjjGd4gXtga2VramFQYltTaVxAVGBCTCk8OjUvHx8kHiUyIB0kKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbS0sb+6sr2zop2upqWzpp2MmKW/qbawp6G/pqaxm56xnLmon62upaeUk6+sl4yDmpGupqOsoqWcqqCYi6OTpp6nnJqhqKKZnqCsrKm4raejmpeTe4eYkqabk4+RmJeOmJSomZ6WqKeeqaahoqu7nqnFo6Cvo6u0tauxq6K8qbCwm3R2qqS2hWWJn3BnrI+Kj21vd6SQmqCBdbCalnCQjXKWqKObmK6kcmxtbGWKeG5tgplxgHppcGlmiZaVl3FoaYWGZ3CGZF2KY2lvWV1nfnimYGJyj5JvZmSAjZOOoZeWl46Um3uGjpR0ZYZ3Z4xqeH54ZGxjZmxiS2VXSmtZOlBkRFAnSjorIxwgGiIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWttKq7urKzqqmirp6ks6qYkr2xw8e9tKmev6uso6Cmq5+6o6StrK2ljZWtqpCMhZWXrZ+lqqKfpKSgkYulkqeZqZmWo6qglpylpqevuaqrmpuTknuDlY2ml46RkZeTjJeVppOdlqehmbCmnaKsuaCwwqiks6assbKrr62puqWwuZeLoamltp2JlqKYhqmakJSdk6qzmZujrKG0l6OhnqGinaGkoZWrp4ySk4yHkpyclJCZk5iQjpWEf6Sal5WOi5OSio+GhH5ni4B0g3Z0h4xxp218lZKUk4GBj4+PjpyTn5SWlJ6AhpOLcGeOdm6Jd3V8eWlrZGRvY1VgWEBpWkdiYE5YK0U9KyYhNjQwLx8cISUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5UUUpFQz45PUBBU1hbXFlXWFhYWFhZWFhaWltcXl9fYF5eXl9fYGBgX1lZYKWWqamltriurqKwpa2foLaxkI6qxLvEubepoaWdm6WdsKijtqedqbWmp5CXrKOLiImPnKeWrKSimqien5OVo5eomqmZlKehpJCap5mhtLmnqpiakI17gJOMoZSKlJGVj46Sl6SOnZinnpu1o52mrLeor8Kuo7ensK+xrqqrtbuisb6akqakprWikp2mno2pn42Sn6OssJuhpLKqsZmloZ2kqp6enZyXrJ2SmqKblJCWqpmNmJiWkJaekYegnZWUhZKMkI2Vi4F+Zo2HdYd2eYiEdJxqh5GVlZKKfYyWkpKXkaCRm5WegoaWhXhxlHJ4iX5xe35pbmRfcGlgW19ZbWJQYGRPWTlHRkU9Mjw9OC8qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlaSno7G0rK6jqaetoKi1qpCPnKOyuq2qq6GimXqcorCkpbGplpu4pqOTl6mcjoaKiZuikK6fpJeooKGSl5mbrouqlpComaiMmKiOnri2o6WYm42JeYCSjJuTipWRk4+MkZahi5ycp52et6N/g6+1orCvdKS+o7KgeHuhrLO9lneupaCKgKp+ZFxidp+OpJ2Dl35uk7Oco6ivq6Rln6CUdHqal3GAmamYbICjqIplnKWbkJeYlouSm5CEnZqQlIOSh46OkomFd2uQiHaHcXyGgYBhaYmLlZOMW3aVkWdoj4xxeqOXlmR3l4aAdpdogomCbnl+anBlX3Zva2tnXGVjYWFvUlo9TU1OUkY9QFRCOTEvHh8mNDozMDY2Nzg8Oz5AQUJGSEJHRklLTFRVVVldYGhnZ1hRSTxERzw5VlJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqaWpraSnraWSlqq0rrGlmammqpdzi52vn6irp5OWuKCgjpuknpB+iIiano2smqSVqKKejpeRnoV0rpCJppqokZajiJu5s6egmJmLiXV2ko2Wk4qTkZCTi4+Tn42ZnqWYm7KWgIybtZ20jJKPvaehfqeie6SwuYKOj6efhIuFj7Gpr4yJlqKZeYGLrIacnaKoq6mIlYeZd6WbeoecgZengoF7nbJ6ioafl5mUmJaBkJaWhJmaY3mHkISNj5KLg25xkIh6gXGAgYZ/hnSHhZaSeJZok3SgmnR7mYKemoSYfZGJgYKYaYyMhGp4enBwZ2R3bWlsalxkaWllcltcSFRMUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dSWFpYW2FhaGZZUUg5REs8PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2Yo5+mrq6rqKygqLCnp6qlmZStxbyvoJWlqLSdj4Odq5ymoqCNkL6emY2fmqGQfIWOmZiIrJ2jlqGhko6UiYaAkaiOh6Kco5OWnYaeubGnnZqTj4VwdZCJlJCKlI+Om4uOkZ2QlZ6jlJ2siJ+0ibSarovKiKuvibeFjbCDsrCFqY6nmI2dfKiPcnt3m46mlmiVpHm0i5+fp6mTmcKCf6uImKFxnoCapX2XhZWygKF9oJOfj5iXgI6Tm4mYkot8hZOGjZSTiYNtc5KGgHtyhoGEfYV1hoKYgY/FZoCph4+iap2BnpeAmYCKi4OImG+NkoRnd3R7dmdodXBnaGteYm5sZmxYZkZcUUwyRTQ2TWFjNyY0PERHRDo2MzY1ODs4Pj09PkJMP05JSktDUFpdXFdiXmpsXFFFPUtNQEpkWF1jZ2hnYmJiYmNjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS5saqrp5qUnqKkqqKVpKm2oq9/oKacpZ6diZS9mZONoJGdj3mDlpaRiKuZnJuaooWPjHebnI6gkYiepJuVmJeGorispZmbjY1/Ym2Pi5OQjY+MjJeLj5GejZKeoJigqH6hp4etnaCWrpCgnp2RhoKgjayxiKSOq5qMmn6idYCYk2uBq3RNq3iHjZ2Sm6mpgqqrfoShe3qnaZ5/kmxnl4aYtomefm5gY1iDl3+Me2Rni3OZfXmWa118l25fU3GFXGBseYNgWWWCfoSBmHGnqmuDo25ypXCfgpxnZJ5sWmyIemVZX4J+YVdQb3ZlbXRxampuXmpvbGtoV2dOXVhFOUA0R0ReazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpbXV9XXl9idmBNRTpNT01UYlxbZmdpaWJiZGFkZGJhYmBiZGNhYmprZGJkZGdkYmdlYWNomJadoLmgqqOmrJGhtryrr6KZlp+gpaurn5yttKKnkaCfn6abmY2YtJmQi56MlYt1gZSRjYqmlpaYn55/k4WGrKOHnJGKmKmYmZqRh6WwpqKVmYiJgGluiIeLjo6Ji4yRi4+RoIuSnZ+boaV/k4GPo6GUoHeclpCng6KogIarr4aleot9hJp9onBykoeWe56MeW2Hm4uZkZypnI+HnXyConN2pmaefnekXph7fZNzom6Yt7S6c5KHgYC2qGSBxrh7cJW2jHGAm6RjdKyrYH1qnbN+bn2Hg4+Ci5dxgKNsc6RznoJ9o16cmbOWb3uXnrN0cluesoJpYm9zdXFoblhra3JyZFtoXWJMRD1ENVFBWnEyPFJGX0pTPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWVhgYHxkSUM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mauck6COpbi2ra6gmqGboqOkq5uasayrkpegmKCkmZqUnqubi4iSeIuFcICWjYqPoZCTlJ2XfZGKjqigh5iPipKik5uajIqop6Sej5aHhH5re4d+fY+Ng4uPj4mOk56BlZufnKCfi4l3nJiijaByoouIqYicp5GXqayArox9eqCZeaOTeIBzl4iMnH2Wn4abjpmcp4ejZKF9iZaQm4xsnmiajW6amXuAiqd9cmdzqoOdgnOqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxep3Z2iYqAnWiadYeTkpiOf55tmZBqpplcqH53u2p9qVqOhF2zZ1xucXh3a2lbcGl3eGFfZldiQlBFTzdWQlJuNEpaWV5OWkRAMTUxOzs3SD86Q0dVP1hSWF0+RGJdVmBRYWN9akVCOU5bXllkZlhmZ21tYmJlX2FhX19gYGVjXmJkb3FfZGVla2RjaWhna2mVnImqtpuoiWOVnKy6srCsnaabmqefnayZnbCnq52Xopmhn5mWlqCjmYaJjWmIgHF7l4iMlpeEkpSYj3qKhJajnImVkIaLnZGcm4iPqKKfmoyRioCAaYGGeX+WjHuIjY6HjpWZfpKhnqCik5hyaJ+KoI+McJKMgqmImaCkqaKpfbCtpKK4l3ajs6Kjf4iUeJ16q5p+oo+enJiJmHKhfYWNsLV9a5qRoXh+mLSjo6uohJh7mnycmn5zqlpdb3uXi3ieYkx/e3uFZHqYQk2fWaJqcnyOboGKhJl2m3mHibGzf36akqZ0fp1tcXyUb5lyaaNdlXZIZWNgc3B9fW5mX2todXtiY2BRXldcVFZAWUVRZ0VSVlxhWF9JRD1COEBBOklFOExFWEFWUVpWREZhXFpgS2BtfXJFQzxVXmJaZWpWaGhtb2JmZl5hYFxdXmBoYl9lZHZsXmVnZmxkZWxoaGtplJ2Bsa6ZhFNfoae0urOzqZqii5qpm5ynkqCro6Cnj56dnJqZlZihnZaHh4l3hYFueZWFkJqLfZGTlohygImSoJtykpCBiJmUn5qEjqibmZWKiop8hGyEhXGBoYx4hY2Ih5GXk3uRop+eo4iuhn21hI+enXumlnqpgpaekYuinn6naHdtfplzoHNxfJ2FmG+Tgq59o4Onn5uBpHBeqWh1o2NvpWGc0498epl4cnNjooWPfqJyoo51a4+zi2CCmIpzqrKnvH93g21/v6aqtF6cb35yl2+Bc6JyXqRndKZgaKZsmtOYeoKbbnd5l2ubeXaXcmyppWdfZHlwf4RrZ2ZjbXV3Zl9hUltmUFFhSFdJVF9XU1tkaltlUUZDS0xKS0JKRThQQFBNWFNYT1JRYGVlaVJkeHl3SkZFY11lWmhqU2loam9jamZgY19cXV1faGJhaGV8ZF5kZ2RrZGpsZmhsaJibf7CsVFxLfqmvsrWws6OcmISXpqCgo4ykp5+XqImZl5iTmZORoJeOiIV7cH2EaH2Pg5OagXeRjo+JcH+Hj5OSbJiUfImRkqOVg46qmpOSioWJeYR3iIBugZ6Gd4CShYeYoJZ5k6KjmqCJs6Gitot6rKekrqVwqYCbkYaBnZN9pICimYaYcZ6Eoq2uiZeLgIykjZWDr6KUdrW2tcmidJSLgp5hnZepbXmVh5+adaGHd6B9kJaKgW9MZqOScJqIc6V7eXRig4JsfqBscmRgnHJ/dJdre2q0tbTGpnOYfnqcapqaq3SBmm1zd5dpmXl0mHFQRH2zXmp1aniHZmtnYnR0cG1WXVNZaE9SaElVTFhSVlxna25VZ1dNSkFKTUpISk5BUUpQZGNpbWV0cnN+eHtudYl7e1RRT21eaFtraVJqaGlsZ21mY2VfXFxcX2liZGhre19dZGdjamZubWVpbGWinImvp4VmP5Shsqyvr7Wioo9/lqeioaOLpKacm6WBmpeWjZeQj5uTjoiDeWp5hmWDjH6Wn3l1j4iMgmmEhZKDjIWdjXqMipWlkoKXqZeMkYuAiXqAfYt5cI+ghnmBlIaIlZ6Vf5Olp5yWloRnbnicbKJkfHGleJyYcGingpiNfKV6oJaDlnKfdoCJlJWPuW6QiqJifZmiloluc2qra3WgbW+mYJtpi5BploealXWigH2aX4uFjHVviGJooWWef2mbdXBkZ4iCbnOiWl9bZKFuXYmMcHt/dHJkpW54omRmp2iXcouYbqFvUoiPbqBeZKdUi11UmG1tcmpxgW1waGt4c2tvUVhWVmZZU21JWE9cSFhoaHNqWWtWUVJFVlxMWFJhVWhqXnd1enxwfHxygnt/c3aNgIN2XlFzYWdicWdQa2hoa2xvaGRnX11dXWBqYmlpdnVdXGNoY2ppcmxma21jnaWZpnpldG2Lp66lqrGxpp+Lf5aqnJ2ki6GhmaGhgJWYk42aj4uXkI6Le4ZxgIhoi4p8l5pzdIl9kHxlg4eViomWmYJ8iIaWppCBoquQhZCKgYp9gICOc2mPpYR9hZOMh5efjoeSqqaeiaZ4lpx+pYmWjLKZnpGDr5efpXmXiXqpdKaPhJpupaKMkoSMg7xufaWvgoeGh5SXnaF9pntyqJSglmeefm+sY5aKlZJ3qGypooGJdoeCd6uRpohrkbBrdrOMqWyLhm5un56RlWJ/q4uqd4B/jqefd599haSVnaBpmod1rGaerYy2c3a+jKSTWYOmjathdXFzb3t0cWJqfm5obFNWWlZhYFxqTFxSXUldbG12YFtxWVtgWmdzZW5vcWNxdGB3en55cnmDcoN+gXt7jIGCgHZieWRkbnNkUmxnZ29tcmlmaWFfXlxhamJsbHpvXFxiaWFtaXdtZ2xuYpWmqp2BgJ6klqqqnqinrqOZiIGWqpmdo4mapJyonYSLmo+FnJGFko2MjHSFeoiDb42EfZeTc3WGcpGDbn+LkoaGlI99e4KFl6WNf6WljYCNiYSUdYOHkm9si6iAgouTjYibnoiLk6qjoJCAdJSXiH6BeZSvpH+CnHGPhnmSjIWAe3KnjHF9fXqXlpuEjXh7fn6IlJWTi3eRmaChhHt+iWuMhVt5eXN5cGlufpKJcX90gY+Uk3GFg4JljX9fgYCMeHZ0lHVve29uiW6Ehl93aXiOZoKDho+qnH90fZdqiYhvf3V8hHVtbGaMc3d7l3eEW2pYeY9obndycW93eG9dbIZtaWdWWl9XXGRrZFVhVV5RX293eWtqd2Vqamp1fHBxdHNhb3Vic3uBeHV6gXV/gH+BeYuFgn17bX9sZHluXlduZ2h1a3hqaWlkXGBaY2llbHF1blpbYmtka2t5bWhsb2GOlbqpp4uhopumpJmknauioIODlqqRnaCImaaaqJiDgZuLfpaUh46KiYxygnyPfX6PhHqXjnRyhHCVhnt9kouGhpCFeH6AhpijjHunoYuFj4+ElYKGjph3cYSqhY2RnI+Hnp2GipqooKCrg4mOlZt/foqXraiQk6eQeHGek4N7k3B/qYZwfZVxam98gZ+Lf5KOi2huXYSMjJycoI9zlYyIcXRrgnZ0gFlyboaQgX1+i2ldaWN6hYOIgF9peHucfIONg3aBh4NpeYyIa2Jxc4N3X3KNgoqQqJaHZ42Pg253i4Jvg4t3bmRmY3mCepVaXGlmbnZbenh3dG1zcoJmXG2Ka2tiWlldWVhrcVteYFleXWZyfXp0b3Rjamppe3xyend0ZG10aGx7fnV6fHt5eX+Af3CGioR7fXN+enJ/aFRccmlsdnB1Z2tnZF1hWWpoa2pxcm1XW2VubGdyeW9oam1gjIyrsaGQo6Gan56Ynpmpo6F9gparjJ6Uh5qhkKSUf3uYhHySmYiIhoaKcn2Ai3aFi4GElopyb4BymYeEfpKDhIaKgXqAhIuan4+CpqCHeI2XiJWLi5yXhIN6rIGQl5mTiZ2choehq5+ioqOLiJObnaOZlqqiqKehk5yJmJB8eY+Phah+fpKRkpOcsaWalJ2QjbGSmISmjIyWnKCKkZyDiZKKa3yOdndlgoaQinyJnYSHi4+HiICFhJB3fHt1m6OJiIufi4aVf36NgoF2cXSGhX94iYiLkaeRhIeOiIOMkIt7hYmHjYB1a4GDe3mZaXJoYHSKcH16d3ZvdnOBXV1vh2duX19aW1xSZ3FVY1tbYWxodHt8cm5wZGppaH97bXh+cGhvcGxmgHtygYB3f31/hHttg4yGfHp4fH56g3hOZHZqc25xe2VrZWJiYFtzZnBmcnFsVV1sdG1oeHpwZ2lrZY2InrqflqKhmJWZmJSYpKCde3+YqY2ejIWfnIqdlnx4lIJ7jpmJhoOEh214gYBygId9h5OEbWt+epeHhIOQfoCGhIZ9h4ONm52RhqmegnGKj4WSkYuckX2NeqmDjZGXlY6cloWFm6agopqdhoSTmpmZkJmmoKaenpCXgpOLeH2Ij4WmfHyPkJGFmKqgnJOcj42qjZGAno2JlJqfg4+Yf4eOg3B4hnF0YX6Ej4Z1jJiAgo6ChoR+hYSVbnl2dZSjjI6Gm4WFjnWAi319c3N8iYR7eY2PhZOokIeEj4KDiomJdYSGh4l7bmp9f3ttaGtsZ155fmd8e3Z0dXV6d1xgcH1tdWBjWlteUWZtU2VaXWFraXV6fnBrbWNraWeAf2tyf2tqc254boN5boaAdoKAfYV2coKNh357enyAe4KLYGl7a3VoaYNlamNgaVtjdWhvYnVta1RicXllb3l6cmVqbW2Lip+4mqGkn5ORlpeLmp+enXt3nKWQm4mGpJSKmJl4eY2FfImRg4yCgoJse394coCEfImQfGtofYKXiYGIjnx+hoSHfI+Aj5ubkIemnH9wi4qMkoagoYqFjHynkYiPkpaTlpJ2jKOgoZ2Wmn+CkZqZk42aoqKkm5iRnH+PhnqBhY+IoYB+jI2PfJekoKCSmZCQpoyPgZySipOXnH6Tk36HjoF2dIJwdmB9gI6HcoqWfIeKcYx+goWGj2h4cnmNmZOQgJh/iYxzgoh9fXJ6fIyFe3uSjoSXppSMhpF8hYaHhXSBgoaGeWRxen54eXBsamZefXNofHV1c3xzf2peYHR2cHdkY1hdXlJqaFRkWF5haGp2eIFxZmtjbGhlf4BqbX1nbXBqfXeFemuLgXKBgX2BdHaCjIZ/fHqAgX1/j2pyg250aWKIaWxiX3FVdG9tbmB4aGxXanR2YnV6e3Fia295iY2fs5KlpZ2OkJiPhp2gmpx8daOfjZd/jKGKiJqVeHuGh36DiX6IgoF/cH56dHWChH2IkHdnY32Gl4uCio14fYCNg3mWgJWXlY2Vn5p9b4uBkJOGpZuHjImDppWEkoqVl5KRdpCdoaGYlJh6gI+Yl4+Xmp2knpmTlJx7kYeEeIaXjp5+goqOjHOXop6gkpiOj6KMi4OYmYSTlpp/mI18iY2Bd3J+bntkgHyLhnCGk4CPgWuHg4GAiYVmdm99iJOZjn6UeYyJfYCIfXxygHmKhnqFkoqMmaOXg4SMd4iEgoF2eoCHhHRfd3d8c313ZmtjYH5panZzdHV9cXxjY2FzbnVybWFZX11aa2RSYldfYGlsdXmGcGNqY2xmaHyDa2h0aGxvaH98gXhtj4ZxgIKCf3R8g4yBgH56goN+fJBtdYl0dG1limxqYWN1VoNpcG5geGdsYWp2cGZ5e3lxX3FshYWQna6Yp6iejo2Xh4Wfk5aYfXaom4mYeZaci4yYj3h7gIt9fIN7gIKBeHN4eXN9gIN/iIqAZF59i5WIfoWIdH1+in9+mISWk5aMo6CXfnGHe5ORiqaPjI6KkqCRg5GPk5eQioCOl6CbkpCSdIGOkpSJnZ2ep5mYjpWYdY+Qi22GmZCZe4eIkIlvl52aopOUio2ejIaBk51/k5KWh5qJfIqKgXpyemt1bHt/i35uhZKDk3dvgoR+fouAZXNqfYGXmIWAjnSRiYR6iH52eIF+h4F9hI6GjZWlkXmFgnSJh31/cnR/hoJsYHp0eXB8b2FuYmR7YW5vdnN3d3NzYXZgb2x1bm9dW15dXWpdT11XYmFobXN6iWtfamVqY2h3iG1mbGhpbGeAfHp3b4+Hc4CDhH10gYaJeoN9eoGEfX2OcnmLeXhubIdraF9qcmOHaHFvZXZnbWxhemhrfHt4cGF3bYuBmZqqoaSpnoqKkYaKnoqVl312rJeMlnyek5GWlIh2fXuKfHuAdnd/gG90c3pvhX2BgIl+fGFcfo+RhoCEhHN6gIZ6j5GHkZGbkqSak4F8gXyNipKjiI2KjZeajYWRmJOVjoiIi5KdlJGNjW6EkI+RiZ6ZoqGXl4mXknCLm4Vnh5qPlHqJhZCKcJaak6GSkoiLmYyCf5GefZKPk4yaj3uKhYd0c3ZrcW51fIt0boaRjpJxdIB8goKIfGVxbXp+m5R+hYp1kYuBdIl6b4F/goh9hY2Kho6Wqo57iH1+i4V3fXBuf4SCYmd3c3RuemJecGFqdF5wanp4eGxycGV5XW1sc21zWFpdX2FqWk9XV2RjZnFxf4hlXWloZ2JncY1uZGlnZWlngHp3dW+OhHOBgYN8dYKIhXiFfHeDhXqAind/i3t7cnmDampfcWlzf2txbm1xZ29rZXtibn95dnBrdneJf6OYoqihp5uIjIqBj5yGk5x0gKmUkY2GoIyVk5B/c3t2hXd4f3Jze4Vrcm95bYl2f4CGbnFbWX6SjYiAgYF2dYB/f6CGj4qRnJegk5Z3iX6AjIicnYmPhpKXloWIlJiPlouLjI2MnYuPkYRuiYuPkYqclqGcmJaGmIlshqWFZ4eeipF+jISMgXeTmJGdkZCIiZSNfn6QmHyRjZCOmpJ9i4CDb3ZwbG1vcHuGaXODjpiKcHeAdYKJg3lnc292gpuPfYqFe5WSeneKdXGKfIeNe4uHhYqPnKSJfIR2gYuAd3htaX+Bf1xxcnFvb3haXnBhb2peb2l8enBtbWptd2Bwb2txbVlYYGFhbVdRU1llZmJ1cISCYl1rbWRjZmuSbWBmZl9na4F0cXJwi4B0f4KAeXaAi4B5hn93h4Z2g4V7h4yAe3aKf2pxY31jhXxvcGx0amhubHZ3X3F+eXt0dXN/gn6llZqtn6eWhYyDfpaUg4+edImfk5KFipqMlY2LenJ3dIJwcoVzcXWIbG5sdW2Id4N9f21uVVGBq5SHgnmAdnKCeYKggpGBkpGXm5GZd5B6goySpJqTjoiVmJKDhpaYi5OLiI6PiJ6FkYt9c4uFiI+InJmfm5aVgJSAaYeeiWiHoYiShJGEinGDkZePmo6PjIuPjXd7k5B7jouNkpeNfIh8gWt3am5rbG16f2J5fo6WgXZ6gXeDjXx6aHVtdYiWjH+Jh3uUkXJ6hXF4jnuLjXuJfoSOkZ+fhn19eIGLfXdwaGuAgXded29ta3FyVV5vYnFhX21ueXBncGZmdHVocWxhd2VdVmVgYHJTUE5bZWRceHCIfF5caXFiYmVmkWlfZ2RbZ29+b2txc4p9dn2FgHV2f4x5e4aAeIiDc4aFfoyMhHx5lXhmcWuEYId+b29remBpbXR/dF90fHiGd3NzhXx5oZCasZyljoKKf4KZiICLnX6KmJKOhIiXjo6OhHZ0dnOAcG+Fc3Bxg29qaXVtgm59fG11c1JOgt/JktaTfG90g3WDn4KRdpSQmJuPmHuTcoWQn6GTk5CJkpuThX2VlYeMjYeSjYmcf46BeHqMf4iMipybnJuWlHqOd2mKk4ltiaSFk4iYg4ZjjJGYjZSJlouNiYtwepWJfI6Ji5ORinqFfH9tfGVzb2tsenlcgHmPjoB7fX5/ho57eml1a3SMkIqDhoZ9lo1sf39wgY2Ajol+hHuDkZabm4t9d3iCkHlzbGVvfoJraXRvZ2hzbVNebmRwWl9rcnlna2tiZ3hzb3FkX3dgYVZrX152T01LYGVjXHlxinRcW2V1YGFlZY5jYGZiWGlyc21rcXaLfHR5hoJ2d36Lc3+Gf3uJf3KJh4GRioh9fpl2ZXNufWWIf29wa4Baa255eXNgdnp7jXZyd4p3eZ+Mm6+boJCChXiIlH58iZyHhJ6QjoWMl4STjoeBdHdweXBuhG9tbn5yY2R4cHxuenxqaGxjpJrB3K7vonNrdYN1hKGFkW6Vj5SflJqBkXCFi6OXiY6VipCdlYOAlI+EiI+AkoqKl36He3V/iXiGhY6bmpeZj5B2i3dwiIqMfoylhZOKnYWGXouUl4mOiI6LioSJbHyXgn2IhYqRj4Z2hX5+a31jeHRqb3hzWIh6kYeFen9/gIWMfnpmdGqBi4+LhISAjJiGbIJ3b4mSg5GFf4J7gZGXk5mRdXR4ho12c3FmdHiBYXNtb2FodWZSYHBna1VebXR6YXJjYGl9cXJuW2NyYWNXblpcd01NTGNlYV12c4ptW1xkeF5gZGaEX2NjXllpcmtua3J3i31zd4SBeHh8iXGDhH19iHt0i4iIlYeMf3+Yc2h1cXltjHtudHCAV3B5dnlxZHZ4hoxpdoCKcoCdiJmnnKOShHxwjJR4eYqdg4SfjY58lY2AmYeEe3J3cHNqb4FraWx8dF5geHZ7cHR6Z2BlfOvatcnD3IlzbHOAdoqaiI1pl4+OnJSSgYhwhYigjoSKlYqMl5N8jZKIgoiPepGLho+CgHd4g4Ryh4KTm5aUmIaNdod/cYaDioibo4SVjZ+EiWGDlY+FiIaJjIeAh2h9lH99goWJjo6CcYZ+f3J3Z3ZyaXR3bFqMfZKChX2Ag4CEioJ2YnVtioKRjIN/gJOSfm6DbXqIkYiThX2CfoGTlJGXiW9yeoyGdWxwanF3f15zaG5caXVfUmRxaGZTX293dWBvYF1ognFyaldnaWNpWG1XW3VMSkxlZl5hcnOFaFtcZXleXmRnemFkX11Za25lbmp0d4p+c3KBfnt2eod0hYN8f4d3doqFj5iCjYJ7k3Zsd3Z5eJN1bnh6fVh5hXGAb2d4dpGCZHaGhXGKloaZoZuiioZzb5KLcnaOm32JmYiJe59/hJl/gXhxdG5vZHJ+aGZsd3dbX3h7enFxf2lhZ2F/1baOkad4bnF3e3GSkI2HapiNiJuRi4Z7aIeLmYaBkpCGhpeNe4yMgICJjXuQjX6JhXp1e4N7cYaAlZmOkpSCiXWEiHiEgIyVnqCHlpCgf4hhf5OHg4eDiY1/f4JmfZGAfn+CjI+Qf22DfIJ0a213dXR3dmtjjYGOf4R/fIR/hYh+cGB0coZ9kI6DfYCSinpxhGd7hYyIjYR8hX+BlZCRk4VvcHmLf3RtbmlqeHxhZ2lpWGt1WlJpcmliUGJyeW1iZV5aaoNuc2JcZ19lbV9uVFpvTkhOZmRcZm5ygGtaW2NzX1xjbHdkZV1dWmxsYm1qc3aGgHFvf3x9dHiGeIWDfICHdXmJgZKVfImGdomBcHh5e4STb217gHZeg390gW1penOUc2dyiH1ykpGEmp+boIaGdXWUfm12k5d9h5CDio2ZfIyadn52cW9samF0fGdiaXV5WmB3e3ltcX5lY2hoV52PX3Jzl7zEhHZxlIiQfnKWi4abkoyHcmqIj5aAe5SMgYSajHyKhXx7iYt/lIh1iYZ2d32BcnWGgZ6UhZSPg4NygIp2hXyKmp6Zh5WPnYGJZn2Tgn6Eg4mJcoF9Zn6MfHl/f4eLj31pgH2DdmZveXhzd3Nsa46FioGKgHiCgYWDf2tfc3l7fo6LhnyCkIF+c4JpeoSJjIaFeYR9gpmOkYx+bm17iH12c25nZnt1YltwYlducVNTbnNoYU5mdHlmYF5dWW+Ab3NZZWJdam5gcE9Za1FEU2dgWmpubXxuWVtebWNaYm93ZGdcXWBraWNsanN2gYNwbX98f3R1g3qDgnyBhXZ+iIGWkHiEi3SBiHJ5eX6NkG9ve4BxaYF4en5tbHt1lWtqeIR0bJONhZ+YoJmEiG59jHZqeJeOfoCJgpSXiXmPlm96c3BsaWRgc3poX2Vxelpgcnx5Z3F6YWVlj7Gyd0tiWqXa0JZxe5CKkHh9k4qEmJGMhW5rhZKRenmShoGEmIp8hn94d4mKhJaAb4uIcXV+emp5hYOlkISTjYN/b3+Ed4R5h52alYyUkZWFiHB7koJ8goOIg26Bd2iAhHhyf4CDiod8ZX1/hHVjcHOAaXlwb3WZjYaDinx2eICFeoFqXHJ/c4KJhop+h4p7iXKCbnKFiI+GhnOEeoKajo6EeG5vfoR/dnlkZ2l7cF5YdlpYcGxOV3FzZ2BLbHZ1YV5cWll0fXNvV2ddZmpyYG9OV2hSP1lmXlpwa2h6cVtaWWtlWmNxeV9oXF5lbGhla2lxd3+Ib2x/foB1b4J7gIJ/gn92gYWIl4pxgo1xe4Z8enmEk4x1anp/a29+dH99b3J7epNwb4F/eGeSi4OhmZySgoVmhoNvZ3mViH1+hIGYiYF8jYxpeHJra2ZfYG95bV9ib3hcZGuCemFxdl9lZdTqvYsyOj6Ljn9xeIWIjo12g5aMfpKNjH9tbIWNjHV8j3+FgZWIfIJ4bnaHhIOXd26IhWx1e3RmeYKDp4uCjouEfm6AdXeFeoiekY2Rk5OOi4d/e5KGd36DjIJrf3JogH54bXx8gYqDd2F5hIJyZHFofm51cXWCm4uAf4WAc3V+gXOBb1xuf3V5i4SLe4eBfYl5e3JtiYSRhYxzgnqAl4yLf3Rta3eAgHR0XGhndm9XVntSWXBkTFpycmVbSXF4b1xbW1lddH50aFliW2dmbmNpTVdmUT1eZVxddWVfdG9aWVRvZFlkcXlaaF1fZm1naWtpcHd9jm1pgoR+eW6AfHyBf4J6dYKBjZOEcICLbnd9gHt7iJOJf2h7fWpze3KGe3N3fn+MeniEfXxsjI2Em52WjICAbI19a2h+jYt6fn6Dk4J+fYqIa3VxZ2hiW2Jnc29fYWtzYGhwiHpic3ReY2SboI9uXDVar7V0aYCIfJKGdYWWhnOOiol2cGyFg4d1eYl4iXyTiHp+cmd1iX5+mG9xhn5odnluZnmHhKSHgIaMiX5uf3aAgn6NmoiDlZKZiouFiXyPiHB6fYR7aH5saoB7emp6d4KHgHJgdoF/cmRyZ3aCbXV7hpWRgXyCgW93enx1f21ZcIB3dYyDh3iIdoOJe3l0b4qBkYKGc39+f5SJiXpvbmpugoF0bl1nZHJwUFp6TVtvXE9ccm9kVUtzeGlXWVlaYXGAdGBdXWBnZGhpZk5aaE1AYGNbYHZhXHRsWFdTdGFaZG9yV2peYmhrZ21saHB3fJNsaISKfHxwf357gX+CeneAf4qLg3F7iG9xd4N/e4qNj4Nqfnttd3h2ind8eICCh3+Dfn56bYSMiJijjYSDenWLeGtsg4eQeH16gZGAgH6Kg3BycWNmXllmX29vX2BncGZqb4l0YXRvW2FkanZ7gL+cpqTIuHGFg3KSfHiGk4NzkIuHcXJvg3uDdHSHdIh3lIh5eXBjd4d6gJNpcoR2Z3d1Y2p8goidgX9/jo99c4B0hXqBkpCDepePlpCIgoh7iIhreHl+dGd6aGt/eXNpenaAg31oYHeHfmtqdGh7gGl2gYyRlH56fn5wfHZ8dH9iVnh+c3OLhYJ9hHGHinh5cXGEg46Af3p+fXaPhoN2aXFpbYiBcW9dZ2FxbUlkdUtdbVVUWnNuYlFPdHhhUlhYXWFvgnNbYV1oZWVka2RRW3BJQ2NgW2NwXlx2Z1VWVXdeW2VuaFZrXmFpZ2Vubmhwd3qTbWmIjHl9cnt+eYKBgXx2fYOIhoNwd4RybXeCgn6KjJN/cIB7d3l6gYt0g3h/gYGChHqAdW9+ioubnoh9hXp3hXtndIWMj3l+f3uIhYN2j4BncG5fZFxYZVltcmFgYHBsa2iJbmF0aVleZG6Ad6naqseGh7JxiXdvjHV7ho6AepKJf3RzdH53gHBxf22EdJSGeHVrYHqCeYmPZnGEcGd2blttfICQk3+AeZGTfnl8boh3gpKMhXWXi5KPh4WGe3+EbHR2fm1ndmRte3VtaXd2f398YWJ4hXpodXVifXtndYaOjZV7dIB2cYB7fW2AWld1f3B2hYh/gXptiYZ0emx2gYSFf3x+eXx0i4J+c2h0ZW6Lg2xzWmledGRHbW1LWmFXVlZ3bWJQUnR2WFBWWF5hcYRvXGBjbWRkXm9jVV5yRkJlX11maF1bemJRVVx1W1pna2FWal9gbmVma3FocHZ4jnRrjo11fnZ4fneBg4F7c32DiIeDb3KAdHF1foWCiY6Ke3eAeIN7fIWHeId8fYF+hIB7fnN2eYyOoI2Jeol2dIN4Xn2FmIt4hoN0hYaEd4l6Ym5tXGJbW2FWaXNjYFtnbm9mh3FhcWZXXWNsf3zKzoe5oWptbYpscYRxfIOJfnuRhHl4c3l1dXtqbHZjhHWSgndvZl59gnqLimVygmtqcWNYbXqFm4iCgXOXlHh/fW+KcoSLjIhzmI+RiYaLg3t5fXBwb3xmaHFibXhxamtxeH18el1leYB3aXZ4ZoJ3Z3SHjI6UfXKHam9+gXlufV1Zc39udYGLfIJvcIqAcXdpeICCgIJ3fnN7dYd9e3Nnc2Fui4FrclhqXnZbR21qTFZUXlNVe2thT1R1clBRVFdeYnSFaV1gbGpmY1luYVlkcEdAZ1xgZl5dVnteT1VkcFpbamhdV2hgXnJma2dxZ3Bzd4Z4bpWKdH96eH55g4eAdXJ/hoWOg3Bwe3h2dXqGhYeMhnp8f3SLfn2GhISHf35+fYd/fHh2eHiRk59/jHyLbXV/eGSChpWFc5GKb4WFgXqDdGNuallfW1xdVGdyZGBYZHFyZoFzYmtlV1tgan93vq57oLZuYnOGaHN7cXmBhHt+jH53d3J2b3t2ZWpvYId1joFzamJef3h5i4RmcX9oa2taVm93iaOBhH9xmZNygXl2hG+Cg5GIdJaJjYiFiYV9eHRxbmh4X2psX212amdqa3l3enZaZ318eGVyfm6EdGV1hY2Gln9wjGdreoR1bnViXXF9bHV9jHyCZnaHfW5xaXZ/eX+Ac35te3yCe3lxZmxibYl9bG5Xal92VUppak5RTmhNWHtoYU5VdmtMUVRVX2Z1g2ZeYXFoZ2JXaV1cbGhKRGpZYWRXWVV5WU1WbWpZXWtkXFllY150ZmxkcWdycHWBeHCZhXZ/fnd/fIWHfXVzgoiAlYNuc3l7enNyhYeJiIN5gX51j358hIqOhIKEe36Lg3t2e3d3mp2XeoqChml2fXtsg4SSf3GOgXCFgn6Bf3BmbGdYXVtcW1NkcGReV2JydWl1cGVlYldcXGiAcG9ygHOJZGR4fml0dXNygYN3gIR5dnN1bmt6cWJna2eGdI2DbmZdX31we4l/aW15Z2pkVVdyb42mfIR7dpaRdH1zfXtvfXyRhniafYiGg4aDfXVvcWxndFxsZ15sdGRnZWl6b3tyWWeAdnVocIF4gnZid4WLfJSBb4xqbXuCcWdzZmFuemdzeIt8fmJ3g3dqbHJ2e3F7enR+Z39/gHl3b2RmYm6FfGxrVmlib1JKaGpPS05vR157ZmFNVXRjSk5TV2Fqdn5lXWdzaWZgVmNXY3BdTEtqWGNhVVRVc1ZMWHVkWl5rYFxaY2VfdmdtYnBpc29yf3V0mYJ3f4B3f3+GhXp9dIKEfpeFbnN0fHp0cYSFj4GAeot2dJB/fIGVjoCFhH1+jIZ7foB2e6OlinmIhoRrdXx6dYOBi3puhHN5hH2Bg3VuamhlVl1bWlpTYm1kW1hhc3tpaG1pYGJXX1tqgGprcIBna2BoeXhqc3RzbYOAen98dXVuemhqeWpfZW5ogXaQhGdlWGJ3an6He29qcGdmXVVYb2eOqHeBenyRjnl2cX9wdHd6kIF5lnWGg4CFiHZqcXVnZ25bbGNdbXJfZ2FqeGh7bVtugnJ0am+Bfnp3YXeFhHiPhXOIcm95gHJjcWlccXhkcnSJfHljdIBxaGp6dXJteXh2eWSEfH95d3FkZGNufH1ra1VoYWVSSmxnT0dRa0VheGdhTVNxXUpNVFpla3Z6ZV9tcWlkXVZgVm5uV0tTaFdlXlhOVWxUSlx5X1tfa11dW2NlYHlobGBvb3VucHh1eph9d4CBeoCAh4Z6eHmCfoGThHJ1dH95dnSEiJF9gHyQa3OVgHuCn4V+h32Af4aCgIp7doSrn396iIiDa3KBeXWAf4F0boZufIBzioBqb21kZFhfWllaVGFqZ1taXnSCaV5tbFxhV1xcbIFlcnR9aWlca3Z1Z3N2cWyEe318eHVybHlnaXhmXWVzaHp3k4FjY1RlcGeChXd3Z2lqYFdWWWdjj6dvfneAi457cXJ+aHpwe459eJByhH1/f4ZuZHVyZGdnXGphXG9vXGdfbXVkemhddIBvcmtyfH51dmJ0hYt7iIeBgHhydX91YXBtW3J0Y3FzhXx1ZXOAbWFte3Brant5dnNmhnZ7e3ZxZWJlbXJ+amxUaF1cVEtyYlBGVmFHYndnYUtUb1dKTFhYZ2t1emRlbnFmZFpXXVh2ZVRKXGJXZ1hZSVdlUEhieFpdX2xbXlxhY15+aWpfbnR4bXBudoOXeXKBgHx/iYyGfnV1hnmHjH10dnWCeXp6goyOfX6EiWlzloF6ip19foV6gXp/fIaIc3GPrYx7e4ePfWVxh3lzfHt1cm6FbHt+bI96YnBvYmVdZVZZWVdjZmtfXVxyhWhYcG5bXlhaXGx7Y3B3dm1iWmxzc2d0dW9sg3h+gHh3bm50ZGl0ZVtndWZ2dpJ5X11SZmZqg4J0fmJkaVxUWF5iY4+kaHh0g4aQeW5we2l5bnyGfHaKc4F4fHh/aGR2bGBmX15pXlxza1llXW9vYnplW3d8a25ub3h5c3Vkc4OSfoeDiXt2cHJ+c2J4ZFxwcGJxcoJ9dGdygGVebndpZWh6fHVub4J1dH10cmJfZm5ufWVpVGdYV1NNd19RSllYSGJ1ZGFJVG1TSk1aV2lscXtibGxzY2JaWlthd1xTTGRdWGlTV0hZYE1GaXVYXmBsW1tfYmJchGlnYW54eWxvanaBkHhtg36AgZOIhIF2c4h0jIZ0cnd2gnd8fX6MkIB+k35wd5WDfJmSeYCAeHp+gHSIg3RwmaJ7en+JlHhkdYd4c3h1a3Nufmt4fHCRcl5wb2BnYmxUWlpXaGNtZlxbcYllU3JuW1pYWGBsdmNpdWppXlltc3Bsc3NzaYR8f4B8dm9ubGRpcWNba3JkdXaOc1tXU2VhcoB/coJdYmNdU1pgXGORn2VycYWEkXRsbHtucHF7fX1ygXiAc3p6emNldWhdYllgZ1pedmhXYl1vaGF3YFt7dmlqcm54c3J1aHGClYOHfoR2c2pxfW5md1hdbG5jcnOBenRnb35bYHByYmBrcn5tbXV/c3F4a3BhXGVsbHphZ1RmVFZRUHVbUU9YUUhjdGJgRlVrUElQWlVra2p8ZW1ucWJbWlhZbHFXUlBnV1doU1RGWVxOSHJ1WF9jbWNYYGBhXYtqY2RteXhrcGl1eYZ7a4N9f4SafIKEeXyHbo+GcW53en10goJ8i4+Cgpd0d4KThYGfiXWBgIF0f4Jxh4J1b6KXc3uGi4Z7ZXeKbm16bmZ3cHprc3ZyjGtedG5hZ2VrUl1bVWdhbGtaXHCMZE9vbl1WWFVnaXRoYnRlZV1ZbXRtb3V0eGqGfH98iHaPc2Rka25hXG5tY3N4h2taVFZjZHh9fXGGXWNfY1RaYFljlZVjbnCDhYp0a2h8cGZ0eHV9bXp1dm96fnVeZXJjW11WYWNYYXRlVV9gbWRhcV1dfnBoaXNxdHB1dmtthJOBiXuFcXNnb35xc29UXGdrZnF0gXdzY212VmJybFtfcGd+Zm13fnNzc2ttYFpkamp3X2dUZFRVUFRtV1FWU09HZHNfYUVYaU9IV1RWbWhkfGlrd2tiV11VW3RkU1JXaVJZZlRTSFpaUE14dlpfZWxpWWJgXl6ObmFma3l1bm9pdnZ/f2yDgH2Hl3uAh4GJfmuTiHJndIB7dYCCfYiOf4uTcnyKkYWHn4Z7f4aMc4GGc36Cdm6ljHKBjYt2d216jGBke3BmeHJ4bG1xdoJnZHtsY2ZnaFNfXlVnX2xuW15tjWhOaW1gVFZTbmd0a2V4ZGRcWG9zbHF6d3Jsh3uAd5x6eWthZWxtXmBvamVxeX5nWlZYYGx4fHtwhF9iXmdWWF9XZJuIYmtxgYd9eGxreW5cd3Nte2p2dG9ve4ByWGltXlhcVWFiV2RwY1NeYWhhYmxaYH5rZmtzdm9td3dsaYWMf4l7iG1xZnF9bnNuY1phaWlvdIJ0c15pbVNlcWVVY29je2Ryd3x3a3Bta2BZYWdodF1lVmFVUk5YZVJPXE9PSGRwXWNGWWlNSV9LWG1kX3hobn1kYFVfVF11XFRTYGdPXWFVU0pcWVBZdHVdX2VsaFhjYVtejXFjZ2p4cXNuaHZ0eoNygoN6iI5+fImHjXlukIp0bHOCdH9/h4WGkoSVj3l+jI+HkZuEgHyMhXOAgXN0eHJvk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjYyMjIyMjI2NjY2NjY6Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpKTk5OSk5OSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjIyMjIyMjY2Njo2Ojo6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyRbWZnZ2dnZ32FhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERBUsza2NjY2NyLaW5ubm5vamZnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJFnX2BgYF9eeYOCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTJG2Orn5+fn64tiZ2dnZ2hjX19fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkY6NjY2NjY2PkJCQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaTlJSUlJSVjYmKioqJiomIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkpKSkpKNkZKRiYeOipCSkpOPjo6NkYiPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYuLi4uLjIyNjY2NjY2NjY2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx9fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQkIeJh4aJhYiQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCNhIeGhYWFh4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkYmDhYWHhIaIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjoiHhoaIg4qPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2Qjo2Mi46Jjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKHjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLioqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9+f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyNjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHR2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2loZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent5dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHR0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnJ0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOjs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ojs4OTo4Nzo8OTc4Ozs+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1c3FzeHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08OTc5Ojo5ODk6Ojc4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VzcnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GBgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Ozw8Pj89PD07Ojw9PT08PDw8Ozs6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV1dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0JDQ0A+PD0/QD8/PTs+PT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl6e3t9fn9+fn5+fn9/f39/f39/gH+AgICAgICBgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VEPz07PEA+Ojs6Ojk3Ojw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fXx+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIF2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz9BQUFCQUA9PD07Pj06Ojo8Ojg6ODg6Oz0/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXtOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAPz8/QD0/QD89PkFAPT49Pz09PkNEPzs8PT5APT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkVDREE/QEBAPz1AQDxDY0RAQEBDQEA/QEA+PTw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JCQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEFAPjo+PT48PEd7Wz5DQ0VAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVGRkZKTk5LSklHR0hLTEpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERGSERAPjw7PkBERURAQUZCUWVucHlxRURERENXdYaJin5YR0hKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpISUdVZWF+hYWFgHpUQUFVdIeJh4eGh4JXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTEtLSl56gIODgXyDfmNObISHhoaGh4eHh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUtJSUdISUdJSUlKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N1dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tLS0tLZH+BfoOBfYSCe4CGhYSEhoaGh4eGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJAQUNDQ0BBQkVEQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVISElIS0tmf359goSDgYKEhISFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QDs5OTk9PT47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6fHt8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BDR0hLR2qAgoKCg4KCg4KDhIaJiouMi4qJiouMiVQ7ODY1Njc2NjY1NTc2MzQ2ODo4NzY1NjU2Nzc3Nzg6Nzc3ODk7NzY4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1FQkRFZoKCgoGDg4ODgoWJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6Ojs6Ojw4OTg5Nzc3Nzk6OTg4Nzg1ODg7QT0+PkJBP0FLTE9RUFFPT09RV2tycnR0dXd6e3t7fH1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3OkE6PUNTgYODhISEhISGiYqKiIeIiIiKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8Ozk7PDg6Ojs6OTk5PD88PUFCRElKTUtKS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk5OTk6Pz5BP1mEg4SFhYWGh4mIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUFCPkBCQEA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEBAPj9BPD48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhxcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PD06Ozs8Oz0/Q0JAZ4WEhYSFhIaJiYiIhoaGh4iJiouLioqKi4qLXj5ER0lLSklGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURGRUFGRUZERkZEQEI+PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pz8/PEA+QUBFQk5+g4SFhoaGiIiIiIeGhoaHiYqKi4yNjIyLioqIV0dMTE1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkhHRUtJS0lLS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTc8Pjs8Oz5AP0E+QUBEREhDaoWChYWHiIiJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlKSEtHRUdISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw7PD06P0A+Pz9CQ0ZFTFd+g4SEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSUhGSkpFSkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVbnF1dnd5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH9/f39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6Ozg8PTs9QT0+QEJERkdRb4SDhISFhYaHiIiIiIiHhoiIiIiIiYyMi4yMi4uLi4teUlJQTU5NS0pHRkNHSkdMSkdLT0xLSkpNTUxPUE5ISUtMT1FRUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkBCQlxwcnd4eXp5eXl6ent8fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgICAf39/VUVDRUVHR0VEOz9BOz08OT89PUBCR0ZARUdFSlF3hoODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKRUVGS09OT1dWUVBPUVNSTlNUT01TTFBTVVdSU1JQTEtNTU1LTkdHSkZGSEpEREVFQkRDY3F1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj5CQkZWTURLTElOUnqGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOztRU1JgdV1VVlRWWVlTWVhSWmZQVVdaXVJUV1FQTlJQUFBRS0xLR0hJSEVGSUlJSElqc3Z5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0dGRT8/QUBFQkNGRURFTFhSTFJSUFNVeoaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A/QFZVWVxkYFZZYnJeXVddWlZFUVlaXFlfVFlnUlVWWFRUVlNPT01KTEpJSUxNS09NU290dnh5eHd6enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH5/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNSVlhWWFd3hYSFhYWFhoeIh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JXVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHl4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktJSUlGQkRAQTpQUVFXWFBQT1FTVFNWV1dXWW2BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaW1hcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm9zdXd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpbUlNRT1JSUVVSVVNWX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlRTVF5aWFdXV3prWFpcXF5TUFBQSU5PV1ZYW1pkcXR2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAgH9/gH5+enh3dnN1e39/gIB0a35+a3J5XlxWVVNST0tGQ0RBTV6DbFZSU05PUU9RVlJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUVFOS1JUUU1PWVFNTlFTVVVNUVNSUE5MTEhDSUhSU1RaXW1ydnZ1c3N3e3p7e3t9e319fX59fX1+fX5/f39/f4B/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lVUUxJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5DQ0NDQj9EUENDQEM+QkhHVkBJTk1HXWlRSEZPRkRFRkhHSEJDSEdISkdEQkFDQE9QTVJkdHV2dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWViXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHN2ent4eXVybnN0c3l4fn6DgIODgoCCgIKBgWtMRz4+Ojs+QD8/Pj5rUUthRUZISUVCP0hNTUdNUVVKQkU/Pjw9PD09Pz0/QUNCPz88PUI+Sk1GVW91dXZzdHZ4enx6fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXp4enx8eHd4ZEJAQEE9OkJDQUFDQlxdT3tOT09OS0xNT09QTEtMV05JR0BCPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV1dnV2d3l8fHx9fHx9fX5+fH59fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJTVlhTUllUTllaW1dZXF9fYGVgXV5xd2teYGdrd29vbGpvbm5sZmJZR0ZGSEJBRklFRUZDTVJQYVdSWFFQU1NSVVtPT1FWUE1JQ0Y+Ojk2NTg2OTc5OjM2NTc5NTxCPWZ0dXZ3d3l5e319fHx7fH19fn57fn59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LVFRTUFFVT0xSU1RXWFRUWFFMV1lZVlhYVlhZXVdXWGhza11WYHRrYWFfXWRgX15ZVVBNT05MSUdKS0lIRkNRUFNaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1OThHbnJ1eHh6e3t9fn19fHt9fH5+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BXVlZTVFZPT1VWWFhZU1VUTEtTVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5OTkxKRlBQVVlTVE5KTk9UU1RcVlJVU1NPTUxJSEhGPz89Ojc4NzY1OTk2NzY2NVdxcXR3enp7fH1+fX58fX18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1RTVlRSWFhZWVlSVU9KR09QT09NUkpPUFBQTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFFQTk5NUE5UUlBSTElMS09RUFFSU1RRU09MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjNAPmpvYVJSUUBGVFFPUFBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PT08OT1HNjY3NkRucXV3enx7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JDOEVOU11nU1FTQUdVUE9SUVBNTU5MSkxLTE5PT1FNT09NSExLSUtLTEtHRkZFRDxBQT47QEU7PDg5VHFzdXl7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E+PT1BQEI9PkVIRkRGRklHS0pARkFBQEZIRUpPSFFSYVxRUFJOU09PUExMT01LTUxNT05bVktNUU9HSUhESUpMTEtGRkZEP0NDPj1CRz9CPkFkcXR3e3p7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj87PkFAQD5BRElFQ0hHSUdJRUJCPz48Q0JBR0lETU9hZVBNT05XS0xOS0xNTUxMS05OU2ROSkxSSUlJRUFJSkxNTktHSUZCQUJAP0VGRUhETG9wd3p6eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPR0tFP0I9OTk5Oj9CPzxBQkJBRERHS0ZESUlHR0hDQz9CPz9AQT5ERUNLTlFUS0pJTVRGSUlKTEpLS0lKTE1PUFJQS0dDTEdDQ0pKTE1PTklKSUdDQ0NESUpNTElac214eXh6e3t5fHZycHVydHl5dnhqcW5qbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZXFIS0NGSEhHSktJSkxER0I9Pj06Ojo7QUI/PUJCQ0NIRkpMSkVJSUZHR0NDO0FAQj5AQENFQ0lNT0dIS0ZIS0RISUtNSEpMSElKTEpNXVJJSEROR0JFS0tOTVBOS01KS0ZHR0pNTlFOTGNuaXd2dnt4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkcEZLQ0ZFR0RFRUZFR0NDQD08PTo7OjpAREA+QkNFRUlGSkpMRklJR0ZGQ0I7QkNDPkBDQ0NFR0xOSEtOSERIRUlMTk1HSUxHRkZJSUxOS0pIRU9JQ0dNTU5NUE5PT01MSUhJT1NRUk5SZmdmcm9zeHV7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lDRUZFQkJBRUBEQj4/Pjo7Oz07PT9DQT9BQ0ZHSkdKSUxIR0dHRkVDPz1FRUI+QUNDQ0VHSElHTVBJRkZHS05PS0ZISUZFRERJSUhLSUZIUEtESk1MUE5PTk9QTkpKSE1SVVVST1dkYWFtZ3Byb3N5emdlaGhjaWxncWxmbG1naWtsc21wdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NBQEFEPEJBPkE9Ojo9Pzs+P0BCP0BCRUdKRkpHSUdGRkZFRENBQUZGQ0JCQkRFRUdHSEZMUExJT0pKTEtJRkhFRkVEQ0lISEtKR0tSTUNPT05RUE9PTk9PS0tLUFVXVlVUWWBfXWlhbWluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNwcmtrc01GR0VHQUJAQ0Q8QUFAQzw4OT0+Oj89P0I/QEBERkhFSEZGSEZFRUNDREJESUZDR0VBRUdFRkZHRUpNS0hRTUpLSEhJRUZISEVDSUlKS01LUFNORFJTUVFSTk9OTlBNTE5TV1ZXWFZYXltdZGBoYmppZ2tfZGVmY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hCQkJFRTxAQ0JEPDc6PT47PjpAQj4/P0NFRkRGRERHRUNFQ0RFRkZKRUVJR0JHSEZHRkVDRkpKR01LTEtISktGSUhKSEVLS0xMTk9SVE9JVFVUUVRQUU1OUU5NUVdaVlpZV1peW1hhYGBgX2hlY2BkZWdnamhoamZobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9zc3lNSEhHSURCQ0hFPEBFQkQ8ODo+Pjw8PUJCPD8+QUJGQ0VCQkhDQ0RFRkZHR0lGR0tIQ0lIR0lHRkRIS0lHS0lNS0pLTEhMSk1LSU5MTk5PUlVWT0xWVlRRVFJSTE9RUE9UWVpZXFpaXF9fXmBjXlxhY2tiYGRnaHKFaGdqZmpubnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtJS0hKRUJFR0U8QEdEREA5PD5APz4/Q0I8QD5BQUZDRURDSERGREZGSEhGSEdJS0pFSkhIS0hGRkxISEhKSE1MTExMSU1LTU5NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW11eYGBhYGJlXWRgZmdgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXd1dXV3dnV3c2d0cmtxcmtyd293SUpMSUtHQkVERTxARkREQjs/P0FAQEBEQUBCP0FDSEJFREZIRUlFRkVJSEZJSEpMSEhKSklLSkZKS0hJSkpHS0tNTUpKTUxNTk5PTE9QUlVXVk5OVFZVU1JRUE1OVFNSV1teXl9dXmBgYWFhYGNkZWJkaWNkaWpndotsa2lobW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV0c3Bzd3R1dXd2dXV1ZXFza3BxanJ2cHdKTExMTUdDQ0FEPD9FRUVDPUFBQ0JCQ0VBQ0RBQUVHQ0dHR0ZFSkZER0pHR0pGSUxISUpNS01MR0tJSEtLTlFLUlFMU01LTk1OUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV9gYl9gZmJhY2luaWNpaGhteHZtaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJycXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0VBQEQ+PkRFRkM/Q0FFQ0RGQ0NFR0NCSEVCSElJSEhLRkRLSkdISkhJS0dKSk5LTkxJTEhKTUtaZkpkXEtsUkhPTV9uVWxzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmXGx0YGxrVV93dmlqaGhmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj89REVGRENDQkVFREZCRkZHRERLRUVKTExKTE1HR05KSEpLR0tKSUtLTkxNTUxMSUxNTFtzYmRwXmxsVU1OZXNeZ2ZxbG50Z3BpX2FZbm1icHBia2pqZ29xdGV0bm9ccHVncU1Lcnl2a2Jha2VlbHhta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnR0Ym11a3BwbHJycXpLTElJR0VEP0FCPz1CRUdCRkNFREVFREJISEdERUtIR0tNTUpNTEZKTkhKS0pJS0pKSUpMTU5NTU1LTk1NW3Jvb25wcGxrTlBRbFhNaWJ0cnBhbW92XFlsUFttbVpxbWtvbXh4dHNpcFxgc2xxalV1eXhvY15rZmJncHBqaW9wcHJzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hFRUVCQUI9P0BFR0JHRElFRURCRklISEVHS0pHTU1OS01OR0xOSU1LSEpNSUtJSkpOT05OTUxOTUxcaGR1XWxxV2xOT1FuVVprXmtsdmFsZHRUZWNObFlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdoYWRpdHlrb25xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSUVFRENBQjxCQEJGQ0dGS0dFQ0NIS0hIRkpMS0ZNS0xSUkxHTU1ITkpJSE5ISkpISE5PTk5MSk1NSlpzcHBvcXFtbE9RU29Zc2tnb29xcW9tdF5uWGF0X25vcG9xcm9vdXN0dGpbXXRjd3hyam56aGFhY2ZhYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRJS0hKQ0VFRUBAPkNDQUZDSElNSEZDRkpMSUdGS01MRk9KS1dSS0dLSkpOSUlKTElLSklISkxNTUxJS0tLU2tiWmleX2pjcnJaX1prb2BlZVVrX2NbYWJRYG1oXGpcbmlpZFtwZmRwXVpca1ttcWNwc2xkZ2NkZ2Bga25wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVudnFydXR3cklIRkpERURGQUBBRURDR0JISkxHRkRHS0xJRUZKTktJT0lMW1FKRkhIS01JSEpKS0tJSEpHS0tLS0dISkpMTExLSUtMTlRbXVRQVU1RUE5PT1VSUE9RT09RSkpOUFFkcWlUWVdbW1xVWVtdWF1cXGNmYWFmYmNmX15ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzSENFR0ZGQUVDP0NHREVHQ0lLTEhGREdLTEhER0hQS0xPS0xXTUlGRUhJSkhJS0hMSklGSEhKR0dJRUZLSElLTkxJT1xXXk9cXGBeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZF1hWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1BQ0RCRElFR0dGS0pLSEVFSkpKR0VISFBKTE1KTVJJSEVBSEZKSUtLSUxKSUdFSkhFRkdFRUpHQklNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOX1xeU1teY19aXWBjX1lfYltgXltUWVhaX15kYmJhY2ZpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSURCQkNGR0VHR0lKSklJREZLS0tGRklJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRURERUJGSkQ/SUtITltjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtRW19hYV1eY2FgYmJiY2NlWlJYVlZcW15jYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkNHRUJFR0hGR0hJRkdKR0hGSEtJTERESkpNTUxMSEpKSEpHP0dGTkpLS01LS0tJR0hEREBEQUhJQT5ISUZPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUVFdX2FjY2NjYlxkY2JkY2ZYUVZVU1xYW2FfXl9hYV9kbGttamtsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1CQElGQ0ZLSUZGR0lHR0pGRkZJTEpORURKSkxOSkxJS0pISUdCSEhRTUtLT01LS0lISEVEP0VCSEhBQEZFRFRdWV5YX1hfW11VWFhQXV1RS0pXXlheW11WWmFSUl9fYmJgYGJiYGNiYmRkYlhPUlJTXFNcXl1eXl9fYGRoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSERSS0ZISEhERktJTVBFR0lKS05MTElMS0lJR0RIS1FPTUxQTExLS0lJREVBRUNIRkFARkVCVlVFXFReU1ZgWE5UVU5aW01KS1VgYVtfWF9eYl1PWWJcYGBfYmNiXWJiV19fVFBPUVJZU15cXF1eX2BiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJUmNRRFdfSUdHSERGTUpQUEZKSUpLTkxMS01LSkpHRUlOUVFOT09NTk1OSEtBREFDREZEQkFERUFMSENMTFBPT01GTUZGSEpIR0xMTU9QSUxPUFBTUExRU1JVWllXWVhYZFZPU1RQUE9OUVVUXFlZW15eYWFlZmNoZGtscXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXk1HSFlNR0hKSEdOTFFRSUxKS0tOTVVOT0tLTEdHS09TU05QT05PT09IS0ZgRURfTERmY0RNW0heXHNtT01WbVlMQ1BfVWxXZ0pdV1VeRExRVUxNU1ZRUlRYV1RYVVRcVFBmWmhoZFlUa1RYV1VbXFxgYGFiYmJgZ2lnbmxocnp8fX6BhISEg4ODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09USktHYFRHSk9KSU9NUlFLTUtMT1JVUk9PSkxNR0hNUVtZT1BQTk9QUEpLUX9RSXxZWXJzV1BtSHFub2FWUHFxdE9Ca3NucXRwU29fW25YXVZcWFVraFVdVmNZYFlaX1ZVV39pdHV1X2F2X1liXFxmW19hYWFiXmBiZ21wbGBwd3R4gYGCg4OCf31+gHZ4em12fnR4foB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdKTEZSVkxMT0hMUlhXUU5PT01RVE5PUVBLS05HTVBTW1pUUVJPUFBRS0laeF1UeGRoWVJTUHZndGxwYm5ma1JyTkx3bWpycHNycXJwb3CAXWZ6dXhxcXpxfnJ9a3V9YlJnfGVzc29zc3x9cH55b39yX2BgYmJbYWBoa25rYmxmZ213foGAg357eHeAdHZ6aHJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEtRT01OSk5XXllVTFFTTllZTFNTUk5MT0lRUlRZV1dRVFBQUVNMSGd4bGN4cW1aS0xUeXB1bXVibnZQZGVJZXZxbXdvgGpmeHhpV3JSaXttaWp6en1seHp/cGdvWHV1anZ1cIBhc2h9aWx4fG9fX19jYlxfZGVmaWpkZ2JjZGxscHBzdHNzc3lxcnhibHRncnl7c3N1eX6Bc3Z6bnx9eXhybk5KUnROQ0JFUFBJS0xKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSlNUVVhXV1BVUE9OU0pLcm91dXF1cWRoYVZuTHFwXkdoeVd2VEtoeH14YHl7c25hXm1vZFNncnVubXlwd2x2c3RxbG1cc316a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGVlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tTEtaVkhHRUdSUEtMTktMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5KVFRWV1lXT1NPT05RSVJtSGl3S2BkdnVVV2xObmx7cmFqZ392VUtXa2h9bG1seGBbcHp7X2B6c2Nyb3hxaGR8aXJ7XVRLbF92dWtpdXt7bX54a3xwXV5eYlteYmRlZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtobW1yfGttaGt7dG1ta21PR0pLSEpISFJRTU9QTUxTU1JPU1JXUlZUUFdaVlZUVFRhYFFPTktUU1NRVlZPT01OT1FKSFFOUFVMS0tSU1JSUk9WVVFRT1JSWFhRTlBVVFhYWFtbVVNTV1tXWFdaUFNVV1dYUV1YVl1VU09YUlZXV1haYFtncl5bXFtdXV9jWl9jY2VmZGNjYlpjY2dmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFBJS0tMTUtKVFJNUlFQTFZVVFBUVVhVWlVSWl1WVVRXVVlYUE9MTldUUE5VU05QTkxRUEtKUVFLUU1KS09RVFJRUVNSSUlNTk9RUlFRUVRWUlhXXFdTU1FRVVVWVFpRTlNRV1VUWVZUWVVTUlVTVFVYWVheWl9hXVxbWl1dYGNcXWJiZGdlZGRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkY2ZoUUpLS05PTE1UUU9UUVFNWFdVVFZYV1daVlRcYFZXVllVWFRRUEtPWFNQTlVRTlJOTFNQTU5VU05RTk1OUVNQVFFTVFROTE5PUVRUUlJRVldVWVpbWVNVUlRYV1dZW1NPU1RXVVRZVVZZVFJSV1VWWFxaW2BdVllfXV5dXF1gYV5bYmJjaGZlZGJYYGBiXWBoZWZkYV5fXV1eWlpfWl9nYF5eXWNoa2FoZmhmZGBiZGJQS01MUFFMT1RQUFRRT1FaWVhXWVpaWFlWXWpkVlhZWldWVFRPS09WVFBPVFBQUU5NUVFPUlhTUVFPTU9TVU5XUVRUVU9OTlFUVVVUVFJUWFZaXVxaVlZRUldYVltcVlBTVVVVVllUV1dUUlJYVlZbX1teYF9WX11eYFxcYGBfX1piYmRoaGVkYlliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST01QU1JVWlVTUFBMUFdVUVZSU1NYTU9QUVRYVVVVU1VZWFteXVxbVlJPVVZVW1tWUVNWVVZYVVNYWlRTUVlXV1xfW2BfYFZiXGBhXmBiX1xgXWNhY2dpZWZgWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFlcW2BeYFteXmFgX2NcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWV5cX1dcXmpwd3mAY1xbVlZZUk5PV1NOUVFQUlRSTFFUU1lbV1VPUk5TWFVTUlRSUlpPUVNTVltWVlZUVlpYXV5cXF5WU05UVlZbW1VRU1RWWFhSU1lcVFJSXFhaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2lkZ15cZWBhYGFjZF9iX1laX1tcW1lYWVdXWltaYV1dW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFpdXl1cYFxgVVxdaGpyfXNsaFxVWVdRT1JbU1JRVFJUVVRLUlZVWlpaU09TUVVVVVNOVlJTWlJUVVRYXVdYWFNYXFheXVlaXVVVTlZWV15aWFFUVFhYWFNWWVxUUlZdWV1dYV5jY19ZYFtlYl9kZF5eY2NhXmVmaWVmXV5kYWFhYmNkX2JeWFtfW1xbWFhYWFdbWltgXVtbXFtYWlteVl5ZXVBPT1JaUFtVVVdWVFRUXl5gX15iXGBVXV5ia3l1bX1sWlVaVlFRVFxUVFRVVFZZV0xSWlZcWlxSUFVTV1VVU09XUlNXU1dVVltdWFtZVVpeWF9eWVxZUldSWVhZX1lZU1VVWllZVVdZXFVUWl1cXmBhYGVkXV5dXWVhYmZkXl9kY2BcZ2RoZmRiX2RhX2FgYmJfYF5XWV5aXFxaWVpXVl1aXV5bWltcW1dZXF1WWFddU09QV1lQXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXaCe2hYWVpUVlRWXFhXV1ZWV11YT1VcWV5dXVRTWFJXVVNSU1hSU1ZUWFhYXV5YXVtVXl9YX19YXFZRWVVZWlphWFxVV1daWlpYWVpaV1ZdXl9eY2JiZWVdYlxgZmJlZmRfYGRiYVtmY2hmY2ZhZl9fYWJhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlNaV1RcVVZXWVdWXGBhYWNhY19fVltgZGFfenVvaFpcWlZYVlhbWllbWVhZYFZPVF1bYGFcVVVZUFRWVFJWVlJTVVdbW1xfXlpfXFZfX1pdXlleVlNZWFlaXWJZXlZXWltbW1tbWVpYWV9fYGBkY2RlZWJkWmJmY2dmZV5hYmBjXmNjaWVkZ19nXmJiY2FhYF5fWFRaWlpbW1hcWFhcW1pbV1daWFdcW1xgXVZdXVNPVlpWVlpWWVVYV1heYGJhZGFkYV5ZWWFkYmBrZmheXF1bV1dZWlxcXF9bWVtiVlNXXl1hY1xTVllQVlVVVVZWU1VUWF1dX2BgXWFdV2BeW15cW15YVlhYW1pfX1tfWFhcXF1dXltaXFdaX2FeYGVkZGZmZmJZY2ZlaGdkXmNgX2VjXWZpZGVoX2deY2JjYWFgX19bWFlbWVpaWFpYV1tcWltXWFpUWV1cWmBcVV5iTVJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9cXF1YV1tbXV1fX1xaXWNYWVhdX2NkX1JZWVBXVldYV1dWV1ZdXV5hYmFfYl5ZYV1dXlldXllYVVdbW2BeXF9ZWV1dXl5gXFpaWVtfYl9iZWRlZmdnYlpkZmdpZ2NfY15gZmVaaWljZmljZl9iYmNhYGBfXV1aWFtZWVhYWllXWltaWVdYVlVbXV1dYGBiYnhLV1dcWVddXFxdWldcXV9gYmRiY2FdYFhiY2JgY2FjXlxcXVhXW11fXWBfXVtgZFxcWFpiZWNhUlxZT1hWWVpZWVdaWmBeYWJjYGFjX1xiXV9dW19eWVlUWF1dX19eX1taXl5gYmJcXFdbXWBiYmNlZGdmZWdkXGVmaGlmY2FiXGNnYFxpaWNoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXV1hQWFpdYWNmZnJrf0pZV11bWl9dXF5cWV1bXl9iY2JhYV1iW2JkYV9jYmJdXFtbWFhqcWBcYF9dXGFjX15ZWWNlZGJUX1pRWVdcXVxbWltbY2BjY2NgYmRhYGNeYFxeX19aWFZbX11cYWFfXVtgYWJlYl5cU1xfYGNkZGZlZ2ZlZmVfZmZoaGdkZGBbZmdeYWhoYmhoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ1dXV1dXV1dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3t7e3t6enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnV0dXV1dXR1dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7fHt7e3t8e3p6e3p6enp6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx4xdTS0tLS1JN7fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKh3NxcnJycW+pwb6+vr6+ytPS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXjV5+Tk5OTnmXt/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyJcm9vb29vbLLQzMzMzMzb5uXl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dn5/f39/f4B5d3d3d3d3eHl5eXp5enhvb29vcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx6enp6eXl5f4OCgoKCgoSEhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dHR0dHR3dXZ3ent4e3h3dnZ4eHl5eX15eHh5eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t7e3t6eXl5eXl6enp6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3d3x7e3x7fXt3d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d5fnx8fX1+fHd4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3t+fX18fX58eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHt8fHx7fnt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl3eHp6enl8eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZWZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMj4uKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIjIuIioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjIiGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+f39/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChISCgoKHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFg4SEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYODgYCCg4GChYWFhYaGh4aFhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKh4KCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEhIOCg4WDgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoKCg4SDgoKDg4OCgoSEg4ODgoOEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCgoKBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgYGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+fn+AgYGBgoGAgoKBgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIKDgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYGBgoKEgoKDhIKDhIWGhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkZGRjo2Mh4WDg4OBgoKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KDhYWDg4OEg4SDg4SEhYSEhIKBgIGCg4KChIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+NjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCBgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgICCgYF/gYGAgIKBgoKCgYGCgoGAgoKCgoGCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGBgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSTkpSSj42Lh4SEg4OCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+AgH+Af4CBgIB/h4KBgYOBgIGBgoSDgYGBgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGAgIOCgoOCgYKSjIKDhIKDg4OCgICAgoKCgoKCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhIODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgoGChoaDgoF+f5GZhoWEhIWCf319fX6ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhIaFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDgoOFiIJ+fX59hZyMhoaDgX5/fn5+fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoKCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4mKgIB+hYp/k4+EgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGh4aGhoWEg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoODhIOCioqDiIKDhYCEhIB/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiIiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGh4eHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eHhYODhYSDg4OOiYaGi4N/gICBgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYqLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI+RjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeHhISFhIODhJCHgYKCgoKCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEhIGOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWFiIOCgoKDgoKCg4F+fX5+fn5+fn18fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeHiYiDg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaEgoKDhIKDg4SCgYGBgYGDg4SDhJGSkY6PjouHhIaGg4KBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWHiIuKhoSGhIKGh4KBgoSDg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GCg4SFhYWDg4WEhISEhISFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjZCMiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoGAgIKAfn+EhIODg4KCgH19f4CAgX99fn59fH19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYODgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhoyTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgICBg4J/fn5+fn19gISEgoODg4F+fX5/gICBgH59fX19fn18enp6f4KCgX9/f39+f3+Afn2Af3+AgIF/gICBf39/gYF+fX1/gIF/f36AgIB/gICAgX+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fn6AgH99f359foCDg4OCgoGBf319fn6AgIB/fn19fXx7e3t6enp6gICAfn9+fn59fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f35+gH+Af36Bfn6AgoSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7gIB/f39/fn1+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZOSjYyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoOBgYKAgYOEhIGBgYGAgH19fX5+fn9+fX19fX18fHx7enp5eXl9gYCAgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIKBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEg4KDg4OCgoKCgoF+fn19fX5+gH19fX19fX19fHt6eXl5eXmAgoKChIOAgoOBgIKAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoaFhYaBgIODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGhoeIh4aHh4B9gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WFhIWDgoODgoODgoKCgoODgoKSkIuIiIeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgH+AgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaGh4eGh4eGf319fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomXhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKOi4mIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYGAgICBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSEhoV/fXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3x/goOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+LioqMiYiJh4WGhYODgoGBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYGDgX99fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWChJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGCg4KDgoKBgYCAf4F+f31+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn9+gIJ8fH9/gYCCgH58e4qCfYB/foGAgIGCgYKAgICBgH+Lk4+Mi42OjYiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSRjIyNjo+KhYaGhYSEhYODgoKDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2LjY6OjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fXx8fX59fH19fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKNjIuOjYuKhoSFhISDg4ODgoKCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn9/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXt6e3t7gIaFgoSDgn+Afn+CgoJ/f4KCf4CKj4yMi42LioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gICBgYB/fYB/f35/fn5/f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH17f357e3t8fHx9fHt7e3t9fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4aChJGOjIuKi4eIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f35+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fHx7fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3t9e31+fn+AgIOHiYmJi4mLiYWIkY6LiImHhYWDgoKDhISDg4KCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foF/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgYB+fHp8fX1+fX1+foyGfX1+e3uDgn1+fn19fH19fX19fnx9fH18fX1+fH59fX19fHt7e3x7fHx7ent7enp6e35+goWIh4iKi4uLiYyQjo2JiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjY+Ni4iIhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58fn+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiNjIqKhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiY2Ki4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGDgX5+gIB+foB+fX5+gIB/gX5/gH9/f39/fH9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCBfXx9fX18fHt8fHt7e3x7fHx8fXyJioiIhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fomFhoWGh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp9fXl4dXSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAhoKEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl0dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKEf4OCgoKDgoSCgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXZ0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX5/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+Ag4F/gIOCf3+Af4F/gH98e3t6fHt8gYB/gn9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOCgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fH1/fX+AfH9/fX2BgIB+fX2Af36BgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBhIF/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4KAgIGBgIGBgoOCgYF/gIOAfoKChICAgoGCgoSCfnt7fHx8fX19fn16fn19eH5/f3x8fH59foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4SDf39+fX5+fn+Af4CAf4GCgYB/fn+Bfn+AgoKAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFg4ODg4ODgoGCg4KBg4J/gX9/f35/gH19fX1/gICAf3+Af3yAf3+BgIGAgH98gH99fn5/f31+foCBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZxeHlyeIWFhYWDhIOCgoSCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gIF/e4B+gIB/gYGAf32Af35+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fX17fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWGhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH+AgYB8gH+Afn+BgH9/fYB/fn9/fn19fICAgIGAfn9+fn59fH5/fn9+fH2Af359foCCf36AgH9+gYSCgoOFhYKCfn18e3t8fHl3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6enp4c3d1cXFycHh3cXuFhoWFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgH+BgX1+gH9+f4F/gH9/gYB/gH99fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn6AgX+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf3+AgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/foCAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f356gZONenx9fHt9eXt6enh5gYF4eXx8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKBgIGBgoGCgYGAgICBgH5+f3+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/f31+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhol8fH57e355ent6e41+d3d5fHx7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXhzdHVuc3FweHJ1eoWGg4OCg4KAgICBgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYSDgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgIKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBf4CAgICBgIGBgYGBgIGAgIB/f4B+f31+fX5+e318fXx8fHd4dXh4eXt8fH17fHx8fH1+f39/f359fX6Af4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYGCg4B/goGFg4OEgYGDgYKCgYGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/foCAgICAgH+AgIB/gICAgICAgH+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31/eHd2eXl6fH19fHx7fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXl0cXVud3B1enF2eYWFgoOCg4OCg4SEgICCgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn99f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fYB6eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKChoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGCgoCAgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn5/gYGAgICBgYGEhIB9gH9/f39+e3t6ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoSGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SDhIWEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH96e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fX18gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoSFhISDgoOEhICEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fX19fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoGCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoOEhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fH19fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KDg4GDgn+ChIODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4SEhIWEhISFhYWFhIODhH99gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KDg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODhoKDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgH+Bg39+fnx+fX1/gYB/fnx8fn9+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhYSChIOGgIKFhYqJhISDhIWFg4eGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhYF9gXWBeYN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WCgYSDgH9+fn59fYGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISGhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfH9zgoN/g4N9gX1+fn1+goOBfH+AfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhoOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugIh5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9f359gH+Af319fHx9fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOGhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYF/f3x/fXyBfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYSFhoaFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhIWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYqIhYSGhoWFg4WFhIWGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJiYeGhIaFhoaFhoaEhoaHhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoWGhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFg4aHhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH17fHx9f358fH59gH99foB+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYSGhIWGhoeHhYeGiYiGhoeHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoaDhoaFhoWFhoaFhIOFhYOFh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fnx/fn19fn18fXx/fH5+fH2BgH18fH18fHx+ent7fX6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoWGhYaHhYWGhoWEg4SEg4SHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fHx8fX18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4aGh4SChIOEhoWHhYSEg4SEhYaGhoaGhYeFhYeFhoWHhYSDhIODhIeBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19f318enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoeHhoaHh4WHhoiIh4aFh4eHhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhYSFhYaGhoaGhYaGh4aHh4WDhoWDgYOCgIOFgoN+gYGBf4OBf35+f31/fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiYaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYWEg4WFh4aHhoaFhoaGhYaGhIOFhYKBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4iHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChoWGhYeGh4SGhoaGhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4J+fn6AeXp9gIODhIeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIOGhYaGhoaGhIWGhoWFhoKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn1+f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WDhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhYSFg4WFgYGDg35+f4B/f4CDf3yAfX1/gn2AgX5+gX59fX19f3t/fHt6eXp6eXp6fHl6ent7e3x6e3t7e31+fX2BfX18fH2Af318hoOGhoaGhoSEgoWChYGBgH9/gIB+f4CCfX5/f36AgIGCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWGiIaFhIaHhYeFhYKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SEg4SDhYSAgIKCfn19f35+f4R+e398fICBfYGAfX2DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEhIOChoKDgIGAfn5/gH1/f4F8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDgoSDg4B/gIF+fXx+fnx+g358fnx8gYB+gn99f4J8f359fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKEgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWEgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYKAhYOBf36Af358fH59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZMPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dXU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXU1dTV1NTU1NXU1NTU1NXV1NLT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vKysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19jc3d3d3d3d3d3d3d3d3dzb3Nvb29vc29vb29vc2tPS09PT09PU1NTU1NTW1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLmzeHNzc3Nzc3Nzc3Nzc3N6goGBgYGBgYGBgYGBgI/S0tLS0tLS09PT0tPT09zj4uLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6ODc+Qz84Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7s6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OlmTIpKysrKysrKysrKyspNUVDQ0NEQ0NDRENDQz9c09PS0tLS0tLS0tLS0tHg7Ovr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7QEM+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0dLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpps4LzAwMDAwMDAwMDAwLztJSEhISEhISEhISEhDYNLT0tLS0tLS0tLS0tLR3+vq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87P0BAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzdDS0tLS0tLS0tHR0dHQ3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaugRT0+Pj4+Pj4+Pj4+Pj1IVVRUVFRVVFRUVFVVUWrS09LS0tLS0tLS0tLS0t/p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPzs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Ozs7Ozs7Ozs3Nzc3Nzc7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Oz8/Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0crKysrKysrKycnJycnJysvLy8vLy8vLy8vLzMzM09TU1dXV1dXV1tXW1tbY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7Ozs7P0c7O0NLOz9LU1dTQz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbY19fX19fX2NfW19fX19bX19fX19fX19fX19jY19bW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Ozs7RwafR0big0NGcgoSKxs/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8/P0Z2PxLOWmLq6lbi5r6HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q/QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/P07qvqryfo6iy0ZJ9fq+w0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Pz9OfsZu/x4eatNXTzZ6ew9DPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz9HAnImavdqjmLXU08CgoNDP0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Uo6KBm8DXoZi009OvoqnU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDRxJ+Be5ar2KGYtNPTo6G61NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q1auvvMDPk9OhmbXUzZ6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njo7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT07Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJh3+FnqTZopm118OfoNLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HG09PVnJi/16Gas9mypKbW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg0tHS16iHy9axg8XWuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dLPxdTR0MPU0dLC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS09TS0tLV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSz4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87Ojg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VGQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2loeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCDdnR8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqZG1nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp13cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW1tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBCRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampubm5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cnJucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX15dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVGJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFNfTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipamnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSmoqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaatpqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6qsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paGJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLeuqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaChqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYWxodWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2s7qxqq60sbCxtLW2vL2+vLy9xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyak5aUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsPDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbGnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87My8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb2xocXhveWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJCQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ3c3hmZ11kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFDQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/JzsjBxMHHysrGysXMyM3GyMW/w8DLzc/JxsPDxMLEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpoXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIx8nHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraequ7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBxsHLy8fGzMnNxcbGw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXRuc2JcYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBw8S/v77Ey8jKy8i8u8jHyc3Iw8jJycbFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7ur21s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JvZmVnZGpkYWptbm5eWFxWVU5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwsbCvsbBubvDuri5vL7BxsHGurnJycPFxMDEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmZjWllZXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m9urq0v7i1uLOvu7y3wLe9wr/Bu7/BvLvFvrvBxMC+vrm8wcHLvr3JxMDAysCxwb+7uLu+urW3s7i8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYd9cWNgYmJnamZmaWVpXVZVU1lPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz05NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1usG4vri/vL23tbewrri2ub+7wL+3wby7w7a6yLi2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2dYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88OTc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8tru8wMS5t7e3tbq5urvAvcPAusTCvse4ubitt7W4urS3s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg9PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9v7vEt7a4tre/v8S8wsXFx8fKycbPwsG4rrW1vL64u7K+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG53Y2diXGNRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD89Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuqo7C5vb6zvL68xbiyuLm9x8nKw8fIxsbJyMzO0czKxLW6wMPIv7+1v8C/xsa/y8bDv8G8wMPMysfFxsG5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmFhTkhNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0vMO8urq+vMS/t72/vcfMxsfJxsa/xMTKyMzMzcrGwsPLzsK8ub26ucDDv8jGxMHBv8XAysnDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPj5BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8trq9wby7v7a/wb+8v7rAy8LHyMC/vLy/xcLHy8jBw8DAycrCwLu7sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKyr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnptc3hzZ3BdW15cWVFFRENNSUFFPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7u9usO7t723ucC7uri4tcXBwsO7ubO0usG9v8bAucC8vsXEvb65srCuuLe/w8fDxL29v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG5pXF9gWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnBwLe9ubi5trW/s7SyuLG7wcDDt7etsLW4uLjCurS7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nrK+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9lXFpVSjw/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDo7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+3ure2trK0wLaytLizusDBw7m3s7KytLK4vrmztbK8uby2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZybF5iYFtdT0hBPj1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u7y4trq2scC6t7m4ubvBwcTDu7u2tLSwtrq1tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybmNcZlhcXVJOTUE+SUJASklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOxrba6rqy8sri5t7u/vbm+wLS/u7y6uL7CvMLKyL7AuLi2srS2srSvrbu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLavqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxCRk1GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vbWyuLS5urW5u7W1s7W7vMC7vsC0v7m5urG6w7zCysW/u76/ubS0s7CxrbC5uLa8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jo6OhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmJ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PTw8OzpAPTw8Oz8+QkBBPz45NTg7PEZCQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+ysrq6t7e1tbyzr7Srtrq4wMTBuru/vbeyrbOwr6yutraytLWvqqSem5ycnqionqCoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKqrnqWjm6OclZCMj4+Qk5CXlZaYn56empmml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR09NTEJPUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7P0BBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6Wsqqi1srGwrq+yp6awpK+utcG6tbnVx7WztKuytK6qq6+wsrOupZ6SmJSPmKCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6apsaOlqJ6gnJWTkI+RkJiQlpWYlp+Ym5mbo5mXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01JSEdOUk5KTkc7RUA9Mj83NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENBRD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiYl5ahqKyutre6ubq3t7uuqKChqaGgrauqpqmkqaSlrqWsrLS8t6y52bO7rbWvr7O1qqetrKOcmZSOkZaXmZmcoKKinJ2lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmZabl5eYoJ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHh5YGJSVV9ISUlLU1RJUlBMOT9CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OTnJ6kqK6trKurr6qvqZ6XnqWdnqWmpKGin6agoq+rrK21sremtdSZwbeysbGwuK2noZydmpSXmpqQjpGVkYyOjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKwtKmxr6KZnJ2eoZmbm5qYmZuUlpuWmJyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVbU1pZTVFKTk5VTFJMQTc+QjY4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkpyYoZ2qoqegnqehpZ+ckpyim5+ho5+doJ+ioKKvr6ywsaqoqrLJlqbIsK6trLCnoJ+ioJeRlJugnJmXkpOfnKGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7issbSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqShn56anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFFVSEZVVkpCTEc9S0g4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOemaidrp6nnpyhnp6ampKZnpyhoqCgnaGkrp2fqayjnpeFe4yRsZSIta+oqqyqpaCemZKSk5iYlpaVjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqefmaagn5+nqKWknp2qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JWTUpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiaqqCxorejsKafnp2dl5iVmZ6bnKOfn52jps6jm6WgiXaDc2Joa32Hg6Gzrq6pq6egnp6hop2fnZqcnJSTlZSenpiUhZ2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsO8w7y3s6mzraqztK+zrqquo52rp7axrKKvpqGjr7GtsKSkr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHJra3VycGhXW1FFVEhESU9IPkVBNEVIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw8Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6foZ2cmJufoJugn5+XorDRq5SOiIFicY5sYl1geKCxr6ekpKOgnqWrpp6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Aw77HxsK3w8nJwsDFvrm0ubq0u7ewtbKqurGuu7e+urqqt62rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmpGcnZ+knqefnp+inZiZlJiUiIR9enJrZGhveGplWltGS0xFRFNMREJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbOyuKehoauqop2eoaKenJugkpy6zqKGbmOHX1eHiI+PnLCqoZqdnJ+fmZeYmJKMj5eXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXS08zT0NPTzMrCxcbHysfOv8jRzMfFxsTBu8PAvr6+tb2zrb+/wsLGxMfErr64sri8xMHBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURDQDU1NTg6Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5ibo6ydn66mpbGqxcbMzs2/sMGopaisraqhnaOfnJ2aqZOZxsKVa1xql1tUcZuws62kn52gm5iXlJOUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K0tfR19LU1tPTyMzHzc3J0szO08zFx8nKwcXLxsjIxb7CsrPIxMvKys7Fyr++v73Bx8TMzMjJv8O/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYuAenJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK20uKyuo5+ko5+gpKyan8+0gVpcfZFrkK6upZ2dnaGloZ6alZSWlIp9d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HT1NTSz9HD0NPW2NXW0svJztHLxs3RydLV1tnV19PW2M7Sys/RzM7QzNLPv8fGysPMzMvOz8XGx7bAyr/RzMvPxcnHv8PCyM7Mz9DPzcrIzri3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGVyYl1SXElKR0FFSEk+O0A4PTQ1ODU7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wsWxtqiipaahoqu1paXSqGpadZWjra2clZignJuhop+cnZqWindpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTOz9XU1NHRzNDO09fW09XQz9LT0cnT0cfQ2NfY0djS19nV1szPz8nN0cvOz7/FwsfFzs3R0NHIy8zAysvF087LzsjEycbGyMzK09PR1c/SzNLBucWxpai1rqeaqKylnbKosLOsrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMfHpxc3RtYWNpbV9WUF9KSkNGQ1FNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr66qqqudpq64qKu319TV2dnRztDAvMzJt7+vp6upo6SxtbGvzaFaZJ+tq6KZlpiam52hnZqcnpN+cmVjYl9fYWBfYWBfYGBfYGZtcHBua29yd3ebzMDS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHG0dTK0NTV1s7S0NjY2NfLyM3DyM7Mysu/yb/HyM3Oz8vQzc7Lzs7Hys/Qys7KwsnGyczKy9HSzNPR0c/Qyr3IubCuu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHp2b3Bva2FkbnBhV1xaSUZGRE1XRTtAPDMzPD04Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PT9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snn7i2tbWtpa2uvrSwwNjS19rc1s/Ny8TT0MLBsaqtrqulsrG2vsyXWpCinJaTl5yen5+dlJaYlIlrXl5eYWRiYGBhYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHUy8zQ0dPKztHV0tXVysDKwcXMwsjJwszDxcfKys7KzczQzdPLxcjPzMjHysTGwMXKy83P0cbQzs3NzM/Fx8C3uL3Dw73DubOyvrG7w8S1qpilopmWkZWVkouUjZqRlJSPj5SCiYV4cHFrbWdgYHFoWFhoVkxGTElQUEI7RD47Njc6ODk6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc2Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXFw8G/u7WyscfCuMvV1tna29jMzc/I1tXFw7extaqjray4t8nNl4iajo2YlZCUkpGWlpaQjHxmYmJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytLIy87NxtHSz87M1MrHy87Px8fP0svQz8W6xL7Gyb3Cx8nOxMHHwMfNx8PLysvPx8PD0MjGwcXHxL7Ax8vLy87CysvIx8zQxMXHu8fDyMjCz8G9vL+wwcnHub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd250ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vbrNzcfQ1dXZ2tvY0MrP0NLUycS5vb6vp7eqvbnOyaGUjo6Xj4aDhISCfoWFf3RgXF5eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsjGwsPAw8fKycjKyMHFzMbIy83JxMLLycHCy9DEy8i/ucG7xce9v8bPy8O/w7vJxsi7yMbEysC9wcvGxcS+xby8v8PEy8XEvMDJwsXH0sTAyL/KycbHxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhpZqjoJuUe3ZzdGZpWmFubVpbWFJETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMvP0czHwsPHzc/PzNXQ1tnY2dDM087P0MrDt8bAtbW7sL+20rORjJOYh3qAhYaAdnh1cnFfWltdYGBiZGRkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsLa6srKzsrHCvLy8urjAwcHFvr25vb+5xMrFxsK9xsC4u8TJv8LJu7e7usXDvrzBzcPGvr61wb3DurzGu8K5s7zFxMHCtr+1tb2/usvDvLW6yLq/vcvDwcXCxcjGyMbQxsLMx7LHycPOzcHFw8C9srewsqeoqLmwpa2wq62slHl2d2pkZ2Bob2NWXllKRkpGSEpBRUJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfGw8TIztLLysrHzc7P0snRxtbU1tjOzNDHzMjKxL3JwbG0uba5tLuTjYqLhXmAhoaAfoR8dHVkXFxdXmBgYmNhYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLS3tLKztLq1vrG3sLWvsrvCvMHEvL+6tbO6vsC4x7m0u7bAwry4vcbBw7u1rrK2ur60xLe7tau4vb2/vbC6tq+2urLFvLauu7+0trTFvb7DxcDDxcbIy8XAxsa7yMu/z8rHw8bCw7bDvb22ub7Hv6y1urW3to54dHhmZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy87IxsnOzNDMzsjLycvKy8XRztPQz8fJxcnEw7+8z7yyt7u4tbSbjoeJiXt5foaGd3iCfXRoXl1dXV9gX2BkYV5kZWNfX1xbXlxdXlpbW11fbHBtaGZqbW5yfKTHv7i4tbCrrKeeoqqnnquss62pq6m0rbawsqmupqyyvLq2w7m6urGrtbm7tMK6sL+xvby7trzHucK2raqosLG/tbe8r7CnsbO0u7yrrbWlrrauurGwqriwrbuuu7i7v7+9ucK/x8PFwbzGwcjLuMXHxb/Gw8O5xMbCu8bJzMuzucK8urKIcnZ2a2lhYmxoWVhXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxs7SzMPGwsXQx87CxMfAxsbExMvCysvBw8DGv7i6usm2s7m6s7GpkYmPkHx5foqGenuFgXdvXl1cXV1fYF5fZGNiY2NiYF9dW1taWl1aWlpaXGRub2hmZ2lrbnKBrbmwta6mpaenmqCkoJqcpauuo6eiq6qsqrCkpp+qrbW2sb25r7evqK63tLS8uLS8r7i5tLG8wbHArqWooquxsrOnvKqrqKusrbSzpaitoaSuqbKlp6itpai3rLCyt7m6u7G7vb6+xL+1wcDHyLe/wMS3xMK/u7/Ewr7EyMzKv77DwMCphnJ0cmppXWFvZFdWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8XR0M3EyLq6zMLMwLzKuL/FwLvLucLFxLi7wbu3tbvDtrO1tqmtlIOJjYF8foB+eHR/fHN3Zl9dXF1eX2BeX2NjYWJgYF9eXVxaWFpbW1lYWlxfZmtmZWdlaGtvcoWqpaymoJyhpZSdpJuYkqGjqqOin6Wlp6Wsn52bpKassq+2t6ewrKeqtKq0urG2ta22ubGvurmxt6Sfo5+msaerqLmqpKeoqKeyraCnpp+bpKWsnp+npJ+gsa2trLK0srSwtby2u8HBsrq+w8GyubnCs8C9v7W4u72+vMLHxMLDv7/EoIN3cGthZl9rb2BVWV5ITmdPVEdFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzc4NjY2Ozo6Ozk7Ozw4NTk8Oj4+QDuNyLW1vbi6wLq9taCelJ2hprq2q7Ozu7PE0MnLw8e5uMnCzcC5y7m8x7u1x7q1wsSxu8O5s622vbisr7GpnoSHh4J9enZ0b21rampxaV5gXVxcXF5gX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1viJ2poJeVmqGWm6KYlo2eoaKmm5+fo6Whp56bopufqrCtsbWiqaqpq6uktLmtt7CssrWusrWusKqfnZ6jorKkpqm4raKmpp+orKqZn6CemZ2fpZqao5ybna+pq6eqq6ytsLK4r7i5u7C2u7u6q7OzubO9tLaxsbW0v7a9wL3Dwbq7vZeDenJrX2VeZGRYVFhdSVdcS1BHSUlGQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xtDIycHHvLzFxM+/u8m6usG6tMS3s76/sb/BuaqmsbazpKyto4mGh4B5c25wbmtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3KNqJ2UlJSbmJuhlpaRnKGiqJ2bnaWmoaWcoKCamK2ura6yoKWiraumobSwsbGsqK+yp7qzprahop6bo6Gto6Gptaqio6adpaajlpiel5manZ+al52dnJysoaumo6Smrauzs6q0sLKqsrm0r6mvsrKzt7Ouqayusriwura5vb+3srGUhXl1ZV5lXltZVlNaVUtbUUxJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+znaWjmKWxwrW2va20uMLNyMfBxrjCwcjPuMLGv7W8vLXBubW8vrO4vLemo622raOrqJZ9hIWAeXBydHFpZmRoZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYWFhYVldhZGVjZGVkZGhqdqKclJSPlJaXn5eZlJifnqGclqGhqKOfnqmcmpqqpq+wq5ujo7eqoJ+uqLappqetsKO3sKS3n6KbmJiqpqGarLiwoqGknKKgoJOVoZSVlpuYl5aXnJWfqZ2po6Gdo6qqsK6otKuqpq2ysKWqrrKxsLCur6anp7KusbSvvLS6t66jlIF5dWReYVZZV1NSVEtNXkxQS0dHTExFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp2np6Oqu8C9wLmutLjCzcnGw8S+x7nJzbTDxMOwvr64vr+4vb23t7mzpKOtt6Gimp+HgH15cmptcnRwaGhlZGdiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dWW2NjYmJjYmNkZmqBlpOVi5GUk5uZnJaWm6Ccn5Wgn6alpKannpyfpZ+qr6afoqO2qKChoqi0oaWnpK+lsK2stZ6gnZWUqaGilKyxsZ6io52dmJuTi6GUkZOXmJKXl5iWnaabpqGimaOlpaukpbCnpaOrq62mqK6vrquoqqmzpaarr7Sxrry1sa+voJJ6dnJkYVxaXVhOTFJIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxt6yepKett7u8wcW6sbm1xcrLwcTHx8i3x8W0xMHIrrm6wLrAvr+7ubS2sqKjrbGZm4OUiIB3b2RiZ2loZmhqZ2ptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRXVlNUUlVgYF9gYV9gYWNkaYGTk4iQjpSSk5yUlZajmaCWnKCloa2lpKOio6GbqqulmZ6lsamgoJ2lq56noZ6sramorq2ioaKUl6ObnJCqqLCbn6KfnpeZk4qekY2Sk5WQmJiTm6GinKSgoZWgoaSmm6OrpaKkqqSrrqWtsqmmpaamtKapqK2ztbS5uq+qrJ6LcnBvYFtXVlZSR1FPSFpcT1JJVEtTTEVHSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4Njk4OTg5OzlAOXu1tK20u7Kvq7Gtnaenr7m5s8DIurXAr8bJzbvCy83It8u/s8DGy6+0u8W5v8XBuruztrGgpqupl5KBjIR8dWpqamxoamxta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV5eXl9fYmRtjo+EkYeQkY6Zk5SSnJqinJugp6iqqKqmqKWjmKSupJSZpa+pn5uZm6Cer5mbqrOfpaafo6OhlJOblpaSqaqtmpyfoaCalJCMmY6LkIySjZaVkJ6hoKOcm6KVm6CioJiiqKOiqKugq6+krrelo6SirK2qqKuusreyvbWzq6+Yg3NzaFtYWFJVUkVYTFFbWU1VTlBMUFFJTklCPD8/QT88NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s66os7auqaevrZupqKy3tqy8yru2v6zMx8a5ws/QyLXGvbm+xcuzr7vDusDCwLq+r7SroaWpppePgIF3eG9uaW5ubnBoZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVVFNOUFFZWlpaXVxcXl9gZH6NgYt/jJCKko2XkZeZoqCbn6qppq6qp6+jp5mfrKCVlqSop52XkI+anq6Wl6eqmZ+clKWhnpKQk5KTlaerpZqZmZ2dlo2MjJSGiI2DkIuSlZGgnqCjl5WflZqgop2Tm6Wlp6iooLGwprG8p6CjrLSqrqewtLC5tcCxrbGrkH1xcmJWVFZOUklHVlFSUkxMWE1KTE5SR01LQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIxLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OtprG3qqaisKudqqepsrGktsa0ubqzy8a6u8LL0cyzuLq+wMTGtLK1u7C4ucG6va2vqayoqqWVmIJrZ21ucm9xa3BrZGZnZV5aWVpZWlpaW1paWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domNh5CKmImUlJebmZ2omp+ppaSqnaeYoKWbko+eopqXloWEkpqjj5OinJWWlYeimpqTi46LkJqkp5yVlZebkJKHlI6MgYuNgJCKkpKSoZqfopWUmJiVoqWZjJikpqimoaC0sqezt6Gdoresqa2ksrKmtbu1q6uxo4h4cWxdTlFRTE9DTU5OUEtGTk5KSk5NUUlNSkFHS0hHQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSopLS8xMjc3Njo5OTk5ODQ5ODhBN3e2p6S2sKSno6mloKmlpLOqorLDtbWys8fGuLvEys3Hta+7v7e6w7KxrLShqrLAtreppqevqaqZkJ95X2Bnc3F2cWpuaWVoaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhZWFtdYW9zdnGFiIKIgJGDjoqUkZOdoI+am6Kho5iklqGblY2HmJqMc42CfY2XloWQmZCTjo57mY6cjIKKgImYn6KekJOYloSOgpN+fnSJjnqQh5OQkJ2amZqQlZCdjqKjjomaoKGjo5uitK+sr6yfmaW4pqWwobCunLC7qqmvqpmBdnJiVU1ST1BNQ1NOTFFNQlBRSElOU01ISkpDSkxGS0s8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTE3NjQ3ODk6OjY1Ojg3QTd4t6KjtKilpqijpqWmpqazp6W0wbivtLDKxbi6wc/Gv7SuvMOusMawq6WqlKGrvLSsq5ujqKelkY6ab1dXYGhnaWhpbmNqaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5Yco+Cl4aNnJeLk5Cfl52VlJaUjpaJf5OJXztXb3uLlImAi5KMj4WGc4qEloF5gnqFlJ2Ug5aOkI+Dhn2SeHJvhY1+iYGRjY+XmZiTio+JnIeel4eIlp6aoaCXp6+praionpets6KmrZisq5intKKpraOSfXJtX1tOU1JWTERUSlBNTEZOT0lGTFFNS09KSU1QRklJPDc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCgrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepp6KpsKintMG5sLWwyMO4tL7PwLqwsLfEqq3IrKWgm4WYn7eqo6OSoaCfnJGJkGZRTVJWWlpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1waXuCdFBCQX+VkZF9iZSMhIqNmo2VlYqSiIWVhniIf2BKUW54ipGEfYSNiYV/f25+f5R3dXV3hI2ZcFGNiIqHfH54k3Zod4WHfoqIlYqNkJGWi4SKiJSEmoyBhJKblp6clKSjqKmlpJ6bsKqhpKSQpaqWoamcoqaoiHRsZV5bSFFRUk1JVU1TSUxLT0lIR0pOTE1US1FRT0ZIQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKiosNDgzMzk3OTo5OTo6Ojo/OXe2m6KnnZ+hrqGnqKWnqK+tqra8tri3s8K8t6i6ybm2qKm2t6y0v6mgmZGBjZeunZ6ViZuSlI+LhYZiTUxOTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+HgXyFjJKBkpmLj3uGj4B1f3hzbnVwdI2NgXl9iqqFeXpodnuOcHJteIGLjJJ4eoB7gHZzcpJ3Z3WEhISEe5WJiIqMioB/hIuMf5SDe4CPmJWclZGfnamen6CdoKmln52YjKekk6Cflp6epH9yZ2BcXEpWT1JHS1hST0pNTVJKSkpNUEhMUUxSVE1FSEE8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5NDc3OTU2NzUyNTI1NzIvMi4sLy8yMDAvLSsoKCkuMTM3MjE5ODc5ODc3NTo8Ozd2rpijoZicn7Spr6mlraywsaq9tLK7uLa7tbKgt7uzq52eraqqs7CjnJOQl4SSoZSaiICUhouFgYJ9YktJSUhHRkhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUlNWXnWDfXlnd42XmI6PfWd5gXZ4gImPfISYkoFyh498dntva36tfHOQin97hpKBfX90ZnZ8hmxvaHN8iYyHgGx5cX1wbXWPcWhxgH6OcEOKhIKDhX93d3qLhX2LenV+jpKPmIqSmpujlpmcmp2eop2WjYqlm4+el46WmI92bmxlYlpXV1RRSlNVVE9QTlFWS05LTk9KUU5ITk9LRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXn5+WoKavrK6rp6mxr7GrvLisu765s62om7GnrZyQlp2mqqWimZuRh5R9jJOQkn15h3iCfnt7fGJLRkdGQUBDRElMTE1RUlBRU1VUVFVWV1dXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXlie3hufHmIkHl8i4VvbYyReHN4amqAgnKWkYuBfZaASZKYbmh4foJsaWNseYWQkoZrc2x8bnJ7hmhtcH9zjYmEhXp9fnt2b3RzhYJ5gXdwfI6MipSDlpeYmpCTlZaZl56XjIOJn5GLko2GkJZ+bWhtbm5XVVdUUlFZT1JVVVNYVU1OSE5KTU5LQ0hOR0VAOjg5Ozk5Oj48OTw7Ojo9Pjo4Ojs5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDQ1Njc0ODVIQTg5NXeZkZuZmp6lrbCirKqota+urLS/q7zCv6aimpWlmJ6OhYyWoqKZmZKVjXWQfYOJj4x6dnxye3ZydnlkT0VHREA8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX5wbX96i4l2gYiGdGyakXRze2prnY9NeYWSiYSOZzF2hnNsfn6DdGZldH6EhIWAZmlsdWtwf3xncHB7bpONjntzfXxxcG51bYJ+d3l0aXmJgoiJg5aTkpCLjZGUlI+XjoB5iJeIhoqGgJCHdmpqbmdkV1FaV1lZW01QVVZZWU5JSEVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCs1Nzc1NDc4aU84OzVukoiZkZqWpKiunrKfprquq7KwwrG7w8eblo+VmYuNhnqFkZmVjpGNkYhziIR3io+LfnV2dHZ1bXdxZ1VGSUQ/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+zoHF8eG19bHKDgYWBeoSGhnlyoJV0eIBzdZSHNXGdqJ2OoaGEooR2cIZ8h3xzjK2NiYBoZmJpbnJtcIN1aW9YdXCOmpJ2bH97fW1xbXCAenN2bWJ2hH+GgIWQkYqLipKLkYyLj4N1eIuPgH6DgX6PenFwb2teWlxdW1lYYF9TTltaWVhMSEpFSkc/Q0FCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ6kp56vlaW1qa2xrsGyu8HGl5CMlJCBiX1ugpGSiYSLiI+HdoOFbpeKjH95entxe3N8am5eSlBHPkA3NDQ4Ozs8PT5AQkVJTExMTU5QUVNVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8fYWDf4x+dqKZeX6GgYWZhJucYYaqn52KgpCNenaIfomIjnOKl4+De1xkcXR6e3eKbGdpYXlvhY+Cem6Bd3SEenB0eXdrbmldd4d9h3yIh4+Ai5OXg42FjYd9cYR/hHx1d3t9iXVvcnNlZl9bWl1TW2ZeV1FVWFxWR0pKREtHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyNeIqAlIySnZ2fppGgq6CxqK/AsbrFupaOkZSIeoV2a4CMkoN+i4SPjXmDgnSiho1/f4KBc4OAfGt5bFNXTEBFMjExMjY3Njg4Ojw/QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxxfI+MenyJhn6Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkaiHgJiYipxzbHyBhod9jmhmZ3h+boWGgoVxhIVHa4B3cnl2aG1rX3Z9g4h/iIWMepWenIqLiJF/e3WLdnx3bW93fn9ycnFqWlxcW2NjWGdlXFVQUFdZUERMS0ZOSUNGQ0NBQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NzU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehXR8foqFiJGPlpiSl6CdrKGmuK+zvbOXjZKLmIt9dHB/iZN/fYyDk5V9hn+HpYiJgYOIhnmIi391hnlfY1ZLQjYwLi8yMzEyMzY2ODo9Pz9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzk0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYGEgoWRk36FiZGBmpWCoaGXlZuapa2Tmruxp7vHw6iLjKGljpOJgZB7coOdn5GcfnaFhYqPh5BpaG+DgHSMhoSLcYaCd4eAe3aFfW52dWeAlI+GiYiHiIehq6KWiY6Yf3uCiXp6b2dreH14fHFpY11aWV1pXGFmX1pPTE5YUlFJUEtETkdDS0RDQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnVwZ3iDe4CMgIGQj4uamqScoaymq6+wl5GRhKGUhHh3gI2UfX+ShpOWf4qAkpuOhIGCjIuCio6EgIqAbHBqXUNBNC0tLy8uLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jKGemISShYKPoZ+TmJKEioWPmJGWbHB1iYuBlYyNj3aPhHFshYGKlpKDhYhyiaGWhpOKj4+WpbWpm42VooOHk4R+f2tqa3x+fn9xX1xiXllmalxsa15YS0hPU1FOTUxGSVBDRE5GQkNFR0I+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuaFlwg3B1h3F2koZ+l5aalJ+fnKegqpaTmJ5nZaSafoWTknqAkYmRkn2KhZmSkYOAgIuNiYaRh4SIhXh4f2dNUj4vLi4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFSU1FOUElFRD47PDpDRj8+PDg1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZuopqKZoZeilZyfqJ6pq5+orKmqtZerv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGampmnkZGIlaKamnd6fpSXkaGSlpeBlJ57dpWSq7OJjZegfZSenI6Tlpmkoqa2sJ2RmaiIl5COgYhsc3N7fXpvZl5bX15gZmNgZ2dcUkVLS1BPSUpMRkZNQ0dNRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcXVgbn1id459fJSOjoqfkpeelpyqmJ6qQkR9h4mHmI14go2Ljo17ioaPkI6Cg4CJjIqFk4WDhoiBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49R0dBQUA4NjYyPDk7RkhHSUlNT1FZbYaQd5WLo6eqtb24pa6srKeotKyxt7Kyrbuxs76cs8Ssu8nLuMS/uKWjsLKsraqji5aYhaamoKKXgqaZjaKqqKSHhZOjoKCqoKSpjpyxi5Wjp7e7m6CjsJOjnaOekaSiq6+ts7WilaWqiZqKk4qVent+g3xlX2ZbZGBdYmNeZmZfW09ESkhUT0ZITEZLSEVGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljWGpwWHqFdoGUhYiCm4OSkI2S2sidlnNWl4iPiJyPfIaMj4uKeoiCh5GOg4WAi4WFiJKGgoSJhoeHh3FuYUBFNjQ8Mi8xMTAtLCstMS8tND9EQU1VUVJUVVVXVU1bUEdHRDw+PkZIQ0RANzs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHIxKuzxbass8CzuL62v7TBtru7pLjGqbbJx7a+ubSoo7StsLGbmZKan4inr6qklHafpJehq7GzmJapraiutbuyuqyvtaKxrLG1vLe1rrWgp6ejqJupsK2yuri4p5y3qY2lj5KToIZ5gYFzV2BiVGVgYGJfX2VfW1RKREVMVlFJSkpESkhFQUBAS0RCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxbWlFjZFd6dXGClH2FhpN2hn+AjXu/u6O8grSUk46bj4SIj5OJiXmHgIyTjIeFgY5/gYmPhn+FiIWKh5F6eW5dVkBFTjw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFdPX1VJS0pBQD9HS0ZFQzs+QDdENz9CSkpFR1dUUF6Ppa2jsbTDtrjBzMq2u8S9s7TBt7jCtb+wt3SxtKa6xaSwxrmxs7G0qKS1tqqxoKKWm6KRpbGtpa2rp6SYoKyzuqKosrm1u77Mv8XFvb2zwre6uL+3ure5ra2xprGqrb6wvbvCwqyZu6iVrY+YmKqJfoB5aVZhX1dpY2lkVVtjWVZUSUhHTFFHRElKQUhEPj9CQktAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZRTEFMUldUWlZad2pwf4+EgY6FbnpzeIhiuKGao4mVlJaTlJONkJeSh4d7h4GNlYqAhIGKenyLh4Z9ioKBi4SVfXh6dWVPXGRHRUw6UWRhW15TRj47SFBEWmRRUVlYWmdaVGBhTVNPRUE/SUpIRUZBQEM9RTZCPkhHS01TWlRelK+4tbq5ycC7vcrMu73Au7e1vLy3vrW6ssZgdbKlsZqeq76qpairqqSisrWgq6ielZaemJ+upaempZ+kk6KnsLOosrK8tsG908nJ08bCxczCysPAvr2/u7y3tLC5t7fDusa+w8mwnrqqoqyPpai2iYB9cF5gYFxWYF1nZVJYYVZSVklFRk5LQD5IRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzM1MjY/OEA+R0tSVFRSUE9RUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWdtbHGQjYWQc2xzcnOI1cC1maCNlZmakY6XkZaWjoaHfYeDjZaLf4N/g3h7i4SHe4t5gYqCl390fXpsZXB2WV1cUGVlYmBlZF1bWFdcTWRtVVJtbl9vX1hnZVVZVEpEQUtLSEZISEhIQkk5RD9IS1RUVl1aXJO5wLm9t8bAu7nKy7u3ura4ubO4tbWutraZZHWpnq1wXqKtnJihopuknqullJ+fkJSPlpiXqJ+ln56amYOknaykqrCtt7C8uNTQztbPyczSzM/OysfAv8LKvcG9wsDFxMbKv8nPtKS7sbWwm6y5vZp+eGpcX1tYXWBYYWJRW2BTUUtDQkVGRTxARj5CSUJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaWBvl5KRlG5sb3R1h7OsoaGfi5mcmY2NlZGbkoWKin+Ih4yQjIl8gYNze4qDhXuKdIKKhpV/c3t5bG11fGlzZWlsaWZqamlgZmlobVptdJetpLyHh2dbb2hdWllUSEpOUEpLUUxUUUhMQUpHS1BfX2JnamKXt8ewubO7vraxxMe2sLmxsLuss7Gnq7esjbannpynmk6bno2OoJaRp5illYqTk4iRiY+RkZ2boZiblZaHnpmmmqyvqK+ns7PT1NTW0cvP09TO08/MxsPK0L/KycvJ0sjNzcPR0rivxLzEuqa3u8SigG1iW1tcWF9XWGRZT1xXTlFDQklFQ0k7QUQ+QUg/P0I4O0Q+QEk9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OT05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2ZXc5CQmYNocW95eYOgqp6ml42bm5iLjZWRmo59iYyFjoqKi5CIfISCcH+HgYZ7h3KDkouPfnF5dWxweH9ye254c2xpgHBtY2ltcHlpd31+y7/C36dtY3hvZFthYEpQUlVOWV5QXV1OUE5UUVVUXG5ud4Nylq64rLSosLarrb3Bsau1pqW5p6yuoay0pI+xrpuYmIyRlJGEj5uBjaeRnImDi4SKiYSKg5OVmJeUm5GbmJmZnp6rrKSnoaysztLV0c3M0tPT0NTRzsjD1NHIztLT09bN0tHF0tbGwc/IyMOpv7jQnHdtZFtgXFVeUV1aT09UUE5IPkFHQkNGPEFCP0ZFPkA/Oj09PTxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNTk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WHhot3bXdwfX6AoZ6eoYuNmZOTjIyTkJaFeYWQkI6LioiRh3+Ce3J+gIKHeoV2hZORiYBwd3Nsc3x8d3xzgnhxa4BycmlvcXp5c3u+y5p+jLGDdnKFd2hhal1DWlpbV2ZkWGVrVFhdXWBjXmN4e3+LgZmqpKSioKGop6qxuaumtKOirqKkrqKnsZ+JppuVk5GKko6IgpSJa5WijZmEgYZ+kYODk5eti5WNlZmOhZKQnZensKKgoKSkqMfNz8fBy9DT0dTSztPNxtbTzdTY1tbY1dfVydTazcrY1tHKrcTDzIlxbmFeXVdSWFJbT0pHSklKQDs6O0VDRDxDRD5IQz9DQjs7OTw5R0M0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV+aXN5coKJgZ2VnpSFi5aJjoqIjoiPgHiDlJmLjYiIi4l+g3hze32Dh3eAe4eRl4GEb3hwbXV/dnh9dIZ8eWyHdnVufXaEdXl7nbWMPEGKxqV+jXxqZVdJQ2VjZmNoamRveVtfZmhrbmlugISIkYyen6CekZeYn6SkprKkpbOgoqWeoamgorGch5+SkpORi46LhoOPhH6cnIyNgoSFepR+gqqVo4ySipiSi32XipqRq7OYmpunnKe9w8W5tsXN0dDRz8vSy8nUz9HV2tfX2NTZ2M3Y287J2trS1r/MzbR1dG1jW1dRVFBYVUVGSklFRT06NzpAQUI6R0VARURCREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGJxcXOGjXyXkZ2LfoeSgomGhYqDiH15hZeXiY+Dh4WHeoR5cXp7hIZ1eoaOjZ16jHB9b3B6f3J7gHGEh4Bujnp1d318gnV/fIeJsHRZqsK3jZKBcG5jPV5ocnBxcG54d4JlaW9ydXhye4uHjpOSm5agloiMk5ugm5+qn6GtnKKamp+mn5+smYyajJGTjoV9iIeDhYuOoJmTiIOHfm2ZeYSZhoiTjI6VjIZ7m4iTj66qlJWXnpimrrW8qK29xsvIycvLz8jD0crU1tjX2NfV29fT2dvWz9va0dbI1cyTdnhnZllYT1JTXEdCRUlJPkE+PTg6PT87Pkg9QEJBQURBPj86ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmt2gIhxkZCbgHmAjn6DgoKFf4R8fYSYjoeLfoaHgHeCeW57e4eCdHqSno2hdo92g3R1gX10gIRvgpCCb5KEdXyBhXp2h3yJuMalw8q4gpacj3hwZU5lY4J6gXeGopCLeXl3e4N/fIR2bZSWlJWPmJGDiY+XmpeXppyYoJefk5KXo52Zq5aRkYuOkoOMhYmIgYaQkZ6cmYmFi4GFl3uIiZ+XkImOiouCfKGIkIu8oZiTl5mcqKalrZ6ntb7Av7jHyc3Oxc3K0dbV1NnV19vU19na29fb2tnYztzGhXh3ZWdjXlNWVlRMS0RNRDs9PTw5Ojw+OT5BNz4/QD1APjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdIUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWZhXVtodHp5bImNknd2eop8foB/gH2Fe36CkYqFhnqFiHt1fXVtfX2GfnR/kp6Rn4OSfIZ9eI9+eYuKb4ObgHSZhn2CioV8fpF7kKmOkMOgvYycpJx+ioR9iXKMi39zppqcmZSFe4+RiYRpR3GhpJ2Mi5CShYiLkZOVj52bk5SRl42MlZ+dlKGUko6OkIx+kI+Oi4SIkpaan5+JjJSRnZCCjH+mmYiFjoOGhICkhoqLuJidkZSWoqegnZ2do662urSrv8XK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbt3d2dWloZFVfWlJPTkhDTEM9PT45OTs6OTk8PTZAPj49PTk6OjszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlVYZm1tbWmBjopxc3iKe3t/fYB8iHt9e4uHg351g4Z6c3p0bYF+hH13hpuhm56UkoCMh3+Yh4Cckm6IqYV6oIt8kY+DiYScfpqRiY2jop+QpK+gi5GLhouBkoZXcq2Ln6ycj4OYnJCQjlyDopGCjZ+TlYyHiIySk4yUlZWQjI+KiJabnY+VlpGLk5SGgIuJko2Kip2XmaOihpOdlaCKioiOnJCDiI+Ag4eFpIWLkLOYnJKUl6GhnpmSm52nsbispLzBx83Hxs/Mz8zP18/R1K7W1dja2Nra19bZ2Z1tenJlZVtbVlJVVkNASUQ/Pz46NDk6Ozc6OzozPDw/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo8QDtCUUtLU1lQVGNieGxifpKDb213i3h6f3uBfYZ8e3aGhYBzcIWCe3V3dnSEg4V9f5Kmop+mopeKnZCUl4qKp5dyirKNhKeShJmUhZqMo5agmJOJm56ik6mwoJGVkI6OiJWLbo23hJrEyLKcoqWbnZiWkbKQZKTNyJWOhoeJkJKOjZOUioWKioaWmpuPkJSTh5WYhH+Pi5mIjpCql5eko4iZnpWaiY+Gl5iKhY+Ngn+Gj6WIjZOpmpeTl5mhmJ+Zk5yaorK0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6AcHxlYFtcXE1JU1hBQkdEO0E+ODM3Ozw6OD02NDo6PDo3Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4JHdoGPfXxtfoh4en57goKDf3Z2gIN8bW6Lf3p8eHh8hIeKfoujs6ejqrOil6efpaSWla6ig5G4lZGzmo2hoYylm7CjpJ2YkaeWqJmsr6SYlZaVkIuYmZehwI6jybmrm6OmrZmSm52ynYWFqKKcmIWJiY6VjYuTj4iBhoeJk5iVjIuUk4aVmIaEkZCcdZGYspaXpKGInZqSj4qQipebiYuWjod9jJieiZCQnJqak5iYn5SgnZSem6CxrqKkt760xcfEvcPDv8bNysnSps7N09LR1tjT0Ni6cHdzWl5TXlRPSElNRUJDRDU+Ojc3Oj88PDc9NDM2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdOW1xZSmZgO0iEi3p6boWGenyEeYGGgX5weHx+fW9yjXp+gnx4houJhoSSp7usqLK9r6Wts7Ooo6GwrIqatZ2iuKWVraSXqa24p6Wjn5qpl6mjr7CqmpmclJWRl6CYmru7rsqhara4q7CUmZ+jrJOXvaNeqrKDioqNlIeQfI6OfYOGjo+UlYiIk5aMkJaNi42XmJOdmbSXlaudi5yUko6RkoyZm4qSnpCLiZWfoY2UjZianZKcmJ6UoaCUnJ2lr6ihpbO4q8LIxLW6vbvFx8fC0aDGyc3NxNfW0cvToG54ZlpYUVxQTkVDPjxDQUI4Pzg4NT9HPTw2PDM1MzQ1NDU0QjM5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRHYmBicEo/i4p+gXOGh32CiXWDioJ/bXx9fX9wd4d3joKHe42PjIaMmarCwK+9xruztMC8tK2rs7aMqLOtrb2rm7ukqK25uKunpqKipKKpr7Kxq52cpJibmJeeoqalkqS6r6nAvK2tsrmlpah+iIacrbywg4yMi5CDjoORjnqBh5CNjZyJiI+XjYuVlpSRmpedqJqxmpGsnI6aj5KOlZCQlpeOkaCRiZSbpKyUlo+UnJ2ToZ2bmJ+hlJqep6akoqSws6fBxsOvsLq2xcTCv82mx8THw7zW0c3EyoZycF9ZV11ZTEpBS0BGRz5BP0I7OjU+QT09NTw2PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRD9DRlxlR2BpZ1pdXJOMi4h7h4yHg4x1hpGKgW9+e4F/cX6Be5V6kpSUmJCTlaezxsm/wszCw7nHvLuvq7m7mLO3urLArqXBpKuwvL2rrqujo56nq660sKqcoKqcoZuWn7C1p4ujuru2wbysqZyypaSplIWOqcTDpIKLj4eIhIaVlI16hI2Rj5GijIyUko+Jl5+Yk5mVmKagrp2MqpyOlo+SkZWVjZCVkY+hlIaXn6CynpSalJ+gmKSfmqCboJSYnqWjpqakr66lwMTDrqi3tcnCvrbPssS/xLyz0cnIwrRydmpZVlloUExIQkxLS0pBQT1DRDw1QUQ7OzM9OEIzMzIyNjJBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJlWU5lXGZUY2qZjZeKjIiTkIaJeYeUkIFygHyNf3iHgoKQeo6hlqiampi6vcfIycHSycrCzb3Cs628vqi6v727w7eswqmss7y+qrCqpKWkrK6zrba1oJ+vn6WimKOzvambqL3BpLa3sKyTsa2srZeHmqmnpZGCjJOllYmBdoqReoWNkpCen5OPlIyPjZWjmZaclJSjnqqfkaWajI+Pj5WWiHyPlZKSo5qVn6GctaWQnpelo6Klnp2mmJ6Wl5uko6mnorKsqLzAxK+lsrfMv7mvxLO7vsK4rcLDwsCXandgVlVaWUlKTElGRERIQ0JBREw6NERIOTs0PDdFLjEyMzUyQjI1U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djpeOnpKJin+KoJOEeIV/lX9/kIiKkICWoZmupqSYwr3Hw8fF083Ozcu8wrewuby0vcu8w8G2t7yts8C6vK6vqKCpqLatrqmyt5ueraKnoZ6rt7iqpbC/xbG9ubSoqrW0rq+XlqWsqKCRjpKyxaeVjn2SlX2IkpmQqpmYk5OPk5aTpZ6SnZmUoaOinJifmIuMj4+eiFqQlpeSl6WZZZijn7OllqGWrKypp5ueppeYlpeVoKSopZ+2q6q6u8O0pbO1y8C4qrassru5rqi4ur24gWlsWFVTU01ESlJNSz9BSEVESEhIOTVFTTs+OD1ASi4zMjAyNUM1NU9WTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs9QEJGQnBFaUlSZWJMRqWUm5eil6mWjZCDh6aTiIKHgpyDg5WQkJSPmqKfr76voca8xMTGxs7OztLKvru2sbq7u77PtcO9uLm3srG1s7izq6acq6y5qqmnr6+Yo6+kp6SltcCwrKy0v8O6wLq0qLm1ubOvlqWtrq6ki5OVoY10wZp9l5mEj5aajLGVm5qVkpOamqWjlKCbl5qpnJyhoJmKjZCWnGBKlpyalZqlllWXsJ+vnJ6klK+uq6WaoKWUk5iYjZygp6KZtKmqs7u7u6qwsse/uaasq62ysqOhsrK0pG5rY1pYTU9KRE9PUFE7SEtJR0lDQz46S1Q/QTo9RU0wNzU0NDpCNDRNV088SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiql5mgoqivmZGYh4uolo6Ik4Wfh4Sdl46doZujpLXItanGucLDx8rJyMzNxr67s665ucHBzLXHusG5tbqwr6+ztaekm6q0taqppq2smqSupaSorLq/qKy2t77Cv765tLPEsrm9rKOvtay5poibl6abdr+fhJmdjpOZmouul6GcnJeVm6ChqJ6nn5maqpmhp56YkI2RnYNudpKimpWdop6QrrKiqpSoqpeqraOjn6SokZGZm4eUnKKelrGnqau5tr2zsq6+ubego6eopaacnK2pqYtgY15eUElLRkdNSVZMPU1FTktMQkNEPFFWPUFBQkRPMTg9Nzc/Qjc1VFdOP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li1SYE1VSH9lXkhFq5WboZ+7r5mUn4yTq5uRkpOJq42Hop+MpK2Uo6O2xr60wLrCwsfIxcLNyMG+ubKvuLTAwsq1xbLBvLW6qqmtrbCjo5iqtLumqaarqp2pr6ejqqu+vKitvbS4vse8t7a4wbK+wbSptbervqWPopiSop+8n4maoJmXnp6Pt5+pnKWim5yhmqiks6GbnaacqKmemZWPlJuLl4mMpKKUnaKeobWvpaSTr6uZq6qdnaOjqJCUlJ+Cj56em5WppKGhs7S6ta2otbKznpyipZqXlZmqoZ51XlpdXElHRUZNUEhNRUdHQ1NMSkJFR0FWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkVASkpOTzlDQDU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE5ZlxGQ0OccGJHRaeXpJ+ew62bl6WYmqmclpubj6qWlaemla2smaKrtsTCvL63wcLAx8O/zca7vbmysLizv8LItb+wvLe5t6Wkq6ytoaGaqqrFoqSpq6aerK+roqmov7inrb6xuLbHtrW5uMCyv8K3tbO0r76jl6OWlJuUrqCQoaOlo6OfkL2kqZ6oq52doJuln72imaOfoqmroZ2WjZWek56Hj4SNk5+koJ61rKWblbGnma+mnZmqnJ+NmJSehI2gmpuSpaSamKuxtbGqpaqtrJyYoKCSjpCVqJ6UZmBYX1xOSEdKTktIRURJQT5RSUE8R0lIW1JPSz1IT1U0QkY5PkhHNUNhW0tDTlJVV1ZRWFRSVUlAOFJRUE06R0E0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNDZAOTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROm1SRjxLeGViVkyimqOcnsWsoZ+snp6uoJKjn5aln6aqrJe2saOqs7bExL2/tb/Cu8jCvsrHtbi1tLCzs7fBxba+sbi1uLSfpqyqrJ2dnqWkwaSfqq2gpKmtr6KmqL21pbG9uba2xLK0uLq/s8TBuLius7W1o52llZGUoa6gmaKeqKiro5rCramerK2bm52ZpqC9oZ2kmKurrKaimY2an5KfiY5Xf5afpaGguKqmk5i1o5+xoJ6arpadjZiTnYGOn5eVjqKjlpCmrrKrqaGhpaWVlZ2Yi4+RkqSeiV9iWGJfS0hKSk5FRUFHSz49SkI5OUpKTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dyR0U2PXVlXEtOnp+hmZ7DqKWitKKdsqiTq6Wgo5+tqaydu7CorLaxyMXBwrLCw73Gw7zEybyvsLatsLSvv8S0ubGwubSsmaiwqaqanaWhqMGsm6ywnKqjrrGppKi9tqe3u76vt8SttLPDwLPHtLu3q7O2raqippaVlKSsop+fmqirsK+vu7KmoKmomZmXk6KkuKChpJOvr6ylp5+SoZ6Vno+QjZWemqKep7SmpoyYs5ujrpmdm6yQnpOVk5l/kaGVj42foZOLpqyvpaahnKCekpKak4WLkY2cnX9fZFpmZEpJTEpSQkNASUg7O0c/OTlPTVVeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ+joJygw6mkq7OhpLSqlrOsp6KksqyuqbuxrbC1tMbAxMO1wMS9ycS1v8jCtKu1qK+4rL/Ds7eurLa5pZiqsquqmJ+ml627tJunsJutoK60sqerubOourS4srnAqreyxL61xqi/r622tamnrKGXl5GmpaKimJilr7iusrW2oJ+opJqVlZOkoLeipKWWr7Gyp6qmop+bmpuWl6ifoJihnq+yoqaMl66YpKqXmZ6kkZqMk5eZhZWelIyPnJ2Ti6ipqqGnoJielYyOmY+BhZWIlJ53YmdcamlMT01OVD1DQU5DOjpJPzc3Uk9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJcGhWQ1dGjHlmQzuko52ipr+nqK+woam1q526saujqrS2sbC5t7C3uLjEvcPHvbzEwcbAuMDFwLqptqSsu6zAwre3qayxuqGUrbGtspalp5GquamfprCdq6CwtLOqqba2rbyts7O5t6y4sMO7vr+mw6uwt66pq6unnpiZq6GioZGXobGvs6ywuZqcqaCZlpKXpqG2qaWjorCxtKuzqKyfm6Cgm52lnKKXnaOzsJqfj5Olmp+ompOinpSXiJOWkpWWnJOIkJqZlI6oqKafo5uXm5OGjpiLfYyWhY2ZaWdrYGxtV1BRWlRBQkVUQDs7SEE3OlhQZF5QVldFWV9dTUxSTl5LSj5aY15OSFBPXFVZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT0qJys9XHA9PjEuMGRaZEAxNjQ3Z1lgRig/OGx9Z1tWO4l7Y0M9qJ+doqq9oquwq6OxuKqltrSsoK21va6zuLu6vba2wMK/yMS5xMLAwLjEvcG3r7Wnq7exu76+tKiusbaelquuqK6XpqiOp7ufpKyznqyisbCzrKq2tLW+rrCxtaywtbLBu8W3q72vsbisraqjsaaepaqfpJiQmZ+zqrOrqrOanaebmpWOoKaltK6noa2trrGntK2yqqScn6ijnpWhmZuotamWmZGSnpmdn52Pq56Wl4SUloqdmJyTiY2Wl5qXpqWioJ2VlZeTf4+UhXuOkoKLlWRrcWdvcV5GWWZWREJNWERaOUhCNj5cUWhcTlldR1teXU5NUlhkSkpDXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2BVMTUwPWBWXjgpQzNZVFxnSzaMemZMQKSaoaSstqWtqqavrreqr7W7p6axt8W3sbe9wcK1tLrEvszGucLAur65w7fAubG0q6m6tru5vrSprbC1mJinrKqsm6urj6u+nqyusqOrn7Cts66utrK5uKqurrGota+0vL3Ks6q2tbG0sK+nobOgm6itoKaWlpqasqKtoKWvl6GkmpqSjqOmqLOpoaazrKq2pa+xta+kmZ2tp5qYn5qZq7eil5ORjpecoZeWlKuempJ/kpeMnZyZlpCKlJKemaWioaCYlpGTlXmKj4V7jIqCiZFqbXdtdXthRWBrWUlIWlo9e0pGRDZBYlRpW01cYUpbXVpSUlJiYUxLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENfUVwuKkIvSkdQW0gzY1lVS0SZl6GxqLGqraakr662qbe1uqSstLfJu7S6ur+/tLO3w8DMyLzDvLe+vr+3vryxvK2nurm3tsK2qqywt5SWp66rqKOwqpSvu6StsbOnqKOytLGysbWxuLOprquyp7evtrTExraptrassK2pp6O2oKCnsaGklJyZlbGep5ygqo6pop6blpimpqW4p6OytayosqeusbaspZmgrKibnJ6clKm4nJSOjoqYm6KXj5iloJyUgpGVj52bl5aViJaPmJqnnKOgkpaRkJV1hJCHe4SBg4uKbG92dHt+XEtlbVxLTmNcP2J7R0k4R2dXZVxMXmJNWFlXVFdUaV1PT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydHYkxWJS1CLT1FTFE8M3JrSUNDkJmlrqWtr6uopbGztKu3sregq7W5ybmuwLvCuLOxtcLDzsXAwb20vb+/ur68ssSnqbmwtra/vK6rsrGboKexraalr6WdsrWsq7GyraqptLustbO1rbSsqquorKm5rbKxyMC4pbqwqa2tpaiusKalo6+kqZydnJuvmqOjoqORrJ6joJ+iqqamuaSstbalq6yora+2rqOeo6mqm6CampKks5mOiY2HkKGglIyUnJ+SkYONkpKdmpeVk4eXkpWZp5ufnoySkY2Qdn2OhXx7e4aJiHBycX18fVxTZG9eTllmXEZElltHO05tWGJbTGBiTlZWVVdUWWddUVJMY1paVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOzYqSGVISis7SD8zQkhTLD6QaztHSI+cqquiqrGkqaWztLG1tbKyoquuvcy6rsC6x7G0rbTCw9HFxr7As77Bwru+t7vEp6y3rLO4vMCvq7Gsn6OnraqopLCkqrKqr6ywr7Cuq7O8p7exsqmzqaulpaOtuqyqssO6tq27qaioramosqWppKOuqqiinpyjrZWlnpiemaydoqepoq2mpK2ruLKyoamioKyvsayeoKeoqZmkmZmPoKaXhoSOiouen46KjJWbjo2EhpCUn5yUl5SGlpSTl6SbnJyKkpCNiX5+h4V8d36FhIVycXCIdWtfWmBuY1FzcVxLO4R8Rj9XdFhhWk5jW05WVlVXUVxiX1NPTmdYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMjU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLkpnREY4PEIwNUVLWDFAlVo+TEWVmK2ooquznKqqsLatubavq6arqr3Ju7C9t8KvsayzxMPOz8O/v7TAwsO6v7PIw6uut62yuL++sq2tq6SnqrCpp6ixpbSuqrCurbKxtKy0vKW4s62srqern6OesLerqq27t6W3tqSqp6yrqq2hqaemsbKkp6WhoayXqqGVm6CmnqSiqqSto5+nsbiurqOmopuqq66pnaKlpKSZoJqWj5ickoGCj4iFnJ+Lio6LmI2PioKLl6ObkZCai5OSkZOjmZuaio6Li3yGgYGDenR/goB8cnWLpId4al5gbmZXZYdjTj9nk0xFYnlXYllSZVRNVlVVVE9cXWFVS01oVlVXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjM5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxCKzpKT140RIY+SEZEl5KwpaOrsZirqq22rLayrKasqqm8wMC4uLO7taayr8TJy9G/wbu5v77BuMG5wMStsbWxs7q/vbKwrayqq6e2qqatr6q5sKixsq6yrbeqt7entLerrKSpqpyjnrOzqKiktLWgt66gqqirqKunoKusqbm2qaqpqaKqoK2bkqqhnaCkoqajqp6dp7SvqKaqoqOYpaenqpyjpKOgmpigkY6PmI1+h4yHg52dhoSKio2Nj4uChZSimo2MmZCSkY+Tn5aYloyLg390h4F+f3h0gn55dn6Ah52Pb3FnZ3F4XGFziGtPXplWSG14VWRWUWNPTVVUVFBPWFtiVUhQaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg+Qyw+TFRfL0ppNU9EO5aOsaGmq66arKWtsLS1sKymsKqpur67wLCuua6ht6/Ix8jRwL69u7zCvbrDwL6/rrKysbW8u8GxsbKrs6iktKilrbOzubGjrreysLK7q7qvqq62rKqeqqyfo6C2raihn7CzorWqnqinqqOqoaKsrai9r6yurKKoqKCsmZCwopiioKennqebmaqxqqOgraKhlKOjo6eYmqmlmJiYno6Kh5SHfYyGhIOjloSBgYuGjYyQg4OToJaIkJyQk5CNkZyUl4+KhYZ4dIF/fHV4eX96c3N5Z3+GpHVpXmRrgHRniIx9U1hwXkp4c1NlU1FeTU1SWmZOTFZZZFhGU2lSUT9DTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNSkoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGc6NDhfPWFkP0YxQ1BbWypITTlVQTSQj7KhpKaspKekrae1s7GrpbCnqri+wLyvp7mqpq+wycfI0cK8v765vr+8ybrAuLCvtLG6u7fAsrO7rLisorSnp6yytrmzqKi9tq62vrC9p62staytnKmvpKClraunnJ6rs6W0qJurp6mjqZ6kqaipvay0r62dqqShrpybs6OVpJylpZ+km5qpq6afm6qim5OcoaWemJepqZKYmpSQioKPhX6OgoCHnY+Ffn2Lh5CNj4R/k5qThZKhjJSRi5GbkpWHiX5/cnt6fnxoeHx6dG9we2eEeISIZGFnYXGEem1neF1dVUBXem1UYVBSWEtMTnJ1XUhaW2dZRVVmUEQ+Sk5EQ0E5SEdLUz9qYUpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEnLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mY0FKN0dTYFUqPTlEVz4qj5SymqCgqaaloauluLOzpqqxp624wb21r6K4raiosMLJyczBtr3Atbe/uci1wrWzsrWyvLe5vbWtuba/raGzp6ursLW4tayfvr2qs8G0vKGvs7Wqq5+tsKOcpaiqo56bpbGnsKCfq6mooamcpKihrbuorrCtoKujpK+fn62ml5+boaOcn5yapKqjm5ulpJaXlZ+ilpuXpqyMnpGRkYuCioCAjoB7mZONiHx+i4aPjYuKg5KYkYaToomSkoeQmo+TgIh8eWx+dnl4Y3t6cW9vcXZngHNqg2dkZ19sco1sYWlvYG8+WnhrVV5PUVFKSU1UWVdNXV5sV0RYYE9eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTY4OzIoMDkvLDQvLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDFBaFkxM1M9ZV9ETDZLVmRPKjsyTlg9I5OZrZqgmKeko5+opLiwr6OvsKqruMG5s62fuK+rqLS6yMvIv7bCvrC0vbfEtsOxrrmys7+0u763qbm4vauktKipqrGuurGrnLy9pbDBtbair7e1pqensbOgnqSlp6GlmZ+sqKmeoKqvp6CmmKOpoLG5n6Owr6Gsoa2knKanqZqam5+klZydmp6pppecoKmTmZSYnpOZlqGqkZqIjo+GfYd+go19fKCMjIh4gouEiYuLhYeTmo+IlZ6IkZWCjJeMkX2Fe3NwfXF0dGB5eGhucHBuaH1xY3ttaWViXmSFfl9acmpxS0p/aFhaTlBMSkhQUlBJTlxfblNEWFpSaE9IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy46OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPGZkMjRNP2VdRk89UVpnSCo+MFhWNSiXnqeanZasoKChpKK4q7KltLSqqbnDtbOtn7etrq2wtcbIwbe+wbmxtLy2v7u+r6q9sLO+sbzCuam7urenqLWpqKuxrbOxqJu+uKatvLeyn7G4sKilp6+xm6GkoKSkoJebr6ehn6Oor6GgoZSkpKK3sKGmsKufrKOvmJyqpamel5qepZObnZqdpquanZ2ml5aYlJ2Ok5eiqKKQiIuPhXqEfoSKeo6WiY2GeIGHg4iLjYWNk5iNjpaYio+XfoaXi495gXpwcndvb3RfeXdka2xraGeCbWVya2tlaFlhc39eWmt1aVlHfV1bWE9PSkhIUlVGMjpfXmxQRFhWWWVMSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0R0JnW0hUQ1RdaEUuOzFfVCwylqOimJWdqZ6loaOhuKqwobu5pqy9xLOwrqK1r62tr7TExL2zvrq3sbO5uLq4uq6tv7O0uK+/wbisvbq0pqKzq6iqs6yusqOdwramqbe3q5+yu6mmpaivq5mip5ylppSYobKmmZ6lqamcoaCUpZ+kuaikp62mnqWhqJOfqaKhoZmbnaGSm52XoKKrnJuaopaTlZabjpOTo6ekj4iKjoZ5hHyFhn2cjImKhniAg4eIiJGFlZOSjJCVk42OlHuCl46Ld357bHVybWxzYnl1aGdpZ2VthGdnaGRmaGleZmJpZlplemJgUXNUW1tTTElHSU9TQCEral5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LTExOTUsJi41LTgwNTc2YHRCM0NEaFtLV0dVYGhCMzc4Yk0nMp6kpJKOpaacnp6epLWtqKq6t6esw8C3r6yhta6nrq+3wcC9scG3sK+ytrW4t7Wsqry0r7KxvcC3rry8saWftqymprWqq6+hoMSsqqextKustLqeqKmrsaWYnqqeqKWSmqauo5iepaqhm6Kdl6Cdp7amr6quoaGdnaGVoKafoqCZm5qckpqelaaeraKYl5+WlI6VmIyPmJqnoJCHioqIeIV3goKCnIeKgol7foSIhoSQhJaVj4+QkZCRjZJ7g5WOhnN/fWd5cGtqbGd1c2tiZ2RidH9hZGVmZWlpYmdvWV5YXW1kYE1oV1tgVklHSEtMUlg+OWBsaUdCVVNdW0lIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE49QjwwKjxAO0E8LTVCMzc9KyosMEEqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQWRHJTWcpKCRjK6gmpigl6W0sqOyvrehscW7ubCxo7asq66pub68u63Asq+vrravs7myp6u5sa+us7a7trC5vqylnrWroKGxpauvn6XEobOlr7Kwt621nqyurK6imZ2nqqWflZynpqCZpKOpnJqgnJWcnq2wprmnraKhmpqemJ6jmqWdlp6Ym5SaoZKolq2pm5SdnJOMlZmOlJSYp6eNjYqJjnuBdIKCipiFh3yJiISEioyIkoWTnJKSj5CRlo6Qf4GNjYNvgX9meW5oa2pncXJrW2hjYXJ/YGRnam5rZmpmZGxcbG12cWFUYmhjZVpJRkxNT1hRUFVhZYFUQFZTWVVGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDs2IzMqKTYuNTU0NjVafF0xOktqW01bS1hkY0BBMUlkQic0k6Kcj46xnZuUoZqpsrCfucC2oLTBu725saa2sKmupbe5t7isu6+tq6u3qrS5raWytbGvqbG3trGztrunqZ+2qZ2fqqOqrZ2qwpmvpa+xtrWsrJ6xra+qopudpKypnJWcp6SemqmjpZWaoJ2RnKOrqqm6n6akoJiamp2hj2uilZiccYOWnKSAdpGrqJ6WlqGRiZeZgJeKn494hZONg21pfneEcmyGioZ9hIqGb11kYGeEl4Zri5CUknV3i4R/g5CAZoiAaHZpZlhdaXRuTlBqY2ZxgmZeZGZua2ldXV6JkIWIaE9LRDhFVGdeSkhQUFVVS0hTYG90ZUVbUVVQRkdGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTVPa1tOXEtbZmI+RzFPYjwrL42kmoeVsZudk6Ccqq2ro73Fr6m3wri9vK2ntrGmq6S4tLKzsLmuqqestKWwtaKnuLa1qKestrOutK6zoqmftKueoqWcp6ibrr2VqKewtLitrqSoraqrpqGfnKGoqJyXoaamnJynqJ2SnqCYkJ+oqqO0r6Oio5yWmJiXo4ihj5KahqGIlJ6hf6V/p6yelJOdk4iDcniMjoOHoHWIjWmXiWZ+c3mgb4iHg36MfH+hoJ+Zf3uHnnSIjnabimyHgoNuaWVke21yYlSGbWNtaZhxWGlwboZXXWlba2paiHBteXKHaYeEWl5GTj5GXk1FUlZWUVBSV1RnXUxZS1JSUEVHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdDE1UmtbTlxMW2dfPUsxVWA3LyiNppeEnaydmZmdn6uqqKq/w6+yuby3wL+qpLexqqyms7Wur7O2q6mlsa2ltbObrLW2tKanqLOxrbKorp6qobOpoKSkmqKknbC3laWmp7e9pqynqaqrp6aioJmgqKSamaejpJmcpaqWk6OclJSkpqahtqSjoKOYlZOYk5yIrpCYlYmpi5ijnIaxgKStnpSan5V5gtSof4eUwJvGeHexpbeWZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4Fsl7GrsHlobFixrm9labySvG5oem1wj9h+U2titrJ+gHGUdZqhqpBXT1hhT1ZORlRbWFFQUotcV1tQQFxFUU5ERkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cxMVRrXE9bTV5nXD5MMVpcNDEhjqaTgaeqn5ednaWtsqmxwr2ytb+1uL/Cq6a0ra2pqK+0qq+2tKiopralqLmvnLKytqqlpKeyr66xpquep6SypKKhn5ecoaCxrpWfo6C0uqKqqKCsraSinZuaoqqgmJupoJ+YnqiokZynm5SeoqejobCjnp+jlpaSmJKZhbBraouNqn5nhZaHrWVxnp2VmqeWca6hpH53unxroY92sV9qtFulgGWckWBmgXpmf2l4aqllvnJnpox2sWp8sXh1kpRjbW2nblyEoEVpZ4eWRXWcYH1me6Omgllfi6tpgJJ4emqoOEqvW1dUbWNaTE9YX1xXVjtOiE9WVi9JVFNKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVeWTMxG5KilYKtp6Weo6SqsbettL2+sLfFsri6w6epsKyvqamxr6SxurCkpa+zo6m5qZ6zsrCjpaGqrbCsr6aon6OisZyjnZiVmJ2er6iXnKKftLOhqpuhrKyfnpqXoKOqnZmepaGcmqGnpJCdo5uYoaCsn6amoJqfoZWVkZaRmoa1m7V5hamZtZl3h7Obt3+Tlperln5rgaZ6gYWGkZSSd6tnarFbrHuOh5R0iHCOhoF/iJCXeIOCi5eMg6CPhbB2d59xa2psfItPpVhIY2OZfmNopV95cXVSkodeUKltY3F9hoBhnS9Som5bVGtnYExLXGNYXFpCPrB3V1hBI01oRkNEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjg0MCwuKC8yLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0o4YVU1MByXn5SIs6amoa6pqLOsqru2wrC8wq24t8KrrK2vrqeus6qir7yroqe1raOrtqWlsrOoo6Gdp6qyqLCopp6goLCWoJqWlpeaoK+jm5qkqLWuoamPqaepm52WmKCmqZufnaOfnKCjpaOVm5+Ymp6jq5ulmpyaoqCWk5GTk52E1ZOZuXGwwn/GhnzWlJy7fJuWppCNnIykeo2GooGlgnqseY+dVq97iX6farlauXeGg32mgpN8mHqqeY6dkHuxbY6EdJC7hW6VUK+nxYpRoHpjYKpic3KGbJeHX1O1tMiFgIl8Y6QzQp11XVBqaGRQQFhmWWRhSkhNa0paU09ZZlpDQz9FPzA8PDU5Ozc0PDw4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREIuMDA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpXEpbUF9mVDdHOmFQNzIlnKKTmbGoqaWzqqW0p6S8t8GxusCytrW9tLansrGjsbOmoK+2qZuouq6jsLKhsrSxoaSenqepsam0qaWcnp6sl5mZl5eWmKKsnpuXqa2wqKOfjqyip5admJyhpqKYoqGjoZuioqebnqCelZmbpqGcppSbm5+gmJCSlZCdiLJuaLVxq4hwjqZytHRztnubmKWNj5yNon6Pn6R+sHWDkdLRdVuufIV/pG+bqqZrhoV9rX2XmY97sXOTnY94s2WWdIWebp5mlFLJi1rCXJ95Yl+tX3ZzhmKXiF5Zyp1vv4B1TUu1U1XGZFRRamNlWEFPal9saVBVRkk5PVdSW1ZZSEI/SjwyPzs1PTw1Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUU+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHJoOSdXaVxBTlRfZVA1Rz1hTTYyLqKdkaWvrKWpuqymtaWntru8sru/uLe1u7u0prW0orKyo6CssKWYp7qupLKxnbS4qqClnaGqpLKorKqlmp2bqZ+WlZiZkpOjqqGYk6ersKWilpKsn6WSlKGcpKeglZunp6Kao5+umqGenpCWnKKenKWUnZWZop6VmZaSm4Wse3eodqOPi4epb62Kg6eEmpmiipKZi6J+kZeHroV/grNccrNSrn2CgqR/cdd9d4R+j52GmZp3r4aKkZyId7RhmmWagoGVbJJbsFdLmnWYeWZgrV52d4dnmIhqXa93lZ+PeGw1eciusl9CVG9dZ2BFUGxfcG1WVU0uZWJoU1lQO0FEQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6NzegnZSguLGYs8GsqLKnqrK6uLS5vrm4s7a+tqa4tKC1raCgqayglae2rKixsauttKSbqZ+gqKK1p6aqpJmelaWilJScmpKWo6eblJCnra+loZWYqZ+ij5GimqmmoZWapqmdnaSerZ2hnKCNlJ+bnqCYmJyWl6GglJiRpp2GqX19pXmhj5CDqnCtjIGmhpagooqXloijgZCHlKp7f4udeW+xWqiDgoigeXTYf3aHdKeBjpuNkqR8lpCfhHuyXpxkoH2ClG2TXKtcW5N/kX9oZ6pjcnuAapiGcV2rWomgj2tuZU9KQ6FcWk10XWJmTVphX3J0X0pVNUqaklhIRT1IRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxQZWVBJlVmWz8xVF9iTDdGSV9DMT03opyamr+smLPCrqutqKa0sLixtr+5urOyuLyqu7WgsaWfpqenn5Sqsamwqratqq+hmKGgpqSkuqKjq6GXm5GjoJWVn5uVmKCgkI6MqbCvpp2Xm6emn42SpJiorKiVmKmonp+gpK2joZ6hjpWhmJ+gkpyXnJWdoZWWj6ubj65ucrR0qYx3iqZztHl0tIGTpaOTnIyJpIeOdbhvjHuLomtrtlqhhmWXl2mgoqdtlHK0dJOYf7JqhpKIrWt1s2GdZqJuhpJrl1ytYE6hfIeRUnOjbHl/fm6YhnBcr1Y8nHdmVG9uLlunT2JSa2VibFpiXGBwfGNTWVE+Pm1vMkJCQD9NOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssMzI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eOTFBOKWam527opyxv66tq6unt6m4r7XBtb2ysLu4q8G2qquhnaekop2Sq6untqOzqK6qoZecqKClq7mdo62clpmQpaOWjp6hnJien5GUlau2r6eZlJusqZeMlKaapa2jkZersqSgnqirsJmhopCZopegm5abl6GTnKmdlJCqmYfTk5q7dLHEgMOGfdWWm7h5iZGYjZeJjKeHeaK2dX13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+ifox0h6t9vm5zvHSyg3V4gIptmohxbY2kdL1dd31bYXm8alpWW2l6XmlhZGZibXlvWVtZQ0FAcj9DRyo1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sPDowOExYYUYnVGNYPC9UXmBLNTtMWy02QDmnmZ+ivKKXscKwramqrLGoua+3xbG7s6+8sK7Bsq2mo5+koZ2ckaqlqrKktaetpKCWmquZp6y5naOumZWhkKagk42co56YnpqQlpOvubCrlZejp6eUkJalnaStn5GgqKufnJ+ppLKeoqSOp6KUoZqcl5WkmI+woJKVqZ+FkJm2gJGRjbiVeIKTm7V3bmxuc295j4SOiXOewbu8mXqBsqhwgHSRuYN8hoaLh417ioaNl3yku7m9nHV5s6N0dpd1dLB1mJ5mhmmNtnRycHe2jF5/eX2IZ4N5bXlii6xwdIV/WFunaURkWVRmX2NdY1FmZnFtdUJNUE1EO1pMP0ozPDAgOD47LjM9QTk5Pz07PEM2QlNZWlpbW1pbXmBiYF1TR0dINERJVEFLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVzgqT11dPSs7VlYnPTo8pp2hob+mlrPCtKuqqK2rqruvscavtbSvuKe1ua6rpKKnn6CdmZSspK6qpraoqJ+clqCjnaykvqehqpeVnJGim5KPoaihk56XkpiUsrW2rJidpKSii5KSppylq52WqaWmnJuiqaemo6ihkqyel6Kel5eYnZ6PsKmTnKeij2t+aZyoeYlzfpuOdXplh3u+v8C6bpKCcZWFX3JqWl2aiWFkh46Va2B/lWNtnHZilGuAmpWUZV5fY3GbiWhyjHyGlGZqfnF0eX59Ylt4dIFoUFxug3x7impYbHmBcklKb4VwTnNNRFZcZmFMW1dmY15PWm12anJST0RFTTxISTxNPzIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMTs6Li8tNzY9NSYiLyoyLCU7OC03SVJfSSdTX1Y0KVBeTCgzPltPJz8yPqifqKHBpJq0urajrKaup6i1sqzIrLC0rbakvrGzp6Gkqp2jnJqarKeupKW1qqSbmJWim6atqb6oqKWVlJuWoJqTmKWpp5GekI+YnLCyvqybp52noomTkaqbqKScnKyfo5qbo6esop+qopqum5WmoJaVnZ+dl7GlmaKomZyRnpyjpZqno5qdmpqakJaCaG59cXaRl5SRg4m0qY2FmJWOioyYloeTlYqDk5OQiI2RlJmTmZeaoKGam5Sfm42CeqSFbGl7kH2AdYmLgnKCeHl2dYqAe4lqc4F0g3Vkd312a3B6bF9iW29nTFhZZWpfV1lwem9tZlNPRlI5T1pOUk8oKztKQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7NDg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5UMTBUXjorPThdSyw8LUCyoLOiv6KjsbG3oKmms6elsLWqyautsqa1psCotKGepaacpZaWoKunrKOkt6ygmZeWoJetqqbBn6uklpKcl56YlJSinp6jqJKQmainssOvmqudqp6Pl5apnqucnqGtmKGbnaKlr6WhpKieq5iXpp2ZmqGenpywoZ2ip5WYlJmUoaOWpJ+YoY6WlIuKjY+XrY97lZuCkYCJqaiFgJiWioSOn4h7g5CGhZqRh4aJlY6bl46QmJ6jlpmSkJyNfo1lobOuhImEd3uPin53eXpvZ3mQgYCJa3WBeYhyaXN/eXWDh4FqdGN4Zl9oZGNkZmpYa3txamtcU0xQRF9VRkA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1RWVlhaXF9hY2FfXl1dXl1YVkpLTEJJT01SSjs8Ojc4Ni8zOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAs6C5r76sq62xsqCqprKtoqyzsMawq62ks6+8pLScoKeioZ2Zl6imqaakprO1npWVnZmZsKauvqCropGRnpqZlJKWoZyXqZ2FnamsorTHs5+ppKqWlpiap56pnKClq5Sfn52gqq6opKOroaybn5+gmKWenJ+csKSZn6iTmJmdkqWamamfm5dmg5J8ZX6Pmo9jeIxsaGp6kKOra2SZl35nhYplZWloeo2hjmtojJeRondraouYop+Yc2xueoSMhnlYZV2Fgl5si4qCdltoc3d3kYCHgm54gnh/c215hHN3iIiOg3tphVhdanNkXXOIaWt8cW1jXVFOV0lkWEBKND1GNz9GRDcxPD0/QUM7O0RHSEhJTE5PUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSS42Wk82KUVZL0RPMVlCOz8uPaWfury5r6yysKulqK2usKeurbC9saqopa2wsJ+tmKCknqKamqesnKyjpqips66elqOQo7CmtrmlrqOPj5qhmZOSm6CYmaaWe6Wsoqizw7eloqevn56VnqOeo52kqqiSn6GeoKqvqamjqp6nm6aep6CslqGcpbGkmJyrlqGfm5OlmJ+rmZ5+voOIcrRyhZ6FrWh3ucS4cZKho3ummJhzqoJ8y8DAu3GKo4eCnnyWmIiewL2Clp2djZzBwHuBepGMmsK/fWulsm+MgW/Ken+bd5GDjoB2eYF/eXF7gIZweIWMk3lsdZFiZV54ZF9lgWJedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQUA/PTY0NjgyNjYqJiUjKSomLisqKTEwHzkqIz5IW0wqI0NQLyNGWzNQWS9VQUI7LziWorjDtLCvv6mplKOvqbCvraayta+rpqelsaugq5iboqCcm6qnop2roqWppaW0pJ6jk6aurLi0p6+ikpGZnaWSkaChl5ugnYemq6Srrb+/saGprqmXkp+eopmjpKqjk6Chnp2srqerpqOhpZ+kpJytqZGkm6mtqpydq52topeYppeipJidf86UeXqlgXqWlptfrY9djqiAoKF8p5WadKuDgK9eZIypeqiHhZ90l5KIs2OCq4agjY2zaoSuc3yWh7hhgq1Zo81ukHV723t/mXF+iJJ1f2V7iHZ2bH2Hbn2FkJF9a4CNX3Bqb2ZgX3hkXHFoamNmYFJUU1deSk9ENUFIRUQ4PjY7QD9BOz04QD4+P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w6TC0hUEBGNC4xrcG/v7S0sLeYnpGjqqmttKumsq2trKSsprCqoaebmqaYnKKvn6GfqKejpqGfsKybnpamrq2wq6isoJSSm5+lk5CfpJedp6OerqSrsKi/xrOoqbGulpKenKKXoaqqn5Whnp2crq6mqaibpqajoKqSrLOWpaKqqp6kp6eisaKTm6eboZuVlJGXoHCFjJh1hKiHcbB8nXKsfaCfgaWPnnergn2tf5xyrX6rh4afdpiSe3yXfqqIoYuRi5x9q3qIko6ggHqtVpzEeo9vksF9gZVtdXCMbWZ3ZYZvYXducm6IipGPg2yPjmRtc3VvYGZtZF9vaGpuZmNXU1xgWlJSQzhJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MjQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi08KD0xKTNWQEYhHEc7QzEtK6/Txcays6Cdo46joqKtrravqbGnqauorqurpqKjnZqjlp+mq5+ipqCpqKKfnrCsmJuXqKivrKinqZ6XlZqjopKUoayanaajr6yjrLWpuc2yraaurJaVnJ2imZ+urJ2WoZmenqqxp6mpmqqoo6Gqmq+xoqisr6aZpquqq7Kkk5ikppuVkoWkaqR1iXqpdXqycYKliZiMcIefmoekX2BSq4R/roKbda6Cp4aGn3qZl4V7ZoCjiaSYhoGjfal+gZSGrl58qFWdopKBeqOfgHzDr8WMc6+0s7lxYqmvwnRojIyXjoFsmJFubHh4d25rZmRkcXBme2ljXFZfaVhYVExMUUxDQ0FCO0NBQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXVwKGZq6ihr6KfsLWwr6mto6inqqurqaSmn5uln52mp6aknayao6yhpJ+vop2bk6qktrCuoKmbnJeVpqOQmqKnn6CmnLGmo6ixrLbIsrWprKqVkZydopmgpbSdmqGUnJ+nq6mirZmqqKGhqaGzraKqs7KinKqosLC3pZSXpKiZnZJ8qmyehId1q3l8sG6CpIuIn5aVnpWB0re0uMmAgbJeX5Spg6SHh6B6mJWZeKrJc5mjlKeokJKajH6aiZrGxndloYKlc4GfjoJ9r15vtWOxdUujhm2nR4KTZI6PnJJ7b5WQfW55dHx6bVtlanJxZoFqXmFYY21cXllJTExLRURCQj1BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxdXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE5UUR0cOzxGMiwkqKTAxrmtqbKurKWinbK5rKqhppuopqusqaagpqSYq6OfrqydpqGsmp+ppZ2ntZ+il5Ooq7ayrJumnKCWkKWtkpqcpqKgqqatoaOnqbC0wrGyqq2olImYnaWboqSvppehlZmcpaWpma6cq6aknqujtqygsbmwnpyvqLS0tKaWmKmkm6GPgp1OeJqBf596hKN8gqSEhqaenJ6UhLh7fHm5gn/MxsO2d5uhkIuffpqWl4l2n5eKpJikp36vhJuDnoSsfZmUYaVso3CPhZCBfZeEcqxgpHJxgJpgvH1SVXWOkaOWe3yRjodyeXKDfXBcbG53cmqAblpjX2huYmRdTExRU0FIR0ZJOTlLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFdZWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9URjxFMjpQW1QcGzY/RywtIIyHmamspKu5q6+gm6Gss7Smn6GVpq+urqmmnaWlmqOnobKuoqmnsqCZqaSUorWio5WXoqq1uaSco52jk5Chspmem6akoKKvrZykqKK1scOxraqtqpGHkZynnaOknaWXnpiZmaWjp5itoayipJeupbusobe3rp6etbO5srSomZ+xoqWfh4/RtcO3eYeOhZGTj4CmeJSid4ugkoWlgotxq4aFtG5yaZmjnJWJn3yXmYaHkHOugqWbooymipOciJSQmm1wslylc5N6nGyZf3uZfm6pYaJxcX+fYnOyuGh3j5OkmH2Ki5CIdnt4jYFsaHdpeHNufnRcZGRtbWVoYEpaV1g8SEY/VDNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgjKSWSco2Krb+/vLu1npeopK22oaKZlaOpp66pq5mloZ6moaC1p6Kpp7CjlKujjqSto52QmpqqtLSknaacqZKUl66goJ6mo5ynnLWZoaqjtavCr6mrqaKMhI+coqCmo5aampyYm5imo6WXqaasoKObrKa9rJS+sK2fo7C0u6y1qJ2qs6WpmXuokX18sHeKgaSliJxtsm+gh617oY+DqJaZgKyJha6FoJSooaKXhZ+AmZWAe5J+q4CdmZaKqnedoI+Ik5J/ea9do4F8pqdknoB8l3Rrrl2la3GFmV1gW4ygbZSQpZiCk4uTiXh5gZZ+amx9Yn10bX95YGdlcG5nZ2hCWV9bPUpTMlQ4QkJDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaV1NQT05JNzA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNTVldXWFZVVlFIRklKIygovJKahKnGw7bBtJ+araCuuKWjjpuko6Cvrqmfo56drZieuaCiq6CvqpquoZGqqaWWiZqPrrCspqCom62YmY+toqGdpaGZpJytl5+opbaov66kqaOfi4COm5ufpp6SlJmalJqapKOjmKeqqqGjnqmovqWXw6yro6Kss7usr6iitbGqrJl2r36QipyFh326rYmYZLCMZZWtfaGPg6eWm4GtioSwhaaZo6GikYWgW2xqgbNgf617e4KAsWxnbZmXi4ixW320W6SDa8iiZZ+Be7xZdrVasn1Sr4B6rFiAoW2XjqeZiZWPk5R5d4ybfGNzfGGDeHN/fGFpZnBtZmVlT1VjXEFUXj1IKD45PTQhISwkHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBfYGFiX19cW1hVUE5KR0M1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9KftLG3vbu0wbOjnK2mpbapoIuZoJ+ds7GonqKfnbSYoLOoqquesK2erJuVrqiijoibjq+sqKejqJmuk5qPqZqhnqWemaOipZieoqmyqLyvpaienY58i5uWoaCZkJKam5GZl6ien5enrKWkpKKkqbueoManpamirLW3rq+oob2vrq6XgamSo66Om4CGpJeYkIGAuMO6g46dk4SnmJ2CrIqCr4mnnJqlq5F+1b3CqmKjv718fqOCg9e6t7WFk5KCnr2+hGqjgW+rhG6df3qysceDa6uwvax4d6K+u3SAlY2lmo2ZjpSad3+PmXhhfHljjGd4gXtga2VramFQYltTaVxAVGBCTCk8OjUvHx8kHiUyIB0kKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbS0sb+6sr2zop2upqWzpp2MmKW/qbawp6G/pqaxm56xnLmon62upaeVlK+sl4yDmpGupqOsoaWcqqCYiqOTpp6nm5qgqKKYnaCsrKm4raejmpeTe4iZkqabk4+RmJiPmJSomZ6WqKeeqaahoqu7nqnFo6Cvo6u0tauxq6K9qrCwnHR2qqS3hWWJn3BnrI+Kj21vd6SQmqCBdbCalnCQjXKWqKObmK6kcmxtbGWKeG5tgplxgHppcGlmiZaVl3FoaYWGZ3CGZF2KY2lvWV1nfnimYGJyj5JvZmSAjZOOoZaVlo6Um3qFjZN0ZIZ3Z4xqeH54ZGxjZmxiS2VXSmtZOlBkRFAnSjorIxwgGiIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWttKm6ubKzqqmirp6ks6qYkr2xw8e9tKmev6uso6Cmq5+6o6StrK2ljpatqpCMhZWXrZ+lqqKfpKOgkYulkqeZqZmWo6qglpylpqevuaqrmpuTknuElo6ml46RkZiTjZeVppOdlqehmbCmnaKsuaCwwqiks6assbKrr62puqWwuZeLoamltZyJlqKYhqmakJSdk6qzmZujrKG0l6OhnqGinKGkoZWsp4ySk4yHkpyclJCZk5iQjpWEf6Sal5WOi5OSio+GhH5ni4B0g3Z0h4xxp218lZKUk4GBj4+PjpySn5SVlJ6AhZKLcGeOdm6Jd3V8eWlrZGRvY1VgWEBpWkdiYE5YK0U9KyYhNjQwLx8cISUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5UUUpFQz45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqktbeurqKwpK2foLaxkI6qxLvEubepoaWdm6WdsKijtqedqbWmp5GYrKOLiImPnKeWrKOhmqienpOVo5eomqmZlKaho4+ap5mhtLmnqpiakI18gZSMoZSKlZGVkI+Sl6SOnZinnpu1o52mrLeor8Kuo7ensK+xrqqrtbuisb6ZkqakprWikp2mno2pn42Sn6OssJuhpLKqsZmloZ2kq56enZyXrJ6SmqKblJCWqpmNmJiWkJaekYegnZWUhZKMkI2Vi4F+Zo2HdYd2eYiEdJxqh5GVlZKKfYyWkpKXkaCRmpSegoaWhXhxlHJ4iX5xe35pbmRfcGlgW19ZbWJQYGRPWTlHRkU9Mjw9OC8qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OXlaSno7CzrK6jqaetoKi1qpCPnKOyuq2qq6GimXqcorCkpbGplpu4pqOUmKmcjoaKiZuikK6epJaooKGSl5mbrouqlo+omaiMmKiOnri2o6WYm42JeYGUjJuTipWRlJCNkZahi5ycp52euKN/g6+1orCvdKS+o7KgeHuhrLS9lneupaCKgKl+ZFxidp+OpJ2Dl35ulLSco6ivrKRln6CUdHqal3GAmamYbICjqIplnKWbkJeYlouSm5CEnZqQlIOSh46OkomFd2uQiHaHcXyGgYBhaYmLlZOMW3aVkWdoj4xxeaKWlmR3l4aAdpdogomCbnl+anBlX3Zva2tnXGVjYWFvUlo9TU1OUkY9QFRCOTEvHh8mNDozMDY2Nzg8Oz5AQUJGSEJHR0lLTFRVVVldYGhnZ1hRSTxERzw5VlJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqaWpraSnraSSlqq0rrGlmammqpdzi52vn6irp5OWuKCgj5yknpB+iIiano2rmqSVp6KejpeRnoV0ro+IpZqokZajiJu5s6egmZmLiXV2k42Wk4qTkZCUjI+Tn42ZnqWYm7KWgIybtZ20jJKPvaehfqeie6SwuYKOj6efhIuFj7Gpr4yJlqKZeYGLrIacnaKoq6mIlYeZd6WbeoecgZengoF7nbJ6ioafl5mUmJaBkJaWhJmaY3mHkISNj5KLg25xkIh6gXGAgYZ/hnSHhZaSeJZok3SgmnR7mYKdmoSYfZGIgYKYaYyMhGp4enBwZ2R3bWlsalxkaWllcltcSFRMUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dSWFpYW2FhaGZZUUg5REs8PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2Yo5+mrq6rqKygqLCnp6qlmZStxbyvoJWlp7Sdj4Ocq5ymoqCNkL6emY2fmqGQfIWOmZiIrJ2jlqGhko2UiYaAkaiOh6Kco5OWnYaeubGnnZqTj4VwdZCJlJCKlI+Om4uOkZ2QlZ6jlJ2rh5+0ibSarovKiKuvibeFjbCDsrCFqY6nmI2dfKiPcnt3m46mlmiVpHm0i5+fp6mTmcKCf6uImKFxnoCapX2XhZWygKF9oJOfj5iXgI6Tm4mYkot8hZOGjZSTiYNtc5KGgHtyhoGEfYV1hoKYgY/FZoCph4+iap2BnpeAmYCKi4OImG+NkoRnd3R7dmdodXBnaGteYm5sZmxYZkZcUUwyRTQ2TWFjNyY0PERHRDo2MzY1ODs4Pj09PkJMP05JSktDUFpdXFdiXmpsXFFFPUtNQEpkWF1jZ2hnYmJiYmNjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS5samrppqUnqKkqqKVpKm1oq9/oKacpZ6diZS9mZONoJGdj3mDlpaRiKuZnJuaooWPjHebnI6gkYiepJuVmJeGorispZmbjY1/Ym2Pi5OQjY+MjJeLj5GejZKeoJigp36hp4etnaCWrpCgnp2RhoKgjayxiKSOq5qMmn6idYCYk2uBq3RNq3iHjZ2Sm6mpgqqrfoShe3qnaZ5/kmxnl4aYtomefm5gY1iDl3+Me2Rni3OZfXmWa118l25fU3GFXGBseYNgWWWCfoSBmHGnqmuDo25ypXCfgpxnZJ5sWmyIemVZX4J+YVdQb3ZlbXRxampuXmpvbGtoV2dOXVhFOUA0R0ReazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpbXV9XXl9idmBNRTpNT01UYlxbZmdpaWJiZGFkZGJhYmBjZGNhYmprZGJkZGdkYmdlYWNomJadoLmgqqOmrJGhtryrrqKZlp+gpaurn5yttKGnkaCfn6abmY2YtJmQi56MlYt1gZSRjYqmlpaYn55+k4WGrKOHnJGKmKmYmZqRh6WwpqKVmYiJgGluiIeLjo6Ji4yRi4+RoIuSnZ+boaV/k4GPo6GUoHeclpCng6KogIarr4aleot9hJp9onBykoeWe56MeW2Hm4uZkZypnI+HnXyConN2pmaefnekXph7fZNzom6Yt7S6c5OHgYC2qGSBxrh7cJW2jHGAm6RjdKyrYH1qnbN+bn2Hg4+Ci5dxgKNsc6RznoJ9o16cmbOWb3uXnrN0cluesoJpYm9zdXFoblhra3JyZFtnXWFLRD1ENVFBWnEyPFJGX0pTPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWVhgYHtkSUM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mauck6COpbi1ra2gmqGboqOkq5uasayqkpegmKCkmZqUnqubi4iSeIuFcICWjYqPoZCTlJ2XfZGKjqigh5iPipKik5uajIqop6Sej5aHhH5re4d+fY+Ng4uPj4mOk56BlZufnKCfi4l3nJiijaByoouIqYicp5GXqayArox9eqCZeaOTeIBzl4iMnH2Wn4abjpmcp4ejZKF9iZaQm4xsnmiajW6amXuAiqd9cmdzqoOdgnOqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxep3Z2iYqAnWiadYeTkpiOf55tmZBqpplcqH53u2p9qVqOhF2zZ1xucXh3a2lbcGl3eGFeZFZhQVBFTzdWQlJuNEpaWV5OWkRAMTUxOzs3SD86Q0dVP1hSWF0+RGJdVmBRYWN8aUVCOU5bXllkZlhmZ21tYmJlX2FhX19gYGVjXmJkb3FfZGVla2RjaWhna2mVnImqtpuoiWOVnKy6srCrnaWbmqefnayZnbCnqp2Wopmhn5mWlqCjmYaJjWmIgHF7l4iMlpaEkpSYj3qKhJajnImVj4aLnZGcm4iPqKKfmoyRioCAaYGGeX+WjHuIjY6HjpWZfpKhnqCik5hyaJ+KoI+McJKMgqmImaCkqaKpfbCtpKK4l3ajs6Kjf4iUeJ16q5p+oo+enJiJmHKhfYWNsLV9a5qRoXh+mLSjo6uohJh7mnycmn5zqlpdb3uXi3ieYkx/e3uFZHqYQk2fWaJqcnyOboGKhJl2m3mHibGzf36akqZ0fp1tcXyUb5lyaaNdlXZIZWNgc3B9fW5mX2todXtiY19QXVZcVFZAWUVRZ0VSVlxhWF9JRD1COEBBOklFOExFWEFWUVpWREZhXFpgS2BtfXFFQzxVXmJaZWpWaGhtb2JmZl5hYFxdXmBoYl9lZHZsXmVnZmxkZWxoaGtplJ2Bsa6ZhFNfoae0urOzqJqii5qpm5ynkqCro6Cnjp6dnJqZlZihnZaHh4l3hYFueZWFkJqLfZGTlohygImSoJtykpCBiJmUn5qEjqibmZWLiop8hGyEhXGBoYx4hY2Ih5GXk3uRop+eo4iuhn21hI+enXumlnqpgpaekYuinn6naHdtfplzoHNxfJ2FmG+Tgq59o4Onn5uBpHBeqWh1o2NvpWGc0498epl4cnNjooWPfqJyoo51a4+zi2CCmIpzqrKnvH93g21/v6aqtF6cb35yl2+Bc6JyXqRndKZgaKZsmtOYeoKbbnZ5l2ubeXaXcmyppWdfZHlwf4RrZ2ZjbXV3Zl9hUVplUFFhSFdJVF9XU1tkaltlUUZDS0xKS0JKRThQQFBNWFNYT1JRYGVlaVJkeHl3SUZFY11lWmhqU2loam9jamZgY19cXV1faWJhaGV8ZF5kZ2RrZGpsZmhsaJibf7CsVFxLfqmvsrWwsqOcmISXpqCgo4ykp5+XqImZl5iTmZORoJeOiIV7cH2EaH2Pg5OagXeRjo+JcH+Hj5OSbJiUfImRkqOVg46qmpOSi4WJeYR3iIBugZ6Gd4CShYeYoJV5kqKjmaCJs6Gitot6rKekrqVwqYCbkYaBnZN9pICimYaYcZ6Eoq2uiZeLgIykjZWDr6KVdrW2tsmidJSLgp5hnpepbXmVhqCbdaGHd6B9kJaKgW9MZqOScJqIc6V7eXRig4JsfqBscmRgnHJ/dJdre2q0tbTGpnOYfnqcapqaq3SBmmxzd5dpmXl0l3FQRH2zXmp1aniHZmtnYnR0cG1VXFJYZ09SaElVTFhSVVxna25VZ1dNSkFKTUpISk5BUUpQZGNpbWV0cnN+eHtudYl7e1RRT21eaFtraVJqaGlsZ21mY2VfXFxcX2liZGhre19dZGdjamZubWVpbGWinIivp4VmP5Shs6yvr7Wioo9/lqeioaOLpKacm6WBmpeWjZeQj5uTjoiDeWp5hmWDjH6Wn3l1j4iMgmmEhZKDjIWdjXqMipWlkoKXqZeMkYuAiXqAfYt5cI+ghnmBlIaIlZ6UfpOlp5yWloRnbnicbKJkfHGleJyYcGingpiNfKR6oJaDlnKfdoCJlJWPuW6QiqJifZmiloluc2qra3WgbW+mYJtpi5BploealXWigH2aX4uFjHVviGJooWWef2mbdXBkZ4iCbnKiWl9bY6FuXYmMcHt/dHJkpW54omRmp2iXcouYbqFvUoiPbqBeZKdUi11UmG1tcmpxgW1waGt4c2tvUVZVVWVZU21JWE9cSFhoaHNqWWtWUFJFVlxMWFJhVWhqXnd1enxwfHxygnt/c3aNgIN2XlFzYWdicWdQa2hoa2xvaGRnX11dXWBqYmlpdnVdXGNoY2ppcmxma21jnaWZpnpldG2Lp66lqrCxpp+Lf5aqnJ2ki6GhmaGhgJWYk42aj4uXkI6Le4ZxgIhoi4p8l5pzdIl9kHxlg4eViomWmYJ8iIWWppCBoquQhZCKgYp9gICOc2mPpYR9hZOMh5efjYaRqaadiaZ4lpx+pYmWjLKZnpGDr5efpXmXiXqpdKaPhJpupaKMkoSMg7xufaWvgoeGh5SXnaF9pntyqJSglmeefm+sY5aKlZJ3qGypooGJdoeCd6uRpohrkbBrdrOMqWyLhm9voJ6RlGF/q4uqd4F/jqefd599haSVnaBpmod1rGaerYy2c3a+jKOTWYOmjatgdXFzb3t1cGJqfm5obFNVWVVgYFxqTFxRXEldbG12YFtxWFtfWmdzZW5vcWNxdGB3en55cnmDcoN+gXt7jIGCgHZieWRkbnNkUmxnZ29scmlmaWFfXlxhamJsbHpvXFxiaWFtaXdtZ2xuYpWmqpyBgJ6klqqqnqinrqOYiIGWqpmdo4mapJyonYSLmo+FnJGFko2MjHSFeoiDb42EfZeTc3WGcpGDbn+LkoaGlI99e4KFl6WNf6WljYCNiYSUdYOHkm9si6iAgouTjYibnoiLkqqioJCAdJSXiH6BeZSvpH+BnHGPhnmSjIWAe3KnjHF9fXqXlpuEjXh7fn6IlJWTi3eRmaChhHt+iWuMhVt5eXN5cGlufpKKcn90gY+Uk3GFg4JljX9fgYCMd3Z0lHVve29viW6Ehl53aXiOZoKDho+qnH90fZdqiYhvf3V8hHVtbGaMc3d7l3eEWmpXeY9obXdycW93eG9dbIZtaWdWWV5XXGRrZFVhVF5RX293eWtqd2Vqamp1fHBxdHNhb3Vic3uBeHV5gXV/gH+BeYuFgn17bX9sZHluXlduZ2h1a3hqaWlkXGBaY2llbHF1blpbYmtkbGt5bWhsb2GOlbmpp4uhopumpJmknauin4ODlqqRnaCImaaaqJiDgZuLfpaUh46KiYxygnyPfX6PhHqXjnRyhHCVhnt9kouGhpCFeH6AhpijjHunoYuFj4+ElYKGjph3cYSqhY2RnI+Hnp2Gipqon6Cqg4mOlZt/foqXraiQk6eQeHGek4N7k3B/qYZwfZVxam98gZ+Lf5KOi2huXYSMjJycoI9zloyIcXRrgnZ0gFlyboaRgn5+i2ldaWN6hYOIgF9peHucfIONg3aBh4NpeYyIa2JxcoN3X3KNgoqQqJaHZ42Pg253i4Jvg4t3bmRmY3mCepVaW2lmbXZbenh3dG1zcoJmXG2Ka2tiWVhdWVhrcVteYFleXWVyfXpzb3Rjamppe3xyend0ZG10aGx7fnV6fHt5eX+Af3CGioR7fXN+enJ/aFRccmlsdnB1Z2tnZF1hWWpoa2pxcm1XW2VtbGdyeW9oam1gjIyqsaGQo6Gan56YnpmooqF9gparjJ6Uh5qhkKSUf3uYhHySmYiIhoaKcn2Ai3aFi4GElopyb4BymYeEfpKDhIaKgXqAhIuan4+CpqCHeI2XiJWLi5yXhIN6rIGQl5mTiZ2choehqp+hoqOLiJObnaOZlqqiqKehk5yJmJB8eY+Phah+fpKRkpOcsaWalJ2QjbGSmISmjIyWnKCKkZyDiZKKa3yOdndlgoaQin2JnYSHi4+HiICFhJB3fHt1m6OJiIufi4aVf36NgoF2cXSGhX94iYiLkaeRhIeOiIOMkIt7hYmHjX91aoGDe3mZaXFoYHOKcH16d3ZvdnOBXF5vh2duX15ZWlxSZ3FVY1tbYWxodHt8cm5wY2ppaH97bXh+cGhvcGxmgHtygYB3f31/hHttg4yGfHp4fH56g3hOZHZqc25xe2VrZWJiYFtzZnBmcnFsVV1sdG1oeHpwZ2lrZY2InrqflqKhmJWZmJSYpKCden+YqY2ejIWfnIqdlnx4lIJ7jpmJhoOEh214gYBygId+iJOEbWx+epeHhIOQfoCGhIZ9h4ONm52RhqmegnGKj4WSkYuckX2NeqmDjZGXlY6cloWFm6afopqdhoOSmpmZkJmmoKaenpCXgpOLeH2Ij4WmfHyPkJGFmKqgnJOcj42qjZGAno2JlJugg4+Xf4eOg3B4hnF0YX6Ej4Z1jJiAg4+ChoR+hYSVbnl2dZOjjI6Gm4WFjnWAjH59cnN8iYR7eY2PhZOokIeEj4KDiYmIdYSGhol6bWp9f3ptaGtsZl55fmd8e3Z0dXV6d1xgcH1tdWBjWlteUWZtU2VaXWFraXV6fnBsbGNqameAf2tyf2tqc254boN5boaAdoKAfYV2coKNh357enx/e4KLYGl7a3VoaYNlamNgaVtjdWhvYnVta1RicXllb3l6cmVqbW2Lip+4mqGkn5KRlpeLmp+enXp3nKWQm4mGpJSKmJl4eY2FfImRg4yCgoJse394coCFfYqQfGtofYKXiYGIjnx+hoSHfI+Aj5ubkIemnH9wi4qMkoagoYqFjHynkIePkpaTlpJ2jKOgoZ2Wmn+BkJqZk42aoqKkm5iRnH+PhnqBhY+IoYB+jI2PfJekoKCSmZCQpoyPgZySipSYnH6Tk36HjoF2dIJwdmB9gI6HcoqWfIiMcYx+goWFj2l4cnmNmZOQgJh/iYxzgoh9fXF6fIyFe3uSjoSXppSMhpF8hIWGhHSAgYWFeGRxen54eXBramZefXNofHV1c3xzf2peYHR2cHdkY1hdXlJqaFRkWF5haGp2eIFxZmtjbGdlf4BqbX1nbXBqfXeFemuLgXKBgX2BdHaCjIZ/fHqAgX1/j2pyg250aWKIaWxiX3FVdG9tbmB4aGxXanR2Y3R6enFia295iY2fs5KlpZyOkJiPhpygmpt7daOfjZd/jKGKiJqVeHuGh36DiX6IgoF/cH56dHWChX6JkHdnY32Gl4uCio14fYCNg3mWgJWXlY2Vn5p9b4uBkJOGpZuHjImDppWEkoqVl5KRdpCdoaGYlJh6f46Yl4+Xmp2knpmTlJx7kYeEeIaXjp5+goqOjHOXop6gkpiOj6KMi4OYmYSTlpp/mI18iY2Bd3J+bntkgHyLhnCGk4CQgmuHg4GAiYVmdm99iJOZjn6UeYyJfYCIfXxygHmLhnqFkoqMmaOXg4SMd4eDgoF1eX+Gg3Ned3d8c313ZmtjYH5panZzdHV9cXxjY2FzbnVybWFZX11aa2RSYldfYGlsdXmGcGJqY2xmaHyDa2h0aGxvaH98gXhtj4ZxgIKCf3R8g4yBgH56goN+fJBtdYl0dG1limxqYmN1VoNpcG5geGdsYWp2cGV4e3lwX3FshYWQna6YpqiejY2Xh4WfkpaXfHaom4mYeZaci4yYj3h7gIt9fIN7gIKBeHN4eXN9gIN/iIqAZF59i5WIfoWIdH1+in9+mISWk5aMo6CXfnGHe5ORiqaPjI6KkqCRg5GPk5eQioCOl6CakpCSdICNkpSJnZ2ep5mYjpWYdY+Qi22GmZCae4eIkIlvl52aopOVio2ejIaBk52Ak5OWh5qJfIqKgXpyemt1bHx/i35uhZKDlHhvgoR+fouAZXNqfYGXmIWAjnSRiYR6iH52eIF+h4F9hI6GjZWlkXmFgnSIhnx/cnN/hYFsX3l0eHB7bmFuYmR7YW5vdnN3d3NzYXZgb2x1bm9dW15dXWpdT11XYmFobXN6iWtfaWVqY2h3iG1mbGhpbGeAfHp3b4+Hc4CDhH10gYaJeoN9eoGEfXyOcnmLeXhubIdraF9pcmOHaHFvZXZnbWxhemhqfHt3cGF3bYuBmZqqoKSonYqKkYaKnYqUl3x2rJeMlnyek5GWlIh2fXuKfHuAdnd/gG90c3pvhX2BgIl+fGFcfo+RhoCEhHN6gIZ6j5GHkZGbkqSak4F8gXyNipKjiI2KjZeajYWRmJOVjoiIi5Kdk5CMjW6EkI+RiZ6ZoqGXl4mXknCLm4Vnh5qPlHuJhZCKcJaalKGSkoiLmYyCf5GffZKPk4yaj3uKhYd0c3ZrcW52fIt0boaRjpJxdIB8gYKIfGVxbXp+m5R+hYp1kYuBdIh5boB+gYh9hY2Kho6Wqo57iH1+ioV3fW9uf4OBYmd3c3RuemFdb2BqdF5wanp4eGxycGV5XW1sc21zWFpdX2FqWk9XV2RjZnFxf4hlXWloZ2JncY1uZGlnZWlngHp3dW+OhHOBgYN8dYKIhXiFfHeDhXqAind/i3t7cnmDamtfcGhzf2txbm1xZ29rZXtibn95d3BrdneJf6OYoqihppuIjIqBj5yGkpt0gKmUkY2GoIyVk5B/c3t2hXd4f3Jze4Vrcm95bYl2f4CGbnFbWX6SjYiAgYF2dYB/f6CGj4qRnJegk5Z3iX6AjIicnYmPhpKXloWIlJiPlouLjI2MnYqOkIRuiYuPkYqclqGcmJaGmIlshqWFZ4eei5J/jISMgXeTmJGdkZCIiZSNfn6QmXyRjZCOmpJ9i4CDb3ZwbG1vcHuGaXODjpiKcHeAdYKJg3lnc292gpuPfYqFe5WSeneJdHCKfIeNe4uHhYqPnKSJfIR2gYp/d3dtan+Af1xxcnFvb3dZXW9gb2peb2l8enBtbWptd2Bwb2txbVlYYGFhbVdRU1llZmJ1cISCYl1rbWRjZmuSbWBmZl9na4F0cXJwi4B0f4KAeXaAi4B5hn93h4Z2g4V7h4yAe3aKf2pxYnxihXxvcGx0amhubHZ3X3F+eHt0dXN/gn6llZqtn6eWhYyDfpaUgo6edIqfk5KFipqMlY2LenJ3dIJwcoVzcXWIbG5sdW2Id4N9f21uVVGBq5SHgnmAdnKCeYKggpGBkpGXm5GZd5B6goySpJqTjoiUmJKDhpaYi5OLiI6PiJ6EkIp8c4uFiI+InJmfm5aVgJSAaYeeiWiHoYiThZGEinGDkZePmo6PjIuPjXd7k5F7jouNkpeNfIh8gWt3am5rbG16f2J5fo6WgXZ6gXeDjX16aHVtdYiWjH+Jh3uUkXJ7hXB3jXuLjXuJfoSOkZ+fhn19eIGKfHZvaGt/gHded29ta3ByVV1uYXFhX21ueXBncGZmc3VocWxhd2VdVmVgYHJTUE5bZWRceHCIfF5caHFiYmVmkWlfZ2RbZ29+b2txc4p9dn2FgHV2f4x5e4aAeIiDc4aFfoyMhHx5lXhmcWqDX4d+b29remBpbXR/dF9zfHiGd3NzhXx5oZCasZyljoKKf4KZiH+KnH6KmJKOhIiXjo6OhHZ0dnOAcG+Fc3Bxg29qaXVtgm59fG11c1JOgt/JktaTfG90g3WDn4KRdpSQmJuPmHuTcoWQn6GTk5CJkpuThX2VlYeMjYeSjYmcf46BeHqMf4iMipybnJuWlHqOd2mKk4ltiaWGk4mYg4ZjjJGYjZSJlouNiYtwepWJfI6Ji5ORinqFfH9tfGVzb2tsenlcgHmPjoB7fX5/ho57eml1a3SMkIqDhoZ9lo1sf4Bwgo2Ajol+hHuDkZabm4x9d3iCj3hya2VufYFraXRvZ2hzbFNeb2RwWl9scndma2tiZ3hzb3FkX3dgYVZrX151T01LYGVjXHlxinRcW2V2YGFlZY5jYGZiWGlyc21rcXaLfHR5hoJ2d36Lc3+GfnqJf3KJh4GRioh9fpl2ZXNufGWHf25wa4Baa254eXJgdnp7jXZydop2eZ+Mm6+boJCChXiIlH57iJyGhJ6QjoWMl4STjoeBdHdweXBuhG9tbn5yY2R4cHxuenxqaGxjpJrB3K7vonNrdYN1hKGEkW6Vj5SflJqBkXCFi6OXiY6VipCdlYOAlI+EiI+AkoqKl36He3V/iXiGhY6bmpeZj5B2i3dwiIqMfoylhZKKnYWGXouUl4mOiI6LioSJbHyXgn2IhoqRj4Z2hX5+a31jeHRqb3hzWIh6kYeFen9/gIWMfnpmdGqBi4+LhISAjJiGbIJ3b4mSg5GFf4J7gZGXlJuRdXR4hox1cnBlc3eAYHNsb2FodWZSYHBna1VfbnR5YXJjYGl9cXJuW2NyYWNXblpcd0xMTGNlYV12c4ptW1xkeF5gZGaEX2NjXllpcmtua3J3i31zd4SBeHh8iXGDhHx9iHt0i4mIlYaMf3+Yc2h1cXlsi3tudHCAV3B5dnlxZHZ4hoxodoCJcYCdiJmnnKOShHxwjJR3eImcg4SfjY58lY2AmYeEe3J3cHNqb4FraWx8dF5geHZ7cHR6Z2BlfOvatcnD3IlzbHOAdoqaiIxpl4+OnJSSgYhwhYigjoSKlYqMl5N8jZKIgoiPepGLho+CgHd4g4Ryh4KTm5aUmIaNdod/cYaDioiapISVjZ+EiWGDlY+FiIaJjIeAh2h9lH99goWJjo+CcYZ/f3J3Z3ZyaXR3bFqMfZKChX2Ag4CEioJ2YnVtioKRjIN/gJOSfm6DbXqIkYiThX2CfoGTlJGYim9yeoyFdGtvaXB2fl5zaG5caXVfUmRxaGZTX3B2dGBvYF1ognFyaldnaWNpWG1XW3RMSkxlZl5hcnOFaFtcZXleXmRnemFkX11Za25lbmp0d4p+c3KBfnt2eod0hYN8f4d3doqFj5iBjYJ7k3Zsd3Z5eJJ1bnd6fVh5hXF/bmZ4dpGCZHaGhXGKloaZoZuiioZzb5KLcnaNmnyJmYiJe59/hJl/gXhxdG5vZHJ+aGZsd3dbX3h7enFxf2lhZ2F/1baOkaZ4bnF3e3GSkIyGapiNiJuRi4Z7aIeLmYaBkpCGhpeNe4yMgICJjXuQjX6JhXp1e4N7cYaAlZmOkpSCiXWEiHiFgYyVnqCHlpCgf4hhf5OHg4eDiY1/f4JmfZGAfn+CjI+Qf22DfIJ0a213dXR3dmtjjYGOf4R/fIR/hYh/cGB0coZ9kI6DfYCSinpxhGd7hYyIjYR8hX+BlZCSlIVvcHmLf3RsbWlqd3phZ2lpWGt1WlJpcmliUGJyeGxiZV5aaoNuc2JcZ19lbV9uVFpvTkdOZmRcZm5ygGtaW2NzX1xjbHdkZV1dWmxsYm1qc3aGgHFvf3x9dHiGeIWDfICIdniJgZKVe4mGdomBb3h5e4OSb217gHZeg39zgW1oenOUc2dzh3xykpGEmp+boIaGdXWUfm11kpZ9h5CDio2ZfIyadn52cW9samF0fGdiaXV5WmB3e3ltcX5lY2hoV52PX3Jzl7zEhHZxlIiPfXGWi4abkoyHcmqIj5aAe5SMgYSajHyKhXx7iYt/lIh1iYZ2d32BcnWGgZ6UhZSPg4NygIp2hn2Lmp6ah5WPnYGJZn2Tgn6Eg4mJcoF9Zn6MfHl/f4eLj31pgH2DdmZveXhzd3Nsa46FioGKgHiCgYWEgWtfc3l7fo6LhnyCkIF+c4JpeoSJjIaFeYR9gpmNkY1+bm17iH12dG5mZXt0YltwYlducVNTbXJoYU5mdHhmYF5dWW+Ab3NZZWJdam5gcE9Za1FEU2dgWmpubXxuWVtebWNaYm93ZGdcXWBraWNsanN2gYNwbX98f3R1g3qDgnyBhXZ+iIGWkHiEi3SBiHJ5eX6NkG9ve4BxaYF4en5tbHt1lWtqeIR0a5ONhZ+YoJmEiG59jHZpd5eOfoCJgpSXiXmPlm96c3BsaWRgc3poX2Vxelpgcnx5Z3F6YWVlj7Gyd0tiWqXZ0JZxe5CKj3d9k4qEmJGMhW5rhZKRenmShoGEmIp8hn94d4mKhJaAb4uIcXV+emp5hYOlkISTjYN/b3+Ed4V6h52alYyUkZWFiHB7koJ8goOIg26Bd2iAhHhyf4CDiod8ZX1+hHZjcHOAaXlwb3WZjYaDinx2eICFeoNrXHJ/c4KJhop+h4p7iXKCbnKFiI+GhnOEeoKajY6FeW5vfoR/dnpkZmh7b15YdlpYcGxOV3FzZmBLbHd0YV1cWll0fXNvV2ddZmpyYG9OV2hSP1hmXlpwa2h6cVtaWWtlWmNxeV9oXF5lbGhla2lxd3+Ib2x/foB1b4J7gIJ/gn92gYWIl4lxgo1xe4Z8enmDk4x1anl+a29+dH99b3J7epNwb4F+eGeSi4OhmZyRgoVmhoNvZ3mViH1+hIGYiYF8jYxoeHJrbGZfYG95bV9ib3hcZGuCemFxdl9lZdTqvYsyOj6Ljn9xeIWIjo12gpWMfpKNjH9tbIWNjHV8j3+FgZWIfIJ4bnaHhIOXd26IhWx1e3RmeYKDp4uCjouEfm6AdniFe4ieko2Rk5OOi4d/e5KGd36DjIJrf3JogH54bXx8goqDd2F5hIFxZHFofm51cXWCm4uAf4WAc3V+gXOBb1xuf3V5i4SLe4iBfYl4enJtiYSRhYxzgnqAl4yLgHVta3aAgHV0W2dndW5XVntSWXBkS1pycmVbSXB4b1xbW1lddH50aFliW2dmb2RqTVdmUT5eZVxddWVgdXBaWVRuZFlkcXlaaF1fZm1naWtpcHd9jm1pgoR+eW6AfHyBf4J6dYKBjZOEcICLbnd9gHt7h5KJf2h7fWpze3KFenN3fn6MeniEfXxrjI2Em52WjIGAbI19a2h+jYt6fn6Dk4J+fYqIa3VxZ2hiW2Jnc29fYWtzYGhwiHpic3ReY2SboI9uXDVar7V0aYCIfJKGdYWVhXOOiol2cGyFg4d1eYl4iXyTiHp+cmd1iX5+mG9xhn5odnluZnmHhKSHgIaMiX5uf3eBgn6Om4iDlZKZiouFiXyPiHB6fYR7aH5saoB7emp6d4KHgHJgd4F+cWRyZ3aCbXV7hpWRgXyCgW93enx1f21ZcIB3dY2Dh3iIdoOJenhzb4uBkYKHc39+f5SJintvbmptgYF0bVxmZHJwUFp6TVtvXE9bcm9kVUtzeGlXWVlaYXGAdGBdXWBnZGlpZk5ZaE1AYGNbYHVhXXVsWFdTdGFaZG9yV2peYmhrZ21saHB3fJNsaISKfHxwf357gX+CeneAf4qLg3F7iG9xd4N/e4mMj4Nqfnttd3h2ind8eICBh3+Dfn56bYSMiJijjYSDenWLeGtsg4eQeH16gZGAgH6Kg3BycGNmXllmX29vX2BncGZqb4l0YXRvW2FkanZ7gL+cpqTIuHGFg3KSfHiGkoJzkIuHcXJvg3uDdHSHdIh3lIh5eXBjd4d6gJNpcoR2Z3d1Y2p8goidgX9/jo99c4B1hnqBk5GEepePlpCIgoh7iIhreHl+dGd6aGt/eXNpenaAg31oYHeHfWpqdGh7gGl2gYyRlH56fn5wfHZ8dH9iVnh+c3OLhYJ9hHGHind4cXGEg46Af3p+fXaPhoR3anFpbIeBcW9cZmFxbUlkdUtdbVVTWXJuYlFPdHhhUlhYXWFvgnNbYV1oZWVka2RQW3BJQ2NgW2NwXl13aFVWVXZdW2VuaFZrXmFpZ2Vubmhwd3qTbWmIjHl9cnt+eYKBgXx1fIOIhoNwd4RybXeCgn6Ji5N/cIB7d3l6gYt0g3h+gYGChHqAdW9+ioubnoh9hXp3hXtndIWMj3l+f3uIhYN2j39nb25fZFxYZVltcmFgYHBsa2iJbmF0aVleZG6Ad6naqseGh7JxiXdvjHV7ho1/epKJf3RzdH53gHBxf22EdJSGeHVrYHqCeYmPZnGEcGd2blttfICQk3+AeZGTfnl8bol3gpKNhXWXi5KPh4WGe3+EbHR2fm1ndmRte3VtaXd2f398YWJ4hnpodXVifXtndYaOjZV7dIB2cYB7fW2AWld1f3B2hYh/gHptiYZ0eWx2gYSFf3x+eXx0i4J+dGh0ZW6Kg2xzWWhec2RHbW1LWmFXVlV3bWJQUnR2WFBWWF5hcYRvXGBjbWRkXm9jVF1yRkJlX11mZ11be2JRVVx1W1tna2FWal9gbmVma3FocHZ4jnRrjo11fnZ4fneBg4F7c32DiIeDb3KAdHF1foWBiY2Ke3eAeIN7fIWHeId8fYF+hIB7fnN2eYyOoI2Jeol2dIN4Xn2FmIt4hoN0hYaEd4l6Ym5sW2JbW2FWaXNjYFtnbm9mh3FhcWZXXWNsf3zKzoe5oWptbYpscYRxfIOJfnqQhHl4c3l1dXtqbHZjhHWSgndvZl59gnqLimVygmtqcWNYbXqFm4iCgXOXlHh/fW+JcoSLjYlzmI+RiYaLg3t5fXBwb3xmaHFibXhxamtxeH18el1leYB4aXZ4ZoJ3Z3SHjI6UfXKHam9+gXlvfV5Zc39udYGLfIJvcIqAcXdpeICCgIJ4fnN7dYd9e3Nnc2Fui4FrcVdpXXZbR21qTFZUXlNVe2thT1R1clBRVFdeYnSFaV1gbGpmY1pvYVhjcEdAZ1xgZV5cVnteTlZlcFlbamhdV2hgXnJma2dxZ3Bzd4Z4bpWKdH96eH55g4eAdXF/hoWOg3Bwe3h2dXqGhYeMhnp8f3SLfn2GhISHf35+fYd/fHh2eHiRk59/jH2LbXV/eGSChpWFc5GKb4WFgXqDdGNuallfW1xdVGdyZGBYZHFyZoFzYmtlV1tgan93vq57oLZuYnOGaHN7cXmBhHp9i353d3J2b3t2ZWpvYId1joFzamJef3h5i4RmcX9oa2taVm93iaOBhH9xmZNygXl2hG+Cg5OJdJaKjoiFiYV9eHRxbmh4X2psX212amdqa3l3enZaZ318eGVzfm6EdGV1hY2Gln9wjGdreoR1bnViXXF9bHV9jHuCZnaHfW5xaXZ/eX+Ac35te3yCe3lxZmxibYl9bG1VaV92VUppak5RTmhNWHtoYU5VdmtMUVRVX2Z1g2ZeYHFoZ2JXaV1ca2hKRGpZYWRWWVV5WU1WbWpZXWtkXFllY150ZmxkcWdycHWBeHCZhXZ/fnd/fIWHfXVygoiAlYNuc3l7enNyhYeJiIN5gX51j358hIqOhIKDen6Lg3t2e3d3mp2XeomChml2fXtsg4SSf3GOgXCFgn6Bf3BmbGdYXVtcW1NkcGReV2JydWl1cGVlYldcXGiAcG9ygHOJZGR4fml0dXNygYN3gIN5dnN1bmt6cWJna2eGdI2DbmZdX31we4l/aW15Z2pkVVdyb42mfIR7dpaRdH1zfXtvfXySh3iafYiGg4aDfXVvcWxndFxsZ15sdGRnZWl6b3tyWWiBd3VocIF4gnZid4WLfJSBb4xqbXuCcWdzZmFuemdzeIt8fmJ3g3dqbHJ2e3F7enR+Z39/gHl3b2RmYm6Fe2xqVWhib1JKaGpPS05vR117ZmFNVXRjSk5TV2Fqdn5lXWdzaWZgVmNXYnBdTEtqWGNhVVRVc1ZMWHVkWV5rYFxaY2VfdmdtYnBpc29yfnV0mYJ3f4B3f3+GhXp8dIKEfpeFbnJ0fHp0cYSFj4GAeot2dJB/fIGVjoCFhHx+jIZ7foB2e6OlinmIhYRrdXx6dYOAi3puhHN5hH2Bg3VuamhlVl1bWlpTYm1kW1hhc3tpaG1pYGJXX1tqgGprcIBna2BoeXhqc3RzbYOAen98dXVuemhqeWpfZW5ogXaQhGdlWGJ3an6He29qcGdmXVRYb2eOqHeBenyRjnp2cX9wdHd6kIF5lnSFg4CFiHZqcXVnZ25bbGNdbXJfZ2FqeGh8bVtugnJ0am+Bfnp3YXeFhHiPhXOIcm95gHJjcWlccXhkcnSJfHljdIBxaGp6dXJteXh2eWSEfH95d3FkZGNufHxqalRoYWVTSmtnT0dRa0VgeGZhTVNxXUpNVFpla3Z7ZV9tcWlkXVZgVm5uV0tTaFdlXlhNVWxUSlx5X1tea11dW2NlYHlobGBvb3VucHd1eph9d4CBeoCAh4Z6eHmCfoGThHF0dH95dnSEiJF9gHyQa3OVgHuCn4V+h32Af4aCgIp7doSrn396iIeDa3KBeXWAfoB0boZufIBzioBqb21kZFhfWllaVGFqZ1taXnSCaV5tbFxhV1xcbIFlcnR9aWlca3Z1Z3N2cWyEe318eHVybHlnaXhmXWVzZ3p3k4FjY1RlcGeChXd3Z2lqYFdWWWdjj6dufneAi457cXJ+aHpwe459eJBxhH1/f4ZuZHVyZGdnXGphXG9vXGdfbXVkemhddIBvcmtyfH51dmJ0hYt7iIeBgHhydX91YXBtW3J0Y3FzhXx1ZXOAbWFte3Brant5dnNmhnZ7e3ZxZWJlbXN9aWtTZ11cVEtxYlBGVmFHYnZmYUtUb1dKTFhYZ2t1emRlbnFmZFpXXVh2ZVRKXGJXZ1dZSFdlUEhieFpdX2xbXlxhY15+aWpfbnR4bXBudoOXeXKBgHx/iYyGfnV1hnmHjHx0dXWCeXp6goyOfX6EiWlzloF6ip19foV6gXp/fIaIc3GPrYx7e4ePfWRxh3lzfHp1cm+FbHt+bI96YnBvYmVdZVZZWVdjZmtfXVxyhWhYcG5bXlhaXGx7Y3B3dm1iWmxzc2d0dW9sg3h+f3h3bm50ZGl0ZVtndWZ2dpJ5X11SZmZqg4J0fmJkaVxUV11iY4+kaHh0g4aReW1we2l5bnyGfHaJc4B4fHh/aGR2bGBmX15pXlxza1llXW9vYnplW3d8a25ub3h5c3Vkc4OSfoeDiXt3cHJ+c2J4ZFxwcGJxcoJ9dGdygGVebndpZWh6fHVub4J1dH10cmJfZm5ufGRoU2dYV1NMdl9QSllYSGJ0Y2FJVG1TSk1aV2lscXtibWxzY2JaWlthd1xTTGNdWGlTV0dZYE1GaXVYXmBsW1tfYmJchGlnYW54eWxvanaBkHhtg36AgZOIhIF2c4h0jIZ0cnZ1gnd8fX6MkIB+k35wd5WDfJmSeYCAeHp+gHSIg3RwmKB6e3+JlHhjdYd4c3d0a3Rvfmt4fHCRcl5wb2BnYmxUWlpXaGNtZlxbcYllU3JuW1pYWGBsdmNpdWppXlltc3Bsc3NzaYR8fn57dm9ubGRpcWNba3JkdHaOc1tXU2VhcoB/coJdYmNdU1pgXGORn2VxcYWEkXRsbHtucHF7fX1xgXiAc3p6emNldWhdYllgZ1pedmhXYl1vaGF3YFt7dmlqcm54c3J1aHGClYOHfoR2c2pxfW5md1hdbG5jcnOBenRnb35bYHByYmBrcn5tbXV/c3F4a3BhXGVsbHlgZlJlVFZRT3RaUU9YUUhjc2JgRlVrUElQWlVra2t8ZW1vcWJbWlhZbHFXUlBmV1ZoU1RGWlxOSHF0WF9jbWNYYGBhXYtqY2RteXhrcGl1eYZ7a4N9f4SafIKEeXyHbo+Hcm92en10gYJ8i4+Cgpd0eIGThYGfiXWBgIF0f4Jxh4J1b6GWc3uGi4Z6ZXeKbm16bmZ4cHprc3ZyjGtedG5hZ2VrUl1bVWdhbGtaXHCMZE9vbl1WWFVnaXRoYnRlZV1ZbXRtb3V0eGqGfH97h3aPc2Rka25hXG5tY3N4h2taVFZjZHh9fXGGXWNfY1NaX1lilZVjbnCDhYp0a2h8cGZ0eHV9bHp1dm96fnVeZXJjW11WYWNYYXRlVV9gbWRhcV1dfnBoaXNxdHB1dmtthJOBiXuFcXNncH5xc29UXGdrZnF0gXdzY212VmJybFtfcGd+Zm13fnNzc2ttYFpkamp2XmZTY1RVUFNsVlBWU09HZHJfYUVYaU9IV1RWbWhkfGlreGtiV11VW3RkU1JXaFFYZVRTSFpaUE13dlpfZWxpWWJgXl6ObmFma3l1bm9pdnZ/f2yDgH2Hl3uAh4GJfmuTiHJndIB7dX+CfYiOf4uTcnyKkYWHn4Z7f4aMc4GGc36Cdm6ki3KBjYt2d2x6jGBke3BmenN4bG1xdoJnZHtsY2ZnaFNfXlVnX2xuW15tjWhOaW1gVFZTbmd0a2V4ZGRcWG9zbHF6d3Jsh3t/dpt6eWthZWxtXmBvamVweX5nWlZYYGx4fHtwhF9iXmdWWF9XY5uIYmtwgYd9eGxreW5cd3Nte2l1dG9ve4ByWGltXlhcVWFiV2RwY1NeYWhhYmxaYH5rZmtzdm9td3dsaYWMf4l7iG1yZ3F9bnNuZFphaWlvdIJ0c15pbVNlcWVVY29je2Ryd3x3a3Bta2BZYWdodFxkVWBVUk5XZFJOW09PR2RvXWJGWWlNSV9LWG1kYHhpbn5kYFVfVF11XFRTYGZOXWFVU0pcWVBZdHVdX2VsaFhjYVtejXFjZ2p4cXNuaHZ0eoNygoN6iI5+fImHjXlukIp1bHOCdH9/h4WGkoSVj3l9jI+HkZuEgHyMhXOAgXN0eHJvk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjYyMjIyMjI2NjY2NjY6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjIyMjIyMjY2Njo2Ojo6Pj4+Ojo6NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPi4xMTExL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERBUsza2NjY2NyLaW5ubm5xSSwwMC8vLEmFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI8tGh0dHRwaaIWCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTJG2Orn5+fn64tiZ2dnZ2w8GBwcHR0YO4OBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fX59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmIiIiIiIeNkJCQkJCQjIeHh4eIh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaTlJSUlJSVjYmKioqJioaCgoKCgoKEioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95e3p7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkpKRiYeOipCSkpOPjo6OjoWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYuLi4uLjIyNjY2NjY2NjY6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx9fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQkIeKiYmOiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCNhIqNiJCJi4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkYmCiIyIj4eNj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjoiIjIiNho+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH1+fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2QjoyNi42Ljo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJh4KHjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWFhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9+f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eX1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyNjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dHR2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2loZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent5dnd4eHp7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8Pj48RUQ+P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF1eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTk7OzpAOjs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTk1NTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dXNxcnd5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ojs4OTo4Nzo8OTc4Ozs+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1c3FzeHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08OTc5Ojo5ODk6Ojc4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Oz08Pj89PD07Ojw9PT08PDw8Ozw6Ozw+PT4/QEFAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXFxdXV1dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDQ0A+PD0/QD8/PTs+PT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwcHFzc3R0dXl7e3t9fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VEPz07PEA+Ojs6Ojk3Ojw5PT1APTo8Ozs8Ozg6Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BxcnJydHV2ent9fX1+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz9BQUFCQUA9PD07Pj06Ojo8Ojg6ODg6Oz0/Pzw7Ozw7Ojs7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXtOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAPz8/QD0/Pz48PkA/PT09Pz49PkNEPzs8PT5APT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dIRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxwcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBfVFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDREE/QEBAPz1APjw9Pz9AQEBDQEA/QEA+PTw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JCQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEFAPjo+PD89PDo9PEBCQkVAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHREVGRkZKTk5LSklHR0hLTEpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgICAgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBERUQ/PEFERUNAPUhEQURERENXdYaJin5YR0hKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIRkhJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUFDRkpISUZISEpIRkFAX2hEQkFVdIeJh4eGh4JXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTEtKS0xLTEhUX2hxe1dObISHhoaGh4eHh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUtJSUdISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N1dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tLS0tMTGBYZ3+EhoR+eX+GhYSEhoaGh4eGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkVEQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVIR0lIS0xPbXmDhIN/gIGEhISFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QDs5OTk9PT47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6fHt8fH5/fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BCRkhLSFB1goGAgoKCg4ODhIaJiouLi4qJiouMiVQ7ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2Nzc3Nzg6Nzc3ODk7NzY4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9OjxEQkRFTXaBf4GCg4OCg4WJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6Ojo6Ojw4OTg5Nzc3Nzk6Ojg4Nzg1ODg7QT0+PkJBP0FLTE9RUFFPT1BRV2tycnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3OkE5PEROeIKCg4OEhISGiYqKiIeHiImKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8PDo7PDg6Ojs6OTk5PD88PUFCRElKTUtKS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk5OTk6Pj1AQE9/goOEhIaGh4mIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUFCPkBCQEA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEBAPj9BPD48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhxcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PDw6Ozs8Oz0+QUE/YoODhYSFhIaJiYiHhoaGh4iJiouLioqKi4qLXj5ER0lLSklGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURGRUFGRUZERkZEQEI+PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pj8/PEA+QUBEQU1/g4SFhoaGiImIiIeGhoaHiYqKi4yNjIyLioqIV0dMTE1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkhHRUtJS0lLS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHZ3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTc8Pjs8Oj0/P0E9QEBEQ0dCaoWChYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlKSEtHRUdISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw7Ozw5PkA+Pz9BQkVES1Z+g4SEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSUhGSkpFSkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVbnF1dnd5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0dCPzg/QDg6Ozg8PTs9QT0+P0FERUZOboSDhISFhYaHiIiIiIiHhoiIiIiIiYyMi4yMi4uLi4teUlJQTU5NS0pHRkNHSkdMSkdLT0xLSkpNTUxPUE5ISUtMT1FRUFFPT0pJSkpMSkxGR0hHRUdJRkVFQkBCQlxwcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgICAf39/VUVDRUVHR0VEOz9BOz08OT89PkBCR0Y/REZESE11hoODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKRUVGS09OT1dWUVBPUVNSTlNUT01TTFBTVVdSU1JQTEtNTU1LTkdHSkZGSEpEREVFQkRDY3F1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj5CQ0ZWTUNKS0hMT3mGg4WFhISHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOztRU1JgdV1VVlRWWVlTWVhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLR0hJSEVGSUlJSElqc3Z5eXp5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0dGRT8/QUBFQkNGRURFTFhSTFFRUFJTeoaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLhmxbZFU6WFhYU1A/QFZVWVxkYFZZYnJeXVddWlZFUVlaXFlfVFlnUlVWWFRUVlNPT01KTEpJSUxNS09NU290dnh5eHd6enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH5/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUtQVFNSVldWV1Z2hYSFhYWFhoeIh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3lucFhaW1pSU1JXVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHl4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTUtKSUlGQkRAQTpQUVFXWFBQT1FTVFNXV1dYWG2BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaW1hcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm9zdXd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TT09NS0pFQz9AO1BQWlpbU1NRT1JSUVVSVVNWX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlRTVF5aWFdXV3prWFpcXF5TUFBQSU5PV1ZYW1pkcXR2dnR0dnh5eXt7fHx9fX5/fX59fn19fn9/f4CAgH9/gH5+enh3dnN1e39/gIB0a35+a3J5XlxWVVNST0tGQ0RBTV6DbFZSU05PUU9RVlJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUFFOS1JUUU1PWVFNTlFTVVVNUVNSUE5MTEhDSUhSU1RaXW1ydnZ1c3N3e3p7e3t9e319fX59fX1+fX5/f39/f4B/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lVUUxJTElhbJJ0UFFTTlFSUVJbUlNSUVJVVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5DQ0NDQj9EUENEQEM+QkhHVkBJTk1HXWlRSEZPRkRFRkhHSEJDSEdISkdEQkFDQE5QTVJkdHV2dXN0dXp8ent7e3x9fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWViXFhTUVBVUnNXZVtPT05MUVNRVVlTVVFRVFJPVmBrbHN2ent4eXVybnN0c3l4fn6DgIOCgoCCgIKBgWtMRz4+Ojs+QD8/Pj5qUEphRUZISUVCP0hNTUdNUVVKQkU/Pjw9PD09Pz0/QUNCPz88PUI+Sk1GVW91dnZzdHZ4e3x7fXt8fX19fXx+fX18fn5/f3+Af39/f3t5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKUFFOS0xRUlFUVlRXUVFXVlBYW2JdYWdtbWxva2hgbnJqbWxxdXt6fXp4enx8eHd4ZEJAQEE9OkJDQkFDQVtcTntOT09OS0xNT09QTEtMV05JR0BCPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV2dnV2d3l8fHx9fHx8fX5+fH19fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJTVlhTUllUTllaW1dZXF9fYGVgXV5xd2teYGdrd29vbGpvbm5sZmJZR0ZGSEJBRklFRUZDTFFPYVdSWFFQU1NSVVtPT1FWUE1JQ0Y+Ojk2NTg2OTc5OjM2NTc5NTxCPWZ0dXd4d3l5e319fHx7fH19fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LVFRTUFFVT0xSU1RXWFRUWFFMV1lZVlhYVlhZXVdXWGhza11WYHRrYWFfXWRgX15ZVVBNT05MSUdKS0lIRkNQT1NaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1OThHbnJ1eHl6e3t9fn19fHt9fH1+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BXVlZTVFZPT1VWV1hZU1VUTEtTVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5OTkxKRlBQVVlTVE5KTk9UU1RcVlJVU1NPTUxJSEhGPz89Ojc4NzY1OTk2NzY2NVdxcXR4eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1RTVlRSWFhZWVlSVU9KR09QT09NUkpPUFBQTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFFQTk5NUE5UUlBSTElMS09RUFFSU1RRU09MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjNAPmpvYVJSUUBGVFFPUFBRTlFPUE9MSkxMT1BOTlBRUU5QT0pNTU1LR0VFREI7PT08OT1HNjY3N0RucXV3enx7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JDOEVOU11nU1FTQUdVUE9SUVBNTU5MSkxLTE5PT1FNT09NSExLSUtLTEtHRkZFRDxBQT47QEU7PDg5VHFzdXl7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E+PT1BQEI9PkVIRkRGRklHSkpARkFBQEZIRUpPSFFSYVxRUFJOU09PUExMT01LTUxNT05bVktNUU9HSUhESUpMTEtGRkZEP0NDPj1CRz9CPkFkcXR3e3p7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj87PkFAQD5BRElFQ0hHSUdJRUJCPz48Q0JBR0lETU9hZVBNT05XS0xOS0xNTUxMS05OU2ROSkxSSUlJRUFISkxNTktHSUZCQkJAP0VGRUhETG9wd3p6eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xNSU1QTVBPR0tFP0I9OTk5Oj9CPzxBQkFBRERHS0ZESUlHR0hDQz9CPz9AQT5DRUNLTlFUS0pJTVRGSUlKTEpLS0lKTE1PUFJQS0dDTEdDQ0pKTE1PTUlKSUdDQ0NESUpNTElac254eXh6e3t5fHZycHVydHl5dnhqcW9qbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZXFIS0NGSEhHSktJSkxER0I9Pj06Ojo7QUI/PUJCQ0NIRkpMSkVJSUZHR0NDO0FAQj5AQENFQ0lNT0dIS0ZIS0RISUtNSEpMSElKTEpNXVJJSEROR0JFS0tOTVBOS01KS0ZHR0pNTlFOTGNuand2dnt4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkcEZLQ0ZFR0RFRUZFR0NDQD08PTo7OjpAREA+QkNFRUlGSkpMRklJR0ZGQ0I7QkNDPkBDQ0NER0xOSEtOSERIRUlMTk1HSUxHRkZJSUxOS0pIRU9JQ0dNTU5NUE5PT01MSUhJT1NRUk5SZmdmcm9zeHV7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lDRUZFQkJBRUBEQj4/Pjo7Oz07PT9DQT9BQ0ZHSkdKSUxIR0dHRkVDPz1FRUI+QUNDQ0RHSUlHTVBJRkZHS05PS0ZISUZFRERJSUhLSUZIUEtESk1MUE5PTk9QTkpKSE1SVVVST1dkYWFtZ3Fyb3N5emdlaGhjaWxncWxmbG1naWtsc21wdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFR0NBQEFEPEJBPkE9Ojo9Pzs+P0BCP0BCRUdKRkpHSUdGRkZFRENBQUZGQ0JCQkRFRUdHSEZMUExJT0pKTEtJRkhFRkVEQ0lISEtKR0tSTUNPT05RUE9PTk9PS0tLUFVXVlVTWWBfXWlhbmluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNwcmtrc01GR0VHQUJAQ0Q8QUFAQzw4Oj0+Oj89P0I/QEBERkhFSEZGSEZFRUNDREJESUZDR0VBRUdFRkZHRUpNS0hRTUpLSEhJRUZISEVDSUlKS01LUFNORFJTUVFSTk9OTlBNTE5TV1ZXWFZYXlpdZGBoYmppZ2tfZGVmY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hCQkJFRTxAQ0JEPDc6PT46PjpAQj4/P0NFRkRGRERHRUNFQ0RFRkZKRUVJR0JHSEZHRkVDRkpKR01LTEtISktGSUhKSEVLS0xMTk9SVE9JVFVUUVRQUU1OUU5NUVdaVlpZV1peWlhhYGBgX2hlY2BkZWdnamhoamZobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9zc3lNSEhHSURBQ0hFPEBFQkQ8ODo+Pj08PEJCPEA+QUJGQ0VCQkhDQ0RFRkZHR0lGR0tIQ0lIR0lHRkRIS0lHS0lNS0pLTEhMSk1LSU5MTk5PUlVWT0xWVlRRVFJSTE9RUE9UWVpZXFpaXF9fXmBjXlxhY2tiYGRnaHKFaGdqZmpubnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtJS0hKRUJER0U8QEdEREA5PD5APz4/Q0I8QD5CQUZDRURDSERGREZGSEhGSEdJS0pFSkhIS0hGRkxISEhKSE1MTExMSU1LTU5NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW11eYGBhYGFlXWRgZmdgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXd1dXV3dnV3c2d0cmtxcmtyd293SUpLSUtHQkRERTxARkREQjs/P0FAQEBEQUBCP0FDSEJFREZIRUlFRkVJSEZJSEpMSEhKSklLSkZKS0hJSkpHS0tNTEpKTUxNTk5PTE9QUlVXVk1OVFZVU1JRUE1OVFNSV1teXl9cXmBgYWFhYGNkZWJkaWNkaWpndotsa2lobW9zcXBxcHByeXdydXV0c21tc3NtcXNvdHV0c3Bzd3R1dXd2dXV1ZXFza3BxanJ2cHdKTEtLTEdDQ0FEPD9FRUVDPUFBQ0JCQ0VBQ0RBQUVHQ0dHSEZFSUZDR0pHR0pGSUxISUpNS01MR0tJSEtLTlFLUlFMU01LTk1OUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV9gYl9gZmJhY2luaWNpaGhteHZtaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJycXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0VBQEQ+PkRFRkM/Q0FFQ0RGQ0NFR0NCSEVCSElJSEhLRkRLSkdISkhJS0dKSk5LTktJTEhKTUtaZkpkXEtsUkhPTV9uVWxzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmXGx0YGxrVV93dmlqaGhmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj89REVGRENDQkVFREZCRkZHRERLRERKTExKTE1HR05JSEpLR0tKSUtLTkxNTExMSUxMTFtzYmRwXmxsVU1OZXJdZ2ZxbG50Z3BpX2FZbm1icHBia2pqZ29xdGV0bm9cb3VncU1Lcnl2a2Jha2VlbHhta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0FCPz1CRUdCRkNFREVFREJISEdERUtIR0tNTUpNTEZKTkhKS0pJS0pKSUpMTU5NTU1LTk1NW3Jvb25wcGxrTlBRbFhOaWJ0cnBhbW92XFlsUFttbVpxbWtvbXh4dHNpcFxgc2xxalV1eXhvY15rZmJncHBqaW9wcHNzcHFwcHFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hGRUVCQUI9Pz9FR0JHRElFRURCRklISEVHS0pHTU1OS01OR0xOSU1LSEpNSUtJSkpOT05OTUxOTUxcaGR1XWxxV2xOT1FuVVprXmtsdmFsZHRUZWNObFlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdoYWNpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSUVFRENBQjxCQEJGQ0dGS0dFQ0NIS0hIRkpMS0ZNS0xSUkxHTU1ITkpJSE5ISkpISE5PTk5MSk1NSlpzcHBvcXFtbE9RU29Zc2tnb29xcW9tdF5uWGF0X25vcG9xcm9vdXN0dGpbXXRjd3hyam56aGFhY2ZhYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRIS0hKQ0VFRUBAPkNDQUZDSElNSEZDRkpMSUdGS01MRk9KS1dSS0dLSkpOSUlKTElLSklIS01NTUxJS0tLU2tiWmleX2pjcnJaX1prb2BlZVVrX2NbYWJRYG1oXGpcbmlpZFpvZWRwXVpca1ttcWNwc2xkZ2NkZ2Bga25wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRklERURGQUBBRURDR0JISkxHRkRHS0xJRUZKTktJT0lMW1FKRkhIS01JSEpKS0tJSEpHTEtLS0dISkpMTExLSUtMTlRbXVRQVU1RUE5PT1VSUE9RT09RSkpOUFFkcWlUWVZbW1xVWVtdWF1cXGNmYWFmYmNmX15ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzR0NFR0ZGQUVDP0NHREVHQ0lLTEhGREdLTEhER0hQS0xPS0xXTUlGRUhJSkhJS0hMSklGSEhKR0dJRUZLSElLTkxJT1xXXk9cXGBeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZF1iWFtkZFZWWFxZWlhcVllcXmNfZGFhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHh5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRElFR0dGS0pLSEVGSkpKRkVISFBKTE1KTVJJSEVBSEZKSUtLSUxKSUdFSkhFRkdFRUpHQklNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOX1xeU1teY19aXWBjX1lfYltgXltUWVhaX15kYmJhY2ZpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh2cnl2eHJxeHZ0dmFTSkpNSURCQkNGR0VHR0lKSklJREdLSktGRklJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRURERUJGSkQ/SUtITltjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtRW19hYV1eY2FgYmJiY2NlWlJYVlZcW15jYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkNHRUJFR0hGR0hJRkdKR0hGSEtJS0RESkpNTUxMSEpKSEpHP0dGTkpLS01LS0tJR0hFREBEQUhJQT5ISUZPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUVFdX2FjY2NjYlxkY2JkY2ZYUVZVU1xYW2FfXl9hYV9kbGttamtsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1CQElGQ0ZLSUZGR0lHR0pGRkZJTEpORURKSkxOSkxJS0pISUdCSEhRTUtLT01LS0lISEVEP0VCSEhBQEZFQ1RdWV5YX1hfW11VWFhQXV1RS0pWXlheW11WWmFSUl9fYmJgYGJiYGNiYmRkYlhPUlJTXFNcXl1eXl9fYGRoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSERSS0ZISEhERktJTVBFR0lKS05MTElMS0lJR0RIS1FPTUxQTExLS0lJQ0VBRUNIRkFBRkRBVlVFXFReU1ZgWE5UVU5aW01KS1RgYVtfWF9eYl1PWWJcYGBfYmNiXWJiV19fVFBPUVJZU15cXF1eX2BiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJUmNRRFdfSUdHSERGTUpQUEZJSUpLTkxMS01LSkpHRUlOUVFOT09NTk1OSEtBREFDREZEQkFDREBMSEJMTFBPT01GTUZGSElIR0xMTU9QSUxPUFBTUExRU1JVWllXWVhYZFZPU1RQUE9OUVVUXFlZW15eYWFlZmNoZGtscXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXk1HSFlNR0hKSEdOTFFRSUtKS0tOTVVOT0tLTEdHS09TU09QT05PT09IS0ZgRURfTERmY0NMW0heW3NtT01WbVlMQ1BfVGxXZ0pdV1VeRE1RVUxNU1ZRUlRYV1RYVVRcVFBmWmhoZFlUa1RYV1VbXFxgYGFiYmJgZ2lnbmxocnp8fX6BhISEhIODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0tJRUZGSEVFS09USktHYFRHSk9KSU9NUlFLTUtMT1JVUk9PSkxNR0hNUVtZT1BQTk9QUEpLUX9RSXxZWXJzV1BtSHFub2FWUHFxdE9Ca3NucXRwU29fW25YXVZcWFVraFVdVmNZYFlaX1ZVV39pdHV1X2F2X1liXFxmW19hYWFiXmBiZ21wbGBwd3R4gYGCg4SCf31+gHZ4em12fnR4foB8foCBgoR8gIN6f4F/fnd3TUlFSE1NQkRMTEdKTEZSVkxMT0hMUlhXUU5PT0xRVE5PUVBLS05HTVBTW1pUUVJPUFBRS0laeF1UeGRoWVJTUHZndGxwYm5ma1JyTkx3bWpycHNycXJwb3CAXWZ6dXhxcXpxfnJ9a3V9YlJnfGVzc29zc3x9cH55b39yX2BgYmJbYWBoa25rYmxmZ213foGAg357eHeAdHZ6aHJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpRT01OSk5XXllVTFFTTllZTFNTUk5MT0lRUlRZV1dRVFBQUVNMSGd4bGN4cW1aS0xUeXB1bXVibnZQZGVJZXZxbXdvgGpmeHhpWHJSaXttaWp6en1seHp/cGdvWHV1anZ1cIBhc2h9aWx4fG9fX19jYlxfZGVmaWpkZ2JjZGxscHBzdHNzc3lxcnhibHRncnl7c3J1eX6Bc3Z6bnx9eXhybk1KUnROQ0JFUFBJS0xKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSlNUVVhXV1BVUE9OU0pLcm91dXF1cWRoYVZuTHFwXkdoeVd2VEtoeH14YHl7c25hXm1vZFNncnVubXlwd2x2c3RxbG1cc316a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGVlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tS0taVkhHRUdSUEtMTktMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5KVFRWV1lXT1NPT05RSVJtSGl3S2BkdnVVV2xObmx7cmFqZ392VUtXa2h9bG1seGBbcHp7X2B6c2Nyb3hxaGR8aXJ7XVRLbF92dWtpdXt7bX54a3xwXV5eYlteYmRlZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmxobW1yfGttaGt7dG1ta21PR0pLSEpISFJRTU9QTUxTU1JPU1JXUlZUUFdaVlZUVFRhYFFPTktUU1NRVlZPT01OT1FKSFFOUFVMS0tSU1JSUk9WVVFRT1JSWFhRTlBVVFhYWFtbVVNTV1tXWFdbT1JUV1dYUV1YVl1VU09YUlZXV1haYFtncl5bW1tdXV9jWl9jY2VmZGNjYlpjY2dmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFBJS0tMTUtKVFJNUlFQTFZVVFBUVVhVWlVSWl1WVVRXVVlYUE9MTldUUE5VU05QTkxRUEtKUVFLUU1KS09RVFJRUVNSSUlNTk9RUlFRUVRWUlhXXFdTU1FRVVVWVFpRTlNRV1VUWVZUWVVTUlVTVFVYWVheWl9hXVxbWl1dYGNcXWJjZGdlZGRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkZGZoUUpLS05PTE1UUU9UUVFNWFdVVFZYV1daVlRcYFZXVllVWFRRUEtPWFNQTlVRTlJOTFNQTU5VU05RTk1OUVNQVFFTVFROTE5PUVRUUlJRVldVWVpbWVNVUlRYV1dZW1NPU1RXVVRZVVZZVFJSV1VWWFxaW2BdVllfXV5dXF1gYV5bYmJjaGZlZGJYYGBiXWBoZWZkYV5fXV1eWlpfWl9nYF5eXWNoa2FoZmhmZGBiZGJQS01MUFFMT1RQUFRRT1FaWVhXWVpaWFlWXWpkVlhZWldWVFRPS09WVFBPVFBQUU5NUVFPUlhTUVFPTU9TVU5XUVRUVU9OTlFUVVVUVFJUWFZaXVxaVlZRUldYVltcVlBTVVVVVlhUV1dUUlJYVlZbX1teYF9WX11eYFxcYGBfX1piYmRoaGVkYlliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST01QU1JVWlVTUFBMUFdVUVZSU1NYTU9QUVRYVVVVU1VZWFteXVxbVlJPVVZVW1tWUVNWVVZYVFNYWlRTUVlXV11fW2BfYFZiXGBhXWBiX1xgXWNhY2hpZWZgWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFpcW2BeYFteXmFgX2NcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWV5cX1dcXmpwd3mAY1xbVlZZUk5PV1NOUVFQUlRSTFFUU1lbV1VPUk5TWFVTUlRSUlpPUVNTVltVVlZUVlpYXV5cXF5WU05UVlZbW1VRU1RWWFhSU1lcVFJSXFhaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2lkZ15cZWBhYGFjZF9iX1laX1tcW1hYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFpdXl1cYFxgVVxdaGpyfXNsaFxVWVdRT1JbU1JRVFJUVVRLUlZVWlpaU09TUVVVVVNOVVFSWlJUVVRYXVdYWFNYXFheXVlaXVVVTlZWV15aWFFVVFhYWFNWWVxUUlZdWV1dYV5jY19ZYFtlYl9kZF5eY2NhXmVmaWVmXV5kYWFhYmNkX2JeWFtfW1xbWFhYWFdbWltgXVtbXFtYWlteVl5ZXVBPT1JaUFtVVVdWVFRUXl5gX15iXGBVXV5ia3l1bX1sWlVaVlFRVFxUVFRVVFZZV0xSWlZcWlxSUFVTV1VVU09XUVNXU1dVVltdWFtZVVpeWF9eWVxZUldSWVhZX1lZU1VVWllZVVdZXFVUWl1cXmBhYGVkXV5dXWVhYmZkXl9kY2BcZ2RoZmRiX2RhX2FgYmJfYF5XWV5aXFxaWVlXVl1aXV5bWltcW1dZXF1WWFddU09QV1lQXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXaCe2hYWVpUVlRWXFhXV1ZWV11YT1VcWV5dXVRTWFJXVVNSU1hSU1ZUWFhYXV5YXVtVXl9YX19YXFZRWVVZWlphWFxVVldaWlpYWVpaV1ZdXl9eY2JiZWVdYlxgZmJlZmRfYGRiYVtmYmhmY2ZhZl9fYWJhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlNaV1RcVVZXWVdWXGBhYWNhY19fVltgZGFfenVvaFpcWlZYVlhbWllbWVhZYFZPVF1bYGFcVVVZUFRWVFJWVlJUVVdbW1xfXlpfXFZfX1pdXlleVlNZWFlaXWFZXlZXWltaW1tbWVpYWV9fYGBkY2RlZWJkWmJmY2dmZV5hYmBjXmNjaWVkZ19nXmJiY2FhYF5fWFRaWlpbW1hcWFhcW1pbV1daWFdcW1xgXVZdXVNPVlpWVlpWWVVYV1heYGJhZGFkYV5ZWWFkYmBrZmheXF1bV1dZWlxcXF9bWVtiVlNXXl1hY1xTVllQVlVVVVZWU1ZUWF1dX2BgXWFdV2BeW15cW15YVlhYW1pfX1peWFhcXF1dXltaXFdaX2FeYGVkZGZmZmJZY2ZlaGdkXmNgX2VjXWZpZGVoX2deY2JjYWFgX19bWFlbWVpaWFpYV1tbWltXWFpUWV1cWmBcVV5iTVJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9dXV1YV1tbXV1fX1xaXWNYWVdcYGNkX1JZWVBXVldYV1ZWV1ZdXV5hYmFfYl5ZYV1dXlldXllYVVdbW2BeXF9ZWV1dXl5gXFpaWVtfYV9iZWRlZmdnYlpkZmdpZ2NfY15gZmVaaWljZmljZl9iYmNhYGBfXV1aWFtZWVhYWllXWltaWVdYVlVbXV1dYGBiYnhLV1dcWVddXFxdWldcXV9gYmRiY2FdYFhiY2JgY2FjXlxdXFhXW11fXWBfXVtgZFxcV1piZWNhUlxZT1hWWVtZWVdaWmBeYWJjYGFjX1xiXV9dW19eWVlUWF1dX19eX1taXl5gYmJcXFdbXWBiYmNlZGdmZWdkXWVmaGlmY2FiXGNnYFxpaWNoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXVlhQWFpdYWNmZnJrf0pZV11bWl9dXF5cWV1bXl9iY2JhYV1iW2JkYV9jYmJdXFtaV1hqcWBcYF9dXGFjX11YWWNlZGJUX1pRWVdcXVxbWVtbY2BjY2NgYmRhYGNeYFxeX19aWFZbX11cYWFfXVtgYWJlYl5cU1xfYGNkZGZlZ2ZlZmVfZmZoaGdkZGBbZmdeYWhoYmhoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7fHt7e3t8e3p6e3p6enp7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKh3NxcnJycW+pwb6+vr7BooqMjIyMjYl+f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyJcm9vb29vbLLQzMzMzNCqjZCQkJCSi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4OEg4GCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eHh4eHh3d3d3d3d3eHl5eXp6endvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx6enp6enl5f4OCgoKCg4B8fH19fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ1dXV4dnZ2ent4e3h3dnZ4eXh5en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t7e3t6eXl5eXl6e3t7e3x8e3x8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3d3x7e3x5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d5fnt5e3h8enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3t+e3l7d3x5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHt7eXx4fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl3eHp5eXl5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZWZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fX19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcIqQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uJg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMj4uKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKjIiGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjIiGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4OCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCg4GCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4OEgYGChISCgoKHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFg4SEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OCgYODgYCCg4GChYWFhYaGh4aFhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4SDgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKh4KCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEhIOCg4WDgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgYKDg4OCgoSEg4ODgoKEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGTkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgoKBgYGCgoKBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+fn+AgYGBgoGAgoKBgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIKDgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYGBgoKEgoKDhIKDhIWGhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgoKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4KBg4KDhYWDg4OEg4SDg4SEhYSEhIKBgIGCg4KChIODgoKBgYSFhIODg4KCg4SEg4ODg4OFhYSEg4OCgoGCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOTko+MjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCBgYCBgYB/gIGBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgICCgYGAgYGAgIKBgoKCgYGCgoGAgoKCgoKCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGBgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42Lh4SEg4OCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+AgH+Af4CBgIB/gYGBgYOBgIGBgoSDgYGBgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGAgIOCgoOCgYKCg4ODhIKDg4OCgICAgoKCgoKCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhISDhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhIODgYGCg4ODg4ODgoGBgoKCgoKCg4KBgYKBgICAgICAf4CBgICEg4WFhIWFhYWEhYWDhISFg4OEhYSCgoKDgoKEgoGChoWDhYODhISFhoWEhIWCf319fX6ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhIWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgIGAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDgoOEhYWGhYaGh42Hh4aDgX5/fn5+fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoKCg4ODg4OCg4KBgYKDg4OCgIGBgYGAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4OFhYWEg4GHmYyFgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGh4aGhoWEg4SFhYaEhYWGhoeHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoODhIODgoWGgoB+fn6PiX9/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiIiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGh4eHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eHhYODhYSDg4ODioZ/gYCFgYCAgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYqLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI6RjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeHhISFhIODhYSPgoWDgoKCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoOCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWEhZGDhIODgoKCg4F+fX5+fn5+fn18fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeHiYiEg4SDhYSEhYWGiIeGhYOCgoSFh4aHhoaDgoKDhIKDhISCgYKBgYGDg4SDhJGSkY6PjouHhYaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWGiIuKhoSGhIKGhoGDkISDg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GDg4SFhYWDg4WEhISEhISFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4OEhYOCg4GCg4OEhYSIkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoGAgIF/fYCGg4ODg4KCgH19f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYODgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhoyTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5/fnx8gIODgoODg4F+fX5/gICBgH59fX19fn18enp6f4KCgX9/f39+f3+Afn2Af3+AgIF/gICBf39/gYF+fX1/gIF/f36AgIB/gICAgX+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fn6AgH99f359fn+Dg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enp6gICAf39+fn58fn9+f4B/fn9/gH+BgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f35+gH+Af36Bfn6AgoSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7gIB/f39/fn1+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZOSjYyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoOBgYJ/gYOEhIGBgYGAgH59fX5+fn9+fX19fX18fHx7enp5eXl9gYCAgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIKBf39/f4CAf3+Af4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEg4GCg4OCgoKCgoF/fn19fX5+gH19fX19fX19fHt6eXl5eXmAgoKChIOAgoOBgIKAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGBgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoWEgoKBgYKCg4ODg4OCg4OCgoGAgICBgYGBgH9/f3+AgICAf4CBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoaFhYWAgIODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoCBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGhoeIh4aHhn99gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYSGiIyFg4KCgYSChIOCg4WFhIWDgoODgoODgoKCgoODgoKSkIuIiIeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359f35/gX+AgoGFhYWHhoeHhoeIiIaGh4eGh4eHf3x9fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomXhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKOi4mIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYCAgICBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSEhoWAfXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3x/goOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fX+DhIWFg4WGhYSFhYOEhYWGhISOkY+LioqMiYiJh4WGhYODgoGBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhIWEhoSDhIOCgYGDgX99fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32DgX+CgoCDg4SEhISEgoSDhIWChJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIKCg4WDg4SFhYWDg4OEgoGCg4KDgoKBgYCAf4F+f31+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn9+gIJ8fH9/gYCCgH59e4qCfYB/foGAgIGCgYKAgICBgH+Lk4+Li42OjYiHh4WFhISDgoKBgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYWGhoSEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX18fXt9fX18fXx8fYB/gIB+gH5+gZORjIyMjY+KhYaGhYSEhYODg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/fn+LkI2LjI6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYGAgYGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fXx8fX59fH19fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36MhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJGMjIuOjYuKhoSGhISDg4ODgoOCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn9/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXt6e3t7gIaFgoSDgn+Afn+CgoJ/f4KCf4CLj4yMi4yLioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gICBgYB/fYB/f35/fn5/f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH17f357e3t8fHx9fHt7e3t9fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4aChJGOjIuKioeIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f35+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fHx7fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3t9e31+fn+AgIOHiYmJi4mLiYWIkY2LiImHhYWDgoKDhISDg4KCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foF/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgYB+fHp8fX1+fX1+foyGfX1+e3uDgn1+fn19fH19fX19fnx9fH18fX1+fH59fX19fHt7e3x7fHx7ent7enp6e35+goWIh4iKi4uLiYyQjYyJiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4ODhIeJioiJjY+MioiIhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Ign9+gpCEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiNjImJhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX5+gIOAiYyJi4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGDgX5+gIB+foB+fX5+gIB/gX5/gH9/f39/fH9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCBfXx8fX18fHt8fHt7e3x7fHx8fXyJiYeIhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fomFhoSFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp9fXl4dXSAgIKCgoOCg4WDhIOCg4SEhISEhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAhoKEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl0dX2Cg4KDg4ODhYSFg4ODhISDg4SCgYB/gH+AgX59fX5/fn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBf4B/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f36Af359e3p7enx7eoKEgIOCgoKDgoSCgYGAgIKBgICCgYOBgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXZ0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX5/f3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+BhIF/gIOCf3+Af4F/gH98e3t6fHt8gYB/gX9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhYSEgoSDgYOCgICBfn+AfoB8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fH1/fX+AfH9/fX2BgIB+fX2Af36BgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4KAgIGBgIGBgoOCgYF/f4OAfoKChICAgoGCgoSCfnt7fHx8fX19fn16fn19eH5/f3x8fH59foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN3dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4SDf39+fX5+fn+Af4CAf4GCgYB/fn+Bfn+AgoKAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFg4ODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1/gICAf3+Af3yAf3+BgIGAgH98gH99fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZxeHlyeIWFhYWDhIOCgoOCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gIF/fIB+gIB/gYCAf32Af35+f399fX1+gIGCgX5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fX17fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWGhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH+AgYB8gH+Afn+BgH9/fYB/fn9/f319fICAgIGAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+gYSCgoOFhYKCfn19e3t8fHl3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFycHh3cXuFhoWFg4WCgYODgYGBgYKAgYCAgYB+f35/gH18fn2AgIKBgH+BgX1+gH9+f4F/gH9/gYB/gH99fnx9f4CAgIB/f39/fn18fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn6AgX+Af4CCgICAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgIGAgIB+fYB/gH+BgoJ/goJ/gIF+f4GBf4CAgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f356gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH19fn5+fXx6fHx7fX17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKCgIGBgoGCgYGAgYCBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIJ/gICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e41+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHt8fXt9fXt5eXt6eXhzdHVuc3FweHJ1eoWGg4OCg4KAgICBgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYSDgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgYKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx8h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgIKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOBhISAgYF+gYKAf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+BgIB/gIB/gIGBf4CAgICBgICBgYGBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH17fHx8fH1+f39/f359fX6Af4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYGCg4B/goGFg4OEgYGDgYKCgYGAgIGCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/foCAgICAgH+AgIB/gICAgICAgH+AgYGAgICAgIGBgIKDgoKBgoGBgoGAf3+Af4CHfn58en18e31+eHd2eXl6fH19fH17fH19fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICCgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn99f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fYB6eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKChoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGCgoCBgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYKCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn5/gYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoSGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYKDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBg4ODhIGChIKDgoKBgoKDgYOEg4SEhIWEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3x6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4OEg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fX18gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoSFhISDgoOEhICEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4SDhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fX19fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Dh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KDgX6AgIKCg4KDg4OEgoGCgoODgoOBgoGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoOEhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fH19fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gYGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KDg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgIKEhIWDgoKDg4KBhIOBg4OEg4SEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4GAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KDg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgH+Bg39+fnx+fX1/gYB/fnx8fn9+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhYSChIOGgIKFhYqJhISDhIWFg4eGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIR8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhYF9gXWBeoN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WCgYSDgH9+fn59fYGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISGhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBzgoN/g4N9gX1+fn1+goOBfH+AfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhoOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugIh5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9f359gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOGhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB1gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYF/f3x/fXyBfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4mFhIaHh4WDhYWFhIKFhYSFhoWFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhIWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYqIhYSGhoWFg4WFhIWGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYWFhYaJiYeGhIaFhoaFhoaEhoaHhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEg4GDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoWGhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WDhISFhIWFhIWFg4aHhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH17fHx9f358fH59gH99foB+foB/fX18gH1+fn5+fn58fH1+e3x8f3x7e31/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYSGhIWGhoeHhYeGiYiGhoeHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoaDhoaFhoWFhoaFhISFhYKFh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fnx/fn19fn18fXx/fH5+fH2BgHx8fH18fHx+ent7fX6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoSGhYaHhYWGhoWEg4SDgoSHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fHx8fX18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHiIaGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWHhYSDhIODg4eBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4eHhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODg4KDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhYSFhYaGhoaGhYaGh4aHh4WDhoWDgYOCgIOFgoN+gYGBf4OBf35+f35+fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiYaGiIiHh4aHiIaEh4aGh4WFh4OEhYSHhoaHhYWEg4WFh4aHhoaFhoaGhYaGhIOFhYKBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYWGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChoWGhYeGh4SGhoaGhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH9+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhIaFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIOGhYaGhoaGhIWGhoWFhoKCgoR/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18gH59fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfoCCgn1+f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYSFhISGhoeIh4WFiIaJh4WDhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhYSFg4WFgYGDg35+f4B/f4CDf3uAfX1/gn2AgX5+gX59fn19f3t/fHt6eXp6eXp6fHl6ent7e3x6e3t7fH1+fX2BfX18fH2Af318hoOGhoaGhYOEgoWChYGBgH9/gIB+f4CBfH5/f36AgIGCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWGiIaFhIaHhYeFhYKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SEg4SDhYSAgIKCfn19f35+f4R+e398fICBfYGAfX2DfH5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHx7fX59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaDhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDgoSDg4B/gIF+fXx+fnx+g358fnx8gYB+gn99f4J8f359fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKDgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWEgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYKAhYOBf36Af358fH59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZMPTg3NjU5OTk8Pjk/PEQ5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU1NPU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dXU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXU1dXV1dXV1dXV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19fc3d3d3d3d3d3d3d3d3drW19fX19fX19bW1tbW19ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzYRtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLm0e3Nzc3Nzc3Nzc3Nzc3CUwLy9vb29vb29vb29vrSKioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OlmjQpKysrKysrKysrKyskZLCpqqqqqqqqqqqqqqybU1JTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7QEM+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX183OUisxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpp49LjAwMDAwMDAwMDAwKmiyq6urq6urq6urq6uunVhXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87PkBAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNz1w5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaujSzw+Pj4+Pj4+Pj4+PjlxtK+vr6+vr6+vr6+vsaFiYWJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPzs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3FwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Oz87Ozs/PzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0crJysrKysrKycnJycnJzdPT0tLS0tLS0tLS09PRzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7Ozs7P0c7Q1NLPztDU0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbY19fX19fX2NfW19fX19bV1tXW1tbW1tbW1tfW1tjY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Ozs7RwafTyJSo0tDGk6vSzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8/P0Z2PwJyrm7DQma2Zs9LOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q+QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/P07qvq7WVh5yexZOGnZ3Oz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Pz9OfsZu/vsiYmca9yZaZxtDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz9HAnImavdOUlp/O0ZGYoM7Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Uo6KBm8Syn8Kb2q2jv53V0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDRxJ+Be5at0IuTnsfLiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q1auvvMDPlMrbpZmz0NuimbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT07Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJh3+FoJuRp5mgrZComJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NDc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HG09PVnJulpqSooK+noqmc0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg0tHS16iIzJ2RjrrVmpGOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dLPxdTTucfW09O4yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS09TS0tXU09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTY3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87Ojg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VGQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2loeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCDdnR8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q5ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqZG1nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp14cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW1tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampubm5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cnJucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ucm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVGJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFNfTUhRSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipamnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSloqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaatpqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6qsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paGJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpamnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaChqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYWxodWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2s7qxqq60sbCxtLS2vLy+vLy9xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyak5aUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsPDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbGnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb2xocXhveWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtoZ3VaZnJ3c3hmZ11kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/JxsPDxMLEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpoXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIx8nHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraapu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBxsHLy8fGzMnNxcbGw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXRuc2JcYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBw8S/v77Ey8jKy8i8u8jHyc3Iw8jJycbFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7u721s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JvZmVnY2pkYWptbm5eWFxWVU5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwsbCvsbBubvDuri5vL7BxsHGurnJycPFxMDEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmZjWllZXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m9urq0v7i1t7Ovu7y3wLe9wr/Bu7/BvLvFvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYd9cWNgYmJnamZmaWVpXVZVU1lPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1usG4vri/vL23tbewrri2ub+7wL+3wby7w7a6yLi2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2dYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8tru8wMS5t7e3tbq5urvAvcPAusTCvse4ubitt7W4urS3s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg9PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9v7vEt7a4tre/v8S8wsXFx8fKycbPwsG4rrW1vL64u7K+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG53Y2diXGNRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD89Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuqo7C5vb6zvL68xbiyuLm9x8nKw8fIxsbJyMzO0czKxLW6wMPIv7+1v8C/xsa/y8bDv8G8wMPMysfFxsG5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmFhTkhNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0vMO8urq+vMS/t72/vcfMxsfJxsa/xMTKyMzMzcrGwsPLzsK8ub26ucDDv8jGxMHBv8XAysnDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPj5BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8trq9wby7v7a/wb+8v7rAy8LHyMC/vLy/xcLHy8jBw8DAycrCwLu7sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnptc3hzZ3BdW15cWVFFRENNSUFFPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7u9usO7t723ucC7uri4tcXBwsO7ubO0usG9v8bAucC8vsXEvb65srCuuLe/w8fDxL29v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG5pXF9gWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnBwLe9ubi5trW/s7SyuLG7wcDDt7etsLW4uLjCurS7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9lXFpVSjw/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+3ure2trK0wLaytLizusDBw7m3s7KytLK4vrmztbK8uby2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZybF5iYFtdT0hBPj1IQ0ZNQ0A3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u7y4trq2scC6t7m4ubvBwcTDu7u2tLSwtrq1tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybmNcZlhcXVJOTUE+SUJASklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOxrba6rqy8sri5t7u/vbm+wLS/u7y6uL7CvMLKyL7AuLi2srS2srSvrbu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxCRk1GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5urW5u7W1s7W7vMC7vsC0v7m5urG6w7zCysW/u7+/ubS0s7CxrbC5uLa8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jo6OhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmJ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmurK+ysrq6t7e1tbyzr7Srtrq4wMTBu7W8vbeyrbOwr6yutraytLWvqqSem5ycnqionqCoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKqrnqWjm6OclZCMj4+Qk5CXlZaYn56empmml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR09NTEJPUUA+Oz40OTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6Wsqqi1srGwrq+yp6awpK+utcG6tbeyt7aztKuytK6qq6+wsrOupZ6SmJSPmKCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6apsaOlqJ6gnJWTkI+RkJiQlpWYlp+Ym5mbo5mXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01JSEdOUk5KTkc7RUA9Mj83NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiYl5ahqKyutre6ubq3t7uuqKChqaGgrauqpqmkqaSlrqWsrLS8t62zsa+xrrWvr7O1qqetrKObmZSOkZaXmZmcoKKinJ2lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmZabl5eYoJ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHh5YGJSVV9ISUlLU1RJUlBMOT5CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OTnJ6kqK6trKurr6qvqZ6XnqWdnqWmpKGin6agoq+rrK21sramr7Orqaq0sbGwuK2noZydmpSXmpqQjpGVkYyOjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKwtKmxr6KZnJ2eoZmbm5qYmZuUlpuWmJykoaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVbU1pZTVFKTk5VTFJMQTc9Qjc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0+NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkpyYoZ2qoqegnqehpZ+ckpyim5+ho5+doKCjoKKvr6yvsay2qK6xsKimsa6trLCnn56ioJeRlJugnJmXkpOfnKGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7issbSkoJ2ln6yhoaKgoJqYlpagm5uYpKGgnqShn56anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFFVSEZVVkpCTEc9S0g4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjZOemaidrp6nnpyhnZ6ampKZnpyhoqCgnaKgn56fqaunrKmqtKyrrMrApKuoqqyqpaCemZKSk5iYlpaVjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oqyiqaiyqauop6iamZ6aqqefmaagn5+nqKWknp2qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JWTUpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiaqqCxorejsKafnp2dl5iVmZ6bnKOfn52knpudnKWipKOiqrCspqjUtKWsr66pq6efnp6hop2enZqcnJSTlZSenZiUhZ2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLO7xsO8w7y3s6mzraqztK+zrqquo52rp7axrKKvpaCjr7GtsKSkr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHJra3VycGhXW1FFVEhESU9IPkVBNEVIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goZ2cmJufoJugn5+XpJ2Vm5ufm56cn6WmpaCjyLSyrqekpKOgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Aw77HxsK3w8nJwsDFvrm0ubq0u7ewtbKqurGuu7e+urqqt62rqri6tLyurrmjpqOepqWio6mmmZufmJqdp6qnoKGhpJiUo5aUmpGcnZ+knqefnp+inZiZlJiUiIR9enJrZGhveGpkWltGS0xFRFNMREJFNzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlpqWlJukpp2hqqeiq6y8vL/DwbOyuKehoauqop2eoaKenJugkqCfkpmfmZKamJ+Zj4misbOooJqdnJ+empeYl5KMj5aXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXS08zT0NPTzMrCxcbHysfOv8jRzMfFxsTBu8PAvr6+tb2zrb+/wsLGxMfErr64sri8xMHBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURDQDU1NTg6Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5ibo6ydn66mpbGqxcbMzs2/sMGopaisraqhnaOfnJ2aqZOaoJq+o5KOloyCi5qpsKqjn52gm5iXlJOUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K0tfR19LU1dPTyMzHzc3J0szO08zFx8nKwcXLxsjIxb7CsrPIxMvKys7Fyr++v7zBx8TMzMjJv8O/ra+zqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYt/enJ1dmdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjJAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK20uKyuo5+ko5+gpKyblqevy6yMjZGLma+vpp2dnaGloZ6blZSWlIp9d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HT1NTSz9HD0NPW2NXW0svJztHLxs3RydLV1tnV19PW2M7Sys/RzM7QzNLPv8fGysPMzMvOz8XGx7bAyr/RzMvPxcnHv8PDyM7Mz9DPzcrIzri3u6ifpaunnpieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGVyYl1SXElKRkFFSEk+O0A4PTQ1ODU7ODY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopqppqKmq5qjsLGpqLXQ1Nfa0sfGy7S1wsWxtqiipaahoqu1p5qvxMalhoagr6yclZignJuhop+cnZqVindpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTOz9XU1NHRzNDO09fW09XQz9LT0cnT0cfQ2NfY0djS19nV1szPz8nN0cvOz7/FwsfFzs3R0NHIy8zAysvF087LzsjEycbGyMzK09PR1c/SzNLBucWxpai1rqeaqKylnbKosLOsrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMe3pxc3RtYWNpbV9WUF9KSkJGQ1FNPzw+NTQ6PTUyODU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr66qqqudpq64qKu319TV2dnRztDAvMzJt7+vp6upo6SxtbKjt8u7m5Sqq6GYlpiam52gnpmcnpN+cWVjYl9fYV9fYWBfYGBfYGZtcHBua29yd3ebzMDS1dPY2NbZ0dLS18/TzsvSzdXU0srPzNPW0tHWzc/V1dHG0dTK0NTV1s7S0NjY2NfLyM3DyM7Mysu/yb/HyM3Oz8vQzc7Lzs7Hys/Qys7KwsnGyczKy9HSzNPR0c/Qyr3IubCuu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHl2b3Bua2FkbnBhV1xaSUZGRE1XRTtAPDMzPD04Nzg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snnri2tbWtpa2uvrSwwNjS19rc1s/Ny8TT0MLBsaqtrqulsrG4qrvOr6OenJaTl5yen5+dlJeYlIlrXl5eYWRiYGBhYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHUy8zQ0dPKztHV0tXVysDJwcXMwsjJwszDxcjKys7KzczQzdPLxcjPzMjHysTGwMXKy83P0cbQzs3NzM/Fx8C3uL3Dw73DubOyvrG7w8S1qpilopmWkZWVkouUjZqRlJSPj5SCiYV4cHFrbWdgYHFoWFhoVkxGTElQUEI7RD47Njc6ODk6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXFw8G/u7WyscfCuMvV1tna29jMzc/I1tXFw7extaqjray4ua+/yqGXjo2YlZCTkpGWlpaQjHxmYmJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytLIy87NxtHSz87M1MrHy87Px8fP0svQz8W6xL7Gyb3Cx8nOxMHHwMfNx8PLysvPx8PD0MjGwcXHxL7Ax8vLy87CysvIx8zQxMXHu8fDyMjCz8G9vL+wwcnHub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd250ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJulsrGsyc3KyMS+vbrNzcfQ1dXZ2tvY0MrP0NLUycS5vb6vp7eqvbi3w6ySjo6Xj4aDhISCfoWFf3RgXF5eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsjGwsPAw8fKycjKyMHFzMbIy83JxMLLycHCy9DEy8i/ucG7xce9v8bPy8O/w7vJxsi7yMbEysC9wcvGxcS+xby8v8PEy8XEvMDJwsXH0sTAyL/KycbHxtDDw8bDr8TLx8PKt7+8urSprKSlmJ+YrKOhpZqjoJuUe3ZzdGZpWmFubVpbWFFETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMvP0czHwsPHzc/PzNXQ1tnY2dDM087P0MrDt8bAtbW7sL+2uLCRjJOYh3qAhYaAdnh1cnFfWltdYGBiZGRkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsLa6srKzsrHCvLy8urjAwcHFvr25vb+5xMrFxsK9xsC4u8TJv8LJu7e7usXDvrzBzcPGvr61wb3DurzGu8K5s7zFxMHCtr+1tb2/usvDvLW6yLq/vcvDwcXCxcjGyMbQxsLMx7LHycPOzcHFw8C9srewsqeoqLmwpa2wq62slHl2d2pkZ2Bob2NWXllKRUpGSEpBRUJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfGwsTIztLLysrHzc7P0snRxtbU1tjOzNDHzMjKxL3JwbG0uba5tK6RjYqLhXmAhoaAfoR8dHVkXFxdXmBgYmNhYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLS3tLKztLq1vbG3sLWvsrvCvMHEvL+6tbO6vsC4x7m0u7bAwry4vcbBw7u1rrK2ur60xLe7tau4vb2/vbC6tq+2urLFvLauu7+0trTFvb7DxcDDxcbIy8XAxsa7yMu/z8rHw8bCw7bDvb22ub7Hv6y1urW3to54dHhmZ2Via25eVl5gRktISEpGQkRBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy87IxsnOzNDMzsjLycvKy8XRztPQz8fJxcnEw7+8z7yyt7u4trWbjoeJiXt5foaGd3iCfXRoXl1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaGZqbm5yfKTHv7i4tbCrrKeeoqqnnquss62pq6m0rbawsqmupqyyvLq2w7m6urGrtbm7tMK6sL+xvby7trzHucK2raqosLG/tbe8r7CnsbO0u7yrrbWlrrauurGwqriwrbuuu7i7v7+9ucK/x8PFwbzGwcjLuMXHxb/Gw8O5xMbCu8bJzMuzucK8urKIcnZ2a2lhYmxoWVdXW0FMS0xJRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxs7Sy8PGwsXQx87CxMfAxsbExMvCysvCw8DGv7m7usm2s7q7tLOqkYmPkHx5foqGenuFgXdvXl1cXV1fYF5fZGNiY2NiYF9dW1taWl1aWlpaXGRub2hmZ2lrbnKBrbmwta6mpaenmqCkoJqcpauuo6eiq6qsqrCkpp+qrbW2sb25r7evqK63tLS8uLS8r7i5tLG8wbHArqWooquxsrOnvKqrqKusrbSzpaitoaSuqbKlp6itpai3rLCyt7m6u7G7vb6+xL+1wcDHyLe/wMS3xMK/u7/Ewr7EyMzKv77DwMCphnJ0cmppXWFvZFdWWFBIWVJTS0ZGRT4+QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7rEsLawm5mVnJiqqbCxs7W9r8XR0M3EyLq6zMLMwLzKuL/FwLvLucLFxLm7wry4trzEt7S3uaywlYOJjYF8foB+eHR/fHN3Zl9dXF1eX2BeX2NjYWJgYF9eXVxaWFpbW1lYWlxfZmtmZWdlaGtvcoWqpaymoJyhpZSdpJuYkqGjqqOin6Wlp6Wsn52bpKassq+2t6ewrKeqtKq0urG2ta22ubGvurmxt6SfpJ+msaerqLmqpKeoqKeyraCnpp+bpKWsnp+npJ+gsa2trLK0srSwtby2u8HBsrq+w8GyubrCs8C9v7W4u72+vMLHxMLDv7/EoIN3cGthZl9rb2BVWV5ITmdPVEdFSkY8PUA9Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW1vbi6wbu9taCelJ2hprq2q7Ozu7PE0MnLw8e5uMnCzcC5y7m8x7u1x7q1wsWxvMS6ta63vrqvsbStoYSHh4J9enZ0b21rampxaV5gXVxcXF5gX2FjYmBgYGBdXFtcXFhZWFhYVlhbXl9kY2JlZ2dnam1viJ2poJeVmqGWm6KYlo2eoaKmm5+fo6Whp56bopufqrCtsbWiqaqpq6uktLmtt7CssrWusrWusKqfnZ6jorKkpqm4raKmpp+orKqZn6CemZ2fpZqao5ybna+pq6eqq6ytsLK4r7i5u7C2u7u6q7KyubK9tLaxsbW0v7a9wL3Dwbq7vZeDenJrX2VeZGRYVFhdSVdcS1BHSUlGQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xtDIycHHvLzFxM+/u8m6usG6tMS3s8DAssDCu6uos7i1pq+wpoqGiIB5c25wbmtiXmJmZlxdXl1dXVxdX2BhYmNjYmFfXFtbWlpZWFhXV1dYWFhaXmJkZGVmZmhpa3KNqJ2UlJSbmJuhlpaRnKGiqJ2bnaWmoaWcoKCamK2ura6yoKWiraumobSwsbGsqK+yp7qzprahop6bo6Gto6Gptaqio6adpaajlpiel5manZ+al52cnJysoaumo6Smrauzs6q0sLKqsrm0r6mvsrKyt7Ouqayusriwura5vb+3srGUhXl1ZV5lXltZVlNaVUtbUUxJRUhLSUI9P0FBQEE6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbe9v7a+vL+ynaWjmKWxwrW2va20uMLNyMfBxrjCwcjPuMLGv7W8vLbCubW9v7S5vbmopK+5r6WvrJl9hIWAeXBydHFoZWRoZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYWFhYVldhZGVjZGVkZGhqdqKclJSPlJaXn5eZlJifnqGclqGhqKOfnqmcmpqqpq+wq5ujo7eqoJ+uqLappqetsKO3sKS3n6KbmJiqpqGarLiwoqGknKKgoJOVoZSVlpuYl5aXnJWfqZ2po6Gdo6qqsK6otKuqpq2ysKWqrrKxr7Cur6anp7KusbSvvLS6t66jlIF5dWReYVZZV1NSVEtNXkxQS0dHTExFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri9rp2np6Oqu8C9wLmutLjCzcnGw8S+x7nJzbTDxMOwvr+4v8C5vr+4uLu1paWuuaSmn6KIgH15cmptcnRwaGhlZGdiXFxaWVpcXFxdXl1cW1xeXFtcWVtbWlhWV1dWV1hXV1dVW2NjYmJjYmNkZmqBlpOVi5GUk5uZnJaWm6Ccn5Wgn6alpKannpyfpZ+qr6afoqO2qKChoqi0oaWnpK+lsK2stZ6gnZWUqaGilKyxsZ6io52dmJuTi6GUkZOXmJKXl5iWnaabpqGimaOlpaukpbCnpaOrq62mqK6vrquoqqmzpaarr7Sxrry1sa+voJJ6dnJkYVxaXVhOTFJIUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuxuKyepKett7u8wcW6sbm1xcrLwcTHx8i3x8W0xMHIrrm6wbvBv8C8ura4tKSlr7Obn4eXiIB3b2RiZ2lpZmdpZ2ptYF1cW1paWlpcXVxbXF5fXFpZW1lZWltXVVhXVFRXVlNUUlVgYF9gYV9gYWNkaYGTk4iQjpSSk5yUlZajmaCWnKCloa2lpKOio6GbqqulmZ6lsamgoJ2lq56noZ6sramorq2ioaKUl6ObnJCrqLCbn6KfnpeZk4qekY2Sk5WQmJiTm6GinKSgoZWgoaSmm6OrpaKkqqSrrqWtsammpaamtKapqK2ztbS5uq+qrJ6LcnBvYFtXVlVRRlFPSFpcT1JJVEtTTEVHSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7KwrLKtnaenr7m5s8DIurXAr8bJzbvCy83It8u/s8DGy6+0vMa6wMXCvL21uLOjqK6smpaEjYN8dWpqamxoamxta2ptZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV1eXl9fYmRtjo+EkYaQkY6Zk5SSnJqinJugp6iqqKqmqKWjmKSupJSZpa+pn5uZm6Cer5mbqrOfpaafo6OhlJOblpaSqKqtmpyfoaCalJCMmY6LkIySjJaUkJ6hoKOcm6KVm6CioJiiqKOiqKugq6+krbelo6SirK2qqKuusreyvbWzq6+Yg3NzaFtYWFJVUkVYTFFbWU1VTlBMUFFJTklCPD8/QT88NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s66os7auqaivrZupqKy3tqy8yru2v6zMx8a5ws/QyLXGvbm+xcu0r7vDu8HDwry/sbatpKisqZuTg4F3eG9uaW5ubnBoZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVVFNOUFFZWlpaXVxcXl9gZH6NgYt+jJCKko2XkZeZoqCbn6qppq6qp6+jp5mfrKCVlqSop52XkI+anq6Wl6eqmZ+clKWhnpKQk5KTlaerpZqZmZ2dlo2MjJSGiI2DkIuSlJCgnqCjl5WflZqgop2Tm6Wlp6iooLGwprC8p5+jrLSqrqewtLC5tcCxrbGrkH1xcmJWVFZOUklHVlFSUkxMWE1KTE5SR01LQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OtprG3qqaisKudqqepsrGktsa0ubqzy8a6u8LL0cyzuLq+wMTGtbO2vLG5usK8v6+xq66rraiZnoVrZ21ucm9xa3BrZGZnZV5aWVpZWlpaW1paWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domNh5CKmImUlJebmZ2omp+ppaSqnaeYoKWbko+eopqXloWEkpqjj5OinJWWlYeimpqTi46LkJmkqJyVlZebkJKHlI6MgYuNgJCKkpKRoZqfopWUmJiVoqWZjJikpqimoaC0sqeyt6Gdoresqa2ksrKmtbu1q6uxo4h4cWxdTlBRTE9DTU5OUEtGTk5KSk5NUUlNSkFHS0hHQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjc3Njo5OTk5ODQ5ODhBN3e2p6S2sKSno6mloKmlpLOqorLDtbWys8fGuLvEys3Hta+7v7e6w7KxrbWhq7TBuLmsqKmxrKyck6N7XmBnc3F2cWpuaWVoaGpfWFhYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU1NS0xTV1dWWFhZWFtdYW9zdnGFiIKIgJGDjoqUkZOdoI+am6Kho5iklqGblY2HmJqMc42CfY2XloWQmZCTjo57mY6cjIKKf4qYn6KekJOYloSOgpN+fnSJjnqQhpKQkJ2amZqQlZCdjqKjjomaoKGjo5uitK+sr6yfmaW4pqWwobCunLC7qqmvqpmBdnJiVU1ST1BNQ1NOTFFNQlBRSElOU01ISkpDSkxGS0o8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTE3NjQ3ODk6OjY1Ojg3QTd3t6KjtKilpqijpqWmpqazp6W0wbivtLDKxbi6wc/Gv7SuvMOusMawrKaqlKKsvbaurp2lqqqok5GecFdXYGhnaWhpbmNqaWdiXFhXWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5Yco+Cl4aNnJeLk5Cfl52VlJaUjpaJf5OJXztXb3uLlImAi5KMj4WGc4qEloF5gnqFk52Ug5aOkI+Dhn2SeHJvhY1+iYCQjY+XmZiTio+JnIeel4eIlp6aoaCXp6+prainnpets6KmrZisq5intKKpraOSfXJtX1tOU1JWTERUSlBNTEZOT0lFTFFNS09KSU1QRklJPDc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5ebego62hpqaqoKepp6KpsKintMG5sLWwyMO4tL7PwLqwsLfEqa3IrKahnIWZoLirpaaUo6Khn5SMk2dRTVJWWlpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1vaXuCdFBCQX+VkZF9iZSMhIqNmo2VlYqSiIWVhniIf2BKUW54ipGEfYSNiYV/f25+f5R3dXV3hI2ZcFGNiIqHfH54k3Zod4WIfoqIlYqNkJGWi4SKiJSEmoyBhJKblp6clKSjqKmlo56bsKqhpKSQpaqWoamcoqaoiHRsZV5bSFFRUk1JVU1TSUxLT0lIRktOTE1US1FRT0ZIQjw3Njk6ODo7Ozg6Ozg+Pzk5Pj04Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXe2m6KnnZ+hrqGnqKWnqK+tqra8tri3s8K8t6i6ybm2qKm2t6y1v6qhmpGCjpivnqCXi52UlpKPiIpjTUxOTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+HgXyFjJKBkpmLj3uGj4B1f3hzbnVwdI2NgXl9iqqFeXpodnuOcHJteIGKjJJ4eoB7gHZzcpJ3Z3WEhISEepWJiIqMioB/hIuMf5SDe4CPmJWclZGfnamen6CdoKmln52YjKekk6Cflp6epH9xZ2BcXEpWT1JHS1hST0pNTVJKSkpNUEhMUUxSVE1FSEE8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3OTU2NzUyNTI1NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8Ozd2rpijoZicn7Spr6mlraywsaq9tLK7uLa7tbKgt7uzq52eraqrtLKknZWRl4SSopWbioGVh42IhIWBZEtJSUhHRkhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUlNWXnWDfXlnd42XmI6PfWd5gXZ4gImPfISYkoFyh498dntva36tfHOQin97hpKBfX90ZnZ8hWxvaHN8iYyHgGx5cX1wbXWPcWhxgH2OcEOKhIKDhX53d3qLhX2LenV+jpKPmIqSmpujlpmdmp2eop2WjYqlm4+el46WmI92bWxlYlpXV1RRSlNVVE9QTlFWS05LTk9KUU5ITk9LRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXn5+WoKavrK6rqKmxr7GrvLisu765s62om7GnrZyQlp2nq6ajmpySh5R9jZSRk396iHiDgH1+f2RKRkdGQUBDRElMTE1RUlBRU1VUVFVWV1dXWFdYWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXlie3hufHmIkHl8i4VvbYyReHN4amqAgnKWkYuBfZaASZKYbmh4foFsaWNseYWQkoZrc2x8bnJ7hmhtcH5zjYiEhXp9fnt2b3RzhYJ5gXdwfI6MipODlpeYmpCTlZaZl56XjIOJn5GKko2GkJZ+bWhtbm5XVVdUUlFZT1JVVVNYVU1OSE5KTU5LQ0hOR0VAOjg5Ozk5Oj48OTw7Ojo9Pjo4Ojs5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp6lrbCirKqota+urLS/q7zCv6aimpWlmJ6OhYyWoqOZmpOWjnWQfYSKkI58d31zfHd0d3tmTkVHREA8Pj5BRkZHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpzQ5lvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX5wbX96i4l2gYiGdGyakXRze2prnY9NeYWSiYSOZzF2hnNsfn2DdGZldH6Eg4WAZmlsdWtwf3xncHB7bpKNjntzfXxxcG51bYJ+d3l0aXmJgoiJg5aTkpCLjZGUlI+XjoB5iJeIhomGgJCHdWlpbmdkV1FaV1lZW01QVVZZWU5JSEVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCs1Nzc1NDc4aU84OzVukoiZkZqWpKiunrKfprquq7KwwrG7w8eblo+VmYuNhnqFkZmVj5GNkolziIR3io+Mf3Z3dXd2b3hzaVRGSUQ/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+zoHF8eG19bHKDgYWBeoSGhnlyoJV0eIBzdZSHNXGdqJ2OoaGEooR2cIZ8hnxzjK2NiIBoZmJpbnJtcIN1aW9YdW+OmpJ2bH97fG1xbXB/enN2bWJ2hH+GgIWQkYqLipKLkYyLj4N1eIuPgH6DgX6PeXBvbmpeWlxdW1lYYF9TTltaWVhMSEpFSkc/Q0FCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp56vlaW1qa2xrsGyu8HGl5CMlJCBiX1ugpGSiYSLiJCHdoOFbpeKjH95entxe3R8a29eSlBHPkA3NDQ4Ozs8PT5AQkVJTExMTU5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fm13iIh8fYWDf4x+dqKZeX6GgYSZhJucYYaqn52KgpCNenaIfomIjXOKl4+De1xkcXR6e3eKbGdpYXhvhY+Cem6Bd3SEenBzeXdrbmldd4d9h3yIh4+Ai5OXg42FjYd9cYR/hHx1d3t9iXVucXJlZl9bWl1TW2ZeV1FVWFxWR0pLRExHP0ZAREM+QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyMeIqAlIyRnZ2fppGgq6CxqK/AsbrFupaOkZSIeoV2a4CMkoN+i4SQjnmDgnSiho1/f4KBc4OBfWx6bFNXTEBFMjExMjY3Njg4Ojw/QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxxfI+MenyJhn6Xh3ahmYiHj5KUpY2sqUiGrq+vi4GAk4qCi4GEkaiHgJiYipxzbHyBhod9jmhnZ3h+boWGgoVxhIVHa4B3cXl2aG1rX3Z9g4h/iIWMepWenIqLiJF/e3WLdnx3bW93fn9ycXBqWlxcW2NjWGdlXFVQUFdZUERMTEZPSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFiJGPlpiSl6CdrKGmuK+zvbOXjZKLmIt9dHB/iZN/fYyDk5V9hn+HpYiJgYOIhnmIi391hnlfY1ZLQjYwLi8yMzEyMzY2ODo9Pz9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYGEgoWRk36FiZGBmpWCoaGXlZuapa2Tmruxp7vHw6iLjKGljpOJgZB7coOdn5GcfnaFhYqPh5BpaG+DgHSMhoSLcYaCd4eAe3aFfW52dWeAlI+GiYiHiIehq6KWiY6Yf3uCiXp6b2dreH14fHFpY11aWV1pXGBmX1pPTE5YUlFJUEtETkdDS0RDQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDQ1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnVwZ3iDe4CMgIGQj4uamqScoaymq6+wl5GRhKGUhHh3gIyUfX+ShpOWf4qAkpuOhIGCjIuCio6EgIqAbHBqXUNBNC0tLy8uLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1RUUlBPSERCPDg3LzlEPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6CgkqOqpaOsk6i2oqjBw67Hr3i6lJp8jKGemISShYKPoZ+TmJKEioWPmJGWbHB1iYuBlYyNj3aPhHFshYGKlpKDhYhyiaGWhpOKj4+WpbWpm42VooOHk4R+f2tqa3x+foBxX1xiXllmalxra15YS0hPU1FOTUxGSVBERE5GQkNFR0I+OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwg3B1h3F2kYZ+l5aalJ+fnKegqpaTmJ5nZaSafoWTkXmAkYmRkn2KhZmSkYOAgIuNiYaRh4SIhXh4f2dNUj4vLi4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFSU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZuopqKZoZeilZyfqJ6pq5+orKmqtZerv6u2yMi3ydHPvpugcGmrqZ+Ek5KFnKGampmnkZGIlaKamnd6fpSXkaGSlpeBlJ57dpWSq7OJjZegfZSenI6Tlpmkoqa2sJ2RmaiIl5COgYhsc3N7fXpvZl5bX15gZmNgZ2ZcUkVLS1BPSUpMRkZNQ0dNRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTM2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYyQUBpYV5QcXVgbn1hd459fJSOjoqfkpeelpyqmJ6qQkR9h4mHmI14go2Ljo17ioaPkI6Cg4CJjIqFk4WDhoiBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49RkdBQUA4NjYyPDk7RkhHSUlNT1FZbYaQd5WLo6eqtb24pa6srKeotKyxt7Kyrbuxs76cs8Ssu8nLuMS/uKWjsLKsraqji5aYhaamoKKXgqaZjaKqqKSHhZOjoKCqoKSpjpyxi5Wjp7e7m6CjsJOjnaOekaSiq6+ts7WilaWqiZqKk4qVent+g3xlX2ZbZGBdYmNeZmZfW09ESkhUT0ZITEZLR0VGSEFLRkNGRkE6ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljWGpwWHqFdoGUhYiCm4OSkI2T2sidlnNWl4iPiJyPfIaMj4qKeoiCh5GOg4WAi4WFiJKGgoSJhoeHh3FuYUBFNjQ8Mi8xMTAtLCstMS8tND9EQU1VUVJUVVVXVU1bUEdHRDw+PkZIQ0RANzs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHIxKuzxbass8CzuL62v7TBtru7pLjGqbbJx7a+ubSoo7StsLGbmZKan4inr6qklHafpJehq7GzmJapraiutbuyuqyvtaKxrLG1vLe1rrWgp6ejqJupsK2yuri4p5y3qY2lj5KToIZ5gYFzV2BiVGVgYGJfX2VfW1RJREVMVlFJSkpESkhFQUBAS0RCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxbWlFiZFd6dXGBlH2EhpN2hn6AjHu/u6O8grSUk46bj4SIj5OJiXmHgIyTjIeFgY5/gYmPhn+FiIWKh5F6eW5dVkBFTjw2OjQ2QUI3NjQvLzZDSENRW09RVVdVXFdPX1VJS0pBQD9HS0ZFQzs+QDdENz9CSkpFR1dUUF6Ppa2jsbTDtrjBzMq2u8S9s7TBt7jCtb+wt3SxtKa6xaSwxrmxs7G0qKS1tqqxoKKWm6KRpbGtpa2rp6SYoKyzuqKosrm1u77Mv8XFvb2zwre6uL+3ure5ra2xprGqrb6wvbvCwqyZu6iVrY+YmKqJfoB6aVZhX1dpY2lkVVtjWVZUSUhHTFFHRElKQUhEPj9CQktAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZRTEFMUldUWVZad2pwf4+EgY6FbnpyeIdiuKGao4mVlJaTlJONkJeSh4d7h4GNlYqAhIGKenyLh4Z9ioKBi4SVfXh6dWVPXGRHRUw6UWRhW15TRj47SFBEWmRRUVlYWmdaVGBhTVNPRUE/SUpIRUZBQEM9RTZCPkhHS01TWlRelK+4tbq5ycC7vcrMu73Au7i1vLy3vrW6ssZgdbKlsZqeq76qpairqqSisrWgq6ielZaemJ+upaempZ+kk6KnsLOosrK8tsG908nJ08bCxczCysPAvr2/u7y3tLC5t7fDusa+w8mwnrqqoqyPpai2iYB9b11gX1xVYF1oZVJYYVZSVklFRk1LQD5IRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFRSUE9RUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASU1QUkxRXWdtbHGQjYWQc2xzcnOI1cC1maCNlZmakY6XkZaWjoaHfYeDjZaLf4N/g3h7i4SHe4t5gYqCl390fXpsZXB2WV1cUGVlYmBlZF1bWFdcTWRtVVJtbl9vX1hnZVVZVEpEQUtLSEZISEhIQkk5RD9IS1RUVl1aXJO5wLm9t8bAu7nKy7u3ura4ubO4tbWutraZZHWpnq1wXqKtnJihopuknqullJ+fkJSPlpiXqJ+ln56amYOknaykqrCtt7C8uNTQztbPyczSzM/OysfAv8LKvcG9wsDFxMbKv8nPtKS7sbWwm6y5vZp9d2lbXlpYW19YYWJRW2BTUUtDQkVGRTxARj5CSUJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LSYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RGS09EUlxZaWBvl5KRlG5sb3R1h7OsoaGfi5mcmY2NlZGbkoWKin+Ih4yQjIl8gYNze4qDhXuKdIKKhpV/c3t5bG11fGlzZWlsaWZqaWlgZmlobVptdJetpLyHh2dbb2hdWllUSEpOUEpLUUxUUUhMQUpHS1BfX2JnamKXt8ewubO7vraxxMe2sLmxsLuss7Gnq7esjbannpynmk6ano2OoJaRp5illYqTk4iRiY+RkZ2boZiblZaHnpmmmqyvqK+ns7PT1NTW0cvP09TO08/MxsPK0L/KycvJ0sjNzcPR0rivxLzEuqa3u8Sif2xhWltcV19XWGRZT1xXTlFDQklFQ0k7QUQ+QUg/P0I4O0Q+QEk9NDY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OD05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2ZXc5CQmYNocW95eYOgqp6ml42bm5iLjZWRmo59iYyFjoqKi5CIfISCcH+HgYZ7h3KDkYuPfnF5dWxweH9ye254c2xpgHBtY2ltcHlpd31+y7/C36dtY3hvZFthYEpQUlVOWV5QXV1OUE5UUVVUXG5ud4Nylq64rLSosLarrb3Bsau1pqW5p6yuoay0pI+xrpuYmIyRlJGEj5uBjaeRnImDi4SKiYSKg5OVmJeUm5GbmJmZnp6rrKSnoaysztLV0c3M0tPT0NTRzsjD1NHIztLT09bN0tHF0tbGwc/IyMOpv7jQnHdsY1tgW1VeUVxaT09UUE5IPkFHQkNGPEFCP0ZFPkA/Oj09PTxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WHhot3bXdwfX6AoZ6eoYuNmZOTjIyTkJaFeYWQkI6LioiRh3+Ce3J+gIKHeoV2hZORiYBwd3Nsc3x8d3xzgnhxa4BycmlvcXp5c3u+y5p+jLGDdnKFd2hhal1DWlpbV2ZkWGVrVFhdXWBjXmN4e3+LgZmqpKSioKGop6qxuaumtKOirqKkrqKnsZ+JppuVk5GKko+IgpSJa5WijZmEgYZ+kYODk5eti5WNlZmOhZKQnZensKKgoKSkqMfNz8fBy9DT0dTSztPNxtbTzNTY1tbY1dfVydTazcrY1tHKrcTDzIlwbWBeXVZSV1FbT0pHSklKQDs6O0VDRDxDRD5IQz9DQjs7OTw5R0M0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV+aXN5coKJgZ2VnpSFi5aJjoqIjoiPgHiDlJmLjYiIi4l+g3hze32Dh3eAe4eRl4GEb3hwbXV/dnh9dIZ8eWyHdnVufXaEdXl7nbWMPEGKxqV+jXxqZVdJQ2VjZmNoamRveVtfZmhrbmlugISIkYyen6CekZeYn6SkprKkpbOgoqWeoamgorGch5+SkpORi46LhoOPhH6cnIyNgoSFepR+gqqVo4ySipiSi32XipqRq7OYmpunnKe9w8W5tsXN0dDRz8vSy8nUztHV2tfX2NTZ2M3Y287J2trS1r/MzbR1dGxiW1hRU1BYVUVGSklFRT06NzpAQUI6R0VARURCREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MSooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGJxcXOGjXyXkZ2LfoeSgomGhYqDiH15hZeXiY+Dh4aHeoR5cXp7hIZ1eoaOjZ16jHB9b3B6f3J7gHGEh4Bujnp1d318gnV/fIeJsHRZqsK3jZKBcG5jPV5ocnBxcG54d4JlaW9ydXhye4uHjpOSm5agloiMk5ugm5+qn6GsnKKamp+mn5+smYyajJGSjoV9iIeDhYuOoJmTiIOHfm2ZeYSZhoiTjI6VjIZ7m4iTj66qlJWXnpimrrW8qK29xsvIycvLz8nD0srU1tjX2NfU29fT2dvWz9va0dbI1cyTdnhmZVlYTlFSXEdCRUlJPkE+PTg6PT87Pkg9QEJBQURBPj86ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NTdFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmt2gIhxkZCbgHmAjn6DgoKFf4R8fYSYjoeLfoaHgHeCeW57e4aCdHqSno2hdo92g3R1gX10gIRvgpCCb5KEdXyBhXp2h3yJuMalw8q4gpacj3hwZU5lY4J6gXeGopCLeXl3e4N/fIR2bZSWlJWPmJGDiY+XmpeXppyYoJefk5KXo52Zq5aRkYuOkoOMhYmIgYaQkZ6cmYmFi4GFl3uIiZ+XkImNiouCfKGIkIu8oZiTl5mcqKWlrZ6ntb7Av7jHyc3Oxc3K0dbV1NnV19vU19na29fb2tnYztzGhXh2ZGZiXVJWVVRMS0RNRDs9PTw5Ojw+OT5BNz4/QD1APjw5ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs6OjdIUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWZhXVtodHp5bImNknd2eop8foB/gH2Fe36CkYqFhnqFiHt1fXVtfX2GfnR/kp2Rn4OSfIZ9eI9+eYuKb4ObgHSZhn2CioV8fpF7kKmOkMOgvYybpJx+ioR9iXKMi39zppqcmZSFe4+RiYRpR3GhpJ2Mi5CShYiLkZOVj52bk5SRl42MlZ+dlKGUko6OkIx+kI+Oi4SIkpaan5+JjJSRnZCCjH+mmYiFjoOFhICkhoqLuJidkZSWoaagnZ2do662urSrv8XK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbt3d2dWhnY1ReWVJPTkhDTEM9PT45OTs6OTk8PTZAPj49PTk6OjszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PERSU1JYXlVYZm1tbWmBjopxc3iKe3t/fYB8iHt9e4uHg351g4Z6c3p0bYF+hH13hpuhm56UkoCMh3+Yh4Cckm6IqYV6oIt8kY6DiYScfpqRiY2jop+QpK+gi5GLhouBkoZXcq2Ln6ycj4OYnJCQjluDopGCjZ+TlYyGiIySk4yUlZWQjI+KiJabnY+VlpGLk5SGgIuJko2Kip2XmaOihpOdlaCKioiOnJCDiI+Ag4eFpIWLkLOYnJKUl6GhnpmSm52nsbispLzBx83Hxs/Mz8zP18/R1K7W1dja2Nra19bZ2Z1tenJkZFpaVlFVVkNASUQ/Pz46NDk6Ozc6OzozPDw/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieGxifpKDb213i3h6f3uBfYZ8e3aGhYBzcIWCe3V3dnSEg4V9f5Kmop+mopeKnZCUl4qKp5dyirKNhKeShJmUhZqMo5agmJOJm56ik6mwoJGVkI6OiJWLbo23hJrEyLKcoqWbnZiWkbGQZKTNyJWOhoeJkJKOjZOUioWKioaWmpuPkJSTh5WYhH+Pi5mIjpCql5ekooiZnpWaiY+Gl5iKhY+NgX+Gj6WIjZOompeTl5mhmJ+Zk5yaorK0paO8wb7HxcXJyMnCytPMzdSo0tHW1tbY2tTT2s6AcHxlYFtcXE1JU1hBQkdEO0E+ODM3Ozw6OD02NDo6PDo3Mj85OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4JHdoGPfXxtfoh4en57goKDf3Z2gIN8bW6Lf3p8eHh8hIeKfoujs6ejqrOil6efpaSWla6ig5G4lZGzmoyhoYylm7CjpJ2YkaeWqJmsr6SYlZaVkIuYmZehwI6jybmrm6OmrZmSm52ynYWFqKKcmIWJiY6VjYuTj4iBhoeJk5iVjIuUk4aVmIaEkZCcdZGYspaWpKGHnZqSj4qQipebiYuWjod9jJieiZCQnJqZk5iXn5OgnZSem6CxrqKkt760xcfEvcPDv8bNysnSps7N09LR1tjT0Ni6cHdzWl5TXlRPSElNRUJDRDU+Ojc3Oj88PDc9NDM2Njk3NzQ9NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdOW1xZSmZgO0iEi3p6boWGenyEeYGGgX5weHx+fW9yjXp+gnx4houJhoSSp7usqLK9r6Wts7Ooo6GwrIqatZ2iuKWVraSXqa24p6Wjn5qpl6mjrrCqmpmclJWRl5+Xmru7rsqhara4q7CUmZ+jrJOXvaNeqrKDioqNlIeQfI6OfYOGjo+UlYiIkpaMkJWNi42WmJOdmbSXlaudipyUko6RkoyZm4qSnpCLiZWfoY2UjZianZKcmJ6UoaCUnJ2lr6ihpbO4q8LIxLW6vbvFx8fC0aDGyc3NxdfW0cvToG54ZlpYUVxQTkVDPjxDQUI4Pzg4NT9HPTw2PDM1MzQ1NDU0QjM5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRHYmBicEo/i4p+gXOGh32CiXWDioJ/bXx9fX9wd4d3joKHe42PjIaMmarCwK+9xruztMC8tK2rs7aMqLOtrb2rm7ukqK25uKunpqKipKKpr7Kxq52cpJibmJeeoqalkqS6r6nAvK2tsrmlpKh+iIacrbywg4yMi5CDjoORj3qBh5CNjZyJiI+XjYuVlpSRmpedqJqxmpGsnI6aj5KOlZCQlpeOkaCRiZSbpKyUlo+UnJ2ToZ2bmJ+hlJqep6akoqSws6fBxsOvsLq2xcTCv82mx8THw7zW0c3EyoZycF9ZV11ZTEpBS0BGRz5BP0I7OjU+QT09NTw2PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRD9DRlxlR2BpZ1pdXJOMi4h7h4yHg4x1hpGKgW9+e4F/cX6Be5V6kpSUmJCTlaezxsm/wszCw7nHvLuvq7m7mLO3urLArqXBpKuwvL2rrqujo56nq660sKqcoKqcoZuWn7C1p4ujurq2wbysqZyypaSolIWOqcTDpIKLj4eIhIaVlI16g42Rj5GijIyUko6Jl5+Yk5mVmKagrp2MqpyOlo+SkZWVjZCVkY+hlIaXn6CynpSalJ+gmKSfmqCboJSYnqWjpqakr66lwMTDrqi3tcnCvrbPssS/xLyz0crIwrRydmpZVlloUExIQkxLS0pBQT1DRDw1QUQ7OzM9OEIzMzIyNjJBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJlWU5lXGZUY2qZjZeKjIiTkIaJeYeUkIFygHyNf3iHgoKQeo6hlqiampi6vcfIycHSycrCzb3Cs628vqi6v727w7eswqmss7y+qrCqpKWkrK6zrba1oJ+vn6WimKOzvambqL3BpLa3sKyTsa2srZeHmqmnpZGCjJOllYmBdoqReYWNkpCen5OPlIyPjZSjmZaclJSjnqqfkaWajI+Pj5WWiHyPlZKSopqVn6GctaWQnpelo6Klnp2mmJ6Wl5uko6mnorKsqLzAxK+lsrfMv7mvxLO7vsG4rMLDwsCXandgVlVaWUlKTElGRERIQ0JBREw6NERIOTs0PDdFLjEyMzUyQjI1U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+akhfWGFaZGRWno+djpeOnpKJin+KoJOEeIV/lX9/kIiKkICWoZmupqSYwr3Hw8fF083Ozcu8wrewuby0vcu8w8G2t7yts7+6vK6vqKCpqLatrqmyt5ueraKnoZ6rt7iqpa+/xbG9ubSoqrW0rq+XlqWsqKCRjpKyxaeVjn2SlX2HkZmQqpmYk5OPkpaTpZ6SnZmUoaOinJifmIuMj4+eiFqQlpeSl6SZZZijn7OllqGWrKypp5ueppeYlpeVoKSopZ+2q6q6u8O0pbO1y8C4qrassru5rqi4ur24gWlsWFVTU01ESlJNSz9BSEVESEhIOTVFTTs+OD1ASi4zMjAyNUM1NU9WTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs9QEJGQnBFaUlSZWJMRqWUm5eil6mWjZCDh6aTiIKHgpyDg5WQkJSPmqKfr76voca8xMTGxs7OztLKvru2sbq7u77PtcO9uLm3srG1s7izq6acq6y5qqmor6+Yo6+kp6SltcCwrKy0vsO6wLq0qLm1ubOvlqWtrq6ki5OVoY10wZp9l5mEjpaajLGVm5qVkpKamqWjlKCbl5qpnJyhoJmKjZCWnGBKlpyalZqlllWXsJ+vnJ6klK+uq6WaoKWUk5iYjZygp6KZtKmqs7u7u6qwsse/uaarq62ysqOhsrK0pG5rY1pYTU9KRE9PUFE7SEtJR0lDQz46S1Q/QTo9RU0wNzU0NDpCNDRNV088SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiql5mgoqivmZGYh4uolo6Ik4Wfh4Sdl46doZujpLXItanGucLDx8rJyMzNxr66s665ucHBzLXHusG5tbqwr6+ztaekm6q0taqppq2smqSupaSorLq/qKy2t77Cv765tLPEsrm9rKOvtay5poibl6abdr+fhJmdjpOZmouul6GcnJeUmqChqJ6nn5maqpmhp56YkI2RnYNudpKjmpWdop2QrrKiqpSoqpeqraOjn6SokZGZm4eUnKKelrGnqau5tr2zsq6+ubego6eopaacm62pqYtgY15eUElLRkdNSVZMPU1FTktMQkNEPFFWPUFBQkRPMTg9Nzc/Qjc1VFdOP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li1SYE1VSH9lXkhFq5WboZ+7r5mUn4yTq5uRkpOJq42Gop+MpK2Uo6O2xr60wLrCwsfIxcLNyMG+ubKvuLTBwsq1xbLBvLW6qqmtrbCjo5iqtLumqaarqp2pr6ejqqu+vKitvbS4vse8t7a4wbK+wbSptbervqWPopeSop+8n4maoJmXnp6Pt5+pnKWim5yhmqiks6GbnaacqKmemZWPlJuLl4mMpKGUnaKdoLWvpaSTr6uZq6qdnaOjqJCUlJ+Cj56em5WppKGhs7S6ta2otbKznpyipZqXlJmqoZ51XlpdXElHRUZMUEhNRUdHQ1NMSkJFR0FWUkRIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkVASkpOTzlDQDU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE5ZlxGQ0OccGJHRaeXpJ+ew62bl6WYmqmclpubj6qWlaemla2smaKrtsTCvL63wcLAx8O/zca7vbmysLizv8PItb+wvLe5t6Wkq6ytoaGaqqrFoqSpq6aerK+roqmov7inrb6xuLbHtrW5uMCyv8K3tbO0r76jl6OWlJuUrqCQoaOlo6OfkL2kqZ6oq52doJuln72imaOfoqmroZ2WjZWek56Hj4SNk5+koJ61rKWblbGnma+mnZmqnJ+NmJSehI2gmpuSpaSamKuxtbGqpaqtrJyYoKCSjpCVqJ6UZmBYX1xOSEdKTUtIRURJQT5RSUE8R0lIW1JPSz1IT1U0QkY5PkhHNUNhWktDTlJVV1ZRWFRSVUlAOFJRUE06R0E0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNDZAOTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROm1SRjxLeGVhVkuimqOcnsWsoZ+snp6uoJKjn5aln6aqrJe2saOqs7bExL2/tb/Cu8jCvsrHtbi1tLCztLfBxba+sbi1uLSfpqyqrJ2dnqWkwaSfqq2gpKmtr6KmqL21pbG9uba2xLK0uLq/s8TBuLius7W1o52llZGUoa6gmaKeqKiro5rCrKmerK2bm52ZpqC9oZ2kmKurrKaimY2an5KfiY5Xf5afpaGguKqmk5i1o5+xoJ6arpadjZiTnYGOn5eVjqKjlpCmrrKrqaGhpaWVlZ2Yi4+RkqSeiV9iWGJfS0hKSk5FRUFHSz49SkI5OUpKTl1RUUk9TFZcOUZJPURNSThIYltMQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dyR0U2PXVlXEtOnp+hmZ7DqKWitKKdsqeTq6Wgo5+tqaydu7CorLaxyMXBwrLCw73Gw7zEybyvsLatsLSvvsS0ubGwubSsmaiwqaqanaWhqMGsm6ywnKqjrrGppKi9tqe3u76vt8SttLPDwLPHtLu3q7O2raqippaVlKSsop+fmqirsK+vu7KmoKmomZmXk6KkuKCho5Ovr6ylp5+SoZ6Vno+QjZWemqKep7OmpoyYs5ujrpmdm6yQnpOVk5l/kaGVj42foZOLpqyvpaahnKCekpKak4WLkY2cnX9fZFpmZEpJS0pSQkNASUg7O0c/OTlPTVVeUlNKPk9eXT1IUEJMTEk5TmNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwzNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ+joJygw6mkqrOhpLSqlrOsp6KksqyuqbuxrbC1tMbAxMO1wMS9ycS1v8jBtKu1qLC4rL/Ds7eurLa5pZiqsquqmJ+ml627tJunsJutoK60sqerubOourS4srnAqreyxL61xqi/r622tamnrKGXl5GmpaKimJilr7iusrW2oJ+opJqVlZOkoLeipKWWr7Gyp6qmop6ampuWl6ifoJihnq6yoqaMl66YpKqXmZ6kkZqMk5eZhZWelIyPnJ2Ti6ipqqGnoJielYyOmY+BhZWIlJ53YmdcamlNT01OVD1DQU5DOjpJPzc3Uk9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDItLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJcGhWQ1dGjHlmQzuko52ipr+nqK+woam1q526saujqrS2sbC5t7C3uLjEvcPHvbzEwcbAuMDFwLmptqSsu63Awre3qayxuqGUrbGtspalp5GquamfprCdq6CwtLOqqba2rbyts7O5t6y5sMO7vr+mw6uwt66pq6unnpiZq6GioZGXobGvs6ywuZqcqaCZlpKXpqG2qaWjorCxtKyzqKyfm6Cgm52lnKKXnaOzsJqfj5Olmp+ompOinpSXiJOWkpWWnJOIkJqZlI6oqKafo5uXm5OGjpiLfYyWhY2ZaWdrYGxtV1BRWlVBQkVUQDs7SEE3OlhQZF5QVldFWV9dTUxSTl5LSj5aY15OSFBPXFVZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEuLS4sMT0qJys9XHA9PjEuMGRaZEAxNjQ3Z1lgRig/OGx9Z1tWO4l7Y0M9qJ+doqq9oquwq6OxuKqltrSsoK21va6zuLu6vba2wMK/yMS5xMLAwLjEvcG3r7Wnq7exvL6+tKiusbaelqutqK6XpqiOp7ufpKyznqyisbCzrKq2tLW+rrCxtaywtLLBu8W3q72vsbisraqjsaaepaqfpJiQmZ+zqrOrqrOanaebmpWOoKaltK6noa2trrGntK2yqqScn6ijnpWhmZuotamWmZGRnZmdn52Pq56Wl4SUloqdmJyTiY2Wl5qXpqWioJ2VlZeTf4+UhXuOkoKLlWRrcWdvcV5GWWZWREJNWERaOUhCNj5cUWhcTlldR1teXU5NUlhkSkpDXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2BVMTUwPWBWXjgpQzNZVFxnSzaMemZMQKSaoaSstqWtqqavrreqr7W7p6axt8W3sbe9wcK1tLrEvszGucLAub65w7fAubG0rKm6trq5vrSprbC1mJinq6qsm6urj6u+nqyusqOrn7Cts66utrK5uKqurrGota+0vL3Ks6q2tbG0r66nobOgm6itoKaWlpqasqKtoKWvl6GkmpqSjqOmqLOpoaazrKq2pa+xta+kmZ2tp5qYn5qZq7eil5ORjpecoZeWlKuempJ/kpeMnZyZlpCJlJKemaWioaCYlpGTlXmKj4V7jIqCiZFqbXdtdXtgRWBrWUlIWlo9e0pGRDZBYlRpW01cYUpbXVpSUlJiYUxLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVGBVYC81KENfUVwuK0IvSkdQW0gzY1lVS0SZl6GxqLGqraakr662qbe1uqSstLfJu7S6ur+/tLO3w8DMyLzDvLa9v7+3vryxvK2murm3tsK2qqywt5SWp66rqKOwqpSvu6StsbOnqKOytLGysbWxuLOprquyp7evtrTExraptrassK2pp6O2oKCnsaGklJyZlbGep5ygqo6pop6blpimpqW4p6OytayosqeusbaspZmgrKibnJ6clKm4nJSOjoqYm6KXj5iloJyUgpCUj5ybl5aViJaQmJqnnKOgkpaRkJV1hJCHe4SBg4uKbG92dHt+XEtlbVxKTmNcP2J7R0k4R2dXZVxMXmJNWFlXVFdUaV1PT0hhXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOSGYyNydHYkxWJS1CLT1FTFE8M3JrSUNDkJmlrqWtr6uopbGztKu3sregq7W5ybmuwLvCuLOxtcLDzsXAwb20vb+/ur68ssSnqbmvtra/vK6qsrGboKexraalr6WdsrWsq7GyraqptLustbO1rbSsqquorKm5rbKxyMC4pbqwqayspaiusKalo6+kqZydnJuvmqOjoqORrJ6joJ+iqqamuaSstbalq6yora+2rqOeo6mqm6CampKks5mOiY2HkKGglIyUnJ+SkYONkpKcmpeVk4eXkpWZp5ufnoySkY2Qdn2OhXx7e4aJiHBycX18fFxTZG5eTllmXEZElltHO05tWGJbTGBiTlZWVVdUWWddUVJMY1paVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvLDEoKSssLSomNSovJjApMzg6MSYqM0JjOjYqSGVISis6SD8zQkhTLD6QaztHSI+cqquiqrGkqaWztLG1tbKyoquuvcy6rsC6x7G0rbTCw9HFxr7Asr7Bwru+t7vEp6y3q7K3u7+vq7Gsn6OnraqopLCkqrKqr6ywr7Cuq7O8p7exsqmzqaulpaOtuqyqssO6tq27qamnrKmosqWppKOuqqiinpyjrZWlnpiemaydoqepoq2mpK2ruLKyoamioKyvsayeoKeoqZmkmZmPoKaXhoSOiouen46KjJWbjo2Eho+Un5yUl5SGlpSTl6SbnJyKkpCNiX5+h4V8d36FhIVycXCIdWtfWmBuYlFzcVxLO4R8RT9XdFhhWk5jW05WVlVXUVxiX1NPTmdYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMjU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE8XUowLkpnREY4PEIwNUVLWDFAlVo+TEWVmK2ooquznKqqsLatubavq6arqr3Ju7C9t8KvsayzxMPOz8O+v7TAwsO6v7PIw6uut62yuL6+sqytq6SnqrCpp6ixpbSuqrCurbKxtKy0vKS3s6ysrqern6OesLerqq27t6W3tqSpp6urqq2hqaemsbKkp6WhoayXqqGVm6CmnqSiq6Sto5+nsbiurqOmopuqq66pnaKlpKSZoJqWj5ickoGCj4iFnJ+Lio6LmI2PioKLl6ObkZCai5OSkZOjmZuaio6Li3yGgYGDenR/goB8cnWLpId4al5gbmZXZYdjTj9nk0xFYnlXYllSZVRNVlVVVE9cXWFVS01oVlVXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjM5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNldaLjBKZ0FBPDxCKzpKT140RIY+SEZEl5KwpaOrsZirqq22rLayrKasqqm8wMC4uLO7taayr8TJy9G/wLu5v77BuMG5wMStsbWxs7q/vbKwrayqq6e2qqatr6q5sKixsq6yrbeqt7entLerrKSpqpyjnrOzqKiktLWgt66gqqiqqKunoKusqbm2qaqpqaKqoK2ckqqhnaCkoqajqp6dp7SvqKaqoqOYpaenqpyjpKOgmpigkY6PmI1+h4yHg52dhoOKio2Nj4uChZSimo2MmZCRkY+Tn5aYloyLg390h4F+f3h0gn55dn6Ah52Pb3FnZ3B3XGFziGtPXplWSG14VWRWUWNPTVVUVFBPWFtiVUhQaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg+Qyw+TFRfL0ppNU9EO5aOsaGmq66arKWtsLS1sKymsKqpur67wLCuua6ht6/Ix8jRwL69u7zCvbrDwL6/rrKysbW8usGxsbKrs6iktailrbOzubGjrreysLK7q7qvqq62rKqeqqyfo6C2raihn7CzorWqnqinqaOqoaKsrai9r6yurKKoqJ+smZCwoZiioKennqebmaqxqqOgraKhlKOjo6eYmqmlmJiYno6Kh5SHfYyGhIOjloSBgIuGjYuQg4OToJaIkJyQk5CNkZyUl4+KhYZ4dIF/fHV4eX96c3N5Z3+GpHVpXmRqgHRniIx9U1hwXkp3c1NkVFFeTU1SWmZOTFZZZFhGU2lSUT9DTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNSkoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGc6NDhfPWFkP0YxQ1BbWypITTlVQTSQj7KhpKaspKekrae1s7GrpbCnqri+wLyvp7mqpq+wycfI0cK8v765vr+8ybrAuLCvtLG6u7fAsrO6rLisorSnp6yytrmzqKi9tq62vrC9p62staytnKmvpKClraunnJ6rs6W0qJqqp6mjqZ6kqaipvay0r62dqqSgrpybs6OVpJylpZ+km5qpq6afm6qim5OcoaWemJepqZKYmpSQioKPhX6OgoCHnY+Ffn2Lh5CNj4R/k5qThZKhjJSRi5GbkpWHiX5/cnt6fnxoeHx6dG9we2eEeISIZGFnYXGEem1neF1dVUBWemxUYlBRWEtMTnJ1XUhaW2dZRVVmUEQ+Sk5EQ0E5SEdLUz9qYkpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEnLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mY0FKN0dTYFUqPTlEVz4qj5SymqCgqaaloauluLOzpqqxp624wb21r6K4raiosMLJyczBtr3Atbe/uci1wrWzsrWyvLe5vbWtubW/raCzp6ursLW4tayfvr2qs8G0vKGvs7Wqq5+tsKOcpaiqo56bpbGnsKCfq6mnoamcpKihrbuorrCtoKujpK+en62ml5+boaOcn5yapKqjm5ulpJaXlZ+ilpuXpqyMnpGRkYuCioCAjoB7mZONiHt+i4aPjYuKg5KYkYaToomSkoeQmo+TgIh8eWx+dnl4Y3t6cW9vcXZngHNqg2dkZ19sco1sYWlvYG8+WnhrVV5PUFFKSU1UWVdNXV5sV0RYYE9eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTY4OzIoMDkvLDQvLj0tKks+Kh00OSYnLjM0LjArLzQmLDokNDFBaFkxM1M9ZV9ETDZLVmRPKjsyTlg9I5OZrZqgmKeko5+opLiwr6OvsKqruMG5s62fuK+rqLS6yMvIv7bCvrC0vbfEtsOxrrmys7+0ur23qLm3vaqjtKipqrGuurGqnLy9pbDBtbair7e1pqensbOgnqSlp6GlmZ+sqKmeoKqupqCmmKOpoLG5n6Owr6Gsoa2knKamqZqam5+klZydmp6pppecoKmTmZSYnpOZlqGqkZqIjo+GfYd+go19fKCMjIh4gouEiYuLhYeTmo+IlZ6IkZWCjJeMkX2Fe3NwfXF0dGB5eGhucHBuaH1xY3ttaWViXmSFfl9acmpxS0p+aFhaTlBMSkhQUlBJT1xfblNEWFpSaE9IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy46OzgzJjI8MCw4NUIqKS1DKiw0O05OQDs3My0uKy03Kio8JTUzPGZkMjRNP2VdRk89UVpnSCo+L1hWNSiXnqeanZasoKChpKK4q7KltLSqqbnDtbOtn7etrq2wtcbIwbe+wbmxtLy2v7u+r6q9sLO+sLzCuai7uremp7WoqKuxrbOxqJu+t6atvLeyn7G4sKilp6+xm6GkoKSkoJebr6ehn6Oor6GfopSkpKK3sKGmsKufrKOvmJyqpKiel5qepZObnZqdpquanZ2ml5aYlJ2Ok5eiqKKQiIuPhXqEfoSKeo6WiY2GeIGHg4eLjYWNk5iNjpaYio+XfoaXi495gXpwcndvb3RfeXdka2xraGeCbWVya2tlaFlhc39eWmt1aVlHfF1bWE9OSkhIUlVGMjpeXmxQRFhWWWVMSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0R0JnW0hUQ1RdaEUuOzFeUywylqOimJWdqZ6moaOhuKqwobu5pqy9xLOwrqK1r62tr7TExL2zvrq3sbO5uLq4uq6tv7O0uK+/wbesvbq0paKzq6iqs6yusqOdwramqbe3q5+yu6mmpaivq5mjp5ylppSYobOmmZ6lqamboaCUpZ+kuaikp62mnqWhqJOfqaGhoZmbnaGSm52XoKKrnJuaopaTlZabjpOTo6ekj4iKjoZ5hHyFhn2cjImKhniAg4eIh5GFlZOSjJCVk42OlHuCl46Ld357bHVybWxzYnl1aGdpZ2VthGdnaGRmaGleZmJpZlplemJgUXNUW1tTS0lHSU9TQCEraV5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LTExOTUsJi41LTgwNTc2YHRCM0NEaFtLV0dVYGhCMzc3YU0nMp6kpJKOpaacnp6epLWtqKq6t6esw8C3r6yhta6nrq+3wcC9scG3sK+ytrW4t7Wsqry0r7KwvcC3rry8saSftqymprWpq6+hoMSsqqextKustLqeqKmrsaWYnaqeqKWSmqauo5idpKqhm6Kdl6Cdp7amr6mtoaGenaGVoKafoqCZm5qckpqelaaeraKYl5+WlI6VmIyPmJqnoJCHioqIeIV3goKCnIeKgol7foSIhoSQhJaVj4+QkZCRjZJ7g5WOhnN/fWd5cGtqbGd1c2tiZ2RidH9hZGVmZWlpYmdvWV5YXWxjYE1nV1pgVklHSEtMUlg+OWBsaUdCVVNcW0lIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyssMEEqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQGNGJTWcpKCRjK6gmpigl6W0sqOyvrehscW7ubCxo7asq66pub68u63Asq+vrravs7myp6u5sa+us7a7trC5vqylnrWroKGxpauvn6XFobOlr7Kwt621nqyurK6imZ2nqqWflZynpqCZpKOpnJqgnJWcnq2wprmnrqKhmpqemJ6jmqWdlp6Ym5SaoZKolq2pm5SdnJOMlZmOlJSYp6eNjYqJjnuBdIKCipiFh3yJiISEioyIkoWTnJKSj5CRlo6Qf4GNjYNvgX9meW5oa2pncXJrW2hjYXJ/YGRnam5rZmpmZGxcbG12cWBTYmhjZVpJRkxNT1hRUFVhZYFUQFZTWVVGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDo1IzMqKTYuNTU0NjVafF0xOktqW01bS1hkY0BBMUhjQic0k6Kcj46xnZuUoZqpsrCfucC2oLPBu725saa2sKmupbe5t7isu6+tq6u3qrS5raWytbGvqbG2trGztrunqZ+2qZ2fqqOqrZ2rw5mvpa+xtrWsrJ6xra+qopudpKypnJWcp6SdmamjpZWaoJ2RnKOrqqm6nqekoJeamp2hj2uilZiccYOWnKSAdpGrqJ6WlqGRiZeZgJeKn494hZONg21pfneEcmyGioZ9hIqGb11kYGeEl4Zri5CUknV3i4R/g5CAZoiAaHZpZlhdaXRuTlBqY2ZxgmZeZGZua2ldXV6JkIWIaE9LQzdEVGddSkhQUFVVS0hTYG90ZUVbUVVQRkdGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTVPa1tOXEtbZmI+RzFPYTwrL42kmoeVsZudk6Ccqq2ro73Fr6m3wri9vK2ntrGmq6S4tLKzsLmuqqestKWwtaKnuLa1qKestrOutK6zoqmftKueoqWcp6ibr76VqKewtLitrqSoraqrpqGfnKGoqJyXoaamnJunqJ2SnqCYkJ+oqqO0r6Oio5yWmJiXo4ihj5KahqGIlJ6hf6V/p6yelJOdk4iDcniMjoOHoHWIjWmXiWZ+c3mgb4iHg36MfH+hoJ+Zf3uHnnSIjnabimyHgoNuaWVke21yYlSGbWNtaZhxWGlwboZXXWlba2paiHBteXKHaIeEWV5GTT5GXk1FUlZWUVBSV1RnXUxZS1JST0VHRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk5LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdDE1UmtbTlxMW2dfPUsxVV83MCiNppeEnaydmZmdn6uqqKq/w66yury3wL+qpLexqqyms7Wur7O2q6mlsa2ltbObrLW2tKanqLOxrbKorp6qobOpoKSkmqKknbC3laWmp7e9pqynqaqrp6aioJmgqKSamaejpJmcpaqWk6OclJSkpqahtqSjoKSYlZOYk5yIrpCYlYmpi5ijnIaxgKStnpSan5V5gtSof4eUwJvGeHexpbeWZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4Fsl7GrsHlobFixrm9labySvG5oem1wj9h+U2titrJ+gHGUdZqhqpBWTldhT1ZORlRbWFFQUotcV1tQQFxFUU5ERkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cxMVRrXE9bTV5nXD5MMVpcNDEhjqaTgaeqn5ednaWtsqmxwr2ytb+1uL/Cq6a0ra2pqK+0qq+2tKiopralqLmvnLKytqqlpKeyr62xpquep6SypKKhn5ecoaCxrpWfo6C0uqKqqKCsraSinZuaoqqgmJupoJ+YnaiokZynm5SeoqejobCjnp+jlpaSmJKZhbBraouNqn5nhZaHrWVxnp2VmqeWca6hpH53unxroY92sV9qtFulgGWckGBmgXpmf2l4aqllvnJnpox2sWp8sXh1kpRjbW2nblyEoEVpZ4eWRXWcYH1me6Omgllfi6tpgJJ4emqoOEqvW1dTbGNaTE9YX1xXVjtOiE9WVi9JVFNKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy4uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVeWDMxG5KilYKtp6Weo6SqsbettL2+sLbFsri6w6epsKyvqamxr6SxurCkpa+zo6m5qZ6zsrCjpaGqrbCsr6aon6OisZyjnZiVmJ2esKiXnKKgtLOhqpuhrKyfnpqXoKOqnZmepaGdmqGnpJCdo5uYoaCsn6WmoJqgoZWVkZaRmoa1m7V5hamZtZl3h7Obt3+Tlperln5rgaZ6gYWGkZSSd6tnarFbrHuOh5R0iHCOhoB/iJCXeIOCi5eMg6CPhbB2d59xa2psfItPpVhIY2OZfmNopV95cXVSkodeUKltY3F9hoBhnS9Som5bU2tnX0xLXGNYXFpCPrB3V1hBI01oRkJEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQEFEPEZEOzAyMDE7RiwwLjg0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0o5YVU1MByWn5SIs6amoa6pqLOsqru2wrC8wq24t8KrrK2vrqeus6qir7yroqe1raOrtqWlsrOoo6Gdp6qyqLCopp6goLCWoJqWlpeaoK+jm5qkqLWuoaiPqaepm52WmKCmqZufnaOfnKCjpaOVm5+Ymp6jq5ulmpyaoqCWk5GTk52E1ZOZuXGwwn/GhnzWlJy7fJuWppCNnIykeo2GooGlgnqseY+dVa97iX6farlauXeFg32mgpN8mHqqeY6dkHuxbY6EdJC7hW6VUK+nxYpRoHpjYKpic3KGbJeHX1O1tMiFgIl8Y6QzQp11XVBqaGRQQFhmWWRhSkhNa0paU09ZZlpDQz9FPzA8PDU5Ozc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0pbUF9mVDdHOmFQNzIlnKKSmLGoqaWzqqW0p6S8t8GxusCytrW9tLansrGjsbOmoK+2qZuouq6jsLKhsrSxoaSenqepsam0qaWcnp6sl5mZl5eWmKKsnpuXqa2wqKOejqyip5admJyhpqKYoqGjoZuioqebnqCelZmbpqGcppSbm5+gmJCSlZCdiLJuaLVxq4hwjqZytHRztnubmKWNj5yNon6Pn6R+sHWDkdLRdVuufIV/pG6bqqZrhoV9rX2XmY97sXOTnY94s2WWdIWebp5mlFLJi1rCXJ95Yl+tX3ZzhmKXiF5Zyp1vv4B1TUu1U1XGZFRRamNlWEFPal9saVBVRkk5PVdSW1ZZSEI/SjwyPzs1PTw1Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxBTlRfZVA1Rz1hTTYyLqKdkaWvrKWpuqymtaWntru8sru/uLe1u7u0prW0orKyo6CssKWYp7qupLKxnbS4qqClnaGqpLKorKqkmp2bqZ+WlZiZkpOjqqGYk6ersKWhlpKsn6WSlKGcpKeglZunp6Kao5+umqGenpCWnKKenKWUnZWZop6VmZaSm4Wse3eodqOPi4epb62Kg6eEmpmiipKZi6J+kZeHroV/grNccrNSrn2CgqN+cdd9d4R+j52GmZp3r4aKkZyId7RhmmWagoGVbJJbsFdLmnWYeWZgrV52d4dnmIhqXa93lZ+PeGw1eciusl9CVG9dZ2BFUGxfcG1WVU0uZWJoU1lQO0FEQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdDYEk6NzegnZOguLGYs8GsqLKnqrK6uLS5vrm4s7a+tqa4tKC1raCgqayglae2rKixsauttKSbqZ+gqKK1p6aqo5melaWilJScmpKWo6ablJCnra+loJSYqZ+ij5GimqmmoZWapqmdnaSerZ2hnKCNlJ+bnqCYmJyWl6GglJiRpp2GqX19pXmhj5CDqnCtjIGmhpagooqXloijgZCHlKp7gIudeW+xWqiDgoigeHTYf3aHdKeBjpuNkqR8lZCfhHuyXpxkoH2ClG2TXKtcW5N/kX9oZ6pjcnuAapiGcV2rWomgj2tuZU9KQ6FcWk10XWJmTVphX3J0X0pVNUqaklhIRT1IRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxPZWRBJlVmWz8xVF9iTDdGSV9DMT03opyZmb+smLPCrqutqKa0sLixtr+5urOyuLyqu7WgsaWfpqenn5Sqsamwqratqq+hmKGgpqSkuqKjq6GXm5GjoJWVn5uVmKCgkI6LqbCvpp2Wmqemn42SpJiorKiVmKmonp+gpK2joZ6hjpWhmJ+gkpyXnJWdoZWWj6ubj65ucrR0qYx3iqZztHl0tIGTpaOTnIyJpIeOdbhui3uLomtrtlqhhmWXl2igoqdtlHK0dJOYf7JqhZKIrWp1tGGdZqJuhpJrl1ytYE6hfIeRUnOjbHl/fm6YhnBcr1Y8nHdmVG9uLlunT2JSa2VibFpiXGBwfGNTWVE+Pm1vMkJCQD9NOSE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssMzI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eOTFBOKWanJ26opyxv66tq6unt6m4r7XBtb2ysLu4q8G2qquhnaekop2Sq6untqOzqK6qoZecqKClq7mdo62clpmQpaOWjp6hnJien5GTlau2r6aZk5usqZeMlKaapa2jkZersqSgnqirsJmhopCZopegm5abl6GTnKmdlJCqmYfTk5q7dLHEgMOGftWWm7h5iZGYjZeJjKeHeaK2dH13dsKCmrJgg7p5wHx1uGK1gYyHqX2WgaypcXt/dbyIp6BpnWGmjq+ifox0h6t9vm5zvHSyg3V4gIptmohxbY2kdL1dd31bYXm8alpWW2l6XmlhZGZibXlvWVtZQ0FAcj9DRys1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sOzowOExYYUYnVGNYPC9UXmBLNTtMWy02QDmnmZ+ivKKXscKvramqrLGoua+3xbG7s6+8sK7Bsq2mo5+koZ2ckaqlqrKktaetpKCWmquZp6y5naOtmZWhkKagk42co56YnpqQlpKvubCrlZejp6eUkJalnaStn5GgqKufnJ+ppLKeoqSOp6KUoZqbl5WkmI+woJKVqZ+FkJm2gJGRjbiVeIKTm7V3bmxuc295j4SOiXKewbu8mXqBsqhwgHSRuYN7hoaKho17ioaNl3yku7m9nHV5s6N0dpd1dLB1mJ5mhmmNtnRycHe2jF5/eX2IZ4N5bXlii6xwdIV/WFunaURkWVRmX2NdY1FmZnFtdUJNT0xEO1pMP0ozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVzgqT11dPSs7VlYnPTo8pp2hob+mlrPCs6uqqKyrqruvscavtbSvuKe1ua6rpKKnn6CdmZSspK6qpraoqJ+clqCjnaykvqehqpeVnJGim5KPoaihk56XkpiUsrW2rJieo6Sii5KSppylq52WqaWmnJqhqaemo6ihkqyel6Kel5aYnZ6PsKmTnKeij2t+aZyoeYhzfpuOdXplh3u+v8C6bpKCcZSFX3JqWl2aiWFkh46Va2B/lGNtm3ZilGuAmpWUZV5fYnGaiWhyjHyGlGZqfnF0eX59Ylt4dIFoUFxug3x7impYbHmBcklKb4VwTnNNRFZcZmFMW1dmY15PWm12anJST0RFTTxISTxMPjIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVERlVFSk9IRlBJSUg7OD01MTouMTs6Li8tNzY9NSYiLyoyLCU7OC03SVJfSSdTX1Y0KVBeTCgzPltPJz8yPqifqKHBpJq0ubajrKaup6i1sqzIrLC0rbakvrGzp6Gkqp2jnJqarKeupKW1qqSbmJWim6atqb6oqKWVlJuWoJqTmKWpp5GekI+YnLCyvqybp52noomTkaqbqKScnKyfo5qbo6esoZ+qopqum5WmoJaUnZ+dl7GlmaKomZyRnpyjpZqno5qdmpqakJaCaG59cXaRl5OQg4m0qY2FmJWOioyYloeTlYmDk5OQiI2RlJmTmZeaoKGam5Sfm42CeqSFbGl7kH2AdYmLgnKCeHl2dYqAe4lqc4F0g3Vkd312a3B6bF9iW29nTFhZZWpfV1lwem9tZlNPRlI5T1pOUk8oKztKQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7NDg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5UMTBUXjorPThdSyw8LUCyoLOiv6KjsbG3oKmms6elsLWqyautsqa1psCotKGepaacpZaWoKunraOkt6ygmZeWoJetqqbBn6uklpKcl56YlJSinp6jqJKQmainssOvmaucqp6Pl5apnqucnqGtmKGbnaKlr6WhpKieq5iXpp2ZmqGenpywoZ2ip5WYlJmUoaOWpJ+YoY6WlIuKjo+XrY97lZuCkYCJqaiFgJiWioSOn4h7g5CFhZqRhoWJlY6bl46QmJ6jlpmSkJyNfo1lobOuhImEd3uPin53eXpvZ3mQgYCJa3WBeYhyaXN/eXWDh4FqdGN4Zl9oZGNkZmpYa3txamtcU0xQRF9VRkA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1RWVlhaXF9hY2FfXl1dXl1YVkpLTEJJT01SSjs8Ojc4Ni8zOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAs6C5r76sq62xsqCqprKtoqyzsMawq62ks6+8pLScoKeioZ2Zl6imqaakprO1npSVnZmZsKauvqCropGRnpqZlJKWoZyXqZ2FnamsorTHs5+ppKqWlpiap56pnKClq5Sfn52gqq6opKOroaybn5+gmKSenJ+csKSZn6iTmJmdkqWamamfm5dmg5J8ZX6Pmo9jeIxsaGp6kKOra2SZl35nhYplZWloeo2hjmpnjJeRondraouYop6YcmtueoSMhnlYZV2Fgl5si4qCdltoc3d3kYCHgm54gnh/c215hHN3iIiOg3tphVhdanNkXXOIaWt8cW1jXVFOV0lkWEBKMz1GNz9GRDcxPD0/QUM7O0RHSEhJTE5PUlJUV1teYGFhYF1dXV1eX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSS42Wk82KUVZL0RPMVlCOz8uPaWfury5r6yysKulqK2usKeurbC9saqopa2wsJ+tmKCknqKamqesnKyjpqips66elqOQo7CmtrmlrqOPj5qhmZOSm6CYmaaWe6Wsoqizw7eloqevn56VnqOeo52kqqiSn6GeoKqvqamjqp6nm6aep6CslqGcpbGkmJyrlqGfm5OlmJ+rmZ5+voOIcrRyhZ6FrWh3ucS4cZKho3ummJhzqoJ8y8DAu3GKo4eCnnyWmIiewL2Clp2djJzBwHuBepGMmsK/fWulsm+MgW/Ken+bd5GDjoB2eYF/eXF7gIZweIWMk3lsdZFiZV54Y15lgWJedGhtZGJYTFZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2BfXl5eXl9fX11cU01QR1VOQUA/PTY0NjgyNjYqJiUjKSomLisqKTEwHzkqIz5IW0wqI0NQLyNGWzNQWS9VQUI7LziWorjDtLCvv6mplKOvqbCvraayta+qpqelsaugq5iboqCcm6qnop2roqWopaW0pJ6jk6aurLi0p6+ikpGZnaWSkaChl5ugnYemqqSrrb+/saGprqmXkp+eopmjpKqjk6Chnp2srqerpqOhpZ+kpJytqJGkm6mtqpydq52topeYppeipJidf86UeXqlgXqWlptfrY9djqiAoKF8p5WadKuCgK9eZIypeqiHhZ90l5KIs2OCq4agjY2zaoSuc3yWh7hhgq1Zo81ukHV723t/mXF+iJJ1f2V7iHZ2bH2Hbn2FkJF9a4CNX3Bqb2ZgX3hkW3FoamNmYFJUU1deSk9DNUFIRUQ4PjY7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11aV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w6TC0hUEBGNC4xrcG/v7S0sLeYnpGjqqmttKumsq2srKSsprCqoaebmqaYnKKvn6GfqKejpaGfsKybnpamrq2wq6isoJSSm5+lk5CfpJedp6OeraOrsKi/xrOoqbGulpKenKKXoaqqn5Whnp2crq6mqaibpaWjoaqSrLOWpaKqqp6kp6eisaKTm6eboZuVlJGXoHCFjJh1hKiHcbB8nXKsfaCfgaWPnnergn2tf5xyrX6rh4afdpiSe3yXfqqIoYuRi5x9q3qIko+ff3qtVpzEeo9vksF9gZVtdXCMbWZ3ZYZvYXducm6IipGPg2yPjmRtc3VvYGZtZF9vaGpuZmNXU1xgWlJSQzhJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi08KD0xKTNWQEYhHEc7QzEtK6/Txcays6Cdo46joqKtrravqbGnqKqorqurpqKjnZqjlZ+mq5+ipqCpqKOfnrCtmJuWqKevrKinqZ6XlZqjopKUoayanaajr6yjrLWpuc2yraaurJaVnJ2imZ+urJ2WoZmenqqxp6mpmqmno6Gqmq+xoqisr6aZpquqq7Kkk5ikppuVkoWkaqR1iXqpdXqycYKliZiMcIefmoekX2BSq4R/roKbda6Cp4aGn3qZl4V7ZoCjiaSYhoGjfal+gZSGrl57qFWdopKBeqOfgHzDr8WMc6+0s7lxYqmvwnRojIyXjoFsmJFubHh4d25rZmRkcXBme2ljXFZfaVhYVExMUUxDQ0FCO0NBQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICgnIistIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXVwKGZq6ihr6KfsLWwr6mto6inqqurqaSmn5uln52mp6aknayaoqyho5+vo56bk6qktrCuoKmbnJeVpqOQmqKnn6Cmm7Gmo6ixrLbIsrWprKqVkZydopmgpbSdmqGUnJ+nq6mirZmqp6GhqaGzraKqs7KinKqosLC3pZSXpKiZnZJ8qmyehId1q3l8sG6CpIuIn5aVnpWB0re0uMmAgbJeX5Spg6SHh6B6mJWZeKrJc5mjlKeokJKajH6aiZrGxndloYKlc4GfjoJ9r15vtWOxdUujhm2nR4KTZI6PnJJ7b5WQfW55dHx6bVtlanJxZoFqXmFYY21cXllJTExLRURCQj1BPEI/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE5UUR0cOzxGMiwkqKTAxrmtqbKurKWinbK5rKqhppuopqqsqaagpqSYq6OfrqudpqGsmp6ppZ2mtZ+il5Ooq7ayrJumnKCWkKWtkpqcpqKgqqatoaKnqbC0wrGyqq2olImYnaWboqSvppehlZmcpaWpma6crKalnaujtqygsbmwnpyvqLS0tKaWmKmkm6GPgp1OeJqBf596hKN8gqSEhqaenJ6UhLh7fHm5gn/MxsO2d5uhkIuffpqWl4l2n5eKpJikp36vhJuDnoSsfZmUYaVso3CPhZCBfZeEcqxgpHJxgJpgvH1SVXWOkaOWe3yRjodyeXKDfXBcbG53cmqAblpjX2huYmRdTExRU0FIR0ZJOTlLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFdZWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9URjxFMjpQW1QcGzY/RywtIIyHmamspKu5q6+gm6Gss7Smn6GVpa+urqmmnaWlmqOnoLKuoqmnsqCZqaSUo7Wjo5WXoqq1uaSco52jk5Chspmem6akoKKvrZyjqKK1scOxraqtqpGHkZynnaOknaWXnpiZmaWjp5itoayjpZeupbusobe3rp6etbO5srSomZ+xoqWfh4/RtcO3eYeOhZGTj4CmeJSid4ugkoWlgotxq4aFtG5yaZmjnJWJn3yXmYaHkHOugqWbooymipOciJSQmm1wslylc5N6nGyZf3uZfm6pYaJxcX+fYnOyuGh3j5OkmH2Ki5CIdnt4jYFsaHdpeHNufnRcZGRtbWVoYEpaV1g8SEY/VDNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgjKSWSco2Krb+/vLu1npeopK22oaOZlaOpp66pq5mloZ6moaC1p6Kpp7CjlKujj6Sto52QmpqqtLSknaacqZKUl66goJ6mo5ynnLWZoKqjtavCr6mrqaKMhI+coqCmo5aampyYm5imo6WXqaasoaSbrKa9rJS+sK2fo7C0u6y1qJ2qs6WpmXuokX18sHeKgaSliJxtsm+gh617oY+DqJaZgKyJha6FoJSooaKXhZ+AmZWAe5J+q4CdmZaKqnedoI+Ik5J/ea9do4F8pqdknoB8l3Rrrl2la3GFmV1gW4ygbZSQpZiCk4uTiXh5gZZ+amx9Yn10bX95X2dlcG9nZ2hCWV9bPUpTMlQ4QkJDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaWFNQT05JNzA1Mi4qLEFUVlZWVFRVVVVVVFRVVFNTVldXWFZVVlFIRklKIygovJKahKnGw7bBtJ+araCuuKWjjpqko6Cvrqmfo56drZieuaCiq6CvqpquoZGqqaWWiZqPrrCspqCom62YmY+toqGdpaGZpJytl5+opbaov66kqaOfi4COm5ufpp6SlJmalJqapKOjmKeqqqGinqmovaSXw6yro6Kss7usr6iitbGqrJl2r36QipyFh326rYmYZLCMZZWtfaGPg6eWm4GsioSwhaaZo6GikYWgW2xqgbNgf617eoKAsWxnbZmXi4ixWn20W6SDa8iiZZ+Be7xZdrVasn1Sr4B6rFiAoW2XjqeZiZWPk5R5d4ybfGNzfGGDeHN/fGBpZnBtZmVlT1VjXEFUXj1IKD45PTQhISwkHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE1KR0M1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9KftLG3vbu0wbOjnK2mpbapoIuZoJ+ds7GonqKfnbSYoLOoqquesK2erJuVrqiijoibjq+sqKejqJmuk5qPqZqhnqWemaOipZieoqmyqLyvpaienY58i5uWoaCZkJKam5GZl6ien5enrKWjpKKkqbqeoManpamhrLW3rq+oob2vrq6XgamSo66Om4CGpJeYkICAuMO6g46dk4SnmJ2CrIqCr4mnnJqlq5F+1b3CqmKkv719fqOCg9e6t7WFk5KCnr2+hGqjgW+rhG6df3qysceDa6uwvax4d6K+u3SAlY2lmo2ZjpSad3+PmXhhfHljjGd4gXtga2VqaWJQYltTaVxAVGBCTCk8OjUvHx8kHiUyIB0kKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbS0sb+6sr2zop2upqWzpp2MmKW/qbawp6G/pqaxm56xnLmon62upaeVlK+sl4yDmpGupqOsoaWcqqCYiqOTpp6nm5qgqKKYnaCsrKm4raejmpeTe4iZkqabk4+RmJiPmJSomZ6WqKeeqaahoqu6nqnFo6GwpKu0tauxq6K9qrCwnHR2qqS3hWWJn3BnrI+Kj25vd6SQmqCBdbCalnCQjXKWqKObmK6kcmxtbGWKeG5tgplxgHppcGlmiZWVl3FoaYWGZ3CGZF2KY2lvWV1nfnimYGJyj5JvZmSAjZOOoZaVlo6Um3qFjZN0ZIZ3Z4xqeH54ZGxjZWxiS2VXSmtZOlBkRFAnSjorIxwgGiIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWttKm6ubKzqqmirp6ks6qYkr2xw8e9tKmev6uso6Cmq5+6o6StrK2ljpatqpCMhZWXrZ+lqqKfpKOgkYulkqeZqZmWo6qglpylpqevuaqrmpuTknuElo6ml46RkZiUjZeVppOdlqeima+mnaKsuZ+wwqiktKassbKrr62puqWwuZeLoamltZyJlqKYhqmakJSdkqqzmZujrKG0l6OhnqGinKGkoZWsp4ySk4yHkpyclJCZk5iQjpWEf6Sal5WNi5KSio+GhH5ni4B0g3Z0h4xxp218lZKUk4GBj4+PjpySn5SVlJ6AhZKLcGeOdm6Jd3V8eWlrZGRvY1VgWEBpWkdiYE5YK0U9KyYhNjQwLx8cISUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5UUUpFQz45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqktbeurqKwpK2foLaxkI6qxLvEubepoaWdm6WdsKijtqedqbWmp5GYrKOLiImPnKeWrKOhmqienpOVo5eomqmZlKaho4+ap5mhtLmnqpiakI18gZSMoZSKlZGVkI+Sl6SOnZinnpu1o52mq7eor8KvpLinsK+xrqqrtbuisb6ZkqakprWikp2mno2on4yRn6OssJqhpLKqsZmloZ2kq56enZyXrJ6SmqKblJCWqpmNmJiWkJaekYegnZWUhZKMj42Vi4F+Zo2HdYd2eYiEdJxqh5GVlZKJfYyWkpKXkaCRmpSegoaWhXhxlHJ4iX5xe35pbmRecGlgW19ZbWJQYGRPWTlHRkU9Mjw9OC8qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OXlaSno7CzrK6jqaetoKi1qpCPnKOyuq2qq6GimXqcorCkpbGplpu4pqOUmKmcjoaKiZuikK6epJaooKGSl5mbrouqlo+omaiMmKiOnri2o6WYm42JeYGUjJuTipWRk5CNkZahi5ycp52et6N/g6+1orCwdKS/pLKgeHuhrLS9lneupaCKgKl+ZFxidp+Oo52Dln5ulLSco6ivrKRln6CUdHqal3CAmamYbICjqIplnKWckJeYlouSm5CEnZqQlIOSh46OkomFd2uQiHaHcXyGgYBhaYmLlZOMW3aVkWdoj4xxeaKWlmR3l4aAdpdogomCbnl+anBlX3Vva2tnXGVjYWFvUlo9TU1OUkY9QFRCOTEvHh8mNDozMDY2Nzg8Oz5AQUJGSEJHRklLTFRVVVldYGhnZ1hRSTxERzw5VlJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqaWpraSnraSSlqq0rrGlmammqpdzi52vn6irp5OWuJ+gj5yknpB+iIiano2rmqSVp6KejpeRnoV0ro+IpZqokZajiJu5s6egmZmLiXV3k42Wk4qTkZCUjI+Tn42ZnqWYm7KWgIybtZ20jZKPvaehfqeie6SwuYKOj6efhIuFj7Gpr4yJlqKZeYCLrIacnaKoq6mIlYeZd6WbeoecgZengoF7nbJ6ioagl5mUmJaBkJaWhJmaY3mHkISNj5KLg25xkIh6gXGAgYZ/hnSHhZaSeJZok3SgmnR7mYKdmoSYfZGIgYKYaYyMhGp4enBwZ2R4bWlsalxkaWllcltcSFRMUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dSWFpYW2FhaGZZUUg5RUw7PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2Yo5+mrq6rqKygqLCnp6qlmZStxbyvoJWlp7Sdj4Ocq5ymoqCNkL6emY2fmqGQfIWOmZiIrJ2jlqGhko2UiYaAkaiOh6Kco5OWnYaeubGnnZqTj4VwdZCJlJCKlI+Om4uOkZ2QlZ6jlJ2rh5+0ibSarovKiKuvibeFjbCDsrCFqY6nmI2dfKiPcnt3m46llmeUpHm0jJ+fp6mTmcKCf6uImKFxnoCapX2XhZWygKF9oJOfj5iXgI6Tm4mYkot8hZOGjZSTiYNtc5KGgHtyhoGEfYV1hoKYgY/FZoCph4+iap2BnpeAmYCKjIOImG+NkoRnd3R7dmdodXBnaGteYm5sZmxYZkZcUUwyRTQ2TWBjNyY0PERHRDo2MzY1ODs4Pj09PkJMP05JSktDUFpdXFdiXmpsXFFFPUtNQEpkWF1jZmhnYmJiYmNjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KfsKipqKWroKS5samrppqUnqKkqqKVpKm1oq9/oKacpZ6diZS8mZONoJGdj3mDlpaRiKuZnJuaooWPjHebnI6gkYiepJuVmJeGorispZmbjY1/Ym2Pi5OQjY+MjJeLj5GejZKeoJigp36hp4etnaCWrpCgnp2RhoKgjayxiKSOq5qMmn6idYCYk2uBqnRMqniHjZ2Sm6mpgqqrfoShe3qnaZ5/kmxnl4aYtomefm5gY1iDl3+Me2Rni3OZfXmWa118l25fU3GFXGBseYNgWWWCfoSBmHGnqmuDo25ypXCfgpxnZJ5sWmyIemVZX4J+YVdQb3ZlbXRxampuXmpvbGtoV2dOXVhFOUA0R0ReazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUkxNQkpbXV9XXl9idmBNRTpNT01UYlxbZmZpaWJiZGFkZGJhYmBiZGNhYmprZGJkZGdkYmdlYWNomJadoLmgqqOmrJGhtryrrqKZlp+gpaurn5yttKGnkaCfn6abmY2YtJmQi56MlYt1gZSRjYqmlpaYn55+k4WGrKOHnJGKmKmYmZqRh6WwpqKVmYiJgGluiIeLjo6Ji4yRi4+RoIuSnZ+boaV/k4GPo6GUoHeclpCng6KogIarr4aleot9hJp9onBykoeWe52MeW2Hm4uZkZypnI+HnXyConN2pmaefnekXph7fZNzom6Yt7S6c5KIgYC2qGSBxrh7cJW2jHGAm6RjdKyrYH1qnbN+bn2Hg4+Ci5dxgKNsc6RznoJ9o16cmbOWb3uXnrN0cluesoJpYm9zdXFoblhra3JyZFtnXWFLRD1ENVFBWnAyPFJGX0pTPTwzOTU6OjZEOztASVA/VE1OUUBFX15bWVhgYHtkSUM4TFdVVmJhWmZma2tiYmVhZGNgYWJgZGNfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mauck6COpbi1ra2gmqGboqOkq5uasayqkpegmKCkmZqUnqubi4iReIuFcICWjYqPoZCTlJ2XfZGKjqigh5iPipKik5uajIqop6Sej5aHhH5re4d+fY+Ng4uPj4mOk56BlZufnKCfi4l3nJiijaByoouIqYicp5GXqayArox9eqCZeaOTeIBzl4iLnH2Vn4abjpmcp4ejZKF9iZaQm4xsnmiajW6amXuAiqd9cmdzqoOdgnOqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxep3Z2iYqAnWiadYeTkpiOf55tmZBqpplcqH53u2p9qVqOhF2zZ1tucXh3a2lbcGl3eGFeZFZhQVBFTzdWQlJtNEpaWV5OWkRAMTUxOzs3SD86Q0dVP1hSWF0+RGJdVmBRYWR8aUVCOU5bXllkZlhmZ25tYmJlX2FhX19gYGVjXmJkbnFgZGVla2RjaWhna2mVnImqtpuoiWOVnKy6srCrnaWbmqefnayZnbCnqp2Wopmhn5mWlqCjmYaJjWmIgHF7l4iMlpaEkpSYj3qKhJajnImVj4aLnZGcm4iPqKKfmoyRioCAaYGGeX+WjHuIjY6HjpWZfpKhnqCik5hyaJ+KoI+McJKMgqmImaCkqaKpfbCtpKK4l3ajs6Kjf4iUeJx6qpl/oo+enJiJmHKhfYWNsLV9a5qRoXh+mLSjo6uohJh7mnycmn5zqlpdb3uXi3ieYkx/e3uFZHqYQk2fWaJqcnyOboGKhJl2m3mHibGzf36akqZ0fp1tcXyUb5lyaaNdlXZIZWNgc3B8fW5mX2todXtiY19QXVZcVFZAWUVRZ0VSVlxhWF9JRD1COEBBOklFOExFWEFWUVpWREZhXFpgS2BtfXFFQzxVXmJaZWpWZ2htb2JmZl5hYFxdXmBoYl9lZHZsXmVnZmxkZWxoaGtplJ2Bsa6ZhFNfoae0urOzqJqii5qpm5ynkqCro6Cnjp6dnJqZlZihnZaHh4l3hYFueZWFkJqLfZGTlohygImSoJtykpCBiJmUn5qEjqibmZWLiop8hGyEhXGBoYx4hY2Ih5GXk3uRop+eo4iuhn21hI+enXumlnqpgpaekYuinn6naHdtfplzoHNxfJ2GmW+Sgq18o4Onn5uBpHBeqWh1o2NvpWGc0498epl4cnNjooWPfqJyoo51a4+zi2CCmIpzqrKnvH93g21/v6aqtF6cb35yl2+Bc6JyXqRndKZgaKZsmtOYeoKbbnZ5l2ubeXaXcmyppWdfZHlwf4RrZ2ZjbXV3Zl9hUVplUFFhSFdJVF9XU1tkaltlUUVDS0xKS0JKRThQQFBNWFNYT1JRYGVlaVJkeHl3SUZFY11lWmhqU2loam9jamZgY19cXV1faGJhaGV8ZF5kZ2RrZGpsZmhsaJibf7CsVFxLfqmvsrWwsqOcmISXpqCgo4ykp5+XqImZl5iTmZORoJeOiIV7cH2EaH2Pg5OagXeRjo+JcH+Hj5OSbJiUfImRkqOVg46pmpOSi4WJeYN2iIBugZ6Gd4CShYeYoJV5kqKjmaCJs6Gitot6rKekrqVwqYCbkYaBnZN9pICimYaYcZ6Eoq2uiZeLf4ykjZWDr6KVdrW2tcmidJSLgp5hnpepbXmVhqCbdaGHd6B9kJaKgW9MZqOScJqIc6V7eXRig4JsfqBscmRgnHJ/dJdre2q0tbTGpnOYfnqcapqaq3SBmmxzd5dpmXl0l3FQRH2zXml1aniHZmtnYnN0cG1VXFJYZ09SaElVTFhSVVxna25VZ1dNSkFKTUpISk5BUUpQZGNpbWV0cnN+eHtudYl6e1RRT21eaFtraVJqaGlsZ21mY2VfXFxcX2liZGhre19dZGdjamZubWVpbGWinIivp4VmP5Shs6yvr7Wioo9/lqeioaOLpKacm6WBmpeWjZeQj5uTjoiDeWp5hmWDjH6Wn3l1j4iMgmmEhZKDjIWdjXqMipWlkoKXqJeMkYuAiXqAfYt5cI+ghnmBlIaIlZ6UfpOlp5yWloRnbnicbKJkfHGleJyYcGingpiNfKR6oJaDlnKfdoCJlJWPuW2PiqJifZmiloluc2qra3WgbW+mYJtpi5BploealXWigH2aX4uFjHVviGJooWWef2mbdXBkZ4iCbnKiWl9bY6FuXYmMcHt/dHJkpW54omRmp2iXcouYbqFvUoiPbqBeZKdUi11UmG1tcmpxgW1waGt4c2tvUVZVVWVZU21JWE9cSFhoaHNqWWtWUFJFVlxMWFJhVWhqXnd1enxwfHxygnt/c3aNgIN2XlFzYWZicWdQa2hoa2xvaGRnX11dXWBqYmlpdnVdXGNoY2ppcmxma21jnaWZpnpldG2Lp66lqrCxpp+Lf5aqnJ2ki6GhmaGhgJWYk42aj4uXkI6Le4ZxgIhoi4p8l5pzdIl9kHxlgoeViomWmYJ8iIWWppCBoauQhZCKgYp9gICOc2mPpYR9hZOMh5efjYaRqaadiaZ4lpx+pYmWjLKZnpGDr5efpXmXiXqpdKaPhJpupaKMkoSMg7xtfKWvgoeGh5SXnaF9pntyqJSglmeefm+sY5aKlZJ3qGypooGJdoeCd6uRpohrkbBrdrOMqWyLhm9voJ6RlGF/q4uqd4F/jqefd599haSVnaBpmod1rGaerYy2c3a+jKOTWYOmjatgdXFzb3t1cGJqfm5nbFNVWVVgYFxqTFxRXEldbG12YFtxWFtfWmdzZW5vcWNxdGB3en55cnmDcoN+gXt7jIGCgHZieWRjbnNkUmxnZ29scmlmaWFfXlxhamJsbHpvXFxiaWFtaXdtZ2xuYpWmqpyBgJ6klqqqnqinrqOYiIGWqpmdo4mapJyonYSLmo+FnJGFko2MjHSFeoiDb42EfZeTc3WGcpGDbn+LkoaGlI99e4KFl6WNf6WljYCNiYSUdYKHkm9si6iAgouTjYibnoiLkqqioJCAdJSXiH6BeZSvpH+BnHGPhnmSjIWAe3KnjHF9fXqXlpuEjXh7fX2IlJWTi3eRmaChhHt+iWuMhVt5eXN5cGlufpKKcn90gY+Uk3GFg4JljX9fgYCMd3Z0lHVve29viW6Ehl53aXiOZoKDho+qnH90fZdqiYhvf3V8hHVtbGaMc3d7l3eEWmpXeY9obXdycW93eG9dbIZtaWdWWV5XXGRrZFVhVF5RX293eWtqd2Vqamp1fHBxdHNhb3Vic3uBeHV5gXV/gH+AeYuFgn17bX9sZHluXlduZ2h1a3hqaWlkXGBaY2llbHF1blpbYmtkbGt5bWhsb2GOlbmpp4uhopumpJmknauin4ODlqqRnaCImaaaqJiCgZuLfpaUh46KiYxygnyPfX6PhHqXjnRyhHCVhnt9kouGhpCFeH6AhpijjHunoIuFj4+ElYKGjph3cYSqhY2RnI+Hnp2Gipqon6Cqg4mOlZt/foqXraiQk6eQeHGek4N7k3B/qYZwfZVxam98gZ+Lf5GOi2huXYSMjJycoI9zloyIcXRrgnZ0gFlyboaRgn5+i2ldaWN6hYOIgF9peHucfIONg3aBh4NpeYyIa2JxcoN3X3KNgoqQqJaHZ42Pg253i4Jvg4t3bmRmY3mCepVaW2lmbXZbenh3dG1zcoJmXG2Ka2tiWVhdWVhrcVteYFleXWVyfXpzb3Rjamppe3xyend0ZG10aGx7fnV6fHt5eX+Afm+FiYR7fXN+eXJ/aFRccmlsdnB1Z2tnZF1hWWpoa2pxcm1XW2VtbGdyeW9oam1gjIyqsaGQo6Gan56YnpmooqF9gparjJ6Uh5qhkKSUf3uYhHySmYiIhoaKcn2Ai3aFi4GElopyb4BymIeDfpKDhIaKgXqAg4uan4+CpqCGeI2XiJWLi5yXhIN6rIGQl5mTiZ2choehqp+hoqOLiJObnaOZlqqiqKehk5yJmJB8eY+Phah+fpKRkpOcsaWalJ2PjbGSmISmjIyWnKCKkZyDiZKKa3yOdndlgoaQin2JnYSHi4+HiICFhJB3fHt1m6OJiIufi4aVf36NgoF2cXSGhX94iYiLkaeRhIeOiIOMkIt7hYmHjX91aoGDe3mZaXFoYHOKcH16d3ZvdnOBXF5vh2duX15ZWlxSZ3FVY1tbYWxodHt8cm5wY2ppaH97bXh+cGhvcGxmgHtygYB3f31/hHttg4yGfHp4fH56g3hOZHZqc25xe2VrZWJiYFtzZnBmcnFsVV1sdG1oeHpwZ2lrZY2InrqflqKhmJWZmJSYpKCden+YqY2ejIWfnIqdlnx4lIJ7jpmJhoOEh214gYBygId+iJOEbWt+epeHhIOQfoCGhIZ9h4ONm52RhqmegnKKj4WSkYuckX2NeqmDjZGXlY6cloWFm6afopqdhoOSmpmZkJmmoKaenpCXgpOLeH2Ij4WmfHyPkJGFmKmgnJOcjo2pjZGAno2JlJugg4+Xf4eOg3B4hnF0YX6Ej4Z1jJiAg4+ChoR+hYSVbnl2dZOjjI2Gm4WFjnWBjH59cnN8iYR7eY2PhZOokIeEj4KDiYmIdYSGhol6bWp9f3ptaGtsZl55fmd8e3Z0dXV6d1xgcH1tdGBjWlteUWZtU2VaXWFqaHV6fnBsbGNqameAf2tyf2tqc254boN5boaAdoKAfYV2coKNh357enx/e4KLYGl7a3VoaYNlamNgaVtjdWhvYnVta1RicXllb3l6cmVqbW2Lip+4mqGkn5KRlpeLmp+enXp3nKWQm4mGpJSKmJl4eY2FfImRg4yCgoJse394coCFfYqQfGtofYKXiYGIjnx+hoSHfI+Aj5ubkIemnH9vi4qMkoagoYqFjHynkIePkpaTlpJ2jKOgoZ2Wmn+BkJqZk42aoqKkm5iRnH+PhnqBhY+IoYB+jI2PfJekoKCSmY+QpoyPgZuSiZSYnH6Tk36HjoF2dIJwdmB9gI6HcoqWfIiMcYx+goWFj2l4cnmNmZOQgJh/iYxzg4l9fXF6fIyFe3uSjoSXppSMhpF8hIWGhHSAgYWFeGRxen54eXBramZefXNnfHV2c3xzf2peYHR2cHdkY1hdXlJqaFRlWF5gZ2l2eIFxZmtjbGdlf4BqbX1nbXBqfXeFemuLgXKBgX2BdHaCjIZ/fHqAgX1/j2pyg250aWKIaWxiX3FVdG9tbmB4aGxXanR2Y3R6enFia295iY2fs5KlpZyOkJiPhpygmpt7daOfjZd/jKGKiJqVeHuGh36DiX6IgoF/cH56dHWChX6JkHdnY32Gl4uCio14fYCNg3mWgJWXlY2Vn5p9b4uBkJOGpZuHjImDppWEkoqVl5KRdpCdoaGYlJh6f46Yl4+Xmp2knpmTlJx7kYeEeIaXjp5+goqOjHOXop2gkpiNj6GMi4OXmIOTlpp/mI18iY2Bd3J+bntkgHyLhnCGk4CQgmuHg4GAiYVmdm99iJOZjX6UeYyJfYGJfXxygHmLhnqFkouMmaOXg4SMd4eDgoF1en+Gg3Ned3d8c313ZmtjYH5panZzc3V9cXxjY2FzbnVybWFZX11aa2RSYldfYGhrdHmGcGJqY2xmaHyCa2h0aGxvaH98gXlsj4VxgIKCf3R8g4yBgH56goN+fJBtdYl0dG1limxqYmN1VoNpcG5geGdsYWp2cGV4e3lwX3FshYWQna6YpqiejY2Xh4WfkpaXfHaom4mYeZaci4yYj3h7gIt9fIN7gIKBeHN4eXN9gIN/iIqAZF59i5WIfoWHdH1+in9+l4SWk5aMo6CXfnGHe5ORiqaPjI6KkqCRg5GPk5eQioCOl6CakpCSdICNkpSJnZ2ep5mYjpWYdY+Qi22GmZCae4eIkIlvl52ZoZOVioyejIaBk5x/k5OWh5qJfIqKgXpyemt1bHx/i35uhZKDlHhvgoR+fouAZXNqfYGXmIWAjnSRiYR5iH52eIF+h4F9hI6GjZWlkXmFgnSIhnx/cXN+hYFsX3l0eHB7bmFuYmR7YW1vdnJ3d3NzYXZgb2x1bm9dW15dXWpdT1xXYmFobXN6iWtfaWVqY2h3h21mbGhpbGeAfHp3bpCIc4CDhH10gYaKeoN9eoGEfXyOcnmLeXhubIdraF9pcmOHaHFvZXZnbWxhemhqfHt3cGF3bYuBmZqqoKSonYqKkYaKnYqUl3x2rJeMlnyek5GWlIh2fXuKfHuAdnd/gG90c3pvhX2BgIl+fGFcfo+Rhn+EhHN6gIZ6j5GGkZGbkqSak4F8gXyNipKjiI2KjZeajYWRmJOVjoiIi5Kdk5CMjW6EkI+RiZ6ZoqGXl4mXknCLm4Vnh5qPlHuJhZCKcJaak6CRkYiKmYyCf5KffZKPk4yaj3uKhYd0c3ZrcW52fIt0boaRjpJxdIB8gYKIfGVxbXp+m5R+hYp1kYuCdYl6b4F/gYh9hY2Kho6Wqo57iH1+ioV3fW9tfoOBYmd3c3RuemFdb2BqdF5wanp5eGxycGV5XW1sc21zWFpdX2FqWk9XV2RjZnFxf4dlXWloZ2JncY1uZGlnZWlngHp3dW6OhXOBgYN8dYKIhXiFfHeDhXqAind/i3t7cnmDamtfcGhzf2txbm1xZ29rZXtibn95d3BrdneJf6OYoqihppuIjIqBj5yGkpt0gKmUkY2GoIyVk5B/c3t2hXd4f3Jze4Vrcm95bYl2f4CGbnFbWX6SjYiAgYF2dYB/f6CGj4qRnJegk5Z3iX6AjIicnYmPhpKXloWIlJiPlouLjI2MnYqOkIRuiYuPkYqclqGcmJaGmIlshqWFZ4eei5J/jISMgXeTmJGdkJCIiZSNfn6QmXyRjZCOmpJ9i4CDb3ZwbG1vcHuGaXODjpiKcHeAdYKJg3lnc292gpuPfYqFe5WSe3eKdXGLfIaNe4uHhYqPnKWJfIR2gYp/d3dsaX6Af1xxcnFvb3dZXW9gb2peb2p8enBtbWptd2Bwb2txbVlYYGFhbVdQU1llZmJ1b4SCYV1rbWRiZmuSbWBmZl9na4F0cXJvi4B0f4KAeXaAi4B5hn93h4Z2g4V7h4yAe3aKf2pxYnxihXxvcGx0amhubHZ3X3F+eHt0dXN/gn6llZqtn6eWhYyDfpaUgo6edIqfk5KFipqMlY2LenJ3dIJwcoVzcXWIbG5sdW2Id4N9f21uVVGBq5SHgniAdnKCeYKggpGBkpGXm5GYd5F6goySpJqTjoiUmJKDhpaYi5OLiI6PiJ6EkIp9c4uFiI+InJmfm5aVgJSAaYeeiWiHoYiThZGEinGDkZePmo2PjIuPjXd7k5F7jouNkpaNfIh8gWt3am5rbG16f2J5fo6WgXZ6gXeDjX16aHVtdYiXjICJh3uUkXJ7hnF4jnuLjXuJfoSOkZ+fhn19eIGKfHZvaGp/gHded29ta3ByVV1uYXFhX2xueXBncGZmc3VocWxhd2VdVmVgYHFTUE5bZWRceHCIe15caHFiYmVlkWlfZ2RbZ29+b2txc4p9dnyFgHV2f4x5e4aAeIiDc4aFfoyMhHx5lXhmcWqDX4d+b29remBpbXR/dF9zfHiGd3NzhXx5oZCasZyljoKKf4KZiH+KnH6KmJKOhIiXjo6OhHZ0dnOAcG+Fc3Bxg29qaXVtgm59fG11c1JOgt/JktaTfG90g3WDn4KRdpSQmJuPmHuTcoWQn6GTk5CJkpuThX2VlYeMjYeSjYmcf46BeHqMf4iMipybnJuWlHqOd2mKk4ltiaWGk4mYg4ZjjJGYjZSJlYuMiYtwepWJfI6Ji5ORinqFfH9tfGVzb2tsenlcgHmPjoB7fX5/ho57eml1a3SMkIqDhoZ9lo1sf4BwgY2Ajol+hHuDkZabm4x9d3iCj3hya2VufYFqaXRuZ2hzbFNeb2RwWl9scndma2tiZ3hzb3FjX3dgYVVrX151T01LYGVjXHlxinRcW2V1YGFlZI5jYGZiWGlyc21rcXaLfHR5hoJ2d36Lc3+GfnqJf3KJh4GRioh9fpl2ZXNufGWHf25wa4Baa254eXJgdnp7jXZydop2eZ+Mm6+boJCChXiIlH57iJyGhJ6QjoWMl4STjoeBdHdweXBuhG9tbn5yY2R4cHxuenxqaGxjpJrB3K7vonNrdYN1hKGEkW6Vj5Sfk5qBkXCFi6OXiY6VipCdlYOAlI+EiI+AkoqKl36He3V/iXiGhY6bmpeZj5B2i3dwiIqMfoylhZKKnYWGXouUl4mOiI2KioSJbHyXgn2IhoqRj4Z2hX5+a31jeHRqb3hzWIh6kYeFen9/gIWMfnpmdGqBi4+LhISAjJiGbIJ3b4mSg5GFf4J7gZGXlJuRdXR4hox1cnBlc3eAYHNtb2FodWZSYHBna1VfbnR5YXJjYGl9cXJuW2NyYWNWblpcd0xMTGNlYV12c4ptW1xkeF5gZGWEX2NjXllpcmtua3J3i31zd4SBeHh8iXGDhHx9iHt0i4iIlYaMf3+Yc2h1cXlsi3tudHCAV3B5dnlxZHZ4hoxodoCJcYCdiJmnnKOShHxwjJR3eImcg4SfjY58lYx/mYeEe3J3cHNqb4FraWx8dF5geHZ7cHR6Z2BlfOvatcnD3IlzbHOAdoqaiIxpl4+OnJORgYhwhYigjoSKlYqMl5N8jZKIgoiPepGLho+CgHd4g4Ryh4KTm5aUmIaNdod/cYaDioiapISVjZ+EiWGDlY+FiIWIjIaAh2h9lH99goWJjo+CcYZ/f3J3Z3ZyaXR3bFqMfZKChX2Ag4CEioJ2YnVtioKRjIN/gJOSfm6DbXqIkYiThX2CfoGTlJGYim9yeoyFdGtvaXB2fl1zaG5caXVfUmRxaGZTX3B2dGBvYFxognFyaldnaWNpWG1XW3RMSkxlZl5hcnOFaVtcZXleXmRnemBkX11Za25lbmp0d4p+c3KBfnt2eoh0hYN8f4d2doqFj5iBjYJ7k3Zsd3Z5eJJ1bnd6fVh5hXF/bmZ4dpGCZHaGhXGKloaZoZuiioZzb5KLcnaNmnyJmYiJe59/g5l/gXhxdG5vZHJ+aGZsd3dbX3h7enFxf2lhZ2F/1baOkaZ4bnF3e3GSkIyGapiNiJuQioV7aIeLmYaBkpCGhpeNe4yMgICJjXuQjX6JhXp1e4N7cYaAlZmOkpSCiXWEiHiFgYyVnqCHlpCgf4hhf5OHg4eDiIx/f4JmfZGAfn+CjI+Qf22DfIJ0a213dXR3dmtjjYGOf4R/fIR/hYh/cGB0coZ9kI6DfYCSinpxhGd7hYyIjYR8hX+BlZCSlIVvcHmLf3RsbWlqd3phZ2ppWGt1WlJpcmliUGJyeGxiZV5aaoNuc2JcZ19lbV9uVFpvTkdOZmRcZm5ygGtaW2NzX1xja3ZkZV1dWmxsYm1qc3aGgHFvf3x9dHiGeIWDfICIdniJgZKVe4mGdomBb3h5e4OSb217gHZeg39zgW1oenOUc2dzh3xykpGEmp+boIaGdXWUfm11kpZ9h5CDio2ZfIyadn52cW9samF0fGdiaXV5WmB3e3ltcX5lY2hoV52PX3Jzl7zEhHZxlIiPfXGWi4abkouHcmqIj5aAe5SMgYSajHyKhXx7iYt/lIh1iYZ2d32BcnWGgZ6UhZSPg4NygIp2hn2Lmp6ah5WPnYGJZn2Tgn6EgoiJcYF9Zn6MfHl/f4eLj31pgH2DdmZveXhzd3Nsa46FioGKgHiCgYWEgWtfc3l7fo6LhnyCkIF+c4JpeoSJjIaFeYR9gpmNkY1+bm17iH12dG5mZXt0YltwYlducVNTbXJoYU5mdHhmYF5cWW+Ab3NZZWJdam5gcE9Za1FEU2dgWmpubXxuWVtdbWNaYnB2ZGdcXWBraWNsanN2gYNwbX98f3R1g3qDgnyBhXZ+iIGWkHiEi3SBiHJ5eX6NkG9ve4BxaYF4en5tbHt1lWtqeIR0a5ONhZ+YoJmEiG59jHZpd5eOfoCJgpSXiXmPlW96c3BsaWRgc3poX2Vxelpgcnx5Z3F6YWVlj7Gyd0tiWqXZ0JZxe5CKj3d9k4qEmJCLhW5rhZKRenmShoGEmIp8hn94d4mKhJaAb4uIcXV+emp5hYOlkISTjYN/b3+Ed4V6h52alYyUkZWFiHB7koJ8goKIg26Ad2iAhHhyf4CDiod8ZX1+hHZjcHOAaXhwb3WZjYaDinx2eICFeoNrXHJ/c4KJh4p+h4p7iXKCbnKFiI+GhnOEeoKajY6FeW5vfoR/dnpkZmh7b15YdlpXcGxOV3FzZmBLbHd0YV1bWll0fXNvV2ddZmpyYG9OV2hSP1hmXlpwa2h6cVtaWGtlWmNweV9oXF5lbGhla2lxd3+Ib2x/foB1b4J6f4J/gn92gYSIl4lxgo1xe4Z8enmDk4x1anl+a29+dH99b3J7epNwb4F+eGeSi4OhmZyRgoVmhoNvZ3mViH1+hIGYiYF8jYxoeHJrbGZfYG95bV9ib3hcZGuCemFxdl9lZdTqvYsyOj6Ljn9xeIWHjY11gpWMfpGMi39tbIWMjHV8j3+FgZWIfIJ4bnaHhIOXd26IhWx1e3RmeYKDp4uCjouEfm6AdniFe4ieko2Rk5OOi4d/e5KGd36DjIJrf3JogH54bXx8goqDd2F5hIFxZHFofm51cXWCm4uAf4WAc3V+gXOBb1xuf3V5i4SLe4eBfYh5e3JtiYSRhYxzgnqAl4yMgHVta3aAgHV0W2dndW5XVntSWXBkS1pycmVbSXB4b1xbW1lddH50aFliW2dmb2RqTVdmUT5dZVxddWVgdXBaWVRuZFlkcXlaaF1fZm1naWtpcHd9jm1pgoR+eW6AfHyBf4J6dYGBjZOEcICLbnd9gHt7h5KJf2h6fWpze3KFenN3fn6MeniEfXxrjI2Em52WjIGAbI19a2h+jYt6fn6Dk4J+fYqIa3VxZ2hiW2Jnc29fYWtzYGhwiHpic3ReY2SboI9uXDVar7V0aYCIfJKGdYWVhXOOiol2cGyFg4d1eYl4iXyTh3l+cmd1iX5+mG9xhn5odnluZnmHhKSHgIaMiX5uf3eBgn6Om4iDlZKZiouFiXyPiHB6fYR7aH5saoB7emp6d4KHgHJgd4F+cWRyZ3aCbXV7hpWRgXyCgW93enx1f21ZcIB3dY2Dh3iIdoOJe3l0b4uBkYKGc39+f5SJintvbmptgYF0bVxmZHJwUFp6TVtvXE9bcm9kVUtzeGlXWVlaYXCAdGBdXWBnZGlpZk5ZaE1AYGNbYHVhXXVsWFdTdGFaZG9yV2peYmhrZ21saHB3fJNsaISKfHxwf357gX+CeneAf4qLg3F7iG9xd4N/e4mMj4NqfXttd3h2ind8eICBh3+Dfn56bYSMiJijjYSDenWLeGtsg4eQeH16gZF/f36Kg3BycGNmXllmX29vX2BncGZqb4l0YXRvW2FkanZ7gL+cpqTIuHGFg3KSfHeGkoJzkIuHcXJvg3uDdHSHdIh3lIh5eXBjd4d6gJNpcoR2Z3d1Y2p8goidgX9/jo99c4B1hnqBk5GEepePlpCIgol7iIhreHl+dGd6aGt/eXNpenaAg31oYHeHfWpqdGh7gGl2gYyRlH56fn5wfHZ8dH9iVnh+c3OLhYJ9hHGHiXh5cXGEg46Af3p+fXaPhoR3anFpbIeBcW9cZmFxbUlkdUtdbVVTWXJuYlFPdHhhUlhYXWFwgnNbYV1oZWVka2RQW3BJQ2NgW2NwXl13aFVWVXZdW2VuaFZrXmFpZ2Vubmhwd3qTbWmIjHl9cnt+eYKBgXx1fIOIhoNwd4RybXeCgn6Ji5N/cIB7d3l6gYt0g3h+gYGChHqAdW9+ioubnoh9hXp3hXtndIWMj3l+f3uIhYN2j39nb25fZFxYZVltcmFgYHBsa2iJbmF0aVleZG6Ad6naqseGh7JxiXdvjHR6hY1/epKJf3RzdH53gHBxf22EdJSFeHVrYHqCeYmPZnGEcGd2blttfICQk3+AeZGTfnl8bol3gpKNhXWXi5KPh4WFe3+EbHR2fm1ndmRte3VtaXd2f398YWJ4hnpodXVifXtndYaOjZV7dIB2cYB7fW2AWld1f3B2hYh/gHptiYZ0emx2gYSFf3x+eXx0i4J+dGh0ZW6Kg2xzWWhec2RHbW1LWmFXVlV3bWJQUnR2WFBWWF5hcYRvXGBjbWRkXm9jVF1yRkJlX11mZ11be2JRVVx1W1tna2FWal9gbmVma3FocHZ4jnRrjo11fnZ4fnaBg4F7c32DiIeDb3KAdHF1foWBiY2Ke3d/d4N7fIWHeId8fYF+hIB7fnN2eYyOoI2Jeol2dIN4Xn2FmIt4hoN0hYaEd4l6Ym5sW2JbW2FWaXNjYFtnbm9mh3FhcWZXXWNsf3zKzoe5oWptbYpscYNxe4OJfnqQhHl4c3l1dXtqbHZjhHWSgnZvZl59gnqLimVygmtqcWNYbXqFm4iCgXOXlHh/fW+JcoSLjYlzmI+RiYaLg3t5fXBwb3xmaHFibXhxamtxeH18el1leYB4aXZ4ZoJ3Z3SHjI6UfXKHam9+gXlvfV5Zc39udYGLfIJvcIqAcXdpeICCgIJ3fnN7dYd9e3Nnc2Fui4FrcVdpXXZbR21qTFZUXlNVe2thT1R1clBRVFdeYnSFaV1gbGpmY1pvYVhjcEdAZ1xgZV5cVnteTlZlcFlbamhdV2hgXnJma2dxZ3Bzd4Z4bpWKdH96eH55goeAdXF/hoWOg3Bwe3h2dXqGhYeMhXp8f3SLfn2GhISHf35+fYd/fHh2eHiRk59/jH2LbXV/eGSChpWFc5GKb4WFgXqDdGNuallfW1xdVGdyZGBYZHFyZoFzYmtlV1tgan93vq57oLZuYnOGaHN7cXiBhHp9i353d3J2b3t2ZWpvYId1joBzamJef3h5i4RmcX9oa2taVm93iaOBhH9xmZNygXl2hG+Cg5OJdJaKjoiFiYV9eHRxbmh4X2psX212amdqa3l3enZaZ318eGVzfm6EdGV1hY2Gln9wjGdreoR1bnViXXF9bHV9jHuCZnaHfW5xaXZ/eX+Ac35te3yCe3hxZmxibYl9bG1VaV92VUppak5RTmhNWHtoYU5VdmtMUVRVX2Z1g2ZeYHFoZ2JXaV1ca2hKRGpZYWRWWVV5WU1WbWpZXWtkXFllY150ZmxkcWdycHWBeHCZhXZ/fnd/fIWHfXVygoiAlYNuc3l7enNyhYeJiIN5gX11j358hIqOhIKDen6Lg3t2e3d3mp2XeomChml2fXtsg4SSf3GOgXCFgn6Bf3BmbGdYXVtcW1NkcGReV2JydWl1cGVlYldcXGiAcG9ygHOJZGR4fml0dXNygYN3gIN4dnN1bmt6cWJna2eGdI2DbmZdX31we4l/aW15Z2pkVVdyb42mfIR7dpaRdH1zfXtvfXySh3iafYiHg4aDfXVvcWxndFxsZ15sdGRnZWl6b3tyWWeBd3VocIF4gnZid4WLfJSBb4xqbXuCcWdzZmFuemdzeIt8fmJ3g3dqbHJ2e3F7enR+Z39/gHl3b2RmYm2Fe2xqVWhib1JKaGpPS05vR117ZmFNVXRjSk5TV2Fqdn5lXWdzaWZgVmNXYnBdTEtqWGNhVVRVc1ZMWHVkWV5rYFxaY2VfdmdtYnBpc29yfnV0mYJ3f4B3f3+GhXp8dIKEfpeFbnJ0fHp0cYSFj4GAeot1dJB/fIGVjoCFhHx9jIZ7foB2e6OlinmIhYRrdXx6dYOAi3puhHN5hHyBg3VuamhlVl1bWlpTYm1kW1hhc3tpaG1pYGJXX1tqgGprb4Bna2BoeXhqc3RzbYOAen98dXRtemhqeWpfZW5ogXaQhGhlWGJ3an6He29qcGdmXVRYb2eOqHeBenyQjnp2cX9wdHd6kIF5lnWGg4CFiHZqcXVnZ25bbGNdbXJfZ2FqeGh7bVtugnJ0am+Bfnp3YXeFhHiPhXOIcm95gHJjcWlccXhkcnSJfHljdIBxaGp6dXJteXh2eWSEfH95d3FkZGNufHxqalRoYWVTSmtnT0dRa0VgeGZhTVNyXUpNVFpla3Z6ZV5tcWlkXVZgVm5uV0tTaFdlXlhNVWxUSlx5X1tea11dW2NlYHlobGBvb3VucHd1eph9dn+BeYCAh4Z6eHmCfoGThHF0dH95dnSEiJF9gHyQa3OVgHuCn4V+h32AfoaCgIp7doSrn396iIeDa3KBeXWAfoB0boZufH9zioBqb21kZFhfWllaVGFqZ1taXnSCaV5tbFxhV1xcbIFlcnR9aWlca3Z1Z3N2cWyEe318eHVybHlnaXhmXWVzZ3p3k4FjY1RlcGeChXd3Z2lqYFdWWWdjj6dufneAi457cXJ+aHpwe459eJByhH5/f4ZuZHVyZGdnXGphXG9vXGdfbXVkemhddIBvcmtyfH51dmJ0hYt7iIeBgHhydX91YXBtW3J0Y3FzhXx1ZXOAbWFte3Brant5dnNmhnZ7e3ZxZWJlbXJ9aWtTZ11cVEtxYlBGVmFHYnZmYUtUb1dKTFhYZ2t1emRlbnFmZFpXXVh2ZVRKXGJXZ1dZSFdlUEhieFpdX2xbXlxhY15+aWpfbnR4bXBudoOXeXKBgHx/iYyGfnV1hnmHjHx0dXWCeXp6goyOfX6EiWlzloF6ip19foV6gXp/fIaIc3GPrYx7e4ePfWRxh3lzfHp1cm6FbHt+bI96YnBvYmVdZVZZWVdjZmtfXVxyhWhYcG5bXlhaXGx7Y3B3dWxiWWxzc2d0dW9sg3h+f3h2bW50ZGl0ZVtndWZ2dpJ5X11SZmZqg4J0fmJkaVxUV11iY4+kaHh0g4aReW1we2l5bnyGfHaKc4F5fHh/aGR2bGBmX15pXlxza1llXW9vYnplW3d8a25ub3h5c3Vkc4OSfoeDiXt3b3J+c2J4ZFxwcGJxcoJ9dGdygGVebndpZWh6fHVub4J1dH10cmJfZm5ufGRoU2dYV1NMdl9QSllYSGJ0Y2FJVG1TSk1aV2lscXtibWxzY2JaWlthd1xTTGNdWGlTV0dZYE1GaXVYXmBsW1tfYmJchGlnYW54eWxvanaBkHhtg35/gZOIhIF2c4h0jIZ0cnZ1gnd8fX6MkIB+k35wd5WDfJmSeYCAeHp+gHSIg3RwmKB6e3+JlHhjdYd4c3d0a3Nufmt4fHCRcl5wb2BnYmxUWlpXaGNtZlxbcYllU3JuW1pYWGBsdmNpdWppXlltc3Bsc3NzaYR8fn57dm5ubGRpcWNba3JkdHaOc1tXU2VhcoB/coJdYmNdU1pgXGORn2VxcYWEkXRsbHtucHF7fX1zgXeAc3p6emRldWhdYllgZ1pedmhXYl1vaGF3YFt7dmlqcm54c3J1aHGClYOHfoR2c2pxfW5md1hdbG5jcnOBenRnb35bYHByYmBrcn5tbXV/c3F4a3BhXGVsbHlgZlJlVFZRT3RaUU9YUUhjc2JgRlVqUElQWlVra2t8Zm5vcWJbWlhZbHFXUlBmV1ZoU1RGWlxOSHF0WF9jbWNYYGBhXYtqY2RteXhrcGl1eYZ7a4N9f4SafIKEeXyHbo+Hcm92en10gYJ8i4+Cgpd0eIGThYGfiXWBgIF0f4Jxh4J1b6GWc3uGi4Z6ZXeKbm16bmZ3cHprc3ZyjGtedG5hZ2VrUl1bVWdhbGtaXHCMZE9vbl1WWFVnaXRoYnRlZFxYbXRtb3V0eGqGfH97h3aPc2Nka25hXG5tY3N4h2taVFZjZHh9fXGGXWNfY1NaX1lilZVjbnCDhYp0a2h8cGZ0eHV9bXp1dnB6f3ZfZXJjW11WYWNYYXRlVV9gbWRhcV1dfnBoaXNxdHB1dmtthJOBiXuFcXNncH5xc29UXGdrZnF0gXdzY212VmJybFtfcGd+Zm13fnNzc2ttYFpkaml2XmZTY1RVUFNsVlBWU09HZHJfYUVYaU5IV1RWbWhkfGlreGtiV11VW3RkU1JXaFFYZVRTSFpaUE13dlpfZWxpWWJgXl6ObmFma3l1bm9pdnZ/f2yDf32Hl3uAh4GJfmuTiHJndIB7dX+CfYiOf4uTcnyKkYWHn4Z7f4aMc4GGc32Cdm6ki3KBjYt2d2x6jGBke3BmeHJ4bG1xdoJnZHtsY2ZnaFNfXlVnX2xuW15tjWhOaW1gVFZTbmd0a2V4ZGRcWG9zbHF6d3Jsh3t/dpt6eGthZWxtXmBvamVweX5nWlZYYGx4fHtwhF9iXmdWWF9XY5uIYmtwgYd9eGxreW5cd3Nte2p2dG9wfIBzWGltXlhcVWFiV2RwY1NeYWhhYmxaYH5rZmtzdm9td3dsaYWMf4l7iG1yZ3F9bnNuZFphaWlvdIJ0c15pbVNlcWVVY29je2Ryd3x3a3Bta2BZYWZndFxkVWBVUk5XZFJOW09PR2RvXWJGWWlNSV9LWG1kYHhpbn5kYFVfVF11XFRTYGZOXWFVU0pcWVBZdHVdX2VsaFhjYVtejXFjZ2p4cXNuaHZ0eoNygoJ6iI5+fImHjXlukIp1bHOCdH9/h4WGkoSVj3l9jI+HkZuEgHyMhXOAgXN0eHJvk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjYyMjIyMjI2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjIyMjIyMjI2NjY2NjY6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERBUsza2NjY2NqwnaCgoKCjgGNnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTJG2Orn5+fn6bago6SkpKd8XF9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJiYmZmSj5CQkJCQjIeHh4eHh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaSlJSUlJSUkI+Pj4+Pj4uIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95enp7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkI+QkJCLjpGRiYeOipCSkpOPjoyOjoePkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYuKi4uLjIyMjIyMjIyMjI2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQkIeJi4aMhomQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCNhIqLho6FjI+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkYmCh42GjImJj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjoiGh4aIhomPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2QjoyKi4yJjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9+f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dXR2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2hoZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ojs4OTo4Nzo8OTc4Ozs+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1c3FzeHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08OTc5Ojo5ODg6Ojc4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Ozw8Pj89PD07Ojw9PT08PDw8Ozs6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV1dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDQ0A+PD0/QD8/PTs+PT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl6e3t9fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VEPz07PEA+Ojs6Ojk3Ojw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fX1+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz9BQUFCQUA9PD07Pj06Ojo8Ojg5ODg6Oz0/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAPz8/QD0/QD48PkA/PT09Pz09PkNEPzs8PT5APT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDREE/QEBAPz1APjw9Pz9AQEBDQEA/QEA+PTw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEFAPjo+PD89PDo+PT9CQkVAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVGRkZKTk5LSklHR0hLTEpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBERUQ/PEFDREI/PkE/QURFRENXdYaJin5YR0hKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpISUdISElHR0NERUNEQ0FVdIeJh4eGh4JXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTEtKS0xKS0lIRkVHTkdPbISHhoaGh4eHh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz4/REZIREVHSUtJSUdISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tLS0tLTkxLTUxISU9wcICGhYSEhYaGh4eGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkVEQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXp7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVIR0lJS0xPUVRPWGxzeoGFhISFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QDs5OTk9PT47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BCRkhLSEtUcGV8g4SDgoKDhIaJiouLi4qJiouMiVQ7ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2Nzc3Nzg6Nzc3ODk7NzY4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR2eXt8e3x9fn5+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9OjxEQkRGRF18f4KCgoKCgoWJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc2OTk3NjY3NjU6Ojs6Ojw4OTg5Nzc3Nzk6Ojg4Nzg1ODg7QT0+PkJBP0FLTE9RUFFPT09RV2tycnR0dXd5e3t7fH1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3OkE5PEQ/ZoOCg4OEhISGiYqKiIeIiIiKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj47OTs7PDs8PDo7PDg6Ojs6OTk5PD88PUFCRElKTUtKS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk5OTk6Pj0/QER3g4OEhIaGh4mIh4aGhoiJiImLjIuJioqMbDw7PkFDRUVBQUFCPkBCQEA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEBAPj9BPD48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhxcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PDw6Ozs8Oz0+QUA+YoWDhIOFhIaJiYiHhoaGh4iJiouLioqKi4qLXj5ERklLSklGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURGRUFGRUZERkZEQEI+PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj46PDs+Pj4/Oz89QD9DP0t+g4SFhoaGiImIiIeGhoaHiYqKi4yNjIyLioqIV0dMTE1LTkpJS0hJSkpJRUNERkdGRENFRkRCSElLSEdHRkhHRUtJS0lLS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHd3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTc8Pjs8Oj0/PkA8Pz9DQkVAaISChYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlKSEtHRUdISElFRUhGRkVMTE1JSkdHSElKTk1OTExOS0hGR0dFRUNGRkZGREVISEZDQT9ATGxwdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw7Ozw5PT89Pj5AQURDSVR+g4WEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMS0xKSUhGSkpFSkhHS0pISkdHR0tMTkxMSEhJSk1QTlBOTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVbnF1dnd5e3h4enp8fH1+fn9/fn59fn1+fn5+f39+gH9/f39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6Ozg8PTo9Pzw9PkBCREVNbYSDhISEhYaHiIiIiIiHhoiIiIiIiYyMi4yMjIuLi4teUlJQTU5NS0pHRkNHSkdMSkdLT0xLSkpNTUxPUE5ISUtMT1FRUFFPT0pJSkpMSkxGR0hHRUdJRkVFQkBCQlxwcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OT89PT9BRUU+Q0VDR0x1hoODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKRUVGS09OT1dWUVBPUVNSTlNUT01TTFBTVVdSU1JQTEpNTU1LTkdHSkZGSEpEREVFQkRDY3F1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz09Qj5BQUVVTEJJSkdLTXmGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOztRU1JgdV1VVlRWWVlTWVhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLR0hJSEVGSUlJSElqc3Z5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0dGRT8/QUBFQkNGRURES1dRS1BQT1BReYaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A/QFZVWVxkYFZZYnJeXVddWlZFUVlaXFlfVFlnUlVWWFRUVlNPT01KTEpJSUxNS09NU290dnh5eHd6enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH5/fn5+VkpKSUhHRkREQkE/SE1JTVBLSUpPU1JRVVZWVlR1hYSFhYWFhoeIh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JXVlRaWnWDWVV9kGFcWF1eV0lWXV1bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHl4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTUtKSUlGQkRAQTpQUVFXWFBQT1FTU1JWV1dXV2yBgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaW1hcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm9zdXd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TT09NS0pFQz9AO1BQWlpaUlNRT1JSUVVSVVNWXnV4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlRTVF5aWFdXV3prWFpcXF5TUFBQSU5PV1ZYW1pkcXR2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAgH9/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVlJTUlJUY2R2gIKCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUVFOS1JUUU1PWVFNTlFTVVVNUVNSUE5MTEhDSUhSU1RaXW1ydnZ1c3N3e3p7e3t9e319fX59fX1+fX5/f39/f4B/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRfZF1eW1lVUUxJTElhbJJ0UFFTTlFSUFNbUlNSUVJVVWJze3x/gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5DQ0NDQj9EUENEQEM+QkhHVkBJTk1HXWlRSEZPRkRFRkhHSEJDSEdISkdEQkFDQE5QTVJkdHV2dXN0dXp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWViXFhTUVBVUnNXZVtPT05MUVJQVVlTVVFRVFJPVmBrbHN2ent4eXVybnN0c3l4fn6DgIODgoCCgIKBgWtMRz4+Ojs+QD8/Pj5qUEphRUZISUVCP0hNTUdNUVVKQkU/Pjw9PD09Pz0/QUNCPz88PUI+Sk1GVW91dnZzdHZ4enx6fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKUFFOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJpbWxxdXt6fXp4enx8eHd4ZEJAQEE9OkJDQUFDQVtcTntOT09OS0xNT09QTEtMV05JR0BCPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV2dnV2d3l8fHx9fHx8fH59fH19fX1/f39/f35/f399eHV3ent6dnl4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT1BeXFpJR1BSUU9NUFFOUVJTVlhTUllUTllaW1dZXF9eX2VgXV5xd2teYGdrd29vbGpvbm5sZmJZR0ZGSEJBRkhFRUZDTFFPYVdSWFFQU1NSVVtPT1FWUE1JQ0Y+Ojk2NTg2OTc5OjM2NTc5NTxCPWZ0dXd4d3l5e319fHx7fH19fn57fX59fX9/f35+fn5/f3t3dXl9fHl4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LVFRTUFFVT0xSU1RXWFRUWFFMV1lZVlhYVlhZXVdYWGhza11WYHRrYWFfXWRgX15ZVVBNT01MSUdKS0lIRkNQT1NaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1OThHbnJ1eHl6e3t9fn19fHt9fH1+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BXVlZTVFZPT1VWV1hZU1VUTEtTVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5NTUxKRlBQVVlTVE5KTk9UU1RcVlJVU1NPTUxJSEhGPz89Ojc4NzY1OTk2NzY2NVdxcXR3eXp7fH1+fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1RTVlRSWFhZWVlSVU9KR09QT09NUkpPUE9PTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFBPTk5NUE5UUlBSTElMS09RUFFSU1RRU09MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVVFTRkVBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjNAPmpvYVJSUUBHVFFPUFBRTlFPUE9MSkxMT1BOTVBRUU5QT0pMTU1LR0VFREI7PT08OT1HNjY3NkRucXV3enx7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JDOEVOU11nU1FTQUdVUFBSUVBNTU5MSkxLTE5PUFFMTk5NSExLSUtLTEtHRkZFRDxBQT47QEU7PDg5VHFzdXl7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E+PT1BQEI9PkVIRkRGRklHSkpARkFBQEZIRUpPSFFSYVxRUFJOU09PT0xMT01LTUxNT05bVkpNUU9HSUhESUpMTEtGRkZEP0NDPj1CRz9CPkFkcXR3e3p7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj87PkFAQD5BRElFQ0hHSUdJRUJCPz48Q0JBR0lETU9hZVBNT05XS0xOS0tNTUxMS05OU2RNSkxSSUlJRUFISkxNTktHSUZCQkJAP0VGRUhETG9wd3p6eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xMSU1QTVBPR0tFP0I9OTk5Oj9CPzxBQkFBRERHS0ZESUlHR0hDQz9CPz9AQT1DRUNLTlFUS0pJTVRGSUlKTEpLS0lKTE1PUFJQS0dDTEdDQ0pKTE1PTklKSUdDQ0NESUpNTElac254eXh6e3t5fHZycHVydHl5dnhqcW5qbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZXFIS0NGR0dHSktJSkxER0I9Pj06Ojo7QUI/PUJCQ0NIRkpMSkVJSUZHR0NDO0FAQj5AP0JFQ0lNT0dIS0ZIS0RISUtNSEpMSElKTEpNXVJJSEROR0JFS0tOTVBOS01KS0ZHR0pNTlFOTGNuand2dnt4e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhkcEZLQ0ZFRkRFRUZFR0NDQD08PTo7OjpAREE/QkNFRUlGSkpMRklJR0ZGREI7QkNDPj9CQ0NER0xOSEtOSERIRElMTk1HSUxHRkZJSUxOS0pIRU9JQ0dNTU5NUE5PT01MSUhJT1NRUk5SZmdmcm9zeHV7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZV9wR0lDRUVFQkJBRUBEQj4/Pjo7Oz07PT9DQj9BQ0ZHSkdKSUxIR0dHRkVDPz1FRUI+QUNCQ0VHSElHTVBJRkZGS05PS0ZISUZFRERJSUhLSUZIUEtESk1MUE5PTk9QTkpKSE1SVVVST1dkYWFtZ3Fyb3N5emdlaGhjaWxncWxmbG1naWtsc21wdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0RFR0NBQEFEPEJBPkE9Ojo9Pzs+P0BCP0BCRUdKRkpHSUdGRkZEQ0JBQUZGQ0JCQkRFRUdHSEZMUExJT0pKTEtJRkhFRkVEQ0lISEtKR0tSTUNPT05RUE9PTk9PS0tLUFVXVlVUWWBfXWlhbmluaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNwcmtrc01GR0VHQUJAQ0Q8QUFAQzw4Oj0+Oj89P0I/QEBERkhFSEZGSEZFRUNDRUJESUZDR0VBRUdFRkZHRUpNS0hRTUpLSEhJRUZISEVDSUlKS01LUFNORFJTUVFSTk9OTlBNTE5TV1ZXWFZYXlpdZGBoYmppZ2tfZGVmY2dnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hCQkJFRTxAQ0JEPDc6PT46PjpAQj4/P0NFRkRGRERHRUNFQ0RFRkZKRUVJR0JHSEZHRkVDRkpKR01LTEtISktGSUhKSEVLS0xMTk9SVE9JVFVUUVRQUU1OUU5NUVdaVlpZV1peWlhhYGBgX2hlY2BkZWdnamloamZobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9zc3lNSEhHSURBQ0hFPEBFQkQ8ODo+Pj08PEJCPEA+QUJGQ0VCQkdDQ0RFRkZHR0lGR0tIQ0lIR0lHRkRIS0lHS0hNS0pLTEhMSk1LSU5MTk5PUlVWT0xWVlRRVFJSTE9RUE9UWVpZXFpaXF9fXmBjXlxhY2tiYGRnaHKFaGdqZmpubnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtIS0hKRUJER0U8QEdEREA5PD5APz4/Q0I8QD5BQUZDRURDSERGREZGSEhGSEdJS0pFSkhISkhGRkxISEhKR0xMTExMSU1LTU5NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW11eYGBhYGFlXWRgZmdgZWhqY3NzZmpoZ2xwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd293SUpLSUtHQkRERTxARkREQjs/P0FAQEBEQUBCP0FDSEJFREZHRUlFRkVJSEZJSEpMSEhKSklLSkZKS0hJSkpHS0tNTEpKTUxNTk5PTE9QUlVXVk1OVFZVU1JRUE1OVFNSV1teXl9cXmBgYWFhYGNkZWJkaWNkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV0c3Bzd3R1dXd2dXV0ZXFza3BxanJ2cHdKTEtLTEdDQ0FEPD9FRUVDPUFBQ0JCQ0VBQ0RBQUVHQ0dHR0ZFSUZDR0pHR0pGSUxISUpNS01MR0tJSEtLTlFLUlFMU01LTk1OUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV9gYl9gZmJhY2luaGNpaGhteHZsaGltb3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnJycXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0VBQEQ+PkRFRkM/Q0FFQ0RGQ0NFR0NCSUVCSElJR0hKRkRLSkdISkhJS0dKSk5LTktJTEhKTUtaZkpkXEtsUkhPTV9uVWxzW3FwYndjUlBidnVodWNhdmBYbnFiZHZpbnpmXGx0YGxrVV93dmlqaGhmZ2xtam1vam1uc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cXFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj89REVGRENDQkVFREZCRkZHQ0RLRERKTEtJS0xHR05KSEpLR0tKSUpKTkxNTExMSU1MTFtzYmRwXmxsVU1OZXJdZ2VxbG50Z3BpX2FZbm1icHBia2pqZ29xdGV0bm9ccHVncU1Lcnl2a2Fha2VlbHhta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0FCPz1CRUdCRkNFREVFREJISEdERUtHR0tNTUpNTEZKTkhKS0pJS0pKSUpMTU5NTU1LTk1NW3Jvb25wcGxrTVBRbFhOaWJ0cnBhbW92XFlsUFttbVpxbWtvbXh4dHNpcFxgc2xxalV1eXhvY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUlLR0hGRUVCQUI9Pz9FR0JHRElFRURCRklISEVHS0pHTU1OS01OR0xOSU1LSEpNSUtJSkpOT05OTUxOTUxcaGR1XWxxV2xOT1FuVVprXmtsdmFsZHRUZWNObFlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdoYWNpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SE1HSUVFRENBQjxCQEJGQ0dGS0dFQ0NIS0hIRklMS0ZNS0xSUkxHTU1ITkpJSE5ISkpISE5PTk5MSk1NSlpzcHBvcXFtbE9RU29Zc2tnb29xcW9tdF5uWGF0X25vcG9xcm9vdXN0dGpbXXRjd3hyam56aGFhY2ZhYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRJS0hKQ0VFRUBAPkNDQUZDSElNSEZDRkpMSUdGSk1MRk9KS1dSS0dLSkpOSUlKTElLSklIS01NTUxJS0tLU2tiWmleX2pjcnJaX1lrb2BlZVVrX2NbYWJRYG1oXGpcbmlpZFpvZWRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3cklIRklERURGQUBBRURDR0JISkxHRkRHS0xJRUZKTktJT0lMW1FKRkhIS01JSEpKS0tJSEpHTEtLS0dISkpMTExLSUtMTlRbXVRQVU1RUE5PT1VSUE9RT09RSkpPUFFkcWlUWVZbW1xVWVtdWF1cXGNmYWFmYmNmX15ma21obXR4cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzSENFR0ZGQUVDP0NHREVHQ0lLTEhGREdLTEhER0hQS0xPS0xXTUlGRUhJSkhJS0hMSklGSEhKR0dJRUZLSElLTkxJT1xXXk9cXGBeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZF1iWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRElFR0dGS0pLSEVGSkpKRkRISFBKTE1KTVJJSEVBSEZKSUtLSUxKSUdFSkhFRkdFRUpHQklNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOX1xeU1teY19aXWBjX1lfYltgXltUWVhaX15kYmJhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN2eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklJREdLSkpERUlJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRUNERUJGSkQ/SUtITltjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtRW19hYV1eY2FgYmFiY2NlWlJYVlZcW15jYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkNHRUJFR0hGR0hJRkdKR0hGSEtJS0RESkpNTUxMSEpKSEpHP0dGTkpLS01LS0tJR0hEREBEQUhJQT5ISUZPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUVFdX2FjY2NjYlxkYmFkY2ZYUVZVU1xYW2FfXl9hYV9kbGttamtsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1CQElGQ0ZLSUZGR0lHR0pGRkZJTEpORURKSkxOSkxJS0pISUdCSEhRTUtLT01LS0lISEVEP0VCSEhBQEZFQ1RdWV5YX1hfW11VWFhQXV1RS0pWXlheW11WWmFSUl9fYmJgYGJiYGNiYWRkYlhPUlJTXFNcXl1eXl9fYGRoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSERSS0ZISEhERktJTVBFR0lKS05MTElMS0lJR0RIS1FPTUxQTExLS0lJREVBRUNIRkFBRkRBVlVFXFReU1ZgWE5UVU5aW01KS1RgYVtfWF9eYl1PWWJcYGBfYmNiXWJiV19fVFBPUVJZU15cXF1eX2BhZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJUmNRRFdfSUdHSERGTUpQUEZJSUpLTkxMS01LSkpHRUlOUVFOT09NTk1OSEtBREFDREZEQkFDREBMSEJMTFBPT01GTUZGSElIR0xMTU9QSUxPUFBTUExRU1JVWllXWVhYZFZPU1RQUE9OUVVUXFlZW15eYWFlZmNoZGtscXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXk1HSFlNR0hKSEdNTFFRSUtKS0tOTVVOT0tLTEdHS09TU05QT05PT09IS0ZgRURfTERmY0NMW0heW3NtT05WbVlMQ1BfVGxXZ0pdV1VeRExRVUxNU1ZRUlRYV1RYVVRcVFBmWmhoZFlUa1RYV1VbXFxgYGFiYmJgZ2lnbmxocnp8fX6BhISEhIODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0tJRUZGSEVFS09USktHYFRISk9KSU9NUlFLTUtMT1JVUk9PSkxNR0hNUVtZT1BQTk9QUElLUX9RSXxZWXJzV1BtSHFub2FWUnJxdE9Ca3NucXRwU29fW25YXVZcWFVraFVdVmNZYFlaX1ZVV39pdHV1X2F2YFliXFxmW19hYWFiXmBiZ21wbGBwd3R4gYGCg4SCf31+gHZ4em12fnR4foB8foCBgoR8gIN6f4F/fnd3TUlFSE1NQkRMTEdKTEZSVkxMT0hLUlhXUU5PT01RVE5PUVBLS05HTVBTW1pUUVJPUFBRS0laeF1UeGRoWVJTUHZndGxwYm5na1FyT0x3bWpycHNycXJwb3CAXWZ6dXhxcXpxfnJ9a3V9YlJnfGVzc29zc3x9b355b39yX2BgYmJbYWBoa25rYmxmZ213foGAg357eHeAdHZ6aHJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpRT01OSk5WXllVTFFTTllZTFNTUk5MT0lRUlRZV1dRVFBQUVNMSGd4bGN4cW1aS0xUeXB1bXVib3dRZGRJZXZxbXdvgGpmeHhpV3JSaXttaWp6en1seHp/cGdvWHV1anZ1cIBhc2h8aWx4fG9fX19jYlxfZGVmaWpkZ2JjZGxscHBzdHNzc3lxcnhibHRncnl7c3J1eX6Bc3Z6bnx9eXhybk1KUnROQ0JFUFBJS0xKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSlNUVVhXV1BVUE9OU0pLcm91dXF1cWRoYVZuTHFwXkdoeVd2VEtoeH14YHl7c25hXm1vZFNncnVubXlwd2x2c3RxbG1cc316a215fGx1bXxrcHZ1eF5fX2JeXV9lZGlnaGVlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tS0taVkhHRUdSUEtMTktMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5KVFRWV1lXT1NPT05RSVJtSGl3S2BkdnVVV2xObmx7cmFqZ391VEtXa2h9bG1seGBbcHp7X2B6c2Nyb3hxaGR8aXJ7XVRLbF92dWtpdXt7bX54a3xwXV5eYlteYmRlZ2VlZWJaY2Npa2tyc3J3Z21paGRnYGFsYWdzcmxobW1yfGttaGt7dG1ta21PR0pLSEpISFJRTU9QTUxTU1JPU1JXUlZUUFdaVlZUVFRhYFFPTktUU1NRVlZPT01OT1FKSFFOUFVMS0tSU1JSUk9WVVFRT1JSWFhQTlBVVFhYWFtbVVNTV1tXWFdbT1JUV1dYUV1YVl1VU09YUlZXV1haYFtncl5bW1tdXV9jWl9jY2VmZGNjYlpjY2dmZm1ubXVmZmdjYGZfXWdgZGxoZmdraHB6aGdna3VqaGdpbFBJS0tMTUtKVFJNUlFQTFZVVFBUVVhVWlVSWl1WVVRXVVlYUE9MTldUUE5VU05QTkxRUEtKUVFLUU1KS09RVFJQUVNSSUlNTk9RUlBQUVRWUlhXXFdTU1FRVVVWVFpRTlJRV1VUWVZUWVVTUVVTVFVYWVheWl9hXVxaWl1dYGNcXWJiZGdlZGRhWWBhY2FiaGhpbmNhZF5fY11aZFxibWFeZmZnbXNkaWhra2VkY2ZoUUpLS05PTE1UUU9UUVFNWFdVVFZYV1daVlRcYFZXVVlVWFRRUEtPWFNQTlVRTlJOTFNQTU5VU05RTk1OUVNQVFBSVFROTE5PUVRUUVFRVldVWVpbWVNVUlRYV1dZW1NPUlRXVVRZVVZZVVFRV1VWWFxaW2BdVllfXV5dXF1gYV5bYmJjaGZlZGJYYGBiXWBoZWZkYV5fXV1eWlpfWl9nYF5eXWNoa2FoZmhmZGBiZGJQS01MUFFMT1RQUFRRT1FaWVhXWVpaWFlWXWpkVlhZWldWVFRPS09WVFBPVFBQUU5NUVFPUlhTUVFPTU9TVU5XUVRUVU9OTlFUVVVSUlJUWFZaXVxaVlZRUldYVltcVlBTVVVVVlhTV1dUUlFYVlZbX1teYF9WX11eYFxcYGBfX1piYmRoaGVkYlliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1cX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVZTTU5ST1FST01QU1JVWlVTUFBMUFdVUVZSU1JYTU9QUVRYVVRUU1VZWFteXVxbVlJPVVZVW1tWUVNWVVZYVFNYWlRTUVlXV11fW2BfYFZiXGBhXWBiX1xgXWNgY2dpZWZgWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFpcW2BeYFteXmFgX2NcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWV5cX1dcXmpwd3mAY1xbVlZZUk5PV1NOUVFQUlRSTFFUU1lbV1VPUk5TWFVTUlRSUlpPUVNTVltWVlZUVlpYXV5cXF5WU05UVlZbW1VRVFRWWFhSU1lcVFJSXFhaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2lkZ15cZWBhYGFjZF9iX1laX1tcW1hYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFpdXl1cYFxgVVxdaGpyfXNsaFxVWVdRT1JbU1JRVFJUVVRLUlZVWlpaU09TUVVVVVNOVVFSWlJUVVRYXVdYWFNYXFheXVlaXVRVTlZWV15aWFFUVFhYWFNWWVxUUlZdWV1dYV5jY19ZYFtlYl9kZF5eY2NhXmVmaWVmXV5kYWFhYmNkX2JeWFtfW1xbWFhYWFdbWltgXVtbXFtYWlteVl5ZXVBPT1JaUFtVVVdWVFRUXl5gX15iXGBVXV5ia3l1bX1sWlVaVlFRVFxUVFRVVFZZV0xSWlZcWlxSUFVTV1VVU09XUVNXU1dVVltdWFtZVVpeWF9eWVxZUldSWVhZX1lZUlRVWllZVVdZXFVUWl1cXmBhYGVkXV5dXWVhYmZkXl9kY2BcZ2RoZmRiX2RhX2FgYmJfYF5XWV5aXFxaWVlXVl1aXV5bWltcW1dZXF1WWFddU09QV1lQXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXaCe2hYWVpUVlRWXFhXV1ZWV11YT1VcWV5dXVRTWFJXVVNSU1dRU1ZUWFhYXV5YXVtVXl9YX19YXFZRWVVZWlphWFtUVldaWlpYWVlaV1ZdXl9eY2JiZWVdYlxgZmJlZmRfYGRiYVtmY2hmY2ZhZl9fYWJhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlNaV1RcVVZXWVdWXGBhYWNhY19fVltgZGFfenVvaFpcWlZYVlhbWllbWVhZYFZPVF1bYGFcVVVZUFRWVFJWVVFTVVdbW1xfXlpfXFZfX1pdXlleVlNZWFlaXWFZXVVWWltaW1paWVpYWV9fYGBkY2RlZWJkWmJmY2dmZV5hYmBjXmNjaWVkZ19nXmJiY2FhYF5fWFRaWlpbW1hcWFhcW1pbV1daWFdcW1xgXVZdXVNPVlpWVlpWWVVYV1heYGJhZGFkYV5ZWWFkYmBrZmheXF1bV1dZWlxcXF9bWVtiVlNXXl1hY1xTVllQVlVVVVZVU1VUWF1dX2BgXWFdV2BeW15cW15YVlhYW1pfX1peV1hcXF1dXVtaXFdaX2FeYGVkZGZmZmJZY2ZlaGdkXmNgX2VjXWZpZGVoX2deY2JjYWFgX19bWFlbWVpaWFpYV1tcWltXWFpUWV1cWmBcVV5iTVJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9dXV1YV1tbXV1fX1xaXWNYWVdcYGNkX1JZWVBXVldYV1ZWV1ZdXV5hYmFfYl5ZYV1dXlldXllYVVdbW2BeXF9ZWV1dXl5gXFpaWVtfYl9iZWRlZmdnYlpkZmdpZ2NfY15gZmVaaWljZmljZl9iYmNhYGBfXV1aWFtZWVhYWllXWltaWVdYVlVbXV1dYGBiYnhLV1dcWVddXFxdWldcXV9gYmRiY2FdYFhiY2JgY2FjXlxdXFhXW11fXWBfXVtgZFxcV1piZWNhUlxZT1hWWVtZWVdaWmBeYWJjYGFjX1xiXV9dW19eWVlUWF1dX19eX1taXl5gYmJcXFdbXWBiYmNlZGdmZWdkXWVmaGlmY2FiXGNnYFxpaWNoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXV1hQWFpdYWNmZnJrf0pZV11bWl9dXF5cWV1bXl9iY2JhYV1iW2JkYV9jYmJdXFtaV1hpcWBcYF9dXGFjX11YWWNlZGJUX1pRWVdcXVxbWVtbY2BjY2NgYmRhYGNeYFxeX19aWFZbX11cYWFfXVtgYWJlYl5cU1xfYGNkZGZlZ2ZlZmVfZmZoaGdkZGBbZmdeYWhoYmhoZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYV1xnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t8fHx8e3x7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnd3dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7fHt7e3t7fH19fX18fXx6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29wcHp+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKh3NxcnJycnQ+KCsrKyoii9vS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29veoB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyJcm9vb29vcjIXGxsbGxCO7+Xl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXV2d3d3d3d3eHl5eXl5enhvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx6enp6enp6dXNzc3Nzc32FhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5d3Z2ent4e3h3dnZ4eXp5en55eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t7e3t8fX19fX19e3p6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3d3x7enx6fXt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d5fnt5fXl9enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3t+fHl8ent6d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHt8fH17fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl3eHp7enl7eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fX6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCgoCBgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODgYGChISCg4KHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYKDgYCCg4GChYWFhYaGh4aFhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEhIOCg4WDgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4ODgYOEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSko+OkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCgoKBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+fn+AgYGBgoGAgoKBgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYGBgoKEgoKDhIKDhIWGhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgoKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KDhYWDg4OEg4SDg4SEhYSEhIKBgIGCg4KChIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOTko+MjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgICCgYF/gYGAgIKBgoKCgYGCgoGAgoKCgoGCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSTkpSSj42Lh4SEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+AgH+Af4CBgIB/gYGBgYOBgIGBgoSDgYGBgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGAgIOCgoOCgYKCg4ODhIKDg4OCgICAgoKCg4KCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhIODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhISCgoKDgoKEgoGChoWDhYODhISEhYWEhIWCf319fX6ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhIaFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIODg4ODhIWDgoOEhYWGhYaGhYWHh4aDgH5/fn5+fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoKCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4OFhYWFh4eGh4eFgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGh4aGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoODhIODgoSFhIWHh4WHg4B/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiIiGh4aHh4aGhYSDhIWGhYWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eHhYODhYSDg4OChYSDhIKBgYGBgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYqLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEg4WFhIWFhoSEhIWFhYaFhoWDiZSTkI6RjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeGhISFhIODhYOIiIOBgYGCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWEg4qNgoKCgoKCg4F+fX5+fn5+fn19fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeHiYiDg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaDgoKDhIKDg4SCgYKBgYGDg4SDhJGSkY6PjouHhIaGhIKBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWGiIuKhoSGhIKGhoKAh4aDg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GDg4SFhYWDg4WEhISEhISFhIKCg4GEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFgoGAgIF/fX6Dg4ODg4KCgH19f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYODgH+AgIGDgoCAgICAgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhoyTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5/fnx8f4ODgoOCg4F9fX5/gICBgH59fX19fn18enp6f4KCgX9/f39+f3+Afn2Af3+AgIF/gICBf39/gYF+fX1/gIF/f36AgIB/gICAgX+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCAf3x9fX59fn6AgH59fn18fX6Cg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enl6gICAfn9+fn58fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f35+gH+Af36Afn1/gYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7gIB/f39/fn1+f36AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35/f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZOSjYyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoOBgYF+gIKDg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gYCAgYGBf3+Af3+Bf4CAgIGBgoKAfoB+f35+fn6BgIKBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEg4GDg4OCgoKCgoF+fn19fX5+gH19fX19fX19fHt6enl5eXmAgoKChIOAgoOBgIKAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoaFhYaBgIODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGhoeHh4aHh399gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WFhIWDgoODgoODgoKCgoODgoKSkIuIiIeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWHhoeHhoeHiIaGh4eGh4iHf3x9fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomXhIODhISUk4CBgX9/f35+hYuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKOi4mIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYCAgICBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSEhoWAfXx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3x/goOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+LioqMiYiJh4WGhYODgoGBgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoKDg4KDgoKFhoSEhYWEhoSDhIOCgYGDgX99fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWChJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGDg4KDgoKBgYCAf4F+f31+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn9+gIJ8fH9/gYCCgH58e4qCfYB/foGAgIGCgYKAgICBgH+Lk4+Li42NjYiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gZORjIyNjY+KhYaGhYSEhYODg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoCBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fnx+gICBgH9/fn19fX1+e3x9f39/gH1/fn+LkI2MjI6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAfoB+fn99f4CAf4CAf399fXx8fX59fH19fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJGMi4uOjYuKhoSFhISDg4ODgoOCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn9/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXt6e3t7gIaFgoSDgn+Afn+CgoJ/f4KCf4CLj4yKioyLioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/fn9/gICBgYB/fYB/f35/fn5/f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH17f357e3t8fHx9fHt7e3t9fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4aChJGOjIqIioeIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f35+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fHx8fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3t9e31+fn+AgIOHiYmJi4mLiYWIkY2LiIiGhYWDgoKDhISDg4KCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foF/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn19fX19fH19fX19fnx9fH18fX1+fH59fX19fHt7e3x7fHx7ent7enp6e35+goWIh4iKi4uLiYyQjYyJiIaFhIKCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjY+MioiIhYSEgoGCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58fn+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX19fn1+f319fXt8fX58fHt8fXp6eXl5eXt7fn6AgYOHhIiNjImJhoWEhIOCgYKCgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx9fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiYyJi4eFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGBgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn2AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGDgX5+gIB9foB+fX5+gIB/gX5/gH9/f39/fH9/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCBfXx8fX18fHt8fHt7e3x7fHx8fXyJiYeIhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYKCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx6fHt8fomFhoSFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp9fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX58fn59fYGEf4B/fn+BgX99f399fX59fn59fnx7fHp8e3qAhoKEhIWEhIOFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl0dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIKBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+f3+Af359e3p7enx7eoKEgIKCgoKDgoSCgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l6fHB3dXZ3eXZ0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX5/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+BhIF/gIOCf3+Af4F/gH98e3t6fHt8gYB/gX9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXl7cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOCgICBfn+Afn98fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICAgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fH1/fX+AfH9/fX2BgIB+fX2Af36BgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4eXpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4KAgIGBgIGBgoOCgYF/f4OAfoKChICAgoGCgoSCfnt7fHx8fX19fn16fn19eH5/f3x8fH59foGAgYGAgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4SDf39+fX5+fn+Af4CAf4GCgYB/fn+Bfn+AgoKAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFg4ODg4ODgoGCg4KBg4J/gX9+f35/gH19fX1/gICAf3+Af3yAf3+BgIGAgH98gH99fn5/f31+foGBgoJ+f359fn5+fn9/gH99gICAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3Zxd3lyeIWFhYWDhIOCgoOCgYGCgYCCgYCBf35+fn6Afn1+fH6AgIB/gIF/e4B+gIB/gYGAf32Af35+f399fX1+gIGCgH5/fn5+fX1+f35/fnx/gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fX17fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWGhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH9/gYB8gH+Afn+BgH9/fYB/fn9/fn19fICAgIGAfn9+fn59fH5/fn9+fH2Af359foCCf36AgH9+gYSCgoOFhYKCfn58e3t8fHl3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFycHh3cXuFhoWFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgH+BgX1+gH9+f4F/gH9/gYB/gH99fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WGhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGCf4KBfX6Bfn6AgX+Af4CCgICAfnx+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf4CAgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e41+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICBgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYSDgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX6Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgIKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOBhISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gIB/gIGBf4CAgICBgIGBgYKBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg4B/goGFg4OEgYGDgIKDgYGAgICCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgoB/foCAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31+eHd2eXl5fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICCgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn99f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fYB6eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKChoODg4KChIGEg4GCgICCgYSBgoKBgoF+gYCAgoGCgYGCgoCAgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIOChISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn5/gYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoSGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKDhoSEg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fX18gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoSFhISDgoOEhICEhYOCgoKDg4GDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9gH1/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Dh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoGCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoOEhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+ChIODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4SEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+f39/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgH+Bg39+fnx+fX1/gYB/fnx8fn9+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhYSChIOGgIKFhYuJhISDhIWFg4eGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIF9gXWBeYN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WCgYSDgH9+fn59fYGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISGhIGDhIWDhIWDioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2ChHVzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfH9zgoN/g4N9gX1+fn1+goOBfH+AfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhoOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ6eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugIh5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9f359gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOGhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYF/f3x/fXyBfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYSFhoaFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhIWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYqIhYSGhoWFg4WFhIWGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJiYeGhIaFhoaFhoaEhoaHhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgYF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoWGhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFg4aHhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH17fHx9f358fH59gH99foB+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYSGhIWGhoeHhYeGiYiGhoeHiImIhYWIhYaHhoeGh4aHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoaDhoaFhoWFhoaFhIOFhYKFh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fnx/fn19fn18fXx/fH5+fH2BgH18fH18fHx+ent7fX6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoWGhYaHhYWGhoWEg4SDgoSHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fHx8fX18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYSEhISEhYaGhoaGhYeFhYeFhoWHhYSDhIODg4eBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19f318enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aIhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODgoKDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhYOFhYaGhoaGhYaGh4aHh4WDhoWDgYOCgIOFgoN+gYGBf4OBf35+f31/fHx9f317fX18fnp5enl7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoaIhoWHhIaHiYaGiIeHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYWEg4WFh4WHhoaFhoaGhYaGhIOFhYKBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXl6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaEhYWFhYWDg4GDgYCCgYWCf4B/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChoWGhYeGh4SGhoaGhYaDg4OFgICBgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH5+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhIeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIOGhYaGhYaGhIWGhoWFhoKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18f359fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WDhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhYSFg4WFgYGDg35+f4B/f4CDf3yAfX1/gn2AgX5+gX59fX19f3t/fHt6eXp6eXp6fHl6ent7e3x6e3t7e31+fX2AfX18fH2Af318hoOGhoaGhYOEgoWChYGBgH9/gIB+f4CCfH5/f36AgIGCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWGiIaFhIaHhYeFhYKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SEg4SDhYSAgIKCfn19f35+f4R+e398fICBfYGAfX2DfX5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaEhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDgoSDg4B/gIF+fXx+fnx+g358fnx8gYB+gn99f4J8f359fXx8fHt7enp6enl7enp6eXl6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKDgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIWEgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYKAhYOBf36Af358fH59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZMPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dXU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vKysrLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXU1dXV1dXV1dXV1NTU1NTU09LT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0NHQ0NDQ0NHR0dHR0dHNysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19jc3d3d3d3d3d3d3d3d3drW19fX19fX19bW1tbW1tPS09PT09PU1NTU1NTW1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzZaEhoaGhoaHh4eHh4eCsuLd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLmzeHNzc3Nzc3Nzc3Nzc3CUwLy9vb29vb29vb29vL/S0tLS0tLS09PT0tPT09zj4uLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5uUFNTU1NTVFRUVFRTTKDz6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OlmTIpKysrKysrKysrKyskZLCpqqqqqqqqqqqqqqiw0tLS0tLS0tLS0tLS0tHg7Ovr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7QEM+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zOcVRYV1dXWFhYWFhYV1Ch8enp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpps4LzAwMDAwMDAwMDAwKmiyq6urq6urq6urq6uqsdHS0tLS0tLS0tLS0tLR3+vq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87PkBAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNznheYWBgYGBhYWFhYGBapO7n5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaugRT0+Pj4+Pj4+Pj4+PjlxtK+vr6+vr6+vr6+vrrbS0tLT0tLS0tLS0tLS0t/p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPzs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3HxcXFxcXFxcXFxcXFxMvQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Pzs/PzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0crKysrKysrKycnJycnJzdPT0tLS0tLS0tLS09LS1dTU1dXV1dXV1tXW1tbY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz8/Pz8/Pz8/Pz8/Tz8/OzM3Mz9PS0s7Nz9LOzs7Ozs7Ozs7P0c7R1NTTzs7T08/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbY19fX19fX2NfW19fX19bV1tXW1tbW1tbV1tbW1tXV1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Ozs7RwafUrYODlc/SpKHQzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Ozs/P0Z2QuZy8uJm1s5+hqdLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q+QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/P07qvrKymjoCNxp+YlZzI0M7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PD06Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Pz9OfsZ6ooYms1rqYoZ2wstPPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz9HAnImdpKqsm6WymZavs6rV0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PEJAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Uo6KBnq2knJWokJqFnZOk1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw7Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDRxJ+Be5atp7Orn3+fqYWZpNXR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q1auvvMDPlMjZwZyAvK2mmK/W0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzs7OT0+PT07Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJh3+FoJePoJ+fmKiWmJu71dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NDc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HG09PVnJuspauin8Ogq6Sc0dPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg0tHS16iHz6mOjq3Ywo+Nu9XS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dLPxdTUv7/V0tXFxNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojw9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS09TS0tTV09PT1NTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk2OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk4NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87Ojg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzs4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VGQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj47PDk7Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODc4NDs/PD89OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Nzc3NjQ2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2loeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCDdnR8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NTU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q6ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqZG1nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp14cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW1tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampubm5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cnJucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyampubm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVGJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFNfTUhSSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipamnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSloqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaatpqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6qsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paGJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpamnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaChqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYWxodWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2s7qxqq60sbCxtLS2vLy+vLy9xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyak5aUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsPDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbGnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87My8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb2xocXhveWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtoZ3VaZnJ3c3hmZ11kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/JzsjBxMHHysrGysXMyM3GyMW/w8DLzc/JxsPDxMLEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpoXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIx8nHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraapu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBxsHLy8fGzMnNxcbGw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXRuc2JcYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBw8S/v77Ey8jKy8i8u8jHyc3Iw8jJycbFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7u721s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JvZmVnY2pkYWptbm5eWFxWVU5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwsbCvsbBubvDuri5vL7BxsHGurnJycPFxMDEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmZjWllZXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7u9v7m9urq0v7i1t7Ovu7y3wLe9wr/Bu7/BvLvFvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYd9cWNgYmJnamZmaWVpXVZVU1lPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1usG4vri/vL23tbewrri2ub+7wL+3wby7w7a6yLi2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2dYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8tru8wMS5t7e3tbq5urvAvcPAusTCvse4ubitt7W4urS3s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg9PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9v7vEt7a4tre/v8S8wsXFx8fKycbPwsG4rrW1vL64u7K+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG53Y2diXGNRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD89Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuqo7C5vb6zvL68xbiyuLm9x8nKw8fIxsbJyMzO0czKxbW6wMPIv7+1v8C/xsa/y8bDv8G8wMPMysfFxsG5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmFhTkhNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0vMO8urq+vMS/t72/vcfMxsfJxsa/xMTKyMzMzcvGwsPLzsK8ub26ucDDv8jGxMHBv8XAysnDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPj5BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8trq9wby7v7a/wb+8v7rAy8LHyMC/vLy/xcLHy8jBw8DAycrCwLu7sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnptc3hzZ3BdW15dWVFFRENNSUFFPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7u9usO7t723ucC7uri4tcXBw8O7ubO0usG9v8fAucC8vsXEvb65srCuuLe/w8fDxL29v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG5pXF9fWVNQQUVJR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnBwLe9ubi5trW/s7SyuLG7wcDDt7etsLW4uLjCurS7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9lXFpVSjw/P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+3ure2trK0wLaytLizusDBw7m3srKytLK3vrqztbK8ury2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZybF5iYFtdT0hBPz1IQ0ZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u7y4trq2scC6t7m4ubvBwcTDu7u2tLSwtrq2tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybmNcZlhcXVJOTUE/SkJASklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOxrba6rqy8sri5t7u/vbm+wLS/u7y6uL7CvMLKx77AuLm2srS2s7SvrLu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxCRk1GODY2NTo2Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vbWyuLS5urW5u7W1s7W7vMC7vsC0v7m5urG6w7zCysW/u7+/ubS0s7GxrrC5uba8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jo6OhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmJ6ko6GlqqytoqmqqaSpra6ltLGusa2rqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIQEhRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28t8DBvry8vLmura+ysrq6t7e1tby0r7Srtrq4wMTBu7a8vbiyrbOwr6yut7aztLWvqqSem5ycnqion6CoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKqrnqWim6OclZCMj4+Pk5CWlZaYn56empmml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR09MTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6Wsqqi1srGwrq+yp6awpK+utcG6tbeyt7aytKuytK6qq6+wsrOupZ6SmJSPmaCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6aqsaOlp56gnJWTkI+RkJiQlpWYl5+Ym5mbo5mXlJaanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01JSEdOUk5KTkc7REA9Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiYl5ahqKyutre6ubq3t7uuqKChqaGgrauqpqmkqaOkrqWsrLS8t6yysa+xrbWvr7O1qqetrKOcmZSOkpaXmZmcoKOim52lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+prrKrpaqqoJqYmJiVk5aak5WVmZaal5eYoJ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHh5YGJSVV9ISUlLU1RJUlBMOD5CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OTnJ6jqK6trKurr6qvqZ+XnqWenqWmpKCin6agoq6rrK21sramr7Srqaq0sbCwuK2noZydmpSYmpqRjpGVkYyPjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrrKxtKmxr6KZnJ2eoZmbm5qYmZuUlZuWmZyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVbU1pZTVFKTk5VTFJMQTc+Qjc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0/NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkpyYoZ2qoqegnqehpZ+ckpyim5+ho56doJ+joKKvr6yvsay2p62xraamsK6trLCooJ+ioJeRlJyhnJmYkpOfnaKkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7issbSjoJ2loKyhoaKgoJqYlpWfm5uYpKGgnqShoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFFVSEZVVkpCTUc9Skg4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjpOemaidrp6nnpyhnZ6ampKZnpyioqCgnaKfn56fqaynrKmqtKurraulpauoqqyqpaCemZKSlJiZl5aWjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oauiqaiyqaqop6iamZ2aqqefmaegn5+nqKWknp2qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JWTUpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiaqqCxorejsKagnp2dl5iWmZ6bnKSfn52knZqdnKWipKOiqq+sp6mjoKGsrq6qq6egnp6io56fnpqcnJSTlZSenpiUhp6aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLS7xsS8wru3s6myraqztK+zrqquo52rp7axrKKvpaCjr7GtsKSkr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhoF7dHJra3VycGhXW1FFVEhESU9IPkVBM0VIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goZ2cmJufoJugn5+XpZ2Vm5ufmp6cnqWmp52goKuxrqekpKOgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr3HxsK3w8nIwsDFvrm0ubq1u7ewtbKqurGuu7e+urqqt62rqri6tLyurrmjpqOep6Wio6mmmpufmJqdp6qnoKGhpJiUo5aUmpGcnZ+knqefnp+inZiZlJiUiIR9enJrZGhveGplWltGSkxERFNMREJENzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlZqWlJukpp2hqqeiq6y8vL/DwbOyuKehoauqop2eoaKenJugkp+fkJafmZKalp2bmaOhr7OpoZqdnZ+fmpeYl5KMj5aXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3MyMnRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXS08zT0NPTzMrCxcbGysfOv8nQy8bExsTBu8PBvr6+tb2zrb+/wsPGxMfErr+4sri8xMHBury8ta6np66ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURCQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5ibo6yen66mpbGqxcbMzs2/sMKppaitraqhnaOfnJ2aqZOZoZCOoJONlJKXmaSxsaukoJ2gm5mXlJOUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXX0tfNxsfJzMPFys/K09fR19LU1dPTyMzHzc3J0szO083Ex8nKwcXLxsjIxb7Cs7PIxMvKys7Fyr++v7zBx8TMzMjJwMO/rbCzqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYt/enJ1dWdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjNAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK20uKyuo56ko5+gpKyblqmWjJaNjI2XprCupZ2enaGloZ6blZSWlIp9d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HT1NTTz9LD0NPW19XW0svJztHLxs3SytLV1tnV19PW2M7Syc7RzM7QzNLPv8fGysPMzMvOz8XGx7bAyr/SzcvPxcnIv8PDyM7Mz9DPzMrIzri3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHdzdm9jYGVyYl1SXElKRkFFSEk+O0A4PTQ1ODU6NzY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopuppqKmq5qjsLGpqLXQ1Nfa0sfGy7S2wsWytqmipaahoqu1p5qxoJidjJCmrauclZihnZuhop+cnZuVindpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTPz9XU1NHSzNHO09fW09XQz9LT0cnT0cjQ2NfY0dfS19nV1szOz8nN0cvOz7/FwsfFzs3R0NHIy8zAysvF1M7LzsjEycbGyMzK09PR1c/SzNLBucWypai1rqeaqKylnbKosLOsrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMe3pxc3RtYWNpbV9WUF9KSkJGQ1FNPzw+NDQ6PTUyNzU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamgr66qqqyepq64qKu32NTV2dnRztDAvMzJt8Cvp6upo6SxtrOjtqqsw6epqaGYlpiam52hnpqdnpR+cmVjYl9fYWBfYWBfYGBfYGZtcHBua29yd3ebzMDS1dPY2NbZ0dLS18/TzsvTzdXU0srPzNPW0tHWzc/V1dHG0dTK0dTV1s7S0NjY2NfLyM3Dyc7Mycu/yL/Iyc3Oz8vQzc7Lzs/Hy8/Qys7KwsnGyczKy9HSzNPS0c/Qyr3IubCtu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHl2b3Bua2FkbnBhV1xaSUZGRExXRTtAPDMzPD04Njg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PT9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Onnri2tbWtpa2uvrSxwNnS19rc18/Ny8TT0MLCsqutrqyms7K5q7K8xqKhnJaUl5uen5+dlJaXlYlsXl5eYWRiYGBhYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHUy8zQ0dPKztHV0tXVysDKwcXMwsjJwszDxcjKys7KzczQzdPLxcjPzMjHysTHwMXJy83Q0cbQzs3NzM/Fx8C3ub3Dw73DubKzvrG8xMS1qpilopmWkZWWkouUjZqRlJSPj5SCiYV4cHFrbmhgYHFoWVhoVk1HTElQUEI7RD47Njc6ODk6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc2Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXFw8G/u7WyscfDucvV1tna29jNzdDJ1tbFxLiytqqkrqy5ubGyxKyWjY2YlpCTkpGWlpaQjHxlYmJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytHIy87NxtHSz87M1MrHy87Px8fP0svQz8a6xL7Gyb3Cx8nOxMLHwMfNx8PLysvPx8PDz8jGwcXIw77Ax8vLzM7CysvIx8vQxMXHu8fDyMjCz8C9vL+xwcrHur2qsbKnpZ2inZiQmpCkmZeZkZWYiY+Cd250ZGxgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJuls7Gsyc3KyMS+vbrNzcfQ1dbZ2tvY0MrQ0NLUysW6vr6wqLervrm4s6WRjo6WkIaDhISCfoWFf3RgW15eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsjGwsPAw8fKycjKx8HFzMbIy83JxMLLycLCy9DEy8i/ucG7xce9v8bPy8O/w7vJxsi7yMbEysC9wcvGxcS+xby8v8PEy8XFvMDJwsXH0sXAyL/KysbIxtDDw8bDr8TLx8TKt7+8urSprKWlmJ+YrKOhpZqjoJuUe3ZzdGZqW2FubVpbWFFETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMvP0czHwsPHzc/PzdbQ1tnY2dDN1M7P0MvEuMbBtrW8scC2uq2RjJOXh3uAhYaAdnh1cnBfWltdYGFiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsba6srKzsrHCvLy7ubjAwcHFvr25vb+5xMrFxsK9xsC4u8TJv8LJu7e7usXDvrzBzcLGvr61wb3DurzGu8K5s7zFw8LCtr+1tb6/usvDvLW6yLq/vcvEwcXCxsjGyMbQxsLMyLLHysPOzcHFw8C9s7ews6ioqLmxpa2wq62slHl2d2plaGBob2NWXllKRUpGSEtBRkJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfGwsTIztLLysrHzc7P0snRx9bV1tjOzNDIzcjKxb7KwbK1ure6tq+RjYqLhXmAhoaAfoR8dHVkXFxdXmBgYmNiYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLS3tLOys7q1vbG3sLWvsrvCvMHEvL+7tbO7vsC4x7m0u7bAwry4vcbBw7y1rrK2ur60xbe7tau4vL3AvbC6tq+2urLFvLavu7+0trTFvb7DxcDDxcbIy8bAxsa7yMu/z8rHw8bCw7fDvr22ub7Hv6y1urW3to54dHhnZ2Via25eVl5gRktISEpGQkNBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy87IxsnOzNDNzsnLycvKy8bRz9PRz8jKxsrGxMC9z72zuL25t7abjoeJiXt5foaGd3iCfXRoXl1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaGZqbm5yfKTHv7i4tbCrrKeeoqqnnquss62pq6mzrbawsqmupqyyvLq2w7m6urGrtbm7tMK6sL+xvb27trzIucO3raqosLLAtri8r7CnsbO0u7yrrbWmrrauurGwqrmvrbuuu7i7v7+9ucK/x8PFwbzGwcjLuMXHxb/HxMO6xMbCu8bJzMuzucK8urKIcnZ2a2lhYmxoWVhXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj49OUE9P0A/PD46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxs7SzMTGwcXQyM/DxMfBxsbFxczDyszCxMHHwLq8u8q3tLu9tbWrkYmQkHx5foqFenuEgXduXl1dXV1fYF9fZGJiY2NiYF9eW1taWl1aWllaXWVub2hmZ2lrbnKBrbmwta6mpaenmqCkoJqcpauuo6eiq6qsqrCjpp+qrbW2sb25r7evqK64tLS8uLO8r7i5tbK8wbLBrqWpoquxsrOovKqrqKusrbS0pqiuoaSvqbKlp6iupai3rLCyt7m6u7G8vb6+xL+1wcHHyLe/wMW3xMK/u7/Ew77EyMzKv77DwMCphnJ0cmppXWFvZFdWWFBIWlJTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7rEsLawm5mVnJiqqbCxs7W9r8bR0M3EyLu7zMPMwL3KuL/FwLzMusPGxbq8w725t73FuLW4u66ylYOJjYF7foB+eHR/fHN3Zl9dXFxeX2BeX2NjYWJgYF9eXVxaWFlbW1lYWlxfZmtmZWdlaGtvcoWqpaymoJyhpZSepJuXkaGjqqOin6Wlp6WsoJ2bpKassq+2t6ewrKeqtKu0ubC2tK22ubKwurmxt6Sfo5+msaerqLmqpKenqKeyraCnpp+bpKasnp+npJ+gsa2trLK0srSwtby2u8HBsrq+w8GyubrCs8C9v7W4u72+vMLHxMLDv7/EoIN3cGthZl9rb2BVWV9ITmhPVEhFSkY8PUA9Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzc4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbu+taCelZ6hprq2q7Ozu7PF0MnMw8e5uMnCzsG6y7m9yLu3x7u2w8azvcW7tq+4v7uwsrawooSHh4J9eXZ0b21rampxaV9gXVxcXV9gX2FjYmBgYGBdXFtcXFhZWFhYVlhbXV5kY2JlZ2dnam1viJ2poJeVmqGWm6KYlY2eoaKmm5+fo6Whp56bopufqrCtsbWiqaqpq6yktbitt6+ss7Wus7WusKqfnZ6jorKkpqm4raKmpp+orKuZn6CemZ2fpZqZo5ybna+pq6eqq6ytsLK4r7i5u7C2u7u6q7KyubK9tLaxsbW0v7W9wL3Dwbq7vZeDenJrX2VeZGRYVFheSVddS1BHSUpGQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmbpKbAsq+2rLS3xtDJycHHvLzFxdDAvMq6usK7tcW4tcDBs8HDu6yptLm3p7CzqYuGiIB5c25wbmtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWltZWFdXV1dYWFhbXmJkZGVmZmhpa3KNqJ2UlJSbmJuhlpaQnKGhqJ2bnaWmoaWcoKCamK2ura6yoKWiraunobWwsbGsqK+zp7qzprahop6bo6Gto6Gptaqio6adpaajlpiel5manZ+Zl52cnJusoaumo6Smrauzs6q0sLKqsrm0r6mvsrKyt7Ouqayusbewura5vb+3srGUhXl1ZV9lXltZVlNaVUtbUUxJRUhLSUI9P0FBQEA6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vb+znaWjmKWxwrW2va20uMPNycjBxrjCwcjQucPHwLa8vbbDura/wLW6vrqpprC6sKexr5t9hYWAeXBxdHFoZmRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hYVldhZGVjZGVkZGhqdqKclJSPlJaXn5eZlJifnqGclqGhqKOfnqmdm5qqpq+wq5ujo7eqoJ+uqLappqetsKS3sKS3oKKbmJiqpqGarLiwoqGknKGfoJOVoZSWlpuYl5aXnJSfqZ2po6Gdo6qqsK6otKuqpq2ysKWqrrKxr7Cur6anp7KusbSvvLS5t66jlIF5dWReYVZZV1NSVEtNXkxQS0dHTEtFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp6np6Oqu8C9wLmutLjCzcjHxMW+x7rKzbXExcWxv7+5wMG5v8C5uby3p6awu6WooKSJgX54cmpscnRwaWhlZGdiXFxaWVpcXFxdXl1cW1xeXFtcWVtcWlhWV1dWV1hXV1dVW2NjYmJjYmNkZmqBlpOVi5GUk5uZnJaWm6Ccn5Wgn6alpKann5yfpJ+qr6afoqO2qKChoqizoaWnpK+lsa2stZ6gnZWUqaGilKyxsZ6iop2emJuTi6GUkZOXmJKXl5iWnaabpqGimaOlpaukpbCnpaOrq62lqK6vrquoqqmzpaarr7Sxrry1sa+voJJ6dnJkYVxbXVhOTFFHUmFNV1BPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuyt6yepKett7u8wcW6sbm1xcrLwcTHx8m4yMa1xcLJr7q8wrvCwMG9u7e5taWmsbWdoYmYiIB3b2RiZ2loZmhqZ2ptYF1cW1paWVpcXVxbXF5fXFpZW1lZWltXVVhXVFRXVVNUUlVgYF9gYV9gYWNkaYGUk4mRjpSSk5yUlZajmaCWnKCloa2lpKSio6GbqqqlmZ6lsamgoJykqp2noZ6sramorq2ioaKUl6ObnI+rqbCbn6KenpeYk4qeko2Sk5WPmJiSm6GinKSgoZWgoaSmm6OrpaKkqqOrrqSusammpaamtKapqK2ztbS5uq+qrJ6LcnBvYFtXVlVRRlFPSFpcT1JKVEtTTEVHSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Nzs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njo4NTk4OTg5OzlAOXu1tK20u7KwrLKtnaenr7m5s8DIurXAr8bJzrvCy83Jt8u/tMDHzLC2vce7wcfDvb62ubSkqq+unJmHjoN8dWlqam1oamxua2ttZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV5eX19fYmRtjo+EkYaPkY+Zk5SSnJqinJugp6iqqKqmqKWjmKSupJSZpa+pn5uYm6CerpmbqrOfpaafo6OhlJOblpaSqKqtmpygoaCalJCMmY6LkIySjJaUkJ6hoKOcm6KVm6CioJiiqKOiqKugq6+krbelo6OirK2qqKuvs7iyvbWzq6+YhHNzaFtZWVJVUkZZTFBcWU1UTlBMUFJJTklCPD8/QT88NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9NTc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s66os7auqaivrZupqKy3tqy8yru2v6zMx8a5ws/QybXGvrq+xsu1sb3EvMLEw73Asriupaquqp2XhoF3eG9uaW5ubnFnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVVFNOUFFZWlpaXV1cXl9gZH6NgYt/i5CKko2XkZeZoqCbn6qppq2qp6+jp5mfrKCVlqSop52XkI+anq6Wl6eqmZ+dlKWhnpKQkpKTlaerpZqZmp2dlo2MjJSGiI2DkIuSlJCgnqCjl5WflZqgop6Tm6Wlp6iooLGwprC8p6CjrLSrrqewtLC5tcCxrbGrkH1xcmJWVFVOUklHVlFTUkxMWE1KTE5SR01LQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OtprG3qqaisKudqqepsrGktsa0ubqzy8a6vMPL0cyzubq+wMTHtrS3vbK6u8O9wbCzrbCtr6qboohraG5vcm9xa3BrZGZnZV5aWVpZWlpaW1paWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/dYmOh5CJmImUlJebmZ2om5+qpaSqnaeYoKWbko+eopqXloWEkpqjj5OinJWWlYeimpqTi46LkJmkp5yVlZebkJKHlI6MgYuNgJCKkpKRoZqfoZWUmJiVoqWZjJmkpqimoaC0sqeyt6Gdoresqq2ksrKmtby1q6uxo4h4cm1dTlBRTE9DTU5OUEtGTk5KSk5NUUlNSkFHS0hIQz44NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjc3Njo5OTk5ODQ5ODhBN3e2p6S2sKSnpKmloKmlpLOqorLDtbWys8fHuLvEys3Hta+8v7i8xLOzrrairLTDubqtqauzrq6elqd9XmBnc3F2cWpuaWZoaGpfWFlYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU5NS0xTV1dWWFhZWFtdYW9zdnGFiIKHgJGDjoqUkZOdoI+anKKho5iklqGblY2HmJqMc42CfY2XloWQmZCTjo57mY6cjIKKgIqYn6KekJOYloSOgpN+fnSJjnqQhpKQkJ2amZqQlZCdjqKjjomaoKGko5uitK+sr6yfmKW5pqWwobCunLC7qqmvqpmBdnJjVk1ST1BNQ1NOTFFNQ1BQSElOU01ISkpESkxGS0s9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNDg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd3t6KjtKilpaijpqWmpqazp6W0wbivtLDKxrm6ws/Hv7WvvcOvsceyraerlaSuv7ewr5+mrKyqlZSicldWX2hnaWhpbmNqaGdiXFhYWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5Yco+Cl4aNnJeLk5Cfl52VlJaUjpaJf5OJXztXb3uLlIl/i5GMj4WGc4qEloF5gnqFk52Ug5WOkY+Dhn2TeHJvhY1+iYCQjY+XmZiTio+JnIiel4eIlp6aoaCXp6+pramon5ettKKmrZisq5intKKpraOSfXJtX1tOU1JWTERUSlBNTEZPT0lFTFFNS1BKSU1QRklIPTc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5eLego66hpqaqoKepp6KpsKintMG6sbWwycO5tL/PwLqxsbjEq67JrqejnYaaormspqeVpaSjoJaOlmlRTVJWWlpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1vaXuCdFBCQH+VkZF9iZSMhIqNm42WlYqSiIaVhniIf2BKUW54ipKEfISMiYR/f25+f5R3dXZ4hI2ZcFGNiIqHfH54lHZod4WIfoqIlYqNkJKWi4SKiJSEmoyBhJKblp6clKSjqKmlo56bsKuhpKSQpqqWoaqcoqaoiHRsZV5bSFFRUk1JVU1TSUxMUElIRktOTE1US1FRT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj03Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMTUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXa2nKOnnZ+hrqGnqKWnqK+tqra8tri3s8K8t6i6ybm3qaq3uK22wKqim5KDj5mxn6GZjJ+WmJSRioxlTUxOTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+GgXuFjJKBkpmLj3uGj4B1f3hzbnVwdI2OgXl9iqqFeXpodnuOcHJteIGKjJJ4eoB7gHZzcpJ3Z3WEhISEepWJiIqMi4B/hIuMf5SDe4CPmJWclZGfnamen6CeoKmln52YjKekk6Cglp2epH9xZ2BcXEpWT1FHS1hST0pNTVJKSkpNUEhMUUxSVE1FSEE8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3OTU2NzUyNTI1NzIvMi4sLi8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8PDd2rpijoZicnrOpr6mlrKywsaq9tLK8uLa6tbKgt7uzq52fraustbOlnZaSmIaTo5aci4KXiY+JhoaDZkpJSklHRkhIUFRUVFdXU1RVVVVWV1dXWFhYWFhZWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUlNWXnWDfXlnd42XmI6PfWd5gXZ4f4mPfISYkoFyh498dntva36tfHOQin97hpKBfX90ZnZ8hWxvaHN8iYyHgGx5cX1wbXWPcWhxgH2OcEOKhIKDhX53d3qLhX2LenV+jpKPmIqSmpujlpmdm52eop2WjYqkm4+dl46WmI92bWxlYlpYWFRRSlNVVE9QTlFWS05LTk9KUU9JT09LRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXn56WoKavrK6rqKmxr7GsvLisu765s62om7GorZyQl56nrKekm52TiJZ+jpWRlYB8inqFgH9/gWVKR0hGQkBDRElMTE1RUlBRU1VUVFVWV1dXWFdZWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXlie3hvfHmIj3l8i4VvbYyReHN4amp/gnKWkYuBfZWASpKYbmh3foFsaWNseYWQkoZrc2x8bnJ7hmhtcH5zjYiDhXp9fnt2b3R0hYJ5gXdwfI6MipODlpeYmpCTlpeZl56XjIOJn5GKkoyGkJZ+bWhtbm5XVVdUUVFaT1NVVVRYVU1OSE1KTU5LQ0lOR0VAOjg5Ozk5Oj48OTw7Ojo9Pjo4Ojs5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp6kra+irKqota+urLS/q7zCv6ajmpWlmJ6OhYyWoqSbmpOXj3aRfoWLkY98eH50fXh1d3xmT0VHREA8Pj5BRkdHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpyQZlvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX5wbX96i4h1gYiGdGyakXRze2prnY5MeYSSiYSOZzF2hnNsfn2DdGZldH6EhIWAZmlsdWtwf3xncHB7bpKNjntzfXxxcG51bYJ+d3l0aXmJgoiJg5aTkpCLjZGUlY+XjoB5iJeIhomGf5CHdWlpbmdkV1FZV1hZW01QVVZaWU5JSUVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCs1Nzc1NDc4aU84OzVukoiZkZqWpKitnrKfprquq7Kww7K7w8ebl4+UmYuOhnqFkZqWj5KOkol0ioR3i4+Mf3Z3dnl3b3hzaVVGSUQ/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+zoHF8eG19bXGDgYWBeYSGhnlyoJV0eIBzdZSHNXGdqJ2OoaGEooR2cIZ8h3xzjK2NiIBoZmJpbnJtcIN1aW9YdW+OmpF2bH96fG1xbXB/enN1bWJ2hH+GgIWQkYqLipKLkYyLj4N1eIuPgH6CgH2PeXBvbmpeWlxdW1lYYF9TTltbWVhMSEpGSkc/Q0FCRz9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp56vlaW1qa2xrsGzu8HGl5CMlJCBiX1ugpGTioSLiJCIdoSFb5iKjH95e3tyfHR8a29eSlBHPkA3NDU4Ozs8PT5AQkVJTExMTU5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx2iIh8fYWDf4x+dqKZeX6GgISZhZucYYaqn52KgpCNenaJfomIjnOKl4+De1xkcXR6e3eKbGdpYXhvhY+Cem6Bd3OEenBzeXdrbmldd4d9h3yIh4+Ai5OXg42GjYZ9cYR/hHx1d3t9iHRucXJlZl5bWl1TW2ZeV1FVWV1WR0tLRUxHP0ZAREM/QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyMd4l/lIyRnZ2fppGgq6Cxqa/AsrvGupaPkZSIeoZ2a4CMkoN+i4WQjnmEgnWiho1/f4KAc4OBfWx5bFNYTEFFMzExMjY2Njg4Ojw/QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSS2mEiHuJeXtxfI+Me3yJhn6Xh3ahmYiHj5KUpY2sqUiHrbCvioCAk4qCi4KEkamHgJiYipxzbHyBhod9jmhnZ3h+boWGgYVxhIZHa4B3cXl2aG1rX3d9g4h/iIWMepWenIqLiZF/e3WLdnx3bW93fn5ycXBqW1xcW2NiWGdlXFVQUVhaUURMTEdPSURGQ0NBQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NzU2NzY4O0RGTE1NTEM3KyImJyspKysrLzAwK251MjI0MjBMgVw1PTxehHR8foqFh5GPlpiSl6GdrKGmuK+zvbSXjZKLmIt9dHB/ipN/fo2DlJV9hn+HpYiJgYOIhnmJi4B1hnlfY1dMQzYwLi8yMzEyMzY2ODo9Pz9CRUdISkxOUVRUVVRUVlVTUU9HQz84MCwjh1s+Pzk0Ll2WcHOjVUZJS01OUFdgWXBaXF9qjZOHlYCEgoWRk36FiZGBmpaCoKGYlZuapa2Tmbuxp7vHw6eKjKGljpOJgZB8coSen5GdfnaFhYuPh5BpaG+DgHSMhoSLcYaCd4d/e3aFfW52dWeBlY+GiYiIiYiiq6OWiY6YgHuCiXp6b2dreH14fHFpY11aWV1pXGFmX1pPTE5YU1FJUUtETkdDS0RDQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnZwZ3iDe4CMgIGQj4ubmqScoaymq6+wl5KRhKGUhHh3gI2UfX+ShpOWfoqBkpyOhIGCjIuCio6EgIuAbXBqXkNBNC0tLy8vLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1RUUlBPSERCPDg3LzlDPjw8NjMubJOXTVBISUtLS05WYGN/Z2dudZ2bj5qTk4uNjpqIk4+di6ChkqOppaOsk6i2oqjBw67Ir3i6lJp8jKGemISThYKPoZ+TmZKEioWPmJGWbHB1iYuBlYyNj3aPhHFshYGKlpKDhYhyiaGXh5OJj4+Xpbapm42VooOHk4R+f2tqa31+fn9xX1tiXllmalxsa19YS0hPU1FOTUxGSVFERE5GQkNFR0I+OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwg3B1h3F2kYZ+l5aalJ+fm6egqpaTmJ5oZqSafoWTknqBkomSkn2LhZmSkYOAgYuNiYaRh4SIhXh4f2hOUj4vLy4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFSU1FOUElFRD47PDpDRj8+PDg1Mjw/UjVISEhMTE1OUl5vinxzgn2gnZunpqKZoZeilZyfqJ6pq5+orKmqtZerv6u2yMm3ydHPvpugcGmrqZ+Ek5KFnKGampqnkZGIlaKamnd6fpSXkaGSlpeBlJ57dpWSq7OJjZegfZWenI6Tlpqko6e2sJ2SmqiIl5COgYhsc3N8fXpuZl5bX15hZ2RgZ2dcUkVLS1FPSUpNRkZNQ0hNRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTQ2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYzQUBpYl5QcXVgbn1hd459fJSOjoqfkpeelpyqmJ6qQkR9h4mImI15go2Ljo18ioaQkI+Cg4CJjImFk4WDhomBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49RkhAQUA4NjYyPDk7RkhHSUlNT1FZbYaQd5WLo6eqtb24pa6srKiptayxt7Kyrbuxs76cs8Ssu8nLuMS/t6WjsLKsraqji5aYhaamoKKYgqaZjaKqqKSHhZOjoKCqoKSpjpyxi5Wjp7e7nKGjsJOjnaOekaSiq7Cts7WilaaqiZqKk4qVent+g3xlXmZaY2BdYmNeZmdfW09ESkhUT0ZJTEZLR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo1NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljWGpwWHqFdoGUhYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMj4uKe4iDh5GPg4WBjIaFiJKGgoSJhoeHh3FuYUBFNjQ8My8xMTAtLCstMS8tND9EQU5WUVJUVVVXVU1cUUdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHHxKuzxbattMCzuL62v7TBtru7pLjGqbbJx7a+ubSoo7StsLGbmZKan4mnr6qklXefpJehq7GzmJapraiutbuyuqyvtaKxrLK1vLi0rrWgqKijqJupsK2zuri4qJy4qY2lj5KToId5gYFzWF9iVWRgYGJfX2ZgW1VKREVMVlFJSktFSkhFQUBAS0RCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxcWlFiZFd6dXGBlX2EhpN2hn6AjXu/u6O8grSUk46bj4SIj5OKiXqHgYyTjYeFgY6AgYqPhoCGiIWKh5F6eW5dV0BFTjw2OjQ2QUI3NjQvLzZDSENRXE9RVVdVXVdQX1VJS0pBQD9HS0ZGRDs+QDdENz9CSkpFR1dUUF6PpK6ksrTDtrjBzMq2u8S9s7TBt7jCtb+wuHSxtKa6xaSwxrmxs7K0qKS2tqqxoKKWm6KSpbGtpa2sp6SYoKyzuqKosrm1u77Mv8XFvb2zwre6t7+4uri6ra2xprGqrr6wvbzDw6yZu6iVro+YmauJfoB6aFVgX1ZoY2lkVltjWVZUSUhHTFFHRElKQUlEPj9CQktAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldUWVZad2pwf4+EgY6Fb3tyeIhiuaGZo4mVlJaTlJSOkJeSh4d7h4KOloqBhIGKe3yLiIZ8ioKBi4SVfXh6dWZPXGRHRUw6UWRgW15TRj87SFBEWmNRUVlZWmdaVGBhTVNPRUE/SUpIRUZBQEM9RTZCP0hHS01TWlRelK+4tbu5ycC7vcrNvL3BvLi2vLy3vrW6s8ZhdbKlsZqeq76qpairqqSisrWgq6ielZaemJ+upaenpZ+kk6KnsLOosrK8tsG908nJ08bCxczCysTAvr7AvLy4tLC5t7fDusa+xMmwnrqroqyPpam3iYB8b11fX11VX11oZVNZYVZSVklFRk5LQT5IRT1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFRSUE9RUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASk1QUkxRXWhtbHGPjYaQc2xycnSI1cC1mqCNlZmZkY6XkpaWjoaIfYeDjZaLf4OAg3l7i4SHe4t5gYqCl390fXprZXB2WV1cUGVlYmBlZF1bWFhcTWRtVVJtbl9vX1hnZVVZVUtEQktLSEZISEhIQkk5REBIS1RUVl1aXJO5wLm+uMbBu7nKy7u3ura5ubS4tbWutreZZHWpnq1wXqKtnJihopuknqullJ+fkJSOlpiXqJ6mn5+amYOknaykqrGtt7C8uNTQztbPyczSzM/OysfAv8LKvsG9wsDFxMbKwMnPtKS8sbWwnKy5vZp9dmlbXlpYW15YYmJRW2BTUUtDQkZHRTxARj9CSUJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LiYqKigtLjAsQE0rLzU0bYlJMEiJdD8+QkRAQ0RHS09EUlxaaWBvl5KRlG5sb3R1h7OsoaGfi5mcmY2NlZGbkoWKin+Ih4yQjIl8gYRze4qDhXuKdIGKh5V/dHt5bG11fGlzZWlsaGZqaWlgZmlpbVptdJetpL2Ih2dbb2heWllUSEtPUEpLUUxUUUhMQUpHS1BfX2JnamKXt8ewurS7vraxxce2sLmxsbuts7Goq7itjbaonpynmk6anoyPoJaRp5illYqTk4mRiY+Rkp2boZiblZaHnpmmmqywqK+ns7PT1NTW0cvP09TO08/MxsPK0L/KycvJ0sjNzsPQ0riwxL3Euqa3u8Sif2xhWltcV15WWGRZT1xXTlFDQklFQ0k8QUQ+Qkg/QEI4O0Q+QEk9NTY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OD05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2ZXc5CRmYNocm95eYOhqp6ml4ybm5iLjpWRmo59iYuFjoqKi5CIfISCcH+HgYZ7h3KDkouPfnF5dWxweH9ye254c2xpgHBtY2lucHlpd31+y7/D36duY3hvZFthYEtQUlVOWV9QXl1OUU5UUVVUXG5ud4Nylq64rLWosLarrb3Bsqu1pqW5qKyvoay0pI+xrpuYmIyRlJGEj5uBjaeRnImDi4SKiYSLg5SVl5eUm5CcmJmZnp6rrKSnoqysztLV0c3M0tPT0NTRzsjD1NHIztLT09fN0tHF0tbGwc/IyMOpv7jQnHdsY1tgW1VeUVxaT09UUE5IPkFHQkNGPUFCP0ZFPkA/Oj09PTxKQjQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WHhot3bHdwfX6AoJ6eoYyNmZOUi4yTj5aFeYWQkI6LioiRh3+Ce3J+gIKHeoV2hZORiYBvd3Nsc318d3xzgnhxa4Bycmlwcnp5c3u+y5p/jbKEdnKFd2lhal1DWlpbV2ZkWGVrVFhdXWBjXmN4e3+LgZmqpKSioKGppqqxuaumtKOirqKkrqKnsZ+JppuVk5GKko+IgpSJa5WijZmEgYZ+kYODk5esi5WOlZqOhpKRnZensKKgoaWkqMjNz8fCy9DT0dTSztPNxtbTzdTY1tbY1dfVytTazcrY1tHLrcTDzIlwbWBeXVZSV1JaT0pHSklKQDs6O0VCRD1DRD5IQz9DQjs8OTw6R0M0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV+aXN5coKKgJ2VnpSFi5aJj4qJjoiPgHiElJmLjYiIi4l+g3hzfH2Eh3eAe4eRl4GEb3hxbXV/dnh9dIZ8eWyHdnVufXaFdnl7nbWMPEGLxqV+jX1qZVdJQ2VjZmNoamRveVtfZmhrbmlugYSJkYyen6CekZeZoKOkprKkpbOgoqWfoamhorGch5+SkpORi46Lh4SPhH6cnIyNgoSFepR/g6qWo4ySi5iTi32XipqRqrOYm5ynnKa9w8W5tsXN0dDS0MvSy8nUz9HV2tfX2NTZ2M3Y287J2trS1r/MzbR1dGxiW1dRU1BYVUVGSklFRT06NzpAQkM6SEVARURCREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MiooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGJxcXSGjX2XkZ6MfoeSg4mGhYqCiH14hZeXiY+Dh4aHeoR5cXt7hYZ1eoaOjp16jXB9cHB6gHJ7gXKEh4Bujnp1d319gnV/fIeJsHRZqsK3jZKCcW5jPV5ocnBxcG54d4JlaW9ydnhye4yHj5OSm5agloiMk5yfm5+roKGsnKKamqCmn5+smYyajZGTjoV9iIiDhYuOoJmTiIOHfmyZeYSZh4iTjI6VjIZ7m4iTj66rlJWXn5imrrW8qa29xsvIycvLz8nE0srU19jX2NfU29fT2dvWz9va0tbJ1cyTdXhmZVhXTlFSXEdCRUlJPkE+PTg6PkA8Pkg9QEJBQUVBPj86ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmx2gIhxkZCbgHmAjn6DgYKFf4R8fYSYjoeLfoaHgXeDeW57e4eCdHqSno6hdo92g3R1gX50gIRvgZCCb5KFdXyBhXp2h3yJuMalw8q4gpacj3hwZk5lY4J7gXeGopCLeXp3e4SAfIR1bZSWlZaQmJGDiY+XmpeXpp2YoJafk5KXo56aq5aRkYuOk4OMhYmJgYaQkZ6cmYmFi4GGl3uIiZ+XkImOiouCfKGJkIu8oZiTl5qcqKalrZ6ntb7Av7jGyc3Oxc3K0dbV1NnV19vU19na29fb2tnYztvGg3Z2ZGZhXVJVVVRNS0RNRDs9PDw5Ojw/OT1BNz4/QD0/Pj05ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs5OjdIUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWZhXVxpdHp5bImNknd2eop8foB/gH6Fe36CkYqFhnqFiHx2fnVtfX2HfnR/kp6Rn4OSfId+eI9+eYuKb4ObgXSZhn2CioV8fpF7kKmPkMOgvYybpJx+ioR9iXOMi39zppqcmJSFe4+RiYRpR3GhpJ6MjJGShYiLkJKVj52bk5SRl42MlZ+dlKGVko6OkYx/kI+Oi4SJk5aan5+JjJSSnZGDjH+mmYiFjoOGhIClhoqLuJidkZWWoaagnZ2do662urSrwMbK0MjHzc/T0tLY0tXXwNfY2dvY2trZ2dfbtnZ1dGdmYlRdWVJPT0hDTEM9PT45OTs6OTk8PTZAPj89PTk6OjszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdPPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PERSU1JYX1ZYZm1tbWmBjopxc3iKe3uAfH98iHt9fIuHg351hIZ6c3pzbYF+hX53hpuhm56UkoCMiH+Yh4Cckm6IqYV7oIx8kY6DiYScfpuRio2jop+RpK+gi5GLhouBk4ZXcq2Ln6ubkIOZnJCPjluDopGCjZ+TlIyGiIySkoyUlZWQjI+KiJabnY+Vl5KMk5SGgIuJk46Kip2XmaOihpOdlqCLiomOnZCDiI+Ag4eFpYWLkLOYnJKUl6GgnpmSm52nsbispL3Cx83Ixs/M0MzO18/R1K7W1dja2Nra19bZ2p1seXFjY1paVlFVV0NASUQ/Pz46NDk6Ozc6OzozPDw/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieGxifpGDb213i3h6f3uBfYd8fHeGhYBzcIWCe3V3dnSFg4V9f5Kmop+mopeKnZCUl4uKqJdyirKNhKiShJmUhZqMo5agmJOJm56ik6mwoJGVkY6OiJaMb423hJrEyLKcoqacnJiWkbGQZKTNx5WOhoeJkJKNjZOVioWKioaWmZuPkJSTh5aYhICPi5mIjpCql5ekooiZnpaaiY+HmJiKhY+NgX+Hj6WIjZOompeUlpihmJ+Zk5yaorK0paO8wb7HxsXJyMnCytPMzdSo0tHW1tbY2tTT2s5/b3tkYFtcW01JU1lCQUdEO0I+ODM3PDw6OD42NDo6PDo3Mj86OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4JHdoGOfXxtfoh4en57goKDf3d2gYN8bW6Lf3t9eHh8hYeKfouis6ejq7Oil6efpaSWla6ig5G4lZKzmoyioYylm7CjpJ2YkaeWqJmsr6SYlZaVkIuYmpehwI6jybirnKOmrZiSm52ynYWGqKKcmIWJiY6VjIuTj4iBhoeJk5iVjIuUk4eVmYaEkZCcdZGYs5aXpaGHnZqTj4uQipebiYuWjoZ9jJieiZCQnJuak5iXn5OgnZSem6CxrqKkt760xcfEvcPDwMbNysnTps7M09LR1tjT0Ni6b3ZyWV5TXlROSElNRUJDRDU+Ojc3Oj88PDc9NDI2Njk3NzQ+NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdNWlxZSmZgO0iEi3p6boWGenyEeIGGgX5weHx+fW9yjXp+gnx4houJhoSSprutqLK9sKWts7Ooo6GwrIqatZ2juKWVraWXqa24p6Sjn5qpmKqkrrCqmpmclJWRl6CYmru7rsqhare4q7CUmZ+jrJOXvqNeqrKDioqNlIeQfI6OfYOGjo+UlYiIk5aMkJaNi42WmJOdmbSXlqudipyUko6RkoyZm4qSnpCLiZafoY2UjZianZKcmJ6UoaCUnJ2lr6ihpbO4rMLIxLa6vbzFx8fC0aDGyc3NxdfW0cvTn213ZVlXUFxQTkVDPjxDQUI4QDg4NT9HPT02PDM1MzQ1NDU0QjQ5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRIYmBicEpAi4p+gHOGh32CiHWDioJ/bn18fX9wd4d3joKHfI2PjIaMmarCwK+9xruztMC9tK2rs7aMqLOtrb2rm7ulqK26uKunpqKipKOpr7Kxq52cpJmbmJefoqamkqS6r6nAvK2usrmlpKh+iIacrb2wgouMi5CDjoORj3qBiJCNjZyJiI+XjYuVlpSRmpedqJqxmpGsnI6aj5KOlZCQlpiPkqGRiZSbpKyUlo+UnJ2ToZ2bmJ+hlJqep6akoqSws6fBxsOvsLq3xcTDv82mx8THxL3W0M3EyoVxcF9ZV1xYTEpBS0FGRz9BQEM7OjQ+QT09NT02PjM0MzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVPNzlHRD9DRlxlRmBpZ1pdXJOMjIl7h4yHg4x1h5GKgW9+e4J/cX6Be5V6kpSUmJCTlqezxsm/wszCw7nHvbuvq7m7mLO3urLArqXBpKuwvL2qrqujo56nq660sKqcoKqcoZyWn7C1qIyjurq2wbysqZ2zpaSolIWOqcTDpIKLj4eIhIaVlI15g42Rj5GhjIyUko6Jl5+Yk5mVmKagr52Mq5yNlo+SkZWVjpCVko+hlIaXn6CynpSZk6CgmKSfmqCboJSYnqWkpqakr66mwMTDrqi3tsnDvrbPssS/xLyz0crIwrRydmpaVVlnUExIQkxLTEpBQT5ERDw1QUU7OzM9OEIzMzIyNjNBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJlWk1lXGZUYmuZjZaKjIiTkIaJeYeUkIFygHuNf3iHgoKQeo2hlqiampm6vcfIycHSycrCzb3Cs628vqi7wL27w7eswamss7y+qrCqpKWkrK6zrba1oJ+vn6WimKOzvambqL3BpLa4sKyUsqysrJeHmqmmpZGCjJOlloqBdYqSeYWOkpCeoJOPk4yPjZSjmZaclZWjnqqfkaWajI+Pj5WWiHyPlpOSo5qVn6GctaWQnpalo6Klnp2mmJ6Vl5uko6mnorKsqLzAw6+ls7fMv7mvxLO7vsG4rMLDwsCXandfVlVZWEpKTElGRERIQ0NBREw6NERJOjs0PDhFLjEyMzUyQjI1U0hOPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+aUhfWGJaY2NWno+cjpeOnpKJin+KoJOEeIV/ln9/kIiKkYCWoZmup6SYwr3Hw8fF083Ozcu8wrewury0vcu8w8G2t7yts7+6va6vqKCpqLatrqmyt5ueraOooZ6rt7iqpbC/xbK+urSoq7a0rq6XlqWsqJ+RjZKyxaeWjnySlXyHkpmPqpmYk5OPkpWTpJ2TnZmUoaOinJifmIuMj4+eiFqQlpeSl6SZZZijn7KllaGWq6upp5ufppeYlpiVoaSopZ+2q6q6u8O0pbS1y8C4qrarsru4rqi4ur24gGhrWFVTU01FSVJNSz9BSEVFSEhIOTVFTTs+OD1ASi4zMjAyNUM1NU9WTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs+QEJGQnBFaklSZWFMRqWUnJeil6mWjJGDiKaTiIKHgpyEg5WQkJSPmqKfr76voce8xMTHxs7OztLKvru2sbq7vL7PtcO9uLm3s7G1s7izq6ecq6y5qqmnr6+Yo6+lp6SltcCxrKy0v8O6wLq0qLq2ubSvlqWtrq6ki5OUoY10wpp9l5mEjpeZjLGVm5qVkpKZmaWjlaCbl5qpnZuhoJmKjZCWnGBKlpyalZqlllWXsKCvnJ+klK6uq6WaoKWUk5iYjZygp6KatKmqs7u7u6qxssfAuaasq62ysqOhsrK0pG1rY1pXTU9KRE9PUFI7R0tJR0lDQz46S1U/QTo9RU0wNzUzNDpCNDRNV088SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiqlpmgoqiwmZGXh4uolo6Ik4WgiISdl4+doZujpbXJtanGusLDyMrJyMzNxr+7s665ucHBzLXHusG5tbqwr6+ztaekm6q0taqppq2smqSupaSorLu/qKy2t7/Bv765tLPEsrm+raOvtay5poibl6abdr+fhJmdjpOamoyul6GcnJeUm6ChqJ6on5maqpqhp56YkI2RnYNudpKimpWdop2RrrKjqpSoqpeqraOjn6SokZGZnIeUnaKelrGnqau5tr2ysq6+ubago6eopaacm62pqYtgY19eT0pLRkdNSlZMPU1FTktMQkNEPFFWPUFBQkRPMTg9Nzc/Qjc1VVhPP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li1SYE1VSH5lXkhFq5WboZ+7r5mVn4yTq5yRkpOJq42GoZ6Mo62Uo6S2xr60wLrCwsfJxcLOyMK+ubKvubXBwsq1xbLBvLW6qqitrbCjo5iqtLumqaarqp2pr6ejqqu9vKitvbW4vse8t7a4wbK+wbSqtbervqWQo5iSoqC9n4maoJmXnp6Pt5+pnKWim5yhmqiks6CbnaacqKqemJWPlJuLl4mMpKKUnaKdoLWvpaSTr6uZqqqdnaOjqJCUlJ+Cj56enJWppKGhs7S6tK2otbKznpyjpZqXlZiqoZ51XVpeXElHRUZNUUlNRUdHQlNMSkJFR0FWU0NIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkVASkpOTzlDQDU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoFkVDQ5LTE5ZlxGQ0OdcGJHRaeXpJ+ew62cl6WYmqqclpubj6qWlaemla2smKKrtsTCvL63wcLAx8S/zca7vbmysLmzv8PItb+wvLa5tqakq6ytoaGaqqvFoqSpq6aerK+roqmpvrinrb+yuLfHtrW5uMCzwMK4tbO0r76jl6OXlJyUrp+QoqOlo6OfkL2kqZ6orJ2doZulnr2hmaOfoqmsoZ2XjZWek56Hj4SNk5+koJ61rKWclbGnma6mnZmpnZ+NmJSeg46gmpuSpaSamKuxtbGqpaqurJuYoKCSj5CVqJ6UZV9XYFxOSEdKTkxIRURJQT5RSUE8R0lIXFJPSz1IT1U0QkY5PkhHNUNhW0tCTlJVV1ZRWFRSVUlAOFJRUE06R0E0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNDZAOTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW1SRjxLeGVhVkuimqOcnsWsoZ6sn56uoJOjn5akoKaprJi2saKqs7bFxL2/tb/Cu8jCv8rHtbi1tLGztLfBxba+sbi1ubSfp6yqrJ2enqWkwaWfqq6gpamtr6KmqL21prG9ube2xLO0uLq/tMTBubmus7W1o52llZKUoa6gmaKeqKiro5rCrKmerK6bm56ZpqC9oZ2kmKusrKaimo2an5OeiY5Xf5afpaGguKqmk5i1o56xoJ+arpadjZiTnIGOn5eVjqKklpCmrbKqqaKipaWVlZ2Yi4+RkqSeiV9iWGJfS0hKSk5GRUFHSz89SkI5OUpKTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dyR0U2PXVlXEtNnp+hmZ7EqKWitKKds6iTq6Wgo5+sqaydu7CorLaxx8XBwrLCw73GxL3EybyvsLatsLSvv8S0ubGwubSsmaixqaqanaWhp8Ktm6yxnKqjrrGppKi9tqe3u76vt8SttLPDwLTHtLu4rLS2raqippaVlaSsop+gm6ersK+vu7KmoKmpmZmYk6KjuKCho5KvsKylp5+SoZ6VnpCQjZWemqKep7OmpoyYs5uirZqdm6yQnZOVkpl/kaGWj42foZSLpquvpKainKCekZGak4WLkY2bnX9fZFpmZEpITEpTQkNASUg7O0Y/OTlPTVVeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwyNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ+joJygw6mkqrOipLWqlrOtp6GksqyuqbuyrbG1tMbAxMO1wMS+ycS1v8jCtKu1qLC5rL/Es7eurLa5pZiqsquqmJ+ml627tJuosJutoK60sqerubOourS5s7nAqreyxL61x6i/r662tamnrKGYl5KmpaKimJilr7iusrW2oJ+opJqVlZSkoLeipaWWr7Kyp6qmop6ampuWmKifoJihnq6yoqaNl66YpKuWmZ6jkJqMkpaYhZWelIyPnJ2Ui6ipqqGnoZielYuOmY+BhZSIk553YmdcamlNT05OVD5DQU5DOzpJPzc3Uk9dX1JWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDEtLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJb2hVQ1dGjHlmQzuko52ipr+np6+xoam2q566sayjq7S2sbC5t7C3uLjEvcPHvb3EwsbAuMDFwLqptqSsu63Bwre3qayxuqKUrbGtspakp5GquaqfprGdq6CwtLOqqba2rb2ttLO5uK25scO7v7+mxKuxt6+pq6unn5iZq6GioZGYorGvs6ywuZqcqaCal5OYp6C2qaajorGxtKyzqKyfm6Cgm56lnKKXnaOzsJqfkJOlmp+omZSinZSXiJOWkpWWnJOIkJqZlI6pqKafo5yXm5KFjpmLfYuVhI2ZaWdrYGxtV1BRW1VBQkVUQDw7SUE3OlhQZF5QV1dFWV9eTUxSTl5LSj5aY15OSFBPXFVZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNjEtLS4sMT0qJys9XHA9PjEuMGRaZEAxNjQ3Z1lgRig/OGx9Z1tWO4l7Y0M9qJ+doqq9oqqwrKSyuKqmtrWsoK21va+zuLu6vre2wMK/yMS5xcLAv7jEvcG3r7Wnq7eyvL6+tKiusbaelquuqK6XpqiOp7ufpayzn6yisbCzrKq2tLW+rrCxtaywtLPBu8a3rL2wsbisraqjsqaepaqfpJeRmqCzqrOrqrOanaecmpWOoaaktK6ooa2urrGotK2yqqScn6iknpWimZuotamWmZKSnZmdn52Qq52Wl4SUloqdmJyTio2Wl5qXpqWjn52WlZeSf4+UhXuNkoKLlWRrcWdvcV5GWWZWREJNWERaOUhCNj5cUWhcT1ldR1teXU9NUlhkSkpDXGJfUEtNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2BVMTUwPWBWXjgpQzNZVVxnSzaMemZMQKSaoaWtt6Wtqqavrreqr7W7p6axt8W3sba9wcK1tbrEvszGucPAub65w7jAubK0q6m6trq5vrSqrbC1mJinrKqsm6urj6u+nqyusqOroLGts66utrK5uKqur7Gota+1vL3Ks6q3tbG0r66nobSgm6itoKaWlpqasqKtoKavl6GkmpqTjqOlqLOpoaazrKu2pa+yta+kmZ2sp5qYn5qZq7ejl5ORjpecoZeWlKqdmpF/kpeMnZyZlpCKlJOemaWioqCYlpKTlXqLj4V7jIqCipFqbXdtdXthRWBrWUlIWlo9e0pGRDZBYlRpW01cYUtcXVpSUlJiYExLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVF9UXy81KENfUVwuK0IvSkdQW0czY1lUS0SZl6GxqbKqraakr662qbe1uqSstLfJu7S7ur+/tLO3w8DMyLzDvLa9v7+3v7yxva2nurm3tsK2q6yxt5SWp66rqKOwqpSvu6StsbOnqKOytLGysbWxuLSpr6yyp7evt7TExreptrassK2pqKO2oKCnsaGklJyZlbGep5ygqo6po56blpimpqW4p6OytayosqeusbaspZmgrKibnJ6clKm4nJSOjoqYm6KXj5iloJyTgpCUj5ybl5aViJaQmJqnnKSgkpaRkJV2hI+He4SBg4uKbG92dHt+XEtlbVxKTmRcP2J7R0k4R2dXZVxMXmNNWFlXVVdUaV1PT0hgXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOR2YyNydHYkxWJS1CLj1FTFE8M3JrSUNDkZqlr6Wur6uopbGztKu3srihq7W5ybmtwbvCuLOxtcLCzsXAwb20vb+/ur68ssSnqbmwtra/vK6rs7GcoKexraamr6WdsrWtq7GyrKmotbustbO1rbStqqyorKm5rrKxyMC5pbqwqayspaiusaalo6+kqZydnJuvmqOjo6ORrZ+koKCiq6anuaSstbalq6yprbC2rqKeo6mqm6Cbm5KktJmOiY2HkKGglIyUnJ+SkIONkpKcmpeVk4eXk5WZp5ufnoySkY2Qdn2NhXx7fIaJiHBycX18fVxTZG5eTllnXEZElltHO05tWGJbTGBiTlZXVldUWGddUVJMY1lbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvKzEoKSssLSomNSovJjApMzg6MSYqM0JjOjYqSGVISis6SD4zQkhTLD6QaztHSI+cqquiqrGlqaWztbK1trKyoauuvcy6rcC6x7G0rbTCw9LFxr7Asr7Awru+t7vEp6y3rLK3vMCvq7GsoKOnraqopLCjqrKqsKywr7Cuq7O8p7exsqmzqqulpaOtuq2qssO6tq27qamnrKmosqaqpKOuqqiinpyjrZWlnpiemaydoqepoq2mpK2ruLKyoaqioKyvsayeoKenqZmjmZmPoKaXhoSOioueoI6KjJWajo2EhY+Un5yUl5SGlpSTl6ScnJyKkpCNiX9+h4V8dn6FhIVycXCIdWtfWWBuYlFzcVxLO4R8Rj9XdFhhWk5kW05WVlVXUVxhXlNPTmdYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMjU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE7XEowLkpnREY4O0IwNUVLWDFAlVk9TEWVmK2ooquznKqqsLetuLavq6arq73JvLC9tsKvsayzxMPOz8O+v7TAwsO6v7PIw6uut62yuL6+sq2tq6SnqrCop6ixpbSuq7GvrbKxtKy0vKS4s62sr6irn6OesLerqq27t6W3tqSpp6urqq6hqaemsbKkp6WhoayXqqGVm6CmnqWiq6Sto5+nsbiurqOmo5uqq66pnaKlpKSYn5uWj5ickoGCj4iFnJ+Lio6LmI2OiYKLl6KbkZCai5OSkZOjmZuaio6Li32GgYGDenN/goB8cnWLpId4a15gbmZXZYdjTj9nk0xFYnlXYllSZVRNVlVWVE9cXWFVS05oVlZXSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjM5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlZaLjBKZ0FBPDxCKzpKT140RIY9R0ZEl5OxpqOssZirqq22rLayrKasqqm8wMC3uLK7taayr8TJy9G/wLu5v77BucG5wMStsbWxs7rAvrKwrqyqq6i2qqaur6q5sKiysq+zrbeqt7entLerrKWpqpyknrSzqaiktLWgt66gqqiqqKunoKusqbm1qaqpqaKqoK2ck6qhnaCloqajqp+dp7SvqKaqo6OYpaenqpyipKOgmZigkY6PmI1+h4yHg52dhoOKio6NjouChZSimo2MmZCSkY+Tn5eZloyKg390hoF/f3h0gn55dn6Ah52Pb3JnZ3B3XGFziGtPXplWSG14VWRWUWNPTVZUVVBPWFtiVUhPaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjEmLzJRYjAyP2Y9Tlg+Qyw+TFRfL0ppNU9EPJaOsaKmq6+arKWtsLS1sKymsKqour67wLCuua6htrDIx8jRwL69u7vBvbrCwL6/rrKysbW8u8KxsbOrs6mktailrbOzubGjrriysLK7q7qwqq62q6qfqqyfo6C2ramhn7CzorWqnqinqaOqoaKsrai9r6yuraKoqKCsmZCwoZiioKennqibmaqxqqOgrqKhlKOjo6iYmqilmJeYno+Kh5WIfY2GhISjloSBgYuGjYuQg4OTn5aIkZyQk5CNkZyUl4+KhoZ3dIF/fHV4eX95c3N5Z3+GpHZpX2VrgHRniIx9U1hvXkp4c1NkVFFeTU1SWmZOTFZZZFhHUmhSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNSkoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGc6NDhfPWFkP0YxQ1BbWypITTlVQDSRkLOhpaespKekrae1s7KrpbGnqri+wLyvp7mqpq+xycfI0cO8v764vb68yLrBuLCvtLG6u7jAsrK6rLisorSnp6yytrmzqKi9tq62vrC9p66staytnKmvo6ClrauonJ6rs6W0qJuqp6mjqZ6jqaipvay0sK6dqqShrpybs6OWpJylpZ+lnJupq6afnKuinJOcoqWemJeoqZKYmpSQioKPhX6Pg4CInY+Ffn2Lh5CNj4N/k5qThZOijJSRi5GbkpWHiX5/cnt6fnxoeHx5dG9we2eEeISJZGFnYXKEem1neF1eVD9Xe21UYlBRWEtMTnJ1XUhaW2dZRVVlUEQ+Sk9EQ0E5SEdLUz9qYkpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEnLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mY0JKN0dTYFUqPTlEVz0qkJWymqCgqqaloauluLOzpqmxpqy4wb21r6K4raiosMLJyczBtr3AtLe/usi1wrWzsrWyvLe5vbWtubW/raCzp6ursLW4tayfvr2qs8G0vKGvs7WqrJ+tsKOcpqmqpJ6bpbGnsKCfq6mnoamcpKihrbyorrGuoaujpK+fn62ml5+boaOcn5yapKujnJulpZaXlaCjl5uXpayMnpGRkYuCioCAjoB7mZSNiHt9i4aPjYuJhJKYkIaUo4mSkoeQmpCTgYl9eWt+dnl4Y3x6cG9vcXZngHNqhGhlZ19sc41sYWlvYG89WnlrVV5PUFFKSU1UWldNXV5sV0RXX09eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTY4OzIoMDkvLDQvLj0tKks+KR00OSYnLjM0LjArLzQmLDokNDFBaFkxM1M+ZV9ETDZLVmRPKjsxTlc9I5SZrZqhmKilo5+opLiwr6SvsKmruMG5s62fua+rqLS6yMvIv7bCvq+0vbfEtsOyrrmys7+0ur23qLm4vaqjtKipqrGuurGqnLy9pbDBtbair7a1p6ansLOfnqSmqKKlmZ+sqKmeoKuupqCmmKOooLG5n6Oxr6Gsoa2knKemqZqam5+klZ2dm56qp5ecoaqTmZSZn5OZlqGpkZqJjpCGfId+go19fKCMjYh4gouEiYuLhYeTmo+JlZ6IkZWCjJeNkX2FfHNwfXF0dGB6eGhtb3BuaH1xY3ttaWViXWWFfl9ac2pxSkl/aVhaTlBMSkhQUlFJT1xfblNEWFpSaE9IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy46OzgzJjI8MCw4NUIqKS1CKiw0O05OQDs3My0uKy03Kio8JTUzPGZkMjRNP2VdRk89UVpnSCo+L1dVNSiXnqeanZetoaGhpKK4qrGltLSpqLnEtbOtn7etrq2wtMbIwLa+wbmwtLy2vru+r6u9sLO+sLzDuai7urenp7WoqKuxrbOxqJy/uKatvLeyn7G3sKilp6+xm6GkoKWloJebsKehn6Oor6GfoZSkpKK3sKGmsaufrKOvmJyqpKmfl5qepZObnZuep6uanJ6ml5aYlp6Ok5eiqKKQiYuPhnqEfoSKeo6WiY2GeIGHg4eLjYWNk5iNj5aZio+XfoaYjI96gXpwcndvb3RfeXdka2traGeCbWVya2tkaFhhc39eWmx1aVlFfV1bWE9PS0hIUlVHMjpeXmxQRFdVWWVNSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0SEJnW0hUQ1RdaEUuOzFeUSwylqSjmJadqp6moaOhuKmuobu4pay9xLOwrqK1r62tr7TExL2zvrq3sLO5uLq4uq6tv7O0uK+/wbervbq0paKzq6iqs6yusqOdw7emqbe3q5+zu6qnpqivq5mip5ykp5SYobOmmp6lqamcoaCUpZ+kuamkp62mnqWhqJOfqaGhoZmbnaGSm52XoaOsnJyaopaTlZabjpOTo6ekkIiKjoZ5hHyFhn2cjYmKhniAg4eIh5GFlZOSjJGVlI6OlHuCl4+Ld398bHVybWxzYnl0aGZpZ2VthGdnaGRmaGleZWJpZlllemJgUHNUW1tTS0lHSU9TQCEraV5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LTExOTUsJi41LTgwNTc2YHRCM0NEaFtLV0dVYGhCMzc3YUwnMp+kpZOPpaecnp6epLWtp6q6t6esw8C3r6yita6nrq+3wcC9scG3sK6ytrW5uLWsqry0r7KxvcC3rry8saSftqymprWqq6+hoMWsqqextaystLqeqKmrsaWYnaqeqKWSmqauo5mepKqhm6GcmKCdp7amr6quoaGenaGVoKafoqCZnJqck5qelaafrqOYl5+WlY6VmIyPmJqooJCHioqIeIV3goKCnIeKgoh7f4SIhoSQhJaVj4+QkZCRjJN7g5WOhnN/fWd5cGtrbGd1c2thZ2Ric39hZGVmZWlpYmZvWl5YXWxjYU1nV1tgVklHSEtNUlg/OWBsaUdCVVNcW0lIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyssL0EqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQGJGJTWdpKGSjK6gmpmgl6W0sqOyvrehsca7urCwo7asq66pub69u63Asq+vrraus7mzp6u5sa+us7a7tq+5vqymnrWroKGxpauwoKbFobOmsLOwt621nqyurK6imZ2nqqaflZynpqCZpaOpnJqfnJWdnq2wprmnrqKhmpqemZ+jmqWdl5+YnJWaoZOpl62om5SenZSNlZqOlZSYp6eNjYqJjnuBdIKCi5iFhnyJiISEioyIkoWTnJKRkJCRl4+Qf4GNjYNwgn9neW5oa2pncXJrW2hjYXJ/YGRna25rZmpmZGxcbW12cWFTYmhjZVpJR0xNT1lRUFZhZYFUQFZSWlRGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjQ8O0s2Ly4rLC0yNDo1IzMqKTYuNTU0NjVafF0xOktqW01bS1hkY0BBMUhiQic0lKOcj4+xnZuUoZups7CfucC2obTCu725saa2sKmupbi6uLisu7Ctq6u3qrW5raWytbGvqbG2trGztrunqaC2qZ2fqqOqrp2rxJmvprCxt7WsrJ6xra+qopudpKypnJWcp6SemaqjpZWaoJ2SnKOrqqm6nqekoJeamp6hj2ujlpmdcYOXnKWBdpKsqJ6Vl6KSipiZgJeKn494hZONg21pfneEcmyGioZ9hIqGb11kYGeEl4Zri5CUknV4i4R/g5CAZ4iAaHZpZlhdaXRuTlBqY2ZxgmZeZGZva2ldXF6JkIWIaE9LQzhFVGddSkhQUFVWTEhTYXB0ZUZbUVVQRkdGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTVPa1tOXEtbZmI+RzFOYTwrL46kmoiVsZudk6Ccq66ro73Fr6m3wri+vK2ntrGmq6S4tLOzsLmuqqestKWxtaKnuLa1qKettrOutK60oqmftKueo6Wdp6ibsL+VqKextLmtrqSoraqrpqGfnKGoqJyXoaamnJynqJ2TnqCZkZ+oqqO0r6Oio5yWmJmXo4ihj5KaiKGIlZ+if6WAqK2flJSelImEcniMjoOIoHWIjWmXiWZ+c3mgb4eHg36MfH+hoJ+Zf3uHnnSIjnabimyHgoNuaWVke21yYlSGbWNtaZhxWGlwboZXXWlba2paiHBteXKHaIeEWV5GTT5GXk1FUlZWUVBSV1RnXkxaTFJSUEVGRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk6LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdDE1UmtbTlxMW2dfPUsxVF43LyiNp5iEnaydmZmdn6uqqKq/w6+yury4wb+qpLexqqymtLWur7O2q6mlsa2ltrObrLW2tKanqLOxrbKorp6robOpoKSlm6KlnrG4laanp7e+pqynqaqrp6aioJmhqKSamaejpZmcpaqWk6OclZSkpqahtqSjoKSYlZSYlJyIrpCYlYqqjJijnYaxgaWunpWboJd6gtSof4eUwJvGeHexpbeWZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4Fsl7GrsXlobFixrm9labySvG5oem1wj9h+U2titrJ+gHGUdZqhqpBWTlhhT1ZORlVcWFFQUotcV1tQQFxEUE5DRkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cxMVRrXE9bTV5nXD5MMVpbNDEhj6eUgaeqn5ednqWtsqmxwr2ytcC1uL/Cq6a0ra2pqLC1qrC2tKioprWlqLmvnLKytqqlpKeyr66xpquep6SypKKhoJecoqCyr5afpKG1uqKqqKCsraSinZuao6qgmJupoZ+YnqiokZynm5SeoqejobCjnp+jlpeTmJKZha9raouOqn9ohZaHrWZxn56Wm6iXca6hpH53unxsoY92sV9qtFulgGWckGBmgXpmf2l4aqllvnJnpox2sWp8sXh1kZRjbW2nblyEoEVpZ4eWRXWcYH1me6Omgllfi6tof5F4emqoOEqvW1hUbWNaTE9YX1xXVjtOiFBXVi9JU1NKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy8uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVeWDMxG5KilYOtp6Wfo6WrsrittL2+sLfFsri7w6epsKywqaqxr6SxurClpa+zo6q5qZ6zsrCjpaGqrbCsr6aon6OisZyjnZmWmZ2esKmYnKKgtbOhqpuhrKyfnpqXoKOqnZmepaGdmqGopJCdo5uYoaCsn6WmoJqgoZaVkZeRmoa1m7V5hqqatpl3h7Obt3+Ul5isl39rgaZ6gYWHkZSSd6tnarFbrHuOh5R0iHCOhoB/iJCXeIOCipeMg6CPhbB2d59xa2ttfItPpVhIY2OZfmNopV95cXVSkodeUKluY3F8hoBhnS9Som5bVGtnYExLXGRYXFpCPrB3V1hBI01pRkJEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQUFEPEZEOzAyMDE7Ri0wLjg0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0o5YVQ1MByXoJSJs6amoa6pqLOsqru2wrC8w625t8Krra2vr6evs6qir7yroqi1raOstqWlsrOoo6Kdp6qzqbCopp6goLCWoJqWlpeboLCjm5qkqLWvoaiPqaeqm52WmKCmqZqfnaOgnKCjpaSWm56Ymp6jq5ulmpyaoqCWk5GTk52E1ZOZuXGxwn/Gh33WlJy7fZyXqJKPnY2ke42GooGlgnqseY+dVq97iX6farlauXeFhH2mgpR8mXqqeY6dkHuxbY6EdJC7hm+VUK+nxYpRoHpjYKpic3KHbJeHX1K1tMiFf4l8Y6QzQp11XFBqaGRQQFhmWWRhSkhNa0pbU09ZZlpDQz9FPzA8PDU5PDc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0pbUF9mVDdIOmFQNzIlnKOTmbGoqaWzqqW0p6S8t8GwusCyt7W9tLaosrGksrOmoK+2qZuouq6jsLKhsrSxoaSenqipsam0qaWcnp6sl5mZmJiWmaKsnpuXqa6xqaOejqyip5admJyhp6KYoqGioZuio6icn6GelZmbp6GcppSbm5+gmJCSlZCdiLJuaLVxq4hwjqdztHV0tnucmaaOkJ2No36PnqN+sHWDkdLSdVyufIV/pG6bqqZqhoV9rX2YmZB7sXOTnY95s2WWdIWebp9mlFLJi1rCXJ95Yl+tX3ZzhmKXiF5Zyp1vwIB0TUu1U1XGZFVRamNlWEFPal9saVBVRkk5PVdSW1ZZSEI/SjwyPzs1PTw1Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxBTlRfZVA1Rz1hTTYyLqOekaWvraWpuqymtaWntru8sru/uLe1vLy0prW1o7Kyo6CssKWYp7qupLKxnbS4qqClnaGqpbKorKqlmp2bqZ+WlZmZk5SkqqGYk6ersaahlpKsn6WSlKGcpaeglZump6Kbo6CumqGenpCWnKOfnKWUnZWZop6VmZaSm4WsfHiodqOPi4epcK6LhKiEmpqji5Oai6J9kpeHroR/grNccrJTr32CgqN+cdd9d4R+j52GmZp3r4aKkZyId7RhmmWagoGVbJJbsFdLmnWYeWZgrV52d4dnmIhqXa93lZ+PeGw1ecius19DVG9eZ2BFUGxfcG1WVU0uZWNoUllQO0FEQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdCYEk6NzegnZSft7GZs8GsqLKnqrK6uLS5vrm4s7e+tqa5taG1raCgqayglae2rKixsauttKSbqaCgqKK1p6aqpJmelaWilJScmZKVpKeblJCnrbCloJSYqZ+ij5GimqmmoZWapqmenaSfrZ2hnaCOlZ+cn6CYmJyWl6GglJiRpp2HqX5/pnmhj5CEqnCtjYKnhpehooqYl4ijgZCGlKp6f4udeXCxWqiDgoigeHTYf3aHdKeBjpuNkqR8lZCfhHuyXpxkoH2ClW6TXKtcW5N/kX9oZ6pjcnuAapiGcV6rWomgj2tuZU9KQ6FcWk10XWJmTVphX3J0X0pVNkqakVhIRT1HRUFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxPZWRBJlVmWz8xVF9iTDdGSF9DMT03op2ZmL6tmLPCrqutqKa0sLixtb+5urOyubyqu7ahsqWfpqenn5Sqsamwqratqq+hmKKgpqSkuqOjrKGXm5GjoJWVnpqUmKGhkI6MqbCwpp2Wmqemn42SpJiorKiVmKmon5+gpK6joZ6hjpWhmZ+gkpyXnJWdoZWWj6ubj65ucrR0qYx3i6Z0tHp1tIKUpqSUnY2JpIeOdbhui3uLomtrtlqhhmWXl2igoqdtlHK0c5OZf7NqhZKIrWp1tGGdZqJuhpJrl1ytYE6hfIeRUnOjbHl/fm6YhnBcr1Y8nHdmVG9uLlunT2JSa2VibFpiXGBwfGNTWlE+P2xvMkJCQD5NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssMzI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFBOKWam5y6o5yxv66tq6unt6m4r7XBtb2ysbu4q8K3qqyhnaekop2Sq6untqOzqK6qoZedqKClq7ido62clpmQpaOWjp2gm5ieoJGTlau2sKaZk5usqZeMlKaapa2jkZersqSgnqissJmho5CZopegm5abl6GTnKmdlJCqmYfUlJq7dbHEgMSHftaXnLh5ipKZjpiKjKeHeaK2dX13dsKCmrJhg7p5wHx1uGK1gYyHqX2WgqypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gYptmohxbY2kdL1dd31bYXm8alpWW2l5XmlhZGZibXlvWFtZQ0FAcT9DRys0SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sOzowOExYYUYnVGNYPC9UXmBLNTxMXC02QDmnmp+hu6OYscOvramqrLGoua+3xbG7s6+8sK7Bsq2mo5+kopyckaqlqrKktaetpJ+WmquZp624naOumZWhkKagk46do56Yn5qRlpOvubCrlZejp6eUkJalnaStn5GgqKufm5+ppLKeo6WOp6KVopqcl5WkmZCwoJKVqp+FkJm2gJKSjbiWeIOTm7Z3bmxvdG95j4SOiXKewbu8mXqBsqhwgHSRuYN8hoaKh417ioaNl32ku7m9nHV5s6N0dpd1dLB1mJ5mhmmNtnRycXe2jF5/eX2JZ4N5bXlii6xwdYV/WFunaURkWVRmX2NdY1FnZnFtdUJNT0xEO1pMP0ozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVzgqT11dPSs7VlYnPTo8pp2hob+nlrPCs6uqqKyrqruvscavtbSwuKe1ua6rpKKnn6CdmZSspK6qpraoqJ+clqGknqylvqehqpeVnJGim5KQoqiik56XkpiUsrW2rJieo6Sii5OSppymq52WqaWmnJmgqKeno6mhkqyel6Kel5aYnZ6QsKmUnKeij2t/apypeYl0f5uPdntmh3u+v8C6b5KDcZSFX3JqWl2aiWFkh46Va2B/lGNtnHZilGuAmpWUZV5gY3GaiWhyjHyGlGZqfnF0eX59Ylt4dIFoUFxug3x7impYbHmBcklKb4VwTnNNRFZcZmBMWldmY19PWm12anJST0RFTTxISTxMPjIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVDRlVFSk9IRlBJSUg7OD01MTouMTs6Li8tNzY9NSYiLyoyLCU7OC03SVJfSSdTX1Y0KVBeTCgzPlxPJz8yPqifqKHCpJq0ubajrKaup6i1sqzIrLC0rbakvrGzp6Gkqp2jnJqarKeupKW1qqSbmJWinKetqb6oqaWVlJuWoJqTmaapqJGfkI+YnLCyvqybp52noomTkqmbqKScnKyfo5qaoqesop+qopqum5WmoJeVnZ+dmLGlmaKomZ2Sn52kppuopJudmpybkZeCaG59cneRl5SQhIm0qo2FmJWOioyYloeUlYmDk5OQiY2RlJmTmZean6Gam5Sfm42CeqSFbGl7kX2AdYmLgnKCeHl2dYqAe4lqc4J0g3Vkd312a3B6bF9iW29nTVhZZmpfV1lwem9tZlNPRlI5UFpOUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7NDg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5UMTBUXjorPThdSyw8LUCyoLOiv6KjsbG3oKmms6elsLWqyautsqa1psCotKGepaacpZaWoKunraOkt6ygmZeWoJitqqbBn6yklpKcl5+YlJWin56jqJORmaiossOvmaucqp6PlpapnqucnqGtmKGbnKGlr6ahpKierJmXpp2ZmqGenp2woZ2ip5aZlJqUoaOXpKCZoY6XlYuLjpCYro98lZuCkYGJqaiGgJeWioSOn4h7hJGGhZqRh4aKlY6bl46QmJ6jlpmSkJyNf41lobOuhImEd3uQin53eXpvZ3mQgYCJa3WBeYhyaXR/eXWDh4FqdGN3ZV9oZGNkZmpYa3txamtcU0xQRF9VRkA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1RWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8zOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAs6C5r7+tq62xsqCqprKtoqyzsMawq62ks6+8pLScoKijoZ6Zl6imqaakprO1npWVnpqasKauvqGsopGRnpqalJKWopyXqZ2Fnaqso7THs5+ppKqWlpiap56pnKClq5Sfn5yfqq6opaOroaybn5+hmKSenJ+dsKSZn6mUmZmek6abmaqfnJdmhJN9ZX+Pm5BjeYxsaGp6kKOra2SZl35nhYplZWloeo2ijmtojJeRondraouZop+Yc2xueoSMhnlYZV2Fgl5si4qCd1xnc3d3kYCHgm94gnh/c215hHN3iIiOg3tphVhdanNkXXOIaWt8cW1jXVFOV0lkWEBKMz1GNz9GRDcxPD0/QUM7O0RHSEhJTE5PUlJUV1teYGFhYF1dXV1dX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSi42Wk82KUVZL0RPMVlCOz8uPaWfur26r6yzsKulqK2usKaurrC9saqopa6wsJ+tmKCknqKamqesnKyjpqips66elqSQo7CmtrmlrqOPj5qimpOSm6CZmaaWe6Wsoqi0w7eloqevn52VnqOeo52kqqiSn6Cdn6qvqaqjqp6nm6aep6CslqGcpbGkl52slqKfm5SmmaCsmZ9+vYSJc7RzhZ+GrWh3ucS4cZKho3ummJhzqoJ8y8DAunGLo4eDnn2WmIiewL2Clp2djZzBwXyBepGMmsLAfWulsm+NgW/Ken+bd5GDjoB3eYGAeXF7gIZweIWLk3lsdZFiZV53Y19lgGJedGhtZGJYS1ZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2FfXl5eXl9fX11cU01QR1VOQUA/PTY0NjgyNjYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0NQLyNGWzNQWS9VQUI7LziWornDtLCvv6mplKOvqbCvraaytq+qpqemsaugq5ibo6Ccm6qnop2roqWopaW0pJ6jk6aurLi0p6+ikpGZnaaTkaChmJugnoimq6Srrb+/saGpr6mWkp+eopmjpKqjk6ChnZysrqirpqOipZ+kpZytqZGkm6muqpyeq52uo5eYppeipJidf86UenulgnqWl5tfrY9djqiAoaF9p5WbdKuDgK9eZIyqe6iHhaB0l5OIs2OCq4agjY2zaoSvdHyWh7hhgq5Zo81ukHZ723t/mXF+iJJ1f2V7iHZ2bH6Hbn2FkJF9a4CMX3Bqb2ZgX3hkW3FoamNmYFJUU1deSk9DNUFIRUQ4PjU7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11bV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w6TC0hUEBGNC4xrMHAv7S0sLeYnpGjqqmttaymsq2srKSsprCqoaecmqaYnKKvn6GfqKejpqGfsKybnpamrq2wq6isoJSSm5+lk5CfpZedqKOeraOqsKi/xbOoqbGulpOenKKXoaqqn5Whnpybra6mqaibpqajoKqSrLOWpaKqqp6kp6eisqKTm6eboZuVlJGXoHGGjJh2haiHcbF8nXGsfaCggaWPnnirgn6tf51yrX+sh4afdpiSe3yXfqqIoYuRi5x9q3qIko+ff3qtVpzEe5Bwk8F9gZVtdXCMbWZ3ZYZvYXducm6IipCPg2yPjmRtc3VvYGZtZF9vaWpuZmNXU1xgWlJSQzlJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi08KD0xKTNWQEYhHEc7QzEtK6/Txseys5+do4+joqKtr7evqbGnqKqorqurp6KknZqjlp+mq6CipqCoqKOfnrCtmJuWqKevrKinqZ6XlZqkopKUoa2anaejr6yirLWpucyxraauq5aVnJ2imZ+urJ2WoZmdnamxp6mom6qoo6Gqm6+xoqirrqaap6urq7Okk5ikppuVkoWkaqR1inqpdXuycYKlipiMcIigm4ekX2FSq4WAroOcda6CqIaGn3qZl4Z7ZoCjiqSYhoGjfal/gZSGrl57qFWdopKBeqOfgHzEsMWMc6+0s7lyYqmvwnVojIuXjoFsmJBubHh4d25rZmRkcXFme2ljXFZfaVhYVExMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICcnISstIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXWwKGZq6ihr6KfsLWwsKmto6inqqurqKSmoJuln52mp6aknayaoqyho5+vo56bk6qktbCuoKmbnJaVp6SRm6Kon6CmnLCloqixrLbHsbWprKmVkZ2dopmgpbSdmqGUm56nq6mirZqrqKGhqaKzraKqs7KinKupsLC4pZSXpKiZnZJ8qmyehIh2q3l8sG6CpIuJn5aVnpaB0ri0uMmBgrJfYZSpg6WIh6B6mJaaearJdJqjlKeokJKajH6aiZrGxndloYKlc4GfjoJ9r15vtWOxdUujhm2nR4OTZI6PnJF7b5WQfW55dHx6bVtlanJxZoBqXmFYY21cXllJTExKRURCQT1BPEE/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE5UUR0cOzxGMiwkqKTAxrmtqbKuraWinbO5rKuhppuopqqsqaagpqWYqqOfrqydpqGtmp+ppZ2ntaCjmJSoq7ayrJumnKCWkKatkpqcp6OgqqeuoaOnqbCzwbGyqa2olImYnaWboqSvppehlZebpaWpma6cq6aknqujtqyhsbmwnpywqLS0taaWmamkm6GPgp1OeJqCgJ96hKN8gqSEhqafnJ+UhLh8fHq5gn/MxsO2d5uikYuffpmXl4p2n5eKpJikp36vhZuDnoSsfZmUYaVso3CPhZCBfZaEcqxgpHNxgJphvH1SVXWOkaKWe3yRjodyeXKDfXBcbG53cmqAblpjX2huYmRdTExRU0FIR0ZIOjpLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFdZWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9URjxFMjpQW1QcGzY/RywtIIyHmamspKu5q6+gm6Kss7Wmn6GVpa+urqinnqWlmqSnobKuoqmns6CaqaSUo7Wjo5WXoam1uaSco52jk5Cispmem6aloaKvrZykqKK1scKwraqtqpGHkZynnaOknaWXnpiYmKWjp5itoayipJevpbusore2rp6etrO6s7Wpmp+xoqWfh4/RtcO3eoeOhZGTj4CmeJSid4yhkoWlg4tyq4eGtG5yaZmknZWKn32XmYeHkHOugqWbooymipOciJSQmm1wslylc5N6nGyZf3uZfm6pYaJycn6fYnOyuGh3j5Okl32Ki5CIdnt4jYFsaHdpeHNufnRcZGRtbWVoYEpaV1g8SEY/UzNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgjKSWSco2Krr+/vLu1npeopK62oqOZlaOpp62pqpmlop+moaC1p6Kpp7GklKujj6StpJ2QmpqqtLSknaacqZKUl6+goJ6mo5ynnLWZoKqjtarCr6mrqaKMhI+coqGmo5aampyYmpelo6WXqaesoKObrKa9rJW+sK2fo7G0u622qZ2rtKWpmXuokX18sHiLgKSliJxtsm+hh618oo+DqJeagayJhq2FoJSooKOXhZ+BmZaBe5J+q4GdmZaKqnedoI+Ik5J/ea9do4F8pqdknoB8l3Rrrl2lbHKFmV1gW4ygbZSQpZiCk4uTiXh5gZZ+amx9Yn10bX95X2dlcG5nZ2hCWV9aPUpTMlM4QUFDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaWFNQT05JODE1Mi4qLEFUVlZWVFRVVVVVVFRVVFNTVldXWFZWVVFIRklKIygovJKbhKnGw7bBtJ+araCuuaajjpqjo6Cvrqmfo56drZmeuaCjq6CvqpquoZGqqaWWiZqPrbCsp6Com62YmY+toqGdpaGZpJytl5+opbaovq6kqaOfjICOm5ugpp6SlJmak5mZpaOimKeqqqGjnqmovaSXw62ro6Kss7utsKmjtbGqrJl2r36QipyFh326rYmYZLCMZZatfaGPg6eXnIKti4WwhqeapKKikYWgXGxrgrNgf617e4KAsWxmbpmXi4ixWn20XKSDa8iiZp+Be7tZdrVasn1Tr4F6rFiAoW2XjqeZiJWOk5R5d4ybfWNzfGKDeHSAfGFqZnBtZmVlT1VjXEFUXj1IKD45PTQhISwkHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE1KR0M1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7G3vbu0wbOjnK2mpbepoIuZoJ+dsrGonqKfnbWYoLOoqquesK2erJyVrqiijoibjq+sqaejqJmuk5qPqZqhnqWemaOipZieoqixqLuupKienY99i5uWoaCZkJGam5KZl6ien5enrKWkpKKkqbqfoManpqmhrLW3rrCpob6wrq6XgamSo66Om4CGpJeYkICAuMO6g46dk4SomZ2DrIuDr4qonJumq5F+1b3CqmKkv719f6OCg9e6t7WElJKCnr2+hGqjgW+rhG6df3qysceDa6uwva15eKK+u3SAlY2lmo2ZjpSad3+PmXlifHpkjGd5gXtga2VramFQYltTaVxAVGBCTCk8OjQvHx8kHiUyIB0kKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbS0sb+6sr2zop2up6azpp2Ml6W/qbavp6G/pqaym56xnbmon62vpaeVlK+sl4yDmpGupqOsoaWcqqCYiqOTpp6nm5qgqKKYnaCrrKm4rKejmpeTe4iZkqabk4+RmJiPl5OomJ6WqKeeqKahoqu6nqnFo6GwpKu0tauyrKO+qrCwnHR2qqS3hWWJn3BnrJCKj25ud6WPmqCBdrGbl3GRjnKXqaSbmK+kcmxtbWaLeG9ug5lxgHppcGlniZaVl3FoaYWGZ3CGZF2KY2lvWl1nfnimYGJyj5JwZmSAjZKOoZaVl46Tm3qFjZN0ZIZ3aIxqeH55ZGxjZmxiS2VXSmtZOlBkRFAnSjkrIxwgGiIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWttKm6ubKzqqmirp+ks6qZkr2xw8e8tKmev6uso6Cnq6C6o6StrKymjpatqpCMhZWXrZ+mqqKfpKOgkYulkqeZqZmWo6mglpylpaauuaqsmZqTknuEl46ml46RkZiUjZeUppOdlqeima+mnaKsuaCwwqiltKessbKrr66qvKawuZeLoamltZyJlqKYhqmbkJSdkqq0mZujrKK0mKSin6KjnaKlopasp4ySk42Hk52dlZCZk5iQjpWEf6Sal5WOi5OSio+GhH5njIF0g3d0h4xxp219lpOUlIGBj4+OjpySnpSVk56AhZOLcGiPdm+Kd3Z8eWlsZWRvY1VhWEBpWkdiYE5YK0U9KyYhNjQwLx8cISUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5UUUpFQz45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqktbeurqKwpa2gobexkY6qxLzDubapoaSdm6WdsKikt6edqbSlp5GYrKOLiImPnKeWraShmqienpOVo5eomqmZlKago4+ap5igtLmnqpiakI18gZWMoZSLlZGVkI+Sl6SOnZinnpu1o52mq7eor8KvpLinsK+xrqustryjsb6ZkqakprWikp2mno2pn42Sn6KtsZqhpLKrspqmop6lq5+fnp2XrZ6TmqKclJCXq5mNmJiWkJaekYegnpSUhZOMj42Vi4F/Zo2IdYh3eomEdJxqiJKWlZKJfYyWkZGXkZ+QmpOdgoaXhXhxlHJ5iX9xe35qbmRfcGlgXF9ZbWJQYGRPWDlGRkU9Mjw9OC8qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlqSoo7CzrK6jqaetoKi1qpCPm6Oyua2qq6GimXqcorGkprGplpu4paKUmKmcjoaKiZuikK+epJaooKGSl5mbrouqlo+omKeMmKiOnbi1o6WYm42JeYKUjJuTipWRk5CNkZahi5ycp52et6N/g6+1o7CwdaS/pLKgeHqirbW+l3eupaCKgKl+ZFxidp+OpJ6Dln5tlLSco6ivrKVmoKGUdHqbmHCBmaqZbICjqYplnKWckZeYlouSm5CEnZuQlIOTh46OkomFeGuQiHaHcXyGgYFhaYmMlZOMW3aVkWdoj41xeaGWlWR4mIWAdpdog4mCbnl/anBlX3Zva2tnXGVjYWFvUlk9TU1OUkY9QFRCOTEvHh8mNDozMDY2Nzg8Oz5AQUJGSEJHR0lLTFRVVVldYGhmZ1hRSTxERzw5VVJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqqWprqSnraWSlqq0rrClmamlqpdzi52vn6irp5SWuZ+gj5yknpF+iIiano2smqSVp6KejpeRnoV1ro+IpZqokZajiJu5s6egmJiLiXV3k42Wk4qTkZCUjI+Tn42ZnqWYm7KWgIybtZ20jZKPvaehfqeje6WxuoOOj6efhIuFj7Gpr4yJlqKaeYCLrIacnqOpq6mJloeZd6ace4icgZing4F7nbN7ioagmJmVmJaBkJaWg5maYnmIkYSOj5KLhG5xkIh6gnGBgYaAh3SHhZeTeJZok3SgmnR7mYKcmoSYfpGIgYKYaYyMhGt4e3FwZ2R4bmlsalxkaWllcltcSFNMUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dSWFpYW2FhaWZZUUg5REw8PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2YpJ+mrq6rqK2gqbGnp6mlmZStxbyvoJSlp7Sdj4Ocq5ymoqCNkL6emY2fmqGRfYaPmJeIrJ2jlqGhko2UiYaAkaiOh6Kco5OWnYaeubGnnZqTj4VwdZCJlJCKlI+Om4uOkZ2QlZ6jlJ2rh5+0ibSarovKiKuvireFjbCEs7GFqY6nmI2dfKiPcnt3nI6mlmiVpHm0jKCgqKqTmcKCgKuJmaFynoCbpX2XhZWzgaF9oZOfj5iXgI6UnImYkot8hZOGjZWTioRudJKGgHtzh4GEfYV1hoOYgY/FZoCph4+iap2BnpeAmYCKi4OImG+NkoRnd3R7dmdodXBnaGteY25sZmxYZUZdUUwyRTQ2TWBjNyYzPEVHRDo2MzY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQElkWF1jZmhnYmJiYmNjYF9iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6OgsKmpqKasoKW5samrppqUnqKkqaGUo6m1oq9/oKacpZ6diZS9mpONoJKdkHmDlpWRiKuZnJuaooWPjHebnI6gkYieo5uWmJeGorispZmbjY1/Ym2Pi5OQjY+MjJeLj5GejZKeoJigp36hp4etnaCWrpCgnp2Rh4Kgja2xiKSOq5qMmn6idoCZlGuBq3VNq3iHjZ2SnKqpgqqrfoShfHunap6Ak2xnl4aYt4mefm5gY1iDl3+Me2Rni3OZfXmXbF18l25gU3GFXGBteoRgWWWCfoWBmXGoq2uDo25ypXCfgpxnZJ5sWmyIemVZX4J+YVdQb3ZlbXRxampvXmpvbGtoV2dOXVhFOUA0R0ReazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUktNQkpbXV9XXl9jdWBNRTpNTk1UYlxbZmZpaWJiZGFkZGJhYmBiZGNhYmprZGJkZGdkYmdlYWNomJeeoLmhqqSmrJKitr2rrqKZlp+gpaurn5yttKGnkaCfn6abmY6ZtJmQi56MlYt1gZSRjYqmlpaYn55+k4WGrKSHnJGKmKiYmZmRh6WvpqKVmYiJgGluiIeLjo6Ji42Ri4+RoIuSnZ+boaV/k4GPo6GUoHeclpCng6OpgIasr4eleot9hJp9onBzk4eVe56MeW2HnIyakp2qnI+HnX2DonR3pmeefnelXph7fZNzom6Yt7S6c5KIgYC2qGSBxrh8cJW2jHGAm6NjdKyrYX5qnbN+bn6Ig4+DjJhxgKNsc6RznoJ+o16cmbOWb3uXnrN0cluesoJpYm9zdXFpb1hra3JyZFtnXWFMRD1ENVFBWnAyPFJHX0pSPTwzOTU6OjZDPDtASVA/VE5OUUBFX15bWVhgYHtkSUM4TFdVVmNhWmZma2tiYmVhZGNgYWJgZGNfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mauck6COpbi1ra2gmqGboqOkrJqasayrkpegmKCkmZqUnqybi4mReIuFcYCWjYqPoZCTlJ2XfZGJjqigh5iPipKik5uajIqop6Sej5aHhH5re4d+fY+Ng4uQkImOk56BlZufnKCfi4l3nJiijaByoYyJqYmdqJGYqq2Arox9eqCZeaOTeIBzl4iMnH2Vn4ecjpqdp4ijZKF+ipaQm41tnmibjm+amXuAiqd9cmh0qoOdgnOqZ5SaXZuFdoWdaKpqgbhmXKlwgZxhlYxfp3Z3ioqAnWiadYeTkpiOf55tmZBqpplcqH53u2p9qVqOhF2zZ1tucXh3a2lbcGl3eGFeZVZhQlBFTzdWQlJuNEpaWl5OWkRAMTUxOzs3SD86Q0hVP1lTWF0+RGJdVmBRYWN8aUVCOU5bXVhkZlhmZm5tYmJlX2FhX19gYGVjXmJkb3FgZGVla2RjaWhna2mWnYmqtpyoiWOVnKy7srCrnaWbmqefnayZnbCnqp2Wopmhn5mWlqCjmYaJjWmIgHJ7l4eMlpaEkpSYj3qKhJaknYmVkIaLnZGcm4iPqKGfmoyRioCAaYGGeX+WjHuIjY6IjpWZfpKhnqCik5hyaJ+KoI+McJKMgqmJmqGlqqOqfrCtpKK4l3ajs6Kjf4iUeJ16qpl/oo+enZiJmHKhfYeNsLV9bJqRoXh+mbWjo6uohJl8mnycmn5zqlpdb3uXi3ieYk1/e3uFZHqYQk2fWaJqc3yOb4KKhJl2m3mHibGzf36akqZ0fp1tcXyUb5lyaaNdlXZIZWNgc3B8fW5mX2xodXtiY19QXVZcVFZAWUVRZ0VSVlxhWF5JRD1COD9BOkhFOExFWEFXUlpWRUZhXFpgS2BtfXFFQzxVXmJaZWpWZ2htb2JmZl5hYFxdXmBoYl9lZHZsXmVnZmxkZWxoaGtplJ2Bsa6ahFNeoae0urOzqJqii5qpm5unkqCro6Cnj56dnJqZlZihnZaHh4l3hYFueZWEkJuLfZGTlohygImSoZtykpCBiJiUn5qEjqibmZWLiop8g2yEhXGBoYx4hY2Ih5GXk3uRop+eo4iuhn21hI+enXumlnqpgpeekYyjoH6naHdtfplzoHNxfJ2FmG+Tgq18o4Snn5uCpHBeqWh2o2RwpmGc0498e5l4cnNjooaQfqJyoo91a4+zi2CCmIp0qrKovH93g25/v6aqtF6cb39yl3CCc6JyXqRndKZgaKZsmtOYeoKbbnZ5l2ubeXaXcmyppWdfZHlwf4NsaGZkbXV3Zl9hUlplUFFhSFdJVF9XU1tkaltkUEVDS0xKS0FKRDhQQFBNWFNYT1NRYGVlaVNkeHl3SUZFY11lWmhpU2loam9jamZgY19cXV1faGJhaGV8ZF5kZ2RrZGpsZmhsaJibf7GsVF1LfqmvsrWwsqOcmISXpqCgooykp5+XqYmZl5iTmZOSoJeOh4Z7cH2EaHyPg5OagneRjo+KcICGj5OSbJiUfIiRkqOVg46pmpOSioWJeYR2iIBugZ+Gd4CShYeYoJV5kqKjmaCJs6Gitot6rKekrqVwqYCbkYaBnpR9pIGimoaYcZ6Eoq2uiZeLf4ykjZWDr6OVd7W2tsmic5SLgp9gnpepbXmWh6CbdaGHd6B+kJaLgW9MZqOScZuIc6V7enVig4JtfqBscmRgnHN/dJdre2q0trTGpnOYfnqcapqaq3SBmmxzd5dpmXl0l3FQRH2zXmp2a3iHZmtmYnN0cG1VXFJYZ09SaElVTFhSVVxna25VZ1dNSkFKTUtIS05BUUpQZGNqbWV1c3N+eHtudYl6e1VRT21eaFxraVJqaGlsZ21nY2VfXFxcX2liZGhre19dZGdjamZubGVpbWWinYmwqIVlQJShs6yvr7Wioo9/lqeioaOLpKacm6aCmpeWjZeQkJuSjoiDeWt5hmWDjH+Xn3l1j4iMgmqFhZKEi4WdjXqMipWlkoKXqJeMkYuAiXqAfYt5cI+ghnmBlIaIlZ6UfpOlp5yWloRnbnicbKJkfHKleJyYcGingpmOfaV7oZeDlnKfdoCJlJWPuW2PiqJifZmjl4luc2ura3WgbW+mYJtpi5BploeblXWigX6aYIuGjXVviGJooWaef2qbdXBkZ4iCb3KiW19bZKFuXomMcXyAdHJkpW54omRmp2iXcouXbaFvUoiPbqBeZKdUi11UmG1tcmtxgW1waGt4c2tvUVZVVWVZU21JWE9cSFhoaHNqWWtWUVJFVlxNWFNhVWhqXnd1e3xwfXxygnt/c3eOgIR3XlFzYWdicGdQa2hoa2xvaGRnX11dXWBqYmppdnVdXGNoY2ppcmxma21jnaWZpnpldG2Lp66lqrCxpp+Lf5aqnJ2ki6GhmqGhgJWYk42aj4uXkI6KfIZxgIhoi4p8l5pzdYl9kHxlg4eViomVmoJ8iIaWpo+AoauQhZCKgYp9gICOc2mPpYR9hZOMh5efjYaRqaadiaZ4lpx+pYmWjLKZnpGEr5efpXmYiXupdaeQhJpupaKMkoSMg7xtfKWvgoeGh5WXnaJ+pntyqJSglmiffm+sY5aKlpN4qG2qo4GJdYiCd6uRpohrkrFsd7OMqWyLhm9voJ6SlWJ/q4yqd4GAjqefd599haSVnaBomod1q2aerYy2c3a+jKOTWYOmjathdXJ0b3t1cGJqfm5nbFNVWVVgYFxrTFxSXEldbG12YFtxWFtfWmdzZW5vcWNxdGB3en55cnmDcoN+gXt7jYGCgHdieWRjbnNkUmxnZ29tcmlnaWFfXlxhamJsbHtvXFxiaWJtaXdtZ2xuYpamq52BgJ6klqmqnqinrqOZiIGWqZmdo4mapJyonYSLmo+FnJGFko2MjHSFeoiDb42FfpeTc3WGcpGDbn+LkoeGlJB9e4KFl6SNf6WljYCNiYSUdYKHk29si6iAgouTjYibnoiLkqqioJCAdJSXiH6BeZSvpH+CnHGPhnmSjYaAe3KojXF9fXqXlpuEjXh7fX2IlJWTi3eRmaGihXx/iWuMhVx6eXN6cWlvfpOKcYB0go+Uk3GGhIJljX9fgYGMeHd0lHVwem9viW+Fhl93aXiOZ4KDho+qnH90fZdqiYhvfnV8g3VtbGaMc3h7l3eEWmpXeY9pbndycW93eG9da4VtaWdWWV5WXGRrZFVhVV5RX293eWtqd2Vqamp1fHBxdHNhb3Vic3uBeHV5gnV/gH+AeYuFgn58boBtZHluXlduZ2l1a3hqaWlkXGBaY2llbHF1blpbYmtkbGt5bWhsb2GOlbqpp4uhopumpJmknauioIODlqqRnaCJmaaaqJiDgZuLfpaUh46KiYxygnyOfH6PhHuXjnRyhHCVhnx9kouGho+GeX6AhpijjHunoIqFj4+ElYOGjph3cYSqhY2RnI+Hnp2Gipqon6Cqg4mOlZt/foqXraiQk6iReHGfk4R8lHB/qodwfZVxam98gZ+Lf5GOi2huXYSNjZydoJBzl4yIcXRrg3Z0gFlyb4eRgn5/jGpdaWR7hYSIgGBpeHucfIONg3aCh4RpeoyJbGJxc4N3X3ONg4qRqJaHZ42Pg253i4Jvg4t3bWRlY3mCepVaW2lmbXZbe3l3dG1zcoNmXG2Ka2tiWVhdWVhrcVteYFleXWVyfntzb3Rjamppe3xyend0ZG10aGx7f3V6fXt5eX+Af3CGiYR7fXN+enJ/aFRccmlsdnB1Z2tnZF1hWWpoa2pxcm1XW2VtbGdyeW9oam1gjIyrsaGQo6Gan56Ynpmoo6F9gparjJ+Uh5qhkKSVf3uYhHySmYmIhoaKcn2Ai3aFi4KElopyb4BymIeEfpODg4aKgnqAhIqan4+CpqCGeI6XiJWLi5yXhIN6rIGQl5mTiZ2choehqp+hoqOLiJObnaOZlquiqKehk5yJmZB9epCQhql/f5KRkpOcsaWalJ2PjbGSmISmjY2WnaGKkZ2DiZKKbH2Od3dmg4aRi3yJnoWHi4+IiIGFhJF3fHt1m6SKiIugjIeWf4CNg4F3cXWGhX95iYiLkaeRhIeOiIOMkIt6hYmHjX91aoCDfHmZaXFoYHOKcH17d3Zvd3SBXV5vh2duX15ZWlxSZ3FVY1tbYWxodHt8cm5wY2ppaH97bXh+cGhvcGxmgHtygoB3f31/hHttg4yGfHp5fH16g3hOZHZqc25xe2VrZWJiYFtzZnBmcnFsVV1sdG1oeHpwZ2lrZY2InrqflqOhmJWZmJSYpKCde3+YqY2djIWfnIqdlnx4lIJ7jpmJhoOEh214gH9ygId+iJOEbWt+epeHhIOQfoCGhId8h4ONm52Rhqmeg3KKj4aSkouckXyNe6mDjZGXlY6bloWFm6afopqdhoOSmpmZkJmmoaaenpCXgpOMeH2Jj4WnfH2PkJGFmKmgnJOcjo2pjZKAno2JlJughI+Yf4iPhHB5hnJ1YX+EkId2jJiBg4+ChoR+hoSVbnp2dZSkjI6Gm4aGkHWBjH5+c3N8iYV7eY2PhZSokIeEj4KDiYmIdIOGhol6bWp8f3ttaGtsZ155fmd8fHZ0dnV6d1xgcH1tdGBjWltdUGZtU2VaXWFqaHV6fnBsbGNqameAf2tyf2tqdG53boR5boaAdoKAfYV3coONh358e3yAe4KLYGl7a3ZoaYNlamNgaVxjdWdvYnVta1RicXllb3l6cmVqbW2Lip+4mqGkn5OSlpeLmp+enHp3nKWQm4mGpJOKmJl5eY2FfImRg4yCgoJse394coCFfYqQfGtofYKXiYGIjnx+hoSHfY+Aj5ubkIimnH9wi4uMkoagoYqFjHynkIeOkZaSlZJ3jKOgoZ2Wmn+BkJqZk42ao6Kkm5iSnICQh3uBhY+IooF+jY2QfJekoKCSmZCQpYyPgZyRiZSYnH+Tk3+Ij4J2dYJxd2F+gY6Hc4qWfYiMcYx+goWGj2h4cnmNmpORgJh/iYxzg4l9fXJ6fIyFe3uSjoSXppSNhpF8hIWGhHSAgYWFeGRxen54eXBramZefXNnfHV2c3xyf2peYHR2cHdkY1hdXlJqaFRlWF5gZ2l2eIFxZmtjbGdlf4FqbX1nbnBqfXeFemuLgXKBgX6BdXaCjYZ/fHqAgX1/j2pyg250aWKIaWxiX3FWdG9sbmB4aGxXanR2Y3R6enFia295iY2fs5Klpp2OkJiPhpygmpt8daOfjZd/jKGKiJqWd3uGh36DiX6IgoF/cH56dHWChX6JkHdnY32Gl4qCio14fYCNg3mWgJWXlY2Vn5p9b4uBkZOFpZuHjImDppWEkYqVl5KRdpGdoaGYlJh6f46Yl4+Xmp2lnpqUlZ17koiFeYeXjp9/goqOjXOXop2gkpiOj6GMjIOXmIOTlpp/mY59io6Cd3J+bntkgHyLhnGHk4CRgmuHg4GAioVmdm99iJSajn6UeY2LfYKJfnxygHmLhnqFkouMmaOXg4SMd4eDgoF1en+Gg3Ned3d8c313ZmtjYH5panZzc3V9cXxjY2FzbnVybWFZX11aa2RSYldfYGhrdHmGcWJqY2xmaHyCa2h0aGxvaH98gXlsj4VxgIODf3R8g42BgH56goN+fJBtdYl0dG1mimxqYmN1VoNpcG1geWdsYWp2cGV4e3lwX3FshYWQna+Yp6mejo2Xh4Wfk5WXfHeom4mYeZaci4yZkHh7gIt9fIN7gIKBeHN4eXN9gIN/iIqAZF59i5WIfoWHdH1/in9+mISWk5aMo6CXfnKHe5ORiqaPjI6KkqCRg5CPk5eQioGPmKCakpCSdICOkpSKnZ2ep5mYjpWYdZCRi22HmZCbe4iJkIlvl52ZopOVioydi4aBk51/k5OWiJqKfIuKgnpyemt2bXx/jH9uhZODlHhvgoR+fouBZXNqfYKYmIWAjnSSioV6iX93eYF+h4F9hI6GjZWlkXmFgnSIhnx/cXN+hYFsYHp0eXB7bmFuYmR7YW1vdnJ3d3NzYXZgb2x1bm9cWl5dXWpdT1xXYmFobXN6iWtfaWVqY2h3h21mbGhpbGeAfHp3bpCIc4CDhH10gYaJeoN9eoGEfXyOcnmLeXhubIdraF9pcmKHaHFvZnZnbWxhemhqfHt3cGF3bYuBmZqroaSpnoqLkYaJnoqUlnx2rJeMlnyek5GWlIh2fXuKfHuAdnd/gG90c3pvhX2BgIl+fGFcfo+Rhn+EhHN6gIZ6j5GHkZGbkqSbk4F9gXyNipKjiY2KjZaajIWQl5KVjomIjJKdk4+MjW6EkI6RiZ6ZoqGYl4qXk3CLm4ZniJqPlHqKhZGLcJaak6GRkoeJmIyCf5KffZKPk4yZj3yLhoh0c3ZrcW92fYt1b4aRjpNydIB8goKJfWVxbXp/m5V+hYl0koyCdYp7cIJ/goh9hY2Kho6Wqo57iH1+ioV3fW9tfoOBYmd3c3RuemFeb2BqdF5wanp5eGxycGV5XW1sc21zWFpdX2FqWk9XV2RjZnFxf4dlXWloZ2JncY1uY2hoZWlngHp3dW+OhXOBgYN8dYKJhXiFfHiEhnqAiXd/i3t7c3mDamtfcGh0f2txb21xZ29rZXtibn96d3Brd3eJf6OZo6ihp5uIjIqBj52Gkpp0gKmUkY2GoIyVk5CAc3t2hXd4f3Jze4Vrcm95bYl2f4CGbnFbWX6SjYiAgYF2dYF/f6CGj4qRnJegk5Z3iX6AjIicnYqPhpKXloWIlJiOloyLjY6MnYqOkYRuiouPkYqclqGcmZaGmYlsh6WFaIieipJ/jISMgXiTmJGdkZCHiJSNf36QmXyRjZCOmpJ9i4GEcHZwbG5vcXyHanODj5mKcXiAdYKJg3pnc292gpuQfYmFepWTe3iKdXGLfIeOe4uHhYqPnKWJfIR3gYp/d3dsaX6Af1xxcnFvb3dZXm9gb2peb2p8enBtbWptd2Bwb2txbVlYYGFhbVdQU1llZmJ1b4SCYl1rbWRjZmuSbWBmZl9naoF1cnJvi4B0f4KAeXaAi4B5hX53h4Z2g4V7h4yAe3eKf2pxYnxihXxvcGx1amhubHZ3X3F+eXt0dXN/gn6llputn6eWhYyDfpeVg46ddIqfk5KFipqMlY6MenJ3dIJwcoVzcXWIbG5sdGyHdoN9f21uVVGBq5SHgniAdnKDeYKggpGBkpGXm5GZd5F6goySpJqTjoiUmJKEhZaYi5OLiY6Ph52EkYt9c4uFiI+InJmfm5eVgZWAaoifiWiIoYiThZKEinGDkZePmo2Pi4qOjXd7k5F7jouNkpeNfIl9gWx3am9sbG17f2J6fo+WgXd6gXiDjX16aHVtdYiXjICJhnyVkXJ7hnF4jnuLjnuJfoSOkZ+fhn19eIGKfHZvZ2p/gHded29ta3ByVV1uYXFhX2xueXBncGZndHVocWxhd2VdVWVgYHFSUE5bZWRdeG+Ie15caHFiYmVlkWlfaGVbZ299b2txc4p9dn2FgHV2f4x5e4aAeIeDc4aFfoyMhHx6lXhncWqDYId+b29re2BpbXR/dF90fHiGeHNzhXx5oZCasZ2mjoKKf4KZiX+KnH6KmJKOhIiXjo6OhHd0dnOAcG+Fc3Bxg29qaXVtgm59fG11c1JOgt/JktaTfHB0g3WDn4KRdpSQmJuPmHuTcoWQn6GTk5CJkpuThX2VlYeMjYeSjYicf46BeHuMf4iMipycnJuWlHqOeGmLlIpuiqWGlImXg4ZjjJGYjZSJlouMiYtwepWJfI6Ji5SSinqGfX9tfGVzcGtte3pcgXmQjoF7fn+Aho97eml1a3SMkIqDh4Z+l41tf4Bwgo6Ajol+hHuDkZabm4x9d3iCj3hybGVufYFqaXRvZ2hzbFNdb2RwWl9scndma2tjZ3hzb3BjX3dgYVVrX151T05LYGZiXHhwinRcW2V2YGFkZI5jYGZiWGlzc21rcXaLfHR5hoJ2d36Lc3+Gf3qJf3GJh4GRioh9fpl2ZXNufGWHf25va4Baa255eXJgdnp7jXZydop2ep+MnK+boJCChXiIlH57iJyHhJ6QjoWMl4STjoeBdXdweXBuhG9tbn5yY2R4cHxuenxqaGxipJrB3K7vonNsdYN1hKGEkW6Vj5Sfk5qAkXCFi6OXiY6VipCdlYOAlI+FiI+AkoqKl36He3Z/iXiGhY6bm5eZj5B2i3hwiYuNf42mhpOLnYWGXouUl4mOiI2KioSJbHyXgn2IhoqSkIZ2hn5+bH1keHVqb3p0WIh6kYeGen9/gIaNf3pmdGuBi4+LhISBjZiGbYN3b4mTg5KFf4J7gZGXlJuRdXR4h4x0cnBlc3eAYHNtb2FodGZSYHBna1VfbnR5YXNjYGl9cXJuW2NyYWNWblpcd01NTGNmYV12c4ptW1xkeF5gZGaEX2NjXlhpcmtua3J3i31zd4SBeHh8iXGDhH19iHt0i4iIlYaMf3+Yc2h1cXlsi3tudHCAV3B5dnlxZHZ5hoxodoCJcYCdiJmonKKShHxwjJR3eImcg4SfjY58lYx/moiEfHN3cHNqb4FraWx8dF5geHZ7cHR6Z2BlfOvatcnD3IlzbHSAdoqaiIxpl4+Om5ORgYhwhYigjoWLlYqMl5N8jZKIgoiPepGLho+CgHd4g4Ryh4KTm5aUmIaNdoiAcoeEi4mcpIWWjp+EiWGDlY+FiIWIjIaAh2h9lH99goWKjo+Ccod/gHJ3aHZyaXR4bVqMfZKChn2Ag4GEi4N2YnVtioKRjIOAgJOSfm+DbXqIkYiUhX2CfoGTlJGYim9yeoyFdGtvaXB2fl1zaG5caXRfUWRxaGZTX3B2dGBwYF1ognFyaldnaWNpV21XW3RMSkxlZl5hcnOFaVtcZXleXmRnemBkX11Za25lbmp0d4p+c3KBf3t2eoh0hYN8f4d2doqFj5iBjYJ7k3Zsd3Z5eZN1bnd6fVh5hXGAbmd4dpGCZHaGhXGKloaaoZuhioZzb5KLcXaNmn2JmYiJe59/g5l/gnlxdG5vZHJ+aGZsd3dbX3h6enFxf2lhZ2F/1baOkaZ4bnF3e3GSkIyGapiNiJqQioV6aIeLmYaBkpGGhpeNe4yMgICJjXuQjX6JhXp1e4N8cYaAlZmOk5SCiXaEiHiFgo2Vn6GIl5Ggf4hhf5OHg4eDiIx/f4JmfZGAfn+DjI+Rf22DfYN1bG13dXR3dmxjjYGOf4V/fISAhYmAcWB0coZ9kI6DfYCSinpyhWd7hYyIjYV8hX+BlZCSlIVvcHmLf3RsbWlpd3phZ2ppWGt0WVJocmliUGJyeGxiZV5aaoNuc2JcZ19lbV9vVFpvTkhOZmRcZm5ygGtaW2NzX1xja3ZkZV1dWmxsYm1qc3aGgHFvf3x9dHiGeIWDfICIdniJgZKVe4mGdomBb3h5e4OSb217gHZeg390gW1oenOUc2dzh3xykpKEmp+bn4aHdXWUfm11kpZ9h5CDio2ZfIyadn52cW9samF0fGdiaXV6WmB3e3ltcX5lZGhoV52PX3Jzl7zEhHZxlIiPfXGWi4abkouHcmqIj5aAe5WMgYSajHyKhXx7iYt/lIh1iYZ2d36BcnWGgZ6UhZSPhIRygYp3h36Lm5+aiJWPnYGJZn2Tgn6EgoiJcYF9Zn6MfHl/f4eMj31pgX6EdmdweXhzd3Rsa46FioGKgHmCgYWEgWxfc3l7fo6LhnyCkIF/c4JqeoWJjYeFeYR9gpmOkY1+bm17iX12dG5mZXt0YltwYlducVNTbXJoYU5mdHhmYF5dWW+Ab3NZZWJdam5gcE9Za1FEU2dgWmpubXxuWVtdbWNaYnB2Y2ZcXWBraWNsanN2gYNwbX58gHR1g3qDgnyBhXZ+iIGWkHiEinSBiHJ5eX6NkG9ve4BxaYF4en5tbHt1lWtqeIR0a5ONhp+ZoJmEiG59jHZpd5eOfoGKgpSXiXmPlW96dHFsaWRgc3poX2Vxelphcnx5Z3F5YGVlj7Gyd0tiWqXZ0JZxe5CKj3d9k4qEmJCLhW5rhZKRenmSh4GEmIp8hn94d4mKhJaAb4uIcXV+e2p5hYOlkISTjYR/cICEeIZ7iJ2blo2VkZWFiHB7koJ8gYKIg26Ad2iAhHhyf4CDioh8ZX5/hHZkcXOAaXlxb3WZjYaDi313eYGFeoNrXHJ/c4KJh4p+h4p7iXOCb3KFiJCGhnOFeoKajY6FeW5vfoR/dnpkZmh7b15YdlpYcGtOV3FyZmBLbHd0YV5cW1p1fXJvV2ddZmpxYG9OV2hSP1hmXlpva2d6cVtaWGtlWmNweV5nXF5lbGdla2lxd3+Ib2x/foB1b4J7gIJ/gn92gYWIl4lxgo1xe4Z8enmEk4x1anl+a29+dH99b3J7epNvboF+eGeSi4OhmZyRgoVmhoNvZ3mViH1+hIKYiYF8jo1peHNra2ZfYW95bV9ib3hcZGuCemFxdl9lZdTqvYsyOj6Ljn9xeIWHjY11gpaMfpKNjH5tbIWMjHV8j3+FgZWIfIJ4bnaHhIOXd26IhWx1e3VmeYKDp4uCj4uEfm6BdnmGfIifko2Rk5SOi4d/e5KGd36DjIJrf3JogH54bXx8gouDeGJ6hYJyZHJpfm51cXWCm4uAf4WAc3Z+gXOCcFxuf3V5i4SLe4iBfol5e3JtiYSRhYxzg3qAl4yMgHVua3aAgHVzW2dndW5XVntSWW9kTFpycmVbSXB4b1xbW1lddH50aFliW2dlb2RqTVdmUT1dZVxddWVgdXBaWVVuY1lkcXlaaF1fZ21naWtpcHd9jm1pgoR+eW6AfH2Bf4J5dIGBjZOEcIGLbnd+gHt7iJKJf2h6fWpze3KFenN2fX6MeniEfXxrjI2Em56WjIGAbI19a2h+jYt6fn6Dk4J+fYqIa3ZyZ2hiW2Jnc29fYWtzYGhwiHlic3ReY2SboI9uXDVar7V0aYCIfJKGdYWVhXOOiol2b2yFg4d1eYl4iXyTh3l+cmd1iX5+mG9xhn5odnluZnmHhKSHgIeNin5vgHeCg3+Om4iDlZKZiouFiXyPiHB6fYR7aH5saoB7emp6d4KIgXJgd4F+cmRyZ3aCbXV7hpWRgXyCgW93enx1f21ZcIB3dY2Dh3iIdoOJe3l0b4uBkYKGc4B+f5SJintvbmptgYF0bVxmZHJwUFp6TVtuW09bcm9kVUtzeGlXWVlaYXCAdGBdXWFnZGlpZk5ZaE1AYGNbYHVhXXVsWFdTdGFaZG9yV2peYmhqZ21saHB3fJNsaISKfHxwfn57gYCBenZ/f4qLg3F8h29xd4N/e4mMj4NqfXttd3h2inZ8eH+Ch3+Dfn16bYWMiJmjjYSDe3WLeGtshIeQeH57gpGAgH6Lg3BzcWNmXllmX29vX2BncGZqboh0YXRvW2FkanZ7gL+cpqTIuHGEgnKSfHeGkoJzkIuHcnJvg3uDdHSHdIh3lIh5eXBjd4d6gJNpcoR2Z3d1Y2p8goidgYB/jo9+c4B1h3uCk5GEepePlpCIgol7iIhreHl+dGd6aGt/eXNpenaAg31oYHiIfWtrdGh8gGl2gYyRlH56f39xfHZ8dH9iVnh+c3OLhYJ9hHGHinh5cXGEg46Af3p/fnePhoR3anFpbIeBcW9cZmFxbUlkdUtdbFRTWXJuYlFPdHhhUlhYXWFwgnNbYVxpZWVka2RQW3BJRGNgW2NwXl13aFVXVnZdW2VuaFZrXmFpZ2VubmhwdnqTbWmIjXh9cnt+eYKBgXt1fIOIhoNwd4RybXeCgn6Ji5N/cIB7d3l6gYx0gnh+gYGChHmAdW9+ioubnoh9hXp3hXtndIWLkHl+f3uIhoR2j4BncG5fZFxYZVltcmFgYHBsa2iIbmF0aVleZG6Ad6naqceGh7JxiHdvjHR7hY1/epKJf3RzdH53gHBxf22EdJSFeHVrYHqCeYmPZnGEcGd2blttfYCQk3+AeZGTfnl8bop3gpONhXWXi5KPh4WFe3+EbHR2fmxndmRte3ZtaXd3f398YWJ4hnppdXVjfntndYaOjZV7dIF3cYB7fW6AWld1f3B2hYh/gHptiYZ0emx2gYSFf3x+en10i4F+dGh0ZW6Lg2xzWWhec2RHbW1LWmBXVlV3bWJQUnR2WFBWWF5hcYRvXGBjbWVkXm9jVFxyR0JmX11mZ11be2JRVlx0W1tna2FWal9gbmVma3BncHZ4jnRrjo11fnZ4fneBhIF7c32DiIeDb3KAdHF1foWCiY2Ke3d/eIN7fIaHd4d8fYF+hIB7fnJ1eYyNoIyJeYl1dIN4Xn2Fl4t4hoNzhYaEd4l7Ym5tXGJbW2FWaXNjYFtnbnBmh3FhcWZXXWNrf3zKzoe5oWptbYpscYNxfIOJfnqQhHl4c3l1dXtqbHZjhHWSgnZvZl59gnqLimVygmtqcWNYbXqFm4iCgXOXlHh/fW+KcoSLjYlzmI+RiYaLg3t5fXBwb3xmaHFibXhxamtxeH19el1leoB4anZ4ZoN3Z3SHjI6UfXKIam9+gXlvfV1Zc39udYGLfIJvcIqAcXdpeICCgIJ4fnN8dYd9e3Nnc2Fui4FrcVdpXXZbR21qTFZVXVNVe2thT1R1clBRVFdeYnSFaV1gbGpmY1pvYVhicEhBZ1xgZV5cVnteTlVlcFlbamhdV2hgXnJla2dwZ3Fzd4Z4bpWLdH96eH55g4h/dXJ/hoWOg3Bwe3h3dnmGhoeMhnp8f3SLfn2GhIOHfn5+fYd/fHh1eHiRk59/jHyKbXV/eGSDhpWFc5GKb4WFgXqDdGRuallfW1xdVGdyZGBZZHFyZ4ByYmtlV1tgan93vq57oLZuYXOFaHN7cXiBhHp9i353d3J2b3t2ZWpvYYd1joBzamJef3h5i4RmcX9oa2taVm93iaOBhX9xmZNygXp3hG+Cg5OJdJaKjoiFiYV9eHRxbmh5X2psYG12amdqa3l3enZaZ318eWZzfm2FdGV1hY2Gln9wjGdre4R1bnViXXF9bHV9jHuCZ3aHfm5xaXZ/eX+Ac35te3yCe3lxZmxibol9bG1WaV92VUppak5RTmdMWHtoYU5VdWtMUVRVX2Z1g2ZeYHFoZ2JXal1ca2hKRGpZYWRWWVV5WU1WbWpZXWtkXFllY150ZW1kcGZycHWBeHGZhnZ/fnd/fIWHfXVzgoiAlYJuc3l7enNzhYeJiYN4gX11j358hIqNg4GEe36Lg3t2e3d3mp2YeomChml2fXtsg4OSf3KOgXCFgn+Cf3BnbGdYXVtcW1NkcGReV2JydWp1b2VlYldcXGh/cG9ygHOJZGR5fWlzdXNygYN3gIN4dnJ1bmt6cWJna2eGdI2DbmZdX31we4l/aW15Z2pkVVdyb42mfIR7dpaRdX10fnxvfXySh3iafYiHg4aDfXVvcWxndFxsZ15sdGRnZWl6b3tyWWiBd3VocIF4gnZid4WLfJSBb4xrbXuCcWd0ZmFuemdzeIt8fmN3hHdqbHJ2e3F7enR/Z39/gHl3b2RmYm6Fe2xqVWhhb1JKaGpPS05vR116ZmFNVXRkSk9TV2Fqdn5lXWdzaWZgVmRXYnBdTEtqWGNhVVRVc1ZMWHVkWV5rYFxaY2VfdmdtYm9pdG9yfnR0moJ3f4B3gH+GhHp9dYKEfpeFbnJ0fHp1cYSFj4GAeot1dJB/fIGVjYCFhH19jIZ6fYB2e6OlinmIhYRrdXx6dYOBi3puhHN5hH2Cg3ZvamllVl1bWlpTYm1kW1hhc3tqaG1pYGJXX1tqgGprb4Bna2BoeXhqcnNzbYOAen98dXRtemhqeWpfZW5ogXaQhGhlWGJ3an6He29qcGdmXVRYb2eOqHeBenyQjnp2cYBxdHd6kIF5lnWGg4CFiHZqcXVnZ25bbGNdbXJfZ2FqeGh7bFtug3N0anCBfnp3YXeFhXmQhnSIcm95gHJjcWldcXhlcnSJfHljdIBxaGp6dXJteXh2eWSEfH95d3FkZGNufHxqalRoYWVTSmtnT0dRakVgd2ZhTVNyXUpNVFpla3Z6ZV5tcWlkXVZhVW5uV0tTaFdmXlhNVWxUSlx5X1tea11dWmNlYHlobGBvb3ZucHd1eph+d3+BeYCAh4Z6eXqDfoGThHF0dH95dnSFiJF9gHyQa3OVgXuCn4Z+h32AfoaCgIp7doSrn396h4eDa3KBeXWAfoF0boZufIBzioBqcG5kZFhfWllaVGFqZ1taX3WCaV5tbFxhV1xcbIFlcnR9aWlca3Z1Z3N2cWyEe318eHVybHlnaXhmXWVzaHp3k4FjY1RlcGiChXh4Z2lqYVdWWWdjj6dufneAi457cXJ/aXpwe459eJByhH5/f4ZuZHVyZGdnXGphXG9vXGdfbXRlemhddIBvcmtyfH51dmJ0hYt8iYiBgHhydX91YXBtW3J0Y3FzhXx1ZXOAbWFte3Brant5dnNmhnZ7e3ZxZWJlbXJ9aWtTZ15cVEtxYlBGVWBHYnZmYUtUb1hKTVhYZ2t1emRlbnFmZFpXXlh3ZVRKXGJXaFhZSFdlUEhieFpdX2xaXlxhY15+aWpfbnR4bXBudoOXenKBgHx/iYyGfXV1hnmHjHx0dXWCeXp6goyOfX6EiWlzloF6ip1+foV6gXp/fIaIc3GPrYx7e4aPfWRxh3lzfHp1cm+GbHt+bI96Y3BvYmVdZVZZWVdjZmtfXV1zhWhYcW5bXlhaXGx7Y3B3dWxiWWxzc2d0dW9sg3h+f3h2bW50ZGl0ZVtndWZ2dpJ5X11SZmZrg4J0fmJkalxUV11iY4+kaHh0g4aReW5xfGl6bnyGfHaKc4F5fHh/aGR2bGBmX15pXlxza1llXW9vYnplXHd8a25ucHh5dHVkc4OSf4iEiXt3b3J+c2J4ZFxxcWJxcoJ9dGdygGVebndpZWh6fHVub4J1dH10cmJfZm5ufGRoU2dYWFRNdl9QSllXSGJ0Y2FJVG1TSk1aV2lscXtibWxzY2JaWlthd1xTTGNdWGlTV0dZYE1HaXVYXmBsW1tfYmJchGlnYW54eW1vanaBkHltg3+AgZOIhIF2dIh0jIZ0cnZ1gnd8fX6MkIB+k35wd5aDfJmTeYCAeHp+gHSIg3RwmaF6en+JlHdjdYd4c3d0a3Rvfmt4fHCRc15wbmBnYmxUWlpXaGNtZltccYllU3JuW1pYWGBsdmNpdWppXlltc3Bsc3NzaYR8fn57dm5ubGRpcWNba3JkdXaOc1tXU2VhcoB/coJdYmNdU1pgXGORn2VxcYWEknVsbHtvcHF7fX1zgXeAc3p6emRldWhdYllgZ1pedmhXYl1waGF3YVt8dmlqcm94dHN1aHGClYOHf4V2c2pxfW5md1hdbG5jcnSBenRncH5bYHByYmBrcn5tbXV/c3J4a3FhXGVsbXpgZlJlVFdRUHVbUU9YUUhjc2FgR1ZrUUlQWlVra2t8Zm5vcWJbWlhZbHFXUlBmV1ZoU1RGWlxOSHF0WF9jbGJYYGBhXYtqY2RteXhscGl1eYd7a4N9f4SafIOEeXyHbo+Hcm92en10goJ8i4+Dgpd0eIKUhYGfiXWBgIF0f4Jxh4J1b6GWc3uGi4Z6ZXeKbm16bmZ4cHprc3ZzjWtedW5hZ2VrUl1bVWdhbGtaXHGMZE9vbl1WWFVnanRoYnRlZFxYbXRtb3V0eGqGfH97h3aPc2Nka25hXG5tY3N4h2taVFZjZHh9fXGGXWRfY1RaX1lilZVjbnCDhYp0a2l8cGZ0eHV9bXp1dnB6f3ZfZXJjW11WYWNYYXRlVV9gbWRhcV1dfnBoaXRxdHF1dmtthJOBiXyGcXNncH5xc29UXGdrZnJ1gXd0Y212VmJybFtfcGd+Zm13fnN0c2tuYVpkamp3XmVTY1RVUFRsVlBWUlBHZHJfYUZYaU9JWFRWbWhkfGlreGtiV11VW3RkU1JXaFFYZlRTSFpaUE13dlpfZWtpWWFgXl6ObmFma3l1bm9pdnaAf2yDgH2HmHuAh4GJfmuTiHJndIB7dYCDfYmPf4uTcnyKkYWHn4d7f4aMdIGGc32Cdm6ki3KBjYt2d2x6jGBke3BmeXN4bG1xd4NnZHxtY2ZnaFNfXlVnX2xuW15ujWhOaW1gVFZTbmd0a2V4ZGRcWG9zbHF6d3Jsh3t/dpt6eWthZWxtXmBvamVxeX5nWlZYYGx4fHtwhF9jX2dWWF9XY5uIYmtwgYd9eGxsem5cd3Nte2p2dG9wfIBzWGltXlhcVWFiV2RwY1NeYmlhYmxaYX5sZmx0dm9td3dsaYWMf4l8iW1yZ3F9bnNuY1thaWlwdIJ0c15pbVNlcWVVY29je2Ryd3x3bHBta2BZYWZndFxkVWBVUk5XZFJPW05PSGRvXGJHWWlNSl9LWG1kYHhpbn5kYFVfVF11XFRTYGZOXWFVU0pcWVBZdHVdX2VraFhiYVtejXFjZ2p4cXNuaHZ0eoRygoN6iI5+fImHjXlukIp1bHOCdH9/iIWHkYSVj3l9jI+HkZuFgHyMhXOAgXN0eHJvk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjYyMjIyMjI2NjY2NjY2Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpKTk5OSk5OSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjIyMjIyMjI2NjY2NjY2Pj46Ojo2OjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyRbWZnZ2dnZ32FhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERBUsza2NjY2NqwnaCgoKClXiovLy8wLEiFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJFnX2BgYF9eeYOCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTJG2Orn5+fn6bago6SkpKpWFRwcHBwXOoOBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkY6NjY2NjY2PkJCQkJCQjIeHh4eHhomTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWGhYWFhYaTlJSUlJSUkI+Pj4+Pj4iCg4OCgoKFioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95enp7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkpKSkpKNkZKRiYeOipCSkpOPjYuKkImPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYuKi4uLjIyMjIyMjIyMjY6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQkIeIhYmKhoiQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCNhImGhoeFh4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkYmCh46IhIWIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjoiGh4aIhIqQj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2QjoyKio6Kjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCBgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9/f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX5+fn9+f39/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn19f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn19f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWFhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn1+f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYWFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4fHt7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9+f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dXR2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2loZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3ent8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTk7OzpAOzs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ojs4OTo4Nzo8OTc4Ozs+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1c3FzeHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08OTc5Ojo5ODg6Ojc4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Ozw8Pj89PD07Ojw9PT08PDw8Ozs6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV1dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDQ0A+PD0/QD8/PTs+PT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl7e3t9fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VEPz07PEA+Ojs6Ojk3Ojw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fX1+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz9BQUFCQUA9PD07Pj06Ojo8Ojg5ODg6Oz0/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkVISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dnd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAPz8/QD0/QD48PkA/PT09Pz49PkNEPzs8PT5APT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkVDREE/QEBAPz1APjw9Pz9AQEBDQEA/QEA+PTw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JCQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEFAPjs+PD89PDo+PT9CQkVAP0BOYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVGRkZKTk1LSklHR0hLTEpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBERUQ/PEFDREI/PUE/QURFRUNXdYaJin5YR0lKTExOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm9wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpISUdISElHR0JERkREQ0FWdIeJh4eGiIJXSUxNTE1NTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExLTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTEtKS01KS0lIRkZHRkVQbISHhoaGh4eIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz8/REZIREVHSUtJSUdISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N0dnh5e3t7fHx9f399fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tLS0tLTUxLTU1JRkpWbIGGhYSFhoaGh4iGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkVEQUNGSElISEhLTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVIR0lJS0xPTk5RTlFecoGFg4SFhYaHiIiIiYmMjmZCQj44ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QTs5OTk9PT47Oz1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5/fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njs8Q0BCRkhLSExLT1Vne4SEg4KDhIaJiouLi4qJiouMiVQ7ODY1Njc2NjY1NTc2MzQ2ODo4NzY1NjU2Nzc3Nzg6Nzc3ODo7NzY4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn9+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9OjxEQkRGRkVmeoOEgoKDgoWJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc3OTk3NjY3NjU6Ojo6Ojw4OTg5OTg3Nzo6OTg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT1BRV2tycnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3OkE5PERAUX+Dg4OEhISGiYqKiIeIiIiKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj48Ojw7PDs8Ozk6PDg6Ojs6OTk5PD88PUFCRElKTUtKS0xXb3J0dXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk5OTk6Pj0/QER2g4OEhIWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVBQUFCPkBDQUA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEFAPz9BPD48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6PDw6Ozs8Oz0+QUA+YoWDhIOFhIaJiYiHhoaGh4iJiouLi4qKi4qLXj5ER0lLSklGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURGRUFGRUZERkZEQEI/PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj06PDs+Pj4/Oz89QD9DP0p+g4SFhoaGiImIiIeGhoaHiYqKi4yNjIyLioqHV0dMTE1LTklJS0hJSkpJRUNERkdGRENFRkRCSElMR0dHRkhHRUtKTElLS0pDRkNDREJBQUNCRENDRERDQT08PkBocHN0dHZ3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTc8Pjs8Oj4/PkA9Pz9CQkU/aISChYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlKSEtGREdISElFRUhGRkVMTE1JSkdHSElKTk1PTUxOS0hGR0dFRUNGRkZGREVISEZDQT9ATG1wdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw6Ozw6Pj89Pj5AQURDSVN+g4SEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMTExKSUhGSklESkhHS0pISkdHR0tNTkxMSEhJSk1QTk9OTU9LSUdJSkhJRElISEZGR0dJR0NCQUNVb3F2dnh6e3h4enp8fH5+fn9/fn59fn1+fn5+f39+gH9/f39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6Ozc8PTo8Pzw9PkBCRERNbYSDhISFhYaHiIiIiIiHhoiIiIiIiYyMi4yMjIuLi4teUlJQTU5NS0pHR0NISkdMSkZLT0xLSkpNTUxPUE5ISUtMT1FRUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkBCQlxwcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEO0BBOz08OD89PT5ARUU+Q0VDR0t1hoODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKRUZGS09OT1dWUVBPUVNSTlNUT01TTFBTVVdSU1JQTEpNTU1LTkdHSkZGSUpEREVFQkRDY3F1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz08QT9BQUVVTEJJSkdKTHmGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOztRU1JgdV1VVlRWWVlTWVhSWmZQVVdaXVJUV1FQTlJQUFBRS0xLR0hKSEVGSUlJSElqc3Z5eXp5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0dGRT8/QUBFQUNGRENES1ZQS1BQTlBQeYaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLhmxbZFU6WFhYU1A/QFZVWVxkYFZZYnJeXVddWlZFUVlaXFlfVFlnUlVWWFRUVlNPT01KTEpJSUxNS09NU290dnh5eHd6enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH5/fn5+VkpKSUhHRkREQkE/SExJTVBLSUpPU1JRVVZVVlR1hYSFhYWFhoeIh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JXVlRaWnWDWVV9kGFcWF1eV0lWXl5bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHl4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktKSUlGQkRAQTpPUVFXWFBQUFFSU1JWV1dXV2yBgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaWlhcaGJHT1ppZ11bXF1dV1JOU1BQUVZWVlZZWm9zdXd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpaUlNRT1FSUVVSVVNWXnV4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlVTVF5aWFdXV3prWFpcXF5UUVFQSU5PV1ZYW1pkcXR2dnR0dnh5eXt7fH19fX5/fX59fn19fn9/f3+AgH9/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU05PUU9RVlJTUlJUY2R2gIOCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUFFOS1JVUk1PWVFNTlFTVVVNUVNSUE9NTEhDSUdSU1RaXW1ydnZ1dHR3e3p7e3t9e319fX59fX1+fX5/f39/f4B/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRgZF1eW1lVUUxJTElhbJJ0UFFTTlFSUFNbUlNSUVJVVWJze3x+gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5CQkNDQj9EUENEQEM+QkhHVkBJTk1HXWlRSEZPRkRFRkhHSEJDSEdIS0dEQkFDQE5QTVJkdHV2dXN0dnp8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWViXFhTUVBVUnNXZVtPT05MUVJQVVlTVVFRVFJPVmBrbHN2ent4eXVybnN0c3l4fn6DgIODgoGCgIKBgWtMRz4+Ojo+QD8/Pj5qUEphRUZISUVCP0hNTUdNUVVKQkU/Pjw9PD09Pz0/QUNDQD88PUI+SU1GVW91dXZzdHZ4e3x6fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKT1BOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJpbWxxdXt6fXt4enx8eHd4ZEJAQEE8OkJDQUFDQVtcTntOT09OS0xNT09QTEtMV09JR0FBPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV2d3V2d3l8fHx9fHx8fX59fH19fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT09eXFpJR09RUU9NUFFOUVJTVlhTUllUTllaW1dZXF9eX2VgXV5xd2teYGdrd29vbGpvbm5sZmJZR0ZGSEJBRkhFRUZDTFFPYVdSWFFQU1NSVVtPT1FXUE1KREY+Ojk2NTg2OTc5OjM2NTc5NTxCPWZ0dXd4d3l5e319fHx7fH19fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LU1RTUFFVT0xSU1RXWFNUWFFMWFlZVlhYVlhZXVdYWGhza11WYHRrYWFfXWRgX15ZVVBNT01MSUdKS0lIRkNQT1NaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5OTg5Nzg4NDc1Nzg1OTlHbnJ1eXl6e3t9fX19fHt9fH1+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BXVlZTVFZPT1VWV1hZU1VUTEtTVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5NTUxKRlBQVVlTVE9KTk9VU1RcVlJVU1NPTUxJSEhGPz89Ojc4NzY1OTk2NzU2NVdxcXR4enp7fH19fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1RTVlRSWFhZWVlSVU9KR09QT09NUkpPUE9PTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFBPTk5NUE5UUlBSTElMS09RUFFSU1RRU09MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVVFTRkZBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjRAPmpvYVJSUUBHVFFPUFBRTlFPUE9MSkxMT1BOTlBRUU5QT0pMTU1LR0VFREI7PT08OT1HNjY3NkRucXV3enx7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JDOERNU11nU1FTQUdVUE9RUVBNTU5MSkxLTE5PT1FMTk5NSU1MSUtLTEtHRkZFRDxBQT47QEU7PDg5VHJzdXl7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E+PT1BQEI9PkVIRkRGRklHSkpARkFBQEZHRElPSFFSYVxRUFJPU05PT0xMT01LTUxNT05bVktNUU9ISkhDSUpMTEtGRkZFP0JDPj1CRz9CP0BkcnV3e3p7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj87PkFAQD5BRElFQ0hHSUdJRUJCPz48Q0FAR0lETU9iZVBNT01XS0xOS0tNTUxMS05OU2RNSkxSSUlJRUJJSkxNTkpHSUdCQUJAP0VGRUhETG9wdnp5eXt7ent6d3R4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xMSU1QTVBPSEtFP0I9OTk5Oj9CPzxBQkFBRERHS0ZESUlHR0hDQz9CPz9AQD1DRURMTVFUTEpJTVRGSUlKTElKS0lKTE1PUFJQS0dDTEdDQ0tKTE5PTklKSUdDQ0NESUpNTElac254eXh6e3t5fHZycHVydHl5dnhqcW9qbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZXFIS0NGR0hHSktJSkxER0I9Pj06Ojo7QUI/PUJCQ0NIRUpMSkVJSUZHR0NEO0FAQj5AP0JFRElNT0dISkdIS0RISUtNSEpMSElKTEpNXVJJSEROR0JFTEtOTlFOTE1KS0ZHR0pNTlJOTWNuand2d3t5e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhlcEZLQ0ZFRkRFRUZFR0NDQD08PTo7OjtBREE/QkNFRUlGSkpMRklJR0ZGQ0I7QkNDPj9DQ0NERkxOSEpOSERIRElMTk1ISUxHRkZJSUxOS0pIRU9JQ0dOTVBOUE5PT01LSUhJT1NRUk5TZ2dmcm9zeHZ7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV3dlhWdXVrb3Rya292bGhtZl9wR0pDRUVEQkJBRUBEQj4/Pjo7Oz07PT9EQj9BQ0ZHS0ZKSUxIR0dHRkVDPz1ERUI+QUNCQ0VHSElHTVBJRkZGS05PS0ZISUZFREVJSUhLSUZIUEtESk1NUU5PTk9QTkpKSU1SVVVSUFhlYWFtZ3Fyb3J5emdlaGhjaWxmcWxmbG1naWtsc21wdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFRkJBQEFEPEJBPkE9Ojo9Pzs+P0FCP0BCRUdLRkpHSUdGRkZFRENBQUZGQ0JCQkRFRUdHSEZMUExJT0pKTEtJRkhFRkVEQ0lISEtKR0tSTUNPT05RT09PTk9PS0tLUFVXVlZUWWBfXWlhbmpuaHJzYmVmZmRpaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXV2dnZ3dnd2dnR3dWtzdW51dHNwcmtrc01HR0VHQUFAQ0Q8QUFAQzw4Oj0+Oj89QEJAQEBERkhFSEZGSEZFRURDREJESUZDR0VBRUdFRkZHRUpNS0hRTUpLSEhJRUZISEVDSUlKS01LUFNORFJTUVFSTk9OT1BNTE5TV1ZXWVZYXlpdZGBoY2ppZ2tfZGVmY2hoZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hBQUJFRTxAQ0JEPDc6PT47PjtBQj4/P0NFRkRGRERHRUNFQ0RGRkZKRUVJR0JHSEZHRkVDRkpKR01LTEtISktGSUhKSEVLS0xMTk9SVE9JVFVUUVRQUU1OUU5NUVdaVlpZV1peWlhhYGBgXmhlY2BkZWdnamhoamdobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9zc3lNSEhHSURBQ0dFPEBFQkQ8ODo+Pj48PEJCPUA+QUJGQ0VCQkdDQ0RFRkdHR0lGR0tIQ0lIR0lHRkRIS0lHS0hNS0pLTEhMSk1LSU5MTk5PUlVWT0xWVlRRVFJSTE9RUE9VWVpZXFpaXF9fXmBjXlxiZGxjYGRnaHKFaGdqZmpubnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtJS0hKRUJER0U9QUdEREA5PD5APz4/Q0I8QD5BQUZDRURDSERGREZGSEhGSEdJS0pFSkhISkhGRkxISEhKR0xMTExMSU1LTU5NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW11eYGBhYGJlXmRgZmhgZWhqZHNzZmpoZmxwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd3B3SUpLSUtHQkVERTxBRkREQjs/P0FAQEFEQUBCPkFDSEJFREZHRUlFRkVJSEZJSEpMSEhKSklLSkZKS0hJSklHS0tNTEpKTUtNTk5PTE9QUlVXVk1OVFZVU1JRUE1OVFNSV1teXl9dXmBgYWFiYGNkZWJkaWNkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV1c3Bzd3R1dXd2dXV0ZXFza3BxanJ2cHdKTEtLTEdDQ0FFPD9FRUVDPUFBQ0JCQ0VCQ0RBQUVHQ0dGSEZFSUZDR0pHR0pGSUxISUpNSkxLR0tJSEtLTlFLUlFMU01KTk1OUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5hY15gZmJhY2luaGNpaGhteHZtaGlub3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnNxcXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0VBQEQ+PURFRkM/Q0FFRERGQ0JFR0NDSUVCSEpJR0hKRkRLSkdISklJS0dKSk9LTUtJTEhKTUtaZkpkXEtsUkdOTl9uVWxzW3FwYndjUlBidnVodWNhdmFYbnFiZHZpbnpmXGx1YGxrVWB4dmlqaGhmZ2xtam1vam1vc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cnFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj88REVGRENDQ0VFREZCRkZHRERKRERKTEtJS0xHR05JSEpLR0tKSUtKTkxMTExMSU1MTFtzYmRwXmxsVUxOZXJdZ2VxbG50Z3BpX2FZbm1icHBia2pqZ29xdGV0bm5ccHZncU5Lcnl2a2Fha2VlbHhta3Zsbm9zcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0FBPz1CRUZCRUNFREVFREJISEdERUtIR0tNTUlMTEZKTkhKS0pJS0pKSktNTU5NTU1LTk1NW3Jwb25wcGxrTVBRbFhOaWJ0cnBhbW92XFlsUFttbVpxbWtvbXh4dHNpcF1gc2xxalV1eXhvY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0hGRUVCQUI9Pz9FR0JHRElFRURCRklISERHS0pHTUxOSkxNR0xOSU1LSEpNSUpKSkpOT05OTUxOTUxcaGR1XWxxV2xOT1FtVVprXmtsdmFsZHRUZWNObFlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdoYWNpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSUVFRENBQjxCQEJGQ0dGS0dFQ0NIS0hIRklMS0ZNS0tRUUxITU1ITkpJSE5HSkpISE5PTU5MSk1NSlp0cHBvcXFtbE9RUm5Zc2tnb29xcW9tdF5uWGF0X25vcG9xcm9vdXN0dGpbXnRjd3hyam56aGFhY2ZhYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRJS0hKQ0VFRUBAPkNDQUZDSElNSEZDRkpMSUdGS01MRk9KS1dSS0dLSkpOSUlKTElLSklJS01NTUxJS0tLU2tiWmleX2pjcnJaX1lrb2BlZVVrX2RbYWJRYG1oXGpcbmlpZFpvZWRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3cklIRklERURGQUBBRURDR0JISkxHRkRHS0xJRUZKT0xJT0pMW1FKRkhIS01JSEpKS0tJSEpHTEtLS0dISkpMTExLSUtMTlRbXVRQVU1RUE5PT1VSUFBRT09RSkpOUFFkcWlUWVZbW1xVWVtdWF1cXGNmYWFmYmNmX15ma21obXR4cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzSENFR0ZGQUVDP0NHREVHQ0lLTEhGREdLTEhER0lRS0xPS0xXTUlGRUhJSkhJS0hMSklGSEhKSEhIRUZMSElLTkxJT1xXXk9cXGBeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZFxiWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRElFR0dGS0pLSEVFSkpKRkVISFBKTE1KTVJJSEVBSEZKSUtLSUxKSUdFSkhFRkdERUpHQklNSktUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOX1xeU1teZF9aXWBjX1lfYltgXltVWVhaX15kYmJhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN1eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklJREZLSkpFRklJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRURERUFFSUQ/SUtITltjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtRW19iYV1eY2FgYmJiY2NlWlJZVlddW15jYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkRHRUJFR0hGR0hJRkdKR0hGSEtJS0RESkpNTUxMSEpKSEpHP0dGTkpLS01LS0tJR0hEREBEQEdIQT5ISUZPXWFaW2RdX1RRUlhdXFxcX1pLV1xMUlxZSU1eUVFdX2JjY2NjYlxkY2JkY2VYUldVVF1ZW2FfXl9hYV9kbGttamtsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSUZHR0lHR0pGRkZJTEpORUNKSkxOSkxJS0pJSUdCSEhRTUtLT01LS0lISEVEP0VCSEhBQEZFQ1RdWV5YX1lfW11VWFhQXV1RS0pWXlheW11WWmFSUl9fYmJgYGJiYGNiYmRkYlhQUlJTXFRcXV5eXl9fYGRoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSERSS0ZISEhERktJTVBFR0lKS05MTElMS0pJR0RIS1FPTUxQTExLS0lKREVBRUNIRkFBRkRBVlVFXFReU1ZfWE5UVU5aW01KS1RgYVtfWF9eYl1PWGJcYGBfYmNiXWJiV19fVFFQUVJZU15cXF1eX2BiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJU2NRRVdfSUdHSERGTUpQUEZJSUpLTkxMS01LSkpHRUlOUVFOT09NTk1OSExCREFDQ0ZEQkFDREBMSEJMTFBPTkxGTUZGSElIR0xMTU9QSUxPUFBTUExRVFJVWlhXWVdYZFZPU1RQUU9PUVVUXFlZW15eYWFlZmNoZGxtcXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXk1ISFlNR0hKSEdNTFFRSUtKS0tOTVVOT0tLTEdHS1BUU05QT05PT09IS0ZgRUReTERmY0NMW0heW3NtT01WbVlMQ1BfVGxXZ0pdV1VeRExRVUxNU1ZRUlRYVlRYVVRcVFBmWmhoZVpUa1RYV1VbXFxgYGFiYmJgZ2lnbmxocnp8fX6BhISEg4ODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09USktHYFRHSk9KSU9NUlFLTUtMT1JVUk9QSkxOR0hNUVtZT1BQTk9QUEpLUX9RSXxZWXJzV1BtSHFub2FWUHFxdE9Ca3NucXRwU29fW25YXVZcWFVraFVdVmNZYFlaX1ZVV39pdHV1X2F2X1liXFxmW19hYWFiXmBjZ21wbGBwd3R4gYGCg4SCf31+gHZ4em12fnR4fYB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdKTEZSVkxLT0hMUlhXUU5PT01RVE5PUVBLTE9HTVBTW1pUUVJPUFBRS0laeF1UeGRoWFFTUHZndGxwYm5ma1JyT0x3bWpycHNycXJwb3CAXWZ6dXhxcXpxfnJ9a3V9YVJofGVzc29zc3x9cH54b39yX2BgYmJbYWFoa25rYmxmZ213foGAg357eHeAdHZ6aHJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpRT01OSk5WXllVTFFTTllZTFNTUk5MUElRUlRZV1dRVFBQUVNMSGd4bGN4cW1aSkxUeXB1bXVibnZQZGRJZXZxbXdvgGpmeHhpWHJSaXttaWp6en1seHp/cGduWHV1anZ1cIBhc2h9aWx4fG9fX19jYlxeZGVmaWplZ2JjZGxscHBzdHNzc3lxcnhibHRncnl7c3N1eX6Bc3Z6bnx9eXhybk1KUnROQ0JFUFFJS0xKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSlNUVVhXV09VUE9OU0pLcm91dXF1cWNoYVZuTHFwXkdoeVd2VEtoeH14YHl7c25hXW1vZFNncnVubXlwd2x2c3RxbG1cc316a215fGx1bnxscXZ1eF5fX2JeXV9lZWlnaGZlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tS0taVkhHRUdSUUtNTkxMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5KVFRWV1lXT1NPT05RSVJtSGl3S2BkdnVVV2xObmx7cmFqZ391VEtXa2h9bG1seF9acHp7X2B6c2Nyb3hxaGR8aXJ7XVRLbF92dWxqdnx7bX55a3xwXV5eYlteYmRlZ2ZmZWNbY2Npa2tyc3J3Z21paGRnYGFsYWdzcmxobW1yfGttaGt7dG1ta21PR0pLSEpISFJRTU9QTUxTU1JPU1NYUldUUFdaVlZUVFRhYFFPTktUU1NRVlZPT01OT1FKSFFOUFVMS0tSU1JSUk9WVVFRT1JSWFhRTlBVVFhYWFtbVVFSV1tXWFdbT1JUV1dYUV1YVl1VU09YUldXWFlaYFxncl9bW1pdXV9jWl9jY2VnZGRkY1pkYmdmZm1ubXVmZmdjYGZeXmdgZGxoZmdraHB6aGdna3VqaGdpbFBJS0tMTUtKVFJOUlFQTFZWVFBUVVhVWlZSW11WVVRXVVlYT09MTldUUE5VU05QTkxRUEtKUlFLUU1KSk9RVFJQUVNSSUlNT1BRUlFRUVRVUVhXXFdTUlFRVVVWVFpRTlJSV1VTWVZUWVVTUVVTVVVZWVheWl9hXVxbWl1dYGNcXWJjZGZkZWViWWBhY2FiaGhqbmNhZF5fY11aY1xibWFeZmZnbXNkaWhra2VkY2ZoUUpLS05PTE1UUU9UUVFNWFdVVFZYV1daVlRcYFZXVllVWFRRUEtPWFNQTlVQTlFOTFNQTU5VU05RTk1OUVNQVFBSVFROTE5PUlRUUlJRVlZTWFpbWVNVUlRYV1dZW1NPU1RXVVRZVVZZVVFRV1VWWFxaXGBdV1lfXV5dXF1gYV5bYmJjZ2ZlZWJYYGBiXWBoZWdlYV5fXV1eWlpfWl9nYF5eXWNoa2FoZmhmZGBiZGJQS01MUFFMT1RQUFRRT1FaWVhXWVpaWFhWXWpkVlhZWldWVFRPS09WVFBPVFBQUU5NUVFPUVhUUVFPTU9TVU5XUVRUVU9OTlFUVVVUVFJUV1VaXVxaVlZRUldYVltcVlBTVVVVVlhTV1dUUlFYVlZbX1tfYF9WX11eYFxcYGBfX1piY2RoZ2VlYlliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVVxaWldbW1xZWltkcW1oZF9bWVZWWFJNTldTTU1ST1FST01QU1FVWlVUUFBMUFdVUVZSVFNYTU9QUlVYVVVVU1VYV1teXVxbVlJPVVZWW1tWUVNWVVZYVFNXWlNTUVlXV11fW2BfYFZiXGBhXWBiX1xgXWNhY2dpZWZgWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFpcW2BeYFteXmFgX2NcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWV5cX1dcXmpwd3mAY1xbVlZZUk5QV1NOUVFQUlRSTFFUU1lbV1VPUk5TWFZTUlRSUlpPUVNTVltVVlZUV1pYXV5cXF5WU05UVlZbW1VRVFRWV1hSU1hbU1JSXFhaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2llZ11cZWBhYGFjZF9iX1laX1tcW1lYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFtdXl1cYFxgVlxdaGpyfXNsaFxVWVdRT1JbU1JRVFJUVVRLUlZVWlpaU09TUVVVVVNOVVFSWlJUVVRYXVdYWFNYXFheXVlaXVRVTlZWV15aWFFUVVhYWFNWWFtTUlZdWV1dYV5jY19ZYFtlYl9kZF5eY2NhXmVmaWVmXl5kYWFhYmNkX2JeWFtfW1xbWFhYWFdbWltgXVtbXFtYWlteVl5ZXVBPT1JaUFpVVldWVFRUXl5gX15iXGBVXV5ia3l1bX1sWlVaVlFRVFxUVFRVVFZZV0xSWlZcWlxSUFVTV1VVU09XUVNXU1dVVlteWFtZVVpeWF9eWVxZUldSWVhYX1lZUlRVWllZVVdZW1VUWl1dXmFiYGVkXV5dXWVhYmZkXl9kY2BcZ2VoZmRiYGVhX2FhYmJfYF5XWV5aXFxaWVlXVl1aXV5bWltcW1dZXF1WWFddU09QV1lQXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXaCe2hYWVpUVlRWXFdXV1ZWV11YT1VcWV5dXVRTWFNXVVNSU1dRU1ZUWFhYXl5YXVtVXl9YX19YXFZRWVVZWlphWFtUVldaWlpYWVlaV1ZdX2BfZGNiZWVeYlxgZmJkZmRfYGRiYVtmY2hmZGZhZl9fYWJhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlRcVVdXWVdWXGBhYWNhY19fVltgZGFfenVvaFpcWlZYVlhbWllbWVhZYFZPVF1bYGFcVVVZUFRWVFJWVVFTVVdbW11fX1pfXFZfX1pdXlleVlNZWFlZXGFZXVVWWltaW1paWVpYWV9fYGBkY2RlZWNkWmJmY2dmZV5hYmBjXWJjaWVkaF9nXmJiY2FhYF5fWFRaWlpbW1hcWFhcW1pbV1daWFdcW1xgXVZdXVNPVlpWVlpWWVZYV1heYGJhZGFkYV5ZWWFkYmBrZmheXF1bV1dZWlxcXF9bWVtiVlNXXl1hY1xTVllQVlVVVVZVU1ZUWF1dX2BgXWFdV2BeW15cW15YVlhYW1pfX1peV1hcXF1dXVtaXFdaX2FeYGVkZGZmZ2NZY2ZlaGdkXmNgX2VjXWZpZGVpX2deY2JjYWFgX19bWFlbWVpZWFpYV1tbWltXWFpUWl1cW2BcVV5iTVJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9cXV1YV1tbXV1fX1xaXWNYWVhdYGNkX1JYWVBXVldYV1ZWV1ZdXV5hYmFfYl5ZYV1dXlldXllYVVdbW2BeXF9ZWV5dXl5gXFpaWVtfYl9iZWRlZmdoY1plZmdpZ2NfY15gZmVaaWljZmljZl9iYmNhYGBfXV1aWFtZWVhYWllXWltaWVdZVlVbXV1dYGBiYnhLV1dcWVddXFxdWldcXV9gYmRiY2FdYFhiY2JgY2FjXlxdXFhXW11fXWBfXVtgZFxcWFpiZWNhUlxZT1hWWVtZWVdaWmBeYWJjYGFjX1xiXV9dW19eWVlUWF1dX19eX1taXl5gYmJcXFdbXWBiYmNlZGdmZmdlXWVnaGlmY2FiXGNnYFxpaWNoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXV1hQWFpdYWNmZnJrf0pZV11bWl9dXF5cWV1bXl9iY2JhYV1iW2JkYmBjYmJdXFtaV1hpcWBcYF9dXGFjX15ZWWNlZGJUX1pRWVdcXVxbWVtbY2BjY2NgYmRhYGNeYFxeX19aWFZbX11cYWFfXVtgYWJlYl5cU1xfYGNkZGZlZ2dmZmZgZmdoaGdkZGBbZmdeYWhoY2loZmNgYmBjYl9fX11dW1pbWVhYWFZaVlxaWlZWVUxYWFxnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ1dXV1dXV1dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t8fHx8fHx7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnV0dXV1dXR1dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7fHt7e3t7fH19fX18fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx4xdTS0tLS1JN7fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKh3NxcnJycnQ+KCsrKyolYpKMjI2Njol+f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXjV5+Tk5OTnmXt/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyJcm9vb29vcjIXGxsbGxRdlo+PkJCQi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dn5/f39/f4B5d3d3d3d3eHl5eXl5e3hub29wcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx6enp6enp6dXNzc3Nzcnl9fX1+fn19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dHR0dHR3dXZ3ent4e3h3dnZ4eXt6eX15eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t7e3t8fX19fX19fHt7e3t7fHx8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3d3x8fXp7fXt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d5fnx8fXx9fHh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3t+fHh7fXx8eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHt8fHx7fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoF/gIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl3eHp6enh7eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYKCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgYGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYKCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fX19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qKi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhIWCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYWEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioaGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLioqLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCgoGCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODgYGChISCg4KHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYKDgYCCg4GChYWFhYaGh4aFhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoKDg4OEhIOCg4WDgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4ODgYOEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCgoKBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYmHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+f3+AgYGBgoGAgoKBgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYGBgoKEgoKDhIKDhIWGhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgoKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GBg4KDhYWDg4OEg4SDg4SEhYSEhIKBgIGCg4KDhIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOTko+MjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAf3+BgICCgYF/gYGAgIKBgoKCgYGCgoGAgoKCgoKCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSTkpSSj42Lh4SEg4OCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9/f3+AgH+Af4CBgIB/gYGBgYOBgIGBgoSDgYGBgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgYGAgIOCgoOCgYKCg4ODhIKDg4OCgICAgoKCgoKCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhIODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhYSCgoKDg4KEgoGChoWEhYSDhISEhoWEhIWCf319fX6ChIODg4ODg4ODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhoaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMi4iFhoWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIOEg4ODhIWDgoOEhYWGhYaGhYaHh4aDgX5/fn5+fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoKCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4OFhYWFh4eFhYeFgX9/f39/f39+gICEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoeGhoWEg4SFhYaEhYWGhoeHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoODhIODgoOFhIWHh4WEgoB/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iJiIaGh4iIiYmJiIeGh4eHiIiGh4aHh4aGhYSDhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eHhYODhYSDg4OCg4WEhIWEgYCBgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYqLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEhIWFhIWFhoSEhIWFhYaFhoWDiZSTkI6RjoqGhYaFg4GBgYGCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeHhISFhIODhISFhYODgoGCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODg4KDhYmKiYeFh4WEhYWEhIaGg4KCgoKCg4F+fX5+fn5+fn19fn19fYOHiYqKh4eFhoeHh4eIh4iJh4iGiIeHiYiEg4SDhYSEhYWHiIiGhYOCgoOFh4aHhoaDgoKDhIKDhISCgYKBgYGDg4SDhJGSkY6PjouHhIaGg4KBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoKChISDgoWGiIuKhoWGhIKGhoKAg4ODg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GCg4SFhYWDg4WEhISEhYSFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjZCNiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFg4GAgIF/fn2Cg4ODg4KCgH19f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYODgH+AgIKCgoCAgICBgYGBgoGBgoSDg4WEgoKEg4KCgYKEg4WFhoyTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5/fnx8f4ODgoOCg4F9fX5/gICBgH59fX19fn18enp6f4KCgH9/f39+f3+Afn2Af3+AgIF/gICBgH9/gYJ+fX1/gIF/f35/gIB/gICAgX+AgoCAgoKBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDg4OEhYCBf3x9fX59fX6AgH59fn58fX6Cg4OCgoGBf319fn6AgIB/fn19fXx7e3t6enl6gIB/fn9+fn58fn9+f4B/fn9/gH+AgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f35+gICAf3+Afn1/gYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7f39+f39/fn1+f3+AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZOSjYyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoKBg4SFg4SAgYCAgYCBgIGCgoOBgYF+gIKDg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gH+AgYGBf3+BgH+Bf4CAgIGBgoKAfoB+f35+f36BgIKBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEg4GDg4OCgoKBgoF+fn19fX5+gH19fX19fX19fHt6enl5eXmAgoKChIOAgoOBgIKAgYGBg4KCg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoWEgoKBgYKCg4ODg4OCg4KCgoGAgICBgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoaFhYaBgIODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoCBgYCBf4CBgH9+jpOMh4iHiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eHh4aHh399gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCCg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYSGiIyFg4KCgYSChIOCg4WFhIWDgoODgoODgoKCgoODgoKSkIuIiYeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359f35/gX+AgoGFhYWGhoeHhoeHiIaHh4eGh4eHf3x9fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomXhIODhISUk4CBgX9/f35+hIuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKOi4mIiImHh4eFhoWEhYSCgoKCg4ODg4ODgoGBgYCAgICBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSEhoV/fHx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3x/goOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fX+DhIWFg4WGhYSFhYOEhYWGhISOkY+MioqMiYmJh4WGhYODgoGCgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoODg4KDgoKFhoSEhYWEhoSDhIOCgoGDgX99fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgYCCgoCDg4SEhISEgoSDhIWChJGRjouMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIKCg4WDhIWFhYWDg4OEgoGDg4KDgoKBgYCAf4F/f35+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHyAgYF9ho+Bfn2Cfn9+gIJ8fH9/gYCCgH59e4qCfYB/foGAgIGCgYKAgYCBgH+Lk4+Mi42OjYiHiIaFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/f4B8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICBgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSRi4yNjY+KhYaGhYSEhYODgoKDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317en2AgIB4foF3e4CBf4GCgoKChIaHhoZ+iJWKfoGBgICAf36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fn1+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2LjY6NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn9+f4CAf4CAf399fHx8fX59fH19fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYF8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKMjIuOjYuKhoSGhISEg4ODgoOCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn9/fXx+fX59fXx7fHx8enx6fX5/gISDgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXt6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CKj4yKioyLioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gICBgYB/fYB/f35/fn5/f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH17f357e3t8fHx9fHt7e3t9fHp6fXp+gn+Bg4SCgYKBhYaFhYaGh4WChJGOjIqJioeIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f35+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fHx8fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3t9e31+fn+AgIOHiYmJiomKiYWIkY2LiIiGhYWDgoKDhISDg4KCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foF/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgYB+fHp8fX1+fX1+foyGfX1+e3uDgn19fX19fH18fX19fnx9fH18fX1+fH59fX19fHt7e3x7fHx7ent7enp6e35+g4WIh4iKi4uKiYyQjYyJiIaFhIOCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjY+MioiIhYSEg4GCgoKCg4KBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58fn+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX19fn1+f319fXt8fX58fHt8fXp6eXl6eXt7fn6AgYOHhIiNjImJhoWEhIOCgoKDgoKCgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiYyJioeFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGEgX5+gIB+foB+fX5+gIB/gX5/gH9/f4B/fX5/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCBfXx8fX18fHt8fHt7e3x7fHx8fXyJiYeHhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fomFhoSFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp9fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX5+gH+BgH+AgIB/fn19fX59fn59fYGEf4B/fn+BgX99gH99fX99fn59fnx7fHp8e3qAhYKEhIWEhISFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl0dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIOBgH+AfoCBfoCBgIB/fn5+fn5+f35+hYWBgYB/gIOBf36BgH9+gH+Af359e3p7enx7eoKDgIKCgoKDgoOCgYGAgIKBgICCgYOBgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXZ0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX5/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4OBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+BhIF/gIOBf3+Af4F/gH98e3x6fHt8gYB/gX9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fnt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOCgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICBgICAgICBgIGCg4GBf4CEgH2Bg4SAgIF/gYGCgX16e3t8fH1/fX+AfH9/fn2BgIB+fX2Af36BgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4KAgIGBgIGBgoOCgYF/f4OAfoKChICAgoGCgoSCfnt7fHx8fX19fn16fn1+eX5/f3x8fH59foGAgYGBgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9/gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXx5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4SDf39+fX5+fn+Af4CAf4GCgYB/foCBfn+AgoKAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhIWFg4ODg4ODgoGCg4KBg4J/gYB/f35/gH19fX1/gICAf3+Af3yAf3+BgIGAgH98gH9+fn5/f31+foGCgoJ+f359fn5+fn9/gH99gIGAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt7e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4F8fHp7e3t6e3d2eHVyc3Zxd3lyeIWFhYWDhISCgoOCgYGCgYCDgYCAf35+fn6Afn1+fH6AgIB/gIF/e4B+gIB/gYCAf32Af35+f399fX1+gIGBgX5/fn5+fX1+f35/fnx+gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fX17fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH9/goB8gH+Afn+BgH9/fYB/fn9/f319fICAgICAf39+fn59fH5/fn9+fH2Af359foCCf36AgH9+gYSCgoOFhYKCfn19e3t8fHl3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f359fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzcHh3cXuFh4WFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgH+BgX1+gH9+f4F/gH9/gYB/gH9+fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WHhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGBf4KBfX6Bfn5/gX+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2FfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcXB3dHN8hYaDhIKDgoGCgYKCgoGCgYGBgoGAgICAgIB+fYB/gH+BgoJ/goJ/gIF+f4GBf4CAgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gICBgYGBgoGAgH9/f359f357gZONenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIJ/gICAgH9/gIB/f31+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhol8fH57e355ent6e41+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5eXt6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICBgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYSDgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX+Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt7fXt6fHx7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXZ2hYWDhIOCgoCAgIKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOChISAgYF+gYKAf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+AgIB/gH9/gIGBf4CAgICBgIGBgYKBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg4B/goGFg4OEgYGDgIKCgYGAgIGCg4KAgoKEg3+BgH6Cg4CAgYCAgH+AgH+BgYCCf3+AgoB/foCAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKDgoKAgoGBgoGAf3+Af4CHfn58en18e31+eHd2eXl6fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICCgYaDg4OBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgICBgYGBgIOBfoCDgn99f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX17f316fYB6eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKChoODg4KChIGEg4GCgICCgYOBgoKBgoF+gYCAgoGCgYGCgoCAgIGAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYKCg4KBgYOCgoSBgIGDgYGChIODhISDg4SDg4KBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn5/gYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoSGhIKDg4KEgYSEgIOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOBgoKBg4ODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH96e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKChYWFg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4OEg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX56fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnV9h4eDgoSFg4OEhYSAgoSFhISDgoOEhICEhYOCgoKDg4KDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4SDhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9f31/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92d3+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoGCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoOEhISEhISFhIODhIWEhYSDgoKAfYGCf318fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/f3x9gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KDg4GDgn+ChIODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4KBhIOBg4OEg4SEhIWEhISFhYWFhIODhH99gYR/fX18fHx8f4F+fn5/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KEhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WFhYWEgX+ChH9+fnx+fX1/gYB/fnx8fn9+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhYSChIOGgIKFhYqJhISDhIWFg4eGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhYF9gXWBeoN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+Ee4WDgYSDgH9+fn59fYGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISGhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBzgYN/g4N9gX1+fn1+goOBfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugIh5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9f359gH+Af319fHx9fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB1gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYF/f3x/fXyBfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeHiIaHhIaGi4qFhIaHh4WEhYWFhIKFhYWFhoaFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIKEh4aDg4aEhYWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYqIhYSGhoWFg4WFhIWGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goGBfn5/fX17fXt8fX1/f319f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYaHh4iGhIaFhoaGhYSFhYSFhYaJiYeGhIaFhoaFhoaEhoaHhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhoaFhoSGhIOEhIaEg4GDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISDgoF9f357fHt+e3x8fX9+fXx+fYGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFhoaFhYWFh4aHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoSGhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFhIaHhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH57fHx9f358fH59gH59foB+foB/fX18gH1+f35+fn98fH1+e3x8f3x7e36AiIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYSIhYaHhoeGiIaHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoaEhoaFhoWFhoaFhYOFhYKFh4WDgoKFg4SBfoCAfHt9fnt8e31+fXt8fn1+fnx/fn19fn59fXx/fH5+fH2BgH18fH18fHx+ent7fX6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGiIeJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoSGhYaHhYWGhoWEg4SDgoSHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fHx8fX18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaFhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYWEg4SEhYaGhoaGhoeGhoiFhoaGhYSCg4KDg4eBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19fn18enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4eHhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWHh4eHiIaGhIaFg4KCgoKDhoGDfoKCg4CDgn9/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYiKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhYSFhYaGhoaHhYaGh4eHh4WEhoWDgYGBgIOFgoN+gYGBf4OBf35+f35+fHx9f317fX18fXp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFgoGCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFhoeIhoWHhIaHiYaGiIeHh4aHiIaEhoaGh4aFh4OEhYSGhoaIhYWEg4WFh4WHhoeFhoaHhoaGhIOEhYKAgYCAg4ODgn2BgYB+g4F+f3+BfH98fX1+fXt+fXx9eXp6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaFhYWFhYWDg4GDgYCBgYWCgIB/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeGh4iIhoWIh4mHhoaHhYSGhYWHhYSHg4SFhIiGhoeFhYSChoWGhYeGh4SGhoaFhYaDg4OFgYCBgICEgIOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp7e3x7fHt7ent9fXx9fH5+fnt7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhIeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIOGhYaGhoaGhIWGhoWFhoKCg4R/foCAgIF/g4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18f359fHx9f358e4iFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYSFhISGhoeIh4WFiIaJh4WDhISChYOEhoKEhYSFhoSHhoWFhYaDhIWEhYaFhoSDhIWFg4WFgYGDg39+f4B/f3+Df3uAfX1/gn2AgX1+gX59fX19f3t/fHt6eXp6eXp6fHl6ent7e316e3t7e31+fX2AfX18fH2Af318hoOGhoaGhoOEgoWChYGBgH9/gIB+f4CCfH5/f36AgIGCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWGiIaFhIaHhYeFhYKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SEg4SDhYSAgIKCf319f35+gIN+e398fICBfYGAfX2DfH5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5/gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaEhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDgoSDg4B/gIF+fXx+fnx/g318fnx8gYB+gn99f4J8f359fX18fHt7enp6enl7enp6enp6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKDgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIaEgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhISFgoKCg4WEgoGBgYKAhYOBf36Af358fH59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZMPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dXU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXU1dXV1dXV1dXV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vKysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19jc3d3d3d3d3d3d3d3d3tvX2NfY19fX2NfW19fW19ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLmzeHNzc3Nzc3Nzc3Nzc3CSu7i4uLi4uLi4uLi4ubCKioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7s6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OlmTIpKysrKysrKysrKyolYamkpKOjo6Ojo6Ojo6WVU1JTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7QEM+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0dLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpps4LzAwMDAwMDAwMDAwK2WqpaWlpKSkpKSkpKSml1dXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87PkBAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzdDS0tLS0tLS0tHR0dHQ3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaugRT0+Pj4+Pj4+Pj4+Pjlur6mpqampqampqampq5xiYWJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPzs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Ozs7Ozs7Ozs3Nzc3Nzc7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs/Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0crKysrKysrKycnJycnJzNLR0dLS0tLS0tLS0tLQzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7Ozs7P0c7O0NPQztLU1dTQz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbY19fX19fX2NfW19fX19bW1tbW1tbW1tbW1tfX1tjY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Ozs7RwafR0rmPvtScgoSKxs/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Ozs/P0Z2Pw8KUsJyxlri5r6HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q+QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/P07qvqr6koIuRw5N9fq+w0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Pz9OfsZu4m4edutTSzZ6ew9DPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz9HAnImbsJuQn6DS08CgoNDP0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Uo6KBnqqrr5GhudevoqnU0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDRxJ+Be5mWopqtm6nYo6G61NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q1auvvMDRhZWmxZii0Z6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzs7OT0+PT07Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJh3+Fn6CfnJubrcefodLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NDc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HG09PVnJjDp6uknsW0pKbW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg0tHS16iHzc2SkKfXuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dLPxdTUy73V0tHC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojw9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS09TS0tPV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ojw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk4NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87Ojg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzs4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VGQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg3NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2Nzc4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2loeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCDdnR8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0Nzc3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q6ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqZG1nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp14cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW1tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampubm5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cnJucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyampubm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVGJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFNfTUhRSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipamnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxlY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSloqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGhiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaatpqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6qsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paGJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpamnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaChqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYWxodWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2s7qxqq60sbCxtLS2vLy+vLy9xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyak5aUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsPDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbGnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb2xocXhveWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtoZ3VaZnJ3c3hmZ11kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/JxsPDxMLEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpoXWpvbXh3Y2JgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIx8nHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraapu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lpdG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBxsHLy8fGzMnNxcbGw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZXRuc2JcYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBw8S/v77Ey8jKy8i8u8jHyc3Iw8jJycbFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7u721s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JvZmVnY2pkYWptbm5eWFxWVU5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbBubvDuri5vL7BxsHGurnJycPFxMDEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmZjWllZXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7q9wLm9urq0v7i1t7Ovu7y3wLe9wr/Bu7/BvLvFvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYd9cWNgYmJnamZmaWVpXVZVU1lPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1usG4vri/vL23tbewrri2ub+7wL+3wby7w7a6yLi2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2dYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8tru8wMS5t7e3tbq5urvAvcPAusTCvse4ubitt7W4urS3s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg9PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9v7vEt7a4tre/v8S8wsXFx8fKycbPwsG4rrW1vL64u7K+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG53Y2dhXGNRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD89Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuqo7C5vb6zvL68xbiyuLm9x8nKw8fIxsbJyMzO0czKxLW6wMPIv7+1v8C/xsa/y8bDv8G8wMPMysfFxsG5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmBhTkhNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0vMO8urq+vMS/t72/vcfMxsfJxsa/xMTKyMzMzcvGwsPLzsK8ub26ucDDv8jGxMHBv8XAysnDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPj5BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8trq9wby7v7a/wb+8v7rAy8LHyMC/vLy/xcLHy8jBw8DAycrCwLu7sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnptc3hzZ3BdW15cWVFFRENNSUFEPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7u9usO7t723ucC7uri4tcXBw8O7ubO0usG9v8fAucC8vsXEvb65srCuuLe/w8fDxL29v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG5pXF9fWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnBwLe9ubi5trW/s7SyuLG7wcDDt7etsLW4uLjCurS7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9lXVtUSjw+P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+3ure2trK0wLaytLizusDBw7m4s7KytLK3vrqztbK8ury2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZybF5iYFtdTkhBPz1IQ0ZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u7y4trq2scC6t7m4ubvBwcTEu7u2tLSwtrq2tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybmNcZlhcXVJOTUE+SkJASklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOxrba6rqy8sri5t7u/vbm+wLS/u7y6uL7CvMLKyL7AuLm2srS2s7SvrLu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxBRk1GODY2NTo2Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vbWyuLS5urW5u7W1s7W7vMC7vsC0v7m5urG6w7zCysW/u7+/ubS0s7GxrrC5uba8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jo6OhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmJ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIP0hRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmura+ysrq6t7e1tby0r7Srtrq4wMTBu7W8vbiyrbOwr6yutraytLSvqqSem5ycnqion6CoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKqrnqWim6OclZCMj4+Pk5CXlZaYn56empmml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR09NTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6Wsqqi1srGwrq+yp6avo6+utcG6tbeyt7aytKuytK6qq6+wsrOtpZ6SmJSPmaCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6apsKOlp56gnJWTkI+RkJiQlpWYl5+Ym5mbo5mXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01JSEdOUk5KTkc7REA9Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiYl5ahqKyutre6ubq3t7uuqKChqaGgrauqpqmkqaOkrqWsrLS8t6yysa+xrbWvr7O1qqetrKOcmZSOkZaXmZmcoKOim52lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmZabl5eYoJ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHh5YGJSVV9ISUlLU1RJUlBMOD5CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OTnJ6jqK6trKurr6qvqZ+XnqWenqWmpKCin6agoq6rrK21sramr7Srqaq0sbCwuK2noZydmpSYm5qRjpGVkYyPjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrbGxtKmxr6KZnJ2eoZmbm5qYmZuUlpuWmJyloaCao6GanZmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVbU1pZTVFKTk5VTFJMQTc+Qjc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0/NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkpyYoZ2qoqegnqehpZ+ckpyim5+ho56doJ+joKKvrqyvsay2p62xraamsK6trLCnoJ+ioJeRlJyhnJmXkpOfnaKkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7essbSjoJ2loKyhoaKgoJqYlpafm5uYpKGgnqShoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFFVSEZVVkpCTUc9Skg4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjpOemaidrp6nnpyhnZ6amZKZnpyioqCgnaKfn56fqaunrKmqtKurraulpauoqqyqpZ+emZKSlJiZlpaWjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oauiqaiyqauop6iamZ6aqqafmaegn5+nqKWknp2qoqKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JWTUpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiaqqCxorejsKagnp2dl5iWmZ6bnKSfn52knZqdnKSipKOiqq+sp6mjoKGsrq6qq6agnp6ho56enpudnJSTlZSenpiUhp6aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLS7xcO8wru3s6myraqztK+zrqquo52rp7axrKKvpaCjr7GtsKSkr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHJra3VycGhXW1FFVEhESU9IPkVBM0VIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goZ2cmJufoJugn5+XpZ2Vm5ufmp6cnqWmp52goKuxrqekpKOgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr3HxsK3w8nIwsDFvrm0ubq1u7ewtbKqurKuu7a+urqqt62rqri6tLyurbijpaKep6Wio6mmmZufmJqdp6qnoKGhpJiUo5aUmpGcnZ+knqefnp+inZiZlJiUiIR9enJrZGhveGplWltGSkxERFNMREJENzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlZqWlJukpp2hqqeiq6y8vL/DwbOyuKehoauqop2eoaKenJugkp+fkJafmZKalp2bmaOhr7OpoZqdnZ+fmpeYl5KMj5aXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3MyMnRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXS08zT0NPTzMrCxcbGysfOv8nQy8bExsTBu8PBvr6+tb2zrb+/wsPGxMfErr64sri8xMHBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURCQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5ibo6yen66mpbGqxcbMzs2/sMKppaitraqhnaOfnJ2aqZOZoZCOoJONlJKXmaSxsaukoJ2gm5mXlJOUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fR19LU1dPTyMzHzc3J0szO083Ex8nKwcXLxsjIxb7Cs7PHxMvKys7Fyr++v7zBx8TMzMjJv8O/rbCzqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYt/enJ1dWdjZ3ZpZFZXUURNRkBJUUI9Qjw6MjNAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK20uKyuo5+ko5+gpKyblqmWjZeNjI2XprCupZ2enaGloZ6blZSWlIp9d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HT1NTTz9LD0NPW19XW0svJztHLxs3SytLV1tnV19PW2M7Syc7RzM7QzNLPv8fGysPMzMvOz8XGx7a/yb/SzcvPxcnIv8PCyM7Mz9DPzMrHzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHdzdm9jYGVyYl1SXElKRkFFSEk+O0A4PTQ1ODU6NzY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopuppqKmq5qjsLGpqLXQ1Nfa0sfGy7S2wsaytqmipaahoqu1p5qxoZWUjJCmrauclZihnZuhop+cnZuVindpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTPz9XU1NHSzNHO09fW09XQz9LT0cnT0cjQ2NfY0dfS19nV1szOz8nN0cvOz7/FwsfFzs3R0NHIy8zAysvF087LzsjEycbGyMzK09PR1c/SzNLBucWxpai1rqeaqKylnbKosLOsrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMe3pxc3RtYWNpbV9WUF9KSkJGQ1FNPzw+NDQ6PTUyNzU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamgr66qqqyepq64qKu32NTV2dnRztDAvMzJt8Cvp6upo6SxtrOjtqmoqKGqqaGYlpiam52hnpqdnpR+cmVjYl9fYWBfYWBfYGBfYGZtcHBua29yd3ebzMDS1dPY2NbZ0dLS18/TzsvTzdXU0srPzNPW0tHWzc/V1dHG0dTK0dTV1s7S0NjY2NfLyM3Dyc7Mycu/yL/Iyc3Nz8vQzc7Lzs/Hy8/Qys7KwsnGyczKy9HSzNPR0M/Pyr3IubCtu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHl2b3Bua2FkbnBhV1xaSUZGRExXRTtAPDMzPD04Njg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabnqOnnri2tbWtpa2uvrSxwNnS19rc1s/Ny8PT0MLCsqutrqyms7G4q7LOuaufnJaUl5uen5+dlJaXlYlsXl5eYWRiYGBgYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHUy8zQ0dPKztHV0tXVysDKwcXMwsjJwszDxcjKys7KzMzPzdPLxcjPzMjHysTGwMXJy83Q0cbQzs3NzM/Fx8C3ub3Dw73DubKzvrG8xMS1qpiloZmWkZWVkouUjZuRlJSPj5SCiYV4cHFrbmhgYHFoWVhoVk1HTElQUEI7RD47Njc6ODk6NTY9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXFw8G/u7WyscfDucvV1tna29jMzM/J1tbFxLiytqqkrqy5ubC21aGVjo2YlpCTkpGWlpaQjHxlYmJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytLIy87NxtHSz87M1MrHy87Px8fP0svQz8W6xL7Gyb3CxsjOxMLHwMfNx8PLycvPx8PDz8jGwcbHw77Ax8vLzM7CysvIx8vQxMXHu8fDyMjCz8C9vL+wwcrHur2qsbKnpZ2inJiQm5CkmZeZkZWYiY+Cd250ZGxgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJuls7Gsyc3KyMS+vbrNzcbQ1dXZ2tvY0MrQ0NLUysW6vr6wqLervrq3wa6Rjo6WkIaDhISCfoWFf3RgW15eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsjGwsPAw8fKycjKyMHFzMbIy83JxMLLycLCy9DEy8i/ucG7xce9v8bPysO/w7vJxsi6x8bEysC9wcvGxcO9xby8v8PEy8XFvMDJwsXH0sXAyL/KysbIxtDDw8bDr8TLx8TKt7+8urSprKWlmJ+YrKOhpZqjoJuUe3ZzdGZqW2FubVpbWFFETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPHzc/OzdXQ1tnY2dDN1M7P0MvEuMbBtrW8scC3urCRjJOXh3uAhYaAdnh1cnBfWltdYGFiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsba6srKzsrHCvLy7ubjAwcHFvr25vb+5xMrFxsK9xsC4u8TJv8LJu7e7usXDvrzBzcLGvr61wL3DurzGu8K5s7zFw8LCtr+1tb6/usvDvLW6yLq/vcvDwcXCxsjGyMbQxsLMyLLHysPOzcHFwr+9srews6eoqLmxpa2wq62slHl2d2plaGBob2NWXllKRUpGSEtBRkJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfGwsTIztLLysrHzc7P0snRxtbV1tjOzNDIzcjKxb7KwbK1ure7trCRjYqLhXmAhoaAfoR8dHVkXFxdXmBgYmNiYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLS3tLOys7q1vbG3sLWvsrvCvMHEvL+7tbK6vsC4x7m0u7bAwry3vcbAw7y1rrK2ur6zxLe7tau4vL3AvbC6ta+2urLFvLavu7+0trTFvL7DxcDDxcbIy8bAxsa7yMu/z8rHw8bBw7fDvr22ub7Gv6y1urW3to54dHhnZ2Via25eVl5gRktISEpGQkNBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy87IxsnOzNDNzsnLyczKy8bRz9PRz8jLxsrGxMC9z72zub25uLecjoeJiXt5foaGd3iCfXRoXl1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaGZqbm5yfKTHv7m4tbCsrKeeoqqnnquss62pq6mzrrawsqmupqyyvLq2w7m6urGqtbm7tMK6sL+xvb27tbvHucK3raqosLHAtbi8r7CnsbO0u7yrrbWlrrauurGwqrmvrbuuu7i7v7+9ucK/x8PFwbzGwcjLuMXHxb/Hw8O6xMbCu8XJzMuzucK8urKIcnZ2a2lhYmxoWVhXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj49OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxs/SzMTGwcXQyM/CxMfBxsbFxczEy8zCxMHIwbq8u8q3tLy9trWrkYmQkHx5foqFenuEgXduXl1dXV1fYF9fZGNiY2NiYF9eW1taWl1aWllaXWVub2hmZ2lrbnKBrbmwta6mpaenmqCkoJqcpauuo6eiq6qsqrCjpp+qrbW2sb25r7ivqK64tLS8uLO8r7e5tbG7wbHBrqWooqyxsrOnvKqrqKusrbS0pqiuoaSvqbKlp6iupai3rLCyt7m6u7G8vb6+xL+1wcHHyLe/wMW3xMK/u7/Ew77EyMzKv77DwMCphnJ0cmppXWFvZFdWWFBIWlJTS0ZGRT4/QDk3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7rEsLawm5mVnJiqqbCxs7W9r8bR0M3EyLu7zMPMwLzKucDGwLzMusPHxbq9xL66t73Guba5u66ylYOJjYF7foB+eHR/fHN3Zl9dXFxeX2BeX2NjYWJgYF9eXVxaWFpbW1lYWlxfZmtmZWdlaGtvcoWqpaymoJyhpZSepJuXkaGjqqOin6Wlp6WsoJ2bpKassq+2t6ewrKeqtKu0ubC2tKy2uLGwurmxt6Sfo5+nsaerqLmqpKanqKeyraCnpp+bpKasnp+npJ+gsa2trLK0srSwtby2u8HBsrq+w8GyubrCs8C9v7W4u72+vMLHxMLDv7/EoIN3cGthZV9rb2BVWV9ITmhPVEdFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Nzc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbu+taCelZ6hprq2q7Ozu7PF0MnMw8e5uMnCzsG6y7m9yLu3yLu3xMazvsW8t7C5wLuxs7ewooSHh4J9eXZ0b21rampxaV9gXVxcXV9gX2FjYmBgYGBdXFtcXFhZWFhYVlhbXV5kY2JlZ2dnam1viJ2poJeVmqGWm6KYlY2eoaKmm5+fo6Whp56bopufqrCtsbWiqaqpq6yktbitt6+ssrSusrWusKqfnZ6jorKkpam4raGmpp+orKuZn6CemZ2fpZqZo5ybna+pq6eqq6ytsLK4r7i5u7C2u7u6q7KyubK9tLaxsbW0v7a9wL3Dwbq7vZeDenJrX2VeZGRYVFheSVddS1BHSUpGQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmbpKbAsq+2rLS3xtDJycHHvLzFxdDAvMq7u8G7tsW4tcHBs8LEvK2qtbq3qLGzqYuGiIB5c25wbmtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWltZWFhXV1dYWFhbXmJkZGVmZmhpa3KNqJ2UlJSbmJuhlpaQnKGhqJ2bnaWmoaWcoKCamK2ura6yoKWiraunobWwsbGsp66yp7qzprahop6ao6KtoqGptaqio6adpaajlpiel5manZ+Zl52cnJusoaumo6Smrauzs6q0sLKqsrm0r6mvsrKyt7Ouqayusriwura5vb+3srGUhXl1ZV5lXltZVlNaVUtbUUxJRUhLSUI9P0FBQEA6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vb+znaWjmKWxwrW2va20uMPNycjBxrjCwcjQusPGwLa8vbbDura/wbW7v7uqprG7saiyr5t9hYWAeXBxdHFoZmRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hYVldhZGVjZGVkZGhqdqKclJSPlJaXn5eZlJifnqGclqGhqKOfnqicm5qqpq+wq5ujo7eqoJ+uqLappqassKO3sKS3oKKbmJiqpqGbrLivoqGknKGfoJOVoZSWlpuYl5aXnJSfqZ2po6Gdo6qqsK6otKuqpq2ysKWqrrKxr7Cur6anp7KusbSvvLS5t66jlIF5dWReYVZZV1NSVEtNXkxQS0dHTEtFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp6np6Oqu8C9wLmutLjCzcjHxMW+x7rKzbXExcWxv8C5wMG6wMC5ur23qKixu6apoqWJgX54cmpscnRwaWhlZGdiXFxaWVpcXFxdXl1cW1xeXFtcWVtcWlhWV1dWV1hXV1dVW2NjYmJjYmNkZmqBlpOVi5GUk5uZnJaWm6Ccn5Wgn6alpKann5yfpJ+qr6afoqO2qKChoqizoaWnpK+lsK2stZ6gnZWUqaGhlKyxsJ6iop2emJuTi6GUkZOXmJKXl5iWnaabpqGimaOlpaukpbCnpaOrq62lqK6vrquoqqmzpaarr7Sxrry1sa+voJJ6dnJkYVxaXVhOTFFHUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuyt6yepKett7u8wcW6sbm1xcrLwcTHx8m4yMa1xcLJr7q8wrzDwMG9vLe6tqansraeooqZiIB3b2RiZ2loZmhqZ2ptYF1cW1paWVpcXVxbXF5fXFpZW1lZWltXVVhXVFRXVVNUUlVgYF9gYV9gYWNkaYGUk4mRjpSSk5yUlZajmaCWnKCloa2lpKSio6GbqqqlmZ6lsamgoJ2kqp2noZ6srKmora2ioaGUl6ObnJCrqbCbn6KenpeYk4qeko2Sk5WPmJiSm6GinKSgoZWgoaSmm6OrpaKkqqOrrqSusammpaamtKapqK2ztbS5uq+qrJ6LcnBvYFtXVlVRRlFPSFpcT1JJVEtTTEVHSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Nzs8OD41OTg6ODg2NTk6Ozw5Nz88OTU3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7KwrLKtnaenr7m5s8DIurXAr8bJzrvCy83Jt8u/tMDHzLC2vci7wsfEvb+3urWlq7CunZqHjoN8dWlqam1oamxua2ttZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV5eXl9fYmRtjo+EkYaPkY+Zk5SSnJqinJugp6iqqKqmqKSjmKSupJSZpa+pn5uYmqCerpmbqrOfpaafo6OhlJOblpWSqKmtmpygoaCalJCMmY6LkIySjJaUkJ2hoKOcm6KVm6CioJeiqKOiqKugq6+krbelo6OirK2pqKuvs7iyvbWzq6+Yg3JyaFtYWVNVUkVZTFBcWU1UTlBMUFJJTklCPD8/QT89NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzAxNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s66os7auqaivrZupqKy3tqy8yru2v6zMx8a5ws/QybXGvrq+xsu1sb3FvcPGxL3Bs7mvpquvq56XhoF3eG9uaW5ubnFnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVVFNOUFFZWlpaXVxcXl9gZH6NgYt/i5CKko2XkZeZoqCbn6qppq2qp6+ip5mfrKCVlqSop52Xj46Zna6Wl6eqmZ+dlKWhnpKQkpKSlaeqpJmZmp2dlo2Mi5SGiI2DkIuSlJCgnqCjl5WflZqgop6Tm6Wlp6iooLGwprC8p6CjrLSrraewtLC5tcCxrbGrkH1wcmJWVFVOUklHVlFTUkxMWE1KTE5SR01LQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NzYxMzIxLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OtprG3qqaisKudqqepsrGktsa0ubqzy8a6vMPL0cyzubq+wMTHtrS3vbO7vMS+wrG0rrGusaycoohraG5vcm9xa3BrZGZnZV5aWVpZWlpaW1paWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/dYmOh5CJmImUlJebmZ2om5+qpaSqnKeYoKWbko+eopqXloSDkZqjj5OinJWWlYeimpqTi46Kj5mjp5yVlZebkJKHlI6MgYuNgJCKkpKRoZqfoZWTmJiVoqWZjJmkpqimoaC0sqeyt6Gdoresqq2ksrKmtby1q6uxo4h4cm1dTlBRTE9DTk5OUEtGTk5KSk5NUUlNSkFHS0hIQz44NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSopLS8xMjc3Njo5OTk5ODQ5ODhBN3e2p6S2sKSnpKmloKmlpLOqorLDtbWys8fHuLvEys3Hta+8v7i8xLOzrrairbXEuruvqqy0r6+gl6h9XmBnc3F2cWpuaWZoaGpfWFlYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU5NS0xTV1dWWFhZWFtdYW9zdnGFiIKHgJGDjoqUkZOdoI6anKKho5iklqGblY2HmJqMc42CfY2WloWQmZCTjo57mY6cjIKKf4mYn6KekJOYloSOgpN+fnSJjnqQhpKQkJ2amZqQlY+djqKjjomaoKGko5uitK+sr6yfmKW5pqWwobCunLC7qqmvqpmBdnJiVkxRT1BNQ1NOTFFNQ1BQSElOU01ISkpESkxFSks9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNDg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd3t6KjtKilpaijpqWmpqazp6W0wLiwtLDKxrm6ws/Hv7WvvcOvsceyraeslaSuv7ixsJ+nra2rlpWicldWX2hnaWhpbmNqaGdiXFhYWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5Yco+Cl4aNnJeKk5Cfl52VlJaUjpaJf5OJXztXb3uLk4l/i5GMj4WGc4qEloF5gnqFk52Ug5WOkI+Chn2SeHFvhY1+iYCQjY+XmZiTio+InIiel4eIlp6aoaCXp6+oramon5ettKKmrZisq5intKKpraOSfXFtX1pOU1FWTERUSlBNTEZPT0lFTFFNS1BKSU1QRklIPTc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCgrKy0zODU0Nzc5PDo3OTs4NkE5eLego66hpqaqoKepp6KpsKintMG5sbWwycO5tL/PwLqxsbjEq67Jrqejnoaborqtp6iWpqWkoZePlmlRTVJWWlpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1vaXuCdFBCQH+VkZF9iZSMhIqNm42WlYqSiIaVhnmIf2BKUW54ipGEfISMiYR/f25+f5R3dXZ4hI2ZcFGNiIqGe354lHZnd4WIfoqIlYqNkJKWi4OJh5SEmoyBhJKblp6clKSjp6mlo56bsKuhpKSQpqqWoaqcoqaoiHRrZV1bSFFRU0xJVU1TSUxMUElIRktOTE1US1FRT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj03Ozw2Ozs0Nzg7Nzc3NTM0NDY5Ni8zLy4xMjUyMjEvLCcpKiosNDgzMzk3OTo5OTo6Ojo/OXa2nKOnnZ+hrqGnqKWnqK+sqra8tri2s8K8t6i6ybm3qaq3uK22wKqim5ODj5myn6KajaCWmZSRi4xlTUxOTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+GgXuFjJKBkpmLj3uGj391f3hzbnVwdI2NgXl9iaqFeXpodnuOcHJteIGKjJJ4eoB7gHZzcpJ3Z3WEhISEepWJiIqMi4B/hIqMf5SDe4CPmJSblZGfnaien6CeoKmln52YjKekk6Cglp2epH9xZ2BcXEpWT1FHS1hST0pNTVJKSkpNUEhMUUxSVE1FSEE8Nzc7OTk+PTo7PDk4QD86Oj49Nz09Nzk5NDc3OTU2NzUyNTI1NzIvMi4sLy8yMDAvLSsoKCkuMTI3MjE5ODc5ODc3NTo8PDd2rpijoZicnrOpr6mlrKywsaq9tLK8uLa6tbKgt7uzq52fraustbOlnpaSmIaUpJadjIOXiY+JhoaDZkpJSklHRkhIUFRUVFdXU1RVVVVWV1dXWFhYWFhZWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUlNWXnWDfXlnd42XmI6PfWd5gXZ4f4mPfISYkoFyh498dntva36tfHOQin97hpKAfX90ZnZ8hWxvaHN8iYyHgGx5cX1wbXWPcWhxgH2OcEOKhIKDhX53d3qLhX2LenV+jpKPmIqSmpujl5mdm52eop2WjYqkm4+dl46WmI51bWtlYVlXWFRRSlJVVE9QTlFWS05LTk9KUU9JT09LRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXn56WoKavrK6rp6mwr7GsvLisu765s62om7GorZyQl56nrKekm52TiJZ+jpWSlYB8inqFgH9/gWVKR0hGQkBDRElMTE1RUlBRU1VUVFVWV1dXWFdZWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXlie3hvfHmIj3l8i4VvbYyReHN4amp/gnKWkYuBfZZ/SZKYbmh3foFsaWNseYWQkoZrc2x8bnJ7hmhtcH5zjYiDhXp9fnt2b3R0hYJ5gXdwfI6MipODlpeYmpCTlpeZl56XjIOJn5GKkoyGkJZ9bGhtbm1XVVdUUVFZT1NVVVRYVU1OSE1KTU5LQ0lOR0VAOjg5Ozk5Oj48OTw7Ojo9Pjo4Ojs5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp6kra+iraqota+urLS/q7zCv6ajmpWlmJ6OhYyWoqSbmpSXj3aRfoWLkI98eH50fXh1d3xmT0VHREA8Pj5BRkdHS0tLTVBTUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpyQZlvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX5wbX96i4h1gYiGdGyZkXRze2prnY5MeYSSiYSOZzF2hnNsfn2DdGZldH6EhIWAZmlsdWtwf3xncHB7bpKNjntzfXxxcG51bYJ+d3l0aXmJgoiJg5aTkpCLjZGUlY+XjoB5iJeIhomGf5CHdWlpbmdjV1FZV1hZW01QVVZaWU5JSUVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LCs1Nzc1NDc4aU84OzVukoiZkZqWpKitnrKeprquq7KwwrK7w8ebl4+UmYuOhnqFkZqWj5KOkol0ioR3i4+Mf3Z3dXh2b3hzaVVGSUQ/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+zoHF8eG19bXGDgYWBeYSGhnlyoJR0eIBzdZSHNXGdqJ2OoaGEooR2cIZ8h3xzjK2NiIBoZmJpbnJtcIN1aW9YdW+OmpF2bH96fG1xbXB/enN1bWJ2hH+GgIWQkYqLipKLkYyLj4N1eIuPgH6CgH2PeHBubmpeWltdW1lYYF9TTltbWVhMSEpGSkc/Q0FCRz9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp56vlaW0qK2xrsGzusHGl5CMlJCBiX1ugpGTioSLiJCIdoSFb5iKjH95e3txe3R8a29eSlBHPkA3NDU4Ozs8PT5AQkVITExMTU5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx2iIh8fYWDf4x+dqKZeX6GgISZhZucYYaqn52LgpCNenaJfomIjnOKl4+De1xkcXR6e3eKbGdpYXhvhY+Cem6Bd3OEenBzeXdrbmldd4d9h3yIh4+Ai5OXg42GjYZ9cYR/hHx1d3t9iHRtcXJkZV5aWl1TW2ZeWFFVWV1WR0tLRUxHP0ZAREM/QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyMd4l/lIyRnZ2fppGgqp+wqa/AsbvGupaPkZSIeoZ2a4CMkoN+i4WQjXmEgnWiho1+foKAc4OBfWx5bFNYTEFFMzExMjY2Njg4Ojw/QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXtxfI+Me3yJhn6Xh3ahmYiHj5KUpY2sqUiGra+vioCAk4qCi4KEkaiHgJiYipxzbHyBhod9jmhnZ3h+boWGgYVxhIZHa4B3cXl2aG1rX3d9g4h/iIWMepWenIqLiZF/e3WLdnx3bW93fn1xcXBqWltbWmNiV2dlXFVQUVhaUURMTEdPSUNGQ0NBQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFh5GPlpiSl6CdrKGmuK+zvbSXjZKLmIt9dHB/ipN/fo2DlJV9hn+HpYeJgIOIhnmJi4B1hXlfY1ZMQzYwLi8yMjEyMzY2ODo9Pz9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYCEgoWRk36FiZGBmpaCoKGYlZuapa2Tmbuxp7vHw6eKjKGljpOJgZB7coOen5GcfnaFhYuPh5BpaG+DgHSMhoSLcYaCd4d/e3aFfW52dWeBlI+GiYiIiYiiq6OWiY6YgHuCiXp6b2dreH13fHFpY1xZWVxoXGFmX1pPTE5YU1FJUEtETkdDSkRDQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnZwZ3iDe4CMgIGQj4uamqScoaymq6+wl5KRhKGUhHh3gI2UfX+ShpOWfoqBkpuOhIGCjIuCio6EgIqAbXBqXkNBNC0tLy8vLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1RUUlBPSERCPDg3LzlDPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6ChkqOppaOsk6i2oqfBwq7Ir3i6lJp8jKGemISThYKPoZ6TmZKEioWPmJGWbHB1iYuBlYyNj3aPhHFshYGKlpKDhYhyiaGXh5OJj4+Xpbapm42VooOHk4R+f2tqbH1+fX9xX1tiXllmalxsa19YS0hPU1FOTUxGSVFERE5GQkNFR0I+OTk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwg3B1h3F2kYZ+l5aalJ+fm6egqpaTmJ5oZqSafoWTknqBkomSkn2LhZmSkYOBgYuOiYaRh4SIhXh4f2hOUj4vLy4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZunpqKZoZeilZyfqJ6pq5+orKmqtZerv6u2yMm3yNHPvpugcGmrqZ+Ek5KFnKCampmnkZGIlaKamnd6fpSXkaGSlpeBlJ57dpWSq7OJjZegfZWenI6Tlpqko6e2sJ2RmaiIl5COgYhsc3N7fHluZl5bX15hZ2NfZ2dcUkVLS1FPSUpNRkZNQ0hMRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTQ2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYzQUBpYl5QcXVgbn1hd459fJSOjoqfkpeelpyqmJ6qQkR9h4mImI15go2Ljo18ioaPkI6Bg4CJjImFk4WChomBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49RkhAQUA4NjYyPDk7RkhHSUlNT1FZbYaQd5WLo6eqtb24pa6srKiptayxt7Kyrbuxs76cs8Ssu8nLuMO/t6WjsLKsraqji5aYhaWmoKKYgqaZjaKqqKSHhZOjoKCqoKSpjpyxi5Wjp7e7nKGjsJOjnaOekaSiq7Cts7WilaaqiZqKk4qVent+g3tlXmZaY2BdYmJeZmdfW09ESkhUT0ZITEZLR0ZGSEFLRkNGRkE6ODc9PDg4Ojk3NDY1ODw1NDw3Njo1NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoGUhYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMj4uKe4iDh5GOg4WBjIaFiJKGgoSJhoeHh3FuYUBFNjQ8My8xMTAtLCstMS8tND9EQU5WUVJUVVVXVU1cUUdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHHxKuzxbattMCzuL62v7TBtru7pLjGqbbJx7a+ubSoo7StsLGbmZKan4mnr6qklXefpJehq7GzmJapraiutbuyuqyvtaKxrLK1vLi0rrWgqKijqJupsK2zuri4qJy4qY2lj5KToId5gYByV19iVWRgYGFeX2ZgW1VKREVMVlFJSkpFSkhFQUBAS0RCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxcWlFjZFd6dXGBlX2EhpN2hn6AjXu/u6O8grSUk46bj4SIj5OKiXqHgYyTjYeFgY6AgYqPhoCGiIWKh5F6eW5dV0BFTjw2OjQ2QUI3NjQvLzZDSENRXE9RVVdVXVdPX1VJS0pBQD9HS0ZGRDs+QDdENz9CSkpFR1dUUF6PpK2ksrTDtrjBzMq2u8S9s7TBt7jCtb+wuHSxtKa6xaSwxrmxs7K0qKS2tqqxoKKWm6KSpbGtpa2sp6SYoKyzuqKosrm1u77Mv8XFvb2zwre6t7+4uri6ra2xprGqrr6wvbzDw6yZu6iVro+YmauJfoB5aFVhX1ZoY2hkVltjWVZUSkhHTFFHRElKQUlEPj9CQktAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldUWVZad2pwf4+EgY6Fb3tyeIhiuaGZo4mVlJaTlJSOkJeSh4d7h4GOloqBhIGKenyLiIZ8ioKBi4SVfXh6dWZPXGRHRUw6UWRgW15TRj87SFBEWmNRUVlZWmdaU2BhTVNPRUE/SUpIRUZBQEM9RTZCP0hHS01TWlRelK+4tbu5ycC7vcrNvLzBvLi2vLu3vrW6s8ZhdbKlsZqeq76qpairqqSisrWgq6eelZaemJ+upaenpZ+kk6KnsLOosrK8tsG908nJ08bCxczCysTAvr6/vLy4tLC5t7fDusa+xMmwnrqroqyPpam3iYB8bl1fXlxVX11oZVNYYVZTVklFRk5LQT5IRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFRSUE9RUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASk1QUkxRXWhtbHGPjYaQc2xycnSI1cC1mqCNlZmZkY6XkpaWjoaIfYeDjZaKfoJ/g3l7i4SHe4t5gYqCl390fXprZXB2WV1cUGVlYmBlZF1bWFhcTWRtVVJtbl9vX1hnZVVZVEtEQktKSEZISEhIQkk5REBIS1RUVl1aXJO5wLm+uMbBu7nKy7u2ura4ubS4tbWutreZZHWpnq1wXqKtnJihopuknqullJ+fkJSOlpiXqJ6mn5+amYOjnaykqrGtt7C8uNTQztbPyczSzM/OysfAv8LKvcG9wsDFxMbKwMnPtKS8sbWwnKy5vZp9dmlbXVlXW19YYmJRW2FUUkxDQkZHRTxARj9CSUJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LiYqKigtLjAsQE0rLzU0bYlJMEiJdD8+QkRAQ0RHS09EUlxaaWBvl5KRlG5sb3R1h7OsoaGfi5mcmY2NlZGbkoWKin+Ih4yQi4l8gYRze4qDhXuKdIGKh5V/dHt5bG11fGlzZWlsaGZqaWlgZmlpbVptdJetpL2Ih2dbb2hdWllUSEtPUEpLUEtUUUhMQUpGS1BfX2JnamKXt8ewurS7vraxxce2sLmxsbuts7Goq7itjbaonpynmk6anoyPoJaRp5illYqTk4iRiY+Rkp2boZiblZaHnpmmmqywqK+ns7PT1NTW0cvP09TO08/MxsPK0L/KycvJ0sjNzsPQ0riwxL3Euqa3u8Sif2xhWltbVl5WWGRZT1xYT1FDQklFQ0k8QUQ+Qkg/QEI4O0Q+QEk9NTY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OD05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2ZXc5CRmYNocm95eYOhqp6ml4ybm5iLjpWRmo59iYuFjoqKi5CIfISCcH+HgYZ7h3KDkouPfnF5dWxweH9ye254c2xpgHBtY2lucHlpd31+y7/D36duY3huZFthYEtQUlVOWV5QXl1OUU5UUVVUXG5ud4Nylq64rLWosLarrb3Bsqu1pqW5p6yvoay0pI+xrpuYmIyRlJGEj5uBjaeRnImDi4SKiYSLg5SVl5eUm5CcmJmZnp6rrKSnoqysztLV0c3M0tPT0NTRzsjD1NHIztLT09fN0tHF0tbGwc/IyMOpv7jQnHdsY1tgW1ReUVxaT09TUE9JPkFHQkNGPUFCP0ZFPkA/Oj09PTxKQjQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WHhot3bHdwfX6AoJ6eoYyNmZOUi4yTj5aFeYWQkI6LioiRh3+Ce3J+gIKHeoV2hZORiYBvd3Nsc318d3xzgnhxa4Bycmlwcnp5cnu+y5p/jbKEdnKFd2lhaV1EWlpbV2ZkWGVrVFhdXWBjXmN4e3+LgZmqpKSioKGppqqxuaumtKOirqKkrqKnsZ+JppuVk5GKko+IgpSJa5WijZmEgYZ+kYODk5esi5WOlZqOhZKQnZensKKgoaWkqMjNz8fCy9DT0dTSztPNxtbTzdTY1tbY1dfVytTazcrY1tHLrcTDy4hwbWBeXVZSV1JaT0pHSkpKQDs6O0VCRD1DRD5IQz9DQjs8OTw6R0M0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV+aXN5coKKgJ2VnpSFi5aJj4qJjoiPgHiElJmLjYiIi4l+g3hzfH2Eh3eAe4eRl4GEb3hxbXV/dnh9dIZ8eWyHdnVufXaFdXl7nbWMPEGLxqV+jX1qZVdJQ2VjZmNoamRveVtfZmhrbmlugYSJkYyen6CekZeZoKOkprKkpbKgoqWfoqmhorGch5+SkpORi46Lh4SPhH6cnIyNgoSFepR/gqqWo4ySi5iTi32XipqRqrOYm5ynnKa9w8W5tsXN0dDS0MvSy8nUztHV2tfX2NTZ2M3Y287J2trS1r/MzbR1c2xiW1dRU1BYVUVGSklGRj06NzpAQkM6SEVARURCREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MiooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGJxcXSGjX2XkZ6LfoeSgomGhYqCiH14hZeXiY+Dh4aHeoR5cXt7hYZ1eoaOjp16jXB9cHB6gHJ7gXKEh4Bujnp1d319gnV/fIeJsHRZqsK3jZKBcG5jPV5ocnFxcG53d4JlaW9ydnhye4yHj5OSm5agloiMk5yfm5+roKGsnKKamqCmn5+smYyajZGTjoV9iIiDhYuOoJmTiIOHfmyZeYSZh4iTjI6VjIZ7m4iTjq2qlJWXn5imrrW8qK29xsvIycvLz8nE0srU19jX2NfU29fT2dvWz9va0tbJ1cyTdXdmZVhXTlFSXEdCRUlJPkI+PTg6PkA8Pkg9QEJBQkVBPj86ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmx2gIhxkZCbgHmAjn6CgYKFf4R8fYSYjoeLfoaHgXeDeW57e4eCdHqSno6hdo92g3R1gX50gIRvgZCCb5KFdXyBhXp2h3yJuMalw8q4gpacj3hwZk5lY4J7gneFoZCLeXp3e4SAfIR1bZSWlZaQmJGDiY+XmpeXpp2YoJefk5KXo56aq5aRkYuNk4OMhYmJgYaQkZ6cmYiFi4GFl3qIiZ+XkImOiouCfKGJkIu8oJiTl5qcqKalrZ6ntb7Av7jGyc3Oxc3K0dbV1NnV19vU19na29fb2tnYztvGg3Z2ZGZhXVJVVVRNS0RNRDs9PDw5Ojw/OT1BNz4/QD1APj05ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs5OjdIUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWZhXVxpdHp5bImNknd2eot8foB/gH6Fe36CkYqFhnqFiHx2fnVtfH2HfnR/kp2Rn4OSfId+eI9+eYuKb4ObgXSZhn2CioV8fpF7kKmPkMOgvYybpJx+ioR9iXOMi39zppqcmJSFe4+RiYRpR3GhpJ6MjJGShYiLkJKVj52bk5SRl42MlZ+dlKGVk46OkIx/kI+Oi4SJk5aZn5+IjJSRnZCCjH+mmYiFjoOGhIClhoqLuJedkZSWoaagnZ2do662urSrwMbK0MjHzc/T0tLY0tXXwNfY2dvY2trZ2dfbtnZ1dGdmYlRdWVJPT0hDTEM9PT45OTs6OTk8PTZAPj49PTk6OjszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdPPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PERSU1JYX1ZYZm1tbWmBjopxc3mKe3uAfH98iHt9fIuHg351hIZ6c3pzbYF+hX53hpuhm56UkoCMiH+Yh4Cckm6IqYV7oIx8kY6DiYScfpuRio2jop+RpK+gi5GLhouBk4ZXcq2Ln6ubkIOZnJCPjluDopGCjZ+TlIyGiIySkoyUlZWQjI+KiJabnY+VlpKMk5SGgIuJk46Kip2XmKOihpOdlaCLiomOnZCDiI+Ag4eFpYWLkLKYnJKUl6GgnpmSm52nsbispL3Cx83Ixs/M0MzO18/R1K7W1dja2Nra19bZ2p1seXFjY1paVlFVV0NASUQ/Pz46NDk6Ozc6OzozPDw/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieGxifpGDb254i3h6f3uBfYd8fHeGhYBzcIWCe3V3dnSFg4V9f5Kmop+mopeKnZCUl4uKqJdyirKNhKiShJmUhZqMo5agmJOJm56ik6mwoJGVkY6OiJaMb423hJrEyLKcoqacnJiWkbGQZKTNx5WOhoeJkJKNjZOVioWKioaWmZuPkJSTh5WYhICPi5mIjpCql5eko4iZnpaaiI+Hl5iKhY+NgX+Hj6WIjZOomZeTlpihmJ+Zk5yaorK0paO8wb7HxsXJyMnCytPMzdSo0tHW1tbY2tTT2s5/b3tkYFtcW01JU1lCQUdEO0I+ODM3PDw6OD42NDo6PDo3Mj86OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4JHdoGOfXxtfoh4en57goKDf3d2gYN8bW6Lf3t9eHh8hIeKfouis6ejq7Oil6efpaSWla6ig5G4lZKzmoyioYylm7CjpJ2YkaeWqJmsr6SYlZaVkIuYmpehwI6jybirnKOmrZiSm52ynYWGqKKcmIWJiY6VjIuTj4iBhoeJk5iVjIuUk4eUmIaEkZCcdZGZspWWpKGHnJmSkIuQipebiYuWjoZ9jJieiZCQnJqak5iXn5OgnZSem6CxrqKkt760xcfEvcPDwMbNysnTps7M09LR1tjT0Ni6b3ZyWV5TXlROSElNRUJDRDU+Ojc3Oj88PDc9NDI2Njk3NzQ+NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdNWlxZSmZgO0iEi3p6boWGenyEeIGGgX5weHx+fW9yjXp+gnx4houJhoSSprusqLG9sKWts7Ooo6KwrIqatZ2juKWVraWXqa24p6Sjn5qpmKqkrrCqmpmclJWRl6CYmru7rsqhara4q7CUmZ+jrJOXvqNeqrKDioqNlIeQfI6OfYOGjo+UlYiIk5aMkJWNi42WmJOdmbSWlaudipyUko6RkoyYm4qSnpCLiZafoY2UjZiZnZKbmJ6UoaCUnJ2lr6ihpbO4rMLIxLa6vbzFx8fC0aDGyc3NxdfW0cvTn213ZVlXUFxQTkVDPjxDQUI4QDg4NT9HPT02PDM1MzQ1NDU0QjQ5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRIYmBicEpAi4p+gHOGh32CiHWDioJ/bn18fX9wd4d3joKHfI2PjIaMmanCwK+9xruztMC9tK2rs7aMqLKtrb2rm7ulqK25uKumpqKipKOpr7Kxqp2cpJmbmJefoqalkqS6r6nAvK2usrmlpKh+iIacrb2wgouMi5CDjoORj3qBiJCNjZyJiI+XjYuVlpSRmpedqJqxmpGsnI6aj5KOlZCQlpiPkqGRiZSbpKyUlo+TnJ2ToJ2bmJ+hlJqep6akoqOwsqbBxsOvsLq3xcTDv82mx8THxL3W0M3EyoVwb15ZV1xYTEpBS0FGRz9BQEM7OjQ+QT09NT02PjM0MzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVONzlHRD9DRlxlRmBpZ1pdXJOMjIl7h4yHg4x1h5GKgW9+e4J/cX6Be5V6kpSUmJCTlqezxsm/wszCw7nHvbuvq7m7mLO3urLArqXBpKuvvL2qrqujo56nq661sKqcoKucoZyWn6+1p4ujurq2wbysqZ2zpaSolIWOqcTDpIKLj4eIhIaVlI15g42Rj5GhjIyUko6Jl5+Yk5mVmKagr5yMq5yNlo+SkZWVjpCVko+hlIaXn6CynpSZk5+gmKSemp+boJSYnqWkpqakr62lwMTDrqi3tsnDvrbPssS/xLyz0crIwrRxdWlZVVlnUExIQkxLTEpBQT5ERDw1QUU7OzM9OEIzMzIyNjNBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJlWk1lXGZUYmuZjZaKjIiTkIaJeYeUkIFygHuNf3iHgoKQeo2hlqiZmpm6vcfIycHSycvCzb3Cs628vqi6v727w7eswamss7y+qrCqpKWkrK6zrba1oZ+vn6WimKOzvaqbqL3BpLa4r6yUsqysrJeHmqmmpZGCjJOlloqBdYqSeYWOkpCeoJOPk4yPjZSjmZaclZWjnqqekaWajI+Pj5WWiHyPlpOSo5qVn6GctaWQnpako6GlnZ2mmJ2Vl5qko6mnorKsqLvAw6+ls7fMv7mvxLO7vsG4rMLDwsCXanZeVVRZWEpKTElGRERIQ0NBREw6NERJOjs0PDhFLjEyMzUyQjI2U0hPPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+aUhfWGJaY2NWno+cjpeOnpKJin+KoJOEeIV/ln9/kIiKkYCWoZmup6SYwr3Hw8fF087Ozcu8wrewury0vcu8w8G2t7yts7+6va6vqKCpqLatrqmyt5qeraOnoZ2rt7iqpbC/xLK9ubSoq7a0rq6XlqWsqJ+RjZKyxaeWjnySlXyHkpmPqpmYk5OPkpWTpJ2TnZmUoaOinJifmIuMj4+eiFqQlpeSl6SZZZijn7KllaGVq6upppueppaYlpiUoKSopZ+2q6m5u8O0pbS1y8C4qrarsru4rqi4ur24gGhrV1RSU01FSVJNSz9BSEVFSEhIOTVFTTs+OD1ASi4zMjAyNUM1NU9WTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs+QEJGQnBFaklSZWFMRqWUnJeil6mWjJGDiKaTiIKHgpyEg5WQkJSPmqKer76voca8xMTHxs/PztLKv7u2sbq7u77PtcO9uLm3s7G1s7izq6ecq6y5qqmnr7CYo6+lp6OltcCwrKy0v8O6wLq0p7q2ubSvlqWtrq6ki5OUoY10wpp9l5mEjpeZjLGVm5qVkpKZmaWjlaCbl5qpnZugoJmKjZCWnGBKlpyalZqlllWXsKCvnJ+klK6tqqSaoKWTk5iYjZygp6KatKiqs7u7u6qxssfAuaasq62ysqOhsrK0pG1qYllXTU9KRE9PUFI7R0tJR0lDQz46S1U/QTo9RU0wNzUzNDpCNDRNV087SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiqlpmgoqivmZGXh4uolo6Ik4WgiISdl4+doZqjpLXJtanFucLDyMrJyM3Nxr+7s665ucHBzLXHusG5tbqwr6+ztaekm6q0taqppq2smqSupaSorLu/qKy2t7/Bv765s7LEsrm+raOvtay5poibl6abdr+fhJmdjpOamoyul6GcnJeUm6ChqJ6on5qaqpqhp56YkI2RnYNudpKimpWdop2RrrKjqpSoqpepraOinqSnkZGZnIeUnaKelrGmqau5tr2ysq6+ubago6eopaacm62pqYtgYl5dTkpLRkdNSlZMPU1FTktMQkNEPFFWPUFBQkRPMTg9Nzc/Qjc1VVhPP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li1SYE1VSH5lXkhFq5Wbop+7r5mUn4yTq5uRkpOJq42GoZ6Mo62Uo6O2xr60wLnCwsfJxcLOyMK+ubKvubXBwsq1xrLCvLW6qqitrbCjo5iqtLumqaarqp2pr6ejqqu9u6itvbW4vse8t7a4wrK+wbSqtbervqWPo5iSoqC8n4maoJmXn56Pt5+pnKWim5yhmqiks6CbnaacqKqemJWPlJuLlomMpKGUnaKdoLWvpaSSr6uZqqqcnKOiqJCUlJ+Cj56enJWppKGhs7S6tK2otbKznpyjpZqXlZiqoZ51XVpdW0hHRUZMUUlNRUdHQlNMSkJFR0FWU0NIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkVASkpOTzlDQDU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE5ZlxGQ0OdcGJHRaeXo5+ew62cl6WYmqqclpqaj6qWlaemla2smKKrtsPDvL62wcLAx8S/zca7vbmysLmzv8PItb+wvLe5tqakq6ytoaGZqqrEoqSprKaerK+roqmpvrinrb+yuLfHtrW5uMCzwMK4tbO0r76jl6OXlJyUrp+QoqOlo6OgkL2kqZ6oq52doZulnr2hmaOfoqmsoZ2XjZWek56Hj4SNk5+koJ61rKWblbCmma+lnJmonJ6MmJSeg46gmpuSpaSal6uxtbGqpaqurJuYoKCSj5CVqJ6UZV9XX1tNSEdKTkxIRURJQT5RSUE8R0lIXFJPSz1IT1U0QkY5PkhHNUNhW0tCTlJVV1ZRWFRSVUlAOFJRUE06R0E0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW1SRjxLeGVhVkuimqOcnsWsoZ6sn56uoJKjn5akoKaprJi2saKqs7bFxL2/tcDCu8jCv8rHtbi1tLGztLfBxba+sbi1ubSfp6yqrJ2enqWkwaWfqq2gpKmtr6GmqL21prG9ube2xLK0uLq/tMTBubmus7W1o52llZKUoa6gmaKeqaiso5rCrKmerK6bm56ZpqC9oZ2kmKusrKaimo2an5KeiY5Xf5afpaGguKqnk5i0op6xn56ZrpWdjZiTnIGOn5eVjqGjlZClrbKqqaKipaWVlZ2Yi4+RkqSeiV9iWGJfS0dKSk5GRUFHSz89SkI5OUpKTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dyR0U2PXVlXEtNnp6hmZ/EqKWitKKds6eTq6Wgo5+sqaydu7CorLaxx8XBwrLDw73GxL3EybyvsLatsLSvv8S0ubGwurSsmaixqaqanaWhp8Ktm6yxm6qjrrCppam8tqe3u76vt8Sts7PDwLTHtLu4rLS2raqippaVlaSsop+gm6eqsK+vu7KmoKmpmZmYk6KjuKCho5KvsKylp5+SoZ6Vno+QjZWem6Kep7OmpoyXspuirZmcmqyPnZKVkpl/kaGWj42foJOLpquvpKainKCekZGak4WLkY2bnX9fY1lmZElITEpTQkNASUg7O0Y/OTlPTVVeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwyNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ6jn5ygw6mkqrOipLWqlrOsp6GksqyuqbuyrbG1tMbAxMK0wMS+ycS1v8jCtKu1qLC5rL/Es7eurba4pZiqsquqmJ+ml627tJuosJqsoK20sqirubKourS5s7jAqreyxL21x6i/r662tamnrKGYl5KmpaKimJilrriusrW2oJ+opJqVlZSkoLeipaWWr7Kyp6qmop6ampuVl6ifoJihnq6yoqaMl62YpKuWmJ2ij5qMkpaYhZWelIyPm52TiqipqqGnoZielYuOmY+BhZSIk553YmdbamlMT05OVD5DQU5DOzpJPzc3Uk9dX1JWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDEtLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJb2hVQ1dGjHlmQzujo52hpr+np6+xoam2q566sayjq7S2sbC5t7C3uLjEvcPHvb3EwsbAuMDFwLqptqSsu63Bwre3qq2yuqKUrbGtspakp5GquaqfprCcq6CvtLOrqba2rbyttLO5t6y4scO7v7+mxKuxt6+oq6unnpiZq6GioZGYobGvs6ywuZqcqaCal5OYp6C2qaajorGxtKyzqKyfnKCgm56lnKKXnaOzsJqfkJOkmZ+omZOhnZOWiJOWkpWWnJOIkJqYlI6pqKafo5yXm5KFjpmLfYuVhI2ZaWdrYGxtV1BRW1VBQkVUQDw7SUE3OlhQZF5QV1dFWV9eTUxSTl5LSj5aY15OSFBPXFVZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEtLS4sMT0qJys9XHA9PjEuMGRaZEAxNjQ3Z1lgRig/OGx9Z1tWO4l7Y0M9p5+doqm9oqqwrKSyuKqmtrSsoK21va+zuLu6vre2wMK/ycS5xMLAv7jEvcG3r7Wnq7eyvL6/tKmusbaelquuqK6XpqiOp7ufpayznquisbCzrKm2tLW+rrGytaywtLPBu8a3rL2wsbisrKqjsqaepaqgpJeRmp+zqrOrq7OanaecmpWOoaaktK6ooa2urrGotK2yqqScn6iknpWimZuotamWmZKSnZmdn52QqpyVloSUloqdmJyTio2WlpqWpqWjn52WlZeSf4+UhXuNkoKLlWRrcWZvcV5GWWdWREJNWERaOUhCNj5cUWhcT1ldR1teXU9NUlhkSkpDXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2BVMTUwPWBWXjgpQzNZVVxnSzaMemZMQKSaoaWtt6Wsqqavrreqr7W7p6axt8W3sba9wcO1tbrEvszGucPAub65w7jAubK0q6m6trq5vrSqrbC1l5inrKmsm6urjqu+nqyusqOroLGts66utrK5uKqurrGota+1vL3Ks6q3tbG0r66mobSgm6itoKaWlpuasqKtoKavl6GkmpqTjqOlqLOqoaazraq2pa+yta+kmZ2sp5qYn5qZq7ejl5OQjpecoJeWk6qempF/kpeMnZuYlZCKlJKemaSioqCYlpKTlXqLj4V7jIqCipFqbXdtdXthRmFrWUlIWlo9e0pGRDZBYlRpW01cYUtcXVpSUlJiYExLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVF9UXy81KENfUVwuK0IvSkdQW0czY1lUS0SZl6GxqbKqrKakr662qbe1uqSstLfJu7S7ur+/tLO3w8DMyLzDvLa9vr+3v7yxvK2nurm3tsK2q6yxt5SWpq6rqKOwqZSvu6StsbOnqKOytLGysbWxuLSpr6yyp7evt7TExreptrassK2pp6O2oKCnsaGklZyalbGep5ygqo6po56blpimpqW4qKOytayosqeusbWspZmgrKibnJ6clKm4nJSOjoqXm6KXj5ekoJyTgpCUj5ybl5aViJaPl5qnnKSgkZaRkJV2hI+He4SBg4uKbG92dHt+XExmbVxKTmRcP2J7R0k4R2dXZlxMXmJNWFlXVVdUaV1PT0hgXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOR2YyNydHYkxWJS1CLj1FTFE8M3JrSUNDkZmlr6Wur6uopbGztKu3srihq7W5ybmtwbvCuLOxtcLCzsXAwb20vb+/ur68ssOnqbmwtra/vK6rsrGboKexraamr6WdsrWtq7GyrKmotbustbO1rbStqqyorKm5rrKxyMC5pbqwqayspaiusaalo6+kqZyenZuvmqOjo6ORrZ+joKCiq6anuaWstbelq6yprbC2rqKeo6mqm6Cbm5KktJmOio2HkKGglIyUnJ+SkIONkpKcmpeVlIeXkpWZppufnoySkY2Qdn2NhXx7fIaIiHBycX18fVxTZG9eTllnXEZElltHO05tWGJbTGBiTlZXVldUWGddUVJMY1lbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvKzEoKSssLSomNSovJjApMzg6MSYqM0JjOjYqSGVISis6SD4zQkhTLD6QaztHSI+cqquiqrGkqaWztbK1trKyoauuvcy6rcC6x7G0rbTBw9HFxr7Asr7Awru+t7vEpqy3rLK3vMCvq7Gsn6OnramopLCjqrKqsKywr7Cuq7O8p7exsqmzqqulpaOtuq2qssO6tq27qamnrKmnsaWqpKOuqqiin5yjrZWlnpiemaydoqepoq2mpK2suLKyoqqioKyvsayeoKenqZmjmZmPoKaXhoSOioueoI6KjJWajo2EhY+Un5yUl5WGlpOTl6SbnJyKkpCNiX9+h4V8dn6Fg4VycXCIdWtfWmBuYlFzcVxLO4R8Rj9YdVhgWk5kW05WVlVXUVxhXlNPTmdYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMjU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE7XEowLkpnREY4O0IwNUVLWDFAlVk9TEWVmK2ooquznKqqsLetuLavq6arq73JvLC9tsKvsauzw8POz8O+v7TAwsO6v7PHw6qut62yuL6+sq2tqqSnqrCop6ixpbSuq7GvrbKxtKy0vKS4s62sr6irn6OesLerqq27t6W3tqSpp6urqq2hqaemsbKkp6WhoayXqqGVm6CmnqWiq6Sto5+nsbiurqSmo5uqq66pnaKlpKSYn5uWj5ickoGCkImEnJ+Lio6LmI2OiYKLl6KbkJCbi5OSkZOimZuZio6Li32GgYGDenN/goB8cnWLpId4a19gbmZXZYdjTj9nk0xFYnlXYlhSZVRNVlVWVE9cXWFVS05oVlZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjM5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlZaLjBKZ0FBPDxCKzpKT140RIY9R0ZEl5OwpqOrsZirqq22rLayrKasqqm8wMC3uLK7taWyr8PJy9G/wLu5v77BucG5wMSssbWxs7rAvrKxrqyqq6i2qaaur6q5sKiysq+zrbeqt7entLerrKWpqpyjnrOzqaiktLWgt66gqqiqqKunoKusqbm1qqqpqaKqoK2ck6qhnaCloqajqp+dp7Svqaero6OYpaenqpyipKOgmZigkY6PmI1+h42HhJ2dhoOJiY6NjouChZSimo2NmpCRkY+Sn5eYloyKg390hoF/f3h0gn55dn2Ah52Pb3JnZnB3XGFziGtPXplWSG55VWRWUWNPTVZUVVBPWFtiVUhPaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg+Qyw+TFRfL0ppNU9EPJaOsaKmq6+arKatsLS1sKymsKqour67wLCtua6htq/Ix8jRwL69u7vBvbrCwL6/rrKysrW8u8KxsbOqs6mktKilrbOzubCjrriysLK7q7qwqq62rKqfqqyfo6C2ramhn7CzorWqnqinqaOqoaKsrai9r6yuraKoqKCsmZCwoZiioKennqibmaqxqqOgrqKhlKOjo6eYmqilmJeYno+Kh5SIfY2GhISjloSBgYuGjYuQg4OTn5aIkZyQk5GNkZyUl4+KhoZ3dIF/fHV4eX95c3J4Zn+GpHZpX2RqgHRniIx9U1hvXkp4c1NkU1FeTU1SWmZOTFZZZFhHUmhSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNSkoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGc6NDhfPWFkP0YxQ1BbWypITTlVQDSRkLOhpaetpKekrae1s7KrpbGnqri+wLuvp7mqpq+xycfI0cO8v764vb68yLrBuLCvtLG6u7jAsrK6rLisorSnp6yyt7qzqKi9tq62vrC9p66staytnKmvo6ClrauonJ6rs6W0qJuqp6mjqJ2jqaipvay0sK6dqqSgrpybs6OWpJylpZ+lnJupq6afnKuinJOcoqWemJeoqZKYmpSQioKPhX6Pg4CInY+Ffn2Lh5CNj4N/k5qThZOhjJWRi5GbkpWHiX5/cnt6fnxoeHx5dG9ve2aEeISJZGFnYXKEem1neF1eVD9Xe21UYlBRWEtMTnJ1XUhaW2dZRVVlUEQ+Sk9EQ0E5SEdLUz9qYkpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEnLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mYkFKN0dTYFUqPTlEVz0qkJWymqCgqqaloayluLOzpqmxpqy4wb21r6K4raiosMLJyczBtr3AtLe/usi1wrWzsrWyvbi5vbWtubW+raCzp6ursLa4tayfvr2qs8G0vKGvs7WqrJ+tsKOcpqmqpJ6bpbGnsKCfq6mnoamcpKihrbyorrGuoaujpK6en62ml5+boaOcn5yapKujnJulpZaXlaCjl5uXpayMnpGRkYuCioCAjoB7mZSMiHt9i4aPjYuJhJKYkIaUo4mTkoeRmpCTgYh9eWt+dnl4Y3x6cG9vcXZnf3NphGhlZ19sc41sYWlvYG89WnlrVV5OUFFKSU1UWldNXV5sV0RXX09eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTY4OzIoMDkvLDQvLj0tKks+KR00OSYnLjM0LjArLzQmLDokNDFBaFkxNFM9ZV9ETDZLVmRPKjsxTlc9I5SZrZqhmKilpKCopLiwr6SvsKmruMG5sq2fua+rqLS6yMvIv7bCvq+0vbfEtsOyrrmys8C0ur23qLm4vaqjtKipqrGvubGrnLy9pbDBtbair7a1p6ansLOfnqSmqKKlmZ+sqKmeoKqupqCmmKOooLG5n6Oxr6GsoayknKemqZqam5+klZ2dm56qp5ecoaqTmZSZn5OZlqGpkZqJjpCGfId+go19fKCMjYh4gouEiYuLhYeTmo6JlZ6IkZWCi5aNkXyFfHNwfXF0dGB6eGhtb29taH1xYnttaWViXWWFfl9ac2pxSkl/aVhaTVBMSkhQUlFJT1xfblNEWFpSaE9IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy46OzgzJjI8MCw4NUIqKS1CKiw0O05OQDs3My0uKy03Kio8JTUzPGZkMjRNP2VdRk89UVpnSCo+L1dVNSiXnqeanZetoaGhpaK4q7KltLSpqLnEtbKtn7etrq2wtMbIwLa+wbmwtLy2vru+r6u9sLS/sLzDuai7urenp7WoqKuxrbSxqJy/uKatvLeyn7G3sKilp6+xm6GkoKWloJebsKehn6Oor6GfoZOkpKK3sKGmsaufrKOvmJyqpKmfl5qepZObnZuep6uanJ6ml5aYlp6Ok5eiqKKQiYuPhnqEfoSKeo+WiY2GeIGHg4eLjYWNk5iNj5aZio+XfoaXjI95gXpwcndvb3RfeXdka2tqZ2eCbGVya2tkaFhhc39eWmx1aVlFfV1bWE9PS0hIUlVHMjpeXmxQRFdVWWVNSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0SEJmW0hUQ1RdaEUuOzFeUSwylqSjmJadqp6moaOhuKqwobu4pay9xLKvrqK1r62tr7TExL2zvrq3sLO5uLq4uq6tv7O0ua6/wbervbq0paKzq6iqs6yusqSdw7emqbe3q5+yvKqnpqivq5mjp5ylppSYobOmmp6lqamcoZ+UpZ+kuamkp62mnqWhqJOfqaGhoZmbnaGSm52XoaOsnJybo5aTlZabjpOTo6ekkIiKjoZ5hHyFhn2cjYmKhniAg4eIh5GFlZOSjJGVlI2OlHuDl4+Kd398bHVybWxzYnl0aGZpZmNthGZnaGRmaGleZWJpZlplemJgUHNUW1tTS0lHSU9TQCEraV5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LTExOTUsJi41LTgwNTc2YHRCM0NEaFtLV0dVYGhCMzc3YUwnMp+kpZOPpqecn56epLatqKq6t6esw8C2r6yita6nrq+3wcC9scG3sK6ytrW5uLWsqry0r7KxvcC3rry8saSftqymprWqq6+hoMWsqqextaystbqeqKmrsaWYnaqep6WSmaWuo5mepKqhm6GcmKCdp7amr6muoaGdnaGVoKafoqCZnJqck5qelaafrqOYmJ+WlY6VmIyPmJqnoJCHioqIeIV3goKCnIeKgol7foWIhoSQhJaVj4+QkZCRjZJ7g5WOhXN/fWd5cGtrbGd1c2thZ2Nic39hY2VmZWlpYmVvWV5YXGxjYUxnV1tgVklHSEtNUlg+OWBsaUdCVVNcW0lIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyosL0EqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQGJGJTWdpKGSja6hmpmgl6W0sqOyvrehsca7ubCwo7asq66pub69u63Asq+vrraus7myp6u5sa+us7a7tq+5vqymnrWroKGypauwn6bFobOmsLOwt661nq2urK6imZ2nqqWelZunpqCZpaOpnJqfnJWdnq2wprinrqKhmpqemJ6jmqWdl5+YnJWaoZOpl62pnJWenZSNlZqOlZSYp6eNjIqJjnuBdIKCi5iFhnyJiISFioyIkoWTnJKRkJCRl4+Qf4GNjoJvgn9neW5oa2pncXJrW2hjYXJ/YGRnam5rZWllY2xcbGx1cWFTYmhjZVpJR0xNT1lRUFVhZYFUQFZSWlRGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjQ8O0s2Ly4rLC0yNDo1IzMqKTYuNTU0NjVafF0xOktqW01bS1hkY0BBMUhiQic0lKOcj4+xnZyUoZups7CfucC2oLTCu725saa2sKmupbi6uLisu7Ctq6u3qrW5raSytbGvqbG2trGztrunqaC2qZ2fqqOqrp2sxJmvprCxt7atrJ6xra+qopudpKypm5Wcp6SemaqjpZWaoJ2SnKOrqqi5nqekoJeamp2hj2ujlpmdcYOXnKWBdpKsqZ+Wl6KSipiZgJeKn454hZKNg21pfneEcWyGioZ9hIqGb11kYGeEl4Zri5CUknV4i4R/g5B/ZoiAaHZpZlhdaXRuTlBqY2Zxg2ZdZGZua2hdW12JkIWHaE9LQzhFVGdeSkhQUFVWS0hSYXB0ZUZbUVVQRkdGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTVPa1tOW0tbZmI+RzFOYTwrL46kmoiWspudlKGcqq6ro73Fr6m3wri+vK2ntrGmq6S4tLOzsLmuqqestKWxtaKnuLa1qKettrOutK60oqmftKueo6Wdp6ibsL+VqKextLmtrqSoraqrpqGfnKGop5uYoaWmnJynqJ2TnqCZkZ+oqqOzr6Oio5yWmJiXo4ihj5KaiKGIlZ+if6WAqK2flJSelImEcniMjoOIoHWHjWmXiWZ+c3igb4eHhH6MfH+hoJ+Zf3uHnnSIjnabimyHgoNtaGRke21yYlSGbWNtaZhxWGlwboZXXWhaa2paiHBseXKHaIeEWV5GTT5GXk1FUlZWUVBSV1RnXkxaTFJSUEVGRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk6LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdDE1UmtbTltMW2dfPUsxVF43LyiNp5iEnaydmpqdn6uqqKq/w6+yury3wb+qpLexqqymtLWur7O2q6mlsa2ltrObrLW2tKanqLOxrbKorp6robOpoKSlm6KlnrG4laanp7e+pqynqaqrp6aioJmhqKOZmaejpZmcpaqWk6OclZSkpqahtqSjoKSYlZOYk5yIrpCYlYqqjJmjnYaxgaWun5WboZd6gtSof4eUwJvGeHexpbeWZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4Fsl7GrsXlobFixrm9labySvG5oem1xj9h9UmtitrJ9f3CUdZqhqpBWTlhhT1ZORlVcWFBQU4tbV1tQQFxEUE5DRkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cxMVRrXE9bTV1nXD5MMVpbNDEhj6eUgaiqn5idnqWtsqmxwr2ytcC1uL/Cq6a0ra2pqLC1qrC2tKioprWlqLmunLKytqqlpKeyr66xpquep6SypKKhoJecoqCyr5afpKG1uqOqqKGtraSinZuao6mgmJypoJ+YnqiokZynm5SeoqejobCjnp+jlpaSmJKZha9raouOqn9ohZaHrWZxn56Vm6mXca6hpH53unxroI92sV9qtFulgGWckGBmgXpmf2l4aqllvnJnpox2sWp8sXh1kZRjbW2nblyEoEVpZ4eWRXWcYH1me6OmgVhfi6tofY94emqoOEqvW1hUbWNaS09YX1xWVjtOh1BXVi9JU1NKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy8uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVeWDMxG5KilYOtp6afo6SrsrittL2+sLfFsri7w6epsKywqaqxr6SxurClpa+zo6q5qZ2ysrCjpaGqrbCsr6aon6OisZyjnZmWmZ2esKmYnKKgtbOhq5uhrayfnpqXoKOpnZmepaCdmqGopJCdo5uXoaCsn6WmoJqgoZaVkZaRmoa1m7V5hqmatpl3h7Obt3+Ul5isl39rgaZ6gYWGkZSSd6tnarFbrHuOh5R0iXCPhoB/iJCXeIOCipeMg6CPhbB2d59xa2ttfItPpVhIY2OZfmNopV95cXVSkoZdUKluY3B7hYBhnS9Som5bVGtnYExLXGRYXFpCPrB3V1hBI01pRkJEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQUFEPEZEOzAyMDE7RiwwLjg0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0o5YVQ1MByXoJSJs6amoa6pqLOsqru2wrC8w625t8Krra2vr6evs6qir7yroqi2raSstaSlsrOoo6Kdp6qzqbCopp6goLCWoJqWlpeboLCknJukqLWvoaiPqaeqm52WmKCmqZufnaOgnKCjpaSWm5+Ymp6jq5ulmpyaoqCXk5KTk52E1ZOZuXGxwn/Gh33WlJy7fZyXqJKPnY2ke42GooGlgnmreY+dVq97iX6farlauXeFhH2mgpR8mXqqeY6dkHuxbY6EdJC7hm+VUK+nxYpRoHpjYKpic3KHa5aHXlK1tMiFfoh8Y6QzQp12XVFqaGRQQFhmWWRhSkdMakpaU09ZZlpDQz9FPzA8PDU5PDc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0pbUF9mVDdIOmFQNzIlnKOTmbGoqaWzqqW0p6S8t8GwusCyt7W9tLaosrGksrOmoK+2qZuouq6ksLGhsrSxoaSenqipsam0qaWcnp6sl5mZmJiWmKOun5yXqK6xqaOejqyip5admJyhp6KYoqGioZuio6icn6GelZmbp6GcppSbm5+hmJCSlZCdiLJuaLVyrIhwjqdztHV0tnucmaaOkJ2No36PnqN+sHWCkNLSdVyufIV/pG6bqqZqhoV9rX2YmZB7sXOTnY95s2WWdIWebp9mlFLJi1rCXJ95Yl+tX3ZzhmGWiF1Zyp1vwIB0TUu1U1XGZFZSamNlWEFPal9saVBVRkg5PVdSW1ZZSEI/SjwyPzs1PTw1Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxBTlRfZVA1Rz1hTTYyLqOekaWvraWpuqymtaWntru8sru/uLe1vLy0prW1o7Kyo6CssKWYp7uupbKxnbS4qqClnaGqpbKorKqlmp2bqZ+WlZmZk5Skq6KYk6ersaahlpKsn6WSlKGcpaeglZump6Kbo6CumqGenpCWnKOfnKWUnZWZo5+WmZaTm4WsfHiod6OPi4epcK6LhKiEmpqji5Oai6J9kpeHroR/gbNccrJTr32CgqN+cdd9d4R+j52GmZp3r4aKkZyId7RhmmWagoGVbJJbsFdLmnWYeWZgrV52d4dnl4hqXa93lZ+Pd2w1ecius2BEVW9eZ2BFUGxfcG1WVU0uZWNoUllQO0FEQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdCYEk6NzegnZSgt7GZs8GtqLKnqrK6uLS5vrm4s7e+tqa5taG1raCgqayglai2rKixsquttKSbqaCgqKK1p6aqpJmelaWilJSdmpKWpKiclJCnrbCloJSYqZ+ij5GimqmmoZWapqmenaSfrZ2hnaCOlJ+cn6CYmJyWl6KglJiRp56HqX5/pnmhj5CEqnCtjYKnhpehooqYl4ijgZCGlKp6f4udeXCxWqiDgoigeHTYf3aHdKeBjpuNkqR8lZCfhHuyXpxkoH2ClW6TXKtcW5N/kX9oZ6pjcnuAapiGcV2rWomgj2tuZE9KQ6FcW010XWJmTVphX3J0X0pVNUqakVhIRT1IRkFNMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxPZWRBJlVmWz8xVF9iTDdGSF9DMT03op2amr6tmLPBrqutqKa0sLixtb+5urOyubyqu7ahsqWfpqenn5Orsqmwqratqq+hmKKgpqSkuqOjrKGXm5GjoJWVn5uVmaGhkY6MqbCwpp2Wmqemn42SpJiorKiVmKmon5+gpK6joZ6hjpWhmZ+gkpyXnJaeoZaXj6ycj65ucrR0qYx3i6Z0tHp1tIKUpqSTnY2JpIeOdbhui3uLomtrtlqhhmWXl2igoqdtlHK0c5OZf7NqhZKIrWp1tGGdZqJuhpJrl1ytYE6hfIeRUnOjbHl/fm6Yhm9cr1Y8nHdlVG9uLlunT2JSa2VibFliXGBwfGNTWVE+P2xvMkJCQD9NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssMzI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFBOKWanJ66o5yxv66tq6unt6m4r7XBtb2ysbu4q8K3qqyhnaekop2Sq6uotqOzqK6qoZedqKClq7ido62clpmQpaOWjp6hnJmen5GTlau2sKaZk5usqZeMlKaapa2jkZersqSgnqissJmho5CZoZegm5abl6GUnamdlJCrmYfUlJq7dbHEgMSHftaXnLh5ipKZjpiKjKeHeaK2dX13dsKCmrJhg7p5wHx1uGK1gYyHqX2WgqypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gYptmohwbY2kdL1dd31bYXm8alpWW2l5XmlgZGZibXlvWFtZQ0FAcT9DRys1SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sOzowOExYYUYnVGNYPC9UXmBLNTxMWy02QDmnmp+ivKOXsMOvramqrLGoua+3xbG7s6+8sK7Bsq2mo5+kopyckaqlqrKktaetpJ+WmquZp624naOumZWhkKagk46dpJ+Zn5qQlpOvubGrlZejp6eUkJalnaStn5GgqKufnJ+ppLKeoqWOpqGVoZqcl5WkmZCwoJKVqp+FkJm2gJKSjbiWeIOTm7Z3bmxvdG95j4SOiXKewLu8mnuBsqhwgHSRuYN8hoaKh417ioaNl32ku7m9nHV5s6N0dpd1dLB1mJ5mhmmNtnRycXe2jF5/eX2JZ4N5bHlii6xwdIV+WFunaURkWVRmX2NdY1FnZnFtdUJNT0xEO1pMP0ozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVzgqT11dPSs7VlYnPTo8pp2hob+mlbLCs6uqqKyrqruvscavtbSwuKe1ua6rpKKnn6CdmZSspK6qpraoqJ+clqGknqylvqehqpeVnJGim5KQoqiik56XkpiUsrW2rJieo6Sii5OSppymq52WqaWmnJuhqaeno6mhkayel6Kel5aYnZ6PsKmUnKeij2t/apypeYl0f5uPdntmh3u+v8C6b5KDcZSFX3JqWl6biWFjh46Va2B/lGNtnHZilGuAmpWUZV5gY3GaiWhyjHyGlGZqfnB0eH59Ylt4dIFoUFxuhHx8impYbHmBcklKb4VwTnJNRFZcZmBMWldmY19PWm12anJST0RFTTxISTxMPjIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVDRlVFSk9IRlBJSUg7OD01MTouMTs6Li8tNzY9NSYiLyoyLCU7OC03SVJfSSdTX1Y0KVBeTCgzPlxPJz8yPqifqKHBpJm0ubajrKaup6i1sqzIrLC0rbakvrGzp6Gkqp2jnJqarKeupKW1qqSbmJWinKetqb6oqaWVlJuWoJqTmaapqJGfkI+YnLCyvqybp52noomTkqmbqKScnKyfo5qco6etop+qopqum5SmoJeVnZ+dmLGlmaKomZ2Sn52kppuopJudmpybkZeCaG59cneRl5SQhIm0qo2FmJWPioyYloeUlYmDk5OQiY2RlJmTmZean6Gam5Sfm42CeqSFbGl7kH2AdYmLgnKCeHl2doqAfIlqc4J0g3Vkd312a295bF9iW29nTVhZZmpfV1lwem9tZlNPRlI5UFpOUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7NDg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5UMTBUXjorPThdSyw8LUCyoLOiv6KjsLG3oKmms6elsLWqyautsqa1psCotKGepaacpZaWoKunraOkt6ygmZeWoJitqqbBn6yklpKcl5+YlJWin56jqJOQmKiossOvmaucqp6PlpapnqucnqGtmKGbnaKlr6ahpKierJiWpZ2ZmqGenp2woZ2ip5aZlJqUoaOXpKCZoY6XlYuLjpCYro98lZuCkYGJqaiFgJiWi4SOn4h7hJGGhZqRh4aKlY6bl46QmJ6jlpmSkJyNf41lobOuhImEd3uQin53eXpvZ3mRgYGJa3WBeYhyaHN/eXWDhoFqdGJ4ZV9oZGNkZmpYa3txamtcU0xQRF9VRkA/Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1RWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8zOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAs6C5r76tqq2xsqCqprKtoqyzsMWwq62ks6+8pLScoKijoZ6Zl6imqaakprO1npWVnpqasKauvqGsopGRnpqalJKWopyXqZ2Enamro7THs5+ppKqWlpiap56pnKClq5Sfn52fqq6opaOroauanp+hmKSenJ+dsKSZn6mUmZmek6abmaqfnJdmhJN9ZX+Pm5BjeYxsaGp6kKOramWamH5ohYplZWloeo2ijmtojJeRondraouZop+Yc2xueoSMhnlYZV2FgV5si4qCd1xnc3d3koCIgm94gnh/c215hHN2iIeNgnpohFhdanNkXXOIaWt8cW1jXVFOV0lkWEBKMz1GNz9GRDcxPD0/QUM7O0RHSEhJTE5PUlJUV1teYGFhYF1dXV1dX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSi42Wk82KUVZL0RPMVlCOz8uPaSeur25r6uzsKulqK2usKaurrC9saqopa6wsJ+tmKCknqKamqesnKyjpqips66elqSQo7CmtrmlrqOPj5qimpOSm6CZmaaWe6Sroqi0w7eloaevn52VnqOeo52kqqiSn6GeoKqvqaqjqp6mm6Wep6CslqGcpbGkl52slqKfm5SmmaCsmZ9+vYSJc7RzhZ+GrWh3ucS4cZKho3qmmJl0qoF8y8DAunGLo4eDnn2WmIiewL2Clp2djZzBwXyBepGMmsLAfWqlsm+NgW/Ken+beJKEj4B3eYGAeXF7gIZwd4WLknhsdZFiZV53Y19lgGJedGhtZGJYS1ZJUVpIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fX2FfXl5eXl9fX11cU01QR1VOQUA/PTY0NjgyNjYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0NQLyNGWzNQWS9VQUI7LziVornDtK+vv6mplKOvqbCvraaytq+qpqemsaugq5ibo6Ccm6qnop2roqWopaW0pJ6jk6aurbi0p6+ikpGZnaaTkaChmJugnoimq6Srrb+/saGpr6mWkp+eopmjpKqjk6Chnp2srqirpaOhpJ+kpZytqZGkm6muqpyeq52uo5eYppeipJidf86UenulgnqWl5tfrY9djqiAoaF8p5WbdauDgK9eZIyqe6iHhaB0l5OIs2OCq4agjY2zaoSvdHyWh7hhgq1Zo81ukHZ723t/mXF+iJN2f2V7iHZ2bH6HbX2Fj5B9a4CMX3Bqb2ZgX3hkW3FoamRmYFJUU1deSk9DNUFIRUQ4PjU7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xeX19eXV1fYGBfX11bV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1s6TC0hUEBGNC4xrMHAv7S0sLeYnpGjqqmttaymsq2srKSsprCqoaecmqaYnKKvn6GfqKejpqGfsKybnpamrq2xq6isoJSSm5+lk5CfpZedqKOeraOqsKi/xbOoqbGulpOenKKXoaqqn5Whnp2cra6mqaibpaWjoaqSrLOWpaKqqp6kp6eisqKTm6ecoZyWlZGXoXKFjJh2haiHcbF8nXGsfaCggaWPnnirgn6tf51yrX+sh4afdpiSe3yXfqqIooyRi5x9q3qIko+ff3qtVpzEe5Bwk8F9gZVtdXCMbWZ3ZYZvYXducm6IiY+Og2yPjWNtc3VvYGZtZF9vaWpuZmNXU1xgWlJSQzlJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi08KD0xKTNWQEYhHEc7QzEtK6/Txseys5+do4+joqKtr7evqbGnqKqorqurp6KknZqjlZ+mq6CipqCoqKOfnrCtmJuWqKevrainqZ6XlZqkopKUoa2anaejr6yirLWpucyxraauq5aVnJ2imZ+urJ2WoZmenqmxp6iom6qno6Kqmq+xoqirrqaap6urq7Okk5ikp5yWk4Wka6R1inqpdXuycYKlipiMcIigm4ekX2FSq4WAroOcda6CqIaGn3qZl4Z7ZoCjiqSYhoGjfal/gZSGrl57qFWdopKBeqOfgHzEsMWMc6+0s7lyYqmvwnVoi4uWjYBrl5Bta3h4d25rZmRkcXFme2ljXFZfaVhYVExMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICcnISstIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXWwKGZq6ihr6KfsLSwsKmto6inqqurqKSmoJuln52mp6aknayaoqyho5+vo56bk6qktbCvoambnJaVp6SRm6Kon6CmnLCloqixrLbHsbWprKmVkZ2dopmgpbOdmqGUnJ6nqqqirZqrp6ChqaKyrKGqs7KinKupsLC4pZSXpamanZN9qm2fhIh2q3l8sG6CpIuJn5aVnpaB0ri0uMmBgrJfYZSpg6WIh6B6mJaaearJdJqjlKipkJKajH6aiZrGxndloYKlc4GfjoJ9r15vtWOxdUujhm2nR4OTZI6Pm5F7b5SPfG15dHx6bVtlanJxZoBpXmFYY21cXllJTExKRURCQT1BPEE/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE5UUR0cOzxGMiwkqKTAxrmtqbKuraWinbO5rKuhppuopqqsqaagpqWYq6Ofr6ydpqGtmp+ppZ2ntaCjmJSoq7azrJumnKCWkKatkpqcp6OgqqeuoaOnqbCzwbGyqa2olImYnaWboqSvppeilZicpaWpma6crKalnaujtqyhsbmwnpywqLS0taaWmamlnKGQg55Od5qCgJ96hKN8gqSEhqafnJ+UhLh8fHq5gn/MxsO2d5uikYuffpmXl4p2n5eKpJikqH6vhZuDnoSsfZmUYaVso3CPhZCBfZaEcqxgpHNxgJphvH1SVXWNkaGVenyQjodyeXKEfm9bbG53cmqBblpjX2huYmRdTExRU0FIR0ZIOjpLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFdZWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9URjxFMjpQW1QcGzY/RywtIIyHmamspKu5q6+gm6Kss7Wmn6GVpq+urqinnqWlmqSnobOuoqmns6CaqaSUo7Wjo5WXoam1uaSco52jk5Cispmem6aloaKvrZykqKK1scKwraqtqpGHkZynnaOknKWXnpiYmaWjp5itoayjpJeupbusore2rp6etrO6s7Wpmp+xo6agiJDStcO3eoeOhZGTj4CmeJSid4yhkoWlg4tyq4eGtG5yaZmknZWJn32XmYeHkHOugqWbo42mipOciJSQmm1wslylc5N6nGyZf3uZfm6pYaJycn6fYnOyuGh3jpKkl3yJio+IdXt4jYFsaHdpeHNuf3RcZGRtbWZoYEpaV1g8SEY/UzNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgjKSWSco2Krr+/vLu1npeopK62oqKZlaOqp62pqpmlop+moaC1p6Kpp7GklKujj6StpJ2QmpqqtLSknaWcqZKUl6+goJ6mo5ynnLWZoKqjtarCr6mrqaKMhI+coqGmo5WampyYmpimo6WXqaeroKSbrKa8rJW9sK2fo7G0u622qZ2rtKaqmnyokX18sHiLgKSliJxtsm+hh618oo+DqJeagayJhq2FoJSooKOXhZ+BmZaBe5J+q4GdmZaLq3edoI+Ik5J/ea9do4F8pqdknoB8l3Rrrl2lbHKFmV1gW4ygbZSPpJeBkoqTiHd5gZZ+amx+Yn10bX95X2dlcG9oZ2hCWV9aPUpTMlM4QUFDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaWFNQT05JODE1Mi4qLEFUVlZWVFRVVVVVVFRVVFNTVldXWFZVVlFIRklKIygovJKbhKnGw7fBtJ+araCuuaajjpqjpKCvrqmfo56drZieuaCiq6CvqpquoZGqqaWWipuQrrGsp6Com62YmY+toqGepaGZpJytl5+opbaovq6kqaOfjICOm5ugpp6SlJmblJmZpaOimKeqqqGinqiovKSXw62ro6KttLytsKmjtbGqrZp3r36Ri5yFh326rYmYZLCMZZaufaGQhKeXnIKti4WwhqeapKKikYWgXGxrgrNgf618e4KAsmxmbpmXi4ixWn20W6SDa8iiZp+Be7tZdrVasn1Tr4F6rFiAoW2XjaaZiJWOkpN4d4ybfGNzfGKDd3SAfGFqZnBtZmVlT1VjXEFUXT1IKD45PTQhISwkHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE1KR0M1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7G3vru0wbOjnK2mpbepoIuZoJ+dsrGonqKfnbWYoLOoqquesK2erJyVrqiijombjq+sqaejqJmuk5qPqZqhnaSemaOipZieoqixqLuupKienY99i5uWoaCZkJGanJGZl6ien5enrKSjpKKkqbqeoManpqmhrLa3rrCpob6wr6+XgqqSo6+Om4CGpJeYkICAuMO6hI+dk4WomZ2DrIuDr4qonJumq5F+1b3CqmKkv719f6OCg9e6t7WElJKCnr2+hGqjgW+rhG6df3qysceDa6uwvax5eKK+u3SAlYykmo2ZjpOZd3+PmXlifHlkjGZ4gXtga2VramJQYltTaVxAVGBCTCk8OjQvHx8kHiUyIBwkKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbS0scC6sr2zop2up6azpp2Ml6W/qbavp6G/pqaxm56xnLmon62vpaeVlK+sl4yDmpGupqOsoaWcqqCYiqOTpp2nm5qgqKKYnaCrrKm4rKejmpeTe4iZkqabk4+QmJmOl5OomJ6WqKeeqKagoqq6nqnFo6GwpKy0tqyyrKO+q7GxnHV2qqW3hWWJn3BnrJCKj25ud6WQm6CCdrGbl3GRjnKXqaSbmK+kcmxtbWaLeG9tg5lxgHppcGlniZaVl3FoaYWGZ3GGZF2KY2lvWl1nfnimYGJykJJwZmSAjZKNoJaVl46TmnqFjZN0ZIZ3Z4xqeH55ZGxjZmxiS2VXSmtZOlBkRFAnSjkrIxwgGiIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWttKm6urK0qqmirp+ks6qZkr2xw8e8tKmev6uso6Cnq6C6o6StrK2mjpatqpCMhZWXrZ+mqqKfpKOgkYulkqaZqZmWo6mglpylpaauuaqsmZqTknuEl46ml46RkJeUjZeUppOdlqeima+lnaKruZ+wwailtKetsbOsr66qvKexupiMoqmmtpyJlqKYhqmbkJSdkqq0mpykraK0mKSin6KjnaKlopasp4ySk42Hk52dlZCZk5iQjpWEf6Sal5WOi5OSipCHhH5njIF0g3d0h4xxp219lpOUlIGBj4+OjZuSnpSVk52AhZKLcGiPdm+Jd3Z8eWlsZWRvZFVhWEBpWkdiX01YK0U9KyYhNjQwLx8cICUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5UUUpFQz45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqktbevrqKwpa2gobexkY6qxLzDubapoaSdm6WdsKikt6edqbWnqJGYrKOLiImPnKeWraShmqienpOVpJeomqmZlKago4+ap5igtLmnqpiakI18gZWMoZSLlZGVkI+Sl6SOnZinnpq0o5ymq7eor8KvpLinsLCyrqustryjsr+ak6ekprWikp2mno2pn42Sn6KtsZuipLOrspqmop6lq5+fnp2XrZ6TmqKclJCXq5mNmJiWkJaekYegnpSUhZOMj42VjIF/Zo2IdYh3eomEdJxqiJKWlZKJfYyWkZCWkZ+QmpOdgYaWhXhxlHJ5iX9xe35qbmRfcGlgXF9ZbWJQYGJPWDlGRkU9Mjw9OC8qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlqSoo7CzrK6jqaetoKi1qpCPm6Oyua2qq6GimXqcobCkprGolpu4pqOUmKmcjoaKiZuikK+epJaooKGSl5mcrouqlo+omKeMmKiOnbi1o6WYm42JeYKUjJuTipWRk5CNkZahi5ycp52dt6J/g661orCwdaS/pLOheXuirbW+l3ivpqGKgKp/ZFxidp+OpJ6Dln5tlLWdpKmwrKVmoKGUdHqbmHCBmaqZbH+kqYplnKWckZeYlouSm5CEnZuQlIOTh46OkoqFeGuQiHaHcXyGgYFhaYmMlZOMW3aVkWdnjoxyeaGWlWR4l4WAdpdogomCbnl/anBlX3Zva2tnXGVjYWFtUVk9TU1OUkY9QFRCOTEvHh8mNDozMDY2Nzg8Oz5AQUJGSEJHR0lLTFRVVVldYGhmZ1hRSTxERzw5VVJbYGFiYF5gX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqqWprqSnraWSlqq0rrClmamlqpdzi5yvoKirp5OWuaCgj5yknpF+iIiano2smqSVp6KejpeSnoV1ro+IpZqokZajiJu5s6egmJiLiXV3k42Wk4qTkJCUjI+Sn42ZnqWYm7GVgIybtZ20jJKPvaiifqeje6WxuoOOj6ifhIyGj7Gpr4yJlqKaeYCLrIadnqOpq6mJloeZd6ace4icgZing4F7nbN7ioagmJmUmJaBkJaWg5maYnmIkYSNj5KLhG5xkIh6gnGBgYaAh3SHhZeTeJZok3SgmnN7mYKcmYSYfpGIgYKYaYyMhGp4e3FwZ2V4bmlsalxkaWllcVpcR1NMUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dSWFpYW2FhaWZZUUg5REw8PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2YpJ+mrq6rqK2gqbGnp6qlmZStxbyvoJSlp7Sdj4OcrJynoqCNkL6emY2fmqGRfYaPmJeIrJ2jlqGhko2UiYaAkaiOh6Kco5OWnYaeubGnnZqSjoVwdZCJlZCKlI+Om4uNkJ2QlZ6jlJ2rh5+0ibSarovKiKuvireFjbCEs7GFqY6pmY2dfKiPcnt3nI6mlmiVpHm0jKGgqKqTmcKCgKuJmaFynoCbpX2XhZWzgaF9oZOfj5iYgI6UnImYkot8hZSGjZWTioRudJKGgHtzh4GEfYV1hoOYgY/FZoCph4+iap2BnpeAmYCKi4OImG+NkoRnd3R7dmdodXBnaGteYm5sZmxXZEZdUUwyRTQ2TWBjNyYzPEVHRDo2MzY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQElkWF1jZmhnYmJiYmNjX19iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6OgsKmpqKasoKW5saqrppqUnqKkqaGUo6m1oq9/oKedpZ6diZS9mpONoJKdkHmDlpWRiKuZnJuaooWPjHabm46gkYieo5uWmJeGorispZmbjIx/Ym2Pi5OQjY+LjJeLjpCejZKeoJigp36hp4etnaCWrpCgnp2Rh4Kgja2xiKSOrJuMmn6idoCZlGuBq3VNq3iHjZ2TnKqpgqqrfoShfHunap6Ak2xnl4aYt4mefm5gY1iDl3+Ne2Rni3OZfXmXbFx8l25gU3GFXGBteoRgWWWCfoWBmXGoq2uDo25ypXCfgpxnZJ5sWmyIemVZX4J+YVdQb3ZlbnRxampvXWlvbGtoV2ZNXVhFOUE0R0NeazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUktNQkpbXV9XXl9jdWBNRTpNTk1UYlxbZmZpaWJiZGJkZGJhYmBiZGNhYmprZGJkZGdkYmdlYWNomJeeoLmhqqSmrJKitr2rr6KZlp+gpaurn5yttKGnkaCfoKecmY6ZtJmQi56MlYt1gZSRjYqmlpaYn55+k4WFrKOHnJGKmKiYmZmRh6WvpqKVmYeJgGluiIiLjo6Jio2Ri46RoIuSnZ+aoaV/k4GPo6GUoHeclpCng6OpgIassIeleox+hJp9onBzk4eVe56MeW2HnIuakpyqnI+HnX2DonR3pmeefnelXph7fZNzom6Yt7S6c5OIgYC2qGSBxrh8cZW2jHGAm6NjdKyrYX5qnbN+bn6Ig4+DjJhxgKNsc6RznoJ+o16cmbOWb3uXnrN0cluesoJpYnB0dXFob1hqa3JyZVtmXGFMRD1ENVFBWXAyPFJHX0pSPTwzOTU6OjZDPDtASVA/VE5OUUBFX15bWVhgYHtkSUM4TFdVVmNhWmZma2tiYmVhZGNgYWJgZGNfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mauck6COpbi2ra2gmqGboqOkrJqasayrkpegmaGkmZqUnqybi4mReIuFcYCWjYqPoZCTlJ2XfZGJjqighpiPipKik5uajIqop6Sej5aHhH5re4d/fY+Ng4uQkImOk56BlZufm6Cfi4l3nJiijaByoYyJqYmdqJGYqq2Arox+eqCZeaOTeIBzl4iMnH2Vn4ebjpqdqIijZKF+ipaQm41tnmibjm+amXuAiqd9cmh0qoOeg3OqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxfp3Z3ioqAnWiadYeTkpiNf55tmZBqpplcqH53u2p9qVqOhF2zZ1xucXh3a2lbcGl3eGFeZFZhQlBFTzdWQlJtNEpaWl5OWkRAMTUxOzs3SD86Q0hVP1lTWF0+RGJdVmBRYWN8aUVCOU5bXVhkZlhmZm5tYmJlX2FhX19gYGVjXmJkb3FfZGVla2RjaWhna2mWnYmqtpyoiWOVnKy7srCsnaWbmqefnayZnbCnqp2Xo5qin5mWlqCjmYaJjWmIgHJ7l4eMlpaEkpSYj3qKhJaknImVkIaLnZGcm4iPqKGfmouQioCAaYGGeX+XjHuIjY6HjpWZfpKhnqChk5hyaJ+KoI+McJKMgqmJmqGlqqOqfrCtpKK4l3ajs6Kjf4iUeJ16qpl/oo+fnZmJmHKhfYeNsLV9bJqRoXh+mbWjo6uohJl8mnycmn90qlpdb3uXjHieYk1/e3uFZHqYQk2fWaJqc3yOb4KKhJl2m3mHibGzf36akqZ0fp1tcXyUb5lyaaNdlXZIZWNgc3B9fW5lX2tndXtiY19QXVZcVFZAWUVQZkRSVlxhWF5JRD1COD9BOkhFOExFWEFXUlpWRUZhXFpgS2BtfXFFQzxVXmJaZWpWZ2htb2JmZl5hYFxdXmBoYl9lZHZsXmVnZmxkZWxoaGtplJ2Bsa6ahFNfoae0urOzqZqii5qpm5unkqCro6Cnj56dnZqZlZihnZaHh4l3hYFueZWEkJuLfZGTlohygImSoZtykpCBiJiUn5qEjqibmZWKiop8g2yEhXGCoYx4hIyIh5GXk3uRop+eo4iuhn21hI+enXumlnqpgpeekYyjoH+naHhufplzoHNxfJ2FmG+Tgq18o4Snn5uDpHBeqWh2o2RwpmGc0498e5l4cnNjooaQfqJyo5B2a5Czi2CCmIp0qrKovH93g25/v6aqtF6cb39yl3CCc6JyXqRndKZgaKZsmtOYeoKbbnZ5l2ubeXaXcmyppWdfZHlxf4RsaGZjbXV3Zl9hUVplUFFhSFZJVF9XU1tkaltkUEVDS0xKS0FKRDhQQFBNWFNYT1NRYGVlaVNkeHl3SUZFY11lWmhpU2loam5jamZgY19cXV1faGJhaGV8ZF5kZ2RrZGpsZmhsaJibf7GsVF1Lf6qwsrWws6KcmISXpqCgooykp5+XqYmZmJiUmZOSoJeNh4V7cH2EaHyPg5OagneRjo+KcICGj5OSbJiUfIiRkqOVg42pmZOSioSJeYN2iIBugZ+Gd4CShYeYoJV5kaGimZ+Js6Gitot6rKekrqVwqYCbkYaBnpR9pIGimoaYcZ6Eoq2uiZeLf4ykjZWDr6OVd7W2tsmic5SMg59gnpepbXmWh6CbdaGHd6B+kJaLgW9NZqOScZqIc6V7enVig4JtfqBscmRgnHN/dJdre2q0trTGpnOYfnqcapqaq3SBmmxzd5dpmXl0l3FQRH2zXmp1a3iGZmtmYnN0cG1VW1JYZ09SZ0lVTFhSVVxna25VZ1dNSkFKTUtHSk5BUUpQZGNqbWV1c3N+eHtudYl6e1VRT21eaFxraVJqaGlsZ21nY2VfXFxcX2liZGhre19dZGdjamZubWVpbGWinYmwqIVlQJSisqyvr7Whoo9/lqehoaOLpKacm6aCmZeXjpeQkJuSjYeDeWt5hmWDjH+Wn3l1j4iMgmqFhZKEi4WdjXqMipWlkoKXqJaLkYuAiXqAfYt5cI+ghXmBlIaIlZ6UfpKjppuVloNnbnicbKJkfHKleJyYcGingpmOfaV7oZeDlnKfdoCJlJWPuW2PiqJifZmjl4luc2ura3Wgbm+mYJtpi5BploeblXWigX6aYIuGjXVviGJooWaef2qbdXBkZ4iCb3KiW19bZKFuXoiMcXyAdHJkpW54omRmp2iXcouXbaFvUoiPbqBeZKdUi11UmG1tcmtxgW1waGt3c2pvUVZVVWVZU2xJWE9cSFhoaHJqWWtWUFJFVlxNWFNhVWhqXnd1e3xwfXxygnt/c3eOgIR3XlFzYWdicGdQa2hoa2xvaGRnX11dXWBqYmppdnVdXGNoY2ppcmxma21jnaWZpnpldG2Lp66lqbCxpp+Kf5apnJ2ji6GhmqGhgJWZlI6aj4uXkI2Je4ZxgIhoi4p8l5pzdIl9kHxlg4eViomVmoJ8iIaWpo+AoaqPhZCKgYp9gICOc2mPpYR9hZOMh5efjYaQqKWciaZ4lpt+pYmWjLKZnpGEr5efpXmYiXupdaeQhJpupaKMkoSMg7xtfKWvgoeGh5WXnaJ+pntyqJWhlmiffm+sY5aKlpN4qG2qo4GJdYiCd6uRpohrkrFsd7OMqWyLhm9voJ6SlWJ/q4yqd4GAjqefd599haSVnaBomod1q2aerYy2c3a+jKOTWYOmjathdXJ0b3t1cGJqfW5nbVNUWFRgYFxrTFxSXEldbG12X1txWFtfWmdzZW1vcWNxdGB3en55cnmDcoN+gXt7jYGCgHdieWRjbnNkUmxnZ29tcmlmaWFfXlxhamJsbHtvXFxiaWJtaXdtZ2xuYpamq52BgJ6klqqqnqinraOZiIGWqZmdoomapJyonYSMmpCGnJGFko2MjHSFeoiDb42FfZaSc3SGcpGDbn+LkoeGlJB9e4KFl6SNf6WkjYCOiYSUdYKHk25si6iAgouTjYianYiLkqqioI+AdJSXiH6BeZSvpH+CnHGPhnmSjYaAe3KojXJ9fXqXlpuEjXh7fX2IlJWTi3eRmaGihXt/imyMhlx6eXN6cWlvfpOKcYB0go+Uk3GGhIJljX9fgYGMeHZzlHVwem9viW+Fhl93aXiOZoKDho+qnH90fZZqiYhvfnV8g3VtbGaMc3h7l3eEWmpXeY9pbndycW93eG9da4VuaWdWWV5WXGRqY1VgVV5RX293eWtqd2Vqamp1fHBxdHNhb3Vic3uBeHV5gnV/gH+AeYuFgn58boBtZHluXlduZ2h1a3hqaWlkXGBaY2llbHF1blpbYmtkbGt5bWhsb2GOlbqpp4uhopunpJmknauioIODlqqQnZ+ImaaaqJiDgZyLfpaUh46KiYxygnyOfH6PhHqWjnRyg3CVhnx9kouGho+GeX6AhpijjHumn4qFj4+ElYOGjph3cYSqhY2RnI+HnZyGipqon6Cqg4mNlZt/foqXraiQk6iReHGfk4R8lHB/qodxfpVxam98gZ+Lf5GOi2huXYSNjZydoJBzl4yJcnVsg3Z0gFlyb4eRgn5/jGpdaWR7hYSIgGBpeHucfISNg3aCh4RpeoyJbGJxc4N3X3ONg4qRqJaHZ42Og253i4Jvg4t3bWRlY3mCepVaW2lmbXZbe3l3dG5zcoNmXG2Ja2tiWVhcWVhqcVpeYFleXWVyfXp0b3Rjamppe3xyenZ0ZG10aGx7f3V6fXt5eX+Af3CGiYR7fXN+enJ/aFRccmlsdnB1Z2tnZF1hWWpoa2pxcm1XW2VtbGdyeW9oam1gjIyrsaGQo6Gan5+YnpmooqF9gparjJ+ThpqhkKSVf3uYhXySmYmIhoaKcnyAi3aFi4KElYlyb4BzmIaEfpODg4aKgnqAhIqan4+BpZ+Gd46XiJWLi5yXhIN6rIGQl5mTiZybhoehqp+hoqOLiJObnaOZlquiqKehk5yJmZB+epCQhql/gJORkpOcsaWalJ2PjbGSmISmjY2WnaGKkZ2EiZOLbH2Od3dmg4aRi32JnoWHi4+IiIGFhJF3fHp1m6SKh4ugjIeWf4CNg4F3cXWGhH94iYiLkaeRhIeOh4OMkIt6hYmHjX91aoCDfHmZaXFoYHOKcH17d3Zvd3SBXV5vhmduX15ZWlxTZ3BVY1tbYWxoc3t7cm5wY2ppaH97bXh+cGhwcGxmgHtygoB3f31/hHttg4yGfHp5fH16g3hOZHZqc25xe2RrZWJiYFtzZnBmcnFsVV1sdG1oeHpwZ2lrZY2InrqflqOhmJWZmJSYpKCden6XqY2djIWfnIqdlnx4lIN7jpmJhoOEhm14gH9ygId+iJKDbWt+epeHhIOQfoCGhId8h4ONm52RhqmegnKKj4aSkouckXyNe6mDjZGXlY6alYaFm6afopqdhoOSmpmZkJmmoaaenpCXgpOMeH2JkIanfH2PkJGGmKmgnJOcjo2pjZKAno2KlJughI+YgIiPhHF5hnJ1YX+EkId2jJmBg4+ChoV/hoSVb3p2dZSkjI2Gm4aGkHWBjH5+c3N8iYV7eY2PhZSokIeFj4GCiYmIdIOGhol5bWp8f3ttaGtsZl55f2h8fHZ0dnR6d1xgcH1udGBjWlteUWZsU2RaXWFqaHV5fnBsbGNqameAf2tyf2trdG53boR5boaAdoKAfYV3coONh358e3yAe4KLYGl7a3VoaoNkamNgaVxjdWdvYnVta1RicXllb3l6cmVqbW2Lip+4mqGkn5OSlpeLmp+enHp3nKSQm4mGpJOKmJl4eYyFe4mRg4yCgoJse394coCFfYqQfGtofYKXiYGIjnx+hYSHfI+Aj5ubkIimm39wi4uMkoagoYqFjHynkIeOkZaSlJF3jKOgoZ2Wmn+BkJqZk42ao6Kkm5iSnICQh3uBhZCJoYF+jY2PfJekoKCSmZCQpYyPgZySipSZnX+Tk3+Ij4J2dYJxd2F+gY6Hc4qWfYiMcYx+goWGj2p5cnqOmpORgJh/iYxzg4l9fXJ6fI2GfHuTjoSXppSNhpB8hIWGhHSAgYWFeGRwen54eXBramZefXNofHV1c3xyf2peYHR2cHdkY1hdXlJqaFRlWF5gZ2l2eIFxZmtjbGdlf4BqbX1nbXBqfXeFemuLgXKBgX6BdXaCjYZ/fHqAgX1/j2pyg250aWKIaGxiX3FWdG9sbWB4aGxXanN2Y3R6enFia295iY2fs5Klpp2OkJiPhpygmpt7daOejZd/jKGKiJqWd3qFh36DiX6IgoF/cH56dHWChX6JkHdnY32Gl4qCio14fYCNg3mWgJWXlY2Vn5p9b4uBkZOFpZuHjImDppWEkYqVlpGQdZGdoaGYlJd5f46Yl4+Xmp2lnpqUlZ17koiFeYeYj59/goqOjHOXop2gkpiOj6GMjIOYmISUl5t/mY59io6CeHJ+bntkgHyLhnGHk4CRgmuHg4GAioVnd3B9iJSajn6UeY2LfYKJfnxygHmLhnqFkouMmaOXg4SMd4eDgoF1en+Gg3Nednd8c312ZmtjYH5qa3Zzc3V9cHtjY2FzbnVybWFZX11aa2RSYldfYGhrdHmGcWJqY2xmaHyCa2h0aGxvaH98gXlsj4VxgIODf3R8g42BgH56goN+fJBtdYl0dG1mimxqYmN1VoNpcG1geWdsYWp2cWV4e3lwX3FshYWQna+Yp6mejo2Xh4Wfk5WXfHaomomYeZaci4yZkHh7gIt9fIN7gIKBeHN4eXN9gIN/iIqAZF59i5SHf4WHdH1+in9+mISWk5aMo6CXfnKHe5ORiqaPjI6KkqCRg5CPk5eQioCPmKCakpCRdICOkpSKnZ2ep5mYjpWXdZCRi22HmpGbfIiJkIlvl52ZopOVioydi4aBk52AlJOWh5mJfIuKgntxemt2bXx/jH9uhZODlHhvgoR+fouBZnRqfYKYmIWAjnWSioV6iX93eYF+h4F9hI+GjZWlkXmFgnSIhnx/cXN+hYFrYHl0eXB8bmFuYmR7Ym5vdnN4d3JzYXZgb2x1bm9cWl5dXWpdT1xXYmFobXN6iWtfaWVqY2h3h21mbGhpbGeAfHp3bpCIc4CDhH10gYaJeoN9eoGEfXyOcnmLeHhtbIdraF9pcmKHaHFvZnZnbWxhemhqfHt3cGF3bYqBmZqroaSpnoqLkYaJnoqUlnx2rJeMlnyek5GWlIh2fnuKfHuAdnd/gG90c3pvhX2BgIl+fGFcfo+Shn+EhHJ6gIZ6j5GHkZGbkqSbk4F9gXyNipKjiY2KjZaajIWQl5KVjYiIjJKdk4+MjW6EkI+RiZ6ZoqGYl4qXk3CLm4ZniJuQlXuKhZCKcJaak6GRkoiKmIyCf5KffpOQk4uZj3yLhoh0c3VrcW92fYt1b4aRjpNydIB8goKJfWVybnp/m5V+hYp1koyCdYp7cIJ/god9ho2LhY6Wqo57iH1+ioR3fW5tfoOBYWZ3c3RuemFeb2BqdF5vanp5eWxycGV5XW1sc21zWFpdX2FqWk9XV2RjZnFxf4dlXWloZ2JncY1uY2hoZWlngHp3dW+OhXOBgYN8dYKJhXiFfHiEhnqAiXd/i3t6cnmDamtfcGh0f2txb21xZ29rZXtibn96d3Brd3eJf6OZo6ihp5uIjIqBj52Gkpp0f6iTkY2GoIyVk5CAc3x2hXh4f3Jze4Vrcm95bYl2f4CGbnFbWX6SjYiAgYF2dYF/f6CGj4qRnJegk5Z3iX6AjIicnYqPhpKXloWIlJiOlouKjY6MnYqOkYRtiYuPkYqclqGcmZaGmYlsh6WFZ4ifi5OAjYSMgXiTmJGdkZCJiZSNf36QmX2SjpCNmpJ9i4GEcHZwbG5vcXyHanODj5iKcXiAdYKJg3pndHB3gpuQfYqFe5WTe3iKdXKLfIeOe4uHhYqPnKWJfIR3gYp/d3dsaX6Af1txcnFvb3ZZXm9gb2peb2p8enFubWptd2Bwb2txbVlYYGFhbVdQU1llZmJ1b4SCYl1rbWRjZWuSbWBmZl9naoF1cnJvi4B0f4KAeXaAi4B5hX53h4Z2g4V7h4t/e3aKf2pxYnxihXxvcGx1amhubHd4X3F+eXtzdXN/gn6llputn6eXhYyDfpaVg46ddImek5KFipqMlY6MenJ4dIJwcoVzcXWIbG5sdGyHdoN9f21uVVGBq5SHgniAdnKDeYKggpCBkpGXm5GZd5F6goySpJqTjoiUmJKEhZaYi5OLiY6Ph52EkYt9couFiI+InJmfm5eVgZWAaoifiWiIoomUhZKEinGDkZePmo2PjIuPjXd7k5F7j4yNkpeMfIl9gWx3am9rbG17f2J6fo+XgXd6gXiDjX16aHVtdomXjICJh3yVkXJ7hnF4jnuLjnuJf4SOkZ+fhn19eIGKfHZvZ2p/gHdddm5ta3ByVV1uYXFhX2xueXBocGZnc3VocWxhd2VdVWVgYHFTUE5bZWRdeG+Ie15caHFiYmVlkWlfaGVbZ299b2txc4p9dn2FgHV2f4x5e4aAeIeDc4aFfoyMhHx5lXhncWqDYId+b29re2BpbXSAdF90fHiGd3NzhXx5oZCasZymj4OKf4KZiX+KnH6KmJKOhIiXjo6OhHd0dnOAcG+Fc3Bxg29qaXVtgm59fG11c1JOgt/JktaTfHB0g3WDn4KRdpSQmJuQmXuTcoWQn6GTk5CJkpuThX2VlYeMjYeSjYicf46BeHuMf4iMipycnJuWlHqOeGmLlIpuiqWGlImYhIZjjJGYjZSJlouMiYtwepWJfI+Ji5OSinqGfX9tfGVzcGtte3pcgXqQj4F7fn+Aho97eml1a3SMkIqDh4Z+l4xtf4Bwgo6Ajol+hXuEkZabm4x9d3iCj3hya2VufYFqZ3NuZ2hzbFNdb2RwWl9scndmbGtiZ3hzcHBkX3dgYVVrX150T01LX2ZjXHhwinRcW2V2YGFkZI5jYGZiWGlzc21rcXaLfHR5hoJ2d36Lc3+Gf3qJf3GJh4GQioh8fpl2ZXNufGWHf25wa4Baa255enJgdnp7jXZydop2ep+MnK+boJGDhXiIlX57iJyGhJ6QjoWMl4STjoeBdXdweXBuhG9tbn5yY2R3cHxuenxqaGxipJrB3K7vonNsdYN1hKGEkW6Vj5SflJuAkXCFi6OXiY6VipCdlYOAlI+FiI+AkoqKl36He3Z/iXiGhY6bm5eZj5B2i3hwiYuNf42mhpOLnoaGXouUl4mOiI2KioSJbHyXgn6Kh4qRkIZ2hn5+bH1keHVqb3p0WIh7koeGen9/gIaNf3pmdGqBi5CLhISBjZiGbYN3b4mTg5KGf4R7gpKXlJqRdXR4h4x0cnBlc3eAYHJsb2FodGZSYHBna1VfbnR5YXJjYGl+cXJuW2NyYWNWblpcd0xMS2NmYV12c4ptW1xkeF5gZGaEX2NjXlhpcmtua3J3i31zd4SBeHh8iXGDhHx9iHt0i4iHlYWMf3+Yc2h1cXlsi3tudHCAV3B5dnlxZHZ5hoxodoCJcYCdiJmonKOThX1xjJN4eImcg4SfjI58lYx/moiEfHN3cHNqb4FraWx8dF5gd3Z7cHR6Z2BlfOvatcnD3IlzbHSAdoqaiIxpl4+OnJWSgYhwhYigjoWLlYqMl5N8jZKHgoiPepGLho+CgHd4g4Ryh4KTm5aUmIaNdoiAcoeEi4mcpIWWjqCEimGDlY+FiIWIjIaAh2h9lH99hIWKjo+Ccod/gHJ3aHZyaXR4bVqNfZODhn2Ag4GEi4N2YnVtioKRjISAgJOSfm+DbXqIkYiUhX2Cf4KTlJKYiW9yeoyFdGtvaXB2f11xZ25caXRfUWRxaGZTX3B2dGBwYF1og3FzaldnaWNpV21XW3RMSktlZl5hcnOFaVtcZXleXmRnemBkX11Za25lbmp0d4p+c3KBf3t2eohzhYN8f4d2doqFj5iBjYJ7k3Zsd3Z5eZN1bnd6fVh5hXGAbmd4dpGCZHaGhXGKloaaoZuhioZzb5KLcXaNmnyJmYiJe59/g5l/gnlxdG5vZHJ+aGZsdnZbX3h7enFxf2lhZ2F/1baOkaZ4bnF3e3GSkIyGapiNiJqQi4V6aIeLmYaBkpGGhpeMe4yMgICJjXuQjX6JhXp1e4N8cYaAlZmOk5SCiXaEiHiFgo2Vn6GIl5GhgIlhf5SHhIeDiIx/f4JmfZGAfoGEjI+Qfm2DfYN1bG13dXR3dmxjjoKPgIV/fISAhYl/cGB0coZ9kI6DfX+SinpyhWd7hYyIjYV8hYCBlZCRk4VvcHmLfnRsbWlpd3phZ2ppWGt0WVJocmliUGJyeGxiZV5aaoRudGJcZ19lbV9vVFpuTUdOZmRcZm5ygGtaW2NzX1xja3ZkZV1dWmxsYm1qc3aGgHFvf3x9dHiGeIWDfICHdXiJgZKVe4mGdomBb3h5e4OSb217gHZeg390gWxoenOUc2dzh3xykpKEmp+bn4aHdXWTfm11kpZ9h5CDio2ZfIyadn52cW9samF0fGdiaXN5WmB3e3ltcX5lZGhoV52PX3Jzl7zEhHZxlIiPfXGWi4abkouHcmqIj5aAe5WMgYSai3uKhnx7iYt/lIh1iYZ2d36BcnWGgZ6UhZSPhIRygYp3h36Lm5+aiJWPnoGJZn6Tgn+FgoiJcYF9Zn6MfHmAgIiMj31pgX6EdmdweXhzd3Rsa46Gi4KKgHmCgYWEgWxfc3l7fo6Lh3yCkIF/c4JqeoWJjYeFeYV+gpmOkY1+bm17iX12dG5mZXt0YltwYlducVNTbXJoYU5mdHhmYF5dWW+Bb3NaZWJdam5gcE9ZalFEU2ZgWmpubXxuWVtdbWNaYnB2Y2ZcXWBraWNsanN2gYNwbX58f3R1g3qDgnyBhXZ+iIGWkHiEinSBiHJ5eX6NkG9ve4BxaYF4en5tbHt1lWtqeIR0a5ONhp+ZoJmEiG59i3Vpd5eOfoGKgpSXiXmPlW96dHFraWRgc3poYGVweVpgcnx5Z3F5YWVlj7Gyd0tiWqXZ0JZxe5CKj3d9k4qEmJCLhW5rhZKSenmSh4GEmIl7hn93d4mKhJaAcIuIcXV+e2p5hYOlkISTjYR/cICEeIZ7iJ2blo2VkpaGiHF7k4N9goKIgm2Ad2iAhHhygIGDioh8ZX5/hHZkcXOAaXlxb3WZjoaDi313eYGFeoNrXHJ/c4KJh4p+h4p7iXOCb3KFiJCGhnOFe4KajY6FeW5vfoR/dnpkZmh7b15YdlpYcGtOV3FyZmBLbHd0YV5cW1p1fnNwWGddZmpyYG9OV2dSP1hmXlpva2d6cVtaWGtlWWNweV5nXF5lbGdla2lxd3+Ib2x/foB1b4J7f4J/gn92gYSJl4lxgo1xe4Z8enmEk4x1anl+a29+dH98b3J7epNvboF+eGeSi4OhmZyRgoVmhoNvZ3mViH1+hIKYiYF8jo1peHNra2ZfYW95bV9ib3hcZGuCeWFxdl9lZdTqvYsyOj6Ljn9xeIWHjY11gpaMfpKNi35ta4SMjHV8j3+FgZSIfIJ3bnaHhIOXd2+IhWx1e3VmeYKDp4uCj4uEfm6BdnmFfImfko6Sk5SOjId/e5KGd36DjIJqf3JogH54bnx9gouEd2J6hYJyZHJpfm51cnWCnIyBgIWAdHZ+gHOCb1xuf3V5i4SLfIiBfol5e3JtioWRhYxzg3qAl4yLgHVua3aAgHV0W2dndW5XVntSWW9kTFpycmVbSXB4b1xbW1lddH50aFliW2dmb2RqTVdmUT1dZVxddWVgdXBaWVRuY1lkcHhZaF1fZ21naWtpcHd9jm1pgoR/eW6AfH2Bf4F6dYKAjZOEcIGLbnd+gHt7iJKJf2h6fWpze3KFenN2fX6MeXiEfXxrjI2Em56WjIGAbI19a2h+jYt6fX6Dk4J+fYqIa3ZyZ2hiW2Jnc29fYWtzYGhwiHlic3ReY2SboI9uXDVar7V0aYCIfJGGdYWVhXOOiol2b2yEgoZ0eYl4iXySh3l+cmd2iX5+mG9xh39pdnluZnmHhKSHgIeNin5vgHeCg3+Pm4mElpOZioyFiXyPiHB6fYR7aH5saoB7emp7d4KIgXJgd4F+cmRyZ3aDbnV7hpaSgn2CgW93enx1f21ZcIB3dY2Dh3iIdoOJe3l0b4uCkYKGc4B+f5SJinxvbmltgYF0bVxmZHJwUFp6TVtuW09bcm9kVUtzeGlXWVlaYXCAdGBdXWFnZGlpZk5ZaE1AYGNbYHVhXXVsWFdTdGFaZG5xVmpeYmhqZ21saHB3fJNsaISKfX1wfn57gYCBend/f4qLg3F8h29xd4N/e4mMj4NqfXttd3h2inZ8eH+Chn+Dfn16bYWMiJmjjYSDe3WLeGtshIeQeH16gpGAgH6Lg3BzcWNmXllmX29vX2BncGZqboh0YXRvW2FkanZ7gL+cpqTIuHGEgnKSe3eFkoJzkIuHcnJvg3uDdHSHdIh3k4h5eXBjd4d6gJNpcoR2Z3d1Y2p8goidgYB/jo9+c4B1h3uClJKFepiPlpCIgol7iIhreHl+dGd6aGt/eXRpeneAg31oYHiIfWtrdGh8gWp2gYyRlX97fn9xfHZ8dH9iVnh+c3SLhYN9hHGHinh5cXGFhI6Af3p/fnePhoR3anFpbIeBcW9cZmFxbUlkdUtdbFRTWXJuYlFPdHhhUlhYXWFwgnNbYVxpZWVka2RQW3BJRGNgW2NwXl13aFVXVnZdW2VtZ1VrXmFpZ2VubmhwdnqTbWmIjXl9cnt+eYKBgXx2fYOIhoNwd4RybXeCgn6Ji5N/cIB7d3h6gIx0gnh+gYGChHmAdW9+ioubnoh9hXp3hXtndIWLkHl+f3uIhoR2j4BncG5fZFxYZVltcmFgYHBsa2iIbmF0aVlfZG6Ad6naqceGh7JxiHdvjHR6hY1/eZKJf3RzdH13f29xf22FdJOFeHRrYHqCeYmPZnKEcGd1blttfYCQk3+AeJGTfnl8bop4g5OOhnaYjJOQiIaGe3+EbHR2fmxndmRte3Ztand3f398YWJ4hnppdXVjfnxndYePjZZ8dYF3cYB7fW6AWld1f3B2hYh/gXptiYZ0emx2gYSFf3x+en10jIJ+dGh0ZW6Kg2xzWWhec2RHbW1LWmBXVlV3bWJQUnR2WFBWWF5hcYRvXGBjbWVkXm9jVFxyR0JmX11mZ11be2JRVlx0W1tna2FVal9gbmVma3FocHZ4jnRrjo11f3Z4fneBhIF7dH2DiIeDb3KAdHF1foWCiY2Ke3d/eIN7fIWHd4d8fYF+hIB7fnJ1eYyNoIyJeYl1dIN4Xn2Fl4t4hoNzhYaEd4l7Ym5tXGJbW2FWaXNjYFtnbnBmh3FhcWZXXWNrf3zKzoe5oWptbYpscYNxe4OJfnqQhHl4c3h1dHtqbHZjhHWRgnZvZl99gnqLimVygmtqcWNYbXqFm4iCgXOXlHh/fW+Kc4WMjol0mZCSiYaLg3x5fXBwb3xmaHFibXhxamxxeH19el1leoB4anZ4ZoN3Z3WIjI6VfXKIam9+gXlvfV1Zc39udYGMfIJvcIqAcXdpeIGCgYJ4fnN8dYd9e3Nnc2Fui4FrcVdpXXZbR21qTFZVXVNVe2thT1R1clBRVFdeYnSFaV1gbGpmY1pvYVhicEhBZ1xgZV5cVnteTlVlcFlbamhdV2hgXnJlamhyaHBzd4Z4bpWLdH96eH55g4h/dXJ/hoWOgnBwe3h3dnmGhoeMhnp8f3SLfX2GhIOHfn5+fYd/fHh1eHiRk59/jHyKbXWAeGSDhpWFc5GKb4WFgXqDdGRuallfW1xdVGdyZGBZZHFyZ4ByYmtlV1tgan94vq57n7duYXOFaHN6cXiBhHp9i353d3J2b3t2ZWpvYYd1joBzamJefnh5i4RmcX9oa2taVm93iaOBhX9xmZNygXp3hG+DhJSKdZeKjomFiYV9eHRxbmh4X2psYG12amdqbHl3enZaZ318eWZzfm2FdGV1ho2GloBwjGdre4R1bnViXXF9bHV9jHyCZ3aHfm5xaXZ/eX+AdH5te3yCe3lxZmxibol9bG1WaV92VUppak5RTmdMWHtoYU5VdWtMUVRVX2Z1g2ZeYHFoZ2JXal1ca2hKRGpZYWRWWVV5WU1WbWpZXWtkXFllY150ZW1kcWdycHWBeHGZhnZ/fnd/fIWHfXVzgoiAlYJuc3l7enNzhYeJiYN4gX11j358hIqNg4GEe36Lg3t2e3d3mp2YeomChml2fHtsg4OSf3KOgXCFgn+Cf3BnbGdYXVtcW1NkcGReV2JydWp1b2VlY1dcW2h/cG9ygHOJZGR5fWlzdXNygYN3gIN4dnJ1bmt6cWFna2eGc42DbWZdX31we4l/aW14Z2pkVVdyb42mfIR7dpaRdH10fnxvfn2Th3iafYmHg4eDfXVwcWxndFxsZ15sdGRnZWl6b3tyWWiBd3VocIF4gnZid4aLfJWBb4xrbXuCcWd0ZmFuemdzeIt8f2J3hHdqbHJ1fHJ7e3R/aIB/gHl3b2RmYm2Fe2xqVWhhb1JKaGpPS05vR116ZmFNVXRkSk9TV2Fqdn5mXWdzaWZgVmRXYnBcTEtqV2NhVVRVc1ZMWHVkWV5rYFxaY2VfdmdtYnBpdG9yfnR0mYJ3f4B4gH+GhHp9dYKEf5eFbnJ0fHp1cYSFj4GAeot1c5B/fIGVjYCFhH19jIZ6fYB2e6OlinmIhYRrdHt6dYKAi3puhHN5hH2Cg3ZvamllVl1bWlpTYm5kW1hhc3tqaG1pYGJYX1ppf2lrb4BnbGBoeXhqcnNzbYOAen98dXRtemhqeWpfZW5ogXaPhGdlWGJ3an6He29qcGdmXVRYb2eOp3eBenyQjnl2cYBxdXh7kYF6l3aHg4CFiHZqcnVnZ25bbGNdbXJfZ2FqeGh7bFtug3N0anCBfnp4YXeGhXmQhXSJcnB6gXNkcmldcXhlcnSJfHljdIBxZ2p5dXNteXh2eWWEfH95d3FkZGNte3xqalRnYWVTSmtnT0dRakVgd2ZhTVNyXUpNVFpla3d8Zl5tcWlkXVZhVW5uVkpTZ1dmXlhNVWxUSlt4Xltea11dWmNlYHlobGFvb3ZucHd1eph+d3+BeYCAh4Z6eXqDfoGThHF0dH95dnSFiJF9gHyQa3KVgHuCn4V+h32AfoaCgIp7doSrnn96h4eDa3KBeXWAfoB0boZufIBzioBqcG5kZFhfWllaVGJqZ1taX3WCaV5tbFxhV1xca4FlcnR9aWlca3Z1Z3N2cWyEe318eHVybHlnaXhmXWRzaHp3koFjY1RlcGiChXh4Z2lqYVdWWWdjjqdvfneAi457cXJ/aXtxfI59eJBzhX5/f4ZuZHVyZGdnXGphXG9vXGdfbXRlemhddIBvcmtxfH51dmJ1hox7iIiBgHlzdYB2YnFuW3J0Y3FzhXx1ZXOAbWFte3Branx6dnNnh3Z7enZxZWJkbXJ9aWtTZ11cVEtxYlBGVWBHYnZmYUtTb1hKTVhYZ2t1e2VlbnFmZFpXXlh3ZVRKXGJXaFhZSFdlUEhhd1pdX2xaXlxhY15+aWpgb3R4bXBudoOXenKAgHx/iYyGfXV1hniHjHx0dXWCeXp6goyOfX6EiWlzloF6ip1+foV6gXp/fIaIc3GPrYx7e4aPfWVxh3lzfHp1cm+GbHt+bI96Y3BvYmVdZVZZWVdjZmtfXV1zhWhYcW5bXlhaXGx7YnB3dWxhWWxzc2d0dW9sg3h+f3h2bW50ZGl0ZVtndWZ2dpF6X11SZmZrg4J0fmJkalxUV11iY4+laHh0g4aReW5xfGp6b32HfXaKdIJ5fHh/aGR2bGBmX15pXlxza1llXW9vYnplXHd8a25ucHh5dHVlc4STf4iDiXx3cHN/dGN4ZVxxcWJxcoJ9dGdygGVfbndqZWh6fXVvcIN2dH10cmJfZm1ufGRoU2dXWFNNdl9QSllXSGJ0Y2FJVG1TSk1aV2lscXxjbWxzY2JaWlthd1xTS2NdWGlTV0dZYE1HaXRYXmBsW1tfYmJchGloYW54eW1vanaBkHltg36AgZOIhIF2dIl0jIZ0cnZ2gnh9fX6MkIB+k35wd5WDfJiSeYCAeHp+gHSIg3RwmaF6en+JlHdjdIZ4c3d0a3Rufmt4fHCRc15wbmBnYmxUWlpXaGNtZltccYllU3JuW1pYV2BsdmNpdWppXlltc3Brc3NzaYR8fn57dm5ubGRpcWNbanJkdHaOc1tXU2VhcoB/coJdYmNdU1pgXGORn2VxcYWEknVsbHtvcHJ8fn1zgniAc3p6emRldWddYllgZ1pedmhXYl1waGF3YVt8dmlqcm94dHN1aXGCloSHf4V3dGtxfm9neFhdbG5jcnSBenRncH5cYHByYmBrcn9tbnZ/c3J4a3FhXGVsbHpgZlJlU1ZRT3VbUU9YUUhjc2FgR1ZqUElQWlVra2t8ZW5vcWJbWlhZbHFXUlBmVlZoU1RGWlxOSHF0WF9jbGJYYGBhXYtqY2RtenhscGl1eYd7a4N9f4SafIOEeXyHbY+Hcm92enx0goJ8i4+Dgpd0eIGThYGeiXWBgIF0f4Jxh4J1b6GWc3qGi4Z6ZHaJbm16bmZ4cHprc3ZzjWtedW5hZ2VrUl1bVWdhbGtaXHGMZE9vbl1WWFVnaXNoYnRlZFxYbXRsb3V0eGqGfH97h3aPc2Nka25hXG5tY3N4h2taVFZjZHh9fXGGXWRfY1RaX1lilZVjbnCDhYp0a2l8cGd1eHV9bXt1dnB6f3ZfZnJjW11WYWNYYXRlVV9gbWRhcV1dfnBoaXRxdHF1d2tthZSCiXyGcnNncH5ydHBUXGdrZnJ1gXd0Y212VmNybFtfcGd+Zm54fnR0c2tuYVpkaWp3XmVTY1RVUFNsVlBWUlBHZHJfYUZYaU5JWFRWbWhkfGlreGtiV11VW3RkU1JXaFFYZlRTSFpaUE13dlpfZWtpWWFgXl6ObmJma3l1bm9pdnaAf2yDgH2HmHuAh4GJfmuTiHJndIB7dYCDfYmPf4uTcnyKkYWHn4Z7f4aMc4GGc32Cdm6ki3KAjYt2d2x5i2Bke3BmeXN4bG1xd4NnZHxtY2ZnaFNfXlVnX2xuW15ujWhOaW1gVFZTb2dza2V4ZGRcWG9zbHF6d3Jsh3t/dpt6eWthZWxtXmBvamVweH5nWlZYYGx4fHtwhF9jX2dWWF9XY5uIYmtwgYd9eGxsem5deHNufGt2dG9wfIBzWGpuXlhcVWFiV2RwY1NeYmlhYmxaYX5sZmx0dm9td3dsaYaMgIp7iW5yZnJ+bnRuZFthaWlwdIF0c15pbVNlcWVWY29kfGRzeH13bHBta2BZYWZndFxkVWBVUk5XZFJPW05PSGRvXGJHWWlNSl9LWG1kYHhpbn5kYFVfVF11XFNSYGZOXWFVU0pcWVBZdHVdX2VraFhiYVtejXFjZ2p4cXNuaHZ0eoRygoN6iI5+fImHjXlukIp1bHOCdH9/iIWHkYSVj3l9jI6HkZuEgHyMhXN/gXN0eHJvk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjYyMjIyMjI2Ojo6Njo6Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjIyMjIyMjY6Ojo6Ojo6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPi4xMTExL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERBUsza2NjY2N1tPURERERDWGhnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI8tGh0dHRwaaIWCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTJG2Orn5+fn7WcuNTU1NTRNYV9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmIiIiIiIeNkJCQkJCQjIeHh4eHh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWFhYWFhYaTlJSUlJSVioWFhYWFhYeJiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95enp7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkpKRiYeOipCSkpOPjo+MjoWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYuKi4uLjIuNjo6Ojo6OjY2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQkIeJiIiNiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCNhIiFho+JjI+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkYmDhoeIjIiOj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjoiHiIaMiI+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2Qjo2Mi42Mjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4CBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9/f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhYaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9+f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dXR2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2loZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3ent8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ojs4OTo4Nzo8OTc4Ozs+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1c3FzeHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08OTc5Ojo5ODg6Ojc4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Ozw8Pj89PD07Ojw9PT08PDw8Ozs6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV1dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDQ0A+PD0/QD8/PTs+PT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl7e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VEPz07PEA+Ojs6Ojk3Ojw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fX1+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz9BQUFCQUA9PD07Pj06Ojo8Ojg5ODg6Oz0/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAPz8/QD0/QD48PkA/PT09Pz49PkNEPzs8PT5APT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkVDREE/QEBAPz1APjw9Pz9AQEBDQEA/QEA+PTw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEFAPjs+PD89PDo+PT9CQkVAP0BOYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVGRkZKTk5LSklHR0hLTEpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8e3t8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBERUQ/PEFDREI/PkE/QURFRENXdYaJin5YR0lKTExOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm9wcXJ2dnl7e3t6fX1+fn19fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpISUdISElHRkJERkREQ0FVdIeJh4eGiIJXSUxNTE1NTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTEtKS01KS0hIRkZHRkVQbISHhoaGh4eIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz8/REZIREVHSUtJSUdISUdJSUlKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tLS0tLTUxLTUxJRkpWbIGGhYSEhoaGh4iGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkVEQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVIR0lJS0xPTk5RTlFecoGFg4SFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QTs5OTk9PT47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5/fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njs8Q0BCRkhLSExLTVRne4SEg4KDhIaJiouLi4qJiouMiVQ7ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2Nzc3Nzg6Nzc3ODo7NzY4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn9+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9OjxEQkRGRUpieISEgoKDgoWJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc3OTk3NjY3NjU6Ojs6Ojw4OTg5OTg3Nzo6Ojg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT1BRV2tycnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3OkE5PEQ/XYSDg4OEhISGiYqKiIeIiIiKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj48Ojw7PDs8Ozk6PDg6Ojs6OTk5PD88PUFCRElKTEtKS0xXb3J0dXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk5OTk6Pj0/P0R3goOEhIWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVCQUFCPkBDQUA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEFAPz9BPD48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6Ozw6Ojo8Oz0+QD89YYWChIOFhIaJiYiHhoaGh4iJiouLioqKi4qLXj5ER0lLSkpGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURFRUFGRUZERkZEQEI+PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj06PDo9PT4+Oz48Pz5CP0p+g4SFhoaGiImIiIeGhoaHiYqKi4yNjIyLioqHV0dMTE1LTklJS0hJSkpJRUNERkdGRENFRkRCSElLR0hHRkdHRUtKTElLS0pDRkNDREJBQUNCRENDRERDQT08PkBocHN0dHZ3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f3+AgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTc7Pjs8Oj0/Pj88Pz5CQUQ+aISChYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlKSEtGREdISElFRUhGRkVMTE1JSkdHSElKTk1PTUxOS0hHR0dFRUNGRkZGREVISEZDQT9ATG1wdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw6Ozw6PT88PT0/QENCSFN+g4SEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMTExKSEhGSklESkhHS0pISkdHR0tMTkxMSEhJSk1QTk9OTU9LSUdJSkhJRElISEZGR0dJR0NCQUNVb3F1dnh6e3h4enp8fH1+fn9/fn59fn1+fn5+f39+gH9/f39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6Ozc8PTo8Pzw8PT9CQ0NMbYSDhISFhYaHiIiIiIiHhoiIiIiIiYyMi4yMjIuLi4teUlJQTU5NS0pHRkNISkdMSkdLT0xLSkpNTUxPUE5ISUtMT1FRUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkBCQlxwcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OD89PT5ARUQ9QkRDRkp1hoODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKRUZGS09OT1dWUVBPUVNSTlNUT01TTFBTVVdSU1JQTEpNTU1LTkdHSkZGSUpEREVFQkRDY3F1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz08QT9BQURUS0JISUZJS3iGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOztRU1JgdV1VVlRWWVlTWVhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLR0hKSEVGSUlJSElqc3Z5eXp5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0dGRT8/QUBFQUNGRENES1ZQSk9PTlBQeYaFh4aFhoeIiIeIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A/QFZVWVxkYFZZYnJeXVddWlZFUVlbXFlfVFlnUlVWWFRUVlNPT01LTEpJSUxNS09NU290dnh5eHd5eXp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH5/fn5+VkpKSUhHRkREQkE/SExJTVBLSUpPU1FQVFZVVlR1hYSFhYWFhoeIh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JXVlRaWnWDWVV9kGFcWF1eV0lWXl5bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHl4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktKSUlGQkRAQTpPUVFXWFBQUFFSU1JWV1dXV2yBgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaWlhcaGJHT1ppZ1xbXF1dV1JOU1BQUVZWVlZZWm9zdXd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpaUlNRT1FSUVVSVVNWXnV4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlVTVF5aWFdXV3prWFpcXF5UUVFQSU5PV1ZYW1pkcXR2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAgH9/gH5+enh3dnN1e39/gIB0a35+a3F5XltWVVNST0tGQ0RBTV6DbFZSU09PUU9RVlFTUlJUY2R2gIOCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUVFOS1JVUk1PWVFNTlFTVVVNUVNSUE9NTEhDSUdSU1RaXW1ydnZ1dHR3e3p6e3t9e319fX59fX1+fX5/f39/f4B/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRgZF1eW1lVUUxJTElhbJJ0UFFTTVFSUFNbUlNSUVJVVWJze3x+gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5CQkNDQT9EUENEQEM+QkhHVkBJTk1HXWlRSEZPRkRFRkhHSEJDSEdIS0dEQkFDQE5QTVJkdHV2dXN0dnl8ent7e3x9fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZoZWViXFhTUVBVUnNXZVtPT05MUVJQVVlTVVFRVFJPVmBrbHN2ent4eXVybnN0c3l4fn6DgIODgoGCgIKBgWtMRz4+Ojo+QD8+Pj5qUEphRUZISUVCP0hNTUdNUVVKQkU/Pjw9PD09Pz0/QUNDQD88PUI+SU1GVW91dXZzdHZ4enx6fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKT1BOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxva2hgbnJpbWxxdXt6fXt4enx8eHd4ZEJAQEE8OkJDQUFDQVtcTntOT09OS0xNT09QTEtMV05IR0FBPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV1d3V2d3l8fHx9fHx8fH59fH19fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT09eXFpJR09RUU9NUFFOUVJTVlhTUllUTllaW1dZXF9eX2VgXV5xd2teYGdrd29vbGpvbm5sZmJZR0ZGSEJBRkhFRUZDTFFPYVdSWFFQU1NSVVtPT1FXUE1KREY+Ojk2NTg3OTc5OjM2NTc5NTxCPWZ0dXd4d3l5e319fHx7fH19fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LU1RTUFFVT0xSU1RXWFNUWFFMWFlZVlhYVlhZXVdYWGhza11WYHRrYWFfXWRgX15ZVVBNT01MSUdKS0lIRkNQT1NaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1OTlHbnJ1eXl6e3t9fX19fHt9fH1+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BXVlZTVFZPT1VWV1hZU1VUTEtTVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5NTUxKRlBQVVlTVE9KTk9VU1RcVlJVU1NPTUxJSEhGPz49Ojc4NzY1OTk2NzU2NVdxcXR4enp7fH19fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1RTVlRSWFhZWVlSVU9JR09QT09NUkpPUE9PTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFBPTk5NUE5UUlBSTElMS09SUFFSU1RRU09MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVVFTRkZBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPTNAPmpvYVJSUUBHVFFPUFBRTlFPUE9MSkxMT1BOTVBRUU5QT0pMTU1LR0VFQ0I7PT08OT1HNjY3NkRucXV3enx7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVllZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JCOERNU11nU1FTQUdVUE9RUVBNTU5MSkxLTE5PT1FMTk5NSU1MSUtLTEtHRkZFRDxBQT47QEU7PDg5VHJzdXl7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E+PT1BQEI9PkVIRkRGRklHSkpARkFBQEVHRElPSFFSYVxRUFJPU05PT0xMT01LTUxNT05bVktNUU9ISkhDSUpMTEtGRkZFP0JDPj1CRz9CP0BkcnV3e3p7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj87PkFAQD5BRElFQ0hHSUdJRUJCPz48QkFAR0lETU9iZVBNT01XS0xOS0tNTUxMS05OU2RNSkxSSUlJRUJJSkxNTkpHSUZCQkJAP0VGRUhETG9wdnp5eXt7enx6d3R4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xMSU1QTVBPSEtFP0I9OTk5Oj9CPzxBQkFBRERHS0ZESUlHR0hDQz9CPj8/QD5DRURMTVFUTEpJTVRGSUlKTElKS0lKTE1PUFJQS0dDS0dDQ0tKTE5PTklKSUdDQ0NESUpNTElac254eXh6e3t5fHZycHVydHl5dnhqcW5qbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZXFISkNGR0hHSktJSkxER0I8Pj06Ojo7QUI/PUJCQ0NIRUpMSkVJSUZHSENDO0FAQj5AP0JFRElNT0dISkdIS0RISUtNSEpMSElKTEpNXVJISUROR0JFTEtOTlFOTE1KS0ZHR0pNTlJOTWNuand2d3t5e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhlcEZKQ0ZFRkRFRUZFR0NDQD08PTo7OjtBREE/QkNFRUlGSkpMRklJR0ZGREI6QUNDPj9DQ0NER0tNSEpOSERIRElMTk1ISUxHRkZJSUxOS0lIRU9JQ0dOTVBOUE5PT01LSUhJT1NRUk5TZ2dmcm9zeHZ7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZl9wR0pDRUVEQkJBRUBEQj4/Pjs7Oz07PT9EQj9BQ0ZHSkZKSUxIR0dHRkVDPz1ERUI+QUNCQ0VHSElHTVBJRkZGS05PS0ZISUZFQ0RJSUhLSUdIUEtESk1NUU5PTk9QTkpKSU1SVVVSUFhlYWFtZnByb3J5emdlaGhjaWxmcWxmbG1naWtsc21wdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VERkJBQEFEPEJBPkE9Ojo9Pzs+P0FCP0BCRUdKRkpHSUdGRkZFRENBQUVGQ0JCQkRFRUdHSEZMUExJT0pKTEtJRkhFRkVDQ0hISEtKR0tSTUNPT05RT09PTk9PS0tLUFVXVlZUWWBfXWlgbWpuaHJzYmVmZmRoaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNwcmtrc01HR0VHQUFAQ0Q8QUFAQzw4Oj0+Oj89QEJAQEBERkhFSEZGSEZFRURDREJESUZDR0VBRUdFRkZHRUpNS0hRTUpLSEhJRUZISEVDSUlKS01LUFNORFJTUVFSTk9NT1BNTE5TV1ZXWVZYXlpdZGBoY2ppZ2tfZGVmY2hnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hBQUJFRTxAQ0JEPDc6PT47PjtBQj4/P0NFRkRGRERHRUNFQ0RGRkZKRUVJR0JHSEZHRkVDRkpKR01LTEtISktGSUhKSEVLS0xMTk9SVE9IVFVUUVRQUU1OUU5NUVdaVlpZV1peWlhhYGBgXmhlY2BkZWdnamhoamdobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9zc3lNSEhHSURBQ0dFPEBFQkQ8ODo+Pj48PEJDPUA+QUJGQ0VDQ0dEQ0RFRkdHR0lGR0tIQ0lIR0lHRkRIS0lHS0hNS0pLTEhLSk1LSU5MTk5PUlVWT0xWVlRRVFJSTE9RUE9UWVpZXFpaXF9fXWBjXlxiZGxjYGRnaHKFaGdqZmpubnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtJS0hKRkJER0U9QUdEREA5PD5APz4/Q0I8QD5BQUZDRURDSERGREZGSEhGSEdJS0pFSkhISkhGRkxISEhKR0xMTExMSU1KTU5NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW11eYGBhYGJlXmRgZmhgZWhqZHNzZmpoZ2xwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd3B3SUpMSUtHQkVERTxBRkREQjs/P0FAQEFEQUBCPkFDSEJFREZHRUlFRkVJSEZJSEpMSEhKSklLSkZKS0hJSkpHS0tNTEpJTEtNTk5PTE9QUlVXVk1OVFZVU1JRUE1OVFNSV1teXl9dXmBgYWFiYGNkZWJkaWNkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV1c3Bzd3R1dXd2dXV0ZXFza3BxanJ2cHdKTEtLTEdDQ0FFPD9FRUVDPUFBQ0JCQ0VBQ0RBQUVHQ0dHSEZFSUZDR0pHR0pFSUxISUpNS01MR0tJSEtLTlFLUlFMU01KTU1OUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5hY15gZmJhY2luaGNpaGhteHZtaGlub3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnNxcXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0RBQEQ+PURFRkM/Q0FFRERGQ0JFR0NDSUVCSEpJR0hKRkRLSkdISkhJS0dKSk5LTkxJTEhKTUtaZkpkXEtsUkdOTV9uVWxzW3FwYndjUlBidnVodWNhdmFYbnFiZHZpbnpmXGx1YGxrVV93dmlqaGhmZ2xtam1vam1vc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cnFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj88REVGRENDQ0VFREZCRUZHRERKRERKTEtJS0xHR05KSEpLR0tKSUtKTkxNTUxMSU1MTFtzYmRwXmxsVUxOZXJdZ2VxbG50Z3BpX2FZbm1icHBia2pqZ29xdGV0bm5ccHZncE5LcXl2a2Fha2VlbHhta3Zsbm9zcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0FBPz1CRUZCRUNFREVFRENISEdERUtIR0tNTUpMTEZKTkhKS0pJS0pKSUtNTU5NTU1LTk1NW3Jwb25wcGxrTVBRbFhOaWJ0cnBhbW92XFlsUFttbVpxbWtvbXh4dHNpcF1gc2xxalV1eXhvY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0dGRUVCQUI9Pz9FR0JHRElFRURCRklISERHS0pHTUxOSkxNR0xOSU1LSEpNSUpKSkpOT05OTUxOTUxcaGR1XWxxV2xOT1FtVVprXmtsdmFsZHRUZWNObFlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdoYWNpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSUVFRENBQjxCQEJGQ0dGS0dFQ0NIS0hIRklMS0ZNS0tSUkxITU1ITkpJSE5HSkpISE5PTU5MSk5NSlp0cHBvcXFtbE9RUm5Zc2tnb29xcW9tdF5uWGF0X25vcG9xcm9vdXN0dGpbXnRjd3hyam56aGFhY2ZhYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRJS0hKQ0VFRUBAPkNDQUZDSElNSEZDRkpMSUdGS01MRk9KS1dSS0dLSkpOSUlKTElLSklJS0xNTUxJS0tLU2tiWWleX2pjcnJaX1lqb19lZVVrX2RbYWJRYG1oXGpcbmlpZFtvZWRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRklERURGQUBBRURDR0JISkxHRkRHS0xJRUZKT0xJT0pMW1FKRkhIS01JSEpKS0tJSEpHS0tLS0dIS0pMS0xKSUtMTlRbXVRQVU1RT05PT1VSUFBRT09RSkpOUFFkcWlUWVZbW1xVWVtdWF1cXGNmYWFmYmNmX15ma21obXR4cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzR0NFR0ZGQUVDP0NHREVHQ0lLTEhGREdLTEhER0lQS0xPS0xXTUlGRUhJSkhJS0hMSklGSEhKSEhIRUZMSEhKTktIT1xXXk9cXGBeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZFxhWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1BQ0RCRElFR0dGS0pLSEVFSkpKRkRHSFBKTE1KTVJJSEVBSEZKSUtLSUxKSUdFSkhFRkdFRUpHQklNSUpUX1lgWGBhW2BVWFlUXl5aX1JZXFBeXFlOX1xeU1teZF5aXWBjX1lfYltgXltVWVhaX15kY2JhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN1eXp6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklJREZLSkpFRUhJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRkNERUJGSkQ/SUtJTltjWV5eYV9SVFNXX2BcXVleUVlcTVZfV0tRWVtRW19iYV1eY2FgYmJiY2NlWlJZVlddW15kYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkRHRUJFR0hGR0hJRkdKR0hGSEtJS0RDS0pNTUxMSEpKSEpHP0dGTkpLS01LS0tJR0lFRUBEQUhJQT5ISUZPXWFaW2RdX1RRUlhdXFxcX1tLV1xMUlxZSU1eUVFdX2JjY2NjYlxkY2JkY2VYUlZVVF1ZW2FfXl9hYV9kbGttamtsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0ZLSUZHR0lHR0pGRkZJTEpORUNLSkxOSkxJS0pJSUdCSEhRTUtLT01LS0lISEZFP0VCSEhBQEZFQ1RdWV5YX1lfW11VWFhQXV1RS0pWXlheW11WWmFSUl9fYmJgYGJiX2NiYmRkYlhQUlJTXFRcXV1eXl9fYGRoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSERSS0ZISEhERktJTVBFR0lKS05MTElMS0pJR0RIS1FPTUxQTUxLS0lKREVBRUNIRkFBRkRBVlVFXFReU1ZfWE5UVU5aW01KS1RgYVtfWF9eYl1PWGJcYGBfYmNhXWJiV19fVFFQUVJZU15cW11eX2BhZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJU2NRRVdfSUdHSERGTUpQUEZJSUpLTkxMS01LSkpHRUlOUVFOT1BNTk1OSExCREFDQ0ZEQ0FDREBMSENMTFBPTkxGTUZGSElIR0xMTU9QSUxPUFBTUExRVFJVWlhXWVdXY1ZPU1RQUU9PUVVUXFlZW15eYWFlZmNoZGxtcXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtNXk1ISFlNR0hKSEdNTFFRSUtKS0tOTVVOT0tLTEdHS1BUU05QUE5PT09IS0ZgRUReTERmY0NMW0heXHNtT01WbVlMQ09fVGxXZ0pdV1VeRExRVUxNU1ZRUlRYVlRYVFRcVFBmWmhoZVpUa1RYV1VbXFxgYGFiYmJgZ2lnbmxocnp8fX6BhISEhIODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS09USktHYFRISk9KSU9NUlFLTUtMT1JVUk9QSkxOR0hNUVtZT1BQTk9QUEpLUX9RSXxZWXJzV1BtR3Fub2FWUHFxdE9CanNucXRwU29fW25YXVZcWFVraFVdVmNZYFlaXlVVV39pdHV1X2F2X1liXFxmW19hYWFiXmBjZ21vbGBwd3R4gYGCg4SCf31+gHZ4em12fnR4fYB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdKTEZSVkxLT0hMUlhXUU5PT01RVE5PUVBLTE9HTVBTW1pUUVJPUFBQS0laeF1UeGRoWFJTUHZmdGxwYm5ma1JyTkx3bWpycHNycXJwb3CAXWV6dXhxcXpxfnJ9a3V9YVJofGVzc29zc3x9cH54b39yYGBgYmJbYWFobG5rYmxmZ213foGAg357eHeAdHZ6aHJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpRT01OSk5WXllVTFFTTllZTFNSUk5MUElRUlRZV1dRVFBQUVJLSGd4bGN4cW1aSkxUeXB1bXVibnZQZGRIZXZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/cGhuWHV1anZ1cIBhc2h9aWx4fG9fX19jYlxfZGVnamplZ2JjZGxscHBzdHNzc3lxcnhibHRncnl7c3N1eX6Bc3Z6bnx9eXhybk1KUnROQ0JFUFFIS0xKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSlNUVVhXV1BVUE9OU0pLcm91dXF1cWNoYVZuTHFwXkdoeVd2VEtoeH13YHl7c25hXW1vZFNncnVubXlwd2x2c3RxbG1cc356a215fGx1bnxscXZ1eF5fX2JfXV9lZWlnaGZlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tS0taVkhHRUdSUUtNTkxMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5KVFRWV1lXT1NPT05RSVJtSGl3S2BkdnVVV2xObmx7cmFqZ391VEtXa2d8bG1seF9acHp7X2B6c2Nyb3hxaGR8aXJ7XVRLa192dWxqdnx7bX55a3xwXV5eYltfYmRlZ2ZmZWNbY2Npa2tyc3J3Z21paGRnYGFsYWdzcmxnbG1yfGttaGt7dG1ta21PR0pLSEpISFJRTU9QTUxTU1JPU1JYUldUUFdaVlZUVFRhYFFPTktUU1NRVlZPT01OT1FKSFFNT1VMS0tSU1JSUk9WVVFRT1JSWFhQTlBVVFdYWFtbVVFSV1tXWFdbT1JUV1dYUV1YVlxVVE9YUldXWFlaYFxncl9bW1pdXV9jWl9jY2VnZGRkY1pkYmdmZm1ubXVmZmdjYGZeXmdgZGxoZmdraHB6aGdna3VqaGdpbFBJS0tMTUtKVFJOUlFQTFZVVFBUVVhVWlZSW11WVVRXVVlYT09MTldUUE5VU05QTkxRUEtJUVFLUU1KSk9RVFJQUVNSSUlNT1BRUlBQUFRVUlhXXFdTUlBRVVVVU1pRTlJRV1VTWVZUWFRTUVRTVVVZWVheWl9hXVxaWlxcYGNcXmJiZGdlZWViWWBhY2FiaGhqbmNhZF5fY11aY1xibWFeZmZnbXNkaWhra2VkY2ZoUUpLS05PTE1UUU9UUVFNWFdVVFZYV1daVlNcYFZXVllVWFRRUEtPWFNQTlVQTlFOTFNQTU5VU05RTk1OUVNQVFBSVFROTE5PUlRUUVFRVVdVWVpbWlNVUlRYV1ZZXFNPU1RXVVRZVVZYVFJRV1VWWFxaXGBdV1lfXV5dXF1gYV5bYmNjaGdmZWJYYGBiXWBoZWdlYV5fXV1eWlpfWl9nYF5eXWNoa2FoZmhmZGBiZGJQS01MUFFMT1RQUFRRT1FaWVhXWVpaWFlWXWpkVlhZWldWU1RPS09WVFBPVFBQUU5NUlFPUVhUUVFPTU9SVE5XUVRUVU9OTlFUVVVSUlJUWFZaXVxaVlZRUldYVVtbVlBTVVVVVlhTV1dUUlFYVlZbX1tfYF9WX11eYFxcYGBfX1piY2VpaGVlYlliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVlxaWldbW1xZWltkcW1oZF9bWVZWWFJNTldTTU1ST1FST01QU1JVWlVUUFBMUFdVUVZSU1JYTU9QUlVYVVRUU1RZWFteXVxbVlJPVVZVW1tWUVNWVFZYVFNYWlNSUVlXV11fW2BfYFZiXGBhXWBiX1xgXWNhY2hpZWZgWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFpcW2BeYFteXmFgX2NcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWV5cX1dcXmpwd3mAY1xbVlZZUk5QV1NOUVFQUlRSTFFUU1lbV1VPUk5TWFZTUlRSUlpPUVNTVltWVlZTVlpYXV5cXF5WU05UVlZbW1VRVFRVV1hSU1lcVFJSXFhaXV5dYWFgV2JbY2JeYWNfXGJhYl9kZ2llZ11cZWBhYGFjZF9iX1laX1tcW1hYWVdXWlpaYVxdW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFtdXl1cYFxgVVxcaGpyfXNsaFxVWVdRT1JbU1JRVFJUVVRLUlZVWlpaU09TUVVVVVNOVVFSWlJUVVRYXVdYWFNYXFheXVlaXVVVTlZWV15aWFFUVFdYWFNWWVxUUlZdWV1dYV5jY19ZYFtlYl9kZF5eY2NhXmVmaWVmXl5kYWFhYmNkX2JeWFtfW1xbWFhYWFdbWltgXVtbXFtYWlteVl5ZXVBPT1JaUFpVVldWVFRUXl5gX15iXGBVXV5ia3l1bX1sWlVaVlFRVFxUVFRVVFZZV0xSWlZcWlxSUFVTV1VVU09XUVNYU1dVVlteWFtZVVpeWF9eWVxZUldSWVhZX1lZUlRVWVlZVVdZXFVUWl1dXmFiYGVkXV5dXWVhYmZkXl9kY2BcZ2VoZmRiYGVhX2FhYmJfYF5XWV5aXFxaWVlXVl1aXV5bWltcW1dZXF1WWFddU09QV1lQXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXaCe2hYWVpUVlRWXFhXV1ZWV11YT1VcWV5dXVRTWFNXVVRSU1dRU1ZUWFhYXl5YXVtVXV9YX19YXFZRWVRZWlphWFtUVldaWlpYWVlaV1ZdX2BfZGNiZWVeYlxgZmJkZmRfYGRiYVtmY2hmZGZhZl9fYWJhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlRcVVdXWVdWXGBhYWNhY19fVltgZGFfenVvaFpcWlZYVlhbWllbWVhZYFZPVF1bYGFcVVVZUFRWVVJWVVFTVVdbW1xfX1pfXFZfX1ldXlleVlNZV1lZXGFZXVVWWltaW1paWVpYWV9fYGBkY2RlZWNkWmJmY2dmZV5hYmBjXWJjaWVkaF9nXmJiY2FhYF5fWFRaWlpbW1hcWFhcW1pbV1daWFdcW1xgXVZdXVNPVlpWVlpWWVZYV1heYGJhZGFkYV5ZWWFkYmBrZmheXF1bV1dZWlxcXF9bWVtiVlNXXl1hY1xTVllQVlVVVVZVU1VUWF1dX2BgXWFdV2FeW15cW15YVlhXW1pfX1peV1hcXFxdXVtaXFdaX2FeYGRkZGZmZ2NZY2ZlaGdkXmNgX2VjXWZpZGVpX2deY2JjYWFgX19bWFlbWVpZWFpYV1tbWltXWFpUWl1cW2BcVV5iTVJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9dXV1YV1tbXV1fX1xaXWNYWVhdYGNkX1JYWVBXVVdYV1ZWV1ZdXV5hYmFfYl5ZYV1dXllcXllYVVZbW2BeXF9ZWV5dXl5gXFpaWVtfYl9iZWRlZmdoY1plZmdpZ2NfY15gZmVaaWljZmljZl9iYmNhYGBfXV1aWFtZWVhYWllXWltaWVdZVlVbXV1dYGBiYnhLV1dcWVddXFxdWldcXV9gYmRiY2FdYFhiY2JgY2FjXlxdXFhXW11fXWBfXVtgZFxcWFpiZWNhUlxZT1hWWVtZWVdaWmBeYWJjYGFjX1xiXV9dW15eWVlUWF1cX19eX1taXl5gYmJcXFdbXWBiYmNlZGdmZmdlXWVnaGlmY2FiXGNnYFxpaWNoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXV1hQWFpdYWNmZnJrf0pZV11bWl9dXF5cWV1bXl9iY2JhYV1iW2JkYmBjYmJdXFtaV1hpcWBcYF9dXGFjX15ZWWNlZGJUX1pRWVdcXVxbWVtbY2BjY2NgYmRhYGNeYFxeXl9aWFZbXlxcYWFfXVtgYWJmYl5cU1xfYGNkZGZlZ2dmZmZgZmdoaGdkZGBbZmdeYWhoY2loZmNgYmBjYl9fX11dW1pbWVhYWFZaV1xbWlZWVUxYWFxnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3x7e3t7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7fHt7e3t8e3x8e3t7e3t6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKh3NxcnJycnGDiomJiYmGs9bS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyJcm9vb29vboWNjIyMjIi/6eXl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eHh4eHh3d3d3d3d3eHl5eXp5eXdvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx6enp6enl6e318fHx8e4GEhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ1dXV4dnZ2ent4e3h3dnZ4eXl6en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t7enp6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3d3x8fXp5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d5fnx9fXl7enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3t+fHx8enx5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHt8fH16fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl3eHp6e3l5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh4eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGBgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qKi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHg4WCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uHjYmIiYWEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioaGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoWDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLioqLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCgoGCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODgYGChISCg4KHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYKDgYCCg4GChYWFhYaGh4aFhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEhIOCg4WDgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJKPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4ODgYOEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCgoKBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+fn+AgYGBgoGAgoKBgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYGBgoKEgoKDhIKDhIWGhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgoKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GBg4KDhYWDg4OEg4SDg4SEhYSEhIKBgIGCg4KDhIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOTko+MjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgICCgYF/gYGAgIKBgoKCgYGCgoGAgoKCgoKCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSTkpSSj42Lh4SEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH5+f3+AgH+Af4CBgIB/gYGBgYOBgIGBgoSDgYGBgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGAgIOCgoOCgYKCg4ODhIKDg4OCgICAgoKCgoKCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhIODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhYWCgYKDgoKEgoGChoWDhYODhISEhoWEhIWCf319fX6ChIODg4ODg4ODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhIWFhYWEhoaFhoaFhYWFhIWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMi4iFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIOEg4ODhIWDgoOEhYWGhYaGhYaHh4aDgX5/fn5+fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoKCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4OFhYWFh4eFhYeFgX9/f39/f39+gICEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoeGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4OEhISFhIOCgoODhIODgoOFhIWHh4WEgoB/f39/f4B/f3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiIiGh4aHh4aGhYSDhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eHhYODhYSDg4OChISEhIWEgYCBgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYqLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEhIWFhIWFhoSEhIWFhYaFhoWDiZSTkI6RjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeHhISFhIODhYOFg4ODgoGCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWEg4aFg4KCgoKCg4F+fX5+fn5+fn19fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeHiYiEg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaDgoKDhIKDhISCgYGBgYGDg4SDhJGSkY6PjYuHhIaGg4KBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoKChISDgoWGiIuKhoSGhIKGhoKAhYSDg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GDg4SFhYWDg4WEhISEhISFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjZCNiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFg4GAgIF/fn2Cg4ODg4KCgH19f4CAgX99fn59fH19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYODgH+AgIGDgoCAgICBgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhoyTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5/fnx8f4ODgoOCg4F9fX5/gICBgH59fX19fn18enp6f4KCgH9/f39+f3+Afn2Af3+AgIF/gICBf39/gYF+fX1/gIF/f35/gIB/gICAgX+AgoCAgoKBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDg4OEhYCBf3x9fX59fX6AgH59fn17fX6Cg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enl6gIB/fn9+fn59fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f35+gH+Af36AfX1/gYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7f39+f39/fn1+f3+AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZOSjYyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoKBg4SEg4SAgYCAgYCBgIGCgoOBgIF/gIKDg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gH+AgYGBf3+BgH+Bf4CAgIGBgoKAfoB+f35+f36BgIKBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEg4GDg4OCgoKBgoF+fn19fX5+gH19fX19fX19fHt6enl5eXmAgoKChIOAgYOBgIKAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoWEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoaFhYaBgIODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iHiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eHh4aHh399gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WFhIWDgoODgoODgoKCgoODgoKSkIuIiIeIh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWGhoeHhoeHiIaHh4eGh4eHf3x9fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomXhIODhISUk4CBgX9/f35+hIuAf4CAhIaQiYWEgoKBhYWLg4GDhYWGhoSDhYWDhISDg4SDhISEiJKOi4mIiImHh4eFhoWEhYSCgoKCg4ODg4ODgoGBgYCAgICBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSEhoV/fHx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3x/goOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+LioqMiYmJh4WGhYODgoGCgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoOEg4KDgoKFhoSEhYWEhoSDhIOCgYGDgX99fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWChJGRjYuMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIKCg4WDg4WFhYWDg4OEgoGDg4KDgoKBgICAf4F+f35+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn9+gIJ8fH9/gYCCgH59e4qCfYB/foGAgIGCgYKAgICBgH+Lk4+Li42OjYiHh4WFhISDgoKBgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICBgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX18fXt9fX19fXx8fYB/gIB+gH5+gZSRi4yNjY+KhYaGhYSEhYODgoKDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKCg4aHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fHx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4Z/fn1+gICBgH9/fn19fX1+e3t9f39/gH1/foCMkY2LjI2NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn9+f4CAf4CAf399fXx8fX59fH19fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19fn9/fX6Afn5+hJKMi4uOjYuKhoSFhISDg4ODgoOCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gISDgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaEgoSDgn+Afn+CgYJ/f4KCf4CKj4yKioyLioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gICBgYB/fYB/f35/fn5/f398gn5+fX19e3t9fXx6fHx+gIKBgICAfHx9fHx8fHx9fH17f357e3t8fHx9fHt7e3t8fHp6fXp+gn+Bg4SCgYKBhYaFhYaGh4WChJGOjIqJioeIhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f35+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn5+fn58fHx8fHx8fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3t9e31+fn+AgIOHiYmJiomKiYWIkY2LiIiGhYWDgoKDhISDg4KCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foF/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn19fX19fH18fX19fnx9fH18fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+goWIh4iKi4uKiYyQjYyJiIaFhIOCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjY+MioiIhYSEg4GCgoKCgoKBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58fn+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX19fn1+f319fXt8fX58fHt8fXp6eXl6eXt7fn6AgYOHhIiNjImJhoWEhIOCgoKDgoKBgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX59fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiYyJioeFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGEgX5+gIB9foB+fX5+gIB/gX5/gH9/f4B/fX5/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCBfXx8fX18fHt8fHt7e3x7fHx8fXyJiYeHhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fomFhoSFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp9fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX1+gH+BgH+AgIB/fn19fX59fn59fYGEf4B/fn+BgX99gH99fX99fn59fnx7fHp8e3qAhYKDhIWEhISFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl0dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIOBf3+AfoCBfoCBgIB/fn5+fn5+f35+hYWAgYB/gIOBf36BgH9+gH+Af359e3p7enx7eoKDf4KCgoKDgoOCgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXZ0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX5/f3+AfX19foB9fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+BhIF/gIOBf3+Af4F/gH98e3t6fHt8gYB/gX9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOCgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICBgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fH1/fX+AfH9/fn2BgIB+fX2Af36BgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgoOCgYF/f4OAfoKChICAgoGCgoSBfnt7fHx8fX19fn16fn1+eX5/f3x8fH59foGAgYGBgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXx5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4SDf39+fX5+fn+Af4CAf4GCgYB/fn+Bfn+AgoKAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhIWFg4ODg4ODgoGCg4KBg4J/gYB/f35/gH19fX1/gICAf3+Af3yAf3+BgIGAgH98gH9+fn5/f31+foCBgoJ+f359fn5+fn9/gH99gIGAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3Zxd3lyeIWFhYWDhISCgoOCgYGCgYCDgYCAf35+fn6Afn1+fH6AgIB/gIF/e4B+gIB/gYGAf32Af35+f399fX1+gIGBgX5/fn5+fX19f35/fnx+gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fX17fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH9/goB8gH+Afn+BgH9/fYB/fn9/fn19fICAgICAfn9+fn59fH5/fn9+fH2Af359foCCf36AgH9+gYOCgoOFhYKCfn58e3t8fHl3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzcHh3cXuFhoWFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgH+BgX1+gH9+f4F/gH9/gYB/gH9+fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WHhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGBf4KBfX6Bfn5/gX+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2EfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf4CAgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZKMenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e41+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICBgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX+Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgIKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOBhISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+BgIB/gIB/gIGBf4CAgICBgIGBgYKBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGDg4B/goGFg4OEgYGDgIKDgYGAgIGCg4KAgoKFg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgYB/foCAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKCgoKAgoGBgoGAf3+Af4CHfn58en18e31+eHd2eXl5fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICCgYaDg4OBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgICBgYGBgIOBfoCDgn99f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fYB6eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYOBgoKBgoF+gYCAgoGCgYGDgYCAgIGAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIODhISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn5/gYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoSGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKChYSEg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnR9h4eDgoSFg4OEhYSAgoSFhISDgoOEhICEhYOCgoKDg4KDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9f31/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn91dn+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoGCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoOEhISEhISFhIODhIWEhYSDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx8gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+ChIODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4SEhIWEhISFhYWFhIODg399gYR/fX18fHx8f4F+fX5/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WFhIWEgX+Bg39+fnx+fX1/gYB/fnx8fn9+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhYSChIOGgIKFhYuJhISDhIWFg4eGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIF9gXWBeYN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgISDgH9+fn59fYGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISGhIGDhIWDhIWDioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfH9zgoN/g4N9gX1+fn1+goOBfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugIh5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9gH99gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYF/f3x/fXyBfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeHiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYWFhoaFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhIWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYqIhYSGhoWFg4WFhIWGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJiYeGhIaFhoaFhoaEhoaHhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgoF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoWGhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFhIaHhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH17fHx9f358fH59f399foB+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYSIhYaHhoeGiIaHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoaEhoaFhoWEhoaFhIOFhYKFh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fnx/fn19fn59fXx/fH5+fH2BgH18fH18fHx+ent7fX6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoSGhYaHhYWGhoWEg4SDgoSHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fHx8fX18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYWEg4SEhYaGhoaGhoeFhYeFhoaGhYSDhIODg4eBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19f318enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aHhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODgoKDhoGDfoKCg4CDg39/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhYOFhYaGhoaHhYeGh4aHh4WEhoWDgYOCgIOFgoN+gYGBf4OBf35+f35/fHx9f317fX18fXp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFh4eIhoWHhIaHiYaGiIeHh4aHiIaEhoaGh4aFh4OEhYSGhoaHhYWEg4WFh4WHhoeFhoaGhYaGhIOFhYKBgoGAg4ODgn2BgYB+g4F+f3+BfH98fX1+fXt+fXx9eXp6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaFhYWFhYWDg4GDgYCCgYWCgIB/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWGhYSHg4SFhIiGhoeFhYSChoWGhYeGh4SGhoaGhYaDg4OFgICBgICEgIOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH5+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhIeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIOGhYaGhoaGhIWGhoWFhoKCg4R/foCAgIF/g4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18f359fHx9f358e4iFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WDhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhYSFg4WFgYGDg39+f4B/f3+Df3yAfX1/gn2AgX5+gX59fX19f3t/fHt6eXp6eXp6fHl6ent7e316e3t7e31+fX2AfX18fH2Af318hoOGhoaGhoOEgoWChYGBgH9/gIB+f4CCfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWGiIaGhYWHhYeFhYKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SEg4SDhYSAgIKCf319f35+gIN+e398fICBfYGAfX2DfH5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5+gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaEhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDgoSDg4B/gIF+fXx+fnx/g318fnx8gYB+gn99f4J8f359fX18fHt7enp6enl7enp6enp6ent8eXt9e3x/f3+BgH1+fX19f4CAgIaEhIWEhYKDgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIaEgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhIWFgoKCg4WEgoGBgYKAhYOBf36Af358fH59fH6DfXt+fH2Bf4CDfX2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZMPTg3NjU5OTk8Pjk/PEQ6Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo7ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dXU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXU1dXV1dXV1dXV1NTU1NTU09LT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2trY1tfX19fX19fY19fX19jc3d3d3d3d3d3d3d3d3tvX2NfY19fX2NfW19fX1tPS09PT09PU1NTU1NTW1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzYRtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqHprq4uLi4uLi4uLi4uLmzeHNzc3Nzc3Nzc3Nzc3CSu7i4uLi4uLi4uLi4t73S0tLS0tLS09PT0tPT09zi4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTT4Ono6Ojo6Ojo6Ojo6OlmTIpKysrKysrKysrKyolYamkpKOjo6Ojo6Ojo6Gr0tLS0tLS0tLS0tLS0tHf6urr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7QEM+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX183OUisxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1OFqKSkpKSkpKSkpKSkpps4LzAwMDAwMDAwMDAwK2WqpaWlpKSkpKSkpKSjrNLS0tLS0tLS0tLS0tLR3urq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87PkBAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNz1w5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJejKypqampqampqampqaugRT0+Pj4+Pj4+Pj4+Pjlur6mpqampqampqampqLDS0tLT0tLS0tLS0tLS0d7p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPzs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3FwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Ozs7Pzs/PzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy8/R0dLS0tLS0tLS0tLS0crKysrKysrKycnJycnJzNLR0dLS0tLS0tLS0tLS1NTU1dXV1dXV1tXW1tbY2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7Ozs7P0c7P09PPztDU0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tbW1tbW1tbW1tbW1tbY19fX19fX2NfW19fX19bW1tbW1tbW1tbW1tfX1tXW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7Ozs7RwafSz6GWy9HGk6vSzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Ozs/P0Z2Pxaqgq5/Oma2Zs9LOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q+QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz8/P07qvq7GflY+htJWHnZ3Oz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Pz9OfsZ6nnZ+nmbS/yZaZxtDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/Pz9HAnImbtaSgi5/D0pGYoM7Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PEJAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz8/Uo6KBm8WZxcmU2Kyjv53V0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw7Ojk/QD08PT1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDRxJ+Be5efopWVobvNiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ozs4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q1auvvMDTeZuws52l0NuimbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzs7OT0+PT07Oz08QENCPz4+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXJh3+FooKjm6KdnJGomJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NDc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HG09PVnJqyoKmgop6poqmc0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFDQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg0tHS16iIz7CNkaXUmpGOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw5PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR0dLPxdTVwL3W1NO4yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojw9Pzo7OTo8PUJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dLS09TS0tTV09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Ojw+Ozo4Ojs/Pz9CQkE+QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njs9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk6PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87Ojg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pj9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD9CPzo4Nzc2PT8/QD1AQD8/PT07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT0tLS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+PTw/QD88NTY3Njw+Pz48QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFBPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VGQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBDQENDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojs8Pjs9PTs+PDo7ODk6ODlBQUJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I7OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTs/PTo5OTo8OTtFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY7REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8PEREREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc2ODU4QD5AOzw5PDs8Pjo6Ozk6OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODo4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg3NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc3NjY2ODc4NDs/Oz49OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Nzc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2loeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODY3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCDdnR8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY3NTU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzY2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NjM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3ODYzNzY3OjY2NjU5Pj86PD87Pzk7Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09PD86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc4Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzg5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTY2Njc4ODo8Oz0+Ojs6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFREtQTjw5ODg2NTUzOTU2Njc2ODc5Pjo9Pjo8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk1NDc3NTY3OT06PT47PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNDY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDQ3Mzc4NTc2Njo9Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q6ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE4PDs2OjU2NTM0NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqZG1nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU1ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp14cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW1tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NjQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp6goKCgoJ+goaCgn56bmpmampubm5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5aWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJycnJydnp6dnZ2dn56cmpqbnJ2cnJucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWl5eXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeSlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJqbm5ubm5mYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vri2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyampubm5qbmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+s6+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMj4+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouHiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVGJRRFRNOz86PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFNfTUhRSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg6OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipamnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxkY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSloqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGdiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaatpqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6qsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paGJeUFFAPzs6ODo4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpamnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaChqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYWxodWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2s7qxqq60sbCxtLS2vLy+vLy9xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyak5aUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3NpdGRpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsPDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbGnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87MzMfBw8fHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb2xocXhveWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMvQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtoZ3VaZnJ3c3hmZl1kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLFyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/JxsPDxMLEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpoXWpvbXh3YmJgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIx8nHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraapu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lodG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBxsHLy8fGzMnNxcbGw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZHRuc2JcYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBw8S/v77Ey8jKy8i8u8jHyc3Iw8jJycbFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7u721s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JvZmVnY2pkYWptbm5eWFxWVU5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbBubvDuri5vL7BxsHGurnJycPFxMDEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFlYmFiY2NqYmZjWllZXFlRTkU9Ozg6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7q9v7m9urq0v7i1t7Ovu7y3wLe9wr/Bu7/BvLvFvrvBxMC+vri8wcHLvr3JxMDByr+xwr+7uLu+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYd9cWNgYmJnamZmaWVpXVZVU1lPU0tFOD82Ojo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1usG4vri/vL23tbewrri2ub+7wL+3wbu7w7a6yLi2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2dYWE5LS0tSSUxIQzk+OD07Njo7OjY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8tru8wMS5t7e3tbq5urvAvcPAusTCvse4ubitt7W4urS3s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg9PDc7Ozo3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9v7vEt7a4tre/v8S8wsXFx8fKycbPwsG4rrW1vL64u7K+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG53Y2dhXGNRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD89Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuqo7C5vb6zvL68xbiyuLm9x8nKw8fIxsbJyMzO0czKxLW6wMPIv7+1v8C/xsa/y8bDv8G8wMPMysfFxsG5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmBhTkhNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0vMO8urq+vMS/t72/vcfMxsfJxsa/xMTKyMzMzcvGwsPLzsK8ub66ucDDv8jGxMHBv8XAysnDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPj5BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW7trnEuLS8trq9wby7vra/wb+8v7rAy8LHyMC/vLzAxcLHy8jBw8DAycvCwLu7sLS8vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnptc3hzZ3BdWl5cWVFFRENNSUFEPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7u9usO7t723ucC7uri4tcXBw8O7ubO0usG9v8fAucC8vsXEvb65srCuuLe/w8fDxL29v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypqKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG5pW19fWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7K0tLS2uLnBwLe9ubi5trW/s7SyuLG7wcDDt7etsLW4uLjCurS7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d25xYF9lXVtUSjw+P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+3ure2trK0wLaytLizusDBw7m3srKytLK3vrqztbK8ury2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZybF5iYFtdTkhBPz1IQ0ZNRD83NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u7y4trq2scC6t7m4ubvBwcTDu7u2tLSwtrq2tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsaawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqqvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybmNcZlhcXVJOTUE+SkJASklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOxrba6rqy8sri5t7u/vbm+wLS/u7y6uL7CvMLKx77AuLm2srS2s7SvrLu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdW2pUXVxPTUhERkxBRk1GODY2NTo1Oj04Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5urW5u7W1s7W7vMC7vsC0v7m5urG6w7zCysW+u7+/ubS0s7GxrrC5uba8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jo6OhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmJ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIP0hRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmura+ysrq6t7e1tby0r7Srtrq4wMTBu7a8vbiyrbOwr6yut7aytLSvqqSenJycnqion6CoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJuqqKqrnqWjm6OclZCMj4+Qk5CWlZaYn56empmml5OPkpadoqClo6akp6CipKOhoayrpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFFoVFBOR09NTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6Wsqqi1srGwrq+yp6avo6+utcG6tbeyt7aytKuytK6qq6+wsrOtpZ6SmJSPmaCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6apsKOlp56gnJWTkI+RkZiQlpWYlp+Ym5mbo5mXlJWanaCdp6iloKOjoaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01JSEdOUk5KTkc7REA9Mj83NDk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiYl5ahqKyutre6ubq3t7uuqKChqaGgrauqpqmkqaOkrqWsrLS8t6yysa+xrbWvr7O1qqetrKOcmZSOkZaXmZmcoKOim52lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6ieo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmZaal5eYoJ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHh6YGJSVV9ISUlLU1RJUlBMOD5CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OTnJ6jqK6trKurr6qvqZ+XnqWenqWmpKCin6agoq6rrK21sramr7Srqaq0sbCwuK2noZydmpSYm5qRjpGVkYyPjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrbGxtKmxr6KZnJ2eoZibm5qYmZuUlZqWmJyloaCao6GanZmfpKKeoJ+ipp2bpaalpKSoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHV2c2iCbGVcU1pZTVFKTk5VTFJMQTc+Qjc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0/NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkpyYoZ2qoqegnqehpZ+ckpyim5+ho56doJ+joKKvrqyvsay2p62xraamsK6trLCnoJ+ioJeRlJyhnJmYkpOfnaKkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwqKuosrW3s7essbSjoJ2loKyhoaKgoJqYlpWfm5uYpKGgnqShoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1tWlJgSFFVSEZVVkpCTUc9Skg4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjpOemaidrp6nnpyhnZ6amZKZnpyioqCgnaKfn56fqaunrKmqtKurraulpauoqqyqpZ+emZKSlJiZlpaWjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oauiqaiyqauop6iamZ2aqqafmaegn5+nqKWknp2qoqKem5+ooKWnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imJybpJ+gm6Cco4mFhH52cW1pd21obVxYW0JWTUpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQURBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiaqqCxorejsKagnp2dl5iWmZ6bnKSfn52knZqdnKSipKOiqq+sp6mjoKGsrq6qq6agnp6ho56enpudnJSTlZSenpiUhp2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK+nsa2xwra4wsbAyMrAyr+wubm9ucK+uLS7xcO8wru3s6myraqzta+zrqquo52rp7axrKKvpaCjr7GtsKSkr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOioaSeppmboqSen5ubm5yHhYF7dHFra3VycGhXXFFFVEhESU9IPkVBM0VIOTU7PTY7PD88PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Qz9BQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goZ2cmJufoJugn5+XpZ2Vm5ufmp6cn6Wmp52goKuxrqekpKOgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMHAxcjN0MjLw7K3tb6yvsW7vszNxczMzNLHvr/Awr3HxsK3w8nIwsDFvrm0ubq1urewtbKqurGuu7a+u7qqt62rqri6tLyurbiipaKep6Wio6mmmpufmJqdp6qnoKGhpJiUo5aUmZGcnZ+knqifnp+inZiZlJiUiIR9enJrZGlveGplWltGSkxERFNMREJENzo/OzU0OTk3OT0+PDw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PUE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlZqWlJukpp2hqqeiq6y8vL/DwbOyuKehoauqop2eoaKenJugkp+fkJafmZKalp2bmaOhr7OpoZqdnZ+fmpeYl5KMj5aXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3MyMnRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXS08zT0NPTzMrCxcbGysfOv8nQy8bExsTBu8PAvr6+tb2zrb6/wsPGxMfErr64sri8xMHBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURCQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5ibo6yen66mpbGqxcbMzs2/sMKppaitraqhnaOfnJ2aqZOZoZCOoJONlJKXmaSxsaukoJ2gm5mXlJOUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fR19LU1dPTyMzHzc3J0szO083Ex8nKwcXLxsjIxb7Cs7PHxMvKys7Fyr++v7zBx8TMzMjJv8O/rbCzqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYt/enJ1dWdiZ3ZpZFZXUURNRkBJUUI9Qjw6MjNAPEQ8Nzk8Qj08PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK20uKyuo5+ko5+gpKyblqmWjZeNjI2XprCupZ2enaGloZ6blZSWlIp8d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dHX1tbS1s3U1tfU09HT1NTSz9HD0NPW19XW0svJztHLxs3SytLV1tnV19PW2M7Syc7RzM/QzNLPv8fGysPMzMvOz8XGx7a/yb/SzMvPxcnIv8PCyM7Mz9DPzMrHzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHdzdm9jYGVyYl1SXElKRkFFSEk+O0A4PTQ1ODU6NzY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopuppqKmq5qjsLGpqLXQ1Nfa0sfGy7S2wsaytqmipaahoqu1p5qxoZaVjJCmrauclZihnZuhop+cnZuVindpY2FfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTPz9XU1NHRzNHO09fW09XQz9LT0cnT0cjQ2NfY0dfS19nV1szOz8nN0cvOz7/FwsfFzs3Q0NHIy8zAysvF087LzsjEycbGyMzK09PR1c/SzNLBucWxpai1rqeaqKylnbKosLOsrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMe3pxc3RtYWNpbV9WUF9KSkJGQ1FNPzw+NDQ6PTUyNzU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr66qqqyepq64qKu32NTV2dnRztDAvMzJt8Cvp6upo6SxtrOktqqfnaGqqaGYlpiam52hnpqdnpR+cmVjYl9fYV9fYWBfYGBfYGZtcHBua29yd3ebzMDS1dPY2NbZ0dLS18/TzsvTzdXU0crPzNPW0tHWzdDV1dHG0dTK0dTV1s7S0NjY2NfLyM3DyM7Mycu/yL/Iyc3Nz8rQzc7Lzs7Hys/Qys7KwsnGyczKzNHSzNPR0M/Pyr3IubCtu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHl2b3Bua2JlbnBhV1xaSUZGRExXRTtAPDM0PD04Njg1NTs+QDw5PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PT9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snnri2tbWtpa2uvrSxwNnS19rc1s/Ny8PT0MLCsqutrqyms7G4q7G2qaOfnJaUl5uen5+dlJaXlYlsXl5eYWRiYGBhYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztTLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHTy8zQ0dPKztHV0tXVysDJwcXMwsjJwszCxcjJys7KzMzPzdPLxcfPzMfHysTGwMXJy83Q0cbPzs3NzM/Fx8C3ub3Dw73DubKzvrG8xMS1qpiloZmWkZWVkouUjZqRlJSPj5SCiYV4cHFrbmhgYHFoWFhoVk1HTElQUEI7RD47Njc6ODk6NTc9PUA7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc2Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXFw8G/u7WyscfDucvV1tna29jNzM/J1tbFxLiytqqkrq24u8HFyaGXjo2YlpCTkpGWlpaQjHxlYmJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycXJycbGv8PGz87HxcfNytHIy87NxtHSz87M1MrHy87Px8fP0svQz8W6xL7GybzCxsjOxMLHwMbNx8PLycvPx8PDz8jGwcbHw77Ax8vLy87CysvIx8vPxMXHu8fDyMjCz8C9vL+wwcrHur2qsbKnpZ2inJiQm5CkmZeZkZWYiY+Cd250ZGxgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJuls7Gsyc3KyMS+vbrNzcbQ1dXZ2tvY0MrQ0NLUysW6vr6wqLeqxd3Wx7GRjo6WkIaDhISCfoWFf3RgW15eXmBeYGNkY19dXV5fYGBfW1pcYGtycm9va2xvb3240cjJys/LzcS6wMO7u7q6vsjGwsPAw8fKycjKx8HFzMbIy83JxMLLycLCy9DEy8i/ucG6xce9v8bPysO/w7rJx8i6x8bEysC9wcvGxcO9xby8v8PEy8TEvL/JwsXH0cXAyL/KysbIxtDDw8bDr8TLx8TKt7+8urSprKWlmJ+YrKOhpZqjoJuUe3ZzdGZqW2FubVpbWFFETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPHzc/OzdXQ1tnY2dDN1M7P0MvEuMbBtrW8r9jDdX2SjJOXh3uAhYaAdnh1cnBfWltdYGFiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbCsba6srKzsrHCvLy7ubjAwcHFvr25vb+5xMrFxsK9xsC4u8TJv8LJu7e6usXCvrzBzcLGvr21wL3DurzGu8K5s7zFw8LCtr+1tb6/usvDvLW6yLq/vcvDwcXCxsjGyMbQxsLMyLLHysPOzcHFwr+9srews6eoqLmxpa2wq62slHl2d2plaGBob2NWXllKRUpGSEtBRkJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfGwsTIztLLysrHzc7P0snRxtbV1tjOzNDIzcjKxb7KwbK1urrTcFaOjoqLhXmAhoaAfoR8dHVkXFxdXmBgYmNiYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rBuK6wsKeqraynuLS3tLOys7q1vbG3sLWvsrvCvMHEvL+7tbK6vsC4x7i0u7XAwry3vcbAw7u0rrK2ur6zxLe7tau4vL3AvbC6ta+2urLFvLauu7+0trTFvL7DxcDDxcbIy8bAxsa7yMu/z8rHw8bBw7fDvr22ub7Gv6y1urW3to54dHhnZ2Via25eVl5gRktISEpGQkNBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy87IxsnOzNDNzsnLyczKy8bRz9PRz8jLxsrGxMC9z72zub29uVh/koaJiXt5foaGd3iCfXRoXl1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBtaGZqbW5yfKTHv7m4tbCsrKeeoqqnnquss62pq6mzrbawsqmupqyyvLq2w7m6urGqtbm7tMK6sL+wvby7tbvHucK2raqosLHAtbi8r7CnsbO0u7yrrbWlrrauurGwqrmvrbuuu7i7v7+9ucK/x8PFwbzGwcjLuMXHxb/Hw8O6xMbCu8XJzMuzucK8urKIcnZ2a2lhYmxoWVhXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/PD46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxs/SzMTGwcXQyM/CxMfBxsbFxczEy8zCxMHIwbq8u8q3tLy9t613k4mPkHx5foqFenuEgXduXl1dXV1fYF9fZGNiY2NiYF9eW1taWl1aWlpaXWRub2hmZ2lrbnKBrbmwta6mpaenmqCkoJqcpauuo6eiq6msqrCjpp+qrbW2sb25r7ivqK64tLS8uLO8rre5tLG7wbHBrqWpoqyxsrOnvKqrqKusrbS0pqiuoaSuqbKlp6iupai3rLCyt7m6u7G8vb6+xL+1wcHHyLe/wMW3xMK/u7/Ew77EyMzKv77DwMCphnJ0cmppXWFvZFdWWFBIWlJTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7rEsLawm5mVnJiqqbCxs7W9r8bR0M3EyLu7zMPMwLzKucDGwLzMusPHxbq9xL66t73Guba5u6+ykoSJjYF7foB+eHR/fHN3Zl9dXFxeX2BeX2NjYWJgYF9eXVxaWFlbW1lYWlxfZmtmZWdlaGtvcoWqpaymoJyhpZSepJuXkaGjqqOin6Wlp6Ssn52bpKassq+2t6ewrKeqtKu0ubC2tKy2uLGvurmxt6Sfo5+nsaerqLmqpKanqKeyraCnpp6bpKasnp+npJ+gsa2trLK0srSwtby2u8HBsrq+w8GyubrCs8C9v7W4u72+vMLHxMLDvr/DoIN3cGthZV9rb2BVWV9ITmhPVEhFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzc4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbu+taCelZ6hprq2q7Ozu7PF0MnMw8e5uMnCzsG6y7m9yLu3yLu3xMazvsW8t7C5wLuxs7ewo4WHh4J9eXZ0b21rampxaV9gXVxcXV9gX2FjYmBgYGBdXFtcXFhZWFhYVlhbXV5kY2JlZ2dnam1viJ2poJeVmqGWm6KYlY2eoaKmm5+fo6Whp56aopufqrCtsbWiqaqpq6yktbitt6+ssrSusrSusKqfnZ6jorKkpam4raGmpp+orKuZn6CemZ2fpZqZo5ybna+pq6eqq6ytsLK4r7i5u7C2u7u6q7KyubK9tLaxsbW0v7W9wL3Dwbq6vZeDenJrX2VeZGRYVFheSVddS1BHSUpGQTw/P0A7PzwwNDUzNjo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmbpKbAsq+2rLS3xtDJycHHvLzFxdDAvMq7u8G7tsW4tcHBs8LEvK2qtbq3qLGzqYuGiIB5c25wbmtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWltZWFdXV1dYWFhbXmJkZGVmZmhpa3KNqJ2UlJSbmJuhlpaQnKGhqJ2bnKWmoaSbn6CamK2ura6yoKWiraunobWwsbGsp66yp7mzprWhop6ao6KtoqGptaqio6adpaajlpiel5ianZ+Zl52cnJusoaumo6Smrauzs6q0sLKqsrm0r6mvsrKyt7Otqayusbewura5vb+2srGUhXl1ZV5lXltZVlNaVUtbUUxJRUhLSUI9P0FBQEA6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vb+znaWjmKWxwrW2va20uMPNycjBxrjCwcjQusPGwLa8vbbDura/wbW7v7uqprG7saiyr5t9hYWAeXBxdHFoZmRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hYVldhZGVjZGVkZGhqdqKclJSPlJaXn5eZlJifnqGclqGhqKOfnaicmpqqpq+wq5ujo7eqoJ+uqLappqassKO3sKO2oKKbmJiqpqGbrLivoqGknKGfoJOVoZSWlpuYl5aXnJSfqZ2po6Gdo6qqsK6otKuqpq2ysKWqrrKxr7Curqenp7KusbSvvLS5tq6jlIF5dWReYVZZV1NSVEtNXkxQS0dHTEtFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp6np6Oqu8C9wLmutLjCzcjHxMW+x7rKzbXExcWxv8C5wMG6wMC5ur23qKixu6apoqWJgX54cmpscnRwaWhlZGdiXFxaWVpcXFxdXl1cW1xeXFtcWVtcWlhWV1dWV1hXV1dVW2NjYmJjYmNkZmqBlpOVi5GUk5uZnJaWm6Ccn5Wgn6alpKWmnpyfpJ+qr6afoqO2qKChoqizoaWnpK+lsKyrtJ6gnZWUqaGhlKyxsJ6iop2emJuTi6GUkZOXmJKXl5iWnaabpqGimaOlpaukpbCnpaOrq62lqK6vrquoqqqzpaarr7Sxrry1sa+voJJ6dnJkYVxaXVhOTFFHUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuyt6yepKett7u8wcW6sbm1xcrLwcTHx8m4yMa1xcLJr7q8wrzDwMG9vLe6tqansraeooqZh4B3b2RiZ2loZmhqZ2ptYF1cW1paWVpcXVxbXF5fXFpZW1lZWltXVVhXVFRXVVNUUlVgYF9gYV9gYWNkaYGUk4mRjpSSk5yUlZajmaCWnKCloa2lo6Oio6GbqqqlmZ6lsamgoJ2kqp2noZ6srKmorayioaGUl6ObnJCrqbCbn6KenpeYk4qeko2Sk5WPmJiSm6GinKSgoZWgoaSmm6OrpaKkqqOrrqSusammpaamtKapqK2ztbS5uq+qrJ6LcnBvYFtXVlVRRlFPSFpcT1JJVEtTTEVHSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Nzs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njo4NTk4OTg6OzlAOXu1tK20u7KwrLKtnaenr7m5s8DIurXAr8bJzrvCy83Jt8u/tMDHzLC2vci7wsfEvb+3urWlq7CunZqHjoN8dWlqam1oamxua2ttZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV5eX19fYmRtjo+EkYaPkY+Zk5SSnJqinJugp6iqp6qlqKSjmKSupJSZpa+pn5uYmqCerpmbqrOfpaaeoqOglJOblpWSqKmtmpygoaCalJCMmY6LkIySjJaUkJ2hoKOcm6KVm6CioJeiqKOiqKugq6+krbelo6OirK2pqKuvs7iyvbWzq6+Yg3JyaFtYWVNVUkVZTFBcWU1UT1BMUFJJTklCPD8/QT89NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s66os7auqaivrZupqKy3tqy8yru2v6zMx8a5ws/QybXGvrq+xsu1sb3FvcPGxL3Bs7mvpquvq56XhoF3eG9uaW5ubnFnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVVFNOUFFZWlpaXVxcXl9gZH6NgYt/i5CKko2XkZeZoqCbn6qppq2qpq+ip5mfrKCVlqSop52Xj46Zna6Wl6eqmZ+dk6WgnZGQkpKSlaeqpJmZmp2dlo2Mi5SGiI2DkIuSlJCgnqCjl5WflZqgop2Tm6Wlp6iooLGwprC8p6CjrLSrraewtLC5tcCxrbGrkH1wcmJWVFVOUklHVlFTUkxMWE1KTE5SR01LQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OtprG3qqaisKudqqepsrGktsa0ubqzy8a6vMPL0cyzubq+wMTHtrS3vbO7vMS+wrG0rrGusaycoohraG5vcm9xa3BrZGZnZV5aWVpZWlpaW1paWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/dYmOh5CJmImUlJebmZ2om5+qpKSqnKeYoKWbko+eopqXloSDkZqjj5OinJWVloehmpqTi46Kj5mjp5yVlZebkJKHlI6MgYuNgJCKkpKRoZqfoZWTmJiVoqWYjJmkpqimoaC0sqeyt6Gdoresqq2ksrKmtby1rKuxo4h4cm1dTlBRTE9DTk5OUEtGTk5LSk5NUUlNSkFHS0hIQz44NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjc3Njo5OTk5ODQ5ODhBN3e2p6S2sKSnpKmloKmlpLOqorLDtbWys8fHuLvEys3Hta+8v7i8xLOzrrairbXEuruvqqy0r6+gl6h9XmBnc3F2cWpuaWZoaGpfWFlYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU5NS0xTV1dWWFhZWFtdYW9zdnGFiIKHgJGDjoqUkZOdoI6am6Kgo5iklqGblY2HmJqMc42CfY2WloWQmZCTjY56mI6cjIKKf4mYn6KekJOYloSOgpN+fnSJjnqQhpKQkJ2amZqQlY+djqKjjomaoKGko5uitK+sr6yfmKW5pqWwobCunLC7qqmvqpmBdnJiVkxRT1BNQ1NOTFFNQ1BQSElOU01ISkpESkxFSks9NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNDg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd3t6KjtKilpaijpqWmpqazp6W0wLiwtLDKxrm6ws/Hv7WvvcOvsceyraeslaSuv7ixsJ+nra2rlpWicldWX2hnaWhpbmNqaGdiXFhYWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5Yco+Cl4aNnJeKk5Cel5yVlJaUjpaJf5OJXztXb3uLk4l/i5GMj4WGcoqEloF5gnqFk52Ug5WOkI+Chn2SeHFvhY1+iYCQjY+XmZiTio+InIiel4eHlp6aoaCXp6+oramon5ettKKmrZisq5intKKpraOSfXFtX1pOU1FWTERUSlBNTEZPT0pGTFFNS1BKSU1QRklIPTc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5eLego66hpqaqoKepp6KpsKintMG5sbWwycO5tL/PwLqxsbjEq67Jrqejnoaborqtp6iWpqWkoZePlmlRTVJWWlpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1vaXuCdFBCQH+VkZF9iZSMhIqNmoyWlYqSiIaVhnmIf2BKUW54ipGEfISMiYR/f25+f5R3dXZ4hI2ZcFGNiIqGe354lHZnd4WIfoqIlYqNkJKWi4OJh5SEmoyBhJKblp6clKSjp6mlo56bsKuhpKSQpqqWoaqcoqaoiHRrZV1bSFFRU0xJVU1TSUxMUElIRktPTE1US1FRT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj03Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMTUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXa2nKOnnZ+hrqGnqKWnqK+sqra8tri2s8K8t6i6ybm3qaq3uK22wKqim5ODj5myn6KajaCWmZSQioxkTUxOTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+GgXuFjJKBkpmLj3uGj391f3hzbnVwdI2NgXl9iaqFeXpodnuOcHJteICKjJJ4eoB7gHZzcpJ3Z3WEhISEepWJiIqMi4B/hIqMf5SDe4CPmJSblZGfnaien6CeoKmln52YjKekk6Cglp2epH9xZ2BcXEpWT1FHS1hST0pMTVJKSkpNUEhMUUxSVE1FSEE8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3OTU2NzUyNTI1NzIvMi4sLi8yMDAvLSsoKCkuMTI2MjE5ODc5ODc3Njo8PDd2rpijoZicnrOpr6mlrKywsaq9tLK8uLa6tbKgt7uzq52fraustbOlnpaSmIaUpJadjIOXiY+JhYWCZEtJSklHRkhIUFRUVFdXU1RVVVVWV1dXWFhYWFhYWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUlNWXnWDfXlnd42XmI6PfWd5gXZ4f4mPfISYkoFyh498dntva36tfHOQin97hpKAfX90ZnZ8hWxvaHN8iYyHgGx5cX1wbXWPcWhxgH2OcEOKhIKDhX53d3qLhX2LenV+jpKPmIqSmpujl5mdm52eop2WjYqkm4+dl46WmI51bWtlYVlXWFRRSlJVVE9QTlFWS05LTk9KUU9JT09LRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXn56WoKavrK6rp6mwr7GsvLisu765s62om7GorZyQl56nrKekm52TiJZ+jpWSlYB8inqFgH5+f2JKR0hGQkBDRElMTE1RUlBRU1VUVFVWV1dXWFdZWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXlie3hvfHmIj3l8i4VvbYyReHN4amp/gnKWkYuBfZZ/SZKYbmh3foFsaWNseYWQkoZrc2x8bnJ7hmhtcH5zjYiDhXp9fnt2b3R0hYJ5gXdwfI6MipODlpeYmpCTlpeZl56XjIOJn5GKkoyGkJZ9bGhtbm1XVVdUUVFZT1NVVFRYVU1OSE1KTU5LQ0lOR0VAOjg5Ozk5Oj48OTw7Ojo9Pjo4Ojs5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp6kra+iraqota+urLS/q7zCv6ajmpWlmJ6OhYyWoqSbmpSXj3aRfoWLkI98eH50fXh0d3lkT0VHREA8Pj5BRkdHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpyQZlvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX5wbX96i4h1gYiGdGyZkXRze2prnY5MeYSSiYSOZzF2hnNsfn2DdGZldH6EhIWAZmlsdWtwf3xncHB7bpKNjntzfXxxcG51bYJ+d3l0aXmJgoiJg5aTkpCLjZGUlY+XjoB5iJeIhomGf5CHdWlpbmdjV1FZV1hZW01QVVZaWU5JSUVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LSs1Nzc1NDc4aU84OzVukoiZkZqWpKitnrKeprquq7KwwrK7w8ebl4+UmYuOhnqFkZqWj5KOkol0ioR3i4+Mf3Z3dXh2b3hyaFVGSUQ/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+zoHF8eG19bXGDgYWBeYSGhnlyoJR0eIBzdZSHNXGdqJ2OoaGEooR2cIZ8h3xzjK2NiIBoZmJpbnJtcIN1aW9YdW+OmpF2bH96fG1xbXB/enN1bWJ2hH+GgIWQkYqLiZGLkYyLj4N1eIuPgH6CgH2PeHBubmpeWltdW1lYYF9TTltaWVhMSEpGSkc/Q0FCRz9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp56vlaW0qK2xrsGzusHGl5CMlJCBiX1ugpGTioSLiJCIdoSFb5iKjH95e3txe3R8a29fSlBHPkA3NDU4Ozs8PT5AQkVJTExMTU5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx2iIh8fYWDf4x+dqKZeX6GgISZhZucYYaqn52LgpCNenaJfomIjnOKl4+De1xkcXR6e3eKbGdpYXhvhY+Cem6Bd3OEenBzeXdrbmldd4d9h3yIh4+Ai5OXg42GjYZ9cYR/hHx1d3t9iHRtcXJkZV5aWl1TW2ZeWFFVWVxWR0tLRUxHP0ZAREM/QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyMd4l/lIyRnZ2fppGgqp+wqa/AsbvGupaPkZSIeoZ2a4CMkoN+i4WQjXmEgnWiho1+foKAc4OBfWt6bFNYTEFFMzExMjY2Njg4Ojw/QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiXuJeXtxfI+Me3yJhn6Xh3ahmYiHj5KUpY2sqUiGra+vioCAk4qCi4KEkaiHgJiYipxzbHyBhod9jmhnZ3h+boWGgYVxhIZHa4B3cXl2aG1rX3d9g4h/iIWMepWenIqLiZF/e3WLdnx3bW93fn1xcXBqWltbWmNiV2dlXFVQUVhaUURMTEdPSUNGQ0NBQENBPTk4ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NzU2NzY4O0RGTE1NTEM3KyImJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFh5GPlpiSl6CdrKGmuK+zvbSXjZKLmIt9dHB/ipN/fo2DlJV9hn+HpYeJgIOIhnmJi4B1hXlfY1ZMQzYwLi8yMjEyMzY2ODo9Pz9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYCEgoWRk36FiZGBmpaCoKGYlZuapa2Tmbuxp7vHw6eKjKGljpOJgZB7coOen5GcfnaFhYuPh5BpaG+DgHSMhoSLcYaCd4d/e3aFfW52dWeBlI+GiYiIiYiiq6OWiY6YgHuCiXp6b2dreH13fHFpY1xZWVxoXGFmX1pPTE5YU1FJUEtETkdDSkRDQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnZwZ3iDe4CMgIGQj4uamqScoaymq6+wl5KRhKGUhHh3gI2UfX+ShpOWfoqBkpuOhIGCjIuCio6EgIqAbXBqXkNBNC0tLy8vLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1NUUlBPSERCPDg3LzlDPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6ChkqOppaOsk6i2oqfBwq7Ir3i6lJp8jKGemISThYKPoZ6TmZKEioWPmJCWbHB1iYuBlYyNj3aPhHFshYGKlpKDhYhyiaGXh5OJj4+Xpbapm42VooOHk4R+f2tqbH1+fX9xX1tiXllmalxsa19YS0hQU1FOTUxGSVFERE5GQkNFR0I+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwg3B1h3F2kYZ+l5aalJ+fm6egqpaTmJ5oZqSafoWTknqBkomSkn2LhZmSkYOBgYuOiYaRh4SIhXh4f2hOUj4vLy4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZunpqKZoZeilZyfqJ6pq5+orKmqtZerv6u2yMm3yNHPvpugcGmrqZ+Ek5KFnKCampmnkZGIlaGZmnd6fpSXkaGSlpeBlJ57dpWSq7OJjZegfZWenI6Tlpqko6e2sJ2RmaiIl5COgYhsc3N7fHluZl5bX15hZ2NfZ2dcUkVLS1FPSUpNRkZNQ0hMRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTQ2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYzQUBpYl5QcXVgbn1hd459fJSOjoqfkpeelpyqmJ6qQkR9h4mImI15go2Ljo18ioaPkI6Bg4CJjImFk4WChomBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49RkhAQUA4NjYyPDk7RkhHSUlNT1FZbYaQd5WLo6eqtb24pa6srKiptayxt7Kyrbuxs76cs8Ssu8nLuMO/t6WjsLKsraqji5aYhaWmoKKYgqaZjaKqp6SHhZOjoKCqoKSpjpyxi5Wjp7e7nKGjsJOjnaOekaSiq7Cts7WilaaqiZqKk4qVent+g3tlXmZaY2BdYmJeZmdfW09ESUhUT0ZITEZLR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo1NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoGUhYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMj4uKe4iDh5GOg4WBjIaFiJKGgoSJhoeHh3FuYUBFNjQ8My8xMTAtLCstMS8tND9EQU5WUVJTVVVXVU1cUUdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHHxKuzxbattMCzuL62v7TBtru7pLjGqbbJx7a+ubSoo7StsLGbmZKan4mnr6qklXefpJehq7GzmJapraiutbuyuqyvtaKxrLK1vLi0rrWgqKijqJupsK2zuri4qJy4qY2lj5KToId5gYByV19iVWRgYGFeX2ZgW1VKREVMVlFJSkpFSkhFQUBAS0RCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxcWlFjZFd6dXGBlX2EhpN2hn6AjXu/u6O8grSUk46bj4SIj5OKiXqHgYyTjYeFgY6AgYqPhoCGiIWKh5F6eW5dV0BFTjw2OjQ2QUI3NjQvLzZDSENRXE9RVVhVXFdPX1VJS0pBQD9HS0ZGRDs+QDdENz9CSkpFR1dUUF6PpK2ksrTDtrjBzMq2u8S9s7TBt7jCtb+wuHSxtKa6xaSwxrmxs7K0qKS2tqqxoKKWm6KSpbGtpa2sp6SYoKyzuqKosrm1u77Mv8XFvb2zwre6t7+4uri6ra2xprGqrr6wvbzDw6yZu6iVro+YmauJfoB5aFVhX1ZoY2hkVltjWVZUSkdHTFJHRElKQUlEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldUWVZad2pwf4+EgY6Fb3tyeIhiuaGZo4mVlJaTlJSOkJeSh4d7h4GOloqBhIGKenyLiIZ8ioKBi4SVfXh6dWZPXGRHRUw6UWRgW15TRj87SFBEWmNRUVlZWmdaU2BhTVNPRUE/SUpIRUZBQEM9RTZCP0hHS01TWlRelK+4tbu5ycC7vcrNvLzBvLi2vLu3vrW6s8ZhdbKlsZqeq76qpairqqSisrWgq6eelZaemJ+upaenpZ+kk6KnsLOosrK8tsG908nJ08bCxczCysTAvr6/vLy4tLC5t7fDusa+xMmwnrqroqyPpam3iYB8blxeXlxVX11nZlNZYVZSVklFRk5LQT5IRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFRSUE9RUlFKQTkvLCwsKisoKCwtLC9QPiguNDiAfTwyS4hxOT5DS0VASk1QUkxRXWhtbHGPjYaQc2xycnSI1cC1mqCNlZmZkY6XkpaWjoaIfYeDjZaKfoJ/g3l7i4SHe4t5gYqCl390fXpsZXB2WV1cUGVlYmBlZF1bWFhcTWRtVVJtbl9vX1hnZVVZVEtEQktLSEZISEhIQkk5REBIS1RUVl1aXJO5wLm+uMbBu7nKy7u2ura4ubS4tbWutreZZHWpnq1wXqKtnJihopuknqullJ+fkJSOlpiXqJ6mn5+amYOjnaykqrGtt7C8uNTQztbPyczSzM/OysfAv8LKvcG9wsDFxMbKwMnPtKS8sbWwnKy5vZp9dmlbXFlXW19YYWJRXGFUUkxDQkZHRTxARj5CSUJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LiYqKigtLjAsQE0rLzU0bYlJMEiJdD8+QkRAQ0RHS09EUlxaaWBvl5KRlG5sb3R1h7OsoaGfi5mcmY2NlZGbkoWKin+Ih4yQi4l8gYRze4qDhXuKdIGKh5V/dHt5bG11fGlzZWlsaGZqaWhgZmlpbVptdJetpL2Ih2dbb2hdWllUSEtPUEpLUEtUUUhMQUpGS1BfX2JnamKXt8ewurS7vraxxce2sLmxsbuts7Goq7itjbaonpynmk6anoyPoJaRp5illYqTk4iRiY+Rkp2boZiblZaHnpmmmqywqK+ns7PT1NTW0cvP09TO08/MxsPK0L/KycvJ0sjNzsPQ0riwxL3Euqa3u8Sif2thWlpbVl5WWWNZUF1YT1JDQklFQ0k7QUQ+Qkg/QEI4O0Q+QEk9NTY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OD05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2ZXc5CRmYNocm95eYOhqp6ml4ybm5iLjpWRmo59iYuFjoqKi5CIfISCcH+HgYZ7h3KDkouPfnF5dWxweH9ye254c2xpgHBtY2lucHlpd31+y7/D36duY3huZFthYEtQUlVOWV5QXl1OUU5UUVVUXG5ud4Nylq64rLWosLarrb3Bsqu1pqW5p6yvoay0pI+xrpuYmIyRlJGEj5uBjaeRnImDi4SKiYSLg5SVl5eUm5CcmJmZnp6rrKSnoqysztLV0c3M0tPT0NTRzsjD1NHIztLT09fN0tHF0tbGwc/IyMOpv7jQnHZrYlpfW1ReUVxZT1BUUE5JPkFHQkNGPUFCP0ZFPkA/Oj09PDxKQjQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WHhot3bHdwfX6AoJ6eoYyNmZOUi4yTj5aFeYWQkI6LioiRh3+Ce3J+gIKHeoV2hZORiYBvd3Nsc318d3xzgnhxa4Bycmlwcnp5cnu+y5p/jbKEdnKFd2lhaV1EWlpbV2ZkWGVrVFhdXWBjXmN4e3+LgZmqpKSioKGppqqxuaumtKOirqKkrqKnsZ+JppuVk5GKko+IgpSJa5WijZmEgYZ+kYODk5esi5WOlZqOhZKQnZensKKgoaWkqMjNz8fCy9DT0dTSztPNxtbTzdTY1tbY1dfVytTazcrY1tHLrcTDy4hvbF9cXFZSV1JaT0pHSUpKQDs6O0VCRD1DRD5IQz9DQjs8OTw6R0M0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV+aXN5coKKgJ2VnpSFi5aJj4qJjoiPgHiElJmLjYiIi4l+g3hzfH2Eh3eAe4eRl4GEb3hxbXV/dnh9dIZ8eWyHdnRufXaFdXl7nbWMPEGLxqV+jX1qZVdJQ2VjZmNoamRveVtfZmhrbmlugYSJkYyen6CekZeZoKOkprKkpbKgoqWfoqmhorGch5+SkpORi4+Lh4SPhH6cnIyNgoSFepR/gqqWo4ySi5iTi32XipqRqrOYm5ynnKa9w8W5tsXN0dDS0MvSy8nUztHV2tfX2NTZ2M3Y287J2trS1r/MzbR1c2thWldQU1BYVUVHSklGRT06NzpAQkM6SEVARURCREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MiooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qz48OVFFQ0pUbG5vcGJxcXSGjX2XkZ6LfoeSgomGhYqCiH14hZeXiY+Dh4aHeoR5cXt7hYZ1eoaOjp16jXB9cHB6gHJ7gXKEh4Bujnp1d319gnV/fIeJsHRZqsK3jZKBcG5jPV5ocnBxcG53d4JlaW9ydnhye4yHj5OSm5agloiMk5yfm5+roKGsnKKamqCmn5+smYyajZGTjoV9iIeDhYuOoJmTiIOHfmyZeYSZh4iTjI6VjIZ7m4iTjq2qlJWXn5imrrW8qK29x8vIycvLz8nE0srU19jX2NfU29fT2dvWz9va0tbJ1cyTdXdlZFhXTlFSW0dDRklIPkI+PTg6PkA8Pkg9QEJBQUVBPj86ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEI8OjlEP0NHUmtfbWRiZmx2gIhxkZCbgHmAjn6CgYKFf4R8fYSYjoeMf4aHgXeDeW57e4eCdHqSno6hdo92g3R1gX50gIRvgZCCb5KFdXyBhXp2h3yJuMalw8q4gpacj3hwZk5lY4J6gneFoZCLeXp3e4SAfIR1bZSWlZaQmJGDiY+XmpeXpp2YoJefk5KXo56aq5aRkYuNk4OMhYmJgYaPkZ6cmYiFi4GFl3qIiZ+XkImOiouCfKGJkIu8oJiTl5qcqKalrZ6ntb+/v7jGyc3Oxc3K0dbV1NnV19vU19na29fb2tnYztvGg3Z2ZGZhXVJVVFRNS0RNQzs9PDw5Ojw/OT1BNz4/QD0/Pj05ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTY3SEg9REpFNzkyNTtIPjs5OjdIUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWZhXVxpdHp5bImNknd2eot8foB/gH6Fe36CkYqFhnuFiHx1fnVtfH2HfnR/kp2Rn4OSfId+eI9+eYuKb4ObgXSZhn2CioV8fpF7kKmPkMOgvYybpJx+ioV9iXOMi39zppqcmJSFe4+RiYRpR3GhpJ6MjJGShYiLkJKVj52bk5SRl42MlZ+dlKGVk46OkIx/kI+Oi4SJkpaZn5+IjJSRnZCCjH+mmYiFjoOGhIClhoqLuJedkZSWoaagnZ2do662ubSrwMbK0MjHzc/T0tLY0tXXwNfY2dvY2trZ2dfbtnZ1dGdmYlRdWVJOTkhDTEM9PT45OTs6OTk8PTZAPj89PTk6OjszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdPPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PERSU1JYX1ZYZm1tbWmBjopxc3mKe3uAfH98iHt9fIuHg351hIZ6c3pzbYF+hX53hpuhm56UkoCMiH+Yh4Cckm6IqYV7oIx8kY6DiYScfpuRio2jop+RpK+gi5GLhYuBk4ZXcq2Ln6ubkIOZnJCPjluDopGCjZ+TlIyGiIySkoyUlZWQjI+KiJabnY+VlpKMk5SGgIyJko6Kip2XmKOihpOdlaCLiomOnZCDiI+Ag4eFpYWLkLKYnJKUl6GgnpmSm52nsrispb3Cx83Ixs/M0MzO18/R1K7W1dja2Nra19bZ2p1seXFjY1paVVFVVkNASUM/Pz46NDg6Ozc6OzozPDw/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieGxifpGDb254i3h6f3uBfYd8fHeGhYBzcIWCe3V3dnSFg4V9f5Kmop+mopeKnZCUl4uKqJdyirKNhKiShJmUhZqMo5agmJOJm56ik6mwoJGVkY6OiJaMb423hJrEyLKcoqacnJiWkbGQZKTNx5WOhoeJkJKNjZOVioWKioaWmZuPkJSTh5WYhICPi5mIjpCrl5eko4iZnpaaiI+Hl5iKhY+NgX+Hj6WIjZOomZeTlpihmJ+Zk5yaorK0paO8wb7HxsXJyMnCytPMzdSo0tHW1tbY2tTT2s5/b3tkYFtbW01IU1lCQUdEO0I+ODM3Ozw6OT42NDo6PDo3Mj86OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4JHdoGOfXxtfoh4en57goKDf3d2gYN8bW+Lf3t9eHh8hIeKfouis6ejq7Oil6efpaSWla6ig5G4lZKzmoyhoYylm7CjpJ2YkaeWqJmsr6SYlZaVkIuYmpehwI6jybirnKOmrZiSm52ynYWGqKKcmIWJiY6VjIuTj4iBhoeJk5iVjIuUk4eUmIaEkZCcdZGZspWWpKGHnJmSkIuQipebiYuWjoZ9jJieiZCQnJqak5iXn5OgnZSem6CxrqKjt760xcfEvcPDwMbNysnTps7M09LR1tjT0Ni6b3ZyWV5TXVROR0lNREFDRDU+Ojc3Oj88PDc9NDI2Njk3NzQ+NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdNWlxZSmZgO0iEi3p6boWGenyEeIGGgX5weHx+fW9zjXp+gnx4houJhoSSprusqLG9sKWts7Ooo6KwrIqatZ2juKWVraWXqa24p6Sjn5qpmKqkrrCqmpmdlJaRl6CYmru7rsqhara4q7CUmZ+jrJOXvqNeqrKDioqNlIeQfI6OfYOGjo+UlYiIk5aMkJWNi42WmJOdmbSWlaudipyUkY6RkoyYm4qSnpCLiZafoY2UjZiZnZKbmJ6UoaCUnJ2lr6ihpLO4rMLIxLa6vbzFx8fC0aDGyc3NxdfW0cvTn213ZVlXUFtPTkVDPjxCQUI4QDg4NT9HPTw1PDM1MzQ1NDU0QjQ5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRIYmBicEpAi4p+gHOGh32CiHWDioJ/bn18fX9wd4d3joKHfI2PjIaMmanCwK+9xruztMC9tK2rs7aMqLKurb6rm7ulp625uKumpqKipKOpr7Kxqp2cpZmbmJefoqalkqS6r6nAvK2usrmlpKh+iIacrb2wgouMi5CDjoORj3qBiJCNjZyJiI+XjYuVlpSRmpedqJqxmpGsnI6aj5KOlZCQlpePkaCRiZSbpKyUlo+TnJ2ToJ2bmJ+hlJqep6akoqOwsqbBxsOvsLq3xcTDv82mx8THxL3W0M3EyoVwb15ZV1xYTEpBS0FGRz9BQEM7OjQ+QT09NT02PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVONzlHRD9DRlxlRmBpZ1pdXJOMjIl7h4yHg4x1h5GKgW9+e4J/cX6Be5V6kpSUmJCTlqezxsm/wczCw7nHvbuvq7m7mLO3urLBrqXApKuvvL2qrqujo56nq661sKqcoKucoZyWn6+1p4ujurq2wbysqZ2zpaSolIWOqcTDpIKLj4eIhIaVlI15g42Rj5GhjIyUko6Jl5+Yk5mVl6agr5yMq5yNlo+RkZWVjpGVko+glIaXn6CynpSZk5+gmKSemp+boJSYnqWkpqakr62lwMTDrqi3tsnDvrbPssS/xLyz0crIwrRxdWlZVVlnUUxIQkxLTEpBQT5ERDw1QUU7OzM9OEIzMzIyNjJBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJlWk1lXGZUYmuZjZaKjIiTkIaJeYeUkIFygHuNf3iHgoKQeo2hlqiZmpm6vcfIycHSycvCzL3Cs628vqi6wL67xLeswamss7y+qrCqpKWkrK6zrba1oZ+vn6WimKOzvaqbqL3BpLa4r6yUsqysrJeHmqmmpZGCjJOlloqBdYqSeYWOkpCeoJOPk4yPjZSjmZaclZSjnqqekaWajI+Pj5WWiHyPlZOSo5qVn6KctaWQnpako6GlnZ2mmJ2Vl5qko6mnorKsqLvAw6+ls7fMv7mvxLO7vsG4rMLDwsCXanZeVVRZWEpKTElGRERIQ0NBREw6NERJOjs0PDhFLjEyMjQyQjI2U0hPPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+aUhfWGJaY2NWno+cjpeOnpKJin+KoJOEeIV/ln9+kIiKkYCWoZmup6SYwr3Hw8fF087Ozcu8wrewury0vcu8w8K2t7yts7+6va6vqKCpqLatrqmyt5qeraOnoZ2rt7iqpbC/xLK9ubSoq7a0rq6XlqWsqJ+RjZKyxaeWjnySlXyHkpmPqpmYk5OPkpWTpJ2TnZmToaOinJifmIuMj46diFqQl5eSl6SZZZiin7OllaGVq6upppueppaYlpiUoKSopZ+2q6m5u8O0pbS1y8C4qrarsru4rqi4ur24gGhrV1RSU01FSVJNSz9BSEVFSUhIOTVFTTs+OD1ASi4zMjAyNUM1NU9WTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs+QEJGQnBFaklSZWFMRqWUnJeil6mWjJGDiKaTiIKHgpyEg5WQkJSPmqKer76voca8xMTGxs7PztLKv7u2sbq7u77PtsS9uLm3s7G1s7izq6ecq6y5qqmnr7CYo6+lp6OltcCwrKy0v8O6wLq0p7q2ubSvlqWtr66ki5OUoY10wpp9l5mEjpeZjLGVm5qVkpKZmaWjlaCbl5qpnZugoJmKjY+VnGBKlpyalJqlllSWr5+vnJ+klK6tqqSaoKWTk5iYjZygp6KatKiqs7u7u6qxssfAuaasq62ysqOhsrK0pG1qYllXTU9KRE9PUFI7R0tJR0lDQz46S1U/QTo9RU0wNzU0NDpCNDRNV087SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiqlpmgoqivmZGXh4uolo6Ik4Wgh4Sdl4+doZqjpLXJtanFucLDyMrJyM3Nxr+7s665ucHBzLXHusG5tbqwr6+ztaekm6q0tKqppq2smqSupaSorLu/qKy2t7/Bv765s7LEsrm+raOvtay5poibl6abdr+fhJmdjpOamoyul6GcnJeUm6ChqJ6on5maqpqhp56YkI2RnYNudpKimpWdop2RrrKjqpSoqpepraOinqSnkZGZnIeUnaKelrGmqau5tr2ysq6+ubago6eopaacm62pqYtgYl5dTkpLRkdNSlZMPU1FTktMQkNEPFFWPUFBQkRPMTg9NzY/Qjc1VVhPP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li1SYE1VSH5lXkhFq5Wbop+7r5mUoIyTq5uRkpOJq42GoZ6Mo62Uo6O2xr60wLnCwsfJxcLNyMK+ubKvubTAwsq1xrLCvLW6qqitrbCjo5iqtLumqaarqp2pr6ejqqu9u6itvbW4vse8t7a4wrK+wbWqtbervqWPo5iSoqC8n4maoJmXn56Pt5+pnKWim5yhmqiks6CbnaacqKqemJWPlJuLlomMpKGUnaKdoLSvpaSSr6uZqqqcnKOiqJCUlJ+Cj56em5WppKGhs7S6tK2otbKznpyjpZqXlZiqoZ51XVpdW0hHRUZMUUlNRUdHQlNMSkJFR0FWU0NIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkVASkpOTzlDQDU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoFkVDQ5LTE5ZlxGQ0OdcGJHRaeXo5+ew62cl6WYmqqclpqaj6qWlaemla2smKKrtsPDvL62wcLAx8S/zca7vbmysLmzv8LHtb+wvLe5tqakq6utoKGZqqrEoqSprKaerK+roqmpvrinrb+yuLfHtrW5uMCzwMK4tbO0r76jl6OXlJyUrp+QoqOlo6OgkL2lqZ2pq52doZulnr2hmaOfoqmsoZ2XjZWek56Hj4SNk5+koJ61rKaclbCmma+lnJmonJ6MmJSeg46gmZuSpaSal6uxtbGqpaqurJuYoKCSj5CVqJ6UZV9XX1tNSEdKTkxIRURJQT5RSUE8R0lJXFJPSz1IT1U0QkY5PkhHNUNhW0tCTlJVV1ZRWFRSVUlAOFJRUE06R0E0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW1SRjxLeGVhVkuimqOcnsWsoZ6sn56uoJKjn5akoKaprJi2saKqs7bFxL2/tcDCu8jCvsrHtbi1tLGztLfBxba+sbi1ubSfp6yqrJ2enqWkwaWfqq2gpKmtr6GmqL21prG9ube2xLK0uLq/tMTBubmvs7W1o52llZKUoa6gmaKeqaiso5rCrKmerK6bm56ZpqC9oZ2kmKusrKaimo2an5KeiY5Xf5afpaGguKqnk5i0op6xn56ZrpWdjZiTnIGOn5eVjaGjlZClrbKqqaKipaWVlZ2Yi4+RkqSeiV9iWGJfS0dKSk5GRUFHSz89SkI5OUpLTl5RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dyR0U2PXVlXEtNnp6hmZ/EqKWhtKKds6eTq6Wgo5+sqaydu7CorLaxx8XBwrLDw73GxLzEybyvsLatsLSvvsS0ubGwurSsmaixqaqanaWhp8Ktm6yxm6qjrrCppam8tqe3u76vt8Sts7PDwLTHtLu4rLS2raqippaVlaSsop+gm6eqsK+vu7GmoKmpmpmYk6KjuKCho5KvsKylp5+SoZ6Vno+QjZWem6Kep7SnpoyXspuirZmcmqyPnZKVkpl/kaCVjo2foJOLpquvpKainKCekZGak4WLkY2bnX9fY1lmZElITEpTQkNASUg7O0Y/OTlPTlZeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwyNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ6jn5ygw6mkqrOipLWqlrOsp6GksqyuqbuyrbG1tMbAxMK0wMS+ycS1v8jBtKu1qK+4rL/Ds7eurba4pZiqsqurmJ+ml627tJuosJqsoK20sqirubKourS5s7jAqreyxL21x6i/r662tamnrKGYl5KmpaKimJilrriusrW2oJ+ppJqVlpSkoLeipaWWr7Kyp6qmop6ampuVl6ifoJihnq+yoqaMl62YpKuWmJ2ij5qMkpaYhZWek4uQm52TiqipqqGnoZielYuOmY+BhZSIk553YmdbamlMT05OVD5DQU5DOjpJPzc3Uk9dX1JWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDEtLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJb2hVQ1dGjHlmQzujo52hpr+np6+xoqm2q566sayjq7S2sbC5t7C3uLjEvcPHvb3EwsbAuMDGwLmptqSsu63Awbe3qq2yuqKUrbGtspakp5GquaqfprCcq6CvtLOrqba2rbyttLO5t6y4scO7v7+mxKuxt6+oq6unnpiZq6GioZGYobGvs6ywuZqbqaCal5OYp6C2qaajorGxtKyzqKyfnKCgm56lnKKXnaOzr5ufkJOkmZ+omZOhnZOWiJOWkpWWnJKIkJqYlI6pqKafo5yXm5KFjpmLfYuVhI2ZaWdrYGxtV1BRW1VBQkVUQDs7SUE3OlhQZF5QV1dFWV9eTUxSTl5LSj5ZY15OSFBPXFVZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEtLS4sMT0qJys9XHA9PjEuMGRaZEAxNjQ3Z1lgRig/OGx9Z1tWO4l7Y0M9p5+doqm9oqqwrKSyuaqmtrSsoK21va+zuLu6vre2wMK/ycS5xMLAv7fDvcC3rrWnq7exu72+tKmusbaelquup66XpqiOp7ufpayznquisbCzrKm2tLW+rrGytaywtLPBu8a3rL2wsbisrKqjsqaepaqgpJeRmp+zqrOrq7OanaecmpWOoaaktK6ooa2urrGotK2yqqScn6iknpWimZuotamXmZKSnZmdn52QqpyVloSUloqdmJuTio2WlpqWpqWjn52WlZeSf4+UhXuNkoKLlWRrcWZvcV5GWWdWREJNWERaOUhCNj5dUWhcT1ldR1teXU9NUlhkSkpCXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2BVMTUwPWBWXjgpQzNZVVxnSzaMemZMQKSaoaWtt6Wsqqavrreqr7W7p6axt8W3sba9wcO1tbrEvszGucPAub65w7jAuLK0q6m6trq5vrSprbC1l5inrKmsm6urjqu+nqyusqOroLGus66ttbK5uKqurrGota+1u7zKs6q3tbG0r66mobSgm6itoKaWlpuasqOtoKavl6GkmpqTjqOlqLOqoaazraq1pa+yta+kmZ2sp5qYn5qZq7ejl5OQjpecoJeWk6qempF/kpeMnZuYlZCKlJKemaWioqCYlpKTlXqLj4V7jIqCipFqbXdtdXthRmFrWUlHWlo9e0pGRDZBYlRpW01cYUtcXVpSUlJiYExLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVF9UXy81KENfUVwuK0IvSkdQW0czY1lUS0SZl6GxqbKqrKakr662qbe1uqSstLfJu7S7ur+/tLO3w8DMyLzDvLa9vr+3vryxvK2nurm3tcK2qq2xt5SWpq6rqKOwqZSvu6StsbOnqKOytbGxsLWxuLSpr6yyp7evt7TExreptrassK2pp6O2oKCnsaGklZyalbGep5ygqo6po56blpimpqW4qKOytayosaeusbWspZmgrKibnJ6clKm4nJSOjoqXm6KXj5ekoJyTgpCUj5ybl5aViJaQmJqnnKSgkZaRkJV2hI+He4SBg4uKbG92dHt+XExmbVxKTmNcPmJ7R0k4R2dXZlxMXmJNWFlXVVdUaV1PT0hgXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOR2YyNydHYkxWJS1CLj1FTFE8M3JrSUNDkZmlr6Wur6uopbGztKu3srihq7W5ybmtwbvCuLOxtcLCzsXAwb20vb++ur68ssOnqbmwtbW/vK6ssrGboKexraamr6WdsrWtq7GyrKmotbustLK1rbStqqyorKm4rbKwyMC5pbqwqayspaiusaalo6+kqZyenZuwmqOjo6ORrZ+koKCiq6anuaWstralq6yprbC2rqKeo6mqm6Cbm5KktJmOio2HkKGglIyUnJ+SkIONkpKcmpeVlIeXkpWZp5ufnoySkY2Qdn2NhXx7fIWIiHBycX18fVxTZG9eTlhmXEZElltHO05tWGJbTGBiTlZXVldUWGddUVJMY1lbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvKzEoKSssLSomNSovJjApMzg6MSYqM0JjOjYqSGVISis6SD4zQkhTLD6QaztHSI+cqquiqrGkqaWztbK1trKyoauuvcy6rcC6x7G0rbTBw9HFxr7Asr7Awru+t7vEpqy2q7K3u8Cvq7Gsn6OnramopLCjqrKqsKywr7Cuq7O9p7awsqmzqqulpaOtuq2qssO6tq27qamnrKmnsaWqpKOuqqiin5yjrZWlnpiemaydoqepoq2mpK2ruLOyoqqioKyvsayeoKenqZmjmZmPoKaXhoSOioueoI6KjJWajo2EhY+Un5yUl5WGlpSTl6SbnJyKkpCNiX9+h4V8dn6Fg4VycXCIdWtfWmBuYlFycFxLO4R8Rj9YdVhgWk5kW05WVlVXUVxhXlNPTmdYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMjU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE7XEowLkpnREY4O0IwNUVLWDFAlVk9TEWVmK2ooquznKqqsLetuLavq6arq73JvLC9tsKvsauzw8POz8O+v7TAwcO5v7PHw6qutq2yuL6+sq2tqqSnqrCop6ixpbSuq7GvrrKxtKy0vKS3s6ysr6irn6OesLerqq26t6W3tqSqp6uqqq2hqaemsbKkp6WhoayXqqGVm6CmnqWiq6Sto5+nsbiurqSmo5uqq66pnaKlpKSYn5uWj5ickoGCkImEnJ+Lio6LmI2OiYKLl6KbkJCbjJOSkZOjmZuZio6Li32GgYGDenN/gn98cnWLpId4a19gbmZXZIZjTj9nk0xFYnlXYlhSZVRNVlVWVE9cXWFVS05oVlZWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjM5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlZaLjBKZ0FBPDxCKzpKT140RIY9R0ZEl5OwpqOrsZirqq22rLayrKasqqm8wMC3uLK7taWyr8PJy9G/wLu5v77BuMG5wMSssbSxs7q/vbKwrqyqq6i2qaaur6q5sKiysq+zrbequLimtLarrKWpqpyjnrOzqaiktLSgt66gqqiqqKunoKusqbm1qqqpqaKqoK2bkqqhnaCloqajqp+dp7Svqaero6OYpaenqpyipKOgmZigkY6PmI1+h42HhJ2dhoOJiY6NjouChZSimo2NmpGSkY+Tn5eYloyKg390hoF/gHh0gn54dn2Ah52Pb3JnZnB3XGByh2pPXplWSG55VWRWUWNPTVZUVVBPWFtiVUhPaVRWU0dQWVVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg+Qyw+TFRfL0ppNU9EPJaOsaKmq6+arKWtsLS1sKymsKqour67wLCtua6htq/Ix8jRwL69u7vBvbrCv76/rbGxsbW8u8KxsbOqs6mktKilrbOzubCjrriysLO7rLqwqq62rKqfqqyfo6C2ramhn7CzorWqnqinqaOqoaKsrai9r6yuraKoqJ+smZCwoZiioaion6icmaqxqqOgrqKhlKOjo6eYmqilmJeYno+Kh5SIfY2GhISjloSBgYqGjoyQg4OTn5aIkZyQk5GNkZyUl4+KhoZ3dIF/fHV4eX95cnJ4Zn+GpHZpX2RpgHRmiIt8U1hvXkp4c1NkU1FeTU1SWmZOTVZZZFhHUmhSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNSkoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGc6NDhfPWFkP0YxQ1BbWypITTlVQDSRkLOhpaetpKekrae1s7KrpbGnqri+wLuvp7mqpq+xycfI0cO8v764vb68yLrAt6+vs7G5u7jAsrK6rLisorSnqKyytrmzqKi9tq63vrC+p62staytnKmvo6ClrauonJ6rs6W0qJqrp6mjqJ2jqaipvqu0sK6dqqShr5ybs6OWpJylpqClnJupq6afnKuinJOcoqWemJeoqZKYmpSQioKPhX6Pg4CInY+Ffn2Lh5GNj4N/k5qThZOhjJSRi5GbkpWHiX5/cnt6fnxoeHx5c25ve2aEeISJZGFnYHKEemxmeF1eVD9Xe21UYlBRWEtMTnJ1XUhaW2dZRVVlUEQ+Sk9EQ0E5SEdLUz9qYkpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEnLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mYkFKN0dTYFUqPTlEVz0qkJWymqCgqqaloauluLOzpqmxpqy4wb21r6K4raiosMLJyczBtr3AtLe/usi1wrSysrSxvLi5vbWtubW+raCzp6ursLa4tayfvr2qs8G0vKGvs7WqrJ+tsKOcpqmqpJ6bpbCnsKCfq6mnoamcpKihrbyorrGuoaujpK+en62ml5+boaSdn5yapKujnJulpZaXlaCjl5uXpayMnpGRkYuCioCAjoB7mZSMiHt9i4aPjYuJhJKYkIaUo4mTkoeRmpCTgYh9eWt+dnl4Y3x6cG5vcXZnf3NphGhlZ15sc41sYGlvYG89WnlsVV5OUFFKSU1UWldNXV5sV0RXX09eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTY4OzIoMDkvLDQvLj0tKks+KR00OSYnLjM0LjArLzQmLDokNDFBaFkxNFM9ZV9ETDZLVmRPKjsxTlc9I5SZrZqhmKilpKCopLiwr6SvsKmruMG5sq2fua+rqLS6yMvIv7bCvq+0vbfEtsKxrbmxs8C0ur23qLm4vaqjtKipqrGuubGrnLy9pbDBtreir7a1p6ansLOfnqSmqKKlmZ+sqKmeoKuupqCmmKOooLG5n6Oxr6Gsoa2knKemqZqam5+llp2dm56qp5ecoaqTmZSZn5OZlqGpkZqJjpCGfId+go19fKCMjYh4gouEiYuLhYeTmo6JlZ6IkZWCi5aNkXyFfHNwfXF0dGB6eGhtb29taH1xYnttaWViXGSEfl5Zc2pxSkl/aVhaTVBMSkhQUlFJT11fblNEWFpSaE9IS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy46OzgzJjI8MCw4NUIqKS1CKiw0O05OQDs3My0uKy03Kio8JTUzPGZkMjRNP2VdRk89UVpnSCo+L1dVNSiXnqeanZetoaGhpaG4q7KltLSpqLnEtbKtn7etrq2wtMbIwLa+wbmwtLy2vru+r6q9sLS/sLzDuai7urenp7WpqKyxrbSxqJy/uKauvbeyn7G3sKmlp6+xm6GkoKWloJebsKehnqOor6GfoZOkpKK3sKGmsaufrKOvmJyqpKmfl5qepZSbnZuep6uanJ6ml5aYlp6Ok5eiqKKQiYuPhnqEfoSKeo+WiY2GeIGHg4eLjYWNk5iNj5aZio+XfoaXjI95gXpwcndvb3RfeXdkamtqZ2eCbGVya2tkZ1dhcn9eWWt1aVlFfV5bWE9PS0hIUlVHMjpfXm1QRFdVWWVNSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0SEJmW0hUQ1RdaEUuOzFeUSwylqSjmJadqp6moaOhuKqwobu4pay9xLKvrqK1r62tr7TExL2zvrq3sLO5uLq4uq2tv7O0uK6/wbervbq0paKzq6iqs6yusqSdw7emqri3rJ+yvKqnpaivq5mjp5ylppSYobOmmZ6lqamcoZ+UpZ+kuaikp62mnqWhqZOfqaGhoZmbnqGTm52XoaOsnJybo5aTlZabjpOTo6ekkIiKjoZ5hHyFhn2cjYmKhniAg4eIh5GFlJOSjJGVlI2OlHuDl4+Kd398bHVybWxzYnl0Z2ZpZmNthGZnaGRmZ2hdZGJpZVplemJgUHNUW1tTS0lHSU9TQCAqal5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LTExOTUsJi41LTgwNTc2YHRCM0NEaFtLV0dVYGhCMzc3YUwnMp+kpZOPpqecn56epLatqKq6t6esw8C2r6yita6nr6+3wcC9scG3sK6ytrW5uLWsqryzr7KxvcC3rry8saSftqymprWqq6+hoMWsqqiytayttbqeqKqrsaWYnaqep6WSmaWto5idpKqhm6Gcl6Cdp7alr6qtoaGenaKVoKafoqCZnJuck5qelaafrqOYmJ+WlY6VmIyPmJqnoJCHioqIeIV3goKCnIeKgoh7foWIhoSQhJaVj4+QkZCRjZJ7g5WOhXN/fWd5cGxrbGd1c2thZ2Nic39hY2VmZWhoYWVuWV1YXGxjYUxnV1tgVklHSEtNUlg+OWBsaUhCVVNcW0lIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyssL0EqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQGJGJTWdpKGSja6hmpmgl6W0sqOyvrehsca8ubCwo7asq6+pub69u63Asq+vrraus7myp6u5sa+us7a7tq+5vqylnrWroKKypauwn6bFobOmsLOwt661nqyvrK6imZ2nqqWelZunpqCZpaOpnJqfm5Wdna2wprmnrqKhmpqemZ+jmqWdl5+Ym5WaoZOql62pnJWenZSNlZqOlZSYp6eNjIqJjnuBdIKCi5iFhnyIiISFioyIkoWUnJKRkJCRl4+Qf4GNjoJvgn9neW5obGpncXJrW2hjYXJ/YGRnam5rZWllY2xcbGx1cGFTYmhjZVpJR0xNT1lRUFVhZYFUQFZSWlRGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjQ8O0s2Ly4rLC0yNDo1IzMqKTYuNTU0NjVafF0xOktqW01bS1hkY0BBMUhiQic0lKOcj4+xnZyUoZups7CfuMC2oLTCu725saa2sKmupbi6uLisu7Ctq6u3qrW5raSytbGvqbG2trGztrunqaC2qp6gqqOqrp2sxJmvprCxt7atrJ6xra+qopudpKypm5WcpqSdmqqjpZaaoJySnKOrqqm6nqakoJeamp6hj2ujlpmdcYOXnKWBdpKsqZ+Wl6KSipiZgJeKn454hZKNg21pfneEcWyGioZ9hIqGb11kYGeEmIZri5CUknV4i4R/g5B/ZoiAaHZpZlhcaXRuTlBqY2Zxg2ZdZGZua2hdW12JkIWHaE5LQzhFVGdeSkhQUFVWS0hSYXB0ZUZbUVVQRkdGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTVPa1tOW0tbZmI+RzFOYTwrL46kmoiWspudlKGcqq6so73Fr6m3wri+vK2nt7Gmq6S4tLOzsLmuqqestKWxtaKnuLa1qKettrOutK60oqmftKueo6Wdp6ibsL+VqKextLmtrqSoraurpaGfnKGop5uYoaWmnJynqJ2TnqCZkJ+oqqO0r6Oio5yWmJmXo4ihj5KaiKGIlZ+if6WAqK2flJSelImEcniMjoOIoHWHjWmXiWZ+c3igb4eHhH6MfH+hoJ+Zf3yInnSIjnabimyHgoNtaGRke21yYlSGbWNtaZhxWGlwboZXXWhaa2paiHBseXKHaIeEWV5GTj5GXk1FUlZWUVBSV1RnXkxaTFJSUEVGRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk6LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdDE1UmtbTltMW2dfPUsxVF43LyiNp5iEnaydmpqdn6uqqKq+w66yury3wb+qpLixqqyms7Wur7O2q6mlsa2ltrObrLW2tKanqLOxrbKorp6robOqoKWlm6KlnrG4laanp7e+pqynqaqsp6Whn5mhqKOZmaejpJicpaqWk6OclJOkpqahtqSjn6OYlZSYlJyIrpCYlYqqjJmjnYaxgaWun5WboZd6gtSof4eUwJvGeHexpbeWZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4Fsl7GrsXlobFixrm9labySvG5oem1xj9h9UmtitrJ9f3CUdZqhqpBWTlhhT1ZORlVcWFBQU4tbV1tQQFxEUE5DRkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkJFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cxMVRrXE9bTV1nXD5MMVpbNDEhj6eUgaiqn5idnqWtsqqwwr2ytcC1uL/Cq6a0rq6pqLC1qq+2tKioprWlqLmunLKytqqlpKeyr66xpquep6WzpaKioJecoqCyr5afpKG1uqOqqKGtraSinZqao6mgmJypoJ+XnqiokZynm5SeoqejobCjnp+jlpeTmJKZha9raouOqn9ohZaHrWZxn56Vm6mXca6hpH53unxroI92sV9qtFulgGWckGBmgXpmf2l4aqllvnJnpox2sWp8sXh1kZRjbW2nblyEoEVpZ4eWRXWcYH1me6OmgVhfi6tofY94emqoOEqvW1hUbWNaS09YX1xWVjtOh1BXVi9JU1NKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy8uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVeWDMxG5KilYOtp6afo6WrsrittL2+sLfFsri7w6epsKywqaqxr6SwurClpa+zo6q5qZ2ysrCjpaGqrbCsr6aooKOisZyknpmWmZ2esKmYnKKgtbOhq5uhra2fnZmXoaOpnZmepaCcmaGnpJCdo5qXoaCsn6amoJqfoZaVkZeRmoa1m7V5hqmatpl3h7Obt3+Ul5isl39rgaZ6gYWGkZSSd6tnarFbrHuOh5R0iXCOhoB/iJCXeIOCipeMg6CPhbB2d59xa2ttfItPpVhIY2OZfmNopV95cXVSkoZdUKluY3B7hYBhnS9Som5bVGtnYExLXGRYXFpCPrB3V1hBI01pRkJEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQUFEPEZEOzAyMDE7RiwwLjg0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0o5YVQ1MByXoJSJs6amoa6pqLOsqru2wrC8w625t8Krra2vr6ivs6qir7yroqi2raSstaSlsrOoo6Kdp6qzqbCopp+goLCXoJuWlpeboLCknJukqLWvoaiPqaeqm52WmKGmqZqfnaOgnKCjpaOWm56Ymp6jq5ymmpyaoqCWk5KUk52E1ZOZuXGxwn/Gh33WlJy7fZyXqJKOnY2ke42GooGlgnmreY+dVq97iX6farlauXeGhH2mgpR8mXqqeY6dkHuxbY6EdJC7hm+VUK+nxYpRoHpjYKpic3KGa5aHXlK1tMiFfoh8Y6QzQp11XVBqaGRQQFhmWWRhSkdMakpaU09ZZlpDQz9FPzA8PDU5PDc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREIuLzA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0pbUF9mVDdIOmFQNzIlnKOTmbGoqaWzqqW1qKS8t8GwusCyt7W9tLaosrGksrOnoK+2qZuouq6ksLGhsrSxoaSenqipsam0qaacnp+smJmZmJiWmKOun5yXqK2xqaOej6yip5Wdl5yhpqGYoqGioZuioqicn6CelJmbp6Gcp5Wbm5+gmJCSlZCdiLJuaLVyrIhwj6dytHV0tnucmaaOkJ2No36PnqN+sHWCkNLSdVyufIV/pG6bqqZqhoV9rX2YmZB7sXOTnY95s2WWdIWebp9mlFLJi1rCXJ95Yl+tX3ZzhWGWiF1Zyp1vwIB0TUu1U1XGZFVRamNlWEFPal9saVBVRkg5PVdSW1ZZSEI/SjwyPzs1PTw1Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxBTlRfZVA1Rz1hTTYyLqOekaWvraWpu62mtaWntru8sru/uLe1vLy0prW1o7Oyo6CssKWYp7uupbKxnbS4qqClnaGqpbKorKqlmp2bqp+WlpmZk5Skq6KYk6arsaahlZKrn6WSlKGcpaeglZump6Kbo5+umqCenpCWnKOfnaWUnZWZop6VmZaTm4WsfHiod6OPi4eqcK6LhKiEmpqji5Oai6J9kpeHroR/gbNccrJTr32CgqN+cdd9d4R+j52GmZp3r4aKkZyId7RhmmWagoGVbJJbsFdLmnWYeWZgrV52doZnl4hqXa93lZ+Pd2w1ecius19DVG9eZ2BFUGxfcG1WVU0uZWNoUllQO0FEQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdCYEk6NzegnZSgt7GZs8GtqLKnqrK6uLS5vrm4s7e+tqa5taG2rqCgqayflai2rKixsquttKSbqaCgqKK1p6aqpJqelqWilJSdmpKWpKiclJCnrbCloJSZqJ+ij5GimqmmoZWapqmenaSfrZ2gnaCNlJ+cn6GZmJyWl6GglJiRp56HqX5/pnmhj5CEqnCtjYOnhpeho4qYl4ijgZCGlKp6f4udeXCxWqiDgoigeHTYf3aHdKeBjpuNkqR8lZCfhHuyXpxkoH2ClW6TXKtcW5N/kX9oZ6pjcnuAapiGcV2rWomgj2tuZE9KQ6FcWk10XWJmTVphX3J0X0pVNUqakVhIRT1HRUFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxPZWRBJlVmWz8xVF9iTDdGSF9DMT03op2amr6tmLPBrqusqKa0sLixtb+5urOyubyqu7ahsqWfpqennpOrsqmwqratqq+hmKKgpqSkuqOjrKGXnJKjoJaVn5uVmaGhkY6MqbCwpp2Wmqemn42SpJioq6iVmKmon5+gpK2joJ6hjpWhmaCgkpyXnJWdoZWXj6ycj65ucrR0qYx3i6Z0tHp1tIKUp6STnY2JpIeOdbhui3uLomtrtlqhhmWXl2igoqdtlHK0c5OZf7NqhZKIrWp1tGGdZqJuhpJrl1ytYE6hfIeRUnOjbHl/fm6Yhm9cr1Y8nHdlVG9uLlunT2JSa2VibFliXGBwfGNTWVE+P2xvMkJCQD5NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssMzI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFBOKWanJ66o5yxwK6uq6unt6m4r7XBtb2ysbu4rMK3qqyhnaekop2Sq6uotqOzqK6qoZedqKClq7ido66clpmQpqOXjp6hnJmen5GTlau2sKaYk5usqZaMk6aapa2jkZersqSgnqissJihopCZoZegm5abl6GTnKmdlJCrmYfUlJq7dbHEgMSHftaXnLh5ipKZjpiKjKeHeaK2dX13dsKCmrJhg7p5wHx1uGK1gYyHqX2WgqypcXt/dbyIp6BpnWGmjq+hfox0h6t9vm5zvHSyg3V4gYptmohwbY2kdL1dd31bYXm8alpWW2l5XmlgZGZibXlvWFtZQ0FAcT9DRys0SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sOzowOExYYUYnVGNYPC9UXmBLNTxMWy02QDmnmp+ivKOXsMOvraqqrLGoua+3xbG7s6+8sK7Bsq2mo5+kopyckaulqrKltaetpJ+WmquZp624naOumZWhkKagk46do5+Zn5qQlpOvubGrlZajp6aUkJalnaStn5GgqKufnJ+ppLKdoqSOpqGVoZmblpWkmZCwoJKVqp+FkJm2gJKSjbiWeIOTm7Z3bmxvdG95j4SOiXKewLu8mnuBsqhwgHSRuYN8hoaKh417i4aNl32ku7m9nHV5s6N0dpd1dLB1mJ5mhmmNtnRycXe2jF5/eX2IZ4N5bHlii6xwdIV+WFunaURkWVRmX2NdY1FnZnFtdUJNT0xEO1pMPkozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVzgqT11dPSs7VlYnPTo8pp2hob+mlbLCs6uqqKyrqruvscavtbSwuKe1ua6rpKKnn6CdmZStpa6qp7aoqJ+clqGknqylvqehqpeVnJGim5KQoqiik56XkpiUsrW2rJido6Sii5OSppymq52WqaWmnJuhqaenoqigkayel6Kel5aYnZ6PsKmUnKeij2t/apypeYl0f5uPdntmiHu9vsC6b5KDcZSFX3JqWl6biWFjh4+WbGB/lGNtnHZilWuAmpWUZV5gY3GaiWhyjHyGlGZqfnB0eH59Ylt4dIFoUFxuhHx8i2pXbHqBcklKb4VwTnJNRFZcZmBMWldmY19PWm12anJST0RETTxISTxMPjIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVDRlVFSk9IRlBJSUg7OD01MTouMTs6Li8tNzY9NSYiLyoyLCU7OC03SVJfSSdTX1Y0KVBeTCgzPlxPJz8yPqifqKHBpJm0ubajrKaup6i1sqzIrLC0rbakvrKzqKGkqp6jnJqarKeupKW1qqSbmJWinKetqb6oqaWVlJuWoJqTmaapqJGfkI+YnLCyvqyapp2noomTkqmbqKScnKyfo5qco6etop+poZmum5SmoJeUnp+dmLGlmaKomZ2Sn52kppuopJudmpybkZeCaG59cneRl5SQhIm0qo2FmJWPioyYl4iUlYmDk5OQiY2SlJmTmZean6Gam5Sfm42CeqSFbGl7kH2AdYmLgnKCeHl2doqAfIlqc4F0g3Vkd312a295bF9iW29nTVhZZmpfV1lwem9tZlNPRlM5UFpOUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7NDg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5UMTBUXjorPThdSyw8LUCyoLOiv6KjsLG3oKqms6elsLWqyautsqa1psCptKGfpaacpZaWoaunraOkt6ygmZeWoJitqqbBn6yklpKcl5+YlJWjn56jqJOQmKiossOvmaqcqp6PlpapnqucnqGtmKGbnaKlr6ahpKeerJiWpZ2ZmaGenp2woZ2ip5aZlJqUoaOXpKCZoY6XlYuLjpCYro98lZuCkYGJqaiFgJiWi4SOn4h7hJGGhZqRh4aKlY+bl46QmJ6jlpmSkJyNf41lobOuhImEd3uQin53eXpvZ3mRgYGJa3WBeYhyaHN/eXWDhoFqdGJ4ZV9oZGNkZmpYa3txamtcU0xQRF9VRkA+Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1RWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8zOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAs6C5r76tqq2xsqCqprKtoqyzsMWwq62ks6+8pLScoaijoZ6al6imqaakprO1npWVnpqasKauvqGsopGRnpqalJKWopyXqZ2Enamro7THs5+po6qWlpiap56pnKClq5Sfn52fqq6opKKroKuanp+hmKSenJ+dsKSZn6mUmZmek6abmaqfnJdmhJN9ZX+Pm5BjeYxsaGp6kKOramWamH5nhYtlZWloeo2ijmtojJiRo3hraouZo5+Yc2xueoSMhnlYZV2FgV5si4qCd1xnc3d3koCIgm93gnh/c215hHN2iIeNgnpohFhdanNkXXOIaWt8cW1jXVFOVklkWEBJMz1GNz9GRDcxPD0/QUM7O0RHSEhJTE5PUlJUV1teYGFhYF1dXV1dX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSi42Wk82KUVZL0RPMVlCOz8uPaSeur25r6uzsKulqK2usKaurrC9saqopa6wsKCtl6GknqKamqesnK2kpqips66elqSQo7CmtrmlrqOPj5qimpOSm6CZmaaWe6Sroqi0w7eloaavnp2VnqOeo52kqqiSn6GeoKqvqqmiqp6mm6Wep6CrlqGcpbGkl52slqKfm5SmmaCsmZ9+vYSJc7RzhZ+GrWh3ucS4cZKho3qmmJl0q4J9y8DAunGLo4eDnn2WmIiewL2Clp2djZzBwXyBepGMmsLAfWqlsm+NgW/Ken+beJKEj4B2eYGAeXF7gIZwd4WLknhsdZFiZV53Y19lgGJedGhtZGJYS1VJUVlIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fYGFfXl5eXl9fX11cU01QR1VOQUA/PTY0NjgyNjYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0NQLyNGWzNQWS9VQUI7LziVornDtK+vv6mplKOwqbCvraaytq+qpqemsaugq5ibo6Ccm6qnop2so6WopaW0pJ6jk6aurbi0p6+ikpGZnaaTkaChmJugnoimq6Srrb+/saCor6mWkZ+dopmjpKqjk6Chnp2srqiqpaOhpJ+jpJytqZGkm6muqpyeq52uo5eYppeipJidf86UenulgnqWl5tfrY9djqiAoaF8p5WbdauDga9eZIyqe6iHhaB0l5OIs2OCq4agjY2zaoSvdHyWh7hhgq1Zo81ukHZ723t/mXF+iJN2f2V7iHV2bH6HbX2Fj5B9a4CMX3Bqb2ZgX3hkW3FoamRmYFJUU1deSk9DNUFIRUQ4PjU7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xfX19eXV1fYGBfX11bV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w6TC0hUEBGNC4xrMHAv7S0sLeYnpGjqqmttaymsq2srKSsprCqoaecmqaYnKKvn6GfqKejpqGfsKybnpamrq2xq6isoJSSm5+lk5CfpZedqKOeraOqsKi/xbKnqbGtlpKenKKXoaqqn5Whnp2cra6mqaibpaWioKqSrLOWpaKqqp6kp6eisqKTm6ecoZyWlZGXoXKGjJh2hqiHcbF8nXGsfaCggaWPnnirgn6tf51yrX+sh4afdpiSe3yXfqqIooyRi5x9q3qIko+ff3qtVpzEe5Bwk8F9gZVtdXCMbWZ3ZYZvYXhucm6IiY+Og2yPjWNtc3VvYGZtZF9vaWpuZmNXU1xgWlJSQzlJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi08KD0xKTNWQEYhHEc7QzEtK6/Txseys5+do4+joqKtr7evqbGnqKqorqurp6KknZqjlZ+mq6CipqCoqKOfnrCtmJuWqKevrainqZ6XlZqkopKUoa2anaejr6yirLWpucyxrKatq5aUnJ2imZ+urJ2WoZmenqmxp6iom6qno6Gqmq+xoqirrqaap6urq7Okk5ikp5yWk4Wka6R1inqpdXuycYKlipiMcIigm4ekX2FSq4WAroOcda6CqIaGn3qZl4Z7ZoCjiqSYhoGjfal/gZSGrl57qFWdopKBe6OfgHzEsMWMc6+0s7lyYqmvwnVoi4uWjYBrl5Bta3h4d25rZmRkcXFme2ljXFZfaVhYVExMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICcnISstIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXWwKGZq6ihr6KfsLSwsKmto6enqqurqKSmoJuln52mp6aknayaoqyho5+vo56bk6qktbCvoambnJaVp6SRm6Kon6CmnLCloqixrLbHsbSoq6mVkZ2dopmgpbOdmqGUnJ6nqqqirZqqpqChqaKyrKGqs7KinKupsbC4pZSXpamanZN9qm2fhIh2q3l8sG6CpIuJn5aVnpaB0ri0uMmBgrJfYZSpg6WIh6B6mJaaearJdJqjlKipkJKajH6aiZrGxndloYKlc4GfjoJ9r19vtWOxdUujhm2nR4OTZI6Pm5F7b5SPfG15dHx6bVtlanJxZoBpXmFYY21cXllJTExKRURCQT1BPEE/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE5UUR0cOzxGMiwkqKTAxrmtqbKuraainbO5rKuhpZuopqqsqaagpqWYq6Ofr6ydpqGtmp+ppZ2ntaCjmJSoq7azrJymnKCWkKatkpqcp6OgqqeuoaOnqbCzwbGyqaynlImYnaWboqSvppeilZicpaWpma6cq6WknaujtqyhsbmwnpywqLS0taaWmamlnKGQg55Od5qCgJ96hKN8gqSEhqafnJ+UhLh8fHq5gn/MxsO2d5uikYuffpmXl4p2n5eKpJikqH6vhZuDnoSsfZmUYaVso3CPhZCBfZaEcqxgpHNxgJphvH1SVXWNkaGVenyQjodyeXKEfm9bbG53cmqBblpjX2huYmRdTExRU0FIR0ZIOjpLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFdZWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9URjxFMjpQW1QcGzY/RywtIIyHmamspKu5q6+gm6Kss7Wmn6GVpa+urqinnqWlmqSnobOuoqmns6CaqaSUo7Wjo5WXoam1uaSco52jk5Cispmem6aloaKvrZykqKK1scOwramsqZGGkZynnaOknKWXnpiYmaWjp5itoauipJeupbusore2rp6etrS6s7WomqCxo6agiJDStcO3eoeOhZGTj4CmeJSid4yhkoWlg4tyq4eGtG5yaZmknZWJn32XmYeHkHOugqWbo42mipOciJSQmm1wslylc5N6nGyZf3uZfm6pYaJycn6fYnOyuGh3jpKkl3yJio+IdXt4jYFsaHdpeHNuf3RcZGRtbWZoYEpaV1g8SEY/UzNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgjKSWSco2Krr+/vLu1npeopK62oqKZlaOqp62pqpmlop+moKC1pqKpp7GklKujj6StpJ2QmpqqtLSknaWcqZKUl6+goJ6mo5ynnLWZoKqjtarCr6iqqKGMhI+coqGmo5WampyYmpimo6WXqaeroKObrKa8rJW9sK2fo7G1u622qZ6rtKaqmnyokX18sHiLgKSliJxtsm+hh618oo+DqJeagayJhq2FoJSooKOXhZ+BmZaBe5J+q4GdmZaLq3edoI+Ik5J/ea9do4F8pqdknoB8l3Vqrl2lbHKFmV1gW4ygbZSPpJeBkoqTiHd5gZZ+aWx+Yn10bX95X2dlcG9nZ2hCWV9aPUpTMlM4QUFDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaWFNQT05JODE1Mi4qLEFUVlZWVVRVVVVVVFRVVFNTVldXWFZVVlFIRklKIygovJKbhKnGw7fBtJ+araCuuaajjpqjpKCvrqmfo56drZieuaCjq6GwqpquoZGqqaWWipqQrbGsp6Com62YmY+toqGepaGZpJytl5+opbaovq6kqaOfjICOm5ugpp6SlJmblJmZpaOimKerqqGinqinvKSXw62ro6KttLytsKmjtrGrrZp3r36Ri5yFh3y6rYmYZLCMZZaufaGQhKeXnIKti4WwhqeapKKikYWgXGxrgrNgf618e4KBsmxmbpmXi4ixWn20W6SDa8iiZp+BfLtZdrVasn1Tr4F6rFiAoW2XjaaYiJSNkpN4d4ybfWNzfGKDd3SAfGFqZm9tZmVlT1VjXEFUXT1IKD45PTQhISwkHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE1KR0M1NTMuL0BVWVhXWFdXWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7G3vru0wbOjnK2mpbepoIuZoJ+dsrGonqKfnbWYoLOoqquesK2erJyVrqiijombjq+sqaejqJquk5qPqZqhnaWfmaOipZieoqixqLuupKienY99i5uWoaCZkJGanJGZl6ien5enraWjpKKkqbqeoManpqmhrLa3rrCpob+wsLCYgqqSo6+Om4CGpJeYkICAuMO6hI+dk4WomZ2DrIuDr4qonJumq5F+1b3CqmKkv719f6OCg9e6t7WElJKCnr2+hGqjgW+rhG6df3qysceDa6uxvax5eKK+u3SAlYykmY2YjZOZd3+PmXlifHlkjGZ4gXtga2VqamJQYltTaVxAVGBCTCk8OjQvHx8kHiUyIBwkKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbS0scC5sr2zop2up6azpp2Ml6W/qbavp6G/pqaxm56xnLmon66vpaeVlK+sl4yDmpGupqOsoaWcqqCYiqOTpp2nm5qgqKKYnaCrrKm4rKejmpeTe4iZkqabk4+QmJmOl5OomJ6WqKieqKagoqq6nqnFo6GwpKy0tqyyrKO/q7KynHV2qqW3hWWKoHBnrJCKj25ud6WQm6CCdrGbl3CRjnKXqaSbmK+kcmxtbWaLeG9tg5lxgXppcGlniZaVl3FoaYWGZ3GGZF2KY2lvWl1nfnimYGJykJNwZmSAjZKNoJWVl42SmnqFjZN0ZIZ3Z4xqeH55ZGxjZmxiSmVXSmtZOlBkRFAnSjkrIxwgGiIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWttKm6ubK0qqmirp+ks6qZkr2xw8e8tKmev6uso6Cnq6C6o6SurK2mjpatqpCMhZWWrZ+mqqKfpKOgkYulkqaZqZmWo6mglpylpaauuaqsmZqTknuEl46ml46RkJeUjZeUppOdlqeima+lnaKruZ+wwailtKetsbOssK6qvKexu5iMoqmmtpyJl6OYhqmbkJSdkqq0mpykraK0mKSjn6KjnqKlopasp4ySk42Hk52dlZCZk5iQjZWEf6Sal5WOi5OSipCHhH5njIF0g3d0h4xxp219lpOUlIGBj4+OjZuRnZOUk52AhZKLcGiPdm+Jd3Z8eWlsZWRvY1VhWEBpWkdiX01YK0U9KyYhNjQwLx8cICUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5UUUpFQz45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqktbevrqKwpa2goLaxkY6qxLzDubapoaSdm6WdsKikt6edqbWnqJGYrKOLiImPnKeWraShmqien5OVpJeomqmZlKago4+ap5igtLmnqpiakI18gZWMoZSLlZGVkI+Sl6SOnZionpq0o5ymq7eor8KvpLinsLCyr6ustr2jssCak6ekprWikp2nn42pn42Sn6KtsZuipLOrs5qmo56mrKCfnp2XrZ6TmqKclJCXq5mNmJmXkJaekYegnpSUhpOMj42VjIF/Zo2IdYh3eomEdJxqiJKWlZKJfYyWkZCWkJ6QmZKdgYaWhXhxlHJ5iX9xe35qb2RfcGlgXF9ZbWJQYGJPWDlGRkU9Mjw9OC8qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlqSoo7CzrK6jqaetoKi1qpCPm6Oyua2qq6GimXqcobCkprGpl5y4pqOUmKmcjoaKiZuikK+epJaooKGSl5mcrourlo+omaeMmKiOnbi1o6WYm42JeYKUjJuTipWRk5CNkZahi5ydp5ydt6J/g661orCwdaS/pLOheXuirbW/l3iwpqGKgKp/ZFxid6COpJ6Dln5tlLWdpKmwrKVmoKGUdHqbmHCBmaqZbH+kqYplnKWckZeYl4uSm5CEnZuQlIOTh46OkoqFeGuQiHaHcXyGgYFhaYmMlZOMW3aVkWdnjoxxeaGVlWR4l4WAdpdogomCbnl/a3BlX3Zva2tnXGVjYWFtUVk9TU1OUkY9QFRCOTEvHh8mNDozMDY2Nzg8Oz5AQUJGSEJHR0lLTFRVVVldYGhmZ1hRSTxERzw5VVJbYGFiYF5fX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqqWprqOnraWSlaq0rrClmamlqpdzi5yvoKirp5SXuaCgj5yknpF+iIiano2smqSVp6KejpeSnoV1ro+IppqokZajiJu5s6egmJiLiXV3k42Wk4qTkJCUjI+Tn42ZnqWYm7GVgIybtZ20jJKPvaiifqeje6WxuoOOj6ifhIyGj7Gpr4yKlqKaeYCLrIadnqOpq6mJloead6ace4icgZing4F7nbN7ioagmJmUmJaBkJaWg5maYnmIkYSOj5KLhG5xkIh6gnGBgYaAh3SIhZeTeJZok3SgmnN7mYKcmYSYfpGIgYKYaYyMhGp4e3FwZ2V4bmlsalxkaWlkcVpcR1NLUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dSWFpYW2FhaWZZUUg5REw8PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2YpJ+mrq6rqK2gqbGnp6qlmZOsxLyvoJSlp7Sdj4OcrJynoqCNkL6emY2fmqGRfYaPmJeIrJ2jlqGhko2UiYaAkaiOh6Kco5OWnYaeubGnnZqSjoVwdZCJlZCKlI+Om4uOkZ6QlZ6jlJ2rh5+0ibSarovKiKuvireFjbCEs7KGqY6pmY2dfKiPcnt3nI6mlmiVpHm0jKGgqKqTmcKCgKuJmaFynoCbpX2XhZWzgaF9oZOfj5iYgI6UnImYkot8hZSGjZWTioRudJKGgHtzh4GEfYV1hoOYgY/FZoCph4+iap2BnpeAmYCKjIOImG+NkoRnd3R7dmdodXBnaGteYm5sZmpXZEVcUEwyRTQ2TWBjNyYzPEVHRDo2MzY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQElkWF1jZmhnYmJiYmNjX19iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6OgsKmpqKasoKW5saqrppqUnqGkqaGUo6m1oq9/oKedpZ6diZS9mpONoJKdkHmDlpWRiKuZnJuaooWPjHabm46gkYieo5uWmJeGorispZmbjIx/Ym2Pi5OQjY+LjJeLj5GejZKeoJigp36hp4etnaCWrpCgnp2Rh4Khja2yiKSOrJuMmn6idoCZlGuBq3VNq3iHjZ2TnKqpgqqrfoShfHunap6Ak2xnl4aYt4mefm5gY1iDl3+Ne2Rni3OZfXmXbFx8l25gU3GFXGBteoRgWWWCfoWBmXGoq2uDo25ypW+fgpxnZJ5sWmyIemVZX4J+YVdQb3ZlbnRxampvXWlvbGpnV2ZNXFdFOUE0R0NeazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUktNQkpbXV9XXl9jdWBNRTpNTk1UYlxbZmZpaWJiZGJkZGJhYmBiZGNhYmprZGJkZGdkYmdlYWNomJeeoLmhqqSmrJKitr2rr6KZlp6gpaurn5yttKGnkaCfoKecmY6ZtJmQi56MlYt1gZSRjYqmlpaYnp9+k4WFrKOHnJGKmKiYmZmRh6WvpqKVmYeJgGluiIiLjo6Jio2Ri4+RoYuSnZ+aoaV/k4GPo6GUoHeclpCng6OpgIassIeleox+hJp9onBzk4eVe56MeW2HnIyakpyqnI+HnX2DonR3pmeefnelXph7fZNzom6Yt7S6c5OIgYC2qGSBxrh8cZW2jHGAm6NjdKyrYX5qnbN+bn6Ig4+DjJhxgKNscqNynoJ+o16cmbOWb3uXnrN0cluesoJpYnB0dXFob1hqa3FwZFtmXGFLRD1ENVFBWXAyPFJHX0pSPTwzOTU6OjZDPDtASVA/VE5OUUBFX15bWVhgYHtkSUM4TFdVVmNhWmZma2tiYmVhZGNgYWJgZGNfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mauck6COpbi2ra2gmqGboqOkrJqasayrkpegmaGlmZqUnqybi4mReIuFcYCWjYqPoZCTlJ2XfZGKjqighpiPipKik5uajIqop6Sej5aHhH5re4d/fY+Ng4uQkImOk5+BlZufm6Cfi4l3nJiijaByoYyJqYmdqJGYqq6Brox+eqCZeaOTeIBzl4iMnH2Vn4ebjpqdqIijZKF+ipaQm41tnmibjm+amXuAiqd9cmh0qoOeg3OqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxfp3Z3ioqAnWiadYeTkpiNfp5tmZBqpplcqH53u2p9qVqOhF2zZ1xucXh3a2lbcGl3d2FeY1ZhQVBFTzdWQlJtNEpaWl5OWkRAMTUxOzs3SD86Q0hVP1lTWF0+RGJdVmBRYWN8aUVCOU5bXVhkZlhmZm5tYmJlX2FhX19gYGVjXmJkb3FfZGVla2RjaWhna2mWnYmqtpyoiWOVnKy7srCsnaWbmqefnayZnbCnqp2Xo5qioJmWlqCjmYaJjWmIgHJ7l4eMlpaEkpSYj3qLhJaknImVkIaLnZGcm4iPqKGfmouQioCAaYGGeX+XjHuIjY6HjpWZfZKhnqChk5hyaJ+KoI+McJKNg6mJmqGlqqOqfrCtpKK4l3ajs6Kjf4iUeJ16qpl/oo+fnZmJmHKhfYeNsLV9bJqRoXh+mbWjo6uohJl8mnycmn90qlpdb3uXjHieYk1/e3uFZHqYQk2fWaJqc3yOb4KKhJl2m3mHibGzf36akqZ0fp1tcXyUb5lyaaNdlXZIZWNgc3B9fW5lX2tndXpiYl5PXVZcVFZAWUVQZkRSVlxhWF5JRD1COD9BOkhFOExFWEFXUlpWRUZhXFpgS2BtfXFFQzxVXmJaZWpWZ2htb2JmZl5hYFxdXmBoYl9lZHZsXmVnZmxkZWxoaGxplJ2Bsa6ahFNfoae0urOzqZqii5qpm5unkqCro6Cnj56dnZqZlZihnZaHh4l3hYFueZWEkJuLfZGTlohygYmSoZtykpCBiJiUn5qEjqibmZWKiop8g2yEhXGCoYx4hIyIhpGYlHuRop+eo4iuhn21hI+enXumlnqpgpeekYyjoH+naHhufplzoHNxfJ2FmG+Tgq18pISnn5uDpHBeqWh2o2RwpmGd0498e5l4cnNjooaQfqJyo5B2a5Czi2CCmIp0qrKovH93g25/v6aqtF6cb39yl3CCc6JyXqRndKZgaKZsmtOYeoKbbnZ5l2ubeXaXcmyppWdfZHlxf4RsaGZjbXV2Zl5gUVplUFFhSFZJVF9XU1tkaltlUEVDS0xKS0FKRDhQQFBNWFNYT1NRYGVlaVNkeHl3SUZFY11lWmhpU2loam5jamZgY19cXV1faGJhaGV8ZF5kZ2RrZGpsZmhsaJibf7GsVF1Lf6qwsrWws6KcmISXpqCgooykp5+WqImZmJmUmZOSoJeOiIV7cH2EaHyPg5OagneRjo+KcICGj5OSbJiUfIiRkqOVg42pmZOSioSJeYN2iIBugZ+Gd4CRhYeYoJV5kqGjmZ+Js6Gitot6rKekrqVwqYCbkYaBnpR+pYGjmoaYcZ6Eo62viZeLf4ykjZWDr6OVd7W2tsmic5SMg59gnpepbXmWh6CbdaGHeKB+kJaLgW9NZqOScZqIc6V7enVig4JtfqBscmRgnHN/dJdre2q0trTGpnOYfXmcapqaq3SBmmxzd5dpmXl0l3FQRH2zXmp1a3iGZmtmYnN0b2xVW1JYZ09SZ0lVTFhSVVxna25VZ1dNSkFKTUtHSk5BUUpQZGNqbWV1c3N+eHtudYl6e1RRTm1eaFxraVJqaGlsZ21nY2VfXFxcX2liZGhre19dZGdjamZubWVpbGWinYmwqIVlQJSisqyvr7Whoo9/lqehoaOLpKacm6WCmZeXjpeQkJuTjoiDeWt5hmWDjH+Wn3l1j4iMgmqFhZKEi4WdjXqMipWlkoKXqJaLkYuAiXqAfYt5cI+ghXmBlIaIlZ6UfpOkppuVloNnbnicbKJkfHKleJyYcGingpmOfaV7oZeDlnKfdoGJlJWPuW2PiqJifZmjl4luc2ura3Wgbm+mYJtpi5BploeblXWigX6aYIuGjXVviGJooWaef2qbdXBkZ4iCb3KiW19bZKFuXoiMcXyAdHJkpW54omNmp2eXcouXbaFvUoiPbqBeZKdUi11UmG1tcmtxgW1waGt3c2puUVZVVWVZU2xJWE9cSFhoaHJqWWtWUFJFVlxNWFNhVWhqXnd1e3xwfXxygnt/c3eOgIN3XlFzYWdicGdQa2hoa2xvaGRnX11dXWBqYmppdnVdXGNoY2ppcmxma21jnaWZpnpldG2Lp66lqbCxpZ+Lf5apnJ2ji6GhmqGigJWZk46aj4uXkI6Ke4ZxgIhoi4p8l5pzdIl9kHxlg4eViomVmoJ8iIaWpo+AoaqPhZCKgYp9gICOc2mPpYR9hZKMh5efjYaRqaWdiaZ4lpt+pYmWjLKZnpGEr5efpXmYinupdaiQhJpupaKMkoSMg7xtfKWvgoeGh5WXnaJ+pnxyqJWhlmiffm+sY5aKlpN4qG2qo4GJdYiCd6uRpohrkrFsd7OMqWyLhm9voJ6SlWJ/q4yqd4GAjqefd599haSVnaBomod1q2aerYy2c3a+jKOTWYOmjathdXJ0b3t1cGJqfW5nbFJUWFRgYFxrTFxSXEldbG12X1txWFtfWmdzZW1vcWNxdGB3en55cnmDcoN+gXt7jYGCgHZieWRjbnNkUmxnZ29tcmlmaWFfXlxhamJsbHtvXFxiaWJtaXdtZ2xuYpamq52BgJ6klqqqnqinraOYiIGWqZmdoomapJyonISMmo+GnJGFko2MjHSFeoiDb42FfpeTc3SGcpGDbn+LkoeGlJB9e4KFl6SNf6WkjYCOiYSUdYKHk25si6iAgouTjYibnoiLkqqioI+AdJSXiH6BeJSvpH+CnHGPhnmTjoaBe3OpjXJ9fXqXlpuEjXh7fX2IlJWTi3eRmaGihXt/imyMhlx6eXN6cWlvfpOKcYB0go+Uk3GGhIJljX9fgYGMeHZzlHVwem9viW+Fhl93aXiOZoKDho+qnH90fZZpiYhvfnV8g3VtbGaMc3h7l3eEWmpXeY9pbndycW93eG9da4VuaGdWWV5WXGRqY1VgVV5RX293eWtqd2Vqamp1fHBxdHNhb3Vic3uBeHV5gnV/gH+BeYuFgn17bYBtZHluXlduZ2h1a3hqaWlkXGBaY2llbHF1blpbYmtkbGt5bWhsb2GOlbqpp4uhopunpJmknauhn4ODlqqQnZ+ImaaaqJiCgZyLfpaUh46KiYxygnyOfH6PhHuXjnRyg3CVhnx9kouGho+GeX6AhpijjHumn4qFj4+ElYOGjph3cYSqhY2RnI+Hnp2GipqooKCrg4mNlZt/foqXraiQk6iReHGfk4V9lHB/q4dxfpVxam98gZ+Lf5GOi2huXYSNjZydoJBzl42JcnVsg3Z0gFlyb4eRgn5/jGpdaWR7hYSIgGBpeHucfISNg3aCh4RpeoyJbGJxc4N3X3ONg4qRqJaHZ42Ogmx2ioJug4t3bWRlY3qCepVaW2lmbXZbe3l3dG5zcoNmXG2Ja2tiWVhcWVhqcVpeYFleXWVyfXp0b3Rjamppe3xyenZ0ZG10aGx7f3V6fXt5eX+Af3CGiYN7fXN+enJ/aFRccmlsdnB1Z2tnZF1hWWpoa2pxcm1XW2VtbGdyeW9oam1gjIyrsaGQo6Gan5+YnpmooaB9gparjJ+ThpqhkaSVf3uYhXySmYmIhoaKcnyAi3aFi4KElopyb4BzmIaEfpODg4aKgnqAhIqan4+BpZ+Gd46XiJWLi5yXhIN6rIGQl5iTiZ2choehqp+ioqOLiJObnaOZlquiqKehk5yJmZF+epCQhql/gJORkpOcsaWalJ2PjbGSmISmjo2WnaGKkZ2EiZOLbH2Od3dmg4aRi32JnoWHi4+IiIGFhJF3fHt1m6SKh4ugjIeWf4CNg4F3cXWGhH94iYiLkaeRhIeOh4KLj4p6hYmHjX91aoCDfHmZaXFoYHOKcH17d3Zvd3SBXV5vhmduX15ZWlxTZ3BVY1tbYWxodHt7cm5wY2ppaH97bXh+cGhwcGxmgHtygoB3f31/hHttg4yFfHp5fH56g3hOZHZqc25xe2RrZWJiYFtzZnBmcnFsVV1sdG1oeHpwZ2lrZY2Inrqfl6OhmJWZmJSYpKCcen6XqY2djIWfnIqdlnx5lYN7jpmJhoOEhm14gH9ygId+iJOEbWt+epeHhIOQfoCGhId8h4ONm52ShqmegnKKj4aSkouckXyNe6mDjZGXlY6bloWFm6afopqdhoOSmpmZkJmmoaaenpCXgpOMeH2JkIanfH2PkJGGmKqhnJOcjo2pjZKAno2JlJughI+YgIiPhHF5hnJ1YX+EkId2jJmBg4+ChoV/hoSVbnp2dZSkjI2Gm4aGkHWBjH5+c3N8iYV7eY2PhZSokIeEj4GCiYiIdIKGhoh5bWp8f3ttaGtsZl55f2h8e3Z0dnV7d1xgcH1udGBjWlteUWZsU2RaXWBqaHR5fnBsbGNqameAf2tyf2trdG53boR5boaAdoKAfYV3coONh357e3yAe4KLYGl7a3VoaoNkamNgaVxjdWdvYnVtbFRicXllb3l6cmVqbW2Lip+4mqKkn5OSlpeLmp+enHp3nKSQm4mGpJOKmJl5eo2Fe4qRg4yCgoJse394coCFfYqQfGtofYKXiYGIjnx+hYSHfI+Aj5ubkIimm39wi4uMkoagoYqFjHynkIeOkZaSlpJ3jKOgoZ2Wmn+BkJqYk42ao6Kkm5iSnICQh3uBhpGJoYF+jY2PfJekoKCSmZCPpYyPgZySipSZnX+Tk3+Ij4J2dYJxd2F+gY6Gc4qWfYiMcYx+goWGj2h4cnqOmpORgJh/iYxzg4l9fXJ6fI2GfHuTjoSXppSNhpB7hIWGhHN/gISFeGRwen54eXBramZefnNpfHV1c3xzgGpeYHR2cHdkY1hdXlJpaFNkWF5fZ2l1eIFxZmtjbGdlf4BqbX1nbXBqfXeFemuLgXKBgX6BdXaCjYZ/fHqAgX1/j2pyg250aWKIaGxiX3FWdG9sbWB4aGxXanR2Y3R6enFia295iY2fs5Klpp2OkJiPhpygmpt7daOejZd/jKGKiJqWeHyGh36Ein6IgoF/cH56dHWChX6JkHdnY32Gl4qCio14fYCNg3mWgJWXlY2Wn5p9b4uBkZOFpZuHjImDppWEkYqVl5KRdpGdoaGYlJd5f46Yl46Wmp2lnpqUlZ17koiFeYeYj59/goqOjHOXop6gkpiOj6GMjIOYmISUl5p/mY59io6CeHJ+bntkgHyLhnGHk4CRgmuHg4GAioVmdnB9iJSajn6UeY2LfYKJfnxygHmLhnqFkouMmaOXgoSLdoeDgYB0eH+GgnNednd8c312ZmtkYH5qa3dzc3V9cXxjY2FzbnVybWFZX11aa2NSYldfX2dqdHmFcGJqY2xmaHyCa2h0aGxvaH98gXlsj4VxgIODf3R8g42BgH56goN+fJBtdYl0dG1mimxqYmN1VoNpcG1geWdsYWp2cGV4e3lwX3FshYWQna+Yp6mejo2Xh4Wfk5WXfHaomomYeZaci4yZkHh8gYt9fYR7gIKBeHN4eXN9gIN/iIqAZF59i5SHf4WHdH1+in9+mISWk5aMo6CXfnKHe5ORiqaPjI6KkqCRg5CPk5eRioGPmKCakpCRdICOkpSJnZ2ep5mYjpWXdZCRi22ImpGbfIiJkIlvl52aopKVioydi4aBk52AlJOWiJqKfYuKgntxemt2bXx/jH9uhZODlHhvgoR+fouBZXNqfYKYmIWAjnWSioV6iX93eYF+h4F9hI+GjZWlkXmFgnSIhnt+cXJ+hIFrYHl0eXB8bmFuYmV7Ym5vdnN4d3N0YXZgb2x1bm9cWl5dXWldT1xXYmBnbHJ6iGpfaWVqY2h3h21mbGhpbGeAfHp3bpCIc4CDhH10gYaJeoN9eoGEfXyOcnmLeHhtbIdraF9pcmKHaHFvZXZnbWxhemhqfHt3cGF3bYqBmZqroaWpnoqLkYaJnoqUlnx2rJeMlnyek5GWlIh2fnuKfHyAdnd/gG90c3pvhX2BgIl+fGFcfo+Shn+EhHJ6gIZ6j5GHkZGbkqSbk4F9gXyNipKjiY2KjZaajIWQl5KVjYiIjJKdk4+MjW6EkI+RiZ6ZoqGYl4qXk3CLm4ZniZuQlXuKhZCKcJaalKGRkYiKmIyCf5KffpOQlI2akHyLhoh0c3VrcW92fYx1b4aRjpNydIB8goKJfWVybnp/m5V+hYp1koyCdYp7cIJ/god9ho2LhY6Wqo57iH1+ioR2fG5sfYKAYWZ3c3RuemFeb2BrdF5want5eWxycGV5Xm5sc21zWFpdX2FpWk9WV2RiZ3Bxf4dlXWloZ2JncY1uY2hoZWlngHp3dW+OhXOBgYN8dYKJhXiFfHiEhnqAiXd/i3t6cnmDamtfcGh0f2txbm1xZ29rZXtibn96d3Brd3eJf6OZo6ihp5uIjIqBj52Gkpp0f6iTkY2GoIyVk5CAc3x2hXh5gHJze4Vrcm95bYl2f4CGbnFbWX6SjYiAgYF2dYF/f6CGj4qRnJegk5Z3iX6AjIicnYqPhpKXloWIlJiOlouKjY6MnYqOkYRtiYuPkYqclqGcmZaGmYlsh6WFZ4ifjJOAjYSMgXiTmJKdkZCIiZSNf36QmX2SjpGOm5N9i4GEcHZwbG5vcXyHanODj5iKcXiAdYKJg3pndHB3gpuQfYqFe5WTe3iKdXKLfIeOe4uHhYqPnKWJfIR2gYl+d3dsaH1/fltxcnFvb3ZZXm9gcGpeb2p8enFubWptd2Bwb2txbVlYYGFhbFdQUlllZWJ1b4SBYV1rbWRjZWuSbWBmZl9naoF1cnJvi4B0f4KAeXaAi4B5hX53h4Z2g4V7h4t/e3aKf2pxYnxihXxvcGx1amhubHZ3X3F+eXtzdXN/gn6llputn6eXhYyDfpaVg46ddImek5KGipqMlY6MenJ4dIJwcoV0cXWIbG5sdGyHdoN9f21uVVGBq5SHgniAdnKDeYKggpCBk5KYm5GZd5F6goySpJqTjoiUmJKEhZaYi5OLiY6Ph52EkYt9couFiI+InJmfm5eVgZWAaoifiWiIoomUhZKEinGDkZePmo2PjIuOjXd7k5F7j4yOk5iNfIl9gWx3am9rbG17gGJ6fo+XgXd6gXiDjX16aHVtdomXjICJh3yVkXJ7hnF4jnuLjnuJf4SOkZ+fhn18d4GKfHZvZ2l+f3Zddm5ta3ByVV1uYnJhX21ueXBocGZnc3VocGxhd2VdVWVgYHBTUE5bZWRdeG+Ie15caHFiYmVlkWlfaGVbZ29+b2txc4p9dn2FgHV2f4x5e4aAeIeDc4aFfoyMhHx5lXhncmqDYId+b29re2BpbXR/dF90fHiGd3NzhXx5oZCasZymj4OKf4KZiX+KnH6KmJKOhIiXjo6OhHd0d3OAcHCFc3Bxg29qaXVtgm59fG11c1JOgt/JktaTfHB0g3WDn4KRdpSQmJuQmXuTcoWQn6GTk5CJkpuThX2VlYeMjYeSjYicf46BeHuMf4iMipycnJuWlHqOeGmLlIpuiqWGlImYhIZjjJGYjZSJlouMiYtwepWKfI6Ji5OSinqGfX9tfGVzcGtte3pcgXqQj4F7fn+Aho97eml1a3SMkIqDh4Z+l4xtf4Bwgo6Ajol+hXuEkZabnIx9d3iCjndya2RufIBpZ3NuZ2hzbFNdb2RwWl9scXdna2tiZ3hzcHBkYHhgYVVrX150T01KX2ZiXHhwiXRcW2V1YGFkZI5jYGZiWGlzdG5scXaLfHR5hoJ2d36Lc3+Gf3qJf3GJh4GQioh8fpl2ZXNufWWHf25wa4BZa255enJgdnp7jXZydop2ep+MnK+boJGDhXiIlX57iJyGhJ6QjoWMl4STjoeBdXdweXFvhG9tbn5yY2R3cHxuenxqaGxipJrB3K7vonNsdYN1hKGEkW6Vj5SflJuAkXCFi6OXiY6VipCdlYOAlI+FiI+AkoqKl36He3Z/iXiGhY6cmpeZj5B2i3hwiYuOf42mhpOLnoaGXouUl4mOiI2KioSJbHyXg36JhoqRkIZ2hn5+bH1keHVqb3p0WIh7koeGen9/gIaNf3pmdGqBi5CLhISBjZiGbYN3b4mTg5KGf4R7gpKXlJqRdXR4h4t0cnBkcnZ/X3Jsb2FodGZSYHBna1VebnN5YXJjYGl+cXJuW2NyYWNWblpcd0xMS2NmYV12coltW1xkeF5gZGaEX2NjXlhpcmtua3J3i31zd4SBeHh8iXGDhHx9iHt0i4iHlYWMf3+Yc2h1cnlti3tudHCAV3B6dnlxZHZ5hoxodoCJcYCdiJmonKOThX1xjJN4eImcg4SfjI58lo2AmoiEfHN3cHNqb4Fsam18dF5gd3Z7cHR6Z2BlfOvatcnD3IlzbHSAdoqaiIxpl4+OnJWSgYhwhYigjoWLlYqMl5N8jZKHgoiPepGLho+CgHd4g4Ryh4KTm5aTmIaNdoiAcoeEjImcpIWWjqCEimGDlY+FiIWIjIaAh2h9lIB+g4WKjo+Ccod/gHJ3aHZyaXR4bVqNfZODhn2Ag4GEi4N2YnVtioKRjISAgJOSfm+DbXqIkYiUhX2Cf4KTlJKYiW5xeYuEdGpvaW92fl1yaG1caXRfUWRxaGZTX3F2dGBwYF1og3FzalhnaWNpV21XW3RMSktlZl5hcnOFaVtcZXleXmRnemBkX11Za25lbmp0d4p+c3KBf3t2eohzhYN8f4d2doqFj5iBjYJ7k3Zsd3Z5eJN1bnd6fVh5hXGAbmd4dpGCZHaGhXGKloaaoZuhioZzb5KLcXaNmnyJmYiJfJ9/hJl/gnlydG5vZHJ+aWZsd3dbX3h7enFxf2lhZ2F/1baOkaZ4bnF3e3GSkIyGapiNiJqQi4V6aIeLmYaBkpCGhpeNe4yMgICJjXuQjX6JhXp1e4N8cYaAlZmOkpSCiXaEiHiGg42VoKGIl5GhgIlhf5SHhIeDiIx/f4JmfZGAf4CDjI+Qfm2DfYN1bG13dXR3dmtjjoKPgIV/fISAhYl/cGB0coZ9kI6DfX+SinpyhWd7hYyIjYV8hYCBlZCRk4Vub3iLfnRsbWhpd3pgZ2lpWGt0WVJocmliUGJyeG1iZV5aaoRudGJcaGBlbV9vVFpuTUdOZmRcZm5xgGtaW2NzX1xja3ZkZV1dWmxsYmxqc3aGgHFvf3x9dHiGeIWDfICHdXiJgZKVe4mGdomBb3h5e4STb217gHZeg390gWxoenOUc2dzh3xykpKEmp+bn4aHdXWTfm11kpZ9h5CDio2afIyadn52cW9samF0fGdiaXV5WmB3e3ltcX5lZGhoV52PX3Jzl7zEhHZxlIiPfXGWi4abkouHcmqIj5aAe5WLgYSajHyKhXx7iYt/lIh1iYZ2d36BcnWGgZ6UhZSPhINygYp3hn6Mm5+aiJWPnoGJZn6Tgn+FgoiJcYF9Zn6MfHl/gIiMj31pgX6EdmdweXhzd3Rsa46Gi4KKgHmCgYWEgWxfc3l7fo6Lh3yCkIF/c4JqeoWJjYeFeYV+gpmOkY1+bm16iHx1c21lZXtzYVtwYlducVNTbXJoYU5ndXhmYF5dWW+Bb3NaZWJeam5gcE9ZalFEU2ZgWmpubXxuWVtdbWNaYnB2Y2ZcXWBraWNsanN2gYNwbX58f3R1g3qDgnyBhXZ+iIGWkHiEinSBiHJ5eX6NkG9ve4BxaYF4en5tbHt1lWtqeIR0a5ONhp+ZoJmEh259i3Vpd5eOfoGKgpSXinmPlW96dHFsamRgc3poYGVxelpgcnx5Z3F5YWVlj7Gyd0tiWqXZ0JZxe5CKj3d9k4qEmJCLhW5rhZKSenmShoGEmIp8hn93d4mKhJaAcIuIcXV+e2p5hYOlkISTjYR/cICEeIZ7iJ6blo2VkpaFiHB7k4J9goKIgm2Ad2iAhXlygIGDioh8ZX5/hHZkcXOAaXlxcHWZjoaDi313eYGFeoNrXHJ/c4KJh4p+h4p7iXOCb3KFiJCGhnOFe4KajY6FeW5ufYN+dXljZWh7bl5YdlpXcGtOV3FyZmBLbHd0YV5cW1p1fnNwWGdeZ2tyYG9OV2dSP1hmXlpva2d5cVtaWGtlWWNweV5nXF5lbGdma2lxd3+Ib2x/foB1b4J7f4J/gn92gYSJl4lxgo1xe4Z8enmEk4x1anl+a29+dH98b3J7epNvboF+eGeSi4OhmZyRgoVnhoNvZ3mViH1+hIKYioF8jo1peHNra2ZfYW95bV9ib3hcZGuCeWFxdl9lZdTqvYsyOj6Ljn9xeIWHjY11gpaMfpKNi35ta4SMjHV8j3+FgZSIfIJ3bnaHhIOXd2+IhWx1e3VmeYKDpouCj4uEfm6BdniFfImfko6Sk5SOjId/e5KGd36DjIJqf3JogH55bnx8gouEd2J6hYJyZHJpfm52cnWCnIyBgIWAdHZ+gHOCb1xugHV5i4SLfIiBfol5e3JtioWRhYxzg3qAl4yLgHVtanaAf3RzW2dndW5XVntSWW9kTFpycmVbSXF4b1xbW1lddX50aFliW2hmb2RqTVdlUD1dZVxddWVgdW9aWVRuY1ljcXlaaF1gZ21naWtpcHd9jm1pgoR/eW6AfH2Bf4F6dYKAjZOEcIGLbnd+gHt7iJKJf2h6fWpze3KFenN2fX6MeXiEfXxrjI2Em56WjIGAbI19a2h+jYt6fX6Dk4J+fYqIa3ZxZ2hiW2Jnc29fYWtzYGhwiHlic3ReY2SboI9uXDVar7V0aYCIfJGGdYWVhXOOiol2b2yEgoZ0eYl4iXySh3l+cmd2iX5+mG9xh39pdnluZnmHhKSGgIeNin5vgHeCg3+Pm4mElpOZioyFiXyQiHB6fYR7aH5saoB7emp7d4KIgXJgd4F+cmRyZ3aDbnV8hpaSgn2CgW93enx1f21ZcYF3dY2Dh3iIdoSJe3l0b4uCkYKGc4B+f5SJinxvbmltgYF0bVtlZHFvUFp6TVtuW09bcm9kVUtzeGlXWVpaYXGAdGBdXWBnZGlpZk5ZZ01AYGNbYHVgXXVsWFdTdGBaZG9yV2peYmhqZ21saHB3fJNsaISKfX1wfn57gYCBend/f4qLg3F8h29xd4N/e4mMj4NpfXttd3h2inZ8eH+Chn+Dfn16bYWMiJmjjYSDe3WLeGtshIeQeH16gpGAgH6Lg3BycWNmXllmX29vX2BncGZqboh0YXRvW2FkanZ7gL+cpqTIuHGEgnKSe3eFkoJzkIuHcnJvg3uDdHSHdIh3k4h5eXBjd4d6gJNpcoR2Z3d1Y2p8goedgYB/jo9+c4B1h3uClJKFepiPlpCIgol7iYlreHl+dGd6aGt/eXRpeneAg31oYHiIfWtrdGh8gWp2goyRlX97fn9xfHZ8dH9iVnh+c3SLhYN9hHGHinh5cXGFhI6Af3p/fnaPhoR3anFpbIeBcW9cZmBxbElkdUtdbFRTWXJuYlFPdHhhUlhYXWFwgnNbYVxpZWVka2RQW3BJQ2NgW2NvXV13aFVXVnZdW2VuaFZrXmFqZ2VubmhwdnqTbWmIjXl9cnt+eYKBgXx2fYOIhoNwd4RybXeCgn6Ji5N/cIB7d3h6gIx0gnh+gYGChHmAdW9+ioubnoh9hXp3hXtodIWLkHl+f3uIhoR2j4BncG5fZFxYZVltcmFgYHBsa2iIbmF0aVlfZG6Ad6naqceGh7JxiHdvjHR6hY1/eZKJf3RzdH13f29xf22FdJOFeHRrYHqCeYmPZnKEcGd1blttfYCQk3+AeJGTfnl8bop4g5OOhnaYjJOQiIaGfH+FbHR1fmxndmRte3Ztand3f398YWJ4hnppdXVjfnxodYePjZZ8dYF3cYB7fW6AWld1f3B2hYh/gXptiYZ0emx2goSFf3x+en10jIJ+dGh0ZW6Kg2xzWmhdc2RHbW1LWmBXVlV3bWJQUnR2WFBWWF5hcoRvXGBjbWVkXm9jVFxxRkJlXl1lZ11be2JRVlx0W1pna2BWal9gb2Zma3FocHZ4jnRrjo12f3Z4fneBhIF7dH2DiIeDb3KAdHF1foWCiY2KenZ/eIN7fIWHd4d8fYF+hIB7fnJ1eYyNoIyJeYl2dIN4Xn2Fl4t4hoNzhYaEd4l6Ym5tXGJbW2FWaXNjYFtnbnBmh3FhcWZXXWNrf3zKzoe5oWptbYpscYNxe4OJfnqQhHl4c3h1dHtqbHZjhHWRgnZvZl99gnqLimVygmtqcWNYbHqFm4iCgXOXlHh/fW+Kc4SMjol0mZCSiYaLg3t5fXFwb3xmaHFibXhxamxxeH19el1leoB4anZ4ZoN3aHWJjI6VfXKIam9+gXlvfV1Zc39udYGMfIJvcIqAcXdpeIGCgYJ4fnN8dYd9e3Nnc2Fui4BrcVdpXHZbR21qTFZVXVNVe2thT1R1clBRVFdeY3SFaV1gbGpmY1pvYVhib0dBZ1xgZV1cVnteTlVlcFlbamhdV2dgXnJlamhyaHBzd4Z4bpWLdH96eH55g4h/dXJ/hoWOgnBwe3h3dnmGhoeMhnl7f3SLfX2GhIOHfn5+fYd/fHh1eHiRk59/jHyKbXWAeGSDhpWFc5GKb4WFgXqDdGRuallfW1xdVGdyZGBZZHFyZ4ByYmtlV1tgan94vq57n7duYXOFaHN6cXiBhHp9i353d3J2b3t2ZWpvYYd1joBzamJefnh5i4RmcX9oa2taVm93iKKAhH9xmZNygXp2hG+DhJSKdZeKjomFiYV9eHRxbmh4X2psYG12amdqbHl3enZaZ318eWZzfm2FdWV1h42GloBwjGdre4R1bnViXXF9bHV9jHyCZ3aHfm5xaXaAeX+AdH5te3yCe3lxZmxibol9bGxVaV92VUppak5RTmdMWHtoYU5VdWtMUVRVX2d2g2ZeYHFoZ2JXal1ca2dKRGpZYmNWWVV5WU1WbWpZXWtkXFllY150ZW1kcWdycHWBeHGZhnZ/fnd/fIWHfXVzgoiAlYJuc3l7enNzhYeJiYN4gX11j358hIqNg4GEe36Lg3t2e3d3mp2YeomChml2fHtsg4OSf3KOgXCFgn+Cf3BnbGdYXVtcW1NkcGReV2JydWp1b2VlY1dcW2h/cG9ygHOJZGR5fWlzdXNygYN3gIN4dnJ1bWp6cWFna2eGc42DbWZdX31we4l/aW14Z2pkVVdyb4ymfIR7dpaRdH10fnxvfn2TiHibfYmHhIeDfXVwcWxndFxsZ15sdGRnZWl6b3tyWWiBd3VocIF4gndid4aLfJWBb4xqbXuCcWd0ZmFuemhzeIt8f2N3hHdqbHJ1fHJ7e3R/aIB/gHl3b2RmYm2Fe2xqVWhhb1JKaGpPS05vR116ZmFNVXRkSk9TV2Frd35mXWdzaWZgVmRXYnBcS0tqV2NhVVRVc1ZMWHVkWV5rYFtaY2VfdmdtYnBpdG9yfnR0mYJ3f4B4gH+GhHp9dYKEf5eFbnJ0fHp1cYSFj4GAeot1c5B/fIGVjYCFhH19jIZ6fYB3e6OlinmIhYRrdHt6dYKAi3puhHN5hH2Cg3ZvamllVl1bWlpTYm5kW1hhc3tqaG1pYGJYX1ppf2lrb4BnbGBoeXhqcnNzbYOAen98dXRtemhqeWpfZW5ogXaPhGdlWGJ3an6He29qcGdmXVRYb2eNp3aAenyQjnp2cYBxdXh7kYF6l3aHg4CGiHZqcnVnZ25bbGRdbXJfZ2FqeGh7bFtug3N0anCBfnp4YXeGhXmRhXSJcnB6gXNkcmldcXhlcnSJfHljdIBxZ2p5dXNteXh2eWWFfH95d3FkZGNte3xqalRnYWVTSmtnT0dRakVgd2ZhTVNyXUpNVVplbHh8Zl9ucWlkXVZhVW5uVkpTZ1dlXVhNVWtUSlt5X1tfa11dWmJlYHlobGFvb3ZucHd1eph+d3+BeYCAh4Z6eXqDfoGTg3F0dH56dnSFiJF9gHyQa3KVgHuCn4V+h32AfoaCgIp7d4Srnn96h4eDa3KBeXWAfoB0boZufIBzioBqcG5kZFhfWllaVGJqZ1taX3WCaV5tbFxhV1xca4FlcnR9aWlca3Z1Z3N2cWyEe318eHVybHlnaXhmXWRzaHp3koFjY1RlcGiChXh4Z2lqYVdWWWdjjqdvfneAi457cXJ/aXtxfI59eJBzhX6AgIZuZHVyZGdnXGphXW9vXGdfbXRlemhddIBvcmtxfH51dmJ0hox7iYiBgXlzdYB2YnFuW3J0Y3FzhXx1ZXOAbWFte3Branx6dnRnh3Z7enZxZWJkbXJ9aWtTZ11cVEtxYlBGVWBHYnZmYUtTb1hKTVhYaGt2e2VlbnFmZFpXXlh3ZVRKXGJXZ1dZSFdkUEhieFpdX2xaXlxhY15+aWpgb3R4bXBudoOXenKAgHx/iYyGfXV1hniHjHxzdXWBeXp6goyOfX6EiWlzloF6ip1+foV6gXp/fIaJc3GPrYx7e4aPfWRxh3lzfHp1cm+GbHt+bI96Y3BvYmVdZVZZWVdjZmtfXV1zhWhYcW5bXlhaXGx7YnB3dWxhWWxzc2d0dW9sg3h+f3h2bW50ZGh0ZVtndWZ2dpF6X11SZmZrg4J0fmJkalxUV11iY46kaXhzg4aReW5xfGp6b32HfXaKdIJ5fXmAaWR2bGBmX15pX110a1llXW9vYnplXHd8a25ucHh5dHVlc4STgIiDiXt3cHN/dGN4ZVxxcWJxcoJ9dGdygGVfbndqZWh6fXVvcIN2dH10cmJfZm1ufGRoU2dXWFNNdl9QSllXSGJ0Y2FJVG1TSk1aV2pscnxjbW1zY2JaWlthd1xTS2NdV2hTVkZYYE1HaXVYXmBsW1tfYmJchGloYW54eW1vanaBkHltg36AgZOIhIF2dIl0jIZ0cXZ2gXh9fX6MkIB+k35wd5WDfJiSeYCAeHp+gHSIhHRxmaF6en+JlHdjdYd4c3d0a3Rufmt4fHCRc15wbmBnYmxUWlpXaGNtZltccYllU3JuW1pYV2BsdmNpdWppXlltc3Brc3NzaYR8fn56dm5ubGRpcWNbanJkdHaOc1tXU2VhcoB/coJdYmNdU1pgXGORn2VxcYWEknVsbHtvcHJ8fn1zgniBdHt6e2RldWddYllgZ1tedmhXYl1waGF3YVt8dmlqcm94dHN1aXGCloSHf4V3dGtxfm9neFhdbG5jcnSBenRncH5cYHByYmBrc39tbnZ/c3F4a3FhXGVsbHpgZlJlU1ZRT3VbUU9YUUhjc2FgR1ZqUElQWlZra2t9Zm5vcWJbWlhZbHFXUlBmVlZoU1RFWVtOSHJ1WF9jbGJYYGBhXYtqY2RtenhscGl1eYd7a4N9f4SafIOEeXyHbY+Hcm52enx0goJ8i4+Dgpd0eIGThYGeiXWBgIF0f4JxiIN2cKGWc3qGi4Z6ZXeKbm16bmZ4cHprc3ZzjWtedW5hZ2VrUl1bVWdhbGtaXHGMZE9vbl1WWFVnaXNoYnRlZFxYbXRsb3V0eGqGfH97h3aPc2Nka25hXG5tY3N4h2taVFZjZHh9fXGGXWRfY1RaX1lilZVjbXCDhYp0a2l8cGd1eHV9bXt1dnB7f3ZfZnJjW11WYWNYYXVlVV9gbWRhcV1dfnBoaXRxdHF1d2tthZSCiX2HcnNncH9ydHBUXGdrZnJ1gXd0Y212VmNybFtfcGd+Zm54fnN0c2tuYVpkaWp3XmVTY1RVUFNsVlBWUlBHZHJfYUZYaU5JWFRXbmllfWlseGtiV11VW3RkU1JXaFFYZlRTR1lZT014dltfZWtpWWFgXl6ObmJma3l1bm9pdnaAf2yDgH2HmHuAh4GJfmuTiHJmdIB7dYCDfYmPf4uTcnyKkYWHn4Z7f4aMc4GGc36Cdm6ki3KAjYt2d2x6jGBke3BmeXN4bG1xd4NnZHxtY2ZnaFNfXlVnX2xuW15ujWhOaW1gVFZTb2dza2V4ZGRcWG9zbHF6d3Jsh3t/dpt6eWthZWxtXmBvamVweH5nWlZYYGx4fHtwhF9jX2dWWF9XY5uIYmtwgYd9eGxsem5deHNufGt2dG9wfIFzWGpuXlhcVWFiV2RwY1NeYmlhYmxaYX5sZmx0dm9td3dsaYaNgIp7iW5yZnJ+bnRuZFthaWlwdIF0c15pbVNlcWVWY29kfGRzeH13bHBta2BZYWZndFxkVWBVUk5XZFJPW05PSGRvXGJHWWlNSl9LWW1kYHlpbn5kYFVfVF11XFNSYGZOXGBVUklbWFBZdHVdX2VraFhiYVtejXFjZ2p4cXNuaHZ0e4RygoN6iI5+fImHjXlukIl0a3OBdH9/iIWHkYSVj3l9jI6HkZuEgHyMhXN/gXN0eHJvk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY6Ojo6OjYyMjIyMjI2Ojo6Njo6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6Ojo6Ojo6Ojo6NjIyMjIyMjY6Ojo6OjY6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmhcQ0RERERBUsza2NjY2N1tPURERERFOC4vLy8vK0iFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fYVI0NTU1NTJG2Orn5+fn7WcuNTU1NTcnHB0dHR0YOoOBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJiYmZmSj5CQkJCQjIeHh4eHh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJiIWFhYWFhYaTlJSVlZSVioWFhYWFhYSDg4OCgoKEioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95enp7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkI+QkJCLjpGRiYeOipCSkpOPjo2NjoePkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6NjY6Ojo6OjYuLi4uLjIuNjo6Ojo6Ojo6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCQkIeIh4eLhomQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJCNhIiGho6FjI+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkYmDhYaHjImJj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMjomGhoaIhomPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2Qjo2LioyJjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj46Pjo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4CBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9/f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX5+fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn19f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn9/f4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn19f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWFhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn1+f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYWFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4fHt7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9+f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dXR2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2loZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e31+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fX59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTk7OzpAOzs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnd5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ojs4OTo4Nzo8OTc4Ozs+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1c3FzeHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08OTc5Ojo5ODg6Ojc4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Oz08Pj89PD07Ojw9PT08PDw8Ozs6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV1dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDQ0A+PD0/QD8/PTs+PT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl6e3t9fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VEPz07PEA+Ojs6Ojk3Ojw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fX1+f35+fX5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUA9PD07Pj06Ojo8Ojg5ODg6Oz1APzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkVISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAPz4/QD0/Pz48PkA/PT09Pz09PkNEPzs8PT5APT0/QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDREE/QEBAPz1APjw9Pz9AQEBDQEA/QEA+PTw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JCQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEFAPjs+PD89PDo+PT9CQkVAPz9OYV9KQENFSUlJSUxNS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVGRkZKTk1LSklHR0hLTEpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8e3t8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBERUQ/PEFDREI/PkE/QURERENXdYaJin5YR0hKTExOT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm9wcXJ2dnl7e3t6fX1+fn19fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpISUdISElHRkJERkREQ0FVdIeJh4eGiIJXSUxNTE1NTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTEtKS01KS0hIRkZHRkVQbISHhoaGh4eIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz8/REZIREVHSUtJSUdISUdJSUlKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N0dnh5e3t7fHx9fn59fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tLS0tLTUxLTUxJRkpWbIGGhYSEhoaGh4iGinVJSUZCPz9APz8+PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkVEQkNGSElISEhMTUtHSUpNTU5NSkpLS0pMTVNsb3J0c3N3eXp7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf3+AflFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVIR0lIS0xPTk5RTlFecoGFg4SFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QTs5OTk9PT47Oz1BQ0VISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5/fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BCRkhLSExLTlRne4SEg4KDhIaJiouLi4qJiouMiVQ7ODY1Njc2NjY0Njc2MzQ2ODo4NzY1NjU2Nzc3Nzg6Nzc3ODo7NzY4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BPUlRlcHFzdHR3eXt8e3x9fn9+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9OjxEQkRGQ0NWeISEgoKDgoWJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc3OTk3NjY3NjU6Ojs6Ojw4OTg5OTg3Nzo6Ojg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT1BRV2tycnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3OkE5PEdSYHyEg4OEhISGiYqKiIeIiImKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozw9Oj48Ojw7PDs8PDo6PDg6Ojs7OTk5PD88PUFCRElKTUtKS0xXb3J0dXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk5OTk6Pj0+T3eBgoOEhIWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVCQUFCPkBDQUA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEFAPz9BPD48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUJBR0pOT0xJR0s6ODo7OTo6Ozw6Ojo8Oz0+QD5OfYKDhIOFhIaJiYiHhoaGh4iJiouLioqKi4qLXj5ER0lLSkpGR0dERkhHRUNBQENFQ0JAQkNCP0BESEVDRURFRUFGRUZERkZEQEI+PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6e319fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj06PDo9PT4+Oz48Pz5CP0x+g4SFhoaGiImIiIeGhoaHiYqKi4yNjIyLioqHV0dMTE1LTklJS0hJSkpJRkRERkdGRENFRkRCSElLR0hHRkdHRUtKTElLS0pDRkNDREJBQUNCRENDRERDQT08PkBocHN0dHZ3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTc7Pjs8Oj0/Pj88Pz5CQUQ+Z4OChYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlKSEtHRUdISElFRUhGRkVMTE1JSkdHSElKTk1PTUxOS0hGR0dFRUNGRkZGREVISEZDQT9ATG1wdHV2eHl5eXx8fH19fn5/f359fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw6Ozw6PT88PT0/QENCSFN+g4SEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMTExKSUhGSkpFSkhHS0pISkdHR0tMTkxMSEhJSk1QTk9OTE9LSUdJSkhJRElISEZGR0dJR0NCQUNVb3F1dnh6e3h4enp8fH1+fn9/fn59fn1+fn5+f39+gH9/f39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6Ozc8PTo8Pzw8PT9CQ0NMbYSDhISFhYaHiIiIiIiHhoiIiIiIiYyMi4yMi4uLi4teUlJQTU5NS0pHRkNISkdMSkdLT0xLSkpMTUxPUE5ISUtMT1FQUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkBCQlxwcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgICAfn9/VUVDRUVHR0VEOz9BOz08OD89PT5ARUQ9QkRDRkp0hoODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKRUZGS09OT1dWUVBPUVNSTVNUT01TTFBTVVdSU1JQTEtNTU1LTkdHSkZGSUpEREVFQkRDY3F1eXl6enp7ent6e3x+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz08QT9BQURUS0JISUZJS3iGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOztRU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLR0hKSEVGSUlJSElqc3Z5eXp5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0dGRT8/QUBFQUNGRENES1ZQSk9PTlBReYaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A/QFZVWVxkYFZZYnJeXVZdWlZFUVlaXFlfVFlnUlVWWFRUVlNPT01LTEpJSUxNS09NU290dnh5eHd5enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH5/fn5+VkpKSUhHRkREQkE/SExJTVBLSUpPU1FQVFZVV1V2hYSFhYWFhoeIh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JXVlRaWnWDWVV9kGFcWF1eV0lWXl5bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHl4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktKSUlGQkRAQTpPUVFXWFBQUFFSU1JWV1dYWG2BgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaWlhcaGJHT1ppZ11bXF1dV1NOU1BQUVZWVlZZWm9zdXd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpaUlNRT1FSUVVSVVNWX3V4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlVTVF5aWFdXV3prWFpcXF5TUFBQSU5PV1ZYW1pkcXR2dnR0dnh5eXt7fHx9fX5/fX59fn19fn9/f3+AgH9/gH5+enh3dnN1e39/gIB0a35+a3F5XltWVVNST0tGQ0RBTV6DbFZSU09PUU9RVlFTUlJUY2R2gIOCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUVFOS1JVUk1PWVFNTlFTVVVNUVNSUE5MTEhDSUdSU1RaXW1ydnZ1dHR3e3p6e3t9e319fX59fX1+fX5/f39/f4B/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRgZF1eW1lVUUxJTElhbJJ0UFFTTVFSUFNbUlNSUVJVVWJze3x+gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5CQkNDQT9EUENDQEM+QkhHVkBJTk1HXWlRSEZPRkRFRkhHSEJDSEdISkdEQkFDQE5QTVJkdHV2dXN0dnl8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZoZWViXFhTUVBVUnNXZVtPT05MUVJQVVlTVVFRVFJPVmBrbHN2ent4eXRybnN0c3l4fn6DgIODgoGCgIKBgWtMRz4+Ojo+QD8+Pj5qUEthRUZISUVCP0hNTUdNUVVKQkU/Pjw9PD09Pz0/QUNCPz88PUI+SU1GVW91dXZ0dHZ4enx6fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKT1BOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxuamhgbnJpbWxxdXt6fXt4enx8eHd4ZEJAQEE8OkJDQUFDQVtcT3tOT09OS0xNT09QTEtMV05IR0FBPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV2dnV2d3l8fHx9fHx8fX59fH19fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT09eXFpJR09RUU9NUFFOUVJTVlhTUllUTllaW1dZXF9eX2VfXV5xd2teYGdrd29vbGpvbm5sZmJZR0ZGSEJBRkhFRUZDTFFPYVdSWFFQU1NSVVtPT1FXUE1KREY+Ojk2NTg3OTc5OjM2NTc5NTxCPWZ0dXd4d3p5e319fHx7fH19fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LU1RTUFFVT0xSU1RXWFNUWFFMWFlZVlhYVlhZXVdYWGhza11WYHRrYWFfXWRgX15ZVVBNT01MSUdKS0lIRkNQT1NaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1OTlHbnJ1eXl6e3t9fX19fHt9fH1+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BXVlZTVFZPT1VWV1hZU1VUTEtTVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5NTUxKRlBQVVlTVE9KTk9VU1RcVlJVU1NPTUxJSEhGPz49Ojc4NzY1OTk2NzU2NVdxcXR4enp7fH19fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1RTVlRSWFdZWVlSVU9JR09QT09NUkpPUE9PTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFBPTk5NUE5UUlBSTElMS09SUFFSU1RRU09MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVlFTRkZBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPTNAPmpvYVJSUUBHVFFPUFBRTlFPUE9MSkxMT1BOTVBRUU5QT0pMTU1LR0VFQ0I7PT08OT1HNjY3NkRucXV3ent7fHx9fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVVlZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JCOERNU11nU1FTQUdVUE9RUVBNTU5MSkxLTE5PT1FMTk5NSU1MSUtLTEtHRkZFRDxBQT47QEU7PDg5VHJzdXl7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E+PT1AQEI9PkVIRkRGRklHSkpARkFBQEVHRElPSFFSYVxRUFJPU05PT0xMT01LTUxNT05bVktNUU9ISkhDSUpMTEtGRkZFP0JDPj1CRz9CP0BkcnV3e3p7e3x7enp3fHd5fX57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj87PkFAQD5BRElFQ0hHSUdJRUJCPz48QkFAR0pFTU9iZVBNT01XS0xOS0tNTUxMS05OU2RNSkxSSUlJRUJJSkxNTkpHSUZCQkJAP0VGRUhETG9wdnp5eXp7enx6d3R4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xMSU1QTVBPSEtFP0I9OTk5Oj9CPzxBQkFBRERHS0ZESUlHR0hDQz9CPj8/QD5DRURMTVFUTEpJTVRGSUlKTElKS0lKTE1PUFFQS0dDS0dDQ0tKTE5PTklKSUdDQ0NESUpNTElac254eXh6ent5fHZycHVydHl5dnhqcW5qbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZXFISkNGR0hHSktJSkxER0I8Pj06Ojo7QUI/PUJCQ0NIRUpMSkVJSUZHSENDO0FAQj5AP0JERElNT0dISkdIS0RISUtNSEpMSElKTEpNXVJISUROR0JFTEtOTlFOS01KS0ZHR0pNTlJOTWNuand2d3t5e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhlcEZKQ0ZFRkRFRUZFR0NDQD08PTo7OjtBREA/QkNFRUlGSkpMRklJR0ZGREI6QUNDPj9DQ0NER0tOSEpOSERIRUlMTk1ISUxHRkZJSUxOS0lIRU9JQ0dOTVBOUE5OT01LSUhJT1NRUk5TZ2dmcm9zeHZ7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZl9wR0pDRUVEQkJBRUBEQj4/Pjs7Oz07PT9EQj9BQ0ZHS0dKSUxIR0dHRkVDPz1ERUI+QUNCQ0VHSElHTVBJRkZHS05PS0ZISUZFQ0RJSUhLSUdIUEtESk1NUU5PTk9QTkpKSU1SVVVSUFhlYWFtZnByb3J5emdlaGhjaWxmcWxmbG1naWtsc21wdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VERkJBQEFEPEJBPkE9Ojo9Pzs+P0FCP0BCRUdKRklHSUdGRkZEQ0JBQUVGQ0JCQkRFRUdHSEZMUExJT0pKTEtJRkhFRkVDQ0hISEtKR0tSTUNPT05RT09PTk9PS0tLUFVXVlZUWWBfXWlgbWluaHJzYmVmZmRoaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXV2dnZ3dnd2dnR3dWtzdW51dHNwcmtrc01HR0VHQUFAQ0Q8QUFAQzw4Oj0+Oj89QEJAQEBERkhFSEZGSEZFRURDRUJESUZDR0VBRUdFRkZHRUpNS0hRTUpLSEhJRUZISEVDSUlKS01LUFNORFJTUVFSTk9NT1BNTE5TV1ZXWVZYXlpdZGBoY2ppZ2tfZGVmY2hnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hBQUJFRTxAQ0JEPDc6PT47PjtBQj4/P0NFRkRGRERHRUNFQ0RGRkZKRUVJR0JHSEZHRkVDRkpKR01LTEtISktGSUhKSERLS0xMTk9SVE9IVFVUUVRQUU1OUU5NUVdaVlpZV1peWlhhYGBgXmhlY2BkZWdnamhoamdobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9zc3lNSEhHSUNBQ0dFPEBFQkQ8ODo+Pj48PEJCPUA+QUJGQ0VDQ0dEQ0RERkdHR0lGSEpIQ0lIR0lHRkRIS0lGS0hNS0pLS0hLSk1LSU5MTk5PUlVWT0xWVlRRVFJSTE9RUE9UWVpZXFpaXF9fXV9jXlxiZGxjYGRnaHKFaGdqZmpubnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtJS0hKRUJER0U9QUdEREA5PD5APz4/Q0I8QD5BQUdDRURDSERFREZGSEhGSEdJS0pFSkhISkhGRkxISEhKR0xMTExMSU1KTU5NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW11eYGBhYGJmXWRgZmhgZWhqZHNzZmpoZmxwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd3B3SUpMSUtHQkVERTxBRkREQjs/P0FAQEBEQUBCPkFDSEJFREZHRUhFRkVJSEZJSEpMSEhKSklLSkZKS0hJSkpHS0tNTElJTEtNTk5PTE9QUlVXVk1OVFZVU1JRUE1OVFNSV1teXl9dXmBgYWFiYGNkZWFkaWNkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV1c3Bzd3R1dXd2dXV0ZXFza3BxanJ2cHdKTEtLTEdDQ0FFPD9FRUVDPUFBQ0JCQ0VBQ0RBQUVHQ0hGSEZFSUZDR0pHR0pGSUxISUpNS01MR0tJSEtLTlFLUlFMU01KTU1OUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5hY15gZmNhYmduaWNpaGhteHZtaGlub3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnNxcXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0RBQEQ+PURFRkM/Q0FFRERGQ0JFR0NDSUZCSEpJR0hKRkRLSkdISklJS0dKSk5LTkxJTEhKTUtaZkpkXEtsUkdOTV9uVWxzW3FwYndjUlBidnVodWNhdmFYbnFiZHZpbnpmXGx1YGxrVmB3dWhqaGhmZ2xtam1vam1vc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cnFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj88REVGRENDQ0VFREZCRUZHRERLRUVKTEtJS0xHR05JSEpLR0tKSUpKTkxNTUxMSU1MTFtzYmRwXmxsVUxOZXJdZ2VxbG50Z3BpX2FZbm1icHBia2pqZ29xdGV0bm5ccHZncE5Mcnl2a2Fha2VlbHhta3Zsbm9zcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0FBPz1CRUZCRkNFREVFRENISEdEREtIR0tNTUpMTEZKT0hKS0pJTEpKSUpNTU5NTU1LTk1NW3Jwb25wcGxrTU9QbVhOaWJ0cnBhbW92XFlsUFttbVpxbWtvbXh4dHNpcF1gc2xxalV1eXhvY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0dFRUVCQUI9Pz9FR0JHREhFRURCRklISEVHS0pHTUxOSkxNR0xOSU1LSEpNSUpJSkpOT05OTUxOTUxcaGR1XWxxV2xNT1FuVVprXmtsdmFsZHRUZWNObFlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdoYWNpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSUVFRENBQjxCQEJGQ0dGS0dFQ0NIS0hIRklMS0ZNS0tSUkxITU1JTkpJSE5HSkpISU5PTU5MSk1NSlp0cHBvcXFtbE9RUm5Zc2tnb29xcW9tdF5uWGF0X25vcG9xcm9vdXN0dGpaXnRjd3hyam56aGFhY2ZhYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRJS0hKQ0RERUBAPkNDQUZDSElNSEZDRkpMSUdGSk1MRk9KSldSS0dLSkpOSUlKTElLSklJS0xNTUxJS0tLU2tiWWleX2pjcnJaX1lqb19lZVVrX2RbYWJRYG1oXGpcbmlpZFtvZWRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRkpERUNGQUBBRURDRkJISkxHRkRHS0xJRUZKT0xJT0pMW1FKRkhIS01JSEpKS0tJSElHS0tLS0dIS0pMS0xKSUtMTlRbXVRQVU1RT05PT1VSUFBRT09RSkpOUFFkcWlUWVZbW1xVWVpdWF1cXGNmYWFmYmNmX15ma21obXR4cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzR0NFR0ZGQEVDP0NHREVHQ0lLTEhGREdLTEhER0lQS0xPS0xXTUlGRUhJSkhJS0hMSklGSEhKSEhIRUZMSEhKTktIT1xXXk9cXGBeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZFxhWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETE1CQ0RCRElFR0dGS0pLSEVFSkpKRkRHSFBKTE1KTVJJSEVBSEZKSUtLSUxKSUdFSkhFRkdFRUpHQklNSUpUX1lgWGBhW2BVWFlUXV5aX1JZXFBeXFlOX1xeU1teZF5aXWBjX1lfYltgXltVWVhaX15jY2JhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN1eXl6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSUVDQkNGR0VHR0lKSklIREZLSkpFRUhJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRkNERUJGSkQ/SUtITltjWV5eYV9SVFNXX19cXVleUVlcTVZfV0tRWVtRW19iYV1eY2FgYmJiY2NlWlJZVlddWl5kYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkRHRUJFR0hGR0hJRkdKR0hGSEtJS0RDS0pNTUxMSEpKSEpHP0dGTktLS01LS0tJR0lFRUBEQUhJQT5ISUZPXWFaW2RdX1RRUlhdXFxcX1tLV1xMUlxZSU1eUVFdX2JjY2NjYlxkY2JkY2VYUldVVF1ZW2FfXl9hYV9kbGttamtsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0VLSUZHR0lHR0pGRkZJTEpORUNLSkxOSkxJS0pJSUdCSEhRTUtLT01LS0lISEZFP0VCSEhBQEZFQ1RdWV5YX1lfW11VWFhQXV1RS0pWXlheW11WWmFSUl9fYmJgYGJiX2NiYmRkYlhQUlJTXFRcXV1eXl9fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0dERk1SSERSS0ZISEhERktJTVBFR0lKS05MTElMS0pJR0RIS1FPTUxQTUxLS0lKREVBRUNIRkFBRkRBVlVFXFReU1ZfWE5UVU5aW01KS1RgYVtfWF9eYl1PWWJcYGBfYmNhXWJiV2BfVFFQUVJZU15cW11eX2BhZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGSERJU2NRRVdfSUdHSERGTUpQUEZJSUpLTkxMS01LSkpHRUlOUVFOT1BNTk1OSUxCREFDQ0ZEQ0FDREBMSENMTFBPTkxGTUZGSElIR0xMTU9QSUxPUFBTUExRU1JVWlhXWVdXY1ZOUlRQUVBPUVVUXFlZW15eYWFlZmNoZGxtcXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtOXk1ISFlNR0hKSEdNTFFRSUtKS0tOTVVOT0tLTEdHS1BUU05QUE5PT09ITEZgRUReTERmY0NMW0heXHNtT01WbVlMQ09fVGxXZ0pdV1VeRE1RVUxNU1ZRUlRYVlRYVFRcVE9lWmhoZVpVa1RYV1VbXFxgYGFiYmJgZ2lnbmxocnp8fX6BhISEg4ODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS1BUSktHYFRISk9KSU9NUlFLTUtMT1JVUk9QSkxOR0hNUVtZT1BQTlBRUEpLUX9RSXxZWXJzV1BtR3Fub2FWUHFxdE9CanNucXRwU29fW25YXVZcWFVraFVdVmNZYFlaXlVVV39pdHV1X2F2X1liXFxmW19hYWFiXmBjZ21vbGBwd3R4gYGCg4SCf31+gHZ4em12fnR4fYB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdKTEZSVkxLT0hMUlhXUU5PT0xRVE5PUVBLTE9HTVBTW1pUUVJPUFBQS0laeF1UeGRoWFJTUHZmdGxwYm5ma1JyTkx3bWpycHNycXJwb2+AXWV6dXhxcXpxfnJ9a3V9YVJofGVzc29zc3x9cH54b39yYGBgYmJbYWFobG5rYmxmZ213foGAg357eHeAdHZ6aHJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRU1NSEtLSEpRT01OSk5WXllVTFFTTllZTFNSUk5MUElRUlRZV1dQVFBQUVJLSGd4bGN4cW1aSkxUeXB1bXVibnZQZGRIZXZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/cGhuWHV1anZ1cIBhc2h9aWx4fG9fX19jYlxfZGVnamplaGJjZGxscHBzdHNzc3lxcnhibHRncnl7c3N1eX6Bc3Z6bnx9eXhybk1KUnROQ0JFUFFIS0xKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSlNUVVhXV1BVUE9OUkpLcm91dXF1cWNoYFVuS3FwXkdoeVd2VEtoeH13YHl7c25hXW1vZFNncnVubXlwd2x2c3RxbG1cc356a215fGx1bnxscXZ1eF5fX2JfXV9lZGlnaGZlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tS0taVkhHRUdSUUtNTkxMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5KVFRWV1lXT1NPT05RSVJtSGl3S2BkdnZUVmxObmx7cmFqZ391VEtWa2d8bG1seF9acHp7X2B6c2Nyb3hxaGR8aXJ7XVRLa192dWxqdnx7bX55a3xwXV5eYltfYmRlZ2ZmZWNbY2Npa2tyc3J3Z21paGRnYGFsYWdzcmxnbG1yfGttaGt7dG1ta21PR0pLSEpISFJRTU9QTExTU1JPU1JYUldUUFdaVlZUVFRhYFFPTktUU1NRVlZPT01OT1FKSFFNT1VMS0tSU1JRUk9WVVFRT1JSWFhQTU9VVFdYWFtbVVFSV1tXWFdbT1JUV1dYUV1YVlxVVE9YUldXWFlaYFxncl9bW1tdXV9jWl9jY2VnZGRkY1pkYmdmZm1ubXVmZmdjYGZeXWdgZGxoZmdraHB6aGdna3VqaGdpbFBJS0tMTUtKVFJOUlFQTFZWVFBUVVhVWlZSW11WVVRXVVlYT09MTldUUE5VU05QTkxRUEtJUVFLUU1KSk9RVFFQUVNSSkhNT1BRUlBQUFRWUlhXXFdTUlBRVVVVU1pRTlJRV1VTWVZUWFRTUVRTVVVZWVheWl9hXVxbWlxcYGNcXWJjZGdlZWViWWBhY2FiaGhqbmNhZF5fY11aY1xibWFeZmZnbXNkaWhra2VkY2ZoUUpLS05PTE1UUU9UUVJNWFdVVFZYV1daVlNcYFZXVllVWFRRUEtPWFNQTlVQTlFOTFNQTU5VU05RTk1OUVNQVFBSVFROS01PUlRUUVFRVVdVWVpbWlNVUlRYV1ZZXFNPU1RXVVRZVVZYVFJRV1VWWFxaXGBdV1lfXV5dXF1gYV5bYmJjaGdmZWJYYGBiXWBoZWdlYV5fXV1eWlpfWl9nYF5eXWNoa2FoZmhmZGBiZGJQS01MUFFMT1RQUFRRT1FaWVhXWVpaWFlWXWpkVlhZWldWU1RPS09WVFBPVFBQUU5NUlFPUVhUUVFPTU9SVE5XUVNUVU9OTlFUVlVSU1JUWFZaXVxaVlZRUldYVVtbVlBTVVVVVlhTV1dUUlFYVlZbX1teYF9WX11eYF1cYF9fX1piY2VoaGVlYlliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVVFPVlxaWldbW1xZWltkcW1oZF9bWVZWWFJNTldTTU1ST1FST01QU1FVWlVUUFBMUFdVUVZSU1JYTU9QUlVYVVRUU1RZWFteXVxbVlJPVVZVW1tWUVNWVFZYVFNYWlNSUVlXV11fW2BgYFZiXGBhXWBiX1xgXWNhY2hpZWZgWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFpcW2BeYFteXmFgX2NcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWV5cX1dcXmpwd3mAY1xbVlZZUk5QV1NOUVFQUlRSTFFUU1lbV1VPUk5TWFVTUVRRUllPUVNTVltVVlZTVlpYXV5cXF5WU05UVlZbW1VRVFRVV1hSU1lcVFJSXFhaXV5dYmFgV2JbY2JeYWNfXGJhYl9kZ2llZ11cZGBhYGFjZF9iX1laX1tcW1hYWVdXWlpaYV1dW11cXFpdYFdbW1pQT09PWVBVVVNSWFNUUFtdXl1cYFxgVVxcaGpyfXNsaFxVWVdRT1JbU1JRVFJUVVRLUlZVWlpaU09TUVVVVFJOVVFSWlJUVVRYXVdYWFNYXFheXVlaXVVVTlZWV15aWFFUVFdYWFNWWVxUUlZdWV1dYV5jY19ZYFtlYl9kZF5eY2NhXmVmaWVmXl5kYWFhYmNkX2JeWFtfW1xbWFhYWFdbWltgXVtbXFtYWlteVl5ZXVBPT1JaUFpVVldWVFRUXl5gX15iXWBVXV5ia3l1bX1sWlVaVlFRVFxUVFRVVFZZV0xSWlZcWlxSUFVTV1VVUk9XUVNXU1dVVlteWFtZVVpeWF9eWVxZUldSWVhZX1lZUlRVWVlZVVdZXFVUWl1dXmFiYGVkXV5dXWVhYmZkXl9kY2BcZ2VoZmRiYGVhX2FhYmJfYF5XWV5aXFxaWVlXVl1aXV5bWltcW1dZXF1WWFddU09QV1lRXVVWWVdXVVhfYGFhYGNdYFVdXmJlZXaCe2hYWVpUVlRWXFhXV1ZWV11YT1VcWV5dXVRTWFNXVVRSU1dRU1ZUWFhYXl5YXVtVXV9YX19YXFZRWVRZWlphWFtUVlhbWVpYWVlaV1ZdX2BfZGNiZWVeYlxgZmJkZmRfYGRiYVtmY2hmZGZhZl9fYWJhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlRaV1RcVVdXWVdWXGBhYWNhY19fVltgZGFfenVvaFpcWlZYVlhbWllbWVhZYFZPVF1bYGFcVVVZUFRWVFJWVVFTVVdbW1xfX1pfXFZfX1ldXlleVlNZV1lZXGJZXVVWWlxaW1paWVpYWV9fYGBkY2RlZWNkWmJmY2dmZV5hYmBjXWJjaWVkaF9nXmJiY2FhYF5fWFRaWlpbW1hcWFhcW1pbV1daWFdcW1xgXVZdXVNPVlpWVlpWWVZYV1hdX2JhZGFkYV5ZWWFkYmBrZmheXF1bV1dZWlxcXF9bWVtiVlNXXl1hY1xTVllQVlVVVVZVU1VUWF1dX2BgXWFdV2FeW15cW15YVlhXW1pfX1teV1hcXFxdXVtaXFdaX2FeYGVkZGZmZ2NZY2ZlaGdkXmNgX2VjXWZpZGVpX2deY2JjYWFgX19bWFlbWVpZWFpYV1tbWltXWFpUWl1cW2BcVV5iTVJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9dXV1YV1tbXV1fX1xaXWNYWVhdYGNkX1JYWVBXVVdYV1ZWV1ZdXV5hYmFfYl5ZYV1dXllcXVlYVVZbW2BeXF9ZWV5dXl5gXFpaWVtfYl9iZWRlZmdoY1plZmdpZ2NfY15gZmVaaWljZmljZl9iYmNhYGBfXV1aWFtZWVhYWllXWltaWVdZVlVbXV1dYGBiYnhLV1dcWVddXFxdWldcXV9gYmRiY2FdYFhiY2JgY2FjXlxdXFhXW1xfXWBfXVtgZFxcWFpiZWNhUlxZT1hWWVtZWVdaWmBeYWJjYGFjX1xiXV9dW15dWVlUWF1cX19eX1taXl5gYmJbW1dbXWBiYmNlZGdmZmdlXWVnaGlmY2FiXGNnYFxpaWNoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXV1hQWFpdYWNmZnJrf0pZV11bWl9dXF5cWV1bXl9iY2JhYV1iW2JkYmBjYmJdXFtaV1hqcWBcYF9dXGFjX15ZWWNlZGJUX1pRWVdcXVxbWVtbY2BjY2NgYmRhYGNeYFxeXl5aWFVbXlxcYWFfXVtgYWJmYl5bU1xfYGNkZGZlZ2dmZmZgZmdoaGdkZGBbZmdeYWhoY2loZmNgYmBjYl9fX11dW1pbWVhYWFZaV1xbWlZWVUxYWFxnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIeJh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl7e3t7e3t7e3t7e3t7e3t7e3x7e3t7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnd3dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXt7e3t7e3t7fHt7e3t8e3x8e3t7e3t7enp7e3t8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29wcHp+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09a9homJiYmKh3NxcnJycnGDiomJiYmKjI2NjY6Ojol/f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29veoB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk6MqJjIyMjIyJcm9vb29vboWNjIyMjIyOkI+PkJCQi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXV2d3d3d3d3eHl5eXp5enhvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4OEgXx8fHx8fHx6enp6eXl5e318fHx8fHx9fX1+fn19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5d3Z2ent4e3h3dnZ4eXp6en55eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd3d3x8fXx6fXt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3d5fnx9fXl9enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6fHl3d3t+fXx8ent6d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eXp6eHt9fXx7fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoF/gIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl3eHp6enp7eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYKCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGCgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgYGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYKCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKCgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fX19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qKi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhIWCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYWEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHR3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uIioaGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLioqLj4+Ni4eEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCgoGCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODgYGChISCg4KHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYKDgYCCg4GChYWFhYaGh4aFhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKh4KCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEhIOCg4WDgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJGPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4ODgYOEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGDgoKBgoGCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYmHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+fn+AgYGBgoGAgYKBgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYGBgoKEgoKDhIKDhIWFhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkZGRjo2Mh4WDg4OBgoKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4KAg4KDhYWDg4OEg4SDg4SEhYSEhIKBgIGCg4KChIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWFhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+NjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgICCgYGAgYGAgIKBgoKCgYGCgoGAgoKCgoKCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSTkpSSj42Lh4SEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+AgH+Af4CBgIB/gYGBgYOBgIGBgoSDgYGBgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGAgIOCgoOCgYKCg4ODhIKDg4OCgICAgoKCgoKCgoODg4KDg4SCgoKDg4OCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhIODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWEg4SFg4OEhYSCgoKDgoKEgoGChoWDhYODhISEhoWEhIWCf319fX6ChIODg4ODg4ODg4SEhIOChISEhIOEhISDhIODhYaFhYWEhYWFhYWEhoaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMi4iFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIOEg4ODhIWDgoOEhYWGhYaGhYaHh4aDgX5/fn5+fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoaGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoKCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4OFhYWFh4eFhYeFgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGh4eGhoWEg4SFhYaEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CBgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoODhIODgoSFhIWHh4WEgoB/f39/f4B/f3+Af3+FhYaHiIiHh4eHiIiIh4iIiIaGh4iIiYmJiIeGh4eHiIiGh4aHh4aHhYSDhIWGhoWFhYaGhoeHhYaHhoeGh4eHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eHhYODhYSDg4OChISEhIWEgYCBgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYqLi4qKiIiHiIiIh4eIh4eIhoeGhIODhYeHh4aFhYSEhIWFhIWFhoSEhIWFhYaFhoWDiZSTkI6RjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeHhISFhIODhYOFhIODgoGCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiImKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWEhIWEg4KCgoKCg4F+fX5+fn5+fn18fn19fYOHiYqKh4eFhoeHh4eIh4iJh4iGiIeHiYiEg4SDhYSEhYWGiIeGhYOCgoSFh4aHhoaEgoKDhIKDhIWCgYKBgYGDg4SDhJGSkY6PjYuHhIaGg4KBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWGiIuKhoWGhIKGhYGEhYODg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GCg4SFhYWDg4WEhISEhYSFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYaHiIeGgIGBhYODhIWEh4iFg4GAgIF/gYyGg4ODg4KCgH19f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYODgH+AgIGDgoCAgICBgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhoyTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5/fnx/h4ODgoOCg4F9fX5/gICBgH59fX19fn18enp6f4KCgH9/f39+f3+Afn2Af3+AgIF/gICBf39/gYF/fX1/gIF/f35/gIB/gICAgX+AgoCAgoKBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCBf3x9fX59fX6AgH59fn17fX6Bg4OCgoGBf319fn6AgIB/fn19fXx7e3t6enl6gIB/fn9+fn59fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f35+gH+Af36AfX1/gYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7f39+f39/fn1+f3+AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZKSjYyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgIB/f36AgYSDgoKBg4SEg4SAgYCAgYCBgIGCgoOBgIF/gIKDg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enp5eXl9gH+AgYGBf3+BgH+Bf4CAgIGBgoKAfoB+f35+fn6BgIKBf39/f4CAf39/f4GAfn9/gH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEg4GDg4OCgoKBgoF+fn19fX5+gH19fX19fX19fHt6eXl5eXmAgoKChYOAgoOBgIKAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4KCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoaFhYaBgIODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iHiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eHh4aHh399gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WFhIWDgoODgoODgoKCgoODgoKSkIuIiIeIh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgYB/f359f35/gX+AgoGFhYWGhoeHhoeHiIaHh4eGh4eHf3x9fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomWhIODhISUk4CBgX9/f35+hIuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKOi4mIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYCAgICBgICAgH9/f3+AgICAgICBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSEhoV/fHx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3x/goOBgoCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fX+DhIWFg4WGhYSFhYOEhYWGhISOkY+LioqMiYmJh4WGhYODgoGCgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoOEg4KDgoKFhoSEhYWEhoSDhIOCgYGDgX99fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgYCCgoCDg4SEhISEgoSDhIWChJGRjYuMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIKCg4WDg4WFhYWDg4OEgoGDg4KDgoKBgICAf4F+fn5+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn9+gIJ8fH9/gYCCgH58e4qCfYB/foGAgIGCgYKAgICBgH+Lk4+Li42OjYiIh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/f4B8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICBgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX19fXx8fYB/gIB+gH5+gpSRi4yNjY+KhYaGhYSEhYODg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317en2AgIB4foF3e4CBf4GCgoKCg4aHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fHx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4d/fXx+gICBgH9/fn19fX1+e3t9f39/gH1/foCMkY2LjI2NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn9+f4CAf4CAf399fXx8fX59fH19fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19fn9/fX6Afn5+hJKMjIuOjIuKhoSGhISDg4ODgoOCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gISDgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXx6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CKj4yKioyLioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gICBgYB/fYB/f35/fn5/f398gn5+fX19e3t9fXx6fHx+gIKAf4CAfHx9fHx8fHx9fH17f357e3t8fHx9fHt7e3t8fHp6fXp+gn+Bg4SCgYKBhYaFhYaGh4WChJGOjIqJioeHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f35+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn59f358fHx8fHx8fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3t9e31+fn+AgIOHiYmJiomKiYWIkY2Lh4iGhYWDgoKDhISDg4KCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foF/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn19fX19fH18fX19fnx9e318fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+g4WIh4iKi4uKiYyQjYyIiIaFhIOCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjY+MioiIhYSEg4GCgoKCg4KBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgYCAgYOCgH+Bf31+gH58f3+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX1+fn1+f319fXt8fX58fHt8fXp6eXl6eXt7fn6AgYOHhIiNjImJhoWEhIOCgoKCgoKCgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKFhYSCgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn59fn6Af319fXx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiYyJioeFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGEgX5+gIB9foB+fX5+gIB/gX5/gH9/f4B/fX5/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCBfXx8fX18fHt8fHt7e3x7fHx8fXyJiYeHhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fomFhoSFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp9fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX1+gH+BgH+AgIB/fn19fX59fn59fYGEf4B/fn+BgX99gH99fX59fn59fnx7fHp8e3qAhYKDhIWEhISFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn19fn57e3p+iYd+eHJ5fX9xenh7eHl0dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIOBf3+AfoCBfoCBf4B/fn5+fn5+f35+hYWAgYB/gIOBf36BgH9+gH6Af359e3p7enx7eoKDf4KCgoKDgoOCgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXZ0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX5/f3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+BhIF/gIOBf3+Af4F/gH98e3t6fHt8gYB/gX9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOCgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OBf3+BgYCCgYGBgICBgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fH1/fX+AfH9/fn2BgIB+fX2Af36BgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgoOCgYF/f4OAfoKChICAgoGCgoSBfnt7fHx8fX19fn16fn1+eX5/f3x8fH59foGAgYGBgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXx5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4SDf39+fX5+fn+Af4CAf4GCgYB/fn+Bfn+AgoKAgYSChIWGg4B+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhIWFg4ODg4ODgoGCg4KBg4J/gYB/f35/gH19fX1/gICAf39/f3yAf3+BgIGAgH99gH9+fn5/f31+foGBgoJ+f359fn5+fn9/gH99gIGAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3Zxd3lyeIWFhYWDhISCgoOCgYGCgYCDgYCAf35+fn6Afn1+fH6AgIB/gIF/e4B+gIB/gYGAf32Af35+f399fX1+gIGBgX5/fn5+fX19f35/fnx+gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fX17fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgIB/fX5+f4B9fH59f4CBgH9/goB8gH+Afn+BgH9/fYB/fn9/fn19fICAgICAfn9+fn59fH5/fn9+fH2Af359foCCf36AgH9+gYOCgoOFhYKCfn19e3t8fHl3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzcHh3cXuFhoWFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgH+BgX1+gH9+f4F/gH9/gYB/gH99fnx9f4CAgIB/f39/fn18fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WHhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGBf4KBfX6Bfn5/gX+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2EfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgoGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf4CAgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZKMenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKCgIGBgoGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhol8fH57e355ent6e41+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICBgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX+Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt7fXt6fHx7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgIKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOBhISAgYF+gYKAf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+BgIB/gIB/gIGBf4CAgICBgIGBgYKBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg4B/goGFg4OEgYGDgYKCgoGAgICCg4KAgoKFg3+BgH6Cg4CAgYCAgH+AgH+BgYCCf3+AgYB/foCAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKCgoKAgoGBgoGAf3+Af4CHfn58en18e31+eHd2eXl5fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICCgYaDhIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn99f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX17f316fYB6eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYOBgoKBgoF+gYCAgoGCgoGCgYCAgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIODhISDg4SDg4KBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn5/gYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoSGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYKDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH96e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKChYSEg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnR9h4eDgoSFg4OEhYSAgoSFhISDgoOEhICEhYOCgoKDg4KDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9f31/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn91dn+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoKCgoODgoOBgYGBg4J/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoOEhISEhISEhIODhIWEhISDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx8gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4GDgn+Cg4ODg4KDgIKFg4ODg4SDg4SDgIKEhIWDgoKDg4OBhIOBg4OEg4SEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+fX5/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WCgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgX+Bg39+fXx+fX1/gYB/fnx8fn9+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhYSChIOGgIKFhYuJhISDhIWFg4eGhoSEhISFhIWEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIF9gXWBeoN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgISDgH99fX59fYGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISGhIGDhIWDhIWDioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfH9zgoN/g4N9gX1+fn1+goOBfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugIh5bX1yc3Zzdm1teGxweWx1fX9/fX6BgIF9gH99gH+Af319fHx9fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYF/f3x/fXyBfoCAfn6AgIGAfn5/fn6Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeHiIaHhIaGi4mFhIaHh4WDhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foN0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhIWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYqIhYSGhoWFg4WFhIWGhoaGhYN4i3lyiHp7cHCFhXiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYaHh4iGhIaFh4aGhYSFhYSFhYaJiYeGhIaFhoaFhoaEhoaHhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhoaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISDgoF9f357fHt+e3x8fX9+fXx+foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFh4aHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoWGhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGhoWGhoWDgoWFhoWFg4WEhISFhIWFhIWFhIaHhoaFhIaHhoSEhIWDhYSChIODhYODgn2Af3t7fH57fHx9f358fH59gH99foB+foB/fX18gH1+fn5+fn58fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYSIhYaHhoeGiIaHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoaEhoaFhoWEhoaFhIOEhIOFh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fnx/fn19fn59fXx/fH5+fH2BgHx8fH18fHx+ent7fX6Ih4KFiIeHhoaGhoSEhoaHhoiGhIWEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4aFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoSGhYaHhYWGhoWEgoSDgoSHg4SBgoSEg4GAgIB7e35+fHx8fX18fHx9fXx9fH59fH19fHx8fX18fn17fIF/fXx9fH18fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoWHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYWEg4SEhYaGhoaGhoeFhYeFhoWGhYSChIODg4eBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19f318enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eGiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aHhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODgoKDhoGDfoKCg4CDg39/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhYOFhYaGhoaHhYeGh4aHh4WEhYWDgYOCgIOFgoN+gYGBf4OBf39+f35/fHx9f317fX18fXp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYWFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4qHhIeFhoaIhoWHhIaHiYaGiIiHh4aHiIaEhoaGh4WFh4OEhYSGhoaHhYWEg4WFh4WHhoeFhoaGhYaGhIOEhYGBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXp6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWHhIaFhYWFhYWDg4GDgYCCgYWCgIB/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeGh4iJhoWIh4iHhoaHhYSGhYWGhYSHg4SFhIiGhoeFhYSChoWGhYeGh4SGhoaGhYaDg4OEgH+BgICDgIOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH5+fnx7e31+fXyIhoWGhoaFhYWEhYWEg4KBgIKBgICAg4F+fn6AeXp9gIODhIeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiGhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIOGhYaGhoaGhIWGhoWFhoKCg4N/foCAgIF/g4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18f359fHx9f358e4iFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WDhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhYSFg4WFgYGDg39+f4B/f3+Df3uAfX1/gn2AgX1+gX59fn19f3t/fHt6eXp6eXp6fHl6ent7e316e3t7fH1+fX2BfX18fH2Af318hoOGhoaGhoOEgoWChYGBgH9/gIB+f4CCfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWGiIaGhYWHhYeFhYKDgoKDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SEg4SDhYSAgIKCf319f35+gIN+e398fICBfYGAfX2DfH5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHx7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5+gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaEhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDg4SDg4B/gIF+fXx+fnx/g318fnx8gYB+gn99f4J8f399fXx8fHt7enp6enl7enp6enp6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKDgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIaEgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhIWFgoKCg4WEgoGBgYKAhYOBf36Af358fH59fH6DfXt+fH2Bf4CDfX2AgX9+f318e3x9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc7PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZMPTg3NjU5OTk8Pjk/PEQ5Ozw3OTw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU1NPU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo7ODg6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk4Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vKysrLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1NXU1NTU1NTV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0NHQ0NDQ0NHR0dHR0dHNysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2tra2dnZ2dnZ2dra2tra2dna29vb29vb29rb3Nvb29vc29vb29vb29vb29vb29ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzZaEhoaGhoaHh4eHh4eCsuLd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqJkpmYmJiYmJiYmJiYmJiXjIuKioqKioqKioqKiouGgYKBgYGBgYGBgYGBgYOLioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5uUFNTU1NTVFRUVFRTTKDz6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTUWJsa2tra2tra2tra2traVVTU1NTU1NTU1NTU1NUS0NDRENDRENDRERDQ0NGU1NTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7QEM+Njo3Pj47PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zOcVRYV1dXWFhYWFhYV1Ch8enp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1ZlcG9vb29vb29vb29vb21ZV1dXV1dXV1dXV1dXWFBHSEhISEhISEhISEhHSldXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87PkBAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNznheYWBgYGBhYWFhYGBapO7n5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJhb3h3d3d3d3d3d3d3d3d1Y2JiYmJiYmJiYmJiYmJcU1RUVFVVVVVVVVVVVFZgYmJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPzs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3HxcXFxcXFxcXFxcXFxMvQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Pzs7Pzs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy83Ozs7Ozs7Ozs7Ozs7OzczMzMzMzMzMzMzLy8vMzMvLy8vLy8zMy8vMzMzLzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz8/Pz8/Pz8/Pz8/Tz8/OzM3Mz9PS0s7Nz9LOzs7Ozs7O0dTU08/O0tTPzs7T08/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tfX19fX19bX19fX19bX19fX19fX19bW1tbW1tbX19fX19fX19fX19jY19jY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7O0bCCg5PN0qig0M/RpKHQzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8mburibsLeeo6fWr5+hqdLOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q+QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9HDoo9/icWempOdwJ6YlZzI0M7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Rv56KqNO+mKGctJicop2wstPPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/P0bqkrZyhtJmWrbmGnpavs6rV0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz9HAoJ6TqZCbgaCWeJuEnZOk1dDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0qawrp+An6iInHmfqYWZpNXR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NHJ18ScgrivppyKva2mmK/W0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT07Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXFjZ6gn5mnl5edpaeWmJu71dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NDc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HJwaGtoaDBoqukm9Cfq6Sc0dPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09WrjY+p2MWQjbfXwo+NvNXS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR1MG+1dLUx8PW0tXFxNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQT43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dHU1dLS0tTV09PT1NTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTU1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87Ojg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VGQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODg4NDs/PD88OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2loeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCDdnR8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTw8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6ubi4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODc5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q6ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqZG1nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp14cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTg4Nzk3Ozk6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW1tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlp6mmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTk9NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFBPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNBREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9DQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6PDs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ojk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTg7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampubm5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cnJucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD8/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5APz1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo7PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8OTc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTk7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ubm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVkIuTk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODQzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMj4+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEBCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uNj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhH+Cf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo7Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVGJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFNfTUhRSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipamnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxkY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSloqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGdiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaatpqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6qsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbYF9aXFZcaGRvY25paGJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpamnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QUVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaChqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYWxodWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3Nzo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2s7qxqq60sbCxtLS2vLy+vLy9xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyak5aUlJiTkJqdmIqLh4CAfIJ4YV5ZU2FoYGZzb3Npc2NpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsPDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bm1bYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbGnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0JERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqUkZmXnqGVmJqSl5SVkZSamJOPk52WkouRfnp8f3Rra25kb2xocXhveWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGv8XHy8jUy8rIxr+7u77EvsXIxsbExMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4t7u2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmcmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtoZ3VaZnJ3c3hmZl1kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw7PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsjBxMHHysrGysXMyM3GyMW/w8DLzc/JxsPDxMLEvri+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpoXWpvbXh3YmJgYF5YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIx8nHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraapu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lodG14bF1kW1VgWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw+PT9BP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMXJxc3QzsfMycLBxsHLy8fGzMnNxcbGw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZHRuc2JcYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBw8O/v77Ey8jKy8i8u8jHyc3Iw8jJycbFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7u721s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JvZmVnY2pkYWptbm5eWFxWVU5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbBubvDuri5vL7BxsHGurnJycPFxMDEwcLBxMHDvr3CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmZjWllZXFlRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7q9wLm9urq0v7i1t7Ovu7y3wLe9wr/Bu7/BvLvFvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYd9cWNgYmJnamZmaWVpXVZVU1lPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1usG4vri/vL23tbewrri2ub+7wL+3wby7w7a6yLi2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2dYWE5LS0tSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8tru8wMS5t7e3tbq5urvAvcPAusTCvse4ubitt7W4urS3s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8urq0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucGdwa3NlYm1fXFRIS0pESkJDRz85Ozg9PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9v7vEt7a4tre/v8S8wsXFx8fKycbPwsG4rrW1vL64u7K+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrrAwr+8tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG53Y2dhXGNRS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD89Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuqo7C5vb6zvL68xbiyuLm9x8nKw8fIxsbJyMzO0czKxLW6wMPIv7+1v8C/xsa/y8bDv8G8wMPMysfFxsG5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmBhTkhNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+us720uMGxsLG0vMO8urq+vMS/t72/vcfMxsfJxsa/xMTKyMzMzcvGwsPLzsK8ub26ucDDv8jGxMHBv8XAysnDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3tfcGNbXV9eU0k+Q0VJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PT8+QUFBPj5BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLS8trq9wby7v7a/wb+8v7rAy8LHyMC/vLy/xcLHy8jBw8DAycrCwLu7sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnptc3hzZ3BdWl5cWVFFRENNSUFEPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7u9usO7t723ucC7uri4tcXBw8O7ubO0usG9v8fAucC8vsXEvb65srCuuLe/w8fDxL29v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG1oXF9fWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnBwLe9ubi5trW/s7SyuLG7wcDDt7etsLW4uLjCurS7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d21wYF5lXVtUSjw+P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+3ure2trK0wLaytLizusDBw7m3srKytLK3vrqztbK8ury2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZybF5iYFtdTkhBPz1IQ0ZNRD83NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWSmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u7y4trq2scC6t7m4ubvBwcTDu7u2tLSwtrq2tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d297b3VybWNcZlhcXVJOTUE+SkJASklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOxrba6rqy8sri5t7u/vbm+wLS/u7y6uL7CvMLKx77AuLm2srS2s7SvrLu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLawqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c211aWtdWmpUXVxPTUhERkxBRk1GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5urW5u7W1s7W7vMC7vsC0v7m5urG6w7zCysW/u7+/ubS0s7GxrrC5uba8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jo6OhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmJ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIP0hRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmura+ysrq6t7e1tby0r7Srtrq4wMTBu7W8vbiyrbOwr6yutraytLSvqqSenJycnqion6CoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKqrnqWjm6OclJCMjo+Qk5CXlZaYn56empmml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFBoVFBOR09NTEJPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLi0p6Wsqqi1srGwrq+yp6avo6+utcG6tbeyt7aytKuytK6qq6+wsrOtpZ6SmJSPmaCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6apsKOlp56gnJWTj4+RkJiQlpWYl5+Ym5mbo5mXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01JSEdOUk5KTkc7REA9Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiYl5ahqKyutre6ubq3t7uuqKChqaGgrauqpqmkqaOkrqWsrLS8t6yysa+xrbWvr7O1qqetrKOcmZSOkZaXmZmcoKOim52lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmZaal5eYoJ6cnJeboZqemqOnpZ+hoqKjnZuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHh6YGJSVV9ISUlLU1RJUlBMOD5CNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OTnJ6jqK6trKurr6qvqZ+XnqWenqWmpKCin6agoq6rrK21sramr7Srqaq0sbCwuK2noZydmpSYm5qRjpGVkYyPjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruaimq6erq6msrKegoKOxrbGxtKmxr6KZnJ2eoZibm5qYmZuUlZqWmJyloaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1pZTVFKTk5VTFJMQTc+Qjc4PTc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0/NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkpyYoZ2qoqegnqehpZ+ckpyim5+ho56doJ+joKKvrqyvsay2p62xraamsK6trLCnoJ+ioJeRlJyhnJmYkpOfnaKkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwp6uosrW3s7essbSjoJ2ln6uhoaKgn5qYlpWfm5uYpKGgnqOhoJ6anKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFFVSEZVVkpCTUc9Skg4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjpOemaidrp6nnpyhnZ6amZKZnpyioqCgnaKfn56fqaunrKmqtKurraulpauoqqyqpZ+emZKSlJiZlpaWjIiLjpWdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oauiqaixqaqop6eamZ2aqqafmaegn5+nqKWknp2qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pd21obVxYW0JWTUpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiaqqCxorejsKagnp2dl5iWmZ6bnKSfn52knZqdnKSipKOiqq+sp6mjoKGsrq6qq6agnp6ho56enpudnJSTlZSenpiUhp2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK6nsa2xwra4wsbAyMrAyr+wubm9ucK9uLO7xcO8wru3s6myraqztK+zrqmuo52rp7axrKKvpaCjr7GtsKSkr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaWeppmboqSen5ubm5yHhYF7dHJra3VycGdXXFFFVEhESU9IPkVBM0VIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goZ2cmJufoJugn5+XpZ2Vm5ufmp6cnqWmp52goKuxrqekpKOgnqWrpZ6XnJSRmZ2YlIyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczLzNLHvr/Awr3HxsK3w8nIwsDFvrm0ubq1urewtbKqurGuu7a+u7qqt6yqqri6tLuurbijpaKep6Wio6mmmZufmJqdp6qnoKGhpJiUo5aUmpGcnZ+knqefnp+inZiZlJiUiIR9enJrZGlveGplWltGSkxERFNMREJENzo/OzU0OTk3OD4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlZqWlJukpp2hqqeiq6y8vL/DwbOyuKehoauqop2eoaKenJugkp+fkJafmZKalp2bmaOhr7OpoZqdnZ+fmpeYl5KMj5aXk46NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3Mx8nRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXR08zTz9PTzMrCxcbGysfOv8jQy8bExsTAu8PAvr6+tb2zrb6/wsPGxMfDrb64sri8xMHBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURCQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5ibo6yen66mpbGqxcbMzs2/sMKppaitraqhnaOfnJ2aqZOZoZCOoJONlJKXmaSxsaukoJ2gm5mXlJOUlpGQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys/K09fR19LU1dPTyMzHzc3J0szN083Ex8nJwMbLxsjIxb7Cs7PHxMvKys7Fyb+9v7zBx8TMzMjJv8O/rbCzqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYt/enJ1dWdiZ3ZpZFZXUURNRkBJUUI9Qjw6MjNAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmfk6OYlp+enaSum5+wq6isscnN1NfPxrvHrK20uKyuo5+ko5+gpKyblqmWjZeNjI2XprCupZ2enaGloZ6blZSWlIp9d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HS1NTSz9HD0NPW19XW0svJztDLxs3SydLV1tnV19PW2M7Syc7RzM7Qy9LPv8fGycPLy8vOz8XGx7a/yb/SzMvPxcnHv8PCx87M0NDPzMrHzbi3u6ifpaunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHdzdm9jYGVyYl1SXElKRkFFSEk+O0A4PTQ1ODU6NzY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopuppqKmq5qjsLGpqLXQ1Nfa0sfGy7S2wsaytqmipaahoqu1p5qxoZaVjJCmrauclZihnZuhop+cnZuVindpY2BfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTOz9XU1NHRzNHO09fW09XQz9LT0cnT0cfQ2NfY0dfS19nV1szOz8nM0cvO0L/FwcfFzczQ0NHIy8zAysvF087LzsjEycbGyMvK09PQ1c/SzNLBucWxpai1rqeaqKylnbKosLOsrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMe3pxc3RtYWNpbV9WUF9KSkJGQ1FNPzw+NDQ6PTUyNzU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr66qqqyepq64qKu32NTV2dnRztDAvMzJt8Cvp6upo6SxtrOjtqqfnaGqqaGYlpiam52hnpqdnpR+cmVjYl9fYV9fYWBfYGBfYGZtcHBua29yd3ebzMDS1dPY2NbZ0dLS18/TzsvTzdXU0crPzNPW0tHWzdDV1dHF0dTK0NTV1s7S0NjY2NfLyM3DyM7Mysu/yb/HyM3Nz8rQzc7Lzs7Hys/Qys7KwsjGyczKy9HSzNPR0M/Pyr3IubCtu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHl2b3Bua2JlbnBhV1xaSUZGRExXRTtAPDMzPD04Njg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw+PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snnri2tbWtpa2uvrSxwNnS19rc1s/Ny8PT0MLCsqutrqyms7G4q7O3qaOfnJaUl5uen5+dlJaXlYlsXl5eYWRiYGBhYWBgYV5fX15dYm1yb29zdHZ2eaS+y9XR1tTT2NbOztPLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHTy8vP0dPJztHV0tXVysDJwcXMwsjJwszCxcjJys7KzMzPzdPLxcfPzMfHysTGwMXJy83P0MbPzs3NzM/Fx8C3ub3Cw73DubKzvrC7w8S1qZiloZmWkZWVkouUjZqRlJSPj5SCiYV4cHFrbWhgYHFoWFhoVk1HTElQUEI7RD47Njc6ODk6NTc9PUE7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXFw8G/u7WyscfDucvV1tna29jNzM/J1tbFxLiytqqkrqy5ubGywKGXjo2YlpCTkpGWlpaQjHxlYmJiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycTJycbGv8PFzs7HxcfNytHIy87NxtHSz87M1MrHys3Ox8fP0svQz8W6xL7GybzCxsjOxMLHwMbNx8PLycvPx8PDz8jGwcbHw77Ax8vLy87CysvIx8vPxMXHu8fCyMjCz8C9vL+wwcrHur2qsLKnpZ2inJiQm5CkmZeZkZWYiY+Cd250ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU9PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJuls7Gsyc3KyMS+vbrNzcbQ1dXZ2tvY0MrQ0NLUysW6vr6wqLervrm5s6WSjo6WkIaDhISCfoWFf3RgW15eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6v8O7u7q5vsjGwsPAw8fKycjKx8HFy8bIy83JxMLKycHCy9DEy8i/ucG6xce9v8bPysO/w7rJx8i6x8bEysC9wcvGxcO9xby8v8PEy8TEvL/JwsXH0cXAyL/KycbHxtDDw8bDr8TLx8TKt7+8urSprKWlmJ+YrKOhpZqjoJuUe3ZydGZpWmFubVpbWFFETEZCR0RMREZTQDU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMrP0czHwsPHzc/OzdXQ1tnY2dDN1M7P0MvEuMbBtrW8scC3uq2RjJOXh3uAhYaAdnh1cnBfWltdYGFiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbBsLa6srK0srHBvLu7ubjAwcHFvr25vb+5xMrFxsK9xsC3u8TJv8LJu7e6usXCvrzBzcLGvr21wL3DurzGu8K5s7zFw8LCtr+1tb6/usvDvLW6yLq/vcvDwcXCxcjFyMXQxsLMx7LGycPOzcHFwr+9srews6eoqLmxpa2wq62slHl2d2plaGBob2NWXllKRUpGSEtBRkJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfGwsTIztLLysrHzc7P0snRxtbV1tjOzNDIzcjKxb7KwbK1ure7trCRjYqLhXmAhoaAfoR8dHVkXFxdXmBgYmNiYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rAuK2wsKeqraynuLS2tLOys7q1vbG3sLSusrvCvMHEvL+6tbK6vsC4x7i0u7XAwry3vcbAw7u0rrK2ur6zxLe7tau4vL3AvbC6ta+2urLFvLauu7+0trTFvL7Dxb/DxMXHy8XAxsa7x8u/z8nHw8bBw7fDvr22ub7Gv6y1urW3to54dHhmZ2Via25eVl5gRktISEpGQkNBRUU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6Wrs7G8vLGtn6CZlJSYl56ro6+qp6TGy87IxsnOzNDNzsnLyczKy8bRz9PRz8jLxsrGxMC9z72zub25uLecjoeJiXt5foaGd3iCfXRoXl1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaGZqbm5yfKTHv7m4tbCrrKeeoqqnnquss62pq6mzrbawsqiupqyyvLq2w7m6ubCrtbm7tMK6sL+wvby7tbvHucK2raqosLHAtbi8r7CnsbO0u7yrrbWlrrauurGwqrmvrbuuu7i7v7+9ucK/xsLFwLzGwcjLuMXHxb/Hw8O6xMbCu8XJzMuzucK8urKIcnZ2a2lhYmxoWVdXW0FMS01JRUFDP0ZBOjk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxs/SzMTGwcXQyM/CxMfBxsbFxczEy8zCxMHIwbq8u8q3tLy9trWrkYmQkHx5foqFenuEgXduXl1dXV1fYF9fZGNiY2NiYF9dW1taWl1aWlpaXWRub2hmZ2lrbnKBrbmwta6mpaenmqCkoJqcpauto6eiq6msqrCjpp+qrbW2sb25r7evqK64tLS8uLO8rre5tLG7wbHBrqWpoqyxsrOnvKqrqKusrbS0pqiuoaSuqbKlp6iupai3rLCyt7m6u7G8vb6+xL+1wcHHyLe/wMW3xMK/u7/Ew77EyMzKv77DwMCphnJ0cmppXWFvZFdWWFBIWlJTS0ZGRT4/QDk3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7rEsLawm5mVnJiqqbCxs7W9r8bR0M3EyLu7zMPMwLzKucDGwLzMusPHxbq9xL66t73Guba5u66ylYOJjYF7foB+eHR/fHN3Zl9dXFxeX2BeX2NjYWJgYF9eXVxaWFlbW1lYWlxfZmtmZWdlaGtvcoWqpaymoJyhpZSepJuXkaGjqqOin6Wlp6Ssn52bpKassq+2t6ewrKeqtKu0ubC2tKy2uLGvurmxt6Sfo5+nsaerqLmqpKanqKeyraCnpp6bpKasnp+npJ+gsa2trLK0srOwtby2u8HBsrq+w8GyubrCs8C9v7W4u72+vMLHxMLDvr/DoIN3cGthZV9rb2BVWV9ITmhPVEdFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbu+taCelJ2hprq2q7Ozu7PF0MnMw8e5uMnCzsG6y7m9yLu3yLu3xMazvsW8t7C5wLuxs7ewooSHh4J9eXZ0b21rampxaV9gXVxcXV9gX2FjYmBgYGBdW1tbXFhZWFhYVlhbXV5kY2JlZ2dnam1viJ2poJeVmqGWm6KYlY2eoaKmm5+fo6Whp56aopufqrCtsbWiqaqpq6yktbitt6+ssrSusrSusKqfnZ6jorKkpam4raGmpp+orKuZn6CemZ2fpZqZo5ybna+pq6eqq6ytsLK4r7i5u7C2u7u6q7KyubK9tLaxsbW0v7W9wL3Dwbq6vZeCenJrX2VeZGRYVFheSVddS1BHSUpGQTw/P0A7PzwwNDUzNTo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xtDJycHHvLzFxdDAvMq7u8G7tsW4tcHBs8LEvK2qtbq3qLGzqYuGiIB5c25wbmtiXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWltZWFdXV1dYWFhbXmJkZGVmZmhpa3KNqJ2UlJSbmJuhlpaQnKGhqJ2bnKWmoaSbn6CamK2ura6yoKWiraunobWwsbGsp66yp7mzprWhop6ao6KtoqGptaqio6adpaajlpiel5ianZ+Zl52cnJusoaumo6Smrauys6q0sLKqsrm0r6mvsrKyt7Otqayusbewura5vb+2srGUhHl1ZV5lXltZVlNaVUtbUUxJRUhLSUI9P0FBQEA6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vb+znaWjmKWxwrW2va20uMPNycjBxrjCwcjQusPGwLa8vbbDura/wbW7v7uqprG7saiyr5t9hYWAeXBxdHFoZmRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hYVldhZGVjZGVkZGhqdqKclJSPlJaXn5eZlJifnqGclqGhqKOfnaicmpqqpq+wq5ujo7eqoJ+uqLappqassKO3sKO2oKKbmJiqpqGbrLivoqGknKGfoJOVoZSWlpuYl5aXnJSfqZ2po6Gdo6qqsK2otKuqpq2ysKWqrrKxr7Curqenp7KusbSvvLS5tq6jlIF5dWReYVZZV1NSVEtNXkxQS0dHTEtFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp2np6Oqu8C9wLmutLjCzcjHxMW+x7rKzbXExcWxv8C5wMG6wMC5ur23qKixu6apoqWJgX54cmpscnRwaWhlZGdiXFxaWVpcXFxdXl1cW1xeXFtcWVtcWlhWV1dWV1hXV1dVW2NjYmJjYmNkZmqBlpOVi5GUk5uZnJaWm6Ccn5Wgn6alpKWmnpyfpJ+qr6afoqO2qKChoqizoaWnpK+lsKyrtJ6gnZWUqaGhlKyxsJ6iop2emJuTi6GUkZOXmJKXl5iWnaabpqGimaOlpKukpbCnpaOrq62lqK6vrquoqqqzpaarr7Sxrry1sa+voJJ6dnJkYVxaXVhOTFFHUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc7ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuyt6yepKett7u8wcW6sbm1xcrLwcTHx8m4yMa1xcLJr7q8wrzDwMG9vLe6tqansraeooqZiIB3b2RiZ2loZmhqZ2ptYF1cW1paWVpcXVxbXF5fXFpZW1lZWltXVVhXVFRXVVNUUlVgYF9gYV9gYWNkaYGUk4mRjpSSk5yUlZajmaCWnKCloa2lo6Oio6GbqqqlmZ6lsamgoJ2kqp2noZ6srKmorayioaGUl6ObnJCrqbCbn6KenpeYk4qeko2Sk5WPmJiSm6GinKSgoZWgoaOlm6OrpaKkqqOrrqStsammpaamtKapqK2ztbS5uq+qrJ6LcnBvYFtXVlVRRlFPSFpcT1JJVEtTTEVHSUM4Ozs9PDg2Njc6OTs6OTc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4NTk4OTg5OzlAOXu1tK20u7KwrLKtnaenr7m5s8DIurXAr8bJzrvCy83Jt8u/tMDHzLC2vci7wsfEvb+3urWlq7CunZqHjoN8dWlqam1oamxua2ttZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV5eXl9fYmRtjo+EkYaPkY6Zk5SSnJqinJugp6iqp6qlqKSjmKSupJSZpa+pn5uYmqCerpmbqrOfpaaeoqOglJOblpWSqKmtmpygoaCalJCMmY6LkIySjJaUkJ2hoKOcm6KVm6CioJeiqKOiqKugq6+krbelo6OirK2pqKuvs7iyvbWzq6+Yg3JyaFtYWVNVUkVZTFBcWU1UTlBMUFJJTklCPD8/QT88NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s62os7auqaivrZupqKy3tqy8yru2v6zMx8a5ws/QybXGvrq+xsu1sb3FvcPGxL3Bs7mvpquvq56XhoF3eG9uaW5ubnFnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVVFNOUFFZWlpaXVxcXl9gZH6NgYt/i5CKko2XkZeZoqCbn6qppq2qpq+ip5mfrKCVlqSop52Xj46Zna6Wl6eqmZ+dk6WgnZGQkpKSlaeqpJmZmp2dlo2Mi5SGiI2DkIuSlJCgnqCjl5WflZqgop2Tm6Wlp6iooLGwprG8p5+jrLSrraewtLC4tcCxrbGrkH1wcmJWVFVOUklHVlFTUkxMWE1KTE5SR01LQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo5ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OsprG3qqaisKudqqepsrGktsa0ubqzy8a6vMPL0cyzubq+wMTHtrS3vbO7vMS+wrG0rrGusaycoohraG5vcm9xa3BrZGZnZV5aWVpZWlpaW1paWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWllZWVxcXWFqgHp/domOh5CJmImUlJebmZ2om5+qpKSqnKeYoKWbko+eopqXloSDkZqjj5OinJWVloehmpqTi46Kj5mjp5yVlZebkJKHlI6MgYuNgJCKkpKRoZqfoZWTmJiVoqWYjJmkpqimoaC0sqeyt6Gdoresqq2ksrKmtby1q6uxo4h4cm1dTlBRTE9DTk5OUEtGTk5LSk5NUUhNSkFHS0hIQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjc3Njo5OTk5ODQ5ODhBN3e2p6S2sKSnpKmloKmlpLOqorLDtbWys8fHuLvEys3Hta+8v7i8xLOzrrairbXEuruvqqy0r6+gl6h9XmBnc3F2cWpuaWZoaGpfWFlYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU5NS0xTV1dWWFhZWFtdYW9zdnCEiIKHgJGDjoqUkZOdoI6am6Kgo5iklqGblY2HmJqMc42CfY2WloWQmZCTjY56mI6cjIKKf4mYn6KekJOYloSOgpN+fnOJjXqQhpKQkJ2amZqQlY+djqKjjomaoKGko5uitK+sr6yfmKW5pqWwobCunLC7qqmvqpmBdnJiVkxRT1BNQ1NOTFFNQ1BQSElOU01ISkpESkxFS0s8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNDg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd3t6GjtKilpaijpqWmpqazp6W0wLiwtLDKxrm6ws/Hv7WvvcOvsceyraeslaSuv7ixsJ+nra2rlpWicldWX2hnaWhpbmNqaGdiXFhYWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVdZW11pbHJtf4V8dE5Yco+Cl4aNnJeKk5Cel5yVlJaUjpaJf5OJXztXb3uLk4l/i5GMj4WGcoqEloF5gnqFk52Ug5WOkI+Chn2SeHFvhYx9iYCQjY+XmZiTio+InIiel4eHlp6aoaCXp6+oramonpattKKmrZisq5ins6GpraOSfXFtX1pOU1FWTERUSlBNTEZPT0lFTFFNS09KSU1QRklIPTc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5eLego66hpqaqoKepp6KpsKintMG5sbWwycO5tL/PwLqxsbjEq67Jrqejnoaborqtp6iWpqWkoZePlmlRTVJWWlpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1vaXqCdFBCQH+VkZF9iZSMhIqNmoyWlYqSiIaVhnmIf2BKUW54ipGEfISMiYR/f25+f5R3dXZ4hI2ZcFGNiIqGe354lHZnd4WHfomIlYqNkJKWi4OJh5SEmoyBhJKblp6clKSjp6mlo56bsauhpKSQpqqWoamcoqaoiHRrZV1bSFFRU0xJVU1TSUxMUElHRktOTE1US1FRT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj03Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMTUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXa2nKKnnZ+hrqGnqKWnqK+sqra8tri2s8K8t6i6ybm3qaq3uK22wKqim5ODj5myn6KajaCWmZSRi4xlTUxOTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+GgXuFjJKBkpmLj3uGj391f3hzbnVwdI2NgXl9iaqFeXpodnuOcHJteICKjJJ4eoB7gHZycpJ3Z3WEhISEepWJiIqMi4B/g4qMf5ODe4CPmJSblZGfnaien6CeoKmln52YjKekk6CflZ2epH9xZ2BcXEpWT1FHS1hST0pMTVJKSkpNUEhMUUxSVE1FSEE8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3OTU2NzUyNTI1NzIvMi4sLi8yMDAvLSsoKCkuMTI2MjE5ODc5ODc3NTo8PDd2rpijoZicnrOpr6mlrKywsaq9tLK8uLa6tbKgt7uzq52fraustbOlnpaSmIaUpJadjIOXiY+JhoaDZkpJSklHRkhIUFRUVFdXU1RVVVVWV1dXWFhYWFhZWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUlNWXnWDfXlnd42XmI6PfWd5gXZ4f4mPfISYkoFyh498dntva36tfHOQin97hpKAfX90ZnZ8hWxvaHN8iYyHgGx5cX1wbXWPcWhxgH2OcEOKhIKDhX53d3qLhX2LenV+jpKPmIqSmpujl5mdm52eop2WjYqkm4+dl46WmI51bWtlYVlXWFRRSlJVVE9QTlFWS05LTk9KUU9JTk9LRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXn56WoKavrK6rp6mwr7GsvLisu765s62om7GorZyQl56nrKekm52TiJZ+jpWSlYB8inqFgH9/gWVKR0hGQkBDRElMTE1RUlBRU1VUVFVWV1dXWFdZWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXlie3hvfHmIj3l8i4VvbYyReHN4amp/gnKWkYuBfZZ/SZKYbmh3foJsaWNseYWQkoZrc2x8bnJ7hmhtcH5zjYiDhXp9fnt2b3RzhYJ5gXdwfI6MipODlpeYmpCTlpeZl56XjIOJn5GKkoyGkJZ9bGhtbm1XVVdUUVFZT1NVVFRYVU1OSE1KTU5LQ0lOR0U/Ojg5Ozk5Oj48OTw7Ojo9Pjo4Ojs5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp6kra+iraqota+urLS/q7zCv6ajmpWlmJ6OhYyWoqSbmpSXj3aRfoWLkI98eH50fXh1d3xmT0VHREA8Pj5BRkdHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpyQZlvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX5wbX96i4h1gYiGdGyZkXRze2prnY5MeYSSiYSOZzF2hnNsfn2DdGZldH6EhIWAZmlsdWtwf3xncHB7bpKNjntzfXxxcG51bYJ+d3l0aXmJgoiJg5aTkpCLjZGUlY+XjoB5iJeIhomGf5CHdWlpbmdjV1FZV1hZW01QVVZaWU5JSUVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKSwsKyspKCsnKSwsMjI2LSs1Nzc1NDc4aU84OzVukoiZkZqWpKitnrKeprquq7KwwrK7w8ebl4+UmYuOhnqFkZqWj5KOkol0ioR3i4+Mf3Z3dXh2b3hzaVVGSUQ/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+zoHF8eG19bXGDgYWBeYSGhnlyoJR0eIBzdZSHNXGdqJ2OoaGEooR2cIZ8hntzjK2NiIBoZmJpbXFtb4N1aW9YdW+OmpF2bH96fG1xbXB/enN1bWJ2hH+GgIWQkYqLiZGLkYyLj4N1eIuPgH6CgH2PeHBubmpeWltdW1lYYF9TTltaWVhMSEpGSkc/Q0FCRz9DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp56vlaW0qK2xrsGzusHGl5CMlJCBiX1ugpGTioSLiJCIdoSFb5iKjH95e3txe3R8a29eSlBHPkA3NDU4Ozs8PT5AQkVJTExMTU5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8/koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx2iIh8fYWDf4x+dqKZeX6GgISZhZucYYaqn52LgpCNenaJfomHjnOKl4+De1xkcXR6e3eKbGdpYXlvhY+Cem6Bd3OEenBzeXdrbmldd4d9h3yIh4+Ai5OXg42GjYZ9cYR/hHx1d3t9iHRtcXJkZV5aWl1TW2ZeWFFVWVxWR0tLRUxHP0ZAREM/QUE9Ojk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyMd4l/lIyRnZ2fppGgqp+wqa/AsbvGupaPkZSIeoZ2a4CMkoN+i4WQjXmEgnWiho1+foKAc4OBfWx5bFNYTEFFMzExMjY2Njg4Ojw/QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXtxfI+Me3yJhn6Xh3ahmYiHj5KUpY2sqUiGra+vioCAk4qCi4KEkaiHgJiYipxzbHyBhod9jmhnZ3h+bYWGgYVxhIZHa4B3cXl2aG1rX3d9g4h/iIWMepWenIqLiZF/e3WLdnx3bW93fn1xcXBqWltbWmNiV2dlXFVQUVhaUURMTEdPSUNGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTg1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFh5GPlpiSl6CdrKGmuK+zvbSXjZKLmIt9dHB/ipN/fo2DlJV9hn+HpYeJgIOIhnmJi4B1hXlfY1ZMQzYwLi8yMjEyMzY2ODo9Pz9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYCEgoWRk36FiZGBmpaCoKGYlZuapa2Tmbuxp7vHw6eKjKGljpOJgZB7coOen5GcfnaFhYuPh5BpaG+DgHSMhoSLcYaCd4d/e3aFfW52dWeBlI+GiYiHiYihq6OWiY6YgHuCiXp6b2dreH13fHFpY1xZWVxoXGFmX1pPTE5YU1FJUEtETkdDSkRDQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg2NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnZwZ3iDe4CMgIGQj4uamqScoaymq6+wl5KRhKGUhHh3gI2UfX+ShpOWfoqBkpuOhIGCjIuCio6EgIqAbXBqXkNBNC0tLy8vLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1NUUlBPSERCPDg3LzlDPjw8NjMubJOXTVBISUtLS05WYGN/Z2dtdZ2bj5qTk4uNjpqIk4+di6ChkqOppaOsk6i2oqfBwq7Ir3i6lJp8jKGemISThIKPoZ6TmZKEioWPmJCWbHB1iYuBlYyNj3aPhHFshYGKlpKDhYhyiaGXh5OJj5CXpbapm42VooOHk4R+f2tqbH1+fX9xX1tiXllmalxsa19YS0hQU1FOTUxGSVFERE5GQkNFR0I+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuZ1lwg3B1h3F2kYZ+l5aalJ+fm6egqpaTmJ5oZqSafoWTknqBkomSkn2LhZmSkYOBgYuOiYaRh4SIhXh4f2hOUj4vLy4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFRU1FOUElFRD47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZunpqKZoZeilZyfqJ6pq5+orKmqtZerv6u2yMm3yNHPvpugcGmrqZ6Ek5GFnKCampmnkZGIlaGZmnd6fpSYkaGSlpeBlJ57dpWSq7OJjZegfZWenI6Tlpqko6e2sJ2RmaiIl5COgYhsc3N7fHluZl5bX15hZ2NfZ2dcUkVLS1FPSUpNRkZNQ0hMRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTQ2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYzQUBpYl5QcXVgbn1hd459fJSOjoqfkpeelpyqmJ6qQkR9h4mImI15go2Ljo18ioaPkI6Bg4CJjImFk4WChomBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSU1VTTlNMRUVAPD49RkhAQUA4NjYyPDk7RkhHSUlNT1FZbYaQd5WLo6eqtb24pa6srKiptayxt7Kyrbuxs76cs8Ssu8nLuMO/t6WjsLKsraqjipaYhaWmoKKYgqaZjaKqp6SHhZOjoKCqoaSpjpyxi5Wjp7e7nKGjsJOjnaOekaSiq7Cus7WilaaqiZqKkoqVent+g3tlXmZaY2BdYmJeZmdfW09ESUhUT0ZITEZLR0ZGSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo0NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoGUhYiCm4OSkYyS2sidlnNWl4iPiJyPfIaMj4uKe4iDh5GOg4WBjIaFiJKGgoSJhoeHh3FuYUBFNjQ8My8xMTAtLCstMS8tND9EQU5WUVJTVVVXVU1cUUdHRDw+PkZIQ0RAODs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHHxKuzxbattMCzuL62v7TBtru7pLjGqbbJx7a+ubSoo7StsLGbmZKan4mnr6qklXefpJehq7GzmJapraiutbuyuqyvtaKxrLK1vLi1rrWgqKijqJupsK2zuri4qJy4qY2lj5KToIZ5gYByV19iVWRgYGFeX2ZgW1VKREVMVlFJSkpFSkhFQUBAS0RCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxcWlFjZFd6dXGBlX2EhpN2hn6AjXu/u6O8grSUk46bj4SIj5OKiXqHgYyTjYeFgY6AgYqPhoCGiIWKh5F6eW5dV0BFTjw2OjQ2QUI3NjQvLzZDSENRXE9RVVhVXFdPX1VJS0pBQD5HS0ZGRDs+QDdENz9CSkpFR1dUUF6PpK2ksrTDtrjBzMq2u8S9s7TBt7jCtb+wuHSxtKa6xaSwxrmxs7K0qKS2tqqxoKKWm6KSpbGtpa2sp6SYoKyzuqKosrm1u77Mv8XFvb2zwre6uL+4uri6ra2xprGqrr6wvbzCw6yZu6iVro+YmKuJfoB5aFVhX1ZoY2hkVltjWVZUSkdHTFJHRElKQUlEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OTY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldUWVZad2pwf4+EgY6Fb3tyeIhiuaGZo4mVlJaTlJSOkJeSh4d7h4GOloqBhIGKenyLiIZ8ioKBi4SVfXh6dWVPXGRHRUw6UWRgW15TRj87SFBEWmNRUVlZWmdaU2BhTVNPRUE/SUpIRUZBQEM8RDZCP0hHS01TWlRelK+4tbu5ycC7vcrNvLzBvLi2vLu3vrW6s8ZhdbKlsZqeq76qpairqqSisrWgq6eelZaemJ+upaenpZ6jk6KnsLOosbK8tsG908nJ08bCxczCysPBvr6/vLy4tLC5t7fDusa+xMmwnrqroqyPpam3iYB8blxeXlxVX11nZlNZYVZSVklFRk5LQT5IRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFRSUE9RUlFKQTkvLCwsKisoKCwtKy9QPiguNDiAfTwyS4hxOT5DS0VASk1QUkxRXWhtbHGPjYaQc2xycnSI1cC1mqCNlZmZkY6XkpaWjoaIfYeDjZaKfoJ/g3l7i4SHe4t5gYqCl390fXprZXB2WV1cUGVlYmBlZF1bWFhcTWRtVVJtbl9vX1hnZVVZVEpEQktLSEZISEhIQkk5REBIS1RUVl1aXJO5wLm+uMbBu7nKy7u2ura4ubS4tbWutreZZHWpnq1wXqKtnJihopuknqullJ+fkJSOlpiXqJ6mn5+amYOjnaykqrCst7C8uNTQztbPyczSzM/OysfAwMLKvcG9wsDFxMbKwMnPtKS8sbWwnKy5vZp9dmlbXFlXW19YYWJRXGFUUkxDQkZHRTxARj5CSUJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LiYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RHS09EUlxaaWBvl5KRlG5sb3R1h7OsoaGfi5mcmY2NlZGbkoWKin+Ih4yQi4l8gYRze4qDhXuKdIGKh5V/dHt5bG11fGlzZWlsaGZqaWhgZmlpbVptdJetpL2Ih2dbb2hdWllUSEtPUEpLUExTUUhMQUpGS1BfX2JnamKXt8ewurS7vraxxce2sLmxsbuts7Goq7itjbaonpynmk6anoyPoJaRp5illYqTk4iRiY+Rkp2boZiblJaHnpmmmqyvqK+ns7PU1NTW0cvP09TO08/MxcLK0L/KycvJ0sjNzsPQ0riwxL3Euqa3u8Sif2thWlpbVl5WWWNZUF1YT1JDQklFQ0k7QUQ+Qkg/QEI4O0Q+QEk9NTY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OD05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2ZXc5CRmYNocm95eYOhqp6ml4ybm5iLjpWRmo59iYuFjoqKi5CIfISCcH+HgYZ7h3KDkouPfnF5dWxweH9ye254c2xpgHBtY2lucHlpd31+y7/D36duY3huZFthYEpQUlVOWV5QXV1NUU5UUVVUXG5ud4Nylq64rLWosLarrb3Bsqu1pqW5p6yvoay0pI+xrpuYmIyRlJGEj5uBjaeRnImDi4SKiYSLg5SVl5eUm5CbmJmZnp2rrKSnoqysztLV0c3L0tPT0NTRzsjD1NHIztLT09fN0tHF0tbGwc/IyMOpv7jQnHZrYlpfW1ReUVxZT1BUUE5JPkFHQkNGPUFCP0ZFPkA/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WHhot3bHdwfX6AoJ6eoYyNmZOUi4yTj5aFeYWQkI6LioiRh3+Ce3J+gIKHeoV2hZORiYBvd3Nsc318d3xzgnhxa4Bycmlwcnp5cnu+y5p/jbKEdnKFd2lhaV1DWlpbV2ZkWGVrVFhdXWBjXmN4e3+LgZmqpKSioKGppqqxuaumtKOirqKkrqKnsZ+JppuVk5GKko+IgpSJa5WijZmEgYZ+kYODk5esi5WOlZqOhZKQnZensKKgoKWkqMjNz8fCy9HT0dTSztPNxtbTzdTY1tbY1dfVytTazcrY1tHLrcTDy4hvbF9cXFZSV1JaT0pHSUpKQDs6O0VCRD1DRD5IQz9DQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lwgHV+aXN5coKKgJ2VnpSFi5aJj4qJjoiPgHiElJmLjYiIi4l+g3hzfH2Eh3eAe4eRl4GEb3hxbXV/dnh9dIZ8eWyHdnRufXaFdXl7nbWMPEGLxqV+jX1qZVdJQ2VjZmNoamRveVtfZmhrbmlugYOJkYyen6CekZeZoKOkprKkpbKgoqWfoqmhorGch5+SkpORi4+Lh4SPhH6cnIyNgoSFepR/gqqWo4ySi5iTi32XipqRqrOYmpynnKa9w8W4tsXN0dDS0MvSy8nUztHV2tfX2NTZ2M3Y287J2trS1r/MzbR1c2thWldQU1BYVUVHSklGRT06NzpAQkM6SEVARURCREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MiooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qj48OVFFQ0pUbG5vcGJxcXSGjX2XkZ6LfoeSgomGhYqCiH14hZeXiY+Dh4aHeoR5cXt7hYZ1eoaOjp16jXB9cHB6gHJ7gXKEh4Bujnp1d319gnV/fIeJsHRZqsK3jZKBcG5jPV5ocnBxcG53d4JlaW9ydnhyeouHj5OSm5agloiMk5yfm5+roKGsnKKamqCmn5+smYyajZGTjoV9iIeDhYuOoJmTiIOHfmyZeYSZhoiTjI6VjIZ7m4iTjq2qlJWXn5imrrW8qK29x8vIycvLz8nE0srU19jX2NfU29fT2dvWz9va0tbJ1cyTdXdlZFhXTlFSW0dDRklIPkI+PTg6PkA8Pkg9QEJBQUVBPj86ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEE8OjlEP0NHUmtfbWRiZmx2gIhxkZCbgHmAjn6CgYKFf4R8fYSYjoeMf4aHgXeDeW57e4eCdHqSno6hdo92g3R1gX50gIRvgZCCb5KFdXyBhXp2h3yJuMalw8q4gpacj3hwZU5lY4J6gneFoZCLeXp3e4SAfIR2bZSWlZaQmJGDiY+XmpeXpp2YoJefk5KXo56aq5aRkYuNk4OMhYmJgYaPkZ6cmYiFi4GFl3qIiZ+Xj4mOiouCfKGJkIq7oZiTl5qcqKalrZ6ntb+/v7jGyc3Oxc3J0dXV1NnV19vU19na29fb2tnYztvGg3Z2ZGZhXVJVVFRNS0RNQzs9PDw5Ojw/OT1BNz4/QD0/Pj05ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs5OjdIUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWZhXVxpdHp5bImNknd2eot8foB/gH6Fe36CkYqFhnqFiHx1fnVtfH2HfnR/kp2Rn4OSfId+eI9+eYuKb4ObgXSZhn2CioV8fpF7kKmPkMOgvYybpJx9iYV9iXOMi39zppqcmJSFe4+RiYRpR3GhpJ6MjJGShYiLkJKVj52bk5SRl42MlZ+dlKGVk46OkIx/kI+Oi4SJkpaZn5+IjJSRnZCCjH+mmYiFjoOGhICkhoqLt5edkZSWoaagnZ2do662ubSrwMbK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbtnZ1dGdmYlRdWVJOTkhDTEM9PT45OTs6OTk8PTZAPj89PTk6OjszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw5RFdPPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PERSU1JYX1ZYZm1tbWmBjopxc3mKe3uAfH98iHt9fIuHgn51g4Z6c3pzbYF+hX53hpuhm56UkoCMiH+Yh4Cckm6IqYV7oIx8kY6DiYScfpuRio2jop+RpK+gi5GLhYuBk4ZXcq2Ln6ubkIOZnJCPjluDopGCjZ+TlIyGiIySkoyUlZWQjI+KiJabnY+VlpKMk5SGgIuJko6Kip2XmKOihpOdlaCLiomOnJCDiI+Ag4eFpISLkLKYnJKUl6GgnpmSm52nsrispb3Cx83Ixs/Lz8zO18/R1K7W1dja2Nra19bZ2p1seXFjY1paVVFVVkNASUM/Pz46NDg6Ozc6OzozPDw/PT43Ozk6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xBOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs5ODo7QDtCUUtLU1lQVGNieGxifpGDb254i3h6f3uBfYd8fHeGhYBzcIWCe3V3dnSFg4V9f5Kmop+mopeKnZCUl4uKqJdyirKNhKiShJmUhZqMo5agmJOJm56ik6mwoJGVkY6OiJaMb423hJrEyLKcoqacnJiWkbGQZKTNx5WOhoeJkJKNjZOVioWKioaWmZuPkJSTh5WYhICPi5mIjpCrl5eko4iZnpaaiI+Hl5eKhY+NgX+Hj6WIjZOompeTlpihmJ+Zk5yaorK0paO8wb7HxsXIyMnCytPMzdSo0tHW1tbY2tTT2s5/b3tkYFtbW01IU1lCQUdEO0I+ODM3Ozw6OT42NDo6PDo3Mj86OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFJXU1JCY4JHdoGOfXxtfoh4en57goKDf3d2gIN8bW6Lf3t9eHh8hIeKfouis6ejq7Oil6efpaSWla6ig5G4lZKzmoyhoYylm7CjpJ2YkaeWqJmsr6SYlZaVkIuYmpehwI6jybirnKOmrZiSm52ynYWGqKOcmIWJiY6VjIuTj4iBhoeJk5iVjIuUk4eUmIaEkZCcdZGZspWWpKGHnJmSkIuQipebiYuWjoZ9jJieiZCQm5qak5iXn5OgnZSem6CxrqKjt760xcfEvcPDwMbNysnTps7M09LR1tjT0Ni6b3ZyWV5TXVROR0lNREFDRDU+Ojc3Oj88PDc9NDI2Njk3NzQ+NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg1Njc9OkpGREdNWlxZSmZgO0iEi3p6boWGenyEeIGGgX5weHx+fW9zjXp+gnx4houJhoSSprusqLG9sKWts7Ooo6KwrIqatZ2juKWVraWXqa24p6Sjn5qpmKqkrrCqmpmclJaRl6CYmru7rsqhara4q7CUmZ+jrJOXvqNeqrKDioqNlIeQfI6OfYOGjo+UlYiIk5aMkJWNi42WmJOdmbSWlaudipyUkY6RkoyZm4qSnpCLiZafoYyUjZeZnZKbmJ6UoaCUnJ2lrqihpLO4rMLIxLW6vbzFx8fC0aDGyc3NxdfW0cvTn213ZVlXUFtPTkVDPjxCQUI4QDg4NT9HPTw1PDM1MzQ1NDU0QjQ5OkJNOkI7QUhCOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRIYmBicEpAi4p+gHOGh32CiHWDioJ/bn18fX9wd4d3joKHfI2PjIaMmanCwK+9xruztMC9tK2rs7aMqLKurr2rm7ulp625uKumpqKipKOpr7Kxqp2cpJmbmJefoqalkqS6r6nAvK2usrmlpKh+iIacrb2wgouMi5CDjoORj3qBiJCNjZyJiI+XjYuVlpSRmpedqJqxmpGsnI6aj5KOlZCQlpePkaCRiZSbpKyUlo+TnJ2ToJ2bmJ+hlJqep6akoqOwsqbBxsOvsLq3xcTDv82mx8THxL3W0M3EyoVwb15ZV1xYTEpBS0BFRz5BQEM7OjU+QT09NT02PjMzMzI0MkExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OzVCPjc5VktEV09GOD00S0BDPjRFS0hOPkFBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVONzlHRD9DRlxlRmBpZ1pdXJOMjIl7h4yHg4x1h5GKgW9+e4J/cX6Be5V6kpSUmJCTlqezxsm/wczCw7nHvbuvq7m7mLO3urLArqXApKuvvL2qrqujo56nq661sKqcoKucoZyWn6+1p4ujurq2wbysqZ2zpaSolIWNqsPDpIKLj4eIhIaVlI15g42Rj5GhjIyUko6Jl5+Yk5mVl6agr5yMq5yNlo+RkZWVjZGVko+glIaXn6CynpSZk5+gmKSemp+boJSYnqWjpqakr62lwMTDrqi3tsnDvrbPssS/xLyz0crIwrRxdWlZVVlnUUxIQkxLS0pBQj1DRDw1QUU7OzM9OEIzMzIyNjJBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJlWk1lXGZUYmuZjZaKjIiTkIaJeYeUkIFygHuNf3iHgoKQeo2hlqiZmpm6vcfIycHSycvCzL3Cs628vqi6wL27xLeswamss7y+qrCqpKWkrK6zrba1oZ+vn6WimKOzvaqbqL3BpLa4r6yUsqysrJeGmqmmpZGCjJOlloqBdYqSeYWOkpCeoJOPk4yPjZSjmZaclZSjnqqekaWajI+Pj5WWiHyPlZOSo5qVn6KctaWQnpako6GlnZ2mmJ2Vl5qko6mnorKsqLvAw6+ls7fMv7mvxLO7vsG4rMLDwsCXanZeVVRZWEpKTElGRERIQ0NBREw6NERJOjs0PDhFLjEyMjQyQjI2U0hPPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+aUhfWGJaY2NWno+cjpeOnpKJin+KoJOEeIV/ln9+kIiKkYCWoZmup6SYwr3Hw8fF087Ozcu8wrewury0vcu7w8K2t7yts7+6va6vqKCpqLatrqmyt5qeraOnoZ2rt7iqpbC/xLK9ubSoq7a0rq6XlqWsqJ+RjZKyxaeWjnySlXyHkpmPqpmYk5OPkpWTpJ2TnZmToaOinJifmIuMj46diFqQl5eSl6SZZZiin7OllaGVq6upppueppaYlpiUoaOopZ62q6m5u8O0pbS1y8C4qrarsru4rqi4ur24gGhrV1RSU01FSVJMSz9BSEVFSEdHOTVGTTs+Nz1ASi4zMjAyNUM1NU9WTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M9NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs+QEJGQnBFaklSZWFMRqWUnJeil6mWjJGDiKaTiIKHgpyEg5WQkJSPmqKer76voca8xMTGxs7PztLKvru2sbq7u77PtcO9uLm3s7G1s7izq6ecq6y5qqmnr7CYo6+lp6OltcCwrKy0v8O6wLq0p7q2ubSvlqWtrq6ki5OUoY10wpp9l5mEjpeZjLGVm5qVkpKZmaWjlaCbl5qpnZugoJmKjY+VnGBKlpyalJqlllSWr5+vnJ+klK6tqqSaoKWTk5iYjZyfp6KZtKiqs7u7u6qxssfAuaasq62ysqOhsrK0pG1qYllXTU9KRE9PUFI7SEtJR0lDQz46S1U/QTo9RU0wNzU0NDpCNDRNV087SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzRFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiqlpmgoqivmZGXh4uolo6Ik4Wgh4Sdl4+doZqjpLXJtanFucLDyMrIyMzNxr+7s665ucHBzLXHusG5tbqwr6+ztaekm6q0tKqppq2smqSupaSorLu/qKy2t7/Bv765s7LEsrm+raOvtay5poibl6abdr+fhJmdjpOamoyul6GcnJeUm6ChqJ6on5maqpqhp56YkI2RnYNudpKimpWdop2RrrKjqpSoqpepraOinqSnkZGZnIeUnaKelrGmqau5tr2ysq6+ubago6eopaacm62pqYtgYl5dTkpLRkdNSlZMPU1FTktMQkNEPFFWPUFBQkRPMTg9NzY/Qjc1VVhPP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li1SYE1VSH5lXkhFq5Wbop+7r5mUn4yTq5uRkpOJq42GoZ6Mo62Uo6O2xr60wLnCwsfJxcLNyMG+ubKvubTAwsm1xrLCvLW6qqitrbCjo5iqtLumqaarqp2pr6ejqqu9u6itvbW4vse8t7a4wrK+wbWqtbarvqWPo5iSoqC8n4maoJmXn56Pt5+pnKWim5yhmqiks6CbnaacqKqemJWPlJuLlomMpKGUnaKdoLSvpaSSr6uZqqqcnKOiqJCUlJ+Cj56em5WppKGhs7S6tK2otbKznpyjpZqXlZiqoZ51XVpdW0hHRUZMUElNRUdHQlNMSkJFR0FXU0NIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkVASkpOTzlDQDU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE5ZlxGQ0OdcGJHRaeXo5+ew62cl6WYmamclpqaj6qWlaemla2smKKrtsPDvL62wcLAx8S/zca7vbmysLmzv8LHtb+wvLe5tqakq6utoKGZqqrEoqSpq6aerK+roqmpvrinrb+yuLfHtrW5uMCywMK3tbO0r72jl6OXlJyUrp+QoqOlo6OgkL2lqZ2pq5ycoZulnr2hmaOfoqmroZ2XjZWek56Hj4SNk5+koJ61rKaclbCmma+lnJmonJ6MmJSeg46gmZuSpaSal6uxtbGqpaqurJuYoKCSj5CVqJ6UZV9XX1tNSEdJTkxIRURJQT5RSUE8R0lJXFJPSz1IT1U0QkY5PkhHNUNhW0tCTlJVV1ZRWFRSVUlAOFJRUE06R0E0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTY/OTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW1SRjxLeGVhVkuimqOcnsWsoZ6sn52uoJKjn5akoKaprJi2saKqs7bFxL2/tcDCu8jCvsrHtbi1tLGztLfBxba+sbi1ubSfp6yqrJ2enqWkwaWfqa2gpKmtr6GmqL21prG9ube2xLK0uLq/tMTBuLmus7W1o52llZKUoa6gmaKeqaiso5rCrKmerK6bm56ZpqC9oZ2kmKurrKahmo2an5KeiY5Xf5afpaGguKqnk5i0op6xn56ZrpWdjZiTnIGOn5eVjaGjlZClrbKqqaKipaWVlZ2Yi4+RkqSeiV9iWGJfS0dKSk5GRUFHSz89SkI5OUpLTl1RUUk9TFZcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUlLP0g/NUhNWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNaa1dyR0U2PXVlXEtNnp6hmZ/EqKWhtKKds6eTq6Wgo5+sqaydu7CorLaxx8XBwrLDw73GxLzEybyvsLatsLSvvsS0ubGwurSsmaixqaqanaWhp8Gtm6yxm6qjrrCppam8tqe3u76vt8Sts7PDwLTHtLu3rLO2raqippaVlaSsop+gm6eqsK+vu7GmoKmompmYk6KjuKCho5Kwr6ylpp+SoZ6Vno+QjZWem6Kep7SnpoyXspuirZmcmqyPnZKVkpl/kaCVjo2foJOLpquvpKainKCekZGak4WLkY2bnX9fY1lmZElITElTQUNASUg7O0Y/OTlPTlZeUlNKPk9eXT1IUEJMTEk5TWNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwyNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF5lcUA4O0iWd2VBNJ6jn5ygw6mkqrOipLWqlrOsp6GksqyuqbuyrbG1tMbAxMK0wMS+ycS1v8jBtKu1qK+4rL/Ds7eurba4pZiqsqurmJ+ml627tJuosJqsoK20sqirubKourS5s7jAqreyxL21xqi/r622tamnrKGYl5KmpaKimJilrriusrW2oJ+ppJqUlpSkoLeipaWWr7Gyp6umop6ampuVl6ifoJihnq+yoqaMl62YpKuWmJ2ij5qMkpaYhZWek4uQm52TiqipqqGnoZielYuOmY+BhZSIk553YmdbamlMT01OVD1CQU5DOjpJPzc3Uk9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDEtLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDVJb2hVQ1dGjHlmQzujo52hpr+np6+xoqm1q566sayjq7S2sbC5t7C3uLjEvcPHvb3EwsbAuMDGwLmptqSsu63Awbe3qq2yuqKUrbGtspakp5GquaqfprCcq6CvtLOrqba2rbyttLO5t6y4scO7v7+mw6uwtq6oq6unnpiZq6GioZGYobGvs6ywuZqbqZ+al5OYp6C2qaajorCxtKyzp6yfnKCgm56lnKKXnaOzr5ufkJOkmZ+omZOhnZOWiJOWkpWWnJKIkJqYlI6pqKafo5yXm5KFjpmLfYuVhI2ZaWdrYGxtV1BRW1VBQkVUQDs7SUE3OlhQZF5QV1dFWV9eTUxSTl5LSj5ZY15OSFBPXFVZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERkJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEtLS4sMT0qJys9XHA9PjEuMGRaZEAxNjQ3Z1lgRig/OGx9Z1tWO4l7Y0M9p5+doqm9oqqwrKSyuaqmtrSsoK21va+zuLu6vre2wMK/ycS5xMLAv7fDvcC3rrWnq7exu72+tKmusbaelquup66XpqiOp7ufpKyznquisbCzrKm2tLW+rrGytaywtLPBusW3rL2wsberrKqjsqaepaqgpJeRmp+zqrOrq7OanaecmpWOoaaktK6ooa2urrGotK2yqqScn6iknpWimZuotamXmZKSnZmdn52QqpyVloSUloqdmJuTio2WlpqWpqWjn52WlZeSf4+UhXuNkoKLlWRrcWZvcV5GWWdWREJNWERaOUhCNj5dUWhcTlpdR1teXU9NUlhkSkpCXGJfUExNTlhXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7RkRGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2BVMTUwPWBWXjgpQzNZVVxnSzaMemZMQKSaoaWtt6Wsqqavrreqr7W7p6axt8W3sba9wcO1tbrEvszGucPAub65w7jAuLK0q6m6trq5vrSprbC1l5inrKmsm6urjqu+nqutsqOroLGus66ttbK5uKqurrGota+1u7zKs6q3tbG0r66mobSgm6itoKaWlpuasqOtoKavl6GkmpqTjqOlp7Oqoaazraq1pa+yta+kmZ2sp5qYn5qZq7ejl5OQjpecoJeWk6qempF/kpeMnZuYlZCKlJKemaSioqCYlpKTlXqLj4V7jIqCipFqbXdsdXphRmFrWUlHWlo9e0pGRDZBYlRpW01cYUtcXVpSUlJiYExLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYpKDkuJDpLNS4iVF9UXy81KENfUVwuK0IvSkdQW0czY1lUS0SZl6GxqbKqrKakr662qbe1uqSstLfJu7S7ur+/tLO3w8DMyLzDvLa9vr+3vryxvK2nurm3tcK2qq2xt5SWpq6rqKOwqZSvu6StsbOnqKOytbGxsLWxuLSpr6yyp7evt7TExreptrassK2pp6O2oKCnsqGklZyalbGep5ygqo6po56blpimpqW4qKOytayosaeusbWspZmgrKibnJ6clKm4m5SOjoqXm6KXj5ekoJyTgpCUj5ybl5aViJaPl5qnnKSgkZaRkJV2hI+He4SBg4uKbG92dHt+XExmbVxKTmNcPmJ7R0k4R2dXZlxMXmJNWFlXVVdUaV1PT0hgXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOR2YyNydHYkxWJS1CLj1FTFE8M3JrSUNDkZmlr6Wur6uopbGztKu3srihq7W5ybmtwbvCuLOxtcLCzsXAwb20vb++ur68ssOnqbmwtbW/vK6ssrGboKexraamr6WdsrWtqrGxrKmotbustLK1rbStqqyorKm4rbKwyMC5pbqwqayspaiusaalo6+kqZyenZuvmqOjo6ORrZ6joKCiq6amuaWstralq6yprbC2rqKeo6mqm6Cbm5Kjs5mOio2HkKGglIyUnJ+SkIONkpKcmpeVlIeXkpWZp5ufnoySkY2Qdn2NhXx7fIWIiHBycX18fVxTZG9eTlhmXEZElltHO05tWGJbTGBiTlZXVldUWGddUVJMY1lbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvKzEoKSssLSomNSovJjApMzg6MSYqM0JjOjYqSGVISis6SD4zQkhTLD6QaztHSI+cqquiqrGkqaWztbK1trKyoauuvcy6rcC6x7G0rbTBw9HFxr7Asr7Awru+t7vEpqy2q7K3u8Cvq7Gsn6OnramopLCjqrKqsKuwr7Cuq7O9p7awsqmzqqulpaOtuq2qssO6tq27qamnrKmnsaWqpaOuqqiin5yjrZWlnpiemaydoqepoq2mpK2ruLOyoqqioKyvsayeoKenqZmjmZmPoKaXhoSOioueoI6KjJWajo2EhY+Un5yUl5WGlpSTl6SbnJyKkpCNiX9+h4V8dn6Fg4RycXCIdWtfWmBuYlFycFxLO4R8Rj9YdVhgWk5kW05WVlVXUVxhXlNPTmdYV1ZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMjU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE7XEowLkpnREY4O0IwNUVLWDFAlVk9TEWVmK2ooquznKqqsLetuLavq6arq73JvLC9tsKvsauzw8POz8O+v7TAwcO5v7PHw6qutq2yuL6+sq2tqqSnqrCop6ixpbSuqrGurrKxtKy0vKS3s6ysr6irn6OesLerqq26t6W3tqSqp6uqqq2hqaensrKkp6WhoayXqqGVm6CmnqWiq6Stop+nsbiurqSmo5uqq66pnaKlpKSYn5uWj5ickoGCkImEnJ+Lio6LmI2OiYKLl6KbkJCbjJOSkZOjmZuZio6Li32GgYGDenN/gn98cnWLpId4a19gbmZXZIZjTj9nk0xFYnlXYlhSZVRNVlVWVE9cXWFVS05oVlVWSUpISU9CR0lTUVlvQU1YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjM5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlZaLjBKZ0FBPDxCKzpKT140RIY9R0ZEl5OwpqOrsZirqq22rLayrKasqqm8wMC3uLK7taWyr8PJy9G/wLu5v77BuMG5wMSssbSxs7q/vbKwrqyqq6i2qaaur6q5sKiysq+yrbequLims7arrKWpqpyjnrOzqaiktLSgt66gqqiqqKunoKusqbq2qqqpqaKqoK2bkqqhnaCloqajqp+dp7Svqaero6OYpaenqpyipKOgmZigkY6PmI1+h42HhJ2dhoOJiY6NjouChZSimo2NmpGSkY+Tn5eYloyKg390hoF/gHh0gn54dn2Ah52Pb3JnZnB3XGByh2pPXplWSG15VGRWUWNPTVZUVVBPWFtiVUhPaVRWU0dPWFVJPklIT1FQeExNVj08S0Q/QEE8QENVQzlBSz01O0UxMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzJRYjAyP2Y9Tlg+Qyw+TFRfL0ppNU9EPJaOsaKmq6+arKWtsLS1sKymsKqour67wLCtua6htq/Ix8jRwL69u7vBvbrCv76/rbGxsbW8u8KxsbOqs6mktKilrbOzubCjrriysLO7rLqwqa22q6qfqqyfo6C2ramhn7CzorWqnqinqaOqoaKtrai9r6yuraKoqJ+smZCwoZiioaion6ibmaqxqqOgrqKhlKOjo6eYmqilmJeYno+Kh5SIfY2GhISjloSBgYqFjouQg4OTn5aIkZyQk5CNkZyUl4+KhoZ3dIF/fHV4eX95cnJ4Zn+GpHZpX2RpgHRmiIt8U1hvXkp4c1NkU1FfTU1SWmZOTVZZZFhHUmhRUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNSkoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwTGc6NDhfPWFkP0YxQ1BbWypITTlVQDSRkLOhpaatpKekrae1s7KrpbGnqri+wLuvp7mqpq+xycfI0cO8v764vb68yLrAt6+vs7G5u7jAsrK6rLisorSnqKyytrmzqKi9tq63vrC+p62stautnKmvo6ClrauonJ6rs6W0qJqqp6mjqJ2jqaipvqu0sK6dqqShr5ybs6OWpJylpqClnJupq6afnKuinJOcoqWemJeoqZKYmpSQioKPhX6Pg4CInY+Ffn2Lh5CNjoN/k5qThZOhjJSRi5GbkpWHiX5/cnt6fnxoeHx5c25ve2aEeISJZGFnYHKEemxmeF1eVD9Xe2xUYVBRWUtMTnJ1XUhaW2dZRVVlUEQ+Sk5EQ0E5SEdLUz9qYkpROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEnLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mYkFKN0dTYFUqPTlEVz0qkJWymqCgqqaloauluLOzpqmxpqy4wb21r6K4raiosMLJyczBtr3AtLe/usi1wrSysrSxvLi5vbWtubW+raCzp6ursLa4tayfv72qs8G0vKGvsrWqrJ+tsKOcpqmqpJ6bpbCnsKCfq6mnoamcpamhrbyorrGuoaujpK+en62ml5+aoaSdn5yapKujnJulpZaXlaCjl5uXpayMnpGRkYuCioCAjoB7mZSMiHt+i4WPjYuJhJKYkIaUo4mTkoeRmpCTgYh9eWt+dnl4Y3x6cG5vcXZnf3NphGhlZ15sc41sYGlvYG89WnhsVV1OUFJLSU1UWldNXV5sV0RXX09eUEhNREY7N0hFS088cmhLSzlBRTs7PT07Oz1KNDlCPDM7Rzw0PzE4LTY4OzIoMDkvLDQvLj0tKks+KR00OSYnLjM0LjArLzQmLDokNDFBaFkxNFM9ZV9ETDZLVmRPKjsxTlc9I5SZrZqgmKilpKCopLiwr6SvsKmruMG5sq2fua+rqLS6yMvIv7bCvq+0vbfEtsKxrbmxs8C0ur23qLm4vaqjtKipqrGuubGrnLy9pbDBtreir7a1p6ansLOfnqSmqKKlmZ+sqKmeoKqupqCmmKSpoLG5n6Oxr6Gsoa2knKemqZqam5+llp2dm56qp5ecoaqTmZSZn5OZlqGpkZqJjpCGfId+go19fKCMjYh4gouEiYuLhYeTmo6JlZ6IkZWCi5eNkX2FfHNwfXF0dGB6eGhtb29taH1xYnttaWViXGSEfl5Zc2pxSkl+aVhZTVBMSkhQUlFJT11fblNEWFpSaE5HS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy46OzgzJjI8MCw4NUIqKS1CKiw0O05OQDs3My0uKy03Kio8JTUzPGZkMjRNP2VdRk89UVpnSCo+L1dVNSiXnqeanZeuoaGhpaG4q7KltLSpqLnEtbKtn7etrq2wtMbIwLa+wbmwtLy2vru+r6q9sLS/sLzDuai7urenp7WpqKyxrbSxqJu/t6auvbeyn7G3sKmlp6+xm6GkoKWloJebsKehnqOor6GfoZOlpaO3sKGmsaufrKOvmJyqpKmfl5qepZSbnZuep6uanJ6ml5aYlp6Ok5eiqKKQiYuPhnqEfoSKeo+WiY2GeIGHg4eLjYWNk5iNj5aZio+XfoaXjI95gnpwcndvb3RfeXdkamtqZ2eCbGVya2tkZ1dhcn9eWWt1aVlFfV5bWE9PS0hIUlVHMjpfXm1QRFdVWWVMSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0SEJmW0hUQ1RdaEUuOzFeUSwylqSjmJadq56moaOhuKqwobu4pay9xLKvrqK1r62tr7TExL2zvrq3sLO5uLq4uq2tv7O0uK6/wbervbq0paKzq6iqs6yusqOdw7emqri3rJ+yu6qnpaivq5mjp5ylppSYobOmmZ6kqamcoZ+UpqCkuaikp62mnqWhqZOfqaGhoZmbnqGTm52XoaOsnJybo5aTlZabjpOTo6ekkIiKjoZ5hHyFhn2cjYmKhniAg4eIh5GFlZOSjJGVlI2OlHuDl4+Kd398bHVybWxzYnl0Z2ZpZmNthGZnaGRmZ2hdZGJpZVplemJgUHJUW1tSS0pHSU9TQCAqal5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTj8uKy03LTExOTUsJi41LTgwNTc2YHRCM0NEaFtLV0dVYGhCMzc3YUwnMp+kpZOPpqecn56epLatqKq6t6erw8C2r6yita6nr6+3wcC9scC2sa6ytrW5uLWsqryzr7KwvcC3rry8sKSftqymprWqq6+hocWsqaiytaystLmdqKqrsaWYnaqep6WSmaWto5idpKqhm6GcmKGep7emr6qtoaGenaKVoKafoqCZnJuclJqelaafrqOYmJ+WlY6VmIyPmJqnoJCHioqIeIV3goKCnIeKgoh7foWIhoSQg5aVj4+QkZCRjZJ7g5WOhXN/fWd5cGxrbGd1c2thZ2Nic39hY2VmZWhoYWVuWV1YXGxjYUxnV1pgVklHSEtNUlg+OWBsaUhCVVNcW0hIRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyssL0EqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQGJGJTWdpKGSjK6hmpmgl6W0sqOyvrehscW7ubCwo7asq66pub69u63Asq6vrraus7myp6u5sK+utLa7tq+5vqymnbWroKGypauwn6bFobOmsLKxt620nayvrK6imZ2nqqWelZunpqCZpaOonJqem5Wdna2wprmnrqKhmpqemZ+jmqWdl5+Ym5aboZOql62pnJWenZSNlZqOlZSYp6eNjIqJjnuBdIKCi5iFhnyIiISFioyIkoWUnJKRkJCRl4+Qf4GNjoJvgn9neW5pa2pncXJrW2hjYXF/YGRnam5rZWllY2xcbGx1cGFTYmhjZVpJRkxNT1lRUFVhZYFUQFZSWlRGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDo1IzMqKTYuNTU0NjVafF0xOktqW01bS1hkY0BBMUhiQic0lKOcj4+xnZyVoZups7CfuMC2oLTBu725saa2sKmupbi6uLisu6+sq6u3qrW5raSztbGvqbG2trGztrunqaC2qp6fqqOqrp2sxJmvprCxt7asq56wra+qopudpKypm5WcpqSdmqqjpJaaoJySnKOsq6m6nqakoJeamp6hj2ujlpmdcYOYnaWBdpKsqZ+Wl6KSipiZgJeKn454hZKNg21pfneEcWyGioZ9hIqGb11kYGeEmIZri5CUknV4i4R/g5B/ZoiAaHZpZldcaXRuTlBqY2Vxg2ZdZGZua2hdW12JkIWHaE5LQzhFVGdeSkhQUFVWS0hSYXB0ZUZbUVVQRkdGQz4xOz02PTY8M2ZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjc2WIFsMTVPa1tOW0tbZmI+RzFOYTwrL46kmoiWspudlKGcqq6so73Fr6m3wri+vK2nt7Gmq6S4tLOzsLmtqaestKWxtaKnuLa1qKettrOutK60oqmftKueo6Wdp6ibsL+VqKewtbmtraOorKurpaGfnKGop5uYoaWmnJynqJ2Tnp+ZkJ+oq6S0r6Oio5yWmJmXo4ihj5KbiKGIlZ+igKWAqK2flJSelImEcniMjoOIoHWHjWmXiWZ+c3igb4eHhH6MfH+hoJ+Zf3yHn3SIjnabimyHgoNtaGRke21yYlSGbWNtaZhxWGlvboZXXWhaa2paiHBseXKHaIeEWV5GTj5GXk1FUlZWUVBSV1RnXkxaTFJSUEVGRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk6LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdDE1UmtbTltMW2dfPUsxVF43LyiNp5iEnqydmpqdn6uqqKq+w6+yuby3wb+qpLexqqyms7Wur7O2q6mlsa2ltrObrLW2taWmqbOxrbKorp6qobOpoKSlm6KlnrG4laanp7e9pqymqamsp6Whn5mhqKOZmaejpJicpaqWlKKclJOkpqehtqSjn6OYlZSYlJyIrpCYlYqqjJmjnYaxgaWun5WboZd6gtSof4eUwJvGeHexpbeWZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4Fsl7GrsXlobFixrm5labySvG5oeW1xj9h9UmtitrJ9fnCUdZqhqpBWTldhT1ZORlVcWFBQU4tbV1tQQFxEUE5DRkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkFFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cxMVRrXE9bTV1nXD5MMVpbNDEhj6eUgaiqn5idnqWtsqqwwr2ytcC1t7/Cq6a0rq2pqLC1qq+2tKioprWlqLmunLKytqqlpKeyr66xpquep6WypaKioJecoqCyr5afpKG1uqOpqKCsraSinZqao6mgmJypoJ+XnqiokZynm5SeoqejobCjnp+jlpeTmJKZha9raoyOqn9ohZaHrWZxn56Vm6mXca6hpH53unxroI92sV9qtFulgGWckGBmgXpmf2l4aqllvnJnpox2sWp8sXh1kZRjbW2nblyEoEVpZ4eWRXWcYH1me6OmgVhfi6tofY94emqoOEqvW1hUbGNaS09YX1xWVjtOh1BXVi9JU1NKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy8uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TTVeWDMxG5KilYOtp6afo6WrsrittL2+sLfFsri6w6epsKywqaqxr6SxurCkpa+zo6q5qZ2ysrCjpKCqrbCsr6aon6OisZyknpmWmZ2esKmYnKKgtbOhqpuhra2fnZmXoaOpnZmepaCcmaGopI+copqXoaCsn6amoJqfoZaVkZeRmoa1m7V5h6matpl3h7Obt3+Ul5isl39rgaZ6gYWGkZSSd6tnarFbrHuOh5R0iXCOhoB/iJCXeIOCipeMg6CPhbB2d59xa2ttfItPpVhIY2OZfmNopV95cXVSkoZdUKluY3B6hYBhnS9Som5bVGtnYExLXGRYXFpCPrB3V1hBI01pRkJEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQUFEPEZEOzAyMDE7RSwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0o5YVQ1MByXoJSJs6amoa6pqLOsqru3wrC8w625tsKrrK2vr6ivs6qir7yroqi2raSstaSlsrOoo6Kdp6qzqbCopp+goLCXoJuWlpeboLCknJukqLWvoaiOqaeqm52WmKGmqZqfnaOgnKCjpaOWm56Ymp6jq5ymmpyaoqCXk5GTk52E1ZOZuXGxwn/Gh33WlJy7fZyXqJKPnY2ke42GooGlgnmreY+dVq97iX6farlauXeGhH2mgpR8mXqqeY6dkHuxbY6EdJC7hm+VUK+nxYpRoHpjYKpic3KGa5aHXlK1tMiFfoh8Y6QzQp11XVBqaGRQQFhmWWRhSkdMakpaU09ZZlpDQz9FPzA8PDU5PDc0PDs4PTo8QzpGOjs+NjpAQzs2QE9MSDw5O0RIQ0JDRDxFRjgxMjExREIuMDA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0pbUF9mVDdIOmFQNzIlnKOTmbGoqaWzqqW1qKS8uMGwusCyt7S9tLaosrGksrOnoK+2qZuouq6ksLGhsrSxoaSenqipsam0qaacnp+smJmZmJiWmKOun5yXqK2xqaOej6yip5Wdl5yhpqGYoqGioZuioqicn6CelZmbp6Gcp5Wbmp+hmJCSlZCdiLJuaLVyrIhwj6dytHV0tnucmaaOkJ2No36PnqN+sHWCkNLSdVyufIV/pG6bqqZqhoV9rX2YmZB7sXOTnY95s2WWdIWebp9mlFLJi1rCXJ95Yl+tX3ZzhWGWiF1Zyp1vwIB0TUu1U1XGZFVRamNlWEFPal9saVBVRkg5PVdSW1ZZSEI/SjwyPzs1PTw1Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxBTlRfZVA1Rz1hTTYyLqOekaWvraWpu62mtaWotru8s7u/uLe1vLy0prW1o7OypKCssKWYp7uupbKxnbS4qqClnaGqpbKorKqlmp2bqp+WlpmZk5Skq6KYk6arsaahlZKrn6WSlKGcpaeglZump6Kbo5+umqCenpCWnKOfnaWUnZWZo56VmZaTm4WsfHiod6OPi4eqcK6LhaiEmpqji5Oai6J9kpeHroR/gbNccrJTr32CgqN+cdd9d4R+j52GmZp3r4aKkZyId7RhmmWagoGVbJJbsFdLmnWYeWZgrV52doZnl4hqXa93lZ+Pd2w1ecius19DVG9eZ2BFUGxfcG1WVU0uZWNoUllQO0FEQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITAzNzY3PVBrZT4mVmdcQD1WX2NONkdCYEk6NzegnZSgt7GZs8GtqLKnqrK6t7W5vrm4s7e+taa5taG2raCgqayflai2rKixsquttKSbqaCgqKK1p6aqpJqelqWhlJSdmpKWpKiclJCnrbCloJSZqJ+ij5GimqmmoZWapqmenaSfrZ2gnaCNlJ+cn6GZmJyVlqKglJiRpp2GqX5/pnmhj5CEqnCtjYOnhpeho4qYl4ijgZCGlKp6f4udeXCxWqiDgoigeHTYf3aHdKeBjpuNkqR8lZCfhHuyXpxkoH2ClW6TXKtcW5N/kX9oZ6pjcnuAapiGcV2rWomgj2tuZE9KQ6FcWk10XWJmTVphX3J0X0pVNUqakVhIRT1HRUFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4wMDIxNTQrKjA1LzcsJjIxKCQkNjY3MTxPZWRBJlVmWz8xVF9iTDdGSF9DMT03op2amr6tmLPBrqusqKe1sbixtb+5urOyubyqu7ahsqWfpqennpOrsqmwqratqq+hmKKgpqSkuqOjrKGXnJKjoJaVn5uVmaGhkY6MqbCwpp2Wmqemn42SpJioq6iVmKmon5+gpK2joJ6hjpWhmaCgkpyXm5WeoZaXj6ucj65ucrR0qYx3i6Z0tHp1tIKUp6STnY2JpIeOdbhui3uLomtrtlqhhmWXl2igoqdtlHK0c5OZf7NqhZKIrWp1tGGdZqJuhpJrl1ytYE6hfIeRUnOjbHl/fm6Yhm9cr1Y8nHdlVG9uLlunT2JSa2VibFliXGBwfGNTWVE+P2xvMkJCQD5NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssMzI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFBOKWanJ66o5yxwK6uq6uot6q4r7XBtb2ysbu4rMK3qqyhnKekop2Sq6uotqOzqK6qoZedqKClq7ido66clpmQpqOXjp6hnJmen5GTlau2sKaYk5usqZaMk6aapa2jkZersqSgnqissJihopCZoZegm5abl6GTnamdlJCrmYfTlJq7dbHEgMSHftaXnLh5ipKZjpiKjKeHeaK2dX13dsKCmrJhg7p5wHx1uGK1gYyHqX2WgqypcXt/dbyIp6BpnWGmjq+hfYx0h6t9vm5zvHSyg3V4gYptmohwbY2kdL1dd31bYXm8alpWW2l5XmlgZGZibXhvWFtZQ0FAcT9DRys0SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sOzowOExYYUYnVGNYPC9UXmBLNTxMXC02QDmnmp+ivKOXsMOvraqqrbGoua+3xbG7s6+8sK7Bsq2mo5+kopyckaulqrKltaetpJ+WmquZp624naOumZWhkaagk46do5+Zn5qQlpOvubGrlZajp6aUkJalnaStn5GgqKugnJ+ppLKdoqSOpqGVoZmblpWkmZCwoJKVqp+FkJm2gJKSjbiWeIOTm7Z3bmxvdG95j4SOiXKewLu8mnuBsqhwgXSRuYN8hoaLhox7ioeMl32ku7m9nHV5s6N0dZd1dLB1mJ5mhmmNtnRycXe2jF5/eX2IZ4N5bHlii6xwdIV+WFunaURkWVRmX2NdY1FnZnFtdUJNT0xEO1pMPkozPDAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEJLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVzgqT11dPSs7VlYnPTo8pp2hob+mlbLCs6uqqKyrqruvscavtbSwuKi1ua6rpKKnn6CdmZStpa6qp7aoqJ+clqGknqylvqehqpeVnJGim5KQoqiik56XkpiUsrW2rJido6Sii5OSppymq52WqaWmnZuhqaenoqigkayel6Kel5aYnZ6PsKmUnKeij2t/apypeYl0f5uPdntmiHu9vsC6b5KDcZSFX3JqWl6biWFjh4+WbGB/lGNtnHZilWyAmZWUZV5gY3GaiWhyjHuGlGZqfnB0eH59Ylt4dIFoUFxuhHx8impXbHqBcklKb4VwTnJNRFZcZmBMWldmY19PWm12anJST0RETTxISTxMPjIsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVDRlVFSk9IRlBJSUg7OD01MTouMTs6Li8tNzY9NSYiLyoyLCU7OC03SVJeSSdTX1Y0KVBeTCgzPlxPJz8yPqifqKHBpJm0ubajrKaup6i1sqzIrLC0rbakvrKzqKGkqp6jnJqarKeupKW1qqSbmJWinKetqb6oqaWVlJuWoJqTmaapqJGfkI+YnLCyvqyapp2noomTkqmbqKScnKygo5qco6etop+poZmum5SmoJeUnp+dmLGlmaKomZ2Sn52kppuopJudmpybkZeCaG59cneRl5SQhIm0qo2FmJWPioyYl4iUlYmDk5OQiY2SlJmTmZean6Gam5Sfm42BeaSFbGl7kH2AdYmLgnKCeHl2dop/fIlqc4F0g3Vkd312a295bF9iW29nTVhZZmpfV1lwem9tZlNPRlM5UFpOUk8oKzpLQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7NDg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0onUl5UMTBUXjorPThdSyw8LUCyoLOiv6KjsLG3oKqms6emsLWqyautsqa1psCptKGfpaacpZaVoaunraOkt6ygmZeWoJitqqbBn6yklpKcl5+YlJWjn56jqJOQmKiossOvmaqcqp6PlpapnqucnqGtmKGbnaKlr6ahpKeerJiWpZ2ZmaGenp2woZ2ip5aZlJqUoaOXpJ+ZoY6YlYuLjpCYro98lZuCkYGJqaiFgJiWi4SOn4h7hJGFhZqRh4aKlY+bl46QmJ6jlpmSkJyNfo1lobOuhImEd3uQin53eXpvZ3mRgIGIanWBeYhyaHN/eXWDhoFqdGJ4ZV9oZGNkZmpYa3txamtcU0xQRF9VRkA+Pyw0QEY7NDU7PkE7PD8+PkhOTk9QU1RWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8zOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAs6C5r76tqq2xsqCqprKto6yzsMWwq62ks6+8pLScoaijoZ6al6imqaakprO1n5WVnpqasKauvqGsopGRnpqalJKWopyXqZ2Enamro7THs5+po6qWlpiap56pnKClrJSfn52fqq6opKKroKuanp+hmKSenJ+dsKSZn6mUmZmek6abmaqfnJdmhZN9ZX+Pm5BjeYxsaGp6kKOramWamH5nhYtlZWloeo2ijmtojJiRondraouZo5+Yc2tteoSMhnlYZV2FgV5si4qCd1xnc3d3koCIgW53gnh/c215hHN2iIeNgnpohFhdanNkXXOIaWp8cW1jXVFOVklkWEBJMz1GNz9GRDcxPD0/QUM7O0RHSEhJTE5PUlJUV1teYGFhYF1dXV1dX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQUlbSi42Wk82KUVZL0RPMVlCOz8uPaSeur25r6uzsKulqK2usKeurrC9saqopa6wsKCtl6GknqKamqasnK2kpqips66elqSQo7CmtrmlrqOPj5qimpOSm6CZmaaWe6Sroqi0w7eloaavnp2VnqOeo52kqqmSn6GeoKqvqqmiqp6mm6Wep6CrlqGcpbGkl52slqKfm5SmmaCsmZ9+vYSJc7RzhZ+GrWh3ucS4cZKho3qmmJl0q4J9y8DAunGLo4eDnn2WmIiewL2Clp2djZzBwXuBepGMmsLAfWqlsm+NgW/Ken+beJKEj4B2eYGAeXF7gIZwd4WLknhsdZFiZV53Y19lgGJedGhtZGJYS1VJUVlIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fYGFfXl5eXl9fX11cU01QR1VOQUA/PTY0NjgyNjYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0NQLyNGWzNQWS9VQUI7LziVornDtK+vv6mplKOwqrCvrqayta+qpqemsaugq5ibo6Ccm6qnop2so6WopaW0pJ6jk6aurbi0p6+ikpGZnaaTkaChmJugnoimq6Srrb+/saCor6mWkZ+dopmjpKqjk6Ghnp2srqiqpaOhpJ+jpJytqZGkm6muqpyeq52uo5eYppeipJief86UenulgnqWl5tfrY9djqiAoaF8p5WbdauDga9eZIyqe6iHhaB0l5OIs2OCq4agjY2zaoSvdHyWh7hhgq1Zo81ukHZ723t/mXF+iJN2f2V7iHV2bH6HbX2Fj5B9a4CMX3Bqb2ZgX3hkW3FoamRmYFJUU1deSk9DNUFIRUQ4PjU7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xfX19eXV1fYGBfX11bV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3OlNMKywtSjAnO1s6TC0hUEBGNC4xrMHAv7S0sLeYnpGjqqmttaumsq2srKSsprCqoaecmqaYnKKvn6GfqKejpqGfsKybnpamrq2xq6isoJSSm5+lk5CfpZedqKOeraOqsKi/xbKnqbGtlpKenKKXoaqqn5Whnp2cra6mqaibpaWioKqSrLOWpaKqqp6kp6eisqKTm6ecoZyWlZGXoXKGjJh2hqiHcbF8nXGsfaCggaWPnnirgn6tf51yrX+sh4afdpiSe3yXfqqIooyRi5x9q3qIko+ff3qtVpzEe5BwksF9gZVtdXCMbWZ3ZYZvYXhucm6IiY+Og2yPjWNtc3VvYGZtZF9vaWpuZmNXU1xgWlJSQzhJSUBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MTQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi08KD0xKTNWQEYhHEc7QzEtK6/Txseys5+do4+joqKtr7evqbGnqKqorqurp6KknZqjlZ+mq6CipqCoqKOfnrCtmJuWqKevrainqZ6XlZqkopKUoa2bnaejr6yirLWpucyxrKatq5aUnJ2imZ+urJ2WoZmenqmxp6iom6qno6Gqmq+xoqirrqaap6urq7Okk5ikp5yWk4Wka6R1inqpdXuycYKlipiMcIigm4ekX2FSq4WAroOcda6CqIaGn3qZl4Z7ZoCjiqSYhoGjfal/gZSGrl57qFWdopKBe6OfgHzEsMWMc6+0s7lyYqmvwnRoi4uWjYBrl5Bta3h4d25rZmRkcXFme2ljXFZfaVhYVExMUUxDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmBhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICcnISstIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfCydXWwKGZq6ihr6KfsLSwsKmto6enqqurqKSmoJuln52mp6aknayaoqyho5+vo56bk6qktbCvoambnJaVp6SRm6Kon5+mnLCloqixrLbHsbSoq6mVkZ2doZmgpbOdmqGUnJ6nqqqirZqqpqChqaKyrKGqs7KinKupsbC4pZSXpaqanZN9qm2fg4h2q3l8sG6CpIuJn5aVnpaB0ri0uMmBgrJfYZSpg6WIh6B6mJaaearJdJqjlKipkJKajH6aiZrGxndloYKlc4GfjoJ9r19vtWOxdUujhm2nR4OTZI6Pm5F7b5SPfG15dHx6bVtlanJxZoBpXmFYY21cXllJTExKRURCQT1BPEE/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fX15cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE5UUR0cOzxGMiwkqKTAxrmtqbKuraainLK5rKuhpZuopqqsqaagpqWYq6Ofr6ydpqGtmp+ppZ2ntaCjmJSoq7azrJymnKCWkKatkpqcp6OgqqeuoaOnqbCzwbGyqaynlImYnaWboqSvppeilZicpaWpma6cq6WknaujtqyhsbmwnpywqLS0taaWmaqmnKGQg55Od5qCgJ56hKN8gqSEhqafnJ+UhLh8fHq5gn/MxsO2d5uikYuffpmXl4p2n5eKpJikp36vhZuDnoSsfZmUYaVso3CPhZCBfZaEcqxgpHNxgJphvH1SVXWNkaGVenyQjodyeXKEfm9bbG53cmqBblpjX2huYmRdTExRU0FIR0ZIOjpLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFdZWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9URjxFMjpQW1QcGzY/RywtIIyHmamspKu5q6+gm6Kss7Wmn6GVpa+urqinnqWlmqSnobOuoqmns6CaqaSUo7Wjo5WXoam1uaSco52jk5Cispmem6aloKKvrZykqKK1scOwramsqZGGkZynnaOknKWXnpiYmaWjp5itoauipJeupbusore2rp6etrS6s7WomqCxpKagiJDStcO3eYeOhZGTj4CmeJSid4yhkoWlg4tyq4eGtG5yaZmknZWJn32XmYeHkHOugqWbo42mipOciJSQmm1wslylc5N6nGyZf3uZfm6pYaJycn6gYnOyuGh3jpKkl3yJio+IdXt4jYFsaHdpeHNuf3RcZGRtbWZoYEpaV1g8SEY/UzNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBfXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgjKSWSco2Krr+/vLu1npeopK62oqKZlaOqp62pqpmlop+moKC1pqKpp7GklKujj6StpJ2QmpqqtLSknaWcqZKUl6+goJ6mo5ynnLWZoKqjtarCr6iqqKGMhI+coqGmo5WampyYmpimo6WXqaeroKObrKa8rJW9sK2fo7G1u622qZ2rtKarmnyokX18sHiLgKSliJxtsm+hh618oo+DqJeagayJhq2FoJSooKOXhZ+BmZaBe5J+q4GdmZaLq3edoI+Ik5J/ea9do4F8pqdknoB8l3Vqrl2lbHKFmV1gW4ygbZSPpJeBkoqTiHd5gZZ+aWx+Yn10bX95X2dlcG9nZ2hCWV9aPUpTMlM4QUFDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaWFNQT05JODE1Mi4qLEFUVlZWVFRVVVVVVFRVVFNTVldXWFZVVlFIRklKIygovJKbhKnGw7fBtJ+araCuuaajjpqjpKCvrqmfo56drZieuaCjq6GwqpquoZGqqaWWipqQrbGsp6Com62YmY+toqGdpaGZpJytl5+opbaovq6kqaOfi3+Om5ugpp6SlJmblJmZpaOimKerqqGinqinvKSXw62ro6KttLytsKmjtrGrrZp3r36Ri5yGh3y6rYmYZLCMZZaufaGQhKeXnIKti4WwhqiapKKikYWgXGxrgrNgf618e4KBsmxmbpmXi4ixWn20W6SDa8iiZp+BfLtZdrVasn1Tr4F6rFiAoW2XjaaYiJSNkpN4d4ybfGNzfGKDd3SAfGFpZm9tZmVmT1VjXEFUXT1IKD45PTQhISwkHzIuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGFiXl9cW1hVUE1KR0M1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7G3vru0wbOjnK2mpbepoIuZoJ+dsrGonqKfnbWYoLOoqquesK2erJyVrqiijombjq+sqaejqJquk5qPqZqhnaWfmaOipZieoqixqLuupKienY58i5qWoaCZkJGanJGZl6ien5enraWjpKKkqbqeoManpqmhrLa3rrCpob+wsLCYgqqSo6+Om4CGpJeYkICAuMO6hI+dk4WomZ2DrIuDr4qpnZqmq5F+1b3CqmKkv719f6OCg9e6t7WElJKCnr2+hGqjgW+rhG6df3qysceDa6uxvax5eKK+u3SAlYykmY2YjZOZd3+PmXlifHlkjGZ4gXtga2VqamJQYltTaVxAVGBCTCk8OjQvHx8kHiUyIBwkKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbS0scC5sr2zop2up6azpp2Ml6W/qbavp6G/pqaxm56xnLmon66vpaeVlK+sl4yDmpGupqOsoaWcqqCYiqOTpp2nm5qgqKKYnaCrrKm4rKejmpeSe4eZkaabko+QmJmOl5OomJ6WqKieqKagoqq6nqnFo6GwpKy0tayyrKO/q7KynHV2qqW3hmWKoHBnrJCKj25ud6WQm6CCdrGbl3CRjnKXqqSbma+kcmxtbWaLeG9tg5lxgHppcGlniZaVl3FoaYWGZ3GGZF2KY2lvWl1nfnimYGJykJJwZmSAjZKNoJWVl42SmnqFjZN0ZIZ3Z4xqeH55ZGxjZmxiSmRXSWpZOlBkRFAnSjkrIxwgGiIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdaXGBfYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWttKm6ubK0qqmirp+ks6qZkr2xw8e8tKmev6uso6Cnq6C6o6SurK2mjpatqpCMhZWWrZ+mqqKfpKOgkYulkqaZqZmWo6mglpylpaauuaqsmZqTknuEl42ml42RkJeUjZeUppOdlqeima+lnaKruZ+wwailtKetsbOssK6qvKexu5iMoqmmtZyJl6OYhqmbkJSdkqq0mpykraK0mKSjn6KjnqOlopesp4ySk42Hk52dlZCZk5iQjZWEf6Sal5WOi5OSipCHhH5njIF0g3d0h4xxp219lpOUlIGBj4+OjZuRnZOUk52AhZKLcGiPdm+Jd3V8eWlrZGRvY1VhWEBpWkdiX01YK0U9KyYhNjQwLx8cICUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleX2FjXV5UUUpFQz45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqktbevrqKwpa2goLaxkY6qxLzDubapoaSdm6WdsKikt6edqbWnqJGYrKOLiImPnKeWraShmqien5OVpJeomqmZlKago4+ap5igtLmnqpiakIx7gZSMoZSKlZGVkI+Sl6SOnZionpq0o5ymq7eor8KvpLinsLCyr6ustr2jssCak6ekprWikp2nn42pn42Sn6KtsZuipLOrs5qmo56mrKCfnp2YrZ6TmqKclJCXq5mNmJmXkJaekYegnpSUhpOMj42VjIF/Zo2IdYh3eomEdJxqiJKWlZKJfYyWkZCWkJ6QmZKdgYaWhXhxlHJ5iX9xe35qbmRfcGlgXF9ZbWJQYGJPWDlGRkU9Mjw9OC8qJispJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBgaWBlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlqSoo7CzrK6jqaetoKi1qpCPm6Oyua2qq6GimXqcobCkprGpl5y4pqOUmKmcjoaKiZuikK+epJaooKGSl5mcrourlo+omaeMmKiOnbi1o6WYm42IeYKTjJuTiZWRk5CNkZahi5ydp5ydt6J/g661orCwdaS/pLOgeXuirbW/l3iwpqGKgKp/ZFxid6COpJ6Dln5tlLWdpKmwrKVmoKGUdHqbmXCBmaqZbH+kqYplnKWckZeYl4uSm5CEnZuQlIOTh46OkoqFeGuQiHaHcXyGgYFhaYmMlZOMW3aVkWdnjoxxeaGVlWR4l4WAdpdogomCbnl/a3BkX3Zva2tnW2VjYWFtUVk9TU1OUkY9QFRCOTEvHh8mNDozMDY2Nzg8Oz5AQUJGSEJHRklLTFRVVVldYGhmZ1hRSTxERzw5VVJbYGFiYF5fX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqqWprqOnraWSlaq0rrClmamlqpdzi5yvoKirp5SXuaCgj5yknpF+iIiano2smqSVp6KejpeSnoV1ro+IppqokZajiJu5s6egmJiLiXR2ko2Wk4mTkJCUjI+Tn42ZnqWYm7GVgIybtZ20jJKPvaiifqeje6WxuoOOj6ifhIyGj7Gpr4yKlqKaeYCLrIadnqOpq6mJloead6Wce4icgZing4F7nbN7ioagmJmUmJaBkJaWg5maYnmIkYSNj5KLhG5xkIh6gnGBgYaAh3SIhZeTeJZok3SgmnN7mYKbmYSYfpGIgYKYaYyMhGp4e3FwZmV4bmlsaltkaWlkcVpcR1NLUUBFNS1ZVFQ2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dSWFpYW2FhaWZZUUg5REw8PmJWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2YpJ+mrq6rqK2gqbGnp6qlmZOsxLyvoJSlp7Sdj4Ocq5ynoqCNkL6emY2fmqGRfYaPmJeIrJ2jlqGhko2UiYaAkaiOh6Kco5OWnYaeubGnnZqSjoVwdY+JlZCKlI+Om4uOkZ6QlZ6jlJ2rh5+0ibSarovKiKuvireFjbCEs7KGqY6pmY2dfKiPcnt3nI6mlmiVpHm0jKGgqKqTmcKCgKuJmaFynoCbpX2XhZWzgaF9oZOfj5iYgI6UnImYkot8hZSGjZWTioRudJKGgHtzh4GEfYV1hoOYgY/FZoCph4+iap2BnZeAmYCKjIOImG+NkoRnd3R7dmdodXBnaGteYm5sZmpXZEVcUEwyRTQ2TWBjNyYzPEVHRDo2MzY1ODs4Pj09PkJMP05JSkxDUFpdXFdiXmpsXFFFPUtNQElkWF1jZmhnYmJiYmNjX19iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6OgsKmpqKasoKW5samrppqUnqGkqaGUo6m1oq9/oKadpZ6diZS9mpONoJKdkHmDlpWRiKuZnJuaooWPjHabm46gkYieo5uWmJeGorispZmbjIx+Ym2Pi5OQjI+LjJeLj5GejZKeoJigp36hp4etnaCWrpCgnp2Rh4Khja2yiKSOrJuMmn6idoCZlGuBq3VNq3iHjZ2TnKqpgqqrfoShfHunap6Ak2xnl4aYt4mefm5gY1iDl3+Ne2Rni3OZfXmXbFx8l25gU3GFXGBteoRgWWWCfoWBmXGoqmuDo25ypW+fgZtnZJ5sWmyIemVZX4J+YVdQb3ZlbnRxampvXWlvbGpnV2ZNXFdFOEE0R0NeazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUktNQkpbXV9XXl5jdWBNRTpNTk1UYlxbZmZpaWJiZGJkZGJhYmBiZGNhYmprZGJkZGdkYmdlYWNomJeeoLmhqqSmrJKitr2rr6KZlp6gpaurn5yttKGnkaCfoKecmY6ZtJmQi56MlYt1gZSRjYqmlpaYnp9+k4WFrKOHnJGKmKiYmZmRh6WvpqKVmYeJgGluiIiLjo6Jio2Ri4+RoYuSnZ+aoaV/k4GPo6GUoHeclpCng6OpgIassIeleox+hJp9onBzk4eVe56MeW2HnIuakpyqnI+HnX2DonR3pmeefnelXph7fZNzom6Yt7S6c5OIgYC2qGSBxrh8cZW2jHGAm6NjdKyrYX5qnbN+bn6Ig4+DjJhxgKNscqNynoJ9o16cmbOVb3uXnrN0cluesoJpYnB0dXFob1hqa3FwZFtmXGFLQz1ENVFBWXAyPFJHX0pSPTwzOTU6OjZDPDtASVA/VE5OUUBFX15bWVdgYHtkSUM4TFdVVmNhWmZma2tiYmVhZGNgYWJgY2NfYGNrbmNjZGRoZGJnZmNoaJSWlaO5mauck6COpbi1ra2gmqGboqOkrJqasayrkpegmaGlmZqUnqybi4mReIuFcYCWjYqPoZCTlJ2XfZGKjqighpiPipKik5uajIqop6Sej5aHhH5re4Z/fY+Ng4uQkImOk5+BlZufm6Cfi4l3nJiijaByoYyJqYmdqJGYqq6Brox+eqCZeaOTeIBzl4iMnH2Vn4ebjpqdqIijZKF+ipaQm41tnmibjm+amXuAiqd9cmh0qoOeg3OqZ5SaXZuFdoSdaKpqgbhmXKlwgZxhlYxfp3Z3ioqAnWiadYeTkpiNfp5smI9qpplcqH53u2p9qVqOhF2zZ1xucXh3a2lbcGl3d2FeY1ZhQVBFTjdWQlJtNEpaWl5OWkRAMTUxOzs3SD86Q0hVP1lTWF0+RGJdVmBRYWR8aUVCOU5bXVhkZlhmZm5tYmJlX2FhX19gYGVjXmJkb3FfZGVla2RjaWhna2mVnYmqtpyoiWOVnKy7srCsnaWbmqefnayZnbCnqp2Xo5qin5mWlqCjmYaJjWmIgHJ7l4eMlpaEkpSYj3qLhJaknImVkIaLnZGcm4iPqKGfmouQioCAaYGGeX+WjHuIjY6HjpWZfZKhnqChk5hyaJ+KoI+McJKNgqmJmqGlqqKqfrCtpKK4l3ajs6Kjf4iUeJ16qpl/oo+fnZmJmHKhfYeNsLV9bJqRoXh+mbWjo6uohJl8mnycmn90qlpdb3uXjHieYk1/e3uFZHqYQk2fWaJqc3yOb4KKhJl2m3mHibGzf36akqZzfZ1tcHyUb5lyaaNdlXZIZWNgc3B9fW5lX2tndXpiYl5PXVZcVFZAWUVQZkRSVlxhWF5JRD1COD9COkhFOExFWEFXUlpWRUZhXFpgS2BtfXFFQzxVXmJaZWpWZ2htb2JmZl5hYFxdXmBoYl9lY3ZsXmVnZmxkZWxoaGxplJ2Bsa6ahFRfoae0urOzqZqii5qpm5unkqCro6Cnj56dnZqZlZihnZaHh4l3hYFueZWEkJuLfZGTlohygYmSoZtykpCBiJiUn5qEjqibmZWKiop8g2yEhXGCoYx3hIyIhpGYlHuRop+eo4iuhn21hI+enXumlnqpgpeekYyjoH+naHhufplzoHNxfJ2FmG+Tgq18pISnn5uCpHBeqWh2o2RwpmGc0498e5l4cnNjooaQfqJyo5B2a5Czi2CCmIp0qrKovH93g25/v6aqtF6cb39yl3CCc6JyXqRndKZgaKZsm9OYeYGabnZ5l2ubeXaXcmyppWdfZHlxf4RsaGZjbXV2Zl5gUVplUFFhSFZJVF9XU1tkaltlUEVDS0xKS0FKRDhQQFBNWFNYT1NRYGVlalNkeHl3SUZFY11lWmhpU2loam5jamZgY19cXV1faGJhaGV8ZF5kZ2RrZGpsZmhsaJibf7GsVF1Lf6qwsrWws6KcmISXpqCgooykp5+WqImZmJmUmZOSoJeOiIV7cH2EaHyPg5OagneRjo+KcICGj5OSbJiUfIiRkqOVg42pmZOSioWJeYN2iIBugZ+Gd4CRhYeYoZV4kqGjmZ+Js6Gitot6rKekrqVwqYCbkYaBnpR+pYGjmoaYcZ6Eoq2viZeLf4ykjZWDr6OVd7W2tsmic5SMg59hnZepbXmWh6CbdaGHd6B+kJaLgW9NZqOScZqIc6V7enVig4JtfqBscmRgnHN/dJdre2q0trTGpnOYfXmcapqZq3OBmmxzd5dpmXl0l3FQRH2zXmp1a3iGZmtmYnN0b2xVW1JYZ09RZ0lVTFhSVVxna25VZ1dNSkFJTUpHSk5BUUpQZGNqbWV1c3N+eHtudIl6e1RRTm1eaFxraVJqaGlsZ21nY2VfXFxcX2liZGhre19dZGdjamZubWVpbGWinYmwqIVlP5Sisqyvr7Whoo9/lqehoaOLpKacm6WCmZeXjpeQkJuTjoiDeWt5hmWDjH+Wn3l1j4iMgmqFhZKEi4WdjXqMipWlkoKXqJaLkYuAiHqAfYt5cJCghXmBlIaIlZ6UfpOkppuWloNnbnicbKJkfHKleJyYcGingpmOfaV7oZeDlnKfdoGJlJWPuW2PiqJifZmjl4luc2ura3Wgbm+mYZtpi5BploeblXWigX6aYIuGjXVviGJooWaef2qbdXBkZ4iCb3KiW19bZKFuXoiMcXyAdHJkpW54omNmp2eXcYuXbaFvUoiPbqBeZKdUi11UmG1tcmtxgW1waGt3c2puUVZVVWVZU2xJWE5bSFdoaHJqWWtWUFJFVlxNWFNhVWhqXnd1e3xwfXxygnt/c3eNgIN3XlFzYWdicGdQa2hoa2xvaGRnX11dXWBqYmppdnVdXGNoY2ppcmxma21jnaWZpnpldG2Lp66lqbCxpZ+Lf5apnJ2ji6GhmqGigJWZk46aj4uXkI6Ke4ZxgIhoi4p8l5pzdIl9kHxlg4eViomVmoJ8iIaWpo+AoaqPhZCKgYl9gICOc2mPpYN9hZKMh5eejYeRqaWdiaZ4lpt+pYmWjLKZnpGEr5efpXmYinupdaiQhJpupaKMkoSMg7xtfKWvgoeFh5WXnqJ+pnxyqJWhlmiffm+sY5aKlpN4qG2qo4GJdYiCd6uRpohrkrFsd7OMqWyLhm9voJ6SlWJ/q4yqd4GAjqefd599haSVnaBnmYd1rGaerYy2c3a+jKOTWYOmjathdXJ0b3t1cGJqfW5nbFJUWFRgYFxrTFtRW0ldbG12X1txWVtfWmdzZG1vcWNxdGB3en55cnmDc4N+gXt7jIGCgHZieWRjbnNkUmxnZ29tcmlmaWFfXlxhamJsbHtvXFxiaWJtaXdtZ2xuYpamq52BgJ6klqqqnqinraOYiIGWqZmdoomapJyonISMmo+GnJGFko2MjHSFeoiDb42FfpeTc3SGcpGDbn+LkoeGlJB9e4KFl6SNf6WkjYCOiYSUdYKHk25si6iAgouTjYibnoiLkqqioI+AdJSXiH6BeJSvpH+CnHGPhnmTjoaBe3OpjXJ9fXqXlpuEjXh7fX2IlJWTi3eRmaGihXt/imyMhlx6eXN6cWlufpOKcYB0go+Uk3GGhIJljX9fgYGMeHZzlHVwem9viW+Fhl93aXiOZoKDho+qnH90fZZpiYhvfnV7gnRtbGaMc3d7l3eEWmpXeY9pbndycW93eG9da4VuaGdWWV5WXGRqY1VgVF1RXm93eWtqd2Rpamp1fHBxdHNhb3Vic3uBeHV5gnV/gH+BeYuFgn17bYBtZHluXlduZ2h1a3hqaWlkXGBaY2llbHF1blpbYmtkbGt5bWhsb2GOlbqpp4uhopunpJmknauhn4ODlqqQnZ+ImaaaqJiCgZyLfpaUh46KiYxygnyOfH6PhHuXjnRyg3CVhnx9kouGho+GeX6AhpijjHumn4qFj4+ElYKGjph3cYSqhY2RnI+Hnp2Gi5unn6Crg4mNlZt/foqXraiQk6iReHGfk4V9lHB/q4dxfpVxam98gZ+Lf5GOi2huXYSNjZydoJBzl42JcnVsg3Z0gFlyb4eRgn5/jGpdaWR7hYSIgGBpeHucfISNg3aCh4RpeoyJbGJxc4N3X3ONg4qRqJaHZ42Ogmx2ioJugop3bWRlY3mCepVaW2lmbXZbe3l3dG5zcoNmXG2Ja2tiWVhcWVhqcVpeYFldXWRyfXp0b3Riamppe3xxenZ0ZG10aGx7f3V6fXt5eoCAf2+GiYN7fXN+enJ/aFRccmlsdnB1Z2tnZF1hWWpoa2pxcm1XW2VtbGdyeW9oam1gjIyrsaGQo6Gan5+YnpmooaB9gparjJ+ThpqhkaSVf3uYhXySmYmIhoaKcnyAi3aFi4KElopyb4BzmIaEfpODg4aKgnqAhIqan4+BpZ+Gd46XiJWKi5yXhIN5rIGQl5iTiZ2choehqp6ioqOLiJObnaOZlquiqKehk5yJmZF+epCQhql/gJORkpOcsaWalJ2PjbGSmISmjY2WnaGKkZ2EiZOLbH2Od3dmgoaRi32JnoWHi4+IiIGFhJF3fHt1m6SKh4ugjIeWf4CNg4F3cXWGhH94iYiLkaeRhIeOh4KLj4p6g4iGjH91aoCDfHmZaXFoYHOKcH17d3Zvd3SBXV5vhmduX15ZWlxTZ3BVY1tbYGxndHt7cm5vY2ppaH97bXh+cGhwcGxmgHtygoB3f31/hHttg4yFfHp5fH56g3hOZHZqc25xe2RrZWJiYFtzZnBmcnFsVV1sdG1oeHpwZ2lrZY2Inrqfl6KhmJWZmJSYpKCcen6XqY2djIWfnIqdlnx5lYN7jpmJhoOEhm14gH9ygId+iJOEbWt+epeHhIOQfoCGhId8h4OMmpyShqmdgnKKj4WSkYuckXyNeqmDjZGXlY6bloWFm6afopqdhoOSmpmZkJmmoaaenpCXgpONeH2JkIanfH2PkJGGmKqhnJOcjo2pjZKAno2JlZughI+YgIiPhHF5hnJ1YX+EkId2jJmBg4+ChoV/hoSVbnp2dZSkjI2Gm4aGkHWBjH5+c3N8iYV7eY2PhZSokIeEj4GCiYiIdIKFhoh5bWp8f3ttaGtsZl55f2d8e3Z0dnV7d1xgcH1udGBjWlteUWZsU2RaXWBqaHR5fnBsbGNqameAf2tyf2trdG53boR5boaAdoKAfYV3cYKNh357e3yAe4KLYGl7a3VoaoNkamNgaVxjdWdvYnVtbFRicXllb3l6cmVqbW2Lip+4mqGkn5OSlpeLmp+enHp3nKSQm4mGpJOKmJl5eo2Fe4qRg4yCgoJse394coCFfYqQfGtofYKXiYGIjnx+hYSHfI+AjpubkIemm39wioqLkoagoYqFjHynkIeOkZaSlpJ3jKOgoZ2Wmn+BkJqYk42ao6Kkm5iSnICQh3uBhpGJoYF+jY2PfJekoKCSmZCPpYyPgZySipWZnX+Tk3+Ij4N1dYJxd2F9gY6Gc4qWfYiMcYx+goWGj2h4cnqOmpORgJh/iYxzg4l9fXJ6fI2GfHuTjoSXppSNhpB7hIWGhHN/gISFd2Rwen54eXBramZefnNofHV1c3xzgGpeYHR2cHdkY1hdXlJpaFNkWF5gZ2l1eIFxZmtjbGdlf4BqbX1nbXBqfXeFemuLgXKBgX6BdXaCjYZ/fHqAgX1/j2pyg250aWKIaGxiX3FWdG9sbWB4aGxXanN2Y3R6enFia295iY2fs5Klpp2OkJiPhpygmpt7daOejZd/jKGKiJqWeHyGh36Ein6IgoF/cH56dHWChX6JkHdnY32Gl4qCio14fYCNg3mWgJWXlYyVnpp9b4uBkJOFpZuHjImDppWEkYqVl5KRdpGdoaGYlJd5f46Yl46Wmp2lnpqUlZ17komFeYeYj59/goqOjHOXop6gkpiOj6GMjIOYmISUl5p/mY59io6Cd3J+bntkgHyLhnGHk4CRgmuHg4GAioVmdnB9iJSajn6UeY2LfYKJfnxygHmLhnqFkouMmaOXgoSLdoeDgYB0eH+GgnNednd8c312ZmtkYH5pandzc3V9cXxjY2FzbnVybWFZX11aa2NSYldfX2dqdHmFcGJqY2xmaHyCa2h0aGxvaH98gXhsj4VxgIODf3R8g4yBgH56goN+fJBtdYl0dG1mimxqYWN1VoNpcG1geWdsYWp2cGV4e3lwX3FshYWQna+Yp6mejo2Xh4Wfk5WXfHaomomYeZaci4yZkHh8gYt9fYR7gIKAeHN4eXN9gIN/iIqAZF59i5SHf4WHdH1+in9+mISWk5aMo6CXfnGGe5ORiqaPjI6KkqCRg5CPk5eRioGPmKCakpCRdICOkpSJnZ2ep5mYjpWXdZCRi22ImpGbfIiJkIlvl52aopKVioydi4aBk52AlJSWiJqKfYuKgntxemt2bXt/jH9uhZODlHhvgoR+fouBZXNqfYKYmIWAjnWSioV6iX93eYF+h4F9hI+GjZWlkXmFgnSIhnt+cXJ+hIFrYHl0eXB8bmBtYmV7Ym5vdnN4d3N0YXZgb2x1bm9cWl5dXWldT1xXYmBnbHJ6iGtfaWRqY2h3h21mbGhpbGeAfHp3bpCIc4CDhH10gYaJeoN9eoGEfXyOcnmLeHhtbIdraF9pcWKHaHFvZXZnbWxhemhqfHt3cGF3bYqBmZqroaSpnoqLkYaJnoqUlnx2rJeMlnyek5GWlIh2fnuKfHyAdnd/gHB0c3pvhX2BgIl+fGFcfo+Shn+EhHJ6gIZ6j5GHkZGbkaSak4F9gHyNipKjiY2KjZaajIWQl5KVjYiIjJKdk4+MjW6EkI+RiZ6ZoqGYl4qXk3CMnIZniZuQlXuKhZCKcJaalKGRkYiKmIyCf5KffZORlI2akHyLhoh0c3VrcW91fYt1b4aRjpNydIB8goKJfWVybnp/m5V+hYp1koyCdYp7cIJ/god9ho2LhY6Wqo57iH1+ioR2fG5sfYKAYWZ3c3RuemFeb2BrdF5wanp5eWxycGV5Xm5sc21zWFpdX2FpWk9WV2RiZXBxf4dlXWloZ2JncY1uY2hoZWlngHp3dW+OhXOBgYN8dYKJhXiFfHiEhnqAiXd/i3t6cnmDa2tfb2h0f2txbm1xZ29rZXthbX96d3Brd3eJf6OZo6ihppuIjIqBj52Gkpp0f6iTkY2GoIyVk5CAc3x2hXh5gHJzeoZscm95bYl2f4CGbnFbWX6SjYiAgYF2dYF/f6CGj4qRm5egkpZ3iX6AjIicnYqPhpKXloWIlJiOlouKjY6MnYqOkYRtiYuPkYqclqGcmZaGmYlsh6aFZ4ifjJOAjYSMgXiTmJKdkZCIiZSNf36QmX2SjpGOm5N9i4GEcHZwbG5vcHyGaXODj5iKcXiAdYKJg3pndHB3gpuQfYqFe5WTe3iKdXKLfIeOe4uHhYqPnKWJfIR2gYl+d3dsaH1/fltxcnFvb3ZZXm9gcGpeb2p8enFubWptd2Bwb2txbVlYYGFhbFdQUlllZWF0b4SBYVxrbWRjZWuSbWBmZl9naoF1cnJvi4B0f4KAeXaAi4B5hX53h4Z2g4V7h4t/e3aKf2pxY3xihXxvcGx1amhubHd3X3F+eXtzdXN/gn6llZutn6eWhYyDfpaVg46ddImek5KGipqMlY6MenJ4dIJwcoV0cXWIbG9sdGyHdoN9f21uVVGBq5SHgniAdnKDeYKggpCBkpKYm5GYd5B6goySpJqTjoiUmJKEhZaYi5OLiY6Ph52EkYt9couFiI+InJmfm5eVgZWAaoifimiIoomUhZKEinGDkZePmo2PjIuOjXd7k5F7kIyOk5iNfIl9gWx3am9rbG17gGJ6fo+XgXd6gXiDjX16aHVtdomXjICJh3yVkXJ7hnF4jnuLjnuJf4SOkZ+fhn18d4GKfHZvZ2l+f3Zddm5ta3ByVV1uYnJhX21ueXBocGZnc3VocGxhd2VdVWVgYHFTUE5bZWNcd2+Ie15caHFiYmVlkWlfaGVbZ29+b2txc4p9dn2FgHV2f4x5e4aAeIeDc4aFfoyMhHx5lXhmcmuDYId+b29qe2BpbXSAdF5zfHiGd3NzhXx4oJCbsZ2mjoKKf4KZiX+KnH6KmJKOhIeXjo6OhHd0d3OAcHCFc3Bxg29qaXVtgm59fG11c1JOgt/JktaTfHB0g3WDn4KRdpSQmJuPmHuTcoWQn6GTk5CJkpuThX2VlYeMjYeSjYicf46BeHuMf4iMipycnJuWlHqOeGmLlIpuiqWGlImYhIZjjJGYjZSJlouMiYtwepWKfI+Ji5OSinqHfX9tfGVzb2tte3pcgXmQj4F7fn+Aho97eml1a3SMkIqDh4Z+l4xtf4Bwgo6Ajol+hXuEkZabnIx9d3iCjndya2RufIBpZ3NuZ2hzbFNdb2RwWl9scXdna2tiZ3hzcHBkYHhgYFVrX150T01LX2ZiW3dwiXRcW2V1YGFkZI5jYGZiWGlzdG5rcXaLfHR5hoJ2d36Lc3+Gf3qJf3GJh4GQioh8fpl2ZXNufGWHfm5va39Za255enJgdnp7jXZydop2eZ+MnK+boJCChXiIlX57iJyGhJ6QjoWMl4STjoeBdXdveXFvg29tbn5yY2R3cHxuenxqaGxipJrB3K7vonNsdYN1hKGEkW6Vj5Sfk5qAkXCFi6OXiY6VipCdloOAlI+FiI+AkoqKl3+He3Z/iXiGhY6cmpeZj5B2i3hwiYuOf42mh5SLnoaGXouUl4mOiI2KioSJbHyXg36JhoqRkIZ2h35+bH1keHVqb3l0WIh7koeGen9/gIaNf3pndGqBi5CLhISBjZiGbYN3b4mTg5KGf4R7gpKXlJqRdXR4h4t0cnBkcnZ/X3Jsb2FodGZSYHBna1VfbnN5YXJjYGl+cXJuW2NyYWJWblpcd0xMS2NmYF11coltW1xkeV5gZGaEX2NjXlhpcmtua3J3i31zd4SBeHh8iXGDhHx9iHt0i4iHlYWMf3+Yc2h1cnlti3puc3CAV3B6dnlxZHZ5hoxodoCJcYCdh5monKKShH1xjJN4eImcg4SfjI58lo2AmoiEfHN2cHNqb4Fsam18dF5gd3Z7cHR6Z2BlfOvatcnD3IlzbHSAdoqaiIxpl4+Om5ORgYhwhYigjoWLlYqMl5N7jZKHgoiQepGLho+CgHd4g4Ryh4KSm5aTmIaNdoiAcoeEjImcpIWWjqCEimGDlY+FiIWIjIaAh2h9lIB+g4WKjo+Ccod/gHJ3aHZyaXR4bVqMfZODhn2Ag4GEi4N3YnVtioKRjIOAgJOSfm+DbXqIkYiUhX2Cf4KTlJKYiW5xeYuEdGpvaW92fl1yaG1caXRfUWRxaGZTX3F2dGBwYF1og3FyaldnaWNoV21XW3RMSktlZl5hcXOFaVtcZXleXmRnemBkX11Za25lbmpzd4p9c3KBf3t2eohzhYN8f4d2doqFj5iBjYJ7k3Zsd3Z5eJN0bnd6fVh5hXGAbmd4dpGCZHaGhXGKl4aaoZuhioZzb5KLcXaNmnyJmYiJfJ9/hJl/gnlyc25vZHJ+aWZsd3dbX3h7enFxf2lhZ2F/1baOkaZ4bnF3e3GSkIyGapiNiJqQioV6aIeKmYeBkpCGhpeNfIyMgICJjXuQjX2JhXp1e4N8cYaAlZmOkpSCiXaEiHiGg42VoKGImJGhgIlhf5SHhIeDiIx/f4JmfZGAf4CDjI+Qfm2DfYN1bG13dXR3dmtjjoKPgIV/fISAhYl/cGB0coZ9kI6DfX+SinpyhWd7hYyIjYV8hYCBlZCRk4Vub3iLfnRsbWhpd3pgZ2lpWGt0WVJocmliUGJyeG1iZV5aaoRudGJcaGBlbV9vVFpuTUdOZmRbZm1xgGtaW2NzX1xja3ZkZV1dWmxsYmxqc3aGf3Fvf3x9dHiGeIWDfICHdXiJgZKVe4mGdomBb3h5e4SSb216gHZeg390gWxoenOUc2dzh3xykpKEmp+bn4aHdXWTfm11kpZ9h5CDio2afIyadn52cW9samF0fGdiaXV5WmB3e3ltcX5lZGhoV52PX3Jzl7zEhHZxlIiPfXGWi4abkouHcmqIjpaAe5WLgYSai3yKhXx7iYt/lIh1iYZ2d36BcnWGgZ2ThZSPhINygYp3hn6Mm5+biJWPnoGJZn6Tgn+FgoiJcYF9Zn6MfHl/gIiMj31pgX6EdmdweXhzd3Rsa46Gi4KLgHmCgYWEgWxfc3l7fo6LhnyCkIF/c4JqeoWJjYeFeYV+gpmOkY1+bm16iHx1c21lZXtzYVtwYlducVNTbXJoYU5ndXhmYF5dWW+Bb3NaZWJeam5gcE9ZalFEU2ZgWWptbXxuWVtdbWNaYnB2Y2ZcXWBraWNsanN2gYNxbX58f3R1g3qDgnyBhXZ+iIGWkHiEinSBiHJ4eX6NkG9veoBxaYF4en5tbHt1lWtqeIR0a5ONhp+ZoJmEh259i3Vpd5eOfoGKgpSXinmPlW96dHFramRgc3poX2Vxelpgcnx5Z3F5YWVlj7Gyd0tiWqXZ0JZxe5CKj3d9k4qEmJCLhW5rhZKSenmShoGEmIp8hn93d4mKhJaAb4uIcXV+e2p5hYOkkISTjYR/cICEeIZ7iJ6bl42VkpaFiHB7k4J9goKIgm2AdmiAhXlygIGDioh8ZX5/hXZkcXOAaXlxcHWZjoaDi313eYGFeoNrXHJ/c4KJh4p+h4p7iXOCb3KFiJCGhnOFe4KajY6FeW5ufYN+dXljZWh7bl5YdlpXcGtOV3FyZmBLbHd0YV5cW1p1fnNwWGddZ2pyYG9OV2dSP1hmXlpvamd5cVpaWGtlWWNweV5nXF5lbGdma2lxd3+Hbmx/foB1cIJ7f4J/gn92gYSJl4lxgo1xe4Z8enmDk4x1anl+a29+dH98b3J7epNvboF+eGeSi4KhmZyRgoVnhoNvZ3mViH1+hIKYioF8jY1peHNra2ZfYW95bV9ib3hcZGuCeWFxdl9lZdTqvYsyOj6Ljn9xeIWHjY11gpaMfpKNi35ta4SMjHV8j3+FgZSIfIJ3bnaHhIOXd26IhWx1e3VmeYKDpouCj4uEfm6BdniFfImfko+Sk5SOjId/e5KGd36DjIJqf3FogH55bnx8gouEd2J6hYJyZHJpfm51cnWCnIyBgIWAdHZ+gHOCb1xugHV5i4SLfIiBfol5e3JtioWRhYxzg3qAl4uLgHVtanaAf3RzW2dndW5XVntSWW9kTFpycmVbSXF4b1xbW1lddX91aVliW2hmb2RqTVdlUD1dZVxddWVgdG9aWVRuY1ljcXlaaF1gZ21naWtpcHd9jmxpgoR/eW6AfHyBf4F6dYKAjZOEcIGLbnd+gHt7iJKJf2h6fWpze3KFenN2fX6MeXiEfXxrjI2Dm56WjIGAbIx9a2h+jYt6fX6DlIJ+fYqIa3ZxZ2hiW2Jncm9gYWtzYGhwiHlic3ReY2SboI9uXDVar7V0aYCIfJGGdYWVhXOOiol2b2yEgod0eYl4iXySh3l+cmd2iX5+mG9xh39pdnluZnmHhKSGgIeMin5vgHeCg4CPnImElpOZioyFiXyQiHB6fYR7aH5saoB7emp7d4KIgXJgd4F+cmRyZ3aDbnV8hpaSgn2CgW93enx1f21ZcIB3dY2Dh3iIdoOJe3l0b4uCkYKGc4B+f5SJinxvbmltgYF0bVtlZHFvUFp6TVtuW09bcm9kVUtzeGlXWVpaYXGBdWFeXWBnZGlpZk5ZZ01AYGNbYHVgXXVsV1dTdGBaZG9yV2peYmhqZ21saHB3fJJraISKfXxvfn57gYCBend/f4qLg3F8h29xd4N/e4mMj4NpfXttd3h2inZ8eH+Chn+Dfn16bYSMiJmjjYSDe3WLeGtshIeQeH16gpGAgH6Lg3BycWNmXllmX3BwX2BncGZqboh0YXRvW2FkanZ7gL+cpqTIuHGEgnKSe3eFkoJzkIuHcnJvg3uDc3SGdIh3k4h5eXBjd4d6gJNpcoR2Z3d1Y2p8goedgYB/jo9+c4B1h3uClZKFe5iPlpCIgol7iYlreHl+dGd6aGt/eXRpeneAg31oYHiIfWtrdGh8gWl2goyRlX97fn9xfHZ8dH9iVnh+c3SLhYJ9hHGHinh5cXGFhI6Af3p/fnaPhoN3anFobIeBcW9cZmBxbElkdUtdbFRTWXJuYlFPdHhhUlhYXWFwg3RcYVxpZWVka2RQW3BJQ2NgW2NvXV14Z1RXVnZdW2VuaFZrXmFqZ2VubmhwdnqSbWmIjHl9cnt+eYKBgXx2fYOIhoNwd4RybXeCgn6Ji5N/cIB7d3h6gIx0gnh+gYGChHmAdW9+ioubnoh9hXp3hXtndIWLkHl+f3uIhoR2j4BncG5fZFxYZVltc2FgYHBsa2iIbmF0aVlfZG6Ad6naqceGh7JxiHdvjHR6hY1/eZKJf3RzdH13f29xf22FdJOFeHRrYHqCeYmPZnKEcGd1blttfYCQk3+AeJGTfnl8bop4g5ONhneYjJOQiIaFfH+FbHR2fmxndmRte3Ztand3f398YWJ4hnppdXVjfnxodYePjZZ8dYF3cYB7fW6AWld1f3B2hYh/gXltiYZ0emx2goSFf3x+en10jIJ9dGh0ZW6Kg2xzWmhdc2RHbW1LWmBXVlV3bWJQUnR2WFBWWF5gcoRvXWBjbWVkXm9jVFxxRkJlXl1lZ11bemJRVlx0W1pna2BWal9gb2Zma3FocHZ4jnRqjo11fnZ4fXeBhIF7dH2DiIeDb3KAdHF1foWCiY2KenZ/eIN7fIWHd4d8fYF+hIB7fnJ1eYyNoIyJeYl2dIJ4Xn2Fl4t4hoNzhYaEd4l6Ym5tXGJbW2FWaXNjYFtnbnBmh3FhcWZXXWNrf3zKzoe5oWptbYpscYNxe4OJfnqQhHl4c3h1dHtqbHZjhHWRgnZvZl99gnqMimVygmtqcWNYbHqFm4iCgXKWlHd/fW+Kc4WNjop0mZCSiYaLg3t5fXBwb3xmaHFhbXhxamxxeH19el1leoB4anZ4ZoN3aHSIjI6VfXKIam9+gXlvfV1Zc39udIGLfIJvb4qAcXdpeIGCgYJ4fnN8dYd9e3Nnc2Fui4BrcVdpXHZbR21qTFZVXVNVe2thT1R1clBRVFdeY3WGaV1gbGpmY1pvYVhib0dBZ1xgZV1cVntdTlVlcFlbamhdV2dgXnJlamhyZ3Bzd4Z4bpWLdH96eH55g4h/dXJ/hoWOgnBwe3h3dnmGhYeMhnl7f3SLfX2GhIOHfn5+fYd/fHh1eHiRk59/jHyKbXV/eGSDhpWFc5GKb4WFgXqDdGRuallfW1xdVGdzZWBYY3FyZ4ByYmtlV1tgan94vq57n7duYXOFaHN6cXiBhHp9i353d3J2b3t2ZWpvYYd1joBzamJefnh5i4RmcX9oa2taVm93iKKAhH9xmZNygXp2hG+DhJSKdZeKjomFiYV9eHRxbmh4X2psYG12amdqa3l3enZaZ318eWZzfm2FdWV1ho2Gl4BwjGdre4R1bnViXXF9bHV9jHuCZ3WHfm5xaXaAeX+AdH5te3yCe3hxZmxhbYl9bGxVaV92VUppak5RTmdMWHtoYU5VdWtMUVRVX2d2hGdeYXFoZ2JXal1ca2dKRGpZYmNWWVV5WU1WbWpZXWtkXFlkYl50ZW1kcWdycHWAd3CZhnZ/fnd/fIWHfXVzgoiAlYJuc3l7enNyhIeJiIN4gX11j358hIqNg4GEe36Lg3t2e3d3mp2YeomChml2fHtsg4OSf3KOgXCFgn+Cf3BnbGdYXVtcW1NkcGReV2JydWp1b2VlY1dcW2h/cG9ygHOJZGR5fWlzdXNygYN3gIN4dnJ1bWp6cWFna2eGc42DbWZdX31we4l/aW14Z2pkVVdyb4ymfIR7dpaRdH10fnxvfn2TiHibfYmHg4eDfXVwcWxndFxsZ15sdGRnZWl6b3tyWWeBd3VocIF4gndid4aLfJWCb4xqbXuCcWd0ZmFuemhzeIp7fmJ2hHdqbHJ1fHJ7e3R/aIB/gHl3b2RmYm2Fe2xqVWhhb1JKaGpPS05vR116ZmFNVXRkSk9TV2Frd39mXWd0aWZgVmRXYnBcS0tqV2NhVVRVc1ZMWHVkWV5rYFtaY2RfdmdtYnBpdG9yfnR0mYJ3foB4gH+GhHp9dYKEf5eFbnJ0fHp1cYSFj4GAeot1c5B/fIGVjYCFhH19jIZ6fYB3e6OlinmIhYRrdHt6dYKAi3puhHN5hH2Cg3ZvamllVl1bWlpTYm5kW1hhc3tqaG1pYGJYX1ppf2lrb4BnbGBoeXhqcnNzbYOAen98dXRtemhqeWpfZW5ogXaPhGdlWGJ3an+He29qcGdmXVRYb2eNp3aAenyQjnp2cYBxdXh7koJ6l3aGhICGiHZqcnVnZ25bbGNdbXJfZ2FqeGh7bFtug3J0anCBfnp4YXeGhXmQhXSJcnB6gXJjcmldcXhlcnSIfHljdIBxZ2p5dXNteXl2eWWFfH95d3FkZGNte3xqalRnYWVTSWtmT0dRakVgd2ZhTVNyXUpNVVllbHh8Zl9ucWplXVZhVW5uVkpTZ1dlXVhNVWtUSlt5X1tfa11dWmJlX3lobGFvb3ZucHd1eph+dn+BeYCAh4Z6eXqDfoGTg3F0dH56dnSEiJF9gHyQa3KVgHuCn4V+h32AfoaCgIp7d4Srnn96h4eDa3KBeXWAfoB0boZufIBzioBqcG5kZFhfWllaVGJqZ1taX3WCaV5tbFxhV1xca4FlcnR9aWlca3Z1Z3N2cWyEe318eHVxbHlnaXhmXWRzaHp3koFjY1RlcGiChXh4Z2lqYVdWWWdjjqdvfneAi457cXJ/aXtxfI59eJBzhX6AgIZuZHVyZGdnXGphXW9vW2debXRlemhddIBvcmtxfH51dmJ0hox7iYiBgXlzdYB2YnFuW3J0Y3FzhXx1ZXOAbWFte3Branx6dnRnh3Z7e3ZxZWJkbXJ9aWtTZ11cVEtxYlBGVWBHYnZmYUtTb1hKTVhYaGt2e2VlbnFnZFpXXlh3ZVRKXGJXZ1dZSFdkUEhieFpdX2xaXlxiY11+aWpgb3R4bXBudoOXenKAgHx/iYyGfXV1hniHjHxzdXWBeXp6gYyOfH6EiWlzloF6ip1+foV6gXp/fIaJc3GPrYx7e4aPfWRxh3lzfHp1cm6GbHt+bI96Y3BvYmVdZVZZWVdjZmtfXVxzhWhYcW5bXlhaXGx7YnB3dWxhWWxzc2d0dW9sg3h+f3h2bW5zZGh0ZVtndWZ2dpF6X11SZmdrg4J0fmJkalxUV11iY46kaXhzg4aReW5xfGp6b36IfXaKdIJ5fXmAaWR2bGBmX15pX110a1llXG9vYnplXHd8a25ucHh5dHVlc4STgIiDiXt3cHN/dGN4ZVxxcWJxcoJ8dGdygGVfbndqZWh6fXVvcIN2dH1zcmJfZm1ufGRoU2dXWFNNdl5QSVlXSGJ0Y2FJVG1TSk1aV2pscnxjbW1zY2JaWlthd1xTS2NdV2hTVkZYYE1HaXVYXmBsW1tfYWJchGloYW54eW1vanaBkHltgn6AgZOIhIF2dIl0jIZ0cXZ2gXh9fX6MkH9+k35wd5WDfJiSeYCAeHp+gHSIhHRxmaF6en+JlHdjdYd4c3d0a3Rvfmt4fHCRc15wbmBnYmxUWlpXaGNtZlxccYllU3JuW1pYV2BsdmNpdWppXlltc3Brc3NzaYR8fn56dm5ta2RpcWNbanJkdHaOc1tXU2VhcoB/coJdYmNdU1pgXGORn2VxcYWEknVsbHtvcHJ8fX1zgniBdHt6emRldWddYllgZ1tedmhXYl1waGF3YVt8dmlqcm94dHN1aXGCloSHf4V3dGtxfm9neFhdbG5jcnOAenNncH5cYHByYmBrc39tbnZ/c3F4a3BhXGVsbHpgZlJlU1ZRT3VaUU9YUUhjc2FgR1ZqUElQWlZra2t9Zm5vcmJbWlhZbHFXUlBmVlZoU1RFWVtOSHF0WF9jbGJYYGBhXYtqY2RtenhscGl1eYd7a4N9f4SafIOEeXyHbY+Hcm52enx0goJ8i4+Cgpd0eIGThYGeiXWBgIF0f4JxiIN2cKGWc3qGi4Z6ZXeKbm16bmZ4cHprc3ZzjWtedW5hZ2VrUl1bVWdhbGtaXHGMZE9vbl1WWFVnaXNoYnRlZFxYbXRsb3V0eGqGfH97h3aPcmNka25hXG5tY3N4h2taVFZjZHh9fXGGXWRfY1RaX1lilZVjbXCDhYp0a2l8cGd1eXV9bXt1dnB7f3VfZnJjW11WYWNYYXRlVV9gbWRhcV1dfnBoaXRxdHF1d2tthZSCiX2HcnNncH9ydHBUXGdrZnJ0gHZzY212VmNybFtfcGd+Zm54fnN0c2ptYVpkaWp3XmVTY1RVUFNsVlBWUlBHZHJfYUZYaU5JWFRXbmllfWlseGxiV11VW3RkU1JXaFFYZlRTR1lZT013dlpfZWtpWWFgXl2ObmJma3l1bm9pdnaAf2yDgH2HmHuAh4GJfmuTiHJmdIB7dYCDfYmOf4uTcnyKkYWHn4Z7f4aMc4GGc36Cdm6ki3KAjYt2d2x6jGBke3BmeXN4bG1xd4NnZHxtY2ZnaFNfXlVnX2xuW15ujWhOaW1gVFZTb2dza2V4ZGRcWG9zbHF6d3Jsh3t/dpt6eWthZWxtXmBvamVweH5nWlZYYGx4fHtwhF9jX2dWWF9XY5uIYmtwgYd9eGxsem5deHNtfGt2dG9wfIFzWGpuXlhcVWFiV2RwY1NeYmlhYmxaYX5sZmx0dm9td3dsaYaNgIp7iW5yZnJ+bnRuZFthaWlwdIF0c15pbVNlcWVWY29kfGRzeH13bHBta2BZYWZndFxkVWBVUk5XZFFPW05PSGRvXGJHWWlNSl9LWW1kYHlpbn5lYFVfVF11XFNSYGZOXGBVUklbWFBZdHVdX2VraFhiYFtejXFjZ2p4cXNuaHZ0e4RygoN6iI5+fImHjXlukIl0a3OBdH9/iIWHkYSVj3l9jI6HkZuEgHyMhXN/gXN0eHJvk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fX5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY2NjY2Njo2NjY2NjY2NjY2NjY6Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpKTk5OSk5OSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6OjY2MjIyMjIyNjY2NjY2NjY2Njo6Ojo6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyRbWZnZ2dnZ32FhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmOAvru7u7u9s21mZ2dnZ2dtbm5ubm5vamZnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJFnX2BgYF9eeYOCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fW37IxMTExMa7Z15fX19fX2VnZ2dnZ2hjX19fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkY6NjY2NjY2PkJCQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJjJKRkZGRkZCJiImJiYmJiYqKioqKiomIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95enp7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkpKSkpKNkZKRiYeOipCSk46Ijo6NkYiPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6Mi4uLi4uLi42NjY6Ojo6NjY2NjY2NjY2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCRioaNh4aJhYiQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJGKhImGhYWFh4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkI+NhYSHhIaIj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4WIhoaIg4qPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiY2Mi46Jjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn1+f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYSEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Pjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9+f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX5+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f35+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f39/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX19fn5+fX5/f35/f39/f4CAf39/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dXR2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2hoZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent4dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUVFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3enp8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9OT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NTE9STllwcHJ3eHd3dHN0d3p8fn1+fn5+fn5+fn5/f4CAgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzs4OTg7OzpAOzs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ojs4OTo4Nzo8OTc4Ozs+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1c3FzeHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7Oz9AQUJAPTw5PD08OTc5Ojo5ODg6Ojc4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+AgICAgICBf4CBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Ozw8Pj89PD07Ojw9PT08PDw8Ozs6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV1dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0NDQ0A+PD0/QD8/PTs+PT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl6e3t9fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VEPz07PEA+Ojs6Ojk3Ojw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fX1+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz9BQUFCQUA9PD07Pj06Ojo8Ojg5ODg6Oz0/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dXd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAPz8/QD0/QD48PkA/PT09Pz09PkNEPzs8PT5APT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxvcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDREE/QEBAPz1APjw9Pz9AQEBDQEA/QEA+PTw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JDQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHt8fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEFAPjs+PD89PDo+PT9CQkVAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVGRkZKTk5LSklHR0hLTEpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRGVvcHFxdHZ1eHt8e3t8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBERUQ/O0FDREI/PkE/QURFRENXdYaJin5YR0hKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gYGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRkpISUdISElHRkJERkREQ0FVdIeJh4eGiIJXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3Fyc3d3ent7ent9fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLTEtKS01KS0hIRkZHRkVQbISHhoaGh4eIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz8/REZIREVHSUtJSUdISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N0dnh5e3t7fHx9fn99fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tLS0tLTUxLTUxJRkpWbIGGhYSEhoaGh4iGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkVEQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXp7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVIR0lJS0xPTk5RTlFecoGFg4SFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7Ozw+QTs5OTk9PT47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5/fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BCRkhLSExLTlRne4SEg4KDhIaJiouLi4qJiouMiVQ7ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2Nzc3Nzg6Nzc3ODo7NzY4OTk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn9+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9OjxEQkRGRkRWeISEgoKDgoWJioqJiYqKioqLiYmKgUg2NzY0Njg4NzQ1Nzg0Njc3OTk3NjY3NjU6Ojs6Ojw4OTg5OTg3Nzo6Ojg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT09RV2tycnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3OkE5PEQ/UH2Eg4OEhISGiYqKiIeIiIiKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo5OTs6OT09PT87Ozs9Oj48Ojw7PDs8PDo6PDg6Ojs6OTk5PD88PUFCRElKTUtKS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj86Ozw6ODk5ODk5OTk6Pj0/P0N2hIOEhIWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVCQUFCPkBDQUA/PT4+QD8+P0A/QD09P0I/QUE/QT89QEFAPz9BPD48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODo7OTo6Ozw6Ojo8Oz0+QD89YYWDhIOFhIaJiYiHhoaGh4iJiouLioqKi4qLXj5ER0lLSkpGR0dERkhHRUNAQENFQ0JAQkNCP0BESEVDRURFRUFGRUZERkZEQEI+PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3Oj06PDo9PT4+Oz48Pz5CP0p+g4SFhoaGiImIiIeGhoaHiYqKi4yNjIyLioqHV0dMTE1LTklJS0hJSkpJRUNERkdGRENFRkRCSElLR0hHRkdHRUtKTElLS0pDRkNDREJBQUNCRENDRERDQT08PkBocHN0dHZ3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgIB/gIB/T0E+PT9ETEtAQkJBOTc7Pjs8Oj0/Pj88Pz5CQUQ+aISChYWHh4iJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlKSEtGREdISElFRUhGRkVMTE1JSkdHSElKTk1PTUxOS0hGR0dFRUNGRkZGREVISEZDQT9ATG1wdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw6Ozw6PT88PT0/QENCSFN+g4SEhYaGh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMTExKSUhGSklESkhHS0pISkdHR0tMTkxMSEhJSk1QTk9OTE9LSUdJSkhJRElISEZGR0dJRkNCQUNVb3B1d3h6e3h4enp8fH1+fn9/fn59fn1+fn5+f39+gH9/f39/gH+AgICAgICAgICAgH9/f1REQUFCR0hCPzg/QDg6Ozc8PTo8Pzw8PT9CQ0NMbYSDhISFhYaHiIiIiIiHhoiIiIiIiYyMi4yMjIuLi4teUlJQTU5NS0pHRkNISkdMSkdLT0xLSkpMTUxPUE5ISUtMT1FRUFFPT0pJSkpMSkxGR0hHRkdJRkVFQkBCQlxwcnd4eXp5eXl6ent7fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OD89PT5ARUQ9QkRDRkp1hoODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtKRUZGS09OT1dWUVBPUVNSTVNUT01TTFBTVVdSU1JQTEpNTU1LTkdHSkZGSEpEREVFQkRDY3F1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz08QT9BQURUS0JISUZJS3iGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBKOztRU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FQTlJQUFBRS0tLR0hKSEVGSUlJSElqc3Z5eXp5ent7fHp7fH18fYB+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0dGRT8/QUBFQUNGRENES1ZQSk9PTlBQeYaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1A/QFZVWVxkYFZZYnJeXVZdWlZFUVlaXFlfVFlnUlVWWFRUVlNPT01LTEpJSUxNS09NU290dnh5eHd5enp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH5/fn5+VkpKSUhHRkREQkE/SExJTVBLSUpPU1FQVFZVVlR1hYSFhYWFhoeIh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JXVlRaWnWDWVV9kGFcWF1eV0lWXl5bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJhc3N2d3d2eHl4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktKSUlGQkRAQTpPUVFXWFBQUFFSU1JWV1dXV2yBgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaWlhcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm9zdXd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpaUlNRT1FSUVVSVVNWXnV4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlVTVF5aWFdXV3prWFpcXF5TUFBQSU5PV1ZYW1pkcXR2dnR0dnh5eXt7fHx9fX5/fX19fn19fn9/f4CAgH9/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU09PUU9RVlFTUlJUY2R2gIOCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUVFOS1JVUk1PWVFNTlFTVVVNUVNSUE5MS0dDSUdSU1RaXW1ydnZ1dHR3e3p6e3t9e319fX59fX1+fX5/f39/f4B/fX1+fn9/f3+Afnt2c3d9fn5kdX1pcXRgZF1eW1lVUUxJTElhbJJ0UFFTTVFSUFNbUlNSUVJVVWJze3x+gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5CQkNDQT9EUENDQEM+QkhHVkBITk1HXWlRSEZPRkRFRkhHSEJDSEdISkdDQkFDQE5QTVJkdHV2dXN0dnl8ent7e3x8fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZoZWViXFhTUVBVUnNXZVtPT05MUVJQVVlTVVFRVFJPVmBrbHN2ent4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz4+Ojo+QD8+Pj5qUEthRUZISUVCP0hMTUdNUVVKQkU/Pjw9PD09Pz0/QUNCPz48PUI+SU1GVW91dXZzdHZ4enx6fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKT1BOS0xRUlFUVVVXUVFXVlBYW2JdYWdtbWxuamhgbnJpbWxxdXt6fXt4enx8eHd4ZEJAQEE8OkJDQUFDQVtcT3tOT09OS0xNT09QTEtMV05IR0FBPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV1dnV2d3l8fHx9fHx8fH59fH19fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT09eXFpJR09RUU9NUFFOUVJTVlhTUllUTllaW1dZXF9eX2VfXV5xd2teYGdrd29vbGpvbW5sZmJZR0ZGSEJBRkhFRUZDTFFPYVdSWFFQU1NSVVtPT1FXUE1JREY+OTk2NTg3OTc5OjM2NTc5NTxCPWZ0dXd4d3p5e319fHx7fH19fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LU1RTUFFVT0xSU1RXWFNUWFFMWFlZVlhYVlhZXVdYWGhza11WYHRrYWFfXWRgX15ZVVBNT01MSUdKS0lIRkNQT1NaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1OTlHbnJ1eXl6e3t9fX19fHt9fH1+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BXVlZTVFZPT1VWV1hZU1VUTEtTVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdUW2ZKTFBSUk9NTU5NTUxKRlBQVVlTVE9KTk9VU1RcVlJVU1NPTUxJSEhGPz49Ojc4NzY1OTk2NzU2NVdxcXR4enp7fH19fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1RTVlRSWFdZWVlSVU9JR09QT09NUkpPUE9PTk5PVExNSVBQU1RVMjxYTUlBUT1jYFFTUVBOUFBPTk5NUE5UUlBSTElMS09SUFFSU1RRU09MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVlFTRkZBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPTNAPmpvYVJSUUBHVFFPUFBRTlFPUE9MSkxMT1BOTVBRUU5QT0pMTU1LR0VFQ0I7PT08OT1HNjY3NkRucXV3ent7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVVlZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JCOERNU11nU1FTQUdVUE9RUVBNTU5MSkxLTE5PT1FMTk5NSU1MSUtLTEtHRkZFRDxBQT47QEU7PDg5VHJzdXl7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E+PT1BQEI9PkVIRkRGRklHSkpARkFBQEVHRElPSFFSYVxRUFJPU05PT0xMT01LTUxNT05bVktNUU9ISkhDSUpMTEtGRkZFP0JDPj1CRz9CP0BkcnV3e3p7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU05LSENFPTk4Nzk/Qj87PkFAQD5BRElFQ0hHSUdJRUJCPz48QkFAR0pFTU9iZVBNT01XS0xOS0tNTUxMS05OU2RNSkxSSUlJRUJJSkxNTkpHSUZCQkJAP0VGRUhETG9wdnp5eXt7enx6d3N4dHh8fHl6bnFybW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xMSU1QTVBPR0tFP0I9OTk5Oj9CPzxBQkFBRERHS0ZESUlHR0hDQz9CPj8/QD1DRURMTVFUTEpJTVRGSUlKTElKS0lJTE1PUFFQS0dDS0dDQ0tKTE5PTklKSUdDQ0NESUpNTElac254eXh6ent5fHZycHVydHl5dnhqcW5qbGxudHRtc3V7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxaXFoZXFISkNGR0hHSktJSkxER0I8Pj06Ojo7QUI/PUJCQ0NIRUpMSkVJSUZHSENDO0FAQj5AP0JERElNT0dISkdIS0RISUtNSEpMSElKTEpNXVJISUROR0JFTEtOTlFOS01KS0ZHR0pNTlJOTWNuand2d3t5e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnl0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lqdGhlcEZKQ0ZFRkRFRUZFR0NDQD08PTo7OjtBREA/QkNFRUlGSkpMRklJR0ZGREI6QUNDPj9DQ0NER0tNSEpOSERIRUlMTk1ISUxHRkZJSUxOS0lIRU9JQ0dOTVBOUE5OT01LSUhJT1NRUk5TZ2dmcm9zeHZ7enxsaGpvZWtwbXNxZm1saGlrbHRtcHV0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZl9wR0pDRUVEQkJBRUBEQj4/Pjs7Oz07PT9EQj9BQ0ZHSkZKSUxIR0dHRkVDPz1ERUI+QUNCQ0VHSElHTVBJRkVGS05PS0ZISUZFQ0RJSUhLSUdIUEtESk1NUU5PTk9QTkpKSU1SVVVSUFhlYWFtZnByb3J5emdlaGhjaWxmcWxmbG1naWtsc21wdnV0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VERkJBQEFEPEJBPkE9Ojo9Pzs+P0FCP0BCRUdKRkpHSUdGRkZEQ0JBQUVGQ0JCQkRFRUdHSEZMUExITklKTEtJRkhFRkVDQ0hISEtKR0tSTUNPT05RT09PTk9PS0tLUFVXVlZUWWBfXWlgbWluaHJzYmVmZmRoaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNwcmtrc01HR0VHQUFAQ0Q8QUFAQzw4Oj0+Oj89QEJAQEBERkhFSEZGSEZFRURDRUJESUZDR0VBRUdFRkZHRUlNS0hRTEpLSEhJRUZISEVDSUlKS01LUFNORFJTUVFSTk9NT1BNTE5TV1ZXWVZYXlpdZGBoY2ppZ2tfZGVmY2hnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hBQUJFRTxAQ0JEPDc6PT47PjtBQj4/P0NFRkRGRERHRUNFQ0RGRkZKRUVJR0JHSEZHRkVDRkpKR01KTEtISktGSUhKSEVLS0xMTk9SVE9IVFVUUVRQUU1OUU5NUVdaVlpZV1peWlhhYGBgXmhlY2BkZWdnamhoamdobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9zc3lNSEhHSENBQ0dFPEBFQkQ8ODo+Pj48PEJCPUA+QUJGQ0VDQ0dDQ0RERkdHR0lGR0tIQ0lIR0lHRkRIS0lGS0hNS0pLS0hLSk1LSU5MTk5PUlVWT0xWVlRRVFJSTE9RUE9UWVpZXFpaXF9fXV9jXlxiZGxjYGRnaHKFaGdqZmpubnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUtJSkhKRUJER0U9QUdEREA5PD5APz4/Q0I8QD5BQUZDRURDSERFREZGR0hGSEdJS0pFSkhISkhGRkxISEhKR0xLTExMSU1KTU5NT0xQUFFVVldPS1ZWVVNTUlFMT1JSUVZbW11eW11eYGBhYGJmXWRgZmdgZWhqZHNzZmpoZ2xwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3dGd0cmtxcmtyd3B3SUpLSUtHQkVERTxBRkREQjs/P0FAQEBEQUBCPkFDSEJFREZHRUhFRkVJSEZJSEpMSEhKSklLSkZKS0hJSkpHS0pMTElJTEtNTk5PTE9QUlVXVk1OVFZVU1JRUE1OVFNSV1teXl9dXmBgYWFiYGNkZWFkaWJkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV1c3Bzd3R1dXd2dXV0ZXFza3BxanJ2cHdKTExLTEdDQ0FFPD9FRURDPUFBQ0JCQ0VBQ0RBQUVHQ0dHSEZFSUZDR0pHR0pGSUxISUpNS01MR0tJSEtLTlFLUlBMU01KTU1OUFBQVE9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5hY15gZmNhYmduaGJpaGhteHZtaGlub3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnNxcXV2dXN3eXd1dHVjbXRrb3BqcXRwd0xNTExMR0RBQEQ+PURFRkM/Q0FFRERGQ0JFR0NCSEZCSEpJR0hKRkRLSkdISkhJS0dKSk5LTkxJTEhKTUtaZkpkW0tsUkdOTV9uVWxzW3FwYndjUlBidnVodWNhdmFYbnFiZHZpbnpmXGx1YGxrVmB3dWhqZ2hmZ2xtam1vam1vc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cnFzdHZ2dXV5d3V0dGBrdGtwcGtxc3F5S05KS0pGQj9AQj88RERGRENDQkVFREZCRUZHRERKRUVKTEtJS0xHR05KSEpLR0tKSUpKTkxNTUxMSU1MTFtzYmRwXmxsVUxOZXJdZ2VxbG50Z3BpX2FZbm1icHBia2lqZ29xdGV0bm5ccHZncE5Mcnl2a2Fha2VlbHhta3Zsbm9zcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd4dnV0Ym11a3BwbHJycXpLTElJR0VEP0FBPz1CRUZCRUNFREVFRENISEdEREtIR0tNTUpMTEZKTkhKS0pJTEpKSUpNTU5NTU1LTk1NW3Jwb25wcGtqTE9QbVhOaWJ0cnBhbW92XFlsUFttbVpxbWtvbXh4dHNpcF1gc2xxalV1eXhvY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0dFRUVCQUI9Pz9FR0JHREhFRURCRklISEVHS0pHTUxOSkxNR0xOSU1LSEpNSUpJSkpOT05OTUxOTUxcaGR1XWxxVmtNT1FuVVprXmtsdmFsZHRUZWNObFlsXHRwa2lseGp3dWhwXV9za2hXYmN3fG9jYGdoYWNpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cXNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1HSUVFRENBQjxCQEJGQ0dGS0dFQ0NIS0hIRklMS0ZNS0tSUkxITU1JTkpJSE5HSkpISU5PTU5MSk1NSlp0cHBvcXFsa09RUm5Zc2tnb29xcW9tdF5uWGF0X25vcG9xcm9vdXN0dGpaXnRjd3hyam56aGFhY2ZhYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRJS0hKQ0RERUBAPkNDQUZDSElNSEZDRkpMSUdGSk1MRk9KSldSS0dLSkpOSUlKTElLSklJS0xNTUxJS0tLU2tiWWleX2pjcnJaX1lqb19lZVVrX2NbYWFRYG1oXGpcbmlpZFtvZWRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRkpERUNGQUBBRURDRkJISkxHRkNGS0xJRUZKT0xJT0pMW1FKRkhIS01JSEpKS0tJSElHS0tLS0dIS0pMS0xKSUtMTlRbXVRQVU1RT05PT1ZRT1BRTk9RSkpOUFFkcWlUWVZbW1xVWVpdWF1cXGNmYWFmYmNmX15ma21obXR4cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzR0NFR0ZGQEVDPkNHREVHQ0lLTEdGREdKTEhER0lQS0xPS0xXTUlGRUhJSkhJS0hMSklGSEhKSEhIRUZMSUhKTktIT1xXXk9cXGBeT1hZU1xcYl5NWFpNWGFSS1lhWlNgZFxhWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRPQkNETExBQ0RBRElFR0dGS0pLR0VFSkpKRkRHSFBKTE1KTVJJSEVBSEZKSUtLSUxKSUdFSkhFRkdFRUpHQklMSUpUX1lgWGBhW2BVWFlUXV5aX1JZXFBeXFlOX1xeU1teZF5aXWBjX1lfYltgXltVWVhaX15jY2JhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN1eXp6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSERDQkNGR0VHR0lKSklIREZLS0tFRUhJTkpOTEhMTkdIRj5HR0xJS0tKS0tJR0VJRkNERUJGSkQ/SUpITlpiWV5eYV9SVFNXX19cXVleUVlcTVZfV0tRWVtRW19iYV1eY2FgYmJiY2NlWlJZVlddWl5kYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WFFKRkRHRUJFR0hGR0hJRkdKR0hGSEtJS0RDS0pNTUxMSEpKSEpHP0dGTkpLS01LS0tJR0lFRUBEQUhJQT5ISUZPXWBaW2RdX1RRUlhdXFxcX1tLV1xMUlxZSU1eUVFdX2JjY2NjYlxkY2JkY2VYUldVVF1ZW2FfXl9hYV9kbGttamtsbnZ+dYF6fISFhYWFhYWGhoWGhYaGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0VLSUZHR0lHR0pGRkZJTEpORUNLSkxOSkxJS0pJSUdCSEhRTUtLT01LS0lISEZFP0VCSEhBQEZFQ1NdWV5YX1lfW11VWFhPXFxRS0pWXlheW11WWmFSUl9fYmJgYGJiX2NiYmRkYlhQUlJTXFRcXV1eXl9fX2RoZ2xqbm5we3t8fnuAgoOEhYWFhYWFhISFg4SEh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0dERk1SSERSS0ZISEhERktJTVBFR0lKS05MTElMS0pJR0RIS1FPTUxQTUxLS0lKREVBRUNIRkFBRkNBVVVFXFReU1ZfWE5UVU1ZWkxKS1RgYVtfWF9eYl1PWWJcYGBfYmNhXWJhV2BfVFFQUVJZU15cW11dXmBiZmZlbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGSERJU2NRRVdfSUdHSERGTUpQUEZJSEpLTkxMS01LSkpHRUpOUVFOTlBNTk1OSUxCREFDQ0ZDQkBDREBMSENMTFBPTkxGTUZGSElHRkxLTU9QSUxPUFBTUExRU1JVWlhXWVdXY1ZOUlRQUVBPUVVUXFlZW11cYWFlZmNoZGxtcXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtOXk1ISFlNR0hKSEdNTFFRSUtKS0tOTVVOT0tLTEdHS1BTU05QUE5PT09ITEZgRUReTERmYkNMWkheXHNtT01WbVhLQ09fVGtWZ0ldV1VeRExRVUxNU1ZRUlRYVlRYVFRcVE9lWmhoZVpVa1RYV1VbXFtgYGFiYmJgZ2lnbmxocnp8fX6BhISEhIODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFS1BUSktHYFRISk9KSU9NUlFLTUtMT1JVUk9QSkxOR0hNUVtZT1BQTlBRUEpLUX9RSXxZWXJzV1BtR3Fub2FWUHFxdE9CanNucXNwU29fW25YXVZcWFVraFVdVmNZYFlaXlVVV39pdHV1X2F2X1hiXFxmW19hYWFiXmBjZ21vbGBwd3R4gYGCg4SCf31+gHZ4em12fnR4fYB8foCBgoR8gIN6f4F/fnd3TUlFSE1NQkRMTEdKTEZSVkxLT0hMUlhXUU5PT01RVE5PUVBLTE9HTVBTW1pUUVJPUFBQS0laeF1UeGRoWFJTUHZmdGxwYm5ma1JyTkx3bWpycHNycXJwb2+AXWV6dXhxcXpxfnJ9a3V9YVJofGVzc29zc3x9b354b39yYGBgYmJbYWFobG5rYmxmZ213foGAg357eHeAdHZ6aHJ+bnR8fnd4e36Ag3h8gXV8f3x8c3NNS0ZgXUdBRU1NSEtLSEpQT01OSk5WXllVTFFTTllZTFNSUk5MUElRUlRZV1dRVFBQUFJLSGd4bGN4cW1aSktUeXB1bXVibnZQZGRIZXZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/cGhuWHV1anZ1cIBhc2h9aWx4fG9fX19jYlxfZGVnamplZ2JjZGxscHBzdHNzc3lxcnhibHRncnl7c3N1eX6Bc3Z6bnx9eXhybk1JUnROQ0JFUFFIS0xKTFFPT09NUFpgWlhLVFdQYV5SVlFZU01QSlNUVVhXV1BVUE9OU0pLcm91dXF1cWNoYFZuS3FwXkdoeVd2VEtoeH13YHl7c25hXW1vZFNncnVubXlwd2x2c3RxbG1cc356a215fGx1bnxscXZ1eF5fX2JfXV9lZWlnaGZlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tS0taVkhHRUdSUUtNTkxMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5KVFRWV1lXT1NPT05SSVJtSGl3S2BkdnZUVmxObmx7cmFqZ391VEtXa2d8bG1seF9acHp7X2B6c2Nyb3hxaGR8aXJ7XVRLa192dWxqdnx7bX55a3xwXV5eYltfYmRlZ2ZlZWNbY2Npa2tyc3J3Z21paGRnYGFsYWdzcmxnbG1yfGttaGt7dG1ta21PR0pLSEpISFJRTU9QTExTU1JPU1JYUldUUFdaVlZUVFRhYFFPTktUU1NRVlZPT01OT1FKSFFNT1VMS0tSU1JRUk9WVVFRT1JSWFhQTU9VVFdYWFtbVVFSV1tXWFdbT1JUV1dYUV1YVlxVVE9YUldXWFlaYFxncl9bW1pdXV9jWl9jY2VnZGRkY1pkYmdmZm1ubXVmZmdjYGZeXWdgZGxoZmdraHB6aGdna3VqaGdpbFBJS0tMTUtKVFJOUlFQTFZVVFBUVVhVWlZSW11WVVRXVVlYT09MTldUUE5VU05QTkxRUEtJUVFLUU1KSk9RVFFQUVNSSkhNT1BRUlBQUFRVUlhXXFdTUlBRVVVVU1pRTlJRV1VTWVZUWFRTUVRTVVVZWVheWl9hXVxaWlxcYGNcXmJiZGdlZWViWWBhY2FiaGhqbmNhZF5fY11aY1xibWFeZmZnbXNkaWhra2VkY2ZoUUpLS05PTE1UUU9UUVJNWFdVVFZYV1daVlNcYFZXVllVWFRRUEtPWFNQTlVQTlFOTFNQTU5VU05RTk1OUVNPVFBSVFROS01PUlRUUVFRVVdVWVpbWVJVUlRYV1ZZXFNPU1RXVVRZVVZYVFJRV1VWWFxaXGBdV1lfXV5dXF1gYV5bYmNjaGdmZWJYYGBiXWBoZWdlYV5fXV1eWlpfWl9nYF5eXWNoa2FoZmhmZGBiZGJQS01MUFFMT1RQUFRRT1FaWVhXWVpaWFlWXWpkVlhZWldWU1RPS09WVFBPVFBQUU5NUlFPUVhUUVFPTU9SVE1XUVNUVU9OTlFUVlVSUlJUWFZaXVxaVlZRUldYVVtbVlBTVVVVVlhTV1dUUlFYVlZbX1tfYF9WX11eYF1cYF9fX1piY2VpaGVlYlliYGJeXmZkY2BiXVxcXFxZWltYW2FbXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVVFPVlxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVdTTU1ST1FST01QU1JVWlVUUFBMUFdVUFZSU1JYTU9QUlVYVVRUU1RZWFteXVxbVlJPVVZVW1pWUVNWVFZYVFNYWlNSUVlXV11fW2BgYFZiXGBhXWBiX1xgXWNhY2hpZWZgWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFpcW2BeYFteXmFgX2NcWWBaUU5PTlZRUFVTUFVUU1BXXFxcWV5cX1dcXmpwd3mAY1xbVlZZUk5QV1NOUVFQUlRSTFJUU1lbV1VPUk5TWFVTUVRRUVlPUVNTVltWVlZTVlpYXV5cXF5WU05UVlZbW1VRVFRVV1hSU1lcVFJSXFhaXV5dYmFgV2JbY2JeYWNfXGJhYl9kZ2llZ11cZGBhYGFjZF9iX1laX1tcW1hYWVdXWlpaYV1dW11cXFpdYFdbW1pQT09PWVBVVVNSWFJUUFtdXl1cYFxgVVxcaGpyfXNsaFxVWVdRT1JbU1JRVFJUVVRLUVZVWlpaU09TUVVVVFJOVVFSWlJUVVRYXVdYWFNYXFheXVlaXVVVTlZWV15aV1FUVFdYWFNWWVxUUlZdWV1dYV5jY19ZYFtlYl9kZF5eY2NhXmVmaWVmXl5kYWFhYmNkX2JeWFtfW1xbWFhYWFdbWltgXVtbXFtYWlteVl5ZXVBPT1JaUFpVVldWVFRUXl5gX15iXGBVXV5ia3l1bX1sWlVaVlFRVFxUVFRVVFZZV0xSWlZcWlxSUFVTV1VVUk9XUVNXU1dVVlteWFtZVVpeWF9eWVxZUldSWVhZX1lZUlRVWVlZVVdZXFVUWl1dXmFiYGVkXV5dXWVhYmZkXl9kY2BcZ2VoZmRiYGVhX2FhYmJfYF5XWV5aXFxaWVlXVl1aXV5bWltcW1dZXF1WWFddU09QV1lRXFVWWVdXVVhfYGFhYGNdYFVdXmJlZXaCe2hYWVpUVlRWXFhXV1ZWV11YT1VcWV5dXVRTWFJWVVNRUldRU1ZUWFhYXl5YXVtVXV9YX19YXFZRWFRZWlphWFtUVlhbWVpXWFlaV1ZdXmBfZGNiZWVeYlxgZmJkZmRfYGRiYVtmY2hmZGZhZl9fYWJhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtZWlpdX11UWV1VTlRaVlRcVVdXWVdWXGBhYmNhY19fVltgZGFfenVvaFpcWlZYVlhbWllbWVhZYFZPVF1bYGFcVVVZUFRWVFJVVVFTVVdbW1xfX1pfXFZfX1ldXlldVlJYV1lZXGJZXVVWWlxaW1paWVpYWV9fYGBkY2RlZWNkWmJmY2dmZV5hYmBjXWJjaWVkaF9nXmJiY2FhYF5fWFRaWlpbW1hcWFhcW1pbV1daWFdcW1xgXVZdXVNPVlpWVlpWWVZYV1hdX2JhZGFkYV5ZWWFkYmBrZmheXF1bV1dZWlxcXF9bWVtiVlNXXl1hY1xTVllQVlVVVVVVU1VUWF1dX2BgXWFdV2FeW15cW15YVVhXW1pfX1teV1hcXFxdXVtaXFdaX2FeYGRkZGZmZ2NZY2ZlaGdkXmNgX2VjXWZpZGVpX2deY2JjYWFgX19bWFlbWVpZWFpYV1tbWltXWFpUWl1cW2BcVV5iTVJXWVZXWllbXFlXWV5gYmFlYWRhXV5ZYWNiX2FgYV9dXV1YV1tbXV1fX1xaXWNYWVhdYGNkX1JYWVBXVVdYV1ZWV1ZdXV5hYmFfYl5ZYV1dXllcXVlYVVZbW2BeXF9ZWV5dXl5gXFpaWVtfYl9iZWRlZmdoY1plZmdpZ2NfY15hZmVaaWljZmljZl9iYmNhYGBfXV1aV1tZWVhYWllXWltaWVdYVlVbXV1dYGBiYXhLV1dcWVddXFxdWldcXV9gYmRiY2FdYFhiY2JgY2FjXlxdXFhXW1xfXWBfXVtgZFxcWFpiZWNhUlxZT1hWWVtZWVdZWmBeYWJjYGFjX1xiXV9dW15dWVlUWF1cX19eX1taXl5gYmJbW1dbXWBiYmNlZGdmZmdlXWVnaGlmY2FiW2NnYFxpaWNoaWZlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXVlhQWFpdYWNmZnJrf0pZV11bWl9dXF5cWF1bXl9iY2JhYV1iW2JkYmBjYmJdXFtaV1hqcWBcYF9dXGFjX15ZWWNlZGJUX1pRWVdcXVxbWVtbY2BjY2NgYmRhYGNeYFxeXl5aWFVbXlxcYWFfXVtgYWJmYl5bU1xfYGNkZGZlZ2dmZmZgZmdoaGdkZGBbZWdeYWhoY2loZmNgYmBjYl9fX11dW1pbWVhYWFZaV1xbWlZWVUxYWFxnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaJh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ1dXV1dXV1dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl6e3t6ent6enp6enp6enp7e3t7enp6enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnV0dXV1dXR1dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXp6ent7enp6enp6enp6e3t6e3p6enp6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx4xdTS0tLS1JN7fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09PPxMXFxcXFx9LU1NTT09PEvr6+vr6+ytPS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXjV5+Tk5OTnmXt/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk5eDU1NTU1NTW4+Xl5eXk5dLLzM3Mzczb5uXl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dn5/f39/f4B5d3d3d3d3eHl6enp6enhvb29wcHBwcnJycnJycnd6eXl6enp+g4ODg4ODg4KCg4ODgoOEhISEhIODgoKCgoKCgoSEhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dHR0dHR3dXZ3ent4e3h3dnl8enp6eX15eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl6enp6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd2enx5fX17fXt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3Z6fnt9fX1+fHh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3h5fX17fX58eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eHp6enx8fHx7fnt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5e3h6enl8eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHh5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veXl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fHx8fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qLi4eHh4SDgoGBgYGBgYGCgYKCgYGBgYGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhISCgYGBgYGBgYKBgoKBgYCAgYKBgYGCgYKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYKCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoGBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGBgYGBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fXx8fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioWGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjImGh4mMi4uKhoaDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioiJio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSk5CLioqLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCgoGCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODgYGChISCg4KHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYKDgYCCg4GChYWFhYaGh4aFhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKiIKCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKBg4OCgoGDg4OEhIOCg4WDgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJGPi4mHgoKCgoKCgYGBgYKCgoKBgYCBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4ODgYOEhYSEhYWEg4OEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiImHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCgoKBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYmHhIKCgoKCgoKBgYCBgoKCgoKCgoGBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eIh4WEgoF+foCAgH5+fn+AgYGBgoGAgoKBgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYGBgoKEgoKDhIKDhIWFhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgoKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDg4OFg4GAg4KDhYWDg4OEg4SDg4SEhYSEhIKBgIGCg4KChIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOTko+MjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgICCgYF/gYGAgIKBgoKCgYGCgoGAgoKCgoKCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGCgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSTkpSSj42Lh4SEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeGhoaFhoODg4OBgIKCgoGCgH9+f3+AgH+Af4CBgIB/gYGBgYOBgIGBgoSDgYGBgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGAgIOCgoOCgYKCg4ODhIKDg4OCgICAgoKCg4KCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhIODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhYSCgoKDgoKEgoGChoWDhYODhISEhoWEhIWCf319fX6ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhIaFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMioiFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgICAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIOEg4ODhIWDgoOEhYWGhYaGhYaHh4aDgX5/fn5+fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoKCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4OFhYWFh4eFhYeFgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGh4aGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4KEhISFhIOCgoODhIODgoOFhIWHh4WEgoB/f39/f4B/f3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiIiGh4aHh4aGhYSDhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eHhYODhYSDg4OChISEhIWEgYCBgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYmLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEhIWFhIWFhoSEhIWFhYaFhoWDiZSTkI6RjoqGhYaFg4GBgYKCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4OCg4SJioeHhISFhIODhYOFhIODgoGCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KEiIiHiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoKDhYmKiYeFh4WEhYWEg4WEg4KCgoKCg4F+fX5+fn5+fn19fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeHiYiEg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaDgoKDhIKDg4SCgYKBgYGDg4ODhJGSkY6PjYuHhIaGg4KBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWGiIuKhoSGhIKGhoKAg4ODg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GDg4SFhYWDg4WEhISEhISFhIKCg4GEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhIWEh4iFg4GAgIF/fn2Cg4ODg4KCgH19f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgIKBgoKCgYODgH+AgIGDgoCAgICBgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhoyTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5/fnx8f4ODgoOCg4F9fX5/gICBgH59fX19fn18enp6f4KCgH9/f39+f3+Afn2Af3+AgIF/gICBf39/gYF+fX1/gIF/f35/gIB/gICAgX+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCBf3x9fX59fX6AgH59fn17fX6Cg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enl6gIB/fn9+fn58fn9+f4B/fn9/gH+BgH9+fX5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f35+gH+Af36AfX1/gYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7f39+f39/fn1+f3+AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f3+Af39+f36AgH9+gH9/fn5+f39+fn99fHx9hZKSjYyLioiJiISEhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgICAf36AgYSDgoGBg4SEg4SAgYCAgYCBgIGCgoOBgIF/gIKDg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gH+AgYGBf3+BgH+Bf4CAgIGBgoKAfoB+f35+fn6BgIKBf39/f4CAf39/f4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEg4GDg4OCgoKBgoF+fn19fX5+gH19fX19fX19fHt6enl5eXmAgoKChIOAgoOBgIKAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f3+AgICAgICBgX9+fX5+f39/foOGh4eIgoWEhYOEhYSFhoaGhoaFhYaBgIODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgoKCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iHiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf4B/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGh4eHh4aHh399gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCDg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WFhIWDgoODgoODgoKCgoODgoKSkIuIiIeIh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgIB/f359fn5/gX+AgoGFhYWGhoeHhoeHiIaHh4eGh4eHf3x9fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomXhIODhISUk4CBgX9/f35+hIuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKOi4mIiImHh4eFhoWEhYSCgYKCg4ODg4ODgoGBgYCAgICBgICAgH9/f3+AgICAgIGBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSEhoV/fHx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3x/goOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+LioqMiYmJh4WGhYODgoGCgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoOEg4KDgoKFhoSEhYWEhoSDhIOCgYGDgX99fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gXp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWChJGRjYuMjI6KiYmFhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGDg4KDgoKBgICAf4F+f35+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn9+gIJ8fH9/gYCCgH58e4qCfYB/foGAgIGCgYKAgICBgH+Lk4+Li42OjYiHh4WFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICBgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3p6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX18fXx8fYB/gIB+gH5+gpSRi4yNjY+KhYaGhYSEhYODg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKCg4aHhoZ+iJWKfoGBgH+Af36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4d/fXx+gICBgH9/fn19fX1+e3t9f39/gH1/foCMkY2LjI2NjYeEhoaFhISEg4ODgoODg4OCgYGBgYGAgIGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+Cg4aGhX9/hYF+f4CAf4B+fn9+f4CAf4CAf399fXx8fX59fH19fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19fn9/fX6Afn5+hJKMi4uOjIuKhoSGhISDg4ODgoOCg4KDgoGBgYGBgYGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAen19fH5/gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fIGDfox+fHt7fX59fn59e3t7fXt6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CKj4yKioyLioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH99f399fn9/f36Af39/f39/gICBgYB/fYB/f35/fn5/f398gn5+fX19e3t9fXx6fHx+gIKBf4CAfHx9fHx8fHx9fH17f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4WChJGOjIqJioeHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f35+f4B/f39/f39/gIGCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn59f358fHx8fHx8fn57fHt8fHx8fXx9fH58fXx8e3p8eXt8e3t9e31+fn+AgIOHiYmJiomKiYWIkY2Lh4iGhYWDgoKDhISDg4KCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foF/f39/f4CAf35+fn1/gIB/f39/gH+Ag4KAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn19fX19fH18fX19fnx9e318fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+goWIh4iKi4uKiYyQjYyIiIaFhIOCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5+f4B/gICAf35/foCBf3+Af4CBgIKEhIGAgIGBgIF/gIGCgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIeJioiJjY+MioiIhYSEg4GCgoKCg4KBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXh8en9ygX17e3x8fH5+fX2BgX+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58fn+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX19fn1+f319fXt8fX58fHt8fXp6eXl6eXt7fn6AgYOHhIiNjImJhoWEhIOCgoKCgoKCgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH+CgIGCgoCAgYCBgYCAgYKCgoKGhYSBgYGBgYOBf4CChIF/foGAfX6Bfn1+f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX59gIOAiYyJioeFhYWEg4OCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGEgX5+gIB9foB+fX5+gIB/gX5/gH9/f4B/fX5/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCBfXx8fX18fHt8fHt7e3x7fHx8fXyJiYeHhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHZ3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gIF/fH5+fX19e3x+fH18fHx7fHt8fomFhoSFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp9fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX1+gH+BgH+AgIB/fn19fX59fn59fYGEf4B/fn+BgX99gH99fX59fn59fnx7fHp8e3qAhYKDhIWEhISFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgYGCgYGDgH6AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl0dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIOBf3+AfoCBfoCBgIB/fn5+fn59f35+hYWAgYB/gIOBf36BgH9+gH6Af359e3p7enx7eoKDf4KCgoKDgoOCgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoJ/foCBf359fn5+fn1+fX16e3yFhHt7c3l7fHB3dXZ3eXZ0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX5/f3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+BhIF/gIOBf3+Af4F/gH98e3t6fHt8gYB/gX9/gYCCgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOCgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICBgICAf4CBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fH1/fX+AfH9/fn2BgIB+fX2Af36BgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgoOCgYF/f4OAfoKChICAgoGCgoSBfnt7fHx8fX19fn16fn1+eX5/f3x8fH59foGAgYGBgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYODgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn9+fX2Af4CBgYF/fnx+f35+f4GCf4GBgoOHhYF/f35+gH+AgYCAgICCgoGAgH6Agn9+gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXx5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398foB/gYCBgH9+fX9/fn5/gYB9gICBg4SDf39+fX5+fn+Af4CAf4GCgYB/fn+Bfn+AgoKAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fHt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFg4ODg4ODgoGCg4KBg4J/gYB/f35/gH19fX1/gICAf3+Af3yAf3+BgIGAgH98gH9+fn5/f31+foGBgoJ+f359fn5+fn9/gH99gIGAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36FfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3Zxd3lyeIWFhYWDhISCgoOCgYGCgYCDgYCAf35+fn6Afn1+fH6AgIB/gIF/e4B+gIB/gYGAf32Af35+f399fX1+gIGBgX5/fn5+fX19f35/fnx+gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fX17fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGBgICAfX5+f4B9fH59f4CBgH9/gYB8gH+Afn+BgH9/fYB/fn9/fn19fICAgICAfn9+fn59fH5/fn9+fH2Af359foCCf36AgH9+gYOCgoOFhYKCfn58e3t8fHl3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzcHh3cXuFhoWFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgH+BgH1+gH9+f4F/gH9/gYB/gH99fnx9f4CAgIB/f39+f318fn9/f399fX9/fn5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WHhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGBf4KBfX6Bfn5/gX+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2EfnR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYGBgYGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf4CAgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f4CAf39/f4B/gICAgIB/gIGAgYGBgoGAgH9/f359f357gZKMenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2FhoODgoOCgIGAgoKBgIGBgYGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB/fn1+gH59gICAf39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+fnyBhol8fH57e355ent6e41+d3d5e3x7fXx8fHx7fXx9fX19fH18fn5+f39+fHp8fXt9fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICBgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX+Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgIKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOBhISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+BgIB/gIB/gIGBf4CAgICBgIGBgYKBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYODg4OCgYGCg4B/goGFg4OEgYGDgIKDgYGAgICCg4KAgoKFg3+BgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgYB/foCAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKCgoKAgoGBgoGAf3+Af4CHfn58en18e31+eHd2eXl5fH18fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCgoSEgICCgYaChIOBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn99f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fYB6eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYOBgoKBgoF+gYCAgoGCgYGDgYCAgICAgYKBhIB+gYOBf3+Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIODhISDg4SDg4GBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn5/gYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoSGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKChYSEg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX16fHx9fXx6e35+foCAf4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnR9h4eDgoSFg4OEhYSAgoSFhISDgoOEhICEhYOCgoKDg4KDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9f31/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn91dn+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoGCgoODgoOBgYGBg4F/goSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoOEhISEhISFhIODhIWEhISDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx8gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWBhYWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4KDgX+ChIODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEg4SEhIWEhISFhYWFhIODg399gYSAfX18fHx8f4F+fX5/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WBgYSEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgX+Bg39+fXx+fX1/gYB/fnx8fn9+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhYSChIOGgIKFhYuJhISDhIWFg4eGhoSEhISFhISEhIOEg4GCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIF9gXWBeYN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgISDgH99fX59fYGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISGhIGDhIWDhIWDioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2Cg3VzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfH9zgoN/g4N9gX19fn1+goOBfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ5eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugIh5bX1yc3Zzdm1teGxweWx1fX9+fX6BgIF9gH59gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYF/f3x/fXyBfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/foKDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeHiIaHhIaGi4qFhIaHh4WDhYWFhIKFhYWFhoaFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhIWGh4aFhYWFhoaIhYWGhYeHhYaEhoaJiIWEiYqIhYSGhoWFg4WFhIWGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dXBvemxzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJiYeGhIaFhoaFhoWEhoaHhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhYaFhoSGhIOEhIaEhIGDg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWGhIV9d4WDhISCgoF9f357fHt+e3x8fX9+fXx+fYCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoWGhoeHhoWHiIiIiIaEh4WGhoiGhYiHiIWHhoaIhYWGh4WGhoWDgoWFhoWFg4WEhISFhIWFhIWFhIaHhoaFhIaHhoSEhIWDhYSChIODhYODgn2Af3t7fH17fHx9f358fH59f399foB+foB/fX18gH1+fn5+fn98fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYSIhYaHhoeGiIaHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoaEhoaFhoWEhoaFhIOEhIOFh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fnx/fn19fn59fXx/fH5+fH2BgHx8fH18fHx+ent7fX6Ih4KFiIeHhoaGhoSEhoaHhoiGg4SEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGh4eJiIaGiIeIioiFh4iFh4eFh4aHhoeFiIiHh4WGhoeFhoaFgYSEhYaFhYSEhIOEhYWGhoaFhoSGhYaHhYWGhoWEgoSDgoSHg4SBgoSEg4GAgIB7e359fHx8fX18fHx9fXx9fH59fH19fHx8fX18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGg4WGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYWEg4SEhYaGhoaGhoeFhYeFhoWGhYSChIODg4eBg4CCg4OCgoJ/gHt9fn17fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19f318enp7e3x8iIeChoaGhoeGhoWDhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eGiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aHhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWGh4aGh4aGhIaFg4ODgoKDhoGDfoKCg4CDg39/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhISFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhYOFhYaGhoaHhYeGh4aHh4WEhYWDgYOCgIOFgoN+gYGBf4OBf39+f35/fHx9f317fX18fXp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFh4aIhoWHhIaHiYaGiIeHh4aHiIaEhoaGh4aFh4OEhYSGhoaHhYWEg4WFh4WHhoeFhoaGhYaGhIOEhYGBgoGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXp6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaFhYWFhYWDg4GDgYCCgYWCgIB/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWGhYSHg4SFhIiGhoeFhYSChoWGhYeGh4SGhoaGhYaDg4OFgH+BgICEgIOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH5+fnx7e31+fXyHhoWGhoaFhYWEhYWEg4KBgIKBgICAg4F+fn6AeXp9gIODhIeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiFhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIOGhYaGhoaGhIWGhoWFhoKCg4R/foCAgIF/g4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8ent7e3x9fX18f359fHx9f358e4eFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYOEhISGhoeIh4WFiIaJh4WDhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhYSFg4WFgYGDg39+f4B/f3+Df3yAfX1/gn2AgX5+gX59fX19f3t/fHt6eXp6eXp6fHl6ent7e316e3t7e31+fX2AfX18fH2Af318hoOGhoaGhoOEgoWChYGBgH9/gIB+f4CCfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWGiIaFhIWHhYeFhYKDgoGDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SEg4SDhYSAgIKCf319f35+gIN+e398fICBfYGAfX2DfH5+fX1+e357e3p5e3p5enp7eXp6ent7fHp7fHt7fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5+gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhYSEhoaEhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDg4SDg4B/gIF+fXx+fnx/g318fnx8gYB+gn99f4J8f359fXx8fHt7enp6enl7enp6enp6ent8eXt9e3x+f3+BgH1+fX19f4CAgIaEhIWEhYKDgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIaEgoOFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhIWFgoKCg4WEgoGBgYKAhYOBf36Af358fH59fH6DfXt+fH2Bf4CDfn2AgX9+f318e3x9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc6PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZMPTg3NjU5OTk8Pjk/PEQ6Ozw4Ojw+Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo7ODk6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk3Ojk6Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1NXU1NTU1NTV1NTU1NTU09LT1NTU1NTU1NTU1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szMy8vLy8vLy8vLy8vLy8vKysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2tra2dnZ2dnZ2dra2tra2dna29vb29vb29rb3Nvb29vc29vb29vb29vb29vb2tPS09PT09PU1NTU1NTV1tXV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzM/Qz8/Pz8/Pz8/Pz8/P1t7d3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqJkpmYmJiYmJiYmJiYmJiXjIuKioqKioqKioqKiouGgYKBgYGBgYGBgYGBf4/T0tLS0tLS09PT0tPT0t3j4uLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzMzQ0tLS0tLS0tLS0tLS0d7s6+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTUWJsa2tra2tra2tra2traVVTU1NTU1NTU1NTU1NUS0NDRENDRENDRERDQz9d0tPS0tLS0tLS0tLS0tDg7Ovr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7QEM+Njo3Pj87PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX18zM0dLS0tLS0tLS0tLS0tHd6unp6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1ZlcG9vb29vb29vb29vb21ZV1dXV1dXV1dXV1dXWFBHSEhISEhISEhISEhEYNHT0tLS0tLS0tLS0tLQ3+vq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87PkBAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNzdDS0tLS0tLS0tHR0dHQ3Ojn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJhb3h3d3d3d3d3d3d3d3d1Y2JiYmJiYmJiYmJiYmJcU1RUVFVVVVVVVVVVUWvS09LS0tLS0tLS0tLS0t7p6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPzs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3Ozs7Ozs7Ozs3Nzc3Nzc7Pz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Pzs7Ozs/OzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy83Ozs7Ozs7Ozs7Ozs7OzczMzMzMzMzMzMzLy8vMzMvLy8vLy8zMy8vMzMvN1NTU1dXV1dXV1tXW1tbY2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Mz9PS0s7Nz9LOzs7Ozs7O0dTU08/O0dLOz9LU1dTQz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tfX19fX19bX19fX19bX19fX19fX19bW1tbW1tbX19fX19fX19fX19jY19bW1tbW19fX19fX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7O0bCDhJPO07iez9GcgoSKxs/Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8mbu7idr7eXmbm6lbi5r6HSzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q+QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9HDoo+Aicmdo6iy0ZJ9fq+x0s7Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Rv56Kp9DTwoaatdXTzZ6exNDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/P0bqkrJye0dajmLTU08CgoNDQ0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz9HAoJ6TpbfYopm11NWwoqnV0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU6OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0qavrpum2aKZtdTVpKG51NHR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NHJ18SYoNmimrbUzp6fydLR0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzs8OT0+PT07Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXFjZ6gnajao5q118OfodLR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HJwaGtoaC/2KKbtNmypKbW0tLS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09WrjY+p1dayhMbWuYO/1dLS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oz05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR1MG91dLS0cTV0dHC09LS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQD43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dHU1dLS0tPV09PT1dLS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk5NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87Ojg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VGQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg2NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODc4NDs/PD89OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2loeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCDdnR8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg8OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTY2Njc4ODo9Ozw+Ojw6Oj09OTw8PTw9PTw7PURIRENBPDw8PD4+QDs4PDgxNTpBRkVXrrW1tba3uLi5uLi4uLi3uLm6uri4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODg5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg1NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q6ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU5NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqZG1nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU1ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp14cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTc4Nzk3Ozo6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW1tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlqKmmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTo+NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFCPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDs7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNAREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9CQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6Ozs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ozk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampubm5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cnJucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD4/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5AQD1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo8PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8Ojc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3Ojo7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ubm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuOj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDY8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVj4uUk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODUzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMj4+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFTE9JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEFCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouHiIWEiIiJhICCf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo8Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU3QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIx/h42Mi4uHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVGJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI1NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpKOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFNfTUhRSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipamnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxkY1tdWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSloqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGdiYlpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaatpqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJfaF9jU1FZVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6qsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbX15aXFZcaGRvY25paGJeUFBAPzs6ODk4PDs2MjQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2rpamkpaqnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYl5ycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWtuYV9kYFBPQUA7Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk7Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaChqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYWxodWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3ODo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2s7qxqq60sbCxtLS2vLy+vLy9xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyak5aUlJiTkJqdmIqLh4CAfIJ4YV5ZVGFoYGZzb3NpdGNpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsPDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bm1bYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbGnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw7PkJERT4+PUBDQ0NERDs6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tbPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqTkZmXnqGVmJqSmJSVkZSamJOPk52WkouRfnp8f3Rra25kb2xocXhveWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJCQD1AQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQy8bGwMXHy8jUy8rIxr+7u77EvsXIxsbDxMO4tMC3tL3BwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4uLu2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmbmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ3c3hmZl1kW1JYSUY/Ozc4ODc2MTY5NzU0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw6PTs7Pj5EQUFDQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQiouMjpKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/JzsnBxMHHysrGysXMyM3GyMW/w8DLzc/JxsPDxMLEvbi+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWpoXWpvbXh3YmJgYF1YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNTs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIx8nHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraapu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYWd1Z2lodG14bF1kW1VfWUxIRDY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw/PT9CP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBxsHLysjGzMnNxcbFw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZHRuc2JcYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLFx8jG0snBw8O/v77Ey8jKy8i8u8jHyc3Iw8jJycXFw8LBwsfHycrHzMjHyM3Gy8/Ft8DAwMC7u721s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JvZmVnY2pkYWptbm5eWFxWVU5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbBubvDuri5vL7BxsHGurnJycPFxMDEwcLBxMHDvr7CwMDBwsvDxszLxcjRwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmZiWllZXFhRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs7Ojo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7q9wLm9urq0v7i1t7Ovu7y3wLe+wr/Bu7/AvLvFvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCnoaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYd9cWNgYmJnamZmaWVpXVVVU1lPU0tFOD82Ozo3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6PD1APz5APT0/Qj48QEFDQ0E/Qz06NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1usG4vri/vL23tbewrri2ub+7wMC3wby7w7a6yLi2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGhoqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWRmb2lla2dYWE5LS0pSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88OTc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+2vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8try8wMS5t7e3trq5urvAvcPAusTCvse4ubitt7W4urS3s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8u7q0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucGdwa3NlYmxfW1RIS0pESkJDRz85Ozg9PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz89PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9v7vEt7a4trfAv8S8wsXFx8fKycbPwsG4rra1vL64u7K+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrq/wb+9tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG53Y2dhW2JQS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw7Pjw5Pjk5PT47Pz5DPD8+QD89Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC5r7K8vLC3u7a7vKuro7C5vb6zvL68xbiyuLm9x8nKw8fIxsbJyMzO0czKxLW6wMPIv7+1v8C/xsa/y8bDv8G8wMPMysfFxsG5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmFhTUhNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPEFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+ts720uMGxsLG0vMO8urq+vMS/t72/vcfMxsfJxsa/xMTKyMzMzcvGwsPLzsK8ub26ucDDv8jGxMHBv8XAysnDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3tfcGNbXV9eU0k+QkVJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PUA+QUFBPj5BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6trnEuLW8trq9wby7v7a/wb+8v7rAy8LHyMC/vLy/xcLHy8jBw8DAycrCwLu7sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnptc3hzZ3BdWl5cWVFFRENNSUFEPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCOz8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7u9usO7t723ucC7uri4tcXBw8O7ubO0usG9v8fAucC8vsXEvb65srCuuLe/w8fDxL29v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypqKlqqyvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x2bHV6cG1oXF9fWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcmJqYmJWZnZmdn5udm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnBwLe9ubi5trW/s7SyuLG7wcDDt7etsLW4uLjCurS7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6c3Z2d21wYF5lXVtUSjw+P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+3ure2trK0wLaytLizusDBw7m3srKytLK3vrqztbK8ury2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXR3dHZxbF5iYFtdTkhBPz1IQ0ZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWTmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u7y4trq2scC6t7m4ubvBwcTDu7u2tLSwtrq2tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xcm6vb62saeknqGpsa61ubaysau0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/d298b3VybWNcZlhcXVJOTUE+SkJASklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY2OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOxrba6rqy8sri5t7u/vbm+wLS/u7y6uL7CvMLKx77AuLm2srS2s7SvrLu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLKus6mmqaquqaKal5eRnJqYo56ioq+npKymqZqanpqhp6emp6mvtrKrtLavqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXJ2c210aWtdW2pUXVxPTUhERkxBRk1GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDw8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vbWyuLS5urW5u7W1s7W7vMC7vsC0v7m5urG6w7zCysW/u7+/ubO0s7GxrrC5uba8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jo6OhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmJ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIP0hRRE1DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODs9Pjs8PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aipJ6gn6egqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28uMDBvry8vLmura+ysrq6t7e1tby0r7Srtrq4wMTBu7W8vbiyrbOwr6yut7aytLWvqqSem5ycnqion6CoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKqrnqWjm6OclZCMj4+Qk5CWlZaYn56empmml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh4g3x2f3lid2xuXFBoVFBOR09MTENPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Oj07OTs9Ozw8PT48QD0/PDg7QEBBPz8/OTQ5PDdBQ0JEPUBDjqqko6Khop2rpaaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLm1p6Wsqqi1srGwrq+yp6avo6+utcG6tbeyt7aytKuytK6qq6+wsrSupZ6SmJSPmaCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6apsKOlp56gnJWTkI+RkJiQlpWYl5+Ym5mbo5mXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fIB1dX1ta3tkaFVRY01JSEdOUk1KTUc7REA8Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiYl5ahqKyutre6ubq3t7uuqKChqaGgrauqpqmkqaOkrqWsrLS8t6yysa+xrbWvr7O1qqetrKOcmZSOkZaXmZmdoKOim52lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrKrpaqqoJqYmJiVk5aak5WVmZWal5eYoJ6cnJeboZuemqOnpZ+hoqKjnJuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHh6YGJSVV9ISUlLU1RJUlBMOT5BNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OTnJ6jqK6trKurr6qvqZ+XnqWenqWmpKCin6agoq6rrK21sramr7Srqaq0sbCwuK2noZyempSYm5qRjpGWkYyPjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruqimq6erq6msrKegoKOxrbGxtKmxr6KZnJ2eoZmbm5qYmZuUlZqWmJykoaCao6GanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHZ2c2iCbGVcU1pZTVFKTk9UTFJMQTc+QjY4PDc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0/NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlZmSkpyYoZ2qoqegnqehpJ+ckpyim5+ho56doJ+joKKvrqyvsay2p62xraamsK6trLCnoJ+ioJeRlJyhnJmYkpOfnaGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9t76wrLGuramqtLGwp6uosrW3s7essbSjoJ2loKyhoaKgn5qYlpWfm5uYpKGgnqOhoJ6bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1tWlJgSFFVSEZVVkpCTUc9Skg4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pjc1OD09P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjpOemaidrp6nnpyhnZ6ampKYnpyioqCgnaKfn56fqaunrKmqtKurraulpaqoq6yqpZ+emZKSlJiZlpaWjIiLj5WdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe9s7O1oauiqaiyqaqop6eamZ6Zqaagmaegn5+nqKWknp2qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JWTUpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84NTg8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiaqqCxorejsKagnp2dl5mWmZ6bnKSfn52knZqdnKSipKOiqq+sp6mjoKGsr66qq6egnp+io56fnpudnJSUlZWenpiUhp2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK6nsa2xwra4wsbAyMrAyr+wubm9ucK9uLO7xcO8wru3s6myraqztK+zrqmuo52rp7axrKKvpaCjr7GtsKSkr6OhoJqhpqGkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppmboqSen5ubm5yHhoF7dHJra3VycGhXXFFFVEhESVBIPkVBNEVIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56gopyfqbKru7K/q6+spZ6goZ2cmJufoJugn5+XpZ2Vm5ufmp6dn6Wmp52goKyxr6ekpKOhn6aspp+XnJSRmZ2ZlYyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczLzNLHvr/Awr3HxsK3w8nIwsDFvbmzubq0u7ewtbKqurGuu7a+urqqt6yqqri6tLuurbijpaKep6Wio6mmmZufmJqdp6qnoKGhpJiUo5aUmpGcnZ+knqefnp+inZiZlJiUiIR+enJrZGlveGplWltGSkxERFNMREJENzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlZqWlJukpp2hqqeiq6y8vL/DwbOyuKehoauqop2eoaKenJugkp+fkJafmZKalp2bmaOhr7OpoZudnZ+fmpeYmJONj5aXk46NkIyCg4J3c3FucI+mra60ucW7zcfLv8LMzs3MyMnRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXS08zTz9PTzMrCxcbGysfOv8jQy8bFxsTAu8LAvr6+tb2zrb6/wsPGxMbDrb64sri8w8HBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURCQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE7Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5ibo6yen66mpbGqxcbMzs2/sMKppaitraqhnaOfnJ2aqZOZoZCOoJONlJKXmaSxsaukoJ2gnJmXlZOUl5GQj4yHhIOIh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXX0tfNxsfJzMPFys/K09fR19LV1dPTyMzHzc3J0szN083Ex8nJwMXLx8jIxb7Cs7PHxMvKys7Fyb+9v7zBxsTMzMjJv8O/ra+yqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYt/e3J1dmdiaHdpZFZXUURNRkBJUUI9Qjw6MjNAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOjk+ODo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmflKOYlp+enaSvm6Cwq6isscnN1NfPxrvHrK20uKyuo5+ko5+gpKyblqmWjZeNjI2XprCupZ2enaGlop6blpWWlIp9d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HT1NTSz9HD0NPW19XW0svJztDLxs3SytLV1tnV19PW2M7Syc7RzM7Qy9LPv8fGycLLy8vOz8XGx7a/yr/SzMvPxcnHv8PCyM7Mz9DOzMrHzbi3u6ifpqunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGVyYl1SXElKRkFFSEk+O0A4PTQ1ODU6NzY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopuppqKmrJqksLGpqLXQ1Nfa0sfGy7S2wsaytqmipaahoqu1p5qxoZaVjJCmrauclZmhnZuhop+dnpuWinhpZGFfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTPz9XU1NHRzNHO09fW09XQz9LT0cnT0cjQ2NfY0dfS19nV1szOz8nM0cvO0L/FwcbFzszQ0NHIy8zAysvF087LzsfDycbGyMvK1NPQ1M/SzNLBucWxpai1rqeaqKylnbKosLOsrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMe3pxc3RtYWNpbV9WUF9KSkJGQ1FNPzw+NDQ6PTUyNzU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7OTw3NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr66rqqudpq64qKu32NTV2dnRztDAvMzJt8Cvp6upo6SxtrOjtqqfnaGqqaGYlpiam52hnpqdnpR+cmZjY19fYWBfYWBfYGBfYGZtcHBua29ydnebzMDS1dPY2NbZ0dLS18/TzsvTzdXU0crPzNPW0tHWzdDV1dHG0dTK0dTV1s7S0NjY2NfLyM7DyM7Lysy/yb/HyM3Nz8rQzc7Lzs/Hys/Qys7KwcjGyczKy9HSzNPR0c/Pyr3HubCtu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHl2b3Bva2JlbnBhV1xaSUZGRExXRTtAPDMzPD04Njg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw9PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snnri2tbWtpa2uvrWxwNnT19rc1s/Ny8PT0MLCsqutrqyms7K5q7O3qaOfnJaUl5yen5+elZaYlYpsX19eYWRiYGBhYWBgYV5fX15dYm1yb29zdHV2eaS+y9XR1tTT2NbOztPLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHUy8zP0dPKzdHV0tXVysDJwcXMwsjJwszCxcfKys7KzMzQzdPLxcfPzMfHysTGwMXJy83P0MbPzs3NzM/Fx8C3ub3Cw73DubKzvrC7w8S2qpiloZmWkZWVkouUjZqRlJSPj5SCiYV4cHJrbWhgYHFoWFhoVk1HTElQUEI7RD47Njc6ODk6NTY9PUE8Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ozs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXFw8G/u7WyscfDucvV1tna29jMzc/J1tbFxLiytqqkrq25ubGywKGXjo2YlpCUkpGWl5aRjH1mYmNiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycTJycbGv8PFzs7HxcfNytHIy87NxtHSz87M1MrHys3Ox8bP0svQz8W6xL7GybzCxsjOxMLHwMbNx8PLycvPx8PDz8jGwcbHw7/Ax8vLy87CysvIx8zQxMXHusfDyMjCz8C9vL+wwcrHur2qsbKnpZ2inJiQm5CkmZeZkZWYiY+Cd250ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU8PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTs+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJuls7Gsyc3KyMS+vbrNzcbQ1dXZ2tvY0MrQ0NLUysW6vr6wqberv7q5s6WSjo6WkIaDhISCfoWFgHRgW15eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6v8O7u7q5vsjGwsPAw8fKycjKx8HFy8bIy83JxMHJycHBy9DEy8i/ucG6xce9v8XOysO/w7rJx8i6x8bEysC9wcvGxcO9xby8v8PEy8TEu7/JwsXH0sXByL7KycbHxtDDw8bDr8TLx8TKt7+8urSprKWlmJ+YrKOhpZqjoJuUe3ZydGZpWmFubVpbWFFETEZCR0RMQ0ZSPzU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMvQ0czHwsPHzc/OzdXQ1tnY2dDM1M7P0MvEuMbBtrW8scC2uqyRjJOXh3uAhYaAdnh1c3FfWltdYGFiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbBsLa6srK0srHBvLu7ubjAwcHFvr25vb+5xMrFxsK9xsC3u8TJv8LJu7e6usXCvrzBzcLGvr21wL3DurzGu8K5s7zFw8LCtr+2tb6/usvCvLW6yLq/vcvDwcXCxcjFyMXQxsLMx7LGycPOzcHFwr+9srews6eoqLmxpa2wq62slHl2d2plaGBob2NWXllKRUpGSEtBRUJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk7PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfGwsTIztLLysrHzc3P0snRxtbV1tjPzNDIzcjKxb3KwbK1ure7tq+RjYqMhXmAhoaAfoR8dHVkXFxdXmBgYmNiYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rAuK2wsKeqraynuLS2tLOys7q1vbG3sLSusrvCvMHEvL+6tbK6vsC4x7izu7XAwry3vcbAw7u1rrK2ur6zxLe6tau4vL3AvbC6tq+2urLFvLauu7+0trTFvL7Cxb/DxMXHy8XAxsa7x8vAz8nHw8bBw7fDvr62ub7Gv6y1urW3to54dHhmZ2Via25eVl5gRktISEpGQkNBREU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6ars7G8vLGtn6CZlJSYl56ro6+qp6TGy87IxsnOzNDNzsnLyczKy8bRz9PRz8fKxsrFxMC8z72zub25uLebjoeJint5foeGd3iBfXRoXl1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBtaGZqbm5yfKTHv7m4tbCrrKeeoqqnnquss62pq6mzrbawsqiupqyyvLq2w7m6ubCrtbm7tMK5r7+wvby7tbvHucK2raqosLHAtbi8r7CnsbO0u7yrrbWlrrauurGwqrmvrbutu7i7v7+9ucK/xsLFwLzGwcjLuMXHxb/Hw8O6xMbCu8XJzMuzucK8urKIcnZ2a2lhYmxoWVdXW0FMS01JRUFDP0ZBOzk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojk7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxs/SzMTGwsXQyM/DxMfBxsbFxczDyszDxMHHwLq8u8q3tLu9tbWrkYmQkHx5foqGenuEgXhuXl1dXV1fYF9fZGNiY2NiYF9eW1taWl1aWlpaXWRtb2hnZ2lrbnKBrbmwta6mpaenmqCkoJqcpauto6eiq6msqrCjpp+qrbW2sb25r7evqK64tLS7t7O8rre5tLG7wbHBrqWooquxsrOnvKqrqKusrbS0pqiuoaSvqbKlp6iupai3rLCyt7m6u7G8vb6+xL+1wcHHyLe/wMW3xMLAu7/Ew77EyMzKv77DwMCphnJzcmppXWFvZFdWWFBIWlJTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7rEsLawm5mVnJiqqbCxs7W9r8bR0M3EyLu7zMPMwL3KucDFwLzMusPHxbq9xL66t73FuLa4u66xlYOJjYF7foB/eHR/fHN3Zl9dXVxeX2BeX2NjYWJgYF9eXVxaWFlbW1lYWlxfZmtmZWdlaGtvcoWqpaymoJyhpZSeo5uXkaGjqqOin6Wlp6Wtn52bpKWrsq+2t6ewrKeqtKu0ubC2tKy2uLGvurmxt6Sfo5+msaerp7mqpKanqKeyraCnpp6apKasnp+npJ+gsa2trLGzsrOwtby2u8HBsrq+w8GxubnCs8C9v7W4u72+vMLGxMLDvr/DoIN3cGthZV9rb2BVWV9ITmhPVEdFSkY8PUA9Ojs7ODI1NTM2OTo4Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzc4NjY2Ozo6Ozk7Ozw4NTk8Oj4+QDuNyLW2vbi6wbu+taCelJ2hprq2q7Ozu7PF0MnMw8e5uMnCzsG6y7m9yLu2x7u3xMazvsW8t7C5v7uws7avooSHh4J9eXZ0cG1rampxaV9gXVxcXV9gX2FjYmBgYGBdXFtcXFhZWFhYVlhbXV5kY2JlZ2dnam1viJ2poJeVmqGWm6KYlY2eoaKmm5+fo6Whp56aopufqrCssbWiqaqpq6yktbitt6+ssrSus7WusaqfnZ6jorKkpam4raGmpp+orKuZn6CemZ2fpZqZo5ybna+pq6eqq6ytsLK4rri5u7C2u7u6q7OyubK9tLaxsbW0v7W9v73Cwbq6vZeDenJrX2VeZGRYVFheSVddS1BHSUpGQTw/P0A7PzwwNDUzNTo7OTo4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xtDJycHHvLzFxdDBvMq7u8G7tcW4tcHBs8LEvK2qtbm3p7GyqYuGiIB5c25wbmtjXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWltZWFhXV1dYWFhbXmJkZGVmZmhpa3KNqJ2UlJSbl5uhlpaQnKGhqJ2bnKWmoaSbn6CamK2tra+yoKWiraunobWwsbGsp66yp7mzprahop6ao6GtoqGptaqio6adpaajlpiel5ibnZ+Zl52cnJusoaumoqOlrauys6q0sLKqsrm0r6mvsrKyt7OtqayusbewurW5vb62s7GUhHl1ZV5lXltZVlNaVUxcUUxKRUhLSUI9P0FBQEA6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vb+znaWjmKWxwrW2va21uMPNycjBxrjCwcjQusPGwLa8vbbDura/wbW7v7uqprG6saexr5p9hYWAeXBxdHFoZWRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hYVldhZGVjZGVkZGhqdqKclJSPlZeXn5eZlJifnqGclqGhqKOfnaicm5qqpq6wq5ujo7eqoJ+uqLappqassKO3sKO2oKKbmJirpqGbrLivoqGknKGfoJOVoZSWlpuYl5aXnJSfqZ2po6Gco6qqsK2otKuqpq2ysKWqrrKxr7Cur6anp7KusbSvu7O5t62jlIF5dWReYVZZV1NSVEtNXkxQTEdITEtFPEA+PEI8Ozc2NTM0OTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy0ucKxvri8rp2np6Oqu8C9wLmutLjCzcjHxMW+x7rKzbXExcSxv7+5wMG6wMC5ur23qKixu6aooaSJgX54cmpscnRwaWhlZGdiXFxaWVpcXFxdXl1cW1xeXFtcWltcWlhWV1dWV1hXV1dVW2NjYmJjYmNkZmqBlpOVi5KUk5uYnJaWm6Ccn5Wgn6alpKWmnpyfpJ+qr6afoqO2qKChoqizoaWnpK+lsKyrtJ6gnZWUqaGhlKyxsJ6io52emJuTi6GUkZOXmJKXl5iWnaabpqGimaSkpKujpbCnpaOrq62lqK6urquoqamzpaarr7Sxrru1sK+un5J5dnJlYVxaXVhOTFFHUmFNVlBPSk1PRUJEPzk9Njk6NzY0NTk5Ozk4ODc8ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuyt6yepKatt7u8wcW6sbm2xcrLwcTHx8m4yMa1xcLIrrq8wrzCwMG9vLe6tqansrWeooqYh4B3b2RiZ2loZmhqZ2ptYF1cW1paWVpcXVxbXF5fXFpZW1lZWVtXVVhXVFRXVVNUUlVgYF9gYV9gYWNkaYGUk4mRjpOSk5yUlZajmaCWnKCloa2lo6Oio6GbqqqlmZ6lsamgoJ2kqp2noZ2srKmora2ioaKUl6KanI+rqbCbn6KfnpeYk4qeko2SkpWPmJiTm6GinKSgoZWgoaOkmqOrpaKkqqOrrqWtsammpaamtaapqK2ztbS5uq+prJ6LcnBvYFtXVlVRRlFPSFpcT1JKVEtTTEVHSUM4Ozs9PDg2NjY6OTs6Ojc2OTc3Ojs6PTw9Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njk4Njk4OTg6OzlAOXu1tK20u7KwrLKtnaenr7m5s7/IurbAr8bJzrzCy83Jt8vAtMDHzLC2vce7wcfDvb+3urWkqq+unZmHjoN8dWlqam1oamxua2ttZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV5fX19fYmRtjo+EkYaPkY6Zk5SSnJqinJugp6iqp6qlqKSimKSupJSZpa+pn5uYmqCerpmbqbKfpKafo6SglJOblpWRqamtmpygoaCalJCMmY6LkIySjJaUkJ2hoKKcm6KVm6CioJehqKOiqKugq6+krbeloqOirK2pqKuvs7iyvbWzq6+Yg3JyaFtZWVNVUkVZTFFcWU1UTlBMUVJJTklCPD8/QT89NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDEtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s66os7auqKevrZupqKy3tqy7yru2v6zMx8a5ws/QybXGvrq+xsy1sb3EvMLFw73Bs7mvpaqvq56XhoF3eG9uaW5ubnFnZ2lnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVVFNOUFFZWlpaXVxcXl9gZH6NgYt/i5CKko2XkZaZoqCbn6qppq2qpq+ip5mfrKCUlaSop52Xj46Zna6Wl6apmJ6ck6WhnpGQkpKSlaeqpJmZmp2dlo6Mi5SGiI2DkIqRlJCgnaCjl5WflZqgoZ2Sm6Wlp6iooLGwprG8pp+jrLSrraewtLC5tb+xrbGrkHxwcmJWVFVOUklHVlFSUkxMWE1KTE5SR01LQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo6ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OtprG3qqWisKudqqepsrCktsa0ubqzy8a6vMPL0cyzubq+wMXHtrS3vLK6u8S+wrGzrbCusKycoohraG1vcm9xa3BrZGZnZV5aWVpZWlpaW1paWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domNh5CJmImUk5iamJ2om5+qpKSqnKeZoKWbko+eopqXloSDkZqjj5OinJWVloeimpqTi46Kj5mjp5yVlZebkJKHlI6MgYuNgJCKkZKRoJmfoZWTmJiUoaSYjJmkpqimoaC0sqeyt6Ccoresqq2ksrKmtby1q6uxo4h4cm1dTlBRTE9DTk5OUExGTk5LSk5OUUhNSkFHS0hIQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSspLS8xMjc3Njo5OTk5ODQ5ODhBN3e2p6S2sKSno6mloKmlpLOqorLDtbWys8fHuLvEys3Hta+8v7i8xLOzrrairLXEuruvqqy0r6+gl6h9XmBnc3F2cWpuaWZoaGpfWFlYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU5NS0xTV1dWWFhZWFtdYW9zdnCEiIKHgJGDjoqUkJOdoI6am6Kgo5iklqGblYyHmJqMc42CfYyWloWQmZCTjY56mY+cjIKJf4mYn6KekJOYloSOgpN+fnSJjnqQhpKQkJyamZmQlY+djaKijYmaoKGko5uitK+sr6yfmKW5pqWwobGunLC7qqmvqpmBdnJiVkxRT1BNQ1NOTFFNQ1BQSEhNU01ISkpESkxFSko8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTI3NjQ3ODk6OjY1Ojg3QTd3t6KjtKilpaijpqWmpaazp6W0wbiwtLDKxrm6ws/Hv7WvvcOvsceyraeslaOtv7ixsKCorayqlpWicldWYGhnaWhpbmNqaGdiXFhYWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFFNTUpITlNTU1RVVVdZW11pbHJsf4V8dE5Yco+Cl4aNnJeKk5Cel5yVlJaUjpaIf5OJXztXb3uKk4l/i5GMj4WGcoqEloF5gnqFk52Ug5WOkI+Chn2SeHFvhY1+iYCQjY+XmZiTio+InIeel4aHlp6aoaCXp6+oramonpattKKmrZmsq5ins6GpraOSfHFtX1pOU1FWTERUSlBNTUZPT0pFTFFNS09KSU1PRklIPTc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODU0Nzc5PDo3OTs4NkE5eLegoq2hpqapoKeop6KpsKintMK5sbWwycO5tL/PwLqxsbjEq67JrqeinYWaorqtp6iWpqWjoJePlmlQTlJWWlpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STUtIRkhOUVFNUFJUVlhaYG1vaXqCdFBCQH+VkZF9iZSMhIqNmoyWlYqSiIaVhXiIf2BKUW54ipGEfISMiYR+f25+f5R3dXZ4hI2ZcFGNiIqGe354lHZnd4WIfoqIlYqNkJGWi4OJh5SEmouBhJKblp6clKSjp6mlo56bsauhpKSRpqqWoamcoqaoh3NrZV1bSFFRU01JVU1TSUxMUElHRkpOTE1US1FRT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj03Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMTUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXa2nKKmnZ+hrqGnqKWmp6+sqra8tri2s8K8t6i7ybm3qaq3uK22wKqim5KCj5myn6KajaCWmJSRi4xlTUxOTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+GgXuFjJKAkZmLj3uGj391f3hzbnVwdI2NgXl9iaqEeXpodnuOcHJteICKjJJ4eoB7gHZycpJ4Z3WEhISEepWJiIqMioB/g4qMf5ODeoCPmJSblZGfnaien5+doKmln52Yjaikk6CflZ6epH9xZmBcXEpWT1FHS1hST0pNTVNKSkpMUEhMUUxSVE1FSEE8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3OTU2NzUyNTI1NzIvMi4sLy8yMDAvLSsoKCkuMTI2MjE5ODc5ODc3NTo8PDd2rpijoZicnrOpr6mlrKuwsaq9tLK8uLa7tbOguLuzq52fraustbOlnpaRmIaUpJadjIOXiY+JhoaDZkpJSklHRkhIUFRUVFdXU1RVVVVWV1dXWFhYWFhZWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUlNWXnWDfXlnd42XmI6PfWd5gHZ4f4mPfISYkoFyh498dntva36tfHOQin97hpKAfX90ZnZ8hWxvaHN8iYyHgGx5cX1wbXWPcmhxgH2OcEOKhIKDhH93d3qKhH2LenR+jpKPmIqSmpujl5mdmp2eop2WjYulm4+dl46WmI51bWtlYVlXWFRRSlNWVE9QT1FXS05LT09KUU9JT09LRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXn56WoKawrK6rp6mwr7GsvLisu765tK6pm7GorZyQl56nrKekm52Th5Z9jpWSlYB8inqFgH9/gWVKR0hGQkBDRElMTE1RUlBRU1VUVFVWV1dXWFhZWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXlie3dvfHmIj3l8i4VvbYyReHN4amp/gnKWkYuBfZZ/SZKYbmh3foJsaWNseYWQkoZrc2x8bnJ7hWltcH5zjYiDhXp9fnp2b3R0hYF5gXdwfI6MipODlpeYmpCTlpeZl56XjIOJn5KKko2GkJZ9bGhtbm1XVVdUUlFZT1NVVVRZVk1OSE5LTk5LQ0lOR0U/Ojg5Ozk5Oj48OTw7Ojo9Pjo4Ojs5Pzg2ODcyNzU3NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp6kra+iraqota+urLS/q7zCv6ajmpWlmJ+OhYyWoqSbm5SWj3aRfYSLkI98eH50fXh1d3xmT0VHREA8Pj5BRkdHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpyQZlvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX5vbX96i4h1gYiGdGyZkXRzfGprnY5MeYSSiYSOZzF2hnNsfn2DdGZldH6EhIWAZmlsdWtwf3tncHB7bpKNjntzfX1xcG51bYJ+d3l0anmJgoiJg5aTkpCLjZGUlY+XjoB5iJeIhomGf5CHdWlpbmdjV1FZV1hZXE5QVldaWU9JSUVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKiwsKyspKCsnKSwsMjI2LSs1Nzc1NDc4aU84OzVukoiZkZqWpKitnrKeprquq7KwwrK7w8ebl4+UmYuOhnqFkZqWj5KOkopziYR3i4+Mf3Z3dXh2b3hzaVVGSUQ/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+zoHF8eG19bHGDgYWBeYOGhnlyoJR0eIBzdZSHNXGdqJ2OoaGEooR2cIZ7hntzjK2NiIBoZmJpbXFtb4J1aW9YdW+OmpF2bH97fG1ybnB/enN1bWJ2hH+GgIWQkYqLipKLkYyLj4N2eYuPgH6DgH2OeHBubmpeWltdW1lYYWBTT1xbWVhMSEpGSkc/Q0FCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp56vlaW0qK2wrsGzusHGl5CMlJCBiX1ugpGTioSLiZCId4SFbpiKjH95e3txe3R8a29eSlBHPkA3NDU4Ozs8PT5AQkVJTExMTU5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8+koOprl9HTE1OUEw3Q01SU0RKhnaAfHx2fmx3h4d8fYWCf4x+dqKZeX6GgISZhZucYYaqn52LgpCNenaIfomHjnOKl4+De1xkcXR6e3eKbWdpYXlvhY+Cem6Bd3OEenFzeXdrbmldd4d9h3yIh4+Ai5OXg42GjYd9cYWAhHx1d3t8h3RtcXJkZV5aWl1TW2deWFFWWV1XR0tLRUxHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQwMDQ2NDU2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyMd4l/lIyRnZ2fppGgqp+wqa/AsbvFupaPkZSIeoZ2a4CMkoN+i4WQjXmEgnSihY1/f4OBc4OBfWx5bFNYTEFFMzExMjY3Njg4Ojw/QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxyfI+LenyIhn6Xh3ahmYiHj5KUpY2sqUiGra+vioCAk4qBi4GEkaiHgJiYipxzbHyBhod9jmhnZ3h+bYWGgYVxhIVHa4B4cXl2aG1rX3d9g4h/iIWMepWenIqLiZKAe3WLdnx4bW93fn1xcXBqWlxbWmNjV2dmXFZQUVhaUURMTEdPSURGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFh5GPlpiSl6CdrKCnua+zvbSXjZKLmIt9dHF/ipN/fo2DlJV9h3+GpYeJgIOIhnmJioB1hXlfY1ZMQzYwLi8yMzEzMzY2ODo9Pz9CRUdISkxOUVRUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2WcHOjVUZJS01OUFdgWXBaXF5qjZOHlYCEgoWRk36FiZGAmpaCoKGYlZuapa2Tmbuxp7vIxKeKjKGkjpOJgJB7coOen5GcfnaFhYuPh5BpaG+DgHSMhoSLcYaCdoeAe3aFfW52dWeBlI+GiYmIiYiiq6OWiY+YgHuCint6b2dreH13fHFpY1xZWVxpXWFnYFpPTE5YU1JJUUtETkdDS0RDQUREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnZwZ3iDe4CMgIGRj4uamqScoaymq6+wl5KRhKGUhHh3gI2UfX+ShpOWf4uBkpuOhIGCjIyCio6FgIqAbXBqXkNBNC0tLy8vLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1NUUlBPSERCPDg3LzlDPjw8NjMubJOXTVBISktMS05WYGN/Z2dtdZ2bj5qTk4uOj5qIk4+di6ChkqOppaOsk6i2oqfBwq7Ir3i6lJp8jKGemYSShIKPoZ6TmZKEioWPmJCWbHB1iYuBlYyNj3aPhHFshYGKl5KDhYhyiaGXh5OKj5CXpbapm42WooOHk4V+gGtqa31+fX9xX1tiXllmalxsbF9YS0hPU1FOTkxGSVFERE5GQkNFR0I+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuaFlwg3B1h3F2kYZ+l5aalJ+fm6egqpaTmJ5oZqSafYWTknqBkomSkn2LhZmSkYOAgYuOiYaSiISJhXh4f2hOUj4vLy4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFRU1FOUElFRT47PDpDRj8+PDc1Mjw/UjVISEhMTE1OUl5vinxzgX2gnZunpqKZoZeilZyfqJ6pq5+orKmqtZervqu2yMm3yNHPvpugcGmqqJ+Ek5GFnKCampmnkZGIlaGZmnd6fpSYkaGSlpeBlJ57dpWSq7OJjZegfZWenI6Tlpqko6e2sJ6RmqiIl5COgolsc3N7fHluZl5bX19hZ2NgZ2ddUkVLS1FPSkpNRkZNQ0hNRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTQ2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYzQUBpYl9QcXVgbn1hd459fJSOjoqfkpeelZyqmJ6qQkR9h4mImI15go2Ljo18ioaQkY+Cg4GJjIqFk4WChomBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSVFVTTlNMRUVAPD49RkhAQUA4NjYyPDk7RkhHSUpOT1FZbYaQd5WLo6eqtb24pa6srKiptayxt7Kyrbuxs76cs8Osu8nLuMO/t6WjsLKsrKqjipaYhaWmoKKYgqaZjaKqp6SHhZOjoKCqoaSpjpywi5Wkp7i7nKGjsJOjnaOekaSirLCts7ajlaariZqKk4uVent+g3tlXmZaY2BdYmNeZmdgW09ESUhUT0ZITEZLR0ZHSEFLRkNGRkE7ODc9PDg4Ojk3NDY1ODw1NDw3Njo1NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoKThYiCnIOSkYyS2sidlnNWl4iPiJyPfIaMj4uKe4mDh5GPg4WBjIaFiJKGgoSJhoeHh3FuYUBFNjQ8My8xMTAtLCstMS8tND9EQU5WUVJTVVVXVU1cUUdHRDw+PkZIQ0RBODs8NUM7PUZLSUdIUk9QV4GToISuo7OqssHHxKuzxbattMCzuL62v7XBtru7pLjGqbbJx7a+ubSoo7StsLCbmZKan4mnr6qklXefpJehq7GzmJapraiutbuyuqyvtaKxrLK1vLi1rrWgp6ijqJupsK6zuri5qJy4qo2lj5KUoIZ6gYByV19iVWRgYGFfX2ZgXFVKREVMVlJJSktFSkhFQUBAS0RCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjQ5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxcWlFjZFd6dXGBlH2EhpN2hn6AjXu/u6O8grSUk46bj4SIj5OKiXqHgYyTjYiFgo6AgYmPhn+GiIWKh5F6eW9dV0BFTjw2OjQ2QUI3NjQvLzdDSENRXE9RVVhVXFdPX1VJS0pBQD5HS0ZGRDs+QDdENz9CSkpFR1dUUF6PpK2ksrTDtrjBzMq3vMS9s7TBt7jCtb+wuHSxtKa6xaSwxrmxs7K0qKS2tqqwoKKWm6KSpbGtpa2sp6SYoKyzuqKpsrm1u77Mv8XFvb2zwri6uL+4u7i6ra2xprGqrr6xvbzDw62Zu6mVro+YmauJfoB5aFVhYFdpY2llVltkWldVSkdHTFJIRElLQUlEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTc6OjY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldUWVZad2pwf4+EgY6Eb3tyeIhiuaGao4mVlJaTlJSOkJeSh4d8h4GOloqBhIGKenyLiIZ8ioKBi4SVfXh6dWZQXGRHRUw6UWRgW15TRj87SFBFW2NRUVlZWmdaU2BhTVNPRUE/SUpIRUZBQEM8RDZCP0hHS01UWlRelK+4tbu5ycC7vcrNvL3BvLi2vLu3vrW6ssZhdbKlsZqeq76qpairqqSis7Wgq6eelZaemJ+upaenpZ6jlKKnsLOnsrK8tsG908nJ08bCxczCysPBvr6/vLy4tbC5t7fDusa+xMmxnrqroqyPpqm3ioB8b11eXlxVYF1oZlNZYldTV0lFRk9LQD5IRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFRSUFBRUlFKQTkvLCwsKisoKCwtKy9QPiguNDiAfTwyS4hxOT5DS0VASk1QUkxRXWhtbHGQjYaQc2xycnOI1cC2mqCNlZmZkY6XkpaWjoaIfYeDjZaKf4OAgnl7i4SHe4t5gYqCl390fXpsZnB2WV1cUGVlYmBlZF1bWFhcTmRtVVJtbl9vX1hnZVVZVEpEQktLSEZISEhIQkk5REBIS1RUVl1aW5O5wLm+uMbBu7nKy7u2ura4ubS4tbWut7eZZHWpnq1wXqKtnJihopuknqullJ+fkJSOlpiYqJ6mn5+amYOjnaykqrCst7C8uNTQztbPyczSzM/OysfAwMLKvcG9wcHFxMbKwMnPtKS8sbWwnKy5vZp9d2lbXVlXW19YYWJRXGFUUkxDQkZIRjxARj5CSUJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LiYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RHS09EUlxaaWBwl5ORlG5sb3R1h7OsoaGfi5mcmY2NlZGbkoWKin+Jh4yQjIl8gYNze4qDhXuKdIGKh5V/dHt5bG11fGlzZWlsaGZqaWhgZmlpbVpudJetpL2Ih2dbb2hdWllUSEtPUEpLUExTUUhMQUpGS1BfX2JnamKYuMewurS7vraxxce2sLmxsbuts7KorLitjbaonpynmk6anoyPoJaRp5illYqTk4iRiZCRkp2boZiblZaHnpmmmqyvqK+ns7PU1NTW0cvP09TO08/MxcLK0L/KycvJ0sjNzsPQ0riwxL3Euqa3u8WifmxhWlpbVl5WWWRaUF1YT1JDQkhGREo7QUQ+Qkg/QEI4O0Q+QEk9NTY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OD05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2ZXc5CRmYJocnB5eYOhqp6ml4ybm5iLjpWRmo59iYuGjouLi5CIfIWCcH+HgoZ7h3KDkoyPfnF5dWxxeH9ye254c2xpgHBtY2lucHlpeH1+y7/D36duY3huZFthYEtQUlVOWV5QXV1NUU5UUVVUXG5ud4Nyl664rLWosLarrb3Bsqu1pqW5p6yvoqy0pI+xrpuYmIyRlJGEj5uBjaeSnImDi4SKiYSLhJSVl5eUm5CcmJmZnp2rrKSnoqysztLV0c3L0tPT0NTRzsjD1NHIztLT09bN0tHF0tbGwc/IyMOpv7jQnHZrYlpfW1VeUVxaUFBVUU9JPkFHQkNGPUFCP0ZFPkA/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WHhot3bHdwfX6AoJ6eoYyNmZOUi4yTj5aFeYWQkY+MioiRh3+De3J+gIKHeoV2hZORiYBvd3Nsc318d3xzgnhxa4Bycmlwcnp5cnu+y5t/jbKEdnKFd2lhaV1EWlpbV2ZkWGVrVFhdXWFjXmN4e3+MgpmqpKSioKGppqqxuaumtKOirqKkrqOnsqCJppuVk5GKko+IgpSJa5WjjZmEgYZ+kYODlJeti5WOlZqOhZKQnZenr6GgoKWkqMjNz8fCy9HT0dTSztPNxtbTzdTY1tbY1dfVytXazcrY1tHLrcTDzIdva2BdXFZSV1JbUEpISkpLQDs6O0VCRD1DRD5IQz9DQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lxgHZ+aXN5coKKgJ2VnpSFi5aJj4qJjoiPgHiElJmLjYmIi4l/hHlze32Dh3eAe4eRl4GEb3hxbnZ/dnh9dIZ8eWyHdnVufXaEdXl8nraNPEGLxqV+jX1qZVdJQ2VjZmNoamRveVtfZmhsbmlugYOJkoyen6CekZeZoKOkprKkpbKgoqWfoqmio7Kch5+SkpORi4+Lh4SPhH6cnIyNgoSFepR/gqqWo4ySi5iTi32XipqRqrOYmpynnKa9w8W4tsXN0dDS0MvSy8nUztHV2tfX2NTZ2M3Y287J2trS1r/MzbR0c2thWldQU1BYVUVHS0pGRj46NzpAQkM6R0VARURCREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc1NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MiooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qj48OVFFQ0pUbG5vcGJxcXSGjX2XkZ6Lf4eSg4mGhYqCiH14hZeXiY+Dh4aHe4V5cXt7hIZ2e4aOjp56jXB9cHB6gHJ7gXKEh4Bujnp1d319g3WAfYeJsHRZqsK3jZKBcG5jPV5ocnFxcG53d4JmaW9ydnlyeouHj5SSm5agloiMk5yfm5+roKGsnKKamqCmn6CsmoyajZGTjoV9iIeDhYuOoJmUiIOHfmyZeoSZh4iTjI6VjIZ7m4iTj66rk5WXn5imrrW8qK29x8vIycvLz8nE0srU19jX2NfU29fT2tvW0Nra0tbJ1cyTdXdmZVhXTlFSXEdDRklJP0I+PTg6PkA8Pkk9QEJBQUVBPj86ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2BWPiw0TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEE8OjlEPkNHUmtfbWRiZmx2gIhxkZCbgHmAjn6DgYKFf4R8fYSYjoeMf4aHgXeDeW97e4eCdHqSno6hdpB2g3R1gX50gIRvgZCCb5KFdX2ChXp3h3yJuMalw8q4gpacj3hwZk5lY4J6gneFoZGLeXl3e4SAfIR2bZSWlZaQmJGDiY+XmpeXpp2YoJefk5OYo56brJaRkYuNk4OMhYmJgYaPkZ6cmoiFjIGGl3uIiZ+Xj4mOi4uCfKCIkIq8oJiTl5qcqKalrZ6ntb+/v7jHyc3Oxc3J0dXV1NnV19vU19na29fb2tnYztvGg3Z2ZGZhXVJVVVRNS0RORDs9PT05Ojw/OT5BNz4/QD0/Pj05ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs5OzdJUFxaUlVYSzlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWZhXVxpdHp5bImNknd2eop8foB/gH6Ge36CkYqFhnqFiHx2fnVufX2HfnR/kp6RoIOSfIZ+eI9+eYuKb4ObgXSZh36CioV8fpF7kKmPkMOgvYybpJx+ioV9iXOMi4BzppqcmJSFe4+RiYRpR3ChpJ6MjJGShYiLkZOVj52bk5SRl42Mlp+dlKGVk46OkYx+kI+Oi4SJkpaZn5+IjJSRnZGDjH+mmYiFjoOGhICkhYqLt5edkZSWoaagnZ2do662ubSrwMbK0MjHzM/T0tLY0tXXwNfY2dvY2trZ2dfbt3V1dGdmYlRdWVJPTkhETEM+PT85OTs6Ojo8PjZBPj89PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw6RFdOPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlZYZm1tbWmBjopxc3iKe3uAfH98iHt9fIuHgn51g4Z6c3p0bYF+hH53hZuhm56Uk4CMiH+Yh4Cckm6IqYV7oYx9kY6DiYWdf5uRio2jop+RpK+gi5GLhYuBk4ZXcq2Ln6uckIOZnJCQjluCopGCjZ+TlYyHiIySkoyUlZWQjI+KiJacnY+Wl5KMk5SGgIyJko6Kip2XmKOjhpOdlaCLiomOnJCDiY+Ag4eFpISLkLKYnJKUl6GgnpmSm52nsrispb3Cx83Ixs/Lz8zO18/R1K7W1dja2Nra19bZ2p1seXFjY1paVVFVV0NASUQ/Pz86NDk6Ozc6PDs0PDw/PT43Ozo6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs4ODs8QDtCUUtLU1lQVGNieW1ifpGDb254i3l6f3uBfYd8fHeGhYBzcIWCe3V3dnSFgoR9f5Kmop+mopeKnZCUl4uKqJdyirONhKiShJmUhZqNo5agmJOJm56ik6mwn5GVkY6OiJaMb423hJrEyLKdoqadnJiWkbKQZKTNx5WOhoeJkJKNjZOVioWKioaWmpyPkZWTh5WYhICQjJmIjpCrl5eko4iZnpWaiY+HmJeKhY+NgX+Hj6SIjZOompeTlpihmJ+Zk5yborK0paO9wb7HxsXIyMnCytPMzdSo0tHW1tbY2tTT2s5/b3tkYFtbW0xIVFpCQkhEPEI+ODM3PDw6OT42NDo6PDo3Mj86OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFNXU1JCY4JHdoGOfXxtfoh5e357goKDf3d3gIN8bW6Lf3t9eHh8hYeKfoqis6ejqrOil6egpaSWla6ig5G4lZKzmo2ioYylnLCjpJ2ZkaeWqJmsr6SYlZaVkIuYmpehwI6jybirnKOmrpiSm52ynYWGqKKcmIWJiY6VjIuTj4iBhoeJk5iVjIyUk4eUmIaEkpCcdZGZspaXpaGHnJmSj4uRipebiYuXjoZ+jJieiZCQm5qak5iXn5SgnZSem6CxrqKkuL60xcfEvcPDwMbNysnTps7N1NLQ1tjT0Ni6b3ZyWV5TXVVOR0lORUFDRTU/Ozc3Oj88PDc9NDM2Njk3NzQ+NTs1PEw8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg0Njc9OkpGREdOWlxZSmZgO0mEi3p6boWGen2EeIGGgX5weH1+fW9zjXp+gnx5houJhoSSprusqLG9r6Wts7OppKKwrIqatZ2juaaVraWWqq24p6SjoJqpmKqkrrCqmpmclJaRl6CYmru7rsqhare4q7CVmZ6jrJOXvqNeqrKDioqNlIeRfI6OfYOGjpCUlYiIk5aMkJWNi42XmJOdmbSXlaudipyUkY6RkoyZm4uTnpCLipafoYyUjZeZnZKbmJ6UoaCUnJ2lrqihpLS4q8LIxLW6vbzFx8fC0aHGys3NxdfW0cvUn213ZVlXUVxQTkVDPz1DQkI4QDg4NT9HPTw2PDM1MzQ1NDU0QjQ5OkJNOkI7QUhDOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRIYmBicElAi4p+gXOGh32CiHWDioJ/bn18fX9wd4d3joKHfI2PjIaMmanBwK+9xruztMC9ta2rs7aLqLKurr6rm7ulqK25uaunpqKipKOqr7Kxqp6cpJmbmJifo6alkqS6r6nAvK2usrmlpKh+iIecrb2wgouMi5CDjoORj3qBiJCNjZyJiI+XjYyVl5SRmpedqJuxmpGsnI6aj5KOlJCQlpePkaCRiZWbo6yUlo+UnJ2SoJ2bmJ+hlJqepqWkoqOwsqbBxsOvsLq3xcTDv82mx8THxL3W0c3FyoVwb15ZV1xZTEpCS0FGSD9BQEM7OjU+QT49NT03PjMzMzI0MUExN0BCTj5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OjVCPjc5VktEV09GOD00S0BDPjRFS0hOPkJBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVONzlHRD9DRlxlRmBpZ1pdXZOMjIl7h4yHg4x1h5GKgW9+e4J/cX6BepV6kpSUmJCTlqezxsm/wczCw7nHvbuvq7q7mLO3urLArqXApKuwu72qrqujo56nq661sKqcoKucoZyWn7C1p4yju7u2wbysqZ2zpaSolIWOqsTDpIKLj4eIhIaVlI16g42Rj5GhjIyUko6Jl5+Yk5mVl6agr5yMq5yNlo+RkZWVjpGVko+glIeXn6GznpSZk5+gl6Semp+boJSYnqWjpqakr62lwMTDrqi3tsnDvrbPssS/xLyz0crIwrRxdWlZVVlnUUxIQ01LTEpBQj5ERTw1QUU8OzM9OEIzMzIyNjNBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJlWk1lXGVUYmqZjZaKjIiTkIaJeYeUkIFygHuNf3iHgoKQeY2hlqiZmpm6vcfIycHSycrCzb3Cs628vqi6wL27xLeswamss7y/qrCqpKWkrK6zrba1oaCwn6WimaO0vaqcqb3CpLa3r6yUsqysrJeHmqqmpZGCjJOlloqBdYqSeYWOkpCeoJOPk4uPjZSjmZeclZSjnqqekaWajI+Pj5WWiHyPlZOSo5qVoKKctaWQnpako6GlnZ2lmJ2Vl5uko6mnorKsqLvAw6+ls7fMwLmvxLO7vsK5rcLDwsCXaXZeVVRZWEpKTElGRERJRENCREw6NERJOjs0PThGLjEyMjQyQjI2U0hPPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+aUhfWGFaY2NWno+djpeOnpKJin+KoJOEeIV/lX9/kIiKkYCWoZmup6SYwr3Hw8fF087Ozcu8wriwury0vcu7w8K2t7yts7+5va6vqKCpqLauramyt5ufraKnoZ6rt7iqpa+/xbK9urOoq7a0rq6XlqWsp5+RjZKyxaeWjnySlXyHkpmPqpmYk5OPkpWTpZ2TnZmToaOinJifmIuMj46diFqQl5eSl6SZZZiin7KllaGVqqupppqeppeYlpiUoKOopZ62q6m5u8O0pbS2y8C4qrarsru4rqi4ur23f2hrV1RSU01FSlJNSz9CSEVFSUhHOTZGTTs+Nz5BSy4zMjAyNUM1NU9WTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M+NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs+QEJGQnBFaklSZWFMRqWUnJeil6mWjJGDiKaTiIKHgpyEg5WQkJSPmqKer76voca8xMTGxs7OztLKv7u2sru7u77PtcS+ubm3s7G1s7izq6ecq6y5qqinr7CYpK+kp6SltcCxrKy0v8O6wLq0qLq2ubSvlqWtr66ki5OUoY10wpp9l5qEjpeZjLGVm5qVkpKZmaWjlaCalpqpnZugoJmKjY+VnGBKlpyalJqlllSWr5+vnJ6jlK6tqqSZoKWTk5iYjZufp6KZtKiqs7u7u6qwssjAuaasq62ysqOhsrK0pG1rY1lXTU9KRE9QUFI7SEtJSEpDRD46S1U/QTo9RU0wNzU0NDpCNDRNV087SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzVFQTpBPz5IQDUqQjUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiql5mgoqivmZGXh4uolo6Ik4Wgh4Sdl4+doJqjpLXJtanFucLEyMrJyMzNx7+7s665ucHBzLXIusK5tbqwr6+ztaajm6q0taqppq2smqWupaSorLq/qKy2uL/CwL65s7PFsrm+raSvtay5poibl6abdr+fhJmejpOamoyul6Gcm5eUmp+hqZ6on5maqpqhp56YkI2RnYNudpKimpWdop2RrrKjq5SnqZeqrKOinqSnkpGZnIeUnKKdlrGmqau5tr2ysq6+ubego6eopaacm62pqYtfYl5dT0pLRkdNSlZNPU5GT0tNQkREPFFWPUFBQkRPMTg9NzY/Qjc1VVhPP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li1SYE1VSH5lXkhFq5Wbop+7r5mUoIyTq5uRkpOJq42GoZ6Mo6yUo6S2xr60wLnCwsfJxcLNyMK+ubKvurXBwsq1xrLCvLW6qqitrbCio5iqtLumqaarqp2pr6ejqqu9u6itvbW4vse8t7a5wrK/wbWqtresvqWPo5iSoqC9n4maoZmXn56Pt5+pnKaim5yhmqiks6CbnaacqKqemJWQlJuLlomMpKGUnaKdoLSvpaWSr6qZqqmcnKKiqJCUlJ+Cj56em5WppKGhs7S6tK2otrKznp2jpZuXlJiqoZ51XFpdXEhHRUZMUElORUdIQ1NMSkJFR0FXU0NIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkVASkpOTzlEQDU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8nOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE5ZlxGQ0OdcGJHRaeXpJ+ew62cl6WYmqqclpqaj6qWlaemla2smaKrtsTDvL62wcLAx8S/zMW7vbmysLmzv8LHtb+wvLe5tqakq6utoKGZqqrEoqSpq6aerK+roqmpvrenrb+yubfHtrW5ucCzwMO4trO0sL2jl6OXlJyUrqCQoqOlo6OgkL2lqZ2pq5ycoZulnr2imaOfoqmsoZ2Xjpaek56Hj4SNk5+koJ61rKaclbCmma6lnJmonJ+MmJSeg46gmZuSpaSamKuxtbGqpaqurJuYoKCSjpCVqJ6UZV9XX1tNSEdJTkxIRkRJQT5RSUE8R0lJXFJPSz1JT1U1QkY5PkhHNUNhW0tCTlJVV1ZRWFRSVUlAOFJRUE06R0E0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTU/OTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW1RRjxLeGVhVkuimqOcnsWsoZ+sn56uoJKjn5akoKaprJi2saOqs7bFxL2/tcDCu8jCvsnHtri1tLGztLfBxba+sbi1ubSfpqyqrJ2enqWkwaWfqa2gpKmtr6KmqLy1prG9ube2xLK0uLvAtMXCubmvs7W1o52llZKUoa6gmaKeqaiso5rCrKmerK6bm56ZpqC9oZ2kmKurrKahmo2an5KeiY5Xf5afpaGguKqmk5i0op6wn52ZrpWdjZiTnIGOn5eVjaGjlpClrbGrqaKipaWVlZ2Yi46RkqSeiF5hWGJfS0dKSk5GRUFHSz89SkI5OUpLTl1RUUk9TFdcOUZJPURNSThIYlxMQ0xQU1lZVldPWl5JQT1XUUpMP0g/NUhMWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNba1dxR0U2PXVlXEtNnp6hmZ/EqKahtKKds6iTq6Wgo5+sqaydu7CorLaxx8XBwrLDw73Gw7zEybyvsLatsLWvvsS0ubKwurSsmaixqaqanaWhp8Gtm6yxm6qjrrCppKi8tqe3u76wt8Sts7PDwLTItLy4rLS2raqippaVlaSsop+gm6ersK+vu7GmoKmompmYk6KjuKCho5KwsKylpp+Top6Vno+QjZWem6Kep7SnpoyXspuirZmcmqyPnZOVkpl/kaCVjo2foJSLpauvpaainKCekZKak4WKkY2bnX5fZFlmZElITElTQUNASUg7O0Y/OTlPTlZeUlNKP1BeXT1IUEJMTEk5TmNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwyNS0vNEAxKydWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF1lcEA4O0iWd2VBNJ6jn5ygw6mkqrOipLWqlrOsp6GksqyuqbuyrbG1tMbAxMK0wMS+ycS1v8fBtKu1qLC5rL/Ds7ivrba5pZiqsqurmJ+ml627tJuosJqsoK20sqerubKourS5s7nAqreyxL62x6jAr663tamnrKGYl5KmpaKimJmlr7iusrW2oJ+ppJqUlpSkoLeipaWWsLKyp6umop+ampuVl6ifoJihnq+yoqaNlq2YpKqWl52ij5qMkpaYhZWek4uQm52TiqioqqKmoZielYuOmY+BhZSIk553YWdbamlMT01OVD1DQU5DOjpJPzc3Uk9dXlJWUUFXYFxCSlNIVktIOlVkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDEtLy48Ni0jQnFnc2syMy8xW2JaMzM4MDZwW2JIMDRJb2dVQ1dGjHlmQzujo52hpr+nqK+xoqq1q566sayjq7S2sbC5t7C3uLjFvcPHvb3EwsbAuMDFwLmptqSsu63Awbe3qq2yuqKUrbGtspakp5GquaqfprCcq6CvtLOrqbW2rbyttLO5t6y4scO7wMCnxKuxt6+pq6unnpiZq6GioZGYobGvs6ywuZqbqZ+al5OYp6C3qaajorGxtKyzqK2gnKCgm56lnKKXnaOzr5ufkJOkmZ+nmZOhnZOXiJOWkpWWnJKIkJqYlI6oqKafopyXm5KFjpmLfYuVhI2ZaGZrYGxtV1BRW1VBQkVUQDs7SUE3OlhQZF5QV1dFWV9eTk1STl5LSj5ZY15OSFBPXFVZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERUJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEtLS4sMT0qJys9XHA9PjEuMGRaZEAxNjQ3Z1lgRig/OGx9Z1tWO4l7Y0M9p5+doqq9oqqwrKSyuaqmtrWsoa21va+zuLu6vre3wMK/ycS5xMPAv7fDvMC2rrWnq7exu72+tKmusbaelquup66XpqiOp7ufpKyznquisbCzrKm1tLW9rrGytaywtLPBu8a3rL2wsbisraqjsqaepaqgpJeQmp+zqrOrq7Oanaecm5aOoaaltK6ooa2urrGotK2yqqScn6iknpWimZuotamXmZGRnZmdn52PqpyVl4SUloqdmJuTio2WlpqWpqWjoJ2WlZeTf4+UhXuNkoKLlGRqcWZvcV5GWWdWRENNV0RaOUhCNj5dUWhcTlpdR1teXk9OUlhkSkpCXGJfUExNT1hXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7R0RGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfX2BVMTUwPWBWXjgqQzNZVVxnSzaMemZMQKSaoaWtt6Wsqqavrreqr7a8qKext8a3sba9wcO1tbrEvszGucPAub65w7fAuLK0rKm6trq5vrSprbC1l5inrKmsm6urjqu+nautsaOroLGts66ttbK4uKqur7Gota+1u7zKs6q3trG0r66mobSgm6mtoKaWlpuasqOuoaavl6GkmpqTjqOmqLOqoqezrau2pa+xta+jmZ2sp5qXn5uZq7eil5OQjpicoZeWk6qdmpJ/kZeMnZuYlpCKlJKemaSioqCYlpKTlXqLj4V7jIqCipFqbXdsdHthRmFrWUlHWlo9e0pGRDZBYlRpW01cYktcXVtSU1JiYExLRV9gYFFMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYoKDkuJDpLNS4iVV9UXy81KENfUVwuKkEvSkdQW0czY1lVS0SZl6GyqbKqrKakr662qri2uqWstLfKu7S7ur+/tbO3w8DMyLzDvLW9v7+3vryxvK2nurm3tcK2qq2wt5SWp66rqaOwqZSvuqSssbOnqKOytLGysLSxt7Opr6yyp7evt7TExreptressa2pp6O2oKCosqGllZyalbKeqJygqo6po56blpimpqW4qKOytayosqiusbWrpJmgq6ibnJ6clKm4nJSOjoqXm6KXj5ekn5uUgpCVj5ybl5aViJaPl5qnnKSgkZaRkJV2hI+He4SBg4uKbG92dHt+XExmbVxLTmNcPmJ7R0k4R2dXZlxMXmNNWVlXVVhUaV1PT0hgXV9QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOR2UyNydHYkxWJS1BLj1FTFE8M3JrSUNDkZmlr6Wtr6uopbGztKu4srihrLW5ybmtwbvCuLOxtcLCzsW/wb2zvL++ur68ssOoqbmwtbW/vK6rsrGboKexraamr6WdsrWtqrGxrKmotbuttLK0rbOtqqyorKm4rbKwyMG5pbqxqa2tpaiusaalpK+kqZyenZuwmqOjo6ORrZ+koKCiq6anuqWstramq6yprbC1rqOeo6iqm6Cbm5Kjs5mPiY2GkKGflIyUm56RkYONkpKcmpeVlIeXkpWZp5ygnoyTkY6Qd32OhXx7fIWIiHBycX18fFxTZG9eTlhmXEZElltHO05tWGJcTWBiTlZXVldUWGddUVJMY1lbVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvKzEoKSssLSomNSovJjApMzg6MSYqM0JjOjYqSGVISis6Rz4zQkhTLD6QaztHSI+cqqyiqrGkqaW0tbK1trKyoqyuvcy6rcC6x7G0rbTBw9HFxr7Asr7Awru+t7vEp6y2rLK3vMCvq7Gsn6OnramppbCjqrKqsKuvrrCuq7O8p7awsqmyqaulpaOtuq2qssO6tq27qamorKmnsaWqpaOvqqiin5yjrZWlnpiemaydoqepoq2mpK6suLOyoqqjoKuvsKydn6anqZmkmZmPn6aYh4SOiYudoI6KjJWajY2EhY+Un5yUl5WGlpSTl6ScnZyLkpGOiX5+h4V8dn6Fg4RycXCHdGxfWmFuYlFycFxLPIV8Rj9YdVhhWk5kXE5WVlVXUVxhXlNPTmdYVlZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMjU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE7XEowLkpnREY4PEIvNEVLWDJAlVk9TEWWmK2poquznKqqsbetubevrKarq73JvLC9tsKvsayzw8POz8O+v7PAwcO5v7PHw6uvt62yuL++saytq6SnqrCoqKmxpbSuqrGurbGxtKy0vKS3s6ysrqiroKOesLerqq26t6W3tqSqp6yrqq2hqaensrKkp6ahoayXqqGVm6CmnqWiqqSto6CnsbiurqSmo5uqrK2pnKGko6SYoJuWj5eck4KDj4iFm6CLio6Ll42OiYKLl6ObkJCbjJOSkZOjmpuaio+Li3yGgYGDenN/gn98cnWLpId4a19gbWVXZIZjTj9nk0xFYnlXYllSZVVOVlVWVE9cXWFVS05oVlVWSUpISU9CR0lTUVlvQU5YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjM5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlZaLjBKZ0FBPDxCKzpKT140RIc9R0ZEl5OwpqOrsZirqq62rLezrKasqqm8wMC3uLK8taaysMPJy9G/wLq4v77BucG5wMSssbSxs7rAvrKwrqyrq6i2qqeur6q5sKiysa6yrbequLimtLarrKSpqp2knrOzqaiktLSgt66gqqiqqKunoKusqbq2qquqqqKqoK2bkqqhnaCloqajqp+dqLWvqaaro6SZpainqZuio6OfmZmgkI2PmI1+h4yHg52dhoOJiY2MjouChZWimo2NmpCSkY+Tn5eZloyLg391h4F/gHh0gn54dn2Ah52Pb3FnZm93XGByh2pPXplWSG55VWVXUWNQTVZUVVBPWFpiVUhPaVRWU0dPWFVJPklIT1FQeExOVz08S0Q/QEE8QENVQzlBSz01O0UxMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzFQYjAyP2Y9Tlg+Qyw+TFRfMEppNU9EPJePsaKmrK+arKatsLS1sKymsKqpur67wLCtua6htrDJx8jRwL68urvBvbrCv76/rbGxsbW8u8GxsbOqs6mktKmmrrOzubGjrriysLO7rLuwqa22rKqeqqufo6C2rqmhn7CzoraqnqinqqOqoaKtrai9r6yuraKoqKCsmZCwoZiioaeon6ibmquxqqOgrqKhlKKko6eYmqilmJeYno+Kh5SIfY2GhISjloSBgYqFjouQg4OTn5aIkZyQk5CNkZyUl4+KhoZ4dIJ/fHV4eX95cnJ4Zn+GpHZpX2RpgHRmiIt8UlhwX0p4c1NkVFFfTU1TWmZOTFZZZFhHUmhSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNSkoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwS2c6NDhfPWFkP0YxQ1BbWypITDlVQDSSkLOhpaetpKekrae1s7KrpbGnqri+wLuvp7mqpq+xycfI0cO8v764vb68yLrAt6+vs7G5u7jAs7K6rLisorSnqK2zt7qzqKi+tq+3vrC/p62stautnKmvo6ClrayonJ6rs6W0qJqqp6mjqJ2jqaipvqu0sK6dqqShr5ybs6OWpJylpqClm5uqrKagnKuinJOcoqadmJeoqZKYmpSQioKPhX6Pg4CInY+Ffn2Lh5CNj4N/k5qThZOhjJSRi5GbkpWHiX+Acnt6fnxpeHx5c25ve2aEd4WKZGFnX3KEemxmeF1eVD9Xe2xUYVBRWUxMTnJ1XUhaW2dZRVVlT0M+Sk5EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEnLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdqSTE0WD1mYkFKN0dTYFUqPTlDVj0qkJWymqChqqaloquluLO0pqqxpqy4wb21r6K5raiosMLKyczBtr3AtLe/usi0wrSysbSxvLi5vbWtuLW+rKGzp6ussba4tayfv72qs8K0vaGvsrWqrJ+tsKOcpqmqpJ6bpbGnsKCfq6mnoamcpamhrbyorrGuoaujpK+fn62mmJ+boaSdoJ2bpKujm5ulpZaXlaCjl5uWpayMnpGRkYuCioCAjoF7mZSMiHt+i4aPjYuJhJKYkIaUo4mTkoeRmpGTgIl9eWx+dnl4Y3x6cG5vcXZnf3JqhGdlZ11sc41sYGhwYG89W3hsVV1OUFJLSk1UWldNXF5sV0RXX09eT0hNREY7N0hFS088cmhLSzlBRTs7PT47Oz1KNDlCPDM7Rzw0PzE4LTY4OzIoMDkvLDQvLj0tKks+KR00OSYnLjM0LjArLzQmLDokNDFBaFkxNFM9ZV9ETDZLVmRPKjsxTlc9I5SarZqgmKikpKCopLiwr6SvsKmruMG5sq2fua+rqLS6yMvIvrbCvq+0vbfEtsKxrbixs8C0u723qLm3vaqjtKipq7KvurGrnL2+prDBtreirra1p6ansLOgnqWmqKKlmZ+tqKqeoKqupqCmmKSpoLG5n6Oxr6Gsoa2lnKenqZqam5+llp2dm5+rp5edoaqTmpSZn5SZlqGpkZqJjpCGfId+go19fKCMjYh4gouEiYuLhYeTmo6JlZ6IkZWCi5eOkX2FfHNwfnJ0dGB6eGhtb29taH1xY3ttaWVhXGSEfl5Zc2pySUh+aVhZTVBMS0hQUlFJT1xfblNEWFpSZ05HS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy46OzgzJjI8MCw4NUIqKS1CKiw0O05OQDs3My0uKy03Kio8JTUzPGZkMjRNP2VdRk89UVpnSCo9L1dUNSiXn6eanZeuoaGhpaG3q7KmtLSqqLnEtLKtoLetrq2wtcbIwLa+wbmwtLy3vru9r6q9sLS/sL3Duam7urenp7WpqKyyrbSxqJy/uKauvbizn7G3sKmlp6+xm6GkoaWloJebr6ahnqOor6GfoZOlpaO3sKGmsaufrKOvmJyqpamfl5qeppSbnZueqKyanZ+ml5eYlp6Ok5eiqKKQiYuPhnqEfoSLeo+XiY2GeIGHg4eLjYWNk5iNj5aZio+XfoaXjY95gXpwcndwcHRfeXdkamtqZ2eCbGVyamtkZ1dhcn9eWWt1aVhFfV5bWE9PS0hIUlVHMjleXm1QRFdVWWVMSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0SEJmW0hUQ1RdaEUuOjFdUSwyl6SjmJadq56moaOhuKqwobu4pay9xLKvrqK1sKytr7XExL2zvrq3sLO5uLq4uq6tv7O0uK+/wbirvbq0paKzq6mrtK2us6SexLenqri3rJ+yu6qnpaivq5mjp5ykppSYobKlmZ6kqamcoZ+UpqCkuaikp62mnqWhqJOgqaGhoZmbnqGTnJ2XoaOsnJybo5aTlpacjpSTo6ekkImKjoZ5hHyFhn2djYmKhniAg4eIiJGFlJOSjJGVlI2OlHuDl5CLd398bXVzbW10Ynl0aGZpZmNthGZnaGRmZ2hdZGJpZVplemJgUHJUW1tSS0pISU9TQCAqaV5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTz8uKy03LTExOTUsJi41LTgwNTc2YHRCM0NEaFtLV0dVYGhCMzc3YEwnMp+kpZOPpqecn56epLatqKq6t6esw8C2r6yita6nr6+3wcC9scG3sa6ytrW5uLWsqryzr7KxvcC3rry8sKWftqymp7Wqq6+hocWsqqiyta2stLmdqKqrsaWYnaqfp6WSmaWtopidpKqhm6GcmKGep7emr6qtoaGenaKVoaafoqCZnJqdlJuelaafrqOZmJ+WlY+VmYyPmJqnoJCHioqIeIV3goKCnYeKgoh7f4WIhoWQhJaVj4+QkZCRjZJ7g5WPhXN/fmd5cGxrbGd1c2phZmNhc39hZGVmZGhoYWVuWV1YXGxjYU1nV1pgVklISUtNUlg+OWBsaUhCVVNcWklHRkVBLjw/OUE4OVJHQDc6QjAzNz03NjkzOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyssL0EqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQGFFJTWdpaGSja6hmpmgl6W0sqOyvrehscW7ubCxo7erq66pub69u63Asq6vrravs7myp6u5sK+utLa7tq+5vq2mnrWroKGypquwoKbFobOmsLKxt620nayvrK6imZ2oq6aflZunpqCZpaOpnZqfm5Wdna2xprqorqKhmpuemZ+kmqWdl5+Ym5aaoZSql62pnJWenZSNlZqOlZSYp6eNjIqJjnuBdIKCi5iFhnyIiISFioyIk4WUnJOSkJCRl4+Qf4GNjoNvgn9neW5pbGpncXJrWmhjYXF/YGRnam5rZWllY2xcbGx1cWJTYmljZVpJR0xNT1lRUFVhZYFUQFZSWlVGR0ZFQC88PTc/NjxGTmE4Oj8yNDlAMzc4Mjg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDo1IzMqKTYuNTU0NjVafF0xOkxqW01bS1hkY0BBMUdgQSc0lKOcj4+xnZyVoZups7CfuMC2oLTBu725saa2sKmupbi6uLitu7Ctq6u3qrW5raSztbGvqbG2trGztrunqaC2qp6fq6Oqrp2sxJmvprCxt7asq56wra+qopudpK2pm5Wdp6SdmqqjpZaaoJySnKOsq6m7nqakoJeamp6hj2ujlpmdcYOYnaWAdpKsqZ+Wl6KSipiZgJeKn454hZKNgmxpfneEcWyGioZ9hIuGb11kYWeEmIZsi5CUknV5i4R/g5B/ZoiBaHZqZlhcaXRuTU9pYmVwg2ZdZGZua2hdW1yJkISIaE9LRDhGVGdeSkhRUFVWS0hSYXB0ZUZbUVVQRkdGQz4xOz02PTY8NGZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjg2WIFsMTVPa1xOW0tbZmI+RzFOXzsrLo+km4iWsZudlKGcqq6so73Fr6m3wri+vK2nt7Gmq6S4tLO0sLmuqaestKaxtaKnuLa1qKettrOutK60oqqftKueo6adp6mcsL+VqKewtbmtraOorKurpaGfnKGoqJuYoqamnJynqJ2Tnp+ZkJ+oq6S1sKOio5yWmJmYo4ihj5Kah6GIlZ+igKWAqK2flJSelImEcniNjoOIoHWHjGmWiGZ+c3igb4eHhH6MfH+hoKCZgHyHn3SIjnabimuHgoNuaWVke21yYlSGbWRtaZhxWGlvbYZXXWhaa2paiHBreXKHaIeEWV5GTj5GXk1GUlZWUVBSV1RnXk1aTFJSUEVGRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk6LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdDE1UmtbT1tMW2dfPUsxVF03LyiOp5iEnqydmpqdn6uqqKq+w6+yuby3wb+qpLexqqymtLWur7O3q6mlsq2ltrObrLW2taWmqbOxrbKor56qobKpoKWlnKKlnrG4laanp7e9pqymqamsp6Whn5mhqKSamaejpJicpaqXlKKclJOkpqeht6Wjn6OYlZSYlJ2IrpCYlYqqjJmknYaxgaWun5WboZd6gtSogIeUwJvGeHexpbeXZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4Jsl7GrsXlpbFixrm9maryTvG5neW1xj9h+UmtitrJ9fnCVdZqhqpBWTldhT1ZOR1ZcWFBQU4tcV1tQQVxEUE5DRkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkFFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cxMVRrXE9bTV1nXD5MMVlaNDEhj6eUgaiqn5idnqWtsqqwwr2ytcC1t7/Cq6a0rq2pqLC1qrC2tKiopramqLmunLKytqqlpKeyr66xp6uep6WypaKioJicoqGyr5afpKG1uqOpqKCsraSinZqao6mgmJupoJ+XnqiokZ2nm5SeoqejobCjnp+jlpeTmJKZha9raoyOqn9ohZaHrWZxn56Vm6mXca6hpH93unxroI92sV9qtFulgGWckGBmgXpmf2l4a6plvnNnpox2sWp8sXh1kpRjbW2nblyEoEVpZ4iWRXWcX31me6Ongllfi6tofIx3e2qoOEqvW1hUbGNaS09ZYFxWVjtOiFBXVjBJU1NKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy8uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TjVdVzMxG5KjloOtp6afo6WrsrittL2+sLfFsri6w6epsKywqaqxr6Sxu7Glpa+zo6q5qZ2ysrCjpKCqrbCsr6eooKOjsZyknpmXmZ6fsKmYnKKgtbOhqpuhra2fnZqXoaOpnZmepaCcmaGnpJCdopqXoaCsn6amoJqfoZaVkZeRm4a1m7V5h6matpl4iLSbt3+Ul5isl39rgaZ7gYWGkZSSd6tnarFbrHuOh5R0iXCOhoF/iJGXeIODi5eMg6CPhbB2d59ya2ttfItPpVhIZGSZfmNopl94cXRSkoZdUKluY3B6hYBhnS9Tom5bVGtnYExLXWRYXFpCPrB3V1hBI01pRUJEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQUFEPEZEOzAyMDE7RSwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0o5YFQ1MByXoJWJtKanoa2pqLOsqru3wrC8w625tsKrra2vr6ivs6qisLyroqi2raOstaSlsrOoo6KdqKuzqbCopp+goLCXoJuXlpebobGlnJukqLavoaiOqaeqm52WmKCmqZufnaSgnKCjpaOWm56Ymp6jq5ymmpyaoqCXk5GUk52E1ZOZuXGxwn/Gh33WlJy7fZyXqJKPnY2ke42GoYClgnmreY+dVq97iX6farlauXeHhH2mg5R8mXupeY6dkHuxbY6EdZC8hm+VUK+nxYpRoHpjYKphc3KGa5aHXlK1tMiFfol8Y6Q0Q511XVBqaGRQQFhnWWRhSkhNakpaU09ZZlpDRD9FPzA8PDU5PDc0PDw4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREIuMDA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0pbUF9mVDdIOmFQNzIlnKOTmbKoqaWzqqW1qKS8uMGwusCyt7S9tLaosrGksrSnoK+2qZupu66jsbKhsrSxoaSenqiqsam0qaadnp+smJmZmJiXmaSun5yXqK2xqaOejquip5WdmJuhp6GYoqKjoZuioqicnqCelZmbp6Gcp5Wbmp+hmJCSlZCdiLJuaLVyrIhwj6dytHZ0tnucmqaOkJ2No36PnqN9sHWCkNLSdVyufIV/pG6bqqZrh4V9rX2YmZB7sXOTnY95s2WWdIWeb59mlFLJi1rCXJ95Yl+tX3ZzhWGWiF1Zyp1vv35yTUu1U1XGZFVRamNlWEFPa19saVBVRkg5PVdSW1dYSEI/SjwyPzs1PTw1Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxBTlRfZVA1Rz1hTTYyLqOekaawraWpu62mtaWntru8s7u/uLi1vLy0prW1o7Oyo6CssKWYqLuupbKxnLS4qqClnaGqpbKorKqlmp2bqZ+Wlpqak5Wlq6KYk6arsaahlZKsn6WSlKGcpaeglZump6Kbo6CumqCenZCWm6OfnaaUnZWZo56VmZaSm4WsfHiod6OPi4eqcK2MhaiEmpuji5Obi6J+kZeHroR/gbNccrJTr32CgqN+cdd9d4V+j56HmZp3r4aKkZyId7RhmmWbgoKVbJJbsFdLmnWYeWZgrV52doZnl4hqXa92lZ6Pd2s1ecius19DVG9eZ2BFUGxfcG1WVU0uZWNoUllRO0FDQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITA0NzY3PVBrZT4mVmdcQD1WX2NONkdCYEk6NzegnZSht7GZs8GtqLKnqrO6t7W5v7q4s7e+tqa4taG2rqCgqayflam2q6mysquttKSbqaCgqKK1p6aqpJmelaWhlJSdmpOXpaiclJCnrbCloJSZqJ+ij5GimqmloZWapqmenaSfrZygnZ+NlJ6cn6GZmJyVlqKglJiRp52HqX5/pnmhj5CEqnCtjYOnhpeho4uYl4ijgZCGlKp6f4udeXCxWqiDgoigeHTYf3aHdKiCj5uNkqR8lpCfhHuyXpxkoH6ClW6TXatcW5N/kX9oZ6pjcnuAapiGcV2rWomgj2ttZE9KQ6FcWk10XWJmTVphX3J0X0pVNUqakVhIRT1HRUFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4xMDIxNTQrKjA1LzcsJjIxKCQlNjY3MTxPZWRBJlVmWz8xVF9iTDdGSF9DMT03op2amr+tmLPCrqusqKe1sbixtb+6u7OyuLyqu7ahsqWfpqion5Ossamwq7etqq+hmKKgpqWkuqOjrKGXnJKjoJaVn5uVmqKhkY6MqbCwpp2Wmqemn42SpJinq6iWmKmon6ChpK6joJ6hjpWhmaCgkpyXm5WeoZaWj6ycj65ucrR0qYx3i6Z0tHp1tIKUp6SUnY2JpIeOdbhvi3uLomtrtlqhhmWXl2igoqdtlHK0dJOZf7NqhpKIrWp1tGGdZqJvh5JrmF2tYE6hfIeRUnOjbHl/fm6Yhm9cr1Y8nHdlVG9uLlunT2JSa2VibFpiXGBwfGNTWVE+P2xvMkJCQD5NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssMzI2LyMwMCwsHTI4OS85TmBlRCdVZFk+L1VeYUw1Rk1eODFBOKWanJ66pJuxwK6uq6uot6q4r7XBtb2ysbu4rMK3qqyhnaekop2SrKuotqS0qK6qoZedqKClq7ido62clpmQpqOXjp6hnJmfn5GUlau2sKaYk5usqZaMlKaapa2jkpirs6SgnqissJihopCZoZegm5abl6GTnamdlJCrmYfUlJq7dbHEgMSHftaXnLh5ipKZjpiKjKeHeaK2dX13dsGDmrJhg7p5wHx1uGK1gYyHqX2VgqypcXt/dbyIp6BpnWGmj6+ifo11h6t9vm5zvHSyg3V4gYptmohwbY2kdL1dd31bYXm8alpWW2l5XmlhY2ZibXhvWFtZQ0FAcT9DRys0SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sOzowOExYYUYnVGNYPC9UXmBLNTxMXC02Pzmnmp+ivKOXsMOvraqqrbGoua+3xbG7s6+8sK7Csq2mo5+lop2ckaulqrOltaetpKCWmquZp625naOumJWhkaagk46do56Zn5qQlpOvubGrlZajp6aUkJalnaStn5GhqKygnJ+ppLKdoqSOpqGVoZqcl5WkmZCwoJKVqp6FkJm2gJKSjbiWeYOTm7Z3bmxvdG95j4SOiXKewLu8mnuBsqhwgXSRuYN8hoaLho17ioeMl32ku7m9nHV5s6N0dZd1dLB1mZ5mh2qNtnRzcXe2jF6AeX2IZ4N5bHpii6xwdIV+V1unaURkWVRmX2NdY1FnZnFtdUJNT0xEO1pMPkoyOzAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEFLTkdFT0Y/Rzw3PjcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVzgqT11dPSs7VlYnPTo8pp2hob+mlbLCs6uqqK2rqruvscavtbSwuai1ua6rpKKnn6CdmZStpa6rp7aoqJ+clqGknqylvqehqpeVnJGim5KQoqiilJ+XkpiUsrW2rJedo6Oii5KSppymq52WqaWmnJuhqqamoqihkayel6Kel5aYnZ6QsKmUnKeij2t/ap2qeol0f5yPdntmiHu9vsC6b5KDcZSFX3JqWl6bimFkh4+WbGB/lWNtnHZilWyAmZWUZl5gY3GbiWhyjHyGlGZqfnF0eH9+Y1x4dYFoUFxuhHx8impXbHqCcklKb4VwTnFNRFZcZmBMWldmY19PW211anFST0RETTxISDxMPzEsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVDRlVFS09IRlBJSUg7OD01MTouMTs6Li8tNzY9NSYiLyoyLCU7OC03SVJeSSdTX1Y0KVBeTCgzPlxPJz8yPqifqaLBpJqzubajrKavpqi2sqzIrLC0rbakvrKzp6Gkqp2jnJqarKeupKW2qqWbmJainKetqb6oqaWVlJuWoJqTmaapqJKfkI+YnLCyvquapp2noomTkambqaScnKygo5qbo6esop+poZmum5SmoJeUnZ+dmLGlmaKomZ2Sn52kppuopJuem5ybkZeCaG9+cXeRl5SQhIm0qo2FmJWPioyZl4iUlYmDk5ORiY6SlJiUmZean6Gam5Sfm42BeqSFa2p8kX2BdYqLg3KCeHp2dot/fIlqc4F0g3Vkd312a294bF9iW29nTVhZZmpfV1lveW5tZlNPRlM5UFpOUk8nKjtLQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NTR0tOREdQTE9JPDo7NDg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0knUl5UMTBUXjorPThdSyw8LUCyoLOiv6KjsLG3oKqms6elsLWqyautsqe2psGotaGfpaacpZaVoaynraSkt6ygmZeXoZitqqbBn6yklpKcl5+YlJWjnp2jqJOQmKiossKvmaqcqp6PlZapnqqcnqGtmKGbnaKlr6aho6eerJiWpZ2ZmqGenp2woZ2ip5aZlJqVoqSYpKCZoo+YlYuLjpCYrpB8lZyCkYGJqaiFgJiXi4SPoIh7hJGFhZqRh4aKlY+bl46RmJ6jlpmSkJyNfo1lobOuhYqEd3uQi354eXpwZ3mRgYGIa3WBeYhyaHN/eXWDhoFqdGJ4ZV9oZGNkZmpZa3twampcU0xQRF9VRkA+Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1RWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8zOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAsp+5r76tq62xsqCqprKto6yzsMWwq66ks6+8pbWcoaijoZ6Zl6mnqqalprO2n5WVnpqasKauv6GsopGRnpqalJKWop2XqZ2Enamro7THs5+po6qWlZeap56pnKClrJSfn52fqq6opKKqoauanp+hmKWfnJ+dsKSZn6mUmZmekqacmqqfnJhmhZN9ZX+Pm5Bjeo1taGp6kKOramWamH5nhYtlZWloeo2ijmtojJiRondraouZo5+Yc2xueoSMhnlYZV2Ggl5si4uDd1xodHd3koCHgW93gnh/c215hHN2iIeNgnpohFhdanNkXXOJaWp8cm1jXVFOVkpkWEBJMz1GOD9GRDcxPD0/QUM7O0RHSEhJTE5PUlJUV1teYGFhYF1dXV1dX11aVU9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQklbSi42Wk82KUVZL0RPMVlCOz8uPaSeury5r6uysKulqK2vsaeurrC9saqppa6wsaCtl6GknqKamqasna2kpqiqs66elqSQo7Cmt7mlrqOPj5qimpOSm6CZmaaWe6Sroqi0w7ekoaaunp2UnqOfpJ2kqqmSn6CeoKqvqamiqZ6mm6Wep6Csl6KcpbGlmJ2slqKfm5OnmaGsmqB/vYSJc7RzhZ+GrWh3ucS4cZKho3qmmZl0q4J9y8DAunGLo4eDnn2WmIiewL2Clp2djZzBwXyBepGMmsLAfWqlsnCOgm/KeoCbeJKDjoB2eYGAeXF7gIZweISKknhsdZFiZV53Y19lgWJddGhtZGJYS1VJUVlIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fYGFfXl5eXl9fX15cU01QR1VOQUA/PTY0NjgyNjYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0NQLyNGWzNQWS9VQUI7LziVobnDtK+vv6mplKOwqrCvrqayta+rpqemsaugq5ibo6Ccm6qno56so6WppaW0pJ6jlKaurbi0p6+ikpGZnaaTkaCimJygnoimq6Srrb+/sKCorqiWkZ+dopmjpKqjk6GhnZ2srqiqpaOipJ+jpJytqZKkm6muqpyeq52uo5eYp5ijpJmef86UenulgnqWl5tfrY9djqiAoaF8p5WbdauDga9eZIyqe6iHhaB0l5OIs2OCq4agjY2zaoSvdHyWh7hhgq1Zo81ukXZ723t/mXF+iJJ1f2V7iHZ2bH6HbX2EjpB9a4CMX3Bqb2ZgX3hkW3FoamNmYFJUU1deSk9DNEFIRUQ4PjU7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xfX19eXV1fYGBfXl5bV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w6TC0hUEBGNC4xrMHAwLS0sLeYnpGkqqmttaumsqysrKWsprCqoaecmqaYnKKvn6GfqKejpqGfsaycnpWmrq2xq6isoJSSm5+lk5CfpZedqKSeraOqsKi/xbKnqbGtlpKenKKXoaqqn5Whnp2cra6mqaibpaWioKqSrLOWpaKrqp6kqKejsqKUm6icoZyWlZGXoXKGjJh2hqiHcbB8nXGsfaCggqWPnnirgn6tf51yrX+sh4afdpiSe3yXf6qIooyRjJx9q3qIk4+ff3qtVpzEe5Bwk8F9gZVtdXCMbWZ3ZYduYXhucm6HiY+OgmyOjWNuc3VvYGZtZF9vaWpuZmNYU1xgWlJSQzhJSEBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MjQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi08KD0xKTNWQEYhHEc7QzEuK6/Txseys5+do4+jo6Kur7evqbGnqKqprqusp6KknZqjlZ+mq6CipqCoqKOfnrCtmJuWqKevrainqZ6XlZqkopKUoa6anaejrqyirLWpucyxrKatq5aUnJ2imZ+urJ2WoZmenqmxqKiom6qmo6Gqmq+xoqisr6aap6yrq7Okk5mlp5yWk4Wka6R1inqpdXuycYKlipiLcYigm4ekX2FSq4WAroOcda6CqIaGn3qZl4Z7ZoCjiqSYhoKjfal/gZSGrl57qFWdopKCe6OfgHzEsMWMc6+0s7lyYqmvwnRoi4uVjYBrlo9tbHh3d25rZmVkcXFmfGljXVZfaVhYVExMUExDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmFhYF9eXVxdW1NJQjY3OTk2NjQsJiQiICcnISstIiQuITMtJkBEV0gsRys1NioxUEtMIyBBOUQ0LCfBydbWwKGZq6ihr6KfsbSwr6mso6enq6urqaWmoJuln52mp6aknayaoqyhpKCvo56bk6qktbCvoambnJaVp6SRm6Kon5+mnLCloqixrLbHsbSpq6mVkZ2doZmgpbOdmqGUnJ6nqqqirZqqpqChqaKyrKGqs7KhnKuqsbG5ppSYpamanZN9qm2fhIh2q3l8sG6CpIuIn5aVnpaB0ri0uMmBgrJfYJSpg6WIh6B6mJaaearJdJqjlKipkJKajH6aiZrGxndloYKldIKgjoJ9r19vtWOxdUujh22nR4OTZI2PnJB6bpSOfG55dHx6bVtmanJxZ4FpXmFYY21cXllJTExKRURCQj1BPEE/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fYF5cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwwLz4tNE9UUR0cOzxGMi0kp6TAx7mtqbKuraWjnLO5rKuhpZuopqusqaagpqWYq6Ofr6ydpqGtmp+ppZ2ntqCjmJSoq7azrJymnKCWkKatkpqcp6OgqqatoKKmqbCzwbGyqaynk4mXnaWboqSvppeilZicpaWpma6cq6WknaujtqyhsbmwnpywqLW1tqeWmaqmnKGQg55Od5qCgJ97hKN8gqSDhqafnJ+UhLh8fXq5g4DNxsO2eJuikouffpmXl4p2n5eKpJikqH6vhZyDnoSsfZmUYaVso3GQhZCBfZaEcqxgpHNxgJphvH1SVXWNkaGUenuPjYZyeXOEfm9bbG53c2qBblpkX2huYmRdS0tRU0FHR0ZIOjpLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFdZWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9URjxFMjpQW1QcGzY/RywtIYuHmamspKu5q6+gnKGts7Smn6GVpa+urqmnnqWlmqSnobOuoqmns6CaqaSUo7Wjo5aXoam1uaSbo52jk5Cispmem6aloKKvrJujp6K1scOwramsqZGHkJynnaOknKWXnpiYmaWjqJitoauipJeupbusore2rp6etrS6s7apmqCyo6agiJDStcO3eoeOhpGTj4Cmd5Sid4yhkoWlg4xyq4iGtG5zapqknZaKn32XmYeHkHOugqWbo42mipOdiJSQmm1wslylc5N6nGyZf3uZfm6pYaJyc36fYnOyuGh3jpKjlnuJiY6HdXt4jYFsaHdoeHNugHRdZGRtbWZoYEpZV1c8R0Y/UzNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVFFPUVtVJSEyQUgkKiWSco2Krb+/vLu1npeopK62oqKZlaOqqK6pq5mlop+moKC1pqKpp7GklKujj6StpJ6RmpqqtLSknaWcqZKUl6+goJ6mo5ynnLOYn6mjtarCr6iqqKGMg4+doqGmo5WampyYmpimo6WXqaeroKObrKa8rJW9sK2fo7K1u623qZ6staarmnyokn18sHiLgKSliJxtsW+gh618oo+DqJeagqyKhq2GoZWooaOYhp+BmZaBe5J+q4GdmZaLq3edoI+Ik5J/eq9do4F9pqdlnoB8l3Vqrl2lbHKGmV1gW4ygbZSPo5aAkYmSiHh5gZZ+aWx+Yn10bYB5YGdlcG9nZ2hCWF9aPUpTMlM4QUFDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaWFNQT05JODE1Mi4qLEFUVlZWVVRVVVVVVFRVVFNTVldXWFZVVlFIRklKJCkpvJKahKnGw7fBtJ+braCuuaajjpqjpKCvrqmfo56drZieuaCjq6GwqpquoZGqqaWXipqQrrGtp6Com62YmY+toqGdpaGZpZytl5+opbaovq6kqaOfi3+Om5qgpp6Sk5mak5qZpaOimKerqqGinqiovKSXw6yro6KttLutsKmjtrGsrpp3r3+QipyGh3y6rYmYZLCMZJaufaGQhKeXnIKtjIawh6iapKKjkoWgXGxrgrNgf618e4KBsmxnbpmXi4exWn21XKSDa8iiZp+BfLtZdrVasn1Tr4F6rFiAoW2WjaWYiJSNkpN5d4ybfGNzfGKDd3SAfGFpZm9uZmVmT1RiW0FTXT1IKD45PTQhIS0kHzEuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBgYGFiX19cW1hVUE5KR0M1NTMuL0BVWVhXWFdYWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7G3vru0wrOjnK2npbepoIuZoJ+dsrGonqKfnbWYoLOoqquesK2erJyVr6mjjombjq+sqaejqJquk5qPqZqhnaWfmaSipZieoqixqLuupKienY58i5uWoaCZj5GZm5GZl6ien5enraWkpKKkqLqfoManpqmhrLa3rrCpob+wsLCYgqqTo66Om4CGpJeYkIGAuMO6hI+dlIWomZ6DrIyEr4qpnZqmq5J/1r3CqmKkv719f6OCg9e7uLWElJKCnr2+hGujgnCrhW+df3qysceDa6uxvax5eKK+u3SAlIyjmY2YjZOZd3+PmXlifHlkjGZ4gXtga2VqamJQYltSaVw/U2BCTCk8OjQvHx8kHiUyIB0kKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSUM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbS0ssC6sr6zop2vp6azp52Ml6W/qbavp6G/pqaxm56xnLmon66vpaeVlK+sl4yDmpGupqOsoaWcqqCYiqOTpp2nm5qgqKKYnaCsrKm4raejmpeSe4eZkaebk46Pl5iPmJOpmJ6WqKieqKagoqq6nqnFo6GwpKy0tayyrKO/q7OynXV2qqS2hWWKoHBnrJCKj25ud6WQm6GCdrKcmHGRjnKXqqSbmbClcm1tbWaLeG9tg5pxgXpqcWlniZaVl3JpaYWHZ3GHZF6LY2lvWl1nfnimYGJykJJwZmSAjJGOn5WVl42SmnqFjZN0ZIZ3Z4xqeH55ZGxjZWxiSmRXSWpZOU9jRE8nSjkrIxwgGyIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdbXGBgYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWttKm6urKzq6mirp+ktKqZkr2xw8e8tKmev6uso6Cnq6C6o6SurK2mjpatqpCMhZWXrZ+mq6KfpKSgkoulkqaZqZqWo6mglZylpaauuaqrmZqTknuEl42ml42RkJeUjpeVppOdlqeima+lnaGruZ+wwailtKetsbOssK6qvKeyu5iMo6mltZyJl6OYh6mbkJSdkqq0mpykrqK1maWjoKOknqOlopesp42Tk42Hk52dlZCZk5iRj5WFf6Sal5aOjJSTipCIhX9ojIF0g3d0h4xxp219lpOUlIGBj4+OjpuRnpOUk52AhZOLcGiPdm+Jd3V8eWlrZWNvY1VhWD9oWkdhXk1XK0U9KyYhNjQwLh8cICUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdVVlleYGFiXV5VUUtFQz45PUBBU1hbXFlXWFhYWFhZWFhaW1tcXl9fYF5eXl9fYGBgX1lZYKWWqaqktbiur6Kwpa6gobexkY6qxLzDubapoaSdm6WdsKikt6edqbWnqJGYrKOMiIqPnKeWraShmqien5OWpJeomqmZlKago4+ap5igtLmnqpiakI17gZWLoZSKlZGVkI+Sl6SOnpinnpq0o5ymq7eor8KvpLinsLCyr6ustr2jssCak6elprSikp2nn46poI2Sn6KtsZuipbOrs5qmo5+nrKCfnp2YrZ6TmqKclJCXq5mNmZqXkJefkYegnpWUhpSNkI6WjYJ/Zo6IdYh3eomEdJxqiJKWlZKJfYyWkZKWkJ6QmZKdgYaXhXhxlHJ5iX9xe35qbmRecGlgXF9YbGJPX2JOWDlGRkQ9Mjw9Ny4qJSspJh0mNDA2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBhaWFlVlBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlqSoo7C0rK+jqqeuoKi2qpGPm6Oyua2qq6GimXqcobCkprGpl5y4pqOUmKmcjoaKiZyjkK+fpJapoKGTl5mcrourlo+omaeMmKiOnbi1o6WXm42JeYKTjJuTipWRk5COkZahi5ydp52dt6J/g661orCwdaS/pLOgeXuirbW/l3evpqGKgKp+ZFxid6CPpJ6Dln5tlLWdpamxraZmoKKVdXucmXCBmaqZbYCkqYplnKWckZiZl4yTnJGEnZuQlYSUiI+Pk4uGeWyRiHaHcXyGgYFhaYmMlZOMW3aVkGZojoxxeaGVlWR4l4WAdpdogomCbnl/a3BlYHZva2toW2RjYWBsUFk9TU1NUkY9P1NCOTAvHh8mNDozMDY2Nzg8Oz5AQUJGSEJHR0lLTFRVVVldX2dnZ1hRSjxESDw5VlJbYGFiYF5fX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqqaprqOnraWSlaq0rrClmamlqpZ0i5yvoKirp5SXuaCgj5yknpF+iImbno6smqSVqKKejpeSnoV1ro+IppqokZajiJu5s6efmJiLiXV3ko2Xk4mTkJCTjI+Sn42ZnqWYm7GVgIybtZ20jJKPvaeifqeje6WxuoOOj6mghIyFj7Gqr4yKlqOaeYGLrIadn6Opq6qJloibd6Wce4icgZinhIJ7nrN7ioagmJmVmJeCkZeWhJqaYnmIkoWOkJOLhG5ykYh6gnGBgYaAh3SIhpeTeJZok3SgmnR7mYKbmYSYfpGIgYKYaYyMhGp4e3FwZ2V4bWlsaltjaWhkcFpbSFNLUEBFNS1ZU1Q2KSEwOT0+NjQzNTY4Ozo9Pj4/RElASUVKS0dTWFtYW2FhaWZZUUg5RUw8P2JWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2YpKCmrq6rqK2gqbGmp6qlmZOsxLyvoJSlp7SdkIOdrJ2noqCNkL6emY2fmqGRfYaOmJeIrJ2jlqGhko2UiYaAkaiOhqGco5OWnYaeubGnnZqSjoVwdY+JlZCKlI+Om4uOkZ2QlZ6jlJ2rh5+0ibSarovKiKuvireFjbCEs7GGqY+qmo2dfKiPcnt3nI6mlmiVpHm0jKGgqKqUmsKDgauJmaFynoCbpX6XhpaygaF9oZOfj5iYgI+Um4mZkot8hZSHjZaUioVudJOGgHtzh4KEfYV1hoOYgo/FZoCph4+iap2BnZeAmYCKjIOImG+NkoRnd3R7dmdpdnBnaGteYm5sZmpXZEZcUUwyRTQ2TWBjNyYzPEVHRDo2MzY1ODs4Pj09PkJMP05JSkxDUVpdXFdiXmpsW1FFPUtNQElkWF1jZmhnYmJiYmNjX19iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KgsKmpqKasoKW5samrppqUnqGkqaGUo6m2orB/oKedpZ6diZS9mpONoJKdkHmDlpaRiKuZnJuaooWPjHabm46gkYedo5uWmJeGorispZmbjIx+Ym2Pi5OQjJCMjJeLj5GejZKeoJihp36hp4etnaCWrpCgnp2Rh4Khja2yiaSPrJyMmn6idoCZlGuCq3VNq3iHjZ2TnKqpgqqrf4WifHunap6Ak2xnl4aYt4mefm5gY1iDmH+NfGRnjHOZfXmXbF19mG9hVHKGXWBteoRgWWWCfoWBmXKoqmuDo25ypW+fgZtnZJ5sWmyJe2VZX4J+YVdQb3Zlb3RxampvXWlvbGpnV2ZNXFdFOEE0R0NeazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUktNQkpcXV9XXl5jdV9NRDpNTk1UYlxcZmZpaWJiZGJkZGJhYmBiZGNhYmprZGJkZGdkYmdlYWNomJedobmhqqSmrJKitryrr6KZlp6gpaurn5yttKKokqCgoaecmY6YtJmQi56MlYt1gZSSjYqmlpaYnp9+k4WFrKOHnJGKmKiXmZqRh6WvpqKVmYeJgGluiIiLjo6Ji4yRi4+RoYqSnZ+aoaR/k4GPo6GUoHeclpCng6OpgIesr4eleo1/hJp9onBzk4eVe56MeW2HnIuakp2qnI+HnX6EonR3pmeefnelX5h7fZNzom6Yt7S6dJOIgoC2qGSBxrh8cZW2jHKBm6RkdKyrYX5qnbN+bn6JhI+DjJhxgKNscqNynoJ9o16cmbOVcHyXnrN0cluesoJpYnF0dXFob1hqa3FwZFtnXGFLQz1ENVFBWXEyPFNHX0pSPTwzOTU6OjZDPDtASVA/VE5OUUBEX15bWldgYHtkSUM3TFdVVmNhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaS5mauck6COpbi2ra6gmqGboqOkrJqasayrk5ehmaGlmpqUnqybi4mReIuFcYCWjYmQoZCTlJ2XfZGKjqighpiOiZGik5uajIuop6Sej5aHhH5re4Z/fY+Ng4uQkImOk5+BlZufnKCfi4l3nJiijaByoYyJqYmdqJKZqq6Bro1+eqCZeaOTeIBzl4eMnH2Vn4ebjpqdqIijZKF+jJeQm41tnmibjm+amXuAiqd9cmh0q4Oeg3OqZ5SaXZuFdoSdaKpqgLlmXKlwgZxhlYxfp3Z3iouAnWiadYeTkpiNfp5smI9qpplcqH53u2p9qVqOhF2zZ1tucnh3a2lbcGl3d2FeZFZhQVBETjZWQlJtNEpaWl5OWkRAMTUxOzs3SD86Q0hVP1lTWF0+RGJdVmBRYWR8aUZCOU5bXVhlZlhmZm5tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mWnYmqtpyoiWOVnKy7srCsnaWbmqefnayZnbCnq56Xo5qioJmWlqCkmYaJjWmIgHJ7l4iLlpaEkpWYj3qLhJaknImVj4aKnZKcm4iPqKGfmouQioCAaYGGeX+WjHuIjY6HjpWZfZKhnp+hk5hyaJ+KoI+McJKNgqmJmqGlq6Kqf7GupKK4l3ejs6Kjf4iUeJ16qpl/oo+fnZmJmHKhfoiOsLV9bJqRoXh+mbWjo6uohJl8m32cm390qlpdb3uXi3ieYk1/e3uGZXqYQk2fWaJqc32Pb4KKhJl2m3mHibGzf36akqZzfZ1tcHyUb5lyaaNdlXZIZWNfdHF8fW5lX2tndXpiY19QXVdcU1ZAWUVRZ0RSVlxhWF5JRD1COD9BOkhFOExFWEFXUlpWRUZiXFpgS2BtfXFFQzxWXmJaZWpWZ2htb2JmZl5hYFxdXmBoYl9lY3ZsXmVnZmxkZWxoaWxplJ6Bsa6ahFNfoae0urOzqJqii5qpm5unkqCro6Coj56enZqZlZignZaHh4l3hYFueJWFkJuLfZGTlohygYmSoZtykpCAiJiUn5qEjqibmZWKiop8g2yEhXGCoYx4hYyIh5GYlHqRo5+eo4iuhn21hI+enXumlnqpgpefkYyjn3+naXhufpl0oHNxfJ2FmG+Tgq18pISnn5uDpHBeqWh2o2RwpmGc0498e5l4cnNjooaRfqJyo5B2a5CzjGCDmIp0qrKovH93hG9/v6aqtF6cb39yl3CCdKNyXqRndKZgaKZsm9OYeYGabnZ5l2ubeXaXcmyppWdfZXlxf4RsaGZjbXV2Zl5hUVplUFFhSFZJVF9XU1tlaltlUEVDS0xKS0FKRDhQQFFOWFNYT1NRYGVlalNkeHl3SkdFZF1lWmhpU2loam5jamZgY19cXV1faWJhaGV8ZF5kZ2RrZGpsZmhtaJibf7CsVF1LfqqvsbSws6KcmISXpqCgooykp5+XqYqZmJmUmpOSoJiOiIV7cH2DaH2PgpOagXeRjo+KcICGj5OSbJiTfIiRkqOVg46pmZOSioWJeYN2iIBugZ+Gd4CRhYeYoZZ4kqGjmZ+Js6Gitot6rKekrqVxqYCbkYaCn5V+pYGjm4aYcZ6Eoq2uiZeLf4ykjZWDr6OVd7W2tsmidJSNg59gnZepbXmWh6CbdaGHd6B+kZeLgW9NZqOTcpuJdKV7enVihINufqFtcmRgnHN/dJhre2q0trTGpnOYfXmcapqZq3OAmmxzd5dpmXl0mHFQRH2zXmp2a3iHZmtmYnN0b2xVW1JZaE9RaElVTFhSVVxna25VZ1dNSkFKTUtISk5BUUpQZWNqbWV1c3N+eHtudIl6e1VRTm1eaFxraVJqaGlsZ21mY2VfXFxcX2liZGhre19dZGdjamZubWVpbWWinYmwqIVlQJSisquvr7Whoo9/lqehoaOLpKadnKaCmZeXjpeQkJuTjoiDeWt5hmWDjH+Xn3l1j4iMgmqFhZKEi4WdjXqMipWlkoKXqJaLkYuAiHqAfYt5cI+ghXmBlIaIlZ6UfpOkppuVloNnbnicbKJkfHKleJyYcGing5qOfaV7opeDlnKfdoCJlJWPuW6QiqJifZmjl4luc2ura3WgbnCnYZtqi5BploeblXWigX6aYIuGjXVviGJooWaef2qbdXFlZ4mCb3OiW19bZKFuXomNcXyAdHJkpW54omNmp2eXcYuXbaFvUoiPbqBeZKdUi11UmG1tcmtxgW1waGt3c2puUVZVVWVYU2xJWE5bSFdoaHNqWWtWUFJFVlxNWFJhVWhqXnd1e3xwfXxygnt/c3eNgIN3XlFzYWdicGdQa2hoa2xvaGRnX11dXWBqYmppdnVdXGNoY2ppcmxma21jnaWZpnpldG2Mp66lqbCxpZ+Lf5apnJ2ji6GhmqKigJWZk46akIuXkY6Ke4ZxgIhoi4p8l5pzdYl9kHxlg4eViomVmoJ8iIaWpo+AoaqPhZCKgYl9gICOc2mPpoN9hZKMh5efjYaRqaWdiaZ4lpt+pYmWjLKZnpGEr5efpXqYiXupdaiQhJpupaKMkoSMg7xtfKWvgoeFh5WYnqJ+pnxzqJWhlmmff3CsY5aKlpN4qG2qo4GJdomDd6uRpohrkrFsd7ONqWyLhm9voJ6SlWJ/q4yqeIGAjqefd599haSWnaBomYd1rGaerYy2c3a+jKSTWYOmjathdXJ0b3t1cGJqfW5nbFJUWFRgYFxrTFxRW0ldbG12X1txWFtfWmdzZW5vcWNxdGB3en55cnmDc4N+gXt7jIGCgHZieWRjbnNkUmxnZ29tcmlmaWFfXlxhamJsbHpvXFxiaWJtaXdtZ2xvYpamq52BgJ+llqqqnqenraOYiIGWqZmdoomapJyonYSMmo+GnJGFko2MjHSFeoiDb42FfpeTdHWGcpGDbn+LkoeGlI98e4GFl6SNf6WkjYCOiYSUdYKHk25si6iAgouTjYibnoiLkqqioJCAdJSXiH6BeZSvpH+CnXGPhnmTjoeBe3OpjXF9fXqYlpuEjXh7fX2Hk5WTi3eSmqGihHt/i22Nhlx6eXN7cWlufpOKcoB0go+Uk3GGhINmjX9fgoGMeHd0lXZwem9wiW6Fhl93aXiOZ4KDho+qnH90fZZpiYhvfXV7gnRsbGaMc3h7l3eEW2tXeY9pbndycW93eG9da4VuaWdWWV5WXGVqY1VgVF1RXm93eWtqdmRpamp1fHBxdHNhb3RidHuBeHV5gnV/gH+BeYuFgn57boBtZHluXlduZ2h1a3hqaWpkXGBaY2llbHF1blpbYmtkbGt5bWhsb2GOlbqpp4uho5umpJmknauhn4ODlqqRnZ+ImaaaqJmDgZyLfpaUh46KiYxygnyOfH6PhHuXjnRzhHCVhnx9kouGho+FeH6AhpijjHumn4qFj4+ElYKGjph3cYSqhY2RnI+Hnp2Hi5qnn6Crg4mNlZt/foqXraiQk6iReXGflIV9lXCAq4dxfpVxam98gZ+Lf5GNimdtXYSNjp2eoJBzl42Kc3Vsg3d0gVlyb4eRgn5/jGpdaWR7hYSJgGBpeXycfISNhHeCiIVqeo2JbGJxc4N3YHSNg4qRqJaHZ42Ogmx2ioFugop3bWNlY3mDepVaXGlnbnZbe3l3dG1zcoNmXG2Ka2tiWVhcWVhrcVteYFldXWVyfXp0b3Riampqe3xxenZ0ZG10aG17fnV6fXt5eoCAf2+GiYN7fXN/enN/aFRccmlsdnB1Z2xnZF1hWWpoa2pxcm1XW2VtbGdyeW9oam1gjIyrsqKQo6Ganp6YnZmooaB9gparjJ+ThpqikaWVf3uYhXySmYmIhoaKcn2AinaEi4KElopyb4BzmIaEfpODg4aKgnqAg4qan4+BpaCGeI6XiJWKi5yXhIN5rIGQl5iTiZ2choehqp6ioqSLh5ObnaOalquiqKiik52JmZF+epGQhqqAf5ORkpOcsaWalJ6OjLCRmISmjo6WnaGKkZ2EipOLbH2Pd3hmgoaRi32JnoSIjI+IiIGFhJF4fHt1nKSKiIygjIeWgICOg4F3cXWGhYB5iYiLkaeRhIeOh4KLj4p6g4iGjH90aoGDfHmZaXJoYHSKcX57d3ZvdnSBXV5vh2duX15ZWlxTZ3FVY1tbYGxndHt7cm5vY2pqaH97bXh+cGhvb2tmgHtygoB3f31/hXttg4yFfHp5fH16hHhOZHZqc25xe2VsZWJiYFtzZnBmcnFtVV1sdG1oeHpwZ2lrZY2Inrufl6OhmJWZmJSYpKCcen6XqY2djIWfnIuel314lYN7jpmJh4OEhm14gH9ygId+iJOEbWx+epeHhIOQfoCGhId8h4OMmp2ShqmdgnKKj4WSkYudkXyNe6mDjZGXlY6bloWFm6afopqehoOSmpmZkJmmoaaenpCXgpSNeX6KkIanfH2PkJGGmKqhnJKcjo2pjZGAno6KlZyghI+YgIiQhHB5h3J1YX+EkIh3jJmBhI+BhoV/hoSVbnp2dZSkjI2HnIaGj3WCjH5+c3N8ioV8eo6PhZSokIeEj4GCiYeHc4KFhoh5bWp9f3ttaGtsZ155f2d9e3Z1dnV7d1xgcH1udGBjWltdUWZsU2RaXWBqaHV5fnBsbGNrameAf2tyf2trdG53bYR5boaAdoKAfYV3cYKNh357e32Ae4KLYGl7a3VoaoNlamNgaVxjdWdvYnVtbFRicXllb3l6cmVqbW2Lip+4mqKkn5OSlpeLmp+enHp3m6SQm4mGpJSLmJp5eo6FfIqRg4yCgoJse394coCFfYqQfWtofYKXiYGIjnx+hYSHfI+Bj5ubkIimm39vioqLkoagoYqFjHyokIeOkZaSlpJ3jKOgoZ2Wm4CBkJqYk42ao6Kkm5iSnH+QiHuChpCJoYF+jY2PfJekoKCRmZCPpYyPgZySipSZnX+Tk3+IkIN1dYJxd2F+gY6Ic4qWfYmMcY1/g4aHj2h4cnqOmpORgZmAiYxzg4l9fnJ6fI2GfHuTjoSXppSMhpB7hIWFgnN/gISFeGRwen94eXBsamZefnNofHV2dHxzgGpeYHR3cHdkY1hdXlJpaFRkWF5gZ2l1eYFxZmpjbGdlf4BqbX1nbXBqfXeGemuLgXKBgX6BdXaCjYZ/fHuAgX1/j2pyg250aWKIaWxiX3FWdG9sbWB4aG1XanN2Y3R6enFia295iY2fs5Klpp2OkJiPhZyhmpt8daOfjZd/jKGKiJuWeHyGh36Ein6IgoB/cH57dHWChX6JkHdnY32Gl4qCio14fYCMg3mWgJWXlY2Vnpl9b4uBkJOFpZuHjImDppWEkoqVl5KRdpGdoaGYlJh6f4+Yl46Wmp2lnpqUlZ17komFeoiYj59/gouOjHOXop6gkZeOjqGMjIOYmISUl5p/mY59io6CeHJ+bntkgX2Lh3GHlICRgmuHg4KAi4ZmdnB9iJSajn6VeY2LfYKJfn1ygHmLh3uGkouMmaSXgoSMdoeDgH90eH+GgnNednd9c312ZmxlYX9pandzdHV9cXxjZGFzbnVybWFZX11aa2NSYldfX2dqdHmFcGJqYmtmaHyCa2h0aGxuaH98gnlsj4VxgIODf3R8g4yBgH56goN+fJBtdYl0dG1mimxqYWN1VoNpcG5geGdsYWp2cGZ4e3lxX3FshYWQna+Yp6mejo2Xh4Wfk5WXfHeom4qYeZaci4yZkHl8gYx9fYN7gIOAeHN4eXN9gIN/iIuAZF59i5WHf4WIdH1+iX9+mISWlJaMo6CWfnGGe5ORiqaPjI6KkqCRg5CPk5eRioGPl6CakpCSdICOkpSJnZ2ep5mZjpWXdZGSjG2ImpGbe4iJkIlvl52aopGUioudi4aBk52AlJSWiJqKfYuKgntxemt2bXx/jH9uhZODlXhwgoR+f4yBZXNqfYKYmIWAj3WSioV6iX93eIF+h4J+hY+HjZWlkXmFgnSIhnt+cXJ+hIFrYHl0eXB8bmFuY2V7Ym5vdnN4d3R0YXdgb2x1bnBdWl5dXWldT1xXYmBnbHJ6iGtfaWRpY2h3h21mbGhpbGeAfHp3bpCIc4CDhX10gYaJeoN9eoGEfXyOcnmLeHhubIhraF9pcWKHaHFvZXZnbWxhemhqfHt4cGF3bYuBmZqroaWpnouLkYaJnYuUlnx2rJiMlnyek5GXlIl3fnuKfXyAdnh/gHB0c3pvhX2BgIl+fGFcfo+Rh4CEhHJ6f4Z6j5GHkZGbkqSak4F8gXyNipKkiY2KjZaajIWQl5KVjYiIjJKdk4+MjW6EkI+RiZ6ZoqGYmIqXk3CMnIZoiZuQlXuJhZCKcJaalKGQkIiKmIyCf5KffZORlI2akHyLhol1c3VrcW51fYt1b4aRjpJydIB8goKKfmVybnp/m5V+hYp1koyCdYp7cIJ/goh+ho6Lho6Wq457iH1+ioR2fG5sfoKAYWZ3c3RuemJeb2FrdF5wanp5eW10cWV6Xm5sc21zWVldX2BpWk9WV2RiZXBxf4dlXWloZmJncY1uY2hoZWlogXp3dW+OhXOBgoN8doOJhXiFfHiEhnqAiXd/i3t7c3mEa2tfb2h0f2txb21xZ29rZXthbX95d3Bsd3eJf6OZo6ihp5uIi4qBjpyGkpp0f6iUko2GoIyWlJGBdHx2hXh4f3JzeoZscm94bYl2gICHbnFbWX6SjYiAgYF2dYB/f6CGj4qSnJegkpZ3iX6AjIicnoqPhpKXloWIk5iOlouKjY6MnYqOkYRtiYuPkYqclqGcmZaGmYlsiKaFaImfjJOAjYWMgXiTmJKdkI+IiJONf36QmX2SjpGOm5N9i4GFcHZwbG5vcXyHanODj5mLcniAdYKJhHpndHB3gpuQfYqFe5WTe3iKdXKLfIeOfIyIhYqPnKWJfIR2gYl+d3dsaH1/fltxcnFvb3daXnBgcGteb2p8enFubWptd2Bwb2txbllYYGBgbFdQU1llZWF0b4SCYV1rbGRiZmuSbmBmZl9naoF1cnJvi4B0f4OBeXaBi4B5hn94h4Z2g4V7h4t/fHeLf2pxY3xihXxvcGx0amhubHd3X3F+eXt0dXN/gn6llZutn6eXhYyDfpaVg46ddImek5KGi5qMlo6MenJ4dIJwcoR0cXWIbG9sdGyHdoN9f21uVVGBq5SHgniAdnKCeYGggpCBkpKYmpGYd5B6goySo5qTjoiUmJKEhZaYi5OLiY6PiJ2EkYt9couFiI+InJqfm5eWgZWAaomfimmJoomUhZKEinGDkZePmoyOi4uOjXd7k5F7kIyOk5iNfIl+gmx3am9sbG17gGJ6fpCXgnd6gniDjX16aHVtdoiXjICJh3yVknJ8hnJ4jnuMjnyKf4WOkZ+ghn18d4GKfHZvZ2l+f3Zddm5ta3ByVV1uYnJhX21ueXBocGZndHZpcWxhd2ZdVWVgX3FTUE5bZWNcd2+Ie15caHBhYmVmkWpfZ2RbZ29+b2xxc4p9dnyGgXV2f4x5fIaAeIeDc4aFfoyMhHx6lXhncmuDYId+b29re2BpbXSAdF5zfHiGeHRzhXx5oZCasZylj4OKf4KZiH+Jm36KmJKOhIiYjo+PhHd0d3OAcHCFdHBxg29qaXVtgm59fG11c1JOgt/JktaTfG90g3WDn4KRdpSQmJuPmHuTcoWQn6GTk5CJkpuThX2VlYeMjYeSjYmcf46BeHuNf4iMiZycnJuWlHqOeGmLlIpuiqWGlImYhIZjjJGYjZSJlouMiYtwepWKfI+Ji5OSinqHfX9tfGVzb2tte3pcgXqQkIF7fn+Aho97eml1a3SMkIuDh4Z+l41tgIBwgo6Ajol+hXyEkZabnIx9d3iCjndya2RufIBpZ3NuZ2lzbFNdbmRwWV9scXdna2tiZ3l0cHBkYHhhYFVrX150T01LX2ZiW3dwiXRcW2R1YGJlZY5jYGZiWGlzc21rcXaLfHR5h4J2d36Lc4CHf3qJf3KJh4GQioh9fpl2ZXNufGWHfm5va39ZbG55enJgdnp7jXZydol2eZ+MnK+boJCChHiHlH57iJuGhJ6QjoWMl4STj4iBdXdweXFvg3Btbn5yY2R3cHxuenxqaGxipJrB3K7vonNsdoN1hKGEkW6Vj5Wfk5qAkXCFi6OXiY6VipCdloOAlI+FiI+AkoqKl3+He3Z/iniGhY2bm5eZkJB2i3hwiYuOf42mhpOLnoaGXouUl4mOiI2KioSJbHyXg36JhoqRkIZ2h35+bH1keHVqb3p0WIl7koiGen9/gIaNf3pndGqBio+LhISBjZiHbYN3cImSg5KGgIR8gZKXlJuRdXR4h4t0cm9kcnZ/X3Jsb2FodGZSYHBna1VfbnN5YXJjYGl+cXNuW2NzYmNWblpcd0xMS2NmYF11coltW1xkeF5gZGWEX2NjXlhpcmtua3J3i31zd4SBeXh8iXGDhX19iHt0i4mHlYaNf36Yc2d1cXlti3puc3CAV3F6dnlxZHZ5hoxodoCJcYCdiJmonKOShH1wi5N3eImbg4SfjI58lo1/moiFfHN3cHNqb4Fsam18dF5gd3Z7cHR6Z2BlfOvatcnD3IlzbHSBdoqaiIxpl4+Pm5SSgYhwhYigjYWLlYqMl5N7jZKHgoiPepGLho+CgHd4g4Ryh4KSm5aTmIeMdoiAcoeEjImcpIWWjqCEimGDlY+FiIWIjIaAh2h9lIB+g4WKjo+Ccod/gHJ3aHZyaXV4bVqNfZODhn2Ag4GEi4N3YnVtioKRjIN/gJSTf3CDbXqIkYiUhn2Df4GTlJGYiW5xeYuEdGpvaW91fl1yaG1caXRfUWRxaGZTX3F2dGBwYF1ohHFzaldnaWRpWG1XW3RMSktlZl5hcXOFaVtcZXhdXmRnemBkX11Za25lbmpzd4p+c3OCf3t2eohzhYR8f4d2doqGj5iBjYJ7k3Zsd3Z5eJN0bnd6fFh5hnGAbmd4dpGCZHaGhXCKl4aaoZuiioZzbpGKcnaNmnyJmYiJfJ9/hJp/gnlyc25vZHJ+aWZsd3dbX3h7enFxf2lhZ2F/1baOkaZ4bnF3e3CSkIyGapiNiJqQi4V6aIeLmYaBkpCGhpeNfIyMgICJjXuQjX6JhXp1e4N8cYaAlZmNkpSCiXaEiHiGg42VoKGIl5GhgIlhf5SHhIeDiIx/f4JmfZGAf4CDjI+Qfm2DfYN1bG13dXR4dmtjjoKPgYV/fISAhYl/cGB0coZ9kI6DfYCSintyhWd7hYyJjoV9hoCBlZCRlIVub3iLfnRsbWhod3lfZ2lpWGt0WVJocmliUGJyeG1iZV5aaoRudGNcaGBlbV9vVFpuTUdOZmRbZm1xgGtaW2JyX1xjbHZkZV1dWmxsYmxqc3aGf3Fvf3x9dHiGeIWDfYCHdXiJgZKVfImGdomBb3h5eoSSb216gHZeg390gWxoenOUc2dyh3xxkpKEmp+boIeGdXWTfm11kpV9h5CDio2afYyadn53cm9samF0fGdiaXV5WmB3e3ltcX5lZGhoV52PX3Jzl7zEhHVxlIiPfXGWi4abkouHcmmIjpWAe5WLgYSai3yKhXx7iYt/lIh1iYZ2d36BcnWFgZ2UhZSPhIRygYp3hn6Mm5+aiJWPnoGJZn6Tgn+FgoiIcYF9Zn6MfHl/gIiMj31pgX6EdmdweXh0eHRsao+Gi4KLgHmCgYWEgWxfc3l7fo6LhnyDkIJ/c4NqeoWJjYiGeYV+gpmOkY1+bm16iHx1c21mZXpzYVtwYlducVNTbXJoYU5ndXhmYF5dWW+Bb3RaZmJea25gcE9ZalFEU2ZgWWptbXxuWVtdbGJaYm92ZGdcXWBraWNranN2gYNxbn98gHR1g3qDg32BhXZ+iIGWkHiEinSBiHJ4eX6NkG9veoBxaYF4en5tbHt1lWpqd4RzbJONhp+Zn5mFh259i3Vpd5aNfoGKgpSXinqQlm97dHFramRgc3toYGVxelpgcnx5Z3F5YGVlj7Gyd0tiWqXZ0JZxepCKj3d9k4qEmJCLhW5rhZGRenmShoGEmIp8hn93d4mKhJaAb4uIcXV+e2p5hYOkkIOTjYSAcICEeIZ7iJ6blo2VkZaFiHB7k4J9goKIgm2BdmiAhXhygIGDioh8ZX5/hXZkcXOAaXlxcHWZjoaDin13eYGFeoNrXHJ/c4KJhop+h4p8iXOCbnKGiJGHh3SGe4KajY6FeW5ufYN+dXljZWd6bl1YdlpXcGtOV3FyZmBLbHd0YV5cW1p1fnNwWGdeZ2pyYG9OV2dSP1hmXlpvamd5cVtaWGplWWNweF9nXF5lbGdma2lxd3+Hb2x/foB1cIJ7gIJ/gn92gYSIl4lxgo1xe4Z8enmElIx1anl+a29+dH98b3J7epNvboF+eGeSi4KhmZyRgoVmhoJvZ3mUiH1+hIKYioF8jo1oeHNra2ZfYW94bV9ib3hcZGuCeWFxdV9lZdTqvYsyOj6Ljn9xeYWHjY11gpaMfpKNi35ta4SMjHV9j3+FgZSIfIJ3bnaHhIOXd26IhWx1e3VmeYKDpouCjouEfm6BdniFfImfko+Sk5SOjId/e5KGd36DjIJrf3FogH55bnx8gouEd2J6hYJyZHJpfm51cnWCnIyBgIaAdHZ/gXSCcFxugHV5jISLfIiBfol5e3JtioWShY10g3qAmIyLgHVtanaAf3RzW2dndW5XVnxTWW9kTFpycmVbSXF4b1xbW1lddX91aVpiW2hmb2RqTVdlUD1dZVxddWVgdG9aWVVuY1lkcXlaaF1gZ21naWtpcHd9jmxpgoR/eW6AfH2Bf4J6dYKBjZOEcIGLbnh+gHt7iJOJf2h6fWpze3KGenN2fX6MeXiEfXxri42Dm56Wi4GAbIx9amh+jYt6fX6DlIJ+fYqIa3VxZ2hiW2Jncm5fYWtzYGhwiHlic3NeY2SboI9uXTZar7V0aYCIfJGGdYWVhXOOiol2b2yEgoZ0eYl4iXySh3l+cmd2iX5+mG9xh39pdnluZnmHhKSHgIeMin9vgHeCg4CPnImElpOZioyFiXyQiHB6fYR7aH5saoB7emp7d4KIgXJgd4F+cmRyZ3aDbnV8hpaSgn2DgXB4enx1gG1ZcIB3dY2Dh3iIdoSJfHl0b4uCkoKHc4B+f5SJinxvbmltgYF0bVtlZHFvUFp6TltuW09bcm9kVUtzeGlXWVpaYXGBdWFeXWBnZGlpZk5ZZ01AYGNbYHVgXXVsV1dTdGBaZG9yV2peYmhrZ21saXB3fJJraISKfXxvfn57gYCBeneAf4qLg3F8h29yeIN/e4mMj4NpfXttd3h2i3Z8eH+Chn+Dfn16bYSLh5ijjISDe3WKeGpsg4eQeH16gpGAgH6Lg3BycGNmXllnX3BvX2BncGZqbol0YXRvW2FkanV6gL+cpqTIuHGEgnKSe3eFkoJzkIuHcnJvg3uDc3SHdIh3k4h5eXBjd4d6gJNpcoR3Z3d1Y2p8goedgYB/jo9+c4B1h3uClZKFe5iPlpCIgol7iYlreHl+dGd6aGt/eXRpeneAg31oYHiIfWtrdGh8gWl2goySlX98f4BxfHd8dIBjVnh+c3SLhYJ9hHKIinl5cnGFg4+AgHp/fneQhoR3anFobIeBcW9cZmBxbElkdUtdbFRTWXJuYlFPdHhhUlhYXWFwgnRdYlxpZWVka2RQW3BJQ2NgW2NvXV14Z1RXVnZeW2ZuaFZrXmFqZ2Vubmlwd3qSbWmIjHl9cnt+eYKBgXx2fYOIhoNwd4RybneCgn6Ii5N/cIB7eHl6gYx0gnh/gYGChHqAdW9+ioubnod9hXl3hXpndIWLkHl+f3uIhYR3kIBncG5fZFxYZVlscmFgYHBsa2iJbmBzaFleY25/d6naqceGh7JxiHdvjHR6hY1/eZKJf3RzdH13f3Bxf22EdJOFeHRrYHqCeYmPZnKEcGh1blttfYCQk3+AeJGTfnl8bop4g5ONhneYjJOQiIaFfH+FbHR2fmxndmRte3Ztand3f398YWJ4hnppdXVjfnxodYePjZZ9doF3cYB7fW6BWld1f3B2hYh/gHptiod1eWx2goSFf31+en10jIJ+dGh0ZW6Kg2xyWWhdc2RGbW1LWmBXVlV3bWJQUnR2WFBWWF5gcoRwXmFjbWVkXm9jVFxxRkJlXl1lZ11bemJRVlx0W1tna2BWal9gb2Zma3BocHZ4jnRrjo11f3Z4fXeBhIF7dH2DiIeDb3KAdHF1foWBiY2KenZ/eIN7fIaHd4d8fYF9hIB7fnJ1eYuNoIyIeYh2dIJ4Xn2Fl4t4hoN0hYaEeIp7Ym5sW2JbW2FWaXNiYFtnbnBmh3JhcWVXXGJrf3zKzoe5oWptbYpscYNxe4OJfnqQhHl4c3h1dHtqbHZjhHWRgnZvZl99gnqMimVygmtqcWNYbHqFm4iCgXKWlXd/fW+Kc4WNjop0mZCSiYaLg3t5fXBwb3xmZ3FhbXhxamxxeH19el1leoB4anZ4ZoN3aHSIjI6WfnOJa29+gnlvfV5Zc39udIGLfIJvcIqAcndpeIGCgYN4f3N7dYh9e3Nnc2Fui4BrcFZpXHZbR21qTVZVXVNVe2thT1R1clBRVFdeY3WGaV1gbGpmY1pvYVhib0dBZ1xgZV5cVntdTlVlcFlbamhdV2dgX3Jma2dxZ3Bzd4Z4bpWLdH96eH55g4h/dXJ/h4WOg3BwfHh3dnqFhYeMhnl7f3SLfX2GhIOHf35+fYZ+fHl1eHeRk59+i3yKbXV/eGOChpWGc5GKb4WFgXuEdWNuallfW1xdVGdzZGBYY3FyZ4ByYmtkVlpfan94vq57n7duYXOFaHN6cXiBhXp9i353d3J2b3t2ZWpvYYd1joBzamJefnl5i4RmcX9oa2taVm93iaOBhX9wmZNygXp2hG+DhJSKdZeKjomFiYV9eHRxbmh4X2psYG12amdqbHl3enZaZ318eWZzfm2FdWV1ho6Gl4BxjWhre4R1bnZjXXF9bHV9jHuCZ3aIfm9yaXeAeoCBdH5te3yDe3hxZmxhbYl9a2xVaV92VUppak5STmdMWHtoYU5VdWtMUFRVX2d2hGdeYXFoZ2JYaV1ca2dKRGpZYmNWWVV5WU1WbWpZXWtkXFlkYl50ZmxkcWdycHWBd3GZhnZ/fnd/fIWHfXVzgoiAlYNuc3l7enRzhIaJiYN4gX11j358hYqNg4KEe36Kg3t3fHd3mpyXeoiChml2fHtsg4OSgHKOgXGGgn+DgHBmbGdYXVtcW1NkcGReV2JydWl1b2VlYldbW2h/cG9ygHOJZGR5fWlzdXNygYN3gIN4dnJ1bWp6cWFna2eGc42DbWZdX31we4l/aW14Z2pkVVdyb4ymfIR7dpaRdH10fnxvfn2TiHibfYmHg4eDfXVwcWxndFxsZ15sdGRnZml6b3tyWWeBd3VocIF4gndid4aLfJWCb41rbnuDcmd0ZmFuemhzeIt7fmN3hHdrbHJ1fHJ7e3V/aH+AgHl3b2RmYm2Fe2xqVWhhb1JKaGpPS05vR156ZmFNVXRkSk9TV2Frd39mXWd0aWZgV2RXYnBcS0tqV2NhVVRVclZLWHVkWl9rYFtaY2RfdmdtYnBpdG9yf3V0mYJ3f4B4gH+GhHp8dYKEfpeFbnJ0fHp1cYSFj4GAeot2c5B/fIGVjYCFhH19jIZ6foB3e6OlinmHhYNrdHt6dYKAi3puhHN5hH2Cg3ZvamllVl1bWlpTYm5kW1hhc3tqaG1pYGJYXlppf2lrcIBnbGBoeXhqcnNzbYOAen98dXRtemdpeWpfZW5ogXaPhGdlWGJ3an6He29qcGdmXVRYb2eNp3aAenyQjnp2cYBxdXh8k4J6l3aGhICGiHZqcnVnZ25bbGRdbXJfaGFqeWh7bFtug3J0anCBfnp4YXeGhXmQhXSJcnB6gXNjcmpdcXhlcnSIfHljdIFxZ2p5dXNteXh2eWWEfIB5d3FkZGNte3xqalRnYWVTSmtmT0dRakVheGZhTVNyXUpOVVllbHh8Zl9ucWplXVZhVW5uVkpTZ1dlXVhNVWtUSVt5X1tfal1dWmJlX3lobGFvb3ZucHh1eph+d3+BeYCAh4Z6eHmDfoGTg3F0dH56dnSEiJF9gXyRa3KVgHuDn4V+h32AfoaCgIp7d4Srnn96h4eCanKAeXWAfoF0boZufYBzioBqcG5kZFlfWllaVGJqZ1taX3WCaV5tbFxhV1tba4FlcXR9aWlca3Z1Z3N2cWyEe318eHVybHlmaXdmXWRzaHp3koFjY1RlcGiChXh4Z2lqYVdWWWdjjqdvfneAi457cXJ/aXtxfY9+eJBzhX6AgIZuZHZyZGdnXGphXW9vW2hfbXVlemhddIBvcmtyfH51dmJ1hox7iYiBgXlzdYB2YnFuW3J0Y3FzhXx1ZXOAbWFte3Branx6dnRnh3d7enZxZWJkbXJ9aWpTZ11cVEtxYlBGVmBHY3ZmYUtTb1hLTVhYaGt2e2VlbnFnZFtXXVh3ZVRKXGJXZ1dZSFdkT0dheFpdX2xaXlxiY15+aWpgb3R4bXBvdoOYenKAgHx/iYyGfXV1hXmHjHxzdXWBeXp6gYyOfH6FiWlzloF6ipx+foV6gXt/fYaJc3GPrYt7e4aPfGVxh3lzfHp1cm6FbHt+bI96Y3BvYmVeZVZZWVdjZmtfXVxzhWhYcW5bXlhaW2t6YnB3dmxhWWxzc2d0dW9sg3h+f3h2bW5zZGh0ZVtndWZ2dpF6X11SZmdrg4J0fmJkalxUV11iY46kaXhzg4aReW5xfGp6b3+JfnaKdIJ5fXmAaWR2bWBmX15pX110a1lmXW9vYnplXHd8a25vcHh5dHVlc4STgIiDiXt3cHN+dGN4ZVxxcWJxcoJ8dGdzgWVfbndqZWh6fXVvcIN2dH1zcmJfZm1ufGRoU2ZXWFNNdl5QSVlXSGJ0Y2FJVG1TSk5aV2pscnxjbW1zY2JaWlthd1xTS2NdV2hTVkZYX01GaXVYXmBsW1tfYWJdhGloYW54eW1wa3aBkHltgn6AgZOIhIF2dIh0jIZ0cXZ2gXh9fX6MkH9+lH5wd5WDfZmSeYCAeHp9f3SIhHRxmaB6en6HlHdjdId4cnd0a3Rvfmt4fHCRc15wb2BnYmxUWlpXaGNtZlxccYllU3JuW1lYV19rdmRpdWppXVltc3Brc3NzaYR8fn56dm5ta2RpcGNbanJkdHaOc1tWU2VhcoB/coJdYmNdU1pgXGORn2VxcYWEknVsbHtvcHJ9f35zgniBdHt6emRldWddYllgZ1tedmhXYl1waWF3YVt8dmlqcm94dHN1aXGCloSHf4V3dGtxfm9neFhdbG5jcnOAenRncH5cYHByYmBrc39tbnZ/c3F4a3BhXGVsbHpgZlJlVFdRT3VaUU9YUUhjc2FgR1ZqUUlRWlZra2t9Zm5vcmJbWlhZbHFXUlBmVlZoU1RFWVtOSHF0WF9jbGJYYGBgXYtqY2RtenhscGl1eYd7a4N9gISafIOEeXyIbo+Hcm52enx0goJ8i4+Cg5h0eIGThYGeiXWBgIJ0f4JxiIN2cKGWc3mFioZ6ZHaKbm56bmZ4cHlrcnZzjWtedW9hZ2VrUl1bVWdhbGtaXHGMZE9vblxWV1RmaXNoYnRlZFxYbnRsb3V0eGqGfH97h3aPc2Nka25gXG5tY3N4h2taVFZjZHh9fXGGXWRfY1RaX1lilZVjbXCDhYp0a2l8cGd1eXZ+bXt1dnB7f3VfZnNjW11WYWNYYXRlVV9gbWRhcV1dfnBoaXRxdHF1d2tthZSCiX2HcnNncH9ydHBUXGdrZnJ0gHZ0Y213VmNybFtfcGd+Zm54fnN0c2ptYVpkaWp3XmVTY1RVUFNsVlBWU1BHZHJfYUZYaU9JWFRXbmllfWpseGxiV11VW3RkU1JXaFFYZlRTR1lZT013dlpfZWtpWWFgXV6ObmJma3l2bm9pdnaAf2yDgH2HmHuAh4CJf2uTiHJmdIB7dYCDfYmOf4yTcnyKkYSHn4Z7f4aNdIGGc36Ddm6ki3KAjIp2dmx5i2Bke3BmeXN4bG1yd4NnZHxtY2ZnaFNfXlVnX2tvW15ujWhOaW1gVVZTbmZza2V4ZWRcWG9zbHF6d3Jsh3t/dpt6eWthZWxtXmBvamVxeH5nWlZYYGx4fHtwhF9jXmdWWF9XY5uIYmtwgYd9eGxsem5deHRufGt2dG9wfIFzWGpuX1lcVWFiV2RwYlNfYmliYmxaYX5sZmx0dm9td3dsaYaNgIp7iW5yZnJ+bnRuZFthaWlwdIF0c19pbVNlcWVWY29kfGRzeH13bHBta2BZYWZndFxkVWBVUk5XZFFPW05PSGRvXGJHWWlNSl9LWW1kYHlpbn5lYFVfVF11XFNSYGZOXGBVUklbWFBZdHVdX2VraFhiYFpejXFjZ2p4cXNuaHZ0e4RygoN6iI5+fImIjXlukIl0a3OBdH9/iIWHkYSWj3l9jI+HkZuEgHyNhXOAgXN0eXNvk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fn5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKSkpKSkpKSkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY2NjY2Njo2NjY2NjY2NjY2NjY6Oj4+Pj46OjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpOTk5OTk5OTkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6OjY2MjIyMjIyNjY2NjY2NjY2Njo6Ojo6Pj4+Ojo6NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyQPi4xMTExL2+HhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmOAvru7u7u9s21mZ2dnZ2dtbm5ubm9ySiwwMC8vLEmFg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjI8tGh0dHRwaaIWCgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fW37IxMTExMa7Z15fX19fX2VnZ2dnaGs9Gh0dHBwYO4OBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkYmIiIiIiIeNkJCQkJCQjIeHh4eHh4mSk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJjJKRkZGRkZCJiImJiYmJioqKioqKioaDg4OCgoKEioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95enp7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRk5OTk5OOkpKRiYeOipCSk4+IjY6OjoWKkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6Mi4uLi4uLi42NjY6Ojo6NjY2NjY2NjY6OjY2NjYyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCRioaOiYmOiImQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJGKhIuNiZCJi4+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkI+NiIyIj4eNj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4aJjIiNho+Pj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiY2Ni42Ljo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn19f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWFhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/f4B/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn+Af35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhoaFhoWEhISFhYaGhYWFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Qjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9+f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX1+fX9+f39+fn5/fn99fn9/fn5+fX9/f4CAgIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f39+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f4B/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX1+fn5+fX5/f35/f39/f4CAf4B/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39/fn+AgICAf3+AgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dXR2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f39+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2loZ21namdoZWhnY2NiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk9PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+f39/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent5dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+AgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUlFRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3ent8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9PT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTU1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgIB/gWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09OTE9STllwcHJ3eHd3dHR0d3p8fn1+fn5+fn5+fn5/f4CBgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT1BOUE9QYHBwcnh4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gH+AgIFzUFBOTlBNSktQUlBOUUNEQkFGUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUJBQEJBPzs+PD4/Pzw4OTk7OzpAOjs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnd4eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYGCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ojs4ODo4Nzo8OTc4Ozs+PTs7Ojg6QEBCQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdXN1c3F0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7PD9AQUJAPTw5PD08OTc5Ojo5ODk6Ojc4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklOSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+Af4CAgICBf4CBf4GBgYBWTE5QUE5SUVBQUVFOOD0/PTw6PT5BQEE/Pj5APz49Ozw8Pj89PD07Ojw9PT08PDw8Ozw6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV1dXN1eHl5fH1+fn5+fn5+f4B/foCAgH9/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQj89P0NDQ0A+PD0/QD8/PTs+PT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VEPz07PEA+Ojs6Ojk3Ojw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFBQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fX1+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz9BQUFCQUA9PD07Pj46Ojo8Ojg5ODg6Oz1APzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkZISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dnd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFAO0JDQkNAPz8/QD0/QD48PkA/PT09Pz09PkNEPzs8PT5APT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxwcHBxdHV2eXx8fXx8fn59fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQkRDREE/QEBAPz1APjw9Pz9AQEBDQEA/QEA+PTw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JCQ0BCRERCREVBQj5BQkJBQkA/PUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHx8fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEFAPjs+PD89PDo+PT9CQkVAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHRUVGRkZKTk1LSklHR0hLTEpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRWVvcHFxdHZ1eHt8e3x8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBERUQ/PEFDREI/PkE/QURFRENXdYaJin5YR0hKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm9wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gIGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRklISUdISElHRkJERkREQ0FVdIeJh4eGiIJXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0dKSktMTExLTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent+fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4GAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLS0tKS01KS0hIRkZHRkVQbISHhoaGh4eIh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz8/REZHREVHSUtJSUdISUdJSUlKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N0dnh5e3t7fHx9f359fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tLS0tLTUxLTUxJRkpWbIGGhYSEhoaGh4iGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkVEQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVIR0lIS0xPTk5RTlFecoGFhISFhYaHiIiIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7PDw+QTs5OTk9PT47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BCRkhLSExLTlRne4SEg4KDhIaJiouMi4qJiouMiVQ6ODY1Njc2NjY0Njc2MzQ2ODo4NzY1NjU2Nzc3Nzg6Nzc4ODo7NzY4ODk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn9+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSEVCQDU3ODg9Oj1EQkRGRkRWeISEgoKDgoaJioqJiYqKioqLiYqKgUg2NzY0Njg4NzQ1Nzg0Njc3OTk3NzY3NjU6Ojs6Ojw4OTk5OTg3Nzo6Ojg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT1BRV2txcnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBQDw6NTc5ODk3OkE5PEQ/UH2Eg4OEhISGiYqKiIeIiImKioyKiYmMej46ODg7PD0+OTo7PDg5Ozk6Ozo6OTs6Oj49PT87Ozw9Oj48Ojw7PDw9PDo6PDg6Ojs6OTk5PD88PUFCRElJTEtKS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj87Ozw6ODk5ODk5OTk6Pj0/P0N2hIOEhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVCQUFCPkBDQUA/PT4+QD8/P0A/QD09P0I/QUE/QT89QUFAPz9BPD48Ozo7Ojk7Pz07Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUJBR0pOT0xJR0s6ODo7OTo6PDw6Ojo8Oz0+QD89YYWDhISFhIaJiYiHhoaGh4iJiouLioqKi4mLXj5ER0lLSkpGR0dERkhHRUNBQENFQ0NAQkNCP0BESEVDRURFRUFGRUZERkZEQEI+PUA+PT9APj8/Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3OT06PDs+PT4+Oz48Pz9DPkp+g4SFhoaGiImIiIeGhoaHiYqKi4yNjIyLioqHV0dMTE1LTklJS0hJSkpJRkRERkdGRENGR0VCSElLR0hHRkdHRUtKTElKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHZ3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgH9/gIB/T0E+PT9ETEtAQkJBOTc7Pjs8Oj0/Pj88Pz5CQUU/aISChYWHiIiJiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlKSEtHRUdISElFRUlHRkVMTE1JSkdHSElKTk1PTUxOS0hHR0dFRUNGRkZGREVISEZDQT9ATG1wdHV2eHl5eXx8fH19fn5/fn59fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw6Ozw6PT88PT0/QENCSFN+g4SEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMTExJSEhGSkpFSkhHS0pJSkhIR0tMTkxMSEhJSk1QTk9OTU9LSUdJSkhJRElISEZGR0dJR0NCQUNVb3F1d3h6e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH+Af39/gH+AgICAgICAgICAgH9/f1REQUFCR0dCPzg/QDg6Ozc8PTo8Pzw9PkBCQ0NMbYSDhISFhYaHiIiIiIiHhoiIiIiJiYyMi4yMjIuLi4teUlJQTU5NS0pHRkNIS0dMSkZLT0xLSkpMTUxPUE5ISUtMT1FRUFFPT0pJSkpNS0xGR0hHRkdJRkVFQkBCQlxwcnd4eXp5eXl7ent8fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgIB/f39/VUVDRUVHR0VEOz9BOz08OD89PT5ARUQ+QkRDRkp0hoODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtLRUZGS09OT1dWUVBPUlNSTVNUT01TTFBTVVdSU1JQTEpNTU1MTkdHSkZGSEpEREVFQkRDY3F1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkVHR0dHSEY+QEI9Pz08QT9BQURUS0JISUZJS3iGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBLOztRU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FQTlJQUFFRS0tLR0hKSEVGSUlJSElqc3Z5eXp5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0ZGRT8/QUBFQUNGRENES1ZQSlBQTlBQeYaFh4aFhoeIiIiIiIiIiIiIiIiIiJScjIqKjH1hiouLh2xbZFU6WFhYU1E/QFZVWVxkYFZZYnJeXVZdWlZFUVlaXFlfVFlnUlVWWFRUVlNPT01LTEpJSUxNS09NVHB0dnh5eHh6eXp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH5/fn5+VkpKSUhHRkREQkE/SExJTVBLSUpPU1JRVFZVVlR1hYSFhYWFhoeIh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JXVlRaWnWDWVV9kGFcWF1eV0lWXl5bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJidHN2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktKSUlGQkRAQTpPUVFXWFBQUFFSU1JWV1dXV2yBgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaWlhcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm9zdHd2dnR3eHh7e3x9fX1+f35+fX59fX1/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpaUlNRT1FSUVVSVVNWXnV4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlVTVF5aWFdXV3prWFpcXF5TUFBPSU5PV1ZYWlpkcXR3dnR0dnh5eXt7fH19fX5/fX19fn19fn9/f3+AgH9/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU09PUU9RVlFTUlJUY2R2gIOCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUVFOS1JVUk1PWVFNTlFTVVVNUVNSUE5MS0hDSUdSU1RZXW1ydnd1dHR3e3p6e3t9fH19fX59fX1+fX5/f39/gIB/fX1+fn5/f4CAfnt2c3d9fn5kdX1pcXRgZF1dW1lVUUxITElhbJJ0UFFTTVFSUFNbUlNSUVJVVWJze3x+gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5CQkNDQT9EUENDQEM+QkhHVkBITk1HXWlRSEdPRkRFRkhHSEJDSEdISkdEQUFDQE5QTVJkdHV2dXR0dnl8e3t7e319fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUlJQVVlTVVFRVFJPVmBrbHN2ent4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz4+Ojo+QD8+Pj5qUEthRUZISUVCP0dMTUdNUVVKQkU/Pjw9PD09Pz0/QUNCPz48PUI+SU1GVW91dXZzdHZ4e3x7fXt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKT1BOS0xRUlFUVlVXUVFXVlBYW2JdYWdtbWxuamhgbnJpbWxxdXt6fXt4enx8eHd4ZEJAQEE8OkJDQUFDQVtcT3tOT09OS0xNT09QTEtMV05JR0FBPDk3NzU5OT07Ozs4OTg5PztCRz5cdHV2dnV2d3l8fHx9fHx9fX59fH19fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT09eXFpJR09RUU9NUFFOUVJUVlhTUllUTllaW1dZXF9eX2VfXV5xd2teYGdrd29vbGpvbW5sZmJZR0ZGSEJBRkhFRUZDTFFPYVdSWFFQU1NSVVtPT1FWUE1JREY+OTk2NTg3OTc5OjM2NTc5NTxCPWZ0dXd4d3p5e319fHx7fH1+fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LU1RTUFFVT0xSU1RXWFNUWFFMWFlZVlhYVlhZXVdYWGhza11WYHRrYWFfXWRgX15ZVVBNT05MSUdKS0lIRkNQT1NaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1OTlHbnJ1eXl6e3t9fX19fHt9fH1+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BXVlZTVFZPT1VWV1hZU1VUTEtTVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdTW2ZKTFBSUk9NTU5NTUxKRlBQVVlTVE9KTk9VU1RcVlJVU1JOTUxJSEhGPz49Ojc4NzY1OTk2NzY2NVhxcXR4enp7fH19fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1RTVlRSWFdZWVlSVU9JR09QT09NUkpPUE9PTk5PVExNSVBQU1RVMjxYTUlAUT1jYFFTUVBNUFBPTk5NUE5UUlBSTElMS09SUFFSUlRRUk9MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVlFTRkZBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjRAPmpvYVJSUUBHVFFPUFBRTlFPUE9MSkxMUFBOTVBRUU5RT0pMTU1LR0VFQ0I7PT08OT1HNjY3NkVucXV3ent7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVVlZVlFRUU9APjs9P0BCQUNAQkVEQUBHSEdIRkZISk1MREdDT1JDOERNU11nU1FTQUdVUE9RUVBNTU5MSkxLTE5PT1FMT05NSUxLSUtLTEtHRkZFRDxBQT47QEU7PDg5VHJzdXl7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E/PT1BQEI9PUVIRkRGRklHSkpARkFBQEZHRElPSFFSYVxRUFJPU05PT0xMT01LTUxNT05bVktNUU9HSUhDSUtMTEtGRkZFP0JDPj1CRz9CP0BkcnV3e3p7e3x7enp3fHh5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj87PkFAQD5BRUpFQ0hHSUdJRUJCPz48QkBAR0pFTU9iZVBNT01XS0xOS0xNTUxMS05OU2RNSkxSSUlJRkJKS0xNTkpHSUZCQkJAP0VGRUhETG9wdnp5eXt7enx6d3N4dXh8fHl6bnFxbW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xMSU1QTVBPSEtFP0I9OTk6Oj9CPzxBQkFBREVHS0ZESUlHR0hDQz9CPj9AQD1DRURMTVFUTEpJTVRGSUlKTElKS0lJTE1PUFFQS0dDS0hDQ0tLTE5PTklKSUdDQ0NESUpNTElac254eXh6ent5fHZycHVydHl5dnhqcW9rbGxudHRtc3Z7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxanFoZXFIS0NGR0hHSktJSkxER0I8Pj06Ojo7QUI/PUJCQ0NIRUpMSkVJSUZHSENDO0FAQj5AP0JERElNT0dISkdIS0RISUtNSEpMSElKTEpNXVJISUROR0JFTExOTlBOS01KS0ZHR0pNTlJOTWNuand2d3t5e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnp0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGhlcEZKQ0ZFRkRFRUZFR0NDQD08PTo7OjtBREA/QkNFRUlGSkpMRklJR0ZGREI6QUNDPj9DQ0NFR0tNSEpOSERIRUlMTk1ISUxHRkZJSUxOS0lIRU9JQ0dOTU9NUE5OT01LSUhJT1NRUk5TZ2dmcm9zeHZ7enxsaGpvZWtwbXNxZm1saGlrbHRtb3V0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZl9wR0pDRUVEQkJBRUBEQj4/Pjs7Oz47PT9EQj9BQ0ZHS0dKSUxIR0dHRkVDPz1ERUI+QUNCQ0VHSElHTVBJRUZHS05PS0ZISUZFQ0RJSkhLSUdIUEtESk5MUU5PTk9QT0pKSU1SVVVSUFhlYWFtZnByb3J5emdlaGhjaWxmcWxmbG1naWtsc21wd3V0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VERkJBQEFEPEJBPkE9Ojo9Pzs+P0FCP0BCRUdKRkpHSUdGRkZEQ0JBQUVGQ0JCQkRFRUdHSEZMUExITkpKTEtJRkhFRkVDQ0hJSEtKR0tSTkNPT05RUE9PTk9QS0tLUFVXVlZUWWBfXWlgbmluaHJzYmVmZmRoaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNxc2trc01HR0VGQUJAREU8QUFAQzw4Oj0+OkA9QENAQEFERklFSEZGSEZFRURDRUJESUZDR0VBRUdFRkZHRUlNS0hRTUpLSEhJRUZISEVDSUlJS01LUFNORFJTUlFTTlBNT1BNTE5TV1ZYWVZYXlpdZGBpY2ppZ2tfZGVmY2hnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hCQkJFRTxAQ0JEPDc6Pj47PjtBQj4/P0NFR0RGRERHRUNFQ0RGRkZKRUVJR0JHSEZHRkVDRkpKR01LTEtISktGSUhKSEVLS0xMTk9SVE9IVFVUUVRQUk1OUU9NUVdaVlpZV1peWlhhYGFgXmhlY2BkZWdnamhoamdobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9zc3lOSEhHSURCQ0hFPUBFQkQ9ODo+Pj08PEJCPUA+QUJGQ0VDQ0dDQ0RERkdHR0lGSEpIQ0lIR0lHRkRIS0lHS0hNS0pLTEhLSk1LSU5MT05PUlVWT0xWVlRRVFJSTE9RUE9UWlpZXFpaXF9fXV9jX1xiZGxjYGRnaHKFaGdqZmpubnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUxJSkhKRkJER0U9QUdEREA6PD5APz4/Q0I8QD5BQUdDRURDSERFREZGR0hGSEdJS0pFSkhISkhGRkxISEhKR0xLTExMSU1KTU5NT0xQUFJVVldPS1ZWVVNTUlFMT1JSUVZbW11eW11eYGBhYGJmXWRgZmdgZWlqZHNzZmpoZmxwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3c2d0cmtxcmtyd3B3SkpLSUtHQkVERTxBRkREQjs/P0FAQEFEQUBCPkFDSEJFREZHRUhFRkVJSEZJSEpMSEhKSklLSkZKS0hJS0pHS0tMTElJTUtNTk5PTE9RUlVXVk1OVFZVU1JRUE1OVFNSV1teXl9dXmBgYWJiYGRkZWJkaWJkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV1c3Bzd3R1dXd2dXV1ZnFza3BxanJ2cHdKTExLTEdDQ0FFPEBFRURDPUFBQ0JCQ0VBQ0RBQUVHQ0dHSEZFSUZDR0pHR0pGSUxISUpNSk1MR0tJSExLTlFLUlBMUkxKTU1OUFBQVU9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5hY19hZmNhYmhuaGJpaGhteHZtaGlub3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnNxcXV2dXN3eXd1dHVjbXRrb3BqcXRxd0xNTExMR0RBQEQ+PkRFRkM/Q0FFRERGQ0JFR0NCSEZCSEpJR0hKRkRLSkdISkhJS0dKSk5LTkxJTEhKTUpaZkpkW0psUkdOTV9uVWxzW3FwYndjUlBidnVodWNhdmFYbnFiZHZpbXpmXGx0YGxrVmB3dmlqZ2hmZ2xtam1vam1vc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cnFzdHZ2dXV5d3V0dGBrdGtwcGtxc3J5TE5KS0pGQj9AQj88RERGRENDQ0VFREZCRUZHRERKRUVKTEtJS0xHR05JSEpLR0tKSUpKTkxNTUxMSU1NTFtzYmRwXWxsVUxOZXJdZ2VxbG50Z3BpX2FZbm1icHBia2pqZ29xdGV0bm9ccHZncE9Mcnl2a2Fha2VlbHhta3ZsbnBzcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd5dnR0Ym11a3BwbHJycntLTElIR0VEP0FBPz1CRUZCRUNFREVFRENISEdEREtIR0tNTUpMTEZKT0hKS0pJS0pKSUpNTU5NTU1LTk1OW3Jwb25wcGtqTE9QbVhOaWJ0cnBhbW92XFlsUFttbVpxbWtwbHh4dHNpcFxgc2xxa1V1eXhvY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0dFRURCQUI9Pz9FR0JHREhFRURCRklISEVHS0pHTUxOSkxNR0xOSU1LSElNSUpJSkpOT05OTUxOTUxcaGR1XWxxVmtNT1FuVVprXmtsdmFsZHRUZWNObFlsXHRvbGpseGp3dWhwXV9za2hXYmN3fG9jYGdoYWNpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cnNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1GSUVFRENBQjxCQEJGQ0dGS0dFQ0NIS0hIRklMS0ZNS0tSUkxITU1JTkpJR01HSkpISU5PTU5MSk1NSlp0cHBvcXFsa09RUm5Zc2tnb29xcW9tdF5uWGF0X25vcG9xc29vdXN0dGpaXnRjd3hyam56aGFhY2ZhYmptdHVwc3V2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXRvbnNzdnRJS0hKQ0RERUBAPkNDQUZDSElNSEZDRkpMSUdGSk1MRk9KSldSS0dMS0tOSUlKTElLSklJS0xNTUxJS0tKU2tiWWleX2pjcnJaX1lqb19lZVVrX2NbYWFRYG1oXGpcbmlqZFtvZWRwXVpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVudnFydXR3ckhIRkpERUNGQUBBRURDRkJISkxHRkNGS0xJRUZKT0xJT0pMW1FKRkhJTE1JSEpKS0tJSElHS0tLS0dISklLS0xKSUtMTlRbXVRQVU1RT05PT1ZRT1BRTk9RSkpOUFFkcWlUWVZbW1xVWVpdWF1cXGNmYWFmYmNmX15ma21obXR5cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzSENFR0ZGQEVDP0NHREZHQ0lLTEdGREdKTEhER0lQS0xPS0xXTUlGRUhKSkhJS0hMSklHSEhKSEhIRUZLSEhKTktIT1xXXk9cXGBeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZFxhWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRQQkNETE1BQ0NCRElFR0dGS0pLSEVFSkpKRkVISFBKTE1KTVJJSEVBSEZKSUtLSUxKSUdGSkhFRkdFRUpGQklMSUpTX1lgWGBhW2BVWFpUXV5aX1JZXFBeXFlOX1xeU1teZF5aXWBjX1lfYltgXltVWVlaX15jY2JhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN1eXp6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSURDQUNGR0VHR0lKSklJREZLS0tFRklJTkpOTEhMTkdIRj5IR0xJS0tKS0tJR0VJRkNERUJGSkQ/SUtITlpiWV5eYV9SVFNXX19cXVleUVlcTVZfV0tRWVtRW19iYV1eY2FgYmFiY2NlWlJaV1ddWl1kYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WVFKRkRHRUJESEhGR0hJRkdKR0hGSEtJS0RESkpNTUxMSEpKSEpHQEdGTktLS01LS0tJR0lFRUBEQUhJQT5ISUZPXWBaW2RdX1RRUlhdXFxcX1tLV1xMUlxZSU1eUVFdX2JjY2NjYlxkYmFkY2ZYUldVVFxYW2FfXl9hYV9kbGttamtsbnZ+dYF6fISFhYWFhYWGhoaGhYWGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1DQElGQ0VLSUZHR0lHR0pHRkZJTEpORUNKSkxOSkxJS0tJSUdDSEhRTUtLT01LS0lISEZFP0VCSEhBQEZFQ1NdWV5YX1hfW11VWFhPXVxRS0pWXlheW11WWmFSUl9fYmJgYGJiX2NiYWRkYVhQUlJTXFNcXV1eXl9fX2RpZ2xrbm5we3t8fnuAgoOEhYWFhYWFhISFg4SFh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSERSS0ZISEhERktJTVBFR0lKS05MTEpMTEpJR0RIS1FPTUxQTU1LTElKREVBRUNIRkFBRkNBVVVFXFReU1dgWE5UVU1ZWkxKS1RgYVtfWF9eYl1PWWJcYGBfYmNhXWJhV2BfVVFQUVJZU15cW11dXmBiZmZmbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGSERJU2NRRVdfSUdHSERGTUpQUEZJSUpLTkxMS01MSkpHRUpOUVFOTlBNTk1OSUxCRUFDQ0ZDQkBDRD9MR0NMTFBPT01GTUZGSElHRkxLTU9QSUxPUFBTUExRVFNVWlhXWVdXY1ZOUlRQUVBPUVZUXFlZW11cYWFlZmRoZGxtcXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtOXk1ISFlNR0hKSEdNTFFRSUtKS0tOTVVOT0tLTEdHS1BTU05QUE5PT09JTEZhRUReTERmYkNMWkdeXHNtT01WbllLQ1BfVGtWZ0pdWFVeRExRVUxNU1ZRUlRYVlRYVFRcVE9lWmhoZVpVa1RYV1VbXFtgYGFiYmNhZ2lnbmxoc3p8fX6BhISEg4ODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFTFBUSktHYFRISk9KSU9NUlFLTUtMT1JVUk9QSkxOR0hNUVtZT1BQTlBRUEpLUX9RSXxZWXJzV1BtR3Fub2FWUHFxdE9Ca3NtcXNwU29fW25YXVZcWFVraFVdVmNZYFlaXlVVV39pdHV1YGF2X1liXFxmW19hYWFiX2FjZ21vbWBwd3R4gYGCg4SCf31+gHZ4em12fnR4fYB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdKTEZSVkxLT0hMUlhXUU5PT01RVE5PUVBMTE9HTVBTW1pUUVJPUFBRTElaeF1UeGRoWFJTUHZmdGxwYm5ma1JyTkx3bWpycHNycXJwb2+AXWV6dXhxcXpxfnJ9a3V9YVJofGVzc3Bzc3x9cH54b39yYGBgYmJbYmFobG5rYmxmZ213foGAg357eHeAdHZ6aXF+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRE1NSEtLSEtQT01OSk5WXllVTFFTTllZTFNTU05MUElRUlRZV1dQVFBQUFNMSGd4bGN4cW1aSktUeXB1bXVibnZQZGRIZXZxbXdvgGpmeHhpV3JRaHptaWp6en5seHp/cGhuWHV1anZ1cYFhc2h9aWx4fG9fX19jYlxfY2VnamplZ2JjZGxtcHBzdHNzc3lxcnhibXRncnl7c3N1eX6Bc3Z6bnx9eXhybk1KUnROQ0JFUFFIS0xKTFFPT09NUFpgWlhLU1dQYV5SVlFZU01QSlNUVlhXV09VUE9OUktMcm91dXF1cWNoYFVuS3FwXkdoeVd2VEtoeH13YHl7c25hXW1vZFNncnVubXlwd2t1c3RxbG1cc356a215fGx1bnxrcXd1eF5fX2JfXmBlZGlnaGZlXmJiaWlpamtub2txbm1qcGFjZmNvd3hvbXBzeX9ucXBqe3p0cm9tS0taVkhHRUdSUUtNTkxMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5KVFRXV1lXT1NPT05SSVJtSGl3S2BkdnZUVmxObmx7cmFqZ391VEtXa2d8bG1seF9acHp7X2B6c2Nyb3hxZ2N8aXJ7XVRLbF92dWxqdnx7bn95bHxwXV5eYltfY2VlZ2ZlZWNbY2Npa2tyc3J3Z21paGRnYGFsYWdzcmxnbG1yfGttaGt7dG1ta21PR0pLSEpISFJRTU9QTExTU1JPU1JYUldUUFdaVlZUVFRhYFFPTktUU1NRVlZPT01OT1FLSFFOUFVMS0tSU1JRUk9WVVFRT1JSWFhQTU9VVFdYWFtbVVFSV1tXWFdbT1JUV1dYUV1YVlxVVE9YUldXWFlaYFxoc19cW1tdXV9jWl9kZGVnZGRkY1pkYmdmZm1ubXVmZmdjYGZeXWdgZGxoZmdraHB6aGdna3VqaGdpbFBJS0tMTUtKVFJOUlFQTFZWVFBUVVhVWlVSWl1VVVRXVVlYT09MTldUUE5VU05QTkxRUEtJUVFLUU1KSk9RVFFQUVNSSkhNT1BRUlBQUFRVUlhXXFdTU1BRVVVWU1pRTlJSV1RSWFVTWFRTUVVTVVVZWVheWl9hXVxbWlxcYGNcXmJjZGdlZWVjWmBhZGFiaGhqbmNhZF5fY11aY1xibWFeZmZnbXNkaWhra2VkY2doUUpLS05PTE1UUU9UUVJNWFdVVFZYV1daVlNcYFZXVllVWFRRUEtPWFNQTlVQTlFPTFNQTU9VU05RTk1OUVNQVFBRVFROS01PUlRUUVFRVVdVWVpbWVJVUlRYV1ZZXFNPU1RXVFNZVFZYVFJRV1ZWWFxaXGBdV1lfXV5dXF1hYV5bYmNjaGdmZGNYYGBiXmBoZWdlYV5fXV1eWlpfWl9nYF5eXWNoa2FoZmhmZGBiZGJQS01MUFFMUFVQUFRRT1FaWVhXWVpaWFhWXWpkVlhZWldWU1RPS09WVFBPVFBQUU9NUlFPUlhUUVFPTU9SVE1XUVNUVU9OTlFUVlVSUlJUWFZaXVxaVlZRUldYVVtbVlBTVVVVVVhTV1hUUlFYVlZbX1teYF9WX11eYF1cYF9fX1pjY2VoaGVlYlliYGJeX2ZkY2BiXVxcXFxZWltYW2FbXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVlxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVdTTU1ST1JTT01QU1JVW1VUUFBMUFdVUFZRUlJYTU9QUlVYVVRUU1RZWFteXVxbVlJPVVdVW1pWUVNWVFVXVVNYWlNSUVpXV11fW2BgYFZiXGBhXWBiX1xgXWNhY2hpZWdhWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFpcWmBeX1teXmFgX2NcWWBaUU5PTlZRUFVTUFVVU1BXXFxcWV5dX1dcXmpwd3mAY1xbVlZZUk5QV1NOUVFQUlRSTFJUVFlbV1VPUk5TWFVTUVJQUlpPUVNUVltWVlZTVlpYXV5cXF5WU05UVlZbW1VRVFVVV1hSU1lbU1JSXFhaXl9dYmFgV2JbY2JeYWNfXGJhYl9kZ2llZ15cZGBhYGFjZF9iX1laX1tcW1hYWVdXWlpaYV1dW11cXFpdYFdbW1pQT09PWVBVVVNSV1JUUFtdXl1cYFxgVVxcaGpyfXNsaFxVWVdRT1NbU1JRU1JVVVVLUldWWlpaU09TUVVVVFJNVFBSWlJUVVRYXVdYWFNYXFheXVlaXVVVTlZWV15aV1FUVVdYWFNWWVtUUlZdWV1eYV5jY19ZYFtlYl9kZF5eY2NhXmVmaWVnX15kYWFhYmNkX2JeWFtfW1xbWFhYWFdbWltgXVtbXFtYWlteVl5ZXVBPT1JbUFpVVldWU1RUXl5gX15iXGBVXV5ia3l1bX1sWlVaVlFRVFxUVFRWVFZZV0xSWlZcW1xSUFVTV1VVUk9WUFNYU1dVVlteWFtZVVpeWF9eWVxZUldSWVhZX1lZUlRVWVlZVVdZW1VUWl1dXmFiYGVkXV5dXWVhYmZkXl9kY2BcZ2VoZmViYGVhX2FhYmJfYF5WWV5aXFxaWVlXVl1aXV5bWltcW1dZXF1WWFddU09QV1lRXVVXWVdXVVhfYGFhYGNdYFVdXmJlZXaCe2hYWVpUVlRWXFhXV1ZXV11YT1VcWV5dXVRTWFJWVVNRUldRU1ZUWFhYXl5YXVtVXV9YX19YXFZRWFRaWlphWFtUVldaWVpXWFlZV1ZdXmBfZGNiZmVeYlxgZmJkZmRfYGRiYVtmY2hmZGZhZl9fYmJhYWBfXlZVXVpbXFtZXFlZXVtbW1hYWVtaWlpdX11UWV1VTlRaVlRcVVdXWVdWXGBhYmNhY19fVltgZGFfenVvaFpcWlZYVlhbWllbWVhZYFZPVV1bYGFcVVVZUFRWVFJVVVFUVVdbW1xfX1pfXFZfX1ldXlldVlJYV1pZXGJZXVVWWltaW1paWFpYWV9fYGBkY2RlZWNkWmJmY2dmZV5hYmBjXWJjaWVkZ2BoXmJiY2FhYF5fWVRbWlpbW1hcWFhcW1pbV1daWFhcW1xgXVZdXVNPVlpWVlpWWVZYV1heYGJhZGFkYV5ZWWFkYmBrZmheXF1bV1hZWlxcXF9bWltiVlNXXl1hY1xTVllQVlVVVVVVU1VUWF1dX2BgXWFdV2FeW15cW15YVVhXW1pfX1teV1hcXFxdXVtaXFdaX2FeYGRkZWZmZ2NZY2ZlaGdkXmNgX2VjXWZpZGVpYGdeY2JjYWFgX19cWFlbWVpZWVpYV1tbWltXWFpUWl1cW2BcVV5iTVJXWldXWllbXFhXWV5gYmFkYWRhXV5ZYWNiX2FgYV9cXV1YV1tbXV1fX1xaXWNYWVhdYGNkX1JYWVBXVVdYV1ZWV1ZdXV5hYmFfYl5ZYV1dXlldXVlYVVZbW2BeXV9ZWV5dXl5gXFpaWVtfYl9jZmRmZ2ZoY1plZmdpZ2NfY15hZmVaaWljZmpkZl9iYmNhYGBfXV1aV1tZWVhYWllXWltaWVdYVlVcXV1dYGBiYnhLV1dcWVddXFxdWldcXV9gYmRiY2FdYFhiY2JgY2FjXlxdXFhXW11fXWBfXVtgZFxcWFpiZWNhUlxZT1hWWVtZWVdZWmBeYWJjYGFjX1xiXV9dW15dWVlUWF1cX19eX1taXl5gYmJbW1dbXWBiYmRmZGdmZmhlXWVnaGlmY2FiW2NnYFxpaWNoamdlYGJhY2FfYF9dXVxZXFlYV1hZWVdcW1pXVlhQWFpdYWNmZnJrf0pZV11bWl9dXF5cWV1bXl9iY2JhYV1iW2JkYmBjYmJdXVtaV1hqcWBcYF9dXGFjX15ZWWNlZGJUX1pRWVdcXVxbWVtbY2BjY2NgYmRhYGNeYFxeXl5aWFVbXlxcYWFfXVtgYWJmYl5bU1xfYGNkZGZlZ2ZmZ2ZfZmdoaGdkZGBbZWdeYWhoY2hpZ2RgYmBjYl9fX11dW1pbWVhYWFZaVlxbWlZWVUxYWFxnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIeJh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl6e3t6ent6enp6enp6enp7e3t7enp7e3t7e3t7fHx8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ1dnZ2dnV2dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXp6ent7enp6enp6enp6e3t6e3p6enp7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODg4KCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx2iIuLi4uLi4F9fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09PPxMXFxcXFx9LU1NTT09PEvr6+vr7CooqMjIyMjYl+f39/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXaMkI+Pj4+Qg35/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk5eDU1NTU1NTW4+Xl5eXk5dLLzM3MzdCqjZCQkJCSi39/f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnh4eHh4eHh3d3d3d3d3eHl5enp5eXdvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4ODg4KCg4ODgoOEhISEhIODgoKDg4OCg4B8fH19fX19fH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ1dXV4dnZ2ent4e3h3dnh8enl5en58eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl6e3t7e3x8e3x8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd2en15e3t5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3Z6fnp5e3h7enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3h5fHp8d3x5eHh4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eHp6en18enx4fHh4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBgICAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5e3l5enl5eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXl5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eXl5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veHl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKCgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt8fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fX19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qKi4eHh4SDgoGBgYGBgYGCgYKCgYGBgIGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHhIWCgYGBgYGBgYKBgoKBgYGAgYKBgYGCgoKCgoGAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uIjYmIiYaEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgIGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYGCgoGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoKBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIODgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4SCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGAgYKBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCg4KCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKjIiGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgYGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fX18fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19f4CBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIi4uJioaGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgYGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjIiGh4mMi4uKhoWDgoKCgYGBgoKDgoKCgYCBgYKCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39/fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioeIio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/f39/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDhIOCgoeSk5CLioqLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgYGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCgoGCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODgYGChISCg4KHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKBgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCgoSDgoODg4KCfX19gIB/gIKBg4ODg4SGhISEhIWFg4OCgYKDgYCCg4GDhYWFhYaGh4aGhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SFhYSFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKh4KCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIKCgoKBgYKCgYF/gIGDgoCAgH+AgoKCg4OCgoGDg4OEhIOCg4WDgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjpCOkJGPi4mHgoKCgoKCgYGBgYKCgoKBgYGBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4ODgoOEhYSEhYWEg4KEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiIiHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgYGAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgoKBgIGDgoKBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYiHhIKCgoKCgoKBgYCBgoKCgoKCgoKBgYGBgYGBgYCAgIGBgIKEg4OCg4KCgoGCg4OIh4eHh4WEgoF+foCAgH5+fn+AgYGBgoGAgoKBgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5GQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmJh4WEg4GChISDgYGBgoKDgoKDhIKDhIWFhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkZGRjo2Mh4WDg4OBgoKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDhISEg4KBg4KDhYWDg4OEg4SDg4WEhYSEhIGBgIGCg4KChIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoKCgoKEhIWEhYWGhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOTko+MjIqFhISDg4GCgoOCgoKCgYGBgoOCgYKCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgICCgYGAgYGAgIKBgoKCgYGCgoGAgYKCgoKCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGBgoODg4OEhYSFhYSDhIWFhoWFhYSEhISDhISFhYWFhYSDg4SDhIOChpSUkpSSj42Lh4SEg4OCgYKDg4KCg4OBgYKCgoKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoeHhoaFhoODg4OBgIKCgoGCgH9+f3+AgH+Af4CBgIB/gYGBgYOBgIGBgoSDgYGBgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhIWFgoOCg4KCg4ODgYCAgICAgIGAgIOCgoOBgYKCg4ODhIKDg4OCgICAgoKCg4KCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaDhIODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhYWCgYKDgoKEgoGChoWEhIODhISEhoWEhIWCf319fX6ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhIWFhYWEhYaFhoWFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMi4iFhYWFgoKBgYKDg4ODgoOCgYGCg4ODg4KCgYCBgICAgIGAgIB/gICAgIWFhYWFhoeHhoWFhYSEhYWEhISEhIOEg4ODhIWDgoOEhYWGhYaGhYaHh4aDgX5/fn5+fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYWFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoKCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4OFhYWFh4eFhYeFgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGhoaGhoWEg4SFhYWEhYWGhoeHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4OEhISFhIOCgoODhIODgoSFhIWHh4WEgoB/f39/f4B/f3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiIiGh4aHiIaHhYSDhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH9/gIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eHhYODhYSDg4OChISEhIWEgYCBgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYqLi4qJiIiHiIiIh4eIh4eIhoeGhIODhYeHh4aFhYSEhIWFhIWFhoSEhIWFhYaFhoWDiZSTkI6RjoqGhYaFg4GBgYGCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4ODg4SJioeHhISFhIODhIOFhIODgoGCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoeEg4KFiIiIh4eFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoODhYmKiYeFh4WEhYWEg4WEg4KCgoKCg4F+fX5+fn5+fn19fn19fYOHiYqKh4eFhoeHh4eIh4eJhoiGiIeHiYiEg4SDhYSEhYWGiIeGhYOCgoSFh4aHhoaDgoKDhIKDhISCgYGBgYGDg4SDhJGSkY6PjYuHhIaGg4KBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/gICAf4WGhoWGhoaHh4iHhoGChISDg4WGiIuKhoWGhIKGhoKAg4ODg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GDg4SFhYWDg4WEhISEhYSFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4SEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAhISFhIWFhYeHh4eGgIGBhYODhYWEh4iFg4GAgIF/fn2Cg4ODg4KCgH19f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgYKBgoKCgYODgH+AgIGDgoCAgICBgYGBgoGBgoSDg4WEgoKEg4KCgYKEg4WFhoyTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4N/fn5/fnx8f4ODgoOCg4F+fX5/gICBgH59fX19fn18enp6f4KCgH9/f39+f4CAfn2Af3+AgIF/gICBgH9/gYF/fX1/gIF/f35/gIB/gICAgX+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCBf3x9fX59fX6AgH59fn18fX6Cg4OCgoGBf319fn6AgIB/fn19fXx7e3t6enl6gIB/fn9+fn58fn9+f4B/fn9/gH+AgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhISCgoGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f35+gH+Af36AfX1/gYSDgoGAf39+fX5+f4CAgH59fX19e3t8enp5eXl7f39+f39/fn1+f3+AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f3+Af39/f36AgH9+gH9/fn5+f39+fn99fHx9hZKSjYyLioiJiISFhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgIB/f36AgYSDgoGBg4SEg4SAgYGAgYCBgIGCgoOBgIF/gIKDg4GBgYGAgH59fX5+fn9+fX19fX18fHx7enl5eXl9gH+AgYGBf3+BgH+Bf4CAgIGBgoKAfoB+f35+fn6BgYKBf39/f4CAf3+Af4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qIh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f39/f4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEg4GDgoOCgoKBgoF/fn19fX5+gH19fX19fX19fHt6enl5eXmAgoKDhYOAgYOBgIKAgYGBg4KCg4GBgn+BgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICBgYGBgH9/f3+AgICAf4CBgX9+fX5+f39/foOGh4eIgoaEhYSEhYSFhoWGhoaFhYaBgIODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyDg4SFgoGEg4KCg4WGgoOEg4GCgoODgYOCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoCBgYCBf4CBgH9+jpOMh4iHiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf39/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGhoeHh4aHh399gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCCg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WFhIWDgoODgoODgoKCgoODgoKSkIuIiIeIh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgYB/f359f35/gX+AgoGFhYWGhoeHhoeHiIaHh4eGhoiHf3x9fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomXhIODhISUk4CBgX9/f35+hIuAf4CAhIaQiYWEgYKBhYWLg4GChYWGhoSDhYWDhISDg4SDhISEiJKOi4mIiIqHiIeFhoWEhYSCgYKCg4ODg4ODgoGBgYCAgICBgICAf39/f3+AgICAgICBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSEhoV/fHx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3x/goOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEg4GDjYl/fX+DhIWFg4WGhYSFhYOEhYWGhISOkY+LioqMiomKh4WGhYODgoGCgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoOEg4KDgoKFhoSEhYWEhoSDhIOCgYGDgX99fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gHp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWChJGRjYuMjI6KiYmGhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIKCg4WDhIWFhYWDg4OEgoGDg4KDgoKBgICAf4F+f35+fXx8fHx8fHx8fHx8fHx8fXx8fH5+ioJ7ent6eHp7e3x9e359fn99fX19fHx/gYF9ho+Bfn2Cfn9+gIJ8fIB/goCBgH59e4qCfYB/foGAgIGCgYKAgICBgH+Lk4+Li42OjIiHiIWFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICBgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3t6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX19fXt9fX19fXx8fYB/gIB+gH5+gpORi4yMjY+KhYaGhYSEhYODg4KDg4ODgoKBgYGBgICAgYCAgICAgH9/f317enyAgIB4foF3e4CBf4GCgoKCg4aHhoZ+iJWKfoGBgICAf36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4d/fXx+gICBgH9/fn19fX1+e3x9f39/gH1/foCMkY2LjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYCAgYGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+ChIaGhX9/hYF+f4CAf4B+fn99f4CAf4CAf399fXx8fX59fH19fX19fXx+fH18e318fHp7enx9fX+GhIKAgIF9fn1+f36MhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn19f39/fX6Afn5+hJKMjIuOjYuKhoSGhISDg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAe359fH5+gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8e3x6fX5/gIODgn9+f3x9fH18fYGDfox+fHt7fX59fn59e3t7fXt6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CKj4yKioyLioiEhISDhIODg4KCgoKCgoKCgYGBgIKBgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH9+f399fn9/f36Af39/f39/gICBgYB/fYB/f35/fn5/f398gn5+fX19e3t9fXx6fHx+gIKBf4CAfHx9fHx8fHx9fH17f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4aChJCOjIqJioaHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f35+f4B/f39/f39/gIKCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn59f358fHx8fHx8fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3t9e31+fn+AgIOHiYmJiomLiYWIkI2LiIiGhYWDgoKDhISDg4KCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foF/f39/f4CAf35+fn1/gIB/f39/gH+Ag4OAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn19fX19fH18fX19fnx9e318fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+goWIh4iLi4uKiYyQjYyJh4aFhIOCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5/f4B/gICAf35/foCBf3+AgICBgIKEg4GAgIGBgIF/gIGBgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SDhIiJioiJjY+MioeIhYSEg4GCgoKCg4KBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXl8en9ygX17e3x8fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX19fn1+f319fXt8fX58fHt8fXp6eXl6eXt7fn6BgYOHhIiNjIqJhYWEhIOCgoKCgoKCgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH6CgIGCgoCAgYCBgYCAgYKCgoKGhYSBgYGBgYOBf4CChIF/foGAfX6Bfn1/f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX59gIN/iIyJioeFhYWEg4KCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGEgX5+gIB9foB+fX5+gIB/gX5/gH9/f4B/fX5/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCBfXx8fX18fHt8fHt7e3x7fHx8fXyIiYeHhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3p6fHx7dnt0d39+dnJ7fn57eHV3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gYF/fH5+fX19e3x+fH18fHx7fHt8fYiGhoSFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp9fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX1+gH+BgH+AgIB/fn19fX59fn59fYGEf4B/fn+BgX99gH99fX59fn59fnx7fHp8e3qAhYKDhIWEhISFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgoGCgYGDgH+AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl0dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIOBf3+AfoCBfoCBgIB/fn5+fn59f35+hYWAgYB/gIOBf36BgH9+gH6Af359e3p7enx7eoKDf4KCgoKDgoOCgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoKAfoCBf359fn5+fn1+fX16e3yFhHt7cnl7fHB3dXZ3eXZ0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX+Af3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+BhIF/gIOBf3+Af4F/gH98e3t6fHt8gYB/gX9/gYGBgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChISChIWFhoSEgoSDgYOCgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gYB/fn+Af4CDg4OAf3+BgYCCgYGBgICBgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fH1/fX+AfH9/fn2BgIB+fX2Af36BgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5+fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgoOCgYF/f4OAfoKChICAgoGCgoSCfnt7fHx8fX19fn16fn1+eX5/f3x8fH59foGAgYGBgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWEgoSEhYSDgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn59fX2Af4CBgYF/fnx+gH5/f4GCf4GBgoOHhYGAf35+gH+AgYCAgICBgoGAgH6Agn9/gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXx5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN3dnN0hoSEhYOCg4SEg4OCgoOBgoKBgIGBfICAfoB9fn1+f4CAgH9+f398fn9/gYCBgH9+fX9/fn5/gYB9gICBg4SDf39+fX5+fn+Af4CAf4GCgYB/foCBfn+AgoKAgYSChIWGg4B+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFg4ODg4KDgoGCg4KBg4J/gYB/f35/gH19fXx/gICAf39/f3yAf3+BgIGAgH99gH9+fn5/f31+foGCgoJ+f359fn5+fn9/gH99gIGAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36GfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3ZxeHlyeIWFhYWDhISCgoOCgYGCgYCDgYCAf35+fn6Afn1+fH+AgIB/gIF/e4B+gIB/gYCAf32Af35+f399fX1+gIGCgX5/fn5+fX19f35/fnx+gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fX17fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIKAgICAfX5+f4B9fH59f4CBgH9/gYB8gH+Afn+BgH9/fYB/fn9/fn19fICAgICAfn9+fn59fH5/f39+fH2Af359foCCf36AgH9+gYOCgoSFhYKCfn19e3t8fHp3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzcHh3cXuFhoWFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgH+BgH1+gH9+f4F/gH9/gYB/gH99fnx9f4CAgIB/f39/fn18fn9/f399fX9/fX5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3l7endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WHhIWDhIKBg4KCgoGBgoGCgYGBgH+Af39/fX1/fn+AgYGBf4KBfX6Bfn5/gH+Af4CCgICAfn1+fH9/gYGAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2EfXR8fXp6enp8eXl6eoaFd3l8fHx8fH18fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKBgYGAgICAgIB+fYB/gH+BgoJ/goJ/gIF+f4GAf4CAgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f3+Af39/f4B/gICAgIB/gIGBgYGBgoGAgH9/f359f356gZKLenx9fHt9eXt6enh5gYF4eXt8fH18fHx8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2Fh4ODgoOCgIGAgoKBgIGBgYGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIJ/gICAgH9/gIB/f31+gH59gIB/f39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhoh8fH57e355ent6e41+d3d5e3x7fXx8fHx7fXx9fH19fH18fn5+f39+fHp8fXt9fXt5ent6eXhzdHVuc3FweHJ1eoWGg4OCg4KAgICBgoF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX+Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgIKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOBhISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9+f3+AgIB/gIB/gIGBgICAgICBgIGBgYKBgIGAgIB/f4B+f31+fX5+e318fXx8fHd4dXh4eXt8fH17fHx8fH1+f39/f359fX6Af4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYGDg4B/goGFg4OEgYGDgYKCgYGAgICCg4KAgoKFg3+AgH6Cg4GAgYCAgH+AgH+BgYCCgH+AgoB/foCAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKCgoKAgoGBgoGAf3+Af4CHfn58en18e31+eHd2eXl5fH18fHx7fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICCgYaDg4OBgoSAhIOCgoCAgoKEgYGCgoSCf4CAf4GDgoGAgYGAgH+BgYGBgIOBfoCDgn99f4KBgICAfoGAgX+AgIGBgYGAgICCgYGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fYB6eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYOBgoKBgoF+gYCAgoGCgoGCgYCBgICAgYKBhIB+gYOCf36Ag4KAgX6AgoOCgIGBgYOCg4KBgYOCgoSBgIGDgYGChIODhISDg4SDg4KBgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn5/gYGAgICBgYGDhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoSGhIKDg4OEgYSEgIOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F/f4GEhIGDf4KCgYOCgoKBhIODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3x6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKChYSEg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GCgYCAgoSDg4KBgoKBg4KCg4ODg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX16fHx9fXx6e35+foB/f4GBgICAgICBgYCAf319fHx9fHZydnh4dnR/dnR9h4eDgoSFg4OEhYSAgoSFhISDgoOEhICEhYOCgoKDg4KDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYKBgIGDhYSDgoOAgoKDgoODg4ODhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9f31/f3x8enx+fX19fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn91dn+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KDgX6AgIKCg4KDg4OEgoGCgoODgoOBgoGBg4F/gYSEg4OChH+ChIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoOEhISEhISFhIODhIWEhISDgYKAfYGCgH18fHt8fIB9fX6Afn59f358fH19fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx8gYGCgoODhoOEg4aEgYKIh4WEg4OEhIWChIWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4KDgX+Bg4ODg4KDgIKFg4ODg4SDg4SDgYKEhIWDgoKDg4OBhIOBg4OEhISEhYWEhISFhYWFhIODg399gYR/fX18fHx8f4F+fX5/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WBgYOEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fX1/gYB/fnx8fn9+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhYSChIOGgIKFhYqJhISDhIWFg4eGhoSEhISFhIWEhIOEhIGCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhIF9gXWBeoN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+De4WDgISDgX9+fX59fYKDgX17f31+gH59e3x8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISGhIGDhIWDhIaEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2ChHVzcYOGdHB1cnN0g3Z7fXWBf4KDgYJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBzgoN/g4N9gX19fn1+goOBfH+BfX+AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYOChYaEhYWDg4OEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ6eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugIh5bX1yc3Zzdm1teGxweWx1fX9+fX6BgIF9gH59gH+Af319fHx9fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiHhIOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYGAf3x/fXyBfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgX+Afn5/gYB/f4KDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhYaGi4qFhIaHh4WEhYWFhIKFhYWFhoWFhoWGcXVwcnNvc3p5foN0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSBgYCBgYB9f3+BfoB+fX6BgH5+gYKAgIGEh4aDg4aEhIWGh4aFhYWFhoaIhYSGhYeGhYaEhoaJiIWEiYqIhYSGhoWFg4WFhIWGhoaGhYN4i3lyiHp7cHCFhXiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dHBvemxzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFhoaGhYSFhYWFhYaJiYeFhIaFhoaFhoaEhoaHhoaFhoeHh4aGhIaFhoeIh4WHhoaDhoaFhYOEhoaFhoSGhIOEhIaEhIGEg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWFhIV9d4WEhISDgoF9f357fHt+e3x8fX9+fXx+foCAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4eFhYWFhoaHiIaEhoWGhoWFg4WFhoWEhoaGhoWFhoSFhoaGhoWGhoeHhoWHiIiIiIaEh4WGh4iGhYiHiIWHhoaIhYWGh4WGhoWEg4WFhoWFg4SEhISFhIWFhIWFhIaHhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH17fHx9f358fH59gH99foB+foB/fX18gH1+fn5+fn58fH1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYSIhYaHh4eGiIaHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoaEhoaFhoWEhoaFhIOFhYKFh4WDgoKFg4SBfoCAfHt9fnt8e31+fXx8fn1+fnx/fn19fn59fXx/fH5+fH2BgHx8fH18fHx+ent7fX6Ih4KFiIeHhoaGhoSEhoaHhoiGg4WEh4aEhYeDhIWEhYeEhYaGhYaEhoaHh4aGiIeJiIaGiIeIioiFh4iFh4eGh4aHhoeFiIiHh4WGhoeFh4eFgYSEhYaFhYSEhIOEhYWGhoaFhoSHhoaHhYWGhoWEg4SDgoSHg4SBgoSEg4GAgIB7e35+fHx8fX18fHx9fXx9fH59fH19fHx8fX18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoWHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYWEg4SEhYaGhoaGhoeGhoiFhoWGhYSCg4KDg4eBg4CCg4OCgoJ/gHt9fn57fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19f318enp7e3x8iIeChoaGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eHiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aHhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWHh4eHiIaGhIaFg4OCgoKDhoGDfoKCg4CDg39/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhYSFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYmKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhYOFhYaGhoaHhYeGh4eHh4WEhYWDgYKBgIOFgoN+gYGBf4OBfn9+f35/fHx9f317fX18fXp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYWFhISDhIKAg4GFgoGCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4qHhIeFh4aIhoWHhIaHiYaGiIiHh4aHiIaEhoaGh4aFh4OEhYSGhoaHhYWEg4WFh4WHhoeFhoaHhoaGhIOEhYGAgYGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXp6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaFhYWFhYWDg4GDgYCBgYWCgIB/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeFh4iJhoWIh4mHhoaHhYSGhYWGhYSHg4SFhIiGhoeFhYSChoWGhYeGh4SGhoaFhYaDg4OEgH+BgICEgIOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5enp5en19eXp6e3x7fHt7ent9fXx9fH5+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIODhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eGiIiFhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIOGhYaGhoaGhIWGh4WFhoKCg4N/foCAgIF/g4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18f359fHx9f358e4iFhYaGhoaEhYSFg4WCgYCAgIGAfoCCgn19f397f3+Cg4OFhoWEg4OGg4GDhIKAhYeFgoOBgYOEhISFhoeIh4WFiIaJh4WDhISChYOEhoKDhYWFhoSHhoWFhYaDhIWEhYaFhoSDhYWGg4WFgYGDg39+f4B/fn+Df3uAfX1/gn2AgX5+gX59fX19f3t/fHt6eXp6eXp6fHl6enp7e3x6e3t7fH1+fX2BfX18fH2Af318hoOGhoaGhYOEg4WChYGBgH9/gIB+f4CBfH5/f36AgIKCgoSFg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWGiIaFhIWHhYeFhYKDgoGDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SEg4SDhYSAgIKCf319f35+gIR+e398fICBfYGAfX2DfH5+fX1+e357e3p5enp5enp7eXp6ent7fHp7fHt7fX59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4F8fX9/fn5+gYGChIOCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhoSEhoaEhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDgoSDg4B/gIF+fXx+fnx/g318fnx8gYB+gn99f4J8f359fHx8fHt7enp6enl7enp6enp6ent8eXt9fHx+f3+BgH1+fX19f4CAgIaEhIWEhYKDgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIaEg4OFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhIWFgoKCg4WEgoGBgYKAhYOBf36Af358fH59fH6DfXt+fH2Bf4CDfn2AgX9+f318fHx9e3t6enp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAysrKysrKysrKysrKy8vLy8vLy8vLy8vMzMzMzc3Nzc3Nzc3Nzc3MzMzLy8vLy8vLy8vLy8vLy8zLy8vLy8vLy8vLy8vLzMzMzMzNzc3Ozs/Pz8/Q0NDR0dHS0tLS0tLS09PT09LS0tLS0tLT09PU1NTU1NPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dXV1dTU1NTU09PT09PT09PT09PU1NPT1NTU1NTU1NTU1NPT09PT0tLS0tLT09PU1NTU1NTT09PS0tLS0tLS0dHR0dHTx4ZzZWBbS1lnVU1GSEA9Nzc4OTc8PDw6PDs+Njo9ODw7Ojk4Nzg7Ozo/Oz07PDw+Oz9BP0JCQUNERURBPj08O0BDQ0FAQ0NBQUdIR0lLUsLV0tPT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1crKysrKysrKysrKysvLy8vLy8vLy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMvLy8vLy8vLy8vLy8zMzMvLy8vLy8vLy8vLy8zMzM3Nzc3Nzs/Pz9DQ0NDR0dLS0tLS0tPT09PT09PT09PT0tPT09PU1NTU1NTU1NPT09PT09PT09PT09PT09TU1NTU1NTU09PT09PS0tLS0tLS09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dTU1NTT09PT09PT09PT1NTT09PU1NTU1NTU1NTT09PT0tLS0tLT09PT1NTU1NTU1NPT09PT0tLS0tLS0dHR0syMcmdgXE1ZZVJLR0s/OzM3ODs4OT49OTw6QTo7PTc6PDw6Ojc4Ojs9Pzs/PD08Pz4/QT1BQT5DQ0RCQEE+Ojs/Q0RBQ0REQkJJR0hISU6+1dLT09PU1NTU1NTU1NTU1NTV1dXV1dXV1dXV1dXKysvLysrKysrKysvLy8vLy8vLy8vLy8vMzMzMzMzNzc3Nzc3NzczMzMzMzMvLy8vLzMzMzMzMzMzMy8vMzMzMy8vLy8zMzM3Nzc3Nzs7Pz9DQ0NDQ0dHS0tLS0tPT09PT09PT1NPT09PT09PU1NTV1dXU1NTU09PT1NTT09PT09PT09TU1NTU1NTU1NTT09PT0tLS0tLS0tLT09PT09TU1dXV1dXV1dXV1dXV1dbW1dXV1dXU1NTU09PT09PT09PT1NTU1NPU1NTU1NTU1NTU09PT09LS0tLS09PT1NTU1NTU1NTU1NPT09PT09LS0tLR0dLPkndoX15PV2dNS0ZMPTg3NjU5OTk8Pjk/PEQ5Ozw4Ojw9Ozk3OTo8PUA7Pj0+Ozw+PD0+QUA+RENDQz9BPTo7PUJDRUNDREE/RUhKSUpMutXT09PU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dXVy8vLy8vLy8vKysrLy8vLy8vLy8vMy8vLzMzMzMzMzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzMzMzM3MzMzMzMzMzMzMzMzMzM3Nzc3Nzs7Pz8/Q0NDQ0NHR0tLT09PT09PT09PU1NTU09TU1NTU1NTU1dXV1NTU1NTT1NTU1NPT09PU1NTU1NXU1NTU1dXU1NPT09PS0tLS0tLS0tPT09PU1NXV1dXW1tXV1dXV1dbW1tbV1dXV1dTU1NTU09PT09PT09TU1NTU1NTU1NTU1NTU1NPT09PS0tLS09PT1NTU1NXV1dXU1NTU09PT09PT09LS0tHR0Zp+Z2FiTlVqSkhJSz88OjkzNzY3Nz07Pjk9Ojo6ODk6Ozs4ODo7Ozw+Oj09PTo8Pzw9P0JAP0NEQ0Q+QD09PEBDRENCREJEPkRISUlLTLbX09PU1NTU1NTV1dXV1dXV1dXV1dXV1dXV1dXV1cvLy8vLy8vLy8vLy8vLy8vLy8vMzMzMzMzMzMzMzc3Nzc3Nzc3Nzc3NzMzMzMzMzMzMzMzMzc3Nzc3MzMzMzMzMzMzMzM3Nzc3Nzs7Oz8/P0NDQ0NDR0tLS09PT09PT09TU1NTU1NTU1NTU1NTU1dXV1dTU1NTT09TU1NTU1NTU1NTU1NXV1dTV1dXV1dTU1NPT09PT0tLS09PT09PT1NTV1dXW1tbV1dXW1tbW1tbW1tXV1dXV1NTU1NTU1NTU1NTU1NTU1NTU1NTV1NTU1NTU09PT09PT09PT1NTU1NXV1dXV1dXU1NTU1NPT09PT0tLS0dKfg2lfZFNYbEhISEtAPTc4NDc2Ojo/O0Q8PDk8PDk3Ojk7Ojo7PDo6Ozk+PT45PUA7P0FBQj9CQkFDPT8/PjxAQkVDQ0JAQTtGSUdNTEmy2NPU1NTU1NTV1dXV1dXV1dXV1tbW1tbW1dXV1tbLy8vLy8vLy8vLy8vLy8vLy8vLzMzMzMzMzMzNzc3Nzc3Nzc3Nzs3Nzc3MzMzMzMzMzM3Nzc3Nzc3Nzc3Nzc3Nzc3NzM3Nzc7Ozs7Oz8/Pz9DQ0NDR0tLS0tPT09PT09PU1NTU1NTU1NTU1NTU1dTV1dXU1NTU1NTU1NTU1NTU1dTU1NXV1dXV1dXV1dXU1NTU1NTT09PT09PT09PT1NTV1dXW1tbW1tbW1tbW1tbW1tbW1dXV1dXU1NTU1NTU1NTU1NTU1dTU1NTV1dXV1NTU1NTU09PT09PT09TU1NXV1dXV1dXV1NTU1NTU09PT09PS0tLUo4hsX2ZSVmpHSEdJQT4zNjY6Ozw4QzxCQT48QTw4OTo8Ojo8PDw5PD06Ozw9PTw/PUA/QEE/QEFAQjw+Pj88QkNDQ0ZAQUE9SEpJTk1HrtjT1NTU1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbWzMzLy8vLy8vLy8vLy8vLy8vLzMzMzc3Nzc3Nzc3Nzc3Nzc3Nzc7Ozc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzs7Nzc3Nzc3Nzc3Nzc7Ozs7Ozs/Pz9DQ0NDR0dHS0tLT09PT09PU1NTU1NTU1NTU1NTU1NTU1dXV1dXU1NTU1NTU1NTU1NXV1dXV1dTV1dXV1dXV1NTU1NTU1NPT09PU1NTU1NTV1dXW1tbW1tbW1tbW1tbW19fW1tbV1dXV1dXV1dXV1dXU1NTU1NXV1dXV1dXV1NTU1NTU1NPT09PT09TU1NTV1dXV1dXV1dXV1dTU1NTT09PT09LS1q6Ka2NlUlhoTEpHSUI4NDk0Ojs6OUA5P0NFQDw8OTk5PTo9Ozw8Oj08Ozk8PTs7Pz1APT0+QEA/QkE+QDw9OUBEQ0JBQUI+PEhKS01OSKjZ1NTV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1szM0dPT09PT09PT09PT09POysvLy8zMzMzMzMzMzMzNzc3Nzc3Ozs7Nzc3Nzc3Pz8/Pz8/Pz8/Pz8/Q0NHR0dHR0dHR0dHR0tLR1dnY2NjZ2dna2trb29vb2dnZ2dnZ2tra2tra2tra2dnZ2dnZ2dra2tra2dna29vb29vb29rb3Nvc29nX19fX19fX19bW1tbW19ra2tra2tra2tra29zc19XV1dXV1dXV1dXV1tbW19bW1tbW1dXV1dXV1dXV1dXU1NXV1dXV1dXV1NTU1NTU1NTU1NPT1NTU1NTV1dXV1tXV1dXV1dXU1NTU09PT09PT0tW6imtoaFJYZUlJTE9AOTk6NDtBPDc9OUFDPkA/PTg6Ojs5PTs+Pzo7PDw6Ozw6Oz49QD0/Pz9BQEFBP0E8PDs+QURDQURAPTxJSUpNTkaj2tPU1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbW1tbMzYRtcHBwcHBwcHBwcHBqp+Pd3d7e3t7e3t7e3t7d0tDQ0NDQ0NDQ0NDQ0NHIubm5ubm5ubm5ubm6urelpKSkpKSkpKSkpKSkp4ZgY2NjY2NjY2NjZGRkZYSLioqKioqKioqKioqJkpmYmJiYmJiYmJiYmJiXjIuKioqKioqKioqKioigv7y9vb29vb29vb29vrSKioqKioqKioqKioqLh73m4eLi4uLi4uLi4+Pj4tjX19bW1tbW1tbW1dXV1dXV1dXV1dXW1tXV1dXV1dXU1NTU1NTU1NTU1dXV1dXV1tXV1dXV1dXV1dTU1NTU09PT09PVw5Fxa2pOU2JMTFZOPDo6Nzc+Qz44Pjo/P0E8P0A3Ozo7Oz07Pj46Ozw+PDs9Oz0/PkA8Pz89QEBAQT4/PD48QEFFQkJGQEA/R0hKS09GntrV1dXV1dXV1tbW1tbW1tbW1tbW1tfX19fX19fXzM5OJisrKysrKysrKysrIor06+vq6urq6urq6urr6dXS0tLS0tLS0tLS0tLUxKmqqqqqqqqqqqqqqqumhoSFhYWFhYWFhYWFhYpODBISEhISEhISEhISERNKVFNTU1NTU1NTU1NTUWJsa2tra2tra2tra2traVVTU1NTU1NTU1NTU1NOeq+qqqqqqqqqqqqqqqybU1JTU1NTU1NTU1NTU0uq8uvr6+vr6+vr6+vr6+nZ19fX19bW1tbW1tbW1tXV1dXV1dXW1tbW1dXV1dXV1dXV1dXU1NTU1dXV1dXV1tbV1dXV1dXV1dXV1NTU1NTU1NTT1MuYdmxpSk5fTVJVTT48PDc7QEM+Njo3PT87PUI/OTw5PTs8Ojw9Oz07PTs7PTw9Pj09O0E9PEFAQUE9PD88O0BCQ0FERT1BQENGS0tPRpjc1dXV1dXW1tbW1tbW1tbW1tbX19fX19fX19fX183OUisxMTExMTExMTExMSeN8+np6enp6enp6urp6unV0tLS0tLS0tLS0tLS1MWqq6urq6urq6urq6usqIiHh4eHh4eHh4eHh4eNUhIYGBgYGBgYGBgYGBcaTllXV1dXV1dXV1dXV1ZlcG9vb29vb29vb29vb21ZV1dXV1dXV1dXV1dXU36wrKurq6urq6urq6uunVhXV1dXV1dXV1dXV1dPq/Hq6urq6urq6urq6urp2dfY19fX19fX19bW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXV1dXV1dXV1NTU1NTU1NTRnHpxaUpUXU9SVU5EPj87PkBAODo7ODw7Ozw/Ojs7ODs5OTs8Ozo8OTs7PDs6PT09Pj1BPz4/Pz49PD0/PDxBQUNBREU8PkBFRkpLTUaT3NXV1dbW1tbW1tbW1tbW1tbX19fX19fX19fX19fNz1w5PT09PT09PT09PT01k/Dn5+fn5+fn5+fn5+fm1dHS0tLS0tLS0tLS0tPFra6urq6urq6urq6ur6uOjY2NjY2NjY2NjY2Nkl0iJycnJycnKCgoKCgnKVpjYmFiYWJiYmJiYmJhb3h3d3d3d3d3d3d3d3d1Y2JiYmJiYmJiYmJiYl6Fsq+vr6+vr6+vr6+vsaFiYWJiYmJiYmJiYmJiW6/v6enp6enp6enp6enp59nY2NjY2NfX19fX19fX19fX19fW1tbX19fX1tbW1tbW1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbW1dXV1dXV1NTU1NTU1qN7cWRJW2BOTlVPQEE/PURCPzs9Ojk7Oj09Ozw7Ojk4OTk7PDs8PDo6Ozw6O0A9PD08QEE8QUE7OzxAPzw9Qj9EQ0NFPD5CREZKTExFjdzV1dbW1tbW1tbW1tbW19fX19fX19fX2NjY2NjYzc3FwsPDw8PDw8PDw8PDwsnQz8/Pz8/Pz8/Q0NDQ0M/Ozs7Ozs7Pzs7Ozs/PzczMzMzMzMzMzMzMzMzLycnKysrKysrKysrKysrHwsPDxMTExMXFxcbGxsbLzMvMy8zMzczMzMzMy83Ozs7Ozs7Ozs7Ozs7OzczMzMzMzMzMzMzLy8vLz9PT0tLS0tLS0tLS09PRzc3Nzc3Nzc3Nzc3Nzc3U2NjZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjX19fX19fX19bX19fX19fW1tbW1tbW1tbV1dXV1dXV1dXW1dXW1tbW1tbW1tbV1dXV1dXU1NTU1Nevf3BeRl5iUFFXTkdGQ0NJQT89Ozw6PDhAQjw9ODo6ODk4Oz87PDw7Ozw8PDw/Ozw+Oj4+OD5CPD49QT48PkJAREVDQDw+QD5DSUlLRIfc1dbW1tbW1tbW1tbW19fX19fX19fY2NjY2NjY2M7Nz9DQz8/Pz8/Pz9DU0NDOzM3Mz9PS0s7Nz9LOzs7Ozs7O0dTU087Q1NLPztDU0s/Pz8/Pz8/Pz8/Pz8/Pz9DQ0NDQ0dHR0dHR0tPT1NTU1NXV1dbW1tbX1tbW19bX19fX19fX19fW1tfX19fX19bX19fX19bX19fX19fX19bW1tbW1tXV1tXW1tbW1tbW1tfW1tjY2NjY2dnZ2dnZ2dnZ2NfY2NjY2NjY2NjZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY19fX19fY2NfX19bW1tbW1tbW1tbW1tbW1tXW1tXW1tbW1tbW1tbW1tbV1dXV1dTU1dXYuIJvV0pfY1JRWktIQUE8Qj09Ozo+Pjw+Pz09Pzc5Ojk5Nzg+PDw+Ozs8Ozw7Pz09Pjk7Ozk9Pj9APkA9OzpCP0JDQj89PkA+QkVHSkKA3NbW1tbW1tbW1tfX19fX19fX19jY2NjY2NjY2NjOzs7Ozs7Ozc3Nzc7Kn8rNzc3N0LmDhIvH08Cay8/Ozs7O0bCDhJPPyZSo0tDGk6vSzs7Ozs7Ozs7Ozs7Ozs/Pz8/Pz9DQ0NDQ0NDQ0dHR0dLS09PT1NTU1NTU1dXV1dXV1dXV1dXV1dXV1dXV1tbW1dXV1dXW1tbW1dXV1dXV1dTU1NTV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjX19fX19bW1tbW1tbW1tbW1tbV1dbW1tbW1tbW1tbW1tbW1tXV1dXV1dXV2MCAblVPYGNXWVtMTENAPT07PTo8PkI+QkNAPDo4OTg6Ojo3Oz8+Pzw8Ozw6OT88PD04OTw/QT49PT1BQD07QUJAQkM+O0A/QUFJR0pBetvW1tbW1tbW19fX19fX19fY2NjY2NjZ2dnY2NnZzs7Ozs7Ozs7Ozs3SqY+t0c7Ozs6bt7akosCTnqzTzs7Oz8mburidrJ6rm7DQma2Zs9LOzs7Ozs7Ozs7Oz8/Pz8/Pz8/Q0NDR0dHR0dHR0tLS09PU1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbV1dXW1tbW1tbV1dXV1dXV1NXV1dXV1dXV1tbW1tbW1tbW1tbX19fX19fY19fX2NjY2NjY2NnY2NnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NnZ2NjY2djY2NfX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbV1dXV1dXV1dfIf29aU2FlXl1cT0pEPUA/Pjs3Oj45P0Q+QTk4Nzg5Ozs8ODk/PT08PTw+OzpBOzk7OTs8Q0A8Oz0+QEE+PUJEP0JDPT0/Pj8+SElIP3Xa1tbW19fX19fX19fX19jY2NjY2dnZ2dnZ2dnZ2c7Ozs7Ozs7Ozs7PyJ68ptLQ0M7KoJd+gsOmm6+n1M/Pz9HDoo9/isKUh5yexZOGnZ3Oz87Ozs7Ozs7Ozs/Pz8/Pz8/P0NDQ0dHR0dHS0tLT09PU1NXV1dXV1dXV1dXV1dXW1dXV1dXV1dbW1tbW1tbW1dXV1dXV1tbW1dXV1dXV1dXV1dXV1tbW1tbW1tbW1tbW1tbX19fX19fY2NjY2NjY2NjY2NjY2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnY2NjY2NjZ2dnZ2dnZ2NjY2NjX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXW1dXV1dXXzYhzXVhpaF5fYE9JRjpBQD4/PDw6Nj9CQEM6NjQ3Ojs6PDo5Pjw+PT07Pz08QT48PDo8PD08OjxAPUBCPj5BQj1DQz09Pjs/QUVLSEBw2dbW19fX19fX19fX2NjY2NjY2dnZ2dnZ2dnZ2dnPz8/Pz8/Ozs7O0qylp6nVwLzSx52PnsvTyYqZqtTPz8/Rv56KqNDUu8iYmca9yZaZxtDPz8/Pz8/Pz8/Pz8/Pz8/P0NDQ0NHR0tLS0tPT09TU1NXV1dXV1dXW1tbW1tXW1tbW1tbW1dbW1tbW1tbW1tXV1dXV1dXV1tXV1dXV1dXV1dXV1tbW1tbW1tbX19fX19fX19fX19fY2NjY2NjY2NjY2NjZ2dnZ2dnZ2drZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2dnZ2dnZ2NjY2NfX19fX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1tCQdVtbamlhXl1TTkk8Q0BBPkA+OjhGQT9DOjc0OTo6OTs7ODs9Pz4+PUE9PD9APT48PDw8PDo9QEA/Pz0+QkA/QEJAPEA9PkFFS0c/a9fX19fX19fX19jY2NjY2NjY2dnZ2dnZ2dnZ2drZz8/Pz8/Pz8/P0MydjZes0JqXysWesp6WzdatmarUz8/P0bqlrZye0tGUlp/O0ZGYoM7Q0NDPz8/Pz8/Pz8/Pz8/Pz9DQ0NHR0tLS09PT09TU1NTV1dbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1dXV1dXV1dXV1dXV1dXV1dXV1tbW1tbW1tfX19fX19fX19fX2NfX2NjY2NjY2NjY2NjY2dnZ2dnZ2dna2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjX19fX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dbSlHJeXmtramVdT0xHP0RDQ0A6PTs8Qjw+PTk2NDo5OTo6OTc7P0A7PD1APDxBPjw9Oz08Pzw6PENAPj07PUA+Qj5AQT5APUA/RklEP2bV19fX19fX2NjY2NjY2NjZ2dnZ2tra2tra2tra2s/Pz8/Pz8/Pz9OxooCbr8mgo7/KnKWMp63Yqpmq1M/Pz9HAoJ+Tpbyzn8Kb2q2jv53V0NDQ0NDQ0NDQ0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NTV1dXW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tXV1dXV1dXW1tbV1tbW1tbW1dbW1tbW19fX19fX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnY2NjY2NjX19fX19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW0pNwYF5waGZlWlFIR0JFQ0BANzo6PD46PDk3NjU5OjY6PDs3PEBAPDo6PTo9Pz49PDlAPDw6Ojk/QD49PD1AQUM/QD8+QTs/QEZKQj9i0tjX19jY2NjY2NjY2NnZ2dnZ2dra2tvb29vb29vPz8/Pz8/Pz9DOn5BsnJbXqqPT0q6mtZif1aqZqtTP0NDQ0qavrpun0IuTnsfLiJWeyNLR0dDQ0NHR0NDQ0NDQ0NDQ0NDR0dLS09PT09TU1NXV1dXW1tbW19fW1tbW1tbW1tbW19bW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbX1tbX19fY2NjX19fX19jY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NnZ2dnZ2dnZ2dnZ2djY2NjY2NjY19fX19bW1tbW1tbW1tbW1tbW19fX19fX1tbW1tbW19KTbmBccWRnZFpVSkBDRkNBQjg7Pzw9Ozw8ODU1ODk2ODs6OTw6Pj88PT05PD8+PTo6Pjk8Ojo4Pj88PT08PkBBQ0E+PDw6QkRESkZCXdDZ19fY2NjY2NjY2NnZ2dnZ2tra29vb29vb29vbz8/Pz8/Pz8/RvZ/Dt9aXwNPR0NLK0s2Xm9SqmavV0c/Q0NHJ18SYodDapZmz0NuimbXV0dHR0dHR0dHR0dDQ0dHR0dHR0dLS09PT1NTU1dXV1dbW1tbX19fX19fW1tbW1tbX19fX1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NnY2dnZ2dnZ2dnZ2dnZ2dna2drZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NjX19fX19fX19fX1tbX19bW19fX19fX19fX19fW1tfRkWxdXG9naGJdT0ZASElHRUA8PD4+PD0+PDc1Njo5Njk7Ojo7OEA/Ojw8OTw+PTs7Oj85Pzo7OT0+PT07Oz08QENCPz8+O0NGRkdIRFnN2tjY2NjY2dnZ2dnZ2dnZ2tra29vb29vb29vb29DQ0M/Pz8/Pz8+VfnulktSimtPMkpejm6HYq5mr1dKXptXFjZ6gnqCSp5mgrZComJ671dHR0dHR0dHR0dHR0dHR0dLS0tLS0tPT1NTU1dXV1dbW1tfX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbW19fW1tbW1tbW1tbW1tbW1tbW1tbW1tbX19fX2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dra2tra2trZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2dnZ2drZ2dnZ2dnZ2dnY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fX19fX19bXz4xkVl5wa1xgYE5FSE1JSU9DPjpCPT1AQjs1NTc8Ojc6Ozo6Ozk9PTk6Ojk9Pj89Ozk+Ozw6PDs5Pjw+Ozw9PkBDQj8+QTxBQ0dGRkVVydvY2NjZ2dnZ2dnZ2dna2trb29vb29vc3Nzc3NzQ0NDQ0NDPz8/Q0dWnma3Jo6i+yp2xnaO12ambqdi4q6HJwaGtoaOlpqSooK+noqmc0NPS0tLS0tLS0tLS0dHR0tLS09LT09PT1NTU1dXW1tbW19fX19fX19fX19fX19fX19fX19fW1tbW1tbX19fX19fX1tbW1tbW1tbW19fX1tbW1tbW1tbW19fX19jY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2dnY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NnZ2NjY2NjY19fX19fX19fX19fX19fX2NjX19fX19fX2M2GXVdib2RPXVRLSEZTUUtMQD49RDw/Q0Y9NTU3Ozk2Ojs6PD06Oz86Ojk4Oj09Pz47Pzs+PTo7OT47PTw9PkFEQkA/Pj88QEFFR0VEUsXb2NnZ2dnZ2dnZ2dra2trb29vb29zc3Nzc3Nzc0NDQ0NDQ0NDQ0NDTuYC905uWz9S1i5Gf09S8gbvUzpSg09WrjY+q1pyRjrrVmpGOvtbS0tLS0tLS0tLS0tLS0tLS09PT09PT1NTV1dXW1tbX19fX19fX2NjY2NfX19fX19fX19fX19fX1tbW19fX19fX1tbW1tbW1tbW1tfX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2dnZ2dnZ2drZ2dra2tra2tra2tva2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY19fX19fX19fX2NjY2NjY2NjY2NjX19nLflpVampbTF9NSkxKVUxGQjw9P0dGSEtIPTY1Nzo5Nzk6Ozo8PTk+OTk6ODs9Pj5BPj05PDw6PT4+Oj05OTo/RUFAPj0/P0JAR0VERVDB3NnZ2dnZ2dnZ2tra29vb29vb29zc3Nzc3N3c3NDQ0NDQ0NDQ0NDQ0NHB0dHKyNLQ1MS40tLR0sLS0NPHzNLR1MG+1dPTucfW09O4yNXS0tLS0tPT09PT09PS0tLT09PT1NTU1NTV1dXW1tbX19fX19fX19jY2NjY19fX19jX19fX19fX19fX19fX19fX19bW1tbW1tbW1tbX19bW1tbW1tbW1tfX19fX2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb2tra2tra2tnZ2dnZ2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnY2NjY19fX19fX2NjY2NjY2NjY2NjY2Nfax3dcUmdpWk5aTkxQUVdFSj8/PT9BRUxMQD43NzU7ODg5OTo7PD48Pjg6Ojk7Pj9APT4+OjU6Ojs9Pzo7OTo8PkJCQD8/Pz9BQkdEQ0ROvN3Z2dnZ2dnZ2trb29vb29vb29zc3Nzc3N3d3d3Q0dHQ0NDQ0NDQ0NDQ0tDQ0dHQ0NHT1NHR0dHT0dHR0tLR0dHU1dLS0tXU09PT1tTS0tLT09PT09PT09PT09PT09PT1NTU1NXV1dXW1tbX19fX19jY2NjY2NjY2NjX19fY2NfX19fX19fX19fX19fX19fX19bW1tbW1tbW19fW1tbW1tbW1tbX19fX19jY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2trb29ra2tra2tra2dra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dra2dra2tva2tra2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY28FzWFVpa1NMUk5QUllURkk8PkM/QUJFSj4+Nzg2OTc3ODk5Ozs9P0A8PTg5Ozs7Pz48PDk1Oj0+Ozk5Ozw/Pz9CQkE9QT1AQUJGQkJCS7Xe2dna2tra2trb29vb29vb3Nzc3Nzc3d3d3d3d0dHR0dHR0dHR0dHQ0NDQ0NDQ0NHR0dHR0dHR0dHR0dHR0tLS0tLS0tLT09PT09PT09PT09PT09PU1NTT09TU1NTU1NTV1dXV1dXV1tbW19fX19jY2NjY2NjY2NjY2NfX2NjY19fX19fX19fX19fX19fX19fX19fX1tbW19fX19bW1tbW1tbW19fX19fY2NjY2NjZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2djY2NjY2NjZ2dnZ2dnZ2djY2NjY2Ny8b1RUbGxMS1JKVFJVS0ZEOj5HRERBREY8Pzg5Ojk1OTk6Nzw9Oz5APT03OTo7OT47OTk2Njo9QEE+Ozw5Oj4/Q0E+P0I9PkJDRUJBQkqw3tna2trb29vb29vb29vb3Nzc3Nzc3d3d3d3d3dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dLS0tLS0tLS0tLS0tLS0tLT09PT09PT09PT09PT09TU1NTU1NTU1NTU1NXV1dXV1dbW1tbW1tfX19fY2NjY2NjY2NjY2NjY2NjY2NjY2NfX19fX19fX19fX19fX19fX19fX19fX19fX1tbW1tbX1tfX19fY2NjY2NjY2dnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnY2dnZ2dnZ2dnZ2dnZ2dnZ2NjctmtTW3BrS1VXUlxRV0hEPjxCSkU9SEo/PTw3ODg6NTk4OTY7Pjw9QDw8NTk5PDo/Ozk4NDg8PT1BQTw+Ozo8PkA/PT5BPT1DRkdCP0JJqt/a2tvb29vb29vb29zc3Nzc3Nzd3d3d3d3d3d3R0dHR0dHR0dHR0dHR0dHR0dHR0tDP1NDOz9LS09LS0tLS0tLS0tLT09PU1NTU1NTT1NTU1NTU1NTU1NTU1NTU1dXV1dXV1dXW1tbW1tfX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fY2NjX19fX19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NnZ2dna2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ3bBkU2FyX09aVFdfUVJHQj1FSUxBQUxEPz87Ojg4OTM4Njg2OT49Pj89OjY6Oz47PT06OTY4Oj07QEA8QD89Pz9CPjw+PDxCRUdJQj5DSaTg2tvb29vb29zc3Nzc3Nzc3Nzd3d3d3d3d3d7e0tLS0tLS0tLS0tHR0dHR0dHT09G5u8y6m5y60MjT09LS0tPT09PT09PT1NTU1NTU1NTU1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW19fX19fX2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX19fY2NjY2NjY2NjY2dna2tra2tra2tra2tra2tra2tra2tra2tvb2tra2tvb2trb29ra2tra2tra2tra2tra29vb29vb2tra2tra2tra2tra2tra2tra2trZ2dnZ2dra2dnZ2dnZ2dnZ2dnZ2d6qX1VgbltVWVFaXk9MR0NGTUlGRERKO0FBOzw4ODY0ODY5ODc8P0E/PTo3PD8+PD8/Ozo2ODg9PUBBPUA+QUA9QDo7Oj49QUVHSUJAQ0ee4dvb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3e3t7e3tLS0tLS0tLS0tLS0tLS0tLTvsDKmqCilYiRnqqTqc/U09PT09PT09PT1NTU1NTU1NTU1NTU1dXV1dXV1dXV1dXV1dbW1tbW1tbW19fX19fX2NjY2NjZ2dnZ2dnZ2dnZ2dnY2NnY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX19fX19fX19fX2NjY2NjY2NjY2dnZ2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29va2tra2tra2tra2trb29vb29vb2tvb29vb29vb2tra2tra2tra2tra2tra2tra2dnZ2dnZ2dnZ2dneolxVXm5YXl1OWlBUTkNDTElJSUZKRDxCQTw7ODc2Nzk3Nzk5PT9BPzw6OUA/PD5CPzo4Nzc2PT8/QD1AQT8/PD07Ozg+PD9FSUhBP0NGl+Hb29vc3Nzc3Nzc3Nzd3d3d3d3d3d7e3t7e3t7T09PT09LS0tLS0tLS0tLUyJWcrpuZtYl9k4yCgYTE1dPT09PT09PT1NTU1NXV1dXV1dXV1dXV1dXV1dXV1dbW1tbW1tbW1tbX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjX19fX19fX19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29ra2tra2tra2trb29vb29vb29rb29vb29vb29ra2tra2tra2tra2tra2tra2tra2tra2trZ2dnZ3ZpaWGFuWWFXT1dNUEVCRExJTUtGSUU+QkQ5ODg2Nzk3NTY5OD09QT46ODk+Pjw/QD88NTY3Njw+Pz47QEBAPz4+Pz47Pz5BQkZHQkBDSJHi29vc3Nzc3N3d3d3d3d3d3d3e3t7e3t7e39/f1NPT09PT09PT09PS0tLS08+ofpGsj5KOjIaAiImEkKPK1NPT09PT1NTU1NXV1dXV1dXV1dXV1dXW1tbW1tbW1tbW1tbW1tfX19fX19fX19jY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2NjY2NjY2NfY2NjY2NjY2NjY2NjY19fX19fX19fX19fX2NjY2NjY2NjY2NjZ2dnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29va2tra2tra2trb29vb29vb29vb29vb29vb29vb2tra2tra2tra2tra2tvb29va2tra2tra2trZ2tySWlljblpaUlVeUEw8QEdOSFJJSEU+O0hGODk3NTc4NzU4OTg7Pj49Ozg5QT49QD9BPjc1OTY7PkFCPz9AQEJCPz4/PkFAREFGSEI/RUqM4tzc3Nzc3N3d3d3d3d3d3t7e3t7e39/f39/f39TU1NPT09PT09PT09PT1rWlmoiLkIWAhYuIgYOKi3+GwtbU1NTU1NTU1dXV1dXV1dXV1dXV1tbW1tbW1tbW19fX19fX19fX19jY2NjY2NjY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tna2tra2tra2tra2tra2trb29vb29vb29vb29vb29vb29vb29vb29va2tra2tra29vb29vb29vb29vb29vb29vb29vb29ra2tra2tra2tvb29vb29vb29vb29ra2tvbiFpbZ2pcWExaX1ZIOkxITEpKQ0VGQ0BMSDc6NzY3ODg1ODc4OTw8Ozs5OEA/PT4/Pzw2Nzw0Nz9CQkFAQD8/P0E9PT9APkBARkU9PURLiOLc3Nzc3d3d3d3e3t7e3t7e3t7f39/f39/f39/U1NTU1NTT09PT09PT1MWSgoOFhn2Bgn18eX6BgoN+pNvW1NTU1NTU1dXV1dXV1dbW1dbW1tbW1tbX19fX19fX19fX19fX19fY2NjY2NjY2dnZ2dnZ2dnZ2trZ2dnZ2dnZ2dnZ2NjZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY19fX19fX2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2tra2tvb29vb29vb29vb3Nzc3Nzb29vb29vb29vb29vb29ra2tra2tvb29vc29vc29vb29vb29vb29vb29vb29vb2trb29vb29vb29vb29vb29vb29rb2YBaXm1oWlNJXVtYSkRNSEpTTEdGQUA/SkI4OzY2OTk3NTg2ODs6Ozo8OTg9PTtAPTs6NjU8Nzs9QkBBQTw+PUBBPTxAPz8+QkRFPjxES4Pi3N3d3d3d3d7e3t7e3t7e39/f39/f39/f39/f1dXU1NTU1NTT09PT09iyhJCofYN5doSIf3t3eYJ+fouuwNXU1NTV1dXV1dbW1tbW1tbW1tbW1tbX19fX19fX2NjY2NjY2NjY2NjY2NjY2dnZ2dnZ2dnZ2tra2dnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dra2tra2tra29ra2trb29vb29vb29vb3Nzc3Nzc3Nvb29vb29vb29vb29vb2tra29vb29vc3Nzc3Nzb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3NZ5XFpsZlhST2BRUkFIR0pGWExGQEBDQ0s/Ozs3ODg3NjU3Njg6OTw8Oj07Pz07PT48Ozg4PDk9P0JBQkM8PD9BQj49QUJDQkRFQ0A7Q0x94d3d3d3d3t7e3t7e3t/f39/f39/f39/f4ODg4NXV1dTV1NTU1NTT1NK7np91inl7iICAgoWBg3JzgIWDjKzX1dTV1dXV1tbW1tbW1tbW1tbW1tfX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2NjZ2dnZ2tra2tra2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tvb29va2tra29zc3Nzc3Nvc3Nzc3Nzc3Nzc29vb29vb29vb29va29vb29vb29vc3Nzc3Nzc3Nzb29vc3Nzc3Nzb29vb29vb29vb29vb3Nzc3Nzc3Nzb29vb293Qcl1fcGVXS1BjT0tCR0NKSEtGQTxBPUhQQTo6Nzc4NzY3ODc8Ojg9PTw+O0A/PD89Ozo7OTo5PEBCQEJDQD1BQD89QEJDQ0FAQD9AO0VNeODd3d3e3t7f39/f39/f39/f39/g4ODg4ODg4ODV1dXV1dXV1dTV1NfIeIuFfIKIeoOEgX6CgnNpdIWLhpCd1NbV1NXW1tbW1tbW1tbW1tfX19fX19fY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra2tra2tnZ2dnZ2dnZ2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2tra2tra2tra2trb29rb29zc3Nzc3Nzb3Nzc3Nzc3Nzc3Nvc29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29veympcY3FlUk9YXks/R0xJT0tFQD5BQj9JTz45Ojc2Ozc2Ojs3Ozo4Ojw8Pjs9PTs+PDo7ODk6ODlBQkJBQEA7QEI9Oj5BQkM/Pj0+Pz1GTnTf3t7e3t7e39/f39/f3+Dg4ODg4ODg4ODg4ODh1dXV1dXV1dXV1dbOnYaZfn+Tk4p/goF8fYJzcZuJgIKDicDZ2re00NfW1tbW19fX19fX19fX19jY2NjY2NjY2NjY2dnZ2dnZ2dnZ2drZ2dnZ2dna2tra2tra2tra2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2tra2tra2tra2tra2tvb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb38BjWlttYFZQU1NKRExITUhJPD5BRENGTkQ8PDk3OTo2ODs5Nzw5ODk8PTs5QD46QT88NzU3Ozg6QEFFQT8+OT1CPzs9QkJCOj49Oz0+Rk5x3t7e3t7f39/f39/f4ODg4ODg4ODg4ODh4eHh4dbW1tbW1tbW1dbYy4qAh4WDl4x4e3t5b32BdWt3m3R2e3iJx8aYjK3Y2dfX19fX19fX2NjY2NjY2NjY2NjY2NjY2NnZ2dna2dnZ2tra2tra2tra2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2djY2NjY2NjY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tvb29zc3N3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vc29vb29zc3Nzc3Nzc3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3dzc3Nzc3OC3Y1dZa2JSTVVRTEpLRktGQ0A+QkE/RU0+Pj04OTk6Nzk6NzU9Nzc6Pjw7O0I8OT89OTY2OD05OkBCRkA+PTxAQkRAPUA/QztAPTw+P0ZPbdzf3t7f39/g4ODg4ODg4ODg4ODh4eHh4eHh4eHW1tbW1tbW1tbX1a2Gend9q595eHp7c3R/g35vcXt5enN7dpOKhYCJpM3Z2NfX19jY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2trZ2tra2tra2tra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2NjY2NjY2NjY2NjY2NjY2NjY2NnZ2dnZ2dnZ2dna2tra2tra2tra2tvb29vb3Nzc3Nzd3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nvb29vb3Nzc29zc3Nzc3Nzd3d3d3d3d3d3c3Nzc3Nzc3d3d3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3c3NzhrWFbXmxiUk1WTE1HS0tERkJCO0E9PEVMQ0E+ODo5Ojc3OTY2OjU7PkA7PTs/PTw/PTo5OTo8OTxFQ0ZAPz5AQ0JEPTk9P0E9Qj89QD5HT2nb397f39/g4ODg4ODg4eHh4eHh4eHh4eHh4uLi1tbW1tbW1tbX0Jh/kIeDfXqDdnt1c3p5epCqpndycn6Hh4eAgH6ChISRyczZ19fY2NjY2NjY2NjY2NjY2NjY2NjZ2dnZ2dra2tra2tra2tra2tvb2tra2tra2tra2tnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnY2dnZ2dnZ2dnY2NjZ2dnZ2dnZ2dnZ2dra2tra2tra2tra2tvb29vb29zc3Nzd3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc29vb29zc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3c3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc4aVfVGJtYlBPU0lIR0ZKSUlCQT5CQjxFRURAPjg6ODs3Nzo3ODg2Pj89Ozw5PTw6Pj07OjY3OzY6REFGPj8/Pz5DQT87PT0+O0RDPz48SE9n2eDf39/g4ODg4OHh4eHh4eHh4eHi4uLi4uLi4tbW1tbW1tfY2Mh+dnaDfn50dniGgnp5dXecobuhhIKAgH6Hiop8f4GGjJyoztjY2NjY2NjY2NnY2NjY2dnY2NjY2NnZ2dna2tra2tra29va29va29ra2tra2tra2trZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra29vb29vc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t3d3d3d3N+aW09na1xQUVBJQ09KS0dMR0pCQD9BR0RAQTw4PDg4NTg5NzY3N0BAPzs8OT49OD08PDo3OD05P0RDRj5BP0JAQz88Oj49Pz5FRD89O0tRY9fh3+Dg4ODg4eHh4eHh4eLi4uLi4uLi4uLi4+PW1tbW1tfVwdy0bnhyc3twenl2hYiEe3h9gIGYpYx/fH57kYWWi4aBg4GOkb3d2djY2NjY2dnZ2dnZ2dnZ2dnZ2NnZ2dnZ2tra2tra29vb2trb2tra2tra29va2tra2trZ2dnZ2dnZ2dnZ2dnZ2tra2dnZ2dna2tra2trZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra29vb3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7d3d3ejVhXaG5ZUFFLSEpTSU1ITUlLQUM/Q0ZCQUQ6Ojw4NjQ4ODc2NjY/Pj46PDk8Ozo9PTw8ODs8O0REREU+Pz5CPkI/OD0/P0NDQkBBPjtMVGPV4d/g4ODh4eHh4eHi4uLi4uLi4uLi4uLj4+Pj1tbW1tbXrJS2enhyb3eVe3R7i4B4dW5+hYN7f4WIcnx9m5yOiYqCfoN9h5Oax9TY2NnZ2dnZ2dnZ2dnZ2dnZ2dnZ2dnZ2tra2tra29vb29vb29vb29ra2tra2tra2tra2trZ2dnZ2dnZ2dnZ2tra2tra2tra2tra2tra2tra2tra2tra2tra29ra2tra2tra2tra29vb3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3e2X9ZYGhsXFFLR0dPS05OT01ERkJIP0NIRERAOjs7ODc1Nzc3ODU4QD5AOzw5PDs8Pjo5Ozk5OzlGREVCPEA+PzxAQzs+QD9AP0I/Pjo7SlVj1eHg4OHh4eHh4uLi4uLi4uLi4uLj4+Pj4+Pj49bW19fbyoWEd3Fybm54lYR7eIR/eXZweHN3i5GOgnZzfYqGiHd3dXeDg3yIiJPD29nZ2dnZ2dnZ2dnZ2dnZ2dnZ2dna2tra29rb29vb29vb29vb29va29ra2tra2tra2tra2trZ2dnZ2dnZ2tra2tra2tra2tra29ra2tra2tra2tra2tra29vb29va2tra29vb29vb29zc3Nzc3Nzc3d3d3d3d3d3d3d3d3d3d3d3e3t3d3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39J1WWhpalZOSkhNTkdNRFBJRkg/RT1GTERDPjs7PDk3Nzk2Njk1OD4+Pz07PEA7PTw6Nzs3OTk4R0RFQj1BPUI/PkA8P0FBP0BCQD47PEtUYtTi4OHh4eHi4uLi4uLi4uPj4+Pj4+Pj4+Pj4+PX19fXxJJ7iX9vbG51dn6EgYOKhn51cm1lbYiGio6Ee3ODh4p7eHuDj4+BhIqKsc7a2dnZ2dnZ2dnZ2tra2tra2tra2tra29vb29vc3Nzc29vb29vb29vb2tra2tra2tra2tra2tra2tra2tra2tra2tra2trb29vb2tra2tra2trb29rb29vb29vb29vb29vb29vb29vc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d7e3t7d3d3d3d3d3d3d3d3c3Nzc3Nzc3N3d3d3d3d3d3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f397e3uHJbFtqampTTkdHTk9FSEZNSUlAO0Q+SElAPTw6Ojo4Njg6Nzc5NDg9PD09Ozg8PDw8ODY3ODk6OkVCRUE/QDxCP0NDPj5DREFAQD9APD1LUWHT4+Dh4eLi4uLi4uLj4+Pj4+Pj4+Pj4+Pj4+Tk19fX2al2hX58d2xwd3l4fIx9ioWAd2pzdHd6fW6Le355en6Ef4CBg354fH6Hhpa209rZ2dna2tra2tra2tra2tra2trb29vb29zc3Nzc3Nzb29vb29vb29va2tra2tra2tra2tra2tra2tra2tra2tva2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29zc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f3t7jvWphaWtpUU5GTUxLSlhNTkdBQEBPQUM/QDs8ODk5OTY4NjY2ODQ7Pjw9Ozk2Ojo5Ojk1ODk4OTpCREY/Pj4+QEBAQj88QUA/PD4/QTk+Sk9e0uPh4eHi4uLi4uPj4+Pj4+Pj4+Pj4+Pk5OTk5NfX19rKioSAeXNvbXFzdXeAlHh2gHx1h4V3dXJ1oJl6e3d2eXaEdG1sbnt4gJqLk7vc2tra2tra2tra29vb29vb29vb29vc3Nzc3Nzc3Nzc3Nzc3Nvb29vb29ra2tra2tra2tra2tra2tra2tra2tvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb3Nzc3Nzc3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3t7e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/e47NpaW5paFBQT0xMT1JPS1NGP0VEREQ+PDw4Ozg3OTk1Njg3NjczOj47Pj03Oj45OTk5Njo6ODc8Q0VHPz87Pz5APT5BPTs9PjlBQEA4QU5RXNDk4eHi4uLi4+Pj4+Pj4+Pj4+Pj5OTk5OTk5OTY2NjY2rmOgHp2dW5qb3hwgX1rdHJ2d4SFeYeHeZWOeXl6dXd6c2tvfIB8dn2IfICy3tra2trb29vb29vb29vb3Nzc3Nzc3Nzc3N3c3Nzc3Nzc3Nzc29vb29va29vb29va2tra2tra2tra2tvb2tvb29vb29vb29vc3Nzc29vb29vb29vb29vb3Nzb29zc3Nzc3Nzc3Nzc3Nzc3N3d3d3d3d7e3t7e3t3e3t7d3d7e3t7e3t7e3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODf39/f3+Kqamtoa2RTUE9GUFRSTkhSSz5ERENCOzs5Ojo4Njc4NTY2ODc4NDs/PD89OTw8Nzs6Ojc6Ojc6PUNCQz1BPj88OT0+QUA7PDw7RUA+O0NOU1zQ5OHi4uLi4+Pj4+Pj4+Pj4+Tk5OTk5OTk5OTk2NjY2daeb3Z7b3h4dnBudHdwcHRwc29+iXN6hoWNhHpzbXKAeoZ9b4OTgXZ8fYOGtd3a29vb3Nvb3Nzc3Nzc3Nzc3Nzc3Nzc3N3d3dzc3Nzc3Nzc3Nzc29vb29vb29vb29va2tra2trb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t3d3d3d3d3e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODf39/ioG1oZmtmVVZSR1BRTktMTEVCSEVHPTg9PDo6Nzc4Njc3NjU2NzQ4Pjw9PTo4Ojg+Ojs3ODc3Ojo+Q0Q7Q0I+PTg9QEFDPz48PkU8Pj1CTVBf0uPh4uLi4+Pj4+Pj4+Pj5OTk5OTk5OTk5OTk5NjY2NzAdnaAgn56eHhwbHV5cmt/fWxzb3RnaGmAf2loeHNnfomJeHCChnt3fX6Fir3d29zc3Nzc3Nzc3Nzc3Nzc3N3d3Nzc3Nzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vb29vb29vb29zc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg35RrbWZuZlNTSVBZVExIRk5GRkVCRj07Pjw7OTc3ODU3OTY0NTc1ODw7PT46Ojs7QDk7Ozg3Ojk5QEJBPEFBPz85P0BCRUNBQEBDOzs9REtNYNbk4uLi4uPj4+Pj4+Pj5OTk5OTk5OTk5OTk5OTZ2drZmHN7qoSWgnJ0dXZ9eGhsfHdoeHdua3B0eYCDdnR8gYSCfXNwgIp/eIJ/eYPI3tzc3Nzc3Nzc3Nzc3d3d3d3d3d3d3d3d3dzd3d3c3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzb29vc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f3+Df39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4duLbm1nc2NZUU1VW1dIQ0lGTktHQkQ/P0I6Ozo2Njc1Njc2NDg3Njs8Oz4/Ojw5PEI4Nzk6Ojo5OkFBQkFCQ0BBPj0/QkNDREFCRjk4PURKTmLY5OLi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl2dna3KhxgrV4kX5zbHpuhIF2gn1raGp/g3h2fHV9hYV0ZnB5fXd9eoCKhXt9fH6AtN7c3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3c3d3d3d3c3Nzd3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3dzc3d3d3d3d3dzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/e3t7e3t/f39/f39/f39/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4ODg4ODg4OLYhW9xa3VhVk9VVVxPRE1GPkpHSkVEPD9COjw5ODY4NDU2NzQ3NjQ5Ozs8Ozg+OzxBODg6PTg9ODo9PUBAQD9BQj9APkBDQkNBQUU3NjtETE5j2uTi4uPj4+Pj4+Tk5OTk5OTk5OTk5OTk5OTl5dva2t2ebG5zcYWNcm1wbn9/dYR+a3J2dnpzeIF4c291cG1rdnx5hYiAf39/dnKDg7Hf3Nzc3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3dzc3d3d3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzc3Nzd3d3d3d3d3d3d3d3d3d3d3d3d3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHg4OHh4eHh4eHh4eDi14VtcW92XlJXU1paUUpIQ0BRQEJEPDk/QTo8OTc1NzQ1NjY0NzU2PTw6PT05Pjo8QDg6Ojw2Ozk7Pj1CQkI7QUJAQ0BARERDPD1ANzo8RUtNZdzj4uLj4+Pj4+Tk5OTk5OTk5OTk5OTl5eXl5eXTzsbAfnFsb3h7dm91bmpzc22ShnhudHRub3SGf29rcG6CdG12cn2Ng3Zxf3d5ioGm39zc3N3d3d3d3d3d3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3c3N3d3d3c3N3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d7e3t7e3t7e3t7e3t7f397e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4OHh4eHh4eHh4eHh4eHh4eHh4taGbnBtcWBSWVBXX1lKTExJUj9EPTk7QkY7Ojk3NDU2NTc1NDY2Nj49Oz8+OT05Oz44PTs6NDg7QEBDQkNBQkZBP0NAQUJERDs9Pjk7PEJMTWTg5ePj5OTk4+Pk5OTk5OTk5OTk5OXl5eXl5eXlube1qHNybHB3enR3eG1xcnV3f4R0cnNsbGtxfG5wbnRrgX9xgHd9hIN+eYBzcoGKoNnd3N3d3d3d3d3e3t7d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7e3d3d3d7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4eHh4ePVh3FsamxeWFpVV2BWVlBPUEw9QTo7PEZBODo4NzM2NTY5NjU4NTc/PTs/Pjk9ODs8OT07OzU6PUNCQjxDQ0REREFBPz5CQ0M8PT44OTxDS0tjzdHZ4dbI2OPk5OTk5OTk5OTk5OXl5eXl5eXl5bW1tqtyeXJufX92dXdoamhpcG92bWtrZ2VmcXRteYBubXl3doh4cWtqaHV1eXR1f8Hf3N3d3d3d3d3d3t7e3t3d3d3e3d3d3d3d3d3d3d7e3t3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3t7e3t7e3t7d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4N/f4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHh4eHh4eHh4uLh4eHj1YZxcGNpYVdTWVdfTFJPUk1LQD44OTtBPjg3OTY0NzY3OjY2NjQ5Pj86PD86Pzk6Ojc6PTw5OTxBQT07QUNFQ0ZAPj4+QUVEPkBBNzg+RkhKXrK1uMG5tbvI4OXl5eTk5eTl5efn5+fn5uXm5ua2trW1jn1+cHqEdXJ2Z2JjZWxrcm9maWx2bXeGfYV5bGx3eGt2cHx9eHN1eXx3doe54N3d3d3d3d3e3t7e3t7e3d7e3t7e3d3d3d3d3d7e3t7e3d7e3t7e3t7d3d3d3d3d3d3e3t7e3t7e3t7e3d3d3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uHh49WHdW5ebmNaVFNYV0tTS0pNUkdBODs7Pjw5ODc1NjU2Njk2ODY2OT88Oj09Oz86Ozs5PDw7OTo+Pj47PD1BREJDQUBAQT9CQzw8PTc7PkRFSl6xtbS1tre3tsvayd7l5d3g4t7V1NbT1ODj4N/ftra3rod7f255jXpydW1jaGxsbWl0eHpxeXp6iIeDemlofXFkb3F8hoF+eXt9fHuGp9re3d3d3d3e3t7e3t7e3t7e3t7e3t3d3d3d3d7e3t7e3t7e3t7e3t7e3t7d3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHh4eHh4eHi4uLi4uLi4uLi4uLh4ePWhnZsYW9fXVdZXFpSUEhKV0xFRz1APTs7PTk2NDY1NTU4Njc2Nzg/Ozk9PTw8OTk8Oj48Ojk4PkI7Oz4+QERAQ0VBQEA9P0A8PT01OTxCR0ZdsbW1tri5ubm6vbjD09K9wcHAuru8urvEzMW/w7e3t4RpdYF9Z3WHeWd1cWtreXhwd3x9eW1pd3t4d25pdY+BcGx5eHd3fYF7hoJ5gKDc3t3d3d7e3t7e3t7e3t7e3t7e3t7d3d3d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f397e3t7f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4N/f39/f39/f39/g4ODf3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4eDh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uHj14Vya2d0YVtYWF9eU1VVUVVKTEY/SUQ7OT02NjQ3NzU3ODc3Nzg5PDw6Pjw4PDo9Pjk7PDk7OT9BPD0/Qz9BQEVCQkE8PUNAOj48NTQ5REdHWrG1tba3ubm5ubm5t7m5uLi5ubq6urq5ubq5uru3t7l/bnBzem9wf3lzbnN1bHN2eHFxcG9rb3F+gXNph4SBfXRzh3VtdYWJgYBydoWn3d3d3d7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f397e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4N/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4OHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLh49eJcWtscltXV11gVFFVVFBST0pDQE1BPTs5NjUzNDY0Njg3Nzc5Oj47PD47OTw6PDw5PD08Oz09Pj1DRERAQ0JBP0A+PD5BPDg9OjY2OkJKSFixtbS2tri5ubi4ubi3t7i4ubq6ubm4uLi4urq7t7ise3J4cX92c35wbG16cmdvbG1udHB7d3dycnd6b4aSdn98fHp2eXx/c32HcnWt09/d3d3e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg39/g4ODg4ODg4ODg4ODg4ODg4OHh4eHg4OHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eLi4uLi4uLi4uLi4uLi4uLi4uPXh29qcWpVVldhW09RUlBOV0lERElKPzo5Ojc1MzQ5NTc2Njc4ODo8Ozw+Ojw6Oj08OTs8PTs9PTw7PURHRENBPDw8PD4+QDs4PDgxNTpBRkVWrrW1tba3uLi5uLi4uLi3uLm6uri4t7e4uLm6u7e5qnJweHd8e3uCd2hucWpvamNpcn9tc3J+eHRxbGp2gHl9gIB/dXaAdWuKi4B2kdXf3d3e3t/f397f397e3t7e3t7e3t7e3t7e3t7e3t/f39/f39/f39/f3+Df3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f39/f39/g4ODg4ODg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4uLi4uLi4uLi4uLi4uLi4uLi4uLj2IZtbHRlVlBcZ1hNWFNSUVlFQ0tQTjs5ODg3NTUzOTU2Njc2ODg5Pjk9Pjk8OTk8OzY4OTk6PEBAPT5ARkBCQkA6PjxBPT87Ozs2MTY8QkdEUKi2tbW2tra3uLe4uLi4uLi5urm4uLe3t7e3ubq3trSJcnd4fYl8cHpvfXNoamxnZ2x0bHF3dHFsdnNxcXdxcnx5eIN2e3dpi5GKfZDO393e3t7b2Nna2dve39/f3t/g3t/f39zb3Nzd3t7g4N/g4ODg397e3t/Y0t/e39/e3t7f397e397f397e3t7e3t7e3t7e3t7f39/f39/f39/f39/f39/f39/f3+Dg3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHh4eHh4eHh4eHh4eHh4eHi4uHi4uLi4uLi4uLi4uLi4+Pi4+Pi4uLj4+Pj4uLi4uPi5NeDaGd1ZFZVZGVXSlpZV1tUPUVNS0g9ODc1NzY0Mzk0NDc3NTY3OT06PT48PTw5Ozw5OTo+OTw+Pz5BQUNBRUVEPjs8QT48OTw7NzM3PkRIRUqhtrW1tbW1tra3uLi4uLe3uLi4t7a2tra2t7i5tra2i316bGx6f3BseXZuamhnZXF6eG9pb29wdXNtc3eBZ299goGDcn95anByen+p4N/d2cvGv7y9v77CzdLQ1t7Z3ODX0M3DwsPDx9XX09nc19TY19DHxMXHvbzPys/O2N3Yztzd3Nrd09Hc3t/f3t/e3t7e3uDf39/f39/f39/f39/f39/f3+Dg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODh4eHi4uLi4uLi3+Lj4uHi4OHe1tvf0sPKycfR29zi5OHh4Nna3tbGxMXEzdra3+Th4uLa197LfWlmcWFZXmVhTUxUS1JaTDtITUhGQT03NjY1MzQ2NjQ4NzY1Njk8Oz4+Oj45OTw5Nzk7Ozo+PTxAQENEQkdGQkE9PENAPTk8Ozc3Nz9ERkZGmba0tbW1tra2uLi4uLi4t7i4t7O1tre2t7e4ubW2t6KXcW9vcGludHZxZmVja25nb3JtZmdrcoFlb3Z8gHhkc49/c2hxcmllZW5vsN/Rxb+7ubm5ubm6urq7ur3NxsPHv7q6urq7u7vBwr3Bxb28v768u7q6ubm6urm5usPFw7nAw8G8v7m3v8/P1N7Y3N7f4N7S2uDf3+Dg4N/f39/f39/f39/g4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4eHg4ODg4ODg4ODg4eHh4eLi4uHg4eLi4uLh2trd0cLDwrvF09bg3cnTw665wLGqq6ursLS2ydLF0cSxuL+0q6urrK+0tLzMxNXOtLS7q3hsbW1gXWJfWUtTVVRRUERAUU1IRD86Nzg1NzMxNTY0OTg0NjY6PDs9PDg8OTY6Ojg4OTc1PDw8P0BBQEJEQ0JBPD5CPz89PT03NTg+Q0VDQI+2tLS1tbe4uLi4uLi5ubi3tbGrra+zsbOzs7S0tLamnotrbnt2cXl4Z2NoX3F3YWtub2hvfW9uY2tpbHh3bGuGfmxwenZtbHBvebHGvLq7u7q5ubm6urq6urq6urq6urq6urq6u7u6u7u8u7q6urm6u7u6urq6urq6urm4t7e4uLe3trW1tbW4t7vHvsPFx83EuMDJx9Lc2dnf3t7g39/f3+Dg4eDg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4ODg4dzY4uLi4uHh4eDh4N7XxsbR0M7U3t7TztLf0ri4vLKtraysrK6xvrmut6yoqampqqurq6qqqqusrLisqqqqq6urq62urq6urq68s62sq6R5bm9tX15dXVRNUlNcVEpBP1BJSD44OTY4MzczMDU3Mzc4NTc2Njo8Pzw4OTs6Ojo4OTo2NTk7PD4/RD9DRUJDQj9AQEE/QD48Nzg3OkFFRD+FuLS0tbW3uLi5ubi4t7e0rqyrqqqtrq6ur7Cxs7O1o3BubnJtcIN9dWlhZWhmZGNkcXNtbXduZ2ltbWVwc29vc3FzfIeBenV9dZ+7urq7u7q6ubm5urq6urq6urm6urq6ubi5ubm5urq6uru6ubm5ubm6urm5urm5uLi4t7e3uLi3t7e2trW1tra2tbW1tbW2tbe3t7e6wb68xsnK29/g4N7b3d3e4eLQ1uLh4ODg4ODg4ODg4ODg4ODh4ODh4tO+vMzY3dzi4NHZ28S9t7CwsbGvs7u7s7C0vbOurq6tra2trKuqqqqpqaipqampqaqrq6qqqqmpqKmpqampqamqqqqsra6urq6urq6urK2keGlicWZhWVpWUVJOXFNGPUJSREE3PDs2OTU2NTQ1NjU4NzU2NTc4Oz48Ozk5OTo4Nzc5NzY4PDs+O0Q/P0NAQURBPj9DPT48Pjo6Nzc/Q0Y+eLKws7S1tre4t7ayrq6trKurqqmqra2srK6vsbO0tbeMbnJ0amiAeWZqZmVsXWhucGhscWJjZnKCfnZoaGxqbnqGgYV8eHFxeYCvurm6urq5ubi5ubm5ubm5ubm5ubm5uLi3t7e3t7i5ubm5ubi3t7e4ubm4uLi4t7e2tra3t7e3t7a2tra1tLS1tbW1tra1tba3t7e3t7e3t7a3uL/Gz9DEvr/AxNfXvMna2uDh4ODg4eHg4ODg4eHg297e1M28t7a3usDAycS3yL6ysLCwsK+wr66urq+wsK+urq6urq2srayrq6uqqampqampqampqaipqaipqampqaipqaipqaqqq62sra2trq+uraytoXlqZG1nYlxYUVBRS1RKQjpJUT9BNzw5NDo1NjU0NTU2ODg2ODY7Ojk8PT07Ojg2Njg4Ojg2Nz49PT0+QUFFQkJDQUFAQTo9PT89OTo3PUFHPGyqpqirrbCxsK6rqaiqq6upqampq6ysra2trrCztLW4pYCHb2lnc3Rma3BtamRsb3Jua21ja3B8iYRuamx8eGN7in5zanNua3GPu7m5ubm5ubm4uLm5ubm5ubm6ubi4t7e3t7e3t7e4ubm4uLi3tra2t7e3t7e2tre2tra2t7a2trW1tbW2tbS0tLW1tba2tra2t7e3t7e4uLi3tre2tri5uLi3t7i+vri6vb3H2+Dh4NjZ3eHh4N3XysHDwrq5ubi3uLi4t7W0tLSysrGxsbCwr6+vr6+vr6+vr6+urq2trKysq6usqqqpqKipqaanqamnoaWoqampqKKfoaGcoqeop6mrrKytrq+wsK6trp14cGxqYWNgWVFNUUxSRkM5TVBFPjg7NzI3OTY3NDQzNTc4Nzk3Ozo6PT08Ojo5NzQ6OTg2NTg/P0BCPURDQ0NBQ0BCQUA7QD9APzw8OjtDSD1jqKWlpaaoqKinp6eoqaqpqKioqaqqrK2usLCws7S1tbWlmHZ+cWZreHFvbWZlbGhjbGdmaWl9dW1pb312eYVmaHdveG9xb3J4p7u5ubm5ubm5uLi5urm5ubm5ubm4t7e1tbW2tra3t7e3t7e2trW1tra3trW1tba2t7e3trW0tLS0tLS0tbS0tLS1tbW2tra2tre3t7e3t7e2tra3tra3t7i3tre4uLe4uLi4uMDF08q8vMPNz8jAvbq5ubm6urm4uLi4uLe1tLS0s7OysrKxsK+vr6+urq6vr6+vrq2srKyrq6ysrKunoaCeoJ+bnaGhnZaZpKSmqJ+ZmZmZmp2foJ+en6Sqra6vrq2trKyZdXBpa2NhXl1VTlNLUkREOE5LR0E6ODUyNjk2NTQ3Mzc3Nzg5Nzk6Oz09Pjg4ODc1Ojk5NTg/QEBBRD5GQUJDQEJDQkE/PEBCQkA9Pjo6REY+XKalpqampqamp6inp6ioqKinp6mrq6ysra2trbS0tLW3pHN9dW5zjX9yZmpxY2ltY2hmaGxudWlfY2d1c3Z6bmdwcHJ+enGIobu5ubm5urq6urq5trO2tbi5tra1tba2tbW1tbW1t7a2t7a2trW1trW1tbW0tLS2tre3t7W0tLOztLS1tbS0tLW1tba2tra2tre3t7i3t7a2tra1trW1tra2tra2tra2t7a2t7i4t7q4uLi4t7i4ubm5ubq6urq5uLe3t7e1tbS0tLOzsrKysbGwsK+urq6urq6vr62trKyrqaWkpqaknJmbm5qZmpqZl5eXl5eWmZuYmZiZmZudnp+fnZyeoKSlpKOjoqKikHRuY3BhXl5bVFNUSFRKPzxRQkZDOzg2Mzc6NTU0ODM4OTk3ODk3Ozk7PTs3Ojc1Njk5ODU4Pj8/QEU+Qj8/Qz88QUFCPz0/REE/Pj05PUNGP1Wkpaamp6inqKmpqKeoqKioqKioqqyrqqmoqau1tbW2uaN3inFyh4Z3dHBoeWtiY2FlbGluc2pfY2VjY2Vqa2Jkamx2l41+qL25t7a3ubu7uri1sayrq6qusKysq6utraurr7Cxr6+wsrW1tre1tba1tbW1tbW1tra0r6+ztLS0r62ur7K1tLW1tbW1tre3t7e3t7e3t7e3t7ezsLK2tbS2tra3t7a2trW1tba2t7e3ubi4uLe3t7i4uLm6urq6ubi4t7e3tbW0tLS0tLS0tLOzsrGwr6+vr6+ur6+tqKOioJyampqamZmam5uampqam5qZmZmYl5eWmJmZmZqcnJ2fn6CfoKCgoaGgoKCfn4t0bml0XWBmXlJUS0RUST1FU0hFQjs6NDQ2OTQ0NTczODg4Nzg5OTo7Oz89ODo5MzU4OTYzOT0+QD9AOkBCQkJAP0BCQj89PkFBQj89Oj5FQ0BRo6alpaeop6mrqqimqKioqaeoqKiop6eoqKmqtbW3t7eymbR/fZCMdWdpamxmY2BjaGVveHBpYnF8eXBqZmZkZmtzaoWMrLaysK2trbS3srCwrayrqqmoqKeoqampqaiop6ioqamnqKqrq62trKqsra2srK6ura2rp6Wkp6qsqKSjpKWpsLGxs7W1tre4t7e1tba3uLe3t7eyqaWmrKuor7S2tbO1t7e2tbW1tra2t7e3t7e2tre3t7e5urq6ubi4t7e1sbO0tLSysbCurKusrq6wsbCtq6qpqqioo5yamZiZmJiYmJmZmZmZmZqamZubm5ycm5mXmJqanJycnZydn6ChoaKioqChoKCgn56KdWprbllcYVZLT0RHVUc+T1dIRD08ODM0NDg0NTQ4Mjg5ODg5Ojo8OTlAPDY5OjM2NzkxNDw/P0BAQTpDRkVCQURCQ0E6Oz9BQkM/QD1ARENAT6OnpqWnpqiqqqqmpKanp6ioqKiopqamqKurrbW2t7e3uK2ydXB7g3ZgYmlrYmVmYWRnZn2IeWxygH1xb3F4Y21ucWaPrKyrq6usrK2urqytraysqqelpqWlpaaoqKioqKWnqKioqKinqKmpqaelpKOioqKjoqCioqGioaCgoaGio6Sjo6WlpaiwtLOzs7Crqqmqs7S2t7axqKWjoqGhoqSoqqmoq7O0sa6usbO1tra2t7i4t7e3t7e3t7e2tri3tLGuqaanq6ypp6alpKSkpKSlqKmmo6Cfnp2cnJubmpqZmZiXl5mZmZiYmZqampqampqam5uZmJqcnZ2dnZ2bnKChoKGjo6KgoKCgn56dhXRrbGhXWFNKR01FSE1HQFNXRkc9PTkzNjM3NDU1NzM4Ojo6Ojk8PTo6QTw2PTgzNzg4Mzc7QD8/QEA6QkVDQEJEQ0E/OzxAQ0JDQUA8QUNAPU6ip6amp6epqquppKWlpaWmqKioqaamp6ipqaq1tra3t7e4s3Noe3NiZ2praWliYWRpaF1dbXxyZmtyf3x0fG5tc3N+oKmpq6urqqutrayrrKupqailo6Smpqalpqenqqmmpqenp6iop6eoqKelo6SioaGhoZ+enp+fn5+en6ChoaOlpKOjpKSkpqenp6alpKWmpqanqq2rpqSioaGgoaSlpaWnp6WnqKimpaWor7S2t7a1tba2tbWzsKyrqamuq6ilpaampqWkpKWlpaalpKSkpKWioaGhoJ6dm5ubnJuampmYl5iYmJiYmZqZmZmZmJmZmZmamZmcnZycnJycm5yfn5+goaGioKCgn52dnIBza25kXlNKSE1GRExLRURRU0NHPTw4MzYyODQ2NDY0ODk4Ojs5Oz48OT07OT03MzU5NjU2PEA9P0A/PD9CQz5CQkI/PT4+QkNBRUA/Oj5FQDtPo6alpKanqKmnpaSlpaSlp6enqKimp6empaamtbW2tra1trmKbXFtb3x8cWdqZmBhbGBUTltoam5vbYGCfXFncXZ+mqinqKqpqaqrq6yqqqqopqWlpKKjpaampaWlpqmqqaalo6Slpqako6OioqKioKCfn56enJycnJydnZydnp+goqGio6OioaKipKWkoqKjo6Sko6SkpKOhoJ+hoqSmp6eoqamnpaWkoqSkpaitsLCsq6qrrKqpp6WlpqWlpaWmpaaoqKmopaWlpKSkpaSjo6SjoqGhoaKioJ6dnJybm5uamZiYmJiZmpuZl5eXlpaXl5iYmZqanJuampqbm5ubnJyeoKChoJ6enp6cnJt+em5yYl5TTUpQRUZOTUJAT0U+STs9NTM2MzgzNjY3NTo7ODk7OTo+PTs6OTo+NzY2OTY1Nj5CPj5BPz0+Q0E+Q0NAQDtAQEJCQkVAPjs+RT88UKCko6Sjo6OkpKKkpaWkpaampqenpqampaampbS1tbW0tLW4gWh8fWVzgnpscHVhX2NUTk9RW2hsaWxscW1ucW50nKKkp6ioqKmrqqqqqqmnpqWko6Ojo6SkpaampaesramkoZ6dnqOkoZ6en6CgnpydnZycnJqampubnJybm5ucnZ6en6CgoaCfoKGjoqCho6Sko6KkpaWlpKKfoKOkpKSmqamop6WhnZyfo6Woqamop6ioqKmnpqWlpKSkpaampqampqanp6WlpKOjo6OioqKhoaKioaKjpKKfnp2dnJqbm5qamZiXl5iWlpWUlJSVlZeYmJqbm5ybmpqampubnJubnJ6fn56bnJycmpuaf35xdGBbVE1HTUhGTEo/P05DPEA7PDQzODM3NDc2Nzg7PTg6Ojk5Oz07Ozg5PTc3ODk1ODg/QD0/QT47PUQ/PURAPz86QEFBP0FFQD48PEM/PE6doqGioqCgoqWkpKSlpaanp6enpqampqWmpqW1tbW0tLS0t4x2pbF3ZnNyb3NsY2RpWE9SUU9PXYBtZGBabZGRkqKio6Wmpqanp6ioqKempaWko6KhoaGio6WnpqanrKynpqCdnJuhoZ6bmpqdnJmYmpuampqZmZmbm5ubmpqampqbnJ2eoKGgn56foaCen6KjpKOjpqeop6iloqChoaGhpKWlpaSgnJmZm56jpqampqamp6anpqWjpaSlpaaoqKenp6WlpaWlpKSjo6OioaKioqKioaGio6OioJ+enp2cm5ybm5mWlJSUk5OTk5OUlJSVlpeampubm5uamZmampydnZ2dnZ2bmpqampmal393b3NdWk5ISk5HRUZJREVOQDw9PTw0NTs0NjQ2NTY3OTs4OTk4OTk8Ozw3Ojs3ODg4NTg4P0I/QUE8Pj9APDxCQEE+PUE+Pz89QkFAOjpAPDxPnaKhn6CfnZ+jpKSkpaanqKinp6empqampqaltbS0tLS0tLW0l7andWZ4dmNsY2NlY1tSU1NSTV6gjHhYaHaWo56eoaGjo6Ojo6SkpaampaSkoqGhpKOjo6Kjpaalpqanp6afm5qboqCZlpaVmpuZl5eYmJqamJiampqam5uamZmZnp2doKKjo6OipKSlop6hoaGio6WmpqWko6GgoJ+foaGfoKCdmpiXmZqcoKSjo6SlpqempaWjo6SkpKSlp6empqampqWlpqSjo6Oko6Kio6Shn6ChoaChoKGgn5+enZ2cmpiXlZOSkpKSkpKTk5KTlJWWmZqam5uampqam52enp6dnJycm5uampmZmZR9dGx0XlpPSEVHRkJFTkU/Rjs6Pj87NDY6NjkzNjQ2ODg6ODk3ODg6PDs8OTs7Ojo2Nzg5OT4/QD48PUA+QDo5QEE/PUE/P0FBPkFBPzo5PT46UJ2gn52bnJybn6KjpaWlpaeoqKempqamp6amp7S0tLSzsrKxsLCtq5B4ho9+m5p/d2JdU1JRUUxioKKLWoigoJ+dmJmcnJ2dnqGhoKSnp6alpKKho6empaWioqWmpqWmp6amoJuZm6Ggl5OTkpeanJqXl5eYmpqZmpqampuamJiZmqCgoKChn6GioqSmpqKeoJ+foKGjpKOioZ+enp6cmp2bmZqamZiXmZ6goaGioqKipKWlpqSkpKSioqKipKWlpaWlpaWmpaWjpKOioqKhoKChoJ6fn5+fn56fn6CfnJuamZeVlJSUk5GQkZKSkpKSkpOUlZeYmZqZmZqampufn56dnJycnJqZmZqYl5eRfHJncV5dUEY/QUQ/Sk9CQkY4Q0U+Pjk4Ozc3NDg0NTk6Ojs5Nzk6PDs6PD0+PDw6Njc2OTg+P0E+Oz8+PTw4Oj5BQEFCPz9BQkBEQT46OD5BPFOcnJubmpqcnJ2hoqOio6KkpqempaWmpqako6OysrCtq6empqempaaopZ+oqKeqp6F5hFxRUk9MXJyggGKZoJ6dnJWTlZaXmZqdnZ6hpqampqSjoqKmp6emo6WmpqWlpqempqKdnJ6hn5eRkZCUl5udmJaWlpibmZqampqamZeYmpuhoZ+en56cm5yeoKCenZ+en5+goqOko6Kgn56dmZaXl5eYmJmbm56ioqKioqKhoqOlpaSjoqOkoqGhoaKjpKSkpKOkpKSkoqKioaKhoJ+foJ6dnp6dnZ2dnZ6enpuZmJeVk5OUlJOSkI+RkpGSkpGSk5SWl5eYmJmampqcnp2dnZybm5qYmJqZl5WWjXpqZmpgYk5GPj9APUpFQENAO0BBPDo7OTo3NjU4NDY3ODk9ODg7Ojs/Ozo7PDo5Ojc3Njg7Ozs9PDo6PD08Nzs+Q0JEQz89QUNAREE/PDpAQjtXmZiampmZmpubnJ6dn6KioaKkpaSkpaakoqCeqKempaalpaWnpqempqampKWmp6inoalyTlFNSlSWoXpympycnpyXlZSVlpiYl5eanqKioaKjpKSjo6WmpaWmp6akpaampaWjoKChoZ+ZkpCPlpqZnpyWl5eXmZucnJyampmXmZubnp+dnJ2cmZmanJ2cnZ6en5+foaGgoKGioJ+em5eVlZWXmp2en5+hoaKioqOjoaGgoKCdnJ2hoqKjpKSjoqGkpaSjpKOko6KioqKioaChn5+dnJ2dnJydnZydnp6al5aWlZSTk5KSkpKQkZKSkpKRkpSVlpeYmJiYmpucnJycnJydnJuZmJmYlpSVl4t4bGNkYmRRR0E9QztLSEQ6Ozs8Pjk6Ojk6NzM3OTU6ODg4PDk4Ozk9PTs6Ozo5PDw3NjQ3Pzw6PTs8Pz48Ozg8QUNBQ0JCPj9CQEJBQDo/QD87WZmYmpqampubm5ucnaChoaGhoaKioqKioZ+fnaSlpqanp6WlpqempqalpKSmpaSkpKWmhlBSUE9Pj5hwepqbm5yenJycnJubm5mYmJuenZ6en6CjpKKhoaKioqOkpKWmpaSjo6GhoZ6cmpWTlJibmpuempiYmJianJ6cmpuYlpmcm5ycnJycnZqam5ydnZ6enZ6en5+dnJycoaGgm5aVlZWWnKChoJ+foaCio6KjoZ2bmZaWlpaYnJ6goqeopKGgoKKjo6KioqCgoKCfn5+foJ6dnJubnJ2cnZyZmpyblpOSkpKSlJOSkpKSkpKTkpKSkZKUlZaXmJiYmJmanJuam5ubnJyamZiYl5WVlpeHd2RnaGRiTUNFPEQ5SUpFOTo7PT06Ojg4OjY0Nzk1PDk2ODk3OTw7Ozw6Ojw7Ojw8ODc4Nz49Oz4+OkI/Ojo6P0FEQkNBQUA/REFBQD46QD49OluamJmam5qbm5ubnp+goKGioqCgoJ+fnp6dnZylpKWmp6alpaampKKioqOjpKOio6Oip5ZUWFVSTmdta4GempubnZ+goJ+enp6enZydnZyenp6foKGgn5+goKChoqOjo6Ojo6KhoJ6bmZmYmZmZmpmYnp6YmJmZmpualpWXlpWYnJydnJudnZ6cm5ydnJ2em5ianqGhnZubnaCioZqVlZaWmaCioJ2bnqCho6KfnpuXl5SSkpSXmJmdoKKnp6WhoJ+eoKGhoqGgn56dnJybm5ybm5qamZqcnZyZl5mWlZORkJCQj5GSkpKSkpGSk5OTk5OTk5SVlpaXl5eZmpybm5ybnJyampmXl5aWlZWUhHJmbGJkW0RCTD0/OEZLQjxAPj49OTs5Oj04NTg4Njs4NTY6ODw8Ozs8PDs5PDo9PTk1ODc8OTw/PDpBPzo6OkBAQ0JEQUNAP0NBQD49PEA9PTpfmpeZmpiXmJqcnJ+fn6GhoaCfn5+en6Cgnp2dpaSkpKOjoqKjo6Gfn6GhoqSjoqOkoq2nV15dVFdfbmuNnZqam5yenZubnJ2fnp2cnJycnZ2foKCgoaGhoKChoKChoqGhoqGfnpyampqam5yamZqbmZyemZaWlpeXk46OkJSWm5ybmpubnZ+dnJycnJyenZaUmZyfop+cnJ2foaCbl5eZmZqcnJybm52en52al5aWlpSTk5SYmpqan6ChpqaloJ+en56goaGgnpybm5ycm5ucm5uamZiZmZmZl5eYlZSSkJCQkI+QkpKSkpGRk5OWmJeUk5KUlZSVlpWWmZmZmpudnJycmpqZl5aWlpaWkIBvb2VeYFdASkg4PzdJRT9FQTw9Ozo6Ozs7NzU7ODY7NzQ2Ojo+Ozo9Pj49Ozs7Pjs6ODo5OTZAQT06PD06Ozk/QUNCREVDPj9BQT8/Pj4/PTw7YJeVl5eWlZeZm56hoaChoqKgnp6enp6goJ+dm6Wlo6SkoqCgn6CfnZ2foaKjo6OjpKGwo11lZGBhbmuBnpybm5ubm5mYmpydnpybm5ucnJyeoqShnqChoaKioaCgoKGhoJ+fnpyamZqbm5ucm5qdnZuZmpyYl5WVlpGOjY+SmJ2cnJucnJ6gnZybnJycnpqVlZuen6GfnZycnp6dnJqampqampqam5ual5eWk5KVlZaVk5WWmpuamp2en6Klo56en5+fnp+fnp2en52cnJuanJqam5qYmZiYmJiYmJWUk5GQkZCQkJGSk5OQkZOUmJmYlZOUlZWVlpWWl5mZl5manp6cmpiYl5eWlpeXmI19bm1fZVZURUs8Nz43UkVDPkJBODs8Ozk4Ojg2Ozc3OjY3OTo9Pjo8PD0+PTw9Oj89Ojg8PTk7QD4+Pz0+OTk7P0JDQENFQz0/Q0I+QEA+QD08PGGVkpSVlpaXmpyeoKCgoKGgoJ6enp6eoJ+enpulpaSjoqCfn56dnZuZm5ycnZ6foJ+eq5hjaW1uaWZtnp2cm5ucm5qZmZmampubnJubmpucoKOkoJ2enp+goKCgoJ+goaCgn56bmpmampubm5ubn56cmZiampiYmJiSjo+Tl5ydm5ydnJycnJ2cnJ6enZ6alZecoKGhn56dnqCfnJybmpqam5qamJqZlZOTk5KTlpeXlZSYmJmbnJycnaCfoJ6enp6fn5+enp+io6SioJ6enJuampqbmZiZmZiXl5aVlJSTkZGQkJGSk5OTkpKTlJiZmJaVlJWWlpaWlpeYmJiYl5mampmXl5eWl5aXlpeJeHZnXV9XVEVFOTk7PFk+QDhCPzk7Oz45ODs4Ojs3OTo1ODk7PTw5PTs9Pjw9Pjs/Pzs5Pjw8Pj8+QEFBPTg3O0JDRT9BRUM9QERCQUBEOzs+OzxilpOUlJaVlJaYmJmbm5ycnJ2dnJydnp+enZyapKSkpKCfnp6cm5uamZiYmJmbnJ2enKaJZWt0eG1bhaKdnZycnZyam5qampqcnZ2dm5qbm6Ciop6bnJ2cm5ydnp6dnZ2dn56cmpqbnJ2cnJucnJ6enJuamp2ampuclZGTl5udnZydn52cnJycnJ2en56fnJeYnZ+hoaCenJ+gn5ybm5uam5qZmZmZmZeVlpWWmJeXl5aWmJmbnp6dnZ+hoaCfn56en5+fnZ+foaKioaGfn5+cmZuanJ2bmpqZl5aWmJeXl5aVk5KRk5SUk5SUlJSWmZiWlZWXmZiXmJeXl5eXmJeYl5eXl5aWmJeXlZeXg3h2X1tdXlE9Rjo5OD9VQ0E7Q0M6PD4/Ojo5Nzs4ODg3NDg5PDs8ODs7PD06PT46P0E9Oj08Pj5AQD1AQT45NjxEQ0VAQUVFPT5FREQ/Qjs6PDk6ZJeUlZWWlJSUlJSVl5iYmpmanJycnZ6enZ2cm6OjpKOgnpybmpmamZiYmJmYmpubm5uliWtxdnpvZZqfnp6dnZycm52enZydnp6dnZycnZucoKCbmpqbm5qbnZyampqbnJybmZmcnJydnZ2dnZ2dnZ6cm5qfn5ucnZuZmZmbnZ2dnZ+dnZ+fnZycnZ+fn5+bmp2foKCfnZyeoJ6bm5ubm5ucmpqbmpmbnZyamZiXmJiYmJqdn6CgoKCfoaGhoKCfnp+fn56en6GioaCfnp6fnpyampubm5qamZaWl5mZmJiYlpSTlJSVlZOTlZWUlZaVlZWUmJmbmpmWlpeVlpiYlpeTlJSRkZOMkZCTln14amFiYlxQPEA8NjhDVkhEQjo4Ozo+Ozc3OTY9Ojk5NjQ3Ojs8PTk6Ojs/Oz09PEA+Ozs+Oj0/PT5AQT9APDc7QUNFPz9ERD4/RERDPkI9Ozw7OmeWk5OTk5OTk5SUlZaXlpeWlpeZm5ucm5ubmpmjo6Kgn56bmpiXmJeXl5iZmJmcm5uapIBqam95c3GXoJ6dnZycnZ6enp6fnp6dnJycnZ6dm5ybmpqampubm5mYmJqampmZmZianZucnZ2dnZydnJ2dnJuanZ+bnJybm5ybm52dnZycnZ6dnp2cnZ2dnJydnZubnp6enZ2cm56bm5ycnJycnZybm5qZm5qZmJmZmJqZmZqcn5+fo6Win6GioqGhn56goJ+fn56goqGhoZ+fn5+dmZqbnZ2amZiVlpeWlZWWk5KTlJOUk5CQkpORlJGPjpCRjpWWm5iVmJSZl5SYkYyQj5Ock5KMhYyHg4Z3cWdqZFtcUUE+ODZCR2BCRUdAPjs8Ozo4ODY1PDg6ODM0OjY5PT05OTo8PTs8Ojw+PDo+QDo+QD48P0A/Pjw4OkNBRD8+QkQ/PkNFQj1CQDw8PDpnmJOSkpOTkpOUlZSVl5eWlpWWl5mZmZqampqapKKgn5+dm5qZmJiYl5eYmZiZnJ2dnKh9Z2Vze3pziaKfnp6dnZ6enp2dnp2enp6dnZ2enJucm5qbm5ubnJuYmJiZmZiYmZmZm52cnJ2enp6enp6enZ2cm5udm5ycm5ydnZ2dnZydnZ6fn5+dnJ2dnZuam5yZmZydnZ2dnZubmpydnZycnJ6dnZ2cm5mXlZWXl5iampubm52en6KjoaChoZybnJubm52anJmcnJ+gn52YmZmZlJKSlJeUj4+PjpGMjYmLkIuJi46RkY+JkJiYkJKMjYuSkI+YmKKoqqalpayjpqGanqensqiilaOgn5d/cHFpbFxbXE1GPDc3R0dYPkhOVEY5Pjo4OTg3NT05ODczMzk2Oj48Ojc6PDs6Ojo6PDw7Pz47QEA+Oz0+QTw8NjdAPkJAPkFGPjxBREE9Q0I+PTw5ZpiUk5OTk5KTlJWTlZeYmJiWl5eYmZmampqamqKhn56dnJuZmJiYmJiYmJmZmZucm5ysf2pten95cYehnp6dnJ2enp6enp6enZ6dnZ2enpybm5ybm5ubm5ubmZiYmJiYmJiZmZydnZycnp6enp6fn56enZ6enZycnZydnZ2en52dn5+eoKCfnp2dnZ2cm5ydnpuam5udnp2enZubm5ydnJ6dnJ2amJeUkY6PkJCRlZiUlpSYmZqbnZibmJWNjI6Ok5KSkY+JkI6RkY6PiouNjY2IiIuPi4ONjZGPjJCNkJOVlZyYoaCckp+koqSpmpuXmpyjqa29wcG6vLi9urnAvLm6t7q7u7S9s8G1f251ZmdaXllMSUU6O0xJUzxWUklDOkE6Ozs3NzU6Ojo4MjU2ODs9PDk5Ozs8Ojc6ODo8Oj0/OTw/Pjw8PUE7OTU4PDtAP0E/RD08QUJAPERDPT09OmGTk5GQlJSTk5OTk5SXmJaXmZiZmJmam5qampqfoJ6fn5yamZqampqZmJeYmZmZmZmZqYVwdXuAd2+JoZ6enp6en5+enp+en5+enZ6en56dnZydnJubm5ubm5qYmJiYmZmYmpudnJydnZ6dnZ6eoKCfnp2eoaCenZ6dnp2en5+enp+gnp2enpycnZ2dnJuamJyblZiampiYmJiZkoyQl5Sgl5OPjI2KioiJjIiTkYeQj42KipCQi46KjIuPiIiJiY6Rjo2GhYmGioaFi4iPkpCQjZCSl5aSmpidk5SepKamqquxrK+vq6arqrG5ubW0tK6sr7TAyMXFwb7Gw8TEw7q1vre2tLOwtrW+qnB0clxmX11dSUY/P0VLTFZJXExEPz1COkM5OTc3Ozk5NzE3OTg6Pjg4Ojw8Ozk3OTo7PTo+Pzk+QTw7Pjw+Ojk2OTw6QT5DQUE9PEJAQD5CRD4/Pjlch4SDh4uNiomGhYGKjJGTlZiYh5WWlpKYmpqZnp2foJ+dmpqbm5ucnJuYlpiZl5eYm6qOenV2e395gqCfn56foKCgn5+fn6Cgn56dnZ6fnp6dnZyam5ubm5ubmJiYl5eYmZubnJycnZ6enp6cm5udnZ2cnKGhn52enZ2dnZ6dnZyYlpaWmJWVkpaZlpORioyPj4yPjZCLi4+PlomIhIuRmY59hYuNj42Mh4qMkJuMkY+Pi4qOk4yMjYyIkouMhYmMj4aLiIeNioWMhI+Kl5CTmJqVm5yjqqGipJyiq7G3tLm1sbOtr7KypaezurG6ury2t7bAw8O9vby2v7q6vMG1uMC+tK+upqmvt5pufGdbY1pdX0hFPkFLSVNYWV5BRjk5PTlGPz86Nzs7OzYzOjc6OT44Ojo8PTk5ODs5Ozw6Pj07QEA7PEI8QDo4NDc8O0I/QUI+PjtDRERAQ0M9Pj45YZmVi5GFjY+Wkoh5fXt/hYuDioKKiYZrgHiQi5aakZ2dlJSRk5aXmpqYlpONkpOSkJubiHZ3c3F9f3KRoJ2bm5ucnp2dnqChoJublpabnJqcm5ybmJmamJiZmpqalouQk5aZmJWYmJabnJeVkpGNkpGQlJOSl5uZmJuXj46Qi46NgoeLi4uKi4iNkYyHh4aKiImRioeMhIWKjYuKjYSPlJCMg5CTlJmVj4uUk5GVkZaVjo+RjJSNjo+KiI+Hj4aHiYmJjYqJiYqFjYeOiZiSlJqbl5igoaegpKOaqqmztrG1sKipoqiurZ+qr7Cttbm4vMK/wcS4sbWwrrazsLi+vLq8vrqzs6ext8KQdYBjYl5aV1JNSEZFUElZV19bQ1A6QkM9R0Y/ODc6Ojc1NTk3PDk8OTg6PT46Ojc7Oz47Oz07PT9BOz8+PD86ODUzNzpBQUBCPj46Q0RDP0FDOz0+OWeppaKimZ+goqaXlIiNgoiCdYeIioiKe3t2e3p5j3qIkn59fHp+gpGFgYB9c3x/fXyEh350cHh2c3x2gY+IiImHiIqMjJGYnJeIjoSLjYuIjZCPj4uRj4uMjo+QkI6LhYWHi4yMh4iLjouHjIWGgY2LhoqKf4mKhoiYkYiDiIOChXyLi4yGiYuIipCMiIuNj4yPloeJi4qOjY2NlpOTnZycmpacnJuem5qbmJ2Xk5GVlpCSkYuPi5aUjI2Kg4uEhImMkJCKjoqNi4qRiY2Tk5OUlZOSnJmel5+gn6Wir7GprqSkn5ikraamuLesrLu9vcLDwL+/r6WtsLC0t7iztLi2tLWurLSvuLS2gXl6Y2ZgXlZQUUFFS09JXF5fVEdHQktMQkRAPTg4Ozk1Nzc5Nzs3PTw5PT49OTs4OjtAPDo9Oj5CQTg/PDo/ODY0Mjk7QkA/Qj49OEFCPz5ARDtAPjdgpaCal52hmqGgj5eXn5eVgo2gn6OhnZqSjoyMcnFwb3ZxbnBtbnB2bm9vcGhwcXB0fnNxcnF3e3J5dndycnd2ent5fH17f4iBhIt/j5GGjYuLhoqLi4mGhIGGgoCCiZGDgIOMf4aPi4mFgId9gIGSkIaEhIaNg4SMj4+PiI2Ph4uIkZCVkY6QipOXjo+VmKekn52VmJaWpZ+bnaumqre1uLKxp6+qp6ahn5qdlpKVlZGKj4yJk42blY2Li4aGiYyVkJCQi5mSlZWUm5CYk5SMjZGMlpeVopWepqmrp6OjqrCbnKafpquhtL2+s7O/ubu7urm8va6orrGusLi8s7SxsaqwqaixsbKopXdydF9oYWBUVlFJSkhWTV5eXlRMSkVRSkVHQz06OTk3NDg2ODM4OD06PTw+Ozk7ODo7Pzw8Pjk/Qz84Ozo4PDc3NjM3OUU+P0M/PTdAQEE9P0Q8Pj04VI+MhoeHlIyVmZeclpmWjZWclpWcnaCgnZqYlnhxbm1yeHFxbG5ycGtxb3BtcnN7dXZ3eX51cXh2dHd7cm5/fIF9eXh9f3mDhoOFgoOQi5CLi4uOj4uJiYWCgX1/c32IgH6ckISFhYmLj4p6fX2Gjo2Kho2UkYuQl4+Ul5KYoZael5Wbp6afoKCmsKuho6W1tLKqpqqvorG2ub3Cu7nDvry4vbi1saywrKWbkpOZn5uUj5OVjpqdnaCan5+XnaOqrKGfnputoaeqsKmmpqSYkZGVlKOkoqykrLO0s7Oot7a7uLCyr62tsre2urK1urO3ubu4vLq2sq+ssbGys7SzsbGtrrOxs7OsoZd2cXNfY15SUVRNT0lHWE9aXGRUTkdVT0VESkQ+ODo4NzU4ODg1OTc6Oj08Pzo4PDg5OT07PT06Qj4/ODs6OTo5ODYyNTdCPj9EQEA2Pj9CPzxDPD0+Ok5/fIKOjIyTk5eXmo+Ulo2WkZGUl5Oamp6hnZxyb3JxcXFxcXBuc3FvdXRycXZ3gHV3fHmFfnd7fHl9f3yAiYmJg316f4eBiImBgICBhoiBhouGiIWEiIiJhICCf3p8fH1+kpB/iHiBhYuKg4SFio+MjZGZnZSUlKCamp+irbGtqaSlra+srKy1rr65ra6ptbC3sauxtqyvvcLCwL66vLayrra2sbSuuruzrqynqaerp6KpraCpqKKvsLi0sby6urqytLWvvLS3s7e3u7e5ra2wqay1ubG3srS3trC7u7y7urq8tby4tMG1rKqqq7Sxt7i5tba0s7Cspq6wqquwsausrrCysbSuqqOTeHZyZWdbTFJQRk1IU1dSZV5nVFBMXFFITFJDQTk5Nzk1ODg2Njs3OTo8Oj45ODs6Ojo8PD49PEQ+OTY7Ozg4Pjk1MTU2QkZERD9ANz4+Qz46QT9AQDtLf4KJl5iUnZaWm5iLkpaOl5GRlZeUmZefm5mcfHR1dnV5dXN0bnZyc3R1dnd9fYF+eoF8g36Cf32Af4SChY+dkYmBf4KPl46Oh4KAgYiLhX6KkIt/h42Mi4qHkoqHho2Rk5GRhId9fYOIjI6LjoqJkI+Oj5SUmJGVm5qdnaiusq+vtbSzrbK1uLC8tbWxqrCqs7W0u7e0s7a0ta+4uLetp6KmrLCwr7a3t761ubyzsrGutbuwtK+vsru2sbjAvbS0tLO4s7y6trS6wL25urm6vrm5ub61srGvsq+qtbSxs7G0s664uLW/r6SmqKOrrLGvs66usLCsrauqq6Kipqiip62rqqWsp6KnmHh5cWZlWU9PTUlSTVdMT19eXE5VVGJRRFRNOz85PDg5NTc3NTc5NTo6Ojk7ODo8PDo9PD4+Pz9CPTg2Ojo5OkA7NTI2NkFGQ0M+Pzc+PUNCOT9CPz47S46Rk5iZlZmRk6KYk5KSi5OLjpCPlZeWm5WUm4aCfXp4dnR0c3R+d3p3doCCg4aLjISEhYqGkImHkZOWkY2WmpWPiIyPnpiWlZKQk5eampiQnaCdk5eaoJmdm6OglZCboKSjmpONiIiLiZGRjpGOi5iaj4+MlJqXnJybn5ykrLS5uryvtrS4tLSyt7i5s6uvqqistbKyta6xq66mt7OzsaWhqLWwr62sq7W6sru6urSyt7q+u7mxuLC5raiyuLuurbS0t7W7tra5uby3tK+xtLe2ubO3taatqauoqK+sqa6trqeisbSxtKumqKego6uuqKquqKyysK+vqaihnqGho6ajoKKapaOeqJdyd25nYlVLVE9PSkNQS19iWFpRXFNfTEhRSUFAOTo4NjY3NzU4OTQ7OTs5PDc7Pjo4PDw9P0JAQT07Njk5OTo/OzYzNzg+RkJCQEI5Pj1AQz5ARkI+OEeTlpGVk5KUkJGfmZ2ZlZCPkpKOjJOWlpKOkZWRkpCGgXlyc3V7gYSOh4WRk5KYnJyYlZCVmKOcmqGnqqmfnJaXlZ2ioqGcmZ6Zpaisr62pp6qpqKehpaioq6mpr6Gbn6Gjo6Can6CclI2YlJigoKGknpuapKekqauurKWjqKuvsbSuqqyus6+srLSztLmurq2sqqyysLCtsKiqprK0tLiuqra6sK+qrqywt7O4tLe1tLu8uLW1sbWrsqyosrO7r62xsrS2tbGxtLOzr6yrr7O2tLGsrrSqqqalp62rqKirqaqon6mzsKqnqaWjoqOwrammraWoq62sqaWkoqCloqWjmJmclZ6ioqaXbnVlZ2RWT1hLS0pLU1RwYllkV19bXFJaUExDPDg5OjY5ODc0Nzc0ODo8Ojw4Oj05Nzw8Oz5DP0E+Ozk6OTo7Pj04NDU4QURFREJDOT47QD5CP0dEPjdCkpuUlZWWlY+OlpeamZWRipOUko6PkpGKiomNlJeak42JgoaOlZGUn5qbop+fo56hoZ+Yo6SnpaWmqamtq6mipqSopaShn56jo62trK2oq66uqqqrpKGipamnp6moo6Kcm5ukoKWoo6CYnZmfoaKpp6Cioq6sq6qnra6opaSpqamppqOoqqmnpKeusK+zr6uwq6qvsq+ws7mvq6iwsa6wsrmztK+tr7WwrLOxrqy1tbS0s7Owr6ysqqyrrK+xtLOwsK6wsLCsqq2rqqumpa6wsrCrpqmwr6mjpKmrp6imqKarsKupr6mmqKmmpaOosK2qqaiiqaOlp6ShoaCipaGdnpeWmJSboKSplG5zXmppX1VaTlJOUE9SZFxkY1tcWVxQWU9LQDw7OTo3Ojg3MzUzMzg6PTk6ODk6OTo9PDxARD5APTk6PDw8Pjs+OTU6PEJBRUFDQTk+Oz9AREBDQkA3QJGemJSXmZaRh4uUkpeRiIOJi5OPjpCNh4eEhZWZlpiXmZaanqKdmpyipKGgnZ+an6ChoKahoKCgo6Oipaipq62pqqajpqWgpaCmqKalp6imqaijp6aZnKSloqGgoaGgnJiZn6ChpKSinp6WoJuaoqKgoZ+goqignJ+hpaGgpqOin6ShrKaen6GhpKyqp6yor6untLGurq+1sqyqsKupra21sK6urK63rqesqqSor7KvrKuyr6qqqaurramurq6xsa2qramrp6erqKmrop2mqaiopaiorKiopaSlqKeoqKaprK+vqKupoaKipaOjqauspqilo6iioaCknZ2foaGdm52fmpmVnJyjqpRvc2ZucmRdXVBVT1dPXmRkbGdiYVpaUlRPTUE6PTo6ODs5NTE2MzI4ODs5OTk5Ozk5PDs9P0M+QD05Ozo7PEA9Pjw5OTxBQUVBRkE6PTs/QUFCQUVCOD2KlpSTmJqWj4iEjY6RkoyIiIiPiYmQkY6Kioibm5mcoKWipZ6io6GanqGcmp2em5yjqKeroKCjmKCdl5yho6Olo6KipKyopamgnqapp6uppJ+ioKKmoaatpqadn5+fn5+ZmpycoaChpJ+hm52anKCeoZ+enqCjmZaamKOioqSfmZyhoaKgm5qeoKGkoJ2no6qxqK6rrKmkqqqrqKympayqsLOvq6upsKumqaWlqKusp6anr6ulp6urqauoq6qqq62opaijpqWnrKmsqKKcpKGjpqOqqaimp6Okp6imp6inqairqaGiqKOcnqalo6iop6OlpaapoKSeop6XmJ2fnaKipZ6YlJWeoKOXdXdrdndhX1xVWVFVVltjXnJgaF9jU1FYVEg+PD04Ozk6ODUzNzMzNDc6ODk9OTs6OTw8QUBDPT0+ODs8PTxAP0M/Ojg6Pj9DQERBOjs+PEA/Q0NFQzk8gpiZnp2dmpWSiomRkZeRkIeEiYKBjY+Pko+NnJ2foaSppamnqKytpqKin5ikpqOkrbGusqemrJuenpuao6egn6Ofn6Kvq6qsqKirsKmoqaihn6Cnqa2wsq+so6KmoamlnqSjoqagpaSipaOenaCen6Wiop6fopiVnpqen6Shm5WYoKGdnpybnZ2bmZmVnp+jqJ6doqihmqGjpqKkqKmqqKuwsailpaenqKSlqamqp6KlpqimnZ6lpaKgpaWjpaago6Wjo6WnpampqqSnpKaipqekq6mnp6Shpaisp6alpaOjqKSVnaOfm52go6mnqKaho6OpqKCooqCclZGan6ChpqKbl5KQmpqglXx3b315ZltbX15aXFZcaGRvY21paGJeUFBAPzs6ODk4PDs2MzQzMzM3OTk7PDk7Ozk+PUJAQD07PTg8PUA9PDxDQT46OD0/RD9DPjo5PzxCPz9BREI5OoCepKeinpufoJmPmZ2glpaKho+IhIuKk5eUkaOlp6qurayzsrO0uLetqaqnr7SysaqurrGyrrGtpauzrLGxqauvq6ustrC0sKuxsrGjn6Kqqaeut7a0tLazr6yrrqu2sKmysa2up6aeoqOjm52cl6KopaGfnqObnqGalp2knJuWmaKnn6Cfo6CblJaZlpean6CZlZ6imZidnaWdoKSnqqmoqq2spamkpamnqqmqrKekpKSjopmZoZ6amqGgn6WlmJ6kpqSqqKKnpaWhqqepp6eno6ilpqWhpKinrKKnpKGmpaWjlZedmJuZlaOnpaWkn52dpaOiqqOfmpmYlpycmqGhmpCTk5eYm41/d3J2eGliW19eXGJZYGRubWttYV9kYFBPQUA8Ozk7ODo5NjE0MzY0Nzc3Oj06PDs5PT1CPz4/PTw6Pzk6Ozw+QkVAPTk7QEE+Qzw7OT85QEBAQEJDOzl7mqOjnKCdnaKdmZ+ioqCYm5iWmJKUkJualpe0tK61uLO0uLa3tLi5t7W5uLm9vLiqi5yyuLy0vbq1u7q7uLO6v7i3ubuxt6+orrKtopyfqrK4vLy9u7q/tK+xs7W0t7evtbS1srCopKKfoJeVmpekqqamoaSjpKulpZihpKOdoKGiqKGjoKWhnJOZmJiZnKOenJqbnZebmZalmpufoaipqairr6+uqaipq6ysrauoq6elo6Ccn6Ojo5+goqWpppqcoqekqZ+ho6KioKWmp6akqKCfoqSho6KoqKejpaChqKampaOZm5ibk4+hpJ6in5iYlaCboaWgn5ubnZybmpmboJqNmJmYk5GGgHZ4eXhjW1JZVF9fYWxodWtwZ2lpYllTTEA8Ojs4OTc5NzU1NjI4NTY3ODo8Ozs7O0A+P0A9Pj45Ojw5Njc+O0JGQjw4Oz9DQ0Q8Pjk+Nz5BQj9GQzs4cJKam5Sem5udlZednaKmo6KWl56Wl5ehm5SYvrexuLm2t7e4u5eUtr27vb3AxbWiu5igt7+/usHJtJ27trK2v8XBqKC2s7qxqq60sbCxtLS2vLy+vLy9xrq4t7q9tK+1sbG6uLeys7KqpqafmKSkp6ikrqSrq7W1rrOgp6qsp6qppaagp6ChpqGTlpidn6Kko52enKGgoZ2XpJqZnaCmqqqqra6trbCxq6ytrKmpq66opqWmpaakpKamnqOnqaShnKCio6agoqOfo6Sdn6KloKScm6Gen6OhoaWkpamjpKWipKenoZ+dnpaTnKCYmZKPjIyXlp+blpyanZyakpaUlJiTkJqdmIqLh4CAfIJ4YV1ZU2FoYGZzb3NpdGNpZGJbTEs+Ojg4OTg4OTczNDUyNTQ2Njk8PDs9PD9BP0BAPT4+ODk7ODY3PzlCRUM8Ozw+Q0RDPUA7PTc9Q0NARUI8N2eMkZOKmpWYm5WVmJuip6umlZeYkJWZoZ6Xl761s7S7urm4ucKHmLeruLvAwsWzo8OnuLO9v7TEx720u7i+tsDExK6gsKK1trW9vsHDxsPDub2/wMC9v8S9vLq9vrSnqpixwL24tbnAs6+vqqqoraenpK+nqrS8sbS1qK+xsK+sqqKmo6yfn6arl5qon6Wln6CcnaCrsLCsoqucmJugqK+ysrOrqK63tbKtrammpairpaWkramkoZ+gp56epqippp6fmp6hpaapnJ2jm5eippqbmp2fnJqhnJmdnqCoo5+hn52loqCjoqGUmZqZk4+Ki4SNkJObj46YlZuXmJCTkZKJjZeYmJOLiot9gICFcGBhXl5qYmJud3V2bmxbYlFVXE1HOzw5Nzk3OTo3NDQ0MTQzNzY4PDs7PDxAQD1APz4/Pjo6OTo3Oj8+RUVFPD09QEJCQkFCOzw4QENDQEQ/OzVfjIyGhZaLlJWXmJeYn6anpZaVlpGXm5+bmpe5sbazuby8ubq1qrK8sb7BtLzHubi7rr+nxsO/ysbJyMXFybzCx8e/sbGnvLy+xcTGycfFxrvEwMXGwLmvvbzAvr6zq6qMs7u+tLW3wrqtr7C1qqumqqOtpKextqu1sq2zraiur6emsK+yraqvs6SrtamnqKSgoJ6psri+tbW1qqmmrrK3uLe2qau4vLm3sa+up6KjqKekn6ijn56gmaGcnaKkp6ehnpSbmqChpZ6goZ6Wo52UkJaYm6Gan5aTkZaUop+anpybnaGepJ+elZyYj5KTj4yJk5CXn4mQlpGblJiRkZWWg4yVl5aSi4yIfH+Df2pmaGFrbGZudXFydXFmXl9cUklFPzo6Ojc4NDg8NzY1NDIzMzY1Nzw6Ozw7PUA+P0A+PD05OTk7Ojw8PkJERT4+PUBDQ0NERDo6OEFCQkFDQDkyW5OIhI2RiouRkZWQkpqdn5yTkpiUnZ2al5qVtrG5tbW+vra4tbizvLzExLrDx8G/tLPFxca/ws3Hy87Ly8fBw8bHyMrFxMXDu7y8wcXBxcW/w8LGxcCxk766v8PCtra6qbSztKmrs7u7sZ+bsa+spKyutKeqqaiqrayppaWeqa+rsru6uLu3ubezubizrqyztKqwtbm9wbq+vry+tLq5uLu6srG0vLu6u7OzsqekpquroqGgnZqbnZqcl5qbnpycoJ2WnJabmZ2eoqOdlJyQjYmOjpGem5yVjYeSi5iYlpqcm5icm56enJqelI6YmJqTkZmXnqGVmJqSl5SUkZSamJOPk52WkouRfnp8f3RrbG5jb2xocXdueWlpYVxnYVFGREE8OTk3NjQ0Ojg0NjUzMzI2NTY9OTk7Oz0+Oz4+PTs9OTk7Ozs/PUFDQUJBQDxAQ0NDRUI7ODlEPz9AQj87MlebkJGQkIeFko6NiI2Qk5WRj42UlJuUk5aakbO3uLi4vruwtbK4trW2wMPBvsPCwL67vru7vMTMxMzQysbGwMXHy8jUy8rIxr+7u77EvsXIxsbDxMO4tMC3tLzBwrnCt7e/wLuupa63vLetnKO3sKattLWsrqWlo6ikoKClmaqzsr7Bvrq5uri1tLKxtLSzusC+wL++vbu7vb7Awre2t7a7u7K7vrm4uLu2t7SsqKmpq6aoo56TmpqcmJGSmZeRkZial56YlpOWnJufnpSTiYl+hoiLlpSYmZGJlZGXlpWZm5qWmJeYnZ6coZiVmZmbmJecm5+eo5yelpiXk5ecmZmclJadlJaTiXZ5ent2bmtpZ3VaZnJ3c3hlZl1kW1JYSUY/Ozc4ODc2MTY5NzQ0MzMzNjQ2Ozg6PDs9PDg9Pjw6Ozw6PTs7Pj5EQUFEQkBAQUJDQ0RDPTk5QkA/P0A/PTJMlpqWkpOMipiQi4uMjZKSioiGjZCYio+QlJezu7W2v729sba4wb28tLi/wbG4t77Bxb27vMLGyb/IzsnBxMHHysrGysXMyM3GyMW/w8DLzc/JxsPDxMLEvbi+wcPAxL7Bz8/OxquvtrS1q6CntLOuq7i1s6upo6KtqaymrZ+stbS/wr65uL22sK2rrK+1tLq+xb+7vLqzubu4ubm1rbC0vbuxv7y4sra5s7m7tK2tqKysqqmnl56bmpWNjJiUk4uVlpScmZeVlpmSmJ+ZkIqKfomKipGOlZeTlJ+ZlpCUmZiZlpiTlJuhnqGYmJqdmZmWnp6Ym6KanZybmJqbmZaXl5acmZScmH6AeHl1dWVlaWlnXWlvbXh3YmJgYF1YV0ZFODo4Ojk3OTQ0OTc2NjUxMjMzNDs6PT87PT06Oj07PD46Oz8+PEJAQ0JCRUI9P0NDQ0NERUA5OkJBQUI+QkE1QpCXlJWZko+akI6SkY2UlYuKh4yNlIiJj5Katru0vMbBxMK9wcXCwLSzvb+ssK+6w8rDwr7NyMW3wcjFv8HCyMvKwsLEyczNz8/Mw8fGyMjIx8nHxcnHyMe/xcfExMfIytLP0sy8uLa0uLjBvr66vbq8urysraapu7q5t8CytbiywMa6t7fBs7GtramrtbO7tsO2tr21sbe+trO3uLC1tr+7sL26tKuwsbGzvLqzs66rrautsZ2jo6CakI6Yl5WQnJaWmJaVkpyZk5ufnJaRlI6VkImMkJWTlJuemJmSkpyXnZSZkpOWmZidlZyenaOclZ2fk5yinJygn52jnpiUlZeXm5qZoJB/fXF0cW9iYGd1Z2lpdG14bF1kW1VfWUxIQzY8OTk4ODo1Mzo2NjQ0MTM1MjU7Ojw+Ozs8PTw7PD08Ozw/PT9CP0VBQkNDPkBBQEVFREVBOzc+Q0JCPkNCODuPmpGWmpSSlI2QlJSOlZSOj4uMiZOLiJCTm7fAusbFxMPMwsHEvb61r7e7r6+zusDHxcTBzMvFtrnAwsLEx8rRy8LDxMbJxc3QzsfMycLBxsHLysjGzMnNxcbFw8bFyc3Qzc/Mx8TAw8LJzcfFwcTHwbu+tLGwsMG+v8HGv764t8PCurq2wL61sqypr7K4vrTAtLS4tLe5xLmvvL65vr/Cv7W6tquqrK6vsLe+vLa0rq2trrWkpaioppqcnJ2cnqKcnZmTkJKdlZignZiYlZmZmZeOjJR9kJCXn5mZmJORk6COjZKPlY6QlJWinZyknpuenpaco6ChoqSjpKKempmbm5ydnpyDfXJ8eHBnYGpqdmxpZHRuc2JcYlRXVFNNRzo3Ozk5Nzc6NzQ4Nzg0NTIzNDI1Ozo5Pjo9PD89ODs9OTk5PTxAQUBFQkFCQUE/QD9ERURFQDw6PkJDQkBDQTo0gKGXlJmYlZCJlJOWk4mRjJSRjoiWiouQl5zFy8PDvMDDx8G5vb27uLa3t66yt7i8wMLAwsfGx7q8wMLEx8jG0snBw8O/v77Ey8jKy8i8u8jHyc3Iw8jJycXFw8LBwsfHyMrHzMjHyM3GzM/Ft8DAwMC7u721s7O/v7m/w7nAt7vBvLq4u7m9u7Kwr7CsucK4vbm3tbe6vcW9uMbIwsHCxsK9vLWprq6wsK+zure5trCvra+zqaarqa6mp56kpaOjo6Kgm5WYnpGXnJeRkZWXmZWZkZSYkpWMmKOanJ6dhYmfk3ySlpWSlJSXp52goqSfnp+en6GhpKKio6Gjopydn56joaaZeXp5f3JvZmVnY2pkYWptbm5eWFxWVU5QSkY5OTs5NzY3NzYzNzg5NTYxMzUyNzw7PEA7Pzw8Ojg6PDk5OD49QD8/Rj9CQUM/PUE+QERDQ0E8OTxDQUNEQUA6M2yinZWXnZaPj5iYmZiIko2RlZCPlY6Ok5aWysu7ubq5wbu6t77BvLy7ubGutbq4uLvEur7Avr67vMDFwcbCvsbBubvDuri5vL7BxsHGurnJycPFxMDEwcLBxMHDvr3CwMDBwsvDxszLxcjQwrC+vbi6u7y+t7Swub6zvL6xubW4u7a8s7W5trm2ubexrbrBurzBv7e+xL/Gw8PHx8K7wMK/wr+4srOztbSxrre0t7W0saytsaelpaewraifp6umo6ilpqagoJ+UmJmUkZGVlJeTmJeaoZ2eoZyhnaGloJaUm5GXl5iak56ZmamkpaSlnaKgmp6gpKKjnKKho6CenJ6eqaWolX17g3huZmFkYmFiY2NqYmZiWllZXFhRTkU9Ozk6Ozc3OTk2NDk5OjUzMTQ1Mjc6OzpAPT88PDk3Nzs6OTo8PkA/PkQ8QkFEQD8+PUJEQkJCPjo5Qj9BQj0+ODVZn5yYk5mWkZWYmJqXkJGQkJORk5SSkpKUlMXHuLW6ucK5ubzDxcK4u7mxsba8urW5wLu7uba3tLS1v7q9v7m9urq0v7i1t7Ovu7y3wLe+wr/Bu7/AvLvFvrvBxMC+vri8wcHLvr3JxMDAysCxwb+7uLu+ubW3tLi8tL24tbSws7yxt7a4v7a9ub2+ube6vru/wMW9vcvDxsPEwMO+trm6tr+4u7+8uLazsquwsLK1s7OurKunpp6nrq2roqirpqaqo6eoqqOfmJudm5qYnJyYl5yboaWdmp6hoaChpqCam5yYm6CfnZyfnKCooaOkpJ2in5qioKKfnpekoaKfnZqYnqiloYt8eYd9cWNgYmJnamZmaWVpXVVVU1lPU0tFOD82Ozs3Nzk7NjU6Ozw2MzEzNDE3Ozk4Pz0+Ozw7NzY5OTg6Oz1APz5APT0/Qj48QEFDQ0E/Qz05NjxAQUA8PTg3SZSYm4+TlJGVmJWRlpKVkZCRlJWUk5KSmJXBwsC6vLm+tri+xMDCsb26srSzuLy1t7zAvL20tLGwtbe1usG4vri/vL23tbewrri2ub+7wMC3wby7w7a6yLi2ubu9ubq2u8XFyr25xcC/vMG+uMa9wcC8xbi2t7S4tra7u7i2tLe6tbS4vL25v7nDwMC7uby7vr3IxL3HxMO6wL2+trK2uLK5tLrCwrq3srGsrKutsq+yrq+oo6Seq6ysqqSmpKSoqqKnpq2ooaGhpp+joqKem5yin6CjnZyboZ+ioKSgnpuXmZ+hnZ2enqGlpKGioqGeoaOcop6gmZ2Yo5+dnqCamaCipp2EeoOAeHBtZWVmb2lla2dYWE5LS0pSSUxIQzk+OD07Njo7OTY3PDg5ODYwNDMxNzk5Oz89Pjo8Ojg4OTw4Ojs7Ozw9QT49PUNBPD9DQ0RAPz88Ojc+QkRBP0A4OD+JmJqMjJCPk5eVjJKQmpKRl5iWlJSSkJqUw77GwcG8vLi4ur+3vLHCtrS8sbS2uLO6vb+9vLKtr6yxsLe8tru8wMS5t7e3trq5urvAvcPAusTCvse4ubitt7W4urS3s7vFxsvBu8bAwL+9vL/Jw8TFvsa4tbKyvbi4uL66urm8u7q0t7u6ub+8xMC/ubq4v7m7xca9xcPCsrq9u7Gvtrizt7O6vsC5tqyxq66pqqmtqqqupqSlp66tqaWjoqOhpKWlpqKmraOipaOfoaOhnJqcoZ+gpaGgnp2coJ2loJ6XlZmdn5+doJ+ipqWgpJ6cm5+jn5+ZnJmdnqSclpyjnJ6hnKaWfn+GfGtucGdwa3NlYmxfW1RIS0pESkJDRz85Ozg9PDc7Ozk3ODs3PDw2Mjc1MTY5PDw9PEE7PDo7Ojk+OTo7PT1APkQ/PT5EQD8/QUZEPz88PTk3P0FDQkBCOTo5d5yYi4eLkJKTlo2Pk5qTkJ2YkpGOkI6Ykr23x77Dvr27vry9trq4vbq3vbOzsLi4tbm8vMC3qq2krrC3u7O9vrvEt7a4trfAv8S8wsXFx8fKycbPwsG4r7W1vL64u7K+xMTKxcHJw8K/v769x8zHx8THvbW1tsG9uru/wrq/wb+9tre9vb3BwcC/vLm3vMK7t7/Fu8K/vrW3vLyvr7e2sLSzurm6u6+prautq6ymqqKnrqilqq2tr6ekoJ+mo56io6ijo6ujoqKenZubm5SWmZycn6Wen56ZmJ6Xo6Ccl5mamZqjo6Keo6OnoKagm52go56dlqCZnKCgm5SXoJ+lnJiikIGGgXFlbGludG53Y2dhW2JQS1RIRUVDR0M8Ozk4PTo3Oj06ODk7Nzw9NTM2NTA2ODk6PDtAPTw6Pjw5Pjk5PT47Pz5DPD8+QD89Pz9GREBBPz46Nz9AQ0M/QT06OGahmI+LjZWSlZWOj5aZlZeblY6MjI2Pm5O5tsG0v7y5vMPAvsC6tbayssC4r7K8vLC3u7a7vKuqo7C5vb6zvL68xbiyuLm9x8nKw8fIxsbJyMzO0czKxbW6wMPIv7+1v8C/xsa/y8bDv8G8wMPMysfFxsG5vbzEv8C/wsi9x8fFxby6xL+7wb+6wLy7u8DEvbe5wrm+vbe0tri6rq+1sbCwsra3tLesrqyqrKyrqKuhprOqpa2vrayoqaWjpKefoqOjp6GnoqKenJ2cmpmMkJaXmZ2imZ6blZKdlKGgnZmen5iYpqain6KipqKnpaKgpKOhm52gm5yin5eVlZ6epJqWn4mBg4F0b2xsdGtsbl9iXmFhTUhNP0VAP0RDOzs6Ojs6ODs8Ojk8Pjk6PjQ0NTUxOTk6OTw7QDw/PT08ODw7Ojw7Oz8+Qz5CPkA/PT8/RUVCQUI/OzY/QkVEPUFBOjpZn5iTkpWalZqTkJaXnJWbmZaUlZGSk52Ztri2sbq7ur7BubnGu7a1sqW+vbS2wb+ts720uMGxsLG0vMO8urq+vMS/t72/vcfMxsfJxsa/xMTKyMzMzcvGwsPLzsK8ub26ucDDv8jGxMHBv8XAysnDw8PDucO+vbm/vMLGwsnOx8a+usa9ur+5t8C5ub7Awr61tLy4truwr7Kyta+wr66srrOws7K4q7Gysaqwq6usq6y2raisrrKmq6ypqaGloKWmpKykpqGgoZ6hoJ2gjJSXk5ufppmenpmTmJ2foJ6dnqKbmKetqKKkoKCiqqapoaihpZugoJ2do5+UmJiinaehn5uCe3qHem1td3tfcGNbXV9eU0k+QkVJQkM+Qzs+Njk6Ozs7Ozs7Oz09OT01NjYyMTg6OTs7OkE7Pzw8Pjc7PDs8PT08PUA+QUFBPj5BQkFFQ0JEQDw2PkNERT5CRD87U5mbmZienZqgmpacmZ+SnZWdm6CVlpSamLq9tLC7vMHEwr/Fxrq2ubKju720t8S7sLW6tbnEuLS8trq9wby7v7a/wb+8v7rAy8LHyMC/vLy/xcLHy8jBw8DAycrCwLu7sLS7vcDFxsXFv8DCv8vHwsDIwLrCu7qzurrBvsDKzsrEvbW8vLm/ubm1tbO/wL63tLO0uK23qq+wsLKxr6uvp6+2rrKxua62tri0s7Cxrba0urGurK62p6yyrK2ko6Gnp6iyq6qlpKenpaWgppebo5+kpq2inqOimp2loqKfn6Glnp6wtLCkpZ6fpKmnr6epoKugoqKaoqSdmp6hpqevqbGVgnt9gnptc3hzZ3BdWl5cWVFFRENNSUFEPUc6OjU5Ozo8PDo7Ozs9Pzo9NTQ1MTI3ODg7PDtCPD8+Ojs2Oj06Oz49P0A/O0FBQT4+P0JAQUJCRT46NTpBQkk/QEJAO0yanZ2en52Ynp2ZmpqckqCVm56fm5WRkZbFvrq2w7zGwr6/yMW3tbi3trm7tK+3trK1s7e5vLu2u7u9usO7t723ucC7uri4tcXBw8O7ubO0usG9v8fAucC8vsXEvb65srCuuLe/w8fDxL29v7/Dw76/x7y8v7S0rrW1vL6/zs3LwreyuLi4vbm7sbayyMC7trSxsLess6mwra2zt6+rrqqxta+xr7ezurrAv7a3trK7usC1sq2zt6ywuq+ypaKlq6yvubOyqLCvsa+qoqihpK2orayzrp+op6alpqukpJ6mqqOmsrizq6Wcn6emp66rqqWwpaWlm6SjmJ+nsay1uLCyjoR5f3x3bHV6cG1oXF9fWVNQQUVIR0tARENIPD02Ozk5PDs6Ojs6PT88PTU1NjEzNjk4PEE+QDs9QDs7OTw9ODo9PEA+Ojo+PT49PT5AQkJCQUQ9NzQ1PURHPUNCPzxFlJ6goKCcl5qYmJWZnZmdn5qdm5yWkY+Sw8DCvcK8xLy8u8W7t7O3tra7u7OglrWsr7G0tLS2uLnBwLe9ubi5trW/s7SyuLG7wcDDt7etsLW4uLjCurS7t7u+wLu7vK6vrrOyucHCxMO+vL+7uri2wcK1v7q1rq+tsL3Auc/KycOxr7W0tL26vrm6u8rDu7q2r7C9sbivsrOwt722rq+usLewrKyytr28xMK6vbe2wL/Bt7WwtrKxs7qxsa+nq6+rtr+3tam6s7W5saerqKe2rrKxtbmorKyvqq+wqqinrLGssra9tLGspKirqKirrKuotqmmqJ6mnZijrryxu8G0pomBfIJ6cnZ2d21wYF5lXVtUSjw+P0ZGPUZDQzk6NTs5OT48PDo6PD4+Pj44ODMxNTc4OT4/QT87Oj89PDs9PTk7PDk7Ojc7Pj09Q0E/P0FCREJBPDg1OD1DRj1ERD88P4mdnp+dl5eVlJOWmZ6bm5qbmJSdlIqOjsG+w8K+vr65trrAsbWxs7e3wrWzq62zqKmuta+ttLa5w7+3ure2trK0wLaytLizusDBw7m3srKytLK3vrqztbK8ury2ur6ytLS0sLi+w8bEwL2/ubOvsry6rru0s6arqK26vrjLwr++rKuwr7O6t7m+u8DFwbu8t7C1xLW/tLi7tLvDwrO2trG4rKmlq7K9t7+/u7u3sby9vLaxr6urqa2zr7Cwq7C0qbjAtrKptLWwt7atrKaru7OutLjCsLGxtbGytbGssLK4uLm4vrSxs66ssa2pr66qsriura2op6Geqba/uLq/sJaJfYB8cXN3dHZxbF5iYFtdTkhBPz1IQ0ZNREA3NzU7Ojk+PDw5OD0+Oz0/OjgzMjU3Njg/P0I/Ojg+Pj08OTw5Ozs6PDs7OjxAPkJCPUBBP0JCPzw7Nzo8QUQ+QkM/PkGKoJuhnZSYlZWTmJqclpuVmpWNm4+EiIa7tL2/u7y5t7O8vKyzsrS0tsC1wK+ys6qqsbetqbmzt8C9u7y4trq2scC6t7m4ubvBwcTDu7u2tLSwtrq2tLKsvLm4tbjBurizsay3vMHHw7+5urWupayzsKawraieoJ+lrba1wre2tKWoq6iwtrOyurW7u7u1uLawtcSyvry/vLm6xci6vb62saeknqGpsa61uLaysKu0t7axqKaeoJmlpqSsp6ustqmvurGtpKatpauxq6yprbi2sLK4wbaxsbWxr7u2sre1tbK8tbqysLGyrrSyqq6tp7i1srWtrqqoqLK6vcC2tKmOgnt/dm97b3VybWJcZlhcXVJOTUE+SkJASklANjY1Ozc4Pjo7ODc+Pjw7Pzo5MzI3NTc1PDw+PDw4Pj48PDk5OTs7Oz47Ozk8Pj9BPTxCQD8/QkA+OzY3OkBEQUNBP0FCiaCdpaCUlpiYlZ6gnJebmJmRjJmJg4aEta+0u7u0tbCxtrqusLSzr7W6tbqwtbOxrba6rqy8sri5t7u/vbm+wLS/u7y6uL7CvMLKx77AuLm2srS2s7SvrLu6uLa5wMO2rq6qsra8vbm2srGtrZ+kp6edo6adlpmZmp+prrmsq6ufpaikq66up6+sr7GxrbGurrC5sLS8vri5uMfFvLy7uKminJibn6emrLGusqmmqaquqaKal5eRnJqYo56ioq+npKymqJqanpqhp6emp6mvtrKrtLavqrCvsam5trG1sa6st7O2r66rrqu0ta2vq6uxrbGyqK2rq7O1t7q9sKuhi3qCeXF2c210aWtdW2pUXFxPTUhERkxBRk1GODY2NTo1Oj44Ozk3PD06Oz06OTIzNjc3Nz47PT46Oj8+PDs8Ojo7OTs+Oz05PD49Qjw7QD9AP0E/Pjo1NTpARUJEQUBCQYifoqahmJuenZqlqZibnZqZlIyZh4aHhq6trri5sbKorq+4squwsKqytbm5vrWyuLS5urW5u7W1s7W7vMC7vsC0v7m5urG6w7zCysW/u7+/ubO0s7GxrrC5uba8uLu/srKyrrGuua+qq62so6ihnZ2el5ihlZKVl5CYn6iupKOkoKKnoqOpqaGmp6Wqraesp6inrKussru0s7S5uraytq2poJqWlpudn6usq6+jo6OhqaCbk46PkJOSkpmWmp2kpaCfnqeYlZKUmJ6ko6GlqqytoqmqqaSpra6ltLGusa2qqa6vsK2lpqqkqLOurayppqapq6aqp6uyrK+zsauploF/gXdyeGh0c25kVGBjV1xRTkxIP0hRQ01DPTg4NzU6Nzw+Ojs8ODk8Ozs8OzgyNDg5Nzg7Ozw7ODw9Pjs9PDo5PDo7PT08OjpAPTw8O0A+QkBBPz45NTg7PEZBQ0Q/QUGIo6aio56gn6efqKqbn5ucmZiOl4uNj4yqqaixr7Ctpaemsq+ppqugr7C7tb28t8DBvry8vLmura+ysrq6t7e1tby0r7Srtrq4wMTBu7W8vbiyrbOwr6yut7aytLSvqqSem5ycnqion6CoqZ+hp5abl5ePnZOPkJaOl5ukqKCgoqKipaWdo6OgnqWgpKykpqikoqOjq6yzrqmurq6nqq2orKGcmpiZmJupqKqrnqWim6OclJCMjo+Qk5CWlZaYn56empiml5OPkpadoqClo6akp6CipKOhoaurpLKtqqysp6Osrq2rn6GipKSvrKyppqOiqqSqqqSpq6aprKumoIh5g3x2f3lidmxuXFBoVFBOR09MTENPUUA+Oz4zOTo1Ozk9Ozo5PTk5PDs8PDs5MzY5OTY6Oz89Ojg7Oj48Ojw7OTs9Ozw8PT48QD0/PDg7QEBBPz8+OTQ5PDdBQ0JEPUBDjqqko6Khop2qpKaopqGenZmdj5iVk5CVp6ShpqippaSgoaeroZyim6ertbK8vcDCwsC+wLm1p6Wsqqi1srGwrq+yp6avo6+utcG6tbeyt7aytKuytK6qq6+wsrSupZ6SmJSPmaCfoqCcpKWfnqiUm5aXjJeRjZCXk5idoqqfn5+go6WonJ+goZyin6Oop5ynoaCkn6yorKygqaumoKSopqyjnZ6dmZeaq6apsKOlp56gnJWTj4+RkJiQlpWYl5+Ym5mbo5mXlJWanaCdp6iloKOioaOenaCpqqWurqaoqaGiqq6qp6GgoqOprKunqaakoamipammpaSipqSoo5J9fYB1dX1ta3tkaFVRY01JSEdOUk1KTUc7REA8Mj84NTk7Pjs5OTs4Ojw7Ozs5OTQ4Ozg3Ozs+PDo5PDo9Ozs8PTk8PDw+PT1BPkBCQD03Oj9BQkBAPzg1NTw6QENARD5BRpaupKKlnqOiqaioqaqlpp6dopiYmZmVm6Kem56joqCjoKGaoJiYl5ahqKyutre6ubq3t7uuqKChqaGgrauqpqmkqaOkrqWsrLS8t6yysa+xrbWvr7O1qqetrKOcmZSOkZaXmZmdoKOim52lnpqkl5eXlpCSkZGTmpeboKSqnqGhnqanqqKfoKefnZ+kp6meo6afqp2qraqup6iwpaOkpqespqGkoZuYnq+orrGqpaqqoJqYmJiVk5aak5WVmZWal5eYoJ6cnJeboZqemqKnpZ+hoqKjnJuhpqemqK2jqaWepKeppKWloaWkrKyppqunoqCko6Snp6GgoKWipqCJe4B9dnh8ZHh5YGJSVV9ISUlLU1RJUlBMOT5BNjc9NjU7Ojw8OTs7ODo8PTo7ODY1Nzo2OT49Pjw5OT05PT08Pj07Ozw6Pj08Pz8/QD09Nzo+QEBAPz84NjU9PD5BQkZAQEegrqSmq6Gjqqyuraesqaigoqaem5uemqCcmpWZn5+bnp+elpSTl5OTnJ6jqK6trKurr6qvqZ+XnqWenqWmpKCin6agoq6rrK21sramr7Srqaq0sbCwuK2noZyempSYmpqRjpKWkYyPjpSZopyXo5mal5iZlJmYlp2bn6WmqaCmo56nrq6rpqKxo5qkpqaqoqGqoqmkqLKrsbKruqimq6erq6msrKegoKOxrbKwtKmxr6KZnJ2eoZibm5qYmZuUlZqWmJykoaCao6CanJmfpKKeoJ+ipp2bpaalpKWoo6ejnqajop6mpaKlpaispKatp6CdnZ+eoKWhnp6loKaZgXuBfHZ2c2iCbGVbU1pZTVFKTk9UTFJMQTc+QjY4PDc2Ojw8PTo8OTg6Ozw6Ozk3Njo9NTk8O0A9Nzg7Nz07PT09Ojs8OD49PUA+QT4+Pjg4PD9AQD0/NzU4PT49QUBGQEFIoaqgq6uhpKqrsK2pramnpaWlpKChn56ll5eUmJmemJydm5aPlJmSkpyYoZ2qoqagnqehpJ+ckpyim5+ho56doJ+joKKvrqyvsay2p62xraamsK6trLCnn5+joJeRlJyhnJqYkpOfnaGkm56blp+an5ebop6loZ6kn6Sora2orKikrLS3trCntKyira2jr6WkpqGpqK61s7K9tr6wrLGuramqtLGwp6uosrW3s7essbSjoJ2ln6uhoaKgn5qYlZWfm5uYpKGgnaOhoJ6bnKWgn52coaifn6epnqGjpKCmoJ6noZ+cpqOfoqWjqKCpq6WfnZ2bnZqmop6co56nkIGCf3x4dWl3dV1sWlJgSFFVSEZVVkpCTUc9Skg4RTw2Nzs+PTw6PDk4Ojo7Ojw5NjY6PDc7Pj0/Pjk3PTk+OzxAPDpAOjpAPztAPkFAPTw5Nzo+QD86Pzc1OD0+P0FAREBCRpyrnqmpoqWpqa6opqqlpqemqKqhpaSjppKTlZiWnJqanJqVk5mbjpOemaidrp6nnpuhnZ6ampKYnpyioqCgnaKfn56fqaunrKmqtKurraulpaqoq6yqpaCfmpKSlJiZlpaWjIiLj5WdnZ2dnpaemqagoKilsaqnrqOrrbawtLKxrra4vcC6rbW0sLewrrSppqSlrKm5s7W7w7zDwba6tquvsbm3vK+zsLXBvLe8srK0oauiqaixqaqop6eamJ2Zqaagmaegn56np6Wknp2qoaKem5+ooKSnrZmfo56ep56gpp6cnKKhm6OioZ2cpqWlpJ+imZybpJ+gm6Cco4mFhH52cW1pdm1obVxYW0JWTUpHTUdCRk08Pkw9NDw5Njo9Pzw7Ojo4ODw5Ojs7PDU0Ojw4OT4+Pz44OD85PDs9Pzs9QT06Pz48QD4/Pj89PDY7P0E9Oz84Njc8PEBEQkRBQkOVqqCmqaOpqqipo6GpoKaop6yupamlqaqUkpeZlJqampyYmJmcmpiaqqCxorejsKagnp2dl5mWmZ6bnKSfn52knZqdnKSipKOiqq+sp6mjoKGsr66qq6egn5+io56fnpudm5SUlZWenpiUhp2aoZurpKuysLmysrGysbq9vLy5trjDvr/Cv7a6usDEub27rK6nsa2xwra4wsbAyMrAyr+wubm9ucK9uLO7xcO8wrq2s6myraqytK+zrqmuo52rprWxrKKvpaCir7GtsKSkr6OhoJqhp6GkqqqZnaCZmqOgpqihnJ6inpmknp6YmKOjoaSeppmboqSen5ubm5yHhYF7dHJra3VycGhXW1FFVEhESVBIPkVBNEVIOTU7PTY7PD48PDo6ODk8ODk7ODo6ODs8Nzs+PT49NjhAOTs7PUA8PUA5Nzw9Oz49Pj1CPj43OkFAPjw+OTU4PTs9Q0BBQ0JBkaqhpaqnpaqopp+ip5ymrKexsquto6mslZKVmpSXnKKhm56goZyfqbKru7K/q6+spZ6goZ2cmJufoJugn5+XpJ2Vm5uemp6cn6Wmp52goKyxr6ekpKOhn6asp5+XnJWSmp2ZlYyKhoiGeW2IoKSiq6y0vLbDvr6zu8HDwsXAv8LGxsXDyMLAxcjN0MjLw7K3tb6yvsW7vszNxczLy9LGvr/Awr3HxsK3w8nIwsDFvbmzubq0u7ewtbKqurGuura+urqqt6yqqri6tLuurbijpqKep6Wio6mmmZufmJqdp6qnoKGhpJiUo5aUmpGcnZ+knqefnp+inZiZlJiUiIR9enJrZGlveGplWltGSkxERFNMREJENzo/OzU0OTk3OT4/Ozw7Ozg+PDY6PTk8PTk8PTo7PT4+Pjc7QTo+OT0+OT0+ODc7Ojo7Pz89Qj4/NzpBQD08PTg2Njw6PEE/QUFBPpKroKeuqKKrpaSioqWhpaqrsLKtrqSpppSVlZqWlJukpp2hqqeiq6y8vL/DwbOyuKehoauqop2eoaKenJugkp+fkJafmZKalp2bmaOhr7OpoZudnZ+fmpeYmJONj5aXlI+NkIuCg4J3c3FucI+mra60ucW7zcfLv8LMzs3MyMnRzM3Mx8nFxszQ0tXO08m9wL/Du8bFyMXR08zTz9LTzMrCxcbGysfOv8jQy8bExsTAu8LAvr6+tb2zrb6/wsLGxMbDrb64sbi8w8HBury8ta6np62ooKKppZqWoJqZnairqaOkpJ6Xj5uLkJmJlZiboJ+jnZ2XnpqTk4uVj4WAeXRzZWJncm9mXlpZQ05MQ0VQSURCQDU1NTg5Qj02ODpBPjs7Pjw5Pj03Oj05Ojw4PDw8Oz8/Pjw9PkM8OzpAPTo7Ojo4ODg5O0E+PEA/Pjg7QUE8Oz43ODY6PD5CPkNBQD6Tr5+or6aoq6OipaCmpqSrqKutqq6iqqOSnJeXm5ibo6yen66mpbGqxcbMzs2/sMKppaitraqhnaOfnJ2aqZOZoZCOoJONlJKXmaSxsaukoJ2gnJmXlZOUl5KQj4yHhISJh4OAgYGAeXJyb2x5pLa6ub7LwdPS08jNztHT0dLR0NHRzc7O0MXO1NXY0tfNxsfJzMPFys7K09fR19LU1dPTyMzGzM3J0szN083ExsnJwMXLx8jIxb7Cs7PHxMvKys7Fyb+9vrzBx8TMzMjJwMO/ra+yqJ6iqqOak56cmJ6mqaykpaaWl4qVhZGUh5KSkpmbmpaYkJuVkIyGkYt/e3J1dmdiaHdpZFZXUURNRkBJUUI9Qjw6MjNAPEQ8Nzk8Qj07PT87Oz49OTo+PDs+ODo5OTo/Oj49QD5APD47Pjs5PT08OTY6Oj49PDxAPz45OkBBOzk+OTo6Ojs+PjxBP0E+kKyioqmmp6ikn6KdqqijrKOjp6asoqmflKOYlp+enaSvm6Cwq6isscnN1NfPxrvHrK20uKyuo5+ko56gpKyblqmWjZeNjI2XprCupZ2enaGlop6blpWWlIp9d3BrZWJocW9xe4WKgHZwbnF0cIWzwr7F0dDX1tbS1s3U1tfU09HT1NTSz9HD0NPW19XW0svJztDLxs3RydHV1tnV19LW2M7Syc7RzM7Qy9LPvsbGycLLy8vOz8XGxra/yb7SzMvPxcnHvsLCx87Mz9DOzMrHzbi3u6ifpqunn5ieo56dqqWtqaiokpWIkISMkYaNjIiTlZmQloyYko+Gh4yEfHhzdnBjYGVyYl1SXElKRkFFSEk+O0A4PTQ1ODU6NzY6PEA9Oz48OzlAOzk6PDs7PDc9PTs6Pjs9PD48Pzo6PDs7OTs/PTk1Ozw+PDw9Pz8+OjtAQjs5Pzk4Oz09Pj88QUBEPIaroJynoKejopugm6mkpamgn6Ghpp+on5ikopuppqKmrJqksLGpqLXQ1Nfa0sfGy7S2wsaytqmipaahoqu1p5qxoZaVjJCmrauclZihnZuhop+dnpuWinhpZGFfX19fXl9gXmJsdXNxcG9scnF1ksTHxtTV1tfX09bP1dTa1NTPz9XU1NHRzNHO09fW09XQz9LT0cnT0MfQ2NfY0NfS19nV1czOz8nM0cvOz7/FwcbFzszQ0NHIy8u/ycvF083LzsfDycbGyMvK1NPQ1M/SzNLBucWxpai1rqeaqKylnbKosLOsrJOPk46Ii46Dj4uEkI6ZjZOPmY+PgoWMe3pxc3RtYWNpbV9WUF9KSkJGQ1FNPzw+NDQ6PTUyNzU1PDxAPDs8Ojk6QDo4Ozo+Oj04Pjo6PEA9PDk7PT85Oj89Oz08PT06Njw9P0A9PD09Pjo8QEI7Oj03NDo+PD8/PUZBRD2CpJygpZ2lpaOZnJ2knqOjn52fnaCap56coamfr66rqqudpq64qKu32NTV2dnRztDAvMzJt8Cvp6upo6SxtrOjtqqfnaGqqaGYlpiam52hnpmdnpR+cmZjY19fYWBfYWBfYGBfYGZtcHBua29yd3ebzMDS1dPY2NbZ0dLS18/TzsvTzdXU0crPzNPW0tHWzdDV1dHF0dTK0NTV1c3R0NjX19fLyM7DyM7Mycy/yL7HyM3Nz8rQzc7Lzs7Hys/Pys7KwcjGyczJy9HSzNPR0c/Pyr3HubCtu7i1qrawrai4rbO/u7Gaj5+UkY6NiI6QhZGNmYyRkZWOkYCFiHl2b3Bva2JlbnBhV1xaSUZGRExXRTtAPDMzPD04Njg1NTs+QD05PDw4PD45PEA7QDo9OD45ODo/PD04Oz5COjo9PDpBPT08OjY9PD9APTw7PT44O0BBPTo8ODg7Pjw9PjpFQkU+gZ+Zpaegn6OnmpufnJeenqGanZqcmqabn6Snnri2tbWtpa2uvrWxwNnS19rc1s/Ny8PT0MLCsqutrqyms7G4q7O3qaOfnJaUl5uen5+elZaYlYpsX19eYWRiYGBgYWBgYV5fX15dYm1yb29zdHV2eaS+y9XR1tTT2NbOztPLzc7FzsrS0s/Gzs3N1MzO083K19XQzNHTysvQ0dPJzdHV0tXVysDJwcXMwsfJwszCxcfKys7KzMzPzdPLxcfPzMfHysTGwMXJy8zP0MbPzs3NzM/Fx8C3ub3Cw73DubKzvrC7w8S2qpiloZmWkZWVkouUjZqRlJSPj5SCiYV4cHJrbWhgYHFoWFhoVk1HTElQUEI7RD47Njc6ODk6NTc9PUA7Ojw9OTw9OT09Oj46PDg7PTk7QDw+Oz4+QTw5PT49Qj07Nzc1Pzw8Pzw8Ozw8ODtBQDw6PDk7Ojs8PUE6RUFFPoSem6itnqSkqpyen5iSl5ufmpuemZmilaGpqaXFw8G/u7WyscfCucvV1tna29jMzc/J1tbFxLiytqqjrq24ubGywKGXjo2YlpCUkpGWl5aRjH1mYmNiYF1eYWNiYF9gYGFhYF9dW11ncnFxcnNxbXJ5pMbTz8vQz9TVycTJycbGv8PFzs7HxcfNytHIy87NxtHSz87M1MrHys3Ox8bP0svQz8W6xL7GybzCxsjOxMLHwMbNx8PLycrPx8PDz8jGwcbHw7/AxsvLy87CysvIx8zQxMXHusfDyMjCz8C9vL+wwcrHub2qsLKnpZ2inJiQm5CjmZeZkZWYiY+Cd250ZGtgXmZxYVtXYEdISEdJTVRHP0o9NjQzNTU8PDQ4PT09Ojs9PDk6Ozk/PTk8Ozw4Ojw6OkA9QDw9PT48OkM+PD89ODg5OkA+Pz48Ozs7Ozg6Pj88Ozo3OTw+PTs+PUZBQz2DoJuqrqWuqquanaCXlI6XnZqZoJqanJuls7Gsyc3KyMS+vbrNzcbQ1dXZ2tvY0MrQ0NLUysW6vr6wqLeqvrm5s6WSjo6WkIaDhISCfoWFgHRgW15eXmBeYGNkY19dXV5fYGBfW1pcYWtycm9va2xvb3240cjJys/LzcS6v8O7u7q5vsjGwsPAw8fKycjKx8HFy8bIy83JxMHJycHBy9DEy8i/ucG6xce9v8XOysK/w7rJx8i6x8XEyr+9wcvGxcO+xby8v8LEy8TEu7/JwsXH0sXByL7KycbHxtDDw8bDr8TLx8PKt7+8urSprKWlmJ+YrKOgpZqjoJuUe3ZydGZpWmFubVpbWFFETEZCR0RMQ0ZSPzU0MzM0PzwzOjw8Ozk8PDw4Oz07QT06PDo7Nzs9OTs9Oz07Ojg+PjxCPjs/PDk5Oz89O0A+PDs5OTk5Ojs9Ojw6Njk8Pjw7PjtDQkQ+f6WcqbKptK6wnZ6emJyJlJuZmp+in5qdqL+4vMvQ0szHwsPHzc/OzdXQ1tnY2dDM1M7P0MvEuMbBtrW8scC2uqyRjJOXh3uAhYaAdnh1c3FfWltdYGFiY2RkZWRgXFxdXV9eYFtZWlxib3Jva2lscG9zj8a8ycXMwMbBsLa6srK0srHBvLu7ubjAwcHFvr25vb+5xMrFxcK9xsC3u8TJv8LJu7e6usXDvrzBzcLGvr21wL3DurzGusK5s7vFw8LCtr+2tb6/usvCvLW6yLq/vcvDwcXCxcjFyMXQxsLMx7LGycPOzcDFwr+9srews6eoqLmxpa2wq62slHl2d2plaGBob2NWXllKRUpGSEtBRUJFSUA5OjY0ODg1Mzs6Ozw5PDw7OTs5OkA+Ojo8Ojc6Ozc6Ozs/PDo8QD1APz0/Pzs9OztAPD4+Pjo5OTg5Nzg6PDw8Ozk6PD47Oz46QEBFPn6soKy1qre0sqGen5eajZSWmp+dpqKdnrfGwsTIztLLysrHzc3P0snRxtbV1tjPzNDIzcjKxb3KwbK1ure6tq+RjYqMhXmAhoaAfoR8dHVkXFxdXmBgYmNiYmVlYl1dW1xeXF5dWltdXWhzcW1nZ25wcnmdvczAw7rAuK2wsKeqraynuLS2tLOys7q1vbG3sLSusrvCu8HEvL+6tbK6vsC4x7izu7XAwry3vcbAw7u0r7K2ur6zxLa6tay4vL3AvbC5tq62urLFvLauu7+0trTFvL7Cxb/DxMXHy8XAxsa7x8vAz8nHw8bBw7fDvr62ub7Gv6y1urW3to54dHhmZ2Via25eVl5gRktISEpGQkNBREU/PDo1NjU2MzM7Ojs9Ojs7Ojs+ODxBPTw6Ozg3OTk5Ozw6Pjs5Pj89QD8+QkA9QDo6Pjs/PT05Ojo6ODU2Oz0+PDw6Ozk+PTk/OjxAQDyIt6ars7G8vLGtn6CZlJSYl56ro6+qp6TGy87IxsnOzNDNzsnLycvKy8bRz9PRz8fKxsrFxMC8z72zub25uLebjoeJint5foaGd3iBfXRoXl1dXV9gX2BkYV5jZWNfX1xbXlxdXlpbW11fbHBuaGZqbm5yfKTHv7m4tbCrrKeeoqqnnquss62pq6mzrbawsqiup6yyu7q2wrm6ubCrtbm7tMK5r7+wvby7tbvHucK2raqosLHAtbi8r7CnsbO0u7yrrbWlrrauurGwqrmvrbutu7i7v7+9ucK/xsLFwLzGwcfLuMXHxb/Hw8O6xMbCu8XJzMuzucK8urKIcnZ2a2lhYmxoWVdXW0FMS01JRUFDP0ZBOzk6OTk1ODU0Ojo5Ozw9Ozo7Pjg7QDw9OTo3OT45Ozw6ODs7Oj4+OUE9P0A/Oz46Ozw6PTw8ODk4OTc2ODw8PTs8Ojo7Pj07Pzs7PkA8isCrqLi3ucOts6mdmZSWmaGcprC1sbemxs/SzMTGwsXQyM/DxMfBxsbFxczDyszDxMHHwLq7u8q3tLu9tbWrkYmQkHx5foqFenuEgXhuXl1dXV1fYF9fZGNiY2NiYF9eW1taWl1aWlpaXWRub2hmZ2lrbnKBrbmwta6mpaenmqCkoJqcpauto6eiq6msqrCjpp+qrbS2sb25r7evqK64tLS7t7O8rre5tLG7wbHBrqSooquxsrOnvKqrqKusrbSzpaitoKSvqbKlp6iupae2rLCyt7m6u7G8vb6+xL+1wcDHyLe/wMS3xMLAu7/Ew77EyMzKv77DwMCphnJzcmppXWFvZFdWWFBIWlJTS0ZGRT4/QDo3ODk3NzY0Mzc6OTk6PDs7PDw3Oz07Ozs8ODk+OD07PDY6PTs/PTdBPj9APzo8PDo9OTo7Ojc3Nzg4Nzk8Ozw7OTs6PDk3OT48Pj9BO4zCr668t7nEsLawm5mVnJiqqbCxs7W9r8bR0M3EyLu7zMPMwL3KucDFwLzMusPGxbq8xL25trzFuLa4u66xlYOJjYF7foB/eHR/fHN3Zl9dXFxeX2BeX2NjYWJgYF9eXVxaWFlbW1lYWlxfZmtmZWdlaGtvcoWqpaymoJyhpZSeo5uXkaGjqqOin6Skp6Ssn52bpKWrsq+2t6ewrKeqtKu0ubC2tKy2uLGvurmwt6Sfo5+msaerp7mqpKanqKeyraCnpp6apKasnp+npJ+gsKysrLGzsrOwtby2u8HBsrq+w8GxubnCs8C9v7W4u72+vMLGxMLDvr/DoIN3cGxhZV9rb2BVWV9ITmhPVEdFSkY8PT89Ojs7ODI1NTM2OTk5Ozk6Ojw6Nzw/PDw7PDg4PDk8Ojs3ODo6PDk4Pjo/PTk4PDo7PTo3Njc2Nzg4NjY2Ozo6Ozk6Ozw4NTk8Oj4+QDuNyLW2vbi6wbu+taCelJ2hprq2q7Ozu7PF0MnMw8e5uMnCzsG6y7m9yLu2x7u3w8azvsW7tq+4v7uws7avooSHh4J9eXZ0cG1rampxaV9gXVxcXV9gX2FjYmBgYGBdXFtcXFhZWFhYVlhbXV5kY2JlZ2dnam1viJ2poJeVmqGWm6KYlY2eoaKmm56fo6Wgp56aopufqrCssbWiqaqpq6yktbittq+ssrSusrWusKqfnZ6jorKkpam4raGmpp+orKuZn5+dmZ2fpZqZo5ybna+oq6eqq6ytsLK4rri5urC2u7u6q7OyubK9tLaxsbW0v7W9v73Cwbq6vZeDenJrX2VeZGRYVFheSVddS1BHSUpGQTw/P0A7PzwwNDUzNjo7OTs4OTk8PDc+Pzs9Ozs4ODw4OTg8Nzg6Ozs6Oz86PTs3ODw6PTw3NDc3Njc1NzQ2Njs3OTo7Ojg6OTg6Ozk6PD87icm2uL67t8HBwbSkpJmapKbAsq+2rLS3xtDJycHHvLzFxdDBvMq7u8G7tcW4tcHBs8LDu6yptLm3p7GyqYuGiIB5c25wbmtjXmJmZl1dXl1dXVxdX2BhYmNjYmFfXFtbWltZWFhXV1dYWFhbXmJkZGVmZmhpa3KNqJ2UlJSbl5uhlpaQnKGhqJ2bnKWloKSbn6CamK2tra+yoKWiraumobWwsbGsp66yp7mypragop6ao6GtoqGptaqio6adpaajlpidl5ibnZ+Zl52cnJusoaumoqOlrauys6q0sLKqsrizrqmvsrKyt7OtqayusbewurW5vb62s7GUhHl1ZV5lXltZVlNaVUxcUUxKRUhLSUI9P0FBQEA6MjQ1MjQ5OTg5Ozk6PTw2PT87PD47Nzs7Nzc3PjY6Pjs6ODo9Ozw9Ojs8Oj07ODc5NzQ2NTU0Njc4NTo6ODo5OTw4Nzo4OT5AOoHIvbi9v7a+vb+znaWjmKWxwrW2va21uMPNycjBxrjCwcjQusPGwLa8vbbDura/wbW7v7qqprC6saexr5p9hYWAeXBxdHFoZWRpZWNcXFtbXV1cW15gYV5fX2BeXFtaXFpZWFZXV1ZYV1hYVldhZGVjZGVkZGhqdqKclJSPlZeXn5eZlJifnaGblqChqKOfnaicm5qqpq6wq5ujo7apoJ+uqLWppqassKO2r6O2oKKbmJirpqGbrLivoqGjnKGfoJOVoZSWlpuYl5aXnJWfqJ2po6Gco6qqsK2ns6uqpqyysKWqrrKxr7Cur6anp7KusbSvu7O5t62jlIF5dWReYVZZV1NSVEtNXkxQTEdITEtFPEA+PEI8Ozc1NTMzOTg4OTk6OT46OD4+Oz08PDc+PTY3Nj03Oz07OTc5Ozs8Pjk5Ojs6ODY3NjU0NTMxMDQ1Njc5Ojg6OTo6Nzo7OTk9QDp2wLy1ucKxvri8rp2np6Oqu8C9wLmutLjCzcjHxMW+x7rKzbXExcSxv7+5wMG6v7+5uby3p6awu6aooaSJgX54cmpscnRwaWhlZGdiXFxaWVpcXFxdXl1cW1xeXFtcWVtcWlhWV1dWV1hXV1dVW2NjYmJjYmNkZmqBlpOVi5KUk5uYnJaWm6Ccn5Wgn6Wko6WmnpyfpJ+qr6afoqS1p6ChoqezoaWnpK6ksKyrtJ6gnZSUqaGhlKyxsJ6io52emJuTi6GUkZOXmJKXl5iWnaabpqGimaSkpKukpLCmpaKqq6ylqK6urquoqamzpaarrrOxrru1sK+un5J5dnJlYVxaXVhOTFFHUmFNVlBPSk1PRUJEPzk9Njk6NzU0NTk5Ozk4ODc8ODk9Pjs+Ozw2OTo3OzY7Nzs7Ojg1Ojs6Ozs2PDs4ODQ2ODYzMzIxLi8yNTU2Ozo4Ozc4NzY8Ozo7O0E4eLu7sbW9sLuyt6yepKatt7u8wcW6sbm2xcrLwcTHx8m4yMa1xcLIrrq8wrzCwMG9vLe6tqWnsbWdooqYiIB3b2RiZ2loZmhqZ2ptYF1cW1paWVpcXVxbXF5fXFpZW1lZWVtXVVhXVFRXVVNUU1VgYF9gYV9gYWNkaYGUk4mRjpOSk5yUlZakmaCWnJ+koaylo6Oio6GbqqqlmZ6lsKmfn5ykqp2noZ2rq6mora2ioaGUl6KanI+qqLCbn6KfnpeYk4qeko2SkpWPmJiTm6CinKSgoZWgoaOkm6KqpKKkqqKrraWtsammpaamtaaqqK2ztbS5uq+prJ6LcnBvYFtXVlVSRlFPSFpcT1JKVEtTTEVHSUM4Ozs9PDg2NjY6OTs6Ojc2OTc3Ojs6PTw8Njs8OD41OTg6ODg2NTk6Ozw5Nz88OTY3ODQ1MjEyMS4uMTQyNjo4Njo4NTk4OTg6OzlAOXu1tK20u7KwrLKtnaenr7m5s7/IurbAr8bJzrzCy83Jt8vAtMDHzLC1vMe7wcfDvb62urWkqq+unZmHjoN8dWlqam1oamxua2ttZV1cXFtbXFpYWl1bW15gYFxYWFpZWFdYV1RWVlVUVVVSU09RWV1cXV5fX19fYmRtjo+EkYaPkY6Zk5SSnJqinJugp6iqp6qlqKSimKSupJSZpa+pn5uYmqCerpmbqbKfpKafo6OglJOblpWRqKmsmpygoaCalJCMmY6LkIySjJaUkJ2hoKKcm6KVm6CioJehqKKiqKugq6+krbeloqOirK2pqKuvs7iyvbWzq6+Yg3JyaFtYWVNVUkVZTFFcWU1UTlBMUVJJTklCPD8/QT89NjU3OTk8PDk4Nzo3OTo7PD0+Ozc7Ozo9Njc6Ozg5NzY5ODk6Njo9OTk1Nzc1NzExNDAtKy80MzQ5ODg6Ojg6Ojc0OD04Pzl+s66os7auqKevrZupqKy3tqy7yru2v6zMx8a5ws/QybXGvrq+xsu0sL3EvMLEw7zAsrmvpaqvq56XhoF3eG9uaW5ubnFnaGlnZF1aW1tbW1xbWVpbXFxeX19cWFhZWFdYV1ZVVFNVVlVVVFNOT1FZWlpaXVxcXl9gZH6NgYt/i5CKko2XkZaZoqCbn6qqpq2qpq+ip5mfrKCUlaSop52Xj46Zna6Wl6apmJ6ck6WgnZGQkpKSlaeqpJmZmZ2dlo6Mi5OGiI2DkIqRlJCgnaCjl5WflZqgoZ2Sm6Wlp6iooLGwprG8pp+jrLWrraewtLC5tb+xrbGrkHxwcmJWVFVOUklHVlBTUkxMWE1KTE5SR01LQUNGREM+QDc1ODg5Ozk6Nzo6Nzw9OjtAPjo5Ozk6Pzc1OTo6ODc2OTU4Nzc5Ozg1NTc2NjYxMzIwLSouMTAyODc3Ozk5Ozg5NDg7OEA4f7OtprG3qqWisKudqqepsrCktsa0ubqzy8a6vMPL0cy0ubq+wMTHtbS2vLK6u8O+wbCzrbCusKuboohraG1vcm9xa3BrZGZnZV5aWVpZWlpaW1paWlxcXVxaWFhYWVlXWFdVVVRSU1VTVlVSTk5OUldYWVlZWVxcXWFqgHp/domNh5CJmImUk5iamJ2om5+qpKSrnKaYoKWbko+eopqXloSDkZqjj5OinJWVloehmpqTi46Kj5mjp5yVlZebkJKHlI6MgIuNgJCKkZKRoJmfoZWTmJiUoaSYjJmkpqemoJ+0sqeyt6Ccoresqq2ksrKmtby1q6uxo4h4cm1dTlBRTE9ETk5OUExGTk5LSk5OUUhNSkFHS0hIQz04NTg4ODk6OzY5OjY4Ozk5Pjw4Oj45Oz84Nzg5Ojg4Njg1NzY4ODk3NDU3NzgyMDMwMSopLS8xMjc3Njo5OTk5ODQ5ODhBN3e2p6S2sKSno6mloKmlpLOqorLDtbWys8fHuLvEys3Hta+8v7i8xLOyrrairLXDurquqqu0r6+fl6d9XmBnc3F2cWpuaWZoaGpfWFlYWFhZWVlaWllbW1xcWVhYV1lZWFVWUlNSUFFUUVNVUU5NS0xTV1dWWFhZWFtdYW9zdnCEiIKHgJGDjoqUkJOdoY6am6KgopeklqGblYyHmJqMc42CfYyWloWQmZCTjY56mY6bi4KJf4mYn6KekJOYloSOgZN+fnOJjnqQhpKQkJyamZmQlY+djaKijYmaoKGjo5uitK+sr6yfmKW4pqWwobGunLC7qqmvqpmBdnJiVkxRT1BNQ1NOTFFNQ1BQSElOU01ISkpESkxFSko8NzQ5ODg4Ozs2OTs3Ojw5Ojo7Nzk/OT5ANzk6PDg5NzY0NDQ1ODc0MzEyNTg1LzAxMDIpKCwtMTI3NjQ4ODk6OjY1Ojg3QTd3t6KjtKilpaijpqWmpaazp6W0wbiwtLDKxrm6ws/Hv7SvvcOvsceyraeslaOtv7ewr5+nrKyqlpSicldWYGhnaWhpbmNqaGdiXFhYWFhYWVlZWVlZWltbW1lZWVZXV1dTVFBOUE5PT1BTVFJNTUpITlNTU1RVVVdZW11pbHJsf4V8dE5Yco+Cl4aNnJeKk5Cel5yVlJWTjpaIf5OJXztXb3uKk4l/i5GMj4WGcoqEloF4gnqFk52Ug5WOkY+ChnySeHFvhY1+iYCQjY+XmZiTio+InIeel4aHlp6aoKCXp6+oramonpattKKmrZmsq5ins6GpraOSfHFtX1pOU1FWTERUSlBNTUZPT0pFTFFNS09KSU1PRklIPTc1OTk5OTk6Nzo7Oj4+ODo9PTY6Pzg+PzU4OTs3OTY3NTMzMzc2MC4tLzM0NDExMC8vKCkrKy0zODQ0ODc5PDo3OTs4NkE5eLegoq2hpqapoKeop6KpsKintMK5sbWwycO5tL/PwLqxsbjEq67JrqeinYWaorqtpqeVpaSjoJaOlmlQTVJWWlpXXV5iZ2NfWVdXV1hYWFlaWVhZWFlaWlpZWFhWV1dVU1JOTEtIR2JcTU9STktIRkhOUVFNUFJUVlhaYG1vaXqCdFBCQH+VkZF9iZSMhIqNmoyWlYqSh4WVhXiIf2BKUW54ipGEfISMiYR+f25+f5N3dXZ4hI2ZcFGNiIqHe354lHZnd4WIfoqIlYqNkJGWi4OJh5SEmouBhJKblp6clKSjp6mlo56bsauhpKSRpqqWoamcoqaoh3NrZV1bSFFRU01JVU1TSUxMUElHRktOTE1US1FRT0ZJQzw3Njk6ODo7Ozg6Ozg+Pzk5Pj03Ozw2Ozs0Nzg7Njc3NTM0NDY5Ni8zLy4xMTUyMjEvLCcpKyosNDgzMzk3OTo5OTo6Ojo/OXa2nKKmnZ+hrqGnqKWmp6+sqra8tri2s8K8t6i7ybm3qaq3uK22wKqim5KCj5mxn6GZjJ+WmJSRioxlTUxOTk9MTVFXW1xaWFpVVVZWVldZWVhYWVhYWVlZWlhYVlZXVVNQTUpFQECba3NzSU1LRERESU5PaFlOUVNUVVpug3R3fmppXVWPiZSJdH+GgHuFjJKAkZmLj3uGj391f3hzbnVwdI2NgXl9iaqEeXpodnuOcHJteICKjJJ4eoB7gHZycZJ4Z3WEg4SEepWJiIqMioB/g4qMf5ODeoCPmJSblZGfnaien5+doKmln52Yjaikk6CflZ6epH9xZmBcXEpWT1FHS1hST0pNTVNKSkpNUEhMUUxSVE1FSEE8Nzg7OTk+PTo7PDk4QD86Oj49Nz09Nzk5Mzc3OTU2NzUyNTI1NzIvMi4sLi8yMDAvLSsoKCkuMTI2MjE5ODc5ODc3Njo8PDd2rpijoZicnrSpr6mlrKuwsaq9tLK8uLa7tbOguLuzq52fraustbOlnpaRmIaTpJacjIKWiI+JhoaDZkpJSklHRkhIUFRUVFdXU1RVVVVWV1dXWFhYWFhZWFlZV1dVVlVTUEtGPjkzTjx+nk1ISkRAPUFEapR+TE9RUlNWXnWDfXlnd42XmI6PfWd5gHZ4f4mPfISYkoFyho97dnpva36tfHOQin97hpKAfX90ZnZ8hWxvZ3N8iYyHgGx5cX1wbXWPcmhxgH2OcEOKhIKDhH93d3qKhH2LenR+jpKPmIqSm5ujl5mdmp2eop2WjYulm4+dl46WmI51bWtlYVlXWFRRSlNWVE9QT1FXS05LT09KUU9JT09LRkQ8Ozc5Ozo6Pz05PDo5OT8/Ozg8PTc8OTk5OTI2Njg1NjYzMzYyMTIyNC4sLC0uLi0wLSsqJycqLjEzNjIvODc2OTY2NTI3OTk1eaaXn56WoKawrK6rp6mwr7GsvLisu765tK6pm7GorZyQl56nrKekm52Th5Z9jpWRlIB7inqEgH5+gGVKR0hGQkBDRElMTE1RUlBRU1VUVFVWV1dXWFdZWVlZWVlZVlZUU1FLRDc4ZjcwP6hpTkhDPTs6RIqFelpKTlBRVFheZXBybYinqsB+dXlie3dvfHmIj3l8i4VvbYyReHN4amp/gnKWkYuBfZZ/SZKYbmh3foJsaWNseYWQkoZrc2x8bnJ7hWltcH5zjIiDhXp9fnp2b3R0hYF5gXdwfI6MipODlpeYmpCTlpeZl56XjIOJn5KKko2GkJZ9bGhtbm1XVVdUUlFZT1NVVVRZVk1OSE5LTk5LQ0lOR0U/Ojg5Ozk5Oj48OTw7Ojo9Pjo4Ojw5Pzg2ODcyNzU2NTU0MTQ0Mi8wMjQqKyoqLS4rLSooKignLC0xMjUwLDU1Njc0ODVIQTg5NXeZkZuZmp6krbCiraqota+urLS/q7zCv6ajmpWlmJ+OhYyWoqSbm5SWj3aRfYSLkI98eH50fXd0d3xmT0VHREA8Pj5BRkdHS0tLTVBSUlJUVFRUVlZXV1hZWllZWldWVFNQTEUxQJozIGpyQZlvOzw5NTyAgoZfSU1PT1JXWlJZXGCniGKaaXR6ZX5vbX96i4h1gYiGdGyZkXNzfGprnY5MeYSSiYSOZzF2hnNsfn2DdGZldH6EhIWAZmlsdWtwf3tncHB7bpKNjntzfX1xcG51bYJ+d3l0anmJgoiJg5aTkpCLjZGUlY+XjoB5iJeIhomGf5CHdWlpbmdjV1FZV1hZXE5QVldaWU9JSUVKSkhHQkFGRENHPTk5ODs5Ojk8Ojk7Ojo6QDw5Ojw5OD43ODc3MTUyNDQ1MzM2NDUwMzEuKiorKiwsKyspKCsnKSwsMjI2LSs1Nzc1NDc4aU84OzVukoiZkZqWpKiunrKeprquq7KwwrK7w8ebl4+UmYuOhnqFkZqWj5KOkopziYR3i4+Mf3Z3dXh2b3hzaVVGSUQ/PDs5Oj9AQURERUdKTE9RUVFRUlNUVVZWWFpaWVhWVVRTUEtFODAvXGCzRzlYUDs5NDQxlrqLSExNT1BRVkxBSVFJYq+zoHF8eG19bHGDgYWBeYOGhnlxn5RzeIBzdZSHNXGdqJ2OoaGEooR2cIZ7hntzjK2NiIBoZmJpbXFtb4J1aW9YdW+NmpF2bH97fG1ybnB/enN1bWJ2hH+GgIaRkYqLipKLkYyLj4N2eYuPgH6DgH2OeHBubmpeWltdW1lYYWBTT1xbWVhMSEpGSkc/Q0FCRz5DRD07OTc9Ozo7Ozk6OTk7Oj88ODg9Ojg7NjY2NTExMjEzNTM0NzU1MzEuLywsKykqKSkqKiopKCopKy8zRE0yMTY2NjQzPHZSNz03YpKBkoiWkZ2kp56vlaW0qK2wrsGzusHGl5CMlJCBiX1ugpGTioSLiZCId4SFbpeKjH95e3txe3R8a29eSlBHPkA3NDU4Ozs8PT5AQkVJTExMTU5QUVJVVVZXWFlYVlVUU1BMRTw1Kp1LW0AtZ0k5NC8+koOprl9ITE1OUEw3Q01SU0RKhnaAfHx2fmx3h4d8fYWCf4x+daGZeX6GgISZhZucYYaqn52LgpCNenaIfomHjnOKl4+De1xkcXR6e3eKbWdpYXluhY+Cem6Bd3OEenFzeXdrbmldd4d9h3yIiI+Ai5OXg42GjYd9cYWAhHx1d3t8h3RtcXJkZV5aWl1TW2deWFFWWV1XR0tLRUxHP0ZAREM+QUE9Ozk3PDs7PTw6Ojk5Ozs9Pjc5Pjk5ODY3NTQyNDQxMDQ2NDY2NTQtLCkrKCcnJyYoKCkpKCgrKysvMDBVcTwyMzMzMUV+VzQ9OVyMd4l/lIyRnZ2fppGgqp+wqa/AsbvFupaPkZSIeoZ2a4CMkoN+i4WQjXmEgnSihY1/f4OAc4OBfWx5bFNYTEFFMzExMjY3Njg4Ojw/QkVHRkdKS01PUFFTVFVXVlZWVFNQTUZAOjI9ICOWY4xbNTMxMWk/R29JRklMTU9STEtUXVlSSmmEiHuJeXxyfI+LenyIhn6Xh3ehmYiGj5KUpY2sqUiGra+vioCAk4qBi4GEkaiHgJiYipxzbHyBhod9jmhnZ3h+bYWGgYVxhIVHa4B4cXl2aG1rX3d9g4h/iIWMepWenIqLiZJ/e3WLdnx4bW93fn1xcXBqWlxbWmNjV2dmXVZQUVhaUURMTEdPSURGQ0NBQENBPTk3ODo6Ojs7Ojg4ODo6Pz42Oz43NTk1NzczMzQ0MjM2NjU2NzY4O0RGTE1NTEM3KyIlJyspKyssLzAwK251MjI0MjBMgVw1PTxehHR8foqFh5GPlpiSl6CdrKCnua+zvbSXjZKLmIt9dHF/ipN/fo2DlJV9h3+GpYeJgIOIhnmIioB1hXlfY1ZMQzYwLi8yMzEyMzY2ODo9Pz9CRUdISkxOUVNUVVRUVlVTUU9HQz84MCwjh1s+Pzg0Ll2VcHOjVUZJS01OUFdgWXBaXF5qjZOHlYCEgoWRk36FiJCAmpaCoKCXlZuapa2Tmbuxp7vIw6eKjKGkjpOJgJB7coOen5GcfnaFhYuPh5BpaG+DgHSMhoSLcYeCdoeAe3aFfW52dWeBlI+GiYmIiYiiq6OWiY+YgHuCint6b2dreX53e3BpY1xZWVxpXWFnYFtQTU5ZU1JJUUtETkdDS0RCQEREQTw6ODc9PDo8Ojg4Nzc4Oj09ODw9Njg3NTY2MjM0NDU1NzY4Njc8QkI/PDg6PkNRXmVcRzInJiwsLS0uMSg/jFsuMzEwT4NfND87bnZwZ3iDe4CMgIGRj4uamqScoaymq6+wl5KRhKGUhHh3gI2UfX+ShpOWf4uBkpuOhICCjIuCiY6FgIqAbXBqXkNBNC0tLy8vLzAyMjM0Nzc5Oz0/QkRISk9RUlNSU1NUUlBPSERCPDg3LzlDPjw8NjMubJOXTVFJSUtMS05WYGN/Z2dtdZ2bj5qTk4uOj5qIk4+di6ChkqOppKOsk6i2oqfBwq7Hr3i6lJp8jKGemYSShIKPoZ6TmZKEioWPmJCVbG91iYuBlYyNj3eQhHFshYGKl5KDhYhyiaGXh5OKj5CXpbapm42WooOHk4V+gGtqa31+fX9xX1tiXllmalxsbF9ZTEhQU1FOTk1HSVFERE5GQUNFR0I+Ojk3PTw6Ozo5ODc3Njc7OjY9Ojc4NTQ1NjM0NTU2NjY2ODU1NjMxMC4qLCwpKCkuOlBhXEAsKC0rKzAsJ3KINzI0ME+EYjNAPHVuaFlwg3B1h3F2kYZ+l5aalJ+fm6egqpaTmJ5oZqSafoWUknqAkYmSkn2LhZmSkYOAgYuOiYaSiISJhXh4f2hOUj4vLy4sLy4tLzAwMDIxMjQ1Nzs/Q0ZOUFJUUFFRU1FOUElFRT47PDpDRj8+PDc1MjxAUjVISEhMTE1OUl5vinxzgX2gnZunpqKZoZeilZyfqJ6pq5+orKmqtZervqu2yMm3yNHPvpugcGmqqJ+Ek5GFnKCampmnkZGIlaGZmnd6fpSYkaGSl5eBlJ57dpWSq7OJjZegfZWenI6Tlpqko6e2sJ6RmqiIl5COgolsc3N8fHluZl5bX19hZ2NgZ2ddUkVLS1FPSkpNR0dNQ0hNRkZDQkdEQTo4NTw8ODk5OTc1NjU4Pjc1PTg0NzQ1NzU0NTQ2OTU4OjYxNjg2My8wLi0qLC8uLScjKjtYYkIoKiwxLShLl14wNjNRhWYzQUBpYl9QcXVgbn1hd459fJSOjoqfkpeelZyqmJ6qQkR9h4mImY55go2Ljo18ioaQkY+Cg4GJjIqFk4WChomBgId3X2JQNDYwLTEvLC4wMC4vLi4wMDE1PkFBTVFSU1BSVFVTTlNMRUVAPD49RkhAQUA4NjYyPDk8RkhHSUpOT1FZbYaQd5WLo6eqtb24pa6srKiptKywt7Kyrbuxs76cs8Osu8nLuMO/t6WjsLKsrKqjipaYhaWmoKKYgqaZjaKqp6SHhZOjoKCqoaSpjpywi5Wkp7i7nKGjsJOjnaOekaSirLCts7WjlaariZqKk4uVent+g3tlXmZaY2BdYmNeZmdgW1BESkhUT0ZITEdLSEZHSEFLRkNGRkE6ODc9PDg4Ojk3NDY1ODw1NDw3Njo1NDY0NDczOTwzODwyMDI1NTEvMS4tKiovLC0qKComJTVYWC8sMCwsMISBODcxUIVoNUFDW1hUTGljV2pwWHqFdoKThYiCnIOSkYyS2sidlnNWl4iPiJyPfYaMj4uKe4mDh5GOg4WBjIaFiJKGgoSJhoeHh3FuYUBFNjQ8My8xMTAtLCstMS8tND9EQU5WUVJTVVVXVU1cUUdHRDw+PkZIQ0RAODs8NUM7PUZLSkdIUk9QV4GToISuo7OqssHHxKuzxbats8CzuL62v7XBtru7pLjGqbbJx7a+ubSoo7StsLCbmZKan4mnr6qklXefpJehq7GymJapraiutbuyuqyvtaKxrLK1vLi1rrWgp6ijqJupsK6zure5qJy4qo2lj5KUoIZ6gYByWF9iVWRgYGFfX2ZgXFVKREVMVlJJSktFS0hFQUBAS0RCTUY8ODY3Ozw5Nzo5ODY1NTU3MTE8ODg5NTQ2NjU5Nz49Mzg5MS4wMTIxMTMwLCosLiwrKysqKCcqKUVaMDAqLytokk82MFKHajZBRVdRSkxcWlFjZFd6dXGBlH2EhpN2hn6AjXu/u6O8grSUk46bj4SIj5OKiXqHgYyTjYiFgo6AgYmPhn+GiIWKh5F6eW9dV0BFTjw2OjQ2QUI3NjQvLzdDSENRXE9RVVhVXFdPX1VJS0pBQD5HS0ZGRDs+QDdENz9CSktFRldUUF6PpK2ksrTDtrjBzMq3vMS9s7TCuLjCtb+wuHSxtKa6xaSwxrmxs7K0qKS2tqqwoKKWm6KSpbGtpa2sp6SYoKyzuaGosbm1u77Mv8XFvbyzwri6uL+4u7i6ra2xprGqrr6xvbzCwq2Zu6mVro+YmauJfoB5aFVhX1ZoY2llVltkWldVSkhHTVJIRElLQUlEPj9CQkxAQE1EOTk2Njk6PzY6OTk2NjI0Ni8xOTU5OTM2NDYyNzs9PzY6MS4vNTg6OjY1MCooLC0tLSwsKigoKysoRVMvKjAwSo9rNTJQh202P0ZSTEFMUldUWVZad2pwf4+EgY6Eb3tyeIhiuaGao4mVlJaTlJONj5eSh4d7h4GNlYqBhIGKenyLiIZ8ioKBi4SVfXh6dWZQXGRHRUw6UWRgW15TRj87SFBFW2NRUVlZWmdaU2BhTVNPRUE/SUpIRUZBQEM8RDZCP0hHSkxUWlRelK+4tbu5ycC7vcrNvL3BvLi2vLy3vrW6ssZgdbKlsZqeq76qpairqqSis7Wgq6eelZaemJ+upaenpZ6jlKKnsLOnsrK8tsG908nJ08bCxczCysPBvr6/vL24tbC5t7fDusa+xMmxnrqroqyPpqm3ioB8b1xeXlxVYF1oZlNZYldTV0pGRk5LQT5IRD1LQj1CQD1GPjtIQDc5NjM3OT40ODk6NTcwNDUvMjYzODkzNzQ1MjY/OEA+R0tSVFRSUFBRUlFKQTkvLCwsKisoKCwtKy9QPiguNDiAfTwyS4hxOT5DS0VASk1QUkxRXWhtbHGQjYaQc2xycnOI1cC2mqCNlZmZkY+XkpaWjoaIfYeDjJaKf4KAgnl7i4SHe4t5gYqCl390fXpsZnB2WV1cUGVlYmBlZF1bWFhcTmRtVVJtbl9vX1hnZVVZVEpEQktLSEZISEhIQkk5REBIS1RUVl1aW5O5wLm+uMbBu7nKy7u3ura4ubS4tbWut7eZZHWpnq1wXqKtnZihopuknqullJ+fkJSOlpiYqJ6mn5+amYOjnaykqrCst7C8uNTQztbPycvRzM/OysfAwMLKvsG9wcHFxMbKwMnPtKS8sbWwnKy5vZp9d2lbXFlXW19YYWJRXGFUUkxEQkZIRjxARj5CSUJARD06RT49Sj80NzUzNTs9NDY4OTc3MDIyLzI0MTY5Nzc1NTU1RDNFTE0+NTEwMDA2OjQ3N0BJT0o7LiYqKigtLi8sQE0rLzU0bYlJMEiJdD8+QkRAQ0RHS09EUlxaaWBwl5ORlG5sb3R1h7OsoaGfi5mcmY2NlpGbkoWKin+JhoyQjIl8gYNze4qDhXuKdIGKh5V/dHt5bG11fGlzZWlsaGZqaWhgZmlpbVpudJetpL2Ih2dbb2hdWllUSEtPUEpLUExTUUhMQUpGS1BfX2JnamKYuMewurS7vraxxce2sLmxsbuts7KorLitjbaonpynmk6bno2PoJaRp5illYqTk4iRiZCRkp2boZiblZaHnpmmmqyvqK+ns7PU1NTW0cvP09TO08/MxcLK0L/KycvJ0sjNzsPQ0riwxL3Euqa3u8WifmxhWVpbVl5WWWRaUF1YT1JDQ0lGREo7QUQ+Qkg/QEI4O0Q+QEk9NTY2NTU7OjY4NzY1NC8xMDE0NjI3ODg3NTM2N0M1Qjg/LTAsMTM0OD05NywuLDE7Rkw9KSwoLjAwMDdLPy00NlSIVzBEh3dDO0I+RUJBQ0pNP1VZU2ZXc5CRmYJocnB5eYOhqp6ml4ybm5iLjpWRmo59iYuGjoqKi5CIfIWCcH+HgoZ7h3KDkouPfnF5dWxxeH9ye254c2xpgHBtY2lucHlpeH1+y7/D36duY3huZFthYEtQUlVOWV5QXV1NUU5UUVVUXG5ud4Nyl664rLWosLarrb3Bsqu1pqW5p6yvoqy0pI+xrpuYmIyRlJKFj5uBjaeSnImDi4SKiYSLhJSVl5eUm5CcmJmZnp2rrKSnoqysztLV0c3L0tPT0NTRzsjD1NHIztLT09bN0tHF0tbGwc/IyMOpv7jQnHZrYlpfW1VeUVxaUFBVUU9JPkFHQkNGPUFCP0ZFPkA/Oj09PDxKQTQ1NDY1PDg4ODY2NDQxMi8wMzUyNjc2ODUzMzs9PEU9QDExKy8zNDk/NTkwMTAyMi0yRU8zKS8zLjMyPU4yNDhDfV8yQYZ0RDo9PUk+QENGSDxWUk1PW3WHhot3bHdwfX6AoJ6eoYyNmZOUi4yTj5aFeYWQkY+MioiRh3+De3J+gIKHeoV2hZORiYBvd3Nsc3x8d3xzgnhxa4Bycmlwcnp5cnu+y5t/jbKEdnKFd2lhaV1EWlpbV2ZkWGVrVFhdXWFjXmN4e3+MgpmqpKSioKGppqqyuqumtKOirqKkrqOnsqCJppuVk5GKko+JgpSJa5WjjZmEgYZ+kYODlJeti5WOlZqOhZKQnZenr6GgoKWkqMjNz8fCy9DT0dTSztPNxtbTzdTY1tbY1dfVytXazcrY1tHLrcTDzIdva19dXFZSV1JbUEpISkpLQDs6PEVDRT1DRD5IQz9DQjs8OTw6R0I0NjU0NDw1Njg3NTQzMjUwLzI1NDY3NDU1NDQ8Pj1FP0E2Mi8tMTY7PTA4MS8yNTQvLS47UjAxNy81MzJFRDI4Pm5iNT2BdE05OUBJPEFEP0E7UExGS1lxgHZ+aXN5coKKgJ2VnpSFi5aJj4qJjoiPgHiElJmLjYmIi4l/hHlze32Dh3eAe4eRl4GEb3hxbnWAdnh9dIZ8eWyHdnVufXaEdXl8nraNPEGLxqV+jX1qZVdJQ2VjZmNoamRveVtfZmhrbmlugYOJkoyen6CekZeZoKOkp7OlpLKgoqWfoqmio7Kch5+SkpORi4+Lh4SPhH6cnIyNgoSFepR/gqqWo4ySi5iTi32XipqRqrOYmpynnKa9w8W4tsXN0dDS0MvSy8nUztHV2tfX2NTZ2M3Y287J2trS1r/MzbR0c2phWVZQU1BYVUVHS0pGRj46NzpAQkM6R0VARURCREE7Pzs7N0RDNzU2NTU7MDY4OTQ0MzM0MTAxNDU1ODc0NDQ0OUA+REJDPDMzLjZGVFdPUUpBSkY/MiooLkJUMjkyNTQvN0s3NTxgYkE8c3ZWODdBSDo/Qj48OVFFQ0pUbG5vcGJxcXSGjX2XkZ6Lf4eSg4mGhYqCiH14hZeXiY+DiIaHe4V5cXt7hIV1eoWOjZ56jXB9cHB6gHJ7gXKEh4Bujnp1d319g3WAfYeJsHRZqsK3jZKBcG5jPV5ocnFxcG53d4JmaW9ydXlyeouHj5SSm5agloiMk5yfm5+roKGsnKKamqCmn6CsmoyajZGTjoV9iIiDhYuOoJmUiIOHfmyZeoSZh4iTjI6VjIZ7m4iTj66rk5WXnpimrrW8qK29xsvIycvLz8nD0srU19jX2NfU29fT2dvWz9va0tbJ1cySdHdlZFhXTlFSXEdDRklJP0I+PTg6PkA7Pkk9QEJBQkVBPj86ODdEQjc1NTQ3OS41NjY0MzU1MzIzMjM2NDc1NTM0NThFQkRDRUI1NjxGTlNNW25mY25za2BWPiw1TEc4NjU0MzNCRjQ9V19oTHV4Xjg7P0Y8PEE8OjlEPkNHUmtfbWRiZmx2gIhxkZCbgHmAjn6DgYKFf4R8fYSYjoeMf4aHgXeDeW97e4eCdHqSno6hdpB2g3R1gX50gIRvgZCCb5KFdX2ChXp3h3yJuMalw8q4gpacj3hwZk5lY4J6gneFoZGLeXl3e4SAfIR2bZSWlZaQmJGDiY+XmpeXpp2YoJefk5OYo56brJaRkIuOk4OMhYmJgoaQkZ6cmoiFjIGGmHuIiZ+Xj4mOi4uCfKCIkIq8oJiTl5mcqKalrZ6ntb+/v7jHyc3OxM3K0dXV1NnV19vU19na29fb2tnYztvGgnV1Y2VhXVJVVVRNS0RORDs9PTw5Ojw/OT5BNj4/QD0/Pj05ODY3Q0E2NDU1PTgwNjY1NTQ3NzQ1NjEzODU0NTY0NTU3SEg9REpFNzkyNTtIPjs5OzdJUFxaUlVYTDlUPjs5NTMyN0k4PU5ZTUh4eGQ1PT5DPTxAOjY6Pj5ARVFfWWZhXVxpdHp5bImNknd2eop8foB/gH6Ge36CkYqFhnqFiHx2fnVtfX2HfnR/kp6RoIOSfIZ+eI9+eYuKb4ObgXSZh36CioV8fpF7kKmPkMOgvY2cpJx+ioV9iXOMi4BzppqcmJSFe4+RiYRpR3ChpJ6MjJGShYiLkZOVj52bk5SRl42Mlp+dlKGVko6OkYx+kI+Oi4SJkpaZn5+IjJSRnZCDjH+mmYiFjoOGhICkhYqLt5edkZSVoaagnZ2do662ubSrwMbK0MfHzM/T0tLY0tXXwNfY2dvY2trZ2dfctnR0c2ZmYlRdWVJPTkhETEM+PT45OTs6Ojo8PTZBPj89PTk6OzszN0RAODM3OD43MDY4ODM1NzwzNzgwNDk3Njc1NTU0NkZQNUROSTg5MzhBSz07M0NASTw6RFdPPE1USE4/OTYzMzM+QztbWD41WXlwWjw8QTw9Pjg1ODk/PURSU1JYXlZYZm1tbWmBjopxc3iKe3uAfH98iHt9fIuHgn51g4Z6c3p0bYF+hX53hpuhm56Uk4CMiH+Yh4Cckm6IqYV7oYx9kY6DiYWdf5uRio2jop+RpK+gi5GLhYuBk4ZXcq2Ln6uckIOZnJCQjluCopGCjZ+TlYyHiIySkoyUlZWQjI+KiJacnY+Wl5KMk5SGgIyJko6Lip2XmKOjhpOdlaCKioiOnJCDiY+Ag4eFpISLkLKYnJKUl6GgnpmSm52nsrispb3Cx83Hxs/Lz8zO1tDR1K3W1dja2Nra19bZ2ZxreHBjY1lZVVFVV0NASUQ/Pz86NDg6Ozc6PDs0PDw/PT43Ozo6MTpHPToyNz1ANTA2NzcyNTU/NjU7NTU4NTg6NTc3MzVIUjdHT0s5OTQ9RUpCPjFGQ0xCOTg6R1hANUhXSTY2MjIzOkVDZVg/Jl95aV96Pj45PDs4ODs8QDtCUUtLU1lQVGNieW1ifpGDb254i3l6f3uBfYd8fHeGhYBzcIWCe3V3dnSEgoV9f5Kmop+mopeKnZCUl4uKqJdyirONhKiShJmUhZqNo5agmJOJm56ik6mwn5GVkY6OiJaMb423hJrEyLKdoqadnJiWkbKQZKTNx5WOhoeJkJKNjZOVioWKioaWmpyPkZWTh5WYhICQjJmJjpCrl5eko4iZnpWaiY+Hl5eKhY+NgX+Hj6SIjZOompeTlpihmJ6Zk5yborK0paO9wb7HxcXIyMnCytLNzdSo0tHW1tbY2tTT2s5/bnpkX1taW0xIVFpCQkhEO0I+ODM3PDw6OT42NDo6PDo3Mj86OTI5STo+NjdCQzMyOjk2MjY0Pj00Oz42OTQ5OzU3OTQ0S1E8SlFLOUE3QkdJQDY0SkVMRj47ODhFVEE3Plw4NjIxNDo7RWBYQUZhdGhMY1o+NTs6OjU7Oj06RU1GSFNXU1JCY4JHdoGOfXxtfoh5e357goKDf3d3gIN8bW6Lf3t9eHh8hIeKfouis6ejqrOil6egpaSWla6ig5G4lZKzmo2ioYylnLCjpJ2ZkaeWqZqsr6SYlZaVkIuYmpehwI6jybirnKOmrpiSm52ynYWGqKKcmIWJiY6VjIuTj4iBhoeJk5iVjIyUk4eUmIaEkpCcdZKZs5aXpaGHnJmSj4qRipebiYuXjoZ+jJieiZCQm5qak5iXn5OgnZSem6CxrqKkuL60xcfEvcPDwMbNysnSps7N1NLQ1tjT0Ni5bnVxWV1SXVVOR0lORUFDRTU+Ozc3Oj88PDc9NDM2Njk3NzQ+NTs1PEs8Pjs8QkE3NTw7NDI3Nz9ANj9ANzg0OTg3Ozw1NU9NRFBSTDhAPUVBR0E1OkpFTkVEOjZBQEJTPjlETzMyMzU3NT12XDxSXHRpWk1dUzw9ODg0Njc9OkpGREdOWlxZSmZgO0mEi3p6boWGen2EeIGGgX5weH1+fW9zjXp+gnx4houJhoSSprusqLG9r6Wts7OppKKwrIqatZ2juaaVraWWqq24p6SjoJqpmKqkrrCqmpmclJaRl6CYmru7rsqhare4q7CVmZ6jrJOXvqNeqrKDioqNlIeRfI6OfYOGjpCUlYiIk5aMkJWNi42XmZOdmbSXlaudipyUkY2QkoyZm4uTnpCLipafoYyUjZeZnZKbmJ6UoaCUnJ2lrqihpLS4rMLIxbW6vbzFx8jC0aDGys3NxdfW0cvUnmx2ZFlXUFtQTkVDPz1DQkI4QDg4NT9HPTw2PDM1MzQ1NDU0QjQ5OkJMOkI7QUhDOzpAPDc0NjxCOT9AQjg3NDo6Nj48NDdUS0NVUUo3PDpJQURANEFKSE5CQT82REE8Sk5EL1Q9MjU0OkVKXFhKWlFtZ3BwRGlgS0k2NzU3Oj5KQENJUGRIYmBicElAi4p+gXOGh32CiHWDioJ/bn19fX9wd4d3joKHfI2PjIaMmarCwK+9xruztMC9ta2rs7aMqLKurb2rm7ulqK25uaunpqKipKOqr7Kxqp6cpJmbmJifo6alkqO6r6m/vK2usrmlpah+iIecrb2wg4yMi5CDjoORj3qBiJCNjpyIiI+XjYuVl5SRmpadqJqxmpGsnI6aj5KOlJCQlpePkqCSiZWbo6yUlo+UnJ2SoJ2bmJ+gk5qepqWkoqOwsqbBxsOwsLu3xcPDv82mx8THxL3W0c3FyoVvb15ZV1xZTEpCS0FGSD9BQEM7OjU+QT4+NTw3PTMzMzI0MUExN0BCTT5HQENOQ0E9Qz07ODZDQzVCSUI6ODc4OjVCPjc5VktEV09GOD00S0BDPjRFS0hOPkJBNkJCP0JTRTU4UDE0NTs8ODtEPjlMampdO1dSZEtnWlVONzlHRD9DRlxlRmBpZ1pdXZOMjIl7h4yHg4x1h5GKgW9+e4J/cX6BepV6kpSUmJCTlqezxsm/wczCw7nHvbuvq7q7mLO3urLArqbApKuwu72qrqujo56nq661sKmboKqcoZyWn7C1p4yju7q2wbysqZ20paWplIWOqsTDpIKLj4eIhIaVlI16g42Rj5GhjIyUko6Jl5+Yk5mVl6agr5yMq5yNlo+RkZWVjpGVkpChlIeXn6GznpSZk5+gl6Semp+bn5SYnqWjpqakr62lwMTDrqi3tsnDvbbPssS/xLyz0crIwrRwdWlZVVlnUEtIQ01LTEpBQj5ERTw1QUU8OzM9OUIzMzIyNjNBMDVJRU4+SUBIUkBIPkNAOz49RkE1QVVAOzk5ODw3RT44PlZKQ1dPRzg/NExAQjs1SktDTD9CPzxCRj1BSEw5K0c8MzY3NDY0QT83T2FPYUUvPT42a2xqYEA6SD4/RUJlWk1lXGVUYmqZjZaKi4iTkIaJeYeUkIFygHuNf3iHgoKQeY2hlqiZmpm6vcfIycHSycrCzb3Cs628vqe6wL27xLeswamss7y/qrCqpKWkrK6zrba1oKCvn6WimaO0vamcqb3Co7a3r6yUsqysrZeHmqqmpZGCjJOlloqBdYqSeYWOkpCdn5OPlIuPjZSjmZeclJSjnqqekaWajI+Pj5WWiHyPlpOTo5uVoKKctaWQnpako6GlnZ2lmJ2Vl5uko6mnorKsqLvAxK+ls7fMv7mvxLO7vsK5rcLDwsCXaHVeVlRYWElKTElGRERJRENCREw6NERJOjs0PThFLjEyMjQyQjI2U0hPPEpCSlFFS0NERTpFTEI8N0VWPTs9ODk/PEk/OkVVSUFXUUc3QTpLOkI3OUpNQklAQz48REc8QkNPPTIwSDM2NjE3MD1COj1qakpLNVFTM1NwcGROO0Q9QEY+aUhfWGFaY2NWno+djpeOnpKJin+KoJOEeIV/lX9/kIiKkYCWoZmtp6SYwr3Hw8fF087Ozcu8wriwury0vcu7w8K2tryts7+5va6vqKCpqLauramyt5qeraKnoZ6rt7iqpa+/xbG9urOoq7e0r6+XlqWsqKCRjpOyxaeWjnySlXyHkpmPqZiXk5OPkpWTpZ2TnZmToaOinJifmIuMj46diFqQl5eSl6SZZZiin7KllaGVqqupppqeppeYlpiUoKOopZ62q6m5u8O0pbS2y8C4qrarsru4rqi4ur23f2dqV1RSU01FSlJNSz9CSEVFSUhHOTZGTTs+Nz5BSi4zMjAyNUM1NU9WTjxMRktSTE9IR0k+SVE/OjhJUzs7Pzc5PkRMQkBIU0tAV1BGOkE/RzZBNztITUNFO0M+NEZFOkJBQkc5LzpBMzYwMz5HRDk0PXRkTUc7RSs6ZnxnVjs+QEJGQnBFaklSZWFMRqWUnJeil6mWjJGDiKaTiIKHgpyEg5WQkJSPmqKer76voca8xMTGxs7OztLKv7u2sru7u77PtcS+ubm3s7G1s7izq6ecq6y5qqinr6+YpK+kp6SltcCwrKy0v8O5wLq0qLq3ubSwlqWtr66ki5OVoY10wpp9l5qEjpeZjLCVmpqVkpKZmaWjlaCalpqpnZugoJmKjY+VnGBKlpyblZqlllSWr5+vnJ6jlK6tqqSZoKWTk5iYjZufp6KZtKiqs7u7u6uwssi/uKasq62ysqOhsrK0pG1qYllXTU9KRE9QUFI7SEtJSEpDRD46S1U/QTo9RU0wNzU0NDpCNDRNV087SktPVU5RSlBISEpPQjw+TVI7Pj04OjxDUj5ESFJJQldOSUBCQUYzPjU4SktDQT1DOzVFQTpBPz5IQDUrQzUyLD5jXWc6MzV0ZGVAUjcmIzN9aFc7OkJDQD1RRVdTc2JXRkiql5mgoqivmZGXh4uolo6Ik4Wgh4Sdl4+doJujpLTJtanFucLEyMrJyMzNx7+7s665ucHBzLXIusK5tbqwr6+ztaajm6q0taqppq2smqWupaSorLq/qKy2t7/CwL65s7PFs7q+raSvtay5poibmKabdr+fhJmejpOamoyul6Gcm5eUmp+gqJ6on5maqpqhp56YkI2RnYNudpKimpWdop2RrrKjq5SnqZeqrKOinqSnkpGZnIeUnKKdlrGmqau5tr2ysq6+ubago6eopaacm62pqYtfYl5dT0pLRkdNSlZNPU5GT0tNQkREPFFWPUFBQkRPMTg9NzY/Qjc1VVhPP0hOUVlTUFFVS1FKSkVBRU1RPz89OD07R1I8RURRQkdZTUtBSERFOjozOUtJQj5DQjk5Qz48QD47O0c3LTI+LTGCaE56XC8wa2hgPD1CQjg2emZXOzo9Li1SYE1VSH5lXkhFq5WboZ+7r5mUoIyTq5yRkpOJq42GoZ6Mo6yUo6S2xr60wLnCwsfJxcLNyMK+ubKvurXBwsm1xrLCvLW6qqitrbCio5iqtLumqaarqp2pr6ejqqu9u6isvbW4vse8t7a5wrO/wbWqtresvqWPo5iSoqC9n4maoZmXn56Pt5+pnKWim5yhmqiks6CbnaacqKqemJWQlJuLlomMpKGUnaKdoLSvpaWSr6qZqqmcnKKiqJCUlJ+Cj56em5WppKGhs7S6tK2otrKynp2jpZuXlJiqoZ51XFldXEhHRUZMUElORUdIQ1NMSkJFR0FXU0NIPUFHUTE7Qjc6QkY3OVxZS0FMUFRVU01XUk5VSkVASkpOTzlEQDU9PE5RQz8/UD9FWk1KQUtER0A1Mz1JRz89RUE5N0E7PEA8PDNAPC8oOypIkUI6U0owLFtvVzcxPCodQoBkVDQ5LTE5ZlxGQ0OdcGJHRaeXo5+ew62cl6WYmqqcl5uaj6qWlaemla2smaKrtsTDvL62wcLAx8O/zMW7vbmysLmzv8LHtb+wvLe5tqWkq6utoKGZqqrEoqSpq6WerK+roqmpvrenrb+yubfHtrW5ucCzwMO4trO0sL2jl6OXlJyUrp+QoqOlo6OgkL2lqZ2pq5ycoZulnr2imaOfoqmsoZ2Xjpaek56Hj4SNk5+koJ61rKaclbCmma6lnJmonJ+MmJSeg46gmZuSpaSamKuxtbGqpaqtrJyYoKCSjpCVqJ6UZV9XX1xNSEdJTkxIRkRJQj5RSUE8R0lJXFJPSz1JT1U1QkY5PkdHNUNhWktCTlJVV1ZRWFRSVUlAOFJRUE06R0E0Q0hRU0lDO0M+R1ZLQ0BPPks8MDY7R0Y+O0ZBNTU/OTo/OTsxNUQwLSwvTXZcNEtaNSxNblc8LT0pHiN6YlE1Q0tROW1RRjxLeGVhVkuimqOcnsWsoZ+sn56uoJOjn5aloKaprJi2saOqs7bFxL2/tcDCu8jBvsnHtri1tLGztLfBxba+sbi1uLSfpqyqrJ2enqWkwaWfqa2fpKqtr6KmqLy1prG9ube2xLK0uLvAtMXCubmvs7W1o52llZKUoa6fmaKeqaiso5rCrKmerK6bm56ZpaC9oZ2kmKurrKahmo2an5KeiY5Xf5afpaGguKqmk5i0op6wn52ZrZWdjpiTnIGOn5eVjaGjlpClrbGrqaGipaSVlZ2Yio6RkqSeiF5hWGJfS0hKSk5GRUFHSz8+S0I6OUpLTl1RUUk9TFdcOUZJPURNSDhIYltLQ0xQU1lZVldPWl5JQT1XUUpMP0g/NUhMWFNIQTpAQURQSD8+UT5LNzA5OUZFOzhHPy42Pjc4Pjc3LzE/OTElMVFVbVtKTzEwPWdXRDE3PS0rd2BTNlNba1dxR0U2PXVlXEtNnp6hmZ/EqKahtKKds6iUq6WgpJ+tqaydu7CorLaxx8XBwrLDw73Gw7zEybyvsLatsLSvvsO0ubKwurSsmaixqaqanaWhp8Gtm6ywm6qjrrGppKi8tqe3u76wt8Sts7PDwLTItLy4rLS2raqippaVlaOsoZ+gm6ersK+vu7GmoKmompmYk6KjuKCho5KwsKylpp+Top6Vno+QjZWem6Kep7SnpoyXspuirZmcmquPnZKVkpl/kaCVjo2foJSLpauvpaahnKCdkZGak4WKkY2bnX5fZFlmZUlITElTQUNASUg7O0c/OTlPTlZeUlNKP1BeXT1IUEJMTEk5TmNcTEVMUlRZW1NVT1xiSEE/WlFBSEFLQjdGRUxLTT87QkhETkI9O05AQTMvOTdDQjk3RjsrNjw0NjwyNS0vNEAxKyZWdFNlTz8xMDRiW00yMz4wPHZdXj9bVF1lcEA4O0iWd2VBNJ6jn5ugw6mkqrOipLWqlrOtp6KksqyuqbuyrbG1tMbAxMK0wMS9ycS1v8fBtKu1qK+4rL/Ds7ivrba5pZiqsqurmJ+ml627tJuosJqtoK20sqerubKourS5s7nAqreyxL62x6jAr663tamnrKGYl5KmpaKimJmlr7iusrW2oJ+ppJqUlpSkoLeipaWWsLKyp6umop+ampuVl6ifoJihnq+yoqaNlq2YpKqWl5yij5qMkpaYhZWek4uQm52TiqioqqKmoJmdlYuOmY+BhZSIk553YWdbamlMT01OVD1DQU5DOzpJQDc3Uk9dXlJWUUFXYFxCSlNIVktIOlRkXE5GT05bV1tSUFFYXUdBQltQQkc+TkM5SEdIT1A/P0NJQkxCPDJJQTk0MTc3Qj47N0U3KzY5MTQ4MDEtLy48Ni0jQnFnc2syMy8xW2JaMjM4MDZwW2JIMDRJb2dVQ1dGjHlmQzujo52hpsCnqK+xoqq1q566saykq7S2sbC5t7C3uLjFvcPHvb3EwsW/uMDFwLmptqSsu63Awbe3qq2xuqGTrbGtspakp5GquaqfprGcq6CvtLOrqbW2rbyttLO5t6y4scO7wMCnxKuxt6+pq6unnpiZq6GioZGYobGvs6ywuZqbqZ+al5OYp6C2qaajorGxtKyzqK2gnKCgm56lnKKXnaOzr5ufkJOkmZ+nmZOhnZOXiJOWkpWWnJKIkJqYlI6oqKafopuYm5KFjZmKfYuVhI2ZaGZrYGxtV1BRW1VBQkVUQDw7SUE4OlhQZF5QV1dFWV9eTk1STl5LSj5ZY15PSFBPXFVZUEtUV1pJP0RYUERGP05APUlHR1FQQj1ERUJNPzoxRD83NzU0Nz89OTVFNCs3NS8yNTEtLS4sMT0qJys9XHA9PjEuMGRaYz8xNjQ3Z1lgRig/OGx9Z1tWO4l7Y0M+p5+doqq9oqqwrKSyuaqmtrWsoa21va+zuLu7vre2wMK/ycS5xMO/v7fDvMC2rrWmq7exu72+tKmusbaelquup66XpqiOp7ufpKyznqyisbCzrKm1tLW9rrGytaywtLPBu8a3rL2wsbisraqjsqaepaqgpJeQmp+zqrOrq7Oanaecm5aOoaaktK6ooa2urrGotK2zqqScn6iknpWimZuotamXmZGRnZmdn52PqZyVl4SUloqdmJuTio2WlpqWpqWjoJyWlZaSf4+UhXqOkoKLlGRqcWZvcV5GWWdWRENNV0RbOUhDNj5dUWhcTlpdR1teXk9OUlhkSkpCXGJfUUxNT1hXWFBKVlZXTD1FVUpFREFNQEFGSEhRUEE7R0RGSz04N0I9Njg3MTk+PDY1RDArODAvMDUvKiwvLSo9LCwlMisqNUsxLydfXl9UMTUwPWBWXjgqQzNZVVxnSzaMemZMQKSaoaWtt6Ssqqavrreqr7a8qKext8a3sba9wcO1tbrEvszGucPAub65w7fAuLGzq6m6trq5vrSprbC1l5inrKmsm6urjqu+nautsaOroLGts66ttbK4uKqur7Gota+1u7zKs6q3trG0r66mobSgm6mtoKaWlpuasqOuoaavl6GkmpqTjqOmqLOqoqezrau2pa+ytq+jmZ2sp5qXn5uZq7eil5OQjpicoJeWkqmdmpJ/kZeMnJuYlpCKlJKemaShoqCYlpKSlXqLj4V6jIqCipFqbXdsdHthRmFrWUlHWlo9e0pGRDZBYlRpW01cYktcXVtSU1JiYExLRV9gX1FMSVBXVlVPR1dWVU46SVZJSD9DSz9FREhIUU5BP0hISEU8Nz0+Ojc1NjA5Pzg2NkIsLTgsLzA0LCgsLy0qNzYoKDkuJDpLNS4iVV9UXy81KENfUVwuKkEvSkdQW0czY1lVS0SZl6GyqbKqraakr662qri2uqWstLfKu7S7ur+/tbO3w8DMyLzDvLa9v7+3vruwu62mubm2tcK2qq2wt5SWp66rqaOwqZSvuqSssbOnqKOytLGysLSxt7Opr6yyp7evt7TExreptressa2pp6O2oKCosqGllZyalbKeqJygqo6po56blpimpqW4qKOytayosqiusrarpJmgq6ibnJ6clKm4nJSOjoqXm6GXj5akn5uUgpCUj5yal5aViJaPl5qnnKSfkZeRkJV2g4+He4SBg4uKbG92dHt+XExmbVtLTmNcPmJ7R0k4R2dXZlxMXmNNWVlXVVhUaV1PT0hgXF5QSkhRVlVSS0hXVVZNOE1aTkVARks/SEJDS1NNPz9MT0hAOzo+OzY7MDQxPD00NTg/KTA3KTEuMikpLCwtKy05JDA0MiU5QjcuI0FOR2UyNydHYkxWJSxBLj1FTFE8M3JrSUNDkZmlr6Wur6uopbGztKu4srihrLW5ybmuwbvDuLOxtcLCzsXAwb20vb++ur68ssOnqLiwtbW/vK6rsrGboKexraamr6WdsrWtqrGxrKmotbuttLK0rbOtqqyorKm4rbKwyMG5pbqxqa2tpaiusaalpK+kqZyenZuwmqOjo6ORrZ+koKCiq6anuqWstramq6yprbG2rqOeo6iqm6Cbm5Kjs5mPiY2GkKGflIyTm56RkYOMkpKcmZeVlIeXkpWZp5ugnoyTkY6Qd32NhXx7fIaIiHBycX18fFxTZG9dTlhlXEZElltHO05tWGJcTWBiTlZXVldUWGddUVJMY1laVEtHT1RTTkdJVlNcTjtQXklCREhKQUU/P0tTTz46Tk1DPDw+OTo1PSszMj02MjQ5Oig0NSkvKzEoKSssLSomNSovJjApMzg6MSYqM0JjOjYqSGVISio6Rz4zQkhTLD6QaztHSI+cqqyjqrGkqaW0tbK1trKyoqyuvcy6rsC6x7G0rbTCw9HFxr7Asr7Awru+t7vEpqu2q7K2vMCvq7Gsn6OnramppbCjqrKqr6ywr7CurLS9p7awsqmyqaulpaOtuq2qssO6tq27qamorKmnsaWqpaOvqqiin5yjrZWlnpiemaydoqepoq2mpK6suLOyoqqjoKuvsayen6anqZmkmZmPn6aYh4SOiYudoI6Ki5SajY2EhY+UnpyUl5WGlpSTl6ScnZuLkpCOiX5+h4V8dn6Fg4RycXCHdGxfWmBtYVFycFxLPIV8Rj9YdFhhWk5kXE5WVlVXUVxhXlNPTmdYVlZLR0xOUkhFSVZSXWM8UF1EPEZISEJHPz1KUEw6Pk9KPTk/PTI6NzsqMjU+MTA0ODUoNS8qLC4zMDspLCwnJTIzNCQsMi04NjApKDE7XEowLkpnRUY2O0IvNEVLWDJAlVk9TEWWmK2poquznKqqsbetubevrKarq73JvLC9tsKvsauzw8POz8O/v7TAwcO5v7PHw6qutq2yuL++saytq6SnqrCoqKmxpbSuqrGurrKxtK61vaS3s6ysrqiroKOesLerqq26t6W3tqSqp6yrqq2hqaensrKkp6ahoayXqqGVm6CmnqWiqqSto6CnsbiurqSmo5uqrK2qnaKko6SYoJuWj5eck4KDj4iFm6CLiY2Kl42OiYKLl6KakJCbjJOSkZOjmpuaiY+Li3yGgIGDenN/gn98cnWLpId4a19gbGVXZIZjTj9nk0xFYnlXY1lSZVVOVlVWVE9cXWFVS01oVlVWSUpISU9CR0lTUVlvQU5YQDpKR0ZFRz4+RVFIOENLRTg3QzcyOjo6KjM5Py4vNDYzKTQrKiwrLiM0Li0rJigrNzkqJjYrPC0yLCYwNlZZLjBKZ0FBOztCKzpKT140RIc9R0ZEl5OwpqOrsZirqq62rLezrKasqqm8wMC3uLK8taaysMPJy9HAwLu5v77BucG5wMOssbSxs7rAvrKwrqyrq6i2qqeur6q5sKiysq+zrberubimtLerrKSpqp2knrOzqaiktLSgt66gqqiqqKunoKusqbm2qqqqqqKqoK2ckqqhnaCloqajqp+dqLWvqaaro6SZpainqpyio6OfmZmgkI2PmI1+h4yHg52dhoOIiY2MjouChZWhmY2NmpCSkY+Tn5eZloyLg391h4F/f3h0gn54dn2Ah52Pb3FnZm93XF9yiGpPXplWSG55VWVXUWNQTVZUVVBPWFpiVUhPaVRVU0dPWFVJPklIT1FQeExOVz08S0Q/QEE8QENVQzlBSz01O0UxMzs6Nyo0Oj0rLTM0MSo4KiorKiwpKSgvKiYpJTM7LCQyKTIwMjElLzFQYTAyP2Y9Tlg/Qyw+TFRfMEppNU9EPJePsaKmrK+arKatsLS1sKymsKqpur67v7Ctua6itq/Jx8jRwL69u7vBvbrDv76/rbGxsbW8u8GxsLOqs6mktKmlrrOzubGjrriysbO7q7uwqq62q6qeqqufo6C2rqmhn7CyobaqnqinqqOqoaKtrai+sKyuraKoqKCsmZCwoZiioKeon6ibmquxqqOgrqKhlKKko6eYmqilmJeYno+Kh5SIfY2GhISjloSBgYqFjYuQg4OTn5aHkZ2Qk5CNkZyUl4+KhoZ4dYJ/fHV4eX95cnF3Zn6GpHZpX2NpgHRmiIx8UlhwX0t4c1NkVFFfTU1TWmZOTFZZZFhHUmhSUT9CTlFhUTpJSExTSXFRTFM7PEk/Ozw9O0BAVzw8P0g3M0NCMTU6OTMtNTo6KS0zMS0tNSkoKy0sNDIjMiknLCUuOy4mMS4wLTE0JSwwS2c6NDhfPWFkP0YxQ1BbWypITDlVQDSSkLOhpaetpKekrae1s7KrpbCnqre9wLuvp7mqpq6wycfI0cO8v764vb68yLrAt6+vs7G6urfAsrK6rLisorSnqK2zt7qzqKi+tq+3vrC/p62stautnKmvo5+krayonJ6qsqS0qJurp6mjqJ2jqaipvqy0sK6dqqSgrpybs6KVpJukpqClm5uqrKagnKuinJOcoqadmJeoqZKYmpSQioKPhX6Pg4CInY+Ffn2LhpCNj4N/k5qShZOijJSRi5GbkpWHiX+Acnt6fnxpeHx5c25uemaDd4WKZGFmX3GDeWxmeF1eVD9Xe21UYlBRWUxMTnJ1XUhaW2dZRVVlT0M+Sk5EQ0E5SEdLUz9qYUlROD1IPDw8Pjo8P1Q2Oj9DNDVIPjI7NTkwMjc8NSguNS8tMTEnLz5LSDAlGjkwJSwsMDkvLCwrNicxNyMtMEdpSTI0WD1mYkFKN0dTYFUqPTlDVj0qkJWymqChqqaloquluLO0pqqxpqy3wb21r6K5rKensMLKyczBtr3AtLe/usi0wrSysbSxvbe5vbWtuLW+rKGzp6ussba4tayfv72qs8G0vKGvs7WqrJ+tsKOcpamqpJ6cpLClsKCfq6mnoamcpamhrbyorrGuoaujpK6en62ml5+boaSdoJ2bpKujm5ulpZaXlaCjl5uWpayMnpGRkYuCioCAjoF7mZSMiHt+i4WOjYuJhJKXkIaUo4qTkoeRmpGTgIl9eWx+dnl4Y3x6cG5ucHVmf3JqhGhkZl1rcoxsYGhwYG89W3lsVV5OUFJLSk1UWldNXF5sV0RXX09eT0hNREY7N0hFS088cmhLSzlBRTs7PT47Oz1KNDlCPDM7Rzw0PzE4LTY4OzIoMDkvLDQvLj0tKks+KR00OSYnLjM0LjArLzQmLDokNDFBZ1kxNFM9ZV9ETDZLVmRPKjsxTlc9I5SarZqgmKikpKCopLiwr6Svr6mruMG5sq2fua+rqLS6yMvIvrbCvq+0vbfEtsKxrbixssC0u723qLm3vaqjtKipq7KvurGrnL2+prDBtreir7a1p6ansLOfnqWmqKKmmZ+sqKmeoaqupqCmmKSpoLG5n6Sxr6GsoayknKenqJmam5+llp2dm5+rp5edoaqTmpSZn5SZlqGpkZqJjpCGfId+go19fKCMjYh4gouEiYuLhYeTmo6JlZ+JkZWCi5eOkX2FfHNwfnJ0dGB6eGhtbm5tZ31xY3ttaWRgW2SEfl5Zc2pySUl/aVhaTVBMS0hQUlFJT1xfblNEWFpSZ05HS0VGNTZIQkxJNVplSkA2RUI5Oj49Pjo6QzU5PjozQEY8MkAyMy46OzgzJjI8MCw4NUIqKS1CKiw0O05OQDs3My0uKy03Kio8JTUzPGVjMjRNP2VdRk89UVpnSCo9L1dUNSiXn6eanZeuoaGhpaG3q7KmtLSpqLnDtLKtoLitrq2wtcbIwLa+wbmwtLy3vru9r6q9sLS/sb3Duam7urenp7WpqKyyrrSxqJy/uKauvbizoLG3sKilp6+xm6GkoKWloJecr6ahnqOor6GfoZSlpaK4sKGmsaufrKOvmJyqpaiel5qepZSbnZueqKyanZ+ml5eYlp6Ok5eiqKKQiYuPhnqEfoSLeo+XiY2GeIGGg4eLjYWNk5iNjpaZio+XfoaXjY95gXpwcndwcHRfeXdka2tqZ2aCbGVyamtkZ1dgcn9eWWt1aVhFfl5aWE9PS0hIUlVHMjleXm1QRFdVWWVMSEpFRTA3Rj9LQjZJSkg7NkY5NDk+PTw5OEA4Ozg6N0BJPjg8NC0zPDw3NSg1PjEsO0ExKCs2PCM4Uj0qMTEzPkQ1LC0nNDIrOysxMzljbDg0SEJmW0hUQ1RdaEUuOjFdUSwyl6SjmJadq56moaOhuKqwobu4pay9w7KvrqK1sKytr7XFxL2zvrq3sLO5uLq4uq6tv7O1uK+/wbirvbq0paKzq6mrtK2us6Sew7anqri3rKCzvKqnpaivq5mip5ykppSYobKlmZ6kqamcoZ+UpqCkuaikp62mnqWhqJOgqaGhoJmbnqGTnJ2XoaOsnJybo5aTlpacjpSTo6ekkImKjoZ5hHyFhn2djYmKhniAhIeHiJGFlJOSjJCVlI2OlHuDl5CLd398bXVzbW10Ynh0aGZpZmNtg2ZnaGRmZ2hdZGFoZVplemJgUHNUW1tTS0pISU9TQCAqaV5qTENWVV5gS0hHRUMuOkI8Rjw2S1BEODpEMzU3PT04OTU/Ojs0PjhATD0+OTMpOD48OjkqNkAzLkU0KCssPjAtTz8uKy03LTExOTUsJi41LTgwNTc2YHNCM0NEaFtLV0dVYGhCMzc3YEwnMp+kpZOPpqecn56epLatqKq6t6esw8C2r6yitq6nr6+3wMC8scG3sa6ytrW5uLWsqryzr7Kxvb+3rry8sKWftqymp7Wqq6+hocWsqqiytayttLqdp6mrsaWXnaqfp6WSmaWtopidpKqhm6GcmKGep7elsKutoaGenaGVoaafoqCZnJqclJuelaafrqOZmJ+WlY+VmYyPmJqnoJCHioqIeIV3goKCnYeKgoh7f4WIhYWQhJaVj4+QkZCRjZJ7g5WPhXN/fmd5cGxrbGd1c2thZmNhc35hZGVmZGhoYmVuWV1YXGxjYUxnV1pgVklHSUtNUlg+OWBsaUhCVVNcWklHRkVBLjw/OUE4OVJGQDc6QjAzNz03NjkyOjw5Nzo5RE09QjwwKjxAO0E8LTVCMzc9KyssL0EqSksuLyorMzcyMig1NyQrNy43MjY4NVx5TjI+SGlaTFpKVmJmQTozQGFFJTWdpaGSjK+hmpmgl6W0sqOyvrehscW7ubCxo7erq66pub28u63Asq6vrravs7myp6u5sK+utLa7tq+5vq2mnrWroKGypquwoKbFobOmsLKxt620nauurK6imZ2oq6aflZunpqCZpaOpnZqfm5Wdna2xpbqorqKhmpuemZ+kmqWdl5+YnJaaoZSql62qnJWenZSNlZqOlZSYp6eNjIqJjnuBdIKCi5iFhnyIiISFioyIkoWUnJOSkJCRl4+Qf4GNjoNvgn9neW5pbGpncXJrWmhjYXF/YGRnam1qZGhlY2xcbGx1cWJTYmljZVpJR0xNT1lRUFVhZYFUQFZSWlRGR0ZFQC88PTc/NjxFTWE4Oj8yNDlAMzc4MTg/Nz04PkZKQEQ5Mi09QT1BPTA1QDlAMS0rLjM8O0s2Ly4rLC0yNDo1IzMqKTYuNTU0NjVafF0xOkxqW01bS1hkY0BBMUdgQSc0lKOdj4+ynZyVoZups7CfuMC2oLTBu725saa2sKmupbi5t7etu7Ctq6u3qrW5raSztbGvqbG2trGztrunqaC2qp6fq6Oqrp2sxJmvp7CyuLWsq56wra+qopudpK2pm5Wdp6SdmqqjpZaaoJySnKOsq6m7nqakoJeamp2hj2ujlpmdcYOYnaWAdpKsqZ6XmKKTipiZgJeKn454hZKNgmxpfneEcWyGioZ9hIuGb11kYWeEmIZsi5CUknV4i4R/g5B/ZoiBaHZqZlhcaXRuTU9pYmVwg2VdZGZuamdcW1yJkISIaE9LRDhGVGdeSkhRUFVWS0hSYXB0ZUZbUVVQRUdGQz4xOz02PTY8NGZcNTo8NzU7RDQ4NjA6Qjc/Oj5GTENCMzQzPUBAQD0yOEBFPTEsLDA4Pkc3MDEuKi4qLzY2OCwjMScyMTQ6Mjg2WIFsMTVPa1xOW0tbZmI+RzFOXzsrLo+km4iWspudlKGcqq6so73Fr6m3wri+vK2nt7Gmq6S4tLKzsbmuqaestKaxtaKnuLa1qKettrOutK60oqqftKueo6adp6mcsL+VqKixtbmtraSorKqrpaGfnKGoqJuYoqamnJynqJ2Tnp+ZkJ+oq6S1sKOio5yWmJmXo4ihj5Kah6GIlZ+igKWAqK2flZSelImEcniNjoOIoHWHjGmWiGZ+c3igb4eHhH6MfH+hoKCZgHyHn3SIjnabimuHgoNuaWVke21yYlSGbWRtaZhxWGlvbYZWXWhaa2lZh3BreXKHaIeEWV5GTj5GXk1GU1ZWUVBSV1RnXk1aTFJSUEVGRz48NDk9OTw3OzA8PDc5OTo2PUY1ODYwPEI7PDk9RlFHPS41PDtAPUA+NTlHQTgyKi8xPEk6LzAxLiovKC00NTgzJSYyMTE1PjE8OFiDdDE1UmtbT1tMW2dfPUsxVF03LyiOp5iEnq2dmpmdn6uqqKq+w66yuby3wb+qpLexqqyms7Wvr7O3q6mlsq2ltrSbrLW2taWmqbOyrbKor56qobKpoKSlnKKlnrG4laaoqLe+pq2mqamsp6Whn5mhqKSamaejpJicpaqXlKKclJOkpqeht6Wjn6OYlZOYlJ2IrpCYlYqqjJmknYaxgaWvoJWboZd6gtSogIeUwJvGeHexpbeXZIDAnL95hIR5j4N8kJCRynGWvJzFe3K2p7qQe4Fsl7GrsXlpbFixrm9maryTvG5neW1xjth9UmpitrJ8fnCVdZqhqpBWTldhT1ZNRlZcWFBQU4tcV1tQQVxEUE5ERkk8PDU3PTs6OTouPTs4Nzg7OT5GNjo3ND5APjY5P0VSSTouNT47Qjw/QTg6Sj41MioyMkFFLy4zMi4rLyktLzE4Ni0gLzQxNkExPTpXg3cxMVRrXE9bTV1nXD5MMVlaNDEhj6eUgaiqn5idnqWtsqqwwr2ytcC1t7/Cq6a0rq2pqK+0qrC2tKiopramqLmvnLKytqqlpKeyr66xp6uep6WypaKioJicoqGyr5afpKG1uqOqqKCsraShnZuao6mgmJupoJ+XnqiokZ2nm5SeoqejobCjnp+jlpaTmJKZha9raoyOqn9ohZaHrWZyoJ+Wm6mXca6hpH93unxroI92sV9qtFulgGWckGBmgXpmf2l4a6plvnNnpox2sWp8sXh1kpRjbW2nblyEoEVpZ4iWRXWcX31me6OmgVheiqtnfIx3e2qoOEqvW1hUbGNaS09ZYFxWVjtOiFBXVjBJU1NKQ0VGPT80Nj87ODo5MD04OTk5Oj08RDg7OjY9QUA2PEBIUUc5MDc8QUM+QEQ4QEc9MTMtMzNFMy8uNTMvKy8oLjAuOjYvJyQyMDNCLz07VYJ2Mi1WalxPWUxfZ1k6TjVdVzMxG5KjloOtp6Wfo6WrsrittL2+sLfFsri6w6epsKywqaqxr6Sxu7Glpa+zo6q5qZ2zs7GjpKCqrbCsr6eooKOjsZyknpmWmZ2esKmYnKOgtbOhq5qhrKyfnZqXoKOpnZmepaCcmaGnpJCdopuXoaCsn6amoJqfoZWUkZeRm4a1m7V5h6matpl4h7Sbt3+VmJisl39rgaZ7gYWGkZSSd6tnarFbrHuOh5R0iXCOhoF/iJGXeIODi5eMg6CPhbB2d59ya2ttfItPpVhIZGSZfmNopl94cXRSkoZdT6ltYm96hYBhnS9Tom5bVGtnYExLXWRYXFpCPrB3V1hBI01pRUJEQUBBMTk+ODg6ODQ7Ojk8OTpBOkU6Ojs2OkNCOD0/S05IOjU6QUZCQUFEPEZEOzAyMDE7RSwwLjk0MCwuKC8zLD44MzEfLzItRDE8PFN9bjMrWGpcT1hNX2ZXN0s5YFQ1MByXoJWJtKenoa2pqLOsqru3wrC8wq25tsKrra2vr6ivs6qisLyroqi2raOstaSls7Soo6KdqKqyqLCopp+goLCXoJuWlpebobGlnJulqbavoaiOqaepm52WmKCmqZufnaSgnKCjpaOWm56Ymp6jq5ymmpyaoqCWk5GTk52E1ZOZuXGxwn/Gh33WlJy7fZyXqJKPnY2ke42GoYClgnmreY+dVq97iX6farlauXeHhH2mg5R8mXupeY6dkHuxbY6EdZC8hm+VUK+nxYpRoHpjYKphc3KGa5aHXlK1tMiFfol8Y6Q0Q511XVFpaGRQQFhnWWNhSkhNakpaU09ZZlpDRD9FPzA8PDU5Ozc0PDw4PTo8QzpGOjs+NjpAQzs2QE9MSDw6PERIQ0JDRDxFRjgxMjExREIuMDA0ODMrLSkuMzIzOTcxIyU1Kj4zPT1Rd2o2KllpW0pbUF9mVDdIOmFQNzIlnKOTmbKoqaWzqqW1qKS8uMGwusCyt7S9tLansrGksrSnoK+2qZupu66jsbKhsrSxoaSenqipsKm0qaadnp+smJmZmJiWmKOuoJyXqa6xqaOejqyip5Wdl5uhp6GYoqKjoZuioqicnqCelZmbp6Gcp5Sbmp+hmJCSlZCdiLJuaLVyrIhwj6dytHZ0tnucmqaOkJ2No36PnqN9sHWCkNLSdVyufIV/pG6bqqZrh4V9rX2YmZB7sXOTnY95s2WWdIWebp9mlFLJi1rCXJ95Yl+tX3ZzhGGWiF1Zyp1vv35yTUu1U1XGZFVRamNlWEFPa19saFBVRkg5PVdSW1dYSEI/SjwyPzs1PTw1Nj47Nz48PUM7Rzk7QDc7PkQ7LkNSSkc+PzxJSkZDRUQ+SUk6MTc0NkA+Ly4yNDI1Mi0pLjI2LDc0MiYfNjA7NTo9UHFoOSdXaVxCTVRfZVA1Rz1hTTYyLqOekaawraWpu62mtKWntru8s7u+uLi1vLy0prW1o7Oyo6CssKWYqLuupbKxnLS4qqClnaGqpbKorKqlmp2bqZ+WlpmZk5Slq6KYlKersaahlZKsn6WSlKGcpaeglZump6Kbo6CumqCenZCWm6OfnKWUnZWZo56VmZaSm4WsfHiod6OPi4eqcK2MhaiEmpuji5Obi6J+kZeHroR/gbNccrJTr32CgqN+cdd9d4V+j56HmZp3r4aKkZyId7RhmmWbgYGVbJJbsFdLmnWYeWZhrV52doVml4hqXa92lZ6Pd2s1ecius2BEVW9dZ2BFUGxfcG1WVU0uZWNoUllRO0FDQEw6NT85MT48MTY/OThAPTpDOkc7PD86Pj5FOS1FVUpFQEM6TUtKQkhHPkdLOTc8NDY6Pi8wNDMzMy4yLi4xOCouMzIlITA0NzY3PVBrZT4mVmdcQDxVX2NONkdCYEk6NzegnZSht7GZs8GtqLKnqrO6t7W5vrq4s7e+tqa4taG2rqCgqayflam2q6mysquttKSbqaCgqKK1p6aqpJmelaWhlJSdmpKWpaiclJGorbCloJSZqJ6ij5GimqmloZWapqmenaSfrZygnZ+NlJ6cn6GZmJuVlqKglJiRp52HqX5/pnmhj5CEqnCtjYOnhpeho4uYl4ijgZCGlKp6f4udeXCxWqiDgoigeHTYf3aHdKiCj5uNkqR8lpCfhHuyXpxkoH2ClW6TXatcW5N/kX9oZ6pjcnqAapiGcV2rWomgj2ttZE9KQ6FcW010XWJmTVphX3J0YEpVNUqakVhIRT1HRUFMMzVBOC47PjA1QTc4QDw2PTxGPzo8Nj89QjcuSFZKRUBINktJTkBJS0BFTjo6QDQuOz4xMDIxNTQrKjA1LzcsJjIxKCQlNjY3MTxPZWRBJlVmWz8wVF9iTDdGSF9DMT03op2amr+tmLPCrqusqKe1sbixtb66u7Oyubyqu7ahsqWfpqion5Ossamwq7etqq+hmKKgpqWkuaOjrKGXnJKjoJaVn5uVmaKhkY6MqrCwpp2Wmqemn4ySpJinq6iWmKmon6ChpK6joJ6hjpWhmaCgkpyXm5WeoZaWj6ycj65ucrR0qYx3i6Z0tHp1tIKUp6SUnY2JpIeOdbhvi3uLomtrtlqhhmWXl2igoqdtlHK0dJOZf7NqhpKIrWp1tGGdZqJvhpJrmF2tYE6hfIeRUnOjbHl+fW6Yhm9cr1Y8nHdlVG9uLlunT2NSa2VibFpiXGBxfGNTWVE+P2xvMkJCQD5NOiE3QDYuO0AzN0M1OD8/Mzs8Q0RCSkZNSUY2MkpUS0VCSjZJSlA/SE9DRlA9PEU1MDs7MDEwLzc1LCssMzI2LyMwMCwsHTI4OS85TmBlRCdVZFk+LlVeYkw1Rk1eODFBOKWanJ66pJuxwK6tq6uot6q4r7XAtb2ysbu4rMK3qqyhnaekop2SrKuotqS0qK6qoZedqKClq7ido62clpmQpqOXjp6hnJmfoJGUlay2sKaYk5usqZaMlKaZpa2jkpers6SgnqissJihopCZoZegm5abl6CUnamdlJCrmYfUlJq7dbHEgMSHftaXnLh5ipKZjpiKjKeHeaK2dX13dsGDmrJhg7p5wHx1uGK1gYyHqX2VgqypcXt/dbyIp6BpnWGmjq+ifo11h6t9vm5zvHSyg3V4gIltmohwbY2kdL1dd31bYXm8alpWXGp6XmlhY2ZibnlvWFtZQ0FAcT9DRys0SCInOz8xMDw/NzpCOTk9QzQ8QE5aXmBgX19fWlBQUktFRko0SExSQEpORUZPQjxFODQ9OTAyMC44Ny0qLi8xODAiLTEsMx4sOzowOExYYUYnVGNYPC9TXWBLNTxMWy02Pzmnmp+ivKOXsMOvramrrbGoua+3xLG7s6+8sK7Csq2mo5+lop2ckaulqrOltaetpKCWmquZp6y4naOumJWhkaagk46do56Zn5qQlpOwubGrlZajp6eUkJalnaStn5GhqKygnJ+ppLKdoqSOpqGVoZmblpWjmZCwoJKVqp6FkJm2gJKSjbiWeYOTm7Z3bmxvdG95j4SOiXKewLu8mnuBsqhwgXSRuYN8hoaLho17ioeMl32ku7m9nHV5s6N0dZd1dLB1mZ5mh2qNtnRzcXe2i16AeXyIZ4N5bHpii6xwdIV+V1unaURkWlRmX2NdYlBnZnFudUJNT0xEO1pMPkoyOzAgOD47LjM9QTk5Pz07PEM2QlRZWlpbW1pbXmBiYF1TR0dINERJVEFLTkdFT0Y/Rzw3PzcwNzAvOTouLC8tKjgvJSYyKDQkKD43LzdLVF9HJ1NiVzgqT11dPSs7VlYnPTo8pp2hob+mlbLCs6yqqK2rqruvsMavtbSwuKe1ua6rpKKnn6CdmZStpa6rp7aoqJ+clqGknqykvaehqpeVnJGim5KQoqiilJ+XkpiUsrW2rJedo6Oii5KSppulq5yWqaWmnJuhqqamoqihkayel6Kel5aXnZ6PsKmUnKeij2t/ap2qeol0f5yPdntmiHu9vsC6b5KDcZSFX3JqWl6bimFjh4+WbGB/lWNtnHZilWyAmZWUZl5gY3GbiWhyjHyGlGZqfnF0eH9+Y1x4dYFoUFxuhHx8impYbHqCcUhKb4VwTnFNRFZcZmFMW1dmY15PW211a3JST0RETTxISDxMPzEsMkE/OC81P0M8OTtAOz1DPlJWVldZWltbXF1gYWFhYFxVRzVDRlRFSk9IRlBJSUg7OD01MTouMTs6Li8tNzY9NSYiLyoyLCU7OC03SVJeSSdTX1Y0KVBeTCgzPlxPJz8yPqifqaLBpJqzubajrKavpqi2sqzIrLC0rbakvrKzp6Gkqp2jnJqarKeupKW2qqWbmJainKetqb6oqaWVlJuWoJqTmaapqJKfkI+YnLCyvquapp2noomTkambqKScnKygo5qbo6esop+poZmum5SmoJaUnZ+dl7GlmaKomZ2Sn52lppuopJuem5ybkpeCaG9+cXeRl5SQhIm0qo2FmJWPioyZl4iUlYmDk5ORiY6SlJiUmZean6Gam5Sfm42BeqSFa2p8kX2BdYqLg3KCd3l2dot/fIlqc4F0hHRjdn12a294bF9iW29nTVhZZmpfV1lvem9uZlNPRlI5UFpOUk8nKjtLQjYzNT1AQTk6Qz48RU5TU1RWV1haWlxdYGJiYV9eXltUS0NSR0tOREdQTE9JPDo7NDg5LDI7ODIwKTZJUk84IikrLzIjNDsqN0ZPW0knUl5UMTBUXjorPThdSyw8LUCyoLOiv6KjsLG3oKqms6elsLWqyKuts6e2psGotaGfpaacpZaVoaynraSkt6ygmZeWoZitqqXBn6yklpKcl5+YlJWjnp2jqJOQmKiossKvmaqcqp6PlZapnqqcnqGtmaGbnaKlr6aho6eerJiWpZ2ZmqGenp2woZ2ip5aZlJmUoqSYpKCZoo+YlYyLjpCYrpB8lZyCkYGJqaiFgJiXi4SPoIh7hJGFhZqRh4aKlY+bl46RmJ6jlpmSkJyNfo1lobOuhYqEd3uQi354eXpvZnmRgYGIa3WBeYlxaHN/eXWDhoBqc2J3ZV9oZWNkZmpZa3txampcUktQRF9VRkA+Piw0QEY7NDU7PkE7PD8+PkhOTk9QU1RWVlhaXF9hY2FfXl5dXl1YVkpLTEJJT01SSjs8Ojc4Ni8zOTY0LigmJC0xLi4pKyo3JSs8KDZDTUxEL1RcUTA1TVsxN0U0XEc1PCxAsp+5r76tq62xsqCqprKto6yzsMWwq66ks6+8pbWcoaijoZ6Zl6mnqqalprO2n5WVnpqasKauvqGsopGRnpqalJKWoZuXqZ2Enamro7THs5+po6qWlZeap56onKCkrJSfn52fqq6opKKqoauanp+gmKWfnJ6dsKSZn6mUmpmekqacmqqfnJhmhZR9ZX+Pm5Bjeo1taGp6kKOramWamH5nhYtlZWloeo2ijmtojJiRondraouZo5+Yc2xteoSMhnlYZV2Ggl5si4uDd1xodHd3koCHgW94gniAcm14hHN2iIeOg3pohFhdanRkXXOIaGp8cW1jXVFNV0pkWEBJMz1GOD9GRDcxPD0/QUM7O0RHSEhJTE5PUlJUV1teYGFhYF1dXV1dX15aVE9ESE9LU049Pj09NjUzNTU1NComJiUsKiUuKysnNiokOycvQklbSi42Wk82KUVZL0RPMVlCOz8uPaSeury5r6uysKulqK2vsaeurrC9saqppa6wsaCtl6GknqKamqasna2kpqiqtK6elqSQo7Cmt7mlrqOPj5qimpOSm6CYmKaWe6Sroqi0w7ekoaaunp2UnqOfo52kqqmTn6CeoKqvqamiqZ6mm6Wep6Csl6GbpbGlmJ2slqOfm5OnmaCsmp9/vYSKdLRzhZ+GrWh3ucS4cZKho3qmmZl0q4J9y8DAunGLo4eDnn2WmIiewL2Clp2djZzBwXyBepGMmsLAfWqlsnCOgm/KeoCbeJKDjoB3eYGAeXB7f4ZweISKknhsdZFhZV54ZF9lgWJddGhtZGJYTFVJUVlIT0QySUU/REI+Lzw/PkBBOjhEQ0JDRUhJS01OUFNWWV5fYGFfXl5eXl9fX15cU01QR1VOQT8/PTY0NjgyNjYqJiUjKSomLisqKTEwHzkqIz5JW0wqI0NQLyNGWzNQWS9VQUI7LziVobnDtK+vv6mplKOwqrCvrqayta+qp6emsaugq5ibo6Ccm6qno56so6WppaW0pJ6jlKaurLi0p6+ikpGZnaaTkaChl5ugnoimq6Srrb+/sKCorqiWkZ+dopmipKqklKGhnZ2srqiqpaKipJ+jpJytqZKkmqiuqpyeq52uo5eYp5ijpJmef86UenulgnqWl5tfrY9djqiAoaF8p5WbdauDga9eZIyqe6iHhaB0l5OIs2OCq4agjY2zaoSvdHyWh7hhgq1Zo81ukXZ723t/mXF+iJJ2f2V7iHV2a32HbX2EjpB+a4CMXnBqcGdgX3hkW3FoamNlYFJUU1deSk9DNEFIRUQ4PjU7QD9BOz04QD4/P0JEREZJSkxOUFJPU1xfX19eXV1fYGBfXl5bV09VSj0/Pjw1NTc4MTY0KCckIScsJiYvKCYrMx02MCQ3O1NMKywtSjAnO1w6TC0hUEBGNC4xrMHAwLS0sLeYnpGkqqmttaumsqysrKWtprCqoaecmqaYnKKvn6GfqKejpqGfsaycn5Wmrq2xq6isoJSSm5+lk5CfpZedqKSeraOqsKi/xbKnqbGtlpKenKKXoaqqn5Whnp2cra6mqaebpqWioKqSrLOWpaKrqp6kqKejsqKTm6mcopyWlZGXoXKGjJh2hqiHcbB8nXGsfaCggqWPnnirgn6tf51yrX+sh4afdpiSe3yXf6qIooyRjJx9q3qIk4+ff3qtVpzEe5Bwk8F9gZVtdXCMbWZ3ZYduYXhucm6HiY+OgmyOjWNuc3VvYGZtZF9vaWpuZmNYU1xgWlJSQzhJSEBDPD48QEZEQ0VBPTw8PD5AQEFCRUZHRUBDSVNXWVpcXV5eXF5fYV9eXl1bWlJDPjs5MjQ3ODQ1MiYjHxwgMScgMScfJzQeNS0mNz1XSi09KD4xKTNWQEYhHEc7QzEuK6/Txseys6Cdo4+jo6Kur7evqbGnqKqprqusp6KknZqjlZ+mq6CipqCoqKOfnrCsmJuWqKevrainqZ6XlZqkopKUoa6anaejrqyirLWpucyxrKatq5aUnJ2imZ+urJ2WoZmenqmxp6iomqqmo6Gqmq6xoqirr6aap6yrq7Okk5mlp5yWk4Wka6R1inqpdXuycYKlipiLcYigm4ekX2FSq4WAroOcda6CqIaGn3qZl4Z7ZoCjiqSYhoKjfal/gZSGrl57qFWdopKCe6OfgHzEsMWMc6+0s7lyYqmvwnRoi4uVjYBrlo9tbHh3d25rZmVkcXFmfGljXVZfaVhYVExMUExDQ0FCO0NAQEJJPD06OTo8PT4+P0E9ODY7RExQUlRWWFteXl1cXmFhYF9eXVxdW1NJQjY3OTo2NjQsJiQiICcnISstIiQuITMtJkBEV0gsRys2NioxUEtMIyBBOUQ0LCfBydbWwKCZq6ihr6KfsbSwr6mso6enq6urqaWmoJuln52mp6aknayaoqyhpKCvo56bk6qktbCvoambnJaVp6SRm6Kon5+mnLCloqixrLbHsbSpq6mVkZ2doZmgpbOdmqGUnJ6nqqqirJmqpqChqaGyraGpsrKhnKuqsbC4ppSYpqqanZN9qm2fhIh2q3l8sG6CpIuIn5aVnpaB0ri0uMmBgrJfYJSpg6WIh6B6mJaaearJdJqjlKipkJKajH6aiZrGxndloYKldIKgjoJ9r19vtWOxdUujh22nR4OTZI2PnJB6bpSOfG55dHx6bVtmanJxZ4FpXmFXY21cXllJTExKRURCQj1BPEE/Sjs3OTc5OTo7OzszLjY8QUZJTE1PUVNXWltbW11eX15fYF5cXFxcXFhNQjc1Nzg1LykoJSYlJCYpLDVGTlBQTUZMSlZGKkwxLz0tNE9UUR0cOzxGMiwkp6TAx7mtqbKuraWjnLO5rKuhpZuopqusqaagpqWYq6Ofr6ydpqGtmp+ppZ2ntaCkmJSoq7azrJymnKCWkKatkpqcp6OgqqatoKOnqbCzwbGyqaynk4mXnaWboqSvppeilZicpaWpma2cq6WknaujtqugsbiwnpywqLW1tqeWmaqmnKGQg55Od5qCgJ97hKN8gqSDhqafnJ+UhLh8fXq5g4DNxsO2eJuikouffpmXl4p2n5eKpJikqH6vhZyDnoOsfZmUYaVso3GQhZCBfZaEcqxgpHNxgJphvH1SVXWNkaGUenuPjYZyeXOFf3BbbG53c2qBblpkXmduYmRdS0tRU0FHR0ZIOjpLPkIxMDg4NTY4NzctKjU9PT9CREdJTE5QVFdZWVpbXF9fXl1fX1xaWlpZVVNPSEA3NzIuLCouKyonJj9RVFZXV1dZWFhXVU9URjxFMjpQW1McGzY/RywtIIuHmamrpKu5q6+gnKGts7Smn6GVpa+urqmnnqWlmqSnobOuoqmns6CaqaSUo7Wjo5aXoam1uaSbo52jk5Cispmem6aloKKvrJykqKK1scOwramsqZGHkJynnaOknKWXnpiYmaWjqJisoauipJeupLqsoba2rp6etrS6s7apmqCypKagiJDStcO3eoeOhpGTj4Cmd5Sid4yhkoWlg4xyq4iGtG5zapqknZaKn32XmYeHkHOugqWbo42mipOdiJSQmm1wslylc5N6nGyZf3uZfm6pYaJyc36fYnOyuGh3jpKjlnuJiY6HdXt4joJsaHdoeHNugHRdZGNtbWZoYEpZV1c8R0Y/UzNARj48Kig2My4wMTMpJjQ6Ozw9PkBDRUlLTlBSVFZXV1ldX19eXmBgXVpbWlhVUlJRRjoyMjMwLysrKEBRUlRVVFNUVldXWFhXVVVWVVFPUVtVJSEyQUgjKiWSco2Krb+/vLu1npeopK62oqKZlaOqqK6pq5mlop+moKC1pqKpp7GklKujj6StpJ6RmpqqtLSknaWcqZKUl6+goJ6mo5ynnLOZoKqjtarCr6iqqKGMg4+doqGmo5WampyYmpimo6WXqaaroKObrKa8rJS9sK2fo7G1u623qZ6rtaermnyokn18sHiLgKSliJxtsW+gh618oo+DqJeagqyKhq2GoZWooaOYhp+BmZaBe5J+q4GdmZaLq3edoI+Ik5J/eq9do4F9pqdlnoB8l3Vqrl2lbHKGmV1gW4ygbZSPo5aAkYmSiHh5gZd/amx+Yn10bYB5YGhlb29oZ2hCWF9aPUpTMlM4QUFDNyQkMysnJzMsIC82Njc0MzY6QENGSUtNTlFTU1NWWl1fYWBhYWFeXVtaV1NQT05JODE1Mi4qLEFUVlZWVVRVVVVVVFRVVFNTVldXWFZVVVFIRklKIygovJKahKnGw7fBtJ+braCuuaajjpqjpKCvrqmfo56drZieuaCjq6GwqpquoZGqqaWXipqQrbGtp6Com62YmY+toqGdpaGZpJytl5+opbaovq6kqaOfi3+Om5qgpp6SlJmak5qZpKOimKeqqqCinqenvKSXwqyro6KttLutsKmjtrKsrpp3r3+QipyFh3y6rYmYZLCMZJaufaGQhKeXnIKtjIWwh6iapKKjkoWgXGxrgrNgf618e4KBsmxnbpmXi4exWn21XKSDa8iiZp+Be7tZdrVasn1Tr4F6rFiAoW2WjaWYh5SNkZJ5d4ycfWNzfGKDd3SAfGFqZm9uZmVmT1RiW0FTXT1IKD45PTQhISwkHzEuICoxLzA0NTc5OjxBQ0ZISkxOUFBSVFdaXmBfYGFiXl9cW1hVUE1KR0M1NTMuL0BVWVhXWFdXWFdXWFdWV1dXV1hXV1hZWlpbXFhXV0dCO9Kfs7G3vru0wrOjnK2npbepoIuZoJ+dsrGonqKfnbWYoLOoqquesK2erJyVr6mjjombjq6sqaejqJquk5qPqZqhnaSfmaOipZieoqixqLuupKienY58i5uWoaCZkJKam5GZl6ien5enrKSjpKKjqLqen8anpqmhrLa3rrGqob+xsLCYgqqTo66Om4CGpJeYkICAuMO6hI+dlIWomZ6DrIyEr4qpnZumq5J/1b3CqmKkv719f6OCg9e7uLWElJKCnr2+hGujgnCrhG+dgHqysceDa6uxvax5eKK+u3SAlIyjmYyYjZKZd3+PmXlifHlkjGZ4gXtga2VqamJQYltSaVw/U2BCTCk8OjQvHx8kHiUyIB0kKDA0OTY2Nzg7PkFERkdKS01OTlFUV11hXF9fYV5gW1xZVFFNSEM+PEE/NT1TWVlYWVlaWVpaWVhXV1hZWlpZWVhZW1tdXVxaVlhUV1q7lbS0ssC6sr6zop2up6Wzp52Ml6W/qbavp6G/pqaxm56xnLmon66vpaeVlK+sl4yDmpGupqOsoaWcqqCYiqOTpp2mm5qgqKKYnaCsrKm4raejmpeSe4eZkaebk4+Ql5iPmJOpmJ6WqKeeqKagoaq6najFo6GwpKy0tayyrKO/q7OynXV2qqS2hWWJn3BnrJCKj25ud6WQm6GCdrKcmHGRjnKXq6Sbma+lcm1tbWaLeG9tg5pxgXpqcWlniZaVl3JpaYWHZ3GHZF6LY2pwWl1nfnimYGJykJJwZmSAjJGOn5SUlo2SmnqEjZN0ZIZ3Z4xqeH55ZGxjZWxiSmRXSWpZOU9jRE8nSjkrIxwgGyIsKRgbGC0yLjU6NDU3Ojw/QUJERUhLTE1PUVNWXFdbXGBgYV1dW1RQTEhEPTpBQjdNWFlaWVlaWVhYWVhXV1ZXWV1eXl1cXFxdXl1eXVtbVVdeqJWttKm6urKzq6mirp+js6qYkr2xw8e8tKmev6uso6Cnq6C6o6SurK2mjpatqpCMhZWWrZ+mq6KfpKSgkoulkqaZqZqWoqmglZylpaauuaqrmZqTknuEl42ml42RkJeUjpeVppOdlqahma6lnKGruJ6wwailtKetsbOssK6qvKeyvJiMo6mltZyJlqKYh6mbj5Sdkqq0mpykrqK1maWkoKOkn6Smopasp42Tk42Hk52dlZCZk5iRj5WFf6Sal5aOjJSTipCIhX9ojIF1g3d1h4xxp219lpOUlIGBj4+OjpuQnZKTkp1/hZOMcGiPdm+Jd3V8eWlrZWNvY1VhWD9oWkdiX05XK0U9KyYhNjQwLh8cICUyKCo3OTk0Njk7Pj9BQkRGSktLTVBQUVdUVlleYGFiXV5VUEtFQz45PUBBU1hbXFlXWFhYWFhZWFhaWltcXl9fYF5eXl9fYGBgX1lZYKWWqaqktbiur6Kwpa6goLexkI6qxLzDubapoaSdm6WdsKikt6edqbWnqJGYrKOMiIqPnKeWraShmqien5OWpJeomqiZk6Wgo4+ap5igtLmnqpiakI17gZWLoZSKlZGVkI+Sl6SOnZinnpqzopylqranrsGvpLinsLCyr6yttr6ks8Gak6elprSikp2mno6poIySn6KtsZuipbOrs5qmo5+nrKCgnp6YrZ6TmqKclJCXq5mNmZqXkJefkYegnZWUhpSNkI6WjYJ/Zo6Idoh3eoiEdJxqiJKWlZKJfYyWkZKWkJ2OmJKdgYWXhnpxlHJ5iX9xe35qbmRecGlgXF9YbGJPX2NPWDlGRkQ9Mjw9Ny4qJSspJh0mNDE2NjU4Oj09P0FBQ0hKR0pLTE1TU1NVWmBhaWFlVVBKQUNCOzlFTVZbXl5bWlxbW1tcXV1fXl1eX2BhYWJhYWFgYmJiZGJcW2OYlqSoo7C0rK+jqqeuoKe1qpGPm6Oyua2qq6GimXqcobCkprGpl5y4pqOUmKmcjoaKiZyikK+fpJapoKGTl5mcrouqlo6nmKeMmKiOnbi1o6WXm42JeYKTjJuTipWRk5COkZahi5ydppydtqJ+g660orCvdaS/pLOgeXujrbXAmHiwpqGKgKp+ZFxidp+PpJ6Dln5tlLWdpamxraZmoKKVdXucmXGBmaqZbYCkqYplnKWckZiZl4yTnJGFnZuQlYSUiI+Pk4uGeWyRiHaIcnyGgYFhaYmMlZOMW3aVkGZojotxeJ+VlGR3l4aBd5dogomCbnl/a3BlYHZva2toW2RjYWFtUVk9TU1NUkY9P1NCOTAvHh8mNDozMDY2Nzg8Oz5AQUJGSEJHRklLTFRVVVldX2dnZ1dRSTxESDw5VlJbYGFiYF5fX2BhYV9cXV9fX2FhYmNkYWJhYWVkY2hkXl1mnJamo6GwsayrqqaprqOnraWSlaq0rrClmamlqpZzi5yvoKirp5SXuaCgj5yknpF+iImano2smqSVqKKejpeSnoV1ro+IpZmokZajiJq4s6efmJiLiXR3ko2Xk4mTkJCTjI+Sn4yZnqSYm7CUgIybtZ20jJKPvaeifqeje6Wyu4SOkKmghIyFj7Gqr4yJlqOaeYCLrIadn6Opq6qJloibd6Wce4icgZinhIJ7nrN7ioagmJmVmJeBkZeWhJqaYnmIkoWOkJOLhG5ykYh6gnKBgYaAh3SIhpeTeJZok3SgmnR7mYGbmISYfpCJgYKXaYyMhGp4e3FwZ2V4bWlsaltjaWhkcVpbSFNLUEBFNS1ZU1Q2KSEwOT0+NzQzNTY4Ozo9Pj4/RElASUVKS0dTWFtYW2FhaWZZUUg5RUw8P2JWXmJkZWRgYWFgYmJfXWBhYWJiYmNmZ2NiYWBlZGNnY2FhaJ2YpKCmrq6rqK2gqbGmp6qlmZOsxLyvoJSlp7Ocj4OdrJ2noqCNkL6emY2fmqGRfYaOmJeIrJ2jlqGhko2UiYaAkaiOhqGco5OWnYWeuLGonZqSj4VwdZCJlZCKk4+Om4uOkZ2QlZ6ilJ2qhp+0ibSarovKiKuvireFjbCEs7OHqY+qmo2de6iPcnt3nI6mlmiVpHm0jKGgqKqUmsKCgauJmaFynoCbpX6XhpaygaF9oZOfj5iYgI+Um4mZkot9hpSHjZaUioVudJOGgHtzh4KEfYV1hoOYgo/FZoCph4+iaZ2BnZaAmYCKi4OImG+NkoRnd3R8d2dpdnBnaGteYm5sZmpXZEZcUUwyRTQ2TWBjNyYzPEVHRDo2MzY1ODs4Pj09PkJMP05JSkxDUVpdXFdiXmpsW1FFPUtNQEpkWF1jZmhnYmJiYmNjX19iYWJjY2NkaWljYmJiZWNhZmNiYmmVl6KgsKmpqKasoKW5samrppqUnqGkqaGUo6i1oa9/oKedpZ6diZS9mpONoJKdkHmDlpaRiKuZnJuaooWPjHebnI6gkYedo5uWmJeFobitpZmbjIx+Ym2Pi5OPjI+MjJeLj5GejZKen5egpn2hp4etnaCWrpCgnp2Rh4Khja6ziaSPrJyMmn2idYCZlGuCq3VNq3iHjZ2TnKqpgqqrf4WifHunap6Ak2xnl4aYt4mefm5gY1iDmH+NfGRnjHOZfnqYbF19mG9hVHKHXWBteoRgWWWCfoWBmXKoqmuDo25ypW+fgZpnZJ5sWmyJe2VZX4J+YVdQcHZlb3RxampvXWlvbGpnV2ZNXFdFOEE0RkNeazQrSUNRTU49ODQ4NTk7NkA7Oz5CTz5RUktNQkpcXV9XXl5jdV9NRDpNT05UYlxcZmZpaWJiZGJkZGJhYmBiZGNhYmprZGJkZGdkYmdlYWNomJedobmhqqSmrJKitryqrqKZlp6gpaurn5yttKGnkaCgoaecmY6YtJmQi56MlYt1gZSRjYqmlpaYnp9+k4WGrKSHnJGKmKiXmZqRh6SvpqKVmYeJgGluiIiLjo2Jio2Ri4+RoYqSnJ6aoaN/k4GPo6GUoHeclpCng6OpgIessYileo1/hJp8onByk4eVe56MeW2Hm4uakp2qnI+HnX6EonR3pmeefnelX5h7fZNzom6Yt7S6dJOIgoC2qGSBxbl8cZW2jHKBm6RkdayrYX5qnbN+bn6JhI+DjJhxgKNrcqNynoF8o16cmbOVcHyXnrN0cluesoNqYnF0dXFob1hqa3FwZFtnXGFLQz1ENlFBWXEyPFNHX0pSPTwzOTU6OTZDPDtASVA/VE5OUUBFX15bWVdgYHtkSUM3TFdVVmNhWmZma2tiYmVhZGNgYWJgZGRfYGNrbmNjZGRoZGJnZmNoaJSWlaS5mauck6COpbi1rK2gmqGboqOkrJqasayrk5ihmaGlmpqUnqybi4mReIuFcYCVjImQoZCTlJ2XfZGKjqigh5iOiZGik5uajIqop6Sej5aHhH5qeoZ+fY+Ng4qPkImOk5+BlJyem5+ei4l3nJiijaByoYyJqYmdqJKZq66Cro1+eqCZeaOTeIBzl4eMnH2UnoabjpqdqIijZKF+jJeQm41tnmibjm+amXuAiqd9cmh0q4Oeg3OqZ5SaXZuFd4WeaKpqgLlmXKlwgZxhlYxfp3Z3iouAnWiadYeTkpiNfZ5smI9qpplcqH53u2p9qVqOhF2zZ1tucnh3a2lbcGl3d2FeZFZhQVBETjdVQlFtNEpaWl5OWkRAMTUxPDs3SD86Q0hVP1lTWF0+RGJdVmBRYWR8aUZCOU5bXVllZlhmZm5tYmJlX2FhX19gYGVjXmJkb3FfZGVla2VjaWhna2mWnYmqtpyoiWOVnKy7sa+rnaWbmqefnayZnbCnq56Xo5qioJmWlqCkmYaJjWmIgHJ6loiLlpaEkpSYj3qLhJaknImVj4aKnZKcm4iPqKKfmouQioCAaYCFeX+Wi3qIjY6HjpWZfZKhnZ+hkpdyaJ+KoI+McJKNgqmJmqGlqqOrf7CupKK4l3ajs6Kjf4iUeJ16qZh/oo+fnZmJmHKgfYiOsLV9bJqRoXh+mbWjo6uohJl8m32cm390qlpdb3uXjHmeY01/e3uGZXqYQk2fWaJqc32Pb4KKhJl2m3mHibGzf32ZkqZzfZ1tcHyUb5lyaaNdlXZIZWNfdHF8fW5lX2tndXpiY19QXVdcU1ZAWUVQZ0RSVlxhWF5JRD1COD9COklFN0xFWEFXUltWRUZiXFpgS2BtfXFFQzxWXmJaZWpWZ2htb2JmZl5hYFxdXmBoYl9lY3ZsXmVnZmxkZWxoaWxplJ6BsK6ahFNfoae0urKyqJqii5qpm5unkqCro6Coj56enZqZlZignZaHh4l3hYFueJSEj5uLfZGTlohygYmSoZtykpCAiJiUn5qEjqicmpWKiop8g2yEhXGCoYt3hIyIh5GYlHqRop+dooethn21hI+enXumlnqpgpefkYykoYCnaXhufplzoHNxfJ2FmG+Tgqx7o4Snn5uDpHBfqWh2o2RwpmGc0498e5l4cnNjooaRfqJyo5B2a5CzjGCDmIt1q7OovH93hG9/v6aqtF6cb39yl3CCdKNyXqRndKZgaKZrmtOYeYGabnZ5l2ubeXaXcmyppWdfZXlxf4RsaGZjbXV2Zl9hUVplUFFhSFZJVF9XU1tlaltlUEVDS0xJS0JLRThQQFFOWFNYT1NRYGVkaVNkeHl3SkdFZF1lWmhpU2loam5jamZgY19cXV1faGJhaGV8ZF5kZ2RrZGpsZ2htaJibf7CsVF1LfqqvsbSwsqKcmISXpqCgooykp5+XqYqZmJmUmpOSoJiOh4V7cH2DaHyPgpOagXeRjo+KcICGj5ORa5iTfIiRkqOVgo2omZOSioWJeYN2iIBugZ+Gd3+RhYaXoJV4kaCimZ+Is6Gitot6rKekrqVxqYCbkYaCn5V+pYGjm4aYcZ6Eoq2vipeLf4ykjZWDr6OVd7W2tsqidJSNg59gnZepbXmWh6CbdaGHd6B+kZeLgW9NZqOTcZuJdKV7enVihINufqBtcmRgnHN/dJhre2q0trTGpnOYfXmcapqZq3OAmmxzd5dpmXl0mHFQRH2zXml2a3iGZmtmYnN0b2xVW1JZaE9RZ0lVTFhSVVxna25VZ1dNSkFJTUtISk5BUUpQZWNqbWV1c3N/eXtudIl6e1VRTm1eaFtraVJqaGlsZ21mY2VfXFxcX2liZGhre19dZGdjamZubGVpbWWinYivp4VlQJSisquvr7Whoo9/lqehoaOLpKadnKaCmZeXjpeQkJuTjoiDeWt5hmWDjH+XoHl1j4iMgmqFhZKEi4WdjXqMipWlkoKXqJaMkYuAiHqAfYt5cI+ghXmAlIaIlZ6UfpKkppuVloRmbnicbKJkfHKleJyYcGing5qOfaV7opeDlnKfdoGJlJaPuW6QiqJifZqjl4ludGura3WgbnCnYZtqi5BploeblXWigX6aYIuGjXVviGJooWaef2qbdXFlZ4mCb3OiW19bZKFuXomNcXyAdHJkpW54omNmp2eXcYqXbaFvUoiPbqBeZKdUi11UmG1tc2txgW1waGt3c2puUVZVVWVYUmxJWE9bSFdoaHNqWWtWUFJFVlxMWFJhVWhqXnd1e3xwfXxyg3t/c3eNgIN3XlFzYWdicGdQa2hoa2xvaGRnX11dXWBqYmppdnVdXGNoY2ppcmxma21jnaaZpntldG2Mp66lqbCxpZ+Lf5WpnJ2ji6GhmqKigJWZk46akIuXkY6Ke4ZxgIhoiop8l5tzdYl9kHxlg4eViomVmoJ8iIaWppCAoaqPhJCKgYl9gICOc2mPpoN9hZKMh5efjYaRqKWciKZ4lZt+pYmWjLKZnpGEr5efpXqYiXupdaiRhJpupaKMkoSMg7xtfKWvgoeFh5WYnqN+pnxzqJWhlmmff3CsY5aKlpN4qG2qo4GJdomDd6uRpohrkrFsd7ONqWyLhm9voJ6SlWJ/q4yqeIGAjqefd599haSWnaBnmYZ0q2aerYy2c3a+jKSTWYOmjathdnJ0b3t1cGJqfm5nbFJUWFRgYFxqTFxRW0hdbG12X1txWFtfWmdzZW5vcWNxdGB3en55cnmDc4R+gXt7jIGCgHZieWRjbnNkUmxnZ29tcmlmaWFfXlxhamJsbHpvXFxiaWJtaXdtZ2xvYpamqp2BgJ+llqqqnqenraOYiIGWqZmdoomapJyonYSMmo+GnJGFko2MjHSFeoiDb4yEfpeTdHWGcpGDbn+LkoaFlI98e4GFl6SNf6SkjYCNiYSUdYKHk25si6iAgoqTjYibnYiKkqmin49/dJOXiH6BeZSvpH+CnXGPhnmTjoaBe3OpjXF9fXqXlpuFjnh7fX2Gk5WTi3eSmqGjhXx/i22Nhlx6eXN7cWlufpOKcoB0go+Uk3GGhINmjX9fgoGMeHd0lXZwem9wiW6Fhl93aXiOZ4KDho+qnH90fZZpiYhvfXV7gnRsbGaMc3h7l3eEW2tXeY9pbndycm93eG9ca4VuaWZWWV5WXGVqY1VgVF1QXm93eWtqdmRpamp1e3BxdHNhb3RidHuBeHV6gnV/gH+BeYuFgn57boBtZHluXlduaGh1a3hqaWpkXGBaY2llbHF1blpbYmtkbGt5bWhsb2COlLmpp4uho5umpJmknauhn4ODlqmRnZ+ImaaaqJmDgZyLfpaUh46KiY1ygnyOfH6OhHuXjnRzhHCVhnx9kouGho+FeH6AhpijjHumn4qEj4+ElYKGjph3cYSqhY2Rm46HnZ2Gipqmn6Crg4iNlJt/foqXraiQk6iReXGflIV8lXCArIdxfpVxanB9gZ+Lf5GNimdtXYSMjp2eoZF0l46Kc3Vsg3d0gVlyb4eRgn5/jGpdaWR7hYSJgGBpeXycfISNhHeCiIVqeo2JbGJxc4N3YHSNg4qRqJaHZ42Ogmx2ioFtgop2bWNlY3mDepVaXGlnbnZbe3l3dW5zcoNmW2yJa2tiWVhcWVhrcVteX1ldXGVyfXp0b3Riamppe3txenZ0ZG10aG17fnV6fXt5eoCAf2+GiYN7fXN/enN/aFRccmlsdm91Z2xnZF1hWWpoa2pxcm1XW2VtbGdyeW9oam1gjIyrsaKQo6Ganp6YnZmooaB9gparjJ+ThpqikaWVf3uYhXySmYmIh4eKcX2AinaEi4GElopyb4BzmIeEfpODg4aKgnqAg4qan4+BpZ+Gd46XiJWKi5yXhIN5rIGQl5iTiZ2chYegqZ6hoqOLh5KbnaOalquiqKiik52JmZF+epGQhqp/f5ORkpOdsqaalJ6OjLCRmISnjo6WnaKLkp2FipOLbH2Pd3hmgoaRi32JnoSIjI+IiIGFhJF4fHt1nKSKiIygjIeWgICOg4F3cXWGhYB5ioiLkaeRhIeOh4KLj4p5g4iFjH90aoGDfHmZaXJoYXOKcX57d3dwd3SBXV1uhmhuX15ZWlxTZ3FVY1taYGtndHt7cm5vY2pqaH57bHh+cGhvb2tmgHtygoB3f31/hHttg4yFfHp5fH16hHlPZHdrc25wemVsZWJiYFtzZnBmcnFtVV1sdG1oeHpwZ2lrZY2Inrufl6OhmJWZmJSYpKCcen6XqY2djIWfnIuel314lYN7jpmJhoOEhm14gH9ygId+iJOEbWt+epeHhIOQfoCGhId8h4KMmp2ShqmdgnKKj4WSkYudkXyNe6mDjZGWlI2blYWFmqWfopqehoOSmpmZkJmmoKaenpCXgpSNeX6KkIanfH2PkJGGmKqhnZOdjo2ojJGAn46KlZyhhJCZgIiPhHB5h3J1YX+EkIh3jJmBhI+BhoV/hoSVbnp2dZSkjI6HnIaGkHaCjX5+dHN8ioV8eo6PhZSokIeEj4GCiYiIc4KFhYh5bWp9f3ttaGtsZ155f2d9e3Z1dnV7d1xfcH1tdGBjWlteUGZsU2RaXWBqaHR5fnBsbGNrameAf2tyf2trdG53bYR5boaAdoKAfYV2cYKNh357e32Ae4KLYGl8a3VoaYNlamNgaVxjdWdvYnVtbFRicXllb3l6cmVqbW2Lip+4mqKkn5OSlpeLmp+enHp3m6SQm4mGpJSLmJp5eo2GfIqSg4yCgoJte353coCFfYqQfWtofYGXiYGIjnx+hYSHfI+Bj5ubkIimm39wi4qLkoagoYqFjHyokIeOkZWRlJF3jKOgoZ2Wm4CBkJqYk42aoqKkm5iSnH+QiHuChpGJo4F+jY2PfJikoKCSmpCPpYuPgZySipSZnYCUlH+Ij4J1dYJxd2F+gY6Ic4qWfYmMcY1/g4aHj2h4cnqOmpSRgZmAio10hIp+f3N7fI2GfHuTjoSXppSMhpB7hIWGg3N+gISFeGRwen93eXBsamZefXNofHV2dHxzgGpeYHR3cHdkY1hdXlJpZ1RkWF5gZ2l1eIFwZmtjbGdlf4FqbX1nbXBqfHeGemuLgXKBgX6BdXaCjYZ/fHuAgX1/j2pyhG50aWKIaWxiX3FWdG9sbWB4aG1XanN2Y3R6enFia295iY2fs5Klpp2OkJiPhZyhmpt8daKejZd/jKGKiJuWeHyGiH6Ein6IgoF/cH96c3WChX6JkHdnY32Gl4qCio14fYCMg3mWgJWXlY2Vnpl9b4uBkJOFpZuHjImDppSEkYmUlZGQdZGdoaGYlJh6f4+Yl46Wmp2lnpqUlZ17komFeoiZj6B/gouOjHOYo56gkpiOjqCLi4OYmISUl5uAmo99iY6Cd3J+bntkgH2Lh3GHlICRgmuHg4KAi4ZmdnB9iJSajn+VeY6LfoKJfn1zgXmLh3uGkouMmaSXg4SLdoeDgYBzeH+GgnNednd9cn12ZmxlYH9pandzdHV9cXxjZGFzb3VybWFZX11aamNSYldfX2dqdHiGcGJqYmtmaHyCa2h0aGxvaH98gXlsj4VxgIODf3R8g4yBgH56goN+fJBtdYl0dG1mimxqYmN1VoNpcG5geGdsYWp2cGZ4e3lxX3FshYWQna+Yp6mejo2Xh4Wfk5WXfHanm4qYeZeci4yZkHl8gYx9fYN7gIKAeHN4eXN9gIN/iIuAZF59i5WHf4WIdH1+iX9+mISWlJaMo6CWfnGGe5ORiqaPjI6KkqCQgo+Ok5aQioCPl6CakpCSc4COkpSJnZ2ep5mZjpWXdZGSjG2ImpKcfIiJkIlvmJ2aopKVioudi4aBk52AlJSXiJuKfYqKgntxemt2bXx/jH9uhZODlXhwgoR+f4yBZXNqfYKYmIaBj3WSi4Z7iX93eoJ/iIJ+hY+HjZWlkXmFgnSIhnt+cXJ+hIBrYHl0eXB7bmFuY2V7Ym5vdnN4d3R0YXdgb2x1bnBdWl5dXWldT1xXYmBnbHJ6iGpfaWRpY2h3h21mbGhpbGeAfHp3bo+Ic4CDhX10gYaJeoN9eoGEfXyOcnmLeXhubIdraF9pcmKHaHFvZXZnbWxhemhqfHt4cGF3bYuBmZmroaWpnouLkYaJnYuUlnx2rJiMlnyfk5GXlIl3fnuKfHyAdnh/gG9zc3pvhXyAgIl+fGBbfo+Rh4CEhHJ6f4Z6j5GHkZGbkqSak4F8gXyNipKkiY2KjZaajISPl5GUjYiIjJKdk5CMjW6EkI+RiZ6ZoqGYmIqXk3CMnIZoipuRlnuJhZCKcJaalKGRkYiKmIyCf5KffZORlI2akHyLhoh1c3VrcW51fYt1b4aRjpJydIB8goKKfmdzbnp/m5V+hop2ko2DdYp7cYOAg4l+ho6Lho6Wq457iHx+ioR2fG5sfYKAYWZ3c3RuemFeb2FrdF5wanp5eW10cWV6Xm5sc21zWVldX2BpWk9WV2RiZXBwfodlXWloZmJncI1uY2hoZWhngHp3dG+OhXOBgoN8doOJhXiFfHiEhnqAiXd/i3x7c3mDampfcGh0f2txb21xZ29rZXthbX95d3Bsd3eJf6OYo6ihp5uIi4qBjpyGkpp0f6iUkY2HoY2WlJGBdHx2hXh4f3JzeoVscW94bIl2f4CGbnFbWX6SjYiAgYF2dYB/f6CGj4qSnJegkpZ3iX6AjIicnYqPhpKXloWIk5iOlouKjY6MnYqOkYNtiYuPkYqclqGcmZaGmYlsiKaFaImgjJOAjYWMgXiUmJKdkZCIiJONf36QmX2SjpGPm5N9i4GFcHZwbG5vcHyGanODj5mLcniAdYKJg3podXB3gpuQfYqGe5aTfHiKdnKMfYiPfIyIhYqPnKWJfIR2gYp+d3draH5/fltxcnFvb3daXnBhcGteb2p8enFubWptd2Bwb2txbllYYGBgbFdQUlllZWF0b4SBYV1rbGRiZmuSbmBmZl9maoF1cXJvi4B0f4OBeXaBi4B5hn94h4Z2g4V7houAe3eLf2pwY3xihXxvcGx0amhubHd3X3F+eXt0dXN/gn6llZutn6eXhYyDfpaVg46ddImek5KFi5uMlo6MenJ4dIJwcoR0cXWIbG5sdGyHdoJ9f21uVVGBq5SHgniAdnKCeYKggpCBkpKYmpGYd5B6goySo5qTjoiUmJKDhZWYipKLiY6PiJ2EkYt9coqFiI+InJmem5eWgZWAaYmfimmJo4qUhpKEinGDkZiPmo2Pi4uOjXd7k5F7kIyOk5eOfYl+gmx3am9sbG17gGJ6fpCXgnd7gniDjX16aXZtdoiXjICJiH2VknN7hnJ5j3yMj3yKf4WOkZ+gh318d4GKfHZvZ2l+f3Zddm5ta3ByVV1uYnJhX21ueXBocGZndHZpcWxhd2ZdVWVgX3FTUE1bZWNcd2+Ie15caHBhYmVmkWpfZ2RbZ299b2xxc4l9dnyGgXV2f4x5fIaAeIeDc4aFfoyMhHx6lXhncWqDYId+b29re2BpbXSAdF5zfHiGeHRzhXx5oZCasZylj4OKf4KZiH+Jm36JmJKOhIiYjo+PhHd0d3OAcG+EdHBxg29qaXVtgm58fG10c1JOgt/JktaTfG90g3WDn4KRdpSQmJuPmHuTcoWPnaGTk5CJkpqThX2VlYeMjYeSjYmcf46BeHuNf4iMiZycnJuWlHuOd2mMlIpui6aHlYqYhIZjjJGYjpSJlouMiYtwepWKfI6Ji5SSi3uHfYBtfGVzb2tte3pbgXqQkIF7fn+Aho97eml1a3SMkIuDh4Z+l41tgIBwgo6Ajol+hXyEkZabnIx9d3iCjndxa2RufIBpZ3NuZ2lzbFNeb2VwWV9scXdna2tiZ3l0cHBkYHhhYFVrX110T01LX2ViW3dwiXNcW2R1YGJlZY5jYGZiWGlzc21rcXaLfHN5hoJ2d36Lc4CHf3qJf3KJh4GQiYl9fpl2ZXNufGWHfm5va39ZbG55enJgdnp7jXZydol2eZ+MnK+boJCChHiHlH57iJuGhJ2QjoWMl4STj4iBdXdweXFvhHBtbX5yY2R3cHxteXxqaGxjpJrB3K7vonNsdoN1hKGEkG6Vj5Wfk5qAkXCFiqGWiY6VipCclYKAlI+FiI+AkoqKl3+He3Z/iniGhY2bm5eZkJB3jHdwiouOgI2nh5SLnoaGXouUl4qOiI2KioSJbHyXg36JhouTkId3h39/bH1keHVqb3p0WIl7koiGe39/gIaNf3pndGqBio+LhISBjZiHbYN3cImSg5KGgIR8gZKXlJuRdXR4h4t0cnBkcnZ/X3Jsb2FodGZSYHFna1VfbnN5YXJjYGl+cXNuW2NzYWNWblpbdkxMS2JlYF11coltW1xkeF5gZGWEX2NjXlhpcmtua3J3i31zdoSBeHh8iXGDhX19iHt0i4iHlYWMf3+Yc2h1cXlti3puc3CAV3F6dnlxZHZ5hoxodoCJcYCdiJmonKOShH1wi5N3eImbg4SfjY58lo1/moiFfHN3cHNqb4Fsamx8dF5gd3Z7cHR6Z2BlfOvatcnD3IlzbHSBdomZiIxol4+Pm5SSgYhwhYifjYWLlYqMl5N7jJKHgoiPepGLho+CgHd4g4Ryh4KSm5aTmIeNdoh/cYiFjIqdpYaXjqCEimGElY+GiIWIjIaAh2h9lIB+g4WLj4+DcoiAgHJ3aHZyaXV3bFqNfZODhn6BhIGEi4N3YnVtioKRjIN/gJSTf3CDbXqIkYiUhn2Df4GTlJGYim5xeYuFdGpvaW91fl1yaG1caXRfUmRxaWZTX3F2dGBwYF1ohHFzaldnaWRpV21XW3NLSUtkZV1hcXKFaVtcZXhdXmRnemBkX11Za25lbmpzd4p+c3OBfnt2eohzhYR8f4d2domFj5iBjIJ8lHZsd3Z5eJN0bnd6fFh5hnGAbmd4dpGCZHaGhXCKl4aaoZuiioZzbpGKcnaNmn2KmYiJfJ9/hJp/gnlyc25vZHJ+aWZsd3dbX3h6enFxf2lhZ2F/1baOkaZ4bnF3e3CSkIyFaZiNiJqQi4V6aIeLmYaBkpCGhpeNe4yMgICJjXuQjX6JhXp1e4N8cYaAlZmNkpSCiXaFiHmGg46WoKKJmJKhgIlhf5SHhIeDiIx/f4JmfZGAf4CDjpCRf26EfoR1bG13dXR4dmtjjoKPgYZ/fYWAhYl/cGB0coZ9kI6DfYCSintyhWd7hYyJjoV9hoCBlZCRlIVub3iLfnRsbWhpeHpgZ2lpWGt1WVJpcmliUWJyeG1iZV5aaoRudGJcaGBlbV5uVFptTUdOZWNbZm1wf2tZW2JyX1xjbHZkZV1dWmxsYmxqc3aGf3Fvf3x9dHiGeIWDfYCHdXiJgJKVfImGd4mBb3h5eoSSb216gHZeg390gWxoenOUc2dyh3xxkpKEmp+boIeGdXWTfm11kpV9h4+Eio2afYyadn53cm9samF0fGdiaXV5WmB3e3ltcH5lZGhoV52PX3Jzl7zEhHVxlIiPfXGWi4abkouHcmmIjpWAe5WLgYSai3uKhnx6iYt/lIh1iYZ2d36BcnWFgZ2UhZSPhIRzgYp3h3+MnKCciZaPnoGJZn2Tgn+FgoiIcYF9Zn6MfHl/gImNkH5qgX6FdmZweXh0eHRsao+Gi4KLgXmDgYWEgWxfc3l7fo6LhnyDkIJ/c4NqeoWJjYiGeYV+gpmOkY1+bm16iHx1c21mZXt0YltwYlducVNTbnNoYU5ndXhmYF5dWW+Bb3RaZmJea25gcFBZalFEUmZgWWptbHtuWVtdbGJaYm92ZGdcXWBraWNranN2gYJwbn58gHR1g3qDg32BhXZ9iIGWkHiEi3WBiHJ4eX6NkG9veoBxaYF4en5tbHt1lWtqd4RzbJONhp+Zn5mFh259i3Vpd5aNfoCJg5WXinqQlm97dHFramRgc3poX2Vxelphcnx5Z3B5YWVkj7Gyd0tiWqXZ0JZxepCKj3d8k4qEmJCLhW5rhZGRenmShoGEmIl7hn93d4mKhJaAb4uIcXV+e2p5hYOlkIOTjYSAcICFeIZ8iZ+cmI6WkpaFiHB7k4J9goKIgm2BdmiAhXlygIGFi4h9Zn5/hXZkcXOAaXlwcHWZjoaDi313eYGEeoNrXHJ/c4KJhop+h4p8iXOCbnKGiJGHh3SGe4KajY6FeW5ufYN+dXljZmh7b15YdlpXcGxOV3FzZ2BLbHd0YV5cW1p1fnNwWGdeZ2pxYG9OV2dRPlhlXVluamd5cFpaWGplWWNweF9nXF5lbGdma2lxd3+Hbmx/foB1cIJ7gIJ/gn92gYSIl4lxgo1xe4Z8enmElIx1anl+a29+dH98b3J7epNvb4F+eGeSi4KhmZyRgoVmhoJvZ3mUiH1+hIKYiYF8jo1oeHNra2ZfYG94bV9ib3hcZGuCemBxdV9lZdTqvYsyOj6Ljn9xeYWHjYx1gpaMfpKNi35ta4SMjHV9j3+EgZSIe4J3bXWGhIOXd26IhWx1e3VmeYGDpouCj4uEfm6BdnmGfYmgk4+TlJWOjId/e5KGeH+DjIJrf3FogH55bnx8g4uEeGJ6hYJyZXJpf251cnWCnIyBgIaAdHZ/gXSCcFtugHV5jISLfIiBfol5e3JtioWShY10g3qAmIyLgHVuanaAf3RzW2dndW5XVnxTWW9kS1pycmVbSXF4b1xbW1lddX90aVpiW2hmb2NqTVdlUD1dZVxcdWVgdG9aWFRuY1lkcXlaaF1gZ21naWtpcHd9jmxpgoR/eW6AfH2CgIJ6dYKAjZOEcICLbnh+gHt7iJOKf2h6fWpze3KGenN2fX6MeXiEfXxri42Dm56Wi4GAbIx9amh+jYt6fX6DlIJ+fYqIa3VxZ2hiW2Jmcm5fYWtzYGhwiHlic3NeY2SboI9uXTZar7V0aYCIfJGGdYWVhXOOiol2b2uEgod0eYl4iHySh3l+cmZ1iH5+mG9xh39pdnluZnmHhKSGgIeMin9vgHiChICQnIqFl5OaioyFiXyQiHF7fYR7aH5saoB7emp7d4OIgXNgeIJ/cmVzZ3aDbnV8hpaSgn2DgXB4enx1gG1YcIB3dY2Dh3iIdoSJfHl0b4uCkoKHc4B+f5SJinxvbmltgYF0bVtlZHFvUFp6TltvW05bcm9kVUtzeGlXWVpaYXGBdWFeXWBnZGlpZk5ZZ01AYGNbYHVgXXVsV1dTdGBaZG9yV2pdYmhrZ21saHB3fJJraISKfXxvfn58goCBeneAf4qLg3F8h29yeIN/e4mMj4NqfXttdnh2inZ8eH+Chn+Dfn16bYSLh5ijjISDe3WKeGpsg4eQeH16gpGAgH6Lg3BycGNmXllmX3BvX2Bnb2Zqbol0YXRvW2FkanV6gL+cpqTIuHGFgnKSe3eFkoJzkIuHcnJvg3qDc3SHdId3k4d4eXBidod6gJNpcoR3Z3d1Y2p8goedgYB/jo9+c4F1h3yDlpOGe5mQl5CIgol7iYlreHl+dGd6aGt/eXNpeneBhH5oYHiJfmxrdGh8gWl2goySlX98f4BxfHd8dIBiVnh+c3SLhYJ9hHKIinl5cnGFg4+AgHp/fnePhoR3anFobIeBcW9cZmBxbElkdUtdbVVTWXNuYlFPdHhhUlhYXWFwg3NcYlxpZWVka2RRW3BJQ2NgW2NvXV14Z1RWVXZeW2VuaFZrXWBqZ2Vubmhwd3qSbWmIjHl9cnt+eYKBgXx2fYOIhoNvd4RybneCgn6Ii5N/cIB8d3h6gYx0gnh/gYGChHqAdW9+ioubnod9hXl3hXpndIWLkHl+f3uIhYR3kIBncG5fZFxYZFlscmFgYHBsa2iJbmBzaFleY25/d6naqceGh7JxiHdvjHR6hY1/eZKJf3Rzc312f29xf22Ec5OFeHRrYHmCeYmPZnKEcGh1blttfX+Qkn+AeJGTfnl8b4p4hJSOh3eZjZOQiIaFfICFbXR1fmxmdmRte3Zua3d3gIB9YWN5h3ppdnZjfnxodYePjZZ9doF3cYB7fW6BWld1f3B2hYh/gHptiod1eWx2goSFf31+en10jIJ+dGh0ZW6Kg2xyWWhdc2RGbW1LWmFXVlV4bWJQUnR2WFBWWF5gcoRvXWFjbWVkXm9jVFxxRkJlXl1lZ11bemJRVVt0W1pna2BWal5gb2Zma3FocHZ4jnRrjo11f3Z4fneBhIF7dH2DiIeDb3KAdHF1foWBiY2Le3eAeIJ7fIWHd4d8fYF9hIB7fnJ1eYuNoIyIeYh2dIJ4Xn2Fl4t4hYN0hYaEeIp7Ym5sW2JbW2BWaXNiYFtnbm9mh3JhcWVXXGJrf3zKzoe5oWptbYlrcYNxe4OJfnqQhHl4c3h0dHtqbHVig3WRgXZuZl99gnqMimVygmtqcWNYbHqEm4iBgXKWlXd/fXCLc4WNj4p0mpCSiYaLg3t5fnFwb3xkZ3BhbXhxa21xeH5+el1me4F4anZ5ZoN3aHSIjI6WfnOJa29+gnlvfV5ZdIBtdIGLfIJvcIqAcndpeIGCgYN4f3N7dYh9e3NncmFui4BrcFZpXHZbR21qTVZVXVNVe2thT1R1clBRVFdeY3WFaV1gbGpmY1pvYVhib0dBZ1xgZV5cVntdTlVkb1laamhdV2dgX3JmamhyZ3Bzd4Z4bpWLdH96d356g4h/dXJ/h4WOgnBwfHh2dnqFhYeMhnp7f3SKfX2GhIOHf35+fYZ+fHl1eHeRk59+i3yKbXV/eGOChpWGc5GKb4WFgXuEdWNuallfWlxdVGdzZGBYZHFyZ4ByYmtkVlpfan94vq57n7ZtYXOEZ3N6cXiBhXp9i353d3J1b3t2ZWpuYIZ1joBzaWFefnl5i4RmcX9oa2taVm93iaKAhH9wmZNygXp3hXCFhZWLdpiLjomFiYV9eXRyb2h4X2lsYG12a2hra3l4e3dbZ359eWZzfm2FdWV1ho6Gl4BxjWhre4R1bnZjXXJ+bHV9jHuCZ3aIfm9yaXeAeoCBdH5te3yDe3hxZmxhbYl9a2xVaV92VUppak5STmdMWHxoYU5VdWtMUFRVX2d2g2deYXFoZ2JYaV1ca2dKRGpZYmNWWVV5WU1WbWlZXWtkXFlkYl50ZmxkcWdycHWBd3CZhnZ/fnd/fYWHfXVzgoiAlIJuc3l7enRzhIaJiYN5gX51jn58hIqNg4KEe36Kg3t3fHd3mpyXeoiChml2fHtsg4OSf3KOgXGGgn+DgHBmbGZXXVtcWlNkcGReV2JydWl1b2VlYldbW2h/cG9ygHOJZGR5fGhzdXNygYN3gIJ4dnJ1bWp6cWFna2aGc42DbWZdX31we4l/aW14Z2pkVVdyb4ylfIR7dpaRdH10fn1wf36UiHmbfomHg4eDfXVwcWxndFtrZ15sdGRoZml6b3xyWmiBd3VpcYF4gndid4aLfJWCcI1rbnuDcmd0ZmFve2dzeIp8fmN3hHdrbHJ2fHJ8e3V/aH+AgHl3b2RmYm2Fe2xqVWhhb1JKaGlPS05vR156ZmFNVXRkSk9TV2Frd39mXWd0aWZgV2RXYnBcS0tqV2NhVVRVclZLWHVkWV5rYFtaY2RfdmZtYnBpdG9yf3V0mYJ3f4B3f3+GhHp9dYKEfpeFbXJ0fHp1cYSFj4GAeot2c5B/fIGVjYCFhH19jIZ6foF3e6OlinmHhYNrdHt6dYKAi3luhHN5hH2Cg3ZvamhlVl1bWllTYm5kW1hhc3tqaGxpYGJYXlppf2lrcIBnbGBneXdpcnNzbIOAeX57dXRtemdpeWpfZW5ogHaPhGZlWGJ3an+He29qcGdmXVRYb2eNp3aAenyQjnp2cYBxdXh8k4N7l3aGhICGiHZqcnVnZ25bbGRdbXJfaGFqeWh8bVtug3N1a3CBfnp4YXeGhXmRhnSJcnF6gXNjcmpdcHhlcnSIfHljdIFxZ2p6dXNtenl2eWWEfIB5d3FkZGNte3xqalRnYWVTSmtmT0dRakVheGZhTVNyXUpOVVllbHh7Zl9ucWpkXVZhVW5uVkpTZ1dlXVhNVWtUSVt4Xltfa11dWmJlX3lobGFvb3ZucHh1eph+d3+BeYCAh4Z6eXqDfoGTg3F0dH96d3SEiJF9gXyRa3KVgHuCn4V+h32AfoaCgIl7d4Srnn96h4eCanKAeXWAfoB0boZufYBzioBqb21kZFlfWllZVGJqZ1taX3WCaV5tbFxhV1tba4FlcXR9aWlcanZ0ZnN2cWuDen18eHVybHlmaXdmXWRyZ3l3koBiYlRlcGiChXh4Z2lqYVdWWWdijqdvfneAi457cXJ/aXtxfY9/eZFzhX6AgIZuZHZyZGdnXGphXW9vW2hfbXVle2hedYFvcmtyfH51dmJ1hox7iYiCgXlzdoB2YnFuW3J0Y3FyhXx1ZXOAbWFte3Franx7dnNnh3d7enZxZWJkbXJ9aWpTZ11cVEtxYVBGVmBHY3ZmYUtTb1hLTVhYaGt2e2VlbnFnZFpYXVh3ZVRKXGJXZ1dZSFdkT0dheFpdX2xbXlxhY15+aWpgb3R4bXBvdoOYenKAgHx/iYyGfXZ2hniHjHxzdXWCeXt6goyOfH6FiWlzloF6ipx+foV6gXt/fYaJc3GPrYt7e4aPfGVxh3lzfHp1cm6FbHt+bI96Y3BvYmVdZVZZWVZjZmtfXVxzhWhYcG5aXlhaW2t6YnB3dmxhWWxycmZ0dW9rg3d+f3h2bW5zZGh0ZVtndGV1dpF5XlxSZmdrg4J0fmJkalxUV11hYo6kaXhzg4aReW5xfGp6b3+JfneLdIJ5fXmAaWR2bWBmX15pX110a1lmXW9vY3plXHh9bG9vcHh5dHVlc4STgIeEinx4cHN+dGN4ZVxxcWJxcoF8dGdzgWVfbndqZWh7fXVvcIN2dH1zcmJfZm1ufGRoU2ZXWFNNdl5QSVlXSGJ0Y2FJU2xTSk5aV2pscnxkbW1zY2FaWlthd1xTS2NdV2hTVkZYX01GaXVYXmBsW1teYWJdhGloYW54eW1wa3aAkHltgn6AgZOIhIF2dIl0jIZ0cXZ1gnh9fX6MkH9+lH5wd5WDfZmSeYCAeHp9f3SIhHRwmaB6en6HlHdjdId4cnd0a3Rvfmt4fHCRc15wb2BnYmxUWlpXaGNtZlxccYllU3FuW1pYV19rdmRpdWppXllscm9rc3NyaIR8fn97dm5ta2RpcGNba3JkdHaOc1pWVGVhcoB/coJdYmNdU1lgW2OQn2VxcYWEknVsbHtvcHJ9f35zgniBdHt6emRldWddYllgZ1tedmhXYl1waWF4YVx8dmprcm94dHN1aXGCloSHgIV3dGtyfm9neFhdbG5jcnOAenRncH5cYHFzY2Frc4BtbnZ/c3J4a3BhXGVsbHpgZlJlVFdRT3VaUE9YUUhjc2FgRlVqUUpRWlZra2t9Zm5vcmJbWlhZbHFXUlBmVlZoU1RFWVtOSHF0WF9jbGJYYGBgXYtqY2RtenhscGl1eYd7a4N9gISafIOEeXyIbo+Hcm52en10goJ8i4+Cg5h0eIGThYGeiXWBgIJ0f4JxiIN2cKGWc3mFioZ6ZHaKbm56bmZ4cHlrcnZzjWtedG5hZ2VrUl1bVWdhbGtaXHGMZE9vbVxWV1RmaXNoYnRlZFxYbXRsb3V0eGqFfH97h3aPc2Nka25gXG1tY3N4h2tZVFZjZHh9fXGGXWRfY1RaX1hilZVjbXCDhYp0a2l8cGd1eXZ+bXt1dnB7f3VfZnNjW11WYWNYYXRlVV9gbWRhcV1dfnBoaXRxdHF1d2tthZSCiX2HcnNocH9xdHBUXGdrZnF0gHZzY213VmNzbFxgcGh/Z254fnNzc2ptYVpkaWp3XmVTY1RVUFNsVlBWU1BHZHJfYEVXaU9JWFRXbmllfWlseGxiV11VW3RkU1JXaFFYZlRTR1lZT013dVpfZWtpWWFgXV6ObmJma3l2bm9pdXaAf2yDgH2HmHuAh4CJf2uTiHJmdIB7dYCDfYmPf4yTcnyKkYSHn4Z7f4aNdIGGc36Cdm6ki3KAjIp2dmx5i2Bke3BmeXN4bG1yd4NnZHtsYmZnaFNfXlVnX2tvW15ujWhNaWxgVVZTbmZza2V4ZWRcWG9za3F6d3Jrh3p/dpx6eWthZWxtXmBuamVxeH5nWVZYYGx4fHtwhF9jXmdWWF9XY5uIYmtwgYd9eGxsem5deHNufWt2dG9wfIFzWGpuX1lcVWFiV2RwYlNfYmliYmxaYX5sZmx0dm9td3dsaYaNgIp8iW5yZ3F+bnRuZFthaWlvdIB0cl9pbVNlcmVWZHBkfGVzeH13a3Bta2BZYWZndFxkVWBVUk5XZFFOW05PSGRvXGJGWWlNSl9LWW1kYHlpbn5lYFVfVF11XFNSYGZOXGBVUklbWFBZdHVdX2VraFhiYFpejXFjZ2p4cXNuaHZze4NygoN6iI5+fImHjXlukIl0a3OBdH9/iIWHkoSWj3l9jI+HkZuEgHyNhXOAgXN0eHNvk5OTk5OTk5OTk5KSkpKSkpKSkpKSkpOTk5KSkpKSkpKSkpKSkpGRkZCQj4+Pj4+Pjo6Oj4+Ojo2NjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6NjY2MjIyNjY2NjY6Ojo6Ojo2Ojo2Njo6Ojo+Pj46NjY2Njo+Pj4+Pj46CgH56en1+fn19f35+fn5+fn5+fn5/gH+AgICBgICAf4CBgYGDh4yOjo6OjY2NjY2NjY2NjY2SkpKTk5KSkpKSkpKSkpKRkZGRkpKSkpKSkpKSkpKSkpKSkpKRkZGQkJCPj46Ojo6OjY2Ojo6NjY2NjY6OjY6Ojo2NjY2NjY6Ojo6Ojo6OjY2MjI2NjIyMjY2NjY6Ojo6OjY2NjY2NjY6Ojo6Ojo2NjY2Njo6Ojo6PjoJ/fXp7fH5+fX1+fX5+fn5+fn5+fn+Af4CAgICAgIB/gYGAgYOGjI2OjY2NjY2NjYyMjIyMjJKRkZGRkZGRkpKSkpKSkpGSkpKSkpOSkpKSkZGRkZGSkpKRkZGRkJCQkI+Pjo6Ojo2NjY2NjY2NjY2Njo2NjY2NjY2NjY2NjY2Ojo6Ojo6NjYyMjIyMjIyMjY2NjY2NjY2NjY2NjY2NjY6Ojo6NjY2NjY2NjY2Ojo6Ogn98enx8fX59fX59fX1+fX5+fn5+foB/f4CAgYGBgH+AgICAg4aLjo6NjY2NjYyMjIyMjIyMkpGQkJCQkJCSkpKSkpGRkpKSkpKSkpKRkZGRkZGRkZCQkJCRkZGQkJCQj4+Oj46Ojo6OjY2MjIyMjIyNjY2NjY2NjY2NjY2NjY6Ojo6Ojo2NjIyMjIyMjIyMjI2NjY2NjY2NjY2NjY2NjY6OjY2NjIyMjY2NjY6Ojo6Df3x6fHt9fnx9fn18fX5+fX5+fn5+f39/gYGBgICAgIGAgICDhouNjY2NjYyMjIyMjIyMjIyUztrY2NjY2pqBhISEhIhdLTAwMDAtRqGhoaGhoaCamZqampqaioOEhISDhHdlZ2ZmZmOAvru7u7u9s21mZ2dnZ2WQoaCgoKCjgGNnZ2dnZm+Eg4ODg4ODi4yMjIyMjI2NjY2MjI2NjY2NjY2NjYyMjIyMjY2NjY2NjoV9fXt7en1+fHx+fX19fn19fn5+fn5/f3+BgYGAgICAgYCAgIKFioyNjIyMjIyMjIyMjIyMjJTb6efn5+fqnH6CgoKChlMYHR0dHRk3pKSkpKSko5ycnJycnJyJgYKCgYGCcl1fX19fW37IxMTExMa7Z15fX19fXZClo6SkpKd8XF9fX19eaoKBgYGBgIGKi4uMjIyMjIyMjIyMjIyMjI2NjY2NjIyMjIyMjI2NjY2Nhnx9ent6fH17fH59fX1+fX1+fn5+f39/gIGAgYGBgICBgYGBgoWKjY2MjIyMjIyMjIyLi4uLkpeYmJiYmZmSj5CQkJCQjIeHh4eHh4mTk5KSkpKSkZGRkZGRkY+Ojo6NjY2LiYmJiYmJjJKRkZGRkZCJiImJiYmJjo+QkI+Pj4uIiIiIiIiJioqKioqKiouLi4uLi4uLi4yMi4uMjIyMjIyNjYyMjIyMjIyMjI2NjY6IfH95enp7fHt9fX19fH19fX1+fn5/f3+AgYGBgYGBgIGAgIGChYqMjIyMjIyMjIyLi4uLi4uRkI+QkJCLjpGRiYeOipCSk4+IjYyOj4iPkZGRkZCQkJCQj4+Pj4+Pjo6OjY6Ojo6NjY6Mi4uLi4uLi42NjY6Ojo6NjIyMjIyMjI2NjIyMjIyLi4uLi4qLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjY2NjYl+fXh4eXx9fH19fXx8fX1+fX5+fn9/gICAgYGBgYGAgYCBgoKEioyMjIyMjIyMi4uLi4uKi5CQkZGRj4SOkJCGio+FjZCRioeOi4eNh4qQkJCQkJCQkJCPj4+Pjo6OjY2NjY2MjIyMjIyMjIyMjIyMjIyMjIyNjYyMjIyMjIyMjIuLi4uLi4uLi4uKioqLi4uLi4uLi4uLi4uLi4uMjIyMjIyMjIyMjIyMjIyMjIyNi358d3Z4e318e319fHx9fX5+fn5+f3+AgICBgYGBgYCBgICBgoSKjIyMjIyLi4uLi4qKioqKkJCQkJCKhY6IjoaGj4mNkJGKhIyLho+GjI+Pj4+PkI+Qj4+Pjo6Ojo2NjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIuLi4uLi4uLi4uLi4uKioqKiouKiouKiouLioqKiouLi4uLi4yMjIyMjIyMjIyMjIyMjIyLfnt3dnh7fHx8fX19fX19fn5+f35/f39/gICBgIGBgIGAgYGBhImMjIuLi4uLi4qKioqKioqQkJCQj4WDjI6QjomMiY2QkI+Nh42GjImJj4+Pj4+Pj4+Pj46Ojo2NjY2MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqKioqKi4uLioqKioqLi4uLi4uMjIyMjIyMjIyMjIyMjIp9fHZ2eHx8e3x9fXx9fX5+fn5+fn5/f3+AgIGAgYGBgYCBgIGEiYuMi4uLi4uKioqJiYmJiZCQkJCQjIaMiY6HhY2JjouMi4WHh4aIhomPj46Pj4+Pj46Ojo2NjYyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqKioqKioqKiouLi4qKioqKioqKi4uLi4uLi4yMjIyMjIuLjIyMin9+d3h6e3p6fHx8fH19fn5+fn5/fn5/f4CAgICAgYCAgIGAgYSKjIuLi4qKioqKiYmJiYmJj4+Pj4+QjI6Lj4yKj4yOjI2NiY2Ki4yJjo+Ojo6Ojo6Ojo6OjY2MjIyMi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyMi4uLi4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiouLi4uLi4uLi4uLi4yIgH14eXp6ent9fHt7fX5+fn5+f39+fn9/f4CAgYCAgICBgYCBhIqLi4qKioqKiYmJiYmJiIiPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pjo+Ojo+Ojo6Ojo6Ojo6NjY2MjIyMi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIyMjIyMjIyLi4uLioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi4uLi4qKiouLi4eAfHh6enl7fHx7fHx9fn5+fn5/f35/f39/f4CAf4GBgICAf4GEiYuKioqKiYmJiYmJiYiIiI+Pj4+Pj4+Pj4+Oj4+Pjo+Pjo6Ojo6Ojo6Ojo2NjY2NjY2NjIyMjIyLi4uLi4uLi4uLi4uLi4uLi4yMjIyMjIyMjIyMjIuLi4uKioqKioqKioqKioqKioqKioqKioqKioqKiomJioqKioqKioqKioqKioqKioqKiouLh4B7eXl4enx8ent7fX1+fn5+fn9/fn9/f39/f39/gYGAgIB/gYSIi4qJiYmJiYmJiYiIiIiIjo6Ojo6Oj4+OjIyPko+Qjo6Ojo6OjY2NjY2NjY2NjYyMjIyMjIyLi4uLi4qKioqKi4uLi4uLi4uLi4uLjIyMjIyMjIyMi4uLi4uKioqKioqKioqKioqJioqJiYmKioqKioqKiYmJiYqKioqKioqKioqKioqKioqKiouGgXt4eXh6fHp7e3x9fX5+fn5+f39+f39/fn5/f3+AgIGAgICBhIiKiYmJiYmJiYiIiIiHh4eOjo6Ojo6Ojo6PjJCTkJCPjo6OjY2NjY2NjY2MjIyMjIyMjIyLi4uLi4uKioqKioqKiouLi4uLi4uLi4uLi4uLjIyMi4uLi4uLi4qKioqKioqKiomJiYmJiYmJiYmJioqKioqJiYmJiYmJiYmKioqKioqJiYqKioqKioWAenh5eXx7enp7fHx9fn59fn5/f31/f39+f39/f4CAgYCAgIGEiIqJiYmIiIiIiIiHh4eHh42Njo6Ojo6Oj4+Pj46MjZCNjY2NjY2NjIyMjIyMjIyMjIuLi4uLi4qKioqKioqKioqKi4uLi4uLi4uLi4uLi4uLi4uLi4uLi4uKioqKioqKiYmJiYmJiYmJiYmJiYmJioqKiYmJiYmJiYmJiYmJioqKiYmJiYmJiYqKhX95enl4e3t6e3x8e35+fn1+fn9/fn9+f35/gH9/gICAgYGAgoSHiomJiIiIiIeHh4eHh4eHjY2NjY6OjouNjY+Vj4mMj42MjY2MjIyMjIyMjIyLi4uLi4uLi4uKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmEfnl7eXp7e3l7fXx7fn5+fX59fn9+f35/fn9/gICAgH+AgICAhIeJiIiIh4eHh4eHh4eGhoaMjY2NjY2PjIyJio+NiIyRj42NjYyMjIyMjIyMi4uLi4uLioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4uLi4uLi4uLioqKiYqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYN+eXt6fHt6e319e3x/fn5+fn1+f35/fn9/gH+AgIB/gIB/f3+DhoiIh4eHh4eGhoaGhoaGhoyMjIyMi4mMioiHiYaMjoyQjI2RjoyMjIuLi4uLi4uLi4uKioqKioqKioqKioqKioqKioqKioqLi4uLi4uLi4uLi4qKioqKioqJiYmJiYmJiYiJiYmJiYmJiYmJiYmJiYmJiYmJiIiJiYmJiYmJiYmJiYmIiIiIiImJgn94e3t7enp8fXx8fX9/fn59fX5/f39/f3+Bf4CAf4CAgICAgIOGiIeHh4aGhoaGhoaGhoaFjIyMjIuMjo6MioqHhIiLioyLjY6Pi4uLi4uLi4uLi4uLi4qKioqJiYmJioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqJiYmJiYmIiIiIiIiIiIiJiYmJiYmJiYmJiYiIiIiIiImJiIiIiIiIiIiIiIiIiIiCf3h6e3p6ent8fH19fn9+fn19fn9/f35/gICAgH9/gH+AgIGAg4WIh4eGhoaGhoaGhYWFhYWMjIyNjYyQkoyNiIuJiYuLi4uJi4yKjIuLi4uLi4qKi4uKioqJiYmJiYmJiYmKioqKioqKioqKioqKioqKioqKioqKiomKiYqKiYmJiYmJiIiIiIiIiIiIiIiJiYmJiYmJiYmJiIiIiIiIiIiIiIiIiIiIiIiIiIiIh4F8eHt8eXp6fHx8fX1/f35+fX1/f39/fn5/gH+Af39/gH+AgICChIeHhoaGhoWFhYWFhYWFhYyMjZGPj42RiYyGiYyLiIiJjImHjY6PjYqKioqKioqKioqJiYmJiYmJiYmJiYqKioqKioqKioqKioqKiYqKioqKiomJiYmJiYmJiYmJiYmIiIiIiIiIiIiIiIiJiYmJiYmJiYiIiIiIiIiIiIiIiIiIh4eHh4eHh4eFgHp5fXt7e3p8fHx8fX9/fn59fX9/f39+fn+Af4B/f3+Af4B/gIKEh4aGhoWFhYWFhYWFhYSEi4uOj46Mi4+Ih4mJjI2FhY6NiomMjYuOioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJioqKioqKioqJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4iIiIiIiIiIiIiIiIiIiIiIh4eHh4eHh4eHh4aGh4eHh4R+eXl9enp6e317fH1+fn9+fn19f39/f31+f39/gH9/f39/f3+AgoSGhYaFhYWFhYWFhYSEhISLi4yOjIyNi4eJiIqJhoKIjY6IiouRk4+LiYmJiYmJiYmJiYmJiImJiYmJiYmJiYmJioqKiomJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYiIiIiIiIiHh4eHh4eHiIiIiIiIiIiIiIeHh4eHh4aGhoeGhoaGhoaGhoeHg316eXt6eXp8fHt9fn5+f35+fX5/f35/fn5/gICAgH9+f39/f4CChIaFhYWFhYWEhISEhISEhIqKjo2JiIiKioeIh4qJiIqIiIeKhouRj4qJiYmJiYmIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiYmJiIiIiIiIiIiIh4eIiIeHh4eHh4eHh4eHh4eHh4eHh4eHh4aGhoaGhoaGhoaGhoaGhoeCfHl5enl6e3t7e31+fn5+fn5+fYB/f39/f3+AgIB/f35/f4CAgIKEhoWFhYSEhISEhISEhISEiouQj4mJiYuKh4eFh4mLiomEi42Jjo2KiYmJiYiIiIiIiIiIiIiIiImJiYmJiYmJiYmJiYmJiYmJiYiIiIiJiYmJiYmIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoF7eHp6eHt8e3t8fn5/fn5+fn19f39/f39/gH+Af39/f39/gH+AgoSGhYWEhISEhISEhISEhISPkI+PiImLiIaHiImLi4yLiYqKjYqOjo+IiYiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoWFhYWFhYaGgHt4eXl4eHp6fH19fn9+fn5+fX5/f39/f4CAf4CAgH9/f4CAf4GCg4aIhoiGg4SEhISDg4ODg5KSjoqHiouKi4eLjYmKiYuIh4qLiIqPkoqIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhoZ/enl4eHh5eXl8fX5+f35+f359fn9+f39/gH9/f3+AgIB/gIB/gYKDh46Pj46Ih4SFhYaGhYWFkpCOiomJiIiJioqIiIeGioyIh4mJjpCRjYeIiIiIiIiIiIiIiIiIiIiIiIeIiIiIiIiIiIiIiIiIiIiIiIiIiIeHh4eHh4eHh4eHh4eHh4eHh4eGhoeHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYWFhYWFhYWFhn95eHd3d3l6eXt8fX5/fn9+fn5+fn9+fn5/gH+AgICAgH9/gH+BgYOHjo6Ojo6OjI6Njo2NjI2QkI6Jh4aIiYmHiIqLiImMiYmGio2Oj5GLiIiIiIiHh4eHiIiIiIiIh4eHh4eIiIiIiIiIiIiIiIiIiIiHh4eHh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhYWFhYWFhYWFhYWGfnl3eXd3enl5fHt9f35+f35+fn5+fn5/fn9/f35/gH9/f39/foCBhIiOjo6Ojo6Ojo6Ojo6NjZCRjouNiYyIiImGh4mGiIqIh4uMi46QkIiHiImJiYiHh4eIiImJiIeHh4eIiImIiIiIiIeIiIiIh4eHh4eHh4eHh4eHh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaFhYaGhYWGhYaFhoWEhISFhYaGhYSFhYV+eXd5dnh5eHt8e35+fn5+fn5+fn5+fn9/fn9/fn9/f39+f39/gIGDho2Njo6Ojo2OjY2Ojo2NkI+NjYuOioaIioSEi4mHg4WEg4uJi4+NiYyOkJCPjY2Mi42Oj4+NjYyNjY+Pj46OjI2MjI2NiomIh4iJh4eGh4eHh4eGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaGhoaHh4mKioiHiYuMjY6Ni4iJi4uNjo2MiYiJjIB5d3d2enl4e3t7fX5+fn5+fn5+fn5+f39/fn5+f3+Af3+Af3+AgYOGjI2NjY2NjY2NkI+Pj4+OjYyOiomLjIyHhYmNi4eGiIeGh4eLjY6Oj4+Pj46Pj4+Pj4+Pj4+Pj4+Pjo6Pj4+Pj4+Pj4+Pjo+Ojo+OjIuLiYeHh4eGiIaGhoaGhoaGhoaHi4mHh4iIi42NjIuMi42Njo6Pjo6Oj4+Ojo6Ojo6Ojo6OjY6OjY2NgHh2eHh6eHp8enx+fn5+fn5+fn5+fn9/f35+fX5/f39/f4B/f4CBg4aMjIyMjI2PkJKTk5OSko2MjIyKh4qMioeHiYmFgoqLiImFiY6QjY6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6OjYyNjYyNi4mGh4eHh4mKi42OjY2MjY2Ojo2Njo2NjY2NjY2NjY2NjY2NjoyMjY+Qjo2NjIyMi4t9d3V3eXp6e3t6fn5+fn5+fn9+fn5+f39/fn59fn9/f4CAgH9/gIGDhY+SkZCRkpOTk5OTk5KSi4uLi4qJjIqLi4mLioaHjo2IiIyOjoyLjIyMjY+OjY6Ojo6NjY2NjI2NjYyMjIyMjIyMjI2NjY2MjIyNjY2MjIyNjYyMjYyMjIuMjIuMjIyNjIyMjIyMjIyMjIyMi4uLi4uMjY2OkpOTkpKUkZCTlZWUk5OQjo6Ojnt2dnd4enp7e3t9fn5+fn5+f35+fn5+f39+fn5/f39/f4CAf3+AgYKEjZKSk5KTkpKTk5GSkpKKiYqMiYuKiYyLioqIh4mKiouJio2NjI+OjY+SlJSTlJSTk5KRkpCPjo6NjY2Nj5KPjpGRjoyLioqKi4uKiouQj46MjIyKioqKioqKioqLioqKiouMi4uLjIyMioqLi4uOkZKTk5OUlJOUk5OUlJSTk5OSkpKSkpORenV2dnh7e3t6en1+fn5+fn5+fn5+fn1+f35+fn9+f39/gH9/f4CBgoSLkZGRkZGSkpKRkZKRkYmJiIiKjImIiYmLiYaEiYaMioeMkpKSk5OTlJWVlpWVlJOTlJSUlJOUlJSUlZWVlZWVlJSTk5GPkJGSkI6MkZWVlZOSko6PkI2KiouKiouNjo2OkZKQkZKSkpKRkZKSkpOTk5OTk5OTk5OTk5KTkpKSkpKSkpKSko94dXd5ent7e3p7fX19fX5+f39+fn1+fn5+fn9/f39/f3+Af39/gIGChIuRkJCQkpKSkZGRkZGRiIiIiIuLiYOHi4uMjIiHh42MjZKUkpKTk5SVlpaWlZWUkpKTk5SUlJSVlZWWl5aWlpaVlJOUlJSUlZSUlJOTlZWVlJOSk5OTk5CRkpGRkpOTk5OSkpKTkpKSkpKSkpKSkpKSkpOTk5OUlJOTkpKTk5KSkpKRkZGRj3Zyd3p6e3t7fH1+fX19fn5/fn5/fn5+fn5+gH9/f39/gH9/gH+AgYKEipCQkZGRkZGQkJCQkJCHh4eHiIiIhYuPioyOjY6PjpCVlJOTk5OUlJWVlZSUlZOSkpOSk5WUlJWWlpaWlpaWlpaUk5OTk5OTlJSTkpOUlZWUk5KSkpKTk5OTk5OTk5OSkpKSkpKSkpKRkpKRkZGRkZGSk5SUlJSUk5KRkZGRkZGRkZGRkZGMdHN3enp7e3t8fX19fn1+fn9+fn5+fn5+fn5/f39/f35/f39/f3+Bg4SKkJCRkZCQkI+Pj4+Pj4eIiouMjY2Ljo+NjI6OkZKRkpOTkpKSkpOUlJSSkpOTk5OTkpKTlJOTk5OVlZWVlJWVlJOTk5OSkpOTlJOSk5SUlJOSkpKSkpOTk5KSkpKSkZGSkpKSkpKSkpKSkpGSkZGRkpKTk5SUlJOTkpGRkZGRkJCQkJGQkYpzdHZ6fHx6e318fX1+fX9+f39+fn5/fn99fn9/fn5+fX9/f4B/gIGCg4qQkJGRkI+Qj46Pj46Pjo+Pj4+Pj4+Pj5CNjo6QkZKSkpKSkZKSk5OTk5KRkpKSkZGSkpOTkpOTkpOUk5OTk5STkpOTk5OTk5OTkpOTk5KSkpKSkpKSkpKRkZGRkpGQkZGRkZKSkZGRkZKRkZGRkZKSkpKSkpKSkpKSkZCQkJCQkJCQkJCRhnN1dnt8fHt8fX19fn59f39+f35+f4B/fn1+f31+f35+f39/gH9/gYGBipCPj5CPj4+Pj4+Pj4+Pjo+Ojo+Pj4+QkIiNj5CRkZKSkpKTk5OTk5KSkpOSkpGRkZGSkpOSk5KRkZKSkpGSkpKSkpKSk5OSkZGSk5KRkZKSkpKSkZCQkJCRkZGRkJCRkpGRkZGRkpGRkZGRkZGRkpKSkpKSkpGQkZGQj4+Pj4+Pj4+Pj5F/cnR4fHx8e3x8fX1+fn5/fn5+f39/gIB/fX5+fn9/fn9/f3+AgH+BgYGKj4+Pj46Ojo6Pj4+Ojo6Ojo6Pj5CPj4+Pho6QkJCQkZGRkZGRkZGRkJCQkJGRkZGRkZGRkZGRkJCQkZGQkJCRkZGRkZGRkZCQkJGRkJCRkZGRkZCPj5CQkJCRkZCQkJCQkZCQkJCQkJGQkJCQkJCQkJGQkJCQj4+Pj46Pj4+Ojo6Pj4+Pj3hydnl8fXx6fXx9fX5+fn9+fn9/f3+AgH9/f39+f39+f39/f4CAf4GBgIqOjo6OjY2Njo6Ojo6OjY2Njo+Pj4+Pj46IkJGQj4+PkJCQkJCQkJCPj5CQkI+Pj4+QkJCQkJCQj4+Pj5CPj5CQkJCQkI+Pjo+PkJCPj5CQkJCQj46PkJCQj4+Pj4+Pj5CQkJCPj5CPkI+Pj5CPj5CQkJCPjpCPj4+Ojo6MjI2NjYyKg4mIc3N2eH1+fHl9fH19fn5+f31+f35/f4B/f3+Af39/f3+AgIB/gIB/gYGAiY2Njo6Ojo6Ojo2Njo6MjY2Ojo6Ojo6NjYiQkZCOjY6Ojo6Ojo6Oj46Ojo6Ojo6Oj46Ojo6Ojo6Ojo2Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Oj4+Ojo+Pj4+Pj4+Pj46Pj42NjI2MjY6Mi4uJiYmIhYWEg4KChIJ0eX16eHVya2VpbW9sZmZnZ3Bzc3d5fX55ent8fX1+fn5+fX5/f35/f39/f4CAf4B/gICBgICAf3+AgYCJjY2NjY2NjI2MjIyMjIuLi42MjIyMjIyMho+RkYyMjIyMjIyMjIyMjIyMjIyMjY2NjIyMjI2MjI2NjIyMjY2NjY2MjIyNjIqJiouLiYeCgIeIhIF7eoB+e318fH15c3JycnJ1dXBta2pqaWdjZGFfW1xdXlhVV1hZU0tFSUpKS0xNT09LYHR0d3l9fXh6eXt8fH1+fn59fn9/fn9+f3+AgIB/gICAgYGAgICAgICBgH+DhIWEhYiLi42MjIyLi4uMhomKioqKioeDjpCRjYqLi4uLjImJioqKioqLi4uHg4uKiImJhoWFhISHiYmFgoN/e3x5ent6c3BxcXFtbGpnbG1nZWZlZmRjZWRlZGVlZWVkZGRjYWFeXVxaWFhXVFBRUlNSU01NSklGREhKR0dIR0dMTklnc3V4eX16eHd5fHx8fH5+fn5/f35/f39+fn+AgICAf4CAgYCAgICAgYGBZ15gY2FjbnF9e3p7f313fHx2eHp7eHh6b3B7eHl7fHt4d3t/eHV3dHR2dXR2d3VxcnFucHJwZ2hrbG5vbWppaWhoZWVkZGRfYGFiYGBeXVlYWlpbXV1fYF9gX19fYGJhXl5eXllZXVxdW1dXVlJUUlNTTlFKSElGREVITExIRkdJS0pJTW1ydHh6e3p3d3l7ent8fn59fn9/fn9+f35+foCBgH9/gICBgICAgICAgoFnWFtaWVxbXGNcWlxeYGtxbXBwb25ub25raW5sa2xvamlra2lqa2lnZmdnZ2loZ21namdoZWhnYmNiYWJgYF1YW1tXWFdUVlFQVFNTTUpMS0xMTk5PVFhYV1VVVFJQUE1NUE9OS0xNUFFPTExKR0lJR0hISUhISEdGR0hKSkhISElJSElWcHN1eXp7eXZ2eXp6e3x+fX1+f39+f35+fn9/gIF/fn+Af4CAgICAgICBgWxbWFZWVllZWllZWFVWaGpsbm5sa2tqaGhpaGRlZGJcYmZfX2BjX1xfXWBdXlpeXVlZXmJhXl5aWV9cWFdTTk1MS0tLTElLTU5LSktLTEpLUExLS0ZHR0lJRkdJSElGRUhHRkZFREVFRERFSUlJR0hHSEZGS01LSUlJSEdIS01NS0xMTFVxc3Z5ent5dnd4d3p7fH59fn5/f39/fn9/gICBgH5+f3+BgH+AgICAf4GCaFJUVVZTVVdZWVlXV1dbW2FjX15cW1hWVllWUlRSUVFVVFNTU1BNSk1OUFJPTVBRUVFRUlZWUlBRVFBQTk5PTEpNTEtMSkpLS0ZJSUpMSUdKSElJRUdHRkZFRUhJSkdGR0ZGR0dISkdHSEhKTEpKS0lJSEpLS0pISktKSElLTE1PUFBLVHR0dXh6enh2dnd3ent8fn1+fn5+f39+fn5/gIGAf39/gIGAf4CAgIB/gIJpUFJUV1VUVllXWFhaW1RUU1JQUVNRUVFPTk5QUFFPTE5QT05OTUxLTU5OUE1PUFBSUVBOTk9PT05PT1BRT05OT05OUE5NTUtJSEhKSUlJSUdGR0dHSUpISUhISUhIR0hHSEhJSElMS0pJSEpKSUpKSEdKTEtKSUlISkpLTE5NTk1PUUxVc3Jzd3p5d3Z0dnh6e319fX5+fn5/fn5+foCAgYCAgH+BgYB/gICAgICAgWxPT05UWVVVXVtZV1dYTk1KSklGSk9MSkpHSUpNTUtKTE1KR0lJSUpLTEZERkpLS0tISkxMTE9NTExOT09PTU5PTE5OTlBQT0xNTE5NTExKSUhHSUhJSEhJSUtMS0tKSUtKSUpJSUlJSUdHSklHSUlKSk5NTkxISUpJSUpNT09NS09STllwcHJ3eHd3dHR0d3p8fn1+fn5+fn5+fn5/f4CBgICAgIGAgH9/f4CAgICBb0tKTU5RTk5VV1ZWUlNJRUNFRVJEREE+Qj9EQEA+QkRBQEFER0ZFSEVCQUBAQ0NERUFDRUhLT0tJSUpIR0pJSklJS0pMUE5NTE1NTE1NTUxJSERGRkdGRkZJSklJS0pITEpJSkpKSUhISktLSEZHSUpJS01OTkpLT01MS01NT09OUE9QYHBvcnd4dnRyc3V3en19fX5+fn5/fn59f4CAgICAgH+AgICAf39/gICAgIFzUFBOTlBNSktQUlBOUUNEQkFFUUU9Qz0/RUg5Ojs9Pz08QUZAPjo8Pj48RUQ9P0VBP0BBQERFR0dHR0JEREVGRUdHR0dKR0hKS0dDREdKR0NERUFBQ0dIR0hHSEpLSkhJTEtJSEpLS01OTE1MTEpKTEtJS01PT1BTUU9QUE5PUFJRTVBncG9zdnV0cnF0eHl9fX19fn5+fn+Afn6AgIB/f4CAf3+AgIB/gH+Af4CAgnZUVVFRUE9MTVBQTk9PQUFBQEJBPzs+PD4/Pzw4OTg7OzpAOjs+PDs7PDxITD09QUE/QkM9QURERkJGRkRHSUhDP0BAQEFBQkFBPz48PT5BQEA/Pj9ARUdHR0lLTE5NTk1MTU1KS01QVVNOTE5RTk5NTkxNTU5PTk5NS0tOTk5NTk5MVG5wcHJ0dHNxcnZ5eX19fX59fn5+f4B+foCAgICAgIB/f4CAgIB/f4B/gYCCeFFRUlRSU1FTU1FRUk9AQD0+Pzw/PkBBPz0+OTs6Ojs4ODo4Nzo8OTc4Ozs+PTs7Ojg6QEBBQj9BP0NGREJDQz87Pj5AQ0NBPz4/QT5AQEI/QDw/QkBBQ0VFRUpLUE9QT01NTkxMTE9SUVBSTkxMT01LTk9MTExLTEtLSktLSk1NS0tccXFxdHN1c3F0eHh6fX59fn5+fn9/f35+f4CBgIB/gH+AgICAgH+AgH+AgIF8Uk1PUVBRUlJUUlNTTjw7PDs7PD9AQUJAPTw5PD08OTc5Ojo5ODg6Ojc4Ojk6Ozs4Nzg5Ozo4PDs9QEFAPTs7Pjw9PUBCQ0E/QUJBPT49PTs9P0NEQkA/QURCRUdKSkpKSkxNTExMTUxMTlVTS0xNVElQSklNSklKS0tKSUhHSktJSmZycXN0c3VycnZ5eXt9fn5+fn1/fn9/f39+gICAgH+Af4CAgICBf4GBf4GAgYBWTE5QUE5SUVBQUVFOOD0/PDw6PT5BQEE/Pj5APz49Ozw8Pj89PD07Ojw9PT08PDw8Ozw6Ozw+PT4/P0FAPj9BP0BAQUBAQD0/Pz08Ojs9PTw/QEFCQkFAQkRGRkZHRkdHSElLTExMS0xLSktJSkpNTExKTEtJSElMTEpJSUhJS0dNbXBxdXV1dXN1eHl5fH1+fn5+fn5+f4B/foCAf39/f4B/gIGAgIGAgYCAgYGAgmFLT09OTk9QT09QUE86PD48PTs/Pj5BQT89P0JDQ0A+PD0/QD8/PTs+PT5DRT8/QD07PT09PDs6PT5BQT8+QEA/QT8/PTw+PD07Ozw9PkFAP0A+QENDREJERUhFRUdISEhHRklKSUlJSUlISkpKSkxLSkpJSUhISkpLTEtJS0pKSFZwb3Fzc3R0dXl6e3t8fn9+fn5+fn9/f39/f39/gH+AgICAgH+BgYCAgICBgYCCbUxQUU5PUE5OT1BQTz48PD0+Pz9APkBAPz8/Q0VEPz07PEA+Ojs6Ojk3Ojw5PT1APTo8Ozs8Ozg5Oz8+PTw9OzxAPT08PD47PTw9PkFAQkFAQD9CRENERUZGRkNFR0hJSUhISUtLTE1KSklKTU1KS0pLSUhISEhKSUpLSkpOTElJX3BwcnJydHV2ent9fX1+f35+fn5+f39+f39+gICAf4CAgICAgIGBgICAgICBgIJ2TU5OTU5OTExOUE9MPkE8PD0/PkJDPz5BQUFCQUA9PD07Pj06Ojo8Ojg5ODg6Oz0/Pzw7Ozw7Ojo7Pj8/PTw4Oj48PT4/PTs+P0BCQ0JCQ0NBQkJBQkJEQkJEQkRDRklHRkVISUlLTUpJSkpLTEpKSUpFRElJRkZISElKSkxKRkZncG9xcXR2dnd7fHx9fH5+fX19fn5/f36Afn5/gIB/gICAgICAgYGAgICAgICAgXpOSUtLTExMRUlMTk08Pzw8PT5AQEFBO0JDQkNAPz8/QD0/Pz48PkA/PT09Pz09PkNEPzs8PT5APT0+QUNAPDk7QT8+PkE9Oz9CQEJDQkBDQ0FDQT09PkA9P0FBQUBDRUVAQENCQ0dHRURDRkVGRkdFREBBR0dGQ0ZER0hKR0M+SGxwcHBxdHV2eXx8fXx8f359fn5+fn5+fn9+gH9/gICAgICAgICBgH+AgH+AgYCBflFIS01NTUtKS0xPUUA/Pj5BQUBAQUdBQ0RDREE/QEBAPz1APjw9Pz9AQEBDQEA/QEA+PTw9QEVBQkJGSEM9PEBEQ0FBPz49QEE+Pj4/PD5AREdFQD5AQT9AQ0ZFQ0JCQ0BCRERCREVBQj5BQkJBQkBAPUFCQ0RDQ0FDRUdBPz1WcHBxcHJ1dXd6fHx8fH1/fn19fX19fn1+fn5/f36Af3+AgICAgIGAgICAf4CBgIF+UkhLTU1MS0tOTlJVREJAQ0NBQUJAQkNAQEFBQEFAPjs+PD89PDo+PT9CQkRAPz9OYV9KQENFSUlJSU1NS0VDRkdIRUdFRUVERENBP0A+PkJGSkpHREVHRkZKTk5LSklHR0hLTEpHR0NERERFREFCQkNAQ0RFRERFREVGQ0JBRWVvcHFxdHZ1eHt8enx8fn99fX19fX5+fX+Af39/f39/foCBgX+AgYCAgIB/gICAgH1SSUlKSkhKSkxPUlNHRkVHSERHSERAPjw7PkBERUQ/PEFDREI/PUE/QURFRENXdYaJin5YR0hKTExNT09MSEdIR0hJSUhIR0dISEVDRUVFRUZISkpGRUdJSk1PT01NS0pLSk1OS0lIR0hJSEdGRUZGRkRGSEdFRUhIRkhHSEZRbm5wcXJ2dnl7e3t6fX1+f319fX19fn59f39/f35+f4B/gIGBgICAgICAgH+BgYCAfFBIR0hJRkdJSk1OTkpMSUlKS0xOSkZDQUJDRklISUdISElHRkJERkREQ0FVdIeJh4eGiIJXSUxNTE1OTEpHR0dHREdHR0dGSEZIRUNEREZFRERISENDQ0ZKSktMTExMTExJSktKSklJSUhKSEhHSElIR0dIRkZGSEpJSUlJSF1vb3FydHd3ent7ent+fX5+fX19fX1+fn2Af39/fn5/gYCBgIGAgICAgICAf4CAgIB8TUdGSEZFRkdHSktKTE1MS01OTU9LSUhISktLS0tKS01KS0hIRkZHRkVQbISHhoaGh4eHh3xQS0xLSEdGRkRFQ0NAQUNDQ0NGRkVCQD4+QEFBQEJEPz8/REZHREVHSUtJSUdISUdJSUpKSUhGSkpKSklKSUpKSkZJTExKSktLZm9wc3N0dnh5e3t7fHx9f359fX19fX5+fX9/f39+f3+AgICAgIGAgICBgICAgICAgH1PRkZHRkdIR0VGR0dNTU1LTEtJR0NDQ0RJS0tLS0tLTUxLTUxJRkpVbIGGhYSEhoaGh4iGinVJSUZCPz9APz8/PDw8Pjo6PEFBQD48OTk4PDw9Oz47OTs/QUJBQUNDQ0BBQkVEQkNGSElISEhMTUxHSUpNTU5NSkpLS0pMTVNsb3F0c3N3eXt7e3x9fX5/fn19fX19fn5+f36Af35/f4CAgYCBgYCAgIGAgICAf39/flFGRUZHSUlHRENFRk5NTEpJSEU/OTo+QEVIR0lIS0xPTk5RTlFecoGFhISFhYaHh4iIiYmMjmZCQj04ODo6OTg3ODg5NjQ3OTs8Ojg1Njc3ODk3ODc2ODk7PDw+QTs5OTk9PT47Oz1BREVISk1MTEdJSE9SUVBQTkxNTU9RXW9wcnRzdXh6e3t8fH5+fn9+fX1+fX1+fn9/f4B/f3+AgICAgIGAgICAgICAgICAf39/UUdGR0hKSEZFRkdITExKSUlHQ0I1Njo8Q0BCRkhLSExLTlRne4SEg4KDhIaJiouLi4qJiouMiVQ7ODY1Njc2NjY0NTc2MzQ2ODo4NzY1NjU2Nzc3Nzg6Nzc4ODo7NzY4ODk4OTg3Njo8QEdGSUZJRkVGT1NSU1NST1BQUlRlcHFzdHR3eXt8e3x9fn9+f359fX19fX9/f39/gH5/gICAgICAgYCAgICAgICAgIB/f35SSEhISUtJR0lKSUpKS0RFSERCQDU3ODg9OjxEQkRGRkRWeISEgoKDg4WJioqJiYqKioqLiYqKgUg2NzY0Njg4NzQ1Nzg0Njc3OTk3NzY3NjU6Ojs6Ojw4OTk5OTg3Nzo6Ojg4Nzg1ODk7QT0+PkJBP0FLTE9RUFFPT1BRV2txcnR0dXd6e3t7fX1+f35/fn19fX1+f3+Afn5/f3+AgIB/f4CAgICAgIB/gICAgH9/flRIR0lJTE1LSktLTElIP0BBPzw6NTc5ODk3OkE5PEQ/UH2Eg4OEhISGiYqKiIeIiIiKioyKiYmNej46ODg7PD0+OTo7PDg5Ozk6Ozo6OTs6Oj49PT87Ozs9Oj48Ojw7PDw9Ozo6PDg6Ojs6OTk5PD88PUFCRElKTEtKS0xXb3JzdXR2eHt7e3x7fX9/fn9+fX19fX5/f39+f39/f39/gX+AgICAgICAgH+AgIB/gH9+VEZFRklMTk5MSkpNQj87Ozw6ODk5ODk5OTk6Pj0/P0N2hIOEhYWGiImIh4aGhoiJiImLjIuJioqMbDw7PkJDRUVCQUFCPkBDQUA/PT4+QD8/P0A/QD09P0I/QUE/QT89QUFAPz9BPD48Ozo7Ojk7Pz06Oz09QUFDQUJDQVhwcXR0dHZ5e3t8fXt9f35/f359fX1+fn9+fn5/fn+Af3+AgICAf4CBgH9/f4CAgH9/f35SRUNBR0pOT0xJR0s6ODk7OTo6PDw6Ojo8Oz0+QD89YYWDhISFhYaJiYiHhoaGh4iJiouLioqKi4mLXj5ER0lLSkpGR0dERkhHRUNAQENFQ0NBQkNCP0BESEVDRURFRUFGRUZERkZEQEI+PUA+PT9APj4+Pz4/Pj46Oz08YHFydHR1d3p6en19fX5+fn9/fn19fX1+f35+fn5+f4B/f4CAgICAgICAgH+AgICAf3+AflBEQD1DSE9NR0ZCRDk3OT06PDs+PT4+Oz48Pz9DPkp+g4SFhoaGiImIiIeGhoaHiYqKi4yNjIyLioqHV0dMTE1LTklJS0hJSkpJRUNERkdGRENGR0VCSElLR0hHRkdHRUtKTElKS0pDRkNDREJBQUNCRENDRERDQT07PUBocHN0dHZ3enh7fHx9fX5+f39+fX19fn5/fn5+fX5/gH9/gIB/f4CAgICAgICAgH9/gIB/T0E+PT9ETEtAQkJBOTc7Pjs8Oj0/Pj88Pz5CQUU/aISChYWHh4iIiYiIh4aGhoiIiImKjI2MjIuLiox/UE1QTUtOS0pMSUlKSEtGREdISElFRUlHRkVMTE1JSkdHSElKTk1PTUxOS0hGR0dFRUNGRkZGREVISEZDQT9ATG1wdHV2eHl5eXx8fH19fn5/f359fX19f39+fn5+fn9/f39/f39/gICAgICAf4CAgICAgH9RQT8+P0ZHRz08QEA4Nzw6Ozw6PT88PT0/QENCSFN+g4SEhYaHh4iIiIiIiIeHiIiIiYqMjYyMjIyLio1xTVFPTUxMTExJSEhGSklESkhHS0pJSkhIR0tMTkxMSEhJSk1QTk9OTU9LSUdJSkhJRElISEZGR0dJRkNCQUNVb3F1d3h5e3h5enp8fH1+fn9/fn59fn1+fn5+f39+gH9/f39/gH+AgICAgICAgICAgH9/f1REQUFCR0dCPzg/QDg6Ozc8PTo8Pzw9PUBCQ0RMbYSDhISFhYaHiIiIiIiHhoiIiIiIiYyMi4yMjIuLi4teUlJQTU5NS0pHRkNISkdMSkdLT0xLS0pMTUxPUE5ISUtMT1FRUFFPT0pJSkpNS0xGR0hHRkdJRkVFQkBCQlxwcnd4eXp5eXl7ent8fn5+f35+fX19fX5/fn5/fn+AgICAf39/f4CAgICAgICAgICAfn9/VUVDRUVHR0VEOz9BOz08OD89PT5ARUQ+Q0RDRkp1hoODg4SEhoiIiIiIiIeHiIiIiIiKi4uLjIyMjIuLjXxXVlJSVFJPTEtLRUZGS09OT1dWUVBPUlNSTVNUT01TTFBTVVdSU1JQTEpNTU1MTkdHSkZGSEpEREVFQkRDY3F1eXl6enp7ent6enx+fX1/fn19fX18fX5+f4B/f4CAgH9/f39/gYGAgH9/f4CAf39/f39VRkZHR0dHSEY+QEI9Pz08QT9BQURUS0JISUZJTHmGg4WFhIWHiIiIiIiIiIiIiIiIiYqLioqMjIyMjouLi2dWVmthRVJRUVBLOzpRU1JgdV1VVlRWWVlSWFhSWmZQVVdaXVJUV1FQTlJQUFFRS0tLR0hKSEVGSUlJSElqc3Z5eXp5ent7fHp7fH18fX9+fX19fX19fn9/f39/gICAf39/f3+AgICAf39/gIB/f39+flRISklJR0ZGRT8/QUBFQUNGRENES1ZQSlBQTk9QeYaFh4aFhoeIiIiIiIiIiIiIiIiJiJScjIqKjH1hiouLh2xbZFU6WFhYU1E+QFZVWVxkYFZZYnJeXVZdWlZFUVlaXFlfVFlnUlVWWFRUVlNPT01LTEpJSUxNS09NVHB0dnh5eHd5eXp7ent8fXx+f359fn19fX59f39/fn+AgIB/f39/gICAgIB/f4B/gH5/fn5+VkpKSUhHRkREQkE/SExJTVBLSUpPU1JRVFZVVlR1hYSFhYWFhoeIh4iIiIiIiIiIiIiJnJ2gj4mOZzt+jImKi3pucFhaW1pSU1JWVlRaWnWDWVV9kGFcWF1eV0lWXl5bW19ZSFlYWVxdWFhZV1JRTVBRTU1PU1FRVVJidHN2d3d2eHh4ent7fH19fX9/fn1+fX19fn5/f4B/f4CAf39/gH9/gICAgH9/f4CAf4B4eX1ZTktKSUlGQkRAQTpPUVFXWFBQUFFSU1JWV1dXV2yBgoOFhIWGh4eHh4eIiIiIiIiIiIiWmpyXiIqBboaJiIeDin5mWVlcWVNWVFdSUVdWY5aAUWVyWFpXX2hQYGZaWlhcaGJHT1ppZ1xbXF1dV1NOU1BQUVZWVlZZWm9zdHd2dnR3eHh7e3x9fX1+f35+fX59fH5/f39/gH9/f4B/gIB/f4CAgYGAf4B9cn1/f290fF1TUE9NS0pFQz9AO1BQWlpaUlNRT1FSUVVSVVNWXnV4gIWEhIWGhoaGh4eHh4iIiIeHiIeDkY6JiYiGhYiIhn2Ae1xQVlhUUlRSUVFMT01LZnlaXVRZVVZdWkxUWlVTVF5aWVdXV3prWFpcXF5TUFBPSU5PV1ZYWlplcXR3dnR0dnh5eXt7fH19fX5/fX59fn19fn9/f3+AgH9/gH5+enh3dnN1e39/gIB0a35+a3J5XltWVVNST0tGQ0RBTV6DbFZSU09PUU9RVlFTUlJUY2R2gIOCg4SEhISFhYSEg4aGhoaHiIZ+iYmIh4aDh4eHeW1xVklLTk5LTUtISkRGSEVDPlNjVX9SUVFOS1JVUk1PWVJOT1FTVVVNUVNSUE5MS0hDSUdSU1RZXW1ydnd1dHR3e3p6e3t9e319fX59fX1+fX5/f39/f4B/fX1+fn9/f4CAfnt2c3d9fn5kdX1pcXRgZF1dW1lVUUxITElhbJJ0UFFTTVFSUFNbUlNSUVJVVWJze3x+gIGCgYF/fXt7gH+DgoWGh4KGhoaBhIGGhYZ1X11LQz5CQkNDQT9EUENDQEM+QkhHVkBITk1HXWlRSEZPRkVGRkhHSEJDSEdISkdEQUFDQE5QTVJkdHV2dXR0dnl8e3p7e3x9fXx7fn19fX5+f39/gICAf398fH1/gH9/f3+AgYB9dnR7f21ofGducWZpZWRiXFhTUVBVUnNXZVtPT05MUVJQVVlTVVFRVFJPVmBrbHN2ent4eXRybnN0c3l4fn6DgIODgoCCgIKBgWtMRz4+Ojo+QD8+Pj5qUEthRUZISUVCP0dMTUdNUVVKQkU/Pz09PD09Pz0/QUNCPz48PUI+SU1GVW91dXZzdHZ4e3x6fHt8fX19fXx+fX18fn5/f3+Af39/f3p5d3h3dnZ4e36Afn17eHZ8dWF4Z2xwamxqaWZgW1FRWlxZXklKT1BOS0xRUlFUVlVXUVFXVlBYW2JdYWdtbWxuamhgbnJpbWxxdXt6fXt4enx8eHd4ZEJAQEE8OkJDQUFDQVtcT3tOT09OS0xNT09QTEtMV05JR0FBPDk3NzU5OT07Ozs4OTg5PztBRz5cdHV1dnV2d3l8fHx9fHx9fH59fH19fX1/f39/f35/f399eHV3ent6d3l4dXd7fHl4dXl3Y3FoaXBtbm1taGZeT09eXFpJR09RUU9NUFFOUVJUVlhTUllUTllaW1dZXF9eX2VfXV5xd2teYGdrd29vbGpvbW5sZmJZR0ZGSEJBRkhFRUZDTFFPYVdSWFFQU1NSVVtPT1FWUE1JREY+OTk2NTg2OTc5OjM2NTc5NTxCPWZ0dXd4d3p5e319fHx7fH19fn57fX59fX9/f35+fn5/f3t3dXl9fHp4fHx8fHR3dnd2dXdrbmlocW5vb29qa2BVV15aV01LU1RTUFFVT0xSU1RXWFNUWFFMWFlZVlhYVlhZXVdYWGhza11WYHRrYWFfXWRgX15ZVVBNT05MSUdKS0lIRUNQT1NaV1RUTlFTWVNcZVVPU1RRTktJSEM/QTk5ODg5Nzg4NDc1Nzg1OTlHbnJ1eXl6e3t9fX19fHt9fX1+fnp9fnx9f39+fX5+fX9+fHR0dXt4cnFvb250eHFyc3h2dXFmZGdybnBwcW5tZF1fX1lXT1BXVlZTVFZPT1VWV1hZU1VUTEtTVVVVVVdQVFVXVFVSXW5eUk5ZYFtWWTtEVVdTW2ZKTFBSUk9NTU5NTUxKRVBQVVlTVE9KTk9VU1NcVlJVU1JOTUxJSEhGPz89Ojc4NzY1OTk2NzY2NVhxcXR4enp7fH19fX58fH18fn19eX19fH5+fn18fH19fn18cnZxeHhydXVxcW5wcG9wdXZ0bmpkZGpwcHFycG5mZWRjXF5SVFpWV1RTVlRSWFdZWVlSVU9JR09QT09NUkpPUE9PTk5PVExNSVBQU1RVMjxYTUlAUT1jYFFTUVBNUFBPTk1MUE5UUlBSTElMS09SUFFSUlRRUk9MTUtMTEhDQkE9Ojk4NzY7QjQ1NjY7ZXBydnh5e3x8fX58fXx9fX19fHt4fHp7fX1+fHt5fXx9fHtwdW93dXB1dG9zdnBxcXB1dXZjamdlV2h0cnJxbmlpaHBWVlRVWFVWVVJXVlVaWVhXVlFTRkZBRkdHSEZKREhKSEdFSExIS0lHTE1QTUcvRV9SPjRAPmpvYVJSUUBHVFBPUE9RTlFPUE9MSkxMT1BOTVBRUU5RT0pMTU1LR0VFQ0I7PT08OT1HNjY3NkVucXV3ent7fH19fHp8fH1+fn17eXZ4d3l5fH16enZ9e3x6em9xbndycHZxbXBzcG9wc3NzdGZnYGhaV2tyc3JsbW1rbmJlUFNUUlNVT1dWVVlZVlFRUU9APjs9P0BCQUM/QkVEQUBHSEdIRkZISk1MREdDT1JDOEVNU11nU1FTQUdVT09RUFBNTU5MSkxLTE5PT1FMT05NSUxLSUtLTEtHRkZFRDxBQT47QEU7PDg5VHJzdXl7e3t8fHx7eXx6en5+fHt1dHVydnZ6enh6cnx7fHl5bXFveHJxdW5ucXJvb290c3NydXRrZ2deZWptcGtvcW1pbWNMT05NUVNMVFVUV1dVTExLSD05ODc7P0E/PD1BQEI9PUVIRkRGRklHSkpARkFBQEZHRElPSFFSYVxRUFJPU09PT0xNT01LTUxNT05bVktNUU9HSUhDSUtMTEtGRkZFP0JEPj1CRz9CP0BkcnV3e3p7e3x7enp3fHd5fn57e3FzdHByc3d0eHhzent5dndscW92cXR0bG9xcm5ub3N2cnRzcnJrbGVuc2htbm1sbWxqa0lMSEhPUUpRU1FUU09LSENFPTk4Nzk/Qj87PkFAQD5BRUpFQ0hHSUdJRUJCPz48QkFAR0pFTU9iZVBNT01WS0xOS0xNTUxMS05OU2RNSkxSSUlJRkJKS0xNTkpHSUZCQkJAP0VGRUhETG9wdnp5eXp7enx6d3N4dHh8fHl6bnFxbW5vcnJ2cnN4fHh2dm1wbXNwdXRscHByb29vcnZ1clZWbnFnbHmEam1xcm5uamhvSEpDR0xMSU1QTVBPSEtFP0I9OTk6Oj9CPzxBQkFBREVHS0ZESUlHR0hDQz9CPj9AQT1DRURMTVFUTEpJTVRGSUlKTElKS0lJTE1PUFJQS0dDS0hDQ0tKTE5PTklKSUdEQ0NESUpNTElac254eXh6ent5fHZycHVydHl5dnhqcW9rbGxudHRtc3Z7c3R4cm9ucW92c25wb3Jwb3BzdHlqTmBnc2p0fHlnb3NxanFoZXFIS0NGR0hHSktJSkxER0I8Pj06Ojo7QUI/PUJCQ0NIRUpMSkVJSUZHSENDO0FAQj5AP0JERElNT0dISkdIS0RISUtNSEpMSElKTEpNXVJISUROR0JFTEtOTlBOS01KS0ZHR0pNTlJOTWNuand2d3t5e3p9cW1sc2twdHR0dWhwbWppa2t0cG50dHlwcnp0b3Jxb3dzb3FwdHJwcnV0eWtOVm11bHF7dmlub2lrdGhlcEZKQ0ZFRkRFRUZFR0NDQD08PTo7OjtBREA/QkNFRUlGSkpMRklJR0ZGREI6QUNDPj9DQ0NFR0tNSEpOSERIRUlMTk1ISUxHRkZJSUxOS0lIRU9JQ0dOTU9NUE5OT01LSUhJT1NRUk5TZ2dmcm9zeHZ7enxsaGpvZWtwbXNxZ25saGlrbHRtb3V0d3FveHRvdHNydnNwcXJ0c3J0dXV2dlhWdXVrb3Rya292bGhtZl9wR0pDRUVEQkJBRUBEQj4/Pjs7Oz47PT9DQj9BQ0ZHSkdKSUxIR0dHRkVDPz1ERUI+QUNCQ0VHSElHTVBJRUZHS05PS0ZISUZFQ0RJSUhLSUdIUEtESk5MUE5PTk9QT0pKSU1SVVVST1hlYWFtZnByb3J5emdlaGhjaWxmcWxmbG1naWtsc21wd3V0cG52cm9zcnN1dHFzc3V0c3V2dnZ5dnV0dmxrdXVtcnZxbG5sZXJNR0VFRkJBQEFEPEJBPkE9Ojo9Pzs+P0FCP0BCRUdKRkpHSUdGRkZEQ0JBQUVGQ0JCQkRFRUdHSEZMUExITkpKTEtJRkhFRkVDQ0hISEtKR0tSTkNPT05RUE9PTk9QS0tLUFVXVlVUWWBfXWlhbmluaHJzYmVmZmRoaGZuaWZtbWhra21yaXF2dXNxbXZub3Fyc3dzcnN0dXZ2dnZ3dnd2dnR3dWtzdW51dHNxc2trc01HR0VHQUJAREU8QUFAQzw4Oj0+OkA9QENAQEFERklFSEZGSEZFRURDRUJESUZDR0VBRUdFRkZHRUlNS0hRTUpLSEhJRUZISEVDSUlJS01LUFNORFJTUlFTTlBNT1BNTE5TV1ZYWVdZXltdZGBpY2ppZ2tfZGVmY2hnZ2tnZ2tta21scHFndHR1cnNudm9xcHJ0eHFzc3V2dYKReXZ2dHh1dXd4bm91b3JzdXFxaXB6TUdHR0hCQkJFRTxAQ0JEPDc6Pj47PjtAQj4/P0NFR0RGRERHRUNFQ0RGRkZKRUVJR0JHSEZHRkVDRkpKR01KTEtISktGSUhKSEVLS0xMTk9SVE9IVFVUUVRQUk1OUk9NUVdaVlpZV1teWlhhYGBgXmhlY2BkZWdnamhoamdobmxsb21xcGl1dXhycnB1cHBwcnV2cHVzdXZ1e359eHZ0d3Z2dndwbHVwbXN1bm9zc3lNSEhHSURCQ0hFPUBFQkQ9ODo+Pj08PEJCPUA+QUJGQ0VDQ0dDQ0RERkdHR0lGSEtIQ0lIR0lHRkRIS0lHSkhNS0pLTEhLSk1LSU5MT05PUlVWT0xWVlRRVFJSTE9RUE9UWlpZXFpaXWBfXV9jX1xiZGxjYGRnaHKFaGdqZmpubnBvbnNxanR1eHJzc3RybnBxdnJxdXJ1dXN+eY59dXV2dnZ2eHJpdXFrcnRscXdxdUxJSkhKRkJER0U9QUdEREA6PD5APz4/Q0I8QD5BQUZDRURER0RFREZGSEhGSEdJS0pFSkhIS0hFRkxISEhKR0xLTExMSU1KTU5NT0xQUFJVVldPS1ZWVVNTUlFMT1JSUVZbW11eW11eYF9hYGJmXWRgZmhgZWlqZHNzZmpoZ2xwcnFvc3Nuc3d3cHV2dHNtb3J1b3JzcHVydnJ0gXZ1dXV3dnV3c2d0cmtxcmtyd3B3SkpLSUtHQkVERTxBRkREQjs/P0FAQEFEQUBCPkFDSEJFREZHRUhERkVJSEZJSEpNSEhKSklMSkVKS0hJSkpHS0pMTElJTUtNTk5PTE9RUlVXVk1OVFZVU1JRUE1OVFNSV1teXl9dXmBgYWFiYGRkZWJkaWJkaWpndotsa2lnbW9zcXBxcHByeXdydXV0c21tc3NtcXJvdHV1c3Bzd3R1dXd2dXV1ZnFza3BxanJ2cHdKTExLTEdDQ0FFPEBFRURDPUFBQ0JCQ0VBQ0RBQUVHQ0dHSEZFSUVDR0lHR0pGSUxISUpNS01MRktJSEtLTlFLUlBMUkxKTU1OUFBQVU9XWFhbTlNRV1xaU1ZQTlRVVFRYWl9iYl9kYV5hY19hZmNhYmhuaGJpaGhteHZtaGlub3NycHFycnJ2dHN1c3NzbmtzcW1wcm90dnNxcXV2dXN3eXd1dHVjbXRrb3BqcXRxd0xNS0xMR0RBQEQ+PkRFRkM/Q0FFRERGQ0JFR0NCSEZCSElJR0hKRkRLSkdISkhJS0dKSk5LTkxJTEhLTEpaZkpkW0psUkdOTV9uVWxzW3FwYndjUlBidnVodWNhdmFYbnFiZHZpbXpmXGx0YGxrVmB3dmlqZ2hmZ2xtam1vam1vc3JwcnJxcnNyc3NydHJubHRvbnBxcXV1cnFzdHZ2dXV5d3V0dGBrdGtwcGtxc3J5TE5KSkpGQj9AQz88RERGRENDQ0VFREZCRUZHRERKRUVJS0tJS0xHR05KSEpLR0tKSUpKTkxNTUxMSU1NTFtzYmRvXWxsVUxOZXJdZ2VxbG50Z3BpX2FZbm1icHBia2pqZ29xdGV0bm9ccHZncE9Mcnl2a2Fha2VlbHhta3Zsbm9zcnBycXBxcnFycnJ0cm1tc25ub3BydXRxc3N0dXV1dHd5dnR0Ym11a3BwbHJycntLTElIR0VEP0FBPz1CRUZCRUNFREVFREJISEdEREtIR0tNTUpMTEZKTkhKS0pJS0pKSUpNTU5NTU1LTk1NW3Jwb25wcGtqTE9QbVhOaWJ0cnBhbW92XFlsUFttbVpxbWtwbHh4dHNpcF1gc2xxa1V1eXhvY15rZmJncHBqaW9wcHNzcHFwcXFycnFxcnJ0bG1ybW1ub3J1dHF0cnR1dXR1dXp2dXRlbnVrcG9sc3JyeUpLR0dFRURCQUI9Pz9FR0JHREhFRURCRklISEVHS0pHTUxOSkxNR0xOSU1LSElNSUpJSkpOT05OTUxOTUxcaGR1XWxxVmtNT1FuVVprXmtsdmFsZHRUZWNObFlsXHRvbGpseGp3dWhvXWBza2hXYmN3fG9jYGdoYWNpdHlrbm5xc3NwcXBxcHJxcHBwcnVrbXFtbW1vcXN0cnNydHZ2c3d2enZ1dGhvdWxzb21zcnR2SU1GSUVFRENBQjxCQEJGQ0dGS0dFQ0NISkhIRklMS0ZNS0tSUkxITU1JTkpJR01HSkpISU5PTU5MSk1NSlp0cHBvcXFsak9RUm5Zc2tnb29xcW9tdF5uWGF0X25vcG9xc29vdXN0dGpbXnRjd3hyam56aGFhY2ZhYmptdHVwc3R2c3FwcHFvcnR7f359d2xrcW5sbW5wcnNxdHRzdXV0eHh5eXR1a291bXVwbnNzdnRJS0hKQ0RERUBAPUNDQUZDSElNSEZDRkpMSUdGSk1MRk9KSldSS0dLSkpOSUhJS0lLSklJS0xNTUxJS0tKU2tiWWleXmlicnJaX1lqb19lZVVrX2NbYWFRYG1oXGpcbmlqZFtvZWRwXFpca1ttcWNwc2xkZ2NkZ2Bga21wcG90eXJ1cW9wcW55hYiHh4aFgHZzbmttbW9ucXJ0dHJ0dXV2eXh4c3VucXVud3FydXR3ckhIRkpERUNGQUBBRURDRkJISkxHRkNGS0xJRUZKT0xJT0pMW1FKRkhIS01JSEpJS0tJSElHS0tLS0dISklLS0xKSUpMTVNbXVRQVU1RT05PT1ZRT1BRTk9RSkpOUFFkcWlUWVZbW1xVWVtdWF1cXGNmYWFmYmNmX15ma21obXR4cnRyb3BwdIaHhoaGhYWGh4N6cG1tbGtxc3R0cnR2dHV5eXh1dnFydW92cnRzdXVzSENFR0ZGQEVDP0NHREZHQ0lLTEdGREdKTEhER0lQS0xPS0xXTUlGRUdJSkhJSkhMSklHSEhKSEhIRUVLSEhKTktIT1xWXU9dXGBeT1hZU1xcYl5NWVpNWGFSS1lhWlNgZFxhWFtkZFZWWFxZWlhcVllcXmNfZGBhX2Voa2dtdHRxcXRwcXKBhoaGhYaFhYWGhoaEfXJraW9yc3NzdHd5eXh5eHd4dHF4cnhzcXJ1cnRQQkNETE1BQ0NCRElFR0dGS0pLR0VFSkpKRkVISFBKTE1KTVJJSEVBSEZKSUtLSUxKSUdGSkhFRkdFRUpGQklMSUpUX1lfWGBhW2BVWFpUXV5aX1JZXFBeXFlOX1xeU1teZF5aXWBjX1lfYltgXltVWVlaX15jY2JhY2VpZWtycG9wcG5vd4aGhYWGgnuAhYWGhoWGhX91cXBycnN1eXp6eXl4eHh3cnl2eHJxeHZ0dmFTSkpNSURDQUNGR0VHR0lKSklJREZLS0tFRklJTkpOTEhMTkdIRj5IR0xJS0tKS0tJR0VJRkRERUJGSkQ/SUtITlpiWV5eYV9SVFNXX19cXVleUVlcTVZfV0tRWVtRW19iYV1eY2FgYmFiY2NlWlJaV1ddWl1kYF9fY2ViaG9tbWxsbGx1hX+Eg3l1fISFhYWGhoWFhoaDfXdycnR3eXl5eX9+fXl1eXZ2cm56d3Z4WVFKRkNHRUJESEhGR0hJRkdKR0hGSEtJS0RESkpNTUxMSEpKSElHQEdGTkpLS01LS0tJR0lFRUBEQUhJQT5ISUZPXWBaW2RdX1RRUlhdXFxcX1tLV1xMUlxZSU1eUVFdX2JjY2NjYlxkYmFkY2ZYUldVVFxYW2FfXl9hYV9kbGttamtsbnZ+dYF6fISFhYWFhYWGhoaGhYWGhoJ6cnN1dXuFh4eHhoWEgX54cHp3dnhcUk1CQElGQ0VLSUZHR0lHR0pGRkZJTEpORUNKSkxOSkxJS0tJSUdDSEhRTUtLT01LS0lISEZFQEVCSEhBQEZFQ1NdWV5YX1hfW11VWFhQXVxRS0pWXlheW11WWmFSUl9fYmJgYGJiX2NiYWRkYVhQUlJTXFNcXV1eXl9fX2RpZ2xrbm5we3t8fnuAgoOEhYWFhYWFhISFg4SFh4eBc3J3hYeHh4eHh4eHh4eFg4B8eFxTS0JBR0ZER01SSERSS0ZISEhERktJTVBFR0lKS05MTEpMTEpJR0RIS1FPTUxQTU1LTElKREVBRUNIRkFBRkNBVVVFXFReU1ZgWE5UVU1ZWkxKS1RgYVtfWF9eYl1PWWJcYGBeYmNhXWJhV2BfVVFQUVJZU15cW11dXmBiZmZmbGZvb3d8e4B7fX+AhISEhISFhYWDg4WCg4KFhYZ6b4GGhoaHh4iHhoaGhYWEhYN+SU5GREZGR0RJU2NRRVdfSUdHSERGTUpQUEZJSUpLTkxMS01MSkpHRUpOUVFOTlBNTkxOSUxCRUFDQ0ZDQkBDRD9MR0NMTE9PT01GTUZGSElHRkxLTU9QSUxPUFBTUExRVFNVWVhXWVdXY1ZOUlRQUVBPUVZUXFlZW11cYWFlZmRoZGxtcXNzenl/e3p/hISEhISEhISChIB+e4GDgX17hYSGhoeHh4WFhYSEhIKBgH1LSUVFR0ZHREtOXk1ISFlNR0hKSEdNTFFRSUtKS0tOTVVOT0tLTEdHS1BTU05QUE5PT09JTEZhRUReTERmYkNMWkdeXHNtT0xWbllLQ09fVGtWZ0ldV1VeRExRVUxNU1ZRU1RYVlRYVFRcVE9lWmhoZVpVa1RYV1VbXFtgYGFiYmNhZ2lnbmxocnp9fX6Bg4SEhIODg4F9fXpye4F6e3+CgIOEhIWFgYSFgYODf356e0xJRUZGSEVFTFBUSktHYFRISk9KSU9NUlFLTUtMT1JVUk9QSkxOR0lNUVtZT1BQTlBRUEpLUX9RSXxZWXJzV1BtR3Fub2FWUXFxdE9CanNucXNwU29fW25YXVZcWFVraFVdVmNZYFlaXlVVV39pdHV1YGF2X1liXFxmW19hYWFiX2FjZ21vbWBwd3R4gYGCg4OCf31+gHZ4em12fnR4fYB8foCBgoR8gIN6f4F/fnd3TklFSE1NQkRMTEdKTEZSVkxLT0hMUlhXUU5PT01RVE5PUVBMTE9ITlBTW1pUUVJPUFBRTElaeF1UeGRoWFJTUHZmdGxwYm5ma1JyTkx3bWpycHNycXJwb2+AXWV6dXhxcXpxfnJ9a3V9YVJofGVzc3Bzc3x9cH54b39yYGBgYmJbYmFobG5rYmxmZ213foGAg357eHeAdHZ6aXF+bnR8fnd4e36Ag3h8gXV8f3x8c3NOS0ZgXUdBRE1NSEtLSEtQT01OSk5WXllVTFFTTllZTFNTU05MUElSUlRZV1dRVFBQUFJMSGd4bGN4cW1aSktUeXB1bXVibnZQZGRIZXZxbXdvgGpmeHhpV3JRaHptaWp6en1seHp/cGhuWHV1anZ1cYFhc2h9aWx4fG9fX19jYlxfZGVnamplZ2JjZGxscHBzdHNzc3lxcnhibXRncnl7c3N1eX6Bc3Z6bnx9eXhybk1KUnROQ0JFUFFIS0xKTFFPT09NUFlgWlhLVFdQYV5SVlFZU01QSlNUVlhXV1BVUE9OUkpMcm91dXF1cWNoYFZuS3FwXkdoeVd2VEtoeH13YHl7c21gXW1vZFNncnVubXlwd2t1c3RxbG1cc356a215fGx1bnxrcXd1eF5fX2JfXmBlZGlnaGZlXmJiaWlpamtub2txbm1qcGFjZmRvd3hvbXBzeX9ucXBqe3p0cm9tS0taVkhHRUdSUUpNTkxMUVFQUFBRV1xZVU5WWVVmWFJSWV5UTU5KVFRXV1lXT1NPT05RSVJtSGl3S2BkdnZUVmxObmx7cmFqZ391VEtWa2d8bG1sd15acHp7X2B6c2Nyb3hxZ2N8aXJ7XVRLbF92dWxqdnx7bn95bHxwXV5eYltfY2VlZ2ZlZWNbY2Npa2tyc3J3Z21paGRnYGFsYWdzcmtnbG1yfGttaGt7dG1ta21PR0pLSEpISFJRTU9QTExTU1JPU1JYUldUUFdaVlZUVFRhYFFPTktUU1NRVlZPT01OT1FLSFFOUFVMS0tSU1JRUk9WVVFRT1JSWFhQTU9VVFdYWFpaVFFSV1tXV1dbT1JUV1dYUV1YVlxVVE9YUldYWFlaYFxoc19cW1lcXV9jWl9kZGVnZGRjYlpkYmdmZm1ubXVmZmdjYGZeXWdgZGxnZWdraHB6aGdna3VqaGhpbFBJS0tMTUtKVFJOUlFQTFZVVFBUVVhVWlZSW11WVVRXVVlYT09MTldUUE5VU05QTkxRUEtJUVFLUU1KSk9RVFFQUVNSSkhNT1BRUVBQUFNVUlhXXFdSUlBRVVVWU1pRTlJSV1RTWFVTWFRTUVVUVVZZWVheWl9hXVxbWlxcYGNcXmJjZGdlZWVjWmBhZGFiaGhqbmNhZF5fY11aY1xibWFeZmZnbXNkaWhra2VkY2ZoUUpLS05PTE1UUU9UUVJNWFdVVFZYV1daVlNcYFZXVllVWFRRUEtPWFNQTlVQTVFPTFNQTU9VU05RTk1OUVNQVFBRVFROS01PUlRUUVFRVVZTWFpbWVJVUlRYV1ZZXFNPU1RXVFNZVFZYVFJRV1ZWWFxaXGBdVllfXV5dXF1hYV5bYmNjaGdmZGNYYGBiXmBoZWdlYV5fXV1eWlpfWl9nYF5eXWNoa2FoZmhmZGBiZGJQS01MUFFMUFVQUFRRT1FaWVhXWVtaWFlWXWpkVlhZWldWU1RPS09WVFBPVFBQUU9NUlFPUlhUUVFPTU9SVE1XUVNUVU9NTlFUVlVSUlJUV1VaXVxaVlZRUldYVVtbVlBTVVVUVVhTV1hUUlFYVlZbX1tfYF9WX11eYF1cYF9fX1pjY2VoaGVlYlliYGJeX2ZkY2BiXVxcXFxZWltYW2JcXl1dX2JfX2JkZGJkX19gXFBNTk5SUU1SU1BTVFFPVlxaWldbW1xZWltkcW1oZF9bWVZWWFJNTVdTTU1ST1JST0xQU1JVW1VUUFBMT1dVUFZSU1JYTU9QUlVYVVRUUlRYWFteXVxbVlJPVVdVW1pWUVNWVFVXVVNYWlNSUVpXV11fW2BgYFZiXGBhXWBiX1xgXWNhY2hpZWdhWmNgYV9fZWVfYGNbWlxbXFpaWVlXXFpcWmBeYFteXmFgX2NcWWBaUU5PTlZRUFVTUFVVU1BXXFxcWV5cX1dcXmpwd3mAY1xbVlZZUk5QV1NOUVFQUlRSTFJUVFlbV1VPUk5SV1VSUlRRUllPUVNUVltWVlZTVlpYXV5cXF5WU05UVlZbW1VRVFVVV1hSU1lbU1JSXFhaXl9dYmFgV2JbY2JeYWNeXGJhYl9kZ2llZ15cZGBhYGFjZF9iX1paXltcW1hYWVdXWlpaYV1dW11cXFpdYFdbW1pQT09PWVBVVVNSWFJUUFtdXl1cYFxgVVxcaGpyfXNsaFxVWVdRT1NbU1JRU1JVVVVLUldWWlpaU09TUVVVVFJOVlFSWlJUVVRYXVdYWFNXXFheXVlaXVVVTlZWV15aV1FUVVdYWFNWWVtUUlZdWV1eYV5jY19ZYFtlYl9kZF5eY2NhXmVmaWVnX15kYWFhYmNkX2JeWFtfW1xbWFhYWFdbWltgXVtbXFtYWlteVl5ZXVBPT1JbUFpVVldWVFRUXl5gX15iXGBVXV5ia3l1bX5sW1VaVlFRVFxUVFRVVFZZV0xSWlZcW1xSUFVTV1VVUk9XUVNXU1dVVlteWFtZVVpeWF9eWVxZUldSWVlZX1lZUlRVWVlZVVdZW1VUWl1dXmFiYGVkXV5dXWVhYmZkXl5kY2BcZ2VoZmViYGVhX2FhYmJfYF5XWV5aXFxaWVlXVl1aXV5bWltcW1dZXF1WWFddU09QV1lRXVVXWVdXVVhfYGFhYGNdYFVdXmJlZXaCe2lZWVpUVlRWXFhXV1ZXV11YT1VcWV5dXVRTWFJWVVNRU1dRU1ZUWFhYXl5YXVtWXV9YX19YXFZRWFRaWlphWFtUVldaWVpXWFlZV1ZdX2BfZGNiZmVeYlxgZmJkZmRfYGRiYVtmY2hmZGZhZl9fYWJhYWBfXlZVXVlbXFtZXFlZXVtbW1hYWVtaWlpdX11UWV1VTlRaVlRcVVdXWVdWXGBhYmNhY19fVltgZGFfenVwaVpcWlZYVlhbWllbWVhZYFZPVV1bYGFcVFVZUFRWVFJVVVFTVVdbW1xfX1pfXFZfX1ldXlldVlJYV1pZXGFZXVVWWltaW1paWFpYWV9fYGBkY2RlZWNkWmJmY2dmZV5hYmBjXWJjaWVkZ2BoXmJiY2FhYF5fWVRbWlpbW1hcWFhcW1pbV1daWFhcW1xgXVZdXVNPVlpWVlpWWVZYV1heYGJhZGFkYV5ZWWFkYmBrZmhfXV1bV1hZWlxcXF9bWltiVlNXXl1hY1xTVllQVlVVVVVVU1VUWF1dX2BgXWFdV2FeW15cW15YVVhXW1pfX1peV1hcXFxdXVtaXFdaX2FeYGRkZWZmZ2NZY2ZlaGdkXmNgX2VjXWZpZGVpYGdeY2JjYWFgX19cWFlaWVpZWFpYV1tbWltXWFpUWl1cW2BcVV5iTVJXWldXWllbXFhXWV5gYmFlYWRhXV5ZYWNiX2FgYV9cXV1YWFxbXV1fX1xaXWNYWVhdYGNkX1JYWVBXVVdXV1ZWV1ZdXV5hYmFfYl5ZYV1dXlldXVlYVVZbW2BeXF9ZWV5dXl5gXFpaWVtfYl9jZmRmZ2ZoY1plZmdpZ2NfY15hZmVaaWljZmljZl9iYmNhYGBfXV1aV1tZWVhYWllXWltaWVdZVlVbXV1dYGBiYnhLV1dcWVddXFxdWldcXV9gYmRiY2FdYFhiY2JgY2FjXlxdXFhYXFxfXWBfXVtgZFxcWFpiZWNhUlxZT1hWWFlYWVdZWmBeYWJjYGFjX1xiXV9dW15dWVlUWF1cX19eX1taXl5gYmJbW1dbXWBiYmRmZGdmZmhlXWVnaGlmY2FiW2NnYFxpaWNoaWZlYGJiY2FfYF9dXVxZXFlYV1hZWVdcW1pXVlhQWFpdYWNmZnJrf0pZV11bWl9dXF5cWV1bXl9iY2JhYV1iW2JkYmBjYmJdXVtaV1hqcWBcYF9dXGFjX15ZWWNlZGFUX1pRWVdbXFtbWVtbY2BjY2NgYmRhYGNeYFxeXl5ZWFVbXlxcYWFfXVtgYWJmYl5bU1xfYGNkZGZlZ2ZmZ2ZfZmdoaGdkZGBbZWdeYWhoY2loZmNgYmFjYl9fX11dW1pbWVhYWFZaVlxbWlZWVk1YWFxnaWtodXiBdnZ2dnZ2dnZ2dnZ3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHl5eXp6enp6ent6enp7e3t7e3t7e3t7e3t7e3t8e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx7e3t7fHx8fHx8fHx8fHt7e3x8fHx8e3t7e3t7e32JiIaKh4WCgYKDgoODgoKCgoKCgoKCgoKBgIGAgYCAgIGAgYGBgH58fHx8fHx8fHx8fHx8fHx2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d3d4eHh4eXl5enp6enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7ent7e3t7e3x8fHx8fHx8fHx8e3t7e3t7e3t7e3t8e3t7e3t7e3x8fHx7e3t7e3t7fImJh4mGhYKBgoKBgoKCgoGCgoKCgoKCgYGBgICAgICAgICBgYGAfXx8fHt8fHx8fHx8fHx8fHZ2dnZ2dnZ2dnZ2d3Z3d3d3d3d3d3d3d3d3d3d3d3d3d3d3eHh4eHh4eXl5eXl5eXl5eXl6e3t6ent6enp6enp6ent8fHx8e3x7enp6enp7e3x8fHx8fHx8fHx8e3t7e3t7e3x8fHt7e3t7e3t7e3x8fHx8e3x7e3t7h4mIiYWEg4GCgoKDg4KCgoKCgoKCgoGBgYCAgICAgICAgIGCgYB+fHx8fHx8fHx8fHx8fHx8dnZ2dnZ2dnd3dnd3d3d3d3d3d3d3d3d4eHh4eHh4eHh4eHh4eHh4eHh5eXl5eXl5eXl5eXp6ent7enp6enp6enp6e319fX18fXx6enp6ent7fHx8fHx8fHx8fHx8fHx8fHt8fHx8fHt7e3t7e3t8fHx8fHx7e3t7e3uGiYmIhYWDgYKCgoODgoKCgoKCgoKCgYGBgICAgICAgICBgYGAgH58fHx8fHx8fHx8fX19fHx1cG9vb29wcHp+fX19fX2EjIuLi4uOeCkpKioqKSs9Pz4+Pj4+bYB+fn9/e6XX09PT09PPxMXFxcXFx9LU1NTT09haJSsrKyoii9vS0tLS1rp9fn9/f39+fXx8fHx8fHx8fHx8fHx8fHx8e3x8fHx8fHx8fHx7e3t7e4SLh4eGh4KBg4OBgoKCgoKCgoKCgoKBgYGAgICAgICAgIGAgYCAfnx8fHx8fHx8fX18fHx9fXVwbm9vb29veoB/f39/foaQj4+Pj5N5GRoaGhoaHDEzMzMzMzJqgn+AgIB7renk5OTk5eDU1NTU1NTW4+Xl5eXl61QTGxsbGxCP7+Xl5eXpx31+f39/f399fX18fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3t7go2HiIeHg4KEgoGCgoKCgoKDgoKCgoGBgYCAgICAgICAgICAgIB+fHx8fHx8fH18fHx9fX19dnV1dXV1dXV2d3d3d3d3eHl5enp5endvcHBwcHBwcnJycnJycnd6eXl6enp+g4ODg4ODg4KCg4ODgoOEhISEhIOEd3Nzc3NzcnyFhISEhIWCfH19fX19fX19fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8e3uAjIaJh4eEg4SCgoKCgoGCgoOCgoKBgYGBgYGAgH+AgICAgICAgH58fHx8fHx8fH19fX19fX12dnZ2dnZ5d3Z2ent4e3h3dnl8enp5eX15eXl4eHh4eXl5eXp6eXl5eXp6enl4eHl5eXl5eXl5eXl5eXl5eXl5eXl8fX19fX19e3p6enp6ent8fHx8fX19fX19fX19fHx9fX19fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH+Lh4uKiISDg4KCgoOCgYKCg4KCgoGBgYGBgICBgH+AgIB/gIGBfn19fHx8fHx8fX19fX19fXd3d3Z2d314d3d9enh9eHd2en16ent5fHt4d3d3d3h4eHh4eXl5eXl6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fXx8fHx8fHx8e3t8fHx8fHx8fHx8foqJjIyJhYOEhIKCg4KBgoKCgoKCgYGBgYGAgICAgICAgH+AgIB9fX18fHx9fX19fX19fX19d3d3d3d6fXh7eHx8d3t4d3Z6fnp5fXh8enh4eHh4eHh4eHh4eXl5enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fH19fX18fX19fX19fX19fX19fXx8fHx8fHx7e3x8fHx8fHx8fHx9ioqNjYqFg4ODgoKCgoGBgoKCgYKBgYGCgYCBgYCAgICAf4CBgH18fX19fH19fX19fX19fX13d3d3d31+eXd3eHt6e3h3d3h5fXl8ent6d3h4eHh4eHh4eHl5eXp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7fHx8fHx8fHx8fHx8fHx9fX19fHx9fHx9fHx8fH19fX19fHx8fHx8fHx8fHx8fHx8fHx8fH6KiY6NiYSEhIOCg4KCgYGCgYKCgoGBgYKBgIGCgICAgIB/gYCAfHx9fX19fH19fX19fX5+fnd3d3d3eXx5e3h8fXl7eHp6enx8fH17fXt4eHh4eHh4eHl5eXl6enp6e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx7e3x8e3x8fHx8fHx8fH18fH19fX19fX18fHx8fHx8fH18fX19fX18fHx8fHx8fHx8fHx8fHx8fHx8f4iHjYqHhYaGg4ODg4KBgYKBgoKBgYGBgoGAgIKBf4CAgH+AgIB8fH19fX19fX19fX1+fn5+d3d3d3d2eHh5d3l6eHp4eXl5e3l6enl7eHh4eXl4eHh4eXl5eXp6e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fX19fX19fX19fX19fX19fHx9fHx9fX19fXx9fX19fXx8fHx8fHx8fHx8fH1/h4iMiIaHh4SCg4SEgoGCgYGCgoKBgYGCgYCBgYGBgICAf4CBgHx8fX19fX19fX19fn5+fn53d3d3d3d3d3d3d3h4eHh4eHh4eHh5eXh5eXl5eXl5eXl5enp6enp7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx8fH19fXx8fICHiIuHh4mGg4OEg4OCgYGBgoKBgYGCgoGBgYCBgYGAgICAgYF/e3x9fX19fX19fX5+fn5+fnd3d3d3d3d3eHh3eHZ5eXh4eHh4eXl5eXl5eXl5eXl5eXp6enp6ent7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8e3x8fHx8fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXx8fHx9fX18fX18gYaKiomJiISDhYSEgoKBgYGBgoGBgoKBgYGAgIGBgICBgICBgX98fH19fX19fn5+fn5+fn9/eHh3eHh4eHh2cWRqXmpteXl5eHl5eXl5eXl5eXp6enp6enp6enp6e3t7fHt8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXyBhYmKiYqHhIWFhIOCgoGBgYKCgYGCgYGBgYGAgYGAgIGAgYCBfnx9fn5+fn5+fn5+fn5/f394eHh4eHh4eW1kYmVfX15veHl5eXl5eXl5eXl6enp6enp6enp6ent7e3t7e3x8fHx8fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fXx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fIKFioqJiYSEhoWEg4OCgYGCgoKBgYKBgYGCgYCBgYCAgICAgYB+fH1+fn5+fn5+fn5/f39/f3h4eHh4eHluZGVnZWRiXmZ4eXl5eXp6enp6enp6enp6enp6ent7e3t7e3t8fHx8fHx7fHx7e3t7e3t7e3t7e3t7e3t7e3t7e3x8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18goaLiYiKhIWGhIODhIKBgYGBgoGCgoGBgYGAgIGBgYCAf4CBgX98fH5+fn5+fn5/f39/f39/eHh4eHh5d2dlZGVmZGVhX2l5enp6enp6enp6enp6enp7e3t7e3t7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3x7fHx8fHx8fHx8fX19fX19fX19fX19fX18fX19fX19fX19fX19fX19fX19fX19fX19fXyChouHiYeEhIaEg4OFgYGBgYGCgoGBgYGCgYCAgIGBgIGAgIGBfnx8f39+f39/f39/f39/f4B5eXl5eXlrZWFiZWVhZWVeYnh3c3t6enp6enp6enp6ent7e3t7e3t7e3t7e3x7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx9fH19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fYOGi4aIhYWGhIKDhISCgYGBgYKCgYGCgYGBgIGBgYGBgICBgYJ/fHx/f39/f39/f39/gICAgHl5eXl5dGNjZWRjZmNnaGRmbGRec3t6enp6enp6enp6enp7e3t7e3t7fHx8e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t7e3t8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+g4aLhoaGhoWDg4OEg4GBgYGBgoKBgYGCgYGAgIGBgYGAgIGBgX58fH9/f39/f4CAgICAgICAeXl5endkYWNnYmJkXVtlX2FdXmBhaHh6enp6enp6enp6ent7e3t7e3x8fHt8e3t7e3t7e3t7e3t7e3t7e3t7e3t7fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn6EhYuHhoaGhoSDg4OCgYGBgYKCgoGCgYKBgICBgYGBgIGBgYGBfn19f4B/gICAgICAgICAgIB5eXlvb2JiYmReY2dfXWFhYFxfZGJbbXx6enp6enp6enp6e3t7e3x8fHt7e3t7e3t7e3t7e3t7e3t7e3x8e3t8e3x8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+f4SIi4aEh4aGhISDg4KBgYGBgoGBgYGCgoGAgIGBgYGBgYGBgYF+fn2AgICAgICAgICAgICAgXl6cF1iZWRiZF5mZ2dgWWJiYWNlX1xdc3t7enp6e3t7e3t7fHx8fHx8fHx7e3t7e3t7e3t7e3t7e3x8fHx8fHt8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fX19fX19fX59fX5+fn5+fn5+fn5+fn6AhYyKhIWGhoWDg4OEgoGBgYGCgYGBgYKCgoGAgYGBgoCAgICBgX9+foCAgICAgICAgICBgYGBeXpsYmRnY2JnZmFgYGRhYmVkY2RjXlxidXx7e3t7e3t7e3t8fHx8e3t8fHx8e3t7e3t7e3t7e3t8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5+fn5/f4GHjImFhoaHhYOEg4KBgYGBgYGCgYKCgoOCgYCBgYGCgYGBgoKBf39+gICAgICAgICBgYGBgYF6e3RnZ2ZmZGRmZmBeX2FjZWhkZV5iZGB0fHt7e3t7e3x8fHx8fHx8fHx7e3x7fHx7e3t7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fXx9fX19fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5/f39/f39/gomKiIaGiIaFg4SDgoGBgYGBgYKBgYKCgoKBgIGBgYKCgYGCgoF/f3+BgYGBgIGBgYGBgYGBgXp6bWhjY2dmZ2VnZmZnYmVkZWJnW2JlYHZ8fHt7fHx8fHx8fHx8fHt7fHx8fHt8fHx7e3x8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fX18fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn9/f39/f39/f3+EiYqIhomHhYWEhIOCgYGBgYGBgoGCgoGBgYGBgYGCgYKBgYCAgYB/f4GBgYGBgYGBgYGBgYGBe3ppaWRjamZhYGZlY2NjZ2lkY2JgYmRidH18fHx8fHx7fHx8fHx8fHt8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx9fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+f39/fn5/f39/f39/f39/gISKjIiHiYaEhYWDgoGBgYGBgYGCgYKBgYGBgYGBgYKCgYGBgYGBgIB/gYGBgYGBgYGBgYGBgYF2c2VkZ2NkZmViZWZnZGZoZmVjYGBjZGBxfXx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH18fH19fHx8fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+f35+fn9+fn9/f39/f39/gICAhYqMiYiKiYaGg4KCgoGBgYGBgYKBgYKBgYGBgYCBgYGBgYGBgoF/gH9+f36AgoKCgoKCgoKCgnNzZ2VkZGVpamhmZ2djYWZmZWZnZmVlY3V9fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fH19fX19fXx9fX19fX19fn5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAgICAgICFi4qKiYqHh4aEgoKBgYGBgYGCgoGCgYGBgYCBgYKCgYGBgYGBgH+AfnR0c3V9f4KAgH5+f4GAdHJnZGVjZmlqaWVjZWNgZmRkZ2diYmVhcH18fHx8fHx8fHx8fHx8fHx8fX19fHx8fHx8fHx8fHx8fHx8fX19fX19fX19fX19fX19fX19fX19fn5+fn5+fn5+fn5+fn5/f39/f39/f39/f39/f39/f3+AgICAgICAf4aLi4qKi4eHh4SDgoGBgYGBgYGCgYKCgYGBgIGCgoGAgYGBgYKAgIB+c3Nzc3R1eHV1dHR1dnV1cGZjZmVoaGlnaGdlZmViX2RlZmNgYmd3fHx8fH19fX19fHx8fHx9fX19fX19fX18fX18fH19fX19fX19fX19fX19fX19fX19fX19fX5+fn5+fn5+fn5+fn5+fn5+fn9/f39/f39/f39/f4CAf39/gICAgICAgICAh4yMiIuKh4eHg4WCgYGBgYGBgYKBgoKBgYGAgYKBgYGCgoKCgoCAgH5zc3Nzc3Nzc3R0dHRzc3VvY2NhZ2VoaGdqZmRlZ2ZoZmNiZWJeYnl9fHt7fH19fX19fHx8fX19fX19fXt8fX19fX19fX19fX19fX19fX19fX1+fn5+fn5+fn5+fn5+fn5/f35+fn5+fn5+f39/f3+AgIB/f4CAgYCAgICAgIGAgH+AgIGBgICHi4uHjYmIiYWEhYGBgYGBgYGCgoGCgoGBgYCBgoKBgYGCgYKCgYCAfnRzc3Nzc3Nzc3Nzc3NzdXJnZWVkZWpoaGdmaWhnY2VlYmRjaGRne3h1c3N0dnZ5eHZ0dHR2d3d3dnR0dHV1eHd4eHd3ent8fX18fX5+fn5+fn5+fn5+fn5+fn5+fn5+f39/f39/f39+f39/f4B/fnx7e31+fHl5dnZ2eXx8enp3dnd5e317eISMjIqMh4eIhIWEgYGBgYGBgYKBgYKBgYGBgYGCgoGBgYKBgYKBgIB+dXNzc3Nzc3Nzc3Nzc3N1c2hlZ2hla2xoamdpamdnZ2ZkZGJlZG51dHRzc3Rzc3Nzc3Nzc3Nzc3Nzc3Rzc3Nzc3Nzc3NzdHR1dXN1d3h5e35+fX5/fH9/f39/f39/f399eHx+fn18eHV2d3l3eHZ0c3NzdHV0c3Nzc3Nzc3Rzc3N0dHN0dHRzg4yNiomHiIaDhoOBgYGBgYGBgYGBgoGBgIGBg4KCgYGAgYGBgYCAgH91c3R0c3Nzc3NzcnNzc3Z2aWNoamhqbGVmaWxoYGZlZGNgZGRmdHV1dXR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0dHR0c3R0c3Nzc3N0dnZ1dXd1eHx/fn1/fnx6eHVzdHV1dXRzc3Nzc3NzdHR0dHR0dHR0dXV0dHR1dXR0dXV0dXV1dXSGjI2LiIaHhISFgoGBgYGBgYGBgoKBgIGAgYGCgoKBgYCBgYGBgICAf3Zzc3Nzc3Nzc3Nzc3NzdnZzZ2dqZmhnZmhoZmRpZ2NjZ2VlZnB2dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXV1dXR0dXR0dHR0dHR0c3R0dHZ1dXd2dHN0dHR0dHR0dHV1dXV1dHV1dXV1dXV1dHRzc3NzdHRzc3R0dHR0dXV0dYmOjIyKh4eEhIWCgYGBgYGBgYGCgoKBgYCAgIKCgoKBgYGBgYGAgIB/d3Nzc3NzcnJycnNzc3J2dnVuZF1jZ2Vpa2hlaGdnamppZ2VwdnV1dXV1dHR0c3R0dHR0dHR1dXV1dXV1dHR1dXR0dXV1dXV1dXV1dXV0dHR1dXV1dXV1dHR1dHR1dXV1dXV1dXV1dXV1dXV1dXV1dHRzc3Nzc3NzdHRzc3Nzc3N0dHR0dHR1io6MjImGhoSHhYKBgYGBgYGBgYKCgYGBgIGBgoGCgYGBgYGCgYCAgH94c3Nzc3NycnJycnNzc3Z2d3dpYmhoZ2praWhmZGRlZmlocHV0dHR0c3NycXJydHV1dHR0dHR0dHNzcnFxcXFzc3R0dHR0dHR0dHR1dHJycnN0dHR0dHV1dXV1dXV0dHV0dHR0dHR0dHR0dHR0dHNzc3Nzc3Nzc3Nzc3NzdHRzdHR0dHR0dHWLjoyJhoWFhYeEgoGBgYGBgYGBgYKCgoGBgICCgoKBgYGBgYGBgYCAf3lzc3NzcnFycnJyc3Nzd3d3d2xqaGRoaWt2emtlZmVoZ21yc3RzdHNycHBwcXJzdHV0dHNzcnJzcnFwb29vb3Bxc3NzcnJycnN0dHRzcXBxcnN0dHR0dHR0c3N0c3Nzc3R0dHR0c3R0dHR0dHR0c3R0dHNzcnJxcXJyc3NzcnNzc3R0dHRzdo2QjIeHhYWEhIKBgoKBgYGBgYGBgoKCgYGBgIGBgoKBgYGCgYGBgH9/eXNzcnJxcXJycnJzc3N3d3d3c3NqZ2lpaHl/fXFudWxucHFycnJxcXBvcHFxcXN0c3NzcnFxcHBubm5tbm1ubm5wcXJycnJycnJyc3Fwb29wcXJyc3NycXJycnJycnJycnJyc3Nyc3Nzc3Nzc3Nzc3NycW9vbm5vb3Fyc3NycnNzcnJzc3J2j4+Lh4aFhYWDgoKCgYGBgYGBgYGBgYKBgYGBgoKCgYKBgoKBgoF/f394cXBwcHFxcnJycnNzc3d3dnZ3dnJxdHNudn9+dnN4cHBwcnJycnFxcHBxcXFxcnNzc3NxcHFwb29ubm5ubm9ub3BwcXFxcXFwcHFycG9ub3BxcXFxcXBwcXFxcXFycnJycnJycnJxcXJxcXJycnJxcG9vbm5tbm1ub3FycnJycnJycnNycXiPjo2Gg4OGhIKDgoKBgoGBgYGCgYGBgoGBgYGCgoKCgoKCgYGCgX+Af3dvcG9wcXJycnNzc3NydnZ2dnZ2d3Z2dXN5f353d3dvcHFxcXFxcXBwcHFycXJyc3NycnFwcG9vcG9vb29vb29vcG9wb29vb3BwcW9vb3BwcHBwb3BvcHBxcnFxcXJycnJxcXFxcXFxcXBwcHBwcW9vbm5ubW1ubW5vcHFxcXFxcXFxcXFwe4+NjYaDg4WDgoKCgoGCgYGBgYKBgoGBgoKBgoOCgYOCgYGBgIGBf39/dm5vcHBwcXFxcXFwcHB2dnZ2dnV0dHNzcX2AfX1/c29wcXFxcHBwcHFxcHBwcXJycXFxcG9wb29wcG9vcHBvb29vb29vb29wcXFwbm9wcG9vcG9vcHJycnJxcXFwcXJxcHFxcXBwcHBwcHBwcG9vbm5tbm5ubm5vbm9wcHBxcXFxcXFxcXCCkY6KhISDhYSDgoKBgYKCgYGCgYGBgYGBgoKCgoKCgoGBgYGAgYF/f4B1b29vcHFxcXFwcHBwcHZ2dnV0c3JycnJxgIKAgXlwcHBwb3BwcHBxcXFxcHFxcXFxcXBvb3BwcHBwcG9wcXBwb29vcG9vb3FxcHBvcHBvb29ub3BxcXBwcG9wb29wcHBwcHBwcHBwb29vb29vb25ubW1tbm5ubm9ub29wb3BwcHBwcHBwcImQjIiEg4SGg4OCgoGBgoKCgoGBgYGAgIGBgYKCgYGBgYGBgYCBgYB/gHRub29wcXFxcHBvb3BvdnZ1c3JxcXFxcXCAg4N/cnBwcHBwcHBwcHBxcXBwcXFxcXFwcHBwcHBwcHBxcHBwcHBwcHBwb3BwcXFwcHBxcW9vb25vcHBwb29vb3Bwb29wcHBwcHBwcHBwb29vb25ubm5ubm1ubm5tbm5vcHBvb29vb29wc3F1j4+MiYOChYeDg4KCgYKBgoKCgYGCgYGAgYKBgYGBgYGAgIGBgIGBgH+AdG9vb25vb29vb29vb292dXRzcXFxcXFycoCCgoF0cXFxcXFxcXFxcXFxcXFxcXFwcXFxcXBxcHFwcXFxcHBwcHBxcXFwcXBwcHFwcHBwcHBwcHBwcHBwcHBxcXFwcXBwcHBxcHBxcXBxcXFxcXFycXJxcHJ0cnJ0dHR0dXZ0c3R0dHV3d4KQj4uIg4KGh4SEgoOBgYGCgoKBgYKBgYGCgYGBgYGBgICAgYGAgYGAf4B1b29vb29vb29ub29vb3V0c3JycnJycnJyg4ODgnZxcnJxcXFycXJycXFycnJxcXFxcXJxcXFycnFxcnFxcXFxcXFxcXFxcHFxcXFxcXJzc3JycnN1dXR0dHR0dHR1dnd3d3d3d3h4eHh3d3h4eHd2d3Z1dnZ2dnd4ent8e3t7enp6enp8hpCNi4iDg4iHh4WDg4KBgoGCgYGBgYGCgoKBgYGBgIGAgIGBgICBgYB/gHdxcXFxcXBubnBvcHBvdnR1dXNzc3Nzc3WIg4KDeXJzc3JycnNycnNzcnJycnJzdHJyc3Jzc3Nzc3NzcnNzdHR1dXV1dXR1d3h3d3d3eHh4d3h4eHl5eXl5eHh5eXl6ent7e3t7enp6eXl4d3d3dXZ1dnZ3eXp6e35+fn19fn5+f39+foCMkIuKh4OFiIuIhIOEg4GBgoGBgYKBgYKCgoKCgIGBgYGAgYGBgICBgH+AfHp6eXl8eXh4dnV2dnR5dnd4d3d2d3Z2en98fn58dnZ3d3Z1eHp4eHh4d3d3dnh8eXl8enl5fHt5eXl4eHl5enp5eXl4eHp6eXl4eHh4d3Z3d3h4d3h4eXl6e3t6fHx9fn1/f39+fXt7e3t6eXp5eXt7f36Af35+f359fX1+fn9+fn5+gI6QjYqHhIaKi4iGhoSDgYKCgYGBgoGBgoKCgoKAgYKCgYGBgoGAgYCBf3+Af359fX1/f399fHt7e3l4eHh4eXl5eHl4eXl5eHp6enp6ent7e3x9fnx7e3p7fHt9fHt7e3t7e3p5eHl4eHp7enp6eXl6fHx7enp8fHx6enp7fX18fn5/gIKBgIGCgIB/f4GBgYCAf39+fn5+f319fn+AgH9+fn9/fn5/f39/f4B/gH+DkI6Mh4aFiIuMiIeGhYOBgoGBgYGCgYKCgoKCgYGCg4KBgYGBgYCBgYCAf4KDgoKBgYF/fX9/f3+Benp4eHd4eHh4eXh4eXp6eXt+fHp8fX17fH19fXx8fH58fX5+fn5+fX1/f398fH2Bg4GAgH99fH18fX17fX18fHx9fX19foGBgoSEg4KAf4GBgYB/f3+Af39/f39/fn5/f39/f39+fn9/gH9/f4CAgH+AgICAgISQj4uHhoaIjIuIioaGg4KCgoGBgYKBgoGCgYGBgYKDgoGAgIGBgICBgYB/goSCgoCAgIB/fn5/gIB/f359fH19fX2Af31/gH9+f4B/f35/f4CBgYCAgH9/gYCAgH+AgYJ/f3+AgH9+fn9/fn9/f35+fn9/f4GAf3+AgYGAgIGDhIKBgoKBgoB/gIGAgYGBgIB/gYCAgH9/f4CAgIGBgYCBgYGAgICAgYKBgYGAgIGBhY6OjIiGh4mMi4uKhoWDgoKCgYGBgoKDgoKCgYCBgYGCgoCAgYGAgIGBgH+ChYOCgYGAgH9/fn5/gH1+fn59fX1+f35/f39+fn5/gIGAgICAgH5/f35/gH9/gIB/f39+f39+fn5+fX5/fn5/f39+f4CBgYKCg4OCgoOCgYGCg4ODgoGBgYGCgYKCgoGCgYKBgYGBgYKCgoGBgoGCgoKBgYKCgYGCgoKCgoGBgYKCgoKGj5GPioeIio2OjYmGhYKCgoKCgYGCgoOCgoKBgYGBgYGBf4CBgYGAgYCBf4GFhIOCgoKBgoGAgICAfHx8e3x9fHx/fn5/fn5+fn9+fn9/f39/f39+fn6Afn5+fn5/f39/fn9/fn5+f4CAf4CAf39/f39/gYGBgoKAgIGCg4OEg4ODg4KCgoKCgoKCgoKCgoKBgoKCg4ODgoODg4KCgoGCgoKDg4ODg4KCgoKDg4OCgoeSkpCLiouLj4+NioeEgoKCgoGBgYKCg4KCgYGBgYCBgYCAgIGBgYCBgIGAgIOEg4ODhIODg4KCgoF8fXx8fYJ9fn+BgoiBgoKEgoGBg4OBgYGCgoGCgYGAgH9/f4CAgH9/gIF/f39/f4GAgICAgIB/f39/gICAgIB/f4GDg4WEhIOEg4KCgoODgoKDgoKDg4ODg4OEg4OChIWFg4OEhIKCg4SDgoODg4ODgoKDg4KAipSTj4qKjI6Qj42LhoOCgoKCgYGBgYKDgoGBgYCBgYKBgYCAgYGBgIGAgIB/gYKDg4OEhISDgoKCgn18fH5+gIGDgIODgoSGhYaGhYSFhYODg4ODgYGChISCgoKHg4KCgIKBgYKCgoOCgoOCg4KDg4KBgICCgoGDgoGCgoODhIWFhIODgoSEhISDhISEg4ODhIODg4ODhIOEg4SFhISEg4ODg4KCgoKCgoKCgYGCgoKPlJSPjY6OkZGOioiEgoKCgoGBgYGBgoOBgYCBgYGBgYGAgYCBgYGAgYCAgICCgoSCg4SDgoODg4KCfX19gIB/gIKBg4ODg4SGhISDhIWFg4OBgYKDgYCCg4GChYWFhYaGh4aGhoaHh4eGhoaHh4aGhIKBgoOEg4ODg4ODg4SEhYWFg4WEhYSEhIOCgYODgoOEhIOCgoOEgoODg4ODgoKCgoKCgoODhISDhYWFhYaGiJOTk5CPj4+SkYyKh4KCgoKCgYGBgYGCg4KCgYCBgYGBgYCAgIGBgYCAgICAgISEhIGCgoKBgYKCgYF/gIGDgYCAgH+AgoKCg4OCgoGDg4OEg4OCg4WDgoGBgYKEhYeHh4eGhoeHh4iIh4eHiIiIhYSDgYCBgYKCgoOBgoOEhIWEg4ODhIODhISDgYGBgoODhISEg4ODg4ODhISDg4KEg4ODg4SFhYaHh4eHiIiIiYmOk5KSjo+OkJGPi4mHgoKCgoKCgYGBgYKCgoKBgYGBgYGBgICAgIGBgICBgICAg4OCgoGCgoGBgH+AgYWFhYaDgoGAfn5/gYKEgoGCg4SDgoODg4OCgoSEg4SDgoOEhYSEhYWEg4KEhYWChISFhYOCgYB/f4CAf4CBhIODhIWFhIKCgoKDgoODhYSCg4SEhIWGhoaGhoaFhYaHh4WGiIeGh4iHhoaGiIiHhoWGhoaHiJGSkpCOkI6QkYyJh4WBgYKCgoKBgYGBgYKDgYGBgYGBgYCAgICAgoCAgICAgICEhIOCgYKBgIGBgIGCiIeGh4WEgoB/fX1+gIB/gIGBgYGBgYKBgIGCgoKBgoKCgYGBgoGCgoOBgYCAgH+BgIB/gIB/foCBgYGCgoODhIODhIODgoKBgYKDg4OEhIOEhISDhYWGhYeHiIeHh4eHh4eHhoaGhoeFhYWGhoSFhISFhIWGkpORjo6PjpCOiYmHhIKCgoKCgoKBgYCBgoKCgoKCgoKBgYGBgIGBgYCAgIGBgIKEg4OCg4KBgoGCg4OIh4eHh4WEgoF+foCAgH5+fn+AgYGBgoGAgoKBgoB/gICAfoCCgYCBgoODgH9/f4CAgH+AgICAg4OCg4ODg4KDgYGCgoKDgoGCgoKDgoKEg4SEg4OEhIWFhYWGhoaGhYSEhIWFhISFhYWEhISEg4SEhISEhIqUk5KQkI+OjYiGhYSDgYGCgoKCgoGBgIGCgoKCgYKCgYGAgYGAgYGBgICAgIGBgIODgoKDgoKCgYKDgoiJiYmIh4WEg4GChISDgYGBgoKDgoKDhIKDhIWFhIKEgoF/gIKBgYKBgoSDgYGBgYKDgoKBg4OEg4OEhIODgoOCg4ODg4OCgoKCgoKBg4SEhIWEhYWFhYSFhISFhYWFg4ODhISEhIWFhYSEhISEhIODg4ODjpWSkJGRjo2Mh4WDg4OBgoKCgoKCgYGAgYKDgoGAgoGBgYCAgICBgYGAgICAgYCAg4WEhISDg4OEg4SDhoeJiIaFg4SDhIOFg4GBg4KDhYWDg4OEg4SDg4WEhYSEhIGBgIGCg4KChIODgoKBgYSFhIODg4KCg4SEg4ODg4OEhYSEg4OCgoGCgoKEhIWEhYWFhYWDg4WFhYWGhYaFhISFhIWFhoWFhYSFhISEg4SDg4SRlJOSko+MjIqFhISDg4GCgoOCgoKCgYGBgoOCgYGCgYGBgYCAgYCBgYB/gICBgIGGhoaGhoaGh4eGhoWEg4WGgoCBgYGBh4KAfn+BgICCgYGAgYGAgIKBgoKCgYKCgoGAgoKCgoKCg4OBgoGCg4WDg4OCg4ODhIKChISDhISFhIODgoKCgoGBgoODg4OEhYWFhYSDhIWFhoWFhISEhISDhISFhYWFhYSDg4SDhIOChpSTkpSSj42Lh4SEhIOCgYKDg4KCg4OBgYKCgYKCgoGBgoGBgYGAgIGBgICAgICAgIWFhYWGhoaGhoaFhoODg4OBgIKCgoGCgH9+f3+AgH+Af4CBgIB/gYGBgYOAgIGBgoSDgYGBgYGCgYGCg4KDg4KDgoKCgoODgYOEg4ODg4ODhISCgoKCg4KCg4ODg4SFhISEhIODhISDg4ODhISDg4ODg4OEg4ODg4OCg4OCg4KLlJOSk5GNjYqGg4ODhIKBgoODg4ODg4KBgYKBgoKCgoKCgYGBgYCAgYGAgH+AgICAg4SEhYWEhYWFhISFgoOCg4KCg4ODgYCAgICAgIGAgIOCgoOBgYKCg4ODhIKDg4OCgICAgoKCg4KCg4ODg4KDg4SCgoKDg4KCg4OCgoOCg4OFhIODg4OEg4OEhISEhIWFhISFhIOEhIODhISEhISEhIOEhIWEg4OEhISDg4KCg5CUkpKSj4uMiIaEhIODgYGCg4ODg4ODgoGBgoKCgoKCg4KAgYKBgICAgICAf4CAgICEg4WFhIWFhYWEhYWDhISFg4OEhYSCgoKDgoKEgoGChoWDhIODhISEhoWEhIWCf319fX6ChIODg4ODhIODg4SEhIODhISEhIOEhISDhIODhYaFhYWEhYWFhYWEhYaFhoaFhYWFhYWFhYWFhoaFhoaGhYaGhoeGhYWFhYOEhISHk5OSkZKMi4iFhoWFgoKBgYKDg4ODgoOCgYGCg4ODgoKCgYCBgICAgICAgIB/gICAgIWFhoWFhoeHhoWFhYSEhYWEhISEhIOEg4ODhIWDgoOEhYWGhYaGhYaHh4aDgX5/fn5+fn+DhIODhISEhISEhISEhISEhYWFhIWEhoWFhoWGhoaFhoWFh4WFhoWGhoaGhYSFhYWFhYSFhoaGh4aGhoaGh4eIiIiGhYWGhIWFho2Uk5KRkIuKh4aHhoSBgoKCg4ODg4OCg4KBgYKDg4OCgIGBgYCAgICAgICAgH+AgICAh4eHhoaHh4iHh4aGhIODg4SDg4ODhIODg4ODhISDg4OFhYWFh4eFhYeFgX9/f39/f39+f4CEhYSFhoaGhYWFhYaGh4aGhYaFhYaHh4eIh4eHhoaGh4eHhoaGh4aGhoWEg4SFhYWEhYWGhoaHh4aGhoaHh4eHiIiHhoaGh4eHkZOSkJGQi4iIhYaEg4KCgYKDg4ODg4KCg4KCgoKDgoGAgYCAgYCAgICBgICAf4CAgH+Gh4iHh4eHiImJiIiDg4KCg4OEhISFhIOCgoODhIODgoOFhIWHiIWDgoB/f39/f4CAf3+Af3+FhYaHiIiHh4eHiIeIh4iIiIaGh4iIiYmJiIeGh4eHiIiGh4aHiIaGhYSDhIWGhoWFhYaGhoeHhYaHhoeGhoeHh4eHh4eHhYeTk5GPkZCLh4aFhoSCgoGBgoODg4ODg4KCgoKBgoOCgoCBgYGAgICAgICAgH+AgIGAf4aIiIiIh4eIiYmJiIOCgoODg4SFh4eHhYODhYSDg4OChISEhIWEgYCBgoGBgYGAf4B/f357eoCGiIiKiomJiIiJiYmJiouKiIiIiYmLi4qKiIiHiIiIh4eIiIeIhoeGhIODhYeHh4aFhYSEhIWFhIWFhoSEhIWFhYaFhoWDiZSTkI6RjoqGhYaFg4GBgYGCg4ODg4KCgoKCgoKCgoGBgYGBgYGAgICAgICAf4CAgYB/homIiImHiIiJiYiIhIKCg4ODg4SJioeHhIWFhIODhYOFhIODgoGCgoKCgoB/fnx9fX1/fnx7fIOHiYuLioqKiIiKiYiJi4qJiYiJiIqKiYuJh4aGhoeFhoiIiYiHhoaEg4KEiIiIiIeFgoKBg4OCg4OEgoKCg4KBhIOEg4GOk5KQj4+LiIWEhoSCgYGBgYKDg4ODgoKCgoKCgoKBgYGBgYCBgICAgICAgIB/gICBgH+FiIeHh4aHiIiIh4eEgoODgoODhYmKiYeFh4WEhYWEg4WEg4KCgoKCg4F+fX5+fn5+fn19fn19fYOHiYqKh4eFhoeHh4eIh4eJh4iGiIeHiYiEg4SDhYSEhYWGiIeGhYOCgoOFh4aHhoaDgoKDhIKDhISCgYGBgYGDg4SDhJGSkY6PjYuHhIaGg4KBgIGBg4ODg4OCgoKCgoKCgoGBgYCBgYGAgICAf4CBgH9/f4CAf4WGhoWGhoaHh4iHhoGChISDgoWGiIuKhoWGhIKGhoKAg4ODg4ODgoKBfXx9f4B/fn5+fXx9fXx6fISGh4aEg4GDg4SFhYWDg4WEhISEhISFhIKCg4KEhIGCg4OFhoWEgoGBgoKDg4WDhISFhISGg4OEhYOCg4GCg4OEhYSHkpGPjY+MiYaEhYSFgoGAgYGDg4ODg4KCgoKCgoKCgYGBgYGBgICAgH+AgIGAf4CAgICAg4SFhIWFhYeHh4eGgIGBhYODhYWEh4iFg4GAgIF/fn2Cg4ODg4KCgH19f4CAgX99fn59fX19enp6foOEhIKBgYCBgYKCgX9+gYGBgoGDgYKBgoKCgYODgH+AgIGDgoCAgICBgYGBgoGBgoSDg4WEgoOEg4KCgYKEg4WFhoyTkY6Pj4uIhYWDgoSBgYGBgYKDg4OCgoKCgoKCgoKBgYGAgYGAgYB/f4CBgYCAgIB/gICCgoODgoSDhIWFhoZ/gX6AgYCAgH+Bg4J/fn5+fnx8f4ODgoOCg4F9fX5/gICBgH59fX19fn18enp6f4KCgH9/f39+f3+Afn2Af3+AgIF/gICBf39/gYF+fX1/gIF/f35/gIB/gICAgX+AgoCAgoGBgoGBgIGBgYGChIOGj5KQjo+NioeHhoODgoGBgYGBgoODg4KCgoKCgoKDgoGBgoGBgYCAgIB/gICAgICAgH9/f4GCg4SBgoKDgoOEhYCBf3x9fX59fX6AgH59fn57fX6Cg4OCgoGBf319fn+AgIB/fn19fXx7e3t6enl6gIB/fn9+fn58fn9+f4B/fn9/gH+BgH9+fn5/f359fH5/gH9+fn9/gH9/f3+Af3+Afn+AgX+Afn9/f4B/f3+Af4WSko+Oj4uLh4mFhIOCgYGBgYGCg4ODg4ODgoKCg4OCgIGCgYGBgICAgH9/gICAf4CBf39+gYGEhIGCgYODgoODgYB/fH5+f35+gH+Af36AfX1/gYSDgoGAf39+fX5+f4CAgH59fX18e3t8enp5eXl7f39+f39/fn1+f3+AgH9+f3+AgIKAf3x+fn9+fn18f3+Af35+f3+Af39/f36AgH9+gH9/fn5+f39+fn99fHx9hZKSjYyLioiJiISFhIKCgoGBgYKDgoKDg4KDg4ODg4GAgYGBgYGAgH9/f3+AgICAgIB/f36AgYSDgoGBg4SEg4SAgYGAgYCBgIGCgoOBgIF+gIKDg4GBgYGAgH19fX5+fn9+fX19fX18fHx7enl5eXl9gH+AgYGBf3+BgH+Bf4CAgIGBgoKAfoB+f35+fn6BgIKBf39/f4CAf3+Af4GAfn+AgH5/f35/gH99fn19e3yGk5GMi4qHh4qIhoaEg4KBgYGBgoODg4ODgoODgoKCgYCAgYGBgIB/f3+Af4CAgICAgIB/fn5/gYGBgICEhoeGh4KEg4WDgYODg4WEhISEg4GDg4OCgoKBgoF+fn19fX5+gH19fX19fX19fHt6enl5eXmAgoKChIOAgYOBgIKAgYGBg4KDg4GBgoCBgH+AgYOBhIKAgIGAgYGAgIGAgoJ/gYCBf4CAf4CAgH5/f358fIqTkIqJiIiIiYiGhoaEgoKBgYKCg4ODg4OCg4OCgoGAgICAgYGBgH9/f4CAgICAgICBgX9+fX5+f39/foOGh4eIgoaEhYOEhYSFhoaGhoaFhYaBgIODg4KCgH19fX19fX5+fX19fX19fX19fHt5eXl5eHyCg4SFgoGEg4KCg4WGgoOEg4GCgoODgYOCgoGChYOIhYKBgYGCgoGBgYGEg4KDgoKCgoGBgYCBf4CBgH9+jpOMh4iGiIeGhoWGhoSCg4KBgoKDg4ODg4ODgoGBgYB/gIGAgYGAf39/f4CAgIB/gIGAf359fX1+fn9+gIOEh4iEhoaGhYaGh4eGhoeHh4aHh399gICBgoF+fX19fX19fX19fX19fHx+fn58e3l4d3h5eYCCg3+DjYSDhISEl5eDg4SBfX6BgoKBgoGCgYOGiIyFg4KCgYSChIOCg4WFhIWDgoODgoODgoKCgoODgoKSkIuIiIeJh4aGhIaFhISEgoGCgoODg4ODg4KBgYGAgICAgYCBgYB/f35/gIGAgH+AgYB/f359f35/gX+AgoGFhYWGhoeHhoeHiIaHh4eGh4eHf3x9fH1/fn19fX19fX19fX19fX18e4iSgnt8enyGeXh5fIGBfomXhIODhISUk4CBgX9/f35+hIuAf4CAhIaQiYWEgoKBhYWLg4GChYWGhoSDhYWDhISDg4SDhYSEiJKOi4mIiImHiIeFhoWEhYSCgYKCg4ODg4ODgoGBgYCAgICAgICAf39/f3+AgICAgICBgX9/f3+AgICBgYGBgYODhoeGhoeGhoiHhoaGhYSEhoV/fHx8fH19fHx9fX19fX19fX19fHx/kZWWg3t6hJR8eHl6e3x/goOBgYCDgoB+fH5+e4iRfHyOln99f3+ChoqFg4OEgoGDjYl/fn+DhIWFg4WGhYSFhYOEhYWGhISOkY+LioqMiomKh4WGhYODgoGCgoKCg4SDg4KBgYCAgYCAgIGBgICAf39/gICAf4CAgIF+fn+BgYKCgoOEg4KDgoKFhoSEhYWEhoSDhIOCgYGDgX99fXx8fX18fHx9fHx9fH19fXx8fHuLkZeMent8gHp6ent8eXl9fX6Af4B/fHt7fn59gpWRf4SIfnx+f4KEfHyBgoSCgH+Hg32CgX+CgoCDg4SEhISEgoSDhIWChJGRjYuMjI6KiYmGhYWDg4KCgYKDg4KCg4OCgoGBgICBgICAgICAgIB/gH9/gH9+e4CAgXp8gIGCg4WDg4WFhYWDg4OEgoGDg4KDgoKBgICAf4F+f35+fXx8fHx8fHx8fHx8fHx8fX18fH5+ioJ7ent6eHp7enx9e359fn99fX19fHx/gYF9ho+Bfn2Cfn9+gIJ8fH9/gYCCgH59e4qCfYB/foGAgIGCgYKAgICBgH+Lk4+Li42OjYiHiIaFhISDgoKCgoODgoKDg4GBgYCAgICAgIB/fn18e3x8fX9/gIB8eoGBeHuAgoGDhYSDhYSGhoSEgIaUiICCgYGBgYB/f39/f35+foB8fHx8fHx8fHx8fHx8fXx8fHx8fHx5e3t7eHh5e3t6fIF/gH5/gXx+fn9/fYCCgoCAgIF/gpGBf3+AgH6Afn5/foCBgX18fXt9fX18fXx8fYB/gIB+gH5+gZSRi4yMjY+KhoaGhYSEhYODg4KDg4ODgoKBgYGBgICAgYCAgH+AgH9/f317enyAgIB4foF3e4CBf4GCgoKCg4aHhoZ+iJWKfoGBgICAf36Afn9/f35/gX58e3t8fHx8fHx8fHx+fXx7fXx8fHt8fHx6enl7fHp9hYOCf4GBfn9+f4B+hYKBfoB/fn6AhYaCgH5+g4d/fXx+gICBgH9/fn19fX19enx9f39/gH1/foCMkY2MjY6NjYeEhoaFhISDg4ODgoODg4OCgYGBgYCAgYGBgIGBgYGBgIB/f39/e3p/f3t5gHd6f399fn9/gH+ChIaGhX9/hYF+f4CAf4B+fn9+f4CAf4CAf399fHx8fX59fH19fX19fXx+fH18e318fHp7ent9fX+GhIKAgIF9fn1+f32LhIGGfn18fH9+goF/fX19fYB8e318foGEg4GAfn5+fn18fn9/fX6Afn5+hJKMjIuOjYuKhoSGhISDg4ODgoOCg4KDgoGBgYGBgIGBgYGAf318fHx9fn9/f39/e3t/fXd+dnh+fXx9fH1+foGBgoOAe359fH5+gIB+gH9+f35/gIB/gIB/f35/fn5+fn59fn5/fXx+fX59fXx7fHx8ent6fX5/gIODgn9+f3x9fH18fYGDfox+fHt7fX59fn59e3t7fXt6e3t7gIaEgoSDgn+Afn+CgoJ/f4KCf4CKj4uKioyLioiEhIWDhIODg4KCgoKCgoKCgYGBgIKCgYGCgn9/gICAf359fHx+f35+eX1+dnt2eH18fHx7fX1+gYCAgH9+f399fn5/f36Af39/f39/gICBgYB/fYB/f35/fn5/f398gn5+fX19e3t9fXx6fHx+gIKBf4CAfHx9fHx8fHx9fH17f357e3t8fHx9fHt7e3t8fHp6fXp+gn6Bg4SCgYKBhYaFhYaGh4aChJCNi4qJioaHhYKDhISEhIOCgoGBgoKCgYKBgYGBgYKBgYKCgIGCgYGAgIB/fnt8fn58en54eXZ3fHx8e3t9fH+BgH9+f36Af39+f39+f4B/f39/f39/gIKCgH5+gYCAf39/f39/fn2DfHx9fXx/fX19fXt8fn5/fn59f358fHx8fHx8fn57fHt8fHx8fXx9fH58fXx8e3t8eXt8e3t9e31+fn+AgIOHiYmJiomLiYWIkIyKiIiGhYWDgoKDhISDg4KCgYGBgYGCgYGBgYGCgoKBgoKAgIF/fHt6enl7fXp8fn55fHl4eHR8fHx7fHx8foF/f39/f4CAf35+fn1/gIB/f39/gH+Ag4OAf4CBgICAf3+AgIB+fHp8fX1+fX1+foyGfX1+e3uDgn19fX19fH18fX19fnx9e318fX1+fH59fX19fHt7enx7fHx7ent7enp6e35+goWIh4eLi4uKiYyQjYyJh4aFhIOCgoKDg4ODgYGBgYGBgYGBgYGBgoKDgoGCgYCBgX9/gH9+enh5eXp+fnt5enh+c3x8fHt8fHx+fn5/f4B/gICAf35/foCBf3+Af4CBgIKEg4GAgIGBgIF/gIGBgX9/fn99foB+e36BkYx8fX+KgI2Mfn59fX1+fX1+fXx8fH19fH18fX19fn19fn58e3t7fHx9fHt6e3x5enl4eXt+f4SChIiJioiJjY+MioeIhYSEg4GCgoKCg4KBgoKCgYGBgoGCgoKBgoKCgYKCgIGBgH6AgH9/fnt6eXt9fXl8en9ygX17e3x8fH5+fX2Bgn+BgYF/f4B/gIF/f4CBgoGBhYOEgoGBgoGCgoCAgYOCgH+Bf31+gH58f3+Ign9+g5CEhIOBf359fI2HfX1+fXx8f358fX18fX19fn1+f319fXt8fX58fHt8fXp6eXl6eXt7fn6AgYOHhIiNjImJhYWEhIOCgoKCgoKCgYGBgoKCgYKCgoKCgoKCgoKBgoJ/gICAfn9/f35+f3p7eX19enp6fXF+gnp7fH19fX16eH6CgIGCgoCAgYCBgYCAgYKCgoKGhYSBgYGBgYOBf4CChIF/foGAfX6Bfn1/f4CAfX5/hIB+fn99fn19ioV9fn99fn6Af319fXx+fn5/fX+AfX19fH1/f3x8e3x9e3t7enp6e3t8fX59gIN/iIyJiYeFhYWEg4KCgoKCgoGBgYKCgYKCgoKCgoKBgYKCgYGCgn+AgIB/f39/fn5+fXl6en18eXd7dHuHfHR3fX59e3t2dn6AgYOCgYGCgoKCgYGBg4ODgoWGhIKAgICAgoF/gIGEgX5+gIB9foB9fX5+gIB+gX5/gH9/f4B/fX5/f39/gH5/f4B+fH19fH5+fn6Bf4B9goB8fYCBfXx8fX18fHt8fHt7e3x7fHx8fXyIiYeHhYaFhYSEg4GCgYOCgICBgoOCgoKDgoKCgoKBgoKBgYOCf4CBgH9/f35+fn5+e3t6fHx7dnt0d39+dnJ7fn57eHV3fICBgoKCgYKDg4ODgoKEg4SDhYaDgoF/f4CDgICAgIOBfn6AgH1/gH19fn6AgH+Cf4GBgICAgX99f39/gICBgICAf358fX19fX5+fYN9gH6CgH1+gYF/fH5+fX19e3x+fH18fHx7fHt8fYiFhoSFh4WEhYSCgYKBg4GAgIKCg4KCgoODg4OCgYGBgYGBgoB+gIGAf35+fn5+fn5+ent6fYKDfXVxenx6cXp9fXl4dHSAgIKCgoOCg4WDhIOCg4SEhISFhIGBgIB+gIJ/fn9+gX9+f3+AfX6AfX19foB/f4GAgoGAgICCgX1+gH+BgH+AgIB/fn19fX59fn59fYGEf4B/fn+BgX99gH99fX59fn59fnx7fHp8e3qAhYKDhIWEhISFg4KCgYGCgYCAgoKDgoKDhIOEg4OCgoGCgYGDgH+AgX9+fn5+fn1+fn57e3p+iYd+eHJ5fX9xenh7eHl0dX2Cg4KDg4ODhYSFhIODhISDg4SCgYB/gH+AgX59fX6Afn5+f4B9fX98fX1+gH+AgICCgICBgIOBf3+AfoCBfoCBgIB/fn5+fn59f35+hYWAgYB/gIOBf36BgH9+gH6Af359e3p7enx7eoKDf4KCgoKDgoOCgYGAgIKBgICCgYOCgYOEg4SChIKBgYKBgoKAfoCBf359fn5+fn1+fX16e3yFhHt7cnl7fHB3dXZ3eXZ0eoSEgYSEg4SFhYaEg4OFhIKDg4KAgX+Af3+AfX19fn99fn9/f359fnx9fX6Bf4CAf4CAf4CBg4KBgH9+gIB/gIGAgYB/f39/f3+AgICBgoKCgX+BhIF/gIOBf3+Af4F/gH98e3t6fHt8gYB/gX9/gYGBgoGBf39/gYB+gYKCg4GBg4OChIKEgoGBgYCBgoB+gIB/f31+fn19fX59fXt7eoB/eHx2eXp8cXR4d3Z4dXJ5hYWChYSChIWFhoSEgoSDgYOCgICBfn+Af4B8fX1+gH1+f39/fn1/fH5+foF/gX9/fn+Af4CDg4OAf3+BgYCCgYGBgICBgICAgICBgIGCg4GBf4CEgX2Bg4SAgIF/gYGCgX16e3t8fH1/fX+AfH9/fX2BgIB+fX2Af36BgYGCgYCCgoKCgYOCgoGAf4GCgH5/f35/fX19fn19fX19fXp7e3x2fXl4enpydXl5dnd3c3WGhYOFhYKEhIWEhISCg4KBg4F/gIF+f4B+gH19fX5/fn+Afn5/fX98f39/gYCBf398foB+gIGCg4GAgIKDhIKBgIGAf4GAgIGBgIGBgoOCgYF/f4OAfoKChICAgoGCgoSCfnt7fHx8fX19fn16fn19eX5/f3x8fH59foGAgYGBgIKBgYGBg4KBgX+AgIKAfX59fX99fX1+fXx9fX19ent6fHZ8end7eHJ2eXt2dnZzdIaEhIWFgYSEhYSDgoGDgYGDgYCBgX1/gX6BfX19f39/f4B+fn59fX2Af4CBgYF/fnx+gH5/f4GCf4GBgoOHhYGAf35+gH+AgYCAgICBgoGAgH6Agn9/gYKCgYGDgoODhYJ/fX19fHt8fHl6e3p+eXt5eH9+e3t7fn19f3+Bf4B+gYCAgIKDgoGBf4CBgX99fnx9fn19fX19fH5+fH18eXt8eHp8d3p3c3h3enN2dnN0hoSEhYOCg4SEg4KBgoOBgoKBgIGBfIB/foB9fn1+f4CAgH9+f358fn9/gYCBgH9+fX9/fn5/gYB9gICBg4SDf39+fX5+fn+Af4CAf4GCgYB/fn+Bfn+AgoKAgYSChISGhIB+fXx8fHx6eXZ5eXp5dnl2fnx7e3t+fXt/fYB/fX1/f39/gYKBgYF+f4GBfn19fH19fX19fX18fo2BfH15e3t6eXx3eHh0dXV4cnd3dHaGhISFg4ODg4KDgoGCg4KBg4J/gYB/f35/gH59fXx/gICAf3+Af3yAf3+BgIGAgH98gH9+fn5/f31+foCBgoJ+f359fn5+fn9/gH99gIGAfn5+f4F+foCCgX+Bg4KDhIeEgIB+fH18fHt8dXl5eHh4eXd7fHt6e36GfX59f3p7fn5+fX6BgICBgH1+gYB+fX18fX19fX19fHt9g4J8fHp7e3t6e3d2eHVyc3Zxd3lyeIWFhYWDhISCgoOCgYGCgYCDgYCAf35+fn6Afn1+fH+AgIB/gIF/e4B+gIB/gYGAf32Af35+f399fX1+gIGCgX5/fn5+fX19f35/fnx+gH9+fn5/gn5+gICBf4GDgoODhoSAgX58fXx8e3x4d3t4dXl3d3l8ent7fZKHfXx9d3p9fn59fX9+foB/fH6Af359fXx9fX19fX17fHp7fXp6eHt8enp7eHR4dXFydHB4eHF5hIWFhYOEg4KDg4KBgYKCgIGAgICAfX5+f4B9fH59f4CBgH9/gYB8gH+Afn+BgH9/fYB/fn9/fn19fICAgICAfn9+fn59fH5/fn9+fH2Af359foCCf36AgH9+gYOCgoOFhYKCfn19e3t8fHl3e3l3eHd3eHt7ent8hYp9e3p3enx9fXx8fX19f358fX5+fX18fH1+fn19fHx7enp8e3t6eXp6e3p4c3d1cXFzcHh3cXuFhoWFg4WCgYODgYGBgYKAgYCAgYB+f35/f318fn2AgIKBgH+BgH1+gH9+f4F/gH9/gYB/gH99fnx9f4CAgIB/f39+f358fn9/f399fX9/fX5+goGBf4CAf36Bg4KChIOEgoJ+fnx8enx7e3h6endzdnd4eXt6e3l6f357e3d6fH18fHx+fXx9fXx9fX18fH19fX1/fX18fXt5e3x8fHp6enp6enhzdnVwcHJvd3Zye4WHhIWDhIKBg4KCgoGBgoGCgIGBgH+Af39/fX1/fn+AgYGBf4KBfX6Bfn5/gH+Af4CCgICAfn1+fH9/gYCAgH+Af3+Afn1+fn+Af39/f4B/f3+Cf4B/f4CAf4GBgICEgYKCgH9/fn98fX5+en2EfXR8fXp6enp8eXl6eoaFd3l8fHx8fH17fHx8fH19fXx8fX19fX59fX19enl9fHx9enp6enp6eXN1dW9vcW93dHN8hYaDhIKDgoGCgYKCgoGCgYKAgYGAgICAgIB+fYB/gH+BgoJ/goF/gIF+f4GAf4CAgIJ/gX99fX9+f3+CgICAgICAf4CAfn59f4B/f3+Af39/f4B/gICAgIB/gICBgYGBgoGAgH9/f359f356gZGLenx9fHt9eXt6enh5gYF4eXt8fH18fHt8fHx8fX19fHx9fH59fn5+fXx6fHx7fH17eXp6enl5c3V1b29xcHdzdH2Fh4ODgoOCgIGAgoKBgIGBgYGCgYGAgICBgH5+gH+BgIGCgoCCgoCAgn6AgYF/f4F/gYCBf3x+gH9/gIKAgICAgH9/gIB+f31+gH59gIB/f39/gICAgIGAgH+AgIGAgYGCgoCAgH9/f31+f3yBhoh8fH57e355ent6e41+d3d5e3x7fXx8fHx7fXx9fH19fH18fn5+f39+fHp8fXt9fXt5ent6eXlzdHVuc3FweHJ1eoWGg4OCg4KAgICBgYF/goGCgYKBgYGCgIGBf35/f4GBgoGCgYODgIGCf4GBgX+AgICAf4F/fX+Bf4CAgYCAgH+AfoCAgH9+fX+Afn5/gH9/f4B/f4CAgX+AgYB/gYCBgoKCgICAgICAfX6AfYCDgnt+fnt8fXt6fHx7h3l4eHl8fHx9e3x8fX19fHx9fX59fX1+fn9/gH99e3x9fHx8e3p5e3t5eXNydW52cnB4cXV2hYWDhIOCgoCAgIKBf4CCgoKCg4GBg4KAgoGAf4CAgoKCgYOBhISAgYF+gYKBf4CAgIB/gn9+gIGAgoCAgICAf4B/gICAf359gH9/f3+BgIB/gIB/gIGBf4CAgICBgIGBgYKBgIGAgIB/f4B+f31+fX5+e318fXt8fHd4dXh4eXt8fH18fHx8fH1+f39/f359fX5/f4CBgH98fXx8fXt6e3l6fHh6c3J1bndxcXpxdneFhYOEg4OCgYGCg4B/goGFg4OEgYGDgYKCgoGAf4CCg4KAgoKFg3+AgH6Cg4CAgYCAgH+AgH+BgYCCgH+AgYB/foCAgICAgH+AgIB/gICAgICAf3+AgYGAgICAgIGBgIKCgoKAgoGBgoGAf3+Af4CHfn58en18e31+eHd2eXl5fH19fH17fHx9fX5+f4CBgH59foCAgIKBgHx+fX1+fHd7enp7eXlzcXVud3B1enF2eYWFgoOCg4OCg4SEgICCgYaDg4OBgoSAhIOCgoB/goKEgYGCgoSCf4CAf4GDgoGBgYGAgH+BgYGBgIOBfoCDgn99f4KBgICAfoGAgX+AgIGBgYGAgICCgoGCgYGAgYGBgYKDgoKDgYODgoGAgYB/gIR9fX18f316fYB6eXZ6eHl7e3x9fXt8fX19fX5/gIGBgIB/gICAg4OAfX9+fn59eXl7enp6eXNydW93cXd5c3d7hYKCg4KDhIKDhIOAgIKDhoODg4KChIGEg4GCgICCgYOBgoKBgoF+gYCAgoGCgYGDgYCAgICAgYKBhIB+gYOBfn+Ag4KAgX6AgoOCgIGBgYKCg4KBgYOCgoSBgIGDgYGChIODhISDg4SDg4GCgYGAgn+Af32AfHp8f3t7d3x5eXl7en1+fXx8fHx9fn5/gYGAgICBgYGEhIB9gH9/f39+e3t7ent6dHB4cnl0dnh0d3uEgoOCg4OEgoSDg4GCgoSGhIKDg4KEgYSEgIOAgYOCgoKCgoCCgH6BgICCgYKBgoKCgYCBgYGDgoKDgH6Bg4F+f4GEhIGDf4KCgYOCgoKBg4ODhIGChIKDgoKBgoKDgYOEg4SEhISEhYOEgoGDgoKDgYGBgIB+fHyAfHx4fHl6eXp8fX98e3x8fX19fHyAgICAgIGBgYGCgX6BgICAgH97e3t6enp1cHh3eXZ1fHV2fICAg4KDg4ODhISEgIKChYSEg4OCg4SBhIWCgoGCg4OBgoKCgIGAfYCAgYGCg4KCgoKBgIGCgoOCgoOAf4GDgX+AgoSDg4KBgoKBg4KCg4OEg4OEgIKEg4ODgYF/gYOCg4WChISEhISEg4SEgoSDhISCgYKBgYB7foF+fXl8enp6fXx8gX16fHx9fXx6e35+foB/f4GBgICAgICBgYCAf319fHx9fHZydnh4dnR+dnV9h4eDgoSFg4OEhYSAgoSFhISDgoOEhICEhYOCgoKDg4KDgoKAgoB9gICBgoOCgoKChIKBgoKDhIKCgYCAgYOBf4GDhYSDgoOAgoKDgoODg4SDhIOAgoOChIOCgn6DgYKEhIKDg4SEhISDhISDhIOFhIODg4KCgHuAgX98fH16ent9f31/f3x8enx+fXx9fX5+f39/f4CAgIB/fn6AgYCAgH58fX1+f359fHt4dn92dn+Eh4OCg4WDg4SGhIGChYaFhISDg4SEgoSFhYKCg4OEgoOCg4KCgX6AgIKCg4KDg4OEgoGCgoODgoOBgYGBg4F+gYSEg4OChH+BhIODg4KEg4OEgoCDhIOEg4OCgoOCgoSDgoOEhISEhISFhIODhIWEhISDgYKAfYGCf318fHt8fIB9fX6Afn59f358fHx9fX5+f35/gYGBgYB/fX1+gYGAfn59fX1+fX1+fn9/gHx8gIGCgoODhoOEg4aEgYKIh4WEg4OEhIWChIWFg4OEg4SDg4KDgoOBfoGBg4OEgoODhISDgoOChIODg4KCg4KDgX+BhIODg4KDf4GFg4ODg4SDg4SDgIKEhIWDgoKDg4OBhIOBg4OEg4SEhIWEhISFhYWFhIODg399gYR/fX18fHx8f4F+fX5/f31/fXt8fX19fX1+fn+AgYCBgYB+fXx+gn9/fn5+fn19f39/f4CAgH+AhISDg4SFg4SDhX9+goqLhYSEg4KDhYGGhoaDhISEhISDg4ODhIJ/gYGDg4WEhYSFhIOChISEhYSDg4KEg4WBgYOEhYWGhIKAg4eEg4ODhYSFhYSBhIODh4KDgoOBgoGEg4KDg4WDg4WFhIWFh4eGh4WEhIWEgX+Bg39+fnx+fX1/gYB/fnx8fn9+fHp8fX19fX1+fn5/f4CBgX99fXyAf4B+fn5+fn9/gIGBgYGCgIGFhYSDhYSChIOGgIKFhYuJhISDhIWFg4eGhoSEhISFhISEhIOEhIGCg4ODhISGhIWEg4OEhIN8g4R7gYR3eYOBfYR+fnJ1g4KBdn6DhYF9gXWBeYN/f4B+hISCg4OCgYOEg4OEhYOEhYaEhYZ9hHl8fn+Ee4WDgISDgH9+fX59fYGDgX17f31+gH59fHx8fX19fXx9fX+Af4GCf319fH+BgYCAgIB/gYGBgoGCg4OCgoaEhISGhIGDhIWDhIWEioiFhYWDhYWEhoaGg4SEhYWFhIWFhISFgoKDhIWFhYaEhYSDhIWFgmiAhWp8e3FxfIFzhnN0dH2ChHVzcYOGdHB1cnN0g3Z7fXWBf4KDgIJ2eYWAg4CEf4WEgoWFgmh6cnNzfIBzgYN/g4N9gX19fn1+goOBfH+BfX6AfX18fHx8fXx8fH59foB/gYF/fX19gIGCgYGBgYCBgYGCgYKCgoKEh4SFhIWEgYKEhoaDhYOGiIaGhYOGhoeHhoeDhYWGhYSChYaEhYWDgoOEhIaGhoSGhIOEhYZ9cXuBcHl2foN/gm55cHVzfHZ6eYVyhINwdnhxdnR0dXJzdHZpf4Bucm90dm51bHdte3NugIh5bX1yc3Zzdm1teGxweWx1fX9+fX6BgIF9gH59gH+Af319fHx8fXx9fn99gH+AgH58f36AgYKAgYCAgIGAgICCg4KDhIWIhoaAgoWDg4SHhoOFhYWGh4eEg4aHiImGh4SFhoiIhYOFhoWFhISDhYSChYaGhYaFhIaFh3ZwdHtwcnV/h4WDbXVvdm98dXKEeXmHeHF0d253aHd6bnB2gnKDfm96eXltb256b29td314hnBxenBydGaBdX5ue3lzb3l/gH99fYF/f3x/fXyAfoCAfn6AgIGAfn5/f36Bf4B/fn2AfX+AgYCAfn5/gYB/f4KDgoKEhYeHhH6HhIODhYeGhIaFhYaGiISEhoeIiIaHhIaGi4mFhIaHh4WDhYWFhIKFhYWFhoaFhoWGcXVwcnNvc3p5foR0iHR1foh2boJyhIZ5bmpyf3Ftc3d8f3V0fIR+eHF1d255dXpxdnh1enmEcWpveXhwa3lzem96d3Z2cIGAf35+f39+en59fX99f39+fYCBg4OAgoOBgYSCgYCBgYB9f3+Bfn9+fn+BgH5+gYKAgIGEh4aDg4aEhIWGh4aFhYWFhoaIhYSGhYeGhYaEhoaJiIWEiYqIhYSGhoWFg4WFhIWGhoaGhYN4i3lyiHp7cHCFhHiFeHlrc355e2tyg4eDenxte3l5dH2Adm5vgIBvdHx1d3F5fX1tfnVvg4WGeoBycnt8dHBvemtzfG53goCBfn5/fX17fXt8fX1/f359f3+Cgn+Bg4GBg4GAf4CAgH5/fn99f359f4B+fH2BgH5+gIOIhYaDhYWFhYaHhYWFhYWHh4iGhIaFh4aGhYSFhYSFhYaJiYeGhIaFhoaFhoaEhoaHhoaFhoeHh4aGhIaFhoeIh4WHhoaDh4aFhYOEhoaFhoSGhIOEhIaEhIGEg4SEhYSFhIWEhoOGh4WGhISFh4aEhIWFhIV9d4WDhISDgoF9f357fHt+e3x8fX9+fXx+foGAfX+Bf3+BgH5+foB+fn9+fn1/fX1+f3x7fH9+fHx/gYmGhYSGhoaFh4aFhYWFhoaHiIaEhoWGhoWFg4SFhoWEhoaGhoWFhoSFhoaGhoWGhoeHhoWHiIiIiIaEh4WGh4iGhYiHiIWHhoaIhYWGhoWGhoWDgoWFhoWFg4SEhISFhIWFhIWFhIaHhoaFhIaHhoSEhYaDhYSChIODhYODgn2Af3t7fH17fHx9f358fH59gH99foB+foB/fX18gH1+fn5+fn98fX1+e3x8f3x7e35/iIeEhIiGhoaHhoWFhIaGhoaIh4SFhoeGhYSDg4SGhYSHhYWGhYWGhIWGhoeHhYeGiYiGhoiHiImIhYSIhYaHhoeGiIaHhYeHhoeFhYaHhYeGhYKDhYaGhISDhISDhIaEhYWFhoaEhoaFhoWEhoaFhIOFhYKFh4WDgoKFg4SBfoCAfHt9fXt8e31+fXx8fn1+fnx/fn19fn59fXx/fH5+fH2BgHx8fH18fHx+ent7fX6Ih4KFiIeHhoaGhoSEhoaHhoiGg4SEhoaEhYeDhIWEhYeEhYaGhYaEhoaHh4aGiIeJiIaGiIeIioiFh4iFh4eGh4aHhoeFiIiHh4WGhoeFh4eFgYSEhYaFhYSEhIOEhYWGhoaFhoSHhoaHhYWGhoWEg4SDgoSHg4SBgoSEg4GAgIB7e359e3x8fX18fHx9fXx9fH59fH19fHx8fX18fn17fIF/fXx9fH58fHx6enx8fYiHgoaIh4aHhoaGhIWGhYaGhoWDhYSGhYSIiYOBhIOEhoSGhoaGhoSHh4iIh4eHiIqIhoeIh4iJiIWIh4WHhoaHh4eFh4aIiIeHhYeHh4WGh4SChIOEhoWHhYWEg4SEhYaGhoaGhoeFhYeFhoWGhYSCg4KDg4eBg4CCg4OCgoJ/gHt8fn58fHx+fXx9fXx9e3x8fHx8fH17e3t9fHt+fHt8f319fH19f318enp7e3x8iIeChoaGhoeGhoWEhYaFhYWFhIOFgoaEg4iHf3p6goWGhIaGhYeGhIeHiYiIh4aIioeGh4eGiImHhYiHhoiHhoaHh4WHhoiIh4aFh4aHhoaHg4OEhIOGhoeFhYSEhIWGhoaGhoWHh4aGh4aGhIaFg4OCgoKDhoGDfoKCg4CDg39/fH9+fnx8fX99fH19fH16e3t6e3x8fHt7e357e317e3t+fHx8fH1+f317enx6fH2Jh4OGhYaFhoaFhYSFhYWFhYSDgYWBhoSChIR8gIZ/goWFhoWFhoWEh4eIiIiGhYiKh4WHhoeHiIeFiIWGh4iGhoeHhoeGiIiHhYaHhoeFhYeDhIaFhIaGh4aFhYOFhYaGhoaHhYeGh4aHh4WEhYWDgYKBgIOFgoN+gYGBf4OBfn9+f31/fHx9f317fX18fXp6e3l7fH17e3t7fnx8fHx6e318fHx8fn2BfHt7e3t8e4mHhIaEhoSGhoWEhYaFhISDhIKAg4GFg4GCf3qEjHuAhIWHhoaGhYSHiIeGh4WFh4mHhIeFh4aIhoWHhIaHiIaGiIiHh4aHiIaEhoaGh4aFh4OEhYSGhoaHhYWEg4WFh4WHhoeFhoaGhYaGhIOEhYGAgYGAg4ODgn2BgYB+g4F+f3+AfH98fX1+fXt+fXx9eXp6eXt9fXp6e3t9fH18fHp7fXx8fXx+foB8e3t8fn18iIeFhoWGhIaFhYWFhYWDg4GDgYCCgYWCgIB/f318e4GEhYaGhIWEg4eHhoaGhYSGiYaChoSGhoaFhYeGh4iJhoWIh4mHhoaHhYSGhYWGhYWHg4SFhIiGhoeFhYSChoWGhYeGh4SGhoaFhYaDg4OFgH+BgICDgYOAfIGAfn6CgH2Af4F8f3x9fn1+e359fHx5eXp5en19eXp6e3x7fHt7ent9fXx9fH5+fnx7e31+fXyIhoWGhoaEhYWEhYWEg4KCgIKBgICAg4F+fn6AeXp9gIOEhYeFhIODh4aDhIWEgoWIhYKEg4OFhYWFh4eHiIiFhYiHiYeGhYaFg4aEhYeDhIaEhIWEh4aFhoWGhIOGhYaGhoaGhIWGh4WFhoKCg4R/foCAgIGAg4B7gX99foJ+foB+gH5/fX1+fX97f317enl6enl6fH15enp7e3p8e3t7e3x9fX18f359fHx9f358e4iFhYaGhoaEhYSFg4WCgYCAgIGAfn+Cgn19f397f3+Cg4OFhoWEg4KGg4GDhIKAhYeFgoOBgYOEhISGhoeHh4WFiIaJh4aEhISChYOEhoKDhYSEhoSHhoWFhYaDhIWEhYaFhoSDhYWGg4WFgYGDg39+f4B/f4CDf3yAfX1/gn2AgX5+gX59fX19f3t/fHt6eXp6eXp6fHl6ent7e316e3t7fH1+fX2AfX18fH2Af318hoOGhoaGhYOEgoWChYGBgH9/gIB+f4CCfH5/f36AgIKCgoOEg4KBgoSBgIOCgYCEhYWCgX+AgoODhIWGiIaFhIWHhYeFhYKDgoGDgoKFgYOFhIWGhIaGh4aGhYKEhIOEhoWFg4SEg4SDhYSAgIKCf319f35+gIR+e398fICBfYGAfX2DfH5+fX1+e357e3p5enp5enp7eXp6ent7fHp7fHx8fn59f4F8fXx8fX+AfoCGhIWFhIeEg4OChoKDgIGAfn5/gH1/f4J8fX9/fn5+gYGCg4OCgYGCgn+AgYKAgIKFhIKAf4CBgoGDhYWHhoSEhoaEhYOFgYKBgYKBgoOBgoSEhIWFhoeHhoWEg4ODg4SGhYSBg4KDgoSDg4B/gIF+fXx+fnx/g318fnx8gYB+gn99f4J8f359fHx8fHt7enl6enl7enp6enp6ent8eXt9fHx/f3+BgH1+fX19f4CAgIaEhIWEhYKDgoKEgoKAgYB+fX5/fn5+gH19gH9+fn6BgYKDg4KEh4GBfoCAgX9/goSDgX9+f4CCf4KFhIaEg4OFhYKEgYOAgYCBgYGCgYCBhIODhoWFh4eFhYWFgoKCg4WEgoGBgYKAhYOBf36Af358fH59fH6DfXt+e32Bf4CDfn2AgX9+f318fHx9e3t6eXp5eXt5enp5enp7e3t6e318fH9/gYKAfoB/gIB/gIGAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzMTEwMmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hYWNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5hYWMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWZjZGEwYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8KQEAgLTAsMCArMSw0NjkgQEAKKzUgMzIgMAorNSAzMiAwCiszMzcgMSAwCiszMjIgMSAyMTMzMworMjc5IDEgNDI2NjYKKzI4MCAxIDY0MDAwCisyODMgMSA4NTMzMworMzE3IDEgMTA2NjY2CiszMTggMSAxMjgwMDAKKzMyMSAxIDE0OTMzMworMzEzIDEgMTcwNjY2CiszMTIgMSAxOTIwMDAKKzMxNyAxIDIxMzMzMworMzMwIDEgMjM0NjY2CiszNTAgMSAyNTYwMDAKKzM1NSAxIDI3NzMzMworMzMzIDEgMjk4NjY2CiszMjUgMSAzMjAwMDAKKzM3NiAxIDM0MTMzMworMzM1IDEgMzYyNjY2CiszNTEgMSAzODQwMDAKKzM1MCAxIDQwNTMzMworMzM5IDEgNDI2NjY2CiszMjkgMSA0NDgwMDAKKzM1MCAxIDQ2OTMzMworMzMwIDEgNDkwNjY2CiszNTkgMSA1MTIwMDAKKzMxNiAxIDUzMzMzMworMzQ1IDEgNTU0NjY2CiszNTcgMSA1NzYwMDAKKzMyNSAxIDU5NzMzMworMzM2IDEgNjE4NjY2CiszMzkgMSA2NDAwMDAKKzMxMiAxIDY2MTMzMworMzUwIDEgNjgyNjY2CiszMzggMSA3MDQwMDAKKzM1MyAxIDcyNTMzMworMzQwIDEgNzQ2NjY2CiszMzIgMSA3NjgwMDAKKzM0MCAxIDc4OTMzMworMzM5IDEgODEwNjY2CiszMzMgMSA4MzIwMDAKKzMzMyAxIDg1MzMzMworMzQ1IDEgODc0NjY2CiszNDAgMSA4OTYwMDAKKzM0MyAxIDkxNzMzMworMzM1IDEgOTM4NjY2CiszMzkgMSA5NjAwMDAKKzM0MiAxIDk4MTMzMworMzQ4IDEgMTAwMjY2NgorMzUwIDEgMTAyNDAwMAorMzUxIDEgMTA0NTMzMworMzQyIDEgMTA2NjY2NgorMzY2IDEgMTA4ODAwMAorMzQwIDEgMTEwOTMzMworMzU0IDEgMTEzMDY2NgorMzQwIDEgMTE1MjAwMAorMzM0IDEgMTE3MzMzMworMzM4IDEgMTE5NDY2NgorMzQwIDEgMTIxNjAwMAorMzUxIDEgMTIzNzMzMworMzQ2IDEgMTI1ODY2NgorMzMxIDEgMTI4MDAwMAorMzIxIDEgMTMwMTMzMworMzQzIDEgMTMyMjY2NgorMzQyIDEgMTM0NDAwMAorMzQ1IDEgMTM2NTMzMworMzI2IDEgMTM4NjY2NgorMzQyIDEgMTQwODAwMAorMzU2IDEgMTQyOTMzMworMzUxIDEgMTQ1MDY2NgorMzQzIDEgMTQ3MjAwMAorMzQ3IDEgMTQ5MzMzMworMzQ5IDEgMTUxNDY2NgorMzUwIDEgMTUzNjAwMAorMzMwIDEgMTU1NzMzMworMzQxIDEgMTU3ODY2NgorMzQwIDEgMTYwMDAwMAorMzMwIDEgMTYyMTMzMworMzQwIDEgMTY0MjY2NgorMzM1IDEgMTY2NDAwMAorMzQ0IDEgMTY4NTMzMworMzU5IDEgMTcwNjY2NgorMzM3IDEgMTcyODAwMAorMzQ2IDEgMTc0OTMzMworMzMwIDEgMTc3MDY2NgorMzUxIDEgMTc5MjAwMAorMzU1IDEgMTgxMzMzMworMzUyIDEgMTgzNDY2NgorMzI1IDEgMTg1NjAwMAorMzQyIDEgMTg3NzMzMworMzI3IDEgMTg5ODY2NgorMzQ5IDEgMTkyMDAwMAorMzI2IDEgMTk0MTMzMworMzM3IDEgMTk2MjY2NgorMzc4IDEgMTk4NDAwMAorMzIxIDEgMjAwNTMzMworMzE5IDEgMjAyNjY2NgorMzQ2IDEgMjA0ODAwMAorMzUyIDEgMjA2OTMzMworMzQ5IDEgMjA5MDY2NgorMzMxIDEgMjExMjAwMAorMzMwIDEgMjEzMzMzMworMzI5IDEgMjE1NDY2NgorMzMzIDEgMjE3NjAwMAorMzY3IDEgMjE5NzMzMworMzYyIDEgMjIxODY2NgorMzM3IDEgMjI0MDAwMAorMzM3IDEgMjI2MTMzMworMzYwIDEgMjI4MjY2NgorMzMzIDEgMjMwNDAwMAorMzE3IDEgMjMyNTMzMworMzQ0IDEgMjM0NjY2NgorMzM1IDEgMjM2ODAwMAorMzM3IDEgMjM4OTMzMworMzQ5IDEgMjQxMDY2NgorMzM2IDEgMjQzMjAwMAorMzQ4IDEgMjQ1MzMzMworMzQ5IDEgMjQ3NDY2NgorMzQyIDEgMjQ5NjAwMAorMzU5IDEgMjUxNzMzMworMzQwIDEgMjUzODY2NgorMzQwIDEgMjU2MDAwMAorMzQ4IDEgMjU4MTMzMworMzM0IDEgMjYwMjY2NgorMzI4IDEgMjYyNDAwMAorMzQxIDEgMjY0NTMzMworMzM5IDEgMjY2NjY2NgorMzM3IDEgMjY4ODAwMAorMzUwIDEgMjcwOTMzMworMzI2IDEgMjczMDY2NgorMzYwIDEgMjc1MjAwMAorMzQ0IDEgMjc3MzMzMworMzQwIDEgMjc5NDY2NgorMzQzIDEgMjgxNjAwMAorMzYxIDEgMjgzNzMzMworMzI5IDEgMjg1ODY2NgorMzQ1IDEgMjg4MDAwMAorMzQ1IDEgMjkwMTMzMworMzMwIDEgMjkyMjY2NgorMzQyIDEgMjk0NDAwMAorMzQ0IDEgMjk2NTMzMworMzMwIDEgMjk4NjY2NgorMzI5IDEgMzAwODAwMAorMzM1IDEgMzAyOTMzMworMzY2IDEgMzA1MDY2NgorMzI4IDEgMzA3MjAwMAorMzQ5IDEgMzA5MzMzMworMzM5IDEgMzExNDY2NgorMzQwIDEgMzEzNjAwMAorMzM1IDEgMzE1NzMzMworMzI3IDEgMzE3ODY2NgorMzQ4IDEgMzIwMDAwMAorMzM5IDEgMzIyMTMzMworMzM0IDEgMzI0MjY2NgorMzUwIDEgMzI2NDAwMAorMzI1IDEgMzI4NTMzMworMzYxIDEgMzMwNjY2NgorMzM4IDEgMzMyODAwMAorMzUwIDEgMzM0OTMzMworMzUzIDEgMzM3MDY2NgorMzI3IDEgMzM5MjAwMAorMzQ2IDEgMzQxMzMzMworMzQ4IDEgMzQzNDY2NgorMzM5IDEgMzQ1NjAwMAorMzQyIDEgMzQ3NzMzMworMzM0IDEgMzQ5ODY2NgorMzUwIDEgMzUyMDAwMAorMzU0IDEgMzU0MTMzMworMzYzIDEgMzU2MjY2NgorMzIyIDEgMzU4NDAwMAorMzM3IDEgMzYwNTMzMworMzU1IDEgMzYyNjY2NgorMzI5IDEgMzY0ODAwMAorMzI0IDEgMzY2OTMzMworMzM4IDEgMzY5MDY2NgorMzU2IDEgMzcxMjAwMAorMzMwIDEgMzczMzMzMworMzIxIDEgMzc1NDY2NgorMzM3IDEgMzc3NjAwMAorMzQ1IDEgMzc5NzMzMworMzM1IDEgMzgxODY2NgorMzQ4IDEgMzg0MDAwMAorMzQyIDEgMzg2MTMzMworMzQ4IDEgMzg4MjY2NgorMzM1IDEgMzkwNDAwMAorMzQ0IDEgMzkyNTMzMworMzU3IDEgMzk0NjY2NgorMzY4IDEgMzk2ODAwMAorMzI0IDEgMzk4OTMzMworMzQzIDEgNDAxMDY2NgorMzQxIDEgNDAzMjAwMAorMzI5IDEgNDA1MzMzMworMzU2IDEgNDA3NDY2NgorMzE3IDEgNDA5NjAwMAorMzUxIDEgNDExNzMzMworMzQwIDEgNDEzODY2NgorMzQwIDEgNDE2MDAwMAorMzMyIDEgNDE4MTMzMworMzU1IDEgNDIwMjY2NgorMzU3IDEgNDIyNDAwMAorMzI3IDEgNDI0NTMzMworMzM4IDEgNDI2NjY2NgorMzIzIDEgNDI4ODAwMAorMzQ2IDEgNDMwOTMzMworMzUyIDEgNDMzMDY2NgorMzQ3IDEgNDM1MjAwMAorMzQzIDEgNDM3MzMzMworMzExIDEgNDM5NDY2NgorMzM4IDEgNDQxNjAwMAorMzY1IDEgNDQzNzMzMworMzQ5IDEgNDQ1ODY2NgorMzI3IDEgNDQ4MDAwMAorMzU1IDEgNDUwMTMzMworMzE5IDEgNDUyMjY2NgorMzQ5IDEgNDU0NDAwMAorMzUxIDEgNDU2NTMzMworMzM3IDEgNDU4NjY2NgorMzQwIDEgNDYwODAwMAorMzQ5IDEgNDYyOTMzMworMzE2IDEgNDY1MDY2NgorMzQ0IDEgNDY3MjAwMAorMzM0IDEgNDY5MzMzMworMzQ0IDEgNDcxNDY2NgorMzQ3IDEgNDczNjAwMAorMzQ4IDEgNDc1NzMzMworMzM0IDEgNDc3ODY2NgorMzM4IDEgNDgwMDAwMAorMzMxIDEgNDgyMTMzMworMzQ0IDEgNDg0MjY2NgorMzQyIDEgNDg2NDAwMAorMzM2IDEgNDg4NTMzMworMzI2IDEgNDkwNjY2NgorMzY0IDEgNDkyODAwMAorMzUwIDEgNDk0OTMzMworMzUwIDEgNDk3MDY2NgorMzYzIDEgNDk5MjAwMAorMzU4IDEgNTAxMzMzMworMzA1IDEgNTAzNDY2NgorMzQ0IDEgNTA1NjAwMAorMzQ2IDEgNTA3NzMzMworMzQyIDEgNTA5ODY2NgorMzMwIDEgNTEyMDAwMAorMzE4IDEgNTE0MTMzMworMzYxIDEgNTE2MjY2NgorMzU0IDEgNTE4NDAwMAorMzEzIDEgNTIwNTMzMworMzMwIDEgNTIyNjY2NgorMzUwIDEgNTI0ODAwMAorMzQ3IDEgNTI2OTMzMworMzQ2IDEgNTI5MDY2NgorMzU3IDEgNTMxMjAwMAorMzI1IDEgNTMzMzMzMworMzM1IDEgNTM1NDY2NgorMzMxIDEgNTM3NjAwMAorMzY2IDEgNTM5NzMzMworMzI5IDEgNTQxODY2NgorMzQ5IDEgNTQ0MDAwMAorMzcxIDEgNTQ2MTMzMworMzI2IDEgNTQ4MjY2NgorMzMzIDEgNTUwNDAwMAorMzE5IDEgNTUyNTMzMworMzI3IDEgNTU0NjY2NgorMzUzIDEgNTU2ODAwMAorMzU2IDEgNTU4OTMzMworMzQ4IDEgNTYxMDY2NgorMzM4IDEgNTYzMjAwMAorMzMxIDEgNTY1MzMzMworMzQxIDEgNTY3NDY2NgorMzYyIDEgNTY5NjAwMAorMzI2IDEgNTcxNzMzMworMzU5IDEgNTczODY2NgorMzE1IDEgNTc2MDAwMAorMzc2IDEgNTc4MTMzMworMzQzIDEgNTgwMjY2NgorMzU0IDEgNTgyNDAwMAorMzUzIDEgNTg0NTMzMworMzQ0IDEgNTg2NjY2NgorMzM0IDEgNTg4ODAwMAorMzQ1IDEgNTkwOTMzMworMzU1IDEgNTkzMDY2NgorMzIyIDEgNTk1MjAwMAorMzM0IDEgNTk3MzMzMworMzUzIDEgNTk5NDY2NgorMzM4IDEgNjAxNjAwMAorMzUxIDEgNjAzNzMzMworMzM0IDEgNjA1ODY2NgorMzM5IDEgNjA4MDAwMAorMzQ1IDEgNjEwMTMzMworMzQ3IDEgNjEyMjY2NgorMzU1IDEgNjE0NDAwMAorMzEyIDEgNjE2NTMzMworMzUyIDEgNjE4NjY2NgorMzU0IDEgNjIwODAwMAorMzE4IDEgNjIyOTMzMworMzQ0IDEgNjI1MDY2NgorMzYzIDEgNjI3MjAwMAorMzIxIDEgNjI5MzMzMworMzM5IDEgNjMxNDY2NgorMzU2IDEgNjMzNjAwMAorMzM0IDEgNjM1NzMzMworMzU0IDEgNjM3ODY2NgorMzI1IDEgNjQwMDAwMAorMzIxIDEgNjQyMTMzMworMzQxIDEgNjQ0MjY2NgorMzM3IDEgNjQ2NDAwMAorMzUxIDEgNjQ4NTMzMworMzQzIDEgNjUwNjY2NgorMzQxIDEgNjUyODAwMAorMzQ0IDEgNjU0OTMzMworMzQxIDEgNjU3MDY2NgorMzY0IDEgNjU5MjAwMAorMzE5IDEgNjYxMzMzMworMzQ4IDEgNjYzNDY2NgorMzMyIDEgNjY1NjAwMAorMzMzIDEgNjY3NzMzMworMzQzIDEgNjY5ODY2NgorMzQ4IDEgNjcyMDAwMAorMzQ3IDEgNjc0MTMzMworMzUwIDEgNjc2MjY2NgorMzQyIDEgNjc4NDAwMAorMzQxIDEgNjgwNTMzMworMzI2IDEgNjgyNjY2NgorMzUxIDEgNjg0ODAwMAorMzI5IDEgNjg2OTMzMworMzIzIDEgNjg5MDY2NgorMzUwIDEgNjkxMjAwMAorMzYxIDEgNjkzMzMzMworMzI2IDEgNjk1NDY2NgorMzQ1IDEgNjk3NjAwMAorMzQ1IDEgNjk5NzMzMworMzExIDEgNzAxODY2NgorMzQ5IDEgNzA0MDAwMAorMzU4IDEgNzA2MTMzMworMzUyIDEgNzA4MjY2NgorMzQ3IDEgNzEwNDAwMAorMzY0IDEgNzEyNTMzMworMzI4IDEgNzE0NjY2NgorMzE4IDEgNzE2ODAwMAorMzUxIDEgNzE4OTMzMworMzQwIDEgNzIxMDY2NgorMzQxIDEgNzIzMjAwMAorMzU1IDEgNzI1MzMzMworMzM2IDEgNzI3NDY2NgorMzUyIDEgNzI5NjAwMAorMzQxIDEgNzMxNzMzMworMzM0IDEgNzMzODY2NgorMzQ4IDEgNzM2MDAwMAorMzQyIDEgNzM4MTMzMworMzM1IDEgNzQwMjY2NgorMzQyIDEgNzQyNDAwMAorMzU5IDEgNzQ0NTMzMworMzQ5IDEgNzQ2NjY2NgorMzI5IDEgNzQ4ODAwMAorMzU2IDEgNzUwOTMzMworMjkyIDEgNzUzMDY2NgorMzE2IDEgNzU1MjAwMAorMzE4IDEgNzU3MzMzMworMzIwIDEgNzU5NDY2NgorMzQyIDEgNzYxNjAwMAorMjg1IDEgNzYzNzMzMworMzI2IDEgNzY1ODY2NgorMzUyIDEgNzY4MDAwMAorMzkyIDEgNzcwMTMzMworMzY0IDEgNzcyMjY2NgorMzg0IDEgNzc0NDAwMAorMzM0IDEgNzc2NTMzMworMzE3IDEgNzc4NjY2NgorMzI2IDEgNzgwODAwMAorMzczIDEgNzgyOTMzMworMzU0IDEgNzg1MDY2NgorMzI5IDEgNzg3MjAwMAorMzQ3IDEgNzg5MzMzMworMzUzIDEgNzkxNDY2NgorMzM4IDEgNzkzNjAwMAorMzE3IDEgNzk1NzMzMworMzU0IDEgNzk3ODY2NgorMzQ1IDEgODAwMDAwMAorMzUwIDEgODAyMTMzMworMzUxIDEgODA0MjY2NgorMzMyIDEgODA2NDAwMAorMzU4IDEgODA4NTMzMworMzE1IDEgODEwNjY2NgorMzM2IDEgODEyODAwMAorMzU4IDEgODE0OTMzMworMzQzIDEgODE3MDY2NgorMzE5IDEgODE5MjAwMAorMzcwIDEgODIxMzMzMworMzQ0IDEgODIzNDY2NgorMzYxIDEgODI1NjAwMAorMzQzIDEgODI3NzMzMworMzM3IDEgODI5ODY2NgorMzU0IDEgODMyMDAwMAorMzMyIDEgODM0MTMzMworMzQ4IDEgODM2MjY2NgorMzI4IDEgODM4NDAwMAorMzQ1IDEgODQwNTMzMworMzQwIDEgODQyNjY2NgorMzQ2IDEgODQ0ODAwMAorMzQxIDEgODQ2OTMzMworMzQ0IDEgODQ5MDY2NgorMzQyIDEgODUxMjAwMAorMzQxIDEgODUzMzMzMworMzQ1IDEgODU1NDY2NgorMzM3IDEgODU3NjAwMAorMzM1IDEgODU5NzMzMworMzM1IDEgODYxODY2NgorMzQwIDEgODY0MDAwMAorMzQ1IDEgODY2MTMzMworMzQxIDEgODY4MjY2NgorMzQyIDEgODcwNDAwMAorMzM4IDEgODcyNTMzMworMzQzIDEgODc0NjY2NgorMzM2IDEgODc2ODAwMAorMzM4IDEgODc4OTMzMworMzUzIDEgODgxMDY2NgorMzM5IDEgODgzMjAwMAorMzI5IDEgODg1MzMzMworMzQ5IDEgODg3NDY2NgorMzIzIDEgODg5NjAwMAorMzUxIDEgODkxNzMzMworMzU5IDEgODkzODY2NgorMzU3IDEgODk2MDAwMAorMzQxIDEgODk4MTMzMworMzMzIDEgOTAwMjY2NgorMzM1IDEgOTAyNDAwMAorMzI4IDEgOTA0NTMzMworMzQ3IDEgOTA2NjY2NgorMzQzIDEgOTA4ODAwMAorMzY5IDEgOTEwOTMzMworMzMxIDEgOTEzMDY2NgorMzQ0IDEgOTE1MjAwMAorMzMwIDEgOTE3MzMzMworMzQ2IDEgOTE5NDY2NgorMzM3IDEgOTIxNjAwMAorMzQxIDEgOTIzNzMzMworMzM4IDEgOTI1ODY2NgorMzI5IDEgOTI4MDAwMAorMzYwIDEgOTMwMTMzMworMzM2IDEgOTMyMjY2NgorMzQxIDEgOTM0NDAwMAorMzQxIDEgOTM2NTMzMworMzQ1IDEgOTM4NjY2NgorMzUxIDEgOTQwODAwMAorMzQ5IDEgOTQyOTMzMworMzM2IDEgOTQ1MDY2NgorMzI2IDEgOTQ3MjAwMAorMzQ5IDEgOTQ5MzMzMworMzQzIDEgOTUxNDY2NgorMzU3IDEgOTUzNjAwMAorMzQyIDEgOTU1NzMzMworMzI1IDEgOTU3ODY2NgorMzQ2IDEgOTYwMDAwMAorMzI2IDEgOTYyMTMzMworNDAyIDEgOTY0MjY2NgorMzMxIDEgOTY2NDAwMAorMzM5IDEgOTY4NTMzMworMzcxIDEgOTcwNjY2NgorMzE0IDEgOTcyODAwMAorMzEwIDEgOTc0OTMzMworMzY0IDEgOTc3MDY2NgorMzM4IDEgOTc5MjAwMAorMzM5IDEgOTgxMzMzMworMzM3IDEgOTgzNDY2NgorMzU1IDEgOTg1NjAwMAorMzUxIDEgOTg3NzMzMworMzMyIDEgOTg5ODY2NgorMzE2IDEgOTkyMDAwMAorNDc0IDEgOTk0MTMzMwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgyYWYyMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FhY19zdGVyZW9fMTI4a2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8KQEAgLTAsMCArMSw0NDMgQEAKKzUgMzIgMAorNSAzMiAwCiszMzcgMSAwCiszMjIgMSAyMTMzMworMjc5IDEgNDI2NjYKKzU2MyAxIDY0MDAwCis2MzUgMSAxMDY2NjYKKzYzNCAxIDE0OTMzMworNjI5IDEgMTkyMDAwCis2ODAgMSAyMzQ2NjYKKzY4OCAxIDI3NzMzMworMTAzNiAxIDMyMDAwMAorMTA0MCAxIDM4NDAwMAorMTAwOSAxIDQ0ODAwMAorMTAyMCAxIDUxMjAwMAorMTM1NyAxIDU3NjAwMAorMTM1MyAxIDY2MTMzMworMTM1MSAxIDc0NjY2NgorMTM1MSAxIDgzMjAwMAorMzQzIDEgOTE3MzMzCiszMzUgMSA5Mzg2NjYKKzMzOSAxIDk2MDAwMAorMzQyIDEgOTgxMzMzCiszNDggMSAxMDAyNjY2CiszNTAgMSAxMDI0MDAwCiszNTEgMSAxMDQ1MzMzCiszNDIgMSAxMDY2NjY2CiszNjYgMSAxMDg4MDAwCiszNDAgMSAxMTA5MzMzCiszNTQgMSAxMTMwNjY2CiszNDAgMSAxMTUyMDAwCiszMzQgMSAxMTczMzMzCiszMzggMSAxMTk0NjY2CiszNDAgMSAxMjE2MDAwCiszNTEgMSAxMjM3MzMzCiszNDYgMSAxMjU4NjY2CiszMzEgMSAxMjgwMDAwCiszMjEgMSAxMzAxMzMzCiszNDMgMSAxMzIyNjY2CiszNDIgMSAxMzQ0MDAwCiszNDUgMSAxMzY1MzMzCiszMjYgMSAxMzg2NjY2CiszNDIgMSAxNDA4MDAwCiszNTYgMSAxNDI5MzMzCiszNTEgMSAxNDUwNjY2CiszNDMgMSAxNDcyMDAwCiszNDcgMSAxNDkzMzMzCiszNDkgMSAxNTE0NjY2CiszNTAgMSAxNTM2MDAwCiszMzAgMSAxNTU3MzMzCiszNDEgMSAxNTc4NjY2CiszNDAgMSAxNjAwMDAwCiszMzAgMSAxNjIxMzMzCiszNDAgMSAxNjQyNjY2CiszMzUgMSAxNjY0MDAwCiszNDQgMSAxNjg1MzMzCiszNTkgMSAxNzA2NjY2CiszMzcgMSAxNzI4MDAwCiszNDYgMSAxNzQ5MzMzCiszMzAgMSAxNzcwNjY2CiszNTEgMSAxNzkyMDAwCiszNTUgMSAxODEzMzMzCiszNTIgMSAxODM0NjY2CiszMjUgMSAxODU2MDAwCiszNDIgMSAxODc3MzMzCiszMjcgMSAxODk4NjY2CiszNDkgMSAxOTIwMDAwCiszMjYgMSAxOTQxMzMzCiszMzcgMSAxOTYyNjY2CiszNzggMSAxOTg0MDAwCiszMjEgMSAyMDA1MzMzCiszMTkgMSAyMDI2NjY2CiszNDYgMSAyMDQ4MDAwCiszNTIgMSAyMDY5MzMzCiszNDkgMSAyMDkwNjY2CiszMzEgMSAyMTEyMDAwCiszMzAgMSAyMTMzMzMzCiszMjkgMSAyMTU0NjY2CiszMzMgMSAyMTc2MDAwCiszNjcgMSAyMTk3MzMzCiszNjIgMSAyMjE4NjY2CiszMzcgMSAyMjQwMDAwCiszMzcgMSAyMjYxMzMzCiszNjAgMSAyMjgyNjY2CiszMzMgMSAyMzA0MDAwCiszMTcgMSAyMzI1MzMzCiszNDQgMSAyMzQ2NjY2CiszMzUgMSAyMzY4MDAwCiszMzcgMSAyMzg5MzMzCiszNDkgMSAyNDEwNjY2CiszMzYgMSAyNDMyMDAwCiszNDggMSAyNDUzMzMzCiszNDkgMSAyNDc0NjY2CiszNDIgMSAyNDk2MDAwCiszNTkgMSAyNTE3MzMzCiszNDAgMSAyNTM4NjY2CiszNDAgMSAyNTYwMDAwCiszNDggMSAyNTgxMzMzCiszMzQgMSAyNjAyNjY2CiszMjggMSAyNjI0MDAwCiszNDEgMSAyNjQ1MzMzCiszMzkgMSAyNjY2NjY2CiszMzcgMSAyNjg4MDAwCiszNTAgMSAyNzA5MzMzCiszMjYgMSAyNzMwNjY2CiszNjAgMSAyNzUyMDAwCiszNDQgMSAyNzczMzMzCiszNDAgMSAyNzk0NjY2CiszNDMgMSAyODE2MDAwCiszNjEgMSAyODM3MzMzCiszMjkgMSAyODU4NjY2CiszNDUgMSAyODgwMDAwCiszNDUgMSAyOTAxMzMzCiszMzAgMSAyOTIyNjY2CiszNDIgMSAyOTQ0MDAwCiszNDQgMSAyOTY1MzMzCiszMzAgMSAyOTg2NjY2CiszMjkgMSAzMDA4MDAwCiszMzUgMSAzMDI5MzMzCiszNjYgMSAzMDUwNjY2CiszMjggMSAzMDcyMDAwCiszNDkgMSAzMDkzMzMzCiszMzkgMSAzMTE0NjY2CiszNDAgMSAzMTM2MDAwCiszMzUgMSAzMTU3MzMzCiszMjcgMSAzMTc4NjY2CiszNDggMSAzMjAwMDAwCiszMzkgMSAzMjIxMzMzCiszMzQgMSAzMjQyNjY2CiszNTAgMSAzMjY0MDAwCiszMjUgMSAzMjg1MzMzCiszNjEgMSAzMzA2NjY2CiszMzggMSAzMzI4MDAwCiszNTAgMSAzMzQ5MzMzCiszNTMgMSAzMzcwNjY2CiszMjcgMSAzMzkyMDAwCiszNDYgMSAzNDEzMzMzCiszNDggMSAzNDM0NjY2CiszMzkgMSAzNDU2MDAwCiszNDIgMSAzNDc3MzMzCiszMzQgMSAzNDk4NjY2CiszNTAgMSAzNTIwMDAwCiszNTQgMSAzNTQxMzMzCiszNjMgMSAzNTYyNjY2CiszMjIgMSAzNTg0MDAwCiszMzcgMSAzNjA1MzMzCiszNTUgMSAzNjI2NjY2CiszMjkgMSAzNjQ4MDAwCiszMjQgMSAzNjY5MzMzCiszMzggMSAzNjkwNjY2CiszNTYgMSAzNzEyMDAwCiszMzAgMSAzNzMzMzMzCiszMjEgMSAzNzU0NjY2CiszMzcgMSAzNzc2MDAwCiszNDUgMSAzNzk3MzMzCiszMzUgMSAzODE4NjY2CiszNDggMSAzODQwMDAwCiszNDIgMSAzODYxMzMzCiszNDggMSAzODgyNjY2CiszMzUgMSAzOTA0MDAwCiszNDQgMSAzOTI1MzMzCiszNTcgMSAzOTQ2NjY2CiszNjggMSAzOTY4MDAwCiszMjQgMSAzOTg5MzMzCiszNDMgMSA0MDEwNjY2CiszNDEgMSA0MDMyMDAwCiszMjkgMSA0MDUzMzMzCiszNTYgMSA0MDc0NjY2CiszMTcgMSA0MDk2MDAwCiszNTEgMSA0MTE3MzMzCiszNDAgMSA0MTM4NjY2CiszNDAgMSA0MTYwMDAwCiszMzIgMSA0MTgxMzMzCiszNTUgMSA0MjAyNjY2CiszNTcgMSA0MjI0MDAwCiszMjcgMSA0MjQ1MzMzCiszMzggMSA0MjY2NjY2CiszMjMgMSA0Mjg4MDAwCiszNDYgMSA0MzA5MzMzCiszNTIgMSA0MzMwNjY2CiszNDcgMSA0MzUyMDAwCiszNDMgMSA0MzczMzMzCiszMTEgMSA0Mzk0NjY2CiszMzggMSA0NDE2MDAwCiszNjUgMSA0NDM3MzMzCiszNDkgMSA0NDU4NjY2CiszMjcgMSA0NDgwMDAwCiszNTUgMSA0NTAxMzMzCiszMTkgMSA0NTIyNjY2CiszNDkgMSA0NTQ0MDAwCiszNTEgMSA0NTY1MzMzCiszMzcgMSA0NTg2NjY2CiszNDAgMSA0NjA4MDAwCiszNDkgMSA0NjI5MzMzCiszMTYgMSA0NjUwNjY2CiszNDQgMSA0NjcyMDAwCiszMzQgMSA0NjkzMzMzCiszNDQgMSA0NzE0NjY2CiszNDcgMSA0NzM2MDAwCiszNDggMSA0NzU3MzMzCiszMzQgMSA0Nzc4NjY2CiszMzggMSA0ODAwMDAwCiszMzEgMSA0ODIxMzMzCiszNDQgMSA0ODQyNjY2CiszNDIgMSA0ODY0MDAwCiszMzYgMSA0ODg1MzMzCiszMjYgMSA0OTA2NjY2CiszNjQgMSA0OTI4MDAwCiszNTAgMSA0OTQ5MzMzCiszNTAgMSA0OTcwNjY2CiszNjMgMSA0OTkyMDAwCiszNTggMSA1MDEzMzMzCiszMDUgMSA1MDM0NjY2CiszNDQgMSA1MDU2MDAwCiszNDYgMSA1MDc3MzMzCiszNDIgMSA1MDk4NjY2CiszMzAgMSA1MTIwMDAwCiszMTggMSA1MTQxMzMzCiszNjEgMSA1MTYyNjY2CiszNTQgMSA1MTg0MDAwCiszMTMgMSA1MjA1MzMzCiszMzAgMSA1MjI2NjY2CiszNTAgMSA1MjQ4MDAwCiszNDcgMSA1MjY5MzMzCiszNDYgMSA1MjkwNjY2CiszNTcgMSA1MzEyMDAwCiszMjUgMSA1MzMzMzMzCiszMzUgMSA1MzU0NjY2CiszMzEgMSA1Mzc2MDAwCiszNjYgMSA1Mzk3MzMzCiszMjkgMSA1NDE4NjY2CiszNDkgMSA1NDQwMDAwCiszNzEgMSA1NDYxMzMzCiszMjYgMSA1NDgyNjY2CiszMzMgMSA1NTA0MDAwCiszMTkgMSA1NTI1MzMzCiszMjcgMSA1NTQ2NjY2CiszNTMgMSA1NTY4MDAwCiszNTYgMSA1NTg5MzMzCiszNDggMSA1NjEwNjY2CiszMzggMSA1NjMyMDAwCiszMzEgMSA1NjUzMzMzCiszNDEgMSA1Njc0NjY2CiszNjIgMSA1Njk2MDAwCiszMjYgMSA1NzE3MzMzCiszNTkgMSA1NzM4NjY2CiszMTUgMSA1NzYwMDAwCiszNzYgMSA1NzgxMzMzCiszNDMgMSA1ODAyNjY2CiszNTQgMSA1ODI0MDAwCiszNTMgMSA1ODQ1MzMzCiszNDQgMSA1ODY2NjY2CiszMzQgMSA1ODg4MDAwCiszNDUgMSA1OTA5MzMzCiszNTUgMSA1OTMwNjY2CiszMjIgMSA1OTUyMDAwCiszMzQgMSA1OTczMzMzCiszNTMgMSA1OTk0NjY2CiszMzggMSA2MDE2MDAwCiszNTEgMSA2MDM3MzMzCiszMzQgMSA2MDU4NjY2CiszMzkgMSA2MDgwMDAwCiszNDUgMSA2MTAxMzMzCiszNDcgMSA2MTIyNjY2CiszNTUgMSA2MTQ0MDAwCiszMTIgMSA2MTY1MzMzCiszNTIgMSA2MTg2NjY2CiszNTQgMSA2MjA4MDAwCiszMTggMSA2MjI5MzMzCiszNDQgMSA2MjUwNjY2CiszNjMgMSA2MjcyMDAwCiszMjEgMSA2MjkzMzMzCiszMzkgMSA2MzE0NjY2CiszNTYgMSA2MzM2MDAwCiszMzQgMSA2MzU3MzMzCiszNTQgMSA2Mzc4NjY2CiszMjUgMSA2NDAwMDAwCiszMjEgMSA2NDIxMzMzCiszNDEgMSA2NDQyNjY2CiszMzcgMSA2NDY0MDAwCiszNTEgMSA2NDg1MzMzCiszNDMgMSA2NTA2NjY2CiszNDEgMSA2NTI4MDAwCiszNDQgMSA2NTQ5MzMzCiszNDEgMSA2NTcwNjY2CiszNjQgMSA2NTkyMDAwCiszMTkgMSA2NjEzMzMzCiszNDggMSA2NjM0NjY2CiszMzIgMSA2NjU2MDAwCiszMzMgMSA2Njc3MzMzCiszNDMgMSA2Njk4NjY2CiszNDggMSA2NzIwMDAwCiszNDcgMSA2NzQxMzMzCiszNTAgMSA2NzYyNjY2CiszNDIgMSA2Nzg0MDAwCiszNDEgMSA2ODA1MzMzCiszMjYgMSA2ODI2NjY2CiszNTEgMSA2ODQ4MDAwCiszMjkgMSA2ODY5MzMzCiszMjMgMSA2ODkwNjY2CiszNTAgMSA2OTEyMDAwCiszNjEgMSA2OTMzMzMzCiszMjYgMSA2OTU0NjY2CiszNDUgMSA2OTc2MDAwCiszNDUgMSA2OTk3MzMzCiszMTEgMSA3MDE4NjY2CiszNDkgMSA3MDQwMDAwCiszNTggMSA3MDYxMzMzCiszNTIgMSA3MDgyNjY2CiszNDcgMSA3MTA0MDAwCiszNjQgMSA3MTI1MzMzCiszMjggMSA3MTQ2NjY2CiszMTggMSA3MTY4MDAwCiszNTEgMSA3MTg5MzMzCiszNDAgMSA3MjEwNjY2CiszNDEgMSA3MjMyMDAwCiszNTUgMSA3MjUzMzMzCiszMzYgMSA3Mjc0NjY2CiszNTIgMSA3Mjk2MDAwCiszNDEgMSA3MzE3MzMzCiszMzQgMSA3MzM4NjY2CiszNDggMSA3MzYwMDAwCiszNDIgMSA3MzgxMzMzCiszMzUgMSA3NDAyNjY2CiszNDIgMSA3NDI0MDAwCiszNTkgMSA3NDQ1MzMzCiszNDkgMSA3NDY2NjY2CiszMjkgMSA3NDg4MDAwCiszNTYgMSA3NTA5MzMzCisyOTIgMSA3NTMwNjY2CiszMTYgMSA3NTUyMDAwCiszMTggMSA3NTczMzMzCiszMjAgMSA3NTk0NjY2CiszNDIgMSA3NjE2MDAwCisyODUgMSA3NjM3MzMzCiszMjYgMSA3NjU4NjY2CiszNTIgMSA3NjgwMDAwCiszOTIgMSA3NzAxMzMzCiszNjQgMSA3NzIyNjY2CiszODQgMSA3NzQ0MDAwCiszMzQgMSA3NzY1MzMzCiszMTcgMSA3Nzg2NjY2CiszMjYgMSA3ODA4MDAwCiszNzMgMSA3ODI5MzMzCiszNTQgMSA3ODUwNjY2CiszMjkgMSA3ODcyMDAwCiszNDcgMSA3ODkzMzMzCiszNTMgMSA3OTE0NjY2CiszMzggMSA3OTM2MDAwCiszMTcgMSA3OTU3MzMzCiszNTQgMSA3OTc4NjY2CiszNDUgMSA4MDAwMDAwCiszNTAgMSA4MDIxMzMzCiszNTEgMSA4MDQyNjY2CiszMzIgMSA4MDY0MDAwCiszNTggMSA4MDg1MzMzCiszMTUgMSA4MTA2NjY2CiszMzYgMSA4MTI4MDAwCiszNTggMSA4MTQ5MzMzCiszNDMgMSA4MTcwNjY2CiszMTkgMSA4MTkyMDAwCiszNzAgMSA4MjEzMzMzCiszNDQgMSA4MjM0NjY2CiszNjEgMSA4MjU2MDAwCiszNDMgMSA4Mjc3MzMzCiszMzcgMSA4Mjk4NjY2CiszNTQgMSA4MzIwMDAwCiszMzIgMSA4MzQxMzMzCiszNDggMSA4MzYyNjY2CiszMjggMSA4Mzg0MDAwCiszNDUgMSA4NDA1MzMzCiszNDAgMSA4NDI2NjY2CiszNDYgMSA4NDQ4MDAwCiszNDEgMSA4NDY5MzMzCiszNDQgMSA4NDkwNjY2CiszNDIgMSA4NTEyMDAwCiszNDEgMSA4NTMzMzMzCiszNDUgMSA4NTU0NjY2CiszMzcgMSA4NTc2MDAwCiszMzUgMSA4NTk3MzMzCiszMzUgMSA4NjE4NjY2CiszNDAgMSA4NjQwMDAwCiszNDUgMSA4NjYxMzMzCiszNDEgMSA4NjgyNjY2CiszNDIgMSA4NzA0MDAwCiszMzggMSA4NzI1MzMzCiszNDMgMSA4NzQ2NjY2CiszMzYgMSA4NzY4MDAwCiszMzggMSA4Nzg5MzMzCiszNTMgMSA4ODEwNjY2CiszMzkgMSA4ODMyMDAwCiszMjkgMSA4ODUzMzMzCiszNDkgMSA4ODc0NjY2CiszMjMgMSA4ODk2MDAwCiszNTEgMSA4OTE3MzMzCiszNTkgMSA4OTM4NjY2CiszNTcgMSA4OTYwMDAwCiszNDEgMSA4OTgxMzMzCiszMzMgMSA5MDAyNjY2CiszMzUgMSA5MDI0MDAwCiszMjggMSA5MDQ1MzMzCiszNDcgMSA5MDY2NjY2CiszNDMgMSA5MDg4MDAwCiszNjkgMSA5MTA5MzMzCiszMzEgMSA5MTMwNjY2CiszNDQgMSA5MTUyMDAwCiszMzAgMSA5MTczMzMzCiszNDYgMSA5MTk0NjY2CiszMzcgMSA5MjE2MDAwCiszNDEgMSA5MjM3MzMzCiszMzggMSA5MjU4NjY2CiszMjkgMSA5MjgwMDAwCiszNjAgMSA5MzAxMzMzCiszMzYgMSA5MzIyNjY2CiszNDEgMSA5MzQ0MDAwCiszNDEgMSA5MzY1MzMzCiszNDUgMSA5Mzg2NjY2CiszNTEgMSA5NDA4MDAwCiszNDkgMSA5NDI5MzMzCiszMzYgMSA5NDUwNjY2CiszMjYgMSA5NDcyMDAwCiszNDkgMSA5NDkzMzMzCiszNDMgMSA5NTE0NjY2CiszNTcgMSA5NTM2MDAwCiszNDIgMSA5NTU3MzMzCiszMjUgMSA5NTc4NjY2CiszNDYgMSA5NjAwMDAwCiszMjYgMSA5NjIxMzMzCis0MDIgMSA5NjQyNjY2CiszMzEgMSA5NjY0MDAwCiszMzkgMSA5Njg1MzMzCiszNzEgMSA5NzA2NjY2CiszMTQgMSA5NzI4MDAwCiszMTAgMSA5NzQ5MzMzCiszNjQgMSA5NzcwNjY2CiszMzggMSA5NzkyMDAwCiszMzkgMSA5ODEzMzMzCiszMzcgMSA5ODM0NjY2CiszNTUgMSA5ODU2MDAwCiszNTEgMSA5ODc3MzMzCiszMzIgMSA5ODk4NjY2CiszMTYgMSA5OTIwMDAwCis0NzQgMSA5OTQxMzMzCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouYW1yd2IgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouYW1yd2IKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ4MjU5MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YTYxZDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouaW5mbwpAQCAtMCwwICsxLDQ5NCBAQAorNDEgMSAwCis0MSAxIDIwMDAwCis0MSAxIDQwMDAwCis0MSAxIDYwMDAwCis0MSAxIDgwMDAwCis0MSAxIDEwMDAwMAorNDEgMSAxMjAwMDAKKzQxIDEgMTQwMDAwCis0MSAxIDE2MDAwMAorNDEgMSAxODAwMDAKKzQxIDEgMjAwMDAwCis0MSAxIDIyMDAwMAorNDEgMSAyNDAwMDAKKzQxIDEgMjYwMDAwCis0MSAxIDI4MDAwMAorNDEgMSAzMDAwMDAKKzQxIDEgMzIwMDAwCis0MSAxIDM0MDAwMAorNDEgMSAzNjAwMDAKKzQxIDEgMzgwMDAwCis0MSAxIDQwMDAwMAorNDEgMSA0MjAwMDAKKzQxIDEgNDQwMDAwCis0MSAxIDQ2MDAwMAorNDEgMSA0ODAwMDAKKzQxIDEgNTAwMDAwCis0MSAxIDUyMDAwMAorNDEgMSA1NDAwMDAKKzQxIDEgNTYwMDAwCis0MSAxIDU4MDAwMAorNDEgMSA2MDAwMDAKKzQxIDEgNjIwMDAwCis0MSAxIDY0MDAwMAorNDEgMSA2NjAwMDAKKzQxIDEgNjgwMDAwCis0MSAxIDcwMDAwMAorNDEgMSA3MjAwMDAKKzQxIDEgNzQwMDAwCis0MSAxIDc2MDAwMAorNDEgMSA3ODAwMDAKKzQxIDEgODAwMDAwCis0MSAxIDgyMDAwMAorNDEgMSA4NDAwMDAKKzQxIDEgODYwMDAwCis0MSAxIDg4MDAwMAorNDEgMSA5MDAwMDAKKzQxIDEgOTIwMDAwCis0MSAxIDk0MDAwMAorNDEgMSA5NjAwMDAKKzQxIDEgOTgwMDAwCis0MSAxIDEwMDAwMDAKKzQxIDEgMTAyMDAwMAorNDEgMSAxMDQwMDAwCis0MSAxIDEwNjAwMDAKKzQxIDEgMTA4MDAwMAorNDEgMSAxMTAwMDAwCis0MSAxIDExMjAwMDAKKzQxIDEgMTE0MDAwMAorNDEgMSAxMTYwMDAwCis0MSAxIDExODAwMDAKKzQxIDEgMTIwMDAwMAorNDEgMSAxMjIwMDAwCis0MSAxIDEyNDAwMDAKKzQxIDEgMTI2MDAwMAorNDEgMSAxMjgwMDAwCis0MSAxIDEzMDAwMDAKKzQxIDEgMTMyMDAwMAorNDEgMSAxMzQwMDAwCis0MSAxIDEzNjAwMDAKKzQxIDEgMTM4MDAwMAorNDEgMSAxNDAwMDAwCis0MSAxIDE0MjAwMDAKKzQxIDEgMTQ0MDAwMAorNDEgMSAxNDYwMDAwCis0MSAxIDE0ODAwMDAKKzQxIDEgMTUwMDAwMAorNDEgMSAxNTIwMDAwCis0MSAxIDE1NDAwMDAKKzQxIDEgMTU2MDAwMAorNDEgMSAxNTgwMDAwCis0MSAxIDE2MDAwMDAKKzQxIDEgMTYyMDAwMAorNDEgMSAxNjQwMDAwCis0MSAxIDE2NjAwMDAKKzQxIDEgMTY4MDAwMAorNDEgMSAxNzAwMDAwCis0MSAxIDE3MjAwMDAKKzQxIDEgMTc0MDAwMAorNDEgMSAxNzYwMDAwCis0MSAxIDE3ODAwMDAKKzQxIDEgMTgwMDAwMAorNDEgMSAxODIwMDAwCis0MSAxIDE4NDAwMDAKKzQxIDEgMTg2MDAwMAorNDEgMSAxODgwMDAwCis0MSAxIDE5MDAwMDAKKzQxIDEgMTkyMDAwMAorNDEgMSAxOTQwMDAwCis0MSAxIDE5NjAwMDAKKzQxIDEgMTk4MDAwMAorNDEgMSAyMDAwMDAwCis0MSAxIDIwMjAwMDAKKzQxIDEgMjA0MDAwMAorNDEgMSAyMDYwMDAwCis0MSAxIDIwODAwMDAKKzQxIDEgMjEwMDAwMAorNDEgMSAyMTIwMDAwCis0MSAxIDIxNDAwMDAKKzQxIDEgMjE2MDAwMAorNDEgMSAyMTgwMDAwCis0MSAxIDIyMDAwMDAKKzQxIDEgMjIyMDAwMAorNDEgMSAyMjQwMDAwCis0MSAxIDIyNjAwMDAKKzQxIDEgMjI4MDAwMAorNDEgMSAyMzAwMDAwCis0MSAxIDIzMjAwMDAKKzQxIDEgMjM0MDAwMAorNDEgMSAyMzYwMDAwCis0MSAxIDIzODAwMDAKKzQxIDEgMjQwMDAwMAorNDEgMSAyNDIwMDAwCis0MSAxIDI0NDAwMDAKKzQxIDEgMjQ2MDAwMAorNDEgMSAyNDgwMDAwCis0MSAxIDI1MDAwMDAKKzQxIDEgMjUyMDAwMAorNDEgMSAyNTQwMDAwCis0MSAxIDI1NjAwMDAKKzQxIDEgMjU4MDAwMAorNDEgMSAyNjAwMDAwCis0MSAxIDI2MjAwMDAKKzQxIDEgMjY0MDAwMAorNDEgMSAyNjYwMDAwCis0MSAxIDI2ODAwMDAKKzQxIDEgMjcwMDAwMAorNDEgMSAyNzIwMDAwCis0MSAxIDI3NDAwMDAKKzQxIDEgMjc2MDAwMAorNDEgMSAyNzgwMDAwCis0MSAxIDI4MDAwMDAKKzQxIDEgMjgyMDAwMAorNDEgMSAyODQwMDAwCis0MSAxIDI4NjAwMDAKKzQxIDEgMjg4MDAwMAorNDEgMSAyOTAwMDAwCis0MSAxIDI5MjAwMDAKKzQxIDEgMjk0MDAwMAorNDEgMSAyOTYwMDAwCis0MSAxIDI5ODAwMDAKKzQxIDEgMzAwMDAwMAorNDEgMSAzMDIwMDAwCis0MSAxIDMwNDAwMDAKKzQxIDEgMzA2MDAwMAorNDEgMSAzMDgwMDAwCis0MSAxIDMxMDAwMDAKKzQxIDEgMzEyMDAwMAorNDEgMSAzMTQwMDAwCis0MSAxIDMxNjAwMDAKKzQxIDEgMzE4MDAwMAorNDEgMSAzMjAwMDAwCis0MSAxIDMyMjAwMDAKKzQxIDEgMzI0MDAwMAorNDEgMSAzMjYwMDAwCis0MSAxIDMyODAwMDAKKzQxIDEgMzMwMDAwMAorNDEgMSAzMzIwMDAwCis0MSAxIDMzNDAwMDAKKzQxIDEgMzM2MDAwMAorNDEgMSAzMzgwMDAwCis0MSAxIDM0MDAwMDAKKzQxIDEgMzQyMDAwMAorNDEgMSAzNDQwMDAwCis0MSAxIDM0NjAwMDAKKzQxIDEgMzQ4MDAwMAorNDEgMSAzNTAwMDAwCis0MSAxIDM1MjAwMDAKKzQxIDEgMzU0MDAwMAorNDEgMSAzNTYwMDAwCis0MSAxIDM1ODAwMDAKKzQxIDEgMzYwMDAwMAorNDEgMSAzNjIwMDAwCis0MSAxIDM2NDAwMDAKKzQxIDEgMzY2MDAwMAorNDEgMSAzNjgwMDAwCis0MSAxIDM3MDAwMDAKKzQxIDEgMzcyMDAwMAorNDEgMSAzNzQwMDAwCis0MSAxIDM3NjAwMDAKKzQxIDEgMzc4MDAwMAorNDEgMSAzODAwMDAwCis0MSAxIDM4MjAwMDAKKzQxIDEgMzg0MDAwMAorNDEgMSAzODYwMDAwCis0MSAxIDM4ODAwMDAKKzQxIDEgMzkwMDAwMAorNDEgMSAzOTIwMDAwCis0MSAxIDM5NDAwMDAKKzQxIDEgMzk2MDAwMAorNDEgMSAzOTgwMDAwCis0MSAxIDQwMDAwMDAKKzQxIDEgNDAyMDAwMAorNDEgMSA0MDQwMDAwCis0MSAxIDQwNjAwMDAKKzQxIDEgNDA4MDAwMAorNDEgMSA0MTAwMDAwCis0MSAxIDQxMjAwMDAKKzQxIDEgNDE0MDAwMAorNDEgMSA0MTYwMDAwCis0MSAxIDQxODAwMDAKKzQxIDEgNDIwMDAwMAorNDEgMSA0MjIwMDAwCis0MSAxIDQyNDAwMDAKKzQxIDEgNDI2MDAwMAorNDEgMSA0MjgwMDAwCis0MSAxIDQzMDAwMDAKKzQxIDEgNDMyMDAwMAorNDEgMSA0MzQwMDAwCis0MSAxIDQzNjAwMDAKKzQxIDEgNDM4MDAwMAorNDEgMSA0NDAwMDAwCis0MSAxIDQ0MjAwMDAKKzQxIDEgNDQ0MDAwMAorNDEgMSA0NDYwMDAwCis0MSAxIDQ0ODAwMDAKKzQxIDEgNDUwMDAwMAorNDEgMSA0NTIwMDAwCis0MSAxIDQ1NDAwMDAKKzQxIDEgNDU2MDAwMAorNDEgMSA0NTgwMDAwCis0MSAxIDQ2MDAwMDAKKzQxIDEgNDYyMDAwMAorNDEgMSA0NjQwMDAwCis0MSAxIDQ2NjAwMDAKKzQxIDEgNDY4MDAwMAorNDEgMSA0NzAwMDAwCis0MSAxIDQ3MjAwMDAKKzQxIDEgNDc0MDAwMAorNDEgMSA0NzYwMDAwCis0MSAxIDQ3ODAwMDAKKzQxIDEgNDgwMDAwMAorNDEgMSA0ODIwMDAwCis0MSAxIDQ4NDAwMDAKKzQxIDEgNDg2MDAwMAorNDEgMSA0ODgwMDAwCis0MSAxIDQ5MDAwMDAKKzQxIDEgNDkyMDAwMAorNDEgMSA0OTQwMDAwCis0MSAxIDQ5NjAwMDAKKzQxIDEgNDk4MDAwMAorNDEgMSA1MDAwMDAwCis0MSAxIDUwMjAwMDAKKzQxIDEgNTA0MDAwMAorNDEgMSA1MDYwMDAwCis0MSAxIDUwODAwMDAKKzQxIDEgNTEwMDAwMAorNDEgMSA1MTIwMDAwCis0MSAxIDUxNDAwMDAKKzQxIDEgNTE2MDAwMAorNDEgMSA1MTgwMDAwCis0MSAxIDUyMDAwMDAKKzQxIDEgNTIyMDAwMAorNDEgMSA1MjQwMDAwCis0MSAxIDUyNjAwMDAKKzQxIDEgNTI4MDAwMAorNDEgMSA1MzAwMDAwCis0MSAxIDUzMjAwMDAKKzQxIDEgNTM0MDAwMAorNDEgMSA1MzYwMDAwCis0MSAxIDUzODAwMDAKKzQxIDEgNTQwMDAwMAorNDEgMSA1NDIwMDAwCis0MSAxIDU0NDAwMDAKKzQxIDEgNTQ2MDAwMAorNDEgMSA1NDgwMDAwCis0MSAxIDU1MDAwMDAKKzQxIDEgNTUyMDAwMAorNDEgMSA1NTQwMDAwCis0MSAxIDU1NjAwMDAKKzQxIDEgNTU4MDAwMAorNDEgMSA1NjAwMDAwCis0MSAxIDU2MjAwMDAKKzQxIDEgNTY0MDAwMAorNDEgMSA1NjYwMDAwCis0MSAxIDU2ODAwMDAKKzQxIDEgNTcwMDAwMAorNDEgMSA1NzIwMDAwCis0MSAxIDU3NDAwMDAKKzQxIDEgNTc2MDAwMAorNDEgMSA1NzgwMDAwCis0MSAxIDU4MDAwMDAKKzQxIDEgNTgyMDAwMAorNDEgMSA1ODQwMDAwCis0MSAxIDU4NjAwMDAKKzQxIDEgNTg4MDAwMAorNDEgMSA1OTAwMDAwCis0MSAxIDU5MjAwMDAKKzQxIDEgNTk0MDAwMAorNDEgMSA1OTYwMDAwCis0MSAxIDU5ODAwMDAKKzQxIDEgNjAwMDAwMAorNDEgMSA2MDIwMDAwCis0MSAxIDYwNDAwMDAKKzQxIDEgNjA2MDAwMAorNDEgMSA2MDgwMDAwCis0MSAxIDYxMDAwMDAKKzQxIDEgNjEyMDAwMAorNDEgMSA2MTQwMDAwCis0MSAxIDYxNjAwMDAKKzQxIDEgNjE4MDAwMAorNDEgMSA2MjAwMDAwCis0MSAxIDYyMjAwMDAKKzQxIDEgNjI0MDAwMAorNDEgMSA2MjYwMDAwCis0MSAxIDYyODAwMDAKKzQxIDEgNjMwMDAwMAorNDEgMSA2MzIwMDAwCis0MSAxIDYzNDAwMDAKKzQxIDEgNjM2MDAwMAorNDEgMSA2MzgwMDAwCis0MSAxIDY0MDAwMDAKKzQxIDEgNjQyMDAwMAorNDEgMSA2NDQwMDAwCis0MSAxIDY0NjAwMDAKKzQxIDEgNjQ4MDAwMAorNDEgMSA2NTAwMDAwCis0MSAxIDY1MjAwMDAKKzQxIDEgNjU0MDAwMAorNDEgMSA2NTYwMDAwCis0MSAxIDY1ODAwMDAKKzQxIDEgNjYwMDAwMAorNDEgMSA2NjIwMDAwCis0MSAxIDY2NDAwMDAKKzQxIDEgNjY2MDAwMAorNDEgMSA2NjgwMDAwCis0MSAxIDY3MDAwMDAKKzQxIDEgNjcyMDAwMAorNDEgMSA2NzQwMDAwCis0MSAxIDY3NjAwMDAKKzQxIDEgNjc4MDAwMAorNDEgMSA2ODAwMDAwCis0MSAxIDY4MjAwMDAKKzQxIDEgNjg0MDAwMAorNDEgMSA2ODYwMDAwCis0MSAxIDY4ODAwMDAKKzQxIDEgNjkwMDAwMAorNDEgMSA2OTIwMDAwCis0MSAxIDY5NDAwMDAKKzQxIDEgNjk2MDAwMAorNDEgMSA2OTgwMDAwCis0MSAxIDcwMDAwMDAKKzQxIDEgNzAyMDAwMAorNDEgMSA3MDQwMDAwCis0MSAxIDcwNjAwMDAKKzQxIDEgNzA4MDAwMAorNDEgMSA3MTAwMDAwCis0MSAxIDcxMjAwMDAKKzQxIDEgNzE0MDAwMAorNDEgMSA3MTYwMDAwCis0MSAxIDcxODAwMDAKKzQxIDEgNzIwMDAwMAorNDEgMSA3MjIwMDAwCis0MSAxIDcyNDAwMDAKKzQxIDEgNzI2MDAwMAorNDEgMSA3MjgwMDAwCis0MSAxIDczMDAwMDAKKzQxIDEgNzMyMDAwMAorNDEgMSA3MzQwMDAwCis0MSAxIDczNjAwMDAKKzQxIDEgNzM4MDAwMAorNDEgMSA3NDAwMDAwCis0MSAxIDc0MjAwMDAKKzQxIDEgNzQ0MDAwMAorNDEgMSA3NDYwMDAwCis0MSAxIDc0ODAwMDAKKzQxIDEgNzUwMDAwMAorNDEgMSA3NTIwMDAwCis0MSAxIDc1NDAwMDAKKzQxIDEgNzU2MDAwMAorNDEgMSA3NTgwMDAwCis0MSAxIDc2MDAwMDAKKzQxIDEgNzYyMDAwMAorNDEgMSA3NjQwMDAwCis0MSAxIDc2NjAwMDAKKzQxIDEgNzY4MDAwMAorNDEgMSA3NzAwMDAwCis0MSAxIDc3MjAwMDAKKzQxIDEgNzc0MDAwMAorNDEgMSA3NzYwMDAwCis0MSAxIDc3ODAwMDAKKzQxIDEgNzgwMDAwMAorNDEgMSA3ODIwMDAwCis0MSAxIDc4NDAwMDAKKzQxIDEgNzg2MDAwMAorNDEgMSA3ODgwMDAwCis0MSAxIDc5MDAwMDAKKzQxIDEgNzkyMDAwMAorNDEgMSA3OTQwMDAwCis0MSAxIDc5NjAwMDAKKzQxIDEgNzk4MDAwMAorNDEgMSA4MDAwMDAwCis0MSAxIDgwMjAwMDAKKzQxIDEgODA0MDAwMAorNDEgMSA4MDYwMDAwCis0MSAxIDgwODAwMDAKKzQxIDEgODEwMDAwMAorNDEgMSA4MTIwMDAwCis0MSAxIDgxNDAwMDAKKzQxIDEgODE2MDAwMAorNDEgMSA4MTgwMDAwCis0MSAxIDgyMDAwMDAKKzQxIDEgODIyMDAwMAorNDEgMSA4MjQwMDAwCis0MSAxIDgyNjAwMDAKKzQxIDEgODI4MDAwMAorNDEgMSA4MzAwMDAwCis0MSAxIDgzMjAwMDAKKzQxIDEgODM0MDAwMAorNDEgMSA4MzYwMDAwCis0MSAxIDgzODAwMDAKKzQxIDEgODQwMDAwMAorNDEgMSA4NDIwMDAwCis0MSAxIDg0NDAwMDAKKzQxIDEgODQ2MDAwMAorNDEgMSA4NDgwMDAwCis0MSAxIDg1MDAwMDAKKzQxIDEgODUyMDAwMAorNDEgMSA4NTQwMDAwCis0MSAxIDg1NjAwMDAKKzQxIDEgODU4MDAwMAorNDEgMSA4NjAwMDAwCis0MSAxIDg2MjAwMDAKKzQxIDEgODY0MDAwMAorNDEgMSA4NjYwMDAwCis0MSAxIDg2ODAwMDAKKzQxIDEgODcwMDAwMAorNDEgMSA4NzIwMDAwCis0MSAxIDg3NDAwMDAKKzQxIDEgODc2MDAwMAorNDEgMSA4NzgwMDAwCis0MSAxIDg4MDAwMDAKKzQxIDEgODgyMDAwMAorNDEgMSA4ODQwMDAwCis0MSAxIDg4NjAwMDAKKzQxIDEgODg4MDAwMAorNDEgMSA4OTAwMDAwCis0MSAxIDg5MjAwMDAKKzQxIDEgODk0MDAwMAorNDEgMSA4OTYwMDAwCis0MSAxIDg5ODAwMDAKKzQxIDEgOTAwMDAwMAorNDEgMSA5MDIwMDAwCis0MSAxIDkwNDAwMDAKKzQxIDEgOTA2MDAwMAorNDEgMSA5MDgwMDAwCis0MSAxIDkxMDAwMDAKKzQxIDEgOTEyMDAwMAorNDEgMSA5MTQwMDAwCis0MSAxIDkxNjAwMDAKKzQxIDEgOTE4MDAwMAorNDEgMSA5MjAwMDAwCis0MSAxIDkyMjAwMDAKKzQxIDEgOTI0MDAwMAorNDEgMSA5MjYwMDAwCis0MSAxIDkyODAwMDAKKzQxIDEgOTMwMDAwMAorNDEgMSA5MzIwMDAwCis0MSAxIDkzNDAwMDAKKzQxIDEgOTM2MDAwMAorNDEgMSA5MzgwMDAwCis0MSAxIDk0MDAwMDAKKzQxIDEgOTQyMDAwMAorNDEgMSA5NDQwMDAwCis0MSAxIDk0NjAwMDAKKzQxIDEgOTQ4MDAwMAorNDEgMSA5NTAwMDAwCis0MSAxIDk1MjAwMDAKKzQxIDEgOTU0MDAwMAorNDEgMSA5NTYwMDAwCis0MSAxIDk1ODAwMDAKKzQxIDEgOTYwMDAwMAorNDEgMSA5NjIwMDAwCis0MSAxIDk2NDAwMDAKKzQxIDEgOTY2MDAwMAorNDEgMSA5NjgwMDAwCis0MSAxIDk3MDAwMDAKKzQxIDEgOTcyMDAwMAorNDEgMSA5NzQwMDAwCis0MSAxIDk3NjAwMDAKKzQxIDEgOTc4MDAwMAorNDEgMSA5ODAwMDAwCis0MSAxIDk4MjAwMDAKKzQxIDEgOTg0MDAwMAorNDEgMSA5ODYwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHpfbXVsdGlfZnJhbWUuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoel9tdWx0aV9mcmFtZS5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MjAwMDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpAQCAtMCwwICsxLDQ2MCBAQAorNDEgMSAwCis0MSAxIDIwMDAwCis4MiAxIDQwMDAwCis4MiAxIDgwMDAwCis4MiAxIDEyMDAwMAorODIgMSAxNjAwMDAKKzgyIDEgMjAwMDAwCis4MiAxIDI0MDAwMAorODIgMSAyODAwMDAKKzgyIDEgMzIwMDAwCis4MiAxIDM2MDAwMAorMTIzIDEgNDAwMDAwCisxMjMgMSA0NjAwMDAKKzEyMyAxIDUyMDAwMAorMTIzIDEgNTgwMDAwCisxMjMgMSA2NDAwMDAKKzE2NCAxIDcwMDAwMAorMTY0IDEgNzgwMDAwCisxNjQgMSA4NjAwMDAKKzE2NCAxIDk0MDAwMAorMTY0IDEgMTAyMDAwMAorNDEgMSAxMTAwMDAwCis0MSAxIDExMjAwMDAKKzQxIDEgMTE0MDAwMAorNDEgMSAxMTYwMDAwCis0MSAxIDExODAwMDAKKzQxIDEgMTIwMDAwMAorNDEgMSAxMjIwMDAwCis0MSAxIDEyNDAwMDAKKzQxIDEgMTI2MDAwMAorNDEgMSAxMjgwMDAwCis0MSAxIDEzMDAwMDAKKzQxIDEgMTMyMDAwMAorNDEgMSAxMzQwMDAwCis0MSAxIDEzNjAwMDAKKzQxIDEgMTM4MDAwMAorNDEgMSAxNDAwMDAwCis0MSAxIDE0MjAwMDAKKzQxIDEgMTQ0MDAwMAorNDEgMSAxNDYwMDAwCis0MSAxIDE0ODAwMDAKKzQxIDEgMTUwMDAwMAorNDEgMSAxNTIwMDAwCis0MSAxIDE1NDAwMDAKKzQxIDEgMTU2MDAwMAorNDEgMSAxNTgwMDAwCis0MSAxIDE2MDAwMDAKKzQxIDEgMTYyMDAwMAorNDEgMSAxNjQwMDAwCis0MSAxIDE2NjAwMDAKKzQxIDEgMTY4MDAwMAorNDEgMSAxNzAwMDAwCis0MSAxIDE3MjAwMDAKKzQxIDEgMTc0MDAwMAorNDEgMSAxNzYwMDAwCis0MSAxIDE3ODAwMDAKKzQxIDEgMTgwMDAwMAorNDEgMSAxODIwMDAwCis0MSAxIDE4NDAwMDAKKzQxIDEgMTg2MDAwMAorNDEgMSAxODgwMDAwCis0MSAxIDE5MDAwMDAKKzQxIDEgMTkyMDAwMAorNDEgMSAxOTQwMDAwCis0MSAxIDE5NjAwMDAKKzQxIDEgMTk4MDAwMAorNDEgMSAyMDAwMDAwCis0MSAxIDIwMjAwMDAKKzQxIDEgMjA0MDAwMAorNDEgMSAyMDYwMDAwCis0MSAxIDIwODAwMDAKKzQxIDEgMjEwMDAwMAorNDEgMSAyMTIwMDAwCis0MSAxIDIxNDAwMDAKKzQxIDEgMjE2MDAwMAorNDEgMSAyMTgwMDAwCis0MSAxIDIyMDAwMDAKKzQxIDEgMjIyMDAwMAorNDEgMSAyMjQwMDAwCis0MSAxIDIyNjAwMDAKKzQxIDEgMjI4MDAwMAorNDEgMSAyMzAwMDAwCis0MSAxIDIzMjAwMDAKKzQxIDEgMjM0MDAwMAorNDEgMSAyMzYwMDAwCis0MSAxIDIzODAwMDAKKzQxIDEgMjQwMDAwMAorNDEgMSAyNDIwMDAwCis0MSAxIDI0NDAwMDAKKzQxIDEgMjQ2MDAwMAorNDEgMSAyNDgwMDAwCis0MSAxIDI1MDAwMDAKKzQxIDEgMjUyMDAwMAorNDEgMSAyNTQwMDAwCis0MSAxIDI1NjAwMDAKKzQxIDEgMjU4MDAwMAorNDEgMSAyNjAwMDAwCis0MSAxIDI2MjAwMDAKKzQxIDEgMjY0MDAwMAorNDEgMSAyNjYwMDAwCis0MSAxIDI2ODAwMDAKKzQxIDEgMjcwMDAwMAorNDEgMSAyNzIwMDAwCis0MSAxIDI3NDAwMDAKKzQxIDEgMjc2MDAwMAorNDEgMSAyNzgwMDAwCis0MSAxIDI4MDAwMDAKKzQxIDEgMjgyMDAwMAorNDEgMSAyODQwMDAwCis0MSAxIDI4NjAwMDAKKzQxIDEgMjg4MDAwMAorNDEgMSAyOTAwMDAwCis0MSAxIDI5MjAwMDAKKzQxIDEgMjk0MDAwMAorNDEgMSAyOTYwMDAwCis0MSAxIDI5ODAwMDAKKzQxIDEgMzAwMDAwMAorNDEgMSAzMDIwMDAwCis0MSAxIDMwNDAwMDAKKzQxIDEgMzA2MDAwMAorNDEgMSAzMDgwMDAwCis0MSAxIDMxMDAwMDAKKzQxIDEgMzEyMDAwMAorNDEgMSAzMTQwMDAwCis0MSAxIDMxNjAwMDAKKzQxIDEgMzE4MDAwMAorNDEgMSAzMjAwMDAwCis0MSAxIDMyMjAwMDAKKzQxIDEgMzI0MDAwMAorNDEgMSAzMjYwMDAwCis0MSAxIDMyODAwMDAKKzQxIDEgMzMwMDAwMAorNDEgMSAzMzIwMDAwCis0MSAxIDMzNDAwMDAKKzQxIDEgMzM2MDAwMAorNDEgMSAzMzgwMDAwCis0MSAxIDM0MDAwMDAKKzQxIDEgMzQyMDAwMAorNDEgMSAzNDQwMDAwCis0MSAxIDM0NjAwMDAKKzQxIDEgMzQ4MDAwMAorNDEgMSAzNTAwMDAwCis0MSAxIDM1MjAwMDAKKzQxIDEgMzU0MDAwMAorNDEgMSAzNTYwMDAwCis0MSAxIDM1ODAwMDAKKzQxIDEgMzYwMDAwMAorNDEgMSAzNjIwMDAwCis0MSAxIDM2NDAwMDAKKzQxIDEgMzY2MDAwMAorNDEgMSAzNjgwMDAwCis0MSAxIDM3MDAwMDAKKzQxIDEgMzcyMDAwMAorNDEgMSAzNzQwMDAwCis0MSAxIDM3NjAwMDAKKzQxIDEgMzc4MDAwMAorNDEgMSAzODAwMDAwCis0MSAxIDM4MjAwMDAKKzQxIDEgMzg0MDAwMAorNDEgMSAzODYwMDAwCis0MSAxIDM4ODAwMDAKKzQxIDEgMzkwMDAwMAorNDEgMSAzOTIwMDAwCis0MSAxIDM5NDAwMDAKKzQxIDEgMzk2MDAwMAorNDEgMSAzOTgwMDAwCis0MSAxIDQwMDAwMDAKKzQxIDEgNDAyMDAwMAorNDEgMSA0MDQwMDAwCis0MSAxIDQwNjAwMDAKKzQxIDEgNDA4MDAwMAorNDEgMSA0MTAwMDAwCis0MSAxIDQxMjAwMDAKKzQxIDEgNDE0MDAwMAorNDEgMSA0MTYwMDAwCis0MSAxIDQxODAwMDAKKzQxIDEgNDIwMDAwMAorNDEgMSA0MjIwMDAwCis0MSAxIDQyNDAwMDAKKzQxIDEgNDI2MDAwMAorNDEgMSA0MjgwMDAwCis0MSAxIDQzMDAwMDAKKzQxIDEgNDMyMDAwMAorNDEgMSA0MzQwMDAwCis0MSAxIDQzNjAwMDAKKzQxIDEgNDM4MDAwMAorNDEgMSA0NDAwMDAwCis0MSAxIDQ0MjAwMDAKKzQxIDEgNDQ0MDAwMAorNDEgMSA0NDYwMDAwCis0MSAxIDQ0ODAwMDAKKzQxIDEgNDUwMDAwMAorNDEgMSA0NTIwMDAwCis0MSAxIDQ1NDAwMDAKKzQxIDEgNDU2MDAwMAorNDEgMSA0NTgwMDAwCis0MSAxIDQ2MDAwMDAKKzQxIDEgNDYyMDAwMAorNDEgMSA0NjQwMDAwCis0MSAxIDQ2NjAwMDAKKzQxIDEgNDY4MDAwMAorNDEgMSA0NzAwMDAwCis0MSAxIDQ3MjAwMDAKKzQxIDEgNDc0MDAwMAorNDEgMSA0NzYwMDAwCis0MSAxIDQ3ODAwMDAKKzQxIDEgNDgwMDAwMAorNDEgMSA0ODIwMDAwCis0MSAxIDQ4NDAwMDAKKzQxIDEgNDg2MDAwMAorNDEgMSA0ODgwMDAwCis0MSAxIDQ5MDAwMDAKKzQxIDEgNDkyMDAwMAorNDEgMSA0OTQwMDAwCis0MSAxIDQ5NjAwMDAKKzQxIDEgNDk4MDAwMAorNDEgMSA1MDAwMDAwCis0MSAxIDUwMjAwMDAKKzQxIDEgNTA0MDAwMAorNDEgMSA1MDYwMDAwCis0MSAxIDUwODAwMDAKKzQxIDEgNTEwMDAwMAorNDEgMSA1MTIwMDAwCis0MSAxIDUxNDAwMDAKKzQxIDEgNTE2MDAwMAorNDEgMSA1MTgwMDAwCis0MSAxIDUyMDAwMDAKKzQxIDEgNTIyMDAwMAorNDEgMSA1MjQwMDAwCis0MSAxIDUyNjAwMDAKKzQxIDEgNTI4MDAwMAorNDEgMSA1MzAwMDAwCis0MSAxIDUzMjAwMDAKKzQxIDEgNTM0MDAwMAorNDEgMSA1MzYwMDAwCis0MSAxIDUzODAwMDAKKzQxIDEgNTQwMDAwMAorNDEgMSA1NDIwMDAwCis0MSAxIDU0NDAwMDAKKzQxIDEgNTQ2MDAwMAorNDEgMSA1NDgwMDAwCis0MSAxIDU1MDAwMDAKKzQxIDEgNTUyMDAwMAorNDEgMSA1NTQwMDAwCis0MSAxIDU1NjAwMDAKKzQxIDEgNTU4MDAwMAorNDEgMSA1NjAwMDAwCis0MSAxIDU2MjAwMDAKKzQxIDEgNTY0MDAwMAorNDEgMSA1NjYwMDAwCis0MSAxIDU2ODAwMDAKKzQxIDEgNTcwMDAwMAorNDEgMSA1NzIwMDAwCis0MSAxIDU3NDAwMDAKKzQxIDEgNTc2MDAwMAorNDEgMSA1NzgwMDAwCis0MSAxIDU4MDAwMDAKKzQxIDEgNTgyMDAwMAorNDEgMSA1ODQwMDAwCis0MSAxIDU4NjAwMDAKKzQxIDEgNTg4MDAwMAorNDEgMSA1OTAwMDAwCis0MSAxIDU5MjAwMDAKKzQxIDEgNTk0MDAwMAorNDEgMSA1OTYwMDAwCis0MSAxIDU5ODAwMDAKKzQxIDEgNjAwMDAwMAorNDEgMSA2MDIwMDAwCis0MSAxIDYwNDAwMDAKKzQxIDEgNjA2MDAwMAorNDEgMSA2MDgwMDAwCis0MSAxIDYxMDAwMDAKKzQxIDEgNjEyMDAwMAorNDEgMSA2MTQwMDAwCis0MSAxIDYxNjAwMDAKKzQxIDEgNjE4MDAwMAorNDEgMSA2MjAwMDAwCis0MSAxIDYyMjAwMDAKKzQxIDEgNjI0MDAwMAorNDEgMSA2MjYwMDAwCis0MSAxIDYyODAwMDAKKzQxIDEgNjMwMDAwMAorNDEgMSA2MzIwMDAwCis0MSAxIDYzNDAwMDAKKzQxIDEgNjM2MDAwMAorNDEgMSA2MzgwMDAwCis0MSAxIDY0MDAwMDAKKzQxIDEgNjQyMDAwMAorNDEgMSA2NDQwMDAwCis0MSAxIDY0NjAwMDAKKzQxIDEgNjQ4MDAwMAorNDEgMSA2NTAwMDAwCis0MSAxIDY1MjAwMDAKKzQxIDEgNjU0MDAwMAorNDEgMSA2NTYwMDAwCis0MSAxIDY1ODAwMDAKKzQxIDEgNjYwMDAwMAorNDEgMSA2NjIwMDAwCis0MSAxIDY2NDAwMDAKKzQxIDEgNjY2MDAwMAorNDEgMSA2NjgwMDAwCis0MSAxIDY3MDAwMDAKKzQxIDEgNjcyMDAwMAorNDEgMSA2NzQwMDAwCis0MSAxIDY3NjAwMDAKKzQxIDEgNjc4MDAwMAorNDEgMSA2ODAwMDAwCis0MSAxIDY4MjAwMDAKKzQxIDEgNjg0MDAwMAorNDEgMSA2ODYwMDAwCis0MSAxIDY4ODAwMDAKKzQxIDEgNjkwMDAwMAorNDEgMSA2OTIwMDAwCis0MSAxIDY5NDAwMDAKKzQxIDEgNjk2MDAwMAorNDEgMSA2OTgwMDAwCis0MSAxIDcwMDAwMDAKKzQxIDEgNzAyMDAwMAorNDEgMSA3MDQwMDAwCis0MSAxIDcwNjAwMDAKKzQxIDEgNzA4MDAwMAorNDEgMSA3MTAwMDAwCis0MSAxIDcxMjAwMDAKKzQxIDEgNzE0MDAwMAorNDEgMSA3MTYwMDAwCis0MSAxIDcxODAwMDAKKzQxIDEgNzIwMDAwMAorNDEgMSA3MjIwMDAwCis0MSAxIDcyNDAwMDAKKzQxIDEgNzI2MDAwMAorNDEgMSA3MjgwMDAwCis0MSAxIDczMDAwMDAKKzQxIDEgNzMyMDAwMAorNDEgMSA3MzQwMDAwCis0MSAxIDczNjAwMDAKKzQxIDEgNzM4MDAwMAorNDEgMSA3NDAwMDAwCis0MSAxIDc0MjAwMDAKKzQxIDEgNzQ0MDAwMAorNDEgMSA3NDYwMDAwCis0MSAxIDc0ODAwMDAKKzQxIDEgNzUwMDAwMAorNDEgMSA3NTIwMDAwCis0MSAxIDc1NDAwMDAKKzQxIDEgNzU2MDAwMAorNDEgMSA3NTgwMDAwCis0MSAxIDc2MDAwMDAKKzQxIDEgNzYyMDAwMAorNDEgMSA3NjQwMDAwCis0MSAxIDc2NjAwMDAKKzQxIDEgNzY4MDAwMAorNDEgMSA3NzAwMDAwCis0MSAxIDc3MjAwMDAKKzQxIDEgNzc0MDAwMAorNDEgMSA3NzYwMDAwCis0MSAxIDc3ODAwMDAKKzQxIDEgNzgwMDAwMAorNDEgMSA3ODIwMDAwCis0MSAxIDc4NDAwMDAKKzQxIDEgNzg2MDAwMAorNDEgMSA3ODgwMDAwCis0MSAxIDc5MDAwMDAKKzQxIDEgNzkyMDAwMAorNDEgMSA3OTQwMDAwCis0MSAxIDc5NjAwMDAKKzQxIDEgNzk4MDAwMAorNDEgMSA4MDAwMDAwCis0MSAxIDgwMjAwMDAKKzQxIDEgODA0MDAwMAorNDEgMSA4MDYwMDAwCis0MSAxIDgwODAwMDAKKzQxIDEgODEwMDAwMAorNDEgMSA4MTIwMDAwCis0MSAxIDgxNDAwMDAKKzQxIDEgODE2MDAwMAorNDEgMSA4MTgwMDAwCis0MSAxIDgyMDAwMDAKKzQxIDEgODIyMDAwMAorNDEgMSA4MjQwMDAwCis0MSAxIDgyNjAwMDAKKzQxIDEgODI4MDAwMAorNDEgMSA4MzAwMDAwCis0MSAxIDgzMjAwMDAKKzQxIDEgODM0MDAwMAorNDEgMSA4MzYwMDAwCis0MSAxIDgzODAwMDAKKzQxIDEgODQwMDAwMAorNDEgMSA4NDIwMDAwCis0MSAxIDg0NDAwMDAKKzQxIDEgODQ2MDAwMAorNDEgMSA4NDgwMDAwCis0MSAxIDg1MDAwMDAKKzQxIDEgODUyMDAwMAorNDEgMSA4NTQwMDAwCis0MSAxIDg1NjAwMDAKKzQxIDEgODU4MDAwMAorNDEgMSA4NjAwMDAwCis0MSAxIDg2MjAwMDAKKzQxIDEgODY0MDAwMAorNDEgMSA4NjYwMDAwCis0MSAxIDg2ODAwMDAKKzQxIDEgODcwMDAwMAorNDEgMSA4NzIwMDAwCis0MSAxIDg3NDAwMDAKKzQxIDEgODc2MDAwMAorNDEgMSA4NzgwMDAwCis0MSAxIDg4MDAwMDAKKzQxIDEgODgyMDAwMAorNDEgMSA4ODQwMDAwCis0MSAxIDg4NjAwMDAKKzQxIDEgODg4MDAwMAorNDEgMSA4OTAwMDAwCis0MSAxIDg5MjAwMDAKKzQxIDEgODk0MDAwMAorNDEgMSA4OTYwMDAwCis0MSAxIDg5ODAwMDAKKzQxIDEgOTAwMDAwMAorNDEgMSA5MDIwMDAwCis0MSAxIDkwNDAwMDAKKzQxIDEgOTA2MDAwMAorNDEgMSA5MDgwMDAwCis0MSAxIDkxMDAwMDAKKzQxIDEgOTEyMDAwMAorNDEgMSA5MTQwMDAwCis0MSAxIDkxNjAwMDAKKzQxIDEgOTE4MDAwMAorNDEgMSA5MjAwMDAwCis0MSAxIDkyMjAwMDAKKzQxIDEgOTI0MDAwMAorNDEgMSA5MjYwMDAwCis0MSAxIDkyODAwMDAKKzQxIDEgOTMwMDAwMAorNDEgMSA5MzIwMDAwCis0MSAxIDkzNDAwMDAKKzQxIDEgOTM2MDAwMAorNDEgMSA5MzgwMDAwCis0MSAxIDk0MDAwMDAKKzQxIDEgOTQyMDAwMAorNDEgMSA5NDQwMDAwCis0MSAxIDk0NjAwMDAKKzQxIDEgOTQ4MDAwMAorNDEgMSA5NTAwMDAwCis0MSAxIDk1MjAwMDAKKzQxIDEgOTU0MDAwMAorNDEgMSA5NTYwMDAwCis0MSAxIDk1ODAwMDAKKzQxIDEgOTYwMDAwMAorNDEgMSA5NjIwMDAwCis0MSAxIDk2NDAwMDAKKzQxIDEgOTY2MDAwMAorNDEgMSA5NjgwMDAwCis0MSAxIDk3MDAwMDAKKzQxIDEgOTcyMDAwMAorNDEgMSA5NzQwMDAwCis0MSAxIDk3NjAwMDAKKzQxIDEgOTc4MDAwMAorNDEgMSA5ODAwMDAwCis0MSAxIDk4MjAwMDAKKzQxIDEgOTg0MDAwMAorNDEgMSA5ODYwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfMTc2XzE0NC5hdjEgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfMTc2XzE0NC5hdjEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWQ2N2FmOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV8xNzZfMTQ0LmF2MQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfMTc2XzE0NC5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzE3Nl8xNDQuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYzUxMTY4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzE3Nl8xNDQuaW5mbwpAQCAtMCwwICsxLDMwMCBAQAorNjAyNyAxIDAKKzY4NzkgMCAzMzAwMAorNSAwIDY2MDAwCis1MzIgMCAxMDAwMDAKKzUgMCAxMzMwMDAKKzI0NTggMCAxNjYwMDAKKzUgMCAyMDAwMDAKKzQ3NSAwIDIzMzAwMAorNSAwIDI2NjAwMAorMTI2MiAwIDMwMDAwMAorNSAwIDMzMzAwMAorNTU0IDAgMzY2MDAwCisyNyAwIDQwMDAwMAorNjk3MSAwIDQzMzAwMAorNSAwIDQ2NjAwMAorNjAxIDAgNTAwMDAwCis1IDAgNTMzMDAwCiszMjc2IDAgNTY2MDAwCis1IDAgNjAwMDAwCis2NTggMCA2MzMwMDAKKzUgMCA2NjYwMDAKKzE2ODAgMCA3MDAwMDAKKzUgMCA3MzMwMDAKKzYxMCAwIDc2NjAwMAorMjQgMCA4MDAwMDAKKzY3MjggMCA4MzMwMDAKKzUgMCA4NjYwMDAKKzc2NCAwIDkwMDAwMAorNSAwIDkzMzAwMAorMjY1NiAwIDk2NjAwMAorNSAwIDEwMDAwMDAKKzQ2MiAwIDEwMzMwMDAKKzUgMCAxMDY2MDAwCisxNDU5IDAgMTEwMDAwMAorNSAwIDExMzMwMDAKKzYwOCAwIDExNjYwMDAKKzI0IDAgMTIwMDAwMAorNzAzOCAwIDEyMzMwMDAKKzUgMCAxMjY2MDAwCis3MjEgMCAxMzAwMDAwCis1IDAgMTMzMzAwMAorMzEwMiAwIDEzNjYwMDAKKzUgMCAxNDAwMDAwCis3NTIgMCAxNDMzMDAwCis1IDAgMTQ2NjAwMAorMTgxNSAwIDE1MDAwMDAKKzUgMCAxNTMzMDAwCis3NTUgMCAxNTY2MDAwCisyNSAwIDE2MDAwMDAKKzc2NTcgMCAxNjMzMDAwCis1IDAgMTY2NjAwMAorODUyIDAgMTcwMDAwMAorNSAwIDE3MzMwMDAKKzM1MzcgMCAxNzY2MDAwCis1IDAgMTgwMDAwMAorNjczIDAgMTgzMzAwMAorNSAwIDE4NjYwMDAKKzE3NzQgMCAxOTAwMDAwCis1IDAgMTkzMzAwMAorNTU0IDAgMTk2NjAwMAorMjQgMCAyMDAwMDAwCis4MDI4IDAgMjAzMzAwMAorNSAwIDIwNjYwMDAKKzcxNSAwIDIxMDAwMDAKKzUgMCAyMTMzMDAwCiszMzk1IDAgMjE2NjAwMAorNSAwIDIyMDAwMDAKKzczNiAwIDIyMzMwMDAKKzUgMCAyMjY2MDAwCisxNzU5IDAgMjMwMDAwMAorNSAwIDIzMzMwMDAKKzYwNSAwIDIzNjYwMDAKKzIzIDAgMjQwMDAwMAorNzY1MSAwIDI0MzMwMDAKKzUgMCAyNDY2MDAwCis2MTkgMCAyNTAwMDAwCis1IDAgMjUzMzAwMAorMjc4OCAwIDI1NjYwMDAKKzUgMCAyNjAwMDAwCis1NTYgMCAyNjMzMDAwCis1IDAgMjY2NjAwMAorMTMzNSAwIDI3MDAwMDAKKzUgMCAyNzMzMDAwCis1MjEgMCAyNzY2MDAwCisyNCAwIDI4MDAwMDAKKzIyNzQgMCAyODMzMDAwCis2NzYgMCAyODY2MDAwCisyNSAwIDI5MDAwMDAKKzYyMjQgMCAyOTMzMDAwCis1Nzk4IDAgMjk2NjAwMAorNSAwIDMwMDAwMDAKKzQ0OCAwIDMwMzMwMDAKKzUgMCAzMDY2MDAwCisxOTUwIDAgMzEwMDAwMAorNSAwIDMxMzMwMDAKKzM4NiAwIDMxNjYwMDAKKzUgMCAzMjAwMDAwCisxMjE4IDAgMzIzMzAwMAorNSAwIDMyNjYwMDAKKzEzMTYgMCAzMzAwMDAwCis1IDAgMzMzMzAwMAorNTgwIDAgMzM2NjAwMAorMjYgMCAzNDAwMDAwCis2NjczIDAgMzQzMzAwMAorNSAwIDM0NjYwMDAKKzQ3MyAwIDM1MDAwMDAKKzUgMCAzNTMzMDAwCisyNDY3IDAgMzU2NjAwMAorNSAwIDM2MDAwMDAKKzQyOSAwIDM2MzMwMDAKKzUgMCAzNjY2MDAwCisxNDIwIDAgMzcwMDAwMAorNSAwIDM3MzMwMDAKKzU4MyAwIDM3NjYwMDAKKzI5IDAgMzgwMDAwMAorODQ5MiAwIDM4MzMwMDAKKzUgMCAzODY2MDAwCis3MjAgMCAzOTAwMDAwCis1IDAgMzkzMzAwMAorMzYzNSAwIDM5NjYwMDAKKzUgMCA0MDAwMDAwCis2MjEgMCA0MDMzMDAwCis1IDAgNDA2NjAwMAorMTk2OSAwIDQxMDAwMDAKKzUgMCA0MTMzMDAwCis0OSAwIDQxNjYwMDAKKzI1IDAgNDIwMDAwMAorNzQxNiAwIDQyMzMwMDAKKzUgMCA0MjY2MDAwCis5NDcgMCA0MzAwMDAwCis1IDAgNDMzMzAwMAorMzcxMyAwIDQzNjYwMDAKKzUgMCA0NDAwMDAwCis3MTQgMCA0NDMzMDAwCis1IDAgNDQ2NjAwMAorMjAwMyAwIDQ1MDAwMDAKKzUgMCA0NTMzMDAwCis3NTAgMCA0NTY2MDAwCisyNSAwIDQ2MDAwMDAKKzg0NzAgMCA0NjMzMDAwCis1IDAgNDY2NjAwMAorNzM3IDAgNDcwMDAwMAorNSAwIDQ3MzMwMDAKKzQwOTQgMCA0NzY2MDAwCis1IDAgNDgwMDAwMAorMTAxOSAwIDQ4MzMwMDAKKzUgMCA0ODY2MDAwCisyMTYwIDAgNDkwMDAwMAorNSAwIDQ5MzMwMDAKKzgyOCAwIDQ5NjYwMDAKKzI0IDAgNTAwMDAwMAorOTI4MiAwIDUwMzMwMDAKKzUgMCA1MDY2MDAwCis2NTUgMCA1MTAwMDAwCis1IDAgNTEzMzAwMAorMzQ5MSAwIDUxNjYwMDAKKzUgMCA1MjAwMDAwCis2NTEgMCA1MjMzMDAwCis1IDAgNTI2NjAwMAorMTkwNiAwIDUzMDAwMDAKKzUgMCA1MzMzMDAwCis2NjIgMCA1MzY2MDAwCisyNCAwIDU0MDAwMDAKKzk3MjQgMCA1NDMzMDAwCis1IDAgNTQ2NjAwMAorNjE3IDAgNTUwMDAwMAorNSAwIDU1MzMwMDAKKzMxNDUgMCA1NTY2MDAwCis1IDAgNTYwMDAwMAorNTc4IDAgNTYzMzAwMAorNSAwIDU2NjYwMDAKKzE1OTIgMCA1NzAwMDAwCis1IDAgNTczMzAwMAorNTY5IDAgNTc2NjAwMAorMjUgMCA1ODAwMDAwCisxMDAxNSAwIDU4MzMwMDAKKzUgMCA1ODY2MDAwCis2MDkgMCA1OTAwMDAwCis1IDAgNTkzMzAwMAorMzYxOCAwIDU5NjYwMDAKKzUgMCA2MDAwMDAwCis3MzQgMCA2MDMzMDAwCis1IDAgNjA2NjAwMAorMTc0OCAwIDYxMDAwMDAKKzUgMCA2MTMzMDAwCis1NTAgMCA2MTY2MDAwCisyNCAwIDYyMDAwMDAKKzg4MDYgMCA2MjMzMDAwCis1IDAgNjI2NjAwMAorNDk4IDAgNjMwMDAwMAorNSAwIDYzMzMwMDAKKzI5MTMgMCA2MzY2MDAwCis1IDAgNjQwMDAwMAorNTk3IDAgNjQzMzAwMAorNSAwIDY0NjYwMDAKKzEyMzUgMCA2NTAwMDAwCis1IDAgNjUzMzAwMAorMzYyIDAgNjU2NjAwMAorMjQgMCA2NjAwMDAwCis2NTkyIDAgNjYzMzAwMAorNSAwIDY2NjYwMDAKKzQ2OCAwIDY3MDAwMDAKKzUgMCA2NzMzMDAwCisxOTIwIDAgNjc2NjAwMAorNSAwIDY4MDAwMDAKKzQxOSAwIDY4MzMwMDAKKzUgMCA2ODY2MDAwCis4NDMgMCA2OTAwMDAwCis1IDAgNjkzMzAwMAorMjM3IDAgNjk2NjAwMAorMjQgMCA3MDAwMDAwCisyNjg3IDAgNzAzMzAwMAorNSAwIDcwNjYwMDAKKzM5OSAwIDcxMDAwMDAKKzUgMCA3MTMzMDAwCisyMDAgMCA3MTY2MDAwCisxNDMgMCA3MjAwMDAwCisyNSAwIDcyMzMwMDAKKzEyNjAzIDAgNzI2NjAwMAorMTEzOSAwIDczMDAwMDAKKzUgMCA3MzMzMDAwCis1NiAwIDczNjYwMDAKKzUgMCA3NDAwMDAwCisyNzMgMCA3NDMzMDAwCis1IDAgNzQ2NjAwMAorNDggMCA3NTAwMDAwCis1IDAgNzUzMzAwMAorMTAyIDAgNzU2NjAwMAorNSAwIDc2MDAwMDAKKzM5IDAgNzYzMzAwMAorMjQgMCA3NjY2MDAwCiszNjM1IDAgNzcwMDAwMAorNSAwIDc3MzMwMDAKKzQ2IDAgNzc2NjAwMAorNSAwIDc4MDAwMDAKKzY0NyAwIDc4MzMwMDAKKzUgMCA3ODY2MDAwCis2MSAwIDc5MDAwMDAKKzUgMCA3OTMzMDAwCis4MjQgMCA3OTY2MDAwCis1IDAgODAwMDAwMAorNjkxIDAgODAzMzAwMAorMjcgMCA4MDY2MDAwCis0NTczIDAgODEwMDAwMAorNSAwIDgxMzMwMDAKKzQ3MyAwIDgxNjYwMDAKKzUgMCA4MjAwMDAwCisxNjM3IDAgODIzMzAwMAorNSAwIDgyNjYwMDAKKzQ1MSAwIDgzMDAwMDAKKzUgMCA4MzMzMDAwCis5NjkgMCA4MzY2MDAwCis1IDAgODQwMDAwMAorMjM0IDAgODQzMzAwMAorMjQgMCA4NDY2MDAwCiszMzYxIDAgODUwMDAwMAorNSAwIDg1MzMwMDAKKzE2OCAwIDg1NjYwMDAKKzUgMCA4NjAwMDAwCis2NjIgMCA4NjMzMDAwCis1IDAgODY2NjAwMAorMTI5IDAgODcwMDAwMAorNSAwIDg3MzMwMDAKKzQ0MyAwIDg3NjYwMDAKKzUgMCA4ODAwMDAwCisxODMgMCA4ODMzMDAwCisyMyAwIDg4NjYwMDAKKzI3NjkgMCA4OTAwMDAwCis1IDAgODkzMzAwMAorMTgyIDAgODk2NjAwMAorNSAwIDkwMDAwMDAKKzg5MCAwIDkwMzMwMDAKKzUgMCA5MDY2MDAwCisxNzEgMCA5MTAwMDAwCis1IDAgOTEzMzAwMAorNTk5IDAgOTE2NjAwMAorNSAwIDkyMDAwMDAKKzIzNiAwIDkyMzMwMDAKKzIzIDAgOTI2NjAwMAorMjMxNiAwIDkzMDAwMDAKKzUgMCA5MzMzMDAwCiszMzMgMCA5MzY2MDAwCis1IDAgOTQwMDAwMAorNzU5IDAgOTQzMzAwMAorNSAwIDk0NjYwMDAKKzIxMCAwIDk1MDAwMDAKKzUgMCA5NTMzMDAwCiszMjQgMCA5NTY2MDAwCis1IDAgOTYwMDAwMAorOTggMCA5NjMzMDAwCisyMyAwIDk2NjYwMDAKKzExMDcgMCA5NzAwMDAwCis1IDAgOTczMzAwMAorNDIgMCA5NzY2MDAwCis1IDAgOTgwMDAwMAorMTQ1IDAgOTgzMzAwMAorNSAwIDk4NjYwMDAKKzEwOSAwIDk5MDAwMDAKKzg5IDAgOTkzMzAwMAorMjQgMCA5OTY2MDAwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzY0MF8zNjAuYXYxIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzY0MF8zNjAuYXYxCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyOWJhY2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdjFfNjQwXzM2MC5hdjEKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXYxXzY0MF8zNjAuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV82NDBfMzYwLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhNzgzMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2MV82NDBfMzYwLmluZm8KQEAgLTAsMCArMSwxNjcgQEAKKzEyNTcxIDEgMAorOTg4MSAwIDMzMDAwCis1IDAgNjYwMDAKKzU0NCAwIDEwMDAwMAorNSAwIDEzMzAwMAorMjY0MiAwIDE2NjAwMAorNSAwIDIwMDAwMAorNTMxIDAgMjMzMDAwCis1IDAgMjY2MDAwCisxMzU5IDAgMzAwMDAwCis1IDAgMzMzMDAwCis1NTEgMCAzNjYwMDAKKzI4IDAgNDAwMDAwCisxMDc5MSAwIDQzMzAwMAorNSAwIDQ2NjAwMAorNjU1IDAgNTAwMDAwCis1IDAgNTMzMDAwCiszNzY5IDAgNTY2MDAwCis1IDAgNjAwMDAwCis3MTEgMCA2MzMwMDAKKzUgMCA2NjYwMDAKKzIwMDQgMCA3MDAwMDAKKzUgMCA3MzMwMDAKKzY1NyAwIDc2NjAwMAorMjYgMCA4MDAwMDAKKzg5NjkgMCA4MzMwMDAKKzUgMCA4NjYwMDAKKzYzMCAwIDkwMDAwMAorNSAwIDkzMzAwMAorMjc4NyAwIDk2NjAwMAorNSAwIDEwMDAwMDAKKzQwNCAwIDEwMzMwMDAKKzUgMCAxMDY2MDAwCisxNTE4IDAgMTEwMDAwMAorNSAwIDExMzMwMDAKKzQ5MyAwIDExNjYwMDAKKzI2IDAgMTIwMDAwMAorOTkwMCAwIDEyMzMwMDAKKzUgMCAxMjY2MDAwCis2MjAgMCAxMzAwMDAwCis1IDAgMTMzMzAwMAorMzA3MiAwIDEzNjYwMDAKKzUgMCAxNDAwMDAwCis2NjggMCAxNDMzMDAwCis1IDAgMTQ2NjAwMAorMTgyMSAwIDE1MDAwMDAKKzUgMCAxNTMzMDAwCis2ODIgMCAxNTY2MDAwCisyNiAwIDE2MDAwMDAKKzk1NjAgMCAxNjMzMDAwCis1IDAgMTY2NjAwMAorNjY3IDAgMTcwMDAwMAorNSAwIDE3MzMwMDAKKzMyNDkgMCAxNzY2MDAwCis1IDAgMTgwMDAwMAorNTg5IDAgMTgzMzAwMAorNSAwIDE4NjYwMDAKKzE4MTYgMCAxOTAwMDAwCis1IDAgMTkzMzAwMAorNTQ4IDAgMTk2NjAwMAorMjYgMCAyMDAwMDAwCis5OTE2IDAgMjAzMzAwMAorNSAwIDIwNjYwMDAKKzYyOCAwIDIxMDAwMDAKKzUgMCAyMTMzMDAwCiszMDM0IDAgMjE2NjAwMAorNSAwIDIyMDAwMDAKKzU5MCAwIDIyMzMwMDAKKzUgMCAyMjY2MDAwCisxNTgxIDAgMjMwMDAwMAorNSAwIDIzMzMwMDAKKzUyNCAwIDIzNjYwMDAKKzI2IDAgMjQwMDAwMAorODE4MiAwIDI0MzMwMDAKKzUgMCAyNDY2MDAwCis1NTIgMCAyNTAwMDAwCis1IDAgMjUzMzAwMAorMjQxMiAwIDI1NjYwMDAKKzUgMCAyNjAwMDAwCis0ODkgMCAyNjMzMDAwCis1IDAgMjY2NjAwMAorMTIyNyAwIDI3MDAwMDAKKzUgMCAyNzMzMDAwCis0MzIgMCAyNzY2MDAwCisyNiAwIDI4MDAwMDAKKzIwMTcgMCAyODMzMDAwCis1MTYgMCAyODY2MDAwCisyNiAwIDI5MDAwMDAKKzE2NjE5IDAgMjkzMzAwMAorNjcxMCAwIDI5NjYwMDAKKzUgMCAzMDAwMDAwCis0MjUgMCAzMDMzMDAwCis1IDAgMzA2NjAwMAorMTk2NCAwIDMxMDAwMDAKKzUgMCAzMTMzMDAwCiszODYgMCAzMTY2MDAwCis1IDAgMzIwMDAwMAorMTEyOSAwIDMyMzMwMDAKKzUgMCAzMjY2MDAwCisxMTU2IDAgMzMwMDAwMAorNSAwIDMzMzMwMDAKKzQ4NiAwIDMzNjYwMDAKKzI4IDAgMzQwMDAwMAorMTAzMDQgMCAzNDMzMDAwCis1IDAgMzQ2NjAwMAorNDEyIDAgMzUwMDAwMAorNSAwIDM1MzMwMDAKKzI2MDggMCAzNTY2MDAwCis1IDAgMzYwMDAwMAorMzk3IDAgMzYzMzAwMAorNSAwIDM2NjYwMDAKKzE1MTQgMCAzNzAwMDAwCis1IDAgMzczMzAwMAorNTMzIDAgMzc2NjAwMAorMjYgMCAzODAwMDAwCisxMTY5OCAwIDM4MzMwMDAKKzUgMCAzODY2MDAwCis1NDIgMCAzOTAwMDAwCis1IDAgMzkzMzAwMAorMzMzNCAwIDM5NjYwMDAKKzUgMCA0MDAwMDAwCis1NDcgMCA0MDMzMDAwCis1IDAgNDA2NjAwMAorMTgwOSAwIDQxMDAwMDAKKzUgMCA0MTMzMDAwCis1NSAwIDQxNjYwMDAKKzI2IDAgNDIwMDAwMAorOTQ5NiAwIDQyMzMwMDAKKzUgMCA0MjY2MDAwCis2NTggMCA0MzAwMDAwCis1IDAgNDMzMzAwMAorMzIzMiAwIDQzNjYwMDAKKzUgMCA0NDAwMDAwCis2MDAgMCA0NDMzMDAwCis1IDAgNDQ2NjAwMAorMTc2NiAwIDQ1MDAwMDAKKzUgMCA0NTMzMDAwCis1NTAgMCA0NTY2MDAwCisyNSAwIDQ2MDAwMDAKKzk5NTEgMCA0NjMzMDAwCis1IDAgNDY2NjAwMAorNjI0IDAgNDcwMDAwMAorNSAwIDQ3MzMwMDAKKzM2MTcgMCA0NzY2MDAwCis1IDAgNDgwMDAwMAorNjQ0IDAgNDgzMzAwMAorNSAwIDQ4NjYwMDAKKzE4NDEgMCA0OTAwMDAwCis1IDAgNDkzMzAwMAorNjQ5IDAgNDk2NjAwMAorMjUgMCA1MDAwMDAwCis5OTAxIDAgNTAzMzAwMAorNSAwIDUwNjYwMDAKKzUxNSAwIDUxMDAwMDAKKzUgMCA1MTMzMDAwCisyODE0IDAgNTE2NjAwMAorNSAwIDUyMDAwMDAKKzUxMSAwIDUyMzMwMDAKKzUgMCA1MjY2MDAwCisxNTIxIDAgNTMwMDAwMAorNSAwIDUzMzMwMDAKKzUwOSAwIDUzNjYwMDAKKzI2IDAgNTQwMDAwMAorMTA1NzkgMCA1NDMzMDAwCis1IDAgNTQ2NjAwMAorNTc1IDAgNTUwMDAwMAorNSAwIDU1MzMwMDAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmgyNjQgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmgyNjQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGExZTc1ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaDI2NApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ1NjMwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y18xNzZ4MTQ0XzMwMGticHNfNjBmcHMuaW5mbwpAQCAtMCwwICsxLDYyIEBACisyOCAzMiAwCisxMCAzMiAwCis0NzgwIDEgMzMzMzMKKzk2MCAwIDEwMDAwMAorNDgwIDAgNjY2NjYKKzI0NiAwIDUwMDAwCisyNjQgMCA4MzMzMworMTE2MCAwIDE2NjY2NgorNDA0IDAgMTMzMzMzCisyMzcgMCAxMTY2NjYKKzE5MyAwIDE1MDAwMAorOTM2IDAgMjMzMzMzCiszODQgMCAyMDAwMDAKKzE5OSAwIDE4MzMzMworMjc1IDAgMjE2NjY2CisxMDg2IDAgMzAwMDAwCis1MjAgMCAyNjY2NjYKKzMwMSAwIDI1MDAwMAorMjcwIDAgMjgzMzMzCisxMjMyIDAgMzY2NjY2Cis1NTkgMCAzMzMzMzMKKzI4NyAwIDMxNjY2NgorMjc0IDAgMzUwMDAwCisxMDg0IDAgNDMzMzMzCis0ODUgMCA0MDAwMDAKKzMwNyAwIDM4MzMzMworMjg0IDAgNDE2NjY2CisxMDUyIDAgNTAwMDAwCis1MDQgMCA0NjY2NjYKKzI5OCAwIDQ1MDAwMAorMzI3IDAgNDgzMzMzCisxMTg5IDAgNTY2NjY2CiszNTggMCA1MzMzMzMKKzE3MiAwIDUxNjY2NgorMTg1IDAgNTUwMDAwCisxMTE1IDAgNjMzMzMzCis0NjMgMCA2MDAwMDAKKzIxOCAwIDU4MzMzMworMjU1IDAgNjE2NjY2CisxMTU1IDAgNzAwMDAwCis2MjIgMCA2NjY2NjYKKzM1NiAwIDY1MDAwMAorMzQxIDAgNjgzMzMzCisxMjQwIDAgNzY2NjY2Cis2MTAgMCA3MzMzMzMKKzM0MSAwIDcxNjY2NgorMzgwIDAgNzUwMDAwCisxMzI2IDAgODMzMzMzCis2MjAgMCA4MDAwMDAKKzM5NiAwIDc4MzMzMworMzUzIDAgODE2NjY2CisxMTk2IDAgOTAwMDAwCis2MjMgMCA4NjY2NjYKKzM3NSAwIDg1MDAwMAorMzYyIDAgODgzMzMzCisxMTkyIDAgOTY2NjY2Cis2NTQgMCA5MzMzMzMKKzM1OSAwIDkxNjY2NgorMzUyIDAgOTUwMDAwCis4MjggMCAxMDE2NjY2Cis0MzYgMCA5ODMzMzMKKzQwMSAwIDEwMDAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaDI2NCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaDI2NApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDhjNjhmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5oMjY0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWYzYjliCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfYXZjXzY0MHgzNjBfNzY4a2Jwc18zMGZwcy5pbmZvCkBAIC0wLDAgKzEsMjQyIEBACisyOSAzMiAwCis5IDMyIDAKKzM4NDY5IDEgNjY2NjYKKzMyNzAgMCAyMDAwMDAKKzQ0MyAwIDEzMzMzMworMjQ2IDAgMTAwMDAwCisyMTQgMCAxNjY2NjYKKzIyODAgMCAzMDAwMDAKKzM2OCAwIDIzMzMzMworMjM4IDAgMjY2NjY2Cis2ODggMCA0MzMzMzMKKzI4NyAwIDM2NjY2NgorMjM0IDAgMzMzMzMzCisxNzIgMCA0MDAwMDAKKzEzNjMgMCA1NjY2NjYKKzI3MyAwIDUwMDAwMAorMTY2IDAgNDY2NjY2CisxODIgMCA1MzMzMzMKKzM3MzEgMCA3MDAwMDAKKzM0OSAwIDYzMzMzMworMjE2IDAgNjAwMDAwCisyMjkgMCA2NjY2NjYKKzYwNjEgMCA4MzMzMzMKKzQwOCAwIDc2NjY2NgorMjcxIDAgNzMzMzMzCisyNDEgMCA4MDAwMDAKKzcwMDQgMCA5NjY2NjYKKzQ0MiAwIDkwMDAwMAorMjYxIDAgODY2NjY2CisyMjkgMCA5MzMzMzMKKzczNTQgMCAxMTAwMDAwCis0MDQgMCAxMDMzMzMzCisyNjQgMCAxMDAwMDAwCisxOTggMCAxMDY2NjY2Cis0NTQyIDAgMTIzMzMzMworMjg2IDAgMTE2NjY2NgorMjA1IDAgMTEzMzMzMworMTMxIDAgMTIwMDAwMAorMzMyOSAwIDEzMzMzMzMKKzIxNiAwIDEyNjY2NjYKKzEzNiAwIDEzMDAwMDAKKzIzNTMgMCAxMzY2NjY2Cis5ODYgMCAxNDAwMDAwCis4MDggMCAxNDMzMzMzCiszMTggMCAxNDY2NjY2Cis2MiAwIDE1MDAwMDAKKzU1NjQ5IDEgMTUzMzMzMworMTYwNiAwIDE1NjY2NjYKKzI5MzUgMCAxNjAwMDAwCiszNTY0IDAgMTYzMzMzMworMzMyNCAwIDE2NjY2NjYKKzQ1NDMgMCAxNzAwMDAwCisxNzQwIDAgMTczMzMzMworMjczNyAwIDE3NjY2NjYKKzI3NjIgMCAxODAwMDAwCiszMTg1IDAgMTgzMzMzMworMzIzOCAwIDE4NjY2NjYKKzMzOTUgMCAxOTAwMDAwCiszNDIxIDAgMTkzMzMzMworMzQ4MiAwIDE5NjY2NjYKKzMzNzAgMCAyMDAwMDAwCiszNjU2IDAgMjAzMzMzMworMzUwOSAwIDIwNjY2NjYKKzM2ODQgMCAyMTAwMDAwCiszNzMyIDAgMjEzMzMzMworMzM2NiAwIDIxNjY2NjYKKzMzNzQgMCAyMjAwMDAwCiszMjAyIDAgMjIzMzMzMworMzQ0OSAwIDIyNjY2NjYKKzMzNjAgMCAyMzAwMDAwCiszMzcyIDAgMjMzMzMzMworMzQ2MCAwIDIzNjY2NjYKKzM1MTEgMCAyNDAwMDAwCiszNDcxIDAgMjQzMzMzMworMzMzMCAwIDI0NjY2NjYKKzMzNzcgMCAyNTAwMDAwCiszNzQ0IDAgMjUzMzMzMworMzY2NyAwIDI1NjY2NjYKKzM4NjcgMCAyNjAwMDAwCiszNzc2IDAgMjYzMzMzMworMzMyOSAwIDI2NjY2NjYKKzM4NzYgMCAyNzAwMDAwCiszMzg1IDAgMjczMzMzMworMzU2NiAwIDI3NjY2NjYKKzMzMDEgMCAyODAwMDAwCiszNTcwIDAgMjgzMzMzMworMzEzMiAwIDI4NjY2NjYKKzM0ODcgMCAyOTAwMDAwCiszMjcwIDAgMjkzMzMzMworMzQ3MiAwIDI5NjY2NjYKKzM0ODcgMCAzMDAwMDAwCiszNTAzIDAgMzAzMzMzMworMzQ0MyAwIDMwNjY2NjYKKzM1MjggMCAzMTAwMDAwCiszMjU4IDAgMzEzMzMzMworMzcwNyAwIDMxNjY2NjYKKzMxMjAgMCAzMjAwMDAwCiszMzQ3IDAgMzIzMzMzMworMzM3MiAwIDMyNjY2NjYKKzMxNjEgMCAzMzAwMDAwCiszMzkzIDAgMzMzMzMzMworMzM5OSAwIDMzNjY2NjYKKzI5MDUgMCAzNDAwMDAwCiszNTQzIDAgMzQzMzMzMworMzEwMyAwIDM0NjY2NjYKKzMwOTkgMCAzNTAwMDAwCiszNDU3IDAgMzUzMzMzMworMzE5MSAwIDM1NjY2NjYKKzMyOTAgMCAzNjAwMDAwCiszMzEyIDAgMzYzMzMzMworMjk1NSAwIDM2NjY2NjYKKzMzNDEgMCAzNzAwMDAwCiszMTAyIDAgMzczMzMzMworMzE4NiAwIDM3NjY2NjYKKzMxODAgMCAzODAwMDAwCisyODM5IDAgMzgzMzMzMworMzA4OSAwIDM4NjY2NjYKKzMxMTAgMCAzOTAwMDAwCiszMTY1IDAgMzkzMzMzMworMjY4NCAwIDM5NjY2NjYKKzMwODIgMCA0MDAwMDAwCisyNjk0IDAgNDAzMzMzMworMzA1MSAwIDQwNjY2NjYKKzMwMDIgMCA0MTAwMDAwCisyOTI5IDAgNDEzMzMzMworMjY3NiAwIDQxNjY2NjYKKzI0MTEgMCA0MjAwMDAwCisyODc0IDAgNDIzMzMzMworMjU3MiAwIDQyNjY2NjYKKzI0MjAgMCA0MzAwMDAwCisyNTAwIDAgNDMzMzMzMworMjEzNyAwIDQzNjY2NjYKKzIzNDQgMCA0NDAwMDAwCisyMDI4IDAgNDQzMzMzMworMTc1NCAwIDQ0NjY2NjYKKzE2MjcgMCA0NTAwMDAwCisxMzc1IDAgNDUzMzMzMworMTA2OSAwIDQ1NjY2NjYKKzgwMSAwIDQ2MDAwMDAKKzIxNjg5IDEgNDYzMzMzMworMjYxIDAgNDczMzMzMworNzYgMCA0NjY2NjY2Cis0NSAwIDQ3MDAwMDAKKzMzNCAwIDQ4MDAwMDAKKzYxIDAgNDc2NjY2NgorMTU3NyAwIDQ5MzMzMzMKKzI4MCAwIDQ4NjY2NjYKKzcyIDAgNDgzMzMzMworNDc5IDAgNDkwMDAwMAorMjE4MSAwIDUwNjY2NjYKKzkxOSAwIDUwMDAwMDAKKzM0OSAwIDQ5NjY2NjYKKzUzNCAwIDUwMzMzMzMKKzQ4NjAgMCA1MTY2NjY2Cis3NTkgMCA1MTAwMDAwCis2NzcgMCA1MTMzMzMzCiszMTAxIDAgNTMwMDAwMAorNDk4IDAgNTIzMzMzMworMzI3IDAgNTIwMDAwMAorMjEzIDAgNTI2NjY2NgorMTY0MCAwIDU0MzMzMzMKKzI1OSAwIDUzNjY2NjYKKzE2MiAwIDUzMzMzMzMKKzE0OCAwIDU0MDAwMDAKKzIxMzAgMCA1NTY2NjY2CiszOTcgMCA1NTAwMDAwCisxOTEgMCA1NDY2NjY2CisxODAgMCA1NTMzMzMzCisxNzU3IDAgNTcwMDAwMAorMzM4IDAgNTYzMzMzMworMTk0IDAgNTYwMDAwMAorMTQxIDAgNTY2NjY2NgorMTEwMyAwIDU4MzMzMzMKKzI4OSAwIDU3NjY2NjYKKzE0OSAwIDU3MzMzMzMKKzE0OCAwIDU4MDAwMDAKKzM5MTQgMCA1OTY2NjY2CisxMDI1IDAgNTkwMDAwMAorNzE0IDAgNTg2NjY2NgorNDI4IDAgNTkzMzMzMworNDYwNCAwIDYxMDAwMDAKKzE0NTYgMCA2MDMzMzMzCis2OTkgMCA2MDAwMDAwCis4OTIgMCA2MDY2NjY2Cis0NTM1IDAgNjIzMzMzMworMTMwMSAwIDYxNjY2NjYKKzcwOCAwIDYxMzMzMzMKKzU5MiAwIDYyMDAwMDAKKzIxNzUgMCA2MzMzMzMzCis2MDMgMCA2MjY2NjY2Cis0MTEgMCA2MzAwMDAwCisxODEzIDAgNjM2NjY2NgorNTA1NSAwIDY0NjY2NjYKKzE1MzggMCA2NDAwMDAwCisyMjAxIDAgNjQzMzMzMworNjI0OSAwIDY1MzMzMzMKKzE0MjAgMCA2NTAwMDAwCisyMjU0IDAgNjU2NjY2NgorMjQ0MSAwIDY2MzMzMzMKKzI5MyAwIDY2MDAwMDAKKzIwNjIgMCA2NzAwMDAwCisyMTMgMCA2NjY2NjY2CisyNDU1IDAgNjgwMDAwMAorMzQ0IDAgNjczMzMzMworMjA0IDAgNjc2NjY2NgorMzkyMCAwIDY5MzMzMzMKKzc1MSAwIDY4NjY2NjYKKzM3NiAwIDY4MzMzMzMKKzMzNyAwIDY5MDAwMDAKKzI4ODIgMCA3MDY2NjY2Cis0NTcgMCA3MDAwMDAwCisyMjIgMCA2OTY2NjY2CisxODQgMCA3MDMzMzMzCisyNzM0IDAgNzIwMDAwMAorNDcyIDAgNzEzMzMzMworMTg1IDAgNzEwMDAwMAorMjUwIDAgNzE2NjY2NgorMjczNSAwIDczMzMzMzMKKzMwMSAwIDcyNjY2NjYKKzMwNyAwIDcyMzMzMzMKKzEwOSAwIDczMDAwMDAKKzE4NTIgMCA3NDY2NjY2CiszMjIgMCA3NDAwMDAwCisxNTMgMCA3MzY2NjY2CisxOTUgMCA3NDMzMzMzCisxNTA2IDAgNzYwMDAwMAorMzUwIDAgNzUzMzMzMworMTcwIDAgNzUwMDAwMAorMTQ1IDAgNzU2NjY2NgorMjEyMyAwIDc3MzMzMzMKKzQzMCAwIDc2NjY2NjYKKzM2NCAwIDc2MzMzMzMKKzE5MCAwIDc3MDAwMDAKKzEyOTYgMCA3ODAwMDAwCisxOTYgMCA3NzY2NjY2Cis4NTggMCA3ODMzMzMzCiszODY1IDAgNzkzMzMzMworNjkzIDAgNzg2NjY2NgorMTYwNiAwIDc5MDAwMDAKKzQ4ODQgMCA3OTY2NjY2CisyODIxIDAgODAzMzMzMworMjIxMSAwIDgwMDAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5mbGFjIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmZsYWMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI5NGQ4ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5mbGFjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDM1NTI5NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5pbmZvCkBAIC0wLDAgKzEsNDE1IEBACis0MiAzMiAwCisxMzg2IDEgMAorMjQwMSAxIDI0MDAwCisyMzIxIDEgNDgwMDAKKzIzNjcgMSA3MjAwMAorMjM3MCAxIDk2MDAwCisyMzM0IDEgMTIwMDAwCisyMzk2IDEgMTQ0MDAwCisyMzc1IDEgMTY4MDAwCisyNDMxIDEgMTkyMDAwCisyNDI4IDEgMjE2MDAwCisyMzM0IDEgMjQwMDAwCisyMjYxIDEgMjY0MDAwCisyMTI0IDEgMjg4MDAwCisyMTUyIDEgMzEyMDAwCisyMjk1IDEgMzM2MDAwCisyMTgzIDEgMzYwMDAwCisyMzkzIDEgMzg0MDAwCisyNDAwIDEgNDA4MDAwCisyMjQ2IDEgNDMyMDAwCisyMjg5IDEgNDU2MDAwCisyNDAwIDEgNDgwMDAwCisyMzM1IDEgNTA0MDAwCisyMjk0IDEgNTI4MDAwCisyMjYwIDEgNTUyMDAwCisyMjA2IDEgNTc2MDAwCisyMTg1IDEgNjAwMDAwCisyMTU1IDEgNjI0MDAwCisyMTE4IDEgNjQ4MDAwCisyMDk0IDEgNjcyMDAwCisyMDUwIDEgNjk2MDAwCisyMDU5IDEgNzIwMDAwCisyMDMwIDEgNzQ0MDAwCisyMDIyIDEgNzY4MDAwCisyMDc4IDEgNzkyMDAwCisyMDgyIDEgODE2MDAwCisyMDk0IDEgODQwMDAwCisyMTExIDEgODY0MDAwCisyMDQzIDEgODg4MDAwCisyMDIzIDEgOTEyMDAwCisyMDI0IDEgOTM2MDAwCisyMDU2IDEgOTYwMDAwCisyMTA4IDEgOTg0MDAwCisyMTM4IDEgMTAwODAwMAorMjE0MCAxIDEwMzIwMDAKKzIxMTEgMSAxMDU2MDAwCisyMTEwIDEgMTA4MDAwMAorMjEzNyAxIDExMDQwMDAKKzIxNTcgMSAxMTI4MDAwCisyMTc0IDEgMTE1MjAwMAorMjIwMCAxIDExNzYwMDAKKzIyMDMgMSAxMjAwMDAwCisyMjM3IDEgMTIyNDAwMAorMjI2MSAxIDEyNDgwMDAKKzIyMTUgMSAxMjcyMDAwCisyMTMzIDEgMTI5NjAwMAorMjA5MSAxIDEzMjAwMDAKKzIwODggMSAxMzQ0MDAwCisyMTIyIDEgMTM2ODAwMAorMjEzOSAxIDEzOTIwMDAKKzIxNDYgMSAxNDE2MDAwCisyMjMxIDEgMTQ0MDAwMAorMjI4MiAxIDE0NjQwMDAKKzIyNzMgMSAxNDg4MDAwCisyMzA0IDEgMTUxMjAwMAorMjI5MiAxIDE1MzYwMDAKKzIyNTUgMSAxNTYwMDAwCisyMTgxIDEgMTU4NDAwMAorMjA4MSAxIDE2MDgwMDAKKzIwMTIgMSAxNjMyMDAwCisyMDExIDEgMTY1NjAwMAorMjA2NiAxIDE2ODAwMDAKKzIwNjkgMSAxNzA0MDAwCisyMTIwIDEgMTcyODAwMAorMjE0MSAxIDE3NTIwMDAKKzIxNDggMSAxNzc2MDAwCisyMTgxIDEgMTgwMDAwMAorMjE3NiAxIDE4MjQwMDAKKzIyNDAgMSAxODQ4MDAwCisyMjk3IDEgMTg3MjAwMAorMjMyNSAxIDE4OTYwMDAKKzIzMzYgMSAxOTIwMDAwCisyMzI5IDEgMTk0NDAwMAorMjI5OSAxIDE5NjgwMDAKKzIzMjIgMSAxOTkyMDAwCisyMzQ3IDEgMjAxNjAwMAorMjI4NyAxIDIwNDAwMDAKKzIyODYgMSAyMDY0MDAwCisyMjY5IDEgMjA4ODAwMAorMjMyMCAxIDIxMTIwMDAKKzIzMDUgMSAyMTM2MDAwCisyMzg0IDEgMjE2MDAwMAorMjQyOSAxIDIxODQwMDAKKzIzNzAgMSAyMjA4MDAwCisyMzY1IDEgMjIzMjAwMAorMjM2MSAxIDIyNTYwMDAKKzIzNzAgMSAyMjgwMDAwCisyMzkzIDEgMjMwNDAwMAorMjM0MiAxIDIzMjgwMDAKKzIzMjUgMSAyMzUyMDAwCisyMzM0IDEgMjM3NjAwMAorMjMxNiAxIDI0MDAwMDAKKzIzMTcgMSAyNDI0MDAwCisyMzA1IDEgMjQ0ODAwMAorMjM2MCAxIDI0NzIwMDAKKzIzMzEgMSAyNDk2MDAwCisyMzMyIDEgMjUyMDAwMAorMjM2MSAxIDI1NDQwMDAKKzI0MTcgMSAyNTY4MDAwCisyNDM4IDEgMjU5MjAwMAorMjQwMyAxIDI2MTYwMDAKKzIzODYgMSAyNjQwMDAwCisyMzgyIDEgMjY2NDAwMAorMjM1MCAxIDI2ODgwMDAKKzIzNTUgMSAyNzEyMDAwCisyMzgzIDEgMjczNjAwMAorMjM4NCAxIDI3NjAwMDAKKzIzODMgMSAyNzg0MDAwCisyMzczIDEgMjgwODAwMAorMjM3NCAxIDI4MzIwMDAKKzIzNDcgMSAyODU2MDAwCisyMzUzIDEgMjg4MDAwMAorMjM4MSAxIDI5MDQwMDAKKzI0MDEgMSAyOTI4MDAwCisyNDAxIDEgMjk1MjAwMAorMjM4NSAxIDI5NzYwMDAKKzIzODIgMSAzMDAwMDAwCisyMzI4IDEgMzAyNDAwMAorMjMwMyAxIDMwNDgwMDAKKzIyNzIgMSAzMDcyMDAwCisyMjcwIDEgMzA5NjAwMAorMjMxMiAxIDMxMjAwMDAKKzIyNzMgMSAzMTQ0MDAwCisyMzMwIDEgMzE2ODAwMAorMjMzOSAxIDMxOTIwMDAKKzIyOTYgMSAzMjE2MDAwCisyMzE3IDEgMzI0MDAwMAorMjQ0MCAxIDMyNjQwMDAKKzIzNTMgMSAzMjg4MDAwCisyMzQ2IDEgMzMxMjAwMAorMjMwMyAxIDMzMzYwMDAKKzIzMDggMSAzMzYwMDAwCisyMjg3IDEgMzM4NDAwMAorMjMxNiAxIDM0MDgwMDAKKzIzNjcgMSAzNDMyMDAwCisyMzM1IDEgMzQ1NjAwMAorMjM1MCAxIDM0ODAwMDAKKzIzOTUgMSAzNTA0MDAwCisyNDA4IDEgMzUyODAwMAorMjQxMyAxIDM1NTIwMDAKKzI0MTUgMSAzNTc2MDAwCisyNDY4IDEgMzYwMDAwMAorMjQzNyAxIDM2MjQwMDAKKzIzNzIgMSAzNjQ4MDAwCisyMzcxIDEgMzY3MjAwMAorMjM0MSAxIDM2OTYwMDAKKzIzMjggMSAzNzIwMDAwCisyMjczIDEgMzc0NDAwMAorMjI0NCAxIDM3NjgwMDAKKzIyMzMgMSAzNzkyMDAwCisyMjI5IDEgMzgxNjAwMAorMjI1MiAxIDM4NDAwMDAKKzIyMzYgMSAzODY0MDAwCisyMjE3IDEgMzg4ODAwMAorMjE3OSAxIDM5MTIwMDAKKzIyNTEgMSAzOTM2MDAwCisyMTkyIDEgMzk2MDAwMAorMjE5OSAxIDM5ODQwMDAKKzIyMTIgMSA0MDA4MDAwCisyMTkwIDEgNDAzMjAwMAorMjEwMiAxIDQwNTYwMDAKKzIxMjAgMSA0MDgwMDAwCisyMTY3IDEgNDEwNDAwMAorMjAyNCAxIDQxMjgwMDAKKzIwMTAgMSA0MTUyMDAwCisyMDY3IDEgNDE3NjAwMAorMjAzNSAxIDQyMDAwMDAKKzIwNTEgMSA0MjI0MDAwCisyMDEyIDEgNDI0ODAwMAorMjA2NiAxIDQyNzIwMDAKKzIwMjUgMSA0Mjk2MDAwCisxOTg3IDEgNDMyMDAwMAorMTk3MiAxIDQzNDQwMDAKKzE5NjYgMSA0MzY4MDAwCisxOTk5IDEgNDM5MjAwMAorMTk4NyAxIDQ0MTYwMDAKKzE5MjIgMSA0NDQwMDAwCisyMDIwIDEgNDQ2NDAwMAorMjA3MiAxIDQ0ODgwMDAKKzIwMjEgMSA0NTEyMDAwCisyMDE3IDEgNDUzNjAwMAorMjA5OSAxIDQ1NjAwMDAKKzIwNjQgMSA0NTg0MDAwCisyMTA5IDEgNDYwODAwMAorMjA5MyAxIDQ2MzIwMDAKKzIwOTAgMSA0NjU2MDAwCisyMTQ4IDEgNDY4MDAwMAorMjE4NCAxIDQ3MDQwMDAKKzIxNzkgMSA0NzI4MDAwCisyMTUyIDEgNDc1MjAwMAorMjE0MyAxIDQ3NzYwMDAKKzIxNTkgMSA0ODAwMDAwCisyMTIzIDEgNDgyNDAwMAorMjEyOSAxIDQ4NDgwMDAKKzIxNDcgMSA0ODcyMDAwCisyMTkyIDEgNDg5NjAwMAorMjA1MSAxIDQ5MjAwMDAKKzIxMTYgMSA0OTQ0MDAwCisyMTI0IDEgNDk2ODAwMAorMjA4OCAxIDQ5OTIwMDAKKzIwNzMgMSA1MDE2MDAwCisyMTQ2IDEgNTA0MDAwMAorMjEzMyAxIDUwNjQwMDAKKzIwNzMgMSA1MDg4MDAwCisyMDU5IDEgNTExMjAwMAorMjA0NCAxIDUxMzYwMDAKKzIwMTIgMSA1MTYwMDAwCisyMDM0IDEgNTE4NDAwMAorMjA1MyAxIDUyMDgwMDAKKzIwMTMgMSA1MjMyMDAwCisxOTgxIDEgNTI1NjAwMAorMjA5NCAxIDUyODAwMDAKKzIwNzYgMSA1MzA0MDAwCisxOTY4IDEgNTMyODAwMAorMjAyOCAxIDUzNTIwMDAKKzIwMzEgMSA1Mzc2MDAwCisyMDIwIDEgNTQwMDAwMAorMjAxOSAxIDU0MjQwMDAKKzIwMzAgMSA1NDQ4MDAwCisyMDE1IDEgNTQ3MjAwMAorMTk2MiAxIDU0OTYwMDAKKzIwNzAgMSA1NTIwMDAwCisyMDg3IDEgNTU0NDAwMAorMTk2NCAxIDU1NjgwMDAKKzIwNjkgMSA1NTkyMDAwCisyMDM0IDEgNTYxNjAwMAorMTk5NCAxIDU2NDAwMDAKKzE5ODUgMSA1NjY0MDAwCisyMDMwIDEgNTY4ODAwMAorMjA2NiAxIDU3MTIwMDAKKzE5NTQgMSA1NzM2MDAwCisxNzMzIDEgNTc2MDAwMAorMTY0OSAxIDU3ODQwMDAKKzE2NTIgMSA1ODA4MDAwCisxNjMxIDEgNTgzMjAwMAorMTY1NiAxIDU4NTYwMDAKKzE2NzIgMSA1ODgwMDAwCisxNjY3IDEgNTkwNDAwMAorMTY5NiAxIDU5MjgwMDAKKzE2NzIgMSA1OTUyMDAwCisxNzAxIDEgNTk3NjAwMAorMTY1MSAxIDYwMDAwMDAKKzE2NzQgMSA2MDI0MDAwCisxNjk1IDEgNjA0ODAwMAorMTcwMiAxIDYwNzIwMDAKKzE3MDcgMSA2MDk2MDAwCisxNjk0IDEgNjEyMDAwMAorMTcyNyAxIDYxNDQwMDAKKzE3MzAgMSA2MTY4MDAwCisxNzA4IDEgNjE5MjAwMAorMTcwNCAxIDYyMTYwMDAKKzE3MzUgMSA2MjQwMDAwCisxNzU4IDEgNjI2NDAwMAorMTc1MyAxIDYyODgwMDAKKzE3NDggMSA2MzEyMDAwCisxNzYzIDEgNjMzNjAwMAorMTczNyAxIDYzNjAwMDAKKzE3ODMgMSA2Mzg0MDAwCisxODM5IDEgNjQwODAwMAorMTg2MSAxIDY0MzIwMDAKKzE4MzIgMSA2NDU2MDAwCisxOTQ3IDEgNjQ4MDAwMAorMTkzOSAxIDY1MDQwMDAKKzE5MjYgMSA2NTI4MDAwCisxODk2IDEgNjU1MjAwMAorMTkwOSAxIDY1NzYwMDAKKzE4NjkgMSA2NjAwMDAwCisxOTAwIDEgNjYyNDAwMAorMTg5NiAxIDY2NDgwMDAKKzE4ODMgMSA2NjcyMDAwCisxOTAzIDEgNjY5NjAwMAorMTg5NSAxIDY3MjAwMDAKKzE4NjUgMSA2NzQ0MDAwCisxODc4IDEgNjc2ODAwMAorMTg4MSAxIDY3OTIwMDAKKzE4NjEgMSA2ODE2MDAwCisxNzkxIDEgNjg0MDAwMAorMTc4NyAxIDY4NjQwMDAKKzE3OTggMSA2ODg4MDAwCisxODExIDEgNjkxMjAwMAorMTgyNCAxIDY5MzYwMDAKKzE4OTUgMSA2OTYwMDAwCisyMDc5IDEgNjk4NDAwMAorMjAzNCAxIDcwMDgwMDAKKzIwMzggMSA3MDMyMDAwCisyMDE4IDEgNzA1NjAwMAorMjAzMCAxIDcwODAwMDAKKzIwNjcgMSA3MTA0MDAwCisxOTgyIDEgNzEyODAwMAorMTkxMSAxIDcxNTIwMDAKKzE5MDQgMSA3MTc2MDAwCisxODc0IDEgNzIwMDAwMAorMTg3NiAxIDcyMjQwMDAKKzE5NDQgMSA3MjQ4MDAwCisxOTc3IDEgNzI3MjAwMAorMTk3NyAxIDcyOTYwMDAKKzE5NzkgMSA3MzIwMDAwCisyMDEyIDEgNzM0NDAwMAorMTk2MSAxIDczNjgwMDAKKzE3NzMgMSA3MzkyMDAwCisxNzgwIDEgNzQxNjAwMAorMTgwMSAxIDc0NDAwMDAKKzE4OTIgMSA3NDY0MDAwCisxODY5IDEgNzQ4ODAwMAorMTkzNiAxIDc1MTIwMDAKKzIxNTQgMSA3NTM2MDAwCisyMjI2IDEgNzU2MDAwMAorMjE1OSAxIDc1ODQwMDAKKzIyNTMgMSA3NjA4MDAwCisyMjg2IDEgNzYzMjAwMAorMjIxNCAxIDc2NTYwMDAKKzIxMTEgMSA3NjgwMDAwCisyMDI3IDEgNzcwNDAwMAorMTk5NCAxIDc3MjgwMDAKKzE4ODIgMSA3NzUyMDAwCisxODg3IDEgNzc3NjAwMAorMTk5MyAxIDc4MDAwMDAKKzE5NjIgMSA3ODI0MDAwCisxOTgyIDEgNzg0ODAwMAorMTk2NiAxIDc4NzIwMDAKKzE5NjIgMSA3ODk2MDAwCisxOTI4IDEgNzkyMDAwMAorMTg3OCAxIDc5NDQwMDAKKzE4NTcgMSA3OTY4MDAwCisxODg1IDEgNzk5MjAwMAorMTkxOSAxIDgwMTYwMDAKKzE5MDQgMSA4MDQwMDAwCisxOTA5IDEgODA2NDAwMAorMTkwOSAxIDgwODgwMDAKKzE5MzMgMSA4MTEyMDAwCisxODI0IDEgODEzNjAwMAorMTc1NiAxIDgxNjAwMDAKKzE3MzMgMSA4MTg0MDAwCisxNzA1IDEgODIwODAwMAorMTc1NSAxIDgyMzIwMDAKKzE3NTYgMSA4MjU2MDAwCisxNzI1IDEgODI4MDAwMAorMTc2MSAxIDgzMDQwMDAKKzE3MzYgMSA4MzI4MDAwCisxNzA2IDEgODM1MjAwMAorMTY2MiAxIDgzNzYwMDAKKzE2MDQgMSA4NDAwMDAwCisxNjEzIDEgODQyNDAwMAorMTY5MiAxIDg0NDgwMDAKKzE3MzYgMSA4NDcyMDAwCisxNzc5IDEgODQ5NjAwMAorMTc2OCAxIDg1MjAwMDAKKzE3NTggMSA4NTQ0MDAwCisxNzA4IDEgODU2ODAwMAorMTY0MiAxIDg1OTIwMDAKKzE2NDUgMSA4NjE2MDAwCisxNTgxIDEgODY0MDAwMAorMTY1MSAxIDg2NjQwMDAKKzE3MzEgMSA4Njg4MDAwCisxNzQzIDEgODcxMjAwMAorMTcxNyAxIDg3MzYwMDAKKzE3MTUgMSA4NzYwMDAwCisxNjQ2IDEgODc4NDAwMAorMTU1MSAxIDg4MDgwMDAKKzE1NjMgMSA4ODMyMDAwCisxNjQ5IDEgODg1NjAwMAorMTc0MiAxIDg4ODAwMDAKKzE3MjQgMSA4OTA0MDAwCisxNjc2IDEgODkyODAwMAorMTY2NCAxIDg5NTIwMDAKKzE1ODcgMSA4OTc2MDAwCisxNDk3IDEgOTAwMDAwMAorMTUwMyAxIDkwMjQwMDAKKzE2NDQgMSA5MDQ4MDAwCisxNjU4IDEgOTA3MjAwMAorMTY4MCAxIDkwOTYwMDAKKzE2MTEgMSA5MTIwMDAwCisxNjk0IDEgOTE0NDAwMAorMTY2OCAxIDkxNjgwMDAKKzE2NzcgMSA5MTkyMDAwCisxNjA0IDEgOTIxNjAwMAorMTU2NyAxIDkyNDAwMDAKKzE2MzkgMSA5MjY0MDAwCisxNTUyIDEgOTI4ODAwMAorMTQ4NiAxIDkzMTIwMDAKKzE0OTQgMSA5MzM2MDAwCisxNDgwIDEgOTM2MDAwMAorMTUwOSAxIDkzODQwMDAKKzE0NTcgMSA5NDA4MDAwCisxNDIzIDEgOTQzMjAwMAorMTQ1OSAxIDk0NTYwMDAKKzE0NDQgMSA5NDgwMDAwCisxNDI0IDEgOTUwNDAwMAorMTQxMyAxIDk1MjgwMDAKKzE0OTggMSA5NTUyMDAwCisxNDU1IDEgOTU3NjAwMAorMTM5MyAxIDk2MDAwMDAKKzE2MzggMSA5NjI0MDAwCisxOTE5IDEgOTY0ODAwMAorMTk3OSAxIDk2NzIwMDAKKzE4OTQgMSA5Njk2MDAwCisyMDAyIDEgOTcyMDAwMAorMjA2MiAxIDk3NDQwMDAKKzIwOTggMSA5NzY4MDAwCisxOTE5IDEgOTc5MjAwMAorMTczOCAxIDk4MTYwMDAKKzE4OTAgMSA5ODQwMDAwCisxOTcxIDEgOTg2NDAwMAorMjQyOSAxIDk4ODgwMDAKKzE4NjEgMSA5OTEyMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExYWxhd18xY2hfOGtoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMWFsYXdfMWNoXzhraHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmU1NDgwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMWFsYXdfMWNoXzhraHouaW5mbwpAQCAtMCwwICsxLDEwIEBACis4MTkyIDEgMAorODE5MiAxIDEwMjQwMDAKKzgxOTIgMSAyMDQ4MDAwCis4MTkyIDEgMzA3MjAwMAorODE5MiAxIDQwOTYwMDAKKzgxOTIgMSA1MTIwMDAwCis4MTkyIDEgNjE0NDAwMAorODE5MiAxIDcxNjgwMDAKKzgxOTIgMSA4MTkyMDAwCis1NDYyIDEgOTIxNjAwMApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFhbGF3XzFjaF84a2h6LnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFhbGF3XzFjaF84a2h6LnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmM0YTExCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMWFsYXdfMWNoXzhraHoucmF3CkBAIC0wLDAgKzEgQEAKK2tvZ0/HxdjVSnZDdXNY09VJdkp+fUt1WV3ByMT09PTK2ElydEJSVPP5x9rG1lTF+ezs4//VT2Vifdn+7enr4cFbc2dnRPTl4ODg5cZeTExLf2VaUUnZ9/HzUHZ4bm1wVeTt5P7cYGgXFGZ2+ejv5ufDdWdtf3Rld1hb319Y2MTUz8/YwVjQ1nllf2dxUtv45f/h+FRHZXNGfE/C9cnQWd9ZdcLm75XmyEprEBFrd/jrkJfnx3diaW1M+eTm7OTYQ3p8eWJww+Xj5+Ho+Ft2eHhKQvT/9f70XXFnYXVf3fvg4+XCxlZlfFXBVE9wSXBgZHHQ9MH35NhMQkZLcmV2dHlzZ2Z9c0/UQnFS3NxGcdzNTk5NcXdawvvn5fv02XNpYdj74+jq7f1bZWJm3OTpl5Xo7/hZeGR4fEr35+TolOri2HN4Z2ZmecT82VBMZGZ7T9rM9vHRQHFgb3pAzuX/y9pffWJsQ/Dl5/ndRmZpbWJkW83k5VZGSHJ8fGR2XNjHX0Xb1klwYX7Q9vrj5/BSfH9gb3Dx7ZTt+PREZG5rZN3kl5aV6+791XBwQ0TY9vHNycT28d1bx8NTf3tS09zMz1TcU1fUUNXOycjVdkZFVvf4zV1xS3JjZ1Xk7efG1Ehga25jfnfD+8lTQUN3eGNmZHh+e2ZnZ3xMZGZ80/XF1fb30E1/Z2dnRufpl5GRl+FCfUzc7ZeTnJOV7dR4fHX05fXx/NLF28DxU3VccWZne1jEQXNLd1tXTV5Yc3ZyYX1FzeD48f9Tcn1gZXJP5eng5/ZcdGoQamTZ4eb6zHZmb2pgQ9Hz8FNOc3p/eGNnYH3Z38Hn5OfIeHp8QPzk5eL/2FVzf0jW5O7o6uLm4fjYXlHE9vfCxvHy89jQzM7Pw0R5Z2ZzRNny/ubu58dfWt9XTXZ9T9NYRNzJyFd4YmttTN/+5cBOZGkXExVz1tvdTXZOf2RjenVHUM79/PnwUHZ+ZUDM5OHk//vC1dN1UPD3z8b04P/QXXljZHDN7e3v4fBcZGFFyvrm+dBEWl5UxuCU6uT1WnVyZHxXxPrj65fg/PBQe2FjSMzw+cRLc2NraRVid9bSV17UfG5rahVrYUHNw99dU2Rsbn3F9//6ykF1fnJyWPzn9cjD/ef95OTx10RFx9XP4e3gykZCREnW1sbC293dU1XT3Vx1SkJcX11VXkBQ2Pj6zMvMRH1nSOXtlZbq7+Tx+v/x5efm5P7h7uD7235rFWJayfrs7vBnFh0QF2tnc3lkbxQREhFvYXFX1NFGfGEVF2llUsD3//z3SWRlcETdwcvXd3RIXMbB9+f48Mfd21d2fGZlVfLl+/vn5VFKS1P24JWX78NAc3ly1OWUlOzj5OTj5vfA1fDk4eiXle/7wvbA2sTFU1hxUsPc3FpxfXtjYmx6TkpzeW8Va2BxX1VBe2lrFxRjSEB9ZmRf2sjN1FdRckHX383Iz15+TsbR2vbx/f7z91pD0fDm5fT1+cJOdlzXV8X44eDi5UdmbWJF5euRkJGV/MjGQdPk7eji4Oz3UFNTzPdRUMTP2sXC32doYmV8dkVxeGNua29tfEZGd2R8dWZoZHpzcEtQS39HU0F0YWRNwtvEwchGfHRc8u2V4MxZVlPf38PLzcLYy/j7wMrSfW1hSNnO5+zt4M5NfHFySlrEx8vk4eTl5PHS9ePv6JSX7v1fS1/P99jYwtpT2MVRSUV3ZWRkeHh9f2FvY2R+c3p7Sn1uExJqbXhQ9v7y3EdKSV7F8eXw0vTNUVpERtb15efN0NtIZGxpe15c2/rl80R5cmJufVtVwN704+bn+1fXx8TtlJedk+n6w8jm5efp5Pn918HN1N7zztx3ekVeSFJOd0F9cEFzeH5sahVqfEB3XE96eHp0XHNmZWZ+S0j3+8NRQU9Y1vb48vXHW0N2Z0nZ9vnzx9BGddHWQFLcVNdUx/bwUHlndnFN9v3+5+Dt4d5AcHNOV8vl5Pr9y/HBzOX8xP76/srN1lTX3fP55vrK01p4ZXBe31XW21hLUnZ/TVdXydNYR0pBfmBgYmJY8OX5xtNQZWF2cdH/ycLPcWNmZGZlZX9zStJVcmxqaGdN/eHJ1dd2TXdsZlBVwPPG2sD+7+vj+sDa8/rj4/n44fri7Ofg48jN8NFMXcX45fTxyP7z0d/DTtfJ2PdbZnlyYH58Z2ZLXtrSTkpIQHN8fH9qYXdxdEh82tlkTHFmcFhf/vdTcXl+enfN/P/t/VBkaGlzWcnm/cXFysj+3nd30FRV8Pvzx9FGWUpwQ/Pz9sxFSVzS8+Dl5ebj/cvOWHXFzMP/8Pzj4PdfeXl1z+2UlOdGcnxlTFFEz/jb2N5/ZmV/S0J3c3x1QnRCfWBySXxZWUL01n5zYGplQVTQWkJNRt1WXs1YdVZGd1tzfEBPQtZMctjJ8fjOQFtSzv7/+tZE2NTF4+HvlODyzlzG5+Tj/tZAWdr/5+zj8vPVZWB6ekXY9/jk98XO38ZVdXBG2frk90B+dnB2195W9sxQS2VmcEhJcnl2dUx8YW1rExEUamBleH1/Y21tY2RT/+flyUh4eX7X8fXM5uD7/vP95uDt6u/n+ebh+vD95ePo75WU7ePgydLFxfDl5OX6wEJydnB5eH1JXN7K8lNnZ3J0Ud7f9vj30VB3c1/KwkNzZWd6entwZWV9e2R6ZXxzYGxjZ2xoYXthYGJqFWxhfn1nc9L+4Ob22sXH8+Tl/efp7uDh4ePo6urq6ePs6O/m+f7l5+Hi7uP5/8RNfXxlZXJxRER9YWF+fH9JRNz1+/rPfGxhen53R1fN9M3aWX5zTEdDRNFQRUZOdnx/dd7N2thbc2Rvbm1pFGhgYWJpFRYWFWlhZ2RwX9VQREtN0f3i6ezt6pGWkZCTnZ2cnJ+SkJCW6ODn5+Dj4fvJdWdncEnfzt3W1FJGfGNgZH5zdU/Uw/b2wVB9c1fe1dxRRVTT3srfQE5zf3l5ZGRmZmFjYmJ6X1xERXxnZmBmfGBsYm5uaRVrbmxnfHNwQlPD3N/eXtHP8Pnk8/3h5/rk5Ozu65aTkJeU7ujo6pSVlpGXleTb1NrEw/TL8/H/+dx0fXBczfPx+f3MzFRWTXNJX0x1S3x6emRnbWlvbGdkYGwVEREVbmNmZHpmbGkVFGl+TFNWRVjR3dVYQEdU8uTl98bGz8TC8v3w8vP1ydjR3PfL9vz8/P/m4eX2zsj0/Obj4+Pp6pXv/vnh7ebl5frl4O7v5/Py5+bk5/3z9c/CVX1taBUVaG1vahVqaBUQFhVpbmpqFhYUb3xMdkJTVNdfc3tkfVnX31Jc0VZQWXFwTdz55/bH9fz65OHn+P777Ojj/sTc0VPQ1Njx5ef+V3RHWsnm4O3m+Pr000dG2/fz5eHl//P8+fTx8Pvs7Oji/vLLysBedHpnenl/cGdhfHtwc2R+Z2xpFBcTHRAXa21vYmFtbWJvYmF3197DQXRFcVrfRF7TxuXn/fD08/b3/NlQyv7h4vvy8vD+5uDn/uT4++fx9Pzx+u/s7O7ole3zRHpcw/Dt5M7I0VfHVNH85OPi4+H1y8VYWHFkfHFwTHVhahRuZ3RyY2BuFxUXF2tteHllYWlsZmNhZmltfn1GQH19ZGRke3xyVvPk4OXbV9jO/+Tk/s/w8/b82cXz+umV4//x9cv198rw4eLj6fvP/vv7/fTLyfHKw/fP2v3l5ef99vrk7ejj8V9RVVvRU3Fxcnl0dH58d0Z3YWoRFxcWahcSExEUb2NhYWZkYmNmYnHBwMjYUdHRUNbUTEpRzvz7915OSnBcxcrPzfXZVllG1P3m7OP8+efn4ub55+bi7eno4Obm+/HMx8P8++b698JCWtH0/vX++vnm/dZbUtre0V5JZ2BibHhnZnl9R3VnYWNgYWFgYWZleX5IfmRzSl1eTnBldkhzcXdwe2d7SXdzd0lU1k5/ZEnfxPP311tS3v/n/vT1/PLCyPf74uHm5Pz+/OTol5Xh4+Dn5Pry+pWVl5aU6OTm5uflyfX0wsd3YGJ8f3x0Z20UFxRoYWtrY2RxZnh4dUR5ZGluYmR1WMV1c3FhfGV+dl/J2t5DfmNgT9f23VjUdkV2e3xwUFHKzUJxfVpdx83L5fnh5uTg+uLj4+3n5uTn4uns4O3n4Ob45v35+vrlwFNf9ePv7OH+VX95fF9GQVRfSW4REhdnfUNCcHB4ZGFkfnp8cEF0ZGdlU0R1T3xweXh8RlJN0sH0x0xxedbJ9MxaW39kYWVGS1pc3cFacHrXysr9xc9USVTT+vnw+fjlz8Pe/+Pj7+fh4fH3yebt4+Lg7OT02/Tt65Xj5PJX1lbf29bTUtJYeG1obWBlYWR1f3hkdkB2fGRwdGRtaWJ7dXlne2NjZnxFUcPUX1hyf3te8OX5UUFwYWZ/VdPRREDWSnJ6dMz18/XCztnawP/l5uPn4eTk/vbh4+7u4OHl5+Tt7ubm+/jxxl1B8/n/+NnWQFtbUvfAxMdQd31ka2FzTMNQdX97eXPd1URHc2dgYGlnQXRNcWJra2luckNJWHVyc3Z4dc738vZQSElCfUhBc13e3NLVc2V0TvXj5uXyw1Da8cf0/fH9/85Q8ubi6uL4+ubn4uvi7ez68cr2wfjh/+TJdn5+eXfI9/T900dMcGBhd3bdwUBCdmRifnRz1dFZXVxxZHx6dkR6ZGdhYmJnY3lDS3Rwe2N0UtH3UEF2eGdmQkpMQH1/e3pjeV/A4Of99/H8/e/u7ez6/czM1N355O3g7evrlezr6+Lv4+D788VSzPb7/tpacn1lc1NWxNFUTX5haXpMwPP1xkVNfXJBQE1CSEhxcXt+QFPVQ0xwcmRsY2BgYGR6c3BkZUfRxNFGcmBjYnhIcHNEWExKdXXD5OPp4//Dw1XW8Pr5+f3C00J5QMn0+uzr7e3h5+3h5+Po7uPi8vT6/vzaTWFme2RC01BE3MvaxEh229LS1dpCfEp/QVTU2cD3TXF+YH1zR1TWQmFkb29gYWVlRkN1fWJlS9XBwsR0TXZ0WnB4ZHFJeGVie3VC28H9xMD3yfv7+OTl5/HAXEff2vj45+T65/vj7+/i7+vp5vLHysPxzl9xbGdnf3Re3dr3/ffUXtP95+Tx+d1HeHh0R111UVp5bG5pY3JbQ1B2emRke35bcUfQ13R5Z2VC1ktAWnN3dF1LU3VD3FJ2ZX1xXvD1xMRHTE3d0+Xs+uXJ1ExPUMLj7OTn9VNGyf/77eTv7+TLwfH94unl/VdyZX9Icc3I9c5WS3DV3vbj+/bZfGBgSV3D9MnMXHJkdU9extrVT2djYXF1QdLRVHBjFWppZVbQXnZmbWBK0sDJzd9KZmtmStH88/PZfWxvcMb67+zs/NNCU9LE4Ovq4PHXWsX84JWVlpbu/NrN9efg5PZbZWJmdkXD9c7GSn5+TNf04ODzVn1kZ3fZ9/RNeGJvaW97RvD723dgaxRuc1rb19FeeGIVYHfb+MhccXxzfNn+7eL+9NrYR1zF9Pv3X3B7ZGBN9fPwyc3e09Ha8fvj4vBYdkBAX/b+5uXz/Pz33snh4Offcnl7f3DL5ufy2sbdVNzE/v3480FyeHFL2fDL3kpOTXVLd8Xxydx7Zm1sYmVDR0JLdHxmYXtLTHBAfWdjZEtW2MfaUkJDXNbTxdjT3E9/ZXlL3vj8w1FZUF1T9+Ds4uPlw0ZNx/Lh5uHm8vX38/jh7eD+yNdMe31x2/3Jw97I9Mn2+OTwxc3EQ3pxdEVZZXh7eX9+Q0bRwV1Cc2Vien9y3UZyZWd/ZHFE2PFEdEF2Z2RNU/b019ZDX9z55vzn8NhaeWdnd3dXw0F2fE9c1ffy7ebD3V9AQtLO8OXyzNbWxPLk++Tn8MzT0lTbz/Ph5cNAXMDw/vrj4/zZWV51Q9zL/cBbeGFkd97w5+fxRWNpaWJycUFJe24UbHhC0NPSRHlnenR9TFLT0k54Y2Va3fH3w8vFW3VBQtHbXVFMcGd418rm7e3j/N7W9fL+4u3v5s9YTtz04e7g5/7DXkJHRtvCwtlAfmZw0f7h5fj1VUxO1NTNydPXc2ZgZUTa//PI1k53fHVGWVB0cHptaW97R8FVR0dCWV/bwtrG3NtFeXp5Wt/85OT+w9VERl/RxlZHcmBsb3rV++bl899FdUjRzfXP8cB1e3hG0/Pn5+f88eX55ebg5vvyz8bawPLn+sdV1UdF0cnl+vTc0XRkZX9ZzPH399p3cUxzSEFDfWVsFhdqb3LVQHdIcnhwfV3O3lRWWHlld03Q8czR0nV4X9zC/OTy0Vt4fndw1//+z8LIyuXk5O3s5fX310hSUdL9+fX38sD0+fzl5P7N0EVxQEh33PbXSnRydFXb8uHl3FFAemBnc9L2xsv2213Q0VzX1HR9YGpqaW5vcEp8d0lexvT85+fxys7AxtDV18LYQUdCdFrHw97eX0t+ZWV4eGVO0VZFRlzH2tzL+vjN1VJNcHxwVPDxyvnk+uXn7e3m+fDy+f33zcL3zVxNWFffxfX1yNxB18LZUlzS0lBGWMff0sH3z1FOeWRhbW1vbG96cWd6c0pW29zewVJ1RkZIeH9JRF90T1JHW93aV9JQc0tQVNva2/f99sn+5ebh4e3i5/fE9tF2d0hS2V1ExMLB/vr6+cn19PHP3t9dTnBzcndDSFfY3c703Vjd1lhTUNDfV8DE1F3WzsHSQEpxeWRjZH9lcExHQ3VM3NNBXNPf28POwtVYSXFwc0TX0sbF3VTXS3BAQUh0SE93QN/Gzcf0/f7n+vDT2MBPdnFd3t7Q1czK8P//+vz99v/n8PXw/cReX1DW0EVVV9fSQEB0VMTX2N7aVdjCV8/Y2MXd301xeH54YmFkent6fmR7cnBHRV3W3NxdxdtdU09xeH9+cFNb19LPyldaQlfNzsj38/3z9sHw5fjn5Pnxy8DU1lTW2tvM1dVVXlFeQVvcwsba0MPKUkdOd01IT3dydUBGUsTczM3B/vry9srD29FS2PDywN1VSHphZ3p3dXRCTXZ3T0hLX1LS0lfRU1TezcPWUlldWnd9f0VCTEdIQExCRV9SW1BHQVxQ0sLz9vPyzsLcU9XD8PfDVFTDzsTM/Prk4fjw/PD85Pr1291TTnZxQ1NbWdBQXdPQ097Jzs3aW05T1tDYV1hXWHdweWR4cH1+fXx4fHx6ZHpzWkB3SlXc0srKzNldQkNBRl9QU0VNTFzZ2dLA8/D0ysb3++Hj5/r7/sJXW0Rf199TTndAUFXfxcnx8/HM3tjd093H9cnFVkFzdklwdEtaRkNR3NjE9P78y93ay/3yzNtVU3Rxcn10Q1pNdn1/fHNLR0ZV3NBSd3ZZ1sTbzvDfTnRMQE1BX1N3cXB9eWR6d1JW2M3NyvfwzMXMw8PE11Tbw9vExNnXU1vExdDP/Pnz+Pv++Ofg5ub9xldxdE1HQNHTUdFeWFxW3Nr28MLf3MTLwV7bz1t1Q3FnYWNnZGd4eXN2dHV0dU5wfEt3fELT2vXy9dRCdUBfX1bGwcTRXnVzcUJR2sv18/zx/fzy+uX88v3N2VVUVVhBTnZ0X9LY3d/dUkRT3d7G8f3z8sjYVFtZW1BU0tPb0EN1d0/Xzf/h5/n88vbK3NjDw9hTSH9nYGdleHxzcENKdkFKSkNbX1fdyfPL3l1AdH58TFNT1F9AWXFycH57dNHO98HBw8TEzcDJ8PL93U9HS1jc2snw88nA3NdbXFTHzMn9/Pjz8fjy9MDWUVXY39jdVdRRQUBfUMbJ9cTQ0lfE9c3T28/MXnF/ZWBsYGRle3N3cnJ/fENGUFXZy8BX1dJXxdJSR0xR0Vda195dRXRGX9Lz/v/8yd31x9HDyPP4/c3HUVhfQF9Q0N1fQ1hDd0RAXcLbxs/GXl9Q0cjQVNbBxdfc3NbRx9Ze1FTZ9PHw8MHK/vL98fDwysRCZGR8eXxMXl1Pc3lwfXZBQVhe11VATHd0XNFRWk51R0FMQERZV9NTTUJRUkHS2lfRwvHyy8L3zcfa3tPY39DGw/bAQdddUd3Sx9jY1MDWU9ZRwfby9s3U0cRUw99UxNjc0NVe2cTJ9MPOzc/a3FHV3EhCd3Nye2VlfWV9ZWNgYHl3SUfX0d7J2MvD2PH/zNRFdVNaW1FQX11cSUpxSl3Wzsz2+eX/+Pv08vDC3FZbUF1IUNnd1UN0cHRQ2FXd3VHHxtLW1NbMzVlOd3VR39La9uXlyNrQXdPZwvbw8f7wzcvN2cTSQE5OdnB5fnd0dHR9fnx0R3V8dkxCW0ZGU9jB98NBdH99Sk1HV8TB0V5DQkTQ2dDYzcXS0N3JyNrw+PP29MHQUF3a98nGUlbLxNnSRVnW19vc1vf/wsfUTUFZVdnfwfDM3N9IckN1WtjL+P7Z3sfZyMvaxtBSVXFlf2dnfWdhZGd/SnN2fGVD0NzAzfbl8svz00dfS0DT0cbLU0JMdEBSVNjAyvPF2ffK/eTxw/Pw8fRadkh1WtPRXFhW1V9HWHVAWHdJ2Mvy+d9TXnZ3RlzX9fP1xdrAxsrH3cX9+vnyVl9QUNjIydLC0UpLSnZ1WEx3eXNPSHd9fnl9fXVDQVFQWlBURdHdQEBZwP/20EFxeXd1XsfF9vzaUNfd9//++/jn4eXPxNVS0NDCwlBeVndxUVdV1ltJRMHy8MTF2lRHQFTY2sr83VTfWVbXWU3a9PT33lVcWlnSy8nTX0Z4ZHN9dEpycEp8e395ZX92c0tMX13fw9Pbz/XP311dwMLJ991AQ0tzQFfazsv129zbw87w8vvj5vjl9tXTUEdbWF9RRn1zdENZW0FJTlbb0M/L1sfSUkdPXsDO08r0x9vbw8nz5+bz8M5bQExHWVPU1017cnJ+d1lWWdXE33dxdHp7f3J+fHFPSHZBREhAVlZS0sr99fbK2VVZRE5fUMHHVdDZ1V/e9/P74ef89Mbex87L9PTI9d9GSFhBS1dUQU1T0tDd3drVX1FRQ01U3FZVx9nezcrJ9PTY0FN0SnVF1MXEyvLAXHRIdXZHV1FTX0xLem1hZGV/d3dKdENfX1XfxMfJw8zKxM/QXllNdkrR38DNy8FTVtjA2PLl+vzK/8vU0MPA2vbKydDRX09aXNXUzMDUWEZcS3ZJWkNB0sHZXVXWU1fE9M7M/eTy9PTbX0hFUlTG8svR1U1yfE1FQ9XE0XR3T35hYXJ9eEhVWXNycnZ0SU9IXdHR1FdXWkxH1VBE2/PIxcHG29zBzs/15eHl//z+ycT28fb65fb33tTVVtDVVdbB0UR1eXhlfFpHX87y9MRX0sfV08TBwvb28MdDTHdwSndN0trVUlnV1VhTX0xXx93cX3ZyZWNlenFFREdPcXJ0Wl1OQcv3y/TYUlVDQVVaVtnY39bcwsz1y9jA8fLk+vTM9cTNysPw+PDE39vUW1BYcHRXxMZQTHd5Zn13ddL398HS0dTZyNtXw/rk/fDxxl1E115E1d/HVVLHxdFSd31zRVdQWkB0fWVhY2Z8d0lyfEN1dkt2c07N9vXY31l0c3RIStf39tHZ//H0x8XS2ffB9vDz8v3zyNjf+OH68vDm5f/DUEVBxdLVWXV2e21iYWVFw/f09PP1wt3UV8P488/O9d9dc318flxVREbVysLeU0Fwd1pHWkJ3SUN5bW5if3B9TlBXW1hHQ0HS9/P+/czdXXd+clrJ9M/O9fD0zlBHVt7x9fH7+vr9z1dbWsLx9P3w5eX+w1FeRdRbWddedXNkY2d4XdfZ8vb32dNdW1ja+fT2/fL32l93T3ZH11Lf3czN3llIdnBGSENZcXBze2dkZHdGd0JHSnx/eXF0WsnD8/jGRXZye3t50ffH9fH98creUFBV9fb44Ofn5fHe1lTK+OXg5vv5+ffVUN/KxdjSQXF6YWBkZElWV8Tbwc/IyMfByf7/9sdU30dyZGBmcE1E0t/LyMbUSUFGVNHS1UJJe2dtaWF0TUZfdUp3SnR13cr4/fLxz99SSX5/fFpQ28DQyPP0VlrV3cr25ODh4Of0XE1NVcH2+f39/MraVNL3/c3YxUROdmVmZHxCVl1RRV3b2NLd9P7wwsHO38jLUU11S0FTVcLK9PfbUnRJXV1XUVFESWVubm1nd15fUEF2cH17fV/Ewdrf2dBRR0hOTl/X1FJX1VJW0FtMRVlR2PDm7e/v4fDCyc72++Hg4eT/xNXGxtrZUVJEdHN5en11SkVZTENfUdjZwv778MjZ0FVZXldOdXZzRkRWxM3EydRJRE5xTkpbXUlyZWBnenlEVFHSV1hSdnfX0FXa0F1fQVhbSltVWdbe1N7R08/XR1FYXsHN8uPt7OP48MPQzfHz5eT+9ldS2FNR01xbUEVASHZDRE5BRHV0QlTM9fzk//LxzNrdV1ZWSUxKd0Vf1cb2ysTS1VB2cURR3NZTSmdjYWZgfnV1dEhNSHdKQVxZWl9ASEZeWVTGU1zVWVpZV9bW01ZZSExUzuXg6+7h5vvHyfP44+3t7ef3x9xXWEXd39HfUEZHTHBfUklDdnJHXdTMyMHb2MzF2M3UXlNOeXZxSlVR3/fZW0R2cnd1V9HYUn96ZWNhcnJLRUdd1VBT1lFT3t1V193R19jc11dSQF9cRVHT11NQTHVE08X/4eHi5fnKxcvy5uTg4/r10tNNX1lERVreV1Vd1t1cVlNEfHl0dF7azMnDxNPewM7y8cnBVkdMXVRSxcPYQ3J+eX98RFLeycJFf3dyeX90Q31xT3R2cndaREFYdX1MSH9P1lZeW1BeX9XawMTfU1xIQNZW/e7u4ufk+OX6++Ls7OPm+czC3VJSXk1D1FVXVFbEztNTX092QkhzXt9UT0xPS1TF29PR2UVIdEHUXsD32lxKSnlwdHFexcBDcXB/eGV/d0JaQEVB0tzWwd/FUEVfWll1TVNXQHBKQEXQ38TE29FDRl3Sz/zj4eTk/PXH9/H8+uT6zM7H2tFU0VbfxdJfQN3f1dnc3FFMc393Q1vd297R0d/J9srxysxUQ3Zw3MPcxcTLVENwcFNEU9DfRHJ8ZXl5ZX52S3ZxcHdaRkJCWNVTRnJzWklwd05wenZKWVDf9sTdR0VH3Pvk5uDs7OHm5OHg7+3l5f/13NjF39LCyMbMw93C9MHE1dDQcWVlcXVyc3Bwd01a18PA9MRaX0J8c1Lb11PWVkxKd3VS1tXRTEp2YWVxdHF2QEh0d0dc08/Yxt/Z00NNTkBHQFBJdnZ2W1DFwdJQQE5/dtTA//nn4+Pj4e3j4uPn+sDdWEFZdV7Q1NbfzdHe9fPz9cvF01xMTXd2dXNwf3F2WNv0+P/3xdnVT01aXtVRU1dXW0lC0NJeXkZ3fX9zdnB1cnlxdHZxQNzSRFBUTUdBTnVxcXB9c3Nyc0PXz83Q31hAR0ZXwPLy/+fi7e3v7uvv4eP82MjL2tTT3Vfdzff09f76+/TA0kFdRXN+c35hZ2BldkvSzffD38RHT0p3Sk5YQ1LS0NvRU9/E1UFbc35KfnNwf2dkcXJIX9zP9MvSxNxWwdZWVHV+eH9lfklWxsHM115NfndGQdLOzPb4++Xi7+/s7+Dk/8DPwNPY1UpK0NdUzv34+Ob59vfT1NBFQ05lbWdgb35Hwfb//8ny31bS1t/a3XVc10pAVd/Q2dlEXkp+c3BzcmVjZn1hYU1WVMTK1dXRU0ReXU52ZGBnYGB8WVNWwlFaR0hPU8b25fvl4OPj4+nq6JXr4Ofk//by9cXfWN3cVMXw5OTj5/P0x1F0SExlYW9raGljf1PR2/fb29RbXFzXUVJIcXV8cUxT3NP320BFdnN1S3x7fmFlZmZwQ9Tb8/TD9cDS1FBAcU1lYmRnfEJXXNrJUtBWTtDMzvX48Mnl5+bi6e7pleD65MrFycRXxd1LQ0dO1v/n5uLh/v3FWlBHeX9/bGhgZnpGXVLGyMDGxNTJ8d3EzVJ0TENG0sDFwd5PcHZ4eHNlYXpnbmxjYXZXVMfIx9dUUEVFS3N2eG9uZmZ5TF7WwNrUxtnA//j9/Of4+OPi65eWlJXu5+T7//v79MDP1k1HWNb8+v7l+M3YVEVWU095YWNpaW5tenNxQlVeR9ndzPPAU1XXQnVDUMXPwtJRdmV+eXlCQH54eWBiZX5Yx8nIzsRbRVBS2M3VcH95YWFmZXRHXtDa1d3Mzv3l+PX2+fz55+Lplevm5P7P9fHx//DfU1dacUTD/fj4+fLL21fWx8n1XX1/ZWJiZmV3X1TT2NvQyP//9cjG1NlRW9fQ2sZHd3JyZWRleHx4Z2NiYm5kQ17c1VNZRE51Q9TaVEl9emRuY2BnS1tFU8bY1c79/Pv45+Hj4O3rlZaW7u3j5//9/vb0983E2tTR9/z45/LMwNNbQlnWVEV8Zm9pa2psZkXQQ9nA2VfG9MXL2t9RQ093TNXY20NJRE98fnJ8cnJlYWF6fnBQxc/S0tdYXl/a9c7FWX1kYW1ge03Q2FdX3NrDwPL5/+f49cvx+/jt6O7j5+TwztjPytvM0EXT2sj25uPn5fXdUVLVVtjXRHJiY29vZ0rZwfXfUs/D3s3+/8zER3R0cFDfz8dVWHxwZWJkc3xiYmkUYmNkRd/T09NzfE1H2Pf1V3Z4bG9tYU/f0V/cSXTI9fHm7eLh+svP/ubolpSU6+fK8/nK+eH/0VtGRcj+5O7u4ufYdXVERVTN1X9tahQVbGRSwVNbcGVKwffy/v/MTGVnZXxXwfDaVFhmZmV9dEddeWwVFGJ/0/P++P3Mdn5Cxfz88NB2ZG9sY3LR2sVBd3pnWs/h4uHi+cVHXMrm6pXq4vrLTFLO+eb+91BzfEjY/+uV6+/kyUxxVcDw9NpMZGJuYXtV8PfHQkt0Sdn35+f00nd6ZGR03fXyyUF2f2BkcUBceW4WEBRuYUL3//Zcd059fd338cdTfWNjYGZIwtrUcWF8TF7E+O3i5/bH8frk4paVlej58vLy/eDv5clafEjN8/LolOrtzNDbxtPN8NNBcm0VaWZnQ9JDTmRhfUNU0vLx2ERlZn9eRtzCVtBJemVzQFHTRHhhahVsckbV/fPz3H9xUFbF8vHQUHNhYHlE0cpSQnFjZ3RWwfjl9vbVR9T3+ufp7+bk98HM9v/j7cdaS3NIU//h6+vm5/POzPL8/frbQn17Z2N11c/xQUt0cHBDy/Hk8FBAdnF+183RwF10cn95fVBaVnBtaxYVFWN0TNPVQ3VLT171wsbL1X1sZ3h7UtzH0ndlZ3JOx/T/4f7JUM38+e/u6Oro+Mr5/+Hi4uz43ndJ0cX74uni5czY98n65PT3xXdsa2JgfURTQ3xma2xmc8LM8cJCf2V2cdb3xNtRTGdhf3HB3EBNfmMUaGN/xMDE29dHQN/S+ubN9tNJYWZydM3D1dBdfG9ld93l/OT8xlZRy/fm7+zj+vBQV8734uDh5dtEc0PQ8uzv4/j+8Mv65u/u4fRIc2FifUfY30B8ZWBsZUjb8ffMWE1KcljFz/bGcX9/YmdKWdNeSWdvaBVsenF0d3h4f3tI1dLJ9cNBd3FkeEFSVldCeWRmeVjZ+ufl+f748+Xi7+/u4P368cDy+OHj7OfOwFbR9+Tk5uH/+/L94uzv4vvITnFlY2RxfXp6bGpoaWd3Wt7f0l5MTklXz8xXX0V/fXZxV8fPxVh8bGJgYXRHS3VAcHNT08v//vffUUhLSnxFX010fWFtenJCyfLy9Pbx9fn65uLm8vbN19jF3PD5+vLIxdDPwvT5/PL+8Pf45uPt6e368MVZT3F/dHdyemZgZntxQ1Xd3NlXR1hX1d3B1FdVW0ZPTE9aXEl/YW9ubWJhfH1/dnJzQlbX1sXbUUBxcnJ+cnV2c3x/eXNIU9j2+f//8+Tm4O3i7ODg4fnz8/zz8/3Px8/K9PH9/Pr6+/n45eTj7+Dn+cvBXE93c3lkZ29vb2htY2V6eHdJS0FSUd3RU1TX1NZXXlBFdX12fWV7e3t7ZX9IQkhORVjW3tvS39pZWE92dUh0fHR2e3J9cV1UxPXyz8Hw/+fh5uTm5v77/PH+y9rV1VdZ2t7G8/Tx+uDk+uHm7ezt4ebmytpTTFpDfn5xfmR6e31KdFtfVV9KWV3X2NnDzc7RX1xEXkByZ2FmbWBjYX55eHl2c3hzQkFcR0FWUkx0T3RBT313cn16Z3NJXdvJ9P/5++fi7+vo7unj5fnz8PDw2lJXV97ZwPH8+f378vP8/efj7Ob55PXdV0dKf3ljbGloYmNmf3RAdndLSllGXtHfVdn03dJQW9zRUkp/f2ZmZHp9cUdGQXZD1VPb2c3HX1tLcUNNXkFIcXx8eHN9WNja2tFU1MH85OPm4+/i5vj49cvA1VFTSEtJXdj1/vrm5/r4+/rm4eDt4Pjw9Pf398pZdH1kY2Blf3JOXl1QXlLZ9fHN39JcQk50c3J2cH99c3thYGZgYWBnYGZhYGRwTHddzdheX0J1c3ZzfWR6fHp+dNjG9vz98fP85+zo7+no4OH65uf68fXA1dZV0tfbzvbz8PT++Pn64+Dl4efl+fHLzV9xcH5hZ2dhZn52d0FCQUZGWUVY0NbTUl5aSExPSUpJfmR8eHpzcXB0S3R1cHN3dUdY1drb3sXd2l90cnJ+ZHlyd3RX3sn1zsvx/uT+/+X+/vz8y8DAwdTZzN7U3tjF3FjYx87198/x//vj6e7g4OT6/P3DV0h2cX1zS15OW1XQRFhNRVfcU1PS1tRXU0J3f3dxcGRnZmBkemRgZmBmemVkfXJwSlJQUVNdRU9MdnB9fHZOT1XHxM//+fX19/H55+Hj7Ozi4uPh+PD0wFRfU1xU28vP9fL88f3w9/74+ufm+PD9/PDJ2NdNc3JxdXdJcH1zdXZzdE1xTNBWVNZQREd0f2Rlf35+eXhze3pzfXN3cXNLT0ha11FZUEVPREJKSEpJTXdLUlNT1NRVw8Lew/f1zfz65Obm5Of+9sj1wNLcRkxGREfW3Mf2/fb9+fn7+uTn5/788/z29srFx9xQ38zQ0dRTREVKS0h2dFpW3MnA39HXdXN+ZmxibWlgZGVkeWV/cH9/d3Bwcnl3cHJxRUJ2d0N0S1td0NnZXFbQ08XLz8n1+eDm4Ozs4+Hm5P3z98jG29jHxN1QVMXa9fDz+Pvl+v328Pb1w8jM2NrE2lZQU9VRXnRDXnZ2dEx0S05LT0dT3MXVV0ZDSnB+ZGZmZHt+ZHp8cnZOTV9UXUVRXU9GRkFZRHZ2cHJ0XcPE39NXUtNWVldV2cj+/f7/5f798PHK2sfE0ExYVtZcRE5d3MDy5eDm5Prn+PT098P0//j88Pf39vHzw9hdUtTcUEdG0dZbU19eR1FWV19BcXd2eWRhYG1jY2JjZWd6fn13T3dwS0l9e3JzdXdxc3FwWF3Z38XN19/E3tDYxvL75f7k4ebl5uf4/Pf++fLCwcLb1V9LQ1vU9fL++ebk++T8zsHf09/e0N3FzvbMyc3dQU9FTEp0c0lFTHZKXEJZW1ZYTUxDT3x+f35nYWFmZn1zWtVEUNnYQENBSnB3d0p3cnVeUNDe3dFcVtbQW0ZcxNPO9cjJyP375/Hy9vbOyM/OxNBSVll2WkRU3cjy+ufk5OTzzvD98/L3zsr1+Prn/fLyzMTEWUxZQVPQ1nFMXkZe21VGQk9NSXZmZ3tkZ2dsb2liZHF2c0NJd3V2Z3t6eWV/ZWZ4S0bVxdXTUNVQx9VR3Mnx/v30/vn45+7h5efh5OX/yM7LxdbSQXVB3srw/OXk+c7199DSwMzYzfTMyvLN/f/c1dVeTE1NdXRHQ1BYcUpdWFTdU0RBR3NIdmV6c3pkeWVnZHl5RVNeU0Z3dnRwdHdzcE5xdkNBQ9ffUVRdW17WXVfT39L08cr8+P385Pr4/Mray8/Z2N1aTEBDRdRS3Pb5/P7/wvX39/H89fT9/Pz68/b++fj9/cPH2NvQ2lZBX1tBV8RU0NLeWFp1fHpnYWFhb29iZ2d4e3BKS3BKcGZkenpme2V6fnx8RkNIR91WRNDc0lZU0Pf19fPm5+Ds7u7v7Obi+/bK9tvT3NxfXVxZysXCyPRTUtPc1tzT3vPGxvXz2svx98/OxN/009fWU0BRWUZCXE5TyVTb0UFydUhzfH9meHJkf3J+eUlEUtVdcEpCcXd2cnxwcHNxdXlIX1PUXERGXdHW0tdWz87B9P3w9uXm5ub/9/D029NWRU1BW0FeXdzN9fbxxVlY08fcwsjw/Pz55OXw8Pj5/fn7+//y98jE28DJ0FDf2N/Y2tZScGdkeGFsYGZmYWdnf3lkfnRwfHN7en5kZ3N8fnNxen9JT0JbXlHRUdLf2d3N9/74+v/n7eXl4ebk4OHn5/rAwc3QVlFZQlXbwszFWVFQTXZPc3BY18PKzNT198Lf2NfO9v35/87U9MnMy8RBVNnf3tpFQl5xcnNkb2BhfnJ9eHdLdUZecXxOS19EdGVwdkld1HByQEfT1Fldx1LW3lJ2XN3b9/H38vrw/PL10cz39/fCUV5GS9fQXEtQ1Mnyztzf1VRVX0xzTVzN8//0/P38/fP08Pr45uHk/OX6+v779tDW3NHV115bQHRlZWJraGNnZGV6eX1/fHNlZmd+ZHh4Z3pyf3RfdXJwT3VTxs/IyNzZwN3b9f/94ePm4efy/uX98PLL09BUU1TQ0MTSUdbb28L3w8XTTHdOcn1IQVve9cPIwcXO8fXy8MLN8fHx//D3/vzDx9FTX9/R1l13eGVjY2R6eHBJdk9bQE1ZQElJcGdlfnlxQUxBUVpYRltPUN/YxsdUXNZV0dv1wvP98vPy9MDLzdjd10hxfXdIUllaV1xZ2c3byPfM0NRPcU5GQd3DxMvx8/T55Ofh5+Xk+/z45eX64OHl+/3Mw8DX0tRGeWRiaWlsY2ZkZXtkeHxxcnNxcnpkYWBgZn53RExJSUJLWdbCwMvKxtHc2cfI9uXn5uTm5Prl5fP0wtRFQ3RxWFfV3NlSUtXT3Nvb0FRFdnJ8eHJNR1tWVllc087//v7+//Lx8v78/OTh4+bk//f3ycvCVUx9Z2BgZGR7eXl/cHJxQVlaQ0FJc3x7ZWV4cnRMQkJNTlxU3c7AwMfc1FfZwc72/fj+/PbL9vXG31NOdH57fXZxQkdEUlRSVtvFxN3dU0VLd0pYUdzc38DCzsv55Ofm5+fh5frk5uDm4ePs4Of6/8rN1kFyZGJubGJhZmRgZGV6e313dXB+eXhnYmdmZ2V+fnN1SVDE2szw9cv39MHMyPzl+/jn4OHn5+f78cPAVUZ0SE50d3dxdnVJWdDTxM/SUVpFdXxwTERFRF5HWlHQ9PHx9vHz8vL45efh5+Xk5+Hh5OTl89pVT356ZGZle2Vken57c3VJQEB3cnx+f357c3RycHd1SETUwfX39vDxy8z19vTx8ffz8/36/Mj0zNZEcXl7ZWV7f3hnZHt4eUNX0dvT1NdASltHQFXZxMzNy/bz8/zl5Prl5/nl4+zv7+Hn5uX4+/ny98rMVnV8ZWRkZmRkYGZnZ3txdnd2f3plZGFlf312S3d8dHV1U9vYy/H08ffI9//y8vLz8uXl5OHm+vPx3lhfRUtDTHd0dnJ8c3N2R19BSXV2d3N4f31ycUBAQFlT0sDNzvbx9PXy+Pvk5ufk5eXg4frk4OT89cfYV090dn5kZX95ZXJCRF9aQkl9en1/fn13QERISV9SUVHG9vf0/P7z/v74+vDM9MjMz/Tx9vTL00J1cHJ/e3t+ZGdnYWFlen92c31yfXJwcnVMRURDRVRQVMDI8vz4+/j+5efm5uHj7ePm4+Dh4Ob69NNdUEBwcnR3fmVnZ2Vke3R3fnJ3cnp/fXN0cXB0d3BOXlLU9v/8/v744eT64ODm5OT6+f7l5uDl8ff10FtdT3VMSnVLeHlwfnlyd3N6Z2ZgZmd4d3d6eXd5ZGd7dnVxR1hEUN7Mys72+f78+eXk4eHt4//z99nVRVvc31RTUFhbS0haWV7VUVZHQ1BVXVtAQ0R1SEBb18vz/PL28Pz38/rm4+Tl5uX++/L3zVVT1099dnd1SHF/fnpnZXt6fk1YdX57e35yeXdFdHFFQXd2TFPX1FDWxNVTxcn29PfDxMj2/uf5/Pj8z1NNf3h2T1ldd0tZREpJXVJbRUJOQ0tDVtJcXFZJcnJ8Tdbey/jk+ufn/vrg7e/s4uDs7uPt4vn88sPY1F5UwcXT1Edwf2VnenxycnR8ZHpmY2VlZX5+e2R6ZHt/eHt/fnxwS0dV98j3ytrBytrBwcXbx83d1lpBXlVeXVtcU1HdxvD0zdrfXFJdUdXc2MHKVUBLQEdTVNrP8vz45Pn7+ubl+vn65eHm4Ob8yt/XdEtAUdPY08Pa1UZMWnF9fHN9cn9zdEl9SVFOSnJ9d01IRVJZdktPfHF0QVHY39/PxlHE2EVbR0RfQHN3THZyTHZ6emV/SlhGV8dXQlRQRdVQVsfD3MbFVl9XWVXR1MPw+Pvh4uHn4OTk5f345+T/5Of99vXGyM/A8f3/8PPzyMzbUl1Nc3dLSndEWlpYT3B9emd6f3B3QXZzcnhlf3llcnJJRVNe1lFfQEFJcEtLQVlRXdDUUk1EdXZER1fb0lbTVFxGVEdHU13Tw9BW1FJeRdxX0dje8Of6//7/8PTwzMnK9vvn/cr1983AytrFxNrN8dnWwMBSXlJeV9bTw/LMzPb229nR0dRRUN/PU0FSU0RSXkJOTkPQ2VhIQEh+eWVmYGFmf3B4eHBzf3x+fHdOQNLSWEJZRE1NdXBxS0xV11ZW39Dd39ZS19zH9vb09ffPz8zA2sv08f7+8vz4+ufm+v389/P98cr12dnG21BR3NPDw8HGyMPA3NZCXlFf1FNaVtZCX1ZZS1tHX9Lf28/ZQ0BBQX5/eX9xd3N3cGR5cHxlcHNaUVNc1lBFU1lCc0pKTUlaRtZQdExcRUZRXNHX0dDeWklNW0dLTUBEUNFVzMDE9fHE2sHI9/Dz8vn0zs3x8fH8/vH5++Th5fn/+vj/8czZyszNzdvew8vH2MzE3/XCwN9TWFJZSnRCfHt+enx9ZWZkZGdlcmR5cXRLd3h7cHRwdkp+QF5cXURLRV9GRFtFSVRd3MTSUdBdXl1VUUBUXMHKzMH0wcnLy9FQ1tX0ztrby8DKz8HQ1tLF8vH38//39M7M2sHS2vbDwfT1yfHx9/T3zfP68Pb3xtra1lJFWUXS31tBRHVIQHV3dXB+SnB+c3F/dndxSk1LdFleWVheQFtaQE1KcHFNd3dzfXx2dnd9fnN1T0hGQV1YX1NQWEZT0d7Fzcv2y/Xz/PDw+eXm4+H6/vfx//DO9/Px+f/w8P785eXxy/f3wvXOy/TK2MbbVlXe01bSXFhTQU9X0VhHTHJ8f2V5f3p5d3B5fnx/dkl0TV5CQV1ASkRBTl5eRVdcdUJSR0NeXlpQUFHSV0ddVEJ0dHFwSUpORE90QV9FXdTaxs/awcPb38H1z8nK9s7w/eTh5+bi4uHm5eX++/3+88jPysrDwMPL2sHdwMTSxcPZ1dfS11hSX9rZVldeQEp0dHZwQk5ZT319cnN8c3x+fn17fGRneXp+fXJ/eHlycU1OQURBRkNaRENAWF3dWUVcWdHf3tHUUNTc2dDW3dvH3dve2MD2/vr6+uX7+vjk5fv74eHn5Pj5/v7w+v/09/3xz9tQXlFSQFNDdkpRUFZSWkReRUBWX0JGU0BMS3RIW0FNRUx2QlZW1lVUVFVETHZ9endcWk50SndKcnNwfXhKQk5xfHByfXl7ZXpncUZaSUdGR1lc1trBx/z6+vDw8/f18fHx/Pb45/7x/fz75OTl5fvz+fjwyfby9sr139Le1s7wy/Xx98rNwdBRUl3X1VtHQUdLdn1kZGR6cXF9dnZ2f3p6ZHhxWNZQWV9aRktIQU1a18Tb1ldUX19PTkh2c3dKcH95fHJwfnF0dktR3d1V1dnBwtr29s/D9vTx8fLk4Obl4uHk/vv8/PP8+PvaXtRPdEfX1djFx8/DU9HEVNTD9vbJ8Pb881FW29Peys7PzMDc98V3c315ckReRHdKc0x/ZHxweH1Kc3R9cHJccX13QHV3dnNzfXFzRHlleH5lcUpPdU9GT1xCXFZdTVzd2dDN8Pz68/37+v3+5+Dh6eji4vvy+/3x5eXl5fr8/f/2ysbY0Nra19HGVFBedklYRVjb3N3E3lTQX0tJRHVKVUFIdUpwRkJNV9VAWtNQVFNEdU9zfXZyZH9LfU1HRUJaSnBKcGV9cmV/eH5+d3JwR3FzQ1tH1t3TVNxU3c7d0MHJzf78/ffy9ff8wvT75/nn5fjw9s7w997C8/nw+Pn89PTD9/bL9fL//OT4+/P13s3C0NTY0VHRQXVzfXdOcH54cHx/T3ZyeHh7fH95eXJydEZOSHR1d0dcTEVfdUZBcX17ZGZlZGZmentKRE9KdHV0UFBaUNLT8/z39Pf0wvj+/P/7/ODi5+bm+vLm//3wztv3ydrXU05109XW3dre8c3T3cRaUcHFyd7Dwvb3wsDPWVDJ0NXXREPVRXFMd2dzd3ZbdUhCRlp2RUp5T09DSH11Ql5WW9RBdk1JSnJmZ2RnZGR4YGBgZ355fElCW1pfVEpIQNTG3sP28v/l4eHl5uDt7ODg4ebh5uX/zszE9fTx8ffPw8HY315TUVRcUFRFWFbayM3A9fHJxMPeRktJd052eXxJcnRcQE5LS3VFSnZ9cmR/TnF+d3B1XUlF1VJ2WUR0cn16cntjbG1ibHNIdHFweHd0dXdGdHdW09jG29n39/z74eXn7+ju4Pr45Pv4/uXz+ufk+/VW1dJU3dbUWdTW3txXQNPDyPL88cHz/eX+9N7Y1Vfa31xa0tLK9tJCWE1d111KdEdHX19we3FyQNVccHZBTk53ZWFibmBnZWBmZWZnZGlramptZmBgfXd1d0ZPQF7S9uf48OTh5+bt4ebg7uqXleqV6unp7+f/8f/95c/EwdNNWNxVVtfBwfHGwcbHVd/FUFpT2sj99PX39drPwdNHRV5ZUEBeVllBVtZTWVhEXFNYXVhBTUx3d3R3dEZZWFJETE1LeWdgYWZhY21hbWhvY2NkeHdaVdbe2dLQ01bXw8DO/ODj6JWV6uru7OLn5Ob7/eX9zcjyyvTF3MPIwvfzzsLYzF1bz9/S+PP67eLm7O3k/vL8yvDGz/RecEVJd0tzSVtdR9NUd3t6bG5paWBhZnhCT3V3RnV1cH12c3llcnlmYGVkf35lSHV2Q9dQXlVSQ1pEUcfY2v3k+eXi4uDs4O3t4+bh4Pv98ffx/vX8+/338MrXRkBxeXt6cXZ1RcfPw8/2w87MwvL+//H5+fTJys3z9/T4/8razN9aQXdlemZjZmZmenxlZXFyZXh5fXZ2fnp5eHlzcHJwfnlzfGV7emdmZmJsYGR4fnBB2NrB8P398vD08Pz/5ODj7Ovr6ujs4+zt5+bn/vz/9dZXRVjR0UVX1l3d29NW0t3ewd5X2cfXV97Sw8PcxcrKxsnb2NPVR099fXxwcHBNSXRCW3R2f397c357e3l+cHdycH5+ZXd5ZH1yZXl4YWFhYGByenp0Q3VW3lfVVEBGxl5a3d7d/v7x5+3g75Tu6JTo4e/h8vz68fP8yPn49M7O1FfdRXdfXEhTVUVRwNj3+PL84eX/5v7N8vPZw8BcWdd3cE18Z3pkZ3N8YGd6bWFlY2Z5ZXlLdnl1TnNaXn52RHRwdHhlfGZgfHZ/Skl1SkNzfEpxfkhbQN7Y3cL99/Tx9/X5+ff++/v9+v339cnZ9/bHzMjP28rH1tFRTVlVUVfe3dz++PDl5/L6+vH28/Xa9vbI9svcy8jczfHD0d9YcHR8Zn5xcXB7Ym1mbW9nYmttYmNnZWBgeX95cX54TURR3drc1tNUVtlQQ1XCw8Pf2drFwcv9yMXGysjO29vE8fbx//f18vj98PX30d7V0VNKeXdPdnZ0THBBTkZHQ0rVw/by8v/85Pj5//D84+Li7e7s4uzh5/NXV8DX1Nfa3dVedHVKfn98f394emR6fGR+eWF+eX9+dnZ/eXB/fGVhdk1BQd3bxfXxw/P9/fn//fD7+fDy/czxyvf88vD2+fbH2NFfUUhOW11cVMr0zPTD3ttU0t7QXl/RVFfeVFtd0dDW39be9vfGzsjI9PH9+/v75eHk++T58/L6+/DMwcXA0FFURnZ3RFtbRVpGX1t2c3Z3SkxNTEJBUcfc0NdQWVNQQXRIQ0tARFhaQk9GXlhc1dHd2tfUUVHVUVRUVMfAz/D2zNDT1NFXWlzc11TS0snPyMr2/P/k4Obn+fzx9PDIwMLYzfXP8/LyyNJRVl1QQVtfU9xU2drN2t3GyNvMw8HEU17Vw8bSQk9aXUNNR0dPWlFHQURCWFRNS1jV08zH29va1dTe1FJXcWd/emRkZGVwcnxKRnl5cHJ8fX1xRUZKTVRGVcHf38/08f79wc/21dLDzM/O9f3y987+5fXx8vD88vT1yszFw8XB/fHLwsH1zsRcQVt2fUt3R09LUddeUtn09cXSUtlUX1NAdUVV2NnfU9bYUFlSWUpOdHNnZ2F6ZGN8R3VJTEteWkVkZHx3TnRlenx9fHt4ZXF3RcXCUVRT1VxEQVrZzvD45eXm5/r49tjB9fX0zNjH29/TVVTUUdTF/f73ycDMx9xcRE1E1thdUtfU2NdST0FBX11Hd3Jd3FBxfHBFQUZWzfT8//bKXnR1SXVa1t/D9M3Z105wfHhmZGVgYGFnfmVvbWdmZ3N0SFpPSEB0Z2FnZ3hKcE7b28b331jTVUVTxtDB9sr9+vHJ/fXN++T+4eLm4+L9zsje3MvYVfbz9/3w1F1QTHdEdHJbV1TX1nV/fmdld3xL0VFBdHJ+e2RkfXVLX8T18c3R2tFSUNZRQkdc3/XWUtRe11fQV97MxsDAQnVxZ2BjbW1kfnZQVEte1UpPQ3J8cXJzUFl2UVt1QUNIXNjey+X328rH09xdVcr28+Xg+Pnh5/rk98/w8Mv45P36/PfCx1Pez8fVydxBTHV8cn5lSnRMX9Jf1N3eVlN3eX9nZH5wf0pPTk1ad0xTR0XQ0tfcV15FQ3xPSX9D3dj1/P7/8/bU1Vt1RV9SWdDW1sVQXldQVsz3/fPM9cJdR01SU17S2sv1w8rAVNjcUFJR18X0w9zx8MTLytna0Fb08cjO+vHH98jAwdjSyfH0/+DwyfRUTXRlekJGTdTCWV3fWHVDc1vD0FtRRH9+c2RneGRM0sXE8shZW0Bxc3Z8Qt3X0s7N1sH1w/H39frh5eT7+PPw8MXf09LH9vT/5eXl5f3J39ncxtXF9MD239DSUnBCQUhAdHVGXkhFUVNzRlrXwc/08fzOwdVTRdbRws3z+Obg5OXw98H39cvAwdveXE90cnl4d0vUU8fK8czf1Fp2ZXN2dHZJR9JU0dZeREdX0N5d1snwz9/AwVBX0dj99uXv6+3g4fn09PX2+/nk7ezm+PXUXd5UV8FQV/X3ycvfcH5xfUFVXML7xEBLfGJtZ2Nlc31S89nZxNnfzNhVychUwvLC9PXfWN/cwvv6/ePn9P7xVVpbfHl/e2FKSXRdQk3UV0pa11Ff8NzQztNOSnd9XcfC8OT2/eb9z8JVRt71xcrl8vrl8PT0xt3198ny+cr/8sFSUVhD08Lax9ZIRkF3eX15fUhJcVtUXtnA3ExFdXN3dn9zf3l9cWRncHJ2W1Rb28zZwffcXVdKcE5PdlbQ3//h8cz30UZcVktbUETWWWRnZGZkdnR23Mff9vLTU1xcRdVWUff1yf32xszWXVDJ2VXNzMPCV1tbQdTW9dvX31tf1VdQXFNRQVBQUNXS9cXawFFGcXx0cHZKcEp/Sk1/cHd0S01CS3ZMc0t9YWJpampraGJ5cH5FSXFwcU9DRlDR0tVax9LFx8fA8/n4/P///Pv1y9jb1tRbWFFSQlpRXFh1WtTdVdvTVlFWUVfd1tVWUlheQUxHUVFadHl8eHtld0NEVcTCx9REU9DQVt7Q2MzKzMrKwc7D3tLEUVXE30xyeGV6emV6c3l8SkJLd3N/S059eXphY2Njb25tbWZ7eXNNT9TPy9vczN/PyMnN9vH85ub7+Pv+4eb68/DOxdjA1tfH0VFDdXxwc0fX105PW0RHTk59R0FJWdVPWVxX2VJAW1BDWNBUd0TSW1zX3FfTzfzIw93V38RQ1cRX0dnC3tpXVtHZRFlZdnR0Sn1Pc3ZFQXNZUkJa3dNAXHd9dndlcnthYXh5f0BNQdj02/b2ys329fT98fnm+vb7+/Hy+vbw/vX18cjd0V9EWUR1WlVY1dNBSFJCQlbR3dvNzfXbVlDa39HEwdnAxdHMzsHb1E1ERnVLUl5a0VJXxt1MX19GWlNZwPHF9P/88fjyyPDN1sbP0dHRTHRESk9X28fx/djOzURwTHJ7e3h+dUpySE1wSNPTV/bx9+T+8M/I0MTM8/T45P7k9PH99tHB9srbx83E9MjxycXb3s7B0NNRU9zH2tLd3tHa111UUdDQwPTK0FLX2lJZ09zS3srPyNrS3d1W3cXT28XE01BGTkNfXc73/Prn5ubn9cTeX1vW093Q39/T0VBU1tLD8MnT011Nc3ZkeH54dURNS1HAyPny8/T7xvTHyd3xy8728fDy+Nv0ysTdz8Xawc/1/d9W2vpHzvDY/PfXWlF8fHRGXlBe08PQXtbdV1XHwtjEws/Z0MDL39PP8fPw/PD1wN7S215NRV5U1Vx1XNxdw/D3/+fg5/3x9M/f2fbETV7F0t7c09/H29rOU0hMdnRRWHVzTExF1HR/cHVNRUVTU1te9fLZU93dx/Dy+f3KyMrHX1JcX8Lw9s71w8jywNbQUNbA1k1LfWdyTndzd3RDXF1Q0lBAVFde1djXxMrPy/bK2cLBwPXY08VQSE9HdnZZWllZSnZIQULW2tPMxlTQ39bVVNHFysj2/MrBxdPTVHVzcnVIcHF0Snd/cXR1X1XY1ldfc3ROdEF0TtHE2sP12EVeWFvZUnV8TFpCSElY3tDU20ZKRl7dUVl0eHF0TXVyc3VbVMfOw9raxMzI0VxX2/fx/Pz/8/38/v3K2MP1wdNwe2d8eGdnZmZ/cnx2eGBnfH9zZWBjZXp6cn18cnJwXVVZ1sHY9vTTVNrN2cvNw/z5+OX/ztjH1MDAQHVGV13H9cDPwlPcwV1TVktPTX5kYGVkfHR5QUdAUcxXcXBkYWViFWlqb2Fwf3B1cn9NRkjZ29zH9cXeyPfK/OXm7uzg4ung5+b65+Xx0tDG0sz32V5JfWRzfmFkYW9tYmJtYWdgeHl5T09lfHxkeXR6ZWRgYWZ8fdXeUt7fX9fI19bfRU9X017QztjJ+eXs6+3v6uzg7+zh+vHZ28nIyPLI28NRWcHTTER8enhnY2JsFWpjbGB5Z21sY21nZGR4Zmd8T1Hd987b9MnC/vL38/P2/Pz8//jl+uPs7Ojv5PLxxMX0zd5XS0NAUFfQzlBFX0tOdn9yYWJjY2diYGVhZ3ZIWFdEd0NMcnRycn9mZmF+SHBc3FnQ2dvy+uHn5+bj7OPi4u3j7JWX6uvg5efl+P/9y9rf11rUWlxdcGV6fGR+cmVgYmJhYWd6cUJJ2vDw98TU097VVtDGU1PU1fX9+eT5/v75+v77ztVFQFBQ0UBG1tXc8PH+/8/Dx9hU1F1FTENe3czL88nQUlNW1dPQXEd2dkdNd3h/f3BDU9reWVvQVFzcx8bYyPL67ezi4uT++uX75OT98vDM8Pj6/P/6/vz4+P/23dJfS0hJTH16cHNb2szxzcDYzfTBy91aU3ZLQUNDcFtQX93E8PLGz8fXWEZPfmRlenFa1s/b11TXwNjCxEbXU1Pc38xV3s3G8v7k4OTl/vzKyPzI28DGz/b28vHAVl5ZWF5ZdnBwckBT0tXX3N/3/P7n5eX89MFR31BAXdzb9fnn4eH6/fnzw9FFdndye31BXVjV0lTG9/3z/Pv88t5U1Ut2Q0daUtXf2c7QTltSXFpFT3N4ZWV/ZGR/eHN1XVJfzdxV301HTEtAUPTL9f/+4+L65+fk//T21lPUUcn38PPDy8/G317ZXHJNcXNxfHZlT9BRx8T1/MLI9vXAxfVSTlBFWNRRVkxHVtDM3s/P3srGTXdxfWFhf3l0TFfZVdzNwsXGytNf0tDZwvD9z9vHxMvAxcRfRF5EXl5BfHxMSnd0QkN/dkJcVkFHfWV4cnZ2TUVIQ9feyv32yMHO9M7F2FFAckpQ3cXG9c/D9fPxzt1fcnlySllPQ0Z2RtHeyNvbwdPY09XeX0d0e3FDQEhIXk1BVNnAX05Lfn5wd3xme2ZgfnJHQHRaS0VVVN/T2tBc1dPPysnxycH2++f798JTW9bbwFTX0kXWxtjF19NSQURHTXd3fGZme3l6fk11SVDcw8DCVUNzc31keHl4enNS1lHAx9TT09VJQVhNSnd1SXZD1kdMWN7ZwPbI3dNTUFbT2E1OTVhSWdzWQVxdXkxA1EF3cXxkZ2dlZWV/c3FPUEx4eX9nZXNycndbVtvw5+Dl+fr8yfP89PDz/8r19snx8fXM3Mnw8cbHzFNS3NRIcHZ9f0ddUtdZVFB1R9BSVEVPeXl9Z2V9SHR3X1ZWWU11Z2BnZmZmeXplSNbZ2vXMU1lZUdLK8PTAw/H1yPX92lLQ2szx8/P09vbDzFVefWR4enRDRVl0SHdzQFDB101LfX1PU1BX1MXM/OTzytjc00FQw8RWUdjH/Prz/czHwNDH8vrzwsbQ2Mv0/fXE19Db8+X89vbwwsnCVFx2fnl/SU1FQnZ3cUpMSXZmYmBtYmRlf3h7eXTezNBcdXVwcVNa38XdyPPm5Pnn/P76+Ofh7+Lm/v/4+/P098nU3cbDyM/EVdfZyF5IQ3Z9fkh0cV1eW1Zc3Nz38sFFc0NDTNzF0FdQ39LHxtzX197ZVVzSXUlbVdrL8//3/f3/++fi4Pv29cv2+/7L2djOyfb39NvRVlNfdH14ZmBtYmdkdnh4emdPVsHUR0hwR9XF8/P28fX+5eb6/fD38Pv8/fz19NrHyvf2xsjG1vXx/PDP9NFQ3cry3NrZ1MzK+P318sjay/DPX052f3NCUFxGW1l2QdrZUkpbdHB1TFxITUpwSFDA2NHbVND1//3Dy8rOzPf88/Dx//jk4+3m+uX+zNLQ3MfT09LG9c7A28fG3NnO2FVCcn1xTENATXdNRUXc1dVVQFBR0dRQ2NbY1F/DX0RcTEVCVttc0EVDX1rK9VfBxMbP9uf85+b/+/Pk/1DewcXc0P7MwPXE99LHzHd2cWRgbXlnYmFvYm1lXn1lcH1/f1ZWckVfXNVW//TWxsbPxvvg//vl/8vO5/rFVtfE3fT78v7/8srL5/jYW1HXVNrw8cr29d9e9fDZU053ZGZxdXZweGRgfkp+YWJmYWd9fWRmZHt6f0pHWE92fHt1Vdva2lBSV8jz8PfNw8P39PLl4Obx/f365M7eW0LWUNLYwcdLT1taUF5Zc2BmYWV3Sl5zeHJ6SlpPcGB9dHh0QV9/ZXB4d1pTVnl+dX1D3creTFBWUfTk5PfO/fL44O7p5uDn/fjg4PfHysfby/r4zthaSHBKXH1nbBVqamFkYmNuahVseWFiYWBhZEzQXER0c3xK2dtQUExxT9X/8PX11lpe8f7L88JQVMX6/v799s7I+uTw9sddVsLy++X+8VFIVsPZVF99YWV/cXRwfGZsY2djZmFoamhhZXlweXlnf0JBWUdOd07SwPfl5/vP9f7l5ebh5fjk4eLi7eLl/vPx8/DPV1nU1dHIz8HWW15Md3R3cXple393cU9LcHZnZmdmeWRleWVxdENHQEFBSEhCdUpydnh9QlPQ0FhPTdHR2svy4fry5ebs4uDh/vvl5OX7+v78/Pjk+v/10U12dHB/cnJ+f3hlcUpIdmBvbW1ubWFnZmd4fndLd3d6fFhNXF5dVEHd9Pzl8/HcxPzz5Ofg4vvk4Ozu7ePywfP9//rw/v3y5+Dh5/7BSUpKdnF/cn5ySEdYSVBEZmZhYWJoY2FhZH5IdVlGf3xydHRzQ3VxRND2yMrw1t3DxffO+OPm4OLo7+Pt+v7/9fXSzfTD8P3k5/vlw0VNSkt4f3N+cV5cQE1fQHd8ZXthY2ZgZ3RASHZZSXJISkRARllJRFb0/Pfg5/TIw/PM8eX54e2Vl+qV6uni5uH/+fr08uTt7Ofn5PHP0kZxeHlnYWd9QEtbVUd0eGZsbGFsbWF7SHRGWkZBSUJwSFFLQ1Ld9MHw8czM3dxJS9zW3PD+5+Du6u/u7eby3/Xzz/P/5OfslOzh+//ERtPRRlpf1ElG2FVcW1xxY2dkYGxjZ21hfndxeHN+YGV3TU1b3tHR5O/j5ubh8vT75efj6OrulJCQl5SU5vH89fXKzcdUxvj68cbBWWRnfGRkcHpkfEleQklHd2RnemdnfXB/e3Vec3VNeGRhfnF+SnVxSVD1yMj31UV1TlZR9P774eOUlJWWle7i5Of55OHx/Prn4Obh+/TfQURBTFlwen9wdX52d2Rgb25pb2FgYXh7fXhxQn1mZmRkdtRRWtz2/P7n4eX3zMVSRc35/eXt7+zolJXp4P7C0Pb/yMrz+P767OL8xFZacFhUS3RwTnd+dkp+ZWdjFRViYm9tbWNhZHFkb2lpFRduZ2d+S1TczOX2xdFeQXde9Mj2++Pp6ZeX6ejv5P3x/fzOyfX39fLh8MLHW0pzQ15GXkpNRndRWn54YW1uaWZgYWVneHp5e2NtaG5oFWB7e3J3VsL1+MTSV3NIdk/LzvP45+nokZbqleLn5/7n+vbD0M/fxvHB2Vp1SHBKTkhOfHFKfXR+YWIVFRQUYmZkfnZGQkJJcHlnZmNje05Mc0fHyvX0z9xST051StfWV/f45Obj7eDl+fbKx8T3093D3szx/vnC2dna19bGVV9aTkxxdnRkZ2BuFRRsYGF8eXNCcn16Ym1oamlkdndB1Mn85eTl/vzJ2N/G8vH85efg7e3t7eHn/PHwzsjPxd9X0sPYwVRZRUhc0NbG2tZGSlNJcXB/cmdmemVwdEJbTd9TfX17emJrb29hf3xLcUdVR19aTXJmfnRJ1M7z8uTv7O3o6ujn5+Hl5Pr899r08vD4+fzE38rJyP3K1EZKTnF8c3pjYmNhZ0zRWVhZVFJDd3B4Z2BmZnh0dEpE2cfX1NxLcXx4cnRQ3N3B/ef6+uzm+OTl+OTn+Pbw/fjh4e7u4OPg5uDi4/nwyFVfXl5BZGNhYmBmfXBwcH54fnxmb2tpFWppZ3lkfEHVx8HYUEpXRndA18DHw/zn5+Hj4eX6+vDw5/v3xd7Gx/Tz/fP8+Pr64OPk/f38w9jA2NFZT0xJWVRU2MXdVEJeW2VmZmNib2Bnekh9enNY10F9dk1KSFtWVNjH9f344eLi6+vs7OHt4Obh+/rk4eLl5OPk5uDt7ebl//ffRUVweHhgZ2Vle3lcUE1edUxPen9haW1sYmFlcWV4cnZRQ3ZLdk5LTl1VzdjVxvT4+vri5uDt4+zj4+H//v/k4ufi4frg5eTi4ub2z91S0lxZTH53cUpdVsPWQFt0Q0FyeW1sbW5kfnJ1fXZLQ9vdX0x2dXZDU9vF0N1e0+Xl+uX75OTu6eLu4ffP9vrl5+Hl5uLv7uno5/LOU9zVUVl8f2RhenxDdHh/Z3p/eXliahUXamlvbG5sbWB5SlNZSEBIWVDf9NjH2VHdzfjm+ufh5ebj4uD69NrN9fD6//P9+eT44OD898zG11LJ2kVMdXdwTdVXXlTY1kbc1nBkYGJibWFgb29tYWBwRXxlfnN8Z393cnZ0SnJDwvfK/+Tn5eHv4uPt4uTn4uPh5uTk+/jh5fHzyNBcV1dLdnJ4ZmJjY2Nkfnl5eXJnYGNjYGJvbGliZmJne3F0fXBMdXR0S3Z0X0tIR1pHRdj9/fj/8M7Yzs3C8P3J28P0wMry8/fL9vz8+fvO1dnGUVZUUXB6cE9V28nUcnR3eH5kemJqa2htYHt3ZHpIdUdf0dRPWlPVzPT+zFDE38z/5uP/9PbO/ODs5MjyycTGzcjeV9VTUdzLx0p3fHl1RE1weGRnf0TOzlZGcWRlS0VwfnpgYXpCXENJf359QN9cXEhkeHPc9N3FRXVB3/vy/uTPwMz/4+fm/NdGXPXIxfHRQF/Y/vzy9UR0dlTZT15wZmZ918HMwEt6ZEnWQVRXdGZlT1nRzV94ZUrS3/f3VnFL0/H45/zQSFXx9PHl+9rE8P7m6e/lwsr+/Pvh59hE3N/D//jGfmF+cHR+emdiZmV9X9JSem1hZXZNdXpgZmBkWsH1U3lxW93K8s1bU9nb/eTk9FNBWNL0+ubx09TH5ePj5PLO1NfH9PPA011dyPL5/MHYWl7B8PBXWFFJXszDzdV1fnxMX9NYdXRhZkpZV1hJZG1yQU5Ad3R/f1HJ8MXZ2EHR/efh5OT2x/vi6e7i58jA9vjk/P7OUN3w/PbLwE90W1TF1lhHcXPf8fTc3HF6c0HGwvXAWE9C1MjEz0V4eH5IQk5wZ3p2W9vU21x3WVLBzsXFQUlAXPHy+/rexfX85uHi5PL1x/bz98JZW1bXyc72213S2PfwytlNc3J4fXZeX3R1cUfb2vTbXVhwTE1XUnF3dUJUxMHFV9fTw/X8+trT1F3c9fj69cLZxPbx//XawV9EVtHcXlpNXtrJ9snHwVBTw9rQT399ZX9MUsbS1ldEwvH09N9SdX10TEVDdnFxT9LaxMz1wtbI//3+99JbT9DcwfTax0VZy8z0w8RTdlNFQFZJdnB+TlBc0NBedkTUUt7KXXN9c0nRysfMRkfF28vx9NxISkp3WFtdTV/Exfb3//fWx8Hz+fT81UvX1Pbn5+TD2N3I+Mj9w0xKeXZPRVB7cHVx10FOR35wcEFRTEZ7Y2dgfURRVEp9ckP0/f/1UEVxQNvYyNdOTU/Xxs3M3tnV2/Pw8sJfRkXeyv303lNCQ8b++PDBX3dCVsXH0k90d03dxNZcRHV3XsXcX3BkZ2RyT0BJdXJ/R8LxwtVTSHF2T0F3fGd7cMD/8fbCw9vw4e3h9FdNUs3L98jEwFxU9Pr699lRR1/Rw85YcHt6d01EQXZMQ1nCwdlaeWRgd0RTUXFyfX9fwc7I01B2c3B/cnhmYGxkTV/XU9FcSUVNWVN3fn93wMvG2NHfU8X+5OLm98NF0VxEUEVadkzV2MbL29zX0MbTxNB1fnl3SkZdXlhOWff+5fvxzUVDdn1KdXB8cktARcTe0ldcUUhNQEx1cEFS2/f1zNze9PXz//TFWV1fUcD09NNFR0Fdxd7XQUZFR1ZQRH1le2R+TVzaxdLKz//h+czWX1twRFdeQnBLRtXMzNr02tdPRt1HcHt5cHba98D01l5BW/XAUNVFRXVG9FxCRndyeUdddFHRXk1Q+fPIwNxXTtj91c3yzc/87OLl5fLYQE/eUFzF10p0yspV3cbXRV7OzNnRVl5a8uf19vn019fy983B2t11WNnUVEVLZW1/fXp/fU1yTcPc1lhLdn1U0lfW2M/SwOHn5ebl89zT2VRTWEFMc1jeR0FYR3VJVFxZ0VBaW9v1393HxNjN9vfFyvTd2/f09vDx0kRMdkN9en1+S9bHxtDfRH91TVFbTVJcUMD85ff9/MXDwvHHU9lZSFxc2NPFzdXN9PLJ1MRHSNba8srO9NzM3/T+yvn2xPHx+/HN9VJbREJIfnR8YXBA0/fD98VeW0xdQ1/WdVnayuX4+vzBx9Pc0VpdTEtHd0lxdEB2cnJxX1pSR3VFTFnE9fP2yffJ9Pf1ztr39Mr5+/fb1VVBdk1FXkF1dXJG3sPG1ddRUNnfwcXUy8j+4eDi5vvywsrywNlAdHR0RE1RWHd+bWF5eXZydn9kc3FT3NbH1Njy9P74+Prz+eXk5vj21VbRU9HXRHBmeXB3QExMc2RwSl7B2cBWVNzO+eTm5PL29Pb38fzY0NTUyvP82Xd+eXF2Z3lyfXxhe0XYU318dkRWUcTKxVBLWsz+/8VXRUle19j11tVdUcv/895dSE5EVc30w91XVsHy/v3xwNBSxM7awVt3f39AU1XZ0VlISFtT1FFOQ1DE9vfM2FdaRldX0sXC317Y8c31xVp3fnB+fkhxeXt7dl5QQFt1c09BWd/eVl/S8fLl5+bk8vf/8/3ly1RZ11fU2NJMfH13cHN0dXphfn5yT1hfcXF1XtnN8cvI8fPg7Ozj+PHG3cDYw9NJdXVIVVBBdHp/fnhlZHlkZX1wUtvxyNnfUsHJ9Pv2zMfaz/b889rTRkZS11FYQnR2fHBxd3RId0tETlxdU97fxfD5+vbO9/T09szz/fXJQ0Pc01NYQVl0fXx6cHVOQHdAWEVPRtTR3NxQXVhSXFhdUFfeXVBOQdTXVVpZ1VFHX3RJSnVbSExZWFdfUdJUwMDc0dLZ29DX28/AxN7A9/n5ydra39RV0Pf98PPx9PbIydjW01JW11zWVVhAdU5STUZKfnd8fnx8eX5nYWNnck5bQV5aQV3H9fbx8PH///L4/Pz79fTx9PXE3dxCdmZgYW1nYW9mdVxZXcbww8zw/Pv9+Pr85ODj5uHv4Pv1987VRX9nY25uaxVobGdkZn9/f3ZlTENxU1lR01P0/PP/8eTg++Pp7OfH2E98f3lmYHhxWdPbycfcxMrx8fbOU3R3SEZHTNbUWMf0++f4yklke39yfXhzeXNa0PfP0FdM1fT3+/72zFNdRNXG29xSV9rJ+/nx3Xd9fn19e3h8fUxF1Mr9+Pb95fv98PDN1VXdUkJU3lFT3fHx2lZZemBnemZnfnJxZX9aVNDU2lDe9sz29cXA0ML1xvHx3trY9PD199ZLfX9Adnh0fWVlckZRzP3w9fPl/Pj7/fDcxMre8/71zdPFwMfQTHJ9ZWNjYmRkYWV4d0Hc8PfF9fXx5OHi4Pnn5P/55+3g5Ofm5+Tx98JbcWdia2tubm9hcXVFUklKSVteWNPSQXd8ck9yX9Hd9vL4+cjIydVbWkNCSl9cTEdR19rTXUR1cVpW08TS3tVZXlDdyPTz5e3r4uDh8P7y8f/Lyfff2/b8+/70y1BZ1VDdRXZ1emR2fXdNdk5LTMbEX01/ZGZhZWdld05HTUPT1sXf09rKzvPl5efl8vHJ8+fh5P7y5+T68tpXcGFjaG9gYHpnZXZ1W93H9Mjy+ubt7+zj5Prl+uTh5P365f/y1193YW1uFRQUam5uZmVhe3x0XdTS3tTf28XK9PTxx8za3sPO9PH13VpxTEd8eGR5S1j19sHM1dva0uTn5ezg5OT85PnCy8/a2Vjbyt/9wUZURd3Ydkh9e3F9Rl50SHxmcHdczNPT11fcUND0x8z0xcfH9+T689xNQ3J6fHt+d3ZLRE1dT3d0dERZV8DEysjf2sby+/7l5fz/8eXh+/fXdHBwcXdIdHZ8cHx7dHB+eGR7fHBNWEx0dnNPT0RFQlZTUd3P//r9xNVHQE9GXERZ1FTZ9P/h4+Di4+3i4Of20tBHSkFLcHFkZHt5fH1ER3F9d3BwfGRyfnlZRdDEzfb09vrl5eXn5vvK9ffA3V5dTnJJTUtISk1HfnB0fUhJc2VjZHh7dE3RV0TUzvfw+OTk9sryysfI9fVXV8XXxM3NwU9DUnF+d0plaBVjZmR6dFpzdtHewvf/5fj35ODm4uHm/MLxys3w9vfXSN/R391MWkl5dnF6eX5mYmB0QH5+dFlxfUdRTkXcVkxJUsBTXtjbVEDR/Mzb3NFFQkXf3Nz3+fb28fPz9/nzzPfy/P7Kzvr2zvX3z1JAVENAUNHVTn12fWd5YWBjZVtAdEN2TnZOwPHx8fX3/vzl+fT2ycv52sTDUdNyZGV8cWdvaBVoYmNmZWVwcXZU2cTdwM7O+ebg5+T65fzM4ejq6PreVndaTnJ1SkZNdEZeRUh3XUBLxcfe3NFaWUxE38L3xcryz8XcTHx1e3N9fUVA1/H2yc7y+vL28cPSRkBcS0JeTHZ/YWdtY3J9enppbWJuYXp+SV/1/fT45uXn5+iXl5CTlOnj5uf77Ojm//Xk4fPB1npjYm1uFBZuaGppa2NnZXF9ZX56fXRFzcDWWVP0+fD4/Ofs6+7i+8HZU0NMRd7L9sJAdHZ0RVFXU1FdS3deXFNX19nO8vr8/f/88VBbWEbQ1k11dExX2Pfx8ffexM/EysnCzdhV0l1OS0x0ZGZ+SFlOfmdtFWxneX1xRdbR8vj64ePr6ezqlpfq6ezh+Prk+PrL3VFJRld1cn5gaWtpaGhiZnl5en5EX1TT2NNV3cDG0NPbX1xFxPbA9P/w8f//9/TO9fTL2/f+/vH5/fTL8PXGwMXdX0BNT0FbdXJzdHB0d13Fx8pdTEdyTk1ydnJ1V1bA2VzS01PZ0sP0wc3F18bYx/X3+c5f1d7O891Ac2ZgY2JhbWJtaWNlcExC1tBdw/fz4efh7uLs7+3o7unu5ubg5PlUdn5uaRQXFBcXaWoVbm9meH5zWV3S9/7h5+Pm8vrk4e/h5uDm7OL/+MnQ0EZ1dnh0TUh3fXZPTFlc0dtWdU5wdnFmYGxuYm9mfnXc0XNzcEJQTFbRWsX95Ons6ejj5Ofi6eLg+MnN1kbWQk1KZ2FiYXR4bW9oa21ifH5+TXB019L75P/89cnz8Ofh5e7j5eTl7Of09dFUwsrE1nB6YW9sbmN6YWdjY2FgZ35hZXJ8SnFEzNze0FHL/vvm5uXi4ub7//jw2d9KenJ0X9BA0F1Cw8n28dTJ1UlU3M3xUNrCUNjL+u3k4fzF19Jf3HRzTEZTUFT30dDB28zz/O3n8fvb0Fd3TUh6emBtemd+Z2luFGtjb2FjaWFjYHdDVNZZxvbm6pSXluqXle7u7e3i8fDk4ePh+flXWF9eW3J9Q3xlYWB6e2ZmY2ZhZnhxSV9FWEJd3sT2ytnGyfz//OX65/7K3NnH98/e2dzdVUdJdU9KS01bW1JPcH59cUB1SEXXx8ffXVlTUkdcRltSUdPawv3z+vr75+X8//H8/fb03l3VRkZxc3F8e3R9fnljZ2BvZ2FwUlHNzNv28P/g6JSV6ZSUlevg7OTC/f/D009SS3d2d3Z4eHhkaW5saG9jZ2RhZ2VmZ2VMQnFJW1FZRVdZdFTO9Pb67pXt5uHj7eyU7+T75u3t5uDk9NjG9NpFRXBmY21kZGBlen5yen59dMb10dZc291fxMvA9vfl+/T8+snQWM389/H59tpPQ1x1XsLSdWZwWnB9fXBkYmB5YG9mf3tkfVLQwvL64OHj6u/plJTq4OTl+vDx/c/D3spcT3BzZGsXFGpqb2RhbG1kcEhV/+T7/Pzk+vrg4frl5PjK0c/1xVVGR1VbU1R3fXVBRkdXxF5CfnJFWNvzxVJHcXFzfHN4ZWJsenlDUENxcEBc09rw8vv5/uf65+Dk5Of75Pn+5crCVktNd0lSRXN7ZH58e3R1fWBrb2JjcUFES35OX1Hc3trbUtXax8r7+v/w5+zt4OPt7eb6/Mr1yMFfdnx8emFjbWxrFGprbGd+eGZkfHVNXtrMVFJRz/7h6OPl+Pvk/8nLx1BGSkFaRNRCd0dF2cdX2t1FdHlxXlDdVFtQWtDJ38jB0NNHdkFX9PTF9vT3+Pjn5uX5+P39+PrKVNREd3dyemBpaGoWFhcVFBdraG5kcUN0dF5UUdPx4OHg6+ns7+nr4vrn+vXByfrw2fX12MHL88JaRV5McU/QVXF2TH9+c0R1cnNxf2Rndkp1d0ZORNX28szby8Lfyv3z8/rm/PX0+fDeU1dSSnRUVkh3TE5zfUZAdHVOV151UFhCTkdRWFjD98ZZTlTd1sbOx8DL8vz98/Pa1FLQ0l9UwtrcxkR0c3N3eGdgYHpmZE1OT1DMwsr44uzl++fh5+Ts7/vx+ufn+Of50HZ2T3Nle3B6YGR8enplcHJmYX97ZHhzc355dnd1QFTRXE1ZUUBd3sfczPrl5+Dv7+Ht6e3+9v3x2dfOzNrAz8tafXVIe2R8dnpgendLdE3cUdP35+TxyMzB3tj3+uXz+/bAxNrOwtFUXkBB08nz21NKdnB2SXRLf2NoaWNhcklFcWR+dkFQ0svVTkpZwvTw/+X5++bt7ezs4fPR3fXzysj010t3d0Nd01VUR3dJTV9HRtDF38L/5uHn9dBISlpYVFxDSU1HV8fx8MvCzcDA983C1UJR9fb98s3ddXBIdGRhaWsQExYUYnpzTk5GxfX+/vP6+Ofs7pSRlJTp4O/olZXi4fRdUnx8TXV1fGZ3cn9zZXx7Y3hwSlpMRkd3WVfRycP1UH1KUFPQ1VXVStfKyPD84eLw/Pvl5vP0yFdAWlXRUURbcG1sZmFhYXl5fWVleXx3Q1LL3Mf9/OXk5OX6//nk5PveV9pIfXhyT3J9dVtWU8L03UFc3VtzdFDRQF3d9v33+uTxz/Tk99bZyN9b38bG0lbG9PD29PfVcEtEXEVAUlBAd3ZwcHlke2RmYGxkYGNlfklMddnbVdXK8MJYR1JJQlpW2V3a5uDn5eLi9sv2yPXY9fn99Pj85OXw5P/W3NVWT2dgYmluaWxgZ3h2f3pkeXZfxvby+vP18/L99/Hl8MP29sry8vb00ddASnVheHxvFWtiZGVzSHBzdVjV39n19MtVR9bV1sz3/vr//MPTwsv1z8DN98DA9/T0xN5UVNRHVtxMfGV9d31PVl5QXUJV01b3z95YcURadF7H8/v9yfXOw8/0zV1McHJMSFLUSlpES9Rc0/H3VEV6YWZte3N/cWZhcHt5WNHYWEdS11fG//71wPfy+/j74+TCzsj45uHs4vzC1kdMcHRXQ39nY2Flclhc0dBcXlHc28HSQXZxSNz3w/T80dVfV/D2/+bxVl3d9/fK/fvDW3RLSnNGRn1gbm1hYWV8dnpsYGdzW1BET39lSlr05+bv4vj++/7/5uX+yF1OTVbVwfbyxltMXVbfx9JWdVPJ3/Pw8/tTdN/D9Obk989JU9FZyfz4w1hyeWV6TlBbQHV3SkHc//LOUnl7emdCSWFtahRtYH3H2FFWTHHVXML/zMnU2Mf0/eDj4efk+fr6/uTx1U5NTN3O/+H3W1tDUMLz5PzGVldTVNjM/stXSX5len5yeH1mZmVnfFrcx9dOXVNS9Pzy8lXTwsj64e7p5vfHXklX2FJGfGBkZGZ+WVTeV3RMe3fY39JYdVtAXfX5/fdRd3B5Wfb0ztxD0cPJ+eDi4efbXUNay8zNydLRx9/c8P7B3XN4enJSXUVCfmVwddP75uf/3dXH9O3g+fLI1FtFTcPKVdFxZmRmfGVnZ21ua29gfUN3cWFse07XxsfzzNzVwcj54uD7yNpd08n39f7z/v/45OPs4/nK31JczMLbXHR4ZHfXwc7RW3FhbWVAUkFMSUpQ1cTYzPT78cPYwv3LxMPYWVXf0lfZ2dhBZ2xjcE5OR0BxfHJ/dtnEwF5zfX9aX3dBUVZT0NrT/Pn9yEBPRsDPwfLz2l9X9P3i7uPxWXN9XdXY2EZ0TkffwPb7yl1S1VH18sDIxXBP2d/c8fDK3nlnfnZFXVpFSHNNUVLcztFAcX94dFZaSEx0X/TE0dreQ3lhY2VwQl5NXVh3QdPd9Obm/dlZ1cf3/PL6/fbl4frm4PvEXEJM09BUWlhET1rRxcn69txOc2Zmc1/WVNtQQEBY3v7EUkNxe3lFXFZeXVHN5e/o6+fGQndzdtnYV0NOfmR4ckvRVnB7ZmNpZXROfHFOTVBXz//9xF3Vw9H3+/7F0lVU2Nz55PZVR3F8fEbE2MLl5+Tk5Ozo4vnJ19VaWsbeR1dQX9rE9vnfcmFob2Njc0ZJQVJGVtr84OXJ1kl2cGR/dntlcnlLSkbFRmNvbmhjeljUSXVeRtHx5emV+s/b0VZXzvDx8eHj5uHg7eP101RQVF3UVNRaVsXy5e3r7/R1fmduam1gYG1heXVB0/fxXXdBW0twVN/cVdPI++fvlevk13R2c3hEQHB7Z2RzfXfS3F51e2VwfktfXljT9eTk+OPg8tVJd3B+dkJ3dUJ1Vsvz7+rh9FBJQUtbwcvM9PH55ufu7uTNUllMf2V6fHB/d1T3yfHk99Ncd39zd05U3lBYXMfN/+3kxF5weGZjYWdkYWVK09DO5flTfHl8ZWdkckl/dN3C/ODrlfrXWHZ+f2Z9WnVZ8eTtlJGX4+Hg5vHTW3Z1c3fT8fPn4eTJR319YG9sYn9yZ3Xc3vLk4OTwVNxYTUlFwUJIRMjw/uX4wNVOcX1lZGVxdklez8j05ef89NV1ZWxhZ2d8QEPb3Nr0/vLfSX51cGR/T1vQ3vfm7uqUlOjhx1Ref3ZR0MzXW1f35e3h9PRedX9meXRYV9XYzuXm4uDwx1FMZW9pYG1memBlXMT3+fzn/d9MYGNxYXdSSUrB/PD/8/PE1XBkYGBgZ3l4clLKzfPz+f/62NDTwvHe8vD9++f75+Dh5eD1d3JyT09HQNHF9/bAzfbb2V16e2NiZ01fXVPNw9fw/PX2UmBjbW5jf0hY3PX/+ODt4u3t8VhHfXZ0eXxIUdDX08RZTHVla25uZHJ8fXBYVtvN8/z/8t58TVVT39nYy/3w5uf5+vr0Wn51VERTRnXB+f3n4u7j5+XOU0RIcHx2cF3J3tTC9NHf21VEd2VjaGlsYXN3WM/3xvf89NBLSnR1c3dIcHx8SFNeVM5RcmVlZUxARVd0Wl3UzvXz4f3AXk5RxMFTxMbByPnj6JXq4PZVTUlH0UhU0VNdV9rO8vPCS3x7ZmZsa2JhbXp12crw/sj13FFBX1hfX1VWU9/18fT32MnXR3F9dnByTnVNUEJBW9nWVEB2dHJKTFpFT1PdxdjJ4eb5wHR9e2BgeFpXwfb//ebr7+3j9czAXlpJSnRBXdzC/O/h5ebyVUV3fk9OZXl7cUNGxMTcw1VLXltxdXR8d3FGxVbe01/QTnTe9F5OSXlxQ1/e2/XHVcDTdHN0enJBe39N1/P898/Qz/zKzP738PLVRlTI5Ofn7eHn/sza8/Tf3sbQTHZIRVNeR1ZOc3HVXE51TF7e2NDYUkZ3cWdmZ09CSVtcR1VW3/j85PP/yFRXUEB3WdFWWtrI/vjwXFJ8YmNhcnh4f2FheXxFy/j28fbd2vXz9vjl/fr+9vjv6PrBUH5xWV7XwMZfR0lZ0P3kzcVTe35Q0ML398XW9MnZyv731lx4a2JjbWVkYGFzdnZB//zX0llfxs/e/PXRQEJASlb18dRXR093cmR9SnRzdU93QVDH3dLbyvPk5ePo7efk/PDl4ezkz8XG39tV3/fbdUtKcEtC3dlUdV1WX1pF29NKdVhGUt7Gxddxd0/X9PX/z05xfWF4QFHS00NMVVnHwvPNXNXVREzS3EZwZmZ0QFPb8vnDXUNGT9729cFOcEbexvzk5uT6+fP1/ef+/c7Pwcje9Pry9cfMx9Pe+PXTW01eWUTb+/TJ1UB3fHxEWkpLcHd3dk1dX9ZVU0p0QF1WXEB+fnJKX871zsBZd0pSz/DC3EFBXl3Y/Pvz8czcVlfaxtvG2crz8Pz5+PD2zdfSx8jB0tJWU0Ld/efn+eX0T3R3SnZ+c2RneHJOU9xUzsxUVlhdU1vcUUFBV1BXw/TyzdRJdETZ01RTSnZDQlvc0PXEXk50SVt2cV1EXNzEwsdcx9RLd3FzfHRS1dRSRNzB/f3y+8jYz8TeVVrWTH/UwtDP2sPK09TfVVRdTndPS0DYXVJV2/TP295XUMzY0t/Y29tXV1lHUU5xd05xfHxxSkDUzNjF39nJ111eRUN/f3N5dE5YXlTV1PVQdHd8eGRnf3xIRMbK8fD14eXk4OT598TD311dVdfQVNL98t1HeWdmbWVze39OSljVVMjx9/f//Pv19PTB9Pz95+Tz+/fG0lpnZmNgZGFhfnxyQlvG9cVfWE53eGR8eHlaR1zf1vXDydj1/P7dcXR8e311SVRVzMvyyNvR1VVdx8rMzcJS09bXVdLMzdvc2tTb115fWdXKwsDZ3NZX0tXXXFFU2tdbX9jZ0vb58NlBQ0xhZ3txQ1FOT0V1Sn9yeHx0SnF9eXh7eXRJWM34//Px897R0Mfw5eTw38388vbExt/TTEtT10ZLVFxXw/L6/dBdR0RBdUtAVtTGVVHVXsb3/+T69F10YWF4Z2BhenVNWsTHUVFYT1XZ9PZbdUBDWkXTxsLYVFZ0c3NPd0tfW0Bzfk/bzs7Cy8H388f19dDFws755uPh+81SSkxKTlvVwtZGRHVKUNfdxsBeTnV9fXx+cE5MX1TRxN1UUV9d2dnTX0RSWEJW9fT998zGW0hDR1vWz/P8yMrIy83Z3ddYS0t/ZGd4cHZ0R8H55+Dm8s1EcUxbSkXb31Bc0/f9+uHi5slUXddbTklBdHFZ01BJdXx6fkRR01l3THZzc3bT8vDw/M/V0c/xzPnj4uD78P76/snc0VBAcHdLcXJ8ZGFC3tPSW3RzfHJ5cXdMU8PP28z65fnj7+7u4+X2wcNU1MnFzVBDcXRJdHhmeXB2V8RV0VPG29nw8vPK0EFHXFXf9Pnn5OX4++fg5tNdQ31+Z2NiY2dkclD19v7lyMDJ8/TcxMvB39nbzvHz/f/28Pb003FwfmdibGdxc3xycXN4StjHzvz988jW2fT9/vD+88/0zcZQzvz7//n/zMRVUV9CX0t1QHxken58dlvPyMr7+/r4yd7S3s7M29nT2/HYXtfay8LP2FtaxMBaSXFOWVfXQkp3dnF8eHl0VFl3Q0dZV/fh4+D799LYwNvbxPfy/Pvz5ebk+ffMwsbf0k12SUxGXNnL/+X9V1XdRnZxSXFxcnJ+f0Zd1M/I9/LI1tzK9dpGUtlX39tcdk5GQFJFXMzIxU1xeX99dEdOQEhxc3t9XcL8+/vh5/D7+uXm5fXC3VBaTkx5fU9TWUTU1tFdQkxY3/3h5/n2291Uw/Pl/83XXURJQHRzd3RCX0RY1NB2Z2FleXdaUlhUUXx2XN3Gyv/30VFHTFLfwsTT19fdz95HV19YV9ZSdn92dn50U8TL+uf/989aT1hTzcr12UJ0QEle3s31yvPCx//4zt1WV1pAXEt/emRtbmxmZHB0d3VzZWV/SFXdzt9bX13dyfD45+Xg+83BV9RFfXBwfXB2fHhkZ3p1Wtbbw1ZMQ3RC0v3k+Pn59cTb9uX6x9VGSUl+emZgZGR5dktBVkJNXVrC8P378PHAQHB2f3ROTU11XUV2cXRJ1VZW19fAxt/J0lHBxPTIxdpeTUZ1X9jRycNYWVhxcGV1xNHH3kRxfXBxdkVFXtRW19VHRFpR29zG9sjWRHdze3FPd0FEdX54QEdMRd5YXt7QUELd9vHh4frn+/3xycVTRVJAd0RWQEpwcnFZy83R8M7TXHJ4eElIdV/RV1VRV9jG9PPO9Pryzt1SX1/U1UTY3kZHd3plcF/SR0pwYGNtbGd7eXtwV1ZRysvC+eDr6emU7uHm9s3OxNnE8cJe1dF2TkVHRUdHRXJ7f2VwT9XG9vzz8PLw9P/++/7x9t5bQU9NWVlGXl1ASXZ9ZGRyTU1A0VBKSnZ4fHN/dkZKfXBLdV/z5Ofh7ezj5/7y9sjMw8bY2dvWVFfXx8HJ8PZQcHd0QNRX087J8fz8/Pz9+vj4/Pv6yNXX1VPfU9DwzFdHfGdnZH19fHVKdnN8fXBzdkpbWFbHwcLG9eTg5u/o7uL+w91UXE50dH50QExAQFD09fX5/P330lZYQNfY9f7998rA387y//Ty/fLyzd/Q0FdXVVFf2NJZcGd+dXda31xXXnR0SXJwT3R+enJwdU1UyeXm7ezu7uH7yd1bUlNfWFtOd394d0BGW0dxQkBKS0p3RVHa9v7j7u/h5uDg+uTm/vfB19BSQVLSTtZ8S1BmdE9ORt3W0cbP1UZ3eGV9fXdOdkN2Q9zE/+Lv7+Dk5PPMXXJwfHt8dkNHSEXV0cv1yMJe1lZa1kZB0FHV1tfQ2sbM0dn58vj7//7bXEVM193Q1UZ2fGRlfXpA1FpfQVpQTHR8ZH1yfU7XyffN9vrm7OLi4uH8xF1OcXNxc399fXJ0QlZW3dnW0dFXT3dBRkdWw8r08v/59c71z/L58fDI2FNDdHJ9fXd8f39xcXxK1dDRUVzdV0BzeHt+eXN9fXF2XdDZzPzg7umU6uLy0tLG3tzXS1pDdnF3SFFX19RB3VxNdn51Rk3czPf6/f3l/f/n+eX29PLdSX5ySkpKdXx/eGFnf3p8WdBVTVhYcWVgZn95c3N8R0NOVtXG+Obg5uTg/9NPcXZHV1FEXlVEV8bEwvr68cPC2l92ck9EVFXV08za3cXB1Mfh7OHg4PPYXlLVwfXG1NVScHl8cn9PR3d+cHxgbGhqFWNmZHh2Tk1e1sz94unu7OPwytnTV1XaXE5PXUxGTE1L1c7A2t/UTE95ZUrE9P/y9vb19/Py/uPk+PnlyddYfXh/d39/f31/fHN3WNPQVFhHS3h5ZGdmZWdleXJNcH1OQFXw+OXn5fPP2dbfyMjGz9vQVF3R2NDRR0pISnR4ZGNjZmRxQcTfw8j29vzh7+js7efl+crA2t3cVF9YT0ZJfmRnfXRwfX59cWdoamhjeHlHRkvV0Mfz5u3t4u7p4PzCzNJBR1NASHVASnx+SkRZX0ZCTUZ9fnJ9c0fTxNnXwt7Rw/Lz9vH38Pzwx9DS2dj38M9ZXVVId0pBd3BBRktyeGBoFWttenZwfkFSSlr35ubs7u3h5OT/zN3C8fP1013a0FZfXkhxTXR9ZHpkYGF+R8DNwsjL+P/l4ebk4OLm+vz69FVFTEpDSnR4eGdneHJ+Z3Z0Q0l1cHx/eX1NVVBSV9fd9/jl/+Ht4OPg5v/38f318vLMztvR2MHSR3ZR3VjV1k11c3FCW8zA1tjez8rJ8vPz5OX/+v7w+crDVkVRdXh4fntyeWRlZXlmZmRiaG9mZXpyQ0JZ1PHn4O/o7urq7ens5+X68/3C3FRLRkF0dnJzd3F1dVhWUkVX3cbB0s/29/7k5eX65+Hk5Obg5vr7883JVHV0emR+fnF9fnF2SE12fnhlYWJmemZ5f2Z8RNTX1Pfn//ri4u3s7u7h7eDy88vSzMbcUnJ0f2BlemV4eXp6dtBDcdPWwP/k7OzolpWVlpXp7uT8z8jFZWNjbm9gY2JvbWZjeE52cHZ9cnt8fHp0SEbd9fP98/rl+Pr8/+X68/Dx99JCT3R9SltFWFpZQUZTUEJBTk5DWtZeWV3R38v38/n75OPu6ZWV6u7t5vLDX3B9cHJ3f2djYmxoamxhY2JtY2NkZWZ6TVXa+O3plZfq7unr7uHn5PLKyVxweX95Z2BibG1neXJPVVle1tZTXt7X19j0//7n5/j65Pvl5OHj4+bxXURyY2JiYGVwcHZOTEhxcHF/eWRlZ2NkZGBmcUNY1dfM+OTm7Ovq6pXq6e3i5cJdUd1ZSGViYmxoa2lhZ2d4enl0d3xwQtvy5+zulZCRlpaUlOnv7fvIVXltaxVqFWpqFmpuaGZydUJNQEpIREVYWF/b9PPn5fL5y8bD9f375ub//MpdS3N0RFnW30Rd01RQUFZU39VZWUxwfGdjZ3x3SEdBwPHy5OLql5Tr7+zm88VES091fmZtFRcQHRITERYXFhVubmhrZnbF/OTol5SRl+qVlZXqlOjs595Kd3pibWgXa2pqbGxmcEdT3dbezvXLwP7l5OPt7+/h5v755+fh5/bWXHJiaxQVb2BnZ3J9f3ZwfX99cU1EREFIeGBjY2Z+en50TlDU2cz64+/p6OuUlent4efwyNZAcGVtaGtuYWZkZ2Vke2Jgfl7B8eHtlZeXl5WVlJSV6+zk+dl0Z2JtahUUFxEWFhYWFxVpYmFlTNHdx8745eTg5+Tn+/3y9fX85fnDWk5wemRnf3xydH13QkRBdEpW9Pf098rxx1JISkNN18bG8fL/+uDt7+7j4u3p7uD4z83TS35nbGgVFxEQERRob2xjYGBnfVTA8uXh7+/u4uDh5OPs7O3h/vDLXUt4Z2RmYGJiaGlsYmd9TEnUyPHk7e3h4O/s7OLj4uPm5ub75//N2Vh2e2RmZmRyeWVzS3J+YWJgZ3BJX1hHSnZyfXBKWV9VzMfewMr55+Dm4ujr6Ovp4v3b2E9/Z2Fia2hvbWN6fHJNT3BB1dLK5eDt7pWUlZSUlZXqle7m/shfSXxmb21vFBUVFhIdEBYUb2FwUc3l4urr6ujo6O7v7+f/+fHE0ddJdnZ2dnd0T01b1VBSUdVQ0Mr1xvD6+v33z9ZET3VH09PBysvBwvjk/vbw+f7l4eb7yMBSdnd+ZmNvFWtoaxRobG5pb2RyTlHM9fT95+bh4ODs6Ojp6e/t5+Tz20h9cWVhYmNta2tpaWJgZUbZ8+Dp7u7rlevu7uqU6Ons7eD6+PfDWHN8fH5/cH1mZXx7emFgYGBhe3l0dnZaWURMQEdd39nfx93bzc3R1tBUxPDy5Of/9fb8xdba0dHZ111GWdXWVkVOUtdX38/y8sr45+Ps7uuVlJGRlurv4uTNWkt5YWxoFxYQEhMSHRMWFG5hcFTb9fzn4Ofn5ubm5OX/8/fP29J0eHt5fX5OSnZ0SFNfdHRb09/B8vnk5OHn8tLawd/czfP0yPT85Pr54ePg5Ofg5vnz/vLTT0t1dmVlZmJoFGoUFhEUb2xtek5dUdzx5fv45u3i65aU7uTm5MFecHZ2YWxubm8VbmFhYGZ3Q1L15Obl5+Lv4+Dj7+ni4eLv4uHn8t5SRV1JSkhxf2ZlemRmY2d+ZWd6dHF5cEFJdXFA311aQ0xJdEdWWVpaVtVARdbJyNv1z8nD19rE01VTWXdJW059ZXhwcHlzcUVITdHQwc7+7OvqlpGWlZWX6+H68MBTe2ZtaRQUFRcQEBEXaGhjZXh/X/f8/Pz65Pr6+ufk/uX90EJxcHRzfn9lYG1kc359SFhVV9jz+v7+5frw9fzl4fjLx1B1ddTH3dDFzcDFy/758fb0wNZRWFJddHF8e2NgZG8VFRQUamhjfn15en9wTNP24e3i7Ozn++bm9dzT1VFHdnV2eWZhZGd6fnZHdEtSU1XB/eT4/v7++f3/5uf75Ob49//z9PbKzcdFdnV1fWd6eHl6enNJcmZjYWJsZ3p2QkFbQE9OW93HV9DQ21BTzcre1VdeQkHS0MHG29jVU1HbxEV3dHdwdNLw/cDa2N3d9vvg7u+VlpSV6uri88vE3V1FX1ZIZmkUFWpsb2BhbG9iYWZwRU1LR11U08ry/PP0wdZFRkN1dmRkZGdkfkJJf3l2RFbB/uPu5v33wMHIyv/58vf09vXNw1dYX9DGzvL65+Lh++Xy+uPg5vv+8sLd3dxdcmwVFBATFhdqb25tY2ZxRMD9++Ps7unr6OPz0XRzfnNDQEx3emNtYmR8dHRIT3VFxvvn+Pvn4+ztlZSWle/s5//9/fz92dRES0hPXlp0fWdkcUlXxfbKxEV3S052cUp3cHN2dtTTWEBxf3F2RdbYUHV1cXN0XM/89/H/8vP95OTx0UpwcXJ/dlpDTHR2TF9Vxf35/f/h7euUl5Xv5/r5+frk5ffO1kJ3T0BBS3hmZ2NsYGZibGBheHZbzeXl5eT75eX5/P320UxLeXt/fmV7emdldlfN8fHy9sP18vn5/Pjy9PXB8+f7yPXD3NDewf/m//fPx8T3/vrk/8z3yNr18dhbSmRgYGBtYG1uaGpqbHhLXN3Zwfz8+ePhyMPeWkZKT1bSQnRLTUtIX9HH1nVAVVbEzsFV3sXD9PPy4Ozn+/jk5uHn5+T49ffMyf/yxkRYXlNW1cL7/srFx11JQnRlYG1uYWxuYWVkYWVxRdfRxPL0w97SV8fx8vb3xNHD39vI10dOdnd2dUNRUkNaUF9YxvP+//7l4ezrl5GU7+Dn+vL38f731URYQ0pBXFlOfXt8eXh4ZG1paW9gZHxLXVxEU1dR0PTw21NAT0p9dEBwYWNnfHZLRtLOxcTy+f755uf898XIzdLf3ER2dE1Tx873//70zfD/++bs7+Lt4+/t4Ob7w1JaWUxxfGR6YRQWFWoVaGxtbWdz383O+Of48fbyy9zU1txGeXp9emRnZGdnZ31EQEReWUxe0tvK+efi4+Tl5uPh4uzi5/j55/nCwMPVSE9fU1BfUtvXXV7HzNrb11hyZ2dlYWxubGoXFWljeHZCXFpEUNZbVlZZTUhG2sFQTURNZWR/d3F3d0NHcXBaXkJbXV1YWNz+5ufk4+Ll++bg5ubh4OTzzvbC0tVTQHVH1NjWREhIZWNgf3F5cEBBcXl+d3F1WVZGQkTQ1Ux2d0t/YWRwfHx8dUx2QVfQ3N7MzV9S0Mv12sfeWEt3QFJcxf/n+uTg7+Pk5uDn/f7m4+f99M7WTHRfWE1JdXBnYGBgYWBjZ2JpYmVIR1/Hy8LN9P/xy8vAXkpOQXdkYGBvFBRvZ2R5cXV0d0vcyfDn4O3g5uLi4Obn5+Tx9cvDzdNXX1tWVNrOycr3y8/x+Ofn/vPw2UdGRUJ1cXxhbGtqb25sZn9KTFbJyMfd2MHQV97F3dRZTXF9eWV+eX5xdn5+fXBwTlDfwNvAyPTw5eLolZXo6ejv6Ovs4Obh5/PI3FxPemd6eXB1S3VzfGV+c3VcVEVDTkpDdXVLSE90dUpzf3J/YWJhZXt7enl4ZHp2Xlffw8TbUkxW28n2/OX+/PbCzcPFwsLM8+Ti4OX+8vn48vrn5ubk+P39/PL39vT32lJfR0lxfX56ZWFjY21iZElEXNvDxMDCxd5XX0ZFTUlxZWBta2tob2NnfnN1cXZD08j8+uTm7O7s7+/t4+b7+f78+Of78ff08fbw/fDH0NTY9fb8+ffO3dbSUl5aQk10fHx+ZXt/e2ZkckJT0NJTTndwdk5AW1FQdXBwc31/e3hkYWFmeHBwd05PRdf08/jm4u7p65SXlerr7uLm5OX/8vPwyt9VV1dV1dnxzMfL9vn78czHzcjcXFpAXdFTRHdxSk1AQkl1d3B9e3p8cXJlZmZnZX91QE9zfnJLdXRbV9bexMn2/vr88cnG9fjh7e/p7u/i4+LplJXo4ubh4ODl88PaVUBNWdHWR3N9fHhleHJ0dHdPWFfH9MLQRUlyemZmZmRlZGRgY2Jsb25vbWBkeXZCRVtTUcf1+eDp6uqVlZXq6Ojo7u/v7+Pk5OTk+/PKzsL2//nn5+bl++Dg4eXzwFJ1dHZ8eWZtaBcXFxVubGNmZ2BvY2Z5f31ycHd0QUJHTn96YWF6d1pR1cHNwvzl4OLj4+Tk4+mVlJeU6Ozj4OPj5vv+/fb38PTQUlpNT0tOQUZCcWVnY2lqbmFgZmRlZWV4eH54enpkZWVkZHp/cndCXlbc3tbZwM7GyP74+fj//f/5/v/65+fm5P7x8P/4+fr7/8va295TQnB8cHB3dEpxcX5kZWR4cUpKd3N5ZX93dHJ8cn9zfXFGQkJbWVlZR1LVUVZW3VHVz8vN0lxaUNPH8f/9//vy//zz/v/4/PPw9///98LZX1pTWVtPcmdnZHt/dkxATUpOWkNJXdPE01lZWUJ0S0dAdUdEWl1SVtHS0tvAzvT0xszMwsj39/f3xtDW1EVwfXh6fHJ4fHx6fHdEXVlY0NBS08DY1F/U0FbT0sDB0UVFTUhH1sXGzcf0zcn/+Pn4+//1xMLCwMDIw95dXdnJxlZfU1Jyf3xlZm1tYm1nfkpFdHJ1R0hKXtnWVlNWUk9CSXVAS3V1dkNF19nc3cjx8eXh4Ofh4OPn+ubn5Pvy8s7B9ff58cLA3F52S1tOcHdwcmRjY2JtaG5uaGxgZntkYWdmZmRzSElPS0lzfnNIQFteWVta3cDx+fz+5ODm4ezi4+Ph5/j8+f3w9NjVRFfa8fr58Pb39vfw88DTRUB0eGVhbWlqahQUamhtb2hubG5vYmF7e3p+d3RPWF1V09vLyfbk4Onrlero7ujo7uzg5+fl+eXk+vL9/fH08/r6+PbO2FZBRERNSHJ/e2FhZ2dkY2FhbG9tYWdhYGFnY2xjZ2RhYmZhY2V3WlxE0Nrcxf3j7e3v6Ovv7Ono7OHh4efk5OXk//f3wNLV3MDY29/V1UVf2tBEdUlPT1Pc28BST0ZDdHBMSX16Z2V4ZHhKcmZ6dXNw0cH18MLL9/T09vLz8Pbx/vzy+Pry9PX0wvDl+Pv598j0wN/a21BaRltZQFtaTXJ9f39wdE1PTEt9c3x+cUJTU1nW2cD2/eX/8/L8//zl5uf+9sLN10deU0d0S1dcTV3W2lZbXV5dX83zyt5WVNVEQV1dWHVDUUJN1ddQSXF2cn91UlNETEtfUk5b0sfNz/b4+uHu6pXp7+/i4u/u7ef/8PHC0sbOx1ZXxdNQ1t7TTn95Z2NjZmdnYGxiY29uY2NgYHp0d0lXx8PRUdzSUd/L9/fG1NvH38bIyMr25Obl4ePg4ebk5f3+5ebn+vvl5Pvx98rT1FTZ00RSV1BbSXVyZ2d7fmVkenh6YWBmZmNjZnlnZH10SXdxdnB4dFT2/fD++/795ODi4eLp7uLslZXv4+3v4Prk5+Hl+f732tvPycXS3NFZdUhOTH16ZWRib2xjYGxsbWNsbG1ib25sYGZhenNycHRaVlnUyf//+uPi5OTm4eLj4OLi4eTn4fv8/vvn5fv6+fH3887d2t5RRU1NdXV0SkdDSU9BUV9LSEl2fHx+Y21mYWFnZ2RnZGRySXZNUNHY09fDy830/uX39Pzw8P38/vj5/OTn5Ofk5+bk+P/2wdLVSXtzc3x+eHplZWRldElzcHx+f31ycXN/c0Z3ckRfUdXZwfX12sv+98zIzszBwNrH31td1kRQ29Pf2dzEzdvdzMPRU15fU1hYQkt1d3F2d0XRV1Td2NjCV0VSWEp1SHZKT3R3dn1zSnF8dNDd2vfz+uTl+eTk5eTk+vvl/ffGwcD1x8Hx9Nnb2sfUXUVJdHtkZGRjY2JsYm9pbWFhZnt+c3RKTHFzc3RJfHh/ZXp3cXdEUtfI/fLn7+zv7+vr7u7s7eDl+/j3yvDxysTZz8/A2cLE0d5URH1nYWBjYmlvbmtubWFkeXp5fXZKX19DT0RSRnFPd35kZnl8cXRE0c7K9vr6+efi4+Dt7ujt4+Lg4fj9/PP++vn4//D8/fbIy/dVRkF3f2dhY29paGhpaWxsbG1jYmNjbmtsY25iYWV6ZH9OWEFAWdzK9P3h4Ofm4uLn5Ozs4eDj4+X45fjz8PHw9c30yvfC2tdZR0tNQ05CSHZ1Sk3Q29PeVVpMRlxfUkN0cnpgb29tbW1tYGBjZX1wdE5DXFTN8/n6+eT6+frk4ePh5vj7+vjm4Ob6+Pjy9fH3zN9UXU1Nd31wdnNxcUlITFlLfXt+cnpkZXhkZWdiY2NjZHNydlnRzff/+vr//fv69sj28c/CwMHc3NHZyMza2tdbXFfa3VxNRkF3dkxWX11aQ0BX0839+fLw9vP/8vzNWFpXWnRNW1pcXUx/dUNcwPPw8fz89vT7//fOzvTB2dzTxMTVWU51TlTXUFJEQUdaU9ZOd3J/TUt/dUh3dXdOQXRLW01HT05HQEZHdXx6e3ZMRllW3drC/OTj7+7u7e/v6ejv7Ozh+PLw8vTG3d1UV1TVU1pKSnF7ZGd/ZWBnZGBvbmJgZ3h0RlPUV9PZV9fcUV1FV99bRlFfQU5bXFDexfHl5eTm4O3i7uns7e3p7+Dh4OTzz8rIz8j0/Pzw9PXLzNLdWnRxe3x+ZmRkY2lpbG9ibmNke2BuYm1sYnpnZmV4cUhxdEJRVcLx8fjl4OPv7urq6urqle7i5uHg5OT6/dtWxsbHxMPG3VdQUFtOTUdIcH1wTlJHR15GTV5SXVFR3VBMdHd0cXh8eWRgY2d+dnVd3sXY9/P//Pvl+ubi7Ozi4eH9/fHx98L1z/fw9cj1zNvaycnbwcLNzNBTVl5ZW1BEQU5MW0FwcEdLfXl7enh7c3N8eHl/eX9PW1PX2vby/fb45Pv65fr+/OXm5ufk5fbWQkRfVV1XX091e3xydU90dHVzd0jVwcLH0VJcUdvIw/Dz++X88vLw983eVl1TXtTf2tzf0trGzMj39s798/b/983HVUVOR1PUV0VMS0NEXFNbS3F6ZWRnenJKcXlnZGRySkZZUEp9eXRAWkRf1F5TXdXEy8jZ3dfX38TD9fzk+PL8+efm4unu7O3l/PX99sbe1NzWTXJ6ZWdgZmNjbhQUFxEXFWlsY3l+eXllcExaWUXW0VTa2cr88/bO29vQwMzy+PXB3sLI9PL75+Dn4eHh6Ojp7Of+9cn28ubn+fDYXHd3T0N0eWdhaRQVFRUXFxUVamhpYm1paxQXF2ppbGNmcnZ5fnREWV7a9PP8+ODj5OTh7e7ol5GWl5WU6u/t7+H+/fnz++X8/s9TTUBEQkRDeWRjbmloaGxibGppbGFlZ2VnZ2BiZ2V5S1pWQHZwdklFxfDzyPf/8OXn5Obl5ufm5eTt7u3g5OT68frn+vH3+/r8/f3wysHXWHFleH15ZmZgYG9vYGJsb2JgYGFme2RtZ2VnYXpc0EVORFFTUfXxxF9TUdzN8uHj5ufj4ubl4O3v5fb/8sjIy8nUQUVS3dTd9vTRR0B0Z2Bke3pjYXx7fH1wcXp7dl1bTcf2w1FTVNnTyf3z8cz95fjy+/r03NDezPbw5OHl8PX00lhc2sNcQFBeS0JEWEtLVlHd3sL8891SRXV6Y21jYm9vY21vbmxuFWtsYWZnT9bR1MX08/P74OPj4O3p6e7p6e3n/vDx9PH4+/Tb015xent/emZleXplc3RwfXB0SE1E3vXER0x0ZGJuaG9ubmNzcXZeUEFB18H28fHh6eHk7Ont7OqVlerrlZeUlJfr4f71zdtVVNHTUkBDcXhkZ398ZWdwWXdLQXR9fElbdHp+dX1nZ2duFxMTEBMQFhVuZHl3S0hHxPP08ebs4uDu7uzp6pCQkJCQkpCQkpHr4vr000lOWkh5fn57ZWZ4cXBzfH95eXBHdn9yTtJCcH13d3dxfnhhYmJtYmFjYWZ9VlZaRVHJ/fzn4OPs6uqV6uiVl5GQk5CRkZaX6OfxwtR2fnllemZlcHJ5f3RBQ1fA2V9YxdpNemFmYGJtbG9ua29tb2liYGBhenZzckzFys3Fzc/J8eTm7env6+rr6Ojv7OuU6+3k5eDlztREcnl7eXt/fnh+fWV7cn5zQlBcdX53T0tyfmRmek5ZVsXe39rE2MzF1tPM8fTNw/H5+P/7/fDx5OPt7u7t7eTl5vz0++b5/ff18PHRRHR+entkZ3twdHF0fntlZGF7ZGZ+Zm1jZmkVbGBjfnZAUNjM8v795OT4+Pzz98D3++fh5ufm4eLg7uvt7u/g+PHKwfTC1FxEQkVZ1FN0cHhib2huY2d7ZXx7ZHt8e3t9cn15fHRBcHBW0VpU3PT44O6Vlenv7+3m5P38++Ti6e/i7O/j4+Hm+/H0yMZXWF5WWEBNdUNDXVBFdHllYWkVamhrbmJjbG5taG9hYG4VFWhsZHFNUdvP9vjm7e/s7e/j5+fk5Prn4eDj4u/qle/ole3nwd7d1VXX2Fff0VBVV9dZdntmZ2ZvbWBtbWJmZWZheH9mc0Fcc2BnZmFhckHa9PH65OXk/v/7/Pz/5eTn4uLu6ejo6evi6ZeU4vj+3Vp1T1nT297BwsjEXURFcWRtbmtpbmoVahUUamsUa2F5YGhoaWtobGBkZUjdzfP//v32z8rDxMv45+bh7O/o6ujs6pGW7/j68cRYTU51SE1c3NvFUFDXXXZ/ZWRkY2Blenpxdnpmc1nSf2xnb2kUbmV/eHRWwPT09f74//L+//3w+eT55O3o6unsl5eU48fbWnF+fHFJcXB3QVtTUFrUVENwcUl2f3lnYm9gYWZpaWVmY2oWFhYWFmlmZntPVML/+/7y8PL19M32/fXx++Th7eLt4+zp7OjnzsFQdHlzdnN3cU1YTkNZ01J0eXhkYGNgZXl4dUt8YWZ0dHZ5YG5raG9gZH9JXlXP8+fh4+/u5vP95Ofm4Ozi4uLu7O2V6O7h9MjSWF9CRE9yZXl3WltERUplYGdnYWNvb29pb29jYWBnZmxqFBQUFxVraGtsenBc0fH//+Hj4eTh4+nv5uPs7O7u6+Pt4eDs//n89MBW0dZISkpBUUdLSkVDdXNxe2BgZ3plZHhydnp5c394Z2VkYG5tZGR6fnF3dVn0/ebu6JXq6JXqlZeWl5Tr7unv7+/p4ub6/vbZy/fMwNRR01FWVdVRTnxnZmNgZ2BiaBUVFRVpb25ib2JibW1tYGZmYWdzdkXZz8zx5uHg4uzt6pTq6+3h4O/g4eD7++Tg7+7s4+Ph/vHy8fby9sjJxVJdWU52eGRnZGdlfmRlZX56e2RmZHllYGdhY2R5fUpM1M754emU6+nr65WUlZSUl+nv7eHh4uzg5OX+8/Py5OH49vb09/X2/fHCRHV2e3pyeWVjbW9pYmNlf3llZmBsb2lvYmsUaWNmc1LSxfT85OLo6pSWlOvo6Ozi4ODl8fLn5P745OTzyMbczvby++Xzyff0zMreUUd/ZXlkeXZPT3J6YGV9SkNMSnJ4emRjYHp/cHBax/bg6ZSXlenp6pWVlZXu7eH7zMr/8fbN0d3A9PL89s7B1lfW2tvZ0VtDdXx7f3tnYmgUFW5sY2xtYm1iYGR+d3Z5fHJwSkTVz/X0yPDn4OiVl5eV7+Pk/vPz9MTe2sfM8/jl//7K9/3z//zz9NhbTnVOd3N9e319eHl7f35kY2pobGBkZXx+ZXt+f3F3TkZf3vT74ezo6e/i4ePolJSV6u/l8Mffwtvf2tDP8vvh4eDk9FJKSlnU1tNfc2dhYmJjb25tbG5vZmNtb2oXEBMRaWJmcnR7YWZ8cUxH1/fy5+3qlZWV4v3A0MTz+Pry9MzF0tvL8Pzl5Ofj4uDl8sFTfGFkfXVLXVFHcmRkZ2ZgYGZibGR4eWRjbWgWERcVbGV5d3V0Td385uDs7+qXkJKQl+vh9lJGVNDJ8fL++/L9+Obk+f30zM3//s5SSXtpFxdrb2Bne3llbmhpaxUXFxUVFW9ibG5qFxMSFmtjZXNfyvz2++Pj4ODg4+bn4fvxxlB1fHJe2/jm7JSXlOju4fjK3FNfQVzcR3d9emBpb2RyR0xJXUN3cntkY21vbG1nd0t4Z2ZtbG1ldNX08efv7+no7uzm+/Py++Tg4f7xzNrUVdv25+Pj7O3k5PffRnlgbhVqbmZnYmNsbxUUb2Z6enJ0cmRnZ2Jobm9uYH9D1VtPT3R0c0Ldz/364ePh5/j9ydvY09/E+eDg5/j/5+X2/uHt7+zg5fVURXBnbGhpaG5kcX15e3hwf35IR3VxdXV0cnN1fWVkf0hZz+Xh4OT5+//38eXk/uTn5uDk5OT++OXm5+Xs6Ons5+Tn/M/A8vXJz9dQW3Z6YhUXERcWFG9tYG5vYmNgYGZ7YWR5eHBzdnV2dnRf2snk4+/v4+b49dxQVltD0MH2/uTh4frn4+/p6ZWVlent5v3I2VTQVNHf3t3W01JxeGVhYWJiZ3h9eWVhbWNmZHl2d05d1t/NwNfQw/b54OmUlOni4Pr/+f3w9vf2+uTl4O3s4uzv7+np7u/k8PTQTHZ6YWJgY2Fle312c3lnY2xsbW9tYmlsYGNhZX9xTFPf9/H8/v7//f3y8fXx/fzww/LwyfP5+Ofh5uPj7e/p6ezj4+Hn5OT6+M7F29VaS0FNd35xSUVfTnRKdHJ8eXJ8c3p7ZWVzcXZCVcHy/eHg4eDn5+T5/vDPzMj5+vP09/3x8/rg7+/u6unv7u3i5f/2wcTf3t1adnh6Z2FnZmFmZ353ZWdmZmFgYGNhZ2R8cXBycEBQ08DA9PP3+eXz9vXB01DWU1zQyvP98Pb9/uTj7e3v7+/p7OHk/PVXR19eQV1Q0d9TR052dkp9fU5bRER1c3N8entxdnN0SUTW38LJzsv08ffJy/H9/vzz/fbL2tDfwM3K8/fx/uX4+fz5/c709PXb1NZdd3tnZmNvbWdnZHt5ZG9oaGxsYmFmZ2ZlfmV6ZmFnZHlM38fYwfTFXFhHWdTXyvbKyffwyMPFx8THyuXk+vn7/sBWXFfRUVTFx9RWVVBHcX9/ZXpwQkxwfHN9Z2BmeHx5e3J7ZX1wfWVlcnR0RsvwzcnI987R3szNzM3Iw9vOyPb29/L8/fTy//D2wMfcUE5PT0lKfHJ8f3x8enp7e2Fib21hbWJgYm9ubGZjZGV5eGdnZ3t+cnVId3FxRFNT0NZRWUdFV9XA9P//8P7n4eHk5vvKxtbS1NHbx8fb2NfRyvfP115d1FJ9ZXFGTnNkeHRMSHB6Z2R6ZmFkdlBEdUna887Yzc/08M3D3sTNxdZBQVZS2c754OH6/OTn+P723cPC98fcwtnQWEFCdXBLTEBfdH9lZGBiZ2dhZ2ZkZmFkZGdlZ2RneEVU11JaWFNYdnRYXEROWFxQVdbGxvXx9/T/4eLg5ubn5/Lw+fr65eT7/fLy/PfZ39RYQ13S3t7QXEZeSE1KdENJdnBIRFtRR0FUUlXA9PP29sPcw8PQU13R3dJdUc318/v6+Pjl5OHt4ubn/Pbyyc3e0sBUUFtBQnZ1SXV1dnFLQVl0SU1wcntlf2VneX9/f3JLS3VPTUJPWVHTxVfZ0llfU1PWUF3e2MHGyfHx++Tl5uTn4ODj7e7t4Obk+/v88PLL3tzd29vAy/XBwvbxy8LfU15PdHdAVlpYXENHU9HHzPf0ycnDwMHUV1BYRHdxSFrFyfb88fPw8/L9/fHy9/P78fD+88jQ197VXVxcRFhUU1zU01hIS0p0cXV9f3tmZ2FgYGNmenl4fndKXNPS0VxaQ3FJTUtLTlpdXtD38+Xg7OzvlZSXkZaWlpeXlJXq7+3g/8veV1ffx8zPz/b39fbK3tJTWV5LdHNzcXlmY2JibGNmZHl6dnVyc3J/e39zdEfQz8j38fP8/vvm4ef4+vrm4OLv4fr4/vP28/P8+P38/c7a0V9GSn17Znh/fn97ZmNtb2lobWBlZ2V+eX13SnN+ZXtzSnBLT3R1WNHW38v+5uzu6pWVl5CQkZeXl5SU6+nj+cvO29HU0tHa29zJ9czBzFdYSUtweGVgYm8VFhYXFhYVa2xvbWdhYGRkZ2RlcVpXwfbx8fXx+f7y9/Py8//75frk5vj/8fby/vjl5uXl+/LzycbGXUx2eXt6ZWVmb2sVFRVqaG1ke358f318eXN8eXh/f3l6e35zfH5zT0Zdwvvg5uPv6uvu6unt4uHk/8DF3FlycXV8e3BCW0JDXlBcWFJZTnd0cXlmYGZuFxEWFBcVY3pwfH55eX13T0FfUlbSx87398zf0tjO9PHz8v3K29/b39jT19bY9PL29/n9wF3X2tpRXlXb1V5Cc3Jzc3tgYGd6e2d6d3VYXVxW0MHC3NRcW1lPd3Fzf3xwcHh9d05H1vb98f76+uT6/8Pb13R/ZWRjbmxsYGdkfnZ0SVbO9/D++vnxw9ZGc2VhbG5oYGdiYmZ/d05ERV9SyOXj7ebk+PH29sjT0dxUXtPPxtPA2lXd2MX3//76/Pv//PPOzNrF2sT19cTBwtRTXl1dQkFDc3h9eHJ9d1pBXlXA987S3t9UU1haQ3F0dndkZ3tmeH1IW0dWwvb28//zysvBxd9STk53fHh8fXF0dnFxQ9r3/ubk+fv7//z03lRER0p/en5/cEhLdXVxTsPy8v/l4OLg4+Dl8/XLwt/b3tfc2cTa2sHN8P/n7ejq6uvo7OHg5/zw8c3F3V9SQklCQUVeRE5HWVpYRkJ1cU1PQFpYWEh0fH12fWdnenl+f3h5cn9ydnZ3XtXf8f/65uX55f3KyPL13NZdSX18emV/cUXE8fDk7O7p6+ju4Pr89M3QXEl/ZXt9fXF3S0ZMVvXw5ebg4u/v4+zi4+b6//bNwsTX19LS1drA9f3k5Obm4eHi7OP68M3Z1F5TQnF+YWZ5f3lkZGRhZ3tmZ2RmYWZle35xd3ZCSnRCSU1PT1Fb1tRb3dzZ29BWVNnJ/OT6//7x/fzy/vP0wtrXU012eWdkZHt/dkJE3cD85/v75OXk5eXw01BNdn9/c3F2QtLazfTw5+Pj7pXq7+zt7ezj5/DeVFhESFteRV9CU8fGx/X9/fn//fff01J1cHpgb2tqFBcXFW5tY2Z6Z2BmenRCQVdcT0hcUFtQUFVdT05eUNfC2NrPw/Hy9vnl+/rl5+fj5uXk/vL88M3b0FJPd316Z3h6YGNlfUrUwM70//j44OLt7+Hk/cvYUE9CS3dxcHZORV1U2vT85+Pu6ejr6ejs5/zOUkplYGdhYG1sbG1vb2Z7QFdQ3t7S0lxFTnhnYGxsb2xvYmBjYGFhZ3h8cXRHXFjQwNzR0cTIzsvP3ddSRNX18ff0zsHaw8DO/OT///3/9sHBwvXx987C3NRSWNbQWUJJSUVcUkZbVNbM9/Hz9/b5+f3499hVVEJ3WVBIRFVc09jZ2NrF3d/B98rI29LUT3Z8YWJjb2lubmsVFBdoY2F7R9rP8Pnx9fTB1VBWX3BhZmNmemFnZ2Zke01SwMHZ9vXy+8z08cDH2cbGUF1PTklIQldQ1d3C9vPw9PDy+ODm5OH58vD2/fHP2t/BxdZcW3R8e2V6f3t6c03c9/fw9+fg+eTg/srfREhxZWFjb25obmNmYWRlfkRRT0TQ0MDIxNZZdXBwfWRlZGNtYm1mZWV4fHJS9/35+/jl5f7wyt9XXlJZTnNyZWB7cXN3QVNcWdHCxN7EwPTz9srMx9Lcz8Xd09DUxv/l4ebm4efi6ejo6ePl5eXx3lFFTUlIWFhH1NfU299QRU90dk1HUF1OdnFP1EBwemdkZmZhY2xoFWptY2JmfEHZ9f/l5+Hl/+Hm8PXcWVp0fHhnZGRmeUxFVtLH9uXm4+/u7+Pi7+P6ytFGcGRhYGFjYGdwT0RTUdrx++Tj7+ns4ePj5vr29/3yysPKxtzf1tbJ8fD18fj//OTolpHq7O7p7fv3XUlESXpsahQVaG9vaBRqY3lxcnN0TUVWWXV0dUxKcX14fHN9cHtlf3FLdUXW9//65+Tn4ODg4+H498HB10B0fHxxfXFBU1Zf087x//P95ebg5vr9wNvUWVhBWFlJXFJT0s3w8/jk4O7r7unp4OTy9cVVUk1zd0xBRljSwPH+5eHi4uDi4Obk//fP0Vt4ZmdhaBUUFhcXERAXa2ltYWN+TVpUxvbKzcDa3FzVRnVNfmd7e3h/c0xHW9PK8eTm4ezu7OPu7Ob68vHC31FzcnF5e2RnfkhATVTB///l7ezv6eju7eDg5/L2xFJeQ05eQUxGUF5b0Mb9//rk5Pjn4ODh+/LL3lFbS3FyeGRhZmRkZHl9SkNCXNFZTlJUU05zcXp7eWZibGZnYWV8c3FxdU5BTkNS1VHT/f3GwszE08HDVVVRXEBLWtHHxdrI8OT45+Hk5OXl88nD2tjdVVJZWdXXVNzY28vM9+Tl5eHh5Pvk5fv7+fDKw9xRWEx1dEpPW/Ty8vL//fDl4Of+/cRfQ0t8Zm1uFRcXEREVampub2hpbGRzTMP29vz4+P7/8/XD0EVCfHtnYWFgYXlycUpMUtDa9vXCycPG2NLK8s7HxtBUR0RfdHFyf3ZeTUfcwvT74eDol5To6Onj5vr/01RdS0pGX092d0x1R9Pex/Hz/fv65+Hj4uPm+8jRVlhMcHlgbWxtZX9+fHJ7ent+cHN/ZGxvbmhob21vYmRneXd1dnZ2f3lxT0lAVNDdzPDz9f778/bF39Hf0UxKdnJzWlfW2dvf2cXP2VRfdXZKRlzZwMP18fP38vn5+Pv8/f/9/Pjm5ubh4eTk5P702EJyfHF2d0tOTV7R3NPey8D18PPxyNxV0FpPdU5Ke2djbG9vb2sVaGhubWBkcVLTw8j19PH598XUTXF7Z2djYWBjZ3txRFdXVFlS1N318PbI9ff3/fj4+vr0ycvC2VxCSHB5Z2dxUFHA9/X85ebh4Ozi5+X6+/L4+/33xNVR1VReQ0l1dVPBxvLn5+Hj4+Ht7eP69M1cdnlnZ2dnYGJsbG1neHxyc2RjZmR/eGV+cHdKVV5PU1BbW1bUdXpkc1vGxV9CSVPK/uX13F1Q3dZUdXlzRFJSTX9ldVTWVVNQXNHe2cfWVdrC/efh7O/s7O3g4Obk+PXNy/Xy+//3zs3Z1FdS1tnSwNvCwMTMyM3L9MXM8PT28fbMwPTHwPHNxdrZUUV0ZWFtaWoVFBYWFBVraWJnS8PIyPX19PTa9fzdUlxIW1t1dXVbXEJMXVRT0t7I8/Pz9/f2zcT2/vb39NzT1UBxcnRLfnhyfHJBUdj09ff8+Obg7euU6uvr6JSU6eb/9cFX1d5RXlXQ2c3Jy97Iysn38ufj4eT49vfaRVlSQk92c3F+ZWVhbWJsaGxlfXBDR3BGU0XSx1dPSXF4fnhlZ2ZkZ2VL0ddX3MTA28/0z/b38Pv5ytFXQXZ2cUhH0djX0NLa2tzUxc/MyMr2/fv6+Pz3ysHB8/r+//Pw8/P0yMLWXFzbxsD3/f//5OTn4eH6/vv/98rJ9/DN0lHU1EVCW0R0eWVne3Z8YWJvaW5vbWBmZGR4dENT3tvZ3VZR2/XI21FdRF9QSU1bW0x2cXJ2TFzXUVNTUtLF2NvDx1TU38vx9/bE01x0SEpITnZ0QtzP9/H2//rn4O/q6Onv7OLm/M7TUUt2c39yd3ZLWk1HXVXewvLn4eHh4ezu4eT6/vH0ysRQSnlhYGBvbm5vbG1tbWJnYGJjZHFLQ3ZwdXNwSk5KdHdKRkddXU5FUVFW18HbxcHC983eUVxHSkFBSXJzR0VcWUh0cXdMT1ne01JHVMn98Pz/+/v8//rh4+Hk//zxw95X1ddZW1TZwffw8fL19vXYwMRUVkVEXFxBRUFIT0TQxd3e0lFHdEFKS3R8fnpkYGBtYWBhZHt2dUdeUVTZV1TfVVdbS3d2f2Vken1kZnhwdV/c0tvQ1M3CzfD2zcTU38TYUddZfXJyd0BMdEh2TFpV0Nbf2PTx5Obl5efg5/rk5Pj0x8bWV17U2dTd39bWV1HS1tz08/Xw5OPj4Obk/srKzNZdSnN6bGgVFBYWFxQVFWxhZ3JOQ15TxPTx9vf19Pbf0FdQ1UFLdnVNT0xYX1ZWx/H0xtPTUUd2cnFxdnF1TEBGQV/T1FdXUNjK9PP59svH08HM28DI9P/6/Pz7+uXw8/nKzcDZ39vBxcbf1tbQxcTD9vL/+fr9/uXl+PL4/PHDVVlYXUZYSnF2dXd2fmBmZ2ZkZ2BmZmNjY2BnZWR9cUpWzvLw8/HI9/L98vL99vH0zd3S3VZGQ1JdUcfJ9fb398jLwNrW0lp/cXJ+dnNwdnd1Qtvw8/bx+Prk4+3plZXp4+Xw8PP10FxQR0ZASE9IWtbX0s32/eXl5ef68P/59/D2yPfw98fXUlx1fH95emBibWxtYmBkeHxySEZe3djGyPT2x9dQVFZRQ3B7YW1mZXxKS0TUxcXJ9Pb9/frn5uPm+PTC319GQUt1dHVLWlfUwPX8/fLx9fX1yttW1FdS3d7M983GwffK9ffy/vXI9/398M/D2Nfb9MnIwVTd3drE0ldX3dHe0tTRV1FRW3FmYmJiY2Bme2dkZnpzc099f0JMXNbXUl1cX9fM99jc0N3Az/bM18FRdVbQVk92dnt7eXN3Tk1MXdzE0NHBz8rwzPX29cH0/MVUVnVLXcbb0sjx+Prj6e7i+P/7/PfF0k1+YW5tZGdmfk/fz8vx//7k4OPv7ODg4fjG11t1SXRwe2FtFRcUaGlvZ2RneHJ0dUl2eXN9T1Xd119SVlVc2cve1lxBXlpVVVxaSnRwW9zS2sbYwfTI9vLIxNdEQk90cXhhYmFnZ311R13T2dPFzvP/5OPj4uno7uzj/8HdUUVIWl5FQlxeUcH28vLKyPTO3VNfWXZ4e3t7c0NPTlndxvTz8snE0t1fdXR8ZGNiYG9raGtsaWtiZHxKU9zK9/Lk5+T6/cRUV0x8cU9IdEBGQlJU1tLGyc7BwPXK3tBFSVxHQ1PSVVfHw8HJyd/ezN9XWdbXRkRQ2djGzMrx/vP2/f39/Pn5+/j89cj39dtX0ddSX9HY2vf9+f7n4OHg4OTzzd9eTn1jahcRExAWFGtuYWRyXd7M9P3z9fTw88rFxddRV0NDRUx5enlycUhS1s3z8vb08vHK9cHUXVt1ckxCcXBxdU1TxPP++fHFzv333VDX0dRV38r38f/k4eDg5uHn8MDZzMddSHJ3S3J7fkzVV1Tc0Nvx8Pjg7+7g5eT7+P/88MbYX1jVWXVKcX5/fHBweHpkYWRnbGsVamtsZn11VsH0//vi7+/v7ebl//Ta01JPdX9mYGBhZHlLXVld19jH9P7+//30y8PB0UdJcnJ8fX57d3B20/P65uLs7+3i7ef7+fP0wMRX1MXa29hUU9Dbx8vCxMRUVNbbz83a1VBR0czIysDHycj0zthQV1BCQEN0SnN7ZHhycn19d0pPQFvX3s7Oy/feXk90cH1/ent5f0ld09PRx/f64eLt5/v92tZTS3xnYGBne393SUN0SFfG9PTw8/by8/78//HExdnXU19d1cXe3trI+f3+5Pv5//DOxsDbUEFNSkJYXFRV1N/L//n7+vLz9MLbWkt+ZmNibWxjY2xpbmNlcnF0VsLBw/P8+OTl+v7/8/XKws7F19FfWF1HWU1wcXB+eH9lZWR+fXZDQVvU0tvK/Prm4OX8ycDaWXRwcnhkZHlzcXVFU9XJ/uHj4u/s5ubk8PXDV1tcf2ZgY2R+fXBxQdHP9/zg4O3j4eHy+vHJ9NzUR3Z+SnRlYGxhent4ZGNtbWNhZ2RhZnpxdX12SkJW9P/z/fvh4OTyxPXy+fVYWF3dV3NwWl11fHJ2SXd9dnVCQ3R0Skhzck5YWV3d2tjTwPH65+T48/XOxvf89M3H1VFdUVhJQkN1QlTbxd7CzNjZ1V5QWE5BWVhbXV9ZRV5TXtPJzszAwNvTVlFHSnZ5ZWdhZmdlZWV+eXl2Wl3TxdrF3MLw987C2lZbQXZKSHZ8ZXxKXlTd3tnJy830/P3x/fbN9vfK3VdHdnd0SUhxT0t8cHF2TUxNWlHXx/b75Prn5Pj5/v3Jy8jOy9Pf2FJJcHd1cnNJT05ZWNDN9v/98vL198rGwcNWd3V2c3lnZmFgZmFjYHh9cEBf0N7Q0djHwPby+/j++vz39MvA3URbRk1BTUlLS010f35yfHh4d1pU0dTT2sLz+fn6+ubn++Xl/MvMwsPAz9vXU1hFWl9YVtTWVNPMxtLV0dzcyfXNwMDf091XRE9KSEFe1d3O9M/H28baxMr39srKwVFcW19FTnVzcn5/e35/ZWZgYHp+cndA1tvAzvL+///8+uTm5P33wd9U1dfXUUdNQUZATXV3c3JzdE1c3t7cVkVGW1fX1V9T19fT1Nfe3NnA9//75eTk5Pj7+Pn7+v/29c7M2ddQRE10cXRycnV2c3N2SF7X2svMy/T29cPb0VJMT1lSU1RSQHd8fXBxSnVyfH58cn1zd05NRlTGzPb88vTAxcHNzc3a2Nzf0F5XV1NGTlnX11fXXUZLTlHYw/T39/T08fXB0Fdad3RCRURcXVpOS0BBR9XZ28bP9/Hw8v3/8vL65uHm5v7O0tVcWllFTXRwS1pfUVFSXkRW39Pd2dFYT0FfXFBXUVBZR05xeWZgYmxtYWdlfElNRtLL/eTj4uDn5Pr//fXG1l9CTFtdXlxPfn9zcXZ1TE1BRVBU0d/f09LaxM3MwM3G1tfexsfFx8HPwcbB39nfVl1ZW1bdxM7K2dXS3trCycPZV19EQEVBSElGWd3I8fP998/18PfOwszE0dfUUV5FT3J8eHp6enh+e2FgZmd6cklYX1xYV9/DycLH2sD09vL5//TA9fH29M7C0VNYR0t0cXh8cHRGWVDU1FVcV9DX1t709/X1yMff31VRXVxXV9zAwszS1sTL8f3l+vjz9PTMwtBHdH1/fHBJQEZOTkRc1FZX0NZXWVhHWF5aVtnNzM71ysPSUV5ASnN/e2VkZ3p+cExGWVfR28j8+/vwzMPY0t/BwcTe1tRXUVNaS3ZxfX1xSkZfX9LNz8DOwsbZ2Mbf19HR1VbT393cxcbF29vb3tzf3N7S1VRRX1vU3FfW2tjYxMfF1l9YWkZW1tLDx8fP98nCwNddREBHTVpTWUdYXVhbXF9eRkJKcX17eHt6fnxyfXFPW1xS397FycLOzcbNwMHM9/f38fbz//7/8snSXVlRXUJDS3V1SkVGRlxbWdTS2sDL9cvNycjQXkdCRkFNQ0dGRERHWlldUFDQxc738PP29MnB2NDW0dfb29Dc19fY3t3f2dHd1tfQ0d3T0tXW3dVSSXFxfH94ZWdmZX5+eHNId0hfVNfcw87L9vTKyPT1yPX2/P388vH28PfZ0FZBQUdMSXdIQUx1TEBGQExNWlLQ29vExsPB3t3d0NXV39zf3trBw8PMzcLA3tPTVFFbQFpFR0RJdURQ1tr38vz++uT6/fbFRnJ/emR7eHl+c0lGX9bX3MPCwc3M2tZdSXZzc3Z1TkFQ1N3Y3t/Gzs/JzsTG39VU1VbV0dfT2VFfQktMTUdBXFJT1N7Y11FRTExBW1/Rwcj09PTKwvb29fH8+P31xtjW09RbXlxbV1bdxsDL8PfB2txQWE11dnF0cHJ3Q0FS1VBfRUZfUdbYwvXz9PTxyczMxd3SV1lPSEBMSkFCTltX1NPYzMvK9/fbU0F2fnplZ2d7fHN0Ut/YwsjGxsrN2sXY0lTUV1ZSVNbSx8/O8f/98/P//vzy98XWUkBPQEZEW11QV1lfUlpFXkFYV9dUV9fVRk1fRkJYU9DN8/r65eX48/32zM/B0FNNcX9yd3VMRFlcVlRUVl1W11xbW0B0cnh6ZXt5cnZJQV/e29fW19Td2MPL8P798fDwzt3WVkRMTUJISkxPWtfd2sLPyM3AzsDCzcTb29PUVFFeRkxFU11V2N7d01RASnRzcHJ0S0XYxcbIyM/CyfT08/7++frl5OTl//fB2t1XREJ1dHRxT0NGR3V3cnpkZGRhZmZnZX5zfH5xdEPU9P7l5+fl+fnzwN1TQUFbXl3R3cfM9PH29vfD39fc0FTXVFZQUlJHSXVzc3J/c3d0dnF0d3RLSEJZ1dvHy/Ly9PT2yNrD9/P85eTl4ePh5uf78snb0FZcWURGXlleUV9DdXB2dXF0SXdKSUhLT3dwcnp+cHVWVVXQUV1QXEVYUdHbxsjJwvTK2t/a11ZdQUFAUt/F9PL8/fXD10R3eWdgYWFnfXF2dnVKSkJc083y+Pj65f/3z9lU193Hwsz1zvT9/f7+/MvH31FSUFxBT1LR3cXfV1tBQU5CU93YwMrw9s/bXnR+en12QFlHUFFSWF5WUdfX1tDW3lVYXVJYXV5AT3V3dndCX9fFzsPExd/Q0FBbR0xJSk1aXEB2fWdkZWV9SlvRx8jy8c3CyPT19fTJyc7AzvH7+vr7//D198r19MvOw8bTRE53c3xyd3Z1Rl9U0tnSVkZMSUBcV9HZwcXT39HU39nDwM/Kw8z08v3+5fnx219PfGdjYHt9c3VCT0tJQEFAREFCSUpKcX1/Z2JvbWZ6c3VY2c738vrl+uTl5fr///bI8f764eLh5PPP31ZZR0Zc0NXX0VJaTXNzd3dxcnZCR0BcVV1fWEVW0sb08f399c719MrLwsHB31JS19nGwvHy9s3TXU1wf35ydU9MWlhaXVJSXkdAT0pDREdZQXRxcnlkent4fnNIT0BR19738/L////++eXm4eHh+v/010RNdHRNWNfT3djf38HD2tneU0FNT0RHTE91TExOQ1tYXt3H2MTI9MjD9cLSVVBFRV3RzfTx8vDz8cnA2VfRwsbZ2d3VUVtRVF1Ad3J9eXl9cnx8f3Jxcnx+ZWV5eXFYVNDZwPb39Mr09/D85OPt4Obl/PfdXkN0d3VLQ0ZBRkVEX9HaxdBXVF1dXERAQE9ITE9NTk5DXNbE9PLl+v/4+/P32tHdVtHb2MTY0dXVWkFaRF9W1tjGxM/B3dreWElxc31/fXZ2cUhKTkxKTkRCSEZT1N/aw8XFzcbY2N7bzvL5+fj6+P79yd7XXXR8dkp0SUxBQkxaXkZOSEhMWVhbWURFSHRITkxDT1vXxMr9/vz5/PL+98rKyc3N28TC2trb0NRfRkF1dUBZUt7Y38HDxtVAQ0p3cXR2cHRJTE1MQUhJWkVf3fTz8/Hz8crL31JX1tLZw8nIyPXx9c3B3dZcRF5SV1NdQU9HWVhBT3VKTURAT0ZDSHROX15GT0tLQlLR28DExMb19cTc2s3F08fI9/HIxMXeVERNQ0xOWNfFzcPNycDVU1VU1F9HQ3d2fXxyc3N8cXR3TVHf09r09fH998zAz/Xx8Pz98vn7//Ly8c3Z0FTQ0N5WW0VLdH15ZWd6eXByfXJ9cXZ0R1HRVFBQ0cfMys/Lzc/0wdPW19Dc3t/excP1w8fB39ZfR0NPTEBeRVpX0NRDdUpPRF9BSkJNS0JFR0x3cXdxS1pX28LByf3l+ffK8PHw//v5+P/9/v33y8PY0FHV3Nre1V9T1VxNSnZwfXN0cH9wfXJwdUlDX1xeXdvNz/b2yvf1zdNSX1FdVNVZX9Dc0NDe2NbV1FFdV1BeXVlFVtHSRU5ARENBQkpOT3RKS013eX58eX1PWlXd0sT19cvEwfDy8Pvn5+fn5fjy8MnY39FSVt7cVVJR11ZfXFpHW0FORl5FRVxQWE1DQExIQFzU2cXGyvXNxN/WV1TX0tPV19LGwsff3tjQVlxV11NfWFtdUF1cQ3Z9eGVlZGVxdEpOTEJPdXR0dVtX1sDMzPX1yMjAxcjJycjK8f78/f3w8fTMw9BV1tZRVlNQ3NLUXUVHQHRLRV/WxsXY3tZRWkFFT0ZW3cXGw8POw8TExvXKzc/MwsbD2FRfVNZU1FJGQ0dBQEZeUdbR1VNbQnB7f31ydE1Icn18ZWRlZ2R8TFvUwc/L9cjJyfD98vDx8v38/PHKyvb39fXC39PZ3dHfx8TdUEZLcXJ9fEtd1trY3dbRUVpAT01HV8TY2sfax9jaw8rx8/D2/Pn+/vPKzvf0wN1UTH15cn58c3FxfH1/fHNwc3FF0dDWV1xNSXRzfX94fHVHVtPcwNrW28L38PXPz8POzs3M9Mv19MDA31TS0tbFyvTJ319BcXJxS0BT09zTXVJQX1NBdEtbVN/P9vfMx8XT0djHwcz19fT9/PHLyvDy/P313lRWX1lR1VlPdHF+ZX99f3N3RF9GT3V2cnN/e2VmZH59dEBTVVNR19bb9/Tw/vz65+fn+vj+98zG1kRTXUNbVdjQWF9Ednd1dkPV0tjd2dnV0cXWXlpBRFbR2MPC9M3bxsXfxdzTw/Tw/PLz8M3Az8bG3lZSU15Y1dFWTnFxfHJxdk5AUNTR19FTQEFMS3dxc3t6eXlyT0NLT0pDWF7R2s3z/Pnl5OT6/fT1zdnF19fSUNfTVFZEd05McXda1trExM/Owsna0tdBSUFGXFfV3NJU0ddU0VRdVNv18v/6+v/99sjKysPGxd7e29jWRU50fX9/fHJyd0JMQVhBTE12c3Nxcnh7fXRIWVXQ2tjc29/awM/x+fP/+/zy9vXLwdnR1FJQUkZBSk9GSUt2cXF3Rlbd19rCwc/J9MrA0UNGXlXfxMPc1t/c111XUlPYy/L85eXy9vX29vHIVFdUUF5GTHZ9fHx/eH12SkJGRV5cVl9CQk1OSHF4fnB1SktaU9XVVdfexMPw8/L++/j+8PT29/XO0lHW2NBZQFhfWlxaT0JIdUNBU1RX097W3vX0xFRZX13Q2lVf1VNfU15ZWVpd1tfK//z98PDz8fHy9tnS397eWVtbT0h2f31xf3lycE1ARl5BTENPd3N9e3h9cHBlcUVAWNXEwc73/fj85eX7+/3z/PnzzczPwtrc1kdYVlJUUlpBT3Zwd3VbXVhdXNPNwN3U1tTR0dnfVNHZ38XN2N3F09fbyfXIwvT1zPb2yc7NwNtVXll0cHd4eXdzfHNzSklEV1JAXkVJRE52cX1wc3t4fH5ySEbVwcXAysvz8v7+88r09cry9s729/b1w8DeVldUXlXTUl9eRVle0dNcW1NR1sbJxsfGztBT01RcRFtQXlBdXlte0dvK9vHx9vz/8vLw8fX1xdHSVlpJdndxc31zc3N2dkhxf3x4eHp5fH5/cnF5fnNzdE9T3Nj39vTw+eX4+vr88ffx9MrKzsHBw9jUUFRbTEVcU11cR0xGR0JBX1hZ0cbO8fD8/fH1x9zX1FdU0VTU1VNfU9na28H1z8fIx8bMxsPS2dhURFlcdXR2dk11S09MWEF3d0pzf3NzdEp2QnV0d354f3F3RFJUxNnP8/3///Lx9cHBxNjCzM329Pfxwtne01FSWlzXU1JQX1lCSkhJQFHQ2cr39ff1zsdRWF9RUVJdXV1ZXd3C9vfK8f3z/fH29vf19/32yNhXUVpLc3J2c31wSnVxfXl7e2V6eHt/eXp5d315f3J3TF/d3M309P/k5+f7//D1wMnJwcnI9/Dy8/Te01RaWlxGV9RbWEN1TkpwdEVT2cDJ/ffx8MzA2lRX3dHW2VfR0F/Rxcz1w8TOycvKzM32yPTwycDeUlxHdXZ0dnF3cXRITnVyfHFxcHZ3cHZ0cHN9fHJ+eXxxSV5QXN3K8P7l5fDIzMDCy/Dx/fj5+f/y8MFeRFNbRVxfUkVBWkJIdXdBUNbBy87w88/CwdzT1F9bW1FUR1pX0tvB9M3Ax/X3yPDw8PL9/PHz9s/SWUVGX0d3cH1ycHJ8e3pkZX5+eWV+f3p6ZXB2fH19dk9XU1LEzPz65Of4/v31yvHy8vny8PL08fXQW3R2dHd3d3R3dXdKQktbVd3P9/375Pv4/fT3zNjdVlFUW1tQU9zNxsHG093ax8Da2sDb0tzc299QUlxAXlRfREZEX1ZYWkFJSkpPS3Z3dn57eHpycXx7ZX9zcHZJXNfF9/bx8/bDz/XP9f38/PPz/fD3w9dZR05JSE5HWkdGQlpdVd719/Ty/vnz8PDN3tvQR09IfXJ2dVjSwM/By8rP9fLw9/bx/PHL9MLd291QVNZX1llNTE1Cd399cn9zcH9+emRlZmd4eXx0c3l9c3RLRlTN/OX7+Pr+9vD29/D9//3298vB2NNeTUNMd3Jzd0tOSXd1QFjVxsnw8Pz4/fz5/fDM2ddbdHFzcExF3MvO9M7HzsvI9crBz8fd3tLR1llfVFJW09RTX0VRVFNWR09HTEtKSHN/eGR7fnJxeHpnYGR5fXdb0M/08fLy8/D09Pbw/f3x98zP9sbX3NRX11hHTExBS3RNR1vUxc339fPy9PTKz/f1VkdMSnR9cndNXNbFwPf19/P2/f/9//3OwsXcxdxW1dPc2t3R1F1aT0lPSHZISHBzfnx/ZGRleHl8f3pkZmRkZXBPXN/A9ff28vz9//n9+Pv5/Pb99MDC3FRU1l1BSUJeTEJbQ0NZU9PazMjI9PH29PL2wsVeX1BERkBfVtTXx8/N98vI8Pf198He0UTV0Fhd1l3R2FfTVlTTWlvT1FzVWUVfdUpwen94ZH56Z2VkZmdmYXp6f0p3XN/e9/Hx++T65fnx8vf198vMyMDFw9nf3FPQ1V/Z3tLa3NbewcDAxsHOxcTE1FRFT0RCTkRYWVBeU9jD9PD/+fr7/vL0zsfb01JcVlHV1dfT1tBXX1xaTUxCSktxcHB+ZXp4entnZmRnentlfHNwcXF3WF3U9fPz+vrk5fLz8fXw9szKy8fG39XRXVdUR0fR0NTY0sbKxc/MzPfI9PH0wNrb2N5QRFZWVlh1WlZR1trL/fLLzsTc1EVT11ZGXdve0lfQ2NjD39zIxtNU19zWXUFJcHl4ZGdmYWNsYWRmZ2RleXtlenBIR1TI/OXk5fn+/PT19/fy8fXz8srP29zGxdJU2MbS08L29crK2s7C1tVV1ldHW9TXXkVaQEJNT0tb2N7N+eTl+P/298je2sbA2NHfx8fQUVFWV1XQ1FdRRkFcWVlESn94eWdnZ2FjbWFnZH55fH58cHROWdzYzPD9/v7/8MrPzszDzsva2sXZx1FX0NXTUNLf2sLM8f35/vD8y97Cx97a3tPEzdDaVUhEQEp3QFHTx8b0yvX02NJSWdHY2sfOwvbAUt9WUdXVV8XO3cXGVcXG0FJPfWR4emFhYGNjYWNjZmZkYWF6dk1F1N/P/fz//v7Mz/f198729PP338PF3snTV93MxcT32sz7//Hx9dLVUV5DSlpAXFdQw9VQ1nVKSdxb1/fe8Pvz/s7C21ZW1s/Qx/HOx9HWWkNYSkdU0FbX1VDe0FdXdE9ycmdnZG9hZmJmYGZkZWRmdHFP1VTZ9P7z8PzJy/b3w8LDw8jF0tRF0V5A1NPPwMzC2Mrw+Pn6/vf898zeUF1f01xXxd/CVU9eU15b0dLZ9vXz8c/JwNFSV9ja28v0xd7bV1xFW0NexdFRUs/AUsbfV1BacHlzZm1iYmBjbW1sYmxsYmZ5fHRd9fH18/Xx9MPN//7O9/v/8fT13V/Q0V3G88vE9fbIyvv9yvr8zs7+VErWSn1SX0bS3EpX1H9SwUfa/cv9+8rw8NDI9FbH8d7GzsvNXFzRSnXSTU3a1EFaxN5fXttddtBIZ3l4bmh+ZmlnZG1mZm1+SntZyF/L+93M89ba9szy/tj3+cbNxNbWQV/YV8blwN3xyc325/vP8OHx2OXDdFfTcnbGU3daRX5xX1vGyV3J+tPI+1LW81NW8Nvx+9fN8llT3lxfQ1Xy31f+X0zw2kRYwdp1d01kYmRtaWJhYm5gZxVteWZyRF3WxfDAVMLDRcH3zPD45/Px5cZV/FFxws3Hy/P93Nb7y1rl5NTx48Nbzcx2dtxHdNrAfXPURH7W/dZR5/hb8+RcRfnPdc7mwc/lxk3D3nFK305DzN1e09pTW9dXd1DNQ3ZZcmxlf2lpcHkVZ3VpaE51bEH2WFvlzHHf+Ul05/5f++7PzuDHTMj1c9Xlw9/k/9v65sX04/DJ5+fN9PBHQ8bXfVT0cH5RdWVW0nZV5N1e/8B1WcpJWf7J1uTgxc391kzH1nfY8F1E9tpP2/VOQM1BdsLFZndTY250fmtkdhUUfG0UfVxgcvzTTfL2c1LkU03j5lXn6NZR4cN5yf911u/1X+Pg1Ofu0s7u8NXn5EHe+ENz9Nh73v57ZPJdZ83lSFfu9Hz5/GZN5UR94PlI5eB0VuBRZPDBesL+fnf+TGH832xR9mFx83pgzX8USkgXZF0UFlpiEUFRa0nmfXPg3Gbw5XrR7sVZ6fl78ON5S+FCeuD7c/nrVsqU81Lr41vg6ETP7kBx5FBm8/RtSvBlfOVYeuTlds7mfXb8TWf083bK41db4PRJ/vZ70eZMcefXZPD3YETzen7yQmH1xWJ9XW5tR2YXZWYQYHdqb95MYcPKZdDlT3Xn8Ubg40Lz4l5G5tZk8PNxzOZTzen+V+HmU/vs1M3u9UTk9HvL/H9I8XFnytpnV/lNRufefvTDZVn2TFLg/lny5tXe4dtM//1PweRNRv5feFBSZ3bDSn/L0HlfX2JkX2Joc2QVYXNoaXZ+ZlDTf1j0WFv2yl/65FPF5NNM8cB9xf90RufGSOfiUcrtwNHj+tPl7MDC4cRL8/BwRPV0fsZQe9H0dV/+V3zB2n9Z80Jb4PFY+edc2uTUXeXyTM7kT0vyXWdNWGF2wXd9zdF/WtJkelNma3x+FWBwFWt9emNB3np18lx0/vla8OFX1//FdN7eeET+XHf++Ujx4FPb7f9Q5+zB9e7+XPjlRNLnUn3Dy3xJxkpzysV53/tyc/5Uesz6ddHmxELl5XLf51TW4vZ1/OR3W/B2Z9xWZ0bwcXD+UWBfxmRmWGQUZEhrFHhjF3tYbGXIX2XN/0HP7sJG5Ph80v59evLDcfTlRNDs/0rz7drN7vhf4e9VxuzHQOX6f1v8dH731mBf+31w/FRz9fd/W/9UTP76QcHjVHfzzXHy4t/d4f9MxftzePJRYlvxZ3vzWG1Fy2Vi0XMWeFEUF01jEGREbmD2UGfC5HdA7vB0+uBaWfpTY9v5f0rhxnjk403H6fZb7exb9pX0Q+LhQPXo1n748WVY+ndjzPdgdeTUf/H/ek/g0Xv+4XZA49hkzvp/1uzHSePtSVHiWXrPxWNz/3Fhystndfx0bEZKFW1GbxBkfxFrRnppXMhkdfradvvhRsXvxXLzymF2/lx9+edFwOn11+zsV8rv9t/j5t3I7fPU5/5LVvN1fthHZljPcULl9XXI/311+dVy8/ta2OfYcsfDdlj/xF7l5VLC+NVz00Jgd9NyecFfZFXMfH/TZWl8fBQVZGoRenZicMFLf87IdNjmwUz950fW/0lh19xnRvlVSOTm0Pvo9t/u4cTjlfDJ4/LG7O3UwOfXc9pQYnJXfXHy8UD1/XZ089B9zfxLU+b2Qvb1fUX/1EHk5Vb25tZT/9xnQMpzc/VRe1vZeVvOc2N0fxQVYRQWYWBpc1FkfcZDf9r3X8Xn0EL4/31O9HF6ycZ90ODb0uPh2/ru9/Tp5sTk4NfQ4/1V/vZwRMx9bHdwYkn3QUXm/3Tb/l5B8tp3x/1Z0eTWd8n0dNb43VHl/UPH+1VN91dl1MF7ed1KZlnRZX1XemtkZhAVf29oSkhmRvZDdfz3S9n+Rlj63nzdyX1K9VRzxPVZ9eLC3u3kzO2V++SV/lH458fJ4cZB/sF6R9ZnYlBXe1n2X1L9zHf05EN3z1F89PV5WvheZfbydMPmwVfl8XX1+kpM/MBy18Vmfsp2bVxEb2dLaBZnbBFhcBRi0Hxn9c503uXVdfPNS8HCfUf733DB/EHW4/FW4ODX+Or58ZXszOfgQN/tx3L880zR93d+0UplVcJ2ReT0Xvrg18Xg1X34/XfT51V15/J/2uFAWO3MePH2fF/zR3L31GRcUmF7zXhvXkJpeUprFXVkEWBGb2LZUHDz+1nH51Z189Z/UNB6dPFNZ8bAT9znVUXl8V/h6f36luNW4+Jc2ubfT/r/WMn5S3T1TWRQ0mVR+9RU5/lO2PJ0TPLQcfb2Tt3k1nbz8UXB/VhE88dz3/NNUMhBd99DZERFY2ZCeGh+fhRic2oXfX9pcs1CdfPMTvflWNLn33HIy3XdzUpe5cJb+/pO3OfDVuPj2efpx93i/3fX8k9Z/NlJ9MJ9XcxGftLUTf3y3PPmU0T7x1v55V/b4stC/vx3Xf7UfcTSe05Wcn7dUmRF0npw3XVkXXRhSkRhYkx4b317aGRFZmf33H/S83RH+8xO9vBzQshKZV9Ef1TKRNXw20D3/NDz4/bw6eH07+zcyuDNUPv/Xtrn1EL52nxTzXRC9tRJ39h2UfnHRuXh1cvhwFLn9Ur0+kZO9196Vt1kdsR7Z8xTe0fZdnHVfGd2cW5gd2NofnprZ0dlZsdCYlHwdFrh91jm7UfQ4UJ69MxzxuRGVvzZR/3zQM3l3sTi59r/5N7N4c1L8fNK1frYU/Pde9r6dU7/0HzFyU3059rA7+HA5ORUVPvNdcrxf3LFf2JFdGx7RmZl30Nm3vd4Q/BAZVNJYndEYWFGZW9PUGd/2HJn3dhzxOHE0eb5WMfEekr1dXzx9HtR+1lB5MB59OLcw+nl9ezmw+bj1dPm9UXz+0dc8Uly9VBhXtxnfMdNc/PlWfaV89Tg+kv14tFR+9d9VNhkc9ZmbURJY03YZUT2SXf3UWBLWWFmRmEVcHEUZERjZ1B6YfXUe8LjyMDo59b68HHW5U1O+dZ/zPF2UftbffXJd83g2cPu88vs5U735kPW4cFx9vV52ft1c/LRZcTwdNbgw8Xq7cjl41Pd4MlL8816dcRnY9R7FH52amfUZWTP3XPC/3JO8Epl2lhvclJvZld6Z1ZDYEDDckbzX1Hi+UP/5XpF/H1699RiU/x8W/tQfMnMcfTi3fGU5vyV6Mrk7cL27clf+8hkXP18fPRzbdveZk34QUXg8MTs5Fr95kHO7VdC5tZnzsNictZubN98bt3WZlfxe3DxcmPaT2lPWRViRmhrXXhqUt9jXPh1TeL8X+/vXPPsTnH60H7IwXpRznxI9XFlxlF/zv9b9+nOwez7VOf+0+DmV/v6dtLmTHfn0Hry8GXZ5EXe7/fO6P9d+/dwzP1J0PNze9Zxb3VyamV2a3nMenr8UXvwxX/K8Hpf8mR622ZtVXFpXdNsXsljTft3Wu/KUuLaf/1WbNPEYFz/ZELkd3L8Wn3l9Eji4FPh6Nr66FfG6ddH7Mh0+MVn9/Zm2/FhRPxlceBBcOz9XO7iQf7hedbiRtLvWn35d2/ZdhVdWGteyGNE/mRy/n5m90pp1FsUc9QUY95sbct/bftSbeX3ZOaVWuSXT1btfXnkWn77XGH53230wG/U/2fE6UjQlcZS6/Nw7fxg5OBw/OxzV+pcT+r0fOTae+TleeTrTv+VX83ocnHgQXDiX2HxWxRbQBZ3ThF+2m565Xlk5HBt5UZo9N5rW/VqdvNicvJkev98Y/xNYPr1eOHiffHkYU7wYXPkemD6SGHg3mb7+Hv270P5ldD9lvHH68tw48B44/9k/Phk9+dlx+Bkded6ZOJQe+n8ce3gcvbgZcDvcFHtS3n5dG3LSGvZQWpB2GNKxntx0WJhUWdmX35sXklvStp6dM5wd/FYcfDOWuTn3uHkdPT8ZVDxc0L0cHT2dHf3dH3LxXbK/F715trZ+t9S99dZ98vQ8crd+fnO/fzbyfTHw87E2Pjyyvj8283RdVvFd1vFdUTDQH9Hc2Z1dnh2cnxOU3R11kl0QXJ2TXR3QHV8WEBB01xC0NBMXt1OUMXV2/zx0cnRfVtDc0RfdUDe0VfdXNz2zMT08cPK/ff38MDP8crNycPPzN3R0sXDxNnAwtrPz9fexdnC9PXM8P7E0MfF383FU9rGVtbXTEpHWEBBdH1zc2VhZ2d7fnt8dnJzcnt/fX9zRVhCXdrN2dn1zPfy9vTz/sjf29FFRVdDTFFTW1BfTkJbXdfd19LY2NVWVlpS2c708vz8/fbK/fP78PXOyfDP8vzw8/35///wws7EWV1XWl9FQ0paUE13T3ByT01GTXR2cXllemd8d3RLR1XVRU9ISUl1WdBTXlfe1dzUUt7Mx9PHz9ZeQnRIRklPR0dFXFHU09Xbwff08czP9sVR0NRd1s709vnl8vL13tLb28XF0lfZ2VDO29v1/f3w/8HLxlfb2PT01sNR199D2VdM1FdWUl9DeH5mbGtpY2F6eHheSXNMfXl/c0Je2V3Sws3x2PH/9+TN9fTTwkRaVlpdVldfTFhaXUVHX9zGVFfbRE1Zd31wSlvfy/f+/vrh9fP+8ufx+fb0+cb0/sv38vj/8cvd29FNQV/GUtfTeFzRSnJHX05S10laRHF4ZmdhYmV4fExJWUNKdEd3dVTX19/0y1LBw9TTysTdwM1GQUNydnJDR0lbQUBbXdNe0MT99MHMwd9RWVZORlFeVMjw9Pb49M318PDz/PH09/XYx9Pawc3Y9P3H2MdUXNr1xcjw2l3aw1JWxcbdx9xcTHV9Zm1vb2xpYGFkZXt7YWR+eH9Y39DO+fDP/f/x/fj+/vjyzttVRENEREJeR0VBR0Z1WF5dwdNE11t3dkBxfndGddnLwfT//Pjm5OHp4ePt4eTn+/H3wcnx9cDH21dSQ1pRWFTQUEVaWXN2W0FJ19rUWNdCeXdzZmVlZXlycUhzZ39yZXl0QtXC9ffw8/zzwc30zsPFVFFTW052c3J1QHxDRllZ0dnRzvvx0sPWX9FdRUl2VMjUUcbDzcHG1cz+/fn4++b8//P02VbD3d3G09TdxdFWzvHH3s7aytFA0FHVyt3Rzt9ZSHR4YGBsbmJtZ2ZgYmJgaG1gbH1f3PP75OTt4uXl5vj68tnGy8HZWHBKdHZzdHBlcElKX1DTxtFWS0ZCTUhnZUJMXlHTzff2yP7l5Ofi4e3o4ePt+s3z8NDaVlhfX9RZRl/WVEda3Ed2RXFwWFJU28zE29ZfWVplYXxkZHZyYHp8YmNnZXp+TVPa8ubk//jk8PT49kdW3V5NQEZ+f3l7cXNC0UJO1MnG9/v22/XI0VxLd3RwWkJC3sHb38b39uXk4eHn4OTk5/vw9s7DR0BXWl3TWNfAxNTdxNTXVEVcX0/SwsHI/8LWzXRgYWdiaWRkY3hjYmBoYGlicn1X0vjh5+7s7+Dk/8vI9d7f3VPUTE9JeH12enFKSEpXz9v08N7C0HF3fXx4SnNx2V7Z9PXw9eDl+ZTk6pT+luTmlUWUZ8fBYvdj9WZfS9FH2ENfRnjAYcZl81vA+N7k0c1FfEpkZXtkfWR9fX1lemZgfmRyTVfFyOX88+LM/fZ0/nfQzWX4bsF2etdjxmfbdMdR/czh8v7h2Pp992BJcWRBZERLRthZ2M735fLh5Obn7OHg4vjlysVeQFR0Stdzz9Ja53L2UUP6b+Zy2PRU5lvk1/d8WGN0aHx6bWVq0xZzbWllaHBgfN9z8vzz4+Ht5uH//PXIwdtVRVtAT3hzek54dllx3l7O/FzN5WXJ0mn/bGD1FvBmf+lq7tXMkUOd8Onu5JD86OHs5frU/UhQd31IYdl89UpfS1pbTFhM2EfJ2Nvf8fDW1kZOQ2B1QBdQf2n2F39bF/oXcMkX62P/5meTdOvVxeB68HHFdlLcxGTGZNdPev9k5kHgzeXzwedH+3lSRWDHan19bMhlTNh3/sPZ7N3m79aW9vmUyOznXuPZfu9v9stjkWDK+GyVY13kFZd42ONqlWL0wmrsF0ZyEfEfcXwQ8B/NbWfMFPxhzsRT59jj/+L45OHT51r1wU7O0tJdc0hPZ1Jwd8Rx9Nd09VhI82zAXRXhFl5EEeBoVfhvkUDll3Ke3+yRcZ5O6pdlnmDhyheUEPxIbekR4Xp89mr+ZtLRX/NL8d/4XPLU1slmzW9If27BFEt+aPQX0XVq4BT5X2aXZpTb2et84XDOVE32Rf1G9HTCc3HZZfNw9PRx533lz3vjbMhxauET1n4V5hDndUPicOrR5OX748Lt+Ojw7v725HTkc8beQuJ7+MR44GjyWGzuauNdYZVr6XRI4Wv6Y0p7a3IUf2hmYX9he017WWX2SVb9VOrB4ONR7VjR5mf79H7rZ8v3bvZgc1dmS8h2dvN/3NJ5zk5kzHl59W/GVm3sf8XifZTwxJFBlO5OntLvlUGWRtT5RlPLTUT6etLFbtd/b/Rif+Zv/fdml3/SlGjjw2CUFtDPHeITfsce4BF0wBPsaVn9b5d85uF+l2ngx22WFezHZ5Zt+MVh+mRx/3r0y2buZNz6au9vW/MW6WlMwxfiFd/abZRo4vx4nGKU7VCeTJTrVpXFz+xP5uZ4lHvB+Bfoanj3EOtpTuAX6GlX5haXavP+F5YS9WQW8hvIamfBFuZuycZ4lGXq/9+SZpFZwu5ukWbl9njuFf53cPYX+mN182jsasLUa+EV53F05GXiZcDWd/Rm/kT99EzrSuLhVJLR6OtallT55ETm1c5Tz1530xXaZ2/CEcB+Yu1i9Ppm7F5Z71LO4lPQ8m1TRRPVbxXYFnJREdxCe+Fxx+119+Rk58h763df7GP422DnenXgetDweeb0Ye1Df+JtUudi+/hu4nRq6BR45hPkymiWYFyTbOjvd5/0w5xZ/pZz6uxgltdllRRc5B/hehfrFsX4EJR0YpZr8+cXk3R+lxD4Qx3hHXxHE/lqWl1m4WTjysmUdpbcRpZt7slkkG3b5xfvYGzvEctYaZRr9PZp72nH1G/nYvlfde5s5XFy4xTgQVrpb+zwSehd5e7V7+fS4830+N/x08BLWtJuXmJnQhHHYHDJaexZdepI5OdN6svV4ELXUXp9ZGVpcmcUUGtKTGjmZM38fZd91+Nk+tBx5llF/9RD90J0zXNZ91BV/f5D/vRx/ENk8Fhi9lhg9XRkynpmy3968ktC50D24t/h7Pvk7eT57eT37v116sVl+nthUWhsw29h+WZz7Xj27mDs/W3qU2fjb3zlEXdEFtlrbvMVR8ht4lRdkF74lnLk5WXpUn3vcVH5bdLNFtBIa/xjdOxq8eBu7U1+4mre/mj5RnLjY/T0ZuZkUvth51PY4HTp/PPsVJXcyO5J7NNc7XrZyG3DYm1WEUByY/Bh8PTR4tTu/tPpTubffeNmTVRrVWxqRRB+f2r0Y9T9ZOPXzuB359PB+HDmVM/KduB2Rvxl2Ndz5dRK4cBa+9Rd9H1H2mVz1H1BUGRXS2RdfEBxc/lfWOH39OLx5Orf5ZXU4ele7ed18sl9Q1ZmZ0JiZFRiefteceL/defxcv/eZP/QYMJabnBzFHx/FEVRY8DmT/zuVPPiU1TsT0PiTXbmTnb4c3nwdGPKQ2f0W3v523L7x3rEymFY/Gff/XnP+GZE+WRl5353633WlEDMlkXTlnPKl2b47Wn8ym7/dm72YWjwbWf9a8L8Z+ryw5dY4O174N1L52Tc12xYbGNmFUtuedNj8E5K73/y/XvuXk/idtn5cM7lTNLhSFficd/mfdv7T1zgUGXlcWPKZ3vPeFvbftRyYsFgY/h7XORG+Pfd49rl5l3o5duV9f7hVf/d1cl09HN78GJEQmz1Zl/leObBcuJxdPp8VvlKQ8hhZ9wVY1FpdttwRf/JQuf9fPr4TMnxXNfdzVpZ9XRc8XddR9BEYPFPYeDefOXSZdzRZEL/T0vtxXbmyWDPyW/Z4GXY7nFGlVZ8ldJll91l6thk7shh59hh51Rm8Vpg0Fhg09tw+M5W5MHCw0f810fhXHPCemR+YmdjfXZhWlRn1vZ8RP9QROXAcPjKfuXke/3odNvqWVPrQHrtVmbsz2nk2hf0VhfNw27y+mzD9W1ZUWFQznHc9k79zkzmX9vtTfrmUu3x0e7DXuPbQOVDcflyeMZlesN0c/REc8hRc8nRdvPV1f1+211s22Rn2WZBxmRU+X1R+H/F5XzH/nne+EjH+kDE51fa+l7S/3Bc1XL9cHDzYV3RY9JHZ83JSOf+duTJevbQfvDEecbAdsnNcMHPdfLwQfnf0eZ1/OVK5MNE81ZE9lt/wHV29nfV837Y8HBT9Fld+N1e/tV/119jct1mZMlzYdxHZVzdSkDP0UvDy1fJyfL11+X3XPn72c3lVlD2SHfXdGNKRm9xUGFB8ERS/tJP1dtLccvWfd7KXnHe9H1f/ldT/vjc+ez1wuf+TPfhZUXhdH300GVf02ZJ2GZ5w39mzVl79fJM2fjSX8dcSE1aRHZbz1p49Nhuz/9gRP9Ac+TydPL9S/Tlc1jnQXH4x3XAxX11WHB5c3Z5eXfVRVfj0EeV8X//+HNJ+kh75d5mysRtXflhUe1z1OvI1u3Pdvr2Y/fmYNDtZU7ieXHhZHjmfmfmcGPlRnPmRELhUXHw12TH3WfFVm301GrR0GtRzGPB+3/86HXWlUhx7l944v194Odl/eBtTeRmYfV/aNVObPTKY/vnZ/zlYtTnZlrnZ1LhZk7kZn32fVrj3PWR+sGUykLtTGT4SnrmUmf43m/awm5ayWh19G5y43Jl7ctl4+d4+8pk+M5m/fNhzf9jXfFpTvxuR5VxU+lcWP5xSfR6eeRPfuNUe+PWbeXEb/fYaVfHYdz1cfvkd+buZsbvZkDuZXbhd2T9QW5RUWpE5HvN60L36nBW7Htl40Rl7NBl40Nm59Fi5cxi+9xh+txm5/Bn+OZh0+VmQP97TPZhcvl7Yf94aMhwZubKcennfu3+ZPnIZvr5fOHkZvbkYd//ZlH1bkf2aXPxeXD2WHb9R3r+WWXl9mX053nc+mFY9WxF+HDe6fXE6v9a4N9m9thj9v9jRfRgTvdiW/BuRvhjfeZ/f+JbTutBdOlCZ+zwZOTzZ/n7Y8j6anXkaXvjcHzt0H7j1GL7VGrP/GBU5WFa42V17nBk7tBi5cJt/fln+OBk8exnROhyf+12ZeJLYeB1FPTRFVDyYFbic8TrSkLuTWfgymb6/GzK/m/D4GHW70h34th65c9m5/Bg++RvV+BkfeZ5ZOVLZ+RfbvHFFNHlbFzsfN/pclzuQHjj/Gfl52Pw52DY4WJP4npn4XZv/1Ft/Mls9eVvVu1hSe5/cu5bSO9dZvvEac3nYNDsdNfpUF/sXXrhz233+ml3+Wxl/2Bk4XBg4sFg5/pk/uZ+/e1k2+xhd+x2c+DUcuPbZ+XAaMvxFUXlbEnnZHDnfmTjVm3n82735GzZ42JT7GFN6Hlh7V1h7chm7/Rs5vsV9OBuVu9mXOhlceljYu1lauZFaebNbuX/bvjtYvbqZETvZHjtZWToQWHuymPj5GDn72P87m/A7ml37WNn4Hlm4k1g4t9o5fAVxvtq3+ZpUeJpTpV9c5bZcpXNYe/0buD8av3lad/lbkrgYHDsZWbscWjkXm/gw2Lj/2Hh5mPE4WdP4WRy7HN673Rt4tFj4f1n5ftszfwUTfprZON6fu58e5VccJf0e+36YfL4bcrmY9jtZV6VTkrvR3jnTW33SmraUxdSwGhd5WLd639E6HZ871Zx7dZ74MFj8vBh9+N81uN0dfh/Z/hNY+X1Yf3kZMblY0XkbXr4Znnhd2DnWWLnzWfg53vm8WPk02ngT2ztdnfuetPqYeHuY+vybe5hZ+kV2uYR7FpikWBQlBTj9xWWbXnrE8LAEetkZJRr5+xul9BhlGB1623B7WzV9G7e+WHP+mZV/mdw9X9y/Flx5PdI8/pwU+ZcfvXdZ1nzd3PxVGdGyX5x+/JzXeRFYN/9ZmL+yWxF79Vh4ZRAd5TuZ3XuUGrQ60Zt/ex9Y+XtfXjg52Fi+v5hYvbBam32wGhm5+Rlc+/if37h4XB84O90YMfnQGXO7dNmWOVSbXD8wGF++Pp0fvblRGXc51BgefTZZnj2/n1n0v5aesPi9HBH//R8e9/wRX1T8MR2UeXk0Vr85NJ/Xs5RcnXOyU530vVUQMX78NVXzvfVT1DERX9wWV9xd8T33V7b98BDTdPZ0V3Vx1B3StPcWUlSxFhzSdPEXkbN/drQz/HJ0dfNyFZERVZRdXdaVVh3d0ZZdFrX0VRFX1BYdHVYXVBAUdnR3sLz/vH2/fDH3trS0tbV3NDc1VXf2sfEwcfFV1jW1V51dUJ0c31KW0RYUN/T1sbB2d/byMjA3tvTXl3QVF9T11BYXFdV1VVUX0fX3FZR09reUVRRUF5eWkBDTEFeQVleV9Lb3lVU1FJHT0JBU1BcUdTW0sPMzs3BzcfY28Tc1dLWUlXd1FNU38POyvT3z8jIzNhUUUJ0dHVJTVhYU1JU0NRUVFNYU1RR1F5ZU1tYXFTT11JS1FXU29vS093Gx9rBwMbexcTWUlfTU0BfXERLSkJCdk5fRnRJR0N1dXVGQUFYWVxX0d/By/L//vzw987Dw87dXNzF3VXd2MbMzMvMwsfE2dHVX0x2cXZ8dE1YRklZVVFTUN7f38DPxt3e01ZRXdXT1t/d01fW2d1TWV1YRFBSVNfX0NRTUt3RVl9fXVhbUFNTXlNQXERHR0lNWUlKRVJYRkRQ0dXQx/XLy/Twyd/Z3FJFX9XQ0Nva3cXK8MvM9vPzyvbxzNZdXEJ0dERESktBRFtTUFpcUlRfXVFeQ0BCWl1X3tvb3d3e2sRW193X0N/b2MPDxNnQ3FBX1VdSXl5R1VpOWkRAcHJxfHh9cHZwTltHTUdfQFjd38Px+uX4+Pzz9M7cU19Wx8LHw/X29/TPysrG2sXf0tzVWkl3c3BJTHR1dE9cXUTUzcPYxcTA09VVU1xX3dvb29nQ1d/UWlhSU15ZXNfVUdTVXFNTU1xfVFdRVNdUXVVX0F1CSXdxcXB2SEJMW1pCRlpEWFPE9Mz0/PTH2MfSXkdU0t3N9Pbz//n58vP58Pf28fXE2dxfd3FKd3N9c3d2dkBNRlHV1dBXUV9GRltZVdDbxtnQ28bUUlTd2d/NysHfw8Ld19DUWExYWkJDXlBHT0dWRUhEdXx4e39/eXNDQ0JaUVBbXt3Y2vbl5f798vDM3NjQ19rMyM3K8v70yvL0xcXMwldbVddMdUJPSnROdHBLQXVLWNPZwcn39N7U1tHXVNPGwNVX09ddWlhbRVTS11TU11BeXVRURVzVWU9BVNRSVtbf0dLe1l5aRHN7fXdxdkZHS3VbU0dFUdfSx/X1zcHa19RV3c7x8Pb9/Pjk5Prw9vP9ys3A2tVbW11YRV9DcHN3THZ2dnV1SFHRVNXVRkVcVdve09zQ1t/DxlpWV13dz831xdHaUFhWUt3VWkB1T05AR0hGX1ddWlJGdXF8fXNKdUJCQUBPUNDR09TE9vX08f7x0VLYwNnL/8/O8fnw9PH/9sbO8MHRV19EdnBOUl9NQFtZdElbX0FFV9TX38neV9PIxd/Nz9pW0MReT15WQHRH19FXUN1WQ0JCV1dX3NxXVNhPRdNVxFhdzcdUUNZad311QXRyd1lEenZcQURKXcXdyszMWnbWV97+5Pbz/uX/8Pvg/PDl5P7389teVEhfWHFPQ3FzfXRxc3NfQ3J7TFVASlJXd1L0zlDT9P7OWFVXU1LBy9bxysDleEr9w3BL9szCxnB5XkZ1cE9H01l10l9ycllHS3pb219bcXZRV9/VR13bwtne9MrV0dvw/NPC/vXJ5OX7/PHwwdv39F1K11TXdUndX09eUNFNT1hcW0Nd0VZdXlVWQtTaVl7FyVHXU9XUdEbRUUPCUUBbUttWd1zFVF/Y9d1aXFRVSEdbVlHUVlBRRFzcS3HXWEZNcUxDdnJfWXXaxdVTVdfWUcLbyv745OT64e3g5ubm/fDz883Txs/QRVfTSHBOQndxTVlPdUJOU0B1dXJ1dnNLTNXS0tPb393XX93W1tnM8djExt3FVlFFQFhY1FxbWVFERUxKSXJzdX1zT0NLdHd1RkZMRXVARlhUU1NYU9JdUlff1FPayfT//v/5++fj4eTl+Pn19Mjf39dW0V9U3VNdTljS2sBWXF7T21xaQF1HZXJPTUpNUVx2dVxQSUBd3cXC9crW1NPE0FheVNBaXlfA0MXAycNYVURPSUBfQEdCWkl2SnR9fXNKTnF2TEhaWEl1dUZOckHW3dX35uf75+zm5uHj4+P/+Pf00NX20dTS0dpJe1nRXlPc0FpG111MTHdDfGdkcXNzSVlCR/TGWV3K2vX44+T+9sD0zNvQx95PSH9yQc5VUdbQw9h+d1F1c3RWTnJ3e3NwRtVMV0R3V1xHUEHUdFBZfHd0ddH7+/nh4+X5xvrm//Hb9MnXU19RVkZMzNBCR3bCUUXFzdLG2dpEd19ETUddQEJ2ckBNfHR3Xn1wWV/3+cL+0s303FZz0nV28dD72PnFSvDL/c/0y8Ba9NpdWEzXT3V2ZXhDZkpGdl12Uk99WHFKeGRydFfDy/Lm5/jn5v3+++X98/f4/f1cTVBb2Ux3eX9GdlJbRFZF1UFBWHB6QkNzVXdFWEBMTVZWW1lSWMH+5+T84Pj08N3T9dLYycXPwt9R1lRT31nTUUJGc0dCcUh0THV3TnR1S0VSW0LWQ01XX19eTEhOQl3A9vb+/Ofn+f7l+uT//Pb658fTX1bfx9LfX1LVX9PQ2dDb0lRYRVhwfn5+eXxJcHNMSkZISEt2cETYx8j08fHHxPXEwNDR9PTAxd7JyNFUxPFQ0VdSVExeSEFye3l8eXxlfHR2fXVFTXRwRk90dEtxSkPUxsTK//zz5efj5OTg+/jk5PDzwcPLwNzFxVxTVFDVXkrUQFxGXlRddElxcERBRUVeQFJR11lKWNPR0tn1//DIyMdU39HUU13WxdnWXdTeUVdRU3VOW11Pc09KcXZKdHVLcXNLS1/UXlJZRVpYX0J0dnZNUNDH9cj8+Pfy5OD65eTl/PH28cXd28HM0dbZUVtbX1DV0VPU2NRWUl9IdUlNTk5aQ0lGRkh1cU1PSkFU1dzaxsTGzMHS0sTb0tzNzMHH9PXAxcbTU1hHQHV3dHd9cHdwfGRkfHt5d090d3Z1TnJwdnZ0SFfSxPbl5Ofh7Onp7Ozs4+Dh4f/y9/bOwNnUV1NFTkhIQEFNR1JER0ZPdHVORVpMW1pZQUFaU0VZ0NXUUNjBxN/M9MxV0dBETV7RUllX2NvT19reWElMdXxzcnNxdHZNSU13dEFHWF1QUllERk1OdEp0SkJBWNLHxvH65Pvk4ef4/Pv7/fT8/PbE9PTfVtDYV1pc11JaUNzSVlfXU1xYU19ST3dBQE5LQEVHQltZWVlSUdbf28zMxN1VUdVSVtPZ0tzM9czF2sXXT0lMdXx7fXB8fnd0fXhwSHdwS0l3c3BxdnZwdEhBTVzb9Pz54e3t7O7i4ebg5eTl+PjO89rW3k1YUEhfS3FSREB1W1dCSEdTV1hSV1BaTFlfQ0JR1VBSVdLa39nPxdvH2NBcR1hHQUdbVtRS09jf39bVX0BOQ0NKdnZ1SU9JWFlaR05YWElPQ09yfHBzfGV9cXN0RN7w/eXm4ebn4+Hk+uTk+vrn5f/1yffB1NDXV19YUNHWWVbXUERMWVNFQEFMTnV2TUZ1SVteXFlQ39nQ2s3Ax9HX1FxdVtTW1dHe2dTdw93WVFVSTElERXVyck93cUNdWEtKTkN0fXBxcn9+c3FzfHxKW1jd8vv7+ubg5ubh4Ob75eXk+P/89MHS0dDVUFTUXVlTU1pNT0RASkNfX0NKRV1BT1JTRUFJXVZW1sXGxtndxd5RX1hbW1pQ0dfW09Ld0tPS1VFRU1JdX19YQnR1QFtRV9XXW0xARUJ2cnN9eHt+eWRkfHVEUcP28//75Ofn5Ofn+/nk5+b6/vjy9fTJwsHY2djQ1lRZWkB0S0NITUpxdHRMRk1CRVpAQktDV1DTxdrD29/E39bV19DU1dfFx9/Y3NDWV1RcQF5WUkVNTndyfXR1TkdfWURMd0p1cXF7e3l6f35/dU1f3trP9vDy5eXm4ODj5f/64Obl++X/zvT0wsbYwMXS119HQU9MdHVNT0xKTEdYW1JTWEZEQUJCR1nV39PR0tbUUVBTXVxERF5R197Bx99SV9NQWFtQ3tPUVVZZTkxEXVpFVFxYRkBFdXdzf3l4f3pkZX93TV/V2NrJ9/7l5Ofn5Pjl5+Hh4Obh5uT4/fHw8/Hz8cHXUF5MdXVLdHJ8c3Nxc3d1QEh3WllBdUFW1FFV0NDT0d/O2MXf0dZU28XEw8LE1lDRXEVDRFPVX0NPSHB/fXdIcHVPR0p3dUJ0fXx9c359d01PRFHf39zE9/Lz+eXl+vj+5Ofn5Ofk5fz9/cvJ9fD2z8La1FxYRkp2dkpNSklBXVpAR1dSTUVTV11T195QUFbQVFJeV9RaRV9VV1Tcz8/PxMDTW0dFXFJXVNRXXkVZRERCS05NQ19eSnV2dnx4eX1/ZXt0TUhPX9FS0cX28/X3/fzz/frn4eHh4uDg5uT49vf88svLxt9XRExKc3BzdnFwdktKdkJJQ0pMXlxHX19eWVxQVNZcXVfd0VTX2d3X2MzI9c/Z3lxGQ1JETUdHRU9AQE10dEpNTkRSXEtxdnZxc3F1SXZLXldfVtbd09DYyvTMy/D88fD45fv65Obm+vv588nK98rBwczFVVpHR0x0T0FBdElBRUxOWlZcSETc3EVeVNRYRV9XTXVPWlhJR1fW1tPG9PXP2NlbSEdQXkBHU9VaWl9QQnRAUURGX1JLcnZ0SXJ+cXZxdkxTWkVY099WUdnK3NDM8fb28vrn5+bj7eb++Pry9PTw9srPzcNUWF5ZRkJMWk52c0tBSkpbU0xC1d1ZQUXU1FhfVF1AQFLVX1pQ0tHV3vP9zd3eVUFPTUNLd3RdX0BDWVpNQV3fUkJJQnRzcEhwZGV2dUpJQ1ZWU9PO2t7ZwM7Nz/Dy9fTw5eTl5OH4/P////H18PLJxsPN3VJZVF1fRUBASnN0RkNIdUFZUVPV0VZZV9ZSRF9QR1hfXFBTWVNX19rPyMDfVNRTRnRPRkNPWFZbWVlTV11T3dBdTEBCSXRwfHh5eXF3dnFAXVTU38fF09HEw8HFyMzP9fnl5fr6+vn//PP39/H/8fTLyNrQVtXT1F5HXERDQERDSHRNQVpERkVZXFlcUlVTR1pTUlBeWFpaVtfY2sDZxMXaVF9ZRENORlNUUlNRVdbc0dVcWUZERk90c3B9cn13dnN2S0Je0MPG2cnLzs3Jz8fTx/X38Pjl+/v+5fv5/fH39s7D98jcVlXWUUdS0VBMWllbT0pAQ01PRlpUWkVYXltZXVhcXFxRWEFERl9EXdDe0d3a2FRFUVRFdUZSW0dHRdTUVlTR3Fxe11ZKd3VLeXp8SndwQ0dcX1fEycXZzffA3NjB3FbSz/H2/frk8vz65Pjw8/zxzsr39N7W3NBZUdHb3VFR0tNDSUBad3JD1VJCQFFZTkbV1kVNQ0N1cHdBRENH08Tf3sDOVVxW0FJHVtFRQ13R0F1d1ddSU1DcWXF8cnJ6ZXx0fX9wQ0FaXNvLxNr09sjc0NtSWNPw8vz64ePm5Obm+fP18vPJwffCU0VfVERHUdFeR1hSRk9NREh1TFzVWEdH1VdfXN7dUV5YWEt1TllYWVDZw8zawcTRUlpWU1hR1FpHXFdTU1hQ0VZRVtVGc3lyfHp8SkdPd0NTXlHd29Pb38TG1FBZW1tT2Pf08uTm5uTk5+T9yvTx9fTNz9tUXVdUVtfBx9VRUVFFREJPdU9aU1pOTUVcWUdb1VJPd0l0cnFPRUJe0MbH3tnY1lxeV9XZxcXE1NHS1F5HUdPVU11fT3N/eH57ZXBOTE5CU1REWdPQ1t/H3tHV09VW38HL+eXl4+Lg5uTn+fTz/PfHwcbYVFpcXFldU9fQXlpRXEBCQUZBQVtYTkhCQEREW9HWU1hZW092T15ZW93C3dXR3FZYRF9R1tzEx9nW1VReQUJTVlhBXkVKdnBwc3Z0RFBTXVTRVENd09DXU9DfV13R11bQwvfz/vrh4eT7+vnx9fL9yMLAx9JV3sTY3NLFxd/UV1dbTUBbWEJJWEl9c0tPd05CR1paWFlASnF0Wl/U3NjZ1VHX1FJW2cXFyff2w9PQ0FNaX9dZSEFBSnNyc3x8c3RCW1BWV1ZeWlpSUFzU3tde1NrY2cz3//n65+fn+Pzz/PDx9vbI2dfT0VHV3dHV19Pf1lZUXUZMRlddQE9ATHdHRURAQ9fe393RUF9DS0JGRlxUVF5MQkFOTkVd0dzZxsfF31ZQU1lbXFNDdHVCTU5CT01EU1RQV9zRVlJZW1bXVFBZUkdY1t3S3sny+Pv65fny9vfz//7y98/HxtrHx9rEwc7D0tjfVlhcWkp1T1tLc3FxfHNwdkpPRFFX1VdHQUxITltQ19bS3VdQ0tPW3tjN9M/My8DeVlBRWVtNSnR2cnZ3d3Z0T0hHR0dRUlhTUFfV29lVXVLX1tPYyPf08Pjl+v/y9sv1z/bz9sr1wsXe39Pe29nFxNre291RQEdHRkxIT0B0d0BNQllWU1FeUlJeUklKd0pJQ0VYREZBQE1AUNTX3M3198zA2N/UV9VXRklOTkJ1TkNeW1taX19dU1JfR13X0FpdUFhNTkdYXdTazMr3//j48fT19Mr09/bx9v3z8fT39vbOzsv3yMbQ0NVETU5CdnxwdHx+dkNHR0FHQk5AT0hxSkJNTUBYU19fUtTdVN/GwtvBy/H0xtnZ1EZBQEJ1dXVxfHBxSkt0SEFaRVtEU1ZW1drTV1zU0Vpc2svKyPX2yvD9/PTL9Mja2sDPwsfPw8nBxM/P297M8vDH3NLaV1pHRk5ITURMRV3U0NTRVVhNSnFxc3Z1dXRxcE9bdXRF0NRXVMLPwcv3ycbFxd5dX1xTWVZYXVhMWlJaTENfUENMUtFdWljVXExLQEhxRlDf3dPHzsfK9fb39/bx9MPNz/TIz/T+/fHw8vD19/zwwsfe2V9DT0t0cXBwdEtJQVJZW01HdHx5c3JzdnV1cE5FXVtUwfT1yMrx987Jy/TG2d3WXk1OWFxaSUBbQnV3dXd1TUZMRllTU1NVVFlBQUZaRFffws3NwfTwyM/28v3w8fDN2t7b1t3ZwcHbxMDNzvX198jAwMLcVkNCR0BNRF9TUFPR01RZRXdxc3BwfH1yfnh2SnVIXtPaxc3DzMnNwMzKzsPZ3NdSWVVRUFfX11FWX0dNWFhHWlxSXFhcXUd1dnR2dnREXVJR3cXMzcn38PL8/vv59czPyNvG9fTJy/f39fb98Pb09s7bVkdIdXRKdEhNTV1QWE9GQUp9fXFzeXlzdn5+d0BCTNfN9/X38//wz/T3ysbY399fRFteRUxFVVFbWEF0d01BREhY1dRcVtRRT3ZOQ0dMWdHE39PL8MzP9/399vD/8dva2t5QVtjCx9/EzsnNz/L49/by8cVeQVhCdklcUFfT3NtQXV1EdHFwdnxle3hlZHt8dHdP187H38Tx8djG8fHCwcPP3FPU0NTR3cTB3FVRXURFT1hbQ1lQWE5OTHV8eXN0cHRDVFRS0MzOyfb/+/v+/Pnzy8DLycLByvHLyPXz9vT9+v7xys7RRXV3SnBwdFpYX1hcRE9KSHVwfHJ0cn5+cnl5ck1eUNbJ9/TL9PD39cr29M3e0NBXWF1VV1RRUVJbSUJ2dnF3SERFXVNGR3d1dEtxTUxBX1Tc3N3b9fby/f75//bx9M/AxMHF3t3FwsPFw8j39fHy/vzxz95XRkdOQEVdVdTc0V1bR0NMdnFzc3hkZmFnZ3pydElDXtfQ1tPE2MLDzvf19M3b2cbGxMDPwsDdxN9SXEFIdHVLW19aS3R0dHJ2S3R1S0FEWkNS1NHGyPD45fr///3x9vX3y8rKz/T3yPfy8v3z8/z99cVRX0VId3RMTUlLQUNKS0xLSnRxd05xenpleHl9dUdc1tnFx8DNwsDFx8DLys3Y2tHU28Xb29vYVV9ZR0J0cXNwdUlaRUJCQVxSR1tWXERYUFJfUN3e3tvL8/3x9fP2zcDAx9jdxcTaxc/PzvX3/fz9//D0ztzc31BEXdVTWkVQUV5TX1pGSndxfmZhYWZkZH9KTUBfVdVV1NPf0NvI9Pb19PD0w8j0ysrJzcTT0NzURHR2cHJ/cnZ2cHB3T0p2TFhLcXVDWEFGVcHN9fz7+P/9//Lw8PL89s7L8PT28vD3yfTx9cfexd1TR0VbT3NxSnV3SlpZTkxdUlxaTXVyeHp4fXF3R1ZVVNnA29HU0tzZ2MHAxsDOzs3F2sff1NXS0FRXVllIdE5KdnF0Q0ZHQV5TXEFHXEdJTVJSWVbawMPCy/T1z8bByPTDzM7Cwcn39vb38/L88vD38fTIwNrT0dFcWFpcUF5eU1lHQUZOS3B4e2ZhYGR4f3xxQkdbWl9dXFXZxcD18fz7/vLz8vDJ9cvPxsDOxt1XQXV2c3J/cXZzcnFKdUh1dXZ2d3VNR1LV38709/Dz8vT29PD88vH38v/8//zz8fX0ycrJxcbDwN1UVFBHREdERURFQUBHW0BDQElxdnF8fH1xdnVCRkRQU1BT1VXV09fQ3cP09vX0ycHGw8fY2N3W09PVV1xETE5OdUlOTkh1S0JATXVPTEpLTFxRVdbCyMzGzvTOwc3L9vf19v388fLy8fTK8fH19ff2yszJ2tDW0ldTVFBTXUVPTnRzfH5+e2VlZXt6eHJ2d3FOQlpFQVbZ0tjM9M7J8vL88vzw8vDIy/P0w9vF01pGXFh2dnZKfXxyfXh4fnh/f3lzSnN0X8XH28jy9/Tw8v3w8v/7/f3++uX58fD9yMnLy9rHz8/c0NDR11BeXFVeW0ZaSHd0Qnd5fnN9ZXh8cHN3d3VMQUNcV19H1M3e0N7Lw9rL8vTO9/D1ycjNzcfYUFfTVV5UV0RCRU1xcnBxf31yc3JycHRKdExf0dRU2/H1z/Tw9vbw8vH28vL5+v72+fny9vL89MbIyt3WwcfUV1DUWVhBdHZJdnxyf2Vke2RkZXx9f3NKdHdNWl1FUMXMw8DA9/PwyvL/8fHw/Pb09Mnc0lFfXlxbT0JAQnR0cH55dn14fnJ+ZX52dkpZUNXRxs/28vzw//r58/3+8fD/+v3y+fj98vP29/TP3tjZ1FHVU1hbXEBKSklJSVhASnF2cnl5f3h8cH1zTkFISUVYRFbZxNPS2sfP9/T18PPw9fz+9MHMxFNW11BZWkVATVtAS3RLcXN2dHFycn56eXR3dVnWUlTEyvfK8f3+/fPz/vz0yvz+/P/l5fLw/fDPzsDc19ZZR1leTU9GT3RPXEJIQEZ3cnZxe3tzc35wT3VITUxKRFXV0Mz0wsf39M73/f798/Dw9vTA0t/TXkVTW0NOT0pKTEZJSU13cHVIcHx+f3h9d0hH0dnX2/T39fH//Pb9+P/8+fP38vn+//r68vTw9MPBxNVTUV5DTVtCd0heQUNSUERETXZ+f39lZXh7ZHxxcXN3d0pBUNPdwc7L9PPw8f77/P35+vLw8cHV09lQUNddQU1CTEtAQ3BwdHJ5cHd7YWVyeGV3T05f0NzH9vT38fz88vjk+Pz4+/j65Ofk5eX99/fJ2dvXWV9eTndCRkt2QlpMTFtFTHV2c31zf3t+fXl5dEF2cUFbRlDMys3L8fT18PDx8fPx9vP99MLF0VlW1lFFXl5DT0VcR01IdHZ1cn1xcXt6fHN9c05FX9TZx8j39vH//PPy+Pry8vjy9/zl+/77/MrAzMfQ3tZcX19HQF5URElfV0dNX1p3cHRwf3l6Z2V4e35LQndKWVdc0s/Owsn29PX39/by/fPy/vbHwcdXX9bcXVvU1VhaXEFOSHZ9c3F5enxzZGd5fmV+S0ZCV8PDyvz7/vrk+vvk5/j8+vv9++fk//L2wdHQU0ZFWUFFV1dbWl5DS0RcQk5HQnZ2dHB/e3t7fHZxdkVSRF/ay8fGy/bO9ffJw8LGwPbz98v0z91V119GWVdSXdTWWE1DT3d0SHZ2dXZ9cnF5e3J2cHBDXlDczPTx//r5++Tk/vv78c738fTw/v33y8DWU1NERlxU19LE311eUVZYV9dESENJc39+ZWZkemV+d3BxR1RQ1cHIx8X09s7PzdnR28LD9fL2yPfK0FXb3FDU2N/U1lBPdXZwc3Z0cnxwcnp6fnllfXZzdF/V18Lw/f7l5Ofg4+fl5Pj09/789Pf89sLY1kBPQUxOXFVdUNFQQkJfRktEXk53T3V9fHJ8eXxxcEtZWVjXx8LC8fP19fDK3NLWXVzU0t/DyMDGx9dbUNZQXtTZ0FBRUVpBRkt1QkJ1dEh3f3FJcXJIQklEVdDSxvT39vrn5eTl//b0yNrayMvD9PzO0dLQX1pR19TT2d7Ew9xV191QQUVSTXJyc3pkeHh7fHBwdERHQ1HZ38fx8/T19MVU0dnVUdnNz8r2ydjH2ldVx9Jc1dhQQF1Zd3BIdHx2S3J/c3B/fXRxfUhZTE7Vx9nC/Prk4O3m5+Dk/P399Mn09s3ExVVBTUBJSkVdQUDV39HS1l1W09VYXNVGdEhPdnZOT3VKQEZEUlRS1M/KyfT3w9/b3FpEUVlHVNvS0MTeVlDX113V0VZV3NBSUFVYSUVTTHVEWklOQ0p1T09xdkxLdVrV19v2+fjl5uTl5frxz/XLzMzO29DRUEBAX0VBWNfU0MzOxMTA29Pd0VhAWkZ0d3d8eXJyfn10THdKWVDVxM3Bzc7Nxcfa0FDW39PbzM3Ax8fG3tjYVFHX0VXVVltERkRMdU5KdEpJdUp1dHd3dXR3SEJGUdvI8f7l5uHg4OTl+/P29PXPxMXWXUdBSXZKdXRBV9fW0d7Y09/f1VFQUlhfX0BOTk9xcUJHQEZbXVTR2MXHxsbExdnQU19cXV9W093S0FRU0ddRWVNR1ddV0dbVUVbVUFBTUFdSW1tFQ05KcXB2dnF1QUVQ2Mz3/OXk5fr7/vH39PXLwsbb0tZTRVhaQ0BR09zEwcLPz8zE3dHUU1tcXkB0d3dzfX1wcHZ2SlhSXFfd2sXZ3N3T19TW1NzYxM/PzsLPw8Xe0NFX191XUdVWX15FR0NAREJORkx3d3RxcHBwc3x1W13XzMr3/OTm5ubh5Pj+8PTx9Mbe3NRYR0ZKc3dOTVpTVVbW0tzZ2NtWUlRcXldQQU1FQ0hJRUdAXVZV0tjf0NvF1lPW0UdGW1tHXNLX1tzT1NfWVlPVVFbV397X2drRV9HfUV3VVVBfWk5LdXN8fHx+dkRcUtfGzcjx/v/9/P/29PfKyPXP2trH0ldQUV5BXNfW3NrGwdjZxdre1FlaUkZITEpxfH1xcHFOQEdeVtPY3Nja0NVV19DXUFHVVFTdw8jFxMPE3dPS0VdQU1dXVVVdUl5AQUZBQkxDSHRKSXRwcXBxSVrV287K9fL4+fnk5P788vPKzMvA39DQV1tbQUlISkxBVlZT19Lc19LY0FNeUlBSWVtaT0tPTUVZUtTf2NrCw8HG2tzW1FBeWEFOdU9GRVxXVVZT0dDVVNVXUNXZ2tnEw8XR1VXX11dWUllHSEhOdHBzdktJR1TS09jByfT28PH09fTKw9ne2NzU0NLT19bXXVxW1dzEwsbEyczF2N3UUlNSRkJCdXNwd3ROR0VaU9fU1tjZ1VTX1VNQVVBZWUFHUNfU1d7F3trMxdTc3V9W2djW0d7RU1JQWFhcQ0pIS3FzSktxdkRFWtLb0sb38ffz/vLw/fL19/HH3NreVl5VVUVEXEJLWkVNXt3RUd3H1lfS015W0FBaW1tMTVFVU9bFxcbIw97AzttXUVdBTFpBdElNSHVNRkZd0dBU1N1RXVZTXdLPw9vCy8HFxd9V0N5TQEdGQkxBQEtOXlxcUFXW2MDE2MXCzcXAwNjAxt3U1tDQ0t3Y1ldUVVFSVNzAzc3Iy/XP39zXX1lZQnd3S05NQFtaXNVUVNVV0NTVV11fVdFRUVBTUdTUUdXYw8fFwtvd1F1aR1PV1dDS3t3YxFRYW0VNdHd2d05CTEJeUdTS2dzZzfXLzcn09Pf1yMvJz9nQ01RX0dNWXlNcR0NJdUNcXF/XxcPGwMDZ3d/TVVZTW1jX2dXUxMDZ0Nze3thVXl5ZQU9HRUJOQ0RDTkNaWVHVUFfQ0V5aXFxW2cbBzfXLyfb1xNrZUUNDWkNCRFtPTVhEWlFWXVfZ3VHU2tNV0N3SxcPc0NrE39rJztPW3VVSWV1X09vexM/0z8bO2tVXUVhDQUJOQ19YQFBXREZcV1fXVVxeVldbX9ZTXdTQVl3c2t7YxdzX3tFHQVxZRlHZ2d/Fx9Ld3lRcXkBxc05NSkhfXltXVl3Xx9jTxszExcrIxsDDxdvG39bT2tJW3dhXWFtNcXdOSU5R0FfeyM7GyvfG39nQUlTT1FHS2tPRxdlQVNzVXVFRR01FT3VCRnR0Qk9LRVZRVNbWVFZUX1zX3NbdzM7J9fHKw/XP09fQWkhEREhIRVtOT0BNQ1BXXl3VVVxS3t3U28Hf08HDxs3D2NvAx9ZXUFtFUlFU3trb2MfPwMDN2tVTV1lEXFtAR1FfTVlRWVtXV19X1FNYUVNbXtRRRl/UVFbd293exd1TUFZYW1FVV9PZ3NzF29HW01dGR15ET01GQUVYR1pfXl1V3NzR3cTFxM3Mw8DE3tDf2dPR0tfU0tNQXllHTUJfWVtU0NHQxMzGxdrY1tPY09fQ1NXW3NPV191VXlZWXkRaW1lfWVtATU11SUdBQFtW1dTV1tfU3NLT2NnS3cbDw8/Jw9nE2VZRUUdIQlpMSENEQkxZXlpdX0RZ0tnewMrYUdzG09ba2dfS3tzfxd9SV9nc0dzcVVfd39LFzdxT09lRUNdRW0VaWl9UUkFR3FVS1NVYWlJUUFXQX0BcUkZbVVJaVtnT1N7YV9LM31Xd3FFc0N9WVdjUW9TTXUVeQUtMWUFIWF9PW9dWX1XQ1t7I9cn39sXUxsHWVNdRW1HTVVfT1UdT2FRaV9BfXd/Z1dzC1lPaxVdVxdxS1dvfVdnF19LH1FlX1UVb0NdHRVVFdEBGSkxEQEdU3dVX28fd28zfV93TXFPe3lDSzNLRz8NQXVxDQkVaS3VcXU5EV0RCXtVU0Mv3wMP1x93B2F5ZVFBe1N1VVMfC3NjG2dHR111R3txX1dJU1d3WXV3WUV7W3VfXxsbR0t7XUFFWW1fZUUZaU0VCXlJBQlFTW1bWUNTCzN7cx95QUFBGWdfUUlTEx9ja29VYXkROQkBMRFxZTUdRUl3R2sDK8/bNzvXD29/VW0VfR0FeUFJR2drU3MPcUlDXUFDR1lPUxNxU0tPW39zd0NnOwd/E29fU1tVcXVBTVlFdRlpfT0xFR0RFRUNGXVXX0dnZ0Nzc1ldXVFbV39/cz8jG2MTE1FFcTUhOTUxNQExMQ0deXNLBw8/Nyc3Awsfd19RSWFpGRVbV1d/e2Mfc0VRS1NbU1VDW3dDQ3NDR39Hd3dXQ29/W1NHWV11TUlPX1lVUVldXXF9dWF9RW1pYRVpc1dHV09nRV9VXXVZVV1HV3NjexdjZ2d3VWVpFQ0JEWkBARUVHW1LUx87MwM7Jw8PB2tzR1F5BRERHWFJQUFXW1FBWVFDQ2dHR2Nrf2cfA2tvE0dXd39LS3dRXVNRWW1bVUVXXVllfXVtaUlNZWFJEQ1tHRF9SVFfU3dbRxd7R09zQ1Nzb2NjA2dbS0VhFWFtGRFlGT0BAT0NSV1ffxd/TxcDFxczE09zTUF5TU1lfUl1cVlVcVtDd19HZ3dDZxd7b2tPW0NLU1N/d1tPRUFNQXVtT0dbV0NNTUFRQXVxQXVtSU0RDREFAWFNTUFTR1NDE29Pf3NfQ3d3d0FVSXlNQWV5QXVPVUV9bRVtDW1TV1tzf0N3YxcfHxdzQ3NVbWV9FRFtYWVldUFNT1NbW3NjZ2sPAwcfa3dPf3dfc2tPW09ZWUFdUV1fUUFxTXl9SVlFdVlFSXF1ZQEJNSEJdUVDR397FxsPBwcTZ2drE3NDXXVlYU1JaXl5FWl5eRVpYRFtcUlPV1FZX1NLZxsLBx9vf1tRUU15aWV1RV1dU1dbQ3dvF3tjb0tDc2t/c2dLQ0tLQ0NZUV1BcX1FVV1JdUVdV19bV1dHd1tFVXkRDTE9GXlxRV1ZV3MfHx8PE2Njf09RVXUVGWkVYXl9fXFTX1VVUXFtRV1JW09BU0dzS3sPD2Nnc0VddX0ZGRVtaRVNRU1FUVdbY2NzHxN/bwcba28Xb39/f09vB0tRVVFxYXltAQ1hFW9VVV9Db3FTX0FBGQU11RlNT1NLe3cTJzsXCy8TYxtnQ1lReQkBGTE9YW0FSVV1ZXl5HRVxHQlbXXFHQ0t7Bzc3Hx9jd39xWUdDVXFxWVFfU01Fd11de1dJXVNPTVdTY01Tfxd3cwd9XVlRWXVZVXlhXUFxV3dzZw8Lb3tnXWVtaTElBRV/V19TcwcDe28PE0tnZ1tVRRU1OTElPX9RSUd3UU9TWUl1UUVpc0tVd093X3cHHxMTb01TUVF5cVF9EXFZeWVHVU1bf11Tf0lTR3NfW28fY2cDA2sHH0NXWVFtaUV1BWVFERFfVVt3B29/G21FeUUVNXFdTVdnc1t7Ax9nCyd7cxNFeUlNHSUJBT0BcRUdWVV5d0FFbX1FYWlFUX1Hc0NLO9M7DzcHc0NBQUtDXWF5UWUNaUlhe0dxX1NdaRlZWU9Xf2N3YxtrexsfX0dnXVlRUWUVTUURe0dTQws/Hw8fc1VJcWltU1VxfVlNR19jbxc/C09fTWEZdXERFXF1YWFpGWldRWVLR119dV1xYUlFTV9/FwPf0xsTH2dVTUFBdUVxBQ0JMQkRSUdfYxNRYUlxcVtfR3sfH2dnExsTGwd3W3dnRUl9ZRVteRUXX3tPS29re3N1XXF1RUFJQWEVQ09DSzfXOwsPcUFXUXV9TUkVbW090TEVCQFxTXlZVWUZdUVtc19ZUx/fJw8vIxMXb1FJV011aUltMRVZYWNTdVlLXXExYVFlY09nR1N3VV8TJxdrIw9PY2FBbVtVbRdVUX97G0dTbwt/d2tVYVNFbRFNdRlPQ0d7P9dLV2t1R0dJdWFXVRUBBSndBWE1F1NVfXlxFRlNVWFLe09HEz9rby8zS0t7VX9VVWltVV0dZUV9fVVRaW9RRWlxWWVnT0lFX09bXx8rPzfXO3dPSVlNUVF1Q3NNQVNRW18bF0tPcVFpcUFhf1lFFUNDS3MTH0dfH29XQ01ZWV11BRl9HSkxeWl7VUEVEXVNfUtZVV97TVNbf2sfF2dDX0tFdUldTUlVRUFZWUFlYUlNQ11BaXVVUV1RUVlXd39PEycPaxdnXVdHRUVbQ0FXX1V5eVdPU0Nre1tDRU1DQ0FBR1tbR09zS3cXa09DS11BVVURDRUdGRUdMQ11ZTUZYWkZeU1LX2dPX1tHV1sPA3MfP29be2tHS29ZeV9hUWl1bTUdTXUFaXURaUFBbUtBUVt3HxcTOz9zYwsTe2cfaxcPc1NLSV1HX1FDV11xFWVJYXVZfWVfS1VbT3tLexdNX0tvWV9BUXFHUU1lU1F5aWFpARFxFQ1/XUV1XXkFbV1ZT0N7c097WVt3Y1lbR3dHc2NBWVdZUUVZQXl1VXVtX1VFV1tfQ2sXR19zdV9DZ1tTYxd3Q0NRR1N9VV9ndVtTd1lfQ2VRT0t7W3dnW197F0lfW119QVFlFWERDR1hZX1ZQQUJFRURZWFhQV1VTUNZQWlbW1N3E29zd3t3fw9tV0Nrf0dLc1F1eX0dBW1pDR1hZUtXUVtfe2dzExd7bxsTbxMbF3t/f0dbQ1tXR09PS0VdfVldbRVBWUlNWVVXS09Hd3dPV1NDVUVdV1FZRUlJXUF9fUVZfXVZTU19YWFlbWlheWUREWlxSUVBQ1NbT3dPbxNva2sXBx9vf0tRUU0dFWltdUtXW1N3Y2dzd097b2N3c2djQUVRUUNXUV9Xc3t3c2NLW0tLWV1RX19LWV9fe3tfQ2N3V1FVfXldXXVNSWltfRk9BREVYV9RdUdddQUReWlhSUlhS09RQ19RSVNzd3drD2t/Gx9zFzsXU19FTW0dNdUhERF/U0NXT3FRU3sTFxszDxMDG11NUVF1W1tZV3MTf0Nzd0dzcVlxUVF5bUFBSV9HQ097e1VBQXFLU3dPW09BWX0VBQVxSXNXd11ZQWUNBRVpFWltaWVxYR15QXVJU1VRV0tHX3MTFxM3DxcbG0lBcXFhYXV1d1tLV1dRTUNHe29jYx9nQVF9cV1ZT1Nzc0tzb29/EwdzaxNPc2NdcUtfQ1tHe39jB3VdUUlpZUldfWVFfTkpLdUxaWllT1VFbREVBWFJcU1VUUFFXUl3U3NdX3d3X1tZWUdfZ3trG29vB21VfUltCQV9cWVTXUl9XVdTS2N7exsHc09RX1N/f0N/a3tbW3NLR2dnS0t3WVFBdQUVU1VbQ3t/FwdnQ3dzVUNTWVtXWU1tbWVlcUF1cVtVZQ0BATUFeXl5SUVpHXlhYV9bVVdDd1lZWUFDX09PZx8HBwcbY0NPRU1leX1hdX0RYUVNfV9ZU1NBXXl5dU1Tc39/ex9vQ3cTG2sfAwcbMw93Q0VfU3NzQ38XZ3MXE39PTUV9dU11bRUBNQVhbW1lZWlleRE1EWVpaU9dXVddWUNTR0dLe3NzY29FSXFJcUlTV097e11fR0VZU1VNbX1xaRlhZXVXQVFHW09bU1VZQ1dLd2MPNx9ra3t3a29HU0tjZ2d7UXVJTU1fR0NLZ3NfQxcbb3tLQ0NDWV1fXVFbU1FBZXF9BQEFHWFJdWVxUVFtbXV9ZU1ZSVdDc09HRUF/V0NXU397S3dLR0d/cVFfR11VUUFlaWVNcXlJeWF9ZQENeUlHW38XawsHe28Xb2NvY3N3fxNvf3t/d393W3cXa3dLf3dDZ39fR3NdSUl1cXVXUXV1cRUBAQUlIRVNd19jTVNRXXlPT01BQ1tHQ3tnRVVdWUFbT1FXRVV9eUlBRVlFTV9PWUFdRXF1W1VddXVlFRVtYU9zf09rLy8DAxtvYw9rW09FVX1NVX1lV0FZU39LX0tLX1d/Z1tzH2tna2NHR39jd0t/WUVBeTElHRkNEV1RX0FReRkZBRFJdRkZSUFhd1FVSVlRV0MTb19LZ1tfb2NVX0tLW3tjR19zUXlNRWU5OT3F2QVle0cfaxczN39/Axdfd2tFUVVBbWVZXVt3a09/Cwdzcxdnd3tnW0cXd1NLQU1LW0VdU1lJER0dPQlJTXdbH2tbd3FBYX0dMQURNTFlZQFjU1V1Q1VfV0NNVVNDRVdPTVFTS3dbcxtrS39xWVlZaT0JGQ0Bf19Hezc7CwMXS09LVXF1UXUZAREJGU1fX39rY2cbB29jCwNvbxsHHw8bb2MTf0dLc1VFVU1tHRVpARF5eUtbXXkVHTUp1dXZ2Skh1TVtYUNPe39/bxN/f2t7dxcTd3dnZ39vH2NnE31RV1lNbRk90dnVOT0dV0t3Bwtjd3N1UV9VRXFZRW19VV1fSxcTFx8PExcLCx8HA2dnHxN/c29JR1NZTV9LVUFZRX0VZXkVY1dRV0NdcRkNMd3N3dnB1T0tDUlJc1dzQVdLcVdTY39zEwNvaw8Pf2MPE093cVNXRUVpbX0NLRkVBX9zb2cTG3NDQUUdZUVlHXlJZXdfT0cXPwcXNw8XHyszHzMvCwcjB09vFVVDW0NXX3NZQVVVZRlhaRltXUF9TU0FJT3dydnVxcU9BQ1lUV1HQ3NbQ2Njf2MXZ28zKycPDxd3ZxdLV0dZWUVZeR0ZDS0tHXlHS3dbW3N/WUVxYRlpcX1LU1tfT3sTHyfXCwc/IycrIwcPOzMbF2NLVV1ZQ1dHS0tbXV1FWU1hEW15fXV1cUVFeQE9JdHV3dnVITERfXVxQ1VZTV1RV0N3d38TDyM7H2tzT09bW1tLT1tRWU1BTWURbWkVW1NXQ2d/Q1VVSWV5FQEVfUVfQ39zYwM3Bwc7Mws7JzM73yMfHxdDQ3dFV19PW0dve1tHf1F9SXVpGRkFCRV9BSUNBdXRPSnZ1SU5DXFxaUNReWFTQ19DY28TI9czAz83c2MTc09zf1dXd1FJQVERCWVtCWFZSVt/ZV1PVXUZEWUVa1dVW0sTZ09rP2sXK9cn38crO9s7c3NjUX1HVUFXc0dfYxdBU0dVaRFhBTkZbQEFfREhNRkt3Q0dKQllaRVJQRkZeWEZT11FU2MfexcjPx8HMxNrC2tbd2dVX28bd091XRVpaQlpXUFPW3tDV1VZbWllBR1JWXFfZ3NfT29jcxsHHzvTLz8jM3tnG39fS01NT1tbR28bY397RXVtET0tARkxCRENISUl0dUBAdU9aR0ZeXkdEWVpaVtDX08bG2cHLzszOzsLO9cHd0tNVVN3d0dbXX0daWkJHUF1bUdZWUlddR1lSXltWVFJU39DW3d7a2MHMyfX39c/MzMTa293V1dVSX11RVtDS19bQVFlbREFAWlhaRFlaTUxNQ0NEWUVGW15fWVlARkRDQ0VcXVbT2NnFxsPNwcbBwdrS0NZUVdHZ39/Z39RQXVBQUdXV0NHW1VVWUlBWXVlYXFlaUdRVV9Dc39/c28fMwcHCzsDEw8zE3tLWU15dXVHW0tDc3ddQXEZNR0RDTUVETUxAQEBGQENNTU9JQERBT0FeRFpR11fW29nZxszCzM/MwszC2tPQ1FNW0t7R0dzTUFBX1VfVV9XXVVJSVV1ZUFVdXlZXXlxU11TU2MXExs3AyPTPw8rM3d/G21XR3tZdUFFcXFRUVFdTW0deWkNEUltAWFJGQFlcW1hRX0ZDQkxBQExOR1lHWlTXV9PFwNjBzcPGxMfZ297XVdRWU9Xb39LZ21VTVNZVVNDQ0dTQ1NDTVFBVVltbV9VdUdLS193b2N/Z2MTGx8PCztjdxcHZ0t7a1lxW1FRTUVBRXFhHWkRDTERbQVpSUV5QVVVfWV5ESHR1dUp1SEZZWlpS09bU3sDF2MbAxsXGwcLE2dPS0FTV3Nve2cfF19XW11xT1NHV1dTU09HXVNVeWlxWUl1Q1tFX0N/c097HzcDCzMnA3NLFwN/bxsTT1VdXXFtaRUFJSk9DSU5NR0VeU9VWXdfTVF9cX1hNT01DT0xBWVtBX9bT1Nzawd7d2MXf39jFxdLS3txXV9PE29zaxdHV1VXUVNPYxdvZ2sDY1tbWUkVdV1ZcUdTVUlBU1NTV1NDY2d/YxN7R38Pb3N/F2tLX0dBXUlJSWkxMRk11Tl9UUVTexddV1tVaQ0ZFQnV1QEJ0dU9EQVtX1tXQ2MXY0N3GxtvEw8zG28XA2NHfxMXT0N7b1FJQ1FVR1cfZ0NjA3lJT1VVERFNVXF5W1lRQ0MTF09LHwtLWxcHc3sHD2NjBwtrT09LRU1tZREh0S0t3c0tbW1lV2Nve0lVXUV5bWlhNSUNAdXdNW1tZVdbQ09nc3d/c3Nre0dPax9PW3sfS0tze1NHU3NNWVtPb3dDC9MDZxMFWWFHQU0BZ1VFERl/UU1zRx9zU0sfWWlba29XYz8bdxc/B3drBx9JRUlNeTElCT0pKRlxd1NvA21VTWV9FQk5BQndxdXRycEZZQEbV3tVT0dre3cH1yNjfzsnQ1sPI3tHbxtbV2MXVUtfd0VbR2sXe39dUX1teX15ZX15aQUFHXNfc39vMwNzX397W08jLx9v19dvRx87f1NLfU0FHU0Bxd0NCd3VYUFtT3NJaQl5RRkJSV0dISE5IdExbW1tQ1NVXVNTX3cTCxMfCx93Q28fe2sLZV9Xa3ldR0tJWVtrNxN7DztxQ0dvUWVDQV1pYU0d0TFNRWFPd3lNfVNPU1sHIwtrN9M3Z2NraxNrc3d/TVVBTX0ZGWVxZRFzWVllYUllAT0RGdXRCdHh/S052SlJQQURU11Jd2M7H38/w9cfEz83d3szD09HE2FVV0tBVVdTW1tPQ1VRdXFfU19TXUVxdW0dbUlBZX9bQ19PE39fYy8nDy/D1zMr1zNvfwcVRX9TRW05EXkBLXtdfQl5XWUlGUl1ZXlJcWURGRk9KQ1pEQERfXlteUl1R0d/c2Nnf2MXeVFXa2tfR2t9VV9DTUF3TxtvW0sPG1VXa29HTxtrUUNPTWUdcUFJZW19aQUJEWEVc0sbHxsj09PT1zsLCwsfHx9vT0tzVXVbR1VNW0NdeRV9YQUNYXUBLT0F3fHNKdXRPW0RBW15fXl9X3NvEwsnKysrKy8zIy8/Awdjc0dDVXVfVUFLVVVNeWVpERVDX19fV0tFSWVFXUFLV1VJfVlFYWFHW0sPI9cr19MvIyMvJwNjY3NNWUlxBQkRSXl5U0VBfXVBcX1BQX15dXFxHQ0NGWl5TUFxbWUdCQ1lSVtTS39zZ3NLT0tHc2sbExcTZ0VVVVdDXVdTf3dfQ3tJX0dja0tjDxNZWVlJeX1ZSWURaR0x0SkJPQFPc28bOy8PDz8vKysvMwMfb0dfW1VZU19bT0NFXUV1dUtVSRVpeREhLdXZwd0tOT0RbWkZMTURZWdDYxcXNyMDFzPTOyfT39cvNxtLU1lXUV1NdUVxaRV5eX1JXV1Xd3NLV1VxdUVRdU1RQWkZaRkFYV1Xfwcr09MrGw87LzcjIwd3TUUVEXkRNR1tZX1ZQXV9WV1FUXV9RVF5HQENOQkFAQ1hWXlpFWkZFX1Nd193Z3dHU1djF29vDwsDGwdjS2NjT19DR1tTUUFfQ397Z2tnawMPe1tTUUFBSX19ZQUp3dnF3TkNHUtzbxMbAw8zIyMr09vXDxd1UV1RQXl1V19HR1tTUVlNXUVlEXF5ASkl1dnNwcXd1S05CQEdfU1ZU09rb3tvFx8DOysnKyvXOyMHb2trT1NHQ1VBRXVhYXVJXUFTR39/X0dzdUVXd01TU1FJATUZCQENbUtfQ3sfNx8DIyMLNysnH3t9WXVhFT0JbRFpdVF1S1dZQV9TQ19RVU11eW0FASHVKQkt3T1hET1tdXFpRVVVW0dnExtrHzczbxMPD2djF2NHYwdvS1tFXVVTVVNzY2NrCxtLS3dddUFBfRkFPSU5Kd0hATUZT09HfwvTIy/bx9cj1ys/Y2N3QUFlZUVhEUldSWFBRX1tSUllaW0ZAQ0JDSHV3d3F0dEhDW1tTVFfW09PQxMbAw/TLws71y8PNwsPZ3d7Z1tHW1FBfX15cXlDW3tPYwMLfxcDa0tfXUFhEWVpBTUZGQUZeUdXR28jKysv0zMXb2tLR1VdcWF5HR0dYRV5TVlHV0d/d0dPQ0VRXUlNaR0ZNd3F0dXR3TkJATEVZW0Rc1NHR3MDDxsTJy8zGz87BxMzLwNvZx9nc0dbXVVTR0tze2MbE2dDf3NZdW0BNSnVPT0t1Q0RaR1LR3NnP8PLx9vH0zcfDwdxWVNFWWFxRU1lZV1BeWlNXU1pYU11aRFpFQUlMS3dxdEtMT0xEXlhHX1ZWXVXYx9rC9fXNwvX0zMTDzcHfxcbZ1NTf01NfVNdQUt3a3NHbxtjS38XeVlheWUBITUBDTEFFW1lS1tLZx8j39MnDzMDd1NPSV1JRVFBeV9HXVdTS0FVU3N/RVlXUUkReUVtMTEFPcXFLS3FxSUBMSk9GRkFYVNDc2MPJyM7Oyc/NzMvPz87OwsXY29rdVNTS0lTV28bY09ja01BU0VFEQFpFTnVJT3V0Q1hERFHf397M8fDKyvfIxdLb2tzQ09/T11TT39ZU1dHUUVdXU19eUlxYRkVETkhISXVxd0tId3REWURPW1NfXlfGzc3P9/HOzcjJwdvDzcHF29rQ19DT1F1QV1BdU9Hf3NDS3tDXVdHTUFxcU1hBQkFFQ01HWVNSVNzb28H1y8LF2NjW0dLW1FTXVFBSVN3R1tDe29HQ3d/XVlVXUV9dU1lFQklPSUp0dHZ1S3R0dEhPSEBe193bw8/Kw8HDzMvCw8j3y8HMwsLa3tjc3NfV0dDd3d/Q0dJXUlBVV1hYUldYTENDQ0p1T0JGRFDSxcbAysvKy8PH28Hb3d/bx9FU1dfWUFHU0NFRVldUXVpYWVtBQ0dFWk9PTUNASU5OT01OTUNFRUZbU9Pd3cXJ98/Az8jP2sfCw9jS2NnZ0NHT19FUUlJR1lTU0dze1dXU3NJV0N/a0FBQU11BTUZbWERfVNLd0NvExN7R09Ld1NXT3dzVVl1dV1JR1dnZ19DZ2tFQ1dRWW0VfXFxEW15bQUtISnVxcXR1T05JQkBaW1LW2cLBwM/19Mr19Pb0w8PNycHZx8bb1FXS3dFX1tDT11FQXVJcW1xQVFBbWkVbTklDRkVBWlDT3N3Ay/XNx8HDwtvYxsDB0tPR1FZZUdXVVlbX1NVWXV5FWkZDQERbRkZYXFtNQkNAT3dKQ1pCT0VZXFhQ38bAwMvKysv19/XKzMTF2dve09DT39RV19PdV1NV3NBQ1dPQUFPQ0NZRU1ZSXFpYWFhFQFpdV9bQ0tjHxNnc3sXc0tjEx9PX1tdWWFPR0tRU097f19XXVF1aWF9ZWV5TX15dX1tAQE13dnVMSnRIRllERFHf3tbdwvXKyvDy9srJy8LF3tjb3tne2dnFxdPVVd3fV1NQ1FBbXlFUWUZYXkFLQ1laQ0NfUFNQ19zexMXb2sbNwMDAw8zG2t7e0lNW1NdRXlNVVFhFXVBcQENZWVlFWV9YWlpeRUFMTk5KSExCQVhTXllW28Dd3830ys708PfPwcDG3NXV39PXVdPf3tzR1VXW1FdW19PXUFTR0lRdXV1aT0JaXlpEUtTVXVxV0dZV1tnFxsHAx8TGxd/R09dSXlFVV1DV1tVeWFPVV1tZVlZSWV9QUl5YW0ZGTnR0dEp1S01bWkFaXNbf0t/Ezs/HzPbz9M7K987Y3MXY09fc29jf0t3T1lRU1dfQVVJTV9RQWFpcWUp1R19EQF9UVFxS0d7d0N3EwcbFx8LMxtrF2d7XXV5TV1NSUFBXXkBGXl5BWFXQV19Q1FVZR1paRk5KTUZCSUNDQkNBQURTVFTW2MLAxMPI98nMz8vO2N/aw8XT3dnY3dfS393X0d7H2tLd3dHVUVJcXF5DSUJbRkNaXldfW1fS01ZQ0Nrf0sbOz8PBwsba3NVRVNVWUFbVVF5EW19cWV1W1lRcUlZWWEBHW0dJdEhNTnRLQEZAQkFZUVBX0tvGwM3LyvTLyc7JycbaxM3B3dPZ2NPU1NLY3dHf29vUV1RVU1tYXVJEQUVEWkRBWlxTXl9Q1dFV1NDYxdnFws/D2dnb2tBU19HXUlJRVFFbWFldXVlQVdHVU1TUVVNfWUVBSUtITk1OT0BFRE9NRVxYXtXYwsLAyfT1zM3Mw8Tc28bG2tjb2Njc0NHf2NDW38XF09XU1lZYRVhcWkBGWV1ZWFJUV1hbUlBQXl1V0NPS3sfB2t/Z29vf0tPQ11NcUtXVUl1X1FdSVd3d1FbU1VRSXl5FQEhLTExJSk5ARVpARFtfXltd0MXa2MD19M/MyMvC28XBwdrf2sTa3t/b2d/WVdbT3dRXVNVXWEdaXkVCR1xXXVzX0VRfX1JTUlhcVd3S1t7Hw9rc3tnZ09TW0NddX1NUUV9SV9bXV9Tc29BX1tDUWUVZWEFOTUZFR0JBR0BDQ0ZFXltEXtXc0dHewM/Gx83Iz8THw8zG28bNwsTEwMbb09HQ3dzR1tzc1l1aRFtFQENbUFNcUNRUWURZX0RPR1JUUVLW2djd0tnY2N7d3d3c0VXU0NPR19bS1lZU09JVU1fT1VhBWFlaQUdYWVtGR0dGQUFaWV5eXlNX1dfU3MTCw8PP9crAxsLLzNrbwcbe3sTb3VVV1tdVUVfQ11FcXF9eXlhcUVfVXVNU1VFdUFZWWFtdUFxbUdPc0FXR3dBXV9HT0dXX09Ld1tXX1NHX19HQ1lbU0dZTWlxSUFleVldSRERHQUNDRkRHRkZFRVteXNXc28XHw8PAxcfL9MjCzsjIwtvBw8Xc0tnT1tVX1lVQXVxcXF9YXlFWXFlcX11fWl1XUFlEWV1cXlHc29zQ3tjS19TS2N/R0Nnc0FRW1NTVVldXUlNZXVZRU1hfU1BcXFTWUUVEWV5bR1pfXkVCRVlZWVLW38Xb2sHGxN7Zx8/MxcXAxtjS2cXb39TQ3dZVV9TVVFNR1VRUVtXW0VVSUdRVU15dUlxATUZERUZY1ddUU1HR19XX3cfF3d3e39NUVNHS09PR0NFVXF1QU1FTUFRUUVBX1FVfRF5eRE9DR0BJdUlDRFpfVdza2dnHwcDEwM7Ly83Czc3A3tvBx9nT39nQUVLV1VNfUlBdXVtfUlBXXVTVV1NeXlpEQUJHXlNTU9Td0FdX0tzT09jExMXd39/Q1VfR0dfUVdVQWUdFX1leXVFU0NdW19DT1VdXVVFFQUZATU5ORlhFWlHW1tfX39nb29nHxsfFxcfHxdnbwcbB29na3tBU1dHUVFfX0NBXV9PT1lXU1FZeREdNQ0xJQVpbWF5TVldRUFXS3t/Yw8Pa3tnaxN3Q2d/d3dHX1FFZWVxcXFhSVlFRUlTW19BUVlZcR05PSUlIT0FFW0dcVFXR1NnFxsDFzc/MwcfDwMPAwcTY29LT09ZVUlHVVFZQVlRUVlLV0NHU19NVXUVaRUZGQFtcU1JSVVTV1dfc3t/S2cTb2NDR0NbX1NbT0FRRV1ZdWV9cXFJTUdTU1tTT3tnZ1tLWUFlHWkRBQk9AQUFNR15eWFlV397e3Nvb29jdxMHGx8fCxsbZ3tnT0VXW1tXWV1Xd1tDc0N3Y1tfSVlNGQ0FNTUhOQkFGQ1lTUlBU0Nna2drAxNre2dvY3tHc2dPWVNfWV1NcU1JRXV1XVNRWV9ZVVVFVXFxcR0RNQUNJRkZDQEdfXVJR097c28XEw8fFx8PNzMbbxd/Z0dBV1VVeXFZTVFJR19ZV1d/T3dLW0tVWUlxdXkRDRkRFWFhQUFJWVtTT3t/S2dnb0tbe09HU1tzX1VHV1VdWXFRVVVdU39Pf0t3Z09HU1VRQU1hbXlpBTExLSUhOREdEWV9U0N3T39vY2NjBw8HAzc7AxsXf2Nzd0VbRVdfV0dzS39DT39PQV9RWX1tHREBOSEhCSUJBWFJSVFfR3tjb3MfGxsfbwcfc0NDe39DU1dJRUl1R1VxWVtXQVdbV1lXVVV1RX19eWF1YXkBHREFHRl1XV1ZR1t3d097Gxdrf2cbYx9raxN/e19HUUFFT1VdX0dfc39nS0tne09TX0VRVXVJcREFPRkJCW0VQUlZUVNPQ0NPQ3N/S0dLc0NFV3dDU1FfU0VRUV9xQ0MTSwVfe3dHY1VdfUFxcWUZZWURCSEJCTk1HXVtfX1XU1tDXxtrAxd7EwMzAx8zBxNjc2dDXUdXQ0dzT39ze3NLb3dRSXERRU1lbQUBJdUhIQEZFXVZW1dHd39/T3sDFxMXYxdrZ097F2dBU1NVXVlLX11VUV9bWV1ZX1FZcWkVeR1taWFxbR01BRFxeWdbQ1tXU3tzT0NnF3t/d28Ta3tnY3NPXVNdWUFBT1tfT1tPf3d7T3tnT1lZWV1FTUFZcWEdDRUREW11UV1RWV9dVVVFV19XXVNHT09PX3N7Q1NTQ11RV09jc0tLYxtjT0NzQVlBfUlxcWFtZQENLSEFPTEFZUFxZWVDVV1fU2dnd2djAwMHAws3F2N7a3tfS0N3Y3t/S39ne09bc1lNZRV5aR0RFRUBNTEZGRl5dUVZRV1fW0NLR3dvf2NzbwcTHxcDAxNnW09VRV1bW11ZQVtVWUlJRVlxeWF5SXFlbWFhaRFtdUlBQVtdUVlFX0NbW0tnb3dzc2Nrf397Y39DXVddWV1dU0NfW0dDS0NPR39nQ1lTR1lZQUNVTXV9fU1hZWFtfWlleXVJeXV5QUVHU1dLe3NzYwcfY3dze0NbT2sTY29jZ0tfQ1NPRVFdTUVtERkJBTkxOTUZDQ0BaWF9cXVVRVNXR397Z2MfBwc3BzM7BwsfBwdjf3N/S0NZU0FVXV1JXU11YW1tBRkNFWkVbW11ZWlpaXVhcUFfR0dLS3Nve2N7EwMXGxcHH2t7T0lRWUFPVUVJTUFFTUFJUUVJRWVJdWFlFX19eWFxWX19dUFdQVFXU1FTR1NHd0dHQ0NfW1tbT1NfX0dLQ0tDc393Q19DT0N3c2Nje3dLTVFRQUFFdUl5eWkdBTEBCTEJCW15eXl1UVFRX19zd3tnFwMbGxsDBx8bHxsTa2N3Y3NDQ0NBVV19dUkVBQk1OSU51S3VLSE1FRFlZXFdX1dfd2Nna2sbMwsDBzMPAwdrHxMTb09PXVVZRVVRWU9XVUVNeUlJYR0FYWFtERkVER0ZFX15cUdHS0tzS2trb29nEx9vZ2cXF2Nzf3dHWVlBTUlBTVlRWVlfVVlJTUFZQU1lYUFJZWl5cWFhaWVldVFfU0NbX19PX09fX3NDT1tDR3tXU0NPT19bQ3dDQ0Njf3trAxMTD2Nnf3FFeU11eRERaRkJMT0JMQEdbUlBRU9VV19TX39Pe3tjDwcfFxcfG2tjFxtvZ393W3NnDycVQ3V9ZVE5ATUxBTndOTFtIdUxBQVJfXtZS01TY3FPGwMbaxt/c3dLC0NDawtzc0N/f11ZW2FbQ3VPV3ldZVVBbR0Nf1EVAXVhCWEBV3lFWwcHFwdrNzNzex9rN28HNzNnG29LF1FHE0lFUWFZeXF/f1lLD1FdRU9FaX15fSlZacFxxW3RG1lBVXFFe3NZW3VvV2FRUUdlX1VFUVVVV2NHW2t9X2sVT2MfL2cT1yt/F9N5V1dLX1VxdSUFDdERyQlted0FWQ0dS1HfTwEXRw9vAClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMW11bGF3XzFjaF84a2h6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExbXVsYXdfMWNoXzhraHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDBiOWNkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZzcxMW11bGF3XzFjaF84a2h6LmluZm8KQEAgLTAsMCArMSwxMCBAQAorODE5MiAxIDAKKzgxOTIgMSAxMDI0MDAwCis4MTkyIDEgMjA0ODAwMAorODE5MiAxIDMwNzIwMDAKKzgxOTIgMSA0MDk2MDAwCis4MTkyIDEgNTEyMDAwMAorODE5MiAxIDYxNDQwMDAKKzgxOTIgMSA3MTY4MDAwCis4MTkyIDEgODE5MjAwMAorNTQ2MiAxIDkyMTYwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2c3MTFtdWxhd18xY2hfOGtoei5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExbXVsYXdfMWNoXzhraHoucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzOGYxY2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nNzExbXVsYXdfMWNoXzhraHoucmF3CkBAIC0wLDAgKzEgQEAKKz9DS17l5ur9XFhgWlRq8v5dWFtQU1xba2/j3OXZ2trc6l1UWmBwfNXP5ejk+Hvnz8TEx9H+Xk1GU+vQxcHAyeNpVUtLZtrNyMjIzeRsXl5cUU1odl3r2dfVdFhPQkVWfczFzNDuSEA8PUpYz8DDysvhW0tFUVpNWWlp7G1q6eX73t7p42r1909NUUtXcOnPzdHJz31lTVVkUl7g2930a+xrW+DKwr7K3Fw/OTo/Wc/AubzL5VlGQUVfz8zKxMzqYU1RT0ZW4c3Hy8nAzmhXTk9bYNrR29Dab1dLSVts787Ix83g43dNUn3ifF5WXVZITFfz2ePYzOpfYGNcVE1YWk9VS0pTVV79YFdw7u5kV+7fXV1fV1lo4M7Lzc7a6lVBSerOx8C/xdNoTUZK7szAvL7Aw89rT0xPUlzZy8zAvL/G6lVOSkpKT+bS6nRfTEpOXuff2Nf3YldIQ01i3c3R3OdsU0ZEYdbNy8/vY0pBRUZMaN/MzXdjXVRSUkxXberkbGbp+F1WSVD02M7Hy9ZwUVFIQ1bWxb3Fz9pmTEI/TO7MvLu+v8LT/lZVYGbp2Nbf3ebY1+5p5eFzUU5w8u7e3n3ucnn8dP7d3d3/WGRneNnP329XXFRHS37MxMvk+11IP0JHUFnhzt1xY2BYT0dJTE9QTkpLSlJfTEpS8tvn/tjZ9F9RS0tLZMvBvLq6vMlgU17uxby4tbi+xfxPUlvazNvW0vDn6eLXcltuV0pLTmrmYlVcWWl6X2xqVVhUSVJn38jP19FxU1JITVRezcHIy9htWj85P0zqycrO31dKQz9IYffV1XFeVU1RT0dLSFPr7ePLzMvcT01RYdLMzcbR6n1UUV35zMLAvsbKyc/pbHXm2Nng49fT1er0397e4WZPS0pVZurU0MrBy+VsaO17X1hTXvJqZe7d3XpPRj9FX+3QzeFeTEE8OD5V+OnuX1heUUxHTVpldd7T0s/Vc1hQTWLfzMnM0c7g/vNbddbY3uTZyNHzb09HTFbfxcXDydZuTEln3M7Kz/NlZ2x95Mi9vsvbaFtUTFJ65c7Gv7zH0tV1TklHXd/Vz+ZcVUdAQD1GWfjweWz7UkI/Pj4/SWLf4e1ucUxEQlPn2dHO3GNaUFRUatLL293h0svSzMzX+2Zn5f7eycXI3GRgZl33+OPg6O/ucX7x725bW2BubW9+bGJ06c/O39zfZlNKXc3Fvru+w8vXztHXzMvKzNDJwsjO6VBAPUZo3c7EwtZLOzY5PD9LVU9MQz06NjpDSVd6/fZkUkk+PEFNcOLZ0dLZXUxNVmbv4tz6WVpcbePj2cvO1uXu6XlYUkpNfdTNzs7LzXVcXHLYyL68w+BiVVBT/M29vcTHzMzHytnh/tbMycC8vsPO4Nji6ObncmpWcOHu7mhXU05HRkROXltVT0M+QEhXbH5iTkE/PD1HXWFTSkxt59zf/Xp3VGP67N/d3mxQXuT36NjX09DV2Whh9tXKzdrbz+BeWG76eufOycjGzWVJRUZmzb+6ubq+0tzjY/PMxcDGyMTZdHJz39h1dOXe6Obg7UtARkxSV2dXT0dCQENFUmRkWUxSW0pATE5VVVx0XFFlcWJaSUxf4Onm49xkUllu1MW+yN9rd3Ht7OHc3+Dq3M/O4dzwU0VIXevdy8TFyN5fUlZUXGjm5dzMyMzNzNfw28fDwL28wtNtXG3e2enp4Ohz6uZ2XWdZTUxMT09SUUlDR0xQVU5OW1NCODc/RU902NDU7mVbXWzn183W8NrfdWhlY/jazcvf8+ldTERBTmxt6c7N1WZPU0ZBUml94uzax8nLznr65ebEvby2uMHO4dzKzcvBzM/T+ePf++zV3e5ZTmZrXXBeWWNTVmNVT1BDPz4+UmJZbl5OT05ablVKTUpQXF3ZzuB2Y15q+NjP1NvkaWFYS13r2M/V5fRkW/f5YnDufPt75djWdU9LV1df2NPQy8jFyetiVlVde9zNzM3T3Nfj383S5tDN0Nvf+Hv679XPys7c8mhPTVZs7X736WlccFdRX3l63fFpZFtjUEhIRkZq1s3P5PF0TUlYV/bR3eDeV0dKTEpNTVFUXPF+U0Q/QEtf08nd//tXX1lESnR+4tXk6OLQw7/HzuLo1c3Hx8/Pyc7GxMvIx93f1vZfb+fPzdrW3NDV9+3hXvnd6dhpSU9USFBSS0pcbOjwXlxdYVVSUlA/SVlXWlxS5+pMX1dKVWps0NhzV09QTVnf0tHF03RMQEFVa93K0ubn3N3Q7FlY83x+1s7V5fZka1xWYdXV2N5nXW7w1cjNzcrH09zdalrn3+HR1tLHyNlsT09b3sW9vctkVFJNX3Zm3s/p6uxRSk1RXGBZVVJbYFpgU0hUXVJramDa+FBVSD9NY3z0aGBfY+54bN9qW3hkWWhVUWJeYPhfVOrd18/eYmlw3tDQzvhm6fznxsnCvcjT3W3ky8zH0Pdia+jRy8TH1NT/TUhNTmfp2c/M2efd7eR9W1Vk6s3M2GJQWFZY+ux41990XE1KVl1dVE9YW19RSEU/ODo9P0hNT1NRR0VFR0xx0MvN3V1PT1D619vfysjO0NXTysjFvsPLz8rJztbTzcfAw769xcfI3fDm5tbNzM3O4mBUWFZPT1Ndbuzb1HFLS1Raduzt2M/Z9nNZVW3b4GFVTUtNTk5WTU1TTktOTVJVSERGS0RASU5JSEY+PkRJUFNLVfDQyMnY6Ofl1MzN08vBwsjJycfAvr6/wcfEwMPKz9DNy8nGwsfP0eVfU1JNTVRXZWZSSUlQUVFdZu7bzs3eUkRJTVBZZHvf2t/na1BVX2VhZvVzZmNeWFJRW+zf6OlpVUxDQkVBPUBISUZBPjs7PkBJS0xWbf9zZlxf99PGwcTFv7q7uri4tra1tbS3ubm7wMfLy8jHyc7dW0tLVl3s3u/4+3BkUkdITFBVW1774djY43RTVXrs/u13Z3zy7NvtYl5VUU9PTExKSklHRkZObW1mZ1JLSkhKUkhERkJCQT4/QURLUlVWYHLh7uzsbPfe1c/M1dPJy87MzMTCv7u4uby9wsDAv72+u7q8vszp/Ofm4dnc1dfRz+5aU1Zu39XXz9Pf33x4X1VdbV9aXFJOTUxLRUFDREtMSEQ+Ojk+QkdKTE5KREE+PUFQX3J3Z2r37/5qYmV71MzN2OTk3ubg1NPW1NXb3er17tnc2NLS0tHKyc3Y3t3Z0srHx8bBv77C0M/JxcrNzc3NyMHDy9XTy8rMy9PV297gfVNFQD4+QEVDPz4/QD45Oj5BQj8+Ozs9Q1JeV2Bye/ptVU5MU2v67XBu9nh1a1dWX+7Py9jk29LOzMnLz9DOxMDH0Obu93P0++rXzcvQe1plaN3KyMXKz87a82Vk6dnVzcnN0dXS0NnX1s7Ew8DG0NTc3OJsWk1LTk9RVUtIUk5WVUxQS0RBPTw4Njk8P0VDRklFRUZDRklZ++zgY1pmV2jtZmzy5M3L09ba1djZ0ut03NDJxs7U1NbQysjL0MzPzsvW2tLXzsPExMLAvsXVZk5u4dbFzN3d9Xrke/bSzMfGx8nb3OdpaldMUldWX1tJPz1CS1pUR0hCPD48PEBFT09NSUFESkdJSkFFUFJkYlNTTExMTlJUeNXMyM3peure0czM0N7W1djS6+bVzsG+x9HX29zb2dzWycbHwc7e0M7O09rc3dfc4dne59PNzcvT2M7MxcDH1213fmn2clZXVE9aWlBRWWRYST86PDw7Pzw3ODo9Q0dJSUpMRkdKRlfj4t3qd/b3dPj8Xlx23tHO2WxdW1Zu59ze39rqeGtk/NPKxMfSz8vLxsrQy8rGxcHAyMrKztff5eHSzsrN2eBgaPba0NvQzs/K0/docejs9WxdSkhFRE5KSk9TZVtLSUdISUlISUpNT1BcUExVW29sXlZMWFxUV1lVTktOXVlVWV18915RTF3s5tXZ+Wlw7NHL0Nrb0tTg3dnOxsnKzNLQ0szAvL7Jx8jLzM7Tzr6+vLu9wMzKycvN3dra4OVZSEZSUVJaS0U8PD1AST8/R0xXSk9PW2ZPTEFCRkxbaeZbVVdJUk1QWGzd6OxhUEdIXvnY72r8WGZYTlJWdHXc32BXU2hu5N/czc/JyczHzcbHx8XLyszKxsDEyMXLyMrPytPPzs7N4nJs28fDxMnQfVFQUm1kYnttXUI6NzxLUmBgVlZOTElMUE5SVmNaTEtNcmVbXlFWT09SY3Bf8ePa5V9XT/jd2t9oaVFMSU1kXGdu7+NoVk7629zT5t58XX3yzs/Wz8/N3uHr0cfHw8vJydfZ3crFx8bIxMza6dnFwL7HzNR6+Xjt6fnycPBqTkVARUhNSUxbUU9MWGJXUkxWWkxFQUZOWk9LTkdHSlJnd+H7bWpUUU5s1s3Pd2NVSUlRfvH1ZmL4W1ROWt/b1Nvg3evo4tHNysfLyczM0NjJx8LCyMjNy8zFwsrKzs7W5G5i1c/Rz+r4YmlpcNni5eV1WVNMQElVX+F0WlFOT1Xv/WVkVEtISEFLY1pfVkZAP0FCVGFdaltUVVhPW97Z1Nh0XV1gU11iVW/s7vH9VU1ZXtvHys3U4XTo1+Xa09fT0d1z1MrGv8bPzsrLxr/GxcTO19vY48/J0czdWFBQT1nd2drT82VfVkhJWVfv4mFgWExGUFpV/vVrbm5XTFJOWGVOTEtJRkZKR09hXFpWTkdacPbZc2NYT0tKYFtfYlNRTk5HUG3iyMrT2dfS0sPCxcTN0t7f/e/Py8XIxb+/vsS/v8bDx8jO1OZx39jO0OhoVFNNVHJ55vV9X1BJQU1f4tXb42dfU1RjYl9gXV1XV05QYnL9YV9WVExER0hISExOVVZMTWX15fVkVEhGRk9dVlVmal9bW1vhzMfBx9Hh4H341s7Pz9Pg82BPYd3azsS/xcXJy8XJy8fAwsfG1NrO0NLoX0lKTkxg8nRm7dzn5lxY6fDw/uhgUltRY3386+LZX1dQSFNUZXv5YElMQ0NISU1NZGFbUkZNXP7i4OZaX1haaFZPTFddT01GTltg6ePT5eHZ3c7OzszNy9fibmTs6M/Py8zOys7Gw8PGw7/BytTl3ODX3m1XREtKUVps7+fZ09n9bPLTyszXz+9lT09aZW9bdWdPREJBR1RpYXRYTUxMTlBoVmX0+lpPS01g+FxiaFVZWW5ccVtg7nBXTVNXbNbb5uVlX1/v8czEzs3d+19edODHxMzL23Fj3dHOxczDw8zc49fTxsHN03tUTFFdV9/d2954XFb+7NfHztjrUkhIXW/h2t3fblRMW15s4+f/XktHSVdaY/H2e1ZHPj9BTXj0bFdKRUhc8OLd3+xcSkBKW/bS1dTqUkRDVuTNw8TE0vJgcfDmyL+/yNf6aOfSyL6+u7vC0uff28vIzNdpTUVKWGfh2t7kW1BQX/rayMjVd1NMS1nr2dpfT0ZDQUNOZNbO6VlIPz1CVWfp+vdsT0Y+SFnpz91uVlJVUuvQxcbQ2ufqZW7m2c7ZbVZOTEhf2tXW3d/s8vfo187HxtZqWGJibNjQys3V0tLZ693JyMvtVE9OUVbcysvU5+TvfO7m0NPP1GNUT1dc6tbc7FxeX1tcWefX3e5OSkVERk1hZWBcWVJKSE5cXlViU0tHS1x56uXocWBgbvjz5+ny7l5RTU9c68/S4HZrdG5z2cjExsfN4WNf5NTJysnK1NvY1c/JxcjQ3flfTlNX6dPd4ezc2t3Yz8zW5t/mYU1WWWdqTU9OUFFQYWT1429gVU1GTVFU72RTTUtRTFdm6tdmWmNYS0tfctfa+vlhbe7PytLL1upoT0tLWVl74WNYUl5u/tnUxcrg721iYPDe1s3U3/j45dTMzsvL1t/x8Hzo3tXJzeFibuLW0M3Hx9Lra2xbYe7c0uJoT0lMWOvWysvXZ0dBQUZUV2JdTkI9RE9g9PHxZk9LTlpTX3Dy8F5PR01o7tfZ4dzmaVtjYPbpbnZfVktP+tvKxcXH0ev429TQxsXDyt5qXu3ayMLIy9DhbGBlZOng4OtiUEpV99DJzc/bfl9d/P3f3fH5VUpITWbn0dXd+F5ZUltka3NaVk1FQUNOZON9ZWVga23p4Ojk7ulnT05QZ+zSy8zQ4f9mZG325HhlVEhEQ039zsrM1exnW13139ve1+FbTk5k8tXLy8vS183PzcrIys7U3uTo4dTLzuR+/mVn993Nzdru9VpMTVFr39fZ2ehZV19VXGJhU01EOzw/Q1T+YlhdVE9WU2/e6315aU9NWV/019/38FtPbe7g0svU9mlPUFlW+tHQ3uDd3M3MzMXDzdvZ+V1xdvDTz9vZ1OHaz9LNzNDf9GZXYV1Z7tj6XFlUWn7o1MnN7XdiTUhLVfDY5NzY6W/19W77/FpTSD8/QUJDVlxSWV1s5NrSy8vX3N7i5PX+++DqY2VgWmjl4ezrbVxQTU1PT01e93hnZG7l5+7czs/f/nBfVlJWfNbX3M/Mzs3LxcXKz9bUz9PZ3+DZ325faXrt59vb3O5i++DrcW7w8HRjauXt8OPY3nVeT0xJRUVDRENOV0tOVVx56e7s4nBbZGRdT1FdZm1aXnBlae7oevB0VVxzfOno6dnT2N3QzcrJycTGy9nm2PZYWF1w629m5uDj0M7Oz93b2dfe7O1vXlZVVFhhXHrq797a72rv+Gpzc/PseeHm/G733uPwYlxXT0tHTFFNVV9lYVpf7vJjbfHt6eHe4P1qXVdWVWb58OTn73v6XFZiYlxaXV5ZYu3k3+Xa0tDLzdXx6eJeWFdu6+z0/t7b1tDRzdLT2NHL1dvW0+VsbXP482d+efnwYmJae+b56uvofunget7q6ubv7V9XT1BPRklMTk5NUExOVFZlZ2/37u5u5+lvc15WT1FQVnNo+fDe3HloYHrf3t3Y1dPV1+LWzc7LzM/X3OL8+X336Onf/f5+bHVrYmjt4OPo9eDccGVeWV9cXllUW2JjcObt39/j0M3U2Nvg6fVw6tbU4u59XU5JS01ZW1pgX1dZXlxcbXHx8Hn2cnvr3+D4cWtvaFlTUGdgX2VdYV5gZ21xaHNlY2508eDV2NXU3uDtcv7h1tnhfH3h3ubf0s3Lyc/W0tbSzM7b6O5yXlhWYXJpavR1bvL08+zd3t/oaF5z+PPqemp6allWT0tPVlNQU1JPUlJNTE1VaGJYXH7u8Nzb3+tvYGFjZG1zcWdfXm7q6/Hi1dba2+TZzsnHy87O0OB6aGVs+uxxXllidH3t593X1dff7Orv8e/l293neWNVV11WWlxnZGB27erm2tDS3O/n3NPU3+l9clpWVFNaYWdfWFNRUlVcZGR+7vRwWVhq+Obp3tbtXlpfYl9jbXJZVlZTT0xOWXB56t/f3NnW3+ff4eHm+nvo4Onm5uv5cWnm5/Te0s/Vz87Qz8vIysrT43pXWl9lYvbxdfZram137ufY1uDt7eXc42zo3mlbYVdLSUdLTEtPT1VYWltaW15WUlxZUmDy6NvU2/xgW2FtbHnj4+b1a1tVV2B36Nza1dLX09HUzs3S1NPf6317fmpjXlhabfDq7+3vcGZy7uzk19PV1N3qe2hraHV98fHo9GBbWV7639HJy8/S1Njc7urg4epxXVFLSEtMT1FVVmBbWGNcXGFpbHnv3dXc625iWlBSX3Jy/G1ha1dUVlBOWvfe2ePi4eXm3+Hd1tTT715lXGru6N3W1d3i7vtpbXvl393T0s/V187U2eH5dX7q7envfvx2Y2JsdOTd2+b18Xvm29/y6N7fbFdQTUhESExNTlVZVFRRUmFkdX7q3OJ5/vB65/BwZV929npo+exvZ1lkbfDU0NHR3e7b5fbh3dXP09/ld2ltYmx08+5tYWlhWWZibuDo5N7jbG119d30fPji5/vt7vf15flr/Hzr2tfW1eLb0NTS19bW3OZgTExST1JfbG9eVU9VU1hiY2ps+n5iX1labvZ2aF5aZWNfYmZre/NzX2B3cGPw6Hr14NfU3ODY3+Xn6/Lq7fPj4djiY/pvdu7w5erq++L5c/h14tjU2N/99+V84e185ert9P9r6ubd2uHd397o7nb+7l1gWFVTTk1NU01TTUdISE9YXWX59uzd6dzh6dfR3/xnW3JoaXZ1bG9uXVtXXG/43t7Yz83Rz87a09bg7ndpc25ddOvv/mFaVlp06n3u73Xl5PH4+/jf32teWVp27fDo2M3N3ejzb/Hr4NjW1tDV39zf6+XxYl5dWFZPUFhaWlpTUFJaZVpSWF9gaGRkceri2OBjWlFTXF9leebj9WtgYGb06/Tp3+fw8+/d3efWz9TY2uP1c2/n2d3kcHfc5uvwZ2v5+uju99nR4OX8X2Nrfuvt4tbf7uxdVGFbZ+rcz9Dq7OXr3dzo5PVxfVdNUUtLU0tJS0tRXFVYUU1h9O7i39jN1NzV8mVsXGLy9+TccWBfWmJwfOni3NXn69nb08zX4NXW19pnWFxbaPL2bmp4/21laltialld6tzUz+xybFhYY27629Xb5ujh5Nzl7ufTzs/Ud210dOrc3fHg91tcXFhbal5ZT1VeXVlTUE9TU1thY3d0aHN7Z/fvYmFr4tHY9WNXT1lbbOXn2NLodPnv2NHQzs/Lyc3e5v1x8/Tg4HRseFlXdnp++GhdZuLU1eXn6HtlYnzq6NvS733ta3n6a1/n2trZ7H5uZ2vw3N3ybGRPTFVTWlxUVlxSTlFPTVBYVVxfbG/t4fPp3tve7W9v4eDd2e9iYVxVYnro3tzb6O7p4N7W1M7Hys/N2P3ydWVpam11ZFNVWmBraWJdXnjp9d7c+OXwcGVea+Le8tza5Onp4d3Vy8rV1t1pYl9la3L8+l9OVFRQWGp3a/3l7VlWWk1OUVRQUldeXVhjZV1ieHhw8NvT29jb635qZl5sdOPlffTq/mzs2dXOycrS2uTs5d3c2tnd2+1kXWpiXHl8Yl9y8PXu7uj+bXd2YV977Xl+5evs39zd2trq9HJaW1pm/Ofm3NThblpdW1hkenZxbV9cTUVJTE1RWVlcWmFtbX7t5uXd4d/c5t71bGtfWFz37eHf3ONxd+ri6tTNztLb0Nz79eHi6Njc3fX2bV5obv/83+L8amNuXFhdaGFi8OLrb375cnrl2t7f08zU2trpbV1mcXvk1Nz2/19UUl9nYf7m9lpZXlBJSVRTTlx+a1VUVFhaXV5db/f1/Ht5aF9l/nNl6NXd5+Pk6O7j3t7bzcnN0dLQ3eXY1tjNzdjZ7Pv+ePP/ffjj9mZbT09NUmhlbN7U2uZ58eT+8ebj4NjX1uRhX1lWW1lf8Oj+cGr+/mpzbV575e7ubVhUTUdNTldnZmVeV1RaaG9eY9zZ3NrpcH5gYn5oeOvp7fju4N/b3Orh19PMztrf2+bf2+HWz9bm7en8aHVqVlp65uN0XllPSlNYW/HZ2ePw9fzr3el64c7M09bX429m+mxm/u3lfnDl5vVwWVNVZ3p1Z2JaU01JR0pSWV1UUWFbWFxYVV3f2Nvq7WpaVVpdXPnZ2PXr0dfa5efx69nj2NbV1NPV3entz8nN1NbKzdHhc2dj5/H9a1tYTkVGSE1n4dnZ2tXb4O/8eeHP1d7e2+1uVVNSUG5+ZmT/2+DscmJVWWhkaGBZXWFPREJGUVZTXnR5aWllYWPw2NXQ097vb1lQVGjd2t7d29Xa3XNld+vX29fOzc7T3nppaODX2tPWzc3Q4HVrZ/1pa/tsW1VMR0tPbvnr09jZ6/JuaWroz9rY09TZ6G1ZXlhk+3Ht79/f7GtdWFZkXWBrVlZVTktMTFlkWWBlW1JQT1dZaN3g1M/kZ1hUTk5P99nl29fT19vsdHR+29fOyMvLzdfr+Hzbz83Iys7Pz9n+c+zb5+nwYldOSUhMTF14eubo4t7c3eXj3dDR2OV77WVTTEhKVV9m8O3c3eT8XWNkfPbx/mBdTkpFQUlaX2RtW1tZXFpb79zP09TX3u1wXVBRUmdz6eH13dXad2j/79zXzMjJyMvabl9ffuLYz9PS0tznfPDZ09/p52VdWE1KTFJgd252Z2/p6vDv2tDW4OPe7d3cdl9bXGNyfuDb2tnpcFpdbm95d3VmXU1CQkVKWWxtdGNYVlNOU23l4+jt6/R1ZF1eXm36/HF7/XF482lfZ2t36tbKxMPDydbg3d3YzsnIyczR5v3k5OfqdnBlWlVPTlNbW2drX2Fsderr4NDO1tzr9X5rbHpeW1hVY2Z45d/l3fxdZV1XXltob11UTUhLTk9lfHXweWpwWFn79H7o9G9tY2lpXGl+a/fr/Oz38975ZXdqbOPf08fFxMfP1uHz39bVzczQ2Hpw6nF38m1pdGdhXVhhZl5jZVtaYH3e2tLM0dTX3+jvenh4XV9bWGds/uPX2+bx/XRYV2Z17vdzW0tHSUpIUFtbWl1fXFhbYm1raG1iXWRsa3vkc27+a2hre/j48XhrXV983s3Iv8LJys7l3dXPx8XFxcvZ5e55aWfv7PbsdGNlX1ZtcF1hWFRlb/vf3ePp6t/n6d/9bHJeT1hXXH527dnqaWZYVFlbevbqcFFOTUdIVFNcZ2Vv/3Rx+XVy6+9++u/1+eru+npxYW1uZ3by+3J0X1pm8ufRycnGzc/c59zUyszIx87b8PJfbWpmZ2fsen1v+e5ueHJmUU9aWmvo393h5vPs4t7U193ieGVeb3tw5uHqYVRQT1FSZnDs3eBnUVlTT1FaYVNXXlpYVFloZWNpW1NeXVFe+HlsaXNrbf3n4ubtcW5cYvh508HCxsvMz8zOzsbExMfJz9/g73Bwa19h/H16fXjl3fJzbV5YYF1VbO18Xl9eXHvn6PP162ZdWWP8a+LZ525bW09WWVds5+JhVlZRT01RWWBnYmdi8O744+3ndGZtZ2tbX3N6YlZcYmb17eXm6fZgZG7w3tLHyczM0trl2dfSzszO397l6PZ89nns5/BtYe/t/+vu7XVfVVFZYGnv6ez29uzd2NvX3N99YVhW7uDt5+bce2FWVnJmc/TsZlRSTU9PTFBYXFdXVllnZGBgav9yZFRVZ11VWV5WTVhba3Tt2ObvZWdk7s7MysjExMnKzMnIw8XNzdDb7urn7PDg3ePe4e/g2uPm//XzV01NVlpTVVVWWF9o+uHi2uZobWBSVXHp+nL4d19cWVtw9/32X1xYSUxXWlZXYl1aWWVu8t7q5O3r8mFfXmJlYnNdWFhYaHXn4/B0Yl5RWP3h0c/Lx8fHycXHxsbLzuLvaWNrW2vz/Pjt3/bs29XV29zn8m5fX1lYW1VWUVdYaunaz9HZ5+r9Xl9oa/12c3l7aV1g9PBsbGNZU1FVWFZbVE9XWlhXYu7wZnR9X2RjXltXV1ZTVVVUVWD63t/z7WpiZWN54dTU0cvGxcXDwr/CycfS6dzc6P3x73ru39na29DOztrh8GJvZlVQVVBJS0hNV1zx39ng7OZlXlxYXF5pYHDw9en2cu3m/WNoVVBbUFVWUUtMV1Rdbe7e2dzx5u544/l4e1tQT1FNUF144+Pf+2xfUFlkY/Hd39jPzs3Gw8PEw8jM0eLe4fLq/Vxb9fp83tPPz8rP2Nny/fVnYF1NRUtHQ1Bl4tjR0d3U7Hjw+Ozo71tu+Vxifu3z6upmbFxQVVZVVE1HSlNJSV93e+bc/v72cWZrb15YTEhLSEhSanJ54HZoZV1ec+TYzc7NyMfHx8G/wL6/yMvM0djT2uftau/ufOfWzMzHy9Ta5XZaXV9NSUNAQEFHUXH26Nnp6f1pbm76d3BdV1tSV15y7vHZ6WJnWFVbXFJOUElMSkpWYfvp1drh2+Lx/HViV19NRkxLUWB6bejdcPN5XvTe3tvP1d3Ny8rGwcHBvsjOzNzn3eZ55+9cYGVe99HLysbJ0NPnaHVlUFFRREBISk5kb3Dk3eLk5v3d1u7m33BaX2Fk8OLn4+xeVlhPT1VNSU5LQkRHSVh7e+Td5fp7dGdmXFVYT0NCSkpPX2z44uj85Orh0c/S0svPz8fGv7y7vb7Cy8zO0c7O2uLe919lavjSztDNzt/qfWZ4cV5PSUdBQEJFTlVXYH1sZerv39Xic337YFthc+be4PB2WE1QT09gYlBPT0hGTVBq5N3d3uZpZ3Rw6t/+VlFPSUlKTVplbPPo/u/f3tPNz9vYz9HPy8bBvr/KzNDe29fX0dbsc3pnV2bh08/Oz9Tc6Xn45N3bblNRTUZGSk1ZbX3y6unz3dHR293k/Op3afv06ORlWVNUTUxNT1JOS0dGRkJMYWzt/nFrZl5bYf3nfF1TTUxCR0hLXGlnceTq/t7T0s7Py8jHyMXAvru7wsXHy9HT0Nja2d/m6Pv32NLPytTe4vFpYGv5e2ZRSkNBPz9ESmf0Yevi63vk2ubc6O13YV5YX/7q6WFdZV5SUFNSVFRNSUlNUFZ0597x8PpqbG3o297ma1NMSUVITl/06np67ujg4dTP0cvP2tzXzs/FwMLHy8zW3ere2+nf82bz6N3YysfLzdvvdnH+eOr5ZlRGRkNDS1zq4trscN7g7N/Q0d/mZVpaVnTt3uR+aVJWTEZMVVFFRkE9RkdMZ+3y8vJVUl9l6tnbelhPRENFSV7s923uXVrd29fKxcbJztze0MrAu7y9v8vc1c/cz8nR9WlkZt3QzMLCxsvqW1pmZnzf/lFFPz0+RExw43NpVk1c49nU0NHfX01LTVJ549bnfGpKSk1TWWVvT0Q+PUZQ8tXQz9PfWFBg59LS1vRYTENER1T35+djWU5LZ97JxsnGz+ZlbdzKv76/xs3cX3Ddz8rQ2XRVUl3q0b++v8PM3V9WfeLW2uhfTEVCSU5+1tjkYFxaXevZy8vZ8FlOTExa79vU3WJXUUhMV2JuT0I7OT1CSWDZ0dhuWV5TUu/Z1+VzU0dHSEpd4Of8V0lSX2vlz8XGy9jl187Mxru9vsDP1NTU08jDzd1oUl3f1dTAvb7F3vPp5PHf1vJjVEQ+QUpLYPBhXkxJU2B88NTX6WZNSlFrY+3gefRdTU1VYnbyZk9JPz5EVGT+09TV7lFXdHjn1Nf1dFVJSE9m9dxwYFdGS1p548/N2Nj+Zf3ZzcvBw8rM2ePf2NHHxOVnXFVdcdDJv7/Ky9Xe39TS0s3pYFNOS0db/97XY1xaVlZg3NfM1nViWFdQ+d/34m9aU1FPU3Rod1ZEPzs+PkdaX/H+YFtcXmvb4OTc/1JES09Oce7l8FlNS1Re5NrRydDddd/Sz8PCwL/Az9zP0cnGxsTP61ld9+fOxsHGzd/q2d3OzNrZ51lEP0ZIU2ZxYVJKP0RKVeDf1+BgUU1YV/jY5uh2X0tJUFbj7mJfUEc9QEZR5uHm6PllYu3wzsrf2PJdSUpUWt/h/vVvUUNNWe/N0szS5Hh23NjKw8THztZ0et3ZxsjIzelmVWH11MTCx87Q1tzOysPCydpdVUlGU2Xp7WJSTUhETV3p1tnfal9bVGrm3tjkV1FRRktba/JsXUtDQD5ETldaWU9PUU5d//Dd2+FiWVZMT2Nwd3pgT0xKT2rrzsvNz9DP1M3Gw8PCyNPO1uLUz8nHxMve4nn22czMysnRztTTxsTDxs7dXldNR0xXU05NRD9AQUtYaOvt8GxeXl153t57bWdRU1dXeuXe52pSREZISVpkXFthVlVx8tzR0Njtdl1cXFJmbF9ZU0lFTVNg3dTT2tjX28/NysXK1Njf+ern7tbPztTd5/Te4NrP0tTQ1tjPysfFwcXO1edrXldRWllTTUpISk5XYX7v7up5ZWp5/+7j/Hp9aWNeX15obl1QSUNCRUZJUlJRWFRVYHj6+OfpdWJXU1RQVFtYVVJRT1VccurXz9HR1czKyMXGxMjIyM/V1dLV1dPe5d7c2tfS0c3Ozs/PzczHw8jLz9zibl5ZVU9MS0NDQkBFR01OT1ldXGJwdu/2cX36/Pl6a3RnW1NYU01OTk5OTVFdYFxeZmr46+nx7Ohral5YWl1aUlpXTlRTV2975dvU3uPW0cvJyszJytDO0dbQ3Oj+/Xpr6Ozk1drXzsjMzsnKxcTFycrK2+hyXmhgUFBXUExOTlNbWmltfm1cam/66uvh3971bG1mbGFUS0lKRUhHSVBPT09YVE9VYGJuZWN5cF5aXlpjXlNZU1NOS1Vdb+nd2tHQzsvGw7/AwsHHzc/U1tbW6HB5euzr4tfSz9LO1NXS08vHxMrPzNvvemRbUU9HREFARkdKUVpiWFlcXGpka/fsfuvZ7vF1ae71cFxRUUpKTE5SV2RjY1hh/nLp69/lbWlcV2Bfa2NdV1JST1VTaurn6PV9/OPSzMfKx8PGys/P29zh/nZyXVxdbunb0M3Ky83Pzs7KycjFyM/V2tjZ2dtrWVNLR0dNUVRdbG90bHDq29ff7fBuYF5aVFRYVlFTVU5JSEpISUhLSEpJSExWX1hv3+prbWBbVVhVU0xOUk1QWunk2NLT19XSy8TAw8HAyMnOysvO19vi/vl+8Prp3tjV1dnQz8/Nx8jNycvNz9fc321XVlBJSktJSlBYWGNgYmRka2Zq9PjycGxoXV9eXVxdUExRT05VV1ZaXFpaVVVZW2Vq/+jp6+fv6GxaVFRQTE9UWVp77N3b3dzX0MzQ0c3Q0NLS3OHi4v3r3+z86+rn7mrp5d7b2d7X0c7HwcLIyMzN0tPhel1XVlNVXGteaH71ZWlfZ3rtcXLw+fx5cWBZUVlWVkxLSkhMTUtISkhKTk1MU1RWW3B1dnNvZ15eWFZTUlheXn7l5t7Rz9va2NfQy8nHxMTGxcfJz9ba4nxtcm196dze29PS19PV2dDPzsvKztbT0tbd6vpfVVRXW1ldVlNVW1hUWl9XX/N3e/h0ZWVaUUxNUVBQT09UTk5VU1VZV1RcXl1o+nZrdGZeZmBcXFtdX1lccXJx/Px+4ODs4Nna39LNzMrKzMvQ2Nzb4vDuZF5kZmX37uXY09jTz8/OzczLy9DS1dLX2Nzm5e517d709vtxZmdbXF1XWmh57d3i7fb6W1VQSkRGRUFITE1MT01QVlFRWVZVVE9ZVlRXZmBYWWFaXGlu9Ovrbnnz8ufc3t3bz8jKyMTEx8nJzNPV2d3k6Onl5u91e+fo29bUz87NztPX1tjb4d3f6efl6Hl0c/52bFphbFhYWl9aXF5cXmRy7uf+e2RgXFZQTEpKTE5QTE5SVFheX218b2d2b15kY2NrZlhYVlRab+Hl7PF6cfN4eHp+69zQ09DRzdDT1tfc6OTl9V9qePhuZl5v7uLTzcjKzM7Lztra2eHa0c/S1dnZ2NfV4Opucfzuc2Vk9/dpc21sZXd4e2xiVllYT0tJSEVGR0ZHTUtOUFNZXllWXF1TTlRVW1lXVVZWaW/q7eff++3m7PTp5NTOzdDMycrNysvP0tnQz9Tg4+Do/m1cYWn729TQz8nMzszR3uPt8+zs9e/n3dfe3d/vY15mX1taVV1nX1dcbWBqaXhqX19gXlJQUVBLSUlKSlNVaP1mdOvqYWFjXFZZWVxZVFtsc/Ps7/VuePnzaWRu5vLd293d3dPOy9fU2Nje3d7e5vVweGtYaGZ9793UzcvMzMvV3tbT1dTZ3tzbz87L09TU3+bma19qYnL191dfbGRs6X1jYF5fXVhJS05MS0pEQ0FGTFZYVWFdWVtYS05OT01RTUpPXGP/5/7xdP905f937t3X0NPZ0M/Py8LJzcvJzM3R3d3c5/jwYltj7NvW0s3Mz93b2fXw4d7q39rf3NTf09Hu/f5sX19fW1plYHNqV1xvan3uc2ZiZVVdWE1OVU5MT01LTE9QZnJscmRYWFpWWllVVV5XWGFjYfvtdXtvaWv4b3nx7PDa19vSz9PSzM3P0dvn3N7r6u9nX2FhZ/xx7tjP0tDR4NrZ2dfS29rT0tLO1djQz8/T0+Hl6un06HljbWljeuZ79PDsaWhbUk5KSUlJQ0NGS0tPTlVcXFZcVkpMTk5KTk1OUFJRZGFdZe55ZvPu8Xl889nb2tTKy8jEwsLDxMrGztjc2Onx7u5sb25q3Ofg3dpxcPHu9+7z7NTk5NvV6NzX2d7d5uza8vr4cmJ1a2Rgbl1y3Xvp9mJUW11VUlFKT1RMUVRQT11mcf5vVlxgV1lYVFJWVlVWW09dbXL8bWZjb/f38ft43t7j2tPV183KysrR2Nba6fF4Zl9iaWJrb+7f29jX52tq8+Xu4N3W0tLPzM3W1s7P09DOztHU2d3m6eLd9XTs6u3q6PhwVktMT0lESEpKSUtLUU9MUFpWUVROTlBMS1VSUFVXTVFdXmBpbHf1d/Ht6+/f2dDPzdHLxc3MycrMyMnLy87i49/zeXZrYH7p4N/na3d0X1heVVZq++Hb3/zb2ODt6fne2NPP0d792t3f3OZjfOvt6+hnYGxXVFVMQ0hJUFRST1lcW2RsV1JeXGxmWk1WWF1v/VZUYmTy+2tu5XD37HBYbe/p2dfZ1M7W0tTb9t/Z2NjgdmxkXPr0blx0/N3U3e7t/nt9bV5VX23f1dHa0tPS09XZ1s7PysnM0s3NztDO2PP37vb9+mtpYlpNTUZAQEdLTE1OT1NRUlVNSktQTE9OS05UUVltW1RWXltz5N7d3e3r4u/p2tHSyMbKycvU0M3T1tTc8vR8cnz08+bxdvfp6ODZ4efzX1hdVFNdY2ns2+Hd4+fe19vU1uDf19fX0dbZ0NLg5fdxbe32929ZT01HR0xNT1ZdWF5pYl9rYl1dVktMUE9XY19jdWhqZGhec+3q5OR9bvl+9unb4NXT1NXU2uHc3+ru+11XU1lccGpneW5r6t/p3dne9PteV15kY+/h5tzX1drPy8vJy83MztLPzc3NyMnMztPf4eL78PtkUExGQUFERkpMTU5MT1JXVFVXVE1MSEhISlBZZV9dXWBca/fg4tzb5PXu6+Td2M3LyszKzM7NzdXZ4PxnYVpXanr+7utwcP7x7unp9HxmWFRRT1RfZGl3eWtt8d3R0NDQ0dTX1NDR0szJx8rM0dnZ3dzgfV9TS0hITExOT09RVlNXY2tnYGNdVVJOTU1PVFpfYGBfXm197t3i4eTu/Xrr4t7Y08/Q0djc2Nvk7HJeWlBOU1hXYGVmcHxweOnn5u/uc2dcWFxqdu7u7OLg3dzPzMvKy8vJzc3MysjKycfEyMvN0dzf92JUTEVCREZJSktITE1OTlNZW1ZQT09LRktKS01QUFVbXXXm6N/W2tzZ2ePf3dLNzs/Kx8nLy8vO1+HifmRaXV5aWVlXWFtda/Ty5t7wd2hnW1JWXmVmZmxlaHX02tfX2NfU1NTOzcvJy83My8nJzMzN1Oh+XlBOTEpNTk1LTlBOVVtdYWJZVFJQUVBOVVlUVllbXWb849vZ2NXX3N/b2NrX19nV1dPN0t3a3/hmV09OTU1OUU9LTE5PT2B69ujz+/piXGlkYn7q5t/f3NjV1dLMzM3Ny8/Nx8TDw8nLys3Pzs/U2dzfeFtSTUxMSkxMSEpLS05XWFlYUU1NTElNUVNYXFlSWlpbcunq3Nfa19jd2dHU1NTV1M3NzMnKztXX7GltZ1xhX1laWFRSVFVYZG1iXVtYWVVPUVNUV2JiYmtz8OLf3tjX2tvUz87MysvMzc3Iyc3MyMzS2+Xqel5aWFBMTVFPTVRgZW1nYF1TTlNRUFNZYmZdXWxwdnbj2Nna0tDV0NDPztbf2tzf3trX2Nnc8WBbVlRRTk5QTEtLSUlNTlFYVVNUU1RWVFtfZ2ZhZ3t1feLc09LPzs/QzcvKysnHxcfKx8jJyMnN2vFvc2JWVFlZUE1LS0xMTllZUFRZVE5RU1VZV1ZZWVZda3D82NHS0NDPycvOyMjKzMzOz9DNysjN19nb9GhuXltfXFtcT09WUE9UWVVOS0pISktPWVlNT1lPS0tOV1tXZWpmdOze3N7Yz9DRz83MycnFx9HV2Or9Z2nu7HtxdGppXF1oamz/dXdlYXN9b2hhYGZbXWFo+tzU0tTY1tLZ1c7Kx8zNys3QztPZ335x+l5TWFlaXVZRUE5LTE5OUF9qWlBOTlBUT1lnWVZnYllYX3L6+3X45f9y593Y2tnh5t3Y0MvP0s/S3nNfUU9YXmtvWVxrZlxdbnFoZmBeYVxgefBtbnhdVFRSX/js3M7MzsvL0M7IxcPExsjEwsfExs/S1OHq/Wx84+fy+2RWUU1LTVJTU1pRTE5KR01NTFBQTkxNTE5RT05RUFJWXGR+2d3Z2+ji2+fi4+fp5d/v+GhjbH5sb2lucXfv5Nba3+jtbnBvdf7u6uPbfmJcYWVyfeje1NLPzM/OzsrNzs/NzcnKyMrR3Oz5WlxhdfHq8eDn/WRfZ1dTUlVTVFFVWl1TXXZeW1RTWV9dZ3BrWFxeUldaY3fq7e3e5Hbl6mZpZGZtYlVZX1hUXlhNTk1RXGlkeeR5YH10Z/9zeeTh7eTnd2x7a371++DWz87JxsnLyMzMzdPPy8zRzMvT2Nvj3d7h19PR1tXV3d/pcG9fVVlcXFllaGhpXlZTTktOUVZZY1hVVE9NUU9NVFRdZ3Jr93VtYmNdVlxcYmt2bvP7cF9mW1hmZHrp8Hjye21ke2VkcW/y4fN3/HBsZu559urr1svO0dDQ1tnV393b2M7K09zb2d/i3Ojn5ujf1+r54uFxbHFse/jy4dTf39jY6er29vx3de3ec2JwcmZwa2BdXmH062pdYl1QT01JSElKUVZPT1ZVUVJQUlleYvDwamBrZl9fW1ZXXF99+nh47PPv7flx+u7l2Nfa29je3t7i6Nza1tDQ1NLPzsvKzdPS2dXT1tzb6uvk6XR37vPg4eLj3eHi7vdgbHdt/HJnePhgbHhrXGlkbfDt6d7rYWJjYlBRT1FXWVVZVkxPVlJNVlVndnFu+HRncmtgVVxcX11oZPh1Wl9uZ2R1bvb79/XsaF1faWVcX2Fldfd93+Lm29fm6OPd2dbU1M/a3d/X1tfS0NfPzszJzc/Rzs/R19/q3N/f3+js4dzl6d/m7dvg4u1xanBrXFpgUk5QTlFTTUpLTEtNVExPV1lcWU9OVlpWV1xQYmxtb2ZcZ21kZmlmXX1v7ubwdfNubG9+d2J9buPb3+Pa493c3PZ09//a3ejp3OLc3uP19/Dm1NfZ1dHZ2t7f6OPx6Njh49rb3dbX2drZ39XO1tjZ5Ofo+XBna2fx7WljZltdYltYW1ZQXFZQVVdRWFhXXF9cWmpsampsYWhnYl9bVldfWVlVU1JYWFlTUFVbXl1kY29qbXJ1amNx9ezn39zY3NvV0tbVz83Kx8nO0NnX0dbe2dXXz9HV1tDSzc3X3NnZ4Nve3Nrc6uTpeH7r8njwbmpxY1569mllX1RSUU1PUU5PWVZPUFJRWF1ZX2tgY29hXGZjXmxsZntuW2BwZWFrbGd0dHfxe2VvfWBZWldWXVxdZl5aY21mb/zo5N7n4+Hp7ePb3t3b2N3V08zJy8rGxsnKzc3QztPQ1d3e3Nzh4uHc5+Pu4ebw5+Hr/frw+WlwbOjreHtsYlxaWlhWYF5rXlNTVFVSVVJQUFNOUkxLT05QU1RRT09UV19dY2ZjZGFnZmFiaW/ua2dta/bt6/f8dPvt6/P37+nk7+ns6eLY0M7Ozc3Ozc/Mzc7OycnLzM7Q0NDVztHa2dLX3uhzbHVwYnJhWFt2dXlwaGZsZ2F4bGBkcmJeXFpcaWNfZ19YYHh4+X19fH1mX1hTTlhuaF5aXFlcVFVWU09cYF5XUlZUUk9OTU5LV2RnXWRkZWtu9+jj5dLOztbW1dnb1tfW0tfPy9DX0tLOzMzNzc7Vz8/W3djU2Nvb7fDs+N3W3NrX2dzf4/N2cG77/2lkYmVcV1NMTExOV1ZTWFhYUU5OTE9Xavh0a2xoZFxdY19n+ebo+Hl9bWxeXlxYVVlbVlFPUlRWUFdZWFx37+99/evi4OjY2N7h2NrX19PMyMrNxsnM0M7S0tXSz87obPteWmX7/ern5N7hcvXmfPzh2Njd1tjS1XV46fLs3N7e3+Hu2edZVVNPVGZsZllcVV9RS1JWT1NbVVpTVlRuV1NZYltZWFVVU1dVZk9NT1BNV1xeW15kXm5gbnlvX27v6/Tf1tLO1dPOzdPQy8jJwcDGxs7UztPWzc3Nzc7S09HX3OTq9Ojo+vbke3RsWF1pZ2rp7u/m63v0bVxdZVtcfWNcW1xWY2Bfef5iaPJ1e3JmWl5VU1hUTFBcU19lZ2BoXFZcVk1SVE1RT1BQWVRWZVdVYWll9+/xfO58797u9OPd39DS09nU29nS4NrOy8/Lzc/W2N3W2ezg1M/Wz8/S2drh2djc29TR0szPztXb69/g9Pzq93b2Y1tVU1ldVlBPVlJRXlhUT09OUlFPT1RUWmReXVpbWWVtXmdtWmRjVlNOTEpNTElKTk5cZl5bWltadXRodPDx1dLY2tna4M/Q0tHO0sjGy8rKztTK0dPW3unZ3ej6c11b8v747ujs19/z7+ZnduPn3ezg4NjZ4OLea3Xd9P36ZmH+Z1dfWUtVWFhpW11gZGhYZ1tPXl5hXVNbYGt3afxiWF9dXFRJS0xLTExPSEhIS1BPUl1gaWhse1tdYvzk7OHY1NDNycnNycjExMjIycrJyszR3t/m29nX19ne4eLq7WxydnxudXtnanfo3d/i29fd5uHrY1xdWV5YT1JdVFptYV5cXFtnXFhTVExRXldQWVZbb11n/XBYa2VaVFNNU05HREVFRFRdWldWT1laW1lkWll48erk6evZ2dLOyc3Lw8DCyM3PzM7O0M3VzcvLztt5/fF87/j7a/v47O55YvLh3NTS1+LV083Q2uvp/3vo7W5o8fDc2PBgaV9u+m9cWmRlbW1WTldUYv9tVlhiXV5ZTUlGQkhLTUhKTUpLTEE/Pz9FSkhIU1laWWReYWvx18rP1szJysrFycrIwr+8vr++vsDBw8vR1tHTzd7l4/Nfau1+efvj4tfk4+Tlfu3ndGhy6N3T2tvZ2+fe4/JlZ2trdGJseGtiePlxa2pmbnJpb2pjX19ZWVlZWmRranBmX19cT0tISUpJR0VJRUBDR0dMT1lofvjs6/Dz8Xj64eLe0sjHwL6+v7/CxMbLzMrO083T39zU3Nrn7uHd4NjV3uDq329p3u3xz9XOxcbKxMXM0NTS29bk3tpsVmZdWVxVXWlvZfJ8WU5OREJBQUhJSk9gXltZZFtbVlJYVU9NU09KSE1MUVBNXVtYYft1bH1xYWhmduXp6NPMz83GxsjEx8XFx8rJyM7S1tnX0NvSztPZ1dv5ZGJXT05NV1haZ+Te4d7Y4d3f4NTQ0dfQz9nd3N/V2drP0dvo3u1oYllNTUpHSkpKTVJNTVdTTE9PU1hYUE1QT09VVlRWUFBUUk1OTktKSkZESExPUFZj6ufj1tLT1Nba1tLRzMjHxMC/v8DEx8TFy8rL0NLR2/h5Z2n29md6+W/v6fJ48O/s4+x66+X7e+zx4OHu59zb5N3p6vP+ZF5TU1JVVlZfXVpgaVpYUVFOVVBOTk9QVllUVlBQTVlPTFJUTU9PSUlJSEhUTk5aYFt47Hv+e2Jk5Gxo7+vv0NDWy8XIw7zCwL3AycPJ1NLN19XS3M/P2d7e+3rvZ1lsblxyfWd24urZz9PSyM3RytDf09Xr4eJta/lZVl9RSk5MS1VSSEtNRUlMR0pPTU9cV09bXlVoa1BYZlpWWk9NUkpIUlhRW11bXGFVUlxXUF1pYuzq7+DT2drX2drPz9nQzs7TztPZ293r2dfl393e6dzl+fd2X2t+dXns7+3Qz9XMy9TNzdfY1dvo2Nfd2Nzu3Nzt39fg9u1pVVpSSlBXV1VORkVKRUNLRj9FRkdLTUhIT1FPV1BPX2Z27uft9/N8eOtzYX7g4eHt6+fn49zT3Obk29ze6enm19jX0djb1M/T1tvZ9ez+9nJbT1leWFhaX1ZiXmRlYFz+4djU1NDSzM/P0dbSx8bGxcLExsTJy9R6e+L6/fno7v5sWltcUFFSUVFPTkxOUkxQT0lQT1FQV1hRT1ZQUk1JWF9jY+/p59vW4dXS0s/R09bOz9bU09/X29nS1NbYz9fl6vdtdl1daW9ue9za39nh6+l88Oz0bG31fXnse2lv9vX37ffs2Njk3dzc2tfTzs7OzMnMzszP1dTNztbf4+fi9Xd8ZFhZZmhpZ2hjbWlYVVdZW19fXmBjdeTu8/t0anJ1Y1pdYVxiZmpoYF5kbGpu/ffv6Pr7dnb+dXx8fOXi3tbY3/Tx/fd5aG7u+3vx8d3e3dvY0tHMyMrL0NLW2tbd4uDp39ve1dTT3fB2d290Y2ltcu576ujf5+/k3enf4eLmc2v+4ePwYF5nb2FfZWVeaHZkY2VganxfXGr/8t7l6Ojo/vzr+3B7V0tRTkxMTE1WVFJcZFBPVlRSU1NXZ2RbX3xjfuPt7d7a19DS497Y/vDg397e29LU2d7QzdvX1NbS1Nrb29/n4Ofi09fc4OPa3uZuY2hXU1xZZV5cdvpscOva2+fxcep7bXJiW2d+6urtcvjqdGtwa1xeWlVLS0lOTEdSZFtdX1xraGdMTFFZXlpMTVJTUU5PTVdZZufgd3tz/m5mY2jr3tbPzc3Ky83P2Orj29va3+rl6e3yfnv8dv3n09DZ3eLf5e5uZl9l+epucPr86vpwXmNjbG9kWVRv7XRXUlZnY2N439rS0djcbFpbXVto+O3g2t/q+V5VUk9KTE1ISElLUE1DREtKS1VaXWheXWJaS0lLS09bVl3o6eTY7WryfmZz4/Tj2NzTztfd09vfzszQycbKx8bT3t3s7tzqftjV2dPV/G90X1lmWlRpenv6+FtQUEtNWVFc9XVjWlRQTkxMU1tcbOba19/26PdwdPh1YGRu7dv4cf1s+3v0euzf4+HiYFtWS0hHRUVMUFd1fVxs/1xeYVRRV1RVdGtYdWlbY2Bcbunr3M3Z6Nvl8+5vftvX1c3Iz9DJys7M2d7W1tzPzNPN0dng5XLs3uX93e5jX1tSVFBNXFpfbfFs++/sd3JZT1FLTFBWUVxeXV9nWF9zZGf18PrtemxnYVJeXVFh7+ra0tDQ1dj9/mlbZ21wavT4+OdzbHlzd9/Z09Xf2+BvZV9wcmvx6Nzb4dvhfOruc3B2+uba4e7X1ubc3Orn83na1tzeztfl2d3i4+rw3dfa0cjW3dp8X1pNTmBkX/zga2/talthVWng9Gl1ZlFQVUxLT0xe8Ofm1N1raGJXVVhSYO/78N7f9+Lb4NfZ283JzczOz9XW1uft8/Hl2NrQzc3NzNPd7evt5P7n2uLY7fTwcFZgY1xiWVtjbFxmdXJVY2j6497Z19Ld4/9zZ/f34N/Vz8rIzM3W2ePZ29zi4+nsbl5aVE9PWVz8cuTb19/t/GhYTVRYWlddZfB89/hsZmV79Oxv+N3W3u3h4nV59+rT183Dv8TIyc/a2tvYzs/MxcTKz9v8but8e+NzetvZ3dztVlBXU2N9buDO5WJcUkZFS0dMVVJw1err5uvt3+p+3d174NTg2tvsau3u4M7N08fL2dDXfWdoUk9RTklcXVpvYF/8eVto+ndt1u703fJeXFlTb+Xg1szY08rT3uB9ZOzb59zN1M7N1tra5O/b2N3T0NvR1OJwdmph8+Do5fhdZGNYT1NPU11dV2l7bOvi7V9nW1VYV1FVUU9TV0xLVlRYaHto6d/r49nub3tbVV1eWHnz7dHJ19/Z9WNtd1xpdGb4a0xLTEpMWFpY7eTs2NTxcW5uZ/94d9nb3dPY5N/5b3Td637f3+Dge2lpY/z52+n67Glt/3p0bXF3Y3NzdP/x2+fo4XdkV1JaVlhbVlxRXF9RVllaXF9gXFhfVVxSSUZBPz8/QEZPVlBmXVdWV15hZHT28P1o5fDm5eXi1c/O0tHR0s7a3Orp9/tpanZwYGh2bWpbaPvvfunyd3Z4d3vu+P15cGlsY15ldnZoWk9ST05NWWFmfubg5ftlcfT0d+v06d/b39vb497h6/Dmd37l7F5UT01OTk1NVU9SXGBcWFVQXF5TT01JR0dHQkJFRUpOT1VfXvze3Onu3+ze3d3f2NbSysrOz87QycrO1Nbd5+ri+Pvl9nVhW1JWVWT7+l5eaWVlXl1TZGNda/9eam1763BiaXRgafV9WWbwaW767Xny39Hd4e797eZ0/eZ59uvg7Oh6ePbrZmtrWFpZW1NeVVhnY1VrcGBo7/JibllTV1lNU05JSU9PUWJfYura6djY3N/Y2trT19DKzdjOztfUztjV0Nvb193v9mxmamZbaH5q/vNjXXBgYHn27+jf39vpeHTo7PXl4+ri5/Xe3ePo/V9mZFtccGxo93F64+9ebW1kaHFr4dfn2tHS18/U3dXf9+Te9vb2X1lmXF566OXX0+rd32ZWX1ROTk9QW1xUXV9WXPPzetjX2czQ1t7d9Obf1drPzNDM2tfT1/Xj2Nvo5d/m2t3X3efp7N3i8/N3cu7l6PDv6/bo+m99dfP04trc9HD66HBr8e3w7Nve3Ojw7u937+fx6ebm8nRkXmFtb97Z0s7LysrL2+brbWn48u/z7ezy9XV8+fDg1d3y825fVVhMTlBPWmZfXHbi3c/U1dnO49rl3e/X3N7Y19bUz+na2+bv3ubo497a0+146M5l3tbq0tn7Z3VSUlpkbHRs8eH0bPfveX7l4Orm4N7r8+Lc7fHe19XW0tbb4ezx6WxfZ2t8/m5bbe5u4dbZ0cvIy9PX2t7t69jmX2zm8Ozu8uzk6ejecl1fWFp1altVX15n/VpRVltfZ2dycWlr29Pqcu/v5NbUz9Pc3dvkbXFubeDW2N7b4dzT4fjzdPjh919cU0tUXlhVWVlhbm908HRhfHpr/er75tze3Njc6+Dj4trq8uZ0XV5lV1hqZ2trW1hdY2D46PLe43v17Pf+fPbn3N3X0tzj5/PzfFpUVFtdVldaXFhRV1pbbH7q93ttVVpeWmNaXvbm6OHb6mdsamnrcVtSXmdgXF1p7PX86WRcZGzudmtaT1daX1tTVVtpfOXe4ejo5d/d9W176dnX0tLR1dPR0NPb6uHa4vJWTktST0tLSUpRVFJYT0hLUVBVTUhHTU5OVFNSVFRWb35r+OPq19rxe+ff6tzf4NLPz83R3unl/OLhYlpkem/l2+He4HLu429xeVxeX1BMSE1MUlpPYmVidt57VlVMSU1GPkE/Q0lWUVZbVFBfY13r6e7k2+fs3dnc0s3KwsTIxsHIy8rOy83X8PTk8N/Z62xdU0xVUElMSENFRkVFSUtIT09QXl5NUlJMT1pOTUxISUpSU/7rcOzsbfvd+/ntZ15682z03urdz83EwMXDv8TIw8TJztfq6N3d3NTc6eF3a+PzX2VSTU9KR0ZEPj9HREhPS0VER0VLTExPSktSXnXv2d7p2t3g0NTZ1dXX0tLS0c7MzsfExMDDzNTX5ufa3+x6XGFidHr03nRnbVxeV1FUSUZHR0tGR01JS1ddaXpmWWFfVFpUVFFKSklQXVZt7Wr06+nTzcnLy8rHxMfGxsTHxL28vr/IzcvNz9HT3Ojt+mj9aG5vVU1NUkxQVE1IRkZJSUtOVmBd6NXW2eb88ez/d/XkcnL8/tvTz8zP0NDPztDO3v9nYnVz9mFj+f/u1tfQ0d7h5el9/G9nXmFs79/c1d30cXN5/vL0bWVYWGVfWU9RUVZgcejsa2j0e27u5eTq3NTOxcTGxszQzs3OzMvT1Nbe1s/O0tHO0NHPz9HY7/BtXF1dX1NOVlVo6N/X3+Hq39rj3O9oclhcY2FhVmh0be/m1dTk3uX7amReUExNTVdo+N7p+3v54ung5mT7cnPu7d9+69/k1NDMyMzN0NLc3NLd6eHk3tfX09fieWtramtrV1ZWVGJx8f777uzZ0tDLzc3S2uN17XNhbu7p28/LyMnO0tDV4fZmWFhUTlNjb2r98Hzk2dPV0s7S1Ot9/VxYYWVocP/t6970XmhwbmhnXlVPTU1RTExRT1Vab3Bt3+5+7V9lX1xhc9rc29HQx8bOy8vM0drY+HL8dt3Z1dXg3N7k7GzqblRfV1VXUlhNXvR25Obb0uDc2Nvi59txXnNnavx2eF9ld/Pf7N7e7NvkX1lXU0lJUU9aXnrrfu7f4Ofk2/Jt8PPr4NbT3unl5tzi5uZtZmxmbGxjUlJfXFlaYGFQWGBtd2JlU01PVFhYX2dcYPnr3NPY3OPe2d7n6ndiVFx17+fk297g29XX3u9tVE9UXGteYWRXY/br3enp4/Lq8f7sbWVaTldhYl1dbF9je+vibV5cUFBVWVJKTkpIUFRlYlpoXGd+fe3y6PRu/vLe3N3X3ePYzsvO2OByaffp4n378Gf55Onn+vFxYmZlX1hZUkpKTk9OUF9bXXTt4OLgfmFVVVNMT1BPTlRx+Hbi5Pvz8f9dY2pfW1lbXVhh+GRfaezq4tjd7vJxdHfy6l9eX2lxau75Y25vbF9h+2JYV1JMS0tNTU1RVVdec19PT1FLTVVUVFlpeOnWy8jNz83S3dTS2tbV0dzb2N3X19vf7t3W1uPl3nFw7vtdVlhTUGVvcPtre3RbZPRwe2ZeUE9TS01TXVpYbXd4a19bS0hLSkpKT05NXPnr59vecmtrdvDc1trh4dfb3dvT53Dz6N7X1dXa2Njh331sU0xPTVphZ2taXVlUYnTj+V9cU1NecXV6/Obf0szV3Oru82J14eZ4durl0s3V0t/l4vXl1M7V4OTz6tza09vm+/Xp1c3S2NjW4N3gfG5YUE9RXV9nYFhYV1xfXVdKRkhFRkxNUU5OT1rs3/NuW1tWV3Jo7ebu3NXKzNDL0tDOz8vJw8bK0NHPztTa2d397+Th3d7lfvrr3WxdYVhTUFxaVm9saXht7e3Z0+NnVWFhX+7m83p07fDl4+36+ezrfW3wb11ofujc1NHZ09LRzsvGyM7Y29zYztDc6+nd3djZ2un3eXJtWlNPSkhFRkpMWE9PTUteeeP8ZF1WZf3n1dXX19vQzcrO09bZ1s7S09La2ujk29jY5N3k+NvX0tbe2vd079zU7ejq/d/bz9Pb1N3o3NbebF1YUVVgdW5kaWtYY+jrcFtpWlZbX25cX1tWXXXi6vbpe/Tb0dPg3Nze3tnS1dbX0c/Mx8TKzc3Q3/H07uTy8/Dk297i6eTk7uve6n1gU1NXX2FiX1hfZ2fu/v1+YnR29vxz6vjp/GzhbWVtXmdgeOlu82dhbGjc2nrj5uTe2MvSysrQztTM0XXr4ufu9NDf4tvl2PDl31lXVkxIRU9LRklDRkVNbFNNVlNQUXl3VGdtbv140dr45OTe5M7I0c7N0dzey87nePnm7trO1NDR1Nvcy8/qaXf6fOjW19vY2+xr29brcV5ZTEpXW1dWT0xIUFxQSUZKSUtTU0tKTE5OUVxlaV5YUk5bfunn6HVwet3V1tnf4ODZ2tTNyMrX09LOzN7raWD4dPDq4+VcXmhndWxrVUhKSU1ZXGtUT1RNXGheVkhTWk9aY2xRTVZPWWdyeE9QW1Nh79zrX3R4ddrMy9ne09TPyMLBycjL0s/Ix9nl3OXp3M7P3upoXVZbbVNKRD4+PklMRkdCPz5DT0lGSUhJTF/0bmZaVVJb6+lzdF9XXv7R1tvb+Gds19Dc1eB1e+bO0NDT2N7czszW2OVud+DUzs3Q1ndceOHrfWxTSU1RV1pWUkpER0tHSklAP0BJTU9WT09LUWBja2VeWV3w4tnNy87e29DNzcrJzc/MycXGxcbN0NTX1dXeeWr8/vfd3uP3aWxfWVpYV05NTlFYV15cVlhLSktKT0xNT01XWmFlYmNiXV1gW1tUWE9TYHLz9GpeX/f259zUyc3UzcrExsjJ0M7NzMzOztDS0c/MztHb9V9XWlZRVFRQUU5NV1xdWEhDRUVCRUlLSktPUFlcWFlOUmpfbmxve2Pu2dLN1dft5dLVzMvIxs7MyMTCxcfU4tXT0M7W0NPUy8jJy9DjXVtcWFdRU1BUXWRqXXNmSklJSUZAR0hJTFBcW2tkUVJUWlpVYVtXZvXY3NzW9+/h5tndz8fKyMXAw8fFzdDR29vx39rh1tPMy87N4WdfXFxPUVRQV2tuYl9tYllSTU5IRkpISlphXFhrXVRdXGViZGpdZnna0tnIy9rc4dTf183PycW+vL++v8HGysnRz87a1MzFxMvLzNfe8GNXT09LSUtTYVxpfmRaTkpERElDRUlOXVpkZ2RjXWBWXXZcYXDu2uPW19/f7u1dXO347dbQysjCv8LCxcrU7dvV3tXRzMvEvcTJztDmZPP1ZGdt/V1k6X5uaG5XR0tMSERHSkVJUFlXTlRQSExYX19p7Pf1zMPHysrJ1NnOzcvHwL/Cvbi5vL29ytfS29vc3+V75M7O1+Tja0xLUkxMVk5MUl1rYF1lWUxLTktLU1ZRTltsVVtfT0xJUFdQW1tXXXTb3dzZ/2dbXXh32tDOyce9vb67vsLGzMvPzMnX0s7Lx8rJztrtY2VjX2tWTlBWW1BYWExIQ0FBQ0lISU9OU05XYFNKSkxLWPx2Z+7Y0tDLyc3Z3+dwZ9/P083Fw8TAvb7ByNDg89jR3dzVz9DNxMbS5nloVmp9XFpVXVlQWFxQTUtHPj5GRkNFRUdJTFdLQ0BBPjtCS0tQXHvu383X5vZsYlls2t3YzsfBwby8wcDDzNLX09Ld3dvY2tTJ1uDlaVtVYWxja1tfZFl2Z1BPSUVCQUpISU1LT05PTkdFQEJAPkhOTlRYeODbz+bwelVdV17c3tXPy8HAuru/vsbLy9DLztjh9N7t49bj62hbXVZcXl1eUldcU1lQSUY+Pj09RkpMUFhkYGBdVlBLSkdHTl5eVWXk3Nva3u5wXl1bW/r3etjPzMrHxcjNz9jc5ebZ8e7g69/X0M/g6+ro+fnjfmxoXV9XV1pMS0hCPj1ESElRT1VgVFNNRkVAP0FMWFlj+93SzczN0NLd6u3j1NbSzcvHxcXFxcnL0tfW3t3e5+158ODp431rZl1u9Pjk6PhkXHJdV1ZRVEpJTk1WWmBoX+1yU1JOTUY/Q0NJUVJcV2V+ZW1oX1RKUFpd/d7V1MzDxMXAv8DLy8nNzM7S2eja1NbP0NLl7dzd3dPb/WRcXldRVU5HRkdJS1/1a2pre3BhWVZPS0hJSk9aWlxm6+T6/O5cV1JPU1p17u/i08vOzsTKz8zNzszLz9jW087JycLCyMfIysjGx8/W3X5sa2xiTEdJRkhKU1ZWVlBPUFJKQ0BBPj9BS09MUmP+5eLqdFt7Y1hi++Lk4dHLy8nHyc3NztbWy87Z5+vj5drV09XSz87OyMfM0tLS4Ori6vVrXl9da3176ubue2BsaU1KSkdGQ0hLTlxSTlVq+mJTV19bXWl4e+nl29POycbGv7/ExMnFyMrJzs7MycbNzMfMysjFxcrN0dntZmdWT09IS01NTk9udV9sW19eTlFJQEVERkhNV01PVFh1YVhcWF5cXm9+3+r95NrPzs3GysjFx8THx8nR0NHMxsvGyc7IzczGxsrY3u9x8G5rX1BZV1tveeH5YmlaYGNTT0VERUJMUFRbUldcYejvbV9YW1dhcejn9e9s8c3Nzs3OzMzCwcbCydne187Ny8nMysbDwsHAy9Tecu7+d2tSUUxJTlJgWk9QS01RUE9GPz48PkFCREJERUhPW3FrXWJda3Ps2url63bv38/KzsvJzcrHxsjN2ujf29bO0NXTz8zPyMjS2N7j+3Hd6GdfW1lVX/55bHzq92Tu+VZMSEZGRUlIQ0NFSUhWZ1JNUFVSS1FZVFhaXFRh4Nnc0czLzcnDxsfFxszLxsfJyszMzs/JzdfV3fRtentcWFRPSkZHR0dMUE9QT1RLSEdHSEZDREFGSkZLTldaU1ZfW1paXFhabVxdZWdlZurS0s/R1t7q3t/g1tPd6eHa4tvU1dnc2NHSz87d/+rkd3l7dlVOVl596d39VFpZT1BMTkU+P0BFSE5ZTE5dWmRt9fteaHL939rQ33Tm7d/RysfR2tje0sjEzN3U3eXj393sev5xdu7c5VtYUk9bZl9WT0xLUWbe3nhkV0xNXGdWUE1ISU5gbmBdUVBTYu1ubl1MT1Xu2u/nZltj7M7U0Mze4t7Qx8vK0vlkbdvd5tf2Ym3q0NLU22ZaWH3rXmxWSkpT+uPf4lxOTF33Ynx7WkpNXmv332xPTVvw7dnZeFdc8dfOy9L0XX3X2tfNzujl1tDKwcPN4NvQ0s7Jy+lm7u3g0c/kUElQVlpQTUtGSk1SbfFwTkVJTVhfW01ISkhMaOLbcVBXae7b1N9pcevp08zM2nFjavHazsrX8/zlzcfHzNTd/Prk2dXi8W5v3dTP0uPqaGzj1tV6aXZdbN/g3/1aUFJfbPNqW1pJSltrempdTEVTY15iWVpRUHbd1ufr6mP208vJzMzY5c7FwcLGy9zh2M/M0tDede/W0tjc4l5aaHzn+WplV1Xt19ru7VdOVWPk4Nvial5g/N3l3mdPT1BdYF1WS01Yaen76G5Za3Dj3ebmY11ibtbTzs7s5tvSysnGzNTb5djV2eBraXj63d7Y6W/w6tnV3OpfVFRPU1hsbVpbV2Xp59rob2pWXl96cFdZW2B95uLme/rz4NvRzejz/G/u28/O2+Dr5tjX0dro421md/btbGhfa+jd2N3l43Nz4efzXlFTTVBfcOTx+Xpm4Nfa2u1wW1NZX2dgWFdXXvDo5d/a4Pjc0dPQ2fBoXvTt49ro5WZr3N/a4OZyWHJnYnldWFZQXnNu9PRsWGb8cOzcb1VTVV323OXeY2Tn6NzX2e5cW1xZamlvX23m59jZ0dn55ePVz9rS/Vz5/NjLy8zh6e7dz93T4F9cT1heZnROVVtX+2NeZVBWVWN3XmNOR0tIU2Z3fFtTU2Da09HbdGdXYunq3PpeX1765N/f7Or96NXW1OBtZGfs3NPa63NgYeTQz9bibFlgd+fk8F5ZWV/v5vluZltZbOfubVZMS0xUXmJdW1RRZeDX4P5yXVdYXmNZUktOVuLR19jg4OjWycTJ2nlfcN/c2dzl4W582c7O2ep2ZW334d5pVk5NWV9mY1hfYWvg4+toT0xIWWZydldUU1Ft497d8nNYVFZRVE9KSERMX236cvZuXWZfa3JZUFFZ4tzk6fbscufQzMbK2eFn9m5mdGdoWF796uPc6e768+Py5vRaUE9ZXGNvbGlea9nQzc7X32ZgWFNcW1ZSU1xhZubs8HltdV1fYl9aVmNw6dnb3+3s2tvV0drna25td+La2vJmZWNv5+z6Y2RmZXh1ZlNNTkxQX27o5/Dc3tHJz9/4bWlWZnpsYFZcZP7e3+ja6PleY+5lVk5PVljn2eHa92xjadvidf5nZ1tj2m5gZFlUT2RvWnb2bF9zz9Xd4e55XurT/t/U397SxMbNzdTqYl7rc27n+lxa3Nt+7+T6Z2ze3+r1eGxo1Mva2M/a+/rU2d/j5+9bauv9fGdcTUVRU05RU19UX+Hu+GpcWFJ78Hr46t7w4snLzcrN1e7x631yaWNfVWrsZWNpZVtdfG5r93Roaena7e7l5urf2Nnn3Nrv6dna2NbX8GZeWGFTTlNQXPjl5PTsZlFaX3ZpX3BtdOLSzdnT0ufg4NflcutqXG5u6vLn3/7f2dTd/OZlXfjo1Nve2u7f7drQ3M/Y5tfXztff23BpZWBdUFpSSVVi89ng2edraF9vYG34W2vn3M3PztLi5fLu92hvX1xlWV1XWmJYVFRXbGdwZFtnX2rm29XY3dnd2tnb3ujZ2tzPztno/X5jWF9nbGNbW1Rj7OHk/vt1dert4+f83NzQyMjFys7U4NvU4utiWlpaZV92aVlQRUlPT1hUV1BMVFdy7vfl/erU2tDPz87Vz8zMys/Y/Xj3cvX6ZVZKT1ZZYV9fVUxWXGzi6+F3e+7ez8zKzNTX2djZ19Lp9P3929XS61lQT1dYS09UUlJJTmbqclNSWGV4deXc53VcaN7Q0eZ7Z11s++nb+f5vdtzQ1exvXF5mfd/a4e96eOPU0NPW4vRw5t3o42lZUVFicn3r9mtdXWly/XZdYXTm2Nnf6npoZHl58Ofg7Wvq19/b52dZUFZQUF1XT05OWGxzYmlbVV5ja+zseG3w19TNy8nM1NnR1dPN3Htr+Xv86vBfUlNZVlVaW05JUFBUXmltV1daa+vf19zd19TIxMTHz9fk7uLq4PFdW1tdfnRjWk5RUE9NTE9LTVJWcejX3evtcOPd2s7Y3+Xo3tjS1OjzZGRw+nZqYFpYUlVXWFpdWVxmXW5vcuvt59XPztjd2Nra2N7V09vdYWHu83FqY2taU1JNVlpeYVliamdeY/z27u5zb2pxbmpuc3vsb3ReY/z5fmhr/3VkbFpdW1ppXV5qanptd/B74uLu9/Dr6fT66d7h5uzi2c/P3ejn7f1+9NnT1tTX2tfd3en58nB3+235fmliW15wX2RcUFlSUFJST1BLSUdLVF5pYmtoYm/l29jX1tfR0dTP0tLO29rX2drm7+5gV0pISUVLSUNKWm5rbuTW4N7W0s7Tzs7SzMjHysnDyM7b2d3+Z1FLR0JCPz5AREtMSlFRUVhNXmFXcWp183La0dTR18zIzsfBw8vl6l5SUU9JSE9Xa/Hp3eXu5dzW1tjec1lZXGRkXvj8auXazsvP3F1MTlFUU09VT1Vo89ne9Htf/drYztDY33NvZv7k6e5weujdzs/X71lTUFNTTk9SU15n/dvSz9fTzc7T1tbf/n3vcGB87HVy7tfX53hqTkhLTkpLUFRWTVFoe/P86HPs2N/Y2+bi9ODb5NfX7Ojq2tXb2flcU1FhWE9aU01NVGN33tPW29XN0s/O09bu5dzs1dDb3/Pn4eXzX1RTTUdHRkxMSU1PWWPu1tnn29vXy8nGyM/LzNHPy8XIzMvKy8zX2eBpV0tGQD9CQkNJV1tncF1bXWhsavLwY1lSVF5TbPXv19TPz93d3f1oaGFgXGxuXmV2+ujxbmVbV2d58+bx6/5rbHTv3drVzcW/xsjJ1dDU19Hc3dns6djSztDa3HRr/3PvZ1hbTUxYU1lfWF5cX+PmbV9RTEpJTUtNWV5lX2Hz9+bs8+jc3dXNzcvN1Nfd1cvJzNDUy8zO1Oh6VklHQENISE5LTVhbae/l2tzUzcrFw8THy83NzszJzNPOzdHU+m1YSUVCPj09P0JCSU1JTlFabvzw7Pzt6efb2trX5d/o6+Dd2tfb7mhXX2VST0xPXGra2OPf/eno8MzLzcTIzMzSzM/g3N7o62no2+zT42N9Z+/pWF1TTldTZGxZXFFKVllu3/Py+3ruc/Pa5d/a5+Tl2czO1e5fYFNNUk5QWVhcZV9vXllZWmZqeuHm3N3t5+TUztDNzdLR183Jztn5WVZWV1ldWlhSVlJOWVZQT0xOUlZfal9ZWFVeXmVmYHdyde/e0c7T5f9kYV5kbmZr/Hvr2tHJx8jGx8XGyMvY8fRlXGJcVldMTE5PUVJlZFdTWVZWUkxUUE9rZ/Tm39jZ2M7Nzc3Lys7c29ni72tuXVRdX1xcXF9lUFZaU11dVU1HTE9OWV/2e2b83djWz8zM2NvU2+Td29t7eeb75d/f415hcFdQWVxNQD5GSkxOWmhUWPfs4NnRzc/ZzMjKxsnK0eDX3N/W2Nj6Xe327e5faF1PWFZOT1BKRkdaYlBQWmpXU2V3XmbueF9dceJxbOrofGL10t7p7fZnYGft7u7Zz9jY19XV2c/U39nU0dDc3c7Y3dvZ3nFifGFic/f9XVNYU0tPSUhGTWlhWmBYXVhe4dfX19vZ0NLNz9nY3dzP6ObgdfFUTE1SV0tDQD5ARkdKTU1WV1h96+Xv4t3dz8rIy8zNzdLfycC/wM7seFloXVRaW2RfWmRsZ1xZbmJc5+Ts7vdna19l7eDZ5tzU3ufuX1JbTlVTU2di+tfX3d3UzdTY1+HwY2JuXGBsX1hRSUtFR1RTTk1BRUZCSU5QXW3b09rPys3Ly8C8vLm4vcHHysvOxMDK0drMydXi+E5HRkVCPDtCQD9BP0dLTVZTTVBNU1ln3+L5anLaz9bP0crEwMHGzuPrcmFfZ+zc2OBiWlhaZ3Z6c3VvXFlsbXJ6++vd1M7S09HR13VoaWT1+V9aWl976tnX19nr5t7m3N3g3+p98G9eXF5aTEpQXWtdUEtFPkRLT1NXZ/n208/Oyce/wcS/u7y+wcTJz87Mz87c73VdZHpbVFBIQT9BQEBGSk9PTVBmbX3y6fJ97+Lk9fHpbG5n5tji2tHV19HR2dre29rc6dnQ0NfP09rc1tvk4ubvbWJfXmNpW1RVWlZaWW/n5dtvX2RUXl9UWFNbenfi6m7x8nPr8OHa49/n+eTq5drZz91t/+ze1e9iVEpIR0ZJRUZFQUdNVl9g+fRv4dnUycvJwsbEw8XAwsHCysrHzNB8WFBCQT08PTw8QT8+QkNKT1BVam/w2dDJy8bK1M7MycPJysjKxMbRz9319GRbWE9aX11ZU1heX2pt9el4W11WV1dKSERCRkNKUFvu9lVVVmB1X3j2aOfTzMHEwcDHzMvGwcbIz93f+GT4YF9bS0lGSVpPRUNAP0RGUlBQX1Za+/HOzNHS293U1crIzcLHzczNxMva2/d84Nvm+VZOSUNEQkdOSUpHR0lIS1BJTFRSW1dm3+7s9Hbc0M7Kys3GxsrO0c/W6+1cTVRabPNh9G9g4d3Y1/zd/l187t/XdOjgc+nczsXMydLn+vBt7lpVXmRxdHzZ9fPi6N7V0sXL187p83pZX11OTkhFTUtQS0FCPT9HQ0lHQUlHSFlhfflq5NjKv728u7+8vsLCxcTG19XMycfJ0M96aW1saFRTYFJNSUhOTklKR0pJSk5XXWxnamBu7OXY2+rk3dLQ0s3Oy9Dc7uvl2d7r6+7vfWRdW15cXF9paXFeVlBTV2JbXWf75eXsb2pxcGVuY2lxdvLo4NPVzc7Oy83R0dfS09fa7G/9ZGRXVVdSTlpSUE9HS0hDS0lWcHbf3+nY1tHIwL2+wL29vr/IxMzg09Hh8V5wXFlYWVhPT09MQUJEQENHS0xJS01KS01fYFddaHZrZ3trWnve2tjOwr7FysnHxcS9w8zOysXFysjM2urj2uhnZ1VKR0RMTEhNTlBUTlBTWuTb9vlu6O5s5tzi2NjNztrSzd30at/S2dfP1+heYW5bbODwW0pWaFZTU1ZMRkhQSENKUE5MU3D14NTNyMnHv8PBvb2/yMzNztbX097h7NxuXlZVTD88PT8/Q0xJREVMVlx90czO0tLMzc3Iyc3MzM/c9t7b5n5jZH1pcXtZUltjZGV65WxgUFNmaunV53BlV1dVUlROTUZETk9hdGFXVmFu8ejW1M7P0MvNy8jMzMvOzM/QzdzgeVxfWV1wZ1VOTFBSTlpbU0g/Q0ZHV2NlXFBdbXbu6+jpcf/o5NvOztHWy8TEyMfFxcrO0dzb3ONtWFJSTUlHRUQ/PT8/REtQTkpMUltfbOjffXB23tDJwMfNzs7M0d3c5XRjW2NnZvtgWWVn6+V65+5nWU9XbHPvfWl0aPTd7N3i9PJlWGJ62trn2NrZz8/Lys3Pz9PTzs7bfftmWVlUTUhBQD87Ozw+PTw/QEJMV2BaWmx7d/HXyMnIv8HEw8G/xs7Lztvi3c7W69rb6uPc1eBoZ2xfV170fldYX1FQVWVaVFVXUUxLV1taWWReZv7Y1N7p3ODt29PV1M7J0tvZz9bscXtwW1p7d11ZXl5VU2RiWlteeWxbc2pgXmR2amnh2eRrXX3v+eTe5eLc1NLT1dXo/XH08G184Oju5GZaVVVZT0tISE1KTF9eXnTf4NzPxcTNzsvJy8vEw87XzcrLzsrP9VdYXlVNTlZOR0xSTk5NVlRKSVFOTE9VVVBPWFlbYnz2bl9rd2Fv7OTu387Ny8jDw8nFwcXQ2NLX6/re3+fi3txoU1tdTkxSWE5ITllcWl/udvLYy8zX3d7j7OrZzc3Vztjh5ujd4PZ8bGJj8d3V6HJcWFZYXVpcUUZAQUdJVF1mV0xQV2Nz8dz/Xlxr4NnW0M3PzsrFxcPEydX279vU3Nza+1xZWWFv8X58ZFldX2xlZPTn7eDRysnL2/VdXGhqfW5hXV9keeXX1tzg3+Li2d/g/mB129jT1N/vW1ZcWkxJQT84ODs9Rk1UXl5k59vQ0NXOz8vEwr26vb3ByMPAvr7GydlvcFJSX1tbUkpYU1FVTVJOR05WXGhfZGVZa3r23eHadFNcc3H1/339W/nc3dbRycbW0s7NytXa3XpiaH33dmVpVkVESUlJSU9PU01MT1JZYXDc7uXT0s3MzMzN0c/MzM7seuhcUk9UXlRSWml4c+Da72Nt72hVWnT2Ym7u2NPYzszX3trM2fnr3e1p7eTk8Hfk2tbY2dn+VlxlbmdicXRiWVhWVlBMTkxKSENMSEdMUF1fW+vpff7b1uBqZXBdYGh3627oysjLzcbG2NzY3Nvq28/T2s/SzM3WzNH57f94XktIRkFCQURIS05XUU5MUFht49jTztTb1dPT2dfN1uDX2NvU1NjZ9vtiXFtJTlJDPj9GTE1VXVZVW2n/7evb2tx+Zff++d/Z0M7R0uHx4Nzb3uLf2eLh2drZ5ex8fP1leO5fUU1TWVJed2x0b2B+8XjZ3uxqV2ZoWmzl1c7T3dvd4d7a325fVlRfXXD9XGhmXP1t8tfZfGZOSUpETlVRVkpJVk5PavbqamRw+nrj0dDb4tnUzs/Ox8zg3t3PysnExtLg+WRfVlp7YVFLR0lNVGpu9vVubHbu6ePwY1hXXe7Z4drS9v5tetbY0crXd2/v2dnc087haVpcXFVjZFNIQUVISUxSV05ESEtUaXRlXlBNW2fay8rDxc/QztDRys3Q3G5dX3n+49jU42hfb3ft5PF5W3Ld7dXV1c5zWu3g2srM2d5dcfZr3dLP4WlUT01NXnRpYltYW2Lt0dTecU9OTktgXUlFPz1ESFPk6nZ5X1b+beDR3t376uXa08jHycvMz87O0MzX/V5fX+/e0cnZaWlgdODVzNLjeHpxferf0Nx6XVBNTVBUT1NKSk1LUmju5fpeb3Fx2tLU1H3x4N3OycLBytnkbF156nBkUUhMS0pQa3zseVpfTlnp7PBqW2lib9vP09h1WVZPatja3u1h9uDdz8jGyMvpb2Bn3N/f3fH25e3u1tDj71VPTVRwb2dgUE1WWvLOysvR7/7l2sXIz9Td/WlnX+DcfvVXSkxKUk1LS0VCP0NIU2FZVklETl375OXV3+3+4t3PxcjO3ehu8d3Z2tDV0NHPzMfEx8/c7XBu3+DpblpPTFn64t73aVdJRU1hcGJfXVt0/ebq39nO1+Dq4NLc5eHqan7s8Xnr6+pjS0RHVl5eZWJXUlRRWOrm4WxVU1FobVlidnly9Ojx0s/T3WFeY+Le4tTU6G162tPGwsfXa1VSb/7q6mRZXmXt4dfO3G9w/Xbb1OLc51Ze6+3u1tbb7E9LUFhmbmhmXVVfdnHu3vVhVlFPWnloXV5abNrl9ejsYU9JR01WYGxfb2lZYvLv2srK0+pr/uTZ0tTO09jNyc7KyM7mbmBf8vR8aGpmXmj3593O2O5eVUpKVW34fOl0YmFp7NDlcGFXTk9nbnhrb3ffzcPAwMvkYFlVWOvqe2BeUExPVFz1eVZOSkdBTVleUlZdX3N53tDT5m/94ffZztDn8H186u3Py9h+ZFdSUmTm6eDNy8zMzMTAxs/d+/9oZ+PsZHp1bejm2M/tU0lAQ0dHVWNdYnFjeejSyM3d911YVkxRWE5NVE9cXGTnZEdDQkBHTmn7XVtsY/XXzcG+zt7p9nh53tbX18nHysnIxcfb8nt0fW/7fPxoeOfTzcW/w9pbUEtCP0VHSEVJT1tj89jWb1ljaFxWfezuffHczsvDvr/M+llYVU9mYVZOS0xVU1nx7mxbTk1WUFxsbGry28zMz8fI1P5dWVZQWGBZW2BbeNzVw7/J2nRdYlxp49ze2tfPysvCwszfcGteUU1OUlVRWXzZ3dfM2fNuWVFUWV597HRpbuXf0cXM5mxVT0pHSUtMSU1b8fTdzc9yUk9STUtMU11QWu/g0ci/vs36alhQUEpTaFtr18zFvbq7x8nIytfxaVhbVVnx19XLyczdZVNSSENERlFUS1vu69PMyMzWe+1pX11n42BdZtzV0M3P4v5dV1NNTExXWF1s3t3azcvS2v1bTURJS0tSYWHp7uja0NTtXVBbVUxRXmj07NnKwr+9vcDJ5XxsUVh389/5aHrZzcXJ2dpsW1FKT1ppef7q3c3KxsjW5XZfTUNASEVKTkhNbubY0NHL0+1eSEdXSVlwXVvj0tbR1dXm/1ZMSEdIS09OVHHc39XVz9HO6vPy4Nfs1NbTzsvOy8jJzMjbWVRUXl5lYvXn2dfi39jo6m9NTkdFS19sbnHf4PrW0tvYcUhHRUJHUVxq7tvRz8jFxsXF12plUlhaT1Jdd/P58uZrX1tNP0FCTFRSU1ZqeOnf1dLR1OtSX31y7Ovq3NPWysvPzc3aaFBbfGZxZFvjz9PLxcLHy83ecWVdVlJYVm7d7Pzg2vbt6X1mWU1HQEFESVVZat7Y49nS2fVcXFpbVVldVlJSXXFrfN52VE1NTV9iZ3paaG/93dvVydPhbF525uJz5uTi3M/HwL6/yNh9X11k9l189nNve+fe1NXgXFJOSkpEQEVJRU5b6tvW0Nzb7XZjbGptbH55c+3b19rZ6t35ZVdTWFZUXltfdWBjaev5fWJYWVRcX2hmXnLu5+rdycrP4llTTkdIT2d749jR08q/w8XH29/ha2hdW1pibu3g0sPJzcrUfWdZUF5eTU9OVmBk5ubu4X5cbGlWW1lSWVdk53fs8mz0Xlrr2mxeXVBXYW3r6NvlfeLyWlVaTlRjTlFf+tXS2d703tLb39DZ1tT/ZHvdzMvLxcnL0N7o1drt7OT0X1ddZnNsZXdeVVf+bl5aX2zr6fXqcGRZV0tJS15gXWluZH557c/SzNXR3Xx7dGJZa/d4aOjd0M7VbnBSRkdJU09PUUlJT1Jm3M/X1tjv6NrV2M/N087Q2M/DwM7jdVBXa2z64uRtZV1r89PM3+dyTlB09ODZ2ef42t3r3NDZ+G1PQEZHRU1MSElVWFhj0dL68Wtt5N7s0tv1YWBiXHjb1/x7ZV5ZVExTXFlUW15ZY3Pl7/Dp29XMzcfAxcvM0tbNyMTM3ufk7el+7dnpWlxbVVxg7+t8W294bGhn6fJbW2pkcOzk5/pXWV762dvR3l5WU0lPYnXx8WFffWvl4NXfbv7+ZV/w7mRWSkpaYnLo1M/hbmBjXuzY2+JdVmTs5NLMyszNz9Xb0svQ0t3e493r2s3U2+Xe5fLrz9vxaF9ra2boztnd/mJYUlFmaFxcVVlZWF9vbPh9cVtaYm95bWFQUFRcbN7b3eJrWVxw3tbg7mNja2/q0s7V19/ueXro4+nk69vU1dLPz9bX3/vx5d3j8fB4c2Du08vLz83aXlpZW1dQVUxLT1Recu593t58d2pvc2ntdWNjenV64drU3/xdWmbr8n1zW1hhYGnu9NrmbF5ZXWhYV29mbu3m4OVu5fxcWVdVUlpw/v1wZu7i09PUzt3q3ubrfWf4X1H84PXe6OHc8/ztfnxvXlleXGHqb3F96dre6ex7dN/p8O3q6Oh6empldl5XWF5XUlFWW2L73+nn7erd+m9sZ2BRUVVPWl1qbHz+/Nt1WVlRT0xLUFJdZeTc19bbyc3MyMzP2eXh7W9vfvrzfPDT1O9kT0tJRU1VTlFdXGn+fd3X2dnR0s7b2trj2tLTy8zVztnk8GhLSkdITEhJUFJUYGnk2+dsal5ZT0xST1BnZW7t+Nvh3erb0tDvV1pSTlNaXXt+3tzU3ej2/35v5Nzf3+Bw8/f6ffHe3+nt6Pvp+2tta/7b4OLr7vd58f/6bnV86PlpbOrq8djP1epjYV9JS05XYXZdXmdbXFFUT1JaXFdTUE9OT1pdat/P0NXX1ev29eTWzczW7d/S1Njm5O3yX1xz+mRcfG554dTN0/RuZGVjW1xiePzkfXf+bOTZ0czO2m9aSUlPS0hJTltfaObldXVqXn3r2thpW2JgZ2fy5ODqfHhaVVVeWVxtaWJVUF7p3d7g3OPZ1eXb2vPn4N7QysfJzt9wW15cXmn+4PhkZltcc/nv5OJsXlpTU1JQVl5fbXz35u59dm1v6+rybWZwaWB529rT2d/jaV1hZWn53tXS3dzd3N/r7/pqXFxRTEpPVlhaZeLQy8jK1N9mV15pW2fp7XRt8tnTzsnGyt17b/tpXl1jWldr8nVdW1JNUGZ28mtZXlhVVVjx1NbW0t799t7W38/HxsjO1dDN0N3u9nRiVllcV1RSTElg7PHwaFpVUVRPV1lfcuHe6N/OzdDHw8LCx83Y4+F9/d3m33RgV1pdWk9KT1ZYeuZ+9nLk6evW1NXc9GNlbX3s2s/LzM3PzsvIyvFvYVNQS0dGRktMVHTb2NDN3eLd1dru5dzi7evp3tfV09HX1tfa8ldWUEtFREtXVVJUV1VPXOrl3dLT1d3569rT0NbQ1d7a3+R13tLO0dDQ3+Z+dm1gbVxbYlJMTlBSWGne3NvOzs7O3ezx7N7f6Ovx6NfqbPro3ODe6mlo5uJnXVZea3r6YFxYWFdSTk9afGtZYWRqednJx8jO2fDq4ujp5tjU0c7VzcrMz9nf4OPt8V9YXV9kbuvc0c3Te33vZFhXXVdXVFNQUWRv+97d2dTc+O7c2+hkcOt67OluWF5kYXBmbt/d519XT1FTWmVeYlxXVU5Tb+DSzs7Jy9bOzs3Kzdvg73NoXl9PU15ya2X79/ZuYF9q7dPJys/Y6e584NTN0d/5b2ZdYlpVWVpgbWVp/fVYS0lNT1locGl8dVJYbu/k3NHZ9nZlXnDt4Obz+vrv3utleW1qevlwWFFYV1BacubczsvR2d5nXmlz39vb6mBaYl1s69/b3NTg5dHP3u54eWhiblxQTUxFQkRKTFZaWVtVTUxRXX7v3u1pbW/v3dbPy83Hzt/jevxnU1ZWU1ZYUk9MS05baPjp4HhfYVpg8NPMz8/P2ubp2M3N5f1kXV1QTkpITExPWFxieWBfbmfg1tPO1dfhYlZYUVpeX19bbmdYV1ld/nd3+frh5O3d8Hbi5trd5+hsX2Rbber23eFqa2pXVk1b5vbl7GVXUlZXV2dnbPt4+/5lZWh36e3k2N35ZllVTldeWWNmW1BPYmRfZ+xqa+z0dGDv19fJyc3LztPX3edyZ3BiWWZ4YVtWVFdr3N/11t7zbVRPT11dW2z1e312eerj2tTe2s7T3u5wbW37/WXq7GRlWU5NVm3wZVxWSEdFREtOT05WeXd33Nzgz8i/wcG9wcnK2N/e5urm1+Br/fZYXmdlZ2VlZ1ROUU1WXv3k2NHV1tTW2tDQztDX2OxpY15fa2tjbG9iXVhTTExUX19h9XVcXFhPUVVRV2RcUlVcW23VzMvJxcPHy9DU2N3e4ePq6uj4e3v65eLd1thzVllaYvx6897d19LS0tLTzs/P0s7O3P76/nPtcvPW33plUktLTFNTUlpbWFVSU1ZVWFxoannl4+Dj28zIysPAwsbQ4e98bl5aWVBaYl9hYnTa29vP0tPZ8HhqYvvq29DT2dzi7d7U0drU09TU3+3z9Hp6fnZt6vFrVktQW1lo7W56bFpaXVRWXlpQTlRVW1983c3KxcPCwsnO3e9pcHFsamheWVFPWWJkaWRXYGJcXFtZZ3fo2NDHwsPJysjIzszK0Nnj+vNwY3DxXvhSXHVKWl5eZO/49+Te/mNZTk1TU1leWGFYYO7l0cbDw8jMzNXeb1RWUk5SWGFkXWf/99zb3OBs93ho+WRj83b++fv16OTe9+vP1M/O0dDpbWdf+u/1/2RXUkxNU05i/GdtY2h0XlpSTFNUU1363dnf2M7KxMbGxsnS5m9eV1VXVVFSU1RZYHh47+v49vZ6XlljZGR54dzZ1NHP2t3b3tTP1tbd6XJhWlRTU1lSUVFXVlJb//T3dW7veWJVT05QT1RTU1dYb/Tr39HIwsG9v8bU8PDk6+77XGhgWFdYXXZ6+/tj725fWFBbZF/u39nO09PN09HLz83Y2tTuXVBUXFtbW1JRTklLUU1Sa/R+X2pqV01ISlFPVVVSZWFed//jz8rIyszI0fJeV1hleXdma35meePl4M7N1+Hg6G1YVF5mfH7/89/o7+fj/OXJxMnIyNXqbHH+49vk/f9wVVBSVFFeZVlQVlJIREA/PkdKTE9YXl9s+N/TxcHCxMfW3OvyeX3nbV5eb19kX19c/d7i5+38X15PTVzm2tHU19fb2dXU0MfMz8/N3fpqUk9RWVFRUVNRUlVZavLzfGllXE9PTEtKTUtNT1RfVlNeYn3Wz83LzdXe6vjs3d3j3uj1fG/26vP1ZVxdW1pPTEdHSUxXY+bt4d3Y2NLJw8DExcvNz9vh6O/ufW1qXmNdUExLU1pWU1BSV0tAP0BGTk9kZFz+9eXUysXFxsLByNLg3vBjZXJhXVthW1JQW2ZqbWRgX2RTUFRSVWTz5ev74Oz24dTU2NfZ1tLW5PXw6+nZ1t5rbn5dWVxjWVZjZFxUT0hAPj9FTlhWUGJxXGfZysrEwsXIzMzR3u7g19Xb8W7o9HltbF1XX1pTS05MSElQZeLf4N3cz9HMycrMyMbKztHO2n5nX1thXFpPTktLTlRQS1haYF1bVlJRT1NffnVwe/rv2c7N0cnFyMfIytHZ19Pa1NTf3un16uLwZVd272r9+V9bVFdgad7i+Orr3tzd1NXVzM3RztDWz9zgeGd1W09PUE5UT0xNTE9KSkxGQENKTU5TYWBr+9fLyMPAwr+/xMHEy83O1dPg7XxcY2NaWFRVWVdbW2p5cGd67+Ti8N7Y2dDMzc3Oy8nMzMrIys3O1d/de1paTkxQUFdTUFdYXV9YUE9NSUZKTklQUUlSZfz6/NnL0c3GxsTEwsLJxcjU1dzw3+PucFRZUUhNTk1PT05OWPVhV/L34tHMxMTAu76+u77BwszS3t3nTUdHQkNIR0ZDRUpHTl1YVlhTVE5SUU5aXWTv2tXT1c3Mz87S0c3N1dbX2fBgXlpTXGhmamhrY2NydGBjXl5haPlsam/27dzY1c/OzMfCwL6+v8LFytThbVZTVlRZUUpHRkRAP0RJR0ZFR0dMTUpOX33oz8XBvry+wsHAwsnKzNTc3W5WT1FQS0hGREVLT1RefWts9/hza+z7++ra0dDLy87OzM7NzMnGx8rXb2ZUR0ZGSE1WVlheX11XVldRT0xNS0dMTEhKVmFq/vrfz8zKxL++vr6/wcXGzeBvde9rXU1GRURAQEBJS0tPTk9ZWVJWYOnUy8TCvrm6u7u9vcHDxc7cfk9FPz4/Pj8/Oz5BQEpUW2BfYlxdZmdqamzp2tXLzdTP3OTh29POysrR0ttuXFVaZmv37GVv8nx0dXl97P1ral5WUktHS1JZXWVj4tfUzMa/vL2/w8TK1edmXF5bUEpFPjw5Njc4Ojs8Oz5CQkA/Sljn0szAvL26vL++vr6/vcDEyutcWU5GRUA8Pz4+RERKVmVx7/jr3tvc4tDNzMfFw8PJytDPy8vJy9j4bVRFQD0+Q0hLS1RTUVhWU1FTV19mZmNdT0hHR0pQTlBaXnT86t/Ox8PBwL+9vcHFycvW3PliVk1FQD9CSUpMS01MTkZIUGzj18nFvry8vL6+vb2+v8TMz+taS0ZFPz49PDo7Ozs7PD5BRklNX/bu5d7PzczIy8zLztPU29vSzc/haF5WTkxLUFJUWlNYYGZjWlx42tnZ2dvX5HBdXGFf+uTk19TQzsfFw8LHxsXBwsjP3t/xXFBKREA+Ozo5Oj1AQ0RHSEhLU3vh1M3Jw8PCxsjJy8fExMXJ0Nbcb1xPS0xKR0ZGQEFERktTX1393dfMxMXJyMPDxMbHxsfKysrOy9Df62pYTkxKSkxUT01VXFRQSUZIS1ZdbWllXFhUU1Zba21+3uXr4tzPy8jKxsC/wL/AxtPp6l5RS0lGP0BDRUdOUlNfXlZj/vHczcjFwb69vr29vr6/vsLJ0NxsXVJKQ0VDPT49Ozc2OTs9Q0lWdt/Nxr6/v8DAwMLDw8vRz9fl9fldWFhYWFlZXl9p/3Vwdv509Nzb5NbNztLY3vllXltk8vLj3Nzj4M/M0NjWz9DNycrO3eJwWFlQSkdDPj9APz1AREJBQ0xUXXbf29rSysrJyMjEwMDAwcPFy8zV6V1TVk1JRkdFPz9BQUZITWTr1cjBwsK/vr/Cwr+9wMHExcjOz9nhalVSUVBRVlNKTVJOTUlISEdJTk9aWFhoa2VfYmVu7Ovt5e/p39/29/N85tbUzMvR2tjS5/fo9vbq+m5ka/34eGdecfp67N7U09zPy8fEwsC+vbq6u77DxszfaFxPSUNAPDs5Nzg3Njg7PUJJVnvo29HLyMvLysrKzM3R1dne6fBaT05PU1BdXFdaXXNsWlpo8+3i1M/MzMnL1PDo4+3u39Xa3dnSzM3PycfIzMvIys/V0NTzXlxbWE1NSkZAPT89Ozo9QkRFTl5ude3Wzc7PysXGv7u9wszKzONsVlhYSURCQkM+QkhJSEpZYXDbzMrNy8bDx8jHw8HGycbDxsnL1OtwZ29dW1xXUUpNTkxKR0tQTEtOWVdPVmNdWldi7W9oYV9dWWV3a2dnd/9hZvfd3ejb3t3h++jl835yalldaV5TTU9WVU9VV2ZdX/X0493QxMC+u7q7vr68wMjN1uFxTklFQD09Pjw5OTo8QEBHTU5RbNnS0tLOzM3OzsvM0M3S9GBXVllVUFFNSEVMVVBSXWp+e+rUztDQzM7W29LNyc7c5HRbWvzk7vTn3+Hn3NDQ1tja4vd2anBvWldSTkdITEM+Pj09P0BHUFNPTlFWX/HYycXGxMTLzsrK2+3y/3ZkWFtYT0pJTEtOUFhkWlxwcn7j08zP0NDQz9PRysvOzMrP2dHU2tjc3+RnWFtaU0tNT09OTlVdVEpHSUZES05YYGNpYl5eaO7levT06XRx39zs/npsYGPw8+Pj6On9cnbp5WdYWllWWvDW0+Hn6u/v187IwsO+u72+v77F1dzm729nbXhdSUE9Pj9EQ0hJRENGSUpWZ19cZW9989vU0tTa4/lmZGFaWExMTEtMUGBdUU9XZnjj0MfCytLY4uPd3NHP1Nna2Nvf4XpqbfXj3dTOy8bJzs3UzcfIys7Q0+Dv7+5vVEQ+PTk4Ojw/Q0JFR0pWZuLTzsfEwsHAwMfV9lpVUFRhYl9ZTUdFRkxSWlpcXlpn5M7Kz87Lx8TFvry7vsPEy9HT0tLT6/xmXFxebGdaU0tMVl1559jc5mdZXF5YV1xZVlVYWPzyamJWUVdYZ/fqdFtbV1Vabt7S2dfR09XTzMzX9VxWV1RRWGhhX1pYX21959PQ09DJxb+9vL7Dy83Pz87Mzdne+GBZXmJjXE9KS0dESEpGREhJT1hp383NzczOzc3P0tPX9l9cT05RUExOTktNWHrf19bU2OHb1NDP0s/U2dvj1cvO3dvh7fPs49HK0dne5ObZ0M7M0d7Z3eja1+poXExISEdFSEVCQD4/RE5cbu/r49HSz8fJ3eHsaGRcXnfwYFpcX1xcbffl+Vtifnnl3eJ+7Ofh2tXUyMTLzs/MysnLy8vP29nf3dHU5GZqbHJ4/eDO0Nzn5W9dYFlNSERCSERCSU1LSU1XZvv25dTa4ezweuXW1NjZ5fbh7ejd+2VeWFlYW2F3cWFodG1q5NXQ0dDNycS/vLq8w8jLztTZ19DY/2ZqYVxjbWtdU05ST09PS0VAQENITFJcb21lcXp289rV6XNhXlxSWmJWSUZLUlhcY/De5+bUz9DPysvS2Ofd3/Hs7mZYWV9y5d7Z0dDa39bRzsrDw8bFxsPFyMrO4XFoa19XUkxNST07Pj8+QERFRUtU7N/ez8vP19jU3O79+O5jT05TTkxLTEtLS1NmYmVsa15s8Oncz8vGx8zNysfJxsTGy87Py9Dg4uH9XV5tc3RtcOn6b2zl3ujp+2lTS0tNSURCRD88PkFHT1hgbmhldPdoeHhrX11k5+J0X2ZfTUxRWVdZWWFlV1ZobGBpbm9pau7QysvMx8bNzsrIysrJyMzV3tjg8P5xYVtl++r4Zl1dTUdIUVdPVWJiV09QWVdba3ljYGb0/V9YWVxRSUxWUlJSW19YY3v07uvf321w9Nzb6OTsalxZYnFu5tDLzszIw8fMycjL0tDKx8vT2t73X1ptal9dWlZLR0hISUhHSkZBRk1cZW3k3ODf2tHX3NzibFtdY1lMSEhDPT1DSkxPV1taWVzt3dbLyMXIysbGyMrLysvX29zh3/F6bGl5e+jd3dzZ3N7Xz8vL0NXV62VkZ2BbV1FJRD8+Q0JDSlFbXnnd3OXu6uP0e+zn7/xqX1dTT01QUFBXWFBQU1ZVXnPt4uni3NrWzcbAvr7AwcDCwL/EyMrJy9Tc7m5eTkpOT1ZbXFtVUk1QVFtufGdgXVxhW1tcXV5aW1tVUVRRSUZJTU5OTk9PTE5Ya3rt4ebocV946d3Y0s3Q0tjg3+Hn4ODf1czGyM3Q1NDP1M3LysrLz9PT0tTZ2NrZ6HBtZF1XU1BOTUlHR0VGTF1mbunh5eLg5+x5bGRmX11XTUhEPz9AQ0dLUFVbV1hh8d3SzszJxMLEw8PFx8rOz9DSzsvO19na19fW0tbk9Pzq29jSz9ne7/fwcGxnYF9aUlJQTU5RTkpMVGBx8/FxXVlWWF1iaXZzW1ZWVVNRTk9MSUlKTlZWWV5eZ/va1c/KxsLBv728vr6/wsbKzM3Q1NXW2+x+e3l9/+vX3+Tc2NDO19/k39ztbmhib/ZxZllWW19hYF1bWVZSTk5SV1RNSkpKTVFbYl5UUFRcW1loevfs5t3Y0M7R193k28/JxcPBwsPGx8bBvb7AxsrJyMjN1eDofWJfa/b5ZVRTUk9NT1NaWlleanrk2uD0Z11UTUpKSktNTExIRkZEQ0JDRUhMUFhgZ2lyduXbz8jBv7++vr6/wMDAwsPDw8fMzMzMztXc3uDY0c/Ly8rNzsjIyc3V4nBbWlhST0lFQDw8PD5CREdKS0hDR0pQUVNUVllaY2BkXVFOSUlOWWh3/+Pf4NLNyMbHx8zMx8G+vby9wMTHyMfHys7Q09fZ1trzcGdfXlxeY2RgV01LR0E/QklISkxNTU1PT1BPTk5MTU1MTE1RVFlga3jt7Pjq4t7k3dDPz8/R09HP0NHOy8vKzNDW1tDO0M7O0dzo6etzYFZSVlZZWlxXV1BMTUxPV1tcWVVPTVFZWlRSU1FVUldkYGBpa2tqZXD+dnd573b+3tzf8G5odfHk19HT0c7U0NLV0NDP0dXW2dHR2eDrbWhyamleVEtLTE5RWF9iX1xeaGFdb/Lm8mpra2BaXGVhW2VmZ29wePXx8Oni3tra49/f4NzZ2djZ5PX4/WZWUk9OUlNPUlJOUlllbmpq8/Nx8uHq/Wz99Xnx8OHj9mdnX11l9+fk3+Xa393Rz9DPztHb5uDg4uLd4exub+rd43hscnBUUVFNSkVFRkVLUFtnWlNbZV1cbOv3eHF4cF5gXVtiXFtbWGFn+uvu7t3X183JyMvJyMfLzcrLzM7U1N3j29nP1+Dh7mxYXGheVllWVExHR0ZFQEJCQERISk5MSUtKSkxVXF1eXF1VUFVdYWlsa2ho7+HXz9HQzMjKycTGx8fJy8/Sz9LW2ur+Znno187P1tjY2NnW1OLzZ2JaT01JRUE/Pj09P0BFQ0BCREJDRklOTk1QWVpeam9+8ujc3dfMyMG/vr7AwsDAwsTIy8vMz83MztTT0tfa1c7Nz9jd6nljZmZfXVNRTklJSktMR0lJRENESUtJSElLR0RHS0xJRklJR01ZaG1m9Oju59LHxcXDwMDDxMHAxMnJycvMzM3M0dnZ4fD+7eLq6e39/mdt6PRmW11eXnLu6eJwXmRhWlZfXVNOS01PTE9cVEpOW1RW9uPb1uDc2dna2NPV1tjW0NLUz87U2dra4NbNz87P2d3a4ezo6XRoZGlrYmhnX1RSUVFWWl9eX1xTVVJQVmBycmv46+HY083Q1dTS0dLNysvQ2ODf+mRsc2VaXHtuX2736Hhpb2tvbd/V3Ox4e/1lY29valtgdmBf/vl1XVZYU1BacHFmXlxtcF5p8OXf3tjPzsnCvr7Bw8PGxsPCxcvR1tfg8OPe5Xh75/Fz+ezyXlFPS0dHSktKSERGR0JCR0dISE1aWV165eH1de7xdu3c2djk/enl7eTd3dvYzMrMycfIycrMzdLQzcrLzs7NzM7X2dzx/Xvq8WZweXVpXVtUS0tOUE1MTk9OSUhKSkdHSk9LTFNaXVlXWFZPWn3Y09bQztDTzMjGycbBwsbEvr7Dx8XCyM7My8nNz9DZ5+ne3efx7vZrW11eX1NOTUxGQ0RHSERERUdDREVGQ0JESEpJTlVUVlpoeWr83dHRzsfGzMzKycbHyMbGyczLyc7S0M7Lzc7Oz9fZ1N7v6Ox3Zl9fWltZXGVhXV5jdW1cXV1YUlJQR0VKSElLS0tLTExTXVhfdffq8fnh3N/a0M3Y2tLW1tPS0M/P0czLzMvMy8rMz9DY4/D+XU5VVVJQT05NTUxNWl1VVlFQUVNUV1VRVWRZVGZtdv7r49ra6NzQ2d/d3t7j4ejl7Wlu+GVz6fPt6+7m3+nu3uD2cmttcmpqYFxbWFdYWWf2e3vv6urgemdwaltaXVhcXlpZWFNVW1dSWvXv59nVzczNz8zMzcvMzs7N09nk4+Lb5OPW2uvp5+X8b2ddWk5LTExHR0ZERkNBRUhJSk5QVVpbX1dVVFpdUk5RTU5ZV1lmcPvd09PLw8PDwr+/wsLExcfNzs/Z29bX3Obr3t7h6+Dm9ut9ZlNLSUhHRkFDQj9CRUlMT01PU1hcbW1gXmZxZFdeWVBMSk9RV1lm997c2M7Oz8vGx8jFwsDFx8bHyc/T0tXQzs/P0NbS09jd3Nl9Y2NZUUtJR0NBQEBBQUREREVHRkdHQj9ER0FGSE1NTFFdamNia+7c2tPJyMvKxsbLzMTEyMjHx83Pzc/V1tfW29/a3Nng6PlrZVxfYV5gXVhbW1/06fHsfmdeZG5scGFaVE5IQ0NFRUVFSEhHTVNWWl5hbXzf1c/Nz8zO0M3MycfJys/Ozs/KyMrOz8/U2tfZ3+x9bl9fWVNWV1VWV11dXmtcU05QVE1MTU5MTUtGR0dHTFVUWGv239nRzs7R087O19zY197g4uPu7fXq3N/o6Plpbnvo725fZGNZWF94bG5oYGJ589/Tz9PW2NXR1NLfaWd6aFpfaWhubl9RW2Ft4tXV19LS2NrO0dne3trj6+7y5eb+al5bXnz7dXBmY2VncvldWVNRX1xRWlxZW1heY1pcaV9lXl5lYWRkWlJOTlhfZGt57+fg0szHw8LCxMPDwMDDxMTJz9TW09rk7+57eXz+cmdcW1dOTEtRTUhKTEhDQkVIS09aZHL7evLrevrtdW9neu1oZHVtY15pbXPs59fNzczKyMXGwsDExcTBw8jJyMzU3tzd3t3a0tHW2tvc3/DvZ1lXTlJQSkxMR0FBRENGQkdMTkhCRkVERk1LSk1OV11XWmB1fuDX18/NyMfDwr6/v7++vsLGysnIy8zO0+h44+Pl5uDj73tzdWleX2VdVlNWXnBlZWxkX2xwb3Z273ReWllaV09ST0xIR0tQWFtv7Ofq2dXR0c7NzsrGxMTGycnT09fX2eDb3tnW293a3+jo3d3p4+Df3/RzeGxraXRmYl1faGNWVmVcU09OTk9OVVVST09RT1FeaHL559jU09jPzM7Ozc7Q0s3KysvMzdj3YGZtfm97bV5bTlJTW15aWltVWV394+Dl9nFud+nc4dbVzs3S1NPW2d/sd29xa/zs5+7t8efj3t3Z2N7T1djR2d/lfWdeZXP8e2dfXGBlbXJpXFdNTUxLTlRbV09LTExUXGNrdVxTT1lhaGVt/Gtzb/7m3Nzq7/v67ebh29LMz9PSz8vKxsDCxMXN0tvT2OTs++73X1ROTUtISkdHQj09PDo8PkFER09QT09NVl5oa2f39nzn69vS1Nje6enz4t/Uztrj7ODd2tTOy8jLycnIwMDBxMvQ293Y1MrLz9bqbVlZXmFZT0tJQT0+Pj48PD0+P0BBRkVBQD08PD9BREdKVFhPUFpla2vo2tXSz8jHzMzJxcLAvLq7vL69vsPFw8nQ08/Vzs3S0N5xX2FlYGZhT0xHQkFAQERFRD9BRElNS0xLS0hGS01PXGh3YlhWWF1m5tbV3dnR1s3LzMrNysvKzczFwcXIzMzO1s7LztfZzs7S0tPV3OP5aldNT1NPSkpIR0NDSEZEQ0ZISElJTkxFS0xLSU5t82deZXZydtvX5m1xdu3f1MnHysvHxsnMyMXDzdjR093c3N39Y2dw7/3v2Nr3ZGJaS0hMTk1HSVJOUlNWV05OWG5pX+XY4Xdxfevy3dPU19/Tzc/Tzs7a7vTr39jWzMnM1tva8Wpu6OFuYnNsXGBlalxceXbu7ODS1e9wZ1tOR0VHRkJDR0VCQkRCPkBESUpLXvj2/Ofa1dXOyMfHyMXBwMLBwcXL0NbX2tfPztrp8mxXTU5QTUpNT01NVVpWU1ZaXV9l7NvmZV9ZTEZCQENCQkdUV1hsc2Nj+uLY19fJwMnMxMHFxL++vr/Avry9vby/ydDb3+l+e/fycGFhV09MS1FSTUtWa1lcY1pTUl1pWk5QWlNLS0tCPDg4OTg5Oz5CTE9ZXFxl5tXa18rExsjCwsTBv7m5ubm5t7m5t7rAxs7a8l1eaFxPUFBOTUpPVlZVUlFPT1ZlWFFUXfFgVlNZWVhXUE5JRkZFRklGSUpTeXloZ3fd09LLyMfEvr++v8C+vLq5uLi5uru8wMvX4PxYUE9NTUpNVlRPUVpjYXvh621q5+dfTklKSEZFRENCQENFQkFGSEhJTldVVF7n29/n397d18zKxcHDv7/AwMDDxL+9v8XMzcjM3vxmVE9OT05RUE5QU01OU1BVYHVuW1BZXlxTUExKTl1qeOfs7ejm6d7n9/Lf19rf4dfPz9HO09bWy8fFwsLFxczNytHazsrP09na1tb2ZVpQTk5MS05WWldaUE5NTElOTEpQSkVHSkE+REdHUFhhc+re1NDTzMzPz9LV2OLZzsvJysvJycbIwr/FwsPIz9bc49rg/W5lYGdr+3NaVk9GQ0BCR0tOTVJOTE5STk5TVFNPUlpjVlZ592d87drPyMG+vsHCw8XKzNPSzszGwcPGw8PHx8nJztfa3eN6amx4aWFfW2Bgb3VmWk9NSUE+P0A/QkZHREJFQENJSEI+PkBETFdfduje2M7KxcPExcPHy8vMy87LycjHxsO/vsPAvsXL4uvu/n766nvt9XV+evprWE5KS0lCRUhFRUZKTUpJT1FKVWNtVUhLSklJVGPo2tbOy83M0NHO0tLQzczLxsbCwcDAwL/Gwby9xs/Q72hbXmry6evj4N3mb2ZnV0xFQkBBQj8+Pz49Pz89P0lPSEBAQT9AREhMTV3u39XR0NPY3tzh5dzPy8rJxMPAv8DEv7q7w8/O1+ZpX15bXF9u7unmc3P7b1hRTUxMR0hNTU5XWE5KVWrxUURLQ0E9Qk1RT1p34tra29DP0dTQ0NPVz8zPzMXAv8HDvLy9x+XpaFdQUlddV1VZY2lyc2j8fGFWV11YUE9LRkNISUpBQU1KRz87Ozs7O0FKSk5efODRztDT1tTb2t/Y0tvXzszJxcbFx8PBw8DL3eN0WlBVWFVZV19qXmBr83BaUE9MSEdITU9PW1xSSUpaWlhPSEI/QENHTFFdbH7e1MvJx8PCytXTzMvKyMTGxsbCxMW+wMLJ2d3waW1gZl5UTU9ZZ2hlZ1tNSEtKSUdDQ0NBQ0NHSEhLSkQ/PT09PD5AQD9ETlZu99fR0cnHyczJxsHDysfExMLCwMfFycjD0c/S2uF49fddW1xidWVcXGdgW1VXTkhIS01NTE5UV01QVVBOS01MSEJFTExOUFdZW2va08rCwL6/wL6/vry7vL2/wsHDwsPBxsrO0Njr3Nnf4fx38nd4ff91XlJLSkdIS0hGQD4+Pj5BQ0JGQ0ZGRUVESEpKSUtVV2fr3t7WycnIxsTFv72/wMTJyMPIycjOzszIw8LEx8fJ0NfU19jU2N3d53Bva15YTkxLTEtNUExNTVBOTkxKTFBNSEtJR0xPU1xf/N7PycG9v8C/v769vr29vMHDxMnJxsTIy83Q1NXUzMnP2Nja2dvY09bgZltYTk5TUE1HRUNBRkdMUU9NSkhEQ0FDRj89QUdKVXDw59rSzMbAv727vb/AwMTGyMjN19TLzNDOzMzV3OTt3tjUzs3V3dnZ39zrdmVQTU9MT1heXlROSE1TW2FfXFROTUxHSE5RVlZo5djIwb28vsHBv76+vr7CxcnO3tzR19ff9e/i2tPS2N3j+Xn46Onr9mlhW1JOUU5LRkA9PkJER0RERkVGSExQWFhPUlRWW2X93tva3NbLx8C+vLy+wsfM0NXV2eXs6OXe1c/N0dDb2dPV0NLV2uppXVteWVVTTlNTT09OUVBMRz9AREdMTVFQTU5QUVdZXmNt7NnOyMTAwcPGycfAvb2+v8PN1uXt4Ojs6PTe1M7JycjM2nBcW2v8+fJsVUtIRkZHQ0JFREJDSkdFQz88OTg6QUZKVFpOSUpRV19l+9nUy8W/vr6+xtPh9OXVz87U2t7n8Onc1tLNzMvHxsjN1ONyUklMU1tcb3ZlVExMS0pISElGRExPT0xHRUA7Ojw+RE1PWVtaX+/SysjEw768uLe5vL/I2HBke/Xd19TQztTTz8rMz9La39/R0N1wXU5BPDw/Q0hLTk9NQkBBPz48PD4+PkNGREI/PDg3O0BHTVVs3NLYzsfHx8jIx8rLyc7X5HVbUlRr6c/KxL28vcDCyc/c7nNsY27uZFlTTkhBQ0xUZF9db2FZVE5MR0VDREVLWVxOS0pFREVNWv7a18vDw8HAwsTKztXUzszIydDX3+f9fenYy8fHxMXMzNntY09IQj4/QklLRkdEQz49Q0pNTVRaVExLS0ZAQkNCSFFh/WleXllaVGDv3tPOycfJy87T3ejq8+3lz8jHy87Ry8zY0MnFw8TIzdt8Z1ZLREBBQEJMV1NPTk9WUVBdZVtXW1taVFVbU01MUV1r3s3JyMvPztHY183M0MzLysjMzMzQz83Ky83DwMHEy8zL0t7i1Nvd3vtzaVdORj48Ojw7PUNFSEJDRkdISEpOSUxPT1ZVWFtYWFpt6N3Mx8PDx8rP2+51eWlg8+PY0MzJyc3Lx8LBwb6+vsHFytPd63z0ffft7O/48XBXT01JSUZGSk9TT01IRUdKTE9YWV1v9+zf4vn04dfPyMG9vcHGyM3Rz9PW2NjYzczNyMXExsTDw8HBwsPM1trzX1hOSUZIR0lNTlJYVU9LR0RERUNFRkFESEdJTVFXX3Ht2dfS0NDR09PU19vX09LW4NTW3dXPzsvJysfHxcPBwcTHx8nLzMzNz93n6P9nXGNfWVBXXWdtXVpcWlRST1RSVU5OTE1VV1hgfuPU0snIycjLy8zQ0NXe3t3QztTa2dPX1c3Iw8LCv8DDwsXGzdHY4uXt7O9oWE9OS0lKSklKS1BZTUpKSklISEdJS0xSV1ZUVmJ08eHi2tXZz83V2Nvj8nT3c23z3NXT1tjT0MzHxcXDw8PBxMnM0tt6ZW1sY2509u1yZF5YV1tTU15oZmZbVVRSTk5XWFVaXWb37eDd3tza19nd3NfT0NLV09jc6PXs4d/c1djX0M3O0NLP093a2dvp+/lvWU5LSUdDRUtLTE5PTENAQERERklKS0pNUE1NSklLTE9f7eXq49rnbmpla/z63Njb3dnW3eHn5eXl3M3Lzs/O0OJ5bnr2dn3n5f14fXNlV1FQTU1WYF9WUlVTS0hKT1JPTlROTVNWUk1MVFlaY9zW393c2d337N7f3t/d4end3djY2dTS09rT0dbY4uXudV1eXl1cUlRSUVFRTk5OTklGQ0VJRUZIRkNCREpHTE1PT0tLS05QVFtdWFdXZnJy9Pl2a2Vnef/i2tHR1tDLycnMys7c5Pfx/PXp5eXp6vv23Nne+Wtu+3BTTVdkXlVMT1lfXVZNS0xNSklMWHVmW13o1d7q397a1t/h6+bf5/ljY3hx697PyMnO0szLztDX7uHg2eXu4Ov0aWNgW1ZcXmFtWlFNTEhGS0pJS0pMSklMTEtNS0xLT2d9+XFoaXJqWFppbmZeaW50fvjj5NvX2dnRycbIysrLy9TW0M7NzczO09TU0tnr7PxqYG/w6+z0bmRsXV9bWmFdWFZdZWh1ZWN8cH7i2tXY2OHu4eH0cm/27/Bvdd/b1c7Oz8/NzMnFxsrK0tfU3d/s8OJ7c2liYFhbXVtbV1dcYmtaXV9VVE5NUU1LT1FRUVRcXFpeX2Bea3bx53rr8WttcnP3dG/s6ePk3dfXzszMyszLyMjHxcLEyMrMzs7R1tTc7O7v6eji3Nvj4NfX3ODtcWxeWVlieGhqbmFlc/bl39na3d3h4uL8e3RqZllXXWjn3djS19XW1NTT09fU2dXO19bQ1d30++z9b25uZml7cW788WpdXFxaV1tSUU5KS0lHSEdKTk9PUFlbbvLw9W5nYVddX1xcXmhvbPTZ1c3IxMTDvb28uru7u7y8vb2/w8XI0dzseXrt5N/e3tjZ29jc6/Bxa2tcWlVVV09KR0ZGREdKTE9OV1tUVVRRTlFVWmX03t3Z19XS0M7KycvPzs3KyMbDyc7P0NTY1dXSz9PS097o9m1kW1NOSk9RUFFOSkdFQ0FARUhNS01QT1NYXFVQTU5VXFZcXllbafb37dzQysTCv76+vLm5ury8vL29v8HHz9ze6fb88Pbo6O7d29/j33pqXVxWT01IRkM+Ozs8Ozs+P0RDRUtJSExLS0xMV2d749fX19vXz9DU2dXU1NHOzc7Mys/R19jU0M7Nys3NztPV3ePkbl9YUE5OTU1KQz8+Pj4+QEVMTlBSUVNST1RST09RUU9OTlBUUlBVXmRu4M7IycfDvr/BvsHFxsnM0eLm7mtUVltSTlZgaGBha3VuaXBrXllaV09KSEpCPDo7PTw+R01WUlBPT1NZXmNtcHnw5N3Z2d/s8Ore2tbV1NPc6e3p7Ory+fjp2tTY2c/T4W/66Oh2bH7p/WtgVVRVVE5ISEtOTktOWVtpbm559OPg7v1uaWpeWFdVUVFWVk9TWV5l99jT19DOzszO0eDp+VpRTUxHQkRESEtLUFhaXXje2dXQzdDX4fdkVU1JREJAR0tGRUpRWV5mZ21x3c3HxcrMz9fY2N3y9e57a/Le5PLh6H7u6ubZ0dDO0s7R0tXe3ujm6Obb2+Xj4PxzbG5vYGJhVU9TT1RTWWhja33i2d7w7O19cmpoYFdaWFlMS05KT1NdaWV54NjY1NHV29zj5+xwXl5ZUk9SU1daWFdXYOjY0MrMz87O0dLa7HxmZVtQTlBRVl1cW1tXXuHT1NHNyMbIx8jN1dvc4O3o7Pvu6+bn6OPf1tDLxcC/v7/AxMnIy9HW19/n721wYF1gY2ZrZV1la2hpY2BbV19eYmhqaV1aUlNYU0tLTk9QUU9PVFFUWFhZbP/t19HOys3PzdPc3dTb7vhvXVNSTU1RV2fm19XMxMLBv8DCyM7R2t/0bl1RTU5TU1ZZXGRfeNvWzcrIxsPDx8TGx8rO0djf4Ob6+vDw/+jh2tPMzMrKycnGxMfO1t/q/WtyYFdQSUpPUVBMTExJS05KS0xKSUpNTlBXWVhgXFpgXV9eXnVp+Pxp7+3r6fV5fOvd0szO0dDX09LU0NXa4Oj6cV9YT0tMTE5QWGBm7+LSy87OzM3Mzc3W8nVfWFFRVFdYYPDo39rWy8fHwr6/w8TFxcPHy9bsfWpmXGlsZ21gcuXj5dvT09DQ09ns8nBbVk5IQj8+PTw8PkJFR0pNS0hKTllgY3puXl1tdGlzdH5vXl5sdPng6uje4dfU2M/Nzs3Ny8vHys3M0NTS1t/o9HBeWVNNS09NSEdNU1z84t3a0c/PyMbFw8nM09zpdF5gXFlXVVheZ25759nSy8fCwcC/wcDEy9LecFxNSEtJSEVEREVDQ0pOYXpz7Ozw8W5nXk9LSEREQ0RDRkhHSElJS09RV1plbmrz4e319+bd3dze7/twZf3b19na3uPo4eLe0szR0dPR1+Lj4NvX2d7g7vtwavj0a2BdXWZucGRofPje2dfV2djP0NLP2el+e2BZa3VdZX1u8urr6ujn7+3j2dzd6fH7XldSSUZHQ0FCQj8+PDxAR0lOZefe1s/X2tnj/3V4bVVJSkdKTUlLS0pLTl9w4uPr2NvUzt/a1+Lk6uTkdG9eXl1dYHl0/e/g2NTV2tbUz8jKzMnP1NbY09fe6Ozi5/ltaVpSTk1NUU5NVV/u2djW2cvH0MzI0NzsZl1WTUlHQ0JAQkdKSUxNUGZ2Xmb18+Ld5vdrW1ZWU0xNTEdFRkVKTU1PUlRw2dPPzs7NzdDW3O16bHFrXlVTTUhOVlVZY3Jua/fg5ezm4drV2Nze5fDu3ubv8fT849HNycrKycvGwcDAwMfNzM3X63ZnX11daWpl/Pv86e1zZ15aWF9ldG9eV1Ze/WFWTktLSkpJR0RAPj9ER0ZKUmPq29HNy8nN0MnK1tvuamhaUk9LTExKT19md/Dl183Kx8PCw8fGw8fO3PZkVkxJSElHSEtWXmVydujXzszHw8HEycfGys7Y2dPU2+Db4+7s9/nd19bb18/R0svAu7q+xMLBxc7Yb11lXU5EPj0+QENDQD0/R09XVFVZX2Z4altaW19cV1JPUlVTVU5NUVdcW2f42dHOy8zLyMjHx8nP2ePj+WJaUlJXU1djcndt8t7W0dXTzcrIys7T4un7a2ljampdbnBy8N/W1c/Mx8K/wsHByMzT2+d9cF9VWV9iZGrw4tfQzcnGxsjGyMrM0dje9mlPSktJQD49Ozw8Ojk8P0FFSUdQX2h849fb3+Lo7m7+ZFtfUEtOTk9RVF9lafHb18zKycTCw8bCxMrN1Nfg7XVVU1dPTkxLUF1iX3zj0dDNxcTDwcDCxcjIy9TY5nBsYV5sY19kdGxo8+TT0c7MzM/LyMjJztTc7HdpXFdUT0xJSkxMTE9TW2FgbvZrXnF8c11VV01OT0pGREpLSU1RVVdXW11jXWBx/Xbz09Pk4N/m8+Phfn52bmFcaPfl5+jd1szPy8nMzM3N1N3h6OrvfXBra/76fe7q6dzf2czNzcnIzM7Lzc7O0Nbb4O52al9bWlteadrU09TR0tXNx8vQ0+ZsYVxSSkRCPjw8Ojo+Pz9CQ0BBRExVX+DX2NLPz9DR1dvh9GdgUk5LSUlISE9UV1xfcPTo2Nvg3eDk6vDc1N3k5PV7ZWZtWVdUUFdrX2Xu4NrOycjAvL3AwMHHys3R8XtuXFxkbV5YWV9aZfPs5dbV087Ny8nHxsfKzt31eGpfVk9HRURFTVFQUlROTk5QVlVRTERDQkBAQ0RDRktLT1lbWFhYUU9XXl1iffTv39bV29DO1Njn7fft9l9bWFRVZ3v36+nt6+fe63ttW1hcZG7r4uHb19XY1M/Pzs7S09HT0s/JysrJyczMy9Da6WBTUlZYWVxeX2v17vLs3OHb1tXW3e1+9GdeW15cTktHRENDQz8+QEBCRUhMV3Dy4d3b2tfP2ef8X1dOS0tHSUhHSk5XZnp6fGtx/O7a1djd29nZ08/Pzs7a3dzg625gXVZQS0tXc3Xi2dvSzcrJyMTGy83OztTPztPY5f53/XxsYV1bW3Hj5NPLy8nHx8nFxcfO2t9uWE9LS0tLSEZEREVLTlJUVUtHSkxRT01QVllcfmxecXVpaXf8Wk1MVWjk521gXXLc0M3b7m907/h8W09VZnBwX1FNW3z4fXF1bvXs6+X4fujg08vJxMPExMXIyMrMz9rf3NvTztHY3t/q/Hpw9+vw4eng4uXe3d/c2uff1trX19ff4trl4tff5ujrd2daTUlFQT8+PTs7PT5AQUZLXODd3drb2trn29LvcW5daWlbW1tobmBfbnxx8Ovd1dTV2dnY3+bY0NjZ2u7y/2FXVFpcUE9UUlRidera29nSz8rIxb+9v7+/wL29wcrR2+N7/ex2a37z6t/d3Ovd293Z08vHyczP2NnoZ2twYF5YVFdQTUxJRUZEQERNU1ZhZVZjcWfw5XleXVdPUE9NSkpMS01c9fp57eXi6d7a3tjZ1s7P2/Z7Y1dXV1xl9er79PDo6O785t7f3dzY087Oz9LY3OPj1c7Q0NXW1dXa3eD3bW7p4+LZ09HRzMzLyMnO0M7R2dzd2dbf8Xf8+2ZgaGVaT0xLTlhSSUZDQUJDRUhKTExPWmFx7Onr7nl16dvc6XdvZmx0XV9oaV9XV1RYX275d3FzcPDm6eng5Xz87dzX2Njm825aXVtcXVhaYO7e2dfY0c3KyMO/wMHDxMbK0d7ydlxYVVFUWVhcZ19lb33s4NTLycnJycPCyczO0Nfa3OV1XE9JSEhDQkJDREVFRUZLSEZHTFdcYFhWW1RWW15cWllbY2Vvbl5ndXd4++Po5uPg2N/sd25kW2NjXVRVZGdua11aVllfXmvs8nFlfd3T1tLQzs7S0c3Jx8nM0dLX4et6/vpqaHzr49nW19Tb2Nvq4uZ9eGdmbm5jZ2NdXmbz5+7s8HZkWmJcXFpSUE5MSEhFSEhJTE5YW2RsdnvreXvsfnpoXFlYUU1MTVNMSk9WW23u8enz/d/g39XY3+b87ebqdvprU1RUWWFfWV1YX2h+9Pjt6trXzMrNzcvIy87MzM/a5eP4emz86vzv7fj4eXXw+O7a1dvWzMfHyMrM0Nvb3vdvXFVNREA+PTs7PD0+PkRJS1ReYWxx5trX2Nnb2tjt9Xl0/mNcWFtfXl9qbXl55NfZ5PPzd2RYVFdXWFdbX2FkY23y+3l6dOnb2tXP2Nzl8+Pf6eLd2tHO0tLOzs3W1c/c3+Lq7eni5uTs9/n05+Xg2NPQz87T0M3Nz9PP0tfhfmtqbmRpXFdYW1lYUEhKS0pMS0hKSUdHR0hLTUxTV1x43tTW1dfd2dTT1NTT2Nfa3+/w73hkYHBvdeXd29jZ2dzc4uj48WdRV1RQWFVWWFlbYOnW1NjXz87Mx8XBvr7Bx83V1tXb9G1zZGRiXV5daPj58d/X0s3NzcvN1tHP2NbX3djW2eX5cG5bUlFPTkhGRURFRkhMT1JUXWRs7+rj3drY5fpzfHh3YFZOSUVKTVFcXGb85ufd2tfS083LysfJz9rg7G1kYlxbWlpcaHr94trR09TX29vb2+l3+3pw7+ze2d/j4tnc2tjU0Nvd2dPT1t7g6frp2t3d433v7+jm8Hp67/Xs8Pz2e3Z3aVdKRkZGRkhKTktMSk1VVV5TUWBfbvf6cG5ubfrf2eru9O/h3tjf++N2W3fzeF5XWE5OT1VYXl9fb+3m9fbj3tzW3tvY2+PZ0ud9eFtcbuPp8N3Xz83HwcLGz9HO0tjn8F9QSEJFTEtKUF7t3tzX0NDMyMfDxMjIyM/j+mlbXVpWTklFPjw9QEFDS0xLT1RaW11XT1VSXn7u+21weX5u69zr+G5jbGh+fW5nXFpWae7x6OPq49rd2NTd5vplYF5aV09JRklLS1JbZG/z6/Ln3dXQzMfHxsHAwsTH0ePvdWddaGxnYG1rduPY1NTb3Nre73Jta1hPTk5OVWFeXmvu49rV1N3m8O9tW1lSTEdGSEM/QEBEQD9GTFFccu3b2dTMy8zO0+Z9eV9SV15cWmJkYHF8+PDk3d7i4tvc6/RnXW5lYHLwfXrl4ePd3e3s3u16a/j6ZGZ06+rk39zX0NXY0tPS0dDPzs/S293Z2ul69vpwbffq6NnT0NDLyMnIyMzV3+1rXlNHPzw6ODk7PT9CSUxUb+ze2tPV29rW1dzn5/t1eWFhZ15PTk9UV11x+N/V09fa1Nfc2+P8b2lbVF5gV1ZWW19z5tXQz9fn3tPZ7nT79fx+7dzZ19HMycjIysnL1uHq3+VvXVRZXFROUF7+eXzu8+nX1s/Iw8HIzczOz9HS1uTqbWr/a1pcVlBQUlZVT05MSUxLRD8+Pz9ESlJbd+Pa0c7Gw8PDxcnN0dro83BeW1FKSEhJTFBcb2tv+url2tDQ0dPa3OHj9WVdVFRSU1BOWVZY8tXNysbEw8XGxcvOz9Xa4uZ7/efo6Op8c/To5dzg5uZ7e/jo3t/o/XR29t/d3OLl3d3a3el0eXRgYmFaW1VOTE9TVFNTWVteYmn57N3e3NnsbF5ZVlNRTk5PUV1v8fL15NjOycbFy87T6PdyXFJLSEhLTlFZXWFaXXrk2trW1djU1NDS0dfl5+v5cm1v/ufs6+jdz9PQzM7Q0dbe5OLpdGNfXGBqbnx+/e3c0c/OztPV2uDoaFxQSkdGRURHR0RBQUdNVFdaeeDj4NXSz8zNztDR1dvc4N3n+/dtam5ka19WV1ZQT1FNTUxQU1dhY2n88enb0s7KyM3S3eLoa1pVVE9MTE9VV1pnc/7d0MnHxsPEysrM1trhe2luUUpIR0xQU1ZXY/Xe2dLIyMXHycnUzdfd2u38ZVhQXFpNSERJTU5PTEdFRUdJS0xJSk5XWlNYXGB42tHV087JyMzU5dvUz9tqam7velVVZ29bUlRYXVlTWFtgYFpaXF1VVF5qa27v6Onx4dfOyszP1Nve5NnS2t/l/3dudWpdYGFbYHzp5uzg3+rr/mt0al5ja2lpb21rZ2xybPHd3t/i4unyeHdlW1hQTUtJSktNTU1QT09YaG/x5+jn7uDW2d7g6HlpY1hcXVhSTVJcbH3v6+vd3N/a0tLW09ff2Nnc7nplWFlaXV1XXlxSVldYX15fZ3b65djOzM7LzM/P0NPd3N3d3PHt6nBdVllaU1VdXl5ravPf2NHS1NTb2Nvk4+F3WVtYVE9LSklISklHSE9TVmJt8+v19erl4djUzs/QztHZ2tzh72ZpZF9jX11cXF9aUVBUUk9PWGd89vzy6ODVz8/OzsrLzs3M0tze4OHi3uj7c2pnZ2xqeP34ffLe4/D+9u7t3dvf4eLt8u95Zl5cXWNr/e/d2t7l6ePo5tzZ2Nzb43ZuaW1mXlpVVFBRTlBRTEpISE5QVFlh9+ni3tTQ0dHSzczKzNPZ4+18/fr5dmVfY2RiX1tZVVNVWl9u7OzueGdkaHr5/W1y+vvy/Prr7uvi2dHOzMzMzM/Oz8/OztHY297f6/p1Zl9aV1lUVFtYVVVYXGz56Nzf3NrY2+Hp9XBfXmtwc3txYllSU1ZXW1tUUlBSVFNVWF5fZHzk39jS1Nnh5uLf39/o6u7t9Wx5enNkXmv6+nv6bmRcXnbq4NrZ2NrZ19vj83pnWVpgZ2ZubmdeXGFjZf/r6eTe2dfW1NPR1NTOysnKytDe8P1uZ2tnX1pWXGdsdnZwbGV57PLu6vZqXmNsbnR5dnRrZF5XT0pHRkRFSUtNUl1fY/Dc08zHxsjLzM7Q09rj+G1gX2hubG5eUFFVV1dbX19jZ3R89uzt8/Do5d/e4t/k9/nr5OTm5ePe4+Tj7OrteW9raXjv5t7c6/3x7Ofg3eDqem1lYWZjXV1ka+/c19XT2d7b1tnd4N/m9vv7d2xnXlRST05OTU9QTklHSktNVF1qbW1peu3g3eDl6OLa2NTQ0dnh29fY2t3g9nNqZVxaV09RVlpka3P8+35tevT5+eza2dvb3eXt7X52b216e+7h4N7w+Obc1tPNzc/V2trf4PRlWlJRUlVdYWNdXmZu/Hh69Ph5amplamtoeOvf3t7b3ODwd2xiXFVRTk1MS01QVl9kanr16N3Szs7W3uHq8Ozj4+bs9/16dnJoXFhWU1NXW2RtbfDf3uLe4OTr6uTs+/f1/njz7e/u5+Tn6Onp6+3t7ezw/nt3bGj97nn35+rp5uXn+G1qaGR5+PDg5eXe2d3g4vpuZmJlX2hza2Vqb2ppbm1rZGBbV1NOT05OUFJUU1ZeaW5w7ezm3eDe3+Tf4uLf2dnZ19jV0dDR1N3xb2t3bmBgXFtbXGZkY25pa/zw6OHc29zf3d30a2VgZGNfYWVkZmZkaGtvdHX1593Z1tXX2d3j6fX59vnp6fTu+frq6+/t6/bv+Pv19+7y8P337/5wXVZXUlFOTUtKTVBQT1VdWVxtffvu4N7c2Nrb3drb3drY0tPS09fY1tnr83ljY2RfXVldY19bXmFkYl9faHD16enm5ODj7O7v9P/97e7t7Ofj4eHf3+Di7PHzfHZpYmhmZWZdW2Z0+OfZ1NHQzczO0tjnZFRQTUxOT09QVV1jbfj67uHg49/e6PhuXVhVVVhbXmJ0/O7q7Ozk3t7d3ebk7f58/3j/9/rx63ZsYFxfX2RjbXFy/ezq+nZ2X19jaW3349za2trc4NjY29bSz9Pb4+n48vtpbG5peXju5OLc1tni5+50al9bWFZZVlRZYWJx/nRsZ2Rtd/jq4NvV2trX3d/f5+/we2teXGJeXGNgXWl7/PPp39zc2dnpc2JYUE1NS0tOUlRacO3q4N3j49zf6Ofp8H39eXhwfPjx5d7e19HT1dXQ0NLU2ef4cWFeYWNmaG9zeWttcWhnbGNpevl9evr+ZF9sZGBqc/Xf1c7Nzc3P1dPY397j9HJfVlFTWVteZmpueX18d294+m5paWJZVE9NTU5QVFhdYm3s6fr3+f3v6eHc1tDS19bW3u/3eGVfX2BcXF5eaPvv5+De3d/i3eLg3+bo6fL8fXdsZF9ncm9+6evv8ntiW1pVVlRaXGfq5uTd3N7g3dra1dDQz87NzMzN0dnj6O97ZWBbWlpXXmFkZFtZVE5LTExJSkpLTVBVUlBXWmH82dDNy8vNz8/V4e9yYmNpa2737+Xf2tfY2Nnh7fvu9Hz6fHhzcHFlXVtVVVRRVFlZWFdaWVpcXGBq/unl3NTU2trY3Ofh2dTSzczNycfJysvO1N3o9HhtamVkbGtsdm1hWlZYWldaXVlcXV1cXllVU05QVlt3fn71dW90bmdqd/fp493d4Nrb6O3n+nhvY2NicO3m2tTS09vg+mVZT0tISUlLU1dYWFtcXGBu8d/Uz8/NzdHY3up7+e/l4N/b3drT09DQ0tzl7XZwdG5jXnD17+fsemljY15gc+/q4tvW2N7pbFpQTVJYYmpldHZwamt4d/r5+PT57H5pb3Bqb2xiXltZWFlgbfrn3uDl5+z09HNpZV5dXF9obWJYU0tMTU1TW2j35d3U19/g3dnb29rd3d7i3tfOzs3O0dbb2dvb2tze4eTyZl5ZVFJUWVdbZGx88evweGRfXWJuefXq4+fx7ff77evh4d7b4d/a1NPQzdDX6GxeUktHSE5TVVtgXlxdYmJiZmJgXVxcV1NRS0ZDRUpOVVtq697Z1M7NzczNzc3Q0djc19DOycbJzNXe7XlrZWRu9P/79XBoX1VVWVlXVFdgZWJufW5tamd38OPa19PT297b2tzc4OPj7XFw+evj4NfU2N/xb19WUVBUW15eaGlnb3Bwa2ViXlxgZmVqYlpXVE9MTk5PUFRdXmJ3+ezZ1dTR0dHQz83KycnJztHZ+mZfWlpfavvy7urt7eLg6OrscWJfXmZkX15bX19eYWhqbO/l6uXd2t3h2+DxfnRnZ2/239rX1NXU193i63r14OTr6+/9dml2fW5iWVRTT09TVFJSUVRXVFJQTU1PT1dpffPr4tjY2tza2dbSzMbFyMrN0tnvbGFaWVtcYWRiZGdmbffo5vR5fG9vbmZiYV5cX15fXl5hbvjm2tTNztHPztTZ6PbvePXp6ubq9v7/aGNoZm139+rk5t7i7+fsal1XVFNRU1hYV1xcXl9cXmVgXWRx/O3o4ebn3+Pq6uvo3tTPz8/Oz9DT3ez5b1pSWFxaXV9jYF9obGReXV1fa2poa2ZnXVpdXl9gXmn75dvT0NLP0tPQ2Nvc3d/f6Obg6Ojo9PtsY2NbW2Fqcezp7ePh4/1iYFxZV1pYVlpdX19fY11daGZt7trV1dfV19zc7XB6+PHr4N3d3dvX29/j7/huZmxwenJuY15la2pjXltbX2ZiXmRhXFpebWtkXlxcYHD26OHm5uTb2+bu6N/n8uTd2dfc5efrfGVfYV9eavrn3+Hf3eH/cn59/G1lYVlYU1JUVVVSV1pZX3bs8eja29fT2d7i3tvX1tLT1M/O0dTU19/r9X308+x4aGdcWlNPTUtNT1ZUUlRTV1haZXf3fHR19eXf3N7c397a4/H5+vXu7O3s5uHb4OXj7PhsZGBeX2JrZ2h68/1hW1teZW1jW2BfXGBnZV9ZV1lXXGh76eDj3dLNz9nb1tfW0c7Pz9HT0NPZ3OHq83b/7ujs/mxx/W5fW1hWU1VaVlFWU1RWW11gbW1rbunf3tjX3Nnb3/JwbXZvff9rbfXt9PPr6vn//HVvenNsb2pmefbxZ15hZmFiYFteXlpcXF9ZUFBST1NeaH3u8eba29zm49XU1s7Ly8vLzc/U1t3q7fZxeOzufnF1+3htbmhlaWNeY2xnZ250aV9hYl9dYm786+fk29rf5u34eX368PL/+fDk4OTt7Or1eG5++3JtamhvdG9uYVhTT01NTE1XWlteX2BeW1paWml69+Le39vb3d3i5t3d3d3c19DS09PW19rf4fR+9/h3eHF17vD8bmdlYlpcZ2345Ofq7Ph1aGJnXmR57+fk4eHd4Obl5Nrc397f4OTh6nxte/h9/HBkYWVjYmNsd/f2/XJpYFZOUVNUWV9cVFJSTUxNS0xSX2n8497c293d3dbT1NbX1NPS0tfb3NjZ29vg7fLq7vXt5ebuc2RcV1RTUVxv+Ofq7/j3dmhiXl9leuXq6OXn5ero4NzX1dbY0s/Q0NXb3tna4e58XlNPVFBSVVdXUlNRUVVWVVdm9vT3e25fXVpVU1FPUltlePLu4uj56ODZ1tve3uHe3d/f2tza2uLh7Xzw8ffm3Nrd7W1iV1RXXGJy8u3yb3F0bXFjWlxpfO3e2Nnf5eby9url497b29rT0dfc29bU0tPb6313bWt2/mteWldQTVFTUVVZZmxkXltXVFRRTk1KTFBTWmJzfnJ2+vjp2dnW0NLOy8vLzs/Q2N7j+GZyb2Fofen1amxmWFlbWGD+8Orv6+v/9ef4bGhjZXj26uHg2t/p4+fs5+7z4drW0dTV1t/i3uTk63dwcWtq/fV4XlZXUlRXWF5idfv2+vdyYmJeXFlXVU5OT09TXmFcXlxhamz259/V0c/NzMzO09rb3+vn+/nwdPrzfHdmWV5fV1lo+Ofm5d7e4N3o8PpiXWNkbXr+7vB99fp79nxve+jb1NHOzdHT2N3c3OHk5uzr6er3Z11aU1FRUlRUWWBfY2ljX19YVFVXVE9OU1lda3306Oru6O3o4d7Xz9TRztLU2Nvc4+v3/XB1cWNjXF5jXVxYV1dZY3nv+ejg497d2tzh92FkbH7t5eHt9+3u+m97cHHp3NTSzc3U2NvY2NfcfHt9dGtjX1hTUlJRT1NYXGBkZ2xud21gYF9eXVZPUFZbW1xnc/79fvvs5uHW1NTQzs/Q1tnX2dre8Xb56vRqYWptZ25oXmBcWmFicn178uz569va5XtrbG/16H5t/nNtcmxqa2hv+Prc0dHT1tXV19fU2Ovw7evsa2lpXlxYUVNXUU9UVl9iY2tiX2BeWVVTTk9TVlZNV2diaf7m497Z08/Szc3OztLV0s/V39/e4Ofu+WRqeXB8cGhjXlhVWVppb2pvbvPf4u/9+fz29+vsfPbr7eff6e/m8vnp3dvd4Nrb39fY3d7f4uh9bGtaVVlPT1lUUlVVXF1menBhbGddZV5YV1NWVU5PUlBUXGT+4+fh29zV09DQ1dva29zU2N7Y2djb4eLsd3l8bH7ycG1sZ2ts9/JtaXF3+ePd5OXj3vNx83xtZml1bHRubGls9unc2NfX2NLR1NTW19vb5/bxeGhdWFlXVFJVVVVYWF1XUFFPT05PUVBRVFdPUFVVWl5z7unZ2NrVz83Pzs7S19nX2tzb3uPj4en7dHxpX2ducm9uZV9kZGBjbGpr9eTd19bS09fb5e75/Xp89nz9/nNscern6ePb3uXd5eTf4+Hw6+p9ZmtuW1pYWF9aXF5famNYWFtVUVVVWlxYYFtaWVBPUVdZZnF85uve1dPR0dTX2+Pi5erg3t/Y2tjX4Ovs8ndwaG36c3BzbWtgXFxdYnb169zZ29nb3uV2aWx2d3Bvbm5rbu/g2Nnc19PV09fY19nb2dPX3ep6dWhcVVRYVVNWXFpXU09OTk1OT05RUE1PWVNPUVRZX23u7t/a2dHMy8vO0dXb4t3d493d2dbU1Nrr8XxoZ25kef1pamFbXltWWmdy6+Ld09nX1t7i6Hx67/b463v282335t/b4eXe3dzb3t/Y3NrW3eHscG5lW1haWFdZVlpcXltUUVdXVlhZVVhaVlVSUlRQT1JXXWxzbu7b1tDNzdbd3+Hg3NbW08/Pz9HU1eNrZnNpZ21tcGZiaGBdW1ljdPfj3N3W1d7g4u3y/GxpaXd7ZGh68enj2t/i5NvZ3NbW1tTT0tfV2N7wa2ZkbWVYVlNUVlRSTk5MTVBQUE1QUU1OTVZYUlNTWF56cXHm39LOzMvP0NPa29bU1NDU1tTZ19v0aVpYWllZWVpZW1lcYFxpfu/e2NPOzM7P09rZ3unvd3V8aWh1c+7f5OPk8e/n5eLn5+Lp8O7u6e1zcG1ia3xtZmRmbXhpaGJdXFteXFhZWFBOT05UV1JOTVFVVVhdbvnn2djW1djg3tve29PS0tTV09bZ4ftqZV5dXV1laGVkYGdvfezb2drT0M/V1tbf7On1ZF5dUlRYWmrw4d7j3Nve29TW2djX0tbc2uDv6e90fPh6+GtfX19gWVFSVFFVVlFQTUxNSktPT1JaVVBTVVlcY3zf0s3Oz87Q2NbY2dbS0dPY2dzj6vFsX2FeWVRVWVxeXVlbYmr+5N3W1tLP09LP0tbf6vtpWldVVl9n7tzd2t3l3dzd29zi3uXv7PD1+GttfHB58f1ybWd2fXJ4ZV5lX1xbXFVRT0xOUFRXT05LSExQUllo9N7a19TU1dba2tjW09PX2N/e2OT57v15+mllX19jXFpfZWj859/Z29XU2trc3tnbd2VfXFpTU1lfbvjn4tnb2dXX09HT0dPe4Oft5+14/vPu6O73/W9oXl1eXFhdXVZVUFJRTExNTk9SUU5MSkxMTVZebuzi29jY1NLT0c/Tz87Q0tfT2uLg7nx9+G5jXWBsX2BpYWFqcfLo39zc2tfY2tTY4OdsbXRmY2JsePv65N7f2dzd1tjb2eLs9mb99Wpv+G726nrxeXvxZ2jy/G7/a2dtW1xWTlFPTFBOS01MSUtKSU1NUVtZbe3s2dbXzszNzdDX1Nnb2dze3eHn4evs7nLz/23r7PDn7vjr4+Hi5OPd5ubl/HxnXmZgXmZqa3Vscunh2tbRz87O0NPa3eXp8nFueHb//vry+fV6bG5oX19gXFxXVlZQTU1PTk5LSkxLTk5NUlVWV1ZYam/729XVzs3MzNTV19vW19/b3OXk7f/1b3p8ZWX29Pvp8ePc5t7f39jd2tfa4ufo6exzZnh3eWpbaHd2+Ojc09Tc3uXt/Gdz+Xhkb+ns8Hv16erg7e7d5PN7+u74b2NdVk9PTEtKSUdESUxKS0xNT05NTlZdZXvd0s3Mzc/Q0trb2djU19vV1Nve6e7k5/F96uTw8+DY29vc6N7g+P99+HlkaPz7bGZnYmBfXlxp6uzfz8zNz9HY2dzs6OTi6vbt5OX0dXZ4en70/Hl2ZGNua2plW1FPT0tLS0lHRUlLTFBPUlBSVlpeau7q39bT0NDR1tze3d/g3tzo5+fq5XZ69f/xdPDt6ODe19PP0NbS3Ovg5evo7PPm3/TnfV1mYVtZYnby5eTa29va6vFwa/Xq5+Te4NjicO14d/3+eufd7+fkfubk9HFeU0xPTUlJSEdHSUdHSkpMSUlNWF9n/O3e09HR0NDe3tnb2d7Y2tXZ7eHn7N3zee/f5+bZ6N/O0dfW2/D/d2xgW2hibnlz4P50+FtbXe5o+dnr1c7V0N7g6Xl5+d705dfe5ff4aGFqXGV783j5/nPs9Xt6Wl5UVEtLTENJSkZKSEpMTUxKWlde/nzr2tDV1tLd3NjZ4eDg4d3n8Pxm9Wti+/He4t/g6tzVz8/N0NnS2d/rdW9s82155+3gfV5scmxp9vDr2NvV197d4vdweurn6dzZ5+zpe21naWFs5/Z3cN7icOTtenVnVk9USkVGRkhHRUVERkRERkpPUlpu29ba1dvW2uHf0dDe2c7R1tra72309m7k1dzm2tjd287S287S3t7QfFv5W1NwbGPw7Vt5+1Fx42Xn09zTztzV1vTd2njl1+vk3tzfbm73XFvxX1/o/GNo5uxsbOluWPNdS09PQkBQSkFLTEVKSkVQXE5q3W3czu/f1ffo2N7U0OrZz+Tf5vf5Y23qeuTN4u/X3d/Yy87e1snX6s3gWnrxVFjkcVloZlBXbGnk3W/dzvPdznD31XJ41ujXzvrf1Gtx625tYX7U7XnQbV/W6GZq4+hbWV9MRkxFQUZJRkJISz5FT0pUZW/359XifeDhZ+PY3tbPy9XXzeR90nZX4N/l3NXT7fnO3GfMzPzXx+Fo399YWO5kWujiU1X9ZVD40/h2y89o1cxuZs/eW97K4t7N5F/h7Fdc7F5h3+9s8+dzaft5WXTfYFhqVERNUUFBVk8+S1tBQF5aRGLYaWjN31ftz11ay9BszsLe3sjlX93bVf3N4e3M0enNyubax9bdy8vf2tZlYeP6UnzaVlB2W0158Fh+zO9s0eJba9xda9Dd+czI59/S+V/l+Fnq1m5m2Ohe6NteYt9jV+DnSlhxR0JaUD9MWD49UkU9Um5IU9LyX9TXVXDMcl/Hyn7LwPh3yeFQ3dFb+MPabcfI/cvC8N7C1v7LzGPrz2FU2upO69BOTNRvS9/NXHvC2lLP0kpfzWZTyM9dzMhad8h2TNbjTuDQUFnQX0nS7ER22ElX1U5I31E9XF08TG89O2dGOmJ2P13KU1XI7UrWzU72wudrwc9O1sdQXMlgTsjOVM+/edy91XC/x2nIwGbewmFXy3RK1dpFXNZNUs1qTszNWN7KU1jRX0va1Vjcx3tpyNpd0NhO9spfV8v6TNXZSGXVTlDUYEnb50ZTb0JFZUo8TUo5SFk/Q+xfSeHbTfPNXlvL12TIx2DVxmxjyvhM1dVX38px38HQesnKcc7E/N/C22bM2k7c0lFc11dL3OhLe89fZMvsUNrgTWvYX3DI0GvUyf7ryelf0dNe48xfZNBtTnRwS1jhW1Hc9E9sbUVMbUZAVUw+SVVAQVhQSnTyUWrZamnX3G3OzHLnzPFf1+JT59FaY8vkXcvGddzE4vbHzvLNxOLgyeZc1dZWZdtaUOR0TvXZWm3QelLi6FFq1WBoyNZqz8tu6Mz9b83UXt7MXlzUb0tfaklY41lT3/VRaPFMTnJKP1FQPkhWPj9TTUZj7E1b1G5a0M9o1sl6+tDnWuvsT2XQblnQz13XyHLpxdFzy8Pi28LQbs/NZfDLcFPh3FJd5FtV3OZP7M5UVdB8Td/OW/bK5mDNzVTty3z5xthb0sxZaNVYS+14S2TVV1bQdkht5ExKaUw9TFw/PU9HPE5pREzcbU3f0WPewuBjzM5S8NBTTtPhV9nNZvTE0VvVxeffws9tycN+5MTkYs3OUWnSWlDZ+EhtzlNV0ntV29lQaNF8X9DOY+PGfFnV31fUxu3vydFf5s5VT9R3RmnXS07VakVm3E1F9VU7Tnc9PF9GOUxmQkjYdEvgzFliwtZazchna85yR+nPUVzI5E/Mx1/lwddoxcRp2L7aYMbJYtvA+FDP101pzllG39lIW8v8UdfRTV7I9U7QyVhix+pM3s5R98TkXcfFXXXGa07e50ZV0VZJ3NxLWtJaRGNcPkVkQzlMUTo/ZE5Bbt1MWs7oV87JZOfD51TV3ElY0G5Tz8tm4cHb+8TEetzD2O3Hyu/dxdX8y9BceNVbUOplSmreV2DN21vd0VNaz/9U1c5o6svpVOXgWGnR5mzMzXDgz/5V82BIWfNUT+JtTH7fUlHxTUFSUjw+TD46TlhGVuNcUd7dWerK41/Ty2T40V1J++5LZM99XczK9M7A2OzCyebHvtbdxtTkxMX84sv7Ved0RlN7UlbU12Lb01ha1fVT39JccsrYYNjbU2bR/GPMzXfYyvly0e1LYdtVVdt1TmjrUGneVUdaUT0+ST07SUhBVXVMU+RhUejZbefL82DP0VNd2ldN3eRT9Mjo8MbJ6M3C2drByubMyPv0x9N+0NhWZd9TRFlWRl3ZY2bK0Vrp0Gxj1OhZ5dNr9cz5Wd3aWvjP73bN02Hlzn5f2XtN/ONOUO9cSmv2TVN7Tj9MSjg+UENAXFxKY9hhW9HZXOrQZGrN7FLu3VNc231V5dtq28bg7MXM38W+zsy+0HfPy+XdyeRj0ONNZfhLRnV6TmvYbXDT31nazGBZ3nVS2dtPZ89rTdjUWuHK43rN11vbzlxf0eFU+uZKUNxYRW5mQ0tcQDtLRDpIVj1G9FJL2t5a7Mz/W9XfXOPgU2XO7Vbj0mP4x9d4yMj5z77P1r7E38vIYu3F5VTS1V/12FlQ9VxNfuBYZ8zabM3I+ebI/lPP0lnzy35by9RR58lhasXfT9fYUm3VZVTZ/ExtcUlO309DbGBBUFw/PlpMOkhkQ0brdVbVzmrly3hb1fhRdPRNWtdfS+ThXu7LfmfN12zJwdPOu8d4x8Zt6MrtXs7Rat3PXFrbX0t08Ex3zvt8y89e6tRaX9T0V9jYXe7M+FjV12fj0mpm1eVV7dVfc91jWe1hTGZmR0pgT0BQUD1GVT88U1FBVN9gWtTfXtnNavHL7Ffd3Fvv31trzeBozs5e7svgd8fH6svB5e/G0Fn7015q0utd2uBTb99kUPH9X9LT7tXKcWbO5WnPzW3pxtxg0NJYb9D8UubxTl53VFDvcExn8E5W71tMb1pJXGZJRl5PQ1NOQExnSkvY7lHw1Vplzt9e2NVVYN1bTW1mUHvbZf/W6WLY0vPVx9jWwcjaw8Tu3Mjfdc7RbOjL/GDP6FFx31pg2Ptd7elYds/kY83J/tzJ4nDL21vazmRe2G1NeO9MWOZOS95yTmTqWFf+UUtXVkFIWUdAUE4/S2VNSuVgRnbVWmjJ2WrKxWX0yWBN2t9V48xkeNLrZdPVYt/N7ObGy+jRzOzfyd9c19Vb/c7qcdXvTujOW17R9VLn3V/ay+fhw8nhzMx9e87fW9zXUVPnUUZnWUROZEpN7WFK7NlPYdZiTHJdRllmSUljTUNec0tR6lRL7upV5snm9srPauXmTlvbW1LX2k52zmtjy+JP2sbu4cHN28TJ4crH//HK22fVzmRu111U23VJbO5LUuVfVdXNa9i+1fzIzlzbxvd2zvtTfOpMVfdKRWZdR1/qTGXYXVnZd0hca0lKZEk+Vlc9TGZHS3ROSdv8TuDH3eLAy/jO1lf5zV9ez/lR39dXds5pU9vdWd/I6+DC1dzEzV7ZymH5yeNX2NtP6s5bVdT2TebWWffI4Oa/xd3Nx3PvyN1c1d9OWuZLR/xOPVBYP0v7TUze7lXg0VRe1ltN52pDVHBDSntNS3dhSGHhVGTVbXXGz2DRzU5n0lNO2fxGcdJSaM50Ut3eV9rG7te9ytG+wNzMxeDYxd1tzt1MbtNRUtpURensSl/PY2fI1uXDzGjTymPexXlgyvhL3uFGU/dCRO1SQu/4SnvXTlbXVEfnXkFeaj5GZEA/b08/cOxHbs9bX8bSbcPDbtXEXlfO9FDd40533VFd21dN5HdR3dFo2cHd48TOe8vQ8cjKes7OWPDKX1nL9E3U1k3rzGbsw9newNFuztlW39Nd9dVVTvhWQ1tUP01XQE/fTk3Sd07W51Db1k5t1ExO6EpFfVdBb/NEbN1HX85ZaMPbcMboUdN5RPHlSG7RTGDMWFTSaFLN2l3Gx3PJwOjOwHrkwPllxN1Zz+dL2dhK6ddJZtFNV8hjVsPTbcLGYtDJT/jFZPDDaFPPWUPrVz5uaj9s3Udl0ExU0FBK2FxB/Gg9Vfw9R+tERdxRRc5xRc3ZTMq+aMy8XnjFU0/MaFDObknP7UXa4kP80EvmwVz0vuRwv9VWxdJIzMhV0sRVe79uXr/ZUszoTszNT8y/XtC+bN/AVFfIY1bGbUnWaD1pYjtZXjpQ6EJOzVBMzFZFzWRA2uw/ads/WNVGVNRMTtFSR9FfSM7bTsnFU9fMSV7WSVXMTUjNXEnI60rOz07Yw2DQvvTTu9fkwNxVx+FOx9FM0s9M2ctN5chMW8tOTMZ0TsHSV8XIVNjITeLDVnfFXE/PWkXcXUDrYj9j6kdc405X90ZJdktKbVBEa11DW+dNWt5VWddqV9beaMzL7MnMWdrSTXTXVWDaVlrYWVnZWlPc51jc0mvayujrzu1x2fpr2dzz19zvz8/d09Lp3drl4d7m6s/U28/S6d/1W2nmWWjnW2bhYlFlVUpbV09YVFFecVpb+F1aY1NYX1pZYltSaWFj8m1g9PVfbO9edOb96dLX9t32U2lgVWZsW2Ls9Xvubu7Y3uXa1uHc09nZ1uLe19vf3eDe3+718efh5eri4Oje3vns5+vg2tve1tDm9OXn7d/ncujkd/n7X1tlamJjWlNUVU1JSktOUE5SWFRVVE5RU1FVZmlgb+jf6+vb39nU2NrV0Nzt6fZmZ3phX3dyaXNsXWBpb/rv+/Dp6v14d2hx697a1NLS09jc09XO1tre3dbe1NLW1dLP0dDW4N7ma295aG1nYFxnc19ZXlZUXl9kX1pYV09NTUtSWVpcZH79Z15cXV1bavRxbHrs/e38cOvf5fLl3vhrYFldY11eZGVnbnb78/7p49na19/e1+d19fxv997a2M/N1NPb7PHp6efn8Hvr6nXe6enb09PV0ePc5Hrp6tra+eB3+uxg63lf/Xp4cW1hT1BKREBBR0lNTk9sXVVfU09RVWBs627w4N/X6dfR2czf2tnz4GVoeWdueHpsX2pob2dlbe7jfHnpZV9rWVNWW2nt3NjQ0M3J29XQ08vWz9jaz+Ta0NzZ1M/R19zu6PVfYm3kcPryT272XFRlbV1w+V1oZldPSktJRk1PUl9da2BbWmVZW336+u3a3HHj4P3y3Obv4d9kY2FUWFRhZV1pY2FobvJs9ebT2uPe4+x3a3ldY3VrfN3W2tfP2t/b1tbV0tfZ2drp5PLo49/q2tPl6uV9bujb593W52/o4XB35+Tv5e5tX1tTSkVDQ0RBSElMTU5OSUxQT1Bq7fXez9be09HX087Q0M/U3ul+ZWFmZmBsZWdiZWNbamxu4/Fl+mlZWGJXUFlkW+rc4tnR0s/JzMnBycfFyczLztfZ4t3X2uLl6XpwYWh2an30c2doa1VYaWNd++f9avpgT1lVSk1NTU9UV11VS1FUTU9ZYP3g29nW1dLV4t/a3eHmfHZyaF1YVVRbYVJhZGtr9ev33s7X8OD4bfVvZ11YfNz8duTh3+Pk/t7Q08/PzsrS0dXa63fh7+/k8/3u5/V43tfl697o3PZh83b+3O/23uxrXVpPSEhDQkZFS0pIRkZIQEVIRFNs7tXOzMzFxs3Nys7N1Ork3OPraVZbWlhVWVZNVl1cbXTz5PZ3XGRgX11LTWBfbHby39nY3dDNzMvGycXAycfEzt/U1vToeGltbfxrZG34e2Ro7mVYZ1dWanB96d/m6fltamdNSVJMTFdUSE5SRkdLTU5QX3Lo1MrM0c/M1trP2GV47mxfYWRQUVBOV1Rg9WBe/N3k2c7Y6dvd921cWVpWaGBg7OLp7OTZ2M3MycnLyMzMys7W197gZGJ6aG/yavni5f3v5vv5fGdubF7x4OPd0eD431pISUtGQUxMR09HRkhASEFFVFN68M/Jy8LEw8jM0dzd2+zs7nP8Xl5dT1NYTldbXVx63una1uzg9VdZUlJPW1VX62vr2tvW28jNz73Mv73Qu8zKvme9S+XjRdlH20psXPZl6mFtZE/iSeNN1Wniz+vL9t9mUVxMTU5LU0xTUlNNTkpIUExUX3nn3M3S1cbf0tha0Fn0303PQuNYTfpH5EvpWuR209/J1NDJ6s5T2UhdV0xjTGZcY+pq6t7ZzdTJzMrKxMnIxs/N3OdsYntaXPpU3vFny1TYd2DOQ8pU6tp9ymnM+tlSakdaQFJORE0/8jtVREFNQFZIUu1V1NLVx8nFysnQ0tvd4+l+Z2liXk9VTl5PV2tX7Gzd0m7fzU3d8EHQQ0jbO9ZKUME/wv7fumG21cHCzLjSwMjEzc380110WVNdSetS21tsXGhoX2lf6WXd6unt19b4+WReYUhbYTx0UEHYPFBpPM48Vt08v0fRyku4Wr/+5shO1lfnWHDu5kzkS/leTtFLyWPI383V48tlzk9xZkjlP1NSRN1NX+lZ0OHrxO/Kw/e718+93MTLbMfrUMND2NxHukfbz0S+R2/MPbxP6cc/vkba4D/EPGNUOtc0V1I51jTfRUvePdJJ3uVyy+rH0cbPzMnzy2jb417d8PFuVV1eS3BWWeZX2vla22pc1UTibz3JO2xmOshAfc5DumHNvFSz7cS6V7NdvrxNs0jJ2zy9OdJdRcE6yU1S1z/QSvD2bNVc1+3PbtT9+d1K30NdUULjPVxQQNo891s/yD3PbEq8Sb3o679RyVbee1/YZ9Nk2lrgVVfrTdVV2dpXylPN3k7HRN1XP8k491A+yjnLW2HGVr72y83Ox+DFz8DWwtDYzFrMVeTsYMZOz+ZPyEDTaUTCP8dvSb4/wVpdyUDOR1tOP1Q9UEBKSVFJTl9Oa03XXXfTfL/iyMd3xWr3yUvO2lC/S9zZQtdIVXlKXN1YWNVQ7fFP3l5M309P20LkeEXEUefGU73W5rpjvcJds/DCvmO7Y/zPY3LcX2bOTvDnQvlRQ9pGUcpD09lKvFHwvUDH4Ui9O/PeNcU4UOUyyDpa4TfEQWrTQ7xSyslQvEHI5UW7PsTlS7tFz+dJzkxX0U7a3ErCTO3OP8NDadQ7wUFf4DzGPuzoRb1AxtJPtUa9xXOzX72/d77n3sReyspPvU7jzzvAP0/ZOb9BXsg8wEF6yju8PtTQPLs320w70zDdPkriO8pC3eRPvU2/0ey3Srpr4MJCukrN2E/CPtBYVtg8zkda1UDEP+D9P8k+y1dazE3GTeL3WNlK0GbT2l+/W8bJe7f3wMBou33PzGXK/d1y3mxZ8T7oS0PgOuFQRsVG2s5KxGxrw3DexnL11EVxZzj9Qz7qOlR3Ou5gTslX5MVb2cxMy9xOv1ltxEfP6UjLTVvITvTWT8raScVgUcZFcMtGzs9Cxlo/wD1PyjjM3EC7SG64RMDDWLTa4bVr0LtVv8RIu/pNvj1uzDTJTTy/O+fOOb1aRrs/1cs8uFpQvDnPYTbJNlJlOM8/aG9KyEzH3N29WLvuZLtFwt1MuEXpyzzDSETDOtxpQb0/2thBw0Hl/EPLRtBtW8JEzVdUxz3IYmfBQ8TWXcBuzcL9w8vwx9/az+3X8uJcaPFCbEZLYDrkSFXdQcRqW79dzMpfv9z/yGD7d01TTE1BVEs9dT9bX0DKTN/SU7xT+8dMzvVXymtn0ftg2WBa31Vr2XR909Bh0NpW0mBM1mpG2GpI2lpL3E5K3FFN1Fxgy2HYxu3JxM7MxczPxczZwtNbvudNzk5IdkBE4UNJz0pVxU/YwkjE00S/ckvHQ1LNOllmO+s/QtQ+ZdxFxnxvuWzPu1TMzEzBcFPDVnbPRfDfO/NdP9JHWsQ/18hCxF9Qxj7s0EDPZFTHR9raSspMcc5Jy3Lqx1rB0tTEfL7t3cJdxPJtxU7r3UXhRkV4OmJUR9ZJ1tr1xvzC0PPBXsrsU8ZKX3s/fkQ/ZzlQUT/aRvzTTMf63sdZy/Ljz1bKe97cWMhYZNJN6vlVzf1cyeJozvtv2lNk6E1V+1JjdEx6XExvUmJXVc9tasnY2sbWzL7szb79ycFsxctb1N1TYXhKS2BGTHtGT85sV8bRW8vXVNHsTNH0R+BoQlZVPVJRPWd2R+LKXtLCfNXGcnvEXmHGX1jKXljPVU/WWkfbYUvaaU7P6VTO5E7m3Elq0Uvt00/ez0pmz0xNy1BZv1P4vWLfu2fxu1XbvErPxUHR3ELRV0LYSUDWRUvSP+DSS7/U4LxqyMVOyO9cy0vu+kRqREdKPlxCT/FH1l5cw1DU007CbF7FWOvPVt7NX/HJXXrGV+3KU+jOXm3Ic03NV0fcS07eT2joUPxTRuNIR89Obsxkz9nvx+fNym/Azem+2tDJftHv/t1a2lVO1kZmYETbSm3NT8rjU8ZXWs5Sec9cYd1JS+4+R3dBWOhWZ9DdYMvTUs3PXt3Xbvvv32hq21pu11lvZfRmSNdeScjsUs3wTe31TGDRXlzF51jK3Uje3UPryE3pwldkvnlSvvFNvO9NvupLwt1Jy+pJy3xK12dI9WpI8ulWz914zOPg4GXS+mXJblXgTkxQRktHU1hJaHxL+NhSZdF0Zs3iVc/bUM3MTtPAWum/a3O/Yk7FeErE3kHM6DzaeDzf4ULTzUTh20VrdUlz3lfu2F3T3l7KbOnFX83KcMXX9sLhbMfpYs1hVs9UT+RNTuBZVdpmVN12Vd33WNX+/9NQ6W5E6UxL60pi5Ex90FJ1z1HnzVLk0E/sz1zlzWLmy3vnzmzx0VZu/VTTVlbVSW/3R/BlS9/dXcvQWMzdTdj0UNbmT+ThV93fVuPeW9TWY9Ds9cpb0c1czOBm1Xhl2GhR4ltY2Fj91VDq1lZx2mtvzu5r0P5R+2xHVO9KTN1USe1lTW7vXGHe9Vzh3Hrd3dTb+s3Zbc/O69/NeXTYXVn5WkdcZENXdElj1mVx0PBe/+lcV9z4U+zca1fs2lNt0Hpz0M/uz8Tb4MvQX9nJTWfJWlPa9E1t8kpd6kpP4VFK32tO29Rf687xbeRuXV9oZVho3mhP2upC3tFIZdFiVczUWtTTXNrNVGnLYlfP5Vvi51JbaVZQVVhPT1n/Z3rH9WW+11DRzlVdzV1OzexK3OZFb89JdcVV/L/c+cXeV83YR9nKSPTFTV7GT1fJS0/KUEvKVkfNZFXKZWDJd1fV+0zl7kvnd0Xa/D/28z9330fjzlDSwFv4vl1Xwm1OxdNTyMtN0shFX8xKSdtRQP5eRNrbR87LS9LNRvvLSmjLS3DJSl7MSlPYU2jH7du6zeO93GDFX0vPW07KcEvP7EPo4EJo3UBb2UJUx1RNxdxNx8tPzttMz91K09VJ39FHb9dBXtJCZb5XcsFtadBXXdpOT8xeUMd8Tsb4RczmQ9nqQXvlSO7bV87MWcrCSuTDSmLCTVjJWUzTY0F3dj5mzE7fv2DZvlZ5xE5Nx2ZNxPRNx2FKy/VGzd9Gzu1Jze1Ky9ZLz8pJ8c1KYtFOX9hJU89OSdFOQNxWSsrbV8HLUMXQTM/cSs7PUsnMStjMSe3RSnfbQmXYQVXXT1bXaljTZU7Qa03N2EzZy0/uzklq20Rnz1bswdvmv9FoyOxK2OlH2NBHZ9pIXdlGadZCZM9HU8pRUcZoXr9iWsFgS8TWTMzVS8/OR9zOPlvMQU7HVVLF9VDH/EbOfT/e0kh7zUlox01awlZMwvRGzeBF089Kz8hM1sRKZsBUUcVYTcZcSchbPdr3PnTUSHjGVea/W2DCX0vI3ErO0kTc0EPhyEn5w11ZxupOzd5Ky9VIzstDe8dMU8pPTM1cSsxtQdfnPffNQ27EUe3BVG7CYU/G0kvMy0fVy0jqyUZexk5LyVhD0XZF0t1E281DeMVJXcFRVMFpXMNvSs7mQd/LSPPEWvrBc2zEb07J3kTZzkFZz0RN0UhMyVZIxuNIy85M0MpQ08VM6MNJWcRYVcj8VMfpS83hQNzXPmfNRF3LTFbLUEzHeEXK1ULZzETrx0ZyxElfwE9JxW9JxdxKw9pEys4+2shCeMNKbsBNV8FHRsVNP8pmQcrfQs3RQs7FRti/TGbDTE/FTUzAY0nC20fHzEjLw0fSwkPhwkFZxUZLyE9Kxl9Ixe1AzdY+5M4+7cpBdsZBXr5TVbvqVL7fScPaQsjSP9PMQe3NQlzISFbETUrDV0DMbEPH4UbH0UjJykfmyUteyUxUxFVOw1pFxfZHydNLzc5E39I9X80/TMZOUMJSTr1uVrzaTsXOSdTORdzKR+rFTWu+XlzDZU/LX0XZXD/ocTxx4kBvzUbvv1FlwFhSw3hXxfhOyONH1NZJ2cdS+cdaW85RS89fR83bSdPMS+TNR2fMRU3PSk/IWUjLakbK30vIy07K10fM8kHIXkTFWFnCTfG/ScjCR7/URcJJS8E+58o6xGhGukh1vT3G2T27RU+/OODhOr9MTL0/ysRCvPRJvUhbv0TixUT92ULsz0nezUp+0EtW21BU0mtXzNld1c5WccptUNvuS2rVWVXXfEtk3VBXztRVb8xnSOzTSkbQ3URnw/9Jyb1iWb3CS1vCdT/0v2RF08RTR83FU07Iy0lGztBJRtjiP0XY4kBKy8xNVcPGUVDJyVVSx8NaSOXLYU3exfJKac1xRVbS4klQz85aUNjNZk3uy3NIT9rrSk/Y0FNL8NBoTuHG2lZl0NpRTu3WZ1Ny1uZYds3M9mjSzPFRbN52VFve3V5Z8Nt7YufO1v953tn9XnTmZ1FWa2xXWeXY72zo2eJgX/Lr92/95HRZW/Lta11w5mlVXfLma2Pf0+j03tfd9/rf3XhmZ3d2W1lofmpZWWRrWmj69nxnbXRqWltqbnRhduv17ODV0NfY09bl7Ojw8Pn97vXu/n7t5+Xm4+Tne2r4/mxbW2BaVVNcaWZqdezy9+Pj6+zo3d3i6+nybG7zfG1y+3Vqbnp+/X58bWX77nh38+jrd3t3dGtraGJhX2NrYmtse/Dp7H19/HBlXmBicnVudfz48eHf3d/j3+Tq6ebu/fD4cX7v/HN77eDe3NrZ3t3d3+p8dWBaWltdX2ppcnB89P17e3Jpcn13/Wxqcmlqbnzy+nBw/H376ejw8+/k5eji4uTs5+X4cHrxcmJtbmZcXGBgWF5tZFpdZWFbW1tkY2Npam569e3j3NTR0NLW2d7h4N3vbe7m737u6uTf39ze4OXm6/b/bV9YV1hSWV9qY11rfnZxdezt7eHe5O7r8nh2bv7z+Ozv8nr46+5ya25qZnNwfPr59PtycO71eG1tb2ppdHFxa3J0bmVlZF1fa11cZ3BqY2Zz9/7z5dvc3NnW3e3q7nFmbf/09Ono7ufc1tzf19XV3NjX3/hubmBaWWZmW1xjZmlxdWhtcH1tb3VsYWFgaG967Ojp7u/r6OZ3++/78+3o6eHh5ur07nR6/XlwbGx1/mhdZ2ZhVlRXUk9TVVhWXmllX2VtYmnv7eHXzs3Pz9LV2t7ucm145eDl4dvX2dre3Nvj6Oft8O7+aF1ZVVZdX1pbWl5ubmb73+Hq5+bi8v5+cm567+jp6ev0/e38aGpwcmxqbvr+dv3+bXFyc25tfHp1fPp7b3559G9gXVlXV1ZYXGBfaWdgZGhmanHm2t7a0trl6uXwbGR88e/f2djV0c/P09XP1tnY19rm6+5sWVdcWVVTVVlYWGJfZHf//vR6d21kZGhqfvTp5Ov06eT7cXzu6+3f2+Ps4eDu+/T8al5qaGBgbHRlXmV4Z11mWlFPTlFRT1VhYWBodnVpbO7q6NjNzdDT1NXe7urz+ujf3d/b09DZ3NTa5uff4HppfftfW2BeW1leWlZcY1tcavHq493Z2uz7+Pf6fPLk4v568vpuaGpoZ33w+Xz7+nRsb3t8Z27/al5ifPxwePft9vHr92xoZlVOU1hXV2RlXFtoc2Vndvrx5Nvb3+Po+vx97t7X1tjS0s/MzM7W2NXT29/i5/9oaG5qZm1hVVVZX1hYWFtaXXb2ff//ZGdufuns8u30+e3h5Gh4eW7u3t/a5/XndWl4cO7/Z2JbXl5iZVxkbXpvZ3BjW1dSU1VcW2BgYmJedfT18/zm2Nva19DW9nHq4uvc0d7e18/W2tfQ2OPe1uL1em1mV1ZdcW1fYmlrWl1pbWNnef367N3revPc5+3f3uh49eVrXmx4Ylpl+fZ7dO94YWBgeXl67u15e+peZvF+5Wpv3+R7dfhoWVNbY1pUWWpmTlhtYmVcbubv29/faFf5euzQzNjV0M3R1c7I0tbNzNDZ1ehsfV1saldeYVdVU1pXVVVsYVNOX31iXHB7WHDZ3nTy2dDean56c3Dj3PnX3OHNT1zS4VZc2N/g41ZPa2RaVl5l8mpb8G1UU2tlXE5p6W1oV1h3e+3+ZG/p4Ovs2tv/9unW0vLg0NvdzM3O0tfV4unZ2m9c+Xz6W13vbV5sdfdfXmpuaWFu93hvbH54YP3oeGvm3XX5c/78WmT3dmHgdmJpcOl4WW7ne23p2+9obnx9XWRpeHb8d3R2Zm7uXFf5aWNfVl5hWFRsa1vn5v5yffr4duDp29DPzMzOycXIysnK0tbV1d/y5N7zZnvzXVZeYFlXX2peWmBec2JaW1RbWFVcXv/w8PHo7e/6be/4+erf1+nm5O7md3dnYmpq+25pandmZ19cXVRVWlNVXmFcWVlbY2RfZltiZGp7c3JqcvBvcHrt/XHo3drR0NHPzsvHyczNz8/a2t3t7fl39m197nJvXmrw5+F5bmvz6W5oYm9kTVReX1xfd25YW250XWFv7+fg29v4/PLm9WpsffVobHrh8+fi3eFqfmVeXWJtYmVgaF1YXFpTU1VcXVdYXl1nal1aW2NeU2L57//ZysvOy8TKysnHx8fRz9na9P7Y9fvx9+hdTmv2a3Lu82dk+m5fXllhUktMVlRVXWtgZdrka2/b6NrPx8zQ2OLa3+n05OxeXFFUY95+dfn14epQWXZbVVp3XlRZTlVWZP9eeWZZe25lc2P8WnRqUllaW/bOztDJx8zP5M7K0dbp2t36c213eGRe3/RgZVjgdmfn3/Hk6+hmWW1mX2RvYmBYVGJfUllZbFNWa2zZ0ODQ8N/a7nlV8FtX1/XO6s/nXNbc097a3OJo2udual/7XltYTU9gSltjWG9YcF5TaldcTkxUWnrg3NTKy8/KytPQzs3T1dnP09NtX3Vo619ZUFFkWHBoZXhn/WNjalZOYGFVfllnamJfX3d3aWtwauPQy8zSx8/a1u7y2/Dp3efe4O12+Hxy7WrydmBkVWRgVlxaX1tYXlpbXGdwaGD4YV95bW1sX11dYG/i2NjQ0svLz9DNzszR0tjOy+XxbHjs5fDtbHD/bfL06/Xp8HtqZ2lWUFBQT1JdVlVfW2RdXVxYVmbp5d3a19fl5tvm4vP22tri5uzd3fV85td09ntwfV5rXWNUTk9ST1JNUllYU1tmX1pWZF5aWlxXXGH94+bc0dLVzcvHy8zIzs/MzNbU4+Dc4u7n525xfHT+bFz7YW5kbH1uWl1XVmZiZ2drYnB1+2pcafL28Orb0dbd3OV77fX7c2745+v5bvzsdXp2cVtdaG9eVV5bV1hbWltcV1VcXG39bHBrZmhqbWBaWFhfdPXl293Sz9nUzMjOzczN0tfY1+fv6ePf9fjqdmlobXT+93H86vx3cW1dW11fXl5oYV1kZF1bV19eXGN8/u7n5Obk3+Pw8Obp8O7f3+Pl2tri5+TycmplYltZWllSVllWUkxLUU5PWV5ZWVhbXlRVWFdaXHrw5tjNzMvJxMHBxMTEx8jJydHU2dje4ev9eXFmXl1dYmNfZXFmZGReWlteZmhfaWhrY2Nncmdr8//8dOri5u3e2t9+9vRmX2z3cGp56enz++fsal1fW1JUVFVXWlhfXV9YWmNlam91cGpmZF9eWlxaXGBjavDl5NfOzM7MycvO0s7O09nS0tjl2trtd/TqeWdt+3FndO7xd3r7c21pcm1wXlljYl1cYmZlYGlra2txdvjt6d/f5u99dv5wd/Lq8O7e29/n6Of6Xl1fW1JOU1ZSUFlaU09VXVlWXF1ZVVZXWFhWWl1jX27p2tLPycXFxMLGycrHzczNz8/e1ej4619qc11tXFdwZmJaaHtgXWRye2lxenVnX2ttYWB2/3RwfvDo7ere5unk6vNuZWllY2Rpeftw8ers7fj/bWJeYWBbWFhbXV5damtoZV5qaV1eYV5UUlZVUk1TV1VaZuzW083KycrLx8nMzczMzs7LzdHb3dnj+/X5em1qdfb5a3n6dGZfanJnYmNfXlpYX2NbXWlrbmt07ev16N/h5fX6+25veP33/fbs6/3v4e/5fH5xXl1mZltUVF5ZV2FualxcXmFaU1ZXVFFQVFdVUVFcaWru1M7OzcrIysrJyMrOzc3MztHR2uPw9vT+dHz9b2tzc2hfXmViXGFsbWFbZ29jXnFyZ2Ndb3h4+Obj5Ovv5+x2bWlpaGh19fr48vDv8PLx/XZ2cXBubW1qYFpbYml3ev/5aV9iZ2BYVFVTT05QT0xMUltmdeHY1dHOzMvKzMvLzs/My8rO0M/U29rd4OPp6ur1+HtqaGJaXGFcX1xXWlpfZF9gZ2hiYFxhenPy5ufh6ezm7fj9+/P7/frm5ezp7vX4e3ttYWx4cGdfXllUU1pbXmVsamZfWVtbV1dOTlBOUVBRW19t7Oje2NbUzc3KyMjHzdHOyMrNzs3Q3dra4OPq4ebw+m1lYl5fWltfXl9bX2VqaXByamRmY2BgZWr+7PH28Pf8dXNybm5mZmx3+ezj5e1we/N0amh07PP9fndrXl9mb2hme25qZGJnW1lVUU9PUU5MTVBZX2396ufd2dDNzMvLzM7Ny8nJyMrJyszP09fW1dfV1+P5dGxfW1tcWlRSVVVXVVlbYl1ZZ2tjW2N4/HV+9PPy9+3d6uft9/h86Obm4eDm+XX2bmdhZXL9bGFeXVZRU1hdVlteZVtZW2BaU1JTVVBTWV9eZnbt7e7m2dPVz83Nzs/QzMrLzMvMzdLT09zd29bY3uDo/G1qZFxXWFxfXF1jbmdiZHpxX2ZzeW9y+uxzc3j0fHFsevtoZ219enzu3t7e5uHyaWVnbnB6ffx6bGdqZmVgXF1fYW1sXFtXWFJPT1NRTU5aX11ebfdw9ufY1dvZ09LV087LycnJxsjIyszP19nS09zc5O16Zl9bVVZVV1ZWWFxcWGBdYVxfbG5kbW1sa211ffdub3vv93z66+/66d/d297r7G5jYXBmX2VlZl5hYl9aWVxfXmVwblxXWFhWVVZaXVhca3psefnv8vPq3Nre3NbS19bPzc7OzMrKzs7P1d3c2dvj49/nfWhlZF5aXmNjWl1jZl9eaHduXWXu7mdsff1qZ216X1peaGpdZHr4+fPj2tve6uppXGRzbGJlcf5naG1zYFpidWZjbXBcVFhaXVNQV1hXWF9yaGdq8ux4duvc7vXe19jY1M7Ly8rHxMrQz83U2trW2Nze3+F7amxqZGBfaF5YVVxjXFtocl5g/u9rY2f7+2lte25hYnD+bWh08Pb+69XS3+/sfmJeX2FcWFpvbWJha2hfYm7tcGBdYFlVVlxWTE1YW1xdYXh3c/Pe6Ovr4d7f3tbU29rVzczNzMnP0tHQ0dfb1tTd4+Df73BqfG9tZ2FhW1VaY2FcW2NrdnP99nhre/dwZm1zZWptbnRxa3J5+uje3eLsffxyZFpeZGBeanhpamtxem9x7/NuX2JgXVlWUk9PT1dZWFdibnv97OXn8/bm4ePm3d/e28/Nzc3Ozs/R0tXY2dfR19rc3ej0eP7z/GxlbmZgYWZhXVpfY2dmY2drbmpucH5yZGhycHRsamhoePrq5+Lr5ufnfW1rZWFdZHN7cHN3fvft9/5ua2NmY15ZVVZSVFNZWFVYXGBs9OHk6t3c3t/d3uTx5NvZ1s/Nzs7Qzc7P0tfZ2N3h2d3td334dmVw9nRfaGppXlxiYV9eZGd7Z2dqa2hqb2pubm12amNmZG1lb/Ps9+/o6ntmdnxnWmRwaWVlZ/z8eHv37m5s+ndbWVtcT01SXFlWYGVubXvm3ebq39nh7urj7nfw3tfX087M1NLNzM7W1dLX3tvZ2uz47vVrdvfp73Z28PNgXWJnWVRh/nBgYnZqXmP992dfYWBbVlljZWFl8+Xt7OHefW559HBld/Z2YW71825u/vlxcnTua1ZSVFNOTVFaU1BWYWNnbunc5efa2N3u9elxavLW1NLOycfKy8rKz9Xb1NXd49ngcWdte2Zld/dsZWpwY15fZVxaX279amRl/3ltbuzvd2tqalxaXWtqa3Pr4d7o4+b3cWh3cWl1+2dkbntxcWlz9Xh2d/5kVU9UUk5SXGVeWWFybHfv6fHp7ebk/HRqaWly6dna1MzKysvMy8zT29rX29rf3ul9b3l8ePrj5f51dnVmZmBeW15nc2heX2duamVp/nBeWV1aVFdeZmBs8+Tl6+rq+G5sef3r5ufm/Pbw/WxldvL+cm9tXlVRT1BOTVZeX11gc3xla/Pz+O3l6/X+8/537eLcz83Nx8bIyszLz9rV0tnl4+Tpe2hubmtvcvrza2h1bmFgYmRjY2lpXV1gYmZlaff3cmlqaV5YXmxrae/g7/717nhpZmx1+O7l5ev4/31sY2BxeGpibGdcWFZWVVhaZnRyb333fGFv8fT6cvPtem/3+3j04NjV0M3JyczOzs/X29TT3eDi5fB97OXp7vDn5+37eXppX2JpamBdal1TVVxeWV5gZWdoaWthW1daaG387unq/nb6/HF46+fn3dnY4fL09HFobflrXWNjW1VUVVJRVVpgaHV4e3hsZ2hwdW397Pls++fq6t/Z0M/NysvLz9LV0tbX2Njc6vrx9nb97/b++vHs+Hh9b2NfZHtvYV5iX1hlZ2ViYPnr7e71dG1hXGBkZG58e2xfYGNeXWdv9+7r4+Xn7Xh0c2pobXFhWltgX15gXl9mc3t1eu72eHBraXj5fHNrcGVp+O/w7N3Uz87Ozc/U2NnV0dDT2d7l5Ojl5efl493h8OrteGpuZ1xbXmlcVVdXUVVWWFxeZnV7/nplY19dXWl1+vfw73pz8fH37Orf2t7f3OHsd3V3a2hfW1pYVFhZWVhaXl1lZWV1cGpxdHv+6Ot9b3D7+PHp3dna1s/NztHU2Nzb3tjV19zb4Obs7fPs6Ovn5ufs6O92YmVlZF9dXmFaWWFfYGp5c3dscHFscF1cWVtdYGZpZmRjYl9idPz67d/b2d/i6uz8ef16ZF1dXmBbXmFsaWlobW1vcnBtZW/69WhvdWlfXmRqbv3o39zZ0M/P19rb2tza2djX2NPV19rZ2Nfd3tzY3eTz8/5mX15gWFJWWlJQV2FlZWNkYF5iXlxXXGBfX2Fqcm1tcPzvfe3k4Ojj3Nfa5Ovr/GRjYmBbW1tXUlZXW1xZXWNoZ2lmcnh5/ujye27892hu6Nzb3dvY29bS0trc2d3o5+Le4OXe4d3j5t7e6ezf09bk7vDoeWhlZF5dX2ZfZm/78/z2fWpfXFdXVVhbW1pXVl5pW1ln9Px6e+De49zZ3ePn5+xubW5ya3lqb2pfaHBoXmFtdGFfcPVuaGr9bl9cYlxXZHTt7/Hl3uXc29jZ2djX2eHf3trc3trQ09fW1NXb2dLW4OXs6m1hXlxaV1ZWWlxdYnBraV9lWlJPVVRUWFtbVl1mb2l849rb3NvW2d3d3Nrk6+/3bF9eaW5nXWFpYFtZW1lbX2RfZGtzcXJ9fWtjY2RoZnrt4N/f49rW3d7X1NPV19bf6Ovo+O/q4+Lp5uHf3tvb2dzi4uDteGFgZWJfZm1ydHL38n1rZ1lXVVVWUlNUUE9XW1tca/Ho59/h3t3f4t/b3uHr7fpwa312dXr6+XV5bGVfamllZ21wbmpub2VbWFpYWFpmb3B37+fe393Z1tTS0M7P2t/e3enk2trd3NnZ29jT1djZ197peGVdW1pcWl1fX250al5kY1tTU1dVUE9VWFBQWWJgXvnf2NvZ1dHW3trZ2+Pq7O1tZWlsZl9nfnZpaWJaWV9iZl1p/fttefx1XldeYWRfa/fm7fHc1t/e2dPT2NbQ1+jo5+t1eOrg5e3l3t3f3tTP2djU1udsYmpgWF1tc3vz7el0bm9mWldWV1JNTk9NTE5SWVle+97l7OXX1urk1tfg4+De7nL79Pz17+bj7X51b2VmXmppYWt0al5eX1tST1VaVlphfHtx9N/d3djRzs7Q0s/V3OHc3eDj3Nfc3dvV2NnTztDX2972Z1tZXFZWWmhpbWptZl5cXVpWUlRaVFBQVE9QVF9sc/nd2drc2tbZ29vY2t/s9PN6am9+e3x1d3BpXWBYWFdZXWVnbnFkZVlbWlxXX15ibXvu7u/p29jU09DQ0djX2t7i5uPn7O/n4OHn4d3Z29fU0NLX3ux7ZGVeYmdufvvt9m5pZWBfWFdVVU9MSklLS05UWl1hbPr19/Ll6eDg3dnb2t/p6+Pk5uLe4OHu5uxxbmNdWltcaGxoXFpaWlRYXFpbXGNmaGFx/fXk3dbPzc7R0dPX19vY3Nvc3trZ3dnU1NPV1NLT2ud2bGddWVpfX11cY2BcXF9cXFpXWV5XTk1NT09TW2Vu+Ovn5eLf4OHm5eLc3N/q6PX96efp6ejqfmxrZWBaVlRWW11oZ2BgY21wZWl3bmVqc3Ftde7s7Onc1dPX29XY3+Li5eru5ubo597e3tvZ0tLT0dba3u7t7XVmb/5yZ2d0dmxxbWhjXFlXUEpJSUlLTFFcX2Jtff5+/PHt9Ojd2tjb2tba4d3a29zd3+by9O39ZVpYVlRQVFhYVlZZXlxYX2pcV1thaWNkfuPf29LOz9HT0dTW1tTS2N7c1trY09bZ3drX2+Xr5+9yZWdoXlRXXFtZW2hrXl5vcG5oX1tUT01PU1dZZXh9fevi6ff88O7r6uLi4+Hd3d/n5+Xt+//w83t6eGtdWl1cWFdaYWNlYmxzbWJkbmRdX3Bwa3jo4uDg3Nrb3uTi3drh397g493Z19jZ1dTS1NbZ1trd4ujy9fduamhudWxscWtkY2RdXFZPTkpJSExPUVJXYGVoZ21vbn3q5uLb1tLO0NTU1Nbd29ze4+Ld5O97Y1tYVFRRV1hVVFdcW11aW1hYWVpfZXD97N3a2dXV1NrX2tbS1NfZ1NDS0dLV19va3dvd5+Th4e98fXNlZmVmZ2ZnY2JlaWJhYV1XWFdSUlNXWFtgZGZ0cnRy/37/8vr17+Ha2Nra3ePk4eXq6u/48/H+eW1mXl1dW11eXl1bXGBiX1teXltcXm51fffg3N/k3tre49/c2Nnb2NPR19PU1trb19fb29nY297d6PP48Htye3NxbmdeXVpVUlBQTk1NTU5OT1RYWVdeYGhnY3nr8Orf2t7d1NPS1NLW1Nbd3NXa4Onn8WhjbWlYWFhbU1JUU09PUE9RUU9VXFVabebl6d3U2NrW09LW1NHO09PQzs3P19bT3d3c3Ojl3t7u9fP3+nRrbX5saGRoXVlaYFlPUFVTTU9SVlVZWVtfY2Fue21l/N/s9Ozc4ejc1Nre2dba3d3f3+TqdHryfmt8eWZgZ19XVFZXUVNUVVRUVlpcWl9t9vx86dfb3trW2NjW1NbX1NTPzdDYz8/U2NPS2uTd3O/34uX8e3X9ampjWlhdWFJUUUxMTkxMTVJTUVVbWVlfaG9ndOff4eHi2dXW3NTR19fW0tja2t3u8HZtbG5pXmBiYFpaVVBPWFNPUFRQTVBYV1trdf325N7Y1NLW0c7P1dPQ19bQztPUz8/T1NXY2dre7Orr+3X+cmlpbmJcW11dXWphW1dXVE9PUE9SVlNVXmNcXWZqZnnr5vPx6OXe2dnb1tXV29LQ2uPf5nJ3+3NraGdhX2liXFpcV1VYWlZUVFBOT1pZW2v4cHvm29nc19PQ09XV0NLa29LQ0tHNzdTW09be3uLu+vhrZWtsX15kXlpebmBdYmRZVFhXTk5UVVBWXltdX15bZn3+9N/Z4OXZ2d7Z09DT1dbW2Nri8O3xa2dxaGBeXlxbXmRdXV9ZVltdVlFQUU9TWV1l9ev66drZ2tfR0tjTz9HSz9XZ1M/Q0c7N1NrW2uHj5v5zdmxgX2lgWV1sY2FxdGZmX1hQUVFNTU9OTFJWV1VYWVxjdPPv4t3c2tXW19DO0tLPztTW1uP+8et1dftvYl9gXlxiYVZWWlRPVllOSU1UTk1ZXl5t8+7l19rZ19LS1M/Mz9LPzs/OzMvMzc3T2dnd6+n6a2xsXVlgZFxYYGhfX2lnX1tYVVNVUU5QU09PWmJYV2NpZHTf3N/c19rb1tXX19TX2NTT2uDm9Wt493dna2xhXmduZF9dWlhbVFJXV05OUlVSVV5nbfzr5N3Z2NfR0dTUz87U08/U2dLNztDO0tvh3+X07PhubWxlYmx9Zl1temVfbGhZVlpWUU9OS01PTlBcYFlcanpu8d7d4N3Y2tvZ2djU09TT0Njk4+V7bfjub2j8/mlobmNeXVhSVVdQTVJVTEtPUE1QXGRge+Hh29LO0M7Mzc7Ly8/Szc7TzsvM0dTY4/X1c2Rna2NnentpaGxhXGVuYF5lYFhYWlVRTk5OUlhXWGdwZm3n3OXk3Njd29jd4ODj4tjV2dza3u9++m1ka3lwb/z3aV9hXlhaXVhYW1hTVFdPTlRYVlZgbHTu39rX0M7PzszM0M7O193Z19rV0NPZ3OH3cnNlY217+fDm7W9rdnhqevtmXWFdVVBQTUpMTk1QWVZXZXt0/+Pd5eba2N7e3+v26eDh29TY3dnc9H3p7XX96u37+HReWlhWVVdaVFJWVE5OUE9NUlhVWmz++eDW09DMzMvIx8vNzM/Z2dDS2tnS2ODp+WJeYl9dbX5vc/V1YGBtZFxmbF5ZXltTUlRST1JXVlxqa2r55eDg19Xb29bb7vH5b2798O3h3eHk5ftpdfl0bPzr83R1dmhiZFxaYGBbWlxZUVZdV1RdYF1mffXx49rZ2M7LzczN0dfa3ejn3dzh2tLe9vDzbWh2+fzy6+zm4e5++u9zY2dwX1RUVU5MT09OUlZVWmZkYXbr7OXX1drb2ud89ev+d+vf3tvY3erk6Hp+5fBt/+p0Ym9rWVZdWlJYXFRRVVZRU1pXU11rXl3+5evg0s7MyMXKysjM0tPT2d3a2N/l5n1iX2JdXGZvY2L/7ffw92948f1qbv9jWlxeWFheXltbYmRmcHxw+97c3drZ4e3o7WhmdmtlfOjw8+bseHX5+27+9Xh97fVwdX5qXWdyX1tlaF1eYVxbXl5XV19cW2j9+unYz8/NyszNzc7X3tvc39/e6fT1dGJibWdjafr89N/e5ubi6fLu9mpiaGRaWVlST1NUUFJaX1lba3P+5d/j397f5uXo9XX47PLp39/i5eXk7Onqe3b5937+eGhmY2VfW11cWlxdW1xbWVlZW1pZXWBkdujd19DNysnIyMzNztXY2tve5uf5bmVjXVhbW1pievr59ezq8uzt/3Z0cWpsbWJdXl5XV2BlYmNpb3z26ufl5OTm5+vzcmxtb2148u/w83t99vp3a3F3/vl+9/j9dnj9dHRzdHtwaWlnYV5bV1ZXWFdbY2d06d/Z0s3Mzc7O0NbZ2dvc4OPp8PdyZ2loYGF28+3m4+De3t/l7/f8cmlubGFZWVlVU1NWVlhYXGpwbnnv5+fr7e/y+vv3/O7q5t7e3uDe4efs8/d5+u96dv54bGtnZGFiZmBeY19ZWVpXVlZWVFJbaW7539zZ0szKysrJzM7Q1tnX2uTr7fxqZGRcVVleX2hzfnj48e3r6ul4cHxtbHp0Y19mYV1dZmVibnd+8Ort9Ojn93L59mVkaWllbvD5+O3x+/v5eHL9fHj+7ez56+j2evbtd2/+fnNtZ15cW1VSUlJQWGVucPrk393W0NDT0tHX2tnc3dve5+jl8HtzdWxjbvv47ejj4urr5+js/GtocGRdXltXUlNXVVdeYmVsefHp7uro9P19+vP6dHb/e33v4d3m5uHm7vPw93p0cnt7fn5vcGthY2RjYF9gXFpbXVpWV1VXXWj+6d7b2tTPz8/MzNDS1NXc3tzi7PX1e2lpY11dXF9jeXhz+/Dt+/Dp9HNrcHRwa2loXlxeX2ZrcPzt6ujg4eLk6O35/XRsaWJdWl5jZ255fndz9vT+ff96c/3r6Orm4ef1/X76+3t3cGtlXVxeWlVVWFxdZXzw8eri3drX1tfa29rc4Ors6e779PDz+/f6b254/u7m4OTm3d/n6e/8cHNwY2BgW1RWWVpeZWdocvr9+Orq/Xv6/3N0fnRra2NldPr8/evn7Ojf5/zu72146+r49+z2c3B0ampuYVxdXFdVW1xXWGVnZ/Dp8OTZ1tnV0NTW09Tb2dfk7ujseGx+fWdmbmBcZ2dfbO/1d+/l93nw8mx39XRoaWlfX3V+cfnm5+Td4ezi3ul7d3pjX2hjWl1fXVtfZGRv9/R8/O92b3lyb/De4Ojg3OLn5+x+8+xzYmVkYF9iYlxea25tdH346uHl6efg3+fi4uni5O799/Pz8O7q93p8fnVwe+7i39/d3Nve7e76bWtqYFlZXF5fYWlobv58ff9+9fz+e29tfvZ1dXVydfz9dv7q4eXn4Onv/W9nZXH+/fPw7O/q5X1qaGdfWllYWV5gX2Brdvzw6+3r39vc393a2tnb3Nzd3uv18Xt69vF4a3JuZWFdW2Ftbm375+Hj4uLq7+zxfXlyaWn66/795uLq9e7s7Ol+bGxrY15lZ2BeYWZgXmFna3b9c3vz9Wxobm536+Tj39vc3djb5ufrdmFhaGFgZmleX2lmZ3V5b3rr73b85/J98+/w5+Hu9Ojl7ejd3vP37n5wa2958ujs5t7a3uTe6P95d2phY2BdYW1qYnR7ZmRuenr6fW1seHppbfhxb/3zeW7u6Ozq5+767PdlY25rZHfr6+3n5PHv7H1ubGJXVV1fXF1tbGl6d2755ery5N7m59zd5OLg5unj7Pnx6PB37up6aWlfV1leXV539Xvs3d7k3Nnk7ev0cHvx/Xbw6PP35+t1fO39b3Z3ZV9nXltgY1laYF5cZ3l3fPj4fXl9bW357vfv397d2tfc4dve8/v0aF1mZl1cZmldXmJfYXR6bG/+fm5x7O/86ePt8eLh49/g6eji5fh6dGlncHV77Ojp6uXe4uLf5/5xeWtmbmhiZXZtX2t2a2l6em16/HJqdnNpa/12Y239fXju6e/s5+9zdHhqaXV+evHr7u7n6ff483tkZGxmXl9kY2dqZWdtbG5+7u727+bn5t/f4eLm7PPt6/H28Pn98fJ0bGtkX2Bta2l89fb05t/k5ufq+fLq8/r1+//47vL++u99bHd4bGZnaGpsamliX19bXWRjYmh3/fz/+Pn77vDx6uvw7+Ph4d7d4evm63h1d2VdYGhfXWBmYF9rbGhubWZr8evs4tzqde7k8fjo6/vw7O3t5+1weuvt9u3ufnvv7fDn3+5y8ut3c/l3aWZoaG18cGN17n5w+/1paHB8c37zbWJucWRpfnBoeOvz/Ozqe/Hf7H7v7nZu8+x4fur8af3ybmdsY1xea2JcaW1eafl3bX3z+Ozd2t3Z1+f95OP4fPp2aXfzfnry/mRy6ntoe/Rsb+3r/e7g93Lo53t95+5w/+ntfuvn+/Dl+2t7/Wdp9PtlZ31mWWJkW15lYmV97/976eTv6d7teu/ybnPr7HXw3/D33uF1b25hYGdoXFtub15memZgbP599NzZ4uHa5e/j6mtrfHNs/O9+feXg7urk6/b3+2927O56//F8/u/4b2/4d2v473r65OT18Ov5c3Z3aXrrd2RocWdga3BjYHZzaXn4dfzg3uzu5et1dXRka/n9cH3m5Oro6f5pa2VeYGJfZm5rX2V3cG735+Lb1djf3dvg6e39aWdtZWJsdHB16+j77uHtcHT5dXT1+XP85u188PL57O3v8+re4+3m6fn79/1ubnVxd3dvZGhtXl5mZWVnZ2Fkb3779+rr9O7u+Xt5fHn97e3t3t3k6ubm+3ZtX11dX19fYl9fYGVsbfDj4d7f3d/i4OXv+vxwamdkZ3f+/u3s6eXu9Xtw+/j7/XX57/P07fT27fXv7/706e34+/f4em9ycHP5+H18d3p6bm1uam11aWdpZ2hu/vb+8+v2ev56b3d9enb/7urs5+nr6+//amdmYWBmaGJiZ2dlaXD95d7f4t7d4eHj6O32/GxjZWZlanBzdH74/HR3fHT16vf36ujt6+Th6Onm9f7v7PDw7vt6fP14aHn9dn77d2ttb2lncHJraXBmYWhlZWxwe3v87/j25uv38e71/e3o6uri6/jw92pmamljZmtkXmFiXmBwe3rt5+3x5+Ln597m8u7ydGtycmttcG9ueH1uePTu+vbr7/Xr5+zp6PL49PD8/e3v9/L3dHNzb2ly9vf+9PNzdH1zb251b2lwcmZhZmJhanJxc332+/Tm6fLs7vr17+/v835xbHNza2xzb3H+dm1pZ2hhaX3++e7t9O/q5+Tk5+3z7v5pa21nZmlqa2tvc3Fy/fj57urr5+Hi4+Xo7vPs7/nu6PH58fd4dXp8eXn8dW5xbGxweXZveHZwbm9rYmBfXWBudnT27evn4+Hj4+br6+jl7fT6b2pqcnBobGxmaGtsZ2hqZmlucXL/+3h6+/Dr5ODj5ent9/17cWxoa293eXt8/vjz7+nn6+ro8PXt6O3u6/D08PDz9Ph7eXNtbXV+eXBvdnp++vj+/vXv+fd+a2ZhX15kbG52e3l+7uXk5ODm6unt8vt9b2dkZ2dqbGxtbXz5/n18bml2eXB58fR79u7w7OHh6urt9XpvbWNkZ2hoZ3F3cXZ7fvfq6u7k5e3p4+To6ebp7e3t8unj8Pt+fG1qbGliYWlnaP5+e/To7Xz59HRjYl9bZHJy/PDs7ubd3ubg3Obq5Ovz+XxsYGJkXl5qaWNwfW9ra2xkZm5lYHn6bnb18Ozj39/l5enu7e54dfX/bm54fHr883Zv+nps//F7fPLyfv3p8n3t5+/u4+x7d3x4b3l+bGp5c2197+7r4eDp7Or7a2hoXl1jZ23/+fvu4uHs6eDm8Ovr9/92Z19eX11ebfxwd+/9cvz3cG97dmhu8P9v8+767+Pl5ubp83z8fWtufW1mbXlsa3f+cnjt+33t8Hv27vr56eXp6+Hh6OPl9f75fGlodW5janZmZnv+ee/j6e3j6XVsdWZfbXtxfuvu+ezi5evg3ezu5vVscHJkXWBjXmJuZmV3fmxv9HZpbXVpZ3V7bXbu9PDd2t3h3+Pu9PV1cPT7amt7a2FocGpr9e56/fpnY3l5cf7s6u7q5Ojs4+X69uv6eXx9a2ZydmZs9/304N7k4eXt/nBuaGh8/25seXN2+uno5t7g8vrzaWRvbmZnbW5qamhkaHl3a3D2+21vem5pcHZye+3n4tna5Obl6/5zc3RvdW5iYWBfYGZwd/vq5f1qcG5tefv36+Xl6urm5Obk4+/57uv3cG1rZmlsZ2f77PLw6ejr7u96bW93dHB1amd08fTw39ve4OHudH78b21xcWdpaV5aX2dgYm5xbHh+a2RvdWlt+fh85dnd4dzd5ufo/XB+8W9ocGhfZ3dqaf3veXD7bV9pfGtq8uv2++/9eubd5+jd4fHq6nRpeP1pZv18bezk9v3o4Ozu6P5pfPZoZnJvZHP09uze2/H+6O929vBvan39ZmFjXFljal9n/P1tbG5nZHJ+aXDs8vbm3ufp3N/w8Oz+bf5+Z2l+emVrdm1tfntoafx1aG14a2vx8Hd58vn55dze39re7/LweXN8fG5z7vN0fPt4+eTm8PPtfGhtdWlt+HVmc/Px7ebl9/rl6f7z8nh4e25jZG1kXF9saGv/dGdmb3JscPh9euzxfPjt6OXm6/X68PZvcHpxcX53dHh3dGtqcHJz+nRob359eX18d37v7fPm3eDo5+v6ffX2dnnz9X75/WxsfvL89Ojs+PP2cXT19HN1+fj28u3w7+bo8vTw+3R9fWZhZ2VkZmVfYW9rX2NqZ2NscnD66/P69/b9+OHi7uXe6Pfs6Pfw6fhseup8aG9oX2Vzb2Nob2ZodHVpcPN8d+7l5+Xe3u7q4Obr6uTo5+Hu/PHxenX5/HP++W1na3Bqb3htanvw/3fz6/Ds5/N78On5evV7bnb7c2t9/GxoamhhZm5nYW36dW57bGNpe3hy9evu8uz4eO7q+Hj27vXu6fN4fvl8dnl0bG9+b2l7/nd++Pn16Of2+u7vevPr+Pzq5+/09Pt1/e1+eevveP3v+Hvz631y8Ov47+v3+uzn8Hv4+m1zfWtmamVhZGprbXlzY2BnZ2Zqampze35ydPh0aHj4/O/m6O7v7O/t4Ol99ejt9vDt/G9sbWViaWdhZWlrcP77ePns6+7l5+zo4+bo5eTn7O3t9fj0+P718/Hw9XpteHlpZ3V4cHJ5fn7w8fbv7/P+/PX+d3t++3l1cHB6c2xtd3htbnlzc21qamtpaGpsamZlaG5wdXV0/fjy7/Lo5uno5+fj5ent8fx9cWVnZ2lvcP34/e/q6+3v8ezp6u7u6+r1dnx7dP/7e/3u7O/u6vD38PD5ent6+/D3efvr7Pr16u/+/H1tbHl5b3JwaGltZF5iZmZqevxvdfpvY2VsaGpwcWlw8v11+/xwfO7v7+fh6Ozk5O3n3uf8+fZyaWVfW11mZmz89f/y7n177OXm5N/h5uLk+XN8e2549/l+7uXt9O7u9+7ueW17fGxodHNxe/X08uzr/3VzbnD87vL48/R5bWZjYm5wbf7v+3dza2BiZ2hnaGloam5qZGx1bnB8/3x+8Pb77ubm5t/h5+Pk8HVtbWlpb25v+PD9/vxxc/fs6erq5er0e21tendy++7t8O7o6ezm4+7o5vHu6vpucPrz+Pbs7erj73t8cGhrcXttandtXltcW19oaGtz/ndoZmdjanBucn59c3Z6cG/87vp57u/5+fd4dfrq7Ojk6Onj6X1tcGlgY21uanz6cG17fvzw6uzs4+Pu8vx5/ezt9O3o6/n37fH16+vw8O/4e3VvY2d8/nj17O3n4+vz7+79dPz3eP75cmhpa2pudG5uef5rYGFiX2JsbGxwdmhlbGpqevf+ffPv+Xh5c3T58vLr5eLi4+Tp9PL2c2tsbWpubWZpdnFtevh7+/N5a2xvc3vu7O3s5enz7+bj6OXi4+Tf4e/z9Xn87u717efr7ufm7PLzdmxvcm9pZ2JfY2lpaGtraGtsZl9ma2docft6fft3dP319vDs7u7q6fZwbnFucXz+8uvs+nr29Xh7/nJpbW5oZGlrb371fXb48/f9/Xhz/vDv6uDf5ejn6+/o6fX98Orr6+z9b3Bycnv39PDr7fvz5+Tp7PD19fT3enr7fXn9/HVrbmxjYmNkaXBvam58fWlpbm1rcXhwffPu8fb3dG3/8//87Ozw7/D29e3tfXn1+X58dWpoanFubHBsam1rYmBrcHf57efo4OPs6efp6unq7e/t5unt6+3v7e/37+fo7/Ds7/Pq7fr27vpwcW9tb337b29uZ2JiYl1dZ3Fv++rye/t7bHLy8nVz+fX07Ov1fnp3c3ny/H32fm1scXR2eXZzevL5dXp3bm95/nlvb2tnZ2lqc+7t8+jc3OHi4+np4ej48/V9bXN+bWt99Xh87fD58fD7/u3r+O7l6Ovn6vf37Orv8Oz4dnRsX11kZGFmenx7831rZGRjZnBvZGRxc2pv+35weHx+8+Xp+/Hr9/np6v968PD57On2++77bHJ2a15eXldYY2ts9eXn597f7e3i5/ru5/d8fnNpa3h7eO/o8u3g4u7t5+vv6+v39ubv+/DzcXD49Xp8+XBmZWReYHFyb/fl6Pfu7nRpbWVfY2ZfXmprYmr9/m51/Xr/9fJ+fPT3ffLye33w7vfu5Ofw7e55eHdoXmBkYGJt+ffr397g4ufw8/D+bm58bmNhZmBkcnv67Ofq6uTj6Ong4uno4+Pl4ePp6ubt9/Hu/XZ9c2hkZ2diZmtscPf5bGdlX1tbW1hYW11bX2lqdPLs7e3p5u3t5+vv5+Xu7+vr7ejl6uvm7Xt++XJpZF5aWFteXmV98O7j4Onv7u98ev51bnh3aGx+enrx5+bn5OHm5+Dg5ePi6uvl5e3t6fB3/Pdze/D+dXd2bGdrbGdq/vx+9fptZGFfWFVZWFZaXlxhcHFt/u70fvDufvzq7O3l4ujo4eHt6uHl8u/ufP72dmdpbWFcY2djbe7p6uXk7vP1dWVqdmtkbHBrb/nx9efe4+ff4efk3N/l3tzg493j8ejnfXX48//67fd1fn5rY2loY2l5dG1zcmNdXlhUV1tXV15jYWt8e3b07vf06urs6ufq6N/b3eDh5+/r5vH+9vh4dndrZWRgXFxlbHbw7vf37u33dm1qZGhtbHD8+Pnz6+bl3dvg497d3dvd4+Hd3+Tn6vD9e3h0//bw8fn6end5cmlmaGxsb29udXdsYl5dWlpZWFtdX2Ztb251/3hyeXx+9O/u7eXh3d7l6O7x8vn49/Hz+f14cXRzamZpaGd4/P/16+3z/n1wa2tnYmZtdnr07e7q4t/j497e4N7d393Z3OXk5vX07vd9+/P49uns+Pft+21xbmhkY2NgZ21iXWFjW1peXFhbXV1hbm5odPxsan31+vTp6ebd297h3t/t6uXu8u7t/v3u/HF0e2Zga2lganlweO3reXP+b2Rla2Zo/f548OXq8eje6Ofb293Z19zd2N7u7un7bHb/c37t9vrq5/V89v5oZWpiXWNoYmNtZV1fY1xZYWRbYGtoZ3F0ZGRsamRy+3Z86uXr593e5ePf5ujg6Pju6/576eTv8+95Z2hoYGd6dHP36/X9/nhoZ2tiZHB4bXrr7vry6eru5OLl3drc3tzf6+vk7frx8nNx+Pj36eTq7ev2b2lmXlxhY19gZmFdXV1ZWmJiW15oZGRsbGVma2dod/X78uPk6uPc3t/d3uDd2+Pv8fN+fO/v9/j7bGVoaGBkc29odvl4cHlvZWtwbGl4e3B77fT57+vn6uLf3dvZ2t7e3ubo6O/+//5wbW92d/Pw+fj0e2tpZmJiaGpoZmtoX19fYWBla2dkaGtsamthZGZgYWZubnjz6urn5OHf4+Ti4ujw8/d9fvXr7Ozr7fxzb3Vzd/7/9fb3/X54cHN4b2tqbWtod/x+e/Pu7Ozt6eTf4+Pg3uLl4d/l7PH3cWtvb3b48PTt7/pzbmNfZGZhX2dmX19iYWFkYmFfX15dYmViXmNsZmh1+3r56err5N7g397f4N7g6PH0/HJ38Oz29+3zdHR7/nr/e/75fnBxfm5rdH1ubHl6bG59+Xz76ebm49/i3dre4dzf7+3j6H337PhvdHZubnx8fHpxaWVrZ2FmcGlianBkYmtuaWl1bWRgYF9jYl5eZWtkaHv6evHn4urj3+Dk5eXq6Oz6fvt4cf7p7fDq6X5xfPh+e/Tz9/z1/PTyfHR9eGlpev5ud/Hw++/p6u3r6ubj5OHg3urv5+Pq8Ovn9254/HtydnV2bmplaGZhX2ZpY2hwdmx0fn5sa2xmXVpbW1xbXWRraGdx8vj86+Hn6uPi5Ofj4+Dm6/Lw833+7enr6+Xm+//4+m5y+/b//vv88/b6ff5saG14cG50+PZ79O3t8+zl3+Lg393i7fHn4u3p4+bz/Xp6bmhnZ2JdXF5hXV5fZWdscf55b/rxe21ubWpfXl9hXl5jamljbfny/e3n4+zv6ufs7Orm5/Hw7O17evLm6e7o5vb//n79fPLq5+nr6OLq+fn5cGdue3ludvz+cHR9/Pv//PTp6+zq5uz27eHp7u3n6PD69/N6cHBwZ19fZF9bXm19dXvs5/t+9/5oYWRnYFtbYmBaW15mY2l7+P706ubq9O/k4+jl4d/k6efi6vft5ufx9Ozp/HB0+351/eXq9eri7HBx/X1mZnN+bmx593119OXn8vDl4PD45+Pu7OLg6unj4Ofz8vH3cmlrZl1aXFxYVVxoaWt96ens8X57d2tpaGpfXWFiW1lfaGhqffjz8+vu7+3u7ejs9fLo5fL47OXx8e3s/Pb77fN4d/Lp7vTg2eLr5uN4anb1c2Jq/XZmZG38cW715O798eT5aHjn6f/p3uPv597j7+jj5fF1cXFsX11gXltcY25v/eni6X1ya21mYF1jYFlWW1pUVmRrYmT/6/5y9+fs7+Pb3ers3t30+ODc7Pbo5Pf+6ub9cPru93j26Ofr7ft9bWlsbWxrbGxoY2Nlbvnu7enf4u367Ov58dzc5ejb2un25d7s/PDscWNlcmJXWWBgWVppc2hx7vBoYGx1ZGBxemVdXV5dWl5paWl0/f95e/v57+bg5eTg5e/z6eXs6ODqe/3o7Ht38PF4eejf5uvg3u509+n8a3T1emhqcmRaX3N1aXHv7HJsffH9+OLc4Off2t/r6ufo5ufu7+3yfnVxbWRka21rZm74eGpqcGtiXmZkW1pgWk9RXF1YW3B0Y2Z7+XBv6t3l7N7W2uXm3t/v7N7g8/Xm6n1+8PV+fv349/L0/ntvbnr9+f36dW5uaWVocHRqbfj0+vLl7fvq3N3h3Nbb39zb3uns4+d1bPz1aF5mbGFcbPlsYGx7a11kcG9rbHBua2ZkZF5bYWdmYmZtbGlscW529e3t6uvs6ebrfH7n6Pr16O19evPxdG/y5On38ODk/37o6Pbz5Of8dPLya2RtdHFraW1oYmBmamZt8ePl49za2trb3uDg4OXl5eny8O39b3j2/3J49ftrZ21qY2BpbmJcXmJZUlVbW1peaWZjaWxtbG167unm4N3c3Nzc3N7d3N7i4+ru9vX+b3n/c3D+fnNsamhmZ3P6+vr98PZwand6dHD+/nBteHZqanb38OHd29vb2tzd3dzd4enp7fJ4cG1jYGVwbGx79nNtb3RtbXRzbWtvbW5kYWFjaGxxdW5pa2RgYGtwePvw7e7r7fHx8Pfu6OTl5+Xr9X59fvT5ffzt7/r16/B79+no8Ong5vh5eXBsbXhwa2ZnZF5aXGBeYnHu6eTe3ODh3tzc29zf4eTp9/v3/nd9+vny9fd5d29vcP9wZmhsZl1cWlhWWVxeXmVpaGRfX2Zqa/Tp5+ff3eLn39rd3drZ29zf5PD8+X79enNvdm5oZmxrbXF7e37v7vD+/m5vdntvcXx0aGNoY2NqeX7t4tza2tzj4d7c393d4+/zdWdma2ZfZWlrbXh1b213enZ7b212fWxlYmFeYGNiYWp5a2hnaGRnbXFv++/r7vb8/urm6Ojh4OLk4+rw6enx+fT3+Pv7c3r07evr6Orn4eHs+Pv8dXNwbW1rY1tZWFZZXWFlcO7p5uTi4d/d3dza2Nvh5u98eXx1bG99+fb39/z8d3J5dmtmbmthXF1bWFVWV1laXF1gYmVtcnh78ujo7Onn5eLe293c29vd3eLp6Ojx/Pf0/nN2bmpqb3F5dHv27ez69u7vdn7v8Xz8/HBiX2RgYmFocPn07OXf5eLd3eDf293k7O14b2pnXmBpZmhufW5w//lzefz0+v1+cm9saGNiXVtcYFxZXmplXmlvbWh3fX159uvl5Ojl39/p5uHh6+nm6vXq4+jx+Pd6fXz+fe3q6efg5PDw7/lvc3NsZGNeXV5cWVxiX2Ry8vft4Nrd3NjX2t3b297p6u71c2trdmplcHpxanV2bWlxcGtoaWRiYWBhXVtZWVdaWl1haGlxe3n48fL05uTi4drc4N7b3ODf4OHr7+zr+fX4/HRtbGxubHP57PLq4uDs5+Ln8Pn7c2pma2djX2RjY2Rsdv716d3c3Nza3+fp6PD2/nluamtlZWVqZ2xyd3b+9+3v9fH19nx7cHJoZWRfWVdaW1lYXWBiX2dqaWZu/ff37uLh4+bd3N/k3t7j5t/c4enr5evu9vn7fXz18O7s6uTm6/Tt7vhvaGJfXFteXlxbYWVoZXD27eve1tTX2Nfa3+Xg4+53ffd4am13c2treXNsaHJ5cmhqcm5oZmhnYl1eXFlXWVxeXl9ma2llbHh3b37q5ejg2tvf4Nva3+bh3+Pt5uPr/fzt8XJtfPt0ce/o7vbo5Orw7efseWpsamJdX2JhX2NnaWtx+fDr5d3Z2t3g3+Lv/PLwenF2fXRsevb5fvzx9H187u32eX77cWZsdWleXmNeV1dcXFdXXWJeXF5jY2Jqe/Tu6uHd3d7e3d7f39ze3t7e4Ofq6ejvffzw8H3+6eTq8uro83R79XVmYmhnXlpdXltaYGpmZnbs7eve19bb3Nnc5/Hp6O708uzx+3zx7fh8/vb8dnp5cm1scG5qY2dmXVxcXVtXWFxdWFpma2VeaHJsa3rk39/e2dfe393d4+nh3+Pn6ejz+vTy/G91e3RvcvXt7fTw7PT7fvbydG1tcWpiYGJnYV9la3JwfO3p6ePb3ODn6er59vD4/Xv7fHNwe+73+PTr6Pfz7+36eH56d21vcWtnYF1eXVxaWlhaXFpaWl1eXWJs+e/p4d7c4ePh39zg4NzZ3OPf4ODo7Oru7vr99/Pv7u309/B6cHR+e2ppcXppX2FhYVxbXmBjZXTw5+Pi29zc3OHl6ePo7+3p5fV9//r3dHb88/Z1eHp7b2hqamljYWVnaF5eX2BiXV5dXl9dX2FnZ2Rpc/Lv7ubd2d7h3t3e5+Xg4Orw6urr8/bz+vd7cHF3+Hz79e3s/v787fB+9O3o9HV0cW9jX2NpamVtfPHu9Onm5ev38fDv/P/z7+7+d29veXB3/evq+vPr5/d1//t3aGdtbm5laWxpY1xdXFtXV1lbXl5dYGFoaXD56uDi4t7b2tzb2tja4OHf3ePr5eTp/X7x7/Z5+PPz+nZ1b3BtaW50fHNpZ2doXl1gZGZjaHXz7u/h3Nvf5OLg4Onp5OHj8PP1+3hrdv3+d3f6/f14bmxnaGRhYmZpZGRqbWlfYGFiXllcYGhgXmdrbmp07eTi4tzc3Nzb2dvc3+bn6uns8vTx7ft9+/HuenJ+7fR0//L0dHL18/l2c3hxbmhpaWlnYmhvefj18Ork5uvt6+fu8Onm5fL6+Pp5anP38fx88evs+v/6e29nam1qa2xxbWtvbWliYl9ZWFteXFpdZGpmZnbt7Pju4Nvb29XU19zd3ODn7Onp7Ors6+vn5/L/fu/te3N1/XVpbHV9a2RqbGJcYWtnYWFsdHN1+u3s5efp6OTf4uLh4d/k6Ozs8HJ4/fl3bHJ+fGlnb3RuYmFra2tna21qaGhrZ2NfXl5cXV9gYmpzbGt46eLv7d/a297a1tne4+Lk7f/+7fH5ffPs7O33/n74+3l3+/H6dX328H1ubm9nXmBobGdmcPz9b25+9vl++evm4+Pi5eXk5+318/pwbHZ+enX+9/9sanH+e2lreHhwa211cGxpaWRkXlpaWlxbXF9oaGNobvnt8O3m3t7l39jV2t7c2d7q7efq8vru6Ont8O/z+Ht8/vv0fnFyevx0amhtaltbZW1lYW19fG5w9uzu9e/m4+Tm5eDf4+jn6+z6b2xxenNxc3R5bGJkbGxian71eWxz+31rZWhoZF1cX2NgXWBhYGFiY2VyfXv46uDi5uHd2d3f3tze6u3o4Oby7+vq7/nx7e/69uzl6PHv7/X9dnBtbWxgXWBpZGFobHptaXnx8nd08+jt8OTe3uHj4OTn7v53e/15c3j/fWxmaW1ua253+XxtcHh5aWFlaWVdWl1fXlpcYWRiYGNqdnR78Onk4t/c3Nrc3d7d3eTn5t/j7/Lr6fL9+/Hq7/bt6On7enx+cmlqb3BmY2ZmaGVjaG5zbG1z/fZ+/PPq5+vn4N7h6+vp5/V8+fX7cHB1fHVpaWtvb2t1fvb9c3z9fXFta2djXVxdXl9eXmFmZl5fZ25qbP7q4ODi3drb39/e4Obu6eTk5+rp6unu9Pft6vX37Ofn8f79+HlpZ2ptaGJka29ranB8emppcXR0bG5+9PHx6+Xj5+3r6Ont8PLz+nJtcP/+cG95+3pwfu/u/Hj9/n1xbGxmYl1cX19dXF5hZ2diZWltbGlv9Ofo6uHb2t7f3dzg6Ofj4+jt6Obo7O3p6+33fvny7/t5fP57aWRoa2dgZW55b27693xtbXFzcGltfu/x+Ozl4efu7Ovr8fz49ftvbXJ7d21wefj6ef3u6PR6+PT7a2draWNeX2RmZGBjZGJhYWNma2hmbP/u9fXr4t7j5N/c3uXl4N7k6ePf4Obm4uTp8vf07+719+7t+W5nZWlmYmFodXNudP17a2ZqbWZeZXB8d3H56+rv8Orq6uvv7+7u9X789fP2+vfw+Hd78/F+cXvz/WpjamtnY2Vqa2lkZGVkY2NoamtsbHJ6/fr77uXg4eDe29zh5ODc3+fp4uTr6+bo735++Pl+d3r1+nVtbW1rbGludnr/b3N7/nZvdHl3aWlvc25pdfPt9H337/R6evbz9v758/Dv+P76/fb5+/f1+Hj89/lyZ21wdGpseHlxZmZlYmBhY2VkZGRnZ2lsbv3u6Obl4OHi5+Tc2t3g3t3c4Oni4efu8Ovz9/96+H10b21tbmxqbHZ3bWtubW9tZ296dWpmam9ua3fu6e707Onw+fzw6uz29Ovu9Hx4/f3/eHp6cHJrb3h2cmptc3Nubnz5d2dma2xoZWdtbGdgZ2pra3D37Ofp6OLk5uzr5d7f5+fi5Orw6+fo7fvz7/d9ev3/fHN2/X18ef749n5wdvx9cmtvcG1iX2RmZ2Rq/vt9c3b2+v767+Xn7+/s7PN8e/fw8/P39PV+bm91cnZxdXx7d3R5/H5tZmxsZl5hZGJdW11hZmdsfe3o6uvl4+Ll4t3c3N/g39/i7Oni5evy7ev0d3D+/3FtcHRvb2htcXV6b33+eXFsbGhmY2Bla3Nxc/zv9Hp68O7x8urm5efu7e30/Xr39/n8fv1za2VnbGtsbnV89Pt4+vPx/np7fnVnY2RiX15eZGlmZ3X5+Pn67evp6Ovl4+Tn5uTl5uvp4+Tj6evo7PV8/vb8fHr59PV6e/Hy+X77/XlrZmVfYF5dYmhoaWxxeHp2dH7w7O3q4eHn7Ovo5u/06+zv7/X7/XVra21tbmpweXd3cHz4+/V7eHhuZV5eXV1cXmNnaWVufH73++vn5OLn397e4+Xh4uDi4ubq6fDz8fh+cHb+fXh0d3x8eHD+9PX8+vJ9b2doZ2NkYmlucXBwfnz+/frt7O3w6+bp6vT28/f5/fjy9Xx1enhva21ubnBxdvv79/zy7Orr9/D3dGpkaGZjYF5iYmJfZGxsamt+7evs7uno6erv5eLk5eTg5OTq7Ovy9n75+f/4eX3v9/Tu9O/q+PvweHFkYGNfX1xeYGJkYWtzcHN79evn6+ji5ujs6+jp7Pbu6/H3fPr4enJucXB2b295e/x5efh+fnZ+bW5uZWZfY2FdZGRgYmVtbnB18+vu6Ofm4OXm5eDf3uPo5+3r9vV+/n5sbnhyfHB1+/l+/e3z7/D38P14cG5vbGZgZGZnampzdHF4ePvz7Ozw6+vp8Pjs8/f9+O75/nf//Xl3bXx+fnl87fLt8O/q8/X7/nx1cmppbGhjX19cXV1dZmVma2x99O/x7enp6urj4OPi397i4+bt6e7u9nf2fvn+9u7w7PTy7fL1ev15bWllZmJeXV1gXWBjanBxfHn27Orp7eXj5OXp4+Tu9PXr7fT7/vB2cG51/m53eP30ffj++H7+fm52bWxsam9qbGJlZmNlZG96end3+e7v8ezk5+fs6+Tp5efo5u3s+vX8c3Vy/3l69vnu7Ovw8evs8fz59n19b3BuZWJeZGBgaWd1cHd8fPL18/H07u3w9vDu9PZ+7/T9/Hn89318eu5z8+bw43rs7/Xq/nptdW5ua2Rra2ZgXGBgXV9lb2ltbX78+PT55Oji5+zm4t/i5d7j5unu6/T7df309u7y7O7s7vHo7/twbmZ2cWtpY2JdW11dYWNnb3h5//bv7ezy7OLn5ufq5+jr8uzm6vV7/P55eHD5+n19evj4enh7/HduaGdrZWlnaW5pZV9jZm5sa/fz+f787O3y9Ovn6+zu6ebo7Ovp7fL6fPp5dXRy9/vz+PLs7+zz7Ovx+Hl5enZzdXhuaWVhZmVmaG58eX13efl+fnV9+v77fPfy8vL57ez0/Pv1+nx+8urt8fDq4+nz9e30eXRscG5uamlqYmFcXWJeX2Jrc21ra3X+enn86+vu6+ri4ePi4N/m6uzo7Pnw9O/q7O3w7Ovs8vju+XJrZmtnZWZnZ2FfX2RkZGtvdnh2enr39PD27uns6u7o4+bl5+Li5uv38f52eXj4+3h0d/94cXF1eW5samxxbmtpampoZmhvcHR0d/t8eXV59Pj58ero7u7u6ujs7ezq7fP6fvp5ent79Pr49vXx8/L27ev1+Hv293d0c/5yb21scWlramltaGtrb3Bsb2t0dXf8/fDs7e7q4+Xq7u3s9Pfz6Obq6Orr8Pr1/PP3e3pzdmlmY2BjXl5eX2RgYWJnamxub351e/327ezr6uXi49/j397i4OTj4+rt7uzw9Pl79H17enB6cm9qaWliZGFnaGdoaW5raGhnb2pudXn29vDw7unr6uzm4ebk5+Pl6Ozx8H13c3P+dnFyc3VxdXB7d3F2anBvamtnbG1sam53bGxvdHtze379/H32/Pbv9fX09fn39/jy/Pr79vDz8fPu7e/1+/Px9e7u6urs7/DzfHxzdHdvcGxsZ2VjX2JgX2BgaGtsa298e3x6++3v7Orm4uTk5OLj5eTl5Obo6u/q7vT09PV9em1vcGdjYF9eXV5bXFtcXV9nZmtrbnp6/vru6uvo6OTf4OLi3+Hi4+jl5ubp8/P5fnh2fnx4c//+d3FscHBqZWNqamhmZGdlZWNnbGxudffw8O7w5+jo6evl5enr6+fn6e7t7/b4d3RzcHRyeHt5eXv9d3FxdXh1cmtqdHBraGxuaWpoa2tve3r88/n5+fL58vv67vXy+PT17P779PLz+vjz7vT09Ort7Ofi5ebg6uvs7XZscm9sZmZoZGBeXmBfYWVpcHV3cv5++vv77fLs6+rh4+Tm5uXk6Onn5Onr7e/47uvh3ed072xrfV5iX15iXlleX2hcW19jY3BsbPdx8nvp7nLk4uTo5Ozu7/Dg9PTo4O7u9e3t+nh46nj073H+63trfnRpZWFt/Gdhb2pgamJ+7Hd44+Pn4+jf3+3s5ejf6ePf3+vj6fDm/Xbm8Hd8anhrbm3t+XDh/Xp2c/VobWxtXHlnVm5XaFpj+HN+bXZs7fd372n+6n18dut7/3Z9fX5+6vf46O156Odx6uXc6ubb3O3m2ux+/vD7/21vXWJhWmZUYGlsWWN3YWRw/Vnz4mb24ejiClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfZ3NtXzFjaF84a2h6XzEza2Jwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZmJlMzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nc21fMWNoXzhraHpfMTNrYnBzLmluZm8KQEAgLTAsMCArMSwxNyBAQAorOTc1IDEgMAorOTc1IDEgNjAwMDAwCis5NzUgMSAxMjAwMDAwCis5NzUgMSAxODAwMDAwCis5NzUgMSAyNDAwMDAwCis5NzUgMSAzMDAwMDAwCis5NzUgMSAzNjAwMDAwCis5NzUgMSA0MjAwMDAwCis5NzUgMSA0ODAwMDAwCis5NzUgMSA1NDAwMDAwCis5NzUgMSA2MDAwMDAwCis5NzUgMSA2NjAwMDAwCis5NzUgMSA3MjAwMDAwCis5NzUgMSA3ODAwMDAwCis5NzUgMSA4NDAwMDAwCis5NzUgMSA5MDAwMDAwCis1MjAgMSA5NjAwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nc21fMWNoXzhraHpfMTNrYnBzLnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2dzbV8xY2hfOGtoel8xM2ticHMucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmOTAzYTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9nc21fMWNoXzhraHpfMTNrYnBzLnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5oMjYzIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTI1ODFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NWJmY2I2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaW5mbwpAQCAtMCwwICsxLDEyMiBAQAorMjYzNjIgMSAwCisxMjAyMyAwIDgzMzMzCisxMDY0NyAwIDE2NjY2NgorMTAyNjkgMCAyNTAwMDAKKzExMDc2IDAgMzMzMzMzCisxMTEwNCAwIDQxNjY2NgorNTkwOSAwIDUwMDAwMAorNDI5MSAwIDU4MzMzMworNTE0OSAwIDY2NjY2NgorNTM1MyAwIDc1MDAwMAorNTE4NSAwIDgzMzMzMworMjczNiAwIDkxNjY2NgorMjE1NzUgMSAxMDAwMDAwCisyMTk2IDAgMTA4MzMzMworNDM0MCAwIDExNjY2NjYKKzMxMDkgMCAxMjUwMDAwCis0NDEwIDAgMTMzMzMzMworMTczMSAwIDE0MTY2NjYKKzQ1NTcgMCAxNTAwMDAwCiszMzc2IDAgMTU4MzMzMworMTM1MiAwIDE2NjY2NjYKKzI4NDQgMCAxNzUwMDAwCisxNzg3IDAgMTgzMzMzMworMTA4OCAwIDE5MTY2NjYKKzM2ODQzIDEgMjAwMDAwMAorMjUyMCAwIDIwODMzMzMKKzM3NDkgMCAyMTY2NjY2CiszNzg0IDAgMjI1MDAwMAorMzQwMiAwIDIzMzMzMzMKKzM3OTUgMCAyNDE2NjY2CisyMzQ1IDAgMjUwMDAwMAorMzE0MiAwIDI1ODMzMzMKKzI5NDggMCAyNjY2NjY2CisyMDE4IDAgMjc1MDAwMAorNTEzMyAwIDI4MzMzMzMKKzIyNzYgMCAyOTE2NjY2CisyMzQ2OCAxIDMwMDAwMDAKKzE1MjIgMCAzMDgzMzMzCisyMjk5IDAgMzE2NjY2NgorMzI3MyAwIDMyNTAwMDAKKzI2MzAgMCAzMzMzMzMzCisyOTE1IDAgMzQxNjY2NgorMzAzMiAwIDM1MDAwMDAKKzE4OTAgMCAzNTgzMzMzCiszNzE4IDAgMzY2NjY2NgorMTk5MCAwIDM3NTAwMDAKKzMxMzkgMCAzODMzMzMzCisxODA2IDAgMzkxNjY2NgorMjMyMDggMSA0MDAwMDAwCisxNDE5IDAgNDA4MzMzMworMjI2MyAwIDQxNjY2NjYKKzMxMzEgMCA0MjUwMDAwCisyNjQ1IDAgNDMzMzMzMworMTg4MCAwIDQ0MTY2NjYKKzIyMzkgMCA0NTAwMDAwCiszNjM3IDAgNDU4MzMzMworMTk0MSAwIDQ2NjY2NjYKKzE1NzcgMCA0NzUwMDAwCiszNzc3IDAgNDgzMzMzMworMTgxNiAwIDQ5MTY2NjYKKzE5NjAxIDEgNTAwMDAwMAorMTEwNCAwIDUwODMzMzMKKzI4MDggMCA1MTY2NjY2CisyNDExIDAgNTI1MDAwMAorMjE1OSAwIDUzMzMzMzMKKzI0MTEgMCA1NDE2NjY2CisyNDA4IDAgNTUwMDAwMAorMjM4OCAwIDU1ODMzMzMKKzI0MTggMCA1NjY2NjY2CisxNDgxIDAgNTc1MDAwMAorMTkyNiAwIDU4MzMzMzMKKzkwMjIgMSA1OTE2NjY2CisyOTIgMCA2MDAwMDAwCis3MDEgMCA2MDgzMzMzCis3NDcgMCA2MTY2NjY2CisyMDU5IDAgNjI1MDAwMAorMTY5MyAwIDYzMzMzMzMKKzIwNzggMCA2NDE2NjY2CisyOTc1IDAgNjUwMDAwMAorMTMxNyAwIDY1ODMzMzMKKzE3NDIgMCA2NjY2NjY2CisxMDE5IDAgNjc1MDAwMAorMTA1MyAwIDY4MzMzMzMKKzE0MTgzIDEgNjkxNjY2NgorMTQ2NyAwIDcwMDAwMDAKKzk5NCAwIDcwODMzMzMKKzE3MDkgMCA3MTY2NjY2Cis4MzggMCA3MjUwMDAwCisxMzI4IDAgNzMzMzMzMworMjI5MiAwIDc0MTY2NjYKKzE4MjkgMCA3NTAwMDAwCisxNzI4IDAgNzU4MzMzMworMjQzNiAwIDc2NjY2NjYKKzE4NTIgMCA3NzUwMDAwCisyMTkwIDAgNzgzMzMzMworMTUxNjcgMSA3OTE2NjY2CisxMTg4IDAgODAwMDAwMAorMjA3MCAwIDgwODMzMzMKKzMzMTYgMCA4MTY2NjY2CisyNjM2IDAgODI1MDAwMAorOTUwIDAgODMzMzMzMworMTI2MCAwIDg0MTY2NjYKKzkwNiAwIDg1MDAwMDAKKzEyOTQgMCA4NTgzMzMzCisxMjk4IDAgODY2NjY2NgorMTg5NyAwIDg3NTAwMDAKKzEzNDggMCA4ODMzMzMzCisxMzE5NCAxIDg5MTY2NjYKKzEwNDIgMCA5MDAwMDAwCisxMjU4IDAgOTA4MzMzMworMTQ1NyAwIDkxNjY2NjYKKzk5MCAwIDkyNTAwMDAKKzkwMCAwIDkzMzMzMzMKKzk2MyAwIDk0MTY2NjYKKzM0NDggMCA5NTAwMDAwCis3NzQgMCA5NTgzMzMzCisxMDc1IDAgOTY2NjY2NgorNzUwIDAgOTc1MDAwMAorMTA1NCAwIDk4MzMzMzMKKzEzMTM5IDEgOTkxNjY2NgorMzEwNCAwIDEwMDAwMDAwCiszMzY2IDAgMTAwODMzMzMKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmhldmMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5oZXZjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjIzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5oZXZjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MzU3Y2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5pbmZvCkBAIC0wLDAgKzEsNjEgQEAKKzE2OTUgMzIgMAorMTkzOCAxIDMzMzMzCis0NzEgMCA4MzMzMworMTUzIDAgNjY2NjYKKzk5IDAgNTAwMDAKKzY1NyAwIDE1MDAwMAorMjYwIDAgMTE2NjY2CisxMTUgMCAxMDAwMDAKKzk5IDAgMTMzMzMzCis2MjIgMCAyMTY2NjYKKzIxMSAwIDE4MzMzMworNzkgMCAxNjY2NjYKKzk1IDAgMjAwMDAwCis1OTcgMCAyODMzMzMKKzI4OCAwIDI1MDAwMAorMTQ1IDAgMjMzMzMzCisxNDcgMCAyNjY2NjYKKzY3NiAwIDM1MDAwMAorMjg0IDAgMzE2NjY2CisxNDQgMCAzMDAwMDAKKzEzMSAwIDMzMzMzMworNjU4IDAgNDE2NjY2CisyNzAgMCAzODMzMzMKKzEwMSAwIDM2NjY2NgorMTUxIDAgNDAwMDAwCis1MjkgMCA0ODMzMzMKKzI1NyAwIDQ1MDAwMAorOTggMCA0MzMzMzMKKzE2MCAwIDQ2NjY2NgorNjY0IDAgNTY2NjY2CisxODYgMCA1MzMzMzMKKzE0NyAwIDUwMDAwMAorNjcgMCA1MTY2NjYKKzc4IDAgNTUwMDAwCis1NzUgMCA2MzMzMzMKKzIzMCAwIDYwMDAwMAorMTM0IDAgNTgzMzMzCisxMTQgMCA2MTY2NjYKKzYyOSAwIDcwMDAwMAorMjI0IDAgNjY2NjY2CisxMzggMCA2NTAwMDAKKzEyOSAwIDY4MzMzMworNjQ1IDAgNzUwMDAwCisyNjQgMCA3MzMzMzMKKzE0NSAwIDcxNjY2NgorNzA1IDAgODE2NjY2CiszNjUgMCA3ODMzMzMKKzE1NiAwIDc2NjY2NgorMTYwIDAgODAwMDAwCis3MjUgMCA4ODMzMzMKKzMzMCAwIDg1MDAwMAorMTM4IDAgODMzMzMzCisxNjIgMCA4NjY2NjYKKzYzOCAwIDk1MDAwMAorMzM3IDAgOTE2NjY2CisxNzAgMCA5MDAwMDAKKzEzMyAwIDkzMzMzMworNDMyIDAgMTAxNjY2NgorMjg3IDAgOTgzMzMzCisxMzAgMCA5NjY2NjYKKzEzNiAwIDEwMDAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5oZXZjIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmhldmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUxZjdjZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5oZXZjCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5NDkxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX2hldmNfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvCkBAIC0wLDAgKzEsMzAyIEBACisxMDc1IDMyIDAKKzEwNzUgMzIgMAorNjg2MTMgMSA2NjY4NworMTkwMjUgMCAxOTk2ODcKKzI0MDUgMCAxMzM2ODcKKzc3NyAwIDk5Njg3Cis2ODEgMCAxNjY2ODcKKzIwMjU0IDAgMzMzNjg3CisyOTI3IDAgMjY2Njg3Cis3NjYgMCAyMzM2ODcKKzY1OCAwIDI5OTY4NworMjA3ODYgMCA0NjY2ODcKKzQyMTQgMCAzOTk2ODcKKzYwOSAwIDM2NjY4NworNjYxIDAgNDMzNjg3CisyMDgzOCAwIDU5OTY4NworNDIwOSAwIDUzMzY4NworNTA2IDAgNDk5Njg3Cis1ODYgMCA1NjY2ODcKKzIwNDE1IDAgNzMzNjg3Cis0MjA3IDAgNjY2Njg3Cis0MjcgMCA2MzM2ODcKKzUxNCAwIDY5OTY4NworMjQ0NTcgMCA4OTk2ODcKKzE5MDQgMCA4MzM2ODcKKzkyMSAwIDc2NjY4NworOTkyIDAgNzk5Njg3Cis1NDMgMCA4NjY2ODcKKzI0MzQyIDAgMTA2NjY4NworMTgyMiAwIDk5OTY4NworODQwIDAgOTMzNjg3Cis4OTIgMCA5NjY2ODcKKzcxNSAwIDEwMzM2ODcKKzIyODkzIDAgMTIzMzY4NworMTYxOCAwIDExNjY2ODcKKzg4MSAwIDEwOTk2ODcKKzg5MCAwIDExMzM2ODcKKzc5NCAwIDExOTk2ODcKKzI0MjkyIDAgMTM5OTY4NworMTY3MyAwIDEzMzM2ODcKKzc1NSAwIDEyNjY2ODcKKzgxMCAwIDEyOTk2ODcKKzU4OCAwIDEzNjY2ODcKKzE5ODI4IDAgMTUzMzY4NworMTUzOCAwIDE0NjY2ODcKKzg5NCAwIDE0MzM2ODcKKzkzMyAwIDE0OTk2ODcKKzE5ODUzIDAgMTY2NjY4NworMjAxMSAwIDE1OTk2ODcKKzk4MSAwIDE1NjY2ODcKKzkwMCAwIDE2MzM2ODcKKzIyODY5IDAgMTgzMzY4NworMTU2MiAwIDE3NjY2ODcKKzg0MiAwIDE2OTk2ODcKKzc2NSAwIDE3MzM2ODcKKzY2NSAwIDE3OTk2ODcKKzIyMzQ2IDAgMTk2NjY4NworMjI0NSAwIDE4OTk2ODcKKzUxNiAwIDE4NjY2ODcKKzYwNCAwIDE5MzM2ODcKKzI0MzMzIDAgMjA5OTY4NworMTc2NSAwIDIwMzM2ODcKKzMxOCAwIDE5OTk2ODcKKzMyMCAwIDIwNjY2ODcKKzE4NTc3IDAgMjE5OTY4NworMTEyMyAwIDIxNjY2ODcKKzMzNyAwIDIxMzM2ODcKKzE3NTA5IDAgMjI5OTY4NworODY5IDAgMjI2NjY4NworOTAxIDAgMjIzMzY4NworMjMzNjYgMCAyNDMzNjg3CisxMjE3IDAgMjM2NjY4NworMzgwIDAgMjMzMzY4NworMzQ3IDAgMjM5OTY4NworMTk1NDIgMCAyNTMzNjg3CisxODg3IDAgMjQ5OTY4NworNDY3IDAgMjQ2NjY4NworMTg5MzkgMCAyNjY2Njg3CisyODYzIDAgMjU5OTY4NworMzE3IDAgMjU2NjY4NworMjcyIDAgMjYzMzY4NworMTkzNTMgMCAyNzk5Njg3CisyMDkyIDAgMjczMzY4NworMjAzIDAgMjY5OTY4NworMzEwIDAgMjc2NjY4NworMTg4MDAgMCAyOTMzNjg3CisyMDM4IDAgMjg2NjY4NworMjQyIDAgMjgzMzY4NworMTk5IDAgMjg5OTY4NworMTc0NTIgMCAzMDk5Njg3CisxMDYwIDAgMzAzMzY4NworMzAxIDAgMjk2NjY4NworNDUyIDAgMjk5OTY4NworMjU2IDAgMzA2NjY4NworMjEzNTIgMCAzMTk5Njg3Cis0MDkgMCAzMTY2Njg3CisxNzMgMCAzMTMzNjg3CisxOTE0MiAwIDMyOTk2ODcKKzY0MiAwIDMyNjY2ODcKKzQ2OCAwIDMyMzM2ODcKKzE5MDY2IDAgMzQzMzY4NworNjM1IDAgMzM2NjY4NworMTk3IDAgMzMzMzY4NworMTkwIDAgMzM5OTY4NworMTg4MTMgMCAzNTY2Njg3Cis5NjkgMCAzNDk5Njg3CisxNjUgMCAzNDY2Njg3CisyMDMgMCAzNTMzNjg3CisxNzM2MiAwIDM3MzM2ODcKKzI0NiAwIDM2NjY2ODcKKzIzNiAwIDM1OTk2ODcKKzE3NCAwIDM2MzM2ODcKKzE2NCAwIDM2OTk2ODcKKzE3MDgxIDAgMzg5OTY4NworMzUzIDAgMzgzMzY4NworMjIyIDAgMzc2NjY4NworMTgxIDAgMzc5OTY4NworMTQ4IDAgMzg2NjY4NworMTA4MzUgMCAzOTk5Njg3CisxODUgMCAzOTY2Njg3CisxMzkgMCAzOTMzNjg3Cis3NTEwIDAgNDEzMzY4NworMTQ5IDAgNDA2NjY4NworMTI5IDAgNDAzMzY4NworMTMyIDAgNDA5OTY4NworMTA2MyAwIDQxNjY2ODcKKzgwNSAwIDQyNjY2ODcKKzE1NyAwIDQyMzM2ODcKKzM5NCAwIDQxOTk2ODcKKzkwODQwIDAgNDM5OTY4NworNjE1OSAwIDQzMzM2ODcKKzE3NTIgMCA0Mjk5Njg3Cis5ODUgMCA0MzY2Njg3CiszMTMzOCAwIDQ1MzM2ODcKKzMzOTAgMCA0NDY2Njg3Cis3NzIgMCA0NDMzNjg3Cis3ODEgMCA0NDk5Njg3CiszMTA4NCAwIDQ2NjY2ODcKKzM0OTggMCA0NTk5Njg3Cis4MTggMCA0NTY2Njg3Cis4ODEgMCA0NjMzNjg3CiszMDQxNiAwIDQ3OTk2ODcKKzMyNjUgMCA0NzMzNjg3Cis4MTUgMCA0Njk5Njg3Cis3OTAgMCA0NzY2Njg3CiszMTA1MyAwIDQ5MzM2ODcKKzMxMDYgMCA0ODY2Njg3Cis3MDggMCA0ODMzNjg3Cis3MTMgMCA0ODk5Njg3CiszMDIzMCAwIDUwNjY2ODcKKzMyMTQgMCA0OTk5Njg3Cis2MzkgMCA0OTY2Njg3Cis3NjggMCA1MDMzNjg3CisyOTY1NyAwIDUxOTk2ODcKKzMwMTMgMCA1MTMzNjg3Cis2MjIgMCA1MDk5Njg3Cis3MjAgMCA1MTY2Njg3CisyOTM0NCAwIDUzMzM2ODcKKzMxOTYgMCA1MjY2Njg3Cis3MTMgMCA1MjMzNjg3Cis3NzUgMCA1Mjk5Njg3CiszMDQyMCAwIDU0NjY2ODcKKzMzNzQgMCA1Mzk5Njg3Cis4MDMgMCA1MzY2Njg3Cis3MTcgMCA1NDMzNjg3CisyOTk2MCAwIDU1OTk2ODcKKzMyODMgMCA1NTMzNjg3Cis3OTMgMCA1NDk5Njg3Cis3OTAgMCA1NTY2Njg3CiszMTAxMSAwIDU3MzM2ODcKKzMzOTcgMCA1NjY2Njg3Cis4MDkgMCA1NjMzNjg3Cis4MzEgMCA1Njk5Njg3CiszMTE5NCAwIDU4NjY2ODcKKzM0MDEgMCA1Nzk5Njg3Cis4MDcgMCA1NzY2Njg3Cis4MjcgMCA1ODMzNjg3CiszMDMyNiAwIDU5OTk2ODcKKzMxODYgMCA1OTMzNjg3Cis4MTggMCA1ODk5Njg3Cis4NjMgMCA1OTY2Njg3CiszMTU1OSAwIDYxMzM2ODcKKzMzNjQgMCA2MDY2Njg3Cis4NDAgMCA2MDMzNjg3Cis5MTkgMCA2MDk5Njg3CiszMjAxMyAwIDYyNjY2ODcKKzM0OTUgMCA2MTk5Njg3Cis4NzEgMCA2MTY2Njg3Cis4MDMgMCA2MjMzNjg3CiszMDI5NCAwIDYzOTk2ODcKKzMxNTMgMCA2MzMzNjg3Cis3MTYgMCA2Mjk5Njg3Cis4MTIgMCA2MzY2Njg3CisyOTk1MiAwIDY1MzM2ODcKKzMyOTkgMCA2NDY2Njg3Cis4MDEgMCA2NDMzNjg3Cis3NDkgMCA2NDk5Njg3CiszMDU5OCAwIDY2NjY2ODcKKzM1MzYgMCA2NTk5Njg3Cis4ODcgMCA2NTY2Njg3Cis4NTAgMCA2NjMzNjg3CisxNzI0NiAwIDY2OTk2ODcKKzMxMTEwIDAgNjgzMzY4NworMzE5OCAwIDY3NjY2ODcKKzgwOSAwIDY3MzM2ODcKKzgzNiAwIDY3OTk2ODcKKzI5Nzg0IDAgNjk2NjY4NworMzE1NSAwIDY4OTk2ODcKKzg1OSAwIDY4NjY2ODcKKzk1OCAwIDY5MzM2ODcKKzMwNjY2IDAgNzA5OTY4NworMzM3MSAwIDcwMzM2ODcKKzg4NiAwIDY5OTk2ODcKKzg2MSAwIDcwNjY2ODcKKzMwNDE2IDAgNzIzMzY4NworMzM1MCAwIDcxNjY2ODcKKzkxNyAwIDcxMzM2ODcKKzk4NyAwIDcxOTk2ODcKKzI5NTA5IDAgNzM2NjY4NworMzU3NCAwIDcyOTk2ODcKKzk3MiAwIDcyNjY2ODcKKzg4NSAwIDczMzM2ODcKKzMwODcyIDAgNzQ5OTY4NworMzM5OSAwIDc0MzM2ODcKKzg5OCAwIDczOTk2ODcKKzEwMjcgMCA3NDY2Njg3CiszMTE1NSAwIDc2MzM2ODcKKzM0NTQgMCA3NTY2Njg3Cis5NjUgMCA3NTMzNjg3Cis4NDEgMCA3NTk5Njg3CisyODQ4NyAwIDc3NjY2ODcKKzM2MTYgMCA3Njk5Njg3Cis5MjEgMCA3NjY2Njg3Cis5OTEgMCA3NzMzNjg3CisyMzIwOCAwIDc4OTk2ODcKKzM1NTEgMCA3ODMzNjg3Cis5MTggMCA3Nzk5Njg3Cis4OTQgMCA3ODY2Njg3CisxNjk4MiAwIDgwMzM2ODcKKzM0NTggMCA3OTY2Njg3Cis4NDQgMCA3OTMzNjg3Cis5NDMgMCA3OTk5Njg3CiszMDM5NiAwIDgxOTk2ODcKKzQ5NjMgMCA4MTMzNjg3CisxNDE2IDAgODA2NjY4NworMTYzOSAwIDgwOTk2ODcKKzUyNCAwIDgxNjY2ODcKKzEzNjggMCA4Mjk5Njg3Cis1NjUgMCA4MjY2Njg3CiszOTIgMCA4MjMzNjg3Cis0MTMxNyAxIDgzOTk2ODcKKzE4NSAwIDgzNjY2ODcKKzQ3NyAwIDgzMzM2ODcKKzUzNDIgMCA4NTMzNjg3CisxMjc1IDAgODQ2NjY4NworMTIxIDAgODQzMzY4NworOTgyIDAgODQ5OTY4NworNjQ2NSAwIDg2OTk2ODcKKzI2MDYgMCA4NjMzNjg3CisxMTYzIDAgODU2NjY4NworOTQzIDAgODU5OTY4NworMTE4NiAwIDg2NjY2ODcKKzExNTkzIDAgODgzMzY4NworMzEyMiAwIDg3NjY2ODcKKzEyNzggMCA4NzMzNjg3CisxNTkzIDAgODc5OTY4NworOTA5OSAwIDg5OTk2ODcKKzk3OCAwIDg5MzM2ODcKKzc0OCAwIDg4NjY2ODcKKzgzNSAwIDg4OTk2ODcKKzM2NCAwIDg5NjY2ODcKKzQ3OTkgMCA5MDk5Njg3CiszNjUgMCA5MDY2Njg3CisyMTUgMCA5MDMzNjg3Cis0MzY3IDAgOTE5OTY4NworMzAyIDAgOTE2NjY4NworNDgwIDAgOTEzMzY4NworNjE4MCAwIDkzMzM2ODcKKzc3MSAwIDkyNjY2ODcKKzI0NiAwIDkyMzM2ODcKKzI4MSAwIDkyOTk2ODcKKzQ2MzYgMCA5Mzk5Njg3CisyMTEgMCA5MzY2Njg3Cis0MDM3IDAgOTQ5OTY4NworMzgyIDAgOTQ2NjY4NworNDg2IDAgOTQzMzY4NworMzk3NSAwIDk1OTk2ODcKKzMxMiAwIDk1NjY2ODcKKzQ3NCAwIDk1MzM2ODcKKzY4ODAgMCA5NzMzNjg3CisxMTE2IDAgOTY2NjY4NworMjA2IDAgOTYzMzY4NworNjk4IDAgOTY5OTY4NworNjI1NCAwIDk4OTk2ODcKKzI1ODEgMCA5ODMzNjg3CisxMzAzIDAgOTc2NjY4NworOTg1IDAgOTc5OTY4NworOTY3IDAgOTg2NjY4NworNjQ4NiAwIDEwMDMzNjg3CiszNTU1IDAgOTk2NjY4NworMTQzMCAwIDk5MzM2ODcKKzE2MDUgMCA5OTk5Njg3CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWZiZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHouaW5mbwpAQCAtMCwwICsxLDQxNCBAQAorNTc2IDEgMAorNTc2IDEgMjQwMDAKKzU3NiAxIDQ4MDAwCis1NzYgMSA3MjAwMAorNTc2IDEgOTYwMDAKKzU3NiAxIDEyMDAwMAorNTc2IDEgMTQ0MDAwCis1NzYgMSAxNjgwMDAKKzU3NiAxIDE5MjAwMAorNTc2IDEgMjE2MDAwCis1NzYgMSAyNDAwMDAKKzU3NiAxIDI2NDAwMAorNTc2IDEgMjg4MDAwCis1NzYgMSAzMTIwMDAKKzU3NiAxIDMzNjAwMAorNTc2IDEgMzYwMDAwCis1NzYgMSAzODQwMDAKKzU3NiAxIDQwODAwMAorNTc2IDEgNDMyMDAwCis1NzYgMSA0NTYwMDAKKzU3NiAxIDQ4MDAwMAorNTc2IDEgNTA0MDAwCis1NzYgMSA1MjgwMDAKKzU3NiAxIDU1MjAwMAorNTc2IDEgNTc2MDAwCis1NzYgMSA2MDAwMDAKKzU3NiAxIDYyNDAwMAorNTc2IDEgNjQ4MDAwCis1NzYgMSA2NzIwMDAKKzU3NiAxIDY5NjAwMAorNTc2IDEgNzIwMDAwCis1NzYgMSA3NDQwMDAKKzU3NiAxIDc2ODAwMAorNTc2IDEgNzkyMDAwCis1NzYgMSA4MTYwMDAKKzU3NiAxIDg0MDAwMAorNTc2IDEgODY0MDAwCis1NzYgMSA4ODgwMDAKKzU3NiAxIDkxMjAwMAorNTc2IDEgOTM2MDAwCis1NzYgMSA5NjAwMDAKKzU3NiAxIDk4NDAwMAorNTc2IDEgMTAwODAwMAorNTc2IDEgMTAzMjAwMAorNTc2IDEgMTA1NjAwMAorNTc2IDEgMTA4MDAwMAorNTc2IDEgMTEwNDAwMAorNTc2IDEgMTEyODAwMAorNTc2IDEgMTE1MjAwMAorNTc2IDEgMTE3NjAwMAorNTc2IDEgMTIwMDAwMAorNTc2IDEgMTIyNDAwMAorNTc2IDEgMTI0ODAwMAorNTc2IDEgMTI3MjAwMAorNTc2IDEgMTI5NjAwMAorNTc2IDEgMTMyMDAwMAorNTc2IDEgMTM0NDAwMAorNTc2IDEgMTM2ODAwMAorNTc2IDEgMTM5MjAwMAorNTc2IDEgMTQxNjAwMAorNTc2IDEgMTQ0MDAwMAorNTc2IDEgMTQ2NDAwMAorNTc2IDEgMTQ4ODAwMAorNTc2IDEgMTUxMjAwMAorNTc2IDEgMTUzNjAwMAorNTc2IDEgMTU2MDAwMAorNTc2IDEgMTU4NDAwMAorNTc2IDEgMTYwODAwMAorNTc2IDEgMTYzMjAwMAorNTc2IDEgMTY1NjAwMAorNTc2IDEgMTY4MDAwMAorNTc2IDEgMTcwNDAwMAorNTc2IDEgMTcyODAwMAorNTc2IDEgMTc1MjAwMAorNTc2IDEgMTc3NjAwMAorNTc2IDEgMTgwMDAwMAorNTc2IDEgMTgyNDAwMAorNTc2IDEgMTg0ODAwMAorNTc2IDEgMTg3MjAwMAorNTc2IDEgMTg5NjAwMAorNTc2IDEgMTkyMDAwMAorNTc2IDEgMTk0NDAwMAorNTc2IDEgMTk2ODAwMAorNTc2IDEgMTk5MjAwMAorNTc2IDEgMjAxNjAwMAorNTc2IDEgMjA0MDAwMAorNTc2IDEgMjA2NDAwMAorNTc2IDEgMjA4ODAwMAorNTc2IDEgMjExMjAwMAorNTc2IDEgMjEzNjAwMAorNTc2IDEgMjE2MDAwMAorNTc2IDEgMjE4NDAwMAorNTc2IDEgMjIwODAwMAorNTc2IDEgMjIzMjAwMAorNTc2IDEgMjI1NjAwMAorNTc2IDEgMjI4MDAwMAorNTc2IDEgMjMwNDAwMAorNTc2IDEgMjMyODAwMAorNTc2IDEgMjM1MjAwMAorNTc2IDEgMjM3NjAwMAorNTc2IDEgMjQwMDAwMAorNTc2IDEgMjQyNDAwMAorNTc2IDEgMjQ0ODAwMAorNTc2IDEgMjQ3MjAwMAorNTc2IDEgMjQ5NjAwMAorNTc2IDEgMjUyMDAwMAorNTc2IDEgMjU0NDAwMAorNTc2IDEgMjU2ODAwMAorNTc2IDEgMjU5MjAwMAorNTc2IDEgMjYxNjAwMAorNTc2IDEgMjY0MDAwMAorNTc2IDEgMjY2NDAwMAorNTc2IDEgMjY4ODAwMAorNTc2IDEgMjcxMjAwMAorNTc2IDEgMjczNjAwMAorNTc2IDEgMjc2MDAwMAorNTc2IDEgMjc4NDAwMAorNTc2IDEgMjgwODAwMAorNTc2IDEgMjgzMjAwMAorNTc2IDEgMjg1NjAwMAorNTc2IDEgMjg4MDAwMAorNTc2IDEgMjkwNDAwMAorNTc2IDEgMjkyODAwMAorNTc2IDEgMjk1MjAwMAorNTc2IDEgMjk3NjAwMAorNTc2IDEgMzAwMDAwMAorNTc2IDEgMzAyNDAwMAorNTc2IDEgMzA0ODAwMAorNTc2IDEgMzA3MjAwMAorNTc2IDEgMzA5NjAwMAorNTc2IDEgMzEyMDAwMAorNTc2IDEgMzE0NDAwMAorNTc2IDEgMzE2ODAwMAorNTc2IDEgMzE5MjAwMAorNTc2IDEgMzIxNjAwMAorNTc2IDEgMzI0MDAwMAorNTc2IDEgMzI2NDAwMAorNTc2IDEgMzI4ODAwMAorNTc2IDEgMzMxMjAwMAorNTc2IDEgMzMzNjAwMAorNTc2IDEgMzM2MDAwMAorNTc2IDEgMzM4NDAwMAorNTc2IDEgMzQwODAwMAorNTc2IDEgMzQzMjAwMAorNTc2IDEgMzQ1NjAwMAorNTc2IDEgMzQ4MDAwMAorNTc2IDEgMzUwNDAwMAorNTc2IDEgMzUyODAwMAorNTc2IDEgMzU1MjAwMAorNTc2IDEgMzU3NjAwMAorNTc2IDEgMzYwMDAwMAorNTc2IDEgMzYyNDAwMAorNTc2IDEgMzY0ODAwMAorNTc2IDEgMzY3MjAwMAorNTc2IDEgMzY5NjAwMAorNTc2IDEgMzcyMDAwMAorNTc2IDEgMzc0NDAwMAorNTc2IDEgMzc2ODAwMAorNTc2IDEgMzc5MjAwMAorNTc2IDEgMzgxNjAwMAorNTc2IDEgMzg0MDAwMAorNTc2IDEgMzg2NDAwMAorNTc2IDEgMzg4ODAwMAorNTc2IDEgMzkxMjAwMAorNTc2IDEgMzkzNjAwMAorNTc2IDEgMzk2MDAwMAorNTc2IDEgMzk4NDAwMAorNTc2IDEgNDAwODAwMAorNTc2IDEgNDAzMjAwMAorNTc2IDEgNDA1NjAwMAorNTc2IDEgNDA4MDAwMAorNTc2IDEgNDEwNDAwMAorNTc2IDEgNDEyODAwMAorNTc2IDEgNDE1MjAwMAorNTc2IDEgNDE3NjAwMAorNTc2IDEgNDIwMDAwMAorNTc2IDEgNDIyNDAwMAorNTc2IDEgNDI0ODAwMAorNTc2IDEgNDI3MjAwMAorNTc2IDEgNDI5NjAwMAorNTc2IDEgNDMyMDAwMAorNTc2IDEgNDM0NDAwMAorNTc2IDEgNDM2ODAwMAorNTc2IDEgNDM5MjAwMAorNTc2IDEgNDQxNjAwMAorNTc2IDEgNDQ0MDAwMAorNTc2IDEgNDQ2NDAwMAorNTc2IDEgNDQ4ODAwMAorNTc2IDEgNDUxMjAwMAorNTc2IDEgNDUzNjAwMAorNTc2IDEgNDU2MDAwMAorNTc2IDEgNDU4NDAwMAorNTc2IDEgNDYwODAwMAorNTc2IDEgNDYzMjAwMAorNTc2IDEgNDY1NjAwMAorNTc2IDEgNDY4MDAwMAorNTc2IDEgNDcwNDAwMAorNTc2IDEgNDcyODAwMAorNTc2IDEgNDc1MjAwMAorNTc2IDEgNDc3NjAwMAorNTc2IDEgNDgwMDAwMAorNTc2IDEgNDgyNDAwMAorNTc2IDEgNDg0ODAwMAorNTc2IDEgNDg3MjAwMAorNTc2IDEgNDg5NjAwMAorNTc2IDEgNDkyMDAwMAorNTc2IDEgNDk0NDAwMAorNTc2IDEgNDk2ODAwMAorNTc2IDEgNDk5MjAwMAorNTc2IDEgNTAxNjAwMAorNTc2IDEgNTA0MDAwMAorNTc2IDEgNTA2NDAwMAorNTc2IDEgNTA4ODAwMAorNTc2IDEgNTExMjAwMAorNTc2IDEgNTEzNjAwMAorNTc2IDEgNTE2MDAwMAorNTc2IDEgNTE4NDAwMAorNTc2IDEgNTIwODAwMAorNTc2IDEgNTIzMjAwMAorNTc2IDEgNTI1NjAwMAorNTc2IDEgNTI4MDAwMAorNTc2IDEgNTMwNDAwMAorNTc2IDEgNTMyODAwMAorNTc2IDEgNTM1MjAwMAorNTc2IDEgNTM3NjAwMAorNTc2IDEgNTQwMDAwMAorNTc2IDEgNTQyNDAwMAorNTc2IDEgNTQ0ODAwMAorNTc2IDEgNTQ3MjAwMAorNTc2IDEgNTQ5NjAwMAorNTc2IDEgNTUyMDAwMAorNTc2IDEgNTU0NDAwMAorNTc2IDEgNTU2ODAwMAorNTc2IDEgNTU5MjAwMAorNTc2IDEgNTYxNjAwMAorNTc2IDEgNTY0MDAwMAorNTc2IDEgNTY2NDAwMAorNTc2IDEgNTY4ODAwMAorNTc2IDEgNTcxMjAwMAorNTc2IDEgNTczNjAwMAorNTc2IDEgNTc2MDAwMAorNTc2IDEgNTc4NDAwMAorNTc2IDEgNTgwODAwMAorNTc2IDEgNTgzMjAwMAorNTc2IDEgNTg1NjAwMAorNTc2IDEgNTg4MDAwMAorNTc2IDEgNTkwNDAwMAorNTc2IDEgNTkyODAwMAorNTc2IDEgNTk1MjAwMAorNTc2IDEgNTk3NjAwMAorNTc2IDEgNjAwMDAwMAorNTc2IDEgNjAyNDAwMAorNTc2IDEgNjA0ODAwMAorNTc2IDEgNjA3MjAwMAorNTc2IDEgNjA5NjAwMAorNTc2IDEgNjEyMDAwMAorNTc2IDEgNjE0NDAwMAorNTc2IDEgNjE2ODAwMAorNTc2IDEgNjE5MjAwMAorNTc2IDEgNjIxNjAwMAorNTc2IDEgNjI0MDAwMAorNTc2IDEgNjI2NDAwMAorNTc2IDEgNjI4ODAwMAorNTc2IDEgNjMxMjAwMAorNTc2IDEgNjMzNjAwMAorNTc2IDEgNjM2MDAwMAorNTc2IDEgNjM4NDAwMAorNTc2IDEgNjQwODAwMAorNTc2IDEgNjQzMjAwMAorNTc2IDEgNjQ1NjAwMAorNTc2IDEgNjQ4MDAwMAorNTc2IDEgNjUwNDAwMAorNTc2IDEgNjUyODAwMAorNTc2IDEgNjU1MjAwMAorNTc2IDEgNjU3NjAwMAorNTc2IDEgNjYwMDAwMAorNTc2IDEgNjYyNDAwMAorNTc2IDEgNjY0ODAwMAorNTc2IDEgNjY3MjAwMAorNTc2IDEgNjY5NjAwMAorNTc2IDEgNjcyMDAwMAorNTc2IDEgNjc0NDAwMAorNTc2IDEgNjc2ODAwMAorNTc2IDEgNjc5MjAwMAorNTc2IDEgNjgxNjAwMAorNTc2IDEgNjg0MDAwMAorNTc2IDEgNjg2NDAwMAorNTc2IDEgNjg4ODAwMAorNTc2IDEgNjkxMjAwMAorNTc2IDEgNjkzNjAwMAorNTc2IDEgNjk2MDAwMAorNTc2IDEgNjk4NDAwMAorNTc2IDEgNzAwODAwMAorNTc2IDEgNzAzMjAwMAorNTc2IDEgNzA1NjAwMAorNTc2IDEgNzA4MDAwMAorNTc2IDEgNzEwNDAwMAorNTc2IDEgNzEyODAwMAorNTc2IDEgNzE1MjAwMAorNTc2IDEgNzE3NjAwMAorNTc2IDEgNzIwMDAwMAorNTc2IDEgNzIyNDAwMAorNTc2IDEgNzI0ODAwMAorNTc2IDEgNzI3MjAwMAorNTc2IDEgNzI5NjAwMAorNTc2IDEgNzMyMDAwMAorNTc2IDEgNzM0NDAwMAorNTc2IDEgNzM2ODAwMAorNTc2IDEgNzM5MjAwMAorNTc2IDEgNzQxNjAwMAorNTc2IDEgNzQ0MDAwMAorNTc2IDEgNzQ2NDAwMAorNTc2IDEgNzQ4ODAwMAorNTc2IDEgNzUxMjAwMAorNTc2IDEgNzUzNjAwMAorNTc2IDEgNzU2MDAwMAorNTc2IDEgNzU4NDAwMAorNTc2IDEgNzYwODAwMAorNTc2IDEgNzYzMjAwMAorNTc2IDEgNzY1NjAwMAorNTc2IDEgNzY4MDAwMAorNTc2IDEgNzcwNDAwMAorNTc2IDEgNzcyODAwMAorNTc2IDEgNzc1MjAwMAorNTc2IDEgNzc3NjAwMAorNTc2IDEgNzgwMDAwMAorNTc2IDEgNzgyNDAwMAorNTc2IDEgNzg0ODAwMAorNTc2IDEgNzg3MjAwMAorNTc2IDEgNzg5NjAwMAorNTc2IDEgNzkyMDAwMAorNTc2IDEgNzk0NDAwMAorNTc2IDEgNzk2ODAwMAorNTc2IDEgNzk5MjAwMAorNTc2IDEgODAxNjAwMAorNTc2IDEgODA0MDAwMAorNTc2IDEgODA2NDAwMAorNTc2IDEgODA4ODAwMAorNTc2IDEgODExMjAwMAorNTc2IDEgODEzNjAwMAorNTc2IDEgODE2MDAwMAorNTc2IDEgODE4NDAwMAorNTc2IDEgODIwODAwMAorNTc2IDEgODIzMjAwMAorNTc2IDEgODI1NjAwMAorNTc2IDEgODI4MDAwMAorNTc2IDEgODMwNDAwMAorNTc2IDEgODMyODAwMAorNTc2IDEgODM1MjAwMAorNTc2IDEgODM3NjAwMAorNTc2IDEgODQwMDAwMAorNTc2IDEgODQyNDAwMAorNTc2IDEgODQ0ODAwMAorNTc2IDEgODQ3MjAwMAorNTc2IDEgODQ5NjAwMAorNTc2IDEgODUyMDAwMAorNTc2IDEgODU0NDAwMAorNTc2IDEgODU2ODAwMAorNTc2IDEgODU5MjAwMAorNTc2IDEgODYxNjAwMAorNTc2IDEgODY0MDAwMAorNTc2IDEgODY2NDAwMAorNTc2IDEgODY4ODAwMAorNTc2IDEgODcxMjAwMAorNTc2IDEgODczNjAwMAorNTc2IDEgODc2MDAwMAorNTc2IDEgODc4NDAwMAorNTc2IDEgODgwODAwMAorNTc2IDEgODgzMjAwMAorNTc2IDEgODg1NjAwMAorNTc2IDEgODg4MDAwMAorNTc2IDEgODkwNDAwMAorNTc2IDEgODkyODAwMAorNTc2IDEgODk1MjAwMAorNTc2IDEgODk3NjAwMAorNTc2IDEgOTAwMDAwMAorNTc2IDEgOTAyNDAwMAorNTc2IDEgOTA0ODAwMAorNTc2IDEgOTA3MjAwMAorNTc2IDEgOTA5NjAwMAorNTc2IDEgOTEyMDAwMAorNTc2IDEgOTE0NDAwMAorNTc2IDEgOTE2ODAwMAorNTc2IDEgOTE5MjAwMAorNTc2IDEgOTIxNjAwMAorNTc2IDEgOTI0MDAwMAorNTc2IDEgOTI2NDAwMAorNTc2IDEgOTI4ODAwMAorNTc2IDEgOTMxMjAwMAorNTc2IDEgOTMzNjAwMAorNTc2IDEgOTM2MDAwMAorNTc2IDEgOTM4NDAwMAorNTc2IDEgOTQwODAwMAorNTc2IDEgOTQzMjAwMAorNTc2IDEgOTQ1NjAwMAorNTc2IDEgOTQ4MDAwMAorNTc2IDEgOTUwNDAwMAorNTc2IDEgOTUyODAwMAorNTc2IDEgOTU1MjAwMAorNTc2IDEgOTU3NjAwMAorNTc2IDEgOTYwMDAwMAorNTc2IDEgOTYyNDAwMAorNTc2IDEgOTY0ODAwMAorNTc2IDEgOTY3MjAwMAorNTc2IDEgOTY5NjAwMAorNTc2IDEgOTcyMDAwMAorNTc2IDEgOTc0NDAwMAorNTc2IDEgOTc2ODAwMAorNTc2IDEgOTc5MjAwMAorNTc2IDEgOTgxNjAwMAorNTc2IDEgOTg0MDAwMAorNTc2IDEgOTg2NDAwMAorNTc2IDEgOTg4ODAwMAorNTc2IDEgOTkxMjAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4M2E0NDEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXAzX3N0ZXJlb18xOTJrYnBzXzQ4MDAwaHoubXAzCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6X211bHRpX2ZyYW1lLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3NWM3NWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcDNfc3RlcmVvXzE5MmticHNfNDgwMDBoel9tdWx0aV9mcmFtZS5pbmZvCkBAIC0wLDAgKzEsMzg1IEBACis1NzYgMSAwCis1NzYgMSAyNDAwMAorMTE1MiAxIDQ4MDAwCisxMTUyIDEgOTYwMDAKKzExNTIgMSAxNDQwMDAKKzExNTIgMSAxOTIwMDAKKzE3MjggMSAyNDAwMDAKKzE3MjggMSAzMTIwMDAKKzE3MjggMSAzODQwMDAKKzE3MjggMSA0NTYwMDAKKzE3MjggMSA1MjgwMDAKKzIzMDQgMSA2MDAwMDAKKzIzMDQgMSA2OTYwMDAKKzIzMDQgMSA3OTIwMDAKKzIzMDQgMSA4ODgwMDAKKzIzMDQgMSA5ODQwMDAKKzU3NiAxIDEwODAwMDAKKzU3NiAxIDExMDQwMDAKKzU3NiAxIDExMjgwMDAKKzU3NiAxIDExNTIwMDAKKzU3NiAxIDExNzYwMDAKKzU3NiAxIDEyMDAwMDAKKzU3NiAxIDEyMjQwMDAKKzU3NiAxIDEyNDgwMDAKKzU3NiAxIDEyNzIwMDAKKzU3NiAxIDEyOTYwMDAKKzU3NiAxIDEzMjAwMDAKKzU3NiAxIDEzNDQwMDAKKzU3NiAxIDEzNjgwMDAKKzU3NiAxIDEzOTIwMDAKKzU3NiAxIDE0MTYwMDAKKzU3NiAxIDE0NDAwMDAKKzU3NiAxIDE0NjQwMDAKKzU3NiAxIDE0ODgwMDAKKzU3NiAxIDE1MTIwMDAKKzU3NiAxIDE1MzYwMDAKKzU3NiAxIDE1NjAwMDAKKzU3NiAxIDE1ODQwMDAKKzU3NiAxIDE2MDgwMDAKKzU3NiAxIDE2MzIwMDAKKzU3NiAxIDE2NTYwMDAKKzU3NiAxIDE2ODAwMDAKKzU3NiAxIDE3MDQwMDAKKzU3NiAxIDE3MjgwMDAKKzU3NiAxIDE3NTIwMDAKKzU3NiAxIDE3NzYwMDAKKzU3NiAxIDE4MDAwMDAKKzU3NiAxIDE4MjQwMDAKKzU3NiAxIDE4NDgwMDAKKzU3NiAxIDE4NzIwMDAKKzU3NiAxIDE4OTYwMDAKKzU3NiAxIDE5MjAwMDAKKzU3NiAxIDE5NDQwMDAKKzU3NiAxIDE5NjgwMDAKKzU3NiAxIDE5OTIwMDAKKzU3NiAxIDIwMTYwMDAKKzU3NiAxIDIwNDAwMDAKKzU3NiAxIDIwNjQwMDAKKzU3NiAxIDIwODgwMDAKKzU3NiAxIDIxMTIwMDAKKzU3NiAxIDIxMzYwMDAKKzU3NiAxIDIxNjAwMDAKKzU3NiAxIDIxODQwMDAKKzU3NiAxIDIyMDgwMDAKKzU3NiAxIDIyMzIwMDAKKzU3NiAxIDIyNTYwMDAKKzU3NiAxIDIyODAwMDAKKzU3NiAxIDIzMDQwMDAKKzU3NiAxIDIzMjgwMDAKKzU3NiAxIDIzNTIwMDAKKzU3NiAxIDIzNzYwMDAKKzU3NiAxIDI0MDAwMDAKKzU3NiAxIDI0MjQwMDAKKzU3NiAxIDI0NDgwMDAKKzU3NiAxIDI0NzIwMDAKKzU3NiAxIDI0OTYwMDAKKzU3NiAxIDI1MjAwMDAKKzU3NiAxIDI1NDQwMDAKKzU3NiAxIDI1NjgwMDAKKzU3NiAxIDI1OTIwMDAKKzU3NiAxIDI2MTYwMDAKKzU3NiAxIDI2NDAwMDAKKzU3NiAxIDI2NjQwMDAKKzU3NiAxIDI2ODgwMDAKKzU3NiAxIDI3MTIwMDAKKzU3NiAxIDI3MzYwMDAKKzU3NiAxIDI3NjAwMDAKKzU3NiAxIDI3ODQwMDAKKzU3NiAxIDI4MDgwMDAKKzU3NiAxIDI4MzIwMDAKKzU3NiAxIDI4NTYwMDAKKzU3NiAxIDI4ODAwMDAKKzU3NiAxIDI5MDQwMDAKKzU3NiAxIDI5MjgwMDAKKzU3NiAxIDI5NTIwMDAKKzU3NiAxIDI5NzYwMDAKKzU3NiAxIDMwMDAwMDAKKzU3NiAxIDMwMjQwMDAKKzU3NiAxIDMwNDgwMDAKKzU3NiAxIDMwNzIwMDAKKzU3NiAxIDMwOTYwMDAKKzU3NiAxIDMxMjAwMDAKKzU3NiAxIDMxNDQwMDAKKzU3NiAxIDMxNjgwMDAKKzU3NiAxIDMxOTIwMDAKKzU3NiAxIDMyMTYwMDAKKzU3NiAxIDMyNDAwMDAKKzU3NiAxIDMyNjQwMDAKKzU3NiAxIDMyODgwMDAKKzU3NiAxIDMzMTIwMDAKKzU3NiAxIDMzMzYwMDAKKzU3NiAxIDMzNjAwMDAKKzU3NiAxIDMzODQwMDAKKzU3NiAxIDM0MDgwMDAKKzU3NiAxIDM0MzIwMDAKKzU3NiAxIDM0NTYwMDAKKzU3NiAxIDM0ODAwMDAKKzU3NiAxIDM1MDQwMDAKKzU3NiAxIDM1MjgwMDAKKzU3NiAxIDM1NTIwMDAKKzU3NiAxIDM1NzYwMDAKKzU3NiAxIDM2MDAwMDAKKzU3NiAxIDM2MjQwMDAKKzU3NiAxIDM2NDgwMDAKKzU3NiAxIDM2NzIwMDAKKzU3NiAxIDM2OTYwMDAKKzU3NiAxIDM3MjAwMDAKKzU3NiAxIDM3NDQwMDAKKzU3NiAxIDM3NjgwMDAKKzU3NiAxIDM3OTIwMDAKKzU3NiAxIDM4MTYwMDAKKzU3NiAxIDM4NDAwMDAKKzU3NiAxIDM4NjQwMDAKKzU3NiAxIDM4ODgwMDAKKzU3NiAxIDM5MTIwMDAKKzU3NiAxIDM5MzYwMDAKKzU3NiAxIDM5NjAwMDAKKzU3NiAxIDM5ODQwMDAKKzU3NiAxIDQwMDgwMDAKKzU3NiAxIDQwMzIwMDAKKzU3NiAxIDQwNTYwMDAKKzU3NiAxIDQwODAwMDAKKzU3NiAxIDQxMDQwMDAKKzU3NiAxIDQxMjgwMDAKKzU3NiAxIDQxNTIwMDAKKzU3NiAxIDQxNzYwMDAKKzU3NiAxIDQyMDAwMDAKKzU3NiAxIDQyMjQwMDAKKzU3NiAxIDQyNDgwMDAKKzU3NiAxIDQyNzIwMDAKKzU3NiAxIDQyOTYwMDAKKzU3NiAxIDQzMjAwMDAKKzU3NiAxIDQzNDQwMDAKKzU3NiAxIDQzNjgwMDAKKzU3NiAxIDQzOTIwMDAKKzU3NiAxIDQ0MTYwMDAKKzU3NiAxIDQ0NDAwMDAKKzU3NiAxIDQ0NjQwMDAKKzU3NiAxIDQ0ODgwMDAKKzU3NiAxIDQ1MTIwMDAKKzU3NiAxIDQ1MzYwMDAKKzU3NiAxIDQ1NjAwMDAKKzU3NiAxIDQ1ODQwMDAKKzU3NiAxIDQ2MDgwMDAKKzU3NiAxIDQ2MzIwMDAKKzU3NiAxIDQ2NTYwMDAKKzU3NiAxIDQ2ODAwMDAKKzU3NiAxIDQ3MDQwMDAKKzU3NiAxIDQ3MjgwMDAKKzU3NiAxIDQ3NTIwMDAKKzU3NiAxIDQ3NzYwMDAKKzU3NiAxIDQ4MDAwMDAKKzU3NiAxIDQ4MjQwMDAKKzU3NiAxIDQ4NDgwMDAKKzU3NiAxIDQ4NzIwMDAKKzU3NiAxIDQ4OTYwMDAKKzU3NiAxIDQ5MjAwMDAKKzU3NiAxIDQ5NDQwMDAKKzU3NiAxIDQ5NjgwMDAKKzU3NiAxIDQ5OTIwMDAKKzU3NiAxIDUwMTYwMDAKKzU3NiAxIDUwNDAwMDAKKzU3NiAxIDUwNjQwMDAKKzU3NiAxIDUwODgwMDAKKzU3NiAxIDUxMTIwMDAKKzU3NiAxIDUxMzYwMDAKKzU3NiAxIDUxNjAwMDAKKzU3NiAxIDUxODQwMDAKKzU3NiAxIDUyMDgwMDAKKzU3NiAxIDUyMzIwMDAKKzU3NiAxIDUyNTYwMDAKKzU3NiAxIDUyODAwMDAKKzU3NiAxIDUzMDQwMDAKKzU3NiAxIDUzMjgwMDAKKzU3NiAxIDUzNTIwMDAKKzU3NiAxIDUzNzYwMDAKKzU3NiAxIDU0MDAwMDAKKzU3NiAxIDU0MjQwMDAKKzU3NiAxIDU0NDgwMDAKKzU3NiAxIDU0NzIwMDAKKzU3NiAxIDU0OTYwMDAKKzU3NiAxIDU1MjAwMDAKKzU3NiAxIDU1NDQwMDAKKzU3NiAxIDU1NjgwMDAKKzU3NiAxIDU1OTIwMDAKKzU3NiAxIDU2MTYwMDAKKzU3NiAxIDU2NDAwMDAKKzU3NiAxIDU2NjQwMDAKKzU3NiAxIDU2ODgwMDAKKzU3NiAxIDU3MTIwMDAKKzU3NiAxIDU3MzYwMDAKKzU3NiAxIDU3NjAwMDAKKzU3NiAxIDU3ODQwMDAKKzU3NiAxIDU4MDgwMDAKKzU3NiAxIDU4MzIwMDAKKzU3NiAxIDU4NTYwMDAKKzU3NiAxIDU4ODAwMDAKKzU3NiAxIDU5MDQwMDAKKzU3NiAxIDU5MjgwMDAKKzU3NiAxIDU5NTIwMDAKKzU3NiAxIDU5NzYwMDAKKzU3NiAxIDYwMDAwMDAKKzU3NiAxIDYwMjQwMDAKKzU3NiAxIDYwNDgwMDAKKzU3NiAxIDYwNzIwMDAKKzU3NiAxIDYwOTYwMDAKKzU3NiAxIDYxMjAwMDAKKzU3NiAxIDYxNDQwMDAKKzU3NiAxIDYxNjgwMDAKKzU3NiAxIDYxOTIwMDAKKzU3NiAxIDYyMTYwMDAKKzU3NiAxIDYyNDAwMDAKKzU3NiAxIDYyNjQwMDAKKzU3NiAxIDYyODgwMDAKKzU3NiAxIDYzMTIwMDAKKzU3NiAxIDYzMzYwMDAKKzU3NiAxIDYzNjAwMDAKKzU3NiAxIDYzODQwMDAKKzU3NiAxIDY0MDgwMDAKKzU3NiAxIDY0MzIwMDAKKzU3NiAxIDY0NTYwMDAKKzU3NiAxIDY0ODAwMDAKKzU3NiAxIDY1MDQwMDAKKzU3NiAxIDY1MjgwMDAKKzU3NiAxIDY1NTIwMDAKKzU3NiAxIDY1NzYwMDAKKzU3NiAxIDY2MDAwMDAKKzU3NiAxIDY2MjQwMDAKKzU3NiAxIDY2NDgwMDAKKzU3NiAxIDY2NzIwMDAKKzU3NiAxIDY2OTYwMDAKKzU3NiAxIDY3MjAwMDAKKzU3NiAxIDY3NDQwMDAKKzU3NiAxIDY3NjgwMDAKKzU3NiAxIDY3OTIwMDAKKzU3NiAxIDY4MTYwMDAKKzU3NiAxIDY4NDAwMDAKKzU3NiAxIDY4NjQwMDAKKzU3NiAxIDY4ODgwMDAKKzU3NiAxIDY5MTIwMDAKKzU3NiAxIDY5MzYwMDAKKzU3NiAxIDY5NjAwMDAKKzU3NiAxIDY5ODQwMDAKKzU3NiAxIDcwMDgwMDAKKzU3NiAxIDcwMzIwMDAKKzU3NiAxIDcwNTYwMDAKKzU3NiAxIDcwODAwMDAKKzU3NiAxIDcxMDQwMDAKKzU3NiAxIDcxMjgwMDAKKzU3NiAxIDcxNTIwMDAKKzU3NiAxIDcxNzYwMDAKKzU3NiAxIDcyMDAwMDAKKzU3NiAxIDcyMjQwMDAKKzU3NiAxIDcyNDgwMDAKKzU3NiAxIDcyNzIwMDAKKzU3NiAxIDcyOTYwMDAKKzU3NiAxIDczMjAwMDAKKzU3NiAxIDczNDQwMDAKKzU3NiAxIDczNjgwMDAKKzU3NiAxIDczOTIwMDAKKzU3NiAxIDc0MTYwMDAKKzU3NiAxIDc0NDAwMDAKKzU3NiAxIDc0NjQwMDAKKzU3NiAxIDc0ODgwMDAKKzU3NiAxIDc1MTIwMDAKKzU3NiAxIDc1MzYwMDAKKzU3NiAxIDc1NjAwMDAKKzU3NiAxIDc1ODQwMDAKKzU3NiAxIDc2MDgwMDAKKzU3NiAxIDc2MzIwMDAKKzU3NiAxIDc2NTYwMDAKKzU3NiAxIDc2ODAwMDAKKzU3NiAxIDc3MDQwMDAKKzU3NiAxIDc3MjgwMDAKKzU3NiAxIDc3NTIwMDAKKzU3NiAxIDc3NzYwMDAKKzU3NiAxIDc4MDAwMDAKKzU3NiAxIDc4MjQwMDAKKzU3NiAxIDc4NDgwMDAKKzU3NiAxIDc4NzIwMDAKKzU3NiAxIDc4OTYwMDAKKzU3NiAxIDc5MjAwMDAKKzU3NiAxIDc5NDQwMDAKKzU3NiAxIDc5NjgwMDAKKzU3NiAxIDc5OTIwMDAKKzU3NiAxIDgwMTYwMDAKKzU3NiAxIDgwNDAwMDAKKzU3NiAxIDgwNjQwMDAKKzU3NiAxIDgwODgwMDAKKzU3NiAxIDgxMTIwMDAKKzU3NiAxIDgxMzYwMDAKKzU3NiAxIDgxNjAwMDAKKzU3NiAxIDgxODQwMDAKKzU3NiAxIDgyMDgwMDAKKzU3NiAxIDgyMzIwMDAKKzU3NiAxIDgyNTYwMDAKKzU3NiAxIDgyODAwMDAKKzU3NiAxIDgzMDQwMDAKKzU3NiAxIDgzMjgwMDAKKzU3NiAxIDgzNTIwMDAKKzU3NiAxIDgzNzYwMDAKKzU3NiAxIDg0MDAwMDAKKzU3NiAxIDg0MjQwMDAKKzU3NiAxIDg0NDgwMDAKKzU3NiAxIDg0NzIwMDAKKzU3NiAxIDg0OTYwMDAKKzU3NiAxIDg1MjAwMDAKKzU3NiAxIDg1NDQwMDAKKzU3NiAxIDg1NjgwMDAKKzU3NiAxIDg1OTIwMDAKKzU3NiAxIDg2MTYwMDAKKzU3NiAxIDg2NDAwMDAKKzU3NiAxIDg2NjQwMDAKKzU3NiAxIDg2ODgwMDAKKzU3NiAxIDg3MTIwMDAKKzU3NiAxIDg3MzYwMDAKKzU3NiAxIDg3NjAwMDAKKzU3NiAxIDg3ODQwMDAKKzU3NiAxIDg4MDgwMDAKKzU3NiAxIDg4MzIwMDAKKzU3NiAxIDg4NTYwMDAKKzU3NiAxIDg4ODAwMDAKKzU3NiAxIDg5MDQwMDAKKzU3NiAxIDg5MjgwMDAKKzU3NiAxIDg5NTIwMDAKKzU3NiAxIDg5NzYwMDAKKzU3NiAxIDkwMDAwMDAKKzU3NiAxIDkwMjQwMDAKKzU3NiAxIDkwNDgwMDAKKzU3NiAxIDkwNzIwMDAKKzU3NiAxIDkwOTYwMDAKKzU3NiAxIDkxMjAwMDAKKzU3NiAxIDkxNDQwMDAKKzU3NiAxIDkxNjgwMDAKKzU3NiAxIDkxOTIwMDAKKzU3NiAxIDkyMTYwMDAKKzU3NiAxIDkyNDAwMDAKKzU3NiAxIDkyNjQwMDAKKzU3NiAxIDkyODgwMDAKKzU3NiAxIDkzMTIwMDAKKzU3NiAxIDkzMzYwMDAKKzU3NiAxIDkzNjAwMDAKKzU3NiAxIDkzODQwMDAKKzU3NiAxIDk0MDgwMDAKKzU3NiAxIDk0MzIwMDAKKzU3NiAxIDk0NTYwMDAKKzU3NiAxIDk0ODAwMDAKKzU3NiAxIDk1MDQwMDAKKzU3NiAxIDk1MjgwMDAKKzU3NiAxIDk1NTIwMDAKKzU3NiAxIDk1NzYwMDAKKzU3NiAxIDk2MDAwMDAKKzU3NiAxIDk2MjQwMDAKKzU3NiAxIDk2NDgwMDAKKzU3NiAxIDk2NzIwMDAKKzU3NiAxIDk2OTYwMDAKKzU3NiAxIDk3MjAwMDAKKzU3NiAxIDk3NDQwMDAKKzU3NiAxIDk3NjgwMDAKKzU3NiAxIDk3OTIwMDAKKzU3NiAxIDk4MTYwMDAKKzU3NiAxIDk4NDAwMDAKKzU3NiAxIDk4NjQwMDAKKzU3NiAxIDk4ODgwMDAKKzU3NiAxIDk5MTIwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU0MDY0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5pbmZvCkBAIC0wLDAgKzEsMjQ5IEBACis2NDU4IDEgNDAwMDAKKzQwNDAgMCA4MDAwMAorMzI1NSAwIDEyMDAwMAorMzAyNiAwIDE2MDAwMAorMzI5MyAwIDIwMDAwMAorMzA4OSAwIDI0MDAwMAorMzMwNSAwIDI4MDAwMAorMTc5NCAwIDMyMDAwMAorMTg0OCAwIDM2MDAwMAorMTI4OCAwIDQwMDAwMAorMTUxMSAwIDQ0MDAwMAorMTUyNyAwIDQ4MDAwMAorNjE0NiAxIDUyMDAwMAorMTI0MyAwIDU2MDAwMAorMTA5OSAwIDYwMDAwMAorMTM1NCAwIDY0MDAwMAorMTM2NiAwIDY4MDAwMAorMTA0MiAwIDcyMDAwMAorMTYwMCAwIDc2MDAwMAorODc1IDAgODAwMDAwCisxNzI4IDAgODQwMDAwCisxMjU0IDAgODgwMDAwCis5OTQgMCA5MjAwMDAKKzE1OTEgMCA5NjAwMDAKKzYyNjUgMSAxMDAwMDAwCisxMDE4IDAgMTA0MDAwMAorODI1IDAgMTA4MDAwMAorODY5IDAgMTEyMDAwMAorOTIxIDAgMTE2MDAwMAorOTc1IDAgMTIwMDAwMAorOTI0IDAgMTI0MDAwMAorODM0IDAgMTI4MDAwMAorMTA2NiAwIDEzMjAwMDAKKzc5MyAwIDEzNjAwMDAKKzg4OSAwIDE0MDAwMDAKKzIwNTAgMCAxNDQwMDAwCis2Mjc2IDEgMTQ4MDAwMAorODgxIDAgMTUyMDAwMAorMjYwIDAgMTU2MDAwMAorNzMwIDAgMTYwMDAwMAorNDMxIDAgMTY0MDAwMAorMzUxIDAgMTY4MDAwMAorMzIxIDAgMTcyMDAwMAorMzgwMiAwIDE3NjAwMDAKKzE0NiAwIDE4MDAwMDAKKzY0NjIgMCAxODQwMDAwCiszMjQ2IDAgMTg4MDAwMAorNTMzIDAgMTkyMDAwMAorNjIzMSAxIDE5NjAwMDAKKzEzNzggMCAyMDAwMDAwCis3MTkgMCAyMDQwMDAwCis4MTggMCAyMDgwMDAwCis4NTYgMCAyMTIwMDAwCis5MzcgMCAyMTYwMDAwCis2MTEgMCAyMjAwMDAwCiszMDMxIDAgMjI0MDAwMAorMTA0MSAwIDIyODAwMDAKKzYwNCAwIDIzMjAwMDAKKzcxNCAwIDIzNjAwMDAKKzEyODMgMCAyNDAwMDAwCis3NTY1IDEgMjQ0MDAwMAorNjAyIDAgMjQ4MDAwMAorNTMwIDAgMjUyMDAwMAorMjU3OSAwIDI1NjAwMDAKKzExNSAwIDI2MDAwMDAKKzEwNTggMCAyNjQwMDAwCis2ODkgMCAyNjgwMDAwCisxMTE5IDAgMjcyMDAwMAorNjk4IDAgMjc2MDAwMAorMTAwNiAwIDI4MDAwMDAKKzU0NSAwIDI4NDAwMDAKKzE2MTcgMCAyODgwMDAwCis5MTIzIDEgMjkyMDAwMAorNTI3IDAgMjk2MDAwMAorMTU3NiAwIDMwMDAwMDAKKzQ2NSAwIDMwNDAwMDAKKzc0MSAwIDMwODAwMDAKKzUyMSAwIDMxMjAwMDAKKzEzMjIgMCAzMTYwMDAwCis3NzUgMCAzMjAwMDAwCis4NjMgMCAzMjQwMDAwCis5MTAgMCAzMjgwMDAwCis5MTUgMCAzMzIwMDAwCis5MjYgMCAzMzYwMDAwCis3NTU2IDEgMzQwMDAwMAorNzQxIDAgMzQ0MDAwMAorNTI3IDAgMzQ4MDAwMAorMjUxNiAwIDM1MjAwMDAKKzQ1OSAwIDM1NjAwMDAKKzQwNCAwIDM2MDAwMDAKKzUwOSAwIDM2NDAwMDAKKzEyMjcgMCAzNjgwMDAwCisxNTYxIDAgMzcyMDAwMAorNDkwIDAgMzc2MDAwMAorNzEyIDAgMzgwMDAwMAorODAzIDAgMzg0MDAwMAorNzUyNCAxIDM4ODAwMDAKKzczMCAwIDM5MjAwMDAKKzQ2MSAwIDM5NjAwMDAKKzI1MjYgMCA0MDAwMDAwCis0NTMgMCA0MDQwMDAwCis2MzIgMCA0MDgwMDAwCis3ODMgMCA0MTIwMDAwCis4NDMgMCA0MTYwMDAwCis5MTggMCA0MjAwMDAwCis5NjEgMCA0MjQwMDAwCis5NDggMCA0MjgwMDAwCis5NTkgMCA0MzIwMDAwCis3NTk4IDEgNDM2MDAwMAorNjc4IDAgNDQwMDAwMAorNTY5IDAgNDQ0MDAwMAorODkzIDAgNDQ4MDAwMAorNjI0IDAgNDUyMDAwMAorNzU1IDAgNDU2MDAwMAorMjIzNCAwIDQ2MDAwMDAKKzU1NiAwIDQ2NDAwMDAKKzk0NCAwIDQ2ODAwMDAKKzczOSAwIDQ3MjAwMDAKKzg2MiAwIDQ3NjAwMDAKKzkzOCAwIDQ4MDAwMDAKKzc1NzQgMSA0ODQwMDAwCis2OTkgMCA0ODgwMDAwCis3MDEgMCA0OTIwMDAwCis1MzAgMCA0OTYwMDAwCis2ODkgMCA1MDAwMDAwCis3NzggMCA1MDQwMDAwCis4NTYgMCA1MDgwMDAwCis5MzAgMCA1MTIwMDAwCis5NzUgMCA1MTYwMDAwCisxMDIxIDAgNTIwMDAwMAorMTA3NCAwIDUyNDAwMDAKKzk3OCAwIDUyODAwMDAKKzgwMjEgMSA1MzIwMDAwCis3MDQgMCA1MzYwMDAwCis2MTAgMCA1NDAwMDAwCis2OTcgMCA1NDQwMDAwCis3MTEgMCA1NDgwMDAwCis4MjAgMCA1NTIwMDAwCis4NDMgMCA1NTYwMDAwCisyNTEgMCA1NjAwMDAwCiszMzY3IDAgNTY0MDAwMAorNTA3IDAgNTY4MDAwMAorMzE2OCAxIDU3MjAwMDAKKzc3OSAwIDU3NjAwMDAKKzMxNiAwIDU4MDAwMDAKKzYzNSAwIDU4NDAwMDAKKzIwNCAwIDU4ODAwMDAKKzk3OCAwIDU5MjAwMDAKKzEyNyAwIDU5NjAwMDAKKzU4OSAwIDYwMDAwMDAKKzYwNCAwIDYwNDAwMDAKKzY2NiAwIDYwODAwMDAKKzU4MiAwIDYxMjAwMDAKKzcyOSAwIDYxNjAwMDAKKzQxNTIgMSA2MjAwMDAwCis4NTggMCA2MjQwMDAwCis3MzkgMCA2MjgwMDAwCis4ODUgMCA2MzIwMDAwCis3NDkgMCA2MzYwMDAwCis5NTAgMCA2NDAwMDAwCis1OTMgMCA2NDQwMDAwCis3NzEgMCA2NDgwMDAwCis2NzggMCA2NTIwMDAwCis1MjkgMCA2NTYwMDAwCis4MzUgMCA2NjAwMDAwCiszOTEgMCA2NjQwMDAwCis0NjkyIDEgNjY4MDAwMAorNDczIDAgNjcyMDAwMAorNzI0IDAgNjc2MDAwMAorMzgxIDAgNjgwMDAwMAorOTA5IDAgNjg0MDAwMAorMzk0IDAgNjg4MDAwMAorNjU5IDAgNjkyMDAwMAorMzY3IDAgNjk2MDAwMAorNjU4IDAgNzAwMDAwMAorNTIzIDAgNzA0MDAwMAorNTU0IDAgNzA4MDAwMAorNTUzIDAgNzEyMDAwMAorNjA4MCAxIDcxNjAwMDAKKzQ5NiAwIDcyMDAwMDAKKzc2MyAwIDcyNDAwMDAKKzkzOSAwIDcyODAwMDAKKzcxNSAwIDczMjAwMDAKKzY3MiAwIDczNjAwMDAKKzYxNCAwIDc0MDAwMDAKKzgxMSAwIDc0NDAwMDAKKzkxNiAwIDc0ODAwMDAKKzExNTMgMCA3NTIwMDAwCis5NDAgMCA3NTYwMDAwCiszMjIgMCA3NjAwMDAwCis2NjEzIDEgNzY0MDAwMAorODUxIDAgNzY4MDAwMAorMTAwNyAwIDc3MjAwMDAKKzUyMCAwIDc3NjAwMDAKKzQ1NiAwIDc4MDAwMDAKKzYzOSAwIDc4NDAwMDAKKzc1OCAwIDc4ODAwMDAKKzg3OSAwIDc5MjAwMDAKKzExNTIgMCA3OTYwMDAwCisxMDYxIDAgODAwMDAwMAorOTQ2IDAgODA0MDAwMAorODU5IDAgODA4MDAwMAorMzYxMCAxIDgxMjAwMDAKKzg3MSAwIDgxNjAwMDAKKzc0NiAwIDgyMDAwMDAKKzM2NyAwIDgyNDAwMDAKKzM5NyAwIDgyODAwMDAKKzkzMCAwIDgzMjAwMDAKKzMzNyAwIDgzNjAwMDAKKzQxOCAwIDg0MDAwMDAKKzc0MCAwIDg0NDAwMDAKKzYzNyAwIDg0ODAwMDAKKzY2NiAwIDg1MjAwMDAKKzYyNyAwIDg1NjAwMDAKKzQzMzggMSA4NjAwMDAwCis3NDUgMCA4NjQwMDAwCis3ODMgMCA4NjgwMDAwCis0NjUgMCA4NzIwMDAwCis0NjAgMCA4NzYwMDAwCis0NTUgMCA4ODAwMDAwCis1MDYgMCA4ODQwMDAwCis0OTIgMCA4ODgwMDAwCis0ODUgMCA4OTIwMDAwCis1MTcgMCA4OTYwMDAwCis1MzQgMCA5MDAwMDAwCiszOTUgMCA5MDQwMDAwCis1NjI2IDEgOTA4MDAwMAorMTE2OSAwIDkxMjAwMDAKKzU2NCAwIDkxNjAwMDAKKzI2MSAwIDkyMDAwMDAKKzMyNyAwIDkyNDAwMDAKKzMwMyAwIDkyODAwMDAKKzExNDUgMCA5MzIwMDAwCisyNTcgMCA5MzYwMDAwCis0OTggMCA5NDAwMDAwCis0NjUgMCA5NDQwMDAwCis0MTQgMCA5NDgwMDAwCis1NTMgMCA5NTIwMDAwCis1NjE3IDEgOTU2MDAwMAorMTA1MiAwIDk2MDAwMDAKKzU5MiAwIDk2NDAwMDAKKzMyMyAwIDk2ODAwMDAKKzQ5NyAwIDk3MjAwMDAKKzQ2NyAwIDk3NjAwMDAKKzcwNSAwIDk4MDAwMDAKKzEwODYgMCA5ODQwMDAwCisxMjUzIDAgOTg4MDAwMAorMTI1MiAwIDk5MjAwMDAKKzc3NiAwIDk5NjAwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzE3NngxNDRfMTA1a2Jwc18yNWZwcy5tMnYgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMubTJ2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkZjkwYzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8xNzZ4MTQ0XzEwNWticHNfMjVmcHMubTJ2CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTdjYWY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5pbmZvCkBAIC0wLDAgKzEsNjAgQEAKKzE2NjgwIDEgMTY2NjYKKzE3MDE3IDAgMzMzMzMKKzEwNTM0IDAgNTAwMDAKKzEwMjg5IDAgNjY2NjYKKzM2OTggMCA4MzMzMworMjc3NiAwIDEwMDAwMAorMTkzNiAwIDExNjY2NgorMTQ5MyAwIDEzMzMzMworMTIxNyAwIDE1MDAwMAorOTkzIDAgMTY2NjY2Cis4MDUgMCAxODMzMzMKKzg1NyAwIDIwMDAwMAorNTA4MiAxIDIxNjY2NgorODEyIDAgMjMzMzMzCis3MTggMCAyNTAwMDAKKzc0NiAwIDI2NjY2NgorNzYyIDAgMjgzMzMzCis4NjUgMCAzMDAwMDAKKzc4MiAwIDMxNjY2NgorODMzIDAgMzMzMzMzCis3NTAgMCAzNTAwMDAKKzgxOSAwIDM2NjY2NgorODI2IDAgMzgzMzMzCis4NDYgMCA0MDAwMDAKKzQ1MjIgMSA0MTY2NjYKKzY3OCAwIDQzMzMzMworNzE4IDAgNDUwMDAwCis4MDMgMCA0NjY2NjYKKzc2OSAwIDQ4MzMzMworNzYyIDAgNTAwMDAwCis1ODcgMCA1MTY2NjYKKzYzNSAwIDUzMzMzMworNjU4IDAgNTUwMDAwCis3MTQgMCA1NjY2NjYKKzY3NyAwIDU4MzMzMworNjk5IDAgNjAwMDAwCis0NjE2IDEgNjE2NjY2Cis4MDAgMCA2MzMzMzMKKzgzMSAwIDY1MDAwMAorOTI4IDAgNjY2NjY2Cis4NjkgMCA2ODMzMzMKKzkzMSAwIDcwMDAwMAorOTMwIDAgNzE2NjY2Cis5NzQgMCA3MzMzMzMKKzk3OCAwIDc1MDAwMAorOTMyIDAgNzY2NjY2Cis5MTggMCA3ODMzMzMKKzk3OCAwIDgwMDAwMAorNDY1NSAxIDgxNjY2NgorODk3IDAgODMzMzMzCis4OTYgMCA4NTAwMDAKKzg4MyAwIDg2NjY2NgorOTQ5IDAgODgzMzMzCis5NjUgMCA5MDAwMDAKKzk1MSAwIDkxNjY2NgorOTAxIDAgOTMzMzMzCis5NjUgMCA5NTAwMDAKKzk1NSAwIDk2NjY2NgorOTQ4IDAgOTgzMzMzCis5NjggMCAxMDAwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLm0ydiBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWcyXzM1MngyODhfMW1icHNfNjBmcHMubTJ2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmNjdjMmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLm0ydgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY5YmE5YjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMuaW5mbwpAQCAtMCwwICsxLDI0MSBAQAorNDcgMzIgMAorMjExMTUgMSAwCisxNjQ1NiAwIDMzMzMzCisxMTg4MCAwIDY2NjY2CisxMjE1NSAwIDEwMDAwMAorMTE0MDIgMCAxMzMzMzMKKzUzNDUgMCAxNjY2NjYKKzI5ODYgMCAyMDAwMDAKKzE5MjQgMCAyMzMzMzMKKzIyNzUgMCAyNjY2NjYKKzI3OTMgMCAzMDAwMDAKKzI3NTYgMCAzMzMzMzMKKzI5MzMgMCAzNjY2NjYKKzIxMTAwIDEgNDAwMDAwCisxMzAyIDAgNDMzMzMzCisyMjA2IDAgNDY2NjY2CisxNTk5IDAgNTAwMDAwCisyNTU4IDAgNTMzMzMzCisyNzg0IDAgNTY2NjY2CisyNDU4IDAgNjAwMDAwCisyNDgwIDAgNjMzMzMzCisxNDQ2IDAgNjY2NjY2CiszMTA5IDAgNzAwMDAwCis5NDQgMCA3MzMzMzMKKzMxMzQgMCA3NjY2NjYKKzIxMzQyIDEgODAwMDAwCis2NTIgMCA4MzMzMzMKKzE3MDggMCA4NjY2NjYKKzIyMDIgMCA5MDAwMDAKKzE2OTUgMCA5MzMzMzMKKzE2NjEgMCA5NjY2NjYKKzE2NTIgMCAxMDAwMDAwCisxNjc5IDAgMTAzMzMzMworMTY5MCAwIDEwNjY2NjYKKzE4MjQgMCAxMTAwMDAwCisxODAzIDAgMTEzMzMzMworMTU5OCAwIDExNjY2NjYKKzIxNTQwIDEgMTIwMDAwMAorMjA1IDAgMTIzMzMzMworMTEyNCAwIDEyNjY2NjYKKzEwNjkgMCAxMzAwMDAwCis4MzggMCAxMzMzMzMzCis3NjUgMCAxMzY2NjY2Cis0MjY1IDAgMTQwMDAwMAorOTQgMCAxNDMzMzMzCisyMDQ2MyAwIDE0NjY2NjYKKzEwMjggMCAxNTAwMDAwCisxNDc1IDAgMTUzMzMzMworMzYzMCAwIDE1NjY2NjYKKzI4MzczIDEgMTYwMDAwMAorNzI1IDAgMTYzMzMzMworMTExOSAwIDE2NjY2NjYKKzE0MjcgMCAxNzAwMDAwCisxNjc5IDAgMTczMzMzMworMTg2NiAwIDE3NjY2NjYKKzExOTcgMCAxODAwMDAwCisxNTcyIDAgMTgzMzMzMworMTY1MSAwIDE4NjY2NjYKKzE2NzggMCAxOTAwMDAwCisxNjg4IDAgMTkzMzMzMworMTY1OSAwIDE5NjY2NjYKKzE5OTAwIDEgMjAwMDAwMAorNTg0IDAgMjAzMzMzMworMTQ3NSAwIDIwNjY2NjYKKzE2NzggMCAyMTAwMDAwCisxMDEwIDAgMjEzMzMzMworMTQzNSAwIDIxNjY2NjYKKzE2MTIgMCAyMjAwMDAwCisxNjAyIDAgMjIzMzMzMworMTcwOSAwIDIyNjY2NjYKKzE3MzcgMCAyMzAwMDAwCisxODM1IDAgMjMzMzMzMworOTI2IDAgMjM2NjY2NgorMjAwOTAgMSAyNDAwMDAwCis2MzEgMCAyNDMzMzMzCisxNTc2IDAgMjQ2NjY2NgorOTQxIDAgMjUwMDAwMAorMjM0OSAwIDI1MzMzMzMKKzExMTIgMCAyNTY2NjY2CisxNTY2IDAgMjYwMDAwMAorMTc3MyAwIDI2MzMzMzMKKzk3OSAwIDI2NjY2NjYKKzIyNDYgMCAyNzAwMDAwCis5MDQgMCAyNzMzMzMzCisxMzQyIDAgMjc2NjY2NgorMjAxNDcgMSAyODAwMDAwCis2MzAgMCAyODMzMzMzCis5ODIgMCAyODY2NjY2CisyMDg5IDAgMjkwMDAwMAorMTAyMSAwIDI5MzMzMzMKKzE1MDYgMCAyOTY2NjY2CisxNjQyIDAgMzAwMDAwMAorOTY4IDAgMzAzMzMzMworMTI2MiAwIDMwNjY2NjYKKzIyNzAgMCAzMTAwMDAwCis4NjQgMCAzMTMzMzMzCisxMjUyIDAgMzE2NjY2NgorMjAxNDUgMSAzMjAwMDAwCis1OTUgMCAzMjMzMzMzCis5MTggMCAzMjY2NjY2CisxMTY3IDAgMzMwMDAwMAorMTM0NyAwIDMzMzMzMzMKKzE1OTcgMCAzMzY2NjY2CisxNjM2IDAgMzQwMDAwMAorOTQ0IDAgMzQzMzMzMworMTI5NSAwIDM0NjY2NjYKKzEzOTcgMCAzNTAwMDAwCisxNDEzIDAgMzUzMzMzMworMTQzMiAwIDM1NjY2NjYKKzIwMTgwIDEgMzYwMDAwMAorNTI1IDAgMzYzMzMzMworMTA2OCAwIDM2NjY2NjYKKzEyMzAgMCAzNzAwMDAwCisxNDI4IDAgMzczMzMzMworOTE2IDAgMzc2NjY2NgorMTk0OCAwIDM4MDAwMDAKKzk2NiAwIDM4MzMzMzMKKzEzNDIgMCAzODY2NjY2CisxMzM4IDAgMzkwMDAwMAorMTM3OSAwIDM5MzMzMzMKKzEyOTYgMCAzOTY2NjY2CisxNzM3OCAxIDQwMDAwMDAKKzU4MyAwIDQwMzMzMzMKKzkzNiAwIDQwNjY2NjYKKzE3NDUgMCA0MTAwMDAwCis5ODcgMCA0MTMzMzMzCisxMzkzIDAgNDE2NjY2NgorMTQ5NSAwIDQyMDAwMDAKKzg2OSAwIDQyMzMzMzMKKzE5MzggMCA0MjY2NjY2Cis4MjggMCA0MzAwMDAwCisxODUxIDAgNDMzMzMzMworODM0IDAgNDM2NjY2NgorMTcyODAgMSA0NDAwMDAwCis1ODAgMCA0NDMzMzMzCis4NjkgMCA0NDY2NjY2CisxNjA1IDAgNDUwMDAwMAorODQzIDAgNDUzMzMzMworNjE0NyAxIDQ1NjY2NjYKKzIyMCAwIDQ2MDAwMDAKKzExMDYgMCA0NjMzMzMzCiszOTUgMCA0NjY2NjY2CiszMDQgMCA0NzAwMDAwCisxOTQ2IDAgNDczMzMzMworMTU0IDAgNDc2NjY2NgorNDgyIDAgNDgwMDAwMAorOTQ5IDAgNDgzMzMzMworMTA4OCAwIDQ4NjY2NjYKKzk3NCAwIDQ5MDAwMDAKKzg3NiAwIDQ5MzMzMzMKKzkxNjQgMSA0OTY2NjY2CisxMDE5IDAgNTAwMDAwMAorOTgzIDAgNTAzMzMzMworMTM3NSAwIDUwNjY2NjYKKzEwNDEgMCA1MTAwMDAwCis3ODkgMCA1MTMzMzMzCisxMDM3IDAgNTE2NjY2NgorODEyIDAgNTIwMDAwMAorNzMyIDAgNTIzMzMzMworOTcyIDAgNTI2NjY2NgorNzA4IDAgNTMwMDAwMAorNjIzIDAgNTMzMzMzMworMTA2NjcgMSA1MzY2NjY2Cis0NjMgMCA1NDAwMDAwCis5MTEgMCA1NDMzMzMzCis4NjEgMCA1NDY2NjY2Cis1MDcgMCA1NTAwMDAwCisxMDE1IDAgNTUzMzMzMworNTAxIDAgNTU2NjY2NgorOTM0IDAgNTYwMDAwMAorODEyIDAgNTYzMzMzMworODU1IDAgNTY2NjY2NgorODA0IDAgNTcwMDAwMAorNzgzIDAgNTczMzMzMworMTA2MTAgMSA1NzY2NjY2Cis5NTAgMCA1ODAwMDAwCisxMjkyIDAgNTgzMzMzMworMTAwMiAwIDU4NjY2NjYKKzcyOCAwIDU5MDAwMDAKKzk2MCAwIDU5MzMzMzMKKzEyMzAgMCA1OTY2NjY2CisxMzE1IDAgNjAwMDAwMAorMTI0OCAwIDYwMzMzMzMKKzk5NSAwIDYwNjY2NjYKKzE0MDEgMCA2MTAwMDAwCis5MDUgMCA2MTMzMzMzCis5MzI2IDEgNjE2NjY2NgorNzI2IDAgNjIwMDAwMAorNjY3IDAgNjIzMzMzMworODMzIDAgNjI2NjY2NgorMTAwNyAwIDYzMDAwMDAKKzExNzIgMCA2MzMzMzMzCisxOTEwIDAgNjM2NjY2NgorMTk1NCAwIDY0MDAwMDAKKzE0OTggMCA2NDMzMzMzCisxMTg4IDAgNjQ2NjY2NgorNzg0IDAgNjUwMDAwMAorMTAwNSAwIDY1MzMzMzMKKzEwMDMwIDEgNjU2NjY2NgorNDUyIDAgNjYwMDAwMAorNzYzIDAgNjYzMzMzMworNjM5IDAgNjY2NjY2NgorNjcxIDAgNjcwMDAwMAorODY3IDAgNjczMzMzMworOTYzIDAgNjc2NjY2NgorOTgyIDAgNjgwMDAwMAorOTk1IDAgNjgzMzMzMworOTgyIDAgNjg2NjY2NgorNzQ3IDAgNjkwMDAwMAorNTc0IDAgNjkzMzMzMworMTIzNTMgMSA2OTY2NjY2Cis0NzQgMCA3MDAwMDAwCis5NjkgMCA3MDMzMzMzCis2MzMgMCA3MDY2NjY2Cis3MjMgMCA3MTAwMDAwCisxMjIxIDAgNzEzMzMzMworNjc0IDAgNzE2NjY2NgorNzc2IDAgNzIwMDAwMAorNTcyIDAgNzIzMzMzMworOTEyIDAgNzI2NjY2NgorNTY0IDAgNzMwMDAwMAorNTk0IDAgNzMzMzMzMworMTY2NjEgMSA3MzY2NjY2Cis1MTggMCA3NDAwMDAwCis2NTYgMCA3NDMzMzMzCis2MjUgMCA3NDY2NjY2Cis1ODMgMCA3NTAwMDAwCis1ODQgMCA3NTMzMzMzCisxMDI3IDAgNzU2NjY2NgorODEyIDAgNzYwMDAwMAorNzI5IDAgNzYzMzMzMworNzY2IDAgNzY2NjY2NgorOTAxIDAgNzcwMDAwMAorOTYwIDAgNzczMzMzMworMTIzMzYgMSA3NzY2NjY2Cis5NDQgMCA3ODAwMDAwCisxMzk4IDAgNzgzMzMzMworMTYyNSAwIDc4NjY2NjYKKzIxMDMgMCA3OTAwMDAwCisxNjMwIDAgNzkzMzMzMworMTIyOCAwIDc5NjY2NjYKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5tNHYgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMubTR2Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3ZWFkMDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMubTR2CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNlZDEyYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCkBAIC0wLDAgKzEsNDk5IEBACisxOSAzMiAwCis4IDMyIDAKKzggMzIgMAorNTI5IDEgMAorMzI5IDEgMTM1MDAKKzM0OSAxIDMzNTAwCiszMzYgMSA1MzUwMAorMzgzIDEgNzM1MDAKKzM1OSAxIDkzNTAwCiszNDQgMSAxMTM1MDAKKzM0MyAxIDEzMzUwMAorMzMyIDEgMTUzNTAwCiszMjAgMSAxNzM1MDAKKzMxOSAxIDE5MzUwMAorMzIzIDEgMjEzNTAwCiszMjAgMSAyMzM1MDAKKzMyOCAxIDI1MzUwMAorMzQwIDEgMjczNTAwCiszMTggMSAyOTM1MDAKKzMxOSAxIDMxMzUwMAorMzM1IDEgMzMzNTAwCis1MTEgMSAzNTM1MDAKKzM5NSAxIDM3MzUwMAorMzI3IDEgMzkzNTAwCis0NzkgMSA0MTM1MDAKKzMzMiAxIDQzMzUwMAorMzIwIDEgNDUzNTAwCiszMjEgMSA0NzM1MDAKKzMxMCAxIDQ5MzUwMAorMzEwIDEgNTEzNTAwCiszMTAgMSA1MzM1MDAKKzMyNiAxIDU1MzUwMAorMzMwIDEgNTczNTAwCiszMTggMSA1OTM1MDAKKzMwOSAxIDYxMzUwMAorMzA0IDEgNjMzNTAwCisyOTggMSA2NTM1MDAKKzI5NCAxIDY3MzUwMAorMzAwIDEgNjkzNTAwCiszMTQgMSA3MTM1MDAKKzMwNCAxIDczMzUwMAorMzA3IDEgNzUzNTAwCiszMjEgMSA3NzM1MDAKKzMzMyAxIDc5MzUwMAorMzM1IDEgODEzNTAwCiszMDYgMSA4MzM1MDAKKzMxNSAxIDg1MzUwMAorMzIwIDEgODczNTAwCiszMTUgMSA4OTM1MDAKKzMwOCAxIDkxMzUwMAorMzIwIDEgOTMzNTAwCiszMTEgMSA5NTM1MDAKKzMxMSAxIDk3MzUwMAorMzEzIDEgOTkzNTAwCiszMTQgMSAxMDEzNTAwCiszMDggMSAxMDMzNTAwCiszMDcgMSAxMDUzNTAwCiszMTcgMSAxMDczNTAwCiszMjggMSAxMDkzNTAwCiszMTcgMSAxMTEzNTAwCiszMTIgMSAxMTMzNTAwCiszMDggMSAxMTUzNTAwCiszMTUgMSAxMTczNTAwCiszMjAgMSAxMTkzNTAwCiszMjIgMSAxMjEzNTAwCiszMjMgMSAxMjMzNTAwCiszMjIgMSAxMjUzNTAwCiszMjIgMSAxMjczNTAwCiszMDEgMSAxMjkzNTAwCiszMDMgMSAxMzEzNTAwCiszMDggMSAxMzMzNTAwCisyOTkgMSAxMzUzNTAwCisyOTcgMSAxMzczNTAwCisyOTMgMSAxMzkzNTAwCisyOTUgMSAxNDEzNTAwCisyOTcgMSAxNDMzNTAwCiszMDAgMSAxNDUzNTAwCisyOTQgMSAxNDczNTAwCisyOTkgMSAxNDkzNTAwCisyOTYgMSAxNTEzNTAwCiszMDMgMSAxNTMzNTAwCiszMTMgMSAxNTUzNTAwCiszMDYgMSAxNTczNTAwCiszMDMgMSAxNTkzNTAwCiszMTEgMSAxNjEzNTAwCiszMDcgMSAxNjMzNTAwCiszMTAgMSAxNjUzNTAwCiszMzkgMSAxNjczNTAwCiszMjUgMSAxNjkzNTAwCiszMjAgMSAxNzEzNTAwCiszMTUgMSAxNzMzNTAwCiszMTYgMSAxNzUzNTAwCiszMzggMSAxNzczNTAwCiszMjUgMSAxNzkzNTAwCiszMjUgMSAxODEzNTAwCiszMjggMSAxODMzNTAwCiszMDQgMSAxODUzNTAwCisyOTcgMSAxODczNTAwCiszMjIgMSAxODkzNTAwCiszMTEgMSAxOTEzNTAwCiszMDcgMSAxOTMzNTAwCiszMDAgMSAxOTUzNTAwCiszMDEgMSAxOTczNTAwCiszMDkgMSAxOTkzNTAwCiszMDAgMSAyMDEzNTAwCiszMDYgMSAyMDMzNTAwCiszMDUgMSAyMDUzNTAwCisyOTggMSAyMDczNTAwCisyOTEgMSAyMDkzNTAwCiszMDEgMSAyMTEzNTAwCiszMDAgMSAyMTMzNTAwCis0MzkgMSAyMTUzNTAwCisyOTIgMSAyMTczNTAwCiszMDggMSAyMTkzNTAwCiszMDUgMSAyMjEzNTAwCisyOTggMSAyMjMzNTAwCisyOTcgMSAyMjUzNTAwCisyOTMgMSAyMjczNTAwCis0MDggMSAyMjkzNTAwCisyOTggMSAyMzEzNTAwCis0NTIgMSAyMzMzNTAwCisyOTcgMSAyMzUzNTAwCiszMDMgMSAyMzczNTAwCiszMDAgMSAyMzkzNTAwCiszMTAgMSAyNDEzNTAwCisyOTkgMSAyNDMzNTAwCiszMDYgMSAyNDUzNTAwCiszMTYgMSAyNDczNTAwCiszMDggMSAyNDkzNTAwCiszMTMgMSAyNTEzNTAwCiszMDkgMSAyNTMzNTAwCiszMTAgMSAyNTUzNTAwCiszMTUgMSAyNTczNTAwCiszMDkgMSAyNTkzNTAwCiszMTcgMSAyNjEzNTAwCiszMTEgMSAyNjMzNTAwCiszMjggMSAyNjUzNTAwCiszMzMgMSAyNjczNTAwCiszMjYgMSAyNjkzNTAwCiszMjMgMSAyNzEzNTAwCiszMTYgMSAyNzMzNTAwCiszMjUgMSAyNzUzNTAwCiszMTYgMSAyNzczNTAwCiszMTkgMSAyNzkzNTAwCiszMjYgMSAyODEzNTAwCiszMjAgMSAyODMzNTAwCiszMjggMSAyODUzNTAwCiszMTIgMSAyODczNTAwCiszMTQgMSAyODkzNTAwCiszMDkgMSAyOTEzNTAwCiszMDYgMSAyOTMzNTAwCisyOTUgMSAyOTUzNTAwCiszMDQgMSAyOTczNTAwCiszMjYgMSAyOTkzNTAwCisyOTEgMSAzMDEzNTAwCisyOTkgMSAzMDMzNTAwCisyOTMgMSAzMDUzNTAwCisyODggMSAzMDczNTAwCisyOTQgMSAzMDkzNTAwCisyOTIgMSAzMTEzNTAwCisyOTIgMSAzMTMzNTAwCisyODggMSAzMTUzNTAwCiszMDggMSAzMTczNTAwCiszMDQgMSAzMTkzNTAwCisyOTIgMSAzMjEzNTAwCiszODIgMSAzMjMzNTAwCiszODEgMSAzMjUzNTAwCisyOTkgMSAzMjczNTAwCiszMTYgMSAzMjkzNTAwCiszMDggMSAzMzEzNTAwCiszMDEgMSAzMzMzNTAwCisyOTcgMSAzMzUzNTAwCisyOTkgMSAzMzczNTAwCisyOTQgMSAzMzkzNTAwCisyOTUgMSAzNDEzNTAwCiszMTcgMSAzNDMzNTAwCisyOTcgMSAzNDUzNTAwCiszMDkgMSAzNDczNTAwCiszMTMgMSAzNDkzNTAwCiszMjAgMSAzNTEzNTAwCiszMjkgMSAzNTMzNTAwCiszMzAgMSAzNTUzNTAwCiszMjQgMSAzNTczNTAwCiszMjQgMSAzNTkzNTAwCiszMDkgMSAzNjEzNTAwCiszMDQgMSAzNjMzNTAwCiszMTMgMSAzNjUzNTAwCiszMTIgMSAzNjczNTAwCisyOTkgMSAzNjkzNTAwCisyOTUgMSAzNzEzNTAwCiszMDEgMSAzNzMzNTAwCisyOTUgMSAzNzUzNTAwCisyOTcgMSAzNzczNTAwCiszMDIgMSAzNzkzNTAwCisyOTggMSAzODEzNTAwCisyOTkgMSAzODMzNTAwCisyOTYgMSAzODUzNTAwCisyOTIgMSAzODczNTAwCiszMDcgMSAzODkzNTAwCiszMDMgMSAzOTEzNTAwCiszMTMgMSAzOTMzNTAwCiszMTggMSAzOTUzNTAwCiszMTMgMSAzOTczNTAwCiszNTMgMSAzOTkzNTAwCiszNzEgMSA0MDEzNTAwCisyOTIgMSA0MDMzNTAwCiszMDAgMSA0MDUzNTAwCiszODEgMSA0MDczNTAwCisyOTQgMSA0MDkzNTAwCiszMDEgMSA0MTEzNTAwCiszMDUgMSA0MTMzNTAwCisyOTkgMSA0MTUzNTAwCiszMDUgMSA0MTczNTAwCiszMjIgMSA0MTkzNTAwCiszMTUgMSA0MjEzNTAwCiszMjYgMSA0MjMzNTAwCiszMzggMSA0MjUzNTAwCiszMjAgMSA0MjczNTAwCiszMTkgMSA0MjkzNTAwCiszMjcgMSA0MzEzNTAwCiszMzAgMSA0MzMzNTAwCiszMTAgMSA0MzUzNTAwCiszMDMgMSA0MzczNTAwCisyOTkgMSA0MzkzNTAwCisyOTMgMSA0NDEzNTAwCisyOTMgMSA0NDMzNTAwCisyOTQgMSA0NDUzNTAwCisyOTUgMSA0NDczNTAwCisyOTUgMSA0NDkzNTAwCiszMjMgMSA0NTEzNTAwCiszMDkgMSA0NTMzNTAwCiszMDkgMSA0NTUzNTAwCiszMDEgMSA0NTczNTAwCis0NzMgMSA0NTkzNTAwCisyOTEgMSA0NjEzNTAwCisyOTcgMSA0NjMzNTAwCisyOTQgMSA0NjUzNTAwCisyOTMgMSA0NjczNTAwCiszMDQgMSA0NjkzNTAwCisyOTIgMSA0NzEzNTAwCiszMDIgMSA0NzMzNTAwCisyOTYgMSA0NzUzNTAwCisyOTggMSA0NzczNTAwCiszMDEgMSA0NzkzNTAwCiszMDcgMSA0ODEzNTAwCisyODUgMSA0ODMzNTAwCisyOTQgMSA0ODUzNTAwCiszMDQgMSA0ODczNTAwCisyOTQgMSA0ODkzNTAwCisyOTUgMSA0OTEzNTAwCiszMjUgMSA0OTMzNTAwCiszMTkgMSA0OTUzNTAwCiszMjMgMSA0OTczNTAwCiszMTMgMSA0OTkzNTAwCiszMDMgMSA1MDEzNTAwCisyOTYgMSA1MDMzNTAwCisyOTUgMSA1MDUzNTAwCisyOTAgMSA1MDczNTAwCisyOTcgMSA1MDkzNTAwCisyOTYgMSA1MTEzNTAwCisyOTYgMSA1MTMzNTAwCisyOTIgMSA1MTUzNTAwCisyOTUgMSA1MTczNTAwCisyODcgMSA1MTkzNTAwCisyOTQgMSA1MjEzNTAwCisyOTAgMSA1MjMzNTAwCisyOTcgMSA1MjUzNTAwCisyOTcgMSA1MjczNTAwCisyOTcgMSA1MjkzNTAwCisyOTIgMSA1MzEzNTAwCisyOTcgMSA1MzMzNTAwCisyOTAgMSA1MzUzNTAwCisyOTMgMSA1MzczNTAwCisyOTMgMSA1MzkzNTAwCisyOTEgMSA1NDEzNTAwCisyOTIgMSA1NDMzNTAwCisyOTAgMSA1NDUzNTAwCisyOTEgMSA1NDczNTAwCisyOTYgMSA1NDkzNTAwCisyOTUgMSA1NTEzNTAwCiszMjcgMSA1NTMzNTAwCisyOTMgMSA1NTUzNTAwCisyOTEgMSA1NTczNTAwCisyOTEgMSA1NTkzNTAwCiszMTEgMSA1NjEzNTAwCisyOTEgMSA1NjMzNTAwCisyOTQgMSA1NjUzNTAwCisyOTYgMSA1NjczNTAwCisyOTUgMSA1NjkzNTAwCisyODkgMSA1NzEzNTAwCisyOTUgMSA1NzMzNTAwCisyOTUgMSA1NzUzNTAwCisyOTcgMSA1NzczNTAwCisyOTIgMSA1NzkzNTAwCisyOTcgMSA1ODEzNTAwCisyOTIgMSA1ODMzNTAwCisyOTUgMSA1ODUzNTAwCisyOTYgMSA1ODczNTAwCisyOTUgMSA1ODkzNTAwCiszMDMgMSA1OTEzNTAwCiszMDQgMSA1OTMzNTAwCiszMDEgMSA1OTUzNTAwCiszMDcgMSA1OTczNTAwCiszMDQgMSA1OTkzNTAwCiszMTAgMSA2MDEzNTAwCiszMTAgMSA2MDMzNTAwCiszMDUgMSA2MDUzNTAwCiszMDEgMSA2MDczNTAwCiszMDIgMSA2MDkzNTAwCiszMDUgMSA2MTEzNTAwCisyOTggMSA2MTMzNTAwCiszMDAgMSA2MTUzNTAwCiszMDAgMSA2MTczNTAwCisyOTIgMSA2MTkzNTAwCisyOTcgMSA2MjEzNTAwCiszMDEgMSA2MjMzNTAwCisyOTcgMSA2MjUzNTAwCisyOTcgMSA2MjczNTAwCisyOTggMSA2MjkzNTAwCisyOTcgMSA2MzEzNTAwCiszMDAgMSA2MzMzNTAwCisyOTMgMSA2MzUzNTAwCisyOTMgMSA2MzczNTAwCisyOTcgMSA2MzkzNTAwCisyOTQgMSA2NDEzNTAwCiszMDcgMSA2NDMzNTAwCiszMDIgMSA2NDUzNTAwCiszMDcgMSA2NDczNTAwCiszMjAgMSA2NDkzNTAwCiszMzAgMSA2NTEzNTAwCiszMzMgMSA2NTMzNTAwCiszMzcgMSA2NTUzNTAwCiszMzEgMSA2NTczNTAwCiszMjMgMSA2NTkzNTAwCiszMTIgMSA2NjEzNTAwCiszMjYgMSA2NjMzNTAwCiszMjggMSA2NjUzNTAwCiszMzIgMSA2NjczNTAwCiszMzMgMSA2NjkzNTAwCiszNDAgMSA2NzEzNTAwCiszMzYgMSA2NzMzNTAwCiszMjQgMSA2NzUzNTAwCiszMTIgMSA2NzczNTAwCiszMDEgMSA2NzkzNTAwCisyODkgMSA2ODEzNTAwCiszMDIgMSA2ODMzNTAwCisyOTYgMSA2ODUzNTAwCisyOTkgMSA2ODczNTAwCisyODkgMSA2ODkzNTAwCisyOTUgMSA2OTEzNTAwCisyOTkgMSA2OTMzNTAwCiszNzQgMSA2OTUzNTAwCiszOTEgMSA2OTczNTAwCiszNjUgMSA2OTkzNTAwCiszNDAgMSA3MDEzNTAwCiszMzAgMSA3MDMzNTAwCiszMzcgMSA3MDUzNTAwCiszMjggMSA3MDczNTAwCiszMjkgMSA3MDkzNTAwCiszMTkgMSA3MTEzNTAwCiszMTIgMSA3MTMzNTAwCiszMDggMSA3MTUzNTAwCiszMDQgMSA3MTczNTAwCiszMTIgMSA3MTkzNTAwCiszMTEgMSA3MjEzNTAwCiszMTYgMSA3MjMzNTAwCisyOTkgMSA3MjUzNTAwCiszMzAgMSA3MjczNTAwCiszMzAgMSA3MjkzNTAwCiszMzAgMSA3MzEzNTAwCiszNDIgMSA3MzMzNTAwCis0MzkgMSA3MzUzNTAwCiszMjIgMSA3MzczNTAwCisyOTggMSA3MzkzNTAwCisyOTMgMSA3NDEzNTAwCiszMTAgMSA3NDMzNTAwCiszMDMgMSA3NDUzNTAwCiszMTcgMSA3NDczNTAwCis0NTMgMSA3NDkzNTAwCiszNzcgMSA3NTEzNTAwCiszNzQgMSA3NTMzNTAwCisyOTIgMSA3NTUzNTAwCisyOTUgMSA3NTczNTAwCisyNzQgMSA3NTkzNTAwCisyOTIgMSA3NjEzNTAwCisyOTEgMSA3NjMzNTAwCiszNjcgMSA3NjUzNTAwCisyOTUgMSA3NjczNTAwCisyOTggMSA3NjkzNTAwCisyOTcgMSA3NzEzNTAwCiszMDEgMSA3NzMzNTAwCisyOTIgMSA3NzUzNTAwCiszNDQgMSA3NzczNTAwCisyOTYgMSA3NzkzNTAwCisyOTcgMSA3ODEzNTAwCiszMDYgMSA3ODMzNTAwCiszMDggMSA3ODUzNTAwCiszMDUgMSA3ODczNTAwCiszMTMgMSA3ODkzNTAwCiszMDYgMSA3OTEzNTAwCiszMjIgMSA3OTMzNTAwCiszMTMgMSA3OTUzNTAwCiszMDUgMSA3OTczNTAwCiszMDQgMSA3OTkzNTAwCiszMTMgMSA4MDEzNTAwCiszMjQgMSA4MDMzNTAwCiszMTIgMSA4MDUzNTAwCiszMTggMSA4MDczNTAwCiszMTEgMSA4MDkzNTAwCiszMDIgMSA4MTEzNTAwCiszMDUgMSA4MTMzNTAwCiszMTIgMSA4MTUzNTAwCiszMTMgMSA4MTczNTAwCiszMTIgMSA4MTkzNTAwCiszMzUgMSA4MjEzNTAwCiszMzMgMSA4MjMzNTAwCiszNDYgMSA4MjUzNTAwCiszMzkgMSA4MjczNTAwCiszMzcgMSA4MjkzNTAwCiszNDEgMSA4MzEzNTAwCiszMzUgMSA4MzMzNTAwCiszMjUgMSA4MzUzNTAwCiszMjQgMSA4MzczNTAwCiszMTcgMSA4MzkzNTAwCiszMTUgMSA4NDEzNTAwCiszMDMgMSA4NDMzNTAwCiszMTcgMSA4NDUzNTAwCis0NTIgMSA4NDczNTAwCiszMjQgMSA4NDkzNTAwCiszMjEgMSA4NTEzNTAwCiszMzUgMSA4NTMzNTAwCiszMjcgMSA4NTUzNTAwCiszMTUgMSA4NTczNTAwCiszMjEgMSA4NTkzNTAwCiszMTkgMSA4NjEzNTAwCiszMDggMSA4NjMzNTAwCiszMTQgMSA4NjUzNTAwCiszMjIgMSA4NjczNTAwCiszMjggMSA4NjkzNTAwCiszMjAgMSA4NzEzNTAwCiszMjQgMSA4NzMzNTAwCiszMzEgMSA4NzUzNTAwCiszMzAgMSA4NzczNTAwCiszMjggMSA4NzkzNTAwCiszMTggMSA4ODEzNTAwCiszMTQgMSA4ODMzNTAwCiszMTggMSA4ODUzNTAwCiszMTggMSA4ODczNTAwCiszMjUgMSA4ODkzNTAwCiszMzggMSA4OTEzNTAwCiszNDEgMSA4OTMzNTAwCiszMzMgMSA4OTUzNTAwCiszMzAgMSA4OTczNTAwCiszMzggMSA4OTkzNTAwCiszMzMgMSA5MDEzNTAwCiszMzAgMSA5MDMzNTAwCiszNDQgMSA5MDUzNTAwCis0NzkgMSA5MDczNTAwCis0NzMgMSA5MDkzNTAwCiszMzMgMSA5MTEzNTAwCiszMzcgMSA5MTMzNTAwCis0OTUgMSA5MTUzNTAwCiszNTMgMSA5MTczNTAwCiszNTIgMSA5MTkzNTAwCiszNDQgMSA5MjEzNTAwCiszMzYgMSA5MjMzNTAwCiszMjQgMSA5MjUzNTAwCiszMjEgMSA5MjczNTAwCiszNTAgMSA5MjkzNTAwCiszNDcgMSA5MzEzNTAwCiszNDMgMSA5MzMzNTAwCiszNDUgMSA5MzUzNTAwCiszMzcgMSA5MzczNTAwCiszMzUgMSA5MzkzNTAwCiszMzMgMSA5NDEzNTAwCiszMzYgMSA5NDMzNTAwCiszMzQgMSA5NDUzNTAwCiszMzMgMSA5NDczNTAwCiszMzEgMSA5NDkzNTAwCiszMjkgMSA5NTEzNTAwCiszMTkgMSA5NTMzNTAwCiszMjEgMSA5NTUzNTAwCiszMTYgMSA5NTczNTAwCiszMjIgMSA5NTkzNTAwCis0NDggMSA5NjEzNTAwCiszMTIgMSA5NjMzNTAwCiszMDYgMSA5NjUzNTAwCiszMDEgMSA5NjczNTAwCiszMDMgMSA5NjkzNTAwCisyOTYgMSA5NzEzNTAwCiszMDAgMSA5NzMzNTAwCisyOTUgMSA5NzUzNTAwCiszMDAgMSA5NzczNTAwCisyOTcgMSA5NzkzNTAwCiszMDAgMSA5ODEzNTAwCisyOTcgMSA5ODMzNTAwCis1MTIgMSA5ODUzNTAwCisyOTIgMSA5ODczNTAwCis0NjggMSA5ODkzNTAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoub3B1cyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5vcHVzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNmI4NzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9vcHVzX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHoub3B1cwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzE2a2h6X3MxNmxlLnJhdyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfMTZraHpfczE2bGUucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMmY0MWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzE2a2h6X3MxNmxlLnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczE2bGUucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MxNmxlLnJhdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTQ5ZWIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzFjaF84a2h6X3MxNmxlLnJhdwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUuaW5mbyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMzJsZS5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZTI0Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUuaW5mbwpAQCAtMCwwICsxLDEwIEBACisxNjM4NCAxIDAKKzE2Mzg0IDEgMTAyNDAwMAorMTYzODQgMSAyMDQ4MDAwCisxNjM4NCAxIDMwNzIwMDAKKzE2Mzg0IDEgNDA5NjAwMAorMTYzODQgMSA1MTIwMDAwCisxNjM4NCAxIDYxNDQwMDAKKzE2Mzg0IDEgNzE2ODAwMAorMTYzODQgMSA4MTkyMDAwCisxMDkyNCAxIDkyMTYwMDAKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18xY2hfOGtoel9zMzJsZS5yYXcgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUucmF3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkOTFiNDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl9yYXdfMWNoXzhraHpfczMybGUucmF3CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfcmF3XzJjaF80OGtoel9zMTZsZS5yYXcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk4YjJlYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3Jhd18yY2hfNDhraHpfczE2bGUucmF3CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YTZkMzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5pbmZvCkBAIC0wLDAgKzEsNTIwIEBACiszMCAzMiAwCis0MTQwIDMyIDAKKzMzIDMyIDAKKzUyIDEgMAorNTggMSAyNjY2Cis2MSAxIDUzMzMKKzU2IDEgODAwMAorNTkgMSAxMDY2NgorNjMgMSAxMzMzMworNjYgMSAxNjAwMAorNzEgMSAxODY2NgorNzYgMSAyMTMzMworMzc0IDEgMjQwMDAKKzM2NiAxIDM2MDAwCiszNzggMSA1NzMzMworMzkzIDEgNzg2NjYKKzM5MyAxIDEwMDAwMAorMzg2IDEgMTIxMzMzCiszNzUgMSAxNDI2NjYKKzM4OCAxIDE2NDAwMAorMzc4IDEgMTg1MzMzCiszNzkgMSAyMDY2NjYKKzM3NCAxIDIyODAwMAorMzU2IDEgMjQ5MzMzCiszNTggMSAyNzA2NjYKKzMzMiAxIDI5MjAwMAorMzM1IDEgMzEzMzMzCiszNjMgMSAzMzQ2NjYKKzM0MSAxIDM1NjAwMAorMzYwIDEgMzc3MzMzCiszNDEgMSAzOTg2NjYKKzMzNSAxIDQyMDAwMAorMzU3IDEgNDQxMzMzCiszNTUgMSA0NjI2NjYKKzM2MyAxIDQ4NDAwMAorMzgyIDEgNTA1MzMzCiszNzEgMSA1MjY2NjYKKzM1NyAxIDU0ODAwMAorMzUzIDEgNTY5MzMzCiszNTAgMSA1OTA2NjYKKzMyNyAxIDYxMjAwMAorMzE1IDEgNjMzMzMzCiszMDcgMSA2NTQ2NjYKKzMwMyAxIDY3NjAwMAorMjk1IDEgNjk3MzMzCiszMTIgMSA3MTg2NjYKKzMxNiAxIDc0MDAwMAorMzE1IDEgNzYxMzMzCiszMTggMSA3ODI2NjYKKzMzMCAxIDgwNDAwMAorMzE4IDEgODI1MzMzCiszMTUgMSA4NDY2NjYKKzMyMiAxIDg2ODAwMAorMzE1IDEgODg5MzMzCiszMTAgMSA5MTA2NjYKKzMxNSAxIDkzMjAwMAorMzE0IDEgOTUzMzMzCiszMDIgMSA5NzQ2NjYKKzMxMyAxIDk5NjAwMAorMzIyIDEgMTAxNzMzMworMzIzIDEgMTAzODY2NgorMzE5IDEgMTA2MDAwMAorMzI1IDEgMTA4MTMzMworMzI4IDEgMTEwMjY2NgorMzMwIDEgMTEyNDAwMAorMzMzIDEgMTE0NTMzMworMzMwIDEgMTE2NjY2NgorMzQ0IDEgMTE4ODAwMAorMzMxIDEgMTIwOTMzMworMzQyIDEgMTIzMDY2NgorMzM5IDEgMTI1MjAwMAorMzE0IDEgMTI3MzMzMworMjg1IDEgMTI5NDY2NgorMjk1IDEgMTMxNjAwMAorMzAyIDEgMTMzNzMzMworMzA1IDEgMTM1ODY2NgorMzA5IDEgMTM4MDAwMAorMzI3IDEgMTQwMTMzMworMzA0IDEgMTQyMjY2NgorMzM2IDEgMTQ0NDAwMAorMzUwIDEgMTQ2NTMzMworMzQ2IDEgMTQ4NjY2NgorMzUyIDEgMTUwODAwMAorMzQxIDEgMTUyOTMzMworMzQzIDEgMTU1MDY2NgorMzUxIDEgMTU3MjAwMAorMzE5IDEgMTU5MzMzMworMzI4IDEgMTYxNDY2NgorMzI4IDEgMTYzNjAwMAorMzI0IDEgMTY1NzMzMworMzM4IDEgMTY3ODY2NgorMzE3IDEgMTcwMDAwMAorMzI4IDEgMTcyMTMzMworMzM1IDEgMTc0MjY2NgorMzQxIDEgMTc2NDAwMAorMzM1IDEgMTc4NTMzMworMzQ4IDEgMTgwNjY2NgorMzYyIDEgMTgyODAwMAorMzYxIDEgMTg0OTMzMworMzQ0IDEgMTg3MDY2NgorMzQwIDEgMTg5MjAwMAorMzMzIDEgMTkxMzMzMworMzI5IDEgMTkzNDY2NgorMzI4IDEgMTk1NjAwMAorMzIzIDEgMTk3NzMzMworMzEwIDEgMTk5ODY2NgorMzE4IDEgMjAyMDAwMAorMzEyIDEgMjA0MTMzMworMjk1IDEgMjA2MjY2NgorMzI5IDEgMjA4NDAwMAorMzE4IDEgMjEwNTMzMworMzExIDEgMjEyNjY2NgorMzE3IDEgMjE0ODAwMAorNjIgMSAyMTY5MzMzCis3NSAxIDIxODEzMzMKKzczIDEgMjE4NDAwMAorMzMyIDEgMjE4NjY2NgorMzI3IDEgMjE5ODY2NgorMzMyIDEgMjIyMDAwMAorMzI1IDEgMjI0MTMzMworMzI5IDEgMjI2MjY2NgorMzMwIDEgMjI4NDAwMAorNjEgMSAyMzA1MzMzCis2MSAxIDIzMTczMzMKKzcwIDEgMjMyMDAwMAorNzAgMSAyMzIyNjY2CiszMTkgMSAyMzI1MzMzCiszMDMgMSAyMzM3MzMzCisyOTIgMSAyMzU4NjY2CiszMTMgMSAyMzgwMDAwCiszMTggMSAyNDAxMzMzCiszNDYgMSAyNDIyNjY2CiszMjggMSAyNDQ0MDAwCiszMTYgMSAyNDY1MzMzCiszNDEgMSAyNDg2NjY2CiszMjggMSAyNTA4MDAwCiszMzggMSAyNTI5MzMzCiszNDEgMSAyNTUwNjY2CiszMzcgMSAyNTcyMDAwCiszNDcgMSAyNTkzMzMzCiszODQgMSAyNjE0NjY2CiszNTggMSAyNjM2MDAwCiszNjMgMSAyNjU3MzMzCiszNjMgMSAyNjc4NjY2CiszNTggMSAyNzAwMDAwCiszMzkgMSAyNzIxMzMzCiszNjkgMSAyNzQyNjY2CiszNDMgMSAyNzY0MDAwCiszNDggMSAyNzg1MzMzCiszNjMgMSAyODA2NjY2CiszNTAgMSAyODI4MDAwCiszNTggMSAyODQ5MzMzCiszNTIgMSAyODcwNjY2CiszMzggMSAyODkyMDAwCiszMzUgMSAyOTEzMzMzCiszNDIgMSAyOTM0NjY2CiszMzggMSAyOTU2MDAwCiszNDAgMSAyOTc3MzMzCisyOTIgMSAyOTk4NjY2CisyNzkgMSAzMDIwMDAwCisyOTkgMSAzMDQxMzMzCiszMDMgMSAzMDYyNjY2CisyOTggMSAzMDg0MDAwCisyOTcgMSAzMTA1MzMzCisyODAgMSAzMTI2NjY2CisyOTcgMSAzMTQ4MDAwCisyOTAgMSAzMTY5MzMzCiszMDYgMSAzMTkwNjY2CiszMDEgMSAzMjEyMDAwCiszMDYgMSAzMjMzMzMzCisyODkgMSAzMjU0NjY2CiszMTEgMSAzMjc2MDAwCiszMTcgMSAzMjk3MzMzCiszNDQgMSAzMzE4NjY2CiszMDggMSAzMzQwMDAwCiszMDQgMSAzMzYxMzMzCiszMDQgMSAzMzgyNjY2CiszMTIgMSAzNDA0MDAwCiszMDUgMSAzNDI1MzMzCisyOTkgMSAzNDQ2NjY2CiszMDEgMSAzNDY4MDAwCiszMTggMSAzNDg5MzMzCiszMTMgMSAzNTEwNjY2CiszMzAgMSAzNTMyMDAwCiszMjUgMSAzNTUzMzMzCiszMjUgMSAzNTc0NjY2CiszMjEgMSAzNTk2MDAwCiszNDkgMSAzNjE3MzMzCisyODggMSAzNjM4NjY2CiszMDAgMSAzNjYwMDAwCiszMTIgMSAzNjgxMzMzCiszMDIgMSAzNzAyNjY2CisyNzggMSAzNzI0MDAwCisyODQgMSAzNzQ1MzMzCisyODYgMSAzNzY2NjY2CisyNzQgMSAzNzg4MDAwCisyOTUgMSAzODA5MzMzCisyODEgMSAzODMwNjY2CisyODggMSAzODUyMDAwCisyNzggMSAzODczMzMzCiszMDYgMSAzODk0NjY2Cis2MiAxIDM5MTYwMDAKKzU5IDEgMzkyODAwMAorNjEgMSAzOTMwNjY2Cis1NSAxIDM5MzMzMzMKKzcwIDEgMzkzNjAwMAorNzIgMSAzOTM4NjY2CiszMjQgMSAzOTQxMzMzCiszMDkgMSAzOTUzMzMzCiszMDEgMSAzOTc0NjY2CiszMDEgMSAzOTk2MDAwCisyOTEgMSA0MDE3MzMzCisyODkgMSA0MDM4NjY2CiszMDYgMSA0MDYwMDAwCiszMDUgMSA0MDgxMzMzCisyODYgMSA0MTAyNjY2CisyOTQgMSA0MTI0MDAwCisyOTAgMSA0MTQ1MzMzCisyOTcgMSA0MTY2NjY2CiszMDggMSA0MTg4MDAwCisyOTYgMSA0MjA5MzMzCisyOTIgMSA0MjMwNjY2CisyODcgMSA0MjUyMDAwCisyOTEgMSA0MjczMzMzCisyOTggMSA0Mjk0NjY2CisyOTUgMSA0MzE2MDAwCisyOTQgMSA0MzM3MzMzCisyOTUgMSA0MzU4NjY2CisyNzUgMSA0MzgwMDAwCisyODAgMSA0NDAxMzMzCisyODggMSA0NDIyNjY2CisyODUgMSA0NDQ0MDAwCisyNzQgMSA0NDY1MzMzCisyOTggMSA0NDg2NjY2CiszMDEgMSA0NTA4MDAwCiszMDAgMSA0NTI5MzMzCiszMDUgMSA0NTUwNjY2CisyOTcgMSA0NTcyMDAwCis1OSAxIDQ1OTMzMzMKKzU2IDEgNDYwNTMzMworNTcgMSA0NjA4MDAwCis1NSAxIDQ2MTA2NjYKKzU4IDEgNDYxMzMzMworNTcgMSA0NjE2MDAwCis1OCAxIDQ2MTg2NjYKKzY4IDEgNDYyMTMzMworNjcgMSA0NjI0MDAwCis3MSAxIDQ2MjY2NjYKKzI4OSAxIDQ2MjkzMzMKKzI4MiAxIDQ2NDEzMzMKKzI3MyAxIDQ2NjI2NjYKKzI3OSAxIDQ2ODQwMDAKKzI4NiAxIDQ3MDUzMzMKKzI4MiAxIDQ3MjY2NjYKKzI4NCAxIDQ3NDgwMDAKKzI3OCAxIDQ3NjkzMzMKKzI4MSAxIDQ3OTA2NjYKKzI4MCAxIDQ4MTIwMDAKKzI2MyAxIDQ4MzMzMzMKKzI2MCAxIDQ4NTQ2NjYKKzI3MSAxIDQ4NzYwMDAKKzI3MyAxIDQ4OTczMzMKKzI4MiAxIDQ5MTg2NjYKKzI3OSAxIDQ5NDAwMDAKKzI5NyAxIDQ5NjEzMzMKKzI5MSAxIDQ5ODI2NjYKKzMwOSAxIDUwMDQwMDAKKzI4MyAxIDUwMjUzMzMKKzI5MiAxIDUwNDY2NjYKKzMwNCAxIDUwNjgwMDAKKzI5NiAxIDUwODkzMzMKKzI5MyAxIDUxMTA2NjYKKzI4MiAxIDUxMzIwMDAKKzI3MyAxIDUxNTMzMzMKKzI4NCAxIDUxNzQ2NjYKKzI4MSAxIDUxOTYwMDAKKzI2NSAxIDUyMTczMzMKKzI3MiAxIDUyMzg2NjYKKzI3NyAxIDUyNjAwMDAKKzI4MCAxIDUyODEzMzMKKzI3NiAxIDUzMDI2NjYKKzI3MyAxIDUzMjQwMDAKKzI3OCAxIDUzNDUzMzMKKzI4MCAxIDUzNjY2NjYKKzI4MCAxIDUzODgwMDAKKzI2OCAxIDU0MDkzMzMKKzI4MiAxIDU0MzA2NjYKKzI3NyAxIDU0NTIwMDAKKzI3NCAxIDU0NzMzMzMKKzI3NSAxIDU0OTQ2NjYKKzI3MCAxIDU1MTYwMDAKKzI4MiAxIDU1MzczMzMKKzI3OSAxIDU1NTg2NjYKKzI2MCAxIDU1ODAwMDAKKzI3MiAxIDU2MDEzMzMKKzI3NSAxIDU2MjI2NjYKKzI3MyAxIDU2NDQwMDAKKzI3NiAxIDU2NjUzMzMKKzI4OCAxIDU2ODY2NjYKKzI5NCAxIDU3MDgwMDAKKzI3MSAxIDU3MjkzMzMKKzI3NyAxIDU3NTA2NjYKKzI4OCAxIDU3NzIwMDAKKzI3NiAxIDU3OTMzMzMKKzI4MiAxIDU4MTQ2NjYKKzI3NiAxIDU4MzYwMDAKKzI3NSAxIDU4NTczMzMKKzI2OCAxIDU4Nzg2NjYKKzI3MCAxIDU5MDAwMDAKKzI2NiAxIDU5MjEzMzMKKzI2OCAxIDU5NDI2NjYKKzI4MiAxIDU5NjQwMDAKKzI3OSAxIDU5ODUzMzMKKzI3OSAxIDYwMDY2NjYKKzI4NyAxIDYwMjgwMDAKKzI4NiAxIDYwNDkzMzMKKzI4MCAxIDYwNzA2NjYKKzI5MCAxIDYwOTIwMDAKKzI2NiAxIDYxMTMzMzMKKzI5MiAxIDYxMzQ2NjYKKzI2NCAxIDYxNTYwMDAKKzI3MSAxIDYxNzczMzMKKzI3NyAxIDYxOTg2NjYKKzI5MiAxIDYyMjAwMDAKKzI5OCAxIDYyNDEzMzMKKzI4NCAxIDYyNjI2NjYKKzI4NyAxIDYyODQwMDAKKzI3NSAxIDYzMDUzMzMKKzI5MSAxIDYzMjY2NjYKKzI4NyAxIDYzNDgwMDAKKzI4MyAxIDYzNjkzMzMKKzI4NCAxIDYzOTA2NjYKKzI3MSAxIDY0MTIwMDAKKzI4MiAxIDY0MzMzMzMKKzI3NyAxIDY0NTQ2NjYKKzI4MiAxIDY0NzYwMDAKKzI4NSAxIDY0OTczMzMKKzI4MCAxIDY1MTg2NjYKKzI3MSAxIDY1NDAwMDAKKzI4OSAxIDY1NjEzMzMKKzI4NyAxIDY1ODI2NjYKKzI5NCAxIDY2MDQwMDAKKzI3NyAxIDY2MjUzMzMKKzI4MSAxIDY2NDY2NjYKKzI3NCAxIDY2NjgwMDAKKzI3MSAxIDY2ODkzMzMKKzI3OSAxIDY3MTA2NjYKKzI4OCAxIDY3MzIwMDAKKzI4MCAxIDY3NTMzMzMKKzI4NCAxIDY3NzQ2NjYKKzI3OCAxIDY3OTYwMDAKKzI3NiAxIDY4MTczMzMKKzI3NSAxIDY4Mzg2NjYKKzI2MyAxIDY4NjAwMDAKKzI2NiAxIDY4ODEzMzMKKzI0NyAxIDY5MDI2NjYKKzI2OSAxIDY5MjQwMDAKKzI2MyAxIDY5NDUzMzMKKzI4MyAxIDY5NjY2NjYKKzI4MCAxIDY5ODgwMDAKKzI4MSAxIDcwMDkzMzMKKzI5OSAxIDcwMzA2NjYKKzI4NSAxIDcwNTIwMDAKKzI4OCAxIDcwNzMzMzMKKzI5OSAxIDcwOTQ2NjYKKzI4OCAxIDcxMTYwMDAKKzI3OSAxIDcxMzczMzMKKzI3NiAxIDcxNTg2NjYKKzI3NyAxIDcxODAwMDAKKzI4MiAxIDcyMDEzMzMKKzI4NSAxIDcyMjI2NjYKKzI5NSAxIDcyNDQwMDAKKzI5NCAxIDcyNjUzMzMKKzMwNCAxIDcyODY2NjYKKzI4MiAxIDczMDgwMDAKKzI5OSAxIDczMjkzMzMKKzI4MyAxIDczNTA2NjYKKzI4MiAxIDczNzIwMDAKKzI4NyAxIDczOTMzMzMKKzMwNiAxIDc0MTQ2NjYKKzMwNCAxIDc0MzYwMDAKKzI4OSAxIDc0NTczMzMKKzI5OSAxIDc0Nzg2NjYKKzI4MSAxIDc1MDAwMDAKKzI4MSAxIDc1MjEzMzMKKzY2IDEgNzU0MjY2NgorNjMgMSA3NTU0NjY2CisyODkgMSA3NTU3MzMzCisyNzAgMSA3NTY5MzMzCisyNTcgMSA3NTkwNjY2CisyNDYgMSA3NjEyMDAwCisyNjQgMSA3NjMzMzMzCisyODAgMSA3NjU0NjY2CisyNzMgMSA3Njc2MDAwCisyODUgMSA3Njk3MzMzCisyNjcgMSA3NzE4NjY2CisyNzUgMSA3NzQwMDAwCisyNzggMSA3NzYxMzMzCisyOTMgMSA3NzgyNjY2CisyODEgMSA3ODA0MDAwCisyOTcgMSA3ODI1MzMzCisyOTQgMSA3ODQ2NjY2CisyODYgMSA3ODY4MDAwCisyOTAgMSA3ODg5MzMzCisyOTAgMSA3OTEwNjY2CisyODkgMSA3OTMyMDAwCisyODYgMSA3OTUzMzMzCisyODIgMSA3OTc0NjY2CiszMDYgMSA3OTk2MDAwCisyODcgMSA4MDE3MzMzCiszMTIgMSA4MDM4NjY2CiszMTIgMSA4MDYwMDAwCiszMDcgMSA4MDgxMzMzCisyOTMgMSA4MTAyNjY2CisyODkgMSA4MTI0MDAwCisyODUgMSA4MTQ1MzMzCisyOTAgMSA4MTY2NjY2CisyODUgMSA4MTg4MDAwCiszMTEgMSA4MjA5MzMzCiszMDcgMSA4MjMwNjY2CiszMTQgMSA4MjUyMDAwCiszMTggMSA4MjczMzMzCiszMTkgMSA4Mjk0NjY2CiszMTUgMSA4MzE2MDAwCiszMDAgMSA4MzM3MzMzCisyOTUgMSA4MzU4NjY2CisyOTEgMSA4MzgwMDAwCisyODIgMSA4NDAxMzMzCisyOTUgMSA4NDIyNjY2CisyOTYgMSA4NDQ0MDAwCisyODggMSA4NDY1MzMzCiszMDQgMSA4NDg2NjY2CisyOTkgMSA4NTA4MDAwCisyOTggMSA4NTI5MzMzCiszMDUgMSA4NTUwNjY2CisyOTUgMSA4NTcyMDAwCisyOTYgMSA4NTkzMzMzCisyOTUgMSA4NjE0NjY2CisyODcgMSA4NjM2MDAwCisyOTIgMSA4NjU3MzMzCiszMDggMSA4Njc4NjY2CisyODcgMSA4NzAwMDAwCiszMDcgMSA4NzIxMzMzCisyOTUgMSA4NzQyNjY2CisyOTIgMSA4NzY0MDAwCisyOTIgMSA4Nzg1MzMzCisyNzkgMSA4ODA2NjY2CisyODkgMSA4ODI4MDAwCiszMDMgMSA4ODQ5MzMzCiszMDcgMSA4ODcwNjY2CiszMTAgMSA4ODkyMDAwCiszMDAgMSA4OTEzMzMzCisyOTkgMSA4OTM0NjY2CisyOTkgMSA4OTU2MDAwCisyODggMSA4OTc3MzMzCisyOTAgMSA4OTk4NjY2CisyOTEgMSA5MDIwMDAwCiszMDQgMSA5MDQxMzMzCisyOTkgMSA5MDYyNjY2CiszMDQgMSA5MDg0MDAwCisyOTAgMSA5MTA1MzMzCiszMDkgMSA5MTI2NjY2CiszMDEgMSA5MTQ4MDAwCisyOTYgMSA5MTY5MzMzCisyODggMSA5MTkwNjY2CiszMDUgMSA5MjEyMDAwCiszMTcgMSA5MjMzMzMzCisyOTIgMSA5MjU0NjY2CiszMDAgMSA5Mjc2MDAwCiszMDEgMSA5Mjk3MzMzCisyOTUgMSA5MzE4NjY2CisyODIgMSA5MzQwMDAwCisyOTYgMSA5MzYxMzMzCisyOTUgMSA5MzgyNjY2CisyODcgMSA5NDA0MDAwCisyOTIgMSA5NDI1MzMzCiszMDEgMSA5NDQ2NjY2CiszMTEgMSA5NDY4MDAwCiszMDEgMSA5NDg5MzMzCiszMDcgMSA5NTEwNjY2CiszMDAgMSA5NTMyMDAwCiszMDkgMSA5NTUzMzMzCisyOTggMSA5NTc0NjY2CiszMDQgMSA5NTk2MDAwCis2MCAxIDk2MTczMzMKKzU5IDEgOTYyOTMzMworNjQgMSA5NjMyMDAwCis2NCAxIDk2MzQ2NjYKKzc3IDEgOTYzNzMzMworNzIgMSA5NjQwMDAwCiszMDYgMSA5NjQyNjY2CisyOTcgMSA5NjU0NjY2CisyOTQgMSA5Njc2MDAwCisyOTUgMSA5Njk3MzMzCiszMDggMSA5NzE4NjY2CiszMDMgMSA5NzQwMDAwCiszMDggMSA5NzYxMzMzCisyODkgMSA5NzgyNjY2CiszMDAgMSA5ODA0MDAwCiszMDQgMSA5ODI1MzMzCiszMDggMSA5ODQ2NjY2Cis2NCAxIDk4NjgwMDAKKzYzIDEgOTg4MDAwMAorNjQgMSA5ODgyNjY2Cis2NCAxIDk4ODUzMzMKKzYwIDEgOTg4ODAwMAorNzQgMSA5ODkwNjY2Cis2OSAxIDk4OTMzMzMKKzY4IDEgOTg5NjAwMAorNjEgMSA5ODk4NjY2Cis3MSAxIDk5MDEzMzMKKzc2IDEgOTkwNDAwMAorNzMgMSA5OTA2NjY2Cis3MCAxIDk5MDkzMzMKKzcyIDEgOTkxMjAwMAorNjAgMSA5OTE0NjY2Cis2OSAxIDk5MTczMzMKKzgyIDEgOTkyMDAwMAorMjc4IDEgOTkyMjY2NgorMzAgMSA5OTM0NjY2CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei52b3JiaXMgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92b3JiaXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei52b3JiaXMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA0YzVmOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LnZvcmJpcwpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxZWE0NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMuaW5mbwpAQCAtMCwwICsxLDYwIEBACisxMDI3MSAxIDAKKzEwNiAwIDE3MDAwCisxMzQgMCAzMzAwMAorMTQ5IDAgNTAwMDAKKzE1MiAwIDY3MDAwCisxNTkgMCA4MzAwMAorMTE0IDAgMTAwMDAwCis3MjMgMCAxMTcwMDAKKzE3NSAwIDEzMzAwMAorMTg2IDAgMTUwMDAwCisyMDEgMCAxNjcwMDAKKzI3MCAwIDE4MzAwMAorMzgzIDAgMjAwMDAwCisyNTUgMCAyMTcwMDAKKzI4NiAwIDIzMzAwMAorMjczIDAgMjUwMDAwCisxMjI0IDAgMjY3MDAwCisyMjAgMCAyODMwMDAKKzIzMSAwIDMwMDAwMAorMTkyIDAgMzE3MDAwCisxODIgMCAzMzMwMDAKKzI4OSAwIDM1MDAwMAorMjA0IDAgMzY3MDAwCisyMzcgMCAzODMwMDAKKzE4NyAwIDQwMDAwMAorODk4IDAgNDE3MDAwCisyMzEgMCA0MzMwMDAKKzI2NiAwIDQ1MDAwMAorMjc4IDAgNDY3MDAwCisyMDUgMCA0ODMwMDAKKzI1NSAwIDUwMDAwMAorMTY5IDAgNTE3MDAwCisyMzMgMCA1MzMwMDAKKzEwMTEgMCA1NTAwMDAKKzIwMiAwIDU2NzAwMAorMjUxIDAgNTgzMDAwCisyMjMgMCA2MDAwMDAKKzI4MyAwIDYxNzAwMAorMzYyIDAgNjMzMDAwCisyMTcgMCA2NTAwMDAKKzI0NSAwIDY2NzAwMAorOTYwIDAgNjgzMDAwCisyMzMgMCA3MDAwMDAKKzI4NiAwIDcxNzAwMAorMjcyIDAgNzMzMDAwCisyNTQgMCA3NTAwMDAKKzMzMSAwIDc2NzAwMAorMjE4IDAgNzgzMDAwCisyNjEgMCA4MDAwMDAKKzk4MSAwIDgxNzAwMAorMjI2IDAgODMzMDAwCisyMjYgMCA4NTAwMDAKKzI3OSAwIDg2NzAwMAorMjI1IDAgODgzMDAwCisyOTUgMCA5MDAwMDAKKzE3NSAwIDkxNzAwMAorMjQ5IDAgOTMzMDAwCis5OTYgMCA5NTAwMDAKKzE2OSAwIDk2NzAwMAorMjI0IDAgOTgzMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLnZwOCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMudnA4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlYmE1NmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfMTc2eDE0NF8yNDBrYnBzXzYwZnBzLnZwOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzAwYzc3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA4XzY0MHgzNjBfMm1icHNfMzBmcHMuaW5mbwpAQCAtMCwwICsxLDMwMCBAQAorODY5ODAgMSAwCis2NzQxIDAgMzMwMDAKKzk0MzMgMCA2NzAwMAorOTM2MyAwIDEwMDAwMAorODY3MSAwIDEzMzAwMAorOTAwMyAwIDE2NzAwMAorNzc1MSAwIDIwMDAwMAorMTMyMDcgMCAyMzMwMDAKKzg1NDIgMCAyNjcwMDAKKzkzNDQgMCAzMDAwMDAKKzgwNjkgMCAzMzMwMDAKKzg1ODggMCAzNjcwMDAKKzEyMDg3IDAgNDAwMDAwCis3MzE1IDAgNDMzMDAwCis5NjU0IDAgNDY3MDAwCisxMzEwMCAwIDUwMDAwMAorNzgzMiAwIDUzMzAwMAorMTAwNjAgMCA1NjcwMDAKKzg1NDAgMCA2MDAwMDAKKzg2NjcgMCA2MzMwMDAKKzg1MzIgMCA2NjcwMDAKKzYwMTggMCA3MDAwMDAKKzg1MjAgMCA3MzMwMDAKKzE1MzUwIDAgNzY3MDAwCis2MTEwIDAgODAwMDAwCis3ODc2IDAgODMzMDAwCis2MTMzIDAgODY3MDAwCis5NDc2IDAgOTAwMDAwCisxMTAwMiAwIDkzMzAwMAorNzQ4NCAwIDk2NzAwMAorODc2MCAwIDEwMDAwMDAKKzE2NTE1IDAgMTAzMzAwMAorNzQ4MiAwIDEwNjcwMDAKKzY5ODMgMCAxMTAwMDAwCis3NTYxIDAgMTEzMzAwMAorODI2MyAwIDExNjcwMDAKKzEwNjgyIDAgMTIwMDAwMAorODEwOCAwIDEyMzMwMDAKKzc5MjQgMCAxMjY3MDAwCis4NjkzIDAgMTMwMDAwMAorMTQxOTAgMCAxMzMzMDAwCis3MzkzIDAgMTM2NzAwMAorNjg2NCAwIDE0MDAwMDAKKzk0MzEgMCAxNDMzMDAwCis3Njc0IDAgMTQ2NzAwMAorODQ1OCAwIDE1MDAwMDAKKzU4OTkgMCAxNTMzMDAwCis4MjU5IDAgMTU2NzAwMAorNzk2MyAwIDE2MDAwMDAKKzE0Nzc5IDAgMTYzMzAwMAorNjg3NyAwIDE2NjcwMDAKKzcyNjggMCAxNzAwMDAwCis4NTI2IDAgMTczMzAwMAorODQ2NyAwIDE3NjcwMDAKKzExMjAwIDAgMTgwMDAwMAorNzI2MSAwIDE4MzMwMDAKKzgyODAgMCAxODY3MDAwCis2NzE4IDAgMTkwMDAwMAorMTc3NDIgMCAxOTMzMDAwCis1MjA2IDAgMTk2NzAwMAorNTcwMCAwIDIwMDAwMDAKKzU4NzIgMCAyMDMzMDAwCis3OTE1IDAgMjA2NzAwMAorODQ5MyAwIDIxMDAwMDAKKzY1NDUgMCAyMTMzMDAwCis5MDcyIDAgMjE2NzAwMAorMTMyMDAgMCAyMjAwMDAwCis5NjMyIDAgMjIzMzAwMAorMTAwMTYgMCAyMjY3MDAwCis3ODI0IDAgMjMwMDAwMAorMTA2MjggMCAyMzMzMDAwCisxMDQwMSAwIDIzNjcwMDAKKzEwODkyIDAgMjQwMDAwMAorOTAyMyAwIDI0MzMwMDAKKzEwNzM0IDAgMjQ2NzAwMAorMTUwNDUgMCAyNTAwMDAwCis3OTQwIDAgMjUzMzAwMAorOTY1NyAwIDI1NjcwMDAKKzg3NDMgMCAyNjAwMDAwCis4MDc0IDAgMjYzMzAwMAorOTQ0NSAwIDI2NjcwMDAKKzY0OTQgMCAyNzAwMDAwCis4NjAxIDAgMjczMzAwMAorMTM0NzggMCAyNzY3MDAwCis2OTQyIDAgMjgwMDAwMAorODAwMiAwIDI4MzMwMDAKKzc5NDAgMCAyODY3MDAwCis4MzIwIDAgMjkwMDAwMAorMTIyMTUgMCAyOTMzMDAwCis2NjY4IDAgMjk2NzAwMAorMTEzODQgMCAzMDAwMDAwCis4Mzc4IDAgMzAzMzAwMAorMTI5MDggMCAzMDY3MDAwCis4NDIwIDAgMzEwMDAwMAorNzUwMiAwIDMxMzMwMDAKKzg0ODIgMCAzMTY3MDAwCisxMDk2OCAwIDMyMDAwMDAKKzEyMzM4IDAgMzIzMzAwMAorODY1NyAwIDMyNjcwMDAKKzEwNDY4IDAgMzMwMDAwMAorMTM4NzggMCAzMzMzMDAwCis5Mzc0IDAgMzM2NzAwMAorOTg1NyAwIDM0MDAwMDAKKzEwMzgxIDAgMzQzMzAwMAorOTk4NCAwIDM0NjcwMDAKKzk5NTYgMCAzNTAwMDAwCis4OTA1IDAgMzUzMzAwMAorODY3MiAwIDM1NjcwMDAKKzgxMjIgMCAzNjAwMDAwCis5Njc3IDAgMzYzMzAwMAorOTgxMiAwIDM2NjcwMDAKKzk2MjIgMCAzNzAwMDAwCis5MDIzIDAgMzczMzAwMAorNzE0NyAwIDM3NjcwMDAKKzkxNDYgMCAzODAwMDAwCis3NDg4IDAgMzgzMzAwMAorMTA4MTIgMCAzODY3MDAwCis4MzQwIDAgMzkwMDAwMAorMTMyODAgMCAzOTMzMDAwCis1MTY3IDAgMzk2NzAwMAorNjk5MSAwIDQwMDAwMDAKKzY1NDMgMCA0MDMzMDAwCis1OTUyIDAgNDA2NzAwMAorNTE2NCAwIDQxMDAwMDAKKzQwMTEgMCA0MTMzMDAwCiszNzk0IDAgNDE2NzAwMAorMTI5NTkgMCA0MjAwMDAwCis3MTAyMCAxIDQyMzMwMDAKKzUzNTEgMCA0MjY3MDAwCis2MjgzIDAgNDMwMDAwMAorNTA4MCAwIDQzMzMwMDAKKzY3MDcgMCA0MzY3MDAwCis1ODU3IDAgNDQwMDAwMAorNTIyMSAwIDQ0MzMwMDAKKzEwOTcyIDAgNDQ2NzAwMAorNzAyMyAwIDQ1MDAwMDAKKzY5MDcgMCA0NTMzMDAwCis3ODUxIDAgNDU2NzAwMAorNDg0MyAwIDQ2MDAwMDAKKzYwODUgMCA0NjMzMDAwCis0ODY4IDAgNDY2NzAwMAorNTA5MyAwIDQ3MDAwMDAKKzEyODA3IDAgNDczMzAwMAorNjMzMCAwIDQ3NjcwMDAKKzQyMDkgMCA0ODAwMDAwCis0NTk2IDAgNDgzMzAwMAorNjMxNiAwIDQ4NjcwMDAKKzQ5NTQgMCA0OTAwMDAwCis1NTMzIDAgNDkzMzAwMAorNzc0OSAwIDQ5NjcwMDAKKzEyNDg2IDAgNTAwMDAwMAorNTQ2OCAwIDUwMzMwMDAKKzQzNTMgMCA1MDY3MDAwCis1Nzg2IDAgNTEwMDAwMAorNTU1MSAwIDUxMzMwMDAKKzY3MTEgMCA1MTY3MDAwCis1Njg4IDAgNTIwMDAwMAorNjI1OCAwIDUyMzMwMDAKKzEyOTc1IDAgNTI2NzAwMAorNDg3MyAwIDUzMDAwMDAKKzQ1NTIgMCA1MzMzMDAwCis0ODQ0IDAgNTM2NzAwMAorNDc3NCAwIDU0MDAwMDAKKzUwMjUgMCA1NDMzMDAwCis1MjA0IDAgNTQ2NzAwMAorNDgxNCAwIDU1MDAwMDAKKzE0ODM1IDAgNTUzMzAwMAorNTM0MyAwIDU1NjcwMDAKKzQ4MDggMCA1NjAwMDAwCis1MDcxIDAgNTYzMzAwMAorNjMyNCAwIDU2NjcwMDAKKzUyNDMgMCA1NzAwMDAwCis0OTk1IDAgNTczMzAwMAorNTEzNCAwIDU3NjcwMDAKKzExMDU0IDAgNTgwMDAwMAorNDgwNyAwIDU4MzMwMDAKKzUxMTggMCA1ODY3MDAwCis2NDI0IDAgNTkwMDAwMAorNDk4NCAwIDU5MzMwMDAKKzcxODcgMCA1OTY3MDAwCis1NTA1IDAgNjAwMDAwMAorNjk0MSAwIDYwMzMwMDAKKzExNTE3IDAgNjA2NzAwMAorNTY0NiAwIDYxMDAwMDAKKzY4MzIgMCA2MTMzMDAwCis1Mjk0IDAgNjE2NzAwMAorNjIwMCAwIDYyMDAwMDAKKzYzMjggMCA2MjMzMDAwCis0MzQ4IDAgNjI2NzAwMAorNDYwNyAwIDYzMDAwMDAKKzEyOTU4IDAgNjMzMzAwMAorNDMwOCAwIDYzNjcwMDAKKzYwODQgMCA2NDAwMDAwCis0NDk0IDAgNjQzMzAwMAorNTMzOCAwIDY0NjcwMDAKKzU3NDIgMCA2NTAwMDAwCis1NDcyIDAgNjUzMzAwMAorODQ1OSAwIDY1NjcwMDAKKzEzMDc1IDAgNjYwMDAwMAorODk4NiAwIDY2MzMwMDAKKzk1ODMgMCA2NjY3MDAwCis4NzkyIDAgNjcwMDAwMAorOTAwNCAwIDY3MzMwMDAKKzk2MzIgMCA2NzY3MDAwCis5MzkzIDAgNjgwMDAwMAorOTI1OSAwIDY4MzMwMDAKKzExOTI3IDAgNjg2NzAwMAorMTAzMjMgMCA2OTAwMDAwCisxNTI0OCAwIDY5MzMwMDAKKzExMjQ0IDAgNjk2NzAwMAorMTU1NTggMCA3MDAwMDAwCis2MTk3IDAgNzAzMzAwMAorODA0NCAwIDcwNjcwMDAKKzExNDMyIDAgNzEwMDAwMAorODczNyAwIDcxMzMwMDAKKzEzODg1IDAgNzE2NzAwMAorMTExNTggMCA3MjAwMDAwCisxNTE1MiAwIDcyMzMwMDAKKzcwMjUgMCA3MjY3MDAwCis4MDI1IDAgNzMwMDAwMAorMTMzNjIgMCA3MzMzMDAwCis4MDkwIDAgNzM2NzAwMAorMTM2MzcgMCA3NDAwMDAwCis2MTQ4IDAgNzQzMzAwMAorOTI3MCAwIDc0NjcwMDAKKzg2MzMgMCA3NTAwMDAwCisxMDY3MyAwIDc1MzMwMDAKKzE0MjA4IDAgNzU2NzAwMAorODA4NCAwIDc2MDAwMDAKKzEzNzgzIDAgNzYzMzAwMAorMTA2NjAgMCA3NjY3MDAwCis3NDY2IDAgNzcwMDAwMAorMTQ0MzMgMCA3NzMzMDAwCisxMDkzNCAwIDc3NjcwMDAKKzcyMzkgMCA3ODAwMDAwCisxMjU0OCAwIDc4MzMwMDAKKzY1NjQgMCA3ODY3MDAwCisxMDc2MSAwIDc5MDAwMDAKKzEwOTkyIDAgNzkzMzAwMAorMTI5MjQgMCA3OTY3MDAwCisxMjM0OCAwIDgwMDAwMDAKKzY3NzAgMCA4MDMzMDAwCisxNDI4OCAwIDgwNjcwMDAKKzI5MzQ1IDEgODEwMDAwMAorMTgyMiAwIDgxMzMwMDAKKzEwODcgMCA4MTY3MDAwCisxMTA5IDAgODIwMDAwMAorMjAwNyAwIDgyMzMwMDAKKzE3OTggMCA4MjY3MDAwCisxNjM1IDAgODMwMDAwMAorMTk2MDcgMCA4MzMzMDAwCis5MTkgMCA4MzY3MDAwCisyMzU3IDAgODQwMDAwMAorMzU3OCAwIDg0MzMwMDAKKzQ0OTcgMCA4NDY3MDAwCis0MzE0IDAgODUwMDAwMAorMzg1MSAwIDg1MzMwMDAKKzM4MjIgMCA4NTY3MDAwCis0MjUyIDAgODYwMDAwMAorNDc3NSAwIDg2MzMwMDAKKzEyMjAzIDAgODY2NzAwMAorNTA3OCAwIDg3MDAwMDAKKzU4NzYgMCA4NzMzMDAwCis2MTI0IDAgODc2NzAwMAorNDQ5MCAwIDg4MDAwMDAKKzM1MzggMCA4ODMzMDAwCiszNDUwIDAgODg2NzAwMAorMzYxMSAwIDg5MDAwMDAKKzI4NDcgMCA4OTMzMDAwCisyNjA1IDAgODk2NzAwMAorMTIyNDMgMCA5MDAwMDAwCisxOTQ2IDAgOTAzMzAwMAorMTg0NyAwIDkwNjcwMDAKKzIwMzUgMCA5MTAwMDAwCisyNTcyIDAgOTEzMzAwMAorMjMyNiAwIDkxNjcwMDAKKzI2NDUgMCA5MjAwMDAwCisyOTM4IDAgOTIzMzAwMAorMjQ5NSAwIDkyNjcwMDAKKzI2MDkgMCA5MzAwMDAwCis5NzQ0IDAgOTMzMzAwMAorMTc5NiAwIDkzNjcwMDAKKzE5ODUgMCA5NDAwMDAwCisxNzU5IDAgOTQzMzAwMAorMjI1OSAwIDk0NjcwMDAKKzIyMzMgMCA5NTAwMDAwCisyMDQ0IDAgOTUzMzAwMAorMjUwMiAwIDk1NjcwMDAKKzIzMDcgMCA5NjAwMDAwCisyNzM5IDAgOTYzMzAwMAorMTE3MDcgMCA5NjY3MDAwCis1MTY4IDAgOTcwMDAwMAorNDQ4MyAwIDk3MzMwMDAKKzMwNDQgMCA5NzY3MDAwCis0MjQxIDAgOTgwMDAwMAorNDM5MiAwIDk4MzMwMDAKKzQ5MzQgMCA5ODY3MDAwCis1OTM0IDAgOTkwMDAwMAorNTY0NyAwIDk5MzMwMDAKKzUzMjYgMCA5OTY3MDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy52cDggYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDhfNjQweDM2MF8ybWJwc18zMGZwcy52cDgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVjNDYwYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLnZwOApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ExYTAzYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMuaW5mbwpAQCAtMCwwICsxLDYwIEBACis2OTM5IDEgMAorNjgxOCAwIDE3MDAwCiszMTAgMCAzMzAwMAorMjczIDAgNTAwMDAKKzI2NyAwIDY3MDAwCisyMzkgMCA4MzAwMAorMjMyIDAgMTAwMDAwCisyMjIgMCAxMTcwMDAKKzE4NiAwIDEzMzAwMAorMTk0IDAgMTUwMDAwCisxODkgMCAxNjcwMDAKKzE4IDAgMTgzMDAwCisyMDE0IDAgMjAwMDAwCisyOTcgMCAyMTcwMDAKKzI4NyAwIDIzMzAwMAorMjM3IDAgMjUwMDAwCisyNjMgMCAyNjcwMDAKKzIzOCAwIDI4MzAwMAorMjU3IDAgMzAwMDAwCisyMjkgMCAzMTcwMDAKKzE4NyAwIDMzMzAwMAorMTkxIDAgMzUwMDAwCisxOCAwIDM2NzAwMAorMjIwMyAwIDM4MzAwMAorMjY1IDAgNDAwMDAwCisyMjQgMCA0MTcwMDAKKzI1NCAwIDQzMzAwMAorMjUyIDAgNDUwMDAwCisyNzMgMCA0NjcwMDAKKzIwOCAwIDQ4MzAwMAorMTU0IDAgNTAwMDAwCisxODIgMCA1MTcwMDAKKzEzOCAwIDUzMzAwMAorMTggMCA1NTAwMDAKKzI1MDIgMCA1NjcwMDAKKzI4NiAwIDU4MzAwMAorMzA0IDAgNjAwMDAwCiszNDEgMCA2MTcwMDAKKzI1OSAwIDYzMzAwMAorMjc1IDAgNjUwMDAwCisyMjIgMCA2NjcwMDAKKzI1NCAwIDY4MzAwMAorMjUzIDAgNzAwMDAwCisyMjUgMCA3MTcwMDAKKzE4IDAgNzMzMDAwCisyNTAxIDAgNzUwMDAwCisyODIgMCA3NjcwMDAKKzI5OCAwIDc4MzAwMAorMjUyIDAgODAwMDAwCisyNDIgMCA4MTcwMDAKKzI1MCAwIDgzMzAwMAorMjYwIDAgODUwMDAwCisyMTggMCA4NjcwMDAKKzIxMyAwIDg4MzAwMAorMTQ0IDAgOTAwMDAwCisxOCAwIDkxNzAwMAorMjMzIDAgOTMzMDAwCisyNTQgMCA5NTAwMDAKKzIyOSAwIDk2NzAwMAorMjM5IDAgOTgzMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLnZwOSBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMudnA5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MzNjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLnZwOQpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy5pbmZvIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmU5Njc5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMuaW5mbwpAQCAtMCwwICsxLDMwMCBAQAorNTQ5MTggMSAwCis0NjI4MCAwIDMzMDAwCisyMDA2IDAgNjcwMDAKKzI4NDEgMCAxMDAwMDAKKzMwNDQgMCAxMzMwMDAKKzM0MjkgMCAxNjcwMDAKKzMxOTYgMCAyMDAwMDAKKzI5MjYgMCAyMzMwMDAKKzI4MjEgMCAyNjcwMDAKKzExNTAgMCAzMDAwMDAKKzM2IDAgMzMzMDAwCiszODA4NCAwIDM2NzAwMAorMzY4OSAwIDQwMDAwMAorMzQ3MyAwIDQzMzAwMAorMzAxMSAwIDQ2NzAwMAorMzA5MCAwIDUwMDAwMAorMjUxNiAwIDUzMzAwMAorMjc3MSAwIDU2NzAwMAorMzI1MCAwIDYwMDAwMAorMTE1OSAwIDYzMzAwMAorMzQgMCA2NjcwMDAKKzM5NjkwIDAgNzAwMDAwCiszNjE1IDAgNzMzMDAwCisyNDk0IDAgNzY3MDAwCisyODkzIDAgODAwMDAwCiszMzI5IDAgODMzMDAwCisyOTM5IDAgODY3MDAwCisyMzUyIDAgOTAwMDAwCisyNzMyIDAgOTMzMDAwCisxNzQ2IDAgOTY3MDAwCiszMyAwIDEwMDAwMDAKKzQxNTAxIDAgMTAzMzAwMAorMjk5NyAwIDEwNjcwMDAKKzI2NjYgMCAxMTAwMDAwCiszNTgyIDAgMTEzMzAwMAorMjYxNiAwIDExNjcwMDAKKzI5MjMgMCAxMjAwMDAwCisyNjk2IDAgMTIzMzAwMAorMTYyOCAwIDEyNjcwMDAKKzE4ODcgMCAxMzAwMDAwCiszMyAwIDEzMzMwMDAKKzQyODc2IDAgMTM2NzAwMAorMjU4OCAwIDE0MDAwMDAKKzMzMTYgMCAxNDMzMDAwCisyMjg3IDAgMTQ2NzAwMAorMzM3NSAwIDE1MDAwMDAKKzIxMDggMCAxNTMzMDAwCisyOTYxIDAgMTU2NzAwMAorMTczMCAwIDE2MDAwMDAKKzE4MDAgMCAxNjMzMDAwCiszNCAwIDE2NjcwMDAKKzQzNzk3IDAgMTcwMDAwMAorMjQ4NCAwIDE3MzMwMDAKKzI1NTYgMCAxNzY3MDAwCisyNjcxIDAgMTgwMDAwMAorMjMzOCAwIDE4MzMwMDAKKzMxMzMgMCAxODY3MDAwCisyMDAyIDAgMTkwMDAwMAorMTc5NCAwIDE5MzMwMDAKKzEyNzkgMCAxOTY3MDAwCiszMiAwIDIwMDAwMDAKKzQyNjQyIDAgMjAzMzAwMAorMjY4NiAwIDIwNjcwMDAKKzIyMDIgMCAyMTAwMDAwCisyMTQ1IDAgMjEzMzAwMAorMjU2NiAwIDIxNjcwMDAKKzIxOTAgMCAyMjAwMDAwCisxNTgwIDAgMjIzMzAwMAorMTcxMSAwIDIyNjcwMDAKKzY0OCAwIDIzMDAwMDAKKzMyIDAgMjMzMzAwMAorNDA0MDkgMCAyMzY3MDAwCisyNjI4IDAgMjQwMDAwMAorMTk3MyAwIDI0MzMwMDAKKzIzNjAgMCAyNDY3MDAwCiszMDQzIDAgMjUwMDAwMAorMTczMCAwIDI1MzMwMDAKKzE0NTYgMCAyNTY3MDAwCisyMzEyIDAgMjYwMDAwMAorMzY5IDAgMjYzMzAwMAorMzIgMCAyNjY3MDAwCis0MTM5MSAwIDI3MDAwMDAKKzI5NjcgMCAyNzMzMDAwCisyNDU0IDAgMjc2NzAwMAorMTgyNSAwIDI4MDAwMDAKKzE4NTMgMCAyODMzMDAwCisxNzQ2IDAgMjg2NzAwMAorMjM0NyAwIDI5MDAwMDAKKzEzNjIgMCAyOTMzMDAwCis0NDEgMCAyOTY3MDAwCiszNCAwIDMwMDAwMDAKKzQyNTAzIDAgMzAzMzAwMAorMTg3NyAwIDMwNjcwMDAKKzE2OTAgMCAzMTAwMDAwCisxMzY3IDAgMzEzMzAwMAorMTUyMCAwIDMxNjcwMDAKKzEyNDAgMCAzMjAwMDAwCisxMDk0IDAgMzIzMzAwMAorNzM5IDAgMzI2NzAwMAorMzkyIDAgMzMwMDAwMAorMzMgMCAzMzMzMDAwCiszNTEwNCAwIDMzNjcwMDAKKzE0NjMgMCAzNDAwMDAwCisyMDI5IDAgMzQzMzAwMAorMTYyNiAwIDM0NjcwMDAKKzE5NTYgMCAzNTAwMDAwCis3OTkgMCAzNTMzMDAwCis1NTYgMCAzNTY3MDAwCis1ODQgMCAzNjAwMDAwCisxOTEgMCAzNjMzMDAwCiszNiAwIDM2NjcwMDAKKzM3NjUyIDAgMzcwMDAwMAorODYyIDAgMzczMzAwMAorNTI0IDAgMzc2NzAwMAorNjQxIDAgMzgwMDAwMAorNTg0IDAgMzgzMzAwMAorMzYwIDAgMzg2NzAwMAorMzY1IDAgMzkwMDAwMAorMzYxIDAgMzkzMzAwMAorMTU0IDAgMzk2NzAwMAorMzYgMCA0MDAwMDAwCisxMjU3NDAgMCA0MDMzMDAwCiszMzIgMCA0MDY3MDAwCiszODEgMCA0MTAwMDAwCis0MjAgMCA0MTMzMDAwCis0NjQgMCA0MTY3MDAwCisyODggMCA0MjAwMDAwCisyNjYwIDAgNDIzMzAwMAorMTI3NTY0IDEgNDI2NzAwMAorMzA2OTYgMCA0MzAwMDAwCiszNDIzIDAgNDMzMzAwMAorMzMxMCAwIDQzNjcwMDAKKzM1MTMgMCA0NDAwMDAwCiszNzM1IDAgNDQzMzAwMAorMzM1OCAwIDQ0NjcwMDAKKzMxMDggMCA0NTAwMDAwCisyODAwIDAgNDUzMzAwMAorMTc1MSAwIDQ1NjcwMDAKKzQxIDAgNDYwMDAwMAorMzk4NjIgMCA0NjMzMDAwCiszNzM5IDAgNDY2NzAwMAorMzc1NSAwIDQ3MDAwMDAKKzM0MDggMCA0NzMzMDAwCiszNzgzIDAgNDc2NzAwMAorMzQyMyAwIDQ4MDAwMDAKKzI4MDEgMCA0ODMzMDAwCisyNTQ5IDAgNDg2NzAwMAorMTQ2MSAwIDQ5MDAwMDAKKzQwIDAgNDkzMzAwMAorNDE2NjcgMCA0OTY3MDAwCiszNjIzIDAgNTAwMDAwMAorMzM1NiAwIDUwMzMwMDAKKzM0MjQgMCA1MDY3MDAwCiszNTQ4IDAgNTEwMDAwMAorMzExOSAwIDUxMzMwMDAKKzI5MDUgMCA1MTY3MDAwCisyNzcyIDAgNTIwMDAwMAorMTYyMyAwIDUyMzMwMDAKKzQzIDAgNTI2NzAwMAorNDY3ODMgMCA1MzAwMDAwCiszNDYyIDAgNTMzMzAwMAorMzQ3MCAwIDUzNjcwMDAKKzM2NzcgMCA1NDAwMDAwCiszNjg0IDAgNTQzMzAwMAorMzI2NiAwIDU0NjcwMDAKKzMxMjcgMCA1NTAwMDAwCisyODA5IDAgNTUzMzAwMAorMTc1MCAwIDU1NjcwMDAKKzQwIDAgNTYwMDAwMAorNDYyMTUgMCA1NjMzMDAwCiszNTk5IDAgNTY2NzAwMAorMzU1OCAwIDU3MDAwMDAKKzM1NDQgMCA1NzMzMDAwCiszNjMyIDAgNTc2NzAwMAorMzU0OCAwIDU4MDAwMDAKKzI5NjggMCA1ODMzMDAwCisyNzE1IDAgNTg2NzAwMAorMTcyOSAwIDU5MDAwMDAKKzQxIDAgNTkzMzAwMAorNDU5NTggMCA1OTY3MDAwCiszNzc2IDAgNjAwMDAwMAorMzUyNSAwIDYwMzMwMDAKKzM2NDQgMCA2MDY3MDAwCiszNzg2IDAgNjEwMDAwMAorMzIyMiAwIDYxMzMwMDAKKzI5MjMgMCA2MTY3MDAwCisyNzUyIDAgNjIwMDAwMAorMTU5MiAwIDYyMzMwMDAKKzQxIDAgNjI2NzAwMAorNDYwMzEgMCA2MzAwMDAwCiszNTIwIDAgNjMzMzAwMAorMzM4MCAwIDYzNjcwMDAKKzMzNzEgMCA2NDAwMDAwCiszNDI3IDAgNjQzMzAwMAorMzEzNSAwIDY0NjcwMDAKKzI5ODggMCA2NTAwMDAwCisyNzMwIDAgNjUzMzAwMAorMTY3MSAwIDY1NjcwMDAKKzQxIDAgNjYwMDAwMAorNDU4NDYgMCA2NjMzMDAwCiszNTM1IDAgNjY2NzAwMAorMzUwNyAwIDY3MDAwMDAKKzM0MjkgMCA2NzMzMDAwCiszNDkxIDAgNjc2NzAwMAorMzMyNSAwIDY4MDAwMDAKKzI5NzkgMCA2ODMzMDAwCisyODAwIDAgNjg2NzAwMAorMTYxMCAwIDY5MDAwMDAKKzQwIDAgNjkzMzAwMAorNDU5NTggMCA2OTY3MDAwCiszNzYyIDAgNzAwMDAwMAorMzI1NCAwIDcwMzMwMDAKKzM0MDggMCA3MDY3MDAwCiszODYwIDAgNzEwMDAwMAorMzE5OCAwIDcxMzMwMDAKKzI5NjYgMCA3MTY3MDAwCisyODgyIDAgNzIwMDAwMAorMTc2MyAwIDcyMzMwMDAKKzQyIDAgNzI2NzAwMAorNDYxMzAgMCA3MzAwMDAwCiszNTkzIDAgNzMzMzAwMAorMzUyMyAwIDczNjcwMDAKKzM5MzkgMCA3NDAwMDAwCiszOTgwIDAgNzQzMzAwMAorMzQ3MCAwIDc0NjcwMDAKKzMxOTEgMCA3NTAwMDAwCisyOTY5IDAgNzUzMzAwMAorMTc0MCAwIDc1NjcwMDAKKzQxIDAgNzYwMDAwMAorNDYzMDAgMCA3NjMzMDAwCiszNzM5IDAgNzY2NzAwMAorMzc4MSAwIDc3MDAwMDAKKzM5NjQgMCA3NzMzMDAwCis0MDIzIDAgNzc2NzAwMAorMzQ4MCAwIDc4MDAwMDAKKzMwNjUgMCA3ODMzMDAwCisyOTM0IDAgNzg2NzAwMAorMTgwNSAwIDc5MDAwMDAKKzQyIDAgNzkzMzAwMAorMzgxNjYgMCA3OTY3MDAwCis0MDYyIDAgODAwMDAwMAorMzg0NCAwIDgwMzMwMDAKKzQ1NDcgMCA4MDY3MDAwCis5MzQgMCA4MTAwMDAwCiszNjUgMCA4MTMzMDAwCisxODEgMCA4MTY3MDAwCis0NjMgMCA4MjAwMDAwCis0MTkgMCA4MjMzMDAwCiszOCAwIDgyNjcwMDAKKzk3MDIgMCA4MzAwMDAwCiszNDQgMCA4MzMzMDAwCisyNzYgMCA4MzY3MDAwCisxMzUwIDAgODQwMDAwMAorMTcwMyAwIDg0MzMwMDAKKzE4NDMgMCA4NDY3MDAwCisxMjI4IDAgODUwMDAwMAorMzU1ODAgMSA4NTMzMDAwCisyNzQ1OCAwIDg1NjcwMDAKKzIxNDQgMCA4NjAwMDAwCisyNDgyIDAgODYzMzAwMAorMjAwNCAwIDg2NjcwMDAKKzI4MjIgMCA4NzAwMDAwCisyNTcwIDAgODczMzAwMAorMTcyNiAwIDg3NjcwMDAKKzEyNDggMCA4ODAwMDAwCis4NDQgMCA4ODMzMDAwCiszNSAwIDg4NjcwMDAKKzE0MjA3IDAgODkwMDAwMAorMTAzNyAwIDg5MzMwMDAKKzc0OSAwIDg5NjcwMDAKKzgyOSAwIDkwMDAwMDAKKzkxNSAwIDkwMzMwMDAKKzY4NSAwIDkwNjcwMDAKKzc2NyAwIDkxMDAwMDAKKzc5OCAwIDkxMzMwMDAKKzM0MiAwIDkxNjcwMDAKKzMxIDAgOTIwMDAwMAorMTI1OTAgMCA5MjMzMDAwCis5MjMgMCA5MjY3MDAwCis4MTkgMCA5MzAwMDAwCis3NzYgMCA5MzMzMDAwCis4NjMgMCA5MzY3MDAwCis3MjkgMCA5NDAwMDAwCis0NzEgMCA5NDMzMDAwCis2MzggMCA5NDY3MDAwCisyNzYgMCA5NTAwMDAwCiszOCAwIDk1MzMwMDAKKzE3MjcyIDAgOTU2NzAwMAorODU2IDAgOTYwMDAwMAorMTE1OCAwIDk2MzMwMDAKKzIxNzIgMCA5NjY3MDAwCisyNzUxIDAgOTcwMDAwMAorMjE0MiAwIDk3MzMwMDAKKzEyNjcgMCA5NzY3MDAwCisxOTY1IDAgOTgwMDAwMAorMTUxMCAwIDk4MzMwMDAKKzM0IDAgOTg2NzAwMAorMjY5MiAwIDk5MDAwMDAKKzI3NzggMCA5OTMzMDAwCisyNTg1IDAgOTk2NzAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMudnA5IGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9iYmJfdnA5XzY0MHgzNjBfMTYwMGticHNfMzBmcHMudnA5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxZTIwMDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL2JiYl92cDlfNjQweDM2MF8xNjAwa2Jwc18zMGZwcy52cDkKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYWYyZTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouYW1ybmIKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzZlODEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmluZm8KQEAgLTAsMCArMSw4MzMgQEAKKzMyIDEgMAorMzIgMSAyMDAwMAorMzIgMSA0MDAwMAorMzIgMSA2MDAwMAorMzIgMSA4MDAwMAorMzIgMSAxMDAwMDAKKzMyIDEgMTIwMDAwCiszMiAxIDE0MDAwMAorMzIgMSAxNjAwMDAKKzMyIDEgMTgwMDAwCiszMiAxIDIwMDAwMAorMzIgMSAyMjAwMDAKKzMyIDEgMjQwMDAwCiszMiAxIDI2MDAwMAorMzIgMSAyODAwMDAKKzMyIDEgMzAwMDAwCiszMiAxIDMyMDAwMAorMzIgMSAzNDAwMDAKKzMyIDEgMzYwMDAwCiszMiAxIDM4MDAwMAorMzIgMSA0MDAwMDAKKzMyIDEgNDIwMDAwCiszMiAxIDQ0MDAwMAorMzIgMSA0NjAwMDAKKzMyIDEgNDgwMDAwCiszMiAxIDUwMDAwMAorMzIgMSA1MjAwMDAKKzMyIDEgNTQwMDAwCiszMiAxIDU2MDAwMAorMzIgMSA1ODAwMDAKKzMyIDEgNjAwMDAwCiszMiAxIDYyMDAwMAorMzIgMSA2NDAwMDAKKzMyIDEgNjYwMDAwCiszMiAxIDY4MDAwMAorMzIgMSA3MDAwMDAKKzMyIDEgNzIwMDAwCiszMiAxIDc0MDAwMAorMzIgMSA3NjAwMDAKKzMyIDEgNzgwMDAwCiszMiAxIDgwMDAwMAorMzIgMSA4MjAwMDAKKzMyIDEgODQwMDAwCiszMiAxIDg2MDAwMAorMzIgMSA4ODAwMDAKKzMyIDEgOTAwMDAwCiszMiAxIDkyMDAwMAorMzIgMSA5NDAwMDAKKzMyIDEgOTYwMDAwCiszMiAxIDk4MDAwMAorMzIgMSAxMDAwMDAwCiszMiAxIDEwMjAwMDAKKzMyIDEgMTA0MDAwMAorMzIgMSAxMDYwMDAwCiszMiAxIDEwODAwMDAKKzMyIDEgMTEwMDAwMAorMzIgMSAxMTIwMDAwCiszMiAxIDExNDAwMDAKKzMyIDEgMTE2MDAwMAorMzIgMSAxMTgwMDAwCiszMiAxIDEyMDAwMDAKKzMyIDEgMTIyMDAwMAorMzIgMSAxMjQwMDAwCiszMiAxIDEyNjAwMDAKKzMyIDEgMTI4MDAwMAorMzIgMSAxMzAwMDAwCiszMiAxIDEzMjAwMDAKKzMyIDEgMTM0MDAwMAorMzIgMSAxMzYwMDAwCiszMiAxIDEzODAwMDAKKzMyIDEgMTQwMDAwMAorMzIgMSAxNDIwMDAwCiszMiAxIDE0NDAwMDAKKzMyIDEgMTQ2MDAwMAorMzIgMSAxNDgwMDAwCiszMiAxIDE1MDAwMDAKKzMyIDEgMTUyMDAwMAorMzIgMSAxNTQwMDAwCiszMiAxIDE1NjAwMDAKKzMyIDEgMTU4MDAwMAorMzIgMSAxNjAwMDAwCiszMiAxIDE2MjAwMDAKKzMyIDEgMTY0MDAwMAorMzIgMSAxNjYwMDAwCiszMiAxIDE2ODAwMDAKKzMyIDEgMTcwMDAwMAorMzIgMSAxNzIwMDAwCiszMiAxIDE3NDAwMDAKKzMyIDEgMTc2MDAwMAorMzIgMSAxNzgwMDAwCiszMiAxIDE4MDAwMDAKKzMyIDEgMTgyMDAwMAorMzIgMSAxODQwMDAwCiszMiAxIDE4NjAwMDAKKzMyIDEgMTg4MDAwMAorMzIgMSAxOTAwMDAwCiszMiAxIDE5MjAwMDAKKzMyIDEgMTk0MDAwMAorMzIgMSAxOTYwMDAwCiszMiAxIDE5ODAwMDAKKzMyIDEgMjAwMDAwMAorMzIgMSAyMDIwMDAwCiszMiAxIDIwNDAwMDAKKzMyIDEgMjA2MDAwMAorMzIgMSAyMDgwMDAwCiszMiAxIDIxMDAwMDAKKzMyIDEgMjEyMDAwMAorMzIgMSAyMTQwMDAwCiszMiAxIDIxNjAwMDAKKzMyIDEgMjE4MDAwMAorMzIgMSAyMjAwMDAwCiszMiAxIDIyMjAwMDAKKzMyIDEgMjI0MDAwMAorMzIgMSAyMjYwMDAwCiszMiAxIDIyODAwMDAKKzMyIDEgMjMwMDAwMAorMzIgMSAyMzIwMDAwCiszMiAxIDIzNDAwMDAKKzMyIDEgMjM2MDAwMAorMzIgMSAyMzgwMDAwCiszMiAxIDI0MDAwMDAKKzMyIDEgMjQyMDAwMAorMzIgMSAyNDQwMDAwCiszMiAxIDI0NjAwMDAKKzMyIDEgMjQ4MDAwMAorMzIgMSAyNTAwMDAwCiszMiAxIDI1MjAwMDAKKzMyIDEgMjU0MDAwMAorMzIgMSAyNTYwMDAwCiszMiAxIDI1ODAwMDAKKzMyIDEgMjYwMDAwMAorMzIgMSAyNjIwMDAwCiszMiAxIDI2NDAwMDAKKzMyIDEgMjY2MDAwMAorMzIgMSAyNjgwMDAwCiszMiAxIDI3MDAwMDAKKzMyIDEgMjcyMDAwMAorMzIgMSAyNzQwMDAwCiszMiAxIDI3NjAwMDAKKzMyIDEgMjc4MDAwMAorMzIgMSAyODAwMDAwCiszMiAxIDI4MjAwMDAKKzMyIDEgMjg0MDAwMAorMzIgMSAyODYwMDAwCiszMiAxIDI4ODAwMDAKKzMyIDEgMjkwMDAwMAorMzIgMSAyOTIwMDAwCiszMiAxIDI5NDAwMDAKKzMyIDEgMjk2MDAwMAorMzIgMSAyOTgwMDAwCiszMiAxIDMwMDAwMDAKKzMyIDEgMzAyMDAwMAorMzIgMSAzMDQwMDAwCiszMiAxIDMwNjAwMDAKKzMyIDEgMzA4MDAwMAorMzIgMSAzMTAwMDAwCiszMiAxIDMxMjAwMDAKKzMyIDEgMzE0MDAwMAorMzIgMSAzMTYwMDAwCiszMiAxIDMxODAwMDAKKzMyIDEgMzIwMDAwMAorMzIgMSAzMjIwMDAwCiszMiAxIDMyNDAwMDAKKzMyIDEgMzI2MDAwMAorMzIgMSAzMjgwMDAwCiszMiAxIDMzMDAwMDAKKzMyIDEgMzMyMDAwMAorMzIgMSAzMzQwMDAwCiszMiAxIDMzNjAwMDAKKzMyIDEgMzM4MDAwMAorMzIgMSAzNDAwMDAwCiszMiAxIDM0MjAwMDAKKzMyIDEgMzQ0MDAwMAorMzIgMSAzNDYwMDAwCiszMiAxIDM0ODAwMDAKKzMyIDEgMzUwMDAwMAorMzIgMSAzNTIwMDAwCiszMiAxIDM1NDAwMDAKKzMyIDEgMzU2MDAwMAorMzIgMSAzNTgwMDAwCiszMiAxIDM2MDAwMDAKKzMyIDEgMzYyMDAwMAorMzIgMSAzNjQwMDAwCiszMiAxIDM2NjAwMDAKKzMyIDEgMzY4MDAwMAorMzIgMSAzNzAwMDAwCiszMiAxIDM3MjAwMDAKKzMyIDEgMzc0MDAwMAorMzIgMSAzNzYwMDAwCiszMiAxIDM3ODAwMDAKKzMyIDEgMzgwMDAwMAorMzIgMSAzODIwMDAwCiszMiAxIDM4NDAwMDAKKzMyIDEgMzg2MDAwMAorMzIgMSAzODgwMDAwCiszMiAxIDM5MDAwMDAKKzMyIDEgMzkyMDAwMAorMzIgMSAzOTQwMDAwCiszMiAxIDM5NjAwMDAKKzMyIDEgMzk4MDAwMAorMzIgMSA0MDAwMDAwCiszMiAxIDQwMjAwMDAKKzMyIDEgNDA0MDAwMAorMzIgMSA0MDYwMDAwCiszMiAxIDQwODAwMDAKKzMyIDEgNDEwMDAwMAorMzIgMSA0MTIwMDAwCiszMiAxIDQxNDAwMDAKKzMyIDEgNDE2MDAwMAorMzIgMSA0MTgwMDAwCiszMiAxIDQyMDAwMDAKKzMyIDEgNDIyMDAwMAorMzIgMSA0MjQwMDAwCiszMiAxIDQyNjAwMDAKKzMyIDEgNDI4MDAwMAorMzIgMSA0MzAwMDAwCiszMiAxIDQzMjAwMDAKKzMyIDEgNDM0MDAwMAorMzIgMSA0MzYwMDAwCiszMiAxIDQzODAwMDAKKzMyIDEgNDQwMDAwMAorMzIgMSA0NDIwMDAwCiszMiAxIDQ0NDAwMDAKKzMyIDEgNDQ2MDAwMAorMzIgMSA0NDgwMDAwCiszMiAxIDQ1MDAwMDAKKzMyIDEgNDUyMDAwMAorMzIgMSA0NTQwMDAwCiszMiAxIDQ1NjAwMDAKKzMyIDEgNDU4MDAwMAorMzIgMSA0NjAwMDAwCiszMiAxIDQ2MjAwMDAKKzMyIDEgNDY0MDAwMAorMzIgMSA0NjYwMDAwCiszMiAxIDQ2ODAwMDAKKzMyIDEgNDcwMDAwMAorMzIgMSA0NzIwMDAwCiszMiAxIDQ3NDAwMDAKKzMyIDEgNDc2MDAwMAorMzIgMSA0NzgwMDAwCiszMiAxIDQ4MDAwMDAKKzMyIDEgNDgyMDAwMAorMzIgMSA0ODQwMDAwCiszMiAxIDQ4NjAwMDAKKzMyIDEgNDg4MDAwMAorMzIgMSA0OTAwMDAwCiszMiAxIDQ5MjAwMDAKKzMyIDEgNDk0MDAwMAorMzIgMSA0OTYwMDAwCiszMiAxIDQ5ODAwMDAKKzMyIDEgNTAwMDAwMAorMzIgMSA1MDIwMDAwCiszMiAxIDUwNDAwMDAKKzMyIDEgNTA2MDAwMAorMzIgMSA1MDgwMDAwCiszMiAxIDUxMDAwMDAKKzMyIDEgNTEyMDAwMAorMzIgMSA1MTQwMDAwCiszMiAxIDUxNjAwMDAKKzMyIDEgNTE4MDAwMAorMzIgMSA1MjAwMDAwCiszMiAxIDUyMjAwMDAKKzMyIDEgNTI0MDAwMAorMzIgMSA1MjYwMDAwCiszMiAxIDUyODAwMDAKKzMyIDEgNTMwMDAwMAorMzIgMSA1MzIwMDAwCiszMiAxIDUzNDAwMDAKKzMyIDEgNTM2MDAwMAorMzIgMSA1MzgwMDAwCiszMiAxIDU0MDAwMDAKKzMyIDEgNTQyMDAwMAorMzIgMSA1NDQwMDAwCiszMiAxIDU0NjAwMDAKKzMyIDEgNTQ4MDAwMAorMzIgMSA1NTAwMDAwCiszMiAxIDU1MjAwMDAKKzMyIDEgNTU0MDAwMAorMzIgMSA1NTYwMDAwCiszMiAxIDU1ODAwMDAKKzMyIDEgNTYwMDAwMAorMzIgMSA1NjIwMDAwCiszMiAxIDU2NDAwMDAKKzMyIDEgNTY2MDAwMAorMzIgMSA1NjgwMDAwCiszMiAxIDU3MDAwMDAKKzMyIDEgNTcyMDAwMAorMzIgMSA1NzQwMDAwCiszMiAxIDU3NjAwMDAKKzMyIDEgNTc4MDAwMAorMzIgMSA1ODAwMDAwCiszMiAxIDU4MjAwMDAKKzMyIDEgNTg0MDAwMAorMzIgMSA1ODYwMDAwCiszMiAxIDU4ODAwMDAKKzMyIDEgNTkwMDAwMAorMzIgMSA1OTIwMDAwCiszMiAxIDU5NDAwMDAKKzMyIDEgNTk2MDAwMAorMzIgMSA1OTgwMDAwCiszMiAxIDYwMDAwMDAKKzMyIDEgNjAyMDAwMAorMzIgMSA2MDQwMDAwCiszMiAxIDYwNjAwMDAKKzMyIDEgNjA4MDAwMAorMzIgMSA2MTAwMDAwCiszMiAxIDYxMjAwMDAKKzMyIDEgNjE0MDAwMAorMzIgMSA2MTYwMDAwCiszMiAxIDYxODAwMDAKKzMyIDEgNjIwMDAwMAorMzIgMSA2MjIwMDAwCiszMiAxIDYyNDAwMDAKKzMyIDEgNjI2MDAwMAorMzIgMSA2MjgwMDAwCiszMiAxIDYzMDAwMDAKKzMyIDEgNjMyMDAwMAorMzIgMSA2MzQwMDAwCiszMiAxIDYzNjAwMDAKKzMyIDEgNjM4MDAwMAorMzIgMSA2NDAwMDAwCiszMiAxIDY0MjAwMDAKKzMyIDEgNjQ0MDAwMAorMzIgMSA2NDYwMDAwCiszMiAxIDY0ODAwMDAKKzMyIDEgNjUwMDAwMAorMzIgMSA2NTIwMDAwCiszMiAxIDY1NDAwMDAKKzMyIDEgNjU2MDAwMAorMzIgMSA2NTgwMDAwCiszMiAxIDY2MDAwMDAKKzMyIDEgNjYyMDAwMAorMzIgMSA2NjQwMDAwCiszMiAxIDY2NjAwMDAKKzMyIDEgNjY4MDAwMAorMzIgMSA2NzAwMDAwCiszMiAxIDY3MjAwMDAKKzMyIDEgNjc0MDAwMAorMzIgMSA2NzYwMDAwCiszMiAxIDY3ODAwMDAKKzMyIDEgNjgwMDAwMAorMzIgMSA2ODIwMDAwCiszMiAxIDY4NDAwMDAKKzMyIDEgNjg2MDAwMAorMzIgMSA2ODgwMDAwCiszMiAxIDY5MDAwMDAKKzMyIDEgNjkyMDAwMAorMzIgMSA2OTQwMDAwCiszMiAxIDY5NjAwMDAKKzMyIDEgNjk4MDAwMAorMzIgMSA3MDAwMDAwCiszMiAxIDcwMjAwMDAKKzMyIDEgNzA0MDAwMAorMzIgMSA3MDYwMDAwCiszMiAxIDcwODAwMDAKKzMyIDEgNzEwMDAwMAorMzIgMSA3MTIwMDAwCiszMiAxIDcxNDAwMDAKKzMyIDEgNzE2MDAwMAorMzIgMSA3MTgwMDAwCiszMiAxIDcyMDAwMDAKKzMyIDEgNzIyMDAwMAorMzIgMSA3MjQwMDAwCiszMiAxIDcyNjAwMDAKKzMyIDEgNzI4MDAwMAorMzIgMSA3MzAwMDAwCiszMiAxIDczMjAwMDAKKzMyIDEgNzM0MDAwMAorMzIgMSA3MzYwMDAwCiszMiAxIDczODAwMDAKKzMyIDEgNzQwMDAwMAorMzIgMSA3NDIwMDAwCiszMiAxIDc0NDAwMDAKKzMyIDEgNzQ2MDAwMAorMzIgMSA3NDgwMDAwCiszMiAxIDc1MDAwMDAKKzMyIDEgNzUyMDAwMAorMzIgMSA3NTQwMDAwCiszMiAxIDc1NjAwMDAKKzMyIDEgNzU4MDAwMAorMzIgMSA3NjAwMDAwCiszMiAxIDc2MjAwMDAKKzMyIDEgNzY0MDAwMAorMzIgMSA3NjYwMDAwCiszMiAxIDc2ODAwMDAKKzMyIDEgNzcwMDAwMAorMzIgMSA3NzIwMDAwCiszMiAxIDc3NDAwMDAKKzMyIDEgNzc2MDAwMAorMzIgMSA3NzgwMDAwCiszMiAxIDc4MDAwMDAKKzMyIDEgNzgyMDAwMAorMzIgMSA3ODQwMDAwCiszMiAxIDc4NjAwMDAKKzMyIDEgNzg4MDAwMAorMzIgMSA3OTAwMDAwCiszMiAxIDc5MjAwMDAKKzMyIDEgNzk0MDAwMAorMzIgMSA3OTYwMDAwCiszMiAxIDc5ODAwMDAKKzMyIDEgODAwMDAwMAorMzIgMSA4MDIwMDAwCiszMiAxIDgwNDAwMDAKKzMyIDEgODA2MDAwMAorMzIgMSA4MDgwMDAwCiszMiAxIDgxMDAwMDAKKzMyIDEgODEyMDAwMAorMzIgMSA4MTQwMDAwCiszMiAxIDgxNjAwMDAKKzMyIDEgODE4MDAwMAorMzIgMSA4MjAwMDAwCiszMiAxIDgyMjAwMDAKKzMyIDEgODI0MDAwMAorMzIgMSA4MjYwMDAwCiszMiAxIDgyODAwMDAKKzMyIDEgODMwMDAwMAorMzIgMSA4MzIwMDAwCiszMiAxIDgzNDAwMDAKKzMyIDEgODM2MDAwMAorMzIgMSA4MzgwMDAwCiszMiAxIDg0MDAwMDAKKzMyIDEgODQyMDAwMAorMzIgMSA4NDQwMDAwCiszMiAxIDg0NjAwMDAKKzMyIDEgODQ4MDAwMAorMzIgMSA4NTAwMDAwCiszMiAxIDg1MjAwMDAKKzMyIDEgODU0MDAwMAorMzIgMSA4NTYwMDAwCiszMiAxIDg1ODAwMDAKKzMyIDEgODYwMDAwMAorMzIgMSA4NjIwMDAwCiszMiAxIDg2NDAwMDAKKzMyIDEgODY2MDAwMAorMzIgMSA4NjgwMDAwCiszMiAxIDg3MDAwMDAKKzMyIDEgODcyMDAwMAorMzIgMSA4NzQwMDAwCiszMiAxIDg3NjAwMDAKKzMyIDEgODc4MDAwMAorMzIgMSA4ODAwMDAwCiszMiAxIDg4MjAwMDAKKzMyIDEgODg0MDAwMAorMzIgMSA4ODYwMDAwCiszMiAxIDg4ODAwMDAKKzMyIDEgODkwMDAwMAorMzIgMSA4OTIwMDAwCiszMiAxIDg5NDAwMDAKKzMyIDEgODk2MDAwMAorMzIgMSA4OTgwMDAwCiszMiAxIDkwMDAwMDAKKzMyIDEgOTAyMDAwMAorMzIgMSA5MDQwMDAwCiszMiAxIDkwNjAwMDAKKzMyIDEgOTA4MDAwMAorMzIgMSA5MTAwMDAwCiszMiAxIDkxMjAwMDAKKzMyIDEgOTE0MDAwMAorMzIgMSA5MTYwMDAwCiszMiAxIDkxODAwMDAKKzMyIDEgOTIwMDAwMAorMzIgMSA5MjIwMDAwCiszMiAxIDkyNDAwMDAKKzMyIDEgOTI2MDAwMAorMzIgMSA5MjgwMDAwCiszMiAxIDkzMDAwMDAKKzMyIDEgOTMyMDAwMAorMzIgMSA5MzQwMDAwCiszMiAxIDkzNjAwMDAKKzMyIDEgOTM4MDAwMAorMzIgMSA5NDAwMDAwCiszMiAxIDk0MjAwMDAKKzMyIDEgOTQ0MDAwMAorMzIgMSA5NDYwMDAwCiszMiAxIDk0ODAwMDAKKzMyIDEgOTUwMDAwMAorMzIgMSA5NTIwMDAwCiszMiAxIDk1NDAwMDAKKzMyIDEgOTU2MDAwMAorMzIgMSA5NTgwMDAwCiszMiAxIDk2MDAwMDAKKzMyIDEgOTYyMDAwMAorMzIgMSA5NjQwMDAwCiszMiAxIDk2NjAwMDAKKzMyIDEgOTY4MDAwMAorMzIgMSA5NzAwMDAwCiszMiAxIDk3MjAwMDAKKzMyIDEgOTc0MDAwMAorMzIgMSA5NzYwMDAwCiszMiAxIDk3ODAwMDAKKzMyIDEgOTgwMDAwMAorMzIgMSA5ODIwMDAwCiszMiAxIDk4NDAwMDAKKzMyIDEgOTg2MDAwMAorMzIgMSA5ODgwMDAwCiszMiAxIDk5MDAwMDAKKzMyIDEgOTkyMDAwMAorMzIgMSA5OTQwMDAwCiszMiAxIDk5NjAwMDAKKzMyIDEgOTk4MDAwMAorMzIgMSAxMDAwMDAwMAorMzIgMSAxMDAyMDAwMAorMzIgMSAxMDA0MDAwMAorMzIgMSAxMDA2MDAwMAorMzIgMSAxMDA4MDAwMAorMzIgMSAxMDEwMDAwMAorMzIgMSAxMDEyMDAwMAorMzIgMSAxMDE0MDAwMAorMzIgMSAxMDE2MDAwMAorMzIgMSAxMDE4MDAwMAorMzIgMSAxMDIwMDAwMAorMzIgMSAxMDIyMDAwMAorMzIgMSAxMDI0MDAwMAorMzIgMSAxMDI2MDAwMAorMzIgMSAxMDI4MDAwMAorMzIgMSAxMDMwMDAwMAorMzIgMSAxMDMyMDAwMAorMzIgMSAxMDM0MDAwMAorMzIgMSAxMDM2MDAwMAorMzIgMSAxMDM4MDAwMAorMzIgMSAxMDQwMDAwMAorMzIgMSAxMDQyMDAwMAorMzIgMSAxMDQ0MDAwMAorMzIgMSAxMDQ2MDAwMAorMzIgMSAxMDQ4MDAwMAorMzIgMSAxMDUwMDAwMAorMzIgMSAxMDUyMDAwMAorMzIgMSAxMDU0MDAwMAorMzIgMSAxMDU2MDAwMAorMzIgMSAxMDU4MDAwMAorMzIgMSAxMDYwMDAwMAorMzIgMSAxMDYyMDAwMAorMzIgMSAxMDY0MDAwMAorMzIgMSAxMDY2MDAwMAorMzIgMSAxMDY4MDAwMAorMzIgMSAxMDcwMDAwMAorMzIgMSAxMDcyMDAwMAorMzIgMSAxMDc0MDAwMAorMzIgMSAxMDc2MDAwMAorMzIgMSAxMDc4MDAwMAorMzIgMSAxMDgwMDAwMAorMzIgMSAxMDgyMDAwMAorMzIgMSAxMDg0MDAwMAorMzIgMSAxMDg2MDAwMAorMzIgMSAxMDg4MDAwMAorMzIgMSAxMDkwMDAwMAorMzIgMSAxMDkyMDAwMAorMzIgMSAxMDk0MDAwMAorMzIgMSAxMDk2MDAwMAorMzIgMSAxMDk4MDAwMAorMzIgMSAxMTAwMDAwMAorMzIgMSAxMTAyMDAwMAorMzIgMSAxMTA0MDAwMAorMzIgMSAxMTA2MDAwMAorMzIgMSAxMTA4MDAwMAorMzIgMSAxMTEwMDAwMAorMzIgMSAxMTEyMDAwMAorMzIgMSAxMTE0MDAwMAorMzIgMSAxMTE2MDAwMAorMzIgMSAxMTE4MDAwMAorMzIgMSAxMTIwMDAwMAorMzIgMSAxMTIyMDAwMAorMzIgMSAxMTI0MDAwMAorMzIgMSAxMTI2MDAwMAorMzIgMSAxMTI4MDAwMAorMzIgMSAxMTMwMDAwMAorMzIgMSAxMTMyMDAwMAorMzIgMSAxMTM0MDAwMAorMzIgMSAxMTM2MDAwMAorMzIgMSAxMTM4MDAwMAorMzIgMSAxMTQwMDAwMAorMzIgMSAxMTQyMDAwMAorMzIgMSAxMTQ0MDAwMAorMzIgMSAxMTQ2MDAwMAorMzIgMSAxMTQ4MDAwMAorMzIgMSAxMTUwMDAwMAorMzIgMSAxMTUyMDAwMAorMzIgMSAxMTU0MDAwMAorMzIgMSAxMTU2MDAwMAorMzIgMSAxMTU4MDAwMAorMzIgMSAxMTYwMDAwMAorMzIgMSAxMTYyMDAwMAorMzIgMSAxMTY0MDAwMAorMzIgMSAxMTY2MDAwMAorMzIgMSAxMTY4MDAwMAorMzIgMSAxMTcwMDAwMAorMzIgMSAxMTcyMDAwMAorMzIgMSAxMTc0MDAwMAorMzIgMSAxMTc2MDAwMAorMzIgMSAxMTc4MDAwMAorMzIgMSAxMTgwMDAwMAorMzIgMSAxMTgyMDAwMAorMzIgMSAxMTg0MDAwMAorMzIgMSAxMTg2MDAwMAorMzIgMSAxMTg4MDAwMAorMzIgMSAxMTkwMDAwMAorMzIgMSAxMTkyMDAwMAorMzIgMSAxMTk0MDAwMAorMzIgMSAxMTk2MDAwMAorMzIgMSAxMTk4MDAwMAorMzIgMSAxMjAwMDAwMAorMzIgMSAxMjAyMDAwMAorMzIgMSAxMjA0MDAwMAorMzIgMSAxMjA2MDAwMAorMzIgMSAxMjA4MDAwMAorMzIgMSAxMjEwMDAwMAorMzIgMSAxMjEyMDAwMAorMzIgMSAxMjE0MDAwMAorMzIgMSAxMjE2MDAwMAorMzIgMSAxMjE4MDAwMAorMzIgMSAxMjIwMDAwMAorMzIgMSAxMjIyMDAwMAorMzIgMSAxMjI0MDAwMAorMzIgMSAxMjI2MDAwMAorMzIgMSAxMjI4MDAwMAorMzIgMSAxMjMwMDAwMAorMzIgMSAxMjMyMDAwMAorMzIgMSAxMjM0MDAwMAorMzIgMSAxMjM2MDAwMAorMzIgMSAxMjM4MDAwMAorMzIgMSAxMjQwMDAwMAorMzIgMSAxMjQyMDAwMAorMzIgMSAxMjQ0MDAwMAorMzIgMSAxMjQ2MDAwMAorMzIgMSAxMjQ4MDAwMAorMzIgMSAxMjUwMDAwMAorMzIgMSAxMjUyMDAwMAorMzIgMSAxMjU0MDAwMAorMzIgMSAxMjU2MDAwMAorMzIgMSAxMjU4MDAwMAorMzIgMSAxMjYwMDAwMAorMzIgMSAxMjYyMDAwMAorMzIgMSAxMjY0MDAwMAorMzIgMSAxMjY2MDAwMAorMzIgMSAxMjY4MDAwMAorMzIgMSAxMjcwMDAwMAorMzIgMSAxMjcyMDAwMAorMzIgMSAxMjc0MDAwMAorMzIgMSAxMjc2MDAwMAorMzIgMSAxMjc4MDAwMAorMzIgMSAxMjgwMDAwMAorMzIgMSAxMjgyMDAwMAorMzIgMSAxMjg0MDAwMAorMzIgMSAxMjg2MDAwMAorMzIgMSAxMjg4MDAwMAorMzIgMSAxMjkwMDAwMAorMzIgMSAxMjkyMDAwMAorMzIgMSAxMjk0MDAwMAorMzIgMSAxMjk2MDAwMAorMzIgMSAxMjk4MDAwMAorMzIgMSAxMzAwMDAwMAorMzIgMSAxMzAyMDAwMAorMzIgMSAxMzA0MDAwMAorMzIgMSAxMzA2MDAwMAorMzIgMSAxMzA4MDAwMAorMzIgMSAxMzEwMDAwMAorMzIgMSAxMzEyMDAwMAorMzIgMSAxMzE0MDAwMAorMzIgMSAxMzE2MDAwMAorMzIgMSAxMzE4MDAwMAorMzIgMSAxMzIwMDAwMAorMzIgMSAxMzIyMDAwMAorMzIgMSAxMzI0MDAwMAorMzIgMSAxMzI2MDAwMAorMzIgMSAxMzI4MDAwMAorMzIgMSAxMzMwMDAwMAorMzIgMSAxMzMyMDAwMAorMzIgMSAxMzM0MDAwMAorMzIgMSAxMzM2MDAwMAorMzIgMSAxMzM4MDAwMAorMzIgMSAxMzQwMDAwMAorMzIgMSAxMzQyMDAwMAorMzIgMSAxMzQ0MDAwMAorMzIgMSAxMzQ2MDAwMAorMzIgMSAxMzQ4MDAwMAorMzIgMSAxMzUwMDAwMAorMzIgMSAxMzUyMDAwMAorMzIgMSAxMzU0MDAwMAorMzIgMSAxMzU2MDAwMAorMzIgMSAxMzU4MDAwMAorMzIgMSAxMzYwMDAwMAorMzIgMSAxMzYyMDAwMAorMzIgMSAxMzY0MDAwMAorMzIgMSAxMzY2MDAwMAorMzIgMSAxMzY4MDAwMAorMzIgMSAxMzcwMDAwMAorMzIgMSAxMzcyMDAwMAorMzIgMSAxMzc0MDAwMAorMzIgMSAxMzc2MDAwMAorMzIgMSAxMzc4MDAwMAorMzIgMSAxMzgwMDAwMAorMzIgMSAxMzgyMDAwMAorMzIgMSAxMzg0MDAwMAorMzIgMSAxMzg2MDAwMAorMzIgMSAxMzg4MDAwMAorMzIgMSAxMzkwMDAwMAorMzIgMSAxMzkyMDAwMAorMzIgMSAxMzk0MDAwMAorMzIgMSAxMzk2MDAwMAorMzIgMSAxMzk4MDAwMAorMzIgMSAxNDAwMDAwMAorMzIgMSAxNDAyMDAwMAorMzIgMSAxNDA0MDAwMAorMzIgMSAxNDA2MDAwMAorMzIgMSAxNDA4MDAwMAorMzIgMSAxNDEwMDAwMAorMzIgMSAxNDEyMDAwMAorMzIgMSAxNDE0MDAwMAorMzIgMSAxNDE2MDAwMAorMzIgMSAxNDE4MDAwMAorMzIgMSAxNDIwMDAwMAorMzIgMSAxNDIyMDAwMAorMzIgMSAxNDI0MDAwMAorMzIgMSAxNDI2MDAwMAorMzIgMSAxNDI4MDAwMAorMzIgMSAxNDMwMDAwMAorMzIgMSAxNDMyMDAwMAorMzIgMSAxNDM0MDAwMAorMzIgMSAxNDM2MDAwMAorMzIgMSAxNDM4MDAwMAorMzIgMSAxNDQwMDAwMAorMzIgMSAxNDQyMDAwMAorMzIgMSAxNDQ0MDAwMAorMzIgMSAxNDQ2MDAwMAorMzIgMSAxNDQ4MDAwMAorMzIgMSAxNDUwMDAwMAorMzIgMSAxNDUyMDAwMAorMzIgMSAxNDU0MDAwMAorMzIgMSAxNDU2MDAwMAorMzIgMSAxNDU4MDAwMAorMzIgMSAxNDYwMDAwMAorMzIgMSAxNDYyMDAwMAorMzIgMSAxNDY0MDAwMAorMzIgMSAxNDY2MDAwMAorMzIgMSAxNDY4MDAwMAorMzIgMSAxNDcwMDAwMAorMzIgMSAxNDcyMDAwMAorMzIgMSAxNDc0MDAwMAorMzIgMSAxNDc2MDAwMAorMzIgMSAxNDc4MDAwMAorMzIgMSAxNDgwMDAwMAorMzIgMSAxNDgyMDAwMAorMzIgMSAxNDg0MDAwMAorMzIgMSAxNDg2MDAwMAorMzIgMSAxNDg4MDAwMAorMzIgMSAxNDkwMDAwMAorMzIgMSAxNDkyMDAwMAorMzIgMSAxNDk0MDAwMAorMzIgMSAxNDk2MDAwMAorMzIgMSAxNDk4MDAwMAorMzIgMSAxNTAwMDAwMAorMzIgMSAxNTAyMDAwMAorMzIgMSAxNTA0MDAwMAorMzIgMSAxNTA2MDAwMAorMzIgMSAxNTA4MDAwMAorMzIgMSAxNTEwMDAwMAorMzIgMSAxNTEyMDAwMAorMzIgMSAxNTE0MDAwMAorMzIgMSAxNTE2MDAwMAorMzIgMSAxNTE4MDAwMAorMzIgMSAxNTIwMDAwMAorMzIgMSAxNTIyMDAwMAorMzIgMSAxNTI0MDAwMAorMzIgMSAxNTI2MDAwMAorMzIgMSAxNTI4MDAwMAorMzIgMSAxNTMwMDAwMAorMzIgMSAxNTMyMDAwMAorMzIgMSAxNTM0MDAwMAorMzIgMSAxNTM2MDAwMAorMzIgMSAxNTM4MDAwMAorMzIgMSAxNTQwMDAwMAorMzIgMSAxNTQyMDAwMAorMzIgMSAxNTQ0MDAwMAorMzIgMSAxNTQ2MDAwMAorMzIgMSAxNTQ4MDAwMAorMzIgMSAxNTUwMDAwMAorMzIgMSAxNTUyMDAwMAorMzIgMSAxNTU0MDAwMAorMzIgMSAxNTU2MDAwMAorMzIgMSAxNTU4MDAwMAorMzIgMSAxNTYwMDAwMAorMzIgMSAxNTYyMDAwMAorMzIgMSAxNTY0MDAwMAorMzIgMSAxNTY2MDAwMAorMzIgMSAxNTY4MDAwMAorMzIgMSAxNTcwMDAwMAorMzIgMSAxNTcyMDAwMAorMzIgMSAxNTc0MDAwMAorMzIgMSAxNTc2MDAwMAorMzIgMSAxNTc4MDAwMAorMzIgMSAxNTgwMDAwMAorMzIgMSAxNTgyMDAwMAorMzIgMSAxNTg0MDAwMAorMzIgMSAxNTg2MDAwMAorMzIgMSAxNTg4MDAwMAorMzIgMSAxNTkwMDAwMAorMzIgMSAxNTkyMDAwMAorMzIgMSAxNTk0MDAwMAorMzIgMSAxNTk2MDAwMAorMzIgMSAxNTk4MDAwMAorMzIgMSAxNjAwMDAwMAorMzIgMSAxNjAyMDAwMAorMzIgMSAxNjA0MDAwMAorMzIgMSAxNjA2MDAwMAorMzIgMSAxNjA4MDAwMAorMzIgMSAxNjEwMDAwMAorMzIgMSAxNjEyMDAwMAorMzIgMSAxNjE0MDAwMAorMzIgMSAxNjE2MDAwMAorMzIgMSAxNjE4MDAwMAorMzIgMSAxNjIwMDAwMAorMzIgMSAxNjIyMDAwMAorMzIgMSAxNjI0MDAwMAorMzIgMSAxNjI2MDAwMAorMzIgMSAxNjI4MDAwMAorMzIgMSAxNjMwMDAwMAorMzIgMSAxNjMyMDAwMAorMzIgMSAxNjM0MDAwMAorMzIgMSAxNjM2MDAwMAorMzIgMSAxNjM4MDAwMAorMzIgMSAxNjQwMDAwMAorMzIgMSAxNjQyMDAwMAorMzIgMSAxNjQ0MDAwMAorMzIgMSAxNjQ2MDAwMAorMzIgMSAxNjQ4MDAwMAorMzIgMSAxNjUwMDAwMAorMzIgMSAxNjUyMDAwMAorMzIgMSAxNjU0MDAwMAorMzIgMSAxNjU2MDAwMAorMzIgMSAxNjU4MDAwMAorMzIgMSAxNjYwMDAwMAorMzIgMSAxNjYyMDAwMAorMzIgMSAxNjY0MDAwMApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3Jlcy9zaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6X211bHRpX2ZyYW1lLmluZm8gYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvcmVzL3NpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHpfbXVsdGlfZnJhbWUuaW5mbwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTc2ZWFmNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC9yZXMvc2luZV9hbXJuYl8xY2hfMTJrYnBzXzgwMDBoel9tdWx0aV9mcmFtZS5pbmZvCkBAIC0wLDAgKzEsODA3IEBACiszMiAxIDAKKzMyIDEgMjAwMDAKKzY0IDEgNDAwMDAKKzY0IDEgODAwMDAKKzY0IDEgMTIwMDAwCis5NiAxIDE2MDAwMAorOTYgMSAyMjAwMDAKKzk2IDEgMjgwMDAwCis5NiAxIDM0MDAwMAorMTI4IDEgNDAwMDAwCisxMjggMSA0ODAwMDAKKzEyOCAxIDU2MDAwMAorMTI4IDEgNjQwMDAwCisxMjggMSA3MjAwMDAKKzMyIDEgODAwMDAwCiszMiAxIDgyMDAwMAorMzIgMSA4NDAwMDAKKzMyIDEgODYwMDAwCiszMiAxIDg4MDAwMAorMzIgMSA5MDAwMDAKKzMyIDEgOTIwMDAwCiszMiAxIDk0MDAwMAorMzIgMSA5NjAwMDAKKzMyIDEgOTgwMDAwCiszMiAxIDEwMDAwMDAKKzMyIDEgMTAyMDAwMAorMzIgMSAxMDQwMDAwCiszMiAxIDEwNjAwMDAKKzMyIDEgMTA4MDAwMAorMzIgMSAxMTAwMDAwCiszMiAxIDExMjAwMDAKKzMyIDEgMTE0MDAwMAorMzIgMSAxMTYwMDAwCiszMiAxIDExODAwMDAKKzMyIDEgMTIwMDAwMAorMzIgMSAxMjIwMDAwCiszMiAxIDEyNDAwMDAKKzMyIDEgMTI2MDAwMAorMzIgMSAxMjgwMDAwCiszMiAxIDEzMDAwMDAKKzMyIDEgMTMyMDAwMAorMzIgMSAxMzQwMDAwCiszMiAxIDEzNjAwMDAKKzMyIDEgMTM4MDAwMAorMzIgMSAxNDAwMDAwCiszMiAxIDE0MjAwMDAKKzMyIDEgMTQ0MDAwMAorMzIgMSAxNDYwMDAwCiszMiAxIDE0ODAwMDAKKzMyIDEgMTUwMDAwMAorMzIgMSAxNTIwMDAwCiszMiAxIDE1NDAwMDAKKzMyIDEgMTU2MDAwMAorMzIgMSAxNTgwMDAwCiszMiAxIDE2MDAwMDAKKzMyIDEgMTYyMDAwMAorMzIgMSAxNjQwMDAwCiszMiAxIDE2NjAwMDAKKzMyIDEgMTY4MDAwMAorMzIgMSAxNzAwMDAwCiszMiAxIDE3MjAwMDAKKzMyIDEgMTc0MDAwMAorMzIgMSAxNzYwMDAwCiszMiAxIDE3ODAwMDAKKzMyIDEgMTgwMDAwMAorMzIgMSAxODIwMDAwCiszMiAxIDE4NDAwMDAKKzMyIDEgMTg2MDAwMAorMzIgMSAxODgwMDAwCiszMiAxIDE5MDAwMDAKKzMyIDEgMTkyMDAwMAorMzIgMSAxOTQwMDAwCiszMiAxIDE5NjAwMDAKKzMyIDEgMTk4MDAwMAorMzIgMSAyMDAwMDAwCiszMiAxIDIwMjAwMDAKKzMyIDEgMjA0MDAwMAorMzIgMSAyMDYwMDAwCiszMiAxIDIwODAwMDAKKzMyIDEgMjEwMDAwMAorMzIgMSAyMTIwMDAwCiszMiAxIDIxNDAwMDAKKzMyIDEgMjE2MDAwMAorMzIgMSAyMTgwMDAwCiszMiAxIDIyMDAwMDAKKzMyIDEgMjIyMDAwMAorMzIgMSAyMjQwMDAwCiszMiAxIDIyNjAwMDAKKzMyIDEgMjI4MDAwMAorMzIgMSAyMzAwMDAwCiszMiAxIDIzMjAwMDAKKzMyIDEgMjM0MDAwMAorMzIgMSAyMzYwMDAwCiszMiAxIDIzODAwMDAKKzMyIDEgMjQwMDAwMAorMzIgMSAyNDIwMDAwCiszMiAxIDI0NDAwMDAKKzMyIDEgMjQ2MDAwMAorMzIgMSAyNDgwMDAwCiszMiAxIDI1MDAwMDAKKzMyIDEgMjUyMDAwMAorMzIgMSAyNTQwMDAwCiszMiAxIDI1NjAwMDAKKzMyIDEgMjU4MDAwMAorMzIgMSAyNjAwMDAwCiszMiAxIDI2MjAwMDAKKzMyIDEgMjY0MDAwMAorMzIgMSAyNjYwMDAwCiszMiAxIDI2ODAwMDAKKzMyIDEgMjcwMDAwMAorMzIgMSAyNzIwMDAwCiszMiAxIDI3NDAwMDAKKzMyIDEgMjc2MDAwMAorMzIgMSAyNzgwMDAwCiszMiAxIDI4MDAwMDAKKzMyIDEgMjgyMDAwMAorMzIgMSAyODQwMDAwCiszMiAxIDI4NjAwMDAKKzMyIDEgMjg4MDAwMAorMzIgMSAyOTAwMDAwCiszMiAxIDI5MjAwMDAKKzMyIDEgMjk0MDAwMAorMzIgMSAyOTYwMDAwCiszMiAxIDI5ODAwMDAKKzMyIDEgMzAwMDAwMAorMzIgMSAzMDIwMDAwCiszMiAxIDMwNDAwMDAKKzMyIDEgMzA2MDAwMAorMzIgMSAzMDgwMDAwCiszMiAxIDMxMDAwMDAKKzMyIDEgMzEyMDAwMAorMzIgMSAzMTQwMDAwCiszMiAxIDMxNjAwMDAKKzMyIDEgMzE4MDAwMAorMzIgMSAzMjAwMDAwCiszMiAxIDMyMjAwMDAKKzMyIDEgMzI0MDAwMAorMzIgMSAzMjYwMDAwCiszMiAxIDMyODAwMDAKKzMyIDEgMzMwMDAwMAorMzIgMSAzMzIwMDAwCiszMiAxIDMzNDAwMDAKKzMyIDEgMzM2MDAwMAorMzIgMSAzMzgwMDAwCiszMiAxIDM0MDAwMDAKKzMyIDEgMzQyMDAwMAorMzIgMSAzNDQwMDAwCiszMiAxIDM0NjAwMDAKKzMyIDEgMzQ4MDAwMAorMzIgMSAzNTAwMDAwCiszMiAxIDM1MjAwMDAKKzMyIDEgMzU0MDAwMAorMzIgMSAzNTYwMDAwCiszMiAxIDM1ODAwMDAKKzMyIDEgMzYwMDAwMAorMzIgMSAzNjIwMDAwCiszMiAxIDM2NDAwMDAKKzMyIDEgMzY2MDAwMAorMzIgMSAzNjgwMDAwCiszMiAxIDM3MDAwMDAKKzMyIDEgMzcyMDAwMAorMzIgMSAzNzQwMDAwCiszMiAxIDM3NjAwMDAKKzMyIDEgMzc4MDAwMAorMzIgMSAzODAwMDAwCiszMiAxIDM4MjAwMDAKKzMyIDEgMzg0MDAwMAorMzIgMSAzODYwMDAwCiszMiAxIDM4ODAwMDAKKzMyIDEgMzkwMDAwMAorMzIgMSAzOTIwMDAwCiszMiAxIDM5NDAwMDAKKzMyIDEgMzk2MDAwMAorMzIgMSAzOTgwMDAwCiszMiAxIDQwMDAwMDAKKzMyIDEgNDAyMDAwMAorMzIgMSA0MDQwMDAwCiszMiAxIDQwNjAwMDAKKzMyIDEgNDA4MDAwMAorMzIgMSA0MTAwMDAwCiszMiAxIDQxMjAwMDAKKzMyIDEgNDE0MDAwMAorMzIgMSA0MTYwMDAwCiszMiAxIDQxODAwMDAKKzMyIDEgNDIwMDAwMAorMzIgMSA0MjIwMDAwCiszMiAxIDQyNDAwMDAKKzMyIDEgNDI2MDAwMAorMzIgMSA0MjgwMDAwCiszMiAxIDQzMDAwMDAKKzMyIDEgNDMyMDAwMAorMzIgMSA0MzQwMDAwCiszMiAxIDQzNjAwMDAKKzMyIDEgNDM4MDAwMAorMzIgMSA0NDAwMDAwCiszMiAxIDQ0MjAwMDAKKzMyIDEgNDQ0MDAwMAorMzIgMSA0NDYwMDAwCiszMiAxIDQ0ODAwMDAKKzMyIDEgNDUwMDAwMAorMzIgMSA0NTIwMDAwCiszMiAxIDQ1NDAwMDAKKzMyIDEgNDU2MDAwMAorMzIgMSA0NTgwMDAwCiszMiAxIDQ2MDAwMDAKKzMyIDEgNDYyMDAwMAorMzIgMSA0NjQwMDAwCiszMiAxIDQ2NjAwMDAKKzMyIDEgNDY4MDAwMAorMzIgMSA0NzAwMDAwCiszMiAxIDQ3MjAwMDAKKzMyIDEgNDc0MDAwMAorMzIgMSA0NzYwMDAwCiszMiAxIDQ3ODAwMDAKKzMyIDEgNDgwMDAwMAorMzIgMSA0ODIwMDAwCiszMiAxIDQ4NDAwMDAKKzMyIDEgNDg2MDAwMAorMzIgMSA0ODgwMDAwCiszMiAxIDQ5MDAwMDAKKzMyIDEgNDkyMDAwMAorMzIgMSA0OTQwMDAwCiszMiAxIDQ5NjAwMDAKKzMyIDEgNDk4MDAwMAorMzIgMSA1MDAwMDAwCiszMiAxIDUwMjAwMDAKKzMyIDEgNTA0MDAwMAorMzIgMSA1MDYwMDAwCiszMiAxIDUwODAwMDAKKzMyIDEgNTEwMDAwMAorMzIgMSA1MTIwMDAwCiszMiAxIDUxNDAwMDAKKzMyIDEgNTE2MDAwMAorMzIgMSA1MTgwMDAwCiszMiAxIDUyMDAwMDAKKzMyIDEgNTIyMDAwMAorMzIgMSA1MjQwMDAwCiszMiAxIDUyNjAwMDAKKzMyIDEgNTI4MDAwMAorMzIgMSA1MzAwMDAwCiszMiAxIDUzMjAwMDAKKzMyIDEgNTM0MDAwMAorMzIgMSA1MzYwMDAwCiszMiAxIDUzODAwMDAKKzMyIDEgNTQwMDAwMAorMzIgMSA1NDIwMDAwCiszMiAxIDU0NDAwMDAKKzMyIDEgNTQ2MDAwMAorMzIgMSA1NDgwMDAwCiszMiAxIDU1MDAwMDAKKzMyIDEgNTUyMDAwMAorMzIgMSA1NTQwMDAwCiszMiAxIDU1NjAwMDAKKzMyIDEgNTU4MDAwMAorMzIgMSA1NjAwMDAwCiszMiAxIDU2MjAwMDAKKzMyIDEgNTY0MDAwMAorMzIgMSA1NjYwMDAwCiszMiAxIDU2ODAwMDAKKzMyIDEgNTcwMDAwMAorMzIgMSA1NzIwMDAwCiszMiAxIDU3NDAwMDAKKzMyIDEgNTc2MDAwMAorMzIgMSA1NzgwMDAwCiszMiAxIDU4MDAwMDAKKzMyIDEgNTgyMDAwMAorMzIgMSA1ODQwMDAwCiszMiAxIDU4NjAwMDAKKzMyIDEgNTg4MDAwMAorMzIgMSA1OTAwMDAwCiszMiAxIDU5MjAwMDAKKzMyIDEgNTk0MDAwMAorMzIgMSA1OTYwMDAwCiszMiAxIDU5ODAwMDAKKzMyIDEgNjAwMDAwMAorMzIgMSA2MDIwMDAwCiszMiAxIDYwNDAwMDAKKzMyIDEgNjA2MDAwMAorMzIgMSA2MDgwMDAwCiszMiAxIDYxMDAwMDAKKzMyIDEgNjEyMDAwMAorMzIgMSA2MTQwMDAwCiszMiAxIDYxNjAwMDAKKzMyIDEgNjE4MDAwMAorMzIgMSA2MjAwMDAwCiszMiAxIDYyMjAwMDAKKzMyIDEgNjI0MDAwMAorMzIgMSA2MjYwMDAwCiszMiAxIDYyODAwMDAKKzMyIDEgNjMwMDAwMAorMzIgMSA2MzIwMDAwCiszMiAxIDYzNDAwMDAKKzMyIDEgNjM2MDAwMAorMzIgMSA2MzgwMDAwCiszMiAxIDY0MDAwMDAKKzMyIDEgNjQyMDAwMAorMzIgMSA2NDQwMDAwCiszMiAxIDY0NjAwMDAKKzMyIDEgNjQ4MDAwMAorMzIgMSA2NTAwMDAwCiszMiAxIDY1MjAwMDAKKzMyIDEgNjU0MDAwMAorMzIgMSA2NTYwMDAwCiszMiAxIDY1ODAwMDAKKzMyIDEgNjYwMDAwMAorMzIgMSA2NjIwMDAwCiszMiAxIDY2NDAwMDAKKzMyIDEgNjY2MDAwMAorMzIgMSA2NjgwMDAwCiszMiAxIDY3MDAwMDAKKzMyIDEgNjcyMDAwMAorMzIgMSA2NzQwMDAwCiszMiAxIDY3NjAwMDAKKzMyIDEgNjc4MDAwMAorMzIgMSA2ODAwMDAwCiszMiAxIDY4MjAwMDAKKzMyIDEgNjg0MDAwMAorMzIgMSA2ODYwMDAwCiszMiAxIDY4ODAwMDAKKzMyIDEgNjkwMDAwMAorMzIgMSA2OTIwMDAwCiszMiAxIDY5NDAwMDAKKzMyIDEgNjk2MDAwMAorMzIgMSA2OTgwMDAwCiszMiAxIDcwMDAwMDAKKzMyIDEgNzAyMDAwMAorMzIgMSA3MDQwMDAwCiszMiAxIDcwNjAwMDAKKzMyIDEgNzA4MDAwMAorMzIgMSA3MTAwMDAwCiszMiAxIDcxMjAwMDAKKzMyIDEgNzE0MDAwMAorMzIgMSA3MTYwMDAwCiszMiAxIDcxODAwMDAKKzMyIDEgNzIwMDAwMAorMzIgMSA3MjIwMDAwCiszMiAxIDcyNDAwMDAKKzMyIDEgNzI2MDAwMAorMzIgMSA3MjgwMDAwCiszMiAxIDczMDAwMDAKKzMyIDEgNzMyMDAwMAorMzIgMSA3MzQwMDAwCiszMiAxIDczNjAwMDAKKzMyIDEgNzM4MDAwMAorMzIgMSA3NDAwMDAwCiszMiAxIDc0MjAwMDAKKzMyIDEgNzQ0MDAwMAorMzIgMSA3NDYwMDAwCiszMiAxIDc0ODAwMDAKKzMyIDEgNzUwMDAwMAorMzIgMSA3NTIwMDAwCiszMiAxIDc1NDAwMDAKKzMyIDEgNzU2MDAwMAorMzIgMSA3NTgwMDAwCiszMiAxIDc2MDAwMDAKKzMyIDEgNzYyMDAwMAorMzIgMSA3NjQwMDAwCiszMiAxIDc2NjAwMDAKKzMyIDEgNzY4MDAwMAorMzIgMSA3NzAwMDAwCiszMiAxIDc3MjAwMDAKKzMyIDEgNzc0MDAwMAorMzIgMSA3NzYwMDAwCiszMiAxIDc3ODAwMDAKKzMyIDEgNzgwMDAwMAorMzIgMSA3ODIwMDAwCiszMiAxIDc4NDAwMDAKKzMyIDEgNzg2MDAwMAorMzIgMSA3ODgwMDAwCiszMiAxIDc5MDAwMDAKKzMyIDEgNzkyMDAwMAorMzIgMSA3OTQwMDAwCiszMiAxIDc5NjAwMDAKKzMyIDEgNzk4MDAwMAorMzIgMSA4MDAwMDAwCiszMiAxIDgwMjAwMDAKKzMyIDEgODA0MDAwMAorMzIgMSA4MDYwMDAwCiszMiAxIDgwODAwMDAKKzMyIDEgODEwMDAwMAorMzIgMSA4MTIwMDAwCiszMiAxIDgxNDAwMDAKKzMyIDEgODE2MDAwMAorMzIgMSA4MTgwMDAwCiszMiAxIDgyMDAwMDAKKzMyIDEgODIyMDAwMAorMzIgMSA4MjQwMDAwCiszMiAxIDgyNjAwMDAKKzMyIDEgODI4MDAwMAorMzIgMSA4MzAwMDAwCiszMiAxIDgzMjAwMDAKKzMyIDEgODM0MDAwMAorMzIgMSA4MzYwMDAwCiszMiAxIDgzODAwMDAKKzMyIDEgODQwMDAwMAorMzIgMSA4NDIwMDAwCiszMiAxIDg0NDAwMDAKKzMyIDEgODQ2MDAwMAorMzIgMSA4NDgwMDAwCiszMiAxIDg1MDAwMDAKKzMyIDEgODUyMDAwMAorMzIgMSA4NTQwMDAwCiszMiAxIDg1NjAwMDAKKzMyIDEgODU4MDAwMAorMzIgMSA4NjAwMDAwCiszMiAxIDg2MjAwMDAKKzMyIDEgODY0MDAwMAorMzIgMSA4NjYwMDAwCiszMiAxIDg2ODAwMDAKKzMyIDEgODcwMDAwMAorMzIgMSA4NzIwMDAwCiszMiAxIDg3NDAwMDAKKzMyIDEgODc2MDAwMAorMzIgMSA4NzgwMDAwCiszMiAxIDg4MDAwMDAKKzMyIDEgODgyMDAwMAorMzIgMSA4ODQwMDAwCiszMiAxIDg4NjAwMDAKKzMyIDEgODg4MDAwMAorMzIgMSA4OTAwMDAwCiszMiAxIDg5MjAwMDAKKzMyIDEgODk0MDAwMAorMzIgMSA4OTYwMDAwCiszMiAxIDg5ODAwMDAKKzMyIDEgOTAwMDAwMAorMzIgMSA5MDIwMDAwCiszMiAxIDkwNDAwMDAKKzMyIDEgOTA2MDAwMAorMzIgMSA5MDgwMDAwCiszMiAxIDkxMDAwMDAKKzMyIDEgOTEyMDAwMAorMzIgMSA5MTQwMDAwCiszMiAxIDkxNjAwMDAKKzMyIDEgOTE4MDAwMAorMzIgMSA5MjAwMDAwCiszMiAxIDkyMjAwMDAKKzMyIDEgOTI0MDAwMAorMzIgMSA5MjYwMDAwCiszMiAxIDkyODAwMDAKKzMyIDEgOTMwMDAwMAorMzIgMSA5MzIwMDAwCiszMiAxIDkzNDAwMDAKKzMyIDEgOTM2MDAwMAorMzIgMSA5MzgwMDAwCiszMiAxIDk0MDAwMDAKKzMyIDEgOTQyMDAwMAorMzIgMSA5NDQwMDAwCiszMiAxIDk0NjAwMDAKKzMyIDEgOTQ4MDAwMAorMzIgMSA5NTAwMDAwCiszMiAxIDk1MjAwMDAKKzMyIDEgOTU0MDAwMAorMzIgMSA5NTYwMDAwCiszMiAxIDk1ODAwMDAKKzMyIDEgOTYwMDAwMAorMzIgMSA5NjIwMDAwCiszMiAxIDk2NDAwMDAKKzMyIDEgOTY2MDAwMAorMzIgMSA5NjgwMDAwCiszMiAxIDk3MDAwMDAKKzMyIDEgOTcyMDAwMAorMzIgMSA5NzQwMDAwCiszMiAxIDk3NjAwMDAKKzMyIDEgOTc4MDAwMAorMzIgMSA5ODAwMDAwCiszMiAxIDk4MjAwMDAKKzMyIDEgOTg0MDAwMAorMzIgMSA5ODYwMDAwCiszMiAxIDk4ODAwMDAKKzMyIDEgOTkwMDAwMAorMzIgMSA5OTIwMDAwCiszMiAxIDk5NDAwMDAKKzMyIDEgOTk2MDAwMAorMzIgMSA5OTgwMDAwCiszMiAxIDEwMDAwMDAwCiszMiAxIDEwMDIwMDAwCiszMiAxIDEwMDQwMDAwCiszMiAxIDEwMDYwMDAwCiszMiAxIDEwMDgwMDAwCiszMiAxIDEwMTAwMDAwCiszMiAxIDEwMTIwMDAwCiszMiAxIDEwMTQwMDAwCiszMiAxIDEwMTYwMDAwCiszMiAxIDEwMTgwMDAwCiszMiAxIDEwMjAwMDAwCiszMiAxIDEwMjIwMDAwCiszMiAxIDEwMjQwMDAwCiszMiAxIDEwMjYwMDAwCiszMiAxIDEwMjgwMDAwCiszMiAxIDEwMzAwMDAwCiszMiAxIDEwMzIwMDAwCiszMiAxIDEwMzQwMDAwCiszMiAxIDEwMzYwMDAwCiszMiAxIDEwMzgwMDAwCiszMiAxIDEwNDAwMDAwCiszMiAxIDEwNDIwMDAwCiszMiAxIDEwNDQwMDAwCiszMiAxIDEwNDYwMDAwCiszMiAxIDEwNDgwMDAwCiszMiAxIDEwNTAwMDAwCiszMiAxIDEwNTIwMDAwCiszMiAxIDEwNTQwMDAwCiszMiAxIDEwNTYwMDAwCiszMiAxIDEwNTgwMDAwCiszMiAxIDEwNjAwMDAwCiszMiAxIDEwNjIwMDAwCiszMiAxIDEwNjQwMDAwCiszMiAxIDEwNjYwMDAwCiszMiAxIDEwNjgwMDAwCiszMiAxIDEwNzAwMDAwCiszMiAxIDEwNzIwMDAwCiszMiAxIDEwNzQwMDAwCiszMiAxIDEwNzYwMDAwCiszMiAxIDEwNzgwMDAwCiszMiAxIDEwODAwMDAwCiszMiAxIDEwODIwMDAwCiszMiAxIDEwODQwMDAwCiszMiAxIDEwODYwMDAwCiszMiAxIDEwODgwMDAwCiszMiAxIDEwOTAwMDAwCiszMiAxIDEwOTIwMDAwCiszMiAxIDEwOTQwMDAwCiszMiAxIDEwOTYwMDAwCiszMiAxIDEwOTgwMDAwCiszMiAxIDExMDAwMDAwCiszMiAxIDExMDIwMDAwCiszMiAxIDExMDQwMDAwCiszMiAxIDExMDYwMDAwCiszMiAxIDExMDgwMDAwCiszMiAxIDExMTAwMDAwCiszMiAxIDExMTIwMDAwCiszMiAxIDExMTQwMDAwCiszMiAxIDExMTYwMDAwCiszMiAxIDExMTgwMDAwCiszMiAxIDExMjAwMDAwCiszMiAxIDExMjIwMDAwCiszMiAxIDExMjQwMDAwCiszMiAxIDExMjYwMDAwCiszMiAxIDExMjgwMDAwCiszMiAxIDExMzAwMDAwCiszMiAxIDExMzIwMDAwCiszMiAxIDExMzQwMDAwCiszMiAxIDExMzYwMDAwCiszMiAxIDExMzgwMDAwCiszMiAxIDExNDAwMDAwCiszMiAxIDExNDIwMDAwCiszMiAxIDExNDQwMDAwCiszMiAxIDExNDYwMDAwCiszMiAxIDExNDgwMDAwCiszMiAxIDExNTAwMDAwCiszMiAxIDExNTIwMDAwCiszMiAxIDExNTQwMDAwCiszMiAxIDExNTYwMDAwCiszMiAxIDExNTgwMDAwCiszMiAxIDExNjAwMDAwCiszMiAxIDExNjIwMDAwCiszMiAxIDExNjQwMDAwCiszMiAxIDExNjYwMDAwCiszMiAxIDExNjgwMDAwCiszMiAxIDExNzAwMDAwCiszMiAxIDExNzIwMDAwCiszMiAxIDExNzQwMDAwCiszMiAxIDExNzYwMDAwCiszMiAxIDExNzgwMDAwCiszMiAxIDExODAwMDAwCiszMiAxIDExODIwMDAwCiszMiAxIDExODQwMDAwCiszMiAxIDExODYwMDAwCiszMiAxIDExODgwMDAwCiszMiAxIDExOTAwMDAwCiszMiAxIDExOTIwMDAwCiszMiAxIDExOTQwMDAwCiszMiAxIDExOTYwMDAwCiszMiAxIDExOTgwMDAwCiszMiAxIDEyMDAwMDAwCiszMiAxIDEyMDIwMDAwCiszMiAxIDEyMDQwMDAwCiszMiAxIDEyMDYwMDAwCiszMiAxIDEyMDgwMDAwCiszMiAxIDEyMTAwMDAwCiszMiAxIDEyMTIwMDAwCiszMiAxIDEyMTQwMDAwCiszMiAxIDEyMTYwMDAwCiszMiAxIDEyMTgwMDAwCiszMiAxIDEyMjAwMDAwCiszMiAxIDEyMjIwMDAwCiszMiAxIDEyMjQwMDAwCiszMiAxIDEyMjYwMDAwCiszMiAxIDEyMjgwMDAwCiszMiAxIDEyMzAwMDAwCiszMiAxIDEyMzIwMDAwCiszMiAxIDEyMzQwMDAwCiszMiAxIDEyMzYwMDAwCiszMiAxIDEyMzgwMDAwCiszMiAxIDEyNDAwMDAwCiszMiAxIDEyNDIwMDAwCiszMiAxIDEyNDQwMDAwCiszMiAxIDEyNDYwMDAwCiszMiAxIDEyNDgwMDAwCiszMiAxIDEyNTAwMDAwCiszMiAxIDEyNTIwMDAwCiszMiAxIDEyNTQwMDAwCiszMiAxIDEyNTYwMDAwCiszMiAxIDEyNTgwMDAwCiszMiAxIDEyNjAwMDAwCiszMiAxIDEyNjIwMDAwCiszMiAxIDEyNjQwMDAwCiszMiAxIDEyNjYwMDAwCiszMiAxIDEyNjgwMDAwCiszMiAxIDEyNzAwMDAwCiszMiAxIDEyNzIwMDAwCiszMiAxIDEyNzQwMDAwCiszMiAxIDEyNzYwMDAwCiszMiAxIDEyNzgwMDAwCiszMiAxIDEyODAwMDAwCiszMiAxIDEyODIwMDAwCiszMiAxIDEyODQwMDAwCiszMiAxIDEyODYwMDAwCiszMiAxIDEyODgwMDAwCiszMiAxIDEyOTAwMDAwCiszMiAxIDEyOTIwMDAwCiszMiAxIDEyOTQwMDAwCiszMiAxIDEyOTYwMDAwCiszMiAxIDEyOTgwMDAwCiszMiAxIDEzMDAwMDAwCiszMiAxIDEzMDIwMDAwCiszMiAxIDEzMDQwMDAwCiszMiAxIDEzMDYwMDAwCiszMiAxIDEzMDgwMDAwCiszMiAxIDEzMTAwMDAwCiszMiAxIDEzMTIwMDAwCiszMiAxIDEzMTQwMDAwCiszMiAxIDEzMTYwMDAwCiszMiAxIDEzMTgwMDAwCiszMiAxIDEzMjAwMDAwCiszMiAxIDEzMjIwMDAwCiszMiAxIDEzMjQwMDAwCiszMiAxIDEzMjYwMDAwCiszMiAxIDEzMjgwMDAwCiszMiAxIDEzMzAwMDAwCiszMiAxIDEzMzIwMDAwCiszMiAxIDEzMzQwMDAwCiszMiAxIDEzMzYwMDAwCiszMiAxIDEzMzgwMDAwCiszMiAxIDEzNDAwMDAwCiszMiAxIDEzNDIwMDAwCiszMiAxIDEzNDQwMDAwCiszMiAxIDEzNDYwMDAwCiszMiAxIDEzNDgwMDAwCiszMiAxIDEzNTAwMDAwCiszMiAxIDEzNTIwMDAwCiszMiAxIDEzNTQwMDAwCiszMiAxIDEzNTYwMDAwCiszMiAxIDEzNTgwMDAwCiszMiAxIDEzNjAwMDAwCiszMiAxIDEzNjIwMDAwCiszMiAxIDEzNjQwMDAwCiszMiAxIDEzNjYwMDAwCiszMiAxIDEzNjgwMDAwCiszMiAxIDEzNzAwMDAwCiszMiAxIDEzNzIwMDAwCiszMiAxIDEzNzQwMDAwCiszMiAxIDEzNzYwMDAwCiszMiAxIDEzNzgwMDAwCiszMiAxIDEzODAwMDAwCiszMiAxIDEzODIwMDAwCiszMiAxIDEzODQwMDAwCiszMiAxIDEzODYwMDAwCiszMiAxIDEzODgwMDAwCiszMiAxIDEzOTAwMDAwCiszMiAxIDEzOTIwMDAwCiszMiAxIDEzOTQwMDAwCiszMiAxIDEzOTYwMDAwCiszMiAxIDEzOTgwMDAwCiszMiAxIDE0MDAwMDAwCiszMiAxIDE0MDIwMDAwCiszMiAxIDE0MDQwMDAwCiszMiAxIDE0MDYwMDAwCiszMiAxIDE0MDgwMDAwCiszMiAxIDE0MTAwMDAwCiszMiAxIDE0MTIwMDAwCiszMiAxIDE0MTQwMDAwCiszMiAxIDE0MTYwMDAwCiszMiAxIDE0MTgwMDAwCiszMiAxIDE0MjAwMDAwCiszMiAxIDE0MjIwMDAwCiszMiAxIDE0MjQwMDAwCiszMiAxIDE0MjYwMDAwCiszMiAxIDE0MjgwMDAwCiszMiAxIDE0MzAwMDAwCiszMiAxIDE0MzIwMDAwCiszMiAxIDE0MzQwMDAwCiszMiAxIDE0MzYwMDAwCiszMiAxIDE0MzgwMDAwCiszMiAxIDE0NDAwMDAwCiszMiAxIDE0NDIwMDAwCiszMiAxIDE0NDQwMDAwCiszMiAxIDE0NDYwMDAwCiszMiAxIDE0NDgwMDAwCiszMiAxIDE0NTAwMDAwCiszMiAxIDE0NTIwMDAwCiszMiAxIDE0NTQwMDAwCiszMiAxIDE0NTYwMDAwCiszMiAxIDE0NTgwMDAwCiszMiAxIDE0NjAwMDAwCiszMiAxIDE0NjIwMDAwCiszMiAxIDE0NjQwMDAwCiszMiAxIDE0NjYwMDAwCiszMiAxIDE0NjgwMDAwCiszMiAxIDE0NzAwMDAwCiszMiAxIDE0NzIwMDAwCiszMiAxIDE0NzQwMDAwCiszMiAxIDE0NzYwMDAwCiszMiAxIDE0NzgwMDAwCiszMiAxIDE0ODAwMDAwCiszMiAxIDE0ODIwMDAwCiszMiAxIDE0ODQwMDAwCiszMiAxIDE0ODYwMDAwCiszMiAxIDE0ODgwMDAwCiszMiAxIDE0OTAwMDAwCiszMiAxIDE0OTIwMDAwCiszMiAxIDE0OTQwMDAwCiszMiAxIDE0OTYwMDAwCiszMiAxIDE0OTgwMDAwCiszMiAxIDE1MDAwMDAwCiszMiAxIDE1MDIwMDAwCiszMiAxIDE1MDQwMDAwCiszMiAxIDE1MDYwMDAwCiszMiAxIDE1MDgwMDAwCiszMiAxIDE1MTAwMDAwCiszMiAxIDE1MTIwMDAwCiszMiAxIDE1MTQwMDAwCiszMiAxIDE1MTYwMDAwCiszMiAxIDE1MTgwMDAwCiszMiAxIDE1MjAwMDAwCiszMiAxIDE1MjIwMDAwCiszMiAxIDE1MjQwMDAwCiszMiAxIDE1MjYwMDAwCiszMiAxIDE1MjgwMDAwCiszMiAxIDE1MzAwMDAwCiszMiAxIDE1MzIwMDAwCiszMiAxIDE1MzQwMDAwCiszMiAxIDE1MzYwMDAwCiszMiAxIDE1MzgwMDAwCiszMiAxIDE1NDAwMDAwCiszMiAxIDE1NDIwMDAwCiszMiAxIDE1NDQwMDAwCiszMiAxIDE1NDYwMDAwCiszMiAxIDE1NDgwMDAwCiszMiAxIDE1NTAwMDAwCiszMiAxIDE1NTIwMDAwCiszMiAxIDE1NTQwMDAwCiszMiAxIDE1NTYwMDAwCiszMiAxIDE1NTgwMDAwCiszMiAxIDE1NjAwMDAwCiszMiAxIDE1NjIwMDAwCiszMiAxIDE1NjQwMDAwCiszMiAxIDE1NjYwMDAwCiszMiAxIDE1NjgwMDAwCiszMiAxIDE1NzAwMDAwCiszMiAxIDE1NzIwMDAwCiszMiAxIDE1NzQwMDAwCiszMiAxIDE1NzYwMDAwCiszMiAxIDE1NzgwMDAwCiszMiAxIDE1ODAwMDAwCiszMiAxIDE1ODIwMDAwCiszMiAxIDE1ODQwMDAwCiszMiAxIDE1ODYwMDAwCiszMiAxIDE1ODgwMDAwCiszMiAxIDE1OTAwMDAwCiszMiAxIDE1OTIwMDAwCiszMiAxIDE1OTQwMDAwCiszMiAxIDE1OTYwMDAwCiszMiAxIDE1OTgwMDAwCiszMiAxIDE2MDAwMDAwCiszMiAxIDE2MDIwMDAwCiszMiAxIDE2MDQwMDAwCiszMiAxIDE2MDYwMDAwCiszMiAxIDE2MDgwMDAwCiszMiAxIDE2MTAwMDAwCiszMiAxIDE2MTIwMDAwCiszMiAxIDE2MTQwMDAwCiszMiAxIDE2MTYwMDAwCiszMiAxIDE2MTgwMDAwCiszMiAxIDE2MjAwMDAwCiszMiAxIDE2MjIwMDAwCiszMiAxIDE2MjQwMDAwCiszMiAxIDE2MjYwMDAwCiszMiAxIDE2MjgwMDAwCiszMiAxIDE2MzAwMDAwCiszMiAxIDE2MzIwMDAwCiszMiAxIDE2MzQwMDAwCiszMiAxIDE2MzYwMDAwCiszMiAxIDE2MzgwMDAwCiszMiAxIDE2NDAwMDAwCiszMiAxIDE2NDIwMDAwCiszMiAxIDE2NDQwMDAwCiszMiAxIDE2NDYwMDAwCiszMiAxIDE2NDgwMDAwCiszMiAxIDE2NTAwMDAwCiszMiAxIDE2NTIwMDAwCiszMiAxIDE2NTQwMDAwCiszMiAxIDE2NTYwMDAwCiszMiAxIDE2NTgwMDAwCiszMiAxIDE2NjAwMDAwCiszMiAxIDE2NjIwMDAwCiszMiAxIDE2NjQwMDAwCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMzViMDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vQW5kcm9pZC5icApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0VmlkZW9EZWNUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNIYWxNZWRpYUMyVjFfMERlZmF1bHRzIl0sCisgICAgc3JjczogWyJWdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdC5jcHAiXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlZ0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0IiwKKyAgICBkZWZhdWx0czogWyJWdHNIYWxNZWRpYUMyVjFfMERlZmF1bHRzIl0sCisgICAgc3JjczogWyJWdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdC5jcHAiXSwKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0VmlkZW9EZWNUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUyODc1MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRGVjVGVzdC5jcHAKQEAgLTAsMCArMSw5MDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMl9oaWRsX2hhbF92aWRlb19kZWNfdGVzdCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OkMyQWxsb2NhdG9ySW9uOworCisjaW5jbHVkZSA8VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlLmg+CisjaW5jbHVkZSAibWVkaWFfYzJfdmlkZW9faGlkbF90ZXN0X2NvbW1vbi5oIgorI2luY2x1ZGUgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCIKKworc3RydWN0IEZyYW1lSW5mbyB7CisgICAgaW50IGJ5dGVzQ291bnQ7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgaW50NjRfdCB0aW1lc3RhbXA7Cit9OworCitjbGFzcyBMaW5lYXJCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworICAgcHVibGljOgorICAgIGV4cGxpY2l0IExpbmVhckJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4mIGJsb2NrKQorICAgICAgICA6IEMyQnVmZmVyKAorICAgICAgICAgICAgICB7YmxvY2stPnNoYXJlKGJsb2NrLT5vZmZzZXQoKSwgYmxvY2stPnNpemUoKSwgOjpDMkZlbmNlKCkpfSkge30KKworICAgIGV4cGxpY2l0IExpbmVhckJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4mIGJsb2NrLCBzaXplX3Qgc2l6ZSkKKyAgICAgICAgOiBDMkJ1ZmZlcigKKyAgICAgICAgICAgICAge2Jsb2NrLT5zaGFyZShibG9jay0+b2Zmc2V0KCksIHNpemUsIDo6QzJGZW5jZSgpKX0pIHt9Cit9OworCitzdGF0aWMgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KiBnRW52ID0gbnVsbHB0cjsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSB7CisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgU3VwZXI7CisKKyAgIHB1YmxpYzoKKyAgICA6OnN0ZDo6c3RyaW5nIGdldFRlc3RDYXNlSW5mbygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIDo6c3RkOjpzdHJpbmcoKSArCisgICAgICAgICAgICAgICAgIkNvbXBvbmVudDogIiArIGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCkgKyAiIHwgIiArCisgICAgICAgICAgICAgICAgIkluc3RhbmNlOiAiICsgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJSZXM6ICIgKyBnRW52LT5nZXRSZXMoKS5jX3N0cigpOworICAgIH0KKworICAgIC8vIGdvb2dsZS5jb2RlYzIgVmlkZW8gdGVzdCBzZXR1cAorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgU3VwZXI6OlNldFVwKCk7CisgICAgICAgIG1EaXNhYmxlVGVzdCA9IGZhbHNlOworICAgICAgICBBTE9HVigiQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCBTZXRVcCIpOworICAgICAgICBtQ2xpZW50ID0gYW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgICAgIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSk7CisgICAgICAgIEFTU0VSVF9ORShtQ2xpZW50LCBudWxscHRyKTsKKyAgICAgICAgbUxpc3RlbmVyLnJlc2V0KG5ldyBDb2RlY0xpc3RlbmVyKAorICAgICAgICAgICAgW3RoaXNdKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICAgICAgICAgIGhhbmRsZVdvcmtEb25lKHdvcmtJdGVtcyk7CisgICAgICAgICAgICB9KSk7CisgICAgICAgIEFTU0VSVF9ORShtTGlzdGVuZXIsIG51bGxwdHIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9JTlBVVF9CVUZGRVJTOyArK2kpIHsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmspOworICAgICAgICB9CisgICAgICAgIG1DbGllbnQtPmNyZWF0ZUNvbXBvbmVudChnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpLCBtTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNvbXBvbmVudCk7CisgICAgICAgIEFTU0VSVF9ORShtQ29tcG9uZW50LCBudWxscHRyKTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gc3RvcmUgPQorICAgICAgICAgICAgYW5kcm9pZDo6R2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgICAgICBDSEVDS19FUShzdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUxpbmVhckFsbG9jYXRvciksCisgICAgICAgICAgICAgICAgIEMyX09LKTsKKyAgICAgICAgbUxpbmVhclBvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihtTGluZWFyQWxsb2NhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xJZCsrKTsKKyAgICAgICAgQVNTRVJUX05FKG1MaW5lYXJQb29sLCBudWxscHRyKTsKKworICAgICAgICBtQ29tcE5hbWUgPSB1bmtub3duX2NvbXA7CisgICAgICAgIHN0cnVjdCBTdHJpbmdUb05hbWUgeworICAgICAgICAgICAgY29uc3QgY2hhciogTmFtZTsKKyAgICAgICAgICAgIHN0YW5kYXJkQ29tcCBDb21wTmFtZTsKKyAgICAgICAgfTsKKworICAgICAgICBjb25zdCBTdHJpbmdUb05hbWUga1N0cmluZ1RvTmFtZVtdID0geworICAgICAgICAgICAgeyJoMjYzIiwgaDI2M30sIHsiYXZjIiwgYXZjfSwgeyJtcGVnMiIsIG1wZWcyfSwgeyJtcGVnNCIsIG1wZWc0fSwKKyAgICAgICAgICAgIHsiaGV2YyIsIGhldmN9LCB7InZwOCIsIHZwOH0sIHsidnA5IiwgdnA5fSwgeyJhdjEiLCBhdjF9LAorICAgICAgICB9OworCisgICAgICAgIGNvbnN0IHNpemVfdCBrTnVtU3RyaW5nVG9OYW1lID0KKyAgICAgICAgICAgIHNpemVvZihrU3RyaW5nVG9OYW1lKSAvIHNpemVvZihrU3RyaW5nVG9OYW1lWzBdKTsKKworICAgICAgICAvLyBGaW5kIHRoZSBjb21wb25lbnQgdHlwZQorICAgICAgICBzdGQ6OnN0cmluZyBjb21wID0gc3RkOjpzdHJpbmcoZ0Vudi0+Z2V0Q29tcG9uZW50KCkpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1TdHJpbmdUb05hbWU7ICsraSkgeworICAgICAgICAgICAgaWYgKHN0cmNhc2VzdHIoY29tcC5jX3N0cigpLCBrU3RyaW5nVG9OYW1lW2ldLk5hbWUpKSB7CisgICAgICAgICAgICAgICAgbUNvbXBOYW1lID0ga1N0cmluZ1RvTmFtZVtpXS5Db21wTmFtZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtRW9zID0gZmFsc2U7CisgICAgICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIG1UaW1lc3RhbXBVcyA9IDB1OworICAgICAgICBtVGltZXN0YW1wRGV2VGVzdCA9IGZhbHNlOworICAgICAgICBpZiAobUNvbXBOYW1lID09IHVua25vd25fY29tcCkgbURpc2FibGVUZXN0ID0gdHJ1ZTsKKworICAgICAgICBDMlNlY3VyZU1vZGVUdW5pbmcgc2VjdXJlTW9kZVR1bmluZ3t9OworICAgICAgICBtQ29tcG9uZW50LT5xdWVyeSh7ICZzZWN1cmVNb2RlVHVuaW5nIH0sIHt9LCBDMl9NQVlfQkxPQ0ssIG51bGxwdHIpOworICAgICAgICBpZiAoc2VjdXJlTW9kZVR1bmluZy52YWx1ZSA9PSBDMkNvbmZpZzo6U01fUkVBRF9QUk9URUNURUQpIHsKKyAgICAgICAgICAgIG1EaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAobURpc2FibGVUZXN0KSBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgICAgICAgICAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29tcG9uZW50ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBTdXBlcjo6VGVhckRvd24oKTsKKyAgICB9CisKKyAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiB0byBwcm9jZXNzIG9uV29ya0RvbmUgcmVjZWl2ZWQgYnkgTGlzdGVuZXIKKyAgICB2b2lkIGhhbmRsZVdvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogd29ya0l0ZW1zKSB7CisgICAgICAgICAgICBpZiAoIXdvcmstPndvcmtsZXRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBGb3IgZGVjb2RlciBjb21wb25lbnRzIGN1cnJlbnQgdGltZXN0YW1wIGFsd2F5cyBleGNlZWRzCisgICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgdGltZXN0YW1wCisgICAgICAgICAgICAgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgICAgICAgICAgICAgIGJvb2wgY29kZWNDb25maWcgPSAoKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwKTsKKyAgICAgICAgICAgICAgICBpZiAoIWNvZGVjQ29uZmlnICYmCisgICAgICAgICAgICAgICAgICAgICF3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQuYnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9HRSgKKyAgICAgICAgICAgICAgICAgICAgICAgICh3b3JrLT53b3JrbGV0cy5mcm9udCgpLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKSksCisgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVXMpOworICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCk7CisKKyAgICAgICAgICAgICAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHRzSGl0ID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+OjppdGVyYXRvciBpdCA9IG1UaW1lc3RhbXBVc2xpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdCAhPSBtVGltZXN0YW1wVXNsaXN0LmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCppdCA9PSBtVGltZXN0YW1wVXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzbGlzdC5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzSGl0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHNIaXQgPT0gZmFsc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVRpbWVzdGFtcFVzbGlzdC5lbXB0eSgpID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9FUSh0c0hpdCwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJUaW1lU3RhbXAgbm90IHJlY29nbml6ZWQiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIElORk8gICBdIFJlY2VpdmVkIG5vbi16ZXJvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvdXRwdXQgLyBUaW1lU3RhbXAgbm90IHJlY29nbml6ZWQgXG4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBib29sIG1Dc2Q7CisgICAgICAgICAgICAgICAgd29ya0RvbmUobUNvbXBvbmVudCwgd29yaywgbUZsdXNoZWRJbmRpY2VzLCBtUXVldWVMb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUVvcywgbUNzZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUmVjZWl2ZWQpOworICAgICAgICAgICAgICAgICh2b2lkKW1Dc2Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBlbnVtIHN0YW5kYXJkQ29tcCB7CisgICAgICAgIGgyNjMsCisgICAgICAgIGF2YywKKyAgICAgICAgbXBlZzIsCisgICAgICAgIG1wZWc0LAorICAgICAgICBoZXZjLAorICAgICAgICB2cDgsCisgICAgICAgIHZwOSwKKyAgICAgICAgYXYxLAorICAgICAgICB1bmtub3duX2NvbXAsCisgICAgfTsKKworICAgIGJvb2wgbUVvczsKKyAgICBib29sIG1EaXNhYmxlVGVzdDsKKyAgICBib29sIG1UaW1lc3RhbXBEZXZUZXN0OworICAgIHVpbnQ2NF90IG1UaW1lc3RhbXBVczsKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1UaW1lc3RhbXBVc2xpc3Q7CisgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiBtRmx1c2hlZEluZGljZXM7CisgICAgc3RhbmRhcmRDb21wIG1Db21wTmFtZTsKKyAgICB1aW50MzJfdCBtRnJhbWVzUmVjZWl2ZWQ7CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbElkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUxpbmVhclBvb2w7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtTGluZWFyQWxsb2NhdG9yOworCisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9Cit9OworCit2b2lkIHZhbGlkYXRlQ29tcG9uZW50KAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGJvb2wmIGRpc2FibGVUZXN0KSB7CisgICAgLy8gVmFsaWRhdGUgaXRzIGEgQzIgQ29tcG9uZW50CisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImMyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIk5vdCBhIGMyIGNvbXBvbmVudCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBpdHMgbm90IGFuIGVuY29kZXIgYW5kIHRoZSBjb21wb25lbnQgdG8gYmUgdGVzdGVkIGlzIHZpZGVvCisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImVuY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgRGVjb2RlciwgZ2l2ZW4gRW5jb2RlciIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0KKyAgICAgICAgY29tcG9uZW50LT5xdWVyeSh7fSwge0MyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LICYmIHF1ZXJpZWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkID0+ICVkIiwgYzJlcnIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGlucHV0RG9tYWluID0KKyAgICAgICAgICAgICgoQzJTdHJlYW1NZWRpYVR5cGVTZXR0aW5nOjppbnB1dCopcXVlcmllZFswXS5nZXQoKSktPm0udmFsdWU7CisgICAgICAgIGlmIChpbnB1dERvbWFpbi5maW5kKCJ2aWRlby8iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIFZpZGVvIENvbXBvbmVudCIpOworICAgICAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVmFsaWRhdGVzIGNvbXBvbmVudCBuYW1lCisgICAgaWYgKGNvbXBOYW1lID09IENvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnVua25vd25fY29tcCkgeworICAgICAgICBBTE9HRSgiQ29tcG9uZW50IEluVmFsaWQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJDb21wb25lbnQgVmFsaWQiKTsKK30KKworLy8gbnVtYmVyIG9mIGVsZW1lbnRhcnkgc3RyZWFtcyBwZXIgY29tcG9uZW50CisjZGVmaW5lIFNUUkVBTV9DT1VOVCAyCisvLyBMb29rVXBUYWJsZSBvZiBjbGlwcyBhbmQgbWV0YWRhdGEgZm9yIGNvbXBvbmVudCB0ZXN0aW5nCit2b2lkIEdldFVSTEZvckNvbXBvbmVudChDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcCwgY2hhciogbVVSTCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGluZm8sIHNpemVfdCBzdHJlYW1JbmRleCA9IDEpIHsKKyAgICBzdHJ1Y3QgQ29tcFRvVVJMIHsKKyAgICAgICAgQ29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wIGNvbXA7CisgICAgICAgIGNvbnN0IGNoYXIgbVVSTFtTVFJFQU1fQ09VTlRdWzUxMl07CisgICAgICAgIGNvbnN0IGNoYXIgaW5mb1tTVFJFQU1fQ09VTlRdWzUxMl07CisgICAgfTsKKyAgICBBU1NFUlRfVFJVRShzdHJlYW1JbmRleCA8IFNUUkVBTV9DT1VOVCk7CisKKyAgICBzdGF0aWMgY29uc3QgQ29tcFRvVVJMIGtDb21wVG9VUkxbXSA9IHsKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6YXZjLAorICAgICAgICAgeyJiYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5oMjY0IiwKKyAgICAgICAgICAiYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaDI2NCJ9LAorICAgICAgICAgeyJiYmJfYXZjXzE3NngxNDRfMzAwa2Jwc182MGZwcy5pbmZvIiwKKyAgICAgICAgICAiYmJiX2F2Y182NDB4MzYwXzc2OGticHNfMzBmcHMuaW5mbyJ9fSwKKyAgICAgICAge0NvZGVjMlZpZGVvRGVjSGlkbFRlc3Q6OnN0YW5kYXJkQ29tcDo6aGV2YywKKyAgICAgICAgIHsiYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmhldmMiLAorICAgICAgICAgICJiYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmhldmMifSwKKyAgICAgICAgIHsiYmJiX2hldmNfMTc2eDE0NF8xNzZrYnBzXzYwZnBzLmluZm8iLAorICAgICAgICAgICJiYmJfaGV2Y182NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6Om1wZWcyLAorICAgICAgICAgeyJiYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLm0ydiIsCisgICAgICAgICAgImJiYl9tcGVnMl8zNTJ4Mjg4XzFtYnBzXzYwZnBzLm0ydiJ9LAorICAgICAgICAgeyJiYmJfbXBlZzJfMTc2eDE0NF8xMDVrYnBzXzI1ZnBzLmluZm8iLAorICAgICAgICAgICJiYmJfbXBlZzJfMzUyeDI4OF8xbWJwc182MGZwcy5pbmZvIn19LAorICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjpoMjYzLAorICAgICAgICAgeyIiLCAiYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmgyNjMifSwKKyAgICAgICAgIHsiIiwgImJiYl9oMjYzXzM1MngyODhfMzAwa2Jwc18xMmZwcy5pbmZvIn19LAorICAgICAgICB7Q29kZWMyVmlkZW9EZWNIaWRsVGVzdDo6c3RhbmRhcmRDb21wOjptcGVnNCwKKyAgICAgICAgIHsiIiwgImJiYl9tcGVnNF8zNTJ4Mjg4XzUxMmticHNfMzBmcHMubTR2In0sCisgICAgICAgICB7IiIsICJiYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnZwOCwKKyAgICAgICAgIHsiYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMudnA4IiwKKyAgICAgICAgICAiYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLnZwOCJ9LAorICAgICAgICAgeyJiYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy5pbmZvIiwKKyAgICAgICAgICAiYmJiX3ZwOF82NDB4MzYwXzJtYnBzXzMwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OnZwOSwKKyAgICAgICAgIHsiYmJiX3ZwOV8xNzZ4MTQ0XzI4NWticHNfNjBmcHMudnA5IiwKKyAgICAgICAgICAiYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLnZwOSJ9LAorICAgICAgICAgeyJiYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy5pbmZvIiwKKyAgICAgICAgICAiYmJiX3ZwOV82NDB4MzYwXzE2MDBrYnBzXzMwZnBzLmluZm8ifX0sCisgICAgICAgIHtDb2RlYzJWaWRlb0RlY0hpZGxUZXN0OjpzdGFuZGFyZENvbXA6OmF2MSwKKyAgICAgICAgIHsiYmJiX2F2MV82NDBfMzYwLmF2MSIsCisgICAgICAgICAgImJiYl9hdjFfMTc2XzE0NC5hdjEifSwKKyAgICAgICAgIHsiYmJiX2F2MV82NDBfMzYwLmluZm8iLAorICAgICAgICAgICJiYmJfYXYxXzE3Nl8xNDQuaW5mbyJ9fSwKKyAgICB9OworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoa0NvbXBUb1VSTCkgLyBzaXplb2Yoa0NvbXBUb1VSTFswXSk7ICsraSkgeworICAgICAgICBpZiAoa0NvbXBUb1VSTFtpXS5jb21wID09IGNvbXApIHsKKyAgICAgICAgICAgIHN0cmNhdChtVVJMLCBrQ29tcFRvVVJMW2ldLm1VUkxbc3RyZWFtSW5kZXhdKTsKKyAgICAgICAgICAgIHN0cmNhdChpbmZvLCBrQ29tcFRvVVJMW2ldLmluZm9bc3RyZWFtSW5kZXhdKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBkZWNvZGVORnJhbWVzKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Om11dGV4ICZxdWV1ZUxvY2ssIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlJiBxdWV1ZUNvbmRpdGlvbiwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90PiYgZmx1c2hlZEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiYgbGluZWFyUG9vbCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6Omlmc3RyZWFtJiBlbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4qIEluZm8sCisgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldCwgaW50IHJhbmdlLCBib29sIHNpZ25hbEVPUyA9IHRydWUpIHsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgaW50IGZyYW1lSUQgPSBvZmZzZXQ7CisgICAgaW50IG1heFJldHJ5ID0gMDsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoZnJhbWVJRCA9PSAoaW50KUluZm8tPnNpemUoKSB8fCBmcmFtZUlEID09IChvZmZzZXQgKyByYW5nZSkpIGJyZWFrOworICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgICAgIHdoaWxlICghd29yayAmJiAobWF4UmV0cnkgPCBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBVTG9jayBsKHF1ZXVlTG9jayk7CisgICAgICAgICAgICBpZiAoIXdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgd29yay5zd2FwKHdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICB3b3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgICAgICAgICBtYXhSZXRyeSsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICghd29yayAmJiAobWF4UmV0cnkgPj0gTUFYX1JFVFJZKSkgeworICAgICAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJXYWl0IGZvciBnZW5lcmF0aW5nIEMyV29yayBleGNlZWRlZCB0aW1lb3V0IjsKKyAgICAgICAgfQorICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCA9ICgqSW5mbylbZnJhbWVJRF0udGltZXN0YW1wOworICAgICAgICBpZiAoKCpJbmZvKVtmcmFtZUlEXS5mbGFncykgZmxhZ3MgPSAoMSA8PCAoKCpJbmZvKVtmcmFtZUlEXS5mbGFncyAtIDEpKTsKKyAgICAgICAgaWYgKHNpZ25hbEVPUyAmJiAoKGZyYW1lSUQgPT0gKGludClJbmZvLT5zaXplKCkgLSAxKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAoZnJhbWVJRCA9PSAob2Zmc2V0ICsgcmFuZ2UgLSAxKSkpKQorICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IGZyYW1lSUQ7CisgICAgICAgIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGZsdXNoZWRJbmRpY2VzLmVtcGxhY2VfYmFjayhmcmFtZUlEKTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBzaXplID0gKCpJbmZvKVtmcmFtZUlEXS5ieXRlc0NvdW50OworICAgICAgICBjaGFyKiBkYXRhID0gKGNoYXIqKW1hbGxvYyhzaXplKTsKKyAgICAgICAgQVNTRVJUX05FKGRhdGEsIG51bGxwdHIpOworCisgICAgICAgIGVsZVN0cmVhbS5yZWFkKGRhdGEsIHNpemUpOworICAgICAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmdjb3VudCgpLCBzaXplKTsKKworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgIGF1dG8gYWxpZ25lZFNpemUgPSBBTElHTihzaXplLCBQQUdFX1NJWkUpOworICAgICAgICBpZiAoc2l6ZSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICAgICAgQVNTRVJUX0VRKEMyX09LLAorICAgICAgICAgICAgICAgICAgICBsaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25lZFNpemUsIHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZibG9jaykpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoYmxvY2spOworCisgICAgICAgICAgICAvLyBXcml0ZSBWaWV3CisgICAgICAgICAgICBDMldyaXRlVmlldyB2aWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQzJMaW5lYXJCbG9jazo6bWFwKCkgZmFpbGVkIDogJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQVNTRVJUX0VRKChzaXplX3QpYWxpZ25lZFNpemUsIHZpZXcuY2FwYWNpdHkoKSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoMHUsIHZpZXcub2Zmc2V0KCkpOworICAgICAgICAgICAgQVNTRVJUX0VRKChzaXplX3QpYWxpZ25lZFNpemUsIHZpZXcuc2l6ZSgpKTsKKworICAgICAgICAgICAgbWVtY3B5KHZpZXcuYmFzZSgpLCBkYXRhLCBzaXplKTsKKworICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IExpbmVhckJ1ZmZlcihibG9jaywgc2l6ZSkpOworICAgICAgICAgICAgZnJlZShkYXRhKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworCisgICAgICAgIC8vIERPIFRIRSBERUNPRElORworICAgICAgICBBU1NFUlRfRVEoY29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpLCBDMl9PSyk7CisgICAgICAgIEFMT0dWKCJGcmFtZSAjJWQgc2l6ZSA9ICVkIHF1ZXVlZCIsIGZyYW1lSUQsIHNpemUpOworICAgICAgICBmcmFtZUlEKys7CisgICAgICAgIG1heFJldHJ5ID0gMDsKKyAgICB9Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LCB2YWxpZGF0ZUNvbXBOYW1lKSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFMT0dWKCJDaGVja3MgaWYgdGhlIGdpdmVuIGNvbXBvbmVudCBpcyBhIHZhbGlkIHZpZGVvIGNvbXBvbmVudCIpOworICAgIHZhbGlkYXRlQ29tcG9uZW50KG1Db21wb25lbnQsIG1Db21wTmFtZSwgbURpc2FibGVUZXN0KTsKKyAgICBBU1NFUlRfRVEobURpc2FibGVUZXN0LCBmYWxzZSk7Cit9CisKK2NsYXNzIENvZGVjMlZpZGVvRGVjRGVjb2RlVGVzdAorICAgIDogcHVibGljIENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsCisgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8c3RkOjpwYWlyPGludDMyX3QsIGJvb2w+PiB7Cit9OworCisvLyBCaXRzdHJlYW0gVGVzdAorVEVTVF9QKENvZGVjMlZpZGVvRGVjRGVjb2RlVGVzdCwgRGVjb2RlVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJEZWNvZGVzIGlucHV0IGZpbGUiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICB1aW50MzJfdCBzdHJlYW1JbmRleCA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgYm9vbCBzaWduYWxFT1MgPSBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbywgc3RyZWFtSW5kZXgpOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIC0gZmlsZSBub3QgZm91bmQiOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIG1UaW1lc3RhbXBEZXZUZXN0ID0gdHJ1ZTsKKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICBtVGltZXN0YW1wVXNsaXN0LmNsZWFyKCk7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICBib29sIGNvZGVjQ29uZmlnID0gZmxhZ3MgPworICAgICAgICAgICAgKCgxIDw8IChmbGFncyAtIDEpKSAmIEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRykgIT0gMCA6IDA7CisgICAgICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCAmJiAhY29kZWNDb25maWcpCisgICAgICAgICAgICBtVGltZXN0YW1wVXNsaXN0LnB1c2hfYmFjayh0aW1lc3RhbXApOworICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIC8vIFJlc2V0IHRvdGFsIG5vIG9mIGZyYW1lcyByZWNlaXZlZAorICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgbVRpbWVzdGFtcFVzID0gMDsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZGVjb2RlTkZyYW1lcygKKyAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLCBtRmx1c2hlZEluZGljZXMsCisgICAgICAgIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLCAwLCAoaW50KUluZm8uc2l6ZSgpLCBzaWduYWxFT1MpKTsKKworICAgIC8vIElmIEVPUyBpcyBub3Qgc2VudCwgc2VuZGluZyBlbXB0eSBpbnB1dCB3aXRoIEVPUyBmbGFnCisgICAgc2l6ZV90IGluZm9TaXplID0gSW5mby5zaXplKCk7CisgICAgaWYgKCFzaWduYWxFT1MpIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgMSkpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHRlc3RJbnB1dEJ1ZmZlcihtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0sIGZhbHNlKSk7CisgICAgICAgIGluZm9TaXplICs9IDE7CisgICAgfQorICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBpZiAoIW1Fb3MpIHsKKyAgICAgICAgQUxPR1YoIldhaXRpbmcgZm9yIGlucHV0IGNvbnN1bXB0aW9uIik7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKyAgICB9CisKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBpZiAobUZyYW1lc1JlY2VpdmVkICE9IGluZm9TaXplKSB7CisgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgY291bnQgYW5kIE91dHB1dCBidWZmZXIgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR1YoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAlenUiLCBtRnJhbWVzUmVjZWl2ZWQsCisgICAgICAgICAgICAgIGluZm9TaXplKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpOworICAgIH0KKworICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCkgRVhQRUNUX0VRKG1UaW1lc3RhbXBVc2xpc3QuZW1wdHkoKSwgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorLy8gRGVjb2RlVGVzdCB3aXRoIFN0cmVhbUluZGV4IGFuZCBFT1MgLyBObyBFT1MKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFN0cmVhbUluZGV4QW5kRU9TLCBDb2RlYzJWaWRlb0RlY0RlY29kZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhzdGQ6Om1ha2VfcGFpcigwLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcigwLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKDEsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKDEsIHRydWUpKSk7CisKKy8vIEFkYXB0aXZlIFRlc3QKK1RFU1RfRihDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LCBBZGFwdGl2ZURlY29kZVRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiQWRhcHRpdmUgRGVjb2RlIFRlc3QiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgaWYgKCEobUNvbXBOYW1lID09IGF2YyB8fCBtQ29tcE5hbWUgPT0gaGV2YyB8fCBtQ29tcE5hbWUgPT0gdnA4IHx8CisgICAgICAgICAgbUNvbXBOYW1lID09IHZwOSB8fCBtQ29tcE5hbWUgPT0gbXBlZzIpKQorICAgICAgICByZXR1cm47CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKworICAgIG1UaW1lc3RhbXBEZXZUZXN0ID0gdHJ1ZTsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXBPZmZzZXQgPSAwOworICAgIHVpbnQzMl90IG9mZnNldCA9IDA7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgU1RSRUFNX0NPVU5UICogMjsgaSsrKSB7CisgICAgICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworCisgICAgICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICAgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgICAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvLCBpICUgU1RSRUFNX0NPVU5UKTsKKworICAgICAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIC0gZmlsZSBub3QgZm91bmQiOworICAgICAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgdWludDMyX3QgdGltZXN0YW1wID0gMDsKKyAgICAgICAgdWludDMyX3QgdGltZXN0YW1wTWF4ID0gMDsKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICAgICAgZWxlSW5mbyA+PiBmbGFnczsKKyAgICAgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICAgICAgdGltZXN0YW1wICs9IHRpbWVzdGFtcE9mZnNldDsKKyAgICAgICAgICAgIEluZm8ucHVzaF9iYWNrKHtieXRlc0NvdW50LCBmbGFncywgdGltZXN0YW1wfSk7CisgICAgICAgICAgICBib29sIGNvZGVjQ29uZmlnID0gZmxhZ3MgPworICAgICAgICAgICAgICAgICgoMSA8PCAoZmxhZ3MgLSAxKSkgJiBDMkZyYW1lRGF0YTo6RkxBR19DT0RFQ19DT05GSUcpICE9IDAgOiAwOworCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAobVRpbWVzdGFtcERldlRlc3QgJiYgIWNvZGVjQ29uZmlnKQorICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVXNsaXN0LnB1c2hfYmFjayh0aW1lc3RhbXApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRpbWVzdGFtcE1heCA8IHRpbWVzdGFtcCkgdGltZXN0YW1wTWF4ID0gdGltZXN0YW1wOworICAgICAgICB9CisgICAgICAgIHRpbWVzdGFtcE9mZnNldCA9IHRpbWVzdGFtcE1heDsKKyAgICAgICAgZWxlSW5mby5jbG9zZSgpOworCisgICAgICAgIC8vIFJlc2V0IFRvdGFsIGZyYW1lcyBiZWZvcmUgc2Vjb25kIGRlY29kZSBsb29wCisgICAgICAgIC8vIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIEFMT0dWKCJtVVJMIDogJXMiLCBtVVJMKTsKKyAgICAgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIGRlY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1MaW5lYXJQb29sLCBlbGVTdHJlYW0sICZJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQsIChpbnQpKEluZm8uc2l6ZSgpIC0gb2Zmc2V0KSwgZmFsc2UpKTsKKworICAgICAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgb2Zmc2V0ID0gKGludClJbmZvLnNpemUoKTsKKyAgICB9CisKKyAgICAvLyBTZW5kIEVPUworICAgIC8vIFRPRE8gQWRkIGZ1bmN0aW9uIHRvIHNlbmQgRU9TIHdvcmsgaXRlbQorICAgIGludCBtYXhSZXRyeSA9IDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB3aGlsZSAoIXdvcmsgJiYgKG1heFJldHJ5IDwgTUFYX1JFVFJZKSkgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAoIW1Xb3JrUXVldWUuZW1wdHkoKSkgeworICAgICAgICAgICAgd29yay5zd2FwKG1Xb3JrUXVldWUuZnJvbnQoKSk7CisgICAgICAgICAgICBtV29ya1F1ZXVlLnBvcF9mcm9udCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVF1ZXVlQ29uZGl0aW9uLndhaXRfZm9yKGwsIFRJTUVfT1VUKTsKKyAgICAgICAgICAgIG1heFJldHJ5Kys7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KUMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSAwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IDA7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworCisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIEFMT0dWKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworCisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSAoKEluZm8uc2l6ZSgpKSArIDEpKSB7CisgICAgICAgIEFMT0dFKCJJbnB1dCBidWZmZXIgY291bnQgYW5kIE91dHB1dCBidWZmZXIgY291bnQgbWlzbWF0Y2giKTsKKyAgICAgICAgQUxPR1YoImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAlenUiLCBtRnJhbWVzUmVjZWl2ZWQsCisgICAgICAgICAgICAgIEluZm8uc2l6ZSgpICsgMSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAobVRpbWVzdGFtcERldlRlc3QpIEVYUEVDVF9FUShtVGltZXN0YW1wVXNsaXN0LmVtcHR5KCksIHRydWUpOworfQorCisvLyB0aHVtYm5haWwgdGVzdAorVEVTVF9GKENvZGVjMlZpZGVvRGVjSGlkbFRlc3QsIFRodW1ibmFpbFRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdCBSZXF1ZXN0IGZvciB0aHVtYm5haWwiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICBjaGFyIG1VUkxbNTEyXSwgaW5mb1s1MTJdOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtLCBlbGVJbmZvOworCisgICAgc3RyY3B5KG1VUkwsIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIHN0cmNweShpbmZvLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobUNvbXBOYW1lLCBtVVJMLCBpbmZvKTsKKworICAgIGVsZUluZm8ub3BlbihpbmZvKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpOworICAgIGFuZHJvaWQ6OlZlY3RvcjxGcmFtZUluZm8+IEluZm87CisgICAgaW50IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICB9CisgICAgZWxlSW5mby5jbG9zZSgpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBNQVhfSVRFUkFUSU9OUzsgaSsrKSB7CisgICAgICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICAgICAgLy8gcmVxdWVzdCBFT1MgZm9yIHRodW1ibmFpbAorICAgICAgICAvLyBzaWduYWwgRU9TIGZsYWcgd2l0aCBsYXN0IGZyYW1lCisgICAgICAgIHNpemVfdCBqID0gLTE7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGorKzsKKyAgICAgICAgICAgIGZsYWdzID0gMDsKKyAgICAgICAgICAgIGlmIChJbmZvW2pdLmZsYWdzKSBmbGFncyA9IDF1IDw8IChJbmZvW2pdLmZsYWdzIC0gMSk7CisKKyAgICAgICAgfSB3aGlsZSAoIShmbGFncyAmIFNZTkNfRlJBTUUpKTsKKyAgICAgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgICAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICAgICAgbUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgaiArIDEpKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworICAgICAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgRVhQRUNUX0dFKG1GcmFtZXNSZWNlaXZlZCwgMVUpOworICAgICAgICBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnJlbGVhc2UoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCwgRU9TVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IGVtcHR5IGlucHV0IGJ1ZmZlciB3aXRoIEVPUyBmbGFnIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgLy8gUHJlcGFyZSBDMldvcmsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGlmICghbVdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLnN3YXAobVdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIm1Xb3JrUXVldWUgRW1wdHkgYXQgdGhlIHN0YXJ0IG9mIHRlc3QiOworICAgICAgICB9CisgICAgfQorICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KUMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSAwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IDA7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworCisgICAgeworICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBpZiAobVdvcmtRdWV1ZS5zaXplKCkgIT0gTUFYX0lOUFVUX0JVRkZFUlMpIHsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtV29ya1F1ZXVlLnNpemUoKSwgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitURVNUX0YoQ29kZWMyVmlkZW9EZWNIaWRsVGVzdCwgRmx1c2hUZXN0KSB7CisgICAgZGVzY3JpcHRpb24oIlRlc3RzIEZsdXNoIGNhbGxzIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIGNoYXIgbVVSTFs1MTJdLCBpbmZvWzUxMl07CisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW0sIGVsZUluZm87CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgc3RyY3B5KGluZm8sIGdFbnYtPmdldFJlcygpLmNfc3RyKCkpOworICAgIEdldFVSTEZvckNvbXBvbmVudChtQ29tcE5hbWUsIG1VUkwsIGluZm8pOworCisgICAgZWxlSW5mby5vcGVuKGluZm8pOworICAgIEFTU0VSVF9FUShlbGVJbmZvLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSk7CisgICAgLy8gRGVjb2RlIDEyOCBmcmFtZXMgYW5kIGZsdXNoLiBoZXJlIDEyOCBpcyBjaG9zZW4gdG8gZW5zdXJlIHRoZXJlIGlzIGEga2V5CisgICAgLy8gZnJhbWUgYWZ0ZXIgdGhpcyBzbyB0aGF0IHRoZSBiZWxvdyBzZWN0aW9uIGNhbiBiZSBjb3ZlcmVkIGZvciBhbGwKKyAgICAvLyBjb21wb25lbnRzCisgICAgdWludDMyX3QgbnVtRnJhbWVzRmx1c2hlZCA9IDEyODsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShkZWNvZGVORnJhbWVzKAorICAgICAgICBtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1GbHVzaGVkSW5kaWNlcywKKyAgICAgICAgbUxpbmVhclBvb2wsIGVsZVN0cmVhbSwgJkluZm8sIDAsIG51bUZyYW1lc0ZsdXNoZWQsIGZhbHNlKSk7CisgICAgLy8gZmx1c2gKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOworICAgIGMyX3N0YXR1c190IGVyciA9CisgICAgICAgIG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZV90KU1BWF9JTlBVVF9CVUZGRVJTIC0gZmx1c2hlZFdvcmsuc2l6ZSgpKSk7CisKKyAgICB7CisgICAgICAgIC8vIFVwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIGF1dG8gZnJhbWVJbmRleEl0ID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZpbmQobUZsdXNoZWRJbmRpY2VzLmJlZ2luKCksIG1GbHVzaGVkSW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCkpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gU2VlayB0byBuZXh0IGtleSBmcmFtZSBhbmQgc3RhcnQgZGVjb2RpbmcgdGlsbCB0aGUgZW5kCisgICAgbUZsdXNoZWRJbmRpY2VzLmNsZWFyKCk7CisgICAgaW50IGluZGV4ID0gbnVtRnJhbWVzRmx1c2hlZDsKKyAgICBib29sIGtleUZyYW1lID0gZmFsc2U7CisgICAgZmxhZ3MgPSAwOworICAgIHdoaWxlIChpbmRleCA8IChpbnQpSW5mby5zaXplKCkpIHsKKyAgICAgICAgaWYgKEluZm9baW5kZXhdLmZsYWdzKSBmbGFncyA9IDF1IDw8IChJbmZvW2luZGV4XS5mbGFncyAtIDEpOworICAgICAgICBpZiAoKGZsYWdzICYgU1lOQ19GUkFNRSkgPT0gU1lOQ19GUkFNRSkgeworICAgICAgICAgICAga2V5RnJhbWUgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZmxhZ3MgPSAwOworICAgICAgICBlbGVTdHJlYW0uaWdub3JlKEluZm9baW5kZXhdLmJ5dGVzQ291bnQpOworICAgICAgICBpbmRleCsrOworICAgIH0KKyAgICBpZiAoa2V5RnJhbWUpIHsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICBkZWNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpSW5mby5zaXplKCkgLSBpbmRleCkpOworICAgIH0KKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICBlcnIgPSBtQ29tcG9uZW50LT5mbHVzaChDMkNvbXBvbmVudDo6RkxVU0hfQ09NUE9ORU5ULCAmZmx1c2hlZFdvcmspOworICAgIEFTU0VSVF9FUShlcnIsIEMyX09LKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworICAgIHsKKyAgICAgICAgLy8gVXBkYXRlIG1GbHVzaGVkSW5kaWNlcyBiYXNlZCBvbiB0aGUgaW5kZXggcmVjZWl2ZWQgZnJvbSBmbHVzaCgpCisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgICAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgZnJhbWVJbmRleEl0ID0gc3RkOjpmaW5kKAorICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0RlY0hpZGxUZXN0LCBEZWNvZGVUZXN0RW1wdHlCdWZmZXJzSW5zZXJ0ZWQpIHsKKyAgICBkZXNjcmlwdGlvbigiRGVjb2RlIHdpdGggbXVsdGlwbGUgZW1wdHkgaW5wdXQgZnJhbWVzIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgY2hhciBtVVJMWzUxMl0sIGluZm9bNTEyXTsKKyAgICBzdGQ6Omlmc3RyZWFtIGVsZVN0cmVhbSwgZWxlSW5mbzsKKworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBzdHJjcHkoaW5mbywgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1Db21wTmFtZSwgbVVSTCwgaW5mbyk7CisKKyAgICBlbGVJbmZvLm9wZW4oaW5mbyk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKSA8PCBtVVJMIDw8ICIgLSBmaWxlIG5vdCBmb3VuZCI7CisgICAgYW5kcm9pZDo6VmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IDA7CisgICAgdWludDMyX3QgZnJhbWVJZCA9IDA7CisgICAgdWludDMyX3QgZmxhZ3MgPSAwOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgYm9vbCBjb2RlY0NvbmZpZyA9IGZhbHNlOworICAgIC8vIFRoaXMgdGVzdCBpbnRyb2R1Y2VzIGVtcHR5IENTRCBhZnRlciBldmVyeSAyMHRoIGZyYW1lCisgICAgLy8gYW5kIGVtcHR5IGlucHV0IGZyYW1lcyBhdCBhbiBpbnRlcnZhbCBvZiA1IGZyYW1lcy4KKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAoIShmcmFtZUlkICUgNSkpIHsKKyAgICAgICAgICAgIGlmICghKGZyYW1lSWQgJSAyMCkpIGZsYWdzID0gMzI7CisgICAgICAgICAgICBlbHNlIGZsYWdzID0gMDsKKyAgICAgICAgICAgIGJ5dGVzQ291bnQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICAgICAgZWxlSW5mbyA+PiB0aW1lc3RhbXA7CisgICAgICAgICAgICBjb2RlY0NvbmZpZyA9IGZsYWdzID8KKyAgICAgICAgICAgICAgICAoKDEgPDwgKGZsYWdzIC0gMSkpICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSAhPSAwIDogMDsKKyAgICAgICAgfQorICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgICAgICBmcmFtZUlkKys7CisgICAgfQorICAgIGVsZUluZm8uY2xvc2UoKTsKKworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisgICAgQUxPR1YoIm1VUkwgOiAlcyIsIG1VUkwpOworICAgIGVsZVN0cmVhbS5vcGVuKG1VUkwsIHN0ZDo6aWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGRlY29kZU5GcmFtZXMoCisgICAgICAgIG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwgbUZsdXNoZWRJbmRpY2VzLAorICAgICAgICBtTGluZWFyUG9vbCwgZWxlU3RyZWFtLCAmSW5mbywgMCwgKGludClJbmZvLnNpemUoKSkpOworCisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIGlmICghbUVvcykgeworICAgICAgICBBTE9HVigiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworICAgIH0KKworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gSW5mby5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HVigiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICV6dSIsIG1GcmFtZXNSZWNlaXZlZCwKKyAgICAgICAgICAgICAgSW5mby5zaXplKCkpOworICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgfQorfQorCit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKKy8vIFRPRE8gOiBWaWRlbyBzcGVjaWZpYyBjb25maWd1cmF0aW9uIFRlc3QKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgeworICAgIGdFbnYgPSBuZXcgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgZ0Vudi0+aW5pdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgaW50IHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgTE9HKElORk8pIDw8ICJDMiBUZXN0IHJlc3VsdCA9ICIgPDwgc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL1Z0c0hhbE1lZGlhQzJWMV8wVGFyZ2V0VmlkZW9FbmNUZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFmNWE5MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsLzEuMC92dHMvZnVuY3Rpb25hbC92aWRlby9WdHNIYWxNZWRpYUMyVjFfMFRhcmdldFZpZGVvRW5jVGVzdC5jcHAKQEAgLTAsMCArMSw3MzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImNvZGVjMl9oaWRsX2hhbF92aWRlb19lbmNfdGVzdCIKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisKK3VzaW5nIGFuZHJvaWQ6OkMyQWxsb2NhdG9ySW9uOworCisjaW5jbHVkZSA8VnRzSGFsSGlkbFRhcmdldFRlc3RCYXNlLmg+CisjaW5jbHVkZSAibWVkaWFfYzJfdmlkZW9faGlkbF90ZXN0X2NvbW1vbi5oIgorI2luY2x1ZGUgIm1lZGlhX2MyX2hpZGxfdGVzdF9jb21tb24uaCIKKworY2xhc3MgR3JhcGhpY0J1ZmZlciA6IHB1YmxpYyBDMkJ1ZmZlciB7CitwdWJsaWM6CisgIGV4cGxpY2l0IEdyYXBoaWNCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2spCisgICAgICA6IEMyQnVmZmVyKHtibG9jay0+c2hhcmUoQzJSZWN0KGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6QzJGZW5jZSgpKX0pIHt9Cit9OworCitzdGF0aWMgQ29tcG9uZW50VGVzdEVudmlyb25tZW50KiBnRW52ID0gbnVsbHB0cjsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlZ0c0hhbEhpZGxUYXJnZXRUZXN0QmFzZSB7CisgICBwcml2YXRlOgorICAgIHR5cGVkZWYgOjp0ZXN0aW5nOjpWdHNIYWxIaWRsVGFyZ2V0VGVzdEJhc2UgU3VwZXI7CisKKyAgIHB1YmxpYzoKKyAgICA6OnN0ZDo6c3RyaW5nIGdldFRlc3RDYXNlSW5mbygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIDo6c3RkOjpzdHJpbmcoKSArCisgICAgICAgICAgICAgICAgIkNvbXBvbmVudDogIiArIGdFbnYtPmdldENvbXBvbmVudCgpLmNfc3RyKCkgKyAiIHwgIiArCisgICAgICAgICAgICAgICAgIkluc3RhbmNlOiAiICsgZ0Vudi0+Z2V0SW5zdGFuY2UoKS5jX3N0cigpICsgIiB8ICIgKworICAgICAgICAgICAgICAgICJSZXM6ICIgKyBnRW52LT5nZXRSZXMoKS5jX3N0cigpOworICAgIH0KKworICAgIC8vIGdvb2dsZS5jb2RlYzIgVmlkZW8gdGVzdCBzZXR1cAorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgU3VwZXI6OlNldFVwKCk7CisgICAgICAgIG1EaXNhYmxlVGVzdCA9IGZhbHNlOworICAgICAgICBBTE9HVigiQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCBTZXRVcCIpOworICAgICAgICBtQ2xpZW50ID0gYW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgKKyAgICAgICAgICAgIGdFbnYtPmdldEluc3RhbmNlKCkuY19zdHIoKSk7CisgICAgICAgIEFTU0VSVF9ORShtQ2xpZW50LCBudWxscHRyKTsKKyAgICAgICAgbUxpc3RlbmVyLnJlc2V0KG5ldyBDb2RlY0xpc3RlbmVyKAorICAgICAgICAgICAgW3RoaXNdKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4mIHdvcmtJdGVtcykgeworICAgICAgICAgICAgICAgIGhhbmRsZVdvcmtEb25lKHdvcmtJdGVtcyk7CisgICAgICAgICAgICB9KSk7CisgICAgICAgIEFTU0VSVF9ORShtTGlzdGVuZXIsIG51bGxwdHIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9JTlBVVF9CVUZGRVJTOyArK2kpIHsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmspOworICAgICAgICB9CisgICAgICAgIG1DbGllbnQtPmNyZWF0ZUNvbXBvbmVudChnRW52LT5nZXRDb21wb25lbnQoKS5jX3N0cigpLCBtTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbUNvbXBvbmVudCk7CisgICAgICAgIEFTU0VSVF9ORShtQ29tcG9uZW50LCBudWxscHRyKTsKKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gc3RvcmUgPQorICAgICAgICAgICAgYW5kcm9pZDo6R2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpOworICAgICAgICBDSEVDS19FUShzdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9HUkFQSElDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1HcmFwaGljQWxsb2NhdG9yKSwKKyAgICAgICAgICAgICAgICAgQzJfT0spOworICAgICAgICBtR3JhcGhpY1Bvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihtR3JhcGhpY0FsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJsb2NrUG9vbElkKyspOworICAgICAgICBBU1NFUlRfTkUobUdyYXBoaWNQb29sLCBudWxscHRyKTsKKworICAgICAgICBtQ29tcE5hbWUgPSB1bmtub3duX2NvbXA7CisgICAgICAgIHN0cnVjdCBTdHJpbmdUb05hbWUgeworICAgICAgICAgICAgY29uc3QgY2hhciogTmFtZTsKKyAgICAgICAgICAgIHN0YW5kYXJkQ29tcCBDb21wTmFtZTsKKyAgICAgICAgfTsKKworICAgICAgICBjb25zdCBTdHJpbmdUb05hbWUga1N0cmluZ1RvTmFtZVtdID0geworICAgICAgICAgICAgeyJoMjYzIiwgaDI2M30sIHsiYXZjIiwgYXZjfSwgeyJtcGVnNCIsIG1wZWc0fSwKKyAgICAgICAgICAgIHsiaGV2YyIsIGhldmN9LCB7InZwOCIsIHZwOH0sIHsidnA5IiwgdnA5fSwKKyAgICAgICAgfTsKKworICAgICAgICBjb25zdCBzaXplX3Qga051bVN0cmluZ1RvTmFtZSA9CisgICAgICAgICAgICBzaXplb2Yoa1N0cmluZ1RvTmFtZSkgLyBzaXplb2Yoa1N0cmluZ1RvTmFtZVswXSk7CisKKyAgICAgICAgLy8gRmluZCB0aGUgY29tcG9uZW50IHR5cGUKKyAgICAgICAgc3RkOjpzdHJpbmcgY29tcCA9IHN0ZDo6c3RyaW5nKGdFbnYtPmdldENvbXBvbmVudCgpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtU3RyaW5nVG9OYW1lOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChzdHJjYXNlc3RyKGNvbXAuY19zdHIoKSwga1N0cmluZ1RvTmFtZVtpXS5OYW1lKSkgeworICAgICAgICAgICAgICAgIG1Db21wTmFtZSA9IGtTdHJpbmdUb05hbWVbaV0uQ29tcE5hbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbUVvcyA9IGZhbHNlOworICAgICAgICBtQ3NkID0gZmFsc2U7CisgICAgICAgIG1GcmFtZXNSZWNlaXZlZCA9IDA7CisgICAgICAgIG1GYWlsZWRXb3JrUmVjZWl2ZWQgPSAwOworICAgICAgICBtVGltZXN0YW1wVXMgPSAwdTsKKyAgICAgICAgbVRpbWVzdGFtcERldlRlc3QgPSBmYWxzZTsKKyAgICAgICAgaWYgKG1Db21wTmFtZSA9PSB1bmtub3duX2NvbXApIG1EaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIGlmIChtRGlzYWJsZVRlc3QpIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgRGlzYWJsZWQgXG4iOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db21wb25lbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaWYgKDo6dGVzdGluZzo6VGVzdDo6SGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKKyAgICAgICAgICAgIG1Db21wb25lbnQtPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIG1Db21wb25lbnQgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIFN1cGVyOjpUZWFyRG93bigpOworICAgIH0KKworICAgIGJvb2wgc2V0dXBDb25maWdQYXJhbShpbnQzMl90IG5XaWR0aCwgaW50MzJfdCBuSGVpZ2h0KTsKKworICAgIC8vIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIHByb2Nlc3Mgb25Xb3JrRG9uZSByZWNlaXZlZCBieSBMaXN0ZW5lcgorICAgIHZvaWQgaGFuZGxlV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSB7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiB3b3JrSXRlbXMpIHsKKyAgICAgICAgICAgIGlmICghd29yay0+d29ya2xldHMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIC8vIEZvciBlbmNvZGVyIGNvbXBvbmVudHMgY3VycmVudCB0aW1lc3RhbXAgYWx3YXlzIGV4Y2VlZHMKKyAgICAgICAgICAgICAgICAvLyBwcmV2aW91cyB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgICAgICAgICAgICAgaWYgKCFtVGltZXN0YW1wVXNsaXN0LmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0dFKCh3b3JrLT53b3JrbGV0cy5mcm9udCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+b3V0cHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWt1KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzKTsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFVzID0gd29yay0+d29ya2xldHMuZnJvbnQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAucGVla3UoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gQ3VycmVudGx5IHRoaXMgbG9jayBpcyByZWR1bmRhbnQgYXMgbm8gbVRpbWVzdGFtcFVzbGlzdCBpcyBvbmx5IGluaXRpYWxpemVkCisgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBxdWV1aW5nIGFueSB3b3JrIHRvIGNvbXBvbmVudC4gT25jZSBBZGFwdGl2ZVRlc3QgaXMgYWRkZWQgc2ltaWxhciB0bworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgb25lIGluIHZpZGVvIGRlY29kZXJzLCB0aGlzIGlzIG5lZWRlZC4KKyAgICAgICAgICAgICAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobVRpbWVzdGFtcERldlRlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdHNIaXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGl0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wVXNsaXN0LmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSAoaXQgIT0gbVRpbWVzdGFtcFVzbGlzdC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqaXQgPT0gbVRpbWVzdGFtcFVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBVc2xpc3QuZXJhc2UoaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0c0hpdCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRzSGl0ID09IGZhbHNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1UaW1lc3RhbXBVc2xpc3QuZW1wdHkoKSA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfRVEodHNIaXQsIHRydWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiVGltZVN0YW1wIG5vdCByZWNvZ25pemVkIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJbICAgSU5GTyAgIF0gUmVjZWl2ZWQgbm9uLXplcm8gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dHB1dCAvIFRpbWVTdGFtcCBub3QgcmVjb2duaXplZCBcbiI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHdvcmstPnJlc3VsdCAhPSBDMl9PSykgbUZhaWxlZFdvcmtSZWNlaXZlZCsrOworICAgICAgICAgICAgICAgIHdvcmtEb25lKG1Db21wb25lbnQsIHdvcmssIG1GbHVzaGVkSW5kaWNlcywgbVF1ZXVlTG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIG1Fb3MsIG1Dc2QsCisgICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1JlY2VpdmVkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGVudW0gc3RhbmRhcmRDb21wIHsKKyAgICAgICAgaDI2MywKKyAgICAgICAgYXZjLAorICAgICAgICBtcGVnNCwKKyAgICAgICAgaGV2YywKKyAgICAgICAgdnA4LAorICAgICAgICB2cDksCisgICAgICAgIHVua25vd25fY29tcCwKKyAgICB9OworCisgICAgYm9vbCBtRW9zOworICAgIGJvb2wgbUNzZDsKKyAgICBib29sIG1EaXNhYmxlVGVzdDsKKyAgICBib29sIG1Db25maWc7CisgICAgYm9vbCBtVGltZXN0YW1wRGV2VGVzdDsKKyAgICBzdGFuZGFyZENvbXAgbUNvbXBOYW1lOworICAgIHVpbnQzMl90IG1GcmFtZXNSZWNlaXZlZDsKKyAgICB1aW50MzJfdCBtRmFpbGVkV29ya1JlY2VpdmVkOworICAgIHVpbnQ2NF90IG1UaW1lc3RhbXBVczsKKworICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4gbVRpbWVzdGFtcFVzbGlzdDsKKyAgICBzdGQ6Omxpc3Q8dWludDY0X3Q+IG1GbHVzaGVkSW5kaWNlczsKKworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xJZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1HcmFwaGljUG9vbDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1HcmFwaGljQWxsb2NhdG9yOworCisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworCisgICBwcm90ZWN0ZWQ6CisgICAgc3RhdGljIHZvaWQgZGVzY3JpcHRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGRlc2NyaXB0aW9uKSB7CisgICAgICAgIFJlY29yZFByb3BlcnR5KCJkZXNjcmlwdGlvbiIsIGRlc2NyaXB0aW9uKTsKKyAgICB9Cit9OworCit2b2lkIHZhbGlkYXRlQ29tcG9uZW50KAorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4mIGNvbXBvbmVudCwKKyAgICBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0OjpzdGFuZGFyZENvbXAgY29tcE5hbWUsIGJvb2wmIGRpc2FibGVUZXN0KSB7CisgICAgLy8gVmFsaWRhdGUgaXRzIGEgQzIgQ29tcG9uZW50CisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImMyIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgQUxPR0UoIk5vdCBhIGMyIGNvbXBvbmVudCIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBWYWxpZGF0ZSBpdHMgbm90IGFuIGVuY29kZXIgYW5kIHRoZSBjb21wb25lbnQgdG8gYmUgdGVzdGVkIGlzIHZpZGVvCisgICAgaWYgKGNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoImRlY29kZXIiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgRW5jb2RlciwgZ2l2ZW4gRGVjb2RlciIpOworICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0KKyAgICAgICAgY29tcG9uZW50LT5xdWVyeSh7fSwge0MyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LICYmIHF1ZXJpZWQuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoIlF1ZXJ5IG1lZGlhIHR5cGUgZmFpbGVkID0+ICVkIiwgYzJlcnIpOworICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIGlucHV0RG9tYWluID0KKyAgICAgICAgICAgICgoQzJTdHJlYW1NZWRpYVR5cGVTZXR0aW5nOjppbnB1dCopcXVlcmllZFswXS5nZXQoKSktPm0udmFsdWU7CisgICAgICAgIGlmIChpbnB1dERvbWFpbi5maW5kKCJ2aWRlby8iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIFZpZGVvIENvbXBvbmVudCIpOworICAgICAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gVmFsaWRhdGVzIGNvbXBvbmVudCBuYW1lCisgICAgaWYgKGNvbXBOYW1lID09IENvZGVjMlZpZGVvRW5jSGlkbFRlc3Q6OnVua25vd25fY29tcCkgeworICAgICAgICBBTE9HRSgiQ29tcG9uZW50IEluVmFsaWQiKTsKKyAgICAgICAgZGlzYWJsZVRlc3QgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJDb21wb25lbnQgVmFsaWQiKTsKK30KKworLy8gU2V0IERlZmF1bHQgY29uZmlnIHBhcmFtLgorYm9vbCBDb2RlYzJWaWRlb0VuY0hpZGxUZXN0OjpzZXR1cENvbmZpZ1BhcmFtKGludDMyX3QgbldpZHRoLCBpbnQzMl90IG5IZWlnaHQpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0IGlucHV0U2l6ZSgwdSwgbldpZHRoLCBuSGVpZ2h0KTsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gY29uZmlnUGFyYW17JmlucHV0U2l6ZX07CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgbUNvbXBvbmVudC0+Y29uZmlnKGNvbmZpZ1BhcmFtLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIGlmIChzdGF0dXMgPT0gQzJfT0sgJiYgZmFpbHVyZXMuc2l6ZSgpID09IDB1KSByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIExvb2tVcFRhYmxlIG9mIGNsaXBzIGZvciBjb21wb25lbnQgdGVzdGluZwordm9pZCBHZXRVUkxGb3JDb21wb25lbnQoY2hhciogVVJMKSB7CisgICAgc3RyY2F0KFVSTCwgImJiYl8zNTJ4Mjg4XzQyMHBfMzBmcHNfMzJmcmFtZXMueXV2Iik7Cit9CisKK3ZvaWQgZW5jb2RlTkZyYW1lcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICAgICAgICAgc3RkOjptdXRleCAmcXVldWVMb2NrLCBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSYgcXVldWVDb25kaXRpb24sCisgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD4mIGZsdXNoZWRJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4mIGdyYXBoaWNQb29sLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6aWZzdHJlYW0mIGVsZVN0cmVhbSwgYm9vbCYgZGlzYWJsZVRlc3QsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZnJhbWVJRCwgdWludDMyX3QgbkZyYW1lcywgdWludDMyX3QgbldpZHRoLAorICAgICAgICAgICAgICAgICAgIGludDMyX3QgbkhlaWdodCwgYm9vbCBmbHVzaGVkID0gZmFsc2UsIGJvb2wgc2lnbmFsRU9TID0gdHJ1ZSkgeworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKworICAgIHVpbnQzMl90IG1heFJldHJ5ID0gMDsKKyAgICBpbnQgYnl0ZXNDb3VudCA9IG5XaWR0aCAqIG5IZWlnaHQgKiAzID4+IDE7CisgICAgaW50MzJfdCB0aW1lc3RhbXBJbmNyID0gRU5DT0RFUl9USU1FU1RBTVBfSU5DUkVNRU5UOworICAgIHVpbnQ2NF90IHRpbWVzdGFtcCA9IDA7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKG5GcmFtZXMgPT0gMCkgYnJlYWs7CisgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAgICAgLy8gUHJlcGFyZSBDMldvcmsKKyAgICAgICAgd2hpbGUgKCF3b3JrICYmIChtYXhSZXRyeSA8IE1BWF9SRVRSWSkpIHsKKyAgICAgICAgICAgIFVMb2NrIGwocXVldWVMb2NrKTsKKyAgICAgICAgICAgIGlmICghd29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICB3b3JrLnN3YXAod29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgICAgIHdvcmtRdWV1ZS5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICAgICAgICAgIG1heFJldHJ5Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCF3b3JrICYmIChtYXhSZXRyeSA+PSBNQVhfUkVUUlkpKSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgIldhaXQgZm9yIGdlbmVyYXRpbmcgQzJXb3JrIGV4Y2VlZGVkIHRpbWVvdXQiOworICAgICAgICB9CisgICAgICAgIGlmIChzaWduYWxFT1MgJiYgKG5GcmFtZXMgPT0gMSkpCisgICAgICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICBpZiAoZmx1c2hlZCkgeworICAgICAgICAgICAgZmxhZ3MgfD0gU1lOQ19GUkFNRTsKKyAgICAgICAgICAgIGZsdXNoZWQgPSBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KWZsYWdzOworICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gZnJhbWVJRDsKKyAgICAgICAgeworICAgICAgICAgICAgVUxvY2sgbChxdWV1ZUxvY2spOworICAgICAgICAgICAgZmx1c2hlZEluZGljZXMuZW1wbGFjZV9iYWNrKGZyYW1lSUQpOworICAgICAgICB9CisgICAgICAgIGNoYXIqIGRhdGEgPSAoY2hhciopbWFsbG9jKGJ5dGVzQ291bnQpOworICAgICAgICBBU1NFUlRfTkUoZGF0YSwgbnVsbHB0cik7CisgICAgICAgIG1lbXNldChkYXRhLCAwLCBieXRlc0NvdW50KTsKKyAgICAgICAgaWYgKGVsZVN0cmVhbS5pc19vcGVuKCkpIHsKKyAgICAgICAgICAgIGVsZVN0cmVhbS5yZWFkKGRhdGEsIGJ5dGVzQ291bnQpOworICAgICAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5nY291bnQoKSwgYnl0ZXNDb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKyAgICAgICAgZXJyID0gZ3JhcGhpY1Bvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgICAgIG5XaWR0aCwgbkhlaWdodCwgSEFMX1BJWEVMX0ZPUk1BVF9ZVjEyLAorICAgICAgICAgICAgICAgIHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSwgJmJsb2NrKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgZnByaW50ZihzdGRlcnIsICJmZXRjaEdyYXBoaWNCbG9jayBmYWlsZWQgOiAlZFxuIiwgZXJyKTsKKyAgICAgICAgICAgIGRpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgQVNTRVJUX1RSVUUoYmxvY2spOworICAgICAgICAvLyBHcmFwaGljIFZpZXcKKyAgICAgICAgQzJHcmFwaGljVmlldyB2aWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkMyR3JhcGhpY0Jsb2NrOjptYXAoKSBmYWlsZWQgOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICBkaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQ4X3QqIHBZID0gdmlldy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgICAgICB1aW50OF90KiBwVSA9IHZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgdWludDhfdCogcFYgPSB2aWV3LmRhdGEoKVtDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisKKyAgICAgICAgbWVtY3B5KHBZLCBkYXRhLCBuV2lkdGggKiBuSGVpZ2h0KTsKKyAgICAgICAgbWVtY3B5KHBVLCBkYXRhICsgbldpZHRoICogbkhlaWdodCwgKG5XaWR0aCAqIG5IZWlnaHQgPj4gMikpOworICAgICAgICBtZW1jcHkocFYsIGRhdGEgKyAobldpZHRoICogbkhlaWdodCAqIDUgPj4gMiksIG5XaWR0aCAqIG5IZWlnaHQgPj4gMik7CisKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmVtcGxhY2VfYmFjayhuZXcgR3JhcGhpY0J1ZmZlcihibG9jaykpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisgICAgICAgIGZyZWUoZGF0YSk7CisKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisKKyAgICAgICAgLy8gRE8gVEhFIEVOQ09ESU5HCisgICAgICAgIEFTU0VSVF9FUShjb21wb25lbnQtPnF1ZXVlKCZpdGVtcyksIEMyX09LKTsKKyAgICAgICAgQUxPR1YoIkZyYW1lICMlZCBzaXplID0gJWQgcXVldWVkIiwgZnJhbWVJRCwgYnl0ZXNDb3VudCk7CisgICAgICAgIG5GcmFtZXMtLTsKKyAgICAgICAgdGltZXN0YW1wICs9IHRpbWVzdGFtcEluY3I7CisgICAgICAgIGZyYW1lSUQrKzsKKyAgICAgICAgbWF4UmV0cnkgPSAwOworICAgIH0KK30KKworVEVTVF9GKENvZGVjMlZpZGVvRW5jSGlkbFRlc3QsIHZhbGlkYXRlQ29tcE5hbWUpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQUxPR1YoIkNoZWNrcyBpZiB0aGUgZ2l2ZW4gY29tcG9uZW50IGlzIGEgdmFsaWQgdmlkZW8gY29tcG9uZW50Iik7CisgICAgdmFsaWRhdGVDb21wb25lbnQobUNvbXBvbmVudCwgbUNvbXBOYW1lLCBtRGlzYWJsZVRlc3QpOworICAgIEFTU0VSVF9FUShtRGlzYWJsZVRlc3QsIGZhbHNlKTsKK30KKworY2xhc3MgQ29kZWMyVmlkZW9FbmNFbmNvZGVUZXN0IDogcHVibGljIENvZGVjMlZpZGVvRW5jSGlkbFRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8Ym9vbD4geworfTsKKworVEVTVF9QKENvZGVjMlZpZGVvRW5jRW5jb2RlVGVzdCwgRW5jb2RlVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJFbmNvZGVzIGlucHV0IGZpbGUiKTsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICBjaGFyIG1VUkxbNTEyXTsKKyAgICBpbnQzMl90IG5XaWR0aCA9IEVOQ19ERUZBVUxUX0ZSQU1FX1dJRFRIOworICAgIGludDMyX3QgbkhlaWdodCA9IEVOQ19ERUZBVUxUX0ZSQU1FX0hFSUdIVDsKKyAgICBib29sIHNpZ25hbEVPUyA9IEdldFBhcmFtKCk7CisKKyAgICBzdHJjcHkobVVSTCwgZ0Vudi0+Z2V0UmVzKCkuY19zdHIoKSk7CisgICAgR2V0VVJMRm9yQ29tcG9uZW50KG1VUkwpOworCisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CisgICAgZWxlU3RyZWFtLm9wZW4obVVSTCwgc3RkOjppZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEoZWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgbVVSTCA8PCAiIGZpbGUgbm90IGZvdW5kIjsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisKKyAgICBtVGltZXN0YW1wVXMgPSAwOworICAgIG1UaW1lc3RhbXBEZXZUZXN0ID0gdHJ1ZTsKKyAgICBtRmx1c2hlZEluZGljZXMuY2xlYXIoKTsKKyAgICBtVGltZXN0YW1wVXNsaXN0LmNsZWFyKCk7CisgICAgdWludDMyX3QgaW5wdXRGcmFtZXMgPSBFTkNfTlVNX0ZSQU1FUzsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIC8vIEFkZCBpbnB1dCB0aW1lc3RhbXAgdG8gdGltZXN0YW1wVXNsaXN0CisgICAgd2hpbGUgKGlucHV0RnJhbWVzKSB7CisgICAgICAgIGlmIChtVGltZXN0YW1wRGV2VGVzdCkgbVRpbWVzdGFtcFVzbGlzdC5wdXNoX2JhY2sodGltZXN0YW1wKTsKKyAgICAgICAgdGltZXN0YW1wICs9IEVOQ09ERVJfVElNRVNUQU1QX0lOQ1JFTUVOVDsKKyAgICAgICAgaW5wdXRGcmFtZXMtLTsKKyAgICB9CisgICAgaWYgKCFzZXR1cENvbmZpZ1BhcmFtKG5XaWR0aCwgbkhlaWdodCkpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkIFxuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RhcnQoKSwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1HcmFwaGljUG9vbCwgZWxlU3RyZWFtLCBtRGlzYWJsZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgMCwgRU5DX05VTV9GUkFNRVMsIG5XaWR0aCwgbkhlaWdodCwgZmFsc2UsIHNpZ25hbEVPUykpOworICAgIC8vIG1EaXNhYmxlVGVzdCB3aWxsIGJlIHNldCBpZiBidWZmZXIgd2FzIG5vdCBmZXRjaGVkIHByb3Blcmx5LgorICAgIC8vIFRoaXMgbWF5IGhhcHBlbiB3aGVuIHJlc29sdXRpb24gaXMgbm90IHByb3BlciBidXQgY29uZmlnIHN1Y2VlZGVkCisgICAgLy8gSW4gdGhpcyBjYXNlcywgd2Ugc2tpcCBlbmNvZGluZyB0aGUgaW5wdXQgc3RyZWFtCisgICAgaWYgKG1EaXNhYmxlVGVzdCkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKKyAgICAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gSWYgRU9TIGlzIG5vdCBzZW50LCBzZW5kaW5nIGVtcHR5IGlucHV0IHdpdGggRU9TIGZsYWcKKyAgICBpbnB1dEZyYW1lcyA9IEVOQ19OVU1fRlJBTUVTOworICAgIGlmICghc2lnbmFsRU9TKSB7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsIDEpKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgICAgICB0ZXN0SW5wdXRCdWZmZXIobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNLCBmYWxzZSkpOworICAgICAgICBpbnB1dEZyYW1lcyArPSAxOworICAgIH0KKworICAgIC8vIGJsb2NraW5nIGNhbGwgdG8gZW5zdXJlcyBhcHBsaWNhdGlvbiB0byBXYWl0IHRpbGwgYWxsIHRoZSBpbnB1dHMgYXJlCisgICAgLy8gY29uc3VtZWQKKyAgICBBTE9HRCgiV2FpdGluZyBmb3IgaW5wdXQgY29uc3VtcHRpb24iKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgd2FpdE9uSW5wdXRDb25zdW1wdGlvbihtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUpKTsKKworICAgIGVsZVN0cmVhbS5jbG9zZSgpOworICAgIGlmIChtRnJhbWVzUmVjZWl2ZWQgIT0gaW5wdXRGcmFtZXMpIHsKKyAgICAgICAgQUxPR0UoIklucHV0IGJ1ZmZlciBjb3VudCBhbmQgT3V0cHV0IGJ1ZmZlciBjb3VudCBtaXNtYXRjaCIpOworICAgICAgICBBTE9HRSgiZnJhbWVzUmVjZWl2ZWQgOiAlZCBpbnB1dEZyYW1lcyA6ICVkIiwgbUZyYW1lc1JlY2VpdmVkLAorICAgICAgICAgICAgICBpbnB1dEZyYW1lcyk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKTsKKyAgICB9CisKKyAgICBpZiAoIW1Dc2QgJiYgKG1Db21wTmFtZSAhPSB2cDggJiYgbUNvbXBOYW1lICE9IHZwOSkpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJDU0QgQnVmZmVyIG5vdCByZWNlaXZlZCI7CisgICAgfQorCisgICAgaWYgKG1Dc2QgJiYgKG1Db21wTmFtZSA9PSB2cDggfHwgbUNvbXBOYW1lID09IHZwOSkpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoZmFsc2UpIDw8ICJDU0QgQnVmZmVyIG5vdCBleHBlY3RlZCI7CisgICAgfQorCisgICAgaWYgKG1UaW1lc3RhbXBEZXZUZXN0KSBFWFBFQ1RfRVEobVRpbWVzdGFtcFVzbGlzdC5lbXB0eSgpLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKKy8vIEVuY29kZVRlc3Qgd2l0aCBFT1MgLyBObyBFT1MKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKEVuY29kZVRlc3R3aXRoRU9TLCBDb2RlYzJWaWRlb0VuY0VuY29kZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyh0cnVlLCBmYWxzZSkpOworCitURVNUX0YoQ29kZWMyVmlkZW9FbmNIaWRsVGVzdCwgRU9TVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IGVtcHR5IGlucHV0IGJ1ZmZlciB3aXRoIEVPUyBmbGFnIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGlmICghbVdvcmtRdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICB3b3JrLnN3YXAobVdvcmtRdWV1ZS5mcm9udCgpKTsKKyAgICAgICAgICAgIG1Xb3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgibVdvcmtRdWV1ZSBFbXB0eSBpcyBub3QgZXhwZWN0ZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZSB0ZXN0Iik7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgIHdvcmstPmlucHV0LmZsYWdzID0gKEMyRnJhbWVEYXRhOjpmbGFnc190KUMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSAwOworICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IDA7CisgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgd29yay0+d29ya2xldHMuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmtsZXQpOworCisgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKSwgQzJfT0spOworICAgIHVpbnQzMl90IHF1ZXVlU2l6ZTsKKyAgICB7CisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIHF1ZXVlU2l6ZSA9IG1Xb3JrUXVldWUuc2l6ZSgpOworICAgICAgICBpZiAocXVldWVTaXplIDwgTUFYX0lOUFVUX0JVRkZFUlMpIHsKKyAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi53YWl0X2ZvcihsLCBUSU1FX09VVCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1Fb3MsIHRydWUpOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKK30KKworVEVTVF9GKENvZGVjMlZpZGVvRW5jSGlkbFRlc3QsIEZsdXNoVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0IFJlcXVlc3QgZm9yIGZsdXNoIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIGNoYXIgbVVSTFs1MTJdOworICAgIGludDMyX3QgbldpZHRoID0gRU5DX0RFRkFVTFRfRlJBTUVfV0lEVEg7CisgICAgaW50MzJfdCBuSGVpZ2h0ID0gRU5DX0RFRkFVTFRfRlJBTUVfSEVJR0hUOworICAgIHN0cmNweShtVVJMLCBnRW52LT5nZXRSZXMoKS5jX3N0cigpKTsKKyAgICBHZXRVUkxGb3JDb21wb25lbnQobVVSTCk7CisKKyAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obldpZHRoLCBuSGVpZ2h0KSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICAvLyBTZXR0aW5nIGRlZmF1bHQgY29uZmlndXJhdGlvbgorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIHVpbnQzMl90IG51bUZyYW1lc0ZsdXNoZWQgPSAxMDsKKyAgICB1aW50MzJfdCBudW1GcmFtZXMgPSBFTkNfTlVNX0ZSQU1FUzsKKyAgICBlbGVTdHJlYW0ub3BlbihtVVJMLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShlbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBBTE9HVigibVVSTCA6ICVzIiwgbVVSTCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sIG1EaXNhYmxlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAwLCBudW1GcmFtZXNGbHVzaGVkLCBuV2lkdGgsIG5IZWlnaHQpKTsKKyAgICAvLyBtRGlzYWJsZVRlc3Qgd2lsbCBiZSBzZXQgaWYgYnVmZmVyIHdhcyBub3QgZmV0Y2hlZCBwcm9wZXJseS4KKyAgICAvLyBUaGlzIG1heSBoYXBwZW4gd2hlbiByZXNvbHV0aW9uIGlzIG5vdCBwcm9wZXIgYnV0IGNvbmZpZyBzdWNlZWRlZAorICAgIC8vIEluIHRoaXMgY2FzZXMsIHdlIHNraXAgZW5jb2RpbmcgdGhlIGlucHV0IHN0cmVhbQorICAgIGlmIChtRGlzYWJsZVRlc3QpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBEaXNhYmxlZCBcbiI7CisgICAgICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gZmx1c2hlZFdvcms7CisgICAgYzJfc3RhdHVzX3QgZXJyID0KKyAgICAgICAgbUNvbXBvbmVudC0+Zmx1c2goQzJDb21wb25lbnQ6OkZMVVNIX0NPTVBPTkVOVCwgJmZsdXNoZWRXb3JrKTsKKyAgICBBU1NFUlRfRVEoZXJyLCBDMl9PSyk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgKHNpemVfdClNQVhfSU5QVVRfQlVGRkVSUyAtIGZsdXNoZWRXb3JrLnNpemUoKSkpOworICAgIHVpbnQ2NF90IGZyYW1lSW5kZXg7CisgICAgeworICAgICAgICAvL1VwZGF0ZSBtRmx1c2hlZEluZGljZXMgYmFzZWQgb24gdGhlIGluZGV4IHJlY2VpdmVkIGZyb20gZmx1c2goKQorICAgICAgICBVTG9jayBsKG1RdWV1ZUxvY2spOworICAgICAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+JiB3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh3b3JrLCBudWxscHRyKTsKKyAgICAgICAgICAgIGZyYW1lSW5kZXggPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKTsKKyAgICAgICAgICAgIHN0ZDo6bGlzdDx1aW50NjRfdD46Oml0ZXJhdG9yIGZyYW1lSW5kZXhJdCA9IHN0ZDo6ZmluZCgKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuYmVnaW4oKSwgbUZsdXNoZWRJbmRpY2VzLmVuZCgpLCBmcmFtZUluZGV4KTsKKyAgICAgICAgICAgIGlmICghbUZsdXNoZWRJbmRpY2VzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICAoZnJhbWVJbmRleEl0ICE9IG1GbHVzaGVkSW5kaWNlcy5lbmQoKSkpIHsKKyAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMuZXJhc2UoZnJhbWVJbmRleEl0KTsKKyAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgd29yay0+d29ya2xldHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICBtV29ya1F1ZXVlLnB1c2hfYmFjayhzdGQ6Om1vdmUod29yaykpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG1GbHVzaGVkSW5kaWNlcy5jbGVhcigpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1HcmFwaGljUG9vbCwgZWxlU3RyZWFtLCBtRGlzYWJsZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzRmx1c2hlZCwgbnVtRnJhbWVzIC0gbnVtRnJhbWVzRmx1c2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICBuV2lkdGgsIG5IZWlnaHQsIHRydWUpKTsKKyAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICAvLyBtRGlzYWJsZVRlc3Qgd2lsbCBiZSBzZXQgaWYgYnVmZmVyIHdhcyBub3QgZmV0Y2hlZCBwcm9wZXJseS4KKyAgICAvLyBUaGlzIG1heSBoYXBwZW4gd2hlbiByZXNvbHV0aW9uIGlzIG5vdCBwcm9wZXIgYnV0IGNvbmZpZyBzdWNlZWRlZAorICAgIC8vIEluIHRoaXMgY2FzZXMsIHdlIHNraXAgZW5jb2RpbmcgdGhlIGlucHV0IHN0cmVhbQorICAgIGlmIChtRGlzYWJsZVRlc3QpIHsKKyAgICAgICAgc3RkOjpjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBEaXNhYmxlZCBcbiI7CisgICAgICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdG9wKCksIEMyX09LKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGVyciA9IG1Db21wb25lbnQtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgQVNTRVJUX0VRKGVyciwgQzJfT0spOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgIChzaXplX3QpTUFYX0lOUFVUX0JVRkZFUlMgLSBmbHVzaGVkV29yay5zaXplKCkpKTsKKyAgICB7CisgICAgICAgIC8vVXBkYXRlIG1GbHVzaGVkSW5kaWNlcyBiYXNlZCBvbiB0aGUgaW5kZXggcmVjZWl2ZWQgZnJvbSBmbHVzaCgpCisgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4mIHdvcmsgOiBmbHVzaGVkV29yaykgeworICAgICAgICAgICAgQVNTRVJUX05FKHdvcmssIG51bGxwdHIpOworICAgICAgICAgICAgZnJhbWVJbmRleCA9IHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpOworICAgICAgICAgICAgc3RkOjpsaXN0PHVpbnQ2NF90Pjo6aXRlcmF0b3IgZnJhbWVJbmRleEl0ID0gc3RkOjpmaW5kKAorICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5iZWdpbigpLCBtRmx1c2hlZEluZGljZXMuZW5kKCksIGZyYW1lSW5kZXgpOworICAgICAgICAgICAgaWYgKCFtRmx1c2hlZEluZGljZXMuZW1wdHkoKSAmJgorICAgICAgICAgICAgICAgIChmcmFtZUluZGV4SXQgIT0gbUZsdXNoZWRJbmRpY2VzLmVuZCgpKSkgeworICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcy5lcmFzZShmcmFtZUluZGV4SXQpOworICAgICAgICAgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgQVNTRVJUX0VRKG1GbHVzaGVkSW5kaWNlcy5lbXB0eSgpLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEobUNvbXBvbmVudC0+c3RvcCgpLCBDMl9PSyk7Cit9CisKK1RFU1RfRihDb2RlYzJWaWRlb0VuY0hpZGxUZXN0LCBJbnZhbGlkQnVmZmVyVGVzdCkgeworICAgIGRlc2NyaXB0aW9uKCJUZXN0cyBmZWVkaW5nIGxhcmdlci9zbWFsbGVyIGlucHV0IGJ1ZmZlciIpOworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIHN0ZDo6aWZzdHJlYW0gZWxlU3RyZWFtOworICAgIGludDMyX3QgbldpZHRoID0gRU5DX0RFRkFVTFRfRlJBTUVfV0lEVEggLyAyOworICAgIGludDMyX3QgbkhlaWdodCA9IEVOQ19ERUZBVUxUX0ZSQU1FX0hFSUdIVCAvIDI7CisKKyAgICBpZiAoIXNldHVwQ29uZmlnUGFyYW0obldpZHRoLCBuSGVpZ2h0KSkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IFNraXBwZWQgXG4iOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5zdGFydCgpLCBDMl9PSyk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgZW5jb2RlTkZyYW1lcyhtQ29tcG9uZW50LCBtUXVldWVMb2NrLCBtUXVldWVDb25kaXRpb24sIG1Xb3JrUXVldWUsCisgICAgICAgICAgICAgICAgICAgICAgbUZsdXNoZWRJbmRpY2VzLCBtR3JhcGhpY1Bvb2wsIGVsZVN0cmVhbSwgbURpc2FibGVUZXN0LAorICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIG5XaWR0aCwgbkhlaWdodCwgZmFsc2UsIGZhbHNlKSk7CisKKyAgICAvLyBGZWVkIGxhcmdlciBpbnB1dCBidWZmZXIuCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sIG1EaXNhYmxlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAxLCAxLCBuV2lkdGgqMiwgbkhlaWdodCoyLCBmYWxzZSwgZmFsc2UpKTsKKworICAgIC8vIEZlZWQgc21hbGxlciBpbnB1dCBidWZmZXIuCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIGVuY29kZU5GcmFtZXMobUNvbXBvbmVudCwgbVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgIG1GbHVzaGVkSW5kaWNlcywgbUdyYXBoaWNQb29sLCBlbGVTdHJlYW0sIG1EaXNhYmxlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAyLCAxLCBuV2lkdGgvMiwgbkhlaWdodC8yLCBmYWxzZSwgdHJ1ZSkpOworCisgICAgLy8gYmxvY2tpbmcgY2FsbCB0byBlbnN1cmVzIGFwcGxpY2F0aW9uIHRvIFdhaXQgdGlsbCBhbGwgdGhlIGlucHV0cyBhcmUKKyAgICAvLyBjb25zdW1lZAorICAgIEFMT0dEKCJXYWl0aW5nIGZvciBpbnB1dCBjb25zdW1wdGlvbiIpOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICB3YWl0T25JbnB1dENvbnN1bXB0aW9uKG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSkpOworCisgICAgaWYgKG1GcmFtZXNSZWNlaXZlZCAhPSAzKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIENvbXBvbmVudCBkaWRuJ3QgcmVjZWl2ZSBhbGwgYnVmZmVycyBiYWNrIFxuIjsKKyAgICAgICAgQUxPR1coImZyYW1lc1JlY2VpdmVkIDogJWQgaW5wdXRGcmFtZXMgOiAzIiwgbUZyYW1lc1JlY2VpdmVkKTsKKyAgICB9CisKKyAgICBpZiAobUZhaWxlZFdvcmtSZWNlaXZlZCA9PSAwKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIEV4cGVjdGVkIGZhaWxlZCBmcmFtZSBjb3VudCBtaXNtYXRjaCBcbiI7CisgICAgICAgIEFMT0dXKCJmYWlsZWRGcmFtZXNSZWNlaXZlZCA6ICVkIiwgbUZhaWxlZFdvcmtSZWNlaXZlZCk7CisgICAgfQorCisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworfQorCitjbGFzcyBDb2RlYzJWaWRlb0VuY1Jlc29sdXRpb25UZXN0IDogcHVibGljIENvZGVjMlZpZGVvRW5jSGlkbFRlc3QsCisgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4gPiB7Cit9OworCitURVNUX1AoQ29kZWMyVmlkZW9FbmNSZXNvbHV0aW9uVGVzdCwgUmVzb2x1dGlvblRlc3QpIHsKKyAgICBkZXNjcmlwdGlvbigiVGVzdHMgZW5jb2RpbmcgYXQgZGlmZmVyZW50IHJlc29sdXRpb25zIik7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgc3RkOjppZnN0cmVhbSBlbGVTdHJlYW07CisgICAgaW50MzJfdCBuV2lkdGggPSBHZXRQYXJhbSgpLmZpcnN0OworICAgIGludDMyX3QgbkhlaWdodCA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIEFMT0dEKCJUcnlpbmcgZW5jb2RlIGZvciB3aWR0aCAlZCBoZWlnaHQgJWQiLCBuV2lkdGgsIG5IZWlnaHQpOworICAgIG1Fb3MgPSBmYWxzZTsKKworICAgIGlmICghc2V0dXBDb25maWdQYXJhbShuV2lkdGgsIG5IZWlnaHQpKSB7CisgICAgICAgIHN0ZDo6Y291dCA8PCAiWyAgIFdBUk4gICBdIFRlc3QgU2tpcHBlZCBcbiI7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0YXJ0KCksIEMyX09LKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICBlbmNvZGVORnJhbWVzKG1Db21wb25lbnQsIG1RdWV1ZUxvY2ssIG1RdWV1ZUNvbmRpdGlvbiwgbVdvcmtRdWV1ZSwKKyAgICAgICAgICAgICAgICAgICAgICBtRmx1c2hlZEluZGljZXMsIG1HcmFwaGljUG9vbCwgZWxlU3RyZWFtLCBtRGlzYWJsZVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgMCwgTUFYX0lOUFVUX0JVRkZFUlMsIG5XaWR0aCwgbkhlaWdodCwgZmFsc2UsIHRydWUpKTsKKworICAgIC8vIG1EaXNhYmxlVGVzdCB3aWxsIGJlIHNldCBpZiBidWZmZXIgd2FzIG5vdCBmZXRjaGVkIHByb3Blcmx5LgorICAgIC8vIFRoaXMgbWF5IGhhcHBlbiB3aGVuIHJlc29sdXRpb24gaXMgbm90IHByb3BlciBidXQgY29uZmlnIHN1Y2VlZGVkCisgICAgLy8gSW4gdGhpcyBjYXNlcywgd2Ugc2tpcCBlbmNvZGluZyB0aGUgaW5wdXQgc3RyZWFtCisgICAgaWYgKG1EaXNhYmxlVGVzdCkgeworICAgICAgICBzdGQ6OmNvdXQgPDwgIlsgICBXQVJOICAgXSBUZXN0IERpc2FibGVkIFxuIjsKKyAgICAgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR0QoIldhaXRpbmcgZm9yIGlucHV0IGNvbnN1bXB0aW9uIik7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoCisgICAgICAgIHdhaXRPbklucHV0Q29uc3VtcHRpb24obVF1ZXVlTG9jaywgbVF1ZXVlQ29uZGl0aW9uLCBtV29ya1F1ZXVlKSk7CisKKyAgICBBU1NFUlRfRVEobUVvcywgdHJ1ZSk7CisgICAgQVNTRVJUX0VRKG1Db21wb25lbnQtPnN0b3AoKSwgQzJfT0spOworICAgIEFTU0VSVF9FUShtQ29tcG9uZW50LT5yZXNldCgpLCBDMl9PSyk7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKE5vblN0ZFNpemVzLCBDb2RlYzJWaWRlb0VuY1Jlc29sdXRpb25UZXN0LCA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICBzdGQ6Om1ha2VfcGFpcig1MiwgMTgpLAorICAgIHN0ZDo6bWFrZV9wYWlyKDM2NSwgMzY1KSwKKyAgICBzdGQ6Om1ha2VfcGFpcig0ODQsIDM2MiksCisgICAgc3RkOjptYWtlX3BhaXIoMjQ0LCA0ODgpKSk7CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgICAgZ0VudiA9IG5ldyBDb21wb25lbnRUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBnRW52LT5pbml0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBMT0coSU5GTykgPDwgIkMyIFRlc3QgcmVzdWx0ID0gIiA8PCBzdGF0dXM7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC8xLjAvdnRzL2Z1bmN0aW9uYWwvdmlkZW8vbWVkaWFfYzJfdmlkZW9faGlkbF90ZXN0X2NvbW1vbi5oIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL21lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzdjYTM4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvMS4wL3Z0cy9mdW5jdGlvbmFsL3ZpZGVvL21lZGlhX2MyX3ZpZGVvX2hpZGxfdGVzdF9jb21tb24uaApAQCAtMCwwICsxLDMzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9DMl9WSURFT19ISURMX1RFU1RfQ09NTU9OX0gKKyNkZWZpbmUgTUVESUFfQzJfVklERU9fSElETF9URVNUX0NPTU1PTl9ICisKKyNkZWZpbmUgRU5DT0RFUl9USU1FU1RBTVBfSU5DUkVNRU5UIDQwMDAwCisjZGVmaW5lIEVOQ19OVU1fRlJBTUVTIDMyCisjZGVmaW5lIEVOQ19ERUZBVUxUX0ZSQU1FX1dJRFRIIDM1MgorI2RlZmluZSBFTkNfREVGQVVMVF9GUkFNRV9IRUlHSFQgMjg4CisjZGVmaW5lIE1BWF9JVEVSQVRJT05TIDEyOAorCisjZGVmaW5lIEFMSUdOKF9zeiwgX2FsaWduKSAoKF9zeiArIChfYWxpZ24gLSAxKSkgJiB+KF9hbGlnbiAtIDEpKQorCisvKgorICogQ29tbW9uIHZpZGVvIHV0aWxzCisgKi8KKworCisjZW5kaWYgIC8vIE1FRElBX0MyX1ZJREVPX0hJRExfVEVTVF9DT01NT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWMxYzRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzNyBAQAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmNvZGVjMl9jbGllbnQiLAorCisgICAgc3JjczogWworICAgICAgICAiY2xpZW50LmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmJ1ZmZlcnBvb2xAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfaGlkbF9jbGllbnRAMS4wIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wLjEiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl9oaWRsX2NsaWVudEAxLjAiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgIF0sCisKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2NsaWVudC5jcHAgYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvY2xpZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzQ3MTkwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2NsaWVudC5jcHAKQEAgLTAsMCArMSwxNDQ0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMkNsaWVudCIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisKKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMi4wL0IySEdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8yLjAvSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQ2xpZW50TWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvYzIvMS4wL0lDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL21lZGlhL2MyLzEuMC9JQ29tcG9uZW50SW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudExpc3RlbmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudFN0b3JlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbmZpZ3VyYWJsZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tYW5hZ2VyLzEuMi9JU2VydmljZU1hbmFnZXIuaD4KKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6dXRpbHM7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOworCit1c2luZyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6CisgICAgICAgIFYxXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6CisgICAgICAgIFYyXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBCMkhHcmFwaGljQnVmZmVyUHJvZHVjZXIyID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjoKKyAgICAgICAgVjJfMDo6dXRpbHM6OkIySEdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIEgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjIgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OgorICAgICAgICBWMl8wOjp1dGlsczo6SDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKKy8vIGMyX3N0YXR1c190IHZhbHVlIHRoYXQgY29ycmVzcG9uZHMgdG8gaHdiaW5kZXIgdHJhbnNhY3Rpb24gZmFpbHVyZS4KK2NvbnN0ZXhwciBjMl9zdGF0dXNfdCBDMl9UUkFOU0FDVElPTl9GQUlMRUQgPSBDMl9DT1JSVVBURUQ7CisKKy8vIFNlYXJjaGVzIGZvciBhIG5hbWUgaW4gR2V0U2VydmljZU5hbWVzKCkgYW5kIHJldHVybnMgdGhlIGluZGV4IGZvdW5kLiBJZiB0aGUKKy8vIG5hbWUgaXMgbm90IGZvdW5kLCB0aGUgcmV0dXJuZWQgaW5kZXggd2lsbCBiZSBlcXVhbCB0bworLy8gR2V0U2VydmljZU5hbWVzKCkuc2l6ZSgpLgorc2l6ZV90IGdldFNlcnZpY2VJbmRleChjaGFyIGNvbnN0KiBuYW1lKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbnN0JiBuYW1lcyA9IENvZGVjMkNsaWVudDo6R2V0U2VydmljZU5hbWVzKCk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoOyBpIDwgbmFtZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKG5hbWUgPT0gbmFtZXNbaV0pIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpOworfQorCit9ICAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCisvLyBUaGlzIGNsYXNzIGNhY2hlcyBhIENvZGVjMkNsaWVudCBvYmplY3QgYW5kIGl0cyBjb21wb25lbnQgdHJhaXRzLiBUaGUgY2xpZW50CisvLyB3aWxsIGJlIGNyZWF0ZWQgdGhlIGZpcnN0IHRpbWUgaXQgaXMgbmVlZGVkLCBhbmQgaXQgY2FuIGJlIHJlZnJlc2hlZCBpZiB0aGUKKy8vIHNlcnZpY2UgZGllcyAoYnkgY2FsbGluZyBpbnZhbGlkYXRlKCkpLiBUaGUgZmlyc3QgdGltZSBsaXN0Q29tcG9uZW50cygpIGlzCisvLyBjYWxsZWQgZnJvbSB0aGUgY2xpZW50LCB0aGUgcmVzdWx0IHdpbGwgYmUgY2FjaGVkLgorY2xhc3MgQ29kZWMyQ2xpZW50OjpDYWNoZSB7CisgICAgLy8gQ2FjaGVkIGNsaWVudAorICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IG1DbGllbnQ7CisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1DbGllbnRNdXRleDsKKworICAgIC8vIENhY2hlZCBjb21wb25lbnQgdHJhaXRzCisgICAgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gbVRyYWl0czsKKyAgICBzdGQ6Om9uY2VfZmxhZyBtVHJhaXRzSW5pdGlhbGl6YXRpb25GbGFnOworCisgICAgLy8gVGhlIGluZGV4IG9mIHRoZSBzZXJ2aWNlLiBUaGlzIGlzIGJhc2VkIG9uIEdldFNlcnZpY2VOYW1lcygpLgorICAgIHNpemVfdCBtSW5kZXg7CisgICAgLy8gQ2FsbGVkIGJ5IHMoKSBleGFjdGx5IG9uY2UgdG8gaW5pdGlhbGl6ZSB0aGUgY2FjaGUuIFRoZSBpbmRleCBtdXN0IGJlIGEKKyAgICAvLyB2YWxpZCBpbmRleCBpbnRvIHRoZSB2ZWN0b3IgcmV0dXJuZWQgYnkgR2V0U2VydmljZU5hbWVzKCkuIENhbGxpbmcKKyAgICAvLyBpbml0KGluZGV4KSB3aWxsIGFzc29jaWF0ZSB0aGUgY2FjaGUgdG8gdGhlIHNlcnZpY2Ugd2l0aCBuYW1lCisgICAgLy8gR2V0U2VydmljZU5hbWVzKClbaW5kZXhdLgorICAgIHZvaWQgaW5pdChzaXplX3QgaW5kZXgpIHsKKyAgICAgICAgbUluZGV4ID0gaW5kZXg7CisgICAgfQorCitwdWJsaWM6CisgICAgQ2FjaGUoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBJbml0aWFsaXplcyBtQ2xpZW50IGlmIG5lZWRlZCwgdGhlbiByZXR1cm5zIG1DbGllbnQuCisgICAgLy8gSWYgdGhlIHNlcnZpY2UgaXMgdW5hdmFpbGFibGUgYnV0IGxpc3RlZCBpbiB0aGUgbWFuaWZlc3QsIHRoaXMgZnVuY3Rpb24KKyAgICAvLyB3aWxsIGJsb2NrIGluZGVmaW5pdGVseS4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBnZXRDbGllbnQoKSB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2sgbG9ja3ttQ2xpZW50TXV0ZXh9OworICAgICAgICBpZiAoIW1DbGllbnQpIHsKKyAgICAgICAgICAgIG1DbGllbnQgPSBDb2RlYzJDbGllbnQ6Ol9DcmVhdGVGcm9tSW5kZXgobUluZGV4KTsKKyAgICAgICAgfQorICAgICAgICBDSEVDSyhtQ2xpZW50KSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBDb2RlYzJDbGllbnQgdG8gc2VydmljZSBcIiIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgR2V0U2VydmljZU5hbWVzKClbbUluZGV4XSA8PCAiXCIuIChJbmRleCA9ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgbUluZGV4IDw8ICIpLiI7CisgICAgICAgIHJldHVybiBtQ2xpZW50OworICAgIH0KKworICAgIC8vIENhdXNlcyBhIHN1YnNlcXVlbnQgY2FsbCB0byBnZXRDbGllbnQoKSB0byBjcmVhdGUgYSBuZXcgY2xpZW50LiBUaGlzCisgICAgLy8gZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciB0aGUgc2VydmljZSBkaWVzLgorICAgIC8vCisgICAgLy8gTm90ZTogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb25seSBieSBGb3JBbGxTZXJ2aWNlcygpLgorICAgIHZvaWQgaW52YWxpZGF0ZSgpIHsKKyAgICAgICAgc3RkOjpzY29wZWRfbG9jayBsb2Nre21DbGllbnRNdXRleH07CisgICAgICAgIG1DbGllbnQgPSBudWxscHRyOworICAgIH0KKworICAgIC8vIFJldHVybnMgYSBsaXN0IG9mIHRyYWl0cyBmb3IgY29tcG9uZW50cyBzdXBwb3J0ZWQgYnkgdGhlIHNlcnZpY2UuIFRoaXMKKyAgICAvLyBsaXN0IGlzIGNhY2hlZC4KKyAgICBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiBjb25zdCYgZ2V0VHJhaXRzKCkgeworICAgICAgICBzdGQ6OmNhbGxfb25jZShtVHJhaXRzSW5pdGlhbGl6YXRpb25GbGFnLCBbdGhpc10oKSB7CisgICAgICAgICAgICBib29sIHN1Y2Nlc3N7ZmFsc2V9OworICAgICAgICAgICAgLy8gU3BpbiB1bnRpbCBfbGlzdENvbXBvbmVudHMoKSBpcyBzdWNjZXNzZnVsLgorICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBjbGllbnQgPSBnZXRDbGllbnQoKTsKKyAgICAgICAgICAgICAgICBtVHJhaXRzID0gY2xpZW50LT5fbGlzdENvbXBvbmVudHMoJnN1Y2Nlc3MpOworICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisgICAgICAgICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBhdXRvIGtTZXJ2aWNlUmV0cnlQZXJpb2QgPSA1czsKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIkZhaWxlZCB0byByZXRyaWV2ZSBjb21wb25lbnQgdHJhaXRzIGZyb20gc2VydmljZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgPDwgR2V0U2VydmljZU5hbWVzKClbbUluZGV4XSA8PCAiXCIuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlJldHJ5aW5nLi4uIjsKKyAgICAgICAgICAgICAgICBzdGQ6OnRoaXNfdGhyZWFkOjpzbGVlcF9mb3Ioa1NlcnZpY2VSZXRyeVBlcmlvZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gbVRyYWl0czsKKyAgICB9CisKKyAgICAvLyBMaXN0KCkgcmV0dXJucyB0aGUgbGlzdCBvZiBhbGwgY2FjaGVzLgorICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxDYWNoZT4mIExpc3QoKSB7CisgICAgICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxDYWNoZT4gc0NhY2hlc3tbXSgpIHsKKyAgICAgICAgICAgIHNpemVfdCBudW1TZXJ2aWNlcyA9IEdldFNlcnZpY2VOYW1lcygpLnNpemUoKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENhY2hlPiBjYWNoZXMobnVtU2VydmljZXMpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TZXJ2aWNlczsgKytpKSB7CisgICAgICAgICAgICAgICAgY2FjaGVzW2ldLmluaXQoaSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gY2FjaGVzOworICAgICAgICB9KCl9OworICAgICAgICByZXR1cm4gc0NhY2hlczsKKyAgICB9Cit9OworCisvLyBDb2RlYzJDb25maWd1cmFibGVDbGllbnQKKworY29uc3QgQzJTdHJpbmcmIENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6Z2V0TmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbU5hbWU7Cit9CisKK0NvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6Q29kZWMyQ29uZmlndXJhYmxlQ2xpZW50KAorICAgICAgICBjb25zdCBzcDxJQ29uZmlndXJhYmxlPiYgYmFzZSkKKyAgICAgIDogbUJhc2V7YmFzZX0sCisgICAgICAgIG1OYW1le1tiYXNlXSgpIC0+IEMyU3RyaW5nIHsKKyAgICAgICAgICAgICAgICBDMlN0cmluZyBvdXROYW1lOworICAgICAgICAgICAgICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IGJhc2UtPmdldE5hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICBbJm91dE5hbWVdKGNvbnN0IGhpZGxfc3RyaW5nJiBuYW1lKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0TmFtZSA9IG5hbWUuY19zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1N0YXR1cy5pc09rKCkgPyBvdXROYW1lIDogIiI7CisgICAgICAgICAgICB9KCl9IHsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpxdWVyeSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCB7CisgICAgaGlkbF92ZWM8UGFyYW1JbmRleD4gaW5kaWNlcygKKyAgICAgICAgICAgIHN0YWNrUGFyYW1zLnNpemUoKSArIGhlYXBQYXJhbUluZGljZXMuc2l6ZSgpKTsKKyAgICBzaXplX3QgbnVtSW5kaWNlcyA9IDA7CisgICAgZm9yIChDMlBhcmFtKiBjb25zdCYgc3RhY2tQYXJhbSA6IHN0YWNrUGFyYW1zKSB7CisgICAgICAgIGlmICghc3RhY2tQYXJhbSkgeworICAgICAgICAgICAgTE9HKFdBUk5JTkcpIDw8ICJxdWVyeSAtLSBudWxsIHN0YWNrIHBhcmFtIGVuY291bnRlcmVkLiI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbmRpY2VzW251bUluZGljZXMrK10gPSBzdGF0aWNfY2FzdDxQYXJhbUluZGV4PihzdGFja1BhcmFtLT5pbmRleCgpKTsKKyAgICB9CisgICAgc2l6ZV90IG51bVN0YWNrSW5kaWNlcyA9IG51bUluZGljZXM7CisgICAgZm9yIChjb25zdCBDMlBhcmFtOjpJbmRleCYgaW5kZXggOiBoZWFwUGFyYW1JbmRpY2VzKSB7CisgICAgICAgIGluZGljZXNbbnVtSW5kaWNlcysrXSA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8UGFyYW1JbmRleD4oc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGluZGV4KSk7CisgICAgfQorICAgIGluZGljZXMucmVzaXplKG51bUluZGljZXMpOworICAgIGlmIChoZWFwUGFyYW1zKSB7CisgICAgICAgIGhlYXBQYXJhbXMtPnJlc2VydmUoaGVhcFBhcmFtcy0+c2l6ZSgpICsgbnVtSW5kaWNlcyk7CisgICAgfQorICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+cXVlcnkoCisgICAgICAgICAgICBpbmRpY2VzLAorICAgICAgICAgICAgbWF5QmxvY2sgPT0gQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgWyZzdGF0dXMsICZudW1TdGFja0luZGljZXMsICZzdGFja1BhcmFtcywgaGVhcFBhcmFtc10oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLCBjb25zdCBQYXJhbXMmIHApIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSyAmJiBzdGF0dXMgIT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXJ5IC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1Qb2ludGVyczsKKyAgICAgICAgICAgICAgICBpZiAoIXBhcnNlUGFyYW1zQmxvYigmcGFyYW1Qb2ludGVycywgcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnkgLS0gZXJyb3Igd2hpbGUgcGFyc2luZyBwYXJhbXMuIjsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBwYXJhbVBvaW50ZXJzLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBwYXJhbVBvaW50ZXJzLmVuZCgpOyApIHsKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbSogcGFyYW1Qb2ludGVyID0gKml0OworICAgICAgICAgICAgICAgICAgICBpZiAobnVtU3RhY2tJbmRpY2VzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLS1udW1TdGFja0luZGljZXM7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcmFtUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnkgLS0gbnVsbCBzdGFjayBwYXJhbS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKDsgaSA8IHN0YWNrUGFyYW1zLnNpemUoKSAmJiAhc3RhY2tQYXJhbXNbaV07ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpID49IHN0YWNrUGFyYW1zLnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5IC0tIHVuZXhwZWN0ZWQgZXJyb3IuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YWNrUGFyYW1zW2ldLT5pbmRleCgpICE9IHBhcmFtUG9pbnRlci0+aW5kZXgoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAicXVlcnkgLS0gcGFyYW0gc2tpcHBlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5kZXggPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YWNrUGFyYW1zW2ldLT5pbmRleCgpIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFja1BhcmFtc1tpKytdLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0YWNrUGFyYW1zW2krK10tPnVwZGF0ZUZyb20oKnBhcmFtUG9pbnRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXJ5IC0tIHBhcmFtIHVwZGF0ZSBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluZGV4ID0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBwYXJhbVBvaW50ZXItPmluZGV4KCkgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJhbVBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXJ5IC0tIG51bGwgaGVhcCBwYXJhbS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYXBQYXJhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT0coV0FSTklORykgPDwgInF1ZXJ5IC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInVuZXhwZWN0ZWQgZXh0cmEgc3RhY2sgcGFyYW0uIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhcFBhcmFtcy0+ZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29weSgqcGFyYW1Qb2ludGVyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKytpdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50Ojpjb25maWcoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLAorICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSB7CisgICAgUGFyYW1zIGhpZGxQYXJhbXM7CisgICAgaWYgKCFjcmVhdGVQYXJhbXNCbG9iKCZoaWRsUGFyYW1zLCBwYXJhbXMpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNvbmZpZyAtLSBiYWQgaW5wdXQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jb25maWcoCisgICAgICAgICAgICBoaWRsUGFyYW1zLAorICAgICAgICAgICAgbWF5QmxvY2sgPT0gQzJfTUFZX0JMT0NLLAorICAgICAgICAgICAgWyZzdGF0dXMsICZwYXJhbXMsIGZhaWx1cmVzXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFNldHRpbmdSZXN1bHQ+IGYsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmFtcyYgbykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LICYmIHN0YXR1cyAhPSBDMl9CQURfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiY29uZmlnIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2l6ZV90IGkgPSBmYWlsdXJlcy0+c2l6ZSgpOworICAgICAgICAgICAgICAgIGZhaWx1cmVzLT5yZXNpemUoaSArIGYuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFNldHRpbmdSZXN1bHQmIHNmIDogZikgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmKCpmYWlsdXJlcylbaSsrXSwgc2YpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJjb25maWcgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiaW52YWxpZCBTZXR0aW5nUmVzdWx0IHJldHVybmVkLiI7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCF1cGRhdGVQYXJhbXNGcm9tQmxvYihwYXJhbXMsIG8pKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgImNvbmZpZyAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgImZhaWxlZCB0byBwYXJzZSByZXR1cm5lZCBwYXJhbXMuIjsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNvbmZpZyAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ29uZmlndXJhYmxlQ2xpZW50OjpxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcykgY29uc3QgeworICAgIC8vIFRPRE86IENhY2hlIGFuZCBxdWVyeSBwcm9wZXJseSEKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1pbigpLAorICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpLAorICAgICAgICAgICAgWyZzdGF0dXMsIHBhcmFtc10oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxQYXJhbURlc2NyaXB0b3I+JiBwKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnlTdXBwb3J0ZWRQYXJhbXMgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNpemVfdCBpID0gcGFyYW1zLT5zaXplKCk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5yZXNpemUoaSArIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IFBhcmFtRGVzY3JpcHRvciYgc3AgOiBwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KCYoKnBhcmFtcylbaSsrXSwgc3ApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMT0coRVJST1IpIDw8ICJxdWVyeVN1cHBvcnRlZFBhcmFtcyAtLSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJpbnZhbGlkIHJldHVybmVkIFBhcmFtRGVzY3JpcHRvci4iOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnlTdXBwb3J0ZWRQYXJhbXMgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudDo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4mIGZpZWxkcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3QgeworICAgIGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IGluRmllbGRzKGZpZWxkcy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghb2JqY3B5KCZpbkZpZWxkc1tpXSwgZmllbGRzW2ldKSkgeworICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gYmFkIGlucHV0IjsKKyAgICAgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgaW5GaWVsZHMsCisgICAgICAgICAgICBtYXlCbG9jayA9PSBDMl9NQVlfQkxPQ0ssCisgICAgICAgICAgICBbJnN0YXR1cywgJmluRmllbGRzLCAmZmllbGRzXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnlSZXN1bHQ+JiByKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAicXVlcnlTdXBwb3J0ZWRWYWx1ZXMgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChyLnNpemUoKSAhPSBmaWVsZHMuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5U3VwcG9ydGVkVmFsdWVzIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW5wdXQgYW5kIG91dHB1dCBsaXN0cyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhdmUgZGlmZmVyZW50IHNpemVzLiI7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmZmllbGRzW2ldLCBpbkZpZWxkc1tpXSwgcltpXSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5U3VwcG9ydGVkVmFsdWVzIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgcmV0dXJuZWQgdmFsdWUuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXJ5U3VwcG9ydGVkVmFsdWVzIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvLyBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6SGlkbExpc3RlbmVyCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OkhpZGxMaXN0ZW5lciA6IHB1YmxpYyBJQ29tcG9uZW50TGlzdGVuZXIgeworICAgIHN0ZDo6d2Vha19wdHI8Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgc3RkOjp3ZWFrX3B0cjxMaXN0ZW5lcj4gYmFzZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uV29ya0RvbmUoY29uc3QgV29ya0J1bmRsZSYgd29ya0J1bmRsZSkgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IHdvcmtJdGVtczsKKyAgICAgICAgaWYgKCFvYmpjcHkoJndvcmtJdGVtcywgd29ya0J1bmRsZSkpIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIm9uV29ya0RvbmUgLS0gcmVjZWl2ZWQgY29ycnVwdGVkIFdvcmtCdW5kbGUuIjsKKyAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gcmVsZWFzZSBpbnB1dCBidWZmZXJzIHBvdGVudGlhbGx5IGhlbGQgYnkgdGhlIGNvbXBvbmVudCBmcm9tIHF1ZXVlCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gc3Ryb25nQ29tcG9uZW50ID0KKyAgICAgICAgICAgICAgICBjb21wb25lbnQubG9jaygpOworICAgICAgICBpZiAoc3Ryb25nQ29tcG9uZW50KSB7CisgICAgICAgICAgICBzdHJvbmdDb21wb25lbnQtPmhhbmRsZU9uV29ya0RvbmUod29ya0l0ZW1zKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6TGlzdGVuZXI+IGxpc3RlbmVyID0gYmFzZS5sb2NrKCkpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbldvcmtEb25lKGNvbXBvbmVudCwgd29ya0l0ZW1zKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIm9uV29ya0RvbmUgLS0gbGlzdGVuZXIgZGllZC4iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25UcmlwcGVkKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8U2V0dGluZ1Jlc3VsdD4mIHNldHRpbmdSZXN1bHRzKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBjMlNldHRpbmdSZXN1bHRzKAorICAgICAgICAgICAgICAgIHNldHRpbmdSZXN1bHRzLnNpemUoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2V0dGluZ1Jlc3VsdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+IGMyU2V0dGluZ1Jlc3VsdDsKKyAgICAgICAgICAgIGlmICghb2JqY3B5KCZjMlNldHRpbmdSZXN1bHQsIHNldHRpbmdSZXN1bHRzW2ldKSkgeworICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgIm9uVHJpcHBlZCAtLSByZWNlaXZlZCBjb3JydXB0ZWQgU2V0dGluZ1Jlc3VsdC4iOworICAgICAgICAgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjMlNldHRpbmdSZXN1bHRzW2ldID0gc3RkOjptb3ZlKGMyU2V0dGluZ1Jlc3VsdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IGJhc2UubG9jaygpKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25UcmlwcGVkKGNvbXBvbmVudCwgYzJTZXR0aW5nUmVzdWx0cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJvblRyaXBwZWQgLS0gbGlzdGVuZXIgZGllZC4iOworICAgICAgICB9CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gb25FcnJvcihTdGF0dXMgcywgdWludDMyX3QgZXJyb3JDb2RlKSBvdmVycmlkZSB7CisgICAgICAgIExPRyhERUJVRykgPDwgIm9uRXJyb3IgLS0iCisgICAgICAgICAgICAgICAgICAgPDwgIiBzdGF0dXMgPSAiIDw8IHMKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBlcnJvckNvZGUgPSAiIDw8IGVycm9yQ29kZQorICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gbGlzdGVuZXIgPSBiYXNlLmxvY2soKSkgeworICAgICAgICAgICAgbGlzdGVuZXItPm9uRXJyb3IoY29tcG9uZW50LCBzID09IFN0YXR1czo6T0sgPworICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUgOiBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocykpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25FcnJvciAtLSBsaXN0ZW5lciBkaWVkLiI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBvbkZyYW1lc1JlbmRlcmVkKAorICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8UmVuZGVyZWRGcmFtZT4mIHJlbmRlcmVkRnJhbWVzKSBvdmVycmlkZSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gbGlzdGVuZXIgPSBiYXNlLmxvY2soKTsKKyAgICAgICAgaWYgKCFsaXN0ZW5lcikgeworICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25GcmFtZXNSZW5kZXJlZCAtLSBsaXN0ZW5lciBkaWVkLiI7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgUmVuZGVyZWRGcmFtZSYgcmVuZGVyZWRGcmFtZSA6IHJlbmRlcmVkRnJhbWVzKSB7CisgICAgICAgICAgICBsaXN0ZW5lci0+b25GcmFtZVJlbmRlcmVkKAorICAgICAgICAgICAgICAgICAgICByZW5kZXJlZEZyYW1lLmJ1ZmZlclF1ZXVlSWQsCisgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkRnJhbWUuc2xvdElkLAorICAgICAgICAgICAgICAgICAgICByZW5kZXJlZEZyYW1lLnRpbWVzdGFtcE5zKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IG9uSW5wdXRCdWZmZXJzUmVsZWFzZWQoCisgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxJbnB1dEJ1ZmZlcj4mIGlucHV0QnVmZmVycykgb3ZlcnJpZGUgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+IGxpc3RlbmVyID0gYmFzZS5sb2NrKCk7CisgICAgICAgIGlmICghbGlzdGVuZXIpIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIm9uSW5wdXRCdWZmZXJzUmVsZWFzZWQgLS0gbGlzdGVuZXIgZGllZC4iOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IElucHV0QnVmZmVyJiBpbnB1dEJ1ZmZlciA6IGlucHV0QnVmZmVycykgeworICAgICAgICAgICAgTE9HKFZFUkJPU0UpIDw8ICJvbklucHV0QnVmZmVyc1JlbGVhc2VkIC0tIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgcmVjZWl2ZWQgZGVhdGggbm90aWZpY2F0aW9uIG9mIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgaW5wdXQgYnVmZmVyOiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZyYW1lSW5kZXggPSAiIDw8IGlucHV0QnVmZmVyLmZyYW1lSW5kZXgKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiLCBidWZmZXJJbmRleCA9ICIgPDwgaW5wdXRCdWZmZXIuYXJyYXlJbmRleAorICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIjsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbklucHV0QnVmZmVyRG9uZSgKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuZnJhbWVJbmRleCwgaW5wdXRCdWZmZXIuYXJyYXlJbmRleCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKK307CisKKy8vIENvZGVjMkNsaWVudAorQ29kZWMyQ2xpZW50OjpDb2RlYzJDbGllbnQoY29uc3Qgc3A8SUNvbXBvbmVudFN0b3JlPiYgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzZXJ2aWNlSW5kZXgpCisgICAgICA6IENvbmZpZ3VyYWJsZXsKKyAgICAgICAgICAgIFtiYXNlXSgpIC0+IHNwPElDb25maWd1cmFibGU+IHsKKyAgICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHRyYW5zUmVzdWx0KSA6CisgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyOworICAgICAgICAgICAgfSgpCisgICAgICAgIH0sCisgICAgICAgIG1CYXNle2Jhc2V9LAorICAgICAgICBtU2VydmljZUluZGV4e3NlcnZpY2VJbmRleH0geworICAgIFJldHVybjxzcDxJQ2xpZW50TWFuYWdlcj4+IHRyYW5zUmVzdWx0ID0gYmFzZS0+Z2V0UG9vbENsaWVudE1hbmFnZXIoKTsKKyAgICBpZiAoIXRyYW5zUmVzdWx0LmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJnZXRQb29sQ2xpZW50TWFuYWdlciAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICB9IGVsc2UgeworICAgICAgICBtSG9zdFBvb2xNYW5hZ2VyID0gc3RhdGljX2Nhc3Q8c3A8SUNsaWVudE1hbmFnZXI+Pih0cmFuc1Jlc3VsdCk7CisgICAgfQorfQorCitzcDxDb2RlYzJDbGllbnQ6OkJhc2U+IGNvbnN0JiBDb2RlYzJDbGllbnQ6OmdldEJhc2UoKSBjb25zdCB7CisgICAgcmV0dXJuIG1CYXNlOworfQorCitzdGQ6OnN0cmluZyBjb25zdCYgQ29kZWMyQ2xpZW50OjpnZXRTZXJ2aWNlTmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0U2VydmljZU5hbWVzKClbbVNlcnZpY2VJbmRleF07Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Y3JlYXRlQ29tcG9uZW50KAorICAgICAgICBjb25zdCBDMlN0cmluZyYgbmFtZSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6TGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiogY29uc3QgY29tcG9uZW50KSB7CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgc3A8Q29tcG9uZW50OjpIaWRsTGlzdGVuZXI+IGhpZGxMaXN0ZW5lciA9IG5ldyBDb21wb25lbnQ6OkhpZGxMaXN0ZW5lcnt9OworICAgIGhpZGxMaXN0ZW5lci0+YmFzZSA9IGxpc3RlbmVyOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgaGlkbExpc3RlbmVyLAorICAgICAgICAgICAgQ2xpZW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKSwKKyAgICAgICAgICAgIFsmc3RhdHVzLCBjb21wb25lbnQsIGhpZGxMaXN0ZW5lcl0oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50PiYgYykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmNvbXBvbmVudCA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+KGMpOworICAgICAgICAgICAgICAgIGhpZGxMaXN0ZW5lci0+Y29tcG9uZW50ID0gKmNvbXBvbmVudDsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNyZWF0ZUNvbXBvbmVudCgiIDw8IG5hbWUuY19zdHIoKQorICAgICAgICAgICAgICAgICAgIDw8ICIpIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNyZWF0ZUNvbXBvbmVudCgiIDw8IG5hbWUuY19zdHIoKQorICAgICAgICAgICAgICAgICAgIDw8ICIpIC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfSBlbHNlIGlmICghKmNvbXBvbmVudCkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVDb21wb25lbnQoIiA8PCBuYW1lLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKSAtLSBudWxsIGNvbXBvbmVudC4iOworICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgIH0KKworICAgIHN0YXR1cyA9ICgqY29tcG9uZW50KS0+c2V0RGVhdGhMaXN0ZW5lcigqY29tcG9uZW50LCBsaXN0ZW5lcik7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVDb21wb25lbnQoIiA8PCBuYW1lLmNfc3RyKCkKKyAgICAgICAgICAgICAgICAgICA8PCAiKSAtLSBmYWlsZWQgdG8gc2V0IHVwIGRlYXRoIGxpc3RlbmVyOiAiCisgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisKKyAgICAoKmNvbXBvbmVudCktPm1CdWZmZXJQb29sU2VuZGVyLnNldFJlY2VpdmVyKG1Ib3N0UG9vbE1hbmFnZXIpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Y3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjb25zdCBDMlN0cmluZyYgbmFtZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW50ZXJmYWNlPiogY29uc3QgaW50ZXJmYWNlKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgWyZzdGF0dXMsIGludGVyZmFjZV0oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ29tcG9uZW50SW50ZXJmYWNlPiYgaSkgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKmludGVyZmFjZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW50ZXJmYWNlPihpKTsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNyZWF0ZUludGVyZmFjZSgiIDw8IG5hbWUuY19zdHIoKQorICAgICAgICAgICAgICAgICAgIDw8ICIpIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNyZWF0ZUNvbXBvbmVudCgiIDw8IG5hbWUuY19zdHIoKQorICAgICAgICAgICAgICAgICAgIDw8ICIpIC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpjcmVhdGVJbnB1dFN1cmZhY2UoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U+KiBjb25zdCBpbnB1dFN1cmZhY2UpIHsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmNyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIFsmc3RhdHVzLCBpbnB1dFN1cmZhY2VdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUlucHV0U3VyZmFjZT4mIGkpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICppbnB1dFN1cmZhY2UgPSBzdGQ6Om1ha2Vfc2hhcmVkPElucHV0U3VyZmFjZT4oaSk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjcmVhdGVJbnB1dFN1cmZhY2UgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfSBlbHNlIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiY3JlYXRlSW5wdXRTdXJmYWNlIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gY29uc3QmIENvZGVjMkNsaWVudDo6bGlzdENvbXBvbmVudHMoKSBjb25zdCB7CisgICAgcmV0dXJuIENhY2hlOjpMaXN0KClbbVNlcnZpY2VJbmRleF0uZ2V0VHJhaXRzKCk7Cit9CisKK3N0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+IENvZGVjMkNsaWVudDo6X2xpc3RDb21wb25lbnRzKAorICAgICAgICBib29sKiBzdWNjZXNzKSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gdHJhaXRzOworICAgIHN0ZDo6c3RyaW5nIGNvbnN0JiBzZXJ2aWNlTmFtZSA9IGdldFNlcnZpY2VOYW1lKCk7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmxpc3RDb21wb25lbnRzKAorICAgICAgICAgICAgWyZ0cmFpdHMsICZzZXJ2aWNlTmFtZV0oU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgaGlkbF92ZWM8SUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRUcmFpdHM+JiB0KSB7CisgICAgICAgICAgICAgICAgaWYgKHMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJfbGlzdENvbXBvbmVudHMgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocykgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYWl0cy5yZXNpemUodC5zaXplKCkpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIW9iamNweSgmdHJhaXRzW2ldLCB0W2ldKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiX2xpc3RDb21wb25lbnRzIC0tIGNvcnJ1cHRlZCBvdXRwdXQuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0cmFpdHNbaV0ub3duZXIgPSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJfbGlzdENvbXBvbmVudHMgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgKnN1Y2Nlc3MgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gdHJhaXRzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OmNvcHlCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4mIHNyYywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiYgZHN0KSB7CisgICAgLy8gVE9ETzogSW1wbGVtZW50PworICAgICh2b2lkKXNyYzsKKyAgICAodm9pZClkc3Q7CisgICAgTE9HKEVSUk9SKSA8PCAiY29weUJ1ZmZlciBub3QgaW1wbGVtZW50ZWQiOworICAgIHJldHVybiBDMl9PTUlUVEVEOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4KKyAgICAgICAgQ29kZWMyQ2xpZW50OjpnZXRQYXJhbVJlZmxlY3RvcigpIHsKKyAgICAvLyBUT0RPOiB0aGlzIGlzIG5vdCBtZWFudCB0byBiZSBleHBvc2VkIGFzIEMyUGFyYW1SZWZsZWN0b3Igb24gdGhlIGNsaWVudCBzaWRlOyBpbnN0ZWFkLCBpdAorICAgIC8vIHNob3VsZCByZWZsZWN0IHRoZSBIQUwgQVBJLgorICAgIHN0cnVjdCBTaW1wbGVQYXJhbVJlZmxlY3RvciA6IHB1YmxpYyBDMlBhcmFtUmVmbGVjdG9yIHsKKyAgICAgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggY29yZUluZGV4KSBjb25zdCB7CisgICAgICAgICAgICBoaWRsX3ZlYzxQYXJhbUluZGV4PiBpbmRpY2VzKDEpOworICAgICAgICAgICAgaW5kaWNlc1swXSA9IHN0YXRpY19jYXN0PFBhcmFtSW5kZXg+KGNvcmVJbmRleC5jb3JlSW5kZXgoKSk7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmlwdG9yOworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmdldFN0cnVjdERlc2NyaXB0b3JzKAorICAgICAgICAgICAgICAgICAgICBpbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICBbJmRlc2NyaXB0b3JdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPFN0cnVjdERlc2NyaXB0b3I+JiBzZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgIlNpbXBsZVBhcmFtUmVmbGVjdG9yIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRTdHJ1Y3REZXNjcmlwdG9ycygpIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNkLnNpemUoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiU2ltcGxlUGFyYW1SZWZsZWN0b3IgLS0gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFN0cnVjdERlc2NyaXB0b3JzKCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJldHVybmVkIHZlY3RvciBvZiBzaXplICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IHNkLnNpemUoKSA8PCAiLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiSXQgc2hvdWxkIGJlIDEuIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFvYmpjcHkoJmRlc2NyaXB0b3IsIHNkWzBdKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPRyhERUJVRykgPDwgIlNpbXBsZVBhcmFtUmVmbGVjdG9yIC0tICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRTdHJ1Y3REZXNjcmlwdG9ycygpIHJldHVybmVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb3JydXB0ZWQgZGF0YS4iOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7CisgICAgICAgIH0KKworICAgICAgICBTaW1wbGVQYXJhbVJlZmxlY3RvcihzcDxCYXNlPiBiYXNlKQorICAgICAgICAgICAgOiBtQmFzZShiYXNlKSB7IH0KKworICAgICAgICBzcDxCYXNlPiBtQmFzZTsKKyAgICB9OworCisgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8U2ltcGxlUGFyYW1SZWZsZWN0b3I+KG1CYXNlKTsKK307CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBjb25zdCYgQ29kZWMyQ2xpZW50OjpHZXRTZXJ2aWNlTmFtZXMoKSB7CisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzU2VydmljZU5hbWVze1tdKCkgeworICAgICAgICB1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnRTdG9yZTsKKyAgICAgICAgdXNpbmcgOjphbmRyb2lkOjpoaWRsOjptYW5hZ2VyOjpWMV8yOjpJU2VydmljZU1hbmFnZXI7CisKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc2VydmljZU1hbmFnZXIgPSBJU2VydmljZU1hbmFnZXI6OmdldFNlcnZpY2UoKTsKKyAgICAgICAgICAgIENIRUNLKHNlcnZpY2VNYW5hZ2VyKSA8PCAiSGFyZHdhcmUgc2VydmljZSBtYW5hZ2VyIGlzIG5vdCBydW5uaW5nLiI7CisKKyAgICAgICAgICAgIC8vIFRoZXJlIGFyZSB0aHJlZSBjYXRlZ29yaWVzIG9mIHNlcnZpY2VzIGJhc2VkIG9uIG5hbWVzLgorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGRlZmF1bHROYW1lczsgLy8gUHJlZml4ZWQgd2l0aCAiZGVmYXVsdCIKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2ZW5kb3JOYW1lczsgIC8vIFByZWZpeGVkIHdpdGggInZlbmRvciIKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBvdGhlck5hbWVzOyAgIC8vIE90aGVycworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0OworICAgICAgICAgICAgdHJhbnNSZXN1bHQgPSBzZXJ2aWNlTWFuYWdlci0+bGlzdE1hbmlmZXN0QnlJbnRlcmZhY2UoCisgICAgICAgICAgICAgICAgICAgIElDb21wb25lbnRTdG9yZTo6ZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgWyZkZWZhdWx0TmFtZXMsICZ2ZW5kb3JOYW1lcywgJm90aGVyTmFtZXNdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBjb25zdCYgaW5zdGFuY2VOYW1lcykgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChoaWRsX3N0cmluZyBjb25zdCYgaW5zdGFuY2VOYW1lIDogaW5zdGFuY2VOYW1lcykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgY29uc3QqIG5hbWUgPSBpbnN0YW5jZU5hbWUuY19zdHIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RybmNtcChuYW1lLCAiZGVmYXVsdCIsIDcpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdE5hbWVzLmVtcGxhY2VfYmFjayhuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0cm5jbXAobmFtZSwgInZlbmRvciIsIDYpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVuZG9yTmFtZXMuZW1wbGFjZV9iYWNrKG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyTmFtZXMuZW1wbGFjZV9iYWNrKG5hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAodHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgLy8gU29ydCBzZXJ2aWNlIG5hbWVzIGluIGVhY2ggY2F0ZWdvcnkuCisgICAgICAgICAgICAgICAgc3RkOjpzb3J0KGRlZmF1bHROYW1lcy5iZWdpbigpLCBkZWZhdWx0TmFtZXMuZW5kKCkpOworICAgICAgICAgICAgICAgIHN0ZDo6c29ydCh2ZW5kb3JOYW1lcy5iZWdpbigpLCB2ZW5kb3JOYW1lcy5lbmQoKSk7CisgICAgICAgICAgICAgICAgc3RkOjpzb3J0KG90aGVyTmFtZXMuYmVnaW4oKSwgb3RoZXJOYW1lcy5lbmQoKSk7CisKKyAgICAgICAgICAgICAgICAvLyBDb25jYXRlbmF0ZSB0aGUgdGhyZWUgbGlzdHMgaW4gdGhpcyBvcmRlcjogZGVmYXVsdCwgdmVuZG9yLAorICAgICAgICAgICAgICAgIC8vIG90aGVyLgorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgbmFtZXMgPSBkZWZhdWx0TmFtZXM7CisgICAgICAgICAgICAgICAgbmFtZXMucmVzZXJ2ZShuYW1lcy5zaXplKCkgKyB2ZW5kb3JOYW1lcy5zaXplKCkgKyBvdGhlck5hbWVzLnNpemUoKSk7CisgICAgICAgICAgICAgICAgbmFtZXMuaW5zZXJ0KG5hbWVzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcih2ZW5kb3JOYW1lcy5iZWdpbigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX21vdmVfaXRlcmF0b3IodmVuZG9yTmFtZXMuZW5kKCkpKTsKKyAgICAgICAgICAgICAgICBuYW1lcy5pbnNlcnQobmFtZXMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKG90aGVyTmFtZXMuYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKG90aGVyTmFtZXMuZW5kKCkpKTsKKworICAgICAgICAgICAgICAgIC8vIFN1bW1hcml6ZSB0byBsb2djYXQuCisgICAgICAgICAgICAgICAgaWYgKG5hbWVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJObyBDb2RlYzIgc2VydmljZXMgZGVjbGFyZWQgaW4gdGhlIG1hbmlmZXN0LiI7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3RyaW5nT3V0cHV0OworICAgICAgICAgICAgICAgICAgICBzdHJpbmdPdXRwdXQgPDwgIkF2YWlsYWJsZSBDb2RlYzIgc2VydmljZXM6IjsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSA6IG5hbWVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdPdXRwdXQgPDwgIiBcIiIgPDwgbmFtZSA8PCAiXCIiOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIExPRyhJTkZPKSA8PCBzdHJpbmdPdXRwdXQuc3RyKCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ291bGQgbm90IHJldHJpZXZlIHRoZSBsaXN0IG9mIHNlcnZpY2UgaW5zdGFuY2VzIG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgSUNvbXBvbmVudFN0b3JlOjpkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICIuIFJldHJ5aW5nLi4uIjsKKyAgICAgICAgfQorICAgIH0oKX07CisgICAgcmV0dXJuIHNTZXJ2aWNlTmFtZXM7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IENvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbVNlcnZpY2UoCisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgICBzaXplX3QgaW5kZXggPSBnZXRTZXJ2aWNlSW5kZXgobmFtZSk7CisgICAgcmV0dXJuIGluZGV4ID09IEdldFNlcnZpY2VOYW1lcygpLnNpemUoKSA/CisgICAgICAgICAgICBudWxscHRyIDogX0NyZWF0ZUZyb21JbmRleChpbmRleCk7Cit9CisKK3N0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+PiBDb2RlYzJDbGllbnQ6OgorICAgICAgICBDcmVhdGVGcm9tQWxsU2VydmljZXMoKSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4+IGNsaWVudHMoCisgICAgICAgICAgICBHZXRTZXJ2aWNlTmFtZXMoKS5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSBHZXRTZXJ2aWNlTmFtZXMoKS5zaXplKCk7IGkgPiAwOyApIHsKKyAgICAgICAgLS1pOworICAgICAgICBjbGllbnRzW2ldID0gX0NyZWF0ZUZyb21JbmRleChpKTsKKyAgICB9CisgICAgcmV0dXJuIGNsaWVudHM7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IENvZGVjMkNsaWVudDo6X0NyZWF0ZUZyb21JbmRleChzaXplX3QgaW5kZXgpIHsKKyAgICBzdGQ6OnN0cmluZyBjb25zdCYgbmFtZSA9IEdldFNlcnZpY2VOYW1lcygpW2luZGV4XTsKKyAgICBMT0coSU5GTykgPDwgIkNyZWF0aW5nIGEgQ29kZWMyIGNsaWVudCB0byBzZXJ2aWNlIFwiIiA8PCBuYW1lIDw8ICJcIiI7CisgICAgc3A8QmFzZT4gYmFzZVN0b3JlID0gQmFzZTo6Z2V0U2VydmljZShuYW1lKTsKKyAgICBDSEVDSyhiYXNlU3RvcmUpIDw8ICJDb2RlYzIgc2VydmljZSBcIiIgPDwgbmFtZSA8PCAiXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGluYWNjZXNzaWJsZSBmb3IgdW5rbm93biByZWFzb25zLiI7CisgICAgTE9HKElORk8pIDw8ICJDbGllbnQgdG8gQ29kZWMyIHNlcnZpY2UgXCIiIDw8IG5hbWUgPDwgIlwiIGNyZWF0ZWQiOworICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudD4oYmFzZVN0b3JlLCBpbmRleCk7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Rm9yQWxsU2VydmljZXMoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZrZXksCisgICAgICAgIHNpemVfdCBudW1iZXJPZkF0dGVtcHRzLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+Jik+CisgICAgICAgICAgICBwcmVkaWNhdGUpIHsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBDMl9OT19JTklUOyAgLy8gbm8gSUNvbXBvbmVudFN0b3JlcyBwcmVzZW50CisKKyAgICAvLyBDYWNoZSB0aGUgbWFwcGluZyBrZXkgLT4gaW5kZXggb2YgQ29kZWMyQ2xpZW50IGluIENhY2hlOjpMaXN0KCkuCisgICAgc3RhdGljIHN0ZDo6bXV0ZXgga2V5MkluZGV4TXV0ZXg7CisgICAgc3RhdGljIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzaXplX3Q+IGtleTJJbmRleDsKKworICAgIC8vIEJ5IGRlZmF1bHQgdHJ5IGFsbCBzdG9yZXMuIEhvd2V2ZXIsIHRyeSB0aGUgbGFzdCBrbm93biBjbGllbnQgZmlyc3QuIElmCisgICAgLy8gdGhlIGxhc3Qga25vd24gY2xpZW50IGZhaWxzLCByZXRyeSBvbmNlLiBXZSBkbyB0aGlzIGJ5IHB1c2hpbmcgdGhlIGxhc3QKKyAgICAvLyBrbm93biBjbGllbnQgaW4gZnJvbnQgb2YgdGhlIGxpc3Qgb2YgYWxsIGNsaWVudHMuCisgICAgc3RkOjpkZXF1ZTxzaXplX3Q+IGluZGljZXM7CisgICAgZm9yIChzaXplX3QgaW5kZXggPSBDYWNoZTo6TGlzdCgpLnNpemUoKTsgaW5kZXggPiAwOyApIHsKKyAgICAgICAgaW5kaWNlcy5wdXNoX2Zyb250KC0taW5kZXgpOworICAgIH0KKworICAgIGJvb2wgd2FzTWFwcGVkID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7a2V5MkluZGV4TXV0ZXh9OworICAgICAgICBhdXRvIGl0ID0ga2V5MkluZGV4LmZpbmQoa2V5KTsKKyAgICAgICAgaWYgKGl0ICE9IGtleTJJbmRleC5lbmQoKSkgeworICAgICAgICAgICAgaW5kaWNlcy5wdXNoX2Zyb250KGl0LT5zZWNvbmQpOworICAgICAgICAgICAgd2FzTWFwcGVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoc2l6ZV90IGluZGV4IDogaW5kaWNlcykgeworICAgICAgICBDYWNoZSYgY2FjaGUgPSBDYWNoZTo6TGlzdCgpW2luZGV4XTsKKyAgICAgICAgZm9yIChzaXplX3QgdHJpZXMgPSBudW1iZXJPZkF0dGVtcHRzOyB0cmllcyA+IDA7IC0tdHJpZXMpIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGNsaWVudHtjYWNoZS5nZXRDbGllbnQoKX07CisgICAgICAgICAgICBzdGF0dXMgPSBwcmVkaWNhdGUoY2xpZW50KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrIGxvY2t7a2V5MkluZGV4TXV0ZXh9OworICAgICAgICAgICAgICAgIGtleTJJbmRleFtrZXldID0gaW5kZXg7IC8vIHVwZGF0ZSBsYXN0IGtub3duIGNsaWVudCBpbmRleAorICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzID09IEMyX1RSQU5TQUNUSU9OX0ZBSUxFRCkgeworICAgICAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiXCIiIDw8IGtleSA8PCAiXCIgZmFpbGVkIGZvciBzZXJ2aWNlIFwiIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBjbGllbnQtPmdldE5hbWUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXCIgZHVlIHRvIHRyYW5zYWN0aW9uIGZhaWx1cmUuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIihTZXJ2aWNlIG1heSBoYXZlIGNyYXNoZWQuKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKHRyaWVzID4gMSA/ICIgUmV0cnlpbmcuLi4iIDogIiIpOworICAgICAgICAgICAgICAgIGNhY2hlLmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh3YXNNYXBwZWQpIHsKKyAgICAgICAgICAgICAgICBMT0coSU5GTykgPDwgIlwiIiA8PCBrZXkgPDwgIlwiIGJlY2FtZSBpbnZhbGlkIGluIHNlcnZpY2UgXCIiCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGNsaWVudC0+Z2V0TmFtZSgpIDw8ICJcIi4gUmV0cnlpbmcuLi4iOworICAgICAgICAgICAgICAgIHdhc01hcHBlZCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsgLy8gcmV0dXJuIHRoZSBsYXN0IHN0YXR1cyBmcm9tIGEgdmFsaWQgY2xpZW50Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4KKyAgICAgICAgQ29kZWMyQ2xpZW50OjpDcmVhdGVDb21wb25lbnRCeU5hbWUoCisgICAgICAgIGNvbnN0IGNoYXIqIGNvbXBvbmVudE5hbWUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Piogb3duZXIsCisgICAgICAgIHNpemVfdCBudW1iZXJPZkF0dGVtcHRzKSB7CisgICAgc3RkOjpzdHJpbmcga2V5eyJjcmVhdGU6In07CisgICAga2V5LmFwcGVuZChjb21wb25lbnROYW1lKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiBjb21wb25lbnQ7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gRm9yQWxsU2VydmljZXMoCisgICAgICAgICAgICBrZXksCisgICAgICAgICAgICBudW1iZXJPZkF0dGVtcHRzLAorICAgICAgICAgICAgW293bmVyLCAmY29tcG9uZW50LCBjb21wb25lbnROYW1lLCAmbGlzdGVuZXJdKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiAmY2xpZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgLT4gYzJfc3RhdHVzX3QgeworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGNsaWVudC0+Y3JlYXRlQ29tcG9uZW50KGNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbXBvbmVudCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBpZiAob3duZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpvd25lciA9IGNsaWVudDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IEMyX05PVF9GT1VORCkgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJJQ29tcG9uZW50U3RvcmUoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBjbGllbnQtPmdldFNlcnZpY2VOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTo6Y3JlYXRlQ29tcG9uZW50KFwiIiA8PCBjb21wb25lbnROYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiKSByZXR1cm5lZCBzdGF0dXMgPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBjb21wb25lbnQgXCIiIDw8IGNvbXBvbmVudE5hbWUKKyAgICAgICAgICAgICAgICAgICA8PCAiXCIgZnJvbSBhbGwga25vd24gc2VydmljZXMuICIKKyAgICAgICAgICAgICAgICAgICAgICAiTGFzdCByZXR1cm5lZCBzdGF0dXMgPSAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBjb21wb25lbnQ7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkludGVyZmFjZT4KKyAgICAgICAgQ29kZWMyQ2xpZW50OjpDcmVhdGVJbnRlcmZhY2VCeU5hbWUoCisgICAgICAgIGNvbnN0IGNoYXIqIGludGVyZmFjZU5hbWUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+KiBvd25lciwKKyAgICAgICAgc2l6ZV90IG51bWJlck9mQXR0ZW1wdHMpIHsKKyAgICBzdGQ6OnN0cmluZyBrZXl7ImNyZWF0ZToifTsKKyAgICBrZXkuYXBwZW5kKGludGVyZmFjZU5hbWUpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnRlcmZhY2U+IGludGVyZmFjZTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBGb3JBbGxTZXJ2aWNlcygKKyAgICAgICAgICAgIGtleSwKKyAgICAgICAgICAgIG51bWJlck9mQXR0ZW1wdHMsCisgICAgICAgICAgICBbb3duZXIsICZpbnRlcmZhY2UsIGludGVyZmFjZU5hbWVdKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiAmY2xpZW50KQorICAgICAgICAgICAgICAgICAgICAgICAgLT4gYzJfc3RhdHVzX3QgeworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IHN0YXR1cyA9IGNsaWVudC0+Y3JlYXRlSW50ZXJmYWNlKGludGVyZmFjZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmludGVyZmFjZSk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBpZiAob3duZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpvd25lciA9IGNsaWVudDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IEMyX05PVF9GT1VORCkgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJJQ29tcG9uZW50U3RvcmUoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBjbGllbnQtPmdldFNlcnZpY2VOYW1lKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKTo6Y3JlYXRlSW50ZXJmYWNlKFwiIiA8PCBpbnRlcmZhY2VOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIlwiKSByZXR1cm5lZCBzdGF0dXMgPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0pOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBpbnRlcmZhY2UgXCIiIDw8IGludGVyZmFjZU5hbWUKKyAgICAgICAgICAgICAgICAgICA8PCAiXCIgZnJvbSBhbGwga25vd24gc2VydmljZXMuICIKKyAgICAgICAgICAgICAgICAgICAgICAiTGFzdCByZXR1cm5lZCBzdGF0dXMgPSAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBpbnRlcmZhY2U7Cit9CisKK3N0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+IGNvbnN0JiBDb2RlYzJDbGllbnQ6Okxpc3RDb21wb25lbnRzKCkgeworICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiBzTGlzdHtbXSgpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gbGlzdDsKKyAgICAgICAgZm9yIChDYWNoZSYgY2FjaGUgOiBDYWNoZTo6TGlzdCgpKSB7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkNvbXBvbmVudDo6VHJhaXRzPiBjb25zdCYgdHJhaXRzID0gY2FjaGUuZ2V0VHJhaXRzKCk7CisgICAgICAgICAgICBsaXN0Lmluc2VydChsaXN0LmVuZCgpLCB0cmFpdHMuYmVnaW4oKSwgdHJhaXRzLmVuZCgpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbGlzdDsKKyAgICB9KCl9OworICAgIHJldHVybiBzTGlzdDsKK30KKworc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPiBDb2RlYzJDbGllbnQ6OkNyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgY2hhciBjb25zdCogc2VydmljZU5hbWUpIHsKKyAgICBpbnQzMl90IGlucHV0U3VyZmFjZVNldHRpbmcgPSA6OmFuZHJvaWQ6OmJhc2U6OkdldEludFByb3BlcnR5KAorICAgICAgICAgICAgImRlYnVnLnN0YWdlZnJpZ2h0LmMyaW5wdXRzdXJmYWNlIiwgaW50MzJfdCgwKSk7CisgICAgaWYgKGlucHV0U3VyZmFjZVNldHRpbmcgPD0gMCkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc2l6ZV90IGluZGV4ID0gR2V0U2VydmljZU5hbWVzKCkuc2l6ZSgpOworICAgIGlmIChzZXJ2aWNlTmFtZSkgeworICAgICAgICBpbmRleCA9IGdldFNlcnZpY2VJbmRleChzZXJ2aWNlTmFtZSk7CisgICAgICAgIGlmIChpbmRleCA9PSBHZXRTZXJ2aWNlTmFtZXMoKS5zaXplKCkpIHsKKyAgICAgICAgICAgIExPRyhERUJVRykgPDwgIkNyZWF0ZUlucHV0U3VyZmFjZSAtLSBpbnZhbGlkIHNlcnZpY2UgbmFtZTogXCIiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IHNlcnZpY2VOYW1lIDw8ICJcIiI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+IGlucHV0U3VyZmFjZTsKKyAgICBpZiAoaW5kZXggIT0gR2V0U2VydmljZU5hbWVzKCkuc2l6ZSgpKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGNsaWVudCA9IENhY2hlOjpMaXN0KClbaW5kZXhdLmdldENsaWVudCgpOworICAgICAgICBpZiAoY2xpZW50LT5jcmVhdGVJbnB1dFN1cmZhY2UoJmlucHV0U3VyZmFjZSkgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dFN1cmZhY2U7CisgICAgICAgIH0KKyAgICB9CisgICAgTE9HKElORk8pIDw8ICJDcmVhdGVJbnB1dFN1cmZhY2UgLS0gYXR0ZW1wdGluZyB0byBjcmVhdGUgYW4gaW5wdXQgc3VyZmFjZSAiCisgICAgICAgICAgICAgICAgICJmcm9tIGFsbCBzZXJ2aWNlcy4uLiI7CisgICAgZm9yIChDYWNoZSYgY2FjaGUgOiBDYWNoZTo6TGlzdCgpKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGNsaWVudCA9IGNhY2hlLmdldENsaWVudCgpOworICAgICAgICBpZiAoY2xpZW50LT5jcmVhdGVJbnB1dFN1cmZhY2UoJmlucHV0U3VyZmFjZSkgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIExPRyhJTkZPKSA8PCAiQ3JlYXRlSW5wdXRTdXJmYWNlIC0tIGlucHV0IHN1cmZhY2Ugb2J0YWluZWQgZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInNlcnZpY2UgXCIiIDw8IGNsaWVudC0+Z2V0U2VydmljZU5hbWUoKSA8PCAiXCIiOworICAgICAgICAgICAgcmV0dXJuIGlucHV0U3VyZmFjZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBMT0coV0FSTklORykgPDwgIkNyZWF0ZUlucHV0U3VyZmFjZSAtLSBmYWlsZWQgdG8gY3JlYXRlIGFuIGlucHV0IHN1cmZhY2UgIgorICAgICAgICAgICAgICAgICAgICAiZnJvbSBhbGwgc2VydmljZXMiOworICAgIHJldHVybiBudWxscHRyOworfQorCisvLyBDb2RlYzJDbGllbnQ6Okxpc3RlbmVyCisKK0NvZGVjMkNsaWVudDo6TGlzdGVuZXI6On5MaXN0ZW5lcigpIHsKK30KKworLy8gQ29kZWMyQ2xpZW50OjpJbnRlcmZhY2UKK0NvZGVjMkNsaWVudDo6SW50ZXJmYWNlOjpJbnRlcmZhY2UoY29uc3Qgc3A8QmFzZT4mIGJhc2UpCisgICAgICA6IENvbmZpZ3VyYWJsZXsKKyAgICAgICAgICAgIFtiYXNlXSgpIC0+IHNwPElDb25maWd1cmFibGU+IHsKKyAgICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHRyYW5zUmVzdWx0KSA6CisgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyOworICAgICAgICAgICAgfSgpCisgICAgICAgIH0sCisgICAgICAgIG1CYXNle2Jhc2V9IHsKK30KKworLy8gQ29kZWMyQ2xpZW50OjpDb21wb25lbnQKK0NvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpDb21wb25lbnQoY29uc3Qgc3A8QmFzZT4mIGJhc2UpCisgICAgICA6IENvbmZpZ3VyYWJsZXsKKyAgICAgICAgICAgIFtiYXNlXSgpIC0+IHNwPElDb25maWd1cmFibGU+IHsKKyAgICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbXBvbmVudEludGVyZmFjZT4+IHRyYW5zUmVzdWx0MSA9CisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLT5nZXRJbnRlcmZhY2UoKTsKKyAgICAgICAgICAgICAgICBpZiAoIXRyYW5zUmVzdWx0MS5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFJldHVybjxzcDxJQ29uZmlndXJhYmxlPj4gdHJhbnNSZXN1bHQyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPElDb21wb25lbnRJbnRlcmZhY2U+Pih0cmFuc1Jlc3VsdDEpLT4KKyAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1Jlc3VsdDIuaXNPaygpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNwPElDb25maWd1cmFibGU+Pih0cmFuc1Jlc3VsdDIpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHI7CisgICAgICAgICAgICB9KCkKKyAgICAgICAgfSwKKyAgICAgICAgbUJhc2V7YmFzZX0sCisgICAgICAgIG1CdWZmZXJQb29sU2VuZGVye251bGxwdHJ9IHsKK30KKworQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6On5Db21wb25lbnQoKSB7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpjcmVhdGVCbG9ja1Bvb2woCisgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGlkLAorICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCogYmxvY2tQb29sSWQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZT4qIGNvbmZpZ3VyYWJsZSkgeworICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Y3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGlkKSwKKyAgICAgICAgICAgIFsmc3RhdHVzLCBibG9ja1Bvb2xJZCwgY29uZmlndXJhYmxlXSgKKyAgICAgICAgICAgICAgICAgICAgU3RhdHVzIHMsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHBJZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUNvbmZpZ3VyYWJsZT4mIGMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgY29uZmlndXJhYmxlLT5yZXNldCgpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiY3JlYXRlQmxvY2tQb29sIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqYmxvY2tQb29sSWQgPSBzdGF0aWNfY2FzdDxDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdD4ocElkKTsKKyAgICAgICAgICAgICAgICAqY29uZmlndXJhYmxlID0gc3RkOjptYWtlX3NoYXJlZDxDb25maWd1cmFibGU+KGMpOworICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiY3JlYXRlQmxvY2tQb29sIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6ZGVzdHJveUJsb2NrUG9vbCgKKyAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbG9jYWxJZCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zUmVzdWx0ID0gbUJhc2UtPmRlc3Ryb3lCbG9ja1Bvb2woCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4obG9jYWxJZCkpOworICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImRlc3Ryb3lCbG9ja1Bvb2wgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4oc3RhdGljX2Nhc3Q8U3RhdHVzPih0cmFuc1Jlc3VsdCkpOworfQorCit2b2lkIENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpoYW5kbGVPbldvcmtEb25lKAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZ3b3JrSXRlbXMpIHsKKyAgICAvLyBPdXRwdXQgYnVmZmVycXVldWUtYmFzZWQgYmxvY2tzJyBsaWZldGltZSBtYW5hZ2VtZW50CisgICAgbU91dHB1dEJ1ZmZlclF1ZXVlLmhvbGRCdWZmZXJRdWV1ZUJsb2Nrcyh3b3JrSXRlbXMpOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6cXVldWUoCisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKSB7CisgICAgV29ya0J1bmRsZSB3b3JrQnVuZGxlOworICAgIGlmICghb2JqY3B5KCZ3b3JrQnVuZGxlLCAqaXRlbXMsICZtQnVmZmVyUG9vbFNlbmRlcikpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAicXVldWUgLS0gYmFkIGlucHV0LiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnF1ZXVlKHdvcmtCdW5kbGUpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInF1ZXVlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInF1ZXVlIC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpmbHVzaCgKKyAgICAgICAgQzJDb21wb25lbnQ6OmZsdXNoX21vZGVfdCBtb2RlLAorICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+KiBjb25zdCBmbHVzaGVkV29yaykgeworICAgICh2b2lkKW1vZGU7IC8vIEZsdXNoIG1vZGUgaXNuJ3Qgc3VwcG9ydGVkIGluIEhJREwgeWV0LgorICAgIGMyX3N0YXR1c190IHN0YXR1czsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+Zmx1c2goCisgICAgICAgICAgICBbJnN0YXR1cywgZmx1c2hlZFdvcmtdKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywgY29uc3QgV29ya0J1bmRsZSYgd2IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJmbHVzaCAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICghb2JqY3B5KGZsdXNoZWRXb3JrLCB3YikpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEMyX09LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImZsdXNoIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKworICAgIC8vIEluZGljZXMgb2YgZmx1c2hlZCB3b3JrIGl0ZW1zLgorICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBmbHVzaGVkSW5kaWNlczsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrIDogKmZsdXNoZWRXb3JrKSB7CisgICAgICAgIGlmICh3b3JrKSB7CisgICAgICAgICAgICBpZiAod29yay0+d29ya2xldHMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICB8fCAhd29yay0+d29ya2xldHMuYmFjaygpCisgICAgICAgICAgICAgICAgICAgIHx8ICh3b3JrLT53b3JrbGV0cy5iYWNrKCktPm91dHB1dC5mbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICBDMkZyYW1lRGF0YTo6RkxBR19JTkNPTVBMRVRFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gaW5wdXQgaXMgY29tcGxldGUKKyAgICAgICAgICAgICAgICBmbHVzaGVkSW5kaWNlcy5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBPdXRwdXQgYnVmZmVycXVldWUtYmFzZWQgYmxvY2tzJyBsaWZldGltZSBtYW5hZ2VtZW50CisgICAgbU91dHB1dEJ1ZmZlclF1ZXVlLmhvbGRCdWZmZXJRdWV1ZUJsb2NrcygqZmx1c2hlZFdvcmspOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OmRyYWluKEMyQ29tcG9uZW50OjpkcmFpbl9tb2RlX3QgbW9kZSkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmRyYWluKAorICAgICAgICAgICAgbW9kZSA9PSBDMkNvbXBvbmVudDo6RFJBSU5fQ09NUE9ORU5UX1dJVEhfRU9TKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJkcmFpbiAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJkcmFpbiAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6c3RhcnQoKSB7CisgICAgUmV0dXJuPFN0YXR1cz4gdHJhbnNTdGF0dXMgPSBtQmFzZS0+c3RhcnQoKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJzdGFydCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJzdGFydCAtLSBjYWxsIGZhaWxlZDogIiA8PCBzdGF0dXMgPDwgIi4iOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6c3RvcCgpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5zdG9wKCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAic3RvcCAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJzdG9wIC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpyZXNldCgpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5yZXNldCgpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInJlc2V0IC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInJlc2V0IC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpyZWxlYXNlKCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zU3RhdHVzID0gbUJhc2UtPnJlbGVhc2UoKTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJyZWxlYXNlIC0tIHRyYW5zYWN0aW9uIGZhaWxlZC4iOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNTdGF0dXMpKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIExPRyhERUJVRykgPDwgInJlbGVhc2UgLS0gY2FsbCBmYWlsZWQ6ICIgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQ6OnNldE91dHB1dFN1cmZhY2UoCisgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkLAorICAgICAgICBjb25zdCBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgc3VyZmFjZSwKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbikgeworICAgIHVpbnQ2NF90IGJxSWQgPSAwOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG51bGxJZ2JwOworICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXIyPiBudWxsSGdicDsKKworICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXIyPiBpZ2JwID0gc3VyZmFjZSA/CisgICAgICAgICAgICBzdXJmYWNlLT5nZXRIYWxJbnRlcmZhY2U8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcjI+KCkgOiBudWxsSGdicDsKKyAgICBpZiAoc3VyZmFjZSAmJiAhaWdicCkgeworICAgICAgICBpZ2JwID0gbmV3IEIySEdyYXBoaWNCdWZmZXJQcm9kdWNlcjIoc3VyZmFjZSk7CisgICAgfQorCisgICAgaWYgKCFzdXJmYWNlKSB7CisgICAgICAgIG1PdXRwdXRCdWZmZXJRdWV1ZS5jb25maWd1cmUobnVsbElnYnAsIGdlbmVyYXRpb24sIDApOworICAgIH0gZWxzZSBpZiAoc3VyZmFjZS0+Z2V0VW5pcXVlSWQoJmJxSWQpICE9IE9LKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInNldE91dHB1dFN1cmZhY2UgLS0gIgorICAgICAgICAgICAgICAgICAgICJjYW5ub3Qgb2J0YWluIGJ1ZmZlcnF1ZXVlIGlkLiI7CisgICAgICAgIGJxSWQgPSAwOworICAgICAgICBtT3V0cHV0QnVmZmVyUXVldWUuY29uZmlndXJlKG51bGxJZ2JwLCBnZW5lcmF0aW9uLCAwKTsKKyAgICB9IGVsc2UgeworICAgICAgICBtT3V0cHV0QnVmZmVyUXVldWUuY29uZmlndXJlKHN1cmZhY2UsIGdlbmVyYXRpb24sIGJxSWQpOworICAgIH0KKyAgICBBTE9HRCgiZ2VuZXJhdGlvbiByZW1vdGUgY2hhbmdlICV1IiwgZ2VuZXJhdGlvbik7CisKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5zZXRPdXRwdXRTdXJmYWNlKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KGJsb2NrUG9vbElkKSwKKyAgICAgICAgICAgIGJxSWQgPT0gMCA/IG51bGxIZ2JwIDogaWdicCk7CisgICAgaWYgKCF0cmFuc1N0YXR1cy5pc09rKCkpIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAic2V0T3V0cHV0U3VyZmFjZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJzZXRPdXRwdXRTdXJmYWNlIC0tIGNhbGwgZmFpbGVkOiAiIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpxdWV1ZVRvT3V0cHV0U3VyZmFjZSgKKyAgICAgICAgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayYgYmxvY2ssCisgICAgICAgIGNvbnN0IFF1ZXVlQnVmZmVySW5wdXQmIGlucHV0LAorICAgICAgICBRdWV1ZUJ1ZmZlck91dHB1dCogb3V0cHV0KSB7CisgICAgcmV0dXJuIG1PdXRwdXRCdWZmZXJRdWV1ZS5vdXRwdXRCdWZmZXIoYmxvY2ssIGlucHV0LCBvdXRwdXQpOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6Y29ubmVjdFRvSW5wdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlPiYgaW5wdXRTdXJmYWNlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4qIGNvbm5lY3Rpb24pIHsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXM7CisgICAgUmV0dXJuPHZvaWQ+IHRyYW5zU3RhdHVzID0gbUJhc2UtPmNvbm5lY3RUb0lucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGlucHV0U3VyZmFjZS0+bUJhc2UsCisgICAgICAgICAgICBbJnN0YXR1cywgY29ubmVjdGlvbl0oCisgICAgICAgICAgICAgICAgICAgIFN0YXR1cyBzLCBjb25zdCBzcDxJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4mIGMpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxjMl9zdGF0dXNfdD4ocyk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBMT0coREVCVUcpIDw8ICJjb25uZWN0VG9JbnB1dFN1cmZhY2UgLS0gY2FsbCBmYWlsZWQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBzdGF0dXMgPDwgIi4iOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpjb25uZWN0aW9uID0gc3RkOjptYWtlX3NoYXJlZDxJbnB1dFN1cmZhY2VDb25uZWN0aW9uPihjKTsKKyAgICAgICAgICAgIH0pOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImNvbm5lY3RUb0lucHV0U3VyZmFjZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQiOworICAgICAgICByZXR1cm4gQzJfVFJBTlNBQ1RJT05fRkFJTEVEOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitjMl9zdGF0dXNfdCBDb2RlYzJDbGllbnQ6OkNvbXBvbmVudDo6Y29ubmVjdFRvT214SW5wdXRTdXJmYWNlKAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMT4mIHByb2R1Y2VyLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclNvdXJjZT4mIHNvdXJjZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZUNvbm5lY3Rpb24+KiBjb25uZWN0aW9uKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzOworICAgIFJldHVybjx2b2lkPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5jb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBwcm9kdWNlciwgc291cmNlLAorICAgICAgICAgICAgWyZzdGF0dXMsIGNvbm5lY3Rpb25dKAorICAgICAgICAgICAgICAgICAgICBTdGF0dXMgcywgY29uc3Qgc3A8SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24+JiBjKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAiY29ubmVjdFRvT214SW5wdXRTdXJmYWNlIC0tIGNhbGwgZmFpbGVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgc3RhdHVzIDw8ICIuIjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqY29ubmVjdGlvbiA9IHN0ZDo6bWFrZV9zaGFyZWQ8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4oYyk7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXRyYW5zU3RhdHVzLmlzT2soKSkgeworICAgICAgICBMT0coRVJST1IpIDw8ICJjb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UgLS0gdHJhbnNhY3Rpb24gZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9UUkFOU0FDVElPTl9GQUlMRUQ7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpkaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSgpIHsKKyAgICBSZXR1cm48U3RhdHVzPiB0cmFuc1N0YXR1cyA9IG1CYXNlLT5kaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSgpOworICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgImRpc2Nvbm5lY3RUb0lucHV0U3VyZmFjZSAtLSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGMyX3N0YXR1c190PihzdGF0aWNfY2FzdDxTdGF0dXM+KHRyYW5zU3RhdHVzKSk7CisgICAgaWYgKHN0YXR1cyAhPSBDMl9PSykgeworICAgICAgICBMT0coREVCVUcpIDw8ICJkaXNjb25uZWN0RnJvbUlucHV0U3VyZmFjZSAtLSBjYWxsIGZhaWxlZDogIgorICAgICAgICAgICAgICAgICAgIDw8IHN0YXR1cyA8PCAiLiI7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2MyX3N0YXR1c190IENvZGVjMkNsaWVudDo6Q29tcG9uZW50OjpzZXREZWF0aExpc3RlbmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+JiBsaXN0ZW5lcikgeworCisgICAgc3RydWN0IEhpZGxEZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQgeworICAgICAgICBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4gY29tcG9uZW50OworICAgICAgICBzdGQ6OndlYWtfcHRyPExpc3RlbmVyPiBiYXNlOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBzZXJ2aWNlRGllZCgKKyAgICAgICAgICAgICAgICB1aW50NjRfdCAvKiBjb29raWUgKi8sCisgICAgICAgICAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLworICAgICAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICAgICAgaWYgKHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBsaXN0ZW5lciA9IGJhc2UubG9jaygpKSB7CisgICAgICAgICAgICAgICAgbGlzdGVuZXItPm9uRGVhdGgoY29tcG9uZW50KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HKERFQlVHKSA8PCAib25EZWF0aCAtLSBsaXN0ZW5lciBkaWVkLiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9OworCisgICAgc3A8SGlkbERlYXRoUmVjaXBpZW50PiBkZWF0aFJlY2lwaWVudCA9IG5ldyBIaWRsRGVhdGhSZWNpcGllbnQoKTsKKyAgICBkZWF0aFJlY2lwaWVudC0+YmFzZSA9IGxpc3RlbmVyOworICAgIGRlYXRoUmVjaXBpZW50LT5jb21wb25lbnQgPSBjb21wb25lbnQ7CisKKyAgICBjb21wb25lbnQtPm1EZWF0aFJlY2lwaWVudCA9IGRlYXRoUmVjaXBpZW50OworICAgIFJldHVybjxib29sPiB0cmFuc1Jlc3VsdCA9IGNvbXBvbmVudC0+bUJhc2UtPmxpbmtUb0RlYXRoKAorICAgICAgICAgICAgY29tcG9uZW50LT5tRGVhdGhSZWNpcGllbnQsIDApOworICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwgInNldERlYXRoTGlzdGVuZXIgLS0gbGlua1RvRGVhdGgoKSB0cmFuc2FjdGlvbiBmYWlsZWQuIjsKKyAgICAgICAgcmV0dXJuIEMyX1RSQU5TQUNUSU9OX0ZBSUxFRDsKKyAgICB9CisgICAgaWYgKCFzdGF0aWNfY2FzdDxib29sPih0cmFuc1Jlc3VsdCkpIHsKKyAgICAgICAgTE9HKERFQlVHKSA8PCAic2V0RGVhdGhMaXN0ZW5lciAtLSBsaW5rVG9EZWF0aCgpIGNhbGwgZmFpbGVkLiI7CisgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworLy8gQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2UKK0NvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlOjpJbnB1dFN1cmZhY2UoY29uc3Qgc3A8SUlucHV0U3VyZmFjZT4mIGJhc2UpCisgICAgICA6IENvbmZpZ3VyYWJsZXsKKyAgICAgICAgICAgIFtiYXNlXSgpIC0+IHNwPElDb25maWd1cmFibGU+IHsKKyAgICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHRyYW5zUmVzdWx0KSA6CisgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyOworICAgICAgICAgICAgfSgpCisgICAgICAgIH0sCisgICAgICAgIG1CYXNle2Jhc2V9LAorICAgICAgICBtR3JhcGhpY0J1ZmZlclByb2R1Y2Vye25ldworICAgICAgICAgICAgSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyMihbYmFzZV0oKSAtPiBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMj4geworICAgICAgICAgICAgICAgIFJldHVybjxzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMj4+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcjI+Pih0cmFuc1Jlc3VsdCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cjsKKyAgICAgICAgICAgIH0oKSl9IHsKK30KKworc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4KKyAgICAgICAgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U6OmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK30KKworc3A8SUlucHV0U3VyZmFjZT4gQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U6OmdldEhhbEludGVyZmFjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUJhc2U7Cit9CisKKy8vIENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbgorQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uKAorICAgICAgICBjb25zdCBzcDxJSW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4mIGJhc2UpCisgICAgICA6IENvbmZpZ3VyYWJsZXsKKyAgICAgICAgICAgIFtiYXNlXSgpIC0+IHNwPElDb25maWd1cmFibGU+IHsKKyAgICAgICAgICAgICAgICBSZXR1cm48c3A8SUNvbmZpZ3VyYWJsZT4+IHRyYW5zUmVzdWx0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UtPmdldENvbmZpZ3VyYWJsZSgpOworICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc1Jlc3VsdC5pc09rKCkgPworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8c3A8SUNvbmZpZ3VyYWJsZT4+KHRyYW5zUmVzdWx0KSA6CisgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyOworICAgICAgICAgICAgfSgpCisgICAgICAgIH0sCisgICAgICAgIG1CYXNle2Jhc2V9IHsKK30KKworYzJfc3RhdHVzX3QgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uOjpkaXNjb25uZWN0KCkgeworICAgIFJldHVybjxTdGF0dXM+IHRyYW5zUmVzdWx0ID0gbUJhc2UtPmRpc2Nvbm5lY3QoKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YzJfc3RhdHVzX3Q+KHN0YXRpY19jYXN0PFN0YXR1cz4odHJhbnNSZXN1bHQpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvY2xpZW50LmggYi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvaW5jbHVkZS9jb2RlYzIvaGlkbC9jbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMzc0MDdmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvY2xpZW50L2luY2x1ZGUvY29kZWMyL2hpZGwvY2xpZW50LmgKQEAgLTAsMCArMSw0NTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0hJRExfQ0xJRU5UX0gKKyNkZWZpbmUgQ09ERUMyX0hJRExfQ0xJRU5UX0gKKworI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvMS4wL0NsaWVudEJsb2NrSGVscGVyLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPEMyLmg+CisKKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG11dGV4PgorCisvKioKKyAqIFRoaXMgZmlsZSBjb250YWlucyBtaW5pbWFsIGludGVyZmFjZXMgZm9yIHRoZSBmcmFtZXdvcmsgdG8gYWNjZXNzIENvZGVjMi4wLgorICoKKyAqIENvZGVjMkNsaWVudCBpcyB0aGUgbWFpbiBjbGFzcyB0aGF0IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgaW5uZXIgY2xhc3NlczoKKyAqIC0gTGlzdGVuZXIKKyAqIC0gQ29uZmlndXJhYmxlCisgKiAtIEludGVyZmFjZQorICogLSBDb21wb25lbnQKKyAqCisgKiBDbGFzc2VzIGluIENvZGVjMkNsaWVudCwgaW50ZXJmYWNlcyBpbiBDb2RlYzIuMCwgYW5kICBISURMIGludGVyZmFjZXMgYXJlCisgKiByZWxhdGVkIGFzIGZvbGxvd3M6CisgKiAtIENvZGVjMkNsaWVudCA8PT0+IEMyQ29tcG9uZW50U3RvcmUgPD09PiBJQ29tcG9uZW50U3RvcmUKKyAqIC0gQ29kZWMyQ2xpZW50OjpMaXN0ZW5lciA8PT0+IEMyQ29tcG9uZW50OjpMaXN0ZW5lciA8PT0+IElDb21wb25lbnRMaXN0ZW5lcgorICogLSBDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZSA8PT0+IFtObyBlcXVpdmFsZW50XSA8PT0+IElDb25maWd1cmFibGUKKyAqIC0gQ29kZWMyQ2xpZW50OjpJbnRlcmZhY2UgPD09PiBDMkNvbXBvbmVudEludGVyZmFjZSA8PT0+IElDb21wb25lbnRJbnRlcmZhY2UKKyAqIC0gQ29kZWMyQ2xpZW50OjpDb21wb25lbnQgPD09PiBDMkNvbXBvbmVudCA8PT0+IElDb21wb25lbnQKKyAqCisgKiBUaGUgZW50cnkgcG9pbnQgaXMgQ29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgpLCB3aGljaCBjcmVhdGVzIGEKKyAqIENvZGVjMkNsaWVudCBvYmplY3QuIEZyb20gQ29kZWMyQ2xpZW50LCBJbnRlcmZhY2UgYW5kIENvbXBvbmVudCBvYmplY3RzIGNhbgorICogYmUgY3JlYXRlZCBieSBjYWxsaW5nIGNyZWF0ZUNvbXBvbmVudCgpIGFuZCBjcmVhdGVJbnRlcmZhY2UoKS4KKyAqCisgKiBjcmVhdGVDb21wb25lbnQoKSB0YWtlcyBhIExpc3RlbmVyIG9iamVjdCwgd2hpY2ggbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0aGUKKyAqIHVzZXIuCisgKgorICogQXQgdGhlIHByZXNlbnQsIGNyZWF0ZUJsb2NrUG9vbCgpIGlzIHRoZSBvbmx5IG1ldGhvZCB0aGF0IHlpZWxkcyBhCisgKiBDb25maWd1cmFibGUgb2JqZWN0LiBOb3RlLCBob3dldmVyLCB0aGF0IEludGVyZmFjZSwgQ29tcG9uZW50IGFuZAorICogQ29kZWMyQ2xpZW50IGFyZSBhbGwgc3ViY2xhc3NlcyBvZiBDb25maWd1cmFibGUuCisgKi8KKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiByZWxldmFudCBISURMIGludGVyZmFjZXMKKworbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzAgeworc3RydWN0IElDb25maWd1cmFibGU7CitzdHJ1Y3QgSUNvbXBvbmVudDsKK3N0cnVjdCBJQ29tcG9uZW50SW50ZXJmYWNlOworc3RydWN0IElDb21wb25lbnRTdG9yZTsKK3N0cnVjdCBJSW5wdXRTaW5rOworc3RydWN0IElJbnB1dFN1cmZhY2U7CitzdHJ1Y3QgSUlucHV0U3VyZmFjZUNvbm5lY3Rpb247Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMAorCituYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wIHsKK3N0cnVjdCBJQ2xpZW50TWFuYWdlcjsKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzAKKworbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzAgeworc3RydWN0IElHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit9ICAvLyBhbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wCisKK25hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMCB7CitzdHJ1Y3QgSUdyYXBoaWNCdWZmZXJTb3VyY2U7Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzAKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUaGlzIGNsYXNzIGlzIHN1cHBvc2VkIHRvIGJlIGNhbGxlZCBDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZSwgYnV0IGZvcndhcmQKKy8vIGRlY2xhcmF0aW9uIG9mIGFuIGlubmVyIGNsYXNzIGlzIG5vdCBwb3NzaWJsZS4KK3N0cnVjdCBDb2RlYzJDb25maWd1cmFibGVDbGllbnQgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb25maWd1cmFibGUgQmFzZTsKKworICAgIGNvbnN0IEMyU3RyaW5nJiBnZXROYW1lKCkgY29uc3Q7CisKKyAgICBjMl9zdGF0dXNfdCBxdWVyeSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiYgc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3Q7CisKKyAgICBjMl9zdGF0dXNfdCBjb25maWcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKTsKKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcworICAgICAgICAgICAgKSBjb25zdDsKKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiYgZmllbGRzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaykgY29uc3Q7CisKKyAgICAvLyBiYXNlIGNhbm5vdCBiZSBudWxsLgorICAgIENvZGVjMkNvbmZpZ3VyYWJsZUNsaWVudChjb25zdCBzcDxCYXNlPiYgYmFzZSk7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxCYXNlPiBtQmFzZTsKKyAgICBDMlN0cmluZyBtTmFtZTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29kZWMyQ2xpZW50OworfTsKKworc3RydWN0IENvZGVjMkNsaWVudCA6IHB1YmxpYyBDb2RlYzJDb25maWd1cmFibGVDbGllbnQgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnRTdG9yZSBCYXNlOworCisgICAgc3RydWN0IExpc3RlbmVyOworCisgICAgdHlwZWRlZiBDb2RlYzJDb25maWd1cmFibGVDbGllbnQgQ29uZmlndXJhYmxlOworCisgICAgc3RydWN0IENvbXBvbmVudDsKKworICAgIHN0cnVjdCBJbnRlcmZhY2U7CisKKyAgICBzdHJ1Y3QgSW5wdXRTdXJmYWNlOworCisgICAgc3RydWN0IElucHV0U3VyZmFjZUNvbm5lY3Rpb247CisKKyAgICB0eXBlZGVmIENvZGVjMkNsaWVudCBTdG9yZTsKKworICAgIHNwPEJhc2U+IGNvbnN0JiBnZXRCYXNlKCkgY29uc3Q7CisKKyAgICBzdGQ6OnN0cmluZyBjb25zdCYgZ2V0U2VydmljZU5hbWUoKSBjb25zdDsKKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIEMyU3RyaW5nIGNvbnN0JiBuYW1lLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPExpc3RlbmVyPiBjb25zdCYgbGlzdGVuZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50PiogY29uc3QgY29tcG9uZW50KTsKKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIEMyU3RyaW5nIGNvbnN0JiBuYW1lLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEludGVyZmFjZT4qIGNvbnN0IGludGVyZmFjZSk7CisKKyAgICBjMl9zdGF0dXNfdCBjcmVhdGVJbnB1dFN1cmZhY2UoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlPiogY29uc3QgaW5wdXRTdXJmYWNlKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+IGNvbnN0JiBsaXN0Q29tcG9uZW50cygpIGNvbnN0OworCisgICAgYzJfc3RhdHVzX3QgY29weUJ1ZmZlcigKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY29uc3QmIHNyYywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gY29uc3QmIGRzdCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UGFyYW1SZWZsZWN0b3IoKTsKKworICAgIC8vIFJldHVybnMgdGhlIGxpc3Qgb2YgSUNvbXBvbmVudFN0b3JlIHNlcnZpY2UgbmFtZXMgdGhhdCBhcmUgYXZhaWxhYmxlIG9uCisgICAgLy8gdGhlIGRldmljZS4gVGhpcyBsaXN0IGlzIHNwZWNpZmllZCBhdCB0aGUgYnVpbGQgdGltZSBpbiBtYW5pZmVzdCBmaWxlcy4KKyAgICAvLyBOb3RlOiBBIHNvZnR3YXJlIHNlcnZpY2Ugd2lsbCBoYXZlICJfc29mdHdhcmUiIGFzIGEgc3VmZml4LgorICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gY29uc3QmIEdldFNlcnZpY2VOYW1lcygpOworCisgICAgLy8gQ3JlYXRlIGEgc2VydmljZSB3aXRoIGEgZ2l2ZW4gc2VydmljZSBuYW1lLgorICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBDcmVhdGVGcm9tU2VydmljZShjaGFyIGNvbnN0KiBuYW1lKTsKKworICAgIC8vIEdldCBjbGllbnRzIHRvIGFsbCBzZXJ2aWNlcy4KKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4+IENyZWF0ZUZyb21BbGxTZXJ2aWNlcygpOworCisgICAgLy8gVHJ5IHRvIGNyZWF0ZSBhIGNvbXBvbmVudCB3aXRoIGEgZ2l2ZW4gbmFtZSBmcm9tIGFsbCBrbm93bgorICAgIC8vIElDb21wb25lbnRTdG9yZSBzZXJ2aWNlcy4gbnVtYmVyT2ZBdHRlbXB0cyBkZXRlcm1pbmVzIHRoZSBudW1iZXIgb2YgdGltZXMKKyAgICAvLyB0byByZXRyeSB0aGUgSElETCBjYWxsIGlmIHRoZSB0cmFuc2FjdGlvbiBmYWlscy4KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudD4gQ3JlYXRlQ29tcG9uZW50QnlOYW1lKAorICAgICAgICAgICAgY2hhciBjb25zdCogY29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0ZW5lcj4gY29uc3QmIGxpc3RlbmVyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4qIG93bmVyID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHNpemVfdCBudW1iZXJPZkF0dGVtcHRzID0gMTApOworCisgICAgLy8gVHJ5IHRvIGNyZWF0ZSBhIGNvbXBvbmVudCBpbnRlcmZhY2Ugd2l0aCBhIGdpdmVuIG5hbWUgZnJvbSBhbGwga25vd24KKyAgICAvLyBJQ29tcG9uZW50U3RvcmUgc2VydmljZXMuIG51bWJlck9mQXR0ZW1wdHMgZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIHRpbWVzCisgICAgLy8gdG8gcmV0cnkgdGhlIEhJREwgY2FsbCBpZiB0aGUgdHJhbnNhY3Rpb24gZmFpbHMuCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJbnRlcmZhY2U+IENyZWF0ZUludGVyZmFjZUJ5TmFtZSgKKyAgICAgICAgICAgIGNoYXIgY29uc3QqIGludGVyZmFjZU5hbWUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50Piogb3duZXIgPSBudWxscHRyLAorICAgICAgICAgICAgc2l6ZV90IG51bWJlck9mQXR0ZW1wdHMgPSAxMCk7CisKKyAgICAvLyBMaXN0IHRyYWl0cyBmcm9tIGFsbCBrbm93biBJQ29tcG9uZW50U3RvcmUgc2VydmljZXMuCisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+IGNvbnN0JiBMaXN0Q29tcG9uZW50cygpOworCisgICAgLy8gQ3JlYXRlIGFuIGlucHV0IHN1cmZhY2UuCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U+IENyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNoYXIgY29uc3QqIHNlcnZpY2VOYW1lID0gbnVsbHB0cik7CisKKyAgICAvLyBiYXNlIGNhbm5vdCBiZSBudWxsLgorICAgIENvZGVjMkNsaWVudChzcDxCYXNlPiBjb25zdCYgYmFzZSwgc2l6ZV90IHNlcnZpY2VJbmRleCk7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxCYXNlPiBtQmFzZTsKKworICAgIC8vIEZpbmRzIHRoZSBmaXJzdCBzdG9yZSB3aGVyZSB0aGUgcHJlZGljYXRlIHJldHVybnMgQzJfT0sgYW5kIHJldHVybnMgdGhlCisgICAgLy8gbGFzdCBwcmVkaWNhdGUgcmVzdWx0LiBUaGUgcHJlZGljYXRlIHdpbGwgYmUgdHJpZWQgb24gYWxsIHN0b3Jlcy4gVGhlCisgICAgLy8gZnVuY3Rpb24gd2lsbCByZXR1cm4gQzJfT0sgdGhlIGZpcnN0IHRpbWUgdGhlIHByZWRpY2F0ZSByZXR1cm5zIEMyX09LLAorICAgIC8vIG9yIGl0IHdpbGwgcmV0dXJuIHRoZSB2YWx1ZSBmcm9tIHRoZSBsYXN0IHRpbWUgdGhhdCBwcmVkaWNhdGUgaXMgdHJpZWQuCisgICAgLy8gKFRoZSBsYXR0ZXIgY2FzZSBjb3JyZXNwb25kcyB0byBhIGZhaWx1cmUgb24gZXZlcnkgc3RvcmUuKSBUaGUgb3JkZXIgb2YKKyAgICAvLyB0aGUgc3RvcmVzIHRvIHRyeSBpcyB0aGUgc2FtZSBhcyB0aGUgcmV0dXJuIHZhbHVlIG9mIEdldFNlcnZpY2VOYW1lcygpLgorICAgIC8vCisgICAgLy8ga2V5IGlzIHVzZWQgdG8gcmVtZW1iZXIgdGhlIGxhc3Qgc3RvcmUgd2l0aCB3aGljaCB0aGUgcHJlZGljYXRlIGxhc3QKKyAgICAvLyBzdWNjZWVkZWQuIElmIHRoZSBsYXN0IHN1Y2Nlc3NmdWwgc3RvcmUgaXMgY2FjaGVkLCBpdCB3aWxsIGJlIHRyaWVkCisgICAgLy8gZmlyc3QgYmVmb3JlIGFsbCB0aGUgc3RvcmVzIGFyZSB0cmllZC4gTm90ZSB0aGF0IHRoZSBsYXN0IHN1Y2Nlc3NmdWwKKyAgICAvLyBzdG9yZSB3aWxsIGJlIHRyaWVkIHR3aWNlLS0tZmlyc3QgYmVmb3JlIGFsbCB0aGUgc3RvcmVzLCBhbmQgYW5vdGhlciB0aW1lCisgICAgLy8gd2l0aCBhbGwgdGhlIHN0b3Jlcy4KKyAgICAvLworICAgIC8vIElmIGFuIGF0dGVtcHQgdG8gZXZhbHVhdGUgdGhlIHByZWRpY2F0ZSByZXN1bHRzIGluIGEgdHJhbnNhY3Rpb24gZmFpbHVyZSwKKyAgICAvLyByZXBlYXRlZCBhdHRlbXB0cyB3aWxsIGJlIG1hZGUgdW50aWwgdGhlIHByZWRpY2F0ZSByZXR1cm5zIHdpdGhvdXQgYQorICAgIC8vIHRyYW5zYWN0aW9uIGZhaWx1cmUgb3IgbnVtYmVyT2ZBdHRlbXB0cyBhdHRlbXB0cyBoYXZlIGJlZW4gbWFkZS4KKyAgICBzdGF0aWMgYzJfc3RhdHVzX3QgRm9yQWxsU2VydmljZXMoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5LAorICAgICAgICAgICAgc2l6ZV90IG51bWJlck9mQXR0ZW1wdHMsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IGNvbnN0Jik+CisgICAgICAgICAgICAgICAgcHJlZGljYXRlKTsKKworICAgIHNpemVfdCBtU2VydmljZUluZGV4OworICAgIG11dGFibGUgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gbVRyYWl0c0xpc3Q7CisKKyAgICBzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6SUNsaWVudE1hbmFnZXI+CisgICAgICAgICAgICBtSG9zdFBvb2xNYW5hZ2VyOworCisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+IF9DcmVhdGVGcm9tSW5kZXgoc2l6ZV90IGluZGV4KTsKKworICAgIHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50OjpUcmFpdHM+IF9saXN0Q29tcG9uZW50cyhib29sKiBzdWNjZXNzKSBjb25zdDsKKworICAgIGNsYXNzIENhY2hlOworfTsKKworc3RydWN0IENvZGVjMkNsaWVudDo6SW50ZXJmYWNlIDogcHVibGljIENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlIHsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmMyOjpWMV8wOjpJQ29tcG9uZW50SW50ZXJmYWNlIEJhc2U7CisKKyAgICBJbnRlcmZhY2UoY29uc3Qgc3A8QmFzZT4mIGJhc2UpOworCitwcm90ZWN0ZWQ6CisgICAgc3A8QmFzZT4gbUJhc2U7Cit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpMaXN0ZW5lciB7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBjb21wb25lbnQgcHJvZHVjZXMgc29tZSBvdXRwdXQuCisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4mIGNvbXAsCisgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+JiB3b3JrSXRlbXMpID0gMDsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBnb2VzIGludG8gYSB0cmlwcGVkIHN0YXRlLgorICAgIHZpcnR1YWwgdm9pZCBvblRyaXBwZWQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvbXBvbmVudD4mIGNvbXAsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4mIHNldHRpbmdSZXN1bHRzCisgICAgICAgICAgICApID0gMDsKKworICAgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gdGhlIGNvbXBvbmVudCBlbmNvdW50ZXJzIGFuIGVycm9yLgorICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb21wb25lbnQ+JiBjb21wLAorICAgICAgICAgICAgdWludDMyX3QgZXJyb3JDb2RlKSA9IDA7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIHRoZSBwcm9jZXNzIHRoYXQgaG9zdHMgdGhlIGNvbXBvbmVudCBzaHV0cyBkb3duCisgICAgLy8gdW5leHBlY3RlZGx5LgorICAgIHZpcnR1YWwgdm9pZCBvbkRlYXRoKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxDb21wb25lbnQ+JiBjb21wKSA9IDA7CisKKyAgICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIGFuIGlucHV0IGJ1ZmZlciBpcyBubyBsb25nZXIgaW4gdXNlIGJ5IHRoZSBjb2RlYy4KKyAgICAvLyBJbnB1dCBidWZmZXJzIHRoYXQgaGF2ZSBiZWVuIHJldHVybmVkIGJ5IG9uV29ya0RvbmUoKSBvciBmbHVzaCgpIHdpbGwgbm90CisgICAgLy8gdHJpZ2dlciBhIGNhbGwgdG8gdGhpcyBmdW5jdGlvbi4KKyAgICB2aXJ0dWFsIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUoCisgICAgICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYXJyYXlJbmRleCkgPSAwOworCisgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiB0aGUgY29tcG9uZW50IGJlY29tZXMgYXdhcmUgb2YgYSBmcmFtZSBiZWluZworICAgIC8vIHJlbmRlcmVkLgorICAgIHZpcnR1YWwgdm9pZCBvbkZyYW1lUmVuZGVyZWQoCisgICAgICAgICAgICB1aW50NjRfdCBidWZmZXJRdWV1ZUlkLAorICAgICAgICAgICAgaW50MzJfdCBzbG90SWQsCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcE5zKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5MaXN0ZW5lcigpOworCit9OworCitzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpDb21wb25lbnQgOiBwdWJsaWMgQ29kZWMyQ2xpZW50OjpDb25maWd1cmFibGUgeworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklDb21wb25lbnQgQmFzZTsKKworICAgIGMyX3N0YXR1c190IGNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGlkLAorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QqIGJsb2NrUG9vbElkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvbmZpZ3VyYWJsZT4qIGNvbmZpZ3VyYWJsZSk7CisKKyAgICBjMl9zdGF0dXNfdCBkZXN0cm95QmxvY2tQb29sKAorICAgICAgICAgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbG9jYWxJZCk7CisKKyAgICBjMl9zdGF0dXNfdCBxdWV1ZSgKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4qIGNvbnN0IGl0ZW1zKTsKKworICAgIGMyX3N0YXR1c190IGZsdXNoKAorICAgICAgICAgICAgQzJDb21wb25lbnQ6OmZsdXNoX21vZGVfdCBtb2RlLAorICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiogY29uc3QgZmx1c2hlZFdvcmspOworCisgICAgYzJfc3RhdHVzX3QgZHJhaW4oQzJDb21wb25lbnQ6OmRyYWluX21vZGVfdCBtb2RlKTsKKworICAgIGMyX3N0YXR1c190IHN0YXJ0KCk7CisKKyAgICBjMl9zdGF0dXNfdCBzdG9wKCk7CisKKyAgICBjMl9zdGF0dXNfdCByZXNldCgpOworCisgICAgYzJfc3RhdHVzX3QgcmVsZWFzZSgpOworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworICAgIHR5cGVkZWYgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6CisgICAgICAgICAgICBRdWV1ZUJ1ZmZlcklucHV0IFF1ZXVlQnVmZmVySW5wdXQ7CisgICAgdHlwZWRlZiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjoKKyAgICAgICAgICAgIFF1ZXVlQnVmZmVyT3V0cHV0IFF1ZXVlQnVmZmVyT3V0cHV0OworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgorICAgICAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyMTsKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjJfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXIyOworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclNvdXJjZSBIR3JhcGhpY0J1ZmZlclNvdXJjZTsKKworICAgIC8vIFNldCB0aGUgb3V0cHV0IHN1cmZhY2UgdG8gYmUgdXNlZCB3aXRoIGEgYmxvY2twb29sIHByZXZpb3VzbHkgY3JlYXRlZCBieQorICAgIC8vIGNyZWF0ZUJsb2NrUG9vbCgpLgorICAgIGMyX3N0YXR1c190IHNldE91dHB1dFN1cmZhY2UoCisgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBibG9ja1Bvb2xJZCwKKyAgICAgICAgICAgIGNvbnN0IHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBzdXJmYWNlLAorICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbik7CisKKyAgICAvLyBFeHRyYWN0IGEgc2xvdCBudW1iZXIgZnJvbSBvZiB0aGUgYmxvY2ssIHRoZW4gY2FsbAorICAgIC8vIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnF1ZXVlQnVmZmVyKCkuCisgICAgLy8KKyAgICAvLyBJZiB0aGUgb3V0cHV0IHN1cmZhY2UgaGFzIG5vdCBiZWVuIHNldCwgTk9fSU5JVCB3aWxsIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgLy8gSWYgdGhlIGJsb2NrIGRvZXMgbm90IGNvbWUgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbCwKKyAgICAvLyBhdHRhY2hCdWZmZXIoKSB3aWxsIGJlIGNhbGxlZCwgZm9sbG93ZWQgYnkgcXVldWVCdWZmZXIoKS4KKyAgICAvLworICAgIC8vIElmIHRoZSBibG9jayBoYXMgYSBicUlkIHRoYXQgZG9lcyBub3QgbWF0Y2ggdGhlIGlkIG9mIHRoZSBvdXRwdXQgc3VyZmFjZSwKKyAgICAvLyBERUFEX09CSkVDVCB3aWxsIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgLy8gSWYgdGhlIGNhbGwgdG8gcXVldWVCdWZmZXIoKSBpcyBzdWNjZXNzZnVsIGJ1dCB0aGUgYmxvY2sgY2Fubm90IGJlCisgICAgLy8gYXNzb2NpYXRlZCB0byB0aGUgb3V0cHV0IHN1cmZhY2UgZm9yIGF1dG9tYXRpYyBjYW5jZWxsYXRpb24gdXBvbgorICAgIC8vIGRlc3RydWN0aW9uLCBVTktOT1dOX0VSUk9SIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAvLyBPdGhlcndpc2UsIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBxdWV1ZUJ1ZmZlcigpIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgc3RhdHVzX3QgcXVldWVUb091dHB1dFN1cmZhY2UoCisgICAgICAgICAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrJiBibG9jaywKKyAgICAgICAgICAgIGNvbnN0IFF1ZXVlQnVmZmVySW5wdXQmIGlucHV0LAorICAgICAgICAgICAgUXVldWVCdWZmZXJPdXRwdXQqIG91dHB1dCk7CisKKyAgICAvLyBDb25uZWN0IHRvIGEgZ2l2ZW4gSW5wdXRTdXJmYWNlLgorICAgIGMyX3N0YXR1c190IGNvbm5lY3RUb0lucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2U+JiBpbnB1dFN1cmZhY2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4qIGNvbm5lY3Rpb24pOworCisgICAgYzJfc3RhdHVzX3QgY29ubmVjdFRvT214SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcjE+JiBwcm9kdWNlciwKKyAgICAgICAgICAgIGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyU291cmNlPiYgc291cmNlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZUNvbm5lY3Rpb24+KiBjb25uZWN0aW9uKTsKKworICAgIGMyX3N0YXR1c190IGRpc2Nvbm5lY3RGcm9tSW5wdXRTdXJmYWNlKCk7CisKKyAgICAvLyBiYXNlIGNhbm5vdCBiZSBudWxsLgorICAgIENvbXBvbmVudChjb25zdCBzcDxCYXNlPiYgYmFzZSk7CisKKyAgICB+Q29tcG9uZW50KCk7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxCYXNlPiBtQmFzZTsKKworICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6dXRpbHM6OkRlZmF1bHRCdWZmZXJQb29sU2VuZGVyCisgICAgICAgICAgICBtQnVmZmVyUG9vbFNlbmRlcjsKKworICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6dXRpbHM6Ok91dHB1dEJ1ZmZlclF1ZXVlCisgICAgICAgICAgICBtT3V0cHV0QnVmZmVyUXVldWU7CisKKyAgICBzdGF0aWMgYzJfc3RhdHVzX3Qgc2V0RGVhdGhMaXN0ZW5lcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8TGlzdGVuZXI+JiBsaXN0ZW5lcik7CisgICAgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQ+IG1EZWF0aFJlY2lwaWVudDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29kZWMyQ2xpZW50OworCisgICAgc3RydWN0IEhpZGxMaXN0ZW5lcjsKKyAgICB2b2lkIGhhbmRsZU9uV29ya0RvbmUoY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmd29ya0l0ZW1zKTsKKworfTsKKworc3RydWN0IENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlIDogcHVibGljIENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlIHsKK3B1YmxpYzoKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUlucHV0U3VyZmFjZSBCYXNlOworCisgICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA6OklJbnB1dFN1cmZhY2VDb25uZWN0aW9uCisgICAgICAgICAgICBDb25uZWN0aW9uQmFzZTsKKworICAgIHR5cGVkZWYgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2VDb25uZWN0aW9uIENvbm5lY3Rpb247CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlciBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOworCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gZ2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgY29uc3Q7CisKKyAgICAvLyBSZXR1cm4gdGhlIHVuZGVybHlpbmcgSUlucHV0U3VyZmFjZS4KKyAgICBzcDxCYXNlPiBnZXRIYWxJbnRlcmZhY2UoKSBjb25zdDsKKworICAgIC8vIGJhc2UgY2Fubm90IGJlIG51bGwuCisgICAgSW5wdXRTdXJmYWNlKGNvbnN0IHNwPEJhc2U+JiBiYXNlKTsKKworcHJvdGVjdGVkOgorICAgIHNwPEJhc2U+IG1CYXNlOworCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbUdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29kZWMyQ2xpZW50OworICAgIGZyaWVuZCBzdHJ1Y3QgQ29tcG9uZW50OworfTsKKworc3RydWN0IENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbiA6IHB1YmxpYyBDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZSB7CisKKyAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUlucHV0U3VyZmFjZUNvbm5lY3Rpb24gQmFzZTsKKworICAgIGMyX3N0YXR1c190IGRpc2Nvbm5lY3QoKTsKKworICAgIC8vIGJhc2UgY2Fubm90IGJlIG51bGwuCisgICAgSW5wdXRTdXJmYWNlQ29ubmVjdGlvbihjb25zdCBzcDxCYXNlPiYgYmFzZSk7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxCYXNlPiBtQmFzZTsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQ29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9ISURMX0NMSUVOVF9ICisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MDNhMWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzcgQEAKK2NjX2JpbmFyeSB7CisgICAgbmFtZTogImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2UiLAorICAgIGRlZmF1bHRzOiBbImhpZGxfZGVmYXVsdHMiXSwKKyAgICBzb2Nfc3BlY2lmaWM6IHRydWUsCisgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAiaHciLAorICAgIHNyY3M6IFsKKyAgICAgICAgInZlbmRvci5jcHAiLAorICAgIF0sCisKKyAgICBpbml0X3JjOiBbImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2UucmMiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAorICAgICAgICAibGliYXZzZXJ2aWNlc19taW5pamFpbF92ZW5kb3IiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmNvZGVjMl9oaWRsQDEuMCIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGFyY2g6IHsKKyAgICAgICAgYXJtOiB7CisgICAgICAgICAgICByZXF1aXJlZDogWyJjb2RlYzIudmVuZG9yLmJhc2UucG9saWN5Il0sCisgICAgICAgIH0sCisgICAgICAgIHg4NjogeworICAgICAgICAgICAgcmVxdWlyZWQ6IFsiY29kZWMyLnZlbmRvci5iYXNlLnBvbGljeSJdLAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9BbmRyb2lkLm1rIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWIyOGU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvQW5kcm9pZC5tawpAQCAtMCwwICsxLDI0IEBACitMT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCisKKyMgdmVuZG9yIHNlcnZpY2Ugc2VjY29tcCBwb2xpY3kKK2lmZXEgKCQoVEFSR0VUX0FSQ0gpLCQoZmlsdGVyICQoVEFSR0VUX0FSQ0gpLCB4ODYgeDg2XzY0IGFybSBhcm02NCkpCitpbmNsdWRlICQoQ0xFQVJfVkFSUykKK0xPQ0FMX01PRFVMRSA6PSBjb2RlYzIudmVuZG9yLmJhc2UucG9saWN5CitMT0NBTF9WRU5ET1JfTU9EVUxFIDo9IHRydWUKK0xPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKK0xPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9WRU5ET1IpL2V0Yy9zZWNjb21wX3BvbGljeQorTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBjcmFzaF9kdW1wLnBvbGljeQoraWZkZWYgVEFSR0VUXzJORF9BUkNICisgICAgaWZuZXEgKCQoVEFSR0VUX1RSQU5TTEFURV8yTkRfQVJDSCksdHJ1ZSkKKyAgICAgICAgTE9DQUxfU1JDX0ZJTEVTIDo9IHNlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS0kKFRBUkdFVF8yTkRfQVJDSCkucG9saWN5CisgICAgZWxzZQorICAgICAgICBMT0NBTF9TUkNfRklMRVMgOj0gc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLSQoVEFSR0VUX0FSQ0gpLnBvbGljeQorICAgIGVuZGlmCitlbHNlCisgICAgTE9DQUxfU1JDX0ZJTEVTIDo9IHNlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS0kKFRBUkdFVF9BUkNIKS5wb2xpY3kKK2VuZGlmCitpbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCitlbmRpZgorCitpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCAkKExPQ0FMX1BBVEgpKQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlLnJjIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZS5yYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODA2YmQxZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL2FuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wLXNlcnZpY2UucmMKQEAgLTAsMCArMSw3IEBACitzZXJ2aWNlIGFuZHJvaWQtaGFyZHdhcmUtbWVkaWEtYzItaGFsLTEtMCAvdmVuZG9yL2Jpbi9ody9hbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlCisgICAgY2xhc3MgaGFsCisgICAgdXNlciBtZWRpYWNvZGVjCisgICAgZ3JvdXAgY2FtZXJhIG1lZGlhZHJtIGRybXJwYworICAgIGlvcHJpbyBydCA0CisgICAgd3JpdGVwaWQgL2Rldi9jcHVzZXQvZm9yZWdyb3VuZC90YXNrcworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIuc29mdHdhcmUuYmFzZS1hcm0ucG9saWN5IGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UtYXJtLnBvbGljeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTg3MWQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UtYXJtLnBvbGljeQpAQCAtMCwwICsxLDczIEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjIE9yZ2FuaXplZCBieSBmcmVxdWVuY3kgb2Ygc3lzdGVtY2FsbCAtIGluIGRlc2NlbmRpbmcgb3JkZXIgZm9yCisjIGJlc3QgcGVyZm9ybWFuY2UuCitmdXRleDogMQoraW9jdGw6IDEKK3dyaXRlOiAxCitwcmN0bDogMQorY2xvY2tfZ2V0dGltZTogMQorZ2V0cHJpb3JpdHk6IDEKK3JlYWQ6IDEKK2Nsb3NlOiAxCit3cml0ZXY6IDEKK2R1cDogMQorcHBvbGw6IDEKK21tYXAyOiAxCitnZXRyYW5kb206IDEKKworIyBtcmVtYXA6IEVuc3VyZSB8ZmxhZ3N8IGFyZSAoTVJFTUFQX01BWU1PVkUgfCBNUkVNQVBfRklYRUQpIFRPRE86IE9uY2UgbWluaWphaWwKKyMgcGFyc2VyIHN1cHBvcnQgZm9yICc8JyBpcyBpbiB0aGlzIG5lZWRzIHRvIGJlIG1vZGlmaWVkIHRvIGFsc28gcHJldmVudAorIyB8b2xkX2FkZHJlc3N8IGFuZCB8bmV3X2FkZHJlc3N8IGZyb20gdG91Y2hpbmcgdGhlIGV4Y2VwdGlvbiB2ZWN0b3IgcGFnZSwgd2hpY2gKKyMgb24gQVJNIGlzIHN0YXRpY2FsbHkgbG9hZGVkIGF0IDB4ZmZmZiAwMDAwLiBTZWUKKyMgaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL2luZGV4LmpzcD90b3BpYz0vY29tLmFybS5kb2MuZGRpMDIxMWgvQmFiZmVlZ2EuaHRtbAorIyBmb3IgbW9yZSBkZXRhaWxzLgorbXJlbWFwOiBhcmczID09IDMKK211bm1hcDogMQorbXByb3RlY3Q6IDEKK21hZHZpc2U6IDEKK29wZW5hdDogMQorc2lnYWx0c3RhY2s6IDEKK2Nsb25lOiAxCitzZXRwcmlvcml0eTogMQorZ2V0dWlkMzI6IDEKK2ZzdGF0NjQ6IDEKK2ZzdGF0ZnM2NDogMQorcHJlYWQ2NDogMQorZmFjY2Vzc2F0OiAxCityZWFkbGlua2F0OiAxCitleGl0OiAxCitydF9zaWdwcm9jbWFzazogMQorc2V0X3RpZF9hZGRyZXNzOiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK2V4aXRfZ3JvdXA6IDEKK3J0X3NpZ3JldHVybjogMQorcGlwZTI6IDEKK2dldHRpbWVvZmRheTogMQorc2NoZWRfeWllbGQ6IDEKK25hbm9zbGVlcDogMQorbHNlZWs6IDEKK19sbHNlZWs6IDEKK3NjaGVkX2dldF9wcmlvcml0eV9tYXg6IDEKK3NjaGVkX2dldF9wcmlvcml0eV9taW46IDEKK3N0YXRmczY0OiAxCitzY2hlZF9zZXRzY2hlZHVsZXI6IDEKK2ZzdGF0YXQ2NDogMQordWdldHJsaW1pdDogMQorZ2V0ZGVudHM2NDogMQorZ2V0cmFuZG9tOiAxCisKK0BpbmNsdWRlIC9zeXN0ZW0vZXRjL3NlY2NvbXBfcG9saWN5L2NyYXNoX2R1bXAuYXJtLnBvbGljeQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvaGlkbC9zZXJ2aWNlcy9zZWNjb21wX3BvbGljeS9jb2RlYzIuc29mdHdhcmUuYmFzZS14ODYucG9saWN5IGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UteDg2LnBvbGljeQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGM3NjI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnNvZnR3YXJlLmJhc2UteDg2LnBvbGljeQpAQCAtMCwwICsxLDU3IEBACisjIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCityZWFkOiAxCittcHJvdGVjdDogMQorcHJjdGw6IDEKK29wZW5hdDogMQorZ2V0dWlkMzI6IDEKK3dyaXRldjogMQoraW9jdGw6IDEKK2Nsb3NlOiAxCittbWFwMjogMQorZnN0YXQ2NDogMQorbWFkdmlzZTogMQorZnN0YXRhdDY0OiAxCitmdXRleDogMQorbXVubWFwOiAxCitmYWNjZXNzYXQ6IDEKK19sbHNlZWs6IDEKK2xzZWVrOiAxCitjbG9uZTogMQorc2lnYWx0c3RhY2s6IDEKK3NldHByaW9yaXR5OiAxCityZXN0YXJ0X3N5c2NhbGw6IDEKK2V4aXQ6IDEKK2V4aXRfZ3JvdXA6IDEKK3J0X3NpZ3JldHVybjogMQordWdldHJsaW1pdDogMQorcmVhZGxpbmthdDogMQorX2xsc2VlazogMQorZnN0YXRmczY0OiAxCitwcmVhZDY0OiAxCittcmVtYXA6IDEKK2R1cDogMQorc2V0X3RpZF9hZGRyZXNzOiAxCit3cml0ZTogMQorbmFub3NsZWVwOiAxCisKKyMgUmVxdWlyZWQgYnkgQWRkcmVzc1Nhbml0aXplcgorZ2V0dGlkOiAxCitzY2hlZF95aWVsZDogMQorZ2V0cGlkOiAxCitnZXR0aWQ6IDEKKworQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC54ODYucG9saWN5CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS1hcm0ucG9saWN5IGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLWFybS5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDU4NzFkMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS1hcm0ucG9saWN5CkBAIC0wLDAgKzEsNzMgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyMgT3JnYW5pemVkIGJ5IGZyZXF1ZW5jeSBvZiBzeXN0ZW1jYWxsIC0gaW4gZGVzY2VuZGluZyBvcmRlciBmb3IKKyMgYmVzdCBwZXJmb3JtYW5jZS4KK2Z1dGV4OiAxCitpb2N0bDogMQord3JpdGU6IDEKK3ByY3RsOiAxCitjbG9ja19nZXR0aW1lOiAxCitnZXRwcmlvcml0eTogMQorcmVhZDogMQorY2xvc2U6IDEKK3dyaXRldjogMQorZHVwOiAxCitwcG9sbDogMQorbW1hcDI6IDEKK2dldHJhbmRvbTogMQorCisjIG1yZW1hcDogRW5zdXJlIHxmbGFnc3wgYXJlIChNUkVNQVBfTUFZTU9WRSB8IE1SRU1BUF9GSVhFRCkgVE9ETzogT25jZSBtaW5pamFpbAorIyBwYXJzZXIgc3VwcG9ydCBmb3IgJzwnIGlzIGluIHRoaXMgbmVlZHMgdG8gYmUgbW9kaWZpZWQgdG8gYWxzbyBwcmV2ZW50CisjIHxvbGRfYWRkcmVzc3wgYW5kIHxuZXdfYWRkcmVzc3wgZnJvbSB0b3VjaGluZyB0aGUgZXhjZXB0aW9uIHZlY3RvciBwYWdlLCB3aGljaAorIyBvbiBBUk0gaXMgc3RhdGljYWxseSBsb2FkZWQgYXQgMHhmZmZmIDAwMDAuIFNlZQorIyBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvaW5kZXguanNwP3RvcGljPS9jb20uYXJtLmRvYy5kZGkwMjExaC9CYWJmZWVnYS5odG1sCisjIGZvciBtb3JlIGRldGFpbHMuCittcmVtYXA6IGFyZzMgPT0gMworbXVubWFwOiAxCittcHJvdGVjdDogMQorbWFkdmlzZTogMQorb3BlbmF0OiAxCitzaWdhbHRzdGFjazogMQorY2xvbmU6IDEKK3NldHByaW9yaXR5OiAxCitnZXR1aWQzMjogMQorZnN0YXQ2NDogMQorZnN0YXRmczY0OiAxCitwcmVhZDY0OiAxCitmYWNjZXNzYXQ6IDEKK3JlYWRsaW5rYXQ6IDEKK2V4aXQ6IDEKK3J0X3NpZ3Byb2NtYXNrOiAxCitzZXRfdGlkX2FkZHJlc3M6IDEKK3Jlc3RhcnRfc3lzY2FsbDogMQorZXhpdF9ncm91cDogMQorcnRfc2lncmV0dXJuOiAxCitwaXBlMjogMQorZ2V0dGltZW9mZGF5OiAxCitzY2hlZF95aWVsZDogMQorbmFub3NsZWVwOiAxCitsc2VlazogMQorX2xsc2VlazogMQorc2NoZWRfZ2V0X3ByaW9yaXR5X21heDogMQorc2NoZWRfZ2V0X3ByaW9yaXR5X21pbjogMQorc3RhdGZzNjQ6IDEKK3NjaGVkX3NldHNjaGVkdWxlcjogMQorZnN0YXRhdDY0OiAxCit1Z2V0cmxpbWl0OiAxCitnZXRkZW50czY0OiAxCitnZXRyYW5kb206IDEKKworQGluY2x1ZGUgL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvY3Jhc2hfZHVtcC5hcm0ucG9saWN5CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS14ODYucG9saWN5IGIvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLXg4Ni5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjBjNzYyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3NlY2NvbXBfcG9saWN5L2NvZGVjMi52ZW5kb3IuYmFzZS14ODYucG9saWN5CkBAIC0wLDAgKzEsNTcgQEAKKyMgQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3JlYWQ6IDEKK21wcm90ZWN0OiAxCitwcmN0bDogMQorb3BlbmF0OiAxCitnZXR1aWQzMjogMQord3JpdGV2OiAxCitpb2N0bDogMQorY2xvc2U6IDEKK21tYXAyOiAxCitmc3RhdDY0OiAxCittYWR2aXNlOiAxCitmc3RhdGF0NjQ6IDEKK2Z1dGV4OiAxCittdW5tYXA6IDEKK2ZhY2Nlc3NhdDogMQorX2xsc2VlazogMQorbHNlZWs6IDEKK2Nsb25lOiAxCitzaWdhbHRzdGFjazogMQorc2V0cHJpb3JpdHk6IDEKK3Jlc3RhcnRfc3lzY2FsbDogMQorZXhpdDogMQorZXhpdF9ncm91cDogMQorcnRfc2lncmV0dXJuOiAxCit1Z2V0cmxpbWl0OiAxCityZWFkbGlua2F0OiAxCitfbGxzZWVrOiAxCitmc3RhdGZzNjQ6IDEKK3ByZWFkNjQ6IDEKK21yZW1hcDogMQorZHVwOiAxCitzZXRfdGlkX2FkZHJlc3M6IDEKK3dyaXRlOiAxCituYW5vc2xlZXA6IDEKKworIyBSZXF1aXJlZCBieSBBZGRyZXNzU2FuaXRpemVyCitnZXR0aWQ6IDEKK3NjaGVkX3lpZWxkOiAxCitnZXRwaWQ6IDEKK2dldHRpZDogMQorCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLng4Ni5wb2xpY3kKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL2hpZGwvc2VydmljZXMvdmVuZG9yLmNwcCBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3ZlbmRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRlMDc5ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9oaWRsL3NlcnZpY2VzL3ZlbmRvci5jcHAKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5jMkAxLjAtc2VydmljZSIKKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsLzEuMC9Db21wb25lbnRTdG9yZS5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8bWluaWphaWwuaD4KKworI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisKKy8vIE9teFN0b3JlIGlzIGFkZGVkIGZvciB2aXNpYmlsaXR5IGJ5IGR1bXBzdGF0ZS4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmg+CisKKy8vIFRoaXMgaXMgY3JlYXRlZCBieSBtb2R1bGUgImNvZGVjMi52ZW5kb3IuYmFzZS5wb2xpY3kiLiBUaGlzIGNhbiBiZSBtb2RpZmllZC4KK3N0YXRpYyBjb25zdGV4cHIgY2hhciBrQmFzZVNlY2NvbXBQb2xpY3lQYXRoW10gPQorICAgICAgICAiL3ZlbmRvci9ldGMvc2VjY29tcF9wb2xpY3kvY29kZWMyLnZlbmRvci5iYXNlLnBvbGljeSI7CisKKy8vIEFkZGl0aW9uYWwgZGV2aWNlLXNwZWNpZmljIHNlY2NvbXAgcGVybWlzc2lvbnMgY2FuIGJlIGFkZGVkIGluIHRoaXMgZmlsZS4KK3N0YXRpYyBjb25zdGV4cHIgY2hhciBrRXh0U2VjY29tcFBvbGljeVBhdGhbXSA9CisgICAgICAgICIvdmVuZG9yL2V0Yy9zZWNjb21wX3BvbGljeS9jb2RlYzIudmVuZG9yLmV4dC5wb2xpY3kiOworCitjbGFzcyBTdG9yZUltcGwgOiBwdWJsaWMgQzJDb21wb25lbnRTdG9yZSB7CitwdWJsaWM6CisgICAgU3RvcmVJbXBsKCkKKyAgICAgICAgOiBtUmVmbGVjdG9ySGVscGVyKHN0ZDo6bWFrZV9zaGFyZWQ8QzJSZWZsZWN0b3JIZWxwZXI+KCkpLAorICAgICAgICAgIG1JbnRlcmZhY2UobVJlZmxlY3RvckhlbHBlcikgeworICAgIH0KKworICAgIHZpcnR1YWwgflN0b3JlSW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuICJkZWZhdWx0IjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIEMyU3RyaW5nIC8qbmFtZSovLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgLypjb21wb25lbnQqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgQzJTdHJpbmcgLyogbmFtZSAqLywKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4qIGNvbnN0IC8qIGludGVyZmFjZSAqLykgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PgorICAgICAgICAgICAgbGlzdENvbXBvbmVudHMoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiB7fTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNvcHlCdWZmZXIoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiAvKiBzcmMgKi8sCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiAvKiBkc3QgKi8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV9zbSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiBzdGFja1BhcmFtcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+JiBoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+KiBjb25zdCBoZWFwUGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50ZXJmYWNlLnF1ZXJ5KHN0YWNrUGFyYW1zLCBoZWFwUGFyYW1JbmRpY2VzLCBDMl9NQVlfQkxPQ0ssIGhlYXBQYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+JiBwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtSW50ZXJmYWNlLmNvbmZpZyhwYXJhbXMsIEMyX01BWV9CTE9DSywgZmFpbHVyZXMpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFBhcmFtUmVmbGVjdG9yKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbVJlZmxlY3RvckhlbHBlcjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4qIGNvbnN0IHBhcmFtcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUludGVyZmFjZS5xdWVyeVN1cHBvcnRlZFBhcmFtcyhwYXJhbXMpOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20oCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+JiBmaWVsZHMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1JbnRlcmZhY2UucXVlcnlTdXBwb3J0ZWRWYWx1ZXMoZmllbGRzLCBDMl9NQVlfQkxPQ0spOworICAgIH0KKworcHJpdmF0ZToKKyAgICBjbGFzcyBJbnRlcmZhY2UgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgSW50ZXJmYWNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gJmhlbHBlcikKKyAgICAgICAgICAgIDogQzJJbnRlcmZhY2VIZWxwZXIoaGVscGVyKSB7CisgICAgICAgICAgICBzZXREZXJpdmVkSW5zdGFuY2UodGhpcyk7CisKKyAgICAgICAgICAgIGFkZFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICBEZWZpbmVQYXJhbShtSW9uVXNhZ2VJbmZvLCAiaW9uLXVzYWdlIikKKyAgICAgICAgICAgICAgICAud2l0aERlZmF1bHQobmV3IEMyU3RvcmVJb25Vc2FnZUluZm8oKSkKKyAgICAgICAgICAgICAgICAud2l0aEZpZWxkcyh7CisgICAgICAgICAgICAgICAgICAgIEMyRihtSW9uVXNhZ2VJbmZvLCB1c2FnZSkuZmxhZ3MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAge0MyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEIHwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtSW9uVXNhZ2VJbmZvLCBjYXBhY2l0eSkuaW5SYW5nZSgwLCBVSU5UMzJfTUFYLCAxMDI0KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Jb25Vc2FnZUluZm8sIGhlYXBNYXNrKS5hbnkoKSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Jb25Vc2FnZUluZm8sIGFsbG9jRmxhZ3MpLmZsYWdzKHt9KSwKKyAgICAgICAgICAgICAgICAgICAgQzJGKG1Jb25Vc2FnZUluZm8sIG1pbkFsaWdubWVudCkuZXF1YWxUbygwKQorICAgICAgICAgICAgICAgIH0pCisgICAgICAgICAgICAgICAgLndpdGhTZXR0ZXIoU2V0SW9uVXNhZ2UpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCB+SW50ZXJmYWNlKCkgPSBkZWZhdWx0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RhdGljIEMyUiBTZXRJb25Vc2FnZShib29sIC8qIG1heUJsb2NrICovLCBDMlA8QzJTdG9yZUlvblVzYWdlSW5mbz4gJm1lKSB7CisgICAgICAgICAgICAvLyBWZW5kb3IncyBUT0RPOiBwdXQgYXBwcm9wcmlhdGUgbWFwcGluZyBsb2dpYworICAgICAgICAgICAgbWUuc2V0KCkuaGVhcE1hc2sgPSB+MDsKKyAgICAgICAgICAgIG1lLnNldCgpLmFsbG9jRmxhZ3MgPSAwOworICAgICAgICAgICAgbWUuc2V0KCkubWluQWxpZ25tZW50ID0gMDsKKyAgICAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdG9yZUlvblVzYWdlSW5mbz4gbUlvblVzYWdlSW5mbzsKKyAgICB9OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbVJlZmxlY3RvckhlbHBlcjsKKyAgICBJbnRlcmZhY2UgbUludGVyZmFjZTsKK307CisKK2ludCBtYWluKGludCAvKiBhcmdjICovLCBjaGFyKiogLyogYXJndiAqLykgeworICAgIEFMT0dEKCJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMC1zZXJ2aWNlIHN0YXJ0aW5nLi4uIik7CisKKyAgICBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7CisgICAgYW5kcm9pZDo6U2V0VXBNaW5pamFpbChrQmFzZVNlY2NvbXBQb2xpY3lQYXRoLCBrRXh0U2VjY29tcFBvbGljeVBhdGgpOworCisgICAgLy8gdm5kYmluZGVyIGlzIG5lZWRlZCBieSBCdWZmZXJRdWV1ZS4KKyAgICBhbmRyb2lkOjpQcm9jZXNzU3RhdGU6OmluaXRXaXRoRHJpdmVyKCIvZGV2L3ZuZGJpbmRlciIpOworICAgIGFuZHJvaWQ6OlByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKKworICAgIC8vIEV4dHJhIHRocmVhZHMgbWF5IGJlIG5lZWRlZCB0byBoYW5kbGUgYSBzdGFja2VkIElQQyBzZXF1ZW5jZSB0aGF0CisgICAgLy8gY29udGFpbnMgYWx0ZXJuYXRpbmcgYmluZGVyIGFuZCBod2JpbmRlciBjYWxscy4gKFNlZSBiLzM1MjgzNDgwLikKKyAgICBhbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCg4LCB0cnVlIC8qIGNhbGxlcldpbGxKb2luICovKTsKKworICAgIC8vIENyZWF0ZSBJQ29tcG9uZW50U3RvcmUgc2VydmljZS4KKyAgICB7CisgICAgICAgIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YzI6OlYxXzA7CisgICAgICAgIGFuZHJvaWQ6OnNwPElDb21wb25lbnRTdG9yZT4gc3RvcmU7CisKKyAgICAgICAgLy8gVmVuZG9yJ3MgVE9ETzogUmVwbGFjZSB0aGlzIHdpdGgKKyAgICAgICAgLy8gc3RvcmUgPSBuZXcgdXRpbHM6OkNvbXBvbmVudFN0b3JlKAorICAgICAgICAvLyAgICAgICAgIC8qIGltcGxlbWVudGF0aW9uIG9mIEMyQ29tcG9uZW50U3RvcmUgKi8pOworICAgICAgICBBTE9HRCgiSW5zdGFudGlhdGluZyBDb2RlYzIncyBkdW1teSBJQ29tcG9uZW50U3RvcmUgc2VydmljZS4uLiIpOworICAgICAgICBzdG9yZSA9IG5ldyB1dGlsczo6Q29tcG9uZW50U3RvcmUoCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxTdG9yZUltcGw+KCkpOworCisgICAgICAgIGlmIChzdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSBDb2RlYzIncyBJQ29tcG9uZW50U3RvcmUgc2VydmljZS4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChzdG9yZS0+cmVnaXN0ZXJBc1NlcnZpY2UoImRlZmF1bHQiKSAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgcmVnaXN0ZXIgQ29kZWMyJ3MgIgorICAgICAgICAgICAgICAgICAgICAgICAgIklDb21wb25lbnRTdG9yZSBzZXJ2aWNlLiIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiQ29kZWMyJ3MgSUNvbXBvbmVudFN0b3JlIHNlcnZpY2UgY3JlYXRlZC4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlZ2lzdGVyIElPbXhTdG9yZSBzZXJ2aWNlLgorICAgIHsKKyAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7CisgICAgICAgIGFuZHJvaWQ6OnNwPElPbXhTdG9yZT4gb214U3RvcmUgPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teFN0b3JlKCk7CisgICAgICAgIGlmIChvbXhTdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGNyZWF0ZSBJT214U3RvcmUgSEFMIHNlcnZpY2UuIik7CisgICAgICAgIH0gZWxzZSBpZiAob214U3RvcmUtPnJlZ2lzdGVyQXNTZXJ2aWNlKCkgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgcmVnaXN0ZXIgSU9teFN0b3JlIEhBTCBzZXJ2aWNlLiIpOworICAgICAgICB9CisgICAgfQorCisgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmpvaW5ScGNUaHJlYWRwb29sKCk7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNTc2YzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQW5kcm9pZC5icApAQCAtMCwwICsxLDY0IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYnNmcGx1Z2luX2Njb2RlYyIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMk9NWE5vZGUuY3BwIiwKKyAgICAgICAgIkNDb2RlYy5jcHAiLAorICAgICAgICAiQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAiLAorICAgICAgICAiQ0NvZGVjQnVmZmVycy5jcHAiLAorICAgICAgICAiQ0NvZGVjQ29uZmlnLmNwcCIsCisgICAgICAgICJDb2RlYzJCdWZmZXIuY3BwIiwKKyAgICAgICAgIkNvZGVjMkluZm9CdWlsZGVyLmNwcCIsCisgICAgICAgICJPbXgySUdyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIiwKKyAgICAgICAgIlBpcGVsaW5lV2F0Y2hlci5jcHAiLAorICAgICAgICAiUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmNwcCIsCisgICAgICAgICJTa2lwQ3V0QnVmZmVyLmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfaW50ZXJuYWwiLAorICAgICAgICAibGlibWVkaWFkcm1faGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzJAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX2NsaWVudCIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFfY29kZWNsaXN0IiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWNfdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYnVmZmVycXVldWVfaGVscGVyIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2NvZGVjYmFzZSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXhfdXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfeG1scGFyc2VyIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGQyMjFlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0MyT01YTm9kZS5jcHAKQEAgLTAsMCArMSw0NjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZkZWYgX19MUDY0X18KKyNkZWZpbmUgT01YX0FORFJPSURfQ09NUElMRV9BU18zMkJJVF9PTl82NEJJVF9QTEFURk9STVMKKyNlbmRpZgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyT01YTm9kZSIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKKyNpbmNsdWRlIDxPTVhfQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4Lmg+CisjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2Zkc2FuLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1aS9GZW5jZS5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KKworI2luY2x1ZGUgIkMyT01YTm9kZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIEJ1ZmZlcjJEIDogcHVibGljIEMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBCdWZmZXIyRChDMkNvbnN0R3JhcGhpY0Jsb2NrIGJsb2NrKSA6IEMyQnVmZmVyKHsgYmxvY2sgfSkge30KK307CisKK30gIC8vIG5hbWVzcGFjZQorCitjbGFzcyBDMk9NWE5vZGU6OlF1ZXVlVGhyZWFkIDogcHVibGljIFRocmVhZCB7CitwdWJsaWM6CisgICAgUXVldWVUaHJlYWQoKSA6IFRocmVhZChmYWxzZSkge30KKyAgICB+UXVldWVUaHJlYWQoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisgICAgdm9pZCBxdWV1ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXAsCisgICAgICAgICAgICBpbnQgZmVuY2VGZCwKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICYmd29yaywKKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCAmJmZkMCwKKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCAmJmZkMSkgeworICAgICAgICBNdXRleGVkPEpvYnM+OjpMb2NrZWQgam9icyhtSm9icyk7CisgICAgICAgIGF1dG8gaXQgPSBqb2JzLT5xdWV1ZXMudHJ5X2VtcGxhY2UoY29tcCwgY29tcCwgc3lzdGVtVGltZSgpKS5maXJzdDsKKyAgICAgICAgaXQtPnNlY29uZC53b3JrTGlzdC5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHdvcmspLCBmZW5jZUZkLCBzdGQ6Om1vdmUoZmQwKSwgc3RkOjptb3ZlKGZkMSkpOworICAgICAgICBqb2JzLT5jb25kLmJyb2FkY2FzdCgpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGJvb2wgdGhyZWFkTG9vcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgY29uc3RleHByIG5zZWNzX3Qga0ludGVydmFsTnMgPSBuc2Vjc190KDEwKSAqIDEwMDAgKiAxMDAwOyAgLy8gMTBtcworICAgICAgICBjb25zdGV4cHIgbnNlY3NfdCBrV2FpdE5zID0ga0ludGVydmFsTnMgKiAyOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgeworICAgICAgICAgICAgTXV0ZXhlZDxKb2JzPjo6TG9ja2VkIGpvYnMobUpvYnMpOworICAgICAgICAgICAgbnNlY3NfdCBub3dOcyA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgICAgIGJvb2wgcXVldWVkID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBqb2JzLT5xdWV1ZXMuYmVnaW4oKTsgaXQgIT0gam9icy0+cXVldWVzLmVuZCgpOyApIHsKKyAgICAgICAgICAgICAgICBRdWV1ZSAmcXVldWUgPSBpdC0+c2Vjb25kOworICAgICAgICAgICAgICAgIGlmIChxdWV1ZS53b3JrTGlzdC5lbXB0eSgpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBub3dOcyAtIHF1ZXVlLmxhc3RRdWV1ZWRUaW1lc3RhbXBOcyA8IGtJbnRlcnZhbE5zKSB7CisgICAgICAgICAgICAgICAgICAgICsraXQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXAgPSBxdWV1ZS5jb21wb25lbnQubG9jaygpOworICAgICAgICAgICAgICAgIGlmICghY29tcCkgeworICAgICAgICAgICAgICAgICAgICBpdCA9IGpvYnMtPnF1ZXVlcy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGl0ZW1zOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gZmVuY2VGZHM7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkPiB1bmlxdWVGZHM7CisgICAgICAgICAgICAgICAgd2hpbGUgKCFxdWV1ZS53b3JrTGlzdC5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGl0ZW1zLnB1c2hfYmFjayhzdGQ6Om1vdmUocXVldWUud29ya0xpc3QuZnJvbnQoKS53b3JrKSk7CisgICAgICAgICAgICAgICAgICAgIGZlbmNlRmRzLnB1c2hfYmFjayhxdWV1ZS53b3JrTGlzdC5mcm9udCgpLmZlbmNlRmQpOworICAgICAgICAgICAgICAgICAgICB1bmlxdWVGZHMucHVzaF9iYWNrKHN0ZDo6bW92ZShxdWV1ZS53b3JrTGlzdC5mcm9udCgpLmZkMCkpOworICAgICAgICAgICAgICAgICAgICB1bmlxdWVGZHMucHVzaF9iYWNrKHN0ZDo6bW92ZShxdWV1ZS53b3JrTGlzdC5mcm9udCgpLmZkMSkpOworICAgICAgICAgICAgICAgICAgICBxdWV1ZS53b3JrTGlzdC5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBqb2JzLnVubG9jaygpOworICAgICAgICAgICAgICAgIGZvciAoaW50IGZlbmNlRmQgOiBmZW5jZUZkcykgeworICAgICAgICAgICAgICAgICAgICBzcDxGZW5jZT4gZmVuY2UobmV3IEZlbmNlKGZlbmNlRmQpKTsKKyAgICAgICAgICAgICAgICAgICAgZmVuY2UtPndhaXRGb3JldmVyKExPR19UQUcpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb21wLT5xdWV1ZSgmaXRlbXMpOworICAgICAgICAgICAgICAgIGZvciAoYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkICZ1ZmQgOiB1bmlxdWVGZHMpIHsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpdWZkLnJlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgam9icy5sb2NrKCk7CisKKyAgICAgICAgICAgICAgICBpdCA9IGpvYnMtPnF1ZXVlcy51cHBlcl9ib3VuZChjb21wKTsKKyAgICAgICAgICAgICAgICBxdWV1ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHF1ZXVlZCkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgICAgIGpvYnMud2FpdEZvckNvbmRpdGlvblJlbGF0aXZlKGpvYnMtPmNvbmQsIGtXYWl0TnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgV29ya0ZlbmNlIHsKKyAgICAgICAgV29ya0ZlbmNlKHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICYmdywgaW50IGZkKSA6IHdvcmsoc3RkOjptb3ZlKHcpKSwgZmVuY2VGZChmZCkge30KKworICAgICAgICBXb3JrRmVuY2UoCisgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJiZ3LAorICAgICAgICAgICAgICAgIGludCBmZCwKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjp1bmlxdWVfZmQgJiZ1bmlxdWVGZDAsCisgICAgICAgICAgICAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkICYmdW5pcXVlRmQxKQorICAgICAgICAgICAgOiB3b3JrKHN0ZDo6bW92ZSh3KSksCisgICAgICAgICAgICAgIGZlbmNlRmQoZmQpLAorICAgICAgICAgICAgICBmZDAoc3RkOjptb3ZlKHVuaXF1ZUZkMCkpLAorICAgICAgICAgICAgICBmZDEoc3RkOjptb3ZlKHVuaXF1ZUZkMSkpIHt9CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yazsKKyAgICAgICAgaW50IGZlbmNlRmQ7CisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZDA7CisgICAgICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZDE7CisgICAgfTsKKyAgICBzdHJ1Y3QgUXVldWUgeworICAgICAgICBRdWV1ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wLCBuc2Vjc190IHRpbWVzdGFtcCkKKyAgICAgICAgICAgIDogY29tcG9uZW50KGNvbXApLCBsYXN0UXVldWVkVGltZXN0YW1wTnModGltZXN0YW1wKSB7fQorICAgICAgICBRdWV1ZShjb25zdCBRdWV1ZSAmKSA9IGRlbGV0ZTsKKyAgICAgICAgUXVldWUgJm9wZXJhdG9yID0oY29uc3QgUXVldWUgJikgPSBkZWxldGU7CisKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcG9uZW50OworICAgICAgICBzdGQ6Omxpc3Q8V29ya0ZlbmNlPiB3b3JrTGlzdDsKKyAgICAgICAgbnNlY3NfdCBsYXN0UXVldWVkVGltZXN0YW1wTnM7CisgICAgfTsKKyAgICBzdHJ1Y3QgSm9icyB7CisgICAgICAgIHN0ZDo6bWFwPHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+LAorICAgICAgICAgICAgICAgICBRdWV1ZSwKKyAgICAgICAgICAgICAgICAgc3RkOjpvd25lcl9sZXNzPHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+Pj4gcXVldWVzOworICAgICAgICBDb25kaXRpb24gY29uZDsKKyAgICB9OworICAgIE11dGV4ZWQ8Sm9icz4gbUpvYnM7Cit9OworCitDMk9NWE5vZGU6OkMyT01YTm9kZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKQorICAgIDogbUNvbXAoY29tcCksIG1GcmFtZUluZGV4KDApLCBtV2lkdGgoMCksIG1IZWlnaHQoMCksIG1Vc2FnZSgwKSwKKyAgICAgIG1BZGp1c3RUaW1lc3RhbXBHYXBVcygwKSwgbUZpcnN0SW5wdXRGcmFtZSh0cnVlKSwKKyAgICAgIG1RdWV1ZVRocmVhZChuZXcgUXVldWVUaHJlYWQpIHsKKyAgICBhbmRyb2lkX2Zkc2FuX3NldF9lcnJvcl9sZXZlbChBTkRST0lEX0ZEU0FOX0VSUk9SX0xFVkVMX1dBUk5fQUxXQVlTKTsKKyAgICBtUXVldWVUaHJlYWQtPnJ1bigiQzJPTVhOb2RlIiwgUFJJT1JJVFlfQVVESU8pOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmZyZWVOb2RlKCkgeworICAgIG1Db21wLnJlc2V0KCk7CisgICAgYW5kcm9pZF9mZHNhbl9zZXRfZXJyb3JfbGV2ZWwoQU5EUk9JRF9GRFNBTl9FUlJPUl9MRVZFTF9XQVJOX09OQ0UpOworICAgIHJldHVybiBtUXVldWVUaHJlYWQtPnJlcXVlc3RFeGl0QW5kV2FpdCgpOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OnNlbmRDb21tYW5kKE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9TMzIgcGFyYW0pIHsKKyAgICBpZiAoY21kID09IE9NWF9Db21tYW5kU3RhdGVTZXQgJiYgcGFyYW0gPT0gT01YX1N0YXRlTG9hZGVkKSB7CisgICAgICAgIC8vIFJlc2V0IGZpcnN0IGlucHV0IGZyYW1lIHNvIGlmIEMyT01YTm9kZSBpcyByZWN5Y2xlZCwgdGhlIHRpbWVzdGFtcCBkb2VzIG5vdCBiZWNvbWUKKyAgICAgICAgLy8gbmVnYXRpdmUuIFRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciBIVyBjb2RlY3MgdGhhdCBkbyBub3QgaGFuZGxlIHRpbWVzdGFtcCByb2xsb3Zlci4KKyAgICAgICAgbUZpcnN0SW5wdXRGcmFtZSA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpnZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgeworICAgIHN0YXR1c190IGVyciA9IEVSUk9SX1VOU1VQUE9SVEVEOworICAgIHN3aXRjaCAoKHVpbnQzMl90KWluZGV4KSB7CisgICAgICAgIGNhc2UgT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0czogeworICAgICAgICAgICAgT01YX1UzMiAqdXNhZ2UgPSAoT01YX1UzMiAqKXBhcmFtczsKKyAgICAgICAgICAgICp1c2FnZSA9IG1Vc2FnZTsKKyAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbVBvcnREZWZpbml0aW9uOiB7CisgICAgICAgICAgICBpZiAoc2l6ZSA8IHNpemVvZihPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFICpwRGVmID0gKE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKilwYXJhbXM7CisgICAgICAgICAgICAvLyBUT0RPOiByZWFkIHRoZXNlIGZyb20gaW50ZigpCisgICAgICAgICAgICBwRGVmLT5uQnVmZmVyQ291bnRBY3R1YWwgPSAxNjsKKyAgICAgICAgICAgIHBEZWYtPmVEb21haW4gPSBPTVhfUG9ydERvbWFpblZpZGVvOworICAgICAgICAgICAgcERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoID0gbVdpZHRoOworICAgICAgICAgICAgcERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG1IZWlnaHQ7CisgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpzZXRQYXJhbWV0ZXIoT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3Qgdm9pZCAqcGFyYW1zLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChwYXJhbXMgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzd2l0Y2ggKCh1aW50MzJfdClpbmRleCkgeworICAgICAgICBjYXNlIE9NWF9JbmRleFBhcmFtTWF4RnJhbWVEdXJhdGlvbkZvckJpdHJhdGVDb250cm9sOgorICAgICAgICAgICAgLy8gaGFuZGxlIG1heC9maXhlZCBmcmFtZSBkdXJhdGlvbiBjb250cm9sCisgICAgICAgICAgICBpZiAoc2l6ZSAhPSBzaXplb2YoT01YX1BBUkFNX1UzMlRZUEUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRoZSBpbmNvbWluZyBudW1iZXIgaXMgYW4gaW50MzJfdCBjb250YWluZWQgaW4gT01YX1UzMi4KKyAgICAgICAgICAgIG1BZGp1c3RUaW1lc3RhbXBHYXBVcyA9IChpbnQzMl90KSgoT01YX1BBUkFNX1UzMlRZUEUqKXBhcmFtcyktPm5VMzI7CisgICAgICAgICAgICByZXR1cm4gT0s7CisKKyAgICAgICAgY2FzZSBPTVhfSW5kZXhQYXJhbUNvbnN1bWVyVXNhZ2VCaXRzOgorICAgICAgICAgICAgaWYgKHNpemUgIT0gc2l6ZW9mKE9NWF9VMzIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Vc2FnZSA9ICooKE9NWF9VMzIgKilwYXJhbXMpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6Z2V0Q29uZmlnKE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKmNvbmZpZywgc2l6ZV90IHNpemUpIHsKKyAgICAodm9pZClpbmRleDsKKyAgICAodm9pZCljb25maWc7CisgICAgKHZvaWQpc2l6ZTsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6c2V0Q29uZmlnKE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKmNvbmZpZywgc2l6ZV90IHNpemUpIHsKKyAgICAodm9pZClpbmRleDsKKyAgICAodm9pZCljb25maWc7CisgICAgKHZvaWQpc2l6ZTsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6c2V0UG9ydE1vZGUoT01YX1UzMiBwb3J0SW5kZXgsIElPTVg6OlBvcnRNb2RlIG1vZGUpIHsKKyAgICAodm9pZClwb3J0SW5kZXg7CisgICAgKHZvaWQpbW9kZTsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6cHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCisgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBPTVhfQk9PTCBlbmFibGUsCisgICAgICAgIE9NWF9VMzIgbWF4RnJhbWVXaWR0aCwgT01YX1UzMiBtYXhGcmFtZUhlaWdodCkgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZCllbmFibGU7CisgICAgKHZvaWQpbWF4RnJhbWVXaWR0aDsKKyAgICAodm9pZCltYXhGcmFtZUhlaWdodDsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6Y29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgIE9NWF9VMzIgYXVkaW9Id1N5bmMsIG5hdGl2ZV9oYW5kbGVfdCAqKnNpZGViYW5kSGFuZGxlKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICh2b2lkKXR1bm5lbGVkOworICAgICh2b2lkKWF1ZGlvSHdTeW5jOworICAgICpzaWRlYmFuZEhhbmRsZSA9IG51bGxwdHI7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmdldEdyYXBoaWNCdWZmZXJVc2FnZShPTVhfVTMyIHBvcnRJbmRleCwgT01YX1UzMiogdXNhZ2UpIHsKKyAgICAodm9pZClwb3J0SW5kZXg7CisgICAgKnVzYWdlID0gMDsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6c2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPElPTVhCdWZmZXJTb3VyY2U+ICZidWZmZXJTb3VyY2UpIHsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCktPmZldGNoQWxsb2NhdG9yKAorICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DLAorICAgICAgICAgICAgJm1BbGxvY2F0b3IpOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIG1CdWZmZXJTb3VyY2UgPSBidWZmZXJTb3VyY2U7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmFsbG9jYXRlU2VjdXJlQnVmZmVyKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgc2l6ZV90IHNpemUsIGJ1ZmZlcl9pZCAqYnVmZmVyLAorICAgICAgICB2b2lkICoqYnVmZmVyRGF0YSwgc3A8TmF0aXZlSGFuZGxlPiAqbmF0aXZlSGFuZGxlKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICh2b2lkKXNpemU7CisgICAgKHZvaWQpbmF0aXZlSGFuZGxlOworICAgICpidWZmZXIgPSAwOworICAgICpidWZmZXJEYXRhID0gbnVsbHB0cjsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6dXNlQnVmZmVyKAorICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgY29uc3QgT01YQnVmZmVyICZvbXhCdWYsIGJ1ZmZlcl9pZCAqYnVmZmVyKSB7CisgICAgKHZvaWQpcG9ydEluZGV4OworICAgICh2b2lkKW9teEJ1ZjsKKyAgICAqYnVmZmVyID0gMDsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6ZnJlZUJ1ZmZlcihPTVhfVTMyIHBvcnRJbmRleCwgYnVmZmVyX2lkIGJ1ZmZlcikgeworICAgICh2b2lkKXBvcnRJbmRleDsKKyAgICAodm9pZClidWZmZXI7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmZpbGxCdWZmZXIoCisgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIsIGNvbnN0IE9NWEJ1ZmZlciAmb214QnVmLCBpbnQgZmVuY2VGZCkgeworICAgICh2b2lkKWJ1ZmZlcjsKKyAgICAodm9pZClvbXhCdWY7CisgICAgKHZvaWQpZmVuY2VGZDsKKyAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Cit9CisKK3N0YXR1c190IEMyT01YTm9kZTo6ZW1wdHlCdWZmZXIoCisgICAgICAgIGJ1ZmZlcl9pZCBidWZmZXIsIGNvbnN0IE9NWEJ1ZmZlciAmb214QnVmLAorICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcCA9IG1Db21wLmxvY2soKTsKKyAgICBpZiAoIWNvbXApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgdWludDMyX3QgYzJGbGFncyA9IChmbGFncyAmIE9NWF9CVUZGRVJGTEFHX0VPUykKKyAgICAgICAgICAgID8gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTSA6IDA7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKworICAgIGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCBmZDAsIGZkMTsKKyAgICBDMkhhbmRsZSAqaGFuZGxlID0gbnVsbHB0cjsKKyAgICBpZiAob214QnVmLm1CdWZmZXJUeXBlID09IE9NWEJ1ZmZlcjo6a0J1ZmZlclR5cGVBTldCdWZmZXIKKyAgICAgICAgICAgICYmIG9teEJ1Zi5tR3JhcGhpY0J1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgaGFuZGxlID0gV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgICAgICAgICAgb214QnVmLm1HcmFwaGljQnVmZmVyLT5oYW5kbGUsCisgICAgICAgICAgICAgICAgb214QnVmLm1HcmFwaGljQnVmZmVyLT53aWR0aCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPmZvcm1hdCwKKyAgICAgICAgICAgICAgICBvbXhCdWYubUdyYXBoaWNCdWZmZXItPnVzYWdlLAorICAgICAgICAgICAgICAgIG9teEJ1Zi5tR3JhcGhpY0J1ZmZlci0+c3RyaWRlKTsKKyAgICAgICAgaWYgKGhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyB1bmlxdWVfZmQgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBmZHMsIHdlJ2xsIGdldCB3YXJuaW5nIGlmIHRoZXNlCisgICAgICAgICAgICAvLyBmZHMgZ2V0IGNsb3NlZCBieSBzb21lYm9keSBlbHNlLiBPbndlcnNoaXAgd2lsbCBiZSByZWxlYXNlZCBiZWZvcmUKKyAgICAgICAgICAgIC8vIHdlIHJldHVybiwgc28gdGhhdCB0aGUgZmRzIGdldCBjbG9zZWQgYXMgdXN1YWxseSB3aGVuIHRoaXMgZnVuY3Rpb24KKyAgICAgICAgICAgIC8vIGdvZXMgb3V0IG9mIHNjb3BlICh3aGVuIGJvdGggaXRlbXMgYW5kIGJsb2NrIGFyZSBnb25lKS4KKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqbmF0aXZlSGFuZGxlID0gcmVpbnRlcnByZXRfY2FzdDxuYXRpdmVfaGFuZGxlX3QqPihoYW5kbGUpOworICAgICAgICAgICAgZmQwLnJlc2V0KG5hdGl2ZUhhbmRsZS0+bnVtRmRzID4gMCA/IG5hdGl2ZUhhbmRsZS0+ZGF0YVswXSA6IC0xKTsKKyAgICAgICAgICAgIGZkMS5yZXNldChuYXRpdmVIYW5kbGUtPm51bUZkcyA+IDEgPyBuYXRpdmVIYW5kbGUtPmRhdGFbMV0gOiAtMSk7CisgICAgICAgIH0KKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICh2b2lkKWZkMC5yZWxlYXNlKCk7CisgICAgICAgICAgICAodm9pZClmZDEucmVsZWFzZSgpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYyk7CisgICAgfSBlbHNlIGlmICghKGZsYWdzICYgT01YX0JVRkZFUkZMQUdfRU9TKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmsobmV3IEMyV29yayk7CisgICAgd29yay0+aW5wdXQuZmxhZ3MgPSAoQzJGcmFtZURhdGE6OmZsYWdzX3QpYzJGbGFnczsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKworICAgIC8vIFdPUktBUk9VTkQ6IGFkanVzdCB0aW1lc3RhbXAgYmFzZWQgb24gZ2FwVXMKKyAgICB7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbCA9IHRpbWVzdGFtcDsgLy8gc2F2ZSBpbnB1dCB0aW1lc3RhbXAKKyAgICAgICAgaWYgKG1GaXJzdElucHV0RnJhbWUpIHsKKyAgICAgICAgICAgIC8vIGdyYWIgdGltZXN0YW1wcyBvbiBmaXJzdCBmcmFtZQorICAgICAgICAgICAgbVByZXZJbnB1dFRpbWVzdGFtcCA9IHRpbWVzdGFtcDsKKyAgICAgICAgICAgIG1QcmV2Q29kZWNUaW1lc3RhbXAgPSB0aW1lc3RhbXA7CisgICAgICAgICAgICBtRmlyc3RJbnB1dEZyYW1lID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSBpZiAobUFkanVzdFRpbWVzdGFtcEdhcFVzID4gMCkgeworICAgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPQorICAgICAgICAgICAgICAgIG1QcmV2Q29kZWNUaW1lc3RhbXAKKyAgICAgICAgICAgICAgICAgICAgICAgICsgYzJfbWluKCh0aW1lc3RhbXAgLSBtUHJldklucHV0VGltZXN0YW1wKS5wZWVrKCksIG1BZGp1c3RUaW1lc3RhbXBHYXBVcyk7CisgICAgICAgIH0gZWxzZSBpZiAobUFkanVzdFRpbWVzdGFtcEdhcFVzIDwgMCkgeworICAgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSBtUHJldkNvZGVjVGltZXN0YW1wIC0gbUFkanVzdFRpbWVzdGFtcEdhcFVzOworICAgICAgICB9CisgICAgICAgIG1QcmV2SW5wdXRUaW1lc3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWw7CisgICAgICAgIG1QcmV2Q29kZWNUaW1lc3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcDsKKyAgICAgICAgQUxPR1YoImFkanVzdGluZyAlbGxkIHRvICVsbGQgKGdhcD0lbGxkKSIsCisgICAgICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbC5wZWVrbGwoKSwKKyAgICAgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAucGVla2xsKCksCisgICAgICAgICAgICAgIChsb25nIGxvbmcpbUFkanVzdFRpbWVzdGFtcEdhcFVzKTsKKyAgICB9CisKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBtRnJhbWVJbmRleCsrOworICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICBpZiAoYmxvY2spIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjMkJ1ZmZlcigKKyAgICAgICAgICAgICAgICBuZXcgQnVmZmVyMkQoYmxvY2stPnNoYXJlKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJSZWN0KGJsb2NrLT53aWR0aCgpLCBibG9jay0+aGVpZ2h0KCkpLCA6OkMyRmVuY2UoKSkpKTsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5wdXNoX2JhY2soYzJCdWZmZXIpOworICAgIH0KKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKyAgICBtQnVmZmVySWRzSW5Vc2UubG9jaygpLT5lbXBsYWNlKHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleC5wZWVrdSgpLCBidWZmZXIpOworICAgIG1RdWV1ZVRocmVhZC0+cXVldWUoY29tcCwgZmVuY2VGZCwgc3RkOjptb3ZlKHdvcmspLCBzdGQ6Om1vdmUoZmQwKSwgc3RkOjptb3ZlKGZkMSkpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDMk9NWE5vZGU6OmdldEV4dGVuc2lvbkluZGV4KAorICAgICAgICBjb25zdCBjaGFyICpwYXJhbWV0ZXJOYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCkgeworICAgICh2b2lkKXBhcmFtZXRlck5hbWU7CisgICAgKmluZGV4ID0gT01YX0luZGV4TWF4OworICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgQzJPTVhOb2RlOjpkaXNwYXRjaE1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UmIG1zZykgeworICAgIGlmIChtc2cudHlwZSAhPSBvbXhfbWVzc2FnZTo6RVZFTlQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKyAgICBpZiAobXNnLnUuZXZlbnRfZGF0YS5ldmVudCAhPSBPTVhfRXZlbnREYXRhU3BhY2VDaGFuZ2VkKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlID0gKGFuZHJvaWRfZGF0YXNwYWNlKW1zZy51LmV2ZW50X2RhdGEuZGF0YTE7CisgICAgdWludDMyX3QgcGl4ZWxGb3JtYXQgPSBtc2cudS5ldmVudF9kYXRhLmRhdGEzOworCisgICAgLy8gVE9ETzogc2V0IGRhdGFzcGFjZSBvbiBjb21wb25lbnQgdG8gc2VlIGlmIGl0IGltcGFjdHMgY29sb3IgYXNwZWN0cworICAgIEFMT0dEKCJkYXRhc3BhY2UgY2hhbmdlZCB0byAlI3ggcGl4ZWwgZm9ybWF0OiAlI3giLCBkYXRhU3BhY2UsIHBpeGVsRm9ybWF0KTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3NwPElPTVhCdWZmZXJTb3VyY2U+IEMyT01YTm9kZTo6Z2V0U291cmNlKCkgeworICAgIHJldHVybiBtQnVmZmVyU291cmNlOworfQorCit2b2lkIEMyT01YTm9kZTo6c2V0RnJhbWVTaXplKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICBtV2lkdGggPSB3aWR0aDsKKyAgICBtSGVpZ2h0ID0gaGVpZ2h0OworfQorCit2b2lkIEMyT01YTm9kZTo6b25JbnB1dEJ1ZmZlckRvbmUoYzJfY250cjY0X3QgaW5kZXgpIHsKKyAgICBpZiAoIW1CdWZmZXJTb3VyY2UpIHsKKyAgICAgICAgQUxPR0QoIkJ1ZmZlciBzb3VyY2Ugbm90IHNldCAoaW5kZXg9JWxsdSkiLCBpbmRleC5wZWVrdWxsKCkpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBidWZmZXJJZCA9IDA7CisgICAgeworICAgICAgICBkZWNsdHlwZShtQnVmZmVySWRzSW5Vc2UpOjpMb2NrZWQgYnVmZmVySWRzKG1CdWZmZXJJZHNJblVzZSk7CisgICAgICAgIGF1dG8gaXQgPSBidWZmZXJJZHMtPmZpbmQoaW5kZXgucGVla3UoKSk7CisgICAgICAgIGlmIChpdCA9PSBidWZmZXJJZHMtPmVuZCgpKSB7CisgICAgICAgICAgICBBTE9HVigiVW50cmFja2VkIGlucHV0IGluZGV4ICVsbHUgKG1heWJlIGFscmVhZHkgcmVtb3ZlZCkiLCBpbmRleC5wZWVrdWxsKCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGJ1ZmZlcklkID0gaXQtPnNlY29uZDsKKyAgICAgICAgKHZvaWQpYnVmZmVySWRzLT5lcmFzZShpdCk7CisgICAgfQorICAgICh2b2lkKW1CdWZmZXJTb3VyY2UtPm9uSW5wdXRCdWZmZXJFbXB0aWVkKGJ1ZmZlcklkLCAtMSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQzJPTVhOb2RlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTcxN2M5NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DMk9NWE5vZGUuaApAQCAtMCwwICsxLDEyMyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJfT01YX05PREVfSF8KKyNkZWZpbmUgQzJfT01YX05PREVfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgPGFuZHJvaWQvSU9NWEJ1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTXV0ZXhlZC5oPgorI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIElPbXhOb2RlIGltcGxlbWVudGF0aW9uIGFyb3VuZCBjb2RlYyAyLjAgY29tcG9uZW50LCBvbmx5IHRvIGJlIHVzZWQgaW4KKyAqIElHcmFwaGljQnVmZmVyU291cmNlOjpjb25maWd1cmUuIE9ubHkgc3Vic2V0IG9mIElPbXhOb2RlIEFQSSBpcyBpbXBsZW1lbnRlZAorICogYW5kIG90aGVycyBhcmUgbGVmdCBhcyBzdHViLiBBcyBhIHJlc3VsdCwgb25lIGNhbm5vdCBleHBlY3QgdGhpcyBJT214Tm9kZQorICogdG8gd29yayBpbiBhbnkgb3RoZXIgdXNhZ2UgdGhhbiBJR3JhcGhpY0J1ZmZlclNvdXJjZS4KKyAqLworc3RydWN0IEMyT01YTm9kZSA6IHB1YmxpYyBCbk9NWE5vZGUgeworICAgIGV4cGxpY2l0IEMyT01YTm9kZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKTsKKyAgICB+QzJPTVhOb2RlKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8gSU9NWE5vZGUKKyAgICBzdGF0dXNfdCBmcmVlTm9kZSgpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNlbmRDb21tYW5kKE9NWF9DT01NQU5EVFlQRSBjbWQsIE9NWF9TMzIgcGFyYW0pIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldFBhcmFtZXRlcigKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldENvbmZpZygKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IHZvaWQgKnBhcmFtcywgc2l6ZV90IHNpemUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHNldFBvcnRNb2RlKE9NWF9VMzIgcG9ydF9pbmRleCwgSU9NWDo6UG9ydE1vZGUgbW9kZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgcHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2soCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgZW5hYmxlLAorICAgICAgICAgICAgT01YX1UzMiBtYXhGcmFtZVdpZHRoLCBPTVhfVTMyIG1heEZyYW1lSGVpZ2h0KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBjb25maWd1cmVWaWRlb1R1bm5lbE1vZGUoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwgT01YX0JPT0wgdHVubmVsZWQsCisgICAgICAgICAgICBPTVhfVTMyIGF1ZGlvSHdTeW5jLCBuYXRpdmVfaGFuZGxlX3QgKipzaWRlYmFuZEhhbmRsZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0R3JhcGhpY0J1ZmZlclVzYWdlKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4LCBPTVhfVTMyKiB1c2FnZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgc2V0SW5wdXRTdXJmYWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gJmJ1ZmZlclNvdXJjZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgYWxsb2NhdGVTZWN1cmVCdWZmZXIoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXgsIHNpemVfdCBzaXplLCBidWZmZXJfaWQgKmJ1ZmZlciwKKyAgICAgICAgICAgIHZvaWQgKipidWZmZXJfZGF0YSwgc3A8TmF0aXZlSGFuZGxlPiAqbmF0aXZlX2hhbmRsZSkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgdXNlQnVmZmVyKAorICAgICAgICAgICAgT01YX1UzMiBwb3J0X2luZGV4LCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgYnVmZmVyX2lkICpidWZmZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGZyZWVCdWZmZXIoCisgICAgICAgICAgICBPTVhfVTMyIHBvcnRfaW5kZXgsIGJ1ZmZlcl9pZCBidWZmZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGZpbGxCdWZmZXIoCisgICAgICAgICAgICBidWZmZXJfaWQgYnVmZmVyLCBjb25zdCBPTVhCdWZmZXIgJm9teEJ1ZiwgaW50IGZlbmNlRmQpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGVtcHR5QnVmZmVyKAorICAgICAgICAgICAgYnVmZmVyX2lkIGJ1ZmZlciwgY29uc3QgT01YQnVmZmVyICZvbXhCdWYsCisgICAgICAgICAgICBPTVhfVTMyIGZsYWdzLCBPTVhfVElDS1MgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgZ2V0RXh0ZW5zaW9uSW5kZXgoCisgICAgICAgICAgICBjb25zdCBjaGFyICpwYXJhbWV0ZXJfbmFtZSwKKyAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgKmluZGV4KSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBkaXNwYXRjaE1lc3NhZ2UoY29uc3Qgb214X21lc3NhZ2UgJm1zZykgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHVuZGVybHlpbmcgSU9NWEJ1ZmZlclNvdXJjZSBvYmplY3QuCisgICAgICovCisgICAgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gZ2V0U291cmNlKCk7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmUgdGhlIGZyYW1lIHNpemUuCisgICAgICovCisgICAgdm9pZCBzZXRGcmFtZVNpemUodWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCk7CisKKyAgICAvKioKKyAgICAgKiBDbGVhbiB1cCB3b3JrIGl0ZW0gcmVmZXJlbmNlLgorICAgICAqCisgICAgICogXHBhcmFtIGluZGV4IGlucHV0IHdvcmsgaW5kZXgKKyAgICAgKi8KKyAgICB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKGMyX2NudHI2NF90IGluZGV4KTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcDsKKyAgICBzcDxJT01YQnVmZmVyU291cmNlPiBtQnVmZmVyU291cmNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKKyAgICBzdGQ6OmF0b21pY191aW50NjRfdCBtRnJhbWVJbmRleDsKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKKyAgICB1aW50NjRfdCBtVXNhZ2U7CisKKyAgICAvLyBXT1JLQVJPVU5EOiB0aW1lc3RhbXAgYWRqdXN0bWVudAorCisgICAgLy8gaWYgPjA6IHRoaXMgaXMgdGhlIG1heCB0aW1lc3RhbXAgZ2FwLCBpZiA8MDogdGhpcyBpcyAtMSB0aW1lcyB0aGUgZml4ZWQgdGltZXN0YW1wIGdhcAorICAgIC8vIGlmIDA6IG5vIHRpbWVzdGFtcCBhZGp1c3RtZW50IGlzIG1hZGUKKyAgICAvLyBub3RlIHRoYXQgQzJPTVhOb2RlIGNhbiBiZSByZWN5Y2xlZCBiZXR3ZWVuIGVuY29kaW5nIHNlc3Npb25zLgorICAgIGludDMyX3QgbUFkanVzdFRpbWVzdGFtcEdhcFVzOworICAgIGJvb2wgbUZpcnN0SW5wdXRGcmFtZTsgLy8gdHJ1ZSBmb3IgZmlyc3QgaW5wdXQKKyAgICBjMl9jbnRyNjRfdCBtUHJldklucHV0VGltZXN0YW1wOyAvLyBpbnB1dCB0aW1lc3RhbXAgZm9yIHByZXZpb3VzIGZyYW1lCisgICAgYzJfY250cjY0X3QgbVByZXZDb2RlY1RpbWVzdGFtcDsgLy8gYWRqdXN0ZWQgKGNvZGVjKSB0aW1lc3RhbXAgZm9yIHByZXZpb3VzIGZyYW1lCisKKyAgICBNdXRleGVkPHN0ZDo6bWFwPHVpbnQ2NF90LCBidWZmZXJfaWQ+PiBtQnVmZmVySWRzSW5Vc2U7CisKKyAgICBjbGFzcyBRdWV1ZVRocmVhZDsKKyAgICBzcDxRdWV1ZVRocmVhZD4gbVF1ZXVlVGhyZWFkOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDMl9PTVhfTk9ERV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2JjYjhkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlYy5jcHAKQEAgLTAsMCArMSwxOTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDQ29kZWMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL0lHcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9JT01YQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lHcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXguaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzEuMC9IMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9vbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfSW5kZXhFeHQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9CdWZmZXJQcm9kdWNlcldyYXBwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUGVyc2lzdGVudFN1cmZhY2UuaD4KKworI2luY2x1ZGUgIkMyT01YTm9kZS5oIgorI2luY2x1ZGUgIkNDb2RlYy5oIgorI2luY2x1ZGUgIkNDb2RlY0J1ZmZlckNoYW5uZWwuaCIKKyNpbmNsdWRlICJJbnB1dFN1cmZhY2VXcmFwcGVyLmgiCisjaW5jbHVkZSAiT214MklHcmFwaGljQnVmZmVyU291cmNlLmgiCisKK2V4dGVybiAiQyIgYW5kcm9pZDo6UGVyc2lzdGVudFN1cmZhY2UgKkNyZWF0ZUlucHV0U3VyZmFjZSgpOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6dXRpbHM6OkgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKK3VzaW5nIGFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKK3VzaW5nIEJHcmFwaGljQnVmZmVyU291cmNlID0gOjphbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclNvdXJjZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDo6SUlucHV0U3VyZmFjZTsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgQ0NvZGVjV2F0Y2hkb2cgOiBwdWJsaWMgQUhhbmRsZXIgeworcHJpdmF0ZToKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRXYXRjaCwKKyAgICB9OworICAgIGNvbnN0ZXhwciBzdGF0aWMgaW50NjRfdCBrV2F0Y2hJbnRlcnZhbFVzID0gMzMwMDAwMDsgIC8vIDMuMyBzZWNzCisKK3B1YmxpYzoKKyAgICBzdGF0aWMgc3A8Q0NvZGVjV2F0Y2hkb2c+IGdldEluc3RhbmNlKCkgeworICAgICAgICBzdGF0aWMgc3A8Q0NvZGVjV2F0Y2hkb2c+IGluc3RhbmNlKG5ldyBDQ29kZWNXYXRjaGRvZyk7CisgICAgICAgIHN0YXRpYyBzdGQ6Om9uY2VfZmxhZyBmbGFnOworICAgICAgICAvLyBDYWxsIEluaXQoKSBvbmx5IG9uY2UuCisgICAgICAgIHN0ZDo6Y2FsbF9vbmNlKGZsYWcsIEluaXQsIGluc3RhbmNlKTsKKyAgICAgICAgcmV0dXJuIGluc3RhbmNlOworICAgIH0KKworICAgIH5DQ29kZWNXYXRjaGRvZygpID0gZGVmYXVsdDsKKworICAgIHZvaWQgd2F0Y2goc3A8Q0NvZGVjPiBjb2RlYykgeworICAgICAgICBib29sIHNob3VsZFBvc3QgPSBmYWxzZTsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6OnNldDx3cDxDQ29kZWM+Pj46OkxvY2tlZCBjb2RlY3MobUNvZGVjc1RvV2F0Y2gpOworICAgICAgICAgICAgLy8gSWYgYSB3YXRjaCBtZXNzYWdlIGlzIGluIGZsaWdodCwgcGlnZ3ktYmFjayB0aGlzIGluc3RhbmNlIGFzIHdlbGwuCisgICAgICAgICAgICAvLyBPdGhlcndpc2UsIHBvc3QgYSBuZXcgd2F0Y2ggbWVzc2FnZS4KKyAgICAgICAgICAgIHNob3VsZFBvc3QgPSBjb2RlY3MtPmVtcHR5KCk7CisgICAgICAgICAgICBjb2RlY3MtPmVtcGxhY2UoY29kZWMpOworICAgICAgICB9CisgICAgICAgIGlmIChzaG91bGRQb3N0KSB7CisgICAgICAgICAgICBBTE9HVigicG9zdGluZyB3YXRjaCBtZXNzYWdlIik7CisgICAgICAgICAgICAobmV3IEFNZXNzYWdlKGtXaGF0V2F0Y2gsIHRoaXMpKS0+cG9zdChrV2F0Y2hJbnRlcnZhbFVzKTsKKyAgICAgICAgfQorICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICAgICAgY2FzZSBrV2hhdFdhdGNoOiB7CisgICAgICAgICAgICAgICAgTXV0ZXhlZDxzdGQ6OnNldDx3cDxDQ29kZWM+Pj46OkxvY2tlZCBjb2RlY3MobUNvZGVjc1RvV2F0Y2gpOworICAgICAgICAgICAgICAgIEFMT0dWKCJ3YXRjaCBmb3IgJXp1IGNvZGVjcyIsIGNvZGVjcy0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBjb2RlY3MtPmJlZ2luKCk7IGl0ICE9IGNvZGVjcy0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8Q0NvZGVjPiBjb2RlYyA9IGl0LT5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlYyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb2RlYy0+aW5pdGlhdGVSZWxlYXNlSWZTdHVjaygpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb2RlY3MtPmNsZWFyKCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICBUUkVTUEFTUygiQ0NvZGVjV2F0Y2hkb2c6IHVucmVjb2duaXplZCBtZXNzYWdlIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgQ0NvZGVjV2F0Y2hkb2coKSA6IG1Mb29wZXIobmV3IEFMb29wZXIpIHt9CisKKyAgICBzdGF0aWMgdm9pZCBJbml0KGNvbnN0IHNwPENDb2RlY1dhdGNoZG9nPiAmdGhpeikgeworICAgICAgICBBTE9HVigiSW5pdCIpOworICAgICAgICB0aGl6LT5tTG9vcGVyLT5zZXROYW1lKCJDQ29kZWNXYXRjaGRvZyIpOworICAgICAgICB0aGl6LT5tTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpeik7CisgICAgICAgIHRoaXotPm1Mb29wZXItPnN0YXJ0KCk7CisgICAgfQorCisgICAgc3A8QUxvb3Blcj4gbUxvb3BlcjsKKworICAgIE11dGV4ZWQ8c3RkOjpzZXQ8d3A8Q0NvZGVjPj4+IG1Db2RlY3NUb1dhdGNoOworfTsKKworY2xhc3MgQzJJbnB1dFN1cmZhY2VXcmFwcGVyIDogcHVibGljIElucHV0U3VyZmFjZVdyYXBwZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEMySW5wdXRTdXJmYWNlV3JhcHBlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gJnN1cmZhY2UpIDoKKyAgICAgICAgbVN1cmZhY2Uoc3VyZmFjZSkgeworICAgIH0KKworICAgIH5DMklucHV0U3VyZmFjZVdyYXBwZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBzdGF0dXNfdCBjb25uZWN0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXApIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdG9TdGF0dXNUKGNvbXAtPmNvbm5lY3RUb0lucHV0U3VyZmFjZShtU3VyZmFjZSwgJm1Db25uZWN0aW9uKSk7CisgICAgfQorCisgICAgdm9pZCBkaXNjb25uZWN0KCkgb3ZlcnJpZGUgeworICAgICAgICBpZiAobUNvbm5lY3Rpb24gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUNvbm5lY3Rpb24tPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgIG1Db25uZWN0aW9uID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0YXR1c190IHN0YXJ0KCkgb3ZlcnJpZGUgeworICAgICAgICAvLyBJbnB1dFN1cmZhY2UgZG9lcyBub3QgZGlzdGluZ3Vpc2ggc3RhcnRlZCBzdGF0ZQorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIG92ZXJyaWRlIHsKKyAgICAgICAgQzJJbnB1dFN1cmZhY2VFb3NUdW5pbmcgZW9zKHRydWUpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgIGMyX3N0YXR1c190IGVyciA9IG1TdXJmYWNlLT5jb25maWcoeyZlb3N9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBjb25maWd1cmUoQ29uZmlnICZjb25maWcgX191bnVzZWQpIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gbVN1cmZhY2U7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlQ29ubmVjdGlvbj4gbUNvbm5lY3Rpb247Cit9OworCitjbGFzcyBHcmFwaGljQnVmZmVyU291cmNlV3JhcHBlciA6IHB1YmxpYyBJbnB1dFN1cmZhY2VXcmFwcGVyIHsKK3B1YmxpYzoKKy8vICAgIGV4cGxpY2l0IEdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyKGNvbnN0IHNwPEJHcmFwaGljQnVmZmVyU291cmNlPiAmc291cmNlKSA6IG1Tb3VyY2Uoc291cmNlKSB7fQorICAgIEdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QkdyYXBoaWNCdWZmZXJTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQ2NF90IHVzYWdlKQorICAgICAgICA6IG1Tb3VyY2Uoc291cmNlKSwgbVdpZHRoKHdpZHRoKSwgbUhlaWdodChoZWlnaHQpIHsKKyAgICAgICAgbURhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfQlQ3MDk7CisgICAgICAgIG1Db25maWcubVVzYWdlID0gdXNhZ2U7CisgICAgfQorICAgIH5HcmFwaGljQnVmZmVyU291cmNlV3JhcHBlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHN0YXR1c190IGNvbm5lY3QoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcCkgb3ZlcnJpZGUgeworICAgICAgICBtTm9kZSA9IG5ldyBDMk9NWE5vZGUoY29tcCk7CisgICAgICAgIG1Ob2RlLT5zZXRGcmFtZVNpemUobVdpZHRoLCBtSGVpZ2h0KTsKKworICAgICAgICAvLyBVc2FnZSBpcyBxdWVyaWVkIGR1cmluZyBjb25maWd1cmUoKSwgc28gc2V0dGluZyBpdCBiZWZvcmVoYW5kLgorICAgICAgICBPTVhfVTMyIHVzYWdlID0gbUNvbmZpZy5tVXNhZ2UgJiAweEZGRkZGRkZGOworICAgICAgICAodm9pZCltTm9kZS0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHMsCisgICAgICAgICAgICAgICAgJnVzYWdlLCBzaXplb2YodXNhZ2UpKTsKKworICAgICAgICAvLyBOT1RFOiB3ZSBkbyBub3QgdXNlL3Bhc3MgdGhyb3VnaCBjb2xvciBhc3BlY3RzIGZyb20gR3JhcGhpY0J1ZmZlclNvdXJjZSBhcyB3ZQorICAgICAgICAvLyBjb21tdW5pY2F0ZSB0aGF0IGRpcmVjdGx5IHRvIHRoZSBjb21wb25lbnQuCisgICAgICAgIG1Tb3VyY2UtPmNvbmZpZ3VyZShtTm9kZSwgbURhdGFTcGFjZSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICB2b2lkIGRpc2Nvbm5lY3QoKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtTm9kZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gc291cmNlID0gbU5vZGUtPmdldFNvdXJjZSgpOworICAgICAgICBpZiAoc291cmNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJHQlNXcmFwcGVyOjpkaXNjb25uZWN0OiBub2RlIGlzIG5vdCBjb25maWd1cmVkIHdpdGggT01YQnVmZmVyU291cmNlLiIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHNvdXJjZS0+b25PbXhJZGxlKCk7CisgICAgICAgIHNvdXJjZS0+b25PbXhMb2FkZWQoKTsKKyAgICAgICAgbU5vZGUuY2xlYXIoKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBHZXRTdGF0dXMoY29uc3QgYmluZGVyOjpTdGF0dXMgJnN0YXR1cykgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICBlcnIgPSBzdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgZXJyID0gc3RhdHVzLnRyYW5zYWN0aW9uRXJyb3IoKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGJpbmRlciBzdGF0dXMgZmFpbGVkLCBidXQgdGhlcmUgaXMgbm8gc2VydmllIG9yIHRyYW5zYWN0aW9uIGVycm9yCisgICAgICAgICAgICAgICAgICAgIGVyciA9IFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhcnQoKSBvdmVycmlkZSB7CisgICAgICAgIHNwPElPTVhCdWZmZXJTb3VyY2U+IHNvdXJjZSA9IG1Ob2RlLT5nZXRTb3VyY2UoKTsKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorICAgICAgICBjb25zdGV4cHIgc2l6ZV90IGtOdW1TbG90cyA9IDE2OworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtOdW1TbG90czsgKytpKSB7CisgICAgICAgICAgICBzb3VyY2UtPm9uSW5wdXRCdWZmZXJBZGRlZChpKTsKKyAgICAgICAgfQorCisgICAgICAgIHNvdXJjZS0+b25PbXhFeGVjdXRpbmcoKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBHZXRTdGF0dXMobVNvdXJjZS0+c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBjb25maWd1cmUoQ29uZmlnICZjb25maWcpIHsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3RhdHVzOworICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKworICAgICAgICAvLyBoYW5kbGUgZWFjaCBjb25maWd1cmF0aW9uIGdyYW51YWxseSwgaW4gY2FzZSB3ZSBuZWVkIHRvIGhhbmRsZSBwYXJ0IG9mIHRoZSBjb25maWd1cmF0aW9uCisgICAgICAgIC8vIGVsc2V3aGVyZQorCisgICAgICAgIC8vIFRSSUNLWTogd2UgZG8gbm90IHVuc2V0IGZyYW1lIGRlbGF5IHJlcGVhdGluZworICAgICAgICBpZiAoY29uZmlnLm1NaW5GcHMgPiAwICYmIGNvbmZpZy5tTWluRnBzICE9IG1Db25maWcubU1pbkZwcykgeworICAgICAgICAgICAgaW50NjRfdCB1cyA9IDFlNiAvIGNvbmZpZy5tTWluRnBzICsgMC41OworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPnNldFJlcGVhdFByZXZpb3VzRnJhbWVEZWxheVVzKHVzKSk7CisgICAgICAgICAgICBzdGF0dXMgPDwgIiBtaW5GcHM9IiA8PCBjb25maWcubU1pbkZwcyA8PCAiID0+IHJlcGVhdERlbGF5VXM9IiA8PCB1czsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1NaW5GcHMgPSBjb25maWcubU1pbkZwczsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHB0cyBnYXAKKyAgICAgICAgaWYgKGNvbmZpZy5tTWluQWRqdXN0ZWRGcHMgPiAwIHx8IGNvbmZpZy5tRml4ZWRBZGp1c3RlZEZwcyA+IDApIHsKKyAgICAgICAgICAgIGlmIChtTm9kZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgT01YX1BBUkFNX1UzMlRZUEUgcHRyR2FwUGFyYW0gPSB7fTsKKyAgICAgICAgICAgICAgICBwdHJHYXBQYXJhbS5uU2l6ZSA9IHNpemVvZihPTVhfUEFSQU1fVTMyVFlQRSk7CisgICAgICAgICAgICAgICAgZmxvYXQgZ2FwID0gKGNvbmZpZy5tTWluQWRqdXN0ZWRGcHMgPiAwKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBjMl9taW4oSU5UMzJfTUFYICsgMC4sIDFlNiAvIGNvbmZpZy5tTWluQWRqdXN0ZWRGcHMgKyAwLjUpCisgICAgICAgICAgICAgICAgICAgICAgICA6IGMyX21heCgwLiAtIElOVDMyX01BWCwgLTFlNiAvIGNvbmZpZy5tRml4ZWRBZGp1c3RlZEZwcyAtIDAuNSk7CisgICAgICAgICAgICAgICAgLy8gZmxvYXQgLT4gdWludDMyX3QgaXMgdW5kZWZpbmVkIGlmIHRoZSB2YWx1ZSBpcyBuZWdhdGl2ZS4KKyAgICAgICAgICAgICAgICAvLyBGaXJzdCBjb252ZXJ0IHRvIGludDMyX3QgdG8gZW5zdXJlIHRoZSBleHBlY3RlZCBiZWhhdmlvci4KKyAgICAgICAgICAgICAgICBwdHJHYXBQYXJhbS5uVTMyID0gaW50MzJfdChnYXApOworICAgICAgICAgICAgICAgICh2b2lkKW1Ob2RlLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbU1heEZyYW1lRHVyYXRpb25Gb3JCaXRyYXRlQ29udHJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwdHJHYXBQYXJhbSwgc2l6ZW9mKHB0ckdhcFBhcmFtKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBtYXggZnBzCisgICAgICAgIC8vIFRSSUNLWTogd2UgZG8gbm90IHVuc2V0IG1heCBmcHMgdG8gMCB1bmxlc3MgdXNpbmcgZml4ZWQgZnBzCisgICAgICAgIGlmICgoY29uZmlnLm1NYXhGcHMgPiAwIHx8IChjb25maWcubUZpeGVkQWRqdXN0ZWRGcHMgPiAwICYmIGNvbmZpZy5tTWF4RnBzID09IC0xKSkKKyAgICAgICAgICAgICAgICAmJiBjb25maWcubU1heEZwcyAhPSBtQ29uZmlnLm1NYXhGcHMpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5zZXRNYXhGcHMoY29uZmlnLm1NYXhGcHMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIG1heEZwcz0iIDw8IGNvbmZpZy5tTWF4RnBzOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubU1heEZwcyA9IGNvbmZpZy5tTWF4RnBzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbmZpZy5tVGltZU9mZnNldFVzICE9IG1Db25maWcubVRpbWVPZmZzZXRVcykgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gR2V0U3RhdHVzKG1Tb3VyY2UtPnNldFRpbWVPZmZzZXRVcyhjb25maWcubVRpbWVPZmZzZXRVcykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgdGltZU9mZnNldCAiIDw8IGNvbmZpZy5tVGltZU9mZnNldFVzIDw8ICJ1cyI7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNvbmZpZy5tVGltZU9mZnNldFVzID0gY29uZmlnLm1UaW1lT2Zmc2V0VXM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29uZmlnLm1DYXB0dXJlRnBzICE9IG1Db25maWcubUNhcHR1cmVGcHMgfHwgY29uZmlnLm1Db2RlZEZwcyAhPSBtQ29uZmlnLm1Db2RlZEZwcykgeworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0KKyAgICAgICAgICAgICAgICBHZXRTdGF0dXMobVNvdXJjZS0+c2V0VGltZUxhcHNlQ29uZmlnKGNvbmZpZy5tQ29kZWRGcHMsIGNvbmZpZy5tQ2FwdHVyZUZwcykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgdGltZUxhcHNlICIgPDwgY29uZmlnLm1DYXB0dXJlRnBzIDw8ICJmcHMgYXMgIiA8PCBjb25maWcubUNvZGVkRnBzIDw8ICJmcHMiOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIGVyciA9IHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1Db25maWcubUNhcHR1cmVGcHMgPSBjb25maWcubUNhcHR1cmVGcHM7CisgICAgICAgICAgICBtQ29uZmlnLm1Db2RlZEZwcyA9IGNvbmZpZy5tQ29kZWRGcHM7CisgICAgICAgIH0KKworICAgICAgICBpZiAoY29uZmlnLm1TdGFydEF0VXMgIT0gbUNvbmZpZy5tU3RhcnRBdFVzCisgICAgICAgICAgICAgICAgfHwgKGNvbmZpZy5tU3RvcHBlZCAhPSBtQ29uZmlnLm1TdG9wcGVkICYmICFjb25maWcubVN0b3BwZWQpKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+c2V0U3RhcnRUaW1lVXMoY29uZmlnLm1TdGFydEF0VXMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIHN0YXJ0IGF0ICIgPDwgY29uZmlnLm1TdGFydEF0VXMgPDwgInVzIjsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1TdGFydEF0VXMgPSBjb25maWcubVN0YXJ0QXRVczsKKyAgICAgICAgICAgIG1Db25maWcubVN0b3BwZWQgPSBjb25maWcubVN0b3BwZWQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBzdXNwZW5kLXJlc3VtZQorICAgICAgICBpZiAoY29uZmlnLm1TdXNwZW5kZWQgIT0gbUNvbmZpZy5tU3VzcGVuZGVkKSB7CisgICAgICAgICAgICBzdGF0dXNfdCByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+c2V0U3VzcGVuZChjb25maWcubVN1c3BlbmRlZCwgY29uZmlnLm1TdXNwZW5kQXRVcykpOworICAgICAgICAgICAgc3RhdHVzIDw8ICIgIiA8PCAoY29uZmlnLm1TdXNwZW5kZWQgPyAic3VzcGVuZCIgOiAicmVzdW1lIikKKyAgICAgICAgICAgICAgICAgICAgPDwgIiBhdCAiIDw8IGNvbmZpZy5tU3VzcGVuZEF0VXMgPDwgInVzIjsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiAoPT4gIiA8PCBhc1N0cmluZyhyZXMpIDw8ICIpIjsKKyAgICAgICAgICAgICAgICBlcnIgPSByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1TdXNwZW5kZWQgPSBjb25maWcubVN1c3BlbmRlZDsKKyAgICAgICAgICAgIG1Db25maWcubVN1c3BlbmRBdFVzID0gY29uZmlnLm1TdXNwZW5kQXRVczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjb25maWcubVN0b3BwZWQgIT0gbUNvbmZpZy5tU3RvcHBlZCAmJiBjb25maWcubVN0b3BwZWQpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IEdldFN0YXR1cyhtU291cmNlLT5zZXRTdG9wVGltZVVzKGNvbmZpZy5tU3RvcEF0VXMpKTsKKyAgICAgICAgICAgIHN0YXR1cyA8PCAiIHN0b3AgYXQgIiA8PCBjb25maWcubVN0b3BBdFVzIDw8ICJ1cyI7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzIDw8ICIgKD0+ICIgPDwgYXNTdHJpbmcocmVzKSA8PCAiKSI7CisgICAgICAgICAgICAgICAgZXJyID0gcmVzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPDwgIiBkZWxheVVzIjsKKyAgICAgICAgICAgICAgICByZXMgPSBHZXRTdGF0dXMobVNvdXJjZS0+Z2V0U3RvcFRpbWVPZmZzZXRVcygmY29uZmlnLm1JbnB1dERlbGF5VXMpKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiICg9PiAiIDw8IGFzU3RyaW5nKHJlcykgPDwgIikiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA8PCAiPSIgPDwgY29uZmlnLm1JbnB1dERlbGF5VXMgPDwgInVzIjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNvbmZpZy5tSW5wdXREZWxheVVzID0gY29uZmlnLm1JbnB1dERlbGF5VXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ29uZmlnLm1TdG9wQXRVcyA9IGNvbmZpZy5tU3RvcEF0VXM7CisgICAgICAgICAgICBtQ29uZmlnLm1TdG9wcGVkID0gY29uZmlnLm1TdG9wcGVkOworICAgICAgICB9CisKKyAgICAgICAgLy8gY29sb3IgYXNwZWN0cyAoYW5kcm9pZC5fY29sb3ItYXNwZWN0cykKKworICAgICAgICAvLyBjb25zdW1lciB1c2FnZSBpcyBxdWVyaWVkIGVhcmxpZXIuCisKKyAgICAgICAgaWYgKHN0YXR1cy5zdHIoKS5lbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRCgiSVNDb25maWcgbm90IGNoYW5nZWQiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dEKCJJU0NvbmZpZyVzIiwgc3RhdHVzLnN0cigpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgdm9pZCBvbklucHV0QnVmZmVyRG9uZShjMl9jbnRyNjRfdCBpbmRleCkgb3ZlcnJpZGUgeworICAgICAgICBtTm9kZS0+b25JbnB1dEJ1ZmZlckRvbmUoaW5kZXgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzcDxCR3JhcGhpY0J1ZmZlclNvdXJjZT4gbVNvdXJjZTsKKyAgICBzcDxDMk9NWE5vZGU+IG1Ob2RlOworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIENvbmZpZyBtQ29uZmlnOworfTsKKworY2xhc3MgQ29kZWMyQ2xpZW50SW50ZXJmYWNlV3JhcHBlciA6IHB1YmxpYyBDMkNvbXBvbmVudFN0b3JlIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworCitwdWJsaWM6CisgICAgQ29kZWMyQ2xpZW50SW50ZXJmYWNlV3JhcHBlcihzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBjbGllbnQpCisgICAgICAgIDogbUNsaWVudChjbGllbnQpIHsgfQorCisgICAgdmlydHVhbCB+Q29kZWMyQ2xpZW50SW50ZXJmYWNlV3JhcHBlcigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSAqPiAmcGFyYW1zLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcykgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+Y29uZmlnKHBhcmFtcywgQzJfTUFZX0JMT0NLLCBmYWlsdXJlcyk7CisgICAgfTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29weUJ1ZmZlcigKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+LAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4pIHsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBDMlN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAqY29uc3QgY29tcG9uZW50KSB7CisgICAgICAgIGNvbXBvbmVudC0+cmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVJbnRlcmZhY2UoCisgICAgICAgICAgICBDMlN0cmluZywgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAqY29uc3QgaW50ZXJmYWNlKSB7CisgICAgICAgIGludGVyZmFjZS0+cmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV9zbSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgaGVhcFBhcmFtcykgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+cXVlcnkoc3RhY2tQYXJhbXMsIGhlYXBQYXJhbUluZGljZXMsIEMyX01BWV9CTE9DSywgaGVhcFBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICpjb25zdCBwYXJhbXMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnQtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKHBhcmFtcyk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFZhbHVlc19zbSgKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcykgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudC0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoZmllbGRzLCBDMl9NQVlfQkxPQ0spOworICAgIH0KKworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnQtPmdldE5hbWUoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRQYXJhbVJlZmxlY3RvcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1DbGllbnQtPmdldFBhcmFtUmVmbGVjdG9yKCk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IGxpc3RDb21wb25lbnRzKCkgeworICAgICAgICByZXR1cm4gc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50OjpUcmFpdHM+PigpOworICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBDQ29kZWM6OkNsaWVudExpc3RlbmVyCisKK3N0cnVjdCBDQ29kZWM6OkNsaWVudExpc3RlbmVyIDogcHVibGljIENvZGVjMkNsaWVudDo6TGlzdGVuZXIgeworCisgICAgZXhwbGljaXQgQ2xpZW50TGlzdGVuZXIoY29uc3Qgd3A8Q0NvZGVjPiAmY29kZWMpIDogbUNvZGVjKGNvZGVjKSB7fQorCisgICAgdmlydHVhbCB2b2lkIG9uV29ya0RvbmUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OndlYWtfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiYgY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiYgd29ya0l0ZW1zKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKWNvbXBvbmVudDsKKyAgICAgICAgc3A8Q0NvZGVjPiBjb2RlYyhtQ29kZWMucHJvbW90ZSgpKTsKKyAgICAgICAgaWYgKCFjb2RlYykgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvZGVjLT5vbldvcmtEb25lKHdvcmtJdGVtcyk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uVHJpcHBlZCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4mIHNldHRpbmdSZXN1bHQKKyAgICAgICAgICAgICkgb3ZlcnJpZGUgeworICAgICAgICAvLyBUT0RPCisgICAgICAgICh2b2lkKWNvbXBvbmVudDsKKyAgICAgICAgKHZvaWQpc2V0dGluZ1Jlc3VsdDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25FcnJvcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQsCisgICAgICAgICAgICB1aW50MzJfdCBlcnJvckNvZGUpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gVE9ETworICAgICAgICAodm9pZCljb21wb25lbnQ7CisgICAgICAgICh2b2lkKWVycm9yQ29kZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25EZWF0aCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6d2Vha19wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+JiBjb21wb25lbnQpIG92ZXJyaWRlIHsKKyAgICAgICAgeyAvLyBMb2cgdGhlIGRlYXRoIG9mIHRoZSBjb21wb25lbnQuCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXAgPSBjb21wb25lbnQubG9jaygpOworICAgICAgICAgICAgaWYgKCFjb21wKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjMiBjb21wb25lbnQgZGllZC4iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjMiBjb21wb25lbnQgXCIlc1wiIGRpZWQuIiwgY29tcC0+Z2V0TmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVwb3J0IHRvIE1lZGlhQ29kZWMuCisgICAgICAgIHNwPENDb2RlYz4gY29kZWMobUNvZGVjLnByb21vdGUoKSk7CisgICAgICAgIGlmICghY29kZWMgfHwgIWNvZGVjLT5tQ2FsbGJhY2spIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb2RlYy0+bUNhbGxiYWNrLT5vbkVycm9yKERFQURfT0JKRUNULCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRnJhbWVSZW5kZXJlZCh1aW50NjRfdCBidWZmZXJRdWV1ZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzbG90SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcE5zKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFRPRE86IGltcGxlbWVudAorICAgICAgICAodm9pZClidWZmZXJRdWV1ZUlkOworICAgICAgICAodm9pZClzbG90SWQ7CisgICAgICAgICh2b2lkKXRpbWVzdGFtcE5zOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbklucHV0QnVmZmVyRG9uZSgKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBhcnJheUluZGV4KSBvdmVycmlkZSB7CisgICAgICAgIHNwPENDb2RlYz4gY29kZWMobUNvZGVjLnByb21vdGUoKSk7CisgICAgICAgIGlmIChjb2RlYykgeworICAgICAgICAgICAgY29kZWMtPm9uSW5wdXRCdWZmZXJEb25lKGZyYW1lSW5kZXgsIGFycmF5SW5kZXgpOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIHdwPENDb2RlYz4gbUNvZGVjOworfTsKKworLy8gQ0NvZGVjQ2FsbGJhY2tJbXBsCisKK2NsYXNzIENDb2RlY0NhbGxiYWNrSW1wbCA6IHB1YmxpYyBDQ29kZWNDYWxsYmFjayB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQ0NvZGVjQ2FsbGJhY2tJbXBsKENDb2RlYyAqY29kZWMpIDogbUNvZGVjKGNvZGVjKSB7fQorICAgIH5DQ29kZWNDYWxsYmFja0ltcGwoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIG9uRXJyb3Ioc3RhdHVzX3QgZXJyLCBlbnVtIEFjdGlvbkNvZGUgYWN0aW9uQ29kZSkgb3ZlcnJpZGUgeworICAgICAgICBtQ29kZWMtPm1DYWxsYmFjay0+b25FcnJvcihlcnIsIGFjdGlvbkNvZGUpOworICAgIH0KKworICAgIHZvaWQgb25PdXRwdXRGcmFtZXNSZW5kZXJlZChpbnQ2NF90IG1lZGlhVGltZVVzLCBuc2Vjc190IHJlbmRlclRpbWVOcykgb3ZlcnJpZGUgeworICAgICAgICBtQ29kZWMtPm1DYWxsYmFjay0+b25PdXRwdXRGcmFtZXNSZW5kZXJlZCgKKyAgICAgICAgICAgICAgICB7UmVuZGVyZWRGcmFtZUluZm8obWVkaWFUaW1lVXMsIHJlbmRlclRpbWVOcyl9KTsKKyAgICB9CisKKyAgICB2b2lkIG9uT3V0cHV0QnVmZmVyc0NoYW5nZWQoKSBvdmVycmlkZSB7CisgICAgICAgIG1Db2RlYy0+bUNhbGxiYWNrLT5vbk91dHB1dEJ1ZmZlcnNDaGFuZ2VkKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIENDb2RlYyAqbUNvZGVjOworfTsKKworLy8gQ0NvZGVjCisKK0NDb2RlYzo6Q0NvZGVjKCkKKyAgICA6IG1DaGFubmVsKG5ldyBDQ29kZWNCdWZmZXJDaGFubmVsKHN0ZDo6bWFrZV9zaGFyZWQ8Q0NvZGVjQ2FsbGJhY2tJbXBsPih0aGlzKSkpIHsKK30KKworQ0NvZGVjOjp+Q0NvZGVjKCkgeworfQorCitzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyQ2hhbm5lbEJhc2U+IENDb2RlYzo6Z2V0QnVmZmVyQ2hhbm5lbCgpIHsKKyAgICByZXR1cm4gbUNoYW5uZWw7Cit9CisKK3N0YXR1c190IENDb2RlYzo6dHJ5QW5kUmVwb3J0T25FcnJvcihzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KCk+IGpvYikgeworICAgIHN0YXR1c190IGVyciA9IGpvYigpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKGVyciwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgIH0KKyAgICByZXR1cm4gZXJyOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIGF1dG8gc2V0QWxsb2NhdGluZyA9IFt0aGlzXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBSRUxFQVNFRCkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoQUxMT0NBVElORyk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKHNldEFsbG9jYXRpbmcpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzcDxSZWZCYXNlPiBjb2RlY0luZm87CisgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJjb2RlY0luZm8iLCAmY29kZWNJbmZvKSk7CisgICAgLy8gRm9yIENvZGVjIDIuMCBjb21wb25lbnRzLCBjb21wb25lbnROYW1lID09IGNvZGVjSW5mby0+Z2V0Q29kZWNOYW1lKCkuCisKKyAgICBzcDxBTWVzc2FnZT4gYWxsb2NNc2cobmV3IEFNZXNzYWdlKGtXaGF0QWxsb2NhdGUsIHRoaXMpKTsKKyAgICBhbGxvY01zZy0+c2V0T2JqZWN0KCJjb2RlY0luZm8iLCBjb2RlY0luZm8pOworICAgIGFsbG9jTXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjphbGxvY2F0ZShjb25zdCBzcDxNZWRpYUNvZGVjSW5mbz4gJmNvZGVjSW5mbykgeworICAgIGlmIChjb2RlY0luZm8gPT0gbnVsbHB0cikgeworICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dEKCJhbGxvY2F0ZSglcykiLCBjb2RlY0luZm8tPmdldENvZGVjTmFtZSgpKTsKKyAgICBtQ2xpZW50TGlzdGVuZXIucmVzZXQobmV3IENsaWVudExpc3RlbmVyKHRoaXMpKTsKKworICAgIEFTdHJpbmcgY29tcG9uZW50TmFtZSA9IGNvZGVjSW5mby0+Z2V0Q29kZWNOYW1lKCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gY2xpZW50OworCisgICAgLy8gc2V0IHVwIHByZWZlcnJlZCBjb21wb25lbnQgc3RvcmUgdG8gYWNjZXNzIHZlbmRvciBzdG9yZSBwYXJhbWV0ZXJzCisgICAgY2xpZW50ID0gQ29kZWMyQ2xpZW50OjpDcmVhdGVGcm9tU2VydmljZSgiZGVmYXVsdCIpOworICAgIGlmIChjbGllbnQpIHsKKyAgICAgICAgQUxPR0koInNldHRpbmcgdXAgJyVzJyBhcyBkZWZhdWx0ICh2ZW5kb3IpIHN0b3JlIiwgY2xpZW50LT5nZXRTZXJ2aWNlTmFtZSgpLmNfc3RyKCkpOworICAgICAgICBTZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZSgKKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudEludGVyZmFjZVdyYXBwZXI+KGNsaWVudCkpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcCA9CisgICAgICAgICAgICBDb2RlYzJDbGllbnQ6OkNyZWF0ZUNvbXBvbmVudEJ5TmFtZSgKKyAgICAgICAgICAgIGNvbXBvbmVudE5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgIG1DbGllbnRMaXN0ZW5lciwKKyAgICAgICAgICAgICZjbGllbnQpOworICAgIGlmICghY29tcCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIENyZWF0ZSBjb21wb25lbnQ6ICVzIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBzdGF0ZS0+c2V0KFJFTEVBU0VEKTsKKyAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HSSgiQ3JlYXRlZCBjb21wb25lbnQgWyVzXSIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgbUNoYW5uZWwtPnNldENvbXBvbmVudChjb21wKTsKKyAgICBhdXRvIHNldEFsbG9jYXRlZCA9IFt0aGlzLCBjb21wLCBjbGllbnRdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRJTkcpIHsKKyAgICAgICAgICAgIHN0YXRlLT5zZXQoUkVMRUFTRUQpOworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChBTExPQ0FURUQpOworICAgICAgICBzdGF0ZS0+Y29tcCA9IGNvbXA7CisgICAgICAgIG1DbGllbnQgPSBjbGllbnQ7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKHNldEFsbG9jYXRlZCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGluaXRpYWxpemUgY29uZmlnIGhlcmUgaW4gY2FzZSBzZXRQYXJhbWV0ZXJzIGlzIGNhbGxlZCBwcmlvciB0byBjb25maWd1cmUKKyAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgc3RhdHVzX3QgZXJyID0gY29uZmlnLT5pbml0aWFsaXplKG1DbGllbnQsIGNvbXApOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgQUxPR1coIkZhaWxlZCB0byBpbml0aWFsaXplIGNvbmZpZ3VyYXRpb24gc3VwcG9ydCIpOworICAgICAgICAvLyBUT0RPOiByZXBvcnQgZXJyb3Igb25jZSB3ZSBjb21wbGV0ZSBpbXBsZW1lbnRhdGlvbi4KKyAgICB9CisgICAgY29uZmlnLT5xdWVyeUNvbmZpZ3VyYXRpb24oY29tcCk7CisKKyAgICBtQ2FsbGJhY2stPm9uQ29tcG9uZW50QWxsb2NhdGVkKGNvbXBvbmVudE5hbWUuY19zdHIoKSk7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZUNvbmZpZ3VyZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIGF1dG8gY2hlY2tBbGxvY2F0ZWQgPSBbdGhpc10geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIHJldHVybiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRFRCkgPyBVTktOT1dOX0VSUk9SIDogT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihjaGVja0FsbG9jYXRlZCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHNwPEFNZXNzYWdlPiBtc2cobmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlndXJlLCB0aGlzKSk7CisgICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOworICAgIG1zZy0+cG9zdCgpOworfQorCit2b2lkIENDb2RlYzo6Y29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIGF1dG8gY2hlY2tBbGxvY2F0ZWQgPSBbdGhpcywgJmNvbXBdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEFMTE9DQVRFRCkgeworICAgICAgICAgICAgc3RhdGUtPnNldChSRUxFQVNFRCk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGNoZWNrQWxsb2NhdGVkKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBkb0NvbmZpZyA9IFttc2csIGNvbXAsIHRoaXNdKCkgLT4gc3RhdHVzX3QgeworICAgICAgICBBU3RyaW5nIG1pbWU7CisgICAgICAgIGlmICghbXNnLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBlbmNvZGVyOworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJlbmNvZGVyIiwgJmVuY29kZXIpKSB7CisgICAgICAgICAgICBlbmNvZGVyID0gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiByZWFkIGZyb20gaW50ZigpCisgICAgICAgIGlmICgoIWVuY29kZXIpICE9IChjb21wLT5nZXROYW1lKCkuZmluZCgiZW5jb2RlciIpID09IHN0ZDo6c3RyaW5nOjpucG9zKSkgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IHN0b3JlTWV0YTsKKyAgICAgICAgaWYgKGVuY29kZXIKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5faW5wdXQtbWV0YWRhdGEtYnVmZmVyLXR5cGUiLCAmc3RvcmVNZXRhKQorICAgICAgICAgICAgICAgICYmIHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlSW52YWxpZCkgeworICAgICAgICAgICAgaWYgKHN0b3JlTWV0YSAhPSBrTWV0YWRhdGFCdWZmZXJUeXBlQU5XQnVmZmVyKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIk9ubHkgQU5XIGJ1ZmZlcnMgYXJlIHN1cHBvcnRlZCBmb3IgbGVnYWN5IG1ldGFkYXRhIG1vZGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUNoYW5uZWwtPnNldE1ldGFNb2RlKENDb2RlY0J1ZmZlckNoYW5uZWw6Ok1PREVfQU5XKTsKKyAgICAgICAgfQorCisgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKKyAgICAgICAgc3A8U3VyZmFjZT4gc3VyZmFjZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZE9iamVjdCgibmF0aXZlLXdpbmRvdyIsICZvYmopKSB7CisgICAgICAgICAgICBzdXJmYWNlID0gc3RhdGljX2Nhc3Q8U3VyZmFjZSAqPihvYmouZ2V0KCkpOworICAgICAgICAgICAgc2V0U3VyZmFjZShzdXJmYWNlKTsKKyAgICAgICAgfQorCisgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgY29uZmlnLT5tVXNpbmdTdXJmYWNlID0gc3VyZmFjZSAhPSBudWxscHRyOworCisgICAgICAgIC8vIEVuZm9yY2UgcmVxdWlyZWQgcGFyYW1ldGVycworICAgICAgICBpbnQzMl90IGkzMjsKKyAgICAgICAgZmxvYXQgZmx0OworICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19BVURJTykgeworICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfU0FNUExFX1JBVEUsICZpMzIpKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoInNhbXBsZSByYXRlIGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBhdWRpbyBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKEtFWV9DSEFOTkVMX0NPVU5ULCAmaTMyKSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJjaGFubmVsIGNvdW50IGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBhdWRpbyBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikKKyAgICAgICAgICAgICAgICAgICAgJiYgIW1pbWUuZXF1YWxzSWdub3JlQ2FzZShNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKQorICAgICAgICAgICAgICAgICAgICAmJiAhbXNnLT5maW5kSW50MzIoS0VZX0JJVF9SQVRFLCAmaTMyKQorICAgICAgICAgICAgICAgICAgICAmJiAhbXNnLT5maW5kRmxvYXQoS0VZX0JJVF9SQVRFLCAmZmx0KSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJiaXRyYXRlIGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBhdWRpbyBlbmNvZGVycy4iKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiAoQ29uZmlnOjpJU19JTUFHRSB8IENvbmZpZzo6SVNfVklERU8pKSB7CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKEtFWV9XSURUSCwgJmkzMikpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgid2lkdGggaXMgbWlzc2luZywgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIGltYWdlL3ZpZGVvIGNvbXBvbmVudHMuIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX0hFSUdIVCwgJmkzMikpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiaGVpZ2h0IGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciBpbWFnZS92aWRlbyBjb21wb25lbnRzLiIpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikgJiYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfVklERU8pKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBtb2RlID0gQklUUkFURV9NT0RFX1ZCUjsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoS0VZX0JJVFJBVEVfTU9ERSwgJm1vZGUpICYmIG1vZGUgPT0gQklUUkFURV9NT0RFX0NRKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX1FVQUxJVFksICZpMzIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgicXVhbGl0eSBpcyBtaXNzaW5nLCB3aGljaCBpcyByZXF1aXJlZCBmb3IgdmlkZW8gZW5jb2RlcnMgaW4gQ1EuIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfQklUX1JBVEUsICZpMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW1zZy0+ZmluZEZsb2F0KEtFWV9CSVRfUkFURSwgJmZsdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJiaXRyYXRlIGlzIG1pc3NpbmcsIHdoaWNoIGlzIHJlcXVpcmVkIGZvciB2aWRlbyBlbmNvZGVycy4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMihLRVlfSV9GUkFNRV9JTlRFUlZBTCwgJmkzMikKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFtc2ctPmZpbmRGbG9hdChLRVlfSV9GUkFNRV9JTlRFUlZBTCwgJmZsdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkkgZnJhbWUgaW50ZXJ2YWwgaXMgbWlzc2luZywgd2hpY2ggaXMgcmVxdWlyZWQgZm9yIHZpZGVvIGVuY29kZXJzLiIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKEtFWV9GUkFNRV9SQVRFLCAmaTMyKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW1zZy0+ZmluZEZsb2F0KEtFWV9GUkFNRV9SQVRFLCAmZmx0KSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZnJhbWUgcmF0ZSBpcyBtaXNzaW5nLCB3aGljaCBpcyByZXF1aXJlZCBmb3IgdmlkZW8gZW5jb2RlcnMuIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSGFuZGxlIGlucHV0IHN1cmZhY2UgY29uZmlndXJhdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiAoQ29uZmlnOjpJU19WSURFTyB8IENvbmZpZzo6SVNfSU1BR0UpKQorICAgICAgICAgICAgICAgICYmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpKSB7CisgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy5yZXNldChuZXcgSW5wdXRTdXJmYWNlV3JhcHBlcjo6Q29uZmlne30pOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tTWluRnBzID0gMDsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbHVlOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQ2NChLRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSLCAmdmFsdWUpICYmIHZhbHVlID4gMCkgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bU1pbkZwcyA9IDFlNiAvIHZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEZsb2F0KAorICAgICAgICAgICAgICAgICAgICAgICAgS0VZX01BWF9GUFNfVE9fRU5DT0RFUiwgJmNvbmZpZy0+bUlTQ29uZmlnLT5tTWF4RnBzKSkgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bU1heEZwcyA9IC0xOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bU1pbkFkanVzdGVkRnBzID0gMDsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bUZpeGVkQWRqdXN0ZWRGcHMgPSAwOworICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQ2NChLRVlfTUFYX1BUU19HQVBfVE9fRU5DT0RFUiwgJnZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgPCAwICYmIHZhbHVlID49IElOVDMyX01JTikgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1GaXhlZEFkanVzdGVkRnBzID0gLTFlNiAvIHZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1NYXhGcHMgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA+IDAgJiYgdmFsdWUgPD0gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bU1pbkFkanVzdGVkRnBzID0gMWU2IC8gdmFsdWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBib29sIGNhcHR1cmVGcHNGb3VuZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGRvdWJsZSB0aW1lTGFwc2VGcHM7CisgICAgICAgICAgICAgICAgZmxvYXQgY2FwdHVyZVJhdGU7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZERvdWJsZSgidGltZS1sYXBzZS1mcHMiLCAmdGltZUxhcHNlRnBzKSkgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bUNhcHR1cmVGcHMgPSB0aW1lTGFwc2VGcHM7CisgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVGcHNGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtc2ctPmZpbmRBc0Zsb2F0KEtFWV9DQVBUVVJFX1JBVEUsICZjYXB0dXJlUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1DYXB0dXJlRnBzID0gY2FwdHVyZVJhdGU7CisgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVGcHNGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjYXB0dXJlRnBzRm91bmQpIHsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpbXNnLT5maW5kQXNGbG9hdChLRVlfRlJBTUVfUkFURSwgJmNvbmZpZy0+bUlTQ29uZmlnLT5tQ29kZWRGcHMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tU3VzcGVuZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1TdXNwZW5kQXRVcyA9IC0xOworICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKEtFWV9DUkVBVEVfSU5QVVRfU1VSRkFDRV9TVVNQRU5ERUQsICZ2YWx1ZSkgJiYgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1TdXNwZW5kZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tVXNhZ2UgPSAwOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSGFuZGxlIGRlc2lyZWQgY29sb3IgZm9ybWF0LgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKChjb25maWctPm1Eb21haW4gJiAoQ29uZmlnOjpJU19WSURFTyB8IENvbmZpZzo6SVNfSU1BR0UpKSkgeworICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQgPSAtMTsKKyAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoS0VZX0NPTE9SX0ZPUk1BVCwgJmZvcm1hdCkpIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIEFsc28gaGFuZGxlIGRlZmF1bHQgY29sb3IgZm9ybWF0IChlbmNvZGVycyByZXF1aXJlIGNvbG9yIGZvcm1hdCwgc28gdGhpcyBpcyBvbmx5CisgICAgICAgICAgICAgICAgICogbmVlZGVkIGZvciBkZWNvZGVycy4KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoIShjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpKSB7CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9IChzdXJmYWNlID09IG51bGxwdHIpID8gQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyIDogQ09MT1JfRm9ybWF0U3VyZmFjZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChmb3JtYXQgPj0gMCkgeworICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImFuZHJvaWQuX2NvbG9yLWZvcm1hdCIsIGZvcm1hdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGNvbmZpZ1VwZGF0ZTsKKyAgICAgICAgLy8gTk9URTogV2UgdXNlZCB0byBpZ25vcmUgInZpZGVvLWJpdHJhdGUiIGF0IGNvbmZpZ3VyZTsgcmVwbGljYXRlCisgICAgICAgIC8vICAgICAgIHRoZSBiZWhhdmlvciBoZXJlLgorICAgICAgICBzcDxBTWVzc2FnZT4gc2RrUGFyYW1zID0gbXNnOworICAgICAgICBpbnQzMl90IHZpZGVvQml0cmF0ZTsKKyAgICAgICAgaWYgKHNka1BhcmFtcy0+ZmluZEludDMyKFBBUkFNRVRFUl9LRVlfVklERU9fQklUUkFURSwgJnZpZGVvQml0cmF0ZSkpIHsKKyAgICAgICAgICAgIHNka1BhcmFtcyA9IG1zZy0+ZHVwKCk7CisgICAgICAgICAgICBzZGtQYXJhbXMtPnJlbW92ZUVudHJ5QXQoc2RrUGFyYW1zLT5maW5kRW50cnlCeU5hbWUoUEFSQU1FVEVSX0tFWV9WSURFT19CSVRSQVRFKSk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3QgZXJyID0gY29uZmlnLT5nZXRDb25maWdVcGRhdGVGcm9tU2RrUGFyYW1zKAorICAgICAgICAgICAgICAgIGNvbXAsIHNka1BhcmFtcywgQ29uZmlnOjpJU19DT05GSUcsIEMyX0RPTlRfQkxPQ0ssICZjb25maWdVcGRhdGUpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiZmFpbGVkIHRvIGNvbnZlcnQgY29uZmlndXJhdGlvbiB0byBjMiBwYXJhbXMiKTsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgbWF4QmZyYW1lcyA9IDA7CisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKQorICAgICAgICAgICAgICAgICYmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX1ZJREVPKQorICAgICAgICAgICAgICAgICYmIHNka1BhcmFtcy0+ZmluZEludDMyKEtFWV9NQVhfQl9GUkFNRVMsICZtYXhCZnJhbWVzKQorICAgICAgICAgICAgICAgICYmIG1heEJmcmFtZXMgPiAwKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJlYW1Hb3BUdW5pbmc6Om91dHB1dD4gZ29wID0KKyAgICAgICAgICAgICAgICBDMlN0cmVhbUdvcFR1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgyIC8qIGZsZXhDb3VudCAqLywgMHUgLyogc3RyZWFtICovKTsKKyAgICAgICAgICAgIGdvcC0+bS52YWx1ZXNbMF0gPSB7IFBfRlJBTUUsIFVJTlQzMl9NQVggfTsKKyAgICAgICAgICAgIGdvcC0+bS52YWx1ZXNbMV0gPSB7CisgICAgICAgICAgICAgICAgQzJDb25maWc6OnBpY3R1cmVfdHlwZV90KFBfRlJBTUUgfCBCX0ZSQU1FKSwKKyAgICAgICAgICAgICAgICB1aW50MzJfdChtYXhCZnJhbWVzKQorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGNvbmZpZ1VwZGF0ZS5wdXNoX2JhY2soc3RkOjptb3ZlKGdvcCkpOworICAgICAgICB9CisKKyAgICAgICAgZXJyID0gY29uZmlnLT5zZXRQYXJhbWV0ZXJzKGNvbXAsIGNvbmZpZ1VwZGF0ZSwgQzJfRE9OVF9CTE9DSyk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gY29uZmlndXJlIGMyIHBhcmFtcyIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgICAgICBDMlN0cmVhbVVzYWdlVHVuaW5nOjppbnB1dCB1c2FnZSgwdSwgMHUpOworICAgICAgICBDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjppbnB1dCBtYXhJbnB1dFNpemUoMHUsIDB1KTsKKyAgICAgICAgQzJQcmVwZW5kSGVhZGVyTW9kZVNldHRpbmcgcHJlcGVuZChQUkVQRU5EX0hFQURFUl9UT19OT05FKTsKKworICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8QzJQYXJhbTo6SW5kZXg+IGluZGljZXMgeworICAgICAgICB9OworICAgICAgICBjMl9zdGF0dXNfdCBjMmVyciA9IGNvbXAtPnF1ZXJ5KAorICAgICAgICAgICAgICAgIHsgJnVzYWdlLCAmbWF4SW5wdXRTaXplLCAmcHJlcGVuZCB9LAorICAgICAgICAgICAgICAgIGluZGljZXMsCisgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgaWYgKGMyZXJyICE9IEMyX09LICYmIGMyZXJyICE9IEMyX0JBRF9JTkRFWCkgeworICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBxdWVyeSBjb21wb25lbnQgaW50ZXJmYWNlOiAlZCIsIGMyZXJyKTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbXMuc2l6ZSgpICE9IGluZGljZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiQ29tcG9uZW50IHJldHVybnMgd3JvbmcgbnVtYmVyIG9mIHBhcmFtczogZXhwZWN0ZWQgJXp1IGFjdHVhbCAlenUiLAorICAgICAgICAgICAgICAgICAgICBpbmRpY2VzLnNpemUoKSwgcGFyYW1zLnNpemUoKSk7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBpZiAodXNhZ2UpIHsKKyAgICAgICAgICAgIGlmICh1c2FnZS52YWx1ZSAmIEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDMyKCJ1c2luZy1zdy1yZWFkLW9mdGVuIiwgdHJ1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoY29uZmlnLT5tSVNDb25maWcpIHsKKyAgICAgICAgICAgICAgICBDMkFuZHJvaWRNZW1vcnlVc2FnZSBhbmRyb2lkVXNhZ2UoQzJNZW1vcnlVc2FnZSh1c2FnZS52YWx1ZSkpOworICAgICAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tVXNhZ2UgPSBhbmRyb2lkVXNhZ2UuYXNHcmFsbG9jVXNhZ2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIE5PVEU6IHdlIGRvbid0IGJsaW5kbHkgdXNlIGNsaWVudCBzcGVjaWZpZWQgaW5wdXQgc2l6ZSBpZiBzcGVjaWZpZWQgYXMgY2xpZW50cworICAgICAgICAvLyBhdCB0aW1lcyBzcGVjaWZ5IHRvbyBzbWFsbCBzaXplLiBJbnN0ZWFkLCBtaW1pYyB0aGUgYmVoYXZpb3IgZnJvbSBPTVgsIHdoZXJlIHRoZQorICAgICAgICAvLyBjbGllbnQgc3BlY2lmaWVkIHNpemUgaXMgb25seSB1c2VkIHRvIGFzayBmb3IgYmlnZ2VyIGJ1ZmZlcnMgdGhhbiBjb21wb25lbnQgc3VnZ2VzdGVkCisgICAgICAgIC8vIHNpemUuCisgICAgICAgIGludDMyX3QgY2xpZW50SW5wdXRTaXplID0gMDsKKyAgICAgICAgYm9vbCBjbGllbnRTcGVjaWZpZWRJbnB1dFNpemUgPQorICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoS0VZX01BWF9JTlBVVF9TSVpFLCAmY2xpZW50SW5wdXRTaXplKSAmJiBjbGllbnRJbnB1dFNpemUgPiAwOworICAgICAgICAvLyBURU1QOiBlbmZvcmNlIG1pbmltdW0gYnVmZmVyIHNpemUgb2YgMU1CIGZvciB2aWRlbyBkZWNvZGVycworICAgICAgICAvLyBhbmQgMTZLIC8gNEsgZm9yIGF1ZGlvIGVuY29kZXJzL2RlY29kZXJzCisgICAgICAgIGlmIChtYXhJbnB1dFNpemUudmFsdWUgPT0gMCkgeworICAgICAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfQVVESU8pIHsKKyAgICAgICAgICAgICAgICBtYXhJbnB1dFNpemUudmFsdWUgPSBlbmNvZGVyID8gMTYzODQgOiA0MDk2OworICAgICAgICAgICAgfSBlbHNlIGlmICghZW5jb2RlcikgeworICAgICAgICAgICAgICAgIG1heElucHV0U2l6ZS52YWx1ZSA9IDEwNDg1NzZ1OworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdmVyaWZ5IHRoYXQgQ1NEIGZpdHMgaW50byB0aGlzIHNpemUgKGlmIGRlZmluZWQpCisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19ERUNPREVSKSAmJiBtYXhJbnB1dFNpemUudmFsdWUgPiAwKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBjc2Q7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpeCA9IDA7IG1zZy0+ZmluZEJ1ZmZlcihTdHJpbmdQcmludGYoImNzZC0lenUiLCBpeCkuY19zdHIoKSwgJmNzZCk7ICsraXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoY3NkICYmIGNzZC0+c2l6ZSgpID4gbWF4SW5wdXRTaXplLnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIG1heElucHV0U2l6ZS52YWx1ZSA9IGNzZC0+c2l6ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IGRvIHRoaXMgYmFzZWQgb24gY29tcG9uZW50IHJlcXVpcmluZyBsaW5lYXIgYWxsb2NhdG9yIGZvciBpbnB1dAorICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfREVDT0RFUikgfHwgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfQVVESU8pKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50U3BlY2lmaWVkSW5wdXRTaXplKSB7CisgICAgICAgICAgICAgICAgLy8gV2FybiB0aGF0IHdlJ3JlIG92ZXJyaWRpbmcgY2xpZW50J3MgbWF4IGlucHV0IHNpemUgaWYgbmVjZXNzYXJ5LgorICAgICAgICAgICAgICAgIGlmICgodWludDMyX3QpY2xpZW50SW5wdXRTaXplIDwgbWF4SW5wdXRTaXplLnZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJjbGllbnQgcmVxdWVzdGVkIG1heCBpbnB1dCBzaXplICVkLCB3aGljaCBpcyBzbWFsbGVyIHRoYW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAid2hhdCBjb21wb25lbnQgcmVjb21tZW5kZWQgKCV1KTsgb3ZlcnJpZGluZyB3aXRoIGNvbXBvbmVudCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWNvbW1lbmRhdGlvbi4iLCBjbGllbnRJbnB1dFNpemUsIG1heElucHV0U2l6ZS52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJUaGlzIGJlaGF2aW9yIGlzIHN1YmplY3QgdG8gY2hhbmdlLiBJdCBpcyByZWNvbW1lbmRlZCB0aGF0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFwcCBkZXZlbG9wZXJzIGRvdWJsZSBjaGVjayB3aGV0aGVyIHRoZSByZXF1ZXN0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAibWF4IGlucHV0IHNpemUgaXMgaW4gcmVhc29uYWJsZSByYW5nZS4iKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBtYXhJbnB1dFNpemUudmFsdWUgPSBjbGllbnRJbnB1dFNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gUGFzcyBtYXggaW5wdXQgc2l6ZSBvbiBpbnB1dCBmb3JtYXQgdG8gdGhlIGJ1ZmZlciBjaGFubmVsIChpZiBzdXBwbGllZCBieSB0aGUKKyAgICAgICAgICAgIC8vIGNvbXBvbmVudCBvciBieSBhIGRlZmF1bHQpCisgICAgICAgICAgICBpZiAobWF4SW5wdXRTaXplLnZhbHVlKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAgS0VZX01BWF9JTlBVVF9TSVpFLAorICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpKGMyX21pbihtYXhJbnB1dFNpemUudmFsdWUsIHVpbnQzMl90KElOVDMyX01BWCkpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGNsaWVudFByZXBlbmQ7CisgICAgICAgIGlmICgoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19WSURFTykKKyAgICAgICAgICAgICAgICAmJiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19FTkNPREVSKQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKEtFWV9QUkVQRU5EX0hFQURFUlNfVE9fU1lOQ19GUkFNRVMsICZjbGllbnRQcmVwZW5kKQorICAgICAgICAgICAgICAgICYmIGNsaWVudFByZXBlbmQKKyAgICAgICAgICAgICAgICAmJiAoIXByZXBlbmQgfHwgcHJlcGVuZC52YWx1ZSAhPSBQUkVQRU5EX0hFQURFUl9UT19BTExfU1lOQykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IEtFWV9QUkVQRU5EX0hFQURFUlNfVE9fU1lOQ19GUkFNRVMiKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIChDb25maWc6OklTX1ZJREVPIHwgQ29uZmlnOjpJU19JTUFHRSkpKSB7CisgICAgICAgICAgICAvLyBwcm9wYWdhdGUgSERSIHN0YXRpYyBpbmZvIHRvIG91dHB1dCBmb3JtYXQgZm9yIGJvdGggZW5jb2RlcnMgYW5kIGRlY29kZXJzCisgICAgICAgICAgICAvLyBpZiBjb21wb25lbnQgc3VwcG9ydHMgdGhpcyBpbmZvLCB3ZSB3aWxsIHVwZGF0ZSBmcm9tIGNvbXBvbmVudCwgYnV0IG9ubHkgdGhlIHJhdyBwb3J0LAorICAgICAgICAgICAgLy8gc28gZG9uJ3QgcHJvcGFnYXRlIGlmIGNvbXBvbmVudCBhbHJlYWR5IGZpbGxlZCBpdCBpbi4KKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGhkckluZm87CisgICAgICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKEtFWV9IRFJfU1RBVElDX0lORk8sICZoZHJJbmZvKQorICAgICAgICAgICAgICAgICAgICAmJiAhY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5maW5kQnVmZmVyKEtFWV9IRFJfU1RBVElDX0lORk8sICZoZHJJbmZvKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+c2V0QnVmZmVyKEtFWV9IRFJfU1RBVElDX0lORk8sIGhkckluZm8pOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTZXQgZGVzaXJlZCBjb2xvciBmb3JtYXQgZnJvbSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcgorICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQ7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImFuZHJvaWQuX2NvbG9yLWZvcm1hdCIsICZmb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0NPTE9SX0ZPUk1BVCwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBjb25maWctPm1PdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9DT0xPUl9GT1JNQVQsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gcHJvcGFnYXRlIGVuY29kZXIgZGVsYXkgYW5kIHBhZGRpbmcgdG8gb3V0cHV0IGZvcm1hdAorICAgICAgICBpZiAoKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfREVDT0RFUikgJiYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfQVVESU8pKSB7CisgICAgICAgICAgICBpbnQgZGVsYXkgPSAwOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJlbmNvZGVyLWRlbGF5IiwgJmRlbGF5KSkgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImVuY29kZXItZGVsYXkiLCBkZWxheSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgcGFkZGluZyA9IDA7CisgICAgICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImVuY29kZXItcGFkZGluZyIsICZwYWRkaW5nKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+c2V0SW50MzIoImVuY29kZXItcGFkZGluZyIsIHBhZGRpbmcpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gc2V0IGNoYW5uZWwtbWFzaworICAgICAgICBpZiAoY29uZmlnLT5tRG9tYWluICYgQ29uZmlnOjpJU19BVURJTykgeworICAgICAgICAgICAgaW50MzJfdCBtYXNrOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKEtFWV9DSEFOTkVMX01BU0ssICZtYXNrKSkgeworICAgICAgICAgICAgICAgIGlmIChjb25maWctPm1Eb21haW4gJiBDb25maWc6OklTX0VOQ09ERVIpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRGb3JtYXQtPnNldEludDMyKEtFWV9DSEFOTkVMX01BU0ssIG1hc2spOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0NIQU5ORUxfTUFTSywgbWFzayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQUxPR0QoInNldHVwIGZvcm1hdHMgaW5wdXQ6ICVzIGFuZCBvdXRwdXQ6ICVzIiwKKyAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgIGNvbmZpZy0+bU91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3IoZG9Db25maWcpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisKKyAgICBtQ2FsbGJhY2stPm9uQ29tcG9uZW50Q29uZmlndXJlZChjb25maWctPm1JbnB1dEZvcm1hdCwgY29uZmlnLT5tT3V0cHV0Rm9ybWF0KTsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlQ3JlYXRlSW5wdXRTdXJmYWNlKCkgeworICAgIHN0YXR1c190IGVyciA9IFt0aGlzXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBBTExPQ0FURUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IHJlYWQgaXQgZnJvbSBpbnRmKCkgcHJvcGVybHkuCisgICAgICAgIGlmIChzdGF0ZS0+Y29tcC0+Z2V0TmFtZSgpLmZpbmQoImVuY29kZXIiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9KCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlQ3JlYXRpb25GYWlsZWQoZXJyKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRDcmVhdGVJbnB1dFN1cmZhY2UsIHRoaXMpKS0+cG9zdCgpOworfQorCitzcDxQZXJzaXN0ZW50U3VyZmFjZT4gQ0NvZGVjOjpDcmVhdGVPbXhJbnB1dFN1cmZhY2UoKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOworICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6dXRpbHM7CisgICAgdXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OnV0aWxzOworICAgIHR5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OlN0YXR1cyBPbXhTdGF0dXM7CisgICAgYW5kcm9pZDo6c3A8SU9teD4gb214ID0gSU9teDo6Z2V0U2VydmljZSgpOworICAgIHR5cGVkZWYgYW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisgICAgdHlwZWRlZiBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6CisgICAgICAgICAgICBJR3JhcGhpY0J1ZmZlclNvdXJjZSBIR3JhcGhpY0J1ZmZlclNvdXJjZTsKKyAgICBPbXhTdGF0dXMgczsKKyAgICBhbmRyb2lkOjpzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnYnA7CisgICAgYW5kcm9pZDo6c3A8SEdyYXBoaWNCdWZmZXJTb3VyY2U+IGdiczsKKworICAgIHVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNTdGF0dXMgPSBvbXgtPmNyZWF0ZUlucHV0U3VyZmFjZSgKKyAgICAgICAgICAgIFsmcywgJmdicCwgJmdic10oCisgICAgICAgICAgICAgICAgICAgIE9teFN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGFuZHJvaWQ6OnNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+JiBwcm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYW5kcm9pZDo6c3A8SEdyYXBoaWNCdWZmZXJTb3VyY2U+JiBzb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBzID0gc3RhdHVzOworICAgICAgICAgICAgICAgIGdicCA9IHByb2R1Y2VyOworICAgICAgICAgICAgICAgIGdicyA9IHNvdXJjZTsKKyAgICAgICAgICAgIH0pOworICAgIGlmICh0cmFuc1N0YXR1cy5pc09rKCkgJiYgcyA9PSBPbXhTdGF0dXM6Ok9LKSB7CisgICAgICAgIHJldHVybiBuZXcgUGVyc2lzdGVudFN1cmZhY2UoCisgICAgICAgICAgICAgICAgbmV3IEgyQkdyYXBoaWNCdWZmZXJQcm9kdWNlcihnYnApLAorICAgICAgICAgICAgICAgIHNwPDo6YW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJTb3VyY2U+KG5ldyBMV0dyYXBoaWNCdWZmZXJTb3VyY2UoZ2JzKSkpOworICAgIH0KKworICAgIHJldHVybiBudWxscHRyOworfQorCitzcDxQZXJzaXN0ZW50U3VyZmFjZT4gQ0NvZGVjOjpDcmVhdGVDb21wYXRpYmxlSW5wdXRTdXJmYWNlKCkgeworICAgIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBzdXJmYWNlKENyZWF0ZUlucHV0U3VyZmFjZSgpKTsKKworICAgIGlmIChzdXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgc3VyZmFjZSA9IENyZWF0ZU9teElucHV0U3VyZmFjZSgpOworICAgIH0KKworICAgIHJldHVybiBzdXJmYWNlOworfQorCit2b2lkIENDb2RlYzo6Y3JlYXRlSW5wdXRTdXJmYWNlKCkgeworICAgIHN0YXR1c190IGVycjsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBidWZmZXJQcm9kdWNlcjsKKworICAgIHNwPEFNZXNzYWdlPiBpbnB1dEZvcm1hdDsKKyAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0OworICAgIHVpbnQ2NF90IHVzYWdlID0gMDsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgaW5wdXRGb3JtYXQgPSBjb25maWctPm1JbnB1dEZvcm1hdDsKKyAgICAgICAgb3V0cHV0Rm9ybWF0ID0gY29uZmlnLT5tT3V0cHV0Rm9ybWF0OworICAgICAgICB1c2FnZSA9IGNvbmZpZy0+bUlTQ29uZmlnID8gY29uZmlnLT5tSVNDb25maWctPm1Vc2FnZSA6IDA7CisgICAgfQorCisgICAgc3A8UGVyc2lzdGVudFN1cmZhY2U+IHBlcnNpc3RlbnRTdXJmYWNlID0gQ3JlYXRlQ29tcGF0aWJsZUlucHV0U3VyZmFjZSgpOworCisgICAgaWYgKHBlcnNpc3RlbnRTdXJmYWNlLT5nZXRIaWRsVGFyZ2V0KCkpIHsKKyAgICAgICAgc3A8SUlucHV0U3VyZmFjZT4gaGlkbElucHV0U3VyZmFjZSA9IElJbnB1dFN1cmZhY2U6OmNhc3RGcm9tKAorICAgICAgICAgICAgICAgIHBlcnNpc3RlbnRTdXJmYWNlLT5nZXRIaWRsVGFyZ2V0KCkpOworICAgICAgICBpZiAoIWhpZGxJbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDb3JydXB0ZWQgaW5wdXQgc3VyZmFjZSIpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZUNyZWF0aW9uRmFpbGVkKFVOS05PV05fRVJST1IpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4gaW5wdXRTdXJmYWNlID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPENvZGVjMkNsaWVudDo6SW5wdXRTdXJmYWNlPihoaWRsSW5wdXRTdXJmYWNlKTsKKyAgICAgICAgZXJyID0gc2V0dXBJbnB1dFN1cmZhY2Uoc3RkOjptYWtlX3NoYXJlZDxDMklucHV0U3VyZmFjZVdyYXBwZXI+KAorICAgICAgICAgICAgICAgIGlucHV0U3VyZmFjZSkpOworICAgICAgICBidWZmZXJQcm9kdWNlciA9IGlucHV0U3VyZmFjZS0+Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MzJfdCB3aWR0aCA9IDA7CisgICAgICAgICh2b2lkKW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCk7CisgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gMDsKKyAgICAgICAgKHZvaWQpb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpOworICAgICAgICBlcnIgPSBzZXR1cElucHV0U3VyZmFjZShzdGQ6Om1ha2Vfc2hhcmVkPEdyYXBoaWNCdWZmZXJTb3VyY2VXcmFwcGVyPigKKyAgICAgICAgICAgICAgICBwZXJzaXN0ZW50U3VyZmFjZS0+Z2V0QnVmZmVyU291cmNlKCksIHdpZHRoLCBoZWlnaHQsIHVzYWdlKSk7CisgICAgICAgIGJ1ZmZlclByb2R1Y2VyID0gcGVyc2lzdGVudFN1cmZhY2UtPmdldEJ1ZmZlclByb2R1Y2VyKCk7CisgICAgfQorCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCB1cCBpbnB1dCBzdXJmYWNlOiAlZCIsIGVycik7CisgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VDcmVhdGlvbkZhaWxlZChlcnIpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUNhbGxiYWNrLT5vbklucHV0U3VyZmFjZUNyZWF0ZWQoCisgICAgICAgICAgICBpbnB1dEZvcm1hdCwKKyAgICAgICAgICAgIG91dHB1dEZvcm1hdCwKKyAgICAgICAgICAgIG5ldyBCdWZmZXJQcm9kdWNlcldyYXBwZXIoYnVmZmVyUHJvZHVjZXIpKTsKK30KKworc3RhdHVzX3QgQ0NvZGVjOjpzZXR1cElucHV0U3VyZmFjZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlV3JhcHBlcj4gJnN1cmZhY2UpIHsKKyAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgY29uZmlnLT5tVXNpbmdTdXJmYWNlID0gdHJ1ZTsKKworICAgIC8vIHdlIGFyZSBub3cgdXNpbmcgc3VyZmFjZSAtIGFwcGx5IGRlZmF1bHQgY29sb3IgYXNwZWN0cyB0byBpbnB1dCBmb3JtYXQgLSBhcyB3ZWxsIGFzCisgICAgLy8gZ2V0IGRhdGFzcGFjZQorICAgIGJvb2wgaW5wdXRGb3JtYXRDaGFuZ2VkID0gY29uZmlnLT51cGRhdGVGb3JtYXRzKGNvbmZpZy0+SVNfSU5QVVQpOworICAgIEFMT0dEKCJpbnB1dCBmb3JtYXQgJXMgdG8gJXMiLAorICAgICAgICAgICAgaW5wdXRGb3JtYXRDaGFuZ2VkID8gImNoYW5nZWQiIDogInVuY2hhbmdlZCIsCisgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKworICAgIC8vIGNvbmZpZ3VyZSBkYXRhc3BhY2UKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihpbnQzMl90KSA9PSBzaXplb2YoYW5kcm9pZF9kYXRhc3BhY2UpLCAiZGF0YXNwYWNlIHNpemUgbWlzbWF0Y2giKTsKKyAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UgPSBIQUxfREFUQVNQQUNFX1VOS05PV047CisgICAgKHZvaWQpY29uZmlnLT5tSW5wdXRGb3JtYXQtPmZpbmRJbnQzMigiYW5kcm9pZC5fZGF0YXNwYWNlIiwgKGludDMyX3QqKSZkYXRhU3BhY2UpOworICAgIHN1cmZhY2UtPnNldERhdGFTcGFjZShkYXRhU3BhY2UpOworCisgICAgc3RhdHVzX3QgZXJyID0gbUNoYW5uZWwtPnNldElucHV0U3VyZmFjZShzdXJmYWNlKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIC8vIHVuZG8gaW5wdXQgZm9ybWF0IHVwZGF0ZQorICAgICAgICBjb25maWctPm1Vc2luZ1N1cmZhY2UgPSBmYWxzZTsKKyAgICAgICAgKHZvaWQpY29uZmlnLT51cGRhdGVGb3JtYXRzKGNvbmZpZy0+SVNfSU5QVVQpOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKyAgICBjb25maWctPm1JbnB1dFN1cmZhY2UgPSBzdXJmYWNlOworCisgICAgaWYgKGNvbmZpZy0+bUlTQ29uZmlnKSB7CisgICAgICAgIHN1cmZhY2UtPmNvbmZpZ3VyZSgqY29uZmlnLT5tSVNDb25maWcpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCJJU0NvbmZpZzogbm8gY29uZmlndXJhdGlvbiIpOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlU2V0SW5wdXRTdXJmYWNlKGNvbnN0IHNwPFBlcnNpc3RlbnRTdXJmYWNlPiAmc3VyZmFjZSkgeworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRJbnB1dFN1cmZhY2UsIHRoaXMpOworICAgIG1zZy0+c2V0T2JqZWN0KCJzdXJmYWNlIiwgc3VyZmFjZSk7CisgICAgbXNnLT5wb3N0KCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgc3A8QU1lc3NhZ2U+IGlucHV0Rm9ybWF0OworICAgIHNwPEFNZXNzYWdlPiBvdXRwdXRGb3JtYXQ7CisgICAgdWludDY0X3QgdXNhZ2UgPSAwOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgICAgICBpbnB1dEZvcm1hdCA9IGNvbmZpZy0+bUlucHV0Rm9ybWF0OworICAgICAgICBvdXRwdXRGb3JtYXQgPSBjb25maWctPm1PdXRwdXRGb3JtYXQ7CisgICAgICAgIHVzYWdlID0gY29uZmlnLT5tSVNDb25maWcgPyBjb25maWctPm1JU0NvbmZpZy0+bVVzYWdlIDogMDsKKyAgICB9CisgICAgYXV0byBoaWRsVGFyZ2V0ID0gc3VyZmFjZS0+Z2V0SGlkbFRhcmdldCgpOworICAgIGlmIChoaWRsVGFyZ2V0KSB7CisgICAgICAgIHNwPElJbnB1dFN1cmZhY2U+IGlucHV0U3VyZmFjZSA9CisgICAgICAgICAgICAgICAgSUlucHV0U3VyZmFjZTo6Y2FzdEZyb20oaGlkbFRhcmdldCk7CisgICAgICAgIGlmICghaW5wdXRTdXJmYWNlKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBpbnB1dCBzdXJmYWNlOiBDb3JydXB0ZWQgc3VyZmFjZS4iKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VEZWNsaW5lZChVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXR1cElucHV0U3VyZmFjZShzdGQ6Om1ha2Vfc2hhcmVkPEMySW5wdXRTdXJmYWNlV3JhcHBlcj4oCisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDb2RlYzJDbGllbnQ6OklucHV0U3VyZmFjZT4oaW5wdXRTdXJmYWNlKSkpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCB1cCBpbnB1dCBzdXJmYWNlOiAlZCIsIGVycik7CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uSW5wdXRTdXJmYWNlRGVjbGluZWQoZXJyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGludDMyX3Qgd2lkdGggPSAwOworICAgICAgICAodm9pZClvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpOworICAgICAgICBpbnQzMl90IGhlaWdodCA9IDA7CisgICAgICAgICh2b2lkKW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0dXBJbnB1dFN1cmZhY2Uoc3RkOjptYWtlX3NoYXJlZDxHcmFwaGljQnVmZmVyU291cmNlV3JhcHBlcj4oCisgICAgICAgICAgICAgICAgc3VyZmFjZS0+Z2V0QnVmZmVyU291cmNlKCksIHdpZHRoLCBoZWlnaHQsIHVzYWdlKSk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2V0IHVwIGlucHV0IHN1cmZhY2U6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VEZWNsaW5lZChlcnIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIG1DYWxsYmFjay0+b25JbnB1dFN1cmZhY2VBY2NlcHRlZChpbnB1dEZvcm1hdCwgb3V0cHV0Rm9ybWF0KTsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlU3RhcnQoKSB7CisgICAgYXV0byBzZXRTdGFydGluZyA9IFt0aGlzXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBBTExPQ0FURUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoU1RBUlRJTkcpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihzZXRTdGFydGluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdGFydCwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzdGFydCgpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgYXV0byBjaGVja1N0YXJ0aW5nID0gW3RoaXMsICZjb21wXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBTVEFSVElORykgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY29tcCA9IHN0YXRlLT5jb21wOworICAgICAgICByZXR1cm4gT0s7CisgICAgfTsKKyAgICBpZiAodHJ5QW5kUmVwb3J0T25FcnJvcihjaGVja1N0YXJ0aW5nKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZXJyID0gY29tcC0+c3RhcnQoKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcih0b1N0YXR1c1QoZXJyLCBDMl9PUEVSQVRJT05fQ29tcG9uZW50X3N0YXJ0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxBTWVzc2FnZT4gaW5wdXRGb3JtYXQ7CisgICAgc3A8QU1lc3NhZ2U+IG91dHB1dEZvcm1hdDsKKyAgICBzdGF0dXNfdCBlcnIyID0gT0s7CisgICAgeworICAgICAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgICAgIGlucHV0Rm9ybWF0ID0gY29uZmlnLT5tSW5wdXRGb3JtYXQ7CisgICAgICAgIC8vIHN0YXJ0IHRyaWdnZXJzIGZvcm1hdCBkdXAKKyAgICAgICAgb3V0cHV0Rm9ybWF0ID0gY29uZmlnLT5tT3V0cHV0Rm9ybWF0ID0gY29uZmlnLT5tT3V0cHV0Rm9ybWF0LT5kdXAoKTsKKyAgICAgICAgaWYgKGNvbmZpZy0+bUlucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgZXJyMiA9IGNvbmZpZy0+bUlucHV0U3VyZmFjZS0+c3RhcnQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZXJyMiAhPSBPSykgeworICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoZXJyMiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIFdlJ3JlIG5vdCBzdGFydGluZyBhZnRlciBmbHVzaC4KKyAgICAodm9pZCltU2VudENvbmZpZ0FmdGVyUmVzdW1lLnRlc3RfYW5kX3NldCgpOworICAgIGVycjIgPSBtQ2hhbm5lbC0+c3RhcnQoaW5wdXRGb3JtYXQsIG91dHB1dEZvcm1hdCk7CisgICAgaWYgKGVycjIgIT0gT0spIHsKKyAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKGVycjIsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGF1dG8gc2V0UnVubmluZyA9IFt0aGlzXSB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBTVEFSVElORykgeworICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChSVU5OSU5HKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH07CisgICAgaWYgKHRyeUFuZFJlcG9ydE9uRXJyb3Ioc2V0UnVubmluZykgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ2FsbGJhY2stPm9uU3RhcnRDb21wbGV0ZWQoKTsKKworICAgICh2b2lkKW1DaGFubmVsLT5yZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygpOworfQorCit2b2lkIENDb2RlYzo6aW5pdGlhdGVTaHV0ZG93bihib29sIGtlZXBDb21wb25lbnRBbGxvY2F0ZWQpIHsKKyAgICBpZiAoa2VlcENvbXBvbmVudEFsbG9jYXRlZCkgeworICAgICAgICBpbml0aWF0ZVN0b3AoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpbml0aWF0ZVJlbGVhc2UoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZVN0b3AoKSB7CisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gQUxMT0NBVEVECisgICAgICAgICAgICAgICAgfHwgc3RhdGUtPmdldCgpICA9PSBSRUxFQVNFRAorICAgICAgICAgICAgICAgIHx8IHN0YXRlLT5nZXQoKSA9PSBTVE9QUElORworICAgICAgICAgICAgICAgIHx8IHN0YXRlLT5nZXQoKSA9PSBSRUxFQVNJTkcpIHsKKyAgICAgICAgICAgIC8vIFdlJ3JlIGFscmVhZHkgc3RvcHBlZCwgcmVsZWFzZWQsIG9yIGRvaW5nIGl0IHJpZ2h0IG5vdy4KKyAgICAgICAgICAgIHN0YXRlLnVubG9jaygpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vblN0b3BDb21wbGV0ZWQoKTsKKyAgICAgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzdGF0ZS0+c2V0KFNUT1BQSU5HKTsKKyAgICB9CisKKyAgICBtQ2hhbm5lbC0+c3RvcCgpOworICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OnN0b3AoKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IFJFTEVBU0lORykgeworICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICAvLyBXZSdyZSBhbHJlYWR5IHN0b3BwZWQgb3IgcmVsZWFzZSBpcyBpbiBwcm9ncmVzcy4KKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25TdG9wQ29tcGxldGVkKCk7CisgICAgICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoc3RhdGUtPmdldCgpICE9IFNUT1BQSU5HKSB7CisgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgY29tcCA9IHN0YXRlLT5jb21wOworICAgIH0KKyAgICBzdGF0dXNfdCBlcnIgPSBjb21wLT5zdG9wKCk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAvLyBUT0RPOiBjb252ZXJ0IGVyciBpbnRvIHN0YXR1c190CisgICAgICAgIG1DYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgICAgIGlmIChjb25maWctPm1JbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZS0+ZGlzY29ubmVjdCgpOworICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRTdXJmYWNlID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBTVE9QUElORykgeworICAgICAgICAgICAgc3RhdGUtPnNldChBTExPQ0FURUQpOworICAgICAgICB9CisgICAgfQorICAgIG1DYWxsYmFjay0+b25TdG9wQ29tcGxldGVkKCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjppbml0aWF0ZVJlbGVhc2UoYm9vbCBzZW5kQ2FsbGJhY2sgLyogPSB0cnVlICovKSB7CisgICAgYm9vbCBjbGVhcklucHV0U3VyZmFjZUlmTmVlZGVkID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gUkVMRUFTRUQgfHwgc3RhdGUtPmdldCgpID09IFJFTEVBU0lORykgeworICAgICAgICAgICAgLy8gV2UncmUgYWxyZWFkeSByZWxlYXNlZCBvciBkb2luZyBpdCByaWdodCBub3cuCisgICAgICAgICAgICBpZiAoc2VuZENhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLT5vblJlbGVhc2VDb21wbGV0ZWQoKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBBTExPQ0FUSU5HKSB7CisgICAgICAgICAgICBzdGF0ZS0+c2V0KFJFTEVBU0lORyk7CisgICAgICAgICAgICAvLyBXaXRoIHRoZSBhbHRlcmVkIHN0YXRlIGFsbG9jYXRlKCkgd291bGQgZmFpbCBhbmQgY2xlYW4gdXAuCisgICAgICAgICAgICBpZiAoc2VuZENhbGxiYWNrKSB7CisgICAgICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLT5vblJlbGVhc2VDb21wbGV0ZWQoKTsKKyAgICAgICAgICAgICAgICBzdGF0ZS5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSA9PSBTVEFSVElORworICAgICAgICAgICAgICAgIHx8IHN0YXRlLT5nZXQoKSA9PSBSVU5OSU5HCisgICAgICAgICAgICAgICAgfHwgc3RhdGUtPmdldCgpID09IFNUT1BQSU5HKSB7CisgICAgICAgICAgICAvLyBJbnB1dCBzdXJmYWNlIG1heSBoYXZlIGJlZW4gc3RhcnRlZCwgc28gY2xlYW4gdXAgaXMgbmVlZGVkLgorICAgICAgICAgICAgY2xlYXJJbnB1dFN1cmZhY2VJZk5lZWRlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICAgICAgc3RhdGUtPnNldChSRUxFQVNJTkcpOworICAgIH0KKworICAgIGlmIChjbGVhcklucHV0U3VyZmFjZUlmTmVlZGVkKSB7CisgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgaWYgKGNvbmZpZy0+bUlucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgY29uZmlnLT5tSW5wdXRTdXJmYWNlLT5kaXNjb25uZWN0KCk7CisgICAgICAgICAgICBjb25maWctPm1JbnB1dFN1cmZhY2UgPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorCisgICAgbUNoYW5uZWwtPnN0b3AoKTsKKyAgICAvLyB0aGl6IGhvbGRzIHN0cm9uZyByZWYgdG8gdGhpcyB3aGlsZSB0aGUgdGhyZWFkIGlzIHJ1bm5pbmcuCisgICAgc3A8Q0NvZGVjPiB0aGl6KHRoaXMpOworICAgIHN0ZDo6dGhyZWFkKFt0aGl6LCBzZW5kQ2FsbGJhY2tdIHsgdGhpei0+cmVsZWFzZShzZW5kQ2FsbGJhY2spOyB9KS5kZXRhY2goKTsKK30KKwordm9pZCBDQ29kZWM6OnJlbGVhc2UoYm9vbCBzZW5kQ2FsbGJhY2spIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gUkVMRUFTRUQpIHsKKyAgICAgICAgICAgIGlmIChzZW5kQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICBzdGF0ZS51bmxvY2soKTsKKyAgICAgICAgICAgICAgICBtQ2FsbGJhY2stPm9uUmVsZWFzZUNvbXBsZXRlZCgpOworICAgICAgICAgICAgICAgIHN0YXRlLmxvY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgfQorICAgIGNvbXAtPnJlbGVhc2UoKTsKKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBzdGF0ZS0+c2V0KFJFTEVBU0VEKTsKKyAgICAgICAgc3RhdGUtPmNvbXAucmVzZXQoKTsKKyAgICB9CisgICAgaWYgKHNlbmRDYWxsYmFjaykgeworICAgICAgICBtQ2FsbGJhY2stPm9uUmVsZWFzZUNvbXBsZXRlZCgpOworICAgIH0KK30KKworc3RhdHVzX3QgQ0NvZGVjOjpzZXRTdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgcmV0dXJuIG1DaGFubmVsLT5zZXRTdXJmYWNlKHN1cmZhY2UpOworfQorCit2b2lkIENDb2RlYzo6c2lnbmFsRmx1c2goKSB7CisgICAgc3RhdHVzX3QgZXJyID0gW3RoaXNdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpID09IEZMVVNIRUQpIHsKKyAgICAgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IFJVTk5JTkcpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoRkxVU0hJTkcpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfSgpOworICAgIHN3aXRjaCAoZXJyKSB7CisgICAgICAgIGNhc2UgQUxSRUFEWV9FWElTVFM6CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uRmx1c2hDb21wbGV0ZWQoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgY2FzZSBPSzoKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgbUNhbGxiYWNrLT5vbkVycm9yKGVyciwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1DaGFubmVsLT5zdG9wKCk7CisgICAgKG5ldyBBTWVzc2FnZShrV2hhdEZsdXNoLCB0aGlzKSktPnBvc3QoKTsKK30KKwordm9pZCBDQ29kZWM6OmZsdXNoKCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcDsKKyAgICBhdXRvIGNoZWNrRmx1c2hpbmcgPSBbdGhpcywgJmNvbXBdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEZMVVNISU5HKSB7CisgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGNoZWNrRmx1c2hpbmcpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IGZsdXNoZWRXb3JrOworICAgIGMyX3N0YXR1c190IGVyciA9IGNvbXAtPmZsdXNoKEMyQ29tcG9uZW50OjpGTFVTSF9DT01QT05FTlQsICZmbHVzaGVkV29yayk7CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4+OjpMb2NrZWQgcXVldWUobVdvcmtEb25lUXVldWUpOworICAgICAgICBmbHVzaGVkV29yay5zcGxpY2UoZmx1c2hlZFdvcmsuZW5kKCksICpxdWV1ZSk7CisgICAgfQorICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgLy8gVE9ETzogY29udmVydCBlcnIgaW50byBzdGF0dXNfdAorICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgIH0KKworICAgIG1DaGFubmVsLT5mbHVzaChmbHVzaGVkV29yayk7CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgc3RhdGUtPnNldChGTFVTSEVEKTsKKyAgICB9CisgICAgbUNhbGxiYWNrLT5vbkZsdXNoQ29tcGxldGVkKCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzaWduYWxSZXN1bWUoKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIGF1dG8gc2V0UmVzdW1pbmcgPSBbdGhpcywgJmNvbXBdIHsKKyAgICAgICAgTXV0ZXhlZDxTdGF0ZT46OkxvY2tlZCBzdGF0ZShtU3RhdGUpOworICAgICAgICBpZiAoc3RhdGUtPmdldCgpICE9IEZMVVNIRUQpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoUkVTVU1JTkcpOworICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKHNldFJlc3VtaW5nKSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbVNlbnRDb25maWdBZnRlclJlc3VtZS5jbGVhcigpOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgICAgICBjb25maWctPnF1ZXJ5Q29uZmlndXJhdGlvbihjb21wKTsKKyAgICB9CisKKyAgICAodm9pZCltQ2hhbm5lbC0+c3RhcnQobnVsbHB0ciwgbnVsbHB0cik7CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8U3RhdGU+OjpMb2NrZWQgc3RhdGUobVN0YXRlKTsKKyAgICAgICAgaWYgKHN0YXRlLT5nZXQoKSAhPSBSRVNVTUlORykgeworICAgICAgICAgICAgc3RhdGUudW5sb2NrKCk7CisgICAgICAgICAgICBtQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICAgICAgc3RhdGUubG9jaygpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIHN0YXRlLT5zZXQoUlVOTklORyk7CisgICAgfQorCisgICAgKHZvaWQpbUNoYW5uZWwtPnJlcXVlc3RJbml0aWFsSW5wdXRCdWZmZXJzKCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpzaWduYWxTZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBjb21wOworICAgIGF1dG8gY2hlY2tTdGF0ZSA9IFt0aGlzLCAmY29tcF0geworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gUkVMRUFTRUQpIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICBjb21wID0gc3RhdGUtPmNvbXA7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9OworICAgIGlmICh0cnlBbmRSZXBvcnRPbkVycm9yKGNoZWNrU3RhdGUpICE9IE9LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBOT1RFOiBXZSB1c2VkIHRvIGlnbm9yZSAiYml0cmF0ZSIgYXQgc2V0UGFyYW1ldGVyczsgcmVwbGljYXRlCisgICAgLy8gICAgICAgdGhlIGJlaGF2aW9yIGhlcmUuCisgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG1zZzsKKyAgICBpbnQzMl90IGJpdHJhdGU7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKEtFWV9CSVRfUkFURSwgJmJpdHJhdGUpKSB7CisgICAgICAgIHBhcmFtcyA9IG1zZy0+ZHVwKCk7CisgICAgICAgIHBhcmFtcy0+cmVtb3ZlRW50cnlBdChwYXJhbXMtPmZpbmRFbnRyeUJ5TmFtZShLRVlfQklUX1JBVEUpKTsKKyAgICB9CisKKyAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisKKyAgICAvKioKKyAgICAgKiBIYW5kbGUgaW5wdXQgc3VyZmFjZSBwYXJhbWV0ZXJzCisgICAgICovCisgICAgaWYgKChjb25maWctPm1Eb21haW4gJiAoQ29uZmlnOjpJU19WSURFTyB8IENvbmZpZzo6SVNfSU1BR0UpKQorICAgICAgICAgICAgJiYgKGNvbmZpZy0+bURvbWFpbiAmIENvbmZpZzo6SVNfRU5DT0RFUikgJiYgY29uZmlnLT5tSW5wdXRTdXJmYWNlICYmIGNvbmZpZy0+bUlTQ29uZmlnKSB7CisgICAgICAgICh2b2lkKXBhcmFtcy0+ZmluZEludDY0KFBBUkFNRVRFUl9LRVlfT0ZGU0VUX1RJTUUsICZjb25maWctPm1JU0NvbmZpZy0+bVRpbWVPZmZzZXRVcyk7CisKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDY0KCJza2lwLWZyYW1lcy1iZWZvcmUiLCAmY29uZmlnLT5tSVNDb25maWctPm1TdGFydEF0VXMpKSB7CisgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN0b3BwZWQgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChwYXJhbXMtPmZpbmRJbnQ2NCgic3RvcC10aW1lLXVzIiwgJmNvbmZpZy0+bUlTQ29uZmlnLT5tU3RvcEF0VXMpKSB7CisgICAgICAgICAgICBjb25maWctPm1JU0NvbmZpZy0+bVN0b3BwZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKFBBUkFNRVRFUl9LRVlfU1VTUEVORCwgJnZhbHVlKSkgeworICAgICAgICAgICAgY29uZmlnLT5tSVNDb25maWctPm1TdXNwZW5kZWQgPSB2YWx1ZTsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlTQ29uZmlnLT5tU3VzcGVuZEF0VXMgPSAtMTsKKyAgICAgICAgICAgICh2b2lkKXBhcmFtcy0+ZmluZEludDY0KFBBUkFNRVRFUl9LRVlfU1VTUEVORF9USU1FLCAmY29uZmlnLT5tSVNDb25maWctPm1TdXNwZW5kQXRVcyk7CisgICAgICAgIH0KKworICAgICAgICAodm9pZCljb25maWctPm1JbnB1dFN1cmZhY2UtPmNvbmZpZ3VyZSgqY29uZmlnLT5tSVNDb25maWcpOworICAgICAgICBpZiAoY29uZmlnLT5tSVNDb25maWctPm1TdG9wcGVkKSB7CisgICAgICAgICAgICBjb25maWctPm1JbnB1dEZvcm1hdC0+c2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLl9zdG9wLXRpbWUtb2Zmc2V0LXVzIiwgY29uZmlnLT5tSVNDb25maWctPm1JbnB1dERlbGF5VXMpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBjb25maWdVcGRhdGU7CisgICAgKHZvaWQpY29uZmlnLT5nZXRDb25maWdVcGRhdGVGcm9tU2RrUGFyYW1zKAorICAgICAgICAgICAgY29tcCwgcGFyYW1zLCBDb25maWc6OklTX1BBUkFNLCBDMl9NQVlfQkxPQ0ssICZjb25maWdVcGRhdGUpOworICAgIC8vIFByZWZlciB0byBwYXNzIHBhcmFtZXRlcnMgdG8gdGhlIGJ1ZmZlciBjaGFubmVsLCBzbyB0aGV5IGNhbiBiZSBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgZnJhbWVzLgorICAgIC8vIFBhcmFtZXRlciBzeW5jaHJvbml6YXRpb24gaXMgbm90IGRlZmluZWQgd2hlbiB1c2luZyBpbnB1dCBzdXJmYWNlLiBGb3Igbm93LCByb3V0ZQorICAgIC8vIHRoZXNlIGRpcmVjdGx5IHRvIHRoZSBjb21wb25lbnQuCisgICAgaWYgKGNvbmZpZy0+bUlucHV0U3VyZmFjZSA9PSBudWxscHRyCisgICAgICAgICAgICAmJiAocHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlY19kZWxheWVkX3BhcmFtcyIsIGZhbHNlKQorICAgICAgICAgICAgICAgICAgICB8fCBjb21wLT5nZXROYW1lKCkuZmluZCgiYzIuYW5kcm9pZC4iKSA9PSAwKSkgeworICAgICAgICBtQ2hhbm5lbC0+c2V0UGFyYW1ldGVycyhjb25maWdVcGRhdGUpOworICAgIH0gZWxzZSB7CisgICAgICAgICh2b2lkKWNvbmZpZy0+c2V0UGFyYW1ldGVycyhjb21wLCBjb25maWdVcGRhdGUsIEMyX01BWV9CTE9DSyk7CisgICAgfQorfQorCit2b2lkIENDb2RlYzo6c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIHsKKyAgICBtQ2FsbGJhY2stPm9uU2lnbmFsZWRJbnB1dEVPUyhtQ2hhbm5lbC0+c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpKTsKK30KKwordm9pZCBDQ29kZWM6OnNpZ25hbFJlcXVlc3RJRFJGcmFtZSgpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgeworICAgICAgICBNdXRleGVkPFN0YXRlPjo6TG9ja2VkIHN0YXRlKG1TdGF0ZSk7CisgICAgICAgIGlmIChzdGF0ZS0+Z2V0KCkgPT0gUkVMRUFTRUQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJubyBJRFIgcmVxdWVzdCBzZW50IHNpbmNlIGNvbXBvbmVudCBpcyByZWxlYXNlZCIpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGNvbXAgPSBzdGF0ZS0+Y29tcDsKKyAgICB9CisgICAgQUxPR1YoInJlcXVlc3QgSURSIik7CisgICAgTXV0ZXhlZDxDb25maWc+OjpMb2NrZWQgY29uZmlnKG1Db25maWcpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgIHBhcmFtcy5wdXNoX2JhY2soCisgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEMyU3RyZWFtUmVxdWVzdFN5bmNGcmFtZVR1bmluZzo6b3V0cHV0PigwdSwgdHJ1ZSkpOworICAgIGNvbmZpZy0+c2V0UGFyYW1ldGVycyhjb21wLCBwYXJhbXMsIEMyX01BWV9CTE9DSyk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpvbldvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJndvcmtJdGVtcykgeworICAgIGlmICghd29ya0l0ZW1zLmVtcHR5KCkpIHsKKyAgICAgICAgTXV0ZXhlZDxzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+Pjo6TG9ja2VkIHF1ZXVlKG1Xb3JrRG9uZVF1ZXVlKTsKKyAgICAgICAgcXVldWUtPnNwbGljZShxdWV1ZS0+ZW5kKCksIHdvcmtJdGVtcyk7CisgICAgfQorICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRXb3JrRG9uZSwgdGhpcykpLT5wb3N0KCk7Cit9CisKK3ZvaWQgQ0NvZGVjOjpvbklucHV0QnVmZmVyRG9uZSh1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYXJyYXlJbmRleCkgeworICAgIG1DaGFubmVsLT5vbklucHV0QnVmZmVyRG9uZShmcmFtZUluZGV4LCBhcnJheUluZGV4KTsKKyAgICBpZiAoYXJyYXlJbmRleCA9PSAwKSB7CisgICAgICAgIC8vIFdlIGFsd2F5cyBwdXQgbm8gbW9yZSB0aGFuIG9uZSBidWZmZXIgcGVyIHdvcmssIGlmIHdlIHVzZSBhbiBpbnB1dCBzdXJmYWNlLgorICAgICAgICBNdXRleGVkPENvbmZpZz46OkxvY2tlZCBjb25maWcobUNvbmZpZyk7CisgICAgICAgIGlmIChjb25maWctPm1JbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgIGNvbmZpZy0+bUlucHV0U3VyZmFjZS0+b25JbnB1dEJ1ZmZlckRvbmUoZnJhbWVJbmRleCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIFRpbWVQb2ludCBub3cgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgICBDQ29kZWNXYXRjaGRvZzo6Z2V0SW5zdGFuY2UoKS0+d2F0Y2godGhpcyk7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0QWxsb2NhdGU6IHsKKyAgICAgICAgICAgIC8vIEMyQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUNvbXBvbmVudCgpIHNob3VsZCByZXR1cm4gd2l0aGluIDEwMG1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCAxNTAwbXMsICJhbGxvY2F0ZSIpOworICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJjb2RlY0luZm8iLCAmb2JqKSk7CisgICAgICAgICAgICBhbGxvY2F0ZSgoTWVkaWFDb2RlY0luZm8gKilvYmouZ2V0KCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrV2hhdENvbmZpZ3VyZTogeworICAgICAgICAgICAgLy8gQzJDb21wb25lbnQ6OmNvbW1pdF9zbSgpIHNob3VsZCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgICAgICAgIHNldERlYWRsaW5lKG5vdywgMTUwMG1zLCAiY29uZmlndXJlIik7CisgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgiZm9ybWF0IiwgJmZvcm1hdCkpOworICAgICAgICAgICAgY29uZmlndXJlKGZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6IHsKKyAgICAgICAgICAgIC8vIEMyQ29tcG9uZW50OjpzdGFydCgpIHNob3VsZCByZXR1cm4gd2l0aGluIDUwMG1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCAxNTAwbXMsICJzdGFydCIpOworICAgICAgICAgICAgc3RhcnQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRTdG9wOiB7CisgICAgICAgICAgICAvLyBDMkNvbXBvbmVudDo6c3RvcCgpIHNob3VsZCByZXR1cm4gd2l0aGluIDUwMG1zLgorICAgICAgICAgICAgc2V0RGVhZGxpbmUobm93LCAxNTAwbXMsICJzdG9wIik7CisgICAgICAgICAgICBzdG9wKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0Rmx1c2g6IHsKKyAgICAgICAgICAgIC8vIEMyQ29tcG9uZW50OjpmbHVzaF9zbSgpIHNob3VsZCByZXR1cm4gd2l0aGluIDVtcy4KKyAgICAgICAgICAgIHNldERlYWRsaW5lKG5vdywgMTUwMG1zLCAiZmx1c2giKTsKKyAgICAgICAgICAgIGZsdXNoKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0Q3JlYXRlSW5wdXRTdXJmYWNlOiB7CisgICAgICAgICAgICAvLyBTdXJmYWNlIG9wZXJhdGlvbnMgbWF5IGJlIGJyaWVmbHkgYmxvY2tpbmcuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDE1MDBtcywgImNyZWF0ZUlucHV0U3VyZmFjZSIpOworICAgICAgICAgICAgY3JlYXRlSW5wdXRTdXJmYWNlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0U2V0SW5wdXRTdXJmYWNlOiB7CisgICAgICAgICAgICAvLyBTdXJmYWNlIG9wZXJhdGlvbnMgbWF5IGJlIGJyaWVmbHkgYmxvY2tpbmcuCisgICAgICAgICAgICBzZXREZWFkbGluZShub3csIDE1MDBtcywgInNldElucHV0U3VyZmFjZSIpOworICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzdXJmYWNlIiwgJm9iaikpOworICAgICAgICAgICAgc3A8UGVyc2lzdGVudFN1cmZhY2U+IHN1cmZhY2Uoc3RhdGljX2Nhc3Q8UGVyc2lzdGVudFN1cmZhY2UgKj4ob2JqLmdldCgpKSk7CisgICAgICAgICAgICBzZXRJbnB1dFN1cmZhY2Uoc3VyZmFjZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIGtXaGF0V29ya0RvbmU6IHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgICAgICBib29sIHNob3VsZFBvc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleGVkPHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4+OjpMb2NrZWQgcXVldWUobVdvcmtEb25lUXVldWUpOworICAgICAgICAgICAgICAgIGlmIChxdWV1ZS0+ZW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgd29yay5zd2FwKHF1ZXVlLT5mcm9udCgpKTsKKyAgICAgICAgICAgICAgICBxdWV1ZS0+cG9wX2Zyb250KCk7CisgICAgICAgICAgICAgICAgc2hvdWxkUG9zdCA9ICFxdWV1ZS0+ZW1wdHkoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaG91bGRQb3N0KSB7CisgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFdvcmtEb25lLCB0aGlzKSktPnBvc3QoKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gaGFuZGxlIGNvbmZpZ3VyYXRpb24gY2hhbmdlcyBpbiB3b3JrIGRvbmUKKyAgICAgICAgICAgIE11dGV4ZWQ8Q29uZmlnPjo6TG9ja2VkIGNvbmZpZyhtQ29uZmlnKTsKKyAgICAgICAgICAgIGJvb2wgY2hhbmdlZCA9ICFtU2VudENvbmZpZ0FmdGVyUmVzdW1lLnRlc3RfYW5kX3NldCgpOworICAgICAgICAgICAgQ29uZmlnOjpXYXRjaGVyPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+IGluaXREYXRhID0KKyAgICAgICAgICAgICAgICBjb25maWctPndhdGNoPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+KCk7CisgICAgICAgICAgICBpZiAoIXdvcmstPndvcmtsZXRzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncworICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgQzJGcmFtZURhdGE6OkZMQUdfRElTQ0FSRF9GUkFNRSkgPT0gMCkgeworCisgICAgICAgICAgICAgICAgLy8gY29weSBidWZmZXIgaW5mbyB0byBjb25maWcKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHVwZGF0ZXM7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnBhcmFtCisgICAgICAgICAgICAgICAgICAgICAgICA6IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5jb25maWdVcGRhdGUpIHsKKyAgICAgICAgICAgICAgICAgICAgdXBkYXRlcy5wdXNoX2JhY2soQzJQYXJhbTo6Q29weSgqcGFyYW0pKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdW5zaWduZWQgc3RyZWFtID0gMDsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZiA6IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gJmluZm8gOiBidWYtPmluZm8oKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gbW92ZSBhbGwgaW5mbyBpbnRvIG91dHB1dC1zdHJlYW0gIzAgZG9tYWluCisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjayhDMlBhcmFtOjpDb3B5QXNTdHJlYW0oKmluZm8sIHRydWUgLyogb3V0cHV0ICovLCBzdHJlYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+IGJsb2NrcyA9IGJ1Zi0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG5vdyBvbmx5IGRvIHRoZSBmaXJzdCBibG9jaworICAgICAgICAgICAgICAgICAgICBpZiAoIWJsb2Nrcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBTE9HVigiZ290IG91dHB1dCBidWZmZXIgd2l0aCBjcm9wICV1LCV1KyV1LCV1IGFuZCBzaXplICV1LCV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYmxvY2suY3JvcCgpLmxlZnQsIGJsb2NrLmNyb3AoKS50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgIGJsb2NrLmNyb3AoKS53aWR0aCwgYmxvY2suY3JvcCgpLmhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgYmxvY2sud2lkdGgoKSwgYmxvY2suaGVpZ2h0KCkpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2sgPSBibG9ja3NbMF07CisgICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVzLmVtcGxhY2VfYmFjayhuZXcgQzJTdHJlYW1Dcm9wUmVjdEluZm86Om91dHB1dChzdHJlYW0sIGJsb2NrLmNyb3AoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlcy5lbXBsYWNlX2JhY2sobmV3IEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgYmxvY2suY3JvcCgpLndpZHRoLCBibG9jay5jcm9wKCkuaGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKytzdHJlYW07CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGNvbmZpZy0+dXBkYXRlQ29uZmlndXJhdGlvbih1cGRhdGVzLCBjb25maWctPm1PdXRwdXREb21haW4pKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGNvcHkgc3RhbmRhcmQgaW5mb3MgdG8gZ3JhcGhpYyBidWZmZXJzIGlmIG5vdCBhbHJlYWR5IHByZXNlbnQgKG90aGVyd2lzZSwgd2UKKyAgICAgICAgICAgICAgICAvLyBtYXkgb3ZlcndyaXRlIHRoZSBhY3R1YWwgaW50ZXJtZWRpYXRlIHZhbHVlIHdpdGggYSBmaW5hbCB2YWx1ZSkKKyAgICAgICAgICAgICAgICBzdHJlYW0gPSAwOworICAgICAgICAgICAgICAgIGNvbnN0IHN0YXRpYyBDMlBhcmFtOjpJbmRleCBzdGRHZnhJbmZvc1tdID0geworICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVJvdGF0aW9uSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbUNvbG9yQXNwZWN0c0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1EYXRhU3BhY2VJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUsCisgICAgICAgICAgICAgICAgICAgIEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbUhkcjEwUGx1c0luZm86Om91dHB1dDo6UEFSQU1fVFlQRSwKKyAgICAgICAgICAgICAgICAgICAgQzJTdHJlYW1QaXhlbEFzcGVjdFJhdGlvSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFLAorICAgICAgICAgICAgICAgICAgICBDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFCisgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZiA6IHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5idWZmZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWYtPmRhdGEoKS5ncmFwaGljQmxvY2tzKCkuc2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKEMyUGFyYW06OkluZGV4IGl4IDogc3RkR2Z4SW5mb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJ1Zi0+aGFzSW5mbyhpeCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqcGFyYW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5nZXRDb25maWdQYXJhbWV0ZXJWYWx1ZShpeC53aXRoU3RyZWFtKHN0cmVhbSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBpbmZvKEMyUGFyYW06OkNvcHkoKnBhcmFtKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWYtPnNldEluZm8oc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMySW5mbz4oaW5mbykpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICsrc3RyZWFtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjb25maWctPm1JbnB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICBjb25maWctPm1JbnB1dFN1cmZhY2UtPm9uSW5wdXRCdWZmZXJEb25lKHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQ2hhbm5lbC0+b25Xb3JrRG9uZSgKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHdvcmspLCBjaGFuZ2VkID8gY29uZmlnLT5tT3V0cHV0Rm9ybWF0IDogbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgaW5pdERhdGEuaGFzQ2hhbmdlZCgpID8gaW5pdERhdGEudXBkYXRlKCkuZ2V0KCkgOiBudWxscHRyKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Uga1doYXRXYXRjaDogeworICAgICAgICAgICAgLy8gd2F0Y2ggbWVzc2FnZSBhbHJlYWR5IHBvc3RlZDsgbm8tb3AuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBBTE9HRSgidW5yZWNvZ25pemVkIG1lc3NhZ2UiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHNldERlYWRsaW5lKFRpbWVQb2ludDo6bWF4KCksIDBtcywgIm5vbmUiKTsKK30KKwordm9pZCBDQ29kZWM6OnNldERlYWRsaW5lKAorICAgICAgICBjb25zdCBUaW1lUG9pbnQgJm5vdywKKyAgICAgICAgY29uc3Qgc3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcyAmdGltZW91dCwKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSkgeworICAgIGludDMyX3QgbXVsdCA9IHN0ZDo6bWF4KDEsIHByb3BlcnR5X2dldF9pbnQzMigiZGVidWcuc3RhZ2VmcmlnaHQuY2NvZGVjX3RpbWVvdXRfbXVsdCIsIDEpKTsKKyAgICBNdXRleGVkPE5hbWVkVGltZVBvaW50Pjo6TG9ja2VkIGRlYWRsaW5lKG1EZWFkbGluZSk7CisgICAgZGVhZGxpbmUtPnNldChub3cgKyAodGltZW91dCAqIG11bHQpLCBuYW1lKTsKK30KKwordm9pZCBDQ29kZWM6OmluaXRpYXRlUmVsZWFzZUlmU3R1Y2soKSB7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBib29sIHBlbmRpbmdEZWFkbGluZSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxOYW1lZFRpbWVQb2ludD46OkxvY2tlZCBkZWFkbGluZShtRGVhZGxpbmUpOworICAgICAgICBpZiAoZGVhZGxpbmUtPmdldCgpIDwgc3RkOjpjaHJvbm86OnN0ZWFkeV9jbG9jazo6bm93KCkpIHsKKyAgICAgICAgICAgIG5hbWUgPSBkZWFkbGluZS0+Z2V0TmFtZSgpOworICAgICAgICB9CisgICAgICAgIGlmIChkZWFkbGluZS0+Z2V0KCkgIT0gVGltZVBvaW50OjptYXgoKSkgeworICAgICAgICAgICAgcGVuZGluZ0RlYWRsaW5lID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobmFtZS5lbXB0eSgpKSB7CisgICAgICAgIGNvbnN0ZXhwciBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpkdXJhdGlvbiBrV29ya0R1cmF0aW9uVGhyZXNob2xkID0gM3M7CisgICAgICAgIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OmR1cmF0aW9uIGVsYXBzZWQgPSBtQ2hhbm5lbC0+ZWxhcHNlZCgpOworICAgICAgICBpZiAoZWxhcHNlZCA+PSBrV29ya0R1cmF0aW9uVGhyZXNob2xkKSB7CisgICAgICAgICAgICBuYW1lID0gInF1ZXVlIjsKKyAgICAgICAgfQorICAgICAgICBpZiAoZWxhcHNlZCA+IDBzKSB7CisgICAgICAgICAgICBwZW5kaW5nRGVhZGxpbmUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gV2UncmUgbm90IHN0dWNrLgorICAgICAgICBpZiAocGVuZGluZ0RlYWRsaW5lKSB7CisgICAgICAgICAgICAvLyBJZiB3ZSBhcmUgbm90IHN0dWNrIHlldCBidXQgc3RpbGwgaGFzIGRlYWRsaW5lIGNvbWluZyB1cCwKKyAgICAgICAgICAgIC8vIHBvc3Qgd2F0Y2ggbWVzc2FnZSB0byBjaGVjayBiYWNrIGxhdGVyLgorICAgICAgICAgICAgKG5ldyBBTWVzc2FnZShrV2hhdFdhdGNoLCB0aGlzKSktPnBvc3QoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1coInByZXZpb3VzIGNhbGwgdG8gJXMgZXhjZWVkZWQgdGltZW91dCIsIG5hbWUuY19zdHIoKSk7CisgICAgaW5pdGlhdGVSZWxlYXNlKGZhbHNlKTsKKyAgICBtQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIGFuZHJvaWQ6OkNvZGVjQmFzZSAqQ3JlYXRlQ29kZWMoKSB7CisgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpDQ29kZWM7Cit9CisKKy8vIENyZWF0ZSBDb2RlYyAyLjAgaW5wdXQgc3VyZmFjZQorZXh0ZXJuICJDIiBhbmRyb2lkOjpQZXJzaXN0ZW50U3VyZmFjZSAqQ3JlYXRlSW5wdXRTdXJmYWNlKCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworICAgIC8vIEF0dGVtcHQgdG8gY3JlYXRlIGEgQ29kZWMyJ3MgaW5wdXQgc3VyZmFjZS4KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnB1dFN1cmZhY2U+IGlucHV0U3VyZmFjZSA9CisgICAgICAgICAgICBDb2RlYzJDbGllbnQ6OkNyZWF0ZUlucHV0U3VyZmFjZSgpOworICAgIGlmICghaW5wdXRTdXJmYWNlKSB7CisgICAgICAgIGlmIChwcm9wZXJ0eV9nZXRfaW50MzIoImRlYnVnLnN0YWdlZnJpZ2h0LmMyaW5wdXRzdXJmYWNlIiwgMCkgPT0gLTEpIHsKKyAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGdicDsKKyAgICAgICAgICAgIHNwPE9teEdyYXBoaWNCdWZmZXJTb3VyY2U+IGdicyA9IG5ldyBPbXhHcmFwaGljQnVmZmVyU291cmNlKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBnYnMtPmluaXRDaGVjaygpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIHBlcnNpc3RlbnQgaW5wdXQgc3VyZmFjZTogZXJyb3IgJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG5ldyBQZXJzaXN0ZW50U3VyZmFjZSgKKyAgICAgICAgICAgICAgICAgICAgZ2JzLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCksCisgICAgICAgICAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyU291cmNlPigKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPbXgySUdyYXBoaWNCdWZmZXJTb3VyY2UoZ2JzKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG5ldyBQZXJzaXN0ZW50U3VyZmFjZSgKKyAgICAgICAgICAgIGlucHV0U3VyZmFjZS0+Z2V0R3JhcGhpY0J1ZmZlclByb2R1Y2VyKCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxzcDxhbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4+KAorICAgICAgICAgICAgaW5wdXRTdXJmYWNlLT5nZXRIYWxJbnRlcmZhY2UoKSkpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU4MGQxZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWMuaApAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ19DT0RFQ19IXworI2RlZmluZSBDX0NPREVDX0hfCisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL25hdGl2ZV93aW5kb3cuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL011dGV4ZWQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Ta2lwQ3V0QnVmZmVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTmF0aXZlSGFuZGxlLmg+CisjaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgorI2luY2x1ZGUgPG5hdGl2ZWJhc2UvbmF0aXZlYmFzZS5oPgorCisjaW5jbHVkZSAiQ0NvZGVjQ29uZmlnLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ0NvZGVjQnVmZmVyQ2hhbm5lbDsKK2NsYXNzIElucHV0U3VyZmFjZVdyYXBwZXI7CitzdHJ1Y3QgTWVkaWFDb2RlY0luZm87CisKK2NsYXNzIENDb2RlYyA6IHB1YmxpYyBDb2RlY0Jhc2UgeworcHVibGljOgorICAgIENDb2RlYygpOworCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyQ2hhbm5lbEJhc2U+IGdldEJ1ZmZlckNoYW5uZWwoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVBbGxvY2F0ZUNvbXBvbmVudChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGluaXRpYXRlQ29uZmlndXJlQ29tcG9uZW50KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVDcmVhdGVJbnB1dFN1cmZhY2UoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3A8UGVyc2lzdGVudFN1cmZhY2U+ICZzdXJmYWNlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhdGVTdGFydCgpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBpbml0aWF0ZVNodXRkb3duKGJvb2wga2VlcENvbXBvbmVudEFsbG9jYXRlZCA9IGZhbHNlKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsRmx1c2goKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUmVzdW1lKCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsUmVxdWVzdElEUkZyYW1lKCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGluaXRpYXRlUmVsZWFzZUlmU3R1Y2soKTsKKyAgICB2b2lkIG9uV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmd29ya0l0ZW1zKTsKKyAgICB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBhcnJheUluZGV4KTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkNDb2RlYygpOworCisgICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHN0ZDo6Y2hyb25vOjpzdGVhZHlfY2xvY2s6OnRpbWVfcG9pbnQgVGltZVBvaW50OworCisgICAgc3RhdHVzX3QgdHJ5QW5kUmVwb3J0T25FcnJvcihzdGQ6OmZ1bmN0aW9uPHN0YXR1c190KCk+IGpvYik7CisKKyAgICB2b2lkIGluaXRpYXRlU3RvcCgpOworICAgIHZvaWQgaW5pdGlhdGVSZWxlYXNlKGJvb2wgc2VuZENhbGxiYWNrID0gdHJ1ZSk7CisKKyAgICB2b2lkIGFsbG9jYXRlKGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmY29kZWNJbmZvKTsKKyAgICB2b2lkIGNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisgICAgdm9pZCBzdGFydCgpOworICAgIHZvaWQgc3RvcCgpOworICAgIHZvaWQgZmx1c2goKTsKKyAgICB2b2lkIHJlbGVhc2UoYm9vbCBzZW5kQ2FsbGJhY2spOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhbiBpbnB1dCBzdXJmYWNlIGZvciB0aGUgY3VycmVudCBkZXZpY2UgY29uZmlndXJhdGlvbiBjb21wYXRpYmxlIHdpdGggQ0NvZGVjLgorICAgICAqIFRoaXMgY291bGQgYmUgYmFja2VkIGJ5IHRoZSBDMiBIQUwgb3IgdGhlIE9NWCBIQUwuCisgICAgICovCisgICAgc3RhdGljIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBDcmVhdGVDb21wYXRpYmxlSW5wdXRTdXJmYWNlKCk7CisKKyAgICAvLy8gQ3JlYXRlcyBhbiBpbnB1dCBzdXJmYWNlIHRvIHRoZSBPTVggSEFMCisgICAgc3RhdGljIHNwPFBlcnNpc3RlbnRTdXJmYWNlPiBDcmVhdGVPbXhJbnB1dFN1cmZhY2UoKTsKKworICAgIC8vLyBoYW5kbGUgYSBjcmVhdGUgaW5wdXQgc3VyZmFjZSBjYWxsCisgICAgdm9pZCBjcmVhdGVJbnB1dFN1cmZhY2UoKTsKKyAgICB2b2lkIHNldElucHV0U3VyZmFjZShjb25zdCBzcDxQZXJzaXN0ZW50U3VyZmFjZT4gJnN1cmZhY2UpOworICAgIHN0YXR1c190IHNldHVwSW5wdXRTdXJmYWNlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyPiAmc3VyZmFjZSk7CisKKyAgICB2b2lkIHNldERlYWRsaW5lKAorICAgICAgICAgICAgY29uc3QgVGltZVBvaW50ICZub3csCisgICAgICAgICAgICBjb25zdCBzdGQ6OmNocm9ubzo6bWlsbGlzZWNvbmRzICZ0aW1lb3V0LAorICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSk7CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRBbGxvY2F0ZSwKKyAgICAgICAga1doYXRDb25maWd1cmUsCisgICAgICAgIGtXaGF0U3RhcnQsCisgICAgICAgIGtXaGF0Rmx1c2gsCisgICAgICAgIGtXaGF0U3RvcCwKKyAgICAgICAga1doYXRSZWxlYXNlLAorICAgICAgICBrV2hhdENyZWF0ZUlucHV0U3VyZmFjZSwKKyAgICAgICAga1doYXRTZXRJbnB1dFN1cmZhY2UsCisgICAgICAgIGtXaGF0U2V0UGFyYW1ldGVycywKKworICAgICAgICBrV2hhdFdvcmtEb25lLAorICAgICAgICBrV2hhdFdhdGNoLAorICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgICAgUkVMRUFTRUQsCisgICAgICAgIEFMTE9DQVRFRCwKKyAgICAgICAgRkxVU0hFRCwKKyAgICAgICAgUlVOTklORywKKworICAgICAgICBBTExPQ0FUSU5HLCAgLy8gUkVMRUFTRUQgLT4gQUxMT0NBVEVECisgICAgICAgIFNUQVJUSU5HLCAgICAvLyBBTExPQ0FURUQgLT4gUlVOTklORworICAgICAgICBTVE9QUElORywgICAgLy8gUlVOTklORyAtPiBBTExPQ0FURUQKKyAgICAgICAgRkxVU0hJTkcsICAgIC8vIFJVTk5JTkcgLT4gRkxVU0hFRAorICAgICAgICBSRVNVTUlORywgICAgLy8gRkxVU0hFRCAtPiBSVU5OSU5HCisgICAgICAgIFJFTEVBU0lORywgICAvLyB7QU5ZIEVYQ0VQVCBSRUxFQVNFRH0gLT4gUkVMRUFTRUQKKyAgICB9OworCisgICAgc3RydWN0IFN0YXRlIHsKKyAgICAgICAgaW5saW5lIFN0YXRlKCkgOiBtU3RhdGUoUkVMRUFTRUQpIHt9CisgICAgICAgIGlubGluZSBpbnQgZ2V0KCkgY29uc3QgeyByZXR1cm4gbVN0YXRlOyB9CisgICAgICAgIGlubGluZSB2b2lkIHNldChpbnQgbmV3U3RhdGUpIHsgbVN0YXRlID0gbmV3U3RhdGU7IH0KKworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXA7CisgICAgcHJpdmF0ZToKKyAgICAgICAgaW50IG1TdGF0ZTsKKyAgICB9OworCisgICAgc3RydWN0IE5hbWVkVGltZVBvaW50IHsKKyAgICAgICAgTmFtZWRUaW1lUG9pbnQoKSA6IG1UaW1lUG9pbnQoVGltZVBvaW50OjptYXgoKSksIG1OYW1lKCIiKSB7fQorCisgICAgICAgIGlubGluZSB2b2lkIHNldCgKKyAgICAgICAgICAgICAgICBjb25zdCBUaW1lUG9pbnQgJnRpbWVQb2ludCwKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKSB7CisgICAgICAgICAgICBtVGltZVBvaW50ID0gdGltZVBvaW50OworICAgICAgICAgICAgbU5hbWUgPSBuYW1lOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIFRpbWVQb2ludCBnZXQoKSBjb25zdCB7IHJldHVybiBtVGltZVBvaW50OyB9CisgICAgICAgIGlubGluZSBjb25zdCBjaGFyICpnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKyAgICBwcml2YXRlOgorICAgICAgICBUaW1lUG9pbnQgbVRpbWVQb2ludDsKKyAgICAgICAgY29uc3QgY2hhciAqbU5hbWU7CisgICAgfTsKKworICAgIE11dGV4ZWQ8U3RhdGU+IG1TdGF0ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q0NvZGVjQnVmZmVyQ2hhbm5lbD4gbUNoYW5uZWw7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50PiBtQ2xpZW50OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtQ2xpZW50TGlzdGVuZXI7CisgICAgc3RydWN0IENsaWVudExpc3RlbmVyOworCisgICAgTXV0ZXhlZDxOYW1lZFRpbWVQb2ludD4gbURlYWRsaW5lOworICAgIHR5cGVkZWYgQ0NvZGVjQ29uZmlnIENvbmZpZzsKKyAgICBNdXRleGVkPENvbmZpZz4gbUNvbmZpZzsKKyAgICBNdXRleGVkPHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4+IG1Xb3JrRG9uZVF1ZXVlOworICAgIHN0ZDo6YXRvbWljX2ZsYWcgbVNlbnRDb25maWdBZnRlclJlc3VtZTsKKworICAgIGZyaWVuZCBjbGFzcyBDQ29kZWNDYWxsYmFja0ltcGw7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDQ29kZWMpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDX0NPREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRjMzBmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmNwcApAQCAtMCwwICsxLDE3MTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ0NvZGVjQnVmZmVyQ2hhbm5lbCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG51bWVyaWM+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorI2luY2x1ZGUgPEMyQmxvY2tJbnRlcm5hbC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYXMvbmF0aXZlLzEuMC9JRGVzY3JhbWJsZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2Uvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9va3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgorCisjaW5jbHVkZSAiQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oIgorI2luY2x1ZGUgIkNvZGVjMkJ1ZmZlci5oIgorI2luY2x1ZGUgIlNraXBDdXRCdWZmZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBhbmRyb2lkOjpiYXNlOjpTdHJpbmdQcmludGY7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyBuYW1lc3BhY2UgaGFyZHdhcmU6OmNhczo6VjFfMDsKK3VzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA7CisKK3VzaW5nIENhc1N0YXR1cyA9IGhhcmR3YXJlOjpjYXM6OlYxXzA6OlN0YXR1czsKKworbmFtZXNwYWNlIHsKKworY29uc3RleHByIHNpemVfdCBrU21vb3RobmVzc0ZhY3RvciA9IDQ7Citjb25zdGV4cHIgc2l6ZV90IGtSZW5kZXJpbmdEZXB0aCA9IDM7CisKKy8vIFRoaXMgaXMgZm9yIGtlZXBpbmcgSUdCUCdzIGJ1ZmZlciBkcm9wcGluZyBsb2dpYyBpbiBsZWdhY3kgbW9kZSBvdGhlcgorLy8gdGhhbiBtYWtpbmcgaXQgbm9uLWJsb2NraW5nLiBEbyBub3QgY2hhbmdlIHRoaXMgdmFsdWUuCitjb25zdCBzdGF0aWMgc2l6ZV90IGtEZXF1ZXVlVGltZW91dE5zID0gMDsKKworfSAgLy8gbmFtZXNwYWNlCisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlR3VhcmQ6OlF1ZXVlR3VhcmQoCisgICAgICAgIENDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlU3luYyAmc3luYykgOiBtU3luYyhzeW5jKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVN5bmMubUd1YXJkTG9jayk7CisgICAgLy8gQXQgdGhpcyBwb2ludCBpdCdzIGd1YXJhbnRlZWQgdGhhdCBtU3luYyBpcyBub3QgdW5kZXIgc3RhdGUgdHJhbnNpdGlvbiwKKyAgICAvLyBhcyB3ZSBhcmUgaG9sZGluZyBpdHMgbXV0ZXguCisKKyAgICBNdXRleGVkPENDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlU3luYzo6Q291bnRlcj46OkxvY2tlZCBjb3VudChtU3luYy5tQ291bnQpOworICAgIGlmIChjb3VudC0+dmFsdWUgPT0gLTEpIHsKKyAgICAgICAgbVJ1bm5pbmcgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICArK2NvdW50LT52YWx1ZTsKKyAgICAgICAgbVJ1bm5pbmcgPSB0cnVlOworICAgIH0KK30KKworQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UXVldWVHdWFyZDo6flF1ZXVlR3VhcmQoKSB7CisgICAgaWYgKG1SdW5uaW5nKSB7CisgICAgICAgIC8vIFdlIGFyZSBub3QgaG9sZGluZyBtR3VhcmRMb2NrIGF0IHRoaXMgcG9pbnQgc28gdGhhdCBRdWV1ZVN5bmM6OnN0b3AoKSBjYW4KKyAgICAgICAgLy8ga2VlcCBob2xkaW5nIHRoZSBsb2NrIHVudGlsIG1Db3VudCByZWFjaGVzIHplcm8uCisgICAgICAgIE11dGV4ZWQ8Q0NvZGVjQnVmZmVyQ2hhbm5lbDo6UXVldWVTeW5jOjpDb3VudGVyPjo6TG9ja2VkIGNvdW50KG1TeW5jLm1Db3VudCk7CisgICAgICAgIC0tY291bnQtPnZhbHVlOworICAgICAgICBjb3VudC0+Y29uZC5icm9hZGNhc3QoKTsKKyAgICB9Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UXVldWVTeW5jOjpzdGFydCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtR3VhcmRMb2NrKTsKKyAgICAvLyBJZiBzdG9wcGVkLCBpdCBnb2VzIHRvIHJ1bm5pbmcgc3RhdGU7IG90aGVyd2lzZSBuby1vcC4KKyAgICBNdXRleGVkPENvdW50ZXI+OjpMb2NrZWQgY291bnQobUNvdW50KTsKKyAgICBpZiAoY291bnQtPnZhbHVlID09IC0xKSB7CisgICAgICAgIGNvdW50LT52YWx1ZSA9IDA7CisgICAgfQorfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlU3luYzo6c3RvcCgpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtR3VhcmRMb2NrKTsKKyAgICBNdXRleGVkPENvdW50ZXI+OjpMb2NrZWQgY291bnQobUNvdW50KTsKKyAgICBpZiAoY291bnQtPnZhbHVlID09IC0xKSB7CisgICAgICAgIC8vIG5vLW9wCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gSG9sZGluZyBtR3VhcmRMb2NrIGhlcmUgYmxvY2tzIGNyZWF0aW9uIG9mIGFkZGl0aW9uYWwgUXVldWVHdWFyZCBvYmplY3RzLCBzbworICAgIC8vIG1Db3VudCBjYW4gb25seSBkZWNyZW1lbnQuIEluIG90aGVyIHdvcmRzLCB0aHJlYWRzIHRoYXQgYWNxdWlyZWQgdGhlIGxvY2sKKyAgICAvLyBhcmUgYWxsb3dlZCB0byBmaW5pc2ggZXhlY3V0aW9uIGJ1dCBhZGRpdGlvbmFsIHRocmVhZHMgdHJ5aW5nIHRvIGFjcXVpcmUKKyAgICAvLyB0aGUgbG9jayBhdCB0aGlzIHBvaW50IHdpbGwgYmxvY2ssIGFuZCB0aGVuIGdldCBRdWV1ZUd1YXJkIGF0IFNUT1BQRUQKKyAgICAvLyBzdGF0ZS4KKyAgICB3aGlsZSAoY291bnQtPnZhbHVlICE9IDApIHsKKyAgICAgICAgY291bnQud2FpdEZvckNvbmRpdGlvbihjb3VudC0+Y29uZCk7CisgICAgfQorICAgIGNvdW50LT52YWx1ZSA9IC0xOworfQorCisvLyBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2gKKworQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpSZW9yZGVyU3Rhc2goKSB7CisgICAgY2xlYXIoKTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6OmNsZWFyKCkgeworICAgIG1QZW5kaW5nLmNsZWFyKCk7CisgICAgbVN0YXNoLmNsZWFyKCk7CisgICAgbURlcHRoID0gMDsKKyAgICBtS2V5ID0gQzJDb25maWc6Ok9SRElOQUw7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpmbHVzaCgpIHsKKyAgICBtUGVuZGluZy5jbGVhcigpOworICAgIG1TdGFzaC5jbGVhcigpOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6c2V0RGVwdGgodWludDMyX3QgZGVwdGgpIHsKKyAgICBtUGVuZGluZy5zcGxpY2UobVBlbmRpbmcuZW5kKCksIG1TdGFzaCk7CisgICAgbURlcHRoID0gZGVwdGg7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpzZXRLZXkoQzJDb25maWc6Om9yZGluYWxfa2V5X3Qga2V5KSB7CisgICAgbVBlbmRpbmcuc3BsaWNlKG1QZW5kaW5nLmVuZCgpLCBtU3Rhc2gpOworICAgIG1LZXkgPSBrZXk7Cit9CisKK2Jvb2wgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpwb3AoRW50cnkgKmVudHJ5KSB7CisgICAgaWYgKG1QZW5kaW5nLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBlbnRyeS0+YnVmZmVyICAgICA9IG1QZW5kaW5nLmZyb250KCkuYnVmZmVyOworICAgIGVudHJ5LT50aW1lc3RhbXAgID0gbVBlbmRpbmcuZnJvbnQoKS50aW1lc3RhbXA7CisgICAgZW50cnktPmZsYWdzICAgICAgPSBtUGVuZGluZy5mcm9udCgpLmZsYWdzOworICAgIGVudHJ5LT5vcmRpbmFsICAgID0gbVBlbmRpbmcuZnJvbnQoKS5vcmRpbmFsOworICAgIG1QZW5kaW5nLnBvcF9mcm9udCgpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6ZW1wbGFjZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwKKyAgICAgICAgaW50MzJfdCBmbGFncywKKyAgICAgICAgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmb3JkaW5hbCkgeworICAgIGJvb2wgZW9zID0gZmxhZ3MgJiBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19FT1M7CisgICAgaWYgKCFidWZmZXIgJiYgZW9zKSB7CisgICAgICAgIC8vIFRSSUNLWTogd2UgbWF5IGJlIHZpb2xhdGluZyBvcmRlcmluZyBvZiB0aGUgc3Rhc2ggaGVyZS4gQmVjYXVzZSB3ZQorICAgICAgICAvLyBkb24ndCBleHBlY3QgYW55IG1vcmUgZW1wbGFjZSgpIGNhbGxzIGFmdGVyIHRoaXMsIHRoZSBvcmRlcmluZyBzaG91bGQKKyAgICAgICAgLy8gbm90IG1hdHRlci4KKyAgICAgICAgbVN0YXNoLmVtcGxhY2VfYmFjayhidWZmZXIsIHRpbWVzdGFtcCwgZmxhZ3MsIG9yZGluYWwpOworICAgIH0gZWxzZSB7CisgICAgICAgIGZsYWdzID0gZmxhZ3MgJiB+TWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TOworICAgICAgICBhdXRvIGl0ID0gbVN0YXNoLmJlZ2luKCk7CisgICAgICAgIGZvciAoOyBpdCAhPSBtU3Rhc2guZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGlmIChsZXNzKG9yZGluYWwsIGl0LT5vcmRpbmFsKSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1TdGFzaC5lbXBsYWNlKGl0LCBidWZmZXIsIHRpbWVzdGFtcCwgZmxhZ3MsIG9yZGluYWwpOworICAgICAgICBpZiAoZW9zKSB7CisgICAgICAgICAgICBtU3Rhc2guYmFjaygpLmZsYWdzID0gbVN0YXNoLmJhY2soKS5mbGFncyB8IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUzsKKyAgICAgICAgfQorICAgIH0KKyAgICB3aGlsZSAoIW1TdGFzaC5lbXB0eSgpICYmIG1TdGFzaC5zaXplKCkgPiBtRGVwdGgpIHsKKyAgICAgICAgbVBlbmRpbmcucHVzaF9iYWNrKG1TdGFzaC5mcm9udCgpKTsKKyAgICAgICAgbVN0YXNoLnBvcF9mcm9udCgpOworICAgIH0KK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6OmRlZmVyKAorICAgICAgICBjb25zdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpSZW9yZGVyU3Rhc2g6OkVudHJ5ICZlbnRyeSkgeworICAgIG1QZW5kaW5nLnB1c2hfZnJvbnQoZW50cnkpOworfQorCitib29sIENDb2RlY0J1ZmZlckNoYW5uZWw6OlJlb3JkZXJTdGFzaDo6aGFzUGVuZGluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gIW1QZW5kaW5nLmVtcHR5KCk7Cit9CisKK2Jvb2wgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6UmVvcmRlclN0YXNoOjpsZXNzKAorICAgICAgICBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0ICZvMSwgY29uc3QgQzJXb3JrT3JkaW5hbFN0cnVjdCAmbzIpIHsKKyAgICBzd2l0Y2ggKG1LZXkpIHsKKyAgICAgICAgY2FzZSBDMkNvbmZpZzo6T1JESU5BTDogICByZXR1cm4gbzEuZnJhbWVJbmRleCA8IG8yLmZyYW1lSW5kZXg7CisgICAgICAgIGNhc2UgQzJDb25maWc6OlRJTUVTVEFNUDogcmV0dXJuIG8xLnRpbWVzdGFtcCA8IG8yLnRpbWVzdGFtcDsKKyAgICAgICAgY2FzZSBDMkNvbmZpZzo6Q1VTVE9NOiAgICByZXR1cm4gbzEuY3VzdG9tT3JkaW5hbCA8IG8yLmN1c3RvbU9yZGluYWw7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRCgiVW5yZWNvZ25pemVkIGtleTsgZGVmYXVsdCB0byB0aW1lc3RhbXAiKTsKKyAgICAgICAgICAgIHJldHVybiBvMS5mcmFtZUluZGV4IDwgbzIuZnJhbWVJbmRleDsKKyAgICB9Cit9CisKKy8vIElucHV0CisKK0NDb2RlY0J1ZmZlckNoYW5uZWw6OklucHV0OjpJbnB1dCgpIDogZXh0cmFCdWZmZXJzKCJleHRyYSIpIHt9CisKKy8vIENDb2RlY0J1ZmZlckNoYW5uZWwKKworQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6Q0NvZGVjQnVmZmVyQ2hhbm5lbCgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENDb2RlY0NhbGxiYWNrPiAmY2FsbGJhY2spCisgICAgOiBtSGVhcFNlcU51bSgtMSksCisgICAgICBtQ0NvZGVjQ2FsbGJhY2soY2FsbGJhY2spLAorICAgICAgbUZyYW1lSW5kZXgoMHUpLAorICAgICAgbUZpcnN0VmFsaWRGcmFtZUluZGV4KDB1KSwKKyAgICAgIG1NZXRhTW9kZShNT0RFX05PTkUpLAorICAgICAgbUlucHV0TWV0RW9zKGZhbHNlKSB7CisgICAgbU91dHB1dFN1cmZhY2UubG9jaygpLT5tYXhEZXF1ZXVlQnVmZmVycyA9IGtTbW9vdGhuZXNzRmFjdG9yICsga1JlbmRlcmluZ0RlcHRoOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOworICAgICAgICBpbnB1dC0+YnVmZmVycy5yZXNldChuZXcgRHVtbXlJbnB1dEJ1ZmZlcnMoIiIpKTsKKyAgICAgICAgaW5wdXQtPmV4dHJhQnVmZmVycy5mbHVzaCgpOworICAgICAgICBpbnB1dC0+aW5wdXREZWxheSA9IDB1OworICAgICAgICBpbnB1dC0+cGlwZWxpbmVEZWxheSA9IDB1OworICAgICAgICBpbnB1dC0+bnVtU2xvdHMgPSBrU21vb3RobmVzc0ZhY3RvcjsKKyAgICAgICAgaW5wdXQtPm51bUV4dHJhU2xvdHMgPSAwdTsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPE91dHB1dD46OkxvY2tlZCBvdXRwdXQobU91dHB1dCk7CisgICAgICAgIG91dHB1dC0+b3V0cHV0RGVsYXkgPSAwdTsKKyAgICAgICAgb3V0cHV0LT5udW1TbG90cyA9IGtTbW9vdGhuZXNzRmFjdG9yOworICAgIH0KK30KKworQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6fkNDb2RlY0J1ZmZlckNoYW5uZWwoKSB7CisgICAgaWYgKG1DcnlwdG8gIT0gbnVsbHB0ciAmJiBtRGVhbGVyICE9IG51bGxwdHIgJiYgbUhlYXBTZXFOdW0gPj0gMCkgeworICAgICAgICBtQ3J5cHRvLT51bnNldEhlYXAobUhlYXBTZXFOdW0pOworICAgIH0KK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzZXRDb21wb25lbnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCkgeworICAgIG1Db21wb25lbnQgPSBjb21wb25lbnQ7CisgICAgbUNvbXBvbmVudE5hbWUgPSBjb21wb25lbnQtPmdldE5hbWUoKSArIFN0cmluZ1ByaW50ZigiIyVkIiwgaW50KHVpbnRwdHJfdChjb21wb25lbnQuZ2V0KCkpICUgOTk3KSk7CisgICAgbU5hbWUgPSBtQ29tcG9uZW50TmFtZS5jX3N0cigpOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzZXRJbnB1dFN1cmZhY2UoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyPiAmc3VyZmFjZSkgeworICAgIEFMT0dWKCJbJXNdIHNldElucHV0U3VyZmFjZSIsIG1OYW1lKTsKKyAgICBtSW5wdXRTdXJmYWNlID0gc3VyZmFjZTsKKyAgICByZXR1cm4gbUlucHV0U3VyZmFjZS0+Y29ubmVjdChtQ29tcG9uZW50KTsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIHsKKyAgICBpZiAobUlucHV0U3VyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgcmV0dXJuIG1JbnB1dFN1cmZhY2UtPnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKTsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cXVldWVJbnB1dEJ1ZmZlckludGVybmFsKHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlcikgeworICAgIGludDY0X3QgdGltZVVzOworICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKKworICAgIGlmIChtSW5wdXRNZXRFb3MpIHsKKyAgICAgICAgQUxPR0QoIlslc10gYnVmZmVycyBhZnRlciBFT1MgaWdub3JlZCAoJWxsZCB1cykiLCBtTmFtZSwgKGxvbmcgbG9uZyl0aW1lVXMpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaW50MzJfdCBmbGFncyA9IDA7CisgICAgaW50MzJfdCB0bXAgPSAwOworICAgIGJvb2wgZW9zID0gZmFsc2U7CisgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImVvcyIsICZ0bXApICYmIHRtcCkgeworICAgICAgICBlb3MgPSB0cnVlOworICAgICAgICBtSW5wdXRNZXRFb3MgPSB0cnVlOworICAgICAgICBBTE9HVigiWyVzXSBpbnB1dCBFT1MiLCBtTmFtZSk7CisgICAgfQorICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjc2QiLCAmdG1wKSAmJiB0bXApIHsKKyAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHOworICAgIH0KKyAgICBBTE9HVigiWyVzXSBxdWV1ZUlucHV0QnVmZmVyOiBidWZmZXItPnNpemUoKSA9ICV6dSIsIG1OYW1lLCBidWZmZXItPnNpemUoKSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gd29yayhuZXcgQzJXb3JrKTsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLnRpbWVzdGFtcCA9IHRpbWVVczsKKyAgICB3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXggPSBtRnJhbWVJbmRleCsrOworICAgIC8vIFdPUktBUk9VTkQ6IHVudGlsIGNvZGVjcyBzdXBwb3J0IGhhbmRsaW5nIHdvcmsgYWZ0ZXIgRU9TIGFuZCBtYXggb3V0cHV0IHNpemluZywgdXNlIHRpbWVzdGFtcAorICAgIC8vIG1hbmlwdWxhdGlvbiB0byBhY2hpZXZlIGltYWdlIGVuY29kaW5nIHZpYSB2aWRlbyBjb2RlYywgYW5kIHRvIGNvbnN0cmFpbiBlbmNvZGVkIG91dHB1dC4KKyAgICAvLyBLZWVwIGNsaWVudCB0aW1lc3RhbXAgaW4gY3VzdG9tT3JkaW5hbAorICAgIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbCA9IHRpbWVVczsKKyAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisKKyAgICB1aW50NjRfdCBxdWV1ZWRGcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gcXVldWVkQnVmZmVyczsKKyAgICBzcDxDb2RlYzJCdWZmZXI+IGNvcHk7CisKKyAgICBpZiAoYnVmZmVyLT5zaXplKCkgPiAwdSkgeworICAgICAgICBNdXRleGVkPElucHV0Pjo6TG9ja2VkIGlucHV0KG1JbnB1dCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYzJidWZmZXI7CisgICAgICAgIGlmICghaW5wdXQtPmJ1ZmZlcnMtPnJlbGVhc2VCdWZmZXIoYnVmZmVyLCAmYzJidWZmZXIsIGZhbHNlKSkgeworICAgICAgICAgICAgcmV0dXJuIC1FTk9FTlQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gVE9ETzogd2Ugd2FudCB0byBkZWxheSBjb3B5aW5nIGJ1ZmZlcnMuCisgICAgICAgIGlmIChpbnB1dC0+ZXh0cmFCdWZmZXJzLm51bUNvbXBvbmVudEJ1ZmZlcnMoKSA8IGlucHV0LT5udW1FeHRyYVNsb3RzKSB7CisgICAgICAgICAgICBjb3B5ID0gaW5wdXQtPmJ1ZmZlcnMtPmNsb25lQW5kUmVsZWFzZUJ1ZmZlcihidWZmZXIpOworICAgICAgICAgICAgaWYgKGNvcHkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICh2b2lkKWlucHV0LT5leHRyYUJ1ZmZlcnMuYXNzaWduU2xvdChjb3B5KTsKKyAgICAgICAgICAgICAgICBpZiAoIWlucHV0LT5leHRyYUJ1ZmZlcnMucmVsZWFzZVNsb3QoY29weSwgJmMyYnVmZmVyLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJvb2wgcmVsZWFzZWQgPSBpbnB1dC0+YnVmZmVycy0+cmVsZWFzZUJ1ZmZlcihidWZmZXIsIG51bGxwdHIsIHRydWUpOworICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIHF1ZXVlSW5wdXRCdWZmZXI6IGJ1ZmZlciBjb3BpZWQ7ICVzcmVsZWFzZWQiLAorICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCByZWxlYXNlZCA/ICIiIDogIm5vdCAiKTsKKyAgICAgICAgICAgICAgICBidWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIlslc10gcXVldWVJbnB1dEJ1ZmZlcjogZmFpbGVkIHRvIGNvcHkgYSBidWZmZXI7IHRoaXMgbWF5IGNhdXNlIGlucHV0ICIKKyAgICAgICAgICAgICAgICAgICAgICAiYnVmZmVyIHN0YXJ2YXRpb24gb24gY29tcG9uZW50LiIsIG1OYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLnB1c2hfYmFjayhjMmJ1ZmZlcik7CisgICAgICAgIHF1ZXVlZEJ1ZmZlcnMucHVzaF9iYWNrKGMyYnVmZmVyKTsKKyAgICB9IGVsc2UgaWYgKGVvcykgeworICAgICAgICBmbGFncyB8PSBDMkZyYW1lRGF0YTo6RkxBR19FTkRfT0ZfU1RSRUFNOworICAgIH0KKyAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAvLyBUT0RPOiBmaWxsIGluZm8ncworCisgICAgd29yay0+aW5wdXQuY29uZmlnVXBkYXRlID0gc3RkOjptb3ZlKG1QYXJhbXNUb0JlU2V0KTsKKyAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgIHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gaXRlbXM7CisgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPm9uV29ya1F1ZXVlZCgKKyAgICAgICAgICAgIHF1ZXVlZEZyYW1lSW5kZXgsCisgICAgICAgICAgICBzdGQ6Om1vdmUocXVldWVkQnVmZmVycyksCisgICAgICAgICAgICBQaXBlbGluZVdhdGNoZXI6OkNsb2NrOjpub3coKSk7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIG1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5vbldvcmtEb25lKHF1ZXVlZEZyYW1lSW5kZXgpOworICAgIH0KKworICAgIGlmIChlcnIgPT0gQzJfT0sgJiYgZW9zICYmIGJ1ZmZlci0+c2l6ZSgpID4gMHUpIHsKKyAgICAgICAgd29yay5yZXNldChuZXcgQzJXb3JrKTsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSB0aW1lVXM7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IG1GcmFtZUluZGV4Kys7CisgICAgICAgIC8vIFdPUktBUk9VTkQ6IGtlZXAgY2xpZW50IHRpbWVzdGFtcCBpbiBjdXN0b21PcmRpbmFsCisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuY3VzdG9tT3JkaW5hbCA9IHRpbWVVczsKKyAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIHdvcmstPndvcmtsZXRzLmVtcGxhY2VfYmFjayhuZXcgQzJXb3JrbGV0KTsKKworICAgICAgICBxdWV1ZWRGcmFtZUluZGV4ID0gd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1KCk7CisgICAgICAgIHF1ZXVlZEJ1ZmZlcnMuY2xlYXIoKTsKKworICAgICAgICBpdGVtcy5jbGVhcigpOworICAgICAgICBpdGVtcy5wdXNoX2JhY2soc3RkOjptb3ZlKHdvcmspKTsKKworICAgICAgICBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+b25Xb3JrUXVldWVkKAorICAgICAgICAgICAgICAgIHF1ZXVlZEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHF1ZXVlZEJ1ZmZlcnMpLAorICAgICAgICAgICAgICAgIFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6Om5vdygpKTsKKyAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cXVldWUoJml0ZW1zKTsKKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPm9uV29ya0RvbmUocXVldWVkRnJhbWVJbmRleCk7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICBNdXRleGVkPElucHV0Pjo6TG9ja2VkIGlucHV0KG1JbnB1dCk7CisgICAgICAgIGJvb2wgcmVsZWFzZWQgPSBmYWxzZTsKKyAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgcmVsZWFzZWQgPSBpbnB1dC0+YnVmZmVycy0+cmVsZWFzZUJ1ZmZlcihidWZmZXIsIG51bGxwdHIsIHRydWUpOworICAgICAgICB9IGVsc2UgaWYgKGNvcHkpIHsKKyAgICAgICAgICAgIHJlbGVhc2VkID0gaW5wdXQtPmV4dHJhQnVmZmVycy5yZWxlYXNlU2xvdChjb3B5LCBudWxscHRyLCB0cnVlKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiWyVzXSBxdWV1ZUlucHV0QnVmZmVyOiBidWZmZXIlcyAlc3JlbGVhc2VkIiwKKyAgICAgICAgICAgICAgbU5hbWUsIChidWZmZXIgPT0gbnVsbHB0cikgPyAiKGNvcHkpIiA6ICIiLCByZWxlYXNlZCA/ICIiIDogIm5vdCAiKTsKKyAgICB9CisKKyAgICBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZUludGVybmFsKCk7CisgICAgcmV0dXJuIGVycjsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c2V0UGFyYW1ldGVycyhzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZwYXJhbXMpIHsKKyAgICBRdWV1ZUd1YXJkIGd1YXJkKG1TeW5jKTsKKyAgICBpZiAoIWd1YXJkLmlzUnVubmluZygpKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIHNldFBhcmFtZXRlcnMgaXMgb25seSBzdXBwb3J0ZWQgaW4gdGhlIHJ1bm5pbmcgc3RhdGUuIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gLUVOT1NZUzsKKyAgICB9CisgICAgbVBhcmFtc1RvQmVTZXQuaW5zZXJ0KG1QYXJhbXNUb0JlU2V0LmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihwYXJhbXMuYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9tb3ZlX2l0ZXJhdG9yKHBhcmFtcy5lbmQoKSkpOworICAgIHBhcmFtcy5jbGVhcigpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cXVldWVJbnB1dEJ1ZmZlcihjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgUXVldWVHdWFyZCBndWFyZChtU3luYyk7CisgICAgaWYgKCFndWFyZC5pc1J1bm5pbmcoKSkgeworICAgICAgICBBTE9HRCgiWyVzXSBObyBtb3JlIGJ1ZmZlcnMgc2hvdWxkIGJlIHF1ZXVlZCBhdCBjdXJyZW50IHN0YXRlLiIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIC1FTk9TWVM7CisgICAgfQorICAgIHJldHVybiBxdWV1ZUlucHV0QnVmZmVySW50ZXJuYWwoYnVmZmVyKTsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6cXVldWVTZWN1cmVJbnB1dEJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgYm9vbCBzZWN1cmUsIGNvbnN0IHVpbnQ4X3QgKmtleSwKKyAgICAgICAgY29uc3QgdWludDhfdCAqaXYsIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLCBDcnlwdG9QbHVnaW46OlBhdHRlcm4gcGF0dGVybiwKKyAgICAgICAgY29uc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgKnN1YlNhbXBsZXMsIHNpemVfdCBudW1TdWJTYW1wbGVzLAorICAgICAgICBBU3RyaW5nICplcnJvckRldGFpbE1zZykgeworICAgIFF1ZXVlR3VhcmQgZ3VhcmQobVN5bmMpOworICAgIGlmICghZ3VhcmQuaXNSdW5uaW5nKCkpIHsKKyAgICAgICAgQUxPR0QoIlslc10gTm8gbW9yZSBidWZmZXJzIHNob3VsZCBiZSBxdWV1ZWQgYXQgY3VycmVudCBzdGF0ZS4iLCBtTmFtZSk7CisgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgIH0KKworICAgIGlmICghaGFzQ3J5cHRvT3JEZXNjcmFtYmxlcigpKSB7CisgICAgICAgIHJldHVybiAtRU5PU1lTOworICAgIH0KKyAgICBzcDxFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcj4gZW5jcnlwdGVkQnVmZmVyKChFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlciAqKWJ1ZmZlci5nZXQoKSk7CisKKyAgICBzc2l6ZV90IHJlc3VsdCA9IC0xOworICAgIHNzaXplX3QgY29kZWNEYXRhT2Zmc2V0ID0gMDsKKyAgICBpZiAobUNyeXB0byAhPSBudWxscHRyKSB7CisgICAgICAgIElDcnlwdG86OkRlc3RpbmF0aW9uQnVmZmVyIGRlc3RpbmF0aW9uOworICAgICAgICBpZiAoc2VjdXJlKSB7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tVHlwZSA9IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVOYXRpdmVIYW5kbGU7CisgICAgICAgICAgICBkZXN0aW5hdGlvbi5tSGFuZGxlID0gZW5jcnlwdGVkQnVmZmVyLT5oYW5kbGUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLm1UeXBlID0gSUNyeXB0bzo6a0Rlc3RpbmF0aW9uVHlwZVNoYXJlZE1lbW9yeTsKKyAgICAgICAgICAgIGRlc3RpbmF0aW9uLm1TaGFyZWRNZW1vcnkgPSBtRGVjcnlwdERlc3RpbmF0aW9uOworICAgICAgICB9CisgICAgICAgIElDcnlwdG86OlNvdXJjZUJ1ZmZlciBzb3VyY2U7CisgICAgICAgIGVuY3J5cHRlZEJ1ZmZlci0+ZmlsbFNvdXJjZUJ1ZmZlcigmc291cmNlKTsKKyAgICAgICAgcmVzdWx0ID0gbUNyeXB0by0+ZGVjcnlwdCgKKyAgICAgICAgICAgICAgICBrZXksIGl2LCBtb2RlLCBwYXR0ZXJuLCBzb3VyY2UsIGJ1ZmZlci0+b2Zmc2V0KCksCisgICAgICAgICAgICAgICAgc3ViU2FtcGxlcywgbnVtU3ViU2FtcGxlcywgZGVzdGluYXRpb24sIGVycm9yRGV0YWlsTXNnKTsKKyAgICAgICAgaWYgKHJlc3VsdCA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlc3RpbmF0aW9uLm1UeXBlID09IElDcnlwdG86OmtEZXN0aW5hdGlvblR5cGVTaGFyZWRNZW1vcnkpIHsKKyAgICAgICAgICAgIGVuY3J5cHRlZEJ1ZmZlci0+Y29weURlY3J5cHRlZENvbnRlbnQobURlY3J5cHREZXN0aW5hdGlvbiwgcmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEhlcmUgd2UgY2FzdCBDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSB0byBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OlN1YlNhbXBsZQorICAgICAgICAvLyBkaXJlY3RseSwgdGhlIHN0cnVjdHVyZSBkZWZpbml0aW9ucyBzaG91bGQgbWF0Y2ggYXMgY2hlY2tlZCBpbiBEZXNjcmFtYmxlckltcGwuY3BwLgorICAgICAgICBoaWRsX3ZlYzxTdWJTYW1wbGU+IGhpZGxTdWJTYW1wbGVzOworICAgICAgICBoaWRsU3ViU2FtcGxlcy5zZXRUb0V4dGVybmFsKChTdWJTYW1wbGUgKilzdWJTYW1wbGVzLCBudW1TdWJTYW1wbGVzLCBmYWxzZSAvKm93biovKTsKKworICAgICAgICBoYXJkd2FyZTo6Y2FzOjpuYXRpdmU6OlYxXzA6OlNoYXJlZEJ1ZmZlciBzcmNCdWZmZXI7CisgICAgICAgIGVuY3J5cHRlZEJ1ZmZlci0+ZmlsbFNvdXJjZUJ1ZmZlcigmc3JjQnVmZmVyKTsKKworICAgICAgICBEZXN0aW5hdGlvbkJ1ZmZlciBkc3RCdWZmZXI7CisgICAgICAgIGlmIChzZWN1cmUpIHsKKyAgICAgICAgICAgIGRzdEJ1ZmZlci50eXBlID0gQnVmZmVyVHlwZTo6TkFUSVZFX0hBTkRMRTsKKyAgICAgICAgICAgIGRzdEJ1ZmZlci5zZWN1cmVNZW1vcnkgPSBoaWRsX2hhbmRsZShlbmNyeXB0ZWRCdWZmZXItPmhhbmRsZSgpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRzdEJ1ZmZlci50eXBlID0gQnVmZmVyVHlwZTo6U0hBUkVEX01FTU9SWTsKKyAgICAgICAgICAgIGRzdEJ1ZmZlci5ub25zZWN1cmVNZW1vcnkgPSBzcmNCdWZmZXI7CisgICAgICAgIH0KKworICAgICAgICBDYXNTdGF0dXMgc3RhdHVzID0gQ2FzU3RhdHVzOjpPSzsKKyAgICAgICAgaGlkbF9zdHJpbmcgZGV0YWlsZWRFcnJvcjsKKyAgICAgICAgU2NyYW1ibGluZ0NvbnRyb2wgc2N0cmwgPSBTY3JhbWJsaW5nQ29udHJvbDo6VU5TQ1JBTUJMRUQ7CisKKyAgICAgICAgaWYgKGtleSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzY3RybCA9IChTY3JhbWJsaW5nQ29udHJvbClrZXlbMF07CisgICAgICAgICAgICAvLyBBZGp1c3QgZm9yIHRoZSBQRVMgb2Zmc2V0CisgICAgICAgICAgICBjb2RlY0RhdGFPZmZzZXQgPSBrZXlbMl0gfCAoa2V5WzNdIDw8IDgpOworICAgICAgICB9CisKKyAgICAgICAgYXV0byByZXR1cm5Wb2lkID0gbURlc2NyYW1ibGVyLT5kZXNjcmFtYmxlKAorICAgICAgICAgICAgICAgIHNjdHJsLAorICAgICAgICAgICAgICAgIGhpZGxTdWJTYW1wbGVzLAorICAgICAgICAgICAgICAgIHNyY0J1ZmZlciwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmcmVzdWx0LCAmZGV0YWlsZWRFcnJvcl0gKAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FzU3RhdHVzIF9zdGF0dXMsIHVpbnQzMl90IF9ieXRlc1dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgX2RldGFpbGVkRXJyb3IpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gX3N0YXR1czsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gKHNzaXplX3QpX2J5dGVzV3JpdHRlbjsKKyAgICAgICAgICAgICAgICAgICAgZGV0YWlsZWRFcnJvciA9IF9kZXRhaWxlZEVycm9yOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIGlmICghcmV0dXJuVm9pZC5pc09rKCkgfHwgc3RhdHVzICE9IENhc1N0YXR1czo6T0sgfHwgcmVzdWx0IDwgMCkgeworICAgICAgICAgICAgQUxPR0koIlslc10gZGVzY3JhbWJsZSBmYWlsZWQsIHRyYW5zPSVzLCBzdGF0dXM9JWQsIHJlc3VsdD0lemQiLAorICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcmV0dXJuVm9pZC5kZXNjcmlwdGlvbigpLmNfc3RyKCksIHN0YXR1cywgcmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdCA8IGNvZGVjRGF0YU9mZnNldCkgeworICAgICAgICAgICAgQUxPR0QoImludmFsaWQgY29kZWMgZGF0YSBvZmZzZXQ6ICV6ZCwgcmVzdWx0ICV6ZCIsIGNvZGVjRGF0YU9mZnNldCwgcmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiWyVzXSBkZXNjcmFtYmxlIHN1Y2NlZWRlZCwgJXpkIGJ5dGVzIiwgbU5hbWUsIHJlc3VsdCk7CisKKyAgICAgICAgaWYgKGRzdEJ1ZmZlci50eXBlID09IEJ1ZmZlclR5cGU6OlNIQVJFRF9NRU1PUlkpIHsKKyAgICAgICAgICAgIGVuY3J5cHRlZEJ1ZmZlci0+Y29weURlY3J5cHRlZENvbnRlbnRGcm9tTWVtb3J5KHJlc3VsdCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBidWZmZXItPnNldFJhbmdlKGNvZGVjRGF0YU9mZnNldCwgcmVzdWx0IC0gY29kZWNEYXRhT2Zmc2V0KTsKKyAgICByZXR1cm4gcXVldWVJbnB1dEJ1ZmZlckludGVybmFsKGJ1ZmZlcik7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6ZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKSB7CisgICAgUXVldWVHdWFyZCBndWFyZChtU3luYyk7CisgICAgaWYgKCFndWFyZC5pc1J1bm5pbmcoKSkgeworICAgICAgICBBTE9HVigiWyVzXSBXZSdyZSBub3QgcnVubmluZyAtLS0gbm8gaW5wdXQgYnVmZmVyIHJlcG9ydGVkIiwgbU5hbWUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlSW50ZXJuYWwoKTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZUludGVybmFsKCkgeworICAgIGlmIChtSW5wdXRNZXRFb3MgfHwKKyAgICAgICAgICAgbVJlb3JkZXJTdGFzaC5sb2NrKCktPmhhc1BlbmRpbmcoKSB8fAorICAgICAgICAgICBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+cGlwZWxpbmVGdWxsKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAgIE11dGV4ZWQ8T3V0cHV0Pjo6TG9ja2VkIG91dHB1dChtT3V0cHV0KTsKKyAgICAgICAgaWYgKG91dHB1dC0+YnVmZmVycy0+bnVtQ2xpZW50QnVmZmVycygpID49IG91dHB1dC0+bnVtU2xvdHMpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBzaXplX3QgbnVtSW5wdXRTbG90cyA9IG1JbnB1dC5sb2NrKCktPm51bVNsb3RzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtSW5wdXRTbG90czsgKytpKSB7CisgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGluQnVmZmVyOworICAgICAgICBzaXplX3QgaW5kZXg7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8SW5wdXQ+OjpMb2NrZWQgaW5wdXQobUlucHV0KTsKKyAgICAgICAgICAgIGlmIChpbnB1dC0+YnVmZmVycy0+bnVtQ2xpZW50QnVmZmVycygpID49IGlucHV0LT5udW1TbG90cykgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaW5wdXQtPmJ1ZmZlcnMtPnJlcXVlc3ROZXdCdWZmZXIoJmluZGV4LCAmaW5CdWZmZXIpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gbm8gbmV3IGJ1ZmZlciBhdmFpbGFibGUiLCBtTmFtZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlslc10gbmV3IGlucHV0IGluZGV4ID0gJXp1IFslcF0iLCBtTmFtZSwgaW5kZXgsIGluQnVmZmVyLmdldCgpKTsKKyAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0QnVmZmVyQXZhaWxhYmxlKGluZGV4LCBpbkJ1ZmZlcik7CisgICAgfQorfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpyZW5kZXJPdXRwdXRCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIGludDY0X3QgdGltZXN0YW1wTnMpIHsKKyAgICBBTE9HVigiWyVzXSByZW5kZXJPdXRwdXRCdWZmZXI6ICVwIiwgbU5hbWUsIGJ1ZmZlci5nZXQoKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjMkJ1ZmZlcjsKKyAgICBib29sIHJlbGVhc2VkID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleGVkPE91dHB1dD46OkxvY2tlZCBvdXRwdXQobU91dHB1dCk7CisgICAgICAgIGlmIChvdXRwdXQtPmJ1ZmZlcnMpIHsKKyAgICAgICAgICAgIHJlbGVhc2VkID0gb3V0cHV0LT5idWZmZXJzLT5yZWxlYXNlQnVmZmVyKGJ1ZmZlciwgJmMyQnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBOT1RFOiBzb21lIGFwcHMgdHJ5IHRvIHJlbGVhc2VPdXRwdXRCdWZmZXIoKSB3aXRoIHRpbWVzdGFtcCBhbmQvb3IgcmVuZGVyCisgICAgLy8gICAgICAgc2V0IHRvIHRydWUuCisgICAgc2VuZE91dHB1dEJ1ZmZlcnMoKTsKKyAgICAvLyBpbnB1dCBidWZmZXIgZmVlZGluZyBtYXkgaGF2ZSBiZWVuIGdhdGVkIGJ5IHBlbmRpbmcgb3V0cHV0IGJ1ZmZlcnMKKyAgICBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSgpOworICAgIGlmICghYzJCdWZmZXIpIHsKKyAgICAgICAgaWYgKHJlbGVhc2VkKSB7CisgICAgICAgICAgICBzdGQ6OmNhbGxfb25jZShtUmVuZGVyV2FybmluZ0ZsYWcsIFt0aGlzXSB7CisgICAgICAgICAgICAgICAgQUxPR1coIlslc10gVGhlIGFwcCBpcyBjYWxsaW5nIHJlbGVhc2VPdXRwdXRCdWZmZXIoKSB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgICAidGltZXN0YW1wIG9yIHJlbmRlcj10cnVlIHdpdGggbm9uLXZpZGVvIGJ1ZmZlcnMuIEFwcHMgc2hvdWxkICIKKyAgICAgICAgICAgICAgICAgICAgICAiY2FsbCByZWxlYXNlT3V0cHV0QnVmZmVyKCkgd2l0aCByZW5kZXI9ZmFsc2UgZm9yIHRob3NlLiIsCisgICAgICAgICAgICAgICAgICAgICAgbU5hbWUpOworICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworI2lmIDAKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPj4gaW5mb1BhcmFtcyA9IGMyQnVmZmVyLT5pbmZvKCk7CisgICAgQUxPR1YoIlslc10gcXVldWluZyBnZnggYnVmZmVyIHdpdGggJXp1IGluZm9zIiwgbU5hbWUsIGluZm9QYXJhbXMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+ICZpbmZvIDogaW5mb1BhcmFtcykgeworICAgICAgICBBU3RyaW5nIHJlczsKKyAgICAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCArIDMgPCBpbmZvLT5zaXplKCk7IGl4ICs9IDQpIHsKKyAgICAgICAgICAgIGlmIChpeCkgcmVzLmFwcGVuZCgiLCAiKTsKKyAgICAgICAgICAgIHJlcy5hcHBlbmQoKigoaW50MzJfdCopaW5mby5nZXQoKSArIChpeCAvIDQpKSk7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiAgWyVzXSIsIHJlcy5jX3N0cigpKTsKKyAgICB9CisjZW5kaWYKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJTdHJlYW1Sb3RhdGlvbkluZm86Om91dHB1dD4gcm90YXRpb24gPQorICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJTdHJlYW1Sb3RhdGlvbkluZm86Om91dHB1dD4oCisgICAgICAgICAgICAgICAgYzJCdWZmZXItPmdldEluZm8oQzJTdHJlYW1Sb3RhdGlvbkluZm86Om91dHB1dDo6UEFSQU1fVFlQRSkpOworICAgIGJvb2wgZmxpcCA9IHJvdGF0aW9uICYmIChyb3RhdGlvbi0+ZmxpcCAmIDEpOworICAgIHVpbnQzMl90IHF1YXJ0ZXJzID0gKChyb3RhdGlvbiA/IHJvdGF0aW9uLT52YWx1ZSA6IDApIC8gOTApICYgMzsKKyAgICB1aW50MzJfdCB0cmFuc2Zvcm0gPSAwOworICAgIHN3aXRjaCAocXVhcnRlcnMpIHsKKyAgICAgICAgY2FzZSAwOiAvLyBubyByb3RhdGlvbgorICAgICAgICAgICAgdHJhbnNmb3JtID0gZmxpcCA/IEhBTF9UUkFOU0ZPUk1fRkxJUF9IIDogMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDE6IC8vIDkwIGRlZ3JlZXMgY291bnRlci1jbG9ja3dpc2UKKyAgICAgICAgICAgIHRyYW5zZm9ybSA9IGZsaXAgPyAoSEFMX1RSQU5TRk9STV9GTElQX1YgfCBIQUxfVFJBTlNGT1JNX1JPVF85MCkKKyAgICAgICAgICAgICAgICAgICAgOiBIQUxfVFJBTlNGT1JNX1JPVF8yNzA7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOiAvLyAxODAgZGVncmVlcworICAgICAgICAgICAgdHJhbnNmb3JtID0gZmxpcCA/IEhBTF9UUkFOU0ZPUk1fRkxJUF9WIDogSEFMX1RSQU5TRk9STV9ST1RfMTgwOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMzogLy8gOTAgZGVncmVlcyBjbG9ja3dpc2UKKyAgICAgICAgICAgIHRyYW5zZm9ybSA9IGZsaXAgPyAoSEFMX1RSQU5TRk9STV9GTElQX0ggfCBIQUxfVFJBTlNGT1JNX1JPVF85MCkKKyAgICAgICAgICAgICAgICAgICAgOiBIQUxfVFJBTlNGT1JNX1JPVF85MDsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzo6b3V0cHV0PiBzdXJmYWNlU2NhbGluZyA9CisgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxjb25zdCBDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzo6b3V0cHV0PigKKyAgICAgICAgICAgICAgICBjMkJ1ZmZlci0+Z2V0SW5mbyhDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSk7CisgICAgdWludDMyX3QgdmlkZW9TY2FsaW5nTW9kZSA9IE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVzsKKyAgICBpZiAoc3VyZmFjZVNjYWxpbmcpIHsKKyAgICAgICAgdmlkZW9TY2FsaW5nTW9kZSA9IHN1cmZhY2VTY2FsaW5nLT52YWx1ZTsKKyAgICB9CisKKyAgICAvLyBVc2UgZGF0YXNwYWNlIGZyb20gZm9ybWF0IGFzIGl0IGhhcyB0aGUgZGVmYXVsdCBhc3BlY3RzIGFscmVhZHkgYXBwbGllZAorICAgIGFuZHJvaWRfZGF0YXNwYWNlX3QgZGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9VTktOT1dOOyAvLyB0aGlzIGlzIDAKKyAgICAodm9pZClidWZmZXItPmZvcm1hdCgpLT5maW5kSW50MzIoImFuZHJvaWQuX2RhdGFzcGFjZSIsIChpbnQzMl90ICopJmRhdGFTcGFjZSk7CisKKyAgICAvLyBIRFIgc3RhdGljIGluZm8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ+IGhkclN0YXRpY0luZm8gPQorICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgIGMyQnVmZmVyLT5nZXRJbmZvKEMyU3RyZWFtSGRyU3RhdGljSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSk7CisKKyAgICAvLyBIRFIxMCBwbHVzIGluZm8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ+IGhkcjEwUGx1c0luZm8gPQorICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJTdHJlYW1IZHIxMFBsdXNJbmZvOjpvdXRwdXQ+KAorICAgICAgICAgICAgICAgIGMyQnVmZmVyLT5nZXRJbmZvKEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFKSk7CisKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8T3V0cHV0U3VyZmFjZT46OkxvY2tlZCBvdXRwdXQobU91dHB1dFN1cmZhY2UpOworICAgICAgICBpZiAob3V0cHV0LT5zdXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIGNhbm5vdCByZW5kZXIgYnVmZmVyIHdpdGhvdXQgc3VyZmFjZSIsIG1OYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+IGJsb2NrcyA9IGMyQnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpOworICAgIGlmIChibG9ja3Muc2l6ZSgpICE9IDF1KSB7CisgICAgICAgIEFMT0dEKCJbJXNdIGV4cGVjdGVkIDEgZ3JhcGhpYyBibG9jaywgYnV0IGdvdCAlenUiLCBtTmFtZSwgYmxvY2tzLnNpemUoKSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBjb25zdCBDMkNvbnN0R3JhcGhpY0Jsb2NrICZibG9jayA9IGJsb2Nrcy5mcm9udCgpOworCisgICAgLy8gVE9ETzogcmV2aXNpdCB0aGlzIGFmdGVyIEMyRmVuY2UgaW1wbGVtZW50YXRpb24uCisgICAgYW5kcm9pZDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBxYmkoCisgICAgICAgICAgICB0aW1lc3RhbXBOcywKKyAgICAgICAgICAgIGZhbHNlLCAvLyBkcm9wcGFibGUKKyAgICAgICAgICAgIGRhdGFTcGFjZSwKKyAgICAgICAgICAgIFJlY3QoYmxvY2tzLmZyb250KCkuY3JvcCgpLmxlZnQsCisgICAgICAgICAgICAgICAgIGJsb2Nrcy5mcm9udCgpLmNyb3AoKS50b3AsCisgICAgICAgICAgICAgICAgIGJsb2Nrcy5mcm9udCgpLmNyb3AoKS5yaWdodCgpLAorICAgICAgICAgICAgICAgICBibG9ja3MuZnJvbnQoKS5jcm9wKCkuYm90dG9tKCkpLAorICAgICAgICAgICAgdmlkZW9TY2FsaW5nTW9kZSwKKyAgICAgICAgICAgIHRyYW5zZm9ybSwKKyAgICAgICAgICAgIEZlbmNlOjpOT19GRU5DRSwgMCk7CisgICAgaWYgKGhkclN0YXRpY0luZm8gfHwgaGRyMTBQbHVzSW5mbykgeworICAgICAgICBIZHJNZXRhZGF0YSBoZHI7CisgICAgICAgIGlmIChoZHJTdGF0aWNJbmZvKSB7CisgICAgICAgICAgICBzdHJ1Y3QgYW5kcm9pZF9zbXB0ZTIwODZfbWV0YWRhdGEgc21wdGUyMDg2X21ldGEgPSB7CisgICAgICAgICAgICAgICAgLmRpc3BsYXlQcmltYXJ5UmVkID0geworICAgICAgICAgICAgICAgICAgICBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcucmVkLngsIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5yZWQueQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgLmRpc3BsYXlQcmltYXJ5R3JlZW4gPSB7CisgICAgICAgICAgICAgICAgICAgIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5ncmVlbi54LCBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcuZ3JlZW4ueQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgLmRpc3BsYXlQcmltYXJ5Qmx1ZSA9IHsKKyAgICAgICAgICAgICAgICAgICAgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLmJsdWUueCwgaGRyU3RhdGljSW5mby0+bWFzdGVyaW5nLmJsdWUueQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgLndoaXRlUG9pbnQgPSB7CisgICAgICAgICAgICAgICAgICAgIGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy53aGl0ZS54LCBoZHJTdGF0aWNJbmZvLT5tYXN0ZXJpbmcud2hpdGUueQorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICAgICAgLm1heEx1bWluYW5jZSA9IGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5tYXhMdW1pbmFuY2UsCisgICAgICAgICAgICAgICAgLm1pbkx1bWluYW5jZSA9IGhkclN0YXRpY0luZm8tPm1hc3RlcmluZy5taW5MdW1pbmFuY2UsCisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBzdHJ1Y3QgYW5kcm9pZF9jdGE4NjFfM19tZXRhZGF0YSBjdGE4NjFfbWV0YSA9IHsKKyAgICAgICAgICAgICAgICAubWF4Q29udGVudExpZ2h0TGV2ZWwgPSBoZHJTdGF0aWNJbmZvLT5tYXhDbGwsCisgICAgICAgICAgICAgICAgLm1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwgPSBoZHJTdGF0aWNJbmZvLT5tYXhGYWxsLAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgaGRyLnZhbGlkVHlwZXMgPSBIZHJNZXRhZGF0YTo6U01QVEUyMDg2IHwgSGRyTWV0YWRhdGE6OkNUQTg2MV8zOworICAgICAgICAgICAgaGRyLnNtcHRlMjA4NiA9IHNtcHRlMjA4Nl9tZXRhOworICAgICAgICAgICAgaGRyLmN0YTg2MTMgPSBjdGE4NjFfbWV0YTsKKyAgICAgICAgfQorICAgICAgICBpZiAoaGRyMTBQbHVzSW5mbykgeworICAgICAgICAgICAgaGRyLnZhbGlkVHlwZXMgfD0gSGRyTWV0YWRhdGE6OkhEUjEwUExVUzsKKyAgICAgICAgICAgIGhkci5oZHIxMHBsdXMuYXNzaWduKAorICAgICAgICAgICAgICAgICAgICBoZHIxMFBsdXNJbmZvLT5tLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICBoZHIxMFBsdXNJbmZvLT5tLnZhbHVlICsgaGRyMTBQbHVzSW5mby0+ZmxleENvdW50KCkpOworICAgICAgICB9CisgICAgICAgIHFiaS5zZXRIZHJNZXRhZGF0YShoZHIpOworICAgIH0KKyAgICAvLyB3ZSBkb24ndCBoYXZlIGRpcnR5IHJlZ2lvbnMKKyAgICBxYmkuc2V0U3VyZmFjZURhbWFnZShSZWdpb246OklOVkFMSURfUkVHSU9OKTsKKyAgICBhbmRyb2lkOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBxYm87CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbUNvbXBvbmVudC0+cXVldWVUb091dHB1dFN1cmZhY2UoYmxvY2ssIHFiaSwgJnFibyk7CisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICBBTE9HSSgiWyVzXSBxdWV1ZUJ1ZmZlciBmYWlsZWQ6ICVkIiwgbU5hbWUsIHJlc3VsdCk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIEFMT0dWKCJbJXNdIHF1ZXVlIGJ1ZmZlciBzdWNjZXNzZnVsIiwgbU5hbWUpOworCisgICAgaW50NjRfdCBtZWRpYVRpbWVVcyA9IDA7CisgICAgKHZvaWQpYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKTsKKyAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uT3V0cHV0RnJhbWVzUmVuZGVyZWQobWVkaWFUaW1lVXMsIHRpbWVzdGFtcE5zKTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6ZGlzY2FyZEJ1ZmZlcihjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgQUxPR1YoIlslc10gZGlzY2FyZEJ1ZmZlcjogJXAiLCBtTmFtZSwgYnVmZmVyLmdldCgpKTsKKyAgICBib29sIHJlbGVhc2VkID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleGVkPElucHV0Pjo6TG9ja2VkIGlucHV0KG1JbnB1dCk7CisgICAgICAgIGlmIChpbnB1dC0+YnVmZmVycyAmJiBpbnB1dC0+YnVmZmVycy0+cmVsZWFzZUJ1ZmZlcihidWZmZXIsIG51bGxwdHIsIHRydWUpKSB7CisgICAgICAgICAgICByZWxlYXNlZCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPE91dHB1dD46OkxvY2tlZCBvdXRwdXQobU91dHB1dCk7CisgICAgICAgIGlmIChvdXRwdXQtPmJ1ZmZlcnMgJiYgb3V0cHV0LT5idWZmZXJzLT5yZWxlYXNlQnVmZmVyKGJ1ZmZlciwgbnVsbHB0cikpIHsKKyAgICAgICAgICAgIHJlbGVhc2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAocmVsZWFzZWQpIHsKKyAgICAgICAgc2VuZE91dHB1dEJ1ZmZlcnMoKTsKKyAgICAgICAgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGUoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRCgiWyVzXSBNZWRpYUNvZGVjIGRpc2NhcmRlZCBhbiB1bmtub3duIGJ1ZmZlciIsIG1OYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OmdldElucHV0QnVmZmVyQXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIHsKKyAgICBhcnJheS0+Y2xlYXIoKTsKKyAgICBNdXRleGVkPElucHV0Pjo6TG9ja2VkIGlucHV0KG1JbnB1dCk7CisKKyAgICBpZiAoIWlucHV0LT5idWZmZXJzLT5pc0FycmF5TW9kZSgpKSB7CisgICAgICAgIGlucHV0LT5idWZmZXJzID0gaW5wdXQtPmJ1ZmZlcnMtPnRvQXJyYXlNb2RlKGlucHV0LT5udW1TbG90cyk7CisgICAgfQorCisgICAgaW5wdXQtPmJ1ZmZlcnMtPmdldEFycmF5KGFycmF5KTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpnZXRPdXRwdXRCdWZmZXJBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgeworICAgIGFycmF5LT5jbGVhcigpOworICAgIE11dGV4ZWQ8T3V0cHV0Pjo6TG9ja2VkIG91dHB1dChtT3V0cHV0KTsKKworICAgIGlmICghb3V0cHV0LT5idWZmZXJzLT5pc0FycmF5TW9kZSgpKSB7CisgICAgICAgIG91dHB1dC0+YnVmZmVycyA9IG91dHB1dC0+YnVmZmVycy0+dG9BcnJheU1vZGUob3V0cHV0LT5udW1TbG90cyk7CisgICAgfQorCisgICAgb3V0cHV0LT5idWZmZXJzLT5nZXRBcnJheShhcnJheSk7Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnN0YXJ0KAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmlucHV0Rm9ybWF0LCBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCkgeworICAgIEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6OmlucHV0IGlTdHJlYW1Gb3JtYXQoMHUpOworICAgIEMyU3RyZWFtQnVmZmVyVHlwZVNldHRpbmc6Om91dHB1dCBvU3RyZWFtRm9ybWF0KDB1KTsKKyAgICBDMlBvcnRSZW9yZGVyQnVmZmVyRGVwdGhUdW5pbmc6Om91dHB1dCByZW9yZGVyRGVwdGg7CisgICAgQzJQb3J0UmVvcmRlcktleVNldHRpbmc6Om91dHB1dCByZW9yZGVyS2V5OworICAgIEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjppbnB1dCBpbnB1dERlbGF5KDApOworICAgIEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQgb3V0cHV0RGVsYXkoMCk7CisgICAgQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nIHBpcGVsaW5lRGVsYXkoMCk7CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQ29tcG9uZW50LT5xdWVyeSgKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAmaVN0cmVhbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAmb1N0cmVhbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAmcmVvcmRlckRlcHRoLAorICAgICAgICAgICAgICAgICZyZW9yZGVyS2V5LAorICAgICAgICAgICAgICAgICZpbnB1dERlbGF5LAorICAgICAgICAgICAgICAgICZwaXBlbGluZURlbGF5LAorICAgICAgICAgICAgICAgICZvdXRwdXREZWxheSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7fSwKKyAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICBudWxscHRyKTsKKyAgICBpZiAoZXJyID09IEMyX0JBRF9JTkRFWCkgeworICAgICAgICBpZiAoIWlTdHJlYW1Gb3JtYXQgfHwgIW9TdHJlYW1Gb3JtYXQpIHsKKyAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleGVkPFJlb3JkZXJTdGFzaD46OkxvY2tlZCByZW9yZGVyKG1SZW9yZGVyU3Rhc2gpOworICAgICAgICByZW9yZGVyLT5jbGVhcigpOworICAgICAgICBpZiAocmVvcmRlckRlcHRoKSB7CisgICAgICAgICAgICByZW9yZGVyLT5zZXREZXB0aChyZW9yZGVyRGVwdGgudmFsdWUpOworICAgICAgICB9CisgICAgICAgIGlmIChyZW9yZGVyS2V5KSB7CisgICAgICAgICAgICByZW9yZGVyLT5zZXRLZXkocmVvcmRlcktleS52YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB1aW50MzJfdCBpbnB1dERlbGF5VmFsdWUgPSBpbnB1dERlbGF5ID8gaW5wdXREZWxheS52YWx1ZSA6IDA7CisgICAgdWludDMyX3QgcGlwZWxpbmVEZWxheVZhbHVlID0gcGlwZWxpbmVEZWxheSA/IHBpcGVsaW5lRGVsYXkudmFsdWUgOiAwOworICAgIHVpbnQzMl90IG91dHB1dERlbGF5VmFsdWUgPSBvdXRwdXREZWxheSA/IG91dHB1dERlbGF5LnZhbHVlIDogMDsKKworICAgIHNpemVfdCBudW1JbnB1dFNsb3RzID0gaW5wdXREZWxheVZhbHVlICsgcGlwZWxpbmVEZWxheVZhbHVlICsga1Ntb290aG5lc3NGYWN0b3I7CisgICAgc2l6ZV90IG51bU91dHB1dFNsb3RzID0gb3V0cHV0RGVsYXlWYWx1ZSArIGtTbW9vdGhuZXNzRmFjdG9yOworCisgICAgLy8gVE9ETzogZ2V0IHRoaXMgZnJvbSBpbnB1dCBmb3JtYXQKKyAgICBib29sIHNlY3VyZSA9IG1Db21wb25lbnQtPmdldE5hbWUoKS5maW5kKCIuc2VjdXJlIikgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gYWxsb2NhdG9yU3RvcmUgPSBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgaW50IHBvb2xNYXNrID0gcHJvcGVydHlfZ2V0X2ludDMyKAorICAgICAgICAgICAgImRlYnVnLnN0YWdlZnJpZ2h0LmMyLXBvb2xtYXNrIiwKKyAgICAgICAgICAgIDEgPDwgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT04gfAorICAgICAgICAgICAgMSA8PCBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFKTsKKworICAgIGlmIChpbnB1dEZvcm1hdCAhPSBudWxscHRyKSB7CisgICAgICAgIGJvb2wgZ3JhcGhpYyA9IChpU3RyZWFtRm9ybWF0LnZhbHVlID09IEMyQnVmZmVyRGF0YTo6R1JBUEhJQyk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcG9vbDsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxCbG9ja1Bvb2xzPjo6TG9ja2VkIHBvb2xzKG1CbG9ja1Bvb2xzKTsKKworICAgICAgICAgICAgLy8gc2V0IGRlZmF1bHQgYWxsb2NhdG9yIElELgorICAgICAgICAgICAgcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQgPSAoZ3JhcGhpYykgPyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT047CisKKyAgICAgICAgICAgIC8vIHF1ZXJ5IEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0IGZyb20gY29tcG9uZW50LiBJZiBhbiBhbGxvY2F0b3IgSUQgaXMgb2J0YWluZWQKKyAgICAgICAgICAgIC8vIGZyb20gY29tcG9uZW50LCBjcmVhdGUgdGhlIGlucHV0IGJsb2NrIHBvb2wgd2l0aCBnaXZlbiBJRC4gT3RoZXJ3aXNlLCB1c2UgZGVmYXVsdCBJRHMuCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEMyX0RPTlRfQkxPQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgICAgIGlmICgoZXJyICE9IEMyX09LICYmIGVyciAhPSBDMl9CQURfSU5ERVgpIHx8IHBhcmFtcy5zaXplKCkgIT0gMSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIFF1ZXJ5IGlucHV0IGFsbG9jYXRvcnMgcmV0dXJuZWQgJXp1IHBhcmFtcyA9PiAlcyAoJXUpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwYXJhbXMuc2l6ZSgpLCBhc1N0cmluZyhlcnIpLCBlcnIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gQzJfT0sgJiYgcGFyYW1zLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6aW5wdXQgKmlucHV0QWxsb2NhdG9ycyA9CisgICAgICAgICAgICAgICAgICAgIEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6OmlucHV0OjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICAgICAgaWYgKGlucHV0QWxsb2NhdG9ycyAmJiBpbnB1dEFsbG9jYXRvcnMtPmZsZXhDb3VudCgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGFsbG9jYXRvciBJRHMgYW5kIHJlc29sdmUgZGVmYXVsdCBhbGxvY2F0b3IKKyAgICAgICAgICAgICAgICAgICAgYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKGlucHV0QWxsb2NhdG9ycy0+bS52YWx1ZXNbMF0sICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb2NhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwb29scy0+aW5wdXRBbGxvY2F0b3JJZCA9IGFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIGNvbXBvbmVudCByZXF1ZXN0ZWQgaW52YWxpZCBpbnB1dCBhbGxvY2F0b3IgSUQgJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgaW5wdXRBbGxvY2F0b3JzLT5tLnZhbHVlc1swXSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE86IHVzZSBDMkNvbXBvbmVudCB3cmFwcGVyIHRvIGFzc29jaWF0ZSB0aGlzIHBvb2wgd2l0aCBvdXJzZWx2ZXMKKyAgICAgICAgICAgIGlmICgocG9vbE1hc2sgPj4gcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQpICYgMSkgeworICAgICAgICAgICAgICAgIGVyciA9IENyZWF0ZUNvZGVjMkJsb2NrUG9vbChwb29scy0+aW5wdXRBbGxvY2F0b3JJZCwgbnVsbHB0ciwgJnBvb2wpOworICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIENyZWF0ZWQgaW5wdXQgYmxvY2sgcG9vbCB3aXRoIGFsbG9jYXRvcklEICV1ID0+IHBvb2xJRCAlbGx1IC0gJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcG9vbHMtPmlucHV0QWxsb2NhdG9ySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKShwb29sID8gcG9vbC0+Z2V0TG9jYWxJZCgpIDogMTExMDAwMTExKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFzU3RyaW5nKGVyciksIGVycik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGVyciA9IEMyX05PVF9GT1VORDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBpbnB1dFBvb2xJZCA9CisgICAgICAgICAgICAgICAgICAgIGdyYXBoaWMgPyBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQyA6IEMyQmxvY2tQb29sOjpCQVNJQ19MSU5FQVI7CisgICAgICAgICAgICAgICAgZXJyID0gR2V0Q29kZWMyQmxvY2tQb29sKGlucHV0UG9vbElkLCBudWxscHRyLCAmcG9vbCk7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gVXNpbmcgYmFzaWMgaW5wdXQgYmxvY2sgcG9vbCB3aXRoIHBvb2xJRCAlbGx1ID0+IGdvdCAlbGx1IC0gJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgKHVuc2lnbmVkIGxvbmcgbG9uZylpbnB1dFBvb2xJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpKHBvb2wgPyBwb29sLT5nZXRMb2NhbElkKCkgOiAxMTEwMDAxMTEpLAorICAgICAgICAgICAgICAgICAgICAgICAgYXNTdHJpbmcoZXJyKSwgZXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9vbHMtPmlucHV0UG9vbCA9IHBvb2w7CisgICAgICAgIH0KKworICAgICAgICBib29sIGZvcmNlQXJyYXlNb2RlID0gZmFsc2U7CisgICAgICAgIE11dGV4ZWQ8SW5wdXQ+OjpMb2NrZWQgaW5wdXQobUlucHV0KTsKKyAgICAgICAgaW5wdXQtPmlucHV0RGVsYXkgPSBpbnB1dERlbGF5VmFsdWU7CisgICAgICAgIGlucHV0LT5waXBlbGluZURlbGF5ID0gcGlwZWxpbmVEZWxheVZhbHVlOworICAgICAgICBpbnB1dC0+bnVtU2xvdHMgPSBudW1JbnB1dFNsb3RzOworICAgICAgICBpbnB1dC0+ZXh0cmFCdWZmZXJzLmZsdXNoKCk7CisgICAgICAgIGlucHV0LT5udW1FeHRyYVNsb3RzID0gMHU7CisgICAgICAgIGlmIChncmFwaGljKSB7CisgICAgICAgICAgICBpZiAobUlucHV0U3VyZmFjZSkgeworICAgICAgICAgICAgICAgIGlucHV0LT5idWZmZXJzLnJlc2V0KG5ldyBEdW1teUlucHV0QnVmZmVycyhtTmFtZSkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtTWV0YU1vZGUgPT0gTU9ERV9BTlcpIHsKKyAgICAgICAgICAgICAgICBpbnB1dC0+YnVmZmVycy5yZXNldChuZXcgR3JhcGhpY01ldGFkYXRhSW5wdXRCdWZmZXJzKG1OYW1lKSk7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0byBlbnN1cmUgYnVmZmVycyBkbyBub3QgZ2V0IHJlbGVhc2VkIHByZW1hdHVyZWx5LgorICAgICAgICAgICAgICAgIC8vIFRPRE86IGhhbmRsZSB0aGlzIHdpdGhvdXQgZ29pbmcgaW50byBhcnJheSBtb2RlCisgICAgICAgICAgICAgICAgZm9yY2VBcnJheU1vZGUgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnB1dC0+YnVmZmVycy5yZXNldChuZXcgR3JhcGhpY0lucHV0QnVmZmVycyhudW1JbnB1dFNsb3RzLCBtTmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKGhhc0NyeXB0b09yRGVzY3JhbWJsZXIoKSkgeworICAgICAgICAgICAgICAgIGludDMyX3QgY2FwYWNpdHkgPSBrTGluZWFyQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgICAgICAodm9pZClpbnB1dEZvcm1hdC0+ZmluZEludDMyKEtFWV9NQVhfSU5QVVRfU0laRSwgJmNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICBpZiAoKHNpemVfdCljYXBhY2l0eSA+IGtNYXhMaW5lYXJCdWZmZXJTaXplKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJjbGllbnQgcmVxdWVzdGVkICVkLCBjYXBwZWQgdG8gJXp1IiwgY2FwYWNpdHksIGtNYXhMaW5lYXJCdWZmZXJTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHkgPSBrTWF4TGluZWFyQnVmZmVyU2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1EZWFsZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBtRGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbihjYXBhY2l0eSwgTWVtb3J5RGVhbGVyOjpnZXRBbGxvY2F0aW9uQWxpZ25tZW50KCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKG51bUlucHV0U2xvdHMgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRW5jcnlwdGVkTGluZWFySW5wdXRCdWZmZXJzIik7CisgICAgICAgICAgICAgICAgICAgIG1EZWNyeXB0RGVzdGluYXRpb24gPSBtRGVhbGVyLT5hbGxvY2F0ZSgoc2l6ZV90KWNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1DcnlwdG8gIT0gbnVsbHB0ciAmJiBtSGVhcFNlcU51bSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbUhlYXBTZXFOdW0gPSBtQ3J5cHRvLT5zZXRIZWFwKG1EZWFsZXItPmdldE1lbW9yeUhlYXAoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbUhlYXBTZXFOdW0gPSAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW5wdXQtPmJ1ZmZlcnMucmVzZXQobmV3IEVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVycygKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlY3VyZSwgbURlYWxlciwgbUNyeXB0bywgbUhlYXBTZXFOdW0sIChzaXplX3QpY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICBudW1JbnB1dFNsb3RzLCBtTmFtZSkpOworICAgICAgICAgICAgICAgIGZvcmNlQXJyYXlNb2RlID0gdHJ1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5wdXQtPmJ1ZmZlcnMucmVzZXQobmV3IExpbmVhcklucHV0QnVmZmVycyhtTmFtZSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlucHV0LT5idWZmZXJzLT5zZXRGb3JtYXQoaW5wdXRGb3JtYXQpOworCisgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIGlucHV0LT5idWZmZXJzLT5zZXRQb29sKHBvb2wpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gVE9ETzogZXJyb3IKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmb3JjZUFycmF5TW9kZSkgeworICAgICAgICAgICAgaW5wdXQtPmJ1ZmZlcnMgPSBpbnB1dC0+YnVmZmVycy0+dG9BcnJheU1vZGUobnVtSW5wdXRTbG90cyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3V0cHV0Rm9ybWF0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gb3V0cHV0U3VyZmFjZTsKKyAgICAgICAgdWludDMyX3Qgb3V0cHV0R2VuZXJhdGlvbjsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7CisgICAgICAgICAgICBvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzID0gbnVtT3V0cHV0U2xvdHMgKworICAgICAgICAgICAgICAgICAgICByZW9yZGVyRGVwdGgudmFsdWUgKyBrUmVuZGVyaW5nRGVwdGg7CisgICAgICAgICAgICBpZiAoIXNlY3VyZSkgeworICAgICAgICAgICAgICAgIG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMgKz0gbnVtSW5wdXRTbG90czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dHB1dFN1cmZhY2UgPSBvdXRwdXQtPnN1cmZhY2UgPworICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPnN1cmZhY2UtPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSA6IG51bGxwdHI7CisgICAgICAgICAgICBpZiAob3V0cHV0U3VyZmFjZSkgeworICAgICAgICAgICAgICAgIG91dHB1dC0+c3VyZmFjZS0+c2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudChvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dHB1dEdlbmVyYXRpb24gPSBvdXRwdXQtPmdlbmVyYXRpb247CisgICAgICAgIH0KKworICAgICAgICBib29sIGdyYXBoaWMgPSAob1N0cmVhbUZvcm1hdC52YWx1ZSA9PSBDMkJ1ZmZlckRhdGE6OkdSQVBISUMpOworICAgICAgICBDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBvdXRwdXRQb29sSWRfOworCisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8QmxvY2tQb29scz46OkxvY2tlZCBwb29scyhtQmxvY2tQb29scyk7CisKKyAgICAgICAgICAgIC8vIHNldCBkZWZhdWx0IGFsbG9jYXRvciBJRC4KKyAgICAgICAgICAgIHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCA9IChncmFwaGljKSA/IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT047CisKKyAgICAgICAgICAgIC8vIHF1ZXJ5IEMyUG9ydEFsbG9jYXRvcnNUdW5pbmc6Om91dHB1dCBmcm9tIGNvbXBvbmVudCwgb3IgdXNlIGRlZmF1bHQgYWxsb2NhdG9yIGlmCisgICAgICAgICAgICAvLyB1bnN1Y2Nlc3NmdWwuCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgQzJQb3J0QWxsb2NhdG9yc1R1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBhcmFtcyk7CisgICAgICAgICAgICBpZiAoKGVyciAhPSBDMl9PSyAmJiBlcnIgIT0gQzJfQkFEX0lOREVYKSB8fCBwYXJhbXMuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBRdWVyeSBvdXRwdXQgYWxsb2NhdG9ycyByZXR1cm5lZCAlenUgcGFyYW1zID0+ICVzICgldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHBhcmFtcy5zaXplKCksIGFzU3RyaW5nKGVyciksIGVycik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBDMl9PSyAmJiBwYXJhbXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgICAgICAgICBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjpvdXRwdXQgKm91dHB1dEFsbG9jYXRvcnMgPQorICAgICAgICAgICAgICAgICAgICBDMlBvcnRBbGxvY2F0b3JzVHVuaW5nOjpvdXRwdXQ6OkZyb20ocGFyYW1zWzBdLmdldCgpKTsKKyAgICAgICAgICAgICAgICBpZiAob3V0cHV0QWxsb2NhdG9ycyAmJiBvdXRwdXRBbGxvY2F0b3JzLT5mbGV4Q291bnQoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3I7CisgICAgICAgICAgICAgICAgICAgIC8vIHZlcmlmeSBhbGxvY2F0b3IgSURzIGFuZCByZXNvbHZlIGRlZmF1bHQgYWxsb2NhdG9yCisgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcihvdXRwdXRBbGxvY2F0b3JzLT5tLnZhbHVlc1swXSwgJmFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgICAgIGlmIChhbGxvY2F0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCA9IGFsbG9jYXRvci0+Z2V0SWQoKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIGNvbXBvbmVudCByZXF1ZXN0ZWQgaW52YWxpZCBvdXRwdXQgYWxsb2NhdG9yIElEICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIG91dHB1dEFsbG9jYXRvcnMtPm0udmFsdWVzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gdXNlIGJ1ZmZlcnF1ZXVlIGlmIG91dHB1dHRpbmcgdG8gYSBzdXJmYWNlLgorICAgICAgICAgICAgLy8gcXVlcnkgQzJQb3J0U3VyZmFjZUFsbG9jYXRvclR1bmluZzo6b3V0cHV0IGZyb20gY29tcG9uZW50LCBvciB1c2UgZGVmYXVsdCBhbGxvY2F0b3IKKyAgICAgICAgICAgIC8vIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgICAgICAgICAgIGlmIChvdXRwdXRTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+cXVlcnkoeyB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgQzJQb3J0U3VyZmFjZUFsbG9jYXRvclR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfRE9OVF9CTE9DSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zKTsKKyAgICAgICAgICAgICAgICBpZiAoKGVyciAhPSBDMl9PSyAmJiBlcnIgIT0gQzJfQkFEX0lOREVYKSB8fCBwYXJhbXMuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gUXVlcnkgb3V0cHV0IHN1cmZhY2UgYWxsb2NhdG9yIHJldHVybmVkICV6dSBwYXJhbXMgPT4gJXMgKCV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIHBhcmFtcy5zaXplKCksIGFzU3RyaW5nKGVyciksIGVycik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gQzJfT0sgJiYgcGFyYW1zLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIEMyUG9ydFN1cmZhY2VBbGxvY2F0b3JUdW5pbmc6Om91dHB1dCAqc3VyZmFjZUFsbG9jYXRvciA9CisgICAgICAgICAgICAgICAgICAgICAgICBDMlBvcnRTdXJmYWNlQWxsb2NhdG9yVHVuaW5nOjpvdXRwdXQ6OkZyb20ocGFyYW1zWzBdLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1cmZhY2VBbGxvY2F0b3IpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmVyaWZ5IGFsbG9jYXRvciBJRHMgYW5kIHJlc29sdmUgZGVmYXVsdCBhbGxvY2F0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcihzdXJmYWNlQWxsb2NhdG9yLT52YWx1ZSwgJmFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWxsb2NhdG9yKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9vbHMtPm91dHB1dEFsbG9jYXRvcklkID0gYWxsb2NhdG9yLT5nZXRJZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBjb21wb25lbnQgcmVxdWVzdGVkIGludmFsaWQgc3VyZmFjZSBvdXRwdXQgYWxsb2NhdG9yIElEICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBzdXJmYWNlQWxsb2NhdG9yLT52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQgPT0gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBlcnIgIT0gQzJfT0sKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICgocG9vbE1hc2sgPj4gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpCVUZGRVJRVUVVRSkgJiAxKSkgeworICAgICAgICAgICAgICAgICAgICBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQgPSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKChwb29sTWFzayA+PiBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQpICYgMSkgeworICAgICAgICAgICAgICAgIGVyciA9IG1Db21wb25lbnQtPmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvb2xzLT5vdXRwdXRBbGxvY2F0b3JJZCwgJnBvb2xzLT5vdXRwdXRQb29sSWQsICZwb29scy0+b3V0cHV0UG9vbEludGYpOworICAgICAgICAgICAgICAgIEFMT0dJKCJbJXNdIENyZWF0ZWQgb3V0cHV0IGJsb2NrIHBvb2wgd2l0aCBhbGxvY2F0b3JJRCAldSA9PiBwb29sSUQgJWxsdSAtICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBwb29scy0+b3V0cHV0QWxsb2NhdG9ySWQsCisgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKXBvb2xzLT5vdXRwdXRQb29sSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXJyID0gQzJfTk9UX0ZPVU5EOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIC8vIHVzZSBiYXNpYyBwb29sIGluc3RlYWQKKyAgICAgICAgICAgICAgICBwb29scy0+b3V0cHV0UG9vbElkID0KKyAgICAgICAgICAgICAgICAgICAgZ3JhcGhpYyA/IEMyQmxvY2tQb29sOjpCQVNJQ19HUkFQSElDIDogQzJCbG9ja1Bvb2w6OkJBU0lDX0xJTkVBUjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gQ29uZmlndXJlIG91dHB1dCBibG9jayBwb29sIElEIGFzIHBhcmFtZXRlciBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQgdG8KKyAgICAgICAgICAgIC8vIGNvbXBvbmVudC4KKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ+IHBvb2xJZHNUdW5pbmcgPQorICAgICAgICAgICAgICAgICAgICBDMlBvcnRCbG9ja1Bvb2xzVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKHsgcG9vbHMtPm91dHB1dFBvb2xJZCB9KTsKKworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICAgICAgZXJyID0gbUNvbXBvbmVudC0+Y29uZmlnKHsgcG9vbElkc1R1bmluZy5nZXQoKSB9LCBDMl9NQVlfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBDb25maWd1cmVkIG91dHB1dCBibG9jayBwb29sIGlkcyAlbGx1ID0+ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgbU5hbWUsICh1bnNpZ25lZCBsb25nIGxvbmcpcG9vbElkc1R1bmluZy0+bS52YWx1ZXNbMF0sIGFzU3RyaW5nKGVycikpOworICAgICAgICAgICAgb3V0cHV0UG9vbElkXyA9IHBvb2xzLT5vdXRwdXRQb29sSWQ7CisgICAgICAgIH0KKworICAgICAgICBNdXRleGVkPE91dHB1dD46OkxvY2tlZCBvdXRwdXQobU91dHB1dCk7CisgICAgICAgIG91dHB1dC0+b3V0cHV0RGVsYXkgPSBvdXRwdXREZWxheVZhbHVlOworICAgICAgICBvdXRwdXQtPm51bVNsb3RzID0gbnVtT3V0cHV0U2xvdHM7CisgICAgICAgIGlmIChncmFwaGljKSB7CisgICAgICAgICAgICBpZiAob3V0cHV0U3VyZmFjZSkgeworICAgICAgICAgICAgICAgIG91dHB1dC0+YnVmZmVycy5yZXNldChuZXcgR3JhcGhpY091dHB1dEJ1ZmZlcnMobU5hbWUpKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgb3V0cHV0LT5idWZmZXJzLnJlc2V0KG5ldyBSYXdHcmFwaGljT3V0cHV0QnVmZmVycyhudW1PdXRwdXRTbG90cywgbU5hbWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG91dHB1dC0+YnVmZmVycy5yZXNldChuZXcgTGluZWFyT3V0cHV0QnVmZmVycyhtTmFtZSkpOworICAgICAgICB9CisgICAgICAgIG91dHB1dC0+YnVmZmVycy0+c2V0Rm9ybWF0KG91dHB1dEZvcm1hdCk7CisKKworICAgICAgICAvLyBUcnkgdG8gc2V0IG91dHB1dCBzdXJmYWNlIHRvIGNyZWF0ZWQgYmxvY2sgcG9vbCBpZiBnaXZlbi4KKyAgICAgICAgaWYgKG91dHB1dFN1cmZhY2UpIHsKKyAgICAgICAgICAgIG1Db21wb25lbnQtPnNldE91dHB1dFN1cmZhY2UoCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFBvb2xJZF8sCisgICAgICAgICAgICAgICAgICAgIG91dHB1dFN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEdlbmVyYXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG9TdHJlYW1Gb3JtYXQudmFsdWUgPT0gQzJCdWZmZXJEYXRhOjpMSU5FQVIKKyAgICAgICAgICAgICAgICAmJiBtQ29tcG9uZW50TmFtZS5maW5kKCJjMi5xdGkuIikgPT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgIC8vIFdPUktBUk9VTkQ6IGlmIHdlJ3JlIHVzaW5nIGVhcmx5IENTRCB3b3JrYXJvdW5kIHdlIGNvbnZlcnQgdG8KKyAgICAgICAgICAgIC8vICAgICAgICAgICAgIGFycmF5IG1vZGUsIHRvIGFwcGVhc2UgYXBwcyBhc3N1bWluZyB0aGUgb3V0cHV0CisgICAgICAgICAgICAvLyAgICAgICAgICAgICBidWZmZXJzIHRvIGJlIG9mIHRoZSBzYW1lIHNpemUuCisgICAgICAgICAgICBvdXRwdXQtPmJ1ZmZlcnMgPSBvdXRwdXQtPmJ1ZmZlcnMtPnRvQXJyYXlNb2RlKG51bU91dHB1dFNsb3RzKTsKKworICAgICAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQ7CisgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisgICAgICAgICAgICBpZiAob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX0NIQU5ORUxfQ09VTlQsICZjaGFubmVsQ291bnQpCisgICAgICAgICAgICAgICAgICAgICYmIG91dHB1dEZvcm1hdC0+ZmluZEludDMyKEtFWV9TQU1QTEVfUkFURSwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBkZWxheSA9IDA7CisgICAgICAgICAgICAgICAgaW50MzJfdCBwYWRkaW5nID0gMDs7CisgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiZW5jb2Rlci1kZWxheSIsICZkZWxheSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsYXkgPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJlbmNvZGVyLXBhZGRpbmciLCAmcGFkZGluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFkZGluZyA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChkZWxheSB8fCBwYWRkaW5nKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgd3JpdGUgYWNjZXNzIHRvIHRoZSBidWZmZXJzLCBhbmQgd2UncmUgYWxyZWFkeSBpbgorICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBtb2RlLgorICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPmJ1ZmZlcnMtPmluaXRTa2lwQ3V0QnVmZmVyKGRlbGF5LCBwYWRkaW5nLCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNldCB1cCBwaXBlbGluZSBjb250cm9sLiBUaGlzIGhhcyB0byBiZSBkb25lIGFmdGVyIG1JbnB1dEJ1ZmZlcnMgYW5kCisgICAgLy8gbU91dHB1dEJ1ZmZlcnMgYXJlIGluaXRpYWxpemVkIHRvIG1ha2Ugc3VyZSB0aGF0IGxpbmdlcmluZyBjYWxsYmFja3MKKyAgICAvLyBhYm91dCBidWZmZXJzIGZyb20gdGhlIHByZXZpb3VzIGdlbmVyYXRpb24gZG8gbm90IGludGVyZmVyZSB3aXRoIHRoZQorICAgIC8vIG5ld2x5IGluaXRpYWxpemVkIHBpcGVsaW5lIGNhcGFjaXR5LgorCisgICAgeworICAgICAgICBNdXRleGVkPFBpcGVsaW5lV2F0Y2hlcj46OkxvY2tlZCB3YXRjaGVyKG1QaXBlbGluZVdhdGNoZXIpOworICAgICAgICB3YXRjaGVyLT5pbnB1dERlbGF5KGlucHV0RGVsYXlWYWx1ZSkKKyAgICAgICAgICAgICAgICAucGlwZWxpbmVEZWxheShwaXBlbGluZURlbGF5VmFsdWUpCisgICAgICAgICAgICAgICAgLm91dHB1dERlbGF5KG91dHB1dERlbGF5VmFsdWUpCisgICAgICAgICAgICAgICAgLnNtb290aG5lc3NGYWN0b3Ioa1Ntb290aG5lc3NGYWN0b3IpOworICAgICAgICB3YXRjaGVyLT5mbHVzaCgpOworICAgIH0KKworICAgIG1JbnB1dE1ldEVvcyA9IGZhbHNlOworICAgIG1TeW5jLnN0YXJ0KCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNCdWZmZXJDaGFubmVsOjpyZXF1ZXN0SW5pdGlhbElucHV0QnVmZmVycygpIHsKKyAgICBpZiAobUlucHV0U3VyZmFjZSkgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZzo6b3V0cHV0IG9TdHJlYW1Gb3JtYXQoMHUpOworICAgIGMyX3N0YXR1c190IGVyciA9IG1Db21wb25lbnQtPnF1ZXJ5KHsgJm9TdHJlYW1Gb3JtYXQgfSwge30sIEMyX0RPTlRfQkxPQ0ssIG51bGxwdHIpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorICAgIHNpemVfdCBudW1JbnB1dFNsb3RzID0gbUlucHV0LmxvY2soKS0+bnVtU2xvdHM7CisgICAgc3RkOjp2ZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+IHRvQmVRdWV1ZWQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1JbnB1dFNsb3RzOyArK2kpIHsKKyAgICAgICAgc2l6ZV90IGluZGV4OworICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXI7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4ZWQ8SW5wdXQ+OjpMb2NrZWQgaW5wdXQobUlucHV0KTsKKyAgICAgICAgICAgIGlmICghaW5wdXQtPmJ1ZmZlcnMtPnJlcXVlc3ROZXdCdWZmZXIoJmluZGV4LCAmYnVmZmVyKSkgeworICAgICAgICAgICAgICAgIGlmIChpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIlslc10gc3RhcnQ6IGNhbm5vdCBhbGxvY2F0ZSBtZW1vcnkgYXQgYWxsIiwgbU5hbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIHN0YXJ0OiBjYW5ub3QgYWxsb2NhdGUgbWVtb3J5LCBvbmx5ICV6dSBidWZmZXJzIGFsbG9jYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIGkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICBNdXRleGVkPHN0ZDo6bGlzdDxzcDxBQnVmZmVyPj4+OjpMb2NrZWQgY29uZmlncyhtRmx1c2hlZENvbmZpZ3MpOworICAgICAgICAgICAgQUxPR1YoIlslc10gaW5wdXQgYnVmZmVyICV6dSBhdmFpbGFibGUiLCBtTmFtZSwgaW5kZXgpOworICAgICAgICAgICAgYm9vbCBwb3N0ID0gdHJ1ZTsKKyAgICAgICAgICAgIGlmICghY29uZmlncy0+ZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNvbmZpZyA9IGNvbmZpZ3MtPmZyb250KCk7CisgICAgICAgICAgICAgICAgY29uZmlncy0+cG9wX2Zyb250KCk7CisgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlci0+Y2FwYWNpdHkoKSA+PSBjb25maWctPnNpemUoKSkgeworICAgICAgICAgICAgICAgICAgICBtZW1jcHkoYnVmZmVyLT5iYXNlKCksIGNvbmZpZy0+ZGF0YSgpLCBjb25maWctPnNpemUoKSk7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0UmFuZ2UoMCwgY29uZmlnLT5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgcG9zdCA9IGZhbHNlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIGJ1ZmZlciBjYXBhY2l0eSB0b28gc21hbGwgZm9yIHRoZSBjb25maWcgKCV6dSA8ICV6dSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBidWZmZXItPmNhcGFjaXR5KCksIGNvbmZpZy0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG9TdHJlYW1Gb3JtYXQudmFsdWUgPT0gQzJCdWZmZXJEYXRhOjpMSU5FQVIgJiYgaSA9PSAwCisgICAgICAgICAgICAgICAgICAgICYmIG1Db21wb25lbnROYW1lLmZpbmQoImMyLnF0aS4iKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgIC8vIFdPUktBUk9VTkQ6IFNvbWUgYXBwcyBleHBlY3QgQ1NEIGF2YWlsYWJsZSB3aXRob3V0IHF1ZXVlaW5nCisgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgYW55IGlucHV0LiBRdWV1ZSBhbiBlbXB0eSBidWZmZXIgdG8gZ2V0IHRoZSBDU0QuCisgICAgICAgICAgICAgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+Y2xlYXIoKTsKKyAgICAgICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOworICAgICAgICAgICAgICAgIHBvc3QgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwb3N0KSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLT5vbklucHV0QnVmZmVyQXZhaWxhYmxlKGluZGV4LCBidWZmZXIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0b0JlUXVldWVkLmVtcGxhY2VfYmFjayhidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciA6IHRvQmVRdWV1ZWQpIHsKKyAgICAgICAgaWYgKHF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChidWZmZXIpICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBFcnJvciB3aGlsZSBxdWV1ZWluZyBpbml0aWFsIGJ1ZmZlcnMiLCBtTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OnN0b3AoKSB7CisgICAgbVN5bmMuc3RvcCgpOworICAgIG1GaXJzdFZhbGlkRnJhbWVJbmRleCA9IG1GcmFtZUluZGV4LmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgaWYgKG1JbnB1dFN1cmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICBtSW5wdXRTdXJmYWNlLnJlc2V0KCk7CisgICAgfQorfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6OmZsdXNoKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSB7CisgICAgQUxPR1YoIlslc10gZmx1c2giLCBtTmFtZSk7CisgICAgeworICAgICAgICBNdXRleGVkPHN0ZDo6bGlzdDxzcDxBQnVmZmVyPj4+OjpMb2NrZWQgY29uZmlncyhtRmx1c2hlZENvbmZpZ3MpOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+ICZ3b3JrIDogZmx1c2hlZFdvcmspIHsKKyAgICAgICAgICAgIGlmICghKHdvcmstPmlucHV0LmZsYWdzICYgQzJGcmFtZURhdGE6OkZMQUdfQ09ERUNfQ09ORklHKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHdvcmstPmlucHV0LmJ1ZmZlcnMuZW1wdHkoKQorICAgICAgICAgICAgICAgICAgICB8fCB3b3JrLT5pbnB1dC5idWZmZXJzLmZyb250KCktPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gbm8gbGluZWFyIGNvZGVjIGNvbmZpZyBkYXRhIGZvdW5kIiwgbU5hbWUpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJSZWFkVmlldyB2aWV3ID0KKyAgICAgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5mcm9udCgpLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuZnJvbnQoKS5tYXAoKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBmYWlsZWQgdG8gbWFwIGZsdXNoZWQgY29kZWMgY29uZmlnIGRhdGE6ICVkIiwgbU5hbWUsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb25maWdzLT5wdXNoX2JhY2soQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KHZpZXcuZGF0YSgpLCB2aWV3LmNhcGFjaXR5KCkpKTsKKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIHN0YXNoZWQgZmx1c2hlZCBjb2RlYyBjb25maWcgZGF0YSAoc2l6ZT0ldSkiLCBtTmFtZSwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB7CisgICAgICAgIE11dGV4ZWQ8SW5wdXQ+OjpMb2NrZWQgaW5wdXQobUlucHV0KTsKKyAgICAgICAgaW5wdXQtPmJ1ZmZlcnMtPmZsdXNoKCk7CisgICAgICAgIGlucHV0LT5leHRyYUJ1ZmZlcnMuZmx1c2goKTsKKyAgICB9CisgICAgeworICAgICAgICBNdXRleGVkPE91dHB1dD46OkxvY2tlZCBvdXRwdXQobU91dHB1dCk7CisgICAgICAgIG91dHB1dC0+YnVmZmVycy0+Zmx1c2goZmx1c2hlZFdvcmspOworICAgIH0KKyAgICBtUmVvcmRlclN0YXNoLmxvY2soKS0+Zmx1c2goKTsKKyAgICBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+Zmx1c2goKTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpvbldvcmtEb25lKAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPiB3b3JrLCBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCwKKyAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqaW5pdERhdGEpIHsKKyAgICBpZiAoaGFuZGxlV29yayhzdGQ6Om1vdmUod29yayksIG91dHB1dEZvcm1hdCwgaW5pdERhdGEpKSB7CisgICAgICAgIGZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlKCk7CisgICAgfQorfQorCit2b2lkIENDb2RlY0J1ZmZlckNoYW5uZWw6Om9uSW5wdXRCdWZmZXJEb25lKAorICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYXJyYXlJbmRleCkgeworICAgIGlmIChtSW5wdXRTdXJmYWNlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBidWZmZXIgPQorICAgICAgICAgICAgbVBpcGVsaW5lV2F0Y2hlci5sb2NrKCktPm9uSW5wdXRCdWZmZXJSZWxlYXNlZChmcmFtZUluZGV4LCBhcnJheUluZGV4KTsKKyAgICBib29sIG5ld0lucHV0U2xvdEF2YWlsYWJsZTsKKyAgICB7CisgICAgICAgIE11dGV4ZWQ8SW5wdXQ+OjpMb2NrZWQgaW5wdXQobUlucHV0KTsKKyAgICAgICAgbmV3SW5wdXRTbG90QXZhaWxhYmxlID0gaW5wdXQtPmJ1ZmZlcnMtPmV4cGlyZUNvbXBvbmVudEJ1ZmZlcihidWZmZXIpOworICAgICAgICBpZiAoIW5ld0lucHV0U2xvdEF2YWlsYWJsZSkgeworICAgICAgICAgICAgKHZvaWQpaW5wdXQtPmV4dHJhQnVmZmVycy5leHBpcmVDb21wb25lbnRCdWZmZXIoYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAobmV3SW5wdXRTbG90QXZhaWxhYmxlKSB7CisgICAgICAgIGZlZWRJbnB1dEJ1ZmZlcklmQXZhaWxhYmxlKCk7CisgICAgfQorfQorCitib29sIENDb2RlY0J1ZmZlckNoYW5uZWw6OmhhbmRsZVdvcmsoCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmssCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAorICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICppbml0RGF0YSkgeworICAgIGlmIChvdXRwdXRGb3JtYXQgIT0gbnVsbHB0cikgeworICAgICAgICBNdXRleGVkPE91dHB1dD46OkxvY2tlZCBvdXRwdXQobU91dHB1dCk7CisgICAgICAgIEFMT0dEKCJbJXNdIG9uV29ya0RvbmU6IG91dHB1dCBmb3JtYXQgY2hhbmdlZCB0byAlcyIsCisgICAgICAgICAgICAgICAgbU5hbWUsIG91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgb3V0cHV0LT5idWZmZXJzLT5zZXRGb3JtYXQob3V0cHV0Rm9ybWF0KTsKKworICAgICAgICBBU3RyaW5nIG1lZGlhVHlwZTsKKyAgICAgICAgaWYgKG91dHB1dEZvcm1hdC0+ZmluZFN0cmluZyhLRVlfTUlNRSwgJm1lZGlhVHlwZSkKKyAgICAgICAgICAgICAgICAmJiBtZWRpYVR5cGUgPT0gTUlNRVRZUEVfQVVESU9fUkFXKSB7CisgICAgICAgICAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMihLRVlfQ0hBTk5FTF9DT1VOVCwgJmNoYW5uZWxDb3VudCkKKyAgICAgICAgICAgICAgICAgICAgJiYgb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoS0VZX1NBTVBMRV9SQVRFLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBvdXRwdXQtPmJ1ZmZlcnMtPnVwZGF0ZVNraXBDdXRCdWZmZXIoc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgod29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4IC0gbUZpcnN0VmFsaWRGcmFtZUluZGV4LmxvYWQoKSkucGVlaygpIDwgMCkgeworICAgICAgICAvLyBEaXNjYXJkIGZyYW1lcyBmcm9tIHByZXZpb3VzIGdlbmVyYXRpb24uCisgICAgICAgIEFMT0dEKCJbJXNdIERpc2NhcmQgZnJhbWVzIGZyb20gcHJldmlvdXMgZ2VuZXJhdGlvbi4iLCBtTmFtZSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAobUlucHV0U3VyZmFjZSA9PSBudWxscHRyICYmICh3b3JrLT53b3JrbGV0cy5zaXplKCkgIT0gMXUKKyAgICAgICAgICAgIHx8ICF3b3JrLT53b3JrbGV0cy5mcm9udCgpCisgICAgICAgICAgICB8fCAhKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpKSkgeworICAgICAgICBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+b25Xb3JrRG9uZSh3b3JrLT5pbnB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSk7CisgICAgfQorCisgICAgaWYgKHdvcmstPnJlc3VsdCA9PSBDMl9OT1RfRk9VTkQpIHsKKyAgICAgICAgQUxPR0QoIlslc10gZmx1c2hlZCB3b3JrOyBpZ25vcmVkLiIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgaWYgKHdvcmstPnJlc3VsdCAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiWyVzXSB3b3JrIGZhaWxlZCB0byBjb21wbGV0ZTogJWQiLCBtTmFtZSwgd29yay0+cmVzdWx0KTsKKyAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbkVycm9yKHdvcmstPnJlc3VsdCwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTk9URTogTWVkaWFDb2RlYyB1c2FnZSBzdXBwb3NlZGx5IGhhdmUgb25seSBvbmUgd29ya2xldAorICAgIGlmICh3b3JrLT53b3JrbGV0cy5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgQUxPR0koIlslc10gb25Xb3JrRG9uZTogaW5jb3JyZWN0IG51bWJlciBvZiB3b3JrbGV0czogJXp1IiwKKyAgICAgICAgICAgICAgICBtTmFtZSwgd29yay0+d29ya2xldHMuc2l6ZSgpKTsKKyAgICAgICAgbUNDb2RlY0NhbGxiYWNrLT5vbkVycm9yKFVOS05PV05fRVJST1IsIEFDVElPTl9DT0RFX0ZBVEFMKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMldvcmtsZXQ+ICZ3b3JrbGV0ID0gd29yay0+d29ya2xldHMuZnJvbnQoKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyOworICAgIC8vIE5PVEU6IE1lZGlhQ29kZWMgdXNhZ2Ugc3VwcG9zZWRseSBoYXZlIG9ubHkgb25lIG91dHB1dCBzdHJlYW0uCisgICAgaWYgKHdvcmtsZXQtPm91dHB1dC5idWZmZXJzLnNpemUoKSA+IDF1KSB7CisgICAgICAgIEFMT0dJKCJbJXNdIG9uV29ya0RvbmU6IGluY29ycmVjdCBudW1iZXIgb2Ygb3V0cHV0IGJ1ZmZlcnM6ICV6dSIsCisgICAgICAgICAgICAgICAgbU5hbWUsIHdvcmtsZXQtPm91dHB1dC5idWZmZXJzLnNpemUoKSk7CisgICAgICAgIG1DQ29kZWNDYWxsYmFjay0+b25FcnJvcihVTktOT1dOX0VSUk9SLCBBQ1RJT05fQ09ERV9GQVRBTCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9IGVsc2UgaWYgKHdvcmtsZXQtPm91dHB1dC5idWZmZXJzLnNpemUoKSA9PSAxdSkgeworICAgICAgICBidWZmZXIgPSB3b3JrbGV0LT5vdXRwdXQuYnVmZmVyc1swXTsKKyAgICAgICAgaWYgKCFidWZmZXIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJbJXNdIG9uV29ya0RvbmU6IG51bGxwdHIgZm91bmQgaW4gYnVmZmVyczsgaWdub3JlZC4iLCBtTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdGQ6Om9wdGlvbmFsPHVpbnQzMl90PiBuZXdJbnB1dERlbGF5LCBuZXdQaXBlbGluZURlbGF5OworICAgIHdoaWxlICghd29ya2xldC0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5lbXB0eSgpKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBwYXJhbTsKKyAgICAgICAgd29ya2xldC0+b3V0cHV0LmNvbmZpZ1VwZGF0ZS5iYWNrKCkuc3dhcChwYXJhbSk7CisgICAgICAgIHdvcmtsZXQtPm91dHB1dC5jb25maWdVcGRhdGUucG9wX2JhY2soKTsKKyAgICAgICAgc3dpdGNoIChwYXJhbS0+Y29yZUluZGV4KCkuY29yZUluZGV4KCkpIHsKKyAgICAgICAgICAgIGNhc2UgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpDT1JFX0lOREVYOiB7CisgICAgICAgICAgICAgICAgQzJQb3J0UmVvcmRlckJ1ZmZlckRlcHRoVHVuaW5nOjpvdXRwdXQgcmVvcmRlckRlcHRoOworICAgICAgICAgICAgICAgIGlmIChyZW9yZGVyRGVwdGgudXBkYXRlRnJvbSgqcGFyYW0pKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgc2VjdXJlID0gbUNvbXBvbmVudC0+Z2V0TmFtZSgpLmZpbmQoIi5zZWN1cmUiKSAhPSBzdGQ6OnN0cmluZzo6bnBvczsKKyAgICAgICAgICAgICAgICAgICAgbVJlb3JkZXJTdGFzaC5sb2NrKCktPnNldERlcHRoKHJlb3JkZXJEZXB0aC52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IHVwZGF0ZWQgcmVvcmRlciBkZXB0aCB0byAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCByZW9yZGVyRGVwdGgudmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtT3V0cHV0U2xvdHMgPSBtT3V0cHV0LmxvY2soKS0+bnVtU2xvdHM7CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBudW1JbnB1dFNsb3RzID0gbUlucHV0LmxvY2soKS0+bnVtU2xvdHM7CisgICAgICAgICAgICAgICAgICAgIE11dGV4ZWQ8T3V0cHV0U3VyZmFjZT46OkxvY2tlZCBvdXRwdXQobU91dHB1dFN1cmZhY2UpOworICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzID0gbnVtT3V0cHV0U2xvdHMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlb3JkZXJEZXB0aC52YWx1ZSArIGtSZW5kZXJpbmdEZXB0aDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWN1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+bWF4RGVxdWV1ZUJ1ZmZlcnMgKz0gbnVtSW5wdXRTbG90czsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0LT5zdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPnN1cmZhY2UtPnNldE1heERlcXVldWVkQnVmZmVyQ291bnQob3V0cHV0LT5tYXhEZXF1ZXVlQnVmZmVycyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBvbldvcmtEb25lOiBmYWlsZWQgdG8gcmVhZCByZW9yZGVyIGRlcHRoIiwgbU5hbWUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQzJQb3J0UmVvcmRlcktleVNldHRpbmc6OkNPUkVfSU5ERVg6IHsKKyAgICAgICAgICAgICAgICBDMlBvcnRSZW9yZGVyS2V5U2V0dGluZzo6b3V0cHV0IHJlb3JkZXJLZXk7CisgICAgICAgICAgICAgICAgaWYgKHJlb3JkZXJLZXkudXBkYXRlRnJvbSgqcGFyYW0pKSB7CisgICAgICAgICAgICAgICAgICAgIG1SZW9yZGVyU3Rhc2gubG9jaygpLT5zZXRLZXkocmVvcmRlcktleS52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IHVwZGF0ZWQgcmVvcmRlciBrZXkgdG8gJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcmVvcmRlcktleS52YWx1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlslc10gb25Xb3JrRG9uZTogZmFpbGVkIHRvIHJlYWQgcmVvcmRlciBrZXkiLCBtTmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6Q09SRV9JTkRFWDogeworICAgICAgICAgICAgICAgIGlmIChwYXJhbS0+aXNHbG9iYWwoKSkgeworICAgICAgICAgICAgICAgICAgICBDMkFjdHVhbFBpcGVsaW5lRGVsYXlUdW5pbmcgcGlwZWxpbmVEZWxheTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBpcGVsaW5lRGVsYXkudXBkYXRlRnJvbSgqcGFyYW0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiB1cGRhdGluZyBwaXBlbGluZSBkZWxheSAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcGlwZWxpbmVEZWxheS52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQaXBlbGluZURlbGF5ID0gcGlwZWxpbmVEZWxheS52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKW1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5waXBlbGluZURlbGF5KHBpcGVsaW5lRGVsYXkudmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwYXJhbS0+Zm9ySW5wdXQoKSkgeworICAgICAgICAgICAgICAgICAgICBDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQgaW5wdXREZWxheTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0RGVsYXkudXBkYXRlRnJvbSgqcGFyYW0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiB1cGRhdGluZyBpbnB1dCBkZWxheSAldSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgaW5wdXREZWxheS52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbnB1dERlbGF5ID0gaW5wdXREZWxheS52YWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKW1QaXBlbGluZVdhdGNoZXIubG9jaygpLT5pbnB1dERlbGF5KGlucHV0RGVsYXkudmFsdWUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwYXJhbS0+Zm9yT3V0cHV0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmc6Om91dHB1dCBvdXRwdXREZWxheTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlbGF5LnVwZGF0ZUZyb20oKnBhcmFtKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogdXBkYXRpbmcgb3V0cHV0IGRlbGF5ICV1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBvdXRwdXREZWxheS52YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNlY3VyZSA9IG1Db21wb25lbnQtPmdldE5hbWUoKS5maW5kKCIuc2VjdXJlIikgIT0gc3RkOjpzdHJpbmc6Om5wb3M7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCltUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+b3V0cHV0RGVsYXkob3V0cHV0RGVsYXkudmFsdWUpOworCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIG91dHB1dEJ1ZmZlcnNDaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtT3V0cHV0U2xvdHMgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bUlucHV0U2xvdHMgPSBtSW5wdXQubG9jaygpLT5udW1TbG90czsKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXRleGVkPE91dHB1dD46OkxvY2tlZCBvdXRwdXQobU91dHB1dCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5vdXRwdXREZWxheSA9IG91dHB1dERlbGF5LnZhbHVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bU91dHB1dFNsb3RzID0gb3V0cHV0RGVsYXkudmFsdWUgKyBrU21vb3RobmVzc0ZhY3RvcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0cHV0LT5udW1TbG90cyA8IG51bU91dHB1dFNsb3RzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+bnVtU2xvdHMgPSBudW1PdXRwdXRTbG90czsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dC0+YnVmZmVycy0+aXNBcnJheU1vZGUoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0QnVmZmVyc0FycmF5ICphcnJheSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE91dHB1dEJ1ZmZlcnNBcnJheSAqKW91dHB1dC0+YnVmZmVycy5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IGdyb3dpbmcgb3V0cHV0IGJ1ZmZlciBhcnJheSB0byAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5hbWUsIG51bU91dHB1dFNsb3RzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFycmF5LT5ncm93KG51bU91dHB1dFNsb3RzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1PdXRwdXRTbG90cyA9IG91dHB1dC0+bnVtU2xvdHM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXJzQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DQ29kZWNDYWxsYmFjay0+b25PdXRwdXRCdWZmZXJzQ2hhbmdlZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZXB0aCA9IG1SZW9yZGVyU3Rhc2gubG9jaygpLT5kZXB0aCgpOworICAgICAgICAgICAgICAgICAgICAgICAgTXV0ZXhlZDxPdXRwdXRTdXJmYWNlPjo6TG9ja2VkIG91dHB1dChtT3V0cHV0U3VyZmFjZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzID0gbnVtT3V0cHV0U2xvdHMgKyBkZXB0aCArIGtSZW5kZXJpbmdEZXB0aDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc2VjdXJlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5tYXhEZXF1ZXVlQnVmZmVycyArPSBudW1JbnB1dFNsb3RzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dC0+c3VyZmFjZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC0+c3VyZmFjZS0+c2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudChvdXRwdXQtPm1heERlcXVldWVCdWZmZXJzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR1YoIlslc10gb25Xb3JrRG9uZTogdW5yZWNvZ25pemVkIGNvbmZpZyB1cGRhdGUgKCUwOFgpIiwKKyAgICAgICAgICAgICAgICAgICAgICBtTmFtZSwgcGFyYW0tPmluZGV4KCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChuZXdJbnB1dERlbGF5IHx8IG5ld1BpcGVsaW5lRGVsYXkpIHsKKyAgICAgICAgTXV0ZXhlZDxJbnB1dD46OkxvY2tlZCBpbnB1dChtSW5wdXQpOworICAgICAgICBzaXplX3QgbmV3TnVtU2xvdHMgPQorICAgICAgICAgICAgbmV3SW5wdXREZWxheS52YWx1ZV9vcihpbnB1dC0+aW5wdXREZWxheSkgKworICAgICAgICAgICAgbmV3UGlwZWxpbmVEZWxheS52YWx1ZV9vcihpbnB1dC0+cGlwZWxpbmVEZWxheSkgKworICAgICAgICAgICAga1Ntb290aG5lc3NGYWN0b3I7CisgICAgICAgIGlmIChpbnB1dC0+YnVmZmVycy0+aXNBcnJheU1vZGUoKSkgeworICAgICAgICAgICAgaWYgKGlucHV0LT5udW1TbG90cyA+PSBuZXdOdW1TbG90cykgeworICAgICAgICAgICAgICAgIGlucHV0LT5udW1FeHRyYVNsb3RzID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5wdXQtPm51bUV4dHJhU2xvdHMgPSBuZXdOdW1TbG90cyAtIGlucHV0LT5udW1TbG90czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IHVwZGF0ZWQgbnVtYmVyIG9mIGV4dHJhIHNsb3RzIHRvICV6dSAoaW5wdXQgYXJyYXkgbW9kZSkiLAorICAgICAgICAgICAgICAgICAgbU5hbWUsIGlucHV0LT5udW1FeHRyYVNsb3RzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlucHV0LT5udW1TbG90cyA9IG5ld051bVNsb3RzOworICAgICAgICB9CisgICAgfQorCisgICAgaW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKHdvcmtsZXQtPm91dHB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgZmxhZ3MgfD0gTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfRU9TOworICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBvdXRwdXQgRU9TIiwgbU5hbWUpOworICAgIH0KKworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IG91dEJ1ZmZlcjsKKyAgICBzaXplX3QgaW5kZXg7CisKKyAgICAvLyBXT1JLQVJPVU5EOiBhZGp1c3Qgb3V0cHV0IHRpbWVzdGFtcCBiYXNlZCBvbiBjbGllbnQgaW5wdXQgdGltZXN0YW1wIGFuZCBjb2RlYworICAgIC8vIGlucHV0IHRpbWVzdGFtcC4gQ29kZWMgb3V0cHV0IHRpbWVzdGFtcCAoaW4gdGhlIHRpbWVzdGFtcCBmaWVsZCkgc2hhbGwgY29ycmVzcG9uZCB0bworICAgIC8vIHRoZSBjb2RlYyBpbnB1dCB0aW1lc3RhbXAsIGJ1dCBjbGllbnQgb3V0cHV0IHRpbWVzdGFtcCBzaG91bGQgKHJlcG9ydGVkIGluIHRpbWVVcykKKyAgICAvLyBzaGFsbCBjb3JyZXNwb25kIHRvIHRoZSBjbGllbnQgaW5wdXQgdGltZXNhbXAgKGluIGN1c3RvbU9yZGluYWwpLiBCeSB1c2luZyB0aGUKKyAgICAvLyBkZWx0YSBiZXR3ZWVuIHRoZSB0d28sIHRoaXMgYWxsb3dzIGZvciBzb21lIHRpbWVzdGFtcCBkZXZpYXRpb24gLSBlLmcuIGlmIG9uZSBpbnB1dAorICAgIC8vIHByb2R1Y2VzIG11bHRpcGxlIG91dHB1dC4KKyAgICBjMl9jbnRyNjRfdCB0aW1lc3RhbXAgPQorICAgICAgICB3b3JrbGV0LT5vdXRwdXQub3JkaW5hbC50aW1lc3RhbXAgKyB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWwKKyAgICAgICAgICAgICAgICAtIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wOworICAgIGlmIChtSW5wdXRTdXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gV2hlbiB1c2luZyBpbnB1dCBzdXJmYWNlIHdlIG5lZWQgdG8gcmVzdG9yZSB0aGUgb3JpZ2luYWwgaW5wdXQgdGltZXN0YW1wLgorICAgICAgICB0aW1lc3RhbXAgPSB3b3JrLT5pbnB1dC5vcmRpbmFsLmN1c3RvbU9yZGluYWw7CisgICAgfQorICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IGlucHV0ICVsbGQsIGNvZGVjICVsbGQgPT4gb3V0cHV0ICVsbGQgPT4gJWxsZCIsCisgICAgICAgICAgbU5hbWUsCisgICAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5jdXN0b21PcmRpbmFsLnBlZWtsbCgpLAorICAgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwudGltZXN0YW1wLnBlZWtsbCgpLAorICAgICAgICAgIHdvcmtsZXQtPm91dHB1dC5vcmRpbmFsLnRpbWVzdGFtcC5wZWVrbGwoKSwKKyAgICAgICAgICB0aW1lc3RhbXAucGVla2xsKCkpOworCisgICAgaWYgKGluaXREYXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgTXV0ZXhlZDxPdXRwdXQ+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXQpOworICAgICAgICBpZiAob3V0cHV0LT5idWZmZXJzLT5yZWdpc3RlckNzZChpbml0RGF0YSwgJmluZGV4LCAmb3V0QnVmZmVyKSA9PSBPSykgeworICAgICAgICAgICAgb3V0QnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lc3RhbXAucGVlaygpKTsKKyAgICAgICAgICAgIG91dEJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZmxhZ3MiLCBNZWRpYUNvZGVjOjpCVUZGRVJfRkxBR19DT0RFQ0NPTkZJRyk7CisgICAgICAgICAgICBBTE9HVigiWyVzXSBvbldvcmtEb25lOiBjc2QgaW5kZXggPSAlenUgWyVwXSIsIG1OYW1lLCBpbmRleCwgb3V0QnVmZmVyLmdldCgpKTsKKworICAgICAgICAgICAgb3V0cHV0LnVubG9jaygpOworICAgICAgICAgICAgbUNhbGxiYWNrLT5vbk91dHB1dEJ1ZmZlckF2YWlsYWJsZShpbmRleCwgb3V0QnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dEKCJbJXNdIG9uV29ya0RvbmU6IHVuYWJsZSB0byByZWdpc3RlciBjc2QiLCBtTmFtZSk7CisgICAgICAgICAgICBvdXRwdXQudW5sb2NrKCk7CisgICAgICAgICAgICBtQ0NvZGVjQ2FsbGJhY2stPm9uRXJyb3IoVU5LTk9XTl9FUlJPUiwgQUNUSU9OX0NPREVfRkFUQUwpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFidWZmZXIgJiYgIWZsYWdzKSB7CisgICAgICAgIEFMT0dWKCJbJXNdIG9uV29ya0RvbmU6IE5vdCByZXBvcnRpbmcgb3V0cHV0IGJ1ZmZlciAoJWxsZCkiLAorICAgICAgICAgICAgICBtTmFtZSwgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4LnBlZWt1bGwoKSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPiAmaW5mbyA6IGJ1ZmZlci0+aW5mbygpKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBwcm9wZXJseSB0cmFuc2xhdGUgdGhlc2UgdG8gbWV0YWRhdGEKKyAgICAgICAgICAgIHN3aXRjaCAoaW5mby0+Y29yZUluZGV4KCkuY29yZUluZGV4KCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEMyU3RyZWFtUGljdHVyZVR5cGVNYXNrSW5mbzo6Q09SRV9JTkRFWDoKKyAgICAgICAgICAgICAgICAgICAgaWYgKCgoQzJTdHJlYW1QaWN0dXJlVHlwZU1hc2tJbmZvICopaW5mby5nZXQoKSktPnZhbHVlICYgQzJDb25maWc6OlNZTkNfRlJBTUUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzIHw9IE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX1NZTkNGUkFNRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxSZW9yZGVyU3Rhc2g+OjpMb2NrZWQgcmVvcmRlcihtUmVvcmRlclN0YXNoKTsKKyAgICAgICAgcmVvcmRlci0+ZW1wbGFjZShidWZmZXIsIHRpbWVzdGFtcC5wZWVrKCksIGZsYWdzLCB3b3JrbGV0LT5vdXRwdXQub3JkaW5hbCk7CisgICAgICAgIGlmIChmbGFncyAmIE1lZGlhQ29kZWM6OkJVRkZFUl9GTEFHX0VPUykgeworICAgICAgICAgICAgLy8gRmx1c2ggcmVvcmRlciBzdGFzaAorICAgICAgICAgICAgcmVvcmRlci0+c2V0RGVwdGgoMCk7CisgICAgICAgIH0KKyAgICB9CisgICAgc2VuZE91dHB1dEJ1ZmZlcnMoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBDQ29kZWNCdWZmZXJDaGFubmVsOjpzZW5kT3V0cHV0QnVmZmVycygpIHsKKyAgICBSZW9yZGVyU3Rhc2g6OkVudHJ5IGVudHJ5OworICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IG91dEJ1ZmZlcjsKKyAgICBzaXplX3QgaW5kZXg7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBNdXRleGVkPFJlb3JkZXJTdGFzaD46OkxvY2tlZCByZW9yZGVyKG1SZW9yZGVyU3Rhc2gpOworICAgICAgICBpZiAoIXJlb3JkZXItPmhhc1BlbmRpbmcoKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFyZW9yZGVyLT5wb3AoJmVudHJ5KSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBNdXRleGVkPE91dHB1dD46OkxvY2tlZCBvdXRwdXQobU91dHB1dCk7CisgICAgICAgIHN0YXR1c190IGVyciA9IG91dHB1dC0+YnVmZmVycy0+cmVnaXN0ZXJCdWZmZXIoZW50cnkuYnVmZmVyLCAmaW5kZXgsICZvdXRCdWZmZXIpOworICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBib29sIG91dHB1dEJ1ZmZlcnNDaGFuZ2VkID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoZXJyICE9IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICAgICAgaWYgKCFvdXRwdXQtPmJ1ZmZlcnMtPmlzQXJyYXlNb2RlKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LT5idWZmZXJzID0gb3V0cHV0LT5idWZmZXJzLT50b0FycmF5TW9kZShvdXRwdXQtPm51bVNsb3RzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgT3V0cHV0QnVmZmVyc0FycmF5ICphcnJheSA9IChPdXRwdXRCdWZmZXJzQXJyYXkgKilvdXRwdXQtPmJ1ZmZlcnMuZ2V0KCk7CisgICAgICAgICAgICAgICAgYXJyYXktPnJlYWxsb2MoZW50cnkuYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzQ2hhbmdlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiWyVzXSBzZW5kT3V0cHV0QnVmZmVyczogdW5hYmxlIHRvIHJlZ2lzdGVyIG91dHB1dCBidWZmZXIiLCBtTmFtZSk7CisgICAgICAgICAgICByZW9yZGVyLT5kZWZlcihlbnRyeSk7CisKKyAgICAgICAgICAgIG91dHB1dC51bmxvY2soKTsKKyAgICAgICAgICAgIHJlb3JkZXIudW5sb2NrKCk7CisKKyAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXJzQ2hhbmdlZCkgeworICAgICAgICAgICAgICAgIG1DQ29kZWNDYWxsYmFjay0+b25PdXRwdXRCdWZmZXJzQ2hhbmdlZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG91dHB1dC51bmxvY2soKTsKKyAgICAgICAgcmVvcmRlci51bmxvY2soKTsKKworICAgICAgICBvdXRCdWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIGVudHJ5LnRpbWVzdGFtcCk7CisgICAgICAgIG91dEJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZmxhZ3MiLCBlbnRyeS5mbGFncyk7CisgICAgICAgIEFMT0dWKCJbJXNdIHNlbmRPdXRwdXRCdWZmZXJzOiBvdXQgYnVmZmVyIGluZGV4ID0gJXp1IFslcF0gPT4gJXAgKyAlenUgKCVsbGQpIiwKKyAgICAgICAgICAgICAgICBtTmFtZSwgaW5kZXgsIG91dEJ1ZmZlci5nZXQoKSwgb3V0QnVmZmVyLT5kYXRhKCksIG91dEJ1ZmZlci0+c2l6ZSgpLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZW50cnkudGltZXN0YW1wKTsKKyAgICAgICAgbUNhbGxiYWNrLT5vbk91dHB1dEJ1ZmZlckF2YWlsYWJsZShpbmRleCwgb3V0QnVmZmVyKTsKKyAgICB9Cit9CisKK3N0YXR1c190IENDb2RlY0J1ZmZlckNoYW5uZWw6OnNldFN1cmZhY2UoY29uc3Qgc3A8U3VyZmFjZT4gJm5ld1N1cmZhY2UpIHsKKyAgICBzdGF0aWMgc3RkOjphdG9taWNfdWludDMyX3Qgc3VyZmFjZUdlbmVyYXRpb257MH07CisgICAgdWludDMyX3QgZ2VuZXJhdGlvbiA9IChnZXRwaWQoKSA8PCAxMCkgfAorICAgICAgICAgICAgKChzdXJmYWNlR2VuZXJhdGlvbi5mZXRjaF9hZGQoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkgKyAxKQorICAgICAgICAgICAgICAgICYgKCgxIDw8IDEwKSAtIDEpKTsKKworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IHByb2R1Y2VyOworICAgIGlmIChuZXdTdXJmYWNlKSB7CisgICAgICAgIG5ld1N1cmZhY2UtPnNldFNjYWxpbmdNb2RlKE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVyk7CisgICAgICAgIG5ld1N1cmZhY2UtPnNldERlcXVldWVUaW1lb3V0KGtEZXF1ZXVlVGltZW91dE5zKTsKKyAgICAgICAgbmV3U3VyZmFjZS0+c2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudChtT3V0cHV0U3VyZmFjZS5sb2NrKCktPm1heERlcXVldWVCdWZmZXJzKTsKKyAgICAgICAgcHJvZHVjZXIgPSBuZXdTdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CisgICAgICAgIHByb2R1Y2VyLT5zZXRHZW5lcmF0aW9uTnVtYmVyKGdlbmVyYXRpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJbJXNdIHNldHRpbmcgb3V0cHV0IHN1cmZhY2UgdG8gbnVsbCIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbmZpZ3VyYWJsZT4gb3V0cHV0UG9vbEludGY7CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3Qgb3V0cHV0UG9vbElkOworICAgIHsKKyAgICAgICAgTXV0ZXhlZDxCbG9ja1Bvb2xzPjo6TG9ja2VkIHBvb2xzKG1CbG9ja1Bvb2xzKTsKKyAgICAgICAgb3V0cHV0UG9vbElkID0gcG9vbHMtPm91dHB1dFBvb2xJZDsKKyAgICAgICAgb3V0cHV0UG9vbEludGYgPSBwb29scy0+b3V0cHV0UG9vbEludGY7CisgICAgfQorCisgICAgaWYgKG91dHB1dFBvb2xJbnRmKSB7CisgICAgICAgIGlmIChtQ29tcG9uZW50LT5zZXRPdXRwdXRTdXJmYWNlKAorICAgICAgICAgICAgICAgIG91dHB1dFBvb2xJZCwKKyAgICAgICAgICAgICAgICBwcm9kdWNlciwKKyAgICAgICAgICAgICAgICBnZW5lcmF0aW9uKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0koIlslc10gc2V0U3VyZmFjZTogY29tcG9uZW50IHNldE91dHB1dFN1cmZhY2UgZmFpbGVkIiwgbU5hbWUpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgeworICAgICAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+OjpMb2NrZWQgb3V0cHV0KG1PdXRwdXRTdXJmYWNlKTsKKyAgICAgICAgb3V0cHV0LT5zdXJmYWNlID0gbmV3U3VyZmFjZTsKKyAgICAgICAgb3V0cHV0LT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK1BpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6OmR1cmF0aW9uIENDb2RlY0J1ZmZlckNoYW5uZWw6OmVsYXBzZWQoKSB7CisgICAgLy8gV2hlbiBjbGllbnQgcHVzaGVkIEVPUywgd2Ugd2FudCBhbGwgdGhlIHdvcmsgdG8gYmUgZG9uZSBxdWlja2x5LgorICAgIC8vIE90aGVyd2lzZSwgY29tcG9uZW50IG1heSBoYXZlIHN0YWxsZWQgd29yayBkdWUgdG8gaW5wdXQgc3RhcnZhdGlvbiB1cCB0bworICAgIC8vIHRoZSBzdW0gb2YgdGhlIGRlbGF5IGluIHRoZSBwaXBlbGluZS4KKyAgICBzaXplX3QgbiA9IDA7CisgICAgaWYgKCFtSW5wdXRNZXRFb3MpIHsKKyAgICAgICAgc2l6ZV90IG91dHB1dERlbGF5ID0gbU91dHB1dC5sb2NrKCktPm91dHB1dERlbGF5OworICAgICAgICBNdXRleGVkPElucHV0Pjo6TG9ja2VkIGlucHV0KG1JbnB1dCk7CisgICAgICAgIG4gPSBpbnB1dC0+aW5wdXREZWxheSArIGlucHV0LT5waXBlbGluZURlbGF5ICsgb3V0cHV0RGVsYXk7CisgICAgfQorICAgIHJldHVybiBtUGlwZWxpbmVXYXRjaGVyLmxvY2soKS0+ZWxhcHNlZChQaXBlbGluZVdhdGNoZXI6OkNsb2NrOjpub3coKSwgbik7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyQ2hhbm5lbDo6c2V0TWV0YU1vZGUoTWV0YU1vZGUgbW9kZSkgeworICAgIG1NZXRhTW9kZSA9IG1vZGU7Cit9CisKK3N0YXR1c190IHRvU3RhdHVzVChjMl9zdGF0dXNfdCBjMnMsIGMyX29wZXJhdGlvbl90IGMyb3ApIHsKKyAgICAvLyBDMl9PSyBpcyBhbHdheXMgdHJhbnNsYXRlZCB0byBPSy4KKyAgICBpZiAoYzJzID09IEMyX09LKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICAvLyBPcGVyYXRpb24tZGVwZW5kZW50IHRyYW5zbGF0aW9uCisgICAgLy8gVE9ETzogQWRkIGFzIG5lY2Vzc2FyeQorICAgIHN3aXRjaCAoYzJvcCkgeworICAgIGNhc2UgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9zdGFydDoKKyAgICAgICAgc3dpdGNoIChjMnMpIHsKKyAgICAgICAgY2FzZSBDMl9OT19NRU1PUlk6CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIH0KKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBCYWNrdXAgb3BlcmF0aW9uLWFnbm9zdGljIHRyYW5zbGF0aW9uCisgICAgc3dpdGNoIChjMnMpIHsKKyAgICBjYXNlIEMyX0JBRF9JTkRFWDoKKyAgICAgICAgcmV0dXJuIEJBRF9JTkRFWDsKKyAgICBjYXNlIEMyX0JBRF9WQUxVRToKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBjYXNlIEMyX0JMT0NLSU5HOgorICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgY2FzZSBDMl9EVVBMSUNBVEU6CisgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICBjYXNlIEMyX05PX0lOSVQ6CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIGNhc2UgQzJfTk9fTUVNT1JZOgorICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIGNhc2UgQzJfTk9UX0ZPVU5EOgorICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgY2FzZSBDMl9USU1FRF9PVVQ6CisgICAgICAgIHJldHVybiBUSU1FRF9PVVQ7CisgICAgY2FzZSBDMl9CQURfU1RBVEU6CisgICAgY2FzZSBDMl9DQU5DRUxFRDoKKyAgICBjYXNlIEMyX0NBTk5PVF9ETzoKKyAgICBjYXNlIEMyX0NPUlJVUFRFRDoKKyAgICBjYXNlIEMyX09NSVRURUQ6CisgICAgY2FzZSBDMl9SRUZVU0VEOgorICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gLXN0YXRpY19jYXN0PHN0YXR1c190PihjMnMpOworICAgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJDaGFubmVsLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZmExMzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVyQ2hhbm5lbC5oCkBAIC0wLDAgKzEsMzU4IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDQ09ERUNfQlVGRkVSX0NIQU5ORUxfSF8KKworI2RlZmluZSBDQ09ERUNfQlVGRkVSX0NIQU5ORUxfSF8KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPENvZGVjMk1hcHBlci5oPgorCisjaW5jbHVkZSA8Y29kZWMyL2hpZGwvY2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NdXRleGVkLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmg+CisKKyNpbmNsdWRlICJDQ29kZWNCdWZmZXJzLmgiCisjaW5jbHVkZSAiSW5wdXRTdXJmYWNlV3JhcHBlci5oIgorI2luY2x1ZGUgIlBpcGVsaW5lV2F0Y2hlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lbW9yeURlYWxlcjsKKworY2xhc3MgQ0NvZGVjQ2FsbGJhY2sgeworcHVibGljOgorICAgIHZpcnR1YWwgfkNDb2RlY0NhbGxiYWNrKCkgPSBkZWZhdWx0OworICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yKHN0YXR1c190IGVyciwgZW51bSBBY3Rpb25Db2RlIGFjdGlvbkNvZGUpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25PdXRwdXRGcmFtZXNSZW5kZXJlZChpbnQ2NF90IG1lZGlhVGltZVVzLCBuc2Vjc190IHJlbmRlclRpbWVOcykgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvbk91dHB1dEJ1ZmZlcnNDaGFuZ2VkKCkgPSAwOworfTsKKworLyoqCisgKiBCdWZmZXJDaGFubmVsQmFzZSBpbXBsZW1lbnRhdGlvbiBmb3IgQ0NvZGVjLgorICovCitjbGFzcyBDQ29kZWNCdWZmZXJDaGFubmVsCisgICAgOiBwdWJsaWMgQnVmZmVyQ2hhbm5lbEJhc2UsIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPENDb2RlY0J1ZmZlckNoYW5uZWw+IHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBDQ29kZWNCdWZmZXJDaGFubmVsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDQ29kZWNDYWxsYmFjaz4gJmNhbGxiYWNrKTsKKyAgICB2aXJ0dWFsIH5DQ29kZWNCdWZmZXJDaGFubmVsKCk7CisKKyAgICAvLyBCdWZmZXJDaGFubmVsQmFzZSBpbnRlcmZhY2UKKyAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXVlSW5wdXRCdWZmZXIoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWV1ZVNlY3VyZUlucHV0QnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgc2VjdXJlLAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqa2V5LAorICAgICAgICAgICAgY29uc3QgdWludDhfdCAqaXYsCisgICAgICAgICAgICBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwKKyAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6UGF0dGVybiBwYXR0ZXJuLAorICAgICAgICAgICAgY29uc3QgQ3J5cHRvUGx1Z2luOjpTdWJTYW1wbGUgKnN1YlNhbXBsZXMsCisgICAgICAgICAgICBzaXplX3QgbnVtU3ViU2FtcGxlcywKKyAgICAgICAgICAgIEFTdHJpbmcgKmVycm9yRGV0YWlsTXNnKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbmRlck91dHB1dEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIGludDY0X3QgdGltZXN0YW1wTnMpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZGlzY2FyZEJ1ZmZlcihjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHZvaWQgZ2V0SW5wdXRCdWZmZXJBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCB2b2lkIGdldE91dHB1dEJ1ZmZlckFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBvdmVycmlkZTsKKworICAgIC8vIE1ldGhvZHMgYmVsb3cgYXJlIGludGVyZmFjZSBmb3IgQ0NvZGVjIHRvIHVzZS4KKworICAgIC8qKgorICAgICAqIFNldCB0aGUgY29tcG9uZW50IG9iamVjdCBmb3IgYnVmZmVyIHByb2Nlc3NpbmcuCisgICAgICovCisgICAgdm9pZCBzZXRDb21wb25lbnQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KTsKKworICAgIC8qKgorICAgICAqIFNldCBvdXRwdXQgZ3JhcGhpYyBzdXJmYWNlIGZvciByZW5kZXJpbmcuCisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0U3VyZmFjZShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgR3JhcGhpY0J1ZmZlclNvdXJjZSBvYmplY3QgZnJvbSB3aGljaCB0aGUgY29tcG9uZW50IGV4dHJhY3RzIGlucHV0CisgICAgICogYnVmZmVycy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRJbnB1dFN1cmZhY2UoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPElucHV0U3VyZmFjZVdyYXBwZXI+ICZzdXJmYWNlKTsKKworICAgIC8qKgorICAgICAqIFNpZ25hbCBFT1MgdG8gaW5wdXQgc3VyZmFjZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzaWduYWxFbmRPZklucHV0U3RyZWFtKCk7CisKKyAgICAvKioKKyAgICAgKiBTZXQgcGFyYW1ldGVycy4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJnBhcmFtcyk7CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBxdWV1ZWluZyBidWZmZXJzIHRvIHRoZSBjb21wb25lbnQuIFRoaXMgb2JqZWN0IHNob3VsZCBuZXZlciBxdWV1ZQorICAgICAqIGJ1ZmZlcnMgYmVmb3JlIHRoaXMgY2FsbCBoYXMgY29tcGxldGVkLgorICAgICAqLworICAgIHN0YXR1c190IHN0YXJ0KGNvbnN0IHNwPEFNZXNzYWdlPiAmaW5wdXRGb3JtYXQsIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0KTsKKworICAgIC8qKgorICAgICAqIFJlcXVlc3QgaW5pdGlhbCBpbnB1dCBidWZmZXJzIHRvIGJlIGZpbGxlZCBieSBjbGllbnQuCisgICAgICovCisgICAgc3RhdHVzX3QgcmVxdWVzdEluaXRpYWxJbnB1dEJ1ZmZlcnMoKTsKKworICAgIC8qKgorICAgICAqIFN0b3AgcXVldWVpbmcgYnVmZmVycyB0byB0aGUgY29tcG9uZW50LiBUaGlzIG9iamVjdCBzaG91bGQgbmV2ZXIgcXVldWUKKyAgICAgKiBidWZmZXJzIGFmdGVyIHRoaXMgY2FsbCwgdW50aWwgc3RhcnQoKSBpcyBjYWxsZWQuCisgICAgICovCisgICAgdm9pZCBzdG9wKCk7CisKKyAgICB2b2lkIGZsdXNoKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKTsKKworICAgIC8qKgorICAgICAqIE5vdGlmeSBpbnB1dCBjbGllbnQgYWJvdXQgd29yayBkb25lLgorICAgICAqCisgICAgICogQHBhcmFtIHdvcmtJdGVtcyAgIGZpbmlzaGVkIHdvcmsgaXRlbS4KKyAgICAgKiBAcGFyYW0gb3V0cHV0Rm9ybWF0IG5ldyBvdXRwdXQgZm9ybWF0IGlmIGl0IGhhcyBjaGFuZ2VkLCBvdGhlcndpc2UgbnVsbHB0cgorICAgICAqIEBwYXJhbSBpbml0RGF0YSAgICBuZXcgaW5pdCBkYXRhIChDU0QpIGlmIGl0IGhhcyBjaGFuZ2VkLCBvdGhlcndpc2UgbnVsbHB0cgorICAgICAqLworICAgIHZvaWQgb25Xb3JrRG9uZSgKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmssIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqaW5pdERhdGEpOworCisgICAgLyoqCisgICAgICogTWFrZSBhbiBpbnB1dCBidWZmZXIgYXZhaWxhYmxlIGZvciB0aGUgY2xpZW50IGFzIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQKKyAgICAgKiBieSB0aGUgY29kZWMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZnJhbWVJbmRleCBUaGUgaW5kZXggb2YgaW5wdXQgd29yaworICAgICAqIEBwYXJhbSBhcnJheUluZGV4IFRoZSBpbmRleCBvZiBidWZmZXIgaW4gdGhlIGlucHV0IHdvcmsgYnVmZmVycy4KKyAgICAgKi8KKyAgICB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKHVpbnQ2NF90IGZyYW1lSW5kZXgsIHNpemVfdCBhcnJheUluZGV4KTsKKworICAgIFBpcGVsaW5lV2F0Y2hlcjo6Q2xvY2s6OmR1cmF0aW9uIGVsYXBzZWQoKTsKKworICAgIGVudW0gTWV0YU1vZGUgeworICAgICAgICBNT0RFX05PTkUsCisgICAgICAgIE1PREVfQU5XLAorICAgIH07CisKKyAgICB2b2lkIHNldE1ldGFNb2RlKE1ldGFNb2RlIG1vZGUpOworCitwcml2YXRlOgorICAgIGNsYXNzIFF1ZXVlR3VhcmQ7CisKKyAgICAvKioKKyAgICAgKiBTcGVjaWFsIG11dGV4LWxpa2Ugb2JqZWN0IHdpdGggdGhlIGZvbGxvd2luZyBwcm9wZXJ0aWVzOgorICAgICAqCisgICAgICogLSBBdCBTVE9QUEVEIHN0YXRlIChpbml0aWFsLCBvciBhZnRlciBzdG9wKCkpCisgICAgICogICAtIFF1ZXVlR3VhcmQgb2JqZWN0IGdldHMgY3JlYXRlZCBhdCBTVE9QUEVEIHN0YXRlLCBhbmQgdGhlIGNsaWVudCBpcworICAgICAqICAgICBzdXBwb3NlZCB0byByZXR1cm4gaW1tZWRpYXRlbHkuCisgICAgICogLSBBdCBSVU5OSU5HIHN0YXRlIChhZnRlciBzdGFydCgpKQorICAgICAqICAgLSBFYWNoIFF1ZXVlR3VhcmQgb2JqZWN0CisgICAgICovCisgICAgY2xhc3MgUXVldWVTeW5jIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKgorICAgICAgICAgKiBBdCBjb25zdHJ1Y3Rpb24gdGhlIHN5bmMgb2JqZWN0IGlzIGluIFNUT1BQRUQgc3RhdGUuCisgICAgICAgICAqLworICAgICAgICBpbmxpbmUgUXVldWVTeW5jKCkge30KKyAgICAgICAgflF1ZXVlU3luYygpID0gZGVmYXVsdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVHJhbnNpdGlvbiB0byBSVU5OSU5HIHN0YXRlIHdoZW4gc3RvcHBlZC4gTm8tb3AgaWYgYWxyZWFkeSBpbiBSVU5OSU5HCisgICAgICAgICAqIHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzdGFydCgpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBdCBSVU5OSU5HIHN0YXRlLCB3YWl0IHVudGlsIGFsbCBRdWV1ZUd1YXJkIG9iamVjdCBjcmVhdGVkIGR1cmluZworICAgICAgICAgKiBSVU5OSU5HIHN0YXRlIGFyZSBkZXN0cm95ZWQsIGFuZCB0aGVuIHRyYW5zaXRpb24gdG8gU1RPUFBFRCBzdGF0ZS4KKyAgICAgICAgICogTm8tb3AgaWYgYWxyZWFkeSBpbiBTVE9QUEVEIHN0YXRlLgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCBzdG9wKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBNdXRleCBtR3VhcmRMb2NrOworCisgICAgICAgIHN0cnVjdCBDb3VudGVyIHsKKyAgICAgICAgICAgIGlubGluZSBDb3VudGVyKCkgOiB2YWx1ZSgtMSkge30KKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBDb25kaXRpb24gY29uZDsKKyAgICAgICAgfTsKKyAgICAgICAgTXV0ZXhlZDxDb3VudGVyPiBtQ291bnQ7CisKKyAgICAgICAgZnJpZW5kIGNsYXNzIENDb2RlY0J1ZmZlckNoYW5uZWw6OlF1ZXVlR3VhcmQ7CisgICAgfTsKKworICAgIGNsYXNzIFF1ZXVlR3VhcmQgeworICAgIHB1YmxpYzoKKyAgICAgICAgUXVldWVHdWFyZChRdWV1ZVN5bmMgJnN5bmMpOworICAgICAgICB+UXVldWVHdWFyZCgpOworICAgICAgICBpbmxpbmUgYm9vbCBpc1J1bm5pbmcoKSB7IHJldHVybiBtUnVubmluZzsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgUXVldWVTeW5jICZtU3luYzsKKyAgICAgICAgYm9vbCBtUnVubmluZzsKKyAgICB9OworCisgICAgdm9pZCBmZWVkSW5wdXRCdWZmZXJJZkF2YWlsYWJsZSgpOworICAgIHZvaWQgZmVlZElucHV0QnVmZmVySWZBdmFpbGFibGVJbnRlcm5hbCgpOworICAgIHN0YXR1c190IHF1ZXVlSW5wdXRCdWZmZXJJbnRlcm5hbChzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXIpOworICAgIGJvb2wgaGFuZGxlV29yaygKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcmssIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0LAorICAgICAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqaW5pdERhdGEpOworICAgIHZvaWQgc2VuZE91dHB1dEJ1ZmZlcnMoKTsKKworICAgIFF1ZXVlU3luYyBtU3luYzsKKyAgICBzcDxNZW1vcnlEZWFsZXI+IG1EZWFsZXI7CisgICAgc3A8SU1lbW9yeT4gbURlY3J5cHREZXN0aW5hdGlvbjsKKyAgICBpbnQzMl90IG1IZWFwU2VxTnVtOworCisgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworICAgIHN0ZDo6c3RyaW5nIG1Db21wb25lbnROYW1lOyAvLy88IGNvbXBvbmVudCBuYW1lIGZvciBkZWJ1Z2dpbmcKKyAgICBjb25zdCBjaGFyICptTmFtZTsgLy8vPCBDLXN0cmluZyB2ZXJzaW9uIG9mIGNvbXBvbmVudCBuYW1lCisgICAgc3RkOjpzaGFyZWRfcHRyPENDb2RlY0NhbGxiYWNrPiBtQ0NvZGVjQ2FsbGJhY2s7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtSW5wdXRBbGxvY2F0b3I7CisgICAgUXVldWVTeW5jIG1RdWV1ZVN5bmM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBtUGFyYW1zVG9CZVNldDsKKworICAgIHN0cnVjdCBJbnB1dCB7CisgICAgICAgIElucHV0KCk7CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4gYnVmZmVyczsKKyAgICAgICAgc2l6ZV90IG51bVNsb3RzOworICAgICAgICBGbGV4QnVmZmVyc0ltcGwgZXh0cmFCdWZmZXJzOworICAgICAgICBzaXplX3QgbnVtRXh0cmFTbG90czsKKyAgICAgICAgdWludDMyX3QgaW5wdXREZWxheTsKKyAgICAgICAgdWludDMyX3QgcGlwZWxpbmVEZWxheTsKKyAgICB9OworICAgIE11dGV4ZWQ8SW5wdXQ+IG1JbnB1dDsKKyAgICBzdHJ1Y3QgT3V0cHV0IHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+IGJ1ZmZlcnM7CisgICAgICAgIHNpemVfdCBudW1TbG90czsKKyAgICAgICAgdWludDMyX3Qgb3V0cHV0RGVsYXk7CisgICAgfTsKKyAgICBNdXRleGVkPE91dHB1dD4gbU91dHB1dDsKKyAgICBNdXRleGVkPHN0ZDo6bGlzdDxzcDxBQnVmZmVyPj4+IG1GbHVzaGVkQ29uZmlnczsKKworICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1GcmFtZUluZGV4OworICAgIHN0ZDo6YXRvbWljX3VpbnQ2NF90IG1GaXJzdFZhbGlkRnJhbWVJbmRleDsKKworICAgIHNwPE1lbW9yeURlYWxlcj4gbWFrZU1lbW9yeURlYWxlcihzaXplX3QgaGVhcFNpemUpOworCisgICAgc3RydWN0IE91dHB1dFN1cmZhY2UgeworICAgICAgICBzcDxTdXJmYWNlPiBzdXJmYWNlOworICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICBpbnQgbWF4RGVxdWV1ZUJ1ZmZlcnM7CisgICAgfTsKKyAgICBNdXRleGVkPE91dHB1dFN1cmZhY2U+IG1PdXRwdXRTdXJmYWNlOworCisgICAgc3RydWN0IEJsb2NrUG9vbHMgeworICAgICAgICBDMkFsbG9jYXRvcjo6aWRfdCBpbnB1dEFsbG9jYXRvcklkOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IGlucHV0UG9vbDsKKyAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3Qgb3V0cHV0QWxsb2NhdG9ySWQ7CisgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG91dHB1dFBvb2xJZDsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29uZmlndXJhYmxlPiBvdXRwdXRQb29sSW50ZjsKKyAgICB9OworICAgIE11dGV4ZWQ8QmxvY2tQb29scz4gbUJsb2NrUG9vbHM7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW5wdXRTdXJmYWNlV3JhcHBlcj4gbUlucHV0U3VyZmFjZTsKKworICAgIE1ldGFNb2RlIG1NZXRhTW9kZTsKKworICAgIE11dGV4ZWQ8UGlwZWxpbmVXYXRjaGVyPiBtUGlwZWxpbmVXYXRjaGVyOworCisgICAgY2xhc3MgUmVvcmRlclN0YXNoIHsKKyAgICBwdWJsaWM6CisgICAgICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICAgICAgICBpbmxpbmUgRW50cnkoKSA6IGJ1ZmZlcihudWxscHRyKSwgdGltZXN0YW1wKDApLCBmbGFncygwKSwgb3JkaW5hbCh7MCwgMCwgMH0pIHt9CisgICAgICAgICAgICBpbmxpbmUgRW50cnkoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmIsCisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdCwKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0ICZvKQorICAgICAgICAgICAgICAgIDogYnVmZmVyKGIpLCB0aW1lc3RhbXAodCksIGZsYWdzKGYpLCBvcmRpbmFsKG8pIHt9CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wOworICAgICAgICAgICAgaW50MzJfdCBmbGFnczsKKyAgICAgICAgICAgIEMyV29ya09yZGluYWxTdHJ1Y3Qgb3JkaW5hbDsKKyAgICAgICAgfTsKKworICAgICAgICBSZW9yZGVyU3Rhc2goKTsKKworICAgICAgICB2b2lkIGNsZWFyKCk7CisgICAgICAgIHZvaWQgZmx1c2goKTsKKyAgICAgICAgdm9pZCBzZXREZXB0aCh1aW50MzJfdCBkZXB0aCk7CisgICAgICAgIHZvaWQgc2V0S2V5KEMyQ29uZmlnOjpvcmRpbmFsX2tleV90IGtleSk7CisgICAgICAgIGJvb2wgcG9wKEVudHJ5ICplbnRyeSk7CisgICAgICAgIHZvaWQgZW1wbGFjZSgKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgaW50MzJfdCBmbGFncywKKyAgICAgICAgICAgICAgICBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0ICZvcmRpbmFsKTsKKyAgICAgICAgdm9pZCBkZWZlcihjb25zdCBFbnRyeSAmZW50cnkpOworICAgICAgICBib29sIGhhc1BlbmRpbmcoKSBjb25zdDsKKyAgICAgICAgdWludDMyX3QgZGVwdGgoKSBjb25zdCB7IHJldHVybiBtRGVwdGg7IH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bGlzdDxFbnRyeT4gbVBlbmRpbmc7CisgICAgICAgIHN0ZDo6bGlzdDxFbnRyeT4gbVN0YXNoOworICAgICAgICB1aW50MzJfdCBtRGVwdGg7CisgICAgICAgIEMyQ29uZmlnOjpvcmRpbmFsX2tleV90IG1LZXk7CisKKyAgICAgICAgYm9vbCBsZXNzKGNvbnN0IEMyV29ya09yZGluYWxTdHJ1Y3QgJm8xLCBjb25zdCBDMldvcmtPcmRpbmFsU3RydWN0ICZvMik7CisgICAgfTsKKyAgICBNdXRleGVkPFJlb3JkZXJTdGFzaD4gbVJlb3JkZXJTdGFzaDsKKworICAgIHN0ZDo6YXRvbWljX2Jvb2wgbUlucHV0TWV0RW9zOworICAgIHN0ZDo6b25jZV9mbGFnIG1SZW5kZXJXYXJuaW5nRmxhZzsKKworICAgIGlubGluZSBib29sIGhhc0NyeXB0b09yRGVzY3JhbWJsZXIoKSB7CisgICAgICAgIHJldHVybiBtQ3J5cHRvICE9IG51bGxwdHIgfHwgbURlc2NyYW1ibGVyICE9IG51bGxwdHI7CisgICAgfQorfTsKKworLy8gQ29udmVyc2lvbiBvZiBhIGMyX3N0YXR1c190IHZhbHVlIHRvIGEgc3RhdHVzX3QgdmFsdWUgbWF5IGRlcGVuZCBvbiB0aGUKKy8vIG9wZXJhdGlvbiB0aGF0IHJldHVybnMgdGhlIGMyX3N0YXR1c190IHZhbHVlLgorZW51bSBjMl9vcGVyYXRpb25fdCB7CisgICAgQzJfT1BFUkFUSU9OX05PTkUsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9jb25uZWN0VG9PbXhJbnB1dFN1cmZhY2UsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9jcmVhdGVCbG9ja1Bvb2wsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9kZXN0cm95QmxvY2tQb29sLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfZGlzY29ubmVjdEZyb21JbnB1dFN1cmZhY2UsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9kcmFpbiwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50X2ZsdXNoLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfcXVldWUsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9yZWxlYXNlLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfcmVzZXQsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9zZXRPdXRwdXRTdXJmYWNlLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRfc3RhcnQsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudF9zdG9wLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRTdG9yZV9jb3B5QnVmZmVyLAorICAgIEMyX09QRVJBVElPTl9Db21wb25lbnRTdG9yZV9jcmVhdGVDb21wb25lbnQsCisgICAgQzJfT1BFUkFUSU9OX0NvbXBvbmVudFN0b3JlX2NyZWF0ZUlucHV0U3VyZmFjZSwKKyAgICBDMl9PUEVSQVRJT05fQ29tcG9uZW50U3RvcmVfY3JlYXRlSW50ZXJmYWNlLAorICAgIEMyX09QRVJBVElPTl9Db25maWd1cmFibGVfY29uZmlnLAorICAgIEMyX09QRVJBVElPTl9Db25maWd1cmFibGVfcXVlcnksCisgICAgQzJfT1BFUkFUSU9OX0NvbmZpZ3VyYWJsZV9xdWVyeVN1cHBvcnRlZFBhcmFtcywKKyAgICBDMl9PUEVSQVRJT05fQ29uZmlndXJhYmxlX3F1ZXJ5U3VwcG9ydGVkVmFsdWVzLAorICAgIEMyX09QRVJBVElPTl9JbnB1dFN1cmZhY2VfY29ubmVjdFRvQ29tcG9uZW50LAorICAgIEMyX09QRVJBVElPTl9JbnB1dFN1cmZhY2VDb25uZWN0aW9uX2Rpc2Nvbm5lY3QsCit9OworCitzdGF0dXNfdCB0b1N0YXR1c1QoYzJfc3RhdHVzX3QgYzJzLCBjMl9vcGVyYXRpb25fdCBjMm9wID0gQzJfT1BFUkFUSU9OX05PTkUpOworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENDT0RFQ19CVUZGRVJfQ0hBTk5FTF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOGI4MzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQnVmZmVycy5jcHAKQEAgLTAsMCArMSwxMDczIEBACisvKgorICogQ29weXJpZ2h0IDIwMTksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNDb2RlY0J1ZmZlcnMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxDMlBsYXRmb3JtU3VwcG9ydC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisKKyNpbmNsdWRlICJDQ29kZWNCdWZmZXJzLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIHsKKworc3A8R3JhcGhpY0Jsb2NrQnVmZmVyPiBBbGxvY2F0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICB1aW50MzJfdCBwaXhlbEZvcm1hdCwKKyAgICAgICAgY29uc3QgQzJNZW1vcnlVc2FnZSAmdXNhZ2UsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+ICZsb2NhbEJ1ZmZlclBvb2wpIHsKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgaWYgKCFmb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpIHx8ICFmb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgQUxPR0QoImZvcm1hdCBsYWNrcyB3aWR0aCBvciBoZWlnaHQiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHBpeGVsRm9ybWF0LCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJmZXRjaCBncmFwaGljIGJsb2NrIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gR3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZSgKKyAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgIGJsb2NrLAorICAgICAgICAgICAgW2xvY2FsQnVmZmVyUG9vbF0oc2l6ZV90IGNhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxvY2FsQnVmZmVyUG9vbC0+bmV3QnVmZmVyKGNhcGFjaXR5KTsKKyAgICAgICAgICAgIH0pOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gQ0NvZGVjQnVmZmVycworCit2b2lkIENDb2RlY0J1ZmZlcnM6OnNldEZvcm1hdChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgeworICAgIENIRUNLKGZvcm1hdCAhPSBudWxscHRyKTsKKyAgICBtRm9ybWF0ID0gZm9ybWF0OworfQorCitzcDxBTWVzc2FnZT4gQ0NvZGVjQnVmZmVyczo6ZHVwRm9ybWF0KCkgeworICAgIHJldHVybiBtRm9ybWF0ICE9IG51bGxwdHIgPyBtRm9ybWF0LT5kdXAoKSA6IG51bGxwdHI7Cit9CisKK3ZvaWQgQ0NvZGVjQnVmZmVyczo6aGFuZGxlSW1hZ2VEYXRhKGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIHNwPEFCdWZmZXI+IGltYWdlRGF0YUNhbmRpZGF0ZSA9IGJ1ZmZlci0+Z2V0SW1hZ2VEYXRhKCk7CisgICAgaWYgKGltYWdlRGF0YUNhbmRpZGF0ZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8QUJ1ZmZlcj4gaW1hZ2VEYXRhOworICAgIGlmICghbUZvcm1hdC0+ZmluZEJ1ZmZlcigiaW1hZ2UtZGF0YSIsICZpbWFnZURhdGEpCisgICAgICAgICAgICB8fCBpbWFnZURhdGFDYW5kaWRhdGUtPnNpemUoKSAhPSBpbWFnZURhdGEtPnNpemUoKQorICAgICAgICAgICAgfHwgbWVtY21wKGltYWdlRGF0YUNhbmRpZGF0ZS0+ZGF0YSgpLCBpbWFnZURhdGEtPmRhdGEoKSwgaW1hZ2VEYXRhLT5zaXplKCkpICE9IDApIHsKKyAgICAgICAgQUxPR0QoIlslc10gdXBkYXRpbmcgaW1hZ2UtZGF0YSIsIG1OYW1lKTsKKyAgICAgICAgc3A8QU1lc3NhZ2U+IG5ld0Zvcm1hdCA9IGR1cEZvcm1hdCgpOworICAgICAgICBuZXdGb3JtYXQtPnNldEJ1ZmZlcigiaW1hZ2UtZGF0YSIsIGltYWdlRGF0YUNhbmRpZGF0ZSk7CisgICAgICAgIE1lZGlhSW1hZ2UyICppbWcgPSAoTWVkaWFJbWFnZTIqKWltYWdlRGF0YUNhbmRpZGF0ZS0+ZGF0YSgpOworICAgICAgICBpZiAoaW1nLT5tTnVtUGxhbmVzID4gMCAmJiBpbWctPm1UeXBlICE9IGltZy0+TUVESUFfSU1BR0VfVFlQRV9VTktOT1dOKSB7CisgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSA9IGltZy0+bVBsYW5lWzBdLm1Sb3dJbmM7CisgICAgICAgICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9TVFJJREUsIHN0cmlkZSk7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSB1cGRhdGluZyBzdHJpZGUgPSAlZCIsIG1OYW1lLCBzdHJpZGUpOworICAgICAgICAgICAgaWYgKGltZy0+bU51bVBsYW5lcyA+IDEgJiYgc3RyaWRlID4gMCkgeworICAgICAgICAgICAgICAgIGludDMyX3QgdnN0cmlkZSA9IChpbWctPm1QbGFuZVsxXS5tT2Zmc2V0IC0gaW1nLT5tUGxhbmVbMF0ubU9mZnNldCkgLyBzdHJpZGU7CisgICAgICAgICAgICAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfU0xJQ0VfSEVJR0hULCB2c3RyaWRlKTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSB1cGRhdGluZyB2c3RyaWRlID0gJWQiLCBtTmFtZSwgdnN0cmlkZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2V0Rm9ybWF0KG5ld0Zvcm1hdCk7CisgICAgICAgIGJ1ZmZlci0+c2V0Rm9ybWF0KG5ld0Zvcm1hdCk7CisgICAgfQorfQorCisvLyBJbnB1dEJ1ZmZlcnMKKworc3A8Q29kZWMyQnVmZmVyPiBJbnB1dEJ1ZmZlcnM6OmNsb25lQW5kUmVsZWFzZUJ1ZmZlcihjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgc3A8Q29kZWMyQnVmZmVyPiBjb3B5ID0gY3JlYXRlTmV3QnVmZmVyKCk7CisgICAgaWYgKGNvcHkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjMmJ1ZmZlcjsKKyAgICBpZiAoIXJlbGVhc2VCdWZmZXIoYnVmZmVyLCAmYzJidWZmZXIsIHRydWUpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBpZiAoIWNvcHktPmNhbkNvcHkoYzJidWZmZXIpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBpZiAoIWNvcHktPmNvcHkoYzJidWZmZXIpKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gY29weTsKK30KKworLy8gT3V0cHV0QnVmZmVycworCit2b2lkIE91dHB1dEJ1ZmZlcnM6OmluaXRTa2lwQ3V0QnVmZmVyKAorICAgICAgICBpbnQzMl90IGRlbGF5LCBpbnQzMl90IHBhZGRpbmcsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjaGFubmVsQ291bnQpIHsKKyAgICBDSEVDSyhtU2tpcEN1dEJ1ZmZlciA9PSBudWxscHRyKTsKKyAgICBtRGVsYXkgPSBkZWxheTsKKyAgICBtUGFkZGluZyA9IHBhZGRpbmc7CisgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgIHNldFNraXBDdXRCdWZmZXIoZGVsYXksIHBhZGRpbmcsIGNoYW5uZWxDb3VudCk7Cit9CisKK3ZvaWQgT3V0cHV0QnVmZmVyczo6dXBkYXRlU2tpcEN1dEJ1ZmZlcihpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgY2hhbm5lbENvdW50KSB7CisgICAgaWYgKG1Ta2lwQ3V0QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQzMl90IGRlbGF5ID0gbURlbGF5OworICAgIGludDMyX3QgcGFkZGluZyA9IG1QYWRkaW5nOworICAgIGlmIChzYW1wbGVSYXRlICE9IG1TYW1wbGVSYXRlKSB7CisgICAgICAgIGRlbGF5ID0gKChpbnQ2NF90KWRlbGF5ICogc2FtcGxlUmF0ZSkgLyBtU2FtcGxlUmF0ZTsKKyAgICAgICAgcGFkZGluZyA9ICgoaW50NjRfdClwYWRkaW5nICogc2FtcGxlUmF0ZSkgLyBtU2FtcGxlUmF0ZTsKKyAgICB9CisgICAgc2V0U2tpcEN1dEJ1ZmZlcihkZWxheSwgcGFkZGluZywgY2hhbm5lbENvdW50KTsKK30KKwordm9pZCBPdXRwdXRCdWZmZXJzOjpzdWJtaXQoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGlmIChtU2tpcEN1dEJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1Ta2lwQ3V0QnVmZmVyLT5zdWJtaXQoYnVmZmVyKTsKKyAgICB9Cit9CisKK3ZvaWQgT3V0cHV0QnVmZmVyczo6dHJhbnNmZXJTa2lwQ3V0QnVmZmVyKGNvbnN0IHNwPFNraXBDdXRCdWZmZXI+ICZzY2IpIHsKKyAgICBtU2tpcEN1dEJ1ZmZlciA9IHNjYjsKK30KKwordm9pZCBPdXRwdXRCdWZmZXJzOjpzZXRTa2lwQ3V0QnVmZmVyKGludDMyX3Qgc2tpcCwgaW50MzJfdCBjdXQsIGludDMyX3QgY2hhbm5lbENvdW50KSB7CisgICAgaWYgKG1Ta2lwQ3V0QnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgc2l6ZV90IHByZXZTaXplID0gbVNraXBDdXRCdWZmZXItPnNpemUoKTsKKyAgICAgICAgaWYgKHByZXZTaXplICE9IDB1KSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBSZXBsYWNpbmcgU2tpcEN1dEJ1ZmZlciBob2xkaW5nICV6dSBieXRlcyIsIG1OYW1lLCBwcmV2U2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbVNraXBDdXRCdWZmZXIgPSBuZXcgU2tpcEN1dEJ1ZmZlcihza2lwLCBjdXQsIGNoYW5uZWxDb3VudCk7Cit9CisKKy8vIExvY2FsQnVmZmVyUG9vbAorCitzdGQ6OnNoYXJlZF9wdHI8TG9jYWxCdWZmZXJQb29sPiBMb2NhbEJ1ZmZlclBvb2w6OkNyZWF0ZShzaXplX3QgcG9vbENhcGFjaXR5KSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+KG5ldyBMb2NhbEJ1ZmZlclBvb2wocG9vbENhcGFjaXR5KSk7Cit9CisKK3NwPEFCdWZmZXI+IExvY2FsQnVmZmVyUG9vbDo6bmV3QnVmZmVyKHNpemVfdCBjYXBhY2l0eSkgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisgICAgYXV0byBpdCA9IHN0ZDo6ZmluZF9pZigKKyAgICAgICAgICAgIG1Qb29sLmJlZ2luKCksIG1Qb29sLmVuZCgpLAorICAgICAgICAgICAgW2NhcGFjaXR5XShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmdmVjKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZlYy5jYXBhY2l0eSgpID49IGNhcGFjaXR5OworICAgICAgICAgICAgfSk7CisgICAgaWYgKGl0ICE9IG1Qb29sLmVuZCgpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBWZWN0b3JCdWZmZXIoc3RkOjptb3ZlKCppdCksIHNoYXJlZF9mcm9tX3RoaXMoKSk7CisgICAgICAgIG1Qb29sLmVyYXNlKGl0KTsKKyAgICAgICAgcmV0dXJuIGJ1ZmZlcjsKKyAgICB9CisgICAgaWYgKG1Vc2VkU2l6ZSArIGNhcGFjaXR5ID4gbVBvb2xDYXBhY2l0eSkgeworICAgICAgICB3aGlsZSAoIW1Qb29sLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1Vc2VkU2l6ZSAtPSBtUG9vbC5iYWNrKCkuY2FwYWNpdHkoKTsKKyAgICAgICAgICAgIG1Qb29sLnBvcF9iYWNrKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Vc2VkU2l6ZSArIGNhcGFjaXR5ID4gbVBvb2xDYXBhY2l0eSkgeworICAgICAgICAgICAgQUxPR0QoIm1Vc2VkU2l6ZSA9ICV6dSwgY2FwYWNpdHkgPSAlenUsIG1Qb29sQ2FwYWNpdHkgPSAlenUiLAorICAgICAgICAgICAgICAgICAgICBtVXNlZFNpemUsIGNhcGFjaXR5LCBtUG9vbENhcGFjaXR5KTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHZlYyhjYXBhY2l0eSk7CisgICAgbVVzZWRTaXplICs9IHZlYy5jYXBhY2l0eSgpOworICAgIHJldHVybiBuZXcgVmVjdG9yQnVmZmVyKHN0ZDo6bW92ZSh2ZWMpLCBzaGFyZWRfZnJvbV90aGlzKCkpOworfQorCitMb2NhbEJ1ZmZlclBvb2w6OlZlY3RvckJ1ZmZlcjo6VmVjdG9yQnVmZmVyKAorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmJnZlYywgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gJnBvb2wpCisgICAgOiBBQnVmZmVyKHZlYy5kYXRhKCksIHZlYy5jYXBhY2l0eSgpKSwKKyAgICAgIG1WZWMoc3RkOjptb3ZlKHZlYykpLAorICAgICAgbVBvb2wocG9vbCkgeworfQorCitMb2NhbEJ1ZmZlclBvb2w6OlZlY3RvckJ1ZmZlcjo6flZlY3RvckJ1ZmZlcigpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8TG9jYWxCdWZmZXJQb29sPiBwb29sID0gbVBvb2wubG9jaygpOworICAgIGlmIChwb29sKSB7CisgICAgICAgIC8vIElmIHBvb2wgaXMgYWxpdmUsIHJldHVybiB0aGUgdmVjdG9yIGJhY2sgdG8gdGhlIHBvb2wgc28gdGhhdAorICAgICAgICAvLyBpdCBjYW4gYmUgcmVjeWNsZWQuCisgICAgICAgIHBvb2wtPnJldHVyblZlY3RvcihzdGQ6Om1vdmUobVZlYykpOworICAgIH0KK30KKwordm9pZCBMb2NhbEJ1ZmZlclBvb2w6OnJldHVyblZlY3RvcihzdGQ6OnZlY3Rvcjx1aW50OF90PiAmJnZlYykgeworICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7CisgICAgbVBvb2wucHVzaF9mcm9udChzdGQ6Om1vdmUodmVjKSk7Cit9CisKKy8vIEZsZXhCdWZmZXJzSW1wbAorCitzaXplX3QgRmxleEJ1ZmZlcnNJbXBsOjphc3NpZ25TbG90KGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlciA9PSBudWxscHRyCisgICAgICAgICAgICAgICAgJiYgbUJ1ZmZlcnNbaV0uY29tcEJ1ZmZlci5leHBpcmVkKCkpIHsKKyAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlciA9IGJ1ZmZlcjsKKyAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICB9CisgICAgfQorICAgIG1CdWZmZXJzLnB1c2hfYmFjayh7IGJ1ZmZlciwgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4oKSB9KTsKKyAgICByZXR1cm4gbUJ1ZmZlcnMuc2l6ZSgpIC0gMTsKK30KKworYm9vbCBGbGV4QnVmZmVyc0ltcGw6OnJlbGVhc2VTbG90KAorICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgYm9vbCByZWxlYXNlKSB7CisgICAgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXI7CisgICAgc2l6ZV90IGluZGV4ID0gbUJ1ZmZlcnMuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgaWYgKG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlciA9PSBidWZmZXIpIHsKKyAgICAgICAgICAgIGNsaWVudEJ1ZmZlciA9IG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlcjsKKyAgICAgICAgICAgIGlmIChyZWxlYXNlKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyLmNsZWFyKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbmRleCA9IGk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY2xpZW50QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIlslc10gJXM6IE5vIG1hdGNoaW5nIGJ1ZmZlciBmb3VuZCIsIG1OYW1lLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiByZXN1bHQgPSBtQnVmZmVyc1tpbmRleF0uY29tcEJ1ZmZlci5sb2NrKCk7CisgICAgaWYgKCFyZXN1bHQpIHsKKyAgICAgICAgcmVzdWx0ID0gY2xpZW50QnVmZmVyLT5hc0MyQnVmZmVyKCk7CisgICAgICAgIG1CdWZmZXJzW2luZGV4XS5jb21wQnVmZmVyID0gcmVzdWx0OworICAgIH0KKyAgICBpZiAoYzJidWZmZXIpIHsKKyAgICAgICAgKmMyYnVmZmVyID0gcmVzdWx0OworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBGbGV4QnVmZmVyc0ltcGw6OmV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjb21wQnVmZmVyID0KKyAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLmxvY2soKTsKKyAgICAgICAgaWYgKCFjb21wQnVmZmVyIHx8IGNvbXBCdWZmZXIgIT0gYzJidWZmZXIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG1CdWZmZXJzW2ldLmNvbXBCdWZmZXIucmVzZXQoKTsKKyAgICAgICAgQUxPR1YoIlslc10gY29kZWMgcmVsZWFzZWQgYnVmZmVyICMlenUiLCBtTmFtZSwgaSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBBTE9HVigiWyVzXSBjb2RlYyByZWxlYXNlZCBhbiB1bmtub3duIGJ1ZmZlciIsIG1OYW1lKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgRmxleEJ1ZmZlcnNJbXBsOjpmbHVzaCgpIHsKKyAgICBBTE9HVigiWyVzXSBidWZmZXJzIGFyZSBmbHVzaGVkICV6dSIsIG1OYW1lLCBtQnVmZmVycy5zaXplKCkpOworICAgIG1CdWZmZXJzLmNsZWFyKCk7Cit9CisKK3NpemVfdCBGbGV4QnVmZmVyc0ltcGw6Om51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6Y291bnRfaWYoCisgICAgICAgICAgICBtQnVmZmVycy5iZWdpbigpLCBtQnVmZmVycy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IEVudHJ5ICZlbnRyeSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoZW50cnkuY2xpZW50QnVmZmVyICE9IG51bGxwdHIpOworICAgICAgICAgICAgfSk7Cit9CisKK3NpemVfdCBGbGV4QnVmZmVyc0ltcGw6Om51bUNvbXBvbmVudEJ1ZmZlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6Y291bnRfaWYoCisgICAgICAgICAgICBtQnVmZmVycy5iZWdpbigpLCBtQnVmZmVycy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IEVudHJ5ICZlbnRyeSkgeworICAgICAgICAgICAgICAgIHJldHVybiAhZW50cnkuY29tcEJ1ZmZlci5leHBpcmVkKCk7CisgICAgICAgICAgICB9KTsKK30KKworLy8gQnVmZmVyc0FycmF5SW1wbAorCit2b2lkIEJ1ZmZlcnNBcnJheUltcGw6OmluaXRpYWxpemUoCisgICAgICAgIGNvbnN0IEZsZXhCdWZmZXJzSW1wbCAmaW1wbCwKKyAgICAgICAgc2l6ZV90IG1pblNpemUsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBhbGxvY2F0ZSkgeworICAgIG1JbXBsTmFtZSA9IGltcGwubUltcGxOYW1lICsgIltOXSI7CisgICAgbU5hbWUgPSBtSW1wbE5hbWUuY19zdHIoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGltcGwubUJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3A8Q29kZWMyQnVmZmVyPiBjbGllbnRCdWZmZXIgPSBpbXBsLm1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlcjsKKyAgICAgICAgYm9vbCBvd25lZEJ5Q2xpZW50ID0gKGNsaWVudEJ1ZmZlciAhPSBudWxscHRyKTsKKyAgICAgICAgaWYgKCFvd25lZEJ5Q2xpZW50KSB7CisgICAgICAgICAgICBjbGllbnRCdWZmZXIgPSBhbGxvY2F0ZSgpOworICAgICAgICB9CisgICAgICAgIG1CdWZmZXJzLnB1c2hfYmFjayh7IGNsaWVudEJ1ZmZlciwgaW1wbC5tQnVmZmVyc1tpXS5jb21wQnVmZmVyLCBvd25lZEJ5Q2xpZW50IH0pOworICAgIH0KKyAgICBBTE9HVigiWyVzXSBjb252ZXJ0ZWQgJXp1IGJ1ZmZlcnMgdG8gYXJyYXkgbW9kZSBvZiAlenUiLCBtTmFtZSwgbUJ1ZmZlcnMuc2l6ZSgpLCBtaW5TaXplKTsKKyAgICBmb3IgKHNpemVfdCBpID0gaW1wbC5tQnVmZmVycy5zaXplKCk7IGkgPCBtaW5TaXplOyArK2kpIHsKKyAgICAgICAgbUJ1ZmZlcnMucHVzaF9iYWNrKHsgYWxsb2NhdGUoKSwgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4oKSwgZmFsc2UgfSk7CisgICAgfQorfQorCitzdGF0dXNfdCBCdWZmZXJzQXJyYXlJbXBsOjpncmFiQnVmZmVyKAorICAgICAgICBzaXplX3QgKmluZGV4LAorICAgICAgICBzcDxDb2RlYzJCdWZmZXI+ICpidWZmZXIsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBzcDxDb2RlYzJCdWZmZXI+ICYpPiBtYXRjaCkgeworICAgIC8vIGFsbEJ1ZmZlcnNEb250TWF0Y2ggcmVtYWlucyB0cnVlIGlmIGFsbCBidWZmZXJzIGFyZSBhdmFpbGFibGUgYnV0CisgICAgLy8gbWF0Y2goKSByZXR1cm5zIGZhbHNlIGZvciBldmVyeSBidWZmZXIuCisgICAgYm9vbCBhbGxCdWZmZXJzRG9udE1hdGNoID0gdHJ1ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmICghbUJ1ZmZlcnNbaV0ub3duZWRCeUNsaWVudCAmJiBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLmV4cGlyZWQoKSkgeworICAgICAgICAgICAgaWYgKG1hdGNoKG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlcikpIHsKKyAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5vd25lZEJ5Q2xpZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAqYnVmZmVyID0gbUJ1ZmZlcnNbaV0uY2xpZW50QnVmZmVyOworICAgICAgICAgICAgICAgICgqYnVmZmVyKS0+bWV0YSgpLT5jbGVhcigpOworICAgICAgICAgICAgICAgICgqYnVmZmVyKS0+c2V0UmFuZ2UoMCwgKCpidWZmZXIpLT5jYXBhY2l0eSgpKTsKKyAgICAgICAgICAgICAgICAqaW5kZXggPSBpOworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGFsbEJ1ZmZlcnNEb250TWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYWxsQnVmZmVyc0RvbnRNYXRjaCA/IE5PX01FTU9SWSA6IFdPVUxEX0JMT0NLOworfQorCitib29sIEJ1ZmZlcnNBcnJheUltcGw6OnJldHVybkJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIsCisgICAgICAgIGJvb2wgcmVsZWFzZSkgeworICAgIHNwPENvZGVjMkJ1ZmZlcj4gY2xpZW50QnVmZmVyOworICAgIHNpemVfdCBpbmRleCA9IG1CdWZmZXJzLnNpemUoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CdWZmZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChtQnVmZmVyc1tpXS5jbGllbnRCdWZmZXIgPT0gYnVmZmVyKSB7CisgICAgICAgICAgICBpZiAoIW1CdWZmZXJzW2ldLm93bmVkQnlDbGllbnQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiWyVzXSBDbGllbnQgcmV0dXJuZWQgYSBidWZmZXIgaXQgZG9lcyBub3Qgb3duIGFjY29yZGluZyB0byBvdXIgcmVjb3JkOiAlenUiLAorICAgICAgICAgICAgICAgICAgICAgIG1OYW1lLCBpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNsaWVudEJ1ZmZlciA9IG1CdWZmZXJzW2ldLmNsaWVudEJ1ZmZlcjsKKyAgICAgICAgICAgIGlmIChyZWxlYXNlKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlcnNbaV0ub3duZWRCeUNsaWVudCA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggPSBpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGNsaWVudEJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCJbJXNdICVzOiBObyBtYXRjaGluZyBidWZmZXIgZm91bmQiLCBtTmFtZSwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEFMT0dWKCJbJXNdICVzOiBtYXRjaGluZyBidWZmZXIgZm91bmQgKGluZGV4PSV6dSkiLCBtTmFtZSwgX19mdW5jX18sIGluZGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IHJlc3VsdCA9IG1CdWZmZXJzW2luZGV4XS5jb21wQnVmZmVyLmxvY2soKTsKKyAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICByZXN1bHQgPSBjbGllbnRCdWZmZXItPmFzQzJCdWZmZXIoKTsKKyAgICAgICAgbUJ1ZmZlcnNbaW5kZXhdLmNvbXBCdWZmZXIgPSByZXN1bHQ7CisgICAgfQorICAgIGlmIChjMmJ1ZmZlcikgeworICAgICAgICAqYzJidWZmZXIgPSByZXN1bHQ7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEJ1ZmZlcnNBcnJheUltcGw6OmV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUJ1ZmZlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBjb21wQnVmZmVyID0KKyAgICAgICAgICAgICAgICBtQnVmZmVyc1tpXS5jb21wQnVmZmVyLmxvY2soKTsKKyAgICAgICAgaWYgKCFjb21wQnVmZmVyKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYzJidWZmZXIgPT0gY29tcEJ1ZmZlcikgeworICAgICAgICAgICAgaWYgKG1CdWZmZXJzW2ldLm93bmVkQnlDbGllbnQpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuLgorICAgICAgICAgICAgICAgIEFMT0dEKCJbJXNdIGNvZGVjIHJlbGVhc2VkIGEgYnVmZmVyIG93bmVkIGJ5IGNsaWVudCAiCisgICAgICAgICAgICAgICAgICAgICAgIihpbmRleCAlenUpIiwgbU5hbWUsIGkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUJ1ZmZlcnNbaV0uY29tcEJ1ZmZlci5yZXNldCgpOworICAgICAgICAgICAgQUxPR1YoIlslc10gY29kZWMgcmVsZWFzZWQgYnVmZmVyICMlenUoYXJyYXkgbW9kZSkiLCBtTmFtZSwgaSk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiWyVzXSBjb2RlYyByZWxlYXNlZCBhbiB1bmtub3duIGJ1ZmZlciAoYXJyYXkgbW9kZSkiLCBtTmFtZSk7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEJ1ZmZlcnNBcnJheUltcGw6OmdldEFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBjb25zdCB7CisgICAgYXJyYXktPmNsZWFyKCk7CisgICAgZm9yIChjb25zdCBFbnRyeSAmZW50cnkgOiBtQnVmZmVycykgeworICAgICAgICBhcnJheS0+cHVzaChlbnRyeS5jbGllbnRCdWZmZXIpOworICAgIH0KK30KKwordm9pZCBCdWZmZXJzQXJyYXlJbXBsOjpmbHVzaCgpIHsKKyAgICBmb3IgKEVudHJ5ICZlbnRyeSA6IG1CdWZmZXJzKSB7CisgICAgICAgIGVudHJ5Lm93bmVkQnlDbGllbnQgPSBmYWxzZTsKKyAgICB9Cit9CisKK3ZvaWQgQnVmZmVyc0FycmF5SW1wbDo6cmVhbGxvYyhzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2MpIHsKKyAgICBzaXplX3Qgc2l6ZSA9IG1CdWZmZXJzLnNpemUoKTsKKyAgICBtQnVmZmVycy5jbGVhcigpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgIG1CdWZmZXJzLnB1c2hfYmFjayh7IGFsbG9jKCksIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXI+KCksIGZhbHNlIH0pOworICAgIH0KK30KKwordm9pZCBCdWZmZXJzQXJyYXlJbXBsOjpncm93KAorICAgICAgICBzaXplX3QgbmV3U2l6ZSwgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jKSB7CisgICAgQ0hFQ0tfTFQobUJ1ZmZlcnMuc2l6ZSgpLCBuZXdTaXplKTsKKyAgICB3aGlsZSAobUJ1ZmZlcnMuc2l6ZSgpIDwgbmV3U2l6ZSkgeworICAgICAgICBtQnVmZmVycy5wdXNoX2JhY2soeyBhbGxvYygpLCBzdGQ6OndlYWtfcHRyPEMyQnVmZmVyPigpLCBmYWxzZSB9KTsKKyAgICB9Cit9CisKK3NpemVfdCBCdWZmZXJzQXJyYXlJbXBsOjpudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OmNvdW50X2lmKAorICAgICAgICAgICAgbUJ1ZmZlcnMuYmVnaW4oKSwgbUJ1ZmZlcnMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBFbnRyeSAmZW50cnkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZW50cnkub3duZWRCeUNsaWVudDsKKyAgICAgICAgICAgIH0pOworfQorCitzaXplX3QgQnVmZmVyc0FycmF5SW1wbDo6YXJyYXlTaXplKCkgY29uc3QgeworICAgIHJldHVybiBtQnVmZmVycy5zaXplKCk7Cit9CisKKy8vIElucHV0QnVmZmVyc0FycmF5CisKK3ZvaWQgSW5wdXRCdWZmZXJzQXJyYXk6OmluaXRpYWxpemUoCisgICAgICAgIGNvbnN0IEZsZXhCdWZmZXJzSW1wbCAmaW1wbCwKKyAgICAgICAgc2l6ZV90IG1pblNpemUsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBhbGxvY2F0ZSkgeworICAgIG1BbGxvY2F0ZSA9IGFsbG9jYXRlOworICAgIG1JbXBsLmluaXRpYWxpemUoaW1wbCwgbWluU2l6ZSwgYWxsb2NhdGUpOworfQorCit2b2lkIElucHV0QnVmZmVyc0FycmF5OjpnZXRBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgY29uc3QgeworICAgIG1JbXBsLmdldEFycmF5KGFycmF5KTsKK30KKworYm9vbCBJbnB1dEJ1ZmZlcnNBcnJheTo6cmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKmluZGV4LCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqYnVmZmVyKSB7CisgICAgc3A8Q29kZWMyQnVmZmVyPiBjMkJ1ZmZlcjsKKyAgICBzdGF0dXNfdCBlcnIgPSBtSW1wbC5ncmFiQnVmZmVyKGluZGV4LCAmYzJCdWZmZXIpOworICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgYzJCdWZmZXItPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICAgICAgaGFuZGxlSW1hZ2VEYXRhKGMyQnVmZmVyKTsKKyAgICAgICAgKmJ1ZmZlciA9IGMyQnVmZmVyOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIElucHV0QnVmZmVyc0FycmF5OjpyZWxlYXNlQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgYm9vbCByZWxlYXNlKSB7CisgICAgcmV0dXJuIG1JbXBsLnJldHVybkJ1ZmZlcihidWZmZXIsIGMyYnVmZmVyLCByZWxlYXNlKTsKK30KKworYm9vbCBJbnB1dEJ1ZmZlcnNBcnJheTo6ZXhwaXJlQ29tcG9uZW50QnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgeworICAgIHJldHVybiBtSW1wbC5leHBpcmVDb21wb25lbnRCdWZmZXIoYzJidWZmZXIpOworfQorCit2b2lkIElucHV0QnVmZmVyc0FycmF5OjpmbHVzaCgpIHsKKyAgICBtSW1wbC5mbHVzaCgpOworfQorCitzaXplX3QgSW5wdXRCdWZmZXJzQXJyYXk6Om51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLm51bUNsaWVudEJ1ZmZlcnMoKTsKK30KKworc3A8Q29kZWMyQnVmZmVyPiBJbnB1dEJ1ZmZlcnNBcnJheTo6Y3JlYXRlTmV3QnVmZmVyKCkgeworICAgIHJldHVybiBtQWxsb2NhdGUoKTsKK30KKworLy8gTGluZWFySW5wdXRCdWZmZXJzCisKK2Jvb2wgTGluZWFySW5wdXRCdWZmZXJzOjpyZXF1ZXN0TmV3QnVmZmVyKHNpemVfdCAqaW5kZXgsIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpidWZmZXIpIHsKKyAgICBzcDxDb2RlYzJCdWZmZXI+IG5ld0J1ZmZlciA9IGNyZWF0ZU5ld0J1ZmZlcigpOworICAgIGlmIChuZXdCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAqYnVmZmVyID0gbmV3QnVmZmVyOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIExpbmVhcklucHV0QnVmZmVyczo6cmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIsCisgICAgICAgIGJvb2wgcmVsZWFzZSkgeworICAgIHJldHVybiBtSW1wbC5yZWxlYXNlU2xvdChidWZmZXIsIGMyYnVmZmVyLCByZWxlYXNlKTsKK30KKworYm9vbCBMaW5lYXJJbnB1dEJ1ZmZlcnM6OmV4cGlyZUNvbXBvbmVudEJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIHsKKyAgICByZXR1cm4gbUltcGwuZXhwaXJlQ29tcG9uZW50QnVmZmVyKGMyYnVmZmVyKTsKK30KKwordm9pZCBMaW5lYXJJbnB1dEJ1ZmZlcnM6OmZsdXNoKCkgeworICAgIC8vIFRoaXMgaXMgbm8tb3AgYnkgZGVmYXVsdCB1bmxlc3Mgd2UncmUgaW4gYXJyYXkgbW9kZSB3aGVyZSB3ZSBuZWVkIHRvIGtlZXAKKyAgICAvLyB0cmFjayBvZiB0aGUgZmx1c2hlZCB3b3JrLgorICAgIG1JbXBsLmZsdXNoKCk7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+IExpbmVhcklucHV0QnVmZmVyczo6dG9BcnJheU1vZGUoc2l6ZV90IHNpemUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzQXJyYXk+IGFycmF5KAorICAgICAgICAgICAgbmV3IElucHV0QnVmZmVyc0FycmF5KG1Db21wb25lbnROYW1lLmNfc3RyKCksICIxRC1JbnB1dFtOXSIpKTsKKyAgICBhcnJheS0+c2V0UG9vbChtUG9vbCk7CisgICAgYXJyYXktPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICBhcnJheS0+aW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIG1JbXBsLAorICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgIFtwb29sID0gbVBvb2wsIGZvcm1hdCA9IG1Gb3JtYXRdICgpIC0+IHNwPENvZGVjMkJ1ZmZlcj4geworICAgICAgICAgICAgICAgIHJldHVybiBBbGxvYyhwb29sLCBmb3JtYXQpOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHN0ZDo6bW92ZShhcnJheSk7Cit9CisKK3NpemVfdCBMaW5lYXJJbnB1dEJ1ZmZlcnM6Om51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLm51bUNsaWVudEJ1ZmZlcnMoKTsKK30KKworLy8gc3RhdGljCitzcDxDb2RlYzJCdWZmZXI+IExpbmVhcklucHV0QnVmZmVyczo6QWxsb2MoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgaW50MzJfdCBjYXBhY2l0eSA9IGtMaW5lYXJCdWZmZXJTaXplOworICAgICh2b2lkKWZvcm1hdC0+ZmluZEludDMyKEtFWV9NQVhfSU5QVVRfU0laRSwgJmNhcGFjaXR5KTsKKyAgICBpZiAoKHNpemVfdCljYXBhY2l0eSA+IGtNYXhMaW5lYXJCdWZmZXJTaXplKSB7CisgICAgICAgIEFMT0dEKCJjbGllbnQgcmVxdWVzdGVkICVkLCBjYXBwZWQgdG8gJXp1IiwgY2FwYWNpdHksIGtNYXhMaW5lYXJCdWZmZXJTaXplKTsKKyAgICAgICAgY2FwYWNpdHkgPSBrTWF4TGluZWFyQnVmZmVyU2l6ZTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiByZWFkIHVzYWdlIGZyb20gaW50ZgorICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKGNhcGFjaXR5LCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHJldHVybiBMaW5lYXJCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoZm9ybWF0LCBibG9jayk7Cit9CisKK3NwPENvZGVjMkJ1ZmZlcj4gTGluZWFySW5wdXRCdWZmZXJzOjpjcmVhdGVOZXdCdWZmZXIoKSB7CisgICAgcmV0dXJuIEFsbG9jKG1Qb29sLCBtRm9ybWF0KTsKK30KKworLy8gRW5jcnlwdGVkTGluZWFySW5wdXRCdWZmZXJzCisKK0VuY3J5cHRlZExpbmVhcklucHV0QnVmZmVyczo6RW5jcnlwdGVkTGluZWFySW5wdXRCdWZmZXJzKAorICAgICAgICBib29sIHNlY3VyZSwKKyAgICAgICAgY29uc3Qgc3A8TWVtb3J5RGVhbGVyPiAmZGVhbGVyLAorICAgICAgICBjb25zdCBzcDxJQ3J5cHRvPiAmY3J5cHRvLAorICAgICAgICBpbnQzMl90IGhlYXBTZXFOdW0sCisgICAgICAgIHNpemVfdCBjYXBhY2l0eSwKKyAgICAgICAgc2l6ZV90IG51bUlucHV0U2xvdHMsCisgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUpCisgICAgOiBMaW5lYXJJbnB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSksCisgICAgICBtVXNhZ2UoezAsIDB9KSwKKyAgICAgIG1EZWFsZXIoZGVhbGVyKSwKKyAgICAgIG1DcnlwdG8oY3J5cHRvKSwKKyAgICAgIG1NZW1vcnlWZWN0b3IobmV3IHN0ZDo6dmVjdG9yPEVudHJ5Pil7CisgICAgaWYgKHNlY3VyZSkgeworICAgICAgICBtVXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OlJFQURfUFJPVEVDVEVELCAwIH07CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtSW5wdXRTbG90czsgKytpKSB7CisgICAgICAgIHNwPElNZW1vcnk+IG1lbW9yeSA9IG1EZWFsZXItPmFsbG9jYXRlKGNhcGFjaXR5KTsKKyAgICAgICAgaWYgKG1lbW9yeSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBGYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZyb20gZGVhbGVyOiBvbmx5ICV6dSBzbG90cyBhbGxvY2F0ZWQiLAorICAgICAgICAgICAgICAgICAgbU5hbWUsIGkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgbU1lbW9yeVZlY3Rvci0+cHVzaF9iYWNrKHtzdGQ6OndlYWtfcHRyPEMyTGluZWFyQmxvY2s+KCksIG1lbW9yeSwgaGVhcFNlcU51bX0pOworICAgIH0KK30KKworc3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4gRW5jcnlwdGVkTGluZWFySW5wdXRCdWZmZXJzOjp0b0FycmF5TW9kZShzaXplX3Qgc2l6ZSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnNBcnJheT4gYXJyYXkoCisgICAgICAgICAgICBuZXcgSW5wdXRCdWZmZXJzQXJyYXkobUNvbXBvbmVudE5hbWUuY19zdHIoKSwgIjFELUVuY3J5cHRlZElucHV0W05dIikpOworICAgIGFycmF5LT5zZXRQb29sKG1Qb29sKTsKKyAgICBhcnJheS0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgIGFycmF5LT5pbml0aWFsaXplKAorICAgICAgICAgICAgbUltcGwsCisgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgW3Bvb2wgPSBtUG9vbCwKKyAgICAgICAgICAgICBmb3JtYXQgPSBtRm9ybWF0LAorICAgICAgICAgICAgIHVzYWdlID0gbVVzYWdlLAorICAgICAgICAgICAgIG1lbW9yeVZlY3RvciA9IG1NZW1vcnlWZWN0b3JdICgpIC0+IHNwPENvZGVjMkJ1ZmZlcj4geworICAgICAgICAgICAgICAgIHJldHVybiBBbGxvYyhwb29sLCBmb3JtYXQsIHVzYWdlLCBtZW1vcnlWZWN0b3IpOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHN0ZDo6bW92ZShhcnJheSk7Cit9CisKKworLy8gc3RhdGljCitzcDxDb2RlYzJCdWZmZXI+IEVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVyczo6QWxsb2MoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8c3RkOjp2ZWN0b3I8RW5jcnlwdGVkTGluZWFySW5wdXRCdWZmZXJzOjpFbnRyeT4+ICZtZW1vcnlWZWN0b3IpIHsKKyAgICBpbnQzMl90IGNhcGFjaXR5ID0ga0xpbmVhckJ1ZmZlclNpemU7CisgICAgKHZvaWQpZm9ybWF0LT5maW5kSW50MzIoS0VZX01BWF9JTlBVVF9TSVpFLCAmY2FwYWNpdHkpOworICAgIGlmICgoc2l6ZV90KWNhcGFjaXR5ID4ga01heExpbmVhckJ1ZmZlclNpemUpIHsKKyAgICAgICAgQUxPR0QoImNsaWVudCByZXF1ZXN0ZWQgJWQsIGNhcHBlZCB0byAlenUiLCBjYXBhY2l0eSwga01heExpbmVhckJ1ZmZlclNpemUpOworICAgICAgICBjYXBhY2l0eSA9IGtNYXhMaW5lYXJCdWZmZXJTaXplOworICAgIH0KKworICAgIHNwPElNZW1vcnk+IG1lbW9yeTsKKyAgICBzaXplX3Qgc2xvdCA9IDA7CisgICAgaW50MzJfdCBoZWFwU2VxTnVtID0gLTE7CisgICAgZm9yICg7IHNsb3QgPCBtZW1vcnlWZWN0b3ItPnNpemUoKTsgKytzbG90KSB7CisgICAgICAgIGlmIChtZW1vcnlWZWN0b3ItPmF0KHNsb3QpLmJsb2NrLmV4cGlyZWQoKSkgeworICAgICAgICAgICAgbWVtb3J5ID0gbWVtb3J5VmVjdG9yLT5hdChzbG90KS5tZW1vcnk7CisgICAgICAgICAgICBoZWFwU2VxTnVtID0gbWVtb3J5VmVjdG9yLT5hdChzbG90KS5oZWFwU2VxTnVtOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1lbW9yeSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBwb29sLT5mZXRjaExpbmVhckJsb2NrKGNhcGFjaXR5LCB1c2FnZSwgJmJsb2NrKTsKKyAgICBpZiAoZXJyICE9IEMyX09LIHx8IGJsb2NrID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgbWVtb3J5VmVjdG9yLT5hdChzbG90KS5ibG9jayA9IGJsb2NrOworICAgIHJldHVybiBuZXcgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIoZm9ybWF0LCBibG9jaywgbWVtb3J5LCBoZWFwU2VxTnVtKTsKK30KKworc3A8Q29kZWMyQnVmZmVyPiBFbmNyeXB0ZWRMaW5lYXJJbnB1dEJ1ZmZlcnM6OmNyZWF0ZU5ld0J1ZmZlcigpIHsKKyAgICAvLyBUT0RPOiBhbmRyb2lkXzIwMjAKKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworLy8gR3JhcGhpY01ldGFkYXRhSW5wdXRCdWZmZXJzCisKK0dyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVyczo6R3JhcGhpY01ldGFkYXRhSW5wdXRCdWZmZXJzKAorICAgICAgICBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lKQorICAgIDogSW5wdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpLAorICAgICAgbUltcGwobU5hbWUpLAorICAgICAgbVN0b3JlKEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKSkgeyB9CisKK2Jvb2wgR3JhcGhpY01ldGFkYXRhSW5wdXRCdWZmZXJzOjpyZXF1ZXN0TmV3QnVmZmVyKAorICAgICAgICBzaXplX3QgKmluZGV4LCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqYnVmZmVyKSB7CisgICAgc3A8Q29kZWMyQnVmZmVyPiBuZXdCdWZmZXIgPSBjcmVhdGVOZXdCdWZmZXIoKTsKKyAgICBpZiAobmV3QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAqaW5kZXggPSBtSW1wbC5hc3NpZ25TbG90KG5ld0J1ZmZlcik7CisgICAgKmJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBHcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnM6OnJlbGVhc2VCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyLAorICAgICAgICBib29sIHJlbGVhc2UpIHsKKyAgICByZXR1cm4gbUltcGwucmVsZWFzZVNsb3QoYnVmZmVyLCBjMmJ1ZmZlciwgcmVsZWFzZSk7Cit9CisKK2Jvb2wgR3JhcGhpY01ldGFkYXRhSW5wdXRCdWZmZXJzOjpleHBpcmVDb21wb25lbnRCdWZmZXIoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSB7CisgICAgcmV0dXJuIG1JbXBsLmV4cGlyZUNvbXBvbmVudEJ1ZmZlcihjMmJ1ZmZlcik7Cit9CisKK3ZvaWQgR3JhcGhpY01ldGFkYXRhSW5wdXRCdWZmZXJzOjpmbHVzaCgpIHsKKyAgICAvLyBUaGlzIGlzIG5vLW9wIGJ5IGRlZmF1bHQgdW5sZXNzIHdlJ3JlIGluIGFycmF5IG1vZGUgd2hlcmUgd2UgbmVlZCB0byBrZWVwCisgICAgLy8gdHJhY2sgb2YgdGhlIGZsdXNoZWQgd29yay4KK30KKworc3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4gR3JhcGhpY01ldGFkYXRhSW5wdXRCdWZmZXJzOjp0b0FycmF5TW9kZSgKKyAgICAgICAgc2l6ZV90IHNpemUpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jOworICAgIGMyX3N0YXR1c190IGVyciA9IG1TdG9yZS0+ZmV0Y2hBbGxvY2F0b3IobVBvb2wtPmdldEFsbG9jYXRvcklkKCksICZhbGxvYyk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVyc0FycmF5PiBhcnJheSgKKyAgICAgICAgICAgIG5ldyBJbnB1dEJ1ZmZlcnNBcnJheShtQ29tcG9uZW50TmFtZS5jX3N0cigpLCAiMkQtTWV0YUlucHV0W05dIikpOworICAgIGFycmF5LT5zZXRQb29sKG1Qb29sKTsKKyAgICBhcnJheS0+c2V0Rm9ybWF0KG1Gb3JtYXQpOworICAgIGFycmF5LT5pbml0aWFsaXplKAorICAgICAgICAgICAgbUltcGwsCisgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgW2Zvcm1hdCA9IG1Gb3JtYXQsIGFsbG9jXSgpIC0+IHNwPENvZGVjMkJ1ZmZlcj4geworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgR3JhcGhpY01ldGFkYXRhQnVmZmVyKGZvcm1hdCwgYWxsb2MpOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHN0ZDo6bW92ZShhcnJheSk7Cit9CisKK3NpemVfdCBHcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnM6Om51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLm51bUNsaWVudEJ1ZmZlcnMoKTsKK30KKworc3A8Q29kZWMyQnVmZmVyPiBHcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnM6OmNyZWF0ZU5ld0J1ZmZlcigpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jOworICAgIGMyX3N0YXR1c190IGVyciA9IG1TdG9yZS0+ZmV0Y2hBbGxvY2F0b3IobVBvb2wtPmdldEFsbG9jYXRvcklkKCksICZhbGxvYyk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBHcmFwaGljTWV0YWRhdGFCdWZmZXIobUZvcm1hdCwgYWxsb2MpOworfQorCisvLyBHcmFwaGljSW5wdXRCdWZmZXJzCisKK0dyYXBoaWNJbnB1dEJ1ZmZlcnM6OkdyYXBoaWNJbnB1dEJ1ZmZlcnMoCisgICAgICAgIHNpemVfdCBudW1JbnB1dFNsb3RzLCBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lKQorICAgIDogSW5wdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpLAorICAgICAgbUltcGwobU5hbWUpLAorICAgICAgbUxvY2FsQnVmZmVyUG9vbChMb2NhbEJ1ZmZlclBvb2w6OkNyZWF0ZSgKKyAgICAgICAgICAgICAga01heExpbmVhckJ1ZmZlclNpemUgKiBudW1JbnB1dFNsb3RzKSkgeyB9CisKK2Jvb2wgR3JhcGhpY0lucHV0QnVmZmVyczo6cmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKmluZGV4LCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqYnVmZmVyKSB7CisgICAgc3A8Q29kZWMyQnVmZmVyPiBuZXdCdWZmZXIgPSBjcmVhdGVOZXdCdWZmZXIoKTsKKyAgICBpZiAobmV3QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAqaW5kZXggPSBtSW1wbC5hc3NpZ25TbG90KG5ld0J1ZmZlcik7CisgICAgaGFuZGxlSW1hZ2VEYXRhKG5ld0J1ZmZlcik7CisgICAgKmJ1ZmZlciA9IG5ld0J1ZmZlcjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBHcmFwaGljSW5wdXRCdWZmZXJzOjpyZWxlYXNlQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgYm9vbCByZWxlYXNlKSB7CisgICAgcmV0dXJuIG1JbXBsLnJlbGVhc2VTbG90KGJ1ZmZlciwgYzJidWZmZXIsIHJlbGVhc2UpOworfQorCitib29sIEdyYXBoaWNJbnB1dEJ1ZmZlcnM6OmV4cGlyZUNvbXBvbmVudEJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpIHsKKyAgICByZXR1cm4gbUltcGwuZXhwaXJlQ29tcG9uZW50QnVmZmVyKGMyYnVmZmVyKTsKK30KKwordm9pZCBHcmFwaGljSW5wdXRCdWZmZXJzOjpmbHVzaCgpIHsKKyAgICAvLyBUaGlzIGlzIG5vLW9wIGJ5IGRlZmF1bHQgdW5sZXNzIHdlJ3JlIGluIGFycmF5IG1vZGUgd2hlcmUgd2UgbmVlZCB0byBrZWVwCisgICAgLy8gdHJhY2sgb2YgdGhlIGZsdXNoZWQgd29yay4KK30KKworc3RkOjp1bmlxdWVfcHRyPElucHV0QnVmZmVycz4gR3JhcGhpY0lucHV0QnVmZmVyczo6dG9BcnJheU1vZGUoc2l6ZV90IHNpemUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzQXJyYXk+IGFycmF5KAorICAgICAgICAgICAgbmV3IElucHV0QnVmZmVyc0FycmF5KG1Db21wb25lbnROYW1lLmNfc3RyKCksICIyRC1CQi1JbnB1dFtOXSIpKTsKKyAgICBhcnJheS0+c2V0UG9vbChtUG9vbCk7CisgICAgYXJyYXktPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICBhcnJheS0+aW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIG1JbXBsLAorICAgICAgICAgICAgc2l6ZSwKKyAgICAgICAgICAgIFtwb29sID0gbVBvb2wsIGZvcm1hdCA9IG1Gb3JtYXQsIGxicCA9IG1Mb2NhbEJ1ZmZlclBvb2xdKCkgLT4gc3A8Q29kZWMyQnVmZmVyPiB7CisgICAgICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSA9IHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9OworICAgICAgICAgICAgICAgIHJldHVybiBBbGxvY2F0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBwb29sLCBmb3JtYXQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMiwgdXNhZ2UsIGxicCk7CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gc3RkOjptb3ZlKGFycmF5KTsKK30KKworc2l6ZV90IEdyYXBoaWNJbnB1dEJ1ZmZlcnM6Om51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLm51bUNsaWVudEJ1ZmZlcnMoKTsKK30KKworc3A8Q29kZWMyQnVmZmVyPiBHcmFwaGljSW5wdXRCdWZmZXJzOjpjcmVhdGVOZXdCdWZmZXIoKSB7CisgICAgLy8gVE9ETzogcmVhZCB1c2FnZSBmcm9tIGludGYKKyAgICBDMk1lbW9yeVVzYWdlIHVzYWdlID0geyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH07CisgICAgcmV0dXJuIEFsbG9jYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIG1Qb29sLCBtRm9ybWF0LCBIQUxfUElYRUxfRk9STUFUX1lWMTIsIHVzYWdlLCBtTG9jYWxCdWZmZXJQb29sKTsKK30KKworLy8gT3V0cHV0QnVmZmVyc0FycmF5CisKK3ZvaWQgT3V0cHV0QnVmZmVyc0FycmF5Ojppbml0aWFsaXplKAorICAgICAgICBjb25zdCBGbGV4QnVmZmVyc0ltcGwgJmltcGwsCisgICAgICAgIHNpemVfdCBtaW5TaXplLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2NhdGUpIHsKKyAgICBtQWxsb2MgPSBhbGxvY2F0ZTsKKyAgICBtSW1wbC5pbml0aWFsaXplKGltcGwsIG1pblNpemUsIGFsbG9jYXRlKTsKK30KKworc3RhdHVzX3QgT3V0cHV0QnVmZmVyc0FycmF5OjpyZWdpc3RlckJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBzaXplX3QgKmluZGV4LAorICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqY2xpZW50QnVmZmVyKSB7CisgICAgc3A8Q29kZWMyQnVmZmVyPiBjMkJ1ZmZlcjsKKyAgICBzdGF0dXNfdCBlcnIgPSBtSW1wbC5ncmFiQnVmZmVyKAorICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAmYzJCdWZmZXIsCisgICAgICAgICAgICBbYnVmZmVyXShjb25zdCBzcDxDb2RlYzJCdWZmZXI+ICZjbGllbnRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gY2xpZW50QnVmZmVyLT5jYW5Db3B5KGJ1ZmZlcik7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoZXJyID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgIEFMT0dWKCJbJXNdIGJ1ZmZlcnMgdGVtcG9yYXJpbHkgbm90IGF2YWlsYWJsZSIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9IGVsc2UgaWYgKGVyciAhPSBPSykgeworICAgICAgICBBTE9HRCgiWyVzXSBncmFiQnVmZmVyIGZhaWxlZDogJWQiLCBtTmFtZSwgZXJyKTsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgYzJCdWZmZXItPnNldEZvcm1hdChtRm9ybWF0KTsKKyAgICBpZiAoIWMyQnVmZmVyLT5jb3B5KGJ1ZmZlcikpIHsKKyAgICAgICAgQUxPR0QoIlslc10gY29weSBidWZmZXIgZmFpbGVkIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7CisgICAgfQorICAgIHN1Ym1pdChjMkJ1ZmZlcik7CisgICAgaGFuZGxlSW1hZ2VEYXRhKGMyQnVmZmVyKTsKKyAgICAqY2xpZW50QnVmZmVyID0gYzJCdWZmZXI7CisgICAgQUxPR1YoIlslc10gZ3JhYmJlZCBidWZmZXIgJXp1IiwgbU5hbWUsICppbmRleCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBPdXRwdXRCdWZmZXJzQXJyYXk6OnJlZ2lzdGVyQ3NkKAorICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICpjc2QsCisgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpjbGllbnRCdWZmZXIpIHsKKyAgICBzcDxDb2RlYzJCdWZmZXI+IGMyQnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1JbXBsLmdyYWJCdWZmZXIoCisgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgICZjMkJ1ZmZlciwKKyAgICAgICAgICAgIFtjc2RdKGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gJmNsaWVudEJ1ZmZlcikgeworICAgICAgICAgICAgICAgIHJldHVybiBjbGllbnRCdWZmZXItPmJhc2UoKSAhPSBudWxscHRyCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBjbGllbnRCdWZmZXItPmNhcGFjaXR5KCkgPj0gY3NkLT5mbGV4Q291bnQoKTsKKyAgICAgICAgICAgIH0pOworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisgICAgbWVtY3B5KGMyQnVmZmVyLT5iYXNlKCksIGNzZC0+bS52YWx1ZSwgY3NkLT5mbGV4Q291bnQoKSk7CisgICAgYzJCdWZmZXItPnNldFJhbmdlKDAsIGNzZC0+ZmxleENvdW50KCkpOworICAgIGMyQnVmZmVyLT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgKmNsaWVudEJ1ZmZlciA9IGMyQnVmZmVyOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBPdXRwdXRCdWZmZXJzQXJyYXk6OnJlbGVhc2VCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyKSB7CisgICAgcmV0dXJuIG1JbXBsLnJldHVybkJ1ZmZlcihidWZmZXIsIGMyYnVmZmVyLCB0cnVlKTsKK30KKwordm9pZCBPdXRwdXRCdWZmZXJzQXJyYXk6OmZsdXNoKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSB7CisgICAgKHZvaWQpZmx1c2hlZFdvcms7CisgICAgbUltcGwuZmx1c2goKTsKKyAgICBpZiAobVNraXBDdXRCdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtU2tpcEN1dEJ1ZmZlci0+Y2xlYXIoKTsKKyAgICB9Cit9CisKK3ZvaWQgT3V0cHV0QnVmZmVyc0FycmF5OjpnZXRBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICphcnJheSkgY29uc3QgeworICAgIG1JbXBsLmdldEFycmF5KGFycmF5KTsKK30KKworc2l6ZV90IE91dHB1dEJ1ZmZlcnNBcnJheTo6bnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwubnVtQ2xpZW50QnVmZmVycygpOworfQorCit2b2lkIE91dHB1dEJ1ZmZlcnNBcnJheTo6cmVhbGxvYyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgeworICAgIHN3aXRjaCAoYzJidWZmZXItPmRhdGEoKS50eXBlKCkpIHsKKyAgICAgICAgY2FzZSBDMkJ1ZmZlckRhdGE6OkxJTkVBUjogeworICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSA9IGtMaW5lYXJCdWZmZXJTaXplOworICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmbGluZWFyX2Jsb2NrcyA9IGMyYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKCk7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBibG9ja19zaXplID0gbGluZWFyX2Jsb2Nrcy5mcm9udCgpLnNpemUoKTsKKyAgICAgICAgICAgIGlmIChibG9ja19zaXplIDwga01heExpbmVhckJ1ZmZlclNpemUgLyAyKSB7CisgICAgICAgICAgICAgICAgc2l6ZSA9IGJsb2NrX3NpemUgKiAyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzaXplID0ga01heExpbmVhckJ1ZmZlclNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtQWxsb2MgPSBbZm9ybWF0ID0gbUZvcm1hdCwgc2l6ZV0geworICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTG9jYWxMaW5lYXJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcihzaXplKSk7CisgICAgICAgICAgICB9OworICAgICAgICAgICAgQUxPR0QoIlslc10gcmVhbGxvY2F0aW5nIHdpdGggbGluZWFyIGJ1ZmZlciBvZiBzaXplICV1IiwgbU5hbWUsIHNpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEMyQnVmZmVyRGF0YTo6R1JBUEhJQzogeworICAgICAgICAgICAgLy8gVGhpcyBpcyBvbmx5IGNhbGxlZCBmb3IgUmF3R3JhcGhpY091dHB1dEJ1ZmZlcnMuCisgICAgICAgICAgICBtQWxsb2MgPSBbZm9ybWF0ID0gbUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICBsYnAgPSBMb2NhbEJ1ZmZlclBvb2w6OkNyZWF0ZShrTWF4TGluZWFyQnVmZmVyU2l6ZSAqIG1JbXBsLmFycmF5U2l6ZSgpKV0geworICAgICAgICAgICAgICAgIHJldHVybiBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGVFbXB0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsYnBdKHNpemVfdCBjYXBhY2l0eSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYnAtPm5ld0J1ZmZlcihjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBBTE9HRCgiWyVzXSByZWFsbG9jYXRpbmcgd2l0aCBncmFwaGljIGJ1ZmZlcjogZm9ybWF0ID0gJXMiLAorICAgICAgICAgICAgICAgICAgbU5hbWUsIG1Gb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgQzJCdWZmZXJEYXRhOjpJTlZBTElEOiAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgY2FzZSBDMkJ1ZmZlckRhdGE6OkxJTkVBUl9DSFVOS1M6ICAgW1tmYWxsdGhyb3VnaF1dOworICAgICAgICBjYXNlIEMyQnVmZmVyRGF0YTo6R1JBUEhJQ19DSFVOS1M6ICBbW2ZhbGx0aHJvdWdoXV07CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRCgiVW5zdXBwb3J0ZWQgdHlwZTogJWQiLCAoaW50KWMyYnVmZmVyLT5kYXRhKCkudHlwZSgpKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbUltcGwucmVhbGxvYyhtQWxsb2MpOworfQorCit2b2lkIE91dHB1dEJ1ZmZlcnNBcnJheTo6Z3JvdyhzaXplX3QgbmV3U2l6ZSkgeworICAgIG1JbXBsLmdyb3cobmV3U2l6ZSwgbUFsbG9jKTsKK30KKworLy8gRmxleE91dHB1dEJ1ZmZlcnMKKworc3RhdHVzX3QgRmxleE91dHB1dEJ1ZmZlcnM6OnJlZ2lzdGVyQnVmZmVyKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIsCisgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpjbGllbnRCdWZmZXIpIHsKKyAgICBzcDxDb2RlYzJCdWZmZXI+IG5ld0J1ZmZlciA9IHdyYXAoYnVmZmVyKTsKKyAgICBpZiAobmV3QnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgbmV3QnVmZmVyLT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgKmluZGV4ID0gbUltcGwuYXNzaWduU2xvdChuZXdCdWZmZXIpOworICAgIGhhbmRsZUltYWdlRGF0YShuZXdCdWZmZXIpOworICAgICpjbGllbnRCdWZmZXIgPSBuZXdCdWZmZXI7CisgICAgQUxPR1YoIlslc10gcmVnaXN0ZXJlZCBidWZmZXIgJXp1IiwgbU5hbWUsICppbmRleCk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBGbGV4T3V0cHV0QnVmZmVyczo6cmVnaXN0ZXJDc2QoCisgICAgICAgIGNvbnN0IEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQgKmNzZCwKKyAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmNsaWVudEJ1ZmZlcikgeworICAgIHNwPENvZGVjMkJ1ZmZlcj4gbmV3QnVmZmVyID0gbmV3IExvY2FsTGluZWFyQnVmZmVyKAorICAgICAgICAgICAgbUZvcm1hdCwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGNzZC0+bS52YWx1ZSwgY3NkLT5mbGV4Q291bnQoKSkpOworICAgICppbmRleCA9IG1JbXBsLmFzc2lnblNsb3QobmV3QnVmZmVyKTsKKyAgICAqY2xpZW50QnVmZmVyID0gbmV3QnVmZmVyOworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBGbGV4T3V0cHV0QnVmZmVyczo6cmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIpIHsKKyAgICByZXR1cm4gbUltcGwucmVsZWFzZVNsb3QoYnVmZmVyLCBjMmJ1ZmZlciwgdHJ1ZSk7Cit9CisKK3ZvaWQgRmxleE91dHB1dEJ1ZmZlcnM6OmZsdXNoKAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yaykgeworICAgICh2b2lkKSBmbHVzaGVkV29yazsKKyAgICAvLyBUaGlzIGlzIG5vLW9wIGJ5IGRlZmF1bHQgdW5sZXNzIHdlJ3JlIGluIGFycmF5IG1vZGUgd2hlcmUgd2UgbmVlZCB0byBrZWVwCisgICAgLy8gdHJhY2sgb2YgdGhlIGZsdXNoZWQgd29yay4KK30KKworc3RkOjp1bmlxdWVfcHRyPE91dHB1dEJ1ZmZlcnM+IEZsZXhPdXRwdXRCdWZmZXJzOjp0b0FycmF5TW9kZShzaXplX3Qgc2l6ZSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzQXJyYXk+IGFycmF5KG5ldyBPdXRwdXRCdWZmZXJzQXJyYXkobUNvbXBvbmVudE5hbWUuY19zdHIoKSkpOworICAgIGFycmF5LT5zZXRGb3JtYXQobUZvcm1hdCk7CisgICAgYXJyYXktPnRyYW5zZmVyU2tpcEN1dEJ1ZmZlcihtU2tpcEN1dEJ1ZmZlcik7CisgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jID0gZ2V0QWxsb2MoKTsKKyAgICBhcnJheS0+aW5pdGlhbGl6ZShtSW1wbCwgc2l6ZSwgYWxsb2MpOworICAgIHJldHVybiBzdGQ6Om1vdmUoYXJyYXkpOworfQorCitzaXplX3QgRmxleE91dHB1dEJ1ZmZlcnM6Om51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLm51bUNsaWVudEJ1ZmZlcnMoKTsKK30KKworLy8gTGluZWFyT3V0cHV0QnVmZmVycworCit2b2lkIExpbmVhck91dHB1dEJ1ZmZlcnM6OmZsdXNoKAorICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yaykgeworICAgIGlmIChtU2tpcEN1dEJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1Ta2lwQ3V0QnVmZmVyLT5jbGVhcigpOworICAgIH0KKyAgICBGbGV4T3V0cHV0QnVmZmVyczo6Zmx1c2goZmx1c2hlZFdvcmspOworfQorCitzcDxDb2RlYzJCdWZmZXI+IExpbmVhck91dHB1dEJ1ZmZlcnM6OndyYXAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCJbJXNdIHVzaW5nIGEgZHVtbXkgYnVmZmVyIiwgbU5hbWUpOworICAgICAgICByZXR1cm4gbmV3IExvY2FsTGluZWFyQnVmZmVyKG1Gb3JtYXQsIG5ldyBBQnVmZmVyKDApKTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSAhPSBDMkJ1ZmZlckRhdGE6OkxJTkVBUikgeworICAgICAgICBBTE9HVigiWyVzXSBub24tbGluZWFyIGJ1ZmZlciAlZCIsIG1OYW1lLCBidWZmZXItPmRhdGEoKS50eXBlKCkpOworICAgICAgICAvLyBXZSBleHBlY3QgbGluZWFyIG91dHB1dCBidWZmZXJzIGZyb20gdGhlIGNvbXBvbmVudC4KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgQUxPR1YoIlslc10gbm8gbGluZWFyIGJ1ZmZlcnMiLCBtTmFtZSk7CisgICAgICAgIC8vIFdlIGV4cGVjdCBvbmUgYW5kIG9ubHkgb25lIGxpbmVhciBibG9jayBmcm9tIHRoZSBjb21wb25lbnQuCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBzcDxDb2RlYzJCdWZmZXI+IGNsaWVudEJ1ZmZlciA9IENvbnN0TGluZWFyQmxvY2tCdWZmZXI6OkFsbG9jYXRlKG1Gb3JtYXQsIGJ1ZmZlcik7CisgICAgaWYgKGNsaWVudEJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJbJXNdIENvbnN0TGluZWFyQmxvY2tCdWZmZXI6OkFsbG9jYXRlIGZhaWxlZCIsIG1OYW1lKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHN1Ym1pdChjbGllbnRCdWZmZXIpOworICAgIHJldHVybiBjbGllbnRCdWZmZXI7Cit9CisKK3N0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBMaW5lYXJPdXRwdXRCdWZmZXJzOjpnZXRBbGxvYygpIHsKKyAgICByZXR1cm4gW2Zvcm1hdCA9IG1Gb3JtYXRdeworICAgICAgICAvLyBUT0RPOiBwcm9wZXIgbWF4IG91dHB1dCBzaXplCisgICAgICAgIHJldHVybiBuZXcgTG9jYWxMaW5lYXJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcihrTGluZWFyQnVmZmVyU2l6ZSkpOworICAgIH07Cit9CisKKy8vIEdyYXBoaWNPdXRwdXRCdWZmZXJzCisKK3NwPENvZGVjMkJ1ZmZlcj4gR3JhcGhpY091dHB1dEJ1ZmZlcnM6OndyYXAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgcmV0dXJuIG5ldyBEdW1teUNvbnRhaW5lckJ1ZmZlcihtRm9ybWF0LCBidWZmZXIpOworfQorCitzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gR3JhcGhpY091dHB1dEJ1ZmZlcnM6OmdldEFsbG9jKCkgeworICAgIHJldHVybiBbZm9ybWF0ID0gbUZvcm1hdF17CisgICAgICAgIHJldHVybiBuZXcgRHVtbXlDb250YWluZXJCdWZmZXIoZm9ybWF0KTsKKyAgICB9OworfQorCisvLyBSYXdHcmFwaGljT3V0cHV0QnVmZmVycworCitSYXdHcmFwaGljT3V0cHV0QnVmZmVyczo6UmF3R3JhcGhpY091dHB1dEJ1ZmZlcnMoCisgICAgICAgIHNpemVfdCBudW1PdXRwdXRTbG90cywgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSkKKyAgICA6IEZsZXhPdXRwdXRCdWZmZXJzKGNvbXBvbmVudE5hbWUsIG5hbWUpLAorICAgICAgbUxvY2FsQnVmZmVyUG9vbChMb2NhbEJ1ZmZlclBvb2w6OkNyZWF0ZSgKKyAgICAgICAgICAgICAga01heExpbmVhckJ1ZmZlclNpemUgKiBudW1PdXRwdXRTbG90cykpIHsgfQorCitzcDxDb2RlYzJCdWZmZXI+IFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzOjp3cmFwKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGMyYnVmZmVyID0gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlRW1wdHkoCisgICAgICAgICAgICAgICAgbUZvcm1hdCwKKyAgICAgICAgICAgICAgICBbbGJwID0gbUxvY2FsQnVmZmVyUG9vbF0oc2l6ZV90IGNhcGFjaXR5KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBsYnAtPm5ld0J1ZmZlcihjYXBhY2l0eSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChjMmJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRCgiWyVzXSBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGVFbXB0eSBmYWlsZWQiLCBtTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBjMmJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisgICAgICAgIHJldHVybiBjMmJ1ZmZlcjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlKAorICAgICAgICAgICAgICAgIG1Gb3JtYXQsCisgICAgICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgICAgIFtsYnAgPSBtTG9jYWxCdWZmZXJQb29sXShzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxicC0+bmV3QnVmZmVyKGNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9Cit9CisKK3N0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBSYXdHcmFwaGljT3V0cHV0QnVmZmVyczo6Z2V0QWxsb2MoKSB7CisgICAgcmV0dXJuIFtmb3JtYXQgPSBtRm9ybWF0LCBsYnAgPSBtTG9jYWxCdWZmZXJQb29sXXsKKyAgICAgICAgcmV0dXJuIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZUVtcHR5KAorICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICBbbGJwXShzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxicC0+bmV3QnVmZmVyKGNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9OworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0J1ZmZlcnMuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNiNmI4MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNCdWZmZXJzLmgKQEAgLTAsMCArMSw4NzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENDT0RFQ19CVUZGRVJTX0hfCisKKyNkZWZpbmUgQ0NPREVDX0JVRkZFUlNfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KKworI2luY2x1ZGUgIkNvZGVjMkJ1ZmZlci5oIgorI2luY2x1ZGUgIlNraXBDdXRCdWZmZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjb25zdGV4cHIgc2l6ZV90IGtMaW5lYXJCdWZmZXJTaXplID0gMTA0ODU3NjsKKy8vIFRoaXMgY2FuIGZpdCA0SyBSR0JBIGZyYW1lLCBhbmQgbW9zdCBsaWtlbHkgY2xpZW50IHdvbid0IG5lZWQgbW9yZSB0aGFuIHRoaXMuCitjb25zdGV4cHIgc2l6ZV90IGtNYXhMaW5lYXJCdWZmZXJTaXplID0gNDA5NiAqIDIzMDQgKiA0OworCisvKioKKyAqIEJhc2UgY2xhc3MgZm9yIHJlcHJlc2VudGF0aW9uIG9mIGJ1ZmZlcnMgYXQgb25lIHBvcnQuCisgKi8KK2NsYXNzIENDb2RlY0J1ZmZlcnMgeworcHVibGljOgorICAgIENDb2RlY0J1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJCdWZmZXJzIikKKyAgICAgICAgOiBtQ29tcG9uZW50TmFtZShjb21wb25lbnROYW1lKSwKKyAgICAgICAgICBtQ2hhbm5lbE5hbWUoc3RkOjpzdHJpbmcoY29tcG9uZW50TmFtZSkgKyAiOiIgKyBuYW1lKSwKKyAgICAgICAgICBtTmFtZShtQ2hhbm5lbE5hbWUuY19zdHIoKSkgeworICAgIH0KKyAgICB2aXJ0dWFsIH5DQ29kZWNCdWZmZXJzKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogU2V0IGZvcm1hdCBmb3IgTWVkaWFDb2RlYy1mYWNpbmcgYnVmZmVycy4KKyAgICAgKi8KKyAgICB2b2lkIHNldEZvcm1hdChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBjb3B5IG9mIGN1cnJlbnQgZm9ybWF0LgorICAgICAqLworICAgIHNwPEFNZXNzYWdlPiBkdXBGb3JtYXQoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgYnVmZmVycyBhcmUgb3BlcmF0aW5nIHVuZGVyIGFycmF5IG1vZGUuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGlzQXJyYXlNb2RlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIC8qKgorICAgICAqIEZpbGxzIHRoZSB2ZWN0b3Igd2l0aCBNZWRpYUNvZGVjQnVmZmVyJ3MgaWYgaW4gYXJyYXkgbW9kZTsgb3RoZXJ3aXNlLAorICAgICAqIG5vLW9wLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBnZXRBcnJheShWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4+ICopIGNvbnN0IHt9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gbnVtYmVyIG9mIGJ1ZmZlcnMgdGhlIGNsaWVudCBvd25zLgorICAgICAqLworICAgIHZpcnR1YWwgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBFeGFtaW5lIGltYWdlIGRhdGEgZnJvbSB0aGUgYnVmZmVyIGFuZCB1cGRhdGUgdGhlIGZvcm1hdCBpZiBuZWNlc3NhcnkuCisgICAgICovCisgICAgdm9pZCBoYW5kbGVJbWFnZURhdGEoY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmYnVmZmVyKTsKKworcHJvdGVjdGVkOgorICAgIHN0ZDo6c3RyaW5nIG1Db21wb25lbnROYW1lOyAvLy88IG5hbWUgb2YgY29tcG9uZW50IGZvciBkZWJ1Z2dpbmcKKyAgICBzdGQ6OnN0cmluZyBtQ2hhbm5lbE5hbWU7IC8vLzwgbmFtZSBvZiBjaGFubmVsIGZvciBkZWJ1Z2dpbmcKKyAgICBjb25zdCBjaGFyICptTmFtZTsgLy8vPCBDLXN0cmluZyB2ZXJzaW9uIG9mIGNoYW5uZWwgbmFtZQorICAgIC8vIEZvcm1hdCB0byBiZSB1c2VkIGZvciBjcmVhdGluZyBNZWRpYUNvZGVjLWZhY2luZyBidWZmZXJzLgorICAgIHNwPEFNZXNzYWdlPiBtRm9ybWF0OworCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENDb2RlY0J1ZmZlcnMpOworfTsKKworY2xhc3MgSW5wdXRCdWZmZXJzIDogcHVibGljIENDb2RlY0J1ZmZlcnMgeworcHVibGljOgorICAgIElucHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIklucHV0W10iKQorICAgICAgICA6IENDb2RlY0J1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSkgeyB9CisgICAgdmlydHVhbCB+SW5wdXRCdWZmZXJzKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogU2V0IGEgYmxvY2sgcG9vbCB0byBvYnRhaW4gaW5wdXQgbWVtb3J5IGJsb2Nrcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldFBvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCkgeyBtUG9vbCA9IHBvb2w7IH0KKworICAgIC8qKgorICAgICAqIEdldCBhIG5ldyBNZWRpYUNvZGVjQnVmZmVyIGZvciBpbnB1dCBhbmQgaXRzIGNvcnJlc3BvbmRpbmcgaW5kZXguCisgICAgICogUmV0dXJucyBmYWxzZSBpZiBubyBuZXcgYnVmZmVyIGNhbiBiZSBvYnRhaW5lZCBhdCB0aGUgbW9tZW50LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCByZXF1ZXN0TmV3QnVmZmVyKHNpemVfdCAqaW5kZXgsIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpidWZmZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlbGVhc2UgdGhlIGJ1ZmZlciBvYnRhaW5lZCBmcm9tIHJlcXVlc3ROZXdCdWZmZXIoKSBhbmQgZ2V0IHRoZQorICAgICAqIGFzc29jaWF0ZWQgQzJCdWZmZXIgb2JqZWN0IGJhY2suIFJldHVybnMgdHJ1ZSBpZiB0aGUgYnVmZmVyIHdhcyBvbiBmaWxlCisgICAgICogYW5kIHJlbGVhc2VkIHN1Y2Nlc3NmdWxseS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgcmVsZWFzZSkgPSAwOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgYnVmZmVyIHRoYXQgaXMgbm8gbG9uZ2VyIHVzZWQgYnkgdGhlIGNvZGVjIHByb2Nlc3MuIFJldHVybgorICAgICAqIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGJ1ZmZlciB3YXMgb24gZmlsZSBhbmQgcmVsZWFzZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgPSAwOworCisgICAgLyoqCisgICAgICogRmx1c2ggaW50ZXJuYWwgc3RhdGUuIEFmdGVyIHRoaXMgY2FsbCwgbm8gaW5kZXggb3IgYnVmZmVyIHByZXZpb3VzbHkKKyAgICAgKiByZXR1cm5lZCBmcm9tIHJlcXVlc3ROZXdCdWZmZXIoKSBpcyB2YWxpZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgZmx1c2goKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYXJyYXktYmFja2VkIHZlcnNpb24gb2YgaW5wdXQgYnVmZmVycy4gVGhlIHJldHVybmVkIG9iamVjdAorICAgICAqIHNoYWxsIHJldGFpbiB0aGUgaW50ZXJuYWwgc3RhdGUgc28gdGhhdCBpdCB3aWxsIGhvbm9yIGluZGV4IGFuZAorICAgICAqIGJ1ZmZlciBmcm9tIHByZXZpb3VzIGNhbGxzIG9mIHJlcXVlc3ROZXdCdWZmZXIoKS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKHNpemVfdCBzaXplKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBidWZmZXIgb2J0YWluZWQgZnJvbSByZXF1ZXN0TmV3QnVmZmVyKCksIGFuZCBjcmVhdGUgYSBkZWVwCisgICAgICogY29weSBjbG9uZSBvZiB0aGUgYnVmZmVyLgorICAgICAqCisgICAgICogXHJldHVybiAgdGhlIGRlZXAgY29weSBjbG9uZSBvZiB0aGUgYnVmZmVyOyBudWxscHRyIGlmIGNsb25pbmcgaXMgbm90CisgICAgICogICAgICAgICAgcG9zc2libGUuCisgICAgICovCisgICAgc3A8Q29kZWMyQnVmZmVyPiBjbG9uZUFuZFJlbGVhc2VCdWZmZXIoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcik7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHNwPENvZGVjMkJ1ZmZlcj4gY3JlYXRlTmV3QnVmZmVyKCkgPSAwOworCisgICAgLy8gUG9vbCB0byBvYnRhaW4gYmxvY2tzIGZvciBpbnB1dCBidWZmZXJzLgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbVBvb2w7CisKK3ByaXZhdGU6CisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW5wdXRCdWZmZXJzKTsKK307CisKK2NsYXNzIE91dHB1dEJ1ZmZlcnMgOiBwdWJsaWMgQ0NvZGVjQnVmZmVycyB7CitwdWJsaWM6CisgICAgT3V0cHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIk91dHB1dCIpCisgICAgICAgIDogQ0NvZGVjQnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKyAgICB2aXJ0dWFsIH5PdXRwdXRCdWZmZXJzKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogUmVnaXN0ZXIgb3V0cHV0IEMyQnVmZmVyIGZyb20gdGhlIGNvbXBvbmVudCBhbmQgb2J0YWluIGNvcnJlc3BvbmRpbmcKKyAgICAgKiBpbmRleCBhbmQgTWVkaWFDb2RlY0J1ZmZlciBvYmplY3QuIFJldHVybnMgZmFsc2UgaWYgcmVnaXN0cmF0aW9uCisgICAgICogZmFpbHMuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlckJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqY2xpZW50QnVmZmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWdpc3RlciBjb2RlYyBzcGVjaWZpYyBkYXRhIGFzIGEgYnVmZmVyIHRvIGJlIGNvbnNpc3RlbnQgd2l0aAorICAgICAqIE1lZGlhQ29kZWMgYmVoYXZpb3IuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlckNzZCgKKyAgICAgICAgICAgIGNvbnN0IEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQgKiAvKiBjc2QgKi8sCisgICAgICAgICAgICBzaXplX3QgKiAvKiBpbmRleCAqLywKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICogLyogY2xpZW50QnVmZmVyICovKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZWxlYXNlIHRoZSBidWZmZXIgb2J0YWluZWQgZnJvbSByZWdpc3RlckJ1ZmZlcigpIGFuZCBnZXQgdGhlCisgICAgICogYXNzb2NpYXRlZCBDMkJ1ZmZlciBvYmplY3QgYmFjay4gUmV0dXJucyB0cnVlIGlmIHRoZSBidWZmZXIgd2FzIG9uIGZpbGUKKyAgICAgKiBhbmQgcmVsZWFzZWQgc3VjY2Vzc2Z1bGx5LgorICAgICAqLworICAgIHZpcnR1YWwgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIEZsdXNoIGludGVybmFsIHN0YXRlLiBBZnRlciB0aGlzIGNhbGwsIG5vIGluZGV4IG9yIGJ1ZmZlciBwcmV2aW91c2x5CisgICAgICogcmV0dXJuZWQgZnJvbSByZWdpc3RlckJ1ZmZlcigpIGlzIHZhbGlkLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBmbHVzaChjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yaykgPSAwOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFycmF5LWJhY2tlZCB2ZXJzaW9uIG9mIG91dHB1dCBidWZmZXJzLiBUaGUgcmV0dXJuZWQgb2JqZWN0CisgICAgICogc2hhbGwgcmV0YWluIHRoZSBpbnRlcm5hbCBzdGF0ZSBzbyB0aGF0IGl0IHdpbGwgaG9ub3IgaW5kZXggYW5kCisgICAgICogYnVmZmVyIGZyb20gcHJldmlvdXMgY2FsbHMgb2YgcmVnaXN0ZXJCdWZmZXIoKS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxPdXRwdXRCdWZmZXJzPiB0b0FycmF5TW9kZShzaXplX3Qgc2l6ZSkgPSAwOworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSBTa2lwQ3V0QnVmZmVyIG9iamVjdC4KKyAgICAgKi8KKyAgICB2b2lkIGluaXRTa2lwQ3V0QnVmZmVyKAorICAgICAgICAgICAgaW50MzJfdCBkZWxheSwgaW50MzJfdCBwYWRkaW5nLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIC8qKgorICAgICAqIFVwZGF0ZSB0aGUgU2tpcEN1dEJ1ZmZlciBvYmplY3QuIE5vLW9wIGlmIGl0J3MgbmV2ZXIgaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgdm9pZCB1cGRhdGVTa2lwQ3V0QnVmZmVyKGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgLyoqCisgICAgICogU3VibWl0IGJ1ZmZlciB0byBTa2lwQ3V0QnVmZmVyIG9iamVjdCwgaWYgaW5pdGlhbGl6ZWQuCisgICAgICovCisgICAgdm9pZCBzdWJtaXQoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2ZlciBTa2lwQ3V0QnVmZmVyIG9iamVjdCB0byB0aGUgb3RoZXIgQnVmZmVycyBvYmplY3QuCisgICAgICovCisgICAgdm9pZCB0cmFuc2ZlclNraXBDdXRCdWZmZXIoY29uc3Qgc3A8U2tpcEN1dEJ1ZmZlcj4gJnNjYik7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxTa2lwQ3V0QnVmZmVyPiBtU2tpcEN1dEJ1ZmZlcjsKKworcHJpdmF0ZToKKyAgICBpbnQzMl90IG1EZWxheTsKKyAgICBpbnQzMl90IG1QYWRkaW5nOworICAgIGludDMyX3QgbVNhbXBsZVJhdGU7CisKKyAgICB2b2lkIHNldFNraXBDdXRCdWZmZXIoaW50MzJfdCBza2lwLCBpbnQzMl90IGN1dCwgaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoT3V0cHV0QnVmZmVycyk7Cit9OworCisvKioKKyAqIFNpbXBsZSBsb2NhbCBidWZmZXIgcG9vbCBiYWNrZWQgYnkgc3RkOjp2ZWN0b3IuCisgKi8KK2NsYXNzIExvY2FsQnVmZmVyUG9vbCA6IHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPExvY2FsQnVmZmVyUG9vbD4geworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZSBhIG5ldyBMb2NhbEJ1ZmZlclBvb2wgb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHBvb2xDYXBhY2l0eSAgbWF4IHRvdGFsIHNpemUgb2YgYnVmZmVycyBtYW5hZ2VkIGJ5IHRoaXMgcG9vbC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gIGEgbmV3bHkgY3JlYXRlZCBwb29sIG9iamVjdC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gQ3JlYXRlKHNpemVfdCBwb29sQ2FwYWNpdHkpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIGFuIEFCdWZmZXIgb2JqZWN0IHdob3NlIHNpemUgaXMgYXQgbGVhc3QgfGNhcGFjaXR5fC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGNhcGFjaXR5ICByZXF1ZXN0ZWQgY2FwYWNpdHkKKyAgICAgKiBccmV0dXJuICBudWxscHRyIGlmIHRoZSBwb29sIGNhcGFjaXR5IGlzIHJlYWNoZWQKKyAgICAgKiAgICAgICAgICBhbiBBQnVmZmVyIG9iamVjdCBvdGhlcndpc2UuCisgICAgICovCisgICAgc3A8QUJ1ZmZlcj4gbmV3QnVmZmVyKHNpemVfdCBjYXBhY2l0eSk7CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQUJ1ZmZlciBiYWNrZWQgYnkgc3RkOjp2ZWN0b3IuCisgICAgICovCisgICAgY2xhc3MgVmVjdG9yQnVmZmVyIDogcHVibGljIDo6YW5kcm9pZDo6QUJ1ZmZlciB7CisgICAgcHVibGljOgorICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0IGEgVmVjdG9yQnVmZmVyIGJ5IHRha2luZyB0aGUgb3duZXJzaGlwIG9mIHN1cHBsaWVkIHZlY3Rvci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIHZlYyAgIGJhY2tpbmcgdmVjdG9yIG9mIHRoZSBidWZmZXIuIHRoaXMgb2JqZWN0IHRha2VzCisgICAgICAgICAqICAgICAgICAgICAgICBvd25lcnNoaXAgYXQgY29uc3RydWN0aW9uLgorICAgICAgICAgKiBccGFyYW0gcG9vbCAgYSBMb2NhbEJ1ZmZlclBvb2wgb2JqZWN0IHRvIHJldHVybiB0aGUgdmVjdG9yIGF0CisgICAgICAgICAqICAgICAgICAgICAgICBkZXN0cnVjdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIFZlY3RvckJ1ZmZlcihzdGQ6OnZlY3Rvcjx1aW50OF90PiAmJnZlYywgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gJnBvb2wpOworCisgICAgICAgIH5WZWN0b3JCdWZmZXIoKSBvdmVycmlkZTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IG1WZWM7CisgICAgICAgIHN0ZDo6d2Vha19wdHI8TG9jYWxCdWZmZXJQb29sPiBtUG9vbDsKKyAgICB9OworCisgICAgTXV0ZXggbU11dGV4OworICAgIHNpemVfdCBtUG9vbENhcGFjaXR5OworICAgIHNpemVfdCBtVXNlZFNpemU7CisgICAgc3RkOjpsaXN0PHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBtUG9vbDsKKworICAgIC8qKgorICAgICAqIFByaXZhdGUgY29uc3RydWN0b3IgdG8gcHJldmVudCBjb25zdHJ1Y3Rpbmcgbm9uLW1hbmFnZWQgTG9jYWxCdWZmZXJQb29sLgorICAgICAqLworICAgIGV4cGxpY2l0IExvY2FsQnVmZmVyUG9vbChzaXplX3QgcG9vbENhcGFjaXR5KQorICAgICAgICA6IG1Qb29sQ2FwYWNpdHkocG9vbENhcGFjaXR5KSwgbVVzZWRTaXplKDApIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUYWtlIGJhY2sgdGhlIG93bmVyc2hpcCBvZiB2ZWMgZnJvbSB0aGUgZGVzdHJ1Y3RlZCBWZWN0b3JCdWZmZXIgYW5kIHB1dAorICAgICAqIGl0IGluIGZyb250IG9mIHRoZSBwb29sLgorICAgICAqLworICAgIHZvaWQgcmV0dXJuVmVjdG9yKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICYmdmVjKTsKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKExvY2FsQnVmZmVyUG9vbCk7Cit9OworCitjbGFzcyBCdWZmZXJzQXJyYXlJbXBsOworCisvKioKKyAqIEZsZXhpYmxlIGJ1ZmZlciBzbG90cyBpbXBsZW1lbnRhdGlvbi4KKyAqLworY2xhc3MgRmxleEJ1ZmZlcnNJbXBsIHsKK3B1YmxpYzoKKyAgICBGbGV4QnVmZmVyc0ltcGwoY29uc3QgY2hhciAqbmFtZSkKKyAgICAgICAgOiBtSW1wbE5hbWUoc3RkOjpzdHJpbmcobmFtZSkgKyAiLkltcGwiKSwKKyAgICAgICAgICBtTmFtZShtSW1wbE5hbWUuY19zdHIoKSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBBc3NpZ24gYW4gZW1wdHkgc2xvdCBmb3IgYSBidWZmZXIgYW5kIHJldHVybiB0aGUgaW5kZXguIElmIHRoZXJlJ3Mgbm8KKyAgICAgKiBlbXB0eSBzbG90LCBqdXN0IGFkZCBvbmUgYXQgdGhlIGVuZCBhbmQgcmV0dXJuIGl0LgorICAgICAqCisgICAgICogXHBhcmFtIGJ1ZmZlcltpbl0gIGEgbmV3IGJ1ZmZlciB0byBhc3NpZ24gYSBzbG90LgorICAgICAqIFxyZXR1cm4gICAgICAgICAgICBpbmRleCBvZiB0aGUgYXNzaWduZWQgc2xvdC4KKyAgICAgKi8KKyAgICBzaXplX3QgYXNzaWduU2xvdChjb25zdCBzcDxDb2RlYzJCdWZmZXI+ICZidWZmZXIpOworCisgICAgLyoqCisgICAgICogUmVsZWFzZSB0aGUgc2xvdCBmcm9tIHRoZSBjbGllbnQsIGFuZCBnZXQgdGhlIEMyQnVmZmVyIG9iamVjdCBiYWNrIGZyb20KKyAgICAgKiB0aGUgcHJldmlvdXNseSBhc3NpZ25lZCBidWZmZXIuIE5vdGUgdGhhdCB0aGUgc2xvdCBpcyBub3QgY29tcGxldGVseSBmcmVlCisgICAgICogdW50aWwgdGhlIHJldHVybmVkIEMyQnVmZmVyIG9iamVjdCBpcyBmcmVlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGJ1ZmZlcltpbl0gICAgICAgIHRoZSBidWZmZXIgcHJldmlvdXNseSBhc3NpZ25lZCBhIHNsb3QuCisgICAgICogXHBhcmFtICAgYzJidWZmZXJbaW4sb3V0XSAgcG9pbnRlciB0byBDMkJ1ZmZlciB0byBiZSBwb3B1bGF0ZWQuIElnbm9yZWQKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBudWxsLgorICAgICAqIFxyZXR1cm4gIHRydWUgIGlmIHRoZSBidWZmZXIgaXMgc3VjY2Vzc2Z1bGx5IHJlbGVhc2VkIGZyb20gYSBzbG90CisgICAgICogICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCByZWxlYXNlU2xvdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgcmVsZWFzZSk7CisKKyAgICAvKioKKyAgICAgKiBFeHBpcmUgdGhlIEMyQnVmZmVyIG9iamVjdCBpbiB0aGUgc2xvdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGMyYnVmZmVyW2luXSAgQzJCdWZmZXIgb2JqZWN0IHdoaWNoIHRoZSBjb21wb25lbnQgcmVsZWFzZWQuCisgICAgICogXHJldHVybiAgdHJ1ZSAgaWYgdGhlIGJ1ZmZlciBpcyBmb3VuZCBpbiBvbmUgb2YgdGhlIHNsb3RzIGFuZAorICAgICAqICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseSByZWxlYXNlZAorICAgICAqICAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKTsKKworICAgIC8qKgorICAgICAqIFRoZSBjbGllbnQgYWJhbmRvbmVkIGFsbCBrbm93biBidWZmZXJzLCBzbyByZWNsYWltIHRoZSBvd25lcnNoaXAuCisgICAgICovCisgICAgdm9pZCBmbHVzaCgpOworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnVmZmVycyB0aGF0IGFyZSBzZW50IHRvIHRoZSBjbGllbnQgYnV0IG5vdCByZWxlYXNlZAorICAgICAqIHlldC4KKyAgICAgKi8KKyAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJuIHRoZSBudW1iZXIgb2YgYnVmZmVycyB0aGF0IGFyZSBzZW50IHRvIHRoZSBjb21wb25lbnQgYnV0IG5vdAorICAgICAqIHJldHVybmVkIGJhY2sgeWV0LgorICAgICAqLworICAgIHNpemVfdCBudW1Db21wb25lbnRCdWZmZXJzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEJ1ZmZlcnNBcnJheUltcGw7CisKKyAgICBzdGQ6OnN0cmluZyBtSW1wbE5hbWU7IC8vLzwgbmFtZSBmb3IgZGVidWdnaW5nCisgICAgY29uc3QgY2hhciAqbU5hbWU7IC8vLzwgQy1zdHJpbmcgdmVyc2lvbiBvZiBuYW1lCisKKyAgICBzdHJ1Y3QgRW50cnkgeworICAgICAgICBzcDxDb2RlYzJCdWZmZXI+IGNsaWVudEJ1ZmZlcjsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlcj4gY29tcEJ1ZmZlcjsKKyAgICB9OworICAgIHN0ZDo6dmVjdG9yPEVudHJ5PiBtQnVmZmVyczsKK307CisKKy8qKgorICogU3RhdGljIGJ1ZmZlciBzbG90cyBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBhIGZpeGVkLXNpemUgYXJyYXkuCisgKi8KK2NsYXNzIEJ1ZmZlcnNBcnJheUltcGwgeworcHVibGljOgorICAgIEJ1ZmZlcnNBcnJheUltcGwoKQorICAgICAgICA6IG1JbXBsTmFtZSgiQnVmZmVyc0FycmF5SW1wbCIpLAorICAgICAgICAgIG1OYW1lKG1JbXBsTmFtZS5jX3N0cigpKSB7IH0KKworICAgIC8qKgorICAgICAqIEluaXRpYWxpemUgYnVmZmVyIGFycmF5IGZyb20gdGhlIG9yaWdpbmFsIHxpbXBsfC4gVGhlIGJ1ZmZlcnMga25vd24gYnkKKyAgICAgKiB0aGUgY2xpZW50IGlzIHByZXNlcnZlZCwgYW5kIHRoZSBlbXB0eSBzbG90cyBhcmUgcG9wdWxhdGVkIHNvIHRoYXQgdGhlCisgICAgICogYXJyYXkgc2l6ZSBpcyBhdCBsZWFzdCB8bWluU2l6ZXwuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW1wbFtpbl0gICAgICBGbGV4QnVmZmVyc0ltcGwgb2JqZWN0IHVzZWQgc28gZmFyLgorICAgICAqIFxwYXJhbSBtaW5TaXplW2luXSAgIG1pbmltdW0gc2l6ZSBvZiB0aGUgYnVmZmVyIGFycmF5LgorICAgICAqIFxwYXJhbSBhbGxvY2F0ZVtpbl0gIGZ1bmN0aW9uIHRvIGFsbG9jYXRlIGEgY2xpZW50IGJ1ZmZlciBmb3IgYW4gZW1wdHkgc2xvdC4KKyAgICAgKi8KKyAgICB2b2lkIGluaXRpYWxpemUoCisgICAgICAgICAgICBjb25zdCBGbGV4QnVmZmVyc0ltcGwgJmltcGwsCisgICAgICAgICAgICBzaXplX3QgbWluU2l6ZSwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBhbGxvY2F0ZSk7CisKKyAgICAvKioKKyAgICAgKiBHcmFiIGEgYnVmZmVyIGZyb20gdGhlIHVuZGVybHlpbmcgYXJyYXkgd2hpY2ggbWF0Y2hlcyB0aGUgY3JpdGVyaWEuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW5kZXhbb3V0XSAgICBpbmRleCBvZiB0aGUgc2xvdC4KKyAgICAgKiBccGFyYW0gYnVmZmVyW291dF0gICB0aGUgbWF0Y2hpbmcgYnVmZmVyLgorICAgICAqIFxwYXJhbSBtYXRjaFtpbl0gICAgIGEgZnVuY3Rpb24gdG8gdGVzdCB3aGV0aGVyIHRoZSBidWZmZXIgbWF0Y2hlcyB0aGUKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBjcml0ZXJpYSBvciBub3QuCisgICAgICogXHJldHVybiBPSyAgICAgICAgICAgaWYgc3VjY2Vzc2Z1bCwKKyAgICAgKiAgICAgICAgIFdPVUxEX0JMT0NLICBpZiBzbG90cyBhcmUgYmVpbmcgdXNlZCwKKyAgICAgKiAgICAgICAgIE5PX01FTU9SWSAgICBpZiBubyBzbG90IG1hdGNoZXMgdGhlIGNyaXRlcmlhLCBldmVuIHRob3VnaCBpdCdzCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlCisgICAgICovCisgICAgc3RhdHVzX3QgZ3JhYkJ1ZmZlcigKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxDb2RlYzJCdWZmZXI+ICpidWZmZXIsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3A8Q29kZWMyQnVmZmVyPiAmKT4gbWF0Y2ggPQorICAgICAgICAgICAgICAgIFtdKGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gJikgeyByZXR1cm4gdHJ1ZTsgfSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gdGhlIGJ1ZmZlciBmcm9tIHRoZSBjbGllbnQsIGFuZCBnZXQgdGhlIEMyQnVmZmVyIG9iamVjdCBiYWNrIGZyb20KKyAgICAgKiB0aGUgYnVmZmVyLiBOb3RlIHRoYXQgdGhlIHNsb3QgaXMgbm90IGNvbXBsZXRlbHkgZnJlZSB1bnRpbCB0aGUgcmV0dXJuZWQKKyAgICAgKiBDMkJ1ZmZlciBvYmplY3QgaXMgZnJlZWQuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBidWZmZXJbaW5dICAgICAgICB0aGUgYnVmZmVyIHByZXZpb3VzbHkgZ3JhYmJlZC4KKyAgICAgKiBccGFyYW0gICBjMmJ1ZmZlcltpbixvdXRdICBwb2ludGVyIHRvIEMyQnVmZmVyIHRvIGJlIHBvcHVsYXRlZC4gSWdub3JlZAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG51bGwuCisgICAgICogXHJldHVybiAgdHJ1ZSAgaWYgdGhlIGJ1ZmZlciBpcyBzdWNjZXNzZnVsbHkgcmV0dXJuZWQKKyAgICAgKiAgICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIHJldHVybkJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgcmVsZWFzZSk7CisKKyAgICAvKioKKyAgICAgKiBFeHBpcmUgdGhlIEMyQnVmZmVyIG9iamVjdCBpbiB0aGUgc2xvdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGMyYnVmZmVyW2luXSAgQzJCdWZmZXIgb2JqZWN0IHdoaWNoIHRoZSBjb21wb25lbnQgcmVsZWFzZWQuCisgICAgICogXHJldHVybiAgdHJ1ZSAgaWYgdGhlIGJ1ZmZlciBpcyBmb3VuZCBpbiBvbmUgb2YgdGhlIHNsb3RzIGFuZAorICAgICAqICAgICAgICAgICAgICAgIHN1Y2Nlc3NmdWxseSByZWxlYXNlZAorICAgICAqICAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgZXhwaXJlQ29tcG9uZW50QnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKTsKKworICAgIC8qKgorICAgICAqIFBvcHVsYXRlIHxhcnJheXwgd2l0aCB0aGUgdW5kZXJseWluZyBidWZmZXIgYXJyYXkuCisgICAgICoKKyAgICAgKiBccGFyYW0gYXJyYXlbb3V0XSAgYW4gYXJyYXkgdG8gYmUgZmlsbGVkIHdpdGggdGhlIHVuZGVybHlpbmcgYnVmZmVyIGFycmF5LgorICAgICAqLworICAgIHZvaWQgZ2V0QXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIGNvbnN0OworCisgICAgLyoqCisgICAgICogVGhlIGNsaWVudCBhYmFuZG9uZWQgYWxsIGtub3duIGJ1ZmZlcnMsIHNvIHJlY2xhaW0gdGhlIG93bmVyc2hpcC4KKyAgICAgKi8KKyAgICB2b2lkIGZsdXNoKCk7CisKKyAgICAvKioKKyAgICAgKiBSZWFsbG9jYXRlIHRoZSBhcnJheSB3aXRoIHRoZSBnaXZlbiBhbGxvY2F0aW9uIGZ1bmN0aW9uLgorICAgICAqCisgICAgICogXHBhcmFtIGFsbG9jW2luXSB0aGUgYWxsb2NhdGlvbiBmdW5jdGlvbiBmb3IgY2xpZW50IGJ1ZmZlcnMuCisgICAgICovCisgICAgdm9pZCByZWFsbG9jKHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBhbGxvYyk7CisKKyAgICAvKioKKyAgICAgKiBHcm93IHRoZSBhcnJheSB0byB0aGUgbmV3IHNpemUuIEl0IGlzIGEgcHJvZ3JhbW1pbmcgZXJyb3IgdG8gc3VwcGx5CisgICAgICogc21hbGxlciBzaXplIGFzIHRoZSBuZXcgc2l6ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBuZXdTaXplW2luXSBuZXcgc2l6ZSBvZiB0aGUgYXJyYXkuCisgICAgICogXHBhcmFtIGFsbG9jW2luXSAgIHRoZSBhbGxsb2NhdGlvbiBmdW5jdGlvbiBmb3IgY2xpZW50IGJ1ZmZlcnMgdG8gZmlsbAorICAgICAqICAgICAgICAgICAgICAgICAgICB0aGUgbmV3IGVtcHR5IHNsb3RzLgorICAgICAqLworICAgIHZvaWQgZ3JvdyhzaXplX3QgbmV3U2l6ZSwgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ1ZmZlcnMgdGhhdCBhcmUgc2VudCB0byB0aGUgY2xpZW50IGJ1dCBub3QgcmVsZWFzZWQKKyAgICAgKiB5ZXQuCisgICAgICovCisgICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYXJyYXkuCisgICAgICovCisgICAgc2l6ZV90IGFycmF5U2l6ZSgpIGNvbnN0OworCitwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1JbXBsTmFtZTsgLy8vPCBuYW1lIGZvciBkZWJ1Z2dpbmcKKyAgICBjb25zdCBjaGFyICptTmFtZTsgLy8vPCBDLXN0cmluZyB2ZXJzaW9uIG9mIG5hbWUKKworICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICAgIGNvbnN0IHNwPENvZGVjMkJ1ZmZlcj4gY2xpZW50QnVmZmVyOworICAgICAgICBzdGQ6OndlYWtfcHRyPEMyQnVmZmVyPiBjb21wQnVmZmVyOworICAgICAgICBib29sIG93bmVkQnlDbGllbnQ7CisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxFbnRyeT4gbUJ1ZmZlcnM7Cit9OworCitjbGFzcyBJbnB1dEJ1ZmZlcnNBcnJheSA6IHB1YmxpYyBJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIElucHV0QnVmZmVyc0FycmF5KGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiSW5wdXRbTl0iKQorICAgICAgICA6IElucHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKyAgICB+SW5wdXRCdWZmZXJzQXJyYXkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBJbml0aWFsaXplIHRoaXMgb2JqZWN0IGZyb20gdGhlIG5vbi1hcnJheSBzdGF0ZS4gV2Uga2VlcCBleGlzdGluZyBzbG90cworICAgICAqIGF0IHRoZSBzYW1lIGluZGV4LCBhbmQgZm9yIGVtcHR5IHNsb3RzIHdlIGFsbG9jYXRlIGNsaWVudCBidWZmZXJzIHdpdGgKKyAgICAgKiB0aGUgZ2l2ZW4gYWxsb2NhdGUgZnVuY3Rpb24uIElmIHRoZSBudW1iZXIgb2Ygc2xvdHMgaXMgbGVzcyB0aGFuIG1pblNpemUsCisgICAgICogd2UgZmlsbCB0aGUgYXJyYXkgdG8gdGhlIG1pbmltdW0gc2l6ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpbXBsW2luXSAgICAgIGV4aXN0aW5nIG5vbi1hcnJheSBzdGF0ZQorICAgICAqIFxwYXJhbSBtaW5TaXplW2luXSAgIG1pbmltdW0gc2l6ZSBvZiB0aGUgYXJyYXkKKyAgICAgKiBccGFyYW0gYWxsb2NhdGVbaW5dICBhbGxvY2F0ZSBmdW5jdGlvbiB0byBmaWxsIGVtcHR5IHNsb3RzCisgICAgICovCisgICAgdm9pZCBpbml0aWFsaXplKAorICAgICAgICAgICAgY29uc3QgRmxleEJ1ZmZlcnNJbXBsICZpbXBsLAorICAgICAgICAgICAgc2l6ZV90IG1pblNpemUsCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gYWxsb2NhdGUpOworCisgICAgYm9vbCBpc0FycmF5TW9kZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKHNpemVfdCkgZmluYWwgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICB2b2lkIGdldEFycmF5KFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPj4gKmFycmF5KSBjb25zdCBmaW5hbDsKKworICAgIGJvb2wgcmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKmluZGV4LCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqYnVmZmVyKSBvdmVycmlkZTsKKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgcmVsZWFzZSkgb3ZlcnJpZGU7CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSBvdmVycmlkZTsKKworICAgIHZvaWQgZmx1c2goKSBvdmVycmlkZTsKKworICAgIHNpemVfdCBudW1DbGllbnRCdWZmZXJzKCkgY29uc3QgZmluYWw7CisKK3Byb3RlY3RlZDoKKyAgICBzcDxDb2RlYzJCdWZmZXI+IGNyZWF0ZU5ld0J1ZmZlcigpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIEJ1ZmZlcnNBcnJheUltcGwgbUltcGw7CisgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IG1BbGxvY2F0ZTsKK307CisKK2NsYXNzIExpbmVhcklucHV0QnVmZmVycyA6IHB1YmxpYyBJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIExpbmVhcklucHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjFELUlucHV0IikKKyAgICAgICAgOiBJbnB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSksCisgICAgICAgICAgbUltcGwobU5hbWUpIHsgfQorICAgIH5MaW5lYXJJbnB1dEJ1ZmZlcnMoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBib29sIHJlcXVlc3ROZXdCdWZmZXIoc2l6ZV90ICppbmRleCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgICBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIsCisgICAgICAgICAgICBib29sIHJlbGVhc2UpIG92ZXJyaWRlOworCisgICAgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGU7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPiB0b0FycmF5TW9kZShzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisKKyAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IGZpbmFsOworCitwcm90ZWN0ZWQ6CisgICAgc3A8Q29kZWMyQnVmZmVyPiBjcmVhdGVOZXdCdWZmZXIoKSBvdmVycmlkZTsKKworICAgIEZsZXhCdWZmZXJzSW1wbCBtSW1wbDsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgc3A8Q29kZWMyQnVmZmVyPiBBbGxvYygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gJnBvb2wsIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKK307CisKK2NsYXNzIEVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVycyA6IHB1YmxpYyBMaW5lYXJJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIEVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVycygKKyAgICAgICAgICAgIGJvb2wgc2VjdXJlLAorICAgICAgICAgICAgY29uc3Qgc3A8TWVtb3J5RGVhbGVyPiAmZGVhbGVyLAorICAgICAgICAgICAgY29uc3Qgc3A8SUNyeXB0bz4gJmNyeXB0bywKKyAgICAgICAgICAgIGludDMyX3QgaGVhcFNlcU51bSwKKyAgICAgICAgICAgIHNpemVfdCBjYXBhY2l0eSwKKyAgICAgICAgICAgIHNpemVfdCBudW1JbnB1dFNsb3RzLAorICAgICAgICAgICAgY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJFbmNyeXB0ZWRJbnB1dCIpOworCisgICAgfkVuY3J5cHRlZExpbmVhcklucHV0QnVmZmVycygpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKHNpemVfdCBzaXplKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHNwPENvZGVjMkJ1ZmZlcj4gY3JlYXRlTmV3QnVmZmVyKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RydWN0IEVudHJ5IHsKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgc3A8SU1lbW9yeT4gbWVtb3J5OworICAgICAgICBpbnQzMl90IGhlYXBTZXFOdW07CisgICAgfTsKKworICAgIHN0YXRpYyBzcDxDb2RlYzJCdWZmZXI+IEFsbG9jKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAmcG9vbCwKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxzdGQ6OnZlY3RvcjxFbnRyeT4+ICZtZW1vcnlWZWN0b3IpOworCisgICAgQzJNZW1vcnlVc2FnZSBtVXNhZ2U7CisgICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyOworICAgIHNwPElDcnlwdG8+IG1DcnlwdG87CisgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6dmVjdG9yPEVudHJ5Pj4gbU1lbW9yeVZlY3RvcjsKK307CisKK2NsYXNzIEdyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVycyA6IHB1YmxpYyBJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIEdyYXBoaWNNZXRhZGF0YUlucHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjJELU1ldGFJbnB1dCIpOworICAgIH5HcmFwaGljTWV0YWRhdGFJbnB1dEJ1ZmZlcnMoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBib29sIHJlcXVlc3ROZXdCdWZmZXIoc2l6ZV90ICppbmRleCwgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgICBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAqYzJidWZmZXIsCisgICAgICAgICAgICBib29sIHJlbGVhc2UpIG92ZXJyaWRlOworCisgICAgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZjMmJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGZsdXNoKCkgb3ZlcnJpZGU7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPiB0b0FycmF5TW9kZShzaXplX3Qgc2l6ZSkgZmluYWw7CisKKyAgICBzaXplX3QgbnVtQ2xpZW50QnVmZmVycygpIGNvbnN0IGZpbmFsOworCitwcm90ZWN0ZWQ6CisgICAgc3A8Q29kZWMyQnVmZmVyPiBjcmVhdGVOZXdCdWZmZXIoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBGbGV4QnVmZmVyc0ltcGwgbUltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IG1TdG9yZTsKK307CisKK2NsYXNzIEdyYXBoaWNJbnB1dEJ1ZmZlcnMgOiBwdWJsaWMgSW5wdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljSW5wdXRCdWZmZXJzKAorICAgICAgICAgICAgc2l6ZV90IG51bUlucHV0U2xvdHMsIGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMkQtQkItSW5wdXQiKTsKKyAgICB+R3JhcGhpY0lucHV0QnVmZmVycygpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIGJvb2wgcmVxdWVzdE5ld0J1ZmZlcihzaXplX3QgKmluZGV4LCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqYnVmZmVyKSBvdmVycmlkZTsKKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICZidWZmZXIsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlciwKKyAgICAgICAgICAgIGJvb2wgcmVsZWFzZSkgb3ZlcnJpZGU7CisKKyAgICBib29sIGV4cGlyZUNvbXBvbmVudEJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmMyYnVmZmVyKSBvdmVycmlkZTsKKworICAgIHZvaWQgZmx1c2goKSBvdmVycmlkZTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dEJ1ZmZlcnM+IHRvQXJyYXlNb2RlKAorICAgICAgICAgICAgc2l6ZV90IHNpemUpIGZpbmFsOworCisgICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCBmaW5hbDsKKworcHJvdGVjdGVkOgorICAgIHNwPENvZGVjMkJ1ZmZlcj4gY3JlYXRlTmV3QnVmZmVyKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgRmxleEJ1ZmZlcnNJbXBsIG1JbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxMb2NhbEJ1ZmZlclBvb2w+IG1Mb2NhbEJ1ZmZlclBvb2w7Cit9OworCitjbGFzcyBEdW1teUlucHV0QnVmZmVycyA6IHB1YmxpYyBJbnB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIER1bW15SW5wdXRCdWZmZXJzKGNvbnN0IGNoYXIgKmNvbXBvbmVudE5hbWUsIGNvbnN0IGNoYXIgKm5hbWUgPSAiMkQtSW5wdXQiKQorICAgICAgICA6IElucHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKyAgICB+RHVtbXlJbnB1dEJ1ZmZlcnMoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBib29sIHJlcXVlc3ROZXdCdWZmZXIoc2l6ZV90ICosIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICopIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgcmVsZWFzZUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNCdWZmZXI+ICYsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKiwgYm9vbCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBleHBpcmVDb21wb25lbnRCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdm9pZCBmbHVzaCgpIG92ZXJyaWRlIHsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRCdWZmZXJzPiB0b0FycmF5TW9kZShzaXplX3QpIGZpbmFsIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYm9vbCBpc0FycmF5TW9kZSgpIGNvbnN0IGZpbmFsIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHZvaWQgZ2V0QXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIGNvbnN0IGZpbmFsIHsKKyAgICAgICAgYXJyYXktPmNsZWFyKCk7CisgICAgfQorCisgICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCBmaW5hbCB7CisgICAgICAgIHJldHVybiAwdTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBzcDxDb2RlYzJCdWZmZXI+IGNyZWF0ZU5ld0J1ZmZlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfTsKKworY2xhc3MgT3V0cHV0QnVmZmVyc0FycmF5IDogcHVibGljIE91dHB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIE91dHB1dEJ1ZmZlcnNBcnJheShjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIk91dHB1dFtOXSIpCisgICAgICAgIDogT3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSB7IH0KKyAgICB+T3V0cHV0QnVmZmVyc0FycmF5KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogSW5pdGlhbGl6ZSB0aGlzIG9iamVjdCBmcm9tIHRoZSBub24tYXJyYXkgc3RhdGUuIFdlIGtlZXAgZXhpc3Rpbmcgc2xvdHMKKyAgICAgKiBhdCB0aGUgc2FtZSBpbmRleCwgYW5kIGZvciBlbXB0eSBzbG90cyB3ZSBhbGxvY2F0ZSBjbGllbnQgYnVmZmVycyB3aXRoCisgICAgICogdGhlIGdpdmVuIGFsbG9jYXRlIGZ1bmN0aW9uLiBJZiB0aGUgbnVtYmVyIG9mIHNsb3RzIGlzIGxlc3MgdGhhbiBtaW5TaXplLAorICAgICAqIHdlIGZpbGwgdGhlIGFycmF5IHRvIHRoZSBtaW5pbXVtIHNpemUuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW1wbFtpbl0gICAgICBleGlzdGluZyBub24tYXJyYXkgc3RhdGUKKyAgICAgKiBccGFyYW0gbWluU2l6ZVtpbl0gICBtaW5pbXVtIHNpemUgb2YgdGhlIGFycmF5CisgICAgICogXHBhcmFtIGFsbG9jYXRlW2luXSAgYWxsb2NhdGUgZnVuY3Rpb24gdG8gZmlsbCBlbXB0eSBzbG90cworICAgICAqLworICAgIHZvaWQgaW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIGNvbnN0IEZsZXhCdWZmZXJzSW1wbCAmaW1wbCwKKyAgICAgICAgICAgIHNpemVfdCBtaW5TaXplLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGFsbG9jYXRlKTsKKworICAgIGJvb2wgaXNBcnJheU1vZGUoKSBjb25zdCBmaW5hbCB7IHJldHVybiB0cnVlOyB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4gdG9BcnJheU1vZGUoc2l6ZV90KSBmaW5hbCB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHN0YXR1c190IHJlZ2lzdGVyQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpjbGllbnRCdWZmZXIpIGZpbmFsOworCisgICAgc3RhdHVzX3QgcmVnaXN0ZXJDc2QoCisgICAgICAgICAgICBjb25zdCBDMlN0cmVhbUluaXREYXRhSW5mbzo6b3V0cHV0ICpjc2QsCisgICAgICAgICAgICBzaXplX3QgKmluZGV4LAorICAgICAgICAgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gKmNsaWVudEJ1ZmZlcikgZmluYWw7CisKKyAgICBib29sIHJlbGVhc2VCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICpjMmJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGZsdXNoKGNvbnN0IHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJmZsdXNoZWRXb3JrKSBvdmVycmlkZTsKKworICAgIHZvaWQgZ2V0QXJyYXkoVmVjdG9yPHNwPE1lZGlhQ29kZWNCdWZmZXI+PiAqYXJyYXkpIGNvbnN0IGZpbmFsOworCisgICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCBmaW5hbDsKKworICAgIC8qKgorICAgICAqIFJlYWxsb2NhdGUgdGhlIGFycmF5LCBmaWxsZWQgd2l0aCBidWZmZXJzIHdpdGggdGhlIHNhbWUgc2l6ZSBhcyBnaXZlbgorICAgICAqIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBjMmJ1ZmZlcltpbl0gdGhlIHJlZmVyZW5jZSBidWZmZXIKKyAgICAgKi8KKyAgICB2b2lkIHJlYWxsb2MoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYzJidWZmZXIpOworCisgICAgLyoqCisgICAgICogR3JvdyB0aGUgYXJyYXkgdG8gdGhlIG5ldyBzaXplLiBJdCBpcyBhIHByb2dyYW1taW5nIGVycm9yIHRvIHN1cHBseQorICAgICAqIHNtYWxsZXIgc2l6ZSBhcyB0aGUgbmV3IHNpemUuCisgICAgICoKKyAgICAgKiBccGFyYW0gbmV3U2l6ZVtpbl0gbmV3IHNpemUgb2YgdGhlIGFycmF5LgorICAgICAqLworICAgIHZvaWQgZ3JvdyhzaXplX3QgbmV3U2l6ZSk7CisKK3ByaXZhdGU6CisgICAgQnVmZmVyc0FycmF5SW1wbCBtSW1wbDsKKyAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gbUFsbG9jOworfTsKKworY2xhc3MgRmxleE91dHB1dEJ1ZmZlcnMgOiBwdWJsaWMgT3V0cHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgRmxleE91dHB1dEJ1ZmZlcnMoY29uc3QgY2hhciAqY29tcG9uZW50TmFtZSwgY29uc3QgY2hhciAqbmFtZSA9ICJPdXRwdXRbXSIpCisgICAgICAgIDogT3V0cHV0QnVmZmVycyhjb21wb25lbnROYW1lLCBuYW1lKSwKKyAgICAgICAgICBtSW1wbChtTmFtZSkgeyB9CisKKyAgICBzdGF0dXNfdCByZWdpc3RlckJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHNpemVfdCAqaW5kZXgsCisgICAgICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiAqY2xpZW50QnVmZmVyKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IHJlZ2lzdGVyQ3NkKAorICAgICAgICAgICAgY29uc3QgQzJTdHJlYW1Jbml0RGF0YUluZm86Om91dHB1dCAqY3NkLAorICAgICAgICAgICAgc2l6ZV90ICppbmRleCwKKyAgICAgICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+ICpjbGllbnRCdWZmZXIpIGZpbmFsOworCisgICAgYm9vbCByZWxlYXNlQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gKmMyYnVmZmVyKSBvdmVycmlkZTsKKworICAgIHZvaWQgZmx1c2goCisgICAgICAgICAgICBjb25zdCBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZmbHVzaGVkV29yaykgb3ZlcnJpZGU7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8T3V0cHV0QnVmZmVycz4gdG9BcnJheU1vZGUoc2l6ZV90IHNpemUpIG92ZXJyaWRlOworCisgICAgc2l6ZV90IG51bUNsaWVudEJ1ZmZlcnMoKSBjb25zdCBmaW5hbDsKKworICAgIC8qKgorICAgICAqIFJldHVybiBhbiBhcHByb3ByaWF0ZSBDb2RlYzJCdWZmZXIgb2JqZWN0IGZvciB0aGUgdHlwZSBvZiBidWZmZXJzLgorICAgICAqCisgICAgICogXHBhcmFtIGJ1ZmZlciAgQzJCdWZmZXIgb2JqZWN0IHRvIHdyYXAuCisgICAgICoKKyAgICAgKiBccmV0dXJuICBhcHByb3ByaWF0ZSBDb2RlYzJCdWZmZXIgb2JqZWN0IHRvIHdyYXAgfGJ1ZmZlcnwuCisgICAgICovCisgICAgdmlydHVhbCBzcDxDb2RlYzJCdWZmZXI+IHdyYXAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBmdW5jdGlvbiB0aGF0IGFsbG9jYXRlcyBhbiBhcHByb3ByaWF0ZSBDb2RlYzJCdWZmZXIgb2JqZWN0IGZvcgorICAgICAqIHRoZSB0eXBlIG9mIGJ1ZmZlcnMsIHRvIGJlIHVzZWQgYXMgYW4gZW1wdHkgYXJyYXkgYnVmZmVyLiBUaGUgZnVuY3Rpb24KKyAgICAgKiBtdXN0IG5vdCByZWZlciB0byB0aGlzIHBvaW50ZXIsIHNpbmNlIGl0IG1heSBiZSB1c2VkIGFmdGVyIHRoaXMgb2JqZWN0CisgICAgICogZGVzdHJ1Y3RzLgorICAgICAqCisgICAgICogXHJldHVybiAgYSBmdW5jdGlvbiB0aGF0IGFsbG9jYXRlcyBhcHByb3ByaWF0ZSBDb2RlYzJCdWZmZXIgb2JqZWN0LAorICAgICAqICAgICAgICAgIHdoaWNoIGNhbiBjb3B5KCkgZnJvbSBDMkJ1ZmZlcnMuCisgICAgICovCisgICAgdmlydHVhbCBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gZ2V0QWxsb2MoKSA9IDA7CisKK3ByaXZhdGU6CisgICAgRmxleEJ1ZmZlcnNJbXBsIG1JbXBsOworfTsKKworY2xhc3MgTGluZWFyT3V0cHV0QnVmZmVycyA6IHB1YmxpYyBGbGV4T3V0cHV0QnVmZmVycyB7CitwdWJsaWM6CisgICAgTGluZWFyT3V0cHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjFELU91dHB1dCIpCisgICAgICAgIDogRmxleE91dHB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSkgeyB9CisKKyAgICB2b2lkIGZsdXNoKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmZmx1c2hlZFdvcmspIG92ZXJyaWRlOworCisgICAgc3A8Q29kZWMyQnVmZmVyPiB3cmFwKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgICBzdGQ6OmZ1bmN0aW9uPHNwPENvZGVjMkJ1ZmZlcj4oKT4gZ2V0QWxsb2MoKSBvdmVycmlkZTsKK307CisKK2NsYXNzIEdyYXBoaWNPdXRwdXRCdWZmZXJzIDogcHVibGljIEZsZXhPdXRwdXRCdWZmZXJzIHsKK3B1YmxpYzoKKyAgICBHcmFwaGljT3V0cHV0QnVmZmVycyhjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjJELU91dHB1dCIpCisgICAgICAgIDogRmxleE91dHB1dEJ1ZmZlcnMoY29tcG9uZW50TmFtZSwgbmFtZSkgeyB9CisKKyAgICBzcDxDb2RlYzJCdWZmZXI+IHdyYXAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKKworICAgIHN0ZDo6ZnVuY3Rpb248c3A8Q29kZWMyQnVmZmVyPigpPiBnZXRBbGxvYygpIG92ZXJyaWRlOworfTsKKworY2xhc3MgUmF3R3JhcGhpY091dHB1dEJ1ZmZlcnMgOiBwdWJsaWMgRmxleE91dHB1dEJ1ZmZlcnMgeworcHVibGljOgorICAgIFJhd0dyYXBoaWNPdXRwdXRCdWZmZXJzKAorICAgICAgICAgICAgc2l6ZV90IG51bU91dHB1dFNsb3RzLCBjb25zdCBjaGFyICpjb21wb25lbnROYW1lLCBjb25zdCBjaGFyICpuYW1lID0gIjJELUJCLU91dHB1dCIpOworICAgIH5SYXdHcmFwaGljT3V0cHV0QnVmZmVycygpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHNwPENvZGVjMkJ1ZmZlcj4gd3JhcChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlOworCisgICAgc3RkOjpmdW5jdGlvbjxzcDxDb2RlYzJCdWZmZXI+KCk+IGdldEFsbG9jKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPExvY2FsQnVmZmVyUG9vbD4gbUxvY2FsQnVmZmVyUG9vbDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ0NPREVDX0JVRkZFUlNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFkY2Q5NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9DQ29kZWNDb25maWcuY3BwCkBAIC0wLDAgKzEsMTYzOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ0NvZGVjQ29uZmlnIgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQYXJhbS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKworI2luY2x1ZGUgIkNDb2RlY0NvbmZpZy5oIgorI2luY2x1ZGUgIkNvZGVjMk1hcHBlci5oIgorCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwgNjQgIC8qIDY0Ki0wLjI1ZEIgPSAtMTYgZEIgYmVsb3cgZnVsbCBzY2FsZSBmb3IgbW9iaWxlIGNvbmYgKi8KKyNkZWZpbmUgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQgICAxMjcgLyogbWF4aW11bSBjb21wcmVzc2lvbiBvZiBkeW5hbWljIHJhbmdlIGZvciBtb2JpbGUgY29uZiAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0JPT1NUIDEyNyAvKiBtYXhpbXVtIGNvbXByZXNzaW9uIG9mIGR5bmFtaWMgcmFuZ2UgZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkgMSAgIC8qIHN3aXRjaCBmb3IgaGVhdnkgY29tcHJlc3Npb24gZm9yIG1vYmlsZSBjb25mICovCisjZGVmaW5lIERSQ19ERUZBVUxUX01PQklMRV9EUkNfRUZGRUNUIDMgIC8qIE1QRUctRCBEUkMgZWZmZWN0IHR5cGU7IDMgPT4gTGltaXRlZCBwbGF5YmFjayByYW5nZSAqLworI2RlZmluZSBEUkNfREVGQVVMVF9NT0JJTEVfRU5DX0xFVkVMICgtMSkgLyogZW5jb2RlciB0YXJnZXQgbGV2ZWw7IC0xID0+IHRoZSB2YWx1ZSBpcyB1bmtub3duLCBvdGhlcndpc2UgZEIgc3RlcCB2YWx1ZSAoZS5nLiA2NCBmb3IgLTE2IGRCKSAqLworLy8gbmFtZXMgb2YgcHJvcGVydGllcyB0aGF0IGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IERSQyBzZXR0aW5ncworI2RlZmluZSBQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwgICJhYWNfZHJjX3JlZmVyZW5jZV9sZXZlbCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfQ1VUICAgICAgICAiYWFjX2RyY19jdXQiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0JPT1NUICAgICAgImFhY19kcmNfYm9vc3QiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0hFQVZZICAgICAgImFhY19kcmNfaGVhdnkiCisjZGVmaW5lIFBST1BfRFJDX09WRVJSSURFX0VOQ19MRVZFTCAgImFhY19kcmNfZW5jX3RhcmdldF9sZXZlbCIKKyNkZWZpbmUgUFJPUF9EUkNfT1ZFUlJJREVfRUZGRUNUICAgICAicm8uYWFjX2RyY19lZmZlY3RfdHlwZSIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBDQ29kZWNDb25maWcKKworbmFtZXNwYWNlIHsKKworLyoqCisgKiBtYXBwaW5nIGJldHdlZW4gU0RLIGFuZCBDb2RlYyAyLjAgY29uZmlndXJhdGlvbnMuCisgKi8KK3N0cnVjdCBDb25maWdNYXBwZXIgeworICAgIC8qKgorICAgICAqIFZhbHVlIG1hcHBlciAoQzJWYWx1ZSA9PiBDMlZhbHVlKQorICAgICAqLworICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjxDMlZhbHVlKEMyVmFsdWUpPiBNYXBwZXI7CisKKyAgICAvLy8gc2hvcnRoYW5kCisgICAgdHlwZWRlZiBDQ29kZWNDb25maWc6OkRvbWFpbiBEb21haW47CisKKyAgICBDb25maWdNYXBwZXIoc3RkOjpzdHJpbmcgbWVkaWFLZXksIEMyU3RyaW5nIGMyc3RydWN0LCBDMlN0cmluZyBjMmZpZWxkKQorICAgICAgICA6IG1Eb21haW4oRG9tYWluOjpBTEwpLCBtTWVkaWFLZXkobWVkaWFLZXkpLCBtU3RydWN0KGMyc3RydWN0KSwgbUZpZWxkKGMyZmllbGQpIHsgfQorCisgICAgLy8vIExpbWl0cyB0aGlzIHBhcmFtZXRlciB0byB0aGUgZ2l2ZW4gZG9tYWluCisgICAgQ29uZmlnTWFwcGVyICZsaW1pdFRvKHVpbnQzMl90IGRvbWFpbikgeworICAgICAgICBDMl9DSEVDSyhkb21haW4gJiBEb21haW46OkdVQVJEX0JJVCk7CisgICAgICAgIG1Eb21haW4gPSBEb21haW4obURvbWFpbiAmIGRvbWFpbik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gQWRkcyBTREsgPT4gQ29kZWMgMi4wIG1hcHBlciAoc2hvdWxkIG5vdCBiZSBpbiB0aGUgU0RLIGZvcm1hdCkKKyAgICBDb25maWdNYXBwZXIgJndpdGhNYXBwZXIoTWFwcGVyIG1hcHBlcikgeworICAgICAgICBDMl9DSEVDSyghbU1hcHBlcik7CisgICAgICAgIEMyX0NIRUNLKCFtUmV2ZXJzZSk7CisgICAgICAgIG1NYXBwZXIgPSBtYXBwZXI7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gQWRkcyBTREsgPD0+IENvZGVjIDIuMCB2YWx1ZSBtYXBwZXJzCisgICAgQ29uZmlnTWFwcGVyICZ3aXRoTWFwcGVycyhNYXBwZXIgbWFwcGVyLCBNYXBwZXIgcmV2ZXJzZSkgeworICAgICAgICBDMl9DSEVDSyghbU1hcHBlcik7CisgICAgICAgIEMyX0NIRUNLKCFtUmV2ZXJzZSk7CisgICAgICAgIG1NYXBwZXIgPSBtYXBwZXI7CisgICAgICAgIG1SZXZlcnNlID0gcmV2ZXJzZTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vLyBBZGRzIFNESyA8PT4gQ29kZWMgMi4wIHZhbHVlIG1hcHBlcnMgYmFzZWQgb24gQzJNYXBwZXIKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBDMlR5cGUsIHR5cGVuYW1lIFNka1R5cGU9aW50MzJfdD4KKyAgICBDb25maWdNYXBwZXIgJndpdGhDMk1hcHBlcnMoKSB7CisgICAgICAgIEMyX0NIRUNLKCFtTWFwcGVyKTsKKyAgICAgICAgQzJfQ0hFQ0soIW1SZXZlcnNlKTsKKyAgICAgICAgbU1hcHBlciA9IFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBTZGtUeXBlIHNka1ZhbHVlOworICAgICAgICAgICAgQzJUeXBlIGMyVmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnNka1ZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHNka1ZhbHVlLCAmYzJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gYzJWYWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH07CisgICAgICAgIG1SZXZlcnNlID0gW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIFNka1R5cGUgc2RrVmFsdWU7CisgICAgICAgICAgICBDMlR5cGUgYzJWYWx1ZTsKKyAgICAgICAgICAgIHVzaW5nIEMyVmFsdWVUeXBlPXR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8QzJUeXBlPjo6dHlwZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgoQzJWYWx1ZVR5cGUqKSZjMlZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKGMyVmFsdWUsICZzZGtWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2RrVmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8vIE1hcHMgZnJvbSBTREsgdmFsdWVzIGluIGFuIEFNZXNzYWdlIHRvIGEgc3VpdGFibGUgQzJWYWx1ZS4KKyAgICBDMlZhbHVlIG1hcEZyb21NZXNzYWdlKGNvbnN0IEFNZXNzYWdlOjpJdGVtRGF0YSAmaXRlbSkgY29uc3QgeworICAgICAgICBDMlZhbHVlIHZhbHVlOworICAgICAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgICAgIGludDY0X3QgaW50NjRWYWx1ZTsKKyAgICAgICAgZmxvYXQgZmxvYXRWYWx1ZTsKKyAgICAgICAgZG91YmxlIGRvdWJsZVZhbHVlOworICAgICAgICBpZiAoaXRlbS5maW5kKCZpbnQzMlZhbHVlKSkgeworICAgICAgICAgICAgdmFsdWUgPSBpbnQzMlZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKGl0ZW0uZmluZCgmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gaW50NjRWYWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpdGVtLmZpbmQoJmZsb2F0VmFsdWUpKSB7CisgICAgICAgICAgICB2YWx1ZSA9IGZsb2F0VmFsdWU7CisgICAgICAgIH0gZWxzZSBpZiAoaXRlbS5maW5kKCZkb3VibGVWYWx1ZSkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gKGZsb2F0KWRvdWJsZVZhbHVlOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS50eXBlKCkgIT0gQzJWYWx1ZTo6Tk9fSU5JVCAmJiBtTWFwcGVyKSB7CisgICAgICAgICAgICB2YWx1ZSA9IG1NYXBwZXIodmFsdWUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICB9CisKKyAgICAvLy8gTWFwcyBmcm9tIGEgQzJWYWx1ZSB0byBhbiBTREsgdmFsdWUgaW4gYW4gQU1lc3NhZ2UuCisgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIG1hcFRvTWVzc2FnZShDMlZhbHVlIHZhbHVlKSBjb25zdCB7CisgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBpdGVtOworICAgICAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgICAgIHVpbnQzMl90IHVpbnQzMlZhbHVlOworICAgICAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgICAgIHVpbnQ2NF90IHVpbnQ2NFZhbHVlOworICAgICAgICBmbG9hdCBmbG9hdFZhbHVlOworICAgICAgICBpZiAodmFsdWUudHlwZSgpICE9IEMyVmFsdWU6Ok5PX0lOSVQgJiYgbVJldmVyc2UpIHsKKyAgICAgICAgICAgIHZhbHVlID0gbVJldmVyc2UodmFsdWUpOworICAgICAgICB9CisgICAgICAgIGlmICh2YWx1ZS5nZXQoJmludDMyVmFsdWUpKSB7CisgICAgICAgICAgICBpdGVtLnNldChpbnQzMlZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJnVpbnQzMlZhbHVlKSAmJiB1aW50MzJWYWx1ZSA8PSB1aW50MzJfdChJTlQzMl9NQVgpKSB7CisgICAgICAgICAgICAvLyBTREsgZG9lcyBub3Qgc3VwcG9ydCB1bnNpZ25lZCB2YWx1ZXMKKyAgICAgICAgICAgIGl0ZW0uc2V0KChpbnQzMl90KXVpbnQzMlZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJmludDY0VmFsdWUpKSB7CisgICAgICAgICAgICBpdGVtLnNldChpbnQ2NFZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJnVpbnQ2NFZhbHVlKSAmJiB1aW50NjRWYWx1ZSA8PSB1aW50NjRfdChJTlQ2NF9NQVgpKSB7CisgICAgICAgICAgICAvLyBTREsgZG9lcyBub3Qgc3VwcG9ydCB1bnNpZ25lZCB2YWx1ZXMKKyAgICAgICAgICAgIGl0ZW0uc2V0KChpbnQ2NF90KXVpbnQ2NFZhbHVlKTsKKyAgICAgICAgfSBlbHNlIGlmICh2YWx1ZS5nZXQoJmZsb2F0VmFsdWUpKSB7CisgICAgICAgICAgICBpdGVtLnNldChmbG9hdFZhbHVlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXRlbTsKKyAgICB9CisKKyAgICBEb21haW4gZG9tYWluKCkgY29uc3QgeyByZXR1cm4gbURvbWFpbjsgfQorICAgIHN0ZDo6c3RyaW5nIG1lZGlhS2V5KCkgY29uc3QgeyByZXR1cm4gbU1lZGlhS2V5OyB9CisgICAgc3RkOjpzdHJpbmcgcGF0aCgpIGNvbnN0IHsgcmV0dXJuIG1GaWVsZC5zaXplKCkgPyBtU3RydWN0ICsgJy4nICsgbUZpZWxkIDogbVN0cnVjdDsgfQorICAgIE1hcHBlciBtYXBwZXIoKSBjb25zdCB7IHJldHVybiBtTWFwcGVyOyB9CisgICAgTWFwcGVyIHJldmVyc2UoKSBjb25zdCB7IHJldHVybiBtUmV2ZXJzZTsgfQorCitwcml2YXRlOgorICAgIERvbWFpbiBtRG9tYWluOyAgICAgICAgIC8vLzwgcGFyYW1ldGVyIGRvbWFpbiAobWFzaykgY29udGFpbmluZyBwb3J0LCBraW5kIGFuZCBjb25maWcgZG9tYWlucworICAgIHN0ZDo6c3RyaW5nIG1NZWRpYUtleTsgIC8vLzwgU0RLIGtleQorICAgIEMyU3RyaW5nIG1TdHJ1Y3Q7ICAgICAgIC8vLzwgQ29kZWMgMi4wIHN0cnVjdCBuYW1lCisgICAgQzJTdHJpbmcgbUZpZWxkOyAgICAgICAgLy8vPCBDb2RlYyAyLjAgZmllbGQgbmFtZQorICAgIE1hcHBlciBtTWFwcGVyOyAgICAgICAgIC8vLzwgb3B0aW9uYWwgU0RLID0+IENvZGVjIDIuMCB2YWx1ZSBtYXBwZXIKKyAgICBNYXBwZXIgbVJldmVyc2U7ICAgICAgICAvLy88IG9wdGlvbmFsIENvZGVjIDIuMCA9PiBTREsgdmFsdWUgbWFwcGVyCit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUE9SVCwgdHlwZW5hbWUgU1RSRUFNPgorQVN0cmluZyBRdWVyeU1lZGlhVHlwZUltcGwoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCkgeworICAgIEFTdHJpbmcgbWVkaWFUeXBlOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMmVyciA9IGNvbXBvbmVudC0+cXVlcnkoCisgICAgICAgICAgICB7fSwgeyBQT1JUOjpQQVJBTV9UWVBFLCBTVFJFQU06OlBBUkFNX1RZUEUgfSwgQzJfRE9OVF9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMmVyciAhPSBDMl9PSyAmJiBxdWVyaWVkLnNpemUoKSA9PSAwKSB7CisgICAgICAgIEFMT0dEKCJRdWVyeSBtZWRpYSB0eXBlIGZhaWxlZCA9PiAlcyIsIGFzU3RyaW5nKGMyZXJyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUE9SVCAqcG9ydE1lZGlhVHlwZSA9CisgICAgICAgICAgICBQT1JUOjpGcm9tKHF1ZXJpZWRbMF0uZ2V0KCkpOworICAgICAgICBpZiAocG9ydE1lZGlhVHlwZSkgeworICAgICAgICAgICAgbWVkaWFUeXBlID0gQVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgcG9ydE1lZGlhVHlwZS0+bS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgc3Rybmxlbihwb3J0TWVkaWFUeXBlLT5tLnZhbHVlLCBwb3J0TWVkaWFUeXBlLT5mbGV4Q291bnQoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgU1RSRUFNICpzdHJlYW1NZWRpYVR5cGUgPSBTVFJFQU06OkZyb20ocXVlcmllZFswXS5nZXQoKSk7CisgICAgICAgICAgICBpZiAoc3RyZWFtTWVkaWFUeXBlKSB7CisgICAgICAgICAgICAgICAgbWVkaWFUeXBlID0gQVN0cmluZygKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbU1lZGlhVHlwZS0+bS52YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cm5sZW4oc3RyZWFtTWVkaWFUeXBlLT5tLnZhbHVlLCBzdHJlYW1NZWRpYVR5cGUtPmZsZXhDb3VudCgpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoInJlYWQgbWVkaWEgdHlwZTogJXMiLCBtZWRpYVR5cGUuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBtZWRpYVR5cGU7Cit9CisKK0FTdHJpbmcgUXVlcnlNZWRpYVR5cGUoCisgICAgICAgIGJvb2wgaW5wdXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCkgeworICAgIHR5cGVkZWYgQzJQb3J0TWVkaWFUeXBlU2V0dGluZyBQOworICAgIHR5cGVkZWYgQzJTdHJlYW1NZWRpYVR5cGVTZXR0aW5nIFM7CisgICAgaWYgKGlucHV0KSB7CisgICAgICAgIHJldHVybiBRdWVyeU1lZGlhVHlwZUltcGw8UDo6aW5wdXQsIFM6OmlucHV0Pihjb21wb25lbnQpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBRdWVyeU1lZGlhVHlwZUltcGw8UDo6b3V0cHV0LCBTOjpvdXRwdXQ+KGNvbXBvbmVudCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKKworLyoqCisgKiBTZXQgb2Ygc3RhbmRhcmQgcGFyYW1ldGVycyB1c2VkIGJ5IENDb2RlYyB0aGF0IGFyZSBleHBvc2VkIHRvIE1lZGlhQ29kZWMuCisgKi8KK3N0cnVjdCBTdGFuZGFyZFBhcmFtcyB7CisgICAgdHlwZWRlZiBDQ29kZWNDb25maWc6OkRvbWFpbiBEb21haW47CisKKyAgICAvLyBzdGFuZGFyZCAoTWVkaWFDb2RlYykgcGFyYW1zIGFyZSBrZXllZCBieSBtZWRpYSBmb3JtYXQga2V5CisgICAgdHlwZWRlZiBzdGQ6OnN0cmluZyBTZGtLZXk7CisKKyAgICAvLy8gdXNlZCB0byByZXR1cm4gcmVmZXJlbmNlIHRvIG5vIGNvbmZpZyBtYXBwZXJzIGluIGdldENvbmZpZ01hcHBlcnNGb3JTZGtLZXkKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPiBOT19NQVBQRVJTOworCisgICAgLy8vIFJldHVybnMgQ29kZWMgMi4wIGVxdWl2YWxlbnQgcGFyYW1ldGVycyBmb3IgYW4gU0RLIGZvcm1hdCBrZXkuCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPiAmZ2V0Q29uZmlnTWFwcGVyc0ZvclNka0tleShzdGQ6OnN0cmluZyBrZXkpIGNvbnN0IHsKKyAgICAgICAgYXV0byBpdCA9IG1Db25maWdNYXBwZXJzLmZpbmQoa2V5KTsKKyAgICAgICAgaWYgKGl0ID09IG1Db25maWdNYXBwZXJzLmVuZCgpKSB7CisgICAgICAgICAgICBpZiAobUNvbXBsYWluZWQuY291bnQoa2V5KSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIm5vIGMyIGVxdWl2YWxlbnRzIGZvciAlcyIsIGtleS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBtQ29tcGxhaW5lZC5pbnNlcnQoa2V5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19NQVBQRVJTOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJmb3VuZCAlenUgZXFzIGZvciAlcyIsIGl0LT5zZWNvbmQuc2l6ZSgpLCBrZXkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgYSBTREsgPD0+IENvZGVjIDIuMCBwYXJhbWV0ZXIgbWFwcGluZy4gTXVsdGlwbGUgQ29kZWMgMi4wIHBhcmFtZXRlcnMgbWF5IG1hcCB0byBhCisgICAgICogc2luZ2xlIFNESyBrZXksIGluIHdoaWNoIGNhc2UgdGhleSBzaGFsbCBiZSBvcmRlcmVkIGZyb20gbGVhc3QgYXV0aG9yaXRhdGl2ZSB0byBtb3N0CisgICAgICogYXV0aG9yaXRhdGl2ZS4gV2hlbiBjb25zdHJ1Y3RpbmcgU0RLIGZvcm1hdHMsIHRoZSBsYXN0IG1hcHBlZCBDb2RlYyAyLjAgcGFyYW1ldGVyIHRoYXQKKyAgICAgKiBpcyBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudCB3aWxsIGRldGVybWluZSB0aGUgZXhwb3NlZCB2YWx1ZS4gKFRPRE86IHBlcmhhcHMgcmVzdHJpY3QgdGhpcworICAgICAqIGJ5IGRvbWFpbi4pCisgICAgICovCisgICAgdm9pZCBhZGQoY29uc3QgQ29uZmlnTWFwcGVyICZjbSkgeworICAgICAgICBhdXRvIGl0ID0gbUNvbmZpZ01hcHBlcnMuZmluZChjbS5tZWRpYUtleSgpKTsKKyAgICAgICAgQUxPR1YoIiVjJWMlYyVjICVjJWMlYyAlMDR4ICU5cyAlcyA9PiAlcyIsCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX0lOUFVUKSA/ICdJJyA6ICcgJyksCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX09VVFBVVCkgPyAnTycgOiAnICcpLAorICAgICAgICAgICAgICAoKGNtLmRvbWFpbigpICYgRG9tYWluOjpJU19DT0RFRCkgPyAnQycgOiAnICcpLAorICAgICAgICAgICAgICAoKGNtLmRvbWFpbigpICYgRG9tYWluOjpJU19SQVcpID8gJ1InIDogJyAnKSwKKyAgICAgICAgICAgICAgKChjbS5kb21haW4oKSAmIERvbWFpbjo6SVNfQ09ORklHKSA/ICdjJyA6ICcgJyksCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX1BBUkFNKSA/ICdwJyA6ICcgJyksCisgICAgICAgICAgICAgICgoY20uZG9tYWluKCkgJiBEb21haW46OklTX1JFQUQpID8gJ3InIDogJyAnKSwKKyAgICAgICAgICAgICAgY20uZG9tYWluKCksCisgICAgICAgICAgICAgIGl0ID09IG1Db25maWdNYXBwZXJzLmVuZCgpID8gImFkZGluZyIgOiAiZXh0ZW5kaW5nIiwKKyAgICAgICAgICAgICAgY20ubWVkaWFLZXkoKS5jX3N0cigpLCBjbS5wYXRoKCkuY19zdHIoKSk7CisgICAgICAgIGlmIChpdCA9PSBtQ29uZmlnTWFwcGVycy5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPiBlcXMgPSB7IGNtIH07CisgICAgICAgICAgICBtQ29uZmlnTWFwcGVycy5lbXBsYWNlKGNtLm1lZGlhS2V5KCksIGVxcyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpdC0+c2Vjb25kLnB1c2hfYmFjayhjbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFsbCBwYXRocyBmb3IgYSBzcGVjaWZpYyBkb21haW4uCisgICAgICoKKyAgICAgKiBccGFyYW0gYW55IG1heGltdW0gZG9tYWluIG1hc2suIFJldHVybmVkIHBhcmFtZXRlcnMgbXVzdCBtYXRjaCBhdCBsZWFzdCBvbmUgb2YgdGhlIGRvbWFpbnMKKyAgICAgKiAgICAgICAgICAgIGluIHRoZSBtYXNrLgorICAgICAqIFxwYXJhbSBhbGwgbWluaW11bSBkb21haW4gbWFzay4gUmV0dXJuZWQgcGFyYW1ldGVycyBtdXN0IG1hdGNoIGFsbCBvZiB0aGUgZG9tYWlucyBpbiB0aGUKKyAgICAgKiAgICAgICAgICAgIG1hc2suIFRoaXMgaXMgcmVzdHJpY3RlZCB0byB0aGUgYml0cyBvZiB0aGUgbWF4aW11bSBtYXNrLgorICAgICAqLworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBnZXRQYXRoc0ZvckRvbWFpbigKKyAgICAgICAgICAgIERvbWFpbiBhbnksIERvbWFpbiBhbGwgPSBEb21haW46OkFMTCkgY29uc3QgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcmVzOworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjp2ZWN0b3I8Q29uZmlnTWFwcGVyPj4gJmVsIDogbUNvbmZpZ01hcHBlcnMpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgQ29uZmlnTWFwcGVyICZjbSA6IGVsLnNlY29uZCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJmaWx0ZXJpbmcgJXMgJXggJXggJXggJXgiLCBjbS5wYXRoKCkuY19zdHIoKSwgY20uZG9tYWluKCksIGFueSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChjbS5kb21haW4oKSAmIGFueSksIChjbS5kb21haW4oKSAmIGFueSAmIGFsbCkpOworICAgICAgICAgICAgICAgIGlmICgoY20uZG9tYWluKCkgJiBhbnkpICYmICgoY20uZG9tYWluKCkgJiBhbnkgJiBhbGwpID09IChhbnkgJiBhbGwpKSkgeworICAgICAgICAgICAgICAgICAgICByZXMucHVzaF9iYWNrKGNtLnBhdGgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyBTREsgPD0+IENvZGVjIDIuMCBtYXBwaW5ncy4KKyAgICAgKgorICAgICAqIFRPRE86IHJlcGxhY2UgdGhlc2Ugd2l0aCBiZXR0ZXIgbWV0aG9kcyBhcyB0aGlzIGV4cG9zZXMgdGhlIGlubmVyIHN0cnVjdHVyZS4KKyAgICAgKi8KKyAgICBjb25zdCBzdGQ6Om1hcDxTZGtLZXksIHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4+IGdldEtleXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQ29uZmlnTWFwcGVyczsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjptYXA8U2RrS2V5LCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+PiBtQ29uZmlnTWFwcGVyczsKKyAgICBtdXRhYmxlIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBtQ29tcGxhaW5lZDsKK307CisKK2NvbnN0IHN0ZDo6dmVjdG9yPENvbmZpZ01hcHBlcj4gU3RhbmRhcmRQYXJhbXM6Ok5PX01BUFBFUlM7CisKKworQ0NvZGVjQ29uZmlnOjpDQ29kZWNDb25maWcoKQorICAgIDogbUlucHV0Rm9ybWF0KG5ldyBBTWVzc2FnZSksCisgICAgICBtT3V0cHV0Rm9ybWF0KG5ldyBBTWVzc2FnZSksCisgICAgICBtVXNpbmdTdXJmYWNlKGZhbHNlKSB7IH0KKwordm9pZCBDQ29kZWNDb25maWc6OmluaXRpYWxpemVTdGFuZGFyZFBhcmFtcygpIHsKKyAgICB0eXBlZGVmIERvbWFpbiBEOworICAgIG1TdGFuZGFyZFBhcmFtcyA9IHN0ZDo6bWFrZV9zaGFyZWQ8U3RhbmRhcmRQYXJhbXM+KCk7CisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IENvbmZpZ01hcHBlciAmKT4gYWRkID0KKyAgICAgICAgW3BhcmFtcyA9IG1TdGFuZGFyZFBhcmFtc10oY29uc3QgQ29uZmlnTWFwcGVyICZjbSkgeworICAgICAgICAgICAgcGFyYW1zLT5hZGQoY20pOworICAgIH07CisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IENvbmZpZ01hcHBlciAmKT4gZGVwcmVjYXRlZCA9IGFkZDsKKworICAgIC8vIGFsbG93IGludDMyIG9yIGZsb2F0IFNESyB2YWx1ZXMgYW5kIHJlcHJlc2VudCB0aGVtIGFzIGZsb2F0CisgICAgQ29uZmlnTWFwcGVyOjpNYXBwZXIgbWFrZUZsb2F0ID0gW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgLy8gY29udmVydCBmcm9tIGkzMiB0byBmbG9hdAorICAgICAgICBpbnQzMl90IGkzMlZhbHVlOworICAgICAgICBmbG9hdCBmcFZhbHVlOworICAgICAgICBpZiAodi5nZXQoJmkzMlZhbHVlKSkgeworICAgICAgICAgICAgcmV0dXJuIChmbG9hdClpMzJWYWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmICh2LmdldCgmZnBWYWx1ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmcFZhbHVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgfTsKKworICAgIENvbmZpZ01hcHBlcjo6TWFwcGVyIG5lZ2F0ZSA9IFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgIGlmICh2LmdldCgmdmFsdWUpKSB7CisgICAgICAgICAgICByZXR1cm4gLXZhbHVlOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgfTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01JTUUsICAgICBDMl9QQVJBTUtFWV9JTlBVVF9NRURJQV9UWVBFLCAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpJTlBVVCAmIEQ6OlJFQUQpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9NSU1FLCAgICAgQzJfUEFSQU1LRVlfT1VUUFVUX01FRElBX1RZUEUsICAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6T1VUUFVUICYgRDo6UkVBRCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQklUX1JBVEUsIEMyX1BBUkFNS0VZX0JJVFJBVEUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpPVVRQVVQpKTsKKyAgICAvLyB3ZSBhbHNvIG5lZWQgdG8gcHV0IHRoZSBiaXRyYXRlIGluIHRoZSBtYXggYml0cmF0ZSBmaWVsZAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX01BWF9CSVRfUkFURSwgQzJfUEFSQU1LRVlfQklUUkFURSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlJFQUQgJiBEOjpPVVRQVVQpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKFBBUkFNRVRFUl9LRVlfVklERU9fQklUUkFURSwgQzJfUEFSQU1LRVlfQklUUkFURSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlZJREVPICYgRDo6UEFSQU0pKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9CSVRSQVRFX01PREUsIEMyX1BBUkFNS0VZX0JJVFJBVEVfTU9ERSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OkNPREVEKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3Q+KCkpOworICAgIC8vIHJlbW92ZSB3aGVuIGNvZGVjcyBzd2l0Y2ggdG8gUEFSQU1LRVkgYW5kIG5ldyBtb2RlcworICAgIGRlcHJlY2F0ZWQoQ29uZmlnTWFwcGVyKEtFWV9CSVRSQVRFX01PREUsICJjb2RlZC5iaXRyYXRlLW1vZGUiLCAidmFsdWUiKQorICAgICAgICAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUikpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0ZSQU1FX1JBVEUsIEMyX1BBUkFNS0VZX0ZSQU1FX1JBVEUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPKQorICAgICAgICAud2l0aE1hcHBlcnMobWFrZUZsb2F0LCBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgLy8gcmVhZCBiYWNrIGFsd2F5cyBhcyBpbnQKKyAgICAgICAgICAgIGZsb2F0IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGludDMyX3QpdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9NQVhfSU5QVVRfU0laRSwgQzJfUEFSQU1LRVlfSU5QVVRfTUFYX0JVRkZFUl9TSVpFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpJTlBVVCkpOworICAgIC8vIHJlbW92ZSB3aGVuIGNvZGVjcyBzd2l0Y2ggdG8gUEFSQU1LRVkKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihLRVlfTUFYX0lOUFVUX1NJWkUsICJjb2RlZC5tYXgtZnJhbWUtc2l6ZSIsICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAubGltaXRUbyhEOjpJTlBVVCkpOworCisgICAgLy8gUm90YXRpb24KKyAgICAvLyBOb3RlOiBTREsgcm90YXRpb24gaXMgY2xvY2std2lzZSwgd2hpbGUgQzIgcm90YXRpb24gaXMgY291bnRlci1jbG9jay13aXNlCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUk9UQVRJT04sIEMyX1BBUkFNS0VZX1ZVSV9ST1RBVElPTiwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpDT0RFRCkKKyAgICAgICAgLndpdGhNYXBwZXJzKG5lZ2F0ZSwgbmVnYXRlKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUk9UQVRJT04sIEMyX1BBUkFNS0VZX1JPVEFUSU9OLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhNYXBwZXJzKG5lZ2F0ZSwgbmVnYXRlKSk7CisKKyAgICAvLyBhbmRyb2lkICd2aWRlby1zY2FsaW5nJworICAgIGFkZChDb25maWdNYXBwZXIoImFuZHJvaWQuX3ZpZGVvLXNjYWxpbmciLCBDMl9QQVJBTUtFWV9TVVJGQUNFX1NDQUxJTkdfTU9ERSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpERUNPREVSICYgRDo6UkFXKSk7CisKKyAgICAvLyBDb2xvciBBc3BlY3RzCisgICAgLy8KKyAgICAvLyBjb25maWd1cmUgZGVmYXVsdCBmb3IgZGVjb2RlcnMKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9SQU5HRSwgICAgICAgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTLCAgICJyYW5nZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6Q09ERUQgJiAoRDo6Q09ORklHIHwgRDo6UEFSQU0pKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjpyYW5nZV90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgICAgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTLCAgICJ0cmFuc2ZlciIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6Q09ERUQgJiAoRDo6Q09ORklHIHwgRDo6UEFSQU0pKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjp0cmFuc2Zlcl90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1wcmltYXJpZXMiLCAgICAgQzJfUEFSQU1LRVlfREVGQVVMVF9DT0xPUl9BU1BFQ1RTLCAgICJwcmltYXJpZXMiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OkNPREVEICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNKSkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLW1hdHJpeCIsICAgICAgICBDMl9QQVJBTUtFWV9ERUZBVUxUX0NPTE9SX0FTUEVDVFMsICAgIm1hdHJpeCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkRFQ09ERVIgICYgRDo6Q09ERUQgJiAoRDo6Q09ORklHIHwgRDo6UEFSQU0pKSk7CisKKyAgICAvLyByZWFkIGJhY2sgZmluYWwgZm9yIGRlY29kZXIgb3V0cHV0IChhbHNvLCBjb25maWd1cmUgZmluYWwgYXNwZWN0cyBhcyB3ZWxsLiBUaGlzIHNob3VsZCBiZQorICAgIC8vIG92ZXJ3cml0dGVuIGJhc2VkIG9uIGNvZGVkL2RlZmF1bHQgdmFsdWVzIGlmIGNvbXBvbmVudCBzdXBwb3J0cyBjb2xvciBhc3BlY3RzLCBidXQgaXMgdXNlZAorICAgIC8vIGFzIGZpbmFsIHZhbHVlcyBpZiBjb21wb25lbnQgZG9lcyBub3Qgc3VwcG9ydCBhc3BlY3RzIGF0IGFsbCkKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9SQU5HRSwgICAgICAgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUywgICAicmFuZ2UiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhDMk1hcHBlcnM8QzJDb2xvcjo6cmFuZ2VfdD4oKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfVFJBTlNGRVIsICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgInRyYW5zZmVyIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6REVDT0RFUiAgJiBEOjpSQVcpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnRyYW5zZmVyX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLXByaW1hcmllcyIsICAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJwcmltYXJpZXMiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLW1hdHJpeCIsICAgICAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJtYXRyaXgiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpERUNPREVSICAmIEQ6OlJBVykpOworCisgICAgLy8gY29uZmlndXJlIHNvdXJjZSBhc3BlY3RzIGZvciBlbmNvZGVycyBhbmQgcmVhZCB0aGVtIGJhY2sgb24gdGhlIGNvZGVkKCEpIHBvcnQuCisgICAgLy8gVGhpcyBpcyB0byBlbnN1cmUgbXV4aW5nIHRoZSBkZXNpcmVkIGFzcGVjdHMgaW50byB0aGUgY29udGFpbmVyLgorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1JBTkdFLCAgICAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJyYW5nZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6Q09ERUQpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnJhbmdlX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NPTE9SX1RSQU5TRkVSLCAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJ0cmFuc2ZlciIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6Q09ERUQpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnRyYW5zZmVyX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLXByaW1hcmllcyIsICAgICBDMl9QQVJBTUtFWV9DT0xPUl9BU1BFQ1RTLCAgICJwcmltYXJpZXMiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpFTkNPREVSICAmIEQ6OkNPREVEKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY29sb3ItbWF0cml4IiwgICAgICAgIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMsICAgIm1hdHJpeCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6Q09ERUQpKTsKKworICAgIC8vIHJlYWQgYmFjayBjb2RlZCBhc3BlY3RzIGZvciBlbmNvZGVycyAob24gdGhlIHJhdyBwb3J0KSwgYnV0IGFsc28gY29uZmlndXJlCisgICAgLy8gZGVzaXJlZCBhc3BlY3RzIGhlcmUuCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQ09MT1JfUkFOR0UsICAgICAgIEMyX1BBUkFNS0VZX1ZVSV9DT0xPUl9BU1BFQ1RTLCAgICJyYW5nZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6UkFXKQorICAgICAgICAud2l0aEMyTWFwcGVyczxDMkNvbG9yOjpyYW5nZV90PigpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DT0xPUl9UUkFOU0ZFUiwgICAgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMsICAgInRyYW5zZmVyIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpSQVcpCisgICAgICAgIC53aXRoQzJNYXBwZXJzPEMyQ29sb3I6OnRyYW5zZmVyX3Q+KCkpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbG9yLXByaW1hcmllcyIsICAgICBDMl9QQVJBTUtFWV9WVUlfQ09MT1JfQVNQRUNUUywgICAicHJpbWFyaWVzIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6RU5DT0RFUiAgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjb2xvci1tYXRyaXgiLCAgICAgICAgQzJfUEFSQU1LRVlfVlVJX0NPTE9SX0FTUEVDVFMsICAgIm1hdHJpeCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OkVOQ09ERVIgICYgRDo6UkFXKSk7CisKKyAgICAvLyBEYXRhc3BhY2UKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCBDMl9QQVJBTUtFWV9EQVRBX1NQQUNFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKworICAgIC8vIEhEUgorICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5yZWQueCIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5yZWQueCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5yZWQueSIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5yZWQueSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5ncmVlbi54IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLmdyZWVuLngiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYuZ3JlZW4ueSIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5ncmVlbi55IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2LmJsdWUueCIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy5ibHVlLngiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYuYmx1ZS55IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLmJsdWUueSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni53aGl0ZS54IiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLndoaXRlLngiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJzbXB0ZTIwODYud2hpdGUueSIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1hc3RlcmluZy53aGl0ZS55IikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigic21wdGUyMDg2Lm1heC1sdW1pbmFuY2UiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXN0ZXJpbmcubWF4LWx1bWluYW5jZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworICAgIGFkZChDb25maWdNYXBwZXIoInNtcHRlMjA4Ni5taW4tbHVtaW5hbmNlIiwgQzJfUEFSQU1LRVlfSERSX1NUQVRJQ19JTkZPLCAibWFzdGVyaW5nLm1pbi1sdW1pbmFuY2UiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjdGE4NjEubWF4LWNsbCIsIEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTywgIm1heC1jbGwiKQorICAgICAgICAubGltaXRUbygoRDo6VklERU8gfCBEOjpJTUFHRSkgJiBEOjpSQVcpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjdGE4NjEubWF4LWZhbGwiLCBDMl9QQVJBTUtFWV9IRFJfU1RBVElDX0lORk8sICJtYXgtZmFsbCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihzdGQ6OnN0cmluZyhLRVlfRkVBVFVSRV8pICsgRkVBVFVSRV9TZWN1cmVQbGF5YmFjaywKKyAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1NFQ1VSRV9NT0RFLCAidmFsdWUiKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9QUkVQRU5EX0hFQURFUlNfVE9fU1lOQ19GUkFNRVMsCisgICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9QUkVQRU5EX0hFQURFUl9NT0RFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgRDo6VklERU8pCisgICAgICAgIC53aXRoTWFwcGVycyhbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlID8gQzJWYWx1ZShDMkNvbmZpZzo6UFJFUEVORF9IRUFERVJfVE9fQUxMX1NZTkMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQzJWYWx1ZShDMkNvbmZpZzo6UFJFUEVORF9IRUFERVJfVE9fTk9ORSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9LCBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgQzJDb25maWc6OnByZXBlbmRfaGVhZGVyX21vZGVfdCB2YWx1ZTsKKyAgICAgICAgICAgIHVzaW5nIEMyVmFsdWVUeXBlPXR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8ZGVjbHR5cGUodmFsdWUpPjo6dHlwZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgoQzJWYWx1ZVR5cGUgKikmdmFsdWUpKSB7CisgICAgICAgICAgICAgICAgc3dpdGNoICh2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyQ29uZmlnOjpQUkVQRU5EX0hFQURFUl9UT19OT05FOiAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyQ29uZmlnOjpQUkVQRU5EX0hFQURFUl9UT19BTExfU1lOQzogIHJldHVybiAxOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyQ29uZmlnOjpQUkVQRU5EX0hFQURFUl9PTl9DSEFOR0U6ICAgIFtbZmFsbHRocm91Z2hdXTsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKyAgICAvLyByZW1vdmUgd2hlbiBjb2RlY3Mgc3dpdGNoIHRvIFBBUkFNS0VZCisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoS0VZX1BSRVBFTkRfSEVBREVSU19UT19TWU5DX0ZSQU1FUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29kaW5nLmFkZC1jc2QtdG8tc3luYy1mcmFtZXMiLCAidmFsdWUiKQorICAgICAgICAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlZJREVPKSk7CisgICAgLy8gY29udmVydCB0byB0aW1lc3RhbXAgYmFzZQorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0lfRlJBTUVfSU5URVJWQUwsIEMyX1BBUkFNS0VZX1NZTkNfRlJBTUVfSU5URVJWQUwsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6RU5DT0RFUiAmIEQ6OkNPTkZJRykKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIC8vIGNvbnZlcnQgZnJvbSBpMzIgdG8gZmxvYXQKKyAgICAgICAgICAgIGludDMyX3QgaTMyVmFsdWU7CisgICAgICAgICAgICBmbG9hdCBmcFZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZpMzJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50NjRfdCgxMDAwMDAwKSAqIGkzMlZhbHVlOworICAgICAgICAgICAgfSBlbHNlIGlmICh2LmdldCgmZnBWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gaW50NjRfdChjMl9taW4oMTAwMDAwMCAqIGZwVmFsdWUgKyAwLjUsIChkb3VibGUpSU5UNjRfTUFYKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisgICAgLy8gcmVtb3ZlIHdoZW4gY29kZWNzIHN3aXRjaCB0byBwcm9wZXIgY29kaW5nLmdvcCAoYWRkIHN1cHBvcnQgZm9yIGNhbGN1bGF0aW5nIGdvcCkKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcigiaS1mcmFtZS1wZXJpb2QiLCAiY29kaW5nLmdvcCIsICJpbnRyYS1wZXJpb2QiKQorICAgICAgICAgICAgICAgLmxpbWl0VG8oRDo6RU5DT0RFUiAmIEQ6OlZJREVPKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSU5UUkFfUkVGUkVTSF9QRVJJT0QsIEMyX1BBUkFNS0VZX0lOVFJBX1JFRlJFU0gsICJwZXJpb2QiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyAmIEQ6OkVOQ09ERVIpCisgICAgICAgIC53aXRoTWFwcGVycyhtYWtlRmxvYXQsIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICAvLyByZWFkIGJhY2sgYWx3YXlzIGFzIGludAorICAgICAgICAgICAgZmxvYXQgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiAoaW50MzJfdCl2YWx1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihQQVJBTUVURVJfS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgICJjb2RpbmcucmVxdWVzdC1zeW5jIiwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6UEFSQU0gJiBEOjpFTkNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlKSAtPiBDMlZhbHVlIHsgcmV0dXJuIHVpbnQzMl90KDEpOyB9KSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihQQVJBTUVURVJfS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSwKKyAgICAgICAgICAgICAgICAgICAgIEMyX1BBUkFNS0VZX1JFUVVFU1RfU1lOQ19GUkFNRSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6UEFSQU0gJiBEOjpFTkNPREVSKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlKSAtPiBDMlZhbHVlIHsgcmV0dXJuIHVpbnQzMl90KDEpOyB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9PUEVSQVRJTkdfUkFURSwgICBDMl9QQVJBTUtFWV9PUEVSQVRJTkdfUkFURSwgICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlBBUkFNIHwgRDo6Q09ORklHKSAvLyB3cml0ZS1vbmx5CisgICAgICAgIC53aXRoTWFwcGVyKG1ha2VGbG9hdCkpOworICAgIC8vIEMyIHByaW9yaXRpZXMgYXJlIGludmVydGVkCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUFJJT1JJVFksICAgICAgICAgQzJfUEFSQU1LRVlfUFJJT1JJVFksICAgICAgICAgICAidmFsdWUiKQorICAgICAgICAud2l0aE1hcHBlcnMobmVnYXRlLCBuZWdhdGUpKTsKKyAgICAvLyByZW1vdmUgd2hlbiBjb2RlY3Mgc3dpdGNoIHRvIFBBUkFNS0VZCisgICAgZGVwcmVjYXRlZChDb25maWdNYXBwZXIoS0VZX09QRVJBVElOR19SQVRFLCAgICJjdHJsLm9wZXJhdGluZy1yYXRlIiwgICAgICJ2YWx1ZSIpCisgICAgICAgICAgICAgICAud2l0aE1hcHBlcihtYWtlRmxvYXQpKTsKKyAgICBkZXByZWNhdGVkKENvbmZpZ01hcHBlcihLRVlfUFJJT1JJVFksICAgICAgICAgImN0cmwucHJpb3JpdHkiLCAgICAgICAgICAgInZhbHVlIikpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfV0lEVEgsICAgICAgICAgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFLCAgICAgICAid2lkdGgiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSEVJR0hULCAgICAgICAgQzJfUEFSQU1LRVlfUElDVFVSRV9TSVpFLCAgICAgICAiaGVpZ2h0IikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gfCBEOjpJTUFHRSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcigiY3JvcC1sZWZ0IiwgICAgICAgQzJfUEFSQU1LRVlfQ1JPUF9SRUNULCAgICAgICAibGVmdCIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPIHwgRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKCJjcm9wLXRvcCIsICAgICAgICBDMl9QQVJBTUtFWV9DUk9QX1JFQ1QsICAgICAgICJ0b3AiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY3JvcC13aWR0aCIsICAgICAgQzJfUEFSQU1LRVlfQ1JPUF9SRUNULCAgICAgICAid2lkdGgiKQorICAgICAgICAubGltaXRUbyhEOjpWSURFTyB8IEQ6OklNQUdFKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcigiY3JvcC1oZWlnaHQiLCAgICAgQzJfUEFSQU1LRVlfQ1JPUF9SRUNULCAgICAgICAiaGVpZ2h0IikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gfCBEOjpJTUFHRSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUFYX1dJRFRILCAgICAgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSwgICAgIndpZHRoIikKKyAgICAgICAgLmxpbWl0VG8oKEQ6OlZJREVPIHwgRDo6SU1BR0UpICYgRDo6UkFXKSk7CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTUFYX0hFSUdIVCwgICAgQzJfUEFSQU1LRVlfTUFYX1BJQ1RVUkVfU0laRSwgICAgImhlaWdodCIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykpOworCisgICAgYWRkKENvbmZpZ01hcHBlcigiY3NkLTAiLCAgICAgICAgICAgQzJfUEFSQU1LRVlfSU5JVF9EQVRBLCAgICAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpPVVRQVVQgJiBEOjpSRUFEKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9IRFIxMF9QTFVTX0lORk8sIEMyX1BBUkFNS0VZX0lOUFVUX0hEUjEwX1BMVVNfSU5GTywgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6VklERU8gJiBEOjpQQVJBTSAmIEQ6OklOUFVUKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9IRFIxMF9QTFVTX0lORk8sIEMyX1BBUkFNS0VZX09VVFBVVF9IRFIxMF9QTFVTX0lORk8sICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6T1VUUFVUKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORywgIiIpCisgICAgICAgIC5saW1pdFRvKEQ6OkVOQ09ERVIgJiBEOjpWSURFTyAmIEQ6Ok9VVFBVVCkpOworCisgICAgLy8gUGl4ZWwgRm9ybWF0ICh1c2UgbG9jYWwga2V5IGZvciBhY3R1YWwgcGl4ZWwgZm9ybWF0IGFzIHdlIGRvbid0IGRpc3Rpbmd1aXNoIGJldHdlZW4KKyAgICAvLyBTREsgbGF5b3V0cyBmb3IgZmxleGlibGUgZm9ybWF0IGFuZCB3ZSBuZWVkIHRoZSBhY3R1YWwgU0RLIGNvbG9yIGZvcm1hdCBpbiB0aGUgbWVkaWEgZm9ybWF0KQorICAgIGFkZChDb25maWdNYXBwZXIoImFuZHJvaWQuX2NvbG9yLWZvcm1hdCIsICBDMl9QQVJBTUtFWV9QSVhFTF9GT1JNQVQsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKChEOjpWSURFTyB8IEQ6OklNQUdFKSAmIEQ6OlJBVykKKyAgICAgICAgLndpdGhNYXBwZXJzKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHZhbHVlKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0U3VyZmFjZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodWludDMyX3QpSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1aW50MzJfdClIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODg7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHVpbnQzMl90KUhBTF9QSVhFTF9GT1JNQVRfWVYxMjsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgc29tZSBzb3J0IG9mIHBhc3N0aHJvdWdoCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9LCBbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgdWludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAodi5nZXQoJnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ09MT1JfRm9ybWF0U3VyZmFjZTsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBIQUxfUElYRUxfRk9STUFUX1lWMTI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4OgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBzb21lIHNvcnQgb2YgcGFzc3Rocm91Z2gKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0NIQU5ORUxfQ09VTlQsIEMyX1BBUkFNS0VZX0NIQU5ORUxfQ09VTlQsICAgICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPKSk7IC8vIHJlYWQgYmFjayB0byBib3RoIGZvcm1hdHMKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9DSEFOTkVMX0NPVU5ULCBDMl9QQVJBTUtFWV9DT0RFRF9DSEFOTkVMX0NPVU5ULCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkNPREVEKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9TQU1QTEVfUkFURSwgICBDMl9QQVJBTUtFWV9TQU1QTEVfUkFURSwgICAgICAgICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPKSk7IC8vIHJlYWQgYmFjayB0byBib3RoIHBvcnQgZm9ybWF0cworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1NBTVBMRV9SQVRFLCAgIEMyX1BBUkFNS0VZX0NPREVEX1NBTVBMRV9SQVRFLCAgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpDT0RFRCkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUENNX0VOQ09ESU5HLCAgQzJfUEFSQU1LRVlfUENNX0VOQ09ESU5HLCAgICAgICAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTykKKyAgICAgICAgLndpdGhNYXBwZXJzKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgQzJDb25maWc6OnBjbV9lbmNvZGluZ190IHRvOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkgJiYgQzJNYXBwZXI6Om1hcCh2YWx1ZSwgJnRvKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0bzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0sIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgdmFsdWU7CisgICAgICAgICAgICBpbnQzMl90IHRvOworICAgICAgICAgICAgdXNpbmcgQzJWYWx1ZVR5cGU9dHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxkZWNsdHlwZSh2YWx1ZSk+Ojp0eXBlOworICAgICAgICAgICAgaWYgKHYuZ2V0KChDMlZhbHVlVHlwZSopJnZhbHVlKSAmJiBDMk1hcHBlcjo6bWFwKHZhbHVlLCAmdG8pKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRvOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfSVNfQURUUywgQzJfUEFSQU1LRVlfQUFDX1BBQ0tBR0lORywgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpDT0RFRCkKKyAgICAgICAgLndpdGhNYXBwZXJzKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKHYuZ2V0KCZ2YWx1ZSkgJiYgdmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJDb25maWc6OkFBQ19QQUNLQUdJTkdfQURUUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0sIFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICh2LmdldCgmdmFsdWUpICYmIHZhbHVlID09IEMyQ29uZmlnOjpBQUNfUEFDS0FHSU5HX0FEVFMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gKGludDMyX3QpMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBDMlZhbHVlKCk7CisgICAgICAgIH0pKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk1hcHBlcjo6UHJvZmlsZUxldmVsTWFwcGVyPiBtYXBwZXIgPQorICAgICAgICBDMk1hcHBlcjo6R2V0UHJvZmlsZUxldmVsTWFwcGVyKG1Db2RpbmdNZWRpYVR5cGUpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfUFJPRklMRSwgQzJfUEFSQU1LRVlfUFJPRklMRV9MRVZFTCwgInByb2ZpbGUiKQorICAgICAgICAubGltaXRUbyhEOjpDT0RFRCkKKyAgICAgICAgLndpdGhNYXBwZXJzKFttYXBwZXJdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBDMkNvbmZpZzo6cHJvZmlsZV90IGMyID0gUFJPRklMRV9VTlVTRUQ7CisgICAgICAgICAgICBpbnQzMl90IHNkazsKKyAgICAgICAgICAgIGlmIChtYXBwZXIgJiYgdi5nZXQoJnNkaykgJiYgbWFwcGVyLT5tYXBQcm9maWxlKHNkaywgJmMyKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBjMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBQUk9GSUxFX1VOVVNFRDsKKyAgICAgICAgfSwgW21hcHBlcl0oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpwcm9maWxlX3QgYzI7CisgICAgICAgICAgICBpbnQzMl90IHNkazsKKyAgICAgICAgICAgIHVzaW5nIEMyVmFsdWVUeXBlPXR5cGVuYW1lIF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGU8ZGVjbHR5cGUoYzIpPjo6dHlwZTsKKyAgICAgICAgICAgIGlmIChtYXBwZXIgJiYgdi5nZXQoKEMyVmFsdWVUeXBlKikmYzIpICYmIG1hcHBlci0+bWFwUHJvZmlsZShjMiwgJnNkaykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc2RrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEMyVmFsdWUoKTsKKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfTEVWRUwsIEMyX1BBUkFNS0VZX1BST0ZJTEVfTEVWRUwsICJsZXZlbCIpCisgICAgICAgIC5saW1pdFRvKEQ6OkNPREVEKQorICAgICAgICAud2l0aE1hcHBlcnMoW21hcHBlcl0oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGMyID0gTEVWRUxfVU5VU0VEOworICAgICAgICAgICAgaW50MzJfdCBzZGs7CisgICAgICAgICAgICBpZiAobWFwcGVyICYmIHYuZ2V0KCZzZGspICYmIG1hcHBlci0+bWFwTGV2ZWwoc2RrLCAmYzIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGMyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIExFVkVMX1VOVVNFRDsKKyAgICAgICAgfSwgW21hcHBlcl0oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIEMyQ29uZmlnOjpsZXZlbF90IGMyOworICAgICAgICAgICAgaW50MzJfdCBzZGs7CisgICAgICAgICAgICB1c2luZyBDMlZhbHVlVHlwZT10eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPGRlY2x0eXBlKGMyKT46OnR5cGU7CisgICAgICAgICAgICBpZiAobWFwcGVyICYmIHYuZ2V0KChDMlZhbHVlVHlwZSopJmMyKSAmJiBtYXBwZXItPm1hcExldmVsKGMyLCAmc2RrKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBzZGs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJWYWx1ZSgpOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIGRCRlMgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19UQVJHRVRfUkVGRVJFTkNFX0xFVkVMLCBDMl9QQVJBTUtFWV9EUkNfVEFSR0VUX1JFRkVSRU5DRV9MRVZFTCwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpERUNPREVSICYgRDo6Q09ORklHKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHByb3BlcnR5X2dldF9pbnQzMihQUk9QX0RSQ19PVkVSUklERV9SRUZfTEVWRUwsIERSQ19ERUZBVUxUX01PQklMRV9SRUZfTEVWRUwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZsb2F0KC0wLjI1ICogYzJfbWluKHZhbHVlLCAxMjcpKTsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byAwLTEgKCUpIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19EUkNfQVRURU5VQVRJT05fRkFDVE9SLCBDMl9QQVJBTUtFWV9EUkNfQVRURU5VQVRJT05fRkFDVE9SLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIgJiBEOjpDT05GSUcpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX0NVVCwgRFJDX0RFRkFVTFRfTU9CSUxFX0RSQ19DVVQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZsb2F0KGMyX21pbih2YWx1ZSwgMTI3KSAvIDEyNy4pOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIDAtMSAoJSkgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19CT09TVF9GQUNUT1IsIEMyX1BBUkFNS0VZX0RSQ19CT09TVF9GQUNUT1IsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUiAmIEQ6OkNPTkZJRykKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfQk9PU1QsIERSQ19ERUZBVUxUX01PQklMRV9EUkNfQk9PU1QpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZsb2F0KGMyX21pbih2YWx1ZSwgMTI3KSAvIDEyNy4pOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIGNvbXByZXNzaW9uIHR5cGUgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19IRUFWWV9DT01QUkVTU0lPTiwgQzJfUEFSQU1LRVlfRFJDX0NPTVBSRVNTSU9OX01PREUsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6REVDT0RFUiAmIEQ6OkNPTkZJRykKKyAgICAgICAgLndpdGhNYXBwZXIoW10oQzJWYWx1ZSB2KSAtPiBDMlZhbHVlIHsKKyAgICAgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgICAgICBpZiAoIXYuZ2V0KCZ2YWx1ZSkgfHwgdmFsdWUgPCAwKSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfSEVBVlksIERSQ19ERUZBVUxUX01PQklMRV9EUkNfSEVBVlkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09IDEgPyBDMkNvbmZpZzo6RFJDX0NPTVBSRVNTSU9OX0hFQVZZIDogQzJDb25maWc6OkRSQ19DT01QUkVTU0lPTl9MSUdIVDsKKyAgICAgICAgfSkpOworCisgICAgLy8gY29udmVydCB0byBkQkZTIGFuZCBhZGQgZGVmYXVsdAorICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0FBQ19FTkNPREVEX1RBUkdFVF9MRVZFTCwgQzJfUEFSQU1LRVlfRFJDX0VOQ09ERURfVEFSR0VUX0xFVkVMLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIgJiBEOjpDT05GSUcpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgMCkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gcHJvcGVydHlfZ2V0X2ludDMyKFBST1BfRFJDX09WRVJSSURFX0VOQ19MRVZFTCwgRFJDX0RFRkFVTFRfTU9CSUxFX0VOQ19MRVZFTCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmxvYXQoLTAuMjUgKiBjMl9taW4odmFsdWUsIDEyNykpOworICAgICAgICB9KSk7CisKKyAgICAvLyBjb252ZXJ0IHRvIGVmZmVjdCB0eXBlICh0aGVzZSBtYXAgdG8gU0RLIHZhbHVlcykgYW5kIGFkZCBkZWZhdWx0CisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX0RSQ19FRkZFQ1RfVFlQRSwgQzJfUEFSQU1LRVlfRFJDX0VGRkVDVF9UWVBFLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpBVURJTyAmIEQ6OkRFQ09ERVIgJiBEOjpDT05GSUcpCisgICAgICAgIC53aXRoTWFwcGVyKFtdKEMyVmFsdWUgdikgLT4gQzJWYWx1ZSB7CisgICAgICAgICAgICBpbnQzMl90IHZhbHVlOworICAgICAgICAgICAgaWYgKCF2LmdldCgmdmFsdWUpIHx8IHZhbHVlIDwgLTEgfHwgdmFsdWUgPiA4KSB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSBwcm9wZXJ0eV9nZXRfaW50MzIoUFJPUF9EUkNfT1ZFUlJJREVfRUZGRUNULCBEUkNfREVGQVVMVF9NT0JJTEVfRFJDX0VGRkVDVCk7CisgICAgICAgICAgICAgICAgLy8gZW5zdXJlIHZhbHVlIGlzIHdpdGhpbiByYW5nZQorICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA8IC0xIHx8IHZhbHVlID4gOCkgeworICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IERSQ19ERUZBVUxUX01PQklMRV9EUkNfRUZGRUNUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKKyAgICAgICAgfSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfQUFDX01BWF9PVVRQVVRfQ0hBTk5FTF9DT1VOVCwgQzJfUEFSQU1LRVlfTUFYX0NIQU5ORUxfQ09VTlQsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPKSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9BQUNfU0JSX01PREUsIEMyX1BBUkFNS0VZX0FBQ19TQlJfTU9ERSwgInZhbHVlIikKKyAgICAgICAgLmxpbWl0VG8oRDo6QVVESU8gJiBEOjpFTkNPREVSICYgRDo6Q09ORklHKQorICAgICAgICAud2l0aE1hcHBlcihbXShDMlZhbHVlIHYpIC0+IEMyVmFsdWUgeworICAgICAgICAgICAgaW50MzJfdCB2YWx1ZTsKKyAgICAgICAgICAgIGlmICghdi5nZXQoJnZhbHVlKSB8fCB2YWx1ZSA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJDb25maWc6OkFBQ19TQlJfQVVUTzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDA6IHJldHVybiBDMkNvbmZpZzo6QUFDX1NCUl9PRkY7CisgICAgICAgICAgICAgICAgY2FzZSAxOiByZXR1cm4gQzJDb25maWc6OkFBQ19TQlJfU0lOR0xFX1JBVEU7CisgICAgICAgICAgICAgICAgY2FzZSAyOiByZXR1cm4gQzJDb25maWc6OkFBQ19TQlJfRFVBTF9SQVRFOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHJldHVybiBDMkNvbmZpZzo6QUFDX1NCUl9BVVRPICsgMTsgLy8gaW52YWxpZCB2YWx1ZQorICAgICAgICAgICAgfQorICAgICAgICB9KSk7CisKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9RVUFMSVRZLCBDMl9QQVJBTUtFWV9RVUFMSVRZLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNKSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUwsIEMyX1BBUkFNS0VZX0NPTVBMRVhJVFksICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OkFVRElPICYgRDo6RU5DT0RFUikpOworICAgIGFkZChDb25maWdNYXBwZXIoImNvbXBsZXhpdHkiLCBDMl9QQVJBTUtFWV9DT01QTEVYSVRZLCAidmFsdWUiKQorICAgICAgICAubGltaXRUbyhEOjpFTkNPREVSICYgKEQ6OkNPTkZJRyB8IEQ6OlBBUkFNKSkpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihLRVlfR1JJRF9DT0xVTU5TLCBDMl9QQVJBTUtFWV9USUxFX0xBWU9VVCwgImNvbHVtbnMiKQorICAgICAgICAubGltaXRUbyhEOjpJTUFHRSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0dSSURfUk9XUywgQzJfUEFSQU1LRVlfVElMRV9MQVlPVVQsICJyb3dzIikKKyAgICAgICAgLmxpbWl0VG8oRDo6SU1BR0UpKTsKKyAgICBhZGQoQ29uZmlnTWFwcGVyKEtFWV9USUxFX1dJRFRILCBDMl9QQVJBTUtFWV9USUxFX0xBWU9VVCwgInRpbGUud2lkdGgiKQorICAgICAgICAubGltaXRUbyhEOjpJTUFHRSkpOworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX1RJTEVfSEVJR0hULCBDMl9QQVJBTUtFWV9USUxFX0xBWU9VVCwgInRpbGUuaGVpZ2h0IikKKyAgICAgICAgLmxpbWl0VG8oRDo6SU1BR0UpKTsKKworICAgIGFkZChDb25maWdNYXBwZXIoS0VZX0xBVEVOQ1ksIEMyX1BBUkFNS0VZX1BJUEVMSU5FX0RFTEFZX1JFUVVFU1QsICJ2YWx1ZSIpCisgICAgICAgIC5saW1pdFRvKEQ6OlZJREVPICYgRDo6RU5DT0RFUikpOworCisgICAgYWRkKENvbmZpZ01hcHBlcihDMl9QQVJBTUtFWV9JTlBVVF9USU1FX1NUUkVUQ0gsIEMyX1BBUkFNS0VZX0lOUFVUX1RJTUVfU1RSRVRDSCwgInZhbHVlIikpOworCisgICAgLyogc3RpbGwgdG8gZG8KKyAgICBjb25zdGV4cHIgY2hhciBLRVlfUFVTSF9CTEFOS19CVUZGRVJTX09OX1NUT1BbXSA9ICJwdXNoLWJsYW5rLWJ1ZmZlcnMtb24tc2h1dGRvd24iOworCisgICAgICAgbm90IHlldCB1c2VkIGJ5IE1lZGlhQ29kZWMsIGJ1dCBkZWZpbmVkIGFzIE1lZGlhRm9ybWF0CisgICAgS0VZX0FVRElPX1NFU1NJT05fSUQgLy8gd2UgdXNlICJhdWRpby1ody1zeW5jIgorICAgIEtFWV9PVVRQVVRfUkVPUkRFUl9ERVBUSAorICAgICovCit9CisKK3N0YXR1c190IENDb2RlY0NvbmZpZzo6aW5pdGlhbGl6ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gJmNsaWVudCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KSB7CisgICAgQzJDb21wb25lbnREb21haW5TZXR0aW5nIGRvbWFpbihDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSKTsKKyAgICBDMkNvbXBvbmVudEtpbmRTZXR0aW5nIGtpbmQoQzJDb21wb25lbnQ6OktJTkRfT1RIRVIpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBxdWVyaWVkOworICAgIGMyX3N0YXR1c190IGMyZXJyID0gY29tcG9uZW50LT5xdWVyeSh7ICZkb21haW4sICZraW5kIH0sIHt9LCBDMl9ET05UX0JMT0NLLCAmcXVlcmllZCk7CisgICAgaWYgKGMyZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJRdWVyeSBkb21haW4gJiBraW5kIGZhaWxlZCA9PiAlcyIsIGFzU3RyaW5nKGMyZXJyKSk7CisgICAgICAgIC8vIFRFTVA6IGRldGVybWluZSBraW5kIGZyb20gY29tcG9uZW50IG5hbWUKKyAgICAgICAgaWYgKGtpbmQudmFsdWUgPT0gQzJDb21wb25lbnQ6OktJTkRfT1RIRVIpIHsKKyAgICAgICAgICAgIGlmIChjb21wb25lbnQtPmdldE5hbWUoKS5maW5kKCJlbmNvZGVyIikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgICAgICBraW5kLnZhbHVlID0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoY29tcG9uZW50LT5nZXROYW1lKCkuZmluZCgiZGVjb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAga2luZC52YWx1ZSA9IEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBURU1QOiBkZXRlcm1pbmUgZG9tYWluIGZyb20gbWVkaWEgdHlwZSAocG9ydCAocHJlZmVycmVkKSBvciBzdHJlYW0gIzApCisgICAgICAgIGlmIChkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9PVEhFUikgeworICAgICAgICAgICAgQVN0cmluZyBtZWRpYVR5cGUgPSBRdWVyeU1lZGlhVHlwZSh0cnVlIC8qIGlucHV0ICovLCBjb21wb25lbnQpOworICAgICAgICAgICAgaWYgKG1lZGlhVHlwZS5zdGFydHNXaXRoKCJhdWRpby8iKSkgeworICAgICAgICAgICAgICAgIGRvbWFpbi52YWx1ZSA9IEMyQ29tcG9uZW50OjpET01BSU5fQVVESU87CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgICAgIGRvbWFpbi52YWx1ZSA9IEMyQ29tcG9uZW50OjpET01BSU5fVklERU87CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZS5zdGFydHNXaXRoKCJpbWFnZS8iKSkgeworICAgICAgICAgICAgICAgIGRvbWFpbi52YWx1ZSA9IEMyQ29tcG9uZW50OjpET01BSU5fSU1BR0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtRG9tYWluID0gKGRvbWFpbi52YWx1ZSA9PSBDMkNvbXBvbmVudDo6RE9NQUlOX1ZJREVPID8gRG9tYWluOjpJU19WSURFTyA6CisgICAgICAgICAgICAgICBkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRSA/IERvbWFpbjo6SVNfSU1BR0UgOgorICAgICAgICAgICAgICAgZG9tYWluLnZhbHVlID09IEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8gPyBEb21haW46OklTX0FVRElPIDogRG9tYWluOjpPVEhFUl9ET01BSU4pCisgICAgICAgICAgICB8IChraW5kLnZhbHVlID09IEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIgPyBEb21haW46OklTX0RFQ09ERVIgOgorICAgICAgICAgICAgICAga2luZC52YWx1ZSA9PSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSID8gRG9tYWluOjpJU19FTkNPREVSIDogRG9tYWluOjpPVEhFUl9LSU5EKTsKKworICAgIG1JbnB1dERvbWFpbiA9IERvbWFpbigoKG1Eb21haW4gJiBJU19ERUNPREVSKSA/IElTX0NPREVEIDogSVNfUkFXKSB8IElTX0lOUFVUKTsKKyAgICBtT3V0cHV0RG9tYWluID0gRG9tYWluKCgobURvbWFpbiAmIElTX0VOQ09ERVIpID8gSVNfQ09ERUQgOiBJU19SQVcpIHwgSVNfT1VUUFVUKTsKKworICAgIEFMT0dWKCJkb21haW4gaXMgJSN4ICgldSAldSkiLCBtRG9tYWluLCBkb21haW4udmFsdWUsIGtpbmQudmFsdWUpOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IHBhcmFtSW5kaWNlczsKKyAgICBzd2l0Y2ggKGtpbmQudmFsdWUpIHsKKyAgICBjYXNlIEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVI6CisgICAgICAgIG1Db2RpbmdNZWRpYVR5cGUgPSBRdWVyeU1lZGlhVHlwZSh0cnVlIC8qIGlucHV0ICovLCBjb21wb25lbnQpLmNfc3RyKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjoKKyAgICAgICAgbUNvZGluZ01lZGlhVHlwZSA9IFF1ZXJ5TWVkaWFUeXBlKGZhbHNlIC8qIGlucHV0ICovLCBjb21wb25lbnQpLmNfc3RyKCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIG1Db2RpbmdNZWRpYVR5cGUgPSAiIjsKKyAgICB9CisKKyAgICBjMmVyciA9IGNvbXBvbmVudC0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMoJm1QYXJhbURlc2NzKTsKKyAgICBpZiAoYzJlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoIlF1ZXJ5IHN1cHBvcnRlZCBwYXJhbXMgZmFpbGVkIGFmdGVyIHJldHVybmluZyAlenUgdmFsdWVzID0+ICVzIiwKKyAgICAgICAgICAgICAgICBtUGFyYW1EZXNjcy5zaXplKCksIGFzU3RyaW5nKGMyZXJyKSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gJmRlc2MgOiBtUGFyYW1EZXNjcykgeworICAgICAgICBtU3VwcG9ydGVkSW5kaWNlcy5lbXBsYWNlKGRlc2MtPmluZGV4KCkpOworICAgIH0KKworICAgIG1SZWZsZWN0b3IgPSBjbGllbnQtPmdldFBhcmFtUmVmbGVjdG9yKCk7CisgICAgaWYgKG1SZWZsZWN0b3IgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGdldCBwYXJhbSByZWZsZWN0b3IiKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgLy8gZW51bWVyYXRlIGFsbCBmaWVsZHMKKyAgICBtUGFyYW1VcGRhdGVyID0gc3RkOjptYWtlX3NoYXJlZDxSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI+KCk7CisgICAgbVBhcmFtVXBkYXRlci0+Y2xlYXIoKTsKKyAgICBtUGFyYW1VcGRhdGVyLT5zdXBwb3J0V2hvbGVQYXJhbSgKKyAgICAgICAgICAgIEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6OkNPUkVfSU5ERVgpOworICAgIG1QYXJhbVVwZGF0ZXItPmFkZFBhcmFtRGVzYyhtUmVmbGVjdG9yLCBtUGFyYW1EZXNjcyk7CisKKyAgICAvLyBURU1QOiBhZGQgc29tZSBzdGFuZGFyZCBmaWVsZHMgZXZlbiBpZiBub3QgcmVmbGVjdGVkCisgICAgaWYgKGtpbmQudmFsdWUgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUikgeworICAgICAgICBtUGFyYW1VcGRhdGVyLT5hZGRTdGFuZGFyZFBhcmFtPEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ+KEMyX1BBUkFNS0VZX0lOSVRfREFUQSk7CisgICAgfQorICAgIGlmIChkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRSB8fCBkb21haW4udmFsdWUgPT0gQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTykgeworICAgICAgICBpZiAoa2luZC52YWx1ZSAhPSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSKSB7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtPEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjpvdXRwdXQ+KEMyX1BBUkFNS0VZX1BJQ1RVUkVfU0laRSk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtPEMyU3RyZWFtQ3JvcFJlY3RJbmZvOjpvdXRwdXQ+KEMyX1BBUkFNS0VZX0NST1BfUkVDVCk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKAorICAgICAgICAgICAgICAgICAgICBuZXcgQzJTdHJlYW1QaXhlbEFzcGVjdFJhdGlvSW5mbzo6b3V0cHV0KDB1LCAxdSwgMXUpLAorICAgICAgICAgICAgICAgICAgICBDMl9QQVJBTUtFWV9QSVhFTF9BU1BFQ1RfUkFUSU8pOworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbShuZXcgQzJTdHJlYW1Sb3RhdGlvbkluZm86Om91dHB1dCgwdSwgMCksIEMyX1BBUkFNS0VZX1JPVEFUSU9OKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW0obmV3IEMyU3RyZWFtQ29sb3JBc3BlY3RzSW5mbzo6b3V0cHV0KDB1KSwgQzJfUEFSQU1LRVlfQ09MT1JfQVNQRUNUUyk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtPEMyU3RyZWFtRGF0YVNwYWNlSW5mbzo6b3V0cHV0PihDMl9QQVJBTUtFWV9EQVRBX1NQQUNFKTsKKyAgICAgICAgICAgIGFkZExvY2FsUGFyYW08QzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ+KEMyX1BBUkFNS0VZX0hEUl9TVEFUSUNfSU5GTyk7CisgICAgICAgICAgICBhZGRMb2NhbFBhcmFtKG5ldyBDMlN0cmVhbVN1cmZhY2VTY2FsaW5nSW5mbzo6b3V0cHV0KDB1LCBWSURFT19TQ0FMSU5HX01PREVfU0NBTEVfVE9fRklUKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJfUEFSQU1LRVlfU1VSRkFDRV9TQ0FMSU5HX01PREUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYWRkTG9jYWxQYXJhbShuZXcgQzJTdHJlYW1Db2xvckFzcGVjdHNJbmZvOjppbnB1dCgwdSksIEMyX1BBUkFNS0VZX0NPTE9SX0FTUEVDVFMpOworICAgICAgICB9CisgICAgfQorCisgICAgaW5pdGlhbGl6ZVN0YW5kYXJkUGFyYW1zKCk7CisKKyAgICAvLyBzdWJzY3JpYmUgdG8gYWxsIHN1cHBvcnRlZCBzdGFuZGFyZCAoZXhwb3NlZCkgcGFyYW1zCisgICAgLy8gVE9ETzogbGltaXQgdGhpcyB0byBwYXJhbXMgdGhhdCBhcmUgYWN0dWFsbHkgaW4gdGhlIGRvbWFpbgorICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmb3JtYXRLZXlzID0gbVN0YW5kYXJkUGFyYW1zLT5nZXRQYXRoc0ZvckRvbWFpbihEb21haW4oMSA8PCAzMCkpOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzOworICAgIG1QYXJhbVVwZGF0ZXItPmdldFBhcmFtSW5kaWNlc0ZvcktleXMoZm9ybWF0S2V5cywgJmluZGljZXMpOworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5pbnNlcnQoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpKTsKKworICAgIC8vIGFsc28gc3Vic2NyaWJlIHRvIHNvbWUgbm9uLVNESyBzdGFuZGFyZCBwYXJhbWV0ZXJzCisgICAgLy8gZm9yIG51bWJlciBvZiBpbnB1dC9vdXRwdXQgYnVmZmVycworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyUG9ydFN1Z2dlc3RlZEJ1ZmZlckNvdW50VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJQb3J0U3VnZ2VzdGVkQnVmZmVyQ291bnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nOjpQQVJBTV9UWVBFKTsKKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlBvcnRBY3R1YWxEZWxheVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyUG9ydEFjdHVhbERlbGF5VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworICAgIC8vIGZvciBvdXRwdXQgYnVmZmVyIGFycmF5IGFsbG9jYXRpb24KKyAgICBtU3Vic2NyaWJlZEluZGljZXMuZW1wbGFjZShDMlN0cmVhbU1heEJ1ZmZlclNpemVJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworICAgIC8vIGluaXQgZGF0YSAoQ1NEKQorICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5lbXBsYWNlKEMyU3RyZWFtSW5pdERhdGFJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OnN1YnNjcmliZVRvQ29uZmlnVXBkYXRlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaW5kaWNlcywKKyAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZykgeworICAgIG1TdWJzY3JpYmVkSW5kaWNlcy5pbnNlcnQoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpKTsKKyAgICAvLyBUT0RPOiBlbmFibGUgdGhpcyB3aGVuIGNvbXBvbmVudHMgbm8gbG9uZ2VyIGNyYXNoIG9uIHRoaXMgY29uZmlnCisgICAgaWYgKG1TdWJzY3JpYmVkSW5kaWNlcy5zaXplKCkgIT0gbVN1YnNjcmliZWRJbmRpY2VzU2l6ZSAmJiBmYWxzZSkgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gaW5kaWNlczsKKyAgICAgICAgZm9yIChDMlBhcmFtOjpJbmRleCBpeCA6IG1TdWJzY3JpYmVkSW5kaWNlcykgeworICAgICAgICAgICAgaW5kaWNlcy5wdXNoX2JhY2soaXgpOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc+IHN1YnNjcmliZVR1bmluZyA9CisgICAgICAgICAgICBDMlN1YnNjcmliZWRQYXJhbUluZGljZXNUdW5pbmc6OkFsbG9jVW5pcXVlKGluZGljZXMpOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gcmVzdWx0czsKKyAgICAgICAgYzJfc3RhdHVzX3QgYzJFcnIgPSBjb21wb25lbnQtPmNvbmZpZyh7IHN1YnNjcmliZVR1bmluZy5nZXQoKSB9LCBibG9ja2luZywgJnJlc3VsdHMpOworICAgICAgICBpZiAoYzJFcnIgIT0gQzJfT0sgJiYgYzJFcnIgIT0gQzJfQkFEX0lOREVYKSB7CisgICAgICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIHN1YnNjcmliZSB0byBwYXJhbWV0ZXJzID0+ICVzIiwgYXNTdHJpbmcoYzJFcnIpKTsKKyAgICAgICAgICAgIC8vIFRPRE86IGVycm9yCisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIlN1YnNjcmliZWQgdG8gJXp1IHBhcmFtcyIsIG1TdWJzY3JpYmVkSW5kaWNlcy5zaXplKCkpOworICAgICAgICBtU3Vic2NyaWJlZEluZGljZXNTaXplID0gbVN1YnNjcmliZWRJbmRpY2VzLnNpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBDQ29kZWNDb25maWc6OnF1ZXJ5Q29uZmlndXJhdGlvbigKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50KSB7CisgICAgLy8gcXVlcnkgYWxsIHN1YnNjcmliZWQgcGFyYW1ldGVycworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzKG1TdWJzY3JpYmVkSW5kaWNlcy5iZWdpbigpLCBtU3Vic2NyaWJlZEluZGljZXMuZW5kKCkpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcXVlcmllZDsKKyAgICBjMl9zdGF0dXNfdCBjMkVyciA9IGNvbXBvbmVudC0+cXVlcnkoe30sIGluZGljZXMsIEMyX01BWV9CTE9DSywgJnF1ZXJpZWQpOworICAgIGlmIChjMkVyciAhPSBPSykgeworICAgICAgICBBTE9HSSgicXVlcnkgZmFpbGVkIGFmdGVyIHJldHVybmluZyAlenUgdmFsdWVzICglcykiLCBxdWVyaWVkLnNpemUoKSwgYXNTdHJpbmcoYzJFcnIpKTsKKyAgICAgICAgLy8gVE9ETzogZXJyb3IKKyAgICB9CisKKyAgICB1cGRhdGVDb25maWd1cmF0aW9uKHF1ZXJpZWQsIEFMTCk7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIENDb2RlY0NvbmZpZzo6dXBkYXRlQ29uZmlndXJhdGlvbigKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmY29uZmlnVXBkYXRlLCBEb21haW4gZG9tYWluKSB7CisgICAgQUxPR1YoInVwZGF0aW5nIGNvbmZpZ3VyYXRpb24gd2l0aCAlenUgcGFyYW1zIiwgY29uZmlnVXBkYXRlLnNpemUoKSk7CisgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gJnAgOiBjb25maWdVcGRhdGUpIHsKKyAgICAgICAgaWYgKHAgJiYgKnApIHsKKyAgICAgICAgICAgIGF1dG8gaW5zZXJ0aW9uID0gbUN1cnJlbnRDb25maWcuZW1wbGFjZShwLT5pbmRleCgpLCBudWxscHRyKTsKKyAgICAgICAgICAgIGlmIChpbnNlcnRpb24uc2Vjb25kIHx8ICppbnNlcnRpb24uZmlyc3QtPnNlY29uZCAhPSAqcCkgeworICAgICAgICAgICAgICAgIGlmIChtU3VwcG9ydGVkSW5kaWNlcy5jb3VudChwLT5pbmRleCgpKSB8fCBtTG9jYWxQYXJhbXMuY291bnQocC0+aW5kZXgoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gb25seSB0cmFjayBjaGFuZ2VzIGluIHN1cHBvcnRlZCAocmVmbGVjdGVkIG9yIGxvY2FsKSBpbmRpY2VzCisgICAgICAgICAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJhbiB1bmxpc3RlZCBjb25maWcgd2FzICVzOiAlI3giLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc2VydGlvbi5zZWNvbmQgPyAiYWRkZWQiIDogInVwZGF0ZWQiLCBwLT5pbmRleCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnNlcnRpb24uZmlyc3QtPnNlY29uZCA9IHN0ZDo6bW92ZShwKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJ1cGRhdGVkIGNvbmZpZ3VyYXRpb24gaGFzICV6dSBwYXJhbXMgKCVzKSIsIG1DdXJyZW50Q29uZmlnLnNpemUoKSwKKyAgICAgICAgICAgIGNoYW5nZWQgPyAiQ0hBTkdFRCIgOiAibm8gY2hhbmdlIik7CisgICAgaWYgKGNoYW5nZWQpIHsKKyAgICAgICAgcmV0dXJuIHVwZGF0ZUZvcm1hdHMoZG9tYWluKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIENDb2RlY0NvbmZpZzo6dXBkYXRlRm9ybWF0cyhEb21haW4gZG9tYWluKSB7CisgICAgLy8gZ2V0IGFkZHJlc3NlcyBvZiBwYXJhbXMgaW4gdGhlIGN1cnJlbnQgY29uZmlnCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtUG9pbnRlcnM7CisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IG1DdXJyZW50Q29uZmlnKSB7CisgICAgICAgIHBhcmFtUG9pbnRlcnMucHVzaF9iYWNrKGl0LnNlY29uZC5nZXQoKSk7CisgICAgfQorCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IHJlZmxlY3RlZCA9IG1QYXJhbVVwZGF0ZXItPmdldFBhcmFtcyhwYXJhbVBvaW50ZXJzKTsKKyAgICBzdGQ6OnN0cmluZyBjb25maWcgPSByZWZsZWN0ZWQuZGVidWdTdHJpbmcoKTsKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gY29uZmlnTGluZXM7CisgICAgc3RkOjpzdHJpbmcgZGlmZjsKKyAgICBmb3IgKHNpemVfdCBzdGFydCA9IDA7IHN0YXJ0ICE9IHN0ZDo6c3RyaW5nOjpucG9zOyApIHsKKyAgICAgICAgc2l6ZV90IGVuZCA9IGNvbmZpZy5maW5kKCdcbicsIHN0YXJ0KTsKKyAgICAgICAgc2l6ZV90IGNvdW50ID0gKGVuZCA9PSBzdGQ6OnN0cmluZzo6bnBvcykKKyAgICAgICAgICAgICAgICA/IHN0ZDo6c3RyaW5nOjpucG9zCisgICAgICAgICAgICAgICAgOiBlbmQgLSBzdGFydCArIDE7CisgICAgICAgIHN0ZDo6c3RyaW5nIGxpbmUgPSBjb25maWcuc3Vic3RyKHN0YXJ0LCBjb3VudCk7CisgICAgICAgIGNvbmZpZ0xpbmVzLmluc2VydChsaW5lKTsKKyAgICAgICAgaWYgKG1MYXN0Q29uZmlnLmNvdW50KGxpbmUpID09IDApIHsKKyAgICAgICAgICAgIGRpZmYuYXBwZW5kKGxpbmUpOworICAgICAgICB9CisgICAgICAgIHN0YXJ0ID0gKGVuZCA9PSBzdGQ6OnN0cmluZzo6bnBvcykgPyBzdGQ6OnN0cmluZzo6bnBvcyA6IGVuZCArIDE7CisgICAgfQorICAgIGlmICghZGlmZi5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dEKCJjMiBjb25maWcgZGlmZiBpcyAlcyIsIGRpZmYuY19zdHIoKSk7CisgICAgfQorICAgIG1MYXN0Q29uZmlnLnN3YXAoY29uZmlnTGluZXMpOworCisgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgaWYgKGRvbWFpbiAmIG1JbnB1dERvbWFpbikgeworICAgICAgICBzcDxBTWVzc2FnZT4gb2xkRm9ybWF0ID0gbUlucHV0Rm9ybWF0OworICAgICAgICBtSW5wdXRGb3JtYXQgPSBtSW5wdXRGb3JtYXQtPmR1cCgpOyAvLyB0cmlnZ2VyIGZvcm1hdCBjaGFuZ2VkCisgICAgICAgIG1JbnB1dEZvcm1hdC0+ZXh0ZW5kKGdldFNka0Zvcm1hdEZvckRvbWFpbihyZWZsZWN0ZWQsIG1JbnB1dERvbWFpbikpOworICAgICAgICBpZiAobUlucHV0Rm9ybWF0LT5jb3VudEVudHJpZXMoKSAhPSBvbGRGb3JtYXQtPmNvdW50RW50cmllcygpCisgICAgICAgICAgICAgICAgfHwgbUlucHV0Rm9ybWF0LT5jaGFuZ2VzRnJvbShvbGRGb3JtYXQpLT5jb3VudEVudHJpZXMoKSA+IDApIHsKKyAgICAgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUlucHV0Rm9ybWF0ID0gb2xkRm9ybWF0OyAvLyBubyBjaGFuZ2UKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZG9tYWluICYgbU91dHB1dERvbWFpbikgeworICAgICAgICBzcDxBTWVzc2FnZT4gb2xkRm9ybWF0ID0gbU91dHB1dEZvcm1hdDsKKyAgICAgICAgbU91dHB1dEZvcm1hdCA9IG1PdXRwdXRGb3JtYXQtPmR1cCgpOyAvLyB0cmlnZ2VyIG91dHB1dCBmb3JtYXQgY2hhbmdlZAorICAgICAgICBtT3V0cHV0Rm9ybWF0LT5leHRlbmQoZ2V0U2RrRm9ybWF0Rm9yRG9tYWluKHJlZmxlY3RlZCwgbU91dHB1dERvbWFpbikpOworICAgICAgICBpZiAobU91dHB1dEZvcm1hdC0+Y291bnRFbnRyaWVzKCkgIT0gb2xkRm9ybWF0LT5jb3VudEVudHJpZXMoKQorICAgICAgICAgICAgICAgIHx8IG1PdXRwdXRGb3JtYXQtPmNoYW5nZXNGcm9tKG9sZEZvcm1hdCktPmNvdW50RW50cmllcygpID4gMCkgeworICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtT3V0cHV0Rm9ybWF0ID0gb2xkRm9ybWF0OyAvLyBubyBjaGFuZ2UKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVl9JRihjaGFuZ2VkLCAiZm9ybWF0KHMpIGNoYW5nZWQiKTsKKyAgICByZXR1cm4gY2hhbmdlZDsKK30KKworc3A8QU1lc3NhZ2U+IENDb2RlY0NvbmZpZzo6Z2V0U2RrRm9ybWF0Rm9yRG9tYWluKAorICAgICAgICBjb25zdCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgJnJlZmxlY3RlZCwgRG9tYWluIHBvcnREb21haW4pIGNvbnN0IHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlOworICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvcjxDb25maWdNYXBwZXI+PiAmZWwgOiBtU3RhbmRhcmRQYXJhbXMtPmdldEtleXMoKSkgeworICAgICAgICBmb3IgKGNvbnN0IENvbmZpZ01hcHBlciAmY20gOiBlbC5zZWNvbmQpIHsKKyAgICAgICAgICAgIGlmICgoY20uZG9tYWluKCkgJiBwb3J0RG9tYWluKSA9PSAwIC8vIGlucHV0LW91dHB1dC1jb2RlZC1yYXcKKyAgICAgICAgICAgICAgICB8fCAoY20uZG9tYWluKCkgJiBtRG9tYWluKSAhPSBtRG9tYWluIC8vIGNvbXBvbmVudCBkb21haW4gKyBraW5kICh0aGVzZSBtdXN0IG1hdGNoKQorICAgICAgICAgICAgICAgIHx8IChjbS5kb21haW4oKSAmIElTX1JFQUQpID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gaXQgPSByZWZsZWN0ZWQuZmluZChjbS5wYXRoKCkpOworICAgICAgICAgICAgaWYgKGl0ID09IHJlZmxlY3RlZC5lbmQoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJWYWx1ZSBjMlZhbHVlOworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmVmFsdWU7CisgICAgICAgICAgICBBU3RyaW5nIHN0clZhbHVlOworICAgICAgICAgICAgQU1lc3NhZ2U6Okl0ZW1EYXRhIGl0ZW07CisgICAgICAgICAgICBpZiAoaXQtPnNlY29uZC5maW5kKCZjMlZhbHVlKSkgeworICAgICAgICAgICAgICAgIGl0ZW0gPSBjbS5tYXBUb01lc3NhZ2UoYzJWYWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGl0LT5zZWNvbmQuZmluZCgmYnVmVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgaXRlbS5zZXQoYnVmVmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIGlmIChpdC0+c2Vjb25kLmZpbmQoJnN0clZhbHVlKSkgeworICAgICAgICAgICAgICAgIGl0ZW0uc2V0KHN0clZhbHVlKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoInVuZXhwZWN0ZWQgdW50eXBlZCBxdWVyeSB2YWx1ZSBmb3Iga2V5OiAlcyIsIGNtLnBhdGgoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1zZy0+c2V0SXRlbShlbC5maXJzdC5jX3N0cigpLCBpdGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsgLy8gY29udmVydCBmcm9tIENvZGVjIDIuMCByZWN0IHRvIE1lZGlhRm9ybWF0IHJlY3QgYW5kIGFkZCBjcm9wIHJlY3QgaWYgbm90IHByZXNlbnQKKyAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY3JvcC1sZWZ0IiwgJmxlZnQpICYmIG1zZy0+ZmluZEludDMyKCJjcm9wLXdpZHRoIiwgJndpZHRoKQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKCJjcm9wLXRvcCIsICZ0b3ApICYmIG1zZy0+ZmluZEludDMyKCJjcm9wLWhlaWdodCIsICZoZWlnaHQpCisgICAgICAgICAgICAgICAgJiYgbGVmdCA+PSAwICYmIHdpZHRoID49MCAmJiB3aWR0aCA8PSBJTlQzMl9NQVggLSBsZWZ0CisgICAgICAgICAgICAgICAgJiYgdG9wID49IDAgJiYgaGVpZ2h0ID49MCAmJiBoZWlnaHQgPD0gSU5UMzJfTUFYIC0gdG9wKSB7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNyb3AtbGVmdCIpKTsKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY3JvcC10b3AiKSk7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNyb3Atd2lkdGgiKSk7CisgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImNyb3AtaGVpZ2h0IikpOworICAgICAgICAgICAgbXNnLT5zZXRSZWN0KCJjcm9wIiwgbGVmdCwgdG9wLCBsZWZ0ICsgd2lkdGggLSAxLCB0b3AgKyBoZWlnaHQgLSAxKTsKKyAgICAgICAgfSBlbHNlIGlmIChtc2ctPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpICYmIG1zZy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICAgICAgbXNnLT5zZXRSZWN0KCJjcm9wIiwgMCwgMCwgd2lkdGggLSAxLCBoZWlnaHQgLSAxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHsgLy8gY29udmVydCB0ZW1wb3JhbCBsYXllcmluZyB0byBzY2hlbWEKKyAgICAgICAgc3A8QUJ1ZmZlcj4gdG1wOworICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCAmdG1wKSAmJiB0bXAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nICpsYXllcmluZyA9CisgICAgICAgICAgICAgICAgQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpGcm9tKEMyUGFyYW06OkZyb20odG1wLT5kYXRhKCksIHRtcC0+c2l6ZSgpKSk7CisgICAgICAgICAgICBpZiAobGF5ZXJpbmcgJiYgbGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA+IDAKKyAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPm0uYkxheWVyQ291bnQgPCBsYXllcmluZy0+bS5sYXllckNvdW50KSB7CisgICAgICAgICAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBpcyB3ZWJydGMgY29tcGF0aWJsZQorICAgICAgICAgICAgICAgIEFTdHJpbmcgbWltZTsKKyAgICAgICAgICAgICAgICBpZiAobXNnLT5maW5kU3RyaW5nKEtFWV9NSU1FLCAmbWltZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1pbWUuZXF1YWxzSWdub3JlQ2FzZShNSU1FVFlQRV9WSURFT19WUDgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZy0+bS5iTGF5ZXJDb3VudCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAobGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IChsYXllcmluZy0+bS5sYXllckNvdW50ID09IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+ZmxleENvdW50KCkgPj0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMF0gPT0gLjZmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA9PSAzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPmZsZXhDb3VudCgpID49IDIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iaXRyYXRlUmF0aW9zWzBdID09IC40ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMV0gPT0gLjZmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCAobGF5ZXJpbmctPm0ubGF5ZXJDb3VudCA9PSA0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgbGF5ZXJpbmctPmZsZXhDb3VudCgpID49IDMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iaXRyYXRlUmF0aW9zWzBdID09IC4yNWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBsYXllcmluZy0+bS5iaXRyYXRlUmF0aW9zWzFdID09IC40ZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIGxheWVyaW5nLT5tLmJpdHJhdGVSYXRpb3NbMl0gPT0gLjZmKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBBU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZWJydGMudnA4LiV1LWxheWVyIiwgbGF5ZXJpbmctPm0ubGF5ZXJDb3VudCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5ZXJpbmctPm0uYkxheWVyQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBBU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmdlbmVyaWMuJXUrJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nLT5tLmxheWVyQ291bnQgLSBsYXllcmluZy0+bS5iTGF5ZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZy0+bS5iTGF5ZXJDb3VudCkpOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5ZXJpbmctPm0uYkxheWVyQ291bnQpIHsKKyAgICAgICAgICAgICAgICAgICAgbXNnLT5zZXRTdHJpbmcoS0VZX1RFTVBPUkFMX0xBWUVSSU5HLCBBU3RyaW5nUHJpbnRmKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmRyb2lkLmdlbmVyaWMuJXUiLCBsYXllcmluZy0+bS5sYXllckNvdW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKEMyX1BBUkFNS0VZX1RFTVBPUkFMX0xBWUVSSU5HKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB7IC8vIGNvbnZlcnQgY29sb3IgaW5mbworICAgICAgICBDMkNvbG9yOjpwcmltYXJpZXNfdCBwcmltYXJpZXM7CisgICAgICAgIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeDsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJjb2xvci1wcmltYXJpZXMiLCAoaW50MzJfdCopJnByaW1hcmllcykKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiY29sb3ItbWF0cml4IiwgKGludDMyX3QqKSZtYXRyaXgpKSB7CisgICAgICAgICAgICBpbnQzMl90IHN0YW5kYXJkOworCisgICAgICAgICAgICBpZiAoQzJNYXBwZXI6Om1hcChwcmltYXJpZXMsIG1hdHJpeCwgJnN0YW5kYXJkKSkgeworICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoS0VZX0NPTE9SX1NUQU5EQVJELCBzdGFuZGFyZCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgiY29sb3ItcHJpbWFyaWVzIikpOworICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjb2xvci1tYXRyaXgiKSk7CisgICAgICAgIH0KKworCisgICAgICAgIC8vIGNhbGN1bGF0ZSBkYXRhc3BhY2UgZm9yIHJhdyBncmFwaGljIGJ1ZmZlcnMgaWYgbm90IHNwZWNpZmllZCBieSBjb21wb25lbnQsIG9yIGlmCisgICAgICAgIC8vIHVzaW5nIHN1cmZhY2Ugd2l0aCB1bnNwZWNpZmllZCBhc3BlY3RzIChhcyB0aG9zZSBtdXN0IGJlIGRlZmF1bHRlZCB3aGljaCBtYXkgY2hhbmdlCisgICAgICAgIC8vIHRoZSBkYXRhc3BhY2UpCisgICAgICAgIGlmICgocG9ydERvbWFpbiAmIElTX1JBVykgJiYgKG1Eb21haW4gJiAoSVNfSU1BR0UgfCBJU19WSURFTykpKSB7CisgICAgICAgICAgICBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhc3BhY2U7CisgICAgICAgICAgICBDb2xvckFzcGVjdHMgYXNwZWN0cyA9IHsKKyAgICAgICAgICAgICAgICBDb2xvckFzcGVjdHM6OlJhbmdlVW5zcGVjaWZpZWQsIENvbG9yQXNwZWN0czo6UHJpbWFyaWVzVW5zcGVjaWZpZWQsCisgICAgICAgICAgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclVuc3BlY2lmaWVkLCBDb2xvckFzcGVjdHM6Ok1hdHJpeFVuc3BlY2lmaWVkCisgICAgICAgICAgICB9OworICAgICAgICAgICAgQ29sb3JVdGlsczo6Z2V0Q29sb3JBc3BlY3RzRnJvbUZvcm1hdChtc2csIGFzcGVjdHMpOworICAgICAgICAgICAgQ29sb3JBc3BlY3RzIG9yaWdBc3BlY3RzID0gYXNwZWN0czsKKyAgICAgICAgICAgIGlmIChtVXNpbmdTdXJmYWNlKSB7CisgICAgICAgICAgICAgICAgLy8gZ2V0IGltYWdlIHNpemUgKGRlZmF1bHQgdG8gSEQpCisgICAgICAgICAgICAgICAgaW50MzJfdCB3aWR0aCA9IDEyODA7CisgICAgICAgICAgICAgICAgaW50MzJfdCBoZWlnaHQgPSA3MjA7CisgICAgICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207CisgICAgICAgICAgICAgICAgaWYgKG1zZy0+ZmluZFJlY3QoImNyb3AiLCAmbGVmdCwgJnRvcCwgJnJpZ2h0LCAmYm90dG9tKSkgeworICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IHJpZ2h0IC0gbGVmdCArIDE7CisgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IGJvdHRvbSAtIHRvcCArIDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpbXNnLT5maW5kSW50MzIoS0VZX1dJRFRILCAmd2lkdGgpOworICAgICAgICAgICAgICAgICAgICAodm9pZCltc2ctPmZpbmRJbnQzMihLRVlfSEVJR0hULCAmaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6c2V0RGVmYXVsdENvZGVjQ29sb3JBc3BlY3RzSWZOZWVkZWQoYXNwZWN0cywgd2lkdGgsIGhlaWdodCk7CisgICAgICAgICAgICAgICAgQ29sb3JVdGlsczo6c2V0Q29sb3JBc3BlY3RzSW50b0Zvcm1hdChhc3BlY3RzLCBtc2cpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhbmRyb2lkLl9kYXRhc3BhY2UiLCAoaW50MzJfdCopJmRhdGFzcGFjZSkKKyAgICAgICAgICAgICAgICAgICAgfHwgYXNwZWN0cy5tUmFuZ2UgIT0gb3JpZ0FzcGVjdHMubVJhbmdlCisgICAgICAgICAgICAgICAgICAgIHx8IGFzcGVjdHMubVByaW1hcmllcyAhPSBvcmlnQXNwZWN0cy5tUHJpbWFyaWVzCisgICAgICAgICAgICAgICAgICAgIHx8IGFzcGVjdHMubVRyYW5zZmVyICE9IG9yaWdBc3BlY3RzLm1UcmFuc2ZlcgorICAgICAgICAgICAgICAgICAgICB8fCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMgIT0gb3JpZ0FzcGVjdHMubU1hdHJpeENvZWZmcykgeworICAgICAgICAgICAgICAgIGRhdGFzcGFjZSA9IENvbG9yVXRpbHM6OmdldERhdGFTcGFjZUZvckNvbG9yQXNwZWN0cyhhc3BlY3RzLCB0cnVlIC8qIG1heUV4cGFuZCAqLyk7CisgICAgICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiYW5kcm9pZC5fZGF0YXNwYWNlIiwgZGF0YXNwYWNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEhEUiBzdGF0aWMgaW5mbworCisgICAgICAgIEMySGRyU3RhdGljTWV0YWRhdGFTdHJ1Y3QgaGRyOworICAgICAgICBpZiAobXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5yZWQueCIsICZoZHIubWFzdGVyaW5nLnJlZC54KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYucmVkLnkiLCAmaGRyLm1hc3RlcmluZy5yZWQueSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LmdyZWVuLngiLCAmaGRyLm1hc3RlcmluZy5ncmVlbi54KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYuZ3JlZW4ueSIsICZoZHIubWFzdGVyaW5nLmdyZWVuLnkpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5ibHVlLngiLCAmaGRyLm1hc3RlcmluZy5ibHVlLngpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni5ibHVlLnkiLCAmaGRyLm1hc3RlcmluZy5ibHVlLnkpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoInNtcHRlMjA4Ni53aGl0ZS54IiwgJmhkci5tYXN0ZXJpbmcud2hpdGUueCkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2LndoaXRlLnkiLCAmaGRyLm1hc3RlcmluZy53aGl0ZS55KQorICAgICAgICAgICAgICAgICYmIG1zZy0+ZmluZEZsb2F0KCJzbXB0ZTIwODYubWF4LWx1bWluYW5jZSIsICZoZHIubWFzdGVyaW5nLm1heEx1bWluYW5jZSkKKyAgICAgICAgICAgICAgICAmJiBtc2ctPmZpbmRGbG9hdCgic21wdGUyMDg2Lm1pbi1sdW1pbmFuY2UiLCAmaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoImN0YTg2MS5tYXgtY2xsIiwgJmhkci5tYXhDbGwpCisgICAgICAgICAgICAgICAgJiYgbXNnLT5maW5kRmxvYXQoImN0YTg2MS5tYXgtZmFsbCIsICZoZHIubWF4RmFsbCkpIHsKKyAgICAgICAgICAgIGlmIChoZHIubWFzdGVyaW5nLnJlZC54ID49IDAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5yZWQueCA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcucmVkLnkgPj0gMCAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcucmVkLnkgPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmdyZWVuLnggPj0gMCAgICAgICAmJiBoZHIubWFzdGVyaW5nLmdyZWVuLnggPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmdyZWVuLnkgPj0gMCAgICAgICAmJiBoZHIubWFzdGVyaW5nLmdyZWVuLnkgPD0gMQorICAgICAgICAgICAgICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmJsdWUueCA+PSAwICAgICAgICAmJiBoZHIubWFzdGVyaW5nLmJsdWUueCA8PSAxCisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuYmx1ZS55ID49IDAgICAgICAgICYmIGhkci5tYXN0ZXJpbmcuYmx1ZS55IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy53aGl0ZS54ID49IDAgICAgICAgJiYgaGRyLm1hc3RlcmluZy53aGl0ZS54IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy53aGl0ZS55ID49IDAgICAgICAgJiYgaGRyLm1hc3RlcmluZy53aGl0ZS55IDw9IDEKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5tYXhMdW1pbmFuY2UgPj0gMCAgJiYgaGRyLm1hc3RlcmluZy5tYXhMdW1pbmFuY2UgPD0gNjU1MzUKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UgPj0gMCAgJiYgaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UgPD0gNi41NTM1CisgICAgICAgICAgICAgICAgICAgICYmIGhkci5tYXhDbGwgPj0gMCAgICAgICAgICAgICAgICAgICYmIGhkci5tYXhDbGwgPD0gNjU1MzUKKyAgICAgICAgICAgICAgICAgICAgJiYgaGRyLm1heEZhbGwgPj0gMCAgICAgICAgICAgICAgICAgJiYgaGRyLm1heEZhbGwgPD0gNjU1MzUpIHsKKyAgICAgICAgICAgICAgICBIRFJTdGF0aWNJbmZvIG1ldGE7CisgICAgICAgICAgICAgICAgbWV0YS5tSUQgPSBtZXRhLmtUeXBlMTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tUi54ID0gaGRyLm1hc3RlcmluZy5yZWQueCAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubVIueSA9IGhkci5tYXN0ZXJpbmcucmVkLnkgLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1HLnggPSBoZHIubWFzdGVyaW5nLmdyZWVuLnggLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1HLnkgPSBoZHIubWFzdGVyaW5nLmdyZWVuLnkgLyAwLjAwMDAyICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1CLnggPSBoZHIubWFzdGVyaW5nLmJsdWUueCAvIDAuMDAwMDIgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubUIueSA9IGhkci5tYXN0ZXJpbmcuYmx1ZS55IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tVy54ID0gaGRyLm1hc3RlcmluZy53aGl0ZS54IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tVy55ID0gaGRyLm1hc3RlcmluZy53aGl0ZS55IC8gMC4wMDAwMiArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tTWF4RGlzcGxheUx1bWluYW5jZSA9IGhkci5tYXN0ZXJpbmcubWF4THVtaW5hbmNlICsgMC41OworICAgICAgICAgICAgICAgIG1ldGEuc1R5cGUxLm1NaW5EaXNwbGF5THVtaW5hbmNlID0gaGRyLm1hc3RlcmluZy5taW5MdW1pbmFuY2UgLyAwLjAwMDEgKyAwLjU7CisgICAgICAgICAgICAgICAgbWV0YS5zVHlwZTEubU1heENvbnRlbnRMaWdodExldmVsID0gaGRyLm1heENsbCArIDAuNTsKKyAgICAgICAgICAgICAgICBtZXRhLnNUeXBlMS5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IGhkci5tYXhGYWxsICsgMC41OworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LnJlZC54IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LnJlZC55IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LmdyZWVuLngiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYuZ3JlZW4ueSIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5ibHVlLngiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYuYmx1ZS55IikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2LndoaXRlLngiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJzbXB0ZTIwODYud2hpdGUueSIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoInNtcHRlMjA4Ni5tYXgtbHVtaW5hbmNlIikpOworICAgICAgICAgICAgICAgIG1zZy0+cmVtb3ZlRW50cnlBdChtc2ctPmZpbmRFbnRyeUJ5TmFtZSgic21wdGUyMDg2Lm1pbi1sdW1pbmFuY2UiKSk7CisgICAgICAgICAgICAgICAgbXNnLT5yZW1vdmVFbnRyeUF0KG1zZy0+ZmluZEVudHJ5QnlOYW1lKCJjdGE4NjEubWF4LWNsbCIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnJlbW92ZUVudHJ5QXQobXNnLT5maW5kRW50cnlCeU5hbWUoImN0YTg2MS5tYXgtZmFsbCIpKTsKKyAgICAgICAgICAgICAgICBtc2ctPnNldEJ1ZmZlcihLRVlfSERSX1NUQVRJQ19JTkZPLCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoJm1ldGEsIHNpemVvZihtZXRhKSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZm91bmQgaW52YWxpZCBIRFIgc3RhdGljIG1ldGFkYXRhICVzIiwgbXNnLT5kZWJ1Z1N0cmluZyg4KS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJjb252ZXJ0ZWQgdG8gU0RLIHZhbHVlcyBhcyAlcyIsIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKKyAgICByZXR1cm4gbXNnOworfQorCisvLy8gY29udmVydHMgYW4gQU1lc3NhZ2UgdmFsdWUgdG8gYSBQYXJhbVVwZGF0ZXIgdmFsdWUKK3N0YXRpYyB2b2lkIGNvbnZlcnQoY29uc3QgQU1lc3NhZ2U6Okl0ZW1EYXRhICZmcm9tLCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OlZhbHVlICp0bykgeworICAgIGludDMyX3QgaW50MzJWYWx1ZTsKKyAgICBpbnQ2NF90IGludDY0VmFsdWU7CisgICAgc3A8QUJ1ZmZlcj4gYnVmVmFsdWU7CisgICAgQVN0cmluZyBzdHJWYWx1ZTsKKyAgICBmbG9hdCBmbG9hdFZhbHVlOworICAgIGRvdWJsZSBkb3VibGVWYWx1ZTsKKworICAgIGlmIChmcm9tLmZpbmQoJmludDMyVmFsdWUpKSB7CisgICAgICAgIHRvLT5zZXQoaW50MzJWYWx1ZSk7CisgICAgfSBlbHNlIGlmIChmcm9tLmZpbmQoJmludDY0VmFsdWUpKSB7CisgICAgICAgIHRvLT5zZXQoaW50NjRWYWx1ZSk7CisgICAgfSBlbHNlIGlmIChmcm9tLmZpbmQoJmJ1ZlZhbHVlKSkgeworICAgICAgICB0by0+c2V0KGJ1ZlZhbHVlKTsKKyAgICB9IGVsc2UgaWYgKGZyb20uZmluZCgmc3RyVmFsdWUpKSB7CisgICAgICAgIHRvLT5zZXQoc3RyVmFsdWUpOworICAgIH0gZWxzZSBpZiAoZnJvbS5maW5kKCZmbG9hdFZhbHVlKSkgeworICAgICAgICB0by0+c2V0KEMyVmFsdWUoZmxvYXRWYWx1ZSkpOworICAgIH0gZWxzZSBpZiAoZnJvbS5maW5kKCZkb3VibGVWYWx1ZSkpIHsKKyAgICAgICAgLy8gY29udmVydCBkb3VibGUgdG8gZmxvYXQKKyAgICAgICAgdG8tPnNldChDMlZhbHVlKChmbG9hdClkb3VibGVWYWx1ZSkpOworICAgIH0KKyAgICAvLyBpZ25vcmUgYWxsIG90aGVyIEFNZXNzYWdlIHR5cGVzCit9CisKKy8vLyByZWxheGVzIENvZGVjIDIuMCBzcGVjaWZpYyB2YWx1ZSB0eXBlcyB0byBTREsgdHlwZXMgKG1haW5seSByZW1vdmVzIHNpZ25lZG5lc3MgYW5kIGNvdW50ZXJuZXNzCisvLy8gZnJvbSAzMi82NC1iaXQgdmFsdWVzLikKK3N0YXRpYyB2b2lkIHJlbGF4VmFsdWVzKFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6VmFsdWUgJml0ZW0pIHsKKyAgICBDMlZhbHVlIGMyVmFsdWU7CisgICAgaW50MzJfdCBpbnQzMlZhbHVlOworICAgIGludDY0X3QgaW50NjRWYWx1ZTsKKyAgICAodm9pZClpdGVtLmZpbmQoJmMyVmFsdWUpOworICAgIGlmIChjMlZhbHVlLmdldCgmaW50MzJWYWx1ZSkgfHwgYzJWYWx1ZS5nZXQoKHVpbnQzMl90KikmaW50MzJWYWx1ZSkKKyAgICAgICAgICAgIHx8IGMyVmFsdWUuZ2V0KChjMl9jbnRyMzJfdCopJmludDMyVmFsdWUpKSB7CisgICAgICAgIGl0ZW0uc2V0KGludDMyVmFsdWUpOworICAgIH0gZWxzZSBpZiAoYzJWYWx1ZS5nZXQoJmludDY0VmFsdWUpCisgICAgICAgICAgICB8fCBjMlZhbHVlLmdldCgodWludDY0X3QqKSZpbnQ2NFZhbHVlKQorICAgICAgICAgICAgfHwgYzJWYWx1ZS5nZXQoKGMyX2NudHI2NF90KikmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgaXRlbS5zZXQoaW50NjRWYWx1ZSk7CisgICAgfQorfQorCitSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OkRpY3QgQ0NvZGVjQ29uZmlnOjpnZXRSZWZsZWN0ZWRGb3JtYXQoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zXywgRG9tYWluIGNvbmZpZ0RvbWFpbikgY29uc3QgeworICAgIC8vIGNyZWF0ZSBhIG1vZGlmaWFibGUgY29weSBvZiBwYXJhbXMKKyAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gcGFyYW1zXy0+ZHVwKCk7CisgICAgQUxPR1YoImZpbHRlcmluZyB3aXRoIGNvbmZpZyBkb21haW4gJXgiLCBjb25maWdEb21haW4pOworCisgICAgLy8gY29udmVydCBzb21lIG1hY3JvIHBhcmFtZXRlcnMgdG8gQ29kZWMgMi4wIHNwZWNpZmljIGV4cHJlc3Npb25zCisKKyAgICB7IC8vIG1ha2UgaS1mcmFtZS1pbnRlcnZhbCBmcmFtZSBiYXNlZAorICAgICAgICBmbG9hdCBpRnJhbWVJbnRlcnZhbDsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEFzRmxvYXQoS0VZX0lfRlJBTUVfSU5URVJWQUwsICZpRnJhbWVJbnRlcnZhbCkpIHsKKyAgICAgICAgICAgIGZsb2F0IGZyYW1lUmF0ZTsKKyAgICAgICAgICAgIGlmIChwYXJhbXMtPmZpbmRBc0Zsb2F0KEtFWV9GUkFNRV9SQVRFLCAmZnJhbWVSYXRlKSkgeworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImktZnJhbWUtcGVyaW9kIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZVJhdGUgPD0gMCB8fCBpRnJhbWVJbnRlcnZhbCA8IDApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IC0xIC8qIG5vIHN5bmMgZnJhbWVzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IChpbnQzMl90KWMyX21pbihpRnJhbWVJbnRlcnZhbCAqIGZyYW1lUmF0ZSArIDAuNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdClJTlQzMl9NQVgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtRG9tYWluID09IChJU19WSURFTyB8IElTX0VOQ09ERVIpKSB7CisgICAgICAgIC8vIGNvbnZlcnQgY2FwdHVyZS1yYXRlIGludG8gaW5wdXQtdGltZS1zdHJldGNoCisgICAgICAgIGZsb2F0IGZyYW1lUmF0ZSwgY2FwdHVyZVJhdGU7CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRBc0Zsb2F0KEtFWV9GUkFNRV9SQVRFLCAmZnJhbWVSYXRlKSkgeworICAgICAgICAgICAgaWYgKCFwYXJhbXMtPmZpbmRBc0Zsb2F0KCJ0aW1lLWxhcHNlLWZwcyIsICZjYXB0dXJlUmF0ZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgIXBhcmFtcy0+ZmluZEFzRmxvYXQoS0VZX0NBUFRVUkVfUkFURSwgJmNhcHR1cmVSYXRlKSkgeworICAgICAgICAgICAgICAgIGNhcHR1cmVSYXRlID0gZnJhbWVSYXRlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGNhcHR1cmVSYXRlID4gMCAmJiBmcmFtZVJhdGUgPiAwKSB7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdChDMl9QQVJBTUtFWV9JTlBVVF9USU1FX1NUUkVUQ0gsIGNhcHR1cmVSYXRlIC8gZnJhbWVSYXRlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHsgICAvLyByZWZsZWN0IHRlbXBvcmFsIGxheWVyaW5nIGludG8gYSBiaW5hcnkgYmxvYgorICAgICAgICBBU3RyaW5nIHNjaGVtYTsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZFN0cmluZyhLRVlfVEVNUE9SQUxfTEFZRVJJTkcsICZzY2hlbWEpKSB7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTGF5ZXJzID0gMDsKKyAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1CTGF5ZXJzID0gMDsKKyAgICAgICAgICAgIGludCB0YWdzOworICAgICAgICAgICAgY2hhciBkdW1teTsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dD4gbGF5ZXJpbmc7CisgICAgICAgICAgICBpZiAoc3NjYW5mKHNjaGVtYS5jX3N0cigpLCAid2VicnRjLnZwOC4ldS1sYXllciVjIiwgJm51bUxheWVycywgJmR1bW15KSA9PSAxCisgICAgICAgICAgICAgICAgJiYgbnVtTGF5ZXJzID4gMCkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtTGF5ZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nID0gQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7fSwgMHUsIDF1LCAwdSk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJpbmcgPSBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgLjZmIH0sIDB1LCAydSwgMHUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGxheWVyaW5nID0gQzJTdHJlYW1UZW1wb3JhbExheWVyaW5nVHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IC40ZiwgLjZmIH0sIDB1LCAzdSwgMHUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBsYXllcmluZyA9IEMyU3RyZWFtVGVtcG9yYWxMYXllcmluZ1R1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAuMjVmLCAuNGYsIC42ZiB9LCAwdSwgNHUsIDB1KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKHRhZ3MgPSBzc2NhbmYoc2NoZW1hLmNfc3RyKCksICJhbmRyb2lkLmdlbmVyaWMuJXUlYyV1JWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgJm51bUxheWVycywgJmR1bW15LCAmbnVtQkxheWVycywgJmR1bW15KSkKKyAgICAgICAgICAgICAgICAmJiAodGFncyA9PSAxIHx8ICh0YWdzID09IDMgJiYgZHVtbXkgPT0gJysnKSkKKyAgICAgICAgICAgICAgICAmJiBudW1MYXllcnMgPiAwICYmIG51bUxheWVycyA8IFVJTlQzMl9NQVggLSBudW1CTGF5ZXJzKSB7CisgICAgICAgICAgICAgICAgbGF5ZXJpbmcgPSBDMlN0cmVhbVRlbXBvcmFsTGF5ZXJpbmdUdW5pbmc6Om91dHB1dDo6QWxsb2NVbmlxdWUoCisgICAgICAgICAgICAgICAgICAgICAgICB7fSwgMHUsIG51bUxheWVycyArIG51bUJMYXllcnMsIG51bUJMYXllcnMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiSWdub3JpbmcgdW5zdXBwb3J0ZWQgdHMtc2NoZW1hIFslc10iLCBzY2hlbWEuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobGF5ZXJpbmcpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEJ1ZmZlcihDMl9QQVJBTUtFWV9URU1QT1JBTF9MQVlFUklORywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQnVmZmVyOjpDcmVhdGVBc0NvcHkobGF5ZXJpbmcuZ2V0KCksIGxheWVyaW5nLT5zaXplKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHsgLy8gY29udmVydCBmcm9tIE1lZGlhRm9ybWF0IHJlY3QgdG8gQ29kZWMgMi4wIHJlY3QKKyAgICAgICAgaW50MzJfdCBvZmZzZXQ7CisgICAgICAgIGludDMyX3QgZW5kOworICAgICAgICBBTWVzc2FnZTo6SXRlbURhdGEgaXRlbTsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJjcm9wLWxlZnQiLCAmb2Zmc2V0KSAmJiBwYXJhbXMtPmZpbmRJbnQzMigiY3JvcC1yaWdodCIsICZlbmQpCisgICAgICAgICAgICAgICAgJiYgb2Zmc2V0ID49IDAgJiYgZW5kID49IG9mZnNldCAtIDEpIHsKKyAgICAgICAgICAgIHNpemVfdCBpeCA9IHBhcmFtcy0+ZmluZEVudHJ5QnlOYW1lKCJjcm9wLXJpZ2h0Iik7CisgICAgICAgICAgICBwYXJhbXMtPnNldEVudHJ5TmFtZUF0KGl4LCAiY3JvcC13aWR0aCIpOworICAgICAgICAgICAgaXRlbS5zZXQoZW5kIC0gb2Zmc2V0ICsgMSk7CisgICAgICAgICAgICBwYXJhbXMtPnNldEVudHJ5QXQoaXgsIGl0ZW0pOworICAgICAgICB9CisgICAgICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiY3JvcC10b3AiLCAmb2Zmc2V0KSAmJiBwYXJhbXMtPmZpbmRJbnQzMigiY3JvcC1ib3R0b20iLCAmZW5kKQorICAgICAgICAgICAgICAgICYmIG9mZnNldCA+PSAwICYmIGVuZCA+PSBvZmZzZXQgLSAxKSB7CisgICAgICAgICAgICBzaXplX3QgaXggPSBwYXJhbXMtPmZpbmRFbnRyeUJ5TmFtZSgiY3JvcC1ib3R0b20iKTsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0RW50cnlOYW1lQXQoaXgsICJjcm9wLWhlaWdodCIpOworICAgICAgICAgICAgaXRlbS5zZXQoZW5kIC0gb2Zmc2V0ICsgMSk7CisgICAgICAgICAgICBwYXJhbXMtPnNldEVudHJ5QXQoaXgsIGl0ZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgeyAvLyBjb252ZXJ0IGNvbG9yIGluZm8KKyAgICAgICAgaW50MzJfdCBzdGFuZGFyZDsKKyAgICAgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKEtFWV9DT0xPUl9TVEFOREFSRCwgJnN0YW5kYXJkKSkgeworICAgICAgICAgICAgQzJDb2xvcjo6cHJpbWFyaWVzX3QgcHJpbWFyaWVzOworICAgICAgICAgICAgQzJDb2xvcjo6bWF0cml4X3QgbWF0cml4OworCisgICAgICAgICAgICBpZiAoQzJNYXBwZXI6Om1hcChzdGFuZGFyZCwgJnByaW1hcmllcywgJm1hdHJpeCkpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEludDMyKCJjb2xvci1wcmltYXJpZXMiLCBwcmltYXJpZXMpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoImNvbG9yLW1hdHJpeCIsIG1hdHJpeCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBzcDxBQnVmZmVyPiBoZHJNZXRhOworICAgICAgICBpZiAocGFyYW1zLT5maW5kQnVmZmVyKEtFWV9IRFJfU1RBVElDX0lORk8sICZoZHJNZXRhKQorICAgICAgICAgICAgICAgICYmIGhkck1ldGEtPnNpemUoKSA9PSBzaXplb2YoSERSU3RhdGljSW5mbykpIHsKKyAgICAgICAgICAgIEhEUlN0YXRpY0luZm8gKm1ldGEgPSAoSERSU3RhdGljSW5mbyopaGRyTWV0YS0+ZGF0YSgpOworICAgICAgICAgICAgaWYgKG1ldGEtPm1JRCA9PSBtZXRhLT5rVHlwZTEpIHsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYucmVkLngiLCBtZXRhLT5zVHlwZTEubVIueCAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5yZWQueSIsIG1ldGEtPnNUeXBlMS5tUi55ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LmdyZWVuLngiLCBtZXRhLT5zVHlwZTEubUcueCAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5ncmVlbi55IiwgbWV0YS0+c1R5cGUxLm1HLnkgKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYuYmx1ZS54IiwgbWV0YS0+c1R5cGUxLm1CLnggKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYuYmx1ZS55IiwgbWV0YS0+c1R5cGUxLm1CLnkgKiAwLjAwMDAyKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYud2hpdGUueCIsIG1ldGEtPnNUeXBlMS5tVy54ICogMC4wMDAwMik7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgic21wdGUyMDg2LndoaXRlLnkiLCBtZXRhLT5zVHlwZTEubVcueSAqIDAuMDAwMDIpOworICAgICAgICAgICAgICAgIHBhcmFtcy0+c2V0RmxvYXQoInNtcHRlMjA4Ni5tYXgtbHVtaW5hbmNlIiwgbWV0YS0+c1R5cGUxLm1NYXhEaXNwbGF5THVtaW5hbmNlKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJzbXB0ZTIwODYubWluLWx1bWluYW5jZSIsIG1ldGEtPnNUeXBlMS5tTWluRGlzcGxheUx1bWluYW5jZSAqIDAuMDAwMSk7CisgICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRGbG9hdCgiY3RhODYxLm1heC1jbGwiLCBtZXRhLT5zVHlwZTEubU1heENvbnRlbnRMaWdodExldmVsKTsKKyAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJjdGE4NjEubWF4LWZhbGwiLCBtZXRhLT5zVHlwZTEubU1heEZyYW1lQXZlcmFnZUxpZ2h0TGV2ZWwpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gdGhpcyBpcyB0byB2ZXJpZnkgdGhhdCB3ZSBzZXQgcHJvcGVyIHNpZ25lZG5lc3MgZm9yIHN0YW5kYXJkIHBhcmFtZXRlcnMKKyAgICBib29sIGJlVmVyeVN0cmljdCA9IHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5zdGFnZWZyaWdodC5jY29kZWNfc3RyaWN0X3R5cGUiLCBmYWxzZSk7CisgICAgLy8gdGhpcyBpcyB0byBhbGxvdyB2ZW5kb3JzIHRvIHVzZSB0aGUgd3Jvbmcgc2lnbmVkbmVzcyBmb3Igc3RhbmRhcmQgcGFyYW1ldGVycworICAgIGJvb2wgYmVWZXJ5TGF4ID0gcHJvcGVydHlfZ2V0X2Jvb2woImRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlY19sYXhfdHlwZSIsIGZhbHNlKTsKKworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBmaWx0ZXJlZDsKKyAgICBmb3IgKHNpemVfdCBpeCA9IDA7IGl4IDwgcGFyYW1zLT5jb3VudEVudHJpZXMoKTsgKytpeCkgeworICAgICAgICBBTWVzc2FnZTo6VHlwZSB0eXBlOworICAgICAgICBBU3RyaW5nIG5hbWUgPSBwYXJhbXMtPmdldEVudHJ5TmFtZUF0KGl4LCAmdHlwZSk7CisgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBtc2dJdGVtID0gcGFyYW1zLT5nZXRFbnRyeUF0KGl4KTsKKyAgICAgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpWYWx1ZSBpdGVtOworICAgICAgICBjb252ZXJ0KG1zZ0l0ZW0sICZpdGVtKTsgLy8gY29udmVydCBpdGVtIHRvIHBhcmFtIHVwZGF0ZXIgaXRlbQorCisgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoInZlbmRvci4iKSkgeworICAgICAgICAgICAgLy8gdmVuZG9yIHBhcmFtcyBwYXNzIHRocm91Z2ggYXMgaXMKKyAgICAgICAgICAgIGZpbHRlcmVkLmVtcGxhY2UobmFtZS5jX3N0cigpLCBpdGVtKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIHN0YW5kYXJkIHBhcmFtZXRlcnMgbWF5IGdldCBtb2RpZmllZCwgZmlsdGVyZWQgb3IgZHVwbGljYXRlZAorICAgICAgICBmb3IgKGNvbnN0IENvbmZpZ01hcHBlciAmY20gOiBtU3RhbmRhcmRQYXJhbXMtPmdldENvbmZpZ01hcHBlcnNGb3JTZGtLZXkobmFtZS5jX3N0cigpKSkgeworICAgICAgICAgICAgLy8gbm90ZTogd2UgaWdub3JlIHBvcnQgZG9tYWluIGZvciBjb25maWd1cmF0aW9uCisgICAgICAgICAgICBpZiAoKGNtLmRvbWFpbigpICYgY29uZmlnRG9tYWluKQorICAgICAgICAgICAgICAgICAgICAvLyBjb21wb25lbnQgZG9tYWluICsga2luZCAodGhlc2UgbXVzdCBtYXRjaCkKKyAgICAgICAgICAgICAgICAgICAgJiYgKGNtLmRvbWFpbigpICYgbURvbWFpbikgPT0gbURvbWFpbikgeworICAgICAgICAgICAgICAgIC8vIG1hcCBhcml0aG1ldGljIHZhbHVlcywgcGFzcyB0aHJvdWdoIHN0cmluZyBvciBidWZmZXIKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVCdWZmZXI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlU3RyaW5nOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50MzI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50NjQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRmxvYXQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlRG91YmxlOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG5vdyBvbmx5IG1hcCBzZXR0aW5ncyB3aXRoIG1hcHBlcnMgYXMgd2UgYXJlIG5vdCBjcmVhdGluZworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2lnbmVkIDw9PiB1bnNpZ25lZCBtYXBwZXJzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBiZSBwcmVjaXNlIGFib3V0IHNpZ25lZCB1bnNpZ25lZAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJlVmVyeVN0cmljdCB8fCBjbS5tYXBwZXIoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uc2V0KGNtLm1hcEZyb21NZXNzYWdlKHBhcmFtcy0+Z2V0RW50cnlBdChpeCkpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHNvIGFsbG93IHRvIHJlbGF4IHR5cGUgc3RyaWN0bmVzcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChiZVZlcnlMYXgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVsYXhWYWx1ZXMoaXRlbSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmlsdGVyZWQuZW1wbGFjZShjbS5wYXRoKCksIGl0ZW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJmaWx0ZXJlZCAlcyB0byAlcyIsIHBhcmFtcy0+ZGVidWdTdHJpbmcoNCkuY19zdHIoKSwKKyAgICAgICAgICAgIGZpbHRlcmVkLmRlYnVnU3RyaW5nKDQpLmNfc3RyKCkpOworICAgIHJldHVybiBmaWx0ZXJlZDsKK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpnZXRDb25maWdVcGRhdGVGcm9tU2RrUGFyYW1zKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZzZGtQYXJhbXMsIERvbWFpbiBjb25maWdEb21haW4sCisgICAgICAgIGMyX2Jsb2NraW5nX3QgYmxvY2tpbmcsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKmNvbmZpZ1VwZGF0ZSkgY29uc3QgeworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBwYXJhbXMgPSBnZXRSZWZsZWN0ZWRGb3JtYXQoc2RrUGFyYW1zLCBjb25maWdEb21haW4pOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgbVBhcmFtVXBkYXRlci0+Z2V0UGFyYW1JbmRpY2VzRnJvbU1lc3NhZ2UocGFyYW1zLCAmaW5kaWNlcyk7CisgICAgaWYgKGluZGljZXMuZW1wdHkoKSkgeworICAgICAgICBBTE9HRCgibm8gcmVjb2duaXplZCBwYXJhbXMgaW46ICVzIiwgcGFyYW1zLmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBjb25maWdVcGRhdGUtPmNsZWFyKCk7CisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IHN1cHBvcnRlZEluZGljZXM7CisgICAgZm9yIChDMlBhcmFtOjpJbmRleCBpeCA6IGluZGljZXMpIHsKKyAgICAgICAgaWYgKG1TdXBwb3J0ZWRJbmRpY2VzLmNvdW50KGl4KSkgeworICAgICAgICAgICAgc3VwcG9ydGVkSW5kaWNlcy5wdXNoX2JhY2soaXgpOworICAgICAgICB9IGVsc2UgaWYgKG1Mb2NhbFBhcmFtcy5jb3VudChpeCkpIHsKKyAgICAgICAgICAgIC8vIHF1ZXJ5IGxvY2FsIHBhcmFtZXRlciBoZXJlCisgICAgICAgICAgICBhdXRvIGl0ID0gbUN1cnJlbnRDb25maWcuZmluZChpeCk7CisgICAgICAgICAgICBpZiAoaXQgIT0gbUN1cnJlbnRDb25maWcuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBjb25maWdVcGRhdGUtPmVtcGxhY2VfYmFjayhDMlBhcmFtOjpDb3B5KCppdC0+c2Vjb25kKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBjb21wb25lbnQtPnF1ZXJ5KHsgfSwgc3VwcG9ydGVkSW5kaWNlcywgYmxvY2tpbmcsIGNvbmZpZ1VwZGF0ZSk7CisgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgicXVlcnkgZmFpbGVkIGFmdGVyIHJldHVybmluZyAlenUgcGFyYW1zID0+ICVzIiwgY29uZmlnVXBkYXRlLT5zaXplKCksIGFzU3RyaW5nKGVycikpOworICAgIH0KKworICAgIGlmIChjb25maWdVcGRhdGUtPnNpemUoKSkgeworICAgICAgICBtUGFyYW1VcGRhdGVyLT51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShwYXJhbXMsIGNvbmZpZ1VwZGF0ZSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgQ0NvZGVjQ29uZmlnOjpzZXRQYXJhbWV0ZXJzKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmY29uZmlnVXBkYXRlLAorICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nKSB7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gT0s7CisgICAgaWYgKGNvbmZpZ1VwZGF0ZS5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+IHBhcmFtVmVjdG9yOworICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwYXJhbSA6IGNvbmZpZ1VwZGF0ZSkgeworICAgICAgICBpZiAobVN1cHBvcnRlZEluZGljZXMuY291bnQocGFyYW0tPmluZGV4KCkpKSB7CisgICAgICAgICAgICAvLyBjb21wb25lbnQgcGFyYW1ldGVyCisgICAgICAgICAgICBwYXJhbVZlY3Rvci5wdXNoX2JhY2socGFyYW0uZ2V0KCkpOworICAgICAgICAgICAgaW5kaWNlcy5wdXNoX2JhY2socGFyYW0tPmluZGV4KCkpOworICAgICAgICB9IGVsc2UgaWYgKG1Mb2NhbFBhcmFtcy5jb3VudChwYXJhbS0+aW5kZXgoKSkpIHsKKyAgICAgICAgICAgIC8vIGhhbmRsZSBsb2NhbCBwYXJhbWV0ZXIgaGVyZQorICAgICAgICAgICAgTG9jYWxQYXJhbVZhbGlkYXRvciB2YWxpZGF0b3IgPSBtTG9jYWxQYXJhbXMuZmluZChwYXJhbS0+aW5kZXgoKSktPnNlY29uZDsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+IGNvcHkgPSBDMlBhcmFtOjpDb3B5KCpwYXJhbSk7CisgICAgICAgICAgICBpZiAodmFsaWRhdG9yKSB7CisgICAgICAgICAgICAgICAgZXJyID0gdmFsaWRhdG9yKGNvcHkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dWKCJ1cGRhdGVkIGxvY2FsIHBhcmFtZXRlciB2YWx1ZSBmb3IgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbVBhcmFtVXBkYXRlci0+Z2V0UGFyYW1OYW1lKHBhcmFtLT5pbmRleCgpKS5jX3N0cigpKTsKKworICAgICAgICAgICAgICAgIG1DdXJyZW50Q29uZmlnW3BhcmFtLT5pbmRleCgpXSA9IHN0ZDo6bW92ZShjb3B5KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImZhaWxlZCB0byBzZXQgcGFyYW1ldGVyIHZhbHVlIGZvciAlcyA9PiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW1VcGRhdGVyLT5nZXRQYXJhbU5hbWUocGFyYW0tPmluZGV4KCkpLmNfc3RyKCksIGFzU3RyaW5nKGVycikpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyB1cGRhdGUgc3Vic2NyaWJlZCBwYXJhbSBpbmRpY2VzCisgICAgc3Vic2NyaWJlVG9Db25maWdVcGRhdGUoY29tcG9uZW50LCBpbmRpY2VzLCBibG9ja2luZyk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gY29tcG9uZW50LT5jb25maWcocGFyYW1WZWN0b3IsIGJsb2NraW5nLCAmZmFpbHVyZXMpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoImNvbmZpZyBmYWlsZWQgPT4gJXMiLCBhc1N0cmluZyhlcnIpKTsKKyAgICAgICAgLy8gVGhpcyBpcyBub24tZmF0YWwuCisgICAgfQorICAgIGZvciAoY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4gJmZhaWx1cmUgOiBmYWlsdXJlcykgeworICAgICAgICBzd2l0Y2ggKGZhaWx1cmUtPmZhaWx1cmUpIHsKKyAgICAgICAgICAgIGNhc2UgQzJTZXR0aW5nUmVzdWx0OjpCQURfVkFMVUU6CisgICAgICAgICAgICAgICAgQUxPR0QoIkJhZCBwYXJhbWV0ZXIgdmFsdWUiKTsKKyAgICAgICAgICAgICAgICByZXN1bHQgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dWKCJmYWlsdXJlID0gJWQiLCBpbnQoZmFpbHVyZS0+ZmFpbHVyZSkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gUmUtcXVlcnkgcGFyYW1ldGVyIHZhbHVlcyBpbiBjYXNlIGNvbmZpZyBjb3VsZCBub3QgdXBkYXRlIHRoZW0gYW5kIHVwZGF0ZSB0aGUgY3VycmVudAorICAgIC8vIGNvbmZpZ3VyYXRpb24uCisgICAgY29uZmlnVXBkYXRlLmNsZWFyKCk7CisgICAgZXJyID0gY29tcG9uZW50LT5xdWVyeSh7fSwgaW5kaWNlcywgYmxvY2tpbmcsICZjb25maWdVcGRhdGUpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoInF1ZXJ5IGZhaWxlZCBhZnRlciByZXR1cm5pbmcgJXp1IHBhcmFtcyA9PiAlcyIsIGNvbmZpZ1VwZGF0ZS5zaXplKCksIGFzU3RyaW5nKGVycikpOworICAgIH0KKyAgICAodm9pZCl1cGRhdGVDb25maWd1cmF0aW9uKGNvbmZpZ1VwZGF0ZSwgQUxMKTsKKworICAgIC8vIFRPRE86IGVycm9yIHZhbHVlCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworY29uc3QgQzJQYXJhbSAqQ0NvZGVjQ29uZmlnOjpnZXRDb25maWdQYXJhbWV0ZXJWYWx1ZShDMlBhcmFtOjpJbmRleCBpbmRleCkgY29uc3QgeworICAgIGF1dG8gaXQgPSBtQ3VycmVudENvbmZpZy5maW5kKGluZGV4KTsKKyAgICBpZiAoaXQgPT0gbUN1cnJlbnRDb25maWcuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQuZ2V0KCk7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NDb2RlY0NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MWM4YjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ0NvZGVjQ29uZmlnLmgKQEAgLTAsMCArMSwzNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENfQ09ERUNfQ09ORklHX0hfCisjZGVmaW5lIENfQ09ERUNfQ09ORklHX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSAiSW5wdXRTdXJmYWNlV3JhcHBlci5oIgorI2luY2x1ZGUgIlJlZmxlY3RlZFBhcmFtVXBkYXRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBBTWVzc2FnZTsKK3N0cnVjdCBTdGFuZGFyZFBhcmFtczsKKworLyoqCisgKiBTdHJ1Y3QgbWFuYWdpbmcgdGhlIGNvZGVjIGNvbmZpZ3VyYXRpb24gZm9yIENDb2RlYy4KKyAqLworc3RydWN0IENDb2RlY0NvbmZpZyB7CisKKyAgICAvKioKKyAgICAgKiBEb21haW4gY29uc2lzdHMgb2YgYSBiaXRtYXNrIGRpdmlkZWQgaW50byBmaWVsZHMsIGFuZCBzcGVjaWZpZXJzIHdvcmsgYnkgZXhjbHVkaW5nIG90aGVyCisgICAgICogdmFsdWVzIGluIHRob3NlIGRvbWFpbnMuCisgICAgICoKKyAgICAgKiBDb21wb25lbnQgZG9tYWlucyBhcmUgY29tcG9zZWQgYnkgb3ItaW5nIHRoZSBpbmRpdmlkdWFsIElTXyBjb25zdGFudHMsIGUuZy4KKyAgICAgKiBJU19ERUNPREVSIHwgSVNfQVVESU8uCisgICAgICoKKyAgICAgKiBDb25maWcgc3BlY2lmaWVycyBhcmUgY29tcG9zZWQgYnkgb3ItaW5nIHRoZSBpbmRpdmlkdWFsIG1hc2sgY29uc3RhbnRzLCBhbmQKKyAgICAgKiBhbmQtaW5nIHRoZXNlIGdyb3VwczogZS5nLiAoREVDT0RFUiB8IEVOQ09ERVIpICYgQVVESU8uCisgICAgICoKKyAgICAgKiBUaGUgbmFtaW5nIG9mIHRoZXNlIGNvbnN0YW50cyB3YXMgdG8gbGltaXQgdGhlIGxlbmd0aCBvZiBtYXNrIG5hbWVzIGFzIHRoZXNlIGFyZSB1c2VkIG1vcmUKKyAgICAgKiBjb21tb25seSBhcyBtYXNrcy4KKyAgICAgKi8KKyAgICBlbnVtIERvbWFpbiA6IHVpbnQzMl90IHsKKyAgICAgICAgLy8gY29tcG9uZW50IGRvbWFpbiAoZG9tYWluICYga2luZCkKKyAgICAgICAgR1VBUkRfQklUICAgPSAoMSA8PCAxKSwgICAvLy88IHRoaXMgaXMgdG8gcHJldmVudCBhZ2FpbnN0IGFjY2lkZW50YWwgJiYgb3IgfHwgdXNhZ2UKKyAgICAgICAgSVNfQVVESU8gICAgPSAoMSA8PCAyKSwgICAvLy88IGZvciBhdWRpbyBjb2RlY3MKKyAgICAgICAgSVNfVklERU8gICAgPSAoMSA8PCAzKSwgICAvLy88IGZvciB2aWRlbyBjb2RlY3MKKyAgICAgICAgSVNfSU1BR0UgICAgPSAoMSA8PCA0KSwgICAvLy88IGZvciBpbWFnZSBjb2RlY3MKKyAgICAgICAgT1RIRVJfRE9NQUlOID0gKDEgPDwgNSksICAvLy88IGZvciBvdGhlciBkb21haW5zCisKKyAgICAgICAgSVNfRU5DT0RFUiAgPSAoMSA8PCA2KSwgICAvLy88IGZvciBlbmNvZGVycworICAgICAgICBJU19ERUNPREVSICA9ICgxIDw8IDcpLCAgIC8vLzwgZm9yIGRlY29kZXJzCisgICAgICAgIE9USEVSX0tJTkQgID0gKDEgPDwgOCksICAgLy8vPCBmb3Igb3RoZXIgZG9tYWlucworCisgICAgICAgIC8vIGNvbmZpZyBkb21haW4KKyAgICAgICAgSVNfUEFSQU0gICAgPSAoMSA8PCA5KSwgICAvLy88IGZvciBzZXRQYXJhbWV0ZXIKKyAgICAgICAgSVNfQ09ORklHICAgPSAoMSA8PCAxMCksICAvLy88IGZvciBjb25maWd1cmUKKyAgICAgICAgSVNfUkVBRCAgICAgPSAoMSA8PCAxMSksICAvLy88IGZvciBnZXRGb3JtYXQKKworICAgICAgICAvLyBwb3J0IGRvbWFpbgorICAgICAgICBJU19JTlBVVCAgICA9ICgxIDw8IDEyKSwgIC8vLzwgZm9yIGlucHV0IHBvcnQgKGdldEZvcm1hdCkKKyAgICAgICAgSVNfT1VUUFVUICAgPSAoMSA8PCAxMyksICAvLy88IGZvciBvdXRwdXQgcG9ydCAoZ2V0Rm9ybWF0KQorICAgICAgICBJU19SQVcgICAgICA9ICgxIDw8IDE0KSwgIC8vLzwgZm9yIHJhdyBwb3J0IChpbnB1dC1lbmNvZGVyLCBvdXRwdXQtZGVjb2RlcikKKyAgICAgICAgSVNfQ09ERUQgICAgPSAoMSA8PCAxNSksICAvLy88IGZvciBjb2RlZCBwb3J0IChpbnB1dC1kZWNvZGVyLCBvdXRwdXQtZW5jb2RlcikKKworICAgICAgICBBTEwgICAgID0gfjBVLAorICAgICAgICBOT05FICAgID0gMCwKKworICAgICAgICBBVURJTyAgID0gfihJU19JTUFHRSB8IElTX1ZJREVPIHwgT1RIRVJfRE9NQUlOKSwKKyAgICAgICAgVklERU8gICA9IH4oSVNfQVVESU8gfCBJU19JTUFHRSB8IE9USEVSX0RPTUFJTiksCisgICAgICAgIElNQUdFICAgPSB+KElTX0FVRElPIHwgSVNfVklERU8gfCBPVEhFUl9ET01BSU4pLAorCisgICAgICAgIERFQ09ERVIgPSB+KElTX0VOQ09ERVIgfCBPVEhFUl9LSU5EKSwKKyAgICAgICAgRU5DT0RFUiA9IH4oSVNfREVDT0RFUiB8IE9USEVSX0tJTkQpLAorCisgICAgICAgIFBBUkFNICAgPSB+KElTX0NPTkZJRyB8IElTX1JFQUQpLAorICAgICAgICBDT05GSUcgID0gfihJU19QQVJBTSAgfCBJU19SRUFEKSwKKyAgICAgICAgUkVBRCAgICA9IH4oSVNfQ09ORklHIHwgSVNfUEFSQU0pLAorCisgICAgICAgIElOUFVUICAgPSB+KElTX09VVFBVVCB8IElTX1JBVyAgICB8IElTX0NPREVEKSwKKyAgICAgICAgT1VUUFVUICA9IH4oSVNfSU5QVVQgIHwgSVNfUkFXICAgIHwgSVNfQ09ERUQpLAorICAgICAgICBSQVcgICAgID0gfihJU19JTlBVVCAgfCBJU19PVVRQVVQgfCBJU19DT0RFRCksCisgICAgICAgIENPREVEICAgPSB+KElTX0lOUFVUICB8IElTX1JBVyAgICB8IElTX09VVFBVVCksCisgICAgfTsKKworICAgIC8vIHRoaW5ncyByZXF1aXJlZCB0byBtYW5hZ2UgZm9ybWF0cworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IG1QYXJhbURlc2NzOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBtUmVmbGVjdG9yOworCisgICAgc3RkOjpzaGFyZWRfcHRyPFJlZmxlY3RlZFBhcmFtVXBkYXRlcj4gbVBhcmFtVXBkYXRlcjsKKworICAgIERvbWFpbiBtRG9tYWluOyAvLyBjb21wb25lbnQgZG9tYWluCisgICAgRG9tYWluIG1JbnB1dERvbWFpbjsgLy8gaW5wdXQgcG9ydCBkb21haW4KKyAgICBEb21haW4gbU91dHB1dERvbWFpbjsgLy8gb3V0cHV0IHBvcnQgZG9tYWluCisgICAgc3RkOjpzdHJpbmcgbUNvZGluZ01lZGlhVHlwZTsgIC8vIG1lZGlhIHR5cGUgb2YgdGhlIGNvZGVkIHN0cmVhbQorCisgICAgLy8gc3RhbmRhcmQgTWVkaWFDb2RlYyB0byBDb2RlYyAyLjAgcGFyYW1zIG1hcHBpbmcKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U3RhbmRhcmRQYXJhbXM+IG1TdGFuZGFyZFBhcmFtczsKKworICAgIHN0ZDo6c2V0PEMyUGFyYW06OkluZGV4PiBtU3VwcG9ydGVkSW5kaWNlczsgLy8vPCBpbmRpY2VzIHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50CisgICAgc3RkOjpzZXQ8QzJQYXJhbTo6SW5kZXg+IG1TdWJzY3JpYmVkSW5kaWNlczsgLy8vPCBpbmRpY2VzIHRvIHN1YnNjcmliZSB0bworICAgIHNpemVfdCBtU3Vic2NyaWJlZEluZGljZXNTaXplOyAvLy88IGNvdW50IG9mIGN1cnJlbnRseSBzdWJzY3JpYmVkIGluZGljZXMKKworICAgIHNwPEFNZXNzYWdlPiBtSW5wdXRGb3JtYXQ7CisgICAgc3A8QU1lc3NhZ2U+IG1PdXRwdXRGb3JtYXQ7CisKKyAgICBib29sIG1Vc2luZ1N1cmZhY2U7IC8vLzwgdXNpbmcgaW5wdXQgb3Igb3V0cHV0IHN1cmZhY2UKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyPiBtSW5wdXRTdXJmYWNlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxJbnB1dFN1cmZhY2VXcmFwcGVyOjpDb25maWc+IG1JU0NvbmZpZzsKKworICAgIC8vLyB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uLiBVcGRhdGVkIGFmdGVyIGNvbmZpZ3VyZSgpIGFuZCBiYXNlZCBvbiBjb25maWdVcGRhdGUgaW4KKyAgICAvLy8gb25Xb3JrRG9uZQorICAgIHN0ZDo6bWFwPEMyUGFyYW06OkluZGV4LCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IG1DdXJyZW50Q29uZmlnOworCisgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiYpPiBMb2NhbFBhcmFtVmFsaWRhdG9yOworCisgICAgLy8vIFBhcmFtZXRlciBpbmRpY2VzIHRyYWNrZWQgaW4gY3VycmVudCBjb25maWcgdGhhdCBhcmUgbm90IHN1cHBvcnRlZCBieSB0aGUgY29tcG9uZW50LgorICAgIC8vLyB0aGVzZSBhcmUgcHJvdmlkZWQgc28gdGhhdCBvcHRpb25hbCBwYXJhbWV0ZXJzIGNhbiByZW1haW4gaW4gdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbi4KKyAgICAvLy8gYXMgc3VjaCwgdGhlc2UgcGFyYW1ldGVycyBoYXZlIG5vIGRlcGVuZGVuY2llcy4gVE9ETzogdXNlIEMySW50ZXJmYWNlSGVscGVyIGZvciB0aGlzLgorICAgIC8vLyBGb3Igbm93IHN1cHBvcnQgYSB2YWxpZGF0aW9uIGZ1bmN0aW9uLgorICAgIHN0ZDo6bWFwPEMyUGFyYW06OkluZGV4LCBMb2NhbFBhcmFtVmFsaWRhdG9yPiBtTG9jYWxQYXJhbXM7CisKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gbUxhc3RDb25maWc7CisKKyAgICBDQ29kZWNDb25maWcoKTsKKworICAgIC8vLyBpbml0aWFsaXplcyB0aGUgbWVtYmVycyByZXF1aXJlZCB0byBtYW5hZ2UgdGhlIGZvcm1hdDogZGVzY3JpcHRvcnMsIHJlZmxlY3RvciwKKyAgICAvLy8gcmVmbGVjdGVkIHBhcmFtIGhlbHBlciwgZG9tYWluLCBzdGFuZGFyZCBwYXJhbXMsIGFuZCBzdWJzY3JpYmVzIHRvIHN0YW5kYXJkCisgICAgLy8vIGluZGljZXMuCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ+ICZjbGllbnQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wb25lbnQpOworCisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgbG9jYWxseSBtYWludGFpbmVkIHBhcmFtZXRlci4gVGhpcyBpcyB1c2VkIGZvciBvdXRwdXQgY29uZmlndXJhdGlvbiB0aGF0IGNhbiBiZQorICAgICAqIGFwcGVuZGVkIHRvIHRoZSBvdXRwdXQgYnVmZmVycyBpbiBjYXNlIGl0IGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIGJvb2wgYWRkTG9jYWxQYXJhbSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYiA9IEMyUGFyYW1EZXNjcmlwdG9yOjpJU19SRUFEX09OTFksCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPiB2YWxpZGF0b3JfID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPigpKSB7CisgICAgICAgIEMyUGFyYW06OkluZGV4IGluZGV4ID0gVDo6UEFSQU1fVFlQRTsKKyAgICAgICAgaWYgKG1TdXBwb3J0ZWRJbmRpY2VzLmNvdW50KGluZGV4KSB8fCBtTG9jYWxQYXJhbXMuY291bnQoaW5kZXgpKSB7CisgICAgICAgICAgICBpZiAobVN1cHBvcnRlZEluZGljZXMuY291bnQoaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgbVN1YnNjcmliZWRJbmRpY2VzLmVtcGxhY2UoaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR0QoImlnbm9yaW5nIGxvY2FsIHBhcmFtICVzICglI3gpIGFzIGl0IGlzIGFscmVhZHkgJXMiLAorICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksICh1aW50MzJfdClpbmRleCwgbVN1cHBvcnRlZEluZGljZXMuY291bnQoaW5kZXgpID8gInN1cHBvcnRlZCIgOiAibG9jYWwiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gYWxyZWFkeSBzdXBwb3J0ZWQgYnkgdGhlIGNvbXBvbmVudCBvciBhbHJlYWR5IGFkZGVkCisgICAgICAgIH0KKworICAgICAgICAvLyB3cmFwIHR5cGVkIHZhbGlkYXRvciBpbnRvIHVudHlwZWQgdmFsaWRhdG9yCisgICAgICAgIExvY2FsUGFyYW1WYWxpZGF0b3IgdmFsaWRhdG9yOworICAgICAgICBpZiAodmFsaWRhdG9yXykgeworICAgICAgICAgICAgdmFsaWRhdG9yID0gW3ZhbGlkYXRvcl9dKHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiYgcCl7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiB0eXBlZChzdGF0aWNfY2FzdDxUKj4ocC5yZWxlYXNlKCkpKTsKKyAgICAgICAgICAgICAgICAvLyBpZiBwYXJhbWV0ZXIgaXMgY29ycmVjdGx5IHR5cGVkCisgICAgICAgICAgICAgICAgaWYgKFQ6OkZyb20odHlwZWQuZ2V0KCkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IHZhbGlkYXRvcl8odHlwZWQpOworICAgICAgICAgICAgICAgICAgICBwLnJlc2V0KHR5cGVkLnJlbGVhc2UoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgbUxvY2FsUGFyYW1zLmVtcGxhY2UoaW5kZXgsIHZhbGlkYXRvcik7CisgICAgICAgIG1QYXJhbVVwZGF0ZXItPmFkZFN0YW5kYXJkUGFyYW08VD4obmFtZSwgYXR0cmliKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBhIGxvY2FsbHkgbWFpbnRhaW5lZCBwYXJhbWV0ZXIgd2l0aCBhIGRlZmF1bHQgdmFsdWUuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBib29sIGFkZExvY2FsUGFyYW0oCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gZGVmYXVsdF8sCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKKyAgICAgICAgICAgIEMyUGFyYW1EZXNjcmlwdG9yOjphdHRyaWJfdCBhdHRyaWIgPSBDMlBhcmFtRGVzY3JpcHRvcjo6SVNfUkVBRF9PTkxZLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChzdGQ6OnVuaXF1ZV9wdHI8VD4mKT4gdmFsaWRhdG9yXyA9CisgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxjMl9zdGF0dXNfdChzdGQ6OnVuaXF1ZV9wdHI8VD4mKT4oKSkgeworICAgICAgICBpZiAoYWRkTG9jYWxQYXJhbTxUPihuYW1lLCBhdHRyaWIsIHZhbGlkYXRvcl8pKSB7CisgICAgICAgICAgICBpZiAodmFsaWRhdG9yXykgeworICAgICAgICAgICAgICAgIGMyX3N0YXR1c190IGVyciA9IHZhbGlkYXRvcl8oZGVmYXVsdF8pOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImRlZmF1bHQgdmFsdWUgZm9yICVzIGlzIGludmFsaWQgPT4gJXMiLCBuYW1lLmNfc3RyKCksIGFzU3RyaW5nKGVycikpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbUN1cnJlbnRDb25maWdbVDo6UEFSQU1fVFlQRV0gPSBzdGQ6Om1vdmUoZGVmYXVsdF8pOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgYm9vbCBhZGRMb2NhbFBhcmFtKAorICAgICAgICAgICAgVCAqZGVmYXVsdF8sIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAorICAgICAgICAgICAgQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90IGF0dHJpYiA9IEMyUGFyYW1EZXNjcmlwdG9yOjpJU19SRUFEX09OTFksCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPiB2YWxpZGF0b3JfID0KKyAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KHN0ZDo6dW5pcXVlX3B0cjxUPiYpPigpKSB7CisgICAgICAgIHJldHVybiBhZGRMb2NhbFBhcmFtKHN0ZDo6dW5pcXVlX3B0cjxUPihkZWZhdWx0XyksIG5hbWUsIGF0dHJpYiwgdmFsaWRhdG9yXyk7CisgICAgfQorCisgICAgLy8vIEFwcGxpZXMgY29uZmlndXJhdGlvbiB1cGRhdGVzLCBhbmQgdXBkYXRlcyBmb3JtYXQgaW4gdGhlIHNwZWNpZmljIGRvbWFpbi4KKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGZvcm1hdHMgd2VyZSB1cGRhdGVkCisgICAgLy8vIFxwYXJhbSBkb21haW4gaW5wdXQvb3V0cHV0IGJpdG1hc2sKKyAgICBib29sIHVwZGF0ZUNvbmZpZ3VyYXRpb24oCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICZjb25maWdVcGRhdGUsIERvbWFpbiBkb21haW4pOworCisgICAgLy8vIFVwZGF0ZXMgZm9ybWF0cyBpbiB0aGUgc3BlY2lmaWMgZG9tYWluLiBSZXR1cm5zIHRydWUgaWYgYW55IG9mIHRoZSBmb3JtYXRzIGhhdmUgY2hhbmdlZC4KKyAgICAvLy8gXHBhcmFtIGRvbWFpbiBpbnB1dC9vdXRwdXQgYml0bWFzaworICAgIGJvb2wgdXBkYXRlRm9ybWF0cyhEb21haW4gZG9tYWluKTsKKworICAgIC8qKgorICAgICAqIEFwcGxpZXMgU0RLIGNvbmZpZ3VyYXRpb25zIGluIGEgc3BlY2lmaWMgY29uZmlndXJhdGlvbiBkb21haW4uCisgICAgICogVXBkYXRlcyByZWxldmFudCBpbnB1dC9vdXRwdXQgZm9ybWF0cyBhbmQgc3Vic2NyaWJlcyB0byBwYXJhbWV0ZXJzIHNwZWNpZmllZCBpbiB0aGUKKyAgICAgKiBjb25maWd1cmF0aW9uLgorICAgICAqIFxwYXJhbSBkb21haW4gY29uZmlnL3NldFBhcmFtIGJpdG1hc2sKKyAgICAgKiBccGFyYW0gYmxvY2tpbmcgYmxvY2tpbmcgbW9kZSB0byB1c2Ugd2l0aCB0aGUgY29tcG9uZW50CisgICAgICovCisgICAgc3RhdHVzX3QgZ2V0Q29uZmlnVXBkYXRlRnJvbVNka1BhcmFtcygKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZzZGtQYXJhbXMsIERvbWFpbiBkb21haW4sCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IGJsb2NraW5nLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uZmlnVXBkYXRlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEFwcGxpZXMgYSBjb25maWd1cmF0aW9uIHVwZGF0ZSB0byB0aGUgY29tcG9uZW50LgorICAgICAqIFVwZGF0ZXMgcmVsZXZhbnQgaW5wdXQvb3V0cHV0IGZvcm1hdHMgYW5kIHN1YnNjcmliZXMgdG8gcGFyYW1ldGVycyBzcGVjaWZpZWQgaW4gdGhlCisgICAgICogY29uZmlndXJhdGlvbi4KKyAgICAgKiBccGFyYW0gYmxvY2tpbmcgYmxvY2tpbmcgbW9kZSB0byB1c2Ugd2l0aCB0aGUgY29tcG9uZW50CisgICAgICovCisgICAgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycygKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmY29uZmlnVXBkYXRlLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZyk7CisKKyAgICAvLy8gUXVlcmllcyBzdWJzY3JpYmVkIGluZGljZXMgKHdoaWNoIGNvbnRhaW5zIGFsbCBTREstZXhwb3NlZCB2YWx1ZXMpIGFuZCB1cGRhdGVzCisgICAgLy8vIGlucHV0L291dHB1dCBmb3JtYXRzLgorICAgIHN0YXR1c190IHF1ZXJ5Q29uZmlndXJhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXBvbmVudCk7CisKKyAgICAvLy8gUXVlcmllcyBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIHZhbHVlLiBSZXR1cm5zIG51bGxwdHIgaWYgdGhlIHBhcmFtZXRlciBpcyBub3QKKyAgICAvLy8gcGFydCBvZiB0aGUgY3VycmVudCBjb25maWd1cmF0aW9uCisgICAgY29uc3QgQzJQYXJhbSAqZ2V0Q29uZmlnUGFyYW1ldGVyVmFsdWUoQzJQYXJhbTo6SW5kZXggaW5kZXgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogT2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gYWNjZXNzIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBhbmQgaWYgdGhleSBjaGFuZ2UuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgV2F0Y2hlciB7CisgICAgICAgIH5XYXRjaGVyKCkgPSBkZWZhdWx0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIG9mIHRoaXMgY29uZmlndXJhdGlvbiBoYXMgY2hhbmdlZAorICAgICAgICBib29sIGhhc0NoYW5nZWQoKSBjb25zdCB7CisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSA9IG1QYXJlbnQtPmdldENvbmZpZ1BhcmFtZXRlclZhbHVlKG1JbmRleCk7CisgICAgICAgICAgICBpZiAodmFsdWUgJiYgbVZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuICp2YWx1ZSAhPSAqbVZhbHVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgIT0gbVZhbHVlLmdldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8vIHVwZGF0ZXMgdGhlIGN1cnJlbnQgdmFsdWUgYW5kIHJldHVybnMgaXQKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFQ+IHVwZGF0ZSgpIHsKKyAgICAgICAgICAgIGNvbnN0IEMyUGFyYW0gKnZhbHVlID0gbVBhcmVudC0+Z2V0Q29uZmlnUGFyYW1ldGVyVmFsdWUobUluZGV4KTsKKyAgICAgICAgICAgIGlmICh2YWx1ZSkgeworICAgICAgICAgICAgICAgIG1WYWx1ZSA9IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUPihUOjpGcm9tKEMyUGFyYW06OkNvcHkoKnZhbHVlKS5yZWxlYXNlKCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtVmFsdWU7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIFdhdGNoZXIoQzJQYXJhbTo6SW5kZXggaW5kZXgsIGNvbnN0IENDb2RlY0NvbmZpZyAqcGFyZW50KQorICAgICAgICAgICAgOiBtUGFyZW50KHBhcmVudCksIG1JbmRleChpbmRleCkgeworICAgICAgICAgICAgdXBkYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgc3RydWN0IENDb2RlY0NvbmZpZzsKKworICAgICAgICBjb25zdCBDQ29kZWNDb25maWcgKm1QYXJlbnQ7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUPiBtVmFsdWU7CisgICAgICAgIEMyUGFyYW06OkluZGV4IG1JbmRleDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIHdhdGNoZXIgb2JqZWN0IGZvciBhIHBhcmFtZXRlci4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFdhdGNoZXI8VD4gd2F0Y2goQzJQYXJhbTo6SW5kZXggaW5kZXggPSBUOjpQQVJBTV9UWVBFKSBjb25zdCB7CisgICAgICAgIGlmIChpbmRleC50eXBlKCkgIT0gVDo6UEFSQU1fVFlQRSkgeworICAgICAgICAgICAgX19idWlsdGluX3RyYXAoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gV2F0Y2hlcjxUPihpbmRleCwgdGhpcyk7CisgICAgfQorCitwcml2YXRlOgorCisgICAgLy8vIGluaXRpYWxpemVzIHRoZSBzdGFuZGFyZCBNZWRpYUNvZGVjIHRvIENvZGVjIDIuMCBwYXJhbXMgbWFwcGluZworICAgIHZvaWQgaW5pdGlhbGl6ZVN0YW5kYXJkUGFyYW1zKCk7CisKKyAgICAvLy8gQWRkcyBpbmRpY2VzIHRvIHRoZSBzdWJzY3JpYmVkIGluZGljZXMsIGFuZCB1cGRhdGVkIHN1YnNjcmlwdGlvbiB0byBjb21wb25lbnQKKyAgICAvLy8gXHBhcmFtIGJsb2NraW5nIGJsb2NraW5nIG1vZGUgdG8gdXNlIHdpdGggdGhlIGNvbXBvbmVudAorICAgIHN0YXR1c190IHN1YnNjcmliZVRvQ29uZmlnVXBkYXRlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcG9uZW50LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZpbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBibG9ja2luZyA9IEMyX0RPTlRfQkxPQ0spOworCisgICAgLy8vIEdldHMgU0RLIGZvcm1hdCBmcm9tIGNvZGVjIDIuMCByZWZsZWN0ZWQgY29uZmlndXJhdGlvbgorICAgIC8vLyBccGFyYW0gZG9tYWluIGlucHV0L291dHB1dCBiaXRtYXNrCisgICAgc3A8QU1lc3NhZ2U+IGdldFNka0Zvcm1hdEZvckRvbWFpbigKKyAgICAgICAgICAgIGNvbnN0IFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCAmcmVmbGVjdGVkLCBEb21haW4gZG9tYWluKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIGEgc2V0IG9mIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyBpbiBhbiBBTWVzc2FnZSB0byBhIGxpc3Qgb2YgcGF0aC1iYXNlZCBDb2RlYworICAgICAqIDIuMCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMuCisgICAgICoKKyAgICAgKiBccGFyYW0gZG9tYWluIGNvbmZpZy9zZXRQYXJhbSBiaXRtYXNrCisgICAgICovCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IGdldFJlZmxlY3RlZEZvcm1hdCgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmY29uZmlnLCBEb21haW4gZG9tYWluKSBjb25zdDsKK307CisKK0RFRklORV9FTlVNX09QRVJBVE9SUyhDQ29kZWNDb25maWc6OkRvbWFpbikKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDX0NPREVDX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuY3BwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4YWQ1NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuY3BwCkBAIC0wLDAgKzEsODE1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMkJ1ZmZlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGhpZGxtZW1vcnkvRnJhbWV3b3JrVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KKyNpbmNsdWRlIDxuYXRpdmViYXNlL25hdGl2ZWJhc2UuaD4KKyNpbmNsdWRlIDx1aS9GZW5jZS5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorCisjaW5jbHVkZSAiQ29kZWMyQnVmZmVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gQ29kZWMyQnVmZmVyCisKK2Jvb2wgQ29kZWMyQnVmZmVyOjpjYW5Db3B5TGluZWFyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3QgeworICAgIGlmIChjb25zdF9jYXN0PENvZGVjMkJ1ZmZlciAqPih0aGlzKS0+YmFzZSgpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAvLyBOb3RoaW5nIHRvIGNvcHksIHNvIHdlIGNhbiBjb3B5IGJ5IGRvaW5nIG5vdGhpbmcuCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoYnVmZmVyLT5kYXRhKCkudHlwZSgpICE9IEMyQnVmZmVyRGF0YTo6TElORUFSKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpLnNpemUoKSA9PSAwdSkgeworICAgICAgICAvLyBOb3RoaW5nIHRvIGNvcHksIHNvIHdlIGNhbiBjb3B5IGJ5IGRvaW5nIG5vdGhpbmcuCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKCkuc2l6ZSgpID4gMXUpIHsKKyAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyBob3cgdG8gY29weSBtb3JlIHRoYW4gb25lIGJsb2Nrcy4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0uc2l6ZSgpID4gY2FwYWNpdHkoKSkgeworICAgICAgICAvLyBJdCB3b24ndCBmaXQuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29kZWMyQnVmZmVyOjpjb3B5TGluZWFyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgeworICAgIC8vIFdlIGFzc3VtZSB0aGF0IGFsbCBjYW5Db3B5TGluZWFyKCkgY2hlY2tzIHBhc3NlZC4KKyAgICBpZiAoIWJ1ZmZlciB8fCBidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5zaXplKCkgPT0gMHUKKyAgICAgICAgICAgIHx8IGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpWzBdLnNpemUoKSA9PSAwdSkgeworICAgICAgICBzZXRSYW5nZSgwLCAwKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIEMyUmVhZFZpZXcgdmlldyA9IGJ1ZmZlci0+ZGF0YSgpLmxpbmVhckJsb2NrcygpWzBdLm1hcCgpLmdldCgpOworICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoIkVycm9yIHdoaWxlIG1hcHBpbmc6ICVkIiwgdmlldy5lcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAodmlldy5jYXBhY2l0eSgpID4gY2FwYWNpdHkoKSkgeworICAgICAgICBBTE9HRCgiQzJDb25zdExpbmVhckJsb2NrIGxpZWQgLS0tIGl0IGFjdHVhbGx5IGRvZXNuJ3QgZml0OiB2aWV3KCV1KSA+IHRoaXMoJXp1KSIsCisgICAgICAgICAgICAgICAgdmlldy5jYXBhY2l0eSgpLCBjYXBhY2l0eSgpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1jcHkoYmFzZSgpLCB2aWV3LmRhdGEoKSwgdmlldy5jYXBhY2l0eSgpKTsKKyAgICBzZXRSYW5nZSgwLCB2aWV3LmNhcGFjaXR5KCkpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIENvZGVjMkJ1ZmZlcjo6c2V0SW1hZ2VEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZpbWFnZURhdGEpIHsKKyAgICBtSW1hZ2VEYXRhID0gaW1hZ2VEYXRhOworfQorCisvLyBMb2NhbExpbmVhckJ1ZmZlcgorCitib29sIExvY2FsTGluZWFyQnVmZmVyOjpjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3QgeworICAgIHJldHVybiBjYW5Db3B5TGluZWFyKGJ1ZmZlcik7Cit9CisKK2Jvb2wgTG9jYWxMaW5lYXJCdWZmZXI6OmNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgcmV0dXJuIGNvcHlMaW5lYXIoYnVmZmVyKTsKK30KKworLy8gRHVtbXlDb250YWluZXJCdWZmZXIKKworc3RhdGljIHVpbnQ4X3Qgc0R1bW15Qnl0ZVsxXSA9IHsgMCB9OworCitEdW1teUNvbnRhaW5lckJ1ZmZlcjo6RHVtbXlDb250YWluZXJCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcihzRHVtbXlCeXRlLCAxKSksCisgICAgICBtQnVmZmVyUmVmKGJ1ZmZlcikgeworICAgIHNldFJhbmdlKDAsIGJ1ZmZlciA/IDEgOiAwKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBEdW1teUNvbnRhaW5lckJ1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyAgICByZXR1cm4gc3RkOjptb3ZlKG1CdWZmZXJSZWYpOworfQorCitib29sIER1bW15Q29udGFpbmVyQnVmZmVyOjpjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJikgY29uc3QgeworICAgIHJldHVybiAhbUJ1ZmZlclJlZjsKK30KKworYm9vbCBEdW1teUNvbnRhaW5lckJ1ZmZlcjo6Y29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBtQnVmZmVyUmVmID0gYnVmZmVyOworICAgIHNldFJhbmdlKDAsIG1CdWZmZXJSZWYgPyAxIDogMCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIExpbmVhckJsb2NrQnVmZmVyCisKKy8vIHN0YXRpYworc3A8TGluZWFyQmxvY2tCdWZmZXI+IExpbmVhckJsb2NrQnVmZmVyOjpBbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spIHsKKyAgICBDMldyaXRlVmlldyB3cml0ZVZpZXcoYmxvY2stPm1hcCgpLmdldCgpKTsKKyAgICBpZiAod3JpdGVWaWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBuZXcgTGluZWFyQmxvY2tCdWZmZXIoZm9ybWF0LCBzdGQ6Om1vdmUod3JpdGVWaWV3KSwgYmxvY2spOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IExpbmVhckJsb2NrQnVmZmVyOjphc0MyQnVmZmVyKCkgeworICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKG1CbG9jay0+c2hhcmUob2Zmc2V0KCksIHNpemUoKSwgQzJGZW5jZSgpKSk7Cit9CisKK2Jvb2wgTGluZWFyQmxvY2tCdWZmZXI6OmNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCB7CisgICAgcmV0dXJuIGNhbkNvcHlMaW5lYXIoYnVmZmVyKTsKK30KKworYm9vbCBMaW5lYXJCbG9ja0J1ZmZlcjo6Y29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICByZXR1cm4gY29weUxpbmVhcihidWZmZXIpOworfQorCitMaW5lYXJCbG9ja0J1ZmZlcjo6TGluZWFyQmxvY2tCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBDMldyaXRlVmlldyYmIHdyaXRlVmlldywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaykKKyAgICA6IENvZGVjMkJ1ZmZlcihmb3JtYXQsIG5ldyBBQnVmZmVyKHdyaXRlVmlldy5kYXRhKCksIHdyaXRlVmlldy5zaXplKCkpKSwKKyAgICAgIG1Xcml0ZVZpZXcod3JpdGVWaWV3KSwKKyAgICAgIG1CbG9jayhibG9jaykgeworfQorCisvLyBDb25zdExpbmVhckJsb2NrQnVmZmVyCisKKy8vIHN0YXRpYworc3A8Q29uc3RMaW5lYXJCbG9ja0J1ZmZlcj4gQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICBpZiAoIWJ1ZmZlcgorICAgICAgICAgICAgfHwgYnVmZmVyLT5kYXRhKCkudHlwZSgpICE9IEMyQnVmZmVyRGF0YTo6TElORUFSCisgICAgICAgICAgICB8fCBidWZmZXItPmRhdGEoKS5saW5lYXJCbG9ja3MoKS5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIEMyUmVhZFZpZXcgcmVhZFZpZXcoYnVmZmVyLT5kYXRhKCkubGluZWFyQmxvY2tzKClbMF0ubWFwKCkuZ2V0KCkpOworICAgIGlmIChyZWFkVmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbmV3IENvbnN0TGluZWFyQmxvY2tCdWZmZXIoZm9ybWF0LCBzdGQ6Om1vdmUocmVhZFZpZXcpLCBidWZmZXIpOworfQorCitDb25zdExpbmVhckJsb2NrQnVmZmVyOjpDb25zdExpbmVhckJsb2NrQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgQzJSZWFkVmlldyYmIHJlYWRWaWV3LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBuZXcgQUJ1ZmZlcigKKyAgICAgICAgICAgIC8vIE5PVEU6IEFCdWZmZXIgb25seSB0YWtlcyBub24tY29uc3QgcG9pbnRlciBidXQgdGhpcyBkYXRhIGlzCisgICAgICAgICAgICAvLyAgICAgICBzdXBwb3NlZCB0byBiZSByZWFkLW9ubHkuCisgICAgICAgICAgICBjb25zdF9jYXN0PHVpbnQ4X3QgKj4ocmVhZFZpZXcuZGF0YSgpKSwgcmVhZFZpZXcuY2FwYWNpdHkoKSkpLAorICAgICAgbVJlYWRWaWV3KHJlYWRWaWV3KSwKKyAgICAgIG1CdWZmZXJSZWYoYnVmZmVyKSB7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyAgICByZXR1cm4gc3RkOjptb3ZlKG1CdWZmZXJSZWYpOworfQorCisvLyBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyCisKK25hbWVzcGFjZSB7CisKK2NsYXNzIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBDMkdyYXBoaWNWaWV3IDw9PiBNZWRpYUltYWdlIGNvbnZlcnRlcgorICAgICAqCisgICAgICogXHBhcmFtIHZpZXcgQzJHcmFwaGljVmlldyBvYmplY3QKKyAgICAgKiBccGFyYW0gY29sb3JGb3JtYXQgZGVzaXJlZCBTREsgY29sb3IgZm9ybWF0IGZvciB0aGUgTWVkaWFJbWFnZSAoaWYgdGhpcyBpcyBhIGZsZXhpYmxlIGZvcm1hdCwKKyAgICAgKiAgICAgICAgYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHNpbXBseSByZXByZXNlbnQgdGhlIGdyYXBoaWMgdmlldyBhcyBhIGZsZXhpYmxlIFNESyBmb3JtYXQKKyAgICAgKiAgICAgICAgd2l0aG91dCBhIG1lbWNweSkKKyAgICAgKiBccGFyYW0gY29weSB3aGV0aGVyIHRoZSBjb252ZXJ0ZXIgaXMgdXNlZCBmb3IgY29weSBvciBub3QKKyAgICAgKi8KKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyKAorICAgICAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAmdmlldywgaW50MzJfdCBjb2xvckZvcm1hdCwgYm9vbCBjb3B5KQorICAgICAgICA6IG1Jbml0Q2hlY2soTk9fSU5JVCksCisgICAgICAgICAgbVZpZXcodmlldyksCisgICAgICAgICAgbVdpZHRoKHZpZXcud2lkdGgoKSksCisgICAgICAgICAgbUhlaWdodCh2aWV3LmhlaWdodCgpKSwKKyAgICAgICAgICBtQ29sb3JGb3JtYXQoY29sb3JGb3JtYXQpLAorICAgICAgICAgIG1BbGxvY2F0ZWREZXB0aCgwKSwKKyAgICAgICAgICBtQmFja0J1ZmZlclNpemUoMCksCisgICAgICAgICAgbU1lZGlhSW1hZ2UobmV3IEFCdWZmZXIoc2l6ZW9mKE1lZGlhSW1hZ2UyKSkpIHsKKyAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogdmlldy5lcnJvcigpID0gJWQiLCB2aWV3LmVycm9yKCkpOworICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBNZWRpYUltYWdlMiAqbWVkaWFJbWFnZSA9IChNZWRpYUltYWdlMiAqKW1NZWRpYUltYWdlLT5iYXNlKCk7CisgICAgICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSB2aWV3LmxheW91dCgpOworICAgICAgICBpZiAobGF5b3V0Lm51bVBsYW5lcyA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiAwIHBsYW5lcyIpOworICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtZW1zZXQobWVkaWFJbWFnZSwgMCwgc2l6ZW9mKCptZWRpYUltYWdlKSk7CisgICAgICAgIG1BbGxvY2F0ZWREZXB0aCA9IGxheW91dC5wbGFuZXNbMF0uYWxsb2NhdGVkRGVwdGg7CisgICAgICAgIHVpbnQzMl90IGJpdERlcHRoID0gbGF5b3V0LnBsYW5lc1swXS5iaXREZXB0aDsKKworICAgICAgICAvLyBhbGlnbiB3aWR0aCBhbmQgaGVpZ2h0IHRvIHN1cHBvcnQgc3Vic2FtcGxpbmcgY2xlYW5seQorICAgICAgICB1aW50MzJfdCBzdHJpZGUgPSBhbGlnbih2aWV3LmNyb3AoKS53aWR0aCwgMikgKiBkaXZVcChsYXlvdXQucGxhbmVzWzBdLmFsbG9jYXRlZERlcHRoLCA4dSk7CisgICAgICAgIHVpbnQzMl90IHZTdHJpZGUgPSBhbGlnbih2aWV3LmNyb3AoKS5oZWlnaHQsIDIpOworCisgICAgICAgIHN3aXRjaCAobGF5b3V0LnR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOgorICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1UeXBlID0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfWVVWOworICAgICAgICAgICAgICAgIGlmIChsYXlvdXQubnVtUGxhbmVzICE9IDMpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogJWQgcGxhbmVzIGZvciBZVVYgbGF5b3V0IiwgbGF5b3V0Lm51bVBsYW5lcyk7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxheW91dC5wbGFuZXNbMF0uY2hhbm5lbCAhPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9ZCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzFdLmNoYW5uZWwgIT0gQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMl0uY2hhbm5lbCAhPSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1swXS5jb2xTYW1wbGluZyAhPSAxCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzBdLnJvd1NhbXBsaW5nICE9IDEKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMV0uY29sU2FtcGxpbmcgIT0gMgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5b3V0LnBsYW5lc1sxXS5yb3dTYW1wbGluZyAhPSAyCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBsYXlvdXQucGxhbmVzWzJdLmNvbFNhbXBsaW5nICE9IDIKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGxheW91dC5wbGFuZXNbMl0ucm93U2FtcGxpbmcgIT0gMikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiBub3QgWVVWNDIwIGZvciBZVVYgbGF5b3V0Iik7CisgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoIChtQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghY29weSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRyeSB0byBtYXAgZGlyZWN0bHkuIGNoZWNrIGlmIHRoZSBwbGFuZXMgYXJlIG5lYXIgb25lIGFub3RoZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICptaW5QdHIgPSBtVmlldy5kYXRhKClbMF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqbWF4UHRyID0gbVZpZXcuZGF0YSgpWzBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcGxhbmVTaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGF5b3V0Lm51bVBsYW5lczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyUGxhbmVJbmZvICZwbGFuZSA9IGxheW91dC5wbGFuZXNbaV07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgbWluT2Zmc2V0ID0gcGxhbmUubWluT2Zmc2V0KG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgbWF4T2Zmc2V0ID0gcGxhbmUubWF4T2Zmc2V0KG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW5QdHIgPiBtVmlldy5kYXRhKClbaV0gKyBtaW5PZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pblB0ciA9IG1WaWV3LmRhdGEoKVtpXSArIG1pbk9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobWF4UHRyIDwgbVZpZXcuZGF0YSgpW2ldICsgbWF4T2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhQdHIgPSBtVmlldy5kYXRhKClbaV0gKyBtYXhPZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhbmVTaXplICs9IHN0ZDo6YWJzKHBsYW5lLnJvd0luYykgKiBhbGlnbihtSGVpZ2h0LCA2NCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIHBsYW5lLnJvd1NhbXBsaW5nIC8gcGxhbmUuY29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGRpdlVwKG1BbGxvY2F0ZWREZXB0aCwgOHUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobWF4UHRyIC0gbWluUHRyICsgMSkgPD0gcGxhbmVTaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiB0aGlzIGlzIHJpc2t5IGFzIHJlYWRpbmcvd3JpdGluZyBkYXRhIG91dCBvZiBib3VuZCByZXN1bHRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICBpbiBhbiB1bmRlZmluZWQgYmVoYXZpb3IsIGJ1dCBncmFsbG9jIGRvZXMgYXNzdW1lIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgIGNvbnRpZ3VvdXMgbWFwcGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGF5b3V0Lm51bVBsYW5lczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBsYW5lSW5mbyAmcGxhbmUgPSBsYXlvdXQucGxhbmVzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW2ldLm1PZmZzZXQgPSBtVmlldy5kYXRhKClbaV0gLSBtaW5QdHI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbaV0ubUNvbEluYyA9IHBsYW5lLmNvbEluYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVtpXS5tUm93SW5jID0gcGxhbmUucm93SW5jOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW2ldLm1Ib3JpelN1YnNhbXBsaW5nID0gcGxhbmUuY29sU2FtcGxpbmc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbaV0ubVZlcnRTdWJzYW1wbGluZyA9IHBsYW5lLnJvd1NhbXBsaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1XcmFwcGVkID0gbmV3IEFCdWZmZXIoY29uc3RfY2FzdDx1aW50OF90ICo+KG1pblB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4UHRyIC0gbWluUHRyICsgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIFtbZmFsbHRocm91Z2hdXTsKKworICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXI6CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubU9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUNvbEluYyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubVJvd0luYyA9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5ZXS5tSG9yaXpTdWJzYW1wbGluZyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubVZlcnRTdWJzYW1wbGluZyA9IDE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tT2Zmc2V0ID0gc3RyaWRlICogdlN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tQ29sSW5jID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tUm93SW5jID0gc3RyaWRlIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tT2Zmc2V0ID0gc3RyaWRlICogdlN0cmlkZSAqIDUgLyA0OworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1Db2xJbmMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1Sb3dJbmMgPSBzdHJpZGUgLyAyOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlZdLm1Ib3JpelN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tVmVydFN1YnNhbXBsaW5nID0gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOgorICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1PZmZzZXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Db2xJbmMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1Sb3dJbmMgPSBzdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+WV0ubUhvcml6U3Vic2FtcGxpbmcgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFJbWFnZS0+bVBsYW5lW21lZGlhSW1hZ2UtPlldLm1WZXJ0U3Vic2FtcGxpbmcgPSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubU9mZnNldCA9IHN0cmlkZSAqIHZTdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubUNvbEluYyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubVJvd0luYyA9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5VXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+VV0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tT2Zmc2V0ID0gc3RyaWRlICogdlN0cmlkZSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubUNvbEluYyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVJvd0luYyA9IHN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSW1hZ2UtPm1QbGFuZVttZWRpYUltYWdlLT5WXS5tSG9yaXpTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tUGxhbmVbbWVkaWFJbWFnZS0+Vl0ubVZlcnRTdWJzYW1wbGluZyA9IDI7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogaW5jb21wYWN0aWJsZSBjb2xvciBmb3JtYXQgKCVkKSBmb3IgWVVWIGxheW91dCIsIG1Db2xvckZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWQToKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1lVVkE7CisgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhbiBTREsgWVVWQSBmb3JtYXQKKyAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiBpbmNvbXBhY3RpYmxlIGNvbG9yIGZvcm1hdCAoJWQpIGZvciBZVVZBIGxheW91dCIsIG1Db2xvckZvcm1hdCk7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICBjYXNlIEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjoKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1JHQjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKG1Db2xvckZvcm1hdCkgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPIG1lZGlhIGltYWdlCisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UkdCRmxleGlibGU6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRCR1I4ODg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRiaXRSR0I4ODg6CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXI6IGluY29tcGFjdGlibGUgY29sb3IgZm9ybWF0ICglZCkgZm9yIFJHQiBsYXlvdXQiLCBtQ29sb3JGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGxheW91dC5udW1QbGFuZXMgIT0gMykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiQ29udmVydGVyOiAlZCBwbGFuZXMgZm9yIFJHQiBsYXlvdXQiLCBsYXlvdXQubnVtUGxhbmVzKTsKKyAgICAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJQbGFuYXJMYXlvdXQ6OlRZUEVfUkdCQToKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1JHQkE7CisgICAgICAgICAgICAgICAgc3dpdGNoIChtQ29sb3JGb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBtZWRpYSBpbWFnZQorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFJHQkFGbGV4aWJsZToKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEFCR1I4ODg4OgorICAgICAgICAgICAgICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QVJHQjg4ODg6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODoKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkluY29tcGFjdGlibGUgY29sb3IgZm9ybWF0ICglZCkgZm9yIFJHQkEgbGF5b3V0IiwgbUNvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChsYXlvdXQubnVtUGxhbmVzICE9IDQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkNvbnZlcnRlcjogJWQgcGxhbmVzIGZvciBSR0JBIGxheW91dCIsIGxheW91dC5udW1QbGFuZXMpOworICAgICAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBtZWRpYUltYWdlLT5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1VOS05PV047CisgICAgICAgICAgICAgICAgQUxPR0QoIlVua25vd24gbGF5b3V0Iik7CisgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbWVkaWFJbWFnZS0+bU51bVBsYW5lcyA9IGxheW91dC5udW1QbGFuZXM7CisgICAgICAgIG1lZGlhSW1hZ2UtPm1XaWR0aCA9IHZpZXcuY3JvcCgpLndpZHRoOworICAgICAgICBtZWRpYUltYWdlLT5tSGVpZ2h0ID0gdmlldy5jcm9wKCkuaGVpZ2h0OworICAgICAgICBtZWRpYUltYWdlLT5tQml0RGVwdGggPSBiaXREZXB0aDsKKyAgICAgICAgbWVkaWFJbWFnZS0+bUJpdERlcHRoQWxsb2NhdGVkID0gbUFsbG9jYXRlZERlcHRoOworCisgICAgICAgIHVpbnQzMl90IGJ1ZmZlclNpemUgPSAwOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbGF5b3V0Lm51bVBsYW5lczsgKytpKSB7CisgICAgICAgICAgICBjb25zdCBDMlBsYW5lSW5mbyAmcGxhbmUgPSBsYXlvdXQucGxhbmVzW2ldOworICAgICAgICAgICAgaWYgKHBsYW5lLmFsbG9jYXRlZERlcHRoIDwgcGxhbmUuYml0RGVwdGgKKyAgICAgICAgICAgICAgICAgICAgfHwgcGxhbmUucmlnaHRTaGlmdCAhPSBwbGFuZS5hbGxvY2F0ZWREZXB0aCAtIHBsYW5lLmJpdERlcHRoKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoInJpZ2h0U2hpZnQgdmFsdWUgb2YgJXUgdW5zdXBwb3J0ZWQiLCBwbGFuZS5yaWdodFNoaWZ0KTsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwbGFuZS5hbGxvY2F0ZWREZXB0aCA+IDggJiYgcGxhbmUuZW5kaWFubmVzcyAhPSBDMlBsYW5lSW5mbzo6TkFUSVZFKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImVuZGlhbm5lc3MgdmFsdWUgb2YgJXUgdW5zdXBwb3J0ZWQiLCBwbGFuZS5lbmRpYW5uZXNzKTsKKyAgICAgICAgICAgICAgICBtSW5pdENoZWNrID0gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwbGFuZS5hbGxvY2F0ZWREZXB0aCAhPSBtQWxsb2NhdGVkRGVwdGggfHwgcGxhbmUuYml0RGVwdGggIT0gYml0RGVwdGgpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiZGlmZmVyZW50IGFsbG9jYXRlZERlcHRoL2JpdERlcHRoIHBlciBwbGFuZSB1bnN1cHBvcnRlZCIpOworICAgICAgICAgICAgICAgIG1Jbml0Q2hlY2sgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnVmZmVyU2l6ZSArPSBzdHJpZGUgKiB2U3RyaWRlCisgICAgICAgICAgICAgICAgICAgIC8gcGxhbmUucm93U2FtcGxpbmcgLyBwbGFuZS5jb2xTYW1wbGluZzsKKyAgICAgICAgfQorCisgICAgICAgIG1CYWNrQnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7CisgICAgICAgIG1Jbml0Q2hlY2sgPSBPSzsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdCB7IHJldHVybiBtSW5pdENoZWNrOyB9CisKKyAgICB1aW50MzJfdCBiYWNrQnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1CYWNrQnVmZmVyU2l6ZTsgfQorCisgICAgLyoqCisgICAgICogV3JhcCBDMkdyYXBoaWNWaWV3IHVzaW5nIGEgTWVkaWFJbWFnZTIuIE5vdGUgdGhhdCBpZiBub3Qgd3JhcHBlZCwgdGhlIGNvbnRlbnQgaXMgbm90IG1hcHBlZAorICAgICAqIGluIHRoaXMgZnVuY3Rpb24gLS0tIHRoZSBjYWxsZXIgc2hvdWxkIHVzZSBDb3B5R3JhcGhpY1ZpZXcyTWVkaWFJbWFnZSgpIGZ1bmN0aW9uIHRvIGNvcHkgdGhlCisgICAgICogZGF0YSBpbnRvIGEgYmFja2luZyBidWZmZXIgZXhwbGljaXRseS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gbWVkaWEgYnVmZmVyLiBUaGlzIGlzIG51bGwgaWYgd3JhcHBpbmcgZmFpbGVkLgorICAgICAqLworICAgIHNwPEFCdWZmZXI+IHdyYXAoKSBjb25zdCB7CisgICAgICAgIGlmIChtQmFja0J1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgYm9vbCBzZXRCYWNrQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZiYWNrQnVmZmVyKSB7CisgICAgICAgIGlmIChiYWNrQnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYmFja0J1ZmZlci0+Y2FwYWNpdHkoKSA8IG1CYWNrQnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJhY2tCdWZmZXItPnNldFJhbmdlKDAsIG1CYWNrQnVmZmVyU2l6ZSk7CisgICAgICAgIG1CYWNrQnVmZmVyID0gYmFja0J1ZmZlcjsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29weSBDMkdyYXBoaWNWaWV3IHRvIE1lZGlhSW1hZ2UyLgorICAgICAqLworICAgIHN0YXR1c190IGNvcHlUb01lZGlhSW1hZ2UoKSB7CisgICAgICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gSW1hZ2VDb3B5KG1CYWNrQnVmZmVyLT5iYXNlKCksIGdldE1lZGlhSW1hZ2UoKSwgbVZpZXcpOworICAgIH0KKworICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZpbWFnZURhdGEoKSBjb25zdCB7IHJldHVybiBtTWVkaWFJbWFnZTsgfQorCitwcml2YXRlOgorICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisKKyAgICBjb25zdCBDMkdyYXBoaWNWaWV3IG1WaWV3OworICAgIHVpbnQzMl90IG1XaWR0aDsKKyAgICB1aW50MzJfdCBtSGVpZ2h0OworICAgIGludDMyX3QgbUNvbG9yRm9ybWF0OyAgLy8vPCBTREsgY29sb3IgZm9ybWF0IGZvciBNZWRpYUltYWdlCisgICAgc3A8QUJ1ZmZlcj4gbVdyYXBwZWQ7ICAvLy88IHdyYXBwZWQgYnVmZmVyIChpZiB3ZSBjYW4gbWFwIEMyQnVmZmVyIHRvIGFuIEFCdWZmZXIpCisgICAgdWludDMyX3QgbUFsbG9jYXRlZERlcHRoOworICAgIHVpbnQzMl90IG1CYWNrQnVmZmVyU2l6ZTsKKyAgICBzcDxBQnVmZmVyPiBtTWVkaWFJbWFnZTsKKyAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IG1BbGxvYzsKKworICAgIHNwPEFCdWZmZXI+IG1CYWNrQnVmZmVyOyAgICAvLy88IGJhY2tpbmcgYnVmZmVyIGlmIHdlIGhhdmUgdG8gY29weSBDMkJ1ZmZlciA8PT4gQUJ1ZmZlcgorCisgICAgTWVkaWFJbWFnZTIgKmdldE1lZGlhSW1hZ2UoKSB7CisgICAgICAgIHJldHVybiAoTWVkaWFJbWFnZTIgKiltTWVkaWFJbWFnZS0+YmFzZSgpOworICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBHcmFwaGljQmxvY2tCdWZmZXIKKworLy8gc3RhdGljCitzcDxHcmFwaGljQmxvY2tCdWZmZXI+IEdyYXBoaWNCbG9ja0J1ZmZlcjo6QWxsb2NhdGUoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICZibG9jaywKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBhbGxvYykgeworICAgIEMyR3JhcGhpY1ZpZXcgdmlldyhibG9jay0+bWFwKCkuZ2V0KCkpOworICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoIkMyR3JhcGhpY0Jsb2NrOjptYXAgZmFpbGVkOiAlZCIsIHZpZXcuZXJyb3IoKSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGludDMyX3QgY29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKyAgICAodm9pZClmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KTsKKworICAgIEdyYXBoaWNWaWV3Mk1lZGlhSW1hZ2VDb252ZXJ0ZXIgY29udmVydGVyKHZpZXcsIGNvbG9yRm9ybWF0LCBmYWxzZSAvKiBjb3B5ICovKTsKKyAgICBpZiAoY29udmVydGVyLmluaXRDaGVjaygpICE9IE9LKSB7CisgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXIgaW5pdCBmYWlsZWQ6ICVkIiwgY29udmVydGVyLmluaXRDaGVjaygpKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGJvb2wgd3JhcHBlZCA9IHRydWU7CisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gY29udmVydGVyLndyYXAoKTsKKyAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgYnVmZmVyID0gYWxsb2MoY29udmVydGVyLmJhY2tCdWZmZXJTaXplKCkpOworICAgICAgICBpZiAoIWNvbnZlcnRlci5zZXRCYWNrQnVmZmVyKGJ1ZmZlcikpIHsKKyAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXIgZmFpbGVkIHRvIHNldCBiYWNrIGJ1ZmZlciIpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgd3JhcHBlZCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gbmV3IEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgIGJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6bW92ZSh2aWV3KSwKKyAgICAgICAgICAgIGJsb2NrLAorICAgICAgICAgICAgY29udmVydGVyLmltYWdlRGF0YSgpLAorICAgICAgICAgICAgd3JhcHBlZCk7Cit9CisKK0dyYXBoaWNCbG9ja0J1ZmZlcjo6R3JhcGhpY0Jsb2NrQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgQzJHcmFwaGljVmlldyAmJnZpZXcsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gJmJsb2NrLAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhLAorICAgICAgICBib29sIHdyYXBwZWQpCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBidWZmZXIpLAorICAgICAgbVZpZXcodmlldyksCisgICAgICBtQmxvY2soYmxvY2spLAorICAgICAgbVdyYXBwZWQod3JhcHBlZCkgeworICAgIHNldEltYWdlRGF0YShpbWFnZURhdGEpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IEdyYXBoaWNCbG9ja0J1ZmZlcjo6YXNDMkJ1ZmZlcigpIHsKKyAgICB1aW50MzJfdCB3aWR0aCA9IG1WaWV3LndpZHRoKCk7CisgICAgdWludDMyX3QgaGVpZ2h0ID0gbVZpZXcuaGVpZ2h0KCk7CisgICAgaWYgKCFtV3JhcHBlZCkgeworICAgICAgICAodm9pZClJbWFnZUNvcHkobVZpZXcsIGJhc2UoKSwgaW1hZ2VEYXRhKCkpOworICAgIH0KKyAgICByZXR1cm4gQzJCdWZmZXI6OkNyZWF0ZUdyYXBoaWNCdWZmZXIoCisgICAgICAgICAgICBtQmxvY2stPnNoYXJlKEMyUmVjdCh3aWR0aCwgaGVpZ2h0KSwgQzJGZW5jZSgpKSk7Cit9CisKKy8vIEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcgorR3JhcGhpY01ldGFkYXRhQnVmZmVyOjpHcmFwaGljTWV0YWRhdGFCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvYykKKyAgICA6IENvZGVjMkJ1ZmZlcihmb3JtYXQsIG5ldyBBQnVmZmVyKHNpemVvZihWaWRlb05hdGl2ZU1ldGFkYXRhKSkpLAorICAgICAgbUFsbG9jKGFsbG9jKSB7CisgICAgKChWaWRlb05hdGl2ZU1ldGFkYXRhICopYmFzZSgpKS0+cEJ1ZmZlciA9IG51bGxwdHI7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gR3JhcGhpY01ldGFkYXRhQnVmZmVyOjphc0MyQnVmZmVyKCkgeworI2lmbmRlZiBfX0xQNjRfXworICAgIFZpZGVvTmF0aXZlTWV0YWRhdGEgKm1ldGEgPSAoVmlkZW9OYXRpdmVNZXRhZGF0YSAqKWJhc2UoKTsKKyAgICBBTmF0aXZlV2luZG93QnVmZmVyICpidWZmZXIgPSAoQU5hdGl2ZVdpbmRvd0J1ZmZlciAqKW1ldGEtPnBCdWZmZXI7CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJWaWRlb05hdGl2ZU1ldGFkYXRhIGNvbnRhaW5zIG51bGwgYnVmZmVyIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIEFMT0dWKCJWaWRlb05hdGl2ZU1ldGFkYXRhOiAlZHglZCIsIGJ1ZmZlci0+d2lkdGgsIGJ1ZmZlci0+aGVpZ2h0KTsKKyAgICBDMkhhbmRsZSAqaGFuZGxlID0gV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgICAgICBidWZmZXItPmhhbmRsZSwKKyAgICAgICAgICAgIGJ1ZmZlci0+d2lkdGgsCisgICAgICAgICAgICBidWZmZXItPmhlaWdodCwKKyAgICAgICAgICAgIGJ1ZmZlci0+Zm9ybWF0LAorICAgICAgICAgICAgYnVmZmVyLT51c2FnZSwKKyAgICAgICAgICAgIGJ1ZmZlci0+c3RyaWRlKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGhhbmRsZSwgJmFsbG9jKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gd3JhcCBWaWRlb05hdGl2ZU1ldGFkYXRhIGludG8gQzJHcmFwaGljQWxsb2NhdGlvbiIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jKTsKKworICAgIG1ldGEtPnBCdWZmZXIgPSAwOworICAgIC8vIFRPRE86IHdyYXAgdGhpcyBpbiBDMkZlbmNlIHNvIHRoYXQgdGhlIGNvbXBvbmVudCBjYW4gd2FpdCB3aGVuIGl0CisgICAgLy8gICAgICAgYWN0dWFsbHkgc3RhcnRzIHByb2Nlc3NpbmcuCisgICAgaWYgKG1ldGEtPm5GZW5jZUZkID49IDApIHsKKyAgICAgICAgc3A8RmVuY2U+IGZlbmNlKG5ldyBGZW5jZShtZXRhLT5uRmVuY2VGZCkpOworICAgICAgICBmZW5jZS0+d2FpdEZvcmV2ZXIoTE9HX1RBRyk7CisgICAgfQorICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlR3JhcGhpY0J1ZmZlcigKKyAgICAgICAgICAgIGJsb2NrLT5zaGFyZShDMlJlY3QoYnVmZmVyLT53aWR0aCwgYnVmZmVyLT5oZWlnaHQpLCBDMkZlbmNlKCkpKTsKKyNlbHNlCisgICAgQUxPR0UoIkdyYXBoaWNNZXRhZGF0YUJ1ZmZlciBkb2VzIG5vdCB3b3JrIG9uIDY0LWJpdCBhcmNoIik7CisgICAgcmV0dXJuIG51bGxwdHI7CisjZW5kaWYKK30KKworLy8gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIKKworLy8gc3RhdGljCitzcDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcj4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OkFsbG9jYXRlKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IGFsbG9jKSB7CisgICAgaWYgKCFidWZmZXIKKyAgICAgICAgICAgIHx8IGJ1ZmZlci0+ZGF0YSgpLnR5cGUoKSAhPSBDMkJ1ZmZlckRhdGE6OkdSQVBISUMKKyAgICAgICAgICAgIHx8IGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKS5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgQUxPR0QoIkMyQnVmZmVyIHByZWNvbmQgZmFpbCIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IHZpZXcoc3RkOjptYWtlX3VuaXF1ZTxjb25zdCBDMkdyYXBoaWNWaWV3PigKKyAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKVswXS5tYXAoKS5nZXQoKSkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMkdyYXBoaWNWaWV3PiBob2xkZXI7CisKKyAgICBpbnQzMl90IGNvbG9yRm9ybWF0ID0gQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGU7CisgICAgKHZvaWQpZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCk7CisKKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcigqdmlldywgY29sb3JGb3JtYXQsIGZhbHNlIC8qIGNvcHkgKi8pOworICAgIGlmIChjb252ZXJ0ZXIuaW5pdENoZWNrKCkgIT0gT0spIHsKKyAgICAgICAgQUxPR0QoIkNvbnZlcnRlciBpbml0IGZhaWxlZDogJWQiLCBjb252ZXJ0ZXIuaW5pdENoZWNrKCkpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgYm9vbCB3cmFwcGVkID0gdHJ1ZTsKKyAgICBzcDxBQnVmZmVyPiBhQnVmZmVyID0gY29udmVydGVyLndyYXAoKTsKKyAgICBpZiAoYUJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIGFCdWZmZXIgPSBhbGxvYyhjb252ZXJ0ZXIuYmFja0J1ZmZlclNpemUoKSk7CisgICAgICAgIGlmICghY29udmVydGVyLnNldEJhY2tCdWZmZXIoYUJ1ZmZlcikpIHsKKyAgICAgICAgICAgIEFMT0dEKCJDb252ZXJ0ZXIgZmFpbGVkIHRvIHNldCBiYWNrIGJ1ZmZlciIpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgd3JhcHBlZCA9IGZhbHNlOworICAgICAgICBjb252ZXJ0ZXIuY29weVRvTWVkaWFJbWFnZSgpOworICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRoZSB2aWV3LgorICAgICAgICBob2xkZXIgPSBzdGQ6Om1vdmUodmlldyk7CisgICAgfQorICAgIHJldHVybiBuZXcgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIoCisgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICBhQnVmZmVyLAorICAgICAgICAgICAgc3RkOjptb3ZlKHZpZXcpLAorICAgICAgICAgICAgYnVmZmVyLAorICAgICAgICAgICAgY29udmVydGVyLmltYWdlRGF0YSgpLAorICAgICAgICAgICAgd3JhcHBlZCk7Cit9CisKKy8vIHN0YXRpYworc3A8Q29uc3RHcmFwaGljQmxvY2tCdWZmZXI+IENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpBbGxvY2F0ZUVtcHR5KAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzcDxBQnVmZmVyPihzaXplX3QpPiBhbGxvYykgeworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKKyAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkKKyAgICAgICAgICAgIHx8ICFmb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKKyAgICAgICAgQUxPR0QoImZvcm1hdCBoYWQgbm8gd2lkdGggLyBoZWlnaHQiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIC8vIE5PVEU6IHdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgWVVWNDIwIGZvcm1hdHMgZm9yIGJ5dGUtYnVmZmVyIG1vZGUuCisgICAgc3A8QUJ1ZmZlcj4gYUJ1ZmZlcihhbGxvYyhhbGlnbih3aWR0aCwgMTYpICogYWxpZ24oaGVpZ2h0LCAxNikgKiAzIC8gMikpOworICAgIHJldHVybiBuZXcgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIoCisgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICBhQnVmZmVyLAorICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgZmFsc2UpOworfQorCitDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Q29uc3RHcmFwaGljQmxvY2tCdWZmZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYUJ1ZmZlciwKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+ICYmdmlldywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhLAorICAgICAgICBib29sIHdyYXBwZWQpCisgICAgOiBDb2RlYzJCdWZmZXIoZm9ybWF0LCBhQnVmZmVyKSwKKyAgICAgIG1WaWV3KHN0ZDo6bW92ZSh2aWV3KSksCisgICAgICBtQnVmZmVyUmVmKGJ1ZmZlciksCisgICAgICBtV3JhcHBlZCh3cmFwcGVkKSB7CisgICAgc2V0SW1hZ2VEYXRhKGltYWdlRGF0YSk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmFzQzJCdWZmZXIoKSB7CisgICAgbVZpZXcucmVzZXQoKTsKKyAgICByZXR1cm4gc3RkOjptb3ZlKG1CdWZmZXJSZWYpOworfQorCitib29sIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3QgeworICAgIGlmIChtV3JhcHBlZCB8fCBtQnVmZmVyUmVmKSB7CisgICAgICAgIEFMT0dEKCJDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcjo6Y2FuQ29weTogJXN3cmFwcGVkIDsgYnVmZmVyIHJlZiAlcyIsCisgICAgICAgICAgICAgICAgbVdyYXBwZWQgPyAiIiA6ICJub3QgIiwgbUJ1ZmZlclJlZiA/ICJleGlzdHMiIDogImRvZXNuJ3QgZXhpc3QiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIWJ1ZmZlcikgeworICAgICAgICAvLyBOb3RoaW5nIHRvIGNvcHksIHNvIHdlIGNhbiBjb3B5IGJ5IGRvaW5nIG5vdGhpbmcuCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoYnVmZmVyLT5kYXRhKCkudHlwZSgpICE9IEMyQnVmZmVyRGF0YTo6R1JBUEhJQykgeworICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHk6IGJ1ZmZlciBwcmVjb25kaXRpb24gdW5zYXRpc2ZpZWQiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAoYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLnNpemUoKSAhPSAxdSkgeworICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHk6IHRvbyBtYW55IGJsb2NrcyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50MzJfdCBjb2xvckZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOworICAgIC8vIEZJWE1FOiBmb3JtYXQoKSBpcyBub3QgY29uc3QsIGJ1dCB3ZSBjYW5ub3QgY2hhbmdlIGl0LCBzbyBkbyBhIGNvbnN0IGNhc3QgaGVyZQorICAgIGNvbnN0X2Nhc3Q8Q29uc3RHcmFwaGljQmxvY2tCdWZmZXIgKj4odGhpcyktPmZvcm1hdCgpLT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCk7CisKKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcigKKyAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKVswXS5tYXAoKS5nZXQoKSwgY29sb3JGb3JtYXQsIHRydWUgLyogY29weSAqLyk7CisgICAgaWYgKGNvbnZlcnRlci5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNhbkNvcHk6IGNvbnZlcnRlciBpbml0IGZhaWxlZDogJWQiLCBjb252ZXJ0ZXIuaW5pdENoZWNrKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChjb252ZXJ0ZXIuYmFja0J1ZmZlclNpemUoKSA+IGNhcGFjaXR5KCkpIHsKKyAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjYW5Db3B5OiBpbnN1ZmZpY2llbnQgY2FwYWNpdHk6IHJlcSAldSBoYXMgJXp1IiwKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuYmFja0J1ZmZlclNpemUoKSwgY2FwYWNpdHkoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgaWYgKCFidWZmZXIgfHwgYnVmZmVyLT5kYXRhKCkuZ3JhcGhpY0Jsb2NrcygpLnNpemUoKSA9PSAwKSB7CisgICAgICAgIHNldFJhbmdlKDAsIDApOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaW50MzJfdCBjb2xvckZvcm1hdCA9IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOworICAgIGZvcm1hdCgpLT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZjb2xvckZvcm1hdCk7CisKKyAgICBHcmFwaGljVmlldzJNZWRpYUltYWdlQ29udmVydGVyIGNvbnZlcnRlcigKKyAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpLmdyYXBoaWNCbG9ja3MoKVswXS5tYXAoKS5nZXQoKSwgY29sb3JGb3JtYXQsIHRydWUgLyogY29weSAqLyk7CisgICAgaWYgKGNvbnZlcnRlci5pbml0Q2hlY2soKSAhPSBPSykgeworICAgICAgICBBTE9HRCgiQ29uc3RHcmFwaGljQmxvY2tCdWZmZXI6OmNvcHk6IGNvbnZlcnRlciBpbml0IGZhaWxlZDogJWQiLCBjb252ZXJ0ZXIuaW5pdENoZWNrKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHNwPEFCdWZmZXI+IGFCdWZmZXIgPSBuZXcgQUJ1ZmZlcihiYXNlKCksIGNhcGFjaXR5KCkpOworICAgIGlmICghY29udmVydGVyLnNldEJhY2tCdWZmZXIoYUJ1ZmZlcikpIHsKKyAgICAgICAgQUxPR0QoIkNvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyOjpjb3B5OiBzZXQgYmFjayBidWZmZXIgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc2V0UmFuZ2UoMCwgYUJ1ZmZlci0+c2l6ZSgpKTsgIC8vIGFsaWduIHNpemUgaW5mbworICAgIGNvbnZlcnRlci5jb3B5VG9NZWRpYUltYWdlKCk7CisgICAgc2V0SW1hZ2VEYXRhKGNvbnZlcnRlci5pbWFnZURhdGEoKSk7CisgICAgbUJ1ZmZlclJlZiA9IGJ1ZmZlcjsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIKKworRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OkVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyKAorICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaywKKyAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4gJm1lbW9yeSwKKyAgICAgICAgaW50MzJfdCBoZWFwU2VxTnVtKQorICAgIDogQ29kZWMyQnVmZmVyKGZvcm1hdCwgbmV3IEFCdWZmZXIobWVtb3J5LT5wb2ludGVyKCksIG1lbW9yeS0+c2l6ZSgpKSksCisgICAgICBtQmxvY2soYmxvY2spLAorICAgICAgbU1lbW9yeShtZW1vcnkpLAorICAgICAgbUhlYXBTZXFOdW0oaGVhcFNlcU51bSkgeworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyOjphc0MyQnVmZmVyKCkgeworICAgIHJldHVybiBDMkJ1ZmZlcjo6Q3JlYXRlTGluZWFyQnVmZmVyKG1CbG9jay0+c2hhcmUob2Zmc2V0KCksIHNpemUoKSwgQzJGZW5jZSgpKSk7Cit9CisKK3ZvaWQgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OmZpbGxTb3VyY2VCdWZmZXIoCisgICAgICAgIElDcnlwdG86OlNvdXJjZUJ1ZmZlciAqc291cmNlKSB7CisgICAgc291cmNlLT5tU2hhcmVkTWVtb3J5ID0gbU1lbW9yeTsKKyAgICBzb3VyY2UtPm1IZWFwU2VxTnVtID0gbUhlYXBTZXFOdW07Cit9CisKK3ZvaWQgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXI6OmZpbGxTb3VyY2VCdWZmZXIoCisgICAgICAgIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U2hhcmVkQnVmZmVyICpzb3VyY2UpIHsKKyAgICBzc2l6ZV90IG9mZnNldDsKKyAgICBzaXplX3Qgc2l6ZTsKKworICAgIG1IaWRsTWVtb3J5ID0gaGFyZHdhcmU6OmZyb21IZWFwKG1NZW1vcnktPmdldE1lbW9yeSgmb2Zmc2V0LCAmc2l6ZSkpOworICAgIHNvdXJjZS0+aGVhcEJhc2UgPSAqbUhpZGxNZW1vcnk7CisgICAgc291cmNlLT5vZmZzZXQgPSBvZmZzZXQ7CisgICAgc291cmNlLT5zaXplID0gc2l6ZTsKK30KKworYm9vbCBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6Y29weURlY3J5cHRlZENvbnRlbnQoCisgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+ICZkZWNyeXB0ZWQsIHNpemVfdCBsZW5ndGgpIHsKKyAgICBDMldyaXRlVmlldyB2aWV3ID0gbUJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICBpZiAodmlldy5lcnJvcigpICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHZpZXcuc2l6ZSgpIDwgbGVuZ3RoKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbWVtY3B5KHZpZXcuZGF0YSgpLCBkZWNyeXB0ZWQtPnBvaW50ZXIoKSwgbGVuZ3RoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6Y29weURlY3J5cHRlZENvbnRlbnRGcm9tTWVtb3J5KHNpemVfdCBsZW5ndGgpIHsKKyAgICByZXR1cm4gY29weURlY3J5cHRlZENvbnRlbnQobU1lbW9yeSwgbGVuZ3RoKTsKK30KKworbmF0aXZlX2hhbmRsZV90ICpFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcjo6aGFuZGxlKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQmxvY2stPmhhbmRsZSgpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Zjg3MTAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkJ1ZmZlci5oCkBAIC0wLDAgKzEsNDA2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDT0RFQzJfQlVGRkVSX0hfCisKKyNkZWZpbmUgQ09ERUMyX0JVRkZFUl9IXworCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lDcnlwdG8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIENvcGllcyBhIGdyYXBoaWMgdmlldyBpbnRvIGEgbWVkaWEgaW1hZ2UuCisgKgorICogXHBhcmFtIGltZ0Jhc2UgYmFzZSBvZiBNZWRpYUltYWdlCisgKiBccGFyYW0gaW1nIE1lZGlhSW1hZ2UgZGF0YQorICogXHBhcmFtIHZpZXcgZ3JhcGhpYyB2aWV3CisgKgorICogXHJldHVybiBPSyBvbiBzdWNjZXNzCisgKi8KK3N0YXR1c190IEltYWdlQ29weSh1aW50OF90ICppbWdCYXNlLCBjb25zdCBNZWRpYUltYWdlMiAqaW1nLCBjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KTsKKworLyoqCisgKiBDb3BpZXMgYSBtZWRpYSBpbWFnZSBpbnRvIGEgZ3JhcGhpYyB2aWV3LgorICoKKyAqIFxwYXJhbSB2aWV3IGdyYXBoaWMgdmlldworICogXHBhcmFtIGltZ0Jhc2UgYmFzZSBvZiBNZWRpYUltYWdlCisgKiBccGFyYW0gaW1nIE1lZGlhSW1hZ2UgZGF0YQorICoKKyAqIFxyZXR1cm4gT0sgb24gc3VjY2VzcworICovCitzdGF0dXNfdCBJbWFnZUNvcHkoQzJHcmFwaGljVmlldyAmdmlldywgY29uc3QgdWludDhfdCAqaW1nQmFzZSwgY29uc3QgTWVkaWFJbWFnZTIgKmltZyk7CisKK2NsYXNzIENvZGVjMkJ1ZmZlciA6IHB1YmxpYyBNZWRpYUNvZGVjQnVmZmVyIHsKK3B1YmxpYzoKKyAgICB1c2luZyBNZWRpYUNvZGVjQnVmZmVyOjpNZWRpYUNvZGVjQnVmZmVyOworICAgIH5Db2RlYzJCdWZmZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBccmV0dXJuICBDMkJ1ZmZlciBvYmplY3QgcmVwcmVzZW50cyB0aGlzIGJ1ZmZlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpID0gMDsKKworICAgIC8qKgorICAgICAqIFRlc3QgaWYgd2UgY2FuIGNvcHkgdGhlIGNvbnRlbnQgb2YgfGJ1ZmZlcnwgaW50byB0aGlzIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGJ1ZmZlciAgQzJCdWZmZXIgb2JqZWN0IHRvIGNvcHkuCisgICAgICogXHJldHVybiAgdHJ1ZSAgICBpZiB0aGUgY29udGVudCBvZiBidWZmZXIgY2FuIGJlIGNvcGllZCBvdmVyIHRvIHRoaXMgYnVmZmVyCisgICAgICogICAgICAgICAgZmFsc2UgICBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIGNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCB7CisgICAgICAgICh2b2lkKWJ1ZmZlcjsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvcHkgdGhlIGNvbnRlbnQgb2YgfGJ1ZmZlcnwgaW50byB0aGlzIG9iamVjdC4gVGhpcyBtZXRob2QgYXNzdW1lcyB0aGF0CisgICAgICogY2FuQ29weSgpIGNoZWNrIGFscmVhZHkgcGFzc2VkLgorICAgICAqCisgICAgICogXHBhcmFtICAgYnVmZmVyICBDMkJ1ZmZlciBvYmplY3QgdG8gY29weS4KKyAgICAgKiBccmV0dXJuICB0cnVlICAgIGlmIHN1Y2Nlc3NmdWwKKyAgICAgKiAgICAgICAgICBmYWxzZSAgIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIGJvb2wgY29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIHsKKyAgICAgICAgKHZvaWQpYnVmZmVyOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gZ2V0SW1hZ2VEYXRhKCkgY29uc3QgeyByZXR1cm4gbUltYWdlRGF0YTsgfQorCitwcm90ZWN0ZWQ6CisgICAgLyoqCisgICAgICogY2FuQ29weSgpIGltcGxlbWVudGF0aW9uIGZvciBsaW5lYXIgYnVmZmVycy4KKyAgICAgKi8KKyAgICBib29sIGNhbkNvcHlMaW5lYXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIGNvcHkoKSBpbXBsZW1lbnRhdGlvbiBmb3IgbGluZWFyIGJ1ZmZlcnMuCisgICAgICovCisgICAgYm9vbCBjb3B5TGluZWFyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICAvKioKKyAgICAgKiBzZXRzIE1lZGlhSW1hZ2UgZGF0YSBmb3IgZmxleGlibGUgZ3JhcGhpYyBidWZmZXJzCisgICAgICovCisgICAgdm9pZCBzZXRJbWFnZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmltYWdlRGF0YSk7CisKKyAgICBzcDxBQnVmZmVyPiBtSW1hZ2VEYXRhOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIG9uIHRvcCBvZiBsb2NhbCBsaW5lYXIgYnVmZmVyLiBUaGlzIGNhbm5vdAorICogY3Jvc3MgcHJvY2VzcyBib3VuZGFyeSBzbyBhc0MyQnVmZmVyKCkgcmV0dXJucyBvbmx5IG51bGxwdHIuCisgKi8KK2NsYXNzIExvY2FsTGluZWFyQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgdXNpbmcgQ29kZWMyQnVmZmVyOjpDb2RlYzJCdWZmZXI7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZSB7IHJldHVybiBudWxscHRyOyB9CisgICAgYm9vbCBjYW5Db3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCBjb3B5KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcikgb3ZlcnJpZGU7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gdG8gYmUgdXNlZCBvbmx5IGFzIGEgZHVtbXkgd3JhcHBlciBhcm91bmQgYQorICogQzJCdWZmZXIgb2JqZWN0LgorICovCitjbGFzcyBEdW1teUNvbnRhaW5lckJ1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIER1bW15Q29udGFpbmVyQnVmZmVyKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIgPSBudWxscHRyKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworICAgIGJvb2wgY2FuQ29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIGNvbnN0IG92ZXJyaWRlOworICAgIGJvb2wgY29weShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+ICZidWZmZXIpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gbUJ1ZmZlclJlZjsKK307CisKKy8qKgorICogTWVkaWFDb2RlY0J1ZmZlciBpbXBsZW1lbnRhdGlvbiB3cmFwcyBhcm91bmQgQzJMaW5lYXJCbG9jay4KKyAqLworY2xhc3MgTGluZWFyQmxvY2tCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBMaW5lYXJCdWZmZXJCbG9jayB3cmFwcGluZyBhcm91bmQgQzJMaW5lYXJCbG9jayBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYmxvY2sgICBDMkxpbmVhckJsb2NrIG9iamVjdCB0byB3cmFwIGFyb3VuZC4KKyAgICAgKiBccmV0dXJuICAgICAgICAgIExpbmVhckJsb2NrQnVmZmVyIG9iamVjdCB3aXRoIHdyaXRhYmxlIG1hcHBpbmcuCisgICAgICogICAgICAgICAgICAgICAgICBudWxscHRyIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8TGluZWFyQmxvY2tCdWZmZXI+IEFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spOworCisgICAgdmlydHVhbCB+TGluZWFyQmxvY2tCdWZmZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZTsKKyAgICBib29sIGNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIGNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBMaW5lYXJCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgQzJXcml0ZVZpZXcgJiZ3cml0ZVZpZXcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gJmJsb2NrKTsKKyAgICBMaW5lYXJCbG9ja0J1ZmZlcigpID0gZGVsZXRlOworCisgICAgQzJXcml0ZVZpZXcgbVdyaXRlVmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbUJsb2NrOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIHdyYXBzIGFyb3VuZCBDMkNvbnN0TGluZWFyQmxvY2suCisgKi8KK2NsYXNzIENvbnN0TGluZWFyQmxvY2tCdWZmZXIgOiBwdWJsaWMgQ29kZWMyQnVmZmVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBBbGxvY2F0ZSBhIG5ldyBDb25zdExpbmVhckJsb2NrQnVmZmVyIHdyYXBwaW5nIGFyb3VuZCBDMkJ1ZmZlciBvYmplY3QuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgIG1hbmRhdG9yeSBidWZmZXIgZm9ybWF0IGZvciBNZWRpYUNvZGVjQnVmZmVyCisgICAgICogXHBhcmFtICAgYnVmZmVyICBsaW5lYXIgQzJCdWZmZXIgb2JqZWN0IHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgQ29uc3RMaW5lYXJCbG9ja0J1ZmZlciBvYmplY3Qgd2l0aCByZWFkYWJsZSBtYXBwaW5nLgorICAgICAqICAgICAgICAgICAgICAgICAgbnVsbHB0ciBpZiB1bnN1Y2Nlc3NmdWwuCisgICAgICovCisgICAgc3RhdGljIHNwPENvbnN0TGluZWFyQmxvY2tCdWZmZXI+IEFsbG9jYXRlKAorICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlcik7CisKKyAgICB2aXJ0dWFsIH5Db25zdExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWZhdWx0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgQ29uc3RMaW5lYXJCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgQzJSZWFkVmlldyAmJnJlYWRWaWV3LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKTsKKyAgICBDb25zdExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWxldGU7CisKKyAgICBDMlJlYWRWaWV3IG1SZWFkVmlldzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IG1CdWZmZXJSZWY7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gd3JhcHMgYXJvdW5kIEMyR3JhcGhpY0Jsb2NrLgorICoKKyAqIFRoaXMgb2JqZWN0IGV4cG9zZXMgdGhlIHVuZGVybHlpbmcgYml0cyB2aWEgYWNjZXNzb3IgQVBJcyBhbmQgImltYWdlLWRhdGEiCisgKiBtZXRhZGF0YSwgY3JlYXRlZCBhdXRvbWF0aWNhbGx5IGF0IGFsbG9jYXRpb24gdGltZS4KKyAqLworY2xhc3MgR3JhcGhpY0Jsb2NrQnVmZmVyIDogcHVibGljIENvZGVjMkJ1ZmZlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQWxsb2NhdGUgYSBuZXcgR3JhcGhpY0Jsb2NrQnVmZmVyIHdyYXBwaW5nIGFyb3VuZCBDMkdyYXBoaWNCbG9jayBvYmplY3QuCisgICAgICogSWYgfGJsb2NrfCBpcyBub3QgaW4gZ29vZCBjb2xvciBmb3JtYXRzLCBpdCBhbGxvY2F0ZXMgWVYxMiBsb2NhbCBidWZmZXIKKyAgICAgKiBhbmQgY29waWVzIHRoZSBjb250ZW50IG92ZXIgYXQgYXNDMkJ1ZmZlcigpLgorICAgICAqCisgICAgICogXHBhcmFtICAgZm9ybWF0ICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqIFxwYXJhbSAgIGJsb2NrICAgQzJHcmFwaGljQmxvY2sgb2JqZWN0IHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFxwYXJhbSAgIGFsbG9jICAgYSBmdW5jdGlvbiB0byBhbGxvY2F0ZSBiYWNraW5nIEFCdWZmZXIgaWYgbmVlZGVkLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgR3JhcGhpY0Jsb2NrQnVmZmVyIG9iamVjdCB3aXRoIHdyaXRhYmxlIG1hcHBpbmcuCisgICAgICogICAgICAgICAgICAgICAgICBudWxscHRyIGlmIHVuc3VjY2Vzc2Z1bC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8R3JhcGhpY0Jsb2NrQnVmZmVyPiBBbGxvY2F0ZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssCisgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNwPEFCdWZmZXI+KHNpemVfdCk+IGFsbG9jKTsKKworICAgIHZpcnR1YWwgfkdyYXBoaWNCbG9ja0J1ZmZlcigpID0gZGVmYXVsdDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIEMyR3JhcGhpY1ZpZXcgJiZ2aWV3LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2ssCisgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmaW1hZ2VEYXRhLAorICAgICAgICAgICAgYm9vbCB3cmFwcGVkKTsKKyAgICBHcmFwaGljQmxvY2tCdWZmZXIoKSA9IGRlbGV0ZTsKKworICAgIGlubGluZSBNZWRpYUltYWdlMiAqaW1hZ2VEYXRhKCkgeyByZXR1cm4gKE1lZGlhSW1hZ2UyICopbUltYWdlRGF0YS0+ZGF0YSgpOyB9CisKKyAgICBDMkdyYXBoaWNWaWV3IG1WaWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gbUJsb2NrOworICAgIGNvbnN0IGJvb2wgbVdyYXBwZWQ7Cit9OworCisvKioKKyAqIE1lZGlhQ29kZWNCdWZmZXIgaW1wbGVtZW50YXRpb24gd3JhcHMgYXJvdW5kIFZpZGVvTmF0aXZlTWV0YWRhdGEuCisgKi8KK2NsYXNzIEdyYXBoaWNNZXRhZGF0YUJ1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBHcmFwaGljTWV0YWRhdGFCdWZmZXIgd2l0aCBsb2NhbCBsaW5lYXIgYnVmZmVyIGZvcgorICAgICAqIFZpZGVvTmF0aXZlTWV0YWRhdGEuCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgICAgICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqLworICAgIEdyYXBoaWNNZXRhZGF0YUJ1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvYyk7CisgICAgdmlydHVhbCB+R3JhcGhpY01ldGFkYXRhQnVmZmVyKCkgPSBkZWZhdWx0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiBhc0MyQnVmZmVyKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgR3JhcGhpY01ldGFkYXRhQnVmZmVyKCkgPSBkZWxldGU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvYzsKK307CisKKy8qKgorICogTWVkaWFDb2RlY0J1ZmZlciBpbXBsZW1lbnRhdGlvbiB3cmFwcyBhcm91bmQgZ3JhcGhpYyBDMkJ1ZmZlciBvYmplY3QuCisgKgorICogVGhpcyBvYmplY3QgZXhwb3NlcyB0aGUgdW5kZXJseWluZyBiaXRzIHZpYSBhY2Nlc3NvciBBUElzIGFuZCAiaW1hZ2UtZGF0YSIKKyAqIG1ldGFkYXRhLCBjcmVhdGVkIGF1dG9tYXRpY2FsbHkgYXQgYWxsb2NhdGlvbiB0aW1lLgorICovCitjbGFzcyBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIEFsbG9jYXRlIGEgbmV3IENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyIHdyYXBwaW5nIGFyb3VuZCBDMkJ1ZmZlciBvYmplY3QuCisgICAgICogSWYgfGJ1ZmZlcnwgaXMgbm90IGluIGdvb2QgY29sb3IgZm9ybWF0cywgaXQgYWxsb2NhdGVzIFlWMTIgbG9jYWwgYnVmZmVyCisgICAgICogYW5kIGNvcGllcyB0aGUgY29udGVudCBvZiB8YnVmZmVyfCBvdmVyIHRvIGV4cG9zZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGZvcm1hdCAgbWFuZGF0b3J5IGJ1ZmZlciBmb3JtYXQgZm9yIE1lZGlhQ29kZWNCdWZmZXIKKyAgICAgKiBccGFyYW0gICBidWZmZXIgIGdyYXBoaWMgQzJCdWZmZXIgb2JqZWN0IHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFxwYXJhbSAgIGFsbG9jICAgYSBmdW5jdGlvbiB0byBhbGxvY2F0ZSBiYWNraW5nIEFCdWZmZXIgaWYgbmVlZGVkLgorICAgICAqIFxyZXR1cm4gICAgICAgICAgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIgb2JqZWN0IHdpdGggcmVhZGFibGUgbWFwcGluZy4KKyAgICAgKiAgICAgICAgICAgICAgICAgIG51bGxwdHIgaWYgdW5zdWNjZXNzZnVsLgorICAgICAqLworICAgIHN0YXRpYyBzcDxDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcj4gQWxsb2NhdGUoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8QUJ1ZmZlcj4oc2l6ZV90KT4gYWxsb2MpOworCisgICAgLyoqCisgICAgICogQWxsb2NhdGUgYSBuZXcgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIgd2hpY2ggYWxsb2NhdGVzIFlWMTIgbG9jYWwgYnVmZmVyCisgICAgICogYW5kIGNvcGllcyB0aGUgY29udGVudCBvZiB8YnVmZmVyfCBvdmVyIHRvIGV4cG9zZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGZvcm1hdCAgbWFuZGF0b3J5IGJ1ZmZlciBmb3JtYXQgZm9yIE1lZGlhQ29kZWNCdWZmZXIKKyAgICAgKiBccGFyYW0gICBhbGxvYyAgIGEgZnVuY3Rpb24gdG8gYWxsb2NhdGUgYmFja2luZyBBQnVmZmVyIGlmIG5lZWRlZC4KKyAgICAgKiBccmV0dXJuICAgICAgICAgIENvbnN0R3JhcGhpY0Jsb2NrQnVmZmVyIG9iamVjdCB3aXRoIG5vIHdyYXBwaW5nIGJ1ZmZlci4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3A8Q29uc3RHcmFwaGljQmxvY2tCdWZmZXI+IEFsbG9jYXRlRW1wdHkoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3A8QUJ1ZmZlcj4oc2l6ZV90KT4gYWxsb2MpOworCisgICAgdmlydHVhbCB+Q29uc3RHcmFwaGljQmxvY2tCdWZmZXIoKSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGFzQzJCdWZmZXIoKSBvdmVycmlkZTsKKyAgICBib29sIGNhbkNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIGNvcHkoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBDb25zdEdyYXBoaWNCbG9ja0J1ZmZlcigKKyAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmFCdWZmZXIsCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJHcmFwaGljVmlldz4gJiZ2aWV3LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyLAorICAgICAgICAgICAgY29uc3Qgc3A8QUJ1ZmZlcj4gJmltYWdlRGF0YSwKKyAgICAgICAgICAgIGJvb2wgd3JhcHBlZCk7CisgICAgQ29uc3RHcmFwaGljQmxvY2tCdWZmZXIoKSA9IGRlbGV0ZTsKKworICAgIHNwPEFCdWZmZXI+IG1JbWFnZURhdGE7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyR3JhcGhpY1ZpZXc+IG1WaWV3OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gbUJ1ZmZlclJlZjsKKyAgICBjb25zdCBib29sIG1XcmFwcGVkOworfTsKKworLyoqCisgKiBNZWRpYUNvZGVjQnVmZmVyIGltcGxlbWVudGF0aW9uIHdyYXBzIGFyb3VuZCBDMkxpbmVhckJsb2NrIGZvciBjb21wb25lbnQKKyAqIGFuZCBJTWVtb3J5IGZvciBjbGllbnQuIFVuZGVybHlpbmcgQzJMaW5lYXJCbG9jayB3b24ndCBiZSBtYXBwZWQgZm9yIHNlY3VyZQorICogdXNlY2FzZXMuLgorICovCitjbGFzcyBFbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlciA6IHB1YmxpYyBDb2RlYzJCdWZmZXIgeworcHVibGljOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdCBhIG5ldyBFbmNyeXB0ZWRMaW5lYXJCdWZmZXJCbG9jayB3cmFwcGluZyBhcm91bmQgQzJMaW5lYXJCbG9jaworICAgICAqIG9iamVjdCBhbmQgd3JpdGFibGUgSU1lbW9yeSByZWdpb24uCisgICAgICoKKyAgICAgKiBccGFyYW0gICBmb3JtYXQgICAgICBtYW5kYXRvcnkgYnVmZmVyIGZvcm1hdCBmb3IgTWVkaWFDb2RlY0J1ZmZlcgorICAgICAqIFxwYXJhbSAgIGJsb2NrICAgICAgIEMyTGluZWFyQmxvY2sgb2JqZWN0IHRvIHdyYXAgYXJvdW5kLgorICAgICAqIFxwYXJhbSAgIG1lbW9yeSAgICAgIElNZW1vcnkgb2JqZWN0IHRvIHN0b3JlIGVuY3J5cHRlZCBjb250ZW50LgorICAgICAqIFxwYXJhbSAgIGhlYXBTZXFOdW0gIEhlYXAgc2VxdWVuY2UgbnVtYmVyIGZyb20gSUNyeXB0bzsgLTEgaWYgTi9BCisgICAgICovCisgICAgRW5jcnlwdGVkTGluZWFyQmxvY2tCdWZmZXIoCisgICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2ssCisgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiAmbWVtb3J5LAorICAgICAgICAgICAgaW50MzJfdCBoZWFwU2VxTnVtID0gLTEpOworICAgIEVuY3J5cHRlZExpbmVhckJsb2NrQnVmZmVyKCkgPSBkZWxldGU7CisKKyAgICB2aXJ0dWFsIH5FbmNyeXB0ZWRMaW5lYXJCbG9ja0J1ZmZlcigpID0gZGVmYXVsdDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYXNDMkJ1ZmZlcigpIG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogRmlsbCB0aGUgc291cmNlIGJ1ZmZlciBzdHJ1Y3R1cmUgd2l0aCBhcHByb3ByaWF0ZSB2YWx1ZSBiYXNlZCBvbgorICAgICAqIGludGVybmFsIElNZW1vcnkgb2JqZWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHNvdXJjZSAgc291cmNlIGJ1ZmZlciBzdHJ1Y3R1cmUgdG8gZmlsbC4KKyAgICAgKi8KKyAgICB2b2lkIGZpbGxTb3VyY2VCdWZmZXIoSUNyeXB0bzo6U291cmNlQnVmZmVyICpzb3VyY2UpOworICAgIHZvaWQgZmlsbFNvdXJjZUJ1ZmZlcigKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U2hhcmVkQnVmZmVyICpzb3VyY2UpOworCisgICAgLyoqCisgICAgICogQ29weSB0aGUgY29udGVudCBvZiB8ZGVjcnlwdGVkfCBpbnRvIEMyTGluZWFyQmxvY2sgaW5zaWRlLiBUaGlzIHNoYWxsCisgICAgICogb25seSBiZSBjYWxsZWQgaW4gbm9uLXNlY3VyZSB1c2VjYXNlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSAgIGRlY3J5cHRlZCAgIGRlY3J5cHRlZCBjb250ZW50IHRvIGNvcHkgZnJvbS4KKyAgICAgKiBccGFyYW0gICBsZW5ndGggICAgICBsZW5ndGggb2YgdGhlIGNvbnRlbnQKKyAgICAgKiBccmV0dXJuICB0cnVlICAgICAgICBpZiBzdWNjZXNzZnVsCisgICAgICogICAgICAgICAgZmFsc2UgICAgICAgb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgY29weURlY3J5cHRlZENvbnRlbnQoY29uc3Qgc3A8SU1lbW9yeT4gJmRlY3J5cHRlZCwgc2l6ZV90IGxlbmd0aCk7CisKKyAgICAvKioKKyAgICAgKiBDb3B5IHRoZSBjb250ZW50IG9mIGludGVybmFsIElNZW1vcnkgb2JqZWN0IGludG8gQzJMaW5lYXJCbG9jayBpbnNpZGUuCisgICAgICogVGhpcyBzaGFsbCBvbmx5IGJlIGNhbGxlZCBpbiBub24tc2VjdXJlIHVzZWNhc2VzLgorICAgICAqCisgICAgICogXHBhcmFtICAgbGVuZ3RoICAgICAgbGVuZ3RoIG9mIHRoZSBjb250ZW50CisgICAgICogXHJldHVybiAgdHJ1ZSAgICAgICAgaWYgc3VjY2Vzc2Z1bAorICAgICAqICAgICAgICAgIGZhbHNlICAgICAgIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBib29sIGNvcHlEZWNyeXB0ZWRDb250ZW50RnJvbU1lbW9yeShzaXplX3QgbGVuZ3RoKTsKKworICAgIC8qKgorICAgICAqIFJldHVybiBuYXRpdmUgaGFuZGxlIG9mIHNlY3VyZSBidWZmZXIgdW5kZXJzdG9vZCBieSBJQ3J5cHRvLgorICAgICAqCisgICAgICogXHJldHVybiBzZWN1cmUgYnVmZmVyIGhhbmRsZQorICAgICAqLworICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKCkgY29uc3Q7CisKK3ByaXZhdGU6CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbUJsb2NrOworICAgIHNwPElNZW1vcnk+IG1NZW1vcnk7CisgICAgc3A8aGFyZHdhcmU6OkhpZGxNZW1vcnk+IG1IaWRsTWVtb3J5OworICAgIGludDMyX3QgbUhlYXBTZXFOdW07Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIENPREVDMl9CVUZGRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3ZjM4YzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vQ29kZWMySW5mb0J1aWxkZXIuY3BwCkBAIC0wLDAgKzEsNTYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDb2RlYzJJbmZvQnVpbGRlciIKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKyNpbmNsdWRlIDxzdHJpbmdzLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJEZWJ1Zy5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisjaW5jbHVkZSA8Q29kZWMyTWFwcGVyLmg+CisKKyNpbmNsdWRlIDxPTVhfQXVkaW8uaD4KKyNpbmNsdWRlIDxPTVhfQXVkaW9FeHQuaD4KKyNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KKyNpbmNsdWRlIDxPTVhfVHlwZXMuaD4KKyNpbmNsdWRlIDxPTVhfVmlkZW8uaD4KKyNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KKyNpbmNsdWRlIDxPTVhfQXNTdHJpbmcuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhPYnNlcnZlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Tm9kZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC90eXBlcy5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPG1lZGlhL29teC8xLjAvV09teE5vZGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9va3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaD4KKworI2luY2x1ZGUgIkNvZGVjMkluZm9CdWlsZGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgVHJhaXRzID0gQzJDb21wb25lbnQ6OlRyYWl0czsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitib29sIGhhc1ByZWZpeChjb25zdCBzdGQ6OnN0cmluZyYgcywgY29uc3QgY2hhciogcHJlZml4KSB7CisgICAgc2l6ZV90IHByZWZpeExlbiA9IHN0cmxlbihwcmVmaXgpOworICAgIHJldHVybiBzLmNvbXBhcmUoMCwgcHJlZml4TGVuLCBwcmVmaXgpID09IDA7Cit9CisKK2Jvb2wgaGFzU3VmZml4KGNvbnN0IHN0ZDo6c3RyaW5nJiBzLCBjb25zdCBjaGFyKiBzdWZmaXgpIHsKKyAgICBzaXplX3Qgc3VmZml4TGVuID0gc3RybGVuKHN1ZmZpeCk7CisgICAgcmV0dXJuIHN1ZmZpeExlbiA+IHMuc2l6ZSgpID8gZmFsc2UgOgorICAgICAgICAgICAgcy5jb21wYXJlKHMuc2l6ZSgpIC0gc3VmZml4TGVuLCBzdWZmaXhMZW4sIHN1ZmZpeCkgPT0gMDsKK30KKwordm9pZCBhZGRTdXBwb3J0ZWRQcm9maWxlTGV2ZWxzKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnRlcmZhY2U+IGludGYsCisgICAgICAgIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXIgKmNhcHMsCisgICAgICAgIGNvbnN0IFRyYWl0cyYgdHJhaXQsIGNvbnN0IHN0ZDo6c3RyaW5nICZtZWRpYVR5cGUpIHsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJNYXBwZXI6OlByb2ZpbGVMZXZlbE1hcHBlcj4gbWFwcGVyID0KKyAgICAgICAgQzJNYXBwZXI6OkdldFByb2ZpbGVMZXZlbE1hcHBlcih0cmFpdC5tZWRpYVR5cGUpOworICAgIC8vIGlmIHdlIGRvbid0IGtub3cgdGhlIG1lZGlhIHR5cGUsIHBhc3MgdGhyb3VnaCBhbGwgdmFsdWVzIHVubWFwcGVkCisKKyAgICAvLyBUT0RPOiB3ZSBjYW5ub3QgZmluZCBsZXZlbHMgdGhhdCBhcmUgbG9jYWwgJ21heGltYScgd2l0aG91dCBrbm93aW5nIHRoZSBjb2RpbmcKKyAgICAvLyBlLmcuIEguMjYzIGxldmVsIDQ1IGFuZCBsZXZlbCAzMCBjb3VsZCBiZSB0d28gdmFsdWVzIGZvciBoaWdoZXN0IGxldmVsIGFzCisgICAgLy8gdGhleSBkb24ndCBpbmNsdWRlIG9uZSBhbm90aGVyLiBGb3Igbm93IHdlIHVzZSB0aGUgbGFzdCBzdXBwb3J0ZWQgdmFsdWUuCisgICAgYm9vbCBlbmNvZGVyID0gdHJhaXQua2luZCA9PSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSOworICAgIEMyU3RyZWFtUHJvZmlsZUxldmVsSW5mbyBwbChlbmNvZGVyIC8qIG91dHB1dCAqLywgMHUpOworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gcHJvZmlsZVF1ZXJ5ID0geworICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBvc3NpYmxlKEMyUGFyYW1GaWVsZCgmcGwsICZwbC5wcm9maWxlKSkKKyAgICB9OworCisgICAgYzJfc3RhdHVzX3QgZXJyID0gaW50Zi0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMocHJvZmlsZVF1ZXJ5LCBDMl9ET05UX0JMT0NLKTsKKyAgICBBTE9HVigicXVlcnkgc3VwcG9ydGVkIHByb2ZpbGVzIC0+ICVzIHwgJXMiLCBhc1N0cmluZyhlcnIpLCBhc1N0cmluZyhwcm9maWxlUXVlcnlbMF0uc3RhdHVzKSk7CisgICAgaWYgKGVyciAhPSBDMl9PSyB8fCBwcm9maWxlUXVlcnlbMF0uc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyB3ZSBvbmx5IGhhbmRsZSBlbnVtZXJhdGVkIHZhbHVlcworICAgIGlmIChwcm9maWxlUXVlcnlbMF0udmFsdWVzLnR5cGUgIT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6VkFMVUVTKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBkZXRlcm1pbmUgaWYgY29kZWMgc3VwcG9ydHMgSERSCisgICAgYm9vbCBzdXBwb3J0c0hkciA9IGZhbHNlOworICAgIGJvb2wgc3VwcG9ydHNIZHIxMFBsdXMgPSBmYWxzZTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IHBhcmFtRGVzY3M7CisgICAgYzJfc3RhdHVzX3QgZXJyMSA9IGludGYtPnF1ZXJ5U3VwcG9ydGVkUGFyYW1zKCZwYXJhbURlc2NzKTsKKyAgICBpZiAoZXJyMSA9PSBDMl9PSykgeworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gJmRlc2MgOiBwYXJhbURlc2NzKSB7CisgICAgICAgICAgICBzd2l0Y2ggKCh1aW50MzJfdClkZXNjLT5pbmRleCgpKSB7CisgICAgICAgICAgICBjYXNlIEMyU3RyZWFtSGRyMTBQbHVzSW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFOgorICAgICAgICAgICAgICAgIHN1cHBvcnRzSGRyMTBQbHVzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJTdHJlYW1IZHJTdGF0aWNJbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEU6CisgICAgICAgICAgICAgICAgc3VwcG9ydHNIZHIgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEZvciBWUDksIHRoZSBzdGF0aWMgaW5mbyBpcyBhbHdheXMgcHJvcGFnYXRlZCBieSBmcmFtZXdvcmsuCisgICAgc3VwcG9ydHNIZHIgfD0gKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19WUDkpOworCisgICAgZm9yIChDMlZhbHVlOjpQcmltaXRpdmUgcHJvZmlsZSA6IHByb2ZpbGVRdWVyeVswXS52YWx1ZXMudmFsdWVzKSB7CisgICAgICAgIHBsLnByb2ZpbGUgPSAoQzJDb25maWc6OnByb2ZpbGVfdClwcm9maWxlLnJlZjx1aW50MzJfdD4oKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgICAgICBlcnIgPSBpbnRmLT5jb25maWcoeyZwbH0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgICAgIEFMT0dWKCJzZXQgcHJvZmlsZSB0byAldSAtPiAlcyIsIHBsLnByb2ZpbGUsIGFzU3RyaW5nKGVycikpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IGxldmVsUXVlcnkgPSB7CisgICAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkN1cnJlbnQoQzJQYXJhbUZpZWxkKCZwbCwgJnBsLmxldmVsKSkKKyAgICAgICAgfTsKKyAgICAgICAgZXJyID0gaW50Zi0+cXVlcnlTdXBwb3J0ZWRWYWx1ZXMobGV2ZWxRdWVyeSwgQzJfRE9OVF9CTE9DSyk7CisgICAgICAgIEFMT0dWKCJxdWVyeSBzdXBwb3J0ZWQgbGV2ZWxzIC0+ICVzIHwgJXMiLCBhc1N0cmluZyhlcnIpLCBhc1N0cmluZyhsZXZlbFF1ZXJ5WzBdLnN0YXR1cykpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LIHx8IGxldmVsUXVlcnlbMF0uc3RhdHVzICE9IEMyX09LCisgICAgICAgICAgICAgICAgfHwgbGV2ZWxRdWVyeVswXS52YWx1ZXMudHlwZSAhPSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpWQUxVRVMKKyAgICAgICAgICAgICAgICB8fCBsZXZlbFF1ZXJ5WzBdLnZhbHVlcy52YWx1ZXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQzJWYWx1ZTo6UHJpbWl0aXZlIGxldmVsID0gbGV2ZWxRdWVyeVswXS52YWx1ZXMudmFsdWVzLmJhY2soKTsKKyAgICAgICAgcGwubGV2ZWwgPSAoQzJDb25maWc6OmxldmVsX3QpbGV2ZWwucmVmPHVpbnQzMl90PigpOworICAgICAgICBBTE9HVigic3VwcG9ydGluZyBsZXZlbDogJXUiLCBwbC5sZXZlbCk7CisgICAgICAgIGludDMyX3Qgc2RrUHJvZmlsZSwgc2RrTGV2ZWw7CisgICAgICAgIGlmIChtYXBwZXIgJiYgbWFwcGVyLT5tYXBQcm9maWxlKHBsLnByb2ZpbGUsICZzZGtQcm9maWxlKQorICAgICAgICAgICAgICAgICYmIG1hcHBlci0+bWFwTGV2ZWwocGwubGV2ZWwsICZzZGtMZXZlbCkpIHsKKyAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbCgodWludDMyX3Qpc2RrUHJvZmlsZSwgKHVpbnQzMl90KXNka0xldmVsKTsKKyAgICAgICAgICAgIC8vIGFsc28gbGlzdCBIRFIgcHJvZmlsZXMgaWYgY29tcG9uZW50IHN1cHBvcnRzIEhEUgorICAgICAgICAgICAgaWYgKHN1cHBvcnRzSGRyKSB7CisgICAgICAgICAgICAgICAgYXV0byBoZHJNYXBwZXIgPSBDMk1hcHBlcjo6R2V0SGRyUHJvZmlsZUxldmVsTWFwcGVyKHRyYWl0Lm1lZGlhVHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKGhkck1hcHBlciAmJiBoZHJNYXBwZXItPm1hcFByb2ZpbGUocGwucHJvZmlsZSwgJnNka1Byb2ZpbGUpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbCgodWludDMyX3Qpc2RrUHJvZmlsZSwgKHVpbnQzMl90KXNka0xldmVsKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHN1cHBvcnRzSGRyMTBQbHVzKSB7CisgICAgICAgICAgICAgICAgICAgIGhkck1hcHBlciA9IEMyTWFwcGVyOjpHZXRIZHJQcm9maWxlTGV2ZWxNYXBwZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXQubWVkaWFUeXBlLCB0cnVlIC8qaXNIZHIxMFBsdXMqLyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChoZHJNYXBwZXIgJiYgaGRyTWFwcGVyLT5tYXBQcm9maWxlKHBsLnByb2ZpbGUsICZzZGtQcm9maWxlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKCh1aW50MzJfdClzZGtQcm9maWxlLCAodWludDMyX3Qpc2RrTGV2ZWwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFtYXBwZXIpIHsKKyAgICAgICAgICAgIGNhcHMtPmFkZFByb2ZpbGVMZXZlbChwbC5wcm9maWxlLCBwbC5sZXZlbCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBmb3IgSC4yNjMgYWxzbyBhZHZlcnRpc2UgdGhlIHNlY29uZCBoaWdoZXN0IGxldmVsIGlmIHRoZQorICAgICAgICAvLyBjb2RlYyBzdXBwb3J0cyBsZXZlbCA0NSwgYXMgbGV2ZWwgNDUgb25seSBjb3ZlcnMgbGV2ZWwgMTAKKyAgICAgICAgLy8gVE9ETzogbW92ZSB0aGlzIHRvIHNvbWUgZm9ybSBvZiBhIHNldHRpbmcgc28gaXQgZG9lcyBub3QKKyAgICAgICAgLy8gaGF2ZSB0byBiZSBoZXJlCisgICAgICAgIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fSDI2MykgeworICAgICAgICAgICAgQzJDb25maWc6OmxldmVsX3QgbmV4dExldmVsID0gQzJDb25maWc6OkxFVkVMX1VOVVNFRDsKKyAgICAgICAgICAgIGZvciAoQzJWYWx1ZTo6UHJpbWl0aXZlIHYgOiBsZXZlbFF1ZXJ5WzBdLnZhbHVlcy52YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICBDMkNvbmZpZzo6bGV2ZWxfdCBsZXZlbCA9IChDMkNvbmZpZzo6bGV2ZWxfdCl2LnJlZjx1aW50MzJfdD4oKTsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWwgPCBDMkNvbmZpZzo6TEVWRUxfSDI2M180NSAmJiBsZXZlbCA+IG5leHRMZXZlbCkgeworICAgICAgICAgICAgICAgICAgICBuZXh0TGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobmV4dExldmVsICE9IEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQKKyAgICAgICAgICAgICAgICAgICAgJiYgbmV4dExldmVsICE9IHBsLmxldmVsCisgICAgICAgICAgICAgICAgICAgICYmIG1hcHBlcgorICAgICAgICAgICAgICAgICAgICAmJiBtYXBwZXItPm1hcFByb2ZpbGUocGwucHJvZmlsZSwgJnNka1Byb2ZpbGUpCisgICAgICAgICAgICAgICAgICAgICYmIG1hcHBlci0+bWFwTGV2ZWwobmV4dExldmVsLCAmc2RrTGV2ZWwpKSB7CisgICAgICAgICAgICAgICAgY2Fwcy0+YWRkUHJvZmlsZUxldmVsKAorICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KXNka1Byb2ZpbGUsICh1aW50MzJfdClzZGtMZXZlbCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgYWRkU3VwcG9ydGVkQ29sb3JGb3JtYXRzKAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnRlcmZhY2U+IGludGYsCisgICAgICAgIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXIgKmNhcHMsCisgICAgICAgIGNvbnN0IFRyYWl0cyYgdHJhaXQsIGNvbnN0IHN0ZDo6c3RyaW5nICZtZWRpYVR5cGUpIHsKKyAgICAodm9pZClpbnRmOworCisgICAgLy8gVE9ETzogZ2V0IHRoaXMgZnJvbSBpbnRmKCkgYXMgd2VsbCwgYnV0IGhvdyBkbyB3ZSBtYXAgdGhlbSB0bworICAgIC8vIE1lZGlhQ29kZWMgY29sb3IgZm9ybWF0cz8KKyAgICBib29sIGVuY29kZXIgPSB0cmFpdC5raW5kID09IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVI7CisgICAgaWYgKG1lZGlhVHlwZS5maW5kKCJ2aWRlbyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zCisgICAgICAgICAgICB8fCBtZWRpYVR5cGUuZmluZCgiaW1hZ2UiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAvLyB2ZW5kb3IgdmlkZW8gY29kZWNzIHByZWZlciBvcGFxdWUgZm9ybWF0CisgICAgICAgIGlmICh0cmFpdC5uYW1lLmZpbmQoImFuZHJvaWQiKSA9PSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0U3VyZmFjZSk7CisgICAgICAgIH0KKyAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwRmxleGlibGUpOworICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIpOworICAgICAgICBjYXBzLT5hZGRDb2xvckZvcm1hdChDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyKTsKKyAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyKTsKKyAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcik7CisgICAgICAgIC8vIGZyYW1ld29yayB2aWRlbyBlbmNvZGVycyBtdXN0IHN1cHBvcnQgc3VyZmFjZSBmb3JtYXQsIHRob3VnaCBpdCBpcyB1bmNsZWFyCisgICAgICAgIC8vIHRoYXQgdGhleSB3aWxsIGJlIGFibGUgdG8gbWFwIGl0IGlmIGl0IGlzIG9wYXF1ZQorICAgICAgICBpZiAoZW5jb2RlciAmJiB0cmFpdC5uYW1lLmZpbmQoImFuZHJvaWQiKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgY2Fwcy0+YWRkQ29sb3JGb3JtYXQoQ09MT1JfRm9ybWF0U3VyZmFjZSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2NsYXNzIFN3aXRjaCB7CisgICAgZW51bSBGbGFncyA6IHVpbnQ4X3QgeworICAgICAgICAvLyBmbGFncworICAgICAgICBJU19FTkFCTEVEID0gKDEgPDwgMCksCisgICAgICAgIEJZX0RFRkFVTFQgPSAoMSA8PCAxKSwKKyAgICB9OworCisgICAgY29uc3RleHByIFN3aXRjaCh1aW50OF90IGZsYWdzKSA6IG1GbGFncyhmbGFncykge30KKworICAgIHVpbnQ4X3QgbUZsYWdzOworCitwdWJsaWM6CisgICAgLy8gaGF2ZSB0byBjcmVhdGUgY2xhc3MgZHVlIHRvIHRoaXMgYm9vbCBjb252ZXJzaW9uIG9wZXJhdG9yLi4uCisgICAgY29uc3RleHByIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRmxhZ3MgJiBJU19FTkFCTEVEOworICAgIH0KKworICAgIGNvbnN0ZXhwciBTd2l0Y2ggb3BlcmF0b3IhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gU3dpdGNoKG1GbGFncyBeIElTX0VOQUJMRUQpOworICAgIH0KKworICAgIHN0YXRpYyBjb25zdGV4cHIgU3dpdGNoIERJU0FCTEVEKCkgeyByZXR1cm4gMDsgfTsKKyAgICBzdGF0aWMgY29uc3RleHByIFN3aXRjaCBFTkFCTEVEKCkgeyByZXR1cm4gSVNfRU5BQkxFRDsgfTsKKyAgICBzdGF0aWMgY29uc3RleHByIFN3aXRjaCBESVNBQkxFRF9CWV9ERUZBVUxUKCkgeyByZXR1cm4gQllfREVGQVVMVDsgfTsKKyAgICBzdGF0aWMgY29uc3RleHByIFN3aXRjaCBFTkFCTEVEX0JZX0RFRkFVTFQoKSB7IHJldHVybiBJU19FTkFCTEVEIHwgQllfREVGQVVMVDsgfTsKKworICAgIGNvbnN0IGNoYXIgKnRvU3RyaW5nKGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIGNvbnN0IHsKKyAgICAgICAgc3dpdGNoIChtRmxhZ3MpIHsKKyAgICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIjAiOworICAgICAgICBjYXNlIElTX0VOQUJMRUQ6ICAgICAgICAgICAgICAgIHJldHVybiAiMSI7CisgICAgICAgIGNhc2UgQllfREVGQVVMVDogICAgICAgICAgICAgICAgcmV0dXJuICIoMCkiOworICAgICAgICBjYXNlIElTX0VOQUJMRUQgfCBCWV9ERUZBVUxUOiAgIHJldHVybiAiKDEpIjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIGRlZjsKKyAgICAgICAgfQorICAgIH0KKworfTsKKworY29uc3QgY2hhciAqYXNTdHJpbmcoY29uc3QgU3dpdGNoICZzLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgcmV0dXJuIHMudG9TdHJpbmcoZGVmKTsKK30KKworU3dpdGNoIGlzU2V0dGluZ0VuYWJsZWQoCisgICAgICAgIHN0ZDo6c3RyaW5nIHNldHRpbmcsIGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpBdHRyaWJ1dGVNYXAgJnNldHRpbmdzLAorICAgICAgICBTd2l0Y2ggZGVmID0gU3dpdGNoOjpESVNBQkxFRF9CWV9ERUZBVUxUKCkpIHsKKyAgICBjb25zdCBhdXRvIGVuYWJsZW1lbnQgPSBzZXR0aW5ncy5maW5kKHNldHRpbmcpOworICAgIGlmIChlbmFibGVtZW50ID09IHNldHRpbmdzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorICAgIHJldHVybiBlbmFibGVtZW50LT5zZWNvbmQgPT0gIjEiID8gU3dpdGNoOjpFTkFCTEVEKCkgOiBTd2l0Y2g6OkRJU0FCTEVEKCk7Cit9CisKK1N3aXRjaCBpc1ZhcmlhbnRFbmFibGVkKAorICAgICAgICBzdGQ6OnN0cmluZyB2YXJpYW50LCBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwICZzZXR0aW5ncykgeworICAgIHJldHVybiBpc1NldHRpbmdFbmFibGVkKCJ2YXJpYW50LSIgKyB2YXJpYW50LCBzZXR0aW5ncyk7Cit9CisKK1N3aXRjaCBpc1ZhcmlhbnRFeHByZXNzaW9uRW5hYmxlZCgKKyAgICAgICAgc3RkOjpzdHJpbmcgZXhwLCBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwICZzZXR0aW5ncykgeworICAgIGlmICghZXhwLmVtcHR5KCkgJiYgZXhwLmF0KDApID09ICchJykgeworICAgICAgICByZXR1cm4gIWlzVmFyaWFudEVuYWJsZWQoZXhwLnN1YnN0cigxLCBleHAuc2l6ZSgpIC0gMSksIHNldHRpbmdzKTsKKyAgICB9CisgICAgcmV0dXJuIGlzVmFyaWFudEVuYWJsZWQoZXhwLCBzZXR0aW5ncyk7Cit9CisKK1N3aXRjaCBpc0RvbWFpbkVuYWJsZWQoCisgICAgICAgIHN0ZDo6c3RyaW5nIGRvbWFpbiwgY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcCAmc2V0dGluZ3MpIHsKKyAgICByZXR1cm4gaXNTZXR0aW5nRW5hYmxlZCgiZG9tYWluLSIgKyBkb21haW4sIHNldHRpbmdzKTsKK30KKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitzdGF0dXNfdCBDb2RlYzJJbmZvQnVpbGRlcjo6YnVpbGRNZWRpYUNvZGVjTGlzdChNZWRpYUNvZGVjTGlzdFdyaXRlciogd3JpdGVyKSB7CisgICAgLy8gVE9ETzogUmVtb3ZlIHJ1bi10aW1lIGNvbmZpZ3VyYXRpb25zIG9uY2UgYWxsIGNvZGVjcyBhcmUgd29ya2luZworICAgIC8vIHByb3Blcmx5LiAoQXNzdW1lICJmdWxsIiBiZWhhdmlvciBldmVudHVhbGx5LikKKyAgICAvLworICAgIC8vIGRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlYyBzdXBwb3J0cyA1IHZhbHVlcy4KKyAgICAvLyAgIDAgLSBObyBDb2RlYyAyLjAgY29tcG9uZW50cyBhcmUgYXZhaWxhYmxlLgorICAgIC8vICAgMSAtIEF1ZGlvIGRlY29kZXJzIGFuZCBlbmNvZGVycyB3aXRoIHByZWZpeCAiYzIuYW5kcm9pZC4iIGFyZSBhdmFpbGFibGUKKyAgICAvLyAgICAgICBhbmQgcmFua2VkIGZpcnN0LgorICAgIC8vICAgICAgIEFsbCBvdGhlciBjb21wb25lbnRzIHdpdGggcHJlZml4ICJjMi5hbmRyb2lkLiIgYXJlIGF2YWlsYWJsZSB3aXRoCisgICAgLy8gICAgICAgdGhlaXIgbm9ybWFsIHJhbmtzLgorICAgIC8vICAgICAgIENvbXBvbmVudHMgd2l0aCBwcmVmaXggImMyLnZkYS4iIGFyZSBhdmFpbGFibGUgd2l0aCB0aGVpciBub3JtYWwKKyAgICAvLyAgICAgICByYW5rcy4KKyAgICAvLyAgICAgICBBbGwgb3RoZXIgY29tcG9uZW50cyB3aXRoIHN1ZmZpeCAiLmF2Yy5kZWNvZGVyIiBvciAiLmF2Yy5lbmNvZGVyIgorICAgIC8vICAgICAgIGFyZSBhdmFpbGFibGUgYnV0IHJhbmtlZCBsYXN0LgorICAgIC8vICAgMiAtIENvbXBvbmVudHMgd2l0aCBwcmVmaXggImMyLmFuZHJvaWQuIiBhcmUgYXZhaWxhYmxlIGFuZCByYW5rZWQKKyAgICAvLyAgICAgICBmaXJzdC4KKyAgICAvLyAgICAgICBDb21wb25lbnRzIHdpdGggcHJlZml4ICJjMi52ZGEuIiBhcmUgYXZhaWxhYmxlIHdpdGggdGhlaXIgbm9ybWFsCisgICAgLy8gICAgICAgcmFua3MuCisgICAgLy8gICAgICAgQWxsIG90aGVyIGNvbXBvbmVudHMgd2l0aCBzdWZmaXggIi5hdmMuZGVjb2RlciIgb3IgIi5hdmMuZW5jb2RlciIKKyAgICAvLyAgICAgICBhcmUgYXZhaWxhYmxlIGJ1dCByYW5rZWQgbGFzdC4KKyAgICAvLyAgIDMgLSBDb21wb25lbnRzIHdpdGggcHJlZml4ICJjMi5hbmRyb2lkLiIgYXJlIGF2YWlsYWJsZSBhbmQgcmFua2VkCisgICAgLy8gICAgICAgZmlyc3QuCisgICAgLy8gICAgICAgQWxsIG90aGVyIGNvbXBvbmVudHMgYXJlIGF2YWlsYWJsZSB3aXRoIHRoZWlyIG5vcm1hbCByYW5rcy4KKyAgICAvLyAgIDQgLSBBbGwgY29tcG9uZW50cyBhcmUgYXZhaWxhYmxlIHdpdGggdGhlaXIgbm9ybWFsIHJhbmtzLgorICAgIC8vCisgICAgLy8gVGhlIGRlZmF1bHQgdmFsdWUgKGJvb3QgdGltZSkgaXMgMS4KKyAgICAvLworICAgIC8vIE5vdGU6IEN1cnJlbnRseSwgT01YIGNvbXBvbmVudHMgaGF2ZSBkZWZhdWx0IHJhbmsgMHgxMDAsIHdoaWxlIGFsbAorICAgIC8vIENvZGVjMi4wIHNvZnR3YXJlIGNvbXBvbmVudHMgaGF2ZSBkZWZhdWx0IHJhbmsgMHgyMDAuCisgICAgaW50IG9wdGlvbiA9IDo6YW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoImRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlYyIsIDQpOworCisgICAgLy8gT2J0YWluIENvZGVjMkNsaWVudAorICAgIHN0ZDo6dmVjdG9yPFRyYWl0cz4gdHJhaXRzID0gQ29kZWMyQ2xpZW50OjpMaXN0Q29tcG9uZW50cygpOworCisgICAgLy8gcGFyc2UgQVBFWCBYTUwgZmlyc3QsIGZvbGxvd2VkIGJ5IHZlbmRvciBYTUwuCisgICAgLy8gTm90ZTogQVBFWCBYTUwgbmFtZXMgZG8gbm90IGRlcGVuZCBvbiByby5tZWRpYS54bWxfdmFyaWFudC4qIHByb3BlcnRpZXMuCisgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXIgcGFyc2VyOworICAgIHBhcnNlci5wYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKAorICAgICAgICAgICAgeyAibWVkaWFfY29kZWNzLnhtbCIsICJtZWRpYV9jb2RlY3NfcGVyZm9ybWFuY2UueG1sIiB9LAorICAgICAgICAgICAgeyAiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy9ldGMiIH0pOworCisgICAgLy8gVE9ETzogcmVtb3ZlIHRoZXNlIGMyLXNwZWNpZmljIGZpbGVzIG9uY2UgcHJvZHVjdCBtb3ZlZCB0byBkZWZhdWx0IGZpbGUgbmFtZXMKKyAgICBwYXJzZXIucGFyc2VYbWxGaWxlc0luU2VhcmNoRGlycygKKyAgICAgICAgICAgIHsgIm1lZGlhX2NvZGVjc19jMi54bWwiLCAibWVkaWFfY29kZWNzX3BlcmZvcm1hbmNlX2MyLnhtbCIgfSk7CisKKyAgICAvLyBwYXJzZSBkZWZhdWx0IFhNTCBmaWxlcworICAgIHBhcnNlci5wYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKCk7CisKKyAgICBpZiAocGFyc2VyLmdldFBhcnNpbmdTdGF0dXMoKSAhPSBPSykgeworICAgICAgICBBTE9HRCgiWE1MIHBhcnNlciBubyBnb29kIik7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwIHNldHRpbmdzID0gcGFyc2VyLmdldFNlcnZpY2VBdHRyaWJ1dGVNYXAoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnYgOiBzZXR0aW5ncykgeworICAgICAgICBpZiAoIWhhc1ByZWZpeCh2LmZpcnN0LCAibWVkaWEtdHlwZS0iKQorICAgICAgICAgICAgICAgICYmICFoYXNQcmVmaXgodi5maXJzdCwgImRvbWFpbi0iKQorICAgICAgICAgICAgICAgICYmICFoYXNQcmVmaXgodi5maXJzdCwgInZhcmlhbnQtIikpIHsKKyAgICAgICAgICAgIHdyaXRlci0+YWRkR2xvYmFsU2V0dGluZyh2LmZpcnN0LmNfc3RyKCksIHYuc2Vjb25kLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChjb25zdCBUcmFpdHMmIHRyYWl0IDogdHJhaXRzKSB7CisgICAgICAgIEMyQ29tcG9uZW50OjpyYW5rX3QgcmFuayA9IHRyYWl0LnJhbms7CisKKyAgICAgICAgLy8gSW50ZXJmYWNlIG11c3QgYmUgYWNjZXNzaWJsZSBmb3IgdXMgdG8gbGlzdCB0aGUgY29tcG9uZW50LCBhbmQgdGhlcmUgYWxzbworICAgICAgICAvLyBtdXN0IGJlIGFuIFhNTCBlbnRyeSBmb3IgdGhlIGNvZGVjLiBDb2RlYyBhbGlhc2VzIGxpc3RlZCBpbiB0aGUgdHJhaXRzCisgICAgICAgIC8vIGFsbG93IGFkZGl0aW9uYWwgWE1MIGVudHJpZXMgdG8gYmUgc3BlY2lmaWVkIGZvciBlYWNoIGFsaWFzLiBUaGVzZSB3aWxsCisgICAgICAgIC8vIGJlIGxpc3RlZCBhcyBzZXBhcmF0ZSBjb2RlY3MuIElmIG5vIFhNTCBlbnRyeSBpcyBzcGVjaWZpZWQgZm9yIGFuIGFsaWFzLAorICAgICAgICAvLyB0aG9zZSB3aWxsIGJlIHRyZWF0ZWQgYXMgYW4gYWRkaXRpb25hbCBhbGlhcyBzcGVjaWZpZWQgaW4gdGhlIFhNTCBlbnRyeQorICAgICAgICAvLyBmb3IgdGhlIGludGVyZmFjZSBuYW1lLgorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbmFtZUFuZEFsaWFzZXMgPSB0cmFpdC5hbGlhc2VzOworICAgICAgICBuYW1lQW5kQWxpYXNlcy5pbnNlcnQobmFtZUFuZEFsaWFzZXMuYmVnaW4oKSwgdHJhaXQubmFtZSk7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWVPckFsaWFzIDogbmFtZUFuZEFsaWFzZXMpIHsKKyAgICAgICAgICAgIGJvb2wgaXNBbGlhcyA9IHRyYWl0Lm5hbWUgIT0gbmFtZU9yQWxpYXM7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpJbnRlcmZhY2U+IGludGYgPQorICAgICAgICAgICAgICAgIENvZGVjMkNsaWVudDo6Q3JlYXRlSW50ZXJmYWNlQnlOYW1lKG5hbWVPckFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgaWYgKCFpbnRmKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImNvdWxkIG5vdCBjcmVhdGUgaW50ZXJmYWNlIGZvciAlcyclcyciLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNBbGlhcyA/ICJhbGlhcyAiIDogIiIsCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lT3JBbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChwYXJzZXIuZ2V0Q29kZWNNYXAoKS5jb3VudChuYW1lT3JBbGlhcykgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChpc0FsaWFzKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4gYmFzZUNvZGVjSW5mbyA9CisgICAgICAgICAgICAgICAgICAgICAgICB3cml0ZXItPmZpbmRNZWRpYUNvZGVjSW5mbyh0cmFpdC5uYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoIWJhc2VDb2RlY0luZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJhbGlhcyAnJXMnIG5vdCBmb3VuZCBpbiB4bWwgYnV0IGNhbm9uaWNhbCBjb2RlYyBpbmZvICclcycgbWlzc2luZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVPckFsaWFzLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0Lm5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiYWxpYXMgJyVzJyBub3QgZm91bmQgaW4geG1sOyB1c2UgYW4gWE1MIDxBbGlhcz4gdGFnIGZvciB0aGlzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZU9yQWxpYXMuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXJnZSBhbGlhcyBpbnRvIGV4aXN0aW5nIGNvZGVjCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlQ29kZWNJbmZvLT5hZGRBbGlhcyhuYW1lT3JBbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJjb21wb25lbnQgJyVzJyBub3QgZm91bmQgaW4geG1sIiwgdHJhaXQubmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBjYW5vbk5hbWUgPSB0cmFpdC5uYW1lOworCisgICAgICAgICAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBibG9jayBvbmNlIGFsbCBjb2RlY3MgYXJlIGVuYWJsZWQgYnkgZGVmYXVsdC4KKyAgICAgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgaWYgKGhhc1ByZWZpeChjYW5vbk5hbWUsICJjMi52ZGEuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoYXNQcmVmaXgoY2Fub25OYW1lLCAiYzIuYW5kcm9pZC4iKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAodHJhaXQuZG9tYWluID09IEMyQ29tcG9uZW50OjpET01BSU5fQVVESU8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJhbmsgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoYXNTdWZmaXgoY2Fub25OYW1lLCAiLmF2Yy5kZWNvZGVyIikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhc1N1ZmZpeChjYW5vbk5hbWUsICIuYXZjLmVuY29kZXIiKSkgeworICAgICAgICAgICAgICAgICAgICByYW5rID0gc3RkOjpudW1lcmljX2xpbWl0czxkZWNsdHlwZShyYW5rKT46Om1heCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgaWYgKGhhc1ByZWZpeChjYW5vbk5hbWUsICJjMi52ZGEuIikpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoYXNQcmVmaXgoY2Fub25OYW1lLCAiYzIuYW5kcm9pZC4iKSkgeworICAgICAgICAgICAgICAgICAgICByYW5rID0gMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChoYXNTdWZmaXgoY2Fub25OYW1lLCAiLmF2Yy5kZWNvZGVyIikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhc1N1ZmZpeChjYW5vbk5hbWUsICIuYXZjLmVuY29kZXIiKSkgeworICAgICAgICAgICAgICAgICAgICByYW5rID0gc3RkOjpudW1lcmljX2xpbWl0czxkZWNsdHlwZShyYW5rKT46Om1heCgpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjYXNlIDM6CisgICAgICAgICAgICAgICAgaWYgKGhhc1ByZWZpeChjYW5vbk5hbWUsICJjMi5hbmRyb2lkLiIpKSB7CisgICAgICAgICAgICAgICAgICAgIHJhbmsgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkNvZGVjUHJvcGVydGllcyAmY29kZWMgPQorICAgICAgICAgICAgICAgIHBhcnNlci5nZXRDb2RlY01hcCgpLmF0KG5hbWVPckFsaWFzKTsKKworICAgICAgICAgICAgLy8gdmVyaWZ5IHRoYXQgZWl0aGVyIHRoZSBjb2RlYyBpcyBleHBsaWNpdGx5IGVuYWJsZWQsIG9yIG9uZSBvZiBpdHMgZG9tYWlucyBpcworICAgICAgICAgICAgYm9vbCBjb2RlY0VuYWJsZWQgPSBjb2RlYy5xdWlya1NldC5maW5kKCJhdHRyaWJ1dGU6OmRpc2FibGVkIikgPT0gY29kZWMucXVpcmtTZXQuZW5kKCk7CisgICAgICAgICAgICBpZiAoIWNvZGVjRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcgJmRvbWFpbiA6IGNvZGVjLmRvbWFpblNldCkgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBTd2l0Y2ggZW5hYmxlZCA9IGlzRG9tYWluRW5hYmxlZChkb21haW4sIHNldHRpbmdzKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNvZGVjIGVudHJ5ICclcycgaXMgaW4gZG9tYWluICclcycgdGhhdCBpcyAnJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lT3JBbGlhcy5jX3N0cigpLCBkb21haW4uY19zdHIoKSwgYXNTdHJpbmcoZW5hYmxlZCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNFbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaWYgY29kZWMgaGFzIHZhcmlhbnRzLCBhbHNvIGNoZWNrIHRoYXQgYXQgbGVhc3Qgb25lIG9mIHRoZW0gaXMgZW5hYmxlZAorICAgICAgICAgICAgYm9vbCB2YXJpYW50RW5hYmxlZCA9IGNvZGVjLnZhcmlhbnRTZXQuZW1wdHkoKTsKKyAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcgJnZhcmlhbnQgOiBjb2RlYy52YXJpYW50U2V0KSB7CisgICAgICAgICAgICAgICAgY29uc3QgU3dpdGNoIGVuYWJsZWQgPSBpc1ZhcmlhbnRFeHByZXNzaW9uRW5hYmxlZCh2YXJpYW50LCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgQUxPR1YoImNvZGVjIGVudHJ5ICclcycgaGFzIGEgdmFyaWFudCAnJXMnIHRoYXQgaXMgJyVzJyIsCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lT3JBbGlhcy5jX3N0cigpLCB2YXJpYW50LmNfc3RyKCksIGFzU3RyaW5nKGVuYWJsZWQpKTsKKyAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICB2YXJpYW50RW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghY29kZWNFbmFibGVkIHx8ICF2YXJpYW50RW5hYmxlZCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJjb2RlYyBlbnRyeSBmb3IgJyVzJyBpcyBkaXNhYmxlZCIsIG5hbWVPckFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBBTE9HVigiYWRkaW5nIGNvZGVjIGVudHJ5IGZvciAnJXMnIiwgbmFtZU9yQWxpYXMuY19zdHIoKSk7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+IGNvZGVjSW5mbyA9IHdyaXRlci0+YWRkTWVkaWFDb2RlY0luZm8oKTsKKyAgICAgICAgICAgIGNvZGVjSW5mby0+c2V0TmFtZShuYW1lT3JBbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgIGNvZGVjSW5mby0+c2V0T3duZXIoKCJjb2RlYzI6OiIgKyB0cmFpdC5vd25lcikuY19zdHIoKSk7CisKKyAgICAgICAgICAgIGJvb2wgZW5jb2RlciA9IHRyYWl0LmtpbmQgPT0gQzJDb21wb25lbnQ6OktJTkRfRU5DT0RFUjsKKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPE1lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzPjo6dHlwZSBhdHRycyA9IDA7CisKKyAgICAgICAgICAgIGlmIChlbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgYXR0cnMgfD0gTWVkaWFDb2RlY0luZm86OmtGbGFnSXNFbmNvZGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHRyYWl0Lm93bmVyID09ICJzb2Z0d2FyZSIpIHsKKyAgICAgICAgICAgICAgICBhdHRycyB8PSBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc1NvZnR3YXJlT25seTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYXR0cnMgfD0gTWVkaWFDb2RlY0luZm86OmtGbGFnSXNWZW5kb3I7CisgICAgICAgICAgICAgICAgaWYgKHRyYWl0Lm93bmVyID09ICJ2ZW5kb3Itc29mdHdhcmUiKSB7CisgICAgICAgICAgICAgICAgICAgIGF0dHJzIHw9IE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzU29mdHdhcmVPbmx5OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY29kZWMucXVpcmtTZXQuZmluZCgiYXR0cmlidXRlOjpzb2Z0d2FyZS1jb2RlYyIpCisgICAgICAgICAgICAgICAgICAgICAgICA9PSBjb2RlYy5xdWlya1NldC5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBhdHRycyB8PSBNZWRpYUNvZGVjSW5mbzo6a0ZsYWdJc0hhcmR3YXJlQWNjZWxlcmF0ZWQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29kZWNJbmZvLT5zZXRBdHRyaWJ1dGVzKGF0dHJzKTsKKyAgICAgICAgICAgIGlmICghY29kZWMucmFuay5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgeG1sUmFuazsKKyAgICAgICAgICAgICAgICBjaGFyIGR1bW15OworICAgICAgICAgICAgICAgIGlmIChzc2NhbmYoY29kZWMucmFuay5jX3N0cigpLCAiJXUlYyIsICZ4bWxSYW5rLCAmZHVtbXkpID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmFuayA9IHhtbFJhbms7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoInJhbms6ICV1IiwgKHVuc2lnbmVkKXJhbmspOworICAgICAgICAgICAgY29kZWNJbmZvLT5zZXRSYW5rKHJhbmspOworCisgICAgICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZhbGlhcyA6IGNvZGVjLmFsaWFzZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiYWRkaW5nIGFsaWFzICclcyciLCBhbGlhcy5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb2RlY0luZm8tPmFkZEFsaWFzKGFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGF1dG8gdHlwZUl0ID0gY29kZWMudHlwZU1hcC5iZWdpbigpOyB0eXBlSXQgIT0gY29kZWMudHlwZU1hcC5lbmQoKTsgKyt0eXBlSXQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbWVkaWFUeXBlID0gdHlwZUl0LT5maXJzdDsKKyAgICAgICAgICAgICAgICBjb25zdCBTd2l0Y2ggdHlwZUVuYWJsZWQgPSBpc1NldHRpbmdFbmFibGVkKAorICAgICAgICAgICAgICAgICAgICAgICAgIm1lZGlhLXR5cGUtIiArIG1lZGlhVHlwZSwgc2V0dGluZ3MsIFN3aXRjaDo6RU5BQkxFRF9CWV9ERUZBVUxUKCkpOworICAgICAgICAgICAgICAgIGNvbnN0IFN3aXRjaCBkb21haW5UeXBlRW5hYmxlZCA9IGlzU2V0dGluZ0VuYWJsZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAibWVkaWEtdHlwZS0iICsgbWVkaWFUeXBlICsgKGVuY29kZXIgPyAiLWVuY29kZXIiIDogIi1kZWNvZGVyIiksCisgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncywgU3dpdGNoOjpFTkFCTEVEX0JZX0RFRkFVTFQoKSk7CisgICAgICAgICAgICAgICAgQUxPR1YoInR5cGUgJyVzLSVzJyBpcyAnJXMvJXMnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhVHlwZS5jX3N0cigpLCAoZW5jb2RlciA/ICJlbmNvZGVyIiA6ICJkZWNvZGVyIiksCisgICAgICAgICAgICAgICAgICAgICAgICBhc1N0cmluZyh0eXBlRW5hYmxlZCksIGFzU3RyaW5nKGRvbWFpblR5cGVFbmFibGVkKSk7CisgICAgICAgICAgICAgICAgaWYgKCF0eXBlRW5hYmxlZCB8fCAhZG9tYWluVHlwZUVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIm1lZGlhIHR5cGUgJyVzJyBmb3IgY29kZWMgZW50cnkgJyVzJyBpcyBkaXNhYmxlZCIsIG1lZGlhVHlwZS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVPckFsaWFzLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBBTE9HSSgiYWRkaW5nIHR5cGUgJyVzJyIsIHR5cGVJdC0+Zmlyc3QuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcCAmYXR0ck1hcCA9IHR5cGVJdC0+c2Vjb25kOworICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyPiBjYXBzID0KKyAgICAgICAgICAgICAgICAgICAgY29kZWNJbmZvLT5hZGRNZWRpYVR5cGUobWVkaWFUeXBlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmdiA6IGF0dHJNYXApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcga2V5ID0gdi5maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdmFsdWUgPSB2LnNlY29uZDsKKworICAgICAgICAgICAgICAgICAgICBzaXplX3QgdmFyaWFudFNlcCA9IGtleS5maW5kKCI6OjoiKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhcmlhbnRTZXAgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHZhcmlhbnQgPSBrZXkuc3Vic3RyKDAsIHZhcmlhbnRTZXApOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3dpdGNoIGVuYWJsZWQgPSBpc1ZhcmlhbnRFeHByZXNzaW9uRW5hYmxlZCh2YXJpYW50LCBzZXR0aW5ncyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigidmFyaWFudCAnJXMnIGlzICclcyciLCB2YXJpYW50LmNfc3RyKCksIGFzU3RyaW5nKGVuYWJsZWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0ga2V5LnN1YnN0cih2YXJpYW50U2VwICsgMyk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoa2V5LmZpbmQoImZlYXR1cmUtIikgPT0gMCAmJiBrZXkuZmluZCgiZmVhdHVyZS1iaXRyYXRlLW1vZGVzIikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbnRWYWx1ZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgdHJhaWxpbmcgYmFkIGNoYXJhY3RlcnMgYW5kIGRlZmF1bHQgdG8gMC4KKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKXNzY2FuZih2YWx1ZS5jX3N0cigpLCAiJWQiLCAmaW50VmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgY2Fwcy0+YWRkRGV0YWlsKGtleS5jX3N0cigpLCBpbnRWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXBzLT5hZGREZXRhaWwoa2V5LmNfc3RyKCksIHZhbHVlLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYWRkU3VwcG9ydGVkUHJvZmlsZUxldmVscyhpbnRmLCBjYXBzLmdldCgpLCB0cmFpdCwgbWVkaWFUeXBlKTsKKyAgICAgICAgICAgICAgICBhZGRTdXBwb3J0ZWRDb2xvckZvcm1hdHMoaW50ZiwgY2Fwcy5nZXQoKSwgdHJhaXQsIG1lZGlhVHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCitleHRlcm4gIkMiIGFuZHJvaWQ6Ok1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2UgKkNyZWF0ZUJ1aWxkZXIoKSB7CisgICAgcmV0dXJuIG5ldyBhbmRyb2lkOjpDb2RlYzJJbmZvQnVpbGRlcjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0NvZGVjMkluZm9CdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBjMTg5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Db2RlYzJJbmZvQnVpbGRlci5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPREVDMl9JTkZPX0JVSUxERVJfSF8KKyNkZWZpbmUgQ09ERUMyX0lORk9fQlVJTERFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBDb2RlYzJJbmZvQnVpbGRlciA6IHB1YmxpYyBNZWRpYUNvZGVjTGlzdEJ1aWxkZXJCYXNlIHsKK3B1YmxpYzoKKyAgICBDb2RlYzJJbmZvQnVpbGRlcigpID0gZGVmYXVsdDsKKyAgICB+Q29kZWMySW5mb0J1aWxkZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisgICAgc3RhdHVzX3QgYnVpbGRNZWRpYUNvZGVjTGlzdChNZWRpYUNvZGVjTGlzdFdyaXRlciogd3JpdGVyKSBvdmVycmlkZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX0lORk9fQlVJTERFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL0lucHV0U3VyZmFjZVdyYXBwZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9JbnB1dFN1cmZhY2VXcmFwcGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmIzNTc2MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9JbnB1dFN1cmZhY2VXcmFwcGVyLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIElOUFVUX1NVUkZBQ0VfV1JBUFBFUl9IXworI2RlZmluZSBJTlBVVF9TVVJGQUNFX1dSQVBQRVJfSF8KKworI2luY2x1ZGUgPGNvZGVjMi9oaWRsL2NsaWVudC5oPgorI2luY2x1ZGUgPHN5c3RlbS9ncmFwaGljcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogV3JhcHBlciBpbnRlcmZhY2UgYXJvdW5kIElucHV0U3VyZmFjZS4KKyAqLworY2xhc3MgSW5wdXRTdXJmYWNlV3JhcHBlciB7CitwdWJsaWM6CisgICAgSW5wdXRTdXJmYWNlV3JhcHBlcigpCisgICAgICAgIDogbURhdGFTcGFjZShIQUxfREFUQVNQQUNFX1VOS05PV04pIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5JbnB1dFN1cmZhY2VXcmFwcGVyKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0aGUgc3VyZmFjZSB3aXRoIHxjb21wfC4gQSBzdXJmYWNlIGNhbgorICAgICAqIGNvbm5lY3QgdG8gYXQgbW9zdCBvbmUgY29tcG9uZW50IGF0IGEgdGltZS4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gT0sgICAgICAgICAgICAgICBzdWNjZXNzZnVsbHkgY29ubmVjdGVkIHRvIHxjb21wfAorICAgICAqIFxyZXR1cm4gQUxSRUFEWV9FWElTVFMgICBhbHJlYWR5IGNvbm5lY3RlZCB0byBhbm90aGVyIGNvbXBvbmVudC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBEaXNjb25uZWN0IHRoZSBzdXJmYWNlIGZyb20gdGhlIGNvbXBvbmVudCBpZiBhbnkuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTdGFydCBwdXNoaW5nIGJ1ZmZlcnMgdG8gdGhlIHN1cmZhY2UuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKKworICAgIC8qKgorICAgICAqIFJlZjogR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbS4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSA9IDA7CisKKyAgICAvLy8gSW5wdXQgU3VyZmFjZSBjb25maWd1cmF0aW9uCisgICAgc3RydWN0IENvbmZpZyB7CisgICAgICAgIC8vIElOIFBBUkFNUyAoR0JTKQorICAgICAgICBmbG9hdCBtTWluRnBzOyAvLyBtaW5pbXVtIGZwcyAocmVwZWF0IGZyYW1lIHRvIGFjaGlldmUgdGhpcykKKyAgICAgICAgZmxvYXQgbU1heEZwczsgLy8gbWF4IGZwcyAodmlhIGZyYW1lIGRyb3ApCisgICAgICAgIGZsb2F0IG1DYXB0dXJlRnBzOyAvLyBjYXB0dXJlIGZwcworICAgICAgICBmbG9hdCBtQ29kZWRGcHM7ICAgLy8gY29kZWQgZnBzCisgICAgICAgIGJvb2wgbVN1c3BlbmRlZDsgLy8gc3VzcGVuZGVkCisgICAgICAgIGludDY0X3QgbVRpbWVPZmZzZXRVczsgLy8gdGltZSBvZmZzZXQgKGlucHV0ID0+IGNvZGVjKQorICAgICAgICBpbnQ2NF90IG1TdXNwZW5kQXRVczsgLy8gc3VzcGVuZC9yZXN1bWUgdGltZQorICAgICAgICBpbnQ2NF90IG1TdGFydEF0VXM7IC8vIHN0YXJ0IHRpbWUKKyAgICAgICAgYm9vbCBtU3RvcHBlZDsgLy8gc3RvcHBlZAorICAgICAgICBpbnQ2NF90IG1TdG9wQXRVczsgLy8gc3RvcCB0aW1lCisKKyAgICAgICAgLy8gT1VUIFBBUkFNUyAoR0JTKQorICAgICAgICBpbnQ2NF90IG1JbnB1dERlbGF5VXM7IC8vIGRlbGF5IGJldHdlZW4gZW5jb2RlciBpbnB1dCBhbmQgc3VyZmFjZSBpbnB1dAorCisgICAgICAgIC8vIElOIFBBUkFNUyAoQ09ERUMgV1JBUFBFUikKKyAgICAgICAgZmxvYXQgbUZpeGVkQWRqdXN0ZWRGcHM7IC8vIGZpeGVkIGZwcyB2aWEgUFRTIG1hbmlwdWxhdGlvbgorICAgICAgICBmbG9hdCBtTWluQWRqdXN0ZWRGcHM7IC8vIG1pbmltdW0gZnBzIHZpYSBQVFMgbWFuaXB1bGF0aW9uCisgICAgICAgIHVpbnQ2NF90IG1Vc2FnZTsgLy8gY29uc3VtZXIgdXNhZ2UKKyAgICB9OworCisgICAgLyoqCisgICAgICogQ29uZmlndXJlcyBpbnB1dCBzdXJmYWNlLgorICAgICAqCisgICAgICogXHBhcmFtIGNvbmZpZyBjb25maWd1cmF0aW9uLiBUaGlzIGNhbiBiZSB1cGRhdGVkIGR1cmluZyB0aGlzIGNhbGwgdG8gcHJvdmlkZSBvdXRwdXQKKyAgICAgKiAgICAgICAgICAgICAgIHBhcmFtZXRlcnMsIGJ1dCBub3QgdG8gcHJvdmlkZSBjb25maWd1cmVkIHBhcmFtZXRlcnMgKHRvIGF2b2lkIGNvbnRpbnVhbGx5CisgICAgICogICAgICAgICAgICAgICByZWNvbmZpZ3VyaW5nKQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlKENvbmZpZyAmY29uZmlnKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIGRlc2lyZWQgZGF0YSBzcGFjZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBkYXRhU3BhY2UgZGVzaXJlZCBkYXRhIHNwYWNlCisgICAgICovCisgICAgaW5saW5lIHZvaWQgc2V0RGF0YVNwYWNlKGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSkgeworICAgICAgICBtRGF0YVNwYWNlID0gZGF0YVNwYWNlOworICAgIH0KKworICAgIC8qKgorICAgICAqIENsZWFuIHVwIEMyV29yayByZWxhdGVkIHJlZmVyZW5jZXMgaWYgbmVjZXNzYXJ5LiBOby1vcCBieSBkZWZhdWx0LgorICAgICAqCisgICAgICogXHBhcmFtIGluZGV4IGluZGV4IG9mIGlucHV0IHdvcmsuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIG9uSW5wdXRCdWZmZXJEb25lKGMyX2NudHI2NF90IC8qIGluZGV4ICovKSB7fQorCitwcm90ZWN0ZWQ6CisgICAgYW5kcm9pZF9kYXRhc3BhY2UgbURhdGFTcGFjZTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gSU5QVVRfU1VSRkFDRV9XUkFQUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vT214MklHcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9PbXgySUdyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NGZhMDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vT214MklHcmFwaGljQnVmZmVyU291cmNlLmNwcApAQCAtMCwwICsxLDE4NSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmZGVmIF9fTFA2NF9fCisjZGVmaW5lIE9NWF9BTkRST0lEX0NPTVBJTEVfQVNfMzJCSVRfT05fNjRCSVRfUExBVEZPUk1TCisjZW5kaWYKKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJPbXgySUdyYXBoaWNCdWZmZXJTb3VyY2UiCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2luY2x1ZGUgIk9teDJJR3JhcGhpY0J1ZmZlclNvdXJjZS5oIgorCisjaW5jbHVkZSA8YW5kcm9pZC9Cbk9NWEJ1ZmZlclNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL09NWEJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5oPgorCisjaW5jbHVkZSA8T01YX0NvbXBvbmVudC5oPgorI2luY2x1ZGUgPE9NWF9JbmRleC5oPgorI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworLy8gT214R3JhcGhpY0J1ZmZlclNvdXJjZSAtPiBJT01YQnVmZmVyU291cmNlCisKK3N0cnVjdCBPbXhHYnMySU9teEJzIDogcHVibGljIEJuT01YQnVmZmVyU291cmNlIHsKKyAgICBzcDxPbXhHcmFwaGljQnVmZmVyU291cmNlPiBtQmFzZTsKKyAgICBPbXhHYnMySU9teEJzKHNwPE9teEdyYXBoaWNCdWZmZXJTb3VyY2U+IGNvbnN0JiBiYXNlKSA6IG1CYXNle2Jhc2V9IHt9CisgICAgQm5TdGF0dXMgb25PbXhFeGVjdXRpbmcoKSBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQmFzZS0+b25PbXhFeGVjdXRpbmcoKTsKKyAgICB9CisgICAgQm5TdGF0dXMgb25PbXhJZGxlKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUJhc2UtPm9uT214SWRsZSgpOworICAgIH0KKyAgICBCblN0YXR1cyBvbk9teExvYWRlZCgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1CYXNlLT5vbk9teExvYWRlZCgpOworICAgIH0KKyAgICBCblN0YXR1cyBvbklucHV0QnVmZmVyQWRkZWQoaW50MzJfdCBidWZmZXJJZCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUJhc2UtPm9uSW5wdXRCdWZmZXJBZGRlZChidWZmZXJJZCk7CisgICAgfQorICAgIEJuU3RhdHVzIG9uSW5wdXRCdWZmZXJFbXB0aWVkKAorICAgICAgICAgICAgaW50MzJfdCBidWZmZXJJZCwKKyAgICAgICAgICAgIE9NWEZlbmNlUGFyY2VsYWJsZSBjb25zdCYgZmVuY2VQYXJjZWwpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1CYXNlLT5vbklucHV0QnVmZmVyRW1wdGllZChidWZmZXJJZCwgZmVuY2VQYXJjZWwuZ2V0KCkpOworICAgIH0KK307CisKK3N0cnVjdCBPbXhOb2RlV3JhcHBlciA6IHB1YmxpYyBJT214Tm9kZVdyYXBwZXIgeworICAgIHNwPElPTVhOb2RlPiBtQmFzZTsKKyAgICBPbXhOb2RlV3JhcHBlcihzcDxJT01YTm9kZT4gY29uc3QmIGJhc2UpIDogbUJhc2V7YmFzZX0ge30KKyAgICBzdGF0dXNfdCBlbXB0eUJ1ZmZlcigKKyAgICAgICAgICAgIGludDMyX3QgYnVmZmVySWQsIHVpbnQzMl90IGZsYWdzLAorICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmJ1ZmZlciwKKyAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUJhc2UtPmVtcHR5QnVmZmVyKGJ1ZmZlcklkLCBidWZmZXIsIGZsYWdzLCB0aW1lc3RhbXAsIGZlbmNlRmQpOworICAgIH0KKyAgICB2b2lkIGRpc3BhdGNoRGF0YVNwYWNlQ2hhbmdlZCgKKyAgICAgICAgICAgIGludDMyX3QgZGF0YVNwYWNlLCBpbnQzMl90IGFzcGVjdHMsIGludDMyX3QgcGl4ZWxGb3JtYXQpIG92ZXJyaWRlIHsKKyAgICAgICAgb214X21lc3NhZ2UgbXNne307CisgICAgICAgIG1zZy50eXBlID0gb214X21lc3NhZ2U6OkVWRU5UOworICAgICAgICBtc2cuZmVuY2VGZCA9IC0xOworICAgICAgICBtc2cudS5ldmVudF9kYXRhLmV2ZW50ID0gT01YX0V2ZW50RGF0YVNwYWNlQ2hhbmdlZDsKKyAgICAgICAgbXNnLnUuZXZlbnRfZGF0YS5kYXRhMSA9IGRhdGFTcGFjZTsKKyAgICAgICAgbXNnLnUuZXZlbnRfZGF0YS5kYXRhMiA9IGFzcGVjdHM7CisgICAgICAgIG1zZy51LmV2ZW50X2RhdGEuZGF0YTMgPSBwaXhlbEZvcm1hdDsKKyAgICAgICAgbUJhc2UtPmRpc3BhdGNoTWVzc2FnZShtc2cpOworICAgIH0KK307CisKK30gLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworLy8gT214MklHcmFwaGljQnVmZmVyU291cmNlCitPbXgySUdyYXBoaWNCdWZmZXJTb3VyY2U6Ok9teDJJR3JhcGhpY0J1ZmZlclNvdXJjZSgKKyAgICAgICAgc3A8T214R3JhcGhpY0J1ZmZlclNvdXJjZT4gY29uc3QmIGJhc2UpCisgICAgICA6IG1CYXNle2Jhc2V9LAorICAgICAgICBtT01YQnVmZmVyU291cmNle25ldyBPbXhHYnMySU9teEJzKGJhc2UpfSB7Cit9CisKK0JuU3RhdHVzIE9teDJJR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0U3VzcGVuZCgKKyAgICAgICAgYm9vbCBzdXNwZW5kLCBpbnQ2NF90IHRpbWVVcykgeworICAgIHJldHVybiBCblN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPnNldFN1c3BlbmQoc3VzcGVuZCwgdGltZVVzKSk7Cit9CisKK0JuU3RhdHVzIE9teDJJR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0UmVwZWF0UHJldmlvdXNGcmFtZURlbGF5VXMoCisgICAgICAgIGludDY0X3QgcmVwZWF0QWZ0ZXJVcykgeworICAgIHJldHVybiBCblN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPnNldFJlcGVhdFByZXZpb3VzRnJhbWVEZWxheVVzKHJlcGVhdEFmdGVyVXMpKTsKK30KKworQm5TdGF0dXMgT214MklHcmFwaGljQnVmZmVyU291cmNlOjpzZXRNYXhGcHMoZmxvYXQgbWF4RnBzKSB7CisgICAgcmV0dXJuIEJuU3RhdHVzOjpmcm9tU3RhdHVzVChtQmFzZS0+c2V0TWF4RnBzKG1heEZwcykpOworfQorCitCblN0YXR1cyBPbXgySUdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFRpbWVMYXBzZUNvbmZpZygKKyAgICAgICAgZG91YmxlIGZwcywgZG91YmxlIGNhcHR1cmVGcHMpIHsKKyAgICByZXR1cm4gQm5TdGF0dXM6OmZyb21TdGF0dXNUKG1CYXNlLT5zZXRUaW1lTGFwc2VDb25maWcoZnBzLCBjYXB0dXJlRnBzKSk7Cit9CisKK0JuU3RhdHVzIE9teDJJR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0U3RhcnRUaW1lVXMoCisgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXMpIHsKKyAgICByZXR1cm4gQm5TdGF0dXM6OmZyb21TdGF0dXNUKG1CYXNlLT5zZXRTdGFydFRpbWVVcyhzdGFydFRpbWVVcykpOworfQorCitCblN0YXR1cyBPbXgySUdyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFN0b3BUaW1lVXMoCisgICAgICAgIGludDY0X3Qgc3RvcFRpbWVVcykgeworICAgIHJldHVybiBCblN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPnNldFN0b3BUaW1lVXMoc3RvcFRpbWVVcykpOworfQorCitCblN0YXR1cyBPbXgySUdyYXBoaWNCdWZmZXJTb3VyY2U6OmdldFN0b3BUaW1lT2Zmc2V0VXMoCisgICAgICAgIGludDY0X3QgKnN0b3BUaW1lT2Zmc2V0VXMpIHsKKyAgICByZXR1cm4gQm5TdGF0dXM6OmZyb21TdGF0dXNUKG1CYXNlLT5nZXRTdG9wVGltZU9mZnNldFVzKHN0b3BUaW1lT2Zmc2V0VXMpKTsKK30KKworQm5TdGF0dXMgT214MklHcmFwaGljQnVmZmVyU291cmNlOjpzZXRDb2xvckFzcGVjdHMoCisgICAgICAgIGludDMyX3QgYXNwZWN0cykgeworICAgIHJldHVybiBCblN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPnNldENvbG9yQXNwZWN0cyhhc3BlY3RzKSk7Cit9CisKK0JuU3RhdHVzIE9teDJJR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0VGltZU9mZnNldFVzKAorICAgICAgICBpbnQ2NF90IHRpbWVPZmZzZXRzVXMpIHsKKyAgICByZXR1cm4gQm5TdGF0dXM6OmZyb21TdGF0dXNUKG1CYXNlLT5zZXRUaW1lT2Zmc2V0VXModGltZU9mZnNldHNVcykpOworfQorCitCblN0YXR1cyBPbXgySUdyYXBoaWNCdWZmZXJTb3VyY2U6OnNpZ25hbEVuZE9mSW5wdXRTdHJlYW0oKSB7CisgICAgcmV0dXJuIEJuU3RhdHVzOjpmcm9tU3RhdHVzVChtQmFzZS0+c2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpKTsKK30KKworQm5TdGF0dXMgT214MklHcmFwaGljQnVmZmVyU291cmNlOjpjb25maWd1cmUoCisgICAgICAgIGNvbnN0IHNwPElPTVhOb2RlPiYgb214Tm9kZSwgaW50MzJfdCBkYXRhU3BhY2UpIHsKKyAgICBpZiAob214Tm9kZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBCblN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKEJBRF9WQUxVRSk7CisgICAgfQorCisgICAgLy8gRG8gc2V0SW5wdXRTdXJmYWNlKCkgZmlyc3QsIHRoZSBub2RlIHdpbGwgdHJ5IHRvIGVuYWJsZSBtZXRhZGF0YQorICAgIC8vIG1vZGUgb24gaW5wdXQsIGFuZCBkb2VzIG5lY2Vzc2FyeSBlcnJvciBjaGVja2luZy4gSWYgdGhpcyBmYWlscywKKyAgICAvLyB3ZSBjYW4ndCB1c2UgdGhpcyBpbnB1dCBzdXJmYWNlIG9uIHRoZSBub2RlLgorICAgIHN0YXR1c190IGVyciA9IG9teE5vZGUtPnNldElucHV0U3VyZmFjZShtT01YQnVmZmVyU291cmNlKTsKKyAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGlucHV0IHN1cmZhY2U6ICVkIiwgZXJyKTsKKyAgICAgICAgcmV0dXJuIEJuU3RhdHVzOjpmcm9tU2VydmljZVNwZWNpZmljRXJyb3IoZXJyKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBjb25zdW1lclVzYWdlOworICAgIGlmIChvbXhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUNvbnN1bWVyVXNhZ2VCaXRzLAorICAgICAgICAgICAgJmNvbnN1bWVyVXNhZ2UsIHNpemVvZihjb25zdW1lclVzYWdlKSkgIT0gT0spIHsKKyAgICAgICAgY29uc3VtZXJVc2FnZSA9IDA7CisgICAgfQorCisgICAgT01YX1BBUkFNX1BPUlRERUZJTklUSU9OVFlQRSBkZWY7CisgICAgSW5pdE9NWFBhcmFtcygmZGVmKTsKKyAgICBkZWYublBvcnRJbmRleCA9IDA7IC8vIGtQb3J0SW5kZXhJbnB1dAorCisgICAgZXJyID0gb214Tm9kZS0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmRlZiwgc2l6ZW9mKGRlZikpOworICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgcG9ydCBkZWZpbml0aW9uOiAlZCIsIGVycik7CisgICAgICAgIHJldHVybiBCblN0YXR1czo6ZnJvbVNlcnZpY2VTcGVjaWZpY0Vycm9yKFVOS05PV05fRVJST1IpOworICAgIH0KKworICAgIHJldHVybiBCblN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPmNvbmZpZ3VyZSgKKyAgICAgICAgICAgIG5ldyBPbXhOb2RlV3JhcHBlcihvbXhOb2RlKSwKKyAgICAgICAgICAgIGRhdGFTcGFjZSwKKyAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwsCisgICAgICAgICAgICBkZWYuZm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoLAorICAgICAgICAgICAgZGVmLmZvcm1hdC52aWRlby5uRnJhbWVIZWlnaHQsCisgICAgICAgICAgICBjb25zdW1lclVzYWdlKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL09teDJJR3JhcGhpY0J1ZmZlclNvdXJjZS5oIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL09teDJJR3JhcGhpY0J1ZmZlclNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwZmQxZWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vT214MklHcmFwaGljQnVmZmVyU291cmNlLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBPTVhfMl9JR1JBUEhJQ0JVRkZFUlNPVVJDRV9IXworI2RlZmluZSBPTVhfMl9JR1JBUEhJQ0JVRkZFUlNPVVJDRV9IXworCisjaW5jbHVkZSA8YW5kcm9pZC9CbkdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT214R3JhcGhpY0J1ZmZlclNvdXJjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIEJuU3RhdHVzID0gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKKworc3RydWN0IE9teDJJR3JhcGhpY0J1ZmZlclNvdXJjZSA6IHB1YmxpYyBCbkdyYXBoaWNCdWZmZXJTb3VyY2UgeworICAgIHNwPE9teEdyYXBoaWNCdWZmZXJTb3VyY2U+IG1CYXNlOworICAgIHNwPElPTVhCdWZmZXJTb3VyY2U+IG1PTVhCdWZmZXJTb3VyY2U7CisgICAgT214MklHcmFwaGljQnVmZmVyU291cmNlKHNwPE9teEdyYXBoaWNCdWZmZXJTb3VyY2U+IGNvbnN0JiBiYXNlKTsKKyAgICBCblN0YXR1cyBjb25maWd1cmUoY29uc3Qgc3A8SU9NWE5vZGU+JiBvbXhOb2RlLCBpbnQzMl90IGRhdGFTcGFjZSkgb3ZlcnJpZGU7CisgICAgQm5TdGF0dXMgc2V0U3VzcGVuZChib29sIHN1c3BlbmQsIGludDY0X3QgdGltZVVzKSBvdmVycmlkZTsKKyAgICBCblN0YXR1cyBzZXRSZXBlYXRQcmV2aW91c0ZyYW1lRGVsYXlVcyhpbnQ2NF90IHJlcGVhdEFmdGVyVXMpIG92ZXJyaWRlOworICAgIEJuU3RhdHVzIHNldE1heEZwcyhmbG9hdCBtYXhGcHMpIG92ZXJyaWRlOworICAgIEJuU3RhdHVzIHNldFRpbWVMYXBzZUNvbmZpZyhkb3VibGUgZnBzLCBkb3VibGUgY2FwdHVyZUZwcykgb3ZlcnJpZGU7CisgICAgQm5TdGF0dXMgc2V0U3RhcnRUaW1lVXMoaW50NjRfdCBzdGFydFRpbWVVcykgb3ZlcnJpZGU7CisgICAgQm5TdGF0dXMgc2V0U3RvcFRpbWVVcyhpbnQ2NF90IHN0b3BUaW1lVXMpIG92ZXJyaWRlOworICAgIEJuU3RhdHVzIGdldFN0b3BUaW1lT2Zmc2V0VXMoaW50NjRfdCAqc3RvcFRpbWVPZmZzZXRVcykgb3ZlcnJpZGU7CisgICAgQm5TdGF0dXMgc2V0Q29sb3JBc3BlY3RzKGludDMyX3QgYXNwZWN0cykgb3ZlcnJpZGU7CisgICAgQm5TdGF0dXMgc2V0VGltZU9mZnNldFVzKGludDY0X3QgdGltZU9mZnNldHNVcykgb3ZlcnJpZGU7CisgICAgQm5TdGF0dXMgc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbSgpIG92ZXJyaWRlOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gT01YXzJfSUdSQVBISUNCVUZGRVJTT1VSQ0VfSF8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1BpcGVsaW5lV2F0Y2hlci5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUGlwZWxpbmVXYXRjaGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZWU5MDU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1BpcGVsaW5lV2F0Y2hlci5jcHAKQEAgLTAsMCArMSwxNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiUGlwZWxpbmVXYXRjaGVyIgorCisjaW5jbHVkZSA8bnVtZXJpYz4KKworI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworI2luY2x1ZGUgIlBpcGVsaW5lV2F0Y2hlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1BpcGVsaW5lV2F0Y2hlciAmUGlwZWxpbmVXYXRjaGVyOjppbnB1dERlbGF5KHVpbnQzMl90IHZhbHVlKSB7CisgICAgbUlucHV0RGVsYXkgPSB2YWx1ZTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK1BpcGVsaW5lV2F0Y2hlciAmUGlwZWxpbmVXYXRjaGVyOjpwaXBlbGluZURlbGF5KHVpbnQzMl90IHZhbHVlKSB7CisgICAgbVBpcGVsaW5lRGVsYXkgPSB2YWx1ZTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK1BpcGVsaW5lV2F0Y2hlciAmUGlwZWxpbmVXYXRjaGVyOjpvdXRwdXREZWxheSh1aW50MzJfdCB2YWx1ZSkgeworICAgIG1PdXRwdXREZWxheSA9IHZhbHVlOworICAgIHJldHVybiAqdGhpczsKK30KKworUGlwZWxpbmVXYXRjaGVyICZQaXBlbGluZVdhdGNoZXI6OnNtb290aG5lc3NGYWN0b3IodWludDMyX3QgdmFsdWUpIHsKKyAgICBtU21vb3RobmVzc0ZhY3RvciA9IHZhbHVlOworICAgIHJldHVybiAqdGhpczsKK30KKwordm9pZCBQaXBlbGluZVdhdGNoZXI6Om9uV29ya1F1ZXVlZCgKKyAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gJiZidWZmZXJzLAorICAgICAgICBjb25zdCBDbG9jazo6dGltZV9wb2ludCAmcXVldWVkQXQpIHsKKyAgICBBTE9HVigib25Xb3JrUXVldWVkKGZyYW1lSW5kZXg9JWxsdSwgYnVmZmVycyhzaXplPSV6dSksIHF1ZXVlZEF0PSVsbGQpIiwKKyAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWZyYW1lSW5kZXgsCisgICAgICAgICAgYnVmZmVycy5zaXplKCksCisgICAgICAgICAgKGxvbmcgbG9uZylxdWV1ZWRBdC50aW1lX3NpbmNlX2Vwb2NoKCkuY291bnQoKSk7CisgICAgYXV0byBpdCA9IG1GcmFtZXNJblBpcGVsaW5lLmZpbmQoZnJhbWVJbmRleCk7CisgICAgaWYgKGl0ICE9IG1GcmFtZXNJblBpcGVsaW5lLmVuZCgpKSB7CisgICAgICAgIEFMT0dEKCJvbldvcmtRdWV1ZWQ6IER1cGxpY2F0ZSBmcmFtZSBpbmRleCAoJWxsdSk7IHByZXZpb3VzIGVudHJ5IHJlbW92ZWQiLAorICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWZyYW1lSW5kZXgpOworICAgICAgICAodm9pZCltRnJhbWVzSW5QaXBlbGluZS5lcmFzZShpdCk7CisgICAgfQorICAgICh2b2lkKW1GcmFtZXNJblBpcGVsaW5lLnRyeV9lbXBsYWNlKGZyYW1lSW5kZXgsIHN0ZDo6bW92ZShidWZmZXJzKSwgcXVldWVkQXQpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IFBpcGVsaW5lV2F0Y2hlcjo6b25JbnB1dEJ1ZmZlclJlbGVhc2VkKAorICAgICAgICB1aW50NjRfdCBmcmFtZUluZGV4LCBzaXplX3QgYXJyYXlJbmRleCkgeworICAgIEFMT0dWKCJvbklucHV0QnVmZmVyUmVsZWFzZWQoZnJhbWVJbmRleD0lbGx1LCBhcnJheUluZGV4PSV6dSkiLAorICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhbWVJbmRleCwgYXJyYXlJbmRleCk7CisgICAgYXV0byBpdCA9IG1GcmFtZXNJblBpcGVsaW5lLmZpbmQoZnJhbWVJbmRleCk7CisgICAgaWYgKGl0ID09IG1GcmFtZXNJblBpcGVsaW5lLmVuZCgpKSB7CisgICAgICAgIEFMT0dEKCJvbklucHV0QnVmZmVyUmVsZWFzZWQ6IGZyYW1lSW5kZXggbm90IGZvdW5kICglbGx1KTsgaWdub3JlZCIsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhbWVJbmRleCk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBpZiAoaXQtPnNlY29uZC5idWZmZXJzLnNpemUoKSA8PSBhcnJheUluZGV4KSB7CisgICAgICAgIEFMT0dEKCJvbklucHV0QnVmZmVyUmVsZWFzZWQ6IGJ1ZmZlcnMgYXQgJWxsdTogc2l6ZSAlenUsIHJlcXVlc3RlZCBpbmRleDogJXp1IiwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFtZUluZGV4LCBpdC0+c2Vjb25kLmJ1ZmZlcnMuc2l6ZSgpLCBhcnJheUluZGV4KTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gYnVmZmVyKHN0ZDo6bW92ZShpdC0+c2Vjb25kLmJ1ZmZlcnNbYXJyYXlJbmRleF0pKTsKKyAgICBBTE9HRF9JRighYnVmZmVyLCAib25JbnB1dEJ1ZmZlclJlbGVhc2VkOiBidWZmZXIgYWxyZWFkeSByZWxlYXNlZCAoJWxsdTolenUpIiwKKyAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKWZyYW1lSW5kZXgsIGFycmF5SW5kZXgpOworICAgIHJldHVybiBidWZmZXI7Cit9CisKK3ZvaWQgUGlwZWxpbmVXYXRjaGVyOjpvbldvcmtEb25lKHVpbnQ2NF90IGZyYW1lSW5kZXgpIHsKKyAgICBBTE9HVigib25Xb3JrRG9uZShmcmFtZUluZGV4PSVsbHUpIiwgKHVuc2lnbmVkIGxvbmcgbG9uZylmcmFtZUluZGV4KTsKKyAgICBhdXRvIGl0ID0gbUZyYW1lc0luUGlwZWxpbmUuZmluZChmcmFtZUluZGV4KTsKKyAgICBpZiAoaXQgPT0gbUZyYW1lc0luUGlwZWxpbmUuZW5kKCkpIHsKKyAgICAgICAgQUxPR0QoIm9uV29ya0RvbmU6IGZyYW1lSW5kZXggbm90IGZvdW5kICglbGx1KTsgaWdub3JlZCIsCisgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpZnJhbWVJbmRleCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgKHZvaWQpbUZyYW1lc0luUGlwZWxpbmUuZXJhc2UoaXQpOworfQorCit2b2lkIFBpcGVsaW5lV2F0Y2hlcjo6Zmx1c2goKSB7CisgICAgbUZyYW1lc0luUGlwZWxpbmUuY2xlYXIoKTsKK30KKworYm9vbCBQaXBlbGluZVdhdGNoZXI6OnBpcGVsaW5lRnVsbCgpIGNvbnN0IHsKKyAgICBpZiAobUZyYW1lc0luUGlwZWxpbmUuc2l6ZSgpID49CisgICAgICAgICAgICBtSW5wdXREZWxheSArIG1QaXBlbGluZURlbGF5ICsgbU91dHB1dERlbGF5ICsgbVNtb290aG5lc3NGYWN0b3IpIHsKKyAgICAgICAgQUxPR1YoInBpcGVsaW5lRnVsbDogdG9vIG1hbnkgZnJhbWVzIGluIHBpcGVsaW5lICglenUpIiwgbUZyYW1lc0luUGlwZWxpbmUuc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHNpemVfdCBzaXplV2l0aElucHV0UmVsZWFzZWQgPSBzdGQ6OmNvdW50X2lmKAorICAgICAgICAgICAgbUZyYW1lc0luUGlwZWxpbmUuYmVnaW4oKSwKKyAgICAgICAgICAgIG1GcmFtZXNJblBpcGVsaW5lLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgZGVjbHR5cGUobUZyYW1lc0luUGlwZWxpbmUpOjp2YWx1ZV90eXBlICZ2YWx1ZSkgeworICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPiAmYnVmZmVyIDogdmFsdWUuc2Vjb25kLmJ1ZmZlcnMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfSk7CisgICAgaWYgKHNpemVXaXRoSW5wdXRSZWxlYXNlZCA+PQorICAgICAgICAgICAgbVBpcGVsaW5lRGVsYXkgKyBtT3V0cHV0RGVsYXkgKyBtU21vb3RobmVzc0ZhY3RvcikgeworICAgICAgICBBTE9HVigicGlwZWxpbmVGdWxsOiB0b28gbWFueSBmcmFtZXMgaW4gcGlwZWxpbmUsIHdpdGggaW5wdXQgcmVsZWFzZWQgKCV6dSkiLAorICAgICAgICAgICAgICBzaXplV2l0aElucHV0UmVsZWFzZWQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZVdpdGhJbnB1dHNQZW5kaW5nID0gbUZyYW1lc0luUGlwZWxpbmUuc2l6ZSgpIC0gc2l6ZVdpdGhJbnB1dFJlbGVhc2VkOworICAgIGlmIChzaXplV2l0aElucHV0c1BlbmRpbmcgPiBtUGlwZWxpbmVEZWxheSArIG1JbnB1dERlbGF5ICsgbVNtb290aG5lc3NGYWN0b3IpIHsKKyAgICAgICAgQUxPR1YoInBpcGVsaW5lRnVsbDogdG9vIG1hbnkgaW5wdXRzIHBlbmRpbmcgKCV6dSkgaW4gcGlwZWxpbmUsIHdpdGggaW5wdXRzIHJlbGVhc2VkICglenUpIiwKKyAgICAgICAgICAgICAgc2l6ZVdpdGhJbnB1dHNQZW5kaW5nLCBzaXplV2l0aElucHV0UmVsZWFzZWQpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgQUxPR1YoInBpcGVsaW5lIGhhcyByb29tICh0b3RhbDogJXp1LCBpbnB1dCByZWxlYXNlZDogJXp1KSIsCisgICAgICAgICAgbUZyYW1lc0luUGlwZWxpbmUuc2l6ZSgpLCBzaXplV2l0aElucHV0UmVsZWFzZWQpOworICAgIHJldHVybiBmYWxzZTsKK30KKworUGlwZWxpbmVXYXRjaGVyOjpDbG9jazo6ZHVyYXRpb24gUGlwZWxpbmVXYXRjaGVyOjplbGFwc2VkKAorICAgICAgICBjb25zdCBQaXBlbGluZVdhdGNoZXI6OkNsb2NrOjp0aW1lX3BvaW50ICZub3csIHNpemVfdCBuKSBjb25zdCB7CisgICAgaWYgKG1GcmFtZXNJblBpcGVsaW5lLnNpemUoKSA8PSBuKSB7CisgICAgICAgIHJldHVybiBDbG9jazo6ZHVyYXRpb246Onplcm8oKTsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8Q2xvY2s6OmR1cmF0aW9uPiBkdXJhdGlvbnM7CisgICAgZm9yIChjb25zdCBkZWNsdHlwZShtRnJhbWVzSW5QaXBlbGluZSk6OnZhbHVlX3R5cGUgJnZhbHVlIDogbUZyYW1lc0luUGlwZWxpbmUpIHsKKyAgICAgICAgQ2xvY2s6OmR1cmF0aW9uIGVsYXBzZWQgPSBub3cgLSB2YWx1ZS5zZWNvbmQucXVldWVkQXQ7CisgICAgICAgIEFMT0dWKCJlbGFwc2VkOiBmcmFtZUluZGV4ID0gJWxsdSBlbGFwc2VkID0gJWxsZG1zIiwKKyAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZyl2YWx1ZS5maXJzdCwKKyAgICAgICAgICAgICAgc3RkOjpjaHJvbm86OmR1cmF0aW9uX2Nhc3Q8c3RkOjpjaHJvbm86Om1pbGxpc2Vjb25kcz4oZWxhcHNlZCkuY291bnQoKSk7CisgICAgICAgIGR1cmF0aW9ucy5wdXNoX2JhY2soZWxhcHNlZCk7CisgICAgfQorICAgIHN0ZDo6bnRoX2VsZW1lbnQoZHVyYXRpb25zLmJlZ2luKCksIGR1cmF0aW9ucy5iZWdpbigpICsgbiwgZHVyYXRpb25zLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpncmVhdGVyPENsb2NrOjpkdXJhdGlvbj4oKSk7CisgICAgcmV0dXJuIGR1cmF0aW9uc1tuXTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9QaXBlbGluZVdhdGNoZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9QaXBlbGluZVdhdGNoZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZTIzMTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1BpcGVsaW5lV2F0Y2hlci5oCkBAIC0wLDAgKzEsMTM5IEBACisvKgorICogQ29weXJpZ2h0IDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFBJUEVMSU5FX1dBVENIRVJfSF8KKyNkZWZpbmUgUElQRUxJTkVfV0FUQ0hFUl9IXworCisjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxDMldvcmsuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFBpcGVsaW5lV2F0Y2hlciB3YXRjaGVzIHRoZSBwaXBlbGluZSBhbmQgaW5mZXJzIHRoZSBzdGF0dXMgb2Ygd29yayBpdGVtcyBmcm9tCisgKiBldmVudHMuCisgKi8KK2NsYXNzIFBpcGVsaW5lV2F0Y2hlciB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrIENsb2NrOworCisgICAgUGlwZWxpbmVXYXRjaGVyKCkKKyAgICAgICAgOiBtSW5wdXREZWxheSgwKSwKKyAgICAgICAgICBtUGlwZWxpbmVEZWxheSgwKSwKKyAgICAgICAgICBtT3V0cHV0RGVsYXkoMCksCisgICAgICAgICAgbVNtb290aG5lc3NGYWN0b3IoMCkge30KKyAgICB+UGlwZWxpbmVXYXRjaGVyKCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBuZXcgaW5wdXQgZGVsYXkgdmFsdWUKKyAgICAgKiBccmV0dXJuICB0aGlzIG9iamVjdAorICAgICAqLworICAgIFBpcGVsaW5lV2F0Y2hlciAmaW5wdXREZWxheSh1aW50MzJfdCB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIG5ldyBwaXBlbGluZSBkZWxheSB2YWx1ZQorICAgICAqIFxyZXR1cm4gIHRoaXMgb2JqZWN0CisgICAgICovCisgICAgUGlwZWxpbmVXYXRjaGVyICZwaXBlbGluZURlbGF5KHVpbnQzMl90IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgbmV3IG91dHB1dCBkZWxheSB2YWx1ZQorICAgICAqIFxyZXR1cm4gIHRoaXMgb2JqZWN0CisgICAgICovCisgICAgUGlwZWxpbmVXYXRjaGVyICZvdXRwdXREZWxheSh1aW50MzJfdCB2YWx1ZSk7CisKKyAgICAvKioKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIG5ldyBzbW9vdGhuZXNzIGZhY3RvciB2YWx1ZQorICAgICAqIFxyZXR1cm4gIHRoaXMgb2JqZWN0CisgICAgICovCisgICAgUGlwZWxpbmVXYXRjaGVyICZzbW9vdGhuZXNzRmFjdG9yKHVpbnQzMl90IHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIENsaWVudCBxdWV1ZWQgYSB3b3JrIGl0ZW0gdG8gdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmcmFtZUluZGV4ICBpbnB1dCBmcmFtZSBpbmRleCBvZiB0aGlzIHdvcmsKKyAgICAgKiBccGFyYW0gYnVmZmVycyAgICAgaW5wdXQgYnVmZmVycyBvZiB0aGUgcXVldWVkIHdvcmsgaXRlbQorICAgICAqIFxwYXJhbSBxdWV1ZWRBdCAgICB0aW1lIHdoZW4gdGhlIGNsaWVudCBxdWV1ZWQgdGhlIGJ1ZmZlcgorICAgICAqLworICAgIHZvaWQgb25Xb3JrUXVldWVkKAorICAgICAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4+ICYmYnVmZmVycywKKyAgICAgICAgICAgIGNvbnN0IENsb2NrOjp0aW1lX3BvaW50ICZxdWV1ZWRBdCk7CisKKyAgICAvKioKKyAgICAgKiBUaGUgY29tcG9uZW50IHJlbGVhc2VkIGlucHV0IGJ1ZmZlcnMgZnJvbSBhIHdvcmsgaXRlbS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmcmFtZUluZGV4ICBpbnB1dCBmcmFtZSBpbmRleAorICAgICAqIFxwYXJhbSBhcnJheUluZGV4ICBpbmRleCBvZiB0aGUgYnVmZmVyIGF0IHRoZSBvcmlnaW5hbCB8YnVmZmVyc3wgaW4KKyAgICAgKiAgICAgICAgICAgICAgICAgICAgb25Xb3JrUXVldWVkKCkuCisgICAgICogXHJldHVybiAgYnVmZmVyc1thcnJheUluZGV4XQorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gb25JbnB1dEJ1ZmZlclJlbGVhc2VkKAorICAgICAgICAgICAgdWludDY0X3QgZnJhbWVJbmRleCwgc2l6ZV90IGFycmF5SW5kZXgpOworCisgICAgLyoqCisgICAgICogVGhlIGNvbXBvbmVudCBmaW5pc2hlZCBwcm9jZXNzaW5nIGEgd29yayBpdGVtLgorICAgICAqCisgICAgICogXHBhcmFtIGZyYW1lSW5kZXggIGlucHV0IGZyYW1lIGluZGV4CisgICAgICovCisgICAgdm9pZCBvbldvcmtEb25lKHVpbnQ2NF90IGZyYW1lSW5kZXgpOworCisgICAgLyoqCisgICAgICogRmx1c2ggdGhlIHBpcGVsaW5lLgorICAgICAqLworICAgIHZvaWQgZmx1c2goKTsKKworICAgIC8qKgorICAgICAqIFxyZXR1cm4gIHRydWUgIGlmIHBpcGVsaW5lIGRvZXMgbm90IG5lZWQgbW9yZSB3b3JrIGl0ZW1zIHRvIHByb2NlZWQKKyAgICAgKiAgICAgICAgICAgICAgICBzbW9vdGhseSwgY29uc2lkZXJpbmcgZGVsYXlzIGFuZCBzbW9vdGhuZXNzIGZhY3RvcjsKKyAgICAgKiAgICAgICAgICBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbCBwaXBlbGluZUZ1bGwoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybiBlbGFwc2VkIHByb2Nlc3NpbmcgdGltZSBvZiBhIHdvcmsgaXRlbSwgbnRoIGZyb20gdGhlIGxvbmdlc3QKKyAgICAgKiBwcm9jZXNzaW5nIHRpbWUgdG8gdGhlIHNob3J0ZXN0LgorICAgICAqCisgICAgICogXHBhcmFtIG5vdyBjdXJyZW50IHRpbWVzdGFtcAorICAgICAqIFxwYXJhbSBuICAgbnRoIHdvcmsgaXRlbSwgZnJvbSB0aGUgbG9uZ2VzdCBwcm9jZXNzaW5nIHRpbWUgdG8gdGhlCisgICAgICogICAgICAgICAgICBzaG9ydGVzdC4gSXQncyBhIDAtYmFzZWQgaW5kZXguCisgICAgICogXHJldHVybiAgZWxhcHNlZCBwcm9jZXNzaW5nIHRpbWUgb2YgbnRoIHdvcmsgaXRlbS4KKyAgICAgKi8KKyAgICBDbG9jazo6ZHVyYXRpb24gZWxhcHNlZChjb25zdCBDbG9jazo6dGltZV9wb2ludCAmbm93LCBzaXplX3QgbikgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgdWludDMyX3QgbUlucHV0RGVsYXk7CisgICAgdWludDMyX3QgbVBpcGVsaW5lRGVsYXk7CisgICAgdWludDMyX3QgbU91dHB1dERlbGF5OworICAgIHVpbnQzMl90IG1TbW9vdGhuZXNzRmFjdG9yOworCisgICAgc3RydWN0IEZyYW1lIHsKKyAgICAgICAgRnJhbWUoc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gJiZiLAorICAgICAgICAgICAgICBjb25zdCBDbG9jazo6dGltZV9wb2ludCAmcSkKKyAgICAgICAgICAgIDogYnVmZmVycyhiKSwKKyAgICAgICAgICAgICAgcXVldWVkQXQocSkge30KKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPj4gYnVmZmVyczsKKyAgICAgICAgY29uc3QgQ2xvY2s6OnRpbWVfcG9pbnQgcXVldWVkQXQ7CisgICAgfTsKKyAgICBzdGQ6Om1hcDx1aW50NjRfdCwgRnJhbWU+IG1GcmFtZXNJblBpcGVsaW5lOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBQSVBFTElORV9XQVRDSEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1YjBlYzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmNwcApAQCAtMCwwICsxLDU4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiUmVmbGVjdGVkUGFyYW1VcGRhdGVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQYXJhbUludGVybmFsLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorCisjaW5jbHVkZSAiUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RkOjpzdHJpbmcgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0OjpkZWJ1Z1N0cmluZyhzaXplX3QgaW5kZW50XykgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nIGluZGVudChpbmRlbnRfLCAnICcpOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHM7CisgICAgcyA8PCAiRGljdCB7IiA8PCBzdGQ6OmVuZGw7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0IDogKnRoaXMpIHsKKyAgICAgICAgcyA8PCBpbmRlbnQgPDwgIiAgIjsKKworICAgICAgICBDMlZhbHVlIGMyVmFsdWU7CisgICAgICAgIGludDMyX3QgaW50MzJWYWx1ZTsKKyAgICAgICAgdWludDMyX3QgdWludDMyVmFsdWU7CisgICAgICAgIGludDY0X3QgaW50NjRWYWx1ZTsKKyAgICAgICAgdWludDY0X3QgdWludDY0VmFsdWU7CisgICAgICAgIGZsb2F0IGZsb2F0VmFsdWU7CisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZlZhbHVlOworICAgICAgICBBU3RyaW5nIHN0clZhbHVlOworICAgICAgICBpZiAoaXQuc2Vjb25kLmZpbmQoJmMyVmFsdWUpKSB7CisgICAgICAgICAgICBzd2l0Y2ggKGMyVmFsdWUudHlwZSgpKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDMlZhbHVlOjpJTlQzMjoKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpYzJWYWx1ZS5nZXQoJmludDMyVmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzIDw8ICJjMjo6aTMyICIgPDwgaXQuZmlyc3QgPDwgIiA9ICIgPDwgaW50MzJWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMlZhbHVlOjpVSU5UMzI6CisgICAgICAgICAgICAgICAgICAgICh2b2lkKWMyVmFsdWUuZ2V0KCZ1aW50MzJWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHMgPDwgImMyOjp1MzIgIiA8PCBpdC5maXJzdCA8PCAiID0gIiA8PCB1aW50MzJWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMlZhbHVlOjpDTlRSMzI6CisgICAgICAgICAgICAgICAgICAgIC8vIGR1bXAgY291bnRlciB2YWx1ZSBhcyB1bnNpZ25lZAorICAgICAgICAgICAgICAgICAgICAodm9pZCljMlZhbHVlLmdldCgoYzJfY250cjMyX3QqKSZ1aW50MzJWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHMgPDwgImMyOjpjMzIgIiA8PCBpdC5maXJzdCA8PCAiID0gIiA8PCB1aW50MzJWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMlZhbHVlOjpJTlQ2NDoKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpYzJWYWx1ZS5nZXQoJmludDY0VmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzIDw8ICJjMjo6aTY0ICIgPDwgaXQuZmlyc3QgPDwgIiA9ICIgPDwgaW50NjRWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMlZhbHVlOjpVSU5UNjQ6CisgICAgICAgICAgICAgICAgICAgICh2b2lkKWMyVmFsdWUuZ2V0KCZ1aW50NjRWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHMgPDwgImMyOjp1NjQgIiA8PCBpdC5maXJzdCA8PCAiID0gIiA8PCB1aW50NjRWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMlZhbHVlOjpDTlRSNjQ6CisgICAgICAgICAgICAgICAgICAgIC8vIGR1bXAgY291bnRlciB2YWx1ZSBhcyB1bnNpZ25lZAorICAgICAgICAgICAgICAgICAgICAodm9pZCljMlZhbHVlLmdldCgoYzJfY250cjY0X3QqKSZ1aW50NjRWYWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHMgPDwgImMyOjpjNjQgIiA8PCBpdC5maXJzdCA8PCAiID0gIiA8PCB1aW50NjRWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMlZhbHVlOjpGTE9BVDoKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpYzJWYWx1ZS5nZXQoJmZsb2F0VmFsdWUpOworICAgICAgICAgICAgICAgICAgICBzIDw8ICJjMjo6ZmxvYXQgIiA8PCBpdC5maXJzdCA8PCAiID0gIiA8PCBmbG9hdFZhbHVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBkdW1wIHVuc3VwcG9ydGVkIHZhbHVlcyBmb3IgZGVidWdnaW5nLCB0aGVzZSBzaG91bGQgbm90IGJlIHVzZWQKKyAgICAgICAgICAgICAgICAgICAgcyA8PCAiYzI6OnVuc3VwcG9ydGVkICIgPDwgaXQuZmlyc3Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoaXQuc2Vjb25kLmZpbmQoJmludDMyVmFsdWUpKSB7CisgICAgICAgICAgICBzIDw8ICJpbnQzMl90ICIgPDwgaXQuZmlyc3QgPDwgIiA9ICIgPDwgaW50MzJWYWx1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChpdC5zZWNvbmQuZmluZCgmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgICAgIHMgPDwgImludDY0X3QgIiA8PCBpdC5maXJzdCA8PCAiID0gIiA8PCBpbnQ2NFZhbHVlOworICAgICAgICB9IGVsc2UgaWYgKGl0LnNlY29uZC5maW5kKCZzdHJWYWx1ZSkpIHsKKyAgICAgICAgICAgIHMgPDwgInN0cmluZyAiIDw8IGl0LmZpcnN0IDw8ICIgPSBcIiIgPDwgc3RyVmFsdWUuY19zdHIoKSA8PCAiXCIiOworICAgICAgICB9IGVsc2UgaWYgKGl0LnNlY29uZC5maW5kKCZidWZWYWx1ZSkpIHsKKyAgICAgICAgICAgIHMgPDwgIkJ1ZmZlciAiIDw8IGl0LmZpcnN0IDw8ICIgPSAiOworICAgICAgICAgICAgaWYgKGJ1ZlZhbHVlICE9IG51bGxwdHIgJiYgYnVmVmFsdWUtPmRhdGEoKSAhPSBudWxscHRyICYmIGJ1ZlZhbHVlLT5zaXplKCkgPD0gNjQpIHsKKyAgICAgICAgICAgICAgICBzIDw8ICJ7IiA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgICAgICAgQVN0cmluZyB0bXA7CisgICAgICAgICAgICAgICAgaGV4ZHVtcChidWZWYWx1ZS0+ZGF0YSgpLCBidWZWYWx1ZS0+c2l6ZSgpLCBpbmRlbnRfICsgNCwgJnRtcCk7CisgICAgICAgICAgICAgICAgcyA8PCB0bXAuY19zdHIoKSA8PCBpbmRlbnQgPDwgIiAgfSI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHMgPDwgKHZvaWQqKWJ1ZlZhbHVlLmdldCgpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gZHVtcCB1bnN1cHBvcnRlZCB2YWx1ZXMgZm9yIGRlYnVnZ2luZywgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLgorICAgICAgICAgICAgcyA8PCAidW5zdXBwb3J0ZWQgIiA8PCBpdC5maXJzdDsKKyAgICAgICAgfQorICAgICAgICBzIDw8IHN0ZDo6ZW5kbDsKKyAgICB9CisgICAgcyA8PCBpbmRlbnQgPDwgIn0iOworCisgICAgcmV0dXJuIHMuc3RyKCk7Cit9CisKK3ZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjphZGRQYXJhbURlc2MoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAmcGFyYW1EZXNjcykgeworICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiAmZGVzYyA6IHBhcmFtRGVzY3MpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gc3RydWN0RGVzYyA9IHJlZmxlY3Rvci0+ZGVzY3JpYmUoCisgICAgICAgICAgICAgICAgZGVzYy0+aW5kZXgoKS5jb3JlSW5kZXgoKSk7CisgICAgICAgIGlmIChzdHJ1Y3REZXNjID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJDb3VsZCBub3QgZGVzY3JpYmUgJXMiLCBkZXNjLT5uYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBhZGRQYXJhbURlc2MoZGVzYywgKnN0cnVjdERlc2MsIHJlZmxlY3RvciwgdHJ1ZSAvKiBtYXJrVmVuZG9yICovKTsKKyAgICB9CisKKyAgICAvLyBURU1QOiBhbHNvIGFkZCB2ZW5kb3IgcGFyYW1ldGVycyBhcyBub24tdmVuZG9yCisgICAgZm9yIChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+ICZkZXNjIDogcGFyYW1EZXNjcykgeworICAgICAgICBpZiAoIWRlc2MtPmluZGV4KCkuaXNWZW5kb3IoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gc3RydWN0RGVzYyA9IHJlZmxlY3Rvci0+ZGVzY3JpYmUoCisgICAgICAgICAgICAgICAgZGVzYy0+aW5kZXgoKS5jb3JlSW5kZXgoKSk7CisgICAgICAgIGlmIChzdHJ1Y3REZXNjKSB7CisgICAgICAgICAgICBhZGRQYXJhbURlc2MoZGVzYywgKnN0cnVjdERlc2MsIHJlZmxlY3RvciwgZmFsc2UgLyogbWFya1ZlbmRvciAqLyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjphZGRQYXJhbVN0cnVjdERlc2MoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4gZGVzYywKKyAgICAgICAgQzJTdHJpbmcgcGF0aCwKKyAgICAgICAgc2l6ZV90IG9mZnNldCwKKyAgICAgICAgY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yICZzdHJ1Y3REZXNjLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvcikgeworICAgIGZvciAoYXV0byBpdCA9IHN0cnVjdERlc2MuYmVnaW4oKTsgaXQgIT0gc3RydWN0RGVzYy5lbmQoKTsgKytpdCkgeworICAgICAgICBDMlN0cmluZyBmaWVsZE5hbWUgPSBwYXRoICsgIi4iICsgaXQtPm5hbWUoKTsKKyAgICAgICAgaWYgKGl0LT50eXBlKCkgJiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgIGlmIChyZWZsZWN0b3IgPT0gbnVsbHB0ciB8fCBpdC0+ZXh0ZW50KCkgIT0gMSkgeworICAgICAgICAgICAgICAgIEFMT0dEKCJpZ25vcmVkIHN0cnVjdCBmaWVsZCAlcyIsIGZpZWxkTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IHN0cnVjdERlc2NfID0gcmVmbGVjdG9yLT5kZXNjcmliZSgKKyAgICAgICAgICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4KGl0LT50eXBlKCkpLmNvcmVJbmRleCgpKTsKKyAgICAgICAgICAgIGlmIChzdHJ1Y3REZXNjXyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIkNvdWxkIG5vdCBkZXNjcmliZSBzdHJ1Y3R1cmUgb2YgJXMiLCBmaWVsZE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRQYXJhbVN0cnVjdERlc2MoZGVzYywgZmllbGROYW1lLCBvZmZzZXQgKyBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KCppdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0cnVjdERlc2NfLCByZWZsZWN0b3IpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyB2ZXJpZnkgZXh0ZW50IGFuZCB0eXBlCisgICAgICAgIHN3aXRjaCAoaXQtPnR5cGUoKSkgeworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UMzI6CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UMzI6CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSMzI6CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQ2NDoKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDoKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFI2NDoKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkZMT0FUOgorICAgICAgICAgICAgICAgIGlmIChpdC0+ZXh0ZW50KCkgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiZXh0ZW50KCkgIT0gMSBmb3Igc2luZ2xlIHZhbHVlIHR5cGU6ICVzIiwgZmllbGROYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpTVFJJTkc6CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dEKCJVbnJlY29nbml6ZWQgdHlwZTogJXMiLCBmaWVsZE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiJXMgcmVnaXN0ZXJlZCIsIGZpZWxkTmFtZS5jX3N0cigpKTsKKyAgICAgICAgLy8gVE9ETzogZ2V0IHRoZSBwcm9wZXIgc2l6ZSBieSBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgZmllbGRzLgorICAgICAgICAvLyBvbmx5IGluc2VydCBmaWVsZHMgdGhlIHZlcnkgZmlyc3QgdGltZQorICAgICAgICBtTWFwLmVtcGxhY2UoZmllbGROYW1lLCBGaWVsZERlc2MgeworICAgICAgICAgICAgZGVzYywKKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8QzJGaWVsZERlc2NyaXB0b3I+KAorICAgICAgICAgICAgICAgICAgICBpdC0+dHlwZSgpLCBpdC0+ZXh0ZW50KCksIGl0LT5uYW1lKCksCisgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoKml0KSwKKyAgICAgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUoKml0KSksCisgICAgICAgICAgICBvZmZzZXQsCisgICAgICAgIH0pOworICAgIH0KK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmFkZFBhcmFtRGVzYygKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBkZXNjLCBjb25zdCBDMlN0cnVjdERlc2NyaXB0b3IgJnN0cnVjdERlc2MsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yLCBib29sIG1hcmtWZW5kb3IpIHsKKyAgICBDMlN0cmluZyBwYXJhbU5hbWUgPSBkZXNjLT5uYW1lKCk7CisKKyAgICAvLyBEbyBub3QgcmVmbGVjdCByZXF1ZXN0ZWQgcGFyYW1ldGVycworICAgIC8vIFRPRE86IHNwbGl0IHRoZXNlIG9uY2UgYWxpYXNlcyBhcmUgaW50cm9kdWNlZCBpbnRvICcuYWN0dWFsJyBhbmQgJy5yZXF1ZXN0ZWQnIGFuZCBhbGlhcworICAgIC8vIHRoZSBuYW1lIHRvICcuYWN0dWFsJy4KKyAgICBpZiAoZGVzYy0+aW5kZXgoKSAmIEMyUGFyYW06OkNvcmVJbmRleDo6SVNfUkVRVUVTVF9GTEFHKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBwcmVmaXggdmVuZG9yIHBhcmFtZXRlcnMKKyAgICBpZiAoZGVzYy0+aW5kZXgoKS5pc1ZlbmRvcigpICYmIG1hcmtWZW5kb3IpIHsKKyAgICAgICAgcGFyYW1OYW1lID0gInZlbmRvci4iICsgcGFyYW1OYW1lOworICAgIH0KKyAgICBtUGFyYW1OYW1lcy5lbXBsYWNlKGRlc2MtPmluZGV4KCksIHBhcmFtTmFtZSk7CisKKyAgICAvLyBhbHNvIGFsbG93IHNldHRpbmcgd2hvbGUgcGFyYW1ldGVycyBpbiBhIGJpbmFyeSBmYXNoaW9uIHZpYSBCeXRlQnVmZmVyCisgICAgLy8gdGhpcyBpcyBvcHQtaW4gZm9yIG5vdworICAgIGF1dG8gaXQgPSBtV2hvbGVQYXJhbXMuZmluZChwYXJhbU5hbWUpOworICAgIGlmIChpdCAhPSBtV2hvbGVQYXJhbXMuZW5kKCkgJiYgaXQtPnNlY29uZC5jb3JlSW5kZXgoKSA9PSBkZXNjLT5pbmRleCgpLmNvcmVJbmRleCgpKSB7CisgICAgICAgIG1NYXAuZW1wbGFjZShwYXJhbU5hbWUsIEZpZWxkRGVzY3sgZGVzYywgbnVsbHB0ciwgMCAvKiBvZmZzZXQgKi8gfSk7CisgICAgICAgIC8vIGRvbid0IGFkZCBmaWVsZHMgb2Ygd2hvbGUgcGFyYW1ldGVycy4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGFkZFBhcmFtU3RydWN0RGVzYyhkZXNjLCBwYXJhbU5hbWUsIDAgLyogb2Zmc2V0ICovLCBzdHJ1Y3REZXNjLCByZWZsZWN0b3IpOworfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6c3VwcG9ydFdob2xlUGFyYW0oc3RkOjpzdHJpbmcgbmFtZSwgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4KSB7CisgICAgbVdob2xlUGFyYW1zLmVtcGxhY2UobmFtZSwgaW5kZXgpOworfQorCitzdGQ6OnN0cmluZyBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmdldFBhcmFtTmFtZShDMlBhcmFtOjpJbmRleCBpbmRleCkgY29uc3QgeworICAgIGF1dG8gaXQgPSBtUGFyYW1OYW1lcy5maW5kKGluZGV4KTsKKyAgICBpZiAoaXQgIT0gbVBhcmFtTmFtZXMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmdzdHJlYW0gcmV0OworICAgIHJldCA8PCAiPHVua25vd24gIiA8PCBpbmRleCA8PCAiPiI7CisgICAgcmV0dXJuIHJldC5zdHIoKTsKK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmdldFBhcmFtSW5kaWNlc0Zyb21NZXNzYWdlKAorICAgICAgICBjb25zdCBEaWN0ICZwYXJhbXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAqdmVjIC8qIG5vbm51bGwgKi8pIGNvbnN0IHsKKyAgICBDSEVDSyh2ZWMgIT0gbnVsbHB0cik7CisgICAgdmVjLT5jbGVhcigpOworICAgIHN0ZDo6c2V0PEMyUGFyYW06OkluZGV4PiBpbmRpY2VzOworICAgIHBhcnNlTWVzc2FnZUFuZERvV29yaygKKyAgICAgICAgICAgIHBhcmFtcywKKyAgICAgICAgICAgIFsmaW5kaWNlc10oY29uc3Qgc3RkOjpzdHJpbmcgJiwgY29uc3QgRmllbGREZXNjICZkZXNjLCBjb25zdCB2b2lkICosIHNpemVfdCkgeworICAgICAgICAgICAgICAgIGluZGljZXMuaW5zZXJ0KGRlc2MucGFyYW1EZXNjLT5pbmRleCgpKTsKKyAgICAgICAgICAgIH0pOworICAgIGZvciAoY29uc3QgQzJQYXJhbTo6SW5kZXggJmluZGV4IDogaW5kaWNlcykgeworICAgICAgICB2ZWMtPnB1c2hfYmFjayhpbmRleCk7CisgICAgfQorfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6Z2V0UGFyYW1JbmRpY2VzRm9yS2V5cygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZrZXlzLAorICAgICAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gKnZlYyAvKiBub25udWxsICovKSBjb25zdCB7CisgICAgQ0hFQ0sodmVjICE9IG51bGxwdHIpOworICAgIHZlYy0+Y2xlYXIoKTsKKyAgICBzdGQ6OnNldDxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKworICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBrZXlNYXAoa2V5cy5iZWdpbigpLCBrZXlzLmVuZCgpKTsKKworICAgIEFMT0dWKCJpbiBnZXRQYXJhbUluZGljZXNGb3JLZXlzIHdpdGggJXp1IGtleXMgYW5kIG1hcCBvZiAlenUgZW50cmllcyIsCisgICAgICAgICAgICBrZXlNYXAuc2l6ZSgpLCBtTWFwLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBzdGQ6OnBhaXI8Y29uc3Qgc3RkOjpzdHJpbmcsIEZpZWxkRGVzYz4gJmt2IDogbU1hcCkgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSA9IGt2LmZpcnN0OworICAgICAgICBjb25zdCBGaWVsZERlc2MgJmRlc2MgPSBrdi5zZWNvbmQ7CisgICAgICAgIEFMT0dWKCJjb3VudCBvZiAlcyBpcyAlenUiLCBuYW1lLmNfc3RyKCksIGtleU1hcC5jb3VudChuYW1lKSk7CisgICAgICAgIGlmIChrZXlNYXAuY291bnQobmFtZSkgPiAwKSB7CisgICAgICAgICAgICBpbmRpY2VzLmluc2VydChkZXNjLnBhcmFtRGVzYy0+aW5kZXgoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4ICZpbmRleCA6IGluZGljZXMpIHsKKyAgICAgICAgdmVjLT5wdXNoX2JhY2soaW5kZXgpOworICAgIH0KK30KKwordm9pZCBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKAorICAgICAgICBjb25zdCBEaWN0ICZwYXJhbXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKnZlYyAvKiBub25udWxsICovKSBjb25zdCB7CisgICAgQ0hFQ0sodmVjICE9IG51bGxwdHIpOworCisgICAgc3RkOjptYXA8QzJQYXJhbTo6SW5kZXgsIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPio+IHBhcmFtc01hcDsKKyAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiAmcGFyYW0gOiAqdmVjKSB7CisgICAgICAgIGlmIChwYXJhbSAmJiAqcGFyYW0pIHsKKyAgICAgICAgICAgIHBhcmFtc01hcFtwYXJhbS0+aW5kZXgoKV0gPSAmcGFyYW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBwYXJzZU1lc3NhZ2VBbmREb1dvcmsoCisgICAgICAgICAgICBwYXJhbXMsCisgICAgICAgICAgICBbJnBhcmFtc01hcF0oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGNvbnN0IEZpZWxkRGVzYyAmZGVzYywgY29uc3Qgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiAqcGFyYW0gPSBudWxscHRyOworICAgICAgICAgICAgICAgIGF1dG8gcGFyYW1JdCA9IHBhcmFtc01hcC5maW5kKGRlc2MucGFyYW1EZXNjLT5pbmRleCgpKTsKKyAgICAgICAgICAgICAgICBpZiAocGFyYW1JdCA9PSBwYXJhbXNNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIiVzIGZvdW5kLCBidXQgcGFyYW0gIyVkIGlzbid0IHByZXNlbnQgdG8gdXBkYXRlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksIChpbnQzMl90KWRlc2MucGFyYW1EZXNjLT5pbmRleCgpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwYXJhbSA9IHBhcmFtSXQtPnNlY29uZDsKKworICAgICAgICAgICAgICAgIHN0cnVjdCBfQzJQYXJhbSA6IHB1YmxpYyBDMlBhcmFtIHsKKyAgICAgICAgICAgICAgICAgICAgdXNpbmcgQzJQYXJhbTo6QzJQYXJhbTsKKyAgICAgICAgICAgICAgICAgICAgX0MyUGFyYW0odWludDMyX3Qgc2l6ZSwgdWludDMyX3QgaW5kZXgpIDogQzJQYXJhbShzaXplLCBpbmRleCkgeyB9CisgICAgICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgICAgIC8vIHdlIHdpbGwgaGFuZGxlIHdob2xlIHBhcmFtIHVwZGF0ZXMgYXMgcGFydCBvZiBhIGZsZXhpYmxlIHBhcmFtIHVwZGF0ZSB1c2luZworICAgICAgICAgICAgICAgIC8vIGEgemVybyBvZmZzZXQuCisgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgc2l6ZV90IG1pbk9mZnNldCA9IDA7CisKKyAgICAgICAgICAgICAgICAvLyBpZiB0aGlzIGRlc2NyaXB0b3IgaGFzIGEgZmllbGQsIHVzZSB0aGUgb2Zmc2V0IGFuZCBzaXplIGFuZCBlbnN1cmUgdGhhdCBvZmZzZXQKKyAgICAgICAgICAgICAgICAvLyBpcyBub3QgcGFydCBvZiB0aGUgaGVhZGVyCisgICAgICAgICAgICAgICAgaWYgKGRlc2MuZmllbGREZXNjKSB7CisgICAgICAgICAgICAgICAgICAgIG1pbk9mZnNldCA9IHNpemVvZihDMlBhcmFtKTsKKyAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gc2l6ZW9mKEMyUGFyYW0pICsgZGVzYy5vZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoKmRlc2MuZmllbGREZXNjKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyByZWFsbG9jYXRlIG9yIHRyaW0gZmxleGlibGUgcGFyYW0gKG9yIHdob2xlIHBhcmFtKSBhcyBuZWNlc3NhcnkKKyAgICAgICAgICAgICAgICBpZiAoIWRlc2MuZmllbGREZXNjIC8qIHdob2xlIHBhcmFtICovIHx8IGRlc2MuZmllbGREZXNjLT5leHRlbnQoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHJlYWxsb2NhdGUgcGFyYW0gaWYgbW9yZSBzcGFjZSBpcyBuZWVkZWQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmFtLT5nZXQoKS0+c2l6ZSgpIDwgb2Zmc2V0ICsgc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemUgPiBJTlQzMl9NQVggLSBvZmZzZXQgfHwgb2Zmc2V0IDwgbWluT2Zmc2V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSB0b28gbG9uZyBvciBvZmZzZXQgdG9vIGVhcmx5IC0gYWJhbmRvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGFyYW0gKm5ld1BhcmFtID0gKEMyUGFyYW0gKik6Om9wZXJhdG9yIG5ldyhvZmZzZXQgKyBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ldyAobmV3UGFyYW0pIF9DMlBhcmFtKG9mZnNldCArIHNpemUsIHBhcmFtLT5nZXQoKS0+aW5kZXgoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ID4gc2l6ZW9mKEMyUGFyYW0pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KG5ld1BhcmFtICsgMSwgcGFyYW0tPmdldCgpICsgMSwgb2Zmc2V0IC0gc2l6ZW9mKEMyUGFyYW0pKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtLT5yZXNldChuZXdQYXJhbSk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGFyYW0tPmdldCgpLT5zaXplKCkgPiBvZmZzZXQgKyBzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmltIHBhcmFtZXRlciBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6VHJpbVBhcmFtKHBhcmFtLT5nZXQoKSwgb2Zmc2V0ICsgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGRlc2MuZmllbGREZXNjLT50eXBlKCkgPT0gQzJGaWVsZERlc2NyaXB0b3I6OkJMT0IpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gemVybyBmaWxsIGJsb2JzIGlmIHVwZGF0aW5nIHdpdGggc21hbGxlciBibG9iCisgICAgICAgICAgICAgICAgICAgIGlmIChkZXNjLmZpZWxkRGVzYy0+ZXh0ZW50KCkgPiBzaXplKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoKHVpbnQ4X3QgKikocGFyYW0tPmdldCgpKSArIG9mZnNldCArIHNpemUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy5maWVsZERlc2MtPmV4dGVudCgpIC0gc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtZW1jcHkoKHVpbnQ4X3QgKikocGFyYW0tPmdldCgpKSArIG9mZnNldCwgcHRyLCBzaXplKTsKKyAgICAgICAgICAgIH0pOworfQorCit2b2lkIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6cGFyc2VNZXNzYWdlQW5kRG9Xb3JrKAorICAgICAgICBjb25zdCBEaWN0ICZwYXJhbXMsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnN0cmluZyAmLCBjb25zdCBGaWVsZERlc2MgJiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpPiB3b3JrKSBjb25zdCB7CisgICAgZm9yIChjb25zdCBzdGQ6OnBhaXI8Y29uc3Qgc3RkOjpzdHJpbmcsIEZpZWxkRGVzYz4gJmt2IDogbU1hcCkgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSA9IGt2LmZpcnN0OworICAgICAgICBjb25zdCBGaWVsZERlc2MgJmRlc2MgPSBrdi5zZWNvbmQ7CisgICAgICAgIGF1dG8gcGFyYW0gPSBwYXJhbXMuZmluZChuYW1lKTsKKyAgICAgICAgaWYgKHBhcmFtID09IHBhcmFtcy5lbmQoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBoYW5kbGUgd2hvbGUgcGFyYW1ldGVycworICAgICAgICBpZiAoIWRlc2MuZmllbGREZXNjKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiB0bXA7CisgICAgICAgICAgICBpZiAocGFyYW0tPnNlY29uZC5maW5kKCZ0bXApICYmIHRtcCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQzJQYXJhbSAqdG1wQXNQYXJhbSA9IEMyUGFyYW06OkZyb20odG1wLT5kYXRhKCksIHRtcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBpZiAodG1wQXNQYXJhbSAmJiB0bXBBc1BhcmFtLT50eXBlKCkudHlwZSgpID09IGRlc2MucGFyYW1EZXNjLT5pbmRleCgpLnR5cGUoKSkgeworICAgICAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsIHRtcC0+ZGF0YSgpLCB0bXAtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlBhcmFtIGJsb2IgZG9lcyBub3QgbWF0Y2ggcGFyYW0gZm9yICclcycgKCVwLCAleCB2cyAleCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwgdG1wQXNQYXJhbSwgdG1wQXNQYXJhbSA/IHRtcEFzUGFyYW0tPnR5cGUoKS50eXBlKCkgOiAweERFQUR1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MucGFyYW1EZXNjLT5pbmRleCgpLnR5cGUoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90IGludDMyVmFsdWU7CisgICAgICAgIGludDY0X3QgaW50NjRWYWx1ZTsKKyAgICAgICAgQzJWYWx1ZSBjMlZhbHVlOworCisgICAgICAgIEMyRmllbGREZXNjcmlwdG9yOjp0eXBlX3QgZmllbGRUeXBlID0gZGVzYy5maWVsZERlc2MtPnR5cGUoKTsKKyAgICAgICAgc2l6ZV90IGZpZWxkRXh0ZW50ID0gZGVzYy5maWVsZERlc2MtPmV4dGVudCgpOworICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkgeworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UMzI6CisgICAgICAgICAgICAgICAgaWYgKChwYXJhbS0+c2Vjb25kLmZpbmQoJmMyVmFsdWUpICYmIGMyVmFsdWUuZ2V0KCZpbnQzMlZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBhcmFtLT5zZWNvbmQuZmluZCgmaW50MzJWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCAmaW50MzJWYWx1ZSwgc2l6ZW9mKGludDMyVmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UMzI6CisgICAgICAgICAgICAgICAgaWYgKChwYXJhbS0+c2Vjb25kLmZpbmQoJmMyVmFsdWUpICYmIGMyVmFsdWUuZ2V0KCh1aW50MzJfdCopJmludDMyVmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW0tPnNlY29uZC5maW5kKCZpbnQzMlZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsICZpbnQzMlZhbHVlLCBzaXplb2YoaW50MzJWYWx1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFIzMjoKKyAgICAgICAgICAgICAgICBpZiAoKHBhcmFtLT5zZWNvbmQuZmluZCgmYzJWYWx1ZSkgJiYgYzJWYWx1ZS5nZXQoKGMyX2NudHIzMl90KikmaW50MzJWYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbS0+c2Vjb25kLmZpbmQoJmludDMyVmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgJmludDMyVmFsdWUsIHNpemVvZihpbnQzMlZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UNjQ6CisgICAgICAgICAgICAgICAgaWYgKChwYXJhbS0+c2Vjb25kLmZpbmQoJmMyVmFsdWUpICYmIGMyVmFsdWUuZ2V0KCZpbnQ2NFZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IHBhcmFtLT5zZWNvbmQuZmluZCgmaW50NjRWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCAmaW50NjRWYWx1ZSwgc2l6ZW9mKGludDY0VmFsdWUpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UNjQ6CisgICAgICAgICAgICAgICAgaWYgKChwYXJhbS0+c2Vjb25kLmZpbmQoJmMyVmFsdWUpICYmIGMyVmFsdWUuZ2V0KCh1aW50NjRfdCopJmludDY0VmFsdWUpKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgcGFyYW0tPnNlY29uZC5maW5kKCZpbnQ2NFZhbHVlKSkgeworICAgICAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsICZpbnQ2NFZhbHVlLCBzaXplb2YoaW50NjRWYWx1ZSkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFI2NDoKKyAgICAgICAgICAgICAgICBpZiAoKHBhcmFtLT5zZWNvbmQuZmluZCgmYzJWYWx1ZSkgJiYgYzJWYWx1ZS5nZXQoKGMyX2NudHI2NF90KikmaW50NjRWYWx1ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICB8fCBwYXJhbS0+c2Vjb25kLmZpbmQoJmludDY0VmFsdWUpKSB7CisgICAgICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgJmludDY0VmFsdWUsIHNpemVvZihpbnQ2NFZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6IHsKKyAgICAgICAgICAgICAgICBmbG9hdCB0bXA7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtLT5zZWNvbmQuZmluZCgmYzJWYWx1ZSkgJiYgYzJWYWx1ZS5nZXQoJnRtcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgd29yayhuYW1lLCBkZXNjLCAmdG1wLCBzaXplb2YodG1wKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOiB7CisgICAgICAgICAgICAgICAgQVN0cmluZyB0bXA7CisgICAgICAgICAgICAgICAgaWYgKCFwYXJhbS0+c2Vjb25kLmZpbmQoJnRtcCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChmaWVsZEV4dGVudCA+IDAgJiYgdG1wLnNpemUoKSA+PSBmaWVsZEV4dGVudCkgeworICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIHRydW5jYXRlZCh0bXAsIDAsIGZpZWxkRXh0ZW50IC0gMSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJTdHJpbmcgdmFsdWUgdG9vIGxvbmcgdG8gZml0OiBvcmlnaW5hbCBcIiVzXCIgdHJ1bmNhdGVkIHRvIFwiJXNcIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG1wLmNfc3RyKCksIHRydW5jYXRlZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wID0gdHJ1bmNhdGVkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB3b3JrKG5hbWUsIGRlc2MsIHRtcC5jX3N0cigpLCB0bXAuc2l6ZSgpICsgMSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkJMT0I6IHsKKyAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiB0bXA7CisgICAgICAgICAgICAgICAgaWYgKCFwYXJhbS0+c2Vjb25kLmZpbmQoJnRtcCkgfHwgdG1wID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKGZpZWxkRXh0ZW50ID4gMCAmJiB0bXAtPnNpemUoKSA+IGZpZWxkRXh0ZW50KSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJCbG9iIHZhbHVlIHRvbyBsb25nIHRvIGZpdC4gVHJ1bmNhdGluZy4iKTsKKyAgICAgICAgICAgICAgICAgICAgdG1wLT5zZXRSYW5nZSh0bXAtPm9mZnNldCgpLCBmaWVsZEV4dGVudCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHdvcmsobmFtZSwgZGVzYywgdG1wLT5kYXRhKCksIHRtcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRCgiVW5zdXBwb3J0ZWQgZGF0YSB0eXBlIGZvciAlcyIsIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1JlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdAorUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpnZXRQYXJhbXMoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAmcGFyYW1zXykgY29uc3QgeworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbXM7CisgICAgcGFyYW1zLnJlc2l6ZShwYXJhbXNfLnNpemUoKSk7CisgICAgc3RkOjp0cmFuc2Zvcm0ocGFyYW1zXy5iZWdpbigpLCBwYXJhbXNfLmVuZCgpLCBwYXJhbXMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICBbXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4mIHApIC0+IEMyUGFyYW0qIHsgcmV0dXJuIHAuZ2V0KCk7IH0pOworICAgIHJldHVybiBnZXRQYXJhbXMocGFyYW1zKTsKK30KKworUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0CitSZWZsZWN0ZWRQYXJhbVVwZGF0ZXI6OmdldFBhcmFtcyhjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcykgY29uc3QgeworICAgIERpY3QgcmV0OworCisgICAgLy8gY29udmVydCB2ZWN0b3IgdG8gbWFwCisgICAgc3RkOjptYXA8QzJQYXJhbTo6SW5kZXgsIEMyUGFyYW0gKj4gcGFyYW1zTWFwOworICAgIGZvciAoQzJQYXJhbSAqcGFyYW0gOiBwYXJhbXMpIHsKKyAgICAgICAgaWYgKHBhcmFtICE9IG51bGxwdHIgJiYgKnBhcmFtKSB7CisgICAgICAgICAgICBwYXJhbXNNYXBbcGFyYW0tPmluZGV4KCldID0gcGFyYW07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IHN0ZDo6cGFpcjxjb25zdCBzdGQ6OnN0cmluZywgRmllbGREZXNjPiAma3YgOiBtTWFwKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lID0ga3YuZmlyc3Q7CisgICAgICAgIGNvbnN0IEZpZWxkRGVzYyAmZGVzYyA9IGt2LnNlY29uZDsKKyAgICAgICAgaWYgKHBhcmFtc01hcC5jb3VudChkZXNjLnBhcmFtRGVzYy0+aW5kZXgoKSkgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQzJQYXJhbSAqcGFyYW0gPSBwYXJhbXNNYXBbZGVzYy5wYXJhbURlc2MtPmluZGV4KCldOworICAgICAgICBWYWx1ZSB2YWx1ZTsKKworICAgICAgICAvLyBoYW5kbGUgd2hvbGUgcGFyYW1zIGZpcnN0CisgICAgICAgIGlmICghZGVzYy5maWVsZERlc2MpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShwYXJhbSwgcGFyYW0tPnNpemUoKSk7CisgICAgICAgICAgICB2YWx1ZS5zZXQoYnVmKTsKKyAgICAgICAgICAgIHJldC5lbXBsYWNlKG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IHNpemVvZihDMlBhcmFtKSArIGRlc2Mub2Zmc2V0CisgICAgICAgICAgICAgICAgKyBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KCpkZXNjLmZpZWxkRGVzYyk7CisgICAgICAgIHVpbnQ4X3QgKmRhdGEgPSAodWludDhfdCAqKXBhcmFtICsgb2Zmc2V0OworICAgICAgICBDMkZpZWxkRGVzY3JpcHRvcjo6dHlwZV90IGZpZWxkVHlwZSA9IGRlc2MuZmllbGREZXNjLT50eXBlKCk7CisgICAgICAgIHN3aXRjaCAoZmllbGRUeXBlKSB7CisgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpTVFJJTkc6IHsKKyAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoID0gZGVzYy5maWVsZERlc2MtPmV4dGVudCgpOworICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBsZW5ndGggPSBwYXJhbS0+c2l6ZSgpIC0gb2Zmc2V0OworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChwYXJhbS0+c2l6ZSgpIDwgbGVuZ3RoIHx8IHBhcmFtLT5zaXplKCkgLSBsZW5ndGggPCBvZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoInBhcmFtIHRvbyBzbWFsbCBmb3Igc3RyaW5nOiBsZW5ndGggJXp1IHNpemUgJXp1IG9mZnNldCAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwgcGFyYW0tPnNpemUoKSwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhbHVlLnNldChBU3RyaW5nKChjaGFyICopZGF0YSwgc3RybmxlbigoY2hhciAqKWRhdGEsIGxlbmd0aCkpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6QkxPQjogeworICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGggPSBkZXNjLmZpZWxkRGVzYy0+ZXh0ZW50KCk7CisgICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGxlbmd0aCA9IHBhcmFtLT5zaXplKCkgLSBvZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKHBhcmFtLT5zaXplKCkgPCBsZW5ndGggfHwgcGFyYW0tPnNpemUoKSAtIGxlbmd0aCA8IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgicGFyYW0gdG9vIHNtYWxsIGZvciBibG9iOiBsZW5ndGggJXp1IHNpemUgJXp1IG9mZnNldCAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwgcGFyYW0tPnNpemUoKSwgb2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGRhdGEsIGxlbmd0aCk7CisgICAgICAgICAgICAgICAgdmFsdWUuc2V0KGJ1Zik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICBzaXplX3QgdmFsdWVTaXplID0gQzJWYWx1ZTo6U2l6ZUZvcigoQzJWYWx1ZTo6dHlwZV90KWZpZWxkVHlwZSk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtLT5zaXplKCkgPCB2YWx1ZVNpemUgfHwgcGFyYW0tPnNpemUoKSAtIHZhbHVlU2l6ZSA8IG9mZnNldCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgicGFyYW0gdG9vIHNtYWxsIGZvciBjMnZhbHVlOiBzaXplICV6dSBvZmZzZXQgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbS0+c2l6ZSgpLCBvZmZzZXQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBDMlZhbHVlIGMyVmFsdWU7CisgICAgICAgICAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UMzI6ICBjMlZhbHVlID0gKigoaW50MzJfdCAqKWRhdGEpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOiBjMlZhbHVlID0gKigodWludDMyX3QgKilkYXRhKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFIzMjogYzJWYWx1ZSA9ICooKGMyX2NudHIzMl90ICopZGF0YSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQ2NDogIGMyVmFsdWUgPSAqKChpbnQ2NF90ICopZGF0YSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UNjQ6IGMyVmFsdWUgPSAqKCh1aW50NjRfdCAqKWRhdGEpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjY0OiBjMlZhbHVlID0gKigoYzJfY250cjY0X3QgKilkYXRhKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkZMT0FUOiAgYzJWYWx1ZSA9ICooKGZsb2F0ICopZGF0YSk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlVuc3VwcG9ydGVkIGRhdGEgdHlwZSBmb3IgJXMiLCBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHZhbHVlLnNldChjMlZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXQuZW1wbGFjZShuYW1lLCB2YWx1ZSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpjbGVhcigpIHsKKyAgICBtTWFwLmNsZWFyKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vUmVmbGVjdGVkUGFyYW1VcGRhdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQzNmJhNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXIuaApAQCAtMCwwICsxLDIxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUkVGTEVDVEVEX1BBUkFNX0JVSUxERVJfSF8KKyNkZWZpbmUgUkVGTEVDVEVEX1BBUkFNX0JVSUxERVJfSF8KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKKyNpbmNsdWRlIDxDMi5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRvIHF1ZXJ5IGFuZCB1cGRhdGUgQ29kZWMgMi4wIGNvbmZpZ3VyYXRpb24gdmFsdWVzLiBVc2UgY3VzdG9tIGRpY3Rpb25hcnkgYXMKKyAqIEFNZXNzYWdlIGNhbm5vdCByZXByZXNlbnQgYWxsIHR5cGVzIG9mIENvZGVjIDIuMCBwYXJhbWV0ZXJzIGFuZCBDMlZhbHVlIGNhbm5vdCByZXByZXNlbnQKKyAqIGFsbCB0eXBlcyBvZiBTREsgdmFsdWVzLiBXZSB3YW50IHRvIGJlIHByZWNpc2Ugd2hlbiBzZXR0aW5nIHN0YW5kYXJkIHBhcmFtZXRlcnMgKHVzZSBDMlZhbHVlCisgKiBmb3IgYXJpdGhtZXRpYyB2YWx1ZXMpLCBidXQgYWxzbyBzdXBwb3J0IGludDMyIGFuZCBpbnQ2NCBmb3IgU0RLIHZhbHVlcyBzcGVjaWZpY2FsbHkgZm9yCisgKiB2ZW5kb3IgcGFyYW1ldGVycyAoYXMgU0RLIEFQSSBkb2VzIG5vdCBhbGxvdyBzcGVjaWZ5aW5nIHByb3BlciB0eXBlLikgV2hlbiBxdWVyeWluZyBmaWVsZHMsCisgKiB3ZSBjYW4gdXNlIEMyVmFsdWVzIGFzIHRoZXkgYXJlIGRlZmluZWQuCisgKgorICogICAgICBJdGVtID0+IENvZGVjIDIuMCB2YWx1ZSBtYXBwaW5nczoKKyAqICAgICBDVmFsdWU6OnR5cGUgPT4gdHlwZQorICogICAgIGludDMyID0+IGludDMyLCBjdHIzMiBvciB1aW50MzIKKyAqICAgICBpbnQ2NCA9PiBpbnQ2NCwgY3RyNjQgb3IgdWludDY0CisgKiAgICAgQVN0cmluZyA9PiBzdHJpbmcKKyAqICAgICBBQnVmZmVyID0+IGJsb2IKKyAqICAgICAnUmVjdCcgPT4gQzJSZWN0U3RydWN0IChub3QgZXhwb3NlZCBpbiBTREsgYXMgYSByZWN0YW5nbGUpCisgKi8KK2NsYXNzIFJlZmxlY3RlZFBhcmFtVXBkYXRlciB7CitwdWJsaWM6CisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyKCkgPSBkZWZhdWx0OworICAgIH5SZWZsZWN0ZWRQYXJhbVVwZGF0ZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBFbGVtZW50IGZvciB2YWx1ZXMKKyAgICAgKi8KKyAgICBzdHJ1Y3QgVmFsdWUgOiBwdWJsaWMgQURhdGE8QzJWYWx1ZSwgaW50MzJfdCwgaW50NjRfdCwgQVN0cmluZywgc3A8QUJ1ZmZlcj4+OjpCYXNpYyB7CisgICAgICAgIC8vIGFsbG93IGNvbnN0cnVjdGlvbiBmcm9tIGJhc2UgdHlwZXMKKyAgICAgICAgVmFsdWUoKSA9IGRlZmF1bHQ7CisgICAgICAgIGV4cGxpY2l0IFZhbHVlKEMyVmFsdWUgaSkgICAgICAgICAgICB7IHNldChpKTsgfQorICAgICAgICBleHBsaWNpdCBWYWx1ZShpbnQzMl90IGkpICAgICAgICAgICAgeyBzZXQoaSk7IH0KKyAgICAgICAgZXhwbGljaXQgVmFsdWUoaW50NjRfdCBpKSAgICAgICAgICAgIHsgc2V0KGkpOyB9CisgICAgICAgIGV4cGxpY2l0IFZhbHVlKGNvbnN0IEFTdHJpbmcgJmkpICAgICB7IHNldChpKTsgfQorICAgICAgICBleHBsaWNpdCBWYWx1ZShjb25zdCBzcDxBQnVmZmVyPiAmaSkgeyBzZXQoaSk7IH0KKyAgICB9OworCisgICAgc3RydWN0IERpY3QgOiBwdWJsaWMgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFZhbHVlPiB7CisgICAgICAgIERpY3QoKSA9IGRlZmF1bHQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIGRlYnVnU3RyaW5nKHNpemVfdCBpbmRlbnQgPSAwKSBjb25zdDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogRW51bWVyYXRlcyBhbGwgZmllbGRzIG9mIHRoZSBwYXJhbWV0ZXIgZGVzY3JpcHRvcnMgc3VwcGxpZWQsIHNvIHRoYXQgdGhpcyBvcGJqZWN0IGNhbiBsYXRlcgorICAgICAqIHF1ZXJ5IGFuZCB1cGRhdGUgdGhlc2UuCisgICAgICoKKyAgICAgKiBGb3Igbm93IG9ubHkgZmlyc3QtbGV2ZWwgZmllbGRzIGFyZSBzdXBwb3J0ZWQuIEFsc28sIGFycmF5IGZpZWxkcyBhcmUgbm90IHN1cHBvcnRlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSByZWZsZWN0b3IgICBDMlBhcmFtUmVmbGVjdG9yIG9iamVjdCBmb3IgQzJQYXJhbSByZWZsZWN0aW9uLgorICAgICAqIFxwYXJhbSBwYXJhbURlc2NzICB2ZWN0b3Igb2YgQzJQYXJhbURlc2NyaXB0b3Igb2JqZWN0cyB0aGF0IHRoaXMgb2JqZWN0CisgICAgICogICAgICAgICAgICAgICAgICAgIHdvdWxkIHJlY29nbml6ZSB3aGVuIGJ1aWxkaW5nIHBhcmFtcy4KKyAgICAgKi8KKyAgICB2b2lkIGFkZFBhcmFtRGVzYygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gJnBhcmFtRGVzY3MpOworCisgICAgLyoqCisgICAgICogQWRkcyBmaWVsZHMgb2YgYSBzdGFuZGFyZCBwYXJhbWV0ZXIgKHRoYXQgbWF5IG5vdCBiZSBzdXBwb3J0ZWQgYnkgdGhlIHBhcmFtZXRlciByZWZsZWN0b3IKKyAgICAgKiBvciBtYXkgbm90IGJlIGxpc3RlZCBhcyBhIHN1cHBvcnRlZCB2YWx1ZSBieSB0aGUgY29tcG9uZW50KS4gSWYgdGhlIHBhcmFtZXRlciBuYW1lIGlzCisgICAgICogdXNlZCBmb3IgYW5vdGhlciBwYXJhbWV0ZXIsIHRoaXMgb3BlcmF0aW9uIGlzIGEgbm8tb3AuIChUZWNobmljYWxseSwgdGhpcyBpcyBieSBmaWVsZHMpLgorICAgICAqCisgICAgICogXHBhcmFtIFQgc3RhbmRhcmQgcGFyYW1ldGVyIHR5cGUKKyAgICAgKiBccGFyYW0gbmFtZSBwYXJhbWV0ZXIgbmFtZQorICAgICAqLworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgdm9pZCBhZGRTdGFuZGFyZFBhcmFtKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QgYXR0cmliID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbURlc2NyaXB0b3I6OklTX1JFQURfT05MWSkgeworICAgICAgICBhZGRQYXJhbURlc2Moc3RkOjptYWtlX3NoYXJlZDxDMlBhcmFtRGVzY3JpcHRvcj4oCisgICAgICAgICAgICAgICAgQzJQYXJhbTo6SW5kZXgoVDo6UEFSQU1fVFlQRSksIGF0dHJpYiwgbmFtZS5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICBDMlN0cnVjdERlc2NyaXB0b3IoKFQqKW51bGxwdHIpLCBudWxscHRyIC8qIGRlc2NyaXB0b3IgKi8pOworICAgIH0KKworICAgIC8qKgorICAgICAqIEFkZHMgZmllbGRzIG9mIGEgc3RydWN0dXJlIChvciBhIHBhcmFtZWF0ZXIpIGRlc2NyaWJlZCBieSB0aGUgc3RydWN0IGRlc2NyaXB0b3IuIElmCisgICAgICogcmVmbGVjdG9yIGlzIHByb3ZpZGVkLCBmaWVsZHMgb2Ygc3ViLXN0cnVjdHVyZXMgYXJlIGFsc28gYWRkZWQuIE90aGVyd2lzZSwgb25seSB0b3AtbGV2ZWwKKyAgICAgKiBmdW5kYW1lbnRhbCB0eXBlZCBmaWVsZHMgKGFyaXRobWV0aWMsIHN0cmluZyBhbmQgYmxvYikgYXJlIGFkZGVkLgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtRGVzYyBwYXJhbWV0ZXIgZGVzY3JpcHRvcgorICAgICAqIFxwYXJhbSBmaWVsZERlc2MgZmllbGQgZGVzY3JpcHRvcgorICAgICAqIFxwYXJhbSBwYXRoIHBhdGgvbmFtZSBvZiB0aGUgc3RydWN0dXJlIChmaWVsZCBvciBwYXJlbnQgcGFyYW1ldGVyKQorICAgICAqIFxwYXJhbSBvZmZzZXQgb2Zmc2V0IG9mIHRoZSBzdHJ1Y3R1cmUgaW4gdGhlIHBhcmFtZXRlcgorICAgICAqIFxwYXJhbSByZWZsZWN0b3IgIEMyUGFyYW1SZWZsZWN0b3Igb2JqZWN0IGZvciBDMlBhcmFtIHJlZmxlY3Rpb24gKG1heSBiZSBudWxsKQorICAgICAqLworICAgIHZvaWQgYWRkUGFyYW1TdHJ1Y3REZXNjKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBwYXJhbURlc2MsIEMyU3RyaW5nIHBhdGgsIHNpemVfdCBvZmZzZXQsCisgICAgICAgICAgICBjb25zdCBDMlN0cnVjdERlc2NyaXB0b3IgJnN0cnVjdERlc2MsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3Rvcik7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGZpZWxkcyBvZiBhIHBhcmFtZXRlciBkZXNjcmliZWQgYnkgdGhlIHN0cnVjdCBkZXNjcmlwdG9yLiBJZiByZWZsZWN0b3IgaXMgcHJvdmlkZWQsCisgICAgICogZmllbGRzIG9mIHN1Yi1zdHJ1Y3R1cmVzIGFyZSBhbHNvIGFkZGVkLiBPdGhlcndpc2UsIG9ubHkgdG9wLWxldmVsIGZ1bmRhbWVudGFsIHR5cGVkIGZpZWxkcworICAgICAqIChhcml0aG1ldGljLCBzdHJpbmcgYW5kIGJsb2IpIGFyZSBhZGRlZC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbURlc2MgcGFyYW1ldGVyIGRlc2NyaXB0b3IKKyAgICAgKiBccGFyYW0gZmllbGREZXNjIGZpZWxkIGRlc2NyaXB0b3IKKyAgICAgKiBccGFyYW0gcmVmbGVjdG9yICBDMlBhcmFtUmVmbGVjdG9yIG9iamVjdCBmb3IgQzJQYXJhbSByZWZsZWN0aW9uIChtYXkgYmUgbnVsbCkKKyAgICAgKiBccGFyYW0gbWFya1ZlbmRvciBURU1QIGlmIHRydWUsIHByZWZpeCB2ZW5kb3IgcGFyYW1ldGVyIG5hbWVzIHdpdGggInZlbmRvci4iCisgICAgICovCisgICAgdm9pZCBhZGRQYXJhbURlc2MoCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+IHBhcmFtRGVzYywgY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yICZzdHJ1Y3REZXNjLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IsCisgICAgICAgICAgICBib29sIG1hcmtWZW5kb3IgPSB0cnVlKTsKKworICAgIC8qKgorICAgICAqIEFkZCBzdXBwb3J0IGZvciBzZXR0aW5nIGEgcGFyYW1ldGVyIGFzIGEgYmluYXJ5IGJsb2IuCisgICAgICoKKyAgICAgKiBccGFyYW0gbmFtZSBuYW1lIG9mIHRoZSBwYXJhbWV0ZXIKKyAgICAgKiBccGFyYW0gY29yZUluZGV4IHBhcmFtZXRlciAoY29yZSkgaW5kZXgKKyAgICAgKi8KKyAgICB2b2lkIHN1cHBvcnRXaG9sZVBhcmFtKHN0ZDo6c3RyaW5nIG5hbWUsIEMyUGFyYW06OkNvcmVJbmRleCBjb3JlSW5kZXgpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcGFyYW1ldGVyIGZvciBhbiBpbmRleC4KKyAgICAgKi8KKyAgICBzdGQ6OnN0cmluZyBnZXRQYXJhbU5hbWUoQzJQYXJhbTo6SW5kZXggaW5kZXgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogR2V0IGxpc3Qgb2YgcGFyYW0gaW5kaWNlcyBmcm9tIGZpZWxkIG5hbWVzIGFuZCB2YWx1ZXMgaW4gQU1lc3NhZ2Ugb2JqZWN0LgorICAgICAqCisgICAgICogVE9ETzogVGhpcyBzaG91bGQgYmUgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSBhcmUgbGlzdGVkIGJ5IHRoZSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1zW2luXSAgRGljdCBvYmplY3Qgd2l0aCBmaWVsZCBuYW1lIHRvIHZhbHVlIHBhaXJzLgorICAgICAqIFxwYXJhbSB2ZWNbb3V0XSAgICB2ZWN0b3IgdG8gc3RvcmUgdGhlIGluZGljZXMgZnJvbSB8cGFyYW1zfC4KKyAgICAgKi8KKyAgICB2b2lkIGdldFBhcmFtSW5kaWNlc0Zyb21NZXNzYWdlKAorICAgICAgICAgICAgY29uc3QgRGljdCAmcGFyYW1zLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICp2ZWMgLyogbm9ubnVsbCAqLykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBHZXQgbGlzdCBvZiBwYXJhbSBpbmRpY2VzIGZyb20gZmllbGQgbmFtZXMgKG9ubHkpIGluIEFNZXNzYWdlIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbXNbaW5dICBWZWN0b3Igb2JqZWN0IHdpdGggZmllbGQgbmFtZXMuCisgICAgICogXHBhcmFtIHZlY1tvdXRdICAgIHZlY3RvciB0byBzdG9yZSB0aGUgaW5kaWNlcyBmcm9tIHxwYXJhbXN8LgorICAgICAqLworICAgIHZvaWQgZ2V0UGFyYW1JbmRpY2VzRm9yS2V5cygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAma2V5cywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAqdmVjIC8qIG5vbm51bGwgKi8pIGNvbnN0OworCisgICAgLyoqCisgICAgICogVXBkYXRlIEMyUGFyYW0gb2JqZWN0cyBmcm9tIGZpZWxkIG5hbWUgYW5kIHZhbHVlIGluIEFNZXNzYWdlIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbXNbaW5dICAgIERpY3Qgb2JqZWN0IHdpdGggZmllbGQgbmFtZSB0byB2YWx1ZSBwYWlycy4KKyAgICAgKiBccGFyYW0gdmVjW2luLG91dF0gICB2ZWN0b3Igb2YgdGhlIEMyUGFyYW0gb2JqZWN0cyB0byBiZSB1cGRhdGVkLgorICAgICAqLworICAgIHZvaWQgdXBkYXRlUGFyYW1zRnJvbU1lc3NhZ2UoCisgICAgICAgICAgICBjb25zdCBEaWN0ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICp2ZWMgLyogbm9ubnVsbCAqLykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBHZXQgZmllbGRzIGZyb20gQzJQYXJhbSBvYmplY3RzIGluIEFNZXNzYWdlIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbXNbaW5dICAgIHZlY3RvciBvZiB0aGUgQzJQYXJhbSBvYmplY3RzIHRvIGJlIHF1ZXJpZWQKKyAgICAgKiBccmV0dXJuIGEgRGljdCBvYmplY3QgY29udGFpbmluZyB0aGUga25vd24gcGFyYW1ldGVycworICAgICAqLworICAgIERpY3QgZ2V0UGFyYW1zKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMgLyogbm9ubnVsbCAqLykgY29uc3Q7CisKKyAgICBEaWN0IGdldFBhcmFtcygKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gJnBhcmFtcyAvKiBub25udWxsICovKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENsZWFyIHBhcmFtIGRlc2NyaXB0b3JzIGluIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIHZvaWQgY2xlYXIoKTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgRmllbGREZXNjIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBwYXJhbURlc2M7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGREZXNjOworICAgICAgICBzaXplX3Qgb2Zmc2V0OworICAgIH07CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEZpZWxkRGVzYz4gbU1hcDsKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpJbmRleCwgc3RkOjpzdHJpbmc+IG1QYXJhbU5hbWVzOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBDMlBhcmFtOjpDb3JlSW5kZXg+IG1XaG9sZVBhcmFtczsKKworICAgIHZvaWQgcGFyc2VNZXNzYWdlQW5kRG9Xb3JrKAorICAgICAgICAgICAgY29uc3QgRGljdCAmcGFyYW1zLAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nICYsIGNvbnN0IEZpZWxkRGVzYyAmLCBjb25zdCB2b2lkICosIHNpemVfdCk+IHdvcmspIGNvbnN0OworCisgICAgQzJfRE9fTk9UX0NPUFkoUmVmbGVjdGVkUGFyYW1VcGRhdGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gUkVGTEVDVEVEX1BBUkFNX0JVSUxERVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Ta2lwQ3V0QnVmZmVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Ta2lwQ3V0QnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDFkZTY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL1NraXBDdXRCdWZmZXIuY3BwCkBAIC0wLDAgKzEsMjA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJTa2lwQ3V0QnVmZmVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorI2luY2x1ZGUgIlNraXBDdXRCdWZmZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitTa2lwQ3V0QnVmZmVyOjpTa2lwQ3V0QnVmZmVyKHNpemVfdCBza2lwLCBzaXplX3QgY3V0LCBzaXplX3QgbnVtMTZCaXRDaGFubmVscykgeworCisgICAgbVdyaXRlSGVhZCA9IDA7CisgICAgbVJlYWRIZWFkID0gMDsKKyAgICBtQ2FwYWNpdHkgPSAwOworICAgIG1DdXRCdWZmZXIgPSBudWxscHRyOworCisgICAgaWYgKG51bTE2Qml0Q2hhbm5lbHMgPT0gMCB8fCBudW0xNkJpdENoYW5uZWxzID4gSU5UMzJfTUFYIC8gMikgeworICAgICAgICBBTE9HVygiIyBjaGFubmVscyBvdXQgb2YgcmFuZ2U6ICV6dSwgdXNpbmcgcGFzc3Rocm91Z2ggaW5zdGVhZCIsIG51bTE2Qml0Q2hhbm5lbHMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNpemVfdCBmcmFtZVNpemUgPSBudW0xNkJpdENoYW5uZWxzICogMjsKKyAgICBpZiAoc2tpcCA+IElOVDMyX01BWCAvIGZyYW1lU2l6ZSB8fCBjdXQgPiBJTlQzMl9NQVggLyBmcmFtZVNpemUKKyAgICAgICAgICAgIHx8IGN1dCAqIGZyYW1lU2l6ZSA+IElOVDMyX01BWCAtIDQwOTYpIHsKKyAgICAgICAgQUxPR1coIm91dCBvZiByYW5nZSBza2lwL2N1dDogJXp1LyV6dSwgdXNpbmcgcGFzc3Rocm91Z2ggaW5zdGVhZCIsCisgICAgICAgICAgICAgICAgc2tpcCwgY3V0KTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBza2lwICo9IGZyYW1lU2l6ZTsKKyAgICBjdXQgKj0gZnJhbWVTaXplOworCisgICAgbUZyb250UGFkZGluZyA9IG1Ta2lwID0gc2tpcDsKKyAgICBtQmFja1BhZGRpbmcgPSBjdXQ7CisgICAgbUNhcGFjaXR5ID0gY3V0ICsgNDA5NjsKKyAgICBtQ3V0QnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIGNoYXJbbUNhcGFjaXR5XTsKKyAgICBBTE9HVigic2tpcGN1dGJ1ZmZlciAlenUgJXp1ICVkIiwgc2tpcCwgY3V0LCBtQ2FwYWNpdHkpOworfQorCitTa2lwQ3V0QnVmZmVyOjp+U2tpcEN1dEJ1ZmZlcigpIHsKKyAgICBkZWxldGVbXSBtQ3V0QnVmZmVyOworfQorCit2b2lkIFNraXBDdXRCdWZmZXI6OnN1Ym1pdChNZWRpYUJ1ZmZlciAqYnVmZmVyKSB7CisgICAgaWYgKG1DdXRCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBwYXNzdGhyb3VnaCBtb2RlCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQzMl90IG9mZnNldCA9IGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgaW50MzJfdCBidWZsZW4gPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOworCisgICAgLy8gZHJvcCB0aGUgaW5pdGlhbCBkYXRhIGZyb20gdGhlIGJ1ZmZlciBpZiBuZWVkZWQKKyAgICBpZiAobUZyb250UGFkZGluZyA+IDApIHsKKyAgICAgICAgLy8gc3RpbGwgZGF0YSBsZWZ0IHRvIGRyb3AKKyAgICAgICAgaW50MzJfdCB0b19kcm9wID0gKGJ1ZmxlbiA8IG1Gcm9udFBhZGRpbmcpID8gYnVmbGVuIDogbUZyb250UGFkZGluZzsKKyAgICAgICAgb2Zmc2V0ICs9IHRvX2Ryb3A7CisgICAgICAgIGJ1ZmxlbiAtPSB0b19kcm9wOworICAgICAgICBidWZmZXItPnNldF9yYW5nZShvZmZzZXQsIGJ1Zmxlbik7CisgICAgICAgIG1Gcm9udFBhZGRpbmcgLT0gdG9fZHJvcDsKKyAgICB9CisKKworICAgIC8vIGFwcGVuZCBkYXRhIHRvIGN1dGJ1ZmZlcgorICAgIGNoYXIgKnNyYyA9ICgoY2hhciopIGJ1ZmZlci0+ZGF0YSgpKSArIG9mZnNldDsKKyAgICB3cml0ZShzcmMsIGJ1Zmxlbik7CisKKworICAgIC8vIHRoZSBtZWRpYWJ1ZmZlciBpcyBub3cgZW1wdHkuIEZpbGwgaXQgZnJvbSBjdXRidWZmZXIsIGFsd2F5cyBsZWF2aW5nCisgICAgLy8gYXQgbGVhc3QgbUJhY2tQYWRkaW5nIGJ5dGVzIGluIHRoZSBjdXRidWZmZXIKKyAgICBjaGFyICpkc3QgPSAoY2hhciopIGJ1ZmZlci0+ZGF0YSgpOworICAgIHNpemVfdCBjb3BpZWQgPSByZWFkKGRzdCwgYnVmZmVyLT5zaXplKCkpOworICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGNvcGllZCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBTa2lwQ3V0QnVmZmVyOjpzdWJtaXRJbnRlcm5hbChjb25zdCBzcDxUPiYgYnVmZmVyKSB7CisgICAgaWYgKG1DdXRCdWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBwYXNzdGhyb3VnaCBtb2RlCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQzMl90IG9mZnNldCA9IGJ1ZmZlci0+b2Zmc2V0KCk7CisgICAgaW50MzJfdCBidWZsZW4gPSBidWZmZXItPnNpemUoKTsKKworICAgIC8vIGRyb3AgdGhlIGluaXRpYWwgZGF0YSBmcm9tIHRoZSBidWZmZXIgaWYgbmVlZGVkCisgICAgaWYgKG1Gcm9udFBhZGRpbmcgPiAwKSB7CisgICAgICAgIC8vIHN0aWxsIGRhdGEgbGVmdCB0byBkcm9wCisgICAgICAgIGludDMyX3QgdG9fZHJvcCA9IChidWZsZW4gPCBtRnJvbnRQYWRkaW5nKSA/IGJ1ZmxlbiA6IG1Gcm9udFBhZGRpbmc7CisgICAgICAgIG9mZnNldCArPSB0b19kcm9wOworICAgICAgICBidWZsZW4gLT0gdG9fZHJvcDsKKyAgICAgICAgYnVmZmVyLT5zZXRSYW5nZShvZmZzZXQsIGJ1Zmxlbik7CisgICAgICAgIG1Gcm9udFBhZGRpbmcgLT0gdG9fZHJvcDsKKyAgICB9CisKKworICAgIC8vIGFwcGVuZCBkYXRhIHRvIGN1dGJ1ZmZlcgorICAgIGNoYXIgKnNyYyA9IChjaGFyKikgYnVmZmVyLT5kYXRhKCk7CisgICAgd3JpdGUoc3JjLCBidWZsZW4pOworCisKKyAgICAvLyB0aGUgbWVkaWFidWZmZXIgaXMgbm93IGVtcHR5LiBGaWxsIGl0IGZyb20gY3V0YnVmZmVyLCBhbHdheXMgbGVhdmluZworICAgIC8vIGF0IGxlYXN0IG1CYWNrUGFkZGluZyBieXRlcyBpbiB0aGUgY3V0YnVmZmVyCisgICAgY2hhciAqZHN0ID0gKGNoYXIqKSBidWZmZXItPmJhc2UoKTsKKyAgICBzaXplX3QgY29waWVkID0gcmVhZChkc3QsIGJ1ZmZlci0+Y2FwYWNpdHkoKSk7CisgICAgYnVmZmVyLT5zZXRSYW5nZSgwLCBjb3BpZWQpOworfQorCit2b2lkIFNraXBDdXRCdWZmZXI6OnN1Ym1pdChjb25zdCBzcDxBQnVmZmVyPiYgYnVmZmVyKSB7CisgICAgc3VibWl0SW50ZXJuYWwoYnVmZmVyKTsKK30KKwordm9pZCBTa2lwQ3V0QnVmZmVyOjpzdWJtaXQoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4mIGJ1ZmZlcikgeworICAgIHN1Ym1pdEludGVybmFsKGJ1ZmZlcik7Cit9CisKK3ZvaWQgU2tpcEN1dEJ1ZmZlcjo6Y2xlYXIoKSB7CisgICAgbVdyaXRlSGVhZCA9IG1SZWFkSGVhZCA9IDA7CisgICAgbUZyb250UGFkZGluZyA9IG1Ta2lwOworfQorCit2b2lkIFNraXBDdXRCdWZmZXI6OndyaXRlKGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IG51bSkgeworICAgIGludDMyX3Qgc2l6ZXVzZWQgPSAobVdyaXRlSGVhZCAtIG1SZWFkSGVhZCk7CisgICAgaWYgKHNpemV1c2VkIDwgMCkgc2l6ZXVzZWQgKz0gbUNhcGFjaXR5OworCisgICAgLy8gRXZlcnl0aGluZyBtdXN0IGZpdC4gTWFrZSBzdXJlIHRoZSBidWZmZXIgaXMgYSBsaXR0bGUgbGFyZ2VyIHRoYW4gbmVlZGVkLAorICAgIC8vIHNvIHRoZXJlIGlzIG5vIGFtYmlndWl0eSBhcyB0byB3aGV0aGVyIG1Xcml0ZUhlYWQgPT0gbVJlYWRIZWFkIG1lYW5zIGJ1ZmZlcgorICAgIC8vIGZ1bGwgb3IgZW1wdHkKKyAgICBzaXplX3QgYXZhaWxhYmxlID0gbUNhcGFjaXR5IC0gc2l6ZXVzZWQgLSAzMjsKKyAgICBpZiAoYXZhaWxhYmxlIDwgbnVtKSB7CisgICAgICAgIGludDMyX3QgbmV3Y2FwYWNpdHkgPSBtQ2FwYWNpdHkgKyAobnVtIC0gYXZhaWxhYmxlKTsKKyAgICAgICAgY2hhciAqIG5ld2J1ZmZlciA9IG5ldyBjaGFyW25ld2NhcGFjaXR5XTsKKyAgICAgICAgbWVtY3B5KG5ld2J1ZmZlciwgbUN1dEJ1ZmZlciwgbUNhcGFjaXR5KTsKKyAgICAgICAgZGVsZXRlIFtdIG1DdXRCdWZmZXI7CisgICAgICAgIG1DYXBhY2l0eSA9IG5ld2NhcGFjaXR5OworICAgICAgICBtQ3V0QnVmZmVyID0gbmV3YnVmZmVyOworICAgICAgICBBTE9HVigicmVhbGxvY2F0ZWQgYnVmZmVyIGF0IHNpemUgJWQiLCBuZXdjYXBhY2l0eSk7CisgICAgfQorCisgICAgc2l6ZV90IGNvcHlmaXJzdCA9IChtQ2FwYWNpdHkgLSBtV3JpdGVIZWFkKTsKKyAgICBpZiAoY29weWZpcnN0ID4gbnVtKSBjb3B5Zmlyc3QgPSBudW07CisgICAgaWYgKGNvcHlmaXJzdCkgeworICAgICAgICBtZW1jcHkobUN1dEJ1ZmZlciArIG1Xcml0ZUhlYWQsIHNyYywgY29weWZpcnN0KTsKKyAgICAgICAgbnVtIC09IGNvcHlmaXJzdDsKKyAgICAgICAgc3JjICs9IGNvcHlmaXJzdDsKKyAgICAgICAgbVdyaXRlSGVhZCArPSBjb3B5Zmlyc3Q7CisgICAgICAgIENIRUNLX0xFKG1Xcml0ZUhlYWQsIG1DYXBhY2l0eSk7CisgICAgICAgIGlmIChtV3JpdGVIZWFkID09IG1DYXBhY2l0eSkgbVdyaXRlSGVhZCA9IDA7CisgICAgICAgIGlmIChudW0pIHsKKyAgICAgICAgICAgIG1lbWNweShtQ3V0QnVmZmVyLCBzcmMsIG51bSk7CisgICAgICAgICAgICBtV3JpdGVIZWFkICs9IG51bTsKKyAgICAgICAgfQorICAgIH0KK30KKworc2l6ZV90IFNraXBDdXRCdWZmZXI6OnJlYWQoY2hhciAqZHN0LCBzaXplX3QgbnVtKSB7CisgICAgaW50MzJfdCBhdmFpbGFibGUgPSAobVdyaXRlSGVhZCAtIG1SZWFkSGVhZCk7CisgICAgaWYgKGF2YWlsYWJsZSA8IDApIGF2YWlsYWJsZSArPSBtQ2FwYWNpdHk7CisKKyAgICBhdmFpbGFibGUgLT0gbUJhY2tQYWRkaW5nOworICAgIGlmIChhdmFpbGFibGUgPD0wKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpZiAoYXZhaWxhYmxlIDwgaW50MzJfdChudW0pKSB7CisgICAgICAgIG51bSA9IGF2YWlsYWJsZTsKKyAgICB9CisKKyAgICBzaXplX3QgY29weWZpcnN0ID0gKG1DYXBhY2l0eSAtIG1SZWFkSGVhZCk7CisgICAgaWYgKGNvcHlmaXJzdCA+IG51bSkgY29weWZpcnN0ID0gbnVtOworICAgIGlmIChjb3B5Zmlyc3QpIHsKKyAgICAgICAgbWVtY3B5KGRzdCwgbUN1dEJ1ZmZlciArIG1SZWFkSGVhZCwgY29weWZpcnN0KTsKKyAgICAgICAgbnVtIC09IGNvcHlmaXJzdDsKKyAgICAgICAgZHN0ICs9IGNvcHlmaXJzdDsKKyAgICAgICAgbVJlYWRIZWFkICs9IGNvcHlmaXJzdDsKKyAgICAgICAgQ0hFQ0tfTEUobVJlYWRIZWFkLCBtQ2FwYWNpdHkpOworICAgICAgICBpZiAobVJlYWRIZWFkID09IG1DYXBhY2l0eSkgbVJlYWRIZWFkID0gMDsKKyAgICAgICAgaWYgKG51bSkgeworICAgICAgICAgICAgbWVtY3B5KGRzdCwgbUN1dEJ1ZmZlciwgbnVtKTsKKyAgICAgICAgICAgIG1SZWFkSGVhZCArPSBudW07CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGF2YWlsYWJsZTsKK30KKworc2l6ZV90IFNraXBDdXRCdWZmZXI6OnNpemUoKSB7CisgICAgaW50MzJfdCBhdmFpbGFibGUgPSAobVdyaXRlSGVhZCAtIG1SZWFkSGVhZCk7CisgICAgaWYgKGF2YWlsYWJsZSA8IDApIGF2YWlsYWJsZSArPSBtQ2FwYWNpdHk7CisgICAgcmV0dXJuIGF2YWlsYWJsZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi9Ta2lwQ3V0QnVmZmVyLmggYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vU2tpcEN1dEJ1ZmZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYjU2OTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vU2tpcEN1dEJ1ZmZlci5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNLSVBfQ1VUX0JVRkZFUl9IXworCisjZGVmaW5lIFNLSVBfQ1VUX0JVRkZFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiB1dGlsaXR5IGNsYXNzIHRvIGN1dCB0aGUgc3RhcnQgYW5kIGVuZCBvZmYgYSBzdHJlYW0gb2YgZGF0YSBpbiBNZWRpYUJ1ZmZlcnMKKyAqCisgKi8KK2NsYXNzIFNraXBDdXRCdWZmZXI6IHB1YmxpYyBSZWZCYXNlIHsKKyBwdWJsaWM6CisgICAgLy8gJ3NraXAnIGlzIHRoZSBudW1iZXIgb2YgZnJhbWVzIHRvIHNraXAgZnJvbSB0aGUgYmVnaW5uaW5nCisgICAgLy8gJ2N1dCcgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gY3V0IGZyb20gdGhlIGVuZAorICAgIC8vICdudW0xNkJpdENoYW5uZWxzJyBpcyB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzLCB3aGljaCBhcmUgYXNzdW1lZCB0byBiZSAxNiBiaXQgd2lkZSBlYWNoCisgICAgU2tpcEN1dEJ1ZmZlcihzaXplX3Qgc2tpcCwgc2l6ZV90IGN1dCwgc2l6ZV90IG51bTE2Q2hhbm5lbHMpOworCisgICAgLy8gU3VibWl0IG9uZSBNZWRpYUJ1ZmZlciBmb3Igc2tpcHBpbmcgYW5kIGN1dHRpbmcuIFRoaXMgbWF5IGNvbnN1bWUgYWxsIG9yCisgICAgLy8gc29tZSBvZiB0aGUgZGF0YSBpbiB0aGUgYnVmZmVyLCBvciBpdCBtYXkgYWRkIGRhdGEgdG8gaXQuCisgICAgLy8gQWZ0ZXIgdGhpcywgdGhlIGNhbGxlciBzaG91bGQgY29udGludWUgcHJvY2Vzc2luZyB0aGUgYnVmZmVyIGFzIHVzdWFsLgorICAgIHZvaWQgc3VibWl0KE1lZGlhQnVmZmVyICpidWZmZXIpOworICAgIHZvaWQgc3VibWl0KGNvbnN0IHNwPEFCdWZmZXI+JiBidWZmZXIpOyAgICAvLyBzYW1lIGFzIGFib3ZlLCBidXQgd2l0aCBhbiBBQnVmZmVyCisgICAgdm9pZCBzdWJtaXQoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4mIGJ1ZmZlcik7ICAgIC8vIHNhbWUgYXMgYWJvdmUsIGJ1dCB3aXRoIGFuIEFCdWZmZXIKKyAgICB2b2lkIGNsZWFyKCk7CisgICAgc2l6ZV90IHNpemUoKTsgLy8gaG93IG1hbnkgYnl0ZXMgYXJlIGN1cnJlbnRseSBzdG9yZWQgaW4gdGhlIGJ1ZmZlcgorCisgcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflNraXBDdXRCdWZmZXIoKTsKKworIHByaXZhdGU6CisgICAgdm9pZCB3cml0ZShjb25zdCBjaGFyICpzcmMsIHNpemVfdCBudW0pOworICAgIHNpemVfdCByZWFkKGNoYXIgKmRzdCwgc2l6ZV90IG51bSk7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgdm9pZCBzdWJtaXRJbnRlcm5hbChjb25zdCBzcDxUPiYgYnVmZmVyKTsKKyAgICBpbnQzMl90IG1Ta2lwOworICAgIGludDMyX3QgbUZyb250UGFkZGluZzsKKyAgICBpbnQzMl90IG1CYWNrUGFkZGluZzsKKyAgICBpbnQzMl90IG1Xcml0ZUhlYWQ7CisgICAgaW50MzJfdCBtUmVhZEhlYWQ7CisgICAgaW50MzJfdCBtQ2FwYWNpdHk7CisgICAgY2hhciogbUN1dEJ1ZmZlcjsKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTa2lwQ3V0QnVmZmVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gT01YX0NPREVDX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2ZWIyYjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDU2IEBACitjY190ZXN0IHsKKyAgICBuYW1lOiAiY2NvZGVjX3VuaXRfdGVzdCIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJSZWZsZWN0ZWRQYXJhbVVwZGF0ZXJfdGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvY29kZWMyL3NmcGx1Z2luIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogIm1jX3Nhbml0eV90ZXN0IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIk1lZGlhQ29kZWNfc2FuaXR5X3Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2NvZGVjMi9zZnBsdWdpbiIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYWRybV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX29teCIsCisgICAgICAgICJsaWJzZnBsdWdpbl9jY29kZWMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9NZWRpYUNvZGVjX3Nhbml0eV90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9NZWRpYUNvZGVjX3Nhbml0eV90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGVlZGUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3Rlc3RzL01lZGlhQ29kZWNfc2FuaXR5X3Rlc3QuY3BwCkBAIC0wLDAgKzEsNDUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYUNvZGVjU2FuaXR5VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIE1lZGlhQ29kZWNTYW5pdHlUZXN0KCkKKyAgICAgICAgOiBsb29wZXIobmV3IEFMb29wZXIpLAorICAgICAgICAgIGNmZyhuZXcgQU1lc3NhZ2UpLAorICAgICAgICAgIGlmbXQobmV3IEFNZXNzYWdlKSwKKyAgICAgICAgICBvZm10KG5ldyBBTWVzc2FnZSkgeworICAgICAgICBQcm9jZXNzU3RhdGU6OnNlbGYoKS0+c3RhcnRUaHJlYWRQb29sKCk7CisgICAgICAgIGxvb3Blci0+c3RhcnQoKTsKKyAgICB9CisKKyAgICB+TWVkaWFDb2RlY1Nhbml0eVRlc3QoKSB7CisgICAgICAgIGlmIChjb2RlYyAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBjb2RlYy0+cmVsZWFzZSgpOworICAgICAgICB9CisgICAgICAgIGxvb3Blci0+c3RvcCgpOworICAgIH0KKworICAgIHNwPEFMb29wZXI+IGxvb3BlcjsKKyAgICBzcDxNZWRpYUNvZGVjPiBjb2RlYzsKKyAgICBzcDxBTWVzc2FnZT4gY2ZnOworICAgIHNwPEFNZXNzYWdlPiBpZm10OworICAgIHNwPEFNZXNzYWdlPiBvZm10OworfTsKKworY29uc3Qgc3RhdGljIHNpemVfdCBrTGluZWFyQnVmZmVyU2l6ZSA9IDEwNDg1NzY7CisKKy8vIGRhdGEgZm9yIGEgY29kZWMgaW5wdXQgZnJhbWUKK3N0cnVjdCBGcmFtZURhdGEgeworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGE7CisgICAgc2l6ZV90IHNpemU7CisgICAgdGVtcGxhdGU8c2l6ZV90IE4+CisgICAgY29uc3RleHByIEZyYW1lRGF0YShjb25zdCB1aW50OF90KCZkYXRhXylbTl0pIDogZGF0YShkYXRhXyksIHNpemUoTikgeyB9Cit9OworCisvLyBvbmUgeWVsbG93IGZyYW1lIG9mIDI0MHgxODAgKGFsYmVpdCA0OjQ6NCkKK2NvbnN0IHVpbnQ4X3QgYXZjU3RyZWFtX0ExW10gPSB7IC8vIElEUiBmcmFtZQorICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NjcsIDB4NjQsIDB4MDAsIDB4MGQsIDB4YWMsIDB4ZDksIDB4NDEsIDB4NDEsIDB4ZmEsIDB4MTAsIDB4MDAsIDB4MDAsCisgICAgMHgwMywgMHgwMCwgMHgxMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMywgMHgyMCwgMHhmMSwgMHg0MiwgMHg5OSwgMHg2MCwKKworICAgIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDEsIDB4NjgsIDB4ZWIsIDB4ZTMsIDB4Y2IsIDB4MjIsIDB4YzAsCisKKyAgICAweDAwLCAweDAwLCAweDAxLCAweDY1LCAweDg4LCAweDg0LCAweDAwLCAweDJiLCAweGZmLCAweGZlLCAweGQ4LCAweGU3LCAweGYzLCAweDJjLCAweGE1LCAweDYwLAorICAgIDB4Y2EsIDB4YmIsIDB4ZjEsIDB4NWMsIDB4NDQsIDB4N2MsIDB4OWEsIDB4YTUsIDB4YzMsIDB4YWIsIDB4MmYsIDB4NzcsIDB4MGEsIDB4OTQsIDB4MGQsIDB4MTksCisgICAgMHg0MywgMHgzYiwgMHg0ZiwgMHgyNSwgMHhlYSwgMHg2NiwgMHgwMCwgMHgwMSwgMHgyNCwgMHhjZCwgMHgzNSwgMHg1ZiwgMHhjMiwgMHgzNCwgMHg4OSwgMHhkMSwKKyAgICAweGE1LCAweDYwLCAweDA5LCAweDk4LCAweDAwLCAweDAxLCAweDFiLCAweDBlLCAweGNiLCAweDBkLCAweDA0LCAweDg2LCAweDk0LCAweGUyLCAweDMyLCAweDNjLAorICAgIDB4ZGQsIDB4MGYsCit9OworCitGcmFtZURhdGEgYXZjU3RyZWFtX0FbXSBfX3VudXNlZCA9IHsgYXZjU3RyZWFtX0ExIH07CisKKy8vIEFWQyBzdHJlYW0gb2YgMiB5ZWxsb3cgZnJhbWVzICgyNDB4MTgwKQorY29uc3QgdWludDhfdCBhdmNTdHJlYW1fQjFbXSA9IHsgLy8gSURSIGZyYW1lCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2NywgMHg2NCwgMHgwMCwgMHgwYywgMHhhYywgMHhkOSwgMHg0MSwgMHg0MSwgMHhmYSwgMHgxMCwgMHgwMCwgMHgwMCwKKyAgICAweDAzLCAweDAwLCAweDEwLCAweDAwLCAweDAwLCAweDAzLCAweDAyLCAweDgwLCAweGYxLCAweDQyLCAweDk5LCAweDYwLAorCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMSwgMHg2OCwgMHhlYiwgMHhlMywgMHhjYiwgMHgyMiwgMHhjMCwKKworICAgIDB4MDAsIDB4MDAsIDB4MDEsIDB4NjUsIDB4ODgsIDB4ODQsIDB4MDAsIDB4MzMsIDB4ZmYsIDB4ZmUsIDB4ZGYsIDB4MzIsIDB4ZjgsIDB4MTQsIDB4ZDYsIDB4MjUsCisgICAgMHhkMCwgMHg3NCwgMHg0MiwgMHg1MCwgMHg4NCwgMHg2ZiwgMHhmNCwgMHhjMiwgMHg1YywgMHg3NiwgMHgzNywgMHgxNywgMHg3MiwgMHhhYywgMHg1MiwgMHhmYywKKyAgICAweGQ2LCAweDFmLCAweGQyLCAweGQwLCAweDYwLCAweGIyLCAweDIwLCAweDAwLCAweDEwLCAweDNkLCAweDJhLCAweGMwLCAweGU0LCAweDI3LCAweGNiLCAweGNlLAorICAgIDB4ZWEsIDB4MjUsIDB4MDAsIDB4ODEsIDB4MDAsIDB4MDAsIDB4MGYsIDB4NDAsIDB4YmMsIDB4ODEsIDB4MTUsIDB4YzEsIDB4NjUsIDB4MjAsIDB4ODAsIDB4ODEsCisgICAgMHg3YSwgMHg1NywgMHg1MSwKK307CisKK2NvbnN0IHVpbnQ4X3QgYXZjU3RyZWFtX0IyW10gPSB7IC8vIFAgZnJhbWUKKyAgICAweDAwLCAweDAwLCAweDAwLCAweDAxLCAweDQxLCAweDlhLCAweDIxLCAweDZjLCAweDQyLCAweGJmLCAweGZlLCAweDM4LCAweDQwLCAweDAwLCAweDBkLCAweDQ4LAorfTsKKworRnJhbWVEYXRhIGF2Y1N0cmVhbV9CW10gPSB7IGF2Y1N0cmVhbV9CMSwgYXZjU3RyZWFtX0IyIH07CisKK2NsYXNzIE1lZGlhQ29kZWNJbnB1dEJ1ZmZlclNpemVUZXN0IDogcHVibGljIE1lZGlhQ29kZWNTYW5pdHlUZXN0LAorICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8aW50MzJfdD4geworfTsKKworVEVTVF9QKE1lZGlhQ29kZWNJbnB1dEJ1ZmZlclNpemVUZXN0LCBUZXN0QXZjRGVjb2RlcikgeworICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiKTsKKyAgICBjZmctPnNldEludDMyKCJ3aWR0aCIsIDMyMCk7CisgICAgY2ZnLT5zZXRJbnQzMigiaGVpZ2h0IiwgMjQwKTsKKyAgICBjZmctPnNldFN0cmluZygibWltZSIsIE1JTUVUWVBFX1ZJREVPX0FWQyk7CisKKyAgICBjb25zdCBpbnQzMl90IElucHV0U2l6ZSA9IEdldFBhcmFtKCk7CisgICAgaWYgKElucHV0U2l6ZSA+PSAwKSB7CisgICAgICAgIGNmZy0+c2V0SW50MzIoIm1heC1pbnB1dC1zaXplIiwgSW5wdXRTaXplKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmNvbmZpZ3VyZShjZmcsIG51bGxwdHIsIG51bGxwdHIsIDApLCBPSyk7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5nZXRJbnB1dEZvcm1hdCgmaWZtdCksIE9LKTsKKyAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKKyAgICBBU1NFUlRfVFJVRShpZm10LT5maW5kSW50MzIoIm1heC1pbnB1dC1zaXplIiwgJm1heElucHV0U2l6ZSkpOworICAgIGlmIChJbnB1dFNpemUgPiAwKSB7CisgICAgICAgIEVYUEVDVF9FUShtYXhJbnB1dFNpemUsIElucHV0U2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRVhQRUNUX0dFKG1heElucHV0U2l6ZSwgMSA8PCAyMCk7IC8vIDEgTUIKKyAgICB9CisgICAgRVhQRUNUX0VRKGNvZGVjLT5zdGFydCgpLCAgT0spOworICAgIHNpemVfdCBpeDsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaXgsIDEwMDAwMDApLCBPSyk7CisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0SW5wdXRCdWZmZXIoaXgsICZidWYpLCAgT0spOworICAgIEVYUEVDVF9HRShidWYtPnNpemUoKSwgKHNpemVfdCltYXhJbnB1dFNpemUpOworICAgIEVYUEVDVF9MRShidWYtPnNpemUoKSwgKHNpemVfdCltYXhJbnB1dFNpemUgKyA0MDk2dSk7Cit9CisKK1RFU1RfUChNZWRpYUNvZGVjSW5wdXRCdWZmZXJTaXplVGVzdCwgVGVzdFZpZGVvRGVjb2RlcikgeworICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgImMyLmFuZHJvaWQudnA4LmRlY29kZXIiKTsKKyAgICBjZmctPnNldEludDMyKCJ3aWR0aCIsIDMyMCk7CisgICAgY2ZnLT5zZXRJbnQzMigiaGVpZ2h0IiwgMjQwKTsKKyAgICBjZmctPnNldFN0cmluZygibWltZSIsIE1JTUVUWVBFX1ZJREVPX1ZQOCk7CisKKyAgICBjb25zdCBpbnQzMl90IElucHV0U2l6ZSA9IEdldFBhcmFtKCk7CisgICAgaWYgKElucHV0U2l6ZSA+PSAwKSB7CisgICAgICAgIGNmZy0+c2V0SW50MzIoIm1heC1pbnB1dC1zaXplIiwgSW5wdXRTaXplKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmNvbmZpZ3VyZShjZmcsIG51bGxwdHIsIG51bGxwdHIsIDApLCBPSyk7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5nZXRJbnB1dEZvcm1hdCgmaWZtdCksIE9LKTsKKyAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKKyAgICBBU1NFUlRfVFJVRShpZm10LT5maW5kSW50MzIoIm1heC1pbnB1dC1zaXplIiwgJm1heElucHV0U2l6ZSkpOworICAgIGlmIChJbnB1dFNpemUgPiAwKSB7CisgICAgICAgIEVYUEVDVF9FUShtYXhJbnB1dFNpemUsIElucHV0U2l6ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRVhQRUNUX0dFKG1heElucHV0U2l6ZSwgMSA8PCAyMCk7IC8vIDEgTUIKKyAgICB9CisgICAgRVhQRUNUX0VRKGNvZGVjLT5zdGFydCgpLCAgT0spOworICAgIHNpemVfdCBpeDsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmRlcXVldWVJbnB1dEJ1ZmZlcigmaXgsIDEwMDAwMDApLCBPSyk7CisgICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0SW5wdXRCdWZmZXIoaXgsICZidWYpLCAgT0spOworICAgIEVYUEVDVF9HRShidWYtPnNpemUoKSwgKHNpemVfdCltYXhJbnB1dFNpemUpOworICAgIEVYUEVDVF9MRShidWYtPnNpemUoKSwgKHNpemVfdCltYXhJbnB1dFNpemUgKyA0MDk2dSk7Cit9CisKK1RFU1RfUChNZWRpYUNvZGVjSW5wdXRCdWZmZXJTaXplVGVzdCwgVGVzdEF1ZGlvRGVjb2RlcikgeworICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgImMyLmFuZHJvaWQuYWFjLmRlY29kZXIiKTsKKyAgICBjZmctPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIDQ0MTAwKTsKKyAgICBjZmctPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgMik7CisgICAgY2ZnLT5zZXRTdHJpbmcoIm1pbWUiLCBNSU1FVFlQRV9BVURJT19BQUMpOworCisgICAgY29uc3QgaW50MzJfdCBJbnB1dFNpemUgPSBHZXRQYXJhbSgpOworICAgIGlmIChJbnB1dFNpemUgPj0gMCkgeworICAgICAgICBjZmctPnNldEludDMyKCJtYXgtaW5wdXQtc2l6ZSIsIElucHV0U2l6ZSk7CisgICAgfQorCisgICAgRVhQRUNUX0VRKGNvZGVjLT5jb25maWd1cmUoY2ZnLCBudWxscHRyLCBudWxscHRyLCAwKSwgT0spOworICAgIEVYUEVDVF9FUShjb2RlYy0+Z2V0SW5wdXRGb3JtYXQoJmlmbXQpLCBPSyk7CisgICAgaW50MzJfdCBtYXhJbnB1dFNpemU7CisgICAgaWYgKElucHV0U2l6ZSA+IDApIHsKKyAgICAgICAgQVNTRVJUX1RSVUUoaWZtdC0+ZmluZEludDMyKCJtYXgtaW5wdXQtc2l6ZSIsICZtYXhJbnB1dFNpemUpKTsKKyAgICAgICAgRVhQRUNUX0VRKG1heElucHV0U2l6ZSwgSW5wdXRTaXplKTsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaWZtdC0+ZmluZEludDMyKCJtYXgtaW5wdXQtc2l6ZSIsICZtYXhJbnB1dFNpemUpKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEobWF4SW5wdXRTaXplLCAxIDw8IDE5KTsgLy8gNTEyIEtCCisgICAgICAgIH0KKyAgICAgICAgbWF4SW5wdXRTaXplID0ga0xpbmVhckJ1ZmZlclNpemU7IC8vIGlucHV0IHNpemUgaXMgc2V0IGJ5IGNoYW5uZWwKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPnN0YXJ0KCksICBPSyk7CisgICAgc2l6ZV90IGl4OworICAgIEVYUEVDVF9FUShjb2RlYy0+ZGVxdWV1ZUlucHV0QnVmZmVyKCZpeCwgMTAwMDAwMCksIE9LKTsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWY7CisgICAgRVhQRUNUX0VRKGNvZGVjLT5nZXRJbnB1dEJ1ZmZlcihpeCwgJmJ1ZiksICBPSyk7CisgICAgRVhQRUNUX0dFKGJ1Zi0+c2l6ZSgpLCAoc2l6ZV90KW1heElucHV0U2l6ZSk7CisgICAgRVhQRUNUX0xFKGJ1Zi0+c2l6ZSgpLCAoc2l6ZV90KW1heElucHV0U2l6ZSArIDQwOTZ1KTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoSW5wdXRTaXplcywgTWVkaWFDb2RlY0lucHV0QnVmZmVyU2l6ZVRlc3QsIDo6dGVzdGluZzo6VmFsdWVzKC0xLCAxMjM0LCAxMjM0NTY3OCkpOworCitURVNUX0YoTWVkaWFDb2RlY1Nhbml0eVRlc3QsIFRlc3RBdmNEZWNvZGVySGRyU3RhdGljSW5mbykgeworICAgIGNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKGxvb3BlciwgImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiKTsKKyAgICBjZmctPnNldEludDMyKCJ3aWR0aCIsIDMyMCk7CisgICAgY2ZnLT5zZXRJbnQzMigiaGVpZ2h0IiwgMjQwKTsKKyAgICBjZmctPnNldFN0cmluZygibWltZSIsIE1JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgSERSU3RhdGljSW5mbyBpbmZvID0geyAubUlEID0gSERSU3RhdGljSW5mbzo6a1R5cGUxLCAuc1R5cGUxID0geworICAgICAgICAubVIgPSB7IC54ID0gMzU0MDAsIC55ID0gMTQ2MDAgfSwgLm1HID0geyAueCA9IDg1MDAsICAueSA9IDM5ODUwIH0sCisgICAgICAgIC5tQiA9IHsgLnggPSA2NTUwLCAgLnkgPSAgMjMwMCB9LCAubVcgPSB7IC54ID0gMTU2MzUsIC55ID0gMTY0NTAgfSwKKyAgICAgICAgLm1NYXhEaXNwbGF5THVtaW5hbmNlID0gMTAwMCwgLm1NaW5EaXNwbGF5THVtaW5hbmNlID0gMTAwMCwKKyAgICAgICAgLm1NYXhDb250ZW50TGlnaHRMZXZlbCA9IDEwMDAsIC5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IDEyMCB9CisgICAgfTsKKyAgICBjZmctPnNldEJ1ZmZlcigiaGRyLXN0YXRpYy1pbmZvIiwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCZpbmZvLCBzaXplb2YoaW5mbykpKTsKKworICAgIEVYUEVDVF9FUShjb2RlYy0+Y29uZmlndXJlKGNmZywgbnVsbHB0ciwgbnVsbHB0ciwgMCksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEZvcm1hdCgmb2ZtdCksIE9LKTsKKyAgICBzcDxBQnVmZmVyPiBvaW5mbzsKKyAgICBBU1NFUlRfVFJVRShvZm10LT5maW5kQnVmZmVyKCJoZHItc3RhdGljLWluZm8iLCAmb2luZm8pKTsKKyAgICBBU1NFUlRfRVEob2luZm8tPnNpemUoKSwgc2l6ZW9mKGluZm8pKTsKKyAgICBFWFBFQ1RfRVEobWVtY21wKG9pbmZvLT5kYXRhKCksICZpbmZvLCBzaXplb2YoaW5mbykpLCAgMCk7CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPnN0YXJ0KCksICBPSyk7CisgICAgLy8gYXNzdW1lIHdlIGNhbiBzdWJtaXQgYWxsIGlucHV0IGJlZm9yZSBkZXF1ZXVpbmcgb3V0cHV0CisgICAgc2l6ZV90IGZyYW1lSXggPSAwOworICAgIHNpemVfdCBpeDsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWY7CisgICAgZm9yIChjb25zdCBGcmFtZURhdGEgJmZyYW1lIDogYXZjU3RyZWFtX0IpIHsKKyAgICAgICAgRVhQRUNUX0VRKGNvZGVjLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJml4LCAxMDAwMDAwKSwgT0spOworICAgICAgICBFWFBFQ1RfRVEoY29kZWMtPmdldElucHV0QnVmZmVyKGl4LCAmYnVmKSwgIE9LKTsKKyAgICAgICAgQVNTRVJUX0dFKGJ1Zi0+Y2FwYWNpdHkoKSwgZnJhbWUuc2l6ZSk7CisgICAgICAgIG1lbWNweShidWYtPmJhc2UoKSwgZnJhbWUuZGF0YSwgZnJhbWUuc2l6ZSk7CisgICAgICAgIEVYUEVDVF9FUShidWYtPnNldFJhbmdlKDAsIGZyYW1lLnNpemUpLCBPSyk7CisgICAgICAgIGJvb2wgZW9zID0gKytmcmFtZUl4ID09IE5FTEVNKGF2Y1N0cmVhbV9CKTsKKyAgICAgICAgRVhQRUNUX0VRKGNvZGVjLT5xdWV1ZUlucHV0QnVmZmVyKGl4LCAwLCBmcmFtZS5zaXplLCBmcmFtZUl4ICogMzMzMzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlb3MgPyBCVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNIDogMCksICBPSyk7CisgICAgfQorCisgICAgc2l6ZV90IG9mZnNldCwgc2l6ZTsKKyAgICBpbnQ2NF90IHRzOworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGJvb2wgbUluZm9Gb3JtYXRDaGFuZ2VkT2sgPSB0cnVlOworICAgIGJvb2wgbUluZm9CdWZmZXJzQ2hhbmdlZE9rID0gdHJ1ZTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb2RlYy0+ZGVxdWV1ZU91dHB1dEJ1ZmZlcigmaXgsICZvZmZzZXQsICZzaXplLCAmdHMsICZmbGFncywgMTAwMDAwMCk7CisgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCAmJiBtSW5mb0Zvcm1hdENoYW5nZWRPaykgeworICAgICAgICAgICAgbUluZm9Gb3JtYXRDaGFuZ2VkT2sgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEICYmIG1JbmZvQnVmZmVyc0NoYW5nZWRPaykgeworICAgICAgICAgICAgbUluZm9CdWZmZXJzQ2hhbmdlZE9rID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoZXJyLCBPSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEJ1ZmZlcihpeCwgJmJ1ZiksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEZvcm1hdChpeCwgJm9mbXQpLCBPSyk7CisgICAgQVNTRVJUX1RSVUUob2ZtdC0+ZmluZEJ1ZmZlcigiaGRyLXN0YXRpYy1pbmZvIiwgJm9pbmZvKSk7CisgICAgQVNTRVJUX0VRKG9pbmZvLT5zaXplKCksIHNpemVvZihpbmZvKSk7CisgICAgRVhQRUNUX0VRKG1lbWNtcChvaW5mby0+ZGF0YSgpLCAmaW5mbywgc2l6ZW9mKGluZm8pKSwgIDApOworfQorCitURVNUX0YoTWVkaWFDb2RlY1Nhbml0eVRlc3QsIFRlc3RWaWRlb0RlY29kZXJIZHJTdGF0aWNJbmZvKSB7CisgICAgY29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeUNvbXBvbmVudE5hbWUobG9vcGVyLCAiYzIuYW5kcm9pZC5tcGVnNC5kZWNvZGVyIik7CisgICAgY2ZnLT5zZXRJbnQzMigid2lkdGgiLCAzMjApOworICAgIGNmZy0+c2V0SW50MzIoImhlaWdodCIsIDI0MCk7CisgICAgY2ZnLT5zZXRTdHJpbmcoIm1pbWUiLCBNSU1FVFlQRV9WSURFT19NUEVHNCk7CisgICAgSERSU3RhdGljSW5mbyBpbmZvID0geyAubUlEID0gSERSU3RhdGljSW5mbzo6a1R5cGUxLCAuc1R5cGUxID0geworICAgICAgICAubVIgPSB7IC54ID0gMzU0MDAsIC55ID0gMTQ2MDAgfSwgLm1HID0geyAueCA9IDg1MDAsICAueSA9IDM5ODUwIH0sCisgICAgICAgIC5tQiA9IHsgLnggPSA2NTUwLCAgLnkgPSAgMjMwMCB9LCAubVcgPSB7IC54ID0gMTU2MzUsIC55ID0gMTY0NTAgfSwKKyAgICAgICAgLm1NYXhEaXNwbGF5THVtaW5hbmNlID0gMTAwMCwgLm1NaW5EaXNwbGF5THVtaW5hbmNlID0gMTAwMCwKKyAgICAgICAgLm1NYXhDb250ZW50TGlnaHRMZXZlbCA9IDEwMDAsIC5tTWF4RnJhbWVBdmVyYWdlTGlnaHRMZXZlbCA9IDEyMCB9CisgICAgfTsKKyAgICBjZmctPnNldEJ1ZmZlcigiaGRyLXN0YXRpYy1pbmZvIiwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCZpbmZvLCBzaXplb2YoaW5mbykpKTsKKworICAgIEVYUEVDVF9FUShjb2RlYy0+Y29uZmlndXJlKGNmZywgbnVsbHB0ciwgbnVsbHB0ciwgMCksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEZvcm1hdCgmb2ZtdCksIE9LKTsKKyAgICBzcDxBQnVmZmVyPiBvaW5mbzsKKyAgICBBU1NFUlRfVFJVRShvZm10LT5maW5kQnVmZmVyKCJoZHItc3RhdGljLWluZm8iLCAmb2luZm8pKTsKKyAgICBBU1NFUlRfRVEob2luZm8tPnNpemUoKSwgc2l6ZW9mKGluZm8pKTsKKyAgICBFWFBFQ1RfRVEobWVtY21wKG9pbmZvLT5kYXRhKCksICZpbmZvLCBzaXplb2YoaW5mbykpLCAgMCk7Cit9CisKK2NsYXNzIE1lZGlhQ29kZWNCeXRlQnVmZmVyVGVzdCA6IHB1YmxpYyBNZWRpYUNvZGVjU2FuaXR5VGVzdCwKKyAgICAgICAgcHVibGljIDo6dGVzdGluZzo6V2l0aFBhcmFtSW50ZXJmYWNlPGludDMyX3Q+IHsKK307CisKK1RFU1RfUChNZWRpYUNvZGVjQnl0ZUJ1ZmZlclRlc3QsIFRlc3RWaWRlb0RlY29kZXI0MjBQbGFuYXIpIHsKKyAgICBjb2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZShsb29wZXIsICJjMi5hbmRyb2lkLmF2Yy5kZWNvZGVyIik7CisvLyAgICBjb2RlYyA9IE1lZGlhQ29kZWM6OkNyZWF0ZUJ5Q29tcG9uZW50TmFtZShsb29wZXIsICJPTVguZ29vZ2xlLmgyNjQuZGVjb2RlciIpOworICAgIGNmZy0+c2V0SW50MzIoIndpZHRoIiwgMzIwKTsKKyAgICBjZmctPnNldEludDMyKCJoZWlnaHQiLCAyNDApOworICAgIGNmZy0+c2V0U3RyaW5nKCJtaW1lIiwgTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBjb25zdCBpbnQzMl90IENvbG9yID0gR2V0UGFyYW0oKTsKKyAgICBpZiAoQ29sb3IgPj0gMCkgeworICAgICAgICBjZmctPnNldEludDMyKCJjb2xvci1mb3JtYXQiLCBDb2xvcik7CisgICAgfQorICAgIGludDMyX3QgeGNvbG9yID0gQ29sb3IgPT0gLTEgPyBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIgOiBDb2xvcjsKKworICAgIEVYUEVDVF9FUShjb2RlYy0+Y29uZmlndXJlKGNmZywgbnVsbHB0ciwgbnVsbHB0ciwgMCksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEZvcm1hdCgmb2ZtdCksIE9LKTsKKyAgICBpbnQzMl90IG9jb2xvciA9IC0xOworICAgIEVYUEVDVF9UUlVFKG9mbXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJm9jb2xvcikpOworICAgIEVYUEVDVF9FUShvY29sb3IsIHhjb2xvcik7CisKKyAgICBFWFBFQ1RfRVEoY29kZWMtPnN0YXJ0KCksICBPSyk7CisgICAgLy8gYXNzdW1lIHdlIGNhbiBzdWJtaXQgYWxsIGlucHV0IGJlZm9yZSBkZXF1ZXVpbmcgb3V0cHV0CisgICAgc2l6ZV90IGZyYW1lSXggPSAwOworICAgIHNpemVfdCBpeDsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWY7CisgICAgZm9yIChjb25zdCBGcmFtZURhdGEgJmZyYW1lIDogYXZjU3RyZWFtX0EpIHsKKyAgICAgICAgRVhQRUNUX0VRKGNvZGVjLT5kZXF1ZXVlSW5wdXRCdWZmZXIoJml4LCAxMDAwMDAwKSwgT0spOworICAgICAgICBFWFBFQ1RfRVEoY29kZWMtPmdldElucHV0QnVmZmVyKGl4LCAmYnVmKSwgIE9LKTsKKyAgICAgICAgQVNTRVJUX0dFKGJ1Zi0+Y2FwYWNpdHkoKSwgZnJhbWUuc2l6ZSk7CisgICAgICAgIG1lbWNweShidWYtPmJhc2UoKSwgZnJhbWUuZGF0YSwgZnJhbWUuc2l6ZSk7CisgICAgICAgIEVYUEVDVF9FUShidWYtPnNldFJhbmdlKDAsIGZyYW1lLnNpemUpLCBPSyk7CisgICAgICAgIGJvb2wgZW9zID0gKytmcmFtZUl4ID09IE5FTEVNKGF2Y1N0cmVhbV9BKTsKKyAgICAgICAgRVhQRUNUX0VRKGNvZGVjLT5xdWV1ZUlucHV0QnVmZmVyKGl4LCAwLCBmcmFtZS5zaXplLCBmcmFtZUl4ICogMzMzMzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlb3MgPyBCVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNIDogMCksICBPSyk7CisgICAgfQorCisgICAgc2l6ZV90IG9mZnNldCwgc2l6ZTsKKyAgICBpbnQ2NF90IHRzOworICAgIHVpbnQzMl90IGZsYWdzOworICAgIGJvb2wgbUluZm9Gb3JtYXRDaGFuZ2VkT2sgPSB0cnVlOworICAgIGJvb2wgbUluZm9CdWZmZXJzQ2hhbmdlZE9rID0gdHJ1ZTsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBjb2RlYy0+ZGVxdWV1ZU91dHB1dEJ1ZmZlcigmaXgsICZvZmZzZXQsICZzaXplLCAmdHMsICZmbGFncywgMTAwMDAwMCk7CisgICAgICAgIGlmIChlcnIgPT0gSU5GT19GT1JNQVRfQ0hBTkdFRCAmJiBtSW5mb0Zvcm1hdENoYW5nZWRPaykgeworICAgICAgICAgICAgbUluZm9Gb3JtYXRDaGFuZ2VkT2sgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEICYmIG1JbmZvQnVmZmVyc0NoYW5nZWRPaykgeworICAgICAgICAgICAgbUluZm9CdWZmZXJzQ2hhbmdlZE9rID0gZmFsc2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfRVEoZXJyLCBPSyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEJ1ZmZlcihpeCwgJmJ1ZiksIE9LKTsKKyAgICBFWFBFQ1RfRVEoY29kZWMtPmdldE91dHB1dEZvcm1hdChpeCwgJm9mbXQpLCBPSyk7CisgICAgQVNTRVJUX1RSVUUob2ZtdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmb2NvbG9yKSk7CisgICAgRVhQRUNUX0VRKG9jb2xvciwgeGNvbG9yKSA8PCBvZm10LT5kZWJ1Z1N0cmluZyg4KS5jX3N0cigpIDw8IGJ1Zi0+bWV0YSgpLT5kZWJ1Z1N0cmluZyg4KS5jX3N0cigpOworICAgIC8vIGV4cGVjdCBhbiBpbWFnZS1kYXRhIGluIGJvdGggZm9ybWF0IGFuZCBtZXRhCisgICAgc3A8QUJ1ZmZlcj4gaW1nQnVmLCBpbWdCdWYyOworICAgIEFTU0VSVF9UUlVFKG9mbXQtPmZpbmRCdWZmZXIoImltYWdlLWRhdGEiLCAmaW1nQnVmKSk7CisgICAgQVNTRVJUX1RSVUUoYnVmLT5tZXRhKCktPmZpbmRCdWZmZXIoImltYWdlLWRhdGEiLCAmaW1nQnVmMikpOworICAgIEVYUEVDVF9FUShpbWdCdWYtPnNpemUoKSwgc2l6ZW9mKE1lZGlhSW1hZ2UyKSk7CisgICAgQVNTRVJUX0VRKGltZ0J1Zi0+c2l6ZSgpLCBpbWdCdWYyLT5zaXplKCkpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoaW1nQnVmLT5kYXRhKCksIGltZ0J1ZjItPmRhdGEoKSwgaW1nQnVmLT5zaXplKCkpKTsKKyAgICBNZWRpYUltYWdlMiAqaW1nID0gKE1lZGlhSW1hZ2UyKilpbWdCdWYtPmRhdGEoKTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tVHlwZSwgaW1nLT5NRURJQV9JTUFHRV9UWVBFX1lVVik7CisgICAgRVhQRUNUX0VRKGltZy0+bU51bVBsYW5lcywgM3UpOworICAgIEVYUEVDVF9FUShpbWctPm1XaWR0aCwgMzIwdSk7CisgICAgRVhQRUNUX0VRKGltZy0+bUhlaWdodCwgMjQwdSk7CisgICAgRVhQRUNUX0VRKGltZy0+bUJpdERlcHRoLCA4dSk7CisgICAgRVhQRUNUX0VRKGltZy0+bUJpdERlcHRoQWxsb2NhdGVkLCA4dSk7CisKKyAgICAvLyByZWFkIHN0cmlkZXMgZnJvbSBmb3JtYXQKKyAgICBpbnQzMl90IHN0cmlkZSwgdnN0cmlkZTsKKyAgICBvZm10LT5maW5kSW50MzIoInN0cmlkZSIsICZzdHJpZGUpICAgICAgICAgIHx8IG9mbXQtPmZpbmRJbnQzMigid2lkdGgiLCAmc3RyaWRlKTsKKyAgICBvZm10LT5maW5kSW50MzIoInNsaWNlLWhlaWdodCIsICZ2c3RyaWRlKSAgIHx8IG9mbXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJnZzdHJpZGUpOworCisgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+WV0ubUhvcml6U3Vic2FtcGxpbmcsIDF1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tVmVydFN1YnNhbXBsaW5nLCAxdSk7CisgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+VV0ubUhvcml6U3Vic2FtcGxpbmcsIDJ1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5VXS5tVmVydFN1YnNhbXBsaW5nLCAydSk7CisgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+Vl0ubUhvcml6U3Vic2FtcGxpbmcsIDJ1KTsKKyAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5WXS5tVmVydFN1YnNhbXBsaW5nLCAydSk7CisKKyAgICBzd2l0Y2ggKHhjb2xvcikgeworICAgICAgICAvLyBkZWZpbmVkIGZvcm1hdHMKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXI6CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkUGxhbmFyOgorICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+WV0ubU9mZnNldCwgMHUpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+WV0ubUNvbEluYywgMSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tUm93SW5jLCBzdHJpZGUpOworCisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5VXS5tT2Zmc2V0LCAodWludDMyX3QpKHN0cmlkZSAqIHZzdHJpZGUpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlVdLm1Db2xJbmMsIDEpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+VV0ubVJvd0luYywgc3RyaWRlIC8gMik7CisKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1PZmZzZXQsICh1aW50MzJfdCkoc3RyaWRlICogdnN0cmlkZSAqIDUgLyA0KSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5WXS5tQ29sSW5jLCAxKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1Sb3dJbmMsIHN0cmlkZSAvIDIpOworCisgICAgICAgICAgICBFWFBFQ1RfR0Uoc2l6ZSwgKHNpemVfdCkoc3RyaWRlICogdnN0cmlkZSAqIDUgLyA0ICsgc3RyaWRlIC8gMiAqIDExOSArIDE2MCkpOworICAgICAgICAgICAgRVhQRUNUX0xFKHNpemUsIChzaXplX3QpKHN0cmlkZSAqIHZzdHJpZGUgKiAzIC8gMikpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tT2Zmc2V0LCAwdSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5ZXS5tQ29sSW5jLCAxKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlldLm1Sb3dJbmMsIHN0cmlkZSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlVdLm1PZmZzZXQsICh1aW50MzJfdCkoc3RyaWRlICogdnN0cmlkZSkpOworICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+VV0ubUNvbEluYywgMik7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5VXS5tUm93SW5jLCBzdHJpZGUpOworCisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5WXS5tT2Zmc2V0LCAodWludDMyX3QpKHN0cmlkZSAqIHZzdHJpZGUgKyAxKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoaW1nLT5tUGxhbmVbaW1nLT5WXS5tQ29sSW5jLCAyKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpbWctPm1QbGFuZVtpbWctPlZdLm1Sb3dJbmMsIHN0cmlkZSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9HRShzaXplLCAoc2l6ZV90KShzdHJpZGUgKiB2c3RyaWRlICsgc3RyaWRlICogMTE5ICsgMzIwKSk7CisgICAgICAgICAgICBFWFBFQ1RfTEUoc2l6ZSwgKHNpemVfdCkoc3RyaWRlICogdnN0cmlkZSAqIDMgLyAyKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOgorICAgICAgICAgICAgLy8gYW55dGhpbmcgZ29lcywgYnV0IHN0cmlkZSBzaG91bGQgbWF0Y2ggWSBwbGFuZQorICAgICAgICAgICAgRVhQRUNUX0VRKGltZy0+bVBsYW5lW2ltZy0+WV0ubVJvd0luYywgc3RyaWRlKTsKKworICAgICAgICAgICAgRVhQRUNUX0dFKHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+bVBsYW5lW2ltZy0+WV0ubU9mZnNldCArIDIzOSAqIGltZy0+bVBsYW5lW2ltZy0+WV0ubVJvd0luYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAzMTkgKiBpbWctPm1QbGFuZVtpbWctPlldLm1Db2xJbmMgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+bVBsYW5lW2ltZy0+VV0ubU9mZnNldCArIDExOSAqIGltZy0+bVBsYW5lW2ltZy0+VV0ubVJvd0luYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxNTkgKiBpbWctPm1QbGFuZVtpbWctPlVdLm1Db2xJbmMgKyAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltZy0+bVBsYW5lW2ltZy0+Vl0ubU9mZnNldCArIDExOSAqIGltZy0+bVBsYW5lW2ltZy0+Vl0ubVJvd0luYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxNTkgKiBpbWctPm1QbGFuZVtpbWctPlZdLm1Db2xJbmMgKyAxIH0pKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyB2YWxpZGF0ZSBhbGwgcGl4ZWxzCisjaWYgMAorICAgIGZwcmludGYoc3RkZXJyLCAiTWVkaWFJbWFnZSB7IEYoJXV4JXUpIEAldSslZCslZCBAJXUrJWQrJWQgQCV1KyVkKyVkIH1cbiIsCisgICAgICAgICAgICBpbWctPm1XaWR0aCwgaW1nLT5tSGVpZ2h0LAorICAgICAgICAgICAgaW1nLT5tUGxhbmVbMF0ubU9mZnNldCwgaW1nLT5tUGxhbmVbMF0ubUNvbEluYywgaW1nLT5tUGxhbmVbMF0ubVJvd0luYywKKyAgICAgICAgICAgIGltZy0+bVBsYW5lWzFdLm1PZmZzZXQsIGltZy0+bVBsYW5lWzFdLm1Db2xJbmMsIGltZy0+bVBsYW5lWzFdLm1Sb3dJbmMsCisgICAgICAgICAgICBpbWctPm1QbGFuZVsyXS5tT2Zmc2V0LCBpbWctPm1QbGFuZVsyXS5tQ29sSW5jLCBpbWctPm1QbGFuZVsyXS5tUm93SW5jKTsKKyNlbmRpZgorICAgIGZvciAoaXggPSAwOyBpeCA8IDM7ICsraXgpIHsKKyAgICAgICAgY29uc3Qgc3RhdGljIHVpbnQ4X3QgZXhwZWN0ZWRbXSA9IHsgMjEwLCAxNiwgMTQ2IH07CisgICAgICAgIGZvciAodWludDMyX3QgeSA9IDA7IHkgPCBpbWctPm1IZWlnaHQgLyBpbWctPm1QbGFuZVtpeF0ubVZlcnRTdWJzYW1wbGluZyA7ICsreSkgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCB4ID0gMDsgeCA8IGltZy0+bVdpZHRoIC8gaW1nLT5tUGxhbmVbaXhdLm1Ib3JpelN1YnNhbXBsaW5nOyArK3gpIHsKKyAgICAgICAgICAgICAgICB1aW50OF90IHZhbCA9IGJ1Zi0+ZGF0YSgpW2ltZy0+bVBsYW5lW2l4XS5tT2Zmc2V0ICsgaW1nLT5tUGxhbmVbaXhdLm1Db2xJbmMgKiB4CisgICAgICAgICAgICAgICAgICAgICAgICArIGltZy0+bVBsYW5lW2l4XS5tUm93SW5jICogeV07CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHZhbCwgZXhwZWN0ZWRbaXhdKSA8PCAiaW5jb3JyZWN0IHZhbHVlIGZvciBwbGFuZSAiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBpeCA8PCAiIGF0IHg9IiA8PCB4IDw8ICIsIHk9IiA8PCB5OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChJbnB1dFNpemVzLCBNZWRpYUNvZGVjQnl0ZUJ1ZmZlclRlc3QsIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAtMSwKKyAgICAgICAgQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyLAorICAgICAgICBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyLAorICAgICAgICBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRQbGFuYXIsCisgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIsCisgICAgICAgIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlKSk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi90ZXN0cy9SZWZsZWN0ZWRQYXJhbVVwZGF0ZXJfdGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvUmVmbGVjdGVkUGFyYW1VcGRhdGVyX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZGIwZTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdGVzdHMvUmVmbGVjdGVkUGFyYW1VcGRhdGVyX3Rlc3QuY3BwCkBAIC0wLDAgKzEsMzUyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXworCisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgorI2luY2x1ZGUgPFJlZmxlY3RlZFBhcmFtVXBkYXRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKK2VudW0geworICAgIGtQYXJhbUluZGV4VGVzdFN0YXJ0ID0gMHgxMDAwLAorICAgIGtQYXJhbUluZGV4SW50LAorICAgIGtQYXJhbUluZGV4U3RyaW5nLAorICAgIGtQYXJhbUluZGV4Q29tcG9zaXRlLAorICAgIGtQYXJhbUluZGV4RmxleFN0cmluZywKKworICAgIGtQYXJhbUluZGV4TG9uZyA9IEMyUGFyYW06OlRZUEVfSU5ERVhfVkVORE9SX1NUQVJULAorfTsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJJbnQzMlZhbHVlLCBrUGFyYW1JbmRleEludD4gQzJJbnRJbmZvOwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJJbnQ2NFZhbHVlLCBrUGFyYW1JbmRleExvbmc+IEMyTG9uZ0luZm87CisKK3N0cnVjdCBDMkZpeGVkU2l6ZVN0cmluZ1N0cnVjdCB7CisgICAgY2hhciB2YWx1ZVsxMl07CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfQzJTVFJVQ1QoRml4ZWRTaXplU3RyaW5nKQorICAgIEMyRklFTEQodmFsdWUsICJ2YWx1ZSIpCit9OwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJGaXhlZFNpemVTdHJpbmdTdHJ1Y3QsIGtQYXJhbUluZGV4U3RyaW5nPiBDMlN0cmluZ0luZm87CisKK3N0cnVjdCBDMkNvbXBvc2l0ZVN0cnVjdCB7CisgICAgaW50MzJfdCBpMzI7CisgICAgdWludDY0X3QgdTY0OworICAgIGNoYXIgc3RyWzEyXTsKKyAgICB1aW50OF90IGJsb2JbOF07CisgICAgdWludDhfdCBmbGV4QmxvYltdOworCisgICAgQzJDb21wb3NpdGVTdHJ1Y3QoKSA9IGRlZmF1bHQ7CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfRkxFWF9DMlNUUlVDVChDb21wb3NpdGUsIGZsZXhCbG9iKQorICAgIEMyRklFTEQoaTMyLCAiaTMyIikKKyAgICBDMkZJRUxEKHU2NCwgInU2NCIpCisgICAgQzJGSUVMRChzdHIsICJzdHIiKQorICAgIEMyRklFTEQoYmxvYiwgImJsb2IiKQorICAgIEMyRklFTEQoZmxleEJsb2IsICJmbGV4LWJsb2IiKQorfTsKK3N0YXRpY19hc3NlcnQoQzJDb21wb3NpdGVTdHJ1Y3Q6OkZMRVhfU0laRSA9PSAxLCAiIik7CitzdGF0aWNfYXNzZXJ0KF9DMkZsZXhIZWxwZXI8QzJDb21wb3NpdGVTdHJ1Y3Q+OjpGTEVYX1NJWkUgPT0gMSwgIiIpOwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJDb21wb3NpdGVTdHJ1Y3QsIGtQYXJhbUluZGV4Q29tcG9zaXRlPiBDMkNvbXBvc2l0ZUluZm87CisKK3R5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4RmxleFN0cmluZz4gQzJGbGV4U3RyaW5nSW5mbzsKKworI2RlZmluZSBTVVBQT1JURURfVFlQRVMgICBcCisgICAgQzJJbnRJbmZvLCAgICAgICAgICAgIFwKKyAgICBDMkxvbmdJbmZvLCAgICAgICAgICAgXAorICAgIEMyU3RyaW5nSW5mbywgICAgICAgICBcCisgICAgQzJDb21wb3NpdGVJbmZvLCAgICAgIFwKKyAgICBDMkZsZXhTdHJpbmdJbmZvCisKK3RlbXBsYXRlPHR5cGVuYW1lLi4uIFRZUEVTPiBzdHJ1Y3QgZGVzY3JpYmVfaW1wbDsKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFRZUEVTPiBzdHJ1Y3QgZGVzY3JpYmVfaW1wbDxULCBUWVBFUy4uLj4geworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgpIHsKKyAgICAgICAgaWYgKGluZGV4ID09IFQ6OkNPUkVfSU5ERVgpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEMyU3RydWN0RGVzY3JpcHRvcj4oVDo6Q09SRV9JTkRFWCwgVDo6RmllbGRMaXN0KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIGRlc2NyaWJlX2ltcGw8VFlQRVMuLi4+OjpkZXNjcmliZShpbmRleCk7CisgICAgICAgIH0KKyAgICB9Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBkZXNjcmliZV9pbXBsPD4geworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXgpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gY29uc3QgY2hhciAqR2V0TmFtZSgpICAgICAgICB7IHJldHVybiBudWxscHRyOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0IGNoYXIgKkdldE5hbWU8QzJJbnRJbmZvPigpICAgICAgIHsgcmV0dXJuICJpbnQiOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0IGNoYXIgKkdldE5hbWU8QzJMb25nSW5mbz4oKSAgICAgIHsgcmV0dXJuICJsb25nIjsgfQordGVtcGxhdGU8PiBjb25zdCBjaGFyICpHZXROYW1lPEMyU3RyaW5nSW5mbz4oKSAgICB7IHJldHVybiAic3RyaW5nIjsgfQordGVtcGxhdGU8PiBjb25zdCBjaGFyICpHZXROYW1lPEMyQ29tcG9zaXRlSW5mbz4oKSB7IHJldHVybiAiY29tcG9zaXRlIjsgfQordGVtcGxhdGU8PiBjb25zdCBjaGFyICpHZXROYW1lPEMyRmxleFN0cmluZ0luZm8+KCkgeyByZXR1cm4gImZsZXgtc3RyaW5nIjsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBUWVBFUz4gc3RydWN0IGZpbGxfZGVzY3JpcHRvcnNfaW1wbDsKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lLi4uIFRZUEVTPiBzdHJ1Y3QgZmlsbF9kZXNjcmlwdG9yc19pbXBsPFQsIFRZUEVTLi4uPiB7CisgICAgc3RhdGljIHZvaWQgZmlsbChzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqdmVjKSB7CisgICAgICAgIGZpbGxfZGVzY3JpcHRvcnNfaW1wbDxUWVBFUy4uLj46OmZpbGwodmVjKTsKKyAgICAgICAgdmVjLT5wdXNoX2JhY2soc3RkOjptYWtlX3NoYXJlZDxDMlBhcmFtRGVzY3JpcHRvcj4oCisgICAgICAgICAgICAgICAgVDo6UEFSQU1fVFlQRSwgQzJQYXJhbURlc2NyaXB0b3I6OklTX1BFUlNJU1RFTlQsIEdldE5hbWU8VD4oKSkpOworICAgIH0KK307CisKK3RlbXBsYXRlPD4gc3RydWN0IGZpbGxfZGVzY3JpcHRvcnNfaW1wbDw+IHsKKyAgICBzdGF0aWMgdm9pZCBmaWxsKHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICopIHt9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBUICpDYXN0UGFyYW0oY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+ICZwYXJhbSkgeworICAgIHJldHVybiAoVCAqKXBhcmFtLmdldCgpOworfQorCitjbGFzcyBQYXJhbVJlZmxlY3RvciA6IHB1YmxpYyBDMlBhcmFtUmVmbGVjdG9yIHsKK3B1YmxpYzoKKyAgICBQYXJhbVJlZmxlY3RvcigpID0gZGVmYXVsdDsKKyAgICB+UGFyYW1SZWZsZWN0b3IoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggcGFyYW1JbmRleCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gZGVzY3JpYmVfaW1wbDxTVVBQT1JURURfVFlQRVM+OjpkZXNjcmliZShwYXJhbUluZGV4KTsKKyAgICB9Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworY2xhc3MgUmVmbGVjdGVkUGFyYW1VcGRhdGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlclRlc3QoKSA6IG1SZWZsZWN0b3IobmV3IFBhcmFtUmVmbGVjdG9yKSB7CisgICAgICAgIGZpbGxfZGVzY3JpcHRvcnNfaW1wbDxTVVBQT1JURURfVFlQRVM+OjpmaWxsKCZtRGVzY3JpcHRvcnMpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBtUmVmbGVjdG9yOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+IG1EZXNjcmlwdG9yczsKK307CisKK1RFU1RfRihSZWZsZWN0ZWRQYXJhbVVwZGF0ZXJUZXN0LCBTaW5nbGVWYWx1ZVRlc3QpIHsKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIgdXBkYXRlcjsKKworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBtc2c7CisgICAgbXNnLmVtcGxhY2UoImludC52YWx1ZSIsIGludDMyX3QoMTIpKTsKKyAgICBtc2cuZW1wbGFjZSgidmVuZG9yLmxvbmcudmFsdWUiLCBpbnQ2NF90KDM0KSk7CisKKyAgICB1cGRhdGVyLmFkZFBhcmFtRGVzYyhtUmVmbGVjdG9yLCBtRGVzY3JpcHRvcnMpOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgdXBkYXRlci5nZXRQYXJhbUluZGljZXNGcm9tTWVzc2FnZShtc2csICZpbmRpY2VzKTsKKyAgICBFWFBFQ1RfRVEoMSwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMySW50SW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgxLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJMb25nSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJTdHJpbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkNvbXBvc2l0ZUluZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyRmxleFN0cmluZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgIHBhcmFtcy5lbXBsYWNlX2JhY2sobmV3IEMySW50SW5mbyk7CisgICAgcGFyYW1zLmVtcGxhY2VfYmFjayhuZXcgQzJMb25nSW5mbyk7CisgICAgRVhQRUNUX0VRKDAsIENhc3RQYXJhbTxDMkludEluZm8+KHBhcmFtc1swXSktPnZhbHVlKTsKKyAgICBFWFBFQ1RfRVEoMCwgQ2FzdFBhcmFtPEMyTG9uZ0luZm8+KHBhcmFtc1sxXSktPnZhbHVlKTsKKworICAgIHVwZGF0ZXIudXBkYXRlUGFyYW1zRnJvbU1lc3NhZ2UobXNnLCAmcGFyYW1zKTsKKyAgICBFWFBFQ1RfRVEoMTIsIENhc3RQYXJhbTxDMkludEluZm8+KHBhcmFtc1swXSktPnZhbHVlKTsKKyAgICBFWFBFQ1RfRVEoMzQsIENhc3RQYXJhbTxDMkxvbmdJbmZvPihwYXJhbXNbMV0pLT52YWx1ZSk7CisKKyAgICBDMlZhbHVlIGMyVmFsdWU7CisgICAgaW50MzJfdCBpbnQzMlZhbHVlID0gMDsKKyAgICBpbnQ2NF90IGludDY0VmFsdWUgPSAwOworICAgIG1zZyA9IHVwZGF0ZXIuZ2V0UGFyYW1zKHBhcmFtcyk7CisgICAgQVNTRVJUX0VRKDF1LCBtc2cuY291bnQoImludC52YWx1ZSIpKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgbXNnWyJpbnQudmFsdWUiXS5maW5kKCZjMlZhbHVlKSk7CisgICAgRVhQRUNUX0VRKHRydWUsIGMyVmFsdWUuZ2V0KCZpbnQzMlZhbHVlKSk7CisgICAgRVhQRUNUX0VRKDEyLCBpbnQzMlZhbHVlKTsKKworICAgIEFTU0VSVF9FUSgxdSwgbXNnLmNvdW50KCJ2ZW5kb3IubG9uZy52YWx1ZSIpKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgbXNnWyJ2ZW5kb3IubG9uZy52YWx1ZSJdLmZpbmQoJmMyVmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgYzJWYWx1ZS5nZXQoJmludDY0VmFsdWUpKTsKKyAgICBFWFBFQ1RfRVEoMzQsIGludDY0VmFsdWUpOworfQorCitURVNUX0YoUmVmbGVjdGVkUGFyYW1VcGRhdGVyVGVzdCwgU3RyaW5nVGVzdCkgeworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlciB1cGRhdGVyOworCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IG1zZzsKKyAgICBtc2cuZW1wbGFjZSgic3RyaW5nLnZhbHVlIiwgQVN0cmluZygiNTYiKSk7CisgICAgbXNnLmVtcGxhY2UoImZsZXgtc3RyaW5nLnZhbHVlIiwgQVN0cmluZygiU29tZSBzdHJpbmciKSk7CisgICAgdXBkYXRlci5hZGRQYXJhbURlc2MobVJlZmxlY3RvciwgbURlc2NyaXB0b3JzKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBpbmRpY2VzOworICAgIHVwZGF0ZXIuZ2V0UGFyYW1JbmRpY2VzRnJvbU1lc3NhZ2UobXNnLCAmaW5kaWNlcyk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkludEluZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyTG9uZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMSwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyU3RyaW5nSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJDb21wb3NpdGVJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDEsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkZsZXhTdHJpbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IHBhcmFtczsKKyAgICBwYXJhbXMuZW1wbGFjZV9iYWNrKG5ldyBDMlN0cmluZ0luZm8pOworICAgIEVYUEVDVF9FUSgwLCBDYXN0UGFyYW08QzJTdHJpbmdJbmZvPihwYXJhbXNbMF0pLT52YWx1ZVswXSk7CisgICAgcGFyYW1zLmVtcGxhY2VfYmFjayhDMkZsZXhTdHJpbmdJbmZvOjpBbGxvY1VuaXF1ZSgwKSk7CisgICAgRVhQRUNUX0VRKDB1LCBDYXN0UGFyYW08QzJGbGV4U3RyaW5nSW5mbz4ocGFyYW1zWzFdKS0+ZmxleENvdW50KCkpOworICAgIGNoYXIgKmZsZXhTdHJpbmdEYXRhID0gJkNhc3RQYXJhbTxDMkZsZXhTdHJpbmdJbmZvPihwYXJhbXNbMV0pLT5tLnZhbHVlWzBdOworCisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9TVFJFUSgiNTYiLCBDYXN0UGFyYW08QzJTdHJpbmdJbmZvPihwYXJhbXNbMF0pLT52YWx1ZSk7CisgICAgRVhQRUNUX0VRKDEydSwgQ2FzdFBhcmFtPEMyRmxleFN0cmluZ0luZm8+KHBhcmFtc1swXSktPmZsZXhDb3VudCgpKTsKKyAgICBFWFBFQ1RfU1RSRVEoIlNvbWUgc3RyaW5nIiwgQ2FzdFBhcmFtPEMyRmxleFN0cmluZ0luZm8+KHBhcmFtc1sxXSktPm0udmFsdWUpOworICAgIEVYUEVDVF9ORShmbGV4U3RyaW5nRGF0YSwgJkNhc3RQYXJhbTxDMkZsZXhTdHJpbmdJbmZvPihwYXJhbXNbMV0pLT5tLnZhbHVlWzBdKTsKKyAgICBmbGV4U3RyaW5nRGF0YSA9ICZDYXN0UGFyYW08QzJGbGV4U3RyaW5nSW5mbz4ocGFyYW1zWzFdKS0+bS52YWx1ZVswXTsKKworICAgIC8vIHZlcmlmeSB0cnVuY2F0aW9uIGFuZCBpbi1wbGFjZSB1cGRhdGUKKyAgICBtc2dbInN0cmluZy52YWx1ZSJdID0gUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpWYWx1ZShBU3RyaW5nKCIxMjM0NTY3ODkwQUJDREUiKSk7CisgICAgbXNnWyJmbGV4LXN0cmluZy52YWx1ZSJdID0gUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpWYWx1ZShBU3RyaW5nKCJhYmMiKSk7CisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9TVFJFUSgiMTIzNDU2Nzg5MEEiLCBDYXN0UGFyYW08QzJTdHJpbmdJbmZvPihwYXJhbXNbMF0pLT52YWx1ZSk7CisgICAgRVhQRUNUX0VRKDR1LCBDYXN0UGFyYW08QzJGbGV4U3RyaW5nSW5mbz4ocGFyYW1zWzFdKS0+ZmxleENvdW50KCkpOworICAgIEVYUEVDVF9TVFJFUSgiYWJjIiwgQ2FzdFBhcmFtPEMyRmxleFN0cmluZ0luZm8+KHBhcmFtc1sxXSktPm0udmFsdWUpOworICAgIEVYUEVDVF9FUShmbGV4U3RyaW5nRGF0YSwgJkNhc3RQYXJhbTxDMkZsZXhTdHJpbmdJbmZvPihwYXJhbXNbMV0pLT5tLnZhbHVlWzBdKTsKKworICAgIEFTdHJpbmcgc3RyVmFsdWU7CisgICAgbXNnID0gdXBkYXRlci5nZXRQYXJhbXMocGFyYW1zKTsKKyAgICBBU1NFUlRfRVEoMXUsIG1zZy5jb3VudCgic3RyaW5nLnZhbHVlIikpOworICAgIEVYUEVDVF9FUSh0cnVlLCBtc2dbInN0cmluZy52YWx1ZSJdLmZpbmQoJnN0clZhbHVlKSk7CisgICAgRVhQRUNUX1NUUkVRKCIxMjM0NTY3ODkwQSIsIHN0clZhbHVlLmNfc3RyKCkpOworCisgICAgQVNTRVJUX0VRKDF1LCBtc2cuY291bnQoImZsZXgtc3RyaW5nLnZhbHVlIikpOworICAgIEVYUEVDVF9FUSh0cnVlLCBtc2dbImZsZXgtc3RyaW5nLnZhbHVlIl0uZmluZCgmc3RyVmFsdWUpKTsKKyAgICBFWFBFQ1RfU1RSRVEoImFiYyIsIHN0clZhbHVlLmNfc3RyKCkpOworfQorCitURVNUX0YoUmVmbGVjdGVkUGFyYW1VcGRhdGVyVGVzdCwgQ29tcG9zaXRlVGVzdCkgeworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlciB1cGRhdGVyOworCisgICAgUmVmbGVjdGVkUGFyYW1VcGRhdGVyOjpEaWN0IG1zZzsKKyAgICBtc2cuZW1wbGFjZSgiY29tcG9zaXRlLmkzMiIsIGludDMyX3QoNzgpKTsKKyAgICBtc2cuZW1wbGFjZSgiY29tcG9zaXRlLnU2NCIsIGludDY0X3QoOTEwKSk7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5zdHIiLCBBU3RyaW5nKCIxMTEyIikpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuYmxvYiIsIEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgiYnVmZmVyMDgiLCA4KSk7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5mbGV4LWJsb2IiLCBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoImZsZXgtYnVmZmVyLTE0IiwgMTQpKTsKKworICAgIHVwZGF0ZXIuYWRkUGFyYW1EZXNjKG1SZWZsZWN0b3IsIG1EZXNjcmlwdG9ycyk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gaW5kaWNlczsKKyAgICB1cGRhdGVyLmdldFBhcmFtSW5kaWNlc0Zyb21NZXNzYWdlKG1zZywgJmluZGljZXMpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJJbnRJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkxvbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDAsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMlN0cmluZ0luZm86OlBBUkFNX1RZUEU7IH0pKTsKKyAgICBFWFBFQ1RfRVEoMSwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMyQ29tcG9zaXRlSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgcGFyYW1zLmVtcGxhY2VfYmFjayhDMkNvbXBvc2l0ZUluZm86OkFsbG9jVW5pcXVlKDApKTsKKyAgICBFWFBFQ1RfRVEoMCwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5pMzIpOworICAgIEVYUEVDVF9FUSgwdSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS51NjQpOworICAgIEVYUEVDVF9FUSgwLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnN0clswXSk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiXDBcMFwwXDBcMFwwXDBcMCIsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uYmxvYiwgOCkpOworICAgIEVYUEVDVF9FUSgwdSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+ZmxleENvdW50KCkpOworICAgIHVpbnQ4X3QgKmZsZXhCbG9iRGF0YSA9ICZDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iWzBdOworCisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9FUSg3OCwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5pMzIpOworICAgIEVYUEVDVF9FUSg5MTB1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnU2NCk7CisgICAgRVhQRUNUX1NUUkVRKCIxMTEyIiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5zdHIpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoImJ1ZmZlcjA4IiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5ibG9iLCA4KSk7CisgICAgQVN0cmluZyBoZXg7CisgICAgaGV4ZHVtcChDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmJsb2IsIDgsIDAsICZoZXgpOworICAgIHByaW50ZigiJXNcbiIsIGhleC5jX3N0cigpKTsKKyAgICBBU1NFUlRfRVEoMTR1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5mbGV4Q291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiZmxleC1idWZmZXItMTQiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iLCAxNCkpOworICAgIEVYUEVDVF9ORShmbGV4QmxvYkRhdGEsICZDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iWzBdKTsKKyAgICBmbGV4QmxvYkRhdGEgPSAmQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYlswXTsKKworICAgIC8vIHRlc3Qgc2V0dGluZyBhbmQgemVybyBleHRlbmRpbmcgc2hvcnRlciBibG9iIHRoYW4gYWxsb3dlZAorICAgIG1zZy5jbGVhcigpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuYmxvYiIsIEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgiYnVmMDUiLCA1KSk7CisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoImJ1ZjA1XDBcMFwwIiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5ibG9iLCA4KSk7CisgICAgQVNTRVJUX0VRKDE0dSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+ZmxleENvdW50KCkpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoImZsZXgtYnVmZmVyLTE0IiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYiwgMTQpKTsKKyAgICBFWFBFQ1RfRVEoZmxleEJsb2JEYXRhLCAmQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYlswXSk7CisKKyAgICAvLyB0ZXN0IHNldHRpbmcgYW5kIHRyaW1taW5nIGxhcmdlciBibG9iIHRoYW4gYWxsb3dlZAorICAgIG1zZy5jbGVhcigpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuYmxvYiIsIEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgiUmVhbGx5TG9uZ0J1ZmZlciIsIDE2KSk7CisgICAgdXBkYXRlci51cGRhdGVQYXJhbXNGcm9tTWVzc2FnZShtc2csICZwYXJhbXMpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoIlJlYWxseUxvIiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5ibG9iLCA4KSk7CisgICAgQVNTRVJUX0VRKDE0dSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+ZmxleENvdW50KCkpOworICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoImZsZXgtYnVmZmVyLTE0IiwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYiwgMTQpKTsKKyAgICBFWFBFQ1RfRVEoZmxleEJsb2JEYXRhLCAmQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5mbGV4QmxvYlswXSk7CisKKyAgICAvLyB0ZXN0IHRyaW1taW5nIGZsZXggYmxvYiBpbi1wbGFjZQorICAgIG1zZy5jbGVhcigpOworICAgIG1zZy5lbXBsYWNlKCJjb21wb3NpdGUuZmxleC1ibG9iIiwgQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KCJidWYwNSIsIDUpKTsKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgQVNTRVJUX0VRKDV1LCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5mbGV4Q291bnQoKSk7CisgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCgiYnVmMDUiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLmZsZXhCbG9iLCA1KSk7CisgICAgRVhQRUNUX0VRKGZsZXhCbG9iRGF0YSwgJkNhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uZmxleEJsb2JbMF0pOworfQorCitURVNUX0YoUmVmbGVjdGVkUGFyYW1VcGRhdGVyVGVzdCwgQ29tcG9zaXRlUGFydGlhbFRlc3QpIHsKKyAgICBSZWZsZWN0ZWRQYXJhbVVwZGF0ZXIgdXBkYXRlcjsKKworICAgIFJlZmxlY3RlZFBhcmFtVXBkYXRlcjo6RGljdCBtc2c7CisgICAgbXNnLmVtcGxhY2UoImNvbXBvc2l0ZS5pMzIiLCBDMlZhbHVlKDEzMTQpKTsKKyAgICBtc2cuZW1wbGFjZSgiY29tcG9zaXRlLnN0ciIsIEFTdHJpbmcoIjE1MTYiKSk7CisKKyAgICB1cGRhdGVyLmFkZFBhcmFtRGVzYyhtUmVmbGVjdG9yLCBtRGVzY3JpcHRvcnMpOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXM7CisgICAgdXBkYXRlci5nZXRQYXJhbUluZGljZXNGcm9tTWVzc2FnZShtc2csICZpbmRpY2VzKTsKKyAgICBFWFBFQ1RfRVEoMCwgc3RkOjpjb3VudF9pZihpbmRpY2VzLmJlZ2luKCksIGluZGljZXMuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBhdXRvICZ2YWx1ZSkgeyByZXR1cm4gKHVpbnQzMl90KXZhbHVlID09IEMySW50SW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJMb25nSW5mbzo6UEFSQU1fVFlQRTsgfSkpOworICAgIEVYUEVDVF9FUSgwLCBzdGQ6OmNvdW50X2lmKGluZGljZXMuYmVnaW4oKSwgaW5kaWNlcy5lbmQoKSwKKyAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJnZhbHVlKSB7IHJldHVybiAodWludDMyX3QpdmFsdWUgPT0gQzJTdHJpbmdJbmZvOjpQQVJBTV9UWVBFOyB9KSk7CisgICAgRVhQRUNUX0VRKDEsIHN0ZDo6Y291bnRfaWYoaW5kaWNlcy5iZWdpbigpLCBpbmRpY2VzLmVuZCgpLAorICAgICAgICAgICAgW10oY29uc3QgYXV0byAmdmFsdWUpIHsgcmV0dXJuICh1aW50MzJfdCl2YWx1ZSA9PSBDMkNvbXBvc2l0ZUluZm86OlBBUkFNX1RZUEU7IH0pKTsKKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gcGFyYW1zOworICAgIHBhcmFtcy5lbXBsYWNlX2JhY2soQzJDb21wb3NpdGVJbmZvOjpBbGxvY1VuaXF1ZSgxMnUpKTsKKyAgICBFWFBFQ1RfRVEoMCwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS5pMzIpOworICAgIEVYUEVDVF9FUSgwdSwgQ2FzdFBhcmFtPEMyQ29tcG9zaXRlSW5mbz4ocGFyYW1zWzBdKS0+bS51NjQpOworICAgIEVYUEVDVF9FUSgwLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnN0clswXSk7CisKKyAgICB1cGRhdGVyLnVwZGF0ZVBhcmFtc0Zyb21NZXNzYWdlKG1zZywgJnBhcmFtcyk7CisgICAgRVhQRUNUX0VRKDEzMTQsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0uaTMyKTsKKyAgICBFWFBFQ1RfRVEoMHUsIENhc3RQYXJhbTxDMkNvbXBvc2l0ZUluZm8+KHBhcmFtc1swXSktPm0udTY0KTsKKyAgICBFWFBFQ1RfU1RSRVEoIjE1MTYiLCBDYXN0UGFyYW08QzJDb21wb3NpdGVJbmZvPihwYXJhbXNbMF0pLT5tLnN0cik7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGM4ZjAyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDAgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlic2ZwbHVnaW5fY2NvZGVjX3V0aWxzIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiQ29kZWMyQnVmZmVyVXRpbHMuY3BwIiwKKyAgICAgICAgIkNvZGVjMk1hcHBlci5jcHAiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICIuIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJ5dXZfc3RhdGljIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMkJ1ZmZlclV0aWxzLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmYyYTA3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5jcHAKQEAgLTAsMCArMSw1MzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQ29kZWMyQnVmZmVyVXRpbHMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxsaWJ5dXYuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisKKyNpbmNsdWRlICJDb2RlYzJCdWZmZXJVdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK25hbWVzcGFjZSB7CisKKy8qKgorICogQSBmbGlwcGFibGUsIG9wdGltaXphYmxlIG1lbWNweS4gQ29uc3RydWN0cyBzdWNoIGFzIChmcm9tID8gc3JjIDogZHN0KSBkbyBub3Qgd29yayBhcyB0aGUgcmVzdWx0cyBhcmUKKyAqIGFsd2F5cyBjb25zdC4KKyAqLwordGVtcGxhdGU8Ym9vbCBUb0EsIHNpemVfdCBTPgorc3RydWN0IE1lbUNvcGllciB7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQj4KKyAgICBpbmxpbmUgc3RhdGljIHZvaWQgY29weShBICphLCBjb25zdCBCICpiLCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBfX2J1aWx0aW5fbWVtY3B5KGEsIGIsIHNpemUpOworICAgIH0KK307CisKK3RlbXBsYXRlPHNpemVfdCBTPgorc3RydWN0IE1lbUNvcGllcjxmYWxzZSwgUz4geworICAgIHRlbXBsYXRlPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+CisgICAgaW5saW5lIHN0YXRpYyB2b2lkIGNvcHkoY29uc3QgQSAqYSwgQiAqYiwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgTWVtQ29waWVyPHRydWUsIFM+Ojpjb3B5KGIsIGEsIHNpemUpOworICAgIH0KK307CisKKy8qKgorICogQ29waWVzIGJldHdlZW4gYSBNZWRpYUltYWdlIGFuZCBhIGdyYXBoaWMgdmlldy4KKyAqCisgKiBccGFyYW0gVG9NZWRpYUltYWdlIHdoZXRoZXIgdG8gY29weSB0byAob3IgZnJvbSkgdGhlIE1lZGlhSW1hZ2UKKyAqIFxwYXJhbSB2aWV3IGdyYXBoaWMgdmlldyAoY291bGQgYmUgQ29uc3RHcmFwaGljVmlldyBvciBHcmFwaGljVmlldyBkZXBlbmRpbmcgb24gZGlyZWN0aW9uKQorICogXHBhcmFtIGltZyBNZWRpYUltYWdlIGRhdGEKKyAqIFxwYXJhbSBpbWdCYXNlIGJhc2Ugb2YgTWVkaWFJbWFnZSAoY291bGQgYmUgY29uc3QgdWludDhfdCogb3IgdWludDhfdCogZGVwZW5kaW5nIG9uIGRpcmVjdGlvbikKKyAqLwordGVtcGxhdGU8Ym9vbCBUb01lZGlhSW1hZ2UsIHR5cGVuYW1lIFZpZXcsIHR5cGVuYW1lIEltYWdlUGl4ZWw+CitzdGF0aWMgc3RhdHVzX3QgX0ltYWdlQ29weShWaWV3ICZ2aWV3LCBjb25zdCBNZWRpYUltYWdlMiAqaW1nLCBJbWFnZVBpeGVsICppbWdCYXNlKSB7CisgICAgLy8gVE9ETzogbW9yZSBlZmZpY2llbnQgY29weWluZyAtLS0gZS5nLiBjb3B5IGludGVybGVhdmVkIHBsYW5lcyB0b2dldGhlciwgZXRjLgorICAgIGNvbnN0IEMyUGxhbmFyTGF5b3V0ICZsYXlvdXQgPSB2aWV3LmxheW91dCgpOworICAgIGNvbnN0IHNpemVfdCBicHAgPSBkaXZVcChpbWctPm1CaXREZXB0aEFsbG9jYXRlZCwgOHUpOworCisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGxheW91dC5udW1QbGFuZXM7ICsraSkgeworICAgICAgICB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPFRvTWVkaWFJbWFnZSwgdWludDhfdCwgY29uc3QgdWludDhfdD46OnR5cGUgKmltZ1JvdyA9CisgICAgICAgICAgICBpbWdCYXNlICsgaW1nLT5tUGxhbmVbaV0ubU9mZnNldDsKKyAgICAgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxUb01lZGlhSW1hZ2UsIGNvbnN0IHVpbnQ4X3QsIHVpbnQ4X3Q+Ojp0eXBlICp2aWV3Um93ID0KKyAgICAgICAgICAgIHZpZXdSb3cgPSB2aWV3LmRhdGEoKVtpXTsKKyAgICAgICAgY29uc3QgQzJQbGFuZUluZm8gJnBsYW5lID0gbGF5b3V0LnBsYW5lc1tpXTsKKyAgICAgICAgaWYgKHBsYW5lLmNvbFNhbXBsaW5nICE9IGltZy0+bVBsYW5lW2ldLm1Ib3JpelN1YnNhbXBsaW5nCisgICAgICAgICAgICAgICAgfHwgcGxhbmUucm93U2FtcGxpbmcgIT0gaW1nLT5tUGxhbmVbaV0ubVZlcnRTdWJzYW1wbGluZworICAgICAgICAgICAgICAgIHx8IHBsYW5lLmFsbG9jYXRlZERlcHRoICE9IGltZy0+bUJpdERlcHRoQWxsb2NhdGVkCisgICAgICAgICAgICAgICAgfHwgcGxhbmUuYWxsb2NhdGVkRGVwdGggPCBwbGFuZS5iaXREZXB0aAorICAgICAgICAgICAgICAgIC8vIE1lZGlhSW1hZ2Ugb25seSBzdXBwb3J0cyBNU0IgdmFsdWVzCisgICAgICAgICAgICAgICAgfHwgcGxhbmUucmlnaHRTaGlmdCAhPSBwbGFuZS5hbGxvY2F0ZWREZXB0aCAtIHBsYW5lLmJpdERlcHRoCisgICAgICAgICAgICAgICAgfHwgKGJwcCA+IDEgJiYgcGxhbmUuZW5kaWFubmVzcyAhPSBwbGFuZS5OQVRJVkUpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgcGxhbmVXID0gaW1nLT5tV2lkdGggLyBwbGFuZS5jb2xTYW1wbGluZzsKKyAgICAgICAgdWludDMyX3QgcGxhbmVIID0gaW1nLT5tSGVpZ2h0IC8gcGxhbmUucm93U2FtcGxpbmc7CisKKyAgICAgICAgYm9vbCBjYW5Db3B5QnlSb3cgPSAocGxhbmUuY29sSW5jID09IDEpICYmIChpbWctPm1QbGFuZVtpXS5tQ29sSW5jID09IDEpOworICAgICAgICBib29sIGNhbkNvcHlCeVBsYW5lID0gY2FuQ29weUJ5Um93ICYmIChwbGFuZS5yb3dJbmMgPT0gaW1nLT5tUGxhbmVbaV0ubVJvd0luYyk7CisgICAgICAgIGlmIChjYW5Db3B5QnlQbGFuZSkgeworICAgICAgICAgICAgTWVtQ29waWVyPFRvTWVkaWFJbWFnZSwgMD46OmNvcHkoaW1nUm93LCB2aWV3Um93LCBwbGFuZS5yb3dJbmMgKiBwbGFuZUgpOworICAgICAgICB9IGVsc2UgaWYgKGNhbkNvcHlCeVJvdykgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCByb3cgPSAwOyByb3cgPCBwbGFuZUg7ICsrcm93KSB7CisgICAgICAgICAgICAgICAgTWVtQ29waWVyPFRvTWVkaWFJbWFnZSwgMD46OmNvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICBpbWdSb3csIHZpZXdSb3csIHN0ZDo6bWluKHBsYW5lLnJvd0luYywgaW1nLT5tUGxhbmVbaV0ubVJvd0luYykpOworICAgICAgICAgICAgICAgIGltZ1JvdyArPSBpbWctPm1QbGFuZVtpXS5tUm93SW5jOworICAgICAgICAgICAgICAgIHZpZXdSb3cgKz0gcGxhbmUucm93SW5jOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZm9yICh1aW50MzJfdCByb3cgPSAwOyByb3cgPCBwbGFuZUg7ICsrcm93KSB7CisgICAgICAgICAgICAgICAgZGVjbHR5cGUoaW1nUm93KSBpbWdQdHIgPSBpbWdSb3c7CisgICAgICAgICAgICAgICAgZGVjbHR5cGUodmlld1Jvdykgdmlld1B0ciA9IHZpZXdSb3c7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBjb2wgPSAwOyBjb2wgPCBwbGFuZVc7ICsrY29sKSB7CisgICAgICAgICAgICAgICAgICAgIE1lbUNvcGllcjxUb01lZGlhSW1hZ2UsIDA+Ojpjb3B5KGltZ1B0ciwgdmlld1B0ciwgYnBwKTsKKyAgICAgICAgICAgICAgICAgICAgaW1nUHRyICs9IGltZy0+bVBsYW5lW2ldLm1Db2xJbmM7CisgICAgICAgICAgICAgICAgICAgIHZpZXdQdHIgKz0gcGxhbmUuY29sSW5jOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbWdSb3cgKz0gaW1nLT5tUGxhbmVbaV0ubVJvd0luYzsKKyAgICAgICAgICAgICAgICB2aWV3Um93ICs9IHBsYW5lLnJvd0luYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitzdGF0dXNfdCBJbWFnZUNvcHkodWludDhfdCAqaW1nQmFzZSwgY29uc3QgTWVkaWFJbWFnZTIgKmltZywgY29uc3QgQzJHcmFwaGljVmlldyAmdmlldykgeworICAgIGlmICh2aWV3LmNyb3AoKS53aWR0aCAhPSBpbWctPm1XaWR0aCB8fCB2aWV3LmNyb3AoKS5oZWlnaHQgIT0gaW1nLT5tSGVpZ2h0KSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICgoSXNOVjEyKHZpZXcpICYmIElzSTQyMChpbWcpKSB8fCAoSXNJNDIwKHZpZXcpICYmIElzTlYxMihpbWcpKSkgeworICAgICAgICAvLyBUYWtlIHNob3J0Y3V0cyB0byB1c2UgbGlieXV2IGZ1bmN0aW9ucyBiZXR3ZWVuIE5WMTIgYW5kIEk0MjAgY29udmVyc2lvbi4KKyAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3kgPSB2aWV3LmRhdGEoKVswXTsKKyAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3UgPSB2aWV3LmRhdGEoKVsxXTsKKyAgICAgICAgY29uc3QgdWludDhfdCogc3JjX3YgPSB2aWV3LmRhdGEoKVsyXTsKKyAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlX3kgPSB2aWV3LmxheW91dCgpLnBsYW5lc1swXS5yb3dJbmM7CisgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZV91ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMV0ucm93SW5jOworICAgICAgICBpbnQzMl90IHNyY19zdHJpZGVfdiA9IHZpZXcubGF5b3V0KCkucGxhbmVzWzJdLnJvd0luYzsKKyAgICAgICAgdWludDhfdCogZHN0X3kgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMF0ubU9mZnNldDsKKyAgICAgICAgdWludDhfdCogZHN0X3UgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMV0ubU9mZnNldDsKKyAgICAgICAgdWludDhfdCogZHN0X3YgPSBpbWdCYXNlICsgaW1nLT5tUGxhbmVbMl0ubU9mZnNldDsKKyAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlX3kgPSBpbWctPm1QbGFuZVswXS5tUm93SW5jOworICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGVfdSA9IGltZy0+bVBsYW5lWzFdLm1Sb3dJbmM7CisgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZV92ID0gaW1nLT5tUGxhbmVbMl0ubVJvd0luYzsKKyAgICAgICAgaWYgKElzTlYxMih2aWV3KSAmJiBJc0k0MjAoaW1nKSkgeworICAgICAgICAgICAgaWYgKCFsaWJ5dXY6Ok5WMTJUb0k0MjAoc3JjX3ksIHNyY19zdHJpZGVfeSwgc3JjX3UsIHNyY19zdHJpZGVfdSwgZHN0X3ksIGRzdF9zdHJpZGVfeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF91LCBkc3Rfc3RyaWRlX3UsIGRzdF92LCBkc3Rfc3RyaWRlX3YsIHZpZXcuY3JvcCgpLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlldy5jcm9wKCkuaGVpZ2h0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghbGlieXV2OjpJNDIwVG9OVjEyKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY191LCBzcmNfc3RyaWRlX3UsIHNyY192LCBzcmNfc3RyaWRlX3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfeSwgZHN0X3N0cmlkZV95LCBkc3RfdSwgZHN0X3N0cmlkZV91LCB2aWV3LmNyb3AoKS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZXcuY3JvcCgpLmhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIF9JbWFnZUNvcHk8dHJ1ZT4odmlldywgaW1nLCBpbWdCYXNlKTsKK30KKworc3RhdHVzX3QgSW1hZ2VDb3B5KEMyR3JhcGhpY1ZpZXcgJnZpZXcsIGNvbnN0IHVpbnQ4X3QgKmltZ0Jhc2UsIGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpIHsKKyAgICBpZiAodmlldy5jcm9wKCkud2lkdGggIT0gaW1nLT5tV2lkdGggfHwgdmlldy5jcm9wKCkuaGVpZ2h0ICE9IGltZy0+bUhlaWdodCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoKElzTlYxMihpbWcpICYmIElzSTQyMCh2aWV3KSkgfHwgKElzSTQyMChpbWcpICYmIElzTlYxMih2aWV3KSkpIHsKKyAgICAgICAgLy8gVGFrZSBzaG9ydGN1dHMgdG8gdXNlIGxpYnl1diBmdW5jdGlvbnMgYmV0d2VlbiBOVjEyIGFuZCBJNDIwIGNvbnZlcnNpb24uCisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY195ID0gaW1nQmFzZSArIGltZy0+bVBsYW5lWzBdLm1PZmZzZXQ7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY191ID0gaW1nQmFzZSArIGltZy0+bVBsYW5lWzFdLm1PZmZzZXQ7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNyY192ID0gaW1nQmFzZSArIGltZy0+bVBsYW5lWzJdLm1PZmZzZXQ7CisgICAgICAgIGludDMyX3Qgc3JjX3N0cmlkZV95ID0gaW1nLT5tUGxhbmVbMF0ubVJvd0luYzsKKyAgICAgICAgaW50MzJfdCBzcmNfc3RyaWRlX3UgPSBpbWctPm1QbGFuZVsxXS5tUm93SW5jOworICAgICAgICBpbnQzMl90IHNyY19zdHJpZGVfdiA9IGltZy0+bVBsYW5lWzJdLm1Sb3dJbmM7CisgICAgICAgIHVpbnQ4X3QqIGRzdF95ID0gdmlldy5kYXRhKClbMF07CisgICAgICAgIHVpbnQ4X3QqIGRzdF91ID0gdmlldy5kYXRhKClbMV07CisgICAgICAgIHVpbnQ4X3QqIGRzdF92ID0gdmlldy5kYXRhKClbMl07CisgICAgICAgIGludDMyX3QgZHN0X3N0cmlkZV95ID0gdmlldy5sYXlvdXQoKS5wbGFuZXNbMF0ucm93SW5jOworICAgICAgICBpbnQzMl90IGRzdF9zdHJpZGVfdSA9IHZpZXcubGF5b3V0KCkucGxhbmVzWzFdLnJvd0luYzsKKyAgICAgICAgaW50MzJfdCBkc3Rfc3RyaWRlX3YgPSB2aWV3LmxheW91dCgpLnBsYW5lc1syXS5yb3dJbmM7CisgICAgICAgIGlmIChJc05WMTIoaW1nKSAmJiBJc0k0MjAodmlldykpIHsKKyAgICAgICAgICAgIGlmICghbGlieXV2OjpOVjEyVG9JNDIwKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY191LCBzcmNfc3RyaWRlX3UsIGRzdF95LCBkc3Rfc3RyaWRlX3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfdSwgZHN0X3N0cmlkZV91LCBkc3RfdiwgZHN0X3N0cmlkZV92LCB2aWV3LndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmhlaWdodCgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghbGlieXV2OjpJNDIwVG9OVjEyKHNyY195LCBzcmNfc3RyaWRlX3ksIHNyY191LCBzcmNfc3RyaWRlX3UsIHNyY192LCBzcmNfc3RyaWRlX3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfeSwgZHN0X3N0cmlkZV95LCBkc3RfdSwgZHN0X3N0cmlkZV91LCB2aWV3LndpZHRoKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3LmhlaWdodCgpKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gX0ltYWdlQ29weTxmYWxzZT4odmlldywgaW1nLCBpbWdCYXNlKTsKK30KKworYm9vbCBJc1lVVjQyMChjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KSB7CisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IHZpZXcubGF5b3V0KCk7CisgICAgcmV0dXJuIChsYXlvdXQubnVtUGxhbmVzID09IDMKKyAgICAgICAgICAgICYmIGxheW91dC50eXBlID09IEMyUGxhbmFyTGF5b3V0OjpUWVBFX1lVVgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfWV0uY2hhbm5lbCA9PSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9ZCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5hbGxvY2F0ZWREZXB0aCA9PSA4CisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5iaXREZXB0aCA9PSA4CisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9ZXS5yaWdodFNoaWZ0ID09IDAKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLmNvbFNhbXBsaW5nID09IDEKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ldLnJvd1NhbXBsaW5nID09IDEKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmNoYW5uZWwgPT0gQzJQbGFuZUluZm86OkNIQU5ORUxfQ0IKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmFsbG9jYXRlZERlcHRoID09IDgKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmJpdERlcHRoID09IDgKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLnJpZ2h0U2hpZnQgPT0gMAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0uY29sU2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0ucm93U2FtcGxpbmcgPT0gMgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY2hhbm5lbCA9PSBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DUgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uYWxsb2NhdGVkRGVwdGggPT0gOAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uYml0RGVwdGggPT0gOAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0ucmlnaHRTaGlmdCA9PSAwCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jb2xTYW1wbGluZyA9PSAyCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5yb3dTYW1wbGluZyA9PSAyKTsKK30KKworYm9vbCBJc05WMTIoY29uc3QgQzJHcmFwaGljVmlldyAmdmlldykgeworICAgIGlmICghSXNZVVY0MjAodmlldykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gdmlldy5sYXlvdXQoKTsKKyAgICByZXR1cm4gKGxheW91dC5yb290UGxhbmVzID09IDIKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLmNvbEluYyA9PSAyCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5yb290SXggPT0gbGF5b3V0LlBMQU5FX1UKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1VdLm9mZnNldCA9PSAwCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5jb2xJbmMgPT0gMgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0ucm9vdEl4ID09IGxheW91dC5QTEFORV9VCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9WXS5vZmZzZXQgPT0gMSk7Cit9CisKK2Jvb2wgSXNJNDIwKGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcpIHsKKyAgICBpZiAoIUlzWVVWNDIwKHZpZXcpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgY29uc3QgQzJQbGFuYXJMYXlvdXQgJmxheW91dCA9IHZpZXcubGF5b3V0KCk7CisgICAgcmV0dXJuIChsYXlvdXQucm9vdFBsYW5lcyA9PSAzCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5jb2xJbmMgPT0gMQorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVV0ucm9vdEl4ID09IGxheW91dC5QTEFORV9VCisgICAgICAgICAgICAmJiBsYXlvdXQucGxhbmVzW2xheW91dC5QTEFORV9VXS5vZmZzZXQgPT0gMAorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0uY29sSW5jID09IDEKKyAgICAgICAgICAgICYmIGxheW91dC5wbGFuZXNbbGF5b3V0LlBMQU5FX1ZdLnJvb3RJeCA9PSBsYXlvdXQuUExBTkVfVgorICAgICAgICAgICAgJiYgbGF5b3V0LnBsYW5lc1tsYXlvdXQuUExBTkVfVl0ub2Zmc2V0ID09IDApOworfQorCitib29sIElzWVVWNDIwKGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpIHsKKyAgICByZXR1cm4gKGltZy0+bVR5cGUgPT0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfWVVWCisgICAgICAgICAgICAmJiBpbWctPm1OdW1QbGFuZXMgPT0gMworICAgICAgICAgICAgJiYgaW1nLT5tQml0RGVwdGggPT0gOAorICAgICAgICAgICAgJiYgaW1nLT5tQml0RGVwdGhBbGxvY2F0ZWQgPT0gOAorICAgICAgICAgICAgJiYgaW1nLT5tUGxhbmVbMF0ubUhvcml6U3Vic2FtcGxpbmcgPT0gMQorICAgICAgICAgICAgJiYgaW1nLT5tUGxhbmVbMF0ubVZlcnRTdWJzYW1wbGluZyA9PSAxCisgICAgICAgICAgICAmJiBpbWctPm1QbGFuZVsxXS5tSG9yaXpTdWJzYW1wbGluZyA9PSAyCisgICAgICAgICAgICAmJiBpbWctPm1QbGFuZVsxXS5tVmVydFN1YnNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICYmIGltZy0+bVBsYW5lWzJdLm1Ib3JpelN1YnNhbXBsaW5nID09IDIKKyAgICAgICAgICAgICYmIGltZy0+bVBsYW5lWzJdLm1WZXJ0U3Vic2FtcGxpbmcgPT0gMik7Cit9CisKK2Jvb2wgSXNOVjEyKGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpIHsKKyAgICBpZiAoIUlzWVVWNDIwKGltZykpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gKGltZy0+bVBsYW5lWzFdLm1Db2xJbmMgPT0gMgorICAgICAgICAgICAgJiYgaW1nLT5tUGxhbmVbMl0ubUNvbEluYyA9PSAyCisgICAgICAgICAgICAmJiAoaW1nLT5tUGxhbmVbMl0ubU9mZnNldCAtIGltZy0+bVBsYW5lWzFdLm1PZmZzZXQgPT0gMSkpOworfQorCitib29sIElzSTQyMChjb25zdCBNZWRpYUltYWdlMiAqaW1nKSB7CisgICAgaWYgKCFJc1lVVjQyMChpbWcpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIChpbWctPm1QbGFuZVsxXS5tQ29sSW5jID09IDEKKyAgICAgICAgICAgICYmIGltZy0+bVBsYW5lWzJdLm1Db2xJbmMgPT0gMQorICAgICAgICAgICAgJiYgaW1nLT5tUGxhbmVbMl0ubU9mZnNldCA+IGltZy0+bVBsYW5lWzFdLm1PZmZzZXQpOworfQorCitNZWRpYUltYWdlMiBDcmVhdGVZVVY0MjBQbGFuYXJNZWRpYUltYWdlMigKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCB2c3RyaWRlKSB7CisgICAgcmV0dXJuIE1lZGlhSW1hZ2UyIHsKKyAgICAgICAgLm1UeXBlID0gTWVkaWFJbWFnZTI6Ok1FRElBX0lNQUdFX1RZUEVfWVVWLAorICAgICAgICAubU51bVBsYW5lcyA9IDMsCisgICAgICAgIC5tV2lkdGggPSB3aWR0aCwKKyAgICAgICAgLm1IZWlnaHQgPSBoZWlnaHQsCisgICAgICAgIC5tQml0RGVwdGggPSA4LAorICAgICAgICAubUJpdERlcHRoQWxsb2NhdGVkID0gOCwKKyAgICAgICAgLm1QbGFuZSA9IHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubU9mZnNldCA9IDAsCisgICAgICAgICAgICAgICAgLm1Db2xJbmMgPSAxLAorICAgICAgICAgICAgICAgIC5tUm93SW5jID0gKGludDMyX3Qpc3RyaWRlLAorICAgICAgICAgICAgICAgIC5tSG9yaXpTdWJzYW1wbGluZyA9IDEsCisgICAgICAgICAgICAgICAgLm1WZXJ0U3Vic2FtcGxpbmcgPSAxLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAubU9mZnNldCA9IHN0cmlkZSAqIHZzdHJpZGUsCisgICAgICAgICAgICAgICAgLm1Db2xJbmMgPSAxLAorICAgICAgICAgICAgICAgIC5tUm93SW5jID0gKGludDMyX3Qpc3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAubUhvcml6U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgICAgIC5tVmVydFN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLm1PZmZzZXQgPSBzdHJpZGUgKiB2c3RyaWRlICogNSAvIDQsCisgICAgICAgICAgICAgICAgLm1Db2xJbmMgPSAxLAorICAgICAgICAgICAgICAgIC5tUm93SW5jID0gKGludDMyX3Qpc3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAubUhvcml6U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgICAgIC5tVmVydFN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSwKKyAgICB9OworfQorCitNZWRpYUltYWdlMiBDcmVhdGVZVVY0MjBTZW1pUGxhbmFyTWVkaWFJbWFnZTIoCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgdnN0cmlkZSkgeworICAgIHJldHVybiBNZWRpYUltYWdlMiB7CisgICAgICAgIC5tVHlwZSA9IE1lZGlhSW1hZ2UyOjpNRURJQV9JTUFHRV9UWVBFX1lVViwKKyAgICAgICAgLm1OdW1QbGFuZXMgPSAzLAorICAgICAgICAubVdpZHRoID0gd2lkdGgsCisgICAgICAgIC5tSGVpZ2h0ID0gaGVpZ2h0LAorICAgICAgICAubUJpdERlcHRoID0gOCwKKyAgICAgICAgLm1CaXREZXB0aEFsbG9jYXRlZCA9IDgsCisgICAgICAgIC5tUGxhbmUgPSB7CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLm1PZmZzZXQgPSAwLAorICAgICAgICAgICAgICAgIC5tQ29sSW5jID0gMSwKKyAgICAgICAgICAgICAgICAubVJvd0luYyA9IChpbnQzMl90KXN0cmlkZSwKKyAgICAgICAgICAgICAgICAubUhvcml6U3Vic2FtcGxpbmcgPSAxLAorICAgICAgICAgICAgICAgIC5tVmVydFN1YnNhbXBsaW5nID0gMSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLm1PZmZzZXQgPSBzdHJpZGUgKiB2c3RyaWRlLAorICAgICAgICAgICAgICAgIC5tQ29sSW5jID0gMiwKKyAgICAgICAgICAgICAgICAubVJvd0luYyA9IChpbnQzMl90KXN0cmlkZSwKKyAgICAgICAgICAgICAgICAubUhvcml6U3Vic2FtcGxpbmcgPSAyLAorICAgICAgICAgICAgICAgIC5tVmVydFN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLm1PZmZzZXQgPSBzdHJpZGUgKiB2c3RyaWRlICsgMSwKKyAgICAgICAgICAgICAgICAubUNvbEluYyA9IDIsCisgICAgICAgICAgICAgICAgLm1Sb3dJbmMgPSAoaW50MzJfdClzdHJpZGUsCisgICAgICAgICAgICAgICAgLm1Ib3JpelN1YnNhbXBsaW5nID0gMiwKKyAgICAgICAgICAgICAgICAubVZlcnRTdWJzYW1wbGluZyA9IDIsCisgICAgICAgICAgICB9CisgICAgICAgIH0sCisgICAgfTsKK30KKworc3RhdHVzX3QgQ29udmVydFJHQlRvUGxhbmFyWVVWKAorICAgICAgICB1aW50OF90ICpkc3RZLCBzaXplX3QgZHN0U3RyaWRlLCBzaXplX3QgZHN0VlN0cmlkZSwgc2l6ZV90IGJ1ZmZlclNpemUsCisgICAgICAgIGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnNyYykgeworICAgIENIRUNLKGRzdFkgIT0gbnVsbHB0cik7CisgICAgQ0hFQ0soKHNyYy53aWR0aCgpICYgMSkgPT0gMCk7CisgICAgQ0hFQ0soKHNyYy5oZWlnaHQoKSAmIDEpID09IDApOworCisgICAgaWYgKGRzdFN0cmlkZSAqIGRzdFZTdHJpZGUgKiAzIC8gMiA+IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgQUxPR0QoImNvbnZlcnNpb24gYnVmZmVyIGlzIHRvbyBzbWFsbCBmb3IgY29udmVydGluZyBmcm9tIFJHQiB0byBZVVYiKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICB1aW50OF90ICpkc3RVID0gZHN0WSArIGRzdFN0cmlkZSAqIGRzdFZTdHJpZGU7CisgICAgdWludDhfdCAqZHN0ViA9IGRzdFUgKyAoZHN0U3RyaWRlID4+IDEpICogKGRzdFZTdHJpZGUgPj4gMSk7CisKKyAgICBjb25zdCBDMlBsYW5hckxheW91dCAmbGF5b3V0ID0gc3JjLmxheW91dCgpOworICAgIGNvbnN0IHVpbnQ4X3QgKnBSZWQgICA9IHNyYy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1JdOworICAgIGNvbnN0IHVpbnQ4X3QgKnBHcmVlbiA9IHNyYy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0ddOworICAgIGNvbnN0IHVpbnQ4X3QgKnBCbHVlICA9IHNyYy5kYXRhKClbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0JdOworCisjZGVmaW5lIENMSVAzKHgseSx6KSAoKCh6KSA8ICh4KSkgPyAoeCkgOiAoKCh6KSA+ICh5KSkgPyAoeSkgOiAoeikpKQorICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgc3JjLmhlaWdodCgpOyArK3kpIHsKKyAgICAgICAgZm9yIChzaXplX3QgeCA9IDA7IHggPCBzcmMud2lkdGgoKTsgKyt4KSB7CisgICAgICAgICAgICB1aW50OF90IHJlZCA9ICpwUmVkOworICAgICAgICAgICAgdWludDhfdCBncmVlbiA9ICpwR3JlZW47CisgICAgICAgICAgICB1aW50OF90IGJsdWUgPSAqcEJsdWU7CisKKyAgICAgICAgICAgIC8vIHVzaW5nIElUVS1SIEJULjYwMSBjb252ZXJzaW9uIG1hdHJpeAorICAgICAgICAgICAgdW5zaWduZWQgbHVtYSA9CisgICAgICAgICAgICAgICAgQ0xJUDMoMCwgKCgocmVkICogNjYgKyBncmVlbiAqIDEyOSArIGJsdWUgKiAyNSkgPj4gOCkgKyAxNiksIDI1NSk7CisKKyAgICAgICAgICAgIGRzdFlbeF0gPSBsdW1hOworCisgICAgICAgICAgICBpZiAoKHggJiAxKSA9PSAwICYmICh5ICYgMSkgPT0gMCkgeworICAgICAgICAgICAgICAgIHVuc2lnbmVkIFUgPQorICAgICAgICAgICAgICAgICAgICBDTElQMygwLCAoKCgtcmVkICogMzggLSBncmVlbiAqIDc0ICsgYmx1ZSAqIDExMikgPj4gOCkgKyAxMjgpLCAyNTUpOworCisgICAgICAgICAgICAgICAgdW5zaWduZWQgViA9CisgICAgICAgICAgICAgICAgICAgIENMSVAzKDAsICgoKHJlZCAqIDExMiAtIGdyZWVuICogOTQgLSBibHVlICogMTgpID4+IDgpICsgMTI4KSwgMjU1KTsKKworICAgICAgICAgICAgICAgIGRzdFVbeCA+PiAxXSA9IFU7CisgICAgICAgICAgICAgICAgZHN0Vlt4ID4+IDFdID0gVjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBSZWQgICArPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9SXS5jb2xJbmM7CisgICAgICAgICAgICBwR3JlZW4gKz0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfR10uY29sSW5jOworICAgICAgICAgICAgcEJsdWUgICs9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0JdLmNvbEluYzsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgoeSAmIDEpID09IDApIHsKKyAgICAgICAgICAgIGRzdFUgKz0gZHN0U3RyaWRlID4+IDE7CisgICAgICAgICAgICBkc3RWICs9IGRzdFN0cmlkZSA+PiAxOworICAgICAgICB9CisKKyAgICAgICAgcFJlZCAgIC09IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1JdLmNvbEluYyAqIHNyYy53aWR0aCgpOworICAgICAgICBwR3JlZW4gLT0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfR10uY29sSW5jICogc3JjLndpZHRoKCk7CisgICAgICAgIHBCbHVlICAtPSBsYXlvdXQucGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9CXS5jb2xJbmMgKiBzcmMud2lkdGgoKTsKKyAgICAgICAgcFJlZCAgICs9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1JdLnJvd0luYzsKKyAgICAgICAgcEdyZWVuICs9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0ddLnJvd0luYzsKKyAgICAgICAgcEJsdWUgICs9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0JdLnJvd0luYzsKKworICAgICAgICBkc3RZICs9IGRzdFN0cmlkZTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCituYW1lc3BhY2UgeworCisvKioKKyAqIEEgYmxvY2sgb2YgcmF3IGFsbG9jYXRlZCBtZW1vcnkuCisgKi8KK3N0cnVjdCBNZW1vcnlCbG9ja1Bvb2xCbG9jayB7CisgICAgTWVtb3J5QmxvY2tQb29sQmxvY2soc2l6ZV90IHNpemUpCisgICAgICAgIDogbURhdGEobmV3IHVpbnQ4X3Rbc2l6ZV0pLCBtU2l6ZShtRGF0YSA/IHNpemUgOiAwKSB7IH0KKworICAgIH5NZW1vcnlCbG9ja1Bvb2xCbG9jaygpIHsKKyAgICAgICAgZGVsZXRlW10gbURhdGE7CisgICAgfQorCisgICAgY29uc3QgdWludDhfdCAqZGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KKworICAgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVNpemU7CisgICAgfQorCisgICAgQzJfRE9fTk9UX0NPUFkoTWVtb3J5QmxvY2tQb29sQmxvY2spOworCitwcml2YXRlOgorICAgIHVpbnQ4X3QgKm1EYXRhOworICAgIHNpemVfdCBtU2l6ZTsKK307CisKKy8qKgorICogQSBzaW1wbGUgcmF3IG1lbW9yeSBibG9jayBwb29sIGltcGxlbWVudGF0aW9uLgorICovCitzdHJ1Y3QgTWVtb3J5QmxvY2tQb29sSW1wbCB7CisgICAgdm9pZCByZWxlYXNlKHN0ZDo6bGlzdDxNZW1vcnlCbG9ja1Bvb2xCbG9jaz46OmNvbnN0X2l0ZXJhdG9yIGJsb2NrKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIC8vIHJldHVybiBibG9jayB0byBmcmVlIGJsb2NrcyBpZiBpdCBpcyB0aGUgY3VycmVudCBzaXplOyBvdGhlcndpc2UsIGRpc2NhcmQKKyAgICAgICAgaWYgKGJsb2NrLT5zaXplKCkgPT0gbUN1cnJlbnRTaXplKSB7CisgICAgICAgICAgICBtRnJlZUJsb2Nrcy5zcGxpY2UobUZyZWVCbG9ja3MuYmVnaW4oKSwgbUJsb2Nrc0luVXNlLCBibG9jayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQmxvY2tzSW5Vc2UuZXJhc2UoYmxvY2spOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpsaXN0PE1lbW9yeUJsb2NrUG9vbEJsb2NrPjo6Y29uc3RfaXRlcmF0b3IgZmV0Y2goc2l6ZV90IHNpemUpIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbUZyZWVCbG9ja3MucmVtb3ZlX2lmKFtzaXplXShjb25zdCBNZW1vcnlCbG9ja1Bvb2xCbG9jayAmYmxvY2spIC0+IGJvb2wgeworICAgICAgICAgICAgcmV0dXJuIGJsb2NrLnNpemUoKSAhPSBzaXplOworICAgICAgICB9KTsKKyAgICAgICAgbUN1cnJlbnRTaXplID0gc2l6ZTsKKyAgICAgICAgaWYgKG1GcmVlQmxvY2tzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1CbG9ja3NJblVzZS5lbXBsYWNlX2Zyb250KHNpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUJsb2Nrc0luVXNlLnNwbGljZShtQmxvY2tzSW5Vc2UuYmVnaW4oKSwgbUZyZWVCbG9ja3MsIG1GcmVlQmxvY2tzLmJlZ2luKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtQmxvY2tzSW5Vc2UuYmVnaW4oKTsKKyAgICB9CisKKyAgICBNZW1vcnlCbG9ja1Bvb2xJbXBsKCkgPSBkZWZhdWx0OworCisgICAgQzJfRE9fTk9UX0NPUFkoTWVtb3J5QmxvY2tQb29sSW1wbCk7CisKK3ByaXZhdGU6CisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3RkOjpsaXN0PE1lbW9yeUJsb2NrUG9vbEJsb2NrPiBtRnJlZUJsb2NrczsKKyAgICBzdGQ6Omxpc3Q8TWVtb3J5QmxvY2tQb29sQmxvY2s+IG1CbG9ja3NJblVzZTsKKyAgICBzaXplX3QgbUN1cnJlbnRTaXplOworfTsKKworfSAvLyBuYW1lc3BhY2UKKworc3RydWN0IE1lbW9yeUJsb2NrUG9vbDo6SW1wbCA6IE1lbW9yeUJsb2NrUG9vbEltcGwgeworfTsKKworc3RydWN0IE1lbW9yeUJsb2NrOjpJbXBsIHsKKyAgICBJbXBsKHN0ZDo6bGlzdDxNZW1vcnlCbG9ja1Bvb2xCbG9jaz46OmNvbnN0X2l0ZXJhdG9yIGJsb2NrLAorICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPE1lbW9yeUJsb2NrUG9vbEltcGw+IHBvb2wpCisgICAgICAgIDogbUJsb2NrKGJsb2NrKSwgbVBvb2wocG9vbCkgeworICAgIH0KKworICAgIH5JbXBsKCkgeworICAgICAgICBtUG9vbC0+cmVsZWFzZShtQmxvY2spOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtQmxvY2stPmRhdGEoKTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1CbG9jay0+c2l6ZSgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6Omxpc3Q8TWVtb3J5QmxvY2tQb29sQmxvY2s+Ojpjb25zdF9pdGVyYXRvciBtQmxvY2s7CisgICAgc3RkOjpzaGFyZWRfcHRyPE1lbW9yeUJsb2NrUG9vbEltcGw+IG1Qb29sOworfTsKKworTWVtb3J5QmxvY2sgTWVtb3J5QmxvY2tQb29sOjpmZXRjaChzaXplX3Qgc2l6ZSkgeworICAgIHN0ZDo6bGlzdDxNZW1vcnlCbG9ja1Bvb2xCbG9jaz46OmNvbnN0X2l0ZXJhdG9yIHBvb2xCbG9jayA9IG1JbXBsLT5mZXRjaChzaXplKTsKKyAgICByZXR1cm4gTWVtb3J5QmxvY2soc3RkOjptYWtlX3NoYXJlZDxNZW1vcnlCbG9jazo6SW1wbD4oCisgICAgICAgICAgICBwb29sQmxvY2ssIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxNZW1vcnlCbG9ja1Bvb2xJbXBsPihtSW1wbCkpKTsKK30KKworTWVtb3J5QmxvY2tQb29sOjpNZW1vcnlCbG9ja1Bvb2woKQorICAgIDogbUltcGwoc3RkOjptYWtlX3NoYXJlZDxNZW1vcnlCbG9ja1Bvb2w6OkltcGw+KCkpIHsKK30KKworTWVtb3J5QmxvY2s6Ok1lbW9yeUJsb2NrKHN0ZDo6c2hhcmVkX3B0cjxNZW1vcnlCbG9jazo6SW1wbD4gaW1wbCkKKyAgICA6IG1JbXBsKGltcGwpIHsKK30KKworTWVtb3J5QmxvY2s6Ok1lbW9yeUJsb2NrKCkgPSBkZWZhdWx0OworCitNZW1vcnlCbG9jazo6fk1lbW9yeUJsb2NrKCkgPSBkZWZhdWx0OworCitjb25zdCB1aW50OF90KiBNZW1vcnlCbG9jazo6ZGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwgPyBtSW1wbC0+ZGF0YSgpIDogbnVsbHB0cjsKK30KKworc2l6ZV90IE1lbW9yeUJsb2NrOjpzaXplKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbCA/IG1JbXBsLT5zaXplKCkgOiAwOworfQorCitNZW1vcnlCbG9jayBNZW1vcnlCbG9jazo6QWxsb2NhdGUoc2l6ZV90IHNpemUpIHsKKyAgICByZXR1cm4gTWVtb3J5QmxvY2tQb29sKCkuZmV0Y2goc2l6ZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQnVmZmVyVXRpbHMuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJCdWZmZXJVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYWRmMDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyQnVmZmVyVXRpbHMuaApAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX0JVRkZFUl9VVElMU19IXworI2RlZmluZSBDT0RFQzJfQlVGRkVSX1VUSUxTX0hfCisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyUGFyYW1EZWYuaD4KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBDb252ZXJ0cyBhbiBSR0IgdmlldyB0byBwbGFuYXIgWVVWIDQyMCBtZWRpYSBpbWFnZS4KKyAqCisgKiBccGFyYW0gZHN0WSAgICAgICBwb2ludGVyIHRvIG1lZGlhIGltYWdlIGJ1ZmZlcgorICogXHBhcmFtIGRzdFN0cmlkZSAgc3RyaWRlIGluIGJ5dGVzCisgKiBccGFyYW0gZHN0VlN0cmlkZSB2ZXJ0aWNhbCBzdHJpZGUgaW4gcGl4ZWxzCisgKiBccGFyYW0gYnVmZmVyU2l6ZSBtZWRpYSBpbWFnZSBidWZmZXIgc2l6ZQorICogXHBhcmFtIHNyYyBzb3VyY2UgaW1hZ2UKKyAqCisgKiBccmV0dmFsIE5PX01FTU9SWSBtZWRpYSBpbWFnZSBpcyB0b28gc21hbGwKKyAqIFxyZXR2YWwgT0sgb24gc3VjY2VzcworICovCitzdGF0dXNfdCBDb252ZXJ0UkdCVG9QbGFuYXJZVVYoCisgICAgICAgIHVpbnQ4X3QgKmRzdFksIHNpemVfdCBkc3RTdHJpZGUsIHNpemVfdCBkc3RWU3RyaWRlLCBzaXplX3QgYnVmZmVyU2l6ZSwKKyAgICAgICAgY29uc3QgQzJHcmFwaGljVmlldyAmc3JjKTsKKworLyoqCisgKiBSZXR1cm5zIGEgcGxhbmFyIFlVViA0MjAgOC1iaXQgbWVkaWEgaW1hZ2UgZGVzY3JpcHRvci4KKyAqCisgKiBccGFyYW0gd2lkdGggd2lkdGggb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKiBccGFyYW0gaGVpZ2h0IGhlaWdodCBvZiBpbWFnZSBpbiBwaXhlbHMKKyAqIFxwYXJhbSBzdHJpZGUgc3RyaWRlIG9mIGltYWdlIGluIHBpeGVscworICogXHBhcmFtIHZzdHJpZGUgdmVydGljYWwgc3RyaWRlIG9mIGltYWdlIGluIHBpeGVscworICovCitNZWRpYUltYWdlMiBDcmVhdGVZVVY0MjBQbGFuYXJNZWRpYUltYWdlMigKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3Qgc3RyaWRlLCB1aW50MzJfdCB2c3RyaWRlKTsKKworLyoqCisgKiBSZXR1cm5zIGEgc2VtaXBsYW5hciBZVVYgNDIwIDgtYml0IG1lZGlhIGltYWdlIGRlc2NyaXB0b3IuCisgKgorICogXHBhcmFtIHdpZHRoIHdpZHRoIG9mIGltYWdlIGluIHBpeGVscworICogXHBhcmFtIGhlaWdodCBoZWlnaHQgb2YgaW1hZ2UgaW4gcGl4ZWxzCisgKiBccGFyYW0gc3RyaWRlIHN0cmlkZSBvZiBpbWFnZSBpbiBwaXhlbHMKKyAqIFxwYXJhbSB2c3RyaWRlIHZlcnRpY2FsIHN0cmlkZSBvZiBpbWFnZSBpbiBwaXhlbHMKKyAqLworTWVkaWFJbWFnZTIgQ3JlYXRlWVVWNDIwU2VtaVBsYW5hck1lZGlhSW1hZ2UyKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IHZzdHJpZGUpOworCisvKioKKyAqIENvcGllcyBhIGdyYXBoaWMgdmlldyBpbnRvIGEgbWVkaWEgaW1hZ2UuCisgKgorICogXHBhcmFtIGltZ0Jhc2UgYmFzZSBvZiBNZWRpYUltYWdlCisgKiBccGFyYW0gaW1nIE1lZGlhSW1hZ2UgZGF0YQorICogXHBhcmFtIHZpZXcgZ3JhcGhpYyB2aWV3CisgKgorICogXHJldHVybiBPSyBvbiBzdWNjZXNzCisgKi8KK3N0YXR1c190IEltYWdlQ29weSh1aW50OF90ICppbWdCYXNlLCBjb25zdCBNZWRpYUltYWdlMiAqaW1nLCBjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KTsKKworLyoqCisgKiBDb3BpZXMgYSBtZWRpYSBpbWFnZSBpbnRvIGEgZ3JhcGhpYyB2aWV3LgorICoKKyAqIFxwYXJhbSB2aWV3IGdyYXBoaWMgdmlldworICogXHBhcmFtIGltZ0Jhc2UgYmFzZSBvZiBNZWRpYUltYWdlCisgKiBccGFyYW0gaW1nIE1lZGlhSW1hZ2UgZGF0YQorICoKKyAqIFxyZXR1cm4gT0sgb24gc3VjY2VzcworICovCitzdGF0dXNfdCBJbWFnZUNvcHkoQzJHcmFwaGljVmlldyAmdmlldywgY29uc3QgdWludDhfdCAqaW1nQmFzZSwgY29uc3QgTWVkaWFJbWFnZTIgKmltZyk7CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmZiBhIHZpZXcgaGFzIGEgWVVWIDQyMCA4ODggbGF5b3V0LgorICovCitib29sIElzWVVWNDIwKGNvbnN0IEMyR3JhcGhpY1ZpZXcgJnZpZXcpOworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZmYgYSB2aWV3IGhhcyBhIE5WMTIgbGF5b3V0LgorICovCitib29sIElzTlYxMihjb25zdCBDMkdyYXBoaWNWaWV3ICZ2aWV3KTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWZmIGEgdmlldyBoYXMgYSBJNDIwIGxheW91dC4KKyAqLworYm9vbCBJc0k0MjAoY29uc3QgQzJHcmFwaGljVmlldyAmdmlldyk7CisKKy8qKgorICogUmV0dXJucyB0cnVlIGlmZiBhIE1lZGlhSW1hZ2UyIGhhcyBhIFlVViA0MjAgODg4IGxheW91dC4KKyAqLworYm9vbCBJc1lVVjQyMChjb25zdCBNZWRpYUltYWdlMiAqaW1nKTsKKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWZmIGEgTWVkaWFJbWFnZTIgaGFzIGEgTlYxMiBsYXlvdXQuCisgKi8KK2Jvb2wgSXNOVjEyKGNvbnN0IE1lZGlhSW1hZ2UyICppbWcpOworCisvKioKKyAqIFJldHVybnMgdHJ1ZSBpZmYgYSBNZWRpYUltYWdlMiBoYXMgYSBJNDIwIGxheW91dC4KKyAqLworYm9vbCBJc0k0MjAoY29uc3QgTWVkaWFJbWFnZTIgKmltZyk7CisKKy8qKgorICogQSByYXcgbWVtb3J5IGJsb2NrIHRvIHVzZSBmb3IgaW50ZXJuYWwgYnVmZmVycy4KKyAqCisgKiBUT0RPOiByZXBsYWNlIHRoaXMgd2l0aCBDMkxpbmVhckJsb2NrcyBmcm9tIGEgcHJpdmF0ZSBDMkJsb2NrUG9vbAorICovCitzdHJ1Y3QgTWVtb3J5QmxvY2sgOiBwdWJsaWMgQzJNZW1vcnlCbG9jazx1aW50OF90PiB7CisgICAgdmlydHVhbCBjb25zdCB1aW50OF90KiBkYXRhKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgaW5saW5lIHVpbnQ4X3QgKmRhdGEoKSB7CisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PHVpbnQ4X3QqPihjb25zdF9jYXN0PGNvbnN0IE1lbW9yeUJsb2NrKj4odGhpcyktPmRhdGEoKSk7CisgICAgfQorCisgICAgLy8gYWxsb2NhdGVzIGFuIHVubWFuYWdlZCBibG9jayAobm90IGluIGEgcG9vbCkKKyAgICBzdGF0aWMgTWVtb3J5QmxvY2sgQWxsb2NhdGUoc2l6ZV90KTsKKworICAgIC8vIG1lbW9yeSBibG9jayB3aXRoIG5vIGFjdHVhbCBtZW1vcnkgKHNpemUgaXMgMCwgZGF0YSBpcyBudWxsKQorICAgIE1lbW9yeUJsb2NrKCk7CisKKyAgICBzdHJ1Y3QgSW1wbDsKKyAgICBNZW1vcnlCbG9jayhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCk7CisgICAgdmlydHVhbCB+TWVtb3J5QmxvY2soKTsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7Cit9OworCisvKioKKyAqIEEgcmF3IG1lbW9yeSBtaW5pLXBvb2wuCisgKi8KK3N0cnVjdCBNZW1vcnlCbG9ja1Bvb2wgeworICAgIC8qKgorICAgICAqIEZldGNoZXMgYSBibG9jayB3aXRoIGEgZ2l2ZW4gc2l6ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaXplIHNpemUgaW4gYnl0ZXMKKyAgICAgKi8KKyAgICBNZW1vcnlCbG9jayBmZXRjaChzaXplX3Qgc2l6ZSk7CisKKyAgICBNZW1vcnlCbG9ja1Bvb2woKTsKKyAgICB+TWVtb3J5QmxvY2tQb29sKCkgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIHN0cnVjdCBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBDT0RFQzJfQlVGRkVSX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmNwcCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQwMTYwYzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvc2ZwbHVnaW4vdXRpbHMvQ29kZWMyTWFwcGVyLmNwcApAQCAtMCwwICsxLDk0NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjMk1hcHBlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29rdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+ICAvLyBmb3IgSU5UMzJfTUFYCisKKyNpbmNsdWRlICJDb2RlYzJNYXBwZXIuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKK25hbWVzcGFjZSB7CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0FhY1Byb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDLCAgICAgICAgIEFBQ09iamVjdExDIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfTUFJTiwgICAgICAgQUFDT2JqZWN0TWFpbiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX1NTUiwgICAgICAgIEFBQ09iamVjdFNTUiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xUUCwgICAgICAgIEFBQ09iamVjdExUUCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFLCAgICAgICAgIEFBQ09iamVjdEhFIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfU0NBTEFCTEUsICAgQUFDT2JqZWN0U2NhbGFibGUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FUl9MQywgICAgICBBQUNPYmplY3RFUkxDIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRVJfU0NBTEFCTEUsIEFBQ09iamVjdEVSU2NhbGFibGUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MRCwgICAgICAgICBBQUNPYmplY3RMRCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFX1BTLCAgICAgIEFBQ09iamVjdEhFX1BTIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRUxELCAgICAgICAgQUFDT2JqZWN0RUxEIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BQUNfWEhFLCAgICAgICAgQUFDT2JqZWN0WEhFIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90PiBzQXZjTGV2ZWxzID0geworICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18xLCAgICBBVkNMZXZlbDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfMUIsICAgQVZDTGV2ZWwxYiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18xXzEsICBBVkNMZXZlbDExIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMiwgIEFWQ0xldmVsMTIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8zLCAgQVZDTGV2ZWwxMyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18yLCAgICBBVkNMZXZlbDIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfMl8xLCAgQVZDTGV2ZWwyMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18yXzIsICBBVkNMZXZlbDIyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzMsICAgIEFWQ0xldmVsMyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ18zXzEsICBBVkNMZXZlbDMxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzNfMiwgIEFWQ0xldmVsMzIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfNCwgICAgQVZDTGV2ZWw0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzRfMSwgIEFWQ0xldmVsNDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfNF8yLCAgQVZDTGV2ZWw0MiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ181LCAgICBBVkNMZXZlbDUgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVkNfNV8xLCAgQVZDTGV2ZWw1MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ181XzIsICBBVkNMZXZlbDUyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzYsICAgIEFWQ0xldmVsNiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWQ182XzEsICBBVkNMZXZlbDYxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVZDXzZfMiwgIEFWQ0xldmVsNjIgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0F2Y1Byb2ZpbGVzID0geworICAgIC8vIHRyZWF0IHJlc3RyaWN0ZWQgcHJvZmlsZXMgYXMgZnVsbCBwcm9maWxlIGlmIHRoZXJlIGlzIG5vIGVxdWl2YWxlbnQgLSB3aGljaCB3b3JrcyBmb3IKKyAgICAvLyBkZWNvZGVycywgYnV0IG5vdCBmb3IgZW5jb2RlcnMKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19CQVNFTElORSwgICAgICAgICAgICAgICBBVkNQcm9maWxlQmFzZWxpbmUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSwgICBBVkNQcm9maWxlQ29uc3RyYWluZWRCYXNlbGluZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX01BSU4sICAgICAgICAgICAgICAgICAgIEFWQ1Byb2ZpbGVNYWluIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfRVhURU5ERUQsICAgICAgICAgICAgICAgQVZDUHJvZmlsZUV4dGVuZGVkIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSCwgICAgICAgICAgICAgICAgICAgQVZDUHJvZmlsZUhpZ2ggfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19QUk9HUkVTU0lWRV9ISUdILCAgICAgICBBVkNQcm9maWxlSGlnaCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NPTlNUUkFJTkVEX0hJR0gsICAgICAgIEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEhpZ2ggfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzEwLCAgICAgICAgICAgICAgICBBVkNQcm9maWxlSGlnaDEwIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfUFJPR1JFU1NJVkVfSElHSF8xMCwgICAgQVZDUHJvZmlsZUhpZ2gxMCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDIyLCAgICAgICAgICAgICAgIEFWQ1Byb2ZpbGVIaWdoNDIyIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF80NDRfUFJFRElDVElWRSwgICAgQVZDUHJvZmlsZUhpZ2g0NDQgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzEwX0lOVFJBLCAgICAgICAgICBBVkNQcm9maWxlSGlnaDEwIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF80MjJfSU5UUkEsICAgICAgICAgQVZDUHJvZmlsZUhpZ2g0MjIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzQ0NF9JTlRSQSwgICAgICAgICBBVkNQcm9maWxlSGlnaDQ0NCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVZDX0NBVkxDXzQ0NF9JTlRSQSwgICAgICAgIEFWQ1Byb2ZpbGVIaWdoNDQ0IH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdCwgaW50MzJfdD4gc0JpdHJhdGVNb2RlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpCSVRSQVRFX0NPTlNULCAgICAgIEJJVFJBVEVfTU9ERV9DQlIgfSwKKyAgICB7IEMyQ29uZmlnOjpCSVRSQVRFX1ZBUklBQkxFLCAgIEJJVFJBVEVfTU9ERV9WQlIgfSwKKyAgICB7IEMyQ29uZmlnOjpCSVRSQVRFX0lHTk9SRSwgICAgIEJJVFJBVEVfTU9ERV9DUSB9LAorfTsKKworQUxvb2t1cDxDMkNvbG9yOjptYXRyaXhfdCwgQ29sb3JBc3BlY3RzOjpNYXRyaXhDb2VmZnM+IHNDb2xvck1hdHJpY2VzU2YgPSB7CisgICAgeyBDMkNvbG9yOjpNQVRSSVhfVU5TUEVDSUZJRUQsICAgICBDb2xvckFzcGVjdHM6Ok1hdHJpeFVuc3BlY2lmaWVkIH0sCisgICAgeyBDMkNvbG9yOjpNQVRSSVhfQlQ3MDksICAgICAgICAgICBDb2xvckFzcGVjdHM6Ok1hdHJpeEJUNzA5XzUgfSwKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9GQ0M0N183M182ODIsICAgIENvbG9yQXNwZWN0czo6TWF0cml4QlQ0NzBfNk0gfSwKKyAgICB7IEMyQ29sb3I6Ok1BVFJJWF9CVDYwMSwgICAgICAgICAgIENvbG9yQXNwZWN0czo6TWF0cml4QlQ2MDFfNiB9LAorICAgIHsgQzJDb2xvcjo6TUFUUklYXzI0ME0sICAgICAgIENvbG9yQXNwZWN0czo6TWF0cml4U01QVEUyNDBNIH0sCisgICAgeyBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwLCAgICAgICAgICBDb2xvckFzcGVjdHM6Ok1hdHJpeEJUMjAyMCB9LAorICAgIHsgQzJDb2xvcjo6TUFUUklYX0JUMjAyMF9DT05TVEFOVCwgQ29sb3JBc3BlY3RzOjpNYXRyaXhCVDIwMjBDb25zdGFudCB9LAorICAgIHsgQzJDb2xvcjo6TUFUUklYX09USEVSLCAgICAgICAgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhPdGhlciB9LAorfTsKKworQUxvb2t1cDxDMkNvbG9yOjpwcmltYXJpZXNfdCwgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXM+IHNDb2xvclByaW1hcmllc1NmID0geworICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX1VOU1BFQ0lGSUVELCAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNVbnNwZWNpZmllZCB9LAorICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNzA5LCAgICAgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNCVDcwOV81IH0sCisgICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfQlQ0NzBfTSwgICAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllc0JUNDcwXzZNIH0sCisgICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfQlQ2MDFfNjI1LCAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllc0JUNjAxXzZfNjI1IH0sCisgICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfQlQ2MDFfNTI1LCAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllc0JUNjAxXzZfNTI1IH0sCisgICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfR0VORVJJQ19GSUxNLCBDb2xvckFzcGVjdHM6OlByaW1hcmllc0dlbmVyaWNGaWxtIH0sCisgICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfQlQyMDIwLCAgICAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllc0JUMjAyMCB9LAorLy8gICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfUlA0MzEsICAgICAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllcy4uLiB9LAorLy8gICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfRUc0MzIsICAgICAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllcy4uLiB9LAorLy8gICAgeyBDMkNvbG9yOjpQUklNQVJJRVNfRUJVMzIxMywgICAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllcy4uLiB9LAorICAgIHsgQzJDb2xvcjo6UFJJTUFSSUVTX09USEVSLCAgICAgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNPdGhlciB9LAorfTsKKworQUxvb2t1cDxDMkNvbG9yOjpyYW5nZV90LCBpbnQzMl90PiBzQ29sb3JSYW5nZXMgPSB7CisgICAgeyBDMkNvbG9yOjpSQU5HRV9GVUxMLCAgICBDT0xPUl9SQU5HRV9GVUxMIH0sCisgICAgeyBDMkNvbG9yOjpSQU5HRV9MSU1JVEVELCBDT0xPUl9SQU5HRV9MSU1JVEVEIH0sCit9OworCitBTG9va3VwPEMyQ29sb3I6OnJhbmdlX3QsIENvbG9yQXNwZWN0czo6UmFuZ2U+IHNDb2xvclJhbmdlc1NmID0geworICAgIHsgQzJDb2xvcjo6UkFOR0VfVU5TUEVDSUZJRUQsIENvbG9yQXNwZWN0czo6UmFuZ2VVbnNwZWNpZmllZCB9LAorICAgIHsgQzJDb2xvcjo6UkFOR0VfRlVMTCwgICAgICAgIENvbG9yQXNwZWN0czo6UmFuZ2VGdWxsIH0sCisgICAgeyBDMkNvbG9yOjpSQU5HRV9MSU1JVEVELCAgICAgQ29sb3JBc3BlY3RzOjpSYW5nZUxpbWl0ZWQgfSwKKyAgICB7IEMyQ29sb3I6OlJBTkdFX09USEVSLCAgICAgICBDb2xvckFzcGVjdHM6OlJhbmdlT3RoZXIgfSwKK307CisKK0FMb29rdXA8QzJDb2xvcjo6dHJhbnNmZXJfdCwgaW50MzJfdD4gc0NvbG9yVHJhbnNmZXJzID0geworICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfTElORUFSLCBDT0xPUl9UUkFOU0ZFUl9MSU5FQVIgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSXzE3ME0sICAgQ09MT1JfVFJBTlNGRVJfU0RSX1ZJREVPIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9TVDIwODQsIENPTE9SX1RSQU5TRkVSX1NUMjA4NCB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfSExHLCAgICBDT0xPUl9UUkFOU0ZFUl9ITEcgfSwKK307CisKK0FMb29rdXA8QzJDb2xvcjo6dHJhbnNmZXJfdCwgQ29sb3JBc3BlY3RzOjpUcmFuc2Zlcj4gc0NvbG9yVHJhbnNmZXJzU2YgPSB7CisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9VTlNQRUNJRklFRCwgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclVuc3BlY2lmaWVkIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9MSU5FQVIsICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlckxpbmVhciB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfU1JHQiwgICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJTUkdCIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl8xNzBNLCAgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclNNUFRFMTcwTSB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfR0FNTUEyMiwgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJHYW1tYTIyIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9HQU1NQTI4LCAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlckdhbW1hMjggfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX1NUMjA4NCwgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyU1QyMDg0IH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9ITEcsICAgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlckhMRyB9LAorICAgIHsgQzJDb2xvcjo6VFJBTlNGRVJfMjQwTSwgICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXJTTVBURTI0ME0gfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX1hWWUNDLCAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyWHZZQ0MgfSwKKyAgICB7IEMyQ29sb3I6OlRSQU5TRkVSX0JUMTM2MSwgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyQlQxMzYxIH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9TVDQyOCwgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclNUNDI4IH0sCisgICAgeyBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUiwgICAgICAgQ29sb3JBc3BlY3RzOjpUcmFuc2Zlck90aGVyIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90PiBzRG9sYnlWaXNpb25MZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9IRF8yNCwgIERvbGJ5VmlzaW9uTGV2ZWxIZDI0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9IRF8zMCwgIERvbGJ5VmlzaW9uTGV2ZWxIZDMwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9GSERfMjQsIERvbGJ5VmlzaW9uTGV2ZWxGaGQyNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fRkhEXzMwLCBEb2xieVZpc2lvbkxldmVsRmhkMzAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX0ZIRF82MCwgRG9sYnlWaXNpb25MZXZlbEZoZDYwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9VSERfMjQsIERvbGJ5VmlzaW9uTGV2ZWxVaGQyNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX01BSU5fVUhEXzMwLCBEb2xieVZpc2lvbkxldmVsVWhkMzAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9NQUlOX1VIRF80OCwgRG9sYnlWaXNpb25MZXZlbFVoZDQ4IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfTUFJTl9VSERfNjAsIERvbGJ5VmlzaW9uTGV2ZWxVaGQ2MCB9LAorCisgICAgLy8gaGlnaCB0aWVycyBhcmUgbm90IHlldCBzdXBwb3J0ZWQgb24gYW5kcm9pZCwgZm9yIG5vdyBtYXAgdGhlbSB0byBtYWluIHRpZXIKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX0hEXzI0LCAgRG9sYnlWaXNpb25MZXZlbEhkMjQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX0hEXzMwLCAgRG9sYnlWaXNpb25MZXZlbEhkMzAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX0ZIRF8yNCwgRG9sYnlWaXNpb25MZXZlbEZoZDI0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9GSERfMzAsIERvbGJ5VmlzaW9uTGV2ZWxGaGQzMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfRkhEXzYwLCBEb2xieVZpc2lvbkxldmVsRmhkNjAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX1VIRF8yNCwgRG9sYnlWaXNpb25MZXZlbFVoZDI0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfRFZfSElHSF9VSERfMzAsIERvbGJ5VmlzaW9uTGV2ZWxVaGQzMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0RWX0hJR0hfVUhEXzQ4LCBEb2xieVZpc2lvbkxldmVsVWhkNDggfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9EVl9ISUdIX1VIRF82MCwgRG9sYnlWaXNpb25MZXZlbFVoZDYwIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNEb2xieVZpc2lvblByb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfQVZfUEVSLCBEb2xieVZpc2lvblByb2ZpbGVEdmF2UGVyIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9BVl9QRU4sIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZQZW4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0hFX0RFUiwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZURlciB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfSEVfREVOLCBEb2xieVZpc2lvblByb2ZpbGVEdmhlRGVuIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9EVl9IRV8wNCwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0ciB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfSEVfMDUsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdG4gfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0hFX0RUSCwgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0aCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfRFZfSEVfMDcsIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdGIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0hFXzA4LCBEb2xieVZpc2lvblByb2ZpbGVEdmhlU3QgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0RWX0FWXzA5LCBEb2xieVZpc2lvblByb2ZpbGVEdmF2U2UgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNIMjYzTGV2ZWxzID0geworICAgIHsgQzJDb25maWc6OkxFVkVMX0gyNjNfMTAsIEgyNjNMZXZlbDEwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSDI2M18yMCwgSDI2M0xldmVsMjAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzMwLCBIMjYzTGV2ZWwzMCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0gyNjNfNDAsIEgyNjNMZXZlbDQwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSDI2M180NSwgSDI2M0xldmVsNDUgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IMjYzXzUwLCBIMjYzTGV2ZWw1MCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0gyNjNfNjAsIEgyNjNMZXZlbDYwIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSDI2M183MCwgSDI2M0xldmVsNzAgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0gyNjNQcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfQkFTRUxJTkUsICAgICAgICAgIEgyNjNQcm9maWxlQmFzZWxpbmUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSDMyMCwgICAgICAgICAgICAgIEgyNjNQcm9maWxlSDMyMENvZGluZyB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19WMUJDLCAgICAgICAgICAgICAgSDI2M1Byb2ZpbGVCYWNrd2FyZENvbXBhdGlibGUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSVNXVjIsICAgICAgICAgICAgIEgyNjNQcm9maWxlSVNXVjIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSVNXVjMsICAgICAgICAgICAgIEgyNjNQcm9maWxlSVNXVjMgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSElHSF9DT01QUkVTU0lPTiwgIEgyNjNQcm9maWxlSGlnaENvbXByZXNzaW9uIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lOVEVSTkVULCAgICAgICAgICBIMjYzUHJvZmlsZUludGVybmV0IH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lOVEVSTEFDRSwgICAgICAgICBIMjYzUHJvZmlsZUludGVybGFjZSB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSDI2M19ISUdIX0xBVEVOQ1ksICAgICAgSDI2M1Byb2ZpbGVIaWdoTGF0ZW5jeSB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdD4gc0hldmNMZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzEsICAgICAgSEVWQ01haW5UaWVyTGV2ZWwxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzIsICAgICAgSEVWQ01haW5UaWVyTGV2ZWwyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzJfMSwgICAgSEVWQ01haW5UaWVyTGV2ZWwyMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zLCAgICAgIEhFVkNNYWluVGllckxldmVsMyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zXzEsICAgIEhFVkNNYWluVGllckxldmVsMzEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNCwgICAgICBIRVZDTWFpblRpZXJMZXZlbDQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNF8xLCAgICBIRVZDTWFpblRpZXJMZXZlbDQxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzUsICAgICAgSEVWQ01haW5UaWVyTGV2ZWw1IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMSwgICAgSEVWQ01haW5UaWVyTGV2ZWw1MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl81XzIsICAgIEhFVkNNYWluVGllckxldmVsNTIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNiwgICAgICBIRVZDTWFpblRpZXJMZXZlbDYgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNl8xLCAgICBIRVZDTWFpblRpZXJMZXZlbDYxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzZfMiwgICAgSEVWQ01haW5UaWVyTGV2ZWw2MiB9LAorCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzQsICAgICAgSEVWQ0hpZ2hUaWVyTGV2ZWw0IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzRfMSwgICAgSEVWQ0hpZ2hUaWVyTGV2ZWw0MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81LCAgICAgIEhFVkNIaWdoVGllckxldmVsNSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81XzEsICAgIEhFVkNIaWdoVGllckxldmVsNTEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNV8yLCAgICBIRVZDSGlnaFRpZXJMZXZlbDUyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzYsICAgICAgSEVWQ0hpZ2hUaWVyTGV2ZWw2IH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzZfMSwgICAgSEVWQ0hpZ2hUaWVyTGV2ZWw2MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF82XzIsICAgIEhFVkNIaWdoVGllckxldmVsNjIgfSwKKworICAgIC8vIG1hcCBoaWdoIHRpZXIgbGV2ZWxzIGJlbG93IDQgdG8gbWFpbiB0aWVyCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzEsICAgICAgSEVWQ0hpZ2hUaWVyTGV2ZWwxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzIsICAgICAgSEVWQ0hpZ2hUaWVyTGV2ZWwyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzJfMSwgICAgSEVWQ0hpZ2hUaWVyTGV2ZWwyMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zLCAgICAgIEhFVkNIaWdoVGllckxldmVsMyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zXzEsICAgIEhFVkNIaWdoVGllckxldmVsMzEgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0hldmNQcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTiwgSEVWQ1Byb2ZpbGVNYWluIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTAsIEhFVkNQcm9maWxlTWFpbjEwIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fU1RJTEwsIEhFVkNQcm9maWxlTWFpblN0aWxsIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fSU5UUkEsIEhFVkNQcm9maWxlTWFpbiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEwX0lOVFJBLCBIRVZDUHJvZmlsZU1haW4xMCB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzSGV2Y0hkclByb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEwLCBIRVZDUHJvZmlsZU1haW4xMEhEUjEwIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3Q+IHNIZXZjSGRyMTBQbHVzUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTAsIEhFVkNQcm9maWxlTWFpbjEwSERSMTBQbHVzIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90PiBzTXBlZzJMZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVAyVl9MT1csICAgICAgICAgTVBFRzJMZXZlbExMIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVAyVl9NQUlOLCAgICAgICAgTVBFRzJMZXZlbE1MIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIXzE0NDAsICAgTVBFRzJMZXZlbEgxNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSCwgICAgICAgIE1QRUcyTGV2ZWxITCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QMlZfSElHSFAsICAgICAgIE1QRUcyTGV2ZWxIUCB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzTXBlZzJQcm9maWxlcyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU0lNUExFLCAgICAgICAgICAgICAgICBNUEVHMlByb2ZpbGVTaW1wbGUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfTUFJTiwgICAgICAgICAgICAgICAgICBNUEVHMlByb2ZpbGVNYWluIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NOUl9TQ0FMQUJMRSwgICAgICAgICAgTVBFRzJQcm9maWxlU05SIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NQQVRJQUxMWV9TQ0FMQUJMRSwgICAgTVBFRzJQcm9maWxlU3BhdGlhbCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9ISUdILCAgICAgICAgICAgICAgICAgIE1QRUcyUHJvZmlsZUhpZ2ggfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfNDIyLCAgICAgICAgICAgICAgICAgICBNUEVHMlByb2ZpbGU0MjIgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNNcGVnNExldmVscyA9IHsKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzAsICAgTVBFRzRMZXZlbDAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzBCLCAgTVBFRzRMZXZlbDBiIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8xLCAgIE1QRUc0TGV2ZWwxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8yLCAgIE1QRUc0TGV2ZWwyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8zLCAgIE1QRUc0TGV2ZWwzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8zQiwgIE1QRUc0TGV2ZWwzYiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfNCwgICBNUEVHNExldmVsNCB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX01QNFZfNEEsICBNUEVHNExldmVsNGEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzUsICAgTVBFRzRMZXZlbDUgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9NUDRWXzYsICAgTVBFRzRMZXZlbDYgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc01wZWc0UHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRSwgICAgICAgICAgICBNUEVHNFByb2ZpbGVTaW1wbGUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfU0lNUExFX1NDQUxBQkxFLCAgIE1QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0NPUkUsICAgICAgICAgICAgICBNUEVHNFByb2ZpbGVDb3JlIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX01BSU4sICAgICAgICAgICAgICBNUEVHNFByb2ZpbGVNYWluIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX05CSVQsICAgICAgICAgICAgICBNUEVHNFByb2ZpbGVOYml0IH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0FSVFMsICAgICAgICAgICAgICBNUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0NPUkVfU0NBTEFCTEUsICAgICBNUEVHNFByb2ZpbGVDb3JlU2NhbGFibGUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQUNFLCAgICAgICAgICAgICAgIE1QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0FEVkFOQ0VEX0NPUkUsICAgICBNUEVHNFByb2ZpbGVBZHZhbmNlZENvcmUgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQURWQU5DRURfU0lNUExFLCAgIE1QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlIH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCwgaW50MzJfdD4gc1BjbUVuY29kaW5ncyA9IHsKKyAgICB7IEMyQ29uZmlnOjpQQ01fOCwga0F1ZGlvRW5jb2RpbmdQY204Yml0IH0sCisgICAgeyBDMkNvbmZpZzo6UENNXzE2LCBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0IH0sCisgICAgeyBDMkNvbmZpZzo6UENNX0ZMT0FULCBrQXVkaW9FbmNvZGluZ1BjbUZsb2F0IH0sCit9OworCitBTG9va3VwPEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90PiBzVnA5TGV2ZWxzID0geworICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV8xLCAgICBWUDlMZXZlbDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfMV8xLCAgVlA5TGV2ZWwxMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV8yLCAgICBWUDlMZXZlbDIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfMl8xLCAgVlA5TGV2ZWwyMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV8zLCAgICBWUDlMZXZlbDMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfM18xLCAgVlA5TGV2ZWwzMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV80LCAgICBWUDlMZXZlbDQgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfNF8xLCAgVlA5TGV2ZWw0MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV81LCAgICBWUDlMZXZlbDUgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9WUDlfNV8xLCAgVlA5TGV2ZWw1MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV81XzIsICBWUDlMZXZlbDUyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzYsICAgIFZQOUxldmVsNiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX1ZQOV82XzEsICBWUDlMZXZlbDYxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfVlA5XzZfMiwgIFZQOUxldmVsNjIgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc1ZwOVByb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzAsIFZQOVByb2ZpbGUwIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMSwgVlA5UHJvZmlsZTEgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8yLCBWUDlQcm9maWxlMiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzMsIFZQOVByb2ZpbGUzIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMiwgVlA5UHJvZmlsZTJIRFIgfSwKKyAgICB7IEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8zLCBWUDlQcm9maWxlM0hEUiB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzIsIFZQOVByb2ZpbGUySERSMTBQbHVzIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMywgVlA5UHJvZmlsZTNIRFIxMFBsdXMgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc1ZwOUhkclByb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzIsIFZQOVByb2ZpbGUySERSIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMywgVlA5UHJvZmlsZTNIRFIgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc1ZwOUhkcjEwUGx1c1Byb2ZpbGVzID0geworICAgIHsgQzJDb25maWc6OlBST0ZJTEVfVlA5XzIsIFZQOVByb2ZpbGUySERSMTBQbHVzIH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMywgVlA5UHJvZmlsZTNIRFIxMFBsdXMgfSwKK307CisKK0FMb29rdXA8QzJDb25maWc6OmxldmVsX3QsIGludDMyX3Q+IHNBdjFMZXZlbHMgPSB7CisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzIsICAgIEFWMUxldmVsMiAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfMl8xLCAgQVYxTGV2ZWwyMSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV8yXzIsICBBVjFMZXZlbDIyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMywgIEFWMUxldmVsMjMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfMywgICAgQVYxTGV2ZWwzICB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV8zXzEsICBBVjFMZXZlbDMxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzNfMiwgIEFWMUxldmVsMzIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfM18zLCAgQVYxTGV2ZWwzMyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV80LCAgICBBVjFMZXZlbDQgIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzRfMSwgIEFWMUxldmVsNDEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNF8yLCAgQVYxTGV2ZWw0MiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV80XzMsICBBVjFMZXZlbDQzIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzUsICAgIEFWMUxldmVsNSAgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNV8xLCAgQVYxTGV2ZWw1MSB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV81XzIsICBBVjFMZXZlbDUyIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzVfMywgIEFWMUxldmVsNTMgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNiwgICAgQVYxTGV2ZWw2ICB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV82XzEsICBBVjFMZXZlbDYxIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzZfMiwgIEFWMUxldmVsNjIgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfNl8zLCAgQVYxTGV2ZWw2MyB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV83LCAgICBBVjFMZXZlbDcgIH0sCisgICAgeyBDMkNvbmZpZzo6TEVWRUxfQVYxXzdfMSwgIEFWMUxldmVsNzEgfSwKKyAgICB7IEMyQ29uZmlnOjpMRVZFTF9BVjFfN18yLCAgQVYxTGV2ZWw3MiB9LAorICAgIHsgQzJDb25maWc6OkxFVkVMX0FWMV83XzMsICBBVjFMZXZlbDczIH0sCit9OworCisKK0FMb29rdXA8QzJDb25maWc6OnByb2ZpbGVfdCwgaW50MzJfdD4gc0F2MVByb2ZpbGVzID0geworICAgIC8vIFRPRE86IHdpbGwgbmVlZCB0byBkaXNhbWJpZ3VhdGUgYmV0d2VlbiBNYWluOCBhbmQgTWFpbjEwCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQVYxUHJvZmlsZU1haW44IH0sCisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQVYxUHJvZmlsZU1haW4xMCB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzQXYxSGRyUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQVYxUHJvZmlsZU1haW4xMCB9LAorICAgIHsgQzJDb25maWc6OlBST0ZJTEVfQVYxXzAsIEFWMVByb2ZpbGVNYWluMTBIRFIxMCB9LAorfTsKKworQUxvb2t1cDxDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90PiBzQXYxSGRyMTBQbHVzUHJvZmlsZXMgPSB7CisgICAgeyBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMCwgQVYxUHJvZmlsZU1haW4xMEhEUjEwUGx1cyB9LAorfTsKKworLyoqCisgKiBBIGhlbHBlciB0aGF0IHBhc3NlcyB0aHJvdWdoIHZlbmRvciBleHRlbnNpb24gcHJvZmlsZSBhbmQgbGV2ZWwgdmFsdWVzLgorICovCitzdHJ1Y3QgUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIDogQzJNYXBwZXI6OlByb2ZpbGVMZXZlbE1hcHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgPSAwOworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pID0gMDsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CisgICAgYm9vbCBwYXNzVGhyb3VnaE1hcChUIGZyb20sIFUgKnRvKSB7CisgICAgICAgIC8vIGFsbG93IChhbmQgcGFzcyB0aHJvdWdoKSB2ZW5kb3IgZXh0ZW5zaW9ucworICAgICAgICBpZiAoZnJvbSA+PSAoVClDMl9QUk9GSUxFX0xFVkVMX1ZFTkRPUl9TVEFSVCAmJiBmcm9tIDwgKFQpSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAqdG8gPSAoVSlmcm9tOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHNpbXBsZU1hcChmcm9tLCB0byk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIG1hcExldmVsKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBwYXNzVGhyb3VnaE1hcChmcm9tLCB0byk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIG1hcExldmVsKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBwYXNzVGhyb3VnaE1hcChmcm9tLCB0byk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIG1hcFByb2ZpbGUoQzJDb25maWc6OnByb2ZpbGVfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gcGFzc1Rocm91Z2hNYXAoZnJvbSwgdG8pOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBtYXBQcm9maWxlKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHBhc3NUaHJvdWdoTWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCisvLyBBQUMgb25seSB1c2VzIHByb2ZpbGVzLCBtYXAgYWxsIGxldmVscyB0byB1bnVzZWQgb3IgMAorc3RydWN0IEFhY1Byb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgKnRvID0gMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgICp0byA9IEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNBYWNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNBYWNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KK307CisKK3N0cnVjdCBBdmNQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNBdmNMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gc0F2Y0xldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNBdmNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNBdmNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KK307CisKK3N0cnVjdCBEb2xieVZpc2lvblByb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc0RvbGJ5VmlzaW9uTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNEb2xieVZpc2lvbkxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNEb2xieVZpc2lvblByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgeworICAgICAgICByZXR1cm4gc0RvbGJ5VmlzaW9uUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgSDI2M1Byb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc0gyNjNMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpsZXZlbF90ICp0bykgeworICAgICAgICByZXR1cm4gc0gyNjNMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzSDI2M1Byb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgeworICAgICAgICByZXR1cm4gc0gyNjNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KK307CisKK3N0cnVjdCBIZXZjUHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICBIZXZjUHJvZmlsZUxldmVsTWFwcGVyKGJvb2wgaXNIZHIgPSBmYWxzZSwgYm9vbCBpc0hkcjEwUGx1cyA9IGZhbHNlKSA6CisgICAgICAgIFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlcigpLAorICAgICAgICBtSXNIZHIoaXNIZHIpLCBtSXNIZHIxMFBsdXMoaXNIZHIxMFBsdXMpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzSGV2Y0xldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzSGV2Y0xldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIG1Jc0hkcjEwUGx1cyA/IHNIZXZjSGRyMTBQbHVzUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgICBtSXNIZHIgPyBzSGV2Y0hkclByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0hldmNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIG1Jc0hkcjEwUGx1cyA/IHNIZXZjSGRyMTBQbHVzUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgICBtSXNIZHIgPyBzSGV2Y0hkclByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc0hldmNQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKworcHJpdmF0ZToKKyAgICBib29sIG1Jc0hkcjsKKyAgICBib29sIG1Jc0hkcjEwUGx1czsKK307CisKK3N0cnVjdCBNcGVnMlByb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc01wZWcyTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnMkxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnMlByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgeworICAgICAgICByZXR1cm4gc01wZWcyUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9Cit9OworCitzdHJ1Y3QgTXBlZzRQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OmxldmVsX3QgZnJvbSwgaW50MzJfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnNExldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzRMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzTXBlZzRQcm9maWxlcy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OnByb2ZpbGVfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNNcGVnNFByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorfTsKKworLy8gVlA4IGhhcyBubyBwcm9maWxlcyBhbmQgbGV2ZWxzIGluIENvZGVjIDIuMCwgYnV0IHdlIHVzZSBtYWluIHByb2ZpbGUgYW5kIGxldmVsIDAgaW4gTWVkaWFDb2RlYworLy8gbWFwIGFsbCBwcm9maWxlcyBhbmQgbGV2ZWxzIHRvIHRoYXQuCitzdHJ1Y3QgVnA4UHJvZmlsZUxldmVsTWFwcGVyIDogUHJvZmlsZUxldmVsTWFwcGVySGVscGVyIHsKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90LCBpbnQzMl90ICp0bykgeworICAgICAgICAqdG8gPSBWUDhMZXZlbF9WZXJzaW9uMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgICp0byA9IEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpwcm9maWxlX3QsIGludDMyX3QgKnRvKSB7CisgICAgICAgICp0byA9IFZQOFByb2ZpbGVNYWluOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90LCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgeworICAgICAgICAqdG8gPSBDMkNvbmZpZzo6UFJPRklMRV9VTlVTRUQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KK307CisKK3N0cnVjdCBWcDlQcm9maWxlTGV2ZWxNYXBwZXIgOiBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIgeworICAgIFZwOVByb2ZpbGVMZXZlbE1hcHBlcihib29sIGlzSGRyID0gZmFsc2UsIGJvb2wgaXNIZHIxMFBsdXMgPSBmYWxzZSkgOgorICAgICAgICBQcm9maWxlTGV2ZWxNYXBwZXJIZWxwZXIoKSwKKyAgICAgICAgbUlzSGRyKGlzSGRyKSwgbUlzSGRyMTBQbHVzKGlzSGRyMTBQbHVzKSB7fQorCisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6bGV2ZWxfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gc1ZwOUxldmVscy5tYXAoZnJvbSwgdG8pOworICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKGludDMyX3QgZnJvbSwgQzJDb25maWc6OmxldmVsX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzVnA5TGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoQzJDb25maWc6OnByb2ZpbGVfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgICAgICByZXR1cm4gbUlzSGRyMTBQbHVzID8gc1ZwOUhkcjEwUGx1c1Byb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgbUlzSGRyID8gc1ZwOUhkclByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1ZwOVByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cHJvZmlsZV90ICp0bykgeworICAgICAgICByZXR1cm4gbUlzSGRyMTBQbHVzID8gc1ZwOUhkcjEwUGx1c1Byb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgbUlzSGRyID8gc1ZwOUhkclByb2ZpbGVzLm1hcChmcm9tLCB0bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc1ZwOVByb2ZpbGVzLm1hcChmcm9tLCB0byk7CisgICAgfQorCitwcml2YXRlOgorICAgIGJvb2wgbUlzSGRyOworICAgIGJvb2wgbUlzSGRyMTBQbHVzOworfTsKKworc3RydWN0IEF2MVByb2ZpbGVMZXZlbE1hcHBlciA6IFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlciB7CisgICAgQXYxUHJvZmlsZUxldmVsTWFwcGVyKGJvb2wgaXNIZHIgPSBmYWxzZSwgYm9vbCBpc0hkcjEwUGx1cyA9IGZhbHNlKSA6CisgICAgICAgIFByb2ZpbGVMZXZlbE1hcHBlckhlbHBlcigpLAorICAgICAgICBtSXNIZHIoaXNIZHIpLCBtSXNIZHIxMFBsdXMoaXNIZHIxMFBsdXMpIHt9CisKKyAgICB2aXJ0dWFsIGJvb2wgc2ltcGxlTWFwKEMyQ29uZmlnOjpsZXZlbF90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBzQXYxTGV2ZWxzLm1hcChmcm9tLCB0byk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCBzaW1wbGVNYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6bGV2ZWxfdCAqdG8pIHsKKyAgICAgICAgcmV0dXJuIHNBdjFMZXZlbHMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChDMkNvbmZpZzo6cHJvZmlsZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBtSXNIZHIxMFBsdXMgPyBzQXYxSGRyMTBQbHVzUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgICBtSXNIZHIgPyBzQXYxSGRyUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQXYxUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisgICAgdmlydHVhbCBib29sIHNpbXBsZU1hcChpbnQzMl90IGZyb20sIEMyQ29uZmlnOjpwcm9maWxlX3QgKnRvKSB7CisgICAgICAgIHJldHVybiBtSXNIZHIxMFBsdXMgPyBzQXYxSGRyMTBQbHVzUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgICBtSXNIZHIgPyBzQXYxSGRyUHJvZmlsZXMubWFwKGZyb20sIHRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzQXYxUHJvZmlsZXMubWFwKGZyb20sIHRvKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgYm9vbCBtSXNIZHI7CisgICAgYm9vbCBtSXNIZHIxMFBsdXM7Cit9OworCit9IC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK3N0ZDo6c2hhcmVkX3B0cjxDMk1hcHBlcjo6UHJvZmlsZUxldmVsTWFwcGVyPgorQzJNYXBwZXI6OkdldFByb2ZpbGVMZXZlbE1hcHBlcihzdGQ6OnN0cmluZyBtZWRpYVR5cGUpIHsKKyAgICBzdGQ6OnRyYW5zZm9ybShtZWRpYVR5cGUuYmVnaW4oKSwgbWVkaWFUeXBlLmJlZ2luKCksIG1lZGlhVHlwZS5lbmQoKSwgOjp0b2xvd2VyKTsKKyAgICBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX0FVRElPX0FBQykgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxBYWNQcm9maWxlTGV2ZWxNYXBwZXI+KCk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fQVZDKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEF2Y1Byb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04pIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8RG9sYnlWaXNpb25Qcm9maWxlTGV2ZWxNYXBwZXI+KCk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fSDI2MykgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxIMjYzUHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX0hFVkMpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8SGV2Y1Byb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19NUEVHMikgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxNcGVnMlByb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19NUEVHNCkgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxNcGVnNFByb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9IGVsc2UgaWYgKG1lZGlhVHlwZSA9PSBNSU1FVFlQRV9WSURFT19WUDgpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8VnA4UHJvZmlsZUxldmVsTWFwcGVyPigpOworICAgIH0gZWxzZSBpZiAobWVkaWFUeXBlID09IE1JTUVUWVBFX1ZJREVPX1ZQOSkgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxWcDlQcm9maWxlTGV2ZWxNYXBwZXI+KCk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fQVYxKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEF2MVByb2ZpbGVMZXZlbE1hcHBlcj4oKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vIHN0YXRpYworc3RkOjpzaGFyZWRfcHRyPEMyTWFwcGVyOjpQcm9maWxlTGV2ZWxNYXBwZXI+CitDMk1hcHBlcjo6R2V0SGRyUHJvZmlsZUxldmVsTWFwcGVyKHN0ZDo6c3RyaW5nIG1lZGlhVHlwZSwgYm9vbCBpc0hkcjEwUGx1cykgeworICAgIHN0ZDo6dHJhbnNmb3JtKG1lZGlhVHlwZS5iZWdpbigpLCBtZWRpYVR5cGUuYmVnaW4oKSwgbWVkaWFUeXBlLmVuZCgpLCA6OnRvbG93ZXIpOworICAgIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fSEVWQykgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxIZXZjUHJvZmlsZUxldmVsTWFwcGVyPih0cnVlLCBpc0hkcjEwUGx1cyk7CisgICAgfSBlbHNlIGlmIChtZWRpYVR5cGUgPT0gTUlNRVRZUEVfVklERU9fVlA5KSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPFZwOVByb2ZpbGVMZXZlbE1hcHBlcj4odHJ1ZSwgaXNIZHIxMFBsdXMpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb25maWc6OmJpdHJhdGVfbW9kZV90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgcmV0dXJuIHNCaXRyYXRlTW9kZXMubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QgKnRvKSB7CisgICAgcmV0dXJuIHNCaXRyYXRlTW9kZXMubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb25maWc6OnBjbV9lbmNvZGluZ190IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgcmV0dXJuIHNQY21FbmNvZGluZ3MubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoaW50MzJfdCBmcm9tLCBDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QgKnRvKSB7CisgICAgcmV0dXJuIHNQY21FbmNvZGluZ3MubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb2xvcjo6cmFuZ2VfdCBmcm9tLCBpbnQzMl90ICp0bykgeworICAgIGJvb2wgcmVzID0gdHJ1ZTsKKyAgICAvLyBtYXAgU0RLIGRlZmluZWQgdmFsdWVzIGRpcmVjdGx5LiBGb3Igb3RoZXIgdmFsdWVzLCB1c2Ugd3JhcHBpbmcgZnJvbSBDb2xvclV0aWxzLgorICAgIGlmICghc0NvbG9yUmFuZ2VzLm1hcChmcm9tLCB0bykpIHsKKyAgICAgICAgQ29sb3JBc3BlY3RzOjpSYW5nZSBzZlJhbmdlOworCisgICAgICAgIC8vIG1hcCBrbm93biBjb25zdGFudHMgYW5kIGtlZXAgdmVuZG9yIGV4dGVuc2lvbnMuIGFsbCBvdGhlciB2YWx1ZXMgYXJlIG1hcHBlZCB0byAnT3RoZXInCisgICAgICAgIGlmICghc0NvbG9yUmFuZ2VzU2YubWFwKGZyb20sICZzZlJhbmdlKSkgeworICAgICAgICAgICAgLy8gdXNlIHN0YXRpYyBjYXN0IGFuZCBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZQorICAgICAgICAgICAgaWYgKGZyb20gPCBDMkNvbG9yOjpSQU5HRV9WRU5ET1JfU1RBUlQgfHwgZnJvbSA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgc2ZSYW5nZSA9IENvbG9yQXNwZWN0czo6UmFuZ2VPdGhlcjsKKyAgICAgICAgICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICp0byA9IENvbG9yVXRpbHM6OndyYXBDb2xvckFzcGVjdHNJbnRvQ29sb3JSYW5nZShzZlJhbmdlKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoaW50MzJfdCBmcm9tLCBDMkNvbG9yOjpyYW5nZV90ICp0bykgeworICAgIC8vIG1hcCBTREsgZGVmaW5lZCB2YWx1ZXMgZGlyZWN0bHkuIEZvciBvdGhlciB2YWx1ZXMsIHVzZSB3cmFwcGluZyBmcm9tIENvbG9yVXRpbHMuCisgICAgaWYgKCFzQ29sb3JSYW5nZXMubWFwKGZyb20sIHRvKSkgeworICAgICAgICBDb2xvckFzcGVjdHM6OlJhbmdlIHNmUmFuZ2U7CisgICAgICAgICh2b2lkKUNvbG9yVXRpbHM6OnVud3JhcENvbG9yQXNwZWN0c0Zyb21Db2xvclJhbmdlKGZyb20sICZzZlJhbmdlKTsKKworICAgICAgICAvLyBtYXAga25vd24gY29uc3RhbnRzIGFuZCBrZWVwIHZlbmRvciBleHRlbnNpb25zLiBhbGwgb3RoZXIgdmFsdWVzIGFyZSBtYXBwZWQgdG8gJ090aGVyJworICAgICAgICBpZiAoIXNDb2xvclJhbmdlc1NmLm1hcChzZlJhbmdlLCB0bykpIHsKKyAgICAgICAgICAgIC8vIHVzZSBzdGF0aWMgY2FzdCBhbmQgZW5zdXJlIGl0IGlzIGluIHRoZSBleHRlbnNpb24gcmFuZ2UKKyAgICAgICAgICAgICp0byA9IChDMkNvbG9yOjpyYW5nZV90KXNmUmFuZ2U7CisgICAgICAgICAgICBpZiAoKnRvIDwgQzJDb2xvcjo6UkFOR0VfVkVORE9SX1NUQVJUIHx8ICp0byA+IEMyQ29sb3I6OlJBTkdFX09USEVSKSB7CisgICAgICAgICAgICAgICAgKnRvID0gQzJDb2xvcjo6UkFOR0VfT1RIRVI7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKEMyQ29sb3I6OnJhbmdlX3QgZnJvbSwgQ29sb3JBc3BlY3RzOjpSYW5nZSAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yUmFuZ2VzU2YubWFwKGZyb20sIHRvKTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQ29sb3JBc3BlY3RzOjpSYW5nZSBmcm9tLCBDMkNvbG9yOjpyYW5nZV90ICp0bykgeworICAgIHJldHVybiBzQ29sb3JSYW5nZXNTZi5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbG9yOjpwcmltYXJpZXNfdCBwcmltYXJpZXMsIEMyQ29sb3I6Om1hdHJpeF90IG1hdHJpeCwgaW50MzJfdCAqc3RhbmRhcmQpIHsKKyAgICBDb2xvckFzcGVjdHM6OlByaW1hcmllcyBzZlByaW1hcmllczsKKyAgICBDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcyBzZk1hdHJpeDsKKyAgICBib29sIHJlcyA9IHRydWU7CisKKyAgICAvLyBtYXAga25vd24gY29uc3RhbnRzIGFuZCBrZWVwIHZlbmRvciBleHRlbnNpb25zLiBhbGwgb3RoZXIgdmFsdWVzIGFyZSBtYXBwZWQgdG8gJ090aGVyJworICAgIGlmICghc0NvbG9yUHJpbWFyaWVzU2YubWFwKHByaW1hcmllcywgJnNmUHJpbWFyaWVzKSkgeworICAgICAgICAvLyBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZSBhbmQgdXNlIHN0YXRpYyBjYXN0CisgICAgICAgIGlmIChwcmltYXJpZXMgPCBDMkNvbG9yOjpQUklNQVJJRVNfVkVORE9SX1NUQVJUIHx8IHByaW1hcmllcyA+IEMyQ29sb3I6OlBSSU1BUklFU19PVEhFUikgeworICAgICAgICAgICAgLy8gdW5kZWZpbmVkIG5vbi1leHRlbnNpb24gdmFsdWVzIG1hcCB0byAnT3RoZXInCisgICAgICAgICAgICBzZlByaW1hcmllcyA9IENvbG9yQXNwZWN0czo6UHJpbWFyaWVzT3RoZXI7CisgICAgICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNmUHJpbWFyaWVzID0gKENvbG9yQXNwZWN0czo6UHJpbWFyaWVzKXByaW1hcmllczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghc0NvbG9yTWF0cmljZXNTZi5tYXAobWF0cml4LCAmc2ZNYXRyaXgpKSB7CisgICAgICAgIC8vIHVzZSBzdGF0aWMgY2FzdCBhbmQgZW5zdXJlIGl0IGlzIGluIHRoZSBleHRlbnNpb24gcmFuZ2UKKyAgICAgICAgaWYgKG1hdHJpeCA8IEMyQ29sb3I6Ok1BVFJJWF9WRU5ET1JfU1RBUlQgfHwgbWF0cml4ID4gQzJDb2xvcjo6TUFUUklYX09USEVSKSB7CisgICAgICAgICAgICAvLyB1bmRlZmluZWQgbm9uLWV4dGVuc2lvbiB2YWx1ZXMgbWFwIHRvICdPdGhlcicKKyAgICAgICAgICAgIHNmTWF0cml4ID0gQ29sb3JBc3BlY3RzOjpNYXRyaXhPdGhlcjsKKyAgICAgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2ZNYXRyaXggPSAoQ29sb3JBc3BlY3RzOjpNYXRyaXhDb2VmZnMpbWF0cml4OworICAgICAgICB9CisgICAgfQorCisgICAgKnN0YW5kYXJkID0gQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclN0YW5kYXJkKHNmUHJpbWFyaWVzLCBzZk1hdHJpeCk7CisKKyAgICByZXR1cm4gcmVzOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChpbnQzMl90IHN0YW5kYXJkLCBDMkNvbG9yOjpwcmltYXJpZXNfdCAqcHJpbWFyaWVzLCBDMkNvbG9yOjptYXRyaXhfdCAqbWF0cml4KSB7CisgICAgLy8gZmlyc3QgbWFwIHRvIHN0YWdlZnJpZ2h0IGZvdW5kYXRpb24gYXNwZWN0cyA9PiB0aGVzZSBhY3R1YWxseSBtYXAgbmVhcmx5IDE6MSB0bworICAgIC8vIENvZGVjIDIuMCBhc3BlY3RzCisgICAgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMgc2ZQcmltYXJpZXM7CisgICAgQ29sb3JBc3BlY3RzOjpNYXRyaXhDb2VmZnMgc2ZNYXRyaXg7CisgICAgYm9vbCByZXMgPSB0cnVlOworICAgICh2b2lkKUNvbG9yVXRpbHM6OnVud3JhcENvbG9yQXNwZWN0c0Zyb21Db2xvclN0YW5kYXJkKHN0YW5kYXJkLCAmc2ZQcmltYXJpZXMsICZzZk1hdHJpeCk7CisKKyAgICAvLyBtYXAga25vd24gY29uc3RhbnRzIGFuZCBrZWVwIHZlbmRvciBleHRlbnNpb25zLiBhbGwgb3RoZXIgdmFsdWVzIGFyZSBtYXBwZWQgdG8gJ090aGVyJworICAgIGlmICghc0NvbG9yUHJpbWFyaWVzU2YubWFwKHNmUHJpbWFyaWVzLCBwcmltYXJpZXMpKSB7CisgICAgICAgIC8vIHVzZSBzdGF0aWMgY2FzdCBhbmQgZW5zdXJlIGl0IGlzIGluIHRoZSBleHRlbnNpb24gcmFuZ2UKKyAgICAgICAgKnByaW1hcmllcyA9IChDMkNvbG9yOjpwcmltYXJpZXNfdClzZlByaW1hcmllczsKKyAgICAgICAgaWYgKCpwcmltYXJpZXMgPCBDMkNvbG9yOjpQUklNQVJJRVNfVkVORE9SX1NUQVJUIHx8ICpwcmltYXJpZXMgPiBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVIpIHsKKyAgICAgICAgICAgICpwcmltYXJpZXMgPSBDMkNvbG9yOjpQUklNQVJJRVNfT1RIRVI7CisgICAgICAgICAgICByZXMgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghc0NvbG9yTWF0cmljZXNTZi5tYXAoc2ZNYXRyaXgsIG1hdHJpeCkpIHsKKyAgICAgICAgLy8gdXNlIHN0YXRpYyBjYXN0IGFuZCBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZQorICAgICAgICAqbWF0cml4ID0gKEMyQ29sb3I6Om1hdHJpeF90KXNmTWF0cml4OworICAgICAgICBpZiAoKm1hdHJpeCA8IEMyQ29sb3I6Ok1BVFJJWF9WRU5ET1JfU1RBUlQgfHwgKm1hdHJpeCA+IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUikgeworICAgICAgICAgICAgKm1hdHJpeCA9IEMyQ29sb3I6Ok1BVFJJWF9PVEhFUjsKKyAgICAgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoQzJDb2xvcjo6cHJpbWFyaWVzX3QgZnJvbSwgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMgKnRvKSB7CisgICAgcmV0dXJuIHNDb2xvclByaW1hcmllc1NmLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKENvbG9yQXNwZWN0czo6UHJpbWFyaWVzIGZyb20sIEMyQ29sb3I6OnByaW1hcmllc190ICp0bykgeworICAgIHJldHVybiBzQ29sb3JQcmltYXJpZXNTZi5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbG9yOjptYXRyaXhfdCBmcm9tLCBDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcyAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yTWF0cmljZXNTZi5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcyBmcm9tLCBDMkNvbG9yOjptYXRyaXhfdCAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yTWF0cmljZXNTZi5tYXAoZnJvbSwgdG8pOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbG9yOjp0cmFuc2Zlcl90IGZyb20sIGludDMyX3QgKnRvKSB7CisgICAgYm9vbCByZXMgPSB0cnVlOworICAgIC8vIG1hcCBTREsgZGVmaW5lZCB2YWx1ZXMgZGlyZWN0bHkuIEZvciBvdGhlciB2YWx1ZXMsIHVzZSB3cmFwcGluZyBmcm9tIENvbG9yVXRpbHMuCisgICAgaWYgKCFzQ29sb3JUcmFuc2ZlcnMubWFwKGZyb20sIHRvKSkgeworICAgICAgICBDb2xvckFzcGVjdHM6OlRyYW5zZmVyIHNmVHJhbnNmZXI7CisKKyAgICAgICAgLy8gbWFwIGtub3duIGNvbnN0YW50cyBhbmQga2VlcCB2ZW5kb3IgZXh0ZW5zaW9ucy4gYWxsIG90aGVyIHZhbHVlcyBhcmUgbWFwcGVkIHRvICdPdGhlcicKKyAgICAgICAgaWYgKCFzQ29sb3JUcmFuc2ZlcnNTZi5tYXAoZnJvbSwgJnNmVHJhbnNmZXIpKSB7CisgICAgICAgICAgICAvLyB1c2Ugc3RhdGljIGNhc3QgYW5kIGVuc3VyZSBpdCBpcyBpbiB0aGUgZXh0ZW5zaW9uIHJhbmdlCisgICAgICAgICAgICBpZiAoZnJvbSA8IEMyQ29sb3I6OlRSQU5TRkVSX1ZFTkRPUl9TVEFSVCB8fCBmcm9tID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICBzZlRyYW5zZmVyID0gQ29sb3JBc3BlY3RzOjpUcmFuc2Zlck90aGVyOworICAgICAgICAgICAgICAgIHJlcyA9IGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKnRvID0gQ29sb3JVdGlsczo6d3JhcENvbG9yQXNwZWN0c0ludG9Db2xvclRyYW5zZmVyKHNmVHJhbnNmZXIpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChpbnQzMl90IGZyb20sIEMyQ29sb3I6OnRyYW5zZmVyX3QgKnRvKSB7CisgICAgLy8gbWFwIFNESyBkZWZpbmVkIHZhbHVlcyBkaXJlY3RseS4gRm9yIG90aGVyIHZhbHVlcywgdXNlIHdyYXBwaW5nIGZyb20gQ29sb3JVdGlscy4KKyAgICBpZiAoIXNDb2xvclRyYW5zZmVycy5tYXAoZnJvbSwgdG8pKSB7CisgICAgICAgIENvbG9yQXNwZWN0czo6VHJhbnNmZXIgc2ZUcmFuc2ZlcjsKKyAgICAgICAgKHZvaWQpQ29sb3JVdGlsczo6dW53cmFwQ29sb3JBc3BlY3RzRnJvbUNvbG9yVHJhbnNmZXIoZnJvbSwgJnNmVHJhbnNmZXIpOworCisgICAgICAgIC8vIG1hcCBrbm93biBjb25zdGFudHMgYW5kIGtlZXAgdmVuZG9yIGV4dGVuc2lvbnMuIGFsbCBvdGhlciB2YWx1ZXMgYXJlIG1hcHBlZCB0byAnT3RoZXInCisgICAgICAgIGlmICghc0NvbG9yVHJhbnNmZXJzU2YubWFwKHNmVHJhbnNmZXIsIHRvKSkgeworICAgICAgICAgICAgLy8gdXNlIHN0YXRpYyBjYXN0IGFuZCBlbnN1cmUgaXQgaXMgaW4gdGhlIGV4dGVuc2lvbiByYW5nZQorICAgICAgICAgICAgKnRvID0gKEMyQ29sb3I6OnRyYW5zZmVyX3Qpc2ZUcmFuc2ZlcjsKKyAgICAgICAgICAgIGlmICgqdG8gPCBDMkNvbG9yOjpUUkFOU0ZFUl9WRU5ET1JfU1RBUlQgfHwgKnRvID4gQzJDb2xvcjo6VFJBTlNGRVJfT1RIRVIpIHsKKyAgICAgICAgICAgICAgICAqdG8gPSBDMkNvbG9yOjpUUkFOU0ZFUl9PVEhFUjsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gc3RhdGljCitib29sIEMyTWFwcGVyOjptYXAoCisgICAgICAgIEMyQ29sb3I6OnJhbmdlX3QgcmFuZ2UsIEMyQ29sb3I6OnByaW1hcmllc190IHByaW1hcmllcywKKyAgICAgICAgQzJDb2xvcjo6bWF0cml4X3QgbWF0cml4LCBDMkNvbG9yOjp0cmFuc2Zlcl90IHRyYW5zZmVyLCB1aW50MzJfdCAqZGF0YVNwYWNlKSB7CisjaWYgMAorICAgIC8vIHB1cmUgcmVpbXBsZW1lbnRhdGlvbgorICAgICpkYXRhU3BhY2UgPSBIQUxfREFUQVNQQUNFX1VOS05PV047IC8vIHRoaXMgaXMgMAorCisgICAgc3dpdGNoIChyYW5nZSkgeworICAgICAgICBjYXNlIEMyQ29sb3I6OlJBTkdFX0ZVTEw6ICAgICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9SQU5HRV9GVUxMOyAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpSQU5HRV9MSU1JVEVEOiAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfUkFOR0VfTElNSVRFRDsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAodHJhbnNmZXIpIHsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpUUkFOU0ZFUl9MSU5FQVI6ICAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfTElORUFSOyAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6VFJBTlNGRVJfU1JHQjogICAgKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1RSQU5TRkVSX1NSR0I7ICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29sb3I6OlRSQU5TRkVSXzE3ME06ICAgICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9UUkFOU0ZFUl9TTVBURV8xNzBNOyBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpUUkFOU0ZFUl9HQU1NQTIyOiAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfR0FNTUEyXzI7ICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6VFJBTlNGRVJfR0FNTUEyODogKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1RSQU5TRkVSX0dBTU1BMl84OyAgIGJyZWFrOworICAgICAgICBjYXNlIEMyQ29sb3I6OlRSQU5TRkVSX1NUMjA4NDogICpkYXRhU3BhY2UgfD0gSEFMX0RBVEFTUEFDRV9UUkFOU0ZFUl9TVDIwODQ7ICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDMkNvbG9yOjpUUkFOU0ZFUl9ITEc6ICAgICAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfVFJBTlNGRVJfSExHOyAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKworICAgIHN3aXRjaCAocHJpbWFyaWVzKSB7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNjAxXzUyNToKKyAgICAgICAgICAgICpkYXRhU3BhY2UgfD0gKG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfMjQwTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQ3MDkpCisgICAgICAgICAgICAgICAgICAgID8gSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDYwMV81MjVfVU5BREpVU1RFRAorICAgICAgICAgICAgICAgICAgICA6IEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfQlQ2MDFfNTI1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNjAxXzYyNToKKyAgICAgICAgICAgICpkYXRhU3BhY2UgfD0gKG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfMjQwTQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQ3MDkpCisgICAgICAgICAgICAgICAgICAgID8gSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDYwMV82MjVfVU5BREpVU1RFRAorICAgICAgICAgICAgICAgICAgICA6IEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfQlQ2MDFfNjI1OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUMjAyMDoKKyAgICAgICAgICAgICpkYXRhU3BhY2UgfD0gKG1hdHJpeCA9PSBDMkNvbG9yOjpNQVRSSVhfQlQyMDIwX0NPTlNUQU5UCisgICAgICAgICAgICAgICAgICAgID8gSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDIwMjBfQ09OU1RBTlRfTFVNSU5BTkNFCisgICAgICAgICAgICAgICAgICAgIDogSEFMX0RBVEFTUEFDRV9TVEFOREFSRF9CVDIwMjApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNDcwX006CisgICAgICAgICAgICAqZGF0YVNwYWNlIHw9IEhBTF9EQVRBU1BBQ0VfU1RBTkRBUkRfQlQ0NzBNOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQzJDb2xvcjo6UFJJTUFSSUVTX0JUNzA5OgorICAgICAgICAgICAgKmRhdGFTcGFjZSB8PSBIQUxfREFUQVNQQUNFX1NUQU5EQVJEX0JUNzA5OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIH0KKyNlbHNlCisgICAgLy8gZm9yIG5vdyB1c2UgbGVnYWN5IGltcGxlbWVudGF0aW9uCisgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHM7CisgICAgaWYgKCFzQ29sb3JSYW5nZXNTZi5tYXAocmFuZ2UsICZhc3BlY3RzLm1SYW5nZSkpIHsKKyAgICAgICAgYXNwZWN0cy5tUmFuZ2UgPSBDb2xvckFzcGVjdHM6OlJhbmdlVW5zcGVjaWZpZWQ7CisgICAgfQorICAgIGlmICghc0NvbG9yUHJpbWFyaWVzU2YubWFwKHByaW1hcmllcywgJmFzcGVjdHMubVByaW1hcmllcykpIHsKKyAgICAgICAgYXNwZWN0cy5tUHJpbWFyaWVzID0gQ29sb3JBc3BlY3RzOjpQcmltYXJpZXNVbnNwZWNpZmllZDsKKyAgICB9CisgICAgaWYgKCFzQ29sb3JNYXRyaWNlc1NmLm1hcChtYXRyaXgsICZhc3BlY3RzLm1NYXRyaXhDb2VmZnMpKSB7CisgICAgICAgIGFzcGVjdHMubU1hdHJpeENvZWZmcyA9IENvbG9yQXNwZWN0czo6TWF0cml4VW5zcGVjaWZpZWQ7CisgICAgfQorICAgIGlmICghc0NvbG9yVHJhbnNmZXJzU2YubWFwKHRyYW5zZmVyLCAmYXNwZWN0cy5tVHJhbnNmZXIpKSB7CisgICAgICAgIGFzcGVjdHMubVRyYW5zZmVyID0gQ29sb3JBc3BlY3RzOjpUcmFuc2ZlclVuc3BlY2lmaWVkOworICAgIH0KKyAgICAqZGF0YVNwYWNlID0gQ29sb3JVdGlsczo6Z2V0RGF0YVNwYWNlRm9yQ29sb3JBc3BlY3RzKGFzcGVjdHMsIHRydWUgLyogbWF5RXhwYW5kICovKTsKKyNlbmRpZgorICAgIHJldHVybiB0cnVlOworfQorCisvLyBzdGF0aWMKK2Jvb2wgQzJNYXBwZXI6Om1hcChDMkNvbG9yOjp0cmFuc2Zlcl90IGZyb20sIENvbG9yQXNwZWN0czo6VHJhbnNmZXIgKnRvKSB7CisgICAgcmV0dXJuIHNDb2xvclRyYW5zZmVyc1NmLm1hcChmcm9tLCB0byk7Cit9CisKKy8vIHN0YXRpYworYm9vbCBDMk1hcHBlcjo6bWFwKENvbG9yQXNwZWN0czo6VHJhbnNmZXIgZnJvbSwgQzJDb2xvcjo6dHJhbnNmZXJfdCAqdG8pIHsKKyAgICByZXR1cm4gc0NvbG9yVHJhbnNmZXJzU2YubWFwKGZyb20sIHRvKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuaCBiL21lZGlhL2NvZGVjMi9zZnBsdWdpbi91dGlscy9Db2RlYzJNYXBwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWM2ZjA3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3NmcGx1Z2luL3V0aWxzL0NvZGVjMk1hcHBlci5oCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0NPREVDMl9NQVBQRVJfSF8KKyNkZWZpbmUgQU5EUk9JRF9DT0RFQzJfTUFQUEVSX0hfCisKKyNpbmNsdWRlIDxDMkNvbmZpZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworICAgIC8qKgorICAgICAqIFV0aWxpdHkgY2xhc3MgdG8gbWFwIENvZGVjIDIuMCB2YWx1ZXMgdG8gYW5kcm9pZCB2YWx1ZXMuCisgICAgICovCisgICAgc3RydWN0IEMyTWFwcGVyIHsKKyAgICAgICAgc3RydWN0IFByb2ZpbGVMZXZlbE1hcHBlciB7CisgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgbWFwUHJvZmlsZShDMkNvbmZpZzo6cHJvZmlsZV90LCBpbnQzMl90KikgPSAwOworICAgICAgICAgICAgdmlydHVhbCBib29sIG1hcFByb2ZpbGUoaW50MzJfdCwgQzJDb25maWc6OnByb2ZpbGVfdCopID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXBMZXZlbChDMkNvbmZpZzo6bGV2ZWxfdCwgaW50MzJfdCopID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBtYXBMZXZlbChpbnQzMl90LCBDMkNvbmZpZzo6bGV2ZWxfdCopID0gMDsKKyAgICAgICAgICAgIHZpcnR1YWwgflByb2ZpbGVMZXZlbE1hcHBlcigpID0gZGVmYXVsdDsKKyAgICAgICAgfTsKKworICAgICAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPFByb2ZpbGVMZXZlbE1hcHBlcj4KKyAgICAgICAgR2V0UHJvZmlsZUxldmVsTWFwcGVyKHN0ZDo6c3RyaW5nIG1lZGlhVHlwZSk7CisKKyAgICAgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxQcm9maWxlTGV2ZWxNYXBwZXI+CisgICAgICAgIEdldEhkclByb2ZpbGVMZXZlbE1hcHBlcihzdGQ6OnN0cmluZyBtZWRpYVR5cGUsIGJvb2wgaXNIZHIxMFBsdXMgPSBmYWxzZSk7CisKKyAgICAgICAgLy8gY29udmVydCBiZXR3ZWVuIGJpdHJhdGVzCisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbmZpZzo6Yml0cmF0ZV9tb2RlX3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29uZmlnOjpiaXRyYXRlX21vZGVfdCopOworCisgICAgICAgIC8vIGNvbnZlcnQgYmV0d2VlbiBwY20gZW5jb2RpbmdzCisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbmZpZzo6cGNtX2VuY29kaW5nX3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29uZmlnOjpwY21fZW5jb2RpbmdfdCopOworCisgICAgICAgIC8vIGNvbnZlcnQgYmV0d2VlbiBwaWN0dXJlIHR5cGVzCisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbmZpZzo6cGljdHVyZV90eXBlX3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29uZmlnOjpwaWN0dXJlX3R5cGVfdCopOworCisgICAgICAgIC8vIGNvbnZlcnQgYmV0d2VlbiBjb2xvciBhc3BlY3RzCisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjpyYW5nZV90LCBpbnQzMl90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChpbnQzMl90LCBDMkNvbG9yOjpyYW5nZV90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjpwcmltYXJpZXNfdCwgQzJDb2xvcjo6bWF0cml4X3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29sb3I6OnByaW1hcmllc190KiwgQzJDb2xvcjo6bWF0cml4X3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29sb3I6OnRyYW5zZmVyX3QsIGludDMyX3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKGludDMyX3QsIEMyQ29sb3I6OnRyYW5zZmVyX3QqKTsKKworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoCisgICAgICAgICAgICAgICAgQzJDb2xvcjo6cmFuZ2VfdCwgQzJDb2xvcjo6cHJpbWFyaWVzX3QsIEMyQ29sb3I6Om1hdHJpeF90LCBDMkNvbG9yOjp0cmFuc2Zlcl90LAorICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkYXRhU3BhY2UpOworCisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjpyYW5nZV90LCBDb2xvckFzcGVjdHM6OlJhbmdlKik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDb2xvckFzcGVjdHM6OlJhbmdlLCBDMkNvbG9yOjpyYW5nZV90Kik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDMkNvbG9yOjpwcmltYXJpZXNfdCwgQ29sb3JBc3BlY3RzOjpQcmltYXJpZXMqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKENvbG9yQXNwZWN0czo6UHJpbWFyaWVzLCBDMkNvbG9yOjpwcmltYXJpZXNfdCopOworICAgICAgICBzdGF0aWMgYm9vbCBtYXAoQzJDb2xvcjo6bWF0cml4X3QsIENvbG9yQXNwZWN0czo6TWF0cml4Q29lZmZzKik7CisgICAgICAgIHN0YXRpYyBib29sIG1hcChDb2xvckFzcGVjdHM6Ok1hdHJpeENvZWZmcywgQzJDb2xvcjo6bWF0cml4X3QqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKEMyQ29sb3I6OnRyYW5zZmVyX3QsIENvbG9yQXNwZWN0czo6VHJhbnNmZXIqKTsKKyAgICAgICAgc3RhdGljIGJvb2wgbWFwKENvbG9yQXNwZWN0czo6VHJhbnNmZXIsIEMyQ29sb3I6OnRyYW5zZmVyX3QqKTsKKyAgICB9OworfQorCisjZW5kaWYgIC8vIEFORFJPSURfQ09ERUMyX01BUFBFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2U2ZTIxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw3OSBAQAorY2NfdGVzdCB7CisgICAgbmFtZTogImNvZGVjMl9jb3JlX3BhcmFtX3Rlc3QiLAorCisgICAgc3JjczogWworICAgICAgICAiQzJQYXJhbV90ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmNvZGVjMl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgLy8gcGFyYW0gdGVzdHMgbXVzdCBub3QgZGVwZW5kIG9uIGFueSBjb2RlYzIgbGlicmFyaWVzIGFzIGFsbCBwYXJhbXMgc2hvdWxkIGJlIHRlbXBsYXRlZAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogImNvZGVjMl92bmRrX3Rlc3QiLAorCisgICAgc3JjczogWworICAgICAgICAiQzJfdGVzdC5jcHAiLAorICAgICAgICAiQzJTYW1wbGVDb21wb25lbnRfdGVzdC5jcHAiLAorICAgICAgICAiQzJVdGlsVGVzdC5jcHAiLAorICAgICAgICAidm5kay9DMkJ1ZmZlclRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzIiLAorICAgICAgICAibGliY29kZWMyX3ZuZGsiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKK30KKworY2NfdGVzdCB7CisgICAgbmFtZTogImNvZGVjMl92bmRrX2ludGVyZmFjZV90ZXN0IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkMyQ29tcG9uZW50SW50ZXJmYWNlX3Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliY29kZWMyIiwKKyAgICAgICAgImxpYmNvZGVjMl92bmRrIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3Rlc3RzL0MyQ29tcG9uZW50SW50ZXJmYWNlX3Rlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyQ29tcG9uZW50SW50ZXJmYWNlX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZjczM2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJDb21wb25lbnRJbnRlcmZhY2VfdGVzdC5jcHAKQEAgLTAsMCArMSw3MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQzJDb21wb25lbnRJbnRlcmZhY2VfdGVzdCIKKworI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorI2luY2x1ZGUgPEMyUGFyYW0uaD4KKworI2lmICFkZWZpbmVkKFVOVVNFRCkKKyNkZWZpbmUgVU5VU0VEKGV4cHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgKHZvaWQpKGV4cHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8vIWRlZmluZWQoVU5VU0VEKQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdGQ6OnVuaXF1ZV9wdHI8VD4gYWxsb2NfdW5pcXVlX2NzdHIoY29uc3QgY2hhciAqY3N0cikgeworICAgIHNpemVfdCBsZW4gPSBzdHJsZW4oY3N0cik7CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHB0ciA9IFQ6OkFsbG9jVW5pcXVlKGxlbik7CisgICAgbWVtY3B5KHB0ci0+bS52YWx1ZSwgY3N0ciwgbGVuKTsKKyAgICByZXR1cm4gcHRyOworfQorCitjbGFzcyBDMkNvbXBJbnRmVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHJvdGVjdGVkOgorICAgIEMyQ29tcEludGZUZXN0KCkge30KKyAgICB+QzJDb21wSW50ZlRlc3QoKSBvdmVycmlkZSB7fQorCisgICAgdm9pZCBzZXRDb21wb25lbnQoc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmKSB7CisgICAgICAgIG1JbnRmID0gaW50ZjsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0UmVzdWx0cygpIHsKKyAgICAgICAgbUludGYgPSBudWxscHRyOworICAgICAgICBtUGFyYW1SZXN1bHRzLmNsZWFyKCk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgdGVzdFVuc3VwcG9ydGVkUGFyYW0oKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHRlc3RTdXBwb3J0ZWRQYXJhbSgpOworCisgICAgLy8gdGVzdFJlYWRPbmx5UGFyYW0oKSBhbmQgdGVzdFdyaXRhYmxlUGFyYW0oKSBhcmUgdGhlIG1haW4gZnVuY3Rpb25zIGZvciB0ZXN0aW5nIGEgcGFyYW1ldGVyLgorICAgIC8vIEEgY2FsbGVyIHNob3VsZCBmaW5kIG91dCBpZiBhIHRlc3RlZCBwYXJhbWV0ZXIgaXMgcmVhZC1vbmx5IG9yIHdyaXRhYmxlIGJlZm9yZSBjYWxsaW5nIHRoZW0KKyAgICAvLyBhbmQgaXQgbXVzdCBjYWxsIG9uZSBvZiB0aGUgY29ycmVzcG9uZGVkIHRoZW0uCisKKyAgICAvLyBJZiBhIHBhcmFtZXRlciBpcyByZWFkLW9ubHkgdGhpcyBpcyBjYWxsZWQuCisgICAgLy8gVGVzdCByZWFkLW9ubHkgcGFyYW1ldGVyIHxwcmVQYXJhbXwuIFRoZSB0ZXN0IGV4cGVjdHMgZmFpbHVyZSB3aGlsZSBjb25maWcoKSB3aXRoIHxuZXdQYXJhbXwsCisgICAgLy8gYW5kIG1ha2Ugc3VyZSB8cHJlUGFyYW18IHN0YXkgdW5jaGFuZ2VkLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHZvaWQgdGVzdFJlYWRPbmx5UGFyYW0oY29uc3QgVCAmcHJlUGFyYW0sIGNvbnN0IFQgJm5ld1BhcmFtKTsKKworICAgIC8vIElmIGEgcGFyYW1ldGVyIGlzIHdyaXRhYmxlIHRoaXMgaXMgY2FsbGVkLgorICAgIC8vIFRlc3Qgb25lIGZpbGVkIHx3cml0YWJsZUZpZWxkfCBmb3IgZ2l2ZW4gd3JpdGFibGUgcGFyYW1ldGVyIHxwYXJhbXwuCisgICAgLy8gfHZhbGlkVmFsdWVzfCBjb250YWlucyBhbGwgdmFsdWVzIG9idGFpbmVkIGZyb20gcXVlcnlTdXBwb3J0ZWRWYWx1ZXMoKSBmb3IgfHdyaXRhYmxlRmllbGR8LgorICAgIC8vIFRoZSB0ZXN0IGNoZWNrcyB2YWxpZGl0eSBmb3IgY29uZmlnKCkgd2l0aCBlYWNoIHZhbHVlLCBhbmQgbWFrZSBzdXJlIHZhbHVlcyBhcmUgY29uZmlnLWVkCisgICAgLy8gYnkgcXVlcnkoKSB0aGVtIG91dC4gfGludmFsaWRWYWx1ZXN8IGNvbnRhaW5zIHNvbWUgdmFsdWVzIHdoaWNoIGFyZSBub3QgaW4gfHZhbGlkVmFsdWVzfC4KKyAgICAvLyBUaGUgdGVzdCBleHBlY3RzIEMyX0JBRF9WQUxVRSB3aGlsZSBjb25maWcoKSB3aXRoIHRoZXNlIHZhbHVlcywKKyAgICAvLyBhbmQgfHBhcmFtfCBzaG91bGQgc3RheSB1bmNoYW5nZWQuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFRQYXJhbSwgdHlwZW5hbWUgVFJlYWxGaWVsZCwgdHlwZW5hbWUgVEZpZWxkPgorICAgIHZvaWQgdGVzdFdyaXRhYmxlUGFyYW0oVFBhcmFtICpjb25zdCBwYXJhbSwgVFJlYWxGaWVsZCAqY29uc3Qgd3JpdGFibGVGaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFRGaWVsZD4gJnZhbGlkVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8VEZpZWxkPiAmaW52YWxpZFZhbHVlcyk7CisKKyAgICAvLyBUZXN0IGFsbCB0aGUgZGVmaW5lZCBwYXJhbWV0ZXJzIGluIEMyUGFyYW0uaC4KKyAgICB2b2lkIHRlc3RNYWluKHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gaW50ZiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZjb21wb25lbnROYW1lKTsKKworICAgIC8vIENoZWNrIHBlcm1pc3Npb24gb2YgcGFyYW1ldGVyIHR5cGUgfFR8IGZvciB0ZXN0aW5nIGludGVyZmFjZS4KKyAgICAvLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgZmlyc3Qgb2YgdGhlIHRlc3RpbmcgcGVyIHBhcmFtZXRlciB0eXBlLAorICAgIC8vIHRoZXJlZm9yZSBkaWZmZXJlbnQgdGVzdGluZyBwcm9jZXNzIGlzIGFwcGxpZWQgYWNjb3JkaW5nIHRvIHRoZSBwZXJtaXNzaW9uIHR5cGUuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgdm9pZCBjaGVja1BhcmFtUGVybWlzc2lvbigKKyAgICAgICAgICAgIGludCAqY29uc3Qgd3JpdGFibGUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAmc3VwcG9ydGVkUGFyYW1zKTsKKworcHJpdmF0ZToKKyAgICBlbnVtIFBhcmFtUGVybWlzc2lvbiA6IGludCB7CisgICAgICAgIFdSSVRBQkxFLAorICAgICAgICBSRUFET05MWSwKKyAgICAgICAgVU5TVVBQT1JURUQsCisgICAgfTsKKworICAgIHN0cnVjdCBwYXJhbVRlc3RJbmZvIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICAgICAgaW50IHJlc3VsdDsKKyAgICAgICAgcGFyYW1UZXN0SW5mbyhjb25zdCBjaGFyICpuYW1lXywgaW50IHJlc3VsdF8pCisgICAgICAgICAgICA6IG5hbWUobmFtZV8pLCByZXN1bHQocmVzdWx0Xykge30KKyAgICB9OworCisgICAgLy8gcXVlcnlPblN0YWNrKCkgYW5kIHF1ZXJ5b25IZWFwKCkgYm90aCBjYWxsIGFuIGludGVyZmFjZSdzIHF1ZXJ5X3ZiKCkgYW5kCisgICAgLy8gY2hlY2sgaWYgYSBjb21wb25lbnQgaGFzIGEgcGFyYW1ldGVyIHdob3NlIHR5cGUgaXMgfFR8LgorICAgIC8vIElmIGEgY29tcG9uZW50IGhhcywgdGhlIHZhbHVlIHNob3VsZCBiZSBjb3BpZWQgaW50byBhbiBhcmd1bWVudCwgdGhhdCBpcworICAgIC8vIHxwfCBpbiBxdWVyeU9uU3RhY2soKSBhbmQgfGhlYXBQYXJhbXN8IGluIHF1ZXJ5T25IZWFwKCkuCisgICAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyBjMl9zdGF0dXNfdCAoZS5nLiBDMl9PSykuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGMyX3N0YXR1c190IHF1ZXJ5T25TdGFjayhUICpjb25zdCBwKTsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIGMyX3N0YXR1c190IHF1ZXJ5T25IZWFwKGNvbnN0IFQgJnAsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgaGVhcFBhcmFtcyk7CisKKyAgICAvLyBHZXQgYSB2YWx1ZSB3aG9zZSB0eXBlIGlzIHxUfCBpbiBhIGNvbXBvbmVudC4gVGhlIHZhbHVlIGlzIGNvcGllZCB0byB8cGFyYW18LgorICAgIC8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBvbmx5IGlmIGEgY29tcG9uZW50IGhhcyB0aGUgcGFyYW1ldGVyLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIGdldFZhbHVlKFQgKmNvbnN0IHBhcmFtKTsKKworICAgIC8vIENoZWNrIGlmIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZSBpbiBjb21wb25lbnQgaXMgZXF1YWwgdG8gfGV4cGVjdGVkfCBhbmQKKyAgICAvLyBxdWVyeU9uU3RhY2soKSBhbmQgcXVlcnlPbkhlYXAoKSBhcmUgc3VjY2VlZGVkLiBXaGVuIHRoaXMgZnVuY3Rpb24gY2FsbGVkLAorICAgIC8vIGl0IHNob3VsZCBiZSBndWFyYW50ZWVkIGEgY29tcG9uZW50IGhhcyB0aGUgcGFyYW1ldGVyLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHF1ZXJ5UGFyYW1Bc0V4cGVjdGVkKGNvbnN0IFQgJmV4cGVjdGVkKTsKKworICAgIC8vIFRlc3QgaWYgcXVlcnkgZnVuY3Rpb25zIHdvcmtzIGNvcnJlY3RseSBmb3Igc3VwcG9ydGVkIHBhcmFtZXRlcnMuCisgICAgLy8gIlN1cHBvcnQiIG1lYW5zIGhlcmUgYSBjb21wb25lbnQgaGFzIHRoZSBwYXJhbWV0ZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgcXVlcnlTdXBwb3J0ZWRQYXJhbSgpOworCisgICAgLy8gVGVzdCBxdWVyeSBmdW5jdGlvbnMgd29ya3MgY29ycmVjdGx5IGZvciB1bnN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICAgIC8vICJVbnN1cHBvcnQiIG1lYW5zIGhlcmUgYSBjb21wb25lbnQgZG9lc24ndCBoYXZlIHRoZSBwYXJhbWV0ZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgcXVlcnlVbnN1cHBvcnRlZFBhcmFtKCk7CisKKyAgICAvLyBFeGVjdXRlIGFuIGludGVyZmFjZSdzIGNvbmZpZ192YigpLiB8VHwgaXMgYSBzaW5nbGUgcGFyYW1ldGVyIHR5cGUsIG5vdCBzdGQ6OnZlY3Rvci4KKyAgICAvLyBjb25maWcoKSBjcmVhdGVzIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4ge3B9IGFuZCBwYXNzZXMgaXQgdG8gY29uZmlnX3ZiKCkuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgYzJfc3RhdHVzX3QKKyAgICBjb25maWcoVCAqY29uc3QgcCwKKyAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcyk7CisKKyAgICAvLyBUZXN0IGlmIGNvbmZpZyB3b3JrcyBjb3JyZWN0bHkgZm9yIHJlYWQtb25seSBwYXJhbWV0ZXJzLgorICAgIC8vIEJlY2F1c2UgdGhlIGZhaWx1cmUgb2YgY29uZmlnKCkgaXMgYXNzdW1lZCwgfG5ld1BhcmFtfCBkb2Vzbid0IG1hdHRlci4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBjb25maWdSZWFkT25seVBhcmFtKGNvbnN0IFQgJm5ld1BhcmFtKTsKKworICAgIC8vIFRlc3QgaWYgY29uZmlnIHdvcmtzIGNvcnJlY3RseSBmb3Igd3JpdGFibGUgcGFyYW1ldGVycy4KKyAgICAvLyBUaGlzIGNoYW5nZXMgdGhlIHBhcmFtZXRlcidzIHZhbHVlIHRvIHxuZXdQYXJhbXwuCisgICAgLy8gfHN0Q29uZmlnfCBpcyBhIHJldHVybiB2YWx1ZSBvZiBjb25maWcoKS4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBjb25maWdXcml0YWJsZVBhcmFtVmFsaWRWYWx1ZShjb25zdCBUICZuZXdQYXJhbSwgYzJfc3RhdHVzX3QgKnN0Q29uZmlnKTsKKworICAgIC8vIFRlc3QgaWYgY29uZmlnIHdvcmtzIGNvcnJlY3RseSBpbiB0aGUgY2FzZSBhbiBpbnZhbGlkIHZhbHVlIHxuZXdQYXJhbXwgaXMgdHJpZWQgdG8gd3JpdGUKKyAgICAvLyB0byBhbiB3cml0YWJsZSBwYXJhbWV0ZXIuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgY29uZmlnV3JpdGFibGVQYXJhbUludmFsaWRWYWx1ZShjb25zdCBUICZuZXdQYXJhbSk7CisKKyAgICAvLyBDcmVhdGUgdmFsdWVzIGZvciB0ZXN0aW5nIGZyb20gfHZhbGlkVmFsdWVJbmZvc3wuIFRoZSB2YWx1ZXMgYXJlIHJldHVybmVkIGFzIGFyZ3VtZW50cy4KKyAgICAvLyB8dmFsaWRWYWx1ZXN8IDogdmFsaWQgdmFsdWVzLCB3aGljaCBjYW4gYmUgd3JpdHRlbiBmb3IgdGhlIHBhcmFtZXRlci4KKyAgICAvLyB8SW52YWxpZFZhbHVlc3wgOiBpbnZhbGlkIHZhbHVlcywgd2hpY2ggY2Fubm90IGJlIHdyaXR0ZW4gZm9yIHRoZSBwYXJhbWV0ZXIuCisgICAgLy8gICAgICAgICAgICAgICAgICAgY29uZmlnKCkgc2hvdWxkIGJlIGZhaWxlZCBpZiB0aGVzZSB2YWx1ZXMgYXJlIHVzZWQgYXMgbmV3IHZhbHVlcy4KKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgb25seSBmb3Igd3JpdGFibGUgYW5kIHN1cHBvcnRlZCBwYXJhbWV0ZXJzLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBURmllbGQ+CisgICAgdm9pZCBnZXRUZXN0VmFsdWVzKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbGlkVmFsdWVJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VEZpZWxkPiAqY29uc3QgdmFsaWRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFRGaWVsZD4gKmNvbnN0IGludmFsaWRWYWx1ZXMpOworCisgICAgLy8gT3V0cHV0IHRoZSBzdW1tYXJ5IG9mIHRlc3QgcmVzdWx0cy4gQ2F0ZWdvcml6ZXMgcGFyYW1ldGVycyB3aXRoIHRoZWlyIGNvbmZpZ3VyYXRpb24uCisgICAgdm9pZCBvdXRwdXRSZXN1bHRzKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gbUludGY7CisgICAgc3RkOjp2ZWN0b3I8cGFyYW1UZXN0SW5mbz4gbVBhcmFtUmVzdWx0czsKKyAgICBzdGQ6OnN0cmluZyBtQ3VycmVudFBhcmFtTmFtZTsKK307CisKKy8vIGZhY3RvcnkgZnVuY3Rpb24KKy8vIFRPRE8oaGlyb2gpOiBBZGQgZmFjdG9yeSBmdW5jdGlvbnMgZm9yIG90aGVyIHR5cGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0ZDo6dW5pcXVlX3B0cjxUPiBtYWtlUGFyYW0oKSB7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8VD4oKTsKK30KKwordGVtcGxhdGUgPD4gc3RkOjp1bmlxdWVfcHRyPEMyUG9ydE1lZGlhVHlwZVNldHRpbmc6OmlucHV0PiBtYWtlUGFyYW0oKSB7CisgICAgLy8gVE9ETyhoaXJvaCk6IFNldCBtb3JlIHByZWNpc2UgbGVuZ3RoLgorICAgIHJldHVybiBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6QWxsb2NVbmlxdWUoMTAwKTsKK30KKworI2RlZmluZSBUUkFDRURfRkFJTFVSRShmdW5jKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU0NPUEVEX1RSQUNFKG1DdXJyZW50UGFyYW1OYW1lKTsgICAgICAgICAgICAgXAorICAgICAgICBmdW5jOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICg6OnRlc3Rpbmc6OlRlc3Q6Okhhc0ZhdGFsRmFpbHVyZSgpKSB7ICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoZmFsc2UpCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjMl9zdGF0dXNfdCBDMkNvbXBJbnRmVGVzdDo6cXVlcnlPblN0YWNrKFQgKmNvbnN0IHApIHsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gc3RhY2tQYXJhbXN7cH07CisgICAgcmV0dXJuIG1JbnRmLT5xdWVyeV92YihzdGFja1BhcmFtcywge30sIEMyX0RPTlRfQkxPQ0ssIG51bGxwdHIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2MyX3N0YXR1c190IEMyQ29tcEludGZUZXN0OjpxdWVyeU9uSGVhcCgKKyAgICAgICAgY29uc3QgVCAmcCwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiAqY29uc3QgaGVhcFBhcmFtcykgeworICAgIHVpbnQzMl90IGluZGV4ID0gcC5pbmRleCgpICYgfjB4MDNGRTAwMDA7CisgICAgaWYgKHAuZm9yU3RyZWFtKCkpIHsKKyAgICAgICAgaW5kZXggfD0gKChwLnN0cmVhbSgpIDw8IDE3KSAmIDB4MDFGRTAwMDApIHwgMHgwMjAwMDAwMDsKKyAgICB9CisgICAgcmV0dXJuIG1JbnRmLT5xdWVyeV92Yih7fSwge2luZGV4fSwgQzJfRE9OVF9CTE9DSywgaGVhcFBhcmFtcyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIEMyQ29tcEludGZUZXN0OjpnZXRWYWx1ZShUICpjb25zdCBwYXJhbSkgeworICAgIC8vIFdoZW4gZ2V0VmFsdWUoKSBpcyBjYWxsZWQsIGEgY29tcG9uZW50IGhhcyB0byBoYXZlIHRoZSBwYXJhbWV0ZXIuCisgICAgQVNTRVJUX0VRKEMyX09LLCBxdWVyeU9uU3RhY2socGFyYW0pKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEMyQ29tcEludGZUZXN0OjpxdWVyeVBhcmFtQXNFeHBlY3RlZChjb25zdCBUICZleHBlY3RlZCkgeworICAgIC8vIFRPRE8oaGlyb2gpOiBEb24ndCBjcmVhdGUgcGFyYW0gb24gc3RhY2sgYW5kIGNhbGwgcXVlcnlPblN0YWNrIGZvciBmbGV4IHBhcmFtcy4KKyAgICAvLyBOb3RlIHRoYXQgYWxsIHRoZSBjdXJyZW50IHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFyZSBub24tZmxleCBwYXJhbXMuCisgICAgVCBzdGFjazsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcEhlYXAgPSBtYWtlUGFyYW08VD4oKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGhlYXBQYXJhbXM7CisKKyAgICBBU1NFUlRfRVEoQzJfT0ssIHF1ZXJ5T25TdGFjaygmc3RhY2spKTsKKworICAgIC8vIHxzdGFja3wgaXMgYSBwYXJhbWV0ZXIgdmFsdWUuIFRoZSBwYXJhbWV0ZXIgc2l6ZSBzaG91bGRuJ3QgYmUgMC4KKyAgICBFWFBFQ1RfTkUoMHUsIHN0YWNrLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKHN0YWNrLCBleHBlY3RlZCk7CisKKyAgICBBU1NFUlRfRVEoQzJfT0ssIHF1ZXJ5T25IZWFwKCpwSGVhcCwgJmhlYXBQYXJhbXMpKTsKKworICAgIC8vIHwqaGVhcFBhcmFtc1swXXwgaXMgYSBwYXJhbWV0ZXIgdmFsdWUuIFRoZSBzaXplIG9mIHxoZWFwUGFyYW1zfCBoYXMgdG8gYmUgb25lLgorICAgIEFTU0VSVF9FUSgxdSwgaGVhcFBhcmFtcy5zaXplKCkpOworICAgIEVYUEVDVF9UUlVFKGhlYXBQYXJhbXNbMF0pOworICAgIEVYUEVDVF9FUSgqaGVhcFBhcmFtc1swXSwgZXhwZWN0ZWQpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBDMkNvbXBJbnRmVGVzdDo6cXVlcnlTdXBwb3J0ZWRQYXJhbSgpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcGFyYW0gPSBtYWtlUGFyYW08VD4oKTsKKyAgICAvLyBUaGUgY3VycmVudCBwYXJhbWV0ZXIncyB2YWx1ZSBpcyBhY3F1aXJlZCBieSBnZXRWYWx1ZSgpLCB3aGljaCBzaG91bGQgYmUgc3VjY2VlZGVkLgorICAgIGdldFZhbHVlKHBhcmFtLmdldCgpKTsKKyAgICBxdWVyeVBhcmFtQXNFeHBlY3RlZCgqcGFyYW0pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBDMkNvbXBJbnRmVGVzdDo6cXVlcnlVbnN1cHBvcnRlZFBhcmFtKCkgeworICAgIC8vIFRPRE8oaGlyb2gpOiBEb24ndCBjcmVhdGUgcGFyYW0gb24gc3RhY2sgYW5kIGNhbGwgcXVlcnlPblN0YWNrIGZvciBmbGV4IHBhcmFtcy4KKyAgICAvLyBOb3RlIHRoYXQgYWxsIHRoZSBjdXJyZW50IHN1cHBvcnRlZCBwYXJhbWV0ZXJzIGFyZSBub24tZmxleCBwYXJhbXMuCisgICAgVCBzdGFjazsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcEhlYXAgPSBtYWtlUGFyYW08VD4oKTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+IGhlYXBQYXJhbXM7CisgICAgLy8gSWYgYSBjb21wb25lbnQgZG9lc24ndCBoYXZlIHRoZSBwYXJhbWV0ZXIsIHF1ZXJ5T25TdGFjaygpIGFuZCBxdWVyeU9uSGVhcCgpCisgICAgLy8gc2hvdWxkIHJldHVybiBDMl9CQURfSU5ERVguCisgICAgQVNTRVJUX0VRKEMyX0JBRF9JTkRFWCwgcXVlcnlPblN0YWNrKCZzdGFjaykpOworICAgIEVYUEVDVF9GQUxTRShzdGFjayk7CisgICAgQVNTRVJUX0VRKEMyX0JBRF9JTkRFWCwgcXVlcnlPbkhlYXAoKnBIZWFwLCAmaGVhcFBhcmFtcykpOworICAgIEVYUEVDVF9FUSgwdSwgaGVhcFBhcmFtcy5zaXplKCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2MyX3N0YXR1c190IEMyQ29tcEludGZUZXN0Ojpjb25maWcoCisgICAgICAgIFQgKmNvbnN0IHAsIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiAqY29uc3QgZmFpbHVyZXMpIHsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1ze3B9OworICAgIHJldHVybiBtSW50Zi0+Y29uZmlnX3ZiKHBhcmFtcywgQzJfRE9OVF9CTE9DSywgZmFpbHVyZXMpOworfQorCisvLyBDcmVhdGUgYSBuZXcgcGFyYW1ldGVyIGNvcGllZCBmcm9tIHxwfC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGQ6OnVuaXF1ZV9wdHI8VD4gbWFrZVBhcmFtRnJvbShjb25zdCBUICZwKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHJldFAgPSBtYWtlUGFyYW08VD4oKTsKKyAgICBFWFBFQ1RfVFJVRShyZXRQLT51cGRhdGVGcm9tKHApKTsKKyAgICBFWFBFQ1RfVFJVRShtZW1jbXAocmV0UC5nZXQoKSwgJnAsIHNpemVvZihUKSkgPT0gMCk7CisgICAgcmV0dXJuIHJldFA7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6Y29uZmlnUmVhZE9ubHlQYXJhbShjb25zdCBUICZuZXdQYXJhbSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxUPiBwID0gbWFrZVBhcmFtRnJvbShuZXdQYXJhbSk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gcGFyYW1ze3AuZ2V0KCl9OworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKworICAgIC8vIGNvbmZpZ192YiBzaG91bGQgYmUgZmFpbGVkIGJlY2F1c2UgYSBwYXJhbWV0ZXIgaXMgcmVhZC1vbmx5LgorICAgIEFTU0VSVF9FUShDMl9CQURfVkFMVUUsIG1JbnRmLT5jb25maWdfdmIocGFyYW1zLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpKTsKKyAgICBBU1NFUlRfRVEoMXUsIGZhaWx1cmVzLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKEMyU2V0dGluZ1Jlc3VsdDo6UkVBRF9PTkxZLCBmYWlsdXJlc1swXS0+ZmFpbHVyZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6Y29uZmlnV3JpdGFibGVQYXJhbVZhbGlkVmFsdWUoY29uc3QgVCAmbmV3UGFyYW0sIGMyX3N0YXR1c190ICpjb25maWdSZXN1bHQpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcCA9IG1ha2VQYXJhbUZyb20obmV3UGFyYW0pOworCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+IHBhcmFtc3twLmdldCgpfTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgLy8gSW4gbW9zdCBjYXNlcywgY29uZmlnX3ZiIHJldHVybiBDMl9PSyBhbmQgdGhlIHBhcmFtZXRlcidzIHZhbHVlIHNob3VsZCBiZSBjaGFuZ2VkCisgICAgLy8gdG8gfG5ld1BhcmFtfCwgd2hpY2ggaXMgY29uZmlybWVkIGluIGEgY2FsbGVyIG9mIGNvbmZpZ1dyaXRhYmxlUGFyYW1WYWx1ZVZhbHVlKCkuCisgICAgLy8gSG93ZXZlciwgdGhpcyBjYW4gcmV0dXJuIH5+fn4gYW5kIHRoZSBwYXJhbWV0ZXIncyB2YWx1ZXMgaXMgbm90IGNoYW5nZWQsCisgICAgLy8gYmVjYXVzZSB0aGVyZSBtYXkgYmUgZGVwZW5kZW50IGxpbWl0YXRpb25zIGJldHdlZW4gZmllbGRzIG9yIGJldHdlZW4gcGFyYW1ldGVycy4KKyAgICAvLyBUT0RPKGhpcm9oKTogSSBoYXZlIHRvIGZpbGwgdGhlIHJldHVybiB2YWx1ZS4gQ29tbWVudHMgaW4gQzJDb21wb25lbnQuaCBkb2Vzbid0IG1lbnRpb24KKyAgICAvLyBhYm91dCB0aGUgcmV0dXJuIHZhbHVlIHdoZW4gY29uZmxpY3QgaGFwcGVucy4gSSBzZXQgQzJfQkFEX1ZBTFVFIHRvIGl0IHRlbXBvcmFyaWx5IG5vdy4KKyAgICBjMl9zdGF0dXNfdCBzdENvbmZpZyA9IG1JbnRmLT5jb25maWdfdmIocGFyYW1zLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIGlmIChzdENvbmZpZyA9PSBDMl9PSykgeworICAgICAgICBFWFBFQ1RfRVEoMHUsIGZhaWx1cmVzLnNpemUoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX0VRKEMyX0JBRF9WQUxVRSwgc3RDb25maWcpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZhaWx1cmVzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMlNldHRpbmdSZXN1bHQ6OkNPTkZMSUNULCBmYWlsdXJlc1swXS0+ZmFpbHVyZSk7CisgICAgfQorICAgICpjb25maWdSZXN1bHQgPSBzdENvbmZpZzsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEMyQ29tcEludGZUZXN0Ojpjb25maWdXcml0YWJsZVBhcmFtSW52YWxpZFZhbHVlKGNvbnN0IFQgJm5ld1BhcmFtKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFQ+IHAgPSBtYWtlUGFyYW1Gcm9tKG5ld1BhcmFtKTsKKworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBwYXJhbXN7cC5nZXQoKX07CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIC8vIEFsdGhvdWdoIGEgcGFyYW1ldGVyIGlzIHdyaXRhYmxlLCBjb25maWdfdmIgc2hvdWxkIGJlIGZhaWxlZCwKKyAgICAvLyBiZWNhdXNlIGEgbmV3IHZhbHVlIGlzIGludmFsaWQuCisgICAgQVNTRVJUX0VRKEMyX0JBRF9WQUxVRSwgbUludGYtPmNvbmZpZ192YihwYXJhbXMsIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcykpOworICAgIEFTU0VSVF9FUSgxdSwgZmFpbHVyZXMuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoQzJTZXR0aW5nUmVzdWx0OjpCQURfVkFMVUUsIGZhaWx1cmVzWzBdLT5mYWlsdXJlKTsKK30KKworLy8gVGhlcmUgaXMgb25seSB1c2VkIGVudW0gdHlwZSBmb3IgdGhlIGZpZWxkIHR5cGUsIHRoYXQgaXMgQzJDb21wb25lbnQ6OmRvbWFpbl90LgorLy8gSWYgYW5vdGhlciBmaWVsZCB0eXBlIGlzIGFkZGVkLCBpdCBpcyBuZWNlc3NhcnkgdG8gYWRkIGZ1bmN0aW9uIGZvciB0aGF0LgordGVtcGxhdGUgPD4KK3ZvaWQgQzJDb21wSW50ZlRlc3Q6OmdldFRlc3RWYWx1ZXMoCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbGlkVmFsdWVJbmZvcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OmRvbWFpbl90PiAqY29uc3QgdmFsaWRWYWx1ZXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyQ29tcG9uZW50Ojpkb21haW5fdD4gKmNvbnN0IGludmFsaWRWYWx1ZXMpIHsKKyAgICBVTlVTRUQodmFsaWRWYWx1ZUluZm9zKTsKKyAgICB2YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKEMyQ29tcG9uZW50OjpET01BSU5fVklERU8pOworICAgIHZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTyk7CisgICAgdmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSKTsKKworICAgIC8vIFRoZXJlIGlzIG5vIGludmFsaWQgdmFsdWUuCisgICAgVU5VU0VEKGludmFsaWRWYWx1ZXMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVEZpZWxkPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6Z2V0VGVzdFZhbHVlcygKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsaWRWYWx1ZUluZm9zLAorICAgICAgICBzdGQ6OnZlY3RvcjxURmllbGQ+ICpjb25zdCB2YWxpZFZhbHVlcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8VEZpZWxkPiAqY29uc3QgaW52YWxpZFZhbHVlcykgeworICAgIHVzaW5nIFRTdG9yYWdlID0gdHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTxURmllbGQ+Ojp0eXBlOworCisgICAgLy8gVGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIHJlcHJlc2VudGVkIGJ5IEMyVmFsdWVzLiBDMlZhbHVlOjpQcmltaXRpdmUgbmVlZHMgdG8KKyAgICAvLyBiZSB0cmFuc2Zvcm1lZCB0byBhIHByaW1pdGl2ZSB2YWx1ZS4gVGhpcyBmdW5jdGlvbiBpcyBvbmUgdG8gZG8gdGhhdC4KKyAgICBhdXRvIHByaW0yVmFsdWUgPSBbXShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnByaW0pIC0+IFRGaWVsZCB7CisgICAgICAgIHJldHVybiAoVEZpZWxkKXByaW0ucmVmPFRTdG9yYWdlPigpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxUU3RvcmFnZSwgaW50MzJfdD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPFRTdG9yYWdlLCB1aW50MzJfdD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPFRTdG9yYWdlLCBpbnQ2NF90Pjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VFN0b3JhZ2UsIHVpbnQ2NF90Pjo6dmFsdWUgfHwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VFN0b3JhZ2UsIGZsb2F0Pjo6dmFsdWUsICJJbnZhbGlkIFRGaWVsZCB0eXBlLiIpOworICAgIH07CisKKyAgICAvLyBUaGUgc2l6ZSBvZiB2YWxpZFZhbHVlSW5mb3MgaXMgb25lLgorICAgIGNvbnN0IGF1dG8gJmMyRlNWID0gdmFsaWRWYWx1ZUluZm9zOworCisgICAgc3dpdGNoIChjMkZTVi50eXBlKSB7CisgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3Q6OkVNUFRZOiB7CisgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQoMCkpOworICAgICAgICAvLyBUT0RPKGhpcm9oKSA6IFNob3VsZCBvdGhlciBpbnZhbGlkIHZhbHVlcyBiZSB0ZXN0ZWQ/CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OnR5cGVfdDo6UkFOR0U6IHsKKyAgICAgICAgY29uc3QgYXV0byAmcmFuZ2UgPSBjMkZTVi5yYW5nZTsKKyAgICAgICAgYXV0byBybWluID0gcHJpbTJWYWx1ZShyYW5nZS5taW4pOworICAgICAgICBhdXRvIHJtYXggPSBwcmltMlZhbHVlKHJhbmdlLm1heCk7CisgICAgICAgIGF1dG8gcnN0ZXAgPSBwcmltMlZhbHVlKHJhbmdlLnN0ZXApOworCisgICAgICAgIEFTU0VSVF9MRShybWluLCBybWF4KTsKKworICAgICAgICBpZiAocnN0ZXAgIT0gMCkgeworICAgICAgICAgICAgLy8gSW5jcmVhc2UgbGluZWFyCisgICAgICAgICAgICBmb3IgKGF1dG8gdiA9IHJtaW47IHYgPD0gcm1heDsgdiA9IFRGaWVsZCh2ICsgcnN0ZXApKSB7CisgICAgICAgICAgICAgICAgdmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayh2KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChybWluID4gc3RkOjpudW1lcmljX2xpbWl0czxURmllbGQ+OjptaW4oKSkgeworICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQocm1pbiAtIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChybWF4IDwgc3RkOjpudW1lcmljX2xpbWl0czxURmllbGQ+OjptYXgoKSkgeworICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQocm1heCArIDEpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBOID0gdmFsaWRWYWx1ZXMtPnNpemUoKTsKKyAgICAgICAgICAgIGlmIChOID49IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjppc19zYW1lPFRGaWVsZCwgZmxvYXQ+Ojp2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKCh2YWxpZFZhbHVlcy0+YXQoMCkgKyB2YWxpZFZhbHVlcy0+YXQoMSkpIC8gMikpOworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKCh2YWxpZFZhbHVlcy0+YXQoTiAtIDIpICsgdmFsaWRWYWx1ZXMtPmF0KE4gLSAxKSkgLyAyKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJzdGVwID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKFRGaWVsZCh2YWxpZFZhbHVlcy0+YXQoMCkgKyAxKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKHZhbGlkVmFsdWVzLT5hdChOIC0gMSkgLSAxKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGVyZSBzaG91bGQgYmUgdHdvIGNhc2VzLCBleGNlcHQgbGluZWFyIGNhc2UuCisgICAgICAgICAgICAvLyAxLiBpbnRlZ2VyIGdlb21ldHJpYyBjYXNlCisgICAgICAgICAgICAvLyAyLiBmbG9hdCBnZW9tZXRyaWMgY2FzZQorCisgICAgICAgICAgICBhdXRvIG51bSA9IHByaW0yVmFsdWUocmFuZ2UubnVtKTsKKyAgICAgICAgICAgIGF1dG8gZGVub20gPSBwcmltMlZhbHVlKHJhbmdlLmRlbm9tKTsKKworICAgICAgICAgICAgLy8gSWYgYm90aCByYW5nZS5udW0gYW5kIHJhbmdlLmRlbm9tIGFyZSAxIGFuZCBzdGVwIGlzIDAsIHdlIHNob3VsZCB1c2UKKyAgICAgICAgICAgIC8vIFZBTFVFUywgc2hvdWxkbid0IHdlPworICAgICAgICAgICAgQVNTRVJUX0ZBTFNFKG51bSA9PSAxICYmIGRlbm9tID09IDEpOworCisgICAgICAgICAgICAvLyAobnVtIC8gZGVub20pIGlzIG5vdCBsZXNzIHRoYW4gMS4KKyAgICAgICAgICAgIEFTU0VSVF9GQUxTRShkZW5vbSA9PSAwKTsKKyAgICAgICAgICAgIEFTU0VSVF9MRShkZW5vbSwgbnVtKTsKKyAgICAgICAgICAgIGZvciAoYXV0byB2ID0gcm1pbjsgdiA8PSBybWF4OyB2ID0gVEZpZWxkKHYgKiBudW0gLyBkZW5vbSkpIHsKKyAgICAgICAgICAgICAgICB2YWxpZFZhbHVlcy0+ZW1wbGFjZV9iYWNrKHYpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAocm1pbiA+IHN0ZDo6bnVtZXJpY19saW1pdHM8VEZpZWxkPjo6bWluKCkpIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKHJtaW4gLSAxKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocm1heCA8IHN0ZDo6bnVtZXJpY19saW1pdHM8VEZpZWxkPjo6bWF4KCkpIHsKKyAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKHJtYXggKyAxKSk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGludCBOID0gdmFsaWRWYWx1ZXMtPnNpemUoKTsKKyAgICAgICAgICAgIGlmIChOID49IDIpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjppc19zYW1lPFRGaWVsZCwgZmxvYXQ+Ojp2YWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKCh2YWxpZFZhbHVlcy0+YXQoMCkgKyB2YWxpZFZhbHVlcy0+YXQoMSkpIC8gMikpOworICAgICAgICAgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKCh2YWxpZFZhbHVlcy0+YXQoTiAtIDIpICsgdmFsaWRWYWx1ZXMtPmF0KE4gLSAxKSkgLyAyKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkVmFsdWVzLT5hdCgxKSAtIHZhbGlkVmFsdWVzLT5hdCgwKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQodmFsaWRWYWx1ZXMtPmF0KDApICsgMSkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICh2YWxpZFZhbHVlcy0+YXQoTiAtIDEpIC0gdmFsaWRWYWx1ZXMtPmF0KE4gLSAyKSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQodmFsaWRWYWx1ZXMtPmF0KE4gLSAxKSAtIDEpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3Q6OlZBTFVFUzogeworICAgICAgICBmb3IgKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcHJpbSA6IGMyRlNWLnZhbHVlcykgeworICAgICAgICAgICAgdmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhwcmltMlZhbHVlKHByaW0pKTsKKyAgICAgICAgfQorICAgICAgICBhdXRvIG1pbnYgPSAqc3RkOjptaW5fZWxlbWVudCh2YWxpZFZhbHVlcy0+YmVnaW4oKSwgdmFsaWRWYWx1ZXMtPmVuZCgpKTsKKyAgICAgICAgYXV0byBtYXh2ID0gKnN0ZDo6bWF4X2VsZW1lbnQodmFsaWRWYWx1ZXMtPmJlZ2luKCksIHZhbGlkVmFsdWVzLT5lbmQoKSk7CisgICAgICAgIGlmIChtaW52IC0gMSA+IHN0ZDo6bnVtZXJpY19saW1pdHM8VEZpZWxkPjo6bWluKCkpIHsKKyAgICAgICAgICAgIGludmFsaWRWYWx1ZXMtPmVtcGxhY2VfYmFjayhURmllbGQobWludiAtIDEpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWF4diArIDEgPCBzdGQ6Om51bWVyaWNfbGltaXRzPFRGaWVsZD46Om1heCgpKSB7CisgICAgICAgICAgICBpbnZhbGlkVmFsdWVzLT5lbXBsYWNlX2JhY2soVEZpZWxkKG1heHYgKyAxKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90OjpGTEFHUzogeworICAgICAgICAvLyBUT0RPKGhpcm9oKSA6IEltcGxlbWVudCB0aGUgY2FzZSB0aGF0IHBhcmFtLnR5cGUgaXMgRkxBR1MuCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6dGVzdFJlYWRPbmx5UGFyYW0oY29uc3QgVCAmcHJlUGFyYW0sIGNvbnN0IFQgJm5ld1BhcmFtKSB7CisgICAgVFJBQ0VEX0ZBSUxVUkUoY29uZmlnUmVhZE9ubHlQYXJhbShuZXdQYXJhbSkpOworICAgIC8vIFBhcmFtZXRlciB2YWx1ZSBtdXN0IG5vdCBiZSBjaGFuZ2VkCisgICAgVFJBQ0VEX0ZBSUxVUkUocXVlcnlQYXJhbUFzRXhwZWN0ZWQocHJlUGFyYW0pKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFRQYXJhbSwgdHlwZW5hbWUgVFJlYWxGaWVsZCwgdHlwZW5hbWUgVEZpZWxkPgordm9pZCBDMkNvbXBJbnRmVGVzdDo6dGVzdFdyaXRhYmxlUGFyYW0oCisgICAgICAgIFRQYXJhbSAqY29uc3QgcGFyYW0sIFRSZWFsRmllbGQgKmNvbnN0IHdyaXRhYmxlRmllbGQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFRGaWVsZD4gJnZhbGlkVmFsdWVzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxURmllbGQ+ICZpbnZhbGlkVmFsdWVzKSB7CisgICAgYzJfc3RhdHVzX3Qgc3RDb25maWc7CisKKyAgICAvLyBHZXQgdGhlIHBhcmFtZXRlcidzIHZhbHVlIGluIHRoZSBiZWdpbm5pbmcgaW4gb3JkZXIgdG8gcmVzZXQgdGhlIHZhbHVlIGF0IHRoZSBlbmQuCisgICAgVFJBQ0VEX0ZBSUxVUkUoZ2V0VmFsdWUocGFyYW0pKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VFBhcmFtPiBkZWZhdWx0UGFyYW0gPSBtYWtlUGFyYW1Gcm9tKCpwYXJhbSk7CisKKyAgICAvLyBUZXN0IHZhbGlkIHZhbHVlcworICAgIGZvciAoY29uc3QgYXV0byAmdmFsIDogdmFsaWRWYWx1ZXMpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFRQYXJhbT4gcHJlUGFyYW0gPSBtYWtlUGFyYW1Gcm9tKCpwYXJhbSk7CisKKyAgICAgICAgLy8gUGFyYW0gaXMgdHJ5IHRvIGJlIGNoYW5nZWQKKyAgICAgICAgKndyaXRhYmxlRmllbGQgPSB2YWw7CisgICAgICAgIFRSQUNFRF9GQUlMVVJFKGNvbmZpZ1dyaXRhYmxlUGFyYW1WYWxpZFZhbHVlKCpwYXJhbSwgJnN0Q29uZmlnKSk7CisgICAgICAgIGlmIChzdENvbmZpZyA9PSBDMl9PSykgeworICAgICAgICAgICAgVFJBQ0VEX0ZBSUxVUkUocXVlcnlQYXJhbUFzRXhwZWN0ZWQoKnBhcmFtKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBQYXJhbSBpcyB1bmNoYW5nZWQgYmVjYXVzZSBhIGZpZWxkIHZhbHVlIGNvbmZsaWN0cyB3aXRoIG90aGVyIGZpZWxkIG9yIHBhcmFtZXRlci4KKyAgICAgICAgICAgIFRSQUNFRF9GQUlMVVJFKHF1ZXJ5UGFyYW1Bc0V4cGVjdGVkKCpwcmVQYXJhbSkpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gU3RvcmUgdGhlIGN1cnJlbnQgcGFyYW1ldGVyIGluIG9yZGVyIHRvIHRlc3QgfHBhcmFtfCBpcyB1bmNoYW5nZWQKKyAgICAvLyBhZnRlciB0cnlpbmcgdG8gd3JpdGUgYW4gaW52YWxpZCB2YWx1ZS4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VFBhcmFtPiBsYXN0VmFsaWRQYXJhbSA9IG1ha2VQYXJhbUZyb20oKnBhcmFtKTsKKworICAgIC8vIFRlc3QgaW52YWxpZCB2YWx1ZXMKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnZhbCA6IGludmFsaWRWYWx1ZXMpIHsKKyAgICAgICAgLy8gUGFyYW0gaXMgY2hhbmdlZAorICAgICAgICAqd3JpdGFibGVGaWVsZCA9IHZhbDsKKyAgICAgICAgVFJBQ0VEX0ZBSUxVUkUoY29uZmlnV3JpdGFibGVQYXJhbUludmFsaWRWYWx1ZSgqcGFyYW0pKTsKKyAgICAgICAgVFJBQ0VEX0ZBSUxVUkUocXVlcnlQYXJhbUFzRXhwZWN0ZWQoKmxhc3RWYWxpZFBhcmFtKSk7CisgICAgfQorICAgIC8vIFJlc2V0IHRoZSBwYXJhbWV0ZXIgYnkgY29uZmlnKCkuCisgICAgVFJBQ0VEX0ZBSUxVUkUoY29uZmlnV3JpdGFibGVQYXJhbVZhbGlkVmFsdWUoKmRlZmF1bHRQYXJhbSwgJnN0Q29uZmlnKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIEMyQ29tcEludGZUZXN0Ojp0ZXN0VW5zdXBwb3J0ZWRQYXJhbSgpIHsKKyAgICBUUkFDRURfRkFJTFVSRShxdWVyeVVuc3VwcG9ydGVkUGFyYW08VD4oKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIEMyQ29tcEludGZUZXN0Ojp0ZXN0U3VwcG9ydGVkUGFyYW0oKSB7CisgICAgVFJBQ0VEX0ZBSUxVUkUocXVlcnlTdXBwb3J0ZWRQYXJhbTxUPigpKTsKK30KKworYm9vbCBpc1N1cHBvcnRlZFBhcmFtKAorICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gJnNQYXJhbXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnBkIDogc1BhcmFtcykgeworICAgICAgICBpZiAocGFyYW0udHlwZSgpID09IHBkLT5pbmRleCgpLnR5cGUoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgQzJDb21wSW50ZlRlc3Q6OmNoZWNrUGFyYW1QZXJtaXNzaW9uKAorICAgIGludCAqY29uc3QgcmVzdWx0LAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICZzdXBwb3J0ZWRQYXJhbXMpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gcGFyYW0gPSBtYWtlUGFyYW08VD4oKTsKKworICAgIGlmICghaXNTdXBwb3J0ZWRQYXJhbSgqcGFyYW0sIHN1cHBvcnRlZFBhcmFtcykpIHsKKyAgICAgICAgLy8gSWYgYSBwYXJhbWV0ZXIgaXNuJ3Qgc3VwcG9ydGVkLCBpdCBqdXN0IGZpbmlzaCBhZnRlciBjYWxsaW5nIHRlc3RVbnN1cHBvcnRlZFBhcmFtKCkuCisgICAgICAgIHRlc3RVbnN1cHBvcnRlZFBhcmFtPFQ+KCk7CisgICAgICAgICpyZXN1bHQgPSBQYXJhbVBlcm1pc3Npb246OlVOU1VQUE9SVEVEOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdGVzdFN1cHBvcnRlZFBhcmFtPFQ+KCk7CisKKyAgICBUUkFDRURfRkFJTFVSRShnZXRWYWx1ZShwYXJhbS5nZXQoKSkpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiBmYWlsdXJlczsKKyAgICAvLyBDb25maWcgZG9lcyBub3QgY2hhbmdlIHRoZSBwYXJhbWV0ZXIsIGJlY2F1c2UgcGFyYW0gaXMgdGhlIHByZXNlbnQgcGFyYW0uCisgICAgLy8gVGhpcyBjb25maWcgaXMgZXhlY3V0ZWQgdG8gZmluZCBvdXQgaWYgYSBwYXJhbWV0ZXIgaXMgcmVhZC1vbmx5IG9yIHdyaXRhYmxlLgorICAgIGMyX3N0YXR1c190IHN0U3RhY2sgPSBjb25maWcocGFyYW0uZ2V0KCksICZmYWlsdXJlcyk7CisgICAgaWYgKHN0U3RhY2sgPT0gQzJfQkFEX1ZBTFVFKSB7CisgICAgICAgIC8vIFJlYWQtb25seQorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gbmV3UGFyYW0gPSBtYWtlUGFyYW08VD4oKTsKKyAgICAgICAgdGVzdFJlYWRPbmx5UGFyYW0oKnBhcmFtLCAqbmV3UGFyYW0pOworICAgICAgICAqcmVzdWx0ID0gUGFyYW1QZXJtaXNzaW9uOjpSRUFET05MWTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBXcml0YWJsZQorICAgICAgICBFWFBFQ1RfRVEoc3RTdGFjaywgQzJfT0spOworICAgICAgICAqcmVzdWx0ID0gUGFyYW1QZXJtaXNzaW9uOjpXUklUQUJMRTsKKyAgICB9Cit9CisKK3ZvaWQgQzJDb21wSW50ZlRlc3Q6Om91dHB1dFJlc3VsdHMoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIHsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGFyYW1zWzNdOworICAgIGZvciAoY29uc3QgYXV0byAmdGVzdEluZm8gOiBtUGFyYW1SZXN1bHRzKSB7CisgICAgICAgIGludCByZXN1bHQgPSB0ZXN0SW5mby5yZXN1bHQ7CisgICAgICAgIEFTU0VSVF9UUlVFKDAgPD0gcmVzdWx0ICYmIHJlc3VsdCA8PSAyKTsKKyAgICAgICAgcGFyYW1zW3Jlc3VsdF0uZW1wbGFjZV9iYWNrKHRlc3RJbmZvLm5hbWUpOworICAgIH0KKyAgICBjb25zdCBjaGFyICpyZXN1bHRTdHJpbmdbXSA9IHsiV3JpdGFibGUiLCAiUmVhZC1Pbmx5IiwgIlVuc3VwcG9ydGVkIn07CisgICAgcHJpbnRmKCJcbi0tLS1URVNUIFJFU1VMVFMgKCVzKS0tLS1cblxuIiwgbmFtZS5jX3N0cigpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgeworICAgICAgICBwcmludGYoIlsgJXMgXVxuIiwgcmVzdWx0U3RyaW5nW2ldKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZ0IDogcGFyYW1zW2ldKSB7CisgICAgICAgICAgICBwcmludGYoIiVzXG4iLCB0LmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiXG4iKTsKKyAgICB9Cit9CisKKyNkZWZpbmUgVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8sIGZpZWxkX25hbWVfKSBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxUUGFyYW1fPiBwYXJhbSA9IG1ha2VQYXJhbTxUUGFyYW1fPigpOyAgICAgICAgICBcCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gdmFsaWRWYWx1ZUluZm9zID0geyAgICBcCisgICAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OkN1cnJlbnQoICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIEMyUGFyYW1GaWVsZChwYXJhbS5nZXQoKSwgJmZpZWxkX3R5cGVfbmFtZV86OmZpZWxkX25hbWVfKSkgXAorICAgICAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBBU1NFUlRfRVEoQzJfT0ssICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgbUludGYtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3ZiKHZhbGlkVmFsdWVJbmZvcywgQzJfRE9OVF9CTE9DSykpOyAgICAgXAorICAgICAgICBBU1NFUlRfRVEoMXUsIHZhbGlkVmFsdWVJbmZvcy5zaXplKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGQ6OnZlY3RvcjxkZWNsdHlwZShwYXJhbS0+ZmllbGRfbmFtZV8pPiB2YWxpZFZhbHVlczsgICAgICAgICAgXAorICAgICAgICBzdGQ6OnZlY3RvcjxkZWNsdHlwZShwYXJhbS0+ZmllbGRfbmFtZV8pPiBpbnZhbGlkVmFsdWVzOyAgICAgICAgXAorICAgICAgICBnZXRUZXN0VmFsdWVzKHZhbGlkVmFsdWVJbmZvc1swXS52YWx1ZXMsICZ2YWxpZFZhbHVlcywgJmludmFsaWRWYWx1ZXMpOyAgIFwKKyAgICAgICAgdGVzdFdyaXRhYmxlUGFyYW0ocGFyYW0uZ2V0KCksICZwYXJhbS0+ZmllbGRfbmFtZV8sIHZhbGlkVmFsdWVzLFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZFZhbHVlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisjZGVmaW5lIFRFU1RfVlNTVFJVQ1RfV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXykgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRFU1RfR0VORVJBTF9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfLCB3aWR0aCk7ICBcCisgICAgICAgIFRFU1RfR0VORVJBTF9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfLCBoZWlnaHQpOyBcCisgICAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBURVNUX1UzMl9XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfKSAgICAgICAgICAgICAgXAorICBURVNUX0dFTkVSQUxfV1JJVEFCTEVfRklFTEQoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXywgdmFsdWUpCisKKyNkZWZpbmUgVEVTVF9FTlVNX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8pICAgICAgICAgICAgIFwKKyAgVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8sIHZhbHVlKQorCisvLyBUT0RPKGhpcm9oKTogU3VwcG9ydCBwYXJhbWV0ZXJzIGJhc2VkIG9uIGNoYXJbXSBhbmQgdWludDMyX3RbXS4KKy8vI2RlZmluZSBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRChUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfKQorLy8gVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRQYXJhbV8sIGZpZWxkX3R5cGVfbmFtZV8sIG0udmFsdWUpCisvLyNkZWZpbmUgVEVTVF9VMzJBUlJBWV9XUklUQUJMRV9GSUVMRChUcGFyYW1fLCBmaWVsZF90eXBlX25hbWVfKQorLy8gVEVTVF9HRU5FUkFMX1dSSVRBQkxFX0ZJRUxEKFRwYXJhbV8sIHVpbnQzMl90W10sIGZpZWxkX3R5cGVfbmFtZV8sIHZhbHVlcykKKworI2RlZmluZSBFQUNIX1RFU1QoVFBhcmFtXywgZmllbGRfdHlwZV9uYW1lXywgdGVzdF9uYW1lKSAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW50IHJlc3VsdCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdGhpcy0+bUN1cnJlbnRQYXJhbU5hbWUgPSAjVFBhcmFtXzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2hlY2tQYXJhbVBlcm1pc3Npb248VFBhcmFtXz4oJnJlc3VsdCwgc3VwcG9ydGVkUGFyYW1zKTsgICAgICAgICAgXAorICAgICAgaWYgKHJlc3VsdCA9PSBQYXJhbVBlcm1pc3Npb246OldSSVRBQkxFKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIHRlc3RfbmFtZShUUGFyYW1fLCBmaWVsZF90eXBlX25hbWVfKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbVBhcmFtUmVzdWx0cy5lbXBsYWNlX2JhY2soI1RQYXJhbV8sIHJlc3VsdCk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoMCkKKworI2RlZmluZSBFQUNIX1RFU1RfU0VMRih0eXBlXywgdGVzdF9uYW1lKSBFQUNIX1RFU1QodHlwZV8sIHR5cGVfLCB0ZXN0X25hbWUpCisjZGVmaW5lIEVBQ0hfVEVTVF9JTlBVVCh0eXBlXywgdGVzdF9uYW1lKSBFQUNIX1RFU1QodHlwZV86OmlucHV0LCB0eXBlXywgdGVzdF9uYW1lKQorI2RlZmluZSBFQUNIX1RFU1RfT1VUUFVUKHR5cGVfLCB0ZXN0X25hbWUpIEVBQ0hfVEVTVCh0eXBlXzo6b3V0cHV0LCB0eXBlXywgdGVzdF9uYW1lKQordm9pZCBDMkNvbXBJbnRmVGVzdDo6dGVzdE1haW4oc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmNvbXBvbmVudE5hbWUpIHsKKyAgICBzZXRDb21wb25lbnQoaW50Zik7CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiBzdXBwb3J0ZWRQYXJhbXM7CisgICAgQVNTRVJUX0VRKEMyX09LLCBtSW50Zi0+cXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoJnN1cHBvcnRlZFBhcmFtcykpOworCisgICAgRUFDSF9URVNUX1NFTEYoQzJBY3R1YWxQaXBlbGluZURlbGF5VHVuaW5nLCBURVNUX1UzMl9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX1NFTEYoQzJDb21wb25lbnRBdHRyaWJ1dGVzU2V0dGluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9JTlBVVChDMlBvcnRBY3R1YWxEZWxheVR1bmluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9PVVRQVVQoQzJQb3J0QWN0dWFsRGVsYXlUdW5pbmcsIFRFU1RfVTMyX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfSU5QVVQoQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9PVVRQVVQoQzJTdHJlYW1CdWZmZXJUeXBlU2V0dGluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9JTlBVVChDMlBvcnRTdHJlYW1Db3VudFR1bmluZywgVEVTVF9VMzJfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9PVVRQVVQoQzJQb3J0U3RyZWFtQ291bnRUdW5pbmcsIFRFU1RfVTMyX1dSSVRBQkxFX0ZJRUxEKTsKKworICAgIEVBQ0hfVEVTVF9TRUxGKEMyQ29tcG9uZW50RG9tYWluU2V0dGluZywgVEVTVF9FTlVNX1dSSVRBQkxFX0ZJRUxEKTsKKworICAgIC8vIFRPRE8oaGlyb2gpOiBTdXBwb3J0IHBhcmFtZXRlcnMgYmFzZWQgb24gdWludDMyX3RbXSBhbmQgY2hhcltdLgorICAgIC8vIEVBQ0hfVEVTVF9JTlBVVChDMlBvcnRNZWRpYVR5cGVTZXR0aW5nLCBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX09VVFBVVChDMlBvcnRNZWRpYVR5cGVTZXR0aW5nLCBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX0lOUFVUKEMyU3RyZWFtTWltZUNvbmZpZywgVEVTVF9TVFJJTkdfV1JJVEFCTEVfRklFTEQpOworICAgIC8vIEVBQ0hfVEVTVF9PVVRQVVQoQzJTdHJlYW1NaW1lQ29uZmlnLCBURVNUX1NUUklOR19XUklUQUJMRV9GSUVMRCk7CisKKyAgICAvLyBFQUNIX1RFU1RfU0VMRihDMlN1cHBvcnRlZFBhcmFtc0luZm8sIFRFU1RfVTMyQVJSQVlfV1JJVEFCTEVfRklFTEQpOworICAgIC8vIEVBQ0hfVEVTVF9TRUxGKEMyUmVxdWlyZWRQYXJhbXNJbmZvLCBURVNUX1UzMkFSUkFZX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICAvLyBFQUNIX1RFU1RfU0VMRihDMlJlYWRPbmx5UGFyYW1zSW5mbywgVEVTVF9VMzJBUlJBWV9XUklUQUJMRV9GSUVMRCk7CisgICAgLy8gRUFDSF9URVNUX1NFTEYoQzJSZXF1ZXN0ZWRJbmZvc0luZm8sIFRFU1RfVTMyQVJSQVlfV1JJVEFCTEVfRklFTEQpOworCisgICAgRUFDSF9URVNUX0lOUFVUKEMyU3RyZWFtUGljdHVyZVNpemVJbmZvLCBURVNUX1ZTU1RSVUNUX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfT1VUUFVUKEMyU3RyZWFtUGljdHVyZVNpemVJbmZvLCBURVNUX1ZTU1RSVUNUX1dSSVRBQkxFX0ZJRUxEKTsKKyAgICBFQUNIX1RFU1RfSU5QVVQoQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm8sIFRFU1RfVlNTVFJVQ1RfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9PVVRQVVQoQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm8sIFRFU1RfVlNTVFJVQ1RfV1JJVEFCTEVfRklFTEQpOworICAgIEVBQ0hfVEVTVF9JTlBVVChDMk1heFZpZGVvU2l6ZUhpbnRQb3J0U2V0dGluZywgVEVTVF9WU1NUUlVDVF9XUklUQUJMRV9GSUVMRCk7CisgICAgRUFDSF9URVNUX09VVFBVVChDMk1heFZpZGVvU2l6ZUhpbnRQb3J0U2V0dGluZywgVEVTVF9WU1NUUlVDVF9XUklUQUJMRV9GSUVMRCk7CisKKyAgICBvdXRwdXRSZXN1bHRzKGNvbXBvbmVudE5hbWUpOworICAgIHJlc2V0UmVzdWx0cygpOworfQorCitURVNUX0YoQzJDb21wSW50ZlRlc3QsIEMyVjRMMkNvZGVjSW50ZikgeworCisgICAgLy8gUmVhZCBhIHNoYXJlZCBvYmplY3QgbGlicmFyeS4KKyAgICB2b2lkKiBjb21wTGliID0gZGxvcGVuKCJzeXN0ZW0vbGliL2xpYnY0bDJfY29kZWMyLnNvIiwgUlRMRF9OT1cpOworCisgICAgaWYgKCFjb21wTGliKSB7CisgICAgICAgIHByaW50ZigiQ2Fubm90IG9wZW4gbGlicmFyeTogJXMuXG4iLCBkbGVycm9yKCkpOworICAgICAgICBGQUlMKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0eXBlZGVmIEMyQ29tcG9uZW50U3RvcmUqIGNyZWF0ZV90KCk7CisgICAgY3JlYXRlX3QqIGNyZWF0ZV9zdG9yZT0gKGNyZWF0ZV90KikgZGxzeW0oY29tcExpYiwgImNyZWF0ZV9zdG9yZSIpOworICAgIGNvbnN0IGNoYXIqIGRsc3ltX2Vycm9yID0gZGxlcnJvcigpOworICAgIGlmIChkbHN5bV9lcnJvcikgeworICAgICAgICBwcmludGYoIkNhbm5vdCBsb2FkIHN5bWJvbCBjcmVhdGU6ICVzLlxuIiwgZGxzeW1fZXJyb3IpOworICAgICAgICBGQUlMKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0eXBlZGVmIHZvaWQgZGVzdHJveV90KEMyQ29tcG9uZW50U3RvcmUqKTsKKyAgICBkZXN0cm95X3QqIGRlc3Ryb3lfc3RvcmUgPSAoZGVzdHJveV90KikgZGxzeW0oY29tcExpYiwgImRlc3Ryb3lfc3RvcmUiKTsKKyAgICBkbHN5bV9lcnJvciA9IGRsZXJyb3IoKTsKKyAgICBpZiAoZGxzeW1fZXJyb3IpIHsKKyAgICAgICAgcHJpbnRmKCJDYW5ub3QgbG9hZCBzeW1ib2wgZGVzdHJveTogJXMuXG4iLCBkbHN5bV9lcnJvcik7CisgICAgICAgIEZBSUwoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBjb21wb25lbnRTdG9yZShjcmVhdGVfc3RvcmUoKSwgZGVzdHJveV9zdG9yZSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBjb21wb25lbnRJbnRmOworICAgIGNvbXBvbmVudFN0b3JlLT5jcmVhdGVJbnRlcmZhY2UoInY0bDIuZGVjb2RlciIsICZjb21wb25lbnRJbnRmKTsKKyAgICBhdXRvIGNvbXBvbmVudE5hbWUgPSAiQzJWNEwyQ29kZWMiOworICAgIHRlc3RNYWluKGNvbXBvbmVudEludGYsIGNvbXBvbmVudE5hbWUpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJQYXJhbV90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlBhcmFtX3Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2NGQ0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJQYXJhbV90ZXN0LmNwcApAQCAtMCwwICsxLDI1MTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJQYXJhbV90ZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2RlZmluZSBfX0MyX0dFTkVSQVRFX0dMT0JBTF9WQVJTX18KKyNpbmNsdWRlIDxDMlBhcmFtRGVmLmg+CisKKyNpbmNsdWRlIDxsaXN0PgorCit2b2lkIFByaW50VG8oY29uc3QgX0MyRmllbGRJZCAmaWQsIDo6c3RkOjpvc3RyZWFtKiBvcykgeworICAgICpvcyA8PCAiQCIgPDwgaWQuX21PZmZzZXQgPDwgIisiIDw8IGlkLl9tU2l6ZTsKK30KKwordm9pZCBQcmludFRvKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCwgOjpzdGQ6Om9zdHJlYW0gKm9zKSB7CisgICAgdXNpbmcgRkQ9QzJGaWVsZERlc2NyaXB0b3I7CisgICAgc3dpdGNoIChmZC50eXBlKCkpIHsKKyAgICBjYXNlIEZEOjpJTlQzMjogKm9zIDw8ICJpMzIiOyBicmVhazsKKyAgICBjYXNlIEZEOjpJTlQ2NDogKm9zIDw8ICJpNjQiOyBicmVhazsKKyAgICBjYXNlIEZEOjpVSU5UMzI6ICpvcyA8PCAidTMyIjsgYnJlYWs7CisgICAgY2FzZSBGRDo6VUlOVDY0OiAqb3MgPDwgInU2NCI7IGJyZWFrOworICAgIGNhc2UgRkQ6OkZMT0FUOiAqb3MgPDwgImZsb2F0IjsgYnJlYWs7CisgICAgY2FzZSBGRDo6U1RSSU5HOiAqb3MgPDwgImNoYXIiOyBicmVhazsKKyAgICBjYXNlIEZEOjpCTE9COiAqb3MgPDwgInU4IjsgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKGZkLnR5cGUoKSAmIEZEOjpTVFJVQ1RfRkxBRykgeworICAgICAgICAgICAgKm9zIDw8ICJzdHJ1Y3QtIiA8PCAoZmQudHlwZSgpICYgfkZEOjpTVFJVQ1RfRkxBRyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqb3MgPDwgInR5cGUtIiA8PCBmZC50eXBlKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgKm9zIDw8ICIgIiA8PCBmZC5uYW1lKCk7CisgICAgaWYgKGZkLmV4dGVudCgpID4gMSkgeworICAgICAgICAqb3MgPDwgIlsiIDw8IGZkLmV4dGVudCgpIDw8ICJdIjsKKyAgICB9IGVsc2UgaWYgKGZkLmV4dGVudCgpID09IDApIHsKKyAgICAgICAgKm9zIDw8ICJbXSI7CisgICAgfQorICAgICpvcyA8PCAiICgiOworICAgIFByaW50VG8oZmQuX21GaWVsZElkLCBvcyk7CisgICAgKm9zIDw8ICIqIiA8PCBmZC5leHRlbnQoKSA8PCAiKSI7Cit9CisKK2VudW0gQzJQYXJhbUluZGV4VHlwZSA6IEMyUGFyYW06OnR5cGVfaW5kZXhfdCB7CisgICAga1BhcmFtSW5kZXhOdW1iZXIsCisgICAga1BhcmFtSW5kZXhOdW1iZXJzLAorICAgIGtQYXJhbUluZGV4TnVtYmVyMiwKKyAgICBrUGFyYW1JbmRleFZlbmRvclN0YXJ0ID0gQzJQYXJhbTo6VFlQRV9JTkRFWF9WRU5ET1JfU1RBUlQsCisgICAga1BhcmFtSW5kZXhWZW5kb3JOdW1iZXJzLAorfTsKKwordm9pZCBmZmZmKGludCgqKShpbnQpKSB7fQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVFJVQ1QgREVDTEFSQVRJT04gQU5EIERFU0NSSVBUSU9OID09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3R5cGVkZWYgQzJGaWVsZERlc2NyaXB0b3IgRkQ7CisKK2NsYXNzIEMyUGFyYW1UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Cit9OworCitjbGFzcyBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdAorICAgICAgICA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PiB7Cit9OworCitlbnVtIHsKKyAgICBrUGFyYW1JbmRleFNpemUsCisgICAga1BhcmFtSW5kZXhUZXN0QSwKKyAgICBrUGFyYW1JbmRleFRlc3RCLAorICAgIGtQYXJhbUluZGV4VGVzdEZsZXhTMzIsCisgICAga1BhcmFtSW5kZXhUZXN0RmxleEVuZFMzMiwKKyAgICBrUGFyYW1JbmRleFRlc3RGbGV4UzY0LAorICAgIGtQYXJhbUluZGV4VGVzdEZsZXhFbmRTNjQsCisgICAga1BhcmFtSW5kZXhUZXN0RmxleFNpemUsCisgICAga1BhcmFtSW5kZXhUZXN0RmxleEVuZFNpemUsCit9OworCitzdHJ1Y3QgQzJTaXplU3RydWN0IHsKKyAgICBpbnQzMl90IHdpZHRoOworICAgIGludDMyX3QgaGVpZ2h0OworICAgIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleFNpemUgfTsgICAgICAgICAgICAgICAgICAgICAgICAvLyA8PSBuZWVkZWQgZm9yIEMyRmllbGREZXNjcmlwdG9yCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOyAgLy8gPD0gbmVlZGVkIGZvciBDMkZpZWxkRGVzY3JpcHRvcgorICAgIGNvbnN0IHN0YXRpYyBGRDo6dHlwZV90IFRZUEUgPSAoRkQ6OnR5cGVfdCkoQ09SRV9JTkRFWCB8IEZEOjpTVFJVQ1RfRkxBRyk7Cit9OworCitERUZJTkVfTk9fTkFNRURfVkFMVUVTX0ZPUihDMlNpemVTdHJ1Y3QpCisKKy8vIFRlc3QgMS4gZGVmaW5lIGEgc3RydWN0dXJlIHdpdGhvdXQgYW55IGhlbHBlciBtZXRob2RzCisKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmYSwgY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmIpIHsKKyAgICByZXR1cm4gYS50eXBlKCkgPT0gYi50eXBlKCkKKyAgICAgICAgICAgICYmIGEuZXh0ZW50KCkgPT0gYi5leHRlbnQoKQorICAgICAgICAgICAgJiYgYS5uYW1lKCkgPT0gYi5uYW1lKCkKKyAgICAgICAgICAgICYmIGEuX21GaWVsZElkID09IGIuX21GaWVsZElkOworfQorCitzdHJ1Y3QgQzJUZXN0U3RydWN0X0EgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgaW50NjRfdCBzaWduZWQ2NFsyXTsKKyAgICB1aW50MzJfdCB1bnNpZ25lZDMyWzFdOworICAgIHVpbnQ2NF90IHVuc2lnbmVkNjQ7CisgICAgZmxvYXQgZnAzMjsKKyAgICBDMlNpemVTdHJ1Y3Qgc3pbM107CisgICAgdWludDhfdCBibG9iWzEwMF07CisgICAgY2hhciBzdHJpbmdbMTAwXTsKKyAgICBib29sIHllc05vWzEwMF07CisKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgLy8gZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4VGVzdCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0EgX3R5cGU7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0E6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0E6Ol9GSUVMRF9MSVNUID0KKyAgICB7IHsgRkQ6OklOVDMyLCAgICAxLCAiczMyIiwgICAwLCA0IH0sCisgICAgICB7IEZEOjpJTlQ2NCwgICAgMiwgInM2NCIsICAgNCwgOCB9LAorICAgICAgeyBGRDo6VUlOVDMyLCAgIDEsICJ1MzIiLCAgMjAsIDQgfSwKKyAgICAgIHsgRkQ6OlVJTlQ2NCwgICAxLCAidTY0IiwgIDI0LCA4IH0sCisgICAgICB7IEZEOjpGTE9BVCwgICAgMSwgImZwIiwgICAzMiwgNCB9LAorICAgICAgeyBDMlNpemVTdHJ1Y3Q6OlRZUEUsIDMsICJzaXplIiwgMzYsIDggfSwKKyAgICAgIHsgRkQ6OkJMT0IsICAgMTAwLCAiYmxvYiIsIDYwLCAxIH0sCisgICAgICB7IEZEOjpTVFJJTkcsIDEwMCwgInN0ciIsIDE2MCwgMSB9LAorICAgICAgeyBGRDo6QkxPQiwgICAxMDAsICJ5LW4iLCAyNjAsIDEgfSB9OworCitURVNUX1AoQzJQYXJhbVRlc3RfUGFyYW1GaWVsZExpc3QsIFZlcmlmeVN0cnVjdCkgeworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBHZXRQYXJhbSgpLCBleHBlY3RlZCA9IEMyVGVzdFN0cnVjdF9BOjpfRklFTERfTElTVDsKKworICAgIC8vIHZlcmlmeSBmaXJzdCBmaWVsZCBkZXNjcmlwdG9yCisgICAgRVhQRUNUX0VRKEZEOjpJTlQzMiwgZmllbGRzWzBdLnR5cGUoKSk7CisgICAgRVhQRUNUX1NUUkVRKCJzMzIiLCBmaWVsZHNbMF0ubmFtZSgpLmNfc3RyKCkpOworICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzWzBdLmV4dGVudCgpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgZmllbGRzWzBdLl9tRmllbGRJZCk7CisKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbMF0sIGZpZWxkc1swXSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkWzFdLCBmaWVsZHNbMV0pOworICAgIEVYUEVDVF9FUShleHBlY3RlZFsyXSwgZmllbGRzWzJdKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbM10sIGZpZWxkc1szXSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkWzRdLCBmaWVsZHNbNF0pOworICAgIEVYUEVDVF9FUShleHBlY3RlZFs1XSwgZmllbGRzWzVdKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbNl0sIGZpZWxkc1s2XSk7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkWzddLCBmaWVsZHNbN10pOworICAgIGZvciAoc2l6ZV90IGkgPSA4OyBpIDwgZmllbGRzLnNpemUoKSAmJiBpIDwgZXhwZWN0ZWQuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkW2ldLCBmaWVsZHNbaV0pOworICAgIH0KK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoSW5pdGlhbGl6ZXJMaXN0LCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0U3RydWN0X0E6Ol9GSUVMRF9MSVNUKSk7CisKKy8vIGRlZmluZSBmaWVsZHMgdXNpbmcgQzJGaWVsZERlc2NyaXB0b3IgcG9pbnRlciBjb25zdHJ1Y3RvcgorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9BX0ZEX1BUUl9maWVsZExpc3QgPQorICAgIHsgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPnNpZ25lZDMyLCAgICJzMzIiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT5zaWduZWQ2NCwgICAiczY0IiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+dW5zaWduZWQzMiwgInUzMiIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPnVuc2lnbmVkNjQsICJ1NjQiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKCYoKEMyVGVzdFN0cnVjdF9BKikobnVsbHB0cikpLT5mcDMyLCAgICAgICJmcCIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPnN6LCAgICAgICAic2l6ZSIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0EqKShudWxscHRyKSktPmJsb2IsICAgICAgICJibG9iIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+c3RyaW5nLCAgICAgInN0ciIpLAorICAgIC8vICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfQSopKG51bGxwdHIpKS0+eWVzTm8sICAgICAgInktbiIpCisgICAgfTsKKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoUG9pbnRlckNvbnN0cnVjdG9yLCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0U3RydWN0X0FfRkRfUFRSX2ZpZWxkTGlzdCkpOworCisvLyBkZWZpbmUgZmllbGRzIHVzaW5nIEMyRmllbGREZXNjcmlwdG9yIG1lbWJlci1wb2ludGVyIGNvbnN0cnVjdG9yCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0FfRkRfTUVNX1BUUl9maWVsZExpc3QgPQorICAgIHsgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDMyLCAgICJzMzIiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpzaWduZWQ2NCwgICAiczY0IiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQzMiwgInUzMiIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkNjQsICJ1NjQiKSwKKyAgICAgIEMyRmllbGREZXNjcmlwdG9yKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpmcDMyLCAgICAgICJmcCIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnN6LCAgICAgICAic2l6ZSIpLAorICAgICAgQzJGaWVsZERlc2NyaXB0b3IoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OmJsb2IsICAgICAgICJibG9iIiksCisgICAgICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c3RyaW5nLCAgICAgInN0ciIpLAorICAgIC8vICBDMkZpZWxkRGVzY3JpcHRvcigoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6eWVzTm8sICAgICAgInktbiIpCisgICAgfTsKKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoTWVtYmVyUG9pbnRlckNvbnN0cnVjdG9yLCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0U3RydWN0X0FfRkRfTUVNX1BUUl9maWVsZExpc3QpKTsKKworLy8gVGVzdCAyLiBkZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aCB0d28tc3RlcCBoZWxwZXIgbWV0aG9kcworCitzdHJ1Y3QgQzJUZXN0QVN0cnVjdCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQ2NF90IHNpZ25lZDY0WzJdOworICAgIHVpbnQzMl90IHVuc2lnbmVkMzJbMV07CisgICAgdWludDY0X3QgdW5zaWduZWQ2NDsKKyAgICBmbG9hdCBmcDMyOworICAgIEMyU2l6ZVN0cnVjdCBzelszXTsKKyAgICB1aW50OF90IGJsb2JbMTAwXTsKKyAgICBjaGFyIHN0cmluZ1sxMDBdOworICAgIGJvb2wgeWVzTm9bMTAwXTsKKworcHJpdmF0ZTogLy8gdGVzdCBhY2Nlc3MgbGV2ZWwKKyAgICBERUZJTkVfQzJTVFJVQ1QoVGVzdEEpCit9IEMyX1BBQ0s7CisKK0RFU0NSSUJFX0MyU1RSVUNUKFRlc3RBLCB7CisgICAgQzJGSUVMRChzaWduZWQzMiwgInMzMiIpCisgICAgQzJGSUVMRChzaWduZWQ2NCwgInM2NCIpCisgICAgQzJGSUVMRCh1bnNpZ25lZDMyLCAidTMyIikKKyAgICBDMkZJRUxEKHVuc2lnbmVkNjQsICJ1NjQiKQorICAgIEMyRklFTEQoZnAzMiwgImZwIikKKyAgICBDMkZJRUxEKHN6LCAic2l6ZSIpCisgICAgQzJGSUVMRChibG9iLCAiYmxvYiIpCisgICAgQzJGSUVMRChzdHJpbmcsICJzdHIiKQorICAgIC8vIEMyRklFTEQoeWVzTm8sICJ5LW4iKQorfSkgLy8gOyBvcHRpb25hbAorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChEZXNjcmliZVN0cnVjdDJTdGVwLCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0QVN0cnVjdDo6RmllbGRMaXN0KCkpKTsKKworLy8gVGVzdCAzLiBkZWZpbmUgYSBzdHJ1Y3R1cmUgd2l0aCBvbmUtc3RlcCBoZWxwZXIgbWV0aG9kCisKK3N0cnVjdCBDMlRlc3RCU3RydWN0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIGludDY0X3Qgc2lnbmVkNjRbMl07CisgICAgdWludDMyX3QgdW5zaWduZWQzMlsxXTsKKyAgICB1aW50NjRfdCB1bnNpZ25lZDY0OworICAgIGZsb2F0IGZwMzI7CisgICAgQzJTaXplU3RydWN0IHN6WzNdOworICAgIHVpbnQ4X3QgYmxvYlsxMDBdOworICAgIGNoYXIgc3RyaW5nWzEwMF07CisgICAgYm9vbCB5ZXNOb1sxMDBdOworCitwcml2YXRlOiAvLyB0ZXN0IGFjY2VzcyBsZXZlbAorICAgIERFRklORV9BTkRfREVTQ1JJQkVfQzJTVFJVQ1QoVGVzdEIpCisKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKHNpZ25lZDY0LCAiczY0IikKKyAgICBDMkZJRUxEKHVuc2lnbmVkMzIsICJ1MzIiKQorICAgIEMyRklFTEQodW5zaWduZWQ2NCwgInU2NCIpCisgICAgQzJGSUVMRChmcDMyLCAiZnAiKQorICAgIEMyRklFTEQoc3osICJzaXplIikKKyAgICBDMkZJRUxEKGJsb2IsICJibG9iIikKKyAgICBDMkZJRUxEKHN0cmluZywgInN0ciIpCisgICAgLy8gQzJGSUVMRCh5ZXNObywgInktbiIpCit9OworCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChEZXNjcmliZVN0cnVjdDFTdGVwLCBDMlBhcmFtVGVzdF9QYXJhbUZpZWxkTGlzdCwgOjp0ZXN0aW5nOjpWYWx1ZXMoQzJUZXN0QlN0cnVjdDo6RmllbGRMaXN0KCkpKTsKKworLy8gVGVzdCA0LiBmbGV4aWJsZSBtZW1iZXJzCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3Byb3RlY3RlZDoKKyAgICB1c2luZyB0eXBlX3Q9RkQ6OnR5cGVfdDsKKworICAgIC8vIHN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KKyAgICAgICAgICAgIEdldExpc3RzKCk7CisKKyAgICBjb25zdGV4cHIgc3RhdGljIHR5cGVfdCBGbGV4VHlwZSA9CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgaW50MzJfdD46OnZhbHVlID8gRkQ6OklOVDMyIDoKKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCBpbnQ2NF90Pjo6dmFsdWUgPyBGRDo6SU5UNjQgOgorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIHVpbnQzMl90Pjo6dmFsdWUgPyBGRDo6VUlOVDMyIDoKKyAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCB1aW50NjRfdD46OnZhbHVlID8gRkQ6OlVJTlQ2NCA6CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgZmxvYXQ+Ojp2YWx1ZSA/IEZEOjpGTE9BVCA6CisgICAgICAgICAgICBzdGQ6OmlzX3NhbWU8VCwgdWludDhfdD46OnZhbHVlID8gRkQ6OkJMT0IgOgorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSA/IEZEOjpTVFJJTkcgOgorICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIEMyU2l6ZVN0cnVjdD46OnZhbHVlID8gQzJTaXplU3RydWN0OjpUWVBFIDogKHR5cGVfdCkwOworICAgIGNvbnN0ZXhwciBzdGF0aWMgc2l6ZV90IEZMRVhfU0laRSA9IHNpemVvZihUKTsKK307CisKK3R5cGVkZWYgOjp0ZXN0aW5nOjpUeXBlczxpbnQzMl90LCBpbnQ2NF90LCBDMlNpemVTdHJ1Y3Q+IEZsZXhUeXBlczsKK1RZUEVEX1RFU1RfQ0FTRShDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3QsIEZsZXhUeXBlcyk7CisKK1RZUEVEX1RFU1QoQzJQYXJhbVRlc3RfRmxleFBhcmFtRmllbGRMaXN0LCBWZXJpZnlTdHJ1Y3QpIHsKKyAgICBmb3IgKGF1dG8gYSA6IHRoaXMtPkdldExpc3RzKCkpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IGE7CisgICAgICAgIGlmIChmaWVsZHMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDJ1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShDMkZpZWxkRGVzY3JpcHRvcihGRDo6SU5UMzIsIDEsICJzMzIiLCAwLCA0KSwgZmllbGRzWzBdKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShDMkZpZWxkRGVzY3JpcHRvcih0aGlzLT5GbGV4VHlwZSwgMCwgImZsZXgiLCA0LCB0aGlzLT5GTEVYX1NJWkUpLAorICAgICAgICAgICAgICAgICAgICAgIGZpZWxkc1sxXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKEMyRmllbGREZXNjcmlwdG9yKHRoaXMtPkZsZXhUeXBlLCAwLCAiZmxleCIsIDAsIHRoaXMtPkZMRVhfU0laRSksCisgICAgICAgICAgICAgICAgICAgICAgZmllbGRzWzBdKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4UzMyIHsKKyAgICBpbnQzMl90IG1GbGV4W107CisKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IF9GSUVMRF9MSVNUOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgLy8gZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IGtQYXJhbUluZGV4VGVzdEZsZXgsIEZMRVhfU0laRSA9IDQgfTsKKyAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4UzMyIF90eXBlOworICAgIC8vIHR5cGVkZWYgaW50MzJfdCBGbGV4VHlwZTsKK307CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleFMzMjo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleFMzMjo6X0ZJRUxEX0xJU1QgPSB7CisgICAgeyBGRDo6SU5UMzIsIDAsICJmbGV4IiwgMCwgNCB9Cit9OworCitzdHJ1Y3QgQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzIgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgaW50MzJfdCBtRmxleFtdOworCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleFRlc3RGbGV4RW5kLCBGTEVYX1NJWkUgPSA0IH07CisgICAgLy8gdHlwZWRlZiBDMlRlc3RTdHJ1Y3RfRmxleEVuZCBfdHlwZTsKKyAgICAvLyB0eXBlZGVmIGludDMyX3QgRmxleFR5cGU7Cit9OworCitjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzI6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzI6Ol9GSUVMRF9MSVNUID0geworICAgIHsgRkQ6OklOVDMyLCAxLCAiczMyIiwgMCwgNCB9LAorICAgIHsgRkQ6OklOVDMyLCAwLCAiZmxleCIsIDQsIDQgfSwKK307CisKK2NvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzJfcHRyX2ZpZWxkTGlzdCA9IHsKKyAgICBDMkZpZWxkRGVzY3JpcHRvcigmKChDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMiopMCktPnNpZ25lZDMyLCAiczMyIiksCisgICAgQzJGaWVsZERlc2NyaXB0b3IoJigoQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzIqKTApLT5tRmxleCwgImZsZXgiKSwKK307CisKK3N0cnVjdCBDMlRlc3RGbGV4UzMyU3RydWN0IHsKKyAgICBpbnQzMl90IG1GbGV4U2lnbmVkMzJbXTsKK3ByaXZhdGU6IC8vIHRlc3QgYWNjZXNzIGxldmVsCisgICAgQzJUZXN0RmxleFMzMlN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoVGVzdEZsZXhTMzIsIG1GbGV4U2lnbmVkMzIpCisgICAgQzJGSUVMRChtRmxleFNpZ25lZDMyLCAiZmxleCIpCit9OworCitzdHJ1Y3QgQzJUZXN0RmxleEVuZFMzMlN0cnVjdCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQzMl90IG1GbGV4U2lnbmVkMzJbXTsKK3ByaXZhdGU6IC8vIHRlc3QgYWNjZXNzIGxldmVsCisgICAgQzJUZXN0RmxleEVuZFMzMlN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfRkxFWF9DMlNUUlVDVChUZXN0RmxleEVuZFMzMiwgbUZsZXhTaWduZWQzMikKK30gQzJfUEFDSzsKKworREVTQ1JJQkVfQzJTVFJVQ1QoVGVzdEZsZXhFbmRTMzIsIHsKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKG1GbGV4U2lnbmVkMzIsICJmbGV4IikKK30pIC8vIDsgb3B0aW9uYWwKKwordGVtcGxhdGU8Pgorc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PgorLy9zdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CitDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3Q8aW50MzJfdD46OkdldExpc3RzKCkgeworICAgIHJldHVybiB7CisgICAgICAgIEMyVGVzdFN0cnVjdF9GbGV4UzMyOjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhFbmRTMzI6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleEVuZFMzMl9wdHJfZmllbGRMaXN0LAorICAgICAgICBDMlRlc3RGbGV4UzMyU3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0RmxleEVuZFMzMlN0cnVjdDo6RmllbGRMaXN0KCksCisgICAgfTsKK30KKworc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4UzY0IHsKKyAgICBpbnQ2NF90IG1GbGV4U2lnbmVkNjRbXTsKKworICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX0ZJRUxEX0xJU1Q7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKKyAgICAvLyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXhUZXN0RmxleFM2NCwgRkxFWF9TSVpFID0gOCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhTNjQgX3R5cGU7CisgICAgLy8gdHlwZWRlZiBpbnQ2NF90IEZsZXhUeXBlOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4UzY0OjpGaWVsZExpc3QoKSB7CisgICAgcmV0dXJuIF9GSUVMRF9MSVNUOworfQorY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4UzY0OjpfRklFTERfTElTVCA9IHsKKyAgICB7IEZEOjpJTlQ2NCwgMCwgImZsZXgiLCAwLCA4IH0KK307CisKK3N0cnVjdCBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBpbnQ2NF90IG1TaWduZWQ2NEZsZXhbXTsKKworICAgIGNvbnN0IHN0YXRpYyBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gX0ZJRUxEX0xJU1Q7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBGaWVsZExpc3QoKTsKKyAgICAvLyBlbnVtIDogdWludDMyX3QgeyBDT1JFX0lOREVYID0gQzJUZXN0U3RydWN0X0ZsZXhFbmRTNjQsIEZMRVhfU0laRSA9IDggfTsKKyAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4RW5kUzY0IF90eXBlOworICAgIC8vIHR5cGVkZWYgaW50NjRfdCBGbGV4VHlwZTsKK307CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NDo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFM2NDo6X0ZJRUxEX0xJU1QgPSB7CisgICAgeyBGRDo6SU5UMzIsIDEsICJzMzIiLCAwLCA0IH0sCisgICAgeyBGRDo6SU5UNjQsIDAsICJmbGV4IiwgNCwgOCB9LAorfTsKKworc3RydWN0IEMyVGVzdEZsZXhTNjRTdHJ1Y3QgeworICAgIGludDY0X3QgbUZsZXhTaWduZWQ2NFtdOworICAgIEMyVGVzdEZsZXhTNjRTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4UzY0LCBtRmxleFNpZ25lZDY0KQorICAgIEMyRklFTEQobUZsZXhTaWduZWQ2NCwgImZsZXgiKQorfTsKKworc3RydWN0IEMyVGVzdEZsZXhFbmRTNjRTdHJ1Y3QgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgaW50NjRfdCBtRmxleFNpZ25lZDY0W107CisgICAgQzJUZXN0RmxleEVuZFM2NFN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfRkxFWF9DMlNUUlVDVChUZXN0RmxleEVuZFM2NCwgbUZsZXhTaWduZWQ2NCkKK30gQzJfUEFDSzsKKworREVTQ1JJQkVfQzJTVFJVQ1QoVGVzdEZsZXhFbmRTNjQsIHsKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKG1GbGV4U2lnbmVkNjQsICJmbGV4IikKK30pIC8vIDsgb3B0aW9uYWwKKwordGVtcGxhdGU8Pgorc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+PgorLy9zdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CitDMlBhcmFtVGVzdF9GbGV4UGFyYW1GaWVsZExpc3Q8aW50NjRfdD46OkdldExpc3RzKCkgeworICAgIHJldHVybiB7CisgICAgICAgIEMyVGVzdFN0cnVjdF9GbGV4UzY0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0U3RydWN0X0ZsZXhFbmRTNjQ6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RGbGV4UzY0U3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0RmxleEVuZFM2NFN0cnVjdDo6RmllbGRMaXN0KCksCisgICAgfTsKK30KKworc3RydWN0IEMyVGVzdFN0cnVjdF9GbGV4U2l6ZSB7CisgICAgQzJTaXplU3RydWN0IG1GbGV4U2l6ZVtdOworCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBrUGFyYW1JbmRleFRlc3RGbGV4U2l6ZSwgRkxFWF9TSVpFID0gOCB9OworICAgIC8vIHR5cGVkZWYgQzJUZXN0U3RydWN0X0ZsZXhTaXplIF90eXBlOworICAgIC8vIHR5cGVkZWYgQzJTaXplU3RydWN0IEZsZXhUeXBlOworfTsKKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEMyVGVzdFN0cnVjdF9GbGV4U2l6ZTo6RmllbGRMaXN0KCkgeworICAgIHJldHVybiBfRklFTERfTElTVDsKK30KK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleFNpemU6Ol9GSUVMRF9MSVNUID0geworICAgIHsgQzJTaXplU3RydWN0OjpUWVBFLCAwLCAiZmxleCIsIDAsIHNpemVvZihDMlNpemVTdHJ1Y3QpIH0KK307CisKK3N0cnVjdCBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemUgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgQzJTaXplU3RydWN0IG1TaXplRmxleFtdOworCisgICAgY29uc3Qgc3RhdGljIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBfRklFTERfTElTVDsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIC8vIGVudW0gOiB1aW50MzJfdCB7IENPUkVfSU5ERVggPSBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemUsIEZMRVhfU0laRSA9IDggfTsKKyAgICAvLyB0eXBlZGVmIEMyVGVzdFN0cnVjdF9GbGV4RW5kU2l6ZSBfdHlwZTsKKyAgICAvLyB0eXBlZGVmIEMyU2l6ZVN0cnVjdCBGbGV4VHlwZTsKK307CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemU6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJUZXN0U3RydWN0X0ZsZXhFbmRTaXplOjpfRklFTERfTElTVCA9IHsKKyAgICB7IEZEOjpJTlQzMiwgMSwgInMzMiIsIDAsIDQgfSwKKyAgICB7IEMyU2l6ZVN0cnVjdDo6VFlQRSwgMCwgImZsZXgiLCA0LCBzaXplb2YoQzJTaXplU3RydWN0KSB9LAorfTsKKworc3RydWN0IEMyVGVzdEZsZXhTaXplU3RydWN0IHsKKyAgICBDMlNpemVTdHJ1Y3QgbUZsZXhTaXplW107CisgICAgQzJUZXN0RmxleFNpemVTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4U2l6ZSwgbUZsZXhTaXplKQorICAgIEMyRklFTEQobUZsZXhTaXplLCAiZmxleCIpCit9OworCitzdHJ1Y3QgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QgeworICAgIGludDMyX3Qgc2lnbmVkMzI7CisgICAgQzJTaXplU3RydWN0IG1GbGV4U2l6ZVtdOworICAgIEMyVGVzdEZsZXhFbmRTaXplU3RydWN0KCkge30KKworICAgIERFRklORV9GTEVYX0MyU1RSVUNUKFRlc3RGbGV4RW5kU2l6ZSwgbUZsZXhTaXplKQorfSBDMl9QQUNLOworCitERVNDUklCRV9DMlNUUlVDVChUZXN0RmxleEVuZFNpemUsIHsKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKG1GbGV4U2l6ZSwgImZsZXgiKQorfSkgLy8gOyBvcHRpb25hbAorCitzdHJ1Y3QgQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0IHsKKyAgICBpbnQzMl90IHNpZ25lZDMyOworICAgIEMyU2l6ZVN0cnVjdCBtRmxleFNpemVbXTsKKyAgICBDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0JBU0VfRkxFWF9DMlNUUlVDVChUZXN0QmFzZUZsZXhFbmRTaXplLCBtRmxleFNpemUpCit9IEMyX1BBQ0s7CisKK0RFU0NSSUJFX0MyU1RSVUNUKFRlc3RCYXNlRmxleEVuZFNpemUsIHsKKyAgICBDMkZJRUxEKHNpZ25lZDMyLCAiczMyIikKKyAgICBDMkZJRUxEKG1GbGV4U2l6ZSwgImZsZXgiKQorfSkgLy8gOyBvcHRpb25hbAorCitzdHJ1Y3QgQzJUZXN0QmFzZUZsZXhFbmRTaXplMlN0cnVjdCB7CisgICAgaW50MzJfdCBzaWduZWQzMjsKKyAgICBDMlNpemVTdHJ1Y3QgbUZsZXhTaXplW107CisgICAgQzJUZXN0QmFzZUZsZXhFbmRTaXplMlN0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfRkxFWF9DMlNUUlVDVChUZXN0QmFzZUZsZXhFbmRTaXplMiwgbUZsZXhTaXplKQorICAgIEMyRklFTEQoc2lnbmVkMzIsICJzMzIiKQorICAgIEMyRklFTEQobUZsZXhTaXplLCAiZmxleCIpCit9OworCit0ZW1wbGF0ZTw+CitzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4+CisvL3N0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPj4KK0MyUGFyYW1UZXN0X0ZsZXhQYXJhbUZpZWxkTGlzdDxDMlNpemVTdHJ1Y3Q+OjpHZXRMaXN0cygpIHsKKyAgICByZXR1cm4geworICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleFNpemU6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RTdHJ1Y3RfRmxleEVuZFNpemU6OkZpZWxkTGlzdCgpLAorICAgICAgICBDMlRlc3RGbGV4U2l6ZVN0cnVjdDo6RmllbGRMaXN0KCksCisgICAgICAgIEMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0OjpGaWVsZExpc3QoKSwKKyAgICAgICAgQzJUZXN0QmFzZUZsZXhFbmRTaXplMlN0cnVjdDo6RmllbGRMaXN0KCksCisgICAgfTsKK30KKworVEVTVF9GKEMyUGFyYW1UZXN0LCBGaWVsZElkKSB7CisgICAgLy8gcG9pbnRlciBjb25zdHJ1Y3RvcgorICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5mcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzYsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdFN0cnVjdF9BKikwKS0+c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2MCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT5ibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTYwLCAxKSwgX0MyRmllbGRJZCgmKChDMlRlc3RTdHJ1Y3RfQSopMCktPnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2MCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0U3RydWN0X0EqKTApLT55ZXNObykpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3QqKTApLT5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplU3RydWN0KikwKS0+bUZsZXhTaXplKSk7CisKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QqKTApLT5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCopMCktPm1GbGV4U2l6ZSkpOworCisgICAgLy8gbWVtYmVyIHBvaW50ZXIgY29uc3RydWN0b3IKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyMCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OmZwMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzNiwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdFN0cnVjdF9BKikwLCAmQzJUZXN0U3RydWN0X0E6OnN6KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNjAsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RTdHJ1Y3RfQSopMCwgJkMyVGVzdFN0cnVjdF9BOjpibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTYwLCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6c3RyaW5nKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjYwLCAxKSwgX0MyRmllbGRJZCgoQzJUZXN0U3RydWN0X0EqKTAsICZDMlRlc3RTdHJ1Y3RfQTo6eWVzTm8pKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCopMCwgJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjpzaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdCopMCwgJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjptRmxleFNpemUpKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKChDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QqKTAsICZDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3Q6OnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNCwgOCksIF9DMkZpZWxkSWQoKEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCopMCwgJkMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdDo6bUZsZXhTaXplKSk7CisKKyAgICAvLyBtZW1iZXIgcG9pbnRlciBzYW5zIHR5cGUgcG9pbnRlcgorICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDAsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg0LCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMjAsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI0LCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnVuc2lnbmVkNjQpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpmcDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMzYsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RTdHJ1Y3RfQTo6c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2MCwgMSksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjpibG9iKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTYwLCAxKSwgX0MyRmllbGRJZCgmQzJUZXN0U3RydWN0X0E6OnN0cmluZykpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI2MCwgMSksIF9DMkZpZWxkSWQoJkMyVGVzdFN0cnVjdF9BOjp5ZXNObykpOworCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMCwgNCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplU3RydWN0OjpzaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZVN0cnVjdDo6bUZsZXhTaXplKSk7CisKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgwLCA0KSwgX0MyRmllbGRJZCgmQzJUZXN0QmFzZUZsZXhFbmRTaXplU3RydWN0OjpzaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQsIDgpLCBfQzJGaWVsZElkKCZDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3Q6Om1GbGV4U2l6ZSkpOworCisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0QVN0cnVjdD4gQzJUZXN0QUluZm87CisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q+IEMyVGVzdEZsZXhFbmRTaXplSW5mbzsKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QsIGtQYXJhbUluZGV4VGVzdEZsZXhFbmRTaXplPiBDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZTsKKworICAgIC8vIHBvaW50ZXIgY29uc3RydWN0b3IgaW4gQzJQYXJhbQorICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+c2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI4LCA0KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnVuc2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgzMiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT51bnNpZ25lZDY0KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNDAsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+ZnAzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQ0LCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RBSW5mbyopMCktPnN6KSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoNjgsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+YmxvYikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDE2OCwgMSksIF9DMkZpZWxkSWQoJigoQzJUZXN0QUluZm8qKTApLT5zdHJpbmcpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNjgsIDEpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEFJbmZvKikwKS0+eWVzTm8pKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplSW5mbyopMCktPm0uc2lnbmVkMzIpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoJigoQzJUZXN0RmxleEVuZFNpemVJbmZvKikwKS0+bS5tRmxleFNpemUpKTsKKworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCYoKEMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlKikwKS0+bS5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgmKChDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZSopMCktPm0ubUZsZXhTaXplKSk7CisKKyAgICAvLyBtZW1iZXIgcG9pbnRlciBpbiBDMlBhcmFtCisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoOCwgNCksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OnNpZ25lZDMyKSk7CisgICAgRVhQRUNUX0VRKF9DMkZpZWxkSWQoMTIsIDgpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpzaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDI4LCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6dW5zaWduZWQzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDMyLCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6dW5zaWduZWQ2NCkpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQwLCA0KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6ZnAzMikpOworICAgIEVYUEVDVF9FUShfQzJGaWVsZElkKDQ0LCA4KSwgX0MyRmllbGRJZCgoQzJUZXN0QUluZm8qKTAsICZDMlRlc3RBSW5mbzo6c3opKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCg2OCwgMSksIF9DMkZpZWxkSWQoKEMyVGVzdEFJbmZvKikwLCAmQzJUZXN0QUluZm86OmJsb2IpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxNjgsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjpzdHJpbmcpKTsKKyAgICBFWFBFQ1RfRVEoX0MyRmllbGRJZCgyNjgsIDEpLCBfQzJGaWVsZElkKChDMlRlc3RBSW5mbyopMCwgJkMyVGVzdEFJbmZvOjp5ZXNObykpOworCisgICAgLy8gTk9URTogY2Fubm90IHVzZSBhIG1lbWJlciBwb2ludGVyIGZvciBmbGV4IHBhcmFtcyBkdWUgdG8gaW50cm9kdWN0aW9uIG9mICdtJworICAgIC8vIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZUluZm86Om0uc2lnbmVkMzIpKTsKKyAgICAvLyBFWFBFQ1RfRVEoX0MyRmllbGRJZCgxMiwgOCksIF9DMkZpZWxkSWQoJkMyVGVzdEZsZXhFbmRTaXplSW5mbzo6bS5tRmxleFNpemUpKTsKKworICAgIC8vIEVYUEVDVF9FUShfQzJGaWVsZElkKDgsIDQpLCBfQzJGaWVsZElkKCZDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZTo6bS5zaWduZWQzMikpOworICAgIC8vIEVYUEVDVF9FUShfQzJGaWVsZElkKDEyLCA4KSwgX0MyRmllbGRJZCgmQzJUZXN0RmxleEVuZFNpemVJbmZvRnJvbUJhc2U6Om0ubUZsZXhTaXplKSk7CisKKworfQorCitzdHJ1Y3QgUzMyIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCBjbGFzcyBCPXR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxUPjo6dHlwZT4KKyAgICBpbmxpbmUgUzMyKGNvbnN0IFQqKSB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIXN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlLCAic2hvdWxkIG5vdCBiZSBhbiBhcnJheSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxCLCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOworICAgIH0KK307CisKK3N0cnVjdCBGTFggeworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFQsIGNsYXNzIEI9dHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFQ+Ojp0eXBlPgorICAgIGlubGluZSBGTFgoY29uc3QgVCosIGNvbnN0IFUqKSB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19hcnJheTxUPjo6dmFsdWUsICJzaG91bGQgYmUgYW4gYXJyYXkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmV4dGVudDxUPjo6dmFsdWUgPT0gMCwgInNob3VsZCBiZSBhbiBhcnJheSBvZiAwIGV4dGVudCIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxCLCBVPjo6dmFsdWUsICJzaG91bGQgYmUgdHlwZSBVIik7CisgICAgfQorfTsKKworc3RydWN0IE1QIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBFeHBlY3RlZFUsIHR5cGVuYW1lIFVuZXhwZWN0ZWRVPgorICAgIGlubGluZSBNUChUIFU6OiosIGNvbnN0IEV4cGVjdGVkVSosIGNvbnN0IFVuZXhwZWN0ZWRVKikgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3NhbWU8VSwgVW5leHBlY3RlZFU+Ojp2YWx1ZSwgInNob3VsZCBub3QgYmUgbWVtYmVyIHBvaW50ZXIgb2YgdGhlIGJhc2UgdHlwZSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxVLCBFeHBlY3RlZFU+Ojp2YWx1ZSwgInNob3VsZCBiZSBtZW1iZXIgcG9pbnRlciBvZiB0aGUgZGVyaXZlZCB0eXBlIik7CisgICAgfQorCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVSwgdHlwZW5hbWUgVCwgdHlwZW5hbWUgQiwgdHlwZW5hbWUgRD4KKyAgICBpbmxpbmUgTVAoVCBEOjoqLCBjb25zdCBEKikgeyB9Cit9OworCit2b2lkIGNvbXBpbGVkU3RhdGljX2FycmF5VHlwZVByb3BhZ2F0aW9uVGVzdCgpIHsKKyAgICAodm9pZClTMzIoJigoQzJUZXN0RmxleEVuZFMzMlN0cnVjdCAqKTApLT5zaWduZWQzMik7CisgICAgKHZvaWQpRkxYKCYoKEMyVGVzdEZsZXhFbmRTMzJTdHJ1Y3QgKikwKS0+bUZsZXhTaWduZWQzMiwgKGludDMyX3QqKTApOworICAgICh2b2lkKUZMWCgmKChDMlRlc3RGbGV4UzMyU3RydWN0ICopMCktPm1GbGV4U2lnbmVkMzIsIChpbnQzMl90KikwKTsKKworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyVGVzdEFTdHJ1Y3Q+IEMyVGVzdEFJbmZvOworCisgICAgLy8gVFJJQ0tZOiAmZGVyaXZlZENsYXNzOjpiYXNlTWVtYmVyIGhhcyB0eXBlIG9mIGJhc2VDbGFzczo6KgorICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKCZDMlRlc3RBSW5mbzo6c2lnbmVkMzIpLCBpbnQzMl90IEMyVGVzdEFTdHJ1Y3Q6Oio+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJiYXNlIG1lbWJlciBwb2ludGVyIHNob3VsZCBoYXZlIGJhc2UgY2xhc3MgaW4gdHlwZSIpOworCisgICAgLy8gdGhlcmVmb3JlLCBtZW1iZXIgcG9pbnRlciBleHBhbmRzIHRvIGJhc2VDbGFzczo6KiBpbiB0ZW1wbGF0ZXMKKyAgICAodm9pZClNUCgmQzJUZXN0QUluZm86OnNpZ25lZDMyLAorICAgICAgICAgICAgIChDMlRlc3RBU3RydWN0KikwIC8qIGV4cGVjdGVkICovLCAoQzJUZXN0QUluZm8qKTAgLyogdW5leHBlY3RlZCAqLyk7CisgICAgLy8gYnV0IGNhbiBiZSBjYXN0IHRvIGRlcml2ZWRDbGFzczo6KgorICAgICh2b2lkKU1QKChpbnQzMl90IEMyVGVzdEFJbmZvOjoqKSZDMlRlc3RBSW5mbzo6c2lnbmVkMzIsCisgICAgICAgICAgICAgKEMyVGVzdEFJbmZvKikwIC8qIGV4cGVjdGVkICovLCAoQzJUZXN0QVN0cnVjdCopMCAvKiB1bmV4cGVjdGVkICovKTsKKworICAgIC8vIFRSSUNLWTogYmFzZUNsYXNzOjoqIGRvZXMgbm90IGF1dG9jb252ZXJ0IHRvIGRlcml2ZWRDbGFzczo6KiBldmVuIGluIHRlbXBsYXRlcworICAgIC8vICh2b2lkKU1QKCZDMlRlc3RBSW5mbzo6c2lnbmVkMzIsIChDMlRlc3RBSW5mbyopMCk7Cit9CisKK1RFU1RfRihDMlBhcmFtVGVzdCwgTWVtYmVyUG9pbnRlckNhc3QpIHsKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RBU3RydWN0PiBDMlRlc3RBSW5mbzsKKworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJUZXN0QUluZm8sIHNpZ25lZDMyKSA9PSA4LCAib2Zmc2V0IHNob3VsZCBiZSA4Iik7CisgICAgY29uc3RleHByIGludDMyX3QgQzJUZXN0QVN0cnVjdDo6KiBzMzJwdHIgPSAmQzJUZXN0QUluZm86OnNpZ25lZDMyOworICAgIGNvbnN0ZXhwciBpbnQzMl90IEMyVGVzdEFJbmZvOjoqIHMzMnB0cl9kZXJpdmVkID0gKGludDMyX3QgQzJUZXN0QVN0cnVjdDo6KikmQzJUZXN0QUluZm86OnNpZ25lZDMyOworICAgIGNvbnN0ZXhwciBpbnQzMl90IEMyVGVzdEFJbmZvOjoqIHMzMnB0cl9jYXN0MmRlcml2ZWQgPSAoaW50MzJfdCBDMlRlc3RBSW5mbzo6KilzMzJwdHI7CisgICAgQzJUZXN0QUluZm8gKmluZm8gPSAoQzJUZXN0QUluZm8gKikyNTY7CisgICAgQzJUZXN0QVN0cnVjdCAqc3RydWt0ID0gKEMyVGVzdEFTdHJ1Y3QgKilpbmZvOworICAgIGludDMyX3QgKmluZm9fczMyX2Rlcml2ZWQgPSAmKGluZm8tPipzMzJwdHJfZGVyaXZlZCk7CisgICAgaW50MzJfdCAqaW5mb19zMzJfY2FzdDJkZXJpdmVkID0gJihpbmZvLT4qczMycHRyX2Nhc3QyZGVyaXZlZCk7CisgICAgaW50MzJfdCAqaW5mb19zMzIgPSAmKGluZm8tPipzMzJwdHIpOworICAgIGludDMyX3QgKnN0cnVrdF9zMzIgPSAmKHN0cnVrdC0+KnMzMnB0cik7CisKKyAgICBFWFBFQ1RfRVEoMjU2dSwgKHVpbnRwdHJfdClpbmZvKTsKKyAgICBFWFBFQ1RfRVEoMjY0dSwgKHVpbnRwdHJfdClzdHJ1a3QpOworICAgIEVYUEVDVF9FUSgyNjR1LCAodWludHB0cl90KWluZm9fczMyX2Rlcml2ZWQpOworICAgIEVYUEVDVF9FUSgyNjR1LCAodWludHB0cl90KWluZm9fczMyX2Nhc3QyZGVyaXZlZCk7CisgICAgRVhQRUNUX0VRKDI2NHUsICh1aW50cHRyX3QpaW5mb19zMzIpOworICAgIEVYUEVDVF9FUSgyNjR1LCAodWludHB0cl90KXN0cnVrdF9zMzIpOworCisgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJUZXN0RmxleEVuZFNpemVTdHJ1Y3Q+IEMyVGVzdEZsZXhFbmRTaXplSW5mbzsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyVGVzdEZsZXhFbmRTaXplSW5mbywgbS5zaWduZWQzMikgPT0gOCwgIm9mZnNldCBzaG91bGQgYmUgOCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJUZXN0RmxleEVuZFNpemVJbmZvLCBtLm1GbGV4U2l6ZSkgPT0gMTIsICJvZmZzZXQgc2hvdWxkIGJlIDEyIik7CisKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlRlc3RCYXNlRmxleEVuZFNpemVTdHJ1Y3QsIGtQYXJhbUluZGV4VGVzdEZsZXhFbmRTaXplPiBDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyVGVzdEZsZXhFbmRTaXplSW5mb0Zyb21CYXNlLCBtLnNpZ25lZDMyKSA9PSA4LCAib2Zmc2V0IHNob3VsZCBiZSA4Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMlRlc3RGbGV4RW5kU2l6ZUluZm9Gcm9tQmFzZSwgbS5tRmxleFNpemUpID09IDEyLCAib2Zmc2V0IHNob3VsZCBiZSAxMiIpOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IFBBUkFNIFVTQUdFIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RydWN0IEMyTnVtYmVyU3RydWN0IHsKKyAgICBpbnQzMl90IG1OdW1iZXI7CisgICAgQzJOdW1iZXJTdHJ1Y3QoKSB7fQorICAgIEMyTnVtYmVyU3RydWN0KGludDMyX3QgX251bWJlcikgOiBtTnVtYmVyKF9udW1iZXIpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0MyU1RSVUNUKE51bWJlcikKKyAgICBDMkZJRUxEKG1OdW1iZXIsICJudW1iZXIiKQorfTsKKworc3RydWN0IEMyTnVtYmVyQmFzZVN0cnVjdCB7CisgICAgaW50MzJfdCBtTnVtYmVyOworICAgIEMyTnVtYmVyQmFzZVN0cnVjdCgpIHt9CisgICAgQzJOdW1iZXJCYXNlU3RydWN0KGludDMyX3QgX251bWJlcikgOiBtTnVtYmVyKF9udW1iZXIpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0JBU0VfQzJTVFJVQ1QoTnVtYmVyQmFzZSkKKyAgICBDMkZJRUxEKG1OdW1iZXIsICJudW1iZXIiKQorfTsKKworc3RydWN0IEMyTnVtYmVyc1N0cnVjdCB7CisgICAgaW50MzJfdCBtTnVtYmVyc1tdOworICAgIEMyTnVtYmVyc1N0cnVjdCgpIHt9CisKKyAgICBERUZJTkVfQU5EX0RFU0NSSUJFX0ZMRVhfQzJTVFJVQ1QoTnVtYmVycywgbU51bWJlcnMpCisgICAgQzJGSUVMRChtTnVtYmVycywgIm51bWJlcnMiKQorfTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1N0cnVjdCkgPT0gMCwgIkMyTnVtYmVyc1N0cnVjdCBoYXMgaW5jb3JyZWN0IHNpemUiKTsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJOdW1iZXJTdHJ1Y3Q+IEMyTnVtYmVySW5mbzsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMk51bWJlclN0cnVjdD4gQzJOdW1iZXJUdW5pbmc7Cit0eXBlZGVmICAgQzJQb3J0UGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyU3RydWN0PiBDMk51bWJlclBvcnRUdW5pbmc7Cit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMyTnVtYmVyU3RydWN0PiBDMk51bWJlclN0cmVhbVR1bmluZzsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyVHVuaW5nLCBDMk51bWJlcnNTdHJ1Y3Q+IEMyTnVtYmVyc1R1bmluZzsKK3R5cGVkZWYgICBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJOdW1iZXJzU3RydWN0PiBDMk51bWJlcnNQb3J0VHVuaW5nOwordHlwZWRlZiBDMlN0cmVhbVBhcmFtPEMyVHVuaW5nLCBDMk51bWJlcnNTdHJ1Y3Q+IEMyTnVtYmVyc1N0cmVhbVR1bmluZzsKKworLy8KKyNpZiAwCisKK3ZvaWQgdGVzdCgpIHsKKyAgICBDMk51bWJlclN0cnVjdCBzKDEwKTsKKyAgICAodm9pZClDMk51bWJlclN0cnVjdDo6RmllbGRMaXN0KCk7Cit9OworCit0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJUdW5pbmcsIEMySW50NjRWYWx1ZSwga1BhcmFtSW5kZXhOdW1iZXJCPiBDMk51bWJlckNvbmZpZzQ7Cit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMkludDMyVmFsdWUsIGtQYXJhbUluZGV4TnVtYmVyPiBDMk51bWJlckNvbmZpZzM7Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJUdW5pbmcsIEMyU3RyaW5nVmFsdWUsIGtQYXJhbUluZGV4TnVtYmVyPiBDMlZpZGVvTmFtZUNvbmZpZzsKKwordm9pZCB0ZXN0MygpIHsKKyAgICBDMk51bWJlckNvbmZpZzMgcygxMCk7CisgICAgcy52YWx1ZSA9IDExOworICAgIHMgPSAxMjsKKyAgICAodm9pZClDMk51bWJlckNvbmZpZzM6OkZpZWxkTGlzdCgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlZpZGVvTmFtZUNvbmZpZz4gbiA9IEMyVmlkZW9OYW1lQ29uZmlnOjpBbGxvY1NoYXJlZCgyNSk7CisgICAgc3RyY3B5KG4tPm0udmFsdWUsICJsYWpvcyIpOworICAgIEMyTnVtYmVyQ29uZmlnNCB0KGZhbHNlLCAwLCAxMSk7CisgICAgdC52YWx1ZSA9IDE1OworfTsKKworc3RydWN0IEMyTnVtYmVyc1N0cnVjdCB7CisgICAgaW50MzJfdCBtTnVtYmVyc1tdOworICAgIGVudW0geyBDT1JFX0lOREVYID0ga1BhcmFtSW5kZXhOdW1iZXIgfTsKKyAgICBjb25zdCBzdGF0aWMgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IEZpZWxkTGlzdCgpOworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gRmllbGRMaXN0KCk7CisgICAgQzJOdW1iZXJzU3RydWN0KCkge30KKworICAgIEZMRVgoQzJOdW1iZXJzU3RydWN0LCBtTnVtYmVycyk7Cit9OworCitzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJ1Y3QpID09IDAsICJ5ZXMiKTsKKworCit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMk51bWJlcnNTdHJ1Y3Q+IEMyTnVtYmVyc0luZm87CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBDMk51bWJlcnNTdHJ1Y3Q6OkZpZWxkTGlzdCgpIHsKKyAgICByZXR1cm4gX0ZJRUxEX0xJU1Q7Cit9Citjb25zdCBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gQzJOdW1iZXJzU3RydWN0OjpfRklFTERfTElTVCA9CisvLyAgICB7IHsgRkQ6OklOVDMyLCAwLCAid2lkdGhzIiB9IH07CisgICAgeyBDMkZpZWxkRGVzY3JpcHRvcigmKChDMk51bWJlcnNTdHJ1Y3QqKShudWxscHRyKSktPm1OdW1iZXJzLCAibnVtYmVyIikgfTsKKwordHlwZWRlZiBDMlBvcnRQYXJhbTxDMlR1bmluZywgQzJOdW1iZXJTdHJ1Y3Q+IEMyTnVtYmVyQ29uZmlnOworCitzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gbXlMaXN0ID0gQzJOdW1iZXJDb25maWc6OkZpZWxkTGlzdCgpOworCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBfX3Rlc3RfZGVzY3JpYmUodWludDMyX3QgcGFyYW1UeXBlKSB7CisgICAgICAgIHN0ZDo6bGlzdDxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gZGVzY3JpYmVDMlBhcmFtczxDMk51bWJlckNvbmZpZz4oKTsKKworICAgICAgICBhdXRvIHdpZHRocyA9IEMyTnVtYmVyc0luZm86OkFsbG9jU2hhcmVkKDUpOworICAgICAgICB3aWR0aHMtPmZsZXhDb3VudCgpOworICAgICAgICB3aWR0aHMtPm0ubU51bWJlcnNbNF0gPSAxOworCisgICAgICAgIHRlc3QoKTsKKyAgICAgICAgdGVzdDMoKTsKKworICAgICAgICBDMk51bWJlckNvbmZpZyBvdXRwdXRXaWR0aChmYWxzZSwgMTIzKTsKKworICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleChwYXJhbVR5cGUpOworICAgICAgICBzd2l0Y2ggKHBhcmFtVHlwZSkgeworICAgICAgICBjYXNlIEMyTnVtYmVyQ29uZmlnOjpDT1JFX0lOREVYOgorICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4obmV3IEMyUGFyYW1EZXNjcmlwdG9yeworICAgICAgICAgICAgICAgIHRydWUgLyogaXNSZXF1aXJlZCAqLywKKyAgICAgICAgICAgICAgICAibnVtYmVyIiwKKyAgICAgICAgICAgICAgICBpbmRleCwKKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZgorLy8KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgY2FuU2V0UG9ydChUICZvLCBib29sIG91dHB1dCkgeyByZXR1cm4gby5zZXRQb3J0KG91dHB1dCk7IH0KK2Jvb2wgY2FuU2V0UG9ydCguLi4pIHsgcmV0dXJuIGZhbHNlOyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFMsIHR5cGVuYW1lPWRlY2x0eXBlKCgoUyopMCktPnNldFBvcnQodHJ1ZSkpPgorc3RhdGljIHN0ZDo6dHJ1ZV90eXBlIF9jYW5DYWxsU2V0UG9ydChpbnQpOwordGVtcGxhdGU8dHlwZW5hbWU+CitzdGF0aWMgc3RkOjpmYWxzZV90eXBlIF9jYW5DYWxsU2V0UG9ydCguLi4pOworI2RlZmluZSBjYW5DYWxsU2V0UG9ydCh4KSBkZWNsdHlwZShfY2FuQ2FsbFNldFBvcnQ8c3RkOjpyZW1vdmVfcmVmZXJlbmNlPGRlY2x0eXBlKHgpPjo6dHlwZT4oMCkpOjp2YWx1ZQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gU1RBVElDIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitzdGF0aWNfYXNzZXJ0KF9DMkNvbXBhcmFibGU8aW50Pjo6dmFsdWUsICJpbnQgaXMgbm90IGNvbXBhcmFibGUiKTsKK3N0YXRpY19hc3NlcnQoIV9DMkNvbXBhcmFibGU8dm9pZD46OnZhbHVlLCAidm9pZCBpcyBjb21wYXJhYmxlIik7CisKK3N0cnVjdCBDMl9ISURFIF90ZXN0MCB7CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IF90ZXN0MCYpOworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfdGVzdDAmKTsKK307CitzdHJ1Y3QgQzJfSElERSBfdGVzdDEgeworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfdGVzdDEmKTsKK307CitzdHJ1Y3QgQzJfSElERSBfdGVzdDIgeworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBfdGVzdDImKTsKK307CitzdGF0aWNfYXNzZXJ0KF9DMkNvbXBhcmFibGU8X3Rlc3QwPjo6dmFsdWUsICJjbGFzcyB3aXRoID09IGFuZCAhPSBpcyBub3QgY29tcGFyYWJsZSIpOworc3RhdGljX2Fzc2VydChfQzJDb21wYXJhYmxlPF90ZXN0MT46OnZhbHVlLCAiY2xhc3Mgd2l0aCA9PSBpcyBub3QgY29tcGFyYWJsZSIpOworc3RhdGljX2Fzc2VydChfQzJDb21wYXJhYmxlPF90ZXN0Mj46OnZhbHVlLCAiY2xhc3Mgd2l0aCAhPSBpcyBub3QgY29tcGFyYWJsZSIpOworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gQzJQQVJBTSBURVNUUyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RydWN0IF9DMlBhcmFtSW5zcGVjdG9yIHsKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNUZXN0KCk7CisgICAgc3RhdGljIHZvaWQgU3RhdGljRnJvbUJhc2VUZXN0KCk7CisgICAgc3RhdGljIHZvaWQgU3RhdGljRmxleFRlc3QoKTsKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNGbGV4RnJvbUJhc2VUZXN0KCk7Cit9OworCisvLyBURVNUX0YoX0MyUGFyYW1JbnNwZWN0b3IsIFN0YXRpY1Rlc3QpIHsKK3ZvaWQgX0MyUGFyYW1JbnNwZWN0b3I6OlN0YXRpY1Rlc3QoKSB7CisgICAgdHlwZWRlZiBDMlBhcmFtOjpJbmRleCBJOworCisgICAgLy8gQzJOdW1iZXJTdHJ1Y3Q6IENPUkVfSU5ERVggPSBrSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVggPT0ga1BhcmFtSW5kZXhOdW1iZXIsICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclN0cnVjdCkgPT0gNCwgImJhZCBzaXplIik7CisKKyAgICAvLyBDMk51bWJlclR1bmluZzogICAgICAgICAgICAga0luZGV4IHwgdHVuIHwgZ2xvYmFsICAgICAgICAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyVHVuaW5nOjpDT1JFX0lOREVYID09IGtQYXJhbUluZGV4TnVtYmVyLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclR1bmluZzo6UEFSQU1fVFlQRSA9PSAoa1BhcmFtSW5kZXhOdW1iZXIgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9HTE9CQUwpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJUdW5pbmcpID09IDEyLCAiYmFkIHNpemUiKTsKKworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJUdW5pbmcsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclR1bmluZywgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyVHVuaW5nLCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworCisgICAgLy8gQzJOdW1iZXJQb3J0VHVuaW5nOiAgICAgICAgIGtJbmRleCB8IHR1biB8IHBvcnQgICAgICAgICAgICAgKGJvb2wsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJQb3J0VHVuaW5nKSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgLy8gQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDogIGtJbmRleCB8IHR1biB8IHBvcnQgfCBpbnB1dCAgICAgKGFyZ3MpCisgICAgLy8gQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6IGtJbmRleCB8IHR1biB8IHBvcnQgfCBvdXRwdXQgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICBrUGFyYW1JbmRleE51bWJlciwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TnVtYmVyIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfSU5QVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAga1BhcmFtSW5kZXhOdW1iZXIsICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhOdW1iZXIgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9PVVRQVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk51bWJlclN0cmVhbVR1bmluZzogICAgICAga0luZGV4IHwgdHVuIHwgc3RyICAgICAgICAgICAgICAoYm9vbCwgdWludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlclN0cmVhbVR1bmluZykgPT0gMTJ1LCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQga0luZGV4IHwgdHVuIHwgc3RyIHwgaW5wdXQgICAgICAoaW50LCBhcmdzKQorICAgIC8vIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQga0l4ICAgfCB0dW4gfCBzdHIgfCBvdXRwdXQgICAgIChpbnQsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TnVtYmVyLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE51bWJlciB8IEk6OktJTkRfVFVOSU5HIHwgSTo6RElSX0lOUFVUIHwgSTo6SVNfU1RSRUFNX0ZMQUcpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICBrUGFyYW1JbmRleE51bWJlciwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TnVtYmVyIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfT1VUUFVUIHwgSTo6SVNfU1RSRUFNX0ZMQUcpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0KSA9PSAxMnUsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQpID09IDEydSwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7Cit9CisKK3ZvaWQgX0MyUGFyYW1JbnNwZWN0b3I6OlN0YXRpY0Zyb21CYXNlVGVzdCgpIHsKKyAgICBlbnVtIHsga1BhcmFtSW5kZXhNeSA9IDMxMDIgfTsKKyAgICB0eXBlZGVmIEMyTnVtYmVyQmFzZVN0cnVjdCBDMk15U3RydWN0OworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlTZXR0aW5nOworICAgIHR5cGVkZWYgICBDMlBvcnRQYXJhbTxDMlNldHRpbmcsIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlQb3J0U2V0dGluZzsKKyAgICB0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJTZXR0aW5nLCBDMk15U3RydWN0LCBrUGFyYW1JbmRleE15PiBDMk15U3RyZWFtU2V0dGluZzsKKworICAgIHR5cGVkZWYgQzJQYXJhbTo6SW5kZXggSTsKKworICAgIC8vIEMyTXlTdHJ1Y3QgaGFzIG5vIENPUkVfSU5ERVgKKyAgICAvL3N0YXRpY19hc3NlcnQoQzJNeVN0cnVjdDo6Q09SRV9JTkRFWCA9PSBrUGFyYW1JbmRleE15LCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVN0cnVjdCkgPT0gNCwgImJhZCBzaXplIik7CisKKyAgICAvLyBDMk15U2V0dGluZzogICAgICAgICAgICAga0luZGV4IHwgdHVuIHwgZ2xvYmFsICAgICAgICAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTZXR0aW5nOjpDT1JFX0lOREVYID09IGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTZXR0aW5nOjpQQVJBTV9UWVBFID09IChrUGFyYW1JbmRleE15IHwgSTo6S0lORF9TRVRUSU5HIHwgSTo6RElSX0dMT0JBTCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U2V0dGluZykgPT0gMTIsICJiYWQgc2l6ZSIpOworCisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U2V0dGluZywgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTZXR0aW5nLCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVNldHRpbmcsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk15UG9ydFNldHRpbmc6ICAgICAgICAga0luZGV4IHwgdHVuIHwgcG9ydCAgICAgICAgICAgICAoYm9vbCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15UG9ydFNldHRpbmcpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk15UG9ydFNldHRpbmc6OmlucHV0OiAga0luZGV4IHwgdHVuIHwgcG9ydCB8IGlucHV0ICAgICAoYXJncykKKyAgICAvLyBDMk15UG9ydFNldHRpbmc6Om91dHB1dDoga0luZGV4IHwgdHVuIHwgcG9ydCB8IG91dHB1dCAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0U2V0dGluZzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0U2V0dGluZzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE15IHwgSTo6S0lORF9TRVRUSU5HIHwgSTo6RElSX0lOUFVUKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRTZXR0aW5nOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0U2V0dGluZzo6b3V0cHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoa1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfU0VUVElORyB8IEk6OkRJUl9PVVRQVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVBvcnRTZXR0aW5nOjppbnB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlQb3J0U2V0dGluZzo6b3V0cHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydFNldHRpbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRTZXR0aW5nOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0U2V0dGluZzo6aW5wdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydFNldHRpbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0U2V0dGluZzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRTZXR0aW5nOjpvdXRwdXQsIG1OdW1iZXIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk15U3RyZWFtU2V0dGluZzogICAgICAga0luZGV4IHwgdHVuIHwgc3RyICAgICAgICAgICAgICAoYm9vbCwgdWludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RyZWFtU2V0dGluZykgPT0gMTJ1LCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk15U3RyZWFtU2V0dGluZzo6aW5wdXQga0luZGV4IHwgdHVuIHwgc3RyIHwgaW5wdXQgICAgICAoaW50LCBhcmdzKQorICAgIC8vIEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQga0l4ICAgfCB0dW4gfCBzdHIgfCBvdXRwdXQgICAgIChpbnQsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk15U3RyZWFtU2V0dGluZzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1TZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRSA9PQorICAgICAgICAgICAgICAgICAgKGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX1NFVFRJTkcgfCBJOjpESVJfSU5QVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIGtQYXJhbUluZGV4TXksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChrUGFyYW1JbmRleE15IHwgSTo6S0lORF9TRVRUSU5HIHwgSTo6RElSX09VVFBVVCB8IEk6OklTX1NUUkVBTV9GTEFHKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJlYW1TZXR0aW5nOjppbnB1dCkgPT0gMTJ1LCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RyZWFtU2V0dGluZzo6b3V0cHV0KSA9PSAxMnUsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbVNldHRpbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbVNldHRpbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbVNldHRpbmc6OmlucHV0LCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbVNldHRpbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1TZXR0aW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtU2V0dGluZzo6b3V0cHV0LCBtTnVtYmVyKSA9PSA4LCAiYmFkIG9mZnNldCIpOworfQorCit2b2lkIF9DMlBhcmFtSW5zcGVjdG9yOjpTdGF0aWNGbGV4VGVzdCgpIHsKKyAgICB0eXBlZGVmIEMyUGFyYW06OkluZGV4IEk7CisKKyAgICAvLyBDMk51bWJlcnNTdHJ1Y3Q6IENPUkVfSU5ERVggPSBrSW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYID09IChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzU3RydWN0KSA9PSAwLCAiYmFkIHNpemUiKTsKKworICAgIC8vIEMyTnVtYmVyc1R1bmluZzogICAgICAgICAgICAga0luZGV4IHwgdHVuIHwgZ2xvYmFsICAgICAgICAgICAoYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1R1bmluZzo6Q09SRV9JTkRFWCA9PSAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzVHVuaW5nOjpQQVJBTV9UWVBFID09IChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9HTE9CQUwpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzVHVuaW5nKSA9PSA4LCAiYmFkIHNpemUiKTsKKworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzVHVuaW5nLCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzVHVuaW5nLCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzVHVuaW5nLCBtLm1OdW1iZXJzKSA9PSA4LCAiYmFkIG9mZnNldCIpOworCisgICAgLy8gQzJOdW1iZXJzUG9ydFR1bmluZzogICAgICAgICBrSW5kZXggfCB0dW4gfCBwb3J0ICAgICAgICAgICAgIChib29sLCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1BvcnRUdW5pbmcpID09IDgsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OiAga0luZGV4IHwgdHVuIHwgcG9ydCB8IGlucHV0ICAgICAoYXJncykKKyAgICAvLyBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6IGtJbmRleCB8IHR1biB8IHBvcnQgfCBvdXRwdXQgICAgKGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TnVtYmVycyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfSU5QVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9PVVRQVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQpID09IDgsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dCkgPT0gOCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQsIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk51bWJlcnNTdHJlYW1UdW5pbmc6ICAgICAgIGtJbmRleCB8IHR1biB8IHN0ciAgICAgICAgICAgICAgKGJvb2wsIHVpbnQsIGFyZ3MpCisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nKSA9PSA4LCAiYmFkIHNpemUiKTsKKyAgICAvLyBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0IGtJbmRleCB8IHR1biB8IHN0ciB8IGlucHV0ICAgICAgKGludCwgYXJncykKKyAgICAvLyBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCBrSXggICB8IHR1biB8IHN0ciB8IG91dHB1dCAgICAgKGludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkNPUkVfSU5ERVggPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzIHwgSTo6S0lORF9UVU5JTkcgfCBJOjpESVJfSU5QVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhOdW1iZXJzKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE51bWJlcnMgfCBJOjpLSU5EX1RVTklORyB8IEk6OkRJUl9PVVRQVVQgfCBJOjpJU19TVFJFQU1fRkxBRyksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0KSA9PSA4LCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCkgPT0gOCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQsIG0ubU51bWJlcnMpID09IDgsICJiYWQgb2Zmc2V0Iik7Cit9CisKK3RlbXBsYXRlPGJvb2wsIHVuc2lnbmVkIC4uLk4+CitzdHJ1Y3QgX3ByaW50X2FzX3dhcm5pbmcgeyB9OworCit0ZW1wbGF0ZTx1bnNpZ25lZCAuLi5OPgorc3RydWN0IF9wcmludF9hc193YXJuaW5nPHRydWUsIE4uLi4+IDogc3RkOjp0cnVlX3R5cGUgeyB9OworCisjZGVmaW5lIHN0YXRpY19hc3NlcnRfZXF1YWxzKGEsIGIsIG1zZykgXAorc3RhdGljX2Fzc2VydChfcHJpbnRfYXNfd2FybmluZzwoYSkgPT0gKGIpLCBhLCBiPjo6dmFsdWUsIG1zZykKKwordm9pZCBfQzJQYXJhbUluc3BlY3Rvcjo6U3RhdGljRmxleEZyb21CYXNlVGVzdCgpIHsKKyAgICBlbnVtIHsga1BhcmFtSW5kZXhNeSA9IDEyMDMgfTsKKyAgICB0eXBlZGVmIEMyVGVzdEJhc2VGbGV4RW5kU2l6ZVN0cnVjdCBDMk15U3RydWN0OworICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMkluZm8sIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlJbmZvOworICAgIHR5cGVkZWYgICBDMlBvcnRQYXJhbTxDMkluZm8sIEMyTXlTdHJ1Y3QsIGtQYXJhbUluZGV4TXk+IEMyTXlQb3J0SW5mbzsKKyAgICB0eXBlZGVmIEMyU3RyZWFtUGFyYW08QzJJbmZvLCBDMk15U3RydWN0LCBrUGFyYW1JbmRleE15PiBDMk15U3RyZWFtSW5mbzsKKworICAgIHR5cGVkZWYgQzJQYXJhbTo6SW5kZXggSTsKKworICAgIC8vIEMyTXlTdHJ1Y3QgaGFzIG5vIENPUkVfSU5ERVgKKyAgICAvL3N0YXRpY19hc3NlcnQoQzJNeVN0cnVjdDo6Q09SRV9JTkRFWCA9PSAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RydWN0KSA9PSA0LCAiYmFkIHNpemUiKTsKKworICAgIC8vIEMyTXlJbmZvOiAgICAgICAgICAgICBrSW5kZXggfCB0dW4gfCBnbG9iYWwgICAgICAgICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnRfZXF1YWxzKEMyTXlJbmZvOjpDT1JFX0lOREVYLCAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0X2VxdWFscyhDMk15SW5mbzo6UEFSQU1fVFlQRSwgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkgfCBJOjpLSU5EX0lORk8gfCBJOjpESVJfR0xPQkFMKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlJbmZvKSA9PSAxMiwgImJhZCBzaXplIik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlJbmZvLCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeUluZm8sIF9tSW5kZXgpID09IDQsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15SW5mbywgbS5zaWduZWQzMikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKworICAgIC8vIEMyTXlQb3J0SW5mbzogICAgICAgICBrSW5kZXggfCB0dW4gfCBwb3J0ICAgICAgICAgICAgIChib29sLCBhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlQb3J0SW5mbykgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTXlQb3J0SW5mbzo6aW5wdXQ6ICBrSW5kZXggfCB0dW4gfCBwb3J0IHwgaW5wdXQgICAgIChhcmdzKQorICAgIC8vIEMyTXlQb3J0SW5mbzo6b3V0cHV0OiBrSW5kZXggfCB0dW4gfCBwb3J0IHwgb3V0cHV0ICAgIChhcmdzKQorICAgIHN0YXRpY19hc3NlcnQoQzJNeVBvcnRJbmZvOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15UG9ydEluZm86OmlucHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfSU5GTyB8IEk6OkRJUl9JTlBVVCksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0SW5mbzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlQb3J0SW5mbzo6b3V0cHV0OjpQQVJBTV9UWVBFID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSB8IEk6OktJTkRfSU5GTyB8IEk6OkRJUl9PVVRQVVQpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQzJNeVBvcnRJbmZvOjppbnB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlQb3J0SW5mbzo6b3V0cHV0KSA9PSAxMiwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydEluZm86OmlucHV0LCBfbVNpemUpID09IDAsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRJbmZvOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0SW5mbzo6aW5wdXQsIG0uc2lnbmVkMzIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15UG9ydEluZm86Om91dHB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlQb3J0SW5mbzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVBvcnRJbmZvOjpvdXRwdXQsIG0uc2lnbmVkMzIpID09IDgsICJiYWQgb2Zmc2V0Iik7CisKKyAgICAvLyBDMk15U3RyZWFtSW5mbzogICAgICAga0luZGV4IHwgdHVuIHwgc3RyICAgICAgICAgICAgICAoYm9vbCwgdWludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihDMk15U3RyZWFtSW5mbykgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIC8vIEMyTXlTdHJlYW1JbmZvOjppbnB1dCBrSW5kZXggfCB0dW4gfCBzdHIgfCBpbnB1dCAgICAgIChpbnQsIGFyZ3MpCisgICAgLy8gQzJNeVN0cmVhbUluZm86Om91dHB1dCBrSXggICB8IHR1biB8IHN0ciB8IG91dHB1dCAgICAgKGludCwgYXJncykKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1JbmZvOjppbnB1dDo6Q09SRV9JTkRFWCA9PQorICAgICAgICAgICAgICAgICAgKEk6OklTX0ZMRVhfRkxBRyB8IGtQYXJhbUluZGV4TXkpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15U3RyZWFtSW5mbzo6aW5wdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15IHwgSTo6S0lORF9JTkZPIHwgSTo6RElSX0lOUFVUIHwgSTo6SVNfU1RSRUFNX0ZMQUcpLCAiYmFkIGluZGV4Iik7CisgICAgc3RhdGljX2Fzc2VydChDMk15U3RyZWFtSW5mbzo6b3V0cHV0OjpDT1JFX0lOREVYID09CisgICAgICAgICAgICAgICAgICAoSTo6SVNfRkxFWF9GTEFHIHwga1BhcmFtSW5kZXhNeSksICJiYWQgaW5kZXgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KEMyTXlTdHJlYW1JbmZvOjpvdXRwdXQ6OlBBUkFNX1RZUEUgPT0KKyAgICAgICAgICAgICAgICAgIChJOjpJU19GTEVYX0ZMQUcgfCBrUGFyYW1JbmRleE15IHwgSTo6S0lORF9JTkZPIHwgSTo6RElSX09VVFBVVCB8IEk6OklTX1NUUkVBTV9GTEFHKSwgImJhZCBpbmRleCIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJlYW1JbmZvOjppbnB1dCkgPT0gMTIsICJiYWQgc2l6ZSIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKEMyTXlTdHJlYW1JbmZvOjpvdXRwdXQpID09IDEyLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1JbmZvOjppbnB1dCwgX21TaXplKSA9PSAwLCAiYmFkIHNpemUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1JbmZvOjppbnB1dCwgX21JbmRleCkgPT0gNCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1JbmZvOjppbnB1dCwgbS5zaWduZWQzMikgPT0gOCwgImJhZCBvZmZzZXQiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KG9mZnNldG9mKEMyTXlTdHJlYW1JbmZvOjpvdXRwdXQsIF9tU2l6ZSkgPT0gMCwgImJhZCBzaXplIik7CisgICAgc3RhdGljX2Fzc2VydChvZmZzZXRvZihDMk15U3RyZWFtSW5mbzo6b3V0cHV0LCBfbUluZGV4KSA9PSA0LCAiYmFkIG9mZnNldCIpOworICAgIHN0YXRpY19hc3NlcnQob2Zmc2V0b2YoQzJNeVN0cmVhbUluZm86Om91dHB1dCwgbS5zaWduZWQzMikgPT0gOCwgImJhZCBvZmZzZXQiKTsKK30KKworVEVTVF9GKEMyUGFyYW1UZXN0LCBQYXJhbU9wc1Rlc3QpIHsKKyAgICBjb25zdCBDMk51bWJlclN0cnVjdCBzdHIoMTAwKTsKKyAgICBDMk51bWJlclN0cnVjdCBic3RyOworCisgICAgeworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBzdHIubU51bWJlcik7CisgICAgICAgIGJzdHIubU51bWJlciA9IDEwMDsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWDsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgIH0KKworICAgIGNvbnN0IEMyTnVtYmVyVHVuaW5nIHR1bigxMDApOworICAgIEMyTnVtYmVyVHVuaW5nIGJ0dW47CisKKyAgICB7CisgICAgICBDMk51bWJlckluZm8gaW5mKDEwMCk7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzVHVuaW5nPiB0dW5fID0gQzJOdW1iZXJzVHVuaW5nOjpBbGxvY1VuaXF1ZSgxKTsKKworICAgICAgRVhQRUNUX0VRKHR1bi5jb3JlSW5kZXgoKSwgaW5mLmNvcmVJbmRleCgpKTsKKyAgICAgIEVYUEVDVF9ORSh0dW4uY29yZUluZGV4KCksIHR1bl8tPmNvcmVJbmRleCgpKTsKKyAgICAgIEVYUEVDVF9ORSh0dW4udHlwZSgpLCBpbmYudHlwZSgpKTsKKyAgICAgIEVYUEVDVF9ORSh0dW4udHlwZSgpLCB0dW5fLT50eXBlKCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgLy8gZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IHR1biwgYnR1biB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuaXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvck91dHB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclBvcnQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB2YWx1ZQorICAgICAgICBFWFBFQ1RfRVEoMTAwLCB0dW4ubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBidHVuLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHVuID09IGJ0dW4pOworICAgICAgICBFWFBFQ1RfRkFMU0UodHVuLm9wZXJhdG9yPT0oYnR1bikpOworICAgICAgICBFWFBFQ1RfVFJVRSh0dW4gIT0gYnR1bik7CisgICAgICAgIEVYUEVDVF9UUlVFKHR1bi5vcGVyYXRvciE9KGJ0dW4pKTsKKyAgICAgICAgYnR1bi5tTnVtYmVyID0gMTAwOworICAgICAgICBFWFBFQ1RfRVEodHVuLCBidHVuKTsKKworICAgICAgICAvLyBpbmRleAorICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZSh0dW4udHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZSh0dW4udHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEodHVuLnR5cGUoKSwgQzJOdW1iZXJUdW5pbmc6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEodHVuLnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyVHVuaW5nOjpDT1JFX0lOREVYOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisKKyAgICAgICAgQzJQYXJhbTo6VHlwZSB0eXBlID0gQzJOdW1iZXJUdW5pbmc6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZ0dW4pLCAmdHVuKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmdHVuKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmdHVuKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZ0dW4pLCBudWxscHRyKTsKKworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KGJ0dW4pKSwgYnR1bik7CisgICAgICAgIGJ0dW4uaW52YWxpZGF0ZSgpOworICAgICAgICBFWFBFQ1RfRkFMU0UoQzJQYXJhbTo6Q29weShidHVuKSk7CisgICAgfQorCisgICAgY29uc3QgQzJOdW1iZXJQb3J0VHVuaW5nIG91dHAxKHRydWUsIDEwMCksIGlucDEoZmFsc2UsIDEwMCk7CisgICAgQzJOdW1iZXJQb3J0VHVuaW5nIGJvdXRwMSwgYmlucDEsIGJpbnAzKGZhbHNlLCAxMDApOworICAgIGNvbnN0IEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQgaW5wMigxMDApOworICAgIEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQgYmlucDI7CisgICAgY29uc3QgQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQgb3V0cDIoMTAwKTsKKyAgICBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dCBib3V0cDI7CisKKyAgICBFWFBFQ1RfRVEoaW5wMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEob3V0cDEuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKGJpbnAxLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShib3V0cDEuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKGlucDIuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKG91dHAyLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworCisgICAgRVhQRUNUX0VRKGlucDEudHlwZSgpLCBpbnAyLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKG91dHAxLnR5cGUoKSwgb3V0cDIudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5wMS50eXBlKCksIG91dHAxLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGlucDIudHlwZSgpLCBvdXRwMi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnAxLnR5cGUoKSwgYmlucDEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUob3V0cDEudHlwZSgpLCBib3V0cDEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5wMS50eXBlKCksIHR1bi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnAyLnR5cGUoKSwgdHVuLnR5cGUoKSk7CisKKyAgICB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoYmlucDMpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydChiaW5wMSksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydChpbnAxKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGlucDIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCAmIHR5cGUpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGJpbnAyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAodHlwZSkiKTsKKworICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0cDEsIGlucDEsIGJvdXRwMSB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IGlucDIsIGJpbnAyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0cDIsIGJvdXRwMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yUG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBvcnQgc3BlY2lmaWMgZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBFWFBFQ1RfRkFMU0Uob3V0cDEuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxLmZvck91dHB1dCgpKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnAxLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5wMS5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRwMSwgaW5wMSB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAwLCBwLm1OdW1iZXIpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0cDIsIGJvdXRwMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBpbnAyLCBiaW5wMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JPdXRwdXQoKSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBib3V0cDEgfSApIHsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKCFwKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JPdXRwdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMCwgcC5tTnVtYmVyKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlcworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBpbnAyLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBvdXRwMi5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnAxLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmlucDIubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0cDEubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0cDIubU51bWJlcik7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSAhPSBvdXRwMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGlucDEgPT0gaW5wMik7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxID09IG91dHAyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoYmlucDEgPT0gYm91dHAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoYmlucDIgIT0gYm91dHAyKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnAxICE9IGJpbnAxKTsKKyAgICAgICAgYmlucDEubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSAhPSBiaW5wMSk7CisgICAgICAgIGJpbnAxLnNldFBvcnQoZmFsc2UgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpYmlucDEpOworICAgICAgICBFWFBFQ1RfRkFMU0UoIWJpbnAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMSA9PSBiaW5wMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5wMiAhPSBiaW5wMik7CisgICAgICAgIGJpbnAyLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKGlucDIgPT0gYmlucDIpOworCisgICAgICAgIGJpbnAxLnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMSA9PSBiaW5wMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0cDEgIT0gYm91dHAxKTsKKyAgICAgICAgYm91dHAxLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAxICE9IGJvdXRwMSk7CisgICAgICAgIGJvdXRwMS5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpYm91dHAxKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKCFib3V0cDEpOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMSA9PSBib3V0cDEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKG91dHAyICE9IGJvdXRwMik7CisgICAgICAgIGJvdXRwMi5tTnVtYmVyID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMiA9PSBib3V0cDIpOworCisgICAgICAgIGJvdXRwMS5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKGlucDEgPT0gYm91dHAxKTsKKworICAgICAgICAvLyBpbmRleAorICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnAxLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5wMS50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbnAxLnR5cGUoKSwgQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUShpbnAxLnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDIudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnAyLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDIudHlwZSgpLCBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDIuc3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDEudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMS50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShvdXRwMS50eXBlKCksIEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAxLnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAyLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDIudHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEob3V0cDIudHlwZSgpLCBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUShvdXRwMi5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisKKyAgICAgICAgaW5kZXggPSBDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworCisgICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICB0eXBlID0gQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20obnVsbHB0ciksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJmlucDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZpbnAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmb3V0cDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZvdXRwMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZpbnAxKSwgJmlucDEpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZpbnAyKSwgKEMyTnVtYmVyUG9ydFR1bmluZyopJmlucDIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZvdXRwMSksICZvdXRwMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJm91dHAyKSwgKEMyTnVtYmVyUG9ydFR1bmluZyopJm91dHAyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJmlucDEpLCAoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dCopJmlucDEpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmaW5wMiksICZpbnAyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHAxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRwMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJmlucDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0cDEpLCAoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQqKSZvdXRwMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0cDIpLCAmb3V0cDIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJmlucDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZpbnAyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmb3V0cDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZvdXRwMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKCZpbnAxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJmlucDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0cDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0cDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJmlucDEpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJmlucDIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHAxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRwMiksIG51bGxwdHIpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoaW5wMSkpLCBpbnAxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShpbnAyKSksIGlucDIpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KG91dHAxKSksIG91dHAxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShvdXRwMikpLCBvdXRwMik7CisgICAgfQorCisgICAgY29uc3QgQzJOdW1iZXJTdHJlYW1UdW5pbmcgb3V0czEodHJ1ZSwgMXUsIDEwMCksIGluczEoZmFsc2UsIDF1LCAxMDApOworICAgIEMyTnVtYmVyU3RyZWFtVHVuaW5nIGJvdXRzMSwgYmluczEsIGJpbnMzKGZhbHNlLCAxdSwgMTAwKTsKKyAgICBjb25zdCBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQgaW5zMigxdSwgMTAwKTsKKyAgICBDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQgYmluczI7CisgICAgY29uc3QgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dCBvdXRzMigxdSwgMTAwKTsKKyAgICBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0IGJvdXRzMjsKKworICAgIEVYUEVDVF9FUShpbnMxLmNvcmVJbmRleCgpLCB0dW4uY29yZUluZGV4KCkpOworICAgIEVYUEVDVF9FUShvdXRzMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEoYmluczEuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisgICAgRVhQRUNUX0VRKGJvdXRzMS5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEoaW5zMi5jb3JlSW5kZXgoKSwgdHVuLmNvcmVJbmRleCgpKTsKKyAgICBFWFBFQ1RfRVEob3V0czIuY29yZUluZGV4KCksIHR1bi5jb3JlSW5kZXgoKSk7CisKKyAgICBFWFBFQ1RfRVEoaW5zMS50eXBlKCksIGluczIudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoaW5zMS50eXBlKCksIGJpbnMyLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKG91dHMxLnR5cGUoKSwgb3V0czIudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEob3V0czEudHlwZSgpLCBib3V0czIudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5zMS50eXBlKCksIG91dHMxLnR5cGUoKSk7CisgICAgRVhQRUNUX05FKGluczIudHlwZSgpLCBvdXRzMi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnMxLnR5cGUoKSwgYmluczEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUob3V0czEudHlwZSgpLCBib3V0czEudHlwZSgpKTsKKyAgICBFWFBFQ1RfTkUoaW5zMS50eXBlKCksIHR1bi50eXBlKCkpOworICAgIEVYUEVDVF9ORShpbnMyLnR5cGUoKSwgdHVuLnR5cGUoKSk7CisKKyAgICB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoYmluczMpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydChiaW5zMSksICJzaG91bGQgYmUgYWJsZSB0byIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydChpbnMxKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGluczIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCAmIHR5cGUpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KGJpbnMyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAodHlwZSkiKTsKKworICAgICAgICAvLyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0czEsIGluczEsIGJvdXRzMSB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IGluczIsIGJpbnMyIH0pIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAuc2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JQb3J0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgb3V0czIsIGJvdXRzMiB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yUG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBvcnQgc3BlY2lmaWMgZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBFWFBFQ1RfRkFMU0Uob3V0czEuZm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxLmZvck91dHB1dCgpKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5zMS5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZwIDogeyBvdXRzMSwgaW5zMSB9KSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbClwKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghcCk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAwLCBwLm1OdW1iZXIpOworICAgICAgICAgICAgRVhQRUNUX0VRKDF1LCBwLnN0cmVhbSgpKTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnAgOiB7IG91dHMyLCBib3V0czIgfSkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpcCk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoIXApOworCisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAuZm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgaW5zMiwgYmluczIgfSkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpcCk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoIXApOworCisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcCA6IHsgYm91dHMxIH0gKSB7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoKGJvb2wpcCk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSghcCk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAuZm9yT3V0cHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDAsIHAubU51bWJlcik7CisgICAgICAgIH0KKworICAgICAgICAvLyB2YWx1ZXMKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgaW5zMi5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgb3V0czIubU51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBiaW5zMS5tTnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnMyLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHMxLm1OdW1iZXIpOworICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHMyLm1OdW1iZXIpOworCisgICAgICAgIEVYUEVDVF9FUSgxdSwgaW5zMi5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgb3V0czIuc3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJpbnMxLnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBiaW5zMi5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYm91dHMxLnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBib3V0czIuc3RyZWFtKCkpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgIT0gb3V0czEpOworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxID09IGluczIpOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMSA9PSBvdXRzMik7CisgICAgICAgIEVYUEVDVF9UUlVFKGJpbnMxID09IGJvdXRzMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGJpbnMyICE9IGJvdXRzMik7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMSAhPSBiaW5zMSk7CisgICAgICAgIGJpbnMxLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgIT0gYmluczEpOworICAgICAgICBiaW5zMS5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgIT0gYmluczEpOworICAgICAgICBiaW5zMS5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRShpbnMxID09IGJpbnMxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRShpbnMyICE9IGJpbnMyKTsKKyAgICAgICAgYmluczIubU51bWJlciA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMiAhPSBiaW5zMik7CisgICAgICAgIGJpbnMyLnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczIgPT0gYmluczIpOworCisgICAgICAgIGJpbnMxLnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMSA9PSBiaW5zMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEgIT0gYm91dHMxKTsKKyAgICAgICAgYm91dHMxLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxICE9IGJvdXRzMSk7CisgICAgICAgIGJvdXRzMS5zZXRQb3J0KHRydWUgLyogb3V0cHV0ICovKTsKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czEgIT0gYm91dHMxKTsKKyAgICAgICAgYm91dHMxLnNldFN0cmVhbSgxdSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxID09IGJvdXRzMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUob3V0czIgIT0gYm91dHMyKTsKKyAgICAgICAgYm91dHMyLm1OdW1iZXIgPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMyICE9IGJvdXRzMik7CisgICAgICAgIGJvdXRzMi5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRzMiA9PSBib3V0czIpOworCisgICAgICAgIGJvdXRzMS5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluczEgPT0gYm91dHMxKTsKKworICAgICAgICAvLyBpbmRleAorICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMxLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMS50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbnMxLnR5cGUoKSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShpbnMyLnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUoaW5zMi50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbnMyLnR5cGUoKSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMS50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlclN0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMxLnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVyKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHMxLnR5cGUoKSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0czIudHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMi50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShvdXRzMi50eXBlKCksIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworCisgICAgICAgIGluZGV4ID0gQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcik7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXIpOworCisgICAgICAgIEMyUGFyYW06OlR5cGUgdHlwZSA9IEMyTnVtYmVyU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIHR5cGUgPSBDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvck91dHB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JTdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclBvcnQoKSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyVHVuaW5nOjpGcm9tKCZpbnMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmaW5zMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJUdW5pbmc6OkZyb20oJm91dHMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclR1bmluZzo6RnJvbSgmb3V0czIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6RnJvbSgmaW5zMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpGcm9tKCZpbnMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJm91dHMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OkZyb20oJm91dHMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZpbnMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZpbnMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6OmlucHV0OjpGcm9tKCZvdXRzMSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjppbnB1dDo6RnJvbSgmb3V0czIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmaW5zMiksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oJm91dHMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclBvcnRUdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0czIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZpbnMxKSwgJmluczEpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OkZyb20oJmluczIpLCAoQzJOdW1iZXJTdHJlYW1UdW5pbmcqKSZpbnMyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpGcm9tKCZvdXRzMSksICZvdXRzMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6RnJvbSgmb3V0czIpLCAoQzJOdW1iZXJTdHJlYW1UdW5pbmcqKSZvdXRzMik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJmluczEpLCAoQzJOdW1iZXJTdHJlYW1UdW5pbmc6OmlucHV0KikmaW5zMSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJmluczIpLCAmaW5zMik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oJm91dHMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnMxKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZpbnMyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKCZvdXRzMSksIChDMk51bWJlclN0cmVhbVR1bmluZzo6b3V0cHV0Kikmb3V0czEpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbSgmb3V0czIpLCAmb3V0czIpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoaW5zMSkpLCBpbnMxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShpbnMyKSksIGluczIpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KG91dHMxKSksIG91dHMxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weShvdXRzMikpLCBvdXRzMik7CisgICAgfQorCisgICAgeworICAgICAgICB1aW50MzJfdCB2aWRlb1dpZHRoW10gPSB7IDEydSwgQzJOdW1iZXJTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSwgMTAwIH07CisgICAgICAgIEMyUGFyYW0gKnAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkpOworICAgICAgICBFWFBFQ1RfTkUocDEsIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwMS0+c2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKHAxLT50eXBlKCksIEMyTnVtYmVyU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgKyAyKTsKKyAgICAgICAgRVhQRUNUX0VRKHAxLCBudWxscHRyKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpIC0gMik7CisgICAgICAgIEVYUEVDVF9FUShwMSwgbnVsbHB0cik7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDMpOworICAgICAgICBFWFBFQ1RfRVEocDEsIG51bGxwdHIpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCAwKTsKKyAgICAgICAgRVhQRUNUX0VRKHAxLCBudWxscHRyKTsKKyAgICB9Cit9CisKK3ZvaWQgU3RhdGljVGVzdEFkZENvcmVJbmRleCgpIHsKKyAgICBzdHJ1Y3Qgbm9iYXNlIHt9OworICAgIHN0cnVjdCBiYXNlIHsgZW51bSA6IHVpbnQzMl90IHsgQ09SRV9JTkRFWCA9IDEgfTsgfTsKKyAgICBzdGF0aWNfYXNzZXJ0KF9DMkFkZENvcmVJbmRleDxub2Jhc2UsIDI+OjpDT1JFX0lOREVYID09IDIsICJzaG91bGQgYmUgMiIpOworICAgIHN0YXRpY19hc3NlcnQoX0MyQWRkQ29yZUluZGV4PGJhc2UsIDE+OjpDT1JFX0lOREVYID09IDEsICJzaG91bGQgYmUgMSIpOworfQorCitjbGFzcyBUZXN0RmxleEhlbHBlciB7CisgICAgc3RydWN0IF9GbGV4IHsKKyAgICAgICAgaW50MzJfdCBhOworICAgICAgICBjaGFyIGJbXTsKKyAgICAgICAgX0ZsZXgoKSB7fQorICAgICAgICBGTEVYKF9GbGV4LCBiKTsKKyAgICB9OworCisgICAgc3RydWN0IF9Cb0ZsZXggeworICAgICAgICBfRmxleCBhOworICAgICAgICBfQm9GbGV4KCkge30KKyAgICAgICAgRkxFWChfQm9GbGV4LCBhKTsKKyAgICB9OworCisgICAgc3RydWN0IF9Ob25GbGV4IHsKKyAgICB9OworCisKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNUZXN0KCkgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxfQzJGbGV4SGVscGVyPGNoYXI+OjpGbGV4VHlwZSwgdm9pZD46OnZhbHVlLCAic2hvdWxkIGJlIHZvaWQiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8X0MyRmxleEhlbHBlcjxjaGFyW10+OjpGbGV4VHlwZSwgY2hhcj46OnZhbHVlLCAic2hvdWxkIGJlIGNoYXIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8X0MyRmxleEhlbHBlcjxfRmxleD46OkZsZXhUeXBlLCBjaGFyPjo6dmFsdWUsICJzaG91bGQgYmUgY2hhciIpOworCisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPF9DMkZsZXhIZWxwZXI8X0JvRmxleD46OkZsZXhUeXBlLCBjaGFyPjo6dmFsdWUsICJzaG91bGQgYmUgdm9pZCIpOworCisgICAgICAgIHN0YXRpY19hc3NlcnQoX0MyRmxleGlibGU8X0ZsZXg+Ojp2YWx1ZSwgInNob3VsZCBiZSBmbGV4aWJsZSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFfQzJGbGV4aWJsZTxfTm9uRmxleD46OnZhbHVlLCAic2hvdWxkIG5vdCBiZSBmbGV4aWJsZSIpOworICAgIH0KK307CisKK1RFU1RfRihDMlBhcmFtVGVzdCwgRmxleFBhcmFtT3BzVGVzdCkgeworLy8gICAgY29uc3QgQzJOdW1iZXJzU3RydWN0IHN0cnsxMDB9OworICAgIEMyTnVtYmVyc1N0cnVjdCBic3RyOworICAgIHsKKy8vICAgICAgICBFWFBFQ1RfRVEoMTAwLCBzdHItPm0ubU51bWJlcnNbMF0pOworICAgICAgICAodm9pZCkmYnN0ci5tTnVtYmVyc1swXTsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVg7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRyk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzVHVuaW5nPiB0dW5fID0gQzJOdW1iZXJzVHVuaW5nOjpBbGxvY1VuaXF1ZSgxKTsKKyAgICB0dW5fLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNUdW5pbmc+IHR1biA9IHN0ZDo6bW92ZSh0dW5fKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzVHVuaW5nPiBidHVuID0gQzJOdW1iZXJzVHVuaW5nOjpBbGxvY1NoYXJlZCgxKTsKKworICAgIHsKKyAgICAgICAgLy8gZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBjb25zdCBDMk51bWJlcnNUdW5pbmcgKlRbXSA9IHsgdHVuLmdldCgpLCBidHVuLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogVCkgeworICAgICAgICAgICAgRVhQRUNUX1RSVUUoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoISgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvck91dHB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlCisgICAgICAgIEVYUEVDVF9FUSgxMDAsIHR1bi0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBidHVuLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKCp0dW4gPT0gKmJ0dW4pOworICAgICAgICBFWFBFQ1RfRkFMU0UodHVuLT5vcGVyYXRvcj09KCpidHVuKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCp0dW4gIT0gKmJ0dW4pOworICAgICAgICBFWFBFQ1RfVFJVRSh0dW4tPm9wZXJhdG9yIT0oKmJ0dW4pKTsKKyAgICAgICAgYnR1bi0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICAgICAgRVhQRUNUX0VRKCp0dW4sICpidHVuKTsKKworICAgICAgICAvLyBpbmRleAorICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZSh0dW4tPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKHR1bi0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKHR1bi0+dHlwZSgpLCBDMk51bWJlcnNUdW5pbmc6OlBBUkFNX1RZUEUpOworICAgICAgICBFWFBFQ1RfRVEodHVuLT5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlcnNUdW5pbmc6OkNPUkVfSU5ERVg7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRyk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKworICAgICAgICBDMlBhcmFtOjpUeXBlIHR5cGUgPSBDMk51bWJlcnNUdW5pbmc6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuaXNHbG9iYWwoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbSh0dW4uZ2V0KCkpLCB0dW4uZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbSh0dW4uZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbSh0dW4uZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKHR1bi5nZXQoKSksIG51bGxwdHIpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKnR1bikpLCAqdHVuKTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZz4gb3V0cDFfKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkFsbG9jVW5pcXVlKDEsIHRydWUpKSwKKyAgICAgICAgICAgIGlucDFfID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6QWxsb2NVbmlxdWUoMSwgZmFsc2UpOworICAgIG91dHAxXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBpbnAxXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZz4gb3V0cDEgPSBzdGQ6Om1vdmUob3V0cDFfKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZz4gaW5wMSA9IHN0ZDo6bW92ZShpbnAxXyk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc+IGJvdXRwMShDMk51bWJlcnNQb3J0VHVuaW5nOjpBbGxvY1NoYXJlZCgxKSksCisgICAgICAgICAgICBiaW5wMSA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OkFsbG9jU2hhcmVkKDEpLAorICAgICAgICAgICAgYmlucDMgPSBDMk51bWJlcnNQb3J0VHVuaW5nOjpBbGxvY1NoYXJlZCgxLCBmYWxzZSk7CisgICAgYmlucDMtPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0PiBpbnAyXyhDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6QWxsb2NVbmlxdWUoMSkpOworICAgIGlucDJfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dD4gaW5wMiA9IHN0ZDo6bW92ZShpbnAyXyk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0PiBiaW5wMihDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6QWxsb2NTaGFyZWQoMSkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ+IG91dHAyXyhDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkFsbG9jVW5pcXVlKDEpKTsKKyAgICBvdXRwMl8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dD4gb3V0cDIgPSBzdGQ6Om1vdmUob3V0cDJfKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0PiBib3V0cDIoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpBbGxvY1NoYXJlZCgxKSk7CisKKyAgICB7CisgICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoKmJpbnAzKSwgInNob3VsZCBiZSBhYmxlIHRvIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoY2FuQ2FsbFNldFBvcnQoKmJpbnAxKSwgInNob3VsZCBiZSBhYmxlIHRvIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KCppbnAxKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KCppbnAyKSwgInNob3VsZCBub3QgYmUgYWJsZSB0byAoY29uc3QgJiB0eXBlKSIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFjYW5DYWxsU2V0UG9ydCgqYmlucDIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvICh0eXBlKSIpOworCisgICAgICAgIC8vIGZsYWdzICYgaW52YXJpYWJsZXMKKyAgICAgICAgY29uc3QgQzJOdW1iZXJzUG9ydFR1bmluZyAqUFtdID0geyBvdXRwMS5nZXQoKSwgaW5wMS5nZXQoKSwgYm91dHAxLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUCkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dCAqUElbXSA9IHsgaW5wMi5nZXQoKSwgYmlucDIuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQSSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQgKlBPW10gPSB7IG91dHAyLmdldCgpLCBib3V0cDIuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBQTykgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHBvcnQgc3BlY2lmaWMgZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBFWFBFQ1RfRkFMU0Uob3V0cDEtPmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRShvdXRwMS0+Zm9yT3V0cHV0KCkpOworCisgICAgICAgIEVYUEVDVF9UUlVFKGlucDEtPmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5wMS0+Zm9yT3V0cHV0KCkpOworCisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmcgKlAyW10gPSB7IG91dHAxLmdldCgpLCBpbnAxLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUDIpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMDAsIHAtPm0ubU51bWJlcnNbMF0pOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUE8pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUEkpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1BvcnRUdW5pbmcgKlAzW10gPSB7IGJvdXRwMS5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFAzKSB7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UoKGJvb2wpKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSghKCpwKSk7CisKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JJbnB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JPdXRwdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMCwgcC0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIH0KKworICAgICAgICAvLyB2YWx1ZXMKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgaW5wMi0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgxMDAsIG91dHAyLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnAxLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJpbnAyLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRwMS0+bS5tTnVtYmVyc1swXSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBib3V0cDItPm0ubU51bWJlcnNbMF0pOworCisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxICE9ICpvdXRwMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxID09ICppbnAyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAxID09ICpvdXRwMik7CisgICAgICAgIEVYUEVDVF9UUlVFKCpiaW5wMSA9PSAqYm91dHAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmJpbnAyICE9ICpib3V0cDIpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxICE9ICpiaW5wMSk7CisgICAgICAgIGJpbnAxLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5wMSAhPSAqYmlucDEpOworICAgICAgICBiaW5wMS0+c2V0UG9ydChmYWxzZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkqYmlucDEpOworICAgICAgICBFWFBFQ1RfRkFMU0UoISpiaW5wMSk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxID09ICpiaW5wMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKmlucDIgIT0gKmJpbnAyKTsKKyAgICAgICAgYmlucDItPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAyID09ICpiaW5wMik7CisKKyAgICAgICAgYmlucDEtPnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDEgPT0gKmJpbnAxKTsKKworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDEgIT0gKmJvdXRwMSk7CisgICAgICAgIGJvdXRwMS0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAxICE9ICpib3V0cDEpOworICAgICAgICBib3V0cDEtPnNldFBvcnQodHJ1ZSAvKiBvdXRwdXQgKi8pOworICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkqYm91dHAxKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKCEqYm91dHAxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHAxID09ICpib3V0cDEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRwMiAhPSAqYm91dHAyKTsKKyAgICAgICAgYm91dHAyLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0cDIgPT0gKmJvdXRwMik7CisKKyAgICAgICAgYm91dHAxLT5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnAxID09ICpib3V0cDEpOworCisgICAgICAgIC8vIGluZGV4CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDEtPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDEtPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShpbnAxLT50eXBlKCksIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDEtPnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDItPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGlucDItPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShpbnAyLT50eXBlKCksIEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKGlucDItPnN0cmVhbSgpLCB+MHUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAxLT50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRwMS0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAxLT50eXBlKCksIEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisgICAgICAgIEVYUEVDVF9FUShvdXRwMS0+c3RyZWFtKCksIH4wdSk7CisKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0cDItPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHAyLT50eXBlKCkpLnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworICAgICAgICBFWFBFQ1RfRVEob3V0cDItPnR5cGUoKSwgQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHAyLT5zdHJlYW0oKSwgfjB1KTsKKworICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXggPSBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworCisgICAgICAgIGluZGV4ID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UoaW5kZXguaXNWZW5kb3IoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKGluZGV4LmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC5jb3JlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzIHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19GTEVYX0ZMQUcpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXgudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisKKyAgICAgICAgQzJQYXJhbTo6VHlwZSB0eXBlID0gQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvcklucHV0KCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIHR5cGUgPSBDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20oaW5wMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKGlucDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShvdXRwMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKG91dHAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKGlucDEuZ2V0KCkpLCBpbnAxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20oaW5wMi5nZXQoKSksIChDMk51bWJlcnNQb3J0VHVuaW5nKilpbnAyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20ob3V0cDEuZ2V0KCkpLCBvdXRwMS5nZXQoKSk7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKG91dHAyLmdldCgpKSwgKEMyTnVtYmVyc1BvcnRUdW5pbmcqKW91dHAyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKGlucDEuZ2V0KCkpLCAoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQqKWlucDEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oaW5wMi5nZXQoKSksIGlucDIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20ob3V0cDEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG91dHAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5wMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKGlucDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShvdXRwMS5nZXQoKSksIChDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQqKW91dHAxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShvdXRwMi5nZXQoKSksIG91dHAyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShpbnAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20oaW5wMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKG91dHAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20ob3V0cDIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oaW5wMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShpbnAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKG91dHAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpGcm9tKG91dHAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShpbnAxLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShpbnAyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShvdXRwMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0cDIuZ2V0KCkpLCBudWxscHRyKTsKKworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KCppbnAxKSksICppbnAxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqaW5wMikpLCAqaW5wMik7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKm91dHAxKSksICpvdXRwMSk7CisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKm91dHAyKSksICpvdXRwMik7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gb3V0czFfKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6QWxsb2NVbmlxdWUoMSwgdHJ1ZSwgMXUpKTsKKyAgICBvdXRzMV8tPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZz4gb3V0czEgPSBzdGQ6Om1vdmUob3V0czFfKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBpbnMxXyhDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkFsbG9jVW5pcXVlKDEsIGZhbHNlLCAxdSkpOworICAgIGluczFfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc+IGluczEgPSBzdGQ6Om1vdmUoaW5zMV8pOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc+IGJvdXRzMShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkFsbG9jU2hhcmVkKDEpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBiaW5zMShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkFsbG9jU2hhcmVkKDEpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nPiBiaW5zMyhDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkFsbG9jU2hhcmVkKDEsIGZhbHNlLCAxdSkpOworICAgIGJpbnMzLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0PiBpbnMyXyhDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpBbGxvY1VuaXF1ZSgxLCAxdSkpOworICAgIGluczJfLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgIHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0PiBpbnMyID0gc3RkOjptb3ZlKGluczJfKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dD4gYmluczIoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6QWxsb2NTaGFyZWQoMSkpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dD4gb3V0czJfKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpBbGxvY1VuaXF1ZSgxLCAxdSkpOworICAgIG91dHMyXy0+bS5tTnVtYmVyc1swXSA9IDEwMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ+IG91dHMyID0gc3RkOjptb3ZlKG91dHMyXyk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0PiBib3V0czIoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkFsbG9jU2hhcmVkKDEpKTsKKworICAgIHsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydCgqYmluczMpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChjYW5DYWxsU2V0UG9ydCgqYmluczEpLCAic2hvdWxkIGJlIGFibGUgdG8iKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmluczEpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCkiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghY2FuQ2FsbFNldFBvcnQoKmluczIpLCAic2hvdWxkIG5vdCBiZSBhYmxlIHRvIChjb25zdCAmIHR5cGUpIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIWNhbkNhbGxTZXRQb3J0KCpiaW5zMiksICJzaG91bGQgbm90IGJlIGFibGUgdG8gKHR5cGUpIik7CisKKyAgICAgICAgLy8gZmxhZ3MgJiBpbnZhcmlhYmxlcworICAgICAgICBjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmcgKlNbXSA9IHsgb3V0czEuZ2V0KCksIGluczEuZ2V0KCksIGJvdXRzMS5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFMpIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAtPnNpemUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNWZW5kb3IoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5pc0ZsZXhpYmxlKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzR2xvYmFsKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yU3RyZWFtKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvclBvcnQoKSk7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dCAqU0lbXSA9IHsgaW5zMi5nZXQoKSwgYmluczIuZ2V0KCkgfTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHAgOiBTSSkgeworICAgICAgICAgICAgRVhQRUNUX0VRKDEydSwgcC0+c2l6ZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc1ZlbmRvcigpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmlzRmxleGlibGUoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+aXNHbG9iYWwoKSk7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShwLT5mb3JTdHJlYW0oKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yUG9ydCgpKTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dCAqU09bXSA9IHsgb3V0czIuZ2V0KCksIGJvdXRzMi5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFNPKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTJ1LCBwLT5zaXplKCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmlzVmVuZG9yKCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+aXNGbGV4aWJsZSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5pc0dsb2JhbCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKHAtPmZvclN0cmVhbSgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShwLT5mb3JQb3J0KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gcG9ydCBzcGVjaWZpYyBmbGFncyAmIGludmFyaWFibGVzCisgICAgICAgIEVYUEVDVF9GQUxTRShvdXRzMS0+Zm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKG91dHMxLT5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5zMS0+Zm9ySW5wdXQoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbnMxLT5mb3JPdXRwdXQoKSk7CisKKyAgICAgICAgY29uc3QgQzJOdW1iZXJzU3RyZWFtVHVuaW5nICpTMltdID0geyBvdXRzMS5nZXQoKSwgaW5zMS5nZXQoKSB9OworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcCA6IFMyKSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRSgoYm9vbCkoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSghKCpwKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAwLCBwLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgxdSwgcC0+c3RyZWFtKCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogU08pIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogU0kpIHsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKChib29sKSgqcCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX1RSVUUocC0+Zm9ySW5wdXQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRkFMU0UocC0+Zm9yT3V0cHV0KCkpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IEMyTnVtYmVyc1N0cmVhbVR1bmluZyAqUzNbXSA9IHsgYm91dHMxLmdldCgpIH07CisgICAgICAgIGZvciAoY29uc3QgYXV0byBwIDogUzMpIHsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRSgoYm9vbCkoKnApKTsKKyAgICAgICAgICAgIEVYUEVDVF9UUlVFKCEoKnApKTsKKworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvcklucHV0KCkpOworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKHAtPmZvck91dHB1dCgpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgwLCBwLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbHVlcworICAgICAgICBFWFBFQ1RfRVEoMTAwLCBpbnMyLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDEwMCwgb3V0czItPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmluczEtPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYmluczItPm0ubU51bWJlcnNbMF0pOworICAgICAgICBFWFBFQ1RfRVEoMCwgYm91dHMxLT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIGJvdXRzMi0+bS5tTnVtYmVyc1swXSk7CisKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBpbnMyLT5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgb3V0czItPnN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBiaW5zMS0+c3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRVEoMHUsIGJpbnMyLT5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYm91dHMxLT5zdHJlYW0oKSk7CisgICAgICAgIEVYUEVDVF9FUSgwdSwgYm91dHMyLT5zdHJlYW0oKSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgIT0gKm91dHMxKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgPT0gKmluczIpOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czEgPT0gKm91dHMyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmJpbnMxID09ICpib3V0czEpOworICAgICAgICBFWFBFQ1RfVFJVRSgqYmluczIgIT0gKmJvdXRzMik7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczEgIT0gKmJpbnMxKTsKKyAgICAgICAgYmluczEtPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMxICE9ICpiaW5zMSk7CisgICAgICAgIGJpbnMxLT5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMxICE9ICpiaW5zMSk7CisgICAgICAgIGJpbnMxLT5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMSA9PSAqYmluczEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMyICE9ICpiaW5zMik7CisgICAgICAgIGJpbnMyLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqaW5zMiAhPSAqYmluczIpOworICAgICAgICBiaW5zMi0+c2V0U3RyZWFtKDF1KTsKKyAgICAgICAgRVhQRUNUX1RSVUUoKmluczIgPT0gKmJpbnMyKTsKKworICAgICAgICBiaW5zMS0+c2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSA9PSAqYmluczEpOworCisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSAhPSAqYm91dHMxKTsKKyAgICAgICAgYm91dHMxLT5tLm1OdW1iZXJzWzBdID0gMTAwOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czEgIT0gKmJvdXRzMSk7CisgICAgICAgIGJvdXRzMS0+c2V0UG9ydCh0cnVlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMSAhPSAqYm91dHMxKTsKKyAgICAgICAgYm91dHMxLT5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czEgPT0gKmJvdXRzMSk7CisKKyAgICAgICAgRVhQRUNUX1RSVUUoKm91dHMyICE9ICpib3V0czIpOworICAgICAgICBib3V0czItPm0ubU51bWJlcnNbMF0gPSAxMDA7CisgICAgICAgIEVYUEVDVF9UUlVFKCpvdXRzMiAhPSAqYm91dHMyKTsKKyAgICAgICAgYm91dHMyLT5zZXRTdHJlYW0oMXUpOworICAgICAgICBFWFBFQ1RfVFJVRSgqb3V0czIgPT0gKmJvdXRzMik7CisKKyAgICAgICAgYm91dHMxLT5zZXRQb3J0KGZhbHNlIC8qIG91dHB1dCAqLyk7CisgICAgICAgIEVYUEVDVF9UUlVFKCppbnMxID09ICpib3V0czEpOworCisgICAgICAgIC8vIGluZGV4CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczEtPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczEtPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShpbnMxLT50eXBlKCksIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczItPnR5cGUoKSkuY29yZUluZGV4KCksIEMyTnVtYmVyc1N0cnVjdDo6Q09SRV9JTkRFWCk7CisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKGluczItPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShpbnMyLT50eXBlKCksIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEVYUEVDVF9FUShDMlBhcmFtOjpUeXBlKG91dHMxLT50eXBlKCkpLmNvcmVJbmRleCgpLCBDMk51bWJlcnNTdHJ1Y3Q6OkNPUkVfSU5ERVgpOworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMS0+dHlwZSgpKS50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKyAgICAgICAgRVhQRUNUX0VRKG91dHMxLT50eXBlKCksIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFKTsKKworICAgICAgICBFWFBFQ1RfRVEoQzJQYXJhbTo6VHlwZShvdXRzMi0+dHlwZSgpKS5jb3JlSW5kZXgoKSwgQzJOdW1iZXJzU3RydWN0OjpDT1JFX0lOREVYKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyUGFyYW06OlR5cGUob3V0czItPnR5cGUoKSkudHlwZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyk7CisgICAgICAgIEVYUEVDVF9FUShvdXRzMi0+dHlwZSgpLCBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4ID0gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKGluZGV4LmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRShpbmRleC5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRVEoaW5kZXguY29yZUluZGV4KCksIGtQYXJhbUluZGV4TnVtYmVycyB8IEMyUGFyYW06OkNvcmVJbmRleDo6SVNfRkxFWF9GTEFHKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LnR5cGVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMpOworCisgICAgICAgIGluZGV4ID0gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRShpbmRleC5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoaW5kZXguaXNGbGV4aWJsZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKGluZGV4LmNvcmVJbmRleCgpLCBrUGFyYW1JbmRleE51bWJlcnMgfCBDMlBhcmFtOjpDb3JlSW5kZXg6OklTX0ZMRVhfRkxBRyk7CisgICAgICAgIEVYUEVDVF9FUShpbmRleC50eXBlSW5kZXgoKSwga1BhcmFtSW5kZXhOdW1iZXJzKTsKKworICAgICAgICBDMlBhcmFtOjpUeXBlIHR5cGUgPSBDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0OjpQQVJBTV9UWVBFOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc1ZlbmRvcigpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5pc0ZsZXhpYmxlKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5pc0dsb2JhbCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yT3V0cHV0KCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmZvclN0cmVhbSgpKTsKKyAgICAgICAgRVhQRUNUX0ZBTFNFKHR5cGUuZm9yUG9ydCgpKTsKKworICAgICAgICB0eXBlID0gQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEU7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzVmVuZG9yKCkpOworICAgICAgICBFWFBFQ1RfVFJVRSh0eXBlLmlzRmxleGlibGUoKSk7CisgICAgICAgIEVYUEVDVF9GQUxTRSh0eXBlLmlzR2xvYmFsKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JJbnB1dCgpKTsKKyAgICAgICAgRVhQRUNUX1RSVUUodHlwZS5mb3JPdXRwdXQoKSk7CisgICAgICAgIEVYUEVDVF9UUlVFKHR5cGUuZm9yU3RyZWFtKCkpOworICAgICAgICBFWFBFQ1RfRkFMU0UodHlwZS5mb3JQb3J0KCkpOworCisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG51bGxwdHIpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShudWxscHRyKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNUdW5pbmc6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKGluczIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1R1bmluZzo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzVHVuaW5nOjpGcm9tKG91dHMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpGcm9tKGluczEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OkZyb20oaW5zMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6RnJvbShvdXRzMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20oaW5zMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQ6OkZyb20ob3V0czEuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKG91dHMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNQb3J0VHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKGluczIuZ2V0KCkpLCBudWxscHRyKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1BvcnRUdW5pbmc6Om91dHB1dDo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzUG9ydFR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHMyLmdldCgpKSwgbnVsbHB0cik7CisgICAgICAgIEVYUEVDVF9FUShDMk51bWJlcnNTdHJlYW1UdW5pbmc6OkZyb20oaW5zMS5nZXQoKSksIGluczEuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpGcm9tKGluczIuZ2V0KCkpLCAoQzJOdW1iZXJzU3RyZWFtVHVuaW5nKilpbnMyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShvdXRzMS5nZXQoKSksIG91dHMxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6RnJvbShvdXRzMi5nZXQoKSksIChDMk51bWJlcnNTdHJlYW1UdW5pbmcqKW91dHMyLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oaW5zMS5nZXQoKSksIChDMk51bWJlcnNTdHJlYW1UdW5pbmc6OmlucHV0KilpbnMxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6aW5wdXQ6OkZyb20oaW5zMi5nZXQoKSksIGluczIuZ2V0KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShvdXRzMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjppbnB1dDo6RnJvbShvdXRzMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5zMS5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20oaW5zMi5nZXQoKSksIG51bGxwdHIpOworICAgICAgICBFWFBFQ1RfRVEoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OkZyb20ob3V0czEuZ2V0KCkpLCAoQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQqKW91dHMxLmdldCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpGcm9tKG91dHMyLmdldCgpKSwgb3V0czIuZ2V0KCkpOworCisgICAgICAgIEVYUEVDVF9FUSgqKEMyUGFyYW06OkNvcHkoKmluczEpKSwgKmluczEpOworICAgICAgICBFWFBFQ1RfRVEoKihDMlBhcmFtOjpDb3B5KCppbnMyKSksICppbnMyKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqb3V0czEpKSwgKm91dHMxKTsKKyAgICAgICAgRVhQRUNUX0VRKCooQzJQYXJhbTo6Q29weSgqb3V0czIpKSwgKm91dHMyKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEMySW50MzJWYWx1ZSBpbnQzMlZhbHVlKElOVDMyX01JTik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGludDMyVmFsdWUudmFsdWUpLCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOworICAgICAgICBFWFBFQ1RfRVEoSU5UMzJfTUlOLCBpbnQzMlZhbHVlLnZhbHVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IGludDMyVmFsdWUuRmllbGRMaXN0KCk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShGRDo6SU5UMzIsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuY2JlZ2luKCktPmV4dGVudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7CisgICAgfQorCisgICAgeworICAgICAgICBDMlVpbnQzMlZhbHVlIHVpbnQzMlZhbHVlKFVJTlQzMl9NQVgpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZSh1aW50MzJWYWx1ZS52YWx1ZSksIHVpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDMyX3QiKTsKKyAgICAgICAgRVhQRUNUX0VRKFVJTlQzMl9NQVgsIHVpbnQzMlZhbHVlLnZhbHVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IHVpbnQzMlZhbHVlLkZpZWxkTGlzdCgpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoRkQ6OlVJTlQzMiwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEMySW50NjRWYWx1ZSBpbnQ2NFZhbHVlKElOVDY0X01JTik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGludDY0VmFsdWUudmFsdWUpLCBpbnQ2NF90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50NjRfdCIpOworICAgICAgICBFWFBFQ1RfRVEoSU5UNjRfTUlOLCBpbnQ2NFZhbHVlLnZhbHVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IGludDY0VmFsdWUuRmllbGRMaXN0KCk7CisgICAgICAgIEVYUEVDVF9FUSgxdSwgZmllbGRzLnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShGRDo6SU5UNjQsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuY2JlZ2luKCktPmV4dGVudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7CisgICAgfQorCisgICAgeworICAgICAgICBDMlVpbnQ2NFZhbHVlIHVpbnQ2NFZhbHVlKFVJTlQ2NF9NQVgpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZSh1aW50NjRWYWx1ZS52YWx1ZSksIHVpbnQ2NF90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDY0X3QiKTsKKyAgICAgICAgRVhQRUNUX0VRKFVJTlQ2NF9NQVgsIHVpbnQ2NFZhbHVlLnZhbHVlKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IHVpbnQ2NFZhbHVlLkZpZWxkTGlzdCgpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoRkQ6OlVJTlQ2NCwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIEMyRmxvYXRWYWx1ZSBmbG9hdFZhbHVlKDEyMy40Zik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGZsb2F0VmFsdWUudmFsdWUpLCBmbG9hdD46OnZhbHVlLCAic2hvdWxkIGJlIGZsb2F0Iik7CisgICAgICAgIEVYUEVDVF9FUSgxMjMuNGYsIGZsb2F0VmFsdWUudmFsdWUpOworICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gZmxvYXRWYWx1ZS5GaWVsZExpc3QoKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEZEOjpGTE9BVCwgZmllbGRzLmNiZWdpbigpLT50eXBlKCkpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5jYmVnaW4oKS0+ZXh0ZW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoQzJTdHJpbmcoInZhbHVlIiksIGZpZWxkcy5jYmVnaW4oKS0+bmFtZSgpKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHVpbnQ4X3QgaW5pdFZhbHVlW10gPSAiQUJDRCI7CisgICAgICAgIHR5cGVkZWYgQzJHbG9iYWxQYXJhbTxDMlNldHRpbmcsIEMyQmxvYlZhbHVlLCAwPiBCbG9iU2V0dGluZzsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJsb2JTZXR0aW5nPiBibG9iVmFsdWUgPSBCbG9iU2V0dGluZzo6QWxsb2NVbmlxdWUoNiwgQzJDb25zdE1lbW9yeUJsb2NrPHVpbnQ4X3Q+KGluaXRWYWx1ZSkpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShibG9iVmFsdWUtPm0udmFsdWUpLCB1aW50OF90W10+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50OF90W10iKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChibG9iVmFsdWUtPm0udmFsdWUsICJBQkNEXDAiLCA2KSk7CisgICAgICAgIEVYUEVDVF9FUSg2dSwgYmxvYlZhbHVlLT5mbGV4Q291bnQoKSk7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiBmaWVsZHMgPSBibG9iVmFsdWUtPkZpZWxkTGlzdCgpOworICAgICAgICBFWFBFQ1RfRVEoMXUsIGZpZWxkcy5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEoRkQ6OkJMT0IsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBmaWVsZHMuY2JlZ2luKCktPmV4dGVudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7CisKKyAgICAgICAgYmxvYlZhbHVlID0gQmxvYlNldHRpbmc6OkFsbG9jVW5pcXVlKDMsIEMyQ29uc3RNZW1vcnlCbG9jazx1aW50OF90Pihpbml0VmFsdWUpKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChibG9iVmFsdWUtPm0udmFsdWUsICJBQkMiLCAzKSk7CisgICAgICAgIEVYUEVDVF9FUSgzdSwgYmxvYlZhbHVlLT5mbGV4Q291bnQoKSk7CisgICAgfQorCisgICAgeworICAgICAgICBjb25zdGV4cHIgY2hhciBpbml0VmFsdWVbXSA9ICJBQkNEIjsKKyAgICAgICAgdHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMyU2V0dGluZywgQzJTdHJpbmdWYWx1ZSwgMD4gU3RyaW5nU2V0dGluZzsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFN0cmluZ1NldHRpbmc+IHN0cmluZ1ZhbHVlID0gU3RyaW5nU2V0dGluZzo6QWxsb2NVbmlxdWUoNiwgQzJDb25zdE1lbW9yeUJsb2NrPGNoYXI+KGluaXRWYWx1ZSkpOworICAgICAgICBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OkFsbG9jVW5pcXVlKDYsIGluaXRWYWx1ZSk7CisgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKHN0cmluZ1ZhbHVlLT5tLnZhbHVlKSwgY2hhcltdPjo6dmFsdWUsICJzaG91bGQgYmUgY2hhcltdIik7CisgICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoc3RyaW5nVmFsdWUtPm0udmFsdWUsICJBQkNEXDAiLCA2KSk7CisgICAgICAgIEVYUEVDVF9FUSg2dSwgc3RyaW5nVmFsdWUtPmZsZXhDb3VudCgpKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZERlc2NyaXB0b3I+IGZpZWxkcyA9IHN0cmluZ1ZhbHVlLT5GaWVsZExpc3QoKTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBmaWVsZHMuc2l6ZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEZEOjpTVFJJTkcsIGZpZWxkcy5jYmVnaW4oKS0+dHlwZSgpKTsKKyAgICAgICAgRVhQRUNUX0VRKDB1LCBmaWVsZHMuY2JlZ2luKCktPmV4dGVudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEMyU3RyaW5nKCJ2YWx1ZSIpLCBmaWVsZHMuY2JlZ2luKCktPm5hbWUoKSk7CisKKyAgICAgICAgc3RyaW5nVmFsdWUgPSBTdHJpbmdTZXR0aW5nOjpBbGxvY1VuaXF1ZSgzLCBDMkNvbnN0TWVtb3J5QmxvY2s8Y2hhcj4oaW5pdFZhbHVlKSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoc3RyaW5nVmFsdWUtPm0udmFsdWUsICJBQiIsIDMpKTsKKyAgICAgICAgRVhQRUNUX0VRKDN1LCBzdHJpbmdWYWx1ZS0+ZmxleENvdW50KCkpOworCisgICAgICAgIHN0cmluZ1ZhbHVlID0gU3RyaW5nU2V0dGluZzo6QWxsb2NVbmlxdWUoMTEsICJpbml0VmFsdWUiKTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChzdHJpbmdWYWx1ZS0+bS52YWx1ZSwgImluaXRWYWx1ZVwwIiwgMTEpKTsKKyAgICAgICAgRVhQRUNUX0VRKDExdSwgc3RyaW5nVmFsdWUtPmZsZXhDb3VudCgpKTsKKworICAgICAgICBzdHJpbmdWYWx1ZSA9IFN0cmluZ1NldHRpbmc6OkFsbG9jVW5pcXVlKGluaXRWYWx1ZSk7CisgICAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAoc3RyaW5nVmFsdWUtPm0udmFsdWUsICJBQkNEIiwgNSkpOworICAgICAgICBFWFBFQ1RfRVEoNXUsIHN0cmluZ1ZhbHVlLT5mbGV4Q291bnQoKSk7CisKKyAgICAgICAgc3RyaW5nVmFsdWUgPSBTdHJpbmdTZXR0aW5nOjpBbGxvY1VuaXF1ZSh7ICdBJywgJ0InLCAnQycsICdEJyB9KTsKKyAgICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcChzdHJpbmdWYWx1ZS0+bS52YWx1ZSwgIkFCQyIsIDQpKTsKKyAgICAgICAgRVhQRUNUX0VRKDR1LCBzdHJpbmdWYWx1ZS0+ZmxleENvdW50KCkpOworICAgIH0KKworICAgIHsKKyAgICAgICAgdWludDMyX3QgdmlkZW9XaWR0aFtdID0geyAxMnUsIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0OjpQQVJBTV9UWVBFLCAxMDAgfTsKKyAgICAgICAgQzJQYXJhbSAqcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIHNpemVvZih2aWRlb1dpZHRoKSk7CisgICAgICAgIEVYUEVDVF9ORShudWxscHRyLCBwMSk7CisgICAgICAgIEVYUEVDVF9FUSgxMnUsIHAxLT5zaXplKCkpOworICAgICAgICBFWFBFQ1RfRVEocDEtPnR5cGUoKSwgQzJOdW1iZXJzU3RyZWFtVHVuaW5nOjpvdXRwdXQ6OlBBUkFNX1RZUEUpOworCisgICAgICAgIEMyTnVtYmVyc1N0cmVhbVR1bmluZzo6b3V0cHV0ICp2c3QgPSBDMk51bWJlcnNTdHJlYW1UdW5pbmc6Om91dHB1dDo6RnJvbShwMSk7CisgICAgICAgIEVYUEVDVF9ORShudWxscHRyLCB2c3QpOworICAgICAgICBpZiAodnN0KSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMXUsIHZzdC0+ZmxleENvdW50KCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKDEwMCwgdnN0LT5tLm1OdW1iZXJzWzBdKTsKKyAgICAgICAgfQorCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgKyAyKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpIC0gMik7CisgICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDMpOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCAwKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHVpbnQzMl90IHZpZGVvV2lkdGhbXSA9IHsgMTZ1LCBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSwgMTAxLCAxMDIgfTsKKworICAgICAgICBDMlBhcmFtICpwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpKTsKKyAgICAgICAgRVhQRUNUX05FKG51bGxwdHIsIHAxKTsKKyAgICAgICAgRVhQRUNUX0VRKDE2dSwgcDEtPnNpemUoKSk7CisgICAgICAgIEVYUEVDVF9FUShwMS0+dHlwZSgpLCBDMk51bWJlcnNQb3J0VHVuaW5nOjppbnB1dDo6UEFSQU1fVFlQRSk7CisKKyAgICAgICAgQzJOdW1iZXJzUG9ydFR1bmluZzo6aW5wdXQgKnZwdCA9IEMyTnVtYmVyc1BvcnRUdW5pbmc6OmlucHV0OjpGcm9tKHAxKTsKKyAgICAgICAgRVhQRUNUX05FKG51bGxwdHIsIHZwdCk7CisgICAgICAgIGlmICh2cHQpIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgydSwgdnB0LT5mbGV4Q291bnQoKSk7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMTAxLCB2cHQtPm0ubU51bWJlcnNbMF0pOworICAgICAgICAgICAgRVhQRUNUX0VRKDEwMiwgdnB0LT5tLm1OdW1iZXJzWzFdKTsKKyAgICAgICAgfQorCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCBzaXplb2YodmlkZW9XaWR0aCkgKyAyKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKworICAgICAgICBwMSA9IEMyUGFyYW06OkZyb20odmlkZW9XaWR0aCwgc2l6ZW9mKHZpZGVvV2lkdGgpIC0gMik7CisgICAgICAgIEVYUEVDVF9FUShudWxscHRyLCBwMSk7CisKKyAgICAgICAgcDEgPSBDMlBhcmFtOjpGcm9tKHZpZGVvV2lkdGgsIDMpOworICAgICAgICBFWFBFQ1RfRVEobnVsbHB0ciwgcDEpOworCisgICAgICAgIHAxID0gQzJQYXJhbTo6RnJvbSh2aWRlb1dpZHRoLCAwKTsKKyAgICAgICAgRVhQRUNUX0VRKG51bGxwdHIsIHAxKTsKKyAgICB9Cit9CisKK1RFU1RfRihDMlBhcmFtVGVzdCwgQzJWYWx1ZVRlc3QpIHsKKyAgICBDMlZhbHVlIHZhbDsKKyAgICBpbnQzMl90IGkzMiA9IC0zMjsKKyAgICBpbnQ2NF90IGk2NCA9IC02NDsKKyAgICB1aW50MzJfdCB1MzIgPSAzMjsKKyAgICB1aW50NjRfdCB1NjQgPSA2NDsKKyAgICBmbG9hdCBmcCA9IDEuNWY7CisKKyAgICBFWFBFQ1RfRVEoQzJWYWx1ZTo6Tk9fSU5JVCwgdmFsLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpMzIpKTsKKyAgICBFWFBFQ1RfRVEoLTMyLCBpMzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTY0KSk7CisgICAgRVhQRUNUX0VRKC02NCwgaTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnUzMikpOworICAgIEVYUEVDVF9FUSgzMnUsIHUzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1NjQpKTsKKyAgICBFWFBFQ1RfRVEoNjR1LCB1NjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmZnApKTsKKyAgICBFWFBFQ1RfRVEoMS41ZiwgZnApOworCisgICAgdmFsID0gaW50MzJfdCgtMzIxNik7CisgICAgRVhQRUNUX0VRKEMyVmFsdWU6OklOVDMyLCB2YWwudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgdmFsLmdldCgmaTMyKSk7CisgICAgRVhQRUNUX0VRKC0zMjE2LCBpMzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTY0KSk7CisgICAgRVhQRUNUX0VRKC02NCwgaTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnUzMikpOworICAgIEVYUEVDVF9FUSgzMnUsIHUzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1NjQpKTsKKyAgICBFWFBFQ1RfRVEoNjR1LCB1NjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmZnApKTsKKyAgICBFWFBFQ1RfRVEoMS41ZiwgZnApOworCisgICAgdmFsID0gdWludDMyX3QoMzIxNik7CisgICAgRVhQRUNUX0VRKEMyVmFsdWU6OlVJTlQzMiwgdmFsLnR5cGUoKSk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpMzIpKTsKKyAgICBFWFBFQ1RfRVEoLTMyMTYsIGkzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZpNjQpKTsKKyAgICBFWFBFQ1RfRVEoLTY0LCBpNjQpOworICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZ1MzIpKTsKKyAgICBFWFBFQ1RfRVEoMzIxNnUsIHUzMik7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZ1NjQpKTsKKyAgICBFWFBFQ1RfRVEoNjR1LCB1NjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmZnApKTsKKyAgICBFWFBFQ1RfRVEoMS41ZiwgZnApOworCisgICAgdmFsID0gaW50NjRfdCgtNjQzMik7CisgICAgRVhQRUNUX0VRKEMyVmFsdWU6OklOVDY0LCB2YWwudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmkzMikpOworICAgIEVYUEVDVF9FUSgtMzIxNiwgaTMyKTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgdmFsLmdldCgmaTY0KSk7CisgICAgRVhQRUNUX0VRKC02NDMyLCBpNjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7CisgICAgRVhQRUNUX0VRKDMyMTZ1LCB1MzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTY0KSk7CisgICAgRVhQRUNUX0VRKDY0dSwgdTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmZwKSk7CisgICAgRVhQRUNUX0VRKDEuNWYsIGZwKTsKKworICAgIHZhbCA9IHVpbnQ2NF90KDY0MzIpOworICAgIEVYUEVDVF9FUShDMlZhbHVlOjpVSU5UNjQsIHZhbC50eXBlKCkpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTMyKSk7CisgICAgRVhQRUNUX0VRKC0zMjE2LCBpMzIpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmaTY0KSk7CisgICAgRVhQRUNUX0VRKC02NDMyLCBpNjQpOworICAgIEVYUEVDVF9FUShmYWxzZSwgdmFsLmdldCgmdTMyKSk7CisgICAgRVhQRUNUX0VRKDMyMTZ1LCB1MzIpOworICAgIEVYUEVDVF9FUSh0cnVlLCB2YWwuZ2V0KCZ1NjQpKTsKKyAgICBFWFBFQ1RfRVEoNjQzMnUsIHU2NCk7CisgICAgRVhQRUNUX0VRKGZhbHNlLCB2YWwuZ2V0KCZmcCkpOworICAgIEVYUEVDVF9FUSgxLjVmLCBmcCk7CisKKyAgICB2YWwgPSAxNS4yNWY7CisgICAgRVhQRUNUX0VRKEMyVmFsdWU6OkZMT0FULCB2YWwudHlwZSgpKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmkzMikpOworICAgIEVYUEVDVF9FUSgtMzIxNiwgaTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJmk2NCkpOworICAgIEVYUEVDVF9FUSgtNjQzMiwgaTY0KTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnUzMikpOworICAgIEVYUEVDVF9FUSgzMjE2dSwgdTMyKTsKKyAgICBFWFBFQ1RfRVEoZmFsc2UsIHZhbC5nZXQoJnU2NCkpOworICAgIEVYUEVDVF9FUSg2NDMydSwgdTY0KTsKKyAgICBFWFBFQ1RfRVEodHJ1ZSwgdmFsLmdldCgmZnApKTsKKyAgICBFWFBFQ1RfRVEoMTUuMjVmLCBmcCk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi90ZXN0cy9DMlNhbXBsZUNvbXBvbmVudF90ZXN0LmNwcCBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMlNhbXBsZUNvbXBvbmVudF90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTU2ODM0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyU2FtcGxlQ29tcG9uZW50X3Rlc3QuY3BwCkBAIC0wLDAgKzEsNDMyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyU2FtcGxlQ29tcG9uZW50X3Rlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJFbnVtLmg+CisKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCitjbGFzcyBDMlNhbXBsZUNvbXBvbmVudFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK307CisKK3ZvaWQgUHJpbnRUbyhjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQsIDo6c3RkOjpvc3RyZWFtICpvcykgeworICAgIHVzaW5nIEZEPUMyRmllbGREZXNjcmlwdG9yOworICAgIHN3aXRjaCAoZmQudHlwZSgpKSB7CisgICAgY2FzZSBGRDo6SU5UMzI6ICpvcyA8PCAiaTMyIjsgYnJlYWs7CisgICAgY2FzZSBGRDo6SU5UNjQ6ICpvcyA8PCAiaTY0IjsgYnJlYWs7CisgICAgY2FzZSBGRDo6VUlOVDMyOiAqb3MgPDwgInUzMiI7IGJyZWFrOworICAgIGNhc2UgRkQ6OlVJTlQ2NDogKm9zIDw8ICJ1NjQiOyBicmVhazsKKyAgICBjYXNlIEZEOjpGTE9BVDogKm9zIDw8ICJmbG9hdCI7IGJyZWFrOworICAgIGNhc2UgRkQ6OlNUUklORzogKm9zIDw8ICJjaGFyIjsgYnJlYWs7CisgICAgY2FzZSBGRDo6QkxPQjogKm9zIDw8ICJ1OCI7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGlmIChmZC50eXBlKCkgJiBGRDo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgICpvcyA8PCAic3RydWN0LSIgPDwgKGZkLnR5cGUoKSAmIH5GRDo6U1RSVUNUX0ZMQUcpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKm9zIDw8ICJ0eXBlLSIgPDwgZmQudHlwZSgpOworICAgICAgICB9CisgICAgfQorICAgICpvcyA8PCAiICIgPDwgZmQubmFtZSgpOworICAgIGlmIChmZC5leHRlbnQoKSA+IDEpIHsKKyAgICAgICAgKm9zIDw8ICJbIiA8PCBmZC5leHRlbnQoKSA8PCAiXSI7CisgICAgfSBlbHNlIGlmIChmZC5leHRlbnQoKSA9PSAwKSB7CisgICAgICAgICpvcyA8PCAiW10iOworICAgIH0KKyAgICAqb3MgPDwgIiAoIiA8PCBmZC5fbUZpZWxkSWQgPDwgIioiIDw8IGZkLmV4dGVudCgpIDw8ICIpIjsKK30KKworQzJFTlVNKAorICAgIE1ldGFkYXRhVHlwZSwgaW50MzJfdCwKKyAgICBrSW52YWxpZCA9IC0xLAorICAgIGtOb25lID0gMCwKKyAgICBrR3JhbGxvYywKKyAgICBrTmF0aXZlSGFuZGxlLAorICAgIGtBTmF0aXZlV2luZG93LAorICAgIGtDYW1lcmEsCispCisKK2VudW0geworICAgIGtQYXJhbUluZGV4VmlkZW9Db25maWcgPSAweDEyMzQsCit9OworCitzdHJ1Y3QgQzJWaWRlb0NvbmZpZ1N0cnVjdCB7CisgICAgaW50MzJfdCB3aWR0aDsKKyAgICB1aW50MzJfdCBoZWlnaHQ7CisgICAgTWV0YWRhdGFUeXBlIG1ldGFkYXRhVHlwZTsKKyAgICBpbnQzMl90IHN1cHBvcnRlZEZvcm1hdHNbXTsKKworICAgIEMyVmlkZW9Db25maWdTdHJ1Y3QoKSB7fQorCisgICAgREVGSU5FX0FORF9ERVNDUklCRV9GTEVYX0MyU1RSVUNUKFZpZGVvQ29uZmlnLCBzdXBwb3J0ZWRGb3JtYXRzKQorICAgIEMyRklFTEQod2lkdGgsICJ3aWR0aCIpCisgICAgQzJGSUVMRChoZWlnaHQsICJoZWlnaHQiKQorICAgIEMyRklFTEQobWV0YWRhdGFUeXBlLCAibWV0YWRhdGEtdHlwZSIpCisgICAgQzJGSUVMRChzdXBwb3J0ZWRGb3JtYXRzLCAiZm9ybWF0cyIpCit9OworCit0eXBlZGVmIEMyUG9ydFBhcmFtPEMyVHVuaW5nLCBDMlZpZGVvQ29uZmlnU3RydWN0PiBDMlZpZGVvQ29uZmlnUG9ydFR1bmluZzsKKworY2xhc3MgTXlDb21wb25lbnRJbnN0YW5jZSA6IHB1YmxpYyBDMkNvbXBvbmVudEludGVyZmFjZSB7CitwdWJsaWM6CisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAvLy8gXHRvZG8gdGhpcyBzZWVtcyB0b28gc3BlY2lmaWMKKyAgICAgICAgcmV0dXJuICJzYW1wbGUuaW50ZXJmYWNlIjsKKyAgICB9OworCisgICAgdmlydHVhbCBjMl9ub2RlX2lkX3QgZ2V0SWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIC8vLyBcdG9kbyBob3cgYXJlIHRoZXNlIHNoYXJlZD8KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb25maWdfdmIoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKXBhcmFtczsKKyAgICAgICAgKHZvaWQpZmFpbHVyZXM7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICByZXR1cm4gQzJfT01JVFRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZVR1bm5lbF9zbShjMl9ub2RlX2lkX3QgdGFyZ2V0Q29tcG9uZW50KSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKXRhcmdldENvbXBvbmVudDsKKyAgICAgICAgcmV0dXJuIEMyX09NSVRURUQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeV92YigKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmc3RhY2tQYXJhbXMsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBmb3IgKEMyUGFyYW0qIGNvbnN0IHBhcmFtIDogc3RhY2tQYXJhbXMpIHsKKyAgICAgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICAgICAgaWYgKCEqcGFyYW0pIHsgLy8gcGFyYW0gaXMgYWxyZWFkeSBpbnZhbGlkIC0gcmVtZW1iZXIgaXQKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbm90ZTogdGhpcyBkb2VzIG5vdCBoYW5kbGUgc3RyZWFtIHBhcmFtcyAoc2hvdWxkIHVzZSBpbmRleC4uLikKKyAgICAgICAgICAgIGlmICghbU15UGFyYW1zLmNvdW50KHBhcmFtLT5pbmRleCgpKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBub3QgbXkgcGFyYW0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQzJQYXJhbSAmIG15UGFyYW0gPSBtTXlQYXJhbXMuZmluZChwYXJhbS0+aW5kZXgoKSktPnNlY29uZDsKKyAgICAgICAgICAgIGlmIChteVBhcmFtLnNpemUoKSAhPSBwYXJhbS0+c2l6ZSgpKSB7IC8vIGluY29ycmVjdCBzaXplCisgICAgICAgICAgICAgICAgcGFyYW0tPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcGFyYW0tPnVwZGF0ZUZyb20obXlQYXJhbSk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4IGluZGV4IDogaGVhcFBhcmFtSW5kaWNlcykgeworICAgICAgICAgICAgaWYgKG1NeVBhcmFtcy5jb3VudChpbmRleCkpIHsKKyAgICAgICAgICAgICAgICBDMlBhcmFtICYgbXlQYXJhbSA9IG1NeVBhcmFtcy5maW5kKGluZGV4KS0+c2Vjb25kOworICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBwYXJhbUNvcHkoQzJQYXJhbTo6Q29weShteVBhcmFtKSk7CisgICAgICAgICAgICAgICAgaGVhcFBhcmFtcy0+cHVzaF9iYWNrKHN0ZDo6bW92ZShwYXJhbUNvcHkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDMyX3QsIEMyUGFyYW0gJj4gbU15UGFyYW1zOworCisgICAgQzJDb21wb25lbnREb21haW5TZXR0aW5nIG1Eb21haW5JbmZvOworCisgICAgTXlDb21wb25lbnRJbnN0YW5jZSgpIHsKKyAgICAgICAgbU15UGFyYW1zLmluc2VydCh7bURvbWFpbkluZm8uaW5kZXgoKSwgbURvbWFpbkluZm99KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHJlbGVhc2VUdW5uZWxfc20oYzJfbm9kZV9pZF90IHRhcmdldENvbXBvbmVudCkgb3ZlcnJpZGUgeworICAgICAgICAodm9pZCl0YXJnZXRDb21wb25lbnQ7CisgICAgICAgIHJldHVybiBDMl9PTUlUVEVEOworICAgIH0KKworICAgIGNsYXNzIE15UGFyYW1SZWZsZWN0b3IgOiBwdWJsaWMgQzJQYXJhbVJlZmxlY3RvciB7CisgICAgICAgIGNvbnN0IE15Q29tcG9uZW50SW5zdGFuY2UgKmluc3RhbmNlOworCisgICAgcHVibGljOgorICAgICAgICBNeVBhcmFtUmVmbGVjdG9yKGNvbnN0IE15Q29tcG9uZW50SW5zdGFuY2UgKmkpIDogaW5zdGFuY2UoaSkgeyB9CisKKyAgICAgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBkZXNjcmliZShDMlBhcmFtOjpDb3JlSW5kZXggcGFyYW1JbmRleCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgc3dpdGNoIChwYXJhbUluZGV4LnR5cGVJbmRleCgpKSB7CisgICAgICAgICAgICBjYXNlIGRlY2x0eXBlKGluc3RhbmNlLT5tRG9tYWluSW5mbyk6OkNPUkVfSU5ERVg6CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPihuZXcgQzJTdHJ1Y3REZXNjcmlwdG9yeworICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZS0+bURvbWFpbkluZm8udHlwZSgpLAorICAgICAgICAgICAgICAgICAgICBkZWNsdHlwZShpbnN0YW5jZS0+bURvbWFpbkluZm8pOjpGaWVsZExpc3QoKSwKKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgfTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfdmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMsCisgICAgICAgICAgICBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKW1heUJsb2NrOworICAgICAgICBmb3IgKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeSAmcXVlcnkgOiBmaWVsZHMpIHsKKyAgICAgICAgICAgIGlmIChxdWVyeS5maWVsZCgpID09IEMyUGFyYW1GaWVsZCgmbURvbWFpbkluZm8sICZDMkNvbXBvbmVudERvbWFpblNldHRpbmc6OnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHF1ZXJ5LnZhbHVlcyA9IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGZsYWcgKi8sCisgICAgICAgICAgICAgICAgICAgICZtRG9tYWluSW5mby52YWx1ZQorICAgICAgICAgICAgICAgICAgICAvLywKKyAgICAgICAgICAgICAgICAgICAgLy97KGludDMyX3QpQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFT30KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX09LOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9CQURfSU5ERVg7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRQYXJhbVJlZmxlY3RvcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPihuZXcgTXlQYXJhbVJlZmxlY3Rvcih0aGlzKSk7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBxdWVyeVN1cHBvcnRlZFBhcmFtc19uYigKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4+ICogY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHBhcmFtcy0+cHVzaF9iYWNrKHN0ZDo6bWFrZV9zaGFyZWQ8QzJQYXJhbURlc2NyaXB0b3I+KAorICAgICAgICAgICAgICAgIHRydWUgLyogcmVxdWlyZWQgKi8sICJfZG9tYWluIiwgJm1Eb21haW5JbmZvKSk7CisgICAgICAgIHBhcmFtcy0+cHVzaF9iYWNrKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtRGVzY3JpcHRvcj4oCisgICAgICAgICAgICAgICAgbmV3IEMyUGFyYW1EZXNjcmlwdG9yKHRydWUgLyogcmVxdWlyZWQgKi8sICJfZG9tYWluIiwgJm1Eb21haW5JbmZvKSkpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgdmlydHVhbCB+TXlDb21wb25lbnRJbnN0YW5jZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEUsIGJvb2wgUz1zdGQ6OmlzX2VudW08RT46OnZhbHVlPgorc3RydWN0IGdldHRlciB7CisgICAgaW50MzJfdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBpbnQzMl90KikgeworICAgICAgICByZXR1cm4gcC5pMzI7CisgICAgfQorICAgIGludDY0X3QgZ2V0KGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlByaW1pdGl2ZSAmcCwgaW50NjRfdCopIHsKKyAgICAgICAgcmV0dXJuIHAuaTY0OworICAgIH0KKyAgICB1aW50MzJfdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCB1aW50MzJfdCopIHsKKyAgICAgICAgcmV0dXJuIHAudTMyOworICAgIH0KKyAgICB1aW50NjRfdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCB1aW50NjRfdCopIHsKKyAgICAgICAgcmV0dXJuIHAudTY0OworICAgIH0KKyAgICBmbG9hdCBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBmbG9hdCopIHsKKyAgICAgICAgcmV0dXJuIHAuZnA7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRT4KK3N0cnVjdCBnZXR0ZXI8RSwgdHJ1ZT4geworICAgICB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZSBnZXQoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBFKikgeworICAgICAgICAgdXNpbmcgdT10eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZTsKKyAgICAgICAgIHJldHVybiBnZXR0ZXI8dT4oKS5nZXQocCwgKHUqKTApOworICAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIEU9c3RkOjppc19lbnVtPFQ+Ojp2YWx1ZT4KK3N0cnVjdCBsYXhfdW5kZXJseWluZ190eXBlIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlIHR5cGU7Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IGxheF91bmRlcmx5aW5nX3R5cGU8VCwgZmFsc2U+IHsKKyAgICB0eXBlZGVmIFQgdHlwZTsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEU+Cit0eXBlbmFtZSBsYXhfdW5kZXJseWluZ190eXBlPEU+Ojp0eXBlIGdldCgKKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UHJpbWl0aXZlICZwLCBFKikgeworICAgIHJldHVybiBnZXR0ZXI8RT4oKS5nZXQocCwgKEUqKTApOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgordm9pZCBkdW1wRlNWKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnN2LCBUKnQpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIGNvdXQgPDwgKHN0ZDo6aXNfZW51bTxUPjo6dmFsdWUgPyAoc3RkOjppc19zaWduZWQ8dHlwZW5hbWUgbGF4X3VuZGVybHlpbmdfdHlwZTxUPjo6dHlwZT46OnZhbHVlID8gImkiIDogInUiKQorICAgICAgICAgICAgIDogc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUgPyBzdGQ6OmlzX3NpZ25lZDxUPjo6dmFsdWUgPyAiaSIgOiAidSIgOiAiZiIpCisgICAgICAgICA8PCAoOCAqIHNpemVvZihUKSk7CisgICAgaWYgKHN2LnR5cGUgPT0gc3YuUkFOR0UpIHsKKyAgICAgICAgY291dCA8PCAiLnJhbmdlKCIgPDwgZ2V0KHN2LnJhbmdlLm1pbiwgdCk7CisgICAgICAgIGlmIChnZXQoc3YucmFuZ2Uuc3RlcCwgdCkgIT0gc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUpIHsKKyAgICAgICAgICAgIGNvdXQgPDwgIjoiIDw8IGdldChzdi5yYW5nZS5zdGVwLCB0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZ2V0KHN2LnJhbmdlLm51bSwgdCkgIT0gMSB8fCBnZXQoc3YucmFuZ2UuZGVub20sIHQpICE9IDEpIHsKKyAgICAgICAgICAgIGNvdXQgPDwgIjoiIDw8IGdldChzdi5yYW5nZS5udW0sIHQpIDw8ICIvIiA8PCBnZXQoc3YucmFuZ2UuZGVub20sIHQpOworICAgICAgICB9CisgICAgICAgIGNvdXQgPDwgZ2V0KHN2LnJhbmdlLm1heCwgdCkgPDwgIikiOworICAgIH0KKyAgICBpZiAoc3YudmFsdWVzLnNpemUoKSkgeworICAgICAgICBjb3V0IDw8IChzdi50eXBlID09IHN2LkZMQUdTID8gIi5mbGFncygiIDogIi5saXN0KCIpOworICAgICAgICBjb25zdCBjaGFyICpzZXAgPSAiIjsKKyAgICAgICAgZm9yIChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpQcmltaXRpdmUgJnAgOiBzdi52YWx1ZXMpIHsKKyAgICAgICAgICAgIGNvdXQgPDwgc2VwIDw8IGdldChwLCB0KTsKKyAgICAgICAgICAgIHNlcCA9ICIsIjsKKyAgICAgICAgfQorICAgICAgICBjb3V0IDw8ICIpIjsKKyAgICB9CisgICAgY291dCA8PCBlbmRsOworfQorCit2b2lkIGR1bXBUeXBlKEMyUGFyYW06OlR5cGUgdHlwZSkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisgICAgY291dCA8PCAodHlwZS5pc1ZlbmRvcigpID8gIlZlbmRvciIgOiAiQzIiKTsKKyAgICBpZiAodHlwZS5mb3JJbnB1dCgpKSB7CisgICAgICAgIGNvdXQgPDwgIklucHV0IjsKKyAgICB9IGVsc2UgaWYgKHR5cGUuZm9yT3V0cHV0KCkpIHsKKyAgICAgICAgY291dCA8PCAiT3V0cHV0IjsKKyAgICB9IGVsc2UgaWYgKHR5cGUuZm9yUG9ydCgpICYmICF0eXBlLmZvclN0cmVhbSgpKSB7CisgICAgICAgIGNvdXQgPDwgIlBvcnQiOworICAgIH0KKyAgICBpZiAodHlwZS5mb3JTdHJlYW0oKSkgeworICAgICAgICBjb3V0IDw8ICJTdHJlYW0iOworICAgIH0KKworICAgIGlmICh0eXBlLmlzRmxleGlibGUoKSkgeworICAgICAgICBjb3V0IDw8ICJGbGV4IjsKKyAgICB9CisKKyAgICBjb3V0IDw8IHR5cGUudHlwZUluZGV4KCk7CisKKyAgICBzd2l0Y2ggKHR5cGUua2luZCgpKSB7CisgICAgY2FzZSBDMlBhcmFtOjpJTkZPOiBjb3V0IDw8ICJJbmZvIjsgYnJlYWs7CisgICAgY2FzZSBDMlBhcmFtOjpTRVRUSU5HOiBjb3V0IDw8ICJTZXR0aW5nIjsgYnJlYWs7CisgICAgY2FzZSBDMlBhcmFtOjpUVU5JTkc6IGNvdXQgPDwgIlR1bmluZyI7IGJyZWFrOworICAgIGNhc2UgQzJQYXJhbTo6U1RSVUNUOiBjb3V0IDw8ICJTdHJ1Y3QiOyBicmVhazsKKyAgICBkZWZhdWx0OiBjb3V0IDw8ICJLaW5kIiA8PCAoaW50MzJfdCl0eXBlLmtpbmQoKTsgYnJlYWs7CisgICAgfQorfQorCit2b2lkIGR1bXBUeXBlKEMyUGFyYW06OkNvcmVJbmRleCB0eXBlKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICBjb3V0IDw8ICh0eXBlLmlzVmVuZG9yKCkgPyAiVmVuZG9yIiA6ICJDMiIpOworICAgIGlmICh0eXBlLmlzRmxleGlibGUoKSkgeworICAgICAgICBjb3V0IDw8ICJGbGV4IjsKKyAgICB9CisKKyAgICBjb3V0IDw8IHR5cGUudHlwZUluZGV4KCkgPDwgIlN0cnVjdCI7Cit9CisKK3ZvaWQgZHVtcFR5cGUoQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCB0eXBlKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COiBjb3V0IDw8ICJibG9iICI7IGJyZWFrOworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkZMT0FUOiBjb3V0IDw8ICJmbG9hdCAiOyBicmVhazsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjogY291dCA8PCAiaW50MzJfdCAiOyBicmVhazsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQ2NDogY291dCA8PCAiaW50NjRfdCAiOyBicmVhazsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UMzI6IGNvdXQgPDwgInVpbnQzMl90ICI7IGJyZWFrOworICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDogY291dCA8PCAidWludDY0X3QgIjsgYnJlYWs7CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOiBjb3V0IDw8ICJjaGFyICI7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIGNvdXQgPDwgInN0cnVjdCAiOworICAgICAgICBkdW1wVHlwZSgoQzJQYXJhbTo6VHlwZSl0eXBlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCit2b2lkIGR1bXBTdHJ1Y3QoY29uc3QgQzJTdHJ1Y3REZXNjcmlwdG9yICZzZCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CisgICAgY291dCA8PCAic3RydWN0ICI7CisgICAgZHVtcFR5cGUoc2QuY29yZUluZGV4KCkpOworICAgIGNvdXQgPDwgIiB7IiA8PCBlbmRsOworICAgIC8vQzJGaWVsZERlc2NyaXB0b3IgJmY7CisgICAgZm9yIChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZiA6IHNkKSB7CisgICAgICAgIFByaW50VG8oZiwgJmNvdXQpOworICAgICAgICBjb3V0IDw8IGVuZGw7CisKKyAgICAgICAgaWYgKGYubmFtZWRWYWx1ZXMoKS5zaXplKCkpIHsKKyAgICAgICAgICAgIGNvdXQgPDwgIi5uYW1lZCgiOworICAgICAgICAgICAgY29uc3QgY2hhciAqc2VwID0gIiI7CisgICAgICAgICAgICBmb3IgKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlVHlwZSAmcCA6IGYubmFtZWRWYWx1ZXMoKSkgeworICAgICAgICAgICAgICAgIGNvdXQgPDwgc2VwIDw8IHAuZmlyc3QgPDwgIj0iOworICAgICAgICAgICAgICAgIHN3aXRjaCAoZi50eXBlKCkpIHsKKyAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQzMjogY291dCA8PCBnZXQocC5zZWNvbmQsIChpbnQzMl90ICopMCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OiBjb3V0IDw8IGdldChwLnNlY29uZCwgKGludDY0X3QgKikwKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6VUlOVDMyOiBjb3V0IDw8IGdldChwLnNlY29uZCwgKHVpbnQzMl90ICopMCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQ2NDogY291dCA8PCBnZXQocC5zZWNvbmQsICh1aW50NjRfdCAqKTApOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpGTE9BVDogY291dCA8PCBnZXQocC5zZWNvbmQsIChmbG9hdCAqKTApOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiBjb3V0IDw8ICI/Pz8iOyBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc2VwID0gIiwiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY291dCA8PCAiKSI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjb3V0IDw8ICJ9OyIgPDwgZW5kbDsKK30KKwordm9pZCBkdW1wRGVzYyhjb25zdCBDMlBhcmFtRGVzY3JpcHRvciAmcGQpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOworICAgIGlmIChwZC5pc1JlcXVpcmVkKCkpIHsKKyAgICAgICAgY291dCA8PCAicmVxdWlyZWQgIjsKKyAgICB9CisgICAgaWYgKHBkLmlzUGVyc2lzdGVudCgpKSB7CisgICAgICAgIGNvdXQgPDwgInBlcnNpc3RlbnQgIjsKKyAgICB9CisgICAgY291dCA8PCAic3RydWN0ICI7CisgICAgZHVtcFR5cGUoQzJQYXJhbTo6VHlwZShwZC5pbmRleCgpLnR5cGUoKSkpOworICAgIGNvdXQgPDwgIiAiIDw8IHBkLm5hbWUoKSA8PCAiOyIgPDwgZW5kbDsKK30KKworVEVTVF9GKEMyU2FtcGxlQ29tcG9uZW50VGVzdCwgUmVmbGVjdG9yVGVzdCkgeworICAgIEMyQ29tcG9uZW50RG9tYWluU2V0dGluZyBkb21haW5JbmZvOworICAgIHN0ZDo6c2hhcmVkX3B0cjxNeUNvbXBvbmVudEluc3RhbmNlPiBteUNvbXAobmV3IE15Q29tcG9uZW50SW5zdGFuY2UpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gY29tcCA9IG15Q29tcDsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2N7CisgICAgICAgIG15Q29tcC0+Z2V0UGFyYW1SZWZsZWN0b3IoKS0+ZGVzY3JpYmUoQzJDb21wb25lbnREb21haW5TZXR0aW5nOjpDT1JFX0lOREVYKX07CisgICAgZHVtcFN0cnVjdCgqZGVzYyk7CisKKyAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IHF1ZXJ5ID0geworICAgICAgICB7IEMyUGFyYW1GaWVsZCgmZG9tYWluSW5mbywgJkMyQ29tcG9uZW50RG9tYWluU2V0dGluZzo6dmFsdWUpLAorICAgICAgICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q1VSUkVOVCB9LAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkoQzJQYXJhbUZpZWxkKCZkb21haW5JbmZvLCAmQzJDb21wb25lbnREb21haW5TZXR0aW5nOjp2YWx1ZSksCisgICAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDVVJSRU5UKSwKKyAgICAgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5OjpDdXJyZW50KEMyUGFyYW1GaWVsZCgmZG9tYWluSW5mbywgJkMyQ29tcG9uZW50RG9tYWluU2V0dGluZzo6dmFsdWUpKSwKKyAgICB9OworCisgICAgRVhQRUNUX0VRKEMyX09LLCBjb21wLT5xdWVyeVN1cHBvcnRlZFZhbHVlc192YihxdWVyeSwgQzJfRE9OVF9CTE9DSykpOworCisgICAgZm9yIChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgJnEgOiBxdWVyeSkgeworICAgICAgICBkdW1wRlNWKHEudmFsdWVzLCAmZG9tYWluSW5mby52YWx1ZSk7CisgICAgfQorfQorCitURVNUX0YoQzJTYW1wbGVDb21wb25lbnRUZXN0LCBGaWVsZFN1cHBvcnRlZFZhbHVlc1Rlc3QpIHsKKyAgICB0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMlVpbnQzMlZhbHVlLCAwPiBVaW50MzJUZXN0SW5mbzsKKyAgICBVaW50MzJUZXN0SW5mbyB0OworICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+IHZhbHVlczsKKyAgICB2YWx1ZXMucHVzaF9iYWNrKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoMCwgMTAsIDEpKTsgIC8vIG1pbiwgbWF4LCBzdGVwCisgICAgdmFsdWVzLnB1c2hfYmFjayhDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKDEsIDY0LCAyLCAxKSk7ICAvLyBtaW4sIG1heCwgbnVtLCBkZW4KKyAgICB2YWx1ZXMucHVzaF9iYWNrKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoZmFsc2UsIHsxLCAyLCAzfSkpOyAgLy8gZmxhZ3MsIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdAorICAgIHVpbnQzMl90IHZhbFtdID0gezEsIDMsIDUsIDd9OworICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiB2KHN0ZDo6YmVnaW4odmFsKSwgc3RkOjplbmQodmFsKSk7CisgICAgdmFsdWVzLnB1c2hfYmFjayhDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKGZhbHNlLCB2KSk7ICAvLyBmbGFncywgc3RkOjp2ZWN0b3IKKworICAgIGZvciAoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmc3YgOiB2YWx1ZXMpIHsKKyAgICAgICAgZHVtcEZTVihzdiwgJnQudmFsdWUpOworICAgIH0KK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3Rlc3RzL0MyVXRpbFRlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL0MyVXRpbFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5Y2QzMTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJVdGlsVGVzdC5jcHAKQEAgLTAsMCArMSwxMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyVXRpbFRlc3QiCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXworI2luY2x1ZGUgPF9DMk1hY3JvVXRpbHMuaD4KKyNpbmNsdWRlIDxDMkVudW0uaD4KKworLyoqIFxmaWxlCisgKiBUZXN0cyBmb3Igdm5kay91dGlsLgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBfQzJNYWNyb1V0aWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWNfYXNzZXJ0KDAgPT0gX0MyX0FSR0MoKSwgInNob3VsZCBiZSAwIik7CitzdGF0aWNfYXNzZXJ0KDEgPT0gX0MyX0FSR0MoMSksICJzaG91bGQgYmUgMSIpOworc3RhdGljX2Fzc2VydCgyID09IF9DMl9BUkdDKDEsIDIpLCAic2hvdWxkIGJlIDIiKTsKK3N0YXRpY19hc3NlcnQoNjQgPT0gX0MyX0FSR0MoCisgICAgICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LAorICAgICAgICAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsCisgICAgICAgIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0KSwgInNob3VsZCBiZSA2NCIpOworCitzdGF0aWNfYXNzZXJ0KDAgPT0gX0MyX0FSR0MoLCksICJzaG91bGQgYmUgMCIpOworc3RhdGljX2Fzc2VydCgxID09IF9DMl9BUkdDKDEsKSwgInNob3VsZCBiZSAxIik7CitzdGF0aWNfYXNzZXJ0KDIgPT0gX0MyX0FSR0MoMSwgMiwpLCAic2hvdWxkIGJlIDIiKTsKK3N0YXRpY19hc3NlcnQoNjQgPT0gX0MyX0FSR0MoCisgICAgICAgIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTIsIDEzLCAxNCwgMTUsIDE2LCAxNywgMTgsIDE5LCAyMCwgMjEsIDIyLCAyMywgMjQsIDI1LAorICAgICAgICAyNiwgMjcsIDI4LCAyOSwgMzAsIDMxLCAzMiwgMzMsIDM0LCAzNSwgMzYsIDM3LCAzOCwgMzksIDQwLCA0MSwgNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsCisgICAgICAgIDQ5LCA1MCwgNTEsIDUyLCA1MywgNTQsIDU1LCA1NiwgNTcsIDU4LCA1OSwgNjAsIDYxLCA2MiwgNjMsIDY0LCksICJzaG91bGQgYmUgNjQiKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBfQzJFbnVtVXRpbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitjbGFzcyBDMlV0aWxUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Cit9OworCitDMkVOVU0oRW51bTEsIHVpbnQzMl90LAorICAgIEVudW0xVmFsdWUxLAorICAgIEVudW0xVmFsdWUyLAorICAgIEVudW0xVmFsdWU0ID0gRW51bTFWYWx1ZTIgKyAyLAorKTsKKworQzJFTlVNX0NVU1RPTV9QUkVGSVgoRW51bTIsIHVpbnQzMl90LCAiRW51bSIsCisgICAgRW51bTJWYWx1ZTEsCisgICAgRW51bTJWYWx1ZTIsCisgICAgRW51bTJWYWx1ZTQgPSBFbnVtMVZhbHVlMiArIDIsCispOworCitDMkVOVU1fQ1VTVE9NX05BTUVTKEVudW0zLCB1aW50OF90LAorICAgICh7IHsgInZhbHVlMSIsIEVudW0zVmFsdWUxIH0sCisgICAgICAgeyAidmFsdWUyIiwgRW51bTNWYWx1ZTIgfSwKKyAgICAgICB7ICJ2YWx1ZTQiLCBFbnVtM1ZhbHVlNCB9LAorICAgICAgIHsgImludmFsaWQiLCBJbnZhbGlkIH0gfSksCisgICAgRW51bTNWYWx1ZTEsCisgICAgRW51bTNWYWx1ZTIsCisgICAgRW51bTNWYWx1ZTQgPSBFbnVtM1ZhbHVlMiArIDIsCisgICAgSW52YWxpZCwKKyk7CisKK1RFU1RfRihDMlV0aWxUZXN0LCBFbnVtVXRpbHNUZXN0KSB7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPEMyU3RyaW5nLCBFbnVtMz4+IHBhaXJzICggeyB7ICJ2YWx1ZTEiLCBFbnVtM1ZhbHVlMSB9LAorICAgICAgeyAidmFsdWUyIiwgRW51bTNWYWx1ZTIgfSwKKyAgICAgIHsgInZhbHVlNCIsIEVudW0zVmFsdWU0IH0sCisgICAgICB7ICJpbnZhbGlkIiwgSW52YWxpZCB9IH0pOworICAgIEVudW0zIGUzOworICAgIEMyRmllbGREZXNjcmlwdG9yOjpuYW1lZFZhbHVlc0ZvcihlMyk7CisKKyAgICAvLyB1cHBlciBjYXNlCisgICAgRVhQRUNUX0VRKCJ5ZXMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZRVMiKSk7CisgICAgRVhQRUNUX0VRKCJubyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk5PIikpOworICAgIEVYUEVDVF9FUSgieWVzLW5vIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiWUVTX05PIikpOworICAgIEVYUEVDVF9FUSgieWVzLW5vIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiWUVTX19OTyIpKTsKKyAgICBFWFBFQ1RfRVEoImEyZHAiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJBMkRQIikpOworICAgIEVYUEVDVF9FUSgibXAyLXRzIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTVAyX1RTIikpOworICAgIEVYUEVDVF9FUSgiYmxvY2stMmQiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJCTE9DS18yRCIpKTsKKyAgICBFWFBFQ1RfRVEoIm1wZWctMi10cyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1QRUdfMl9UUyIpKTsKKyAgICBFWFBFQ1RfRVEoIl9oaWRkZW4tdmFsdWUiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfSElEREVOX1ZBTFVFIikpOworICAgIEVYUEVDVF9FUSgiX19oaWRkZW4tdmFsdWUyIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX19ISURERU5fVkFMVUUyIikpOworICAgIEVYUEVDVF9FUSgiX19oaWRkZW4tdmFsdWUtMiIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9fSElEREVOX1ZBTFVFXzIiKSk7CisKKyAgICAvLyBjYW1lbCBjYXNlCisgICAgRVhQRUNUX0VRKCJ5ZXMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZZXMiKSk7CisgICAgRVhQRUNUX0VRKCJubyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk5vIikpOworICAgIEVYUEVDVF9FUSgieWVzLW5vIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiWWVzTm8iKSk7CisgICAgRVhQRUNUX0VRKCJ5ZXMtbm8iLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJZZXNfTm8iKSk7CisgICAgRVhQRUNUX0VRKCJtcDItdHMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNUDJUcyIpKTsKKyAgICBFWFBFQ1RfRVEoImJsb2NrLTJkIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiQmxvY2syRCIpKTsKKyAgICBFWFBFQ1RfRVEoIm1wZWctMi10cyIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIk1wZWcydHMiKSk7CisgICAgRVhQRUNUX0VRKCJfaGlkZGVuLXZhbHVlIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX0hpZGRlblZhbHVlIikpOworICAgIEVYUEVDVF9FUSgiX19oaWRkZW4tdmFsdWUtMiIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIl9fSGlkZGVuVmFsdWUyIikpOworCisgICAgLy8gbWl4ZWQgY2FzZQorICAgIEVYUEVDVF9FUSgibXAydC1zIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTVAyVF9zIikpOworICAgIEVYUEVDVF9FUSgiYmxvY2stMmQiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJCbG9ja18yRCIpKTsKKyAgICBFWFBFQ1RfRVEoImJsb2NrLTItZCIsIF9DMkVudW1VdGlsczo6Y2FtZWxDYXNlVG9EYXNoZWQoIkJsb2NrMl9EIikpOworICAgIEVYUEVDVF9FUSgibXBlZy0yLXRzIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiTXBlZ18ydHMiKSk7CisgICAgRVhQRUNUX0VRKCJtcGVnLTItdHMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJNcGVnXzJfVFMiKSk7CisgICAgRVhQRUNUX0VRKCJfaGlkZGVuLXZhbHVlIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX0hpZGRlbl9fVkFMVUUiKSk7CisgICAgRVhQRUNUX0VRKCJfX2hpZGRlbi12YWx1ZS0yIiwgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZCgiX19IaWRkZW5WYWx1ZV8yIikpOworICAgIEVYUEVDVF9FUSgiXzIiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfMiIpKTsKKyAgICBFWFBFQ1RfRVEoIl9fMjMiLCBfQzJFbnVtVXRpbHM6OmNhbWVsQ2FzZVRvRGFzaGVkKCJfXzIzIikpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvQzJfdGVzdC5jcHAgYi9tZWRpYS9jb2RlYzIvdGVzdHMvQzJfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmFkYTlmOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi90ZXN0cy9DMl90ZXN0LmNwcApAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMl90ZXN0IgorCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPEMyLmg+CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBTVEFUSUMgVEVTVFMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK3RlbXBsYXRlPGludCBOPgorc3RydWN0IGMyX2NvbnN0X2NoZWNrZXIKK3sKKyAgICBpbmxpbmUgY29uc3RleHByIHN0YXRpYyBpbnQgbnVtKCkgeyByZXR1cm4gTjsgfQorfTsKKworY29uc3RleHByIGF1dG8gbWluX2kzMl9pMzIgPSBjMl9taW4oaW50MzJfdCgxKSwgaW50MzJfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtaW5faTMyX2kzMiksIGNvbnN0IGludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQzMl90Iik7Citjb25zdGV4cHIgYXV0byBtaW5faTMyX2k2NCA9IGMyX21pbihpbnQzMl90KDMpLCBpbnQ2NF90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl9pMzJfaTY0KSwgY29uc3QgaW50NjRfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDY0X3QiKTsKK2NvbnN0ZXhwciBhdXRvIG1pbl9pOF9pMzIgPSBjMl9taW4oaW50OF90KDB4ZmYpLCBpbnQzMl90KDB4ZmZmZmZmZmYpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl9pOF9pMzIpLCBjb25zdCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOworCitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWluX2kzMl9pMzI+OjpudW0oKSA9PSAxLCAic2hvdWxkIGJlIDEiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtaW5faTMyX2k2ND46Om51bSgpID09IDIsICJzaG91bGQgYmUgMiIpOworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1pbl9pOF9pMzI+OjpudW0oKSA9PSAweGZmZmZmZmZmLCAic2hvdWxkIGJlIDB4ZmZmZmZmZmYiKTsKKworY29uc3RleHByIGF1dG8gbWluX3UzMl91MzIgPSBjMl9taW4odWludDMyX3QoMSksIHVpbnQzMl90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl91MzJfdTMyKSwgY29uc3QgdWludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50MzJfdCIpOworY29uc3RleHByIGF1dG8gbWluX3UzMl91NjQgPSBjMl9taW4odWludDMyX3QoMyksIHVpbnQ2NF90KDIpKTsKK3N0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKG1pbl91MzJfdTY0KSwgY29uc3QgdWludDMyX3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSB1aW50MzJfdCIpOworY29uc3RleHByIGF1dG8gbWluX3UzMl91OCA9IGMyX21pbih1aW50MzJfdCgweGZmZmZmZmZmKSwgdWludDhfdCgweGZmKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtaW5fdTMyX3U4KSwgY29uc3QgdWludDhfdD46OnZhbHVlLCAic2hvdWxkIGJlIHVpbnQ4X3QiKTsKKworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1pbl91MzJfdTMyPjo6bnVtKCkgPT0gMSwgInNob3VsZCBiZSAxIik7CitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWluX3UzMl91NjQ+OjpudW0oKSA9PSAyLCAic2hvdWxkIGJlIDIiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtaW5fdTMyX3U4Pjo6bnVtKCkgPT0gMHhmZiwgInNob3VsZCBiZSAweGZmIik7CisKK2NvbnN0ZXhwciBhdXRvIG1heF9pMzJfaTMyID0gYzJfbWF4KGludDMyX3QoMSksIGludDMyX3QoMikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWF4X2kzMl9pMzIpLCBjb25zdCBpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgaW50MzJfdCIpOworY29uc3RleHByIGF1dG8gbWF4X2kzMl9pNjQgPSBjMl9tYXgoaW50MzJfdCgzKSwgaW50NjRfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfaTMyX2k2NCksIGNvbnN0IGludDY0X3Q+Ojp2YWx1ZSwgInNob3VsZCBiZSBpbnQ2NF90Iik7Citjb25zdGV4cHIgYXV0byBtYXhfaThfaTMyID0gYzJfbWF4KGludDhfdCgweGZmKSwgaW50MzJfdCgweGZmZmZmZmZmKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfaThfaTMyKSwgY29uc3QgaW50MzJfdD46OnZhbHVlLCAic2hvdWxkIGJlIGludDMyX3QiKTsKKworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1heF9pMzJfaTMyPjo6bnVtKCkgPT0gMiwgInNob3VsZCBiZSAyIik7CitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWF4X2kzMl9pNjQ+OjpudW0oKSA9PSAzLCAic2hvdWxkIGJlIDMiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtYXhfaThfaTMyPjo6bnVtKCkgPT0gMHhmZmZmZmZmZiwgInNob3VsZCBiZSAweGZmZmZmZmZmIik7CisKK2NvbnN0ZXhwciBhdXRvIG1heF91MzJfdTMyID0gYzJfbWF4KHVpbnQzMl90KDEpLCB1aW50MzJfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfdTMyX3UzMiksIGNvbnN0IHVpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDMyX3QiKTsKK2NvbnN0ZXhwciBhdXRvIG1heF91MzJfdTY0ID0gYzJfbWF4KHVpbnQzMl90KDMpLCB1aW50NjRfdCgyKSk7CitzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShtYXhfdTMyX3U2NCksIGNvbnN0IHVpbnQ2NF90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDY0X3QiKTsKK2NvbnN0ZXhwciBhdXRvIG1heF91MzJfdTggPSBjMl9tYXgodWludDMyX3QoMHg3ZmZmZmZmZiksIHVpbnQ4X3QoMHhmZikpOworc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUobWF4X3UzMl91OCksIGNvbnN0IHVpbnQzMl90Pjo6dmFsdWUsICJzaG91bGQgYmUgdWludDMyX3QiKTsKKworc3RhdGljX2Fzc2VydChjMl9jb25zdF9jaGVja2VyPG1heF91MzJfdTMyPjo6bnVtKCkgPT0gMiwgInNob3VsZCBiZSAyIik7CitzdGF0aWNfYXNzZXJ0KGMyX2NvbnN0X2NoZWNrZXI8bWF4X3UzMl91NjQ+OjpudW0oKSA9PSAzLCAic2hvdWxkIGJlIDMiKTsKK3N0YXRpY19hc3NlcnQoYzJfY29uc3RfY2hlY2tlcjxtYXhfdTMyX3U4Pjo6bnVtKCkgPT0gMHg3ZmZmZmZmZiwgInNob3VsZCBiZSAweDdmZmZmZmZmIik7CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBDT1VOVEVSIFRFU1RTID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCit2b2lkIGMyX2NudHJfc3RhdGljX3Rlc3QoKSB7CisgICAgLy8gc2FuaXR5IGNoZWNrcyBmb3IgY29uc3RydWN0aW9uL2Fzc2lnbm1lbnQKKyAgICBjb25zdGV4cHIgYzJfY250cjMyX3QgYzMyX2EoMTIzKTsKKyAgICBjb25zdGV4cHIgYzJfY250cjY0X3QgYzY0X2EoLTQ1Nik7CisgICAgYzJfY250cjMyX3QgYzMyX2IgX191bnVzZWQgPSBjNjRfYTsKKyAgICAvLyBjMzJfYiA9IDY0LjsgLy8gRElTQUxMT1dFRAorICAgIC8vIGMyX2NudHI2NF90IGM2NF9iID0gYzMyX2E7IC8vIERJU0FMTE9XRUQKKworICAgIC8vIHNhbml0eSBjaGVja3MgZm9yIHNvbWUgY29uc3RleHByIG9wZXJhdG9ycworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGMzMl9hICsgYzY0X2EpLCBkZWNsdHlwZShjNjRfYSArIGMzMl9hKT46OnZhbHVlLCAiKyBzaG91bGQgcmVzdWx0IHNhbWUgdHlwZSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgKyBjNjRfYSA9PSBjMl9jbnRyMzJfdCgtMzMzKSwgIjEyMyArIC00NTYgPSAtMzMzIik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSArIGMzMl9hID09IGMyX2NudHIzMl90KDI0NiksICIxMjMgKyAxMjMgPSAyNDYiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM2NF9hICsgYzMyX2EgPT0gYzJfY250cjMyX3QoLTMzMyksICItNDU2ICsgMTIzID0gNTc5Iik7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoYzMyX2EgKyAxKSwgZGVjbHR5cGUoMSArIGMzMl9hKT46OnZhbHVlLCAiKyBzaG91bGQgcmVzdWx0IHNhbWUgdHlwZSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgKyA0NTYgPT0gYzJfY250cjMyX3QoNTc5KSwgIjEyMyArIDQ1NiA9IDU3OSIpOworICAgIHN0YXRpY19hc3NlcnQoNDU2ICsgYzY0X2EgPT0gYzJfY250cjY0X3QoMCksICI0NTYgKyAtNDU2ID0gMCIpOworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGMzMl9hIC0gYzY0X2EpLCBkZWNsdHlwZShjNjRfYSAtIGMzMl9hKT46OnZhbHVlLCAiLSBzaG91bGQgcmVzdWx0IHNhbWUgdHlwZSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgLSBjNjRfYSA9PSBjMl9jbnRyMzJfdCg1NzkpLCAiMTIzIC0gLTQ1NiA9IDU3OSIpOworICAgIHN0YXRpY19hc3NlcnQoYzMyX2EgLSBjMzJfYSA9PSBjMl9jbnRyMzJfdCgwKSwgIjEyMyAtIDEyMyA9IDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM2NF9hIC0gYzMyX2EgPT0gYzJfY250cjMyX3QoLTU3OSksICItNDU2IC0gMTIzID0gLTU3OSIpOworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKGMzMl9hIC0gMSksIGRlY2x0eXBlKDEgLSBjMzJfYSk+Ojp2YWx1ZSwgIi0gc2hvdWxkIHJlc3VsdCBzYW1lIHR5cGUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hIC0gNDU2ID09IGMyX2NudHIzMl90KC0zMzMpLCAiMTIzIC0gNDU2ID0gLTMzMyIpOworICAgIHN0YXRpY19hc3NlcnQoNDU2IC0gYzY0X2EgPT0gYzJfY250cjY0X3QoOTEyKSwgIjQ1NiAtIC00NTYgPSA5MTIiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShjMzJfYSAqIGM2NF9hKSwgZGVjbHR5cGUoYzY0X2EgKiBjMzJfYSk+Ojp2YWx1ZSwgIiogc2hvdWxkIHJlc3VsdCBzYW1lIHR5cGUiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hICogYzY0X2EgPT0gYzJfY250cjMyX3QoLTU2MDg4KSwgIjEyMyAqIC00NTYgPSAtNTYwODgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMzMl9hICogYzMyX2EgPT0gYzJfY250cjMyX3QoMTUxMjkpLCAiMTIzICogMTIzID0gMTUxMjkiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM2NF9hICogYzMyX2EgPT0gYzJfY250cjMyX3QoLTU2MDg4KSwgIi00NTYgKiAxMjMgPSAtNTYwODgiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxkZWNsdHlwZShjMzJfYSAqIDEpLCBkZWNsdHlwZSgxICogYzMyX2EpPjo6dmFsdWUsICIqIHNob3VsZCByZXN1bHQgc2FtZSB0eXBlIik7CisgICAgc3RhdGljX2Fzc2VydChjMzJfYSAqIDQ1NiA9PSBjMl9jbnRyMzJfdCg1NjA4OCksICIxMjMgKiA0NTYgPSA1NjA4OCIpOworICAgIHN0YXRpY19hc3NlcnQoNDU2ICogYzY0X2EgPT0gYzJfY250cjY0X3QoLTIwNzkzNiksICI0NTYgKiAtNDU2ID0gLTIwNzkzNiIpOworCisgICAgc3RhdGljX2Fzc2VydCgoYzMyX2EgPDwgMjZ1KSA9PSBjMl9jbnRyMzJfdCgweEVDMDAwMDAwKSwgIjEyMyA8PCAyNiA9IDB4RUMwMDAwMDAiKTsKKworICAgIC8vIHNhbml0eSBjaGVja3MgZm9yIHVuYXJ5IG9wZXJhdG9ycworICAgIHN0YXRpY19hc3NlcnQoYzJfY250cjMyX3QoMSkgPT0gK2MyX2NudHIzMl90KDEpLCAiMSA9PSArMSIpOworICAgIHN0YXRpY19hc3NlcnQoYzJfY250cjMyX3QoMSkgPT0gLWMyX2NudHIzMl90KC0xKSwgIjEgPT0gLS0xIik7CisKKyAgICAvLyBzYW5pdHkgY2hlY2tzIGZvciBjb21wYXJpc29uCisgICAgdXNpbmcgYzhfdCA9IGMyX2NudHJfdDx1aW50OF90PjsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoLTB4ODApID4gYzhfdCgweDdmKSwgIjgwID4gN0YiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoLTB4ODApID49IGM4X3QoMHg3ZiksICI4MCA+PSA3RiIpOworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgweDdmKSA+IGM4X3QoMHg3ZSksICI3RiA+IDdFIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KDB4N2YpID49IGM4X3QoMHg3ZSksICI3RiA+PSA3RSIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDgwKSA+IGM4X3QoMCkpLCAiODAgIT4gMDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg4MCkgPj0gYzhfdCgwKSksICI4MCAhPj0gMDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg4MCkgPiBjOF90KC0weDgwKSksICI4MCAhPiA4MCIpOworICAgIHN0YXRpY19hc3NlcnQoYzhfdCgtMHg4MCkgPj0gYzhfdCgtMHg4MCksICI4MCA+PSA4MCIpOworCisgICAgc3RhdGljX2Fzc2VydChjOF90KC0weDgwKSA9PSBjOF90KDB4ODApLCAiODAgPT0gODAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg4MCkgPT0gYzhfdCgwKSksICI4MCAhPSAwIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KC0weDgwKSAhPSBjOF90KDB4N2YpLCAiODAgIT0gN0YiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgweDdmKSAhPSBjOF90KDB4N2YpKSwgIjgwICE9IDdGIik7CisKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoMHg3ZikgPCBjOF90KC0weDgwKSwgIjdGIDwgODAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoMHg3ZikgPD0gYzhfdCgtMHg4MCksICI3RiA8IDgwIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KDB4N2UpIDwgYzhfdCgweDdmKSwgIjdFIDwgN0YiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGM4X3QoMHg3ZSkgPD0gYzhfdCgweDdmKSwgIjdFIDwgN0YiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg0MCkgPCBjOF90KDB4NDApKSwgIi00MCAhPCA0MCIpOworICAgIHN0YXRpY19hc3NlcnQoIShjOF90KC0weDQwKSA8PSBjOF90KDB4NDApKSwgIi00MCAhPD0gNDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KCEoYzhfdCgtMHg0MCkgPCBjOF90KC0weDQwKSksICItNDAgITwgLTQwIik7CisgICAgc3RhdGljX2Fzc2VydChjOF90KC0weDQwKSA8PSBjOF90KC0weDQwKSwgIi00MCA8PSAtNDAiKTsKKworICAgIHN0YXRpY19hc3NlcnQoYzJfY250cjMyX3QoLTB4N2ZmZmZmZmYgLSAxKSA+IGMyX2NudHIzMl90KDB4N2ZmZmZmZmYpLCAiODAgPiA3RiIpOworICAgIHN0YXRpY19hc3NlcnQoIShjMl9jbnRyMzJfdCgtMHg3ZmZmZmZmZiAtIDEpID4gYzJfY250cjMyX3QoMCkpLCAiODAgIT4gMDAiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KGMyX2NudHIzMl90KDEpID09IGMyX2NudHIzMl90KGMyX2NudHI2NF90KDB4MTAwMDAwMDAxdWwpKSwgIjEgPT0gMSIpOworfQorCitjbGFzcyBDMlRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK307CisKK1RFU1RfRihDMlRlc3QsIENvdW50ZXJUZXN0KSB7CisgICAgYzJfY250cjMyX3QgYzMyX2EoMTIzKTsKKyAgICBjMl9jbnRyNjRfdCBjNjRfYSgtNDU2KTsKKyAgICBFWFBFQ1RfRVEoYzMyX2EgKz0gMywgYzJfY250cjMyX3QoMTI2KSk7CisgICAgRVhQRUNUX0VRKGMzMl9hICs9IGM2NF9hLCBjMl9jbnRyMzJfdCgtMzMwKSk7CisgICAgRVhQRUNUX0VRKGMzMl9hIDw8PSAydSwgYzJfY250cjMyX3QoLTEzMjApKTsKKyAgICBFWFBFQ1RfRVEoYzY0X2EgKj0gMywgYzJfY250cjY0X3QoLTEzNjgpKTsKKyAgICBFWFBFQ1RfRVEoYzMyX2EgLT0gYzY0X2EsIGMyX2NudHIzMl90KDQ4KSk7CisgICAgRVhQRUNUX0VRKGMzMl9hIC09IDQwLCBjMl9jbnRyMzJfdCg4KSk7CisgICAgRVhQRUNUX0VRKGMzMl9hICo9IGMzMl9hLCBjMl9jbnRyMzJfdCg2NCkpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdGVzdHMvdm5kay9DMkJ1ZmZlclRlc3QuY3BwIGIvbWVkaWEvY29kZWMyL3Rlc3RzL3ZuZGsvQzJCdWZmZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODA5OTRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3Rlc3RzL3ZuZGsvQzJCdWZmZXJUZXN0LmNwcApAQCAtMCwwICsxLDc2OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvcklvbi5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJQYXJhbURlZi5oPgorCisjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQzJCdWZmZXJVdGlsc1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNTZWdtZW50VGVzdCgpIHsKKyAgICAgICAgLy8gY29uc3RydWN0b3IKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkub2Zmc2V0ID09IDEyMywgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5zaXplID09IDQ1NiwgIiIpOworCisgICAgICAgIC8vIGVtcHR5CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pc0VtcHR5KCksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMHUpLmlzRW1wdHkoKSwgIiIpOworCisgICAgICAgIC8vIHZhbGlkCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmlzVmFsaWQoKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCB+MTIzdSkuaXNWYWxpZCgpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLmlzVmFsaWQoKSwgIiIpOworCisgICAgICAgIC8vIGJvb2woKQorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KChib29sKUMyU2VnbWVudCgxMjN1LCB+MTIzdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghYm9vbChDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghYm9vbChDMlNlZ21lbnQoMTIzdSwgMCkpLCAiIik7CisKKyAgICAgICAgLy8gIQorICAgICAgICBzdGF0aWNfYXNzZXJ0KCEhQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoISFDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCAwKSwgIiIpOworCisgICAgICAgIC8vIGNvbnRhaW5zCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5jb250YWlucyhDMlNlZ21lbnQoMTIzdSwgMCkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjN1LCAwKSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjN1LCB+MTIzdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCB+MTIzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIUMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCFDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLmNvbnRhaW5zKEMyU2VnbWVudCgxMjJ1LCAydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5jb250YWlucyhDMlNlZ21lbnQoMTIzdSwgMnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAzdSkuY29udGFpbnMoQzJTZWdtZW50KDEyNHUsIDJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghQzJTZWdtZW50KDEyM3UsIDN1KS5jb250YWlucyhDMlNlZ21lbnQoMTI1dSwgMnUpKSwgIiIpOworCisgICAgICAgIC8vID09CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID09IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID09IEMyU2VnbWVudCgxMjN1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA9PSBDMlNlZ21lbnQoMTIzdSwgNDU1dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPT0gQzJTZWdtZW50KDEyMnUsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID09IEMyU2VnbWVudCgxMjR1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCAwdSkgPT0gQzJTZWdtZW50KDEyNHUsIDB1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMHUpID09IEMyU2VnbWVudCgxMjN1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KSA9PSBDMlNlZ21lbnQoMTI0dSwgMSArIH4xMjR1KSwgIiIpOworCisgICAgICAgIC8vICE9CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgIT0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSAhPSBDMlNlZ21lbnQoMTIzdSwgNDU3dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgIT0gQzJTZWdtZW50KDEyM3UsIDQ1NXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpICE9IEMyU2VnbWVudCgxMjJ1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSAhPSBDMlNlZ21lbnQoMTI0dSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMHUpICE9IEMyU2VnbWVudCgxMjR1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCAwdSkgIT0gQzJTZWdtZW50KDEyM3UsIDB1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpICE9IEMyU2VnbWVudCgxMjR1LCAxICsgfjEyNHUpKSwgIiIpOworCisgICAgICAgIC8vIDw9CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpIDw9IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KSA8PSBDMlNlZ21lbnQoMTIzdSwgNDU3dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPD0gQzJTZWdtZW50KDEyMnUsIDQ1N3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPD0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDQ1N3UpIDw9IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjN1LCA0NTd1KSA8PSBDMlNlZ21lbnQoMTI0dSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgNDU3dSkgPD0gQzJTZWdtZW50KDEyM3UsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDB1KSA8PSBDMlNlZ21lbnQoMTIzdSwgMHUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAwdSkgPD0gQzJTZWdtZW50KDEyMnUsIDF1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAwdSkgPD0gQzJTZWdtZW50KDEyMnUsIDF1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSA8PSBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpIDw9IEMyU2VnbWVudCgxMjJ1LCB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA8PSBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKworICAgICAgICAvLyA8CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPCBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpIDwgQzJTZWdtZW50KDEyM3UsIDQ1N3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpIDwgQzJTZWdtZW50KDEyMnUsIDQ1N3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPCBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgNDU3dSkgPCBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPCBDMlNlZ21lbnQoMTI0dSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgNDU3dSkgPCBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMHUpIDwgQzJTZWdtZW50KDEyM3UsIDB1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMHUpIDwgQzJTZWdtZW50KDEyMnUsIDF1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAwdSkgPCBDMlNlZ21lbnQoMTIydSwgMXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgfjEyMnUpIDwgQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA8IEMyU2VnbWVudCgxMjJ1LCB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA8IEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpKSwgIiIpOworCisgICAgICAgIC8vIDw9CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID49IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTd1KSA+PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIydSwgNDU3dSkgPj0gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPj0gQzJTZWdtZW50KDEyM3UsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDQ1NnUpID49IEMyU2VnbWVudCgxMjJ1LCA0NTd1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjR1LCA0NTd1KSA+PSBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPj0gQzJTZWdtZW50KDEyMnUsIDQ1N3UpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyM3UsIDB1KSA+PSBDMlNlZ21lbnQoMTIydSwgMHUpKSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAxdSkgPj0gQzJTZWdtZW50KDEyM3UsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAxdSkgPj0gQzJTZWdtZW50KDEyMnUsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KCEoQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkgPj0gQzJTZWdtZW50KDEyMnUsIH4xMjJ1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydCghKEMyU2VnbWVudCgxMjJ1LCB+MTIydSkgPj0gQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA+PSBDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSksICIiKTsKKworICAgICAgICAvLyA8CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPiBDMlNlZ21lbnQoMTIzdSwgNDU2dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1N3UpID4gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyMnUsIDQ1N3UpID4gQzJTZWdtZW50KDEyM3UsIDQ1NnUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPiBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU2dSkgPiBDMlNlZ21lbnQoMTIydSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTI0dSwgNDU3dSkgPiBDMlNlZ21lbnQoMTIzdSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgNDU3dSkgPiBDMlNlZ21lbnQoMTIydSwgNDU3dSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIzdSwgMHUpID4gQzJTZWdtZW50KDEyMnUsIDB1KSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIydSwgMXUpID4gQzJTZWdtZW50KDEyM3UsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjJ1LCAxdSkgPiBDMlNlZ21lbnQoMTIydSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA+IEMyU2VnbWVudCgxMjJ1LCB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgfjEyMnUpID4gQzJTZWdtZW50KDEyMnUsIDEgKyB+MTIydSkpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoIShDMlNlZ21lbnQoMTIydSwgMSArIH4xMjJ1KSA+IEMyU2VnbWVudCgxMjJ1LCAxICsgfjEyMnUpKSwgIiIpOworCisgICAgICAgIC8vIGVuZAorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5lbmQoKSA9PSA1Nzl1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDB1KS5lbmQoKSA9PSAxMjN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIH4xMjN1KS5lbmQoKSA9PSAweGZmZmZmZmZmdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCAxICsgfjEyM3UpLmVuZCgpID09IDB1LCAiIik7CisKKyAgICAgICAgLy8gaW50ZXJzZWN0CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTIzdSwgNDU2dSkpID09IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDEyM3UsIDQ2MHUpKSA9PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxMjR1LCA0NjB1KSkgPT0gQzJTZWdtZW50KDEyNHUsIDQ1NXUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoNTc5dSwgNDYwdSkpID09IEMyU2VnbWVudCg1Nzl1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCg1ODl1LCA0NjB1KSkgPT0gQzJTZWdtZW50KDU4OXUsIH45dSAvKiAtMTAgKi8pLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTIzdSwgNDU1dSkpID09IEMyU2VnbWVudCgxMjN1LCA0NTV1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDEyMnUsIDQ1NnUpKSA9PSBDMlNlZ21lbnQoMTIzdSwgNDU1dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgwdSwgMTIzdSkpID09IEMyU2VnbWVudCgxMjN1LCAwdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgwdSwgMHUpKSA9PSBDMlNlZ21lbnQoMTIzdSwgfjEyMnUgLyogLTEyMyAqLyksICIiKTsKKworICAgICAgICAvLyBub3JtYWxpemUgKGNoYW5nZSBpbnZhbGlkIHNlZ21lbnRzIHRvIGVtcHR5IHNlZ21lbnRzKQorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTIzdSwgNDU2dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxMjN1LCB+MTIzdSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgMSArIH4xMjN1KS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTIzdSwgMHUpLCAiIik7CisKKyAgICAgICAgLy8gbm90ZTogbm9ybWFsaXplIGNhbm5vdCBiZSB1c2VkIHRvIG1ha2UgdGhpcyB3b3JrCisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTUwdSwgfjE1MHUpKS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTUwdSwgNDI5dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxNTB1LCAxICsgfjE1MHUpKS5ub3JtYWxpemUoKSAhPSBDMlNlZ21lbnQoMTUwdSwgNDI5dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgxNTB1LCAxICsgfjE1MHUpKS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTUwdSwgMHUpLCAiIik7CisKKyAgICAgICAgLy8gc2F0dXJhdGUgKGNoYW5nZSBpbnZhbGlkIHNlZ21lbnRzIHRvIGZ1bGwgc2VnbWVudHMgdXAgdG8gbWF4KQorICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5zYXR1cmF0ZSgpID09IEMyU2VnbWVudCgxMjN1LCA0NTZ1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCB+MTIzdSkuc2F0dXJhdGUoKSA9PSBDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDEgKyB+MTIzdSkuc2F0dXJhdGUoKSA9PSBDMlNlZ21lbnQoMTIzdSwgfjEyM3UpLCAiIik7CisKKyAgICAgICAgLy8gbm90ZTogc2F0dXJhdGUgY2FuIGJlIHVzZWQgdG8gbWFrZSB0aGlzIHdvcmsgYnV0IG9ubHkgcGFydGlhbGx5CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTUwdSwgMSArIH4xNTB1KS5zYXR1cmF0ZSgpKS5ub3JtYWxpemUoKSA9PSBDMlNlZ21lbnQoMTUwdSwgNDI5dSksICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChDMlNlZ21lbnQoMTIzdSwgNDU2dSkuaW50ZXJzZWN0KEMyU2VnbWVudCgwdSwgMTAwdSkuc2F0dXJhdGUoKSkubm9ybWFsaXplKCkgPT0gQzJTZWdtZW50KDEyM3UsIDB1KSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KEMyU2VnbWVudCgxMjN1LCA0NTZ1KS5pbnRlcnNlY3QoQzJTZWdtZW50KDEwMDB1LCAxMDB1KS5zYXR1cmF0ZSgpKS5ub3JtYWxpemUoKSAhPSBDMlNlZ21lbnQoNTc5dSwgMHUpLCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoQzJTZWdtZW50KDEyM3UsIDQ1NnUpLmludGVyc2VjdChDMlNlZ21lbnQoMTAwMHUsIDEwMHUpLnNhdHVyYXRlKCkpLm5vcm1hbGl6ZSgpID09IEMyU2VnbWVudCgxMDAwdSwgMHUpLCAiIik7CisKKyAgICB9CisKKyAgICBzdGF0aWMgdm9pZCBTdGF0aWNMaW5lYXJSYW5nZUFuZENhcGFjaXR5VGVzdCgpIHsKKyAgICAgICAgY2xhc3MgVGVzdENhcGFjaXR5IDogcHVibGljIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0IHsKKyAgICAgICAgICAgIHVzaW5nIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0OjpfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdDsKKyAgICAgICAgICAgIGZyaWVuZCBjbGFzcyBDMkJ1ZmZlclV0aWxzVGVzdDsKKyAgICAgICAgfTsKKworICAgICAgICBjbGFzcyBUZXN0UmFuZ2UgOiBwdWJsaWMgX0MyTGluZWFyUmFuZ2VBc3BlY3QgeworICAgICAgICAgICAgdXNpbmcgX0MyTGluZWFyUmFuZ2VBc3BlY3Q6Ol9DMkxpbmVhclJhbmdlQXNwZWN0OworICAgICAgICAgICAgZnJpZW5kIGNsYXNzIEMyQnVmZmVyVXRpbHNUZXN0OworICAgICAgICB9OworCisgICAgICAgIC8vIF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdENhcGFjaXR5KDB1KS5jYXBhY2l0eSgpID09IDB1LCAiIik7CisgICAgICAgIGNvbnN0ZXhwciBUZXN0Q2FwYWNpdHkgY2FwKDEyM3UpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RDYXBhY2l0eSgmY2FwKS5jYXBhY2l0eSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0Q2FwYWNpdHkobnVsbHB0cikuY2FwYWNpdHkoKSA9PSAwdSwgIiIpOworCisgICAgICAgIC8vIF9DMkxpbmVhckNhcGFjaXR5UmFuZ2UKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCkuY2FwYWNpdHkoKSA9PSAxMjN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXApLm9mZnNldCgpID09IDB1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXApLnNpemUoKSA9PSAxMjN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXApLmVuZE9mZnNldCgpID09IDEyM3UsICIiKTsKKworICAgICAgICBjb25zdGV4cHIgVGVzdFJhbmdlIHJhbmdlKCZjYXAsIDUwdSwgMTAwdSk7CisKKyAgICAgICAgc3RhdGljX2Fzc2VydChyYW5nZS5jYXBhY2l0eSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChyYW5nZS5vZmZzZXQoKSA9PSA1MHUsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChyYW5nZS5zaXplKCkgPT0gNzN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQocmFuZ2UuZW5kT2Zmc2V0KCkgPT0gMTIzdSwgIiIpOworCisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXAsIDIwdSwgMzB1KS5jYXBhY2l0eSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjB1LCAzMHUpLm9mZnNldCgpID09IDIwdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwLCAyMHUsIDMwdSkuc2l6ZSgpID09IDMwdSwgIiIpOworICAgICAgICBzdGF0aWNfYXNzZXJ0KFRlc3RSYW5nZSgmY2FwLCAyMHUsIDMwdSkuZW5kT2Zmc2V0KCkgPT0gNTB1LCAiIik7CisKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjAwdSwgMzB1KS5jYXBhY2l0eSgpID09IDEyM3UsICIiKTsKKyAgICAgICAgc3RhdGljX2Fzc2VydChUZXN0UmFuZ2UoJmNhcCwgMjAwdSwgMzB1KS5vZmZzZXQoKSA9PSAxMjN1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXAsIDIwMHUsIDMwdSkuc2l6ZSgpID09IDB1LCAiIik7CisgICAgICAgIHN0YXRpY19hc3NlcnQoVGVzdFJhbmdlKCZjYXAsIDIwMHUsIDMwdSkuZW5kT2Zmc2V0KCkgPT0gMTIzdSwgIiIpOworCisgICAgfQorCit9OworCisKK2NsYXNzIEMyQnVmZmVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworcHVibGljOgorICAgIEMyQnVmZmVyVGVzdCgpCisgICAgICAgIDogbUJsb2NrUG9vbElkKEMyQmxvY2tQb29sOjpQTEFURk9STV9TVEFSVCksCisgICAgICAgICAgbUxpbmVhckFsbG9jYXRvcihzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdG9ySW9uPignaScpKSwKKyAgICAgICAgICBtU2l6ZSgwdSksCisgICAgICAgICAgbUFkZHIobnVsbHB0ciksCisgICAgICAgICAgbUdyYXBoaWNBbGxvY2F0b3Ioc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRvckdyYWxsb2M+KCdnJykpIHsKKyAgICB9CisKKyAgICB+QzJCdWZmZXJUZXN0KCkgPSBkZWZhdWx0OworCisgICAgdm9pZCBhbGxvY2F0ZUxpbmVhcihzaXplX3QgY2FwYWNpdHkpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUxpbmVhckFsbG9jYXRvci0+bmV3TGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICBjYXBhY2l0eSwKKyAgICAgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICAgICAmbUxpbmVhckFsbG9jYXRpb24pOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBtTGluZWFyQWxsb2NhdGlvbi5yZXNldCgpOworICAgICAgICAgICAgRkFJTCgpIDw8ICJDMkFsbG9jYXRvcjo6bmV3TGluZWFyQWxsb2NhdGlvbigpIGZhaWxlZDogIiA8PCBlcnI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2b2lkIG1hcExpbmVhcihzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgdWludDhfdCAqKmFkZHIpIHsKKyAgICAgICAgQVNTRVJUX1RSVUUobUxpbmVhckFsbG9jYXRpb24pOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtTGluZWFyQWxsb2NhdGlvbi0+bWFwKAorICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAmbUFkZHIpOworICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICBtQWRkciA9IG51bGxwdHI7CisgICAgICAgICAgICBGQUlMKCkgPDwgIkMyTGluZWFyQWxsb2NhdGlvbjo6bWFwKCkgZmFpbGVkOiAiIDw8IGVycjsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlRfTkUobnVsbHB0ciwgbUFkZHIpOworICAgICAgICBtU2l6ZSA9IHNpemU7CisgICAgICAgICphZGRyID0gKHVpbnQ4X3QgKiltQWRkcjsKKyAgICB9CisKKyAgICB2b2lkIHVubWFwTGluZWFyKCkgeworICAgICAgICBBU1NFUlRfVFJVRShtTGluZWFyQWxsb2NhdGlvbik7CisgICAgICAgIEFTU0VSVF9ORShudWxscHRyLCBtQWRkcik7CisgICAgICAgIEFTU0VSVF9ORSgwdSwgbVNpemUpOworCisgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgIEFTU0VSVF9FUShDMl9PSywgbUxpbmVhckFsbG9jYXRpb24tPnVubWFwKG1BZGRyLCBtU2l6ZSwgbnVsbHB0cikpOworICAgICAgICBtU2l6ZSA9IDB1OworICAgICAgICBtQWRkciA9IG51bGxwdHI7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtYWtlTGluZWFyQmxvY2tQb29sKCkgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUxpbmVhckFsbG9jYXRvciwgbUJsb2NrUG9vbElkKyspOworICAgIH0KKworICAgIHZvaWQgYWxsb2NhdGVHcmFwaGljKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUdyYXBoaWNBbGxvY2F0b3ItPm5ld0dyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgIGhlaWdodCwKKyAgICAgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgsCisgICAgICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAgICAgJm1HcmFwaGljQWxsb2NhdGlvbik7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIG1HcmFwaGljQWxsb2NhdGlvbi5yZXNldCgpOworICAgICAgICAgICAgRkFJTCgpIDw8ICJDMkFsbG9jYXRvcjo6bmV3R3JhcGhpY0FsbG9jYXRpb24oKSBmYWlsZWQ6ICIgPDwgZXJyOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBtYXBHcmFwaGljKEMyUmVjdCByZWN0LCBDMlBsYW5hckxheW91dCAqbGF5b3V0LCB1aW50OF90ICoqYWRkcikgeworICAgICAgICBBU1NFUlRfVFJVRShtR3JhcGhpY0FsbG9jYXRpb24pOworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtR3JhcGhpY0FsbG9jYXRpb24tPm1hcCgKKyAgICAgICAgICAgICAgICByZWN0LAorICAgICAgICAgICAgICAgIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LAorICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBsYXlvdXQsCisgICAgICAgICAgICAgICAgYWRkcik7CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdID0gbnVsbHB0cjsKKyAgICAgICAgICAgIEZBSUwoKSA8PCAiQzJHcmFwaGljQWxsb2NhdGlvbjo6bWFwKCkgZmFpbGVkOiAiIDw8IGVycjsKKyAgICAgICAgfQorICAgICAgICBtTWFwcGVkUmVjdCA9IHJlY3Q7CisgICAgICAgIG1lbWNweShtQWRkckdyYXBoaWMsIGFkZHIsIHNpemVvZih1aW50OF90KikgKiBDMlBsYW5hckxheW91dDo6TUFYX05VTV9QTEFORVMpOworICAgIH0KKworICAgIHZvaWQgdW5tYXBHcmFwaGljKCkgeworICAgICAgICBBU1NFUlRfVFJVRShtR3JhcGhpY0FsbG9jYXRpb24pOworCisgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgIEFTU0VSVF9FUShDMl9PSywgbUdyYXBoaWNBbGxvY2F0aW9uLT51bm1hcChtQWRkckdyYXBoaWMsIG1NYXBwZWRSZWN0LCBudWxscHRyKSk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBtYWtlR3JhcGhpY0Jsb2NrUG9vbCgpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2w+KG1HcmFwaGljQWxsb2NhdG9yKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbElkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUxpbmVhckFsbG9jYXRvcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBtTGluZWFyQWxsb2NhdGlvbjsKKyAgICBzaXplX3QgbVNpemU7CisgICAgdm9pZCAqbUFkZHI7CisgICAgQzJSZWN0IG1NYXBwZWRSZWN0OworICAgIHVpbnQ4X3QqIG1BZGRyR3JhcGhpY1tDMlBsYW5hckxheW91dDo6TUFYX05VTV9QTEFORVNdOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtR3JhcGhpY0FsbG9jYXRvcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gbUdyYXBoaWNBbGxvY2F0aW9uOworfTsKKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgTGluZWFyQWxsb2NhdGlvblRlc3QpIHsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtDYXBhY2l0eSA9IDEwMjR1ICogMTAyNHU7CisKKyAgICBhbGxvY2F0ZUxpbmVhcihrQ2FwYWNpdHkpOworCisgICAgdWludDhfdCAqYWRkciA9IG51bGxwdHI7CisgICAgbWFwTGluZWFyKDB1LCBrQ2FwYWNpdHksICZhZGRyKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcik7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtDYXBhY2l0eTsgKytpKSB7CisgICAgICAgIGFkZHJbaV0gPSBpICUgMTAwdTsKKyAgICB9CisKKyAgICB1bm1hcExpbmVhcigpOworICAgIGFkZHIgPSBudWxscHRyOworCisgICAgbWFwTGluZWFyKGtDYXBhY2l0eSAvIDMsIGtDYXBhY2l0eSAvIDMsICZhZGRyKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrQ2FwYWNpdHkgLyAzOyArK2kpIHsKKyAgICAgICAgQVNTRVJUX0VRKChpICsga0NhcGFjaXR5IC8gMykgJSAxMDAsIGFkZHJbaV0pIDw8ICIgYXQgaSA9ICIgPDwgaTsKKyAgICB9Cit9CisKK1RFU1RfRihDMkJ1ZmZlclRlc3QsIEJsb2NrUG9vbFRlc3QpIHsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtDYXBhY2l0eSA9IDEwMjR1ICogMTAyNHU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IGJsb2NrUG9vbChtYWtlTGluZWFyQmxvY2tQb29sKCkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgIEFTU0VSVF9FUShDMl9PSywgYmxvY2tQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAga0NhcGFjaXR5LAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmYmxvY2spKTsKKyAgICBBU1NFUlRfVFJVRShibG9jayk7CisKKyAgICBDMkFjcXVpcmFibGU8QzJXcml0ZVZpZXc+IHdyaXRlVmlld0hvbGRlciA9IGJsb2NrLT5tYXAoKTsKKyAgICBDMldyaXRlVmlldyB3cml0ZVZpZXcgPSB3cml0ZVZpZXdIb2xkZXIuZ2V0KCk7CisgICAgQVNTRVJUX0VRKEMyX09LLCB3cml0ZVZpZXcuZXJyb3IoKSk7CisgICAgQVNTRVJUX0VRKGtDYXBhY2l0eSwgd3JpdGVWaWV3LmNhcGFjaXR5KCkpOworICAgIEFTU0VSVF9FUSgwdSwgd3JpdGVWaWV3Lm9mZnNldCgpKTsKKyAgICBBU1NFUlRfRVEoa0NhcGFjaXR5LCB3cml0ZVZpZXcuc2l6ZSgpKTsKKworICAgIHVpbnQ4X3QgKmRhdGEgPSB3cml0ZVZpZXcuZGF0YSgpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBkYXRhKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHdyaXRlVmlldy5zaXplKCk7ICsraSkgeworICAgICAgICBkYXRhW2ldID0gaSAlIDEwMHU7CisgICAgfQorCisgICAgd3JpdGVWaWV3LnNldE9mZnNldChrQ2FwYWNpdHkgLyAzKTsKKyAgICBkYXRhID0gd3JpdGVWaWV3LmRhdGEoKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgZGF0YSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB3cml0ZVZpZXcuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQVNTRVJUX0VRKChpICsga0NhcGFjaXR5IC8gMykgJSAxMDB1LCBkYXRhW2ldKSA8PCAiIGF0IGkgPSAiIDw8IGkKKyAgICAgICAgICAgIDw8ICI7IGRhdGEgPSAiIDw8IHN0YXRpY19jYXN0PHZvaWQgKj4oZGF0YSk7CisgICAgfQorCisgICAgQzJGZW5jZSBmZW5jZTsKKyAgICBDMkNvbnN0TGluZWFyQmxvY2sgY29uc3RCbG9jayA9IGJsb2NrLT5zaGFyZSgKKyAgICAgICAgICAgIGtDYXBhY2l0eSAvIDMsIGtDYXBhY2l0eSAvIDMsIGZlbmNlKTsKKworICAgIEMyQWNxdWlyYWJsZTxDMlJlYWRWaWV3PiByZWFkVmlld0hvbGRlciA9IGNvbnN0QmxvY2subWFwKCk7CisgICAgQzJSZWFkVmlldyByZWFkVmlldyA9IHJlYWRWaWV3SG9sZGVyLmdldCgpOworICAgIEFTU0VSVF9FUShDMl9PSywgcmVhZFZpZXcuZXJyb3IoKSk7CisgICAgQVNTRVJUX0VRKGtDYXBhY2l0eSAvIDMsIHJlYWRWaWV3LmNhcGFjaXR5KCkpOworCisgICAgLy8gVE9ETzogZmVuY2UKKyAgICBjb25zdCB1aW50OF90ICpjb25zdERhdGEgPSByZWFkVmlldy5kYXRhKCk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGNvbnN0RGF0YSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWFkVmlldy5jYXBhY2l0eSgpOyArK2kpIHsKKyAgICAgICAgQVNTRVJUX0VRKChpICsga0NhcGFjaXR5IC8gMykgJSAxMDB1LCBjb25zdERhdGFbaV0pIDw8ICIgYXQgaSA9ICIgPDwgaQorICAgICAgICAgICAgICAgIDw8ICI7IGRhdGEgPSAiIDw8IHN0YXRpY19jYXN0PHZvaWQgKj4oZGF0YSkKKyAgICAgICAgICAgICAgICA8PCAiOyBjb25zdERhdGEgPSAiIDw8IHN0YXRpY19jYXN0PGNvbnN0IHZvaWQgKj4oY29uc3REYXRhKTsKKyAgICB9CisKKyAgICByZWFkVmlldyA9IHJlYWRWaWV3LnN1YlZpZXcoMzMzdSwgMTAwdSk7CisgICAgQVNTRVJUX0VRKEMyX09LLCByZWFkVmlldy5lcnJvcigpKTsKKyAgICBBU1NFUlRfRVEoMTAwdSwgcmVhZFZpZXcuY2FwYWNpdHkoKSk7CisKKyAgICBjb25zdERhdGEgPSByZWFkVmlldy5kYXRhKCk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGNvbnN0RGF0YSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZWFkVmlldy5jYXBhY2l0eSgpOyArK2kpIHsKKyAgICAgICAgQVNTRVJUX0VRKChpICsgMzMzdSArIGtDYXBhY2l0eSAvIDMpICUgMTAwdSwgY29uc3REYXRhW2ldKSA8PCAiIGF0IGkgPSAiIDw8IGk7CisgICAgfQorfQorCit2b2lkIGZpbGxQbGFuZShjb25zdCBDMlJlY3QgcmVjdCwgY29uc3QgQzJQbGFuZUluZm8gaW5mbywgdWludDhfdCAqYWRkciwgdWludDhfdCB2YWx1ZSkgeworICAgIGZvciAodWludDMyX3Qgcm93ID0gMDsgcm93IDwgcmVjdC5oZWlnaHQgLyBpbmZvLnJvd1NhbXBsaW5nOyArK3JvdykgeworICAgICAgICBpbnQzMl90IHJvd09mZnNldCA9IChyb3cgKyByZWN0LnRvcCAvIGluZm8ucm93U2FtcGxpbmcpICogaW5mby5yb3dJbmM7CisgICAgICAgIGZvciAodWludDMyX3QgY29sID0gMDsgY29sIDwgcmVjdC53aWR0aCAvIGluZm8uY29sU2FtcGxpbmc7ICsrY29sKSB7CisgICAgICAgICAgICBpbnQzMl90IGNvbE9mZnNldCA9IChjb2wgKyByZWN0LmxlZnQgLyBpbmZvLmNvbFNhbXBsaW5nKSAqIGluZm8uY29sSW5jOworICAgICAgICAgICAgYWRkcltyb3dPZmZzZXQgKyBjb2xPZmZzZXRdID0gdmFsdWU7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgdmVyaWZ5UGxhbmUoY29uc3QgQzJSZWN0IHJlY3QsIGNvbnN0IEMyUGxhbmVJbmZvIGluZm8sIGNvbnN0IHVpbnQ4X3QgKmFkZHIsIHVpbnQ4X3QgdmFsdWUpIHsKKyAgICBmb3IgKHVpbnQzMl90IHJvdyA9IDA7IHJvdyA8IHJlY3QuaGVpZ2h0IC8gaW5mby5yb3dTYW1wbGluZzsgKytyb3cpIHsKKyAgICAgICAgaW50MzJfdCByb3dPZmZzZXQgPSAocm93ICsgcmVjdC50b3AgLyBpbmZvLnJvd1NhbXBsaW5nKSAqIGluZm8ucm93SW5jOworICAgICAgICBmb3IgKHVpbnQzMl90IGNvbCA9IDA7IGNvbCA8IHJlY3Qud2lkdGggLyBpbmZvLmNvbFNhbXBsaW5nOyArK2NvbCkgeworICAgICAgICAgICAgaW50MzJfdCBjb2xPZmZzZXQgPSAoY29sICsgcmVjdC5sZWZ0IC8gaW5mby5jb2xTYW1wbGluZykgKiBpbmZvLmNvbEluYzsKKyAgICAgICAgICAgIGlmIChhZGRyW3Jvd09mZnNldCArIGNvbE9mZnNldF0gIT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK1RFU1RfRihDMkJ1ZmZlclRlc3QsIEdyYXBoaWNBbGxvY2F0aW9uVGVzdCkgeworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrV2lkdGggPSAzMjA7CisgICAgY29uc3RleHByIHVpbnQzMl90IGtIZWlnaHQgPSAyNDA7CisKKyAgICBhbGxvY2F0ZUdyYXBoaWMoa1dpZHRoLCBrSGVpZ2h0KTsKKworICAgIHVpbnQ4X3QgKmFkZHJbQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTXTsKKyAgICBDMlJlY3QgcmVjdChrV2lkdGgsIGtIZWlnaHQpOworICAgIEMyUGxhbmFyTGF5b3V0IGxheW91dDsKKyAgICBtYXBHcmFwaGljKHJlY3QsICZsYXlvdXQsIGFkZHIpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0pOworCisgICAgdWludDhfdCAqeSA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIEMyUGxhbmVJbmZvIHlJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgdWludDhfdCAqdSA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIEMyUGxhbmVJbmZvIHVJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgdWludDhfdCAqdiA9IGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIEMyUGxhbmVJbmZvIHZJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisKKyAgICBmaWxsUGxhbmUocmVjdCwgeUluZm8sIHksIDApOworICAgIGZpbGxQbGFuZShyZWN0LCB1SW5mbywgdSwgMCk7CisgICAgZmlsbFBsYW5lKHJlY3QsIHZJbmZvLCB2LCAwKTsKKyAgICBmaWxsUGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHlJbmZvLCB5LCAweDEyKTsKKyAgICBmaWxsUGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHVJbmZvLCB1LCAweDM0KTsKKyAgICBmaWxsUGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHZJbmZvLCB2LCAweDU2KTsKKworICAgIHVubWFwR3JhcGhpYygpOworCisgICAgbWFwR3JhcGhpYyhyZWN0LCAmbGF5b3V0LCBhZGRyKTsKKyAgICBBU1NFUlRfTkUobnVsbHB0ciwgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfWV0pOworICAgIEFTU0VSVF9ORShudWxscHRyLCBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSk7CisgICAgQVNTRVJUX05FKG51bGxwdHIsIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdKTsKKworICAgIHkgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICB5SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIHUgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICB1SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIHYgPSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICB2SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworCisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHlJbmZvLCB5LCAweDEyKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHVJbmZvLCB1LCAweDM0KSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHZJbmZvLCB2LCAweDU2KSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgLyA0IH0sIHlJbmZvLCB5LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgLyA0IH0sIHVJbmZvLCB1LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgLyA0IH0sIHZJbmZvLCB2LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGggLyA0LCBrSGVpZ2h0IH0sIHlJbmZvLCB5LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGggLyA0LCBrSGVpZ2h0IH0sIHVJbmZvLCB1LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGggLyA0LCBrSGVpZ2h0IH0sIHZJbmZvLCB2LCAwKSk7Cit9CisKK1RFU1RfRihDMkJ1ZmZlclRlc3QsIEdyYXBoaWNCbG9ja1Bvb2xUZXN0KSB7CisgICAgY29uc3RleHByIHVpbnQzMl90IGtXaWR0aCA9IDMyMDsKKyAgICBjb25zdGV4cHIgdWludDMyX3Qga0hlaWdodCA9IDI0MDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gYmxvY2tQb29sKG1ha2VHcmFwaGljQmxvY2tQb29sKCkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBibG9jazsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGJsb2NrUG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICBrV2lkdGgsCisgICAgICAgICAgICBrSGVpZ2h0LAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4LAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmYmxvY2spKTsKKyAgICBBU1NFUlRfVFJVRShibG9jayk7CisKKyAgICBDMkFjcXVpcmFibGU8QzJHcmFwaGljVmlldz4gZ3JhcGhpY1ZpZXdIb2xkZXIgPSBibG9jay0+bWFwKCk7CisgICAgQzJHcmFwaGljVmlldyBncmFwaGljVmlldyA9IGdyYXBoaWNWaWV3SG9sZGVyLmdldCgpOworICAgIEFTU0VSVF9FUShDMl9PSywgZ3JhcGhpY1ZpZXcuZXJyb3IoKSk7CisgICAgQVNTRVJUX0VRKGtXaWR0aCwgZ3JhcGhpY1ZpZXcud2lkdGgoKSk7CisgICAgQVNTRVJUX0VRKGtIZWlnaHQsIGdyYXBoaWNWaWV3LmhlaWdodCgpKTsKKworICAgIHVpbnQ4X3QgKmNvbnN0ICpkYXRhID0gZ3JhcGhpY1ZpZXcuZGF0YSgpOworICAgIEMyUGxhbmFyTGF5b3V0IGxheW91dCA9IGdyYXBoaWNWaWV3LmxheW91dCgpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBkYXRhKTsKKworICAgIHVpbnQ4X3QgKnkgPSBkYXRhW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICBDMlBsYW5lSW5mbyB5SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIHVpbnQ4X3QgKnUgPSBkYXRhW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICBDMlBsYW5lSW5mbyB1SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIHVpbnQ4X3QgKnYgPSBkYXRhW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICBDMlBsYW5lSW5mbyB2SW5mbyA9IGxheW91dC5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworCisgICAgZmlsbFBsYW5lKHsga1dpZHRoLCBrSGVpZ2h0IH0sIHlJbmZvLCB5LCAwKTsKKyAgICBmaWxsUGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgfSwgdUluZm8sIHUsIDApOworICAgIGZpbGxQbGFuZSh7IGtXaWR0aCwga0hlaWdodCB9LCB2SW5mbywgdiwgMCk7CisgICAgZmlsbFBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB5SW5mbywgeSwgMHgxMik7CisgICAgZmlsbFBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB1SW5mbywgdSwgMHgzNCk7CisgICAgZmlsbFBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB2SW5mbywgdiwgMHg1Nik7CisKKyAgICBDMkZlbmNlIGZlbmNlOworICAgIEMyQ29uc3RHcmFwaGljQmxvY2sgY29uc3RCbG9jayA9IGJsb2NrLT5zaGFyZShDMlJlY3Qoa1dpZHRoLCBrSGVpZ2h0KSwgZmVuY2UpOworICAgIGJsb2NrLnJlc2V0KCk7CisKKyAgICBDMkFjcXVpcmFibGU8Y29uc3QgQzJHcmFwaGljVmlldz4gY29uc3RWaWV3SG9sZGVyID0gY29uc3RCbG9jay5tYXAoKTsKKyAgICBjb25zdCBDMkdyYXBoaWNWaWV3IGNvbnN0R3JhcGhpY1ZpZXcgPSBjb25zdFZpZXdIb2xkZXIuZ2V0KCk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBjb25zdEdyYXBoaWNWaWV3LmVycm9yKCkpOworICAgIEFTU0VSVF9FUShrV2lkdGgsIGNvbnN0R3JhcGhpY1ZpZXcud2lkdGgoKSk7CisgICAgQVNTRVJUX0VRKGtIZWlnaHQsIGNvbnN0R3JhcGhpY1ZpZXcuaGVpZ2h0KCkpOworCisgICAgY29uc3QgdWludDhfdCAqY29uc3QgKmNvbnN0RGF0YSA9IGNvbnN0R3JhcGhpY1ZpZXcuZGF0YSgpOworICAgIGxheW91dCA9IGdyYXBoaWNWaWV3LmxheW91dCgpOworICAgIEFTU0VSVF9ORShudWxscHRyLCBjb25zdERhdGEpOworCisgICAgY29uc3QgdWludDhfdCAqY3kgPSBjb25zdERhdGFbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldOworICAgIHlJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfWV07CisgICAgY29uc3QgdWludDhfdCAqY3UgPSBjb25zdERhdGFbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdOworICAgIHVJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV07CisgICAgY29uc3QgdWludDhfdCAqY3YgPSBjb25zdERhdGFbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdOworICAgIHZJbmZvID0gbGF5b3V0LnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl07CisKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZShDMlJlY3Qoa1dpZHRoIC8gMiwga0hlaWdodCAvIDIpLmF0KGtXaWR0aCAvIDQsIGtIZWlnaHQgLyA0KSwgeUluZm8sIGN5LCAweDEyKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoQzJSZWN0KGtXaWR0aCAvIDIsIGtIZWlnaHQgLyAyKS5hdChrV2lkdGggLyA0LCBrSGVpZ2h0IC8gNCksIHVJbmZvLCBjdSwgMHgzNCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKEMyUmVjdChrV2lkdGggLyAyLCBrSGVpZ2h0IC8gMikuYXQoa1dpZHRoIC8gNCwga0hlaWdodCAvIDQpLCB2SW5mbywgY3YsIDB4NTYpKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCwga0hlaWdodCAvIDQgfSwgeUluZm8sIGN5LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGgsIGtIZWlnaHQgLyA0IH0sIHVJbmZvLCBjdSwgMCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoLCBrSGVpZ2h0IC8gNCB9LCB2SW5mbywgY3YsIDApKTsKKyAgICBBU1NFUlRfVFJVRSh2ZXJpZnlQbGFuZSh7IGtXaWR0aCAvIDQsIGtIZWlnaHQgfSwgeUluZm8sIGN5LCAwKSk7CisgICAgQVNTRVJUX1RSVUUodmVyaWZ5UGxhbmUoeyBrV2lkdGggLyA0LCBrSGVpZ2h0IH0sIHVJbmZvLCBjdSwgMCkpOworICAgIEFTU0VSVF9UUlVFKHZlcmlmeVBsYW5lKHsga1dpZHRoIC8gNCwga0hlaWdodCB9LCB2SW5mbywgY3YsIDApKTsKK30KKworY2xhc3MgQnVmZmVyRGF0YSA6IHB1YmxpYyBDMkJ1ZmZlckRhdGEgeworcHVibGljOgorICAgIGV4cGxpY2l0IEJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKSA6IEMyQnVmZmVyRGF0YShibG9ja3MpIHt9CisgICAgZXhwbGljaXQgQnVmZmVyRGF0YShjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKSA6IEMyQnVmZmVyRGF0YShibG9ja3MpIHt9Cit9OworCitjbGFzcyBCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworcHVibGljOgorICAgIGV4cGxpY2l0IEJ1ZmZlcihjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0TGluZWFyQmxvY2s+ICZibG9ja3MpIDogQzJCdWZmZXIoYmxvY2tzKSB7fQorICAgIGV4cGxpY2l0IEJ1ZmZlcihjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKSA6IEMyQnVmZmVyKGJsb2Nrcykge30KK307CisKK1RFU1RfRihDMkJ1ZmZlclRlc3QsIEJ1ZmZlckRhdGFUZXN0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBsaW5lYXJCbG9ja1Bvb2wobWFrZUxpbmVhckJsb2NrUG9vbCgpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IGdyYXBoaWNCbG9ja1Bvb2wobWFrZUdyYXBoaWNCbG9ja1Bvb2woKSk7CisKKyAgICBjb25zdGV4cHIgdWludDMyX3Qga1dpZHRoMSA9IDMyMDsKKyAgICBjb25zdGV4cHIgdWludDMyX3Qga0hlaWdodDEgPSAyNDA7CisgICAgY29uc3RleHByIEMyUmVjdCBrQ3JvcDEoa1dpZHRoMSwga0hlaWdodDEpOworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrV2lkdGgyID0gMTc2OworICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrSGVpZ2h0MiA9IDE0NDsKKyAgICBjb25zdGV4cHIgQzJSZWN0IGtDcm9wMihrV2lkdGgyLCBrSGVpZ2h0Mik7CisgICAgY29uc3RleHByIHNpemVfdCBrQ2FwYWNpdHkxID0gMTAyNHU7CisgICAgY29uc3RleHByIHNpemVfdCBrQ2FwYWNpdHkyID0gMjA0OHU7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gbGluZWFyQmxvY2sxOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBsaW5lYXJCbG9jazI7CisgICAgQVNTRVJUX0VRKEMyX09LLCBsaW5lYXJCbG9ja1Bvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICBrQ2FwYWNpdHkxLAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmbGluZWFyQmxvY2sxKSk7CisgICAgQVNTRVJUX0VRKEMyX09LLCBsaW5lYXJCbG9ja1Bvb2wtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICBrQ2FwYWNpdHkyLAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmbGluZWFyQmxvY2syKSk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBncmFwaGljQmxvY2sxOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gZ3JhcGhpY0Jsb2NrMjsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGdyYXBoaWNCbG9ja1Bvb2wtPmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAga1dpZHRoMSwKKyAgICAgICAgICAgIGtIZWlnaHQxLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4LAorICAgICAgICAgICAgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFIH0sCisgICAgICAgICAgICAmZ3JhcGhpY0Jsb2NrMSkpOworICAgIEFTU0VSVF9FUShDMl9PSywgZ3JhcGhpY0Jsb2NrUG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICBrV2lkdGgyLAorICAgICAgICAgICAga0hlaWdodDIsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgsCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZncmFwaGljQmxvY2syKSk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJEYXRhPiBkYXRhKG5ldyBCdWZmZXJEYXRhKHsgbGluZWFyQmxvY2sxLT5zaGFyZSgwLCBrQ2FwYWNpdHkxLCBDMkZlbmNlKCkpIH0pKTsKKyAgICBFWFBFQ1RfRVEoQzJCdWZmZXJEYXRhOjpMSU5FQVIsIGRhdGEtPnR5cGUoKSk7CisgICAgQVNTRVJUX0VRKDF1LCBkYXRhLT5saW5lYXJCbG9ja3MoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUShsaW5lYXJCbG9jazEtPmhhbmRsZSgpLCBkYXRhLT5saW5lYXJCbG9ja3MoKS5mcm9udCgpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhLT5ncmFwaGljQmxvY2tzKCkuZW1wdHkoKSk7CisKKyAgICBkYXRhLnJlc2V0KG5ldyBCdWZmZXJEYXRhKHsKKyAgICAgICAgbGluZWFyQmxvY2sxLT5zaGFyZSgwLCBrQ2FwYWNpdHkxLCBDMkZlbmNlKCkpLAorICAgICAgICBsaW5lYXJCbG9jazItPnNoYXJlKDAsIGtDYXBhY2l0eTIsIEMyRmVuY2UoKSksCisgICAgfSkpOworICAgIEVYUEVDVF9FUShDMkJ1ZmZlckRhdGE6OkxJTkVBUl9DSFVOS1MsIGRhdGEtPnR5cGUoKSk7CisgICAgQVNTRVJUX0VRKDJ1LCBkYXRhLT5saW5lYXJCbG9ja3MoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUShsaW5lYXJCbG9jazEtPmhhbmRsZSgpLCBkYXRhLT5saW5lYXJCbG9ja3MoKS5mcm9udCgpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfRVEobGluZWFyQmxvY2syLT5oYW5kbGUoKSwgZGF0YS0+bGluZWFyQmxvY2tzKCkuYmFjaygpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhLT5ncmFwaGljQmxvY2tzKCkuZW1wdHkoKSk7CisKKyAgICBkYXRhLnJlc2V0KG5ldyBCdWZmZXJEYXRhKHsgZ3JhcGhpY0Jsb2NrMS0+c2hhcmUoa0Nyb3AxLCBDMkZlbmNlKCkpIH0pKTsKKyAgICBFWFBFQ1RfRVEoQzJCdWZmZXJEYXRhOjpHUkFQSElDLCBkYXRhLT50eXBlKCkpOworICAgIEFTU0VSVF9FUSgxdSwgZGF0YS0+Z3JhcGhpY0Jsb2NrcygpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKGdyYXBoaWNCbG9jazEtPmhhbmRsZSgpLCBkYXRhLT5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKS5oYW5kbGUoKSk7CisgICAgRVhQRUNUX1RSVUUoZGF0YS0+bGluZWFyQmxvY2tzKCkuZW1wdHkoKSk7CisKKyAgICBkYXRhLnJlc2V0KG5ldyBCdWZmZXJEYXRhKHsKKyAgICAgICAgZ3JhcGhpY0Jsb2NrMS0+c2hhcmUoa0Nyb3AxLCBDMkZlbmNlKCkpLAorICAgICAgICBncmFwaGljQmxvY2syLT5zaGFyZShrQ3JvcDIsIEMyRmVuY2UoKSksCisgICAgfSkpOworICAgIEVYUEVDVF9FUShDMkJ1ZmZlckRhdGE6OkdSQVBISUNfQ0hVTktTLCBkYXRhLT50eXBlKCkpOworICAgIEFTU0VSVF9FUSgydSwgZGF0YS0+Z3JhcGhpY0Jsb2NrcygpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKGdyYXBoaWNCbG9jazEtPmhhbmRsZSgpLCBkYXRhLT5ncmFwaGljQmxvY2tzKCkuZnJvbnQoKS5oYW5kbGUoKSk7CisgICAgRVhQRUNUX0VRKGdyYXBoaWNCbG9jazItPmhhbmRsZSgpLCBkYXRhLT5ncmFwaGljQmxvY2tzKCkuYmFjaygpLmhhbmRsZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShkYXRhLT5saW5lYXJCbG9ja3MoKS5lbXB0eSgpKTsKK30KKwordm9pZCBEZXN0cm95Q2FsbGJhY2soY29uc3QgQzJCdWZmZXIgKiAvKiBidWYgKi8sIHZvaWQgKmFyZykgeworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gKmNiID0gKHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gKilhcmc7CisgICAgKCpjYikoKTsKK30KKworZW51bSA6IHVpbnQzMl90IHsKKyAgICBrUGFyYW1JbmRleE51bWJlcjEsCisgICAga1BhcmFtSW5kZXhOdW1iZXIyLAorfTsKKwordHlwZWRlZiBDMkdsb2JhbFBhcmFtPEMySW5mbywgQzJJbnQzMlZhbHVlLCBrUGFyYW1JbmRleE51bWJlcjE+IEMyTnVtYmVyMUluZm87Cit0eXBlZGVmIEMyR2xvYmFsUGFyYW08QzJJbmZvLCBDMkludDMyVmFsdWUsIGtQYXJhbUluZGV4TnVtYmVyMj4gQzJOdW1iZXIySW5mbzsKKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgQnVmZmVyVGVzdCkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gYWxsb2MobWFrZUxpbmVhckJsb2NrUG9vbCgpKTsKKyAgICBjb25zdGV4cHIgc2l6ZV90IGtDYXBhY2l0eSA9IDEwMjR1OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKworICAgIEFTU0VSVF9FUShDMl9PSywgYWxsb2MtPmZldGNoTGluZWFyQmxvY2soCisgICAgICAgICAgICBrQ2FwYWNpdHksCisgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICZibG9jaykpOworCisgICAgc3RkOjphdG9taWNfYm9vbCBkZXN0cm95ZWQoZmFsc2UpOworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCh2b2lkKT4gYXJnID0gWyZkZXN0cm95ZWRdKCl7IGRlc3Ryb3llZCA9IHRydWU7IH07CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXI+IGJ1ZmZlcihuZXcgQnVmZmVyKCB7IGJsb2NrLT5zaGFyZSgwLCBrQ2FwYWNpdHksIEMyRmVuY2UoKSkgfSkpOworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgmRGVzdHJveUNhbGxiYWNrLCAmYXJnKSk7CisgICAgRVhQRUNUX0ZBTFNFKGRlc3Ryb3llZCk7CisgICAgQVNTRVJUX0VRKEMyX0RVUExJQ0FURSwgYnVmZmVyLT5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgmRGVzdHJveUNhbGxiYWNrLCAmYXJnKSk7CisgICAgYnVmZmVyLnJlc2V0KCk7CisgICAgRVhQRUNUX1RSVUUoZGVzdHJveWVkKTsKKworICAgIGJ1ZmZlci5yZXNldChuZXcgQnVmZmVyKCB7IGJsb2NrLT5zaGFyZSgwLCBrQ2FwYWNpdHksIEMyRmVuY2UoKSkgfSkpOworICAgIGRlc3Ryb3llZCA9IGZhbHNlOworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgmRGVzdHJveUNhbGxiYWNrLCAmYXJnKSk7CisgICAgRVhQRUNUX0ZBTFNFKGRlc3Ryb3llZCk7CisgICAgQVNTRVJUX0VRKEMyX05PVF9GT1VORCwgYnVmZmVyLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCZEZXN0cm95Q2FsbGJhY2ssIG51bGxwdHIpKTsKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGJ1ZmZlci0+dW5yZWdpc3Rlck9uRGVzdHJveU5vdGlmeSgmRGVzdHJveUNhbGxiYWNrLCAmYXJnKSk7CisgICAgRVhQRUNUX0ZBTFNFKGRlc3Ryb3llZCk7CisgICAgQVNTRVJUX0VRKEMyX05PVF9GT1VORCwgYnVmZmVyLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KCZEZXN0cm95Q2FsbGJhY2ssICZhcmcpKTsKKyAgICBidWZmZXIucmVzZXQoKTsKKyAgICBFWFBFQ1RfRkFMU0UoZGVzdHJveWVkKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IGluZm8xKG5ldyBDMk51bWJlcjFJbmZvKDEpKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiBpbmZvMihuZXcgQzJOdW1iZXIySW5mbygyKSk7CisgICAgYnVmZmVyLnJlc2V0KG5ldyBCdWZmZXIoIHsgYmxvY2stPnNoYXJlKDAsIGtDYXBhY2l0eSwgQzJGZW5jZSgpKSB9KSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5pbmZvKCkuZW1wdHkoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMS0+dHlwZSgpKSk7CisgICAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMi0+dHlwZSgpKSk7CisKKyAgICBBU1NFUlRfRVEoQzJfT0ssIGJ1ZmZlci0+c2V0SW5mbyhpbmZvMSkpOworICAgIEVYUEVDVF9FUSgxdSwgYnVmZmVyLT5pbmZvKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoKmluZm8xLCAqYnVmZmVyLT5pbmZvKCkuZnJvbnQoKSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKKworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT5zZXRJbmZvKGluZm8yKSk7CisgICAgRVhQRUNUX0VRKDJ1LCBidWZmZXItPmluZm8oKS5zaXplKCkpOworICAgIEVYUEVDVF9UUlVFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMS0+dHlwZSgpKSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IHJlbW92ZWQgPSBidWZmZXItPnJlbW92ZUluZm8oaW5mbzEtPnR5cGUoKSk7CisgICAgQVNTRVJUX1RSVUUocmVtb3ZlZCk7CisgICAgRVhQRUNUX0VRKCpyZW1vdmVkLCAqaW5mbzEpOworICAgIEVYUEVDVF9FUSgxdSwgYnVmZmVyLT5pbmZvKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoKmluZm8yLCAqYnVmZmVyLT5pbmZvKCkuZnJvbnQoKSk7CisgICAgRVhQRUNUX0ZBTFNFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMS0+dHlwZSgpKSk7CisgICAgRVhQRUNUX1RSVUUoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKKworICAgIHJlbW92ZWQgPSBidWZmZXItPnJlbW92ZUluZm8oaW5mbzEtPnR5cGUoKSk7CisgICAgQVNTRVJUX0ZBTFNFKHJlbW92ZWQpOworICAgIEVYUEVDVF9FUSgxdSwgYnVmZmVyLT5pbmZvKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmhhc0luZm8oaW5mbzItPnR5cGUoKSkpOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gaW5mbzMobmV3IEMyTnVtYmVyMkluZm8oMykpOworICAgIEFTU0VSVF9FUShDMl9PSywgYnVmZmVyLT5zZXRJbmZvKGluZm8zKSk7CisgICAgRVhQRUNUX0VRKDF1LCBidWZmZXItPmluZm8oKS5zaXplKCkpOworICAgIEVYUEVDVF9GQUxTRShidWZmZXItPmhhc0luZm8oaW5mbzEtPnR5cGUoKSkpOworICAgIEVYUEVDVF9UUlVFKGJ1ZmZlci0+aGFzSW5mbyhpbmZvMi0+dHlwZSgpKSk7CisKKyAgICByZW1vdmVkID0gYnVmZmVyLT5yZW1vdmVJbmZvKGluZm8yLT50eXBlKCkpOworICAgIEFTU0VSVF9UUlVFKHJlbW92ZWQpOworICAgIEVYUEVDVF9FUSgqaW5mbzMsICpyZW1vdmVkKTsKKyAgICBFWFBFQ1RfVFJVRShidWZmZXItPmluZm8oKS5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8xLT50eXBlKCkpKTsKKyAgICBFWFBFQ1RfRkFMU0UoYnVmZmVyLT5oYXNJbmZvKGluZm8yLT50eXBlKCkpKTsKK30KKworVEVTVF9GKEMyQnVmZmVyVGVzdCwgTXVsdGlwbGVMaW5lYXJNYXBUZXN0KSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwb29sKG1ha2VMaW5lYXJCbG9ja1Bvb2woKSk7CisgICAgY29uc3RleHByIHNpemVfdCBrQ2FwYWNpdHkgPSA1MjQyODh1OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJXcml0ZVZpZXc+IHdWaWV3czsKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJSZWFkVmlldz4gclZpZXdzOworICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDE2OyArK2opIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBibG9jazsKKyAgICAgICAgICAgIEFTU0VSVF9FUShDMl9PSywgcG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAga0NhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfSwKKyAgICAgICAgICAgICAgICAgICAgJmJsb2NrKSk7CisgICAgICAgICAgICB3Vmlld3MucHVzaF9iYWNrKGJsb2NrLT5tYXAoKS5nZXQoKSk7CisgICAgICAgICAgICBDMkNvbnN0TGluZWFyQmxvY2sgY0Jsb2NrID0gYmxvY2stPnNoYXJlKDAsIGtDYXBhY2l0eSAvIDIsIEMyRmVuY2UoKSk7CisgICAgICAgICAgICByVmlld3MucHVzaF9iYWNrKGNCbG9jay5tYXAoKS5nZXQoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0FuZHJvaWQuYnAgYi9tZWRpYS9jb2RlYzIvdm5kay9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyY2M3YWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTA1IEBACitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJjb2RlYzJfaW50ZXJuYWwiLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW50ZXJuYWwiLAorICAgIF0sCisKKyAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyB3aGVuIHRoaXMgbW9kdWxlIGlzIG1vdmVkIGJhY2sgdG8gZnJhbWV3b3Jrcy9hdi4KKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorfQorCisvLyAhISFETyBOT1QgREVQRU5EIE9OIFRISVMgU0hBUkVEIExJQlJBUlkgRElSRUNUTFkhISEKKy8vIHVzZSBsaWJjb2RlYzItaW1wbC1kZWZhdWx0cyBpbnN0ZWFkCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmNvZGVjMl92bmRrIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiQzJBbGxvY2F0b3JJb24uY3BwIiwKKyAgICAgICAgIkMyQWxsb2NhdG9yR3JhbGxvYy5jcHAiLAorICAgICAgICAiQzJCdWZmZXIuY3BwIiwKKyAgICAgICAgIkMyQ29uZmlnLmNwcCIsCisgICAgICAgICJDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuY3BwIiwKKyAgICAgICAgIkMyU3RvcmUuY3BwIiwKKyAgICAgICAgInBsYXRmb3JtL0MyQnFCdWZmZXIuY3BwIiwKKyAgICAgICAgInR5cGVzLmNwcCIsCisgICAgICAgICJ1dGlsL0MyRGVidWcuY3BwIiwKKyAgICAgICAgInV0aWwvQzJJbnRlcmZhY2VIZWxwZXIuY3BwIiwKKyAgICAgICAgInV0aWwvQzJJbnRlcmZhY2VVdGlscy5jcHAiLAorICAgICAgICAidXRpbC9DMlBhcmFtVXRpbHMuY3BwIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5idWZmZXJwb29sQDIuMCIsCisgICAgXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW50ZXJuYWwiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgICAgICAibGliY29kZWMyX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5hbGxvY2F0b3JAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYWxsb2NhdG9yQDMuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLm1hcHBlckAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMy4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYnVmZmVycG9vbEAyLjAiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmhhcmR3YXJlIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmlvbiIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnBvb2xAMi4wLjEiLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CisKKy8vIHB1YmxpYyBkZXBlbmRlbmN5IGZvciBpbXBsZW1lbnRpbmcgQ29kZWMgMiBjb21wb25lbnRzCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMi1pbXBsLWRlZmF1bHRzIiwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwgLy8gZm9yIEMyX0xPRworICAgICAgICAibGlibG9nIiwgLy8gZm9yIEFMT0cKKyAgICAgICAgImxpYmNvZGVjMiIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworLy8gcHVibGljIGRlcGVuZGVuY3kgZm9yIGltcGxlbWVudGluZyBDb2RlYyAyIGZyYW1ld29yayB1dGlsaXRpZXMKKy8vIFRISVMgSVMgT05MWSBGT1IgRlJBTUVXT1JLIFVTRSBPTkxZCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYmNvZGVjMi1pbnRlcm5hbC1kZWZhdWx0cyIsCisgICAgZGVmYXVsdHM6IFsibGliY29kZWMyLWltcGwtZGVmYXVsdHMiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjdXRpbHMiLCAvLyBmb3IgcHJvcGVydGllcworICAgIF0sCisKKyAgICAvLyBUT0RPOiBzZXBhcmF0ZSBpbnRlcm5hbCBoZWFkZXJzIHNvIHRoZXkgY2FuIGJlIGV4cG9zZWQgaGVyZQorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMkFsbG9jYXRvckdyYWxsb2MuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JHcmFsbG9jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjk3ZTYxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JHcmFsbG9jLmNwcApAQCAtMCwwICsxLDExNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyQWxsb2NhdG9yR3JhbGxvYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYWxsb2NhdG9yLzIuMC9JQWxsb2NhdG9yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9tYXBwZXIvMi4wL0lNYXBwZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2FsbG9jYXRvci8zLjAvSUFsbG9jYXRvci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvbWFwcGVyLzMuMC9JTWFwcGVyLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+CisKKyNpbmNsdWRlIDxDMkFsbG9jYXRvckdyYWxsb2MuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyUGxhdGZvcm1TdXBwb3J0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworICAgIGVudW0gOiB1aW50NjRfdCB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBVc2FnZSBtYXNrIHRoYXQgaXMgcGFzc2VkIHRocm91Z2ggZnJvbSBncmFsbG9jIHRvIENvZGVjIDIuMCB1c2FnZS4KKyAgICAgICAgICovCisgICAgICAgIFBBU1NUSFJPVUdIX1VTQUdFX01BU0sgPQorICAgICAgICAgICAgfihHUkFMTE9DX1VTQUdFX1NXX1JFQURfTUFTSyB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfTUFTSyB8IEdSQUxMT0NfVVNBR0VfUFJPVEVDVEVEKQorICAgIH07CisKKyAgICAvLyB2ZXJpZnkgdGhhdCBwYXNzdGhyb3VnaCBtYXNrIGlzIHdpdGhpbiB0aGUgcGxhdGZvcm0gbWFzaworICAgIHN0YXRpY19hc3NlcnQoKH5DMk1lbW9yeVVzYWdlOjpQTEFURk9STV9NQVNLICYgUEFTU1RIUk9VR0hfVVNBR0VfTUFTSykgPT0gMCwgIiIpOworfSAvLyB1bm5hbWVkCisKK0MyTWVtb3J5VXNhZ2UgQzJBbmRyb2lkTWVtb3J5VXNhZ2U6OkZyb21HcmFsbG9jVXNhZ2UodWludDY0X3QgdXNhZ2UpIHsKKyAgICAvLyBncmFsbG9jIGRvZXMgbm90IHN1cHBvcnQgV1JJVEVfUFJPVEVDVEVECisgICAgcmV0dXJuIEMyTWVtb3J5VXNhZ2UoCisgICAgICAgICAgICAoKHVzYWdlICYgR1JBTExPQ19VU0FHRV9TV19SRUFEX01BU0spID8gQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQgOiAwKSB8CisgICAgICAgICAgICAoKHVzYWdlICYgR1JBTExPQ19VU0FHRV9TV19XUklURV9NQVNLKSA/IEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSA6IDApIHwKKyAgICAgICAgICAgICgodXNhZ2UgJiBHUkFMTE9DX1VTQUdFX1BST1RFQ1RFRCkgPyBDMk1lbW9yeVVzYWdlOjpSRUFEX1BST1RFQ1RFRCA6IDApIHwKKyAgICAgICAgICAgICh1c2FnZSAmIFBBU1NUSFJPVUdIX1VTQUdFX01BU0spKTsKK30KKwordWludDY0X3QgQzJBbmRyb2lkTWVtb3J5VXNhZ2U6OmFzR3JhbGxvY1VzYWdlKCkgY29uc3QgeworICAgIC8vIGdyYWxsb2MgZG9lcyBub3Qgc3VwcG9ydCBXUklURV9QUk9URUNURUQKKyAgICByZXR1cm4gKCgoZXhwZWN0ZWQgJiBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCkgPyBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gOiAwKSB8CisgICAgICAgICAgICAoKGV4cGVjdGVkICYgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFKSA/IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfT0ZURU4gOiAwKSB8CisgICAgICAgICAgICAoKGV4cGVjdGVkICYgQzJNZW1vcnlVc2FnZTo6UkVBRF9QUk9URUNURUQpID8gR1JBTExPQ19VU0FHRV9QUk9URUNURUQgOiAwKSB8CisgICAgICAgICAgICAoZXhwZWN0ZWQgJiBQQVNTVEhST1VHSF9VU0FHRV9NQVNLKSk7Cit9CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpCdWZmZXJVc2FnZTsKK3VzaW5nIFBpeGVsRm9ybWF0MiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0OwordXNpbmcgUGl4ZWxGb3JtYXQzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMjo6UGl4ZWxGb3JtYXQ7CisKK3VzaW5nIElBbGxvY2F0b3IyID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmFsbG9jYXRvcjo6VjJfMDo6SUFsbG9jYXRvcjsKK3VzaW5nIEJ1ZmZlckRlc2NyaXB0b3IyID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6Om1hcHBlcjo6VjJfMDo6QnVmZmVyRGVzY3JpcHRvcjsKK3VzaW5nIEVycm9yMiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjptYXBwZXI6OlYyXzA6OkVycm9yOwordXNpbmcgSU1hcHBlcjIgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6bWFwcGVyOjpWMl8wOjpJTWFwcGVyOworCit1c2luZyBJQWxsb2NhdG9yMyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjphbGxvY2F0b3I6OlYzXzA6OklBbGxvY2F0b3I7Cit1c2luZyBCdWZmZXJEZXNjcmlwdG9yMyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjptYXBwZXI6OlYzXzA6OkJ1ZmZlckRlc2NyaXB0b3I7Cit1c2luZyBFcnJvcjMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6bWFwcGVyOjpWM18wOjpFcnJvcjsKK3VzaW5nIElNYXBwZXIzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6Om1hcHBlcjo6VjNfMDo6SU1hcHBlcjsKKworbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8geworCitzdHJ1Y3QgQnVmZmVyRGVzY3JpcHRvckluZm8yIHsKKyAgICBJTWFwcGVyMjo6QnVmZmVyRGVzY3JpcHRvckluZm8gbWFwcGVySW5mbzsKKyAgICB1aW50MzJfdCBzdHJpZGU7Cit9OworCitzdHJ1Y3QgQnVmZmVyRGVzY3JpcHRvckluZm8zIHsKKyAgICBJTWFwcGVyMzo6QnVmZmVyRGVzY3JpcHRvckluZm8gbWFwcGVySW5mbzsKKyAgICB1aW50MzJfdCBzdHJpZGU7Cit9OworCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEdSQUxMT0MgQUxMT0NBVElPTiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KK2MyX3N0YXR1c190IG1hcGVycjJlcnJvcihFcnJvcjIgbWFwZXJyKSB7CisgICAgc3dpdGNoIChtYXBlcnIpIHsKKyAgICAgICAgY2FzZSBFcnJvcjI6Ok5PTkU6ICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIGNhc2UgRXJyb3IyOjpCQURfREVTQ1JJUFRPUjogcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgY2FzZSBFcnJvcjI6OkJBRF9CVUZGRVI6ICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICBjYXNlIEVycm9yMjo6QkFEX1ZBTFVFOiAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIGNhc2UgRXJyb3IyOjpOT19SRVNPVVJDRVM6ICAgcmV0dXJuIEMyX05PX01FTU9SWTsKKyAgICAgICAgY2FzZSBFcnJvcjI6OlVOU1VQUE9SVEVEOiAgICByZXR1cm4gQzJfQ0FOTk9UX0RPOworICAgIH0KKyAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworfQorCitjMl9zdGF0dXNfdCBtYXBlcnIyZXJyb3IoRXJyb3IzIG1hcGVycikgeworICAgIHN3aXRjaCAobWFwZXJyKSB7CisgICAgICAgIGNhc2UgRXJyb3IzOjpOT05FOiAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICBjYXNlIEVycm9yMzo6QkFEX0RFU0NSSVBUT1I6IHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIGNhc2UgRXJyb3IzOjpCQURfQlVGRkVSOiAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgY2FzZSBFcnJvcjM6OkJBRF9WQUxVRTogICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICBjYXNlIEVycm9yMzo6Tk9fUkVTT1VSQ0VTOiAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgIGNhc2UgRXJyb3IzOjpVTlNVUFBPUlRFRDogICAgcmV0dXJuIEMyX0NBTk5PVF9ETzsKKyAgICB9CisgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKK30KKworYm9vbCBuYXRpdmVfaGFuZGxlX2lzX2ludmFsaWQoY29uc3QgbmF0aXZlX2hhbmRsZV90ICpjb25zdCBoYW5kbGUpIHsKKyAgICAvLyBwZXJmb3JtIGJhc2ljIHZhbGlkYXRpb24gb2YgYSBuYXRpdmUgaGFuZGxlCisgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIC8vIG51bGwgaGFuZGxlIGlzIGNvbnNpZGVyZWQgdmFsaWQKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gKChzaXplX3QpaGFuZGxlLT52ZXJzaW9uICE9IHNpemVvZihuYXRpdmVfaGFuZGxlX3QpIHx8CisgICAgICAgICAgICBoYW5kbGUtPm51bUZkcyA8IDAgfHwKKyAgICAgICAgICAgIGhhbmRsZS0+bnVtSW50cyA8IDAgfHwKKyAgICAgICAgICAgIC8vIGZvciBzYW5pdHkgYXNzdW1lIGhhbmRsZXMgbXVzdCBvY2N1cHkgbGVzcyBtZW1vcnkgdGhhbiBJTlRfTUFYIGJ5dGVzCisgICAgICAgICAgICBoYW5kbGUtPm51bUZkcyA+IGludCgoSU5UX01BWCAtIGhhbmRsZS0+dmVyc2lvbikgLyBzaXplb2YoaW50KSkgLSBoYW5kbGUtPm51bUludHMpOworfQorCitjbGFzcyBDMkhhbmRsZUdyYWxsb2MgOiBwdWJsaWMgQzJIYW5kbGUgeworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgRXh0cmFEYXRhIHsKKyAgICAgICAgdWludDMyX3Qgd2lkdGg7CisgICAgICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0OworICAgICAgICB1aW50MzJfdCB1c2FnZV9sbzsKKyAgICAgICAgdWludDMyX3QgdXNhZ2VfaGk7CisgICAgICAgIHVpbnQzMl90IHN0cmlkZTsKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgdWludDMyX3QgaWdicF9pZF9sbzsKKyAgICAgICAgdWludDMyX3QgaWdicF9pZF9oaTsKKyAgICAgICAgdWludDMyX3QgaWdicF9zbG90OworICAgICAgICB1aW50MzJfdCBtYWdpYzsKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIE5VTV9JTlRTID0gc2l6ZW9mKEV4dHJhRGF0YSkgLyBzaXplb2YoaW50KSwKKyAgICB9OworICAgIGNvbnN0IHN0YXRpYyB1aW50MzJfdCBNQUdJQyA9ICdceGMyZ3JceDAwJzsKKworICAgIHN0YXRpYworICAgIGNvbnN0IEV4dHJhRGF0YSogZ2V0RXh0cmFEYXRhKGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUpIHsKKyAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyCisgICAgICAgICAgICAgICAgfHwgbmF0aXZlX2hhbmRsZV9pc19pbnZhbGlkKGhhbmRsZSkKKyAgICAgICAgICAgICAgICB8fCBoYW5kbGUtPm51bUludHMgPCBOVU1fSU5UUykgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRXh0cmFEYXRhKj4oCisgICAgICAgICAgICAgICAgJmhhbmRsZS0+ZGF0YVtoYW5kbGUtPm51bUZkcyArIGhhbmRsZS0+bnVtSW50cyAtIE5VTV9JTlRTXSk7CisgICAgfQorCisgICAgc3RhdGljCisgICAgRXh0cmFEYXRhICpnZXRFeHRyYURhdGEoQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSkgeworICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxFeHRyYURhdGEgKj4oZ2V0RXh0cmFEYXRhKGNvbnN0X2Nhc3Q8Y29uc3QgQzJIYW5kbGUgKmNvbnN0PihoYW5kbGUpKSk7CisgICAgfQorCitwdWJsaWM6CisgICAgdm9pZCBnZXRJZ2JwRGF0YSh1aW50MzJfdCAqZ2VuZXJhdGlvbiwgdWludDY0X3QgKmlnYnBfaWQsIHVpbnQzMl90ICppZ2JwX3Nsb3QpIGNvbnN0IHsKKyAgICAgICAgY29uc3QgRXh0cmFEYXRhICplZCA9IGdldEV4dHJhRGF0YSh0aGlzKTsKKyAgICAgICAgKmdlbmVyYXRpb24gPSBlZC0+Z2VuZXJhdGlvbjsKKyAgICAgICAgKmlnYnBfaWQgPSB1bnNpZ25lZChlZC0+aWdicF9pZF9sbykgfCB1aW50NjRfdCh1bnNpZ25lZChlZC0+aWdicF9pZF9oaSkpIDw8IDMyOworICAgICAgICAqaWdicF9zbG90ID0gZWQtPmlnYnBfc2xvdDsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IEMySGFuZGxlICpjb25zdCBvKSB7CisgICAgICAgIGlmIChvID09IG51bGxwdHIpIHsgLy8gbnVsbCBoYW5kbGUgaXMgYWx3YXlzIHZhbGlkCisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBFeHRyYURhdGEgKnhkID0gZ2V0RXh0cmFEYXRhKG8pOworICAgICAgICAvLyB3ZSBjYW5ub3QgdmFsaWRhdGUgd2lkdGgvaGVpZ2h0L2Zvcm1hdC91c2FnZSB3aXRob3V0IGFjY2Vzc2luZyBncmFsbG9jIGRyaXZlcgorICAgICAgICByZXR1cm4geGQgIT0gbnVsbHB0ciAmJiB4ZC0+bWFnaWMgPT0gTUFHSUM7CisgICAgfQorCisgICAgc3RhdGljIEMySGFuZGxlR3JhbGxvYyogV3JhcEFuZE1vdmVOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlX3QgKmNvbnN0IGhhbmRsZSwKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UsCisgICAgICAgICAgICB1aW50MzJfdCBzdHJpZGUsIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGlnYnBfaWQgPSAwLCB1aW50MzJfdCBpZ2JwX3Nsb3QgPSAwKSB7CisgICAgICAgIC8vQ0hFQ0soaGFuZGxlICE9IG51bGxwdHIpOworICAgICAgICBpZiAobmF0aXZlX2hhbmRsZV9pc19pbnZhbGlkKGhhbmRsZSkgfHwKKyAgICAgICAgICAgIGhhbmRsZS0+bnVtSW50cyA+IGludCgoSU5UX01BWCAtIGhhbmRsZS0+dmVyc2lvbikgLyBzaXplb2YoaW50KSkgLSBOVU1fSU5UUyAtIGhhbmRsZS0+bnVtRmRzKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBFeHRyYURhdGEgeGQgPSB7CisgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVpbnQzMl90KHVzYWdlICYgMHhGRkZGRkZGRiksIHVpbnQzMl90KHVzYWdlID4+IDMyKSwKKyAgICAgICAgICAgIHN0cmlkZSwgZ2VuZXJhdGlvbiwgdWludDMyX3QoaWdicF9pZCAmIDB4RkZGRkZGRkYpLCB1aW50MzJfdChpZ2JwX2lkID4+IDMyKSwKKyAgICAgICAgICAgIGlnYnBfc2xvdCwgTUFHSUMKKyAgICAgICAgfTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpyZXMgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZShoYW5kbGUtPm51bUZkcywgaGFuZGxlLT5udW1JbnRzICsgTlVNX0lOVFMpOworICAgICAgICBpZiAocmVzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1lbWNweSgmcmVzLT5kYXRhLCAmaGFuZGxlLT5kYXRhLCBzaXplb2YoaW50KSAqIChoYW5kbGUtPm51bUZkcyArIGhhbmRsZS0+bnVtSW50cykpOworICAgICAgICAgICAgKmdldEV4dHJhRGF0YShyZXMpID0geGQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8QzJIYW5kbGVHcmFsbG9jICo+KHJlcyk7CisgICAgfQorCisgICAgc3RhdGljIEMySGFuZGxlR3JhbGxvYyogV3JhcE5hdGl2ZUhhbmRsZSgKKyAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqY29uc3QgaGFuZGxlLAorICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSwKKyAgICAgICAgICAgIHVpbnQzMl90IHN0cmlkZSwgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgaWdicF9pZCA9IDAsIHVpbnQzMl90IGlnYnBfc2xvdCA9IDApIHsKKyAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmNsb25lID0gbmF0aXZlX2hhbmRsZV9jbG9uZShoYW5kbGUpOworICAgICAgICBpZiAoY2xvbmUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgQzJIYW5kbGVHcmFsbG9jICpyZXMgPSBXcmFwQW5kTW92ZU5hdGl2ZUhhbmRsZSgKKyAgICAgICAgICAgICAgICBjbG9uZSwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgc3RyaWRlLCBnZW5lcmF0aW9uLCBpZ2JwX2lkLCBpZ2JwX3Nsb3QpOworICAgICAgICBpZiAocmVzID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoY2xvbmUpOworICAgICAgICB9CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGNsb25lKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBNaWdyYXRlTmF0aXZlSGFuZGxlKAorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBpZ2JwX2lkLCB1aW50MzJfdCBpZ2JwX3Nsb3QpIHsKKyAgICAgICAgaWYgKGhhbmRsZSA9PSBudWxscHRyIHx8ICFpc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBFeHRyYURhdGEgKmVkID0gZ2V0RXh0cmFEYXRhKGhhbmRsZSk7CisgICAgICAgIGlmICghZWQpIHJldHVybiBmYWxzZTsKKyAgICAgICAgZWQtPmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uOworICAgICAgICBlZC0+aWdicF9pZF9sbyA9IHVpbnQzMl90KGlnYnBfaWQgJiAweEZGRkZGRkZGKTsKKyAgICAgICAgZWQtPmlnYnBfaWRfaGkgPSB1aW50MzJfdChpZ2JwX2lkID4+IDMyKTsKKyAgICAgICAgZWQtPmlnYnBfc2xvdCA9IGlnYnBfc2xvdDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisKKyAgICBzdGF0aWMgbmF0aXZlX2hhbmRsZV90KiBVbndyYXBOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlKSB7CisgICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqeGQgPSBnZXRFeHRyYURhdGEoaGFuZGxlKTsKKyAgICAgICAgaWYgKHhkID09IG51bGxwdHIgfHwgeGQtPm1hZ2ljICE9IE1BR0lDKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKnJlcyA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKGhhbmRsZS0+bnVtRmRzLCBoYW5kbGUtPm51bUludHMgLSBOVU1fSU5UUyk7CisgICAgICAgIGlmIChyZXMgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbWVtY3B5KCZyZXMtPmRhdGEsICZoYW5kbGUtPmRhdGEsIHNpemVvZihpbnQpICogKHJlcy0+bnVtRmRzICsgcmVzLT5udW1JbnRzKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgQzJIYW5kbGVHcmFsbG9jKiBJbXBvcnQoCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlLAorICAgICAgICAgICAgdWludDMyX3QgKndpZHRoLCB1aW50MzJfdCAqaGVpZ2h0LCB1aW50MzJfdCAqZm9ybWF0LAorICAgICAgICAgICAgdWludDY0X3QgKnVzYWdlLCB1aW50MzJfdCAqc3RyaWRlLAorICAgICAgICAgICAgdWludDMyX3QgKmdlbmVyYXRpb24sIHVpbnQ2NF90ICppZ2JwX2lkLCB1aW50MzJfdCAqaWdicF9zbG90KSB7CisgICAgICAgIGNvbnN0IEV4dHJhRGF0YSAqeGQgPSBnZXRFeHRyYURhdGEoaGFuZGxlKTsKKyAgICAgICAgaWYgKHhkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgICp3aWR0aCA9IHhkLT53aWR0aDsKKyAgICAgICAgKmhlaWdodCA9IHhkLT5oZWlnaHQ7CisgICAgICAgICpmb3JtYXQgPSB4ZC0+Zm9ybWF0OworICAgICAgICAqdXNhZ2UgPSB4ZC0+dXNhZ2VfbG8gfCAodWludDY0X3QoeGQtPnVzYWdlX2hpKSA8PCAzMik7CisgICAgICAgICpzdHJpZGUgPSB4ZC0+c3RyaWRlOworICAgICAgICAqZ2VuZXJhdGlvbiA9IHhkLT5nZW5lcmF0aW9uOworICAgICAgICAqaWdicF9pZCA9IHhkLT5pZ2JwX2lkX2xvIHwgKHVpbnQ2NF90KHhkLT5pZ2JwX2lkX2hpKSA8PCAzMik7CisgICAgICAgICppZ2JwX3Nsb3QgPSB4ZC0+aWdicF9zbG90OworICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBDMkhhbmRsZUdyYWxsb2MgKj4oaGFuZGxlKTsKKyAgICB9Cit9OworCit9IC8vIHVubmFtZWQgbmFtZXNwYWNlCisKK25hdGl2ZV9oYW5kbGVfdCAqVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZShjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlKSB7CisgICAgcmV0dXJuIEMySGFuZGxlR3JhbGxvYzo6VW53cmFwTmF0aXZlSGFuZGxlKGhhbmRsZSk7Cit9CisKK0MySGFuZGxlICpXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZSgKKyAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpjb25zdCBoYW5kbGUsCisgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgdWludDY0X3QgdXNhZ2UsIHVpbnQzMl90IHN0cmlkZSwKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgaWdicF9pZCwgdWludDMyX3QgaWdicF9zbG90KSB7CisgICAgcmV0dXJuIEMySGFuZGxlR3JhbGxvYzo6V3JhcE5hdGl2ZUhhbmRsZShoYW5kbGUsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb24sIGlnYnBfaWQsIGlnYnBfc2xvdCk7Cit9CisKK2Jvb2wgTWlncmF0ZU5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBpZ2JwX2lkLCB1aW50MzJfdCBpZ2JwX3Nsb3QpIHsKKyAgICByZXR1cm4gQzJIYW5kbGVHcmFsbG9jOjpNaWdyYXRlTmF0aXZlSGFuZGxlKGhhbmRsZSwgZ2VuZXJhdGlvbiwgaWdicF9pZCwgaWdicF9zbG90KTsKK30KKworCitjbGFzcyBDMkFsbG9jYXRpb25HcmFsbG9jIDogcHVibGljIEMyR3JhcGhpY0FsbG9jYXRpb24geworcHVibGljOgorICAgIHZpcnR1YWwgfkMyQWxsb2NhdGlvbkdyYWxsb2MoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbWFwKAorICAgICAgICAgICAgQzJSZWN0IHJlY3QsIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIEMyRmVuY2UgKmZlbmNlLAorICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQgKmxheW91dCAvKiBub25udWxsICovLCB1aW50OF90ICoqYWRkciAvKiBub25udWxsICovKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHVubWFwKAorICAgICAgICAgICAgdWludDhfdCAqKmFkZHIgLyogbm9ubnVsbCAqLywgQzJSZWN0IHJlY3QsIEMyRmVuY2UgKmZlbmNlIC8qIG51bGxhYmxlICovKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUFsbG9jYXRvcklkOyB9CisgICAgdmlydHVhbCBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUxvY2tlZEhhbmRsZSA/IDogbUhhbmRsZTsgfQorICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY0FsbG9jYXRpb24+ICZvdGhlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBpbnRlcm5hbCBtZXRob2RzCisgICAgLy8gfGhhbmRsZXwgd2lsbCBiZSBtb3ZlZC4KKyAgICBDMkFsbG9jYXRpb25HcmFsbG9jKAorICAgICAgICAgICAgICBjb25zdCBCdWZmZXJEZXNjcmlwdG9ySW5mbzIgJmluZm8sCisgICAgICAgICAgICAgIGNvbnN0IHNwPElNYXBwZXIyPiAmbWFwcGVyLAorICAgICAgICAgICAgICBoaWRsX2hhbmRsZSAmaGlkbEhhbmRsZSwKKyAgICAgICAgICAgICAgY29uc3QgQzJIYW5kbGVHcmFsbG9jICpjb25zdCBoYW5kbGUsCisgICAgICAgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkKTsKKyAgICBDMkFsbG9jYXRpb25HcmFsbG9jKAorICAgICAgICAgICAgICBjb25zdCBCdWZmZXJEZXNjcmlwdG9ySW5mbzMgJmluZm8sCisgICAgICAgICAgICAgIGNvbnN0IHNwPElNYXBwZXIzPiAmbWFwcGVyLAorICAgICAgICAgICAgICBoaWRsX2hhbmRsZSAmaGlkbEhhbmRsZSwKKyAgICAgICAgICAgICAgY29uc3QgQzJIYW5kbGVHcmFsbG9jICpjb25zdCBoYW5kbGUsCisgICAgICAgICAgICAgIEMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkKTsKKyAgICBpbnQgZHVwKCkgY29uc3Q7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgY29uc3QgQnVmZmVyRGVzY3JpcHRvckluZm8yIG1JbmZvMnt9OworICAgIGNvbnN0IHNwPElNYXBwZXIyPiBtTWFwcGVyMntudWxscHRyfTsKKyAgICBjb25zdCBCdWZmZXJEZXNjcmlwdG9ySW5mbzMgbUluZm8ze307CisgICAgY29uc3Qgc3A8SU1hcHBlcjM+IG1NYXBwZXIze251bGxwdHJ9OworICAgIGNvbnN0IGhpZGxfaGFuZGxlIG1IaWRsSGFuZGxlOworICAgIGNvbnN0IEMySGFuZGxlR3JhbGxvYyAqbUhhbmRsZTsKKyAgICBidWZmZXJfaGFuZGxlX3QgbUJ1ZmZlcjsKKyAgICBjb25zdCBDMkhhbmRsZUdyYWxsb2MgKm1Mb2NrZWRIYW5kbGU7CisgICAgYm9vbCBtTG9ja2VkOworICAgIEMyQWxsb2NhdG9yOjppZF90IG1BbGxvY2F0b3JJZDsKKyAgICBzdGQ6Om11dGV4IG1NYXBwZWRMb2NrOworfTsKKworQzJBbGxvY2F0aW9uR3JhbGxvYzo6QzJBbGxvY2F0aW9uR3JhbGxvYygKKyAgICAgICAgICBjb25zdCBCdWZmZXJEZXNjcmlwdG9ySW5mbzIgJmluZm8sCisgICAgICAgICAgY29uc3Qgc3A8SU1hcHBlcjI+ICZtYXBwZXIsCisgICAgICAgICAgaGlkbF9oYW5kbGUgJmhpZGxIYW5kbGUsCisgICAgICAgICAgY29uc3QgQzJIYW5kbGVHcmFsbG9jICpjb25zdCBoYW5kbGUsCisgICAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3QgYWxsb2NhdG9ySWQpCisgICAgOiBDMkdyYXBoaWNBbGxvY2F0aW9uKGluZm8ubWFwcGVySW5mby53aWR0aCwgaW5mby5tYXBwZXJJbmZvLmhlaWdodCksCisgICAgICBtSW5mbzIoaW5mbyksCisgICAgICBtTWFwcGVyMihtYXBwZXIpLAorICAgICAgbUhpZGxIYW5kbGUoc3RkOjptb3ZlKGhpZGxIYW5kbGUpKSwKKyAgICAgIG1IYW5kbGUoaGFuZGxlKSwKKyAgICAgIG1CdWZmZXIobnVsbHB0ciksCisgICAgICBtTG9ja2VkSGFuZGxlKG51bGxwdHIpLAorICAgICAgbUxvY2tlZChmYWxzZSksCisgICAgICBtQWxsb2NhdG9ySWQoYWxsb2NhdG9ySWQpIHsKK30KKworQzJBbGxvY2F0aW9uR3JhbGxvYzo6QzJBbGxvY2F0aW9uR3JhbGxvYygKKyAgICAgICAgICBjb25zdCBCdWZmZXJEZXNjcmlwdG9ySW5mbzMgJmluZm8sCisgICAgICAgICAgY29uc3Qgc3A8SU1hcHBlcjM+ICZtYXBwZXIsCisgICAgICAgICAgaGlkbF9oYW5kbGUgJmhpZGxIYW5kbGUsCisgICAgICAgICAgY29uc3QgQzJIYW5kbGVHcmFsbG9jICpjb25zdCBoYW5kbGUsCisgICAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3QgYWxsb2NhdG9ySWQpCisgICAgOiBDMkdyYXBoaWNBbGxvY2F0aW9uKGluZm8ubWFwcGVySW5mby53aWR0aCwgaW5mby5tYXBwZXJJbmZvLmhlaWdodCksCisgICAgICBtSW5mbzMoaW5mbyksCisgICAgICBtTWFwcGVyMyhtYXBwZXIpLAorICAgICAgbUhpZGxIYW5kbGUoc3RkOjptb3ZlKGhpZGxIYW5kbGUpKSwKKyAgICAgIG1IYW5kbGUoaGFuZGxlKSwKKyAgICAgIG1CdWZmZXIobnVsbHB0ciksCisgICAgICBtTG9ja2VkSGFuZGxlKG51bGxwdHIpLAorICAgICAgbUxvY2tlZChmYWxzZSksCisgICAgICBtQWxsb2NhdG9ySWQoYWxsb2NhdG9ySWQpIHsKK30KKworQzJBbGxvY2F0aW9uR3JhbGxvYzo6fkMyQWxsb2NhdGlvbkdyYWxsb2MoKSB7CisgICAgaWYgKG1CdWZmZXIgJiYgbUxvY2tlZCkgeworICAgICAgICAvLyBpbXBsZW1lbnRhdGlvbiBpZ25vcmVzIGFkZHJlc3NzIGFuZCByZWN0CisgICAgICAgIHVpbnQ4X3QqIGFkZHJbQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTXSA9IHt9OworICAgICAgICB1bm1hcChhZGRyLCBDMlJlY3QoKSwgbnVsbHB0cik7CisgICAgfQorICAgIGlmIChtQnVmZmVyKSB7CisgICAgICAgIGlmIChtTWFwcGVyMikgeworICAgICAgICAgICAgaWYgKCFtTWFwcGVyMi0+ZnJlZUJ1ZmZlcihjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPigKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlcikpLmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdHJhbnNhY3Rpb246IGZyZWVCdWZmZXIiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghbU1hcHBlcjMtPmZyZWVCdWZmZXIoY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oCisgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIpKS5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRyYW5zYWN0aW9uOiBmcmVlQnVmZmVyIik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKG1IYW5kbGUpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoCisgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBuYXRpdmVfaGFuZGxlX3QgKj4obUhhbmRsZSkpKTsKKyAgICB9CisgICAgaWYgKG1Mb2NrZWRIYW5kbGUpIHsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoCisgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oCisgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqPihtTG9ja2VkSGFuZGxlKSkpOworICAgIH0KK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0aW9uR3JhbGxvYzo6bWFwKAorICAgICAgICBDMlJlY3QgcmVjdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsCisgICAgICAgIEMyUGxhbmFyTGF5b3V0ICpsYXlvdXQgLyogbm9ubnVsbCAqLywgdWludDhfdCAqKmFkZHIgLyogbm9ubnVsbCAqLykgeworICAgIHVpbnQ2NF90IGdyYWxsb2NVc2FnZSA9IHN0YXRpY19jYXN0PEMyQW5kcm9pZE1lbW9yeVVzYWdlPih1c2FnZSkuYXNHcmFsbG9jVXNhZ2UoKTsKKyAgICBBTE9HVigibWFwcGluZyBidWZmZXIgd2l0aCB1c2FnZSAlI2xseCA9PiAlI2xseCIsCisgICAgICAgICAgKGxvbmcgbG9uZyl1c2FnZS5leHBlY3RlZCwgKGxvbmcgbG9uZylncmFsbG9jVXNhZ2UpOworCisgICAgLy8gVE9ETworICAgICh2b2lkKSBmZW5jZTsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NYXBwZWRMb2NrKTsKKyAgICBpZiAobUJ1ZmZlciAmJiBtTG9ja2VkKSB7CisgICAgICAgIEFMT0dEKCJhbHJlYWR5IG1hcHBlZCIpOworICAgICAgICByZXR1cm4gQzJfRFVQTElDQVRFOworICAgIH0KKyAgICBpZiAoIWxheW91dCB8fCAhYWRkcikgeworICAgICAgICBBTE9HRCgid3JvbmcgcGFyYW0iKTsKKyAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBpZiAoIW1CdWZmZXIpIHsKKyAgICAgICAgaWYgKG1NYXBwZXIyKSB7CisgICAgICAgICAgICBpZiAoIW1NYXBwZXIyLT5pbXBvcnRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIG1IaWRsSGFuZGxlLCBbJmVyciwgdGhpc10oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1hcGVycjJlcnJvcihtYXBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBzdGF0aWNfY2FzdDxidWZmZXJfaGFuZGxlX3Q+KGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pLmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdHJhbnNhY3Rpb246IGltcG9ydEJ1ZmZlciIpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIW1NYXBwZXIzLT5pbXBvcnRCdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIG1IaWRsSGFuZGxlLCBbJmVyciwgdGhpc10oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZidWZmZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1hcGVycjJlcnJvcihtYXBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBzdGF0aWNfY2FzdDxidWZmZXJfaGFuZGxlX3Q+KGJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0pLmlzT2soKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdHJhbnNhY3Rpb246IGltcG9ydEJ1ZmZlciAoQDMuMCkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJpbXBvcnRCdWZmZXIgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGlmIChtQnVmZmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dEKCJpbXBvcnRCdWZmZXIgcmV0dXJuZWQgbnVsbCBidWZmZXIiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiA9IDA7CisgICAgICAgIHVpbnQ2NF90IGlnYnBfaWQgPSAwOworICAgICAgICB1aW50MzJfdCBpZ2JwX3Nsb3QgPSAwOworICAgICAgICBpZiAobUhhbmRsZSkgeworICAgICAgICAgICAgbUhhbmRsZS0+Z2V0SWdicERhdGEoJmdlbmVyYXRpb24sICZpZ2JwX2lkLCAmaWdicF9zbG90KTsKKyAgICAgICAgfQorICAgICAgICBpZiAobU1hcHBlcjIpIHsKKyAgICAgICAgICAgIG1Mb2NrZWRIYW5kbGUgPSBDMkhhbmRsZUdyYWxsb2M6OldyYXBBbmRNb3ZlTmF0aXZlSGFuZGxlKAorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLCBtSW5mbzIubWFwcGVySW5mby53aWR0aCwgbUluZm8yLm1hcHBlckluZm8uaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpbUluZm8yLm1hcHBlckluZm8uZm9ybWF0LCBtSW5mbzIubWFwcGVySW5mby51c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgbUluZm8yLnN0cmlkZSwgZ2VuZXJhdGlvbiwgaWdicF9pZCwgaWdicF9zbG90KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Mb2NrZWRIYW5kbGUgPSBDMkhhbmRsZUdyYWxsb2M6OldyYXBBbmRNb3ZlTmF0aXZlSGFuZGxlKAorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLCBtSW5mbzMubWFwcGVySW5mby53aWR0aCwgbUluZm8zLm1hcHBlckluZm8uaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpbUluZm8zLm1hcHBlckluZm8uZm9ybWF0LCBtSW5mbzMubWFwcGVySW5mby51c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgbUluZm8zLnN0cmlkZSwgZ2VuZXJhdGlvbiwgaWdicF9pZCwgaWdicF9zbG90KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIFBpeGVsRm9ybWF0MyBmb3JtYXQgPSBtTWFwcGVyMiA/CisgICAgICAgICAgICBQaXhlbEZvcm1hdDMobUluZm8yLm1hcHBlckluZm8uZm9ybWF0KSA6CisgICAgICAgICAgICBQaXhlbEZvcm1hdDMobUluZm8zLm1hcHBlckluZm8uZm9ybWF0KTsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIFBpeGVsRm9ybWF0Mzo6UkdCQV8xMDEwMTAyOiB7CisgICAgICAgICAgICAvLyBUUklDS1k6IHRoaXMgaXMgdXNlZCBmb3IgbWVkaWEgYXMgWVVWNDQ0IGluIHRoZSBjYXNlIHdoZW4gaXQgaXMgcXVldWVkIGRpcmVjdGx5IHRvIGEKKyAgICAgICAgICAgIC8vIFN1cmZhY2UuIEluIGFsbCBvdGhlciBjYXNlcyBpdCBpcyBSR0JBLiBXZSBkb24ndCBrbm93IHdoaWNoIGNhc2UgaXQgaXMgaGVyZSwgc28KKyAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gWVVWIGZvciBub3cuCisgICAgICAgICAgICB2b2lkICpwb2ludGVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIGlmIChtTWFwcGVyMikgeworICAgICAgICAgICAgICAgIGlmICghbU1hcHBlcjItPmxvY2soCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYWxsb2NVc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgKGludDMyX3QpcmVjdC5sZWZ0LCAoaW50MzJfdClyZWN0LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpcmVjdC53aWR0aCwgKGludDMyX3QpcmVjdC5oZWlnaHQgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX2hhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgWyZlcnIsICZwb2ludGVyXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJm1hcFBvaW50ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50ZXIgPSBtYXBQb2ludGVyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRyYW5zYWN0aW9uOiBsb2NrKFJHQkFfMTAxMDEwMikiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghbU1hcHBlcjMtPmxvY2soCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCAqPihtQnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdyYWxsb2NVc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgKGludDMyX3QpcmVjdC5sZWZ0LCAoaW50MzJfdClyZWN0LnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpcmVjdC53aWR0aCwgKGludDMyX3QpcmVjdC5oZWlnaHQgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGZlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX2hhbmRsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgWyZlcnIsICZwb2ludGVyXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJm1hcFBvaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYnl0ZXNQZXJQaXhlbCwgaW50MzJfdCBieXRlc1BlclN0cmlkZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1hcGVycjJlcnJvcihtYXBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciA9IG1hcFBvaW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKWJ5dGVzUGVyUGl4ZWw7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpYnl0ZXNQZXJTdHJpZGU7CisgICAgICAgICAgICAgICAgICAgICAgICB9KS5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogbG9jayhSR0JBXzEwMTAxMDIpIChAMy4wKSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgibG9jayBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gdHJlYXQgYXMgMzItYml0IHZhbHVlcworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfWV0gPSAodWludDhfdCAqKXBvaW50ZXI7CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSA9ICh1aW50OF90ICopcG9pbnRlcjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdID0gKHVpbnQ4X3QgKilwb2ludGVyOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfQV0gPSAodWludDhfdCAqKXBvaW50ZXI7CisgICAgICAgICAgICBsYXlvdXQtPnR5cGUgPSBDMlBsYW5hckxheW91dDo6VFlQRV9ZVVZBOworICAgICAgICAgICAgbGF5b3V0LT5udW1QbGFuZXMgPSA0OworICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMTsKKyAgICAgICAgICAgIGludDMyX3Qgc3RyaWRlID0gbU1hcHBlcjIgPworICAgICAgICAgICAgICAgICAgICBpbnQzMl90KG1JbmZvMi5zdHJpZGUpIDoKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdChtSW5mbzMuc3RyaWRlKTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9ZLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICA0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIDQgKiBzdHJpZGUsICAgICAgICAgICAgICAgICAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkxJVFRMRV9FTkQsICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ksICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DQiwgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICA0ICogc3RyaWRlLCAgICAgICAgICAgICAgICAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICAzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpMSVRUTEVfRU5ELCAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9ZLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQ1IsICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgNCAqIHN0cmlkZSwgICAgICAgICAgICAgICAgICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDEwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAyMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TElUVExFX0VORCwgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0FdID0geworICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpDSEFOTkVMX0EsICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgNCAqIHN0cmlkZSwgICAgICAgICAgICAgICAgICAgICAvLyByb3dJbmMKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZWREZXB0aAorICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAzMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TElUVExFX0VORCwgICAgICAgIC8vIGVuZGlhbm5lc3MKKyAgICAgICAgICAgICAgICBDMlBsYW5hckxheW91dDo6UExBTkVfWSwgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFBpeGVsRm9ybWF0Mzo6UkdCQV84ODg4OgorICAgICAgICAgICAgLy8gVE9ETzogYWxwaGEgY2hhbm5lbAorICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoCisgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQzOjpSR0JYXzg4ODg6IHsKKyAgICAgICAgICAgIHZvaWQgKnBvaW50ZXIgPSBudWxscHRyOworICAgICAgICAgICAgaWYgKG1NYXBwZXIyKSB7CisgICAgICAgICAgICAgICAgaWYgKCFtTWFwcGVyMi0+bG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KG1CdWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbGxvY1VzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgeyAoaW50MzJfdClyZWN0LmxlZnQsIChpbnQzMl90KXJlY3QudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClyZWN0LndpZHRoLCAoaW50MzJfdClyZWN0LmhlaWdodCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBbJmVyciwgJnBvaW50ZXJdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmbWFwUG9pbnRlcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IG1hcGVycjJlcnJvcihtYXBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciA9IG1hcFBvaW50ZXI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSkuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdHJhbnNhY3Rpb246IGxvY2soUkdCQV84ODg4KSIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFtTWFwcGVyMy0+bG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KG1CdWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3JhbGxvY1VzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgeyAoaW50MzJfdClyZWN0LmxlZnQsIChpbnQzMl90KXJlY3QudG9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClyZWN0LndpZHRoLCAoaW50MzJfdClyZWN0LmhlaWdodCB9LAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfaGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBbJmVyciwgJnBvaW50ZXJdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmbWFwUG9pbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBieXRlc1BlclBpeGVsLCBpbnQzMl90IGJ5dGVzUGVyU3RyaWRlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyID0gbWFwUG9pbnRlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpYnl0ZXNQZXJQaXhlbDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZClieXRlc1BlclN0cmlkZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRyYW5zYWN0aW9uOiBsb2NrKFJHQkFfODg4OCkgKEAzLjApIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dEKCJsb2NrIGZhaWxlZDogJWQiLCBlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9SXSA9ICh1aW50OF90ICopcG9pbnRlcjsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0ddID0gKHVpbnQ4X3QgKilwb2ludGVyICsgMTsKKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX0JdID0gKHVpbnQ4X3QgKilwb2ludGVyICsgMjsKKyAgICAgICAgICAgIGxheW91dC0+dHlwZSA9IEMyUGxhbmFyTGF5b3V0OjpUWVBFX1JHQjsKKyAgICAgICAgICAgIGxheW91dC0+bnVtUGxhbmVzID0gMzsKKyAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDE7CisgICAgICAgICAgICBpbnQzMl90IHN0cmlkZSA9IG1NYXBwZXIyID8KKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdChtSW5mbzIuc3RyaWRlKSA6CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QobUluZm8zLnN0cmlkZSk7CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfUl0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfUiwgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICA0ICogc3RyaWRlLCAgICAgICAgICAgICAgICAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9SLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfR10gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfRywgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICA0ICogc3RyaWRlLCAgICAgICAgICAgICAgICAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9SLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfQl0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQiwgICAgICAgICAvLyBjaGFubmVsCisgICAgICAgICAgICAgICAgNCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICA0ICogc3RyaWRlLCAgICAgICAgICAgICAgICAgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbUNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBiaXREZXB0aAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9SLCAgICAgICAgLy8gcm9vdEl4CisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQzOjpZQ0JDUl80MjBfODg4OgorICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoCisgICAgICAgIGNhc2UgUGl4ZWxGb3JtYXQzOjpZVjEyOgorICAgICAgICAgICAgLy8gZmFsbC10aHJvdWdoCisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIHN0cnVjdCBZQ2JDckxheW91dCB7CisgICAgICAgICAgICAgICAgdm9pZCogeTsKKyAgICAgICAgICAgICAgICB2b2lkKiBjYjsKKyAgICAgICAgICAgICAgICB2b2lkKiBjcjsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCB5U3RyaWRlOworICAgICAgICAgICAgICAgIHVpbnQzMl90IGNTdHJpZGU7CisgICAgICAgICAgICAgICAgdWludDMyX3QgY2hyb21hU3RlcDsKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBZQ2JDckxheW91dCB5Y2JjckxheW91dDsKKyAgICAgICAgICAgIGlmIChtTWFwcGVyMikgeworICAgICAgICAgICAgICAgIGlmICghbU1hcHBlcjItPmxvY2tZQ2JDcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KG1CdWZmZXIpLCBncmFsbG9jVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICB7IChpbnQzMl90KXJlY3QubGVmdCwgKGludDMyX3QpcmVjdC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF9oYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsmZXJyLCAmeWNiY3JMYXlvdXRdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmbWFwTGF5b3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Y2JjckxheW91dCA9IFlDYkNyTGF5b3V0eworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcExheW91dC55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcExheW91dC5jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBMYXlvdXQuY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwTGF5b3V0LnlTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwTGF5b3V0LmNTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwTGF5b3V0LmNocm9tYVN0ZXB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRyYW5zYWN0aW9uOiBsb2NrWUNiQ3IiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICghbU1hcHBlcjMtPmxvY2tZQ2JDcigKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KG1CdWZmZXIpLCBncmFsbG9jVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICB7IChpbnQzMl90KXJlY3QubGVmdCwgKGludDMyX3QpcmVjdC50b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXJlY3Qud2lkdGgsIChpbnQzMl90KXJlY3QuaGVpZ2h0IH0sCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBmZW5jZQorICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF9oYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsmZXJyLCAmeWNiY3JMYXlvdXRdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmbWFwTGF5b3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gbWFwZXJyMmVycm9yKG1hcGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5Y2JjckxheW91dCA9IFlDYkNyTGF5b3V0eworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcExheW91dC55LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcExheW91dC5jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBMYXlvdXQuY3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwTGF5b3V0LnlTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwTGF5b3V0LmNTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwTGF5b3V0LmNocm9tYVN0ZXB9OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0pLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRyYW5zYWN0aW9uOiBsb2NrWUNiQ3IgKEAzLjApIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgIEFMT0dEKCJsb2NrWUNiQ3IgZmFpbGVkOiAlZCIsIGVycik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZHJbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ldID0gKHVpbnQ4X3QgKil5Y2JjckxheW91dC55OworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVV0gPSAodWludDhfdCAqKXljYmNyTGF5b3V0LmNiOworICAgICAgICAgICAgYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0gPSAodWludDhfdCAqKXljYmNyTGF5b3V0LmNyOworICAgICAgICAgICAgbGF5b3V0LT50eXBlID0gQzJQbGFuYXJMYXlvdXQ6OlRZUEVfWVVWOworICAgICAgICAgICAgbGF5b3V0LT5udW1QbGFuZXMgPSAzOworICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMzsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9ZLCAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbEluYworICAgICAgICAgICAgICAgIChpbnQzMl90KXljYmNyTGF5b3V0LnlTdHJpZGUsICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Sb3dTYW1wbGluZworICAgICAgICAgICAgICAgIDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByaWdodFNoaWZ0CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86Ok5BVElWRSwgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ksICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldAorICAgICAgICAgICAgfTsKKyAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXSA9IHsKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6Q0hBTk5FTF9DQiwgICAgICAgICAgLy8gY2hhbm5lbAorICAgICAgICAgICAgICAgIChpbnQzMl90KXljYmNyTGF5b3V0LmNocm9tYVN0ZXAsICAvLyBjb2xJbmMKKyAgICAgICAgICAgICAgICAoaW50MzJfdCl5Y2JjckxheW91dC5jU3RyaWRlLCAgICAgLy8gcm93SW5jCisgICAgICAgICAgICAgICAgMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1Db2xTYW1wbGluZworICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtUm93U2FtcGxpbmcKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGVkRGVwdGgKKyAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0RGVwdGgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmlnaHRTaGlmdAorICAgICAgICAgICAgICAgIEMyUGxhbmVJbmZvOjpOQVRJVkUsICAgICAgICAgICAgICAvLyBlbmRpYW5uZXNzCisgICAgICAgICAgICAgICAgQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1UsICAgICAgICAgIC8vIHJvb3RJeAorICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQKKyAgICAgICAgICAgIH07CisgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVl0gPSB7CisgICAgICAgICAgICAgICAgQzJQbGFuZUluZm86OkNIQU5ORUxfQ1IsICAgICAgICAgIC8vIGNoYW5uZWwKKyAgICAgICAgICAgICAgICAoaW50MzJfdCl5Y2JjckxheW91dC5jaHJvbWFTdGVwLCAgLy8gY29sSW5jCisgICAgICAgICAgICAgICAgKGludDMyX3QpeWNiY3JMYXlvdXQuY1N0cmlkZSwgICAgIC8vIHJvd0luYworICAgICAgICAgICAgICAgIDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtQ29sU2FtcGxpbmcKKyAgICAgICAgICAgICAgICAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbVJvd1NhbXBsaW5nCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlZERlcHRoCisgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdERlcHRoCisgICAgICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJpZ2h0U2hpZnQKKyAgICAgICAgICAgICAgICBDMlBsYW5lSW5mbzo6TkFUSVZFLCAgICAgICAgICAgICAgLy8gZW5kaWFubmVzcworICAgICAgICAgICAgICAgIEMyUGxhbmFyTGF5b3V0OjpQTEFORV9WLCAgICAgICAgICAvLyByb290SXgKKyAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0CisgICAgICAgICAgICB9OworICAgICAgICAgICAgLy8gaGFuZGxlIGludGVybGVhdmVkIGZvcm1hdHMKKyAgICAgICAgICAgIGludHB0cl90IHV2T2Zmc2V0ID0gYWRkcltDMlBsYW5hckxheW91dDo6UExBTkVfVl0gLSBhZGRyW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgICAgIGlmICh1dk9mZnNldCA+IDAgJiYgdXZPZmZzZXQgPCAoaW50cHRyX3QpeWNiY3JMYXlvdXQuY2hyb21hU3RlcCkgeworICAgICAgICAgICAgICAgIGxheW91dC0+cm9vdFBsYW5lcyA9IDI7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1ZdLnJvb3RJeCA9IEMyUGxhbmFyTGF5b3V0OjpQTEFORV9VOworICAgICAgICAgICAgICAgIGxheW91dC0+cGxhbmVzW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXS5vZmZzZXQgPSB1dk9mZnNldDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodXZPZmZzZXQgPCAwICYmIHV2T2Zmc2V0ID4gLShpbnRwdHJfdCl5Y2JjckxheW91dC5jaHJvbWFTdGVwKSB7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5yb290UGxhbmVzID0gMjsKKyAgICAgICAgICAgICAgICBsYXlvdXQtPnBsYW5lc1tDMlBsYW5hckxheW91dDo6UExBTkVfVV0ucm9vdEl4ID0gQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1Y7CisgICAgICAgICAgICAgICAgbGF5b3V0LT5wbGFuZXNbQzJQbGFuYXJMYXlvdXQ6OlBMQU5FX1VdLm9mZnNldCA9IC11dk9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIG1Mb2NrZWQgPSB0cnVlOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRpb25HcmFsbG9jOjp1bm1hcCgKKyAgICAgICAgdWludDhfdCAqKmFkZHIsIEMyUmVjdCByZWN0LCBDMkZlbmNlICpmZW5jZSAvKiBudWxsYWJsZSAqLykgeworICAgIC8vIFRPRE86IGNoZWNrIGFkZHIgYW5kIHNpemUsIHVzZSBmZW5jZQorICAgICh2b2lkKWFkZHI7CisgICAgKHZvaWQpcmVjdDsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NYXBwZWRMb2NrKTsKKyAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICBpZiAobU1hcHBlcjIpIHsKKyAgICAgICAgaWYgKCFtTWFwcGVyMi0+dW5sb2NrKAorICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KG1CdWZmZXIpLAorICAgICAgICAgICAgICAgIFsmZXJyLCAmZmVuY2VdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmcmVsZWFzZUZlbmNlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpIGZlbmNlOworICAgICAgICAgICAgICAgICAgICAodm9pZCkgcmVsZWFzZUZlbmNlOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogdW5sb2NrIik7CisgICAgICAgICAgICByZXR1cm4gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCFtTWFwcGVyMy0+dW5sb2NrKAorICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8bmF0aXZlX2hhbmRsZV90ICo+KG1CdWZmZXIpLAorICAgICAgICAgICAgICAgIFsmZXJyLCAmZmVuY2VdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmcmVsZWFzZUZlbmNlKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8KKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpIGZlbmNlOworICAgICAgICAgICAgICAgICAgICAodm9pZCkgcmVsZWFzZUZlbmNlOworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogZmVuY2UKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogdW5sb2NrIChAMy4wKSIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgIG1Mb2NrZWQgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKworYm9vbCBDMkFsbG9jYXRpb25HcmFsbG9jOjplcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyR3JhcGhpY0FsbG9jYXRpb24+ICZvdGhlcikgY29uc3QgeworICAgIHJldHVybiBvdGhlciAmJiBvdGhlci0+aGFuZGxlKCkgPT0gaGFuZGxlKCk7Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gR1JBTExPQyBBTExPQ0FUT1IgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitjbGFzcyBDMkFsbG9jYXRvckdyYWxsb2M6OkltcGwgeworcHVibGljOgorICAgIEltcGwoaWRfdCBpZCwgYm9vbCBidWZmZXJRdWV1ZSk7CisKKyAgICBpZF90IGdldElkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRyYWl0cy0+aWQ7CisgICAgfQorCisgICAgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UcmFpdHMtPm5hbWU7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQWxsb2NhdG9yOjpUcmFpdHM+IGdldFRyYWl0cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UcmFpdHM7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgbmV3R3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIGNvbnN0IEMyTWVtb3J5VXNhZ2UgJnVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKTsKKworICAgIGMyX3N0YXR1c190IHByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKTsKKworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1Jbml0OyB9CisKK3ByaXZhdGU6CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yOjpUcmFpdHM+IG1UcmFpdHM7CisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgc3A8SUFsbG9jYXRvcjI+IG1BbGxvY2F0b3IyOworICAgIHNwPElNYXBwZXIyPiBtTWFwcGVyMjsKKyAgICBzcDxJQWxsb2NhdG9yMz4gbUFsbG9jYXRvcjM7CisgICAgc3A8SU1hcHBlcjM+IG1NYXBwZXIzOworICAgIGNvbnN0IGJvb2wgbUJ1ZmZlclF1ZXVlOworfTsKKwordm9pZCBfVW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY01ldGFkYXRhKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqY29uc3QgaGFuZGxlLAorICAgICAgICB1aW50MzJfdCAqd2lkdGgsIHVpbnQzMl90ICpoZWlnaHQsIHVpbnQzMl90ICpmb3JtYXQsdWludDY0X3QgKnVzYWdlLCB1aW50MzJfdCAqc3RyaWRlLAorICAgICAgICB1aW50MzJfdCAqZ2VuZXJhdGlvbiwgdWludDY0X3QgKmlnYnBfaWQsIHVpbnQzMl90ICppZ2JwX3Nsb3QpIHsKKyAgICAodm9pZClDMkhhbmRsZUdyYWxsb2M6OkltcG9ydChoYW5kbGUsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0aW9uLCBpZ2JwX2lkLCBpZ2JwX3Nsb3QpOworfQorCitDMkFsbG9jYXRvckdyYWxsb2M6OkltcGw6OkltcGwoaWRfdCBpZCwgYm9vbCBidWZmZXJRdWV1ZSkKKyAgICA6IG1Jbml0KEMyX09LKSwgbUJ1ZmZlclF1ZXVlKGJ1ZmZlclF1ZXVlKSB7CisgICAgLy8gVE9ETzogZ2V0IHRoaXMgZnJvbSBhbGxvY2F0b3IKKyAgICBDMk1lbW9yeVVzYWdlIG1pblVzYWdlID0geyAwLCAwIH0sIG1heFVzYWdlID0geyB+KHVpbnQ2NF90KTAsIH4odWludDY0X3QpMCB9OworICAgIFRyYWl0cyB0cmFpdHMgPSB7ICJhbmRyb2lkLmFsbG9jYXRvci5ncmFsbG9jIiwgaWQsIEMyQWxsb2NhdG9yOjpHUkFQSElDLCBtaW5Vc2FnZSwgbWF4VXNhZ2UgfTsKKyAgICBtVHJhaXRzID0gc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRvcjo6VHJhaXRzPih0cmFpdHMpOworCisgICAgLy8gZ3JhbGxvYyBhbGxvY2F0b3IgaXMgYSBzaW5nbGV0b24sIHNvIGFsbCBvYmplY3RzIHNoYXJlIGEgZ2xvYmFsIHNlcnZpY2UKKyAgICBtQWxsb2NhdG9yMyA9IElBbGxvY2F0b3IzOjpnZXRTZXJ2aWNlKCk7CisgICAgbU1hcHBlcjMgPSBJTWFwcGVyMzo6Z2V0U2VydmljZSgpOworICAgIGlmICghbUFsbG9jYXRvcjMgfHwgIW1NYXBwZXIzKSB7CisgICAgICAgIG1BbGxvY2F0b3IzID0gbnVsbHB0cjsKKyAgICAgICAgbU1hcHBlcjMgPSBudWxscHRyOworICAgICAgICBtQWxsb2NhdG9yMiA9IElBbGxvY2F0b3IyOjpnZXRTZXJ2aWNlKCk7CisgICAgICAgIG1NYXBwZXIyID0gSU1hcHBlcjI6OmdldFNlcnZpY2UoKTsKKyAgICAgICAgaWYgKCFtQWxsb2NhdG9yMiB8fCAhbU1hcHBlcjIpIHsKKyAgICAgICAgICAgIG1BbGxvY2F0b3IyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1NYXBwZXIyID0gbnVsbHB0cjsKKyAgICAgICAgICAgIG1Jbml0ID0gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvckdyYWxsb2M6OkltcGw6Om5ld0dyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIGNvbnN0IEMyTWVtb3J5VXNhZ2UgJnVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIHsKKyAgICB1aW50NjRfdCBncmFsbG9jVXNhZ2UgPSBzdGF0aWNfY2FzdDxDMkFuZHJvaWRNZW1vcnlVc2FnZT4odXNhZ2UpLmFzR3JhbGxvY1VzYWdlKCk7CisgICAgQUxPR1YoImFsbG9jYXRpbmcgYnVmZmVyIHdpdGggdXNhZ2UgJSNsbHggPT4gJSNsbHgiLAorICAgICAgICAgIChsb25nIGxvbmcpdXNhZ2UuZXhwZWN0ZWQsIChsb25nIGxvbmcpZ3JhbGxvY1VzYWdlKTsKKworICAgIGMyX3N0YXR1c190IGVyciA9IEMyX09LOworICAgIGhpZGxfaGFuZGxlIGJ1ZmZlcnt9OworCisgICAgaWYgKG1NYXBwZXIyKSB7CisgICAgICAgIEJ1ZmZlckRlc2NyaXB0b3JJbmZvMiBpbmZvID0geworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgIGhlaWdodCwKKyAgICAgICAgICAgICAgICAxdSwgIC8vIGxheWVyQ291bnQKKyAgICAgICAgICAgICAgICBQaXhlbEZvcm1hdDIoZm9ybWF0KSwKKyAgICAgICAgICAgICAgICBncmFsbG9jVXNhZ2UsCisgICAgICAgICAgICB9LAorICAgICAgICAgICAgMHUsICAvLyBzdHJpZGUgcGxhY2Vob2xkZXIKKyAgICAgICAgfTsKKyAgICAgICAgQnVmZmVyRGVzY3JpcHRvcjIgZGVzYzsKKyAgICAgICAgaWYgKCFtTWFwcGVyMi0+Y3JlYXRlRGVzY3JpcHRvcigKKyAgICAgICAgICAgICAgICBpbmZvLm1hcHBlckluZm8sIFsmZXJyLCAmZGVzY10oY29uc3QgYXV0byAmbWFwZXJyLCBjb25zdCBhdXRvICZkZXNjcmlwdG9yKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1hcGVycjJlcnJvcihtYXBlcnIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXNjID0gZGVzY3JpcHRvcjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogY3JlYXRlRGVzY3JpcHRvciIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisKKyAgICAgICAgLy8gSUFsbG9jYXRvciBzaGFyZXMgSU1hcHBlciBlcnJvciBjb2Rlcy4KKyAgICAgICAgaWYgKCFtQWxsb2NhdG9yMi0+YWxsb2NhdGUoCisgICAgICAgICAgICAgICAgZGVzYywKKyAgICAgICAgICAgICAgICAxdSwKKyAgICAgICAgICAgICAgICBbJmVyciwgJmJ1ZmZlciwgJmluZm9dKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmc3RyaWRlLCBhdXRvICZidWZmZXJzKSB7CisgICAgICAgICAgICAgICAgICAgIGVyciA9IG1hcGVycjJlcnJvcihtYXBlcnIpOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlcnMuc2l6ZSgpICE9IDF1KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBDMl9DT1JSVVBURUQ7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaW5mby5zdHJpZGUgPSBzdHJpZGU7CisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciA9IGJ1ZmZlcnNbMF07CisgICAgICAgICAgICAgICAgfSkuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRyYW5zYWN0aW9uOiBhbGxvY2F0ZSIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICAgICAgfQorICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICB9CisgICAgICAgIGFsbG9jYXRpb24tPnJlc2V0KG5ldyBDMkFsbG9jYXRpb25HcmFsbG9jKAorICAgICAgICAgICAgICAgIGluZm8sIG1NYXBwZXIyLCBidWZmZXIsCisgICAgICAgICAgICAgICAgQzJIYW5kbGVHcmFsbG9jOjpXcmFwQW5kTW92ZU5hdGl2ZUhhbmRsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci5nZXROYXRpdmVIYW5kbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGdyYWxsb2NVc2FnZSwgaW5mby5zdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCBtQnVmZmVyUXVldWUgPyB+MCA6IDApLAorICAgICAgICAgICAgICAgIG1UcmFpdHMtPmlkKSk7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9IGVsc2UgeworICAgICAgICBCdWZmZXJEZXNjcmlwdG9ySW5mbzMgaW5mbyA9IHsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB3aWR0aCwKKyAgICAgICAgICAgICAgICBoZWlnaHQsCisgICAgICAgICAgICAgICAgMXUsICAvLyBsYXllckNvdW50CisgICAgICAgICAgICAgICAgUGl4ZWxGb3JtYXQzKGZvcm1hdCksCisgICAgICAgICAgICAgICAgZ3JhbGxvY1VzYWdlLAorICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIDB1LCAgLy8gc3RyaWRlIHBsYWNlaG9sZGVyCisgICAgICAgIH07CisgICAgICAgIEJ1ZmZlckRlc2NyaXB0b3IzIGRlc2M7CisgICAgICAgIGlmICghbU1hcHBlcjMtPmNyZWF0ZURlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgaW5mby5tYXBwZXJJbmZvLCBbJmVyciwgJmRlc2NdKGNvbnN0IGF1dG8gJm1hcGVyciwgY29uc3QgYXV0byAmZGVzY3JpcHRvcikgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyA9IGRlc2NyaXB0b3I7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KS5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdHJhbnNhY3Rpb246IGNyZWF0ZURlc2NyaXB0b3IiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElBbGxvY2F0b3Igc2hhcmVzIElNYXBwZXIgZXJyb3IgY29kZXMuCisgICAgICAgIGlmICghbUFsbG9jYXRvcjMtPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgIGRlc2MsCisgICAgICAgICAgICAgICAgMXUsCisgICAgICAgICAgICAgICAgWyZlcnIsICZidWZmZXIsICZpbmZvXShjb25zdCBhdXRvICZtYXBlcnIsIGNvbnN0IGF1dG8gJnN0cmlkZSwgYXV0byAmYnVmZmVycykgeworICAgICAgICAgICAgICAgICAgICBlcnIgPSBtYXBlcnIyZXJyb3IobWFwZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChidWZmZXJzLnNpemUoKSAhPSAxdSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZXJyID0gQzJfQ09SUlVQVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGluZm8uc3RyaWRlID0gc3RyaWRlOworICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSBidWZmZXJzWzBdOworICAgICAgICAgICAgICAgIH0pLmlzT2soKSkgeworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0cmFuc2FjdGlvbjogYWxsb2NhdGUiKTsKKyAgICAgICAgICAgIHJldHVybiBDMl9DT1JSVVBURUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVyciAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgICAgICBhbGxvY2F0aW9uLT5yZXNldChuZXcgQzJBbGxvY2F0aW9uR3JhbGxvYygKKyAgICAgICAgICAgICAgICBpbmZvLCBtTWFwcGVyMywgYnVmZmVyLAorICAgICAgICAgICAgICAgIEMySGFuZGxlR3JhbGxvYzo6V3JhcEFuZE1vdmVOYXRpdmVIYW5kbGUoCisgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuZ2V0TmF0aXZlSGFuZGxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBncmFsbG9jVXNhZ2UsIGluZm8uc3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgbUJ1ZmZlclF1ZXVlID8gfjAgOiAwKSwKKyAgICAgICAgICAgICAgICBtVHJhaXRzLT5pZCkpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvckdyYWxsb2M6OkltcGw6OnByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgeworICAgIGlmIChtTWFwcGVyMikgeworICAgICAgICBCdWZmZXJEZXNjcmlwdG9ySW5mbzIgaW5mbzsKKyAgICAgICAgaW5mby5tYXBwZXJJbmZvLmxheWVyQ291bnQgPSAxdTsKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbjsKKyAgICAgICAgdWludDY0X3QgaWdicF9pZDsKKyAgICAgICAgdWludDMyX3QgaWdicF9zbG90OworICAgICAgICBjb25zdCBDMkhhbmRsZUdyYWxsb2MgKmdyYWxsb2NIYW5kbGUgPSBDMkhhbmRsZUdyYWxsb2M6OkltcG9ydCgKKyAgICAgICAgICAgICAgICBoYW5kbGUsCisgICAgICAgICAgICAgICAgJmluZm8ubWFwcGVySW5mby53aWR0aCwgJmluZm8ubWFwcGVySW5mby5oZWlnaHQsCisgICAgICAgICAgICAgICAgKHVpbnQzMl90ICopJmluZm8ubWFwcGVySW5mby5mb3JtYXQsCisgICAgICAgICAgICAgICAgKHVpbnQ2NF90ICopJmluZm8ubWFwcGVySW5mby51c2FnZSwKKyAgICAgICAgICAgICAgICAmaW5mby5zdHJpZGUsCisgICAgICAgICAgICAgICAgJmdlbmVyYXRpb24sICZpZ2JwX2lkLCAmaWdicF9zbG90KTsKKyAgICAgICAgaWYgKGdyYWxsb2NIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIGhpZGxfaGFuZGxlIGhpZGxIYW5kbGU7CisgICAgICAgIGhpZGxIYW5kbGUuc2V0VG8oQzJIYW5kbGVHcmFsbG9jOjpVbndyYXBOYXRpdmVIYW5kbGUoZ3JhbGxvY0hhbmRsZSksIHRydWUpOworCisgICAgICAgIGFsbG9jYXRpb24tPnJlc2V0KG5ldyBDMkFsbG9jYXRpb25HcmFsbG9jKAorICAgICAgICAgICAgICAgIGluZm8sIG1NYXBwZXIyLCBoaWRsSGFuZGxlLCBncmFsbG9jSGFuZGxlLCBtVHJhaXRzLT5pZCkpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQnVmZmVyRGVzY3JpcHRvckluZm8zIGluZm87CisgICAgICAgIGluZm8ubWFwcGVySW5mby5sYXllckNvdW50ID0gMXU7CisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgICAgIHVpbnQ2NF90IGlnYnBfaWQ7CisgICAgICAgIHVpbnQzMl90IGlnYnBfc2xvdDsKKyAgICAgICAgY29uc3QgQzJIYW5kbGVHcmFsbG9jICpncmFsbG9jSGFuZGxlID0gQzJIYW5kbGVHcmFsbG9jOjpJbXBvcnQoCisgICAgICAgICAgICAgICAgaGFuZGxlLAorICAgICAgICAgICAgICAgICZpbmZvLm1hcHBlckluZm8ud2lkdGgsICZpbmZvLm1hcHBlckluZm8uaGVpZ2h0LAorICAgICAgICAgICAgICAgICh1aW50MzJfdCAqKSZpbmZvLm1hcHBlckluZm8uZm9ybWF0LAorICAgICAgICAgICAgICAgICh1aW50NjRfdCAqKSZpbmZvLm1hcHBlckluZm8udXNhZ2UsCisgICAgICAgICAgICAgICAgJmluZm8uc3RyaWRlLAorICAgICAgICAgICAgICAgICZnZW5lcmF0aW9uLCAmaWdicF9pZCwgJmlnYnBfc2xvdCk7CisgICAgICAgIGlmIChncmFsbG9jSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBoaWRsX2hhbmRsZSBoaWRsSGFuZGxlOworICAgICAgICBoaWRsSGFuZGxlLnNldFRvKEMySGFuZGxlR3JhbGxvYzo6VW53cmFwTmF0aXZlSGFuZGxlKGdyYWxsb2NIYW5kbGUpLCB0cnVlKTsKKworICAgICAgICBhbGxvY2F0aW9uLT5yZXNldChuZXcgQzJBbGxvY2F0aW9uR3JhbGxvYygKKyAgICAgICAgICAgICAgICBpbmZvLCBtTWFwcGVyMywgaGlkbEhhbmRsZSwgZ3JhbGxvY0hhbmRsZSwgbVRyYWl0cy0+aWQpKTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KK30KKworQzJBbGxvY2F0b3JHcmFsbG9jOjpDMkFsbG9jYXRvckdyYWxsb2MoaWRfdCBpZCwgYm9vbCBidWZmZXJRdWV1ZSkKKyAgICAgICAgOiBtSW1wbChuZXcgSW1wbChpZCwgYnVmZmVyUXVldWUpKSB7fQorCitDMkFsbG9jYXRvckdyYWxsb2M6On5DMkFsbG9jYXRvckdyYWxsb2MoKSB7IGRlbGV0ZSBtSW1wbDsgfQorCitDMkFsbG9jYXRvcjo6aWRfdCBDMkFsbG9jYXRvckdyYWxsb2M6OmdldElkKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0SWQoKTsKK30KKworQzJTdHJpbmcgQzJBbGxvY2F0b3JHcmFsbG9jOjpnZXROYW1lKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0TmFtZSgpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4gQzJBbGxvY2F0b3JHcmFsbG9jOjpnZXRUcmFpdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRUcmFpdHMoKTsKK30KKworYzJfc3RhdHVzX3QgQzJBbGxvY2F0b3JHcmFsbG9jOjpuZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIHsKKyAgICByZXR1cm4gbUltcGwtPm5ld0dyYXBoaWNBbGxvY2F0aW9uKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIGFsbG9jYXRpb24pOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvckdyYWxsb2M6OnByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgeworICAgIHJldHVybiBtSW1wbC0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsIGFsbG9jYXRpb24pOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvckdyYWxsb2M6OnN0YXR1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPnN0YXR1cygpOworfQorCitib29sIEMyQWxsb2NhdG9yR3JhbGxvYzo6aXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3QgbykgeworICAgIHJldHVybiBDMkhhbmRsZUdyYWxsb2M6OmlzVmFsaWQobyk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9ySW9uLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQWxsb2NhdG9ySW9uLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNDcwYTMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJBbGxvY2F0b3JJb24uY3BwCkBAIC0wLDAgKzEsNjQwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkFsbG9jYXRvcklvbiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxpb24vaW9uLmg+CisjaW5jbHVkZSA8c3lzL21tYW4uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4gLy8gZ2V0cGFnZXNpemUsIHNpemVfdCwgY2xvc2UsIGR1cAorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JJb24uaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMkVycm5vVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCituYW1lc3BhY2UgeworICAgIGNvbnN0ZXhwciBzaXplX3QgVVNBR0VfTFJVX0NBQ0hFX1NJWkUgPSAxMDI0OworfQorCisvKiBzaXplX3QgPD0+IGludChsbyksIGludChoaSkgY29udmVyc2lvbnMgKi8KK2NvbnN0ZXhwciBpbmxpbmUgaW50IHNpemUyaW50TG8oc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gaW50KHMgJiAweEZGRkZGRkZGKTsKK30KKworY29uc3RleHByIGlubGluZSBpbnQgc2l6ZTJpbnRIaShzaXplX3QgcykgeworICAgIC8vIGNhc3QgdG8gdWludDY0X3QgYXMgc2l6ZV90IG1heSBiZSAzMiBiaXRzIHdpZGUKKyAgICByZXR1cm4gaW50KCh1aW50NjRfdChzKSA+PiAzMikgJiAweEZGRkZGRkZGKTsKK30KKworY29uc3RleHByIGlubGluZSBzaXplX3QgaW50czJzaXplKGludCBpbnRMbywgaW50IGludEhpKSB7CisgICAgLy8gY29udmVydCBpbiAyIHN0YWdlcyB0byA2NCBiaXRzIGFzIGludEhpIG1heSBiZSBuZWdhdGl2ZQorICAgIHJldHVybiBzaXplX3QodW5zaWduZWQoaW50TG8pKSB8IHNpemVfdCh1aW50NjRfdCh1bnNpZ25lZChpbnRIaSkpIDw8IDMyKTsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU9OIEhBTkRMRSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKioKKyAqIElPTiBoYW5kbGUKKyAqCisgKiBUaGVyZSBjYW4gYmUgb25seSBhIHNvbGUgaW9uIGNsaWVudCBwZXIgcHJvY2VzcywgdGhpcyBpcyBjYXB0dXJlZCBpbiB0aGUgaW9uIGZkIHRoYXQgaXMgcGFzc2VkCisgKiB0byB0aGUgY29uc3RydWN0b3IsIGJ1dCB0aGlzIHNob3VsZCBiZSBtYW5hZ2VkIGJ5IHRoZSBpb24gYnVmZmVyIGFsbG9jYXRvci9tYXBwZXIuCisgKgorICogaW9uIHVzZXMgaW9uX3VzZXJfaGFuZGxlX3QgZm9yIGJ1ZmZlcnMuIFdlIGRvbid0IHN0b3JlIHRoaXMgaW4gdGhlIG5hdGl2ZSBoYW5kbGUgYXMKKyAqIGl0IHJlcXVpcmVzIGFuIGlvbl9mcmVlIHRvIGRlY3JlZi4gSW5zdGVhZCwgd2Ugc2hhcmUgdGhlIGJ1ZmZlciB0byBnZXQgYW4gZmQgdGhhdCBhbHNvIGhvbGRzCisgKiBhIHJlZmNvdW50LgorICoKKyAqIFRoaXMgaGFuZGxlIHdpbGwgbm90IGNhcHR1cmUgbWFwcGVkIGZkLXMgYXMgdXBkYXRpbmcgdGhhdCB3b3VsZCByZXF1aXJlIGEgZ2xvYmFsIG11dGV4LgorICovCisKK3N0cnVjdCBDMkhhbmRsZUlvbiA6IHB1YmxpYyBDMkhhbmRsZSB7CisgICAgLy8gaW9uIGhhbmRsZSBvd25zIGlvbkZkKCEpIGFuZCBidWZmZXJGZAorICAgIEMySGFuZGxlSW9uKGludCBidWZmZXJGZCwgc2l6ZV90IHNpemUpCisgICAgICAgIDogQzJIYW5kbGUoY0hlYWRlciksCisgICAgICAgICAgbUZkc3sgYnVmZmVyRmQgfSwKKyAgICAgICAgICBtSW50c3sgaW50KHNpemUgJiAweEZGRkZGRkZGKSwgaW50KCh1aW50NjRfdChzaXplKSA+PiAzMikgJiAweEZGRkZGRkZGKSwga01hZ2ljIH0geyB9CisKKyAgICBzdGF0aWMgYm9vbCBpc1ZhbGlkKGNvbnN0IEMySGFuZGxlICogY29uc3Qgbyk7CisKKyAgICBpbnQgYnVmZmVyRmQoKSBjb25zdCB7IHJldHVybiBtRmRzLm1CdWZmZXI7IH0KKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHNpemVfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUxvKSkKKyAgICAgICAgICAgICAgICB8IHNpemVfdCh1aW50NjRfdCh1bnNpZ25lZChtSW50cy5tU2l6ZUhpKSkgPDwgMzIpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHN0cnVjdCB7CisgICAgICAgIGludCBtQnVmZmVyOyAvLyBzaGFyZWQgaW9uIGJ1ZmZlcgorICAgIH0gbUZkczsKKyAgICBzdHJ1Y3QgeworICAgICAgICBpbnQgbVNpemVMbzsgLy8gbG93IDMyLWJpdHMgb2Ygc2l6ZQorICAgICAgICBpbnQgbVNpemVIaTsgLy8gaGlnaCAzMi1iaXRzIG9mIHNpemUKKyAgICAgICAgaW50IG1NYWdpYzsKKyAgICB9IG1JbnRzOworCitwcml2YXRlOgorICAgIHR5cGVkZWYgQzJIYW5kbGVJb24gX3R5cGU7CisgICAgZW51bSB7CisgICAgICAgIGtNYWdpYyA9ICdceGMyaW9ceDAwJywKKyAgICAgICAgbnVtRmRzID0gc2l6ZW9mKG1GZHMpIC8gc2l6ZW9mKGludCksCisgICAgICAgIG51bUludHMgPSBzaXplb2YobUludHMpIC8gc2l6ZW9mKGludCksCisgICAgICAgIHZlcnNpb24gPSBzaXplb2YoQzJIYW5kbGUpCisgICAgfTsKKyAgICAvL2NvbnN0ZXhwciBzdGF0aWMgQzJIYW5kbGUgY0hlYWRlciA9IHsgdmVyc2lvbiwgbnVtRmRzLCBudW1JbnRzLCB7fSB9OworICAgIGNvbnN0IHN0YXRpYyBDMkhhbmRsZSBjSGVhZGVyOworfTsKKworY29uc3QgQzJIYW5kbGUgQzJIYW5kbGVJb246OmNIZWFkZXIgPSB7CisgICAgQzJIYW5kbGVJb246OnZlcnNpb24sCisgICAgQzJIYW5kbGVJb246Om51bUZkcywKKyAgICBDMkhhbmRsZUlvbjo6bnVtSW50cywKKyAgICB7fQorfTsKKworLy8gc3RhdGljCitib29sIEMySGFuZGxlSW9uOjppc1ZhbGlkKGNvbnN0IEMySGFuZGxlICogY29uc3QgbykgeworICAgIGlmICghbyB8fCBtZW1jbXAobywgJmNIZWFkZXIsIHNpemVvZihjSGVhZGVyKSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjb25zdCBDMkhhbmRsZUlvbiAqb3RoZXIgPSBzdGF0aWNfY2FzdDxjb25zdCBDMkhhbmRsZUlvbio+KG8pOworICAgIHJldHVybiBvdGhlci0+bUludHMubU1hZ2ljID09IGtNYWdpYzsKK30KKworLy8gVE9ETzogaXMgdGhlIGR1cCBvZiBhbiBpb24gZmQgaWRlbnRpY2FsIHRvIGlvbl9zaGFyZT8KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IElPTiBBTExPQ0FUSU9OID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCitjbGFzcyBDMkFsbG9jYXRpb25Jb24gOiBwdWJsaWMgQzJMaW5lYXJBbGxvY2F0aW9uIHsKK3B1YmxpYzoKKyAgICAvKiBJbnRlcmZhY2UgbWV0aG9kcyAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbWFwKAorICAgICAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsCisgICAgICAgIHZvaWQgKiphZGRyIC8qIG5vbm51bGwgKi8pIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgdW5tYXAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUsIEMyRmVuY2UgKmZlbmNlRmQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgfkMyQWxsb2NhdGlvbklvbigpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgaWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJm90aGVyKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vIGludGVybmFsIG1ldGhvZHMKKyAgICBDMkFsbG9jYXRpb25Jb24oaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduLCB1bnNpZ25lZCBoZWFwTWFzaywgdW5zaWduZWQgZmxhZ3MsIEMyQWxsb2NhdG9yOjppZF90IGlkKTsKKyAgICBDMkFsbG9jYXRpb25Jb24oaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgaW50IHNoYXJlRmQsIEMyQWxsb2NhdG9yOjppZF90IGlkKTsKKworICAgIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgICAgY2xhc3MgSW1wbDsKKyAgICBjbGFzcyBJbXBsVjI7CisgICAgSW1wbCAqbUltcGw7CisKKyAgICAvLyBUT0RPOiB3ZSBjb3VsZCBtYWtlIHRoaXMgZW5jYXBzdWxhdGUgc2hhcmVkX3B0ciBhbmQgY29waWFibGUKKyAgICBDMl9ET19OT1RfQ09QWShDMkFsbG9jYXRpb25Jb24pOworfTsKKworY2xhc3MgQzJBbGxvY2F0aW9uSW9uOjpJbXBsIHsKK3Byb3RlY3RlZDoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGlvbiBhbGxvY2F0aW9uLgorICAgICAqCisgICAgICogXG5vdGUgV2UgYWx3YXlzIGNyZWF0ZSBhbiBpb24gYWxsb2NhdGlvbiwgZXZlbiBpZiB0aGUgYWxsb2NhdGlvbiBvciBpbXBvcnQgZmFpbHMKKyAgICAgKiBzbyB0aGF0IHdlIGNhbiBjYXB0dXJlIHRoZSBlcnJvci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpb25GZCAgICAgaW9uIGNsaWVudCAob3duZXJzaGlwIHRyYW5zZmVycmVkIHRvIGNyZWF0ZWQgb2JqZWN0KQorICAgICAqIFxwYXJhbSBjYXBhY2l0eSAgc2l6ZSBvZiBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGJ1ZmZlckZkICBidWZmZXIgaGFuZGxlIChvd25lcnNoaXAgdHJhbnNmZXJyZWQgdG8gY3JlYXRlZCBvYmplY3QpLiBNdXN0IGJlCisgICAgICogICAgICAgICAgICAgICAgICBpbnZhbGlkIGlmIGVyciBpcyBub3QgMC4KKyAgICAgKiBccGFyYW0gYnVmZmVyICAgIGlvbiBidWZmZXIgdXNlciBoYW5kbGUgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkuIE11c3QgYmUKKyAgICAgKiAgICAgICAgICAgICAgICAgIGludmFsaWQgaWYgZXJyIGlzIG5vdCAwLgorICAgICAqIFxwYXJhbSBlcnIgICAgICAgZXJybm8gZHVyaW5nIGJ1ZmZlciBhbGxvY2F0aW9uIG9yIGltcG9ydAorICAgICAqLworICAgIEltcGwoaW50IGlvbkZkLCBzaXplX3QgY2FwYWNpdHksIGludCBidWZmZXJGZCwgaW9uX3VzZXJfaGFuZGxlX3QgYnVmZmVyLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCwgaW50IGVycikKKyAgICAgICAgOiBtSW9uRmQoaW9uRmQpLAorICAgICAgICAgIG1IYW5kbGUoYnVmZmVyRmQsIGNhcGFjaXR5KSwKKyAgICAgICAgICBtQnVmZmVyKGJ1ZmZlciksCisgICAgICAgICAgbUlkKGlkKSwKKyAgICAgICAgICBtSW5pdChjMl9tYXBfZXJybm88RU5PTUVNLCBFQUNDRVMsIEVJTlZBTD4oZXJyKSksCisgICAgICAgICAgbU1hcEZkKC0xKSB7CisgICAgICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICAgICAgLy8gY2xvc2UgaW9uRmQgbm93IG9uIGVycm9yCisgICAgICAgICAgICBpZiAobUlvbkZkID49IDApIHsKKyAgICAgICAgICAgICAgICBjbG9zZShtSW9uRmQpOworICAgICAgICAgICAgICAgIG1Jb25GZCA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQzJfQ0hFQ0soYnVmZmVyRmQgPCAwKTsKKyAgICAgICAgICAgIC8vIEMyX0NIRUNLKGJ1ZmZlciA8IDApOworICAgICAgICB9CisgICAgfQorCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBpb24gYWxsb2NhdGlvbiBieSBpbXBvcnRpbmcgYSBzaGFyZWQgYnVmZmVyIGZkLgorICAgICAqCisgICAgICogXHBhcmFtIGlvbkZkICAgICBpb24gY2xpZW50IChvd25lcnNoaXAgdHJhbnNmZXJyZWQgdG8gY3JlYXRlZCBvYmplY3QpCisgICAgICogXHBhcmFtIGNhcGFjaXR5ICBzaXplIG9mIGFsbG9jYXRpb24KKyAgICAgKiBccGFyYW0gYnVmZmVyRmQgIGJ1ZmZlciBoYW5kbGUgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkKKyAgICAgKgorICAgICAqIFxyZXR1cm4gY3JlYXRlZCBpb24gYWxsb2NhdGlvbiAoaW1wbGVtZW50YXRpb24pIHdoaWNoIG1heSBiZSBpbnZhbGlkIGlmIHRoZQorICAgICAqIGltcG9ydCBmYWlsZWQuCisgICAgICovCisgICAgc3RhdGljIEltcGwgKkltcG9ydChpbnQgaW9uRmQsIHNpemVfdCBjYXBhY2l0eSwgaW50IGJ1ZmZlckZkLCBDMkFsbG9jYXRvcjo6aWRfdCBpZCk7CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGlvbiBhbGxvY2F0aW9uIGJ5IGFsbG9jYXRpbmcgYW4gaW9uIGJ1ZmZlci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpb25GZCAgICAgaW9uIGNsaWVudCAob3duZXJzaGlwIHRyYW5zZmVycmVkIHRvIGNyZWF0ZWQgb2JqZWN0KQorICAgICAqIFxwYXJhbSBzaXplICAgICAgc2l6ZSBvZiBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGFsaWduICAgICBkZXNpcmVkIGFsaWdubWVudCBvZiBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGhlYXBNYXNrICBtYXNrIG9mIGhlYXBzIGNvbnNpZGVyZWQKKyAgICAgKiBccGFyYW0gZmxhZ3MgICAgIGlvbiBhbGxvY2F0aW9uIGZsYWdzCisgICAgICoKKyAgICAgKiBccmV0dXJuIGNyZWF0ZWQgaW9uIGFsbG9jYXRpb24gKGltcGxlbWVudGF0aW9uKSB3aGljaCBtYXkgYmUgaW52YWxpZCBpZiB0aGUKKyAgICAgKiBhbGxvY2F0aW9uIGZhaWxlZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgSW1wbCAqQWxsb2MoaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduLCB1bnNpZ25lZCBoZWFwTWFzaywgdW5zaWduZWQgZmxhZ3MsIEMyQWxsb2NhdG9yOjppZF90IGlkKTsKKworICAgIGMyX3N0YXR1c190IG1hcChzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsIHZvaWQgKiphZGRyKSB7CisgICAgICAgICh2b2lkKWZlbmNlOyAvLyBUT0RPOiB3YWl0IGZvciBmZW5jZQorICAgICAgICAqYWRkciA9IG51bGxwdHI7CisgICAgICAgIGlmICghbU1hcHBpbmdzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCJtdWx0aXBsZSBtYXAiKTsKKyAgICAgICAgICAgIC8vIFRPRE86IHRlY2huaWNhbGx5IHdlIHNob3VsZCByZXR1cm4gRFVQTElDQVRFIGhlcmUsIGJ1dCBvdXIgYmxvY2sgdmlld3MgZG9uJ3QKKyAgICAgICAgICAgIC8vIGFjdHVhbGx5IHVubWFwLCBzbyB3ZSBlbmQgdXAgcmVtYXBwaW5nIGFuIGlvbiBidWZmZXIgbXVsdGlwbGUgdGltZXMuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gcmV0dXJuIEMyX0RVUExJQ0FURTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaW50IHByb3QgPSBQUk9UX05PTkU7CisgICAgICAgIGludCBmbGFncyA9IE1BUF9TSEFSRUQ7CisgICAgICAgIGlmICh1c2FnZS5leHBlY3RlZCAmIEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFEKSB7CisgICAgICAgICAgICBwcm90IHw9IFBST1RfUkVBRDsKKyAgICAgICAgfQorICAgICAgICBpZiAodXNhZ2UuZXhwZWN0ZWQgJiBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUpIHsKKyAgICAgICAgICAgIHByb3QgfD0gUFJPVF9XUklURTsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBhbGlnbm1lbnRCeXRlcyA9IG9mZnNldCAlIFBBR0VfU0laRTsKKyAgICAgICAgc2l6ZV90IG1hcE9mZnNldCA9IG9mZnNldCAtIGFsaWdubWVudEJ5dGVzOworICAgICAgICBzaXplX3QgbWFwU2l6ZSA9IHNpemUgKyBhbGlnbm1lbnRCeXRlczsKKyAgICAgICAgTWFwcGluZyBtYXAgPSB7IG51bGxwdHIsIGFsaWdubWVudEJ5dGVzLCBtYXBTaXplIH07CisKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbWFwSW50ZXJuYWwobWFwU2l6ZSwgbWFwT2Zmc2V0LCBhbGlnbm1lbnRCeXRlcywgcHJvdCwgZmxhZ3MsICYobWFwLmFkZHIpLCBhZGRyKTsKKyAgICAgICAgaWYgKG1hcC5hZGRyKSB7CisgICAgICAgICAgICBtTWFwcGluZ3MucHVzaF9iYWNrKG1hcCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCB1bm1hcCh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSwgQzJGZW5jZSAqZmVuY2UpIHsKKyAgICAgICAgaWYgKG1NYXBwaW5ncy5lbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HRCgidHJpZWQgdG8gdW5tYXAgdW5tYXBwZWQgYnVmZmVyIik7CisgICAgICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1NYXBwaW5ncy5iZWdpbigpOyBpdCAhPSBtTWFwcGluZ3MuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgICAgIGlmIChhZGRyICE9ICh1aW50OF90ICopaXQtPmFkZHIgKyBpdC0+YWxpZ25tZW50Qnl0ZXMgfHwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZSArIGl0LT5hbGlnbm1lbnRCeXRlcyAhPSBpdC0+c2l6ZSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGVyciA9IG11bm1hcChpdC0+YWRkciwgaXQtPnNpemUpOworICAgICAgICAgICAgaWYgKGVyciAhPSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIm11bm1hcCBmYWlsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gYzJfbWFwX2Vycm5vPEVJTlZBTD4oZXJybm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGZlbmNlKSB7CisgICAgICAgICAgICAgICAgKmZlbmNlID0gQzJGZW5jZSgpOyAvLyBub3QgdXNpbmcgZmVuY2VzCisgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZCltTWFwcGluZ3MuZXJhc2UoaXQpOworICAgICAgICAgICAgQUxPR1YoInN1Y2Nlc3NmdWxseSB1bm1hcHBlZDogJWQiLCBtSGFuZGxlLmJ1ZmZlckZkKCkpOworICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICB9CisgICAgICAgIEFMT0dEKCJ1bm1hcCBmYWlsZWQgdG8gZmluZCBzcGVjaWZpZWQgbWFwIik7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgdmlydHVhbCB+SW1wbCgpIHsKKyAgICAgICAgaWYgKCFtTWFwcGluZ3MuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0QoIkRhbmdsaW5nIG1hcHBpbmdzISIpOworICAgICAgICAgICAgZm9yIChjb25zdCBNYXBwaW5nICZtYXAgOiBtTWFwcGluZ3MpIHsKKyAgICAgICAgICAgICAgICAodm9pZCltdW5tYXAobWFwLmFkZHIsIG1hcC5zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobU1hcEZkID49IDApIHsKKyAgICAgICAgICAgIGNsb3NlKG1NYXBGZCk7CisgICAgICAgICAgICBtTWFwRmQgPSAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAobUluaXQgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIGlmIChtQnVmZmVyID49IDApIHsKKyAgICAgICAgICAgICAgICAodm9pZClpb25fZnJlZShtSW9uRmQsIG1CdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9jbG9zZSgmbUhhbmRsZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Jb25GZCA+PSAwKSB7CisgICAgICAgICAgICBjbG9zZShtSW9uRmQpOworICAgICAgICB9CisgICAgfQorCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorCisgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICZtSGFuZGxlOworICAgIH0KKworICAgIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlkOworICAgIH0KKworICAgIHZpcnR1YWwgaW9uX3VzZXJfaGFuZGxlX3QgaW9uSGFuZGxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUJ1ZmZlcjsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IG1hcEludGVybmFsKHNpemVfdCBtYXBTaXplLCBzaXplX3QgbWFwT2Zmc2V0LCBzaXplX3QgYWxpZ25tZW50Qnl0ZXMsCisgICAgICAgICAgICBpbnQgcHJvdCwgaW50IGZsYWdzLCB2b2lkKiogYmFzZSwgdm9pZCoqIGFkZHIpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gQzJfT0s7CisgICAgICAgIGlmIChtTWFwRmQgPT0gLTEpIHsKKyAgICAgICAgICAgIGludCByZXQgPSBpb25fbWFwKG1Jb25GZCwgbUJ1ZmZlciwgbWFwU2l6ZSwgcHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBtYXBPZmZzZXQsICh1bnNpZ25lZCBjaGFyKiopYmFzZSwgJm1NYXBGZCk7CisgICAgICAgICAgICBBTE9HVigiaW9uX21hcChpb25GZCA9ICVkLCBoYW5kbGUgPSAlZCwgc2l6ZSA9ICV6dSwgcHJvdCA9ICVkLCBmbGFncyA9ICVkLCAiCisgICAgICAgICAgICAgICAgICAib2Zmc2V0ID0gJXp1KSByZXR1cm5lZCAoJWQpIiwKKyAgICAgICAgICAgICAgICAgIG1Jb25GZCwgbUJ1ZmZlciwgbWFwU2l6ZSwgcHJvdCwgZmxhZ3MsIG1hcE9mZnNldCwgcmV0KTsKKyAgICAgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgICAgICBtTWFwRmQgPSAtMTsKKyAgICAgICAgICAgICAgICAqYmFzZSA9ICphZGRyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBlcnIgPSBjMl9tYXBfZXJybm88RUlOVkFMPigtcmV0KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmFkZHIgPSAodWludDhfdCAqKSpiYXNlICsgYWxpZ25tZW50Qnl0ZXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqYmFzZSA9IG1tYXAobnVsbHB0ciwgbWFwU2l6ZSwgcHJvdCwgZmxhZ3MsIG1NYXBGZCwgbWFwT2Zmc2V0KTsKKyAgICAgICAgICAgIEFMT0dWKCJtbWFwKHNpemUgPSAlenUsIHByb3QgPSAlZCwgZmxhZ3MgPSAlZCwgbWFwRmQgPSAlZCwgb2Zmc2V0ID0gJXp1KSAiCisgICAgICAgICAgICAgICAgICAicmV0dXJuZWQgKCVkKSIsCisgICAgICAgICAgICAgICAgICBtYXBTaXplLCBwcm90LCBmbGFncywgbU1hcEZkLCBtYXBPZmZzZXQsIGVycm5vKTsKKyAgICAgICAgICAgIGlmICgqYmFzZSA9PSBNQVBfRkFJTEVEKSB7CisgICAgICAgICAgICAgICAgKmJhc2UgPSAqYWRkciA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgZXJyID0gYzJfbWFwX2Vycm5vPEVJTlZBTD4oZXJybm8pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAqYWRkciA9ICh1aW50OF90ICopKmJhc2UgKyBhbGlnbm1lbnRCeXRlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGludCBtSW9uRmQ7CisgICAgQzJIYW5kbGVJb24gbUhhbmRsZTsKKyAgICBpb25fdXNlcl9oYW5kbGVfdCBtQnVmZmVyOworICAgIEMyQWxsb2NhdG9yOjppZF90IG1JZDsKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICBpbnQgbU1hcEZkOyAvLyBvbmx5IG9uZSBmb3Igbm93CisgICAgc3RydWN0IE1hcHBpbmcgeworICAgICAgICB2b2lkICphZGRyOworICAgICAgICBzaXplX3QgYWxpZ25tZW50Qnl0ZXM7CisgICAgICAgIHNpemVfdCBzaXplOworICAgIH07CisgICAgc3RkOjpsaXN0PE1hcHBpbmc+IG1NYXBwaW5nczsKK307CisKK2NsYXNzIEMyQWxsb2NhdGlvbklvbjo6SW1wbFYyIDogcHVibGljIEMyQWxsb2NhdGlvbklvbjo6SW1wbCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBpb24gYWxsb2NhdGlvbiBmb3IgcGxhdGZvcm1zIHdpdGggbmV3IChpb25fNC4xMi5oKSBhcGkKKyAgICAgKgorICAgICAqIFxub3RlIFdlIGFsd2F5cyBjcmVhdGUgYW4gaW9uIGFsbG9jYXRpb24sIGV2ZW4gaWYgdGhlIGFsbG9jYXRpb24gb3IgaW1wb3J0IGZhaWxzCisgICAgICogc28gdGhhdCB3ZSBjYW4gY2FwdHVyZSB0aGUgZXJyb3IuCisgICAgICoKKyAgICAgKiBccGFyYW0gaW9uRmQgICAgIGlvbiBjbGllbnQgKG93bmVyc2hpcCB0cmFuc2ZlcnJlZCB0byBjcmVhdGVkIG9iamVjdCkKKyAgICAgKiBccGFyYW0gY2FwYWNpdHkgIHNpemUgb2YgYWxsb2NhdGlvbgorICAgICAqIFxwYXJhbSBidWZmZXJGZCAgYnVmZmVyIGhhbmRsZSAob3duZXJzaGlwIHRyYW5zZmVycmVkIHRvIGNyZWF0ZWQgb2JqZWN0KS4gTXVzdCBiZQorICAgICAqICAgICAgICAgICAgICAgICAgaW52YWxpZCBpZiBlcnIgaXMgbm90IDAuCisgICAgICogXHBhcmFtIGVyciAgICAgICBlcnJubyBkdXJpbmcgYnVmZmVyIGFsbG9jYXRpb24gb3IgaW1wb3J0CisgICAgICovCisgICAgSW1wbFYyKGludCBpb25GZCwgc2l6ZV90IGNhcGFjaXR5LCBpbnQgYnVmZmVyRmQsIEMyQWxsb2NhdG9yOjppZF90IGlkLCBpbnQgZXJyKQorICAgICAgICA6IEltcGwoaW9uRmQsIGNhcGFjaXR5LCBidWZmZXJGZCwgLTEgLypidWZmZXIqLywgaWQsIGVycikgeworICAgIH0KKworICAgIHZpcnR1YWwgfkltcGxWMigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgaW9uX3VzZXJfaGFuZGxlX3QgaW9uSGFuZGxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUhhbmRsZS5idWZmZXJGZCgpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbWFwSW50ZXJuYWwoc2l6ZV90IG1hcFNpemUsIHNpemVfdCBtYXBPZmZzZXQsIHNpemVfdCBhbGlnbm1lbnRCeXRlcywKKyAgICAgICAgICAgIGludCBwcm90LCBpbnQgZmxhZ3MsIHZvaWQqKiBiYXNlLCB2b2lkKiogYWRkcikgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBDMl9PSzsKKyAgICAgICAgKmJhc2UgPSBtbWFwKG51bGxwdHIsIG1hcFNpemUsIHByb3QsIGZsYWdzLCBtSGFuZGxlLmJ1ZmZlckZkKCksIG1hcE9mZnNldCk7CisgICAgICAgIEFMT0dWKCJtbWFwVjIoc2l6ZSA9ICV6dSwgcHJvdCA9ICVkLCBmbGFncyA9ICVkLCBtYXBGZCA9ICVkLCBvZmZzZXQgPSAlenUpICIKKyAgICAgICAgICAgICAgInJldHVybmVkICglZCkiLAorICAgICAgICAgICAgICBtYXBTaXplLCBwcm90LCBmbGFncywgbUhhbmRsZS5idWZmZXJGZCgpLCBtYXBPZmZzZXQsIGVycm5vKTsKKyAgICAgICAgaWYgKCpiYXNlID09IE1BUF9GQUlMRUQpIHsKKyAgICAgICAgICAgICpiYXNlID0gKmFkZHIgPSBudWxscHRyOworICAgICAgICAgICAgZXJyID0gYzJfbWFwX2Vycm5vPEVJTlZBTD4oZXJybm8pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKmFkZHIgPSAodWludDhfdCAqKSpiYXNlICsgYWxpZ25tZW50Qnl0ZXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKK307CisKK0MyQWxsb2NhdGlvbklvbjo6SW1wbCAqQzJBbGxvY2F0aW9uSW9uOjpJbXBsOjpJbXBvcnQoaW50IGlvbkZkLCBzaXplX3QgY2FwYWNpdHksIGludCBidWZmZXJGZCwKKyAgICAgICAgQzJBbGxvY2F0b3I6OmlkX3QgaWQpIHsKKyAgICBpbnQgcmV0ID0gMDsKKyAgICBpZiAoaW9uX2lzX2xlZ2FjeShpb25GZCkpIHsKKyAgICAgICAgaW9uX3VzZXJfaGFuZGxlX3QgYnVmZmVyID0gLTE7CisgICAgICAgIHJldCA9IGlvbl9pbXBvcnQoaW9uRmQsIGJ1ZmZlckZkLCAmYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIG5ldyBJbXBsKGlvbkZkLCBjYXBhY2l0eSwgYnVmZmVyRmQsIGJ1ZmZlciwgaWQsIHJldCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG5ldyBJbXBsVjIoaW9uRmQsIGNhcGFjaXR5LCBidWZmZXJGZCwgaWQsIHJldCk7CisgICAgfQorfQorCitDMkFsbG9jYXRpb25Jb246OkltcGwgKkMyQWxsb2NhdGlvbklvbjo6SW1wbDo6QWxsb2MoaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduLAorICAgICAgICB1bnNpZ25lZCBoZWFwTWFzaywgdW5zaWduZWQgZmxhZ3MsIEMyQWxsb2NhdG9yOjppZF90IGlkKSB7CisgICAgaW50IGJ1ZmZlckZkID0gLTE7CisgICAgaW9uX3VzZXJfaGFuZGxlX3QgYnVmZmVyID0gLTE7CisgICAgc2l6ZV90IGFsaWduZWRTaXplID0gYWxpZ24gPT0gMCA/IHNpemUgOiAoc2l6ZSArIGFsaWduIC0gMSkgJiB+KGFsaWduIC0gMSk7CisgICAgaW50IHJldDsKKworICAgIGlmIChpb25faXNfbGVnYWN5KGlvbkZkKSkgeworICAgICAgICByZXQgPSBpb25fYWxsb2MoaW9uRmQsIGFsaWduZWRTaXplLCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzLCAmYnVmZmVyKTsKKyAgICAgICAgQUxPR1YoImlvbl9hbGxvYyhpb25GZCA9ICVkLCBzaXplID0gJXp1LCBhbGlnbiA9ICV6dSwgcHJvdCA9ICVkLCBmbGFncyA9ICVkKSAiCisgICAgICAgICAgICAgICJyZXR1cm5lZCAoJWQpIDsgYnVmZmVyID0gJWQiLAorICAgICAgICAgICAgICBpb25GZCwgYWxpZ25lZFNpemUsIGFsaWduLCBoZWFwTWFzaywgZmxhZ3MsIHJldCwgYnVmZmVyKTsKKyAgICAgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgICAgICAvLyBnZXQgYnVmZmVyIGZkIGZvciBuYXRpdmUgaGFuZGxlIGNvbnN0cnVjdG9yCisgICAgICAgICAgICByZXQgPSBpb25fc2hhcmUoaW9uRmQsIGJ1ZmZlciwgJmJ1ZmZlckZkKTsKKyAgICAgICAgICAgIGlmIChyZXQgIT0gMCkgeworICAgICAgICAgICAgICAgIGlvbl9mcmVlKGlvbkZkLCBidWZmZXIpOworICAgICAgICAgICAgICAgIGJ1ZmZlciA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBuZXcgSW1wbChpb25GZCwgYWxpZ25lZFNpemUsIGJ1ZmZlckZkLCBidWZmZXIsIGlkLCByZXQpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0ID0gaW9uX2FsbG9jX2ZkKGlvbkZkLCBhbGlnbmVkU2l6ZSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgJmJ1ZmZlckZkKTsKKyAgICAgICAgQUxPR1YoImlvbl9hbGxvY19mZChpb25GZCA9ICVkLCBzaXplID0gJXp1LCBhbGlnbiA9ICV6dSwgcHJvdCA9ICVkLCBmbGFncyA9ICVkKSAiCisgICAgICAgICAgICAgICJyZXR1cm5lZCAoJWQpIDsgYnVmZmVyRmQgPSAlZCIsCisgICAgICAgICAgICAgIGlvbkZkLCBhbGlnbmVkU2l6ZSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgcmV0LCBidWZmZXJGZCk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBJbXBsVjIoaW9uRmQsIGFsaWduZWRTaXplLCBidWZmZXJGZCwgaWQsIHJldCk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRpb25Jb246Om1hcCgKKyAgICBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgQzJGZW5jZSAqZmVuY2UsIHZvaWQgKiphZGRyKSB7CisgICAgcmV0dXJuIG1JbXBsLT5tYXAob2Zmc2V0LCBzaXplLCB1c2FnZSwgZmVuY2UsIGFkZHIpOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRpb25Jb246OnVubWFwKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplLCBDMkZlbmNlICpmZW5jZSkgeworICAgIHJldHVybiBtSW1wbC0+dW5tYXAoYWRkciwgc2l6ZSwgZmVuY2UpOworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRpb25Jb246OnN0YXR1cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPnN0YXR1cygpOworfQorCitDMkFsbG9jYXRvcjo6aWRfdCBDMkFsbG9jYXRpb25Jb246OmdldEFsbG9jYXRvcklkKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0QWxsb2NhdG9ySWQoKTsKK30KKworYm9vbCBDMkFsbG9jYXRpb25Jb246OmVxdWFscyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAmb3RoZXIpIGNvbnN0IHsKKyAgICBpZiAoIW90aGVyIHx8IG90aGVyLT5nZXRBbGxvY2F0b3JJZCgpICE9IGdldEFsbG9jYXRvcklkKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBnZXQgdXNlciBoYW5kbGUgdG8gY29tcGFyZSBvYmplY3RzCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdGlvbklvbj4gb3RoZXJBc0lvbiA9IHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkFsbG9jYXRpb25Jb24+KG90aGVyKTsKKyAgICByZXR1cm4gbUltcGwtPmlvbkhhbmRsZSgpID09IG90aGVyQXNJb24tPm1JbXBsLT5pb25IYW5kbGUoKTsKK30KKworY29uc3QgQzJIYW5kbGUgKkMyQWxsb2NhdGlvbklvbjo6aGFuZGxlKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+aGFuZGxlKCk7Cit9CisKK0MyQWxsb2NhdGlvbklvbjo6fkMyQWxsb2NhdGlvbklvbigpIHsKKyAgICBkZWxldGUgbUltcGw7Cit9CisKK0MyQWxsb2NhdGlvbklvbjo6QzJBbGxvY2F0aW9uSW9uKGludCBpb25GZCwgc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGhlYXBNYXNrLCB1bnNpZ25lZCBmbGFncywgQzJBbGxvY2F0b3I6OmlkX3QgaWQpCisgICAgOiBDMkxpbmVhckFsbG9jYXRpb24oc2l6ZSksCisgICAgICBtSW1wbChJbXBsOjpBbGxvYyhpb25GZCwgc2l6ZSwgYWxpZ24sIGhlYXBNYXNrLCBmbGFncywgaWQpKSB7IH0KKworQzJBbGxvY2F0aW9uSW9uOjpDMkFsbG9jYXRpb25Jb24oaW50IGlvbkZkLCBzaXplX3Qgc2l6ZSwgaW50IHNoYXJlRmQsIEMyQWxsb2NhdG9yOjppZF90IGlkKQorICAgIDogQzJMaW5lYXJBbGxvY2F0aW9uKHNpemUpLAorICAgICAgbUltcGwoSW1wbDo6SW1wb3J0KGlvbkZkLCBzaXplLCBzaGFyZUZkLCBpZCkpIHsgfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSU9OIEFMTE9DQVRPUiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworQzJBbGxvY2F0b3JJb246OkMyQWxsb2NhdG9ySW9uKGlkX3QgaWQpCisgICAgOiBtSW5pdChDMl9PSyksCisgICAgICBtSW9uRmQoaW9uX29wZW4oKSkgeworICAgIGlmIChtSW9uRmQgPCAwKSB7CisgICAgICAgIHN3aXRjaCAoZXJybm8pIHsKKyAgICAgICAgY2FzZSBFTk9FTlQ6ICAgIG1Jbml0ID0gQzJfT01JVFRFRDsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICBtSW5pdCA9IGMyX21hcF9lcnJubzxFQUNDRVM+KGVycm5vKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBDMk1lbW9yeVVzYWdlIG1pblVzYWdlID0geyAwLCAwIH07CisgICAgICAgIEMyTWVtb3J5VXNhZ2UgbWF4VXNhZ2UgPSB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCBDMk1lbW9yeVVzYWdlOjpDUFVfV1JJVEUgfTsKKyAgICAgICAgVHJhaXRzIHRyYWl0cyA9IHsgImFuZHJvaWQuYWxsb2NhdG9yLmlvbiIsIGlkLCBMSU5FQVIsIG1pblVzYWdlLCBtYXhVc2FnZSB9OworICAgICAgICBtVHJhaXRzID0gc3RkOjptYWtlX3NoYXJlZDxUcmFpdHM+KHRyYWl0cyk7CisgICAgICAgIG1CbG9ja1NpemUgPSA6OmdldHBhZ2VzaXplKCk7CisgICAgfQorfQorCitDMkFsbG9jYXRvcklvbjo6fkMyQWxsb2NhdG9ySW9uKCkgeworICAgIGlmIChtSW5pdCA9PSBDMl9PSykgeworICAgICAgICBpb25fY2xvc2UobUlvbkZkKTsKKyAgICB9Cit9CisKK0MyQWxsb2NhdG9yOjppZF90IEMyQWxsb2NhdG9ySW9uOjpnZXRJZCgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICByZXR1cm4gbVRyYWl0cy0+aWQ7Cit9CisKK0MyU3RyaW5nIEMyQWxsb2NhdG9ySW9uOjpnZXROYW1lKCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Vc2FnZU1hcHBlckxvY2spOworICAgIHJldHVybiBtVHJhaXRzLT5uYW1lOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJBbGxvY2F0b3I6OlRyYWl0cz4gQzJBbGxvY2F0b3JJb246OmdldFRyYWl0cygpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICByZXR1cm4gbVRyYWl0czsKK30KKwordm9pZCBDMkFsbG9jYXRvcklvbjo6c2V0VXNhZ2VNYXBwZXIoCisgICAgICAgIGNvbnN0IFVzYWdlTWFwcGVyRm4gJm1hcHBlciwgdWludDY0X3QgbWluVXNhZ2UsIHVpbnQ2NF90IG1heFVzYWdlLCB1aW50NjRfdCBibG9ja1NpemUpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtVXNhZ2VNYXBwZXJMb2NrKTsKKyAgICBtVXNhZ2VNYXBwZXJDYWNoZS5jbGVhcigpOworICAgIG1Vc2FnZU1hcHBlckxydS5jbGVhcigpOworICAgIG1Vc2FnZU1hcHBlciA9IG1hcHBlcjsKKyAgICBUcmFpdHMgdHJhaXRzID0geworICAgICAgICBtVHJhaXRzLT5uYW1lLCBtVHJhaXRzLT5pZCwgTElORUFSLAorICAgICAgICBDMk1lbW9yeVVzYWdlKG1pblVzYWdlKSwgQzJNZW1vcnlVc2FnZShtYXhVc2FnZSkKKyAgICB9OworICAgIG1UcmFpdHMgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRyYWl0cz4odHJhaXRzKTsKKyAgICBtQmxvY2tTaXplID0gYmxvY2tTaXplOworfQorCitzdGQ6OnNpemVfdCBDMkFsbG9jYXRvcklvbjo6TWFwcGVyS2V5SGFzaDo6b3BlcmF0b3IoKShjb25zdCBNYXBwZXJLZXkgJmspIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpoYXNoPHVpbnQ2NF90Pnt9KGsuZmlyc3QpIF4gc3RkOjpoYXNoPHNpemVfdD57fShrLnNlY29uZCk7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9ySW9uOjptYXBVc2FnZSgKKyAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwgc2l6ZV90IGNhcGFjaXR5LCBzaXplX3QgKmFsaWduLCB1bnNpZ25lZCAqaGVhcE1hc2ssIHVuc2lnbmVkICpmbGFncykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Vc2FnZU1hcHBlckxvY2spOworICAgIGMyX3N0YXR1c190IHJlcyA9IEMyX09LOworICAgIC8vIGFsaWduIGNhcGFjaXR5CisgICAgY2FwYWNpdHkgPSAoY2FwYWNpdHkgKyBtQmxvY2tTaXplIC0gMSkgJiB+KG1CbG9ja1NpemUgLSAxKTsKKyAgICBNYXBwZXJLZXkga2V5ID0gc3RkOjptYWtlX3BhaXIodXNhZ2UuZXhwZWN0ZWQsIGNhcGFjaXR5KTsKKyAgICBhdXRvIGVudHJ5ID0gbVVzYWdlTWFwcGVyQ2FjaGUuZmluZChrZXkpOworICAgIGlmIChlbnRyeSA9PSBtVXNhZ2VNYXBwZXJDYWNoZS5lbmQoKSkgeworICAgICAgICBpZiAobVVzYWdlTWFwcGVyKSB7CisgICAgICAgICAgICByZXMgPSBtVXNhZ2VNYXBwZXIodXNhZ2UsIGNhcGFjaXR5LCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICphbGlnbiA9IDA7IC8vIFRPRE8gbWFrZSB0aGlzIDEKKyAgICAgICAgICAgICpoZWFwTWFzayA9IH4wOyAvLyBkZWZhdWx0IG1hc2sKKyAgICAgICAgICAgIGlmICh1c2FnZS5leHBlY3RlZCAmIChDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCB8IEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSkpIHsKKyAgICAgICAgICAgICAgICAqZmxhZ3MgPSBJT05fRkxBR19DQUNIRUQ7IC8vIGNhY2hlIENQVSBhY2Nlc3NlZCBidWZmZXJzCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICpmbGFncyA9IDA7ICAvLyBkZWZhdWx0IGZsYWdzCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBDMl9OT19JTklUOworICAgICAgICB9CisgICAgICAgIC8vIGFkZCB1c2FnZSB0byBjYWNoZQorICAgICAgICBNYXBwZXJWYWx1ZSB2YWx1ZSA9IHN0ZDo6bWFrZV90dXBsZSgqYWxpZ24sICpoZWFwTWFzaywgKmZsYWdzLCByZXMpOworICAgICAgICBtVXNhZ2VNYXBwZXJMcnUuZW1wbGFjZV9mcm9udChrZXksIHZhbHVlKTsKKyAgICAgICAgbVVzYWdlTWFwcGVyQ2FjaGUuZW1wbGFjZShzdGQ6Om1ha2VfcGFpcihrZXksIG1Vc2FnZU1hcHBlckxydS5iZWdpbigpKSk7CisgICAgICAgIGlmIChtVXNhZ2VNYXBwZXJDYWNoZS5zaXplKCkgPiBVU0FHRV9MUlVfQ0FDSEVfU0laRSkgeworICAgICAgICAgICAgLy8gcmVtb3ZlIExSVSBlbnRyeQorICAgICAgICAgICAgTWFwcGVyS2V5IGxydUtleSA9IG1Vc2FnZU1hcHBlckxydS5mcm9udCgpLmZpcnN0OworICAgICAgICAgICAgbVVzYWdlTWFwcGVyQ2FjaGUuZXJhc2UobHJ1S2V5KTsKKyAgICAgICAgICAgIG1Vc2FnZU1hcHBlckxydS5wb3BfYmFjaygpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gbW92ZSBlbnRyeSB0byBNUlUKKyAgICAgICAgbVVzYWdlTWFwcGVyTHJ1LnNwbGljZShtVXNhZ2VNYXBwZXJMcnUuYmVnaW4oKSwgbVVzYWdlTWFwcGVyTHJ1LCBlbnRyeS0+c2Vjb25kKTsKKyAgICAgICAgY29uc3QgTWFwcGVyVmFsdWUgJnZhbHVlID0gZW50cnktPnNlY29uZC0+c2Vjb25kOworICAgICAgICBzdGQ6OnRpZSgqYWxpZ24sICpoZWFwTWFzaywgKmZsYWdzLCByZXMpID0gdmFsdWU7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK2MyX3N0YXR1c190IEMyQWxsb2NhdG9ySW9uOjpuZXdMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIHsKKyAgICBpZiAoYWxsb2NhdGlvbiA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgfQorCisgICAgYWxsb2NhdGlvbi0+cmVzZXQoKTsKKyAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKworICAgIHNpemVfdCBhbGlnbiA9IDA7CisgICAgdW5zaWduZWQgaGVhcE1hc2sgPSB+MDsKKyAgICB1bnNpZ25lZCBmbGFncyA9IDA7CisgICAgYzJfc3RhdHVzX3QgcmV0ID0gbWFwVXNhZ2UodXNhZ2UsIGNhcGFjaXR5LCAmYWxpZ24sICZoZWFwTWFzaywgJmZsYWdzKTsKKyAgICBpZiAocmV0ICYmIHJldCAhPSBDMl9OT19JTklUKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdGlvbklvbj4gYWxsb2MKKyAgICAgICAgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdGlvbklvbj4oZHVwKG1Jb25GZCksIGNhcGFjaXR5LCBhbGlnbiwgaGVhcE1hc2ssIGZsYWdzLCBnZXRJZCgpKTsKKyAgICByZXQgPSBhbGxvYy0+c3RhdHVzKCk7CisgICAgaWYgKHJldCA9PSBDMl9PSykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IGFsbG9jOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitjMl9zdGF0dXNfdCBDMkFsbG9jYXRvcklvbjo6cHJpb3JMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLCBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgeworICAgICphbGxvY2F0aW9uID0gbnVsbHB0cjsKKyAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKworICAgIGlmICghQzJIYW5kbGVJb246OmlzVmFsaWQoaGFuZGxlKSkgeworICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFRPRE86IGdldCBjYXBhY2l0eSBhbmQgdmFsaWRhdGUgaXQKKyAgICBjb25zdCBDMkhhbmRsZUlvbiAqaCA9IHN0YXRpY19jYXN0PGNvbnN0IEMySGFuZGxlSW9uKj4oaGFuZGxlKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0aW9uSW9uPiBhbGxvYworICAgICAgICA9IHN0ZDo6bWFrZV9zaGFyZWQ8QzJBbGxvY2F0aW9uSW9uPihkdXAobUlvbkZkKSwgaC0+c2l6ZSgpLCBoLT5idWZmZXJGZCgpLCBnZXRJZCgpKTsKKyAgICBjMl9zdGF0dXNfdCByZXQgPSBhbGxvYy0+c3RhdHVzKCk7CisgICAgaWYgKHJldCA9PSBDMl9PSykgeworICAgICAgICAqYWxsb2NhdGlvbiA9IGFsbG9jOworICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgbmF0aXZlX2hhbmRsZV90Kj4oaGFuZGxlKSkpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitib29sIEMyQWxsb2NhdG9ySW9uOjppc1ZhbGlkKGNvbnN0IEMySGFuZGxlKiBjb25zdCBvKSB7CisgICAgcmV0dXJuIEMySGFuZGxlSW9uOjppc1ZhbGlkKG8pOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQnVmZmVyLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQnVmZmVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDk5YjUzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJCdWZmZXIuY3BwCkBAIC0wLDAgKzEsMTI5MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJCdWZmZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJCbG9ja0ludGVybmFsLmg+CisjaW5jbHVkZSA8YnVmZmVycG9vbC9DbGllbnRNYW5hZ2VyLmg+CisKK25hbWVzcGFjZSB7CisKK3VzaW5nIGFuZHJvaWQ6OkMyQWxsb2NhdG9yR3JhbGxvYzsKK3VzaW5nIGFuZHJvaWQ6OkMyQWxsb2NhdG9ySW9uOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YTsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6UmVzdWx0U3RhdHVzOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6QnVmZmVyUG9vbEFsbG9jYXRpb247Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OmltcGxlbWVudGF0aW9uOjpCdWZmZXJQb29sQWxsb2NhdG9yOwordXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6Q2xpZW50TWFuYWdlcjsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OkNvbm5lY3Rpb25JZDsKK3VzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6VjJfMDo6aW1wbGVtZW50YXRpb246OklOVkFMSURfQ09OTkVDVElPTklEOworCisvLyBUaGlzIGFub255bW91cyBuYW1lc3BhY2UgY29udGFpbnMgdGhlIGhlbHBlciBjbGFzc2VzIHRoYXQgYWxsb3cgb3VyIGltcGxlbWVudGF0aW9uIHRvIGNyZWF0ZQorLy8gYmxvY2svYnVmZmVyIG9iamVjdHMuCisvLworLy8gSW5oZXJpdCBmcm9tIHRoZSBwYXJlbnQsIHNoYXJlIHdpdGggdGhlIGZyaWVuZC4KK2NsYXNzIFJlYWRWaWV3QnVkZHkgOiBwdWJsaWMgQzJSZWFkVmlldyB7CisgICAgdXNpbmcgQzJSZWFkVmlldzo6QzJSZWFkVmlldzsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkNvbnN0TGluZWFyQmxvY2s7Cit9OworCitjbGFzcyBXcml0ZVZpZXdCdWRkeSA6IHB1YmxpYyBDMldyaXRlVmlldyB7CisgICAgdXNpbmcgQzJXcml0ZVZpZXc6OkMyV3JpdGVWaWV3OworICAgIGZyaWVuZCBjbGFzcyA6OkMyTGluZWFyQmxvY2s7Cit9OworCitjbGFzcyBDb25zdExpbmVhckJsb2NrQnVkZHkgOiBwdWJsaWMgQzJDb25zdExpbmVhckJsb2NrIHsKKyAgICB1c2luZyBDMkNvbnN0TGluZWFyQmxvY2s6OkMyQ29uc3RMaW5lYXJCbG9jazsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkxpbmVhckJsb2NrOworfTsKKworY2xhc3MgTGluZWFyQmxvY2tCdWRkeSA6IHB1YmxpYyBDMkxpbmVhckJsb2NrIHsKKyAgICB1c2luZyBDMkxpbmVhckJsb2NrOjpDMkxpbmVhckJsb2NrOworICAgIGZyaWVuZCBjbGFzcyA6OkMyQmFzaWNMaW5lYXJCbG9ja1Bvb2w7Cit9OworCitjbGFzcyBBY3F1aXJhYmxlUmVhZFZpZXdCdWRkeSA6IHB1YmxpYyBDMkFjcXVpcmFibGU8QzJSZWFkVmlldz4geworICAgIHVzaW5nIEMyQWNxdWlyYWJsZTo6QzJBY3F1aXJhYmxlOworICAgIGZyaWVuZCBjbGFzcyA6OkMyQ29uc3RMaW5lYXJCbG9jazsKK307CisKK2NsYXNzIEFjcXVpcmFibGVXcml0ZVZpZXdCdWRkeSA6IHB1YmxpYyBDMkFjcXVpcmFibGU8QzJXcml0ZVZpZXc+IHsKKyAgICB1c2luZyBDMkFjcXVpcmFibGU6OkMyQWNxdWlyYWJsZTsKKyAgICBmcmllbmQgY2xhc3MgOjpDMkxpbmVhckJsb2NrOworfTsKKworY2xhc3MgR3JhcGhpY1ZpZXdCdWRkeSA6IHB1YmxpYyBDMkdyYXBoaWNWaWV3IHsKKyAgICB1c2luZyBDMkdyYXBoaWNWaWV3OjpDMkdyYXBoaWNWaWV3OworICAgIGZyaWVuZCBjbGFzcyA6OkMyQ29uc3RHcmFwaGljQmxvY2s7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJHcmFwaGljQmxvY2s7Cit9OworCitjbGFzcyBBY3F1aXJhYmxlQ29uc3RHcmFwaGljVmlld0J1ZGR5IDogcHVibGljIEMyQWNxdWlyYWJsZTxjb25zdCBDMkdyYXBoaWNWaWV3PiB7CisgICAgdXNpbmcgQzJBY3F1aXJhYmxlOjpDMkFjcXVpcmFibGU7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJDb25zdEdyYXBoaWNCbG9jazsKK307CisKK2NsYXNzIEFjcXVpcmFibGVHcmFwaGljVmlld0J1ZGR5IDogcHVibGljIEMyQWNxdWlyYWJsZTxDMkdyYXBoaWNWaWV3PiB7CisgICAgdXNpbmcgQzJBY3F1aXJhYmxlOjpDMkFjcXVpcmFibGU7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJHcmFwaGljQmxvY2s7Cit9OworCitjbGFzcyBDb25zdEdyYXBoaWNCbG9ja0J1ZGR5IDogcHVibGljIEMyQ29uc3RHcmFwaGljQmxvY2sgeworICAgIHVzaW5nIEMyQ29uc3RHcmFwaGljQmxvY2s6OkMyQ29uc3RHcmFwaGljQmxvY2s7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJHcmFwaGljQmxvY2s7Cit9OworCitjbGFzcyBHcmFwaGljQmxvY2tCdWRkeSA6IHB1YmxpYyBDMkdyYXBoaWNCbG9jayB7CisgICAgdXNpbmcgQzJHcmFwaGljQmxvY2s6OkMyR3JhcGhpY0Jsb2NrOworICAgIGZyaWVuZCBjbGFzcyA6OkMyQmFzaWNHcmFwaGljQmxvY2tQb29sOworfTsKKworY2xhc3MgQnVmZmVyRGF0YUJ1ZGR5IDogcHVibGljIEMyQnVmZmVyRGF0YSB7CisgICAgdXNpbmcgQzJCdWZmZXJEYXRhOjpDMkJ1ZmZlckRhdGE7CisgICAgZnJpZW5kIGNsYXNzIDo6QzJCdWZmZXI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IDFEIEJMT0NLID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogVGhpcyBjbGFzcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgYWxsIDFEIGJsb2NrIGFuZCB2aWV3IGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiBUaGlzIGlzIGJhc2ljYWxseSBqdXN0IGEgcGxhY2Vob2xkZXIgZm9yIHRoZSB1bmRlcmx5aW5nIDFEIGFsbG9jYXRpb24gYW5kIHRoZSByYW5nZSBvZiB0aGUKKyAqIGFsbG90ZWQgcG9ydGlvbiB0byB0aGlzIGJsb2NrLiBUaGVyZSBpcyBhbHNvIGEgcGxhY2Vob2xkZXIgZm9yIGEgYmxvY2twb29sIGRhdGEuCisgKi8KK2NsYXNzIEMyX0hJREUgX0MyQmxvY2sxREltcGwgOiBwdWJsaWMgX0MyTGluZWFyUmFuZ2VBc3BlY3QgeworcHVibGljOgorICAgIF9DMkJsb2NrMURJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiAmcG9vbERhdGEgPSBudWxscHRyLAorICAgICAgICAgICAgc2l6ZV90IG9mZnNldCA9IDAsIHNpemVfdCBzaXplID0gfihzaXplX3QpMCkKKyAgICAgICAgOiBfQzJMaW5lYXJSYW5nZUFzcGVjdChhbGxvYy5nZXQoKSwgb2Zmc2V0LCBzaXplKSwKKyAgICAgICAgICBtQWxsb2NhdGlvbihhbGxvYyksCisgICAgICAgICAgbVBvb2xEYXRhKHBvb2xEYXRhKSB7IH0KKworICAgIF9DMkJsb2NrMURJbXBsKGNvbnN0IF9DMkJsb2NrMURJbXBsICZvdGhlciwgc2l6ZV90IG9mZnNldCA9IDAsIHNpemVfdCBzaXplID0gfihzaXplX3QpMCkKKyAgICAgICAgOiBfQzJMaW5lYXJSYW5nZUFzcGVjdCgmb3RoZXIsIG9mZnNldCwgc2l6ZSksCisgICAgICAgICAgbUFsbG9jYXRpb24ob3RoZXIubUFsbG9jYXRpb24pLAorICAgICAgICAgIG1Qb29sRGF0YShvdGhlci5tUG9vbERhdGEpIHsgfQorCisgICAgLyoqIHJldHVybnMgcG9vbCBkYXRhICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Qb29sRGF0YTsKKyAgICB9CisKKyAgICAvKiogcmV0dXJucyBuYXRpdmUgaGFuZGxlICovCisgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uID8gbUFsbG9jYXRpb24tPmhhbmRsZSgpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICAvKiogcmV0dXJucyB0aGUgYWxsb2NhdG9yJ3MgSUQgKi8KKyAgICBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IHsKKyAgICAgICAgLy8gQkFEX0lEIGNhbiBvbmx5IGhhcHBlbiBpZiB0aGlzIEltcGwgY2xhc3MgaXMgaW5pdGlhbGl6ZWQgZm9yIGEgdmlldyAtIG5ldmVyIGZvciBhIGJsb2NrLgorICAgICAgICByZXR1cm4gbUFsbG9jYXRpb24gPyBtQWxsb2NhdGlvbi0+Z2V0QWxsb2NhdG9ySWQoKSA6IEMyQWxsb2NhdG9yOjpCQURfSUQ7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gZ2V0QWxsb2NhdGlvbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gbVBvb2xEYXRhOworfTsKKworLyoqCisgKiBUaGlzIGNsYXNzIGNvbnRhaW5zIHRoZSBtYXBwZWQgZGF0YSBwb2ludGVyLCBhbmQgdGhlIHBvdGVudGlhbCBlcnJvci4KKyAqCisgKiByYW5nZSBpcyB0aGUgbWFwcGVkIHJhbmdlIG9mIHRoZSB1bmRlcmx5aW5nIGFsbG9jYXRpb24gKHdoaWNoIGlzIHBhcnQgb2YgdGhlIGFsbG90dGVkCisgKiByYW5nZSkuCisgKi8KK2NsYXNzIEMyX0hJREUgX0MyTWFwcGVkQmxvY2sxREltcGwgOiBwdWJsaWMgX0MyQmxvY2sxREltcGwgeworcHVibGljOgorICAgIF9DMk1hcHBlZEJsb2NrMURJbXBsKGNvbnN0IF9DMkJsb2NrMURJbXBsICZibG9jaywgdWludDhfdCAqZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMCwgc2l6ZV90IHNpemUgPSB+KHNpemVfdCkwKQorICAgICAgICA6IF9DMkJsb2NrMURJbXBsKGJsb2NrLCBvZmZzZXQsIHNpemUpLCBtRGF0YShkYXRhKSwgbUVycm9yKEMyX09LKSB7IH0KKworICAgIF9DMk1hcHBlZEJsb2NrMURJbXBsKGMyX3N0YXR1c190IGVycm9yKQorICAgICAgICA6IF9DMkJsb2NrMURJbXBsKG51bGxwdHIpLCBtRGF0YShudWxscHRyKSwgbUVycm9yKGVycm9yKSB7CisgICAgICAgIC8vIENIRUNLKGVycm9yICE9IEMyX09LKTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpkYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURhdGE7CisgICAgfQorCisgICAgdWludDhfdCAqZGF0YSgpIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KKworICAgIGMyX3N0YXR1c190IGVycm9yKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUVycm9yOworICAgIH0KKworcHJpdmF0ZToKKyAgICB1aW50OF90ICptRGF0YTsKKyAgICBjMl9zdGF0dXNfdCBtRXJyb3I7Cit9OworCisvKioKKyAqIEJsb2NrIGltcGxlbWVudGF0aW9uLgorICovCitjbGFzcyBDMkJsb2NrMUQ6OkltcGwgOiBwdWJsaWMgX0MyQmxvY2sxREltcGwgeworICAgIHVzaW5nIF9DMkJsb2NrMURJbXBsOjpfQzJCbG9jazFESW1wbDsKK307CisKK2NvbnN0IEMySGFuZGxlICpDMkJsb2NrMUQ6OmhhbmRsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmhhbmRsZSgpOworfTsKKworQzJBbGxvY2F0b3I6OmlkX3QgQzJCbG9jazFEOjpnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldEFsbG9jYXRvcklkKCk7Cit9OworCitDMkJsb2NrMUQ6OkMyQmxvY2sxRChzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCwgY29uc3QgX0MyTGluZWFyUmFuZ2VBc3BlY3QgJnJhbmdlKQorICAgIC8vIGFsd2F5cyBjbGFtcCBzdWJyYW5nZSB0byBwYXJlbnQgKGltcGwpIHJhbmdlIGZvciBzYWZldHkKKyAgICA6IF9DMkxpbmVhclJhbmdlQXNwZWN0KGltcGwuZ2V0KCksIHJhbmdlLm9mZnNldCgpLCByYW5nZS5zaXplKCkpLCBtSW1wbChpbXBsKSB7Cit9CisKKy8qKgorICogUmVhZCB2aWV3IGltcGxlbWVudGF0aW9uLgorICoKKyAqIHJhbmdlIG9mIEltcGwgaXMgdGhlIG1hcHBlZCByYW5nZSBvZiB0aGUgdW5kZXJseWluZyBhbGxvY2F0aW9uICh3aGljaCBpcyBwYXJ0IG9mIHRoZSBhbGxvdHRlZAorICogcmFuZ2UpLiByYW5nZSBvZiBWaWV3IGlzIDAgdG8gY2FwYWNpdHkoKSAobm90IHJlcHJlc2VudGVkIGFzIGFuIGFjdHVhbCByYW5nZSkuIFRoaXMgbWFwcyB0byBhCisgKiBzdWJyYW5nZSBvZiBJbXBsIHJhbmdlIHN0YXJ0aW5nIGF0IG1JbXBsLT5vZmZzZXQoKSArIF9tT2Zmc2V0LgorICovCitjbGFzcyBDMlJlYWRWaWV3OjpJbXBsIDogcHVibGljIF9DMk1hcHBlZEJsb2NrMURJbXBsIHsKKyAgICB1c2luZyBfQzJNYXBwZWRCbG9jazFESW1wbDo6X0MyTWFwcGVkQmxvY2sxREltcGw7Cit9OworCitDMlJlYWRWaWV3OjpDMlJlYWRWaWV3KHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCB1aW50MzJfdCBvZmZzZXQsIHVpbnQzMl90IHNpemUpCisgICAgOiBfQzJMaW5lYXJDYXBhY2l0eUFzcGVjdChDMkxpbmVhckNhcGFjaXR5KGltcGwtPnNpemUoKSkucmFuZ2Uob2Zmc2V0LCBzaXplKS5zaXplKCkpLAorICAgICAgbUltcGwoaW1wbCksCisgICAgICBtT2Zmc2V0KEMyTGluZWFyQ2FwYWNpdHkoaW1wbC0+c2l6ZSgpKS5yYW5nZShvZmZzZXQsIHNpemUpLm9mZnNldCgpKSB7IH0KKworQzJSZWFkVmlldzo6QzJSZWFkVmlldyhjMl9zdGF0dXNfdCBlcnJvcikKKyAgICA6IF9DMkxpbmVhckNhcGFjaXR5QXNwZWN0KDB1KSwgbUltcGwoc3RkOjptYWtlX3NoYXJlZDxJbXBsPihlcnJvcikpLCBtT2Zmc2V0KDB1KSB7CisgICAgLy8gQ0hFQ0soZXJyb3IgIT0gQzJfT0spOworfQorCitjb25zdCB1aW50OF90ICpDMlJlYWRWaWV3OjpkYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+ZXJyb3IoKSA/IG51bGxwdHIgOiBtSW1wbC0+ZGF0YSgpICsgbU9mZnNldDsKK30KKworYzJfc3RhdHVzX3QgQzJSZWFkVmlldzo6ZXJyb3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5lcnJvcigpOworfQorCitDMlJlYWRWaWV3IEMyUmVhZFZpZXc6OnN1YlZpZXcoc2l6ZV90IG9mZnNldCwgc2l6ZV90IHNpemUpIGNvbnN0IHsKKyAgICBDMkxpbmVhclJhbmdlIHN1YlJhbmdlKCp0aGlzLCBvZmZzZXQsIHNpemUpOworICAgIHJldHVybiBDMlJlYWRWaWV3KG1JbXBsLCBtT2Zmc2V0ICsgc3ViUmFuZ2Uub2Zmc2V0KCksIHN1YlJhbmdlLnNpemUoKSk7Cit9CisKKy8qKgorICogV3JpdGUgdmlldyBpbXBsZW1lbnRhdGlvbi4KKyAqLworY2xhc3MgQzJXcml0ZVZpZXc6OkltcGwgOiBwdWJsaWMgX0MyTWFwcGVkQmxvY2sxREltcGwgeworICAgIHVzaW5nIF9DMk1hcHBlZEJsb2NrMURJbXBsOjpfQzJNYXBwZWRCbG9jazFESW1wbDsKK307CisKK0MyV3JpdGVWaWV3OjpDMldyaXRlVmlldyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCkKKy8vIFVHTFk6IF9DMkxpbmVhclJhbmdlQXNwZWN0IHJlcXVpcmVzIGEgYm9uYS1maWRlIG9iamVjdCBmb3IgY2FwYWNpdHkgdG8gcHJldmVudCBzcG9vZmluZywgc28KKy8vIHRoaXMgaXMgd2hhdCB3ZSBoYXZlIHRvIGRvLgorLy8gVE9ETzogdXNlIGNoaWxkUmFuZ2UKKyAgICA6IF9DMkVkaXRhYmxlTGluZWFyUmFuZ2VBc3BlY3Qoc3RkOjptYWtlX3VuaXF1ZTxDMkxpbmVhckNhcGFjaXR5PihpbXBsLT5zaXplKCkpLmdldCgpKSwgbUltcGwoaW1wbCkgeyB9CisKK0MyV3JpdGVWaWV3OjpDMldyaXRlVmlldyhjMl9zdGF0dXNfdCBlcnJvcikKKyAgICA6IF9DMkVkaXRhYmxlTGluZWFyUmFuZ2VBc3BlY3QobnVsbHB0ciksIG1JbXBsKHN0ZDo6bWFrZV9zaGFyZWQ8SW1wbD4oZXJyb3IpKSB7fQorCit1aW50OF90ICpDMldyaXRlVmlldzo6YmFzZSgpIHsgcmV0dXJuIG1JbXBsLT5kYXRhKCk7IH0KKwordWludDhfdCAqQzJXcml0ZVZpZXc6OmRhdGEoKSB7IHJldHVybiBtSW1wbC0+ZGF0YSgpICsgb2Zmc2V0KCk7IH0KKworYzJfc3RhdHVzX3QgQzJXcml0ZVZpZXc6OmVycm9yKCkgY29uc3QgeyByZXR1cm4gbUltcGwtPmVycm9yKCk7IH0KKworLyoqCisgKiBDb25zdCBsaW5lYXIgYmxvY2sgaW1wbGVtZW50YXRpb24uCisgKi8KK0MyQ29uc3RMaW5lYXJCbG9jazo6QzJDb25zdExpbmVhckJsb2NrKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJMaW5lYXJSYW5nZUFzcGVjdCAmcmFuZ2UsIEMyRmVuY2UgZmVuY2UpCisgICAgOiBDMkJsb2NrMUQoaW1wbCwgcmFuZ2UpLCBtRmVuY2UoZmVuY2UpIHsgfQorCitDMkFjcXVpcmFibGU8QzJSZWFkVmlldz4gQzJDb25zdExpbmVhckJsb2NrOjptYXAoKSBjb25zdCB7CisgICAgdm9pZCAqYmFzZSA9IG51bGxwdHI7CisgICAgdWludDMyX3QgbGVuID0gc2l6ZSgpOworICAgIGMyX3N0YXR1c190IGVycm9yID0gbUltcGwtPmdldEFsbG9jYXRpb24oKS0+bWFwKAorICAgICAgICAgICAgb2Zmc2V0KCksIGxlbiwgeyBDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgMCB9LCBudWxscHRyLCAmYmFzZSk7CisgICAgLy8gVE9ETzogd2FpdCBvbiBmZW5jZQorICAgIGlmIChlcnJvciA9PSBDMl9PSykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVhZFZpZXdCdWRkeTo6SW1wbD4gcnZpID0gc3RkOjpzaGFyZWRfcHRyPFJlYWRWaWV3QnVkZHk6OkltcGw+KAorICAgICAgICAgICAgICAgIG5ldyBSZWFkVmlld0J1ZGR5OjpJbXBsKCptSW1wbCwgKHVpbnQ4X3QgKiliYXNlLCBvZmZzZXQoKSwgbGVuKSwKKyAgICAgICAgICAgICAgICBbYmFzZSwgbGVuXShSZWFkVmlld0J1ZGR5OjpJbXBsICppKSB7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKWktPmdldEFsbG9jYXRpb24oKS0+dW5tYXAoYmFzZSwgbGVuLCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gQWNxdWlyYWJsZVJlYWRWaWV3QnVkZHkoZXJyb3IsIEMyRmVuY2UoKSwgUmVhZFZpZXdCdWRkeShydmksIDAsIGxlbikpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBY3F1aXJhYmxlUmVhZFZpZXdCdWRkeShlcnJvciwgQzJGZW5jZSgpLCBSZWFkVmlld0J1ZGR5KGVycm9yKSk7CisgICAgfQorfQorCitDMkNvbnN0TGluZWFyQmxvY2sgQzJDb25zdExpbmVhckJsb2NrOjpzdWJCbG9jayhzaXplX3Qgb2Zmc2V0Xywgc2l6ZV90IHNpemVfKSBjb25zdCB7CisgICAgQzJMaW5lYXJSYW5nZSBzdWJSYW5nZSgqbUltcGwsIG9mZnNldF8sIHNpemVfKTsKKyAgICByZXR1cm4gQzJDb25zdExpbmVhckJsb2NrKG1JbXBsLCBzdWJSYW5nZSwgbUZlbmNlKTsKK30KKworLyoqCisgKiBMaW5lYXIgYmxvY2sgaW1wbGVtZW50YXRpb24uCisgKi8KK0MyTGluZWFyQmxvY2s6OkMyTGluZWFyQmxvY2soc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMkxpbmVhclJhbmdlQXNwZWN0ICZyYW5nZSkKKyAgICA6IEMyQmxvY2sxRChpbXBsLCByYW5nZSkgeyB9CisKK0MyQWNxdWlyYWJsZTxDMldyaXRlVmlldz4gQzJMaW5lYXJCbG9jazo6bWFwKCkgeworICAgIHZvaWQgKmJhc2UgPSBudWxscHRyOworICAgIHVpbnQzMl90IGxlbiA9IHNpemUoKTsKKyAgICBjMl9zdGF0dXNfdCBlcnJvciA9IG1JbXBsLT5nZXRBbGxvY2F0aW9uKCktPm1hcCgKKyAgICAgICAgICAgIG9mZnNldCgpLCBsZW4sIHsgQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSB9LCBudWxscHRyLCAmYmFzZSk7CisgICAgLy8gVE9ETzogd2FpdCBvbiBmZW5jZQorICAgIGlmIChlcnJvciA9PSBDMl9PSykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8V3JpdGVWaWV3QnVkZHk6OkltcGw+IHJ2aSA9IHN0ZDo6c2hhcmVkX3B0cjxXcml0ZVZpZXdCdWRkeTo6SW1wbD4oCisgICAgICAgICAgICAgICAgbmV3IFdyaXRlVmlld0J1ZGR5OjpJbXBsKCptSW1wbCwgKHVpbnQ4X3QgKiliYXNlLCAwLCBsZW4pLAorICAgICAgICAgICAgICAgIFtiYXNlLCBsZW5dKFdyaXRlVmlld0J1ZGR5OjpJbXBsICppKSB7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKWktPmdldEFsbG9jYXRpb24oKS0+dW5tYXAoYmFzZSwgbGVuLCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGk7CisgICAgICAgIH0pOworICAgICAgICByZXR1cm4gQWNxdWlyYWJsZVdyaXRlVmlld0J1ZGR5KGVycm9yLCBDMkZlbmNlKCksIFdyaXRlVmlld0J1ZGR5KHJ2aSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBBY3F1aXJhYmxlV3JpdGVWaWV3QnVkZHkoZXJyb3IsIEMyRmVuY2UoKSwgV3JpdGVWaWV3QnVkZHkoZXJyb3IpKTsKKyAgICB9Cit9CisKK0MyQ29uc3RMaW5lYXJCbG9jayBDMkxpbmVhckJsb2NrOjpzaGFyZShzaXplX3Qgb2Zmc2V0Xywgc2l6ZV90IHNpemVfLCBDMkZlbmNlIGZlbmNlKSB7CisgICAgcmV0dXJuIENvbnN0TGluZWFyQmxvY2tCdWRkeShtSW1wbCwgQzJMaW5lYXJSYW5nZSgqdGhpcywgb2Zmc2V0Xywgc2l6ZV8pLCBmZW5jZSk7Cit9CisKK0MyQmFzaWNMaW5lYXJCbG9ja1Bvb2w6OkMyQmFzaWNMaW5lYXJCbG9ja1Bvb2woCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvcikgeyB9CisKK2MyX3N0YXR1c190IEMyQmFzaWNMaW5lYXJCbG9ja1Bvb2w6OmZldGNoTGluZWFyQmxvY2soCisgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICBibG9jay0+cmVzZXQoKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IGFsbG9jOworICAgIGMyX3N0YXR1c190IGVyciA9IG1BbGxvY2F0b3ItPm5ld0xpbmVhckFsbG9jYXRpb24oY2FwYWNpdHksIHVzYWdlLCAmYWxsb2MpOworICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICAqYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKGFsbG9jKTsKKworICAgIHJldHVybiBDMl9PSzsKK30KKworc3RydWN0IEMyX0hJREUgQzJQb29sZWRCbG9ja1Bvb2xEYXRhIDogX0MyQmxvY2tQb29sRGF0YSB7CisKKyAgICB2aXJ0dWFsIHR5cGVfdCBnZXRUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gVFlQRV9CVUZGRVJQT09MOworICAgIH0KKworICAgIHZvaWQgZ2V0QnVmZmVyUG9vbERhdGEoc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqZGF0YSkgY29uc3QgeworICAgICAgICAqZGF0YSA9IG1EYXRhOworICAgIH0KKworICAgIEMyUG9vbGVkQmxvY2tQb29sRGF0YShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZkYXRhKSA6IG1EYXRhKGRhdGEpIHt9CisKKyAgICB2aXJ0dWFsIH5DMlBvb2xlZEJsb2NrUG9vbERhdGEoKSBvdmVycmlkZSB7fQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gbURhdGE7Cit9OworCitib29sIF9DMkJsb2NrRmFjdG9yeTo6R2V0QnVmZmVyUG9vbERhdGEoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBfQzJCbG9ja1Bvb2xEYXRhPiAmZGF0YSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEJ1ZmZlclBvb2xEYXRhPiAqYnVmZmVyUG9vbERhdGEpIHsKKyAgICBpZiAoZGF0YSAmJiBkYXRhLT5nZXRUeXBlKCkgPT0gX0MyQmxvY2tQb29sRGF0YTo6VFlQRV9CVUZGRVJQT09MKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMlBvb2xlZEJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8Y29uc3QgQzJQb29sZWRCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICAgICAgcG9vbERhdGEtPmdldEJ1ZmZlclBvb2xEYXRhKGJ1ZmZlclBvb2xEYXRhKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+ICZhbGxvYywKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+ICZkYXRhLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrMUQ6OkltcGw+IGltcGwgPQorICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyQmxvY2sxRDo6SW1wbD4oYWxsb2MsIGRhdGEsIG9mZnNldCwgc2l6ZSk7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPihuZXcgQzJMaW5lYXJCbG9jayhpbXBsLCAqaW1wbCkpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gX0MyQmxvY2tGYWN0b3J5OjpHZXRMaW5lYXJCbG9ja1Bvb2xEYXRhKAorICAgICAgICBjb25zdCBDMkJsb2NrMUQgJmJsb2NrKSB7CisgICAgaWYgKGJsb2NrLm1JbXBsKSB7CisgICAgICAgIHJldHVybiBibG9jay5tSW1wbC0+cG9vbERhdGEoKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKSB7CisgICAgLy8gVE9ETzogZ2V0IHByb3BlciBhbGxvY2F0b3I/IGFuZCBtdXRleD8KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9ySW9uPiBzQWxsb2NhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxDMkFsbG9jYXRvcklvbj4oMCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBpZiAoQzJBbGxvY2F0b3JJb246OmlzVmFsaWQoaGFuZGxlKSkgeworICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBzQWxsb2NhdG9yLT5wcmlvckxpbmVhckFsbG9jYXRpb24oaGFuZGxlLCAmYWxsb2MpOworICAgICAgICBpZiAoZXJyID09IEMyX09LKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKGFsbG9jKTsKKyAgICAgICAgICAgIHJldHVybiBibG9jazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlTGluZWFyQmxvY2soCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjSGFuZGxlLCBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+ICZkYXRhKSB7CisgICAgLy8gVE9ETzogZ2V0IHByb3BlciBhbGxvY2F0b3I/IGFuZCBtdXRleD8KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9ySW9uPiBzQWxsb2NhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxDMkFsbG9jYXRvcklvbj4oMCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBpZiAoQzJBbGxvY2F0b3JJb246OmlzVmFsaWQoY0hhbmRsZSkpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gc0FsbG9jYXRvci0+cHJpb3JMaW5lYXJBbGxvY2F0aW9uKGNIYW5kbGUsICZhbGxvYyk7CisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBvb2xlZEJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4oZGF0YSk7CisgICAgICAgIGlmIChlcnIgPT0gQzJfT0sgJiYgcG9vbERhdGEpIHsKKyAgICAgICAgICAgIC8vIFRPRE86IGNvbmZpZyBwYXJhbXM/CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2sgPQorICAgICAgICAgICAgICAgICAgICBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUxpbmVhckJsb2NrKGFsbG9jLCBwb29sRGF0YSk7CisgICAgICAgICAgICByZXR1cm4gYmxvY2s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9OworCisvKioKKyAqIFdyYXBwZWQgQzJBbGxvY2F0b3Igd2hpY2ggaXMgaW5qZWN0ZWQgdG8gYnVmZmVyIHBvb2wgb24gYmVoYWxmIG9mCisgKiBDMkJsb2NrUG9vbC4KKyAqLworY2xhc3MgX0MyQnVmZmVyUG9vbEFsbG9jYXRvciA6IHB1YmxpYyBCdWZmZXJQb29sQWxsb2NhdG9yIHsKK3B1YmxpYzoKKyAgICBfQzJCdWZmZXJQb29sQWxsb2NhdG9yKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gJmFsbG9jYXRvcikKKyAgICAgICAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvcikge30KKworICAgIH5fQzJCdWZmZXJQb29sQWxsb2NhdG9yKCkgb3ZlcnJpZGUge30KKworICAgIFJlc3VsdFN0YXR1cyBhbGxvY2F0ZShjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmcGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+ICphbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICphbGxvY1NpemUpIG92ZXJyaWRlOworCisgICAgYm9vbCBjb21wYXRpYmxlKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZuZXdQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZvbGRQYXJhbXMpIG92ZXJyaWRlOworCisgICAgLy8gTWV0aG9kcyBmb3IgY29kZWMyIGNvbXBvbmVudCAoQzJCbG9ja1Bvb2wpLgorICAgIC8qKgorICAgICAqIFRyYW5zZm9ybXMgbGluZWFyIGFsbG9jYXRpb24gcGFyYW1ldGVycyBmb3IgQzJBbGxvY2F0b3IgdG8gcGFyYW1ldGVycworICAgICAqIGZvciBidWZmZXIgcG9vbC4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjYXBhY2l0eSAgICAgIHNpemUgb2YgbGluZWFyIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gdXNhZ2UgICAgICAgICBtZW1vcnkgdXNhZ2UgcGF0dGVybiBmb3IgbGluZWFyIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgICAgICBhbGxvY2F0aW9uIHBhcmFtZXRlcnMgZm9yIGJ1ZmZlciBwb29sCisgICAgICovCisgICAgdm9pZCBnZXRMaW5lYXJQYXJhbXModWludDMyX3QgY2FwYWNpdHksIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcyk7CisKKyAgICAvKioKKyAgICAgKiBUcmFuc2Zvcm1zIGdyYXBoaWMgYWxsb2NhdGlvbiBwYXJhbWV0ZXJzIGZvciBDMkFsbG9jYXRvciB0byBwYXJhbWV0ZXJzCisgICAgICogZm9yIGJ1ZmZlciBwb29sLgorICAgICAqCisgICAgICogQHBhcmFtIHdpZHRoICAgICAgICAgd2lkdGggb2YgZ3JhcGhpYyBhbGxvY2F0aW9uCisgICAgICogQHBhcmFtIGhlaWdodCAgICAgICAgaGVpZ2h0IG9mIGdyYXBoaWMgYWxsb2NhdGlvbgorICAgICAqIEBwYXJhbSBmb3JtYXQgICAgICAgIGNvbG9yIGZvcm1hdCBvZiBncmFwaGljIGFsbG9jYXRpb24KKyAgICAgKiBAcGFyYW0gcGFyYW1zICAgICAgICBhbGxvY2F0aW9uIHBhcmFtZXRlciBmb3IgYnVmZmVyIHBvb2wKKyAgICAgKi8KKyAgICB2b2lkIGdldEdyYXBoaWNQYXJhbXModWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKTsKKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybXMgYW4gZXhpc3RpbmcgbmF0aXZlIGhhbmRsZSB0byBhbiBDMkxpbmVhckFsbGNhdGlvbi4KKyAgICAgKiBXcmFwcGVyIHRvIEMyQWxsb2NhdG9yI3ByaW9yTGluZWFyQWxsb2NhdGlvbgorICAgICAqLworICAgIGMyX3N0YXR1c190IHByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJBbGxvY2F0aW9uPiAqYzJBbGxvY2F0aW9uKTsKKworICAgIC8qKgorICAgICAqIFRyYW5zZm9ybXMgYW4gZXhpc3RpbmcgbmF0aXZlIGhhbmRsZSB0byBhbiBDMkdyYXBoaWNBbGxjYXRpb24uCisgICAgICogV3JhcHBlciB0byBDMkFsbG9jYXRvciNwcmlvckdyYXBoaWNBbGxvY2F0aW9uCisgICAgICovCisgICAgYzJfc3RhdHVzX3QgcHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmMyQWxsb2NhdGlvbik7CisKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga01heEludFBhcmFtcyA9IDU7IC8vIGxhcmdlIGVub3VnaCBudW1iZXI7CisKKyAgICBlbnVtIEFsbG9jVHlwZSA6IHVpbnQ4X3QgeworICAgICAgICBBTExPQ19OT05FID0gMCwKKworICAgICAgICBBTExPQ19MSU5FQVIsCisgICAgICAgIEFMTE9DX0dSQVBISUMsCisgICAgfTsKKworICAgIHVuaW9uIEFsbG9jUGFyYW1zIHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIEFsbG9jVHlwZSBhbGxvY1R5cGU7CisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlOworICAgICAgICAgICAgdWludDMyX3QgcGFyYW1zW2tNYXhJbnRQYXJhbXNdOworICAgICAgICB9IGRhdGE7CisgICAgICAgIHVpbnQ4X3QgYXJyYXlbMF07CisKKyAgICAgICAgQWxsb2NQYXJhbXMoKSA6IGRhdGF7QUxMT0NfTk9ORSwgezAsIDB9LCB7MH19IHt9CisgICAgICAgIEFsbG9jUGFyYW1zKEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHVpbnQzMl90IGNhcGFjaXR5KQorICAgICAgICAgICAgOiBkYXRhe0FMTE9DX0xJTkVBUiwgdXNhZ2UsIHtbMF0gPSBjYXBhY2l0eX19IHt9CisgICAgICAgIEFsbG9jUGFyYW1zKAorICAgICAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0KQorICAgICAgICAgICAgICAgIDogZGF0YXtBTExPQ19HUkFQSElDLCB1c2FnZSwge3dpZHRoLCBoZWlnaHQsIGZvcm1hdH19IHt9CisgICAgfTsKKworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUFsbG9jYXRvcjsKK307CisKK3N0cnVjdCBMaW5lYXJBbGxvY2F0aW9uRHRvciB7CisgICAgTGluZWFyQWxsb2NhdGlvbkR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJmFsbG9jKQorICAgICAgICA6IG1BbGxvY2F0aW9uKGFsbG9jKSB7fQorCisgICAgdm9pZCBvcGVyYXRvcigpKEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwb29sQWxsb2MpIHsgZGVsZXRlIHBvb2xBbGxvYzsgfQorCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gbUFsbG9jYXRpb247Cit9OworCitzdHJ1Y3QgR3JhcGhpY0FsbG9jYXRpb25EdG9yIHsKKyAgICBHcmFwaGljQWxsb2NhdGlvbkR0b3IoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICZhbGxvYykKKyAgICAgICAgOiBtQWxsb2NhdGlvbihhbGxvYykge30KKworICAgIHZvaWQgb3BlcmF0b3IoKShCdWZmZXJQb29sQWxsb2NhdGlvbiAqcG9vbEFsbG9jKSB7IGRlbGV0ZSBwb29sQWxsb2M7IH0KKworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBtQWxsb2NhdGlvbjsKK307CisKK1Jlc3VsdFN0YXR1cyBfQzJCdWZmZXJQb29sQWxsb2NhdG9yOjphbGxvY2F0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gICZwYXJhbXMsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sQWxsb2NhdGlvbj4gKmFsbG9jLAorICAgICAgICBzaXplX3QgKmFsbG9jU2l6ZSkgeworICAgIEFsbG9jUGFyYW1zIGMyUGFyYW1zOworICAgIG1lbWNweSgmYzJQYXJhbXMsIHBhcmFtcy5kYXRhKCksIHN0ZDo6bWluKHNpemVvZihBbGxvY1BhcmFtcyksIHBhcmFtcy5zaXplKCkpKTsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBDMl9CQURfVkFMVUU7CisgICAgc3dpdGNoKGMyUGFyYW1zLmRhdGEuYWxsb2NUeXBlKSB7CisgICAgICAgIGNhc2UgQUxMT0NfTk9ORToKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMTE9DX0xJTkVBUjogeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gYzJMaW5lYXI7CisgICAgICAgICAgICBzdGF0dXMgPSBtQWxsb2NhdG9yLT5uZXdMaW5lYXJBbGxvY2F0aW9uKAorICAgICAgICAgICAgICAgICAgICBjMlBhcmFtcy5kYXRhLnBhcmFtc1swXSwgYzJQYXJhbXMuZGF0YS51c2FnZSwgJmMyTGluZWFyKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQzJfT0sgJiYgYzJMaW5lYXIpIHsKKyAgICAgICAgICAgICAgICBCdWZmZXJQb29sQWxsb2NhdGlvbiAqcHRyID0gbmV3IEJ1ZmZlclBvb2xBbGxvY2F0aW9uKGMyTGluZWFyLT5oYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgICAgICAqYWxsb2MgPSBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciwgTGluZWFyQWxsb2NhdGlvbkR0b3IoYzJMaW5lYXIpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCphbGxvYykgeworICAgICAgICAgICAgICAgICAgICAgICAgKmFsbG9jU2l6ZSA9IChzaXplX3QpYzJQYXJhbXMuZGF0YS5wYXJhbXNbMF07CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpPSzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBkZWxldGUgcHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjYXNlIEFMTE9DX0dSQVBISUM6IHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBjMkdyYXBoaWM7CisgICAgICAgICAgICBzdGF0dXMgPSBtQWxsb2NhdG9yLT5uZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgYzJQYXJhbXMuZGF0YS5wYXJhbXNbMF0sCisgICAgICAgICAgICAgICAgICAgIGMyUGFyYW1zLmRhdGEucGFyYW1zWzFdLAorICAgICAgICAgICAgICAgICAgICBjMlBhcmFtcy5kYXRhLnBhcmFtc1syXSwKKyAgICAgICAgICAgICAgICAgICAgYzJQYXJhbXMuZGF0YS51c2FnZSwgJmMyR3JhcGhpYyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEMyX09LICYmIGMyR3JhcGhpYykgeworICAgICAgICAgICAgICAgIEJ1ZmZlclBvb2xBbGxvY2F0aW9uICpwdHIgPSBuZXcgQnVmZmVyUG9vbEFsbG9jYXRpb24oYzJHcmFwaGljLT5oYW5kbGUoKSk7CisgICAgICAgICAgICAgICAgaWYgKHB0cikgeworICAgICAgICAgICAgICAgICAgICAqYWxsb2MgPSBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbEFsbG9jYXRpb24+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ciwgR3JhcGhpY0FsbG9jYXRpb25EdG9yKGMyR3JhcGhpYykpOworICAgICAgICAgICAgICAgICAgICBpZiAoKmFsbG9jKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqYWxsb2NTaXplID0gYzJQYXJhbXMuZGF0YS5wYXJhbXNbMF0gKiBjMlBhcmFtcy5kYXRhLnBhcmFtc1sxXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok9LOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBSZXN1bHRTdGF0dXM6Ok5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFN0YXR1czo6Q1JJVElDQUxfRVJST1I7Cit9CisKK2Jvb2wgX0MyQnVmZmVyUG9vbEFsbG9jYXRvcjo6Y29tcGF0aWJsZSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gICZuZXdQYXJhbXMsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICAmb2xkUGFyYW1zKSB7CisgICAgQWxsb2NQYXJhbXMgbmV3QWxsb2M7CisgICAgQWxsb2NQYXJhbXMgb2xkQWxsb2M7CisgICAgbWVtY3B5KCZuZXdBbGxvYywgbmV3UGFyYW1zLmRhdGEoKSwgc3RkOjptaW4oc2l6ZW9mKEFsbG9jUGFyYW1zKSwgbmV3UGFyYW1zLnNpemUoKSkpOworICAgIG1lbWNweSgmb2xkQWxsb2MsIG9sZFBhcmFtcy5kYXRhKCksIHN0ZDo6bWluKHNpemVvZihBbGxvY1BhcmFtcyksIG9sZFBhcmFtcy5zaXplKCkpKTsKKworICAgIC8vIFRPRE86IHN1cHBvcnQgbm90IGV4YWN0IG1hdGNoaW5nLiBlLmcpIG5ld0NhcGFjaXR5IDwgb2xkQ2FwYWNpdHkKKyAgICBpZiAobmV3QWxsb2MuZGF0YS5hbGxvY1R5cGUgPT0gb2xkQWxsb2MuZGF0YS5hbGxvY1R5cGUgJiYKKyAgICAgICAgICAgIG5ld0FsbG9jLmRhdGEudXNhZ2UuZXhwZWN0ZWQgPT0gb2xkQWxsb2MuZGF0YS51c2FnZS5leHBlY3RlZCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtNYXhJbnRQYXJhbXM7ICsraSkgeworICAgICAgICAgICAgaWYgKG5ld0FsbG9jLmRhdGEucGFyYW1zW2ldICE9IG9sZEFsbG9jLmRhdGEucGFyYW1zW2ldKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgX0MyQnVmZmVyUG9vbEFsbG9jYXRvcjo6Z2V0TGluZWFyUGFyYW1zKAorICAgICAgICB1aW50MzJfdCBjYXBhY2l0eSwgQzJNZW1vcnlVc2FnZSB1c2FnZSwgc3RkOjp2ZWN0b3I8dWludDhfdD4gKnBhcmFtcykgeworICAgIEFsbG9jUGFyYW1zIGMyUGFyYW1zKHVzYWdlLCBjYXBhY2l0eSk7CisgICAgcGFyYW1zLT5hc3NpZ24oYzJQYXJhbXMuYXJyYXksIGMyUGFyYW1zLmFycmF5ICsgc2l6ZW9mKEFsbG9jUGFyYW1zKSk7Cit9CisKK3ZvaWQgX0MyQnVmZmVyUG9vbEFsbG9jYXRvcjo6Z2V0R3JhcGhpY1BhcmFtcygKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgdWludDMyX3QgZm9ybWF0LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiAqcGFyYW1zKSB7CisgICAgQWxsb2NQYXJhbXMgYzJQYXJhbXModXNhZ2UsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCk7CisgICAgcGFyYW1zLT5hc3NpZ24oYzJQYXJhbXMuYXJyYXksIGMyUGFyYW1zLmFycmF5ICsgc2l6ZW9mKEFsbG9jUGFyYW1zKSk7Cit9CisKK2MyX3N0YXR1c190IF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I6OnByaW9yTGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmMyQWxsb2NhdGlvbikgeworICAgIHJldHVybiBtQWxsb2NhdG9yLT5wcmlvckxpbmVhckFsbG9jYXRpb24oaGFuZGxlLCBjMkFsbG9jYXRpb24pOworfQorCitjMl9zdGF0dXNfdCBfQzJCdWZmZXJQb29sQWxsb2NhdG9yOjpwcmlvckdyYXBoaWNBbGxvY2F0aW9uKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gKmMyQWxsb2NhdGlvbikgeworICAgIHJldHVybiBtQWxsb2NhdG9yLT5wcmlvckdyYXBoaWNBbGxvY2F0aW9uKGhhbmRsZSwgYzJBbGxvY2F0aW9uKTsKK30KKworY2xhc3MgQzJQb29sZWRCbG9ja1Bvb2w6OkltcGwgeworcHVibGljOgorICAgIEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgICAgICAgICAgOiBtSW5pdChDMl9PSyksCisgICAgICAgICAgICAgIG1CdWZmZXJQb29sTWFuYWdlcihDbGllbnRNYW5hZ2VyOjpnZXRJbnN0YW5jZSgpKSwKKyAgICAgICAgICAgICAgbUFsbG9jYXRvcihzdGQ6Om1ha2Vfc2hhcmVkPF9DMkJ1ZmZlclBvb2xBbGxvY2F0b3I+KGFsbG9jYXRvcikpIHsKKyAgICAgICAgaWYgKG1BbGxvY2F0b3IgJiYgbUJ1ZmZlclBvb2xNYW5hZ2VyKSB7CisgICAgICAgICAgICBpZiAobUJ1ZmZlclBvb2xNYW5hZ2VyLT5jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgIG1BbGxvY2F0b3IsICZtQ29ubmVjdGlvbklkKSA9PSBSZXN1bHRTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1Jbml0ID0gQzJfTk9fSU5JVDsKKyAgICB9CisKKyAgICB+SW1wbCgpIHsKKyAgICAgICAgaWYgKG1Jbml0ID09IEMyX09LKSB7CisgICAgICAgICAgICBtQnVmZmVyUG9vbE1hbmFnZXItPmNsb3NlKG1Db25uZWN0aW9uSWQpOworICAgICAgICB9CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgICAgIGJsb2NrLT5yZXNldCgpOworICAgICAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwYXJhbXM7CisgICAgICAgIG1BbGxvY2F0b3ItPmdldExpbmVhclBhcmFtcyhjYXBhY2l0eSwgdXNhZ2UsICZwYXJhbXMpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlclBvb2xEYXRhOworICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmNIYW5kbGUgPSBudWxscHRyOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUJ1ZmZlclBvb2xNYW5hZ2VyLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBwYXJhbXMsICZjSGFuZGxlLCAmYnVmZmVyUG9vbERhdGEpOworICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckFsbG9jYXRpb24+IGFsbG9jOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4oYnVmZmVyUG9vbERhdGEpOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+cHJpb3JMaW5lYXJBbGxvY2F0aW9uKGNIYW5kbGUsICZhbGxvYyk7CisgICAgICAgICAgICBpZiAoZXJyID09IEMyX09LICYmIHBvb2xEYXRhICYmIGFsbG9jKSB7CisgICAgICAgICAgICAgICAgKmJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVMaW5lYXJCbG9jayhhbGxvYywgcG9vbERhdGEsIDAsIGNhcGFjaXR5KTsKKyAgICAgICAgICAgICAgICBpZiAoKmJsb2NrKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlkpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jaykgeworICAgICAgICBibG9jay0+cmVzZXQoKTsKKyAgICAgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGFyYW1zOworICAgICAgICBtQWxsb2NhdG9yLT5nZXRHcmFwaGljUGFyYW1zKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsICZwYXJhbXMpOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QnVmZmVyUG9vbERhdGE+IGJ1ZmZlclBvb2xEYXRhOworICAgICAgICBuYXRpdmVfaGFuZGxlX3QgKmNIYW5kbGUgPSBudWxscHRyOworICAgICAgICBSZXN1bHRTdGF0dXMgc3RhdHVzID0gbUJ1ZmZlclBvb2xNYW5hZ2VyLT5hbGxvY2F0ZSgKKyAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbklkLCBwYXJhbXMsICZjSGFuZGxlLCAmYnVmZmVyUG9vbERhdGEpOworICAgICAgICBpZiAoc3RhdHVzID09IFJlc3VsdFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBvb2xlZEJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sRGF0YT4oYnVmZmVyUG9vbERhdGEpOworICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgY0hhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gQzJfT0sgJiYgcG9vbERhdGEgJiYgYWxsb2MpIHsKKyAgICAgICAgICAgICAgICAqYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jLCBwb29sRGF0YSwgQzJSZWN0KHdpZHRoLCBoZWlnaHQpKTsKKyAgICAgICAgICAgICAgICBpZiAoKmJsb2NrKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQzJfTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIGlmIChzdGF0dXMgPT0gUmVzdWx0U3RhdHVzOjpOT19NRU1PUlkpIHsKKyAgICAgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKKyAgICB9CisKKyAgICBDb25uZWN0aW9uSWQgZ2V0Q29ubmVjdGlvbklkKCkgeworICAgICAgICByZXR1cm4gbUluaXQgIT0gQzJfT0sgPyBJTlZBTElEX0NPTk5FQ1RJT05JRCA6IG1Db25uZWN0aW9uSWQ7CisgICAgfQorCitwcml2YXRlOgorICAgIGMyX3N0YXR1c190IG1Jbml0OworICAgIGNvbnN0IGFuZHJvaWQ6OnNwPENsaWVudE1hbmFnZXI+IG1CdWZmZXJQb29sTWFuYWdlcjsKKyAgICBDb25uZWN0aW9uSWQgbUNvbm5lY3Rpb25JZDsgLy8gbG9jYWxseQorICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCdWZmZXJQb29sQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworfTsKKworQzJQb29sZWRCbG9ja1Bvb2w6OkMyUG9vbGVkQmxvY2tQb29sKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IsIGNvbnN0IGxvY2FsX2lkX3QgbG9jYWxJZCkKKyAgICAgICAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvciksIG1Mb2NhbElkKGxvY2FsSWQpLCBtSW1wbChuZXcgSW1wbChhbGxvY2F0b3IpKSB7fQorCitDMlBvb2xlZEJsb2NrUG9vbDo6fkMyUG9vbGVkQmxvY2tQb29sKCkgeworfQorCitjMl9zdGF0dXNfdCBDMlBvb2xlZEJsb2NrUG9vbDo6ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZldGNoTGluZWFyQmxvY2soY2FwYWNpdHksIHVzYWdlLCBibG9jayk7CisgICAgfQorICAgIHJldHVybiBDMl9DT1JSVVBURUQ7Cit9CisKK2MyX3N0YXR1c190IEMyUG9vbGVkQmxvY2tQb29sOjpmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jaykgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmZldGNoR3JhcGhpY0Jsb2NrKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIGJsb2NrKTsKKyAgICB9CisgICAgcmV0dXJuIEMyX0NPUlJVUFRFRDsKK30KKworaW50NjRfdCBDMlBvb2xlZEJsb2NrUG9vbDo6Z2V0Q29ubmVjdGlvbklkKCkgeworICAgIGlmIChtSW1wbCkgeworICAgICAgICByZXR1cm4gbUltcGwtPmdldENvbm5lY3Rpb25JZCgpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IDJEIEJMT0NLID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogSW1wbGVtZW50YXRpb24gdGhhdCBpcyBzaGFyZWQgYmV0d2VlbiBhbGwgMkQgYmxvY2tzIGFuZCB2aWV3cy4KKyAqCisgKiBGb3IgYmxvY2tzJyBJbXBsJ3MgY3JvcCBpcyBhbHdheXMgdGhlIGFsbG90dGVkIGNyb3AsIGV2ZW4gaWYgaXQgaXMgYSBzdWIgYmxvY2suCisgKgorICogRm9yIHZpZXdzJyBJbXBsJ3MgY3JvcCBpcyB0aGUgbWFwcGVkIHBvcnRpb24gLSB3aGljaCBmb3Igbm93IGlzIGFsd2F5cyB0aGUKKyAqIGFsbG90dGVkIGNyb3AuCisgKi8KK2NsYXNzIEMyX0hJREUgX0MyQmxvY2syREltcGwgOiBwdWJsaWMgX0MyUGxhbmFyU2VjdGlvbkFzcGVjdCB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogSW1wbCdzIGNyb3AgaXMgYWx3YXlzIHRoZSBvciBwYXJ0IG9mIHRoZSBhbGxvdHRlZCBjcm9wIG9mIHRoZSBhbGxvY2F0aW9uLgorICAgICAqLworICAgIF9DMkJsb2NrMkRJbXBsKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAmYWxsb2MsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gJnBvb2xEYXRhID0gbnVsbHB0ciwKKyAgICAgICAgICAgIGNvbnN0IEMyUmVjdCAmYWxsb3R0ZWRDcm9wID0gQzJSZWN0KH4wdSwgfjB1KSkKKyAgICAgICAgOiBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0KGFsbG9jLmdldCgpLCBhbGxvdHRlZENyb3ApLAorICAgICAgICAgIG1BbGxvY2F0aW9uKGFsbG9jKSwKKyAgICAgICAgICBtUG9vbERhdGEocG9vbERhdGEpIHsgfQorCisgICAgdmlydHVhbCB+X0MyQmxvY2syREltcGwoKSA9IGRlZmF1bHQ7CisKKyAgICAvKiogcmV0dXJucyBwb29sIGRhdGEgICovCisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IHBvb2xEYXRhKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVBvb2xEYXRhOworICAgIH0KKworICAgIC8qKiByZXR1cm5zIG5hdGl2ZSBoYW5kbGUgKi8KKyAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUFsbG9jYXRpb24gPyBtQWxsb2NhdGlvbi0+aGFuZGxlKCkgOiBudWxscHRyOworICAgIH0KKworICAgIC8qKiByZXR1cm5zIHRoZSBhbGxvY2F0b3IncyBJRCAqLworICAgIEMyQWxsb2NhdG9yOjppZF90IGdldEFsbG9jYXRvcklkKCkgY29uc3QgeworICAgICAgICAvLyBCQURfSUQgY2FuIG9ubHkgaGFwcGVuIGlmIHRoaXMgSW1wbCBjbGFzcyBpcyBpbml0aWFsaXplZCBmb3IgYSB2aWV3IC0gbmV2ZXIgZm9yIGEgYmxvY2suCisgICAgICAgIHJldHVybiBtQWxsb2NhdGlvbiA/IG1BbGxvY2F0aW9uLT5nZXRBbGxvY2F0b3JJZCgpIDogQzJBbGxvY2F0b3I6OkJBRF9JRDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gZ2V0QWxsb2NhdGlvbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0aW9uOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gbUFsbG9jYXRpb247CisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IG1Qb29sRGF0YTsKK307CisKK2NsYXNzIEMyX0hJREUgX0MyTWFwcGluZ0Jsb2NrMkRJbXBsCisgICAgOiBwdWJsaWMgX0MyQmxvY2syREltcGwsIHB1YmxpYyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPF9DMk1hcHBpbmdCbG9jazJESW1wbD4geworcHVibGljOgorICAgIHVzaW5nIF9DMkJsb2NrMkRJbXBsOjpfQzJCbG9jazJESW1wbDsKKworICAgIHZpcnR1YWwgfl9DMk1hcHBpbmdCbG9jazJESW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFRoaXMgY2xhc3MgY29udGFpbnMgdGhlIG1hcHBlZCBkYXRhIHBvaW50ZXIsIGFuZCB0aGUgcG90ZW50aWFsIGVycm9yLgorICAgICAqLworICAgIHN0cnVjdCBNYXBwZWQgeworICAgIHByaXZhdGU6CisgICAgICAgIGZyaWVuZCBjbGFzcyBfQzJNYXBwaW5nQmxvY2syREltcGw7CisKKyAgICAgICAgTWFwcGVkKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9jazJESW1wbD4gJmltcGwsIGJvb2wgd3JpdGFibGUsIEMyRmVuY2UgKmZlbmNlIF9fdW51c2VkKQorICAgICAgICAgICAgOiBtSW1wbChpbXBsKSwgbVdyaXRhYmxlKHdyaXRhYmxlKSB7CisgICAgICAgICAgICBtZW1zZXQobURhdGEsIDAsIHNpemVvZihtRGF0YSkpOworICAgICAgICAgICAgY29uc3QgQzJSZWN0IGNyb3AgPSBtSW1wbC0+Y3JvcCgpOworICAgICAgICAgICAgLy8gZ3JhbGxvYyByZXF1aXJlcyBtYXBwaW5nIHRoZSB3aG9sZSByZWdpb24gb2YgaW50ZXJlc3QgYXMgd2UgY2Fubm90CisgICAgICAgICAgICAvLyBtYXAgbXVsdGlwbGUgcmVnaW9ucworICAgICAgICAgICAgbUVycm9yID0gbUltcGwtPmdldEFsbG9jYXRpb24oKS0+bWFwKAorICAgICAgICAgICAgICAgICAgICBjcm9wLAorICAgICAgICAgICAgICAgICAgICB7IEMyTWVtb3J5VXNhZ2U6OkNQVV9SRUFELCB3cml0YWJsZSA/IEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSA6IDAgfSwKKyAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgJm1MYXlvdXQsCisgICAgICAgICAgICAgICAgICAgIG1EYXRhKTsKKyAgICAgICAgICAgIGlmIChtRXJyb3IgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBtZW1zZXQoJm1MYXlvdXQsIDAsIHNpemVvZihtTGF5b3V0KSk7CisgICAgICAgICAgICAgICAgbWVtc2V0KG1EYXRhLCAwLCBzaXplb2YobURhdGEpKTsKKyAgICAgICAgICAgICAgICBtZW1zZXQobU9mZnNldERhdGEsIDAsIHNpemVvZihtRGF0YSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiB2YWxpZGF0ZSBwbGFuZSBsYXlvdXQgYW5kCisgICAgICAgICAgICAgICAgLy8gYWRqdXN0IGRhdGEgcG9pbnRlcnMgdG8gdGhlIGNyb3AgcmVnaW9uJ3MgdG9wIGxlZnQgY29ybmVyLgorICAgICAgICAgICAgICAgIC8vIGZhaWwgaWYgaXQgaXMgbm90IG9uIGEgc3Vic2FtcGxpbmcgYm91bmRhcnkKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBwbGFuZUl4ID0gMDsgcGxhbmVJeCA8IG1MYXlvdXQubnVtUGxhbmVzOyArK3BsYW5lSXgpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgY29sU2FtcGxpbmcgPSBtTGF5b3V0LnBsYW5lc1twbGFuZUl4XS5jb2xTYW1wbGluZzsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgcm93U2FtcGxpbmcgPSBtTGF5b3V0LnBsYW5lc1twbGFuZUl4XS5yb3dTYW1wbGluZzsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNyb3AubGVmdCAlIGNvbFNhbXBsaW5nIHx8IGNyb3AucmlnaHQoKSAlIGNvbFNhbXBsaW5nCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgY3JvcC50b3AgJSByb3dTYW1wbGluZyB8fCBjcm9wLmJvdHRvbSgpICUgcm93U2FtcGxpbmcpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbm5vdCBjYWxjdWxhdGUgZGF0YSBwb2ludGVyCisgICAgICAgICAgICAgICAgICAgICAgICBtSW1wbC0+Z2V0QWxsb2NhdGlvbigpLT51bm1hcChtRGF0YSwgY3JvcCwgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoJm1MYXlvdXQsIDAsIHNpemVvZihtTGF5b3V0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQobURhdGEsIDAsIHNpemVvZihtRGF0YSkpOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtc2V0KG1PZmZzZXREYXRhLCAwLCBzaXplb2YobURhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1FcnJvciA9IEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtT2Zmc2V0RGF0YVtwbGFuZUl4XSA9CisgICAgICAgICAgICAgICAgICAgICAgICBtRGF0YVtwbGFuZUl4XSArIChzc2l6ZV90KWNyb3AubGVmdCAqIG1MYXlvdXQucGxhbmVzW3BsYW5lSXhdLmNvbEluYworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChzc2l6ZV90KWNyb3AudG9wICogbUxheW91dC5wbGFuZXNbcGxhbmVJeF0ucm93SW5jOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGV4cGxpY2l0IE1hcHBlZChjMl9zdGF0dXNfdCBlcnJvcikKKyAgICAgICAgICAgIDogbUltcGwobnVsbHB0ciksIG1Xcml0YWJsZShmYWxzZSksIG1FcnJvcihlcnJvcikgeworICAgICAgICAgICAgLy8gQ0hFQ0soZXJyb3IgIT0gQzJfT0spOworICAgICAgICAgICAgbWVtc2V0KCZtTGF5b3V0LCAwLCBzaXplb2YobUxheW91dCkpOworICAgICAgICAgICAgbWVtc2V0KG1EYXRhLCAwLCBzaXplb2YobURhdGEpKTsKKyAgICAgICAgICAgIG1lbXNldChtT2Zmc2V0RGF0YSwgMCwgc2l6ZW9mKG1EYXRhKSk7CisgICAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgICAgfk1hcHBlZCgpIHsKKyAgICAgICAgICAgIGlmIChtRGF0YVswXSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgbUltcGwtPmdldEFsbG9jYXRpb24oKS0+dW5tYXAobURhdGEsIG1JbXBsLT5jcm9wKCksIG51bGxwdHIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoqIHJldHVybnMgbWFwcGluZyBzdGF0dXMgKi8KKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyb3IoKSBjb25zdCB7IHJldHVybiBtRXJyb3I7IH0KKworICAgICAgICAvKiogcmV0dXJucyBkYXRhIHBvaW50ZXIgKi8KKyAgICAgICAgdWludDhfdCAqY29uc3QgKmRhdGEoKSBjb25zdCB7IHJldHVybiBtT2Zmc2V0RGF0YTsgfQorCisgICAgICAgIC8qKiByZXR1cm5zIHRoZSBwbGFuZSBsYXlvdXQgKi8KKyAgICAgICAgQzJQbGFuYXJMYXlvdXQgbGF5b3V0KCkgY29uc3QgeyByZXR1cm4gbUxheW91dDsgfQorCisgICAgICAgIC8qKiByZXR1cm5zIHdoZXRoZXIgdGhlIG1hcHBpbmcgaXMgd3JpdGFibGUgKi8KKyAgICAgICAgYm9vbCB3cml0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIG1Xcml0YWJsZTsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrMkRJbXBsPiBtSW1wbDsKKyAgICAgICAgYm9vbCBtV3JpdGFibGU7CisgICAgICAgIGMyX3N0YXR1c190IG1FcnJvcjsKKyAgICAgICAgdWludDhfdCAqbURhdGFbQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTXTsKKyAgICAgICAgdWludDhfdCAqbU9mZnNldERhdGFbQzJQbGFuYXJMYXlvdXQ6Ok1BWF9OVU1fUExBTkVTXTsKKyAgICAgICAgQzJQbGFuYXJMYXlvdXQgbUxheW91dDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogTWFwcyB0aGUgYWxsb3R0ZWQgcmVnaW9uLgorICAgICAqCisgICAgICogSWYgYWxyZWFkeSBtYXBwZWQgYW5kIGl0IGlzIGN1cnJlbnRseSBpbiB1c2UsIHJldHVybnMgdGhlIGV4aXN0aW5nIG1hcHBpbmcuCisgICAgICogSWYgZmVuY2UgaXMgcHJvdmlkZWQsIGFuIGFjcXVpcmUgZmVuY2UgaXMgc3RvcmVkIHRoZXJlLgorICAgICAqLworICAgIHN0ZDo6c2hhcmVkX3B0cjxNYXBwZWQ+IG1hcChib29sIHdyaXRhYmxlLCBDMkZlbmNlICpmZW5jZSkgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTWFwcGVkTG9jayk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxNYXBwZWQ+IGV4aXN0aW5nID0gbU1hcHBlZC5sb2NrKCk7CisgICAgICAgIGlmICghZXhpc3RpbmcpIHsKKyAgICAgICAgICAgIGV4aXN0aW5nID0gc3RkOjpzaGFyZWRfcHRyPE1hcHBlZD4obmV3IE1hcHBlZChzaGFyZWRfZnJvbV90aGlzKCksIHdyaXRhYmxlLCBmZW5jZSkpOworICAgICAgICAgICAgbU1hcHBlZCA9IGV4aXN0aW5nOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gaWYgd2UgbWFwcGVkIHRoZSByZWdpb24gcmVhZC1vbmx5LCB3ZSBjYW5ub3QgcmVtYXAgaXQgcmVhZC13cml0ZQorICAgICAgICAgICAgaWYgKHdyaXRhYmxlICYmICFleGlzdGluZy0+d3JpdGFibGUoKSkgeworICAgICAgICAgICAgICAgIGV4aXN0aW5nID0gc3RkOjpzaGFyZWRfcHRyPE1hcHBlZD4obmV3IE1hcHBlZChDMl9DQU5OT1RfRE8pKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmZW5jZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgKmZlbmNlID0gQzJGZW5jZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBleGlzdGluZzsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgc3RkOjp3ZWFrX3B0cjxNYXBwZWQ+IG1NYXBwZWQ7CisgICAgc3RkOjptdXRleCBtTWFwcGVkTG9jazsKK307CisKK2NsYXNzIEMyX0hJREUgX0MyTWFwcGVkQmxvY2syREltcGwgOiBwdWJsaWMgX0MyQmxvY2syREltcGwgeworcHVibGljOgorICAgIF9DMk1hcHBlZEJsb2NrMkRJbXBsKGNvbnN0IF9DMkJsb2NrMkRJbXBsICZpbXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJNYXBwaW5nQmxvY2syREltcGw6Ok1hcHBlZD4gbWFwcGluZykKKyAgICAgICAgOiBfQzJCbG9jazJESW1wbChpbXBsKSwgbU1hcHBpbmcobWFwcGluZykgeworICAgIH0KKworICAgIHZpcnR1YWwgfl9DMk1hcHBlZEJsb2NrMkRJbXBsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPF9DMk1hcHBpbmdCbG9jazJESW1wbDo6TWFwcGVkPiBtYXBwaW5nKCkgY29uc3QgeyByZXR1cm4gbU1hcHBpbmc7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyTWFwcGluZ0Jsb2NrMkRJbXBsOjpNYXBwZWQ+IG1NYXBwaW5nOworfTsKKworLyoqCisgKiBCbG9jayBpbXBsZW1lbnRhdGlvbi4KKyAqLworY2xhc3MgQzJCbG9jazJEOjpJbXBsIDogcHVibGljIF9DMk1hcHBpbmdCbG9jazJESW1wbCB7CitwdWJsaWM6CisgICAgdXNpbmcgX0MyTWFwcGluZ0Jsb2NrMkRJbXBsOjpfQzJNYXBwaW5nQmxvY2syREltcGw7CisgICAgdmlydHVhbCB+SW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKK307CisKK2NvbnN0IEMySGFuZGxlICpDMkJsb2NrMkQ6OmhhbmRsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmhhbmRsZSgpOworfQorCitDMkFsbG9jYXRvcjo6aWRfdCBDMkJsb2NrMkQ6OmdldEFsbG9jYXRvcklkKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0QWxsb2NhdG9ySWQoKTsKK30KKworQzJCbG9jazJEOjpDMkJsb2NrMkQoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24pCisgICAgLy8gYWx3YXlzIGNsYW1wIHN1YnNlY3Rpb24gdG8gcGFyZW50IChpbXBsKSBjcm9wIGZvciBzYWZldHkKKyAgICA6IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QoaW1wbC5nZXQoKSwgc2VjdGlvbi5jcm9wKCkpLCBtSW1wbChpbXBsKSB7Cit9CisKKy8qKgorICogR3JhcGhpYyB2aWV3IGltcGxlbWVudGF0aW9uLgorICoKKyAqIHJhbmdlIG9mIEltcGwgaXMgdGhlIG1hcHBlZCByYW5nZSBvZiB0aGUgdW5kZXJseWluZyBhbGxvY2F0aW9uLiByYW5nZSBvZiBWaWV3IGlzIHRoZSBjdXJyZW50CisgKiBjcm9wLgorICovCitjbGFzcyBDMkdyYXBoaWNWaWV3OjpJbXBsIDogcHVibGljIF9DMk1hcHBlZEJsb2NrMkRJbXBsIHsKK3B1YmxpYzoKKyAgICB1c2luZyBfQzJNYXBwZWRCbG9jazJESW1wbDo6X0MyTWFwcGVkQmxvY2syREltcGw7CisgICAgdmlydHVhbCB+SW1wbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKK307CisKK0MyR3JhcGhpY1ZpZXc6OkMyR3JhcGhpY1ZpZXcoc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24pCisgICAgOiBfQzJFZGl0YWJsZVBsYW5hclNlY3Rpb25Bc3BlY3QoaW1wbC5nZXQoKSwgc2VjdGlvbi5jcm9wKCkpLCBtSW1wbChpbXBsKSB7Cit9CisKK2NvbnN0IHVpbnQ4X3QgKmNvbnN0ICpDMkdyYXBoaWNWaWV3OjpkYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+bWFwcGluZygpLT5kYXRhKCk7Cit9CisKK3VpbnQ4X3QgKmNvbnN0ICpDMkdyYXBoaWNWaWV3OjpkYXRhKCkgeworICAgIHJldHVybiBtSW1wbC0+bWFwcGluZygpLT5kYXRhKCk7Cit9CisKK2NvbnN0IEMyUGxhbmFyTGF5b3V0IEMyR3JhcGhpY1ZpZXc6OmxheW91dCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPm1hcHBpbmcoKS0+bGF5b3V0KCk7Cit9CisKK2NvbnN0IEMyR3JhcGhpY1ZpZXcgQzJHcmFwaGljVmlldzo6c3ViVmlldyhjb25zdCBDMlJlY3QgJnJlY3QpIGNvbnN0IHsKKyAgICByZXR1cm4gQzJHcmFwaGljVmlldyhtSW1wbCwgQzJQbGFuYXJTZWN0aW9uKCptSW1wbCwgcmVjdCkpOworfQorCitDMkdyYXBoaWNWaWV3IEMyR3JhcGhpY1ZpZXc6OnN1YlZpZXcoY29uc3QgQzJSZWN0ICZyZWN0KSB7CisgICAgcmV0dXJuIEMyR3JhcGhpY1ZpZXcobUltcGwsIEMyUGxhbmFyU2VjdGlvbigqbUltcGwsIHJlY3QpKTsKK30KKworYzJfc3RhdHVzX3QgQzJHcmFwaGljVmlldzo6ZXJyb3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5tYXBwaW5nKCktPmVycm9yKCk7Cit9CisKKy8qKgorICogQ29uc3QgZ3JhcGhpYyBibG9jayBpbXBsZW1lbnRhdGlvbi4KKyAqLworQzJDb25zdEdyYXBoaWNCbG9jazo6QzJDb25zdEdyYXBoaWNCbG9jaygKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEltcGw+IGltcGwsIGNvbnN0IF9DMlBsYW5hclNlY3Rpb25Bc3BlY3QgJnNlY3Rpb24sIEMyRmVuY2UgZmVuY2UpCisgICAgOiBDMkJsb2NrMkQoaW1wbCwgc2VjdGlvbiksIG1GZW5jZShmZW5jZSkgeyB9CisKK0MyQWNxdWlyYWJsZTxjb25zdCBDMkdyYXBoaWNWaWV3PiBDMkNvbnN0R3JhcGhpY0Jsb2NrOjptYXAoKSBjb25zdCB7CisgICAgQzJGZW5jZSBmZW5jZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8X0MyTWFwcGluZ0Jsb2NrMkRJbXBsOjpNYXBwZWQ+IG1hcHBpbmcgPQorICAgICAgICBtSW1wbC0+bWFwKGZhbHNlIC8qIHdyaXRhYmxlICovLCAmZmVuY2UpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxHcmFwaGljVmlld0J1ZGR5OjpJbXBsPiBndmkgPQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8R3JhcGhpY1ZpZXdCdWRkeTo6SW1wbD4obmV3IEdyYXBoaWNWaWV3QnVkZHk6OkltcGwoKm1JbXBsLCBtYXBwaW5nKSk7CisgICAgcmV0dXJuIEFjcXVpcmFibGVDb25zdEdyYXBoaWNWaWV3QnVkZHkoCisgICAgICAgICAgICBtYXBwaW5nLT5lcnJvcigpLCBmZW5jZSwgR3JhcGhpY1ZpZXdCdWRkeShndmksIEMyUGxhbmFyU2VjdGlvbigqbUltcGwsIGNyb3AoKSkpKTsKK30KKworQzJDb25zdEdyYXBoaWNCbG9jayBDMkNvbnN0R3JhcGhpY0Jsb2NrOjpzdWJCbG9jayhjb25zdCBDMlJlY3QgJnJlY3QpIGNvbnN0IHsKKyAgICByZXR1cm4gQzJDb25zdEdyYXBoaWNCbG9jayhtSW1wbCwgQzJQbGFuYXJTZWN0aW9uKCptSW1wbCwgY3JvcCgpLmludGVyc2VjdChyZWN0KSksIG1GZW5jZSk7Cit9CisKKy8qKgorICogR3JhcGhpYyBibG9jayBpbXBsZW1lbnRhdGlvbi4KKyAqLworQzJHcmFwaGljQmxvY2s6OkMyR3JhcGhpY0Jsb2NrKAorICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBpbXBsLCBjb25zdCBfQzJQbGFuYXJTZWN0aW9uQXNwZWN0ICZzZWN0aW9uKQorICAgIDogQzJCbG9jazJEKGltcGwsIHNlY3Rpb24pIHsgfQorCitDMkFjcXVpcmFibGU8QzJHcmFwaGljVmlldz4gQzJHcmFwaGljQmxvY2s6Om1hcCgpIHsKKyAgICBDMkZlbmNlIGZlbmNlOworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJNYXBwaW5nQmxvY2syREltcGw6Ok1hcHBlZD4gbWFwcGluZyA9CisgICAgICAgIG1JbXBsLT5tYXAodHJ1ZSAvKiB3cml0YWJsZSAqLywgJmZlbmNlKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8R3JhcGhpY1ZpZXdCdWRkeTo6SW1wbD4gZ3ZpID0KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEdyYXBoaWNWaWV3QnVkZHk6OkltcGw+KG5ldyBHcmFwaGljVmlld0J1ZGR5OjpJbXBsKCptSW1wbCwgbWFwcGluZykpOworICAgIHJldHVybiBBY3F1aXJhYmxlR3JhcGhpY1ZpZXdCdWRkeSgKKyAgICAgICAgICAgIG1hcHBpbmctPmVycm9yKCksIGZlbmNlLCBHcmFwaGljVmlld0J1ZGR5KGd2aSwgQzJQbGFuYXJTZWN0aW9uKCptSW1wbCwgY3JvcCgpKSkpOworfQorCitDMkNvbnN0R3JhcGhpY0Jsb2NrIEMyR3JhcGhpY0Jsb2NrOjpzaGFyZShjb25zdCBDMlJlY3QgJmNyb3AsIEMyRmVuY2UgZmVuY2UpIHsKKyAgICByZXR1cm4gQ29uc3RHcmFwaGljQmxvY2tCdWRkeShtSW1wbCwgQzJQbGFuYXJTZWN0aW9uKCptSW1wbCwgY3JvcCksIGZlbmNlKTsKK30KKworLyoqCisgKiBCYXNpYyBibG9jayBwb29sIGltcGxlbWVudGF0aW9ucy4KKyAqLworQzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2w6OkMyQmFzaWNHcmFwaGljQmxvY2tQb29sKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpCisgIDogbUFsbG9jYXRvcihhbGxvY2F0b3IpIHt9CisKK2MyX3N0YXR1c190IEMyQmFzaWNHcmFwaGljQmxvY2tQb29sOjpmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgdWludDMyX3Qgd2lkdGgsCisgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSB7CisgICAgYmxvY2stPnJlc2V0KCk7CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+bmV3R3JhcGhpY0FsbG9jYXRpb24od2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJmFsbG9jKTsKKyAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgKmJsb2NrID0gX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MpOworCisgICAgcmV0dXJuIEMyX09LOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4gJmRhdGEsIGNvbnN0IEMyUmVjdCAmYWxsb3R0ZWRDcm9wKSB7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2syRDo6SW1wbD4gaW1wbCA9CisgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCbG9jazJEOjpJbXBsPihhbGxvYywgZGF0YSwgYWxsb3R0ZWRDcm9wKTsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPihuZXcgQzJHcmFwaGljQmxvY2soaW1wbCwgKmltcGwpKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+IF9DMkJsb2NrRmFjdG9yeTo6R2V0R3JhcGhpY0Jsb2NrUG9vbERhdGEoCisgICAgICAgIGNvbnN0IEMyQmxvY2syRCAmYmxvY2spIHsKKyAgICBpZiAoYmxvY2subUltcGwpIHsKKyAgICAgICAgcmV0dXJuIGJsb2NrLm1JbXBsLT5wb29sRGF0YSgpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jaygKKyAgICAgICAgY29uc3QgQzJIYW5kbGUgKmNIYW5kbGUsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxCdWZmZXJQb29sRGF0YT4gJmRhdGEpIHsKKyAgICAvLyBUT0RPOiBnZXQgcHJvcGVyIGFsbG9jYXRvcj8gYW5kIG11dGV4PworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QzJBbGxvY2F0b3JHcmFsbG9jPiBzQWxsb2NhdG9yID0gc3RkOjptYWtlX3VuaXF1ZTxDMkFsbG9jYXRvckdyYWxsb2M+KDApOworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+IGFsbG9jOworICAgIGlmIChDMkFsbG9jYXRvckdyYWxsb2M6OmlzVmFsaWQoY0hhbmRsZSkpIHsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gc0FsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihjSGFuZGxlLCAmYWxsb2MpOworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQb29sZWRCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbERhdGE+KGRhdGEpOworICAgICAgICBpZiAoZXJyID09IEMyX09LICYmIHBvb2xEYXRhKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBjb25maWcgc2V0dXA/CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrID0KKyAgICAgICAgICAgICAgICAgICAgX0MyQmxvY2tGYWN0b3J5OjpDcmVhdGVHcmFwaGljQmxvY2soYWxsb2MsIHBvb2xEYXRhKTsKKyAgICAgICAgICAgIHJldHVybiBibG9jazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK307CisKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IEJVRkZFUiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCitjbGFzcyBDMkJ1ZmZlckRhdGE6OkltcGwgeworcHVibGljOgorICAgIGV4cGxpY2l0IEltcGwoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKQorICAgICAgICA6IG1UeXBlKGJsb2Nrcy5zaXplKCkgPT0gMSA/IExJTkVBUiA6IExJTkVBUl9DSFVOS1MpLAorICAgICAgICAgIG1MaW5lYXJCbG9ja3MoYmxvY2tzKSB7CisgICAgfQorCisgICAgZXhwbGljaXQgSW1wbChjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmYmxvY2tzKQorICAgICAgICA6IG1UeXBlKGJsb2Nrcy5zaXplKCkgPT0gMSA/IEdSQVBISUMgOiBHUkFQSElDX0NIVU5LUyksCisgICAgICAgICAgbUdyYXBoaWNCbG9ja3MoYmxvY2tzKSB7CisgICAgfQorCisgICAgdHlwZV90IHR5cGUoKSBjb25zdCB7IHJldHVybiBtVHlwZTsgfQorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmxpbmVhckJsb2NrcygpIGNvbnN0IHsgcmV0dXJuIG1MaW5lYXJCbG9ja3M7IH0KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiAmZ3JhcGhpY0Jsb2NrcygpIGNvbnN0IHsgcmV0dXJuIG1HcmFwaGljQmxvY2tzOyB9CisKK3ByaXZhdGU6CisgICAgdHlwZV90IG1UeXBlOworICAgIHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gbUxpbmVhckJsb2NrczsKKyAgICBzdGQ6OnZlY3RvcjxDMkNvbnN0R3JhcGhpY0Jsb2NrPiBtR3JhcGhpY0Jsb2NrczsKK307CisKK0MyQnVmZmVyRGF0YTo6QzJCdWZmZXJEYXRhKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gJmJsb2NrcykgOiBtSW1wbChuZXcgSW1wbChibG9ja3MpKSB7fQorQzJCdWZmZXJEYXRhOjpDMkJ1ZmZlckRhdGEoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2NrcykgOiBtSW1wbChuZXcgSW1wbChibG9ja3MpKSB7fQorCitDMkJ1ZmZlckRhdGE6OnR5cGVfdCBDMkJ1ZmZlckRhdGE6OnR5cGUoKSBjb25zdCB7IHJldHVybiBtSW1wbC0+dHlwZSgpOyB9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RMaW5lYXJCbG9jaz4gQzJCdWZmZXJEYXRhOjpsaW5lYXJCbG9ja3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5saW5lYXJCbG9ja3MoKTsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gQzJCdWZmZXJEYXRhOjpncmFwaGljQmxvY2tzKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z3JhcGhpY0Jsb2NrcygpOworfQorCitjbGFzcyBDMkJ1ZmZlcjo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbChDMkJ1ZmZlciAqdGhpeiwgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKQorICAgICAgICA6IG1UaGlzKHRoaXopLCBtRGF0YShibG9ja3MpIHt9CisgICAgSW1wbChDMkJ1ZmZlciAqdGhpeiwgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdEdyYXBoaWNCbG9jaz4gJmJsb2NrcykKKyAgICAgICAgOiBtVGhpcyh0aGl6KSwgbURhdGEoYmxvY2tzKSB7fQorCisgICAgfkltcGwoKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcGFpciA6IG1Ob3RpZnkpIHsKKyAgICAgICAgICAgIHBhaXIuZmlyc3QobVRoaXMsIHBhaXIuc2Vjb25kKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IEMyQnVmZmVyRGF0YSAmZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1EYXRhOyB9CisKKyAgICBjMl9zdGF0dXNfdCByZWdpc3Rlck9uRGVzdHJveU5vdGlmeShPbkRlc3Ryb3lOb3RpZnkgb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcpIHsKKyAgICAgICAgYXV0byBpdCA9IHN0ZDo6ZmluZF9pZigKKyAgICAgICAgICAgICAgICBtTm90aWZ5LmJlZ2luKCksIG1Ob3RpZnkuZW5kKCksCisgICAgICAgICAgICAgICAgW29uRGVzdHJveU5vdGlmeSwgYXJnXSAoY29uc3QgYXV0byAmcGFpcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcGFpci5maXJzdCA9PSBvbkRlc3Ryb3lOb3RpZnkgJiYgcGFpci5zZWNvbmQgPT0gYXJnOworICAgICAgICAgICAgICAgIH0pOworICAgICAgICBpZiAoaXQgIT0gbU5vdGlmeS5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIEMyX0RVUExJQ0FURTsKKyAgICAgICAgfQorICAgICAgICBtTm90aWZ5LmVtcGxhY2VfYmFjayhvbkRlc3Ryb3lOb3RpZnksIGFyZyk7CisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCB1bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KE9uRGVzdHJveU5vdGlmeSBvbkRlc3Ryb3lOb3RpZnksIHZvaWQgKmFyZykgeworICAgICAgICBhdXRvIGl0ID0gc3RkOjpmaW5kX2lmKAorICAgICAgICAgICAgICAgIG1Ob3RpZnkuYmVnaW4oKSwgbU5vdGlmeS5lbmQoKSwKKyAgICAgICAgICAgICAgICBbb25EZXN0cm95Tm90aWZ5LCBhcmddIChjb25zdCBhdXRvICZwYWlyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBwYWlyLmZpcnN0ID09IG9uRGVzdHJveU5vdGlmeSAmJiBwYWlyLnNlY29uZCA9PSBhcmc7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmIChpdCA9PSBtTm90aWZ5LmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworICAgICAgICB9CisgICAgICAgIG1Ob3RpZnkuZXJhc2UoaXQpOworICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IGluZm8oKSBjb25zdCB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkluZm8+PiByZXN1bHQobUluZm9zLnNpemUoKSk7CisgICAgICAgIHN0ZDo6dHJhbnNmb3JtKAorICAgICAgICAgICAgICAgIG1JbmZvcy5iZWdpbigpLCBtSW5mb3MuZW5kKCksIHJlc3VsdC5iZWdpbigpLAorICAgICAgICAgICAgICAgIFtdIChjb25zdCBhdXRvICZlbGVtKSB7IHJldHVybiBlbGVtLnNlY29uZDsgfSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3Qgc2V0SW5mbyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiAmaW5mbykgeworICAgICAgICAvLyBUbyAidXBkYXRlIiB5b3UgbmVlZCB0byBlcmFzZSB0aGUgZXhpc3Rpbmcgb25lIGlmIGFueSwgYW5kIHRoZW4gaW5zZXJ0LgorICAgICAgICAodm9pZCkgbUluZm9zLmVyYXNlKGluZm8tPmNvcmVJbmRleCgpKTsKKyAgICAgICAgKHZvaWQpIG1JbmZvcy5pbnNlcnQoeyBpbmZvLT5jb3JlSW5kZXgoKSwgaW5mbyB9KTsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIGJvb2wgaGFzSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdCB7CisgICAgICAgIHJldHVybiBtSW5mb3MuY291bnQoaW5kZXguY29yZUluZGV4KCkpID4gMDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJJbmZvPiBnZXRJbmZvKEMyUGFyYW06OlR5cGUgaW5kZXgpIGNvbnN0IHsKKyAgICAgICAgYXV0byBpdCA9IG1JbmZvcy5maW5kKGluZGV4LmNvcmVJbmRleCgpKTsKKyAgICAgICAgaWYgKGl0ID09IG1JbmZvcy5lbmQoKSkgeworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0ZDo6Y29uc3RfcG9pbnRlcl9jYXN0PGNvbnN0IEMySW5mbz4oaXQtPnNlY29uZCk7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMySW5mbz4gcmVtb3ZlSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSB7CisgICAgICAgIGF1dG8gaXQgPSBtSW5mb3MuZmluZChpbmRleC5jb3JlSW5kZXgoKSk7CisgICAgICAgIGlmIChpdCA9PSBtSW5mb3MuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IHJldCA9IGl0LT5zZWNvbmQ7CisgICAgICAgICh2b2lkKSBtSW5mb3MuZXJhc2UoaXQpOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworcHJpdmF0ZToKKyAgICBDMkJ1ZmZlciAqIGNvbnN0IG1UaGlzOworICAgIEJ1ZmZlckRhdGFCdWRkeSBtRGF0YTsKKyAgICBzdGQ6Om1hcDxDMlBhcmFtOjpDb3JlSW5kZXgsIHN0ZDo6c2hhcmVkX3B0cjxDMkluZm8+PiBtSW5mb3M7CisgICAgc3RkOjpsaXN0PHN0ZDo6cGFpcjxPbkRlc3Ryb3lOb3RpZnksIHZvaWQgKj4+IG1Ob3RpZnk7Cit9OworCitDMkJ1ZmZlcjo6QzJCdWZmZXIoY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb25zdExpbmVhckJsb2NrPiAmYmxvY2tzKQorICAgIDogbUltcGwobmV3IEltcGwodGhpcywgYmxvY2tzKSkge30KKworQzJCdWZmZXI6OkMyQnVmZmVyKGNvbnN0IHN0ZDo6dmVjdG9yPEMyQ29uc3RHcmFwaGljQmxvY2s+ICZibG9ja3MpCisgICAgOiBtSW1wbChuZXcgSW1wbCh0aGlzLCBibG9ja3MpKSB7fQorCitjb25zdCBDMkJ1ZmZlckRhdGEgQzJCdWZmZXI6OmRhdGEoKSBjb25zdCB7IHJldHVybiBtSW1wbC0+ZGF0YSgpOyB9CisKK2MyX3N0YXR1c190IEMyQnVmZmVyOjpyZWdpc3Rlck9uRGVzdHJveU5vdGlmeShPbkRlc3Ryb3lOb3RpZnkgb25EZXN0cm95Tm90aWZ5LCB2b2lkICphcmcpIHsKKyAgICByZXR1cm4gbUltcGwtPnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KG9uRGVzdHJveU5vdGlmeSwgYXJnKTsKK30KKworYzJfc3RhdHVzX3QgQzJCdWZmZXI6OnVucmVnaXN0ZXJPbkRlc3Ryb3lOb3RpZnkoT25EZXN0cm95Tm90aWZ5IG9uRGVzdHJveU5vdGlmeSwgdm9pZCAqYXJnKSB7CisgICAgcmV0dXJuIG1JbXBsLT51bnJlZ2lzdGVyT25EZXN0cm95Tm90aWZ5KG9uRGVzdHJveU5vdGlmeSwgYXJnKTsKK30KKworY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4+IEMyQnVmZmVyOjppbmZvKCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+aW5mbygpOworfQorCitjMl9zdGF0dXNfdCBDMkJ1ZmZlcjo6c2V0SW5mbyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJJbmZvPiAmaW5mbykgeworICAgIHJldHVybiBtSW1wbC0+c2V0SW5mbyhpbmZvKTsKK30KKworYm9vbCBDMkJ1ZmZlcjo6aGFzSW5mbyhDMlBhcmFtOjpUeXBlIGluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5oYXNJbmZvKGluZGV4KTsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMySW5mbz4gQzJCdWZmZXI6OmdldEluZm8oQzJQYXJhbTo6VHlwZSBpbmRleCkgY29uc3QgeworICAgIHJldHVybiBtSW1wbC0+Z2V0SW5mbyhpbmRleCk7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkluZm8+IEMyQnVmZmVyOjpyZW1vdmVJbmZvKEMyUGFyYW06OlR5cGUgaW5kZXgpIHsKKyAgICByZXR1cm4gbUltcGwtPnJlbW92ZUluZm8oaW5kZXgpOworfQorCisvLyBzdGF0aWMKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gQzJCdWZmZXI6OkNyZWF0ZUxpbmVhckJ1ZmZlcihjb25zdCBDMkNvbnN0TGluZWFyQmxvY2sgJmJsb2NrKSB7CisgICAgcmV0dXJuIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4obmV3IEMyQnVmZmVyKHsgYmxvY2sgfSkpOworfQorCisvLyBzdGF0aWMKK3N0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlcj4gQzJCdWZmZXI6OkNyZWF0ZUdyYXBoaWNCdWZmZXIoY29uc3QgQzJDb25zdEdyYXBoaWNCbG9jayAmYmxvY2spIHsKKyAgICByZXR1cm4gc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyPihuZXcgQzJCdWZmZXIoeyBibG9jayB9KSk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL0MyQ29uZmlnLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL0MyQ29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDY4MGE3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJDb25maWcuY3BwCkBAIC0wLDAgKzEsMjYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkNvbmZpZyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworLyoqCisgKiBEZWZpbmUgYW5kIGluaXRpYWxpemUgZ2xvYmFsIGNvbmZpZyBmaWVsZCBkZXNjcmlwdG9ycyBpbiB0aGlzIGNwcCBmaWxlCisgKi8KKyNkZWZpbmUgX19DMl9HRU5FUkFURV9HTE9CQUxfVkFSU19fCisjaW5jbHVkZSA8QzJDb25maWcuaD4KKworREVGSU5FX0MyX0VOVU1fVkFMVUVfQ1VTVE9NX0hFTFBFUihDMkNvbmZpZzo6cHJvZmlsZV90LCAoeworICAgICAgICB7ICJ1bnVzZWQiLCBDMkNvbmZpZzo6UFJPRklMRV9VTlVTRUQgfSwKKyAgICAgICAgeyAiYWFjLWxjIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0xDIH0sCisgICAgICAgIHsgImFhYy1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX01BSU4gfSwKKyAgICAgICAgeyAiYWFjLXNzciIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19TU1IgfSwKKyAgICAgICAgeyAiYWFjLWx0cCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MVFAgfSwKKyAgICAgICAgeyAiYWFjLWhlIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0hFIH0sCisgICAgICAgIHsgImFhYy1zY2FsYWJsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19TQ0FMQUJMRSB9LAorICAgICAgICB7ICJhYWMtZXItbGMiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfRVJfTEMgfSwKKyAgICAgICAgeyAiYWFjLWVyLXNjYWxhYmxlIiwgQzJDb25maWc6OlBST0ZJTEVfQUFDX0VSX1NDQUxBQkxFIH0sCisgICAgICAgIHsgImFhYy1sZCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19MRCB9LAorICAgICAgICB7ICJhYWMtaGUtcHMiLCBDMkNvbmZpZzo6UFJPRklMRV9BQUNfSEVfUFMgfSwKKyAgICAgICAgeyAiYWFjLWVsZCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19FTEQgfSwKKyAgICAgICAgeyAiYWFjLXhoZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FBQ19YSEUgfSwKKyAgICAgICAgeyAibXAydi1zaW1wbGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NJTVBMRSB9LAorICAgICAgICB7ICJtcDJ2LW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX01BSU4gfSwKKyAgICAgICAgeyAibXAydi1zbnItc2NhbGFibGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDJWX1NOUl9TQ0FMQUJMRSB9LAorICAgICAgICB7ICJtcDJ2LXNwYXRpYWxseS1zY2FsYWJsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfU1BBVElBTExZX1NDQUxBQkxFIH0sCisgICAgICAgIHsgIm1wMnYtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfSElHSCB9LAorICAgICAgICB7ICJtcDJ2LTQyMiIsIEMyQ29uZmlnOjpQUk9GSUxFX01QMlZfNDIyIH0sCisgICAgICAgIHsgIm1wMnYtbXVsdGl2aWV3IiwgQzJDb25maWc6OlBST0ZJTEVfTVAyVl9NVUxUSVZJRVcgfSwKKyAgICAgICAgeyAiaDI2My1iYXNlbGluZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfQkFTRUxJTkUgfSwKKyAgICAgICAgeyAiaDI2My1oMzIwIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19IMzIwIH0sCisgICAgICAgIHsgImgyNjMtdjFiYyIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfVjFCQyB9LAorICAgICAgICB7ICJoMjYzLWlzd3YyIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JU1dWMiB9LAorICAgICAgICB7ICJoMjYzLWlzd3YzIiwgQzJDb25maWc6OlBST0ZJTEVfSDI2M19JU1dWMyB9LAorICAgICAgICB7ICJoMjYzLWhpZ2gtY29tcHJlc3Npb24iLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0hJR0hfQ09NUFJFU1NJT04gfSwKKyAgICAgICAgeyAiaDI2My1pbnRlcm5ldCIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSU5URVJORVQgfSwKKyAgICAgICAgeyAiaDI2My1pbnRlcmxhY2UiLCBDMkNvbmZpZzo6UFJPRklMRV9IMjYzX0lOVEVSTEFDRSB9LAorICAgICAgICB7ICJoMjYzLWhpZ2gtbGF0ZW5jeSIsIEMyQ29uZmlnOjpQUk9GSUxFX0gyNjNfSElHSF9MQVRFTkNZIH0sCisgICAgICAgIHsgIm1wNHYtc2ltcGxlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9TSU1QTEUgfSwKKyAgICAgICAgeyAibXA0di1zaW1wbGUtc2NhbGFibGUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX1NJTVBMRV9TQ0FMQUJMRSB9LAorICAgICAgICB7ICJtcDR2LWNvcmUiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0NPUkUgfSwKKyAgICAgICAgeyAibXA0di1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9NQUlOIH0sCisgICAgICAgIHsgIm1wNHYtbmJpdCIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfTkJJVCB9LAorICAgICAgICB7ICJtcDR2LWFydHMiLCBDMkNvbmZpZzo6UFJPRklMRV9NUDRWX0FSVFMgfSwKKyAgICAgICAgeyAibXA0di1jb3JlLXNjYWxhYmxlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9DT1JFX1NDQUxBQkxFIH0sCisgICAgICAgIHsgIm1wNHYtYWNlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BQ0UgfSwKKyAgICAgICAgeyAibXA0di1hZHZhbmNlZC1jb3JlIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9BRFZBTkNFRF9DT1JFIH0sCisgICAgICAgIHsgIm1wNHYtc2ltcGxlLXN0dWRpbyIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfU0lNUExFX1NUVURJTyB9LAorICAgICAgICB7ICJtcDR2LWNvcmUtc3R1ZGlvIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9DT1JFX1NUVURJTyB9LAorICAgICAgICB7ICJtcDR2LWFkdmFuY2VkLXNpbXBsZSIsIEMyQ29uZmlnOjpQUk9GSUxFX01QNFZfQURWQU5DRURfU0lNUExFIH0sCisgICAgICAgIHsgIm1wNHYtZmdzIiwgQzJDb25maWc6OlBST0ZJTEVfTVA0Vl9GR1MgfSwKKyAgICAgICAgeyAiYXZjLWJhc2VsaW5lIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0JBU0VMSU5FIH0sCisgICAgICAgIHsgImF2Yy1jb25zdHJhaW5lZC1iYXNlbGluZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19DT05TVFJBSU5FRF9CQVNFTElORSB9LAorICAgICAgICB7ICJhdmMtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19NQUlOIH0sCisgICAgICAgIHsgImF2Yy1leHRlbmRlZCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19FWFRFTkRFRCB9LAorICAgICAgICB7ICJhdmMtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIIH0sCisgICAgICAgIHsgImF2Yy1wcm9ncmVzc2l2ZS1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLWNvbnN0cmFpbmVkLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ09OU1RSQUlORURfSElHSCB9LAorICAgICAgICB7ICJhdmMtaGlnaC0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19ISUdIXzEwIH0sCisgICAgICAgIHsgImF2Yy1wcm9ncmVzc2l2ZS1oaWdoLTEwIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1BST0dSRVNTSVZFX0hJR0hfMTAgfSwKKyAgICAgICAgeyAiYXZjLWhpZ2gtNDIyIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDIyIH0sCisgICAgICAgIHsgImF2Yy1oaWdoLTQ0NC1wcmVkaWN0aXZlIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDQ0X1BSRURJQ1RJVkUgfSwKKyAgICAgICAgeyAiYXZjLWhpZ2gtMTAtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF8xMF9JTlRSQSB9LAorICAgICAgICB7ICJhdmMtaGlnaC00MjItaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfSElHSF80MjJfSU5UUkEgfSwKKyAgICAgICAgeyAiYXZjLWhpZ2gtNDQ0LWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX0hJR0hfNDQ0X0lOVFJBIH0sCisgICAgICAgIHsgImF2Yy1jYXZsYy00NDQtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfQ0FWTENfNDQ0X0lOVFJBIH0sCisgICAgICAgIHsgImF2Yy1zY2FsYWJsZS1iYXNlbGluZSIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19TQ0FMQUJMRV9CQVNFTElORSB9LAorICAgICAgICB7ICJhdmMtc2NhbGFibGUtY29uc3RyYWluZWQtYmFzZWxpbmUiLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfU0NBTEFCTEVfQ09OU1RSQUlORURfQkFTRUxJTkUgfSwKKyAgICAgICAgeyAiYXZjLXNjYWxhYmxlLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfU0NBTEFCTEVfSElHSCB9LAorICAgICAgICB7ICJhdmMtc2NhbGFibGUtY29uc3RyYWluZWQtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19TQ0FMQUJMRV9DT05TVFJBSU5FRF9ISUdIIH0sCisgICAgICAgIHsgImF2Yy1zY2FsYWJsZS1oaWdoLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX1NDQUxBQkxFX0hJR0hfSU5UUkEgfSwKKyAgICAgICAgeyAiYXZjLW11bHRpdmlldy1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX01VTFRJVklFV19ISUdIIH0sCisgICAgICAgIHsgImF2Yy1zdGVyZW8taGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19TVEVSRU9fSElHSCB9LAorICAgICAgICB7ICJhdmMtbWZjLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfTUZDX0hJR0ggfSwKKyAgICAgICAgeyAiYXZjLW11bHRpdmlldy1kZXB0aC1oaWdoIiwgQzJDb25maWc6OlBST0ZJTEVfQVZDX01VTFRJVklFV19ERVBUSF9ISUdIIH0sCisgICAgICAgIHsgImF2Yy1tZmMtZGVwdGgtaGlnaCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWQ19NRkNfREVQVEhfSElHSCB9LAorICAgICAgICB7ICJhdmMtZW5oYW5jZWQtbXVsdGl2aWV3LWRlcHRoLWhpZ2giLCBDMkNvbmZpZzo6UFJPRklMRV9BVkNfRU5IQU5DRURfTVVMVElWSUVXX0RFUFRIX0hJR0ggfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl8xMCB9LAorICAgICAgICB7ICJoZXZjLW1haW4tc3RpbGwiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fU1RJTEwgfSwKKyAgICAgICAgeyAiaGV2Yy1tb25vIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NT05PIH0sCisgICAgICAgIHsgImhldmMtbW9uby0xMiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTU9OT18xMiB9LAorICAgICAgICB7ICJoZXZjLW1vbm8tMTYiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01PTk9fMTYgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTEyIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEyIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00MjItMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDIyXzEwIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00MjItMTIiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDIyXzEyIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0IH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzEwIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTIiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzEyIH0sCisgICAgICAgIHsgImhldmMtbWFpbi1pbnRyYSIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTUFJTl9JTlRSQSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tMTAtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fMTBfSU5UUkEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTEyLWludHJhIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19NQUlOXzEyX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00MjItMTAtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDIyXzEwX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00MjItMTItaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDIyXzEyX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0X0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTAtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzEwX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTItaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzEyX0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTYtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzE2X0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtc3RpbGwiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0X1NUSUxMIH0sCisgICAgICAgIHsgImhldmMtbWFpbi00NDQtMTYtc3RpbGwiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX01BSU5fNDQ0XzE2X1NUSUxMIH0sCisgICAgICAgIHsgImhldmMtaGlnaC00NDQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX0hJR0hfNDQ0IH0sCisgICAgICAgIHsgImhldmMtaGlnaC00NDQtMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX0hJR0hfNDQ0XzEwIH0sCisgICAgICAgIHsgImhldmMtaGlnaC00NDQtMTQiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX0hJR0hfNDQ0XzE0IH0sCisgICAgICAgIHsgImhldmMtaGlnaC00NDQtMTYtaW50cmEiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX0hJR0hfNDQ0XzE2X0lOVFJBIH0sCisgICAgICAgIHsgImhldmMtc3gtbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfTUFJTiB9LAorICAgICAgICB7ICJoZXZjLXN4LW1haW4tMTAiLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NYX01BSU5fMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1tYWluLTQ0NCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfTUFJTl80NDQgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1tYWluLTQ0NC0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfTUFJTl80NDRfMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1oaWdoLTQ0NCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfSElHSF80NDQgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1oaWdoLTQ0NC0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfSElHSF80NDRfMTAgfSwKKyAgICAgICAgeyAiaGV2Yy1zeC1oaWdoLTQ0NC0xNCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU1hfSElHSF80NDRfMTQgfSwKKyAgICAgICAgeyAiaGV2Yy1tdWx0aXZpZXctbWFpbiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfTVVMVElWSUVXX01BSU4gfSwKKyAgICAgICAgeyAiaGV2Yy1zY2FsYWJsZS1tYWluIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NQUlOIH0sCisgICAgICAgIHsgImhldmMtc2NhbGFibGUtbWFpbi0xMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTUFJTl8xMCB9LAorICAgICAgICB7ICJoZXZjLXNjYWxhYmxlLW1vbm8iLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDX1NDQUxBQkxFX01PTk8gfSwKKyAgICAgICAgeyAiaGV2Yy1zY2FsYWJsZS1tb25vLTEyIiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NT05PXzEyIH0sCisgICAgICAgIHsgImhldmMtc2NhbGFibGUtbW9uby0xNiIsIEMyQ29uZmlnOjpQUk9GSUxFX0hFVkNfU0NBTEFCTEVfTU9OT18xNiB9LAorICAgICAgICB7ICJoZXZjLXNjYWxhYmxlLW1haW4tNDQ0IiwgQzJDb25maWc6OlBST0ZJTEVfSEVWQ19TQ0FMQUJMRV9NQUlOXzQ0NCB9LAorICAgICAgICB7ICJoZXZjLTNkLW1haW4iLCBDMkNvbmZpZzo6UFJPRklMRV9IRVZDXzNEX01BSU4gfSwKKyAgICAgICAgeyAidnA5LTAiLCBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMCB9LAorICAgICAgICB7ICJ2cDktMSIsIEMyQ29uZmlnOjpQUk9GSUxFX1ZQOV8xIH0sCisgICAgICAgIHsgInZwOS0yIiwgQzJDb25maWc6OlBST0ZJTEVfVlA5XzIgfSwKKyAgICAgICAgeyAidnA5LTMiLCBDMkNvbmZpZzo6UFJPRklMRV9WUDlfMyB9LAorICAgICAgICB7ICJhdjEtMCIsIEMyQ29uZmlnOjpQUk9GSUxFX0FWMV8wIH0sCisgICAgICAgIHsgImF2MS0xIiwgQzJDb25maWc6OlBST0ZJTEVfQVYxXzEgfSwKKyAgICAgICAgeyAiYXYxLTIiLCBDMkNvbmZpZzo6UFJPRklMRV9BVjFfMiB9LAorfSkpCisKK0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoQzJDb25maWc6OmxldmVsX3QsICh7CisgICAgICAgIHsgInVudXNlZCIsIEMyQ29uZmlnOjpMRVZFTF9VTlVTRUQgfSwKKyAgICAgICAgeyAibXAydi1sb3ciLCBDMkNvbmZpZzo6TEVWRUxfTVAyVl9MT1cgfSwKKyAgICAgICAgeyAibXAydi1tYWluIiwgQzJDb25maWc6OkxFVkVMX01QMlZfTUFJTiB9LAorICAgICAgICB7ICJtcDJ2LWhpZ2gtMTQ0MCIsIEMyQ29uZmlnOjpMRVZFTF9NUDJWX0hJR0hfMTQ0MCB9LAorICAgICAgICB7ICJtcDJ2LWhpZ2giLCBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIIH0sCisgICAgICAgIHsgIm1wMnYtaGlnaHAiLCBDMkNvbmZpZzo6TEVWRUxfTVAyVl9ISUdIUCB9LAorICAgICAgICB7ICJoMjYzLTEwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfMTAgfSwKKyAgICAgICAgeyAiaDI2My0yMCIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzIwIH0sCisgICAgICAgIHsgImgyNjMtMzAiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M18zMCB9LAorICAgICAgICB7ICJoMjYzLTQwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfNDAgfSwKKyAgICAgICAgeyAiaDI2My00NSIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzQ1IH0sCisgICAgICAgIHsgImgyNjMtNTAiLCBDMkNvbmZpZzo6TEVWRUxfSDI2M181MCB9LAorICAgICAgICB7ICJoMjYzLTYwIiwgQzJDb25maWc6OkxFVkVMX0gyNjNfNjAgfSwKKyAgICAgICAgeyAiaDI2My03MCIsIEMyQ29uZmlnOjpMRVZFTF9IMjYzXzcwIH0sCisgICAgICAgIHsgIm1wNHYtMCIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzAgfSwKKyAgICAgICAgeyAibXA0di0wYiIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzBCIH0sCisgICAgICAgIHsgIm1wNHYtMSIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzEgfSwKKyAgICAgICAgeyAibXA0di0yIiwgQzJDb25maWc6OkxFVkVMX01QNFZfMiB9LAorICAgICAgICB7ICJtcDR2LTMiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8zIH0sCisgICAgICAgIHsgIm1wNHYtM2IiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl8zQiB9LAorICAgICAgICB7ICJtcDR2LTQiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80IH0sCisgICAgICAgIHsgIm1wNHYtNGEiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl80QSB9LAorICAgICAgICB7ICJtcDR2LTUiLCBDMkNvbmZpZzo6TEVWRUxfTVA0Vl81IH0sCisgICAgICAgIHsgIm1wNHYtNiIsIEMyQ29uZmlnOjpMRVZFTF9NUDRWXzYgfSwKKyAgICAgICAgeyAiYXZjLTEiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzEgfSwKKyAgICAgICAgeyAiYXZjLTFiIiwgQzJDb25maWc6OkxFVkVMX0FWQ18xQiB9LAorICAgICAgICB7ICJhdmMtMS4xIiwgQzJDb25maWc6OkxFVkVMX0FWQ18xXzEgfSwKKyAgICAgICAgeyAiYXZjLTEuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMV8yIH0sCisgICAgICAgIHsgImF2Yy0xLjMiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzFfMyB9LAorICAgICAgICB7ICJhdmMtMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMiB9LAorICAgICAgICB7ICJhdmMtMi4xIiwgQzJDb25maWc6OkxFVkVMX0FWQ18yXzEgfSwKKyAgICAgICAgeyAiYXZjLTIuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfMl8yIH0sCisgICAgICAgIHsgImF2Yy0zIiwgQzJDb25maWc6OkxFVkVMX0FWQ18zIH0sCisgICAgICAgIHsgImF2Yy0zLjEiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzNfMSB9LAorICAgICAgICB7ICJhdmMtMy4yIiwgQzJDb25maWc6OkxFVkVMX0FWQ18zXzIgfSwKKyAgICAgICAgeyAiYXZjLTQiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzQgfSwKKyAgICAgICAgeyAiYXZjLTQuMSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNF8xIH0sCisgICAgICAgIHsgImF2Yy00LjIiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzRfMiB9LAorICAgICAgICB7ICJhdmMtNSIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNSB9LAorICAgICAgICB7ICJhdmMtNS4xIiwgQzJDb25maWc6OkxFVkVMX0FWQ181XzEgfSwKKyAgICAgICAgeyAiYXZjLTUuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVkNfNV8yIH0sCisgICAgICAgIHsgImF2Yy02IiwgQzJDb25maWc6OkxFVkVMX0FWQ182IH0sCisgICAgICAgIHsgImF2Yy02LjEiLCBDMkNvbmZpZzo6TEVWRUxfQVZDXzZfMSB9LAorICAgICAgICB7ICJhdmMtNi4yIiwgQzJDb25maWc6OkxFVkVMX0FWQ182XzIgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTIiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzIgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTIuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fMl8xIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0zIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl8zIH0sCisgICAgICAgIHsgImhldmMtbWFpbi0zLjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzNfMSB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNCIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNCB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNC4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl80XzEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTUiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzUgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTUuMSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNV8xIH0sCisgICAgICAgIHsgImhldmMtbWFpbi01LjIiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19NQUlOXzVfMiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNiB9LAorICAgICAgICB7ICJoZXZjLW1haW4tNi4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfTUFJTl82XzEgfSwKKyAgICAgICAgeyAiaGV2Yy1tYWluLTYuMiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX01BSU5fNl8yIH0sCisgICAgICAgIHsgImhldmMtaGlnaC00IiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF80IH0sCisgICAgICAgIHsgImhldmMtaGlnaC00LjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzRfMSB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNSIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNSB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNS4xIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF81XzEgfSwKKyAgICAgICAgeyAiaGV2Yy1oaWdoLTUuMiIsIEMyQ29uZmlnOjpMRVZFTF9IRVZDX0hJR0hfNV8yIH0sCisgICAgICAgIHsgImhldmMtaGlnaC02IiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF82IH0sCisgICAgICAgIHsgImhldmMtaGlnaC02LjEiLCBDMkNvbmZpZzo6TEVWRUxfSEVWQ19ISUdIXzZfMSB9LAorICAgICAgICB7ICJoZXZjLWhpZ2gtNi4yIiwgQzJDb25maWc6OkxFVkVMX0hFVkNfSElHSF82XzIgfSwKKyAgICAgICAgeyAidnA5LTEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzEgfSwKKyAgICAgICAgeyAidnA5LTEuMSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfMV8xIH0sCisgICAgICAgIHsgInZwOS0yIiwgQzJDb25maWc6OkxFVkVMX1ZQOV8yIH0sCisgICAgICAgIHsgInZwOS0yLjEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzJfMSB9LAorICAgICAgICB7ICJ2cDktMyIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfMyB9LAorICAgICAgICB7ICJ2cDktMy4xIiwgQzJDb25maWc6OkxFVkVMX1ZQOV8zXzEgfSwKKyAgICAgICAgeyAidnA5LTQiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzQgfSwKKyAgICAgICAgeyAidnA5LTQuMSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNF8xIH0sCisgICAgICAgIHsgInZwOS01IiwgQzJDb25maWc6OkxFVkVMX1ZQOV81IH0sCisgICAgICAgIHsgInZwOS01LjEiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzVfMSB9LAorICAgICAgICB7ICJ2cDktNS4yIiwgQzJDb25maWc6OkxFVkVMX1ZQOV81XzIgfSwKKyAgICAgICAgeyAidnA5LTYiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzYgfSwKKyAgICAgICAgeyAidnA5LTYuMSIsIEMyQ29uZmlnOjpMRVZFTF9WUDlfNl8xIH0sCisgICAgICAgIHsgInZwOS02LjIiLCBDMkNvbmZpZzo6TEVWRUxfVlA5XzZfMiB9LAorICAgICAgICB7ICJhdjEtMiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfMiB9LAorICAgICAgICB7ICJhdjEtMi4xIiwgQzJDb25maWc6OkxFVkVMX0FWMV8yXzEgfSwKKyAgICAgICAgeyAiYXYxLTIuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfMl8yIH0sCisgICAgICAgIHsgImF2MS0yLjMiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzJfMyB9LAorICAgICAgICB7ICJhdjEtMyIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfMyB9LAorICAgICAgICB7ICJhdjEtMy4xIiwgQzJDb25maWc6OkxFVkVMX0FWMV8zXzEgfSwKKyAgICAgICAgeyAiYXYxLTMuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfM18yIH0sCisgICAgICAgIHsgImF2MS0zLjMiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzNfMyB9LAorICAgICAgICB7ICJhdjEtNCIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNCB9LAorICAgICAgICB7ICJhdjEtNC4xIiwgQzJDb25maWc6OkxFVkVMX0FWMV80XzEgfSwKKyAgICAgICAgeyAiYXYxLTQuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNF8yIH0sCisgICAgICAgIHsgImF2MS00LjMiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzRfMyB9LAorICAgICAgICB7ICJhdjEtNSIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNSB9LAorICAgICAgICB7ICJhdjEtNS4xIiwgQzJDb25maWc6OkxFVkVMX0FWMV81XzEgfSwKKyAgICAgICAgeyAiYXYxLTUuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNV8yIH0sCisgICAgICAgIHsgImF2MS01LjMiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzVfMyB9LAorICAgICAgICB7ICJhdjEtNiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNiB9LAorICAgICAgICB7ICJhdjEtNi4xIiwgQzJDb25maWc6OkxFVkVMX0FWMV82XzEgfSwKKyAgICAgICAgeyAiYXYxLTYuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNl8yIH0sCisgICAgICAgIHsgImF2MS02LjMiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzZfMyB9LAorICAgICAgICB7ICJhdjEtNyIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfNyB9LAorICAgICAgICB7ICJhdjEtNy4xIiwgQzJDb25maWc6OkxFVkVMX0FWMV83XzEgfSwKKyAgICAgICAgeyAiYXYxLTcuMiIsIEMyQ29uZmlnOjpMRVZFTF9BVjFfN18yIH0sCisgICAgICAgIHsgImF2MS03LjMiLCBDMkNvbmZpZzo6TEVWRUxfQVYxXzdfMyB9LAorfSkpCisKK0RFRklORV9DMl9FTlVNX1ZBTFVFX0NVU1RPTV9IRUxQRVIoQzJCdWZmZXJEYXRhOjp0eXBlX3QsICh7CisgICAgICAgIHsgImludmFsaWQiLCAgICAgICAgQzJCdWZmZXJEYXRhOjpJTlZBTElEIH0sCisgICAgICAgIHsgImxpbmVhciIsICAgICAgICAgQzJCdWZmZXJEYXRhOjpMSU5FQVIgfSwKKyAgICAgICAgeyAibGluZWFyLWNodW5rcyIsICBDMkJ1ZmZlckRhdGE6OkxJTkVBUl9DSFVOS1MgfSwKKyAgICAgICAgeyAiZ3JhcGhpYyIsICAgICAgICBDMkJ1ZmZlckRhdGE6OkdSQVBISUMgfSwKKyAgICAgICAgeyAiZ3JhcGhpYy1jaHVua3MiLCBDMkJ1ZmZlckRhdGE6OkdSQVBISUNfQ0hVTktTIH0sCit9KSkKKworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9DMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzMzMGU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmNwcApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIiCisKKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIuaCIKKworLyogc3RhdGljICovIGFuZHJvaWQ6Ok11dGV4IEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6c011dGV4OworLyogc3RhdGljICovIHN0ZDo6dW5pcXVlX3B0cjxDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI+IEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6c0luc3RhbmNlOworCituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK2NvbnN0ZXhwciBjb25zdCBjaGFyIGtTdG9yZVBsdWdpblBhdGhbXSA9ICJsaWJjMnBsdWdpbl9zdG9yZS5zbyI7CisKK30gIC8vIHVubmFtZWQKKworQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjpDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIoY29uc3QgY2hhciAqbGliUGF0aCkKKyAgICA6IG1DcmVhdGVCbG9ja1Bvb2wobnVsbHB0cikgeworICAgIG1MaWJIYW5kbGUgPSBkbG9wZW4obGliUGF0aCwgUlRMRF9OT1cgfCBSVExEX05PREVMRVRFKTsKKyAgICBpZiAobUxpYkhhbmRsZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJGYWlsZWQgdG8gbG9hZCBsaWJyYXJ5OiAlcyAoJXMpIiwgbGliUGF0aCwgZGxlcnJvcigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQ3JlYXRlQmxvY2tQb29sID0gKENyZWF0ZUJsb2NrUG9vbEZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIkNyZWF0ZUJsb2NrUG9vbCIpOworICAgIGlmIChtQ3JlYXRlQmxvY2tQb29sID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBmaW5kIHN5bWJvbDogQ3JlYXRlQmxvY2tQb29sICglcykiLCBkbGVycm9yKCkpOworICAgIH0KKyAgICBtQ3JlYXRlQWxsb2NhdG9yID0gKENyZWF0ZUFsbG9jYXRvckZ1bmMpZGxzeW0obUxpYkhhbmRsZSwgIkNyZWF0ZUFsbG9jYXRvciIpOworICAgIGlmIChtQ3JlYXRlQWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBmaW5kIHN5bWJvbDogQ3JlYXRlQWxsb2NhdG9yICglcykiLCBkbGVycm9yKCkpOworICAgIH0KK30KKworQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyOjp+QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyKCkgeworICAgIGlmIChtTGliSGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIkNsb3NpbmcgaGFuZGxlIik7CisgICAgICAgIGRsY2xvc2UobUxpYkhhbmRsZSk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgOjpDMkFsbG9jYXRvcjo6aWRfdCBhbGxvY2F0b3JJZCwgOjpDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCBibG9ja1Bvb2xJZCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiogcG9vbCkgeworICAgIGlmIChtQ3JlYXRlQmxvY2tQb29sID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0QoIkhhbmRsZSBvciBDcmVhdGVCbG9ja1Bvb2wgc3ltYm9sIGlzIG51bGwiKTsKKyAgICAgICAgcmV0dXJuIEMyX05PVF9GT1VORDsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8OjpDMkJsb2NrUG9vbD4gcHRyKG1DcmVhdGVCbG9ja1Bvb2woYWxsb2NhdG9ySWQsIGJsb2NrUG9vbElkKSk7CisgICAgaWYgKHB0cikgeworICAgICAgICAqcG9vbCA9IHB0cjsKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKyAgICBBTE9HRCgiRmFpbGVkIHRvIENyZWF0ZUJsb2NrUG9vbCBieSBhbGxvY2F0b3IgaWQ6ICV1IiwgYWxsb2NhdG9ySWQpOworICAgIHJldHVybiBDMl9CQURfSU5ERVg7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6Y3JlYXRlQWxsb2NhdG9yKAorICAgICAgICA6OkMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkLCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+KiBjb25zdCBhbGxvY2F0b3IpIHsKKyAgICBpZiAobUNyZWF0ZUFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJIYW5kbGUgb3IgQ3JlYXRlQWxsb2NhdG9yIHN5bWJvbCBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBDMl9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgcmVzID0gQzJfQ09SUlVQVEVEOworICAgIGFsbG9jYXRvci0+cmVzZXQobUNyZWF0ZUFsbG9jYXRvcihhbGxvY2F0b3JJZCwgJnJlcykpOworICAgIGlmIChyZXMgIT0gQzJfT0spIHsKKyAgICAgICAgQUxPR0QoIkZhaWxlZCB0byBDcmVhdGVBbGxvY2F0b3IgYnkgaWQ6ICV1LCByZXM6ICVkIiwgYWxsb2NhdG9ySWQsIHJlcyk7CisgICAgICAgIGFsbG9jYXRvci0+cmVzZXQoKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgcmV0dXJuIEMyX09LOworfQorCisvLyBzdGF0aWMKK2NvbnN0IHN0ZDo6dW5pcXVlX3B0cjxDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI+JiBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OkdldEluc3RhbmNlKCkgeworICAgIGFuZHJvaWQ6Ok11dGV4OjpBdXRvbG9jayBfbChzTXV0ZXgpOworICAgIGlmICghc0luc3RhbmNlKSB7CisgICAgICAgIEFMT0dWKCJMb2FkaW5nIGxpYnJhcnkiKTsKKyAgICAgICAgc0luc3RhbmNlLnJlc2V0KG5ldyBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXIoa1N0b3JlUGx1Z2luUGF0aCkpOworICAgIH0KKyAgICByZXR1cm4gc0luc3RhbmNlOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvQzJTdG9yZS5jcHAgYi9tZWRpYS9jb2RlYzIvdm5kay9DMlN0b3JlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDQwOGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvQzJTdG9yZS5jcHAKQEAgLTAsMCArMSwxMDIzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDMlN0b3JlIgorI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9yR3JhbGxvYy5oPgorI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJCdWZmZXJQcml2Lmg+CisjaW5jbHVkZSA8QzJCcUJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29uZmlnLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmg+CisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDx1dGlsL0MySW50ZXJmYWNlSGVscGVyLmg+CisKKyNpbmNsdWRlIDxkbGZjbi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPiAvLyBnZXRwYWdlc2l6ZQorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKworI2lmZGVmIF9fQU5EUk9JRF9BUEVYX18KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBSZXR1cm5zIHRoZSBwcmVmZXJyZWQgY29tcG9uZW50IHN0b3JlIGluIHRoaXMgcHJvY2VzcyB0byBhY2Nlc3MgaXRzIGludGVyZmFjZS4KKyAqLworc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IEdldFByZWZlcnJlZENvZGVjMkNvbXBvbmVudFN0b3JlKCk7CisKKy8qKgorICogVGhlIHBsYXRmb3JtIGFsbG9jYXRvciBzdG9yZSBwcm92aWRlcyBiYXNpYyBhbGxvY2F0b3ItdHlwZXMgZm9yIHRoZSBmcmFtZXdvcmsgYmFzZWQgb24gaW9uIGFuZAorICogZ3JhbGxvYy4gQWxsb2NhdG9ycyBhcmUgbm90IG1lYW50IHRvIGJlIHVwZGF0YWJsZS4KKyAqCisgKiBcdG9kbyBQcm92aWRlIGFsbG9jYXRvciBiYXNlZCBvbiBhc2htZW0KKyAqIFx0b2RvIE1vdmUgaW9uIGFsbG9jYXRpb24gaW50byBpdHMgSElETCBvciBwcm92aWRlIHNvbWUgbWFwcGluZyBmcm9tIG1lbW9yeSB1c2FnZSB0byBpb24gZmxhZ3MKKyAqIFx0b2RvIE1ha2UgdGhpcyBhbGxvY2F0b3Igc3RvcmUgZXh0ZW5kYWJsZQorICovCitjbGFzcyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsIDogcHVibGljIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSB7CitwdWJsaWM6CisgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbCgpOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaEFsbG9jYXRvcigKKyAgICAgICAgICAgIGlkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gKmNvbnN0IGFsbG9jYXRvcikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkFsbG9jYXRvcjo6VHJhaXRzPj4gbGlzdEFsbG9jYXRvcnNfbmIoKQorICAgICAgICAgICAgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQWxsb2NhdG9yOjpUcmFpdHM+PigpOyAvLy8gXHRvZG8KKyAgICB9CisKKyAgICB2aXJ0dWFsIEMyU3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiAiYW5kcm9pZC5hbGxvY2F0b3Itc3RvcmUiOworICAgIH0KKworICAgIHZvaWQgc2V0Q29tcG9uZW50U3RvcmUoc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHN0b3JlKTsKKworICAgIH5DMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCitwcml2YXRlOgorICAgIC8vLyByZXR1cm5zIGEgc2hhcmVkLXNpbmdsZXRvbiBpb24gYWxsb2NhdG9yCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBmZXRjaElvbkFsbG9jYXRvcigpOworCisgICAgLy8vIHJldHVybnMgYSBzaGFyZWQtc2luZ2xldG9uIGdyYWxsb2MgYWxsb2NhdG9yCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBmZXRjaEdyYWxsb2NBbGxvY2F0b3IoKTsKKworICAgIC8vLyByZXR1cm5zIGEgc2hhcmVkLXNpbmdsZXRvbiBidWZmZXJxdWV1ZSBzdXBwb3J0aW5nIGdyYWxsb2MgYWxsb2NhdG9yCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBmZXRjaEJ1ZmZlclF1ZXVlQWxsb2NhdG9yKCk7CisKKyAgICAvLy8gY29tcG9uZW50IHN0b3JlIHRvIHVzZQorICAgIHN0ZDo6bXV0ZXggX21Db21wb25lbnRTdG9yZVNldExvY2s7IC8vIHByb3RlY3RzIHRoZSBlbnRpcmUgdXBkYXRpbmcgX21Db21wb25lbnRTdG9yZSBhbmQgaXRzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVwZW5kZW5jaWVzCisgICAgc3RkOjptdXRleCBfbUNvbXBvbmVudFN0b3JlUmVhZExvY2s7IC8vIG11c3QgcHJvdGVjdCBvbmx5IHJlYWQvd3JpdGUgb2YgX21Db21wb25lbnRTdG9yZQorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBfbUNvbXBvbmVudFN0b3JlOworfTsKKworQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbCgpIHsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6ZmV0Y2hBbGxvY2F0b3IoCisgICAgICAgIGlkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gKmNvbnN0IGFsbG9jYXRvcikgeworICAgIGFsbG9jYXRvci0+cmVzZXQoKTsKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgLy8gVE9ETzogc2hvdWxkIHdlIGltcGxlbWVudCBhIGdlbmVyaWMgcmVnaXN0cnkgZm9yIGFsbCwgYW5kIHVzZSB0aGF0PworICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpJT046CisgICAgY2FzZSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUjoKKyAgICAgICAgKmFsbG9jYXRvciA9IGZldGNoSW9uQWxsb2NhdG9yKCk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkdSQUxMT0M6CisgICAgY2FzZSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0dSQVBISUM6CisgICAgICAgICphbGxvY2F0b3IgPSBmZXRjaEdyYWxsb2NBbGxvY2F0b3IoKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUU6CisgICAgICAgICphbGxvY2F0b3IgPSBmZXRjaEJ1ZmZlclF1ZXVlQWxsb2NhdG9yKCk7CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gVHJ5IHRvIGNyZWF0ZSBhbGxvY2F0b3IgZnJvbSBwbGF0Zm9ybSBzdG9yZSBwbHVnaW5zLgorICAgICAgICBjMl9zdGF0dXNfdCByZXMgPQorICAgICAgICAgICAgICAgIEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcjo6R2V0SW5zdGFuY2UoKS0+Y3JlYXRlQWxsb2NhdG9yKGlkLCBhbGxvY2F0b3IpOworICAgICAgICBpZiAocmVzICE9IEMyX09LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICBpZiAoKmFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBDMl9OT19NRU1PUlk7CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworbmFtZXNwYWNlIHsKKworc3RkOjptdXRleCBnSW9uQWxsb2NhdG9yTXV0ZXg7CitzdGQ6OndlYWtfcHRyPEMyQWxsb2NhdG9ySW9uPiBnSW9uQWxsb2NhdG9yOworCit2b2lkIFVzZUNvbXBvbmVudFN0b3JlRm9ySW9uQWxsb2NhdG9yKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JJb24+IGFsbG9jYXRvciwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHN0b3JlKSB7CisgICAgQzJBbGxvY2F0b3JJb246OlVzYWdlTWFwcGVyRm4gbWFwcGVyOworICAgIHVpbnQ2NF90IG1pblVzYWdlID0gMDsKKyAgICB1aW50NjRfdCBtYXhVc2FnZSA9IEMyTWVtb3J5VXNhZ2UoQzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURSkuZXhwZWN0ZWQ7CisgICAgc2l6ZV90IGJsb2NrU2l6ZSA9IGdldHBhZ2VzaXplKCk7CisKKyAgICAvLyBxdWVyeSBtaW4gYW5kIG1heCB1c2FnZSBhcyB3ZWxsIGFzIGJsb2NrIHNpemUgdmlhIHN1cHBvcnRlZCB2YWx1ZXMKKyAgICBDMlN0b3JlSW9uVXNhZ2VJbmZvIHVzYWdlSW5mbzsKKyAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+IHF1ZXJ5ID0geworICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBvc3NpYmxlKEMyUGFyYW1GaWVsZDo6TWFrZSh1c2FnZUluZm8sIHVzYWdlSW5mby51c2FnZSkpLAorICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk6OlBvc3NpYmxlKEMyUGFyYW1GaWVsZDo6TWFrZSh1c2FnZUluZm8sIHVzYWdlSW5mby5jYXBhY2l0eSkpLAorICAgIH07CisgICAgYzJfc3RhdHVzX3QgcmVzID0gc3RvcmUtPnF1ZXJ5U3VwcG9ydGVkVmFsdWVzX3NtKHF1ZXJ5KTsKKyAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgIGlmIChxdWVyeVswXS5zdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJmZzdiA9IHF1ZXJ5WzBdLnZhbHVlczsKKyAgICAgICAgICAgIGlmIChmc3YudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUyAmJiAhZnN2LnZhbHVlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgbWluVXNhZ2UgPSBmc3YudmFsdWVzWzBdLnU2NDsKKyAgICAgICAgICAgICAgICBtYXhVc2FnZSA9IDA7CisgICAgICAgICAgICAgICAgZm9yIChDMlZhbHVlOjpQcmltaXRpdmUgdiA6IGZzdi52YWx1ZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbWF4VXNhZ2UgfD0gdi51NjQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChxdWVyeVsxXS5zdGF0dXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJmZzdiA9IHF1ZXJ5WzFdLnZhbHVlczsKKyAgICAgICAgICAgIGlmIChmc3YudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpSQU5HRSAmJiBmc3YucmFuZ2Uuc3RlcC51MzIgPiAwKSB7CisgICAgICAgICAgICAgICAgYmxvY2tTaXplID0gZnN2LnJhbmdlLnN0ZXAudTMyOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgbWFwcGVyID0gW3N0b3JlXShDMk1lbW9yeVVzYWdlIHVzYWdlLCBzaXplX3QgY2FwYWNpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICphbGlnbiwgdW5zaWduZWQgKmhlYXBNYXNrLCB1bnNpZ25lZCAqZmxhZ3MpIC0+IGMyX3N0YXR1c190IHsKKyAgICAgICAgICAgIGlmIChjYXBhY2l0eSA+IFVJTlQzMl9NQVgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQzJTdG9yZUlvblVzYWdlSW5mbyB1c2FnZUluZm8gPSB7IHVzYWdlLmV4cGVjdGVkLCBjYXBhY2l0eSB9OworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOyAvLyBUT0RPOiByZW1vdmUKKyAgICAgICAgICAgIGMyX3N0YXR1c190IHJlcyA9IHN0b3JlLT5jb25maWdfc20oeyZ1c2FnZUluZm99LCAmZmFpbHVyZXMpOworICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICphbGlnbiA9IHVzYWdlSW5mby5taW5BbGlnbm1lbnQ7CisgICAgICAgICAgICAgICAgKmhlYXBNYXNrID0gdXNhZ2VJbmZvLmhlYXBNYXNrOworICAgICAgICAgICAgICAgICpmbGFncyA9IHVzYWdlSW5mby5hbGxvY0ZsYWdzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfTsKKyAgICB9CisKKyAgICBhbGxvY2F0b3ItPnNldFVzYWdlTWFwcGVyKG1hcHBlciwgbWluVXNhZ2UsIG1heFVzYWdlLCBibG9ja1NpemUpOworfQorCit9CisKK3ZvaWQgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6c2V0Q29tcG9uZW50U3RvcmUoc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHN0b3JlKSB7CisgICAgLy8gdGVjaG5pY2FsbHkgdGhpcyBzZXQgbG9jayBpcyBub3QgbmVlZGVkLCBidXQgaXMgaGVyZSBmb3Igc2FmZXR5IGluIGNhc2Ugd2UgYWRkIG1vcmUKKyAgICAvLyBnZXR0ZXIgb3JkZXJzCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soX21Db21wb25lbnRTdG9yZVNldExvY2spOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soX21Db21wb25lbnRTdG9yZVJlYWRMb2NrKTsKKyAgICAgICAgX21Db21wb25lbnRTdG9yZSA9IHN0b3JlOworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JJb24+IGFsbG9jYXRvcjsKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKGdJb25BbGxvY2F0b3JNdXRleCk7CisgICAgICAgIGFsbG9jYXRvciA9IGdJb25BbGxvY2F0b3IubG9jaygpOworICAgIH0KKyAgICBpZiAoYWxsb2NhdG9yKSB7CisgICAgICAgIFVzZUNvbXBvbmVudFN0b3JlRm9ySW9uQWxsb2NhdG9yKGFsbG9jYXRvciwgc3RvcmUpOworICAgIH0KK30KKworc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmVJbXBsOjpmZXRjaElvbkFsbG9jYXRvcigpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnSW9uQWxsb2NhdG9yTXV0ZXgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcklvbj4gYWxsb2NhdG9yID0gZ0lvbkFsbG9jYXRvci5sb2NrKCk7CisgICAgaWYgKGFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBjb21wb25lbnRTdG9yZTsKKyAgICAgICAgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soX21Db21wb25lbnRTdG9yZVJlYWRMb2NrKTsKKyAgICAgICAgICAgIGNvbXBvbmVudFN0b3JlID0gX21Db21wb25lbnRTdG9yZTsKKyAgICAgICAgfQorICAgICAgICBhbGxvY2F0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQWxsb2NhdG9ySW9uPihDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OklPTik7CisgICAgICAgIFVzZUNvbXBvbmVudFN0b3JlRm9ySW9uQWxsb2NhdG9yKGFsbG9jYXRvciwgY29tcG9uZW50U3RvcmUpOworICAgICAgICBnSW9uQWxsb2NhdG9yID0gYWxsb2NhdG9yOworICAgIH0KKyAgICByZXR1cm4gYWxsb2NhdG9yOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw6OmZldGNoR3JhbGxvY0FsbG9jYXRvcigpIHsKKyAgICBzdGF0aWMgc3RkOjptdXRleCBtdXRleDsKKyAgICBzdGF0aWMgc3RkOjp3ZWFrX3B0cjxDMkFsbG9jYXRvcj4gZ3JhbGxvY0FsbG9jYXRvcjsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3IgPSBncmFsbG9jQWxsb2NhdG9yLmxvY2soKTsKKyAgICBpZiAoYWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgYWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRvckdyYWxsb2M+KEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6R1JBTExPQyk7CisgICAgICAgIGdyYWxsb2NBbGxvY2F0b3IgPSBhbGxvY2F0b3I7CisgICAgfQorICAgIHJldHVybiBhbGxvY2F0b3I7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbDo6ZmV0Y2hCdWZmZXJRdWV1ZUFsbG9jYXRvcigpIHsKKyAgICBzdGF0aWMgc3RkOjptdXRleCBtdXRleDsKKyAgICBzdGF0aWMgc3RkOjp3ZWFrX3B0cjxDMkFsbG9jYXRvcj4gZ3JhbGxvY0FsbG9jYXRvcjsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtdXRleCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBhbGxvY2F0b3IgPSBncmFsbG9jQWxsb2NhdG9yLmxvY2soKTsKKyAgICBpZiAoYWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgYWxsb2NhdG9yID0gc3RkOjptYWtlX3NoYXJlZDxDMkFsbG9jYXRvckdyYWxsb2M+KAorICAgICAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUsIHRydWUpOworICAgICAgICBncmFsbG9jQWxsb2NhdG9yID0gYWxsb2NhdG9yOworICAgIH0KKyAgICByZXR1cm4gYWxsb2NhdG9yOworfQorCituYW1lc3BhY2UgeworICAgIHN0ZDo6bXV0ZXggZ1ByZWZlcnJlZENvbXBvbmVudFN0b3JlTXV0ZXg7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50U3RvcmU+IGdQcmVmZXJyZWRDb21wb25lbnRTdG9yZTsKKworICAgIHN0ZDo6bXV0ZXggZ1BsYXRmb3JtQWxsb2NhdG9yU3RvcmVNdXRleDsKKyAgICBzdGQ6OndlYWtfcHRyPEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw+IGdQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3JTdG9yZT4gR2V0Q29kZWMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnUGxhdGZvcm1BbGxvY2F0b3JTdG9yZU11dGV4KTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlSW1wbD4gc3RvcmUgPSBnUGxhdGZvcm1BbGxvY2F0b3JTdG9yZS5sb2NrKCk7CisgICAgaWYgKHN0b3JlID09IG51bGxwdHIpIHsKKyAgICAgICAgc3RvcmUgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw+KCk7CisgICAgICAgIHN0b3JlLT5zZXRDb21wb25lbnRTdG9yZShHZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZSgpKTsKKyAgICAgICAgZ1BsYXRmb3JtQWxsb2NhdG9yU3RvcmUgPSBzdG9yZTsKKyAgICB9CisgICAgcmV0dXJuIHN0b3JlOworfQorCit2b2lkIFNldFByZWZlcnJlZENvZGVjMkNvbXBvbmVudFN0b3JlKHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBjb21wb25lbnRTdG9yZSkgeworICAgIHN0YXRpYyBzdGQ6Om11dGV4IG11dGV4OworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG11dGV4KTsgLy8gZG9uJ3QgaW50ZXJsZXZlIHNldC1zCisKKyAgICAvLyB1cGRhdGUgcHJlZmVycmVkIHN0b3JlCisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnUHJlZmVycmVkQ29tcG9uZW50U3RvcmVNdXRleCk7CisgICAgICAgIGdQcmVmZXJyZWRDb21wb25lbnRTdG9yZSA9IGNvbXBvbmVudFN0b3JlOworICAgIH0KKworICAgIC8vIHVwZGF0ZSBwbGF0Zm9ybSBhbGxvY2F0b3IncyBzdG9yZSBhcyB3ZWxsIGlmIGl0IGlzIGFsaXZlCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZUltcGw+IGFsbG9jYXRvclN0b3JlOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZ1BsYXRmb3JtQWxsb2NhdG9yU3RvcmVNdXRleCk7CisgICAgICAgIGFsbG9jYXRvclN0b3JlID0gZ1BsYXRmb3JtQWxsb2NhdG9yU3RvcmUubG9jaygpOworICAgIH0KKyAgICBpZiAoYWxsb2NhdG9yU3RvcmUpIHsKKyAgICAgICAgYWxsb2NhdG9yU3RvcmUtPnNldENvbXBvbmVudFN0b3JlKGNvbXBvbmVudFN0b3JlKTsKKyAgICB9Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBHZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhnUHJlZmVycmVkQ29tcG9uZW50U3RvcmVNdXRleCk7CisgICAgcmV0dXJuIGdQcmVmZXJyZWRDb21wb25lbnRTdG9yZSA/IGdQcmVmZXJyZWRDb21wb25lbnRTdG9yZSA6IEdldENvZGVjMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKTsKK30KKworbmFtZXNwYWNlIHsKKworY2xhc3MgX0MyQmxvY2tQb29sQ2FjaGUgeworcHVibGljOgorICAgIF9DMkJsb2NrUG9vbENhY2hlKCkgOiBtQmxvY2tQb29sU2VxSWQoQzJCbG9ja1Bvb2w6OlBMQVRGT1JNX1NUQVJUICsgMSkge30KKworICAgIGMyX3N0YXR1c190IF9jcmVhdGVCbG9ja1Bvb2woCisgICAgICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OmlkX3QgYWxsb2NhdG9ySWQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IHBvb2xJZCwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gKnBvb2wpIHsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yU3RvcmU+IGFsbG9jYXRvclN0b3JlID0KKyAgICAgICAgICAgICAgICBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gYWxsb2NhdG9yOworICAgICAgICBjMl9zdGF0dXNfdCByZXMgPSBDMl9OT1RfRk9VTkQ7CisKKyAgICAgICAgc3dpdGNoKGFsbG9jYXRvcklkKSB7CisgICAgICAgICAgICBjYXNlIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6SU9OOgorICAgICAgICAgICAgY2FzZSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUjoKKyAgICAgICAgICAgICAgICByZXMgPSBhbGxvY2F0b3JTdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0xJTkVBUiwgJmFsbG9jYXRvcik7CisgICAgICAgICAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHB0ciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3IsIHBvb2xJZCk7CisgICAgICAgICAgICAgICAgICAgICpwb29sID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sc1twb29sSWRdID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdID0gY29tcG9uZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjpHUkFMTE9DOgorICAgICAgICAgICAgY2FzZSBDMkFsbG9jYXRvclN0b3JlOjpERUZBVUxUX0dSQVBISUM6CisgICAgICAgICAgICAgICAgcmVzID0gYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKAorICAgICAgICAgICAgICAgICAgICAgICAgQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9HUkFQSElDLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gcHRyID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJQb29sZWRCbG9ja1Bvb2w+KGFsbG9jYXRvciwgcG9vbElkKTsKKyAgICAgICAgICAgICAgICAgICAgKnBvb2wgPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xzW3Bvb2xJZF0gPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRzW3Bvb2xJZF0gPSBjb21wb25lbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OkJVRkZFUlFVRVVFOgorICAgICAgICAgICAgICAgIHJlcyA9IGFsbG9jYXRvclN0b3JlLT5mZXRjaEFsbG9jYXRvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUsICZhbGxvY2F0b3IpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiBwdHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbD4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0b3IsIHBvb2xJZCk7CisgICAgICAgICAgICAgICAgICAgICpwb29sID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQmxvY2tQb29sc1twb29sSWRdID0gcHRyOworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50c1twb29sSWRdID0gY29tcG9uZW50OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIGNyZWF0ZSBibG9jayBwb29sIGZyb20gcGxhdGZvcm0gc3RvcmUgcGx1Z2lucy4KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHB0cjsKKyAgICAgICAgICAgICAgICByZXMgPSBDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI6OkdldEluc3RhbmNlKCktPmNyZWF0ZUJsb2NrUG9vbCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRvcklkLCBwb29sSWQsICZwdHIpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnBvb2wgPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1CbG9ja1Bvb2xzW3Bvb2xJZF0gPSBwdHI7CisgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnRzW3Bvb2xJZF0gPSBjb21wb25lbnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgY3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKSB7CisgICAgICAgIHJldHVybiBfY3JlYXRlQmxvY2tQb29sKGFsbG9jYXRvcklkLCBjb21wb25lbnQsIG1CbG9ja1Bvb2xTZXFJZCsrLCBwb29sKTsKKyAgICB9CisKKyAgICBib29sIGdldEJsb2NrUG9vbCgKKyAgICAgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyQ29tcG9uZW50PiBjb21wb25lbnQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKSB7CisgICAgICAgIC8vIFRPRE86IHVzZSBvbmUgaXRlcmF0b3IgZm9yIG11bHRpcGxlIGJsb2NrcG9vbCB0eXBlIHNjYWxhYmlsaXR5LgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IHB0cjsKKyAgICAgICAgYXV0byBpdCA9IG1CbG9ja1Bvb2xzLmZpbmQoYmxvY2tQb29sSWQpOworICAgICAgICBpZiAoaXQgIT0gbUJsb2NrUG9vbHMuZW5kKCkpIHsKKyAgICAgICAgICAgIHB0ciA9IGl0LT5zZWNvbmQubG9jaygpOworICAgICAgICAgICAgaWYgKCFwdHIpIHsKKyAgICAgICAgICAgICAgICBtQmxvY2tQb29scy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgbUNvbXBvbmVudHMuZXJhc2UoYmxvY2tQb29sSWQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBhdXRvIGZvdW5kID0gbUNvbXBvbmVudHMuZmluZChibG9ja1Bvb2xJZCk7CisgICAgICAgICAgICAgICAgaWYgKGNvbXBvbmVudCA9PSBmb3VuZC0+c2Vjb25kLmxvY2soKSkgeworICAgICAgICAgICAgICAgICAgICAqcG9vbCA9IHB0cjsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgQzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QgbUJsb2NrUG9vbFNlcUlkOworCisgICAgc3RkOjptYXA8QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QsIHN0ZDo6d2Vha19wdHI8QzJCbG9ja1Bvb2w+PiBtQmxvY2tQb29sczsKKyAgICBzdGQ6Om1hcDxDMkJsb2NrUG9vbDo6bG9jYWxfaWRfdCwgc3RkOjp3ZWFrX3B0cjxjb25zdCBDMkNvbXBvbmVudD4+IG1Db21wb25lbnRzOworfTsKKworc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxfQzJCbG9ja1Bvb2xDYWNoZT4gc0Jsb2NrUG9vbENhY2hlID0KKyAgICBzdGQ6Om1ha2VfdW5pcXVlPF9DMkJsb2NrUG9vbENhY2hlPigpOworc3RhdGljIHN0ZDo6bXV0ZXggc0Jsb2NrUG9vbENhY2hlTXV0ZXg7CisKK30gLy8gYW55bnltb3VzIG5hbWVzcGFjZQorCitjMl9zdGF0dXNfdCBHZXRDb2RlYzJCbG9ja1Bvb2woCisgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCkgeworICAgIHBvb2wtPnJlc2V0KCk7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soc0Jsb2NrUG9vbENhY2hlTXV0ZXgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBhbGxvY2F0b3JTdG9yZSA9IEdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IGFsbG9jYXRvcjsKKyAgICBjMl9zdGF0dXNfdCByZXMgPSBDMl9OT1RfRk9VTkQ7CisKKyAgICBpZiAoaWQgPj0gQzJCbG9ja1Bvb2w6OlBMQVRGT1JNX1NUQVJUKSB7CisgICAgICAgIGlmIChzQmxvY2tQb29sQ2FjaGUtPmdldEJsb2NrUG9vbChpZCwgY29tcG9uZW50LCBwb29sKSkgeworICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICB9CisgICAgfQorCisgICAgc3dpdGNoIChpZCkgeworICAgIGNhc2UgQzJCbG9ja1Bvb2w6OkJBU0lDX0xJTkVBUjoKKyAgICAgICAgcmVzID0gYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfTElORUFSLCAmYWxsb2NhdG9yKTsKKyAgICAgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAgICAgKnBvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyQmFzaWNMaW5lYXJCbG9ja1Bvb2w+KGFsbG9jYXRvcik7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBDMkJsb2NrUG9vbDo6QkFTSUNfR1JBUEhJQzoKKyAgICAgICAgcmVzID0gYWxsb2NhdG9yU3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQywgJmFsbG9jYXRvcik7CisgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgICpwb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbD4oYWxsb2NhdG9yKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAvLyBUT0RPOiByZW1vdmUgdGhpcy4gdGhpcyBpcyB0ZW1wb3JhcnkKKyAgICBjYXNlIEMyQmxvY2tQb29sOjpQTEFURk9STV9TVEFSVDoKKyAgICAgICAgcmVzID0gc0Jsb2NrUG9vbENhY2hlLT5fY3JlYXRlQmxvY2tQb29sKAorICAgICAgICAgICAgICAgIEMyUGxhdGZvcm1BbGxvY2F0b3JTdG9yZTo6QlVGRkVSUVVFVUUsIGNvbXBvbmVudCwgaWQsIHBvb2wpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKworYzJfc3RhdHVzX3QgQ3JlYXRlQ29kZWMyQmxvY2tQb29sKAorICAgICAgICBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmU6OmlkX3QgYWxsb2NhdG9ySWQsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudD4gY29tcG9uZW50LAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+ICpwb29sKSB7CisgICAgcG9vbC0+cmVzZXQoKTsKKworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKHNCbG9ja1Bvb2xDYWNoZU11dGV4KTsKKyAgICByZXR1cm4gc0Jsb2NrUG9vbENhY2hlLT5jcmVhdGVCbG9ja1Bvb2woYWxsb2NhdG9ySWQsIGNvbXBvbmVudCwgcG9vbCk7Cit9CisKK2NsYXNzIEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSA6IHB1YmxpYyBDMkNvbXBvbmVudFN0b3JlIHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPj4gbGlzdENvbXBvbmVudHMoKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBnZXRQYXJhbVJlZmxlY3RvcigpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRWYWx1ZXNfc20oCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnk+ICZmaWVsZHMpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXNfbmIoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdCBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHF1ZXJ5X3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiAmaGVhcFBhcmFtSW5kaWNlcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4gKmNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0IG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAqY29uc3QgaW50ZXJmYWNlKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIEMyU3RyaW5nIG5hbWUsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudD4gKmNvbnN0IGNvbXBvbmVudCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjb3B5QnVmZmVyKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gc3JjLCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQnVmZmVyPiBkc3QpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnX3NtKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gKmNvbnN0IGZhaWx1cmVzKSBvdmVycmlkZTsKKyAgICBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmUoKTsKKworICAgIHZpcnR1YWwgfkMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKworICAgIC8qKgorICAgICAqIEFuIG9iamVjdCBlbmNhcHN1bGF0aW5nIGEgbG9hZGVkIGNvbXBvbmVudCBtb2R1bGUuCisgICAgICoKKyAgICAgKiBcdG9kbyBwcm92aWRlIGEgd2F5IHRvIGFkZCB0cmFpdHMgdG8ga25vd24gY29tcG9uZW50cyBoZXJlIHRvIGF2b2lkIGxvYWRpbmcgdGhlIC5zby1zCisgICAgICogZm9yIGxpc3RDb21wb25lbnRzCisgICAgICovCisgICAgc3RydWN0IENvbXBvbmVudE1vZHVsZSA6IHB1YmxpYyBDMkNvbXBvbmVudEZhY3RvcnksCisgICAgICAgICAgICBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxDb21wb25lbnRNb2R1bGU+IHsKKyAgICAgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBjcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICpjb21wb25lbnQsCisgICAgICAgICAgICAgICAgQ29tcG9uZW50RGVsZXRlciBkZWxldGVyID0gc3RkOjpkZWZhdWx0X2RlbGV0ZTxDMkNvbXBvbmVudD4oKSkgb3ZlcnJpZGU7CisgICAgICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAqaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgIEludGVyZmFjZURlbGV0ZXIgZGVsZXRlciA9IHN0ZDo6ZGVmYXVsdF9kZWxldGU8QzJDb21wb25lbnRJbnRlcmZhY2U+KCkpIG92ZXJyaWRlOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBccmV0dXJucyB0aGUgdHJhaXRzIG9mIHRoZSBjb21wb25lbnQgaW4gdGhpcyBtb2R1bGUuCisgICAgICAgICAqLworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4gZ2V0VHJhaXRzKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYW4gdW5pbml0aWFsaXplZCBjb21wb25lbnQgbW9kdWxlLgorICAgICAgICAgKgorICAgICAgICAgKiBccGFyYW0gbmFtZVtpbl0gIGNvbXBvbmVudCBuYW1lLgorICAgICAgICAgKgorICAgICAgICAgKiBcbm90ZSBPbmx5IHVzZWQgYnkgQ29tcG9uZW50TG9hZGVyLgorICAgICAgICAgKi8KKyAgICAgICAgQ29tcG9uZW50TW9kdWxlKCkKKyAgICAgICAgICAgIDogbUluaXQoQzJfTk9fSU5JVCksCisgICAgICAgICAgICAgIG1MaWJIYW5kbGUobnVsbHB0ciksCisgICAgICAgICAgICAgIGNyZWF0ZUZhY3RvcnkobnVsbHB0ciksCisgICAgICAgICAgICAgIGRlc3Ryb3lGYWN0b3J5KG51bGxwdHIpLAorICAgICAgICAgICAgICBtQ29tcG9uZW50RmFjdG9yeShudWxscHRyKSB7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogSW5pdGlhbGl6ZXMgYSBjb21wb25lbnQgbW9kdWxlIHdpdGggYSBnaXZlbiBsaWJyYXJ5IHBhdGguIE11c3QgYmUgY2FsbGVkIGV4YWN0bHkgb25jZS4KKyAgICAgICAgICoKKyAgICAgICAgICogXG5vdGUgT25seSB1c2VkIGJ5IENvbXBvbmVudExvYWRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGxpYlBhdGhbaW5dIGxpYnJhcnkgcGF0aAorICAgICAgICAgKgorICAgICAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgY29tcG9uZW50IG1vZHVsZSBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgbG9hZGVkCisgICAgICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGxvYWRpbmcgdGhlIGNvbXBvbmVudCBtb2R1bGUKKyAgICAgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgY291bGQgbm90IGxvY2F0ZSB0aGUgY29tcG9uZW50IG1vZHVsZQorICAgICAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCB0aGUgY29tcG9uZW50IG1vZHVsZSBjb3VsZCBub3QgYmUgbG9hZGVkICh1bmV4cGVjdGVkKQorICAgICAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBwZXJtaXNzaW9uIGRlbmllZCB0byBsb2FkIHRoZSBjb21wb25lbnQgbW9kdWxlICh1bmV4cGVjdGVkKQorICAgICAgICAgKiBccmV0dmFsIEMyX1RJTUVEX09VVCBjb3VsZCBub3QgbG9hZCB0aGUgbW9kdWxlIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgICAgICovCisgICAgICAgIGMyX3N0YXR1c190IGluaXQoc3RkOjpzdHJpbmcgbGliUGF0aCk7CisKKyAgICAgICAgdmlydHVhbCB+Q29tcG9uZW50TW9kdWxlKCkgb3ZlcnJpZGU7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHN0ZDo6cmVjdXJzaXZlX211dGV4IG1Mb2NrOyAvLy88IGxvY2sgcHJvdGVjdGluZyBtVHJhaXRzCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6VHJhaXRzPiBtVHJhaXRzOyAvLy88IGNhY2hlZCBjb21wb25lbnQgdHJhaXRzCisKKyAgICAgICAgYzJfc3RhdHVzX3QgbUluaXQ7IC8vLzwgaW5pdGlhbGl6YXRpb24gcmVzdWx0CisKKyAgICAgICAgdm9pZCAqbUxpYkhhbmRsZTsgLy8vPCBsb2FkZWQgbGlicmFyeSBoYW5kbGUKKyAgICAgICAgQzJDb21wb25lbnRGYWN0b3J5OjpDcmVhdGVDb2RlYzJGYWN0b3J5RnVuYyBjcmVhdGVGYWN0b3J5OyAvLy88IGxvYWRlZCBjcmVhdGUgZnVuY3Rpb24KKyAgICAgICAgQzJDb21wb25lbnRGYWN0b3J5OjpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmMgZGVzdHJveUZhY3Rvcnk7IC8vLzwgbG9hZGVkIGRlc3Ryb3kgZnVuY3Rpb24KKyAgICAgICAgQzJDb21wb25lbnRGYWN0b3J5ICptQ29tcG9uZW50RmFjdG9yeTsgLy8vPCBsb2FkZWQvY3JlYXRlZCBjb21wb25lbnQgZmFjdG9yeQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBBbiBvYmplY3QgZW5jYXBzdWxhdGluZyBhIGxvYWRhYmxlIGNvbXBvbmVudCBtb2R1bGUuCisgICAgICoKKyAgICAgKiBcdG9kbyBtYWtlIHRoaXMgYWxzbyB3b3JrIGZvciBlbnVtZXJhdGlvbnMKKyAgICAgKi8KKyAgICBzdHJ1Y3QgQ29tcG9uZW50TG9hZGVyIHsKKyAgICAgICAgLyoqCisgICAgICAgICAqIExvYWQgdGhlIGNvbXBvbmVudCBtb2R1bGUuCisgICAgICAgICAqCisgICAgICAgICAqIFRoaXMgbWV0aG9kIHNpbXBseSByZXR1cm5zIHRoZSBjb21wb25lbnQgbW9kdWxlIGlmIGl0IGlzIGFscmVhZHkgY3VycmVudGx5IGxvYWRlZCwgb3IKKyAgICAgICAgICogYXR0ZW1wdHMgdG8gbG9hZCBpdCBpZiBpdCBpcyBub3QuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBtb2R1bGVbb3V0XSBwb2ludGVyIHRvIHRoZSBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgbG9hZGVkIG1vZHVsZSBzaGFsbCBiZSBzdG9yZWQuCisgICAgICAgICAqICAgICAgICAgICAgICAgICAgICBUaGlzIHdpbGwgYmUgbnVsbHB0ciBvbiBlcnJvci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGNvbXBvbmVudCBtb2R1bGUgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGxvYWRlZAorICAgICAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBsb2FkaW5nIHRoZSBjb21wb25lbnQgbW9kdWxlCisgICAgICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGNvdWxkIG5vdCBsb2NhdGUgdGhlIGNvbXBvbmVudCBtb2R1bGUKKyAgICAgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgdGhlIGNvbXBvbmVudCBtb2R1bGUgY291bGQgbm90IGJlIGxvYWRlZAorICAgICAgICAgKiBccmV0dmFsIEMyX1JFRlVTRUQgICBwZXJtaXNzaW9uIGRlbmllZCB0byBsb2FkIHRoZSBjb21wb25lbnQgbW9kdWxlCisgICAgICAgICAqLworICAgICAgICBjMl9zdGF0dXNfdCBmZXRjaE1vZHVsZShzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiAqbW9kdWxlKSB7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCByZXMgPSBDMl9PSzsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiBsb2NhbE1vZHVsZSA9IG1Nb2R1bGUubG9jaygpOworICAgICAgICAgICAgaWYgKGxvY2FsTW9kdWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBsb2NhbE1vZHVsZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8Q29tcG9uZW50TW9kdWxlPigpOworICAgICAgICAgICAgICAgIHJlcyA9IGxvY2FsTW9kdWxlLT5pbml0KG1MaWJQYXRoKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIG1Nb2R1bGUgPSBsb2NhbE1vZHVsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqbW9kdWxlID0gbG9jYWxNb2R1bGU7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBjb21wb25lbnQgbG9hZGVyIGZvciBhIHNwZWNpZmljIGxpYnJhcnkgcGF0aCAob3IgbmFtZSkuCisgICAgICAgICAqLworICAgICAgICBDb21wb25lbnRMb2FkZXIoc3RkOjpzdHJpbmcgbGliUGF0aCkKKyAgICAgICAgICAgIDogbUxpYlBhdGgobGliUGF0aCkge30KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bXV0ZXggbU11dGV4OyAvLy88IG11dGV4IGd1YXJkaW5nIHRoZSBtb2R1bGUKKyAgICAgICAgc3RkOjp3ZWFrX3B0cjxDb21wb25lbnRNb2R1bGU+IG1Nb2R1bGU7IC8vLzwgd2VhayByZWZlcmVuY2UgdG8gdGhlIGxvYWRlZCBtb2R1bGUKKyAgICAgICAgc3RkOjpzdHJpbmcgbUxpYlBhdGg7IC8vLzwgbGlicmFyeSBwYXRoCisgICAgfTsKKworICAgIHN0cnVjdCBJbnRlcmZhY2UgOiBwdWJsaWMgQzJJbnRlcmZhY2VIZWxwZXIgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJTdG9yZUlvblVzYWdlSW5mbz4gbUlvblVzYWdlSW5mbzsKKworICAgICAgICBJbnRlcmZhY2Uoc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiByZWZsZWN0b3IpCisgICAgICAgICAgICA6IEMySW50ZXJmYWNlSGVscGVyKHJlZmxlY3RvcikgeworICAgICAgICAgICAgc2V0RGVyaXZlZEluc3RhbmNlKHRoaXMpOworCisgICAgICAgICAgICBzdHJ1Y3QgU2V0dGVyIHsKKyAgICAgICAgICAgICAgICBzdGF0aWMgQzJSIHNldElvblVzYWdlKGJvb2wgLyogbWF5QmxvY2sgKi8sIEMyUDxDMlN0b3JlSW9uVXNhZ2VJbmZvPiAmbWUpIHsKKyNpZmRlZiBfX0FORFJPSURfQVBFWF9fCisgICAgICAgICAgICAgICAgICAgIHN0YXRpYyBpbnQzMl90IGRlZmF1bHRIZWFwTWFzayA9IFtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaGVhcG1hc2sgPSBiYXNlOjpHZXRJbnRQcm9wZXJ0eSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJvLmNvbS5hbmRyb2lkLm1lZGlhLnN3Y29kZWMuaW9uLmhlYXBtYXNrIiwgaW50MzJfdCgweEZGRkZGRkZGKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiRGVmYXVsdCBJT04gaGVhcG1hc2sgPSAlZCIsIGhlYXBtYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoZWFwbWFzazsKKyAgICAgICAgICAgICAgICAgICAgfSgpOworICAgICAgICAgICAgICAgICAgICBzdGF0aWMgaW50MzJfdCBkZWZhdWx0RmxhZ3MgPSBbXSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZsYWdzID0gYmFzZTo6R2V0SW50UHJvcGVydHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyby5jb20uYW5kcm9pZC5tZWRpYS5zd2NvZGVjLmlvbi5mbGFncyIsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIkRlZmF1bHQgSU9OIGZsYWdzID0gJWQiLCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmxhZ3M7CisgICAgICAgICAgICAgICAgICAgIH0oKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljIHVpbnQzMl90IGRlZmF1bHRBbGlnbiA9IFtdIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFsaWduID0gYmFzZTo6R2V0VWludFByb3BlcnR5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicm8uY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy5pb24uYWxpZ24iLCAwdSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiRGVmYXVsdCBJT04gYWxpZ24gPSAlZCIsIGFsaWduKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhbGlnbjsKKyAgICAgICAgICAgICAgICAgICAgfSgpOworICAgICAgICAgICAgICAgICAgICBtZS5zZXQoKS5oZWFwTWFzayA9IGRlZmF1bHRIZWFwTWFzazsKKyAgICAgICAgICAgICAgICAgICAgbWUuc2V0KCkuYWxsb2NGbGFncyA9IGRlZmF1bHRGbGFnczsKKyAgICAgICAgICAgICAgICAgICAgbWUuc2V0KCkubWluQWxpZ25tZW50ID0gZGVmYXVsdEFsaWduOworI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgbWUuc2V0KCkuaGVhcE1hc2sgPSB+MDsKKyAgICAgICAgICAgICAgICAgICAgbWUuc2V0KCkuYWxsb2NGbGFncyA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1lLnNldCgpLm1pbkFsaWdubWVudCA9IDA7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEMyUjo6T2soKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9OworCisgICAgICAgICAgICBhZGRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgRGVmaW5lUGFyYW0obUlvblVzYWdlSW5mbywgImlvbi11c2FnZSIpCisgICAgICAgICAgICAgICAgLndpdGhEZWZhdWx0KG5ldyBDMlN0b3JlSW9uVXNhZ2VJbmZvKCkpCisgICAgICAgICAgICAgICAgLndpdGhGaWVsZHMoeworICAgICAgICAgICAgICAgICAgICBDMkYobUlvblVzYWdlSW5mbywgdXNhZ2UpLmZsYWdzKHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCB8IEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0pLAorICAgICAgICAgICAgICAgICAgICBDMkYobUlvblVzYWdlSW5mbywgY2FwYWNpdHkpLmluUmFuZ2UoMCwgVUlOVDMyX01BWCwgMTAyNCksCisgICAgICAgICAgICAgICAgICAgIEMyRihtSW9uVXNhZ2VJbmZvLCBoZWFwTWFzaykuYW55KCksCisgICAgICAgICAgICAgICAgICAgIEMyRihtSW9uVXNhZ2VJbmZvLCBhbGxvY0ZsYWdzKS5mbGFncyh7fSksCisgICAgICAgICAgICAgICAgICAgIEMyRihtSW9uVXNhZ2VJbmZvLCBtaW5BbGlnbm1lbnQpLmVxdWFsVG8oMCkKKyAgICAgICAgICAgICAgICB9KQorICAgICAgICAgICAgICAgIC53aXRoU2V0dGVyKFNldHRlcjo6c2V0SW9uVXNhZ2UpCisgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOworICAgICAgICB9CisgICAgfTsKKworICAgIC8qKgorICAgICAqIFJldHJpZXZlcyB0aGUgY29tcG9uZW50IG1vZHVsZSBmb3IgYSBjb21wb25lbnQuCisgICAgICoKKyAgICAgKiBccGFyYW0gbW9kdWxlIHBvaW50ZXIgdG8gYSBzaGFyZWRfcG9pbnRlciB3aGVyZSB0aGUgY29tcG9uZW50IG1vZHVsZSB3aWxsIGJlIHN0b3JlZCBvbgorICAgICAqICAgICAgICAgICAgICAgc3VjY2Vzcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgbG9hZGVyIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSByZXRyaWV2ZWQKKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBsb2NhdGUgdGhlIGNvbXBvbmVudCBsb2FkZXIKKyAgICAgKiBccmV0dmFsIEMyX05PVF9GT1VORCBjb3VsZCBub3QgbG9jYXRlIHRoZSBjb21wb25lbnQgdG8gYmUgbG9hZGVkCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgdGhlIGNvbXBvbmVudCBsb2FkZXIgY291bGQgbm90IGJlIGlkZW50aWZpZWQgZHVlIHRvIHNvbWUgbW9kdWxlcyBiZWluZworICAgICAqICAgICAgICAgICAgICAgICAgICAgIGNvcnJ1cHRlZCAodGhpcyBjYW4gaGFwcGVuIGlmIHRoZSBuYW1lIGRvZXMgbm90IHJlZmVyIHRvIGFuIGFscmVhZHkKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVkIGNvbXBvbmVudCBidXQgc29tZSBjb21wb25lbnRzIGNvdWxkIG5vdCBiZSBsb2FkZWQgZHVlIHRvCisgICAgICogICAgICAgICAgICAgICAgICAgICAgYmFkIGxpYnJhcnkpCisgICAgICogXHJldHZhbCBDMl9SRUZVU0VEICAgcGVybWlzc2lvbiBkZW5pZWQgdG8gZmluZCB0aGUgY29tcG9uZW50IGxvYWRlciBmb3IgdGhlIG5hbWVkIGNvbXBvbmVudAorICAgICAqICAgICAgICAgICAgICAgICAgICAgICh0aGlzIGNhbiBoYXBwZW4gaWYgdGhlIG5hbWUgZG9lcyBub3QgcmVmZXIgdG8gYW4gYWxyZWFkeSBpZGVudGlmaWVkCisgICAgICogICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50IGJ1dCBzb21lIGNvbXBvbmVudHMgY291bGQgbm90IGJlIGxvYWRlZCBkdWUgdG8gbGFjayBvZgorICAgICAqICAgICAgICAgICAgICAgICAgICAgIHBlcm1pc3Npb25zKQorICAgICAqLworICAgIGMyX3N0YXR1c190IGZpbmRDb21wb25lbnQoQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gKm1vZHVsZSk7CisKKyAgICAvKioKKyAgICAgKiBMb2FkcyBlYWNoIGNvbXBvbmVudCBtb2R1bGUgYW5kIGRpc2NvdmVyIGl0cyBjb250ZW50cy4KKyAgICAgKi8KKyAgICB2b2lkIHZpc2l0Q29tcG9uZW50cygpOworCisgICAgc3RkOjptdXRleCBtTXV0ZXg7IC8vLzwgbXV0ZXggZ3VhcmRpbmcgdGhlIGNvbXBvbmVudCBsaXN0cyBkdXJpbmcgY29uc3RydWN0aW9uCisgICAgYm9vbCBtVmlzaXRlZDsgLy8vPCBjb21wb25lbnQgbW9kdWxlcyB2aXNpdGVkCisgICAgc3RkOjptYXA8QzJTdHJpbmcsIENvbXBvbmVudExvYWRlcj4gbUNvbXBvbmVudHM7IC8vLzwgcGF0aCAtPiBjb21wb25lbnQgbW9kdWxlCisgICAgc3RkOjptYXA8QzJTdHJpbmcsIEMyU3RyaW5nPiBtQ29tcG9uZW50TmFtZVRvUGF0aDsgLy8vPCBuYW1lIC0+IHBhdGgKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IG1Db21wb25lbnRMaXN0OworCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiBtUmVmbGVjdG9yOworICAgIEludGVyZmFjZSBtSW50ZXJmYWNlOworfTsKKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRNb2R1bGU6OmluaXQoCisgICAgICAgIHN0ZDo6c3RyaW5nIGxpYlBhdGgpIHsKKyAgICBBTE9HVigiaW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgQUxPR1YoImxvYWRpbmcgZGxsIik7CisgICAgbUxpYkhhbmRsZSA9IGRsb3BlbihsaWJQYXRoLmNfc3RyKCksIFJUTERfTk9XfFJUTERfTk9ERUxFVEUpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUxpYkhhbmRsZSA9PSBudWxscHRyLAorICAgICAgICAgICAgImNvdWxkIG5vdCBkbG9wZW4gJXM6ICVzIiwgbGliUGF0aC5jX3N0cigpLCBkbGVycm9yKCkpOworCisgICAgY3JlYXRlRmFjdG9yeSA9CisgICAgICAgIChDMkNvbXBvbmVudEZhY3Rvcnk6OkNyZWF0ZUNvZGVjMkZhY3RvcnlGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJDcmVhdGVDb2RlYzJGYWN0b3J5Iik7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihjcmVhdGVGYWN0b3J5ID09IG51bGxwdHIsCisgICAgICAgICAgICAiY3JlYXRlRmFjdG9yeSBpcyBudWxsIGluICVzIiwgbGliUGF0aC5jX3N0cigpKTsKKworICAgIGRlc3Ryb3lGYWN0b3J5ID0KKyAgICAgICAgKEMyQ29tcG9uZW50RmFjdG9yeTo6RGVzdHJveUNvZGVjMkZhY3RvcnlGdW5jKWRsc3ltKG1MaWJIYW5kbGUsICJEZXN0cm95Q29kZWMyRmFjdG9yeSIpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZGVzdHJveUZhY3RvcnkgPT0gbnVsbHB0ciwKKyAgICAgICAgICAgICJkZXN0cm95RmFjdG9yeSBpcyBudWxsIGluICVzIiwgbGliUGF0aC5jX3N0cigpKTsKKworICAgIG1Db21wb25lbnRGYWN0b3J5ID0gY3JlYXRlRmFjdG9yeSgpOworICAgIGlmIChtQ29tcG9uZW50RmFjdG9yeSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJjb3VsZCBub3QgY3JlYXRlIGZhY3RvcnkgaW4gJXMiLCBsaWJQYXRoLmNfc3RyKCkpOworICAgICAgICBtSW5pdCA9IEMyX05PX01FTU9SWTsKKyAgICB9IGVsc2UgeworICAgICAgICBtSW5pdCA9IEMyX09LOworICAgIH0KKworICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgfQorCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiBpbnRmOworICAgIGMyX3N0YXR1c190IHJlcyA9IGNyZWF0ZUludGVyZmFjZSgwLCAmaW50Zik7CisgICAgaWYgKHJlcyAhPSBDMl9PSykgeworICAgICAgICBBTE9HRCgiZmFpbGVkIHRvIGNyZWF0ZSBpbnRlcmZhY2U6ICVkIiwgcmVzKTsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudDo6VHJhaXRzPiB0cmFpdHMobmV3IChzdGQ6Om5vdGhyb3cpIEMyQ29tcG9uZW50OjpUcmFpdHMpOworICAgIGlmICh0cmFpdHMpIHsKKyAgICAgICAgdHJhaXRzLT5uYW1lID0gaW50Zi0+Z2V0TmFtZSgpOworCisgICAgICAgIEMyQ29tcG9uZW50S2luZFNldHRpbmcga2luZDsKKyAgICAgICAgQzJDb21wb25lbnREb21haW5TZXR0aW5nIGRvbWFpbjsKKyAgICAgICAgcmVzID0gaW50Zi0+cXVlcnlfdmIoeyAma2luZCwgJmRvbWFpbiB9LCB7fSwgQzJfTUFZX0JMT0NLLCBudWxscHRyKTsKKyAgICAgICAgYm9vbCBmaXhEb21haW4gPSByZXMgIT0gQzJfT0s7CisgICAgICAgIGlmIChyZXMgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHRyYWl0cy0+a2luZCA9IGtpbmQudmFsdWU7CisgICAgICAgICAgICB0cmFpdHMtPmRvbWFpbiA9IGRvbWFpbi52YWx1ZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGlzIGZhbGwtYmFjaworICAgICAgICAgICAgQUxPR0QoImZhaWxlZCB0byBxdWVyeSBpbnRlcmZhY2UgZm9yIGtpbmQgYW5kIGRvbWFpbjogJWQiLCByZXMpOworCisgICAgICAgICAgICB0cmFpdHMtPmtpbmQgPQorICAgICAgICAgICAgICAgICh0cmFpdHMtPm5hbWUuZmluZCgiZW5jb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSA/IEMyQ29tcG9uZW50OjpLSU5EX0VOQ09ERVIgOgorICAgICAgICAgICAgICAgICh0cmFpdHMtPm5hbWUuZmluZCgiZGVjb2RlciIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSA/IEMyQ29tcG9uZW50OjpLSU5EX0RFQ09ERVIgOgorICAgICAgICAgICAgICAgIEMyQ29tcG9uZW50OjpLSU5EX09USEVSOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgbWVkaWFUeXBlSW5kZXggPQorICAgICAgICAgICAgICAgIHRyYWl0cy0+a2luZCA9PSBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSID8gQzJQb3J0TWVkaWFUeXBlU2V0dGluZzo6b3V0cHV0OjpQQVJBTV9UWVBFCisgICAgICAgICAgICAgICAgOiBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjppbnB1dDo6UEFSQU1fVFlQRTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbXM7CisgICAgICAgIHJlcyA9IGludGYtPnF1ZXJ5X3ZiKHt9LCB7IG1lZGlhVHlwZUluZGV4IH0sIEMyX01BWV9CTE9DSywgJnBhcmFtcyk7CisgICAgICAgIGlmIChyZXMgIT0gQzJfT0spIHsKKyAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gcXVlcnkgaW50ZXJmYWNlOiAlZCIsIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHBhcmFtcy5zaXplKCkgIT0gMXUpIHsKKyAgICAgICAgICAgIEFMT0dEKCJmYWlsZWQgdG8gcXVlcnkgaW50ZXJmYWNlOiB1bmV4cGVjdGVkIHZlY3RvciBzaXplOiAlenUiLCBwYXJhbXMuc2l6ZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICAgICAgfQorICAgICAgICBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nICptZWRpYVR5cGVDb25maWcgPSBDMlBvcnRNZWRpYVR5cGVTZXR0aW5nOjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgIGlmIChtZWRpYVR5cGVDb25maWcgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0QoImZhaWxlZCB0byBxdWVyeSBtZWRpYSB0eXBlIik7CisgICAgICAgICAgICByZXR1cm4gbUluaXQ7CisgICAgICAgIH0KKyAgICAgICAgdHJhaXRzLT5tZWRpYVR5cGUgPQorICAgICAgICAgICAgc3RkOjpzdHJpbmcobWVkaWFUeXBlQ29uZmlnLT5tLnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RybmxlbihtZWRpYVR5cGVDb25maWctPm0udmFsdWUsIG1lZGlhVHlwZUNvbmZpZy0+ZmxleENvdW50KCkpKTsKKworICAgICAgICBpZiAoZml4RG9tYWluKSB7CisgICAgICAgICAgICBpZiAoc3RybmNtcCh0cmFpdHMtPm1lZGlhVHlwZS5jX3N0cigpLCAiYXVkaW8vIiwgNikgPT0gMCkgeworICAgICAgICAgICAgICAgIHRyYWl0cy0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9BVURJTzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCh0cmFpdHMtPm1lZGlhVHlwZS5jX3N0cigpLCAidmlkZW8vIiwgNikgPT0gMCkgeworICAgICAgICAgICAgICAgIHRyYWl0cy0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9WSURFTzsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCh0cmFpdHMtPm1lZGlhVHlwZS5jX3N0cigpLCAiaW1hZ2UvIiwgNikgPT0gMCkgeworICAgICAgICAgICAgICAgIHRyYWl0cy0+ZG9tYWluID0gQzJDb21wb25lbnQ6OkRPTUFJTl9JTUFHRTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdHJhaXRzLT5kb21haW4gPSBDMkNvbXBvbmVudDo6RE9NQUlOX09USEVSOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETzogZ2V0IHRoaXMgcHJvcGVybHkgZnJvbSB0aGUgc3RvcmUgZHVyaW5nIGVtcGxhY2UKKyAgICAgICAgc3dpdGNoICh0cmFpdHMtPmRvbWFpbikgeworICAgICAgICBjYXNlIEMyQ29tcG9uZW50OjpET01BSU5fQVVESU86CisgICAgICAgICAgICB0cmFpdHMtPnJhbmsgPSA4OworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB0cmFpdHMtPnJhbmsgPSA1MTI7CisgICAgICAgIH0KKworICAgICAgICBwYXJhbXMuY2xlYXIoKTsKKyAgICAgICAgcmVzID0gaW50Zi0+cXVlcnlfdmIoe30sIHsgQzJDb21wb25lbnRBbGlhc2VzU2V0dGluZzo6UEFSQU1fVFlQRSB9LCBDMl9NQVlfQkxPQ0ssICZwYXJhbXMpOworICAgICAgICBpZiAocmVzID09IEMyX09LICYmIHBhcmFtcy5zaXplKCkgPT0gMXUpIHsKKyAgICAgICAgICAgIEMyQ29tcG9uZW50QWxpYXNlc1NldHRpbmcgKmFsaWFzZXNTZXR0aW5nID0KKyAgICAgICAgICAgICAgICBDMkNvbXBvbmVudEFsaWFzZXNTZXR0aW5nOjpGcm9tKHBhcmFtc1swXS5nZXQoKSk7CisgICAgICAgICAgICBpZiAoYWxpYXNlc1NldHRpbmcpIHsKKyAgICAgICAgICAgICAgICAvLyBTcGxpdCBhbGlhc2VzIG9uICcsJworICAgICAgICAgICAgICAgIC8vIFRoaXMgbG9va3Mgc2ltcGxlciBpbiBwbGFpbiBDIGFuZCBldmVuIHN0ZDo6c3RyaW5nIHdvdWxkIHN0aWxsIG1ha2UgYSBjb3B5LgorICAgICAgICAgICAgICAgIGNoYXIgKmFsaWFzZXMgPSA6OnN0cm5kdXAoYWxpYXNlc1NldHRpbmctPm0udmFsdWUsIGFsaWFzZXNTZXR0aW5nLT5mbGV4Q291bnQoKSk7CisgICAgICAgICAgICAgICAgQUxPR0QoIiclcycgaGFzIGFsaWFzZXM6ICclcyciLCBpbnRmLT5nZXROYW1lKCkuY19zdHIoKSwgYWxpYXNlcyk7CisKKyAgICAgICAgICAgICAgICBmb3IgKGNoYXIgKnRvaywgKnB0ciwgKnN0ciA9IGFsaWFzZXM7ICh0b2sgPSA6OnN0cnRva19yKHN0ciwgIiwiLCAmcHRyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzdHIgPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHRyYWl0cy0+YWxpYXNlcy5wdXNoX2JhY2sodG9rKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoImFkZGluZyBhbGlhczogJyVzJyIsIHRvayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZyZWUoYWxpYXNlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbVRyYWl0cyA9IHRyYWl0czsKKworICAgIHJldHVybiBtSW5pdDsKK30KKworQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRNb2R1bGU6On5Db21wb25lbnRNb2R1bGUoKSB7CisgICAgQUxPR1YoImluICVzIiwgX19mdW5jX18pOworICAgIGlmIChkZXN0cm95RmFjdG9yeSAmJiBtQ29tcG9uZW50RmFjdG9yeSkgeworICAgICAgICBkZXN0cm95RmFjdG9yeShtQ29tcG9uZW50RmFjdG9yeSk7CisgICAgfQorICAgIGlmIChtTGliSGFuZGxlKSB7CisgICAgICAgIEFMT0dWKCJ1bmxvYWRpbmcgZGxsIik7CisgICAgICAgIGRsY2xvc2UobUxpYkhhbmRsZSk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudE1vZHVsZTo6Y3JlYXRlSW50ZXJmYWNlKAorICAgICAgICBjMl9ub2RlX2lkX3QgaWQsIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudEludGVyZmFjZT4gKmludGVyZmFjZSwKKyAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKDo6QzJDb21wb25lbnRJbnRlcmZhY2UqKT4gZGVsZXRlcikgeworICAgIGludGVyZmFjZS0+cmVzZXQoKTsKKyAgICBpZiAobUluaXQgIT0gQzJfT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0OworICAgIH0KKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiBtb2R1bGUgPSBzaGFyZWRfZnJvbV90aGlzKCk7CisgICAgYzJfc3RhdHVzX3QgcmVzID0gbUNvbXBvbmVudEZhY3RvcnktPmNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgICAgIGlkLCBpbnRlcmZhY2UsIFttb2R1bGUsIGRlbGV0ZXJdKEMyQ29tcG9uZW50SW50ZXJmYWNlICpwKSBtdXRhYmxlIHsKKyAgICAgICAgICAgICAgICAvLyBjYXB0dXJlIG1vZHVsZSBzbyB0aGF0IHdlIGVuc3VyZSB3ZSBzdGlsbCBoYXZlIGl0IHdoaWxlIGRlbGV0aW5nIGludGVyZmFjZQorICAgICAgICAgICAgICAgIGRlbGV0ZXIocCk7IC8vIGRlbGV0ZSBpbnRlcmZhY2UgZmlyc3QKKyAgICAgICAgICAgICAgICBtb2R1bGUucmVzZXQoKTsgLy8gcmVtb3ZlIG1vZHVsZSByZWYgKG5vdCB0ZWNobmljYWxseSBuZWVkZWQpCisgICAgfSk7CisgICAgcmV0dXJuIHJlczsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpDb21wb25lbnRNb2R1bGU6OmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnQ+ICpjb21wb25lbnQsCisgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZCg6OkMyQ29tcG9uZW50Kik+IGRlbGV0ZXIpIHsKKyAgICBjb21wb25lbnQtPnJlc2V0KCk7CisgICAgaWYgKG1Jbml0ICE9IEMyX09LKSB7CisgICAgICAgIHJldHVybiBtSW5pdDsKKyAgICB9CisgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbW9kdWxlID0gc2hhcmVkX2Zyb21fdGhpcygpOworICAgIGMyX3N0YXR1c190IHJlcyA9IG1Db21wb25lbnRGYWN0b3J5LT5jcmVhdGVDb21wb25lbnQoCisgICAgICAgICAgICBpZCwgY29tcG9uZW50LCBbbW9kdWxlLCBkZWxldGVyXShDMkNvbXBvbmVudCAqcCkgbXV0YWJsZSB7CisgICAgICAgICAgICAgICAgLy8gY2FwdHVyZSBtb2R1bGUgc28gdGhhdCB3ZSBlbnN1cmUgd2Ugc3RpbGwgaGF2ZSBpdCB3aGlsZSBkZWxldGluZyBjb21wb25lbnQKKyAgICAgICAgICAgICAgICBkZWxldGVyKHApOyAvLyBkZWxldGUgY29tcG9uZW50IGZpcnN0CisgICAgICAgICAgICAgICAgbW9kdWxlLnJlc2V0KCk7IC8vIHJlbW92ZSBtb2R1bGUgcmVmIChub3QgdGVjaG5pY2FsbHkgbmVlZGVkKQorICAgIH0pOworICAgIHJldHVybiByZXM7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OkNvbXBvbmVudE1vZHVsZTo6Z2V0VHJhaXRzKCkgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IGxvY2sobUxvY2spOworICAgIHJldHVybiBtVHJhaXRzOworfQorCitDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OkMyUGxhdGZvcm1Db21wb25lbnRTdG9yZSgpCisgICAgOiBtVmlzaXRlZChmYWxzZSksCisgICAgICBtUmVmbGVjdG9yKHN0ZDo6bWFrZV9zaGFyZWQ8QzJSZWZsZWN0b3JIZWxwZXI+KCkpLAorICAgICAgbUludGVyZmFjZShtUmVmbGVjdG9yKSB7CisKKyAgICBhdXRvIGVtcGxhY2UgPSBbdGhpc10oY29uc3QgY2hhciAqbGliUGF0aCkgeworICAgICAgICBtQ29tcG9uZW50cy5lbXBsYWNlKGxpYlBhdGgsIGxpYlBhdGgpOworICAgIH07CisKKyAgICAvLyBUT0RPOiBtb3ZlIHRoaXMgYWxzbyBpbnRvIGEgLnNvIHNvIGl0IGNhbiBiZSB1cGRhdGVkCisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfYWFjZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfYWFjZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfYW1ybmJkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9hbXJuYmVuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2FtcndiZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfYW1yd2JlbmMuc28iKTsKKyAgICAvL2VtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2F2MWRlY19hb20uc28iKTsgLy8gZGVwcmVjYXRlZCBmb3IgdGhlIGdhdjEgaW1wbGVtZW50YXRpb24KKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9hdjFkZWNfZ2F2MS5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2F2Y2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2F2Y2VuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2ZsYWNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9mbGFjZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfZzcxMWFsYXdkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9nNzExbWxhd2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2dzbWRlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2gyNjNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9oMjYzZW5jLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfaGV2Y2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X2hldmNlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9tcDNkZWMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9tcGVnMmRlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X21wZWc0ZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfbXBlZzRlbmMuc28iKTsKKyAgICBlbXBsYWNlKCJsaWJjb2RlYzJfc29mdF9vcHVzZGVjLnNvIik7CisgICAgZW1wbGFjZSgibGliY29kZWMyX3NvZnRfb3B1c2VuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3Jhd2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3ZvcmJpc2RlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3ZwOGRlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3ZwOGVuYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3ZwOWRlYy5zbyIpOworICAgIGVtcGxhY2UoImxpYmNvZGVjMl9zb2Z0X3ZwOWVuYy5zbyIpOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmNvcHlCdWZmZXIoCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCdWZmZXI+IHNyYywgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0J1ZmZlcj4gZHN0KSB7CisgICAgKHZvaWQpc3JjOworICAgICh2b2lkKWRzdDsKKyAgICByZXR1cm4gQzJfT01JVFRFRDsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpxdWVyeV9zbSgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZzdGFja1BhcmFtcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4+ICpjb25zdCBoZWFwUGFyYW1zKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbnRlcmZhY2UucXVlcnkoc3RhY2tQYXJhbXMsIGhlYXBQYXJhbUluZGljZXMsIEMyX01BWV9CTE9DSywgaGVhcFBhcmFtcyk7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Y29uZmlnX3NtKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnBhcmFtcywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+ICpjb25zdCBmYWlsdXJlcykgeworICAgIHJldHVybiBtSW50ZXJmYWNlLmNvbmZpZyhwYXJhbXMsIEMyX01BWV9CTE9DSywgZmFpbHVyZXMpOworfQorCit2b2lkIEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6dmlzaXRDb21wb25lbnRzKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgaWYgKG1WaXNpdGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZm9yIChhdXRvICZwYXRoQW5kTG9hZGVyIDogbUNvbXBvbmVudHMpIHsKKyAgICAgICAgY29uc3QgQzJTdHJpbmcgJnBhdGggPSBwYXRoQW5kTG9hZGVyLmZpcnN0OworICAgICAgICBDb21wb25lbnRMb2FkZXIgJmxvYWRlciA9IHBhdGhBbmRMb2FkZXIuc2Vjb25kOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Q29tcG9uZW50TW9kdWxlPiBtb2R1bGU7CisgICAgICAgIGlmIChsb2FkZXIuZmV0Y2hNb2R1bGUoJm1vZHVsZSkgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBDMkNvbXBvbmVudDo6VHJhaXRzPiB0cmFpdHMgPSBtb2R1bGUtPmdldFRyYWl0cygpOworICAgICAgICAgICAgaWYgKHRyYWl0cykgeworICAgICAgICAgICAgICAgIG1Db21wb25lbnRMaXN0LnB1c2hfYmFjayh0cmFpdHMpOworICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lVG9QYXRoLmVtcGxhY2UodHJhaXRzLT5uYW1lLCBwYXRoKTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IEMyU3RyaW5nICZhbGlhcyA6IHRyYWl0cy0+YWxpYXNlcykgeworICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZVRvUGF0aC5lbXBsYWNlKGFsaWFzLCBwYXRoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgbVZpc2l0ZWQgPSB0cnVlOworfQorCitzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ6OlRyYWl0cz4+IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6bGlzdENvbXBvbmVudHMoKSB7CisgICAgLy8gVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiA1MDBtcy4KKyAgICB2aXNpdENvbXBvbmVudHMoKTsKKyAgICByZXR1cm4gbUNvbXBvbmVudExpc3Q7Cit9CisKK2MyX3N0YXR1c190IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6ZmluZENvbXBvbmVudCgKKyAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gKm1vZHVsZSkgeworICAgICgqbW9kdWxlKS5yZXNldCgpOworICAgIHZpc2l0Q29tcG9uZW50cygpOworCisgICAgYXV0byBwb3MgPSBtQ29tcG9uZW50TmFtZVRvUGF0aC5maW5kKG5hbWUpOworICAgIGlmIChwb3MgIT0gbUNvbXBvbmVudE5hbWVUb1BhdGguZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIG1Db21wb25lbnRzLmF0KHBvcy0+c2Vjb25kKS5mZXRjaE1vZHVsZShtb2R1bGUpOworICAgIH0KKyAgICByZXR1cm4gQzJfTk9UX0ZPVU5EOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiAqY29uc3QgY29tcG9uZW50KSB7CisgICAgLy8gVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICBjb21wb25lbnQtPnJlc2V0KCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbW9kdWxlOworICAgIGMyX3N0YXR1c190IHJlcyA9IGZpbmRDb21wb25lbnQobmFtZSwgJm1vZHVsZSk7CisgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAvLyBUT0RPOiBnZXQgYSB1bmlxdWUgbm9kZSBJRAorICAgICAgICByZXMgPSBtb2R1bGUtPmNyZWF0ZUNvbXBvbmVudCgwLCBjb21wb25lbnQpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmNyZWF0ZUludGVyZmFjZSgKKyAgICAgICAgQzJTdHJpbmcgbmFtZSwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50SW50ZXJmYWNlPiAqY29uc3QgaW50ZXJmYWNlKSB7CisgICAgLy8gVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICBpbnRlcmZhY2UtPnJlc2V0KCk7CisgICAgc3RkOjpzaGFyZWRfcHRyPENvbXBvbmVudE1vZHVsZT4gbW9kdWxlOworICAgIGMyX3N0YXR1c190IHJlcyA9IGZpbmRDb21wb25lbnQobmFtZSwgJm1vZHVsZSk7CisgICAgaWYgKHJlcyA9PSBDMl9PSykgeworICAgICAgICAvLyBUT0RPOiBnZXQgYSB1bmlxdWUgbm9kZSBJRAorICAgICAgICByZXMgPSBtb2R1bGUtPmNyZWF0ZUludGVyZmFjZSgwLCBpbnRlcmZhY2UpOworICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitjMl9zdGF0dXNfdCBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OnF1ZXJ5U3VwcG9ydGVkUGFyYW1zX25iKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbnRlcmZhY2UucXVlcnlTdXBwb3J0ZWRQYXJhbXMocGFyYW1zKTsKK30KKworYzJfc3RhdHVzX3QgQzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlOjpxdWVyeVN1cHBvcnRlZFZhbHVlc19zbSgKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbnRlcmZhY2UucXVlcnlTdXBwb3J0ZWRWYWx1ZXMoZmllbGRzLCBDMl9NQVlfQkxPQ0spOworfQorCitDMlN0cmluZyBDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU6OmdldE5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuICJhbmRyb2lkLmNvbXBvbmVudFN0b3JlLnBsYXRmb3JtIjsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IEMyUGxhdGZvcm1Db21wb25lbnRTdG9yZTo6Z2V0UGFyYW1SZWZsZWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1SZWZsZWN0b3I7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCkgeworICAgIHN0YXRpYyBzdGQ6Om11dGV4IG11dGV4OworICAgIHN0YXRpYyBzdGQ6OndlYWtfcHRyPEMyQ29tcG9uZW50U3RvcmU+IHBsYXRmb3JtU3RvcmU7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobXV0ZXgpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBzdG9yZSA9IHBsYXRmb3JtU3RvcmUubG9jaygpOworICAgIGlmIChzdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgIHN0b3JlID0gc3RkOjptYWtlX3NoYXJlZDxDMlBsYXRmb3JtQ29tcG9uZW50U3RvcmU+KCk7CisgICAgICAgIHBsYXRmb3JtU3RvcmUgPSBzdG9yZTsKKyAgICB9CisgICAgcmV0dXJuIHN0b3JlOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQWxsb2NhdG9yR3JhbGxvYy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvckdyYWxsb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTc1MjRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvckdyYWxsb2MuaApAQCAtMCwwICsxLDk2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0dSQUxMT0NfSF8KKyNkZWZpbmUgU1RBR0VGUklHSFRfQ09ERUMyX0FMTE9DQVRPUl9HUkFMTE9DX0hfCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFVud3JhcCB0aGUgbmF0aXZlIGhhbmRsZSBmcm9tIGEgQ29kZWMyIGhhbmRsZSBhbGxvY2F0ZWQgYnkgQzJBbGxvY2F0b3JHcmFsbG9jLgorICoKKyAqIEBwYXJhbSBoYW5kbGUgYSBoYW5kbGUgYWxsb2NhdGVkIGJ5IEMyQWxsb2NhdG9yR3JhbGxvYy4gVGhpcyBpbmNsdWRlcyBoYW5kbGVzIHJldHVybmVkIGZvciBhCisgKiBncmFwaGljIGJsb2NrIGFsbG9jYXRpb24gaGFuZGxlIHJldHVybmVkLgorICoKKyAqIEByZXR1cm4gYSBuZXcgTk9OLU9XTklORyBuYXRpdmUgaGFuZGxlIHRoYXQgbXVzdCBiZSBkZWxldGVkIHVzaW5nIG5hdGl2ZV9oYW5kbGVfZGVsZXRlLgorICovCituYXRpdmVfaGFuZGxlX3QgKlVud3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoY29uc3QgQzJIYW5kbGUgKmNvbnN0IGhhbmRsZSk7CisKKy8qKgorICogV3JhcCB0aGUgZ3JhbGxvYyBoYW5kbGUgYW5kIG1ldGFkYXRhIGludG8gQ29kZWMyIGhhbmRsZSByZWNvZ25pemVkIGJ5CisgKiBDMkFsbG9jYXRvckdyYWxsb2MuCisgKgorICogQHJldHVybiBhIG5ldyBOT04tT1dOSU5HIEMySGFuZGxlIHRoYXQgbXVzdCBiZSBkZWxldGVkIHVzaW5nIG5hdGl2ZV9oYW5kbGVfZGVsZXRlLgorICovCitDMkhhbmRsZSAqV3JhcE5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqY29uc3QgaGFuZGxlLAorICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCB1aW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlLCB1aW50MzJfdCBzdHJpZGUsCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24gPSAwLCB1aW50NjRfdCBpZ2JwX2lkID0gMCwgdWludDMyX3QgaWdicF9zbG90ID0gMCk7CisKKy8qKgorICogV2hlbiB0aGUgZ3JhbGxvYyBoYW5kbGUgaXMgbWlncmF0ZWQgdG8gYW5vdGhlciBidWZmZXJxdWV1ZSwgdXBkYXRlCisgKiBidWZmZXJxdWV1ZSBpbmZvcm1hdGlvbi4KKyAqCisgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB3aGVuIG5hdGl2ZV9oYW5kbGUgaXMgYSB3cmFwcGVkIGNvZGVjMiBoYW5kbGUuCisgKi8KK2Jvb2wgTWlncmF0ZU5hdGl2ZUNvZGVjMkdyYWxsb2NIYW5kbGUoCisgICAgICAgIG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBpZ2JwX2lkLCB1aW50MzJfdCBpZ2JwX3Nsb3QpOworCisvKioKKyAqIFx0b2RvIEdldCB0aGlzIGZyb20gdGhlIGJ1ZmZlcgorICovCit2b2lkIF9VbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jTWV0YWRhdGEoCisgICAgICAgIGNvbnN0IEMySGFuZGxlICpjb25zdCBoYW5kbGUsCisgICAgICAgIHVpbnQzMl90ICp3aWR0aCwgdWludDMyX3QgKmhlaWdodCwgdWludDMyX3QgKmZvcm1hdCwgdWludDY0X3QgKnVzYWdlLCB1aW50MzJfdCAqc3RyaWRlLAorICAgICAgICB1aW50MzJfdCAqZ2VuZXJhdGlvbiwgdWludDY0X3QgKmlnYnBfaWQsIHVpbnQzMl90ICppZ2JwX3Nsb3QpOworCitjbGFzcyBDMkFsbG9jYXRvckdyYWxsb2MgOiBwdWJsaWMgQzJBbGxvY2F0b3IgeworcHVibGljOgorICAgIHZpcnR1YWwgaWRfdCBnZXRJZCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBDMlN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBUcmFpdHM+IGdldFRyYWl0cygpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBuZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIHVpbnQzMl90IGZvcm1hdCwgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiAqYWxsb2NhdGlvbikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHByaW9yR3JhcGhpY0FsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0FsbG9jYXRpb24+ICphbGxvY2F0aW9uKSBvdmVycmlkZTsKKworICAgIEMyQWxsb2NhdG9yR3JhbGxvYyhpZF90IGlkLCBib29sIGJ1ZmZlclF1ZXVlID0gZmFsc2UpOworCisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvckdyYWxsb2MoKSBvdmVycmlkZTsKKworICAgIHN0YXRpYyBib29sIGlzVmFsaWQoY29uc3QgQzJIYW5kbGUqIGNvbnN0IG8pOworCitwcml2YXRlOgorICAgIGNsYXNzIEltcGw7CisgICAgSW1wbCAqbUltcGw7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0dSQUxMT0NfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JJb24uaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJBbGxvY2F0b3JJb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjIwNTFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkFsbG9jYXRvcklvbi5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0lPTl9IXworI2RlZmluZSBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0lPTl9IXworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEMyQWxsb2NhdG9ySW9uIDogcHVibGljIEMyQWxsb2NhdG9yIHsKK3B1YmxpYzoKKyAgICAvLyBVc2FnZSBtYXBwZXIgZnVuY3Rpb24gdXNlZCBieSB0aGUgYWxsb2NhdG9yCisgICAgLy8gICAodXNhZ2UsIGNhcGFjaXR5KSA9PiAoYWxpZ24sIGhlYXBNYXNrLCBmbGFncykKKyAgICAvLworICAgIC8vIGNhcGFjaXR5IGlzIGFsaWduZWQgdG8gdGhlIGRlZmF1bHQgYmxvY2stc2l6ZSAoZGVmYXVsdHMgdG8gcGFnZSBzaXplKSB0byByZWR1Y2UgY2FjaGluZworICAgIC8vIG92ZXJoZWFkCisgICAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPGMyX3N0YXR1c190KEMyTWVtb3J5VXNhZ2UsIHNpemVfdCwKKyAgICAgICAgICAgICAgICAgICAgICAvKiA9PiAqLyBzaXplX3QqLCB1bnNpZ25lZCosIHVuc2lnbmVkKik+IFVzYWdlTWFwcGVyRm47CisKKyAgICB2aXJ0dWFsIGlkX3QgZ2V0SWQoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgQzJTdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgVHJhaXRzPiBnZXRUcmFpdHMoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgbmV3TGluZWFyQWxsb2NhdGlvbigKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LCBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBwcmlvckxpbmVhckFsbG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gKmFsbG9jYXRpb24pIG92ZXJyaWRlOworCisgICAgQzJBbGxvY2F0b3JJb24oaWRfdCBpZCk7CisKKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IHN0YXR1cygpIGNvbnN0IHsgcmV0dXJuIG1Jbml0OyB9CisKKyAgICB2aXJ0dWFsIH5DMkFsbG9jYXRvcklvbigpIG92ZXJyaWRlOworCisgICAgc3RhdGljIGJvb2wgaXNWYWxpZChjb25zdCBDMkhhbmRsZSogY29uc3Qgbyk7CisKKyAgICAvKioKKyAgICAgKiBVcGRhdGVzIHRoZSB1c2FnZSBtYXBwZXIgZm9yIHN1YnNlcXVlbnQgbmV3IGFsbG9jYXRpb25zLCBhcyB3ZWxsIGFzIHRoZSBzdXBwb3J0ZWQKKyAgICAgKiBtaW5pbXVtIGFuZCBtYXhpbXVtIHVzYWdlIG1hc2tzIGFuZCBkZWZhdWx0IGJsb2NrLXNpemUgdG8gdXNlIGZvciB0aGUgbWFwcGVyLgorICAgICAqCisgICAgICogXHBhcmFtIG1hcHBlciB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgdG8gbWFwIENvZGVjIDIuMCBidWZmZXIgdXNhZ2UgdG8gaW9uIGZsYWdzCisgICAgICogICAgICAgIHJlcXVpcmVkIGJ5IHRoZSBpb24gZGV2aWNlCisgICAgICogXHBhcmFtIG1pblVzYWdlIG1pbmltdW0gYnVmZmVyIHVzYWdlIHJlcXVpcmVkIGZvciBzdXBwb3J0ZWQgYWxsb2NhdGlvbnMgKGRlZmF1bHRzIHRvIDApCisgICAgICogXHBhcmFtIG1heFVzYWdlIG1heGltdW0gYnVmZmVyIHVzYWdlIHN1cHBvcnRlZCBieSB0aGUgaW9uIGFsbG9jYXRvciAoZGVmYXVsdHMgdG8gU1dfUkVBRAorICAgICAqICAgICAgICB8IFNXX1dSSVRFKQorICAgICAqIFxwYXJhbSBibG9ja1NpemUgYWxpZ25tZW50IHVzZWQgcHJpb3IgdG8gY2FsbGluZyB8bWFwcGVyfCBmb3IgdGhlIGJ1ZmZlciBjYXBhY2l0eS4KKyAgICAgKiAgICAgICAgVGhpcyBhbHNvIGhlbHBzIHJlZHVjZSB0aGUgc2l6ZSBvZiBjYWNoZSByZXF1aXJlZCBmb3IgY2FjaGluZyBtYXBwZXIgcmVzdWx0cy4KKyAgICAgKiAgICAgICAgKGRlZmF1bHRzIHRvIHRoZSBwYWdlIHNpemUpCisgICAgICovCisgICAgdm9pZCBzZXRVc2FnZU1hcHBlcigKKyAgICAgICAgICAgIGNvbnN0IFVzYWdlTWFwcGVyRm4gJm1hcHBlciwgdWludDY0X3QgbWluVXNhZ2UsIHVpbnQ2NF90IG1heFVzYWdlLCB1aW50NjRfdCBibG9ja1NpemUpOworCitwcml2YXRlOgorICAgIGMyX3N0YXR1c190IG1hcFVzYWdlKEMyTWVtb3J5VXNhZ2UgdXNhZ2UsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgLyogPT4gKi8gc2l6ZV90ICphbGlnbiwgdW5zaWduZWQgKmhlYXBNYXNrLCB1bnNpZ25lZCAqZmxhZ3MpOworCisgICAgYzJfc3RhdHVzX3QgbUluaXQ7CisgICAgaW50IG1Jb25GZDsKKworICAgIC8vIHRoaXMgbG9ja3MgbVRyYWl0cywgbUJsb2NrU2l6ZSwgbVVzYWdlTWFwcGVyLCBtVXNhZ2VNYXBwZXJMcnUgYW5kIG1Vc2FnZU1hcHBlckNhY2hlCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Vc2FnZU1hcHBlckxvY2s7CisgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IFRyYWl0cz4gbVRyYWl0czsKKyAgICBzaXplX3QgbUJsb2NrU2l6ZTsKKyAgICBVc2FnZU1hcHBlckZuIG1Vc2FnZU1hcHBlcjsKKyAgICB0eXBlZGVmIHN0ZDo6cGFpcjx1aW50NjRfdCwgc2l6ZV90PiBNYXBwZXJLZXk7CisgICAgc3RydWN0IE1hcHBlcktleUhhc2ggeworICAgICAgICBzdGQ6OnNpemVfdCBvcGVyYXRvcigpKGNvbnN0IE1hcHBlcktleSAmKSBjb25zdDsKKyAgICB9OworICAgIHR5cGVkZWYgc3RkOjp0dXBsZTxzaXplX3QsIHVuc2lnbmVkLCB1bnNpZ25lZCwgYzJfc3RhdHVzX3Q+IE1hcHBlclZhbHVlOworICAgIHR5cGVkZWYgc3RkOjpwYWlyPE1hcHBlcktleSwgTWFwcGVyVmFsdWU+IE1hcHBlcktleVZhbHVlOworICAgIHR5cGVkZWYgc3RkOjpsaXN0PE1hcHBlcktleVZhbHVlPjo6aXRlcmF0b3IgTWFwcGVyS2V5VmFsdWVQb2ludGVyOworICAgIHN0ZDo6bGlzdDxNYXBwZXJLZXlWYWx1ZT4gbVVzYWdlTWFwcGVyTHJ1OworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxNYXBwZXJLZXksIE1hcHBlcktleVZhbHVlUG9pbnRlciwgTWFwcGVyS2V5SGFzaD4gbVVzYWdlTWFwcGVyQ2FjaGU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfQUxMT0NBVE9SX0lPTl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJxQnVmZmVyUHJpdi5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJxQnVmZmVyUHJpdi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxYTgxMzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnFCdWZmZXJQcml2LmgKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0JRX0JVRkZFUl9QUklWX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9CUV9CVUZGRVJfUFJJVl9IXworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8yLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK2NsYXNzIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2wgOiBwdWJsaWMgQzJCbG9ja1Bvb2wgeworcHVibGljOgorICAgIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yLCBjb25zdCBsb2NhbF9pZF90IGxvY2FsSWQpOworCisgICAgdmlydHVhbCB+QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbCgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0b3ItPmdldElkKCk7CisgICAgfTsKKworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUxvY2FsSWQ7CisgICAgfTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSBvdmVycmlkZTsKKworICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKHVpbnQ2NF90IHByb2R1Y2VyLCBpbnQzMl90IHNsb3QsIGludDY0X3QgbnNlY3MpPiBPblJlbmRlckNhbGxiYWNrOworCisgICAgLyoqCisgICAgICogU2V0cyByZW5kZXIgY2FsbGJhY2suCisgICAgICoKKyAgICAgKiBccGFyYW0gcmVuZGVyQ2FsbGJhayBjYWxsYmFjayB0byBjYWxsIGZvciBhbGwgZGVxdWV1ZSBidWZmZXIuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIHNldFJlbmRlckNhbGxiYWNrKGNvbnN0IE9uUmVuZGVyQ2FsbGJhY2sgJnJlbmRlckNhbGxiYWNrID0gT25SZW5kZXJDYWxsYmFjaygpKTsKKworICAgIHR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMl8wOjoKKyAgICAgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKKyAgICAvKioKKyAgICAgKiBDb25maWd1cmVzIGFuIElHQlAgaW4gb3JkZXIgdG8gY3JlYXRlIGJsb2Nrcy4gQSBuZXdseSBjcmVhdGVkIGJsb2NrIGlzCisgICAgICogZGVxdWV1ZWQgZnJvbSB0aGUgY29uZmlndXJlZCBJR0JQLiBVbmlxdWUgSWQgb2YgSUdCUCBhbmQgdGhlIHNsb3QgbnVtYmVyIG9mCisgICAgICogYmxvY2tzIGFyZSBwYXNzZWQgdmlhIG5hdGl2ZV9oYW5kbGUuIE1hbmFnaW5nIElHQlAgaXMgcmVzcG9uc2liaWxpdHkgb2YgY2FsbGVyLgorICAgICAqIFdoZW4gSUdCUCBpcyBub3QgY29uZmlndXJlZCwgYmxvY2sgd2lsbCBiZSBjcmVhdGVkIHZpYSBhbGxvY2F0b3IuCisgICAgICogU2luY2UgemVybyBpcyBub3QgdXNlZCBmb3IgVW5pcXVlIElkIG9mIElHQlAsIGlmIElHQlAgaXMgbm90IGNvbmZpZ3VyZWQgb3IgcHJvZHVjZXIKKyAgICAgKiBpcyBjb25maWd1cmVkIGFzIG51bGxwdHIsIHVuaXF1ZSBpZCB3aGljaCBpcyBidW5kbGVkIGluIG5hdGl2ZV9oYW5kbGUgaXMgemVyby4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwcm9kdWNlciAgICAgIHRoZSBJR0JQLCB3aGljaCB3aWxsIGJlIHVzZWQgdG8gZmV0Y2ggYmxvY2tzCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGNvbmZpZ3VyZVByb2R1Y2VyKGNvbnN0IGFuZHJvaWQ6OnNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZwcm9kdWNlcik7CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworICAgIGNvbnN0IGxvY2FsX2lkX3QgbUxvY2FsSWQ7CisKKyAgICBjbGFzcyBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKworICAgIGZyaWVuZCBzdHJ1Y3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE7Cit9OworCisjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX0JVRkZFUl9QUklWX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyQnVmZmVyUHJpdi5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJ1ZmZlclByaXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTVmNjljCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkJ1ZmZlclByaXYuaApAQCAtMCwwICsxLDEyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0JVRkZFUl9QUklWX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9CVUZGRVJfUFJJVl9IXworCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9idWZmZXJwb29sLzIuMC9JQWNjZXNzb3IuaD4KKworY2xhc3MgQzJCYXNpY0xpbmVhckJsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQzJCYXNpY0xpbmVhckJsb2NrUG9vbChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IpOworCisgICAgdmlydHVhbCB+QzJCYXNpY0xpbmVhckJsb2NrUG9vbCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdG9yLT5nZXRJZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gQkFTSUNfTElORUFSOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IGNhcGFjaXR5LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAqYmxvY2sgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7CisKKyAgICAvLyBUT0RPOiBmZXRjaENpcmN1bGFyQmxvY2sKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7Cit9OworCitjbGFzcyBDMkJhc2ljR3JhcGhpY0Jsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQzJCYXNpY0dyYXBoaWNCbG9ja1Bvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKTsKKworICAgIHZpcnR1YWwgfkMyQmFzaWNHcmFwaGljQmxvY2tQb29sKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCBDMkFsbG9jYXRvcjo6aWRfdCBnZXRBbGxvY2F0b3JJZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1BbGxvY2F0b3ItPmdldElkKCk7CisgICAgfQorCisgICAgdmlydHVhbCBsb2NhbF9pZF90IGdldExvY2FsSWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBCQVNJQ19HUkFQSElDOworICAgIH0KKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7Cit9OworCitjbGFzcyBDMlBvb2xlZEJsb2NrUG9vbCA6IHB1YmxpYyBDMkJsb2NrUG9vbCB7CitwdWJsaWM6CisgICAgQzJQb29sZWRCbG9ja1Bvb2woY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yLCBjb25zdCBsb2NhbF9pZF90IGxvY2FsSWQpOworCisgICAgdmlydHVhbCB+QzJQb29sZWRCbG9ja1Bvb2woKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgQzJBbGxvY2F0b3I6OmlkX3QgZ2V0QWxsb2NhdG9ySWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBtQWxsb2NhdG9yLT5nZXRJZCgpOworICAgIH0KKworICAgIHZpcnR1YWwgbG9jYWxfaWRfdCBnZXRMb2NhbElkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbUxvY2FsSWQ7CisgICAgfQorCisgICAgdmlydHVhbCBjMl9zdGF0dXNfdCBmZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgdWludDMyX3QgY2FwYWNpdHksCisgICAgICAgICAgICBDMk1lbW9yeVVzYWdlIHVzYWdlLAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICpibG9jayAvKiBub25udWxsICovKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgICAgIHVpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIHVpbnQzMl90IGZvcm1hdCwKKyAgICAgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+ICpibG9jaykgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGNvbm5lY3Rpb24gSWQgZm9yIHVuZGVybHlpbmcgYnVmZmVycG9vbAorICAgICAqLworICAgIGludDY0X3QgZ2V0Q29ubmVjdGlvbklkKCk7CisKKyAgICAvKioKKyAgICAgKiBSZXRyaWV2ZXMgdGhlIGFjY2Vzc29yIHdoaWNoIGlzIHVzZWQgYnkgdW5kZXJseWluZyBidWZmZXJwb29sLiAoSXQgY2FuIGJlCisgICAgICogcGFzc2VkIHRvIHJlY2VpdmluZyBwcm9jZXNzLikKKyAgICAgKgorICAgICAqIFxwYXJhbSBhY2Nlc3NvciAgICAgICAgICBJQWNjZXNzb3Igd2lsbCBiZSB3cml0dGVuIHRvIHRoaXMgb3V0IHBhcmFtZXRlci4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdHJ1ZSAgICAgICAgICAgICBJQWNlc3NvciBpcyB3cml0ZW4gc3VjY2Vzc2Z1bGx5LgorICAgICAqIFxyZXR1cm4gZmFsc2UgICAgICAgICAgICBJQWNjZXNzb3IgaXMgbm90IHdyaXR0ZW4uCisgICAgICovCisgICAgYm9vbCBnZXRBY2Nlc3NvcihhbmRyb2lkOjpzcDxhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OlYyXzA6OklBY2Nlc3Nvcj4gKmFjY2Vzc29yKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1BbGxvY2F0b3I7CisgICAgY29uc3QgbG9jYWxfaWRfdCBtTG9jYWxJZDsKKworICAgIGNsYXNzIEltcGw7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltcGw+IG1JbXBsOworfTsKKworI2VuZGlmIC8vIFNUQUdFRlJJR0hUX0NPREVDMl9CVUZGRVJfUFJJVl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkNvbXBvbmVudEZhY3RvcnkuaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJDb21wb25lbnRGYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjZkOGI5OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJDb21wb25lbnRGYWN0b3J5LmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQ09ERUMyX0NPTVBPTkVOVF9GQUNUT1JZX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9DT01QT05FTlRfRkFDVE9SWV9IXworCisjaW5jbHVkZSA8QzJDb21wb25lbnQuaD4KKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorCisvKioKKyAqIENvbXBvbmVudCBmYWN0b3J5IG9iamVjdCB0aGF0IGVuYWJsZXMgdG8gY3JlYXRlIGEgY29tcG9uZW50IGFuZC9vciBpbnRlcmZhY2UgZnJvbSBhIGR5bmFtaWNhbGx5CisgKiBsaW5rZWQgbGlicmFyeS4gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSB0aGUgY29tcG9uZW50L2ludGVyZmFjZXMgYXJlIG1hbmFnZWQgb2JqZWN0cywgYnV0IHdlCisgKiBjYW5ub3Qgc2FmZWx5IGNyZWF0ZSBhIG1hbmFnZWQgb2JqZWN0IGFuZCBwYXNzIGl0IGluIEMuCisgKgorICogQ29tcG9uZW50cy9pbnRlcmZhY2VzIHR5cGljYWxseSBpbmhlcml0IGZyb20gc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpcywgYnV0IEMgcmVxdWlyZXMKKyAqIHBhc3Npbmcgc2ltcGxlIHBvaW50ZXIsIGFuZCBzaGFyZWRfcHRyIGNvbnN0cnVjdG9yIG5lZWRzIHRvIGtub3cgdGhlIGNsYXNzIHRvIGJlIGNvbnN0cnVjdGVkCisgKiBkZXJpdmVzIGZyb20gZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMuCisgKgorICovCitjbGFzcyBDMkNvbXBvbmVudEZhY3RvcnkgeworcHVibGljOgorICAgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKDo6QzJDb21wb25lbnQqKT4gQ29tcG9uZW50RGVsZXRlcjsKKyAgICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248dm9pZCg6OkMyQ29tcG9uZW50SW50ZXJmYWNlKik+IEludGVyZmFjZURlbGV0ZXI7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgY29tcG9uZW50LgorICAgICAqCisgICAgICogVGhpcyBtZXRob2QgU0hBTEwgcmV0dXJuIHdpdGhpbiAxMDBtcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBpZCAgICAgICAgY29tcG9uZW50IElEIGZvciB0aGUgY3JlYXRlZCBjb21wb25lbnQKKyAgICAgKiBccGFyYW0gY29tcG9uZW50IHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGNvbXBvbmVudCBpcyBzdG9yZWQuIENsZWFyZWQgb24KKyAgICAgKiAgICAgICAgICAgICAgICAgIGZhaWx1cmUgYW5kIHVwZGF0ZWQgb24gc3VjY2Vzcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgd2FzIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5CisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgY29tcG9uZW50IHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgY29tcG9uZW50ICh1bmV4cGVjdGVkKQorICAgICAqCisgICAgICogXHJldHZhbCBDMl9OT19NRU1PUlkgbm90IGVub3VnaCBtZW1vcnkgdG8gY3JlYXRlIHRoZSBjb21wb25lbnQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGMyX3N0YXR1c190IGNyZWF0ZUNvbXBvbmVudCgKKyAgICAgICAgICAgIGMyX25vZGVfaWRfdCBpZCwgc3RkOjpzaGFyZWRfcHRyPEMyQ29tcG9uZW50PiogY29uc3QgY29tcG9uZW50LAorICAgICAgICAgICAgQ29tcG9uZW50RGVsZXRlciBkZWxldGVyID0gc3RkOjpkZWZhdWx0X2RlbGV0ZTxDMkNvbXBvbmVudD4oKSkgPSAwOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvbXBvbmVudCBpbnRlcmZhY2UuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBTSEFMTCByZXR1cm4gd2l0aGluIDEwMG1zLgorICAgICAqCisgICAgICogXHBhcmFtIGlkICAgICAgICBjb21wb25lbnQgaW50ZXJmYWNlIElEIGZvciB0aGUgY3JlYXRlZCBpbnRlcmZhY2UKKyAgICAgKiBccGFyYW0gaW50ZXJmYWNlIHNoYXJlZCBwb2ludGVyIHdoZXJlIHRoZSBjcmVhdGVkIGludGVyZmFjZSBpcyBzdG9yZWQuIENsZWFyZWQgb24KKyAgICAgKiAgICAgICAgICAgICAgICAgIGZhaWx1cmUgYW5kIHVwZGF0ZWQgb24gc3VjY2Vzcy4KKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIHRoZSBjb21wb25lbnQgaW50ZXJmYWNlIHdhcyBjcmVhdGVkIHN1Y2Nlc3NmdWxseQorICAgICAqIFxyZXR2YWwgQzJfVElNRURfT1VUIGNvdWxkIG5vdCBjcmVhdGUgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2Ugd2l0aGluIHRoZSB0aW1lIGxpbWl0CisgICAgICogICAgICAgICAgICAgICAgICAgICAgKHVuZXhwZWN0ZWQpCisgICAgICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duIGVycm9yIHByZXZlbnRlZCB0aGUgY3JlYXRpb24gb2YgdGhlIGNvbXBvbmVudCBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAodW5leHBlY3RlZCkKKyAgICAgKgorICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNyZWF0ZSB0aGUgY29tcG9uZW50IGludGVyZmFjZQorICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY3JlYXRlSW50ZXJmYWNlKAorICAgICAgICAgICAgYzJfbm9kZV9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRJbnRlcmZhY2U+KiBjb25zdCBpbnRlcmZhY2UsCisgICAgICAgICAgICBJbnRlcmZhY2VEZWxldGVyIGRlbGV0ZXIgPSBzdGQ6OmRlZmF1bHRfZGVsZXRlPEMyQ29tcG9uZW50SW50ZXJmYWNlPigpKSA9IDA7CisKKyAgICB2aXJ0dWFsIH5DMkNvbXBvbmVudEZhY3RvcnkoKSA9IGRlZmF1bHQ7CisKKyAgICB0eXBlZGVmIDo6QzJDb21wb25lbnRGYWN0b3J5KiAoKkNyZWF0ZUNvZGVjMkZhY3RvcnlGdW5jKSh2b2lkKTsKKyAgICB0eXBlZGVmIHZvaWQgKCpEZXN0cm95Q29kZWMyRmFjdG9yeUZ1bmMpKDo6QzJDb21wb25lbnRGYWN0b3J5Kik7Cit9OworCisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfQ09NUE9ORU5UX0ZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJEZWJ1Zy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkRlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWYxY2RhYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJEZWJ1Zy5oCkBAIC0wLDAgKzEsMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfREVCVUdfSF8KKyNkZWZpbmUgQzJVVElMU19ERUJVR19IXworCisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWxvZy5oPgorCisvLyBUbyBhbGxvdyBhcmJpdHJhcnkgb3JkZXJpbmcgb2YgQzJEZWJ1Zy5oIGFuZCBBUEkgaGVhZGVycyBhbmQgdG8ga2VlcCBkZWJ1ZyB1dGlsaXRpZXMgc2VwYXJhdGVseQorLy8gZnJvbSB0aGUgQVBJIGRlZmluaXRpb25zLCB3ZSBwcm92aWRlIEFQSSBoZWFkZXIgc3BlY2lmaWMgZGVidWcgaGVhZGVycy4KKyNpZmRlZiBDMlBBUkFNX0hfCisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLXBhcmFtLmg+CisjZW5kaWYKKworI2VuZGlmICAvLyBDMlVUSUxTX0RFQlVHX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyRXJybm9VdGlscy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkVycm5vVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yjk5NWY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMkVycm5vVXRpbHMuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0NPREVDMl9FUlJOT19VVElMU19IXworI2RlZmluZSBTVEFHRUZSSUdIVF9DT0RFQzJfRVJSTk9fVVRJTFNfSF8KKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8QzIuaD4KKworLy8gc3RhbmRhcmQgRVJSTk8gbWFwcGluZ3MKK3RlbXBsYXRlPGludCBOPiBjb25zdGV4cHIgYzJfc3RhdHVzX3QgX2MyX2Vycm5vMnN0YXR1c19pbXBsKCk7Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8MD4oKSAgICAgICB7IHJldHVybiBDMl9PSzsgfQordGVtcGxhdGU8PiBjb25zdGV4cHIgYzJfc3RhdHVzX3QgX2MyX2Vycm5vMnN0YXR1c19pbXBsPEVJTlZBTD4oKSAgeyByZXR1cm4gQzJfQkFEX1ZBTFVFOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8RUFDQ0VTPigpICB7IHJldHVybiBDMl9SRUZVU0VEOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8RVBFUk0+KCkgICB7IHJldHVybiBDMl9SRUZVU0VEOyB9Cit0ZW1wbGF0ZTw+IGNvbnN0ZXhwciBjMl9zdGF0dXNfdCBfYzJfZXJybm8yc3RhdHVzX2ltcGw8RU5PTUVNPigpICB7IHJldHVybiBDMl9OT19NRU1PUlk7IH0KKworLy8gbWFwIHN0YW5kYXJkIGVycm5vLXMgdG8gdGhlIGVxdWl2YWxlbnQgYzJfc3RhdHVzX3QKK3RlbXBsYXRlPGludC4uLiBOPiBzdHJ1Y3QgX2MyX21hcF9lcnJub19pbXBsOwordGVtcGxhdGU8aW50IEUsIGludCAuLi4gTj4gc3RydWN0IF9jMl9tYXBfZXJybm9faW1wbDxFLCBOLi4uPiB7CisgICAgc3RhdGljIGMyX3N0YXR1c190IG1hcChpbnQgcmVzdWx0KSB7CisgICAgICAgIGlmIChyZXN1bHQgPT0gRSkgeworICAgICAgICAgICAgcmV0dXJuIF9jMl9lcnJubzJzdGF0dXNfaW1wbCA8RT4oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBfYzJfbWFwX2Vycm5vX2ltcGw8Ti4uLj46Om1hcChyZXN1bHQpOworICAgICAgICB9CisgICAgfQorfTsKK3RlbXBsYXRlPD4gc3RydWN0IF9jMl9tYXBfZXJybm9faW1wbDw+IHsKKyAgICBzdGF0aWMgYzJfc3RhdHVzX3QgbWFwKGludCByZXN1bHQpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdCA9PSAwID8gQzJfT0sgOiBDMl9DT1JSVVBURUQ7CisgICAgfQorfTsKKwordGVtcGxhdGU8aW50Li4uIE4+CitjMl9zdGF0dXNfdCBjMl9tYXBfZXJybm8oaW50IHJlc3VsdCkgeworICAgIHJldHVybiBfYzJfbWFwX2Vycm5vX2ltcGw8Ti4uLj46Om1hcChyZXN1bHQpOworfQorCisjZW5kaWYgLy8gU1RBR0VGUklHSFRfQ09ERUMyX0VSUk5PX1VUSUxTX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMTA2NDMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlci5oCkBAIC0wLDAgKzEsOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgU1RBR0VGUklHSFRfQzJfUExBVEZPUk1fU1RPUkVfUExVR0lOX0xPQURFUl9IXworCisjZGVmaW5lIFNUQUdFRlJJR0hUX0MyX1BMQVRGT1JNX1NUT1JFX1BMVUdJTl9MT0FERVJfSF8KKworI2luY2x1ZGUgPG1lbW9yeT4KKworI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisKKyNpbmNsdWRlIDxDMi5oPgorI2luY2x1ZGUgPEMyQnVmZmVyLmg+CisKKy8qKgorICogRXh0ZXJuIEMgaW50ZXJmYWNlIGZvciBjcmVhdGluZyBibG9jayBwb29sIGZyb20gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICoKKyAqIFxwYXJhbSBhbGxvY3RvcklkICB0aGUgSUQgb2YgdGhlIGJhY2tpbmcgYWxsb2NhdG9yIHR5cGUuCisgKiBccGFyZW0gYmxvY2tQb29sSWQgdGhlIElEIG9mIGNyZWF0ZWQgYmxvY2sgcG9vbC4KKyAqCisgKiBccmV0dXJuIHBvaW50ZXIgb2YgY3JlYXRlZCBDMkJsb2NrUG9vbCwgbnVsbHB0ciBvbiBlcnJvci4KKyAqLwordHlwZWRlZiA6OkMyQmxvY2tQb29sKiAoKkNyZWF0ZUJsb2NrUG9vbEZ1bmMpKDo6QzJBbGxvY2F0b3I6OmlkX3QsIDo6QzJCbG9ja1Bvb2w6OmxvY2FsX2lkX3QpOworCisvKioKKyAqIEV4dGVybiBDIGludGVyZmFjZSBmb3IgY3JlYXRpbmcgYWxsb2NhdG9yIGZyb20gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICoKKyAqIFxwYXJhbSBhbGxvY3RvcklkICB0aGUgSUQgb2YgdGhlIGFsbG9jYXRvciB0byBjcmVhdGUuCisgKiBccGFyYW0gc3RhdHVzICAgICAgdGhlIHJldHVybmVkIHN0YXR1cyBmcm9tIGNyZWF0aW5nIGFsbG9jYXRvci4KKyAqCisgKiBccmV0dXJuIHBvaW50ZXIgb2YgY3JlYXRlZCBDMkFsbG9jYXRvciwgbnVsbHB0ciBvbiBlcnJvci4KKyAqLwordHlwZWRlZiA6OkMyQWxsb2NhdG9yKiAoKkNyZWF0ZUFsbG9jYXRvckZ1bmMpKDo6QzJBbGxvY2F0b3I6OmlkX3QsIDo6YzJfc3RhdHVzX3QqKTsKKworY2xhc3MgQzJQbGF0Zm9ybVN0b3JlUGx1Z2luTG9hZGVyIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcj4mIEdldEluc3RhbmNlKCk7CisgICAgfkMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcigpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBibG9jayBwb29sIGZyb20gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICAgICAqCisgICAgICogXHBhcmFtIGFsbG9jdG9ySWQgIHRoZSBJRCBvZiB0aGUgYmFja2luZyBhbGxvY2F0b3IgdHlwZS4KKyAgICAgKiBccGFyYW0gYmxvY2tQb29sSWQgdGhlIElEIG9mIGNyZWF0ZWQgYmxvY2sgcG9vbC4KKyAgICAgKiBccGFyYW0gcG9vbCAgICAgICAgc2hhcmVkIHBvaW50ZXIgd2hlcmUgdGhlIGNyZWF0ZWQgYmxvY2sgcG9vbCBpcyBzdG9yZWQuCisgICAgICoKKyAgICAgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgYmxvY2sgcG9vbCB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogXHJldHZhbCBDMl9OT1RfRk9VTkQgdGhlIGV4dGVuc2lvbiBzeW1ib2wgd2FzIG5vdCBmb3VuZC4KKyAgICAgKiBccmV0dmFsIEMyX0JBRF9JTkRFWCB0aGUgaW5wdXQgYWxsb2NhdG9ySWQgaXMgbm90IGRlZmluZWQgaW4gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICAgICAqLworICAgIGMyX3N0YXR1c190IGNyZWF0ZUJsb2NrUG9vbCg6OkMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6OkMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGJsb2NrUG9vbElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+KiBwb29sKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYWxsb2NhdG9yIGZyb20gcGxhdGZvcm0gc3RvcmUgZXh0ZW5zaW9uLgorICAgICAqCisgICAgICogTm90ZSB0aGF0IHRoaXMgYWxsb2NhdG9yIGlzIG5vdCBjcmVhdGVkIGFzIHNoYXJlZCBzaW5nbGV0b24gYXMgQzJBbGxvY2F0b3JTdG9yZSBkb2VzLCBiZWNhdXNlCisgICAgICogQyBpbnRlcmZhY2Ugb25seSBhbGxvd3MgcmF3IHBvaW50ZXIgdHJhbnNtaXNzaW9uIGZvciBleHRlbnNpb24uCisgICAgICoKKyAgICAgKiBccGFyYW0gYWxsb2N0b3JJZCAgdGhlIElEIG9mIHRoZSBhbGxvY2F0b3IgdG8gY3JlYXRlLgorICAgICAqIFxwYXJhbSBhbGxvY2F0b3IgICBzaGFyZWQgcG9pbnRlciB3aGVyZSB0aGUgY3JlYXRlZCBhbGxvY2F0b3IgaXMgc3RvcmVkLgorICAgICAqCisgICAgICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIGFsbG9jYXRvciB3YXMgY3JlYXRlZCBzdWNjZXNzZnVsbHkuCisgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY291bGQgbm90IGNyZWF0ZSB0aGUgYWxsb2NhdG9yIHdpdGhpbiB0aGUgdGltZSBsaW1pdCAodW5leHBlY3RlZCkKKyAgICAgKiBccmV0dmFsIEMyX0NPUlJVUFRFRCBzb21lIHVua25vd24gZXJyb3IgcHJldmVudGVkIHRoZSBjcmVhdGlvbiBvZiB0aGUgYWxsb2NhdG9yICh1bmV4cGVjdGVkKQorICAgICAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIHRoZSBleHRlbnNpb24gc3ltYm9sIHdhcyBub3QgZm91bmQuCisgICAgICogXHJldHZhbCBDMl9CQURfSU5ERVggdGhlIGlucHV0IGFsbG9jYXRvcklkIGlzIG5vdCBkZWZpbmVkIGluIHBsYXRmb3JtIHN0b3JlIGV4dGVuc2lvbi4KKyAgICAgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgdGhlIGFsbG9jYXRvcgorICAgICAqLworICAgIGMyX3N0YXR1c190IGNyZWF0ZUFsbG9jYXRvcig6OkMyQWxsb2NhdG9yOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+KiBjb25zdCBhbGxvY2F0b3IpOworCitwcml2YXRlOgorICAgIGV4cGxpY2l0IEMyUGxhdGZvcm1TdG9yZVBsdWdpbkxvYWRlcihjb25zdCBjaGFyICpsaWJQYXRoKTsKKworICAgIHN0YXRpYyBhbmRyb2lkOjpNdXRleCBzTXV0ZXg7CisgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDMlBsYXRmb3JtU3RvcmVQbHVnaW5Mb2FkZXI+IHNJbnN0YW5jZTsKKworICAgIHZvaWQgKm1MaWJIYW5kbGU7CisgICAgQ3JlYXRlQmxvY2tQb29sRnVuYyBtQ3JlYXRlQmxvY2tQb29sOworICAgIENyZWF0ZUFsbG9jYXRvckZ1bmMgbUNyZWF0ZUFsbG9jYXRvcjsKK307CisKKyNlbmRpZiAgLy8gU1RBR0VGUklHSFRfQzJfUExBVEZPUk1fU1RPUkVfUExVR0lOX0xPQURFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3VwcG9ydC5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9DMlBsYXRmb3JtU3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMTI4MmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL0MyUGxhdGZvcm1TdXBwb3J0LmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFNUQUdFRlJJR0hUX0NPREVDMl9QTEFURk9STV9TVVBQT1JUX0hfCisjZGVmaW5lIFNUQUdFRlJJR0hUX0NPREVDMl9QTEFURk9STV9TVVBQT1JUX0hfCisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPEMyQ29tcG9uZW50RmFjdG9yeS5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qKgorICogUmV0dXJucyB0aGUgcGxhdGZvcm0gYWxsb2NhdG9yIHN0b3JlLgorICogXHJldHZhbCBudWxscHRyIGlmIHRoZSBwbGF0Zm9ybSBhbGxvY2F0b3Igc3RvcmUgY291bGQgbm90IGJlIG9idGFpbmVkCisgKi8KK3N0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBHZXRDb2RlYzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlKCk7CisKKy8qKgorICogUGxhdGZvcm0gYWxsb2NhdG9yIHN0b3JlIElEcworICovCitjbGFzcyBDMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUgOiBwdWJsaWMgQzJBbGxvY2F0b3JTdG9yZSB7CitwdWJsaWM6CisgICAgZW51bSA6IGlkX3QgeworICAgICAgICAvKioKKyAgICAgICAgICogSUQgb2YgdGhlIGlvbiBiYWNrZWQgcGxhdGZvcm0gYWxsb2NhdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBDMkhhbmRsZSBjb25zaXN0cyBvZjoKKyAgICAgICAgICogICBmZCAgc2hhcmVkIGlvbiBidWZmZXIgaGFuZGxlCisgICAgICAgICAqICAgaW50IHNpemUgKGxvIDMyIGJpdHMpCisgICAgICAgICAqICAgaW50IHNpemUgKGhpIDMyIGJpdHMpCisgICAgICAgICAqICAgaW50IG1hZ2ljICdceGMyaW9ceDAwJworICAgICAgICAgKi8KKyAgICAgICAgSU9OID0gUExBVEZPUk1fU1RBUlQsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElEIG9mIHRoZSBncmFsbG9jIGJhY2tlZCBwbGF0Zm9ybSBhbGxvY2F0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIEMySGFuZGxlIGxheW91dCBpcyBub3QgcHVibGljLiBVc2UgQzJBbGxvY2F0b3JHcmFsbG9jOjpVbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlCisgICAgICAgICAqIHRvIGdldCB0aGUgdW5kZXJseWluZyBncmFsbG9jIGhhbmRsZSBmcm9tIGEgQzJIYW5kbGUsIGFuZCBXcmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZQorICAgICAgICAgKiB0byBjcmVhdGUgYSBDMkhhbmRsZSBmcm9tIGEgZ3JhbGxvYyBoYW5kbGUgLSBmb3IgQzJBbGxvY2F0b3I6OnByaW9yQWxsb2NhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIEdSQUxMT0MsCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIElEIG9mIHRoZSBidWZmZXJxdWV1ZSBiYWNrZWQgcGxhdGZvcm0gYWxsb2NhdG9yLgorICAgICAgICAgKgorICAgICAgICAgKiBDMkhhbmRsZSBsYXlvdXQgaXMgbm90IHB1YmxpYy4gVXNlIEMyQWxsb2NhdG9yR3JhbGxvYzo6VW53cmFwTmF0aXZlQ29kZWMyR3JhbGxvY0hhbmRsZQorICAgICAgICAgKiB0byBnZXQgdGhlIHVuZGVybHlpbmcgaGFuZGxlIGZyb20gYSBDMkhhbmRsZSwgYW5kIFdyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlCisgICAgICAgICAqIHRvIGNyZWF0ZSBhIEMySGFuZGxlIGZyb20gYSBoYW5kbGUgLSBmb3IgQzJBbGxvY2F0b3I6OnByaW9yQWxsb2NhdGlvbi4KKyAgICAgICAgICovCisgICAgICAgIEJVRkZFUlFVRVVFLAorCisgICAgICAgIC8qKgorICAgICAgICAgKiBJRCBvZiBpbmRpY2F0aW5nIHRoZSBlbmQgb2YgcGxhdGZvcm0gYWxsb2NhdG9yIGRlZmluaXRpb24uCisgICAgICAgICAqCisgICAgICAgICAqIFxub3RlIGFsd2F5cyBwdXQgdGhpcyBtYWNybyBpbiB0aGUgbGFzdCBwbGFjZS4KKyAgICAgICAgICoKKyAgICAgICAgICogRXh0ZW5kZWQgcGxhdGZvcm0gc3RvcmUgcGx1Z2luIHNob3VsZCB1c2UgdGhpcyBtYWNybyBhcyB0aGUgc3RhcnQgSUQgb2YgaXRzIG93biBhbGxvY2F0b3IKKyAgICAgICAgICogdHlwZXMuCisgICAgICAgICAqLworICAgICAgICBQTEFURk9STV9FTkQsCisgICAgfTsKK307CisKKy8qKgorICogUmV0cmlldmVzIGEgYmxvY2sgcG9vbCBmb3IgYSBjb21wb25lbnQuCisgKgorICogXHBhcmFtIGlkICAgICAgICB0aGUgbG9jYWwgSUQgb2YgdGhlIGJsb2NrIHBvb2wKKyAqIFxwYXJhbSBjb21wb25lbnQgdGhlIGNvbXBvbmVudCB1c2luZyB0aGUgYmxvY2sgcG9vbCAobXVzdCBiZSBub24tbnVsbCkKKyAqIFxwYXJhbSBwb29sICAgICAgcG9pbnRlciB0byB3aGVyZSB0aGUgb2J0YWluZWQgYmxvY2sgcG9vbCBzaGFsbCBiZSBzdG9yZWQgb24gc3VjY2Vzcy4gbnVsbHB0cgorICogICAgICAgICAgICAgICAgICB3aWxsIGJlIHN0b3JlZCBoZXJlIG9uIGZhaWx1cmUKKyAqCisgKiBccmV0dmFsIEMyX09LICAgICAgICB0aGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsCisgKiBccmV0dmFsIEMyX0JBRF9WQUxVRSB0aGUgY29tcG9uZW50IGlzIG51bGwKKyAqIFxyZXR2YWwgQzJfTk9UX0ZPVU5EIGlmIHRoZSBibG9jayBwb29sIGRvZXMgbm90IGV4aXN0CisgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBmZXRjaCB0aGUgYmxvY2sgcG9vbCAodGhpcyByZXR1cm4gdmFsdWUgaXMgb25seQorICogICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgZm9yIGJhc2ljIHBvb2xzKQorICogXHJldHZhbCBDMl9USU1FRF9PVVQgdGhlIG9wZXJhdGlvbiB0aW1lZCBvdXQgKHRoaXMgcmV0dXJuIHZhbHVlIGlzIG9ubHkgcG9zc2libGUgZm9yIGJhc2ljIHBvb2xzKQorICogXHJldHZhbCBDMl9SRUZVU0VEICAgbm8gcGVybWlzc2lvbiB0byBjb21wbGV0ZSBhbnkgcmVxdWlyZWQgYWxsb2NhdGlvbiAodGhpcyByZXR1cm4gdmFsdWUgaXMgb25seQorICogICAgICAgICAgICAgICAgICAgICAgcG9zc2libGUgZm9yIGJhc2ljIHBvb2xzKQorICogXHJldHZhbCBDMl9DT1JSVVBURUQgc29tZSB1bmtub3duLCB1bnJlY292ZXJhYmxlIGVycm9yIG9jY3VyZWQgZHVyaW5nIG9wZXJhdGlvbiAodW5leHBlY3RlZCwKKyAqICAgICAgICAgICAgICAgICAgICAgIHRoaXMgcmV0dXJuIHZhbHVlIGlzIG9ubHkgcG9zc2libGUgZm9yIGJhc2ljIHBvb2xzKQorICovCitjMl9zdGF0dXNfdCBHZXRDb2RlYzJCbG9ja1Bvb2woCisgICAgICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IGlkLCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCk7CisKKy8qKgorICogQ3JlYXRlcyBhIGJsb2NrIHBvb2wuCisgKiBccGFyYW0gYWxsb2NhdG9ySWQgIHRoZSBhbGxvY2F0b3IgSUQgd2hpY2ggaXMgdXNlZCB0byBhbGxvY2F0ZSBibG9ja3MKKyAqIFxwYXJhbSBjb21wb25lbnQgICAgIHRoZSBjb21wb25lbnQgdXNpbmcgdGhlIGJsb2NrIHBvb2wgKG11c3QgYmUgbm9uLW51bGwpCisgKiBccGFyYW0gcG9vbCAgICAgICAgICBwb2ludGVyIHRvIHdoZXJlIHRoZSBjcmVhdGVkIGJsb2NrIHBvb2wgc2hhbGwgYmUgc3RvcmUgb24gc3VjY2Vzcy4KKyAqICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgd2lsbCBiZSBzdG9yZWQgaGVyZSBvbiBmYWlsdXJlCisgKgorICogXHJldHZhbCBDMl9PSyAgICAgICAgdGhlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bAorICogXHJldHZhbCBDMl9CQURfVkFMVUUgdGhlIGNvbXBvbmVudCBpcyBudWxsCisgKiBccmV0dmFsIEMyX05PVF9GT1VORCBpZiB0aGUgYWxsb2NhdG9yIGRvZXMgbm90IGV4aXN0CisgKiBccmV0dmFsIEMyX05PX01FTU9SWSBub3QgZW5vdWdoIG1lbW9yeSB0byBjcmVhdGUgYSBibG9jayBwb29sCisgKi8KK2MyX3N0YXR1c190IENyZWF0ZUNvZGVjMkJsb2NrUG9vbCgKKyAgICAgICAgQzJQbGF0Zm9ybUFsbG9jYXRvclN0b3JlOjppZF90IGFsbG9jYXRvcklkLAorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJDb21wb25lbnQ+IGNvbXBvbmVudCwKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQmxvY2tQb29sPiAqcG9vbCk7CisKKy8qKgorICogUmV0dXJucyB0aGUgcGxhdGZvcm0gY29tcG9uZW50IHN0b3JlLgorICogXHJldHZhbCBudWxscHRyIGlmIHRoZSBwbGF0Zm9ybSBjb21wb25lbnQgc3RvcmUgY291bGQgbm90IGJlIG9idGFpbmVkCisgKi8KK3N0ZDo6c2hhcmVkX3B0cjxDMkNvbXBvbmVudFN0b3JlPiBHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCk7CisKKy8qKgorICogU2V0cyB0aGUgcHJlZmVycmVkIGNvbXBvbmVudCBzdG9yZSBpbiB0aGlzIHByb2Nlc3MgZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YgYWNjZXNzaW5nIGl0cworICogaW50ZXJmYWNlLiBJZiB0aGlzIGlzIG5vdCBjYWxsZWQsIHRoZSBkZWZhdWx0IElDb21wb25lbnRTdG9yZSBIQUwgKGlmIGV4aXN0cykgaXMgdGhlIHByZWZlcnJlZAorICogc3RvcmUgZm9yIHRoaXMgcHVycG9zZS4gSWYgdGhlIGRlZmF1bHQgSUNvbXBvbmVudFN0b3JlIEhBTCBpcyBub3QgcHJlc2VudCwgdGhlIHBsYXRmb3JtCisgKiBjb21wb25lbnQgc3RvcmUgaXMgdXNlZC4KKyAqLwordm9pZCBTZXRQcmVmZXJyZWRDb2RlYzJDb21wb25lbnRTdG9yZShzdGQ6OnNoYXJlZF9wdHI8QzJDb21wb25lbnRTdG9yZT4gc3RvcmUpOworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBTVEFHRUZSSUdIVF9DT0RFQzJfUExBVEZPUk1fU1VQUE9SVF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9hbmRyb2lkLUMyRGVidWctbG9nLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL2FuZHJvaWQtQzJEZWJ1Zy1sb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTEwMjI4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS9hbmRyb2lkLUMyRGVidWctbG9nLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19BTkRST0lEX0RFQlVHX0xPR19IXworI2RlZmluZSBDMlVUSUxTX0FORFJPSURfREVCVUdfTE9HX0hfCisKKy8qCisgKiBBbmRyb2lkIHByb3ZpZGVzIGxvZ2dpbmcgYW5kIGRlYnVnIG1hY3Jvcy4gUmVkZWZpbmUgdGhlbSB3aXRoIEMyIHByZWZpeCBhbmQgYWRkIHN1cHBvcnQgZm9yCisgKiBvcHRpbmcgb3V0IG9mIHZlcmJvc2UgbG9ncy4KKyAqLworCisjaWZkZWYgQzJfTE9HX1RBRworI2RlZmluZSBMT0dfVEFHIEMyX0xPR19UQUcKKyNlbmRpZgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworI2lmZGVmIEMyX0xPR19WRVJCT1NFCisjZGVmaW5lIEMyX0xPRyhMRVZFTCkgTE9HKDo6YW5kcm9pZDo6YmFzZTo6TEVWRUwpCisjZWxzZQorLyoqCisgKiBVc2UgYXMgZm9sbG93czoKKyAqCisgKiAjZGVmaW5lIEMyX0xPR19UQUcgInRhZyIKKyAqIC8vI2RlZmluZSBDMl9MT0dfVkVSQk9TRSAgLy8gZW5hYmxlIHZlcmJvc2UgbG9ncyBpbiB0aGlzIGZpbGUKKyAqICNpbmNsdWRlIDxDMkRlYnVnLmg+CisgKgorICogQzJfTE9HKERFQlVHKSA8PCBleHByIC4uLjsKKyAqCisgKiBMb2cgbGV2ZWxzIGFyZTogVkVSQk9TRSwgREVCVUcsIElORk8sIFdBUk5JTkcsIEVSUk9SLCBGQVRBTCAoYWJvcnRzKS4KKyAqCisgKiBObyBlbmRsIGlzIHJlcXVpcmVkLgorICovCisjZGVmaW5lIEMyX0xPRyhMRVZFTCkgXAorICAgICAgICAoOjphbmRyb2lkOjpiYXNlOjpMRVZFTCAhPSA6OmFuZHJvaWQ6OmJhc2U6OlZFUkJPU0UpICYmIExPRyg6OmFuZHJvaWQ6OmJhc2U6OkxFVkVMKQorI2VuZGlmCisKKyNkZWZpbmUgQzJfQ0hFQ0sgICAgQ0hFQ0sKKyNkZWZpbmUgQzJfQ0hFQ0tfTFQgQ0hFQ0tfTFQKKyNkZWZpbmUgQzJfQ0hFQ0tfTEUgQ0hFQ0tfTEUKKyNkZWZpbmUgQzJfQ0hFQ0tfRVEgQ0hFQ0tfRVEKKyNkZWZpbmUgQzJfQ0hFQ0tfR0UgQ0hFQ0tfR0UKKyNkZWZpbmUgQzJfQ0hFQ0tfR1QgQ0hFQ0tfR1QKKyNkZWZpbmUgQzJfQ0hFQ0tfTkUgQ0hFQ0tfTkUKKworI2RlZmluZSBDMl9EQ0hFQ0sgICAgRENIRUNLCisjZGVmaW5lIEMyX0RDSEVDS19MVCBEQ0hFQ0tfTFQKKyNkZWZpbmUgQzJfRENIRUNLX0xFIERDSEVDS19MRQorI2RlZmluZSBDMl9EQ0hFQ0tfRVEgRENIRUNLX0VRCisjZGVmaW5lIEMyX0RDSEVDS19HRSBEQ0hFQ0tfR0UKKyNkZWZpbmUgQzJfRENIRUNLX0dUIERDSEVDS19HVAorI2RlZmluZSBDMl9EQ0hFQ0tfTkUgRENIRUNLX05FCisKKyNlbmRpZiAgLy8gQzJVVElMU19BTkRST0lEX0RFQlVHX0xPR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS90eXBlcy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MWQzZjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3R5cGVzLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09ERUMyX1ZOREtfVFlQRVNfSAorI2RlZmluZSBDT0RFQzJfVk5ES19UWVBFU19ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvY29tbW9uLzEuMi90eXBlcy5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKyNpbmNsdWRlIDx1aS9GZW5jZS5oPgorI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KKyNpbmNsdWRlIDx1aS9SZWdpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBncmFwaGljcyB7CituYW1lc3BhY2UgYnVmZmVycXVldWUgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIHV0aWxzIHsKKworLy8gU3RhdHVzCisvLyA9PT09PT0KKwordXNpbmcgSFN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjJfMDo6CisgICAgICAgIFN0YXR1czsKKworLy8gQSBzdGF0dXNfdCB2YWx1ZSBtYXkgaGF2ZSBmbGFncyBlbmNvZGVkLiBUaGVzZSBmbGFncyBhcmUgZGVjb2RlZCBpbnRvIGJvb2xlYW4KKy8vIHZhbHVlcyBpZiB0aGVpciBjb3JyZXNwb25kaW5nIG91dHB1dCBwb2ludGVycyBhcmUgbm90IG51bGwuCitib29sIGIyaChzdGF0dXNfdCBmcm9tLCBIU3RhdHVzKiB0bywKKyAgICAgICAgIGJvb2wqIGJ1ZmZlck5lZWRzUmVhbGxvY2F0aW9uID0gbnVsbHB0ciwKKyAgICAgICAgIGJvb2wqIHJlbGVhc2VBbGxCdWZmZXJzID0gbnVsbHB0cik7CisvLyBTaW1wbGUgMS10by0xIG1hcHBpbmcuIElmIEJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT04gb3IgUkVMRUFTRV9BTExfQlVGRkVSUworLy8gbmVlZHMgdG8gYmUgYWRkZWQsIGl0IG11c3QgYmUgZG9uZSBtYW51YWxseSBhZnRlcndhcmRzLgorYm9vbCBoMmIoSFN0YXR1cyBmcm9tLCBzdGF0dXNfdCogdG8pOworCisvLyBGZW5jZQorLy8gPT09PT0KKwordXNpbmcgQkZlbmNlID0gOjphbmRyb2lkOjpGZW5jZTsKKy8vIFRoaXMgY2xhc3MgbWFuYWdlcyB0aGUgbGlmZXRpbWUgb2YgYSBjb3BpZWQgaGFuZGxlLiBJdHMgZGVzdHJ1Y3RvciBjYWxscworLy8gbmF0aXZlX2hhbmRsZV9kZWxldGUoKSBidXQgbm90IG5hdGl2ZV9oYW5kbGVfY2xvc2UoKS4KK3N0cnVjdCBIRmVuY2VXcmFwcGVyIHsKKyAgICBIRmVuY2VXcmFwcGVyKCkgPSBkZWZhdWx0OworICAgIC8vIFNldHMgbUhhbmRsZSB0byBhIG5ldyB2YWx1ZS4KKyAgICBIRmVuY2VXcmFwcGVyKG5hdGl2ZV9oYW5kbGVfdCogaCk7CisgICAgLy8gRGVsZXRlcyBtSGFuZGxlIHdpdGhvdXQgY2xvc2luZy4KKyAgICB+SEZlbmNlV3JhcHBlcigpOworICAgIC8vIERlbGV0ZXMgbUhhbmRsZSB3aXRob3V0IGNsb3NpbmcsIHRoZW4gc2V0cyBtSGFuZGxlIHRvIGEgbmV3IHZhbHVlLgorICAgIEhGZW5jZVdyYXBwZXImIHNldChuYXRpdmVfaGFuZGxlX3QqIGgpOworICAgIEhGZW5jZVdyYXBwZXImIG9wZXJhdG9yPShuYXRpdmVfaGFuZGxlX3QqIGgpOworICAgIC8vIFJldHVybnMgYSBub24tb3duaW5nIGhpZGxfaGFuZGxlIHBvaW50aW5nIHRvIG1IYW5kbGUuCisgICAgaGlkbF9oYW5kbGUgZ2V0SGFuZGxlKCkgY29uc3Q7CisgICAgb3BlcmF0b3IgaGlkbF9oYW5kbGUoKSBjb25zdDsKK3Byb3RlY3RlZDoKKyAgICBuYXRpdmVfaGFuZGxlX3QqIG1IYW5kbGV7bnVsbHB0cn07Cit9OworCisvLyBEb2VzIG5vdCBjbG9uZSB0aGUgZmQtLS1vbmx5IGNvcHkgdGhlIGZkLiBUaGUgcmV0dXJuZWQgSEZlbmNlV3JhcHBlciBzaG91bGQKKy8vIG5vdCBvdXRsaXZlIHRoZSBpbnB1dCBGZW5jZSBvYmplY3QuCitib29sIGIyaChzcDxCRmVuY2U+IGNvbnN0JiBmcm9tLCBIRmVuY2VXcmFwcGVyKiB0byk7CisvLyBDbG9uZXMgdGhlIGZkIGFuZCBwdXRzIGl0IGluIGEgbmV3IEZlbmNlIG9iamVjdC4KK2Jvb2wgaDJiKG5hdGl2ZV9oYW5kbGVfdCBjb25zdCogZnJvbSwgc3A8QkZlbmNlPiogdG8pOworCisvLyBDb25uZWN0aW9uVHlwZQorLy8gPT09PT09PT09PT09PT0KKwordXNpbmcgSENvbm5lY3Rpb25UeXBlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMl8wOjoKKyAgICAgICAgQ29ubmVjdGlvblR5cGU7CisKK2Jvb2wgYjJoKGludCBmcm9tLCBIQ29ubmVjdGlvblR5cGUqIHRvKTsKK2Jvb2wgaDJiKEhDb25uZWN0aW9uVHlwZSBmcm9tLCBpbnQqIHRvKTsKKworLy8gUmVjdAorLy8gPT09PQorCit1c2luZyBCUmVjdCA9IDo6YW5kcm9pZDo6UmVjdDsKK3VzaW5nIEhSZWN0ID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMjo6UmVjdDsKKworYm9vbCBiMmgoQlJlY3QgY29uc3QmIGZyb20sIEhSZWN0KiB0byk7Citib29sIGgyYihIUmVjdCBjb25zdCYgZnJvbSwgQlJlY3QqIHRvKTsKKworLy8gUmVnaW9uCisvLyA9PT09PT0KKwordXNpbmcgQlJlZ2lvbiA9IDo6YW5kcm9pZDo6UmVnaW9uOwordXNpbmcgSFJlZ2lvbiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjPEhSZWN0PjsKKworYm9vbCBiMmgoQlJlZ2lvbiBjb25zdCYgZnJvbSwgSFJlZ2lvbiogdG8pOworYm9vbCBoMmIoSFJlZ2lvbiBjb25zdCYgZnJvbSwgQlJlZ2lvbiogdG8pOworCisvLyBHcmFwaGljQnVmZmVyCisvLyA9PT09PT09PT09PT09CisKK3VzaW5nIEhhcmR3YXJlQnVmZmVyID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmNvbW1vbjo6VjFfMjo6CisgICAgICAgIEhhcmR3YXJlQnVmZmVyOwordXNpbmcgSGFyZHdhcmVCdWZmZXJEZXNjcmlwdGlvbiA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzI6OgorICAgICAgICBIYXJkd2FyZUJ1ZmZlckRlc2NyaXB0aW9uOworCisvLyBEb2VzIG5vdCBjbG9uZSB0aGUgaGFuZGxlLiBUaGUgcmV0dXJuZWQgSGFyZHdhcmVCdWZmZXIgc2hvdWxkIG5vdCBvdXRsaXZlIHRoZQorLy8gaW5wdXQgR3JhcGhpY0J1ZmZlci4gTm90ZSB0aGF0IEhhcmR3YXJlQnVmZmVyIGRvZXMgbm90IGNhcnJ5IHRoZSBnZW5lcmF0aW9uCisvLyBudW1iZXIsIHNvIHRoaXMgZnVuY3Rpb24gbmVlZHMgYW5vdGhlciBvdXRwdXQgYXJndW1lbnQuCitib29sIGIyaChzcDxHcmFwaGljQnVmZmVyPiBjb25zdCYgZnJvbSwgSGFyZHdhcmVCdWZmZXIqIHRvLAorICAgICAgICAgdWludDMyX3QqIHRvR2VuZXJhdGlvbk51bWJlciA9IG51bGxwdHIpOworLy8gQ2xvbmVzIHRoZSBoYW5kbGUgYW5kIGNyZWF0ZXMgYSBuZXcgR3JhcGhpY0J1ZmZlciBmcm9tIHRoZSBjbG9uZWQgaGFuZGxlLgorLy8gTm90ZSB0aGF0IHRoZSBnZW5lcmF0aW9uIG51bWJlciBvZiB0aGUgR3JhcGhpY0J1ZmZlciBoYXMgdG8gYmUgc2V0IG1hbnVhbGx5CisvLyBhZnRlcndhcmRzIGJlY2F1c2UgSGFyZHdhcmVCdWZmZXIgZG9lcyBub3QgaGF2ZSBzdWNoIGluZm9ybWF0aW9uLgorYm9vbCBoMmIoSGFyZHdhcmVCdWZmZXIgY29uc3QmIGZyb20sIHNwPEdyYXBoaWNCdWZmZXI+KiB0byk7CisKK30gIC8vIG5hbWVzcGFjZSB1dGlscworfSAgLy8gbmFtZXNwYWNlIFYyXzAKK30gIC8vIG5hbWVzcGFjZSBidWZmZXJxdWV1ZQorfSAgLy8gbmFtZXNwYWNlIGdyYXBoaWNzCit9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQ09ERUMyX1ZOREtfVFlQRVNfSAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1iYXNlLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJEZWJ1Zy1iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA0MGU0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWJhc2UuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0RFQlVHX0JBU0VfSF8KKyNkZWZpbmUgQzJVVElMU19ERUJVR19CQVNFX0hfCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworLyoqCisgKiBEZWJ1ZyBwcmludCB1dGlsaXRpZXMgZm9yIENvZGVjIDIuMCBiYXNlIG9iamVjdHMuCisgKi8KKworI2RlZmluZSBDMl9ERUNMQVJFX0FTX1NUUklOR19BTkRfREVGSU5FX1NUUkVBTV9PVVQodHlwZSkgXAorY29uc3QgY2hhciAqYXNTdHJpbmcodHlwZSBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKTsgXAoraW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCB0eXBlICZpKSB7IFwKKyAgICByZXR1cm4gb3MgPDwgYXNTdHJpbmcoaSk7IFwKK30KKworQzJfREVDTEFSRV9BU19TVFJJTkdfQU5EX0RFRklORV9TVFJFQU1fT1VUKGMyX3N0YXR1c190KQorCisKKyNlbmRpZiAgLy8gQzJVVElMU19ERUJVR19CQVNFX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWludGVyZmFjZS5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YzMTg3NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWludGVyZmFjZS5oCkBAIC0wLDAgKzEsMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfREVCVUdfSU5URVJGQUNFX0hfCisjZGVmaW5lIEMyVVRJTFNfREVCVUdfSU5URVJGQUNFX0hfCisKKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctYmFzZS5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VVdGlscy5oPgorCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPiAmaSk7CisKKyNlbmRpZiAgLy8gQzJVVElMU19ERUJVR19JTlRFUkZBQ0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWxvZy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctbG9nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1YzRjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLWxvZy5oCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfREVCVUdfTE9HX0hfCisjZGVmaW5lIEMyVVRJTFNfREVCVUdfTE9HX0hfCisKKy8vIFBsYXRmb3JtIHNwZWNpZmljIGRlYnVnIHV0aWxpdGllcworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YW5kcm9pZC1DMkRlYnVnLWxvZy5oPgorI2Vsc2UKKy8vIFRPRE86IGltcGxlbWVudCBiYXNlIGRlYnVnIHV0aWxzCisjZW5kaWYKKworI2VuZGlmICAvLyBDMlVUSUxTX0RFQlVHX0xPR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MyRGVidWctcGFyYW0uaCBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLXBhcmFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFjMWRlMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkRlYnVnLXBhcmFtLmgKQEAgLTAsMCArMSwzNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQzJVVElMU19ERUJVR19QQVJBTV9IXworI2RlZmluZSBDMlVUSUxTX0RFQlVHX1BBUkFNX0hfCisKKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWJhc2UuaD4KKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisvKioKKyAqIERlYnVnL3ByaW50IGRlY2xhcmF0aW9ucyBmb3Igb2JqZWN0cyBkZWZpbmVkIGluIEMyUGFyYW0uaAorICovCitDMl9ERUNMQVJFX0FTX1NUUklOR19BTkRfREVGSU5FX1NUUkVBTV9PVVQoQzJGaWVsZERlc2NyaXB0b3I6OnR5cGVfdCkKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyUGFyYW06OkNvcmVJbmRleCAmaSk7CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbTo6VHlwZSAmaSk7CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbTo6SW5kZXggJmkpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IF9DMkZpZWxkSWQgJmkpOworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZpKTsKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtRmllbGQgJmkpOworCisjZW5kaWYgIC8vIEMyVVRJTFNfREVCVUdfUEFSQU1fSF8KZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZUhlbHBlci5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlSGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmZiNDNhZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMkludGVyZmFjZUhlbHBlci5oCkBAIC0wLDAgKzEsNzUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX0lOVEVSRkFDRV9IRUxQRVJfSF8KKyNkZWZpbmUgQzJVVElMU19JTlRFUkZBQ0VfSEVMUEVSX0hfCisKKyNpbmNsdWRlIDxDMkNvbXBvbmVudC5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VVdGlscy5oPgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisvKioKKyAqIEludGVyZmFjZSBIZWxwZXIKKyAqLwordXNpbmcgQzJSID0gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgRT1zdGQ6OmlzX2VudW08VD46OnZhbHVlPgorc3RydWN0IF9jMl9yZWR1Y2VfZW51bV90b191bmRlcmx5aW5nX3R5cGUgeworICAgIHR5cGVkZWYgVCB0eXBlOworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPFQsIHRydWU+IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlIHR5cGU7Cit9OworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byBpbXBsZW1lbnQgcGFyYW1ldGVyIHJlZmxlY3RvcnMuIFRoaXMgY2xhc3MgaXMgZHluYW1pYyBhbmQgaXMgZGVzaWduZWQgdG8gYmUKKyAqIHNoYXJlZCBieSBtdWx0aXBsZSBpbnRlcmZhY2VzLiBUaGlzIGFsbG93cyBpbnRlcmZhY2VzIHRvIGFkZCBzdHJ1Y3R1cmUgZGVzY3JpcHRvcnMgYXMgbmVlZGVkLgorICovCitjbGFzcyBDMlJlZmxlY3RvckhlbHBlciA6IHB1YmxpYyBDMlBhcmFtUmVmbGVjdG9yIHsKK3B1YmxpYzoKKyAgICBDMlJlZmxlY3RvckhlbHBlcigpID0gZGVmYXVsdDsKKyAgICB2aXJ0dWFsIH5DMlJlZmxlY3RvckhlbHBlcigpID0gZGVmYXVsdDsKKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+IGRlc2NyaWJlKAorICAgICAgICAgICAgQzJQYXJhbTo6Q29yZUluZGV4IHBhcmFtSW5kZXgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogQWRkcyBzdXBwb3J0IGZvciBkZXNjcmliaW5nIHRoZSBnaXZlbiBwYXJhbWV0ZXJzLgorICAgICAqCisgICAgICogXHBhcmFtIFBhcmFtcyB0eXBlcyBvZiBjb2RlYyAyLjAgc3RydWN0cyAob3IgcGFyYW1ldGVycykgdG8gZGVzY3JpYmUKKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZS4uLiBQYXJhbXM+CisgICAgQzJfSU5MSU5FIHZvaWQgYWRkU3RydWN0RGVzY3JpcHRvcnMoKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RydWN0RGVzY3JpcHRvcj4gc3RydWN0czsKKyAgICAgICAgYWRkU3RydWN0RGVzY3JpcHRvcnMoc3RydWN0cywgKF9UdXBsZTxQYXJhbXMuLi4+ICopbnVsbHB0cik7CisgICAgfQorCisgICAgLyoqCisgICAgICogQWRkcyBzdXBwb3J0IGZvciBkZXNjcmliaW5nIGEgc3BlY2lmaWMgc3RydWN0LgorICAgICAqCisgICAgICogXHBhcmFtIHN0cnVrdCBkZXNjcmlwdG9yIGZvciB0aGUgc3RydWN0IHRoYXQgd2lsbCBiZSBtb3ZlZCBvdXQuCisgICAgICovCisgICAgdm9pZCBhZGRTdHJ1Y3REZXNjcmlwdG9yKEMyU3RydWN0RGVzY3JpcHRvciAmJnN0cnVrdCk7CisKK3ByaXZhdGU6CisgICAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gUGFyYW1zPgorICAgIGNsYXNzIEMyX0hJREUgX1R1cGxlIHsgfTsKKworICAgIC8qKgorICAgICAqIEFkZHMgc3VwcG9ydCBmb3IgZGVzY3JpYmluZyB0aGUgZ2l2ZW4gZGVzY3JpcHRvcnMuCisgICAgICoKKyAgICAgKiBccGFyYW0gc3RydWN0cyBMaXN0IG9mIHN0cnVjdHVyZSBkZXNjcmlwdG9ycyB0byBhZGQgc3VwcG9ydCBmb3IKKyAgICAgKi8KKyAgICB2b2lkIGFkZFN0cnVjdERlc2NyaXB0b3JzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJTdHJ1Y3REZXNjcmlwdG9yPiAmc3RydWN0cywgX1R1cGxlPD4gKik7CisKKyAgICAvKioKKyAgICAgKiBVdGlsaXR5IG1ldGhvZCB0aGF0IGFkZHMgc3VwcG9ydCBmb3IgZGVzY3JpYmluZyB0aGUgZ2l2ZW4gZGVzY3JpcHRvcnMgaW4gYSByZWN1cnNpdmUgbWFubmVyCisgICAgICogb25lIHN0cnVjdHVyZSBhdCBhIHRpbWUgdXNpbmcgYSBsaXN0IG9mIHN0cnVjdHVyZSBkZXNjcmlwdG9ycyB0ZW1wb3JhcnkuCisgICAgICoKKyAgICAgKiBccGFyYW0gVCB0aGUgdHlwZSBvZiBjb2RlYyAyLjAgc3RydWN0IHRvIGRlc2NyaWJlCisgICAgICogXHBhcmFtIFBhcmFtcyByZXN0IG9mIHRoZSBzdHJ1Y3RzCisgICAgICogXHBhcmFtIHN0cnVjdHMgVGVtcG9yYXJ5IGxpc3Qgb2Ygc3RydWN0dXJlIGRlc2NyaXB0b3JzIHVzZWQgdG8gb3B0aW1pemUgdGhlIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBQYXJhbXM+CisgICAgQzJfSU5MSU5FIHZvaWQgYWRkU3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDMlN0cnVjdERlc2NyaXB0b3I+ICZzdHJ1Y3RzLCBfVHVwbGU8VCwgUGFyYW1zLi4uPiAqKSB7CisgICAgICAgIHN0cnVjdHMuZW1wbGFjZV9iYWNrKChUKiludWxscHRyKTsKKyAgICAgICAgYWRkU3RydWN0RGVzY3JpcHRvcnMoc3RydWN0cywgKF9UdXBsZTxQYXJhbXMuLi4+ICopbnVsbHB0cik7CisgICAgfQorCisgICAgbXV0YWJsZSBzdGQ6Om11dGV4IF9tTXV0ZXg7CisgICAgc3RkOjptYXA8QzJQYXJhbTo6Q29yZUluZGV4LCBjb25zdCBDMlN0cnVjdERlc2NyaXB0b3I+IF9tU3RydWN0czsgLy8vPCBkZXNjcmlwdG9ycworfTsKKworLyoqCisgKiBVdGlsaXR5IGNsYXNzIHRoYXQgaW1wbGVtZW50cyB0aGUgY29kZWMgMi4wIGludGVyZmFjZSBBUEktcyBmb3Igc29tZSBwYXJhbWV0ZXJzLgorICoKKyAqIFRoaXMgY2xhc3MgbXVzdCBiZSBzdWJjbGFzc2VkLgorICovCitjbGFzcyBDMkludGVyZmFjZUhlbHBlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgYmFzZSBvZmZzZXQgb2YgYSBmaWVsZCBhdCB8b2Zmc2V0fCB0aGF0IGNvdWxkIGJlIHBhcnQgb2YgYW4gYXJyYXkgb3IgcGFydCBvZiBhCisgICAgICogc3ViLXN0cnVjdHVyZS4KKyAgICAgKgorICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IGRvIGZpZWxkIHNpemUgdmVyaWZpY2F0aW9uLCBlLmcuIGlmIG9mZnNldCBpZiBvYnRhaW5lZCBmcm9tIGEgc3RydWN0dXJlLAorICAgICAqIGl0IHdpbGwgbm90IHN0b3AgYXQgdGhlIHN0cnVjdHVyZSBib3VuZGFyeSAtIHRoaXMgaXMgb2theSwgYXMgd2UganVzdCB3YW50IHRoZSBiYXNlIG9mZnNldAorICAgICAqIGhlcmUsIHdoaWNoIGlzIHRoZSBzYW1lLgorICAgICAqLworICAgIHN0YXRpYworICAgIHNpemVfdCBHZXRCYXNlT2Zmc2V0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgsIHNpemVfdCBvZmZzZXQpOworCisgICAgLyoqCisgICAgICogVGhlIGludGVyZmFjZSBoZWxwZXIgY2xhc3MgdXNlcyByZWZlcmVuY2VzIHRvIHN0ZDo6c2hhcmVkX3B0cjxUPiBjb25maWcgcGFyYW1ldGVycy4KKyAgICAgKiBJbnRlcm5hbGx5LCB0aGVzZSBuZWVkIHRvIGJlIGdlbmVyYWxpemVkIHRvIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiByZWZzLCBidXQgdGhlIGNhc3QgaXMKKyAgICAgKiBub3QgYWxsb3dlZCAoYXMgdGhlc2UgYXJlIHJlZmVyZW5jZXMpLiBBcyBzdWNoLCB0aGlzIGNsYXNzIG5ldmVyIHJldHVybnMgcG9pbnRlciB0byB0aGUKKyAgICAgKiBzaGFyZWRfcHRycy4KKyAgICAgKi8KKyAgICBzdHJ1Y3QgUGFyYW1SZWYgeworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBlbmFibGU9CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxULCBDMlBhcmFtPjo6dmFsdWU+Ojp0eXBlPgorICAgICAgICBpbmxpbmUgQzJfSElERSBQYXJhbVJlZihzdGQ6OnNoYXJlZF9wdHI8VD4gJnBhcmFtKQorICAgICAgICAgICAgOiBfbVJlZihyZWludGVycHJldF9jYXN0PHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPio+KCZwYXJhbSkpIHsgfQorCisgICAgICAgIC8vIHVzZWQgYnkgY29tcGFyaXNvbiBvcGVyYXRvciBmb3IgY29udGFpbmVycworICAgICAgICBvcGVyYXRvciBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gKigpIGNvbnN0IHsgcmV0dXJuIF9tUmVmOyB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgYSBzaGFyZWQgcG9pbnRlciB0byB0aGUgcGFyYW1ldGVyLgorICAgICAgICAgKi8KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IGdldCgpIGNvbnN0IHsgcmV0dXJuICpfbVJlZjsgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+ICpfbVJlZjsKKyAgICB9OworCisgICAgLyoqCisgICAgICogRmllbGQgaGVscGVyLgorICAgICAqCisgICAgICogQ29udGFpbnMgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBmb3IgdGhlIGZpZWxkOiBwb3NzaWJsZSB2YWx1ZXMsIGFuZCBjdXJyZW50bHkgc3VwcG9ydGVkCisgICAgICogdmFsdWVzLgorICAgICAqLworICAgIGNsYXNzIEZpZWxkSGVscGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIC8qKgorICAgICAgICAgKiBDcmVhdGVzIGhlbHBlciBmb3IgYSBmaWVsZCB3aXRoIGdpdmVuIHBvc3NpYmxlIHZhbHVlcy4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIHBhcmFtIHBhcmFtZXRlciByZWZlcmVuY2UuIFRoZSBwYXJhbWV0ZXIgZG9lcyBub3QgaGF2ZSB0byBiZSBpbml0aWFsaXplZCBhdCB0aGlzCisgICAgICAgICAqICAgICAgICBwb2ludC4KKyAgICAgICAgICogXHBhcmFtIGZpZWxkIGZpZWxkIGlkZW50aWZpZXIKKyAgICAgICAgICogXHBhcmFtIHZhbHVlcyBwb3NzaWJsZSB2YWx1ZXMgZm9yIHRoZSBmaWVsZAorICAgICAgICAgKi8KKyAgICAgICAgRmllbGRIZWxwZXIoY29uc3QgUGFyYW1SZWYgJnBhcmFtLCBjb25zdCBfQzJGaWVsZElkICZmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+ICYmdmFsdWVzKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIHBhcmFtLWZpZWxkIGlkZW50aWZpZXIgZm9yIHRoaXMgZmllbGQuIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUKKyAgICAgICAgICogdW5kZXJseWluZyBwYXJhbWV0ZXIgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCisgICAgICAgICAqCisgICAgICAgICAqIFxhcmFtIGluZGV4CisgICAgICAgICAqCisgICAgICAgICAqIEByZXR1cm4gQzJQYXJhbUZpZWxkCisgICAgICAgICAqLworICAgICAgICBDMlBhcmFtRmllbGQgbWFrZVBhcmFtRmllbGQoQzJQYXJhbTo6SW5kZXggaW5kZXgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBTZXRzIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIHZhbHVlcyBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyB0aGF0IHdpbGwgYmUgbW92ZWQgb3V0CisgICAgICAgICAqLworICAgICAgICB2b2lkIHNldFN1cHBvcnRlZFZhbHVlcyhzdGQ6OnVuaXF1ZV9wdHI8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4gJiZ2YWx1ZXMpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBHZXRzIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4gVGhpcyBkZWZhdWx0cyB0byB0aGUgcG9zc2libGUgdmFsdWVzCisgICAgICAgICAqIGlmIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIHdlcmUgbmV2ZXIgc2V0LgorICAgICAgICAgKi8KKyAgICAgICAgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAqZ2V0U3VwcG9ydGVkVmFsdWVzKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEdldHMgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4KKyAgICAgICAgICovCisgICAgICAgIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgKmdldFBvc3NpYmxlVmFsdWVzKCkgY29uc3Q7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIC8vIFRPRE86IG1vdmUgdG8gaW1wbCBmb3Igc2FmZXR5CisgICAgICAgIFBhcmFtUmVmIG1QYXJhbTsKKyAgICAgICAgX0MyRmllbGRJZCBtRmllbGRJZDsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+IG1Qb3NzaWJsZTsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+IG1TdXBwb3J0ZWQ7IC8vLzwgaWYgZGlmZmVyZW50IGZyb20gcG9zc2libGUKKyAgICB9OworCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgQzJfSElERSBQYXJhbTsKKyAgICBjbGFzcyBQYXJhbUhlbHBlcjsKKworICAgIC8qKgorICAgICAqIEZhY3RvcnkgaXMgYW4gaW50ZXJmYWNlIHRvIGdldCB0aGUgcGFyYW1ldGVyIGhlbHBlcnMgZnJvbSBhIHN0ZDo6c2hhcmVkX3B0cjxUPiAmLgorICAgICAqLworICAgIGNsYXNzIEZhY3RvcnkgeworICAgICAgICAvLyBcdG9kbyB0aGlzIG1heSBiZSBhbHJlYWR5IGluIFBhcmFtSGVscGVyCisgICAgICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IGdldFJlZmxlY3RvcigpIGNvbnN0ID0gMDsKKworICAgICAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gZ2V0UGFyYW1IZWxwZXIoY29uc3QgUGFyYW1SZWYgJnBhcmFtKSBjb25zdCA9IDA7CisKKyAgICBwdWJsaWM6CisgICAgICAgIHZpcnR1YWwgfkZhY3RvcnkoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgUGFyYW08VD4gZ2V0KHN0ZDo6c2hhcmVkX3B0cjxUPiAmcGFyYW0sIHN0ZDo6c2hhcmVkX3B0cjxUPiBhbHRWYWx1ZSA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBQYXJhbTxUPihnZXRQYXJhbUhlbHBlcihQYXJhbVJlZihwYXJhbSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsdFZhbHVlID09IG51bGxwdHIgPyBwYXJhbSA6IGFsdFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFJlZmxlY3RvcigpKTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvKioKKyAgICAgKiBUeXBlZCBmaWVsZCBoZWxwZXIuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgRmllbGQgeworICAgICAgICAvKioKKyAgICAgICAgICogQ29uc3RydWN0b3IuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBoZWxwZXIgaGVscGVyIGZvciB0aGlzIGZpZWxkCisgICAgICAgICAqIFxwYXJhbSBpbmRleCAgcGFyYW1ldGVyIGluZGV4ICh0aGlzIGlzIG5lZWRlZCBhcyBpdCBpcyBub3QgYXZhaWxhYmxlIGR1cmluZyBwYXJhbWV0ZXIKKyAgICAgICAgICogICAgICAgIGNvbnN0cnVjdGlvbikgXHRvZG8gcmVtb3ZlCisgICAgICAgICAqLworICAgICAgICBGaWVsZChzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGhlbHBlciwgQzJQYXJhbTo6SW5kZXggaW5kZXgpOworCisgICAgICAgIGJvb2wgc3VwcG9ydHNBdEFsbChUIHZhbHVlKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPigqX21IZWxwZXItPmdldFBvc3NpYmxlVmFsdWVzKCkpLnN1cHBvcnRzKHZhbHVlKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgc3VwcG9ydHNOb3coVCB2YWx1ZSkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oKl9tSGVscGVyLT5nZXRTdXBwb3J0ZWRWYWx1ZXMoKSkuc3VwcG9ydHModmFsdWUpOworICAgICAgICB9CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIENyZWF0ZXMgYSBjb25mbGljdCByZXNvbHV0aW9uIHN1Z2dlc3Rpb24gYnVpbGRlciBmb3IgdGhpcyBmaWVsZC4KKyAgICAgICAgICovCisgICAgICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gc2hvdWxkQmUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogQ3JlYXRlcyBhIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIGJ1aWxkZXIgZm9yIHRoaXMgZmllbGQuIFRoaXMgaXMgb25seSBzdXBwb3J0ZWQKKyAgICAgICAgICogZm9yIG5vbi1jb25zdCBmaWVsZHMgdG8gZGlzYWxsb3cgc2V0dGluZyBzdXBwb3J0ZWQgdmFsdWVzIGZvciBkZXBlbmRlbmNpZXMuCisgICAgICAgICAqLworICAgICAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+IG11c3RCZSgpOworCisgICAgICAgIG9wZXJhdG9yIEMyUGFyYW1GaWVsZCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBfbUZpZWxkOworICAgICAgICB9CisKKyAgICAgICAgLy8gVE9ETworICAgICAgICBDMlIgdmFsaWRhdGVQb3NzaWJsZShjb25zdCBUICZ2YWx1ZSBfX3VudXNlZCkgY29uc3QgeworICAgICAgICAgICAgLy8vIFRPRE8KKyAgICAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gX21IZWxwZXI7CisgICAgICAgIEMyUGFyYW1GaWVsZCBfbUZpZWxkOworICAgIH07CisKKyAgICBjbGFzcyBQYXJhbUhlbHBlciB7CisgICAgcHVibGljOgorICAgICAgICBQYXJhbUhlbHBlcihQYXJhbVJlZiBwYXJhbSwgQzJTdHJpbmdMaXRlcmFsIG5hbWUsIEMyU3RydWN0RGVzY3JpcHRvciAmJik7CisgICAgICAgIFBhcmFtSGVscGVyKFBhcmFtSGVscGVyICYmKTsKKyAgICAgICAgflBhcmFtSGVscGVyKCk7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEZpbmRzIGEgZmllbGQgZGVzY3JpcHRvci4KKyAgICAgICAgICovCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4gZmluZEZpZWxkKHNpemVfdCBiYXNlT2Zmcywgc2l6ZV90IGJhc2VTaXplKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgcGFyYW1ldGVyIHJlZiBmb3IgdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgY29uc3QgUGFyYW1SZWYgcmVmKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIgYXMgbW9kaWZpYWJsZS4gVGhlIGNvbnN0bmVzcyBvZiB0aGlzCisgICAgICAgIC8vLyBvYmplY3QgZGV0ZXJtaW5lcyB0aGUgY29uc3RuZXNzIG9mIHRoZSByZXR1cm5lZCB2YWx1ZS4KKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHZhbHVlKCk7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhpcyBwYXJhbWV0ZXIgYXMgY29uc3QKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyUGFyYW0+IHZhbHVlKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFBlcmZvcm1zIGEgY29uZmlndXJhdGlvbiBjaGFuZ2UgcmVxdWVzdCBmb3IgdGhpcyBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSB2YWx1ZSAgICB0aGUgdmFsdWUgdGhhdCBpcyBiZWluZyBhc3NpZ25lZCB0byB0aGlzIHBhcmFtZXRlci4KKyAgICAgICAgICogICAgICAgICAgICAgICAgIFRoaXMgY291bGQgYmUgcG9pbnRpbmcgdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlCisgICAgICAgICAqICAgICAgICAgICAgICAgICBwYXJhbWV0ZXIuIFRoaXMgbXVzdCBub3QgY2hhbmdlLgorICAgICAgICAgKiBccGFyYW0gbWF5QmxvY2sgd2hldGhlciBibG9ja2luZyBpcyBhbGxvd2VkCisgICAgICAgICAqIFxwYXJhbSBlbmRWYWx1ZSB0aGUgcmVzdWx0aW5nIHZhbHVlCisgICAgICAgICAqIFxwYXJhbSBmYWN0b3J5ICBwYXJhbWV0ZXIgZmFjdG9yeSAodG8gYWNjZXNzIGRlcGVuZGVuY2llcykKKyAgICAgICAgICogXHBhcmFtIGZhaWx1cmVzIHZlY3RvciBvZiBmYWlsdXJlcyB0byBhcHBlbmQgYW55IGZhaWx1cmVzIGZyb20gdGhpcworICAgICAgICAgKiAgICAgICAgICAgICAgICAgb3BlcmF0aW9uCisgICAgICAgICAqCisgICAgICAgICAqIFxyZXR2YWwgQzJfT0sgICAgICAgIGNvbmZpZ3VyYXRpb24gd2FzIHN1Y2Nlc3NmdWwKKyAgICAgICAgICogXHJldHZhbCBDMl9CQURfVkFMVUUgdmFsdWUgaXMgaW5jb3JyZWN0IChUQkQpCisgICAgICAgICAqIFxyZXR2YWwgQzJfTk9fTUVNT1JZIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHBlcmZvcm0gdGhlIGFzc2lnbm1lbnQKKyAgICAgICAgICogXHJldHZhbCBDMl9USU1FRF9PVVQgY29uZmlndXJhdGlvbiB0aW1lZCBvdXQKKyAgICAgICAgICogXHJldHZhbCBDMl9CTE9DS0lORyAgY29uZmlndXJhdGlvbiByZXF1aXJlcyBibG9ja2luZyB0byBiZSBhbGxvd2VkCisgICAgICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIGludGVyZmFjZSBpcyBjb3JydXB0ZWQKKyAgICAgICAgICovCisgICAgICAgIGMyX3N0YXR1c190IHRyeVNldCgKKyAgICAgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jaywKKyAgICAgICAgICAgICAgICBib29sICpjaGFuZ2VkLAorICAgICAgICAgICAgICAgIEZhY3RvcnkgJmZhY3RvcnksCisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+KiBjb25zdCBmYWlsdXJlcyk7CisKKyAgICAgICAgLy8vIHJldHVybnMgcGFyYW1ldGVyIGluZGljZXMgdGhhdCBkZXBlbmQgb24gdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGdldERvd25EZXBlbmRlbmNpZXMoKSBjb25zdDsKKworICAgICAgICAvLy8gYWRkcyBhIGRlcGVuZGVudCBwYXJhbWV0ZXIKKyAgICAgICAgdm9pZCBhZGREb3duRGVwZW5kZW5jeShDMlBhcmFtOjpJbmRleCBpbmRleCk7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhhdCBwYXJhbWV0ZXIgcmVmcyBmb3IgcGFyYW1ldGVycyB0aGF0IGRlcGVuZCBvbiB0aGlzCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiBnZXREZXBlbmRlbmNpZXNBc1JlZnMoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyBhbmQgbW92ZXMgb3V0IHN0b3JlZCBzdHJ1Y3QgZGVzY3JpcHRvcgorICAgICAgICBDMlN0cnVjdERlc2NyaXB0b3IgcmV0cmlldmVTdHJ1Y3REZXNjcmlwdG9yKCk7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBwYXJhbWV0ZXIKKyAgICAgICAgQzJTdHJpbmcgbmFtZSgpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGlzIHBhcmFtZXRlcgorICAgICAgICBDMlBhcmFtOjpJbmRleCBpbmRleCgpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBwYXJhbWV0ZXIgZGVzY3JpcHRvcgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbURlc2NyaXB0b3I+IGdldERlc2NyaXB0b3IoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVmFsaWRhdGVzIHBhcmFtIGhlbHBlci4KKyAgICAgICAgICoKKyAgICAgICAgICogRm9yIG5vdywgdGhpcyBmaWxscyBmaWVsZCBpbmZvIGZvciBjb25zdCBwYXJhbXMuCisgICAgICAgICAqCisgICAgICAgICAqIFxyZXR2YWwgQzJfQ09SUlVQVEVEIHRoZSBwYXJhbWV0ZXIgY2Fubm90IGJlIGFkZGVkIGFzIHN1Y2gKKyAgICAgICAgICovCisgICAgICAgIGMyX3N0YXR1c190IHZhbGlkYXRlKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKTsKKworICAgIHByb3RlY3RlZDoKKyAgICAgICAgdHlwZWRlZiBDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QgYXR0cmliX3Q7CisgICAgICAgIGF0dHJpYl90JiBhdHRyaWIoKTsKKworICAgICAgICAvLy8gc2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIHBhcmFtZXRlcgorICAgICAgICB2b2lkIHNldERlZmF1bHRWYWx1ZShzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gZGVmYXVsdF8pOworCisgICAgICAgIC8vLyBzZXRzIHRoZSBzZXR0ZXIgbWV0aG9kCisgICAgICAgIHZvaWQgc2V0U2V0dGVyKHN0ZDo6ZnVuY3Rpb248QzJSKGNvbnN0IEMyUGFyYW0gKiwgYm9vbCwgYm9vbCAqLCBGYWN0b3J5ICYpPiBzZXR0ZXIpOworCisgICAgICAgIC8vLyBzZXRzIHRoZSBnZXR0ZXIgbWV0aG9kCisgICAgICAgIHZvaWQgc2V0R2V0dGVyKHN0ZDo6ZnVuY3Rpb248c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+KGJvb2wpPiBnZXR0ZXIpOworCisgICAgICAgIC8vLyBzZXRzIHRoZSBkZXBlbmRlbmNpZXMKKyAgICAgICAgdm9pZCBzZXREZXBlbmRlbmNpZXMoc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXMsIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiByZWZzKTsKKworICAgICAgICAvLy8gc2V0cyB0aGUgZmllbGRzIGFuZCB0aGVpciBzdXBwb3J0ZWQgdmFsdWVzCisgICAgICAgIHZvaWQgc2V0RmllbGRzKHN0ZDo6dmVjdG9yPEMyUGFyYW1GaWVsZFZhbHVlcz4gJiZmaWVsZHMpOworCisgICAgICAgIC8vLyBidWlsZCB0aGlzIGludG8gYSBmaW5hbCBQYXJhbUhlbHBlciBvYmplY3QKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBidWlsZCgpOworCisgICAgICAgIGNsYXNzIEltcGw7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJbXBsPiBtSW1wbDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogVHlwZWQgcGFyYW1ldGVyIGhlbHBlci4gVGhpcyBwcm92aWRlcyBhY2Nlc3MgdG8gbWVtYmVycyBhcyB3ZWxsIGFzIGZpZWxkIGhlbHBlcnMuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBzdHJ1Y3QgQzJfSElERSBQYXJhbSB7CisgICAgICAgIFBhcmFtKAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gaGVscGVyLCBzdGQ6OnNoYXJlZF9wdHI8VD4gJnBhcmFtLAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgICAgICA6IHYoKnBhcmFtLmdldCgpKSwKKyAgICAgICAgICAgICAgX21UeXBlZFBhcmFtKHBhcmFtKSwKKyAgICAgICAgICAgICAgX21IZWxwZXIoaGVscGVyKSwKKyAgICAgICAgICAgICAgX21SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorICAgICAgICB1c2luZyBGaWVsZFR5cGUgPSBGaWVsZDwKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBfYzJfcmVkdWNlX2VudW1fdG9fdW5kZXJseWluZ190eXBlPAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjpyZW1vdmVfY29uc3Q8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2V4dGVudDxTPjo6dHlwZT46OnR5cGU+Ojp0eXBlPjsKKworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBTPgorICAgICAgICBGaWVsZFR5cGU8Uz4gRihTICZmaWVsZCkgeworICAgICAgICAgICAgc2l6ZV90IG9mZnMgPSAodWludHB0cl90KSZmaWVsZCAtICh1aW50cHRyX3QpJmdldCgpOworICAgICAgICAgICAgLy8gdGhpcyBtdXN0IGZhbGwgZWl0aGVyIHdpdGhpbiBzaXplb2YoVCkgKyBGTEVYX1NJWkUgb3IgcGFyYW0tPnNpemUoKQorICAgICAgICAgICAgLy8gc2l6ZV90IHNpemUgPSBzaXplb2YoZmllbGQpOworICAgICAgICAgICAgLy8gbVBhcmFtIG1heSBiZSBudWxsCisgICAgICAgICAgICBzaXplX3QgYmFzZVNpemUgPSBzaXplb2YodHlwZW5hbWUgc3RkOjpyZW1vdmVfZXh0ZW50PFM+Ojp0eXBlKTsKKyAgICAgICAgICAgIHNpemVfdCBiYXNlT2ZmcyA9IEdldEJhc2VPZmZzZXQoCisgICAgICAgICAgICAgICAgICAgIF9tUmVmbGVjdG9yLCBUOjpDT1JFX0lOREVYLCBvZmZzIC0gc2l6ZW9mKEMyUGFyYW0pKTsKKyAgICAgICAgICAgIGlmICh+YmFzZU9mZnMgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIEMyX0xPRyhGQVRBTCkgPDwgInVua25vd24gZmllbGQgYXQgb2Zmc2V0ICIgPDwgb2ZmcyA8PCAiIHNpemUgIiA8PCBzaXplb2YoUykKKyAgICAgICAgICAgICAgICAvLyAgICAgICA8PCAiIGJhc2Utc2l6ZSAiIDw8IGJhc2VTaXplOworICAgICAgICAgICAgICAgIC8vIF9fYnVpbHRpbl90cmFwKCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJhc2VPZmZzICs9IHNpemVvZihDMlBhcmFtKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPiBoZWxwZXIgPSBfbUhlbHBlci0+ZmluZEZpZWxkKGJhc2VPZmZzLCBiYXNlU2l6ZSk7CisgICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlPFM+KGhlbHBlciwgX21UeXBlZFBhcmFtLT5pbmRleCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvbnN0IFBhcmFtIGhhdmUgY29uc3QgRmllbGRzOyBob3dldmVyLCByZW1vdmUgY29uc3QgZnJvbSBTCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFM+CisgICAgICAgIGNvbnN0IEZpZWxkVHlwZTxTPiBGKFMgJmZpZWxkKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxjb25zdCBGaWVsZFR5cGU8Uz4+KGNvbnN0X2Nhc3Q8UGFyYW0gKj4odGhpcyktPkYoZmllbGQpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vLyBSZXR1cm5zIGEgY29uc3QgcmVmIHZhbHVlIG9mIHRoaXMgY29uc3QgcGFyYW0uCisgICAgICAgIGNvbnN0IFQgJmdldCgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAqX21UeXBlZFBhcmFtLmdldCgpOworICAgICAgICB9CisKKyAgICAgICAgLy8vIFJldHVybnMgYSBtb2RpZmlhYmxlIHJlZiB2YWx1ZSBvZiB0aGlzIG5vbi1jb25zdCBwYXJhbS4KKyAgICAgICAgVCAmc2V0KCkgeworICAgICAgICAgICAgcmV0dXJuICpfbVR5cGVkUGFyYW0uZ2V0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLy8gQ29uc3QtcmVmZXJlbmNlIHRvIHRoZSB2YWx1ZS5zCisgICAgICAgIFQgY29uc3QgJnY7CisKKyAgICBwcml2YXRlOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gX21UeXBlZFBhcmFtOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IF9tSGVscGVyOworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gX21SZWZsZWN0b3I7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgdXNpbmcgQzJQID0gUGFyYW08VD47CisKKyAgICAvKioKKyAgICAgKiBUZW1wbGF0ZWQgbW92ZSBidWlsZGVyIGNsYXNzIGZvciBhIHBhcmFtZXRlciBoZWxwZXIuCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBjbGFzcyBDMl9ISURFIFBhcmFtQnVpbGRlciA6IHByaXZhdGUgUGFyYW1IZWxwZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgLyoqIENvbnN0cnVjdCB0aGUgcGFyYW1ldGVyIGJ1aWxkZXIgZnJvbSBtaW5pbWFsIGluZm8gcmVxdWlyZWQuICovCisgICAgICAgIFBhcmFtQnVpbGRlcihzdGQ6OnNoYXJlZF9wdHI8VD4gJnBhcmFtLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSkKKyAgICAgICAgICAgIDogUGFyYW1IZWxwZXIocGFyYW0sIG5hbWUsIEMyU3RydWN0RGVzY3JpcHRvcigoVCopbnVsbHB0cikpLAorICAgICAgICAgICAgICBtVHlwZWRQYXJhbSgmcGFyYW0pIHsKKyAgICAgICAgICAgIGF0dHJpYigpID0gYXR0cmliX3Q6OklTX1BFUlNJU1RFTlQ7CisgICAgICAgIH0KKworICAgICAgICAvKiogTWFrZXMgdGhpcyBwYXJhbWV0ZXIgcmVxdWlyZWQuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJnJlcXVpcmVkKCkgeworICAgICAgICAgICAgYXR0cmliKCkgfD0gYXR0cmliX3Q6OklTX1JFUVVJUkVEOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgLyoqIE1ha2VzIHRoaXMgcGFyYW1ldGVyIHRyYW5zaWVudCAobm90IHBlcnNpc3RlbnQpLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ0cmFuc2llbnQoKSB7CisgICAgICAgICAgICBhdHRyaWIoKSAmPSB+YXR0cmliX3Q6OklTX1BFUlNJU1RFTlQ7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogTWFrZXMgdGhpcyBwYXJhbWV0ZXIgaGlkZGVuIChub3QgZXhwb3NlZCBpbiBKQVZBIEFQSSkuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJmhpZGRlbigpIHsKKyAgICAgICAgICAgIGF0dHJpYigpIHw9IGF0dHJpYl90OjpJU19ISURERU47CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogTWFrZXMgdGhpcyBwYXJhbWV0ZXIgaW50ZXJuYWwgKG5vdCBleHBvc2VkIHRvIHF1ZXJ5L3NldHRpbmdzKS4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmaW50ZXJuYWwoKSB7CisgICAgICAgICAgICBhdHRyaWIoKSB8PSBhdHRyaWJfdDo6SVNfSU5URVJOQUw7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKiogQWRkcyBkZWZhdWx0IHZhbHVlLiBNdXN0IGJlIGFkZGVkIGV4YWN0bHkgb25jZS4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aERlZmF1bHQoc3RkOjpzaGFyZWRfcHRyPFQ+IGRlZmF1bHRfKSB7CisgICAgICAgICAgICAvLyBDSEVDSyghbURlZmF1bHRWYWx1ZSk7CisgICAgICAgICAgICAvLyBXQVJOX0lGKCFkZWZhdWx0Xyk7IC8vIGNvdWxkIGJlIG51bGxwdHIgaWYgT09NCisgICAgICAgICAgICAvLyB0ZWNobmljYWxseSwgdGhpcyBjb3VsZCBiZSBpbiB0aGUgcGFyZW50CisgICAgICAgICAgICAqbVR5cGVkUGFyYW0gPSBzdGQ6OnNoYXJlZF9wdHI8VD4oVDo6RnJvbShDMlBhcmFtOjpDb3B5KCpkZWZhdWx0XykucmVsZWFzZSgpKSk7CisgICAgICAgICAgICBzZXREZWZhdWx0VmFsdWUoZGVmYXVsdF8pOworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+ICp0eXBlZFBhcmFtID0gbVR5cGVkUGFyYW07CisgICAgICAgICAgICBzZXRHZXR0ZXIoW3R5cGVkUGFyYW1dKGJvb2wpIC0+IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMlBhcmFtPigqdHlwZWRQYXJhbSk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKiBBZGRzIGRlZmF1bHQgdmFsdWUuIE11c3QgYmUgYWRkZWQgZXhhY3RseSBvbmNlLiAqLworICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoRGVmYXVsdChUICpkZWZhdWx0XykgeworICAgICAgICAgICAgcmV0dXJuIHdpdGhEZWZhdWx0KHN0ZDo6c2hhcmVkX3B0cjxUPihkZWZhdWx0XykpOworICAgICAgICB9CisKKyAgICAgICAgLyoqIEFkZHMgYWxsIGZpZWxkcyB0byB0aGlzIHBhcmFtZXRlciB3aXRoIHRoZWlyIHBvc3NpYmxlIHZhbHVlcy4gKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aEZpZWxkcyhzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+ICYmZmllbGRzXykgeworICAgICAgICAgICAgc2V0RmllbGRzKHN0ZDo6bW92ZShmaWVsZHNfKSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogQWRkcyBhIGNvbnN0YW50IHZhbHVlIChhbHNvIGFzIGRlZmF1bHQpLiBNdXN0IGJlIGFkZGVkIGV4YWN0bHkgb25jZS4KKyAgICAgICAgICoKKyAgICAgICAgICogQ29uc3QgcGFyYW1ldGVycyBieSBkZWZpbml0aW9uIGhhdmUgbm8gZGVwZW5kZW5jaWVzLgorICAgICAgICAgKi8KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aENvbnN0VmFsdWUoc3RkOjpzaGFyZWRfcHRyPFQ+IGRlZmF1bHRfKSB7CisgICAgICAgICAgICBhdHRyaWIoKSB8PSBhdHRyaWJfdDo6SVNfQ09OU1Q7CisgICAgICAgICAgICBzZXRTZXR0ZXIoW2RlZmF1bHRfXSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUsIGJvb2wgbWF5QmxvY2sgX191bnVzZWQsIGJvb2wgKmNoYW5nZWQsIEZhY3RvcnkgJikgLT4gQzJSIHsKKyAgICAgICAgICAgICAgICAqY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNvbnN0IFQgKnR5cGVkVmFsdWUgPSBUOjpGcm9tKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZWRWYWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6OkNvcnJ1cHRlZCgpOyAvLyBUT0RPIEJhZFZhbHVlL0ludmFsaWQuIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaGVyZS4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCp0eXBlZFZhbHVlICE9ICpkZWZhdWx0XykgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpDb3JydXB0ZWQoKTsgLy8gVE9ETyBSZWFkT25seSgqZGVmYXVsdF8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJldHVybiBDMlI6Ok9rKCk7CisgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIHJldHVybiB3aXRoRGVmYXVsdChkZWZhdWx0Xyk7CisgICAgICAgIH0KKworICAgICAgICAvKiogQWRkcyBjb25zdGFudCB2YWx1ZSAoYWxzbyBhcyBkZWZhdWx0KS4gTXVzdCBiZSBhZGRlZCBleGFjdGx5IG9uY2UuICovCisgICAgICAgIGlubGluZSBQYXJhbUJ1aWxkZXIgJndpdGhDb25zdFZhbHVlKFQgKmRlZmF1bHRfKSB7CisgICAgICAgICAgICByZXR1cm4gd2l0aENvbnN0VmFsdWUoc3RkOjpzaGFyZWRfcHRyPFQ+KGRlZmF1bHRfKSk7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlIGEgc3RyaWN0IHNldHRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGZuICAgc3RyaWN0IHNldHRlcgorICAgICAgICAgKiBccGFyYW0gZGVwcyBkZXBlbmRlbmNpZXMgKHJlZmVyZW5jZXMpCisgICAgICAgICAqLworICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi4gRGVwcz4KKyAgICAgICAgaW5saW5lIFBhcmFtQnVpbGRlciAmd2l0aFNldHRlcigKKyAgICAgICAgICAgICAgICBDMlIgKCpmbikoYm9vbCwgY29uc3QgQzJQPFQ+ICYsIEMyUDxUPiAmLCBjb25zdCBDMlA8RGVwcz4gJi4uLiksCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPERlcHM+JiAuLi4gZGVwcykgeworICAgICAgICAgICAgYXR0cmliKCkgfD0gYXR0cmliX3Q6OklTX1NUUklDVDsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPiAqdHlwZWRQYXJhbSA9IG1UeXBlZFBhcmFtOworICAgICAgICAgICAgc2V0U2V0dGVyKFt0eXBlZFBhcmFtLCBmbiwgJmRlcHMuLi5dKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jaywgYm9vbCAqY2hhbmdlZCwgRmFjdG9yeSAmZmFjdG9yeSkgLT4gQzJSIHsKKyAgICAgICAgICAgICAgICAqY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGNvbnN0IFQgKnR5cGVkVmFsdWUgPSBUOjpGcm9tKHZhbHVlKTsKKyAgICAgICAgICAgICAgICBpZiAodHlwZWRWYWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6OkNvcnJ1cHRlZCgpOyAvLyBUT0RPIEJhZFZhbHVlL0ludmFsaWQuIFRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gaGVyZS4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gRG8gY29weS1vbi1jaGFuZ2UgZm9yIHBhcmFtZXRlcnMgaW4gdGhpcyBoZWxwZXIgc28gY2hhbmdlIGNhbiBiZSBkZXRlY3RlZCBieQorICAgICAgICAgICAgICAgIC8vIGEgY2hhbmdlIG9mIHRoZSBwb2ludGVyLiBEbyB0aGlzIGJ5IHdvcmtpbmcgb24gYSBwcm9wb3NlZCB2YWx1ZS4KKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gcHJvcG9zZWRWYWx1ZSA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxUPihUOjpGcm9tKEMyUGFyYW06OkNvcHkoKnZhbHVlKS5yZWxlYXNlKCkpKTsKKyAgICAgICAgICAgICAgICBpZiAocHJvcG9zZWRWYWx1ZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMlI6Ok5vTWVtb3J5KHZhbHVlLT5pbmRleCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQzJQPFQ+IG9sZFZhbHVlID0gZmFjdG9yeS5nZXQoKnR5cGVkUGFyYW0pOworICAgICAgICAgICAgICAgIC8vIEdldCBhIHBhcmFtZXRlciBoZWxwZXIgd2l0aCB2YWx1ZSBwb2ludGluZyB0byBwcm9wb3NlZFZhbHVlCisgICAgICAgICAgICAgICAgQzJQPFQ+IGhlbHBlciA9IGZhY3RvcnkuZ2V0KCp0eXBlZFBhcmFtLCBwcm9wb3NlZFZhbHVlKTsKKyAgICAgICAgICAgICAgICBDMlIgcmVzdWx0ID0gZm4obWF5QmxvY2ssIG9sZFZhbHVlLCBoZWxwZXIsIGZhY3RvcnkuZ2V0KGRlcHMpLi4uKTsKKworICAgICAgICAgICAgICAgIC8vIElmIHZhbHVlIGNoYW5nZWQsIGNvcHkgcmVzdWx0IHRvIGN1cnJlbnQgdmFsdWUKKyAgICAgICAgICAgICAgICBpZiAoaGVscGVyLmdldCgpICE9ICp0eXBlZFBhcmFtLT5nZXQoKSkgeworICAgICAgICAgICAgICAgICAgICAqdHlwZWRQYXJhbSA9IHByb3Bvc2VkVmFsdWU7CisgICAgICAgICAgICAgICAgICAgICpjaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICAgICAgICAgIH0pOworICAgICAgICAgICAgc2V0RGVwZW5kZW5jaWVzKHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PnsgZGVwcy0+aW5kZXgoKS4uLiB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPnsgUGFyYW1SZWYoZGVwcykuLi4gfSk7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKworICAgICAgICAvKioKKyAgICAgICAgICogVXNlIGEgbm9uLXN0cmljdCBzZXR0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFxwYXJhbSBmbiAgIG5vbi1zdHJpY3Qgc2V0dGVyCisgICAgICAgICAqIFxwYXJhbSBkZXBzIGRlcGVuZGVuY2llcyAocmVmZXJlbmNlcykKKyAgICAgICAgICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLiBEZXBzPgorICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZ3aXRoU2V0dGVyKAorICAgICAgICAgICAgICAgIEMyUiAoKmZuKShib29sLCBDMlA8VD4gJiwgY29uc3QgQzJQPERlcHM+ICYuLi4pLCBzdGQ6OnNoYXJlZF9wdHI8RGVwcz4mIC4uLiBkZXBzKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gKnR5cGVkUGFyYW0gPSBtVHlwZWRQYXJhbTsKKyAgICAgICAgICAgIHNldFNldHRlcihbdHlwZWRQYXJhbSwgZm4sICZkZXBzLi4uXSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUsIGJvb2wgbWF5QmxvY2ssIGJvb2wgKmNoYW5nZWQsIEZhY3RvcnkgJmZhY3RvcnkpIC0+IEMyUiB7CisgICAgICAgICAgICAgICAgKmNoYW5nZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBjb25zdCBUICp0eXBlZFZhbHVlID0gVDo6RnJvbSh2YWx1ZSk7CisgICAgICAgICAgICAgICAgaWYgKHR5cGVkVmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpDb3JydXB0ZWQoKTsgLy8gVE9ETyBCYWRWYWx1ZS9JbnZhbGlkLiBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGhlcmUuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIERvIGNvcHktb24tY2hhbmdlIGZvciBwYXJhbWV0ZXJzIGluIHRoaXMgaGVscGVyIHNvIGNoYW5nZSBjYW4gYmUgZGV0ZWN0ZWQgYnkKKyAgICAgICAgICAgICAgICAvLyBhIGNoYW5nZSBvZiB0aGUgcG9pbnRlci4gRG8gdGhpcyBieSB3b3JraW5nIG9uIGEgcHJvcG9zZWQgdmFsdWUuCisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFQ+IHByb3Bvc2VkVmFsdWUgPQorICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4oVDo6RnJvbShDMlBhcmFtOjpDb3B5KCp2YWx1ZSkucmVsZWFzZSgpKSk7CisgICAgICAgICAgICAgICAgaWYgKHByb3Bvc2VkVmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQzJSOjpOb01lbW9yeSh2YWx1ZS0+aW5kZXgoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEdldCBhIHBhcmFtZXRlciBoZWxwZXIgd2l0aCB2YWx1ZSBwb2ludGluZyB0byBwcm9wb3NlZFZhbHVlCisgICAgICAgICAgICAgICAgQzJQPFQ+IGhlbHBlciA9IGZhY3RvcnkuZ2V0KCp0eXBlZFBhcmFtLCBwcm9wb3NlZFZhbHVlKTsKKyAgICAgICAgICAgICAgICBDMlIgcmVzdWx0ID0gZm4obWF5QmxvY2ssIGhlbHBlciwgZmFjdG9yeS5nZXQoZGVwcykuLi4pOworCisgICAgICAgICAgICAgICAgLy8gSWYgdmFsdWUgY2hhbmdlZCwgY29weSByZXN1bHQgdG8gY3VycmVudCB2YWx1ZQorICAgICAgICAgICAgICAgIGlmIChoZWxwZXIuZ2V0KCkgIT0gKnR5cGVkUGFyYW0tPmdldCgpKSB7CisgICAgICAgICAgICAgICAgICAgICp0eXBlZFBhcmFtID0gcHJvcG9zZWRWYWx1ZTsKKyAgICAgICAgICAgICAgICAgICAgKmNoYW5nZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBzZXREZXBlbmRlbmNpZXMoc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+eyBkZXBzLT5pbmRleCgpLi4uIH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGFyYW1SZWY+eyBQYXJhbVJlZihkZXBzKS4uLiB9KTsKKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIC8qKgorICAgICAgICAgKiBNYXJrcyB0aGlzIGEgY2FsY3VsYXRlZCAocmVhZC1vbmx5KSBmaWVsZC4KKyAgICAgICAgICoKKyAgICAgICAgICogXHBhcmFtIGZuICAgbm9uLXN0cmljdCBzZXR0ZXIgKGNhbGN1bGF0b3IpCisgICAgICAgICAqIFxwYXJhbSBkZXBzIGRlcGVuZGVuY2llcyAocmVmZXJlbmNlcykKKyAgICAgICAgICovCisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLiBEZXBzPgorICAgICAgICBpbmxpbmUgUGFyYW1CdWlsZGVyICZjYWxjdWxhdGVkQXMoCisgICAgICAgICAgICAgICAgQzJSICgqZm4pKGJvb2wsIEMyUDxUPiAmLCBjb25zdCBDMlA8RGVwcz4gJi4uLiksIHN0ZDo6c2hhcmVkX3B0cjxEZXBzPiYgLi4uIGRlcHMpIHsKKyAgICAgICAgICAgIGF0dHJpYigpIHw9IGF0dHJpYl90OjpJU19SRUFEX09OTFk7CisgICAgICAgICAgICByZXR1cm4gd2l0aFNldHRlcihmbiwgc3RkOjpmb3J3YXJkPGRlY2x0eXBlKGRlcHMpPihkZXBzKS4uLik7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBidWlsZCgpIHsKKyAgICAgICAgICAgIHJldHVybiBQYXJhbUhlbHBlcjo6YnVpbGQoKTsKKyAgICAgICAgfQorCisgICAgcHJvdGVjdGVkOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8VD4gKm1UeXBlZFBhcmFtOworICAgIH07CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIHN0YXRpYyBQYXJhbUJ1aWxkZXI8VD4gRGVmaW5lUGFyYW0oc3RkOjpzaGFyZWRfcHRyPFQ+ICZwYXJhbSwgQzJTdHJpbmdMaXRlcmFsIG5hbWUpIHsKKyAgICAgICAgcmV0dXJuIFBhcmFtQnVpbGRlcjxUPihwYXJhbSwgbmFtZSk7CisgICAgfQorCitwdWJsaWM6CisgICAgYzJfc3RhdHVzX3QgcXVlcnkoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+ICZoZWFwUGFyYW1JbmRpY2VzLAorICAgICAgICAgICAgYzJfYmxvY2tpbmdfdCBtYXlCbG9jaywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPj4qIGNvbnN0IGhlYXBQYXJhbXMpIGNvbnN0OworCisgICAgLyoqCisgICAgICogSGVscGVyIGltcGxlbWVudGluZyBjb25maWcgY2FsbHMgYXMgd2VsbCBhcyBvdGhlciBjb25maWd1cmF0aW9uIHVwZGF0ZXMuCisgICAgICoKKyAgICAgKiBUaGlzIG1ldGhvZCBpcyB2aXJ0dWFsLCBzbyBpbXBsZW1lbnRhdGlvbnMgbWF5IHByb3ZpZGUgd3JhcHBlcnMgYXJvdW5kIGl0IChhbmQgcGVyZm9ybQorICAgICAqIGFjdGlvbnMganVzdCBiZWZvcmUgYW5kIGFmdGVyIGEgY29uZmlndXJhdGlvbikuCisgICAgICoKKyAgICAgKiBccGFyYW0gcGFyYW1zCisgICAgICogXHBhcmFtIG1heUJsb2NrCisgICAgICogXHBhcmFtIGZhaWx1cmVzCisgICAgICogXHBhcmFtIHVwZGF0ZVBhcmFtcyBpZiB0cnVlLCB0aGUgdXBkYXRlZCBwYXJhbWV0ZXIgdmFsdWVzIGFyZSBjb3BpZWQgYmFjayBpbnRvIHRoZSBhcmd1bWVudHMKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgIHBhc3NlZCBpbiB8cGFyYW1zfAorICAgICAqIFxwYXJhbSBjaGFuZ2VzICAgICAgcG9pbnRlZCB0byBhIHZlY3RvciB0byByZWNlaXZlIHNldHRpbmdzIHdpdGggdGhlaXIgdmFsdWVzIGNoYW5nZWQuIElmIG5vdAorICAgICAqICAgICAgICAgICAgICAgICAgICAgbnVsbCwgc2V0dGluZ3Mgd2l0aCB0aGVpciB2YWx1ZXMgY2hhbmdlZCBhcmUgYWRkZWQgdG8gdGhpcy4KKyAgICAgKiBccmV0dXJuIHJlc3VsdCBmcm9tIGNvbmZpZworICAgICAqLworICAgIHZpcnR1YWwgYzJfc3RhdHVzX3QgY29uZmlnKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJQYXJhbSo+ICZwYXJhbXMsIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2ssCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzLAorICAgICAgICAgICAgYm9vbCB1cGRhdGVQYXJhbXMgPSB0cnVlLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+PiAqY2hhbmdlcyA9IG51bGxwdHIpOworCisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdDsKKworICAgIGMyX3N0YXR1c190IHF1ZXJ5U3VwcG9ydGVkVmFsdWVzKAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc1F1ZXJ5PiAmZmllbGRzLCBjMl9ibG9ja2luZ190IG1heUJsb2NrKSBjb25zdDsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gZ2V0UmVmbGVjdG9yKCkgeworICAgICAgICByZXR1cm4gbVJlZmxlY3RvcjsKKyAgICB9CisKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gTG9jazsKKworICAgIC8qKgorICAgICAqIExvY2tzIHRoZSBpbnRlcmZhY2UgYW5kIHJldHVybnMgYSBsb2NrLiBUaGlzIGxvY2sgbXVzdCBiZSB1bmxvY2tlZCBvciByZWxlYXNlZCB3aXRob3V0CisgICAgICogY2FsbGluZyBhbnkgb3RoZXIgYmxvY2tpbmcgY2FsbC4KKyAgICAgKi8KKyAgICBMb2NrIGxvY2soKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICB2b2lkIHNldEludGVyZmFjZUFkZHJlc3NCb3VuZHModWludHB0cl90IHN0YXJ0LCB1aW50cHRyX3QgZW5kKSB7CisgICAgICAgIC8vIFRPRE86IGV4Y2x1ZGUgdGhpcyBoZWxwZXIKKyAgICAgICAgKHZvaWQpc3RhcnQ7CisgICAgICAgICh2b2lkKWVuZDsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbU11dGV4OworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlJlZmxlY3RvckhlbHBlcj4gbVJlZmxlY3RvcjsKKyAgICBzdHJ1Y3QgRmFjdG9yeUltcGw7CisgICAgc3RkOjpzaGFyZWRfcHRyPEZhY3RvcnlJbXBsPiBfbUZhY3Rvcnk7CisKKyAgICBDMkludGVyZmFjZUhlbHBlcihzdGQ6OnNoYXJlZF9wdHI8QzJSZWZsZWN0b3JIZWxwZXI+IHJlZmxlY3Rvcik7CisKKyAgICAvKioKKyAgICAgKiBBZGRzIGEgcGFyYW1ldGVyIHRvIHRoaXMgaW50ZXJmYWNlLgorICAgICAqIFxub3RlIFRoaXMgbWV0aG9kIENIRUNLcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwYXJhbSBwYXJhbWV0ZXIgdG8gYWRkLgorICAgICAqLworICAgIHZvaWQgYWRkUGFyYW1ldGVyKHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gcGFyYW0pOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVwZW5kZW5jeSBpbmRleCBmb3IgYSBwYXJhbWV0ZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gaXggdGhlIGluZGV4IG9mIHRoZSBwYXJhbWV0ZXIKKyAgICAgKi8KKyAgICBzaXplX3QgZ2V0RGVwZW5kZW5jeUluZGV4X2woQzJQYXJhbTo6SW5kZXggaXgpIGNvbnN0OworCisgICAgdmlydHVhbCB+QzJJbnRlcmZhY2VIZWxwZXIoKSA9IGRlZmF1bHQ7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHN1YmNsYXNzIGluc3RhbmNlJ3MgYWRkcmVzcyBhbmQgc2l6ZS4KKyAgICAgKgorICAgICAqIFx0b2RvIGFsbG93IHN1YmNsYXNzIHRvIHNwZWNpZnkgcGFyYW1ldGVyIGFkZHJlc3MgcmFuZ2UgZGlyZWN0bHkgKGUuZy4gZG8gbm90IGFzc3VtZSB0aGF0CisgICAgICogICAgICAgdGhleSBhcmUgbG9jYWwgdG8gdGhlIHN1YmNsYXNzIGluc3RhbmNlKQorICAgICAqCisgICAgICogXHBhcmFtIFQgdHlwZSBvZiB0aGUgZGVyaXZlZCBpbnN0YW5jZQorICAgICAqIFxwYXJhbSBpbnN0YW5jZSBwb2ludGVyIHRvIHRoZSBkZXJpdmVkIGluc3RhbmNlCisgICAgICovCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgQzJfSElERSB2b2lkIHNldERlcml2ZWRJbnN0YW5jZShUICppbnN0YW5jZSkgeworICAgICAgICBzZXRJbnRlcmZhY2VBZGRyZXNzQm91bmRzKCh1aW50cHRyX3QpaW5zdGFuY2UsICh1aW50cHRyX3QpKGluc3RhbmNlICsgMSkpOworICAgIH0KKworICAgIEMyX0RPX05PVF9DT1BZKEMySW50ZXJmYWNlSGVscGVyKTsKK307CisKKy8qKgorICogQ3JlYXRlcyBhIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIgY2xhc3MgZm9yIGEgZmllbGQgb2YgYSBwYXJhbWV0ZXIKKyAqCisgKiBccGFyYW0gc3BQYXJhbSBhIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVyIGluIGFuIGludGVyZmFjZSBjbGFzcyBzdWJjbGFzc2VkIGZyb20gQzJJbnRlcmZhY2VIZWxwZXIuCisgKiBccGFyYW0gZmllbGQgICBhIGZpZWxkIG9mIHN1Y2ggcGFyYW1ldGVyCisgKi8KKyNkZWZpbmUgQzJGKHNwUGFyYW0sIGZpZWxkKSBcCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjwgXAorICAgICAgICAgICAgdHlwZW5hbWUgX2MyX3JlZHVjZV9lbnVtX3RvX3VuZGVybHlpbmdfdHlwZTwgXAorICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2x0eXBlKHNwUGFyYW0tPmZpZWxkKT46OnR5cGU+Ojp0eXBlPjo6dHlwZT4oIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzJQYXJhbUZpZWxkKHNwUGFyYW0uZ2V0KCksICZzcFBhcmFtLT5maWVsZCkpCisKKyNlbmRpZiAgLy8gQzJVVElMU19JTlRFUkZBQ0VfSEVMUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTAzN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW5jbHVkZS91dGlsL0MySW50ZXJmYWNlVXRpbHMuaApAQCAtMCwwICsxLDExMzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEMyVVRJTFNfSU5URVJGQUNFX1VUSUxTX0hfCisjZGVmaW5lIEMyVVRJTFNfSU5URVJGQUNFX1VUSUxTX0hfCisKKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzJXb3JrLmg+CisKKyNpbmNsdWRlIDxjbWF0aD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKy8qKgorICogSGVscGVyIGNsYXNzIHRvIG1hcCB1bmRlcmx5aW5nIHR5cGVzIHRvIEMyVmFsdWUgdHlwZXMgYXMgd2VsbCBhcyB0byBwcmludCBmaWVsZCB2YWx1ZXMuIFRoaXMgaXMKKyAqIGdlbmVyYWxseSB0aGUgc2FtZSBhcyBzaW1wbHkgdGhlIHVuZGVybHlpbmcgdHlwZSBleGNlcHQgZm9yIGNoYXJhY3RlcnMgKFNUUklORykgYW5kIGJ5dGVzIChCTE9CKS4KKyAqLwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBDMl9ISURFIF9DMkZpZWxkVmFsdWVIZWxwZXIgeworICAgIHR5cGVkZWYgVCBWYWx1ZVR5cGU7CisgICAgaW5saW5lIHN0YXRpYyBzdGQ6Om9zdHJlYW0mIHB1dChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApIHsKKyAgICAgICAgcmV0dXJuIG9zIDw8IHAucmVmPFQ+KCk7CisgICAgfQorfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IEMyX0hJREUgX0MyRmllbGRWYWx1ZUhlbHBlcjx1aW50OF90PiB7CisgICAgdHlwZWRlZiB1aW50MzJfdCBWYWx1ZVR5cGU7CisgICAgc3RhdGljIHN0ZDo6b3N0cmVhbSYgcHV0KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCk7Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgQzJfSElERSBfQzJGaWVsZFZhbHVlSGVscGVyPGNoYXI+IHsKKyAgICB0eXBlZGVmIGludDMyX3QgVmFsdWVUeXBlOworICAgIHN0YXRpYyBzdGQ6Om9zdHJlYW0mIHB1dChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApOworfTsKKworLyoqCisgKiBTdXBwb3J0ZWQgdmFsdWUgcmFuZ2UgdXRpbGl0eSBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKgorICogVGhpcyBtaW1pY3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlIGZvciBSQU5HRSB0eXBlLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpWYWx1ZVR5cGUgVmFsdWVUeXBlOworCisvL3ByaXZhdGU6CisgICAgY29uc3RleHByIHN0YXRpYyBUIE1JTl9WQUxVRSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1pbigpOworICAgIGNvbnN0ZXhwciBzdGF0aWMgVCBNQVhfVkFMVUUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKTsKKyAgICBjb25zdGV4cHIgc3RhdGljIFQgTUlOX1NURVAgPSBzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA/IDAgOiAxOworCitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhbiBlbXB0eSByYW5nZSB3aXRoIG5vIHN1cHBvcnRlZCB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBcbm90ZSBUaGlzIGlzIGEgc3BlY2lhbGl6YXRlZCBzdXBwb3J0ZWQgcmFuZ2UgcmVwcmVzZW50YXRpb24gdGhhdCBpcyBvbmx5IHVzZWQgZm9yCisgICAgICogdGhpcyBvYmplY3QgLSBpdCBpcyBlcXVpdmFsZW50IHRvIHRoZSBFTVBUWSB0eXBlIGluIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMuCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBOb25lKCkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShNQVhfVkFMVUUsIE1JTl9WQUxVRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggYWxsIHZhbHVlcyBzdXBwb3J0ZWQuCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBBbnkoKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFJhbmdlKE1JTl9WQUxVRSwgTUFYX1ZBTFVFKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBhIHNpbmdsZSBzdXBwb3J0ZWQgdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIHNvbGUgc3VwcG9ydGVkIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBFcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UodmFsdWUsIHZhbHVlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugd2l0aCBzdXBwb3J0ZWQgdmFsdWVzIGdyZWF0ZXIgdGhhbiBhIGdpdmVuIHZhbHVlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSBnaXZlbiB2YWx1ZQorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgQzJTdXBwb3J0ZWRSYW5nZTxUPiBHcmVhdGVyVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiAodmFsdWUgPT0gTUFYX1ZBTFVFID8gTm9uZSgpIDoKKyAgICAgICAgICAgICAgICBzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA/CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN1cHBvcnRlZFJhbmdlKHN0ZDo6bmV4dGFmdGVyKHZhbHVlLCBNQVhfVkFMVUUpLCBNQVhfVkFMVUUpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEMyU3VwcG9ydGVkUmFuZ2UodmFsdWUgKyBNSU5fU1RFUCwgTUFYX1ZBTFVFKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gYSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IEdyZWF0ZXJUaGFuT3JFcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UodmFsdWUsIE1BWF9WQUxVRSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gKGFrYSBub3QgbGVzcyB0aGFuKSBhIGdpdmVuCisgICAgICogdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBOb3RMZXNzVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBHcmVhdGVyVGhhbk9yRXF1YWxUbyh2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gYSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIGNvbnN0ZXhwciBDMlN1cHBvcnRlZFJhbmdlPFQ+IExlc3NUaGFuT3JFcXVhbFRvKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UoTUlOX1ZBTFVFLCB2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gKGFrYSBub3QgZ3JlYXRlciB0aGFuKSBhIGdpdmVuCisgICAgICogdmFsdWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWUgdGhlIGdpdmVuIHZhbHVlCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIgQzJTdXBwb3J0ZWRSYW5nZTxUPiBOb3RHcmVhdGVyVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBMZXNzVGhhbk9yRXF1YWxUbyh2YWx1ZSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIHdpdGggc3VwcG9ydGVkIHZhbHVlcyBsZXNzIHRoYW4gYSBnaXZlbiB2YWx1ZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgZ2l2ZW4gdmFsdWUKKyAgICAgKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU3VwcG9ydGVkUmFuZ2U8VD4gTGVzc1RoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gKHZhbHVlID09IE1JTl9WQUxVRSA/IE5vbmUoKSA6CisgICAgICAgICAgICAgICAgc3RkOjppc19mbG9hdGluZ19wb2ludDxUPjo6dmFsdWUgPworICAgICAgICAgICAgICAgICAgICAgICAgQzJTdXBwb3J0ZWRSYW5nZShNSU5fVkFMVUUsIHN0ZDo6bmV4dGFmdGVyKHZhbHVlLCBNSU5fVkFMVUUpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICBDMlN1cHBvcnRlZFJhbmdlKE1JTl9WQUxVRSwgdmFsdWUgLSBNSU5fU1RFUCkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBjb250aW51b3VzIG9yIGFyaXRobWV0aWMgcmFuZ2UgYmV0d2VlbiB0d28gdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIG1pbiB0aGUgbG93ZXIgdmFsdWUKKyAgICAgKiBccGFyYW0gbWF4IHRoZSBoaWdoZXIgdmFsdWUgKGlmIHRoaXMgaXMgbG93ZXIgdGhhbiB8bWlufCB0aGUgcmFuZ2Ugd2lsbCBiZSBlbXB0eSkKKyAgICAgKiBccGFyYW0gc3RlcCB0aGUgc3RlcCBvZiB0aGUgYXJpdGhtZXRpYyByYW5nZS4gKElmIHRoaXMgaXMgMCBmb3IgZmxvYXRpbmcgcG9pbnQgdHlwZXMgb3IgMSBmb3IKKyAgICAgKiAgICAgICAgaW50ZWdlciB0eXBlcywgdGhlIGNvbnN0cnVjdGVkIHJhbmdlIGlzIGNvbnRpbnVvdXMpCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIKKyAgICBDMlN1cHBvcnRlZFJhbmdlPFQ+IEluUmFuZ2UoVCBtaW4sIFQgbWF4LCBUIHN0ZXAgPSBNSU5fU1RFUCkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShtaW4sIG1heCwgc3RlcCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHJhbmdlIG92ZXIgYSBnZW9tZXRyaWMgc2VyaWVzIGJldHdlZW4gdHdvIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtaW4gdGhlIGxvd2VyIGJvdW5kIG9mIHRoZSByYW5nZS4gVGhpcyB2YWx1ZSBpcyBhbHdheXMgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQgcmFuZ2UKKyAgICAgKiAgICAgICAgYXMgbG9uZyBhcyBpdCBpcyBub3QgZ3JlYXRlciB0aGFuIHxtYXh8LgorICAgICAqIFxwYXJhbSBtYXggdGhlIHVwcGVyIGJvdW5kIG9mIHRoZSByYW5nZS4gVGhpcyB2YWx1ZSBpcyBvbmx5IHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkCisgICAgICogICAgICAgIHJhbmdlIGlmIGl0IGlzIHBhcnQgb2YgdGhlIGdlb21ldHJpYyBzZXJpZXMuCisgICAgICogXHBhcmFtIG51bSB0aGUgbnVtZXJhdG9yIG9mIHRoZSBnZW9tZXRyaWMgc2VyaWVzLgorICAgICAqIFxwYXJhbSBkZW5vbSB0aGUgZGVub21pbmF0b3Igb2YgdGhlIGdlb21ldHJpYyBzZXJpZXMuCisgICAgICovCisgICAgaW5saW5lIHN0YXRpYyBjb25zdGV4cHIKKyAgICBDMlN1cHBvcnRlZFJhbmdlPFQ+IEluU2VyaWVzKFQgbWluLCBUIG1heCwgVCBudW0sIFQgZGVub20pIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UobWluLCBtYXgsIDAsIG51bSwgZGVub20pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSBvdmVyIGEgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMgYmV0d2VlbiB0d28gdmFsdWVzLgorICAgICAqCisgICAgICogXHBhcmFtIG1pbiB0aGUgbG93ZXIgYm91bmQgb2YgdGhlIHJhbmdlLiBUaGlzIHZhbHVlIGlzIGFsd2F5cyBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZCByYW5nZQorICAgICAqICAgICAgICBhcyBsb25nIGFzIGl0IGlzIG5vdCBncmVhdGVyIHRoYW4gfG1heHwuCisgICAgICogXHBhcmFtIG1heCB0aGUgdXBwZXIgYm91bmQgb2YgdGhlIHJhbmdlLiBUaGlzIHZhbHVlIGlzIG9ubHkgcGFydCBvZiB0aGUgY29uc3RydWN0ZWQKKyAgICAgKiAgICAgICAgcmFuZ2UgaWYgaXQgaXMgcGFydCBvZiB0aGUgc2VyaWVzLgorICAgICAqIFxwYXJhbSBzdGVwIHRoZSBhY2N1bXVsYXRvciBvZiB0aGUgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMKKyAgICAgKiBccGFyYW0gbnVtIHRoZSBudW1lcmF0b3Igb2YgdGhlIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzLgorICAgICAqIFxwYXJhbSBkZW5vbSB0aGUgZGVub21pbmF0b3Igb2YgdGhlIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzLgorICAgICAqLworICAgIGlubGluZSBzdGF0aWMgY29uc3RleHByCisgICAgQzJTdXBwb3J0ZWRSYW5nZTxUPiBJbk1hY1NlcmllcyhUIG1pbiwgVCBtYXgsIFQgc3RlcCwgVCBudW0sIFQgZGVub20pIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkUmFuZ2UobWluLCBtYXgsIHN0ZXAsIG51bSwgZGVub20pOworICAgIH0KKworICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSByYW5nZSBmcm9tIGEgZ2VuZXJpYyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIG9iamVjdC4gVGhpcyB3aWxsIGJlIGFuIGVtcHR5CisgICAgICogcmFuZ2UgaWYgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIG5vdCBvZiBSQU5HRSB0eXBlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgc3VwcG9ydGVkIHZhbHVlcyBvYmplY3QKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFJhbmdlKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcyk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyByYW5nZSBpcyBlbXB0eS4KKyAgICAgKi8KKyAgICBpbmxpbmUgY29uc3RleHByIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tTWluID4gX21NYXg7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcmFuZ2UgaXMgdmFsaWQuCisgICAgICoKKyAgICAgKiBSYW5nZXMgYXJlIHZhbGlkIGlmIHRoZXkgYXJlIGNvbnRpbnVvdXMgb3IgbW9ub3RvbmljLgorICAgICAqLworICAgIGlubGluZSBjb25zdGV4cHIgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgICAgICAvLyBUT0RPOiBoYW5kbGUgb3ZlcmZsb3cgb3IgbmVnYXRpdmUgc2VyaWVzCisgICAgICAgIHJldHVybiBfbURlbm9tID4gMCAmJiBfbU51bSA+PSBfbURlbm9tICYmIF9tTWluICogKF9tRGVub20gLSBfbU51bSkgPCBfbVN0ZXAgKiBfbURlbm9tOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciBhIHZhbHVlIGlzIHBhcnQgb2YgdGhpcyByYW5nZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gY2hlY2suCisgICAgICovCisgICAgYm9vbCBjb250YWlucyhUIHZhbHVlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgcmFuZ2UgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgcmFuZ2UgYW5kIGFub3RoZXIsIGlmIGl0IGlzCisgICAgICogcmVwcmVzZW50YWJsZSBhcyBhIHJhbmdlIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaW1pdCB0aGUgb3RoZXIgcmFuZ2UKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFJhbmdlPFQ+IGxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZsaW1pdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LgorICAgICAqLworICAgIGlubGluZSBvcGVyYXRvciBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyhfbU1pbiwgX21NYXgsIF9tU3RlcCwgX21OdW0sIF9tRGVub20pOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIGxvd2VyIGJvdW5kIGFuZCBzdGFydGluZyBwb2ludCBvZiB0aGlzIHJhbmdlLgorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBUIG1pbigpIGNvbnN0ICAgeyByZXR1cm4gX21NaW47ICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgdXBwZXIgYm91bmQgb2YgdGhpcyByYW5nZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgVCBtYXgoKSBjb25zdCAgIHsgcmV0dXJuIF9tTWF4OyAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHN0ZXAgb2YgdGhpcyByYW5nZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgVCBzdGVwKCkgY29uc3QgIHsgcmV0dXJuIF9tU3RlcDsgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG51bWVyYXRvciBvZiB0aGlzIHJhbmdlLgorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBUIG51bSgpIGNvbnN0ICAgeyByZXR1cm4gX21OdW07ICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZGVub21pbmF0b3Igb2YgdGhpcyByYW5nZS4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgVCBkZW5vbSgpIGNvbnN0IHsgcmV0dXJuIF9tRGVub207IH0KKworcHJpdmF0ZToKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgeFtpLi4uXSBpcyBhbGwgdmFsdWVzIGJldHdlZW4gX21NaW4gYW5kIF9tTWF4LgorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBib29sIGlzU2ltcGxlUmFuZ2UoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbVN0ZXAgPT0gTUlOX1NURVAgJiYgX21OdW0gPT0gMSAmJiBfbURlbm9tID09IDE7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHhbaS4uLl0gaXMgZGVmaW5lZCBhcyBzdWNoOgorICAgICAqIHhbaSArIDFdID0geFtpXSArIF9tU3RlcCwgd2hlcmUgX21TdGVwID4gMCBhbmQgX21NaW4gPD0geFtpXSA8PSBfbU1heAorICAgICAqLworICAgIGlubGluZSBDMl9ISURFIGNvbnN0ZXhwciBib29sIGlzQXJpdGhtZXRpY1NlcmllcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tU3RlcCA+IE1JTl9TVEVQICYmIF9tTnVtID09IDEgJiYgX21EZW5vbSA9PSAxOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB4W2kuLi5dIGlzIGRlZmluZWQgYXMgc3VjaDoKKyAgICAgKiB4W2ldID0geFswXSAqIChfbU51bSAvIF9tRGVub20pIF4gaSAod2l0aCByb3VuZGluZyksIHdoZXJlIF9tTnVtID4gX21EZW5vbSA+IDAgYW5kIHhbMF0gPiAwCisgICAgICovCisgICAgaW5saW5lIEMyX0hJREUgY29uc3RleHByIGJvb2wgaXNHZW9tZXRyaWNTZXJpZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBfbU1pbiA+IDAgJiYgX21TdGVwID09IDAgJiYgX21OdW0gPiBfbURlbm9tICYmIF9tRGVub20gPiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB4W2kuLi5dIGlzIGRlZmluZWQgYXMgc3VjaDoKKyAgICAgKiB4W2kgKyAxXSA9IHhbaV0gKiBfbU51bSAvIF9tRGVub20gKyBfbVN0ZXAgKHdpdGggcm91bmRpbmcpLCB3aGlsZSB4W2kgKyAxXSA+IHhbaV0sIHdoZXJlCisgICAgICogX21TdGVwICE9IDAsIF9tRGVub20gPiAwIGFuZCBfbU51bSA+IDAKKyAgICAgKi8KKyAgICBpbmxpbmUgQzJfSElERSBjb25zdGV4cHIgYm9vbCBpc01hY1NlcmllcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tU3RlcCAhPSAwICYmIF9tTnVtID4gMCAmJiBfbURlbm9tID4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGFyaXRobWV0aWMgb3IgY29udGludW91cyByYW5nZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBtaW4gdGhlIGxvd2VyIHZhbHVlCisgICAgICogXHBhcmFtIG1heCB0aGUgaGlnaGVyIHZhbHVlIChpZiB0aGlzIGlzIGxvd2VyIHRoYW4gfG1pbnwgdGhlIHJhbmdlIHdpbGwgYmUgZW1wdHkpCisgICAgICogXHBhcmFtIHN0ZXAgdGhlIHN0ZXAgb2YgdGhlIGFyaXRobWV0aWMgcmFuZ2UuIChJZiB0aGlzIGlzIDAgZm9yIGZsb2F0aW5nIHBvaW50IHR5cGVzIG9yIDEgZm9yCisgICAgICogICAgICAgIGludGVnZXIgdHlwZXMsIHRoZSBjb25zdHJ1Y3RlZCByYW5nZSBpcyBjb250aW51b3VzKQorICAgICAqLworICAgIGNvbnN0ZXhwciBDMl9ISURFIEMyU3VwcG9ydGVkUmFuZ2UoVCBtaW4sIFQgbWF4LCBUIHN0ZXAgPSBUKHN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlID8gMCA6IDEpKQorICAgICAgICA6IF9tTWluKG1pbiksIF9tTWF4KG1heCksIF9tU3RlcChzdGVwKSwgX21OdW0oMSksIF9tRGVub20oMSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgcmFuZ2Ugb3ZlciBhIGdlb21lcnRpYyBzb3IgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gbWluIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgcmFuZ2UuIFRoaXMgdmFsdWUgaXMgYWx3YXlzIHBhcnQgb2YgdGhlIGNvbnN0cnVjdGVkIHJhbmdlCisgICAgICogICAgICAgIGFzIGxvbmcgYXMgaXQgaXMgbm90IGdyZWF0ZXIgdGhhbiB8bWF4fC4KKyAgICAgKiBccGFyYW0gbWF4IHRoZSB1cHBlciBib3VuZCBvZiB0aGUgcmFuZ2UuIFRoaXMgdmFsdWUgaXMgb25seSBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3RlZAorICAgICAqICAgICAgICByYW5nZSBpZiBpdCBpcyBwYXJ0IG9mIHRoZSBnZW9tZXRyaWMgc2VyaWVzLgorICAgICAqIFxwYXJhbSBzdGVwIHRoZSBhY2N1bXVsYXRvciBvZiB0aGUgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMuIFRoaXMgaXMgMCBmb3IgYSBwdXJlIGdlb21ldHJpYworICAgICAqICAgICAgICBzZXJpZXMKKyAgICAgKiBccGFyYW0gbnVtIHRoZSBudW1lcmF0b3Igb2YgdGhlIGdlb21ldHJpYyBzZXJpZXMuCisgICAgICogXHBhcmFtIGRlbm9tIHRoZSBkZW5vbWluYXRvciBvZiB0aGUgZ2VvbWV0cmljIHNlcmllcy4KKyAgICAgKi8KKyAgICBjb25zdGV4cHIgQzJfSElERSBDMlN1cHBvcnRlZFJhbmdlKFQgbWluLCBUIG1heCwgVCBzdGVwLCBUIG51bSwgVCBkZW4pCisgICAgICAgIDogX21NaW4obWluKSwgX21NYXgobWF4KSwgX21TdGVwKHN0ZXApLCBfbU51bShudW0pLCBfbURlbm9tKGRlbikgeyB9CisKKyAgICBUIF9tTWluOyAvLy88IGxvd2VyIGJvdW5kIGFuZCBzdGFydGluZyBwb2ludAorICAgIFQgX21NYXg7IC8vLzwgdXBwZXIgYm91bmQKKyAgICBUIF9tU3RlcDsgLy8vPCBzdGVwIG9mIGFuIGFyaXRobWV0aWMgc2VyaWVzICgwIGlmIGNvbnRpbnVvdXMgZmxvYXRpbmcgcG9pbnQgcmFuZ2UpCisgICAgVCBfbU51bTsgLy8vPCBudW1lcmF0b3Igb2YgYSBnZW9tZXRyaWMgc2VyaWVzCisgICAgVCBfbURlbm9tOyAvLy88IGRlbm9taW5hdG9yIG9mIGEgZ2VvbWV0cmljIHNlcmllcworfTsKKworLyoqCisgKiBPcmRlcmVkIHN1cHBvcnRlZCBmbGFnIHNldCBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMlN1cHBvcnRlZEZsYWdzIHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OlZhbHVlVHlwZSBWYWx1ZVR5cGU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IGZsYWcgc2V0LgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyBpcyBhIHNwZWNpYWxpemF0ZWQgc3VwcG9ydGVkIGZsYWdzIHJlcHJlc2VudGF0aW9uIHRoYXQgaXMgb25seSB1c2VkIGZvcgorICAgICAqIHRoaXMgb2JqZWN0IC0gaXQgaXMgZXF1aXZhbGVudCB0byB0aGUgRU1QVFkgdHlwZSBpbiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzLgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgQzJTdXBwb3J0ZWRGbGFnczxUPiBOb25lKCkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRGbGFncyhzdGQ6OmluaXRpYWxpemVyX2xpc3Q8QzJWYWx1ZTo6UHJpbWl0aXZlPigpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmxhZ3Mgc2V0IG9mIGdpdmVuIGZsYWdzLgorICAgICAqCisgICAgICogXHBhcmFtIGZsYWdzIHRoZSBvcmRlcmVkIHNldCBvZiBmbGFncyBhcyBhbiBpbml0aWFsaXplciBsaXN0LgorICAgICAqIFxwYXJhbSBtaW4gbWluaW11bSBzZXQgb2YgZmxhZ3MgdG8gYmUgc2V0LgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgQzJTdXBwb3J0ZWRGbGFnczxUPiBGbGFncyhjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gZmxhZ3MsIFQgbWluID0gVCgwKSkgeworICAgICAgICByZXR1cm4gQzJTdXBwb3J0ZWRGbGFncyhtaW4sIGZsYWdzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmxhZ3Mgc2V0IG9mIGdpdmVuIGZsYWdzLgorICAgICAqCisgICAgICogXHBhcmFtIGZsYWdzIHRoZSBvcmRlcmVkIHNldCBvZiBmbGFncy4KKyAgICAgKiBccGFyYW0gbWluIG1pbmltdW0gc2V0IG9mIGZsYWdzIHRvIGJlIHNldC4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW5saW5lIEMyU3VwcG9ydGVkRmxhZ3M8VD4gRmxhZ3MoY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmZsYWdzLCBUIG1pbiA9IFQoMCkpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkRmxhZ3MobWluLCBmbGFncyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGZsYWcgc2V0IGZyb20gYSBnZW5lcmljIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LiBUaGlzIHdpbGwgYmUgYW4gZW1wdHkKKyAgICAgKiBzZXQgaWYgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIG5vdCBvZiBGTEFHUyB0eXBlLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyB0aGUgc3VwcG9ydGVkIHZhbHVlcyBvYmplY3QKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZEZsYWdzPFQ+KGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcykgeworICAgICAgICBpZiAodmFsdWVzLnR5cGUgPT0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RkxBR1MpIHsKKyAgICAgICAgICAgIF9tVmFsdWVzLmluc2VydChfbVZhbHVlcy5lbmQoKSwgdmFsdWVzLnZhbHVlcy5iZWdpbigpLCB2YWx1ZXMudmFsdWVzLmVuZCgpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgd2hldGhlciB0aGlzIHNldCBpcyBlbXB0eS4KKyAgICAgKi8KKyAgICBjb25zdGV4cHIgYm9vbCBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gX21WYWx1ZXMuZW1wdHkoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSB2YWx1ZSBpcyBwYXJ0IG9mIHRoaXMgc2V0LgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSB0byBjaGVjay4KKyAgICAgKi8KKyAgICBib29sIGNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyBmbGFnIHNldCB0aGF0IGlzIHRoZSBpbnRlcnNlY3Rpb24gb2YgdGhpcyBzZXQgYW5kIGFub3RoZXIuCisgICAgICoKKyAgICAgKiBccGFyYW0gbGltaXQgdGhlIG90aGVyIHZhbHVlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkRmxhZ3M8VD4gbGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8VD4gJmxpbWl0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyBvYmplY3QuCisgICAgICovCisgICAgb3BlcmF0b3IgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoIWlzRW1wdHkoKSAvKiBmbGFncyAqLywgX21WYWx1ZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIG9yZGVyZWQgc2V0IG9mIGZsYWdzIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+IGZsYWdzKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBtaW5pbXVtIHNldCBvZiBmbGFncyBmb3IgdGhpcyBvYmplY3QuCisgICAgICovCisgICAgVCBtaW4oKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIENsZWFycyB0aGlzIHN1cHBvcnRlZCB2YWx1ZSBzZXQuCisgICAgICovCisgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7CisgICAgICAgIF9tVmFsdWVzLmNsZWFyKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIENvbnN0cnVjdHMgYSBmbGFnIHNldCBkaXJlY3RseSBmcm9tIGFuIGludGVybmFsIHJlcHJlc2VudGF0aW9uLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlcyBhIHZlY3RvciBjb250YWluaW5nIHRoZSBtaW5pbXVtIGZsYWcgc2V0IGZvbGxvd2VkIGJ5IHRoZSBzZXQgb2YgZmxhZ3MKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZEZsYWdzKHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gJiZ2YWx1ZXMpCisgICAgICAgIDogX21WYWx1ZXModmFsdWVzKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIGZsYWcgc2V0IGZyb20gYSBzZXQgb2YgZmxhZ3MgYW5kIGEgbWluaW11bSBmbGFnIHNldC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBmbGFncyB0aGUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRGbGFncyhUIG1pbiwgY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJmZsYWdzKSB7CisgICAgICAgIF9tVmFsdWVzLmVtcGxhY2VfYmFjayhtaW4pOworICAgICAgICBmb3IgKFQgZWxlbSA6IGZsYWdzKSB7CisgICAgICAgICAgICBfbVZhbHVlcy5lbXBsYWNlX2JhY2soZWxlbSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgZmxhZyBzZXQgZnJvbSBhIHNldCBvZiBpbml0aWFsaXplciBsaXN0IHZhbHVlcyBhbmQgYSBtaW5pbXVtIGZsYWcgc2V0CisgICAgICoKKyAgICAgKiBccGFyYW0gZmxhZ3MgdGhlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkRmxhZ3MoVCBtaW4sIGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBmbGFncykgeworICAgICAgICBfbVZhbHVlcy5lbXBsYWNlX2JhY2sobWluKTsKKyAgICAgICAgZm9yIChUIGVsZW0gOiBmbGFncykgeworICAgICAgICAgICAgX21WYWx1ZXMuZW1wbGFjZV9iYWNrKGVsZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiBfbVZhbHVlczsgLy8vPCB0aGUgbWluaW11bSBmbGFnIHNldCBmb2xsb3dlZCBieSB0aGUgc2V0IG9mIGZsYWdzCit9OworCisvKioKKyAqIE9yZGVyZWQgc3VwcG9ydGVkIHZhbHVlIHNldCBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OlZhbHVlVHlwZSBWYWx1ZVR5cGU7CisKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGFuIGVtcHR5IHZhbHVlIHNldC4KKyAgICAgKgorICAgICAqIFxub3RlIFRoaXMgaXMgYSBzcGVjaWFsaXphdGVkIHN1cHBvcnRlZCByYW5nZSByZXByZXNlbnRhdGlvbiB0aGF0IGlzIG9ubHkgdXNlZCBmb3IKKyAgICAgKiB0aGlzIG9iamVjdCAtIGl0IGlzIGVxdWl2YWxlbnQgdG8gdGhlIEVNUFRZIHR5cGUgaW4gQzJGaWVsZFN1cHBvcnRlZFZhbHVlcy4KKyAgICAgKi8KKyAgICBzdGF0aWMgaW5saW5lIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gTm9uZSgpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQoeyB9KTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdmFsdWUgc2V0IG9mIGdpdmVuIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIG9yZGVyZWQgc2V0IG9mIHZhbHVlcyBhcyBhbiBpbml0aWFsaXplciBsaXN0LgorICAgICAqLworICAgIHN0YXRpYyBpbmxpbmUgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBPbmVPZihjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBvZiBnaXZlbiB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBvcmRlcmVkIHNldCBvZiB2YWx1ZXMuCisgICAgICovCisgICAgc3RhdGljIGlubGluZSBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IE9uZU9mKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZ2YWx1ZXMpIHsKKyAgICAgICAgcmV0dXJuIEMyU3VwcG9ydGVkVmFsdWVTZXQodmFsdWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBDb25zdHJ1Y3RzIGEgdmFsdWUgc2V0IGZyb20gYSBnZW5lcmljIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LiBUaGlzIHdpbGwgYmUgYW4gZW1wdHkKKyAgICAgKiBzZXQgaWYgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlIG5vdCBvZiBWQUxVRVMgdHlwZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgb2JqZWN0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPihjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpIHsKKyAgICAgICAgaWYgKHZhbHVlcy50eXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUykgeworICAgICAgICAgICAgX21WYWx1ZXMuaW5zZXJ0KF9tVmFsdWVzLmVuZCgpLCB2YWx1ZXMudmFsdWVzLmJlZ2luKCksIHZhbHVlcy52YWx1ZXMuZW5kKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgcmFuZ2UgaXMgZW1wdHkuCisgICAgICovCisgICAgY29uc3RleHByIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIF9tVmFsdWVzLmVtcHR5KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIGEgdmFsdWUgaXMgcGFydCBvZiB0aGlzIHNldC4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gY2hlY2suCisgICAgICovCisgICAgYm9vbCBjb250YWlucyhUIHZhbHVlKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgdmFsdWUgc2V0IHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIHNldCBhbmQgYW5vdGhlci4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaW1pdCB0aGUgb3RoZXIgdmFsdWUgc2V0CisgICAgICovCisgICAgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiBsaW1pdGVkVG8oY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmbGltaXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogUmV0dXJucyBhIG5ldyB2YWx1ZSBzZXQgdGhhdCBpcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgc2V0IGFuZCBhIHZhbHVlIHJhbmdlLgorICAgICAqCisgICAgICogXHBhcmFtIGxpbWl0IHRoZSBvdGhlciByYW5nZQorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gbGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgYSBuZXcgdmFsdWUgc2V0IHRoYXQgaXMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGlzIHNldCBhbmQgYSBmbGFnIHNldC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBsaW1pdCB0aGUgb3RoZXIgZmxhZyBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IGxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZsaW1pdCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgb2JqZWN0LgorICAgICAqLworICAgIG9wZXJhdG9yIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzKGZhbHNlIC8qIGZsYWdzICovLCBfbVZhbHVlcyk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgb3JkZXJlZCBzZXQgb2YgdmFsdWVzIG9mIHRoaXMgb2JqZWN0LgorICAgICAqLworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+IHZhbHVlcygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQ2xlYXJzIHRoaXMgc3VwcG9ydGVkIHZhbHVlIHNldC4KKyAgICAgKi8KKyAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgX21WYWx1ZXMuY2xlYXIoKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBmcm9tIGEgc2V0IG9mIEMyVmFsdWU6OlByaW1pdGl2ZSB2YWx1ZXMuCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0KHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gJiZ2YWx1ZXMpCisgICAgICAgIDogX21WYWx1ZXModmFsdWVzKSB7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBmcm9tIGEgc2V0IG9mIHZhbHVlcy4KKyAgICAgKgorICAgICAqIFxwYXJhbSB2YWx1ZXMgdGhlIHNldAorICAgICAqLworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQoY29uc3Qgc3RkOjp2ZWN0b3I8VD4gJnZhbHVlcykgeworICAgICAgICBmb3IgKFQgZWxlbSA6IHZhbHVlcykgeworICAgICAgICAgICAgX21WYWx1ZXMuZW1wbGFjZV9iYWNrKGVsZW0pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqCisgICAgICogQ29uc3RydWN0cyBhIHZhbHVlIHNldCBmcm9tIGEgc2V0IG9mIGluaXRpYWxpemVyIGxpc3QgdmFsdWVzCisgICAgICoKKyAgICAgKiBccGFyYW0gdmFsdWVzIHRoZSBzZXQKKyAgICAgKi8KKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0KGNvbnN0IHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiB2YWx1ZXMpIHsKKyAgICAgICAgZm9yIChUIGVsZW0gOiB2YWx1ZXMpIHsKKyAgICAgICAgICAgIF9tVmFsdWVzLmVtcGxhY2VfYmFjayhlbGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPEMyVmFsdWU6OlByaW1pdGl2ZT4gX21WYWx1ZXM7IC8vLzwgdGhlIHN1cHBvcnRlZCBzZXQgb2YgdmFsdWVzCit9OworCisvKioKKyAqIEhlbHBlciBjbGFzcyB0byBoYW5kbGUgQzJGaWVsZFN1cHBvcnRlVmFsdWVzIG9iamVjdCBmb3IgZmllbGRzIG9mIHZhcmlvdXMgdHlwZXMuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyOworCisvLyB0ZW1wbGF0ZWQgb3BlcmF0b3IgbXVzdCBiZSBwcmVkZWNsYXJlZCBmb3IgZnJpZW5kIGRlY2xhcmF0aW9uCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4gJmkpOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGhlbHBlciBmb3IgYSBzcGVjaWZpYyB0eXBlIGZyb20gYSBnZW5lcmljIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgc3RydWN0LgorICAgICAqLworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKTsKKworICAgIC8vIFRSSUNLWTogbmVlZGVkIGZvciBzdGQ6OnVuaXF1ZV9wdHI8SW1wbD4gZGVjbGFyYXRpb24KKyAgICB+QzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcigpOworCisgICAgLy8gc3VwcG9ydCBjb3B5IGNvbnN0cnVjdG9yL29wZXJhdG9yCisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcihjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyICYpOworICAgIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXImIG9wZXJhdG9yPShjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyICYpOworCisgICAgYm9vbCBzdXBwb3J0cyhUIHZhbHVlKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICAvLyB1c2UgcGltcGwgYXMgaW1wbGVtZW50YXRpb24gbWF5IGNoYW5nZSBpbiB0aGUgZnV0dXJlCisgICAgc3RydWN0IEltcGw7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltcGw+IF9tSW1wbDsKKworICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwgPFQ+KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4gJmkpOworICAgIC8vZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyICZpKTsKK307CisKKy8qKgorICogQnVpbGRlciBmb3Igc3VwcG9ydGVkIHZhbHVlcyBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKgorICogVGhpcyBidWlsZGVyIGNhbiBiZSB1c2VkIHRvIHN1Y2Nlc3NpdmVseSByZXN0cmljdCB0aGUgc3VwcG9ydGVkIHZhbHVlcyBmb3IgYSBmaWVsZC4gVXBvbgorICogY3JlYXRpb24sIHRoZXJlIGFyZSBubyBzdXBwb3J0ZWQgdmFsdWVzIHNwZWNpZmllZCAtIHdoaWNoIGZvciB0aGlzIGJ1aWxkZXIgbWVhbnMgdGhhdCBhbGwKKyAqIHZhbHVlcyBhcmUgc3VwcG9ydGVkLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlciB7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGJ1aWxkZXIgd2l0aCBubyBkZWZpbmVkIHZhbHVlcyAtIGJ1dCBpbXBsaWNpdGx5IGFueSB2YWx1ZSBhbGxvd2VkLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIoY29uc3QgQzJQYXJhbUZpZWxkICZmaWVsZCk7CisKKyAgICAvKioKKyAgICAgKiBHZXQgQzJQYXJhbUZpZWxkVmFsdWVzIGZyb20gdGhpcyBidWlsZGVyLgorICAgICAqLworICAgIG9wZXJhdG9yIEMyUGFyYW1GaWVsZFZhbHVlcygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogRGVmaW5lIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIGFzIHRoZSBjdXJyZW50bHkgc3VwcG9ydGVkIHZhbHVlcyBvZiB0aGlzIGJ1aWxkZXIuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmYW55KCk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBub25lLgorICAgICAqCisgICAgICogXG5vdGUgVGhpcyByZWFsbHkgc2hvdWxkIG5vdCBiZSB1c2VkIGZyb20gdGhlIGJ1aWxkZXIgYXMgYWxsIHBhcmFtcyBtdXN0IGhhdmUgc3VwcG9ydGVkCisgICAgICogICAgICAgdmFsdWVzLCBidXQgaXMgaGVyZSBpbiBjYXNlIHRoaXMgaXMgcmVhbGx5IHRoZSBjYXNlLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm5vbmUoKTsKKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHx2YWx1ZXwgYWxvbmUuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmZXF1YWxUbyhUIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBncmVhdGVyIHRoYW4gfHZhbHVlfC4KKyAgICAgKi8KKyAgICBpbmxpbmUgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmZ3JlYXRlclRoYW4oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpHcmVhdGVyVGhhbih2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gfHZhbHVlfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZncmVhdGVyVGhhbk9yRXF1YWxUbyhUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46OkdyZWF0ZXJUaGFuT3JFcXVhbFRvKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB8dmFsdWV8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm5vdExlc3NUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6Tm90TGVzc1RoYW4odmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHx2YWx1ZXwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbGVzc1RoYW5PckVxdWFsVG8oVCB2YWx1ZSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpMZXNzVGhhbk9yRXF1YWxUbyh2YWx1ZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gfHZhbHVlfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZub3RHcmVhdGVyVGhhbihUIHZhbHVlKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkUmFuZ2U8VD46Ok5vdEdyZWF0ZXJUaGFuKHZhbHVlKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGxlc3MgdGhhbiB8dmFsdWV8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmxlc3NUaGFuKFQgdmFsdWUpIHsKKyAgICAgICAgcmV0dXJuIGxpbWl0VG8oQzJTdXBwb3J0ZWRSYW5nZTxUPjo6TGVzc1RoYW4odmFsdWUpKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB2YWx1ZXMgaW4gdGhlIHJhbmdlIG9mIFsgfG1pbnwsIHxtYXh8IF0KKyAgICAgKiB3aXRoIG9wdGlvbmFsIHxzdGVwfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZpblJhbmdlKAorICAgICAgICAgICAgVCBtaW4sIFQgbWF4LCBUIHN0ZXAgPSBzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZSA/IFQoMCkgOiBUKDEpKSAgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpJblJhbmdlKG1pbiwgbWF4LCBzdGVwKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gdmFsdWVzIGluIHRoZSBnZW9tZXRyaWMgc2VyaWVzIHN0YXJ0aW5nCisgICAgICogZnJvbSB8bWlufCB3aXRoIGZhY3RvciB8bnVtfCAvIHxkZW5vbXwsIG5vdCBncmVhdGVyIHRoYW4gfG1heHwuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmaW5TZXJpZXMoVCBtaW4sIFQgbWF4LCBUIG51bSwgVCBkZW5vbSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpJblNlcmllcyhtaW4sIG1heCwgbnVtLCBkZW5vbSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBpbiB0aGUgbXVsdGlwbHktYWNjdW11bGF0ZSBzZXJpZXMKKyAgICAgKiBzdGFydGluZyBmcm9tIHxtaW58IHdpdGggZmFjdG9yIHxudW18IC8gfGRlbm9tfCBhbmQgfHN0ZXB8LCBub3QgZ3JlYXRlciB0aGFuIHxtYXh8LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmluTWFjU2VyaWVzKFQgbWluLCBUIG1heCwgVCBzdGVwLCBUIG51bSwgVCBkZW5vbSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFJhbmdlPFQ+OjpJbk1hY1NlcmllcyhtaW4sIG1heCwgc3RlcCwgbnVtLCBkZW5vbSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBpbiB8dmFsdWVzfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZvbmVPZihjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46Ok9uZU9mKHZhbHVlcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIHZhbHVlcyBpbiB8dmFsdWVzfC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZvbmVPZihjb25zdCBzdGQ6OnZlY3RvcjxUPiAmdmFsdWVzKSB7CisgICAgICAgIHJldHVybiBsaW1pdFRvKEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46Ok9uZU9mKHZhbHVlcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGZsYWdzIGluIHxmbGFnc3wgd2l0aCBhdCBsZWFzdCB8bWlufAorICAgICAqIHNldC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZmbGFncyhjb25zdCBzdGQ6OnZlY3RvcjxUPiAmZmxhZ3MsIFQgbWluID0gVCgwKSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZEZsYWdzPFQ+OjpGbGFncyhmbGFncywgbWluKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gZmxhZ3MgaW4gfHZhbHVlc3wgd2l0aCBhdCBsZWFzdCB8bWlufAorICAgICAqIHNldC4KKyAgICAgKi8KKyAgICBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZmbGFncyhjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gZmxhZ3MsIFQgbWluID0gVCgwKSkgeworICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZEZsYWdzPFQ+OjpGbGFncyhmbGFncywgbWluKSk7CisgICAgfQorCisgICAgdmlydHVhbCB+QzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcigpOworCisgICAgLy8gc3VwcG9ydCBjb3B5IGNvbnN0cnVjdG9yL29wZXJhdG9yCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcihjb25zdCBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyICYpOworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXImIG9wZXJhdG9yPShjb25zdCBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyICYpOworCitwcml2YXRlOgorICAgIC8qKgorICAgICAqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGEgdmFsdWUgc2V0LgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmbGltaXQpOworCisgICAgLyoqCisgICAgICogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gYSB2YWx1ZSBzZXQuCisgICAgICovCisgICAgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmbGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPFQ+ICZsaW1pdCk7CisKKyAgICAvKioKKyAgICAgKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byBhIHJhbmdlLgorICAgICAqLworICAgIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpOworCisgICAgc3RydWN0IEltcGw7CisgICAgc3RkOjp1bmlxdWVfcHRyPEltcGw+IF9tSW1wbDsKK307CisKKy8qKgorICogQnVpbGRlciBmb3IgYSBsaXN0IG9mIHNldHRpbmcgY29uZmxpY3RzLgorICovCitjbGFzcyBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyIHsKK3B1YmxpYzoKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGFuIGVtcHR5IGxpc3Qgb2Ygc2V0dGluZyBjb25mbGljdHMuCisgICAgICovCisgICAgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlcigpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGxpc3QgY29udGFpbmluZyBhIHNpbmdsZSBzZXR0aW5nIGNvbmZsaWN0LgorICAgICAqLworICAgIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIoQzJQYXJhbUZpZWxkVmFsdWVzICYmY29uZmxpY3QpOworCisgICAgLyoqCisgICAgICogQWRkcyBhIGNvbmZsaWN0IHRvIHRoZSBjdXJyZW50IGxpc3Qgb2YgY29uZmxpY3RzIGFuZCByZXR1cm5zIHRoaXMKKyAgICAgKi8KKyAgICBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyJiB3aXRoKEMyUGFyYW1GaWVsZFZhbHVlcyAmJmNvbmZsaWN0KTsKKworICAgIC8qKgorICAgICAqIEdldHMgdGhlIGN1cnJlbnQgbGlzdCBvZiBjb25mbGljdHMgKGFuZCBtb3ZlcyB0aGVtIG91dCBvZiB0aGlzIGJ1aWxkZXIuKQorICAgICAqICh0aGlzIGlzIHdoeSBpdCBpcyBub3QgY29uc3QpCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiByZXRyaWV2ZUNvbmZsaWN0cygpOworCisgICAgLyoqCisgICAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBjdXJyZW50IGxpc3QgaXMgZW1wdHkuCisgICAgICovCisgICAgaW5saW5lIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBfbUNvbmZsaWN0cy5lbXB0eSgpOyB9CisKKyAgICBpbmxpbmUgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGVtcHR5KCk7IH0KKworcHJpdmF0ZToKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+IF9tQ29uZmxpY3RzOworfTsKKworLyoqCisgKiBTZXR0aW5nIHJlc3VsdCBidWlsZGVyIGZvciBhIHBhcmFtZXRlci4KKyAqLworc3RydWN0IEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXIgeworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSByZWFkLW9ubHkgc2V0dGluZyByZXN1bHQgZmFpbHVyZS4KKyAgICAgKgorICAgICAqIFRoaXMgZG9lcyBub3QgdGFrZSBGU1YgYXMgb25seSB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgZmllbGQgaXMgc3VwcG9ydGVkLgorICAgICAqLworICAgIHN0YXRpYyBDMlNldHRpbmdSZXN1bHQgUmVhZE9ubHkoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGVzIGEgYmFkLXZhbHVlIG9yIGluZm9pbmZvcm1hdGlvbmFsIGJhZC12YWx1ZSBzZXR0aW5nIHJlc3VsdCBmYWlsdXJlLgorICAgICAqCisgICAgICogVGhpcyBkb2VzIG5vdCB0YWtlIEZTViBhcyB0aGUgdmFsdWUgaXMgb3V0c2lkZSBvZiB0aGUgcG9zc2libGUgdmFsdWVzLiBBcyBzdWNoLCB0aGVyZSBhcmUgbm8KKyAgICAgKiBjb25mbGljdHMgZm9yIHRoaXMgY2FzZSBlaXRoZXIuCisgICAgICovCisgICAgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdCBCYWRWYWx1ZShjb25zdCBDMlBhcmFtRmllbGQgJnBhcmFtRmllbGQsIGJvb2wgaXNJbmZvID0gZmFsc2UpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIGNvbmZsaWN0IChvciBpbmZvcm1hdGlvbmFsIGNvbmZsaWN0KSBzZXR0aW5nIHJlc3VsdCBmYWlsdXJlLgorICAgICAqCisgICAgICogVGhpcyB0YWtlcyBGU1Ygc28gdXNlIHBhcmFtRmllbGRWYWx1ZXMgYW5kIG9wdGlvbmFsIGNvbmZsaWN0cy4KKyAgICAgKi8KKyAgICBzdGF0aWMgQzJTZXR0aW5nUmVzdWx0IENvbmZsaWN0KAorICAgICAgICAgICAgQzJQYXJhbUZpZWxkVmFsdWVzICYmcGFyYW1GaWVsZFZhbHVlcywgQzJTZXR0aW5nQ29uZmxpY3RzQnVpbGRlciAmY29uZmxpY3RzLAorICAgICAgICAgICAgYm9vbCBpc0luZm8gPSBmYWxzZSk7CisKKyAgICAvLyBUT0RPOiByZXRyaWV2ZSByZXN1bHRzCisKKworcHJpdmF0ZToKKyAgICBDMlBhcmFtRmllbGQgX21QYXJhbUZpZWxkOworICAgIEMyU2V0dGluZ1Jlc3VsdCBfbVJlc3VsdDsKKworICAgIEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXIoY29uc3QgQzJTZXR0aW5nUmVzdWx0QnVpbGRlciAmKSA9IGRlbGV0ZTsKK307CisKKy8qKgorICogU2V0dGluZyByZXN1bHRzIChQTFVSQUwpIGJ1aWxkZXIuCisgKgorICogU2V0dGluZyByZXN1bHRzIGNvbnRhaW4gYSBmYWlsdXJlIHN0YXR1cyBhbG9uZyB3aXRoIGEgbGlzdCBvZiBmYWlsaW5nIGZpZWxkcyBvciBwYXJhbXMuCisgKi8KK3N0cnVjdCBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciB7CisgICAgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoY29uc3QgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXImKSA9IGRlbGV0ZTsKKyAgICBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMlNldHRpbmdSZXN1bHRzQnVpbGRlciYmKSA9IGRlZmF1bHQ7CisgICAgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgJm9wZXJhdG9yPShDMlNldHRpbmdSZXN1bHRzQnVpbGRlciYmKSA9IGRlZmF1bHQ7CisKKyAgICAvKiogXHJldHVybnMgKGRlZmF1bHQpIHN1Y2Nlc3NmdWwgcmVzdWx0IHdpdGggbm8gZGV0YWlscy4gKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIE9rKCkgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJfT0spOworICAgIH0KKworICAgIC8qKiBccmV0dXJucyBJbnRlcmZhY2UgaXMgaW4gYmFkIHN0YXRlLCB3aXRoIG5vIGZ1cnRoZXIgZGV0YWlscy4gKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIEJhZFN0YXRlKCkgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJfQkFEX1NUQVRFKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgSW50ZXJmYWNlIGNvbm5lY3Rpb24gdGltZWQgb3V0LCB3aXRoIG5vIGZ1cnRoZXIgZGV0YWlscy4gKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIFRpbWVkT3V0KCkgeworICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJfVElNRURfT1VUKTsKKyAgICB9CisKKyAgICAvKiogXHJldHVybnMgSW50ZXJmYWNlIGNvbm5lY3Rpb24gaXMgY29ycnVwdGVkLCB3aXRoIG5vIGZ1cnRoZXIgZGV0YWlscy4gKi8KKyAgICBpbmxpbmUgc3RhdGljIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyIENvcnJ1cHRlZCgpIHsKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyX0NPUlJVUFRFRCk7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBOb01lbW9yeShDMlBhcmFtOjpJbmRleCBpbmRleF8gX191bnVzZWQpIHsKKyAgICAgICAgLy8gVE9ETzogdHJ5IHRvIGFkZCBmYWlsdXJlIHJlc3VsdAorICAgICAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIoQzJfTk9fTUVNT1JZKTsKKyAgICB9CisKKyAgICAvLyBUT0RPOiB0aGlzIHNob3VsZCBub3QgYmUgYSBjb25zdHJ1Y3RvcgorICAgIC8qKiBDcmVhdGVzIGEgYnVpbGRlciB3aXRoIGEgc2luZ2xlIGJhZCB2YWx1ZSBzZXR0aW5nIHJlc3VsdC4gKi8KKyAgICBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihDMlNldHRpbmdSZXN1bHQgJiZyZXN1bHQpOworCisgICAgLyoqIENvbWJpbmVzIHRoaXMgcmVzdWx0cyB3aXRoIG90aGVyIHJlc3VsdHMuICovCisgICAgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgcGx1cyhDMlNldHRpbmdSZXN1bHRzQnVpbGRlciYmIHJlc3VsdHMpOworCisgICAgLyoqIFJldHJpZXZlIChnZXQgYW5kIG1vdmUgb3V0KSBmYWlsdXJlcyBhbmQgcmV0dXJuIHRoZSBmYWlsdXJlIHN0YXR1cy4gKi8KKyAgICBjMl9zdGF0dXNfdCByZXRyaWV2ZUZhaWx1cmVzKHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpOworCitwcml2YXRlOgorICAgIC8qKiBTZXR0aW5nIHJlc3VsdHMgYmFzZWQgb24gYSBzaW5nbGUgc3RhdHVzLiBUaGlzIGlzIHVzZWQgd2hlbiBhY3R1YWwgc2V0dGluZyBjb3VsZCBub3QgYmUKKyAgICAgKiAgYXR0ZW1wdGVkIHRvIGdldCBhIHNpbmdsZSBDMlNldHRpbmdSZXN1bHQsIG9yIHdoZW4gYSBzZXR0aW5nIHN1Y2NlZWRlZCB3aXRob3V0CisgICAgICogICdjb21wbGFpbnRzJy4gKi8KKyAgICBDMlNldHRpbmdSZXN1bHRzQnVpbGRlcihjMl9zdGF0dXNfdCBzdGF0dXMpOworICAgICAgICAvLyBzdGF0dXMgbXVzdCBiZSBvbmUgb2YgT0ssIEJBRF9TVEFURSwgVElNRURfT1VULCBDT1JSVVBURUQgb3IgTk9fTUVNT1JZCisgICAgICAgIC8vIG1haW5seTogQkxPQ0tJTkcsIEJBRF9JTkRFWCwgQkFEX1ZBTFVFIGFuZCBOT19NRU1PUlkgcmVxdWlyZXMgYSBzZXR0aW5nIGF0dGVtcHQsIGJ1dAorICAgICAgICAvLyBOT19NRU1PUlkgbWF5IG5vdCBhbGxvdyB1cyB0byBjcmVhdGUgYSByZXN1bHRzIHN0cnVjdHVyZS4KKworICAgIC8qKgorICAgICAqIE9uZSBvZiBPSywgQkFEX0lOREVYLCBCQURfVkFMVUUsIEJBRF9TVEFURSwgTk9fTUVNT1JZLCBUSU1FRF9PVVQsIEJMT0NLSU5HIG9yIENPUlJVUFRFRC4KKyAgICAgKi8KKyAgICBjMl9zdGF0dXNfdCBfbVN0YXR1cyBfX3VudXNlZDsKKworICAgIC8qKgorICAgICAqIFZlY3RvciBvZiBpbmRpdmlkdWFsIHNldHRpbmcgcmVzdWx0IGRldGFpbHMuCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IF9tUmVzdWx0czsKK307CisKKy8qKgorICogVXRpbGl0eSBjbGFzcyB0byBlbnVtZXJhdGUgZmllbGRzIG9mIHBhcmFtZXRlcnMuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHMgeworICAgIHN0cnVjdCBfSW5zcGVjdG9yOworCisgICAgLyoqCisgICAgICogQW4gZXh0ZW5kZWQgZmllbGQgZGVzY3JpcHRvciBvYmplY3Qgd2l0aCBzdHJ1Y3R1cmFsIGluZm9ybWF0aW9uIChsaW5lYWdlIGJhY2sgdG8gdGhlIHJvb3Qgb2YKKyAgICAgKiB0aGUgcGFyYW0pLgorICAgICAqLworICAgIHN0cnVjdCBJbmZvIHsKKyAgICAgICAgdHlwZWRlZiBDMkZpZWxkRGVzY3JpcHRvcjo6dHlwZV90IHR5cGVfdDsgLy8vPCBmaWVsZCB0eXBlCisgICAgICAgIHR5cGVkZWYgQzJGaWVsZERlc2NyaXB0b3I6Ok5hbWVkVmFsdWVzVHlwZSBOYW1lZFZhbHVlc1R5cGU7IC8vLzwgbmFtZWQgdmFsdWVzIGxpc3QgdHlwZQorCisgICAgICAgIC8vLyByZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBmaWVsZAorICAgICAgICBDMlN0cmluZyBuYW1lKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIHR5cGUgb2YgdGhpcyBmaWVsZAorICAgICAgICB0eXBlX3QgdHlwZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBkZWZpbmVkIG5hbWUtdmFsdWUgcGFpcmluZ3MgZm9yIHRoaXMgZmllbGQuIFRoZSByZXR1cm5lZCByZWZlcmVuY2UgaXMKKyAgICAgICAgICogb25seSB2YWxpZCBkdXJpbmcgdGhlIHZhbGlkaXR5IG9mIHRoaXMgb2JqZWN0CisgICAgICAgICAqLworICAgICAgICBjb25zdCBOYW1lZFZhbHVlc1R5cGUgJm5hbWVkVmFsdWVzKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSBpbmRleCBvZiB0aGlzIGZpZWxkLiBFLmcuIHBhcmFtLmZpZWxkIG9yIHBhcmFtLmZpZWxkWzBdIGhhcyBhbiBpbmRleCBvZiAwLCBhbmQKKyAgICAgICAgICogcGFyYW0uc3RydWN0WzJdLmZpZWxkWzNdIGhhcyBhbiBpbmRleCBvZiAzLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IGluZGV4KCkgY29uc3Q7CisKKyAgICAgICAgLy8vIHJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGUgZmllbGQgaW4gY2FzZSBpdCBpcyBhbiBhcnJheS4gUmV0dXJucyAwIGZvcgorICAgICAgICAvLy8gVFtdIGFycmF5cyBpZiB0aGlzIGluZm8gY29tZXMgZnJvbSBhIEMyUGFyYW06OkluZGV4IG9iamVjdCwgYW5kIHRoZSBjdXJyZW50bHkgdXNlZAorICAgICAgICAvLy8gZXh0ZW50IGlmIGl0IGNvbWVzIGZyb20gYSBDMlBhcmFtIG9iamVjdC4gUmV0dXJucyAxIGZvciBUWzFdIGFycmF5cyBhcyB3ZWxsIGFzIGlmIHRoZQorICAgICAgICAvLy8gZmllbGQgaXMgbm90IGFuIGFycmF5LgorICAgICAgICBzaXplX3QgZXh0ZW50KCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFRoZSAoc3RydWN0dXJhbCkgZGVwdGggb2YgdGhpcyBmaWVsZC4gRS5nLiBwYXJhbS5maWVsZCBvciBwYXJhbS5maWVsZFswXSBoYXMgYSBkZXB0aCBvZgorICAgICAgICAgKiAgMCwgYW5kIHBhcmFtLnN0cnVjdC5maWVsZCBvciBwYXJhbS5zdHJ1Y3RbMF0uZmllbGRbMF0gaGFzIGEgZGVwdGggb2YgMS4KKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBkZXB0aCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhpcyBmaWVsZCBpbiB0aGUgcGFyYW1ldGVyIGluIGJ5dGVzLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IG9mZnNldCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBzaXplIG9mIHRoaXMgZmllbGQgaW4gYnl0ZXMuCisgICAgICAgICAqLworICAgICAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGUgb2Zmc2V0IG9mIHRoaXMgZmllbGQncyBhcnJheS4gRS5nLiBmb3IgcGFyYW0uc3RydWN0WzJdLmZpZWxkWzNdIHRoaXMgaXMgdGhlIG9mZnNldAorICAgICAgICAgKiBvZiBpdHMgc21hbGxlc3Qgc2libGluZzogcGFyYW0uc3RydWN0WzJdLmZpZWxkWzBdLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IGFycmF5T2Zmc2V0KCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHNpemUgb2YgdGhpcyBmaWVsZCdzIGFycmF5LiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gZXh0ZW50KCkgKiBzaXplKCkKKyAgICAgICAgICovCisgICAgICAgIHNpemVfdCBhcnJheVNpemUoKSBjb25zdDsKKworICAgICAgICAvKioKKyAgICAgICAgICogVGhlIG9mZnNldCBvZiB0aGUgYmFzZSBmaWVsZC4gVGhlIGJhc2UgZmllbGQgaXMgYSBjb3VzaW4gb2YgdGhlIGN1cnJlbnQgZmllbGQgd2hlcmUKKyAgICAgICAgICogYWxsIGluZGljZXMgYXJlIDAuIEUuZy4gdGhlIHRoZSBiYXNlIGZpZWxkIGZvciBwYXJhbS5zdHJ1Y3RbMl0uZmllbGRbM10gaXMKKyAgICAgICAgICogcGFyYW0uc3RydWN0WzBdLmZpZWxkWzBdLiBCYXNlIGZpZWxkcyBhcmUgdXNlZCB0byBzcGVjaWZ5IHN1cHBvcnRlZCB2YWx1ZXMgZm9yCisgICAgICAgICAqIGFsbCBjb3VzaW4gZmllbGRzLgorICAgICAgICAgKi8KKyAgICAgICAgc2l6ZV90IGJhc2VGaWVsZE9mZnNldCgpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmaWVsZCBpcyBhbiBhcml0aG1ldGljIChpbnRlZ3JhbCwgY291bnRlciBvciBmbG9hdCkgZmllbGQuCisgICAgICAgICAqLworICAgICAgICBib29sIGlzQXJpdGhtZXRpYygpIGNvbnN0OworCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmaWVsZCBjYW4gaGF2ZSBhIGZsZXhpYmxlIGV4dGVudC4gZXh0ZW50KCkgcmV0dXJucyB0aGUgY3VycmVudAorICAgICAgICAgKiBleHRlbnQuCisgICAgICAgICAqLworICAgICAgICBib29sIGlzRmxleGlibGUoKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyB3aGV0aGVyIHRoaXMgaW5mbyBpcyB2YWxpZAorICAgICAgICBpbmxpbmUgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gX21JbXBsICE9IG51bGxwdHI7IH0KKworICAgICAgICAvLy8gcmV0dXJucyB0aGUgaW5mbyBmb3IgdGhlIHBhcmVudCBvZiB0aGlzIGZpZWxkLCBvciBhbiBpbnZhbGlkIEluZm8gb2JqZWN0IGlmIGl0IGhhcyBubworICAgICAgICAvLy8gcGFyZW50cworICAgICAgICBJbmZvIHBhcmVudCgpIGNvbnN0OworCisgICAgICAgIC8vLyByZXR1cm5zIHdoZXRoZXIgdGhpcyBpbmZvIGlzIHZhbGlkCisgICAgICAgIGlubGluZSBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gaXNWYWxpZCgpOyB9CisKKyAgICAgICAgc3RydWN0IEltcGw7CisgICAgICAgIEluZm8oc3RkOjpzaGFyZWRfcHRyPEltcGw+KTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBfbUltcGw7CisgICAgICAgIGZyaWVuZCBzdHJ1Y3QgX0luc3BlY3RvcjsKKyAgICB9OworCisgICAgLyoqCisgICAgICogQW4gKGlucHV0KSBpdGVyYXRvciBvYmplY3Qgb3ZlciBmaWVsZHMgdXNpbmcgSW5mbyBvYmplY3RzLgorICAgICAqLworICAgIHN0cnVjdCBJdGVyYXRvciB7CisgICAgICAgIHR5cGVkZWYgSW5mbyBjb25zdCB2YWx1ZV90eXBlOworICAgICAgICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CisgICAgICAgIHR5cGVkZWYgSW5mbyBjb25zdCAqIHBvaW50ZXI7CisgICAgICAgIHR5cGVkZWYgSW5mbyBjb25zdCByZWZlcmVuY2U7CisgICAgICAgIHR5cGVkZWYgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcgaXRlcmF0b3JfY2F0ZWdvcnk7CisKKyAgICAgICAgLy8vIHJldHVybiBJbmZvIGF0IGN1cnJlbnQgcG9zaXRpb24KKyAgICAgICAgdmlydHVhbCByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3Q7CisKKyAgICAgICAgLy8vIG1vdmUgdG8gdGhlIG5leHQgZmllbGQKKyAgICAgICAgdmlydHVhbCBJdGVyYXRvciYgb3BlcmF0b3IrKygpOworCisgICAgICAgIHZpcnR1YWwgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEl0ZXJhdG9yICYpIGNvbnN0OworICAgICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEl0ZXJhdG9yICZvdGhlcikgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0ob3RoZXIpOyB9CisKKyAgICAgICAgdmlydHVhbCB+SXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICAgICAgc3RydWN0IEltcGw7CisgICAgICAgIEl0ZXJhdG9yKHN0ZDo6c2hhcmVkX3B0cjxJbXBsPik7CisKKyAgICBwcm90ZWN0ZWQ6CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKKyAgICB9OworCisgICAgLyoqCisgICAgICogQW4gKGlucHV0KSBpdGVyYWJsZSBvYmplY3QgcmVwcmVzZW50aW5nIGEgbGlzdCBvZiBmaWVsZHMuCisgICAgICovCisgICAgc3RydWN0IExpc3QgeworICAgICAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CisgICAgICAgIHZpcnR1YWwgSXRlcmF0b3IgYmVnaW4oKSBjb25zdDsKKworICAgICAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0CisgICAgICAgIHZpcnR1YWwgSXRlcmF0b3IgZW5kKCkgY29uc3Q7CisKKyAgICAgICAgdmlydHVhbCB+TGlzdCgpID0gZGVmYXVsdDsKKworICAgICAgICBzdHJ1Y3QgSW1wbDsKKyAgICAgICAgTGlzdChzdGQ6OnNoYXJlZF9wdHI8SW1wbD4pOworCisgICAgcHJvdGVjdGVkOgorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gbUltcGw7CisgICAgfTsKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgYWxsIChiYXNlKSBmaWVsZHMgYXQgaW5kZXggMCBvZiB0aGUgcGFyYW1ldGVyLiBUaGUgb3JkZXIgb2YgaXRlcmF0aW9uIGlzIHRoZQorICAgICAqIGZvbGxvd2luZzoKKyAgICAgKiAgIEZpZWxkcyBvZiBhIHN0cnVjdHVyZSBhcmUgZW51bWVyYXRlZCBpbiBmaWVsZCBvcmRlci4gSG93ZXZlciwgc3ViLWZpZWxkcyBvZiBhIHN0cnVjdHVyZQorICAgICAqICAgYXJlIGVudW1lcmF0ZWQgZGlyZWN0bHkgYWZ0ZXIgdGhlIHN0cnVjdHVyZSBmaWVsZCwgYW5kIHByaW9yIHRvIHNpYmxpbmcgZmllbGRzLgorICAgICAqCisgICAgICogSW4gZXNzZW5jZSB0aGUgb3JkZXIgb2YgZW51bWVyYXRpb24gaXMgZmlyc3QgYnkgaW5jcmVhc2luZyBvZmZzZXQsIHRoZW4gYnkgZGVjcmVhc2luZyBzaXplLgorICAgICAqCisgICAgICogXHBhcmFtIHBhcmFtIHBhcmFtZXRlciB0byBlbnVtZXJhdGUgaXRzIGZpZWxkcworICAgICAqIFxwYXJhbSByZWZsZWN0b3IgcGFyYW1ldGVyIHJlZmxlY3RvciB1c2VkIGZvciBlbnVtZXJhdGlvbgorICAgICAqCisgICAgICogXHJldHVybiBhbiBpdGVyYWJsZSBvYmplY3QKKyAgICAgKi8KKyAgICBzdGF0aWMgTGlzdCBlbnVtZXJhdGVGaWVsZHMoCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKTsKKworICAgIC8qKgorICAgICAqIEVudW1lcmF0ZXMgYWxsIGNvdXNpbiBmaWVsZHMgdXAgdG8gZGVwdGggLSBsZXZlbCBmb3IgYSBmaWVsZC4gSWYgbGV2ZWwgaXMgMCwgaXQgZW51bWVyYXRlcworICAgICAqIG9ubHkgdGhlIGZpZWxkLiBGb3IgbGV2ZWwgMSwgaXQgZW51bWVyYXRlcyBhbGwgZmllbGRzIGluIGl0cyBjdXJyZW50IGFycmF5ICh3aGljaCBtYXkgYmUKKyAgICAgKiBpdHNlbGYgaWYgZXh0ZW50IGlzIDEpLiBUaGUgb3JkZXIgb2YgaXRlcmF0aW9uIGlzIGJ5IGluY3JlYXNpbmcgZmllbGQgb2Zmc2V0LgorICAgICAqLworICAgIHN0YXRpYyBMaXN0IGVudW1lcmF0ZUNvdXNpbnMoCisgICAgICAgICAgICBjb25zdCBJbmZvICZmaWVsZCwKKyAgICAgICAgICAgIHVpbnQzMl90IGxldmVsID0gfjApOworCisgICAgLyoqCisgICAgICogTG9jYXRlcyB0aGUgZmllbGQgaW4gYSBwYXJhbWV0ZXIgYW5kIHJldHVybnMgYSBsaXN0IG9mIDIgZWxlbWVudHMgLSB0aGUgbW9zdC1zcGVjaWZpYyBmaWVsZAorICAgICAqIGFycmF5IG9mIHRoZSBwYXJhbWV0ZXIgdGhhdCBjb250YWlucyB0aGUgZW50aXJlIGZpZWxkLiBJZiB0aGUgZmllbGQgaXMgbm90IGEgdmFsaWQgZmllbGQKKyAgICAgKiBzcGVjaWZpZXIgZm9yIHRoaXMgcGFyYW1ldGVyIChlLmcuIGl0IGlzIG91dHNpZGUgdGhlIGJvdW5kcyBvZiB0aGUgcGFyYW1ldGVyKSwgaXQgcmV0dXJucworICAgICAqIGFuIGVtcHR5IGxpc3QuCisgICAgICovCisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPEluZm8+IGxvY2F0ZUZpZWxkKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbSAmcGFyYW0sIGNvbnN0IF9DMkZpZWxkSWQgJmZpZWxkLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpOworCisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPEluZm8+IGxvY2F0ZUZpZWxkKAorICAgICAgICAgICAgY29uc3QgQzJQYXJhbUZpZWxkICZwZiwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpOworCit9OworCisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWludGVyZmFjZS5oPgorCisjZW5kaWYgIC8vIEMyVVRJTFNfSU5URVJGQUNFX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJQYXJhbVV0aWxzLmggYi9tZWRpYS9jb2RlYzIvdm5kay9pbmNsdWRlL3V0aWwvQzJQYXJhbVV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjUxYmQ5NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2luY2x1ZGUvdXRpbC9DMlBhcmFtVXRpbHMuaApAQCAtMCwwICsxLDQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBDMlVUSUxTX1BBUkFNX1VUSUxTX0hfCisjZGVmaW5lIEMyVVRJTFNfUEFSQU1fVVRJTFNfSF8KKworI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvKiogXGZpbGUKKyAqIFV0aWxpdGllcyBmb3IgcGFyYW1ldGVyIGhhbmRsaW5nIHRvIGJlIHVzZWQgYnkgQ29kZWMyIGltcGxlbWVudGF0aW9ucy4KKyAqLworCisvLy8gXGNvbmQgSU5URVJOQUwKKworc3RydWN0IEMyUGFyYW07CisKK2NsYXNzIEMyUGFyYW1VdGlscyB7CisgICAgZnJpZW5kIGNsYXNzIEMyVXRpbFRlc3RfUGFyYW1VdGlsc1Rlc3RfVGVzdDsKKworcHVibGljOgorCisgICAgLy8vIHNhZmUocikgcGFyc2luZyBmcm9tIHBhcmFtZXRlciBibG9iCisgICAgc3RhdGljCisgICAgQzJQYXJhbSAqUGFyc2VGaXJzdChjb25zdCB1aW50OF90ICpibG9iLCBzaXplX3Qgc2l6ZSk7Cit9OworCisvLy8gXGVuZGNvbmQKKworI2VuZGlmICAvLyBDMlVUSUxTX1BBUkFNX1VUSUxTX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyQmxvY2tJbnRlcm5hbC5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJCbG9ja0ludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFlOTQ2YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyQmxvY2tJbnRlcm5hbC5oCkBAIC0wLDAgKzEsMzgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NUQUdFRlJJR0hUX0MyQkxPQ0tfSU5URVJOQUxfSF8KKyNkZWZpbmUgQU5EUk9JRF9TVEFHRUZSSUdIVF9DMkJMT0NLX0lOVEVSTkFMX0hfCisKKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzIuMC9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisKKyNpbmNsdWRlIDxDMkJ1ZmZlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgaGFyZHdhcmUgeworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBidWZmZXJwb29sIHsKKworc3RydWN0IEJ1ZmZlclBvb2xEYXRhOworCit9Cit9Cit9Cit9CisKKy8qKgorICogU3RvcmVzIGluZm9ybWF0aW9ucyBmcm9tIEMyQmxvY2tQb29sIGltcGxlbWVudGF0aW9ucyB3aGljaCBhcmUgcmVxdWlyZWQgYnkgQzJCbG9jay4KKyAqLworc3RydWN0IEMyX0hJREUgX0MyQmxvY2tQb29sRGF0YSB7CisgICAgZW51bSB0eXBlX3QgOiBpbnQgeworICAgICAgICBUWVBFX0JVRkZFUlBPT0wgPSAwLAorICAgICAgICBUWVBFX0JVRkZFUlFVRVVFLAorICAgIH07CisKKyAgICB2aXJ0dWFsIHR5cGVfdCBnZXRUeXBlKCkgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgX0MyQmxvY2tQb29sRGF0YSgpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgfl9DMkJsb2NrUG9vbERhdGEoKSA9IGRlZmF1bHQ7Cit9OworCitzdHJ1Y3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE7CisKKy8qKgorICogSW50ZXJuYWwgb25seSBpbnRlcmZhY2UgZm9yIGNyZWF0aW5nIGJsb2NrcyBieSBibG9jayBwb29sL2J1ZmZlciBwYXNzaW5nIGltcGxlbWVudGF0aW9ucy4KKyAqCisgKiBcdG9kbyB0aGlzIG11c3QgYmUgaGlkZGVuCisgKi8KK3N0cnVjdCBfQzJCbG9ja0ZhY3RvcnkgeworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGxpbmVhciBibG9jayBmcm9tIGFuIGFsbG9jYXRpb24gZm9yIGFuIGFsbG90dGVkIHJhbmdlLgorICAgICAqCisgICAgICogXHBhcmFtIGFsbG9jIHBhcmVudCBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGRhdGEgIGJsb2NrcG9vbCBkYXRhCisgICAgICogXHBhcmFtIG9mZnNldCBhbGxvdHRlZCByYW5nZSBvZmZzZXQKKyAgICAgKiBccGFyYW0gc2l6ZSAgYWxsb3R0ZWQgc2l6ZQorICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgbGluZWFyIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IENyZWF0ZUxpbmVhckJsb2NrKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+ICZkYXRhID0gbnVsbHB0ciwKKyAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwLAorICAgICAgICAgICAgc2l6ZV90IHNpemUgPSB+KHNpemVfdCkwKTsKKworICAgIC8qKgorICAgICAqIENyZWF0ZSBhIGdyYXBoaWMgYmxvY2sgZnJvbSBhbiBhbGxvY2F0aW9uIGZvciBhbiBhbGxvdHRlZCBzZWN0aW9uLgorICAgICAqCisgICAgICogXHBhcmFtIGFsbG9jIHBhcmVudCBhbGxvY2F0aW9uCisgICAgICogXHBhcmFtIGRhdGEgIGJsb2NrcG9vbCBkYXRhCisgICAgICogXHBhcmFtIGNyb3AgIGFsbG90dGVkIGNyb3AgcmVnaW9uCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBncmFwaGljIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gJmFsbG9jLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+ICZkYXRhID0gbnVsbHB0ciwKKyAgICAgICAgICAgIGNvbnN0IEMyUmVjdCAmYWxsb3R0ZWRDcm9wID0gQzJSZWN0KH4wdSwgfjB1KSk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBibG9jayBwb29sIGRhdGEgZnJvbSAxRCBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaGFyZWQgcG9pbnRlciB0byB0aGUgMUQgYmxvY2sgd2hpY2ggaXMgYWxyZWFkeSBjcmVhdGVkLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBHZXRMaW5lYXJCbG9ja1Bvb2xEYXRhKAorICAgICAgICAgICAgY29uc3QgQzJCbG9jazFEJiBibG9jayk7CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm4gYSBibG9jayBwb29sIGRhdGEgZnJvbSAyRCBibG9jay4KKyAgICAgKgorICAgICAqIFxwYXJhbSBzaGFyZWQgcG9pbnRlciB0byB0aGUgMkQgYmxvY2sgd2hpY2ggaXMgYWxyZWFkeSBjcmVhdGVkLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiBHZXRHcmFwaGljQmxvY2tQb29sRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IEMyQmxvY2syRCYgYmxvY2spOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgbGluZWFyIGJsb2NrIGZyb20gdGhlIHJlY2VpdmVkIG5hdGl2ZSBoYW5kbGUuCisgICAgICoKKyAgICAgKiBccGFyYW0gaGFuZGxlICAgIG5hdGl2ZSBoYW5kbGUgdG8gYSBsaW5lYXIgYmxvY2sKKyAgICAgKgorICAgICAqIFxyZXR1cm4gc2hhcmVkIHBvaW50ZXIgdG8gdGhlIGxpbmVhciBibG9jay4gbnVsbHB0ciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8KKyAgICAgKiAgICAgICAgIGNyZWF0ZSB0aGlzIGJsb2NrLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiBDcmVhdGVMaW5lYXJCbG9jaygKKyAgICAgICAgICAgIGNvbnN0IEMySGFuZGxlICpoYW5kbGUpOworCisgICAgLyoqCisgICAgICogQ3JlYXRlIGEgZ3JhcGhpYyBibG9jayBmcm9tIHRoZSByZWNlaXZlZCBuYXRpdmUgaGFuZGxlLgorICAgICAqCisgICAgICogXHBhcmFtIGhhbmRsZSAgICBuYXRpdmUgaGFuZGxlIHRvIGEgZ3JhcGhpYyBibG9jaworICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgZ3JhcGhpYyBibG9jay4gbnVsbHB0ciBpZiB0aGVyZSB3YXMgbm90IGVub3VnaCBtZW1vcnkgdG8KKyAgICAgKiAgICAgICAgIGNyZWF0ZSB0aGlzIGJsb2NrLgorICAgICAqLworICAgIHN0YXRpYworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gQ3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBsaW5lYXIgYmxvY2sgZnJvbSB0aGUgcmVjZWl2ZWQgYnVmZmVycG9vbCBkYXRhLgorICAgICAqCisgICAgICogXHBhcmFtIGRhdGEgIGJ1ZmZlcnBvb2wgZGF0YSB0byBhIGxpbmVhciBibG9jaworICAgICAqCisgICAgICogXHJldHVybiBzaGFyZWQgcG9pbnRlciB0byB0aGUgbGluZWFyIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IENyZWF0ZUxpbmVhckJsb2NrKAorICAgICAgICAgICAgY29uc3QgQzJIYW5kbGUgKmhhbmRsZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OmJ1ZmZlcnBvb2w6OkJ1ZmZlclBvb2xEYXRhPiAmZGF0YSk7CisKKyAgICAvKioKKyAgICAgKiBDcmVhdGUgYSBncmFwaGljIGJsb2NrIGZyb20gdGhlIHJlY2VpdmVkIGJ1ZmZlcnBvb2wgZGF0YS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBkYXRhICBidWZmZXJwb29sIGRhdGEgdG8gYSBncmFwaGljIGJsb2NrCisgICAgICoKKyAgICAgKiBccmV0dXJuIHNoYXJlZCBwb2ludGVyIHRvIHRoZSBncmFwaGljIGJsb2NrLiBudWxscHRyIGlmIHRoZXJlIHdhcyBub3QgZW5vdWdoIG1lbW9yeSB0bworICAgICAqICAgICAgICAgY3JlYXRlIHRoaXMgYmxvY2suCisgICAgICovCisgICAgc3RhdGljCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiBDcmVhdGVHcmFwaGljQmxvY2soCisgICAgICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6YnVmZmVycG9vbDo6QnVmZmVyUG9vbERhdGE+ICZkYXRhKTsKKworICAgIC8qKgorICAgICAqIEdldCBidWZmZXJwb29sIGRhdGEgZnJvbSB0aGUgYmxvY2twb29sIGRhdGEuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbERhdGEgICAgICAgICAgYmxvY2twb29sIGRhdGEKKyAgICAgKiBccGFyYW0gYnVmZmVyUG9vbERhdGEgICAgcG9pbnRlciB0byBidWZmZXJwb29sIGRhdGEgd2hlcmUgdGhlIGJ1ZmZlcnBvb2wKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSBpcyBzdG9yZWQuCisgICAgICoKKyAgICAgKiBccmV0dXJuIHtcY29kZSB0cnVlfSB3aGVuIHRoZXJlIGlzIHZhbGlkIGJ1ZmZlcnBvb2wgZGF0YSwge1xjb2RlIGZhbHNlfSBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBHZXRCdWZmZXJQb29sRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBfQzJCbG9ja1Bvb2xEYXRhPiAmcG9vbERhdGEsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpidWZmZXJwb29sOjpCdWZmZXJQb29sRGF0YT4gKmJ1ZmZlclBvb2xEYXRhKTsKKworICAgIC8qCisgICAgICogTGlmZSBDeWNsZSBNYW5hZ2VtZW50IG9mIEJ1ZmZlclF1ZXVlLUJhc2VkIEJsb2NrcworICAgICAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICAgKgorICAgICAqIEEgYmxvY2sgdGhhdCBpcyBjcmVhdGVkIGJ5IGEgYnVmZmVycXVldWUtYmFzZWQgYmxvY2twb29sIHJlcXVpcmVzIHNvbWUKKyAgICAgKiBzcGVjaWFsIHRyZWF0bWVudCB3aGVuIGl0IGlzIGRlc3Ryb3llZC4gSW4gcGFydGljdWxhciwgaWYgdGhlIGJsb2NrCisgICAgICogY29ycmVzcG9uZHMgdG8gYSBoZWxkIChkZXF1ZXVlZC9hdHRhY2hlZCkgR3JhcGhpY0J1ZmZlciBpbiBhIHNsb3Qgb2YgYQorICAgICAqIGJ1ZmZlcnF1ZXVlLCBpdHMgZGVzdHJ1Y3Rpb24gc2hvdWxkIHRyaWdnZXIgYSBjYWxsIHRvCisgICAgICogSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Y2FuY2VsQnVmZmVyKCkuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGUKKyAgICAgKiBHcmFwaGljQnVmZmVyIGlzIG5vdCBoZWxkLCBpLmUuLCBpZiBpdCBoYXMgYmVlbiBxdWV1ZWQgb3IgZGV0YWNoZWQsCisgICAgICogY2FuY2VsQnVmZmVyKCkgc2hvdWxkIG5vdCBiZSBjYWxsZWQgdXBvbiB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhlIGJsb2NrLgorICAgICAqCisgICAgICogX0MyQmxvY2tQb29sRGF0YSBjcmVhdGVkIGJ5IGEgYnVmZmVycXVldWUtYmFzZWQgYmxvY2twb29sIGluY2x1ZGVzIHR3bworICAgICAqIG1haW4gcGllY2VzIG9mIGluZm9ybWF0aW9uOgorICAgICAqICAgLSAiaGVsZCIgc3RhdHVzOiBXaGV0aGVyIGNhbmNlbEJ1ZmZlcigpIHNob3VsZCBiZSBjYWxsZWQgdXBvbgorICAgICAqICAgICBkZXN0cnVjdGlvbiBvZiB0aGUgYmxvY2suCisgICAgICogICAtIGJ1ZmZlcnF1ZXVlIGFzc2lnbm1lbnQ6IFRoZSBxdWFkcnVwbGUgKGlnYnAsIGdlbmVyYXRpb24sIGJxSWQsCisgICAgICogICAgIGJxU2xvdCksIHdoZXJlIGlnYnAgaXMgdGhlIElHcmFwaGljQnVmZmVyUHJvZHVjZXIgaW5zdGFuY2Ugb2YgdGhlCisgICAgICogICAgIGJ1ZmZlcnF1ZXVlLCBnZW5lcmF0aW9uIGlzIHRoZSBsYXRlc3QgZ2VuZXJhdGlvbiBudW1iZXIsIG9mIHRoZQorICAgICAqICAgICBidWZmZXJxdWV1ZSwgYnFJZCBpcyB0aGUgZ2xvYmFsbHkgdW5pcXVlIGlkIG9mIHRoZSBidWZmZXJxdWV1ZSwgYW5kCisgICAgICogICAgIGJxU2xvdCBpcyB0aGUgc2xvdCBpbiB0aGUgYnVmZmVycXVldWUuCisgICAgICoKKyAgICAgKiBpZ2JwIGlzIHRoZSBpbnN0YW5jZSBvZiBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIG9uIHdoaWNoIGNhbmNlbEJ1ZmZlcigpCisgICAgICogd2lsbCBiZSBjYWxsZWQgaWYgImhlbGQiIHN0YXR1cyBpcyB0cnVlIHdoZW4gdGhlIGJsb2NrIGlzIGRlc3Ryb3llZC4KKyAgICAgKiAoYnFTbG90IGlzIGFuIGlucHV0IHRvIGNhbmNlbEJ1ZmZlcigpLikgSG93ZXZlciwgb25seSBnZW5lcmF0aW9uLCBicUlkCisgICAgICogYW5kIGJxU2xvdCBhcmUgcmV0YWluZWQgd2hlbiBhIGJsb2NrIGlzIHRyYW5zZmVycmVkIGZyb20gb25lIHByb2Nlc3MgdG8KKyAgICAgKiBhbm90aGVyLiBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgYm90aCB0aGUgc2VuZGluZyBhbmQgcmVjZWl2aW5nCisgICAgICogcHJvY2Vzc2VzIHRvIG1haW50YWluIGNvbnNpc3RlbmN5IG9mICJoZWxkIiBzdGF0dXMgYW5kIGlnYnAuIEJlbG93IGFyZQorICAgICAqIGZ1bmN0aW9ucyBwcm92aWRlZCBmb3IgdGhpcyBwdXJwb3NlOgorICAgICAqCisgICAgICogICAtIEdldEJ1ZmZlclF1ZXVlRGF0YSgpOiBSZXR1cm5zIGdlbmVyYXRpb24sIGJxSWQgYW5kIGJxU2xvdC4KKyAgICAgKiAgIC0gSG9sZEJsb2NrRnJvbUJ1ZmZlclF1ZXVlKCk6IFNldHMgImhlbGQiIHN0YXR1cyB0byB0cnVlLgorICAgICAqICAgLSBCZWdpblRyYW5zZmVyQmxvY2tUb0NsaWVudCgpL0VuZFRyYW5zZmVyQmxvY2tUb0NsaWVudCgpOgorICAgICAqICAgICBDbGVhciAiaGVsZCIgc3RhdHVzIHRvIGZhbHNlIGlmIHRyYW5zZmVyIHdhcyBzdWNjZXNzZnVsLAorICAgICAqICAgICBvdGhlcndpc2UgImhlbGQiIHN0YXR1cyByZW1haW5zIHRydWUuCisgICAgICogICAtIEJlZ2luQXR0YWNoQmxvY2tUb0J1ZmZlclF1ZXVlKCkvRW5kQXR0YWNoQmxvY2tUb0J1ZmZlclF1ZXVlKCk6CisgICAgICogICAgIFRoZSB3aWxsIGtlZXAgImhlbGQiIHN0YXR1cyB0cnVlIGlmIGF0dGFjaCB3YXMgZWxpZ2libGUuCisgICAgICogICAgIE90aGVyd2lzZSwgImhlbGQiIHN0YXR1cyBpcyBjbGVhcmVkIHRvIGZhbHNlLiBJbiB0aGF0IGNhc2UsCisgICAgICogICAgIG93bmVyc2hpcCBvZiBidWZmZXIgc2hvdWxkIGJlIHRyYW5zZmVycmVkIHRvIGJ1ZmZlcnF1ZXVlLgorICAgICAqICAgLSBEaXNwbGF5QmxvY2tUb0J1ZmZlclF1ZXVlKCkKKyAgICAgKiAgICAgVGhpcyB3aWxsIGNsZWFyICJoZWxkIiBzdGF0dXMgdG8gZmFsc2UuCisgICAgICoKKyAgICAgKiBBbGwgdGhlc2UgZnVuY3Rpb25zIG9wZXJhdGUgb24gX0MyQmxvY2tQb29sRGF0YSwgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGJ5CisgICAgICogY2FsbGluZyBHZXRHcmFwaGljQmxvY2tQb29sRGF0YSgpLgorICAgICAqCisgICAgICogTWFpbnRhaW5pbmcgQ29uc2lzdGVuY3kgd2l0aCBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIE9wZXJhdGlvbnMKKyAgICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorICAgICAqCisgICAgICogZGVxdWV1ZUJ1ZmZlcigpCisgICAgICogICAtIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGJ5IHRoZSBibG9ja3Bvb2wuIEl0IHNob3VsZCBub3QgYmUgY2FsbGVkCisgICAgICogICAgIG1hbnVhbGx5LiBUaGUgYmxvY2twb29sIHdpbGwgYXV0b21hdGljYWxseSBnZW5lcmF0ZSB0aGUgY29ycmVjdAorICAgICAqICAgICBpbmZvcm1hdGlvbiBmb3IgX0MyQmxvY2tQb29sRGF0YSwgd2l0aCAiaGVsZCIgc3RhdHVzIHNldCB0byB0cnVlLgorICAgICAqCisgICAgICogcXVldWVCdWZmZXIoKQorICAgICAqICAgLSBCZWZvcmUgcXVldWVCdWZmZXIoKSBpcyBjYWxsZWQsIERpc3BsYXlCbG9ja1RvQnVmZmVyUXVldWUoKSBzaG91bGQgYmUKKyAgICAgKiAgICAgY2FsbGVkIHRvIHRlc3QgZWxpZ2liaWxpdHkuIElmIGl0J3Mgbm90IGVsaWdpYmxlLCBkbyBub3QgY2FsbAorICAgICAqICAgICBxdWV1ZUJ1ZmZlcigpLgorICAgICAqCisgICAgICogYXR0YWNoQnVmZmVyKCkgLSByZW1vdGUgbWlncmF0aW9uIG9ubHkuCisgICAgICogICAtIExvY2FsIG1pZ3JhdGlvbiBvbiBibG9ja3Bvb2wgc2lkZSB3aWxsIGJlIGRvbmUgYXV0b21hdGljYWxseSBieQorICAgICAqICAgICBibG9ja3Bvb2wuCisgICAgICogICAtIEJlZm9yZSBhdHRhY2hCdWZmZXIoKSwgQmVnaW5BdHRhY2hCbG9ja1RvQnVmZmVyUXVldWUoKSBzaG91bGQgYmUgY2FsbGVkCisgICAgICogICAgIHRvIHRlc3QgZWxpZ2libGl0eS4KKyAgICAgKiAgIC0gQWZ0ZXIgYXR0YWNoQnVmZmVyKCkgaXMgY2FsbGVkLCBFbmRBdHRhY2hCbG9ja1RvQnVmZmVyUXVldWUoKSBzaG91bGQKKyAgICAgKiAgICAgYmUgY2FsbGVkLiBUaGlzIHdpbGwgc2V0ICJoZWxkIiBzdGF0dXMgdG8gdHJ1ZS4gSWYgaXQgcmV0dXJuZWQKKyAgICAgKiAgICAgZmFsc2UsIGNhbmNlbEJ1ZmZlcigpIHNob3VsZCBiZSBjYWxsZWQuCisgICAgICoKKyAgICAgKiBkZXRhY2hCdWZmZXIoKSAtIG5vLW9wLgorICAgICAqLworCisgICAgLyoqCisgICAgICogR2V0IGJ1ZmZlcnF1ZXVlIGRhdGEgZnJvbSB0aGUgYmxvY2twb29sIGRhdGEuCisgICAgICoKKyAgICAgKiBDYWxsaW5nIHRoaXMgZnVuY3Rpb24gd2l0aCBccCBnZW5lcmF0aW9uIHNldCB0byBudWxscHRyIHdpbGwgcmV0dXJuCisgICAgICogd2hldGhlciB0aGUgYmxvY2sgY29tZXMgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkIGJsb2NrcG9vbCwgYnV0IHdpbGwgbm90CisgICAgICogZmlsbCBpbiB0aGUgdmFsdWVzIGZvciBccCBnZW5lcmF0aW9uLCBccCBicUlkIG9yIFxwIGJxU2xvdC4KKyAgICAgKgorICAgICAqIFxwYXJhbVtpbl0gIHBvb2xEYXRhICAgYmxvY2twb29sIGRhdGEuCisgICAgICogXHBhcmFtW291dF0gZ2VuZXJhdGlvbiBHZW5lcmF0aW9uIG51bWJlciBhdHRhY2hlZCB0byB0aGUgYnVmZmVyLgorICAgICAqIFxwYXJhbVtvdXRdIGJxSWQgICAgICAgSWQgb2YgdGhlIGJ1ZmZlcnF1ZXVlIG93bmluZyB0aGUgYnVmZmVyIChibG9jaykuCisgICAgICogXHBhcmFtW291dF0gYnFTbG90ICAgICBTbG90IG51bWJlciBvZiB0aGUgYnVmZmVyLgorICAgICAqCisgICAgICogXHJldHVybiBcYyB0cnVlIHdoZW4gdGhlcmUgaXMgdmFsaWQgYnVmZmVycXVldWUgZGF0YTsKKyAgICAgKiAgICAgICAgIFxjIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBib29sIEdldEJ1ZmZlclF1ZXVlRGF0YSgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBfQzJCbG9ja1Bvb2xEYXRhPiYgcG9vbERhdGEsCisgICAgICAgICAgICB1aW50MzJfdCogZ2VuZXJhdGlvbiA9IG51bGxwdHIsCisgICAgICAgICAgICB1aW50NjRfdCogYnFJZCA9IG51bGxwdHIsCisgICAgICAgICAgICBpbnQzMl90KiBicVNsb3QgPSBudWxscHRyKTsKKworICAgIC8qKgorICAgICAqIEhvbGQgYSBibG9jayBmcm9tIHRoZSBkZXNpZ25hdGVkIGJ1ZmZlcnF1ZXVlLiBUaGlzIGNhdXNlcyB0aGUgZGVzdHJ1Y3Rpb24KKyAgICAgKiBvZiB0aGUgYmxvY2sgdG8gdHJpZ2dlciBhIGNhbGwgdG8gY2FuY2VsQnVmZmVyKCkuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBccCBwb29sRGF0YSBjb21lcyBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQKKyAgICAgKiBibG9jay4gSXQgZG9lcyBub3QgY2hlY2sgaWYgdGhhdCBpcyB0aGUgY2FzZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwb29sRGF0YSBibG9ja3Bvb2wgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBibG9jay4KKyAgICAgKiBccGFyYW0gb3duZXIgICAgYmxvY2sgb3duZXIgZnJvbSBjbGllbnQgYnVmZmVycXVldWUgbWFuYWdlci4KKyAgICAgKiAgICAgICAgICAgICAgICAgSWYgdGhpcyBpcyBleHBpcmVkLCB0aGUgYmxvY2sgaXMgbm90IG93bmVkIGJ5IGNsaWVudAorICAgICAqICAgICAgICAgICAgICAgICBhbnltb3JlLgorICAgICAqIFxwYXJhbSBpZ2JwICAgICBcYyBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGluc3RhbmNlIHRvIGJlIGFzc2lnbmVkIHRvIHRoZQorICAgICAqICAgICAgICAgICAgICAgICBibG9jay4gVGhpcyBpcyBub3QgbmVlZGVkIHdoZW4gdGhlIGJsb2NrIGlzIGxvY2FsLgorICAgICAqCisgICAgICogXHJldHVybiBUaGUgcHJldmlvdXMgaGVsZCBzdGF0dXMuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIHBvb2xEYXRhLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGludD4mIG93bmVyLAorICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMl8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCA9IG51bGxwdHIpOworCisgICAgLyoqCisgICAgICogUHJlcGFyZSBhIGJsb2NrIHRvIGJlIHRyYW5zZmVycmVkIHRvIG90aGVyIHByb2Nlc3MuIFRoaXMgYmxvY2tzCisgICAgICogYnVmZmVycXVldWUgbWlncmF0aW9uIGZyb20gaGFwcGVuaW5nLiBUaGUgYmxvY2sgc2hvdWxkIGJlIGluIGhlbGQuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBccCBwb29sRGF0YSBjb21lcyBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQKKyAgICAgKiBibG9jay4gSXQgZG9lcyBub3QgY2hlY2sgaWYgdGhhdCBpcyB0aGUgY2FzZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwb29sRGF0YSBibG9ja3Bvb2wgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBibG9jay4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdHJ1ZSBpZiB0cmFuc2ZlciBpcyBlbGlnaWJsZSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIHN0YXRpYworICAgIGJvb2wgQmVnaW5UcmFuc2ZlckJsb2NrVG9DbGllbnQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIHBvb2xEYXRhKTsKKworICAgIC8qKgorICAgICAqIENhbGxlZCBhZnRlciB0cmFuc2ZlcnJpbmcgdGhlIHNwZWNpZmllZCBibG9jayBpcyBmaW5pc2hlZC4gTWFrZSBzdXJlCisgICAgICogdGhhdCBCZWdpblRyYW5zZmVyQmxvY2tUb0NsaWVudCgpIHdhcyBjYWxsZWQgYmVmb3JlIHRoaXMgY2FsbC4KKyAgICAgKgorICAgICAqIFRoaXMgd2lsbCB1bmJsb2NrIGJ1ZmZlcnF1ZXVlIG1pZ3JhdGlvbi4gSWYgdHJhbnNmZXIgcmVzdWx0IHdhcworICAgICAqIHN1Y2Nlc3NmdWwsIHRoaXMgY2F1c2VzIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUgYmxvY2sgbm90IHRvIHRyaWdnZXIgYQorICAgICAqIGNhbGwgdG8gY2FuY2VsQnVmZmVyKCkuCisgICAgICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgXHAgcG9vbERhdGEgY29tZXMgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkCisgICAgICogYmxvY2suIEl0IGRvZXMgbm90IGNoZWNrIGlmIHRoYXQgaXMgdGhlIGNhc2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbERhdGEgYmxvY2twb29sIGRhdGEgYXNzb2NpYXRlZCB0byB0aGUgYmxvY2suCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRydWUgaWYgdHJhbnNmZXIgYmVnYW4gYmVmb3JlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBFbmRUcmFuc2ZlckJsb2NrVG9DbGllbnQoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIHBvb2xEYXRhLAorICAgICAgICAgICAgYm9vbCB0cmFuc2ZlcnJlZCk7CisKKyAgICAvKioKKyAgICAgKiBQcmVwYXJlIGEgYmxvY2sgdG8gYmUgbWlncmF0ZWQgdG8gYW5vdGhlciBidWZmZXJxdWV1ZS4gVGhpcyBibG9ja3MKKyAgICAgKiByZW5kZXJpbmcgdW50aWwgbWlncmF0aW9uIGhhcyBiZWVuIGZpbmlzaGVkLiAgVGhlIGJsb2NrIHNob3VsZCBiZSBpbgorICAgICAqIGhlbGQuCisgICAgICoKKyAgICAgKiBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCBccCBwb29sRGF0YSBjb21lcyBmcm9tIGEgYnVmZmVycXVldWUtYmFzZWQKKyAgICAgKiBibG9jay4gSXQgZG9lcyBub3QgY2hlY2sgaWYgdGhhdCBpcyB0aGUgY2FzZS4KKyAgICAgKgorICAgICAqIFxwYXJhbSBwb29sRGF0YSBibG9ja3Bvb2wgZGF0YSBhc3NvY2lhdGVkIHRvIHRoZSBibG9jay4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdHJ1ZSBpZiBtaWdyYXRpb24gaXMgZWxpZ2libGUsIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzdGF0aWMKKyAgICBib29sIEJlZ2luQXR0YWNoQmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBwb29sRGF0YSk7CisKKyAgICAvKioKKyAgICAgKiBDYWxsZWQgYWZ0ZXIgbWlncmF0aW9uIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2sgaXMgZmluaXNoZWQuIE1ha2Ugc3VyZQorICAgICAqIHRoYXQgQmVnaW5BdHRhY2hCbG9ja1RvQnVmZmVyUXVldWUoKSB3YXMgY2FsbGVkIGJlZm9yZSB0aGlzIGNhbGwuCisgICAgICoKKyAgICAgKiBUaGlzIHdpbGwgdW5ibG9jayByZW5kZXJpbmcuIGlmIHJlZGVyaW5nIGlzIHRyaWVkIGR1cmluZyBtaWdyYXRpb24sCisgICAgICogdGhpcyByZXR1cm5zIGZhbHNlLiBJbiB0aGF0IGNhc2UsIGNhbmNlbEJ1ZmZlcigpIHNob3VsZCBiZSBjYWxsZWQuCisgICAgICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgXHAgcG9vbERhdGEgY29tZXMgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkCisgICAgICogYmxvY2suIEl0IGRvZXMgbm90IGNoZWNrIGlmIHRoYXQgaXMgdGhlIGNhc2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbERhdGEgYmxvY2twb29sIGRhdGEgYXNzb2NpYXRlZCB0byB0aGUgYmxvY2suCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRydWUgaWYgbWlncmF0aW9uIGlzIGVsaWdpYmxlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBFbmRBdHRhY2hCbG9ja1RvQnVmZmVyUXVldWUoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIHBvb2xEYXRhLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGludD4mIG93bmVyLAorICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpzcDw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMl8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCwKKyAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgICAgICB1aW50NjRfdCBicUlkLAorICAgICAgICAgICAgaW50MzJfdCBicVNsb3QpOworCisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIGEgYmxvY2sgdG8gYmUgcmVuZGVyZWQgdmVyeSBzb29uLgorICAgICAqCisgICAgICogVGhpcyBmdW5jdGlvbiBhc3N1bWVzIHRoYXQgXHAgcG9vbERhdGEgY29tZXMgZnJvbSBhIGJ1ZmZlcnF1ZXVlLWJhc2VkCisgICAgICogYmxvY2suIEl0IGRvZXMgbm90IGNoZWNrIGlmIHRoYXQgaXMgdGhlIGNhc2UuCisgICAgICoKKyAgICAgKiBccGFyYW0gcG9vbERhdGEgYmxvY2twb29sIGRhdGEgYXNzb2NpYXRlZCB0byB0aGUgYmxvY2suCisgICAgICoKKyAgICAgKiBccmV0dXJuIHRydWUgaWYgbWlncmF0aW9uIGlzIGVsaWdpYmxlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgc3RhdGljCisgICAgYm9vbCBEaXNwbGF5QmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPF9DMkJsb2NrUG9vbERhdGE+JiBwb29sRGF0YSk7Cit9OworCisjZW5kaWYgLy8gQU5EUk9JRF9TVEFHRUZSSUdIVF9DMkJMT0NLX0lOVEVSTkFMX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyUGFyYW1JbnRlcm5hbC5oIGIvbWVkaWEvY29kZWMyL3ZuZGsvaW50ZXJuYWwvQzJQYXJhbUludGVybmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRhOGYyNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL2ludGVybmFsL0MyUGFyYW1JbnRlcm5hbC5oCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX1NUQUdFRlJJR0hUX0MyUEFSQU1fSU5URVJOQUxfSF8KKyNkZWZpbmUgQU5EUk9JRF9TVEFHRUZSSUdIVF9DMlBBUkFNX0lOVEVSTkFMX0hfCisKKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisKK3N0cnVjdCBDMl9ISURFIF9DMlBhcmFtSW5zcGVjdG9yIHsKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldE9mZnNldChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQpIHsKKyAgICAgICAgcmV0dXJuIGZkLl9tRmllbGRJZC5fbU9mZnNldDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHZvaWQgU2V0T2Zmc2V0KEMyRmllbGREZXNjcmlwdG9yICZmZCwgdWludDMyX3Qgb2Zmc2V0KSB7CisgICAgICAgIGZkLl9tRmllbGRJZC5fbU9mZnNldCA9IG9mZnNldDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldEVuZE9mZnNldChjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQsIHVpbnQzMl90IHBhcmFtU2l6ZSA9IDApIHsKKyAgICAgICAgdWludDMyX3QgZW5kT2Zmc2V0ID0gZmQuX21GaWVsZElkLl9tT2Zmc2V0ICsgZmQuX21FeHRlbnQgKiBmZC5fbUZpZWxkSWQuX21TaXplOworICAgICAgICAvLy8gZm9yIGZsZXggcGFyYW1ldGVycyByZXR1cm4gcGFyYW1TaXplIGlmIGdpdmVuCisgICAgICAgIHJldHVybiBmZC5fbUV4dGVudCA/IGVuZE9mZnNldCA6IHN0ZDo6bWF4KGVuZE9mZnNldCwgcGFyYW1TaXplKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldFNpemUoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZkKSB7CisgICAgICAgIHJldHVybiBmZC5fbUZpZWxkSWQuX21TaXplOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0SW5kZXgoY29uc3QgQzJQYXJhbUZpZWxkICZwZikgeworICAgICAgICByZXR1cm4gcGYuX21JbmRleDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldE9mZnNldChjb25zdCBDMlBhcmFtRmllbGQgJnBmKSB7CisgICAgICAgIHJldHVybiBwZi5fbUZpZWxkSWQuX21PZmZzZXQ7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRTaXplKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYpIHsKKyAgICAgICAgcmV0dXJuIHBmLl9tRmllbGRJZC5fbVNpemU7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyB1aW50MzJfdCBHZXRPZmZzZXQoY29uc3QgX0MyRmllbGRJZCAmZikgeworICAgICAgICByZXR1cm4gZi5fbU9mZnNldDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHVpbnQzMl90IEdldFNpemUoY29uc3QgX0MyRmllbGRJZCAmZikgeworICAgICAgICByZXR1cm4gZi5fbVNpemU7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyBfQzJGaWVsZElkIEdldEZpZWxkKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCkgeworICAgICAgICByZXR1cm4gZmQuX21GaWVsZElkOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMgdWludDMyX3QgR2V0QXR0cmliKGNvbnN0IEMyUGFyYW1EZXNjcmlwdG9yICZwZCkgeworICAgICAgICByZXR1cm4gcGQuX21BdHRyaWI7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYyBfQzJGaWVsZElkIEdldEZpZWxkKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYpIHsKKyAgICAgICAgcmV0dXJuIHBmLl9tRmllbGRJZDsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljCisgICAgQzJQYXJhbUZpZWxkIENyZWF0ZVBhcmFtRmllbGQoQzJQYXJhbTo6SW5kZXggaW5kZXgsIHVpbnQzMl90IG9mZnNldCwgdWludDMyX3Qgc2l6ZSkgeworICAgICAgICByZXR1cm4gQzJQYXJhbUZpZWxkKGluZGV4LCBvZmZzZXQsIHNpemUpOworICAgIH0KKworICAgIGlubGluZSBzdGF0aWMKKyAgICBDMlBhcmFtRmllbGQgQ3JlYXRlUGFyYW1GaWVsZChDMlBhcmFtOjpJbmRleCBpbmRleCwgX0MyRmllbGRJZCBmaWVsZCkgeworICAgICAgICByZXR1cm4gQzJQYXJhbUZpZWxkKGluZGV4LCBmaWVsZC5fbU9mZnNldCwgZmllbGQuX21TaXplKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljCisgICAgdm9pZCBUcmltUGFyYW0oQzJQYXJhbSAqcGFyYW0sIHVpbnQzMl90IG5ld1NpemUpIHsKKyAgICAgICAgaWYgKHBhcmFtICYmICpwYXJhbSAmJiBwYXJhbS0+c2l6ZSgpID4gbmV3U2l6ZSAmJiBuZXdTaXplID49IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICAgICAgcGFyYW0tPl9tU2l6ZSA9IG5ld1NpemU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljIHZvaWQgQWRkTmFtZWRWYWx1ZXMoCisgICAgICAgICAgICBDMkZpZWxkRGVzY3JpcHRvciAmZmQsIEMyRmllbGREZXNjcmlwdG9yOjpOYW1lZFZhbHVlc1R5cGUgJiZuYW1lZFZhbHVlcykgeworICAgICAgICBmZC5fbU5hbWVkVmFsdWVzID0gc3RkOjptb3ZlKG5hbWVkVmFsdWVzKTsKKyAgICB9CisKKyAgICBpbmxpbmUgc3RhdGljCisgICAgQzJTdHJ1Y3REZXNjcmlwdG9yIENyZWF0ZVN0cnVjdERlc2NyaXB0b3IoQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGREZXNjcmlwdG9yPiAmJmZpZWxkcykgeworICAgICAgICByZXR1cm4gQzJTdHJ1Y3REZXNjcmlwdG9yKGluZGV4LCBzdGQ6Om1vdmUoZmllbGRzKSk7CisgICAgfQorCisgICAgaW5saW5lIHN0YXRpYworICAgIEMyRmllbGREZXNjcmlwdG9yIE9mZnNldEZpZWxkRGVzY3JpcHRvcihjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmQsIHNpemVfdCBvZmZzZXQpIHsKKyAgICAgICAgcmV0dXJuIEMyRmllbGREZXNjcmlwdG9yKGZkLCBvZmZzZXQpOworICAgIH0KKworICAgIC8vIGV4cG9zZSBhdHRyaWJ1dGVzCisgICAgdHlwZWRlZiBDMlBhcmFtRGVzY3JpcHRvcjo6YXR0cmliX3QgYXR0cmliX3Q7Cit9OworCisjZW5kaWYgLy8gQU5EUk9JRF9TVEFHRUZSSUdIVF9DMlBBUkFNX0lOVEVSTkFMX0hfCisKZGlmZiAtLWdpdCBhL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvcGxhdGZvcm0vQzJCcUJ1ZmZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODMwNGY3NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3BsYXRmb3JtL0MyQnFCdWZmZXIuY3BwCkBAIC0wLDAgKzEsNzkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkJxQnVmZmVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8dWkvQnVmZmVyUXVldWVEZWZzLmg+CisjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgorI2luY2x1ZGUgPHVpL0ZlbmNlLmg+CisKKyNpbmNsdWRlIDx0eXBlcy5oPgorCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorCisjaW5jbHVkZSA8QzJBbGxvY2F0b3JHcmFsbG9jLmg+CisjaW5jbHVkZSA8QzJCcUJ1ZmZlclByaXYuaD4KKyNpbmNsdWRlIDxDMkJsb2NrSW50ZXJuYWwuaD4KKworI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG11dGV4PgorCit1c2luZyA6OmFuZHJvaWQ6OkJ1ZmZlclF1ZXVlRGVmczo6TlVNX0JVRkZFUl9TTE9UUzsKK3VzaW5nIDo6YW5kcm9pZDo6QzJBbGxvY2F0b3JHcmFsbG9jOwordXNpbmcgOjphbmRyb2lkOjpDMkFuZHJvaWRNZW1vcnlVc2FnZTsKK3VzaW5nIDo6YW5kcm9pZDo6RmVuY2U7Cit1c2luZyA6OmFuZHJvaWQ6OkdyYXBoaWNCdWZmZXI7Cit1c2luZyA6OmFuZHJvaWQ6OnNwOwordXNpbmcgOjphbmRyb2lkOjpzdGF0dXNfdDsKK3VzaW5nIDo6YW5kcm9pZDo6d3A7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2hhbmRsZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKKwordXNpbmcgSEJ1ZmZlciA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzI6OkhhcmR3YXJlQnVmZmVyOwordXNpbmcgSFN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjJfMDo6U3RhdHVzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMl8wOjp1dGlsczo6YjJoOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMl8wOjp1dGlsczo6aDJiOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMl8wOjp1dGlsczo6SEZlbmNlV3JhcHBlcjsKKwordXNpbmcgSEdyYXBoaWNCdWZmZXJQcm9kdWNlciA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjJfMAorICAgICAgICA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKK3N0cnVjdCBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSA6IHB1YmxpYyBfQzJCbG9ja1Bvb2xEYXRhIHsKKworICAgIGJvb2wgaGVsZDsKKyAgICBib29sIGxvY2FsOworICAgIHVpbnQzMl90IGdlbmVyYXRpb247CisgICAgdWludDY0X3QgYnFJZDsKKyAgICBpbnQzMl90IGJxU2xvdDsKKyAgICBib29sIHRyYW5zZmVyOyAvLyBsb2NhbCB0cmFuc2ZlciB0byByZW1vdGUKKyAgICBib29sIGF0dGFjaDsgLy8gYXR0YWNoIG9uIHJlbW90ZQorICAgIGJvb2wgZGlzcGxheTsgLy8gZGlzcGxheSBvbiByZW1vdGU7CisgICAgc3RkOjp3ZWFrX3B0cjxpbnQ+IG93bmVyOworICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlnYnA7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OkltcGw+IGxvY2FsUG9vbDsKKyAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbG9jazsKKworICAgIHZpcnR1YWwgdHlwZV90IGdldFR5cGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBUWVBFX0JVRkZFUlFVRVVFOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhIHJlbW90ZSBCbG9ja1Bvb2xEYXRhLgorICAgIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKAorICAgICAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8aW50PiAmb3duZXIsCisgICAgICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIpOworCisgICAgLy8gQ3JlYXRlIGEgbG9jYWwgQmxvY2tQb29sRGF0YS4KKyAgICBDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKKyAgICAgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGJxSWQsIGludDMyX3QgYnFTbG90LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OkltcGw+JiBwb29sKTsKKworICAgIHZpcnR1YWwgfkMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhKCkgb3ZlcnJpZGU7CisKKyAgICBpbnQgbWlncmF0ZShjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIsCisgICAgICAgICAgICAgICAgdWludDMyX3QgdG9HZW5lcmF0aW9uLCB1aW50NjRfdCB0b0JxSWQsCisgICAgICAgICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gKmJ1ZmZlcnMsIHVpbnQzMl90IG9sZEdlbmVyYXRpb24pOworfTsKKworYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkdldEJ1ZmZlclF1ZXVlRGF0YSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGNvbnN0IF9DMkJsb2NrUG9vbERhdGE+JiBkYXRhLAorICAgICAgICB1aW50MzJfdCogZ2VuZXJhdGlvbiwgdWludDY0X3QqIGJxSWQsIGludDMyX3QqIGJxU2xvdCkgeworICAgIGlmIChkYXRhICYmIGRhdGEtPmdldFR5cGUoKSA9PSBfQzJCbG9ja1Bvb2xEYXRhOjpUWVBFX0JVRkZFUlFVRVVFKSB7CisgICAgICAgIGlmIChnZW5lcmF0aW9uKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PGNvbnN0IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICAgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbG9jayhwb29sRGF0YS0+bG9jayk7CisgICAgICAgICAgICAqZ2VuZXJhdGlvbiA9IHBvb2xEYXRhLT5nZW5lcmF0aW9uOworICAgICAgICAgICAgaWYgKGJxSWQpIHsKKyAgICAgICAgICAgICAgICAqYnFJZCA9IHBvb2xEYXRhLT5icUlkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGJxU2xvdCkgeworICAgICAgICAgICAgICAgICpicVNsb3QgPSBwb29sRGF0YS0+YnFTbG90OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgX0MyQmxvY2tGYWN0b3J5OjpIb2xkQmxvY2tGcm9tQnVmZmVyUXVldWUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgZGF0YSwKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPGludD4mIG93bmVyLAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgaWdicCkgeworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2socG9vbERhdGEtPmxvY2spOworICAgIGlmICghcG9vbERhdGEtPmxvY2FsKSB7CisgICAgICAgIHBvb2xEYXRhLT5vd25lciA9IG93bmVyOworICAgICAgICBwb29sRGF0YS0+aWdicCA9IGlnYnA7CisgICAgfQorICAgIGlmIChwb29sRGF0YS0+aGVsZCkgeworICAgICAgICBwb29sRGF0YS0+aGVsZCA9IHRydWU7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcG9vbERhdGEtPmhlbGQgPSB0cnVlOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIF9DMkJsb2NrRmFjdG9yeTo6QmVnaW5UcmFuc2ZlckJsb2NrVG9DbGllbnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgZGF0YSkgeworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2socG9vbERhdGEtPmxvY2spOworICAgIHBvb2xEYXRhLT50cmFuc2ZlciA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgX0MyQmxvY2tGYWN0b3J5OjpFbmRUcmFuc2ZlckJsb2NrVG9DbGllbnQoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgZGF0YSwKKyAgICAgICAgYm9vbCB0cmFuc2ZlcikgeworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2socG9vbERhdGEtPmxvY2spOworICAgIHBvb2xEYXRhLT50cmFuc2ZlciA9IGZhbHNlOworICAgIGlmICh0cmFuc2ZlcikgeworICAgICAgICBwb29sRGF0YS0+aGVsZCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkJlZ2luQXR0YWNoQmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIGRhdGEpIHsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+IHBvb2xEYXRhID0KKyAgICAgICAgICAgIHN0ZDo6c3RhdGljX3BvaW50ZXJfY2FzdDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oZGF0YSk7CisgICAgc3RkOjpzY29wZWRfbG9jazxzdGQ6Om11dGV4PiBsb2NrKHBvb2xEYXRhLT5sb2NrKTsKKyAgICBpZiAocG9vbERhdGEtPmxvY2FsIHx8IHBvb2xEYXRhLT5kaXNwbGF5IHx8CisgICAgICAgIHBvb2xEYXRhLT5hdHRhY2ggfHwgIXBvb2xEYXRhLT5oZWxkKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHBvb2xEYXRhLT5icUlkID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBwb29sRGF0YS0+YXR0YWNoID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gaWYgZGlzcGxheSB3YXMgdHJpZWQgZHVyaW5nIGF0dGFjaCwgYnVmZmVyIHNob3VsZCBiZSByZXRpcmVkIEFTQVAuCitib29sIF9DMkJsb2NrRmFjdG9yeTo6RW5kQXR0YWNoQmxvY2tUb0J1ZmZlclF1ZXVlKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8X0MyQmxvY2tQb29sRGF0YT4mIGRhdGEsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxpbnQ+JiBvd25lciwKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGlnYnAsCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sCisgICAgICAgIHVpbnQ2NF90IGJxSWQsCisgICAgICAgIGludDMyX3QgYnFTbG90KSB7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KGRhdGEpOworICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbG9jayhwb29sRGF0YS0+bG9jayk7CisgICAgaWYgKHBvb2xEYXRhLT5sb2NhbCB8fCAhcG9vbERhdGEtPmF0dGFjaCApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAocG9vbERhdGEtPmRpc3BsYXkpIHsKKyAgICAgICAgcG9vbERhdGEtPmF0dGFjaCA9IGZhbHNlOworICAgICAgICBwb29sRGF0YS0+aGVsZCA9IGZhbHNlOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHBvb2xEYXRhLT5hdHRhY2ggPSBmYWxzZTsKKyAgICBwb29sRGF0YS0+aGVsZCA9IHRydWU7CisgICAgcG9vbERhdGEtPm93bmVyID0gb3duZXI7CisgICAgcG9vbERhdGEtPmlnYnAgPSBpZ2JwOworICAgIHBvb2xEYXRhLT5nZW5lcmF0aW9uID0gZ2VuZXJhdGlvbjsKKyAgICBwb29sRGF0YS0+YnFJZCA9IGJxSWQ7CisgICAgcG9vbERhdGEtPmJxU2xvdCA9IGJxU2xvdDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBfQzJCbG9ja0ZhY3Rvcnk6OkRpc3BsYXlCbG9ja1RvQnVmZmVyUXVldWUoCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxfQzJCbG9ja1Bvb2xEYXRhPiYgZGF0YSkgeworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPihkYXRhKTsKKyAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2socG9vbERhdGEtPmxvY2spOworICAgIGlmIChwb29sRGF0YS0+bG9jYWwgfHwgcG9vbERhdGEtPmRpc3BsYXkgfHwgIXBvb2xEYXRhLT5oZWxkKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHBvb2xEYXRhLT5icUlkID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBwb29sRGF0YS0+ZGlzcGxheSA9IHRydWU7CisgICAgaWYgKHBvb2xEYXRhLT5hdHRhY2gpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBwb29sRGF0YS0+aGVsZCA9IGZhbHNlOworICAgIHJldHVybiB0cnVlOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKAorICAgICAgICBjb25zdCBDMkhhbmRsZSAqaGFuZGxlKSB7CisgICAgLy8gVE9ETzogZ2V0IHByb3BlciBhbGxvY2F0b3I/IGFuZCBtdXRleD8KKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEMyQWxsb2NhdG9yR3JhbGxvYz4gc0FsbG9jYXRvciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJBbGxvY2F0b3JHcmFsbG9jPigwKTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNBbGxvY2F0aW9uPiBhbGxvYzsKKyAgICBpZiAoQzJBbGxvY2F0b3JHcmFsbG9jOjppc1ZhbGlkKGhhbmRsZSkpIHsKKyAgICAgICAgdWludDMyX3Qgd2lkdGg7CisgICAgICAgIHVpbnQzMl90IGhlaWdodDsKKyAgICAgICAgdWludDMyX3QgZm9ybWF0OworICAgICAgICB1aW50NjRfdCB1c2FnZTsKKyAgICAgICAgdWludDMyX3Qgc3RyaWRlOworICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uOworICAgICAgICB1aW50NjRfdCBicUlkOworICAgICAgICB1aW50MzJfdCBicVNsb3Q7CisgICAgICAgIGFuZHJvaWQ6Ol9VbndyYXBOYXRpdmVDb2RlYzJHcmFsbG9jTWV0YWRhdGEoCisgICAgICAgICAgICAgICAgaGFuZGxlLCAmd2lkdGgsICZoZWlnaHQsICZmb3JtYXQsICZ1c2FnZSwgJnN0cmlkZSwgJmdlbmVyYXRpb24sICZicUlkLCAmYnFTbG90KTsKKyAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gc0FsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihoYW5kbGUsICZhbGxvYyk7CisgICAgICAgIGlmIChlcnIgPT0gQzJfT0spIHsKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gYmxvY2s7CisgICAgICAgICAgICBpZiAoYnFJZCB8fCBicVNsb3QpIHsKKyAgICAgICAgICAgICAgICAvLyBCUUJCUAorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJxSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdClicVNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgICAgICAgICAgICAgYmxvY2sgPSBfQzJCbG9ja0ZhY3Rvcnk6OkNyZWF0ZUdyYXBoaWNCbG9jayhhbGxvYywgcG9vbERhdGEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBibG9jazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworbmFtZXNwYWNlIHsKKworaW50NjRfdCBnZXRUaW1lc3RhbXBOb3coKSB7CisgICAgaW50NjRfdCBzdGFtcDsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgICAgLy8gVE9ETzogQ0xPQ0tfTU9OT1RPTklDX0NPQVJTRT8KKyAgICBjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKTsKKyAgICBzdGFtcCA9IHRzLnR2X25zZWMgLyAxMDAwOworICAgIHN0YW1wICs9ICh0cy50dl9zZWMgKiAxMDAwMDAwTEwpOworICAgIHJldHVybiBzdGFtcDsKK30KKworYm9vbCBnZXRHZW5lcmF0aW9uTnVtYmVyKGNvbnN0IHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+ICZwcm9kdWNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZ2VuZXJhdGlvbikgeworICAgIHN0YXR1c190IHN0YXR1c3t9OworICAgIGludCBzbG90e307CisgICAgYm9vbCBidWZmZXJOZWVkc1JlYWxsb2NhdGlvbnt9OworICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZSgpOworCisgICAgdXNpbmcgSW5wdXQgPSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEZXF1ZXVlQnVmZmVySW5wdXQ7CisgICAgdXNpbmcgT3V0cHV0ID0gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGVxdWV1ZUJ1ZmZlck91dHB1dDsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPSBwcm9kdWNlci0+ZGVxdWV1ZUJ1ZmZlcigKKyAgICAgICAgICAgIElucHV0ezY0MCwgNDgwLCBIQUxfUElYRUxfRk9STUFUX1lDQkNSXzQyMF84ODgsIDB9LAorICAgICAgICAgICAgWyZzdGF0dXMsICZzbG90LCAmYnVmZmVyTmVlZHNSZWFsbG9jYXRpb24sICZmZW5jZV0KKyAgICAgICAgICAgIChIU3RhdHVzIGhTdGF0dXMsIGludDMyX3QgaFNsb3QsIE91dHB1dCBjb25zdCYgaE91dHB1dCkgeworICAgICAgICAgICAgICAgIHNsb3QgPSBzdGF0aWNfY2FzdDxpbnQ+KGhTbG90KTsKKyAgICAgICAgICAgICAgICBpZiAoIWgyYihoU3RhdHVzLCAmc3RhdHVzKSB8fCAhaDJiKGhPdXRwdXQuZmVuY2UsICZmZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gOjphbmRyb2lkOjpCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyTmVlZHNSZWFsbG9jYXRpb24gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhPdXRwdXQuYnVmZmVyTmVlZHNSZWFsbG9jYXRpb247CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkgfHwgc3RhdHVzICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgSEZlbmNlV3JhcHBlciBoRmVuY2VXcmFwcGVye307CisgICAgaWYgKCFiMmgoZmVuY2UsICZoRmVuY2VXcmFwcGVyKSkgeworICAgICAgICAodm9pZClwcm9kdWNlci0+ZGV0YWNoQnVmZmVyKHN0YXRpY19jYXN0PGludDMyX3Q+KHNsb3QpKS5pc09rKCk7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGZlbmNlIHJlY2VpdmVkIGZyb20gZGVxdWV1ZUJ1ZmZlci4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzcDxHcmFwaGljQnVmZmVyPiBzbG90QnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKKyAgICAvLyBOLkIuIFRoaXMgYXNzdW1lcyByZXF1ZXN0QnVmZmVyIyByZXR1cm5zIGFuIGV4aXN0aW5nIGFsbG9jYXRpb24KKyAgICAvLyBpbnN0ZWFkIG9mIGEgbmV3IGFsbG9jYXRpb24uCisgICAgdHJhbnNSZXN1bHQgPSBwcm9kdWNlci0+cmVxdWVzdEJ1ZmZlcigKKyAgICAgICAgICAgIHNsb3QsCisgICAgICAgICAgICBbJnN0YXR1cywgJnNsb3RCdWZmZXIsICZnZW5lcmF0aW9uXSgKKyAgICAgICAgICAgICAgICAgICAgSFN0YXR1cyBoU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICBIQnVmZmVyIGNvbnN0JiBoQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uTnVtYmVyKXsKKyAgICAgICAgICAgICAgICBpZiAoaDJiKGhTdGF0dXMsICZzdGF0dXMpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBoMmIoaEJ1ZmZlciwgJnNsb3RCdWZmZXIpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICpnZW5lcmF0aW9uID0gZ2VuZXJhdGlvbk51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+c2V0R2VuZXJhdGlvbk51bWJlcihnZW5lcmF0aW9uTnVtYmVyKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBhbmRyb2lkOjpCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IGFuZHJvaWQ6Ok5PX0VSUk9SKSB7CisgICAgICAgICh2b2lkKXByb2R1Y2VyLT5kZXRhY2hCdWZmZXIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2xvdCkpLmlzT2soKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAodm9pZClwcm9kdWNlci0+ZGV0YWNoQnVmZmVyKHN0YXRpY19jYXN0PGludDMyX3Q+KHNsb3QpKS5pc09rKCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK307CisKK2NsYXNzIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OkltcGwKKyAgICAgICAgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpJbXBsPiB7Citwcml2YXRlOgorICAgIGMyX3N0YXR1c190IGZldGNoRnJvbUlnYnBfbCgKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgLy8gV2UgaGF2ZSBhbiBJR0JQIG5vdy4KKyAgICAgICAgQzJBbmRyb2lkTWVtb3J5VXNhZ2UgYW5kcm9pZFVzYWdlID0gdXNhZ2U7CisgICAgICAgIHN0YXR1c190IHN0YXR1c3t9OworICAgICAgICBpbnQgc2xvdHt9OworICAgICAgICBib29sIGJ1ZmZlck5lZWRzUmVhbGxvY2F0aW9ue307CisgICAgICAgIHNwPEZlbmNlPiBmZW5jZSA9IG5ldyBGZW5jZSgpOworICAgICAgICBBTE9HVigidHJpZXMgdG8gZGVxdWV1ZSBidWZmZXIiKTsKKworICAgICAgICB7IC8vIENhbGwgZGVxdWV1ZUJ1ZmZlcigpLgorICAgICAgICAgICAgdXNpbmcgSW5wdXQgPSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEZXF1ZXVlQnVmZmVySW5wdXQ7CisgICAgICAgICAgICB1c2luZyBPdXRwdXQgPSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEZXF1ZXVlQnVmZmVyT3V0cHV0OworICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gbVByb2R1Y2VyLT5kZXF1ZXVlQnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBJbnB1dHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZFVzYWdlLmFzR3JhbGxvY1VzYWdlKCl9LAorICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnNsb3QsICZidWZmZXJOZWVkc1JlYWxsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICZmZW5jZV0oSFN0YXR1cyBoU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhTbG90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdXRwdXQgY29uc3QmIGhPdXRwdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNsb3QgPSBzdGF0aWNfY2FzdDxpbnQ+KGhTbG90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaDJiKGhTdGF0dXMsICZzdGF0dXMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFoMmIoaE91dHB1dC5mZW5jZSwgJmZlbmNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDo6YW5kcm9pZDo6QkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJOZWVkc1JlYWxsb2NhdGlvbiA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoT3V0cHV0LmJ1ZmZlck5lZWRzUmVhbGxvY2F0aW9uOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpIHx8IHN0YXR1cyAhPSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgICAgIGlmICh0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgKyttRHFGYWlsdXJlOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IGFuZHJvaWQ6OklOVkFMSURfT1BFUkFUSU9OIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gYW5kcm9pZDo6VElNRURfT1VUIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPT0gYW5kcm9pZDo6V09VTERfQkxPQ0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIERlcXVldWUgYnVmZmVyIGlzIGJsb2NrZWQgdGVtcG9yYXJpbHkuIFJldHJ5aW5nIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1aXJlZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HRCgiY2Fubm90IGRlcXVldWUgYnVmZmVyICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbURxRmFpbHVyZSA9IDA7CisgICAgICAgICAgICBtTGFzdERxVHMgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgfQorICAgICAgICBIRmVuY2VXcmFwcGVyIGhGZW5jZVdyYXBwZXJ7fTsKKyAgICAgICAgaWYgKCFiMmgoZmVuY2UsICZoRmVuY2VXcmFwcGVyKSkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgZmVuY2UgcmVjZWl2ZWQgZnJvbSBkZXF1ZXVlQnVmZmVyLiIpOworICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiZGVxdWV1ZWQgYSBidWZmZXIgc3VjY2Vzc2Z1bGx5Iik7CisgICAgICAgIGlmIChmZW5jZSkgeworICAgICAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQga0ZlbmNlV2FpdFRpbWVNcyA9IDEwOworCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmZW5jZS0+d2FpdChrRmVuY2VXYWl0VGltZU1zKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gLUVUSU1FKSB7CisgICAgICAgICAgICAgICAgLy8gZmVuY2UgaXMgbm90IHNpZ25hbGxlZCB5ZXQuCisgICAgICAgICAgICAgICAgKHZvaWQpbVByb2R1Y2VyLT5jYW5jZWxCdWZmZXIoc2xvdCwgaEZlbmNlV3JhcHBlci5nZXRIYW5kbGUoKSkuaXNPaygpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CTE9DS0lORzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gYW5kcm9pZDo6Tk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiYnVmZmVyIGZlbmNlIHdhaXQgZXJyb3IgJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKHNsb3QsIGhGZW5jZVdyYXBwZXIuZ2V0SGFuZGxlKCkpLmlzT2soKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVuZGVyQ2FsbGJhY2spIHsKKyAgICAgICAgICAgICAgICBuc2Vjc190IHNpZ25hbFRpbWUgPSBmZW5jZS0+Z2V0U2lnbmFsVGltZSgpOworICAgICAgICAgICAgICAgIGlmIChzaWduYWxUaW1lID49IDAgJiYgc2lnbmFsVGltZSA8IElOVDY0X01BWCkgeworICAgICAgICAgICAgICAgICAgICBtUmVuZGVyQ2FsbGJhY2sobVByb2R1Y2VySWQsIHNsb3QsIHNpZ25hbFRpbWUpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJnb3QgZmVuY2Ugc2lnbmFsIHRpbWUgb2YgJWxsZCIsIChsb25nIGxvbmcpc2lnbmFsVGltZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gJnNsb3RCdWZmZXIgPSBtQnVmZmVyc1tzbG90XTsKKyAgICAgICAgdWludDMyX3Qgb3V0R2VuZXJhdGlvbjsKKyAgICAgICAgaWYgKGJ1ZmZlck5lZWRzUmVhbGxvY2F0aW9uIHx8ICFzbG90QnVmZmVyKSB7CisgICAgICAgICAgICBpZiAoIXNsb3RCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBzbG90QnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIE4uQi4gVGhpcyBhc3N1bWVzIHJlcXVlc3RCdWZmZXIjIHJldHVybnMgYW4gZXhpc3RpbmcgYWxsb2NhdGlvbgorICAgICAgICAgICAgLy8gaW5zdGVhZCBvZiBhIG5ldyBhbGxvY2F0aW9uLgorICAgICAgICAgICAgUmV0dXJuPHZvaWQ+IHRyYW5zUmVzdWx0ID0gbVByb2R1Y2VyLT5yZXF1ZXN0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICBzbG90LAorICAgICAgICAgICAgICAgICAgICBbJnN0YXR1cywgJnNsb3RCdWZmZXIsICZvdXRHZW5lcmF0aW9uXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIU3RhdHVzIGhTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSEJ1ZmZlciBjb25zdCYgaEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnZW5lcmF0aW9uTnVtYmVyKXsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChoMmIoaFN0YXR1cywgJnN0YXR1cykgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaDJiKGhCdWZmZXIsICZzbG90QnVmZmVyKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+c2V0R2VuZXJhdGlvbk51bWJlcihnZW5lcmF0aW9uTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRHZW5lcmF0aW9uID0gZ2VuZXJhdGlvbk51bWJlcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gYW5kcm9pZDo6QkFEX1ZBTFVFOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIGlmICghdHJhbnNSZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgICAgIHJldHVybiBDMl9CQURfVkFMVUU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXR1cyAhPSBhbmRyb2lkOjpOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHNsb3RCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAodm9pZCltUHJvZHVjZXItPmNhbmNlbEJ1ZmZlcihzbG90LCBoRmVuY2VXcmFwcGVyLmdldEhhbmRsZSgpKS5pc09rKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX0JBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtR2VuZXJhdGlvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gZ2V0dGluZyBnZW5lcmF0aW9uICMgbGF6aWx5IGR1ZSB0byBkZXF1ZXVlIGZhaWx1cmUuCisgICAgICAgICAgICAgICAgbUdlbmVyYXRpb24gPSBvdXRHZW5lcmF0aW9uOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChzbG90QnVmZmVyKSB7CisgICAgICAgICAgICBBTE9HVigiYnVmZmVyIHdyYXBzICVsbHUgJWQiLCAodW5zaWduZWQgbG9uZyBsb25nKW1Qcm9kdWNlcklkLCBzbG90KTsKKyAgICAgICAgICAgIEMySGFuZGxlICpjMkhhbmRsZSA9IGFuZHJvaWQ6OldyYXBOYXRpdmVDb2RlYzJHcmFsbG9jSGFuZGxlKAorICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT5oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPndpZHRoLAorICAgICAgICAgICAgICAgICAgICBzbG90QnVmZmVyLT5oZWlnaHQsCisgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+dXNhZ2UsCisgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgc2xvdEJ1ZmZlci0+Z2V0R2VuZXJhdGlvbk51bWJlcigpLAorICAgICAgICAgICAgICAgICAgICBtUHJvZHVjZXJJZCwgc2xvdCk7CisgICAgICAgICAgICBpZiAoYzJIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgICAgICAgICAgYzJfc3RhdHVzX3QgZXJyID0gbUFsbG9jYXRvci0+cHJpb3JHcmFwaGljQWxsb2NhdGlvbihjMkhhbmRsZSwgJmFsbG9jKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IEMyX09LKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gcG9vbERhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNsb3RCdWZmZXItPmdldEdlbmVyYXRpb25OdW1iZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByb2R1Y2VySWQsIHNsb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZF9mcm9tX3RoaXMoKSk7CisgICAgICAgICAgICAgICAgbVBvb2xEYXRhc1tzbG90XSA9IHBvb2xEYXRhOworICAgICAgICAgICAgICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jLCBwb29sRGF0YSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEMyX09LOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQmxvY2sgd2FzIG5vdCBjcmVhdGVkLiBjYWxsIHJlcXVlc3RCdWZmZXIjIGFnYWluIG5leHQgdGltZS4KKyAgICAgICAgICAgIHNsb3RCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgICh2b2lkKW1Qcm9kdWNlci0+Y2FuY2VsQnVmZmVyKHNsb3QsIGhGZW5jZVdyYXBwZXIuZ2V0SGFuZGxlKCkpLmlzT2soKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gQzJfQkFEX1ZBTFVFOworICAgIH0KKworcHVibGljOgorICAgIEltcGwoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiAmYWxsb2NhdG9yKQorICAgICAgICA6IG1Jbml0KEMyX09LKSwgbVByb2R1Y2VySWQoMCksIG1HZW5lcmF0aW9uKDApLAorICAgICAgICAgIG1EcUZhaWx1cmUoMCksIG1MYXN0RHFUcygwKSwgbUxhc3REcUxvZ1RzKDApLAorICAgICAgICAgIG1BbGxvY2F0b3IoYWxsb2NhdG9yKSB7CisgICAgfQorCisgICAgfkltcGwoKSB7CisgICAgICAgIGJvb2wgbm9Jbml0ID0gZmFsc2U7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0JVRkZFUl9TTE9UUzsgKytpKSB7CisgICAgICAgICAgICBpZiAoIW5vSW5pdCAmJiBtUHJvZHVjZXIpIHsKKyAgICAgICAgICAgICAgICBSZXR1cm48SFN0YXR1cz4gdHJhbnNSZXN1bHQgPQorICAgICAgICAgICAgICAgICAgICAgICAgbVByb2R1Y2VyLT5kZXRhY2hCdWZmZXIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oaSkpOworICAgICAgICAgICAgICAgIG5vSW5pdCA9ICF0cmFuc1Jlc3VsdC5pc09rKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxIU3RhdHVzPih0cmFuc1Jlc3VsdCkgPT0gSFN0YXR1czo6Tk9fSU5JVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1CdWZmZXJzW2ldLmNsZWFyKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBmZXRjaEdyYXBoaWNCbG9jaygKKyAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLAorICAgICAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3QgZm9ybWF0LAorICAgICAgICAgICAgQzJNZW1vcnlVc2FnZSB1c2FnZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICAgICAgYmxvY2stPnJlc2V0KCk7CisgICAgICAgIGlmIChtSW5pdCAhPSBDMl9PSykgeworICAgICAgICAgICAgcmV0dXJuIG1Jbml0OworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGludCBrTWF4SWdicFJldHJ5RGVsYXlVcyA9IDEwMDAwOworCisgICAgICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBpZiAobUxhc3REcUxvZ1RzID09IDApIHsKKyAgICAgICAgICAgIG1MYXN0RHFMb2dUcyA9IGdldFRpbWVzdGFtcE5vdygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50NjRfdCBub3cgPSBnZXRUaW1lc3RhbXBOb3coKTsKKyAgICAgICAgICAgIGlmIChub3cgPj0gbUxhc3REcUxvZ1RzICsgNTAwMDAwMCkgeworICAgICAgICAgICAgICAgIGlmIChub3cgPj0gbUxhc3REcVRzICsgMTAwMDAwMCB8fCBtRHFGYWlsdXJlID4gNSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygibGFzdCBzdWNjZXNzZnVsIGRlcXVldWUgd2FzICVsbGQgdXMgYWdvLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICIlenUgY29uc2VjdXRpdmUgZmFpbHVyZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKShub3cgLSBtTGFzdERxVHMpLCBtRHFGYWlsdXJlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUxhc3REcUxvZ1RzID0gbm93OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChtUHJvZHVjZXJJZCA9PSAwKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQWxsb2NhdGlvbj4gYWxsb2M7CisgICAgICAgICAgICBjMl9zdGF0dXNfdCBlcnIgPSBtQWxsb2NhdG9yLT5uZXdHcmFwaGljQWxsb2NhdGlvbigKKyAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCB1c2FnZSwgJmFsbG9jKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhPiBwb29sRGF0YSA9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9zaGFyZWQ8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICh1aW50NjRfdCkwLCB+MCwgc2hhcmVkX2Zyb21fdGhpcygpKTsKKyAgICAgICAgICAgICpibG9jayA9IF9DMkJsb2NrRmFjdG9yeTo6Q3JlYXRlR3JhcGhpY0Jsb2NrKGFsbG9jLCBwb29sRGF0YSk7CisgICAgICAgICAgICBBTE9HVigiYWxsb2NhdGVkIGEgYnVmZmVyIHN1Y2Nlc3NmdWxseSIpOworCisgICAgICAgICAgICByZXR1cm4gQzJfT0s7CisgICAgICAgIH0KKyAgICAgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gZmV0Y2hGcm9tSWdicF9sKHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgdXNhZ2UsIGJsb2NrKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBDMl9CTE9DS0lORykgeworICAgICAgICAgICAgbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIC8vIGluIG9yZGVyIG5vdCB0byBkcmFpbiBjcHUgZnJvbSBjb21wb25lbnQncyBzcGlubmluZworICAgICAgICAgICAgOjp1c2xlZXAoa01heElnYnBSZXRyeURlbGF5VXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdm9pZCBzZXRSZW5kZXJDYWxsYmFjayhjb25zdCBPblJlbmRlckNhbGxiYWNrICZyZW5kZXJDYWxsYmFjaykgeworICAgICAgICBzdGQ6OnNjb3BlZF9sb2NrPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgbVJlbmRlckNhbGxiYWNrID0gcmVuZGVyQ2FsbGJhY2s7CisgICAgfQorCisgICAgdm9pZCBjb25maWd1cmVQcm9kdWNlcihjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAmcHJvZHVjZXIpIHsKKyAgICAgICAgdWludDY0X3QgcHJvZHVjZXJJZCA9IDA7CisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24gPSAwOworICAgICAgICBib29sIGhhdmVHZW5lcmF0aW9uID0gZmFsc2U7CisgICAgICAgIGlmIChwcm9kdWNlcikgeworICAgICAgICAgICAgUmV0dXJuPHVpbnQ2NF90PiB0cmFuc1Jlc3VsdCA9IHByb2R1Y2VyLT5nZXRVbmlxdWVJZCgpOworICAgICAgICAgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiY29uZmlndXJlUHJvZHVjZXIgLS0gZmFpbGVkIHRvIGNvbm5lY3QgdG8gdGhlIHByb2R1Y2VyIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJvZHVjZXJJZCA9IHN0YXRpY19jYXN0PHVpbnQ2NF90Pih0cmFuc1Jlc3VsdCk7CisgICAgICAgICAgICAvLyBUT0RPOiBwcm92aWRlIGduZXJhdGlvbiBudW1iZXIgZnJvbSBwYXJhbWV0ZXIuCisgICAgICAgICAgICBoYXZlR2VuZXJhdGlvbiA9IGdldEdlbmVyYXRpb25OdW1iZXIocHJvZHVjZXIsICZnZW5lcmF0aW9uKTsKKyAgICAgICAgICAgIGlmICghaGF2ZUdlbmVyYXRpb24pIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiZ2V0IGdlbmVyYXRpb25OdW1iZXIgZmFpbGVkICVsbHUiLAorICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpcHJvZHVjZXJJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50IG1pZ3JhdGVkID0gMDsKKyAgICAgICAgeworICAgICAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmZmVyc1tOVU1fQlVGRkVSX1NMT1RTXTsKKyAgICAgICAgICAgIHN0ZDo6d2Vha19wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE+CisgICAgICAgICAgICAgICAgICAgIHBvb2xEYXRhc1tOVU1fQlVGRkVSX1NMT1RTXTsKKyAgICAgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICAgICAgYm9vbCBub0luaXQgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0JVRkZFUl9TTE9UUzsgKytpKSB7CisgICAgICAgICAgICAgICAgaWYgKCFub0luaXQgJiYgbVByb2R1Y2VyKSB7CisgICAgICAgICAgICAgICAgICAgIFJldHVybjxIU3RhdHVzPiB0cmFuc1Jlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVByb2R1Y2VyLT5kZXRhY2hCdWZmZXIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oaSkpOworICAgICAgICAgICAgICAgICAgICBub0luaXQgPSAhdHJhbnNSZXN1bHQuaXNPaygpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhTdGF0dXM+KHRyYW5zUmVzdWx0KSA9PSBIU3RhdHVzOjpOT19JTklUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDMyX3Qgb2xkR2VuZXJhdGlvbiA9IG1HZW5lcmF0aW9uOworICAgICAgICAgICAgaWYgKHByb2R1Y2VyKSB7CisgICAgICAgICAgICAgICAgbVByb2R1Y2VyID0gcHJvZHVjZXI7CisgICAgICAgICAgICAgICAgbVByb2R1Y2VySWQgPSBwcm9kdWNlcklkOworICAgICAgICAgICAgICAgIG1HZW5lcmF0aW9uID0gaGF2ZUdlbmVyYXRpb24gPyBnZW5lcmF0aW9uIDogMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVByb2R1Y2VyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICBtUHJvZHVjZXJJZCA9IDA7CisgICAgICAgICAgICAgICAgbUdlbmVyYXRpb24gPSAwOworICAgICAgICAgICAgICAgIEFMT0dXKCJpbnZhbGlkIHByb2R1Y2VyIHByb2R1Y2VyKCVkKSwgZ2VuZXJhdGlvbiglZCkiLAorICAgICAgICAgICAgICAgICAgICAgIChib29sKXByb2R1Y2VyLCBoYXZlR2VuZXJhdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobVByb2R1Y2VyICYmIGhhdmVHZW5lcmF0aW9uKSB7IC8vIG1pZ3JhdGUgYnVmZmVycworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX0JVRkZFUl9TTE9UUzsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBvb2xEYXRhc1tpXS5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2xvdCA9IGRhdGEtPm1pZ3JhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9kdWNlciwgZ2VuZXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjZXJJZCwgbUJ1ZmZlcnMsIG9sZEdlbmVyYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNsb3QgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcnNbc2xvdF0gPSBtQnVmZmVyc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb29sRGF0YXNbc2xvdF0gPSBkYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrbWlncmF0ZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE5VTV9CVUZGRVJfU0xPVFM7ICsraSkgeworICAgICAgICAgICAgICAgIG1CdWZmZXJzW2ldID0gYnVmZmVyc1tpXTsKKyAgICAgICAgICAgICAgICBtUG9vbERhdGFzW2ldID0gcG9vbERhdGFzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwcm9kdWNlciAmJiBoYXZlR2VuZXJhdGlvbikgeworICAgICAgICAgICAgQUxPR0QoImxvY2FsIGdlbmVyYXRpb24gY2hhbmdlICV1ICwgIgorICAgICAgICAgICAgICAgICAgImJxSWQ6ICVsbHUgbWlncmF0ZWQgYnVmZmVycyAjICVkIiwKKyAgICAgICAgICAgICAgICAgIGdlbmVyYXRpb24sICh1bnNpZ25lZCBsb25nIGxvbmcpcHJvZHVjZXJJZCwgbWlncmF0ZWQpOworICAgICAgICB9CisgICAgfQorCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE7CisKKyAgICB2b2lkIGNhbmNlbCh1aW50MzJfdCBnZW5lcmF0aW9uLCB1aW50NjRfdCBpZ2JwX2lkLCBpbnQzMl90IGlnYnBfc2xvdCkgeworICAgICAgICBib29sIGNhbmNlbGxlZCA9IGZhbHNlOworICAgICAgICB7CisgICAgICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBpZiAoZ2VuZXJhdGlvbiA9PSBtR2VuZXJhdGlvbiAmJiBpZ2JwX2lkID09IG1Qcm9kdWNlcklkICYmIG1Qcm9kdWNlcikgeworICAgICAgICAgICAgKHZvaWQpbVByb2R1Y2VyLT5jYW5jZWxCdWZmZXIoaWdicF9zbG90LCBoaWRsX2hhbmRsZXt9KS5pc09rKCk7CisgICAgICAgICAgICBjYW5jZWxsZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCBtSW5pdDsKKyAgICB1aW50NjRfdCBtUHJvZHVjZXJJZDsKKyAgICB1aW50MzJfdCBtR2VuZXJhdGlvbjsKKyAgICBPblJlbmRlckNhbGxiYWNrIG1SZW5kZXJDYWxsYmFjazsKKworICAgIHNpemVfdCBtRHFGYWlsdXJlOworICAgIGludDY0X3QgbUxhc3REcVRzOworICAgIGludDY0X3QgbUxhc3REcUxvZ1RzOworCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyQWxsb2NhdG9yPiBtQWxsb2NhdG9yOworCisgICAgc3RkOjptdXRleCBtTXV0ZXg7CisgICAgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbVByb2R1Y2VyOworICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IG1TYXZlZFByb2R1Y2VyOworCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbUJ1ZmZlcnNbTlVNX0JVRkZFUl9TTE9UU107CisgICAgc3RkOjp3ZWFrX3B0cjxDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YT4gbVBvb2xEYXRhc1tOVU1fQlVGRkVSX1NMT1RTXTsKK307CisKK0MyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjpDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgKKyAgICAgICAgdWludDMyX3QgZ2VuZXJhdGlvbiwgdWludDY0X3QgYnFJZCwgaW50MzJfdCBicVNsb3QsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxpbnQ+JiBvd25lciwKKyAgICAgICAgY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIHByb2R1Y2VyKSA6CisgICAgICAgIGhlbGQocHJvZHVjZXIgJiYgYnFJZCAhPSAwKSwgbG9jYWwoZmFsc2UpLAorICAgICAgICBnZW5lcmF0aW9uKGdlbmVyYXRpb24pLCBicUlkKGJxSWQpLCBicVNsb3QoYnFTbG90KSwKKyAgICAgICAgdHJhbnNmZXIoZmFsc2UpLCBhdHRhY2goZmFsc2UpLCBkaXNwbGF5KGZhbHNlKSwKKyAgICAgICAgb3duZXIob3duZXIpLCBpZ2JwKHByb2R1Y2VyKSwKKyAgICAgICAgbG9jYWxQb29sKCkgeworfQorCitDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YTo6QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGEoCisgICAgICAgIHVpbnQzMl90IGdlbmVyYXRpb24sIHVpbnQ2NF90IGJxSWQsIGludDMyX3QgYnFTbG90LAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6SW1wbD4mIHBvb2wpIDoKKyAgICAgICAgaGVsZCh0cnVlKSwgbG9jYWwodHJ1ZSksCisgICAgICAgIGdlbmVyYXRpb24oZ2VuZXJhdGlvbiksIGJxSWQoYnFJZCksIGJxU2xvdChicVNsb3QpLAorICAgICAgICB0cmFuc2ZlcihmYWxzZSksIGF0dGFjaChmYWxzZSksIGRpc3BsYXkoZmFsc2UpLAorICAgICAgICBpZ2JwKHBvb2wgPyBwb29sLT5tUHJvZHVjZXIgOiBudWxscHRyKSwKKyAgICAgICAgbG9jYWxQb29sKHBvb2wpIHsKK30KKworQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbERhdGE6On5DMkJ1ZmZlclF1ZXVlQmxvY2tQb29sRGF0YSgpIHsKKyAgICBpZiAoIWhlbGQgfHwgYnFJZCA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGxvY2FsKSB7CisgICAgICAgIGlmIChsb2NhbFBvb2wpIHsKKyAgICAgICAgICAgIGxvY2FsUG9vbC0+Y2FuY2VsKGdlbmVyYXRpb24sIGJxSWQsIGJxU2xvdCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGlnYnAgJiYgIW93bmVyLmV4cGlyZWQoKSkgeworICAgICAgICBpZ2JwLT5jYW5jZWxCdWZmZXIoYnFTbG90LCBoaWRsX2hhbmRsZXt9KS5pc09rKCk7CisgICAgfQorfQoraW50IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2xEYXRhOjptaWdyYXRlKAorICAgICAgICBjb25zdCBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiYgcHJvZHVjZXIsCisgICAgICAgIHVpbnQzMl90IHRvR2VuZXJhdGlvbiwgdWludDY0X3QgdG9CcUlkLAorICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiAqYnVmZmVycywgdWludDMyX3Qgb2xkR2VuZXJhdGlvbikgeworICAgIHN0ZDo6c2NvcGVkX2xvY2s8c3RkOjptdXRleD4gbChsb2NrKTsKKyAgICBpZiAoIWhlbGQgfHwgYnFJZCA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJidWZmZXIgaXMgbm90IG93bmVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCFsb2NhbCB8fCAhbG9jYWxQb29sKSB7CisgICAgICAgIEFMT0dWKCJwb29sIGlzIG5vdCBsb2NhbCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChicVNsb3QgPCAwIHx8IGJxU2xvdCA+PSBOVU1fQlVGRkVSX1NMT1RTIHx8ICFidWZmZXJzW2JxU2xvdF0pIHsKKyAgICAgICAgQUxPR1YoInNsb3QgaXMgbm90IGluIGVmZmVjdCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICh0b0dlbmVyYXRpb24gPT0gZ2VuZXJhdGlvbiAmJiBicUlkID09IHRvQnFJZCkgeworICAgICAgICBBTE9HVigiY2Fubm90IG1pZ3JhdGUgdG8gc2FtZSBidWZmZXJxdWV1ZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChvbGRHZW5lcmF0aW9uICE9IGdlbmVyYXRpb24pIHsKKyAgICAgICAgQUxPR1YoImNhbm5vdCBtaWdyYXRlIHN0YWxlIGJ1ZmZlciIpOworICAgIH0KKyAgICBpZiAodHJhbnNmZXIpIHsKKyAgICAgICAgLy8gZWl0aGVyIHRyYW5zZmVycmVkIG9yIGRldGFjaGVkLgorICAgICAgICBBTE9HVigiYnVmZmVyIGlzIGluIHRyYW5zZmVyIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gY29uc3QmIGdyYXBoaWNCdWZmZXIgPSBidWZmZXJzW2JxU2xvdF07CisgICAgZ3JhcGhpY0J1ZmZlci0+c2V0R2VuZXJhdGlvbk51bWJlcih0b0dlbmVyYXRpb24pOworCisgICAgSEJ1ZmZlciBoQnVmZmVye307CisgICAgdWludDMyX3QgaEdlbmVyYXRpb25OdW1iZXJ7fTsKKyAgICBpZiAoIWIyaChncmFwaGljQnVmZmVyLCAmaEJ1ZmZlciwgJmhHZW5lcmF0aW9uTnVtYmVyKSkgeworICAgICAgICBBTE9HRCgiSSB0byBPIGNvbnZlcnNpb24gZmFpbGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBib29sIGNvbnZlcnRlZHt9OworICAgIHN0YXR1c190IGJTdGF0dXN7fTsKKyAgICBpbnQgc2xvdDsKKyAgICBpbnQgKm91dFNsb3QgPSAmc2xvdDsKKyAgICBSZXR1cm48dm9pZD4gdHJhbnNSZXN1bHQgPQorICAgICAgICAgICAgcHJvZHVjZXItPmF0dGFjaEJ1ZmZlcihoQnVmZmVyLCBoR2VuZXJhdGlvbk51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgWyZjb252ZXJ0ZWQsICZiU3RhdHVzLCBvdXRTbG90XSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIU3RhdHVzIGhTdGF0dXMsIGludDMyX3QgaFNsb3QsIGJvb2wgcmVsZWFzZUFsbCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udmVydGVkID0gaDJiKGhTdGF0dXMsICZiU3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpvdXRTbG90ID0gc3RhdGljX2Nhc3Q8aW50PihoU2xvdCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udmVydGVkICYmIHJlbGVhc2VBbGwgJiYgYlN0YXR1cyA9PSBhbmRyb2lkOjpPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJTdGF0dXMgPSBhbmRyb2lkOjpJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSk7CisgICAgaWYgKCF0cmFuc1Jlc3VsdC5pc09rKCkgfHwgIWNvbnZlcnRlZCB8fCBiU3RhdHVzICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIEFMT0dEKCJhdHRhY2ggZmFpbGVkICVkIiwgc3RhdGljX2Nhc3Q8aW50PihiU3RhdHVzKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgQUxPR1YoImxvY2FsIG1pZ3JhdGlvbiBmcm9tIGdlbiAldSA6ICV1IHNsb3QgJWQgOiAlZCIsCisgICAgICAgICAgZ2VuZXJhdGlvbiwgdG9HZW5lcmF0aW9uLCBicVNsb3QsIHNsb3QpOworICAgIGdlbmVyYXRpb24gPSB0b0dlbmVyYXRpb247CisgICAgYnFJZCA9IHRvQnFJZDsKKyAgICBicVNsb3QgPSBzbG90OworICAgIHJldHVybiBzbG90OworfQorCitDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjpDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sKAorICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+ICZhbGxvY2F0b3IsIGNvbnN0IGxvY2FsX2lkX3QgbG9jYWxJZCkKKyAgICAgICAgOiBtQWxsb2NhdG9yKGFsbG9jYXRvciksIG1Mb2NhbElkKGxvY2FsSWQpLCBtSW1wbChuZXcgSW1wbChhbGxvY2F0b3IpKSB7fQorCitDMkJ1ZmZlclF1ZXVlQmxvY2tQb29sOjp+QzJCdWZmZXJRdWV1ZUJsb2NrUG9vbCgpIHt9CisKK2MyX3N0YXR1c190IEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OmZldGNoR3JhcGhpY0Jsb2NrKAorICAgICAgICB1aW50MzJfdCB3aWR0aCwKKyAgICAgICAgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICB1aW50MzJfdCBmb3JtYXQsCisgICAgICAgIEMyTWVtb3J5VXNhZ2UgdXNhZ2UsCisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkdyYXBoaWNCbG9jaz4gKmJsb2NrIC8qIG5vbm51bGwgKi8pIHsKKyAgICBpZiAobUltcGwpIHsKKyAgICAgICAgcmV0dXJuIG1JbXBsLT5mZXRjaEdyYXBoaWNCbG9jayh3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHVzYWdlLCBibG9jayk7CisgICAgfQorICAgIHJldHVybiBDMl9DT1JSVVBURUQ7Cit9CisKK3ZvaWQgQzJCdWZmZXJRdWV1ZUJsb2NrUG9vbDo6Y29uZmlndXJlUHJvZHVjZXIoY29uc3Qgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gJnByb2R1Y2VyKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5jb25maWd1cmVQcm9kdWNlcihwcm9kdWNlcik7CisgICAgfQorfQorCit2b2lkIEMyQnVmZmVyUXVldWVCbG9ja1Bvb2w6OnNldFJlbmRlckNhbGxiYWNrKGNvbnN0IE9uUmVuZGVyQ2FsbGJhY2sgJnJlbmRlckNhbGxiYWNrKSB7CisgICAgaWYgKG1JbXBsKSB7CisgICAgICAgIG1JbXBsLT5zZXRSZW5kZXJDYWxsYmFjayhyZW5kZXJDYWxsYmFjayk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvdHlwZXMuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvdHlwZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YjFlOWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay90eXBlcy5jcHAKQEAgLTAsMCArMSwzMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPHVpL0J1ZmZlclF1ZXVlRGVmcy5oPgorI2luY2x1ZGUgPHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgorI2luY2x1ZGUgPHZuZGsvaGFyZHdhcmVfYnVmZmVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgZ3JhcGhpY3MgeworbmFtZXNwYWNlIGJ1ZmZlcnF1ZXVlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSB1dGlscyB7CisKKy8vIFRPRE86IG1vdmUgdGhpcyBpbnRvIHVpL0J1ZmZlclF1ZXVlRGVmcy5oIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZAorLy8gdG8gaW5jbHVkZSBoZWFkZXJzIGZyb20gbGliZ3VpLgorZW51bSB7CisgICAgLy8gVGhlIEFQSSBudW1iZXIgdXNlZCB0byBpbmRpY2F0ZSB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCBwcm9kdWNlcgorICAgIENVUlJFTlRMWV9DT05ORUNURURfQVBJID0gLTEsCisgICAgLy8gVGhlIEFQSSBudW1iZXIgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IG5vIHByb2R1Y2VyIGlzIGNvbm5lY3RlZAorICAgIE5PX0NPTk5FQ1RFRF9BUEkgICAgICAgID0gMCwKK307CisKKy8vIFN0YXR1cworLy8gPT09PT09CisKK2Jvb2wgYjJoKHN0YXR1c190IGZyb20sIEhTdGF0dXMqIHRvLAorICAgICAgICAgYm9vbCogYnVmZmVyTmVlZHNSZWFsbG9jYXRpb24sIGJvb2wqIHJlbGVhc2VBbGxCdWZmZXJzKSB7CisgICAgc3dpdGNoIChmcm9tKSB7CisgICAgY2FzZSBPSzoKKyAgICAgICAgKnRvID0gSFN0YXR1czo6T0s7IGJyZWFrOworICAgIGNhc2UgTk9fTUVNT1JZOgorICAgICAgICAqdG8gPSBIU3RhdHVzOjpOT19NRU1PUlk7IGJyZWFrOworICAgIGNhc2UgTk9fSU5JVDoKKyAgICAgICAgKnRvID0gSFN0YXR1czo6Tk9fSU5JVDsgYnJlYWs7CisgICAgY2FzZSBCQURfVkFMVUU6CisgICAgICAgICp0byA9IEhTdGF0dXM6OkJBRF9WQUxVRTsgYnJlYWs7CisgICAgY2FzZSBERUFEX09CSkVDVDoKKyAgICAgICAgKnRvID0gSFN0YXR1czo6REVBRF9PQkpFQ1Q7IGJyZWFrOworICAgIGNhc2UgSU5WQUxJRF9PUEVSQVRJT046CisgICAgICAgICp0byA9IEhTdGF0dXM6OklOVkFMSURfT1BFUkFUSU9OOyBicmVhazsKKyAgICBjYXNlIFRJTUVEX09VVDoKKyAgICAgICAgKnRvID0gSFN0YXR1czo6VElNRURfT1VUOyBicmVhazsKKyAgICBjYXNlIFdPVUxEX0JMT0NLOgorICAgICAgICAqdG8gPSBIU3RhdHVzOjpXT1VMRF9CTE9DSzsgYnJlYWs7CisgICAgY2FzZSBVTktOT1dOX0VSUk9SOgorICAgICAgICAqdG8gPSBIU3RhdHVzOjpVTktOT1dOX0VSUk9SOyBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBzdGF0dXNfdCBtYXNrID0KKyAgICAgICAgICAgICAgICAoYnVmZmVyTmVlZHNSZWFsbG9jYXRpb24gPyBCdWZmZXJRdWV1ZURlZnM6OkJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT04gOiAwKQorICAgICAgICAgICAgICAgIHwgKHJlbGVhc2VBbGxCdWZmZXJzID8gQnVmZmVyUXVldWVEZWZzOjpSRUxFQVNFX0FMTF9CVUZGRVJTIDogMCk7CisgICAgICAgIGlmIChmcm9tICYgfm1hc2spIHsKKyAgICAgICAgICAgICp0byA9IHN0YXRpY19jYXN0PEhTdGF0dXM+KGZyb20pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKnRvID0gSFN0YXR1czo6T0s7CisgICAgICAgICAgICBpZiAoYnVmZmVyTmVlZHNSZWFsbG9jYXRpb24pIHsKKyAgICAgICAgICAgICAgICAqYnVmZmVyTmVlZHNSZWFsbG9jYXRpb24gPSBmcm9tICYgQnVmZmVyUXVldWVEZWZzOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlbGVhc2VBbGxCdWZmZXJzKSB7CisgICAgICAgICAgICAgICAgKnJlbGVhc2VBbGxCdWZmZXJzID0gZnJvbSAmIEJ1ZmZlclF1ZXVlRGVmczo6UkVMRUFTRV9BTExfQlVGRkVSUzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBoMmIoSFN0YXR1cyBmcm9tLCBzdGF0dXNfdCogdG8pIHsKKyAgICBzd2l0Y2ggKGZyb20pIHsKKyAgICBjYXNlIEhTdGF0dXM6Ok9LOgorICAgICAgICAqdG8gPSBPSzsgYnJlYWs7CisgICAgY2FzZSBIU3RhdHVzOjpOT19NRU1PUlk6CisgICAgICAgICp0byA9IE5PX01FTU9SWTsgYnJlYWs7CisgICAgY2FzZSBIU3RhdHVzOjpOT19JTklUOgorICAgICAgICAqdG8gPSBOT19JTklUOyBicmVhazsKKyAgICBjYXNlIEhTdGF0dXM6OkJBRF9WQUxVRToKKyAgICAgICAgKnRvID0gQkFEX1ZBTFVFOyBicmVhazsKKyAgICBjYXNlIEhTdGF0dXM6OkRFQURfT0JKRUNUOgorICAgICAgICAqdG8gPSBERUFEX09CSkVDVDsgYnJlYWs7CisgICAgY2FzZSBIU3RhdHVzOjpJTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgKnRvID0gSU5WQUxJRF9PUEVSQVRJT047IGJyZWFrOworICAgIGNhc2UgSFN0YXR1czo6VElNRURfT1VUOgorICAgICAgICAqdG8gPSBUSU1FRF9PVVQ7IGJyZWFrOworICAgIGNhc2UgSFN0YXR1czo6V09VTERfQkxPQ0s6CisgICAgICAgICp0byA9IFdPVUxEX0JMT0NLOyBicmVhazsKKyAgICBjYXNlIEhTdGF0dXM6OlVOS05PV05fRVJST1I6CisgICAgICAgICp0byA9IFVOS05PV05fRVJST1I7IGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgICp0byA9IHN0YXRpY19jYXN0PHN0YXR1c190Pihmcm9tKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEZlbmNlCisvLyA9PT09PQorCitIRmVuY2VXcmFwcGVyOjpIRmVuY2VXcmFwcGVyKG5hdGl2ZV9oYW5kbGVfdCogaCkgOiBtSGFuZGxle2h9IHsKK30KKworSEZlbmNlV3JhcHBlcjo6fkhGZW5jZVdyYXBwZXIoKSB7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobUhhbmRsZSk7Cit9CisKK0hGZW5jZVdyYXBwZXImIEhGZW5jZVdyYXBwZXI6OnNldChuYXRpdmVfaGFuZGxlX3QqIGgpIHsKKyAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShtSGFuZGxlKTsKKyAgICBtSGFuZGxlID0gaDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK0hGZW5jZVdyYXBwZXImIEhGZW5jZVdyYXBwZXI6Om9wZXJhdG9yPShuYXRpdmVfaGFuZGxlX3QqIGgpIHsKKyAgICByZXR1cm4gc2V0KGgpOworfQorCitoaWRsX2hhbmRsZSBIRmVuY2VXcmFwcGVyOjpnZXRIYW5kbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGhpZGxfaGFuZGxle21IYW5kbGV9OworfQorCitIRmVuY2VXcmFwcGVyOjpvcGVyYXRvciBoaWRsX2hhbmRsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SGFuZGxlKCk7Cit9CisKK2Jvb2wgYjJoKHNwPEJGZW5jZT4gY29uc3QmIGZyb20sIEhGZW5jZVdyYXBwZXIqIHRvKSB7CisgICAgaWYgKCFmcm9tKSB7CisgICAgICAgIHRvLT5zZXQobnVsbHB0cik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpbnQgZmVuY2VGZCA9IGZyb20tPmdldCgpOworICAgIGlmIChmZW5jZUZkID09IC0xKSB7CisgICAgICAgIHRvLT5zZXQobnVsbHB0cik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBuYXRpdmVfaGFuZGxlX3QqIG5oID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7CisgICAgaWYgKCFuaCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG5oLT5kYXRhWzBdID0gZmVuY2VGZDsKKyAgICB0by0+c2V0KG5oKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBoMmIobmF0aXZlX2hhbmRsZV90IGNvbnN0KiBmcm9tLCBzcDxCRmVuY2U+KiB0bykgeworICAgIGlmICghZnJvbSB8fCBmcm9tLT5udW1GZHMgPT0gMCkgeworICAgICAgICAqdG8gPSBuZXcgOjphbmRyb2lkOjpGZW5jZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGZyb20tPm51bUZkcyAhPSAxIHx8IGZyb20tPm51bUludHMgIT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgICp0byA9IG5ldyBCRmVuY2UoZHVwKGZyb20tPmRhdGFbMF0pKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gQ29ubmVjdGlvblR5cGUKKy8vID09PT09PT09PT09PT09CisKK2Jvb2wgYjJoKGludCBmcm9tLCBIQ29ubmVjdGlvblR5cGUqIHRvKSB7CisgICAgKnRvID0gc3RhdGljX2Nhc3Q8SENvbm5lY3Rpb25UeXBlPihmcm9tKTsKKyAgICBzd2l0Y2ggKGZyb20pIHsKKyAgICBjYXNlIENVUlJFTlRMWV9DT05ORUNURURfQVBJOgorICAgICAgICAqdG8gPSBIQ29ubmVjdGlvblR5cGU6OkNVUlJFTlRMWV9DT05ORUNURUQ7IGJyZWFrOworICAgIGNhc2UgTkFUSVZFX1dJTkRPV19BUElfRUdMOgorICAgICAgICAqdG8gPSBIQ29ubmVjdGlvblR5cGU6OkVHTDsgYnJlYWs7CisgICAgY2FzZSBOQVRJVkVfV0lORE9XX0FQSV9DUFU6CisgICAgICAgICp0byA9IEhDb25uZWN0aW9uVHlwZTo6Q1BVOyBicmVhazsKKyAgICBjYXNlIE5BVElWRV9XSU5ET1dfQVBJX01FRElBOgorICAgICAgICAqdG8gPSBIQ29ubmVjdGlvblR5cGU6Ok1FRElBOyBicmVhazsKKyAgICBjYXNlIE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQToKKyAgICAgICAgKnRvID0gSENvbm5lY3Rpb25UeXBlOjpDQU1FUkE7IGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBoMmIoSENvbm5lY3Rpb25UeXBlIGZyb20sIGludCogdG8pIHsKKyAgICAqdG8gPSBzdGF0aWNfY2FzdDxpbnQ+KGZyb20pOworICAgIHN3aXRjaCAoZnJvbSkgeworICAgIGNhc2UgSENvbm5lY3Rpb25UeXBlOjpDVVJSRU5UTFlfQ09OTkVDVEVEOgorICAgICAgICAqdG8gPSBDVVJSRU5UTFlfQ09OTkVDVEVEX0FQSTsgYnJlYWs7CisgICAgY2FzZSBIQ29ubmVjdGlvblR5cGU6OkVHTDoKKyAgICAgICAgKnRvID0gTkFUSVZFX1dJTkRPV19BUElfRUdMOyBicmVhazsKKyAgICBjYXNlIEhDb25uZWN0aW9uVHlwZTo6Q1BVOgorICAgICAgICAqdG8gPSBOQVRJVkVfV0lORE9XX0FQSV9DUFU7IGJyZWFrOworICAgIGNhc2UgSENvbm5lY3Rpb25UeXBlOjpNRURJQToKKyAgICAgICAgKnRvID0gTkFUSVZFX1dJTkRPV19BUElfTUVESUE7IGJyZWFrOworICAgIGNhc2UgSENvbm5lY3Rpb25UeXBlOjpDQU1FUkE6CisgICAgICAgICp0byA9IE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQTsgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBSZWN0CisvLyA9PT09CisKK2Jvb2wgYjJoKEJSZWN0IGNvbnN0JiBmcm9tLCBIUmVjdCogdG8pIHsKKyAgICBCUmVjdCogZHN0ID0gcmVpbnRlcnByZXRfY2FzdDxCUmVjdCo+KHRvLT5kYXRhKCkpOworICAgIGRzdC0+bGVmdCA9IGZyb20ubGVmdDsKKyAgICBkc3QtPnRvcCA9IGZyb20udG9wOworICAgIGRzdC0+cmlnaHQgPSBmcm9tLnJpZ2h0OworICAgIGRzdC0+Ym90dG9tID0gZnJvbS5ib3R0b207CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgaDJiKEhSZWN0IGNvbnN0JiBmcm9tLCBCUmVjdCogdG8pIHsKKyAgICBCUmVjdCBjb25zdCogc3JjID0gcmVpbnRlcnByZXRfY2FzdDxCUmVjdCBjb25zdCo+KGZyb20uZGF0YSgpKTsKKyAgICB0by0+bGVmdCA9IHNyYy0+bGVmdDsKKyAgICB0by0+dG9wID0gc3JjLT50b3A7CisgICAgdG8tPnJpZ2h0ID0gc3JjLT5yaWdodDsKKyAgICB0by0+Ym90dG9tID0gc3JjLT5ib3R0b207CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFJlZ2lvbgorLy8gPT09PT09CisKK2Jvb2wgYjJoKEJSZWdpb24gY29uc3QmIGZyb20sIEhSZWdpb24qIHRvKSB7CisgICAgc2l6ZV90IG51bVJlY3RzOworICAgIEJSZWN0IGNvbnN0KiByZWN0QXJyYXkgPSBmcm9tLmdldEFycmF5KCZudW1SZWN0cyk7CisgICAgdG8tPnJlc2l6ZShudW1SZWN0cyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1SZWN0czsgKytpKSB7CisgICAgICAgIGlmICghYjJoKHJlY3RBcnJheVtpXSwgJigqdG8pW2ldKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIGgyYihIUmVnaW9uIGNvbnN0JiBmcm9tLCBCUmVnaW9uKiB0bykgeworICAgIGlmIChmcm9tLnNpemUoKSA+IDApIHsKKyAgICAgICAgQlJlY3QgYlJlY3Q7CisgICAgICAgIGlmICghaDJiKGZyb21bMF0sICZiUmVjdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICB0by0+c2V0KGJSZWN0KTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBmcm9tLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICBpZiAoIWgyYihmcm9tW2ldLCAmYlJlY3QpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdG8tPmFkZFJlY3RVbmNoZWNrZWQoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oYlJlY3QubGVmdCksCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oYlJlY3QudG9wKSwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihiUmVjdC5yaWdodCksCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oYlJlY3QuYm90dG9tKSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB0by0+Y2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIEdyYXBoaWNCdWZmZXIKKy8vID09PT09PT09PT09PT0KKworLy8gVGhlIGhhbmRsZSBpcyBub3QgY2xvbmVkLiBJdHMgbGlmZXRpbWUgaXMgdGllZCB0byB0aGUgb3JpZ2luYWwgR3JhcGhpY0J1ZmZlci4KK2Jvb2wgYjJoKHNwPEdyYXBoaWNCdWZmZXI+IGNvbnN0JiBmcm9tLCBIYXJkd2FyZUJ1ZmZlciogdG8sCisgICAgICAgICB1aW50MzJfdCogdG9HZW5lcmF0aW9uTnVtYmVyKSB7CisgICAgaWYgKCFmcm9tKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQUhhcmR3YXJlQnVmZmVyKiBod0J1ZmZlciA9IGZyb20tPnRvQUhhcmR3YXJlQnVmZmVyKCk7CisgICAgdG8tPm5hdGl2ZUhhbmRsZS5zZXRUbygKKyAgICAgICAgICBjb25zdF9jYXN0PG5hdGl2ZV9oYW5kbGVfdCo+KAorICAgICAgICAgICAgICBBSGFyZHdhcmVCdWZmZXJfZ2V0TmF0aXZlSGFuZGxlKGh3QnVmZmVyKSksCisgICAgICAgICAgZmFsc2UpOworICAgIEFIYXJkd2FyZUJ1ZmZlcl9kZXNjcmliZSgKKyAgICAgICAgICAgIGh3QnVmZmVyLAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBSGFyZHdhcmVCdWZmZXJfRGVzYyo+KHRvLT5kZXNjcmlwdGlvbi5kYXRhKCkpKTsKKyAgICBpZiAodG9HZW5lcmF0aW9uTnVtYmVyKSB7CisgICAgICAgICp0b0dlbmVyYXRpb25OdW1iZXIgPSBmcm9tLT5nZXRHZW5lcmF0aW9uTnVtYmVyKCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyBUaGUgaGFuZGxlIGlzIGNsb25lZC4KK2Jvb2wgaDJiKEhhcmR3YXJlQnVmZmVyIGNvbnN0JiBmcm9tLCBzcDxHcmFwaGljQnVmZmVyPiogdG8pIHsKKyAgICBBSGFyZHdhcmVCdWZmZXJfRGVzYyBjb25zdCogZGVzYyA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFIYXJkd2FyZUJ1ZmZlcl9EZXNjIGNvbnN0Kj4oCisgICAgICAgICAgICBmcm9tLmRlc2NyaXB0aW9uLmRhdGEoKSk7CisgICAgbmF0aXZlX2hhbmRsZV90IGNvbnN0KiBoYW5kbGUgPSBmcm9tLm5hdGl2ZUhhbmRsZTsKKyAgICBBSGFyZHdhcmVCdWZmZXIqIGh3QnVmZmVyOworICAgIGlmIChBSGFyZHdhcmVCdWZmZXJfY3JlYXRlRnJvbUhhbmRsZSgKKyAgICAgICAgICAgIGRlc2MsIGhhbmRsZSwgQUhBUkRXQVJFQlVGRkVSX0NSRUFURV9GUk9NX0hBTkRMRV9NRVRIT0RfQ0xPTkUsCisgICAgICAgICAgICAmaHdCdWZmZXIpICE9IE9LKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgKnRvID0gR3JhcGhpY0J1ZmZlcjo6ZnJvbUFIYXJkd2FyZUJ1ZmZlcihod0J1ZmZlcik7CisgICAgQUhhcmR3YXJlQnVmZmVyX3JlbGVhc2UoaHdCdWZmZXIpOworICAgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgdXRpbHMKK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2UgYnVmZmVycXVldWUKK30gIC8vIG5hbWVzcGFjZSBncmFwaGljcworfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyRGVidWcuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkRlYnVnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNGFhNzE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkRlYnVnLmNwcApAQCAtMCwwICsxLDI3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxDMlBhcmFtSW50ZXJuYWwuaD4KKyNpbmNsdWRlIDx1dGlsL0MyRGVidWctaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLXBhcmFtLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZVV0aWxzLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKwordXNpbmcgYW5kcm9pZDo6YmFzZTo6U3RyaW5nUHJpbnRmOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBhc1N0cmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitjb25zdCBjaGFyICphc1N0cmluZyhjMl9zdGF0dXNfdCBpLCBjb25zdCBjaGFyICpkZWYpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBDMl9PSzogICAgICAgIHJldHVybiAiT0siOworICAgICAgICBjYXNlIEMyX0JBRF9WQUxVRTogcmV0dXJuICJCQURfVkFMVUUiOworICAgICAgICBjYXNlIEMyX0JBRF9JTkRFWDogcmV0dXJuICJCQURfSU5ERVgiOworICAgICAgICBjYXNlIEMyX0NBTk5PVF9ETzogcmV0dXJuICJDQU5OT1RfRE8iOworICAgICAgICBjYXNlIEMyX0RVUExJQ0FURTogcmV0dXJuICJEVVBMSUNBVEUiOworICAgICAgICBjYXNlIEMyX05PVF9GT1VORDogcmV0dXJuICJOT1RfRk9VTkQiOworICAgICAgICBjYXNlIEMyX0JBRF9TVEFURTogcmV0dXJuICJCQURfU1RBVEUiOworICAgICAgICBjYXNlIEMyX0JMT0NLSU5HOiAgcmV0dXJuICJCTE9DS0lORyI7CisgICAgICAgIGNhc2UgQzJfQ0FOQ0VMRUQ6ICByZXR1cm4gIkNBTkNFTEVEIjsKKyAgICAgICAgY2FzZSBDMl9OT19NRU1PUlk6IHJldHVybiAiTk9fTUVNT1JZIjsKKyAgICAgICAgY2FzZSBDMl9SRUZVU0VEOiAgIHJldHVybiAiUkVGVVNFRCI7CisgICAgICAgIGNhc2UgQzJfVElNRURfT1VUOiByZXR1cm4gIlRJTUVEX09VVCI7CisgICAgICAgIGNhc2UgQzJfT01JVFRFRDogICByZXR1cm4gIk9NSVRURUQiOworICAgICAgICBjYXNlIEMyX0NPUlJVUFRFRDogcmV0dXJuICJDT1JSVVBURUQiOworICAgICAgICBjYXNlIEMyX05PX0lOSVQ6ICAgcmV0dXJuICJOT19JTklUIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCitjb25zdCBjaGFyICphc1N0cmluZyhDMkZpZWxkRGVzY3JpcHRvcjo6dHlwZV90IGksIGNvbnN0IGNoYXIgKmRlZikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COiAgIHJldHVybiAidTgiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSMzI6IHJldHVybiAiYzMyIjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6Q05UUjY0OiByZXR1cm4gImM2NCI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkZMT0FUOiAgcmV0dXJuICJmcCI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOiAgcmV0dXJuICJpMzIiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpJTlQ2NDogIHJldHVybiAiaTY0IjsKKyAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOiByZXR1cm4gImNociI7CisgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjogcmV0dXJuICJ1MzIiOworICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UNjQ6IHJldHVybiAidTY0IjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIChpICYgQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHKSA/ICJzdHJ1Y3QiIDogZGVmOworICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyUGFyYW1GaWVsZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHN0ZDo6c3RyaW5nIGF0dHJpYlBhcmFtQ29yZUluZGV4KGNvbnN0IEMyUGFyYW06OkNvcmVJbmRleCAmaSkgeworICAgIHJldHVybiBTdHJpbmdQcmludGYoIiVjJWMlMDN4IiwKKyAgICAgICAgICAgIGkuaXNGbGV4aWJsZSgpID8gJ0YnIDogJy0nLAorICAgICAgICAgICAgaS5pc1ZlbmRvcigpID8gJ1YnIDogJy0nLAorICAgICAgICAgICAgaS5jb3JlSW5kZXgoKSk7Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBhdHRyaWJQYXJhbUluZGV4KAorICAgICAgICBjb25zdCBDMlBhcmFtOjpUeXBlICZpLCBib29sIGFkZFN0cmVhbSwgdW5zaWduZWQgc3RyZWFtSWQpIHsKKyAgICBzdGQ6OnN0cmluZyB2ID0gU3RyaW5nUHJpbnRmKCIlYyVjIiwKKyAgICAgICAgICAgIGkuZm9ySW5wdXQoKSA/ICdJJyA6IGkuZm9yT3V0cHV0KCkgPyAnTycgOiAnLScsCisgICAgICAgICAgICBpLmZvclN0cmVhbSgpID8gJ1MnIDogaS5mb3JQb3J0KCkgPyAnUCcgOiAnRycpOworICAgIGlmIChhZGRTdHJlYW0pIHsKKyAgICAgICAgaWYgKGkuZm9yU3RyZWFtKCkpIHsKKyAgICAgICAgICAgIHYgKz0gU3RyaW5nUHJpbnRmKCIlMDJkIiwgc3RyZWFtSWQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdiArPSAiLS0iOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHYKKyAgICAgICAgICAgICsgU3RyaW5nUHJpbnRmKCIlYyAiLAorICAgICAgICAgICAgICAgICAgICAgICBpLmtpbmQoKSA9PSBDMlBhcmFtOjpTVFJVQ1QgID8gJ1MnIDoKKyAgICAgICAgICAgICAgICAgICAgICAgaS5raW5kKCkgPT0gQzJQYXJhbTo6SU5GTyAgICA/ICdpJyA6CisgICAgICAgICAgICAgICAgICAgICAgIGkua2luZCgpID09IEMyUGFyYW06OlRVTklORyAgPyAndCcgOgorICAgICAgICAgICAgICAgICAgICAgICBpLmtpbmQoKSA9PSBDMlBhcmFtOjpTRVRUSU5HID8gJ3MnIDoKKyAgICAgICAgICAgICAgICAgICAgICAgaS5raW5kKCkgPT0gQzJQYXJhbTo6Tk9ORSAgICA/ICctJyA6ICc/JykKKyAgICAgICAgICAgICsgYXR0cmliUGFyYW1Db3JlSW5kZXgoaSk7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtOjpDb3JlSW5kZXggJmkpIHsKKyAgICByZXR1cm4gb3MgPDwgIlBhcmFtOjpDb3JlSW5kZXgoIiA8PCBhdHRyaWJQYXJhbUNvcmVJbmRleChpKSA8PCAiKSI7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtOjpUeXBlICZpKSB7CisgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiUGFyYW06OlR5cGUoJTA4eDogIiwgaS50eXBlKCkpCisgICAgICAgICAgICA8PCBhdHRyaWJQYXJhbUluZGV4KGksIGZhbHNlLCAwKSA8PCAiKSI7Cit9CisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtOjpJbmRleCAmaSkgeworICAgIHJldHVybiBvcyA8PCBTdHJpbmdQcmludGYoIlBhcmFtOjpJbmRleCglMDh4OiAiLCAodWludDMyX3QpaSkKKyAgICAgICAgICAgIDw8IGF0dHJpYlBhcmFtSW5kZXgoaSwgdHJ1ZSwgaS5zdHJlYW0oKSkgPDwgIikiOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgYXR0cmliRmllbGRJZChjb25zdCBfQzJGaWVsZElkICZpKSB7CisgICAgcmV0dXJuIFN0cmluZ1ByaW50ZigiRmllbGQoQCUwMngrJTAyeCkiLAorICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChpKSwKKyAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKGkpKTsKK30KKworCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgX0MyRmllbGRJZCAmaSkgeworICAgIHJldHVybiBvcyA8PCAiPCIgPDwgYXR0cmliRmllbGRJZChpKSA8PCAiPiI7Cit9CisKKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZpKSB7CisgICAgb3MgPDwgYXR0cmliRmllbGRJZChfQzJQYXJhbUluc3BlY3Rvcjo6R2V0RmllbGQoaSkpIDw8ICIgIjsKKyAgICBpZiAoaS5uYW1lZFZhbHVlcygpLnNpemUoKSkgeworICAgICAgICBvcyA8PCAiZW51bSAiOworICAgIH0KKyAgICByZXR1cm4gb3MgPDwgYXNTdHJpbmcoaS50eXBlKCkpIDw8ICIgIiA8PCBpLm5hbWUoKQorICAgICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCJbJXp1XSIsIGkuZXh0ZW50KCkpOworfQorCisKK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlBhcmFtRmllbGQgJmkpIHsKKyAgICBvcyA8PCAiPCIgPDwgQzJQYXJhbTo6SW5kZXgoX0MyUGFyYW1JbnNwZWN0b3I6OkdldEluZGV4KGkpKQorICAgICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCI6OkZpZWxkKEAlMDJ4KyUwMngpPiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0U2l6ZShpKSk7CisgICAgcmV0dXJuIG9zOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIF9DMkZpZWxkVmFsdWVIZWxwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RkOjpvc3RyZWFtJiBfQzJGaWVsZFZhbHVlSGVscGVyPGNoYXI+OjpwdXQoc3RkOjpvc3RyZWFtICZvcywgY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZwKSB7CisgICAgaWYgKGlzcHJpbnQocC5pMzIpKSB7CisgICAgICAgIHJldHVybiBvcyA8PCBTdHJpbmdQcmludGYoIiclYyciLCBwLmkzMik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG9zIDw8IFN0cmluZ1ByaW50ZigiJ1xceCUwMngnIiwgKHVpbnQzMl90KXAuaTMyKTsKKyAgICB9Cit9CisKK3N0ZDo6b3N0cmVhbSYgX0MyRmllbGRWYWx1ZUhlbHBlcjx1aW50OF90Pjo6cHV0KHN0ZDo6b3N0cmVhbSAmb3MsIGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCkgeworICAgIHJldHVybiBvcyA8PCBTdHJpbmdQcmludGYoIjB4JTAyeCIsIHAudTMyKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0gJm9zLCBjb25zdCBjMl9jbnRyX3Q8VD4gJnYpIHsKKyAgICByZXR1cm4gb3MgPDwgImN0cigiIDw8IHYucGVla3UoKSA8PCAiKSI7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmaSkgeworICAgIG9zIDw8ICJSYW5nZSgiOworICAgIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OnB1dChvcywgaS5taW4oKSk7CisgICAgb3MgPDwgIi4uIjsKKyAgICBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpwdXQob3MsIGkubWF4KCkpOworICAgIG9zIDw8ICIgKj0gIiA8PCBpLm51bSgpIDw8ICIgLz0gIiA8PCBpLmRlbm9tKCkgPDwgIiArPSAiIDw8IGkuc3RlcCgpIDw8ICIpIjsKKyAgICByZXR1cm4gb3M7Cit9Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxjaGFyPiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTx1aW50OF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxpbnQzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTx1aW50MzJfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxjMl9jbnRyMzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8aW50NjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8dWludDY0X3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8YzJfY250cjY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFJhbmdlPGZsb2F0PiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmaSkgeworICAgIG9zIDw8ICJGbGFnc1siOworICAgIGlmICghaS5pc0VtcHR5KCkpIHsKKyAgICAgICAgb3MgPDwgIm1pbj0iOworICAgICAgICBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpwdXQob3MsIGkubWluKCkpOworICAgIH0KKyAgICBib29sIGNvbW1hID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBUICZ2IDogaS5mbGFncygpKSB7CisgICAgICAgIGlmIChjb21tYSkgeworICAgICAgICAgICAgb3MgPDwgIiwgIjsKKyAgICAgICAgfQorICAgICAgICBfQzJGaWVsZFZhbHVlSGVscGVyPFQ+OjpwdXQob3MsIHYpOworICAgICAgICBjb21tYSA9IHRydWU7CisgICAgfQorICAgIG9zIDw8ICJdIjsKKyAgICByZXR1cm4gb3M7Cit9Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxjaGFyPiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczx1aW50OF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxpbnQzMl90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczx1aW50MzJfdD4gJmkpOworLy90ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxjMl9jbnRyMzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8aW50NjRfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8dWludDY0X3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8YzJfY250cjY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGZsb2F0PiAmaSk7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmaSkgeworICAgIG9zIDw8ICJWYWx1ZXNbIjsKKyAgICBib29sIGNvbW1hID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBUICZ2IDogaS52YWx1ZXMoKSkgeworICAgICAgICBpZiAoY29tbWEpIHsKKyAgICAgICAgICAgIG9zIDw8ICIsICI7CisgICAgICAgIH0KKyAgICAgICAgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6cHV0KG9zLCB2KTsKKyAgICAgICAgY29tbWEgPSB0cnVlOworICAgIH0KKyAgICBvcyA8PCAiXSI7CisgICAgcmV0dXJuIG9zOworfQordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8Y2hhcj4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDhfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8aW50MzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8dWludDMyX3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8YzJfY250cjMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PGludDY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PHVpbnQ2NF90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PGMyX2NudHI2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxmbG9hdD4gJmkpOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46OkltcGwgeworICAgIEltcGwoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKTsKKworcHJpdmF0ZToKKyAgICB0eXBlZGVmIHR5cGVuYW1lIF9DMkZpZWxkVmFsdWVIZWxwZXI8VD46OlZhbHVlVHlwZSBWYWx1ZVR5cGU7CisgICAgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6dHlwZV90IF9tVHlwZTsKKyAgICBDMlN1cHBvcnRlZFJhbmdlPFZhbHVlVHlwZT4gX21SYW5nZTsKKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFZhbHVlVHlwZT4gX21WYWx1ZXM7CisgICAgQzJTdXBwb3J0ZWRGbGFnczxWYWx1ZVR5cGU+IF9tRmxhZ3M7CisKK3B1YmxpYzoKKy8vICAgIGZyaWVuZCBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwgPFQ+KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46OkltcGwgJmkpOworLy8gICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBJbXBsICZpKTsKKyAgICBzdGQ6Om9zdHJlYW0mIHN0cmVhbU91dChzdGQ6Om9zdHJlYW0mIG9zKSBjb25zdDsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdGQ6Om9zdHJlYW0mIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46OkltcGw6OnN0cmVhbU91dChzdGQ6Om9zdHJlYW0mIG9zKSBjb25zdCB7CisgICAgaWYgKF9tVHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpSQU5HRSkgeworICAgICAgICBvcyA8PCBfbVJhbmdlOworICAgIH0gZWxzZSBpZiAoX21UeXBlID09IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM6OlZBTFVFUykgeworICAgICAgICBvcyA8PCBfbVZhbHVlczsKKyAgICB9IGVsc2UgaWYgKF9tVHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpGTEFHUykgeworICAgICAgICBvcyA8PCBfbUZsYWdzOworICAgIH0gZWxzZSB7CisgICAgICAgIG9zIDw8ICJVbmtub3duIEZTViB0eXBlOiAiIDw8ICh1aW50MzJfdClfbVR5cGU7CisgICAgfQorICAgIHJldHVybiBvczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+ICZpKSB7CisgICAgcmV0dXJuIGkuX21JbXBsLT5zdHJlYW1PdXQob3MpOworfQordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8Y2hhcj4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDhfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8aW50MzJfdD4gJmkpOwordGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDMyX3Q+ICZpKTsKKy8vdGVtcGxhdGUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8YzJfY250cjMyX3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGludDY0X3Q+ICZpKTsKK3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPHVpbnQ2NF90PiAmaSk7CisvL3RlbXBsYXRlIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGMyX2NudHI2NF90PiAmaSk7Cit0ZW1wbGF0ZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxmbG9hdD4gJmkpOworCmRpZmYgLS1naXQgYS9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MySW50ZXJmYWNlSGVscGVyLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VIZWxwZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYjUyZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MySW50ZXJmYWNlSGVscGVyLmNwcApAQCAtMCwwICsxLDg3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxDMkRlYnVnLmg+CisjaW5jbHVkZSA8QzJQYXJhbUludGVybmFsLmg+CisjaW5jbHVkZSA8dXRpbC9DMkludGVyZmFjZUhlbHBlci5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmJhc2U6OlN0cmluZ1ByaW50ZjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFJlZmxlY3RvckhlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCBDMlJlZmxlY3RvckhlbHBlcjo6YWRkU3RydWN0RGVzY3JpcHRvcnMoCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyU3RydWN0RGVzY3JpcHRvcj4gJnN0cnVjdHMsIF9UdXBsZTw+ICopIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhfbU11dGV4KTsKKyAgICBmb3IgKEMyU3RydWN0RGVzY3JpcHRvciAmc3RydWt0IDogc3RydWN0cykgeworICAgICAgICAvLyBUT0RPOiBjaGVjayBpZiBzdHJ1Y3R1cmUgZGVzY3JpcHRpb25zIGNvbmZsaWN0IHdpdGggZXhpc3Rpbmcgb25lcworICAgICAgICBhZGRTdHJ1Y3REZXNjcmlwdG9yKHN0ZDo6bW92ZShzdHJ1a3QpKTsKKyAgICB9Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxDMlN0cnVjdERlc2NyaXB0b3I+CitDMlJlZmxlY3RvckhlbHBlcjo6ZGVzY3JpYmUoQzJQYXJhbTo6Q29yZUluZGV4IHBhcmFtSW5kZXgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhfbU11dGV4KTsKKyAgICBhdXRvIGl0ID0gX21TdHJ1Y3RzLmZpbmQocGFyYW1JbmRleCk7CisgICAgaWYgKGl0ID09IF9tU3RydWN0cy5lbmQoKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxDMlN0cnVjdERlc2NyaXB0b3I+KGl0LT5zZWNvbmQpOworICAgIH0KK307CisKK3ZvaWQgQzJSZWZsZWN0b3JIZWxwZXI6OmFkZFN0cnVjdERlc2NyaXB0b3IoQzJTdHJ1Y3REZXNjcmlwdG9yICYmc3RydWt0KSB7CisgICAgaWYgKF9tU3RydWN0cy5maW5kKHN0cnVrdC5jb3JlSW5kZXgoKSkgIT0gX21TdHJ1Y3RzLmVuZCgpKSB7CisgICAgICAgIC8vIGFscmVhZHkgYWRkZWQKKyAgICAgICAgLy8gVE9ETzogdmFsaWRhdGUgdGhhdCBkZXNjcmlwdG9yIG1hdGNoZXMgc3RvcmVkIGRlc2NyaXB0b3IKKyAgICB9CisgICAgLy8gdmFsaWRhdGUgdGhhdCBhbGwgc3RydWN0IGZpZWxkcyBhcmUga25vd24gdG8gdGhpcyByZWZsZWN0b3IKKyAgICBmb3IgKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmZCA6IHN0cnVrdCkgeworICAgICAgICBpZiAoZmQudHlwZSgpICYgQzJGaWVsZERlc2NyaXB0b3I6OlNUUlVDVF9GTEFHKSB7CisgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggY29yZUluZGV4ID0gZmQudHlwZSgpICZ+IEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRzsKKyAgICAgICAgICAgIGlmIChfbVN0cnVjdHMuZmluZChjb3JlSW5kZXgpID09IF9tU3RydWN0cy5lbmQoKSkgeworICAgICAgICAgICAgICAgIEMyX0xPRyhJTkZPKSA8PCAibWlzc2luZyBzdHJ1Y3QgZGVzY3JpcHRvciAjIiA8PCBjb3JlSW5kZXggPDwgIiBmb3IgZmllbGQgIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgZmQubmFtZSgpIDw8ICIgb2Ygc3RydWN0ICMiIDw8IHN0cnVrdC5jb3JlSW5kZXgoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBfbVN0cnVjdHMuZW1wbGFjZShzdHJ1a3QuY29yZUluZGV4KCksIHN0cnVrdCk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBQYXJhbUhlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2NsYXNzIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6SW1wbCB7CitwdWJsaWM6CisgICAgSW1wbChQYXJhbVJlZiBwYXJhbSwgQzJTdHJpbmdMaXRlcmFsIG5hbWUsIEMyU3RydWN0RGVzY3JpcHRvciAmJnN0cnVrdCkKKyAgICAgICAgOiBtUGFyYW0ocGFyYW0pLCBtTmFtZShuYW1lKSwgX21TdHJ1Y3Qoc3RydWt0KSB7IH0KKworICAgIEltcGwoSW1wbCYmKSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIGFkZERvd25EZXBlbmRlbmN5KEMyUGFyYW06OkluZGV4IGluZGV4KSB7CisgICAgICAgIG1Eb3duRGVwZW5kZW5jaWVzLnB1c2hfYmFjayhpbmRleCk7CisgICAgfQorCisgICAgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjphdHRyaWJfdCYgYXR0cmliKCkgeworICAgICAgICByZXR1cm4gbUF0dHJpYjsKKyAgICB9CisKKyAgICB2b2lkIGJ1aWxkKCkgeworICAgICAgICAvLyBtb3ZlIGRlcGVuZGVuY2llcyBpbnRvIGRlc2NyaXB0b3IKKyAgICAgICAgbURlc2NyaXB0b3IgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUGFyYW1EZXNjcmlwdG9yPigKKyAgICAgICAgICAgICAgICBpbmRleCgpLCAoQzJQYXJhbURlc2NyaXB0b3I6OmF0dHJpYl90KW1BdHRyaWIsCisgICAgICAgICAgICAgICAgc3RkOjptb3ZlKG1OYW1lKSwgc3RkOjptb3ZlKG1EZXBlbmRlbmNpZXMpKTsKKyAgICB9CisKKyAgICB2b2lkIGNyZWF0ZUZpZWxkc0FuZFN1cHBvcnRlZFZhbHVlcyhjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvcikgeworICAgICAgICBmb3IgKGNvbnN0IEMyRmllbGRVdGlsczo6SW5mbyAmZiA6CisgICAgICAgICAgICAgICAgQzJGaWVsZFV0aWxzOjplbnVtZXJhdGVGaWVsZHMoKm1EZWZhdWx0VmFsdWUsIHJlZmxlY3RvcikpIHsKKyAgICAgICAgICAgIGlmICghZi5pc0FyaXRobWV0aWMoKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+IGZzdlBvaW50ZXI7CisKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBhIGJyZWFrYWJsZSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzIGZzdjsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKGYudHlwZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDMyOiAgZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTxpbnQzMl90Pjo6QW55KCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UMzI6IGZzdiA9IEMyU3VwcG9ydGVkUmFuZ2U8dWludDMyX3Q+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OklOVDY0OiAgZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTxpbnQ2NF90Pjo6QW55KCk7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UNjQ6IGZzdiA9IEMyU3VwcG9ydGVkUmFuZ2U8dWludDY0X3Q+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkZMT0FUOiAgZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTxmbG9hdD46OkFueSgpOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6QkxPQjogICBmc3YgPSBDMlN1cHBvcnRlZFJhbmdlPHVpbnQ4X3Q+OjpBbnkoKTsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlNUUklORzogZnN2ID0gQzJTdXBwb3J0ZWRSYW5nZTxjaGFyPjo6QW55KCk7IGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBicmVhayBvdXQgb2YgZG8ge30gd2hpbGUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZnN2UG9pbnRlciA9IHN0ZDo6bWFrZV91bmlxdWU8QzJGaWVsZFN1cHBvcnRlZFZhbHVlcz4oZnN2KTsKKyAgICAgICAgICAgIH0gd2hpbGUgKGZhbHNlKTsKKworICAgICAgICAgICAgbUZpZWxkcy5lbXBsYWNlX2hpbnQoCisgICAgICAgICAgICAgICAgICAgIG1GaWVsZHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgIF9DMkZpZWxkSWQoZi5vZmZzZXQoKSwgZi5zaXplKCkpLAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEZpZWxkSGVscGVyPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGFyYW0sIF9DMkZpZWxkSWQoZi5vZmZzZXQoKSwgZi5zaXplKCkpLCBzdGQ6Om1vdmUoZnN2UG9pbnRlcikpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEZpbmRzIGEgZmllbGQgZGVzY3JpcHRvci4KKyAgICAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGZpbmRGaWVsZChzaXplX3QgYmFzZU9mZnMsIHNpemVfdCBiYXNlU2l6ZSkgY29uc3QgeworICAgICAgICBhdXRvIGl0ID0gbUZpZWxkcy5maW5kKF9DMkZpZWxkSWQoYmFzZU9mZnMsIGJhc2VTaXplKSk7CisgICAgICAgIGlmIChpdCA9PSBtRmllbGRzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxQYXJhbVJlZj4gZ2V0RGVwZW5kZW5jaWVzQXNSZWZzKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbURlcGVuZGVuY2llc0FzUmVmczsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbURlc2NyaXB0b3I+IGdldERlc2NyaXB0b3IoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRGVzY3JpcHRvcjsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gZ2V0RG93bkRlcGVuZGVuY2llcygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1Eb3duRGVwZW5kZW5jaWVzOworICAgIH0KKworICAgIEMyUGFyYW06OkluZGV4IGluZGV4KCkgY29uc3QgeworICAgICAgICBpZiAoIW1EZWZhdWx0VmFsdWUpIHsKKyAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiJXMgbWlzc2luZyBkZWZhdWx0IHZhbHVlXG4iLCBtTmFtZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbURlZmF1bHRWYWx1ZS0+aW5kZXgoKTsKKyAgICB9CisKKyAgICBDMlN0cmluZyBuYW1lKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbU5hbWU7CisgICAgfQorCisgICAgY29uc3QgUGFyYW1SZWYgcmVmKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVBhcmFtOworICAgIH0KKworICAgIEMyU3RydWN0RGVzY3JpcHRvciByZXRyaWV2ZVN0cnVjdERlc2NyaXB0b3IoKSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoX21TdHJ1Y3QpOworICAgIH0KKworICAgIHZvaWQgc2V0RGVmYXVsdFZhbHVlKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBkZWZhdWx0XykgeworICAgICAgICBtRGVmYXVsdFZhbHVlID0gZGVmYXVsdF87CisgICAgfQorCisgICAgdm9pZCBzZXREZXBlbmRlbmNpZXMoc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXMsIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiByZWZzKSB7CisgICAgICAgIG1EZXBlbmRlbmNpZXMgPSBpbmRpY2VzOworICAgICAgICBtRGVwZW5kZW5jaWVzQXNSZWZzID0gcmVmczsKKyAgICB9CisKKyAgICB2b2lkIHNldEZpZWxkcyhzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+ICYmZmllbGRzKSB7CisgICAgICAgIC8vIGRvIG5vdCBhbGxvdyBhZGRpbmcgZmllbGRzIG11bHRpcGxlIHRpbWVzLCBvciB0byBjb25zdCB2YWx1ZXMKKyAgICAgICAgaWYgKCFtRmllbGRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEMyX0xPRyhGQVRBTCkgPDwgIlRyeWluZyB0byBhZGQgZmllbGRzIHRvIHBhcmFtICIgPDwgbU5hbWUgPDwgIiBtdWx0aXBsZSB0aW1lcyI7CisgICAgICAgIH0gZWxzZSBpZiAobUF0dHJpYiAmIGF0dHJpYl90OjpJU19DT05TVCkgeworICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAiVHJ5aW5nIHRvIGFkZCBmaWVsZHMgdG8gY29uc3QgcGFyYW0gIiA8PCBtTmFtZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoQzJQYXJhbUZpZWxkVmFsdWVzICZwZnYgOiBmaWVsZHMpIHsKKyAgICAgICAgICAgIG1GaWVsZHMuZW1wbGFjZV9oaW50KAorICAgICAgICAgICAgICAgICAgICBtRmllbGRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAvLyBfQzJGaWVsZElkIGNvbnN0cnVjdG9yCisgICAgICAgICAgICAgICAgICAgIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRGaWVsZChwZnYucGFyYW1PckZpZWxkKSwKKyAgICAgICAgICAgICAgICAgICAgLy8gRmllbGQgY29uc3RydWN0b3IKKyAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxGaWVsZEhlbHBlcj4obVBhcmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0RmllbGQocGZ2LnBhcmFtT3JGaWVsZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShwZnYudmFsdWVzKSkpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzZXRHZXR0ZXIoc3RkOjpmdW5jdGlvbjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4oYm9vbCk+IGdldHRlcikgeworICAgICAgICBtR2V0dGVyID0gZ2V0dGVyOworICAgIH0KKworICAgIHZvaWQgc2V0U2V0dGVyKHN0ZDo6ZnVuY3Rpb248QzJSKGNvbnN0IEMyUGFyYW0gKiwgYm9vbCwgYm9vbCAqLCBGYWN0b3J5ICYpPiBzZXR0ZXIpIHsKKyAgICAgICAgbVNldHRlciA9IHNldHRlcjsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCB0cnlTZXQoCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICp2YWx1ZSwgYm9vbCBtYXlCbG9jaywgYm9vbCAqY2hhbmdlZCwgRmFjdG9yeSAmZiwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIHsKKyAgICAgICAgQzJSIHJlc3VsdCA9IG1TZXR0ZXIodmFsdWUsIG1heUJsb2NrLCBjaGFuZ2VkLCBmKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdC5yZXRyaWV2ZUZhaWx1cmVzKGZhaWx1cmVzKTsKKyAgICB9CisKKyAgICBjMl9zdGF0dXNfdCB2YWxpZGF0ZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gJnJlZmxlY3RvcikgeworICAgICAgICBpZiAoIW1TZXR0ZXIgJiYgbUZpZWxkcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBDMl9MT0coV0FSTklORykgPDwgIlBhcmFtICIgPDwgbU5hbWUgPDwgIiBoYXMgbm8gc2V0dGVyLCBtYWtpbmcgaXQgY29uc3QiOworICAgICAgICAgICAgLy8gZGVwZW5kZW5jaWVzIGFyZSBlbXB0eSBpbiB0aGlzIGNhc2UKKyAgICAgICAgICAgIG1BdHRyaWIgfD0gYXR0cmliX3Q6OklTX0NPTlNUOworICAgICAgICB9IGVsc2UgaWYgKCFtU2V0dGVyKSB7CisgICAgICAgICAgICBDMl9MT0coRkFUQUwpIDw8ICJQYXJhbSAiIDw8IG1OYW1lIDw8ICIgaGFzIG5vIHNldHRlciI7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUF0dHJpYiAmIGF0dHJpYl90OjpJU19DT05TVCkgeworICAgICAgICAgICAgY3JlYXRlRmllbGRzQW5kU3VwcG9ydGVkVmFsdWVzKHJlZmxlY3Rvcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUT0RPOiB1cGRhdGUgZGVmYXVsdCBiYXNlZCBvbiBzZXR0ZXIgYW5kIHZlcmlmeSB0aGF0IEZTViBjb3ZlcnMgdGhlIHZhbHVlcworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1GaWVsZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAiUGFyYW0gIiA8PCBtTmFtZSA8PCAiIGhhcyBubyBmaWVsZHMiOworICAgICAgICB9CisKKyAgICAgICAgcmV0dXJuIEMyX09LOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiB2YWx1ZSgpIHsKKyAgICAgICAgcmV0dXJuIG1QYXJhbS5nZXQoKTsKKyAgICB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbT4gdmFsdWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUGFyYW0uZ2V0KCk7CisgICAgfQorCitwcml2YXRlOgorICAgIHR5cGVkZWYgX0MyUGFyYW1JbnNwZWN0b3I6OmF0dHJpYl90IGF0dHJpYl90OworICAgIFBhcmFtUmVmIG1QYXJhbTsKKyAgICBDMlN0cmluZyBtTmFtZTsKKyAgICBDMlN0cnVjdERlc2NyaXB0b3IgX21TdHJ1Y3Q7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IG1EZWZhdWx0VmFsdWU7CisgICAgYXR0cmliX3QgbUF0dHJpYjsKKyAgICBzdGQ6OmZ1bmN0aW9uPEMyUihjb25zdCBDMlBhcmFtICosIGJvb2wsIGJvb2wgKiwgRmFjdG9yeSAmKT4gbVNldHRlcjsKKyAgICBzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPihib29sKT4gbUdldHRlcjsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gbURlcGVuZGVuY2llczsKKyAgICBzdGQ6OnZlY3RvcjxQYXJhbVJlZj4gbURlcGVuZGVuY2llc0FzUmVmczsKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gbURvd25EZXBlbmRlbmNpZXM7IC8vIFRPRE86IHRoaXMgZG9lcyBub3Qgd29yayBmb3Igc3RyZWFtIGRlcGVuZGVuY2llcworICAgIHN0ZDo6bWFwPF9DMkZpZWxkSWQsIHN0ZDo6c2hhcmVkX3B0cjxGaWVsZEhlbHBlcj4+IG1GaWVsZHM7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPiBtRGVzY3JpcHRvcjsKK307CisKK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6UGFyYW1IZWxwZXIoCisgICAgICAgIFBhcmFtUmVmIHBhcmFtLCBDMlN0cmluZ0xpdGVyYWwgbmFtZSwgQzJTdHJ1Y3REZXNjcmlwdG9yICYmc3RydWt0KQorICAgIDogbUltcGwoc3RkOjptYWtlX3VuaXF1ZTxDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OkltcGw+KAorICAgICAgICAgICAgcGFyYW0sIG5hbWUsIHN0ZDo6bW92ZShzdHJ1a3QpKSkgeyB9CisKK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6UGFyYW1IZWxwZXIoQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyICYmKSA9IGRlZmF1bHQ7CisKK0MySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6flBhcmFtSGVscGVyKCkgPSBkZWZhdWx0OworCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6YWRkRG93bkRlcGVuZGVuY3koQzJQYXJhbTo6SW5kZXggaW5kZXgpIHsKKyAgICByZXR1cm4gbUltcGwtPmFkZERvd25EZXBlbmRlbmN5KGluZGV4KTsKK30KKworQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjphdHRyaWJfdCYgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjphdHRyaWIoKSB7CisgICAgcmV0dXJuIG1JbXBsLT5hdHRyaWIoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcj4gQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpidWlsZCgpIHsKKyAgICBtSW1wbC0+YnVpbGQoKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI+KHN0ZDo6bW92ZSgqdGhpcykpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8QzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyPgorQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpmaW5kRmllbGQoc2l6ZV90IGJhc2VPZmZzLCBzaXplX3QgYmFzZVNpemUpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmZpbmRGaWVsZChiYXNlT2ZmcywgYmFzZVNpemUpOworfQorCitjb25zdCBzdGQ6OnZlY3RvcjxDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1SZWY+CitDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmdldERlcGVuZGVuY2llc0FzUmVmcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldERlcGVuZGVuY2llc0FzUmVmcygpOworfQorCitzdGQ6OnNoYXJlZF9wdHI8Y29uc3QgQzJQYXJhbURlc2NyaXB0b3I+CitDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmdldERlc2NyaXB0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXREZXNjcmlwdG9yKCk7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW06OkluZGV4PiBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OmdldERvd25EZXBlbmRlbmNpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXREb3duRGVwZW5kZW5jaWVzKCk7Cit9CisKK0MyUGFyYW06OkluZGV4IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6aW5kZXgoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5pbmRleCgpOworfQorCitDMlN0cmluZyBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6Om5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5uYW1lKCk7Cit9CisKK2NvbnN0IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbVJlZiBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnJlZigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPnJlZigpOworfQorCitDMlN0cnVjdERlc2NyaXB0b3IgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjpyZXRyaWV2ZVN0cnVjdERlc2NyaXB0b3IoKSB7CisgICAgcmV0dXJuIG1JbXBsLT5yZXRyaWV2ZVN0cnVjdERlc2NyaXB0b3IoKTsKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnNldERlZmF1bHRWYWx1ZShzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gZGVmYXVsdF8pIHsKKyAgICBtSW1wbC0+c2V0RGVmYXVsdFZhbHVlKGRlZmF1bHRfKTsKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnNldERlcGVuZGVuY2llcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8QzJQYXJhbTo6SW5kZXg+IGluZGljZXMsIHN0ZDo6dmVjdG9yPFBhcmFtUmVmPiByZWZzKSB7CisgICAgbUltcGwtPnNldERlcGVuZGVuY2llcyhpbmRpY2VzLCByZWZzKTsKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnNldEZpZWxkcyhzdGQ6OnZlY3RvcjxDMlBhcmFtRmllbGRWYWx1ZXM+ICYmZmllbGRzKSB7CisgICAgcmV0dXJuIG1JbXBsLT5zZXRGaWVsZHMoc3RkOjptb3ZlKGZpZWxkcykpOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6c2V0R2V0dGVyKAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPihib29sKT4gZ2V0dGVyKSB7CisgICAgbUltcGwtPnNldEdldHRlcihnZXR0ZXIpOworfQorCit2b2lkIEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6c2V0U2V0dGVyKAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPEMyUihjb25zdCBDMlBhcmFtICosIGJvb2wsIGJvb2wgKiwgRmFjdG9yeSAmKT4gc2V0dGVyKSB7CisgICAgbUltcGwtPnNldFNldHRlcihzZXR0ZXIpOworfQorCitjMl9zdGF0dXNfdCBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnRyeVNldCgKKyAgICAgICAgY29uc3QgQzJQYXJhbSAqdmFsdWUsIGJvb2wgbWF5QmxvY2ssIGJvb2wgKmNoYW5nZWQsIEZhY3RvcnkgJmYsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMpIHsKKyAgICByZXR1cm4gbUltcGwtPnRyeVNldCh2YWx1ZSwgbWF5QmxvY2ssIGNoYW5nZWQsIGYsIGZhaWx1cmVzKTsKK30KKworYzJfc3RhdHVzX3QgQzJJbnRlcmZhY2VIZWxwZXI6OlBhcmFtSGVscGVyOjp2YWxpZGF0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpIHsKKyAgICByZXR1cm4gbUltcGwtPnZhbGlkYXRlKHJlZmxlY3Rvcik7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiBDMkludGVyZmFjZUhlbHBlcjo6UGFyYW1IZWxwZXI6OnZhbHVlKCkgeworICAgIHJldHVybiBtSW1wbC0+dmFsdWUoKTsKK30KKworc3RkOjpzaGFyZWRfcHRyPGNvbnN0IEMyUGFyYW0+IEMySW50ZXJmYWNlSGVscGVyOjpQYXJhbUhlbHBlcjo6dmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT52YWx1ZSgpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZpZWxkSGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworQzJQYXJhbUZpZWxkIEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZEhlbHBlcjo6bWFrZVBhcmFtRmllbGQoQzJQYXJhbTo6SW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gX0MyUGFyYW1JbnNwZWN0b3I6OkNyZWF0ZVBhcmFtRmllbGQoaW5kZXgsIG1GaWVsZElkKTsKK30KKworQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyOjpGaWVsZEhlbHBlcihjb25zdCBQYXJhbVJlZiAmcGFyYW0sIGNvbnN0IF9DMkZpZWxkSWQgJmZpZWxkLAorICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+ICYmdmFsdWVzKQorICAgIDogbVBhcmFtKHBhcmFtKSwKKyAgICAgIG1GaWVsZElkKGZpZWxkKSwKKyAgICAgIG1Qb3NzaWJsZShzdGQ6Om1vdmUodmFsdWVzKSkgeworICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiQ3JlYXRpbmcgZmllbGQgaGVscGVyICIgPDwgZmllbGQgPDwgIiAiCisgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPHVpbnQzMl90PigqbVBvc3NpYmxlKTsKK30KKwordm9pZCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI6OnNldFN1cHBvcnRlZFZhbHVlcygKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXM+ICYmdmFsdWVzKSB7CisgICAgbVN1cHBvcnRlZCA9IHN0ZDo6bW92ZSh2YWx1ZXMpOworfQorCitjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICpDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI6OmdldFN1cHBvcnRlZFZhbHVlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gKG1TdXBwb3J0ZWQgPyBtU3VwcG9ydGVkIDogbVBvc3NpYmxlKS5nZXQoKTsKK30KKworY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAqQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyOjpnZXRQb3NzaWJsZVZhbHVlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVBvc3NpYmxlLmdldCgpOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmllbGQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIFdyYXBwZXIgYXJvdW5kIGZpZWxkLXN1cHBvcnRlZC12YWx1ZXMgYnVpbGRlciB0aGF0IGdldHMgc3RvcmVkIGluIHRoZQorICogZmllbGQgaGVscGVyIHdoZW4gdGhlIGJ1aWxkZXIgZ29lcyBvdXQgb2Ygc2NvcGUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU3VwcG9ydGVkVmFsdWVzQnVpbGRlciA6IEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4geworICAgIFN1cHBvcnRlZFZhbHVlc0J1aWxkZXIoCisgICAgICAgICAgICBDMlBhcmFtRmllbGQgJmZpZWxkLCBzdGQ6OnNoYXJlZF9wdHI8QzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkSGVscGVyPiBoZWxwZXIpCisgICAgICAgIDogQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPihmaWVsZCksIF9tSGVscGVyKGhlbHBlciksIF9tRmllbGQoZmllbGQpIHsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTYXZlIGJ1aWxkZXIgdmFsdWVzIG9uIGRlc3RydWN0aW9uLgorICAgICAqLworICAgIHZpcnR1YWwgflN1cHBvcnRlZFZhbHVlc0J1aWxkZXIoKSBvdmVycmlkZSB7CisgICAgICAgIF9tSGVscGVyLT5zZXRTdXBwb3J0ZWRWYWx1ZXMoc3RkOjptb3ZlKEMyUGFyYW1GaWVsZFZhbHVlcygqdGhpcykudmFsdWVzKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkludGVyZmFjZUhlbHBlcjo6RmllbGRIZWxwZXI+IF9tSGVscGVyOworICAgIEMyUGFyYW1GaWVsZCBfbUZpZWxkOworfTsKKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8VD46OnNob3VsZEJlKCkgY29uc3QgeworICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+KF9tRmllbGQpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8VD46Om11c3RCZSgpIHsKKyAgICByZXR1cm4gU3VwcG9ydGVkVmFsdWVzQnVpbGRlcjxUPihfbUZpZWxkLCBfbUhlbHBlcik7Cit9CisKKy8qCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBDMlNldHRpbmdSZXN1bHRzQnVpbGRlciBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8VD46OnZhbGlkYXRlUG9zc2libGUoVCAmdmFsdWUpCitjb25zdCB7CisgICAgLy8vIFRPRE8KKyAgICByZXR1cm4gQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI6Ok9rKCk7Cit9CisqLworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPFQ+OjpGaWVsZChzdGQ6OnNoYXJlZF9wdHI8RmllbGRIZWxwZXI+IGhlbHBlciwgQzJQYXJhbTo6SW5kZXggaW5kZXgpCisgICAgOiBfbUhlbHBlcihoZWxwZXIpLCBfbUZpZWxkKGhlbHBlci0+bWFrZVBhcmFtRmllbGQoaW5kZXgpKSB7IH0KKwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDx1aW50OF90PjsKK3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8Y2hhcj47Cit0ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPGludDMyX3Q+OwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDx1aW50MzJfdD47CisvL3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8YzJfY250cjMyX3Q+OwordGVtcGxhdGUgc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGaWVsZDxpbnQ2NF90PjsKK3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8dWludDY0X3Q+OworLy90ZW1wbGF0ZSBzdHJ1Y3QgQzJJbnRlcmZhY2VIZWxwZXI6OkZpZWxkPGMyX2NudHI2NF90PjsKK3RlbXBsYXRlIHN0cnVjdCBDMkludGVyZmFjZUhlbHBlcjo6RmllbGQ8ZmxvYXQ+OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRmFjdG9yeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IEMySW50ZXJmYWNlSGVscGVyOjpGYWN0b3J5SW1wbCA6IHB1YmxpYyBDMkludGVyZmFjZUhlbHBlcjo6RmFjdG9yeSB7CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gZ2V0UmVmbGVjdG9yKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gX21SZWZsZWN0b3I7CisgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+CisgICAgZ2V0UGFyYW1IZWxwZXIoY29uc3QgUGFyYW1SZWYgJnBhcmFtKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBfbVBhcmFtcy5maW5kKHBhcmFtKS0+c2Vjb25kOworICAgIH0KKworcHVibGljOgorICAgIEZhY3RvcnlJbXBsKHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiByZWZsZWN0b3IpCisgICAgICAgIDogX21SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworICAgIHZpcnR1YWwgfkZhY3RvcnlJbXBsKCkgPSBkZWZhdWx0OworCisgICAgdm9pZCBhZGRQYXJhbShzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IHBhcmFtKSB7CisgICAgICAgIF9tUGFyYW1zLmluc2VydCh7IHBhcmFtLT5yZWYoKSwgcGFyYW0gfSk7CisgICAgICAgIF9tSW5kZXhUb0hlbHBlci5pbnNlcnQoe3BhcmFtLT5pbmRleCgpLCBwYXJhbX0pOworCisgICAgICAgIC8vIGFkZCBkb3duLWRlcGVuZGVuY2llcyAoYW5kIHZhbGlkYXRlIGRlcGVuZGVuY2llcyBhcyBhIHJlc3VsdCkKKyAgICAgICAgc2l6ZV90IGl4ID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBQYXJhbVJlZiAmcmVmIDogcGFyYW0tPmdldERlcGVuZGVuY2llc0FzUmVmcygpKSB7CisgICAgICAgICAgICAvLyBkZXBlbmRlbmNpZXMgbXVzdCBhbHJlYWR5IGJlIGRlZmluZWQKKyAgICAgICAgICAgIGlmICghX21QYXJhbXMuY291bnQocmVmKSkgeworICAgICAgICAgICAgICAgIEMyX0xPRyhGQVRBTCkgPDwgIlBhcmFtZXRlciAiIDw8IHBhcmFtLT5uYW1lKCkgPDwgIiBoYXMgYSBkZXBlbmRlbmN5IGF0IGluZGV4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IGl4IDw8ICIgdGhhdCBpcyBub3QgeWV0IGRlZmluZWQiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX21QYXJhbXMuZmluZChyZWYpLT5zZWNvbmQtPmFkZERvd25EZXBlbmRlbmN5KHBhcmFtLT5pbmRleCgpKTsKKyAgICAgICAgICAgICsraXg7CisgICAgICAgIH0KKworICAgICAgICBfbURlcGVuZGVuY3lJbmRleC5lbXBsYWNlKHBhcmFtLT5pbmRleCgpLCBfbURlcGVuZGVuY3lJbmRleC5zaXplKCkpOworICAgIH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4gZ2V0UGFyYW0oQzJQYXJhbTo6SW5kZXggaXgpIGNvbnN0IHsKKyAgICAgICAgLy8gVE9ETzogaGFuZGxlIHN0cmVhbXMgc2VwYXJhdGVseQorICAgICAgICBjb25zdCBhdXRvIGl0ID0gX21JbmRleFRvSGVscGVyLmZpbmQoaXgpOworICAgICAgICBpZiAoaXQgPT0gX21JbmRleFRvSGVscGVyLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBUT0RPOiB0aGlzIGNvdWxkIHJldHVybiBhIGNvcHkgdXNpbmcgcHJvcGVyIHBvaW50ZXIgY2FzdC4KKyAgICAgKi8KKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gZ2V0UGFyYW1WYWx1ZShDMlBhcmFtOjpJbmRleCBpeCkgY29uc3QgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IGhlbHBlciA9IGdldFBhcmFtKGl4KTsKKyAgICAgICAgcmV0dXJuIGhlbHBlciA/IGhlbHBlci0+dmFsdWUoKSA6IG51bGxwdHI7CisgICAgfQorCisgICAgYzJfc3RhdHVzX3QgcXVlcnlTdXBwb3J0ZWRQYXJhbXMoCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbURlc2NyaXB0b3I+PiAqY29uc3QgcGFyYW1zKSBjb25zdCB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiBfbVBhcmFtcykgeworICAgICAgICAgICAgLy8gVE9ETzogY2hhbmdlIHF1ZXJ5U3VwcG9ydGVkUGFyYW1zIHNpZ25hdHVyZT8KKyAgICAgICAgICAgIHBhcmFtcy0+cHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmNvbnN0X3BvaW50ZXJfY2FzdDxDMlBhcmFtRGVzY3JpcHRvcj4oaXQuc2Vjb25kLT5nZXREZXNjcmlwdG9yKCkpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBoYW5kbGUgZXJyb3JzCisgICAgICAgIHJldHVybiBDMl9PSzsKKyAgICB9CisKKyAgICBzaXplX3QgZ2V0RGVwZW5kZW5jeUluZGV4KEMyUGFyYW06OkluZGV4IGl4KSB7CisgICAgICAgIC8vIGluIHRoaXMgdmVyc2lvbiBvZiB0aGUgaGVscGVyIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgc3RyZWFtIHNvCisgICAgICAgIC8vIHdlIGNhbiBsb29rIHVwIGRpcmVjdGx5IGJ5IGluZGV4CisgICAgICAgIGF1dG8gaXQgPSBfbURlcGVuZGVuY3lJbmRleC5maW5kKGl4KTsKKyAgICAgICAgcmV0dXJuIGl0ID09IF9tRGVwZW5kZW5jeUluZGV4LmVuZCgpID8gU0laRV9NQVggOiBpdC0+c2Vjb25kOworICAgIH0KKworcHJpdmF0ZToKKyAgICBzdGQ6Om1hcDxQYXJhbVJlZiwgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPj4gX21QYXJhbXM7CisgICAgc3RkOjptYXA8QzJQYXJhbTo6SW5kZXgsIHN0ZDo6c2hhcmVkX3B0cjxQYXJhbUhlbHBlcj4+IF9tSW5kZXhUb0hlbHBlcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gX21SZWZsZWN0b3I7CisgICAgc3RkOjptYXA8QzJQYXJhbTo6SW5kZXgsIHNpemVfdD4gX21EZXBlbmRlbmN5SW5kZXg7Cit9OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSGVscGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCituYW1lc3BhY2UgeworCitzdGF0aWMgc3RkOjpzdHJpbmcgYXNTdHJpbmcoQzJQYXJhbSAqcCkgeworICAgIGNoYXIgYWRkclsyMF07CisgICAgc3ByaW50ZihhZGRyLCAiJXA6WyIsIHApOworICAgIHN0ZDo6c3RyaW5nIHYgPSBhZGRyOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcC0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgY2hhciBkWzRdOworICAgICAgICBzcHJpbnRmKGQsICIgJTAyeCIsICooKCh1aW50OF90ICopcCkgKyBpKSk7CisgICAgICAgIHYgKz0gZCArIChpID09IDApOworICAgIH0KKyAgICByZXR1cm4gdiArICJdIjsKK30KKworfQorCitDMkludGVyZmFjZUhlbHBlcjo6QzJJbnRlcmZhY2VIZWxwZXIoc3RkOjpzaGFyZWRfcHRyPEMyUmVmbGVjdG9ySGVscGVyPiByZWZsZWN0b3IpCisgICAgOiBtUmVmbGVjdG9yKHJlZmxlY3RvciksCisgICAgICBfbUZhY3Rvcnkoc3RkOjptYWtlX3NoYXJlZDxGYWN0b3J5SW1wbD4ocmVmbGVjdG9yKSkgeyB9CisKKworc2l6ZV90IEMySW50ZXJmYWNlSGVscGVyOjpHZXRCYXNlT2Zmc2V0KGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yLAorICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgsIHNpemVfdCBvZmZzZXQpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPiBwYXJhbSA9IHJlZmxlY3Rvci0+ZGVzY3JpYmUoaW5kZXgpOworICAgIGlmIChwYXJhbSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiB+KHNpemVfdCkwOyAvLyBwYXJhbSBzdHJ1Y3R1cmUgbm90IGRlc2NyaWJlZAorICAgIH0KKworICAgIGZvciAoY29uc3QgQzJGaWVsZERlc2NyaXB0b3IgJmZpZWxkIDogKnBhcmFtKSB7CisgICAgICAgIHNpemVfdCBmaWVsZE9mZnNldCA9IF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoZmllbGQpOworICAgICAgICBzaXplX3QgZmllbGRTaXplID0gX0MyUGFyYW1JbnNwZWN0b3I6OkdldFNpemUoZmllbGQpOworICAgICAgICBzaXplX3QgZmllbGRFeHRlbnQgPSBmaWVsZC5leHRlbnQoKTsKKyAgICAgICAgaWYgKG9mZnNldCA8IGZpZWxkT2Zmc2V0KSB7CisgICAgICAgICAgICByZXR1cm4gfihzaXplX3QpMDsgLy8gbm90IGZvdW5kCisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mZnNldCA9PSBmaWVsZE9mZnNldCkgeworICAgICAgICAgICAgLy8gZXhhY3QgbWF0Y2gKKyAgICAgICAgICAgIHJldHVybiBvZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZpZWxkLmV4dGVudCgpID09IDAgfHwgb2Zmc2V0IDwgZmllbGRPZmZzZXQgKyBmaWVsZFNpemUgKiBmaWVsZEV4dGVudCkgeworICAgICAgICAgICAgLy8gcmVkdWNlIHRvIGZpcnN0IGVsZW1lbnQgaW4gY2FzZSBvZiBhcnJheQorICAgICAgICAgICAgb2Zmc2V0ID0gZmllbGRPZmZzZXQgKyAob2Zmc2V0IC0gZmllbGRPZmZzZXQpICUgZmllbGRTaXplOworICAgICAgICAgICAgaWYgKGZpZWxkLnR5cGUoKSA+PSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIG9mZnNldCBpcyB3aXRoaW4gYSBmaWVsZAorICAgICAgICAgICAgICAgIG9mZnNldCA9IEdldEJhc2VPZmZzZXQoCisgICAgICAgICAgICAgICAgICAgICAgICByZWZsZWN0b3IsIGZpZWxkLnR5cGUoKSAmIH5DMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcsCisgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXQgLSBmaWVsZE9mZnNldCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIH5vZmZzZXQgPyBmaWVsZE9mZnNldCArIG9mZnNldCA6IG9mZnNldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gfihzaXplX3QpMDsgLy8gbm90IGZvdW5kCit9CisKK3ZvaWQgQzJJbnRlcmZhY2VIZWxwZXI6OmFkZFBhcmFtZXRlcihzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IHBhcmFtKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICBtUmVmbGVjdG9yLT5hZGRTdHJ1Y3REZXNjcmlwdG9yKHBhcmFtLT5yZXRyaWV2ZVN0cnVjdERlc2NyaXB0b3IoKSk7CisgICAgYzJfc3RhdHVzX3QgZXJyID0gcGFyYW0tPnZhbGlkYXRlKG1SZWZsZWN0b3IpOworICAgIGlmIChlcnIgIT0gQzJfQ09SUlVQVEVEKSB7CisgICAgICAgIF9tRmFjdG9yeS0+YWRkUGFyYW0ocGFyYW0pOworCisgICAgICAgIC8vIHJ1biBzZXR0ZXIgdG8gZW5zdXJlIGNvcnJlY3QgdmFsdWVzCisgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgICAgICh2b2lkKXBhcmFtLT50cnlTZXQocGFyYW0tPnZhbHVlKCkuZ2V0KCksIEMyX01BWV9CTE9DSywgJmNoYW5nZWQsICpfbUZhY3RvcnksICZmYWlsdXJlcyk7CisgICAgfQorfQorCitjMl9zdGF0dXNfdCBDMkludGVyZmFjZUhlbHBlcjo6Y29uZmlnKAorICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiAmcGFyYW1zLCBjMl9ibG9ja2luZ190IG1heUJsb2NrLAorICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDMlNldHRpbmdSZXN1bHQ+PiogY29uc3QgZmFpbHVyZXMsIGJvb2wgdXBkYXRlUGFyYW1zLAorICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPj4gKmNoYW5nZXMgX191bnVzZWQgLyogVE9ETyAqLykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgYm9vbCBwYXJhbVdhc0ludmFsaWQgPSBmYWxzZTsgLy8gVE9ETyBpcyB0aGlzIHRoZSBzYW1lIGFzIGJhZCB2YWx1ZT8KKyAgICBib29sIHBhcmFtTm90Rm91bmQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtQmFkVmFsdWUgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtTm9NZW1vcnkgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtQmxvY2tpbmcgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtVGltZWRPdXQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtQ29ycnVwdGVkID0gZmFsc2U7CisKKyAgICAvLyBkZXBlbmRlbmNpZXMKKyAgICAvLyBkb3duIGRlcGVuZGVuY2llcyBhcmUgbWFya2VkIGRpcnR5LCBidXQgcGFyYW1zIHNldCBhcmUgbm90IGltbWVkaWF0ZWx5CisgICAgLy8gbWFya2VkIGRpcnR5ICh1bmxlc3MgdGhleSBiZWNvbWUgZG93biBkZXBlbmRlbmN5KSBzbyB0aGF0IHdlIGNhbgorICAgIC8vIGF2b2lkIHNldHRpbmcgdGhlbSBpZiB0aGV5IGRpZCBub3QgY2hhbmdlCisKKyAgICAvLyBUT0RPOiB0aGVyZSBjb3VsZCBiZSBtdWx0aXBsZSBpbmRpY2VzIGZvciB0aGUgc2FtZSBkZXBlbmRlbmN5IGluZGV4CisgICAgLy8geyBkZXBJeCwgcGFyYW1JeCB9IG1heSBiZSBhIHN1aXRhYmxlIGtleQorICAgIHN0ZDo6bWFwPHNpemVfdCwgc3RkOjpwYWlyPEMyUGFyYW06OkluZGV4LCBib29sPj4gZGVwZW5kZW5jaWVzOworCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBwYXJhbVJlcXVlc3RzOworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0qPiBsYXRlUmVhZFBhcmFtczsKKworICAgIC8vIHdlIGNhbm5vdCBkZXRlcm1pbmUgdGhlIGxhc3QgdmFsaWQgcGFyYW1ldGVyLCBzbyBhZGQgYW4gZXh0cmEKKyAgICAvLyBsb29wIGl0ZXJhdGlvbiBhZnRlciB0aGUgbGFzdCBwYXJhbWV0ZXIKKyAgICBmb3IgKHNpemVfdCBwX2l4ID0gMDsgcF9peCA8PSBwYXJhbXMuc2l6ZSgpOyArK3BfaXgpIHsKKyAgICAgICAgQzJQYXJhbSAqcCA9IG51bGxwdHI7CisgICAgICAgIEMyUGFyYW06OkluZGV4IHBhcmFtSXggPSAwdTsKKyAgICAgICAgc2l6ZV90IHBhcmFtRGVwSXggPSBTSVpFX01BWDsKKyAgICAgICAgYm9vbCBsYXN0ID0gcF9peCA9PSBwYXJhbXMuc2l6ZSgpOworICAgICAgICBpZiAoIWxhc3QpIHsKKyAgICAgICAgICAgIHAgPSBwYXJhbXNbcF9peF07CisgICAgICAgICAgICBpZiAoISpwKSB7CisgICAgICAgICAgICAgICAgcGFyYW1XYXNJbnZhbGlkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHBhcmFtSXggPSBwLT5pbmRleCgpOworCisgICAgICAgICAgICAvLyBjb252ZXJ0IHBhcmFtZXRlciB0byByZXF1ZXN0IGluIGNhc2UgdGhpcyBpcyBhIHNwbGl0IHBhcmFtZXRlcgorICAgICAgICAgICAgQzJQYXJhbTo6SW5kZXggcmVxdWVzdFBhcmFtSXggPSBwYXJhbUl4IHwgQzJQYXJhbTo6Q29yZUluZGV4OjpJU19SRVFVRVNUX0ZMQUc7CisKKyAgICAgICAgICAgIC8vIHNldHRpbmcgYSByZXF1ZXN0IGRpcmVjdGx5IGlzIGhhbmRsZWQgYXMgbm9ybWFsCisgICAgICAgICAgICBpZiAocGFyYW1JeCAhPSByZXF1ZXN0UGFyYW1JeCkgeworICAgICAgICAgICAgICAgIHBhcmFtRGVwSXggPSBnZXREZXBlbmRlbmN5SW5kZXhfbChyZXF1ZXN0UGFyYW1JeCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmFtRGVwSXggPT0gU0laRV9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90IGEgc3BsaXQgcGFyYW1ldGVyLCBoYW5kbGUgaXQgbm9ybWFsbHkKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1EZXBJeCA9IGdldERlcGVuZGVuY3lJbmRleF9sKHBhcmFtSXgpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNwbGl0IHBhcmFtZXRlciAtIHJlcGxhY2Ugd2l0aCBzZXR0aW5nIGZvciB0aGUgcmVxdWVzdCAtIGFuZCBxdWV1ZSB0bworICAgICAgICAgICAgICAgICAgICAvLyByZWFkIGJhY2sgYWN0dWFsIHZhbHVlCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHJlYWQgbGF0ZSBwYXJhbXMgYXQgdGhlIHJpZ2h0IHRpbWUKKyAgICAgICAgICAgICAgICAgICAgbGF0ZVJlYWRQYXJhbXMuZW1wbGFjZV9iYWNrKHApOworICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QzJQYXJhbT4gcmVxdWVzdChDMlBhcmFtOjpDb3B5QXNSZXF1ZXN0KCpwKSk7CisgICAgICAgICAgICAgICAgICAgIHAgPSByZXF1ZXN0LmdldCgpOworICAgICAgICAgICAgICAgICAgICBwYXJhbVJlcXVlc3RzLmVtcGxhY2VfYmFjayhzdGQ6Om1vdmUocmVxdWVzdCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKHBhcmFtRGVwSXggPT0gU0laRV9NQVgpIHsKKyAgICAgICAgICAgICAgICAvLyB1bnN1cHBvcnRlZCBwYXJhbWV0ZXIKKyAgICAgICAgICAgICAgICBwYXJhbU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIGZpcnN0IGluc2VydCAtIG1hcmsgbm90IGRpcnR5CisgICAgICAgICAgICAvLyBpdCBtYXkgaGF2ZSBiZWVuIG1hcmtlZCBkaXJ0eSBieSBhIGRlcGVuZGVuY3kgdXBkYXRlCisgICAgICAgICAgICAvLyB0aGlzIGRvZXMgbm90IG92ZXJyd3JpdGUoISkKKyAgICAgICAgICAgICh2b2lkKWRlcGVuZGVuY2llcy5pbnNlcnQoeyBwYXJhbURlcEl4LCB7IHBhcmFtSXgsIGZhbHNlIC8qIGRpcnR5ICovIH19KTsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBkZXBlbmRlbmNpZXMuZmluZChwYXJhbURlcEl4KTsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAibWFya2luZyBkZXBlbmRlbmN5IGZvciBzZXR0aW5nIGF0ICMiIDw8IHBhcmFtRGVwSXggPDwgIjogIgorICAgICAgICAgICAgICAgICAgICA8PCBpdC0+c2Vjb25kLmZpcnN0IDw8ICIsIHVwZGF0ZSAiCisgICAgICAgICAgICAgICAgICAgIDw8IChpdC0+c2Vjb25kLnNlY29uZCA/ICJhbHdheXMgKGRpcnR5KSIgOiAib25seSBpZiBjaGFuZ2VkIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBwcm9jZXNzIGFueSByZW1haW5pbmcgZGVwZW5kZW5jaWVzCisgICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiaGFuZGxpbmcgZGlydHkgZG93biBkZXBlbmRlbmNpZXMgYWZ0ZXIgbGFzdCBzZXR0aW5nIjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHByb2Nlc3MgYW55IGRpcnRpZWQgZG93bi1kZXBlbmRlbmNpZXMgdW50aWwgdGhlIG5leHQgcGFyYW0KKyAgICAgICAgd2hpbGUgKGRlcGVuZGVuY2llcy5zaXplKCkgJiYgZGVwZW5kZW5jaWVzLmJlZ2luKCktPmZpcnN0IDw9IHBhcmFtRGVwSXgpIHsKKyAgICAgICAgICAgIGF1dG8gbWluID0gZGVwZW5kZW5jaWVzLmJlZ2luKCk7CisgICAgICAgICAgICBDMlBhcmFtOjpJbmRleCBpeCA9IG1pbi0+c2Vjb25kLmZpcnN0OworICAgICAgICAgICAgYm9vbCBkaXJ0eSA9IG1pbi0+c2Vjb25kLnNlY29uZDsKKyAgICAgICAgICAgIGRlcGVuZGVuY2llcy5lcmFzZShtaW4pOworCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UGFyYW1IZWxwZXI+IHBhcmFtID0gX21GYWN0b3J5LT5nZXRQYXJhbShpeCk7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIm9sZCB2YWx1ZSAiIDw8IGFzU3RyaW5nKHBhcmFtLT52YWx1ZSgpLmdldCgpKTsKKyAgICAgICAgICAgIGlmICghbGFzdCkgeworICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAibmV3IHZhbHVlICIgPDwgYXNTdHJpbmcocCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIWxhc3QgJiYgIWRpcnR5ICYmIGl4ID09IHBhcmFtSXggJiYgKnBhcmFtLT52YWx1ZSgpID09ICpwKSB7CisgICAgICAgICAgICAgICAgLy8gbm8gY2hhbmdlIGluIHZhbHVlIC0gYW5kIGRlcGVuZGVuY2llcyB3ZXJlIG5vdCB1cGRhdGVkCisgICAgICAgICAgICAgICAgLy8gbm8gbmVlZCB0byB1cGRhdGUKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImlnbm9yaW5nIHNldHRpbmcgdW5jaGFuZ2VkIHBhcmFtICIgPDwgaXg7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGFwcGx5IHNldHRpbmcKKyAgICAgICAgICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJzZXR0aW5nIHBhcmFtICIgPDwgaXg7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gb2xkVmFsdWUgPSBwYXJhbS0+dmFsdWUoKTsKKyAgICAgICAgICAgIGMyX3N0YXR1c190IHJlcyA9IHBhcmFtLT50cnlTZXQoCisgICAgICAgICAgICAgICAgICAgICghbGFzdCAmJiBwYXJhbUl4ID09IGl4KSA/IHAgOiBwYXJhbS0+dmFsdWUoKS5nZXQoKSwgbWF5QmxvY2ssCisgICAgICAgICAgICAgICAgICAgICZjaGFuZ2VkLCAqX21GYWN0b3J5LCBmYWlsdXJlcyk7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gbmV3VmFsdWUgPSBwYXJhbS0+dmFsdWUoKTsKKyAgICAgICAgICAgIEMyX0NIRUNLX0VRKG9sZFZhbHVlID09IG5ld1ZhbHVlLCAqb2xkVmFsdWUgPT0gKm5ld1ZhbHVlKTsKKyAgICAgICAgICAgIHN3aXRjaCAocmVzKSB7CisgICAgICAgICAgICAgICAgY2FzZSBDMl9PSzogYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMl9CQURfVkFMVUU6IHBhcmFtQmFkVmFsdWUgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyX05PX01FTU9SWTogcGFyYW1Ob01lbW9yeSA9IHRydWU7IGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQzJfVElNRURfT1VUOiBwYXJhbVRpbWVkT3V0ID0gdHJ1ZTsgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBDMl9CTE9DS0lORzogIHBhcmFtQmxvY2tpbmcgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEMyX0NPUlJVUFRFRDogcGFyYW1Db3JydXB0ZWQgPSB0cnVlOyBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiA7Ly8gVE9ETyBmYXRhbAorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb3B5IGJhY2sgcmVzdWx0IGZvciBjb25maWd1cmVkIHZhbHVlcyAob3IgaW52YWxpZGF0ZSBpZiBpdCBkb2VzIG5vdCBmaXQgb3IgbWF0Y2gpCisgICAgICAgICAgICBpZiAodXBkYXRlUGFyYW1zICYmICFsYXN0ICYmIHBhcmFtSXggPT0gaXgpIHsKKyAgICAgICAgICAgICAgICBpZiAoIXAtPnVwZGF0ZUZyb20oKnBhcmFtLT52YWx1ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBwLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBjb21wYXJlIHB0cnMgYXMgcGFyYW1zIGFyZSBjb3B5IG9uIHdyaXRlCisgICAgICAgICAgICBpZiAoY2hhbmdlZCkgeworICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAicGFyYW0gIiA8PCBpeCA8PCAiIHZhbHVlIGNoYW5nZWQiOworICAgICAgICAgICAgICAgIC8vIHZhbHVlIGNoYW5nZWQgdXBkYXRlIGRvd24tZGVwZW5kZW5jaWVzIGFuZCBtYXJrIHRoZW0gZGlydHkKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4IGl4IDogcGFyYW0tPmdldERvd25EZXBlbmRlbmNpZXMoKSkgeworICAgICAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgMTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBpbnNlcnRfcmVzID0gZGVwZW5kZW5jaWVzLmluc2VydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGdldERlcGVuZGVuY3lJbmRleF9sKGl4KSwgeyBpeCwgdHJ1ZSAvKiBkaXJ0eSAqLyB9fSk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaW5zZXJ0X3Jlcy5zZWNvbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICgqaW5zZXJ0X3Jlcy5maXJzdCkuc2Vjb25kLnNlY29uZCA9IHRydWU7IC8vIG1hcmsgZGlydHkKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGF1dG8gaXQgPSBkZXBlbmRlbmNpZXMuZmluZChnZXREZXBlbmRlbmN5SW5kZXhfbChpeCkpOworICAgICAgICAgICAgICAgICAgICBDMl9DSEVDSyhpdC0+c2Vjb25kLnNlY29uZCk7CisgICAgICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAibWFya2luZyBkb3duIGRlcGVuZGVuY2llcyB0byB1cGRhdGUgYXQgIyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBnZXREZXBlbmRlbmN5SW5kZXhfbChpeCkgPDwgIjogIiA8PCBpdC0+c2Vjb25kLmZpcnN0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGdldCBsYXRlIHJlYWQgcGFyYW1ldGVycworICAgIGZvciAoQzJQYXJhbSAqcCA6IGxhdGVSZWFkUGFyYW1zKSB7CisgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtPiB2YWx1ZSA9IF9tRmFjdG9yeS0+Z2V0UGFyYW1WYWx1ZShwLT5pbmRleCgpKTsKKyAgICAgICAgaWYgKHZhbHVlKSB7CisgICAgICAgICAgICBwLT51cGRhdGVGcm9tKCp2YWx1ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwLT5pbnZhbGlkYXRlKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gKHBhcmFtQ29ycnVwdGVkID8gQzJfQ09SUlVQVEVEIDoKKyAgICAgICAgICAgIHBhcmFtQmxvY2tpbmcgPyBDMl9CTE9DS0lORyA6CisgICAgICAgICAgICBwYXJhbVRpbWVkT3V0ID8gQzJfVElNRURfT1VUIDoKKyAgICAgICAgICAgIHBhcmFtTm9NZW1vcnkgPyBDMl9OT19NRU1PUlkgOgorICAgICAgICAgICAgKHBhcmFtQmFkVmFsdWUgfHwgcGFyYW1XYXNJbnZhbGlkKSA/IEMyX0JBRF9WQUxVRSA6CisgICAgICAgICAgICBwYXJhbU5vdEZvdW5kID8gQzJfQkFEX0lOREVYIDogQzJfT0spOworfQorCitzaXplX3QgQzJJbnRlcmZhY2VIZWxwZXI6OmdldERlcGVuZGVuY3lJbmRleF9sKEMyUGFyYW06OkluZGV4IGl4KSBjb25zdCB7CisgICAgcmV0dXJuIF9tRmFjdG9yeS0+Z2V0RGVwZW5kZW5jeUluZGV4KGl4KTsKK30KKworYzJfc3RhdHVzX3QgQzJJbnRlcmZhY2VIZWxwZXI6OnF1ZXJ5KAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtKj4gJnN0YWNrUGFyYW1zLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxDMlBhcmFtOjpJbmRleD4gJmhlYXBQYXJhbUluZGljZXMsCisgICAgICAgIGMyX2Jsb2NraW5nX3QgbWF5QmxvY2sgX191bnVzZWQgLyogVE9ETyAqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiogY29uc3QgaGVhcFBhcmFtcykgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgYm9vbCBwYXJhbVdhc0ludmFsaWQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtTm90Rm91bmQgPSBmYWxzZTsKKyAgICBib29sIHBhcmFtRGlkTm90Rml0ID0gZmFsc2U7CisgICAgYm9vbCBwYXJhbU5vTWVtb3J5ID0gZmFsc2U7CisKKyAgICBmb3IgKEMyUGFyYW0qIGNvbnN0IHAgOiBzdGFja1BhcmFtcykgeworICAgICAgICBpZiAoISpwKSB7CisgICAgICAgICAgICBwYXJhbVdhc0ludmFsaWQgPSB0cnVlOworICAgICAgICAgICAgcC0+aW52YWxpZGF0ZSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW0+IHZhbHVlID0gX21GYWN0b3J5LT5nZXRQYXJhbVZhbHVlKHAtPmluZGV4KCkpOworICAgICAgICAgICAgaWYgKCF2YWx1ZSkgeworICAgICAgICAgICAgICAgIHBhcmFtTm90Rm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIHAtPmludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIXAtPnVwZGF0ZUZyb20oKnZhbHVlKSkgeworICAgICAgICAgICAgICAgIHBhcmFtRGlkTm90Rml0ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBwLT5pbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IEMyUGFyYW06OkluZGV4IGl4IDogaGVhcFBhcmFtSW5kaWNlcykgeworICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbT4gdmFsdWUgPSBfbUZhY3RvcnktPmdldFBhcmFtVmFsdWUoaXgpOworICAgICAgICBpZiAodmFsdWUpIHsKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMlBhcmFtPiBwID0gQzJQYXJhbTo6Q29weSgqdmFsdWUpOworICAgICAgICAgICAgaWYgKHAgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGhlYXBQYXJhbXMtPnB1c2hfYmFjayhzdGQ6Om1vdmUocCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBoZWFwUGFyYW1zLT5wdXNoX2JhY2sobnVsbHB0cik7CisgICAgICAgICAgICAgICAgcGFyYW1Ob01lbW9yeSA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBoZWFwUGFyYW1zLT5wdXNoX2JhY2sobnVsbHB0cik7CisgICAgICAgICAgICBwYXJhbU5vdEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBwYXJhbU5vTWVtb3J5ID8gQzJfTk9fTUVNT1JZIDoKKyAgICAgICAgICAgcGFyYW1Ob3RGb3VuZCA/IEMyX0JBRF9JTkRFWCA6CisgICAgICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgZXJyb3JzIGFyZSBub3QgbWFya2VkIGluIHRoZSByZXR1cm4gdmFsdWUKKyAgICAgICAgICAgcGFyYW1EaWROb3RGaXQgPyBDMl9PSyA6CisgICAgICAgICAgIHBhcmFtV2FzSW52YWxpZCA/IEMyX09LIDogQzJfT0s7Cit9CisKK2MyX3N0YXR1c190IEMySW50ZXJmYWNlSGVscGVyOjpxdWVyeVN1cHBvcnRlZFBhcmFtcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1EZXNjcmlwdG9yPj4gKmNvbnN0IHBhcmFtcykgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgcmV0dXJuIF9tRmFjdG9yeS0+cXVlcnlTdXBwb3J0ZWRQYXJhbXMocGFyYW1zKTsKK30KKworCitjMl9zdGF0dXNfdCBDMkludGVyZmFjZUhlbHBlcjo6cXVlcnlTdXBwb3J0ZWRWYWx1ZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeT4gJmZpZWxkcywgYzJfYmxvY2tpbmdfdCBtYXlCbG9jayBfX3VudXNlZCkgY29uc3QgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgZm9yIChDMkZpZWxkU3VwcG9ydGVkVmFsdWVzUXVlcnkgJnF1ZXJ5IDogZmllbGRzKSB7CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAicXVlcnlpbmcgZmllbGQgIiA8PCBxdWVyeS5maWVsZCgpOworICAgICAgICBDMlBhcmFtOjpJbmRleCBpeCA9IF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRJbmRleChxdWVyeS5maWVsZCgpKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFBhcmFtSGVscGVyPiBwYXJhbSA9IF9tRmFjdG9yeS0+Z2V0UGFyYW0oaXgpOworICAgICAgICBpZiAoIXBhcmFtKSB7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImJhZCBwYXJhbSI7CisgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9CQURfSU5ERVg7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzaXplX3Qgb2ZmcyA9IEdldEJhc2VPZmZzZXQoCisgICAgICAgICAgICAgICAgbVJlZmxlY3RvciwgaXgsCisgICAgICAgICAgICAgICAgX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChxdWVyeS5maWVsZCgpKSAtIHNpemVvZihDMlBhcmFtKSk7CisgICAgICAgIGlmICh+b2ZmcyA9PSAwKSB7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgImZpZWxkIGNvdWxkIG5vdCBiZSBmb3VuZCI7CisgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9OT1RfRk9VTkQ7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBvZmZzICs9IHNpemVvZihDMlBhcmFtKTsKKyAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJmaWVsZCByZXNvbHZlZCB0byAiCisgICAgICAgICAgICAgICAgPDwgU3RyaW5nUHJpbnRmKCJAJTAyengrJTAyeCIsIG9mZnMsIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKHF1ZXJ5LmZpZWxkKCkpKTsKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEZpZWxkSGVscGVyPiBmaWVsZCA9CisgICAgICAgICAgICBwYXJhbS0+ZmluZEZpZWxkKG9mZnMsIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKHF1ZXJ5LmZpZWxkKCkpKTsKKyAgICAgICAgaWYgKCFmaWVsZCkgeworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJiYWQgZmllbGQiOworICAgICAgICAgICAgcXVlcnkuc3RhdHVzID0gQzJfTk9UX0ZPVU5EOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICp2YWx1ZXMgPSBudWxscHRyOworICAgICAgICBzd2l0Y2ggKHF1ZXJ5LnR5cGUoKSkgeworICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6Q1VSUkVOVDoKKyAgICAgICAgICAgIHZhbHVlcyA9IGZpZWxkLT5nZXRTdXBwb3J0ZWRWYWx1ZXMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNRdWVyeTo6UE9TU0lCTEU6CisgICAgICAgICAgICB2YWx1ZXMgPSBmaWVsZC0+Z2V0UG9zc2libGVWYWx1ZXMoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJiYWQgcXVlcnkgdHlwZTogIiA8PCBxdWVyeS50eXBlKCk7CisgICAgICAgICAgICBxdWVyeS5zdGF0dXMgPSBDMl9CQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhbHVlcykgeworICAgICAgICAgICAgcXVlcnkudmFsdWVzID0gKnZhbHVlczsKKyAgICAgICAgICAgIHF1ZXJ5LnN0YXR1cyA9IEMyX09LOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQzJfTE9HKERFQlVHKSA8PCAibm8gdmFsdWVzIHB1Ymxpc2hlZCBieSBjb21wb25lbnQiOworICAgICAgICAgICAgcXVlcnkuc3RhdHVzID0gQzJfQ09SUlVQVEVEOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDMl9PSzsKK30KKworc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBDMkludGVyZmFjZUhlbHBlcjo6bG9jaygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PihtTXV0ZXgpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMkludGVyZmFjZVV0aWxzLmNwcCBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGMxNzI5YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2NvZGVjMi92bmRrL3V0aWwvQzJJbnRlcmZhY2VVdGlscy5jcHAKQEAgLTAsMCArMSwxMzA2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKKyNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV3VudXNlZC1wYXJhbWV0ZXIiCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtdmFyaWFibGUiCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVd1bnVzZWQtdmFsdWUiCisKKyNkZWZpbmUgQzJfTE9HX1ZFUkJPU0UKKworI2luY2x1ZGUgPEMyRGVidWcuaD4KKyNpbmNsdWRlIDxDMlBhcmFtLmg+CisjaW5jbHVkZSA8QzJQYXJhbURlZi5oPgorI2luY2x1ZGUgPEMyUGFyYW1JbnRlcm5hbC5oPgorI2luY2x1ZGUgPHV0aWwvQzJJbnRlcmZhY2VVdGlscy5oPgorCisjaW5jbHVkZSA8Y21hdGg+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKworc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IF9DMkZpZWxkSWQgJmkpOworCitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJQYXJhbUZpZWxkICZpKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlN1cHBvcnRlZFJhbmdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoqCisgKiBIZWxwZXIgY2xhc3MgZm9yIHN1cHBvcnRlZCB2YWx1ZXMgcmFuZ2UgY2FsY3VsYXRpb25zLgorICovCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIEZQPXN0ZDo6aXNfZmxvYXRpbmdfcG9pbnQ8VD46OnZhbHVlPgorc3RydWN0IF9DMlR5cGVkU3VwcG9ydGVkUmFuZ2VIZWxwZXIgeworICAgIC8qKgorICAgICAqIHR5cGUgb2YgcmFuZ2Ugc2l6ZTogYSAtIGIgaWYgYSA+PSBiIGFuZCBhIGFuZCBiIGFyZSBvZiB0eXBlIFQKKyAgICAgKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6bWFrZV91bnNpZ25lZDxUPjo6dHlwZSBEaWZmVHlwZTsKKworICAgIC8qKgorICAgICAqIGNhbGN1bGF0ZSAoaGlnaCAtIGxvdykgbW9kIHN0ZXAKKyAgICAgKi8KKyAgICBzdGF0aWMgRGlmZlR5cGUgbW9kKFQgbG93LCBUIGhpZ2gsIFQgc3RlcCkgeworICAgICAgICByZXR1cm4gRGlmZlR5cGUoaGlnaCAtIGxvdykgJSBEaWZmVHlwZShzdGVwKTsKKyAgICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IF9DMlR5cGVkU3VwcG9ydGVkUmFuZ2VIZWxwZXI8VCwgdHJ1ZT4geworICAgIHR5cGVkZWYgVCBEaWZmVHlwZTsKKworICAgIHN0YXRpYyBEaWZmVHlwZSBtb2QoVCBsb3csIFQgaGlnaCwgVCBzdGVwKSB7CisgICAgICAgIHJldHVybiBmbW9kKGhpZ2ggLSBsb3csIHN0ZXApOworICAgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlN1cHBvcnRlZFJhbmdlPFQ+OjpDMlN1cHBvcnRlZFJhbmdlKGNvbnN0IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMgJnZhbHVlcykgeworICAgIGlmICh2YWx1ZXMudHlwZSA9PSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpSQU5HRSkgeworICAgICAgICBfbU1pbiA9IHZhbHVlcy5yYW5nZS5taW4ucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgX21NYXggPSB2YWx1ZXMucmFuZ2UubWF4LnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgIF9tU3RlcCA9IHZhbHVlcy5yYW5nZS5zdGVwLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgIF9tTnVtID0gdmFsdWVzLnJhbmdlLm51bS5yZWY8VmFsdWVUeXBlPigpOworICAgICAgICBfbURlbm9tID0gdmFsdWVzLnJhbmdlLmRlbm9tLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX21NaW4gPSBNQVhfVkFMVUU7CisgICAgICAgIF9tTWF4ID0gTUlOX1ZBTFVFOworICAgICAgICBfbVN0ZXAgPSBNSU5fU1RFUDsKKyAgICAgICAgX21OdW0gPSAwOworICAgICAgICBfbURlbm9tID0gMDsKKyAgICB9Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIEMyU3VwcG9ydGVkUmFuZ2U8VD46OmNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0IHsKKyAgICAvLyB2YWx1ZSBtdXN0IGZhbGwgYmV0d2VlbiBtaW4gYW5kIG1heAorICAgIGlmICh2YWx1ZSA8IF9tTWluIHx8IHZhbHVlID4gX21NYXgpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBzaW1wbGUgcmFuZ2VzIGNvbnRhaW4gYWxsIHZhbHVlcyBiZXR3ZWVuIG1pbiBhbmQgbWF4CisgICAgaWYgKGlzU2ltcGxlUmFuZ2UoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gbWluIGlzIGFsd2F5cyBwYXJ0IG9mIHRoZSByYW5nZQorICAgIGlmICh2YWx1ZSA9PSBfbU1pbikgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gc3RlcHBlZCByYW5nZXMgcmVxdWlyZSAodmFsIC0gbWluKSAlIHN0ZXAgdG8gYmUgemVybworICAgIGlmIChpc0FyaXRobWV0aWNTZXJpZXMoKSkgeworICAgICAgICByZXR1cm4gX0MyVHlwZWRTdXBwb3J0ZWRSYW5nZUhlbHBlcjxUPjo6bW9kKF9tTWluLCB2YWx1ZSwgX21TdGVwKSA9PSAwOworICAgIH0KKyAgICAvLyBwdXJlIGdlb21ldHJpYyBzZXJpZXMgcmVxdWlyZSAodmFsIC8gbWluKSB0byBiZSBpbnRlZ2VyIG11bHRpcGxlIG9mIChudW0vZGVub20pCisgICAgaWYgKGlzR2VvbWV0cmljU2VyaWVzKCkpIHsKKyAgICAgICAgaWYgKHZhbHVlIDw9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBkb3VibGUgbG9nMmJhc2UgPSBsb2cyKF9tTnVtIC8gX21EZW5vbSk7CisgICAgICAgIGRvdWJsZSBwb3dlciA9IGxscm91bmQobG9nMih2YWx1ZSAvIGRvdWJsZShfbU1pbikpIC8gbG9nMmJhc2UpOworICAgICAgICAvLyBUT0RPOiB2YWxpZGF0ZSB0aGF0IHJlc3VsdCBmYWxscyB3aXRoaW4gcHJlY2lzaW9uIChvdGhlciB0aGFuIHJvdW5kKQorICAgICAgICByZXR1cm4gdmFsdWUgPT0gVChfbU1pbiAqIHBvdyhfbU51bSAvIF9tRGVub20sIHBvd2VyKSArIE1JTl9TVEVQIC8gMik7CisgICAgfQorICAgIC8vIG11bHRpcGx5LWFjY3VtdWxhdGUgc2VyaWVzIHJlcXVpcmUgdmFsaWRhdGluZyBieSB3YWxraW5nIHRocm91Z2ggdGhlIHNlcmllcworICAgIGlmIChpc01hY1NlcmllcygpKSB7CisgICAgICAgIGRvdWJsZSBsYXN0VmFsdWUgPSBfbU1pbjsKKyAgICAgICAgZG91YmxlIGJhc2UgPSBfbU51bSAvIF9tRGVub207CisgICAgICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgICAgICAvLyB0aGlzIGNhc3QgaXMgc2FmZSBhcyBfbU1pbiA8PSBsYXN0VmFsdWUgPD0gX21NYXgKKyAgICAgICAgICAgIGlmIChUKGxhc3RWYWx1ZSArIE1JTl9TVEVQIC8gMikgPT0gdmFsdWUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRvdWJsZSBuZXh0VmFsdWUgPSBmbWEobGFzdFZhbHVlLCBiYXNlLCBfbVN0ZXApOworICAgICAgICAgICAgaWYgKG5leHRWYWx1ZSA8PSBsYXN0VmFsdWUgfHwgbmV4dFZhbHVlID4gX21NYXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7IC8vIHNlcmllcyBpcyBubyBsb25nZXIgbW9ub3RvbmljIG9yIHdpdGhpbiByYW5nZQorICAgICAgICAgICAgfQorICAgICAgICAgICAgbGFzdFZhbHVlID0gbmV4dFZhbHVlOworICAgICAgICB9OworICAgIH0KKyAgICAvLyBpZiB3ZSBhcmUgaGVyZSwgdGhpcyBtdXN0IGJlIGFuIGludmFsaWQgcmFuZ2UKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlN1cHBvcnRlZFJhbmdlPFQ+IEMyU3VwcG9ydGVkUmFuZ2U8VD46OmxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZFJhbmdlPFQ+ICZsaW1pdCkgY29uc3QgeworICAgIC8vIFRPRE8gLSB0aGlzIG9ubHkgd29ya3MgZm9yIHNpbXBsZSByYW5nZXMKKyAgICByZXR1cm4gQzJTdXBwb3J0ZWRSYW5nZShzdGQ6Om1heChfbU1pbiwgbGltaXQuX21NaW4pLCBzdGQ6Om1pbihfbU1heCwgbGltaXQuX21NYXgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgoX21TdGVwLCBsaW1pdC5fbVN0ZXApKTsKK30KKwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTx1aW50OF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8Y2hhcj47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPGludDMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTx1aW50MzJfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8YzJfY250cjMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRSYW5nZTxpbnQ2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8dWludDY0X3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFJhbmdlPGMyX2NudHI2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkUmFuZ2U8ZmxvYXQ+OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlN1cHBvcnRlZEZsYWdzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qKgorICogT3JkZXJlZCBzdXBwb3J0ZWQgZmxhZyBzZXQgZm9yIGEgZmllbGQgb2YgYSBnaXZlbiB0eXBlLgorICovCisvLyBmbG9hdCBmbGFncyBhcmUgbm90IHN1cHBvcnRlZCwgYnV0IGRlZmluZSBhIGZldyBtZXRob2RzIHRvIHN1cHBvcnQgZ2VuZXJpYyBzdXBwb3J0ZWQgdmFsdWVzIGNvZGUKK3RlbXBsYXRlPD4KK2Jvb2wgQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD46OmNvbnRhaW5zKGZsb2F0IHZhbHVlKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZTw+Citjb25zdCBzdGQ6OnZlY3RvcjxmbG9hdD4gQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD46OmZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnZlY3RvcjxmbG9hdD4oKTsKK30KKwordGVtcGxhdGU8PgorQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD4gQzJTdXBwb3J0ZWRGbGFnczxmbG9hdD46OmxpbWl0ZWRUbyhjb25zdCBDMlN1cHBvcnRlZEZsYWdzPGZsb2F0PiAmbGltaXQpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxDMlZhbHVlOjpQcmltaXRpdmU+IHZhbHVlczsKKyAgICByZXR1cm4gQzJTdXBwb3J0ZWRGbGFncyhzdGQ6Om1vdmUodmFsdWVzKSk7Cit9CisKK3RlbXBsYXRlPD4KK2Zsb2F0IEMyU3VwcG9ydGVkRmxhZ3M8ZmxvYXQ+OjptaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIDA7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIEMyU3VwcG9ydGVkRmxhZ3M8VD46OmNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0IHsKKyAgICAvLyB2YWx1ZSBtdXN0IGNvbnRhaW4gdGhlIG1pbmltYWwgbWFzaworICAgIFQgbWluTWFzayA9IG1pbigpOworICAgIGlmICh+dmFsdWUgJiBtaW5NYXNrKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsdWUgJj0gfm1pbk1hc2s7CisgICAgLy8gb3RoZXJ3aXNlLCByZW1vdmUgZmxhZ3MgZnJvbSB2YWx1ZSBhbmQgc2VlIGlmIHdlIGFycml2ZSBhdCAwCisgICAgZm9yIChjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnYgOiBfbVZhbHVlcykgeworICAgICAgICBpZiAodmFsdWUgPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh+dmFsdWUgJiB2LnJlZjxWYWx1ZVR5cGU+KCkpID09IDApIHsKKyAgICAgICAgICAgIHZhbHVlICY9IH52LnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHZhbHVlID09IDA7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citjb25zdCBzdGQ6OnZlY3RvcjxUPiBDMlN1cHBvcnRlZEZsYWdzPFQ+OjpmbGFncygpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxUPiB2YWxzKGMyX21heChfbVZhbHVlcy5zaXplKCksIDF1KSAtIDEpOworICAgIGlmICghX21WYWx1ZXMuZW1wdHkoKSkgeworICAgICAgICBzdGQ6OnRyYW5zZm9ybShfbVZhbHVlcy5jYmVnaW4oKSArIDEsIF9tVmFsdWVzLmNlbmQoKSwgdmFscy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICBbXShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApLT5UIHsKKyAgICAgICAgICAgIHJldHVybiBwLnJlZjxWYWx1ZVR5cGU+KCk7CisgICAgICAgIH0pOworICAgIH0KKyAgICByZXR1cm4gdmFsczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkRmxhZ3M8VD4gQzJTdXBwb3J0ZWRGbGFnczxUPjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8VD4gJmxpbWl0KSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB2YWx1ZXMgPSBfbVZhbHVlczsgLy8gbWFrZSBhIGNvcHkKKyAgICBUIG1pbk1hc2sgPSBtaW4oKSB8IGxpbWl0Lm1pbigpOworICAgIC8vIG1pbmltdW0gbWFzayBtdXN0IGJlIGNvdmVyZWQgYnkgYm90aCB0aGlzIGFuZCBvdGhlcgorICAgIGlmIChsaW1pdC5jb250YWlucyhtaW5NYXNrKSAmJiBjb250YWlucyhtaW5NYXNrKSkgeworICAgICAgICB2YWx1ZXNbMF0gPSBtaW5NYXNrOworICAgICAgICAvLyBrZWVwIG9ubHkgZmxhZ3MgdGhhdCBhcmUgY292ZXJlZCBieSBsaW1pdAorICAgICAgICB2YWx1ZXMuZXJhc2Uoc3RkOjpyZW1vdmVfaWYodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmbGltaXQsIG1pbk1hc2tdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmdikgLT4gYm9vbCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgdmFsdWUgPSB2LnJlZjxWYWx1ZVR5cGU+KCkgfCBtaW5NYXNrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWUgPT0gbWluTWFzayB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWxpbWl0LmNvbnRhaW5zKHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICAgICAgdmFsdWVzLmVuZCgpKTsKKyAgICAgICAgLy8gd2UgYWxzbyBuZWVkIHRvIGRvIGl0IHZpY2UgdmVyc2EKKyAgICAgICAgZm9yIChjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnYgOiBfbVZhbHVlcykgeworICAgICAgICAgICAgVCB2YWx1ZSA9IHYucmVmPFZhbHVlVHlwZT4oKSB8IG1pbk1hc2s7CisgICAgICAgICAgICBpZiAodmFsdWUgIT0gbWluTWFzayAmJiBjb250YWlucyh2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICB2YWx1ZXMuZW1wbGFjZV9iYWNrKChWYWx1ZVR5cGUpdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBDMlN1cHBvcnRlZEZsYWdzKHN0ZDo6bW92ZSh2YWx1ZXMpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK1QgQzJTdXBwb3J0ZWRGbGFnczxUPjo6bWluKCkgY29uc3QgeworICAgIGlmICghX21WYWx1ZXMuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gX21WYWx1ZXMuZnJvbnQoKS50ZW1wbGF0ZSByZWY8VmFsdWVUeXBlPigpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBUKDApOworICAgIH0KK30KKwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczx1aW50OF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8Y2hhcj47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPGludDMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczx1aW50MzJfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8YzJfY250cjMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRGbGFnczxpbnQ2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkRmxhZ3M8dWludDY0X3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZEZsYWdzPGMyX2NudHI2NF90PjsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJTdXBwb3J0ZWRWYWx1ZVNldCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKioKKyAqIE9yZGVyZWQgc3VwcG9ydGVkIHZhbHVlIHNldCBmb3IgYSBmaWVsZCBvZiBhIGdpdmVuIHR5cGUuCisgKi8KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46OmNvbnRhaW5zKFQgdmFsdWUpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpmaW5kX2lmKF9tVmFsdWVzLmNiZWdpbigpLCBfbVZhbHVlcy5jZW5kKCksCisgICAgICAgICAgICBbdmFsdWVdKGNvbnN0IEMyVmFsdWU6OlByaW1pdGl2ZSAmcCkgLT4gYm9vbCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09IHAucmVmPFZhbHVlVHlwZT4oKTsKKyAgICAgICAgICAgIH0pICE9IF9tVmFsdWVzLmNlbmQoKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gJmxpbWl0KSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB2YWx1ZXMgPSBfbVZhbHVlczsgLy8gbWFrZSBhIGNvcHkKKyAgICB2YWx1ZXMuZXJhc2Uoc3RkOjpyZW1vdmVfaWYodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZsaW1pdF0oY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZ2KSAtPiBib29sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWxpbWl0LmNvbnRhaW5zKHYucmVmPFZhbHVlVHlwZT4oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICB2YWx1ZXMuZW5kKCkpOworICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHN0ZDo6bW92ZSh2YWx1ZXMpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB2YWx1ZXMgPSBfbVZhbHVlczsgLy8gbWFrZSBhIGNvcHkKKyAgICB2YWx1ZXMuZXJhc2Uoc3RkOjpyZW1vdmVfaWYodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZsaW1pdF0oY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZ2KSAtPiBib29sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWxpbWl0LmNvbnRhaW5zKHYucmVmPFZhbHVlVHlwZT4oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICB2YWx1ZXMuZW5kKCkpOworICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHN0ZDo6bW92ZSh2YWx1ZXMpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyU3VwcG9ydGVkVmFsdWVTZXQ8VD4gQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6bGltaXRlZFRvKGNvbnN0IEMyU3VwcG9ydGVkRmxhZ3M8VD4gJmxpbWl0KSBjb25zdCB7CisgICAgc3RkOjp2ZWN0b3I8QzJWYWx1ZTo6UHJpbWl0aXZlPiB2YWx1ZXMgPSBfbVZhbHVlczsgLy8gbWFrZSBhIGNvcHkKKyAgICB2YWx1ZXMuZXJhc2Uoc3RkOjpyZW1vdmVfaWYodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZsaW1pdF0oY29uc3QgQzJWYWx1ZTo6UHJpbWl0aXZlICZ2KSAtPiBib29sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIWxpbWl0LmNvbnRhaW5zKHYucmVmPFZhbHVlVHlwZT4oKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgICB2YWx1ZXMuZW5kKCkpOworICAgIHJldHVybiBDMlN1cHBvcnRlZFZhbHVlU2V0KHN0ZDo6bW92ZSh2YWx1ZXMpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NvbnN0IHN0ZDo6dmVjdG9yPFQ+IEMyU3VwcG9ydGVkVmFsdWVTZXQ8VD46OnZhbHVlcygpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxUPiB2YWxzKF9tVmFsdWVzLnNpemUoKSk7CisgICAgc3RkOjp0cmFuc2Zvcm0oX21WYWx1ZXMuY2JlZ2luKCksIF9tVmFsdWVzLmNlbmQoKSwgdmFscy5iZWdpbigpLCBbXShjb25zdCBDMlZhbHVlOjpQcmltaXRpdmUgJnApIC0+IFQgeworICAgICAgICByZXR1cm4gcC5yZWY8VmFsdWVUeXBlPigpOworICAgIH0pOworICAgIHJldHVybiB2YWxzOworfQorCit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PHVpbnQ4X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjaGFyPjsKK3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8aW50MzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PHVpbnQzMl90PjsKKy8vdGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDxjMl9jbnRyMzJfdD47Cit0ZW1wbGF0ZSBjbGFzcyBDMlN1cHBvcnRlZFZhbHVlU2V0PGludDY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDx1aW50NjRfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyU3VwcG9ydGVkVmFsdWVTZXQ8YzJfY250cjY0X3Q+OwordGVtcGxhdGUgY2xhc3MgQzJTdXBwb3J0ZWRWYWx1ZVNldDxmbG9hdD47CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbCB7CisgICAgSW1wbChjb25zdCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzICZ2YWx1ZXMpCisgICAgICAgIDogX21UeXBlKHZhbHVlcy50eXBlKSwKKyAgICAgICAgICBfbVJhbmdlKHZhbHVlcyksCisgICAgICAgICAgX21WYWx1ZXModmFsdWVzKSwKKyAgICAgICAgICBfbUZsYWdzKHZhbHVlcykgeyB9CisKKyAgICBib29sIHN1cHBvcnRzKFQgdmFsdWUpIGNvbnN0OworCitwcml2YXRlOgorICAgIHR5cGVkZWYgdHlwZW5hbWUgX0MyRmllbGRWYWx1ZUhlbHBlcjxUPjo6VmFsdWVUeXBlIFZhbHVlVHlwZTsKKyAgICBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3QgX21UeXBlOworICAgIEMyU3VwcG9ydGVkUmFuZ2U8VmFsdWVUeXBlPiBfbVJhbmdlOworICAgIEMyU3VwcG9ydGVkVmFsdWVTZXQ8VmFsdWVUeXBlPiBfbVZhbHVlczsKKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFZhbHVlVHlwZT4gX21GbGFnczsKKworLy8gICAgZnJpZW5kIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PCA8VD4oc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbCAmaSk7CisvLyAgICBmcmllbmQgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEltcGwgJmkpOworICAgIHN0ZDo6b3N0cmVhbSYgc3RyZWFtT3V0KHN0ZDo6b3N0cmVhbSYgb3MpIGNvbnN0OworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbDo6c3VwcG9ydHMoVCB2YWx1ZSkgY29uc3QgeworICAgIHN3aXRjaCAoX21UeXBlKSB7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6UkFOR0U6IHJldHVybiBfbVJhbmdlLmNvbnRhaW5zKHZhbHVlKTsKKyAgICAgICAgY2FzZSBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjpWQUxVRVM6IHJldHVybiBfbVZhbHVlcy5jb250YWlucyh2YWx1ZSk7CisgICAgICAgIGNhc2UgQzJGaWVsZFN1cHBvcnRlZFZhbHVlczo6RkxBR1M6IHJldHVybiBfbUZsYWdzLmNvbnRhaW5zKHZhbHVlKTsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD46OkMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXIoY29uc3QgQzJGaWVsZFN1cHBvcnRlZFZhbHVlcyAmdmFsdWVzKQorICAgIDogX21JbXBsKHN0ZDo6bWFrZV91bmlxdWU8QzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6SW1wbD4odmFsdWVzKSkgeyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+Ojp+QzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcigpID0gZGVmYXVsdDsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPjo6c3VwcG9ydHMoVCB2YWx1ZSkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPnN1cHBvcnRzKHZhbHVlKTsKK30KKwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50OF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8Y2hhcj47Cit0ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGludDMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjx1aW50MzJfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8YzJfY250cjMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxpbnQ2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8dWludDY0X3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPGMyX2NudHI2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8ZmxvYXQ+OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6SW1wbCB7CisgICAgSW1wbChjb25zdCBDMlBhcmFtRmllbGQgJmZpZWxkKQorICAgICAgICA6IF9tUGFyYW1GaWVsZChmaWVsZCksCisgICAgICAgICAgX21UeXBlKHR5cGVfdDo6UkFOR0UpLAorICAgICAgICAgIF9tRGVmaW5lZChmYWxzZSksCisgICAgICAgICAgX21SYW5nZShDMlN1cHBvcnRlZFJhbmdlPFQ+OjpBbnkoKSksCisgICAgICAgICAgX21WYWx1ZXMoQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPjo6Tm9uZSgpKSwKKyAgICAgICAgICBfbUZsYWdzKEMyU3VwcG9ydGVkRmxhZ3M8VD46Ok5vbmUoKSkgeyB9CisKKyAgICAvKioKKyAgICAgKiBHZXQgQzJQYXJhbUZpZWxkVmFsdWVzIGZyb20gdGhpcyBidWlsZGVyLgorICAgICAqLworICAgIG9wZXJhdG9yIEMyUGFyYW1GaWVsZFZhbHVlcygpIGNvbnN0IHsKKyAgICAgICAgaWYgKCFfbURlZmluZWQpIHsKKyAgICAgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXMoX21QYXJhbUZpZWxkKTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2ggKF9tVHlwZSkgeworICAgICAgICBjYXNlIHR5cGVfdDo6RU1QVFk6CisgICAgICAgIGNhc2UgdHlwZV90OjpWQUxVRVM6CisgICAgICAgICAgICByZXR1cm4gQzJQYXJhbUZpZWxkVmFsdWVzKF9tUGFyYW1GaWVsZCwgKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMpX21WYWx1ZXMpOworICAgICAgICBjYXNlIHR5cGVfdDo6UkFOR0U6CisgICAgICAgICAgICByZXR1cm4gQzJQYXJhbUZpZWxkVmFsdWVzKF9tUGFyYW1GaWVsZCwgKEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXMpX21SYW5nZSk7CisgICAgICAgIGNhc2UgdHlwZV90OjpGTEFHUzoKKyAgICAgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXMoX21QYXJhbUZpZWxkLCAoQzJGaWVsZFN1cHBvcnRlZFZhbHVlcylfbUZsYWdzKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIFRSRVNQQVNTCisgICAgICAgICAgICAvLyBzaG91bGQgbmV2ZXIgZ2V0IGhlcmUKKyAgICAgICAgICAgIHJldHVybiBDMlBhcmFtRmllbGRWYWx1ZXMoX21QYXJhbUZpZWxkKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKiBEZWZpbmUgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXMgdGhlIGN1cnJlbnRseSBzdXBwb3J0ZWQgdmFsdWVzIG9mIHRoaXMgYnVpbGRlci4gKi8KKyAgICB2b2lkIGFueSgpIHsKKyAgICAgICAgX21EZWZpbmVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvKiogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gbm9uZS4gKi8KKyAgICB2b2lkIG5vbmUoKSB7CisgICAgICAgIF9tRGVmaW5lZCA9IHRydWU7CisgICAgICAgIF9tVHlwZSA9IHR5cGVfdDo6VkFMVUVTOworICAgICAgICBfbVZhbHVlcy5jbGVhcigpOworICAgIH0KKworICAgIC8qKiBSZXN0cmljdCAoYW5kIHRodXMgZGVmaW5lKSB0aGUgc3VwcG9ydGVkIHZhbHVlcyB0byB8dmFsdWV8IGFsb25lLiAqLworICAgIHZvaWQgZXF1YWxUbyhUIHZhbHVlKSB7CisgICAgICAgICByZXR1cm4gbGltaXRUbyhDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+OjpPbmVPZih7dmFsdWV9KSk7CisgICAgfQorCisgICAgLyoqIFJlc3RyaWN0IChhbmQgdGh1cyBkZWZpbmUpIHRoZSBzdXBwb3J0ZWQgdmFsdWVzIHRvIGEgdmFsdWUgc2V0LiAqLworICAgIHZvaWQgbGltaXRUbyhjb25zdCBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+ICZsaW1pdCkgeworICAgICAgICBpZiAoIV9tRGVmaW5lZCkgeworICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICJOQS5saW1pdFRvKCIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAvLyBzaG9ydGN1dCBmb3IgZmlyc3QgbGltaXQgYXBwbGllZAorICAgICAgICAgICAgX21EZWZpbmVkID0gdHJ1ZTsKKyAgICAgICAgICAgIF9tVmFsdWVzID0gbGltaXQ7CisgICAgICAgICAgICBfbVR5cGUgPSBfbVZhbHVlcy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpWQUxVRVM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9tVHlwZSkgeworICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OkVNUFRZOgorICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OlZBTFVFUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21WYWx1ZXMpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgX21WYWx1ZXMgPSBfbVZhbHVlcy5saW1pdGVkVG8obGltaXQpOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IF9tVmFsdWVzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OlZBTFVFUzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpSQU5HRToKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21SYW5nZSkgPDwgIikubGltaXRUbygiCisgICAgICAgICAgICAgICAgICAgICAgICA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgICAgICBfbVZhbHVlcyA9IGxpbWl0LmxpbWl0ZWRUbyhfbVJhbmdlKTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbVZhbHVlcy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpWQUxVRVM7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6RkxBR1M6CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIoIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tUmFuZ2UpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgX21WYWx1ZXMgPSBsaW1pdC5saW1pdGVkVG8oX21GbGFncyk7CisgICAgICAgICAgICAgICAgX21UeXBlID0gX21WYWx1ZXMuaXNFbXB0eSgpID8gdHlwZV90OjpFTVBUWSA6IHR5cGVfdDo6VkFMVUVTOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBDMl9MT0coRkFUQUwpOyAvLyBzaG91bGQgbm90IGJlIGhlcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE86IHN1cHBvcnQgZmxhZ3MKKyAgICAgICAgfQorICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIiA9ICIgPDwgX21UeXBlIDw8ICI6IiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tVmFsdWVzKTsKKyAgICB9CisKKyAgICAvKiogUmVzdHJpY3QgKGFuZCB0aHVzIGRlZmluZSkgdGhlIHN1cHBvcnRlZCB2YWx1ZXMgdG8gYSBmbGFnIHNldC4gKi8KKyAgICB2b2lkIGxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIHsKKyAgICAgICAgaWYgKCFfbURlZmluZWQpIHsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiTkEubGltaXRUbygiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKworICAgICAgICAgICAgLy8gc2hvcnRjdXQgZm9yIGZpcnN0IGxpbWl0IGFwcGxpZWQKKyAgICAgICAgICAgIF9tRGVmaW5lZCA9IHRydWU7CisgICAgICAgICAgICBfbUZsYWdzID0gbGltaXQ7CisgICAgICAgICAgICBfbVR5cGUgPSBfbUZsYWdzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OkZMQUdTOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3dpdGNoIChfbVR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpFTVBUWToKKyAgICAgICAgICAgIGNhc2UgdHlwZV90OjpWQUxVRVM6CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIoIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tVmFsdWVzKSA8PCAiKS5saW1pdFRvKCIKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4obGltaXQpIDw8ICIpIjsKKworICAgICAgICAgICAgICAgIF9tVmFsdWVzID0gX21WYWx1ZXMubGltaXRlZFRvKGxpbWl0KTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbVZhbHVlcy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpWQUxVRVM7CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIgPSAiIDw8IF9tVHlwZSA8PCAiOiIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVZhbHVlcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6RkxBR1M6CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIoIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tRmxhZ3MpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworCisgICAgICAgICAgICAgICAgX21GbGFncyA9IF9tRmxhZ3MubGltaXRlZFRvKGxpbWl0KTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbUZsYWdzLmlzRW1wdHkoKSA/IHR5cGVfdDo6RU1QVFkgOiB0eXBlX3Q6OkZMQUdTOworICAgICAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiID0gIiA8PCBfbVR5cGUgPDwgIjoiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21GbGFncyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6UkFOR0U6CisgICAgICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAibGltaXRpbmcgcmFuZ2VzIHRvIGZsYWdzIGlzIG5vdCBzdXBwb3J0ZWQiOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IHR5cGVfdDo6RU1QVFk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEMyX0xPRyhGQVRBTCk7IC8vIHNob3VsZCBub3QgYmUgaGVyZQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBsaW1pdFRvKGNvbnN0IEMyU3VwcG9ydGVkUmFuZ2U8VD4gJmxpbWl0KSB7CisgICAgICAgIGlmICghX21EZWZpbmVkKSB7CisgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIk5BLmxpbWl0VG8oIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KGxpbWl0KSA8PCAiKSI7CisKKyAgICAgICAgICAgIC8vIHNob3J0Y3V0IGZvciBmaXJzdCBsaW1pdCBhcHBsaWVkCisgICAgICAgICAgICBfbURlZmluZWQgPSB0cnVlOworICAgICAgICAgICAgX21SYW5nZSA9IGxpbWl0OworICAgICAgICAgICAgX21UeXBlID0gX21SYW5nZS5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpSQU5HRTsKKyAgICAgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiID0gIiA8PCBfbVR5cGUgPDwgIjoiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21SYW5nZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKF9tVHlwZSkgeworICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OkVNUFRZOgorICAgICAgICAgICAgY2FzZSB0eXBlX3Q6OlZBTFVFUzoKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIigiIDw8IEMyRmllbGRTdXBwb3J0ZWRWYWx1ZXNIZWxwZXI8VD4oX21WYWx1ZXMpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworICAgICAgICAgICAgICAgIF9tVmFsdWVzID0gX21WYWx1ZXMubGltaXRlZFRvKGxpbWl0KTsKKyAgICAgICAgICAgICAgICBfbVR5cGUgPSBfbVZhbHVlcy5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpWQUxVRVM7CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIgPSAiIDw8IF9tVHlwZSA8PCAiOiIgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihfbVZhbHVlcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6RkxBR1M6CisgICAgICAgICAgICAgICAgQzJfTE9HKEZBVEFMKSA8PCAibGltaXRpbmcgZmxhZ3MgdG8gcmFuZ2VzIGlzIG5vdCBzdXBwb3J0ZWQiOworICAgICAgICAgICAgICAgIF9tVHlwZSA9IHR5cGVfdDo6RU1QVFk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIHR5cGVfdDo6UkFOR0U6CisgICAgICAgICAgICAgICAgQzJfTE9HKFZFUkJPU0UpIDw8ICIoIiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tUmFuZ2UpIDw8ICIpLmxpbWl0VG8oIgorICAgICAgICAgICAgICAgICAgICAgICAgPDwgQzJGaWVsZFN1cHBvcnRlZFZhbHVlc0hlbHBlcjxUPihsaW1pdCkgPDwgIikiOworICAgICAgICAgICAgICAgIF9tUmFuZ2UgPSBfbVJhbmdlLmxpbWl0ZWRUbyhsaW1pdCk7CisgICAgICAgICAgICAgICAgQzJfRENIRUNLKF9tVmFsdWVzLmlzRW1wdHkoKSk7CisgICAgICAgICAgICAgICAgX21UeXBlID0gX21SYW5nZS5pc0VtcHR5KCkgPyB0eXBlX3Q6OkVNUFRZIDogdHlwZV90OjpSQU5HRTsKKyAgICAgICAgICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgIiA9ICIgPDwgX21UeXBlIDw8ICI6IiA8PCBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzSGVscGVyPFQ+KF9tUmFuZ2UpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBDMl9MT0coRkFUQUwpOyAvLyBzaG91bGQgbm90IGJlIGhlcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICB2b2lkIGluc3RhbnRpYXRlKCkgX191bnVzZWQgeworICAgICAgICAodm9pZClfbVZhbHVlcy52YWx1ZXMoKTsgLy8gaW5zdGFudGlhdGUgbm9uLWNvbnN0IHZhbHVlcygpCisgICAgfQorCisgICAgdm9pZCBpbnN0YW50aWF0ZSgpIGNvbnN0IF9fdW51c2VkIHsKKyAgICAgICAgKHZvaWQpX21WYWx1ZXMudmFsdWVzKCk7IC8vIGluc3RhbnRpYXRlIGNvbnN0IHZhbHVlcygpCisgICAgfQorCisgICAgdHlwZWRlZiBDMkZpZWxkU3VwcG9ydGVkVmFsdWVzOjp0eXBlX3QgdHlwZV90OworCisgICAgQzJQYXJhbUZpZWxkIF9tUGFyYW1GaWVsZDsKKyAgICB0eXBlX3QgX21UeXBlOworICAgIGJvb2wgX21EZWZpbmVkOworICAgIEMyU3VwcG9ydGVkUmFuZ2U8VD4gX21SYW5nZTsKKyAgICBDMlN1cHBvcnRlZFZhbHVlU2V0PFQ+IF9tVmFsdWVzOworICAgIEMyU3VwcG9ydGVkRmxhZ3M8VD4gX21GbGFnczsKKworfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46Om9wZXJhdG9yIEMyUGFyYW1GaWVsZFZhbHVlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gKEMyUGFyYW1GaWVsZFZhbHVlcykoKl9tSW1wbC5nZXQoKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyKGNvbnN0IEMyUGFyYW1GaWVsZCAmZmllbGQpCisgICAgOiBfbUltcGwoc3RkOjptYWtlX3VuaXF1ZTxDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpJbXBsPihmaWVsZCkpIHsgfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6YW55KCkgeworICAgIF9tSW1wbC0+YW55KCk7CisgICAgcmV0dXJuICp0aGlzOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPjo6bm9uZSgpIHsKKyAgICBfbUltcGwtPm5vbmUoKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjplcXVhbFRvKFQgdmFsdWUpIHsKKyAgICBfbUltcGwtPmVxdWFsVG8odmFsdWUpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRWYWx1ZVNldDxUPiAmbGltaXQpIHsKKyAgICBfbUltcGwtPmxpbWl0VG8obGltaXQpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRGbGFnczxUPiAmbGltaXQpIHsKKyAgICBfbUltcGwtPmxpbWl0VG8obGltaXQpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OmxpbWl0VG8oY29uc3QgQzJTdXBwb3J0ZWRSYW5nZTxUPiAmbGltaXQpIHsKKyAgICBfbUltcGwtPmxpbWl0VG8obGltaXQpOworICAgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK0MyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD46OkMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXIoY29uc3QgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxUPiAmb3RoZXIpCisgICAgOiBfbUltcGwoc3RkOjptYWtlX3VuaXF1ZTxDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpJbXBsPigqb3RoZXIuX21JbXBsLmdldCgpKSkgeyB9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+ICZDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpvcGVyYXRvcj0oCisgICAgICAgIGNvbnN0IEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8VD4gJm90aGVyKSB7CisgICAgX21JbXBsID0gc3RkOjptYWtlX3VuaXF1ZTxDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+OjpJbXBsPigqb3RoZXIuX21JbXBsLmdldCgpKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPFQ+Ojp+QzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcigpID0gZGVmYXVsdDsKKwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjx1aW50OF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8Y2hhcj47Cit0ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPGludDMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjx1aW50MzJfdD47CisvL3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8YzJfY250cjMyX3Q+OwordGVtcGxhdGUgY2xhc3MgQzJQYXJhbUZpZWxkVmFsdWVzQnVpbGRlcjxpbnQ2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8dWludDY0X3Q+OworLy90ZW1wbGF0ZSBjbGFzcyBDMlBhcmFtRmllbGRWYWx1ZXNCdWlsZGVyPGMyX2NudHI2NF90PjsKK3RlbXBsYXRlIGNsYXNzIEMyUGFyYW1GaWVsZFZhbHVlc0J1aWxkZXI8ZmxvYXQ+OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyOjpDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyKCkgOiBfbUNvbmZsaWN0cygpIHsgfQorCitDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyOjpDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyKEMyUGFyYW1GaWVsZFZhbHVlcyAmJmNvbmZsaWN0KSB7CisgICAgX21Db25mbGljdHMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShjb25mbGljdCkpOworfQorCitDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyJiBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyOjp3aXRoKEMyUGFyYW1GaWVsZFZhbHVlcyAmJmNvbmZsaWN0KSB7CisgICAgX21Db25mbGljdHMuZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShjb25mbGljdCkpOworICAgIHJldHVybiAqdGhpczsKK30KKworc3RkOjp2ZWN0b3I8QzJQYXJhbUZpZWxkVmFsdWVzPiBDMlNldHRpbmdDb25mbGljdHNCdWlsZGVyOjpyZXRyaWV2ZUNvbmZsaWN0cygpIHsKKyAgICByZXR1cm4gc3RkOjptb3ZlKF9tQ29uZmxpY3RzKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMlNldHRpbmdSZXN1bHQvc0J1aWxkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitDMlNldHRpbmdSZXN1bHQgQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6UmVhZE9ubHkoY29uc3QgQzJQYXJhbUZpZWxkICZwYXJhbSkgeworICAgIHJldHVybiBDMlNldHRpbmdSZXN1bHQgeyBDMlNldHRpbmdSZXN1bHQ6OlJFQURfT05MWSwgeyBwYXJhbSB9LCB7IH0gfTsKK30KKworQzJTZXR0aW5nUmVzdWx0IEMyU2V0dGluZ1Jlc3VsdEJ1aWxkZXI6OkJhZFZhbHVlKGNvbnN0IEMyUGFyYW1GaWVsZCAmcGFyYW1GaWVsZCwgYm9vbCBpc0luZm8pIHsKKyAgICByZXR1cm4geyBpc0luZm8gPyBDMlNldHRpbmdSZXN1bHQ6OklORk9fQkFEX1ZBTFVFIDogQzJTZXR0aW5nUmVzdWx0OjpCQURfVkFMVUUsCisgICAgICAgICAgICAgeyBwYXJhbUZpZWxkIH0sIHsgfSB9OworfQorCitDMlNldHRpbmdSZXN1bHQgQzJTZXR0aW5nUmVzdWx0QnVpbGRlcjo6Q29uZmxpY3QoCisgICAgICAgIEMyUGFyYW1GaWVsZFZhbHVlcyAmJnBhcmFtRmllbGRWYWx1ZXMsIEMyU2V0dGluZ0NvbmZsaWN0c0J1aWxkZXIgJmNvbmZsaWN0cywgYm9vbCBpc0luZm8pIHsKKyAgICBDMl9DSEVDSyghY29uZmxpY3RzLmVtcHR5KCkpOworICAgIGlmIChpc0luZm8pIHsKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdCB7CisgICAgICAgICAgICBDMlNldHRpbmdSZXN1bHQ6OklORk9fQ09ORkxJQ1QsCisgICAgICAgICAgICBzdGQ6Om1vdmUocGFyYW1GaWVsZFZhbHVlcyksIGNvbmZsaWN0cy5yZXRyaWV2ZUNvbmZsaWN0cygpCisgICAgICAgIH07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEMyU2V0dGluZ1Jlc3VsdCB7CisgICAgICAgICAgICBDMlNldHRpbmdSZXN1bHQ6OkNPTkZMSUNULAorICAgICAgICAgICAgc3RkOjptb3ZlKHBhcmFtRmllbGRWYWx1ZXMpLCBjb25mbGljdHMucmV0cmlldmVDb25mbGljdHMoKQorICAgICAgICB9OworICAgIH0KK30KKworQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI6OkMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKEMyU2V0dGluZ1Jlc3VsdCAmJnJlc3VsdCkKKyAgICAgICAgOiBfbVN0YXR1cyhDMl9CQURfVkFMVUUpIHsKKyAgICBfbVJlc3VsdHMuZW1wbGFjZV9iYWNrKG5ldyBDMlNldHRpbmdSZXN1bHQoc3RkOjptb3ZlKHJlc3VsdCkpKTsKK30KKworQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXIgQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI6OnBsdXMoQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXImJiByZXN1bHRzKSB7CisgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiAmciA6IHJlc3VsdHMuX21SZXN1bHRzKSB7CisgICAgICAgIF9tUmVzdWx0cy5lbXBsYWNlX2JhY2soc3RkOjptb3ZlKHIpKTsKKyAgICB9CisgICAgcmVzdWx0cy5fbVJlc3VsdHMuY2xlYXIoKTsKKyAgICAvLyBUT0RPOiBtU3RhdHVzCisgICAgcmV0dXJuIHN0ZDo6bW92ZSgqdGhpcyk7Cit9CisKK2MyX3N0YXR1c190IEMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyOjpyZXRyaWV2ZUZhaWx1cmVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4qIGNvbnN0IGZhaWx1cmVzKSB7CisgICAgZm9yIChzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0PiAmciA6IF9tUmVzdWx0cykgeworICAgICAgICBmYWlsdXJlcy0+ZW1wbGFjZV9iYWNrKHN0ZDo6bW92ZShyKSk7CisgICAgfQorICAgIF9tUmVzdWx0cy5jbGVhcigpOworICAgIHJldHVybiBfbVN0YXR1czsKK30KKworQzJTZXR0aW5nUmVzdWx0c0J1aWxkZXI6OkMyU2V0dGluZ1Jlc3VsdHNCdWlsZGVyKGMyX3N0YXR1c190IHN0YXR1cykgOiBfbVN0YXR1cyhzdGF0dXMpIHsKKyAgICAvLyBzdGF0dXMgbXVzdCBiZSBvbmUgb2YgT0ssIEJBRF9TVEFURSwgVElNRURfT1VUIG9yIENPUlJVUFRFRAorICAgIC8vIG1haW5seTogQkxPQ0tJTkcsIEJBRF9JTkRFWCwgQkFEX1ZBTFVFIGFuZCBOT19NRU1PUlkgcmVxdWlyZXMgYSBzZXR0aW5nIGF0dGVtcHQKK30KKworI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlscyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBDMl9ISURFIEMyRmllbGRVdGlsczo6X0luc3BlY3RvciB7CisgICAgLy8vIHJldHVybnMgdGhlIGltcGxlbWVudGF0aW9uIG9iamVjdAorICAgIGlubGluZSBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPEluZm86OkltcGw+IEdldEltcGwoY29uc3QgSW5mbyAmaW5mbykgeworICAgICAgICByZXR1cm4gaW5mby5fbUltcGw7CisgICAgfQorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDMkZpZWxkVXRpbHM6OkluZm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgQzJfSElERSBDMkZpZWxkVXRpbHM6OkluZm86OkltcGwgeworICAgIEMyRmllbGREZXNjcmlwdG9yIGZpZWxkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBwYXJlbnQ7CisgICAgdWludDMyX3QgaW5kZXg7CisgICAgdWludDMyX3QgZGVwdGg7CisgICAgdWludDMyX3QgYmFzZUZpZWxkT2Zmc2V0OworICAgIHVpbnQzMl90IGFycmF5T2Zmc2V0OworICAgIHVpbnQzMl90IHVzZWRFeHRlbnQ7CisKKyAgICAvLy8gY3JlYXRlcyBhIGNvcHkgb2YgdGhpcyBvYmplY3QgaW5jbHVkaW5nIGNvcGllcyBvZiBpdHMgcGFyZW50IGNoYWluCisgICAgSW1wbCBjbG9uZSgpIGNvbnN0OworCisgICAgLy8vIGNyZWF0ZXMgYSBjb3B5IG9mIGEgc2hhcmVkIHBvaW50ZXIgdG8gYW4gb2JqZWN0CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBDbG9uZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gJik7CisKKyAgICBJbXBsKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmaWVsZF8sIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBwYXJlbnRfLAorICAgICAgICAgICAgdWludDMyX3QgaW5kZXhfLCB1aW50MzJfdCBkZXB0aF8sIHVpbnQzMl90IGJhc2VGaWVsZE9mZnNldF8sCisgICAgICAgICAgICB1aW50MzJfdCBhcnJheU9mZnNldF8sIHVpbnQzMl90IHVzZWRFeHRlbnRfKQorICAgICAgICA6IGZpZWxkKGZpZWxkXyksIHBhcmVudChwYXJlbnRfKSwgaW5kZXgoaW5kZXhfKSwgZGVwdGgoZGVwdGhfKSwKKyAgICAgICAgICBiYXNlRmllbGRPZmZzZXQoYmFzZUZpZWxkT2Zmc2V0XyksIGFycmF5T2Zmc2V0KGFycmF5T2Zmc2V0XyksIHVzZWRFeHRlbnQodXNlZEV4dGVudF8pIHsgfQorfTsKKworc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gQzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsOjpDbG9uZShjb25zdCBzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gJmluZm8pIHsKKyAgICBpZiAoaW5mbykgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxJbXBsPihpbmZvLT5jbG9uZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK0MyRmllbGRVdGlsczo6SW5mbzo6SW1wbCBDMkZpZWxkVXRpbHM6OkluZm86OkltcGw6OmNsb25lKCkgY29uc3QgeworICAgIEltcGwgcmVzID0gSW1wbCgqdGhpcyk7CisgICAgcmVzLnBhcmVudCA9IENsb25lKHJlcy5wYXJlbnQpOworICAgIHJldHVybiByZXM7Cit9CisKK0MyRmllbGRVdGlsczo6SW5mbzo6SW5mbyhzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCkKKyAgICA6IF9tSW1wbChpbXBsKSB7IH0KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6YXJyYXlPZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+YXJyYXlPZmZzZXQ7Cit9CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OmFycmF5U2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZXh0ZW50KCkgKiBzaXplKCk7Cit9CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OmJhc2VGaWVsZE9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5iYXNlRmllbGRPZmZzZXQ7Cit9OworCitzaXplX3QgQzJGaWVsZFV0aWxzOjpJbmZvOjpkZXB0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5kZXB0aDsKK30KKworc2l6ZV90IEMyRmllbGRVdGlsczo6SW5mbzo6ZXh0ZW50KCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPnVzZWRFeHRlbnQ7Cit9CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OmluZGV4KCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmluZGV4OworfQorCitib29sIEMyRmllbGRVdGlsczo6SW5mbzo6aXNBcml0aG1ldGljKCkgY29uc3QgeworICAgIHN3aXRjaCAoX21JbXBsLT5maWVsZC50eXBlKCkpIHsKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpCTE9COgorICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OkNOVFIzMjoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpDTlRSNjQ6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6RkxPQVQ6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UMzI6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6SU5UNjQ6CisgICAgY2FzZSBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSSU5HOgorICAgIGNhc2UgQzJGaWVsZERlc2NyaXB0b3I6OlVJTlQzMjoKKyAgICBjYXNlIEMyRmllbGREZXNjcmlwdG9yOjpVSU5UNjQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9Cit9CisKK2Jvb2wgQzJGaWVsZFV0aWxzOjpJbmZvOjppc0ZsZXhpYmxlKCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmZpZWxkLmV4dGVudCgpID09IDA7Cit9CisKK0MyU3RyaW5nIEMyRmllbGRVdGlsczo6SW5mbzo6bmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gX21JbXBsLT5maWVsZC5uYW1lKCk7Cit9CisKK2NvbnN0IEMyRmllbGRVdGlsczo6SW5mbzo6TmFtZWRWYWx1ZXNUeXBlICZDMkZpZWxkVXRpbHM6OkluZm86Om5hbWVkVmFsdWVzKCkgY29uc3QgeworICAgIHJldHVybiBfbUltcGwtPmZpZWxkLm5hbWVkVmFsdWVzKCk7Cit9CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86Om9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX0MyUGFyYW1JbnNwZWN0b3I6OkdldE9mZnNldChfbUltcGwtPmZpZWxkKTsKK30KKworQzJGaWVsZFV0aWxzOjpJbmZvIEMyRmllbGRVdGlsczo6SW5mbzo6cGFyZW50KCkgY29uc3QgeworICAgIHJldHVybiBJbmZvKF9tSW1wbC0+cGFyZW50KTsKK307CisKK3NpemVfdCBDMkZpZWxkVXRpbHM6OkluZm86OnNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRTaXplKF9tSW1wbC0+ZmllbGQpOworfQorCitDMkZpZWxkVXRpbHM6OkluZm86OnR5cGVfdCBDMkZpZWxkVXRpbHM6OkluZm86OnR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIF9tSW1wbC0+ZmllbGQudHlwZSgpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlsczo6SXRlcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdHJ1Y3QgQzJfSElERSBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsIDogcHVibGljIF9DMlBhcmFtSW5zcGVjdG9yIHsKKyAgICBJbXBsKCkgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB+SW1wbCgpID0gZGVmYXVsdDsKKworICAgIC8vLyBpbXBsZW1lbnRzIG9iamVjdCBlcXVhbGl0eQorICAgIHZpcnR1YWwgYm9vbCBlcXVhbHMoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEltcGw+ICZvdGhlcikgY29uc3QgeworICAgICAgICByZXR1cm4gb3RoZXIgIT0gbnVsbHB0ciAmJiBtSGVhZCA9PSBvdGhlci0+bUhlYWQ7CisgICAgfTsKKworICAgIC8vLyByZXR1cm5zIHRoZSBpbmZvIHBvaW50ZWQgdG8gYnkgdGhpcyBpdGVyYXRvcgorICAgIHZpcnR1YWwgdmFsdWVfdHlwZSBnZXQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBJbmZvKG1IZWFkKTsKKyAgICB9CisKKyAgICAvLy8gaW5jcmVtZW50cyB0aGlzIGl0ZXJhdG9yCisgICAgdmlydHVhbCB2b2lkIGluY3JlbWVudCgpIHsKKyAgICAgICAgLy8gbm90ZTogdGhpcyBjYW5ub3QgYmUgYWJzdHJhY3QgYXMgd2UgaW5zdGFudGlhdGUgdGhpcyBmb3IgTGlzdDo6ZW5kKCkuIGluY3JlbWVudCB0byBlbmQoKQorICAgICAgICAvLyBpbnN0ZWFkLgorICAgICAgICBtSGVhZC5yZXNldCgpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIEltcGwoc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gaGVhZCkKKyAgICAgICAgOiBtSGVhZChoZWFkKSB7IH0KKworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbmZvOjpJbXBsPiBtSGVhZDsgLy8vPCBjdXJyZW50IGZpZWxkCit9OworCitDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJdGVyYXRvcihzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCkKKyAgICA6IG1JbXBsKGltcGwpIHsgfQorCitDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjp2YWx1ZV90eXBlIEMyRmllbGRVdGlsczo6SXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldCgpOworfQorCitDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yJiBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpvcGVyYXRvcisrKCkgeworICAgIG1JbXBsLT5pbmNyZW1lbnQoKTsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK2Jvb2wgQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6b3BlcmF0b3I9PShjb25zdCBJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmVxdWFscyhvdGhlci5tSW1wbCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzOjpMaXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RydWN0IEMyX0hJREUgQzJGaWVsZFV0aWxzOjpMaXN0OjpJbXBsIHsKKyAgICB2aXJ0dWFsIHN0ZDo6c2hhcmVkX3B0cjxJdGVyYXRvcjo6SW1wbD4gYmVnaW4oKSBjb25zdCA9IDA7CisKKyAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBsaXN0CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8SXRlcmF0b3I6OkltcGw+IGVuZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9zaGFyZWQ8SXRlcmF0b3I6OkltcGw+KCk7CisgICAgfQorCisgICAgdmlydHVhbCB+SW1wbCgpID0gZGVmYXVsdDsKK307CisKK0MyRmllbGRVdGlsczo6TGlzdDo6TGlzdChzdGQ6OnNoYXJlZF9wdHI8SW1wbD4gaW1wbCkKKyAgICA6IG1JbXBsKGltcGwpIHsgfQorCitDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yIEMyRmllbGRVdGlsczo6TGlzdDo6YmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIEMyRmllbGRVdGlsczo6SXRlcmF0b3IobUltcGwtPmJlZ2luKCkpOworfQorCitDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yIEMyRmllbGRVdGlsczo6TGlzdDo6ZW5kKCkgY29uc3QgeworICAgIHJldHVybiBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yKG1JbXBsLT5lbmQoKSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQzJGaWVsZFV0aWxzOjplbnVtZXJhdGVGaWVsZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCituYW1lc3BhY2UgeworCisvKioKKyAqIEl0ZXJhdG9yIGJhc2UgY2xhc3MgaGVscGVyIHRoYXQgYWxsb3dzIGRlc2NlbmRpbmcgaW50byB0aGUgZmllbGQgaGllcmFyY2h5LgorICovCitzdHJ1Y3QgQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIgOiBwdWJsaWMgQzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbCB7CisgICAgdmlydHVhbCB+QzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gcmV0dXJucyB0aGUgYmFzZS1maWVsZCdzIG9mZnNldCBvZiB0aGUgcGFyZW50IGZpZWxkIChvciB0aGUgcGFyYW0gb2Zmc2V0IGlmIG5vIHBhcmVudCkKKyAgICBzdGF0aWMgaW5saW5lIHVpbnQzMl90IEdldFBhcmVudEJhc2VGaWVsZE9mZnNldCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IHBhcmVudCkgeworICAgICAgICByZXR1cm4gcGFyZW50ID09IG51bGxwdHIgPyBzaXplb2YoQzJQYXJhbSkgOiBwYXJlbnQtPmJhc2VGaWVsZE9mZnNldDsKKyAgICB9CisKKyAgICAvLy8gcmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBwYXJlbnQgZmllbGQgKG9yIHRoZSBwYXJhbSkKKyAgICBzdGF0aWMgaW5saW5lIHVpbnQzMl90IEdldFBhcmVudE9mZnNldChjb25zdCBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJbmZvOjpJbXBsPiBwYXJlbnQpIHsKKyAgICAgICAgcmV0dXJuIHBhcmVudCA9PSBudWxscHRyID8gc2l6ZW9mKEMyUGFyYW0pIDogR2V0T2Zmc2V0KHBhcmVudC0+ZmllbGQpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyKAorICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IHJlZmxlY3RvciwKKyAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtU2l6ZSwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IGhlYWQgPSBudWxscHRyKQorICAgICAgICA6IEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGwoaGVhZCksCisgICAgICAgICAgbVBhcmFtU2l6ZShwYXJhbVNpemUpLAorICAgICAgICAgIG1SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworICAgIC8vLyByZXR1cm5zIGEgbGVhZiBpbmZvIG9iamVjdCBhdCBhIHNwZWNpZmljIGluZGV4IGZvciBhIGNoaWxkIGZpZWxkCisgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gbWFrZUxlYWYoCisgICAgICAgICAgICBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmZmllbGQsIHVpbnQzMl90IGluZGV4KSB7CisgICAgICAgIHVpbnQzMl90IHBhcmVudE9mZnNldCA9IEdldFBhcmVudE9mZnNldChtSGVhZCk7CisgICAgICAgIHVpbnQzMl90IGFycmF5T2Zmc2V0ID0gcGFyZW50T2Zmc2V0ICsgR2V0T2Zmc2V0KGZpZWxkKTsKKyAgICAgICAgdWludDMyX3QgdXNlZEV4dGVudCA9IGZpZWxkLmV4dGVudCgpID8gOgorICAgICAgICAgICAgICAgIChzdGQ6Om1heChhcnJheU9mZnNldCwgbVBhcmFtU2l6ZSkgLSBhcnJheU9mZnNldCkgLyBHZXRTaXplKGZpZWxkKTsKKworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+KAorICAgICAgICAgICAgICAgIE9mZnNldEZpZWxkRGVzY3JpcHRvcihmaWVsZCwgcGFyZW50T2Zmc2V0ICsgaW5kZXggKiBHZXRTaXplKGZpZWxkKSksCisgICAgICAgICAgICAgICAgbUhlYWQgLyogcGFyZW50ICovLCBpbmRleCwgbUhlYWQgPT0gbnVsbHB0ciA/IDAgOiBtSGVhZC0+ZGVwdGggKyAxLAorICAgICAgICAgICAgICAgIEdldFBhcmVudEJhc2VGaWVsZE9mZnNldChtSGVhZCkgKyBHZXRPZmZzZXQoZmllbGQpLAorICAgICAgICAgICAgICAgIGFycmF5T2Zmc2V0LCB1c2VkRXh0ZW50KTsKKyAgICB9CisKKyAgICAvLy8gcmV0dXJucyB3aGV0aGVyIHRoaXMgc3RydWN0IGluZGV4IGhhdmUgYmVlbiB0cmF2ZXJzZWQgdG8gZ2V0IHRvIHRoaXMgZmllbGQKKyAgICBib29sIHZpc2l0ZWQoQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4KSBjb25zdCB7CisgICAgICAgIGZvciAoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gJnNkIDogbUhpc3RvcnkpIHsKKyAgICAgICAgICAgIGlmIChzZC0+Y29yZUluZGV4KCkgPT0gaW5kZXgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDMyX3QgbVBhcmFtU2l6ZTsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gbVJlZmxlY3RvcjsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTdHJ1Y3REZXNjcmlwdG9yPj4gbUhpc3Rvcnk7IC8vIHN0cnVjdHVyZSB0eXBlcyB2aXNpdGVkCit9OworCisvKioKKyAqIEl0ZXJhdG9yIGltcGxlbWVudGluZyBlbnVtZXJhdGVGaWVsZHMoKSB0aGF0IHZpc2l0cyBlYWNoIGJhc2UgZmllbGQuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvciA6IHB1YmxpYyBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvckhlbHBlciB7CisgICAgLy8vIGVudW1lcmF0ZSBiYXNlIGZpZWxkcyBvZiBhIHBhcmFtZXRlcgorICAgIEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9yKGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICA6IEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyKHJlZmxlY3RvciwgcGFyYW0uc2l6ZSgpKSB7CisgICAgICAgIGRlc2NlbmRJbnRvKHBhcmFtLmNvcmVJbmRleCgpKTsKKyAgICB9CisKKyAgICAvLy8gZW51bWVyYXRlIGJhc2UgZmllbGRzIG9mIGEgZmllbGQKKyAgICBDMkZpZWxkVXRpbHNGaWVsZHNJdGVyYXRvcihzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3I+IGltcGwpCisgICAgICAgIDogQzJGaWVsZFV0aWxzRmllbGRzSXRlcmF0b3JIZWxwZXIoaW1wbC0+bVJlZmxlY3RvciwgaW1wbC0+bVBhcmFtU2l6ZSwgaW1wbC0+bUhlYWQpIHsKKyAgICAgICAgbUhpc3RvcnkgPSBpbXBsLT5tSGlzdG9yeTsKKyAgICAgICAgaWYgKG1IZWFkLT5maWVsZC50eXBlKCkgJiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IHsgbUhlYWQtPmZpZWxkLnR5cGUoKSAmfkMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRyB9OworICAgICAgICAgICAgaWYgKCF2aXNpdGVkKGluZGV4KSkgeworICAgICAgICAgICAgICAgIGRlc2NlbmRJbnRvKGluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgfkMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgLy8vIEluY3JlbWVudHMgdGhpcyBpdGVyYXRvciBieSB2aXNpdGluZyBlYWNoIGJhc2UgZmllbGQuCisgICAgdmlydHVhbCB2b2lkIGluY3JlbWVudCgpIG92ZXJyaWRlIHsKKyAgICAgICAgLy8gZG9uJ3QgZ28gcGFzdCBlbmQKKyAgICAgICAgaWYgKG1IZWFkID09IG51bGxwdHIgfHwgX21GaWVsZHMuZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gZGVzY2VuZCBpbnRvIHN0cnVjdHVyZXMKKyAgICAgICAgaWYgKG1IZWFkLT5maWVsZC50eXBlKCkgJiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpIHsKKyAgICAgICAgICAgIEMyUGFyYW06OkNvcmVJbmRleCBpbmRleCA9IHsgbUhlYWQtPmZpZWxkLnR5cGUoKSAmfkMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRyB9OworICAgICAgICAgICAgLy8gZG8gbm90IHJlY3Vyc2UgaW50byB0aGUgc2FtZSBzdHJ1Y3RzCisgICAgICAgICAgICBpZiAoIXZpc2l0ZWQoaW5kZXgpICYmIGRlc2NlbmRJbnRvKGluZGV4KSkgeworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGFzY2VuZCBhZnRlciB0aGUgbGFzdCBmaWVsZCBpbiB0aGUgY3VycmVudCBzdHJ1Y3QKKyAgICAgICAgd2hpbGUgKCFtSGlzdG9yeS5lbXB0eSgpICYmIF9tRmllbGRzLmJhY2soKSA9PSBtSGlzdG9yeS5iYWNrKCktPmVuZCgpKSB7CisgICAgICAgICAgICBtSGVhZCA9IG1IZWFkLT5wYXJlbnQ7CisgICAgICAgICAgICBtSGlzdG9yeS5wb3BfYmFjaygpOworICAgICAgICAgICAgX21GaWVsZHMucG9wX2JhY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRvbmUgaWYgaGlzdG9yeSBpcyBub3cgZW1wdHkKKyAgICAgICAgaWYgKF9tRmllbGRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIC8vIHdlIGNvdWxkIGJlIHRyYXZlcnNpbmcgYSBzdWItdHJlZSBzbyBjbGVhciBoZWFkCisgICAgICAgICAgICBtSGVhZC5yZXNldCgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgLy8gbW92ZSB0byB0aGUgbmV4dCBmaWVsZCBpbiB0aGUgY3VycmVudCBzdHJ1Y3QKKyAgICAgICAgQzJTdHJ1Y3REZXNjcmlwdG9yOjpmaWVsZF9pdGVyYXRvciBuZXh0ID0gX21GaWVsZHMuYmFjaygpOworICAgICAgICBtSGVhZC0+ZmllbGQgPSBPZmZzZXRGaWVsZERlc2NyaXB0b3IoKm5leHQsIEdldFBhcmVudE9mZnNldChtSGVhZC0+cGFyZW50KSk7CisgICAgICAgIG1IZWFkLT5pbmRleCA9IDA7IC8vIHJlc2V0IGluZGV4IGp1c3QgaW4gY2FzZSBmb3IgY29ycmVjdG5lc3MKKyAgICAgICAgbUhlYWQtPmJhc2VGaWVsZE9mZnNldCA9IEdldFBhcmVudEJhc2VGaWVsZE9mZnNldChtSGVhZC0+cGFyZW50KSArIEdldE9mZnNldCgqbmV4dCk7CisgICAgICAgIG1IZWFkLT5hcnJheU9mZnNldCA9IEdldE9mZnNldChtSGVhZC0+ZmllbGQpOworICAgICAgICBtSGVhZC0+dXNlZEV4dGVudCA9IG1IZWFkLT5maWVsZC5leHRlbnQoKSA/IDoKKyAgICAgICAgICAgICAgICAoc3RkOjptYXgobUhlYWQtPmFycmF5T2Zmc2V0LCBtUGFyYW1TaXplKSAtIG1IZWFkLT5hcnJheU9mZnNldCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8gR2V0U2l6ZShtSGVhZC0+ZmllbGQpOworICAgICAgICArK19tRmllbGRzLmJhY2soKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgLy8vIElmIHRoZSBjdXJyZW50IGZpZWxkIGlzIGEga25vd24sIHZhbGlkICh1bnRyYXZlcnNlZCkgc3RydWN0dXJlLCBpdCBtb2RpZmllcyB0aGlzIGl0ZXJhdG9yCisgICAgLy8vIHRvIHBvaW50IHRvIHRoZSBmaXJzdCBmaWVsZCBvZiB0aGUgc3RydWN0dXJlIGFuZCByZXR1cm5zIHRydWUuIE90aGVyd2lzZSwgaXQgZG9lcyBub3QKKyAgICAvLy8gbW9kaWZ5IHRoaXMgaXRlcmF0b3IgYW5kIHJldHVybnMgZmFsc2UuCisgICAgYm9vbCBkZXNjZW5kSW50byhDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgpIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY1VuaXF1ZSA9IG1SZWZsZWN0b3ItPmRlc2NyaWJlKGluZGV4KTsKKyAgICAgICAgLy8gZGVzY2VuZCBpbnRvIGtub3duIHN0cnVjdHMgKGFzIGxvbmcgYXMgdGhleSBoYXZlIGF0IGxlYXN0IG9uZSBmaWVsZCkKKyAgICAgICAgaWYgKGRlc2NVbmlxdWUgJiYgZGVzY1VuaXF1ZS0+YmVnaW4oKSAhPSBkZXNjVW5pcXVlLT5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzYyhzdGQ6Om1vdmUoZGVzY1VuaXF1ZSkpOworICAgICAgICAgICAgbUhpc3RvcnkuZW1wbGFjZV9iYWNrKGRlc2MpOworICAgICAgICAgICAgQzJTdHJ1Y3REZXNjcmlwdG9yOjpmaWVsZF9pdGVyYXRvciBmaXJzdCA9IGRlc2MtPmJlZ2luKCk7CisgICAgICAgICAgICBtSGVhZCA9IG1ha2VMZWFmKCpmaXJzdCwgMCAvKiBpbmRleCAqLyk7CisgICAgICAgICAgICBfbUZpZWxkcy5lbXBsYWNlX2JhY2soKytmaXJzdCk7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8vIG5leHQgZmllbGQgcG9pbnRlcnMgZm9yIGVhY2ggZGVwdGguCisgICAgLy8vIG5vdGU6IF9tRmllbGRzIG1heSBiZSBzaG9ydGVkIHRoYW4gbUhpc3RvcnksIGlmIGl0ZXJhdGluZyBhdCBhIGRlcHRoCisgICAgc3RkOjp2ZWN0b3I8QzJTdHJ1Y3REZXNjcmlwdG9yOjpmaWVsZF9pdGVyYXRvcj4gX21GaWVsZHM7Cit9OworCisvKioKKyAqIEl0ZXJhYmxlIGltcGxlbWVudGluZyBlbnVtZXJhdGVGaWVsZHMoKS4KKyAqLworc3RydWN0IEMyRmllbGRVdGlsc0ZpZWxkSXRlcmFibGUgOiBwdWJsaWMgQzJGaWVsZFV0aWxzOjpMaXN0OjpJbXBsIHsKKyAgICAvLy8gcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaXN0CisgICAgdmlydHVhbCBzdGQ6OnNoYXJlZF9wdHI8QzJGaWVsZFV0aWxzOjpJdGVyYXRvcjo6SW1wbD4gYmVnaW4oKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9yPigqX21QYXJhbSwgX21SZWZsZWN0b3IpOworICAgIH07CisKKyAgICBDMkZpZWxkVXRpbHNGaWVsZEl0ZXJhYmxlKGNvbnN0IEMyUGFyYW0gJnBhcmFtLCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICA6IF9tUGFyYW0oJnBhcmFtKSwgX21SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBDMlBhcmFtICpfbVBhcmFtOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiBfbVJlZmxlY3RvcjsKK307CisKK30KKworQzJGaWVsZFV0aWxzOjpMaXN0IEMyRmllbGRVdGlsczo6ZW51bWVyYXRlRmllbGRzKAorICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+ICZyZWZsZWN0b3IpIHsKKyAgICByZXR1cm4gQzJGaWVsZFV0aWxzOjpMaXN0KHN0ZDo6bWFrZV9zaGFyZWQ8QzJGaWVsZFV0aWxzRmllbGRJdGVyYWJsZT4ocGFyYW0sIHJlZmxlY3RvcikpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlsczo6ZW51bWVyYXRlIHNpYmxpbmdzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworbmFtZXNwYWNlIHsKKworc3RydWN0IEMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYXRvciA6IHB1YmxpYyBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsIHsKKyAgICBDMkZpZWxkVXRpbHNDb3VzaW5zSXRlcmF0b3IoCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gJmluZm8sIHNpemVfdCBsZXZlbCkKKyAgICAgICAgICAvLyBjbG9uZSBpbmZvIGNoYWluIGFzIHRoaXMgaXRlcmF0b3Igd2lsbCBjaGFuZ2UgaXQKKyAgICAgICAgOiBDMkZpZWxkVXRpbHM6Okl0ZXJhdG9yOjpJbXBsKEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbDo6Q2xvbmUoaW5mbykpIHsKKyAgICAgICAgaWYgKGxldmVsID09IDApIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHN0b3JlIHBhcmVudCBjaGFpbiAodXAgdG8gbGV2ZWwpIGZvciBxdWljayBhY2Nlc3MKKyAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4gbm9kZSA9IG1IZWFkOworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICBmb3IgKDsgaXggPCBsZXZlbCAmJiBub2RlOyArK2l4KSB7CisgICAgICAgICAgICBub2RlLT5pbmRleCA9IDA7CisgICAgICAgICAgICBfbVBhdGguZW1wbGFjZV9iYWNrKG5vZGUpOworICAgICAgICAgICAgbm9kZSA9IG5vZGUtPnBhcmVudDsKKyAgICAgICAgfQorICAgICAgICBzZXR1cFBhdGgoaXgpOworICAgIH0KKworICAgIHZpcnR1YWwgfkMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYXRvcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIC8vLyBJbmNyZW1lbnRzIHRoaXMgaXRlcmF0b3IgYnkgdmlzaXRpbmcgZWFjaCBpbmRleC4KKyAgICB2aXJ0dWFsIHZvaWQgaW5jcmVtZW50KCkgb3ZlcnJpZGUgeworICAgICAgICBzaXplX3QgaXggPSAwOworICAgICAgICB3aGlsZSAoaXggPCBfbVBhdGguc2l6ZSgpKSB7CisgICAgICAgICAgICBpZiAoKytfbVBhdGhbaXhdLT5pbmRleCA8IF9tUGF0aFtpeF0tPnVzZWRFeHRlbnQpIHsKKyAgICAgICAgICAgICAgICBzZXR1cFBhdGgoaXggKyAxKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfbVBhdGhbaXgrK10tPmluZGV4ID0gMDsKKyAgICAgICAgfQorICAgICAgICBtSGVhZC5yZXNldCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLy8gYWRqdXN0cyBmaWVsZCBvZmZzZXRzIGFsb25nIHRoZSBwYXRoIHVwIHRvIHRoZSBzcGVjaWZpYyBsZXZlbCAtIDEuCisgICAgLy8vIFRoaXMgaW4tZmFjdCBoYXMgdG8gYmUgZG9uZSBkb3duIHRoZSBwYXRoIGZyb20gcGFyZW50IHRvIGNoaWxkIGFzIGNoaWxkIGZpZWxkcyBtdXN0CisgICAgLy8vIGZhbGwgd2l0aGluIHBhcmVudCBmaWVsZHMuCisgICAgdm9pZCBzZXR1cFBhdGgoc2l6ZV90IGxldmVsKSB7CisgICAgICAgIEMyX0NIRUNLX0xFKGxldmVsLCBfbVBhdGguc2l6ZSgpKTsKKyAgICAgICAgdWludDMyX3Qgb2xkQXJyYXlPZmZzZXQgPSBsZXZlbCA/IF9tUGF0aFtsZXZlbCAtIDFdLT5hcnJheU9mZnNldCA6IDAgLyogdW51c2VkICovOworICAgICAgICB3aGlsZSAobGV2ZWwpIHsKKyAgICAgICAgICAgIC0tbGV2ZWw7CisgICAgICAgICAgICBDMkZpZWxkVXRpbHM6OkluZm86OkltcGwgJnBhdGggPSAqX21QYXRoW2xldmVsXTsKKyAgICAgICAgICAgIHVpbnQzMl90IHNpemUgPSBHZXRTaXplKHBhdGguZmllbGQpOworICAgICAgICAgICAgdWludDMyX3Qgb2Zmc2V0ID0gcGF0aC5hcnJheU9mZnNldCArIHNpemUgKiBwYXRoLmluZGV4OworICAgICAgICAgICAgU2V0T2Zmc2V0KHBhdGguZmllbGQsIG9mZnNldCk7CisgICAgICAgICAgICBpZiAobGV2ZWwpIHsKKyAgICAgICAgICAgICAgICAvLyByZXNldCBjaGlsZCdzIGFycmF5IG9mZnNldCB0byBmYWxsIHdpdGhpbiBjdXJyZW50IGluZGV4LCBidXQgaG9sZCBvbnRvIHRoZQorICAgICAgICAgICAgICAgIC8vIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSBhcnJheU9mZnNldCBzbyB0aGF0IHdlIGNhbiBhZGp1c3Qgc3Vic2VxdWVudCBjaGlsZHJlbi4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGJlY2F1c2UgdGhlIG1vZHVsbyBpcyBvbmx5IGRlZmluZWQgd2l0aGluIHRoZSBjdXJyZW50IGFycmF5LgorICAgICAgICAgICAgICAgIHVpbnQzMl90IGNoaWxkQXJyYXlPZmZzZXQgPQorICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKyAoX21QYXRoW2xldmVsIC0gMV0tPmFycmF5T2Zmc2V0IC0gb2xkQXJyYXlPZmZzZXQpICUgc2l6ZTsKKyAgICAgICAgICAgICAgICBvbGRBcnJheU9mZnNldCA9IF9tUGF0aFtsZXZlbCAtIDFdLT5hcnJheU9mZnNldDsKKyAgICAgICAgICAgICAgICBfbVBhdGhbbGV2ZWwgLSAxXS0+YXJyYXlPZmZzZXQgPSBjaGlsZEFycmF5T2Zmc2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SW5mbzo6SW1wbD4+IF9tUGF0aDsKK307CisKKy8qKgorICogSXRlcmFibGUgaW1wbGVtZW50aW5nIGVudW1lcmF0ZUZpZWxkcygpLgorICovCitzdHJ1Y3QgQzJGaWVsZFV0aWxzQ291c2luc0l0ZXJhYmxlIDogcHVibGljIEMyRmllbGRVdGlsczo6TGlzdDo6SW1wbCB7CisgICAgLy8vIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdAorICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGw+IGJlZ2luKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHNDb3VzaW5zSXRlcmF0b3I+KF9tSGVhZCwgX21MZXZlbCk7CisgICAgfTsKKworICAgIEMyRmllbGRVdGlsc0NvdXNpbnNJdGVyYWJsZShjb25zdCBDMkZpZWxkVXRpbHM6OkluZm8gJmZpZWxkLCB1aW50MzJfdCBsZXZlbCkKKyAgICAgICAgOiBfbUhlYWQoQzJGaWVsZFV0aWxzOjpfSW5zcGVjdG9yOjpHZXRJbXBsKGZpZWxkKSksIF9tTGV2ZWwobGV2ZWwpIHsgfQorCitwcml2YXRlOgorICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IF9tSGVhZDsKKyAgICBzaXplX3QgX21MZXZlbDsKK307CisKK30KKworQzJGaWVsZFV0aWxzOjpMaXN0IEMyRmllbGRVdGlsczo6ZW51bWVyYXRlQ291c2lucyhjb25zdCBDMkZpZWxkVXRpbHM6OkluZm8gJmZpZWxkLCB1aW50MzJfdCBsZXZlbCkgeworICAgIHJldHVybiBDMkZpZWxkVXRpbHM6Okxpc3Qoc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHNDb3VzaW5zSXRlcmFibGU+KGZpZWxkLCBsZXZlbCkpOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEMyRmllbGRVdGlsczo6bG9jYXRlRmllbGQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCituYW1lc3BhY2UgeworCisvKioKKyAqIEl0ZXJhdG9yIGltcGxlbWVudGluZyBsb2NhdGVGaWVsZCgpLgorICovCitzdHJ1Y3QgQzJGaWVsZFV0aWxzRmllbGRMb2NhdG9yIDogcHVibGljIEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyIHsKKyAgICBDMkZpZWxkVXRpbHNGaWVsZExvY2F0b3IoCisgICAgICAgICAgICBDMlBhcmFtOjpDb3JlSW5kZXggaW5kZXgsIGNvbnN0IF9DMkZpZWxkSWQgJmZpZWxkLCB1aW50MzJfdCBwYXJhbVNpemUsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICA6IEMyRmllbGRVdGlsc0ZpZWxkc0l0ZXJhdG9ySGVscGVyKHJlZmxlY3RvciwgcGFyYW1TaXplKSwKKyAgICAgICAgICBfbUZpZWxkKGZpZWxkKSB7CisgICAgICAgIHdoaWxlIChkZXNjZW5kSW50byhpbmRleCkpIHsKKyAgICAgICAgICAgIGlmICgobUhlYWQtPmZpZWxkLnR5cGUoKSAmIEMyRmllbGREZXNjcmlwdG9yOjpTVFJVQ1RfRkxBRykgPT0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW5kZXggPSBDMlBhcmFtOjpDb3JlSW5kZXgobUhlYWQtPmZpZWxkLnR5cGUoKSAmfiBDMkZpZWxkRGVzY3JpcHRvcjo6U1RSVUNUX0ZMQUcpOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBpbmNyZW1lbnQoKSB7CisgICAgICAgIG1IZWFkID0gX21UYWlsOworICAgICAgICBfbVRhaWwgPSBudWxscHRyOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLy8gSWYgdGhlIGN1cnJlbnQgZmllbGQgaXMgYSBrbm93biwgdmFsaWQgKHVudHJhdmVyc2VkKSBzdHJ1Y3R1cmUsIGl0IG1vZGlmaWVzIHRoaXMgaXRlcmF0b3IKKyAgICAvLy8gdG8gcG9pbnQgdG8gdGhlIGZpZWxkIGF0IHRoZSBiZWdpbm5pbmcvZW5kIG9mIHRoZSBnaXZlbiBmaWVsZCBvZiB0aGUgc3RydWN0dXJlIGFuZCByZXR1cm5zCisgICAgLy8vIHRydWUuIE90aGVyd2lzZSwgaW5jbHVkaW5nIGlmIG5vIHN1Y2ggZmllbGQgZXhpc3RzIGluIHRoZSBzdHJ1Y3R1cmUsIGl0IGRvZXMgbm90IG1vZGlmeSB0aGlzCisgICAgLy8vIGl0ZXJhdG9yIGFuZCByZXR1cm5zIGZhbHNlLgorICAgIGJvb2wgZGVzY2VuZEludG8oQzJQYXJhbTo6Q29yZUluZGV4IGluZGV4KSB7CisgICAgICAgIC8vIGNoZWNrIHRoYXQgdGhlIGJvdW5kYXJpZXMgb2YgdGhlIGZpZWxkIHRvIGJlIGxvY2F0ZWQgYXJlIHN0aWxsIHdpdGhpbiB0aGUgc2FtZSBwYXJlbnQKKyAgICAgICAgLy8gZmllbGQKKyAgICAgICAgaWYgKG1IZWFkICE9IF9tVGFpbCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzY1VuaXF1ZSA9IG1SZWZsZWN0b3ItPmRlc2NyaWJlKGluZGV4KTsKKyAgICAgICAgLy8gZGVzY2VuZCBpbnRvIGtub3duIHN0cnVjdHMgKGFzIGxvbmcgYXMgdGhleSBoYXZlIGF0IGxlYXN0IG9uZSBmaWVsZCkKKyAgICAgICAgaWYgKGRlc2NVbmlxdWUgJiYgZGVzY1VuaXF1ZS0+YmVnaW4oKSAhPSBkZXNjVW5pcXVlLT5lbmQoKSkgeworICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyU3RydWN0RGVzY3JpcHRvcj4gZGVzYyhzdGQ6Om1vdmUoZGVzY1VuaXF1ZSkpOworICAgICAgICAgICAgbUhpc3RvcnkuZW1wbGFjZV9iYWNrKGRlc2MpOworCisgICAgICAgICAgICB1aW50MzJfdCBwYXJlbnRPZmZzZXQgPSBHZXRQYXJlbnRPZmZzZXQobUhlYWQpOworCisgICAgICAgICAgICAvLyBsb2NhdGUgZmllbGQgdXNpbmcgYSBkdW1teSBmaWVsZCBkZXNjcmlwdG9yCisgICAgICAgICAgICBDMkZpZWxkRGVzY3JpcHRvciBkdW1teSA9IHsKKyAgICAgICAgICAgICAgICBDMkZpZWxkRGVzY3JpcHRvcjo6QkxPQiwgMSAvKiBleHRlbnQgKi8sICJuYW1lIiwKKyAgICAgICAgICAgICAgICBHZXRPZmZzZXQoX21GaWVsZCkgLSBwYXJlbnRPZmZzZXQsIEdldFNpemUoX21GaWVsZCkKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgICAgIC8vIGxvY2F0ZSBmaXJzdCBmaWVsZCB3aGVyZSBvZmZzZXQgaXMgZ3JlYXRlciB0aGFuIGR1bW15IG9mZnNldCAod2hpY2ggaXMgb25lIHBhc3QpCisgICAgICAgICAgICBhdXRvIGl0ID0gc3RkOjp1cHBlcl9ib3VuZCgKKyAgICAgICAgICAgICAgICAgICAgZGVzYy0+Y2JlZ2luKCksIGRlc2MtPmNlbmQoKSwgZHVtbXksCisgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZhLCBjb25zdCBDMkZpZWxkRGVzY3JpcHRvciAmYikgLT4gYm9vbCB7CisgICAgICAgICAgICAgICAgcmV0dXJuIF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRPZmZzZXQoYSkgPCBfQzJQYXJhbUluc3BlY3Rvcjo6R2V0T2Zmc2V0KGIpOworICAgICAgICAgICAgfSk7CisgICAgICAgICAgICBpZiAoaXQgPT0gZGVzYy0+YmVnaW4oKSkgeworICAgICAgICAgICAgICAgIC8vIGZpZWxkIGlzIHByaW9yIHRvIGZpcnN0IGZpZWxkCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLS1pdDsKKyAgICAgICAgICAgIGNvbnN0IEMyRmllbGREZXNjcmlwdG9yICZmaWVsZCA9ICppdDsKKworICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCBkdW1teSBlbmQtb2Zmc2V0IGlzIHdpdGhpbiB0aGlzIGZpZWxkCisgICAgICAgICAgICB1aW50MzJfdCBzdHJ1Y3RTaXplID0gc3RkOjptYXgobVBhcmFtU2l6ZSwgcGFyZW50T2Zmc2V0KSAtIHBhcmVudE9mZnNldDsKKyAgICAgICAgICAgIGlmIChHZXRFbmRPZmZzZXQoZHVtbXkpID4gR2V0RW5kT2Zmc2V0KGZpZWxkLCBzdHJ1Y3RTaXplKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3Qgc3RhcnRJbmRleCA9IChHZXRPZmZzZXQoZHVtbXkpIC0gR2V0T2Zmc2V0KGZpZWxkKSkgLyBHZXRTaXplKGZpZWxkKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGVuZEluZGV4ID0KKyAgICAgICAgICAgICAgICAoR2V0RW5kT2Zmc2V0KGR1bW15KSAtIEdldE9mZnNldChmaWVsZCkgKyBHZXRTaXplKGZpZWxkKSAtIDEpIC8gR2V0U2l6ZShmaWVsZCk7CisgICAgICAgICAgICBpZiAoZW5kSW5kZXggPiBzdGFydEluZGV4KSB7CisgICAgICAgICAgICAgICAgLy8gRmllbGQgc2l6ZSBjb3VsZCBiZSB6ZXJvLCBpbiB3aGljaCBjYXNlIGVuZCBpbmRleCBpcyBzdGlsbCBvbiBzdGFydCBpbmRleC4KKyAgICAgICAgICAgICAgICAvLyBIb3dldmVyLCBmb3IgYWxsIG90aGVyIGNhc2VzLCBlbmRJbmRleCB3YXMgcm91bmRlZCB1cCB0byB0aGUgbmV4dCBpbmRleCwgc28KKyAgICAgICAgICAgICAgICAvLyBkZWNyZW1lbnQgaXQuCisgICAgICAgICAgICAgICAgLS1lbmRJbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IHN0YXJ0TGVhZiA9CisgICAgICAgICAgICAgICAgbWFrZUxlYWYoZmllbGQsIHN0YXJ0SW5kZXgpOworICAgICAgICAgICAgaWYgKGVuZEluZGV4ID09IHN0YXJ0SW5kZXgpIHsKKyAgICAgICAgICAgICAgICBfbVRhaWwgPSBzdGFydExlYWY7CisgICAgICAgICAgICAgICAgbUhlYWQgPSBzdGFydExlYWY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9tVGFpbCA9IG1ha2VMZWFmKGZpZWxkLCBlbmRJbmRleCk7CisgICAgICAgICAgICAgICAgbUhlYWQgPSBzdGFydExlYWY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgX0MyRmllbGRJZCBfbUZpZWxkOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkZpZWxkVXRpbHM6OkluZm86OkltcGw+IF9tVGFpbDsKK307CisKKy8qKgorICogSXRlcmFibGUgaW1wbGVtZW50aW5nIGxvY2F0ZUZpZWxkKCkuCisgKi8KK3N0cnVjdCBDMkZpZWxkVXRpbHNGaWVsZExvY2F0aW9uIDogcHVibGljIEMyRmllbGRVdGlsczo6TGlzdDo6SW1wbCB7CisgICAgLy8vIHJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdAorICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPEMyRmllbGRVdGlsczo6SXRlcmF0b3I6OkltcGw+IGJlZ2luKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxDMkZpZWxkVXRpbHNGaWVsZExvY2F0b3I+KAorICAgICAgICAgICAgICAgIF9tSW5kZXgsIF9tRmllbGQsIF9tUGFyYW1TaXplLCBfbVJlZmxlY3Rvcik7CisgICAgfTsKKworICAgIEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtRmllbGQgJnBmLCBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICA6IF9tSW5kZXgoQzJQYXJhbTo6Q29yZUluZGV4KF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRJbmRleChwZikpKSwKKyAgICAgICAgICBfbUZpZWxkKF9DMlBhcmFtSW5zcGVjdG9yOjpHZXRGaWVsZChwZikpLAorICAgICAgICAgIF9tUGFyYW1TaXplKDApLAorICAgICAgICAgIF9tUmVmbGVjdG9yKHJlZmxlY3RvcikgeyB9CisKKworICAgIEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRpb24oCisgICAgICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJQYXJhbVJlZmxlY3Rvcj4gcmVmbGVjdG9yKQorICAgICAgICA6IF9tSW5kZXgocGFyYW0uY29yZUluZGV4KCkpLAorICAgICAgICAgIF9tRmllbGQoZmllbGQpLAorICAgICAgICAgIF9tUGFyYW1TaXplKHBhcmFtLnNpemUoKSksCisgICAgICAgICAgX21SZWZsZWN0b3IocmVmbGVjdG9yKSB7IH0KKworcHJpdmF0ZToKKyAgICBDMlBhcmFtOjpDb3JlSW5kZXggX21JbmRleDsKKyAgICBfQzJGaWVsZElkIF9tRmllbGQ7CisgICAgdWludDMyX3QgX21QYXJhbVNpemU7CisgICAgc3RkOjpzaGFyZWRfcHRyPEMyUGFyYW1SZWZsZWN0b3I+IF9tUmVmbGVjdG9yOworfTsKKworfQorCitzdGQ6OnZlY3RvcjxDMkZpZWxkVXRpbHM6OkluZm8+IEMyRmllbGRVdGlsczo6bG9jYXRlRmllbGQoCisgICAgICAgIGNvbnN0IEMyUGFyYW1GaWVsZCAmcGYsIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgQzJGaWVsZFV0aWxzOjpMaXN0IGxvY2F0aW9uID0geyBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRpb24+KHBmLCByZWZsZWN0b3IpIH07CisgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPEluZm8+KGxvY2F0aW9uLmJlZ2luKCksIGxvY2F0aW9uLmVuZCgpKTsKK30KKworc3RkOjp2ZWN0b3I8QzJGaWVsZFV0aWxzOjpJbmZvPiBDMkZpZWxkVXRpbHM6OmxvY2F0ZUZpZWxkKAorICAgICAgICBjb25zdCBDMlBhcmFtICZwYXJhbSwgY29uc3QgX0MyRmllbGRJZCAmZmllbGQsCisgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMlBhcmFtUmVmbGVjdG9yPiAmcmVmbGVjdG9yKSB7CisgICAgQzJGaWVsZFV0aWxzOjpMaXN0IGxvY2F0aW9uID0geworICAgICAgICBzdGQ6Om1ha2Vfc2hhcmVkPEMyRmllbGRVdGlsc0ZpZWxkTG9jYXRpb24+KHBhcmFtLCBmaWVsZCwgcmVmbGVjdG9yKQorICAgIH07CisgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPEluZm8+KGxvY2F0aW9uLmJlZ2luKCksIGxvY2F0aW9uLmVuZCgpKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMlBhcmFtVXRpbHMuY3BwIGIvbWVkaWEvY29kZWMyL3ZuZGsvdXRpbC9DMlBhcmFtVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNTczZDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9jb2RlYzIvdm5kay91dGlsL0MyUGFyYW1VdGlscy5jcHAKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIF9fQzJfR0VORVJBVEVfR0xPQkFMX1ZBUlNfXyAvLyB0byBiZSBhYmxlIHRvIGltcGxlbWVudCB0aGUgbWV0aG9kcyBkZWZpbmVkCisjaW5jbHVkZSA8QzJFbnVtLmg+CisjaW5jbHVkZSA8dXRpbC9DMkRlYnVnLWxvZy5oPgorI2luY2x1ZGUgPHV0aWwvQzJQYXJhbVV0aWxzLmg+CisKKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLyoqIFxmaWxlCisgKiBVdGlsaXRpZXMgZm9yIHBhcmFtZXRlciBoYW5kbGluZyB0byBiZSB1c2VkIGJ5IENvZGVjMiBpbXBsZW1lbnRhdGlvbnMuCisgKi8KKworLy8vIFxjb25kIElOVEVSTkFMCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVRJTElUSUVTIEZPUiBFTlVNRVJBVElPTiBSRUZMRUNUSU9OIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworc3RhdGljIHNpemVfdCBjb3VudExlYWRpbmdVbmRlcnNjb3JlcyhDMlN0cmluZ0xpdGVyYWwgYSkgeworICAgIHNpemVfdCBpID0gMDsKKyAgICB3aGlsZSAoYVtpXSA9PSAnXycpIHsKKyAgICAgICAgKytpOworICAgIH0KKyAgICByZXR1cm4gaTsKK30KKworc3RhdGljIHNpemVfdCBjb3VudE1hdGNoaW5nKEMyU3RyaW5nTGl0ZXJhbCBhLCBjb25zdCBDMlN0cmluZyAmYikgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYi5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoIWFbaV0gfHwgYVtpXSAhPSBiW2ldKSB7CisgICAgICAgICAgICByZXR1cm4gaTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYi5zaXplKCk7Cit9CisKKy8vIEFCQ0RlZiA9PiBhYmMtZGVmCisvLyBBQkNEMmVmID0+IGFiY2QyLWVmIC8vIDAKKy8vIEFCQ0QyRWYgPT4gYW5jZDItZWYgLy8gLTEKKy8vIEFiY0RlZiA9PiBhYmMtZGVmIC8vIC0xCisvLyBBYmMyRGVmID0+IGFiYy0yZGVmCisvLyBBYmMyZGVmID0+IGFiYy0yLWRlZgorLy8gX1lvID0+IF95bworLy8gX3lvID0+IF95bworLy8gQzJfeW8gPT4gYzIteW8KKy8vIEMyX195byA9PiBjMi15bworCisvL3N0YXRpYworQzJTdHJpbmcgX0MyRW51bVV0aWxzOjpjYW1lbENhc2VUb0Rhc2hlZChDMlN0cmluZyBuYW1lKSB7CisgICAgZW51bSB7CisgICAgICAgIGtOb25lID0gJy4nLAorICAgICAgICBrTG93ZXIgPSAnYScsCisgICAgICAgIGtVcHBlciA9ICdBJywKKyAgICAgICAga0RpZ2l0ID0gJzEnLAorICAgICAgICBrRGFzaCA9ICctJywKKyAgICAgICAga1VuZGVyc2NvcmUgPSAnXycsCisgICAgfSB0eXBlID0ga05vbmU7CisgICAgc2l6ZV90IHdvcmRfc3RhcnQgPSAwOworICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBuYW1lLnNpemUoKTsgKytpeCkgeworICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgbmFtZS5zdWJzdHIoMCwgd29yZF9zdGFydCkgPDwgInwiCisgICAgICAgICAgICAgICAgPDwgbmFtZS5zdWJzdHIod29yZF9zdGFydCwgaXggLSB3b3JkX3N0YXJ0KSA8PCAiWyIKKyAgICAgICAgICAgICAgICA8PCBuYW1lLnN1YnN0cihpeCwgMSkgPDwgIl0iIDw8IG5hbWUuc3Vic3RyKGl4ICsgMSkKKyAgICAgICAgICAgICAgICA8PCAiOiAiIDw8IChjaGFyKXR5cGU7CisgICAgICAgIGlmIChpc3VwcGVyKG5hbWVbaXhdKSkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0ga0xvd2VyKSB7CisgICAgICAgICAgICAgICAgbmFtZS5pbnNlcnQoaXgrKywgMSwgJy0nKTsKKyAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuYW1lW2l4XSA9IHRvbG93ZXIobmFtZVtpeF0pOworICAgICAgICAgICAgdHlwZSA9IGtVcHBlcjsKKyAgICAgICAgfSBlbHNlIGlmIChpc2xvd2VyKG5hbWVbaXhdKSkgeworICAgICAgICAgICAgaWYgKHR5cGUgPT0ga0RpZ2l0ICYmIGl4ID4gMCkgeworICAgICAgICAgICAgICAgIG5hbWUuaW5zZXJ0KGl4KyssIDEsICctJyk7CisgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4OworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IGtVcHBlciAmJiBpeCA+IHdvcmRfc3RhcnQgKyAxKSB7CisgICAgICAgICAgICAgICAgbmFtZS5pbnNlcnQoaXgrKyAtIDEsIDEsICctJyk7CisgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4IC0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHR5cGUgPSBrTG93ZXI7CisgICAgICAgIH0gZWxzZSBpZiAoaXNkaWdpdChuYW1lW2l4XSkpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IGtMb3dlcikgeworICAgICAgICAgICAgICAgIG5hbWUuaW5zZXJ0KGl4KyssIDEsICctJyk7CisgICAgICAgICAgICAgICAgd29yZF9zdGFydCA9IGl4OworICAgICAgICAgICAgfQorICAgICAgICAgICAgdHlwZSA9IGtEaWdpdDsKKyAgICAgICAgfSBlbHNlIGlmIChuYW1lW2l4XSA9PSAnXycpIHsKKyAgICAgICAgICAgIGlmICh0eXBlID09IGtEYXNoKSB7CisgICAgICAgICAgICAgICAgbmFtZS5lcmFzZShpeC0tLCAxKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSAhPSBrTm9uZSAmJiB0eXBlICE9IGtVbmRlcnNjb3JlKSB7CisgICAgICAgICAgICAgICAgbmFtZVtpeF0gPSAnLSc7CisgICAgICAgICAgICAgICAgdHlwZSA9IGtEYXNoOworICAgICAgICAgICAgICAgIHdvcmRfc3RhcnQgPSBpeCArIDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHR5cGUgPSBrVW5kZXJzY29yZTsKKyAgICAgICAgICAgICAgICB3b3JkX3N0YXJ0ID0gaXggKyAxOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmFtZS5yZXNpemUoaXgpOworICAgICAgICB9CisgICAgfQorICAgIEMyX0xPRyhWRVJCT1NFKSA8PCAiPT4gIiA8PCBuYW1lOworICAgIHJldHVybiBuYW1lOworfQorCisvL3N0YXRpYworc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IF9DMkVudW1VdGlsczo6c2FuaXRpemVFbnVtVmFsdWVOYW1lcygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJTdHJpbmdMaXRlcmFsPiBuYW1lcywKKyAgICAgICAgQzJTdHJpbmdMaXRlcmFsIF9wcmVmaXgpIHsKKyAgICBzdGQ6OnZlY3RvcjxDMlN0cmluZz4gc2FuaXRpemVkTmFtZXM7CisgICAgQzJTdHJpbmcgcHJlZml4OworICAgIHNpemVfdCBleHRyYVVuZGVyc2NvcmVzID0gMDsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBpZiAoX3ByZWZpeCkgeworICAgICAgICBleHRyYVVuZGVyc2NvcmVzID0gY291bnRMZWFkaW5nVW5kZXJzY29yZXMoX3ByZWZpeCk7CisgICAgICAgIHByZWZpeCA9IF9wcmVmaXggKyBleHRyYVVuZGVyc2NvcmVzOworICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgInByZWZpeDoiIDw8IHByZWZpeCA8PCAiLCB1bmRlcnNjb3JlczoiIDw8IGV4dHJhVW5kZXJzY29yZXM7CisgICAgfQorCisgICAgLy8gY2FsY3VsYXRlIHByZWZpeCBhbmQgbWluaW11bSBsZWFkaW5nIHVuZGVyc2NvcmVzCisgICAgZm9yIChDMlN0cmluZ0xpdGVyYWwgcyA6IG5hbWVzKSB7CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCBzOworICAgICAgICBzaXplX3QgdW5kZXJzY29yZXMgPSBjb3VudExlYWRpbmdVbmRlcnNjb3JlcyhzKTsKKyAgICAgICAgaWYgKGZpcnN0KSB7CisgICAgICAgICAgICBleHRyYVVuZGVyc2NvcmVzID0gdW5kZXJzY29yZXM7CisgICAgICAgICAgICBwcmVmaXggPSBzICsgdW5kZXJzY29yZXM7CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2l6ZV90IG1hdGNoaW5nID0gY291bnRNYXRjaGluZygKKyAgICAgICAgICAgICAgICBzICsgdW5kZXJzY29yZXMsCisgICAgICAgICAgICAgICAgcHJlZml4KTsKKyAgICAgICAgICAgIHByZWZpeC5yZXNpemUobWF0Y2hpbmcpOworICAgICAgICAgICAgZXh0cmFVbmRlcnNjb3JlcyA9IHN0ZDo6bWluKHVuZGVyc2NvcmVzLCBleHRyYVVuZGVyc2NvcmVzKTsKKyAgICAgICAgfQorICAgICAgICBDMl9MT0coVkVSQk9TRSkgPDwgInByZWZpeDoiIDw8IHByZWZpeCA8PCAiLCB1bmRlcnNjb3JlczoiIDw8IGV4dHJhVW5kZXJzY29yZXM7CisgICAgICAgIGlmIChwcmVmaXguc2l6ZSgpID09IDAgJiYgZXh0cmFVbmRlcnNjb3JlcyA9PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHdlIHN3YWxsb3cgdGhlIGZpcnN0IHVuZGVyc2NvcmUgYWZ0ZXIgdXBwZXIgY2FzZSBwcmVmaXhlcworICAgIGJvb2wgdXBwZXJDYXNlUHJlZml4ID0gdHJ1ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHByZWZpeC5zaXplKCk7ICsraSkgeworICAgICAgICBpZiAoaXNsb3dlcihwcmVmaXhbaV0pKSB7CisgICAgICAgICAgICB1cHBlckNhc2VQcmVmaXggPSBmYWxzZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChDMlN0cmluZ0xpdGVyYWwgcyA6IG5hbWVzKSB7CisgICAgICAgIHNpemVfdCB1bmRlcnNjb3JlcyA9IGNvdW50TGVhZGluZ1VuZGVyc2NvcmVzKHMpOworICAgICAgICBDMlN0cmluZyBzYW5pdGl6ZWQgPSBDMlN0cmluZyhzLCB1bmRlcnNjb3JlcyAtIGV4dHJhVW5kZXJzY29yZXMpOworICAgICAgICBzYW5pdGl6ZWQuYXBwZW5kKHMgKyBwcmVmaXguc2l6ZSgpICsgdW5kZXJzY29yZXMgKworICAgICAgICAgICAgICAgICAgICAodXBwZXJDYXNlUHJlZml4ICYmIHNbcHJlZml4LnNpemUoKSArIHVuZGVyc2NvcmVzXSA9PSAnXycpKTsKKyAgICAgICAgc2FuaXRpemVkTmFtZXMucHVzaF9iYWNrKGNhbWVsQ2FzZVRvRGFzaGVkKHNhbml0aXplZCkpOworICAgIH0KKworICAgIGZvciAoQzJTdHJpbmcgcyA6IHNhbml0aXplZE5hbWVzKSB7CisgICAgICAgIEMyX0xPRyhWRVJCT1NFKSA8PCBzOworICAgIH0KKworICAgIHJldHVybiBzYW5pdGl6ZWROYW1lczsKK30KKworLy9zdGF0aWMKK3N0ZDo6dmVjdG9yPEMyU3RyaW5nPiBfQzJFbnVtVXRpbHM6OnBhcnNlRW51bVZhbHVlc0Zyb21TdHJpbmcoQzJTdHJpbmdMaXRlcmFsIHZhbHVlKSB7CisgICAgc3RkOjp2ZWN0b3I8QzJTdHJpbmc+IGZvdW5kTmFtZXM7CisgICAgc2l6ZV90IHBvcyA9IDAsIGxlbiA9IHN0cmxlbih2YWx1ZSk7CisgICAgZG8geworICAgICAgICBzaXplX3QgZW5kUG9zID0gc3RyY3Nwbih2YWx1ZSArIHBvcywgIiAsPSIpICsgcG9zOworICAgICAgICBpZiAoZW5kUG9zID4gcG9zKSB7CisgICAgICAgICAgICBmb3VuZE5hbWVzLmVtcGxhY2VfYmFjayh2YWx1ZSArIHBvcywgZW5kUG9zIC0gcG9zKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodmFsdWVbZW5kUG9zXSAmJiB2YWx1ZVtlbmRQb3NdICE9ICcsJykgeworICAgICAgICAgICAgZW5kUG9zICs9IHN0cmNzcG4odmFsdWUgKyBlbmRQb3MsICIsIik7CisgICAgICAgIH0KKyAgICAgICAgcG9zID0gc3Ryc3BuKHZhbHVlICsgZW5kUG9zLCAiICwiKSArIGVuZFBvczsKKyAgICB9IHdoaWxlIChwb3MgPCBsZW4pOworICAgIHJldHVybiBmb3VuZE5hbWVzOworfQorCisvLy8gc2FmZShyKSBwYXJzaW5nIGZyb20gcGFyYW1ldGVyIGJsb2IKKy8vc3RhdGljCitDMlBhcmFtICpDMlBhcmFtVXRpbHM6OlBhcnNlRmlyc3QoY29uc3QgdWludDhfdCAqYmxvYiwgc2l6ZV90IHNpemUpIHsKKyAgICAvLyBfbVNpemUgbXVzdCBmaXQgaW50byBzaXplLCBidXQgcmVhbGx5IEMyUGFyYW0gbXVzdCBhbHNvIHRvIGJlIGEgdmFsaWQgcGFyYW0KKyAgICBpZiAoc2l6ZSA8IHNpemVvZihDMlBhcmFtKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgLy8gX21TaXplIG11c3QgbWF0Y2ggbGVuZ3RoCisgICAgQzJQYXJhbSAqcGFyYW0gPSAoQzJQYXJhbSopYmxvYjsKKyAgICBpZiAocGFyYW0tPnNpemUoKSA+IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBwYXJhbTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlODE3NmNmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2V4dHJhY3RvcnMvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotc3ViZGlycyA9IFsKLSAgICAiKiIsCi1dCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmNwcAppbmRleCA5ZmM1YTc2Li45ZDE4M2Q0IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BQUNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5jcHAKQEAgLTE5LDQ4ICsxOSw0NSBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiQUFDRXh0cmFjdG9yLmgiCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgQUFDU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgQUFDU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogcHVibGljOgogICAgIEFBQ1NvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgICAgICBjb25zdCBWZWN0b3I8dWludDY0X3Q+ICZvZmZzZXRfdmVjdG9yLAogICAgICAgICAgICAgaW50NjRfdCBmcmFtZV9kdXJhdGlvbl91cyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0Kik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BQUNTb3VyY2UoKTsKIAogcHJpdmF0ZToKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhGcmFtZVNpemU7Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogCiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogICAgIGludDY0X3QgbUN1cnJlbnRUaW1lVXM7CiAgICAgYm9vbCBtU3RhcnRlZDsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CiAKICAgICBWZWN0b3I8dWludDY0X3Q+IG1PZmZzZXRWZWN0b3I7CiAgICAgaW50NjRfdCBtRnJhbWVEdXJhdGlvblVzOwpAQCAtOTIsNyArODksNyBAQAogLy8gVGhlIHJldHVybmVkIHZhbHVlIGlzIHRoZSBBQUMgZnJhbWUgc2l6ZSB3aXRoIHRoZSBBRFRTIGhlYWRlciBsZW5ndGggKHJlZ2FyZGxlc3Mgb2YKIC8vICAgICB0aGUgcHJlc2VuY2Ugb2YgdGhlIENSQykuCiAvLyBJZiBoZWFkZXJTaXplIGlzIG5vbi1OVUxMLCBpdCB3aWxsIGJlIHVzZWQgdG8gcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBoZWFkZXIgb2YgdGhpcyBBRFRTIGZyYW1lLgotc3RhdGljIHNpemVfdCBnZXRBZHRzRnJhbWVMZW5ndGgoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgb2ZmNjRfdCBvZmZzZXQsIHNpemVfdCogaGVhZGVyU2l6ZSkgeworc3RhdGljIHNpemVfdCBnZXRBZHRzRnJhbWVMZW5ndGgoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90KiBoZWFkZXJTaXplKSB7CiAKICAgICBjb25zdCBzaXplX3Qga0FkdHNIZWFkZXJMZW5ndGhOb0NyYyA9IDc7CiAgICAgY29uc3Qgc2l6ZV90IGtBZHRzSGVhZGVyTGVuZ3RoV2l0aENyYyA9IDk7CkBAIC0xMzMsNyArMTMwLDcgQEAKIH0KIAogQUFDRXh0cmFjdG9yOjpBQUNFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1Jbml0Q2hlY2soTk9fSU5JVCksCiAgICAgICBtRnJhbWVEdXJhdGlvblVzKDApIHsKQEAgLTE1MSw3ICsxNDgsOSBAQAogICAgIH0KICAgICBjaGFubmVsID0gKGhlYWRlclswXSAmIDB4MSkgPDwgMiB8IChoZWFkZXJbMV0gPj4gNik7CiAKKyAgICBtTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEobU1ldGEsIHByb2ZpbGUsIHNmX2luZGV4LCBjaGFubmVsKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEUsIHByb2ZpbGUgKyAxKTsKIAogICAgIG9mZjY0X3Qgc3RyZWFtU2l6ZSwgbnVtRnJhbWVzID0gMDsKICAgICBzaXplX3QgZnJhbWVTaXplID0gMDsKQEAgLTE3NCwyOSArMTczLDMwIEBACiAgICAgICAgIC8vIFJvdW5kIHVwIGFuZCBnZXQgdGhlIGR1cmF0aW9uCiAgICAgICAgIG1GcmFtZUR1cmF0aW9uVXMgPSAoMTAyNCAqIDEwMDAwMDBsbCArIChzciAtIDEpKSAvIHNyOwogICAgICAgICBkdXJhdGlvbiA9IG51bUZyYW1lcyAqIG1GcmFtZUR1cmF0aW9uVXM7Ci0gICAgICAgIG1NZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24pOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uKTsKICAgICB9CiAKICAgICBtSW5pdENoZWNrID0gT0s7CiB9CiAKIEFBQ0V4dHJhY3Rvcjo6fkFBQ0V4dHJhY3RvcigpIHsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1NZXRhKTsKIH0KIAotc3RhdHVzX3QgQUFDRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLmNsZWFyKCk7CittZWRpYV9zdGF0dXNfdCBBQUNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKICAgICBpZiAobUluaXRDaGVjayA9PSBPSykgewotICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQUNfQURUUyk7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBBQUNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKkFBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpBQUNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMjA0LDEzICsyMDQsMTIgQEAKICAgICByZXR1cm4gbmV3IEFBQ1NvdXJjZShtRGF0YVNvdXJjZSwgbU1ldGEsIG1PZmZzZXRWZWN0b3IsIG1GcmFtZUR1cmF0aW9uVXMpOwogfQogCi1zdGF0dXNfdCBBQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CittZWRpYV9zdGF0dXNfdCBBQUNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KQEAgLTIxOSw4ICsyMTgsOCBAQAogY29uc3Qgc2l6ZV90IEFBQ1NvdXJjZTo6a01heEZyYW1lU2l6ZSA9IDgxOTI7CiAKIEFBQ1NvdXJjZTo6QUFDU291cmNlKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBjb25zdCBWZWN0b3I8dWludDY0X3Q+ICZvZmZzZXRfdmVjdG9yLAogICAgICAgICBpbnQ2NF90IGZyYW1lX2R1cmF0aW9uX3VzKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKQEAgLTIyOCw3ICsyMjcsNiBAQAogICAgICAgbU9mZnNldCgwKSwKICAgICAgIG1DdXJyZW50VGltZVVzKDApLAogICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUdyb3VwKE5VTEwpLAogICAgICAgbU9mZnNldFZlY3RvcihvZmZzZXRfdmVjdG9yKSwKICAgICAgIG1GcmFtZUR1cmF0aW9uVXMoZnJhbWVfZHVyYXRpb25fdXMpIHsKIH0KQEAgLTIzOSw3ICsyMzcsNyBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgQUFDU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pIHsKK21lZGlhX3N0YXR1c190IEFBQ1NvdXJjZTo6c3RhcnQoKSB7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAogICAgIGlmIChtT2Zmc2V0VmVjdG9yLmVtcHR5KCkpIHsKQEAgLTI0OSwzMCArMjQ3LDI1IEBACiAgICAgfQogCiAgICAgbUN1cnJlbnRUaW1lVXMgPSAwOwotICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwotICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShrTWF4RnJhbWVTaXplKSk7CisgICAgbUJ1ZmZlckdyb3VwLT5hZGRfYnVmZmVyKGtNYXhGcmFtZVNpemUpOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBBQUNTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBBQUNTb3VyY2U6OnN0b3AoKSB7CiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgQUFDU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKSB7Ci0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKK21lZGlhX3N0YXR1c190IEFBQ1NvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CiB9CiAKLXN0YXR1c190IEFBQ1NvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgQUFDU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKQEAgLTI4Miw3ICsyNzUsNyBAQAogICAgICAgICAgICAgaW50NjRfdCBzZWVrRnJhbWUgPSBzZWVrVGltZVVzIC8gbUZyYW1lRHVyYXRpb25VczsKICAgICAgICAgICAgIGlmIChzZWVrRnJhbWUgPCAwIHx8IHNlZWtGcmFtZSA+PSAoaW50NjRfdCltT2Zmc2V0VmVjdG9yLnNpemUoKSkgewogICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiNzAyMzk1MDciKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUN1cnJlbnRUaW1lVXMgPSBzZWVrRnJhbWUgKiBtRnJhbWVEdXJhdGlvblVzOwogCkBAIC0yOTIsMTMgKzI4NSwxMyBAQAogCiAgICAgc2l6ZV90IGZyYW1lU2l6ZSwgZnJhbWVTaXplV2l0aG91dEhlYWRlciwgaGVhZGVyU2l6ZTsKICAgICBpZiAoKGZyYW1lU2l6ZSA9IGdldEFkdHNGcmFtZUxlbmd0aChtRGF0YVNvdXJjZSwgbU9mZnNldCwgJmhlYWRlclNpemUpKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgZnJhbWVTaXplV2l0aG91dEhlYWRlciA9IGZyYW1lU2l6ZSAtIGhlYWRlclNpemU7CkBAIC0zMDcsMzcgKzMwMCwzOSBAQAogICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAotICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgfQogCiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVTaXplV2l0aG91dEhlYWRlcik7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgbUN1cnJlbnRUaW1lVXMpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIG1DdXJyZW50VGltZVVzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKIAogICAgIG1PZmZzZXQgKz0gZnJhbWVTaXplOwogICAgIG1DdXJyZW50VGltZVVzICs9IG1GcmFtZUR1cmF0aW9uVXM7CiAKICAgICAqb3V0ID0gYnVmZmVyOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKK3N0YXRpYyBDTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgdm9pZCAqbWV0YSkgewogICAgIG9mZjY0X3Qgb2Zmc2V0ID0gKnN0YXRpY19jYXN0PG9mZjY0X3QqPihtZXRhKTsKLSAgICByZXR1cm4gbmV3IEFBQ0V4dHJhY3Rvcihzb3VyY2UsIG9mZnNldCk7CisgICAgcmV0dXJuIHdyYXAobmV3IEFBQ0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpLCBvZmZzZXQpKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSkgeworc3RhdGljIENyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCisgICAgICAgIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEpIHsKICAgICBvZmY2NF90IHBvcyA9IDA7CiAKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOwogICAgIGZvciAoOzspIHsKICAgICAgICAgdWludDhfdCBpZDNoZWFkZXJbMTBdOwotICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQocG9zLCBpZDNoZWFkZXIsIHNpemVvZihpZDNoZWFkZXIpKQorICAgICAgICBpZiAoaGVscGVyLnJlYWRBdChwb3MsIGlkM2hlYWRlciwgc2l6ZW9mKGlkM2hlYWRlcikpCiAgICAgICAgICAgICAgICAgPCAoc3NpemVfdClzaXplb2YoaWQzaGVhZGVyKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KQEAgLTM2NCw3ICszNTksNyBAQAogCiAgICAgdWludDhfdCBoZWFkZXJbMl07CiAKLSAgICBpZiAoc291cmNlLT5yZWFkQXQocG9zLCAmaGVhZGVyLCAyKSAhPSAyKSB7CisgICAgaWYgKGhlbHBlci5yZWFkQXQocG9zLCAmaGVhZGVyLCAyKSAhPSAyKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIApAQCAtMzgzLDE3ICszNzgsMjEgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAiYWFjIiwKKyAgICBOVUxMCit9OwogCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCI0ZmQ4MGVhZS0wM2QyLTRkNzItOWViOS00OGZhNmJiNTQ2MTMiKSwKICAgICAgICAgMSwgLy8gdmVyc2lvbgogICAgICAgICAiQUFDIEV4dHJhY3RvciIsCi0gICAgICAgIFNuaWZmCisgICAgICAgIHsgLnYzID0ge1NuaWZmLCBleHRlbnNpb25zfSB9LAogICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FBQ0V4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmgKaW5kZXggOWRhZGJlZC4uNjQzZDNmNCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQUFDRXh0cmFjdG9yLmgKQEAgLTE4LDggKzE4LDkgQEAKIAogI2RlZmluZSBBQUNfRVhUUkFDVE9SX0hfCiAKLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogCiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKQEAgLTI4LDIzICsyOSwyMyBAQAogc3RydWN0IEFNZXNzYWdlOwogY2xhc3MgU3RyaW5nODsKIAotY2xhc3MgQUFDRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK2NsYXNzIEFBQ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlciB7CiBwdWJsaWM6Ci0gICAgQUFDRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3Qgb2Zmc2V0KTsKKyAgICBBQUNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBvZmY2NF90IG9mZnNldCk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiQUFDRXh0cmFjdG9yIjsgfQogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QUFDRXh0cmFjdG9yKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSBtTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CiAKICAgICBWZWN0b3I8dWludDY0X3Q+IG1PZmZzZXRWZWN0b3I7CkBAIC01NSw3ICs1Niw3IEBACiB9OwogCiBib29sIFNuaWZmQUFDKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsIG9mZjY0X3QgKm9mZnNldCk7CisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgU3RyaW5nOCAqbWltZVR5cGUsIGZsb2F0ICpjb25maWRlbmNlLCBvZmY2NF90ICpvZmZzZXQpOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9hYWMvQW5kcm9pZC5icAppbmRleCA3YzU2Yzk3Li41M2IzOTRmIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2FhYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYWFjL0FuZHJvaWQuYnAKQEAgLTEsNCArMSw0IEBACi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKIAogICAgIHNyY3M6IFsiQUFDRXh0cmFjdG9yLmNwcCJdLAogCkBAIC04LDcgKzgsNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmNwcAppbmRleCBiZWE2ZjFkLi4yNjQzMWE0IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2Ftci9BTVJFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5jcHAKQEAgLTIwLDggKzIwLDYgQEAKIAogI2luY2x1ZGUgIkFNUkV4dHJhY3Rvci5oIgogCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CkBAIC0zMSwyOSArMjksMjkgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1jbGFzcyBBTVJTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitjbGFzcyBBTVJTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiBwdWJsaWM6CiAgICAgQU1SU291cmNlKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgICAgIGJvb2wgaXNXaWRlLAogICAgICAgICAgICAgY29uc3Qgb2ZmNjRfdCAqb2Zmc2V0X3RhYmxlLAogICAgICAgICAgICAgc2l6ZV90IG9mZnNldF90YWJsZV9sZW5ndGgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BTVJTb3VyY2UoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgYm9vbCBtSXNXaWRlOwogCiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwpAQCAtOTgsMjcgKzk2LDI3IEBACiAgICAgcmV0dXJuIGZyYW1lU2l6ZTsKIH0KIAotc3RhdGljIHN0YXR1c190IGdldEZyYW1lU2l6ZUJ5T2Zmc2V0KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCitzdGF0aWMgbWVkaWFfc3RhdHVzX3QgZ2V0RnJhbWVTaXplQnlPZmZzZXQoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICBvZmY2NF90IG9mZnNldCwgYm9vbCBpc1dpZGUsIHNpemVfdCAqZnJhbWVTaXplKSB7CiAgICAgdWludDhfdCBoZWFkZXI7CiAgICAgc3NpemVfdCBjb3VudCA9IHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgJmhlYWRlciwgMSk7CiAgICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9IGVsc2UgaWYgKGNvdW50IDwgMCkgewotICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgfQogCiAgICAgdW5zaWduZWQgRlQgPSAoaGVhZGVyID4+IDMpICYgMHgwZjsKIAogICAgICpmcmFtZVNpemUgPSBnZXRGcmFtZVNpemUoaXNXaWRlLCBGVCk7CiAgICAgaWYgKCpmcmFtZVNpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHN0YXRpYyBib29sIFNuaWZmQU1SKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBib29sICppc1dpZGUsIGZsb2F0ICpjb25maWRlbmNlKSB7CisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgYm9vbCAqaXNXaWRlLCBmbG9hdCAqY29uZmlkZW5jZSkgewogICAgIGNoYXIgaGVhZGVyWzldOwogCiAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpICE9IHNpemVvZihoZWFkZXIpKSB7CkBAIC0xNDQsOCArMTQyLDkgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLUFNUkV4dHJhY3Rvcjo6QU1SRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitBTVJFeHRyYWN0b3I6OkFNUkV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAorICAgICAgbU1ldGEoTlVMTCksCiAgICAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbU9mZnNldFRhYmxlTGVuZ3RoKDApIHsKICAgICBmbG9hdCBjb25maWRlbmNlOwpAQCAtMTUzLDEyICsxNTIsMTIgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIG1NZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICBrS2V5TUlNRVR5cGUsIG1Jc1dpZGUgPyBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7CisgICAgbU1ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLAorICAgICAgICAgICAgbUlzV2lkZSA/IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQiA6IE1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQik7CiAKLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAxKTsKLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbUlzV2lkZSA/IDE2MDAwIDogODAwMCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIDEpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgbUlzV2lkZSA/IDE2MDAwIDogODAwMCk7CiAKICAgICBvZmY2NF90IG9mZnNldCA9IG1Jc1dpZGUgPyA5IDogNjsKICAgICBvZmY2NF90IHN0cmVhbVNpemU7CkBAIC0xNjYsMTEgKzE2NSwxMSBAQAogICAgIGludDY0X3QgZHVyYXRpb24gPSAwOwogCiAgICAgaWYgKG1EYXRhU291cmNlLT5nZXRTaXplKCZzdHJlYW1TaXplKSA9PSBPSykgewotICAgICAgICAgd2hpbGUgKG9mZnNldCA8IHN0cmVhbVNpemUpIHsKLSAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRGcmFtZVNpemVCeU9mZnNldChzb3VyY2UsIG9mZnNldCwgbUlzV2lkZSwgJmZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHdoaWxlIChvZmZzZXQgPCBzdHJlYW1TaXplKSB7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRGcmFtZVNpemVCeU9mZnNldChzb3VyY2UsIG9mZnNldCwgbUlzV2lkZSwgJmZyYW1lU2l6ZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RhdHVzICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCkBAIC0xODUsMzAgKzE4NCwzNSBAQAogICAgICAgICAgICAgbnVtRnJhbWVzICsrOwogICAgICAgICB9CiAKLSAgICAgICAgbU1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbik7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgZHVyYXRpb24pOwogICAgIH0KIAogICAgIG1Jbml0Q2hlY2sgPSBPSzsKIH0KIAogQU1SRXh0cmFjdG9yOjp+QU1SRXh0cmFjdG9yKCkgeworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKKyAgICBpZiAobU1ldGEpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtTWV0YSk7CisgICAgfQogfQogCi1zdGF0dXNfdCBBTVJFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuY2xlYXIoKTsKK21lZGlhX3N0YXR1c190IEFNUkV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOwogCiAgICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKLSAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbUlzV2lkZSA/ICJhdWRpby9hbXItd2IiIDogImF1ZGlvL2FtciIpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtSXNXaWRlID8gTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCIDogImF1ZGlvL2FtciIpOwogICAgIH0KIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzaXplX3QgQU1SRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKICAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOwogfQogCi1NZWRpYVRyYWNrICpBTVJFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworTWVkaWFUcmFja0hlbHBlciAqQU1SRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTIxNywxOSArMjIxLDE4IEBACiAgICAgICAgICAgICBtT2Zmc2V0VGFibGUsIG1PZmZzZXRUYWJsZUxlbmd0aCk7CiB9CiAKLXN0YXR1c190IEFNUkV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKK21lZGlhX3N0YXR1c190IEFNUkV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCi0gICAgbWV0YSA9IG1NZXRhOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBBTVJTb3VyY2U6OkFNUlNvdXJjZSgKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgYm9vbCBpc1dpZGUsIGNvbnN0IG9mZjY0X3QgKm9mZnNldF90YWJsZSwgc2l6ZV90IG9mZnNldF90YWJsZV9sZW5ndGgpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbU1ldGEobWV0YSksCkBAIC0yNTAsMzUgKzI1MywzMCBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgQU1SU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pIHsKK21lZGlhX3N0YXR1c190IEFNUlNvdXJjZTo6c3RhcnQoKSB7CiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKIAogICAgIG1PZmZzZXQgPSBtSXNXaWRlID8gOSA6IDY7CiAgICAgbUN1cnJlbnRUaW1lVXMgPSAwOwotICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwotICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZSgxMjgpKTsKKyAgICBtQnVmZmVyR3JvdXAtPmFkZF9idWZmZXIoMTI4KTsKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgQU1SU291cmNlOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgQU1SU291cmNlOjpzdG9wKCkgewogICAgIENIRUNLKG1TdGFydGVkKTsKIAotICAgIGRlbGV0ZSBtR3JvdXA7Ci0gICAgbUdyb3VwID0gTlVMTDsKLQogICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IEFNUlNvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CittZWRpYV9zdGF0dXNfdCBBTVJTb3VyY2U6OmdldEZvcm1hdChBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbU1ldGEpOwogfQogCi1zdGF0dXNfdCBBTVJTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKK21lZGlhX3N0YXR1c190IEFNUlNvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7CkBAIC0yOTYsNyArMjk0LDcgQEAKICAgICAgICAgbU9mZnNldCA9IG1PZmZzZXRUYWJsZVtpbmRleF0gKyAobUlzV2lkZSA/IDkgOiA2KTsKIAogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaTwgc2Vla0ZyYW1lIC0gaW5kZXggKiA1MDsgaSsrKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnI7CisgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnI7CiAgICAgICAgICAgICBpZiAoKGVyciA9IGdldEZyYW1lU2l6ZUJ5T2Zmc2V0KG1EYXRhU291cmNlLCBtT2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1dpZGUsICZzaXplKSkgIT0gT0spIHsKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwpAQCAtMzA5LDcgKzMwNyw3IEBACiAgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChtT2Zmc2V0LCAmaGVhZGVyLCAxKTsKIAogICAgIGlmIChuIDwgMSkgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0KIAogICAgIGlmIChoZWFkZXIgJiAweDgzKSB7CkBAIC0zMTcsMjAgKzMxNSwyMCBAQAogCiAgICAgICAgIEFMT0dFKCJwYWRkaW5nIGJpdHMgbXVzdCBiZSAwLCBoZWFkZXIgaXMgMHglMDJ4IiwgaGVhZGVyKTsKIAotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICB1bnNpZ25lZCBGVCA9IChoZWFkZXIgPj4gMykgJiAweDBmOwogCiAgICAgc2l6ZV90IGZyYW1lU2l6ZSA9IGdldEZyYW1lU2l6ZShtSXNXaWRlLCBGVCk7CiAgICAgaWYgKGZyYW1lU2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwotICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcjsKKyAgICBzdGF0dXNfdCBlcnIgPSBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG1PZmZzZXQsIGJ1ZmZlci0+ZGF0YSgpLCBmcmFtZVNpemUpOwpAQCAtMzQwLDUwICszMzgsNjMgQEAKICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAogICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvLyBvbmx5IHBhcnRpYWwgZnJhbWUgaXMgYXZhaWxhYmxlLCB0cmVhdCBpdCBhcyBFT1MuCiAgICAgICAgICAgICBtT2Zmc2V0ICs9IG47Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgfQogICAgIH0KIAogICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIGZyYW1lU2l6ZSk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgbUN1cnJlbnRUaW1lVXMpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIG1DdXJyZW50VGltZVVzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKIAogICAgIG1PZmZzZXQgKz0gZnJhbWVTaXplOwogICAgIG1DdXJyZW50VGltZVVzICs9IDIwMDAwOyAgLy8gRWFjaCBmcmFtZSBpcyAyMG1zCiAKICAgICAqb3V0ID0gYnVmZmVyOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgImFtciIsCisgICAgImF3YiIsCisgICAgTlVMTAorfTsKKwogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgVVVJRCgiYzg2NjM5YzktMmYzMS00MGFjLWE3MTUtZmEwMWI0NDkzYWFmIiksCiAgICAgICAgIDEsCiAgICAgICAgICJBTVIgRXh0cmFjdG9yIiwKLSAgICAgICAgW10oCi0gICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKLSAgICAgICAgICAgICAgICB2b2lkICoqLAotICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgLT4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIHsKLSAgICAgICAgICAgIGlmIChTbmlmZkFNUihzb3VyY2UsIG51bGxwdHIsIGNvbmZpZGVuY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFtdKAotICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gTWVkaWFFeHRyYWN0b3IqIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBBTVJFeHRyYWN0b3Ioc291cmNlKTt9OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KKyAgICAgICAgeworICAgICAgICAgICAudjMgPSB7CisgICAgICAgICAgICAgICBbXSgKKyAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCisgICAgICAgICAgICAgICAgICAgRnJlZU1ldGFGdW5jICopIC0+IENyZWF0b3JGdW5jIHsKKyAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOworICAgICAgICAgICAgICAgICAgIGlmIChTbmlmZkFNUigmaGVscGVyLCBudWxscHRyLCBjb25maWRlbmNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IENNZWRpYUV4dHJhY3RvciogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IEFNUkV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7fTsKKyAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgZXh0ZW5zaW9ucworICAgICAgICAgICB9LAorICAgICAgICB9LAogICAgIH07CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FNUkV4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmgKaW5kZXggYzkwYjMyNS4uYjc2ZWU5YyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQU1SRXh0cmFjdG9yLmgKQEAgLTE5LDggKzE5LDkgQEAKICNkZWZpbmUgQU1SX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0yOCwyMyArMjksMjMgQEAKIGNsYXNzIFN0cmluZzg7CiAjZGVmaW5lIE9GRlNFVF9UQUJMRV9MRU4gICAgMzAwCiAKLWNsYXNzIEFNUkV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitjbGFzcyBBTVJFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgewogcHVibGljOgotICAgIGV4cGxpY2l0IEFNUkV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBBTVJFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJBTVJFeHRyYWN0b3IiOyB9CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BTVJFeHRyYWN0b3IoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7Ci0gICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKICAgICBib29sIG1Jc1dpZGU7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL2Ftci9BbmRyb2lkLmJwCmluZGV4IGIyZmI4ODAuLmNkNzYwNjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvYW1yL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9hbXIvQW5kcm9pZC5icApAQCAtMSw0ICsxLDQgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogCiAgICAgc3JjczogWyJBTVJFeHRyYWN0b3IuY3BwIl0sCiAKQEAgLTgsNyArOCw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAKaW5kZXggNDI0MmQ3Ni4uYzY2OWIzNCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0FuZHJvaWQuYnAKQEAgLTEsNCArMSw0IEBACi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKIAogICAgIHNyY3M6IFsiRkxBQ0V4dHJhY3Rvci5jcHAiXSwKIApAQCAtOCwxMyArOCwxNyBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmluZGVyX25kayIsCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJGTEFDIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWV0YWRhdGF1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAogICAgIG5hbWU6ICJsaWJmbGFjZXh0cmFjdG9yIiwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmNwcAppbmRleCBjY2Y4MGQwLi41MzI5YmQxIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuY3BwCkBAIC0yNCw0MSArMjQsNTYgQEAKIC8vIGxpYkZMQUMgcGFyc2VyCiAjaW5jbHVkZSAiRkxBQy9zdHJlYW1fZGVjb2Rlci5oIgogCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+Ci0jaW5jbHVkZSA8bWVkaWEvVm9yYmlzQ29tbWVudC5oPgorI2luY2x1ZGUgPGFuZHJvaWQvYmluZGVyX2liaW5kZXIuaD4gLy8gZm9yIEFJQmluZGVyX2dldENhbGxpbmdVaWQKKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4gLy8gZm9yIEFJRF9NRURJQQorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKKy8vIE1lZGlhU2VydmVyIGlzIGNhcGFibGUgb2YgaGFuZGxpbmcgZmxvYXQgZXh0cmFjdG9yIG91dHB1dCwgYnV0IGdlbmVyYWwgcHJvY2Vzc2VzCisvLyBtYXkgbm90IGJlIGFibGUgdG8gZG8gc28uCisvLyBUT0RPOiBJbXByb3ZlIEFQSSB0byBzZXQgZXh0cmFjdG9yIGZsb2F0IG91dHB1dC4KKy8vIChOb3RlOiBkdXBsaWNhdGVkIHdpdGggV0FWRXh0cmFjdG9yLmNwcCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChpbnQgYml0c1BlclNhbXBsZSkKK3sKKyAgICByZXR1cm4gYml0c1BlclNhbXBsZSA+IDE2ICYmIEFJQmluZGVyX2dldENhbGxpbmdVaWQoKSA9PSBBSURfTUVESUE7Cit9CisKIGNsYXNzIEZMQUNQYXJzZXI7CiAKLWNsYXNzIEZMQUNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitjbGFzcyBGTEFDU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogCiBwdWJsaWM6CiAgICAgRkxBQ1NvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhKTsKKyAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCisgICAgICAgICAgICBib29sIG91dHB1dEZsb2F0KTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5GTEFDU291cmNlKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSBtVHJhY2tNZXRhZGF0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXQgKm1UcmFja01ldGFkYXRhOworICAgIGNvbnN0IGJvb2wgbU91dHB1dEZsb2F0OwogICAgIEZMQUNQYXJzZXIgKm1QYXJzZXI7CiAgICAgYm9vbCBtSW5pdENoZWNrOwogICAgIGJvb2wgbVN0YXJ0ZWQ7CkBAIC03NSwxNCArOTAsMTUgQEAKIAogcHVibGljOgogICAgIGVudW0gewotICAgICAgICBrTWF4Q2hhbm5lbHMgPSA4LAorICAgICAgICBrTWF4Q2hhbm5lbHMgPSBGQ0NfOCwKICAgICB9OwogCiAgICAgZXhwbGljaXQgRkxBQ1BhcnNlcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCisgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQsCiAgICAgICAgIC8vIElmIG1ldGFkYXRhIHBvaW50ZXJzIGFyZW4ndCBwcm92aWRlZCwgd2UgZG9uJ3QgZmlsbCB0aGVtCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGFkYXRhID0gMCwKLSAgICAgICAgTWV0YURhdGFCYXNlICp0cmFja01ldGFkYXRhID0gMCk7CisgICAgICAgIEFNZWRpYUZvcm1hdCAqZmlsZU1ldGFkYXRhID0gMCwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGFkYXRhID0gMCk7CiAKICAgICB2aXJ0dWFsIH5GTEFDUGFyc2VyKCk7CiAKQEAgLTEwOCwyNCArMTI0LDI1IEBACiAgICAgfQogCiAgICAgLy8gbWVkaWEgYnVmZmVycwotICAgIHZvaWQgYWxsb2NhdGVCdWZmZXJzKCk7CisgICAgdm9pZCBhbGxvY2F0ZUJ1ZmZlcnMoTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqZ3JvdXApOwogICAgIHZvaWQgcmVsZWFzZUJ1ZmZlcnMoKTsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKnJlYWRCdWZmZXIoKSB7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKnJlYWRCdWZmZXIoKSB7CiAgICAgICAgIHJldHVybiByZWFkQnVmZmVyKGZhbHNlLCAwTEwpOwogICAgIH0KLSAgICBNZWRpYUJ1ZmZlckJhc2UgKnJlYWRCdWZmZXIoRkxBQ19fdWludDY0IHNhbXBsZSkgeworICAgIE1lZGlhQnVmZmVySGVscGVyICpyZWFkQnVmZmVyKEZMQUNfX3VpbnQ2NCBzYW1wbGUpIHsKICAgICAgICAgcmV0dXJuIHJlYWRCdWZmZXIodHJ1ZSwgc2FtcGxlKTsKICAgICB9CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIE1ldGFEYXRhQmFzZSAqbUZpbGVNZXRhZGF0YTsKLSAgICBNZXRhRGF0YUJhc2UgKm1UcmFja01ldGFkYXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIGNvbnN0IGJvb2wgbU91dHB1dEZsb2F0OworICAgIEFNZWRpYUZvcm1hdCAqbUZpbGVNZXRhZGF0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1UcmFja01ldGFkYXRhOwogICAgIGJvb2wgbUluaXRDaGVjazsKIAogICAgIC8vIG1lZGlhIGJ1ZmZlcnMKICAgICBzaXplX3QgbU1heEJ1ZmZlclNpemU7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOworICAgIE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKm1Hcm91cDsKICAgICB2b2lkICgqbUNvcHkpKGludDE2X3QgKmRzdCwgY29uc3QgaW50ICogc3JjW2tNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpOwogCiAgICAgLy8gaGFuZGxlIHRvIHVuZGVybHlpbmcgbGliRkxBQyBwYXJzZXIKQEAgLTE0OSw3ICsxNjYsNyBAQAogICAgIEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cyBtRXJyb3JTdGF0dXM7CiAKICAgICBzdGF0dXNfdCBpbml0KCk7Ci0gICAgTWVkaWFCdWZmZXJCYXNlICpyZWFkQnVmZmVyKGJvb2wgZG9TZWVrLCBGTEFDX191aW50NjQgc2FtcGxlKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqcmVhZEJ1ZmZlcihib29sIGRvU2VlaywgRkxBQ19fdWludDY0IHNhbXBsZSk7CiAKICAgICAvLyBubyBjb3B5IGNvbnN0cnVjdG9yIG9yIGFzc2lnbm1lbnQKICAgICBGTEFDUGFyc2VyKGNvbnN0IEZMQUNQYXJzZXIgJik7CkBAIC0xNjksNiArMTg2LDcgQEAKICAgICAgICAgICAgIGNvbnN0IEZMQUNfX0ZyYW1lICpmcmFtZSwgY29uc3QgRkxBQ19faW50MzIgKiBjb25zdCBidWZmZXJbXSk7CiAgICAgdm9pZCBtZXRhZGF0YUNhbGxiYWNrKGNvbnN0IEZMQUNfX1N0cmVhbU1ldGFkYXRhICptZXRhZGF0YSk7CiAgICAgdm9pZCBlcnJvckNhbGxiYWNrKEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cyBzdGF0dXMpOworICAgIHNpemVfdCBnZXRPdXRwdXRTYW1wbGVTaXplKCkgY29uc3QgeyByZXR1cm4gbU91dHB1dEZsb2F0ID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihpbnQxNl90KTsgfQogCiAgICAgLy8gRkxBQyBwYXJzZXIgY2FsbGJhY2tzIGFzIEMtY2FsbGFibGUgZnVuY3Rpb25zCiAgICAgc3RhdGljIEZMQUNfX1N0cmVhbURlY29kZXJSZWFkU3RhdHVzIHJlYWRfY2FsbGJhY2soCkBAIC0zNjQsOSArMzgyLDggQEAKICAgICBjYXNlIEZMQUNfX01FVEFEQVRBX1RZUEVfUElDVFVSRToKICAgICAgICAgaWYgKG1GaWxlTWV0YWRhdGEgIT0gMCkgewogICAgICAgICAgICAgY29uc3QgRkxBQ19fU3RyZWFtTWV0YWRhdGFfUGljdHVyZSAqcCA9ICZtZXRhZGF0YS0+ZGF0YS5waWN0dXJlOwotICAgICAgICAgICAgbUZpbGVNZXRhZGF0YS0+c2V0RGF0YShrS2V5QWxidW1BcnQsCi0gICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhOjpUWVBFX05PTkUsIHAtPmRhdGEsIHAtPmRhdGFfbGVuZ3RoKTsKLSAgICAgICAgICAgIG1GaWxlTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleUFsYnVtQXJ0TUlNRSwgcC0+bWltZV90eXBlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhZGF0YSwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCwKKyAgICAgICAgICAgICAgICAgICBwLT5kYXRhLCBwLT5kYXRhX2xlbmd0aCk7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKQEAgLTM4MSwxMjIgKzM5OCw2MSBAQAogICAgIG1FcnJvclN0YXR1cyA9IHN0YXR1czsKIH0KIAotLy8gQ29weSBzYW1wbGVzIGZyb20gRkxBQyBuYXRpdmUgMzItYml0IG5vbi1pbnRlcmxlYXZlZCB0byAxNi1iaXQgaW50ZXJsZWF2ZWQuCisvLyBDb3B5IHNhbXBsZXMgZnJvbSBGTEFDIG5hdGl2ZSAzMi1iaXQgbm9uLWludGVybGVhdmVkIHRvIDE2LWJpdCBzaWduZWQKKy8vIG9yIDMyLWJpdCBmbG9hdCBpbnRlcmxlYXZlZC4KKy8vIFRPRE86IENvbnNpZGVyIG1vdmluZyB0byBhdWRpb191dGlscy4KIC8vIFRoZXNlIGFyZSBjYW5kaWRhdGVzIGZvciBvcHRpbWl6YXRpb24gaWYgbmVlZGVkLgotCi1zdGF0aWMgdm9pZCBjb3B5TW9ubzgoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCitzdGF0aWMgdm9pZCBjb3B5VG8xNlNpZ25lZCgKKyAgICAgICAgc2hvcnQgKmRzdCwKKyAgICAgICAgY29uc3QgaW50ICpjb25zdCAqc3JjLAogICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldIDw8IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvOCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA8PCA4OwotICAgICAgICAqZHN0KysgPSBzcmNbMV1baV0gPDwgODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlNdWx0aUNoOChpbnQxNl90ICpkc3QsIGNvbnN0IGludCAqIHNyY1tGTEFDUGFyc2VyOjprTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKQotewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBuQ2hhbm5lbHM7ICsrYykgewotICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldIDw8IDg7CisgICAgICAgIHVuc2lnbmVkIG5DaGFubmVscywKKyAgICAgICAgdW5zaWduZWQgYml0c1BlclNhbXBsZSkgeworICAgIGNvbnN0IGludCBsZWZ0U2hpZnQgPSAxNiAtIChpbnQpYml0c1BlclNhbXBsZTsgLy8gY2FzdCB0byBpbnQgdG8gcHJldmVudCB1bnNpZ25lZCBvdmVyZmxvdy4KKyAgICBpZiAobGVmdFNoaWZ0ID49IDApIHsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBuQ2hhbm5lbHM7ICsrYykgeworICAgICAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA8PCBsZWZ0U2hpZnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBjb25zdCBpbnQgcmlnaHRTaGlmdCA9IC1sZWZ0U2hpZnQ7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPj4gcmlnaHRTaGlmdDsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KIAotc3RhdGljIHZvaWQgY29weU1vbm8xNigKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKK3N0YXRpYyB2b2lkIGNvcHlUb0Zsb2F0KAorICAgICAgICBmbG9hdCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCiAgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV07Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvMTYoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV07Ci0gICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlNdWx0aUNoMTYoaW50MTZfdCAqZHN0LCBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscykKLXsKKyAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzLAorICAgICAgICB1bnNpZ25lZCBiaXRzUGVyU2FtcGxlKSB7CisgICAgY29uc3QgdW5zaWduZWQgbGVmdFNoaWZ0ID0gMzIgLSBiaXRzUGVyU2FtcGxlOwogICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CiAgICAgICAgIGZvciAodW5zaWduZWQgYyA9IDA7IGMgPCBuQ2hhbm5lbHM7ICsrYykgewotICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldOworICAgICAgICAgICAgKmRzdCsrID0gZmxvYXRfZnJvbV9pMzIoc3JjW2NdW2ldIDw8IGxlZnRTaGlmdCk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLS8vIDI0LWJpdCB2ZXJzaW9ucyBzaG91bGQgZG8gZGl0aGVyaW5nIG9yIG5vaXNlLXNoYXBpbmcsIGhlcmUgb3IgaW4gQXVkaW9GbGluZ2VyCi0KLXN0YXRpYyB2b2lkIGNvcHlNb25vMjQoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPj4gODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW8yNCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA+PiA4OwotICAgICAgICAqZHN0KysgPSBzcmNbMV1baV0gPj4gODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlNdWx0aUNoMjQoaW50MTZfdCAqZHN0LCBjb25zdCBpbnQgKiBzcmNbRkxBQ1BhcnNlcjo6a01heENoYW5uZWxzXSwgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscykKLXsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA+PiA4OwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5VHJlc3Bhc3MoCi0gICAgICAgIGludDE2X3QgKiAvKiBkc3QgKi8sCi0gICAgICAgIGNvbnN0IGludCAqW0ZMQUNQYXJzZXI6OmtNYXhDaGFubmVsc10gLyogc3JjICovLAotICAgICAgICB1bnNpZ25lZCAvKiBuU2FtcGxlcyAqLywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgVFJFU1BBU1MoKTsKLX0KLQogLy8gRkxBQ1BhcnNlcgogCiBGTEFDUGFyc2VyOjpGTEFDUGFyc2VyKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKLSAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YWRhdGEsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqdHJhY2tNZXRhZGF0YSkKKyAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKKyAgICAgICAgYm9vbCBvdXRwdXRGbG9hdCwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YWRhdGEsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSkKICAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAorICAgICAgbU91dHB1dEZsb2F0KG91dHB1dEZsb2F0KSwKICAgICAgIG1GaWxlTWV0YWRhdGEoZmlsZU1ldGFkYXRhKSwKICAgICAgIG1UcmFja01ldGFkYXRhKHRyYWNrTWV0YWRhdGEpLAogICAgICAgbUluaXRDaGVjayhmYWxzZSksCiAgICAgICBtTWF4QnVmZmVyU2l6ZSgwKSwKICAgICAgIG1Hcm91cChOVUxMKSwKLSAgICAgIG1Db3B5KGNvcHlUcmVzcGFzcyksCiAgICAgICBtRGVjb2RlcihOVUxMKSwKICAgICAgIG1DdXJyZW50UG9zKDBMTCksCiAgICAgICBtRU9GKGZhbHNlKSwKQEAgLTU2Nyw4OSArNTIzLDU5IEBACiAgICAgICAgIGNhc2UgODoKICAgICAgICAgY2FzZSAxNjoKICAgICAgICAgY2FzZSAyNDoKKyAgICAgICAgY2FzZSAzMjogLy8gZ2VuZXJhbGx5IG5vdCBleHBlY3RlZCBmb3IgRkxBQwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBOb3RlOiBpbnRlcm5hbGx5IHRoZSBGTEFDIGV4dHJhY3RvciBzdXBwb3J0cyAyLTMyIGJpdHMuCiAgICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgYml0cyBwZXIgc2FtcGxlICV1IiwgZ2V0Qml0c1BlclNhbXBsZSgpKTsKICAgICAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgICAgICB9CiAgICAgICAgIC8vIGNoZWNrIHNhbXBsZSByYXRlCi0gICAgICAgIHN3aXRjaCAoZ2V0U2FtcGxlUmF0ZSgpKSB7Ci0gICAgICAgIGNhc2UgIDgwMDA6Ci0gICAgICAgIGNhc2UgMTEwMjU6Ci0gICAgICAgIGNhc2UgMTIwMDA6Ci0gICAgICAgIGNhc2UgMTYwMDA6Ci0gICAgICAgIGNhc2UgMjIwNTA6Ci0gICAgICAgIGNhc2UgMjQwMDA6Ci0gICAgICAgIGNhc2UgMzIwMDA6Ci0gICAgICAgIGNhc2UgNDQxMDA6Ci0gICAgICAgIGNhc2UgNDgwMDA6Ci0gICAgICAgIGNhc2UgODgyMDA6Ci0gICAgICAgIGNhc2UgOTYwMDA6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gTm90ZTogZmxhYyBzdXBwb3J0cyBhcmJpdHJhcnkgc2FtcGxlIHJhdGVzIHVwIHRvIDY1NTM1MCBIeiwgYnV0IEFuZHJvaWQKKyAgICAgICAgLy8gc3VwcG9ydHMgc2FtcGxlIHJhdGVzIGZyb20gOGtIeiB0byAxOTJrSHosIHNvIHVzZSB0aGF0IGFzIHRoZSBsaW1pdC4KKyAgICAgICAgaWYgKGdldFNhbXBsZVJhdGUoKSA8IDgwMDAgfHwgZ2V0U2FtcGxlUmF0ZSgpID4gMTkyMDAwKSB7CiAgICAgICAgICAgICBBTE9HRSgidW5zdXBwb3J0ZWQgc2FtcGxlIHJhdGUgJXUiLCBnZXRTYW1wbGVSYXRlKCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgICAgIH0KLSAgICAgICAgLy8gY29uZmlndXJlIHRoZSBhcHByb3ByaWF0ZSBjb3B5IGZ1bmN0aW9uLCBkZWZhdWx0aW5nIHRvIHRyZXNwYXNzCi0gICAgICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewotICAgICAgICAgICAgdW5zaWduZWQgbUNoYW5uZWxzOwotICAgICAgICAgICAgdW5zaWduZWQgbUJpdHNQZXJTYW1wbGU7Ci0gICAgICAgICAgICB2b2lkICgqbUNvcHkpKGludDE2X3QgKmRzdCwgY29uc3QgaW50ICogc3JjW2tNYXhDaGFubmVsc10sIHVuc2lnbmVkIG5TYW1wbGVzLCB1bnNpZ25lZCBuQ2hhbm5lbHMpOwotICAgICAgICB9IHRhYmxlW10gPSB7Ci0gICAgICAgICAgICB7IDEsICA4LCBjb3B5TW9ubzggICAgfSwKLSAgICAgICAgICAgIHsgMiwgIDgsIGNvcHlTdGVyZW84ICB9LAotICAgICAgICAgICAgeyA4LCAgOCwgY29weU11bHRpQ2g4ICB9LAotICAgICAgICAgICAgeyAxLCAxNiwgY29weU1vbm8xNiAgIH0sCi0gICAgICAgICAgICB7IDIsIDE2LCBjb3B5U3RlcmVvMTYgfSwKLSAgICAgICAgICAgIHsgOCwgMTYsIGNvcHlNdWx0aUNoMTYgfSwKLSAgICAgICAgICAgIHsgMSwgMjQsIGNvcHlNb25vMjQgICB9LAotICAgICAgICAgICAgeyAyLCAyNCwgY29weVN0ZXJlbzI0IH0sCi0gICAgICAgICAgICB7IDgsIDI0LCBjb3B5TXVsdGlDaDI0IH0sCi0gICAgICAgIH07Ci0gICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplb2YodGFibGUpL3NpemVvZih0YWJsZVswXSk7ICsraSkgewotICAgICAgICAgICAgaWYgKHRhYmxlW2ldLm1DaGFubmVscyA+PSBnZXRDaGFubmVscygpICYmCi0gICAgICAgICAgICAgICAgICAgIHRhYmxlW2ldLm1CaXRzUGVyU2FtcGxlID09IGdldEJpdHNQZXJTYW1wbGUoKSkgewotICAgICAgICAgICAgICAgIG1Db3B5ID0gdGFibGVbaV0ubUNvcHk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICAgICAgLy8gcG9wdWxhdGUgdHJhY2sgbWV0YWRhdGEKICAgICAgICAgaWYgKG1UcmFja01ldGFkYXRhICE9IDApIHsKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBnZXRDaGFubmVscygpKTsKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgZ2V0U2FtcGxlUmF0ZSgpKTsKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgZ2V0Qml0c1BlclNhbXBsZSgpKTsKLSAgICAgICAgICAgIG1UcmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtVHJhY2tNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGdldENoYW5uZWxzKCkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBnZXRTYW1wbGVSYXRlKCkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgZ2V0Qml0c1BlclNhbXBsZSgpKTsKICAgICAgICAgICAgIC8vIHNhbXBsZSByYXRlIGlzIG5vbi16ZXJvLCBzbyBkaXZpc2lvbiBieSB6ZXJvIG5vdCBwb3NzaWJsZQotICAgICAgICAgICAgbVRyYWNrTWV0YWRhdGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgKGdldFRvdGFsU2FtcGxlcygpICogMTAwMDAwMExMKSAvIGdldFNhbXBsZVJhdGUoKSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobVRyYWNrTWV0YWRhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIChnZXRUb3RhbFNhbXBsZXMoKSAqIDEwMDAwMDBMTCkgLyBnZXRTYW1wbGVSYXRlKCkpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0UoIm1pc3NpbmcgU1RSRUFNSU5GTyIpOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgaWYgKG1GaWxlTWV0YWRhdGEgIT0gMCkgewotICAgICAgICBtRmlsZU1ldGFkYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMpOwogICAgIH0KICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgRkxBQ1BhcnNlcjo6YWxsb2NhdGVCdWZmZXJzKCkKK3ZvaWQgRkxBQ1BhcnNlcjo6YWxsb2NhdGVCdWZmZXJzKE1lZGlhQnVmZmVyR3JvdXBIZWxwZXIgKmdyb3VwKQogewogICAgIENIRUNLKG1Hcm91cCA9PSBOVUxMKTsKLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cDsKLSAgICBtTWF4QnVmZmVyU2l6ZSA9IGdldE1heEJsb2NrU2l6ZSgpICogZ2V0Q2hhbm5lbHMoKSAqIHNpemVvZihpbnQxNl90KTsKLSAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUobU1heEJ1ZmZlclNpemUpKTsKKyAgICBtR3JvdXAgPSBncm91cDsKKyAgICBtTWF4QnVmZmVyU2l6ZSA9IGdldE1heEJsb2NrU2l6ZSgpICogZ2V0Q2hhbm5lbHMoKSAqIGdldE91dHB1dFNhbXBsZVNpemUoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobVRyYWNrTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIG1NYXhCdWZmZXJTaXplKTsKKyAgICBtR3JvdXAtPmFkZF9idWZmZXIobU1heEJ1ZmZlclNpemUpOwogfQogCiB2b2lkIEZMQUNQYXJzZXI6OnJlbGVhc2VCdWZmZXJzKCkKIHsKLSAgICBDSEVDSyhtR3JvdXAgIT0gTlVMTCk7Ci0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwogfQogCi1NZWRpYUJ1ZmZlckJhc2UgKkZMQUNQYXJzZXI6OnJlYWRCdWZmZXIoYm9vbCBkb1NlZWssIEZMQUNfX3VpbnQ2NCBzYW1wbGUpCitNZWRpYUJ1ZmZlckhlbHBlciAqRkxBQ1BhcnNlcjo6cmVhZEJ1ZmZlcihib29sIGRvU2VlaywgRkxBQ19fdWludDY0IHNhbXBsZSkKIHsKICAgICBtV3JpdGVSZXF1ZXN0ZWQgPSB0cnVlOwogICAgIG1Xcml0ZUNvbXBsZXRlZCA9IGZhbHNlOwpAQCAtNjg2LDQxICs2MTIsNTMgQEAKICAgICB9CiAgICAgLy8gYWNxdWlyZSBhIG1lZGlhIGJ1ZmZlcgogICAgIENIRUNLKG1Hcm91cCAhPSBOVUxMKTsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOwogICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBibG9ja3NpemUgKiBnZXRDaGFubmVscygpICogc2l6ZW9mKGludDE2X3QpOworICAgIGNvbnN0IHNpemVfdCBidWZmZXJTaXplID0gYmxvY2tzaXplICogZ2V0Q2hhbm5lbHMoKSAqIGdldE91dHB1dFNhbXBsZVNpemUoKTsKICAgICBDSEVDSyhidWZmZXJTaXplIDw9IG1NYXhCdWZmZXJTaXplKTsKLSAgICBpbnQxNl90ICpkYXRhID0gKGludDE2X3QgKikgYnVmZmVyLT5kYXRhKCk7CiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgYnVmZmVyU2l6ZSk7CiAgICAgLy8gY29weSBQQ00gZnJvbSBGTEFDIHdyaXRlIGJ1ZmZlciB0byBvdXIgbWVkaWEgYnVmZmVyLCB3aXRoIGludGVybGVhdmluZwotICAgICgqbUNvcHkpKGRhdGEsIG1Xcml0ZUJ1ZmZlciwgYmxvY2tzaXplLCBnZXRDaGFubmVscygpKTsKKyAgICBjb25zdCB1bnNpZ25lZCBiaXRzUGVyU2FtcGxlID0gZ2V0Qml0c1BlclNhbXBsZSgpOworICAgIGlmIChtT3V0cHV0RmxvYXQpIHsKKyAgICAgICAgY29weVRvRmxvYXQocmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KGJ1ZmZlci0+ZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgbVdyaXRlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICBibG9ja3NpemUsCisgICAgICAgICAgICAgICAgICAgIGdldENoYW5uZWxzKCksCisgICAgICAgICAgICAgICAgICAgIGJpdHNQZXJTYW1wbGUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvcHlUbzE2U2lnbmVkKHJlaW50ZXJwcmV0X2Nhc3Q8c2hvcnQqPihidWZmZXItPmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgIG1Xcml0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBnZXRDaGFubmVscygpLAorICAgICAgICAgICAgICAgICAgICAgICBiaXRzUGVyU2FtcGxlKTsKKyAgICB9CiAgICAgLy8gZmlsbCBpbiBidWZmZXIgbWV0YWRhdGEKICAgICBDSEVDSyhtV3JpdGVIZWFkZXIubnVtYmVyX3R5cGUgPT0gRkxBQ19fRlJBTUVfTlVNQkVSX1RZUEVfU0FNUExFX05VTUJFUik7CiAgICAgRkxBQ19fdWludDY0IHNhbXBsZU51bWJlciA9IG1Xcml0ZUhlYWRlci5udW1iZXIuc2FtcGxlX251bWJlcjsKICAgICBpbnQ2NF90IHRpbWVVcyA9ICgxMDAwMDAwTEwgKiBzYW1wbGVOdW1iZXIpIC8gZ2V0U2FtcGxlUmF0ZSgpOwotICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVVzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKICAgICByZXR1cm4gYnVmZmVyOwogfQogCiAvLyBGTEFDc291cmNlCiAKIEZMQUNTb3VyY2U6OkZMQUNTb3VyY2UoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICBNZXRhRGF0YUJhc2UgJnRyYWNrTWV0YWRhdGEpCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSwKKyAgICAgICAgYm9vbCBvdXRwdXRGbG9hdCkKICAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAogICAgICAgbVRyYWNrTWV0YWRhdGEodHJhY2tNZXRhZGF0YSksCi0gICAgICBtUGFyc2VyKDApLAotICAgICAgbUluaXRDaGVjayhmYWxzZSksCisgICAgICBtT3V0cHV0RmxvYXQob3V0cHV0RmxvYXQpLAorICAgICAgbVBhcnNlcihuZXcgRkxBQ1BhcnNlcihtRGF0YVNvdXJjZSwgb3V0cHV0RmxvYXQsIDAsIG1UcmFja01ldGFkYXRhKSksCisgICAgICBtSW5pdENoZWNrKG1QYXJzZXItPmluaXRDaGVjaygpKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKQogewogICAgIEFMT0dWKCJGTEFDU291cmNlOjpGTEFDU291cmNlIik7Ci0gICAgLy8gcmUtdXNlIHRoZSBzYW1lIHRyYWNrIG1ldGFkYXRhIHBhc3NlZCBpbnRvIGNvbnN0cnVjdG9yIGZyb20gRkxBQ0V4dHJhY3RvcgotICAgIG1QYXJzZXIgPSBuZXcgRkxBQ1BhcnNlcihtRGF0YVNvdXJjZSk7Ci0gICAgbUluaXRDaGVjayAgPSBtUGFyc2VyLT5pbml0Q2hlY2soKTsKIH0KIAogRkxBQ1NvdXJjZTo6fkZMQUNTb3VyY2UoKQpAQCAtNzMyLDE4ICs2NzAsMTggQEAKICAgICBkZWxldGUgbVBhcnNlcjsKIH0KIAotc3RhdHVzX3QgRkxBQ1NvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICogLyogcGFyYW1zICovKQorbWVkaWFfc3RhdHVzX3QgRkxBQ1NvdXJjZTo6c3RhcnQoKQogewogICAgIEFMT0dWKCJGTEFDU291cmNlOjpzdGFydCIpOwogCiAgICAgQ0hFQ0soIW1TdGFydGVkKTsKLSAgICBtUGFyc2VyLT5hbGxvY2F0ZUJ1ZmZlcnMoKTsKKyAgICBtUGFyc2VyLT5hbGxvY2F0ZUJ1ZmZlcnMobUJ1ZmZlckdyb3VwKTsKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgRkxBQ1NvdXJjZTo6c3RvcCgpCittZWRpYV9zdGF0dXNfdCBGTEFDU291cmNlOjpzdG9wKCkKIHsKICAgICBBTE9HVigiRkxBQ1NvdXJjZTo6c3RvcCIpOwogCkBAIC03NTEsMTkgKzY4OSwyMyBAQAogICAgIG1QYXJzZXItPnJlbGVhc2VCdWZmZXJzKCk7CiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBGTEFDU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKQorbWVkaWFfc3RhdHVzX3QgRkxBQ1NvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkKIHsKLSAgICBtZXRhID0gbVRyYWNrTWV0YWRhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIGNvbnN0IG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1UcmFja01ldGFkYXRhKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORywKKyAgICAgICAgICAgICAgICBtT3V0cHV0RmxvYXQgPyBrQXVkaW9FbmNvZGluZ1BjbUZsb2F0IDoga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEZMQUNTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dEJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpCittZWRpYV9zdGF0dXNfdCBGTEFDU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dEJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpCiB7Ci0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcjsKICAgICAvLyBwcm9jZXNzIGFuIG9wdGlvbmFsIHNlZWsgcmVxdWVzdAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKICAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKQEAgLTc4NCwyMCArNzI2LDIyIEBACiAgICAgICAgIGJ1ZmZlciA9IG1QYXJzZXItPnJlYWRCdWZmZXIoKTsKICAgICB9CiAgICAgKm91dEJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gYnVmZmVyICE9IE5VTEwgPyAoc3RhdHVzX3QpIE9LIDogKHN0YXR1c190KSBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIHJldHVybiBidWZmZXIgIT0gTlVMTCA/IEFNRURJQV9PSyA6IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogfQogCiAvLyBGTEFDRXh0cmFjdG9yCiAKIEZMQUNFeHRyYWN0b3I6OkZMQUNFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlKQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlKQogICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCiAgICAgICBtUGFyc2VyKG51bGxwdHIpLAogICAgICAgbUluaXRDaGVjayhmYWxzZSkKIHsKICAgICBBTE9HVigiRkxBQ0V4dHJhY3Rvcjo6RkxBQ0V4dHJhY3RvciIpOwogICAgIC8vIEZMQUNQYXJzZXIgd2lsbCBmaWxsIGluIHRoZSBtZXRhZGF0YSBmb3IgdXMKLSAgICBtUGFyc2VyID0gbmV3IEZMQUNQYXJzZXIobURhdGFTb3VyY2UsICZtRmlsZU1ldGFkYXRhLCAmbVRyYWNrTWV0YWRhdGEpOworICAgIG1GaWxlTWV0YWRhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgbVRyYWNrTWV0YWRhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgbVBhcnNlciA9IG5ldyBGTEFDUGFyc2VyKG1EYXRhU291cmNlLCBmYWxzZSAvKiBvdXRwdXRGbG9hdCAqLywgbUZpbGVNZXRhZGF0YSwgbVRyYWNrTWV0YWRhdGEpOwogICAgIG1Jbml0Q2hlY2sgPSBtUGFyc2VyLT5pbml0Q2hlY2soKTsKIH0KIApAQCAtODA1LDYgKzc0OSw5IEBACiB7CiAgICAgQUxPR1YoIn5GTEFDRXh0cmFjdG9yOjpGTEFDRXh0cmFjdG9yIik7CiAgICAgZGVsZXRlIG1QYXJzZXI7CisgICAgZGVsZXRlIG1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobUZpbGVNZXRhZGF0YSk7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtVHJhY2tNZXRhZGF0YSk7CiB9CiAKIHNpemVfdCBGTEFDRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpCkBAIC04MTIsNDIgKzc1OSw3NiBAQAogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKkZMQUNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkKK01lZGlhVHJhY2tIZWxwZXIgKkZMQUNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkKIHsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHJldHVybiBuZXcgRkxBQ1NvdXJjZShtRGF0YVNvdXJjZSwgbVRyYWNrTWV0YWRhdGEpOworCisgICAgcmV0dXJuIG5ldyBGTEFDU291cmNlKAorICAgICAgICAgICAgbURhdGFTb3VyY2UsIG1UcmFja01ldGFkYXRhLCBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChtUGFyc2VyLT5nZXRCaXRzUGVyU2FtcGxlKCkpKTsKIH0KIAotc3RhdHVzX3QgRkxBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgRkxBQ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQotICAgIG1ldGEgPSBtVHJhY2tNZXRhZGF0YTsKLSAgICByZXR1cm4gT0s7CisgICAgY29uc3QgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbVRyYWNrTWV0YWRhdGEpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLAorICAgICAgICAgICAgICAgIHNob3VsZEV4dHJhY3Rvck91dHB1dEZsb2F0KG1QYXJzZXItPmdldEJpdHNQZXJTYW1wbGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgID8ga0F1ZGlvRW5jb2RpbmdQY21GbG9hdCA6IGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBGTEFDRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpCittZWRpYV9zdGF0dXNfdCBGTEFDRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpCiB7Ci0gICAgbWV0YSA9IG1GaWxlTWV0YWRhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtRmlsZU1ldGFkYXRhKTsKIH0KIAogLy8gU25pZmZlcgogCi1ib29sIFNuaWZmRkxBQyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkKK2Jvb2wgU25pZmZGTEFDKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpCiB7Ci0gICAgLy8gZmlyc3QgNCBpcyB0aGUgc2lnbmF0dXJlIHdvcmQKLSAgICAvLyBzZWNvbmQgNCBpcyB0aGUgc2l6ZW9mIFNUUkVBTUlORk8KLSAgICAvLyAwNDIgaXMgdGhlIG1hbmRhdG9yeSBTVFJFQU1JTkZPCi0gICAgLy8gbm8gbmVlZCB0byByZWFkIHJlc3Qgb2YgdGhlIGhlYWRlciwgYXMgYSBwcmVtYXR1cmUgRU9GIHdpbGwgYmUgY2F1Z2h0IGxhdGVyCi0gICAgdWludDhfdCBoZWFkZXJbNCs0XTsKLSAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgIT0gc2l6ZW9mKGhlYWRlcikKLSAgICAgICAgICAgIHx8IG1lbWNtcCgiZkxhQ1wwXDBcMFwwNDIiLCBoZWFkZXIsIDQrNCkpCi0gICAgeworICAgIC8vIFNraXAgSUQzIHRhZ3MKKyAgICBvZmY2NF90IHBvcyA9IDA7CisgICAgdWludDhfdCBoZWFkZXJbMTBdOworICAgIGZvciAoOzspIHsKKyAgICAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KHBvcywgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgIT0gc2l6ZW9mKGhlYWRlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgLy8gbm8gbW9yZSBmaWxlIHRvIHJlYWQuCisgICAgICAgIH0KKworICAgICAgICAvLyBjaGVjayBmb3IgSUQzIHRhZworICAgICAgICBpZiAobWVtY21wKCJJRDMiLCBoZWFkZXIsIDMpICE9IDApIHsKKyAgICAgICAgICAgIGJyZWFrOyAvLyBub3QgYW4gSUQzIHRhZy4KKyAgICAgICAgfQorCisgICAgICAgIC8vIHNraXAgdGhlIElEM3YyIGRhdGEgYW5kIGNoZWNrIGFnYWluCisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGlkM0xlbiA9IDEwICsKKyAgICAgICAgICAgICAgICAoKChoZWFkZXJbNl0gJiAweDdmKSA8PCAyMSkKKyAgICAgICAgICAgICAgICAgfCAoKGhlYWRlcls3XSAmIDB4N2YpIDw8IDE0KQorICAgICAgICAgICAgICAgICB8ICgoaGVhZGVyWzhdICYgMHg3ZikgPDwgNykKKyAgICAgICAgICAgICAgICAgfCAoaGVhZGVyWzldICYgMHg3ZikpOworICAgICAgICBwb3MgKz0gaWQzTGVuOworCisgICAgICAgIEFMT0dWKCJza2lwcGVkIElEMyB0YWcgb2YgbGVuICV1IG5ldyBzdGFydGluZyBvZmZzZXQgaXMgJSMwMTZsbHgiLAorICAgICAgICAgICAgICAgIGlkM0xlbiwgKGxvbmcgbG9uZylwb3MpOworICAgIH0KKworICAgIC8vIENoZWNrIEZMQUMgaGVhZGVyLgorICAgIC8vIGh0dHBzOi8veGlwaC5vcmcvZmxhYy9mb3JtYXQuaHRtbCNzdHJlYW0KKyAgICAvLworICAgIC8vIE5vdGU6IGNvbnRlbnQgc3RvcmVkIGJpZyBlbmRpYW4uCisgICAgLy8gYnl0ZSBvZmZzZXQgIGJpdCBzaXplICBjb250ZW50CisgICAgLy8gMCAgICAgICAgICAgIDMyICAgICAgICBmTGFDCisgICAgLy8gNCAgICAgICAgICAgIDggICAgICAgICBtZXRhZGF0YSB0eXBlIFNUUkVBTUlORk8gKDApIChub3RlOiBPUiB3aXRoIDB4ODAgaWYgbGFzdCBtZXRhZGF0YSkKKyAgICAvLyA1ICAgICAgICAgICAgMjQgICAgICAgIHNpemUgb2YgbWV0YWRhdGEsIGZvciBTVFJFQU1JTkZPICgweDIyKS4KKworICAgIGlmIChtZW1jbXAoImZMYUNceDAwXHgwMFx4MDBceDIyIiwgaGVhZGVyLCA4KSAhPSAwICYmCisgICAgICAgIG1lbWNtcCgiZkxhQ1x4ODBceDAwXHgwMFx4MjIiLCBoZWFkZXIsIDgpICE9IDApIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApAQCAtODU2LDI5ICs4MzcsNDAgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAiZmxhYyIsCisgICAgImZsIiwKKyAgICBOVUxMCit9OwogCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgICAgIFVVSUQoIjEzNjRiMDQ4LWNjNDUtNGZkYS05OTM0LTMyN2QwZWJmOTgyOSIpLAogICAgICAgICAgICAgMSwKICAgICAgICAgICAgICJGTEFDIEV4dHJhY3RvciIsCi0gICAgICAgICAgICBbXSgKLSAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgKiosCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgLT4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIHsKLSAgICAgICAgICAgICAgICBpZiAoU25pZmZGTEFDKHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBNZWRpYUV4dHJhY3RvciogewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGTEFDRXh0cmFjdG9yKHNvdXJjZSk7fTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAudjMgPSB7CisgICAgICAgICAgICAgICAgICAgIFtdKAorICAgICAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZyZWVNZXRhRnVuYyAqKSAtPiBDcmVhdG9yRnVuYyB7CisgICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNuaWZmRkxBQygmaGVscGVyLCBjb25maWRlbmNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IENNZWRpYUV4dHJhY3RvciogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChuZXcgRkxBQ0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7fTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zCiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgfSwKICAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvZmxhYy9GTEFDRXh0cmFjdG9yLmgKaW5kZXggN2ZiNmVjNi4uMjIzZDM1OSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9mbGFjL0ZMQUNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL2ZsYWMvRkxBQ0V4dHJhY3Rvci5oCkBAIC0xNyw0NiArMTcsNDQgQEAKICNpZm5kZWYgRkxBQ19FWFRSQUNUT1JfSF8KICNkZWZpbmUgRkxBQ19FWFRSQUNUT1JfSF8KIAotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgRkxBQ1BhcnNlcjsKIAotY2xhc3MgRkxBQ0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitjbGFzcyBGTEFDRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIAogcHVibGljOgotICAgIGV4cGxpY2l0IEZMQUNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSk7CisgICAgZXhwbGljaXQgRkxBQ0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIkZMQUNFeHRyYWN0b3IiOyB9CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5GTEFDRXh0cmFjdG9yKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIEZMQUNQYXJzZXIgKm1QYXJzZXI7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKLSAgICBNZXRhRGF0YUJhc2UgbUZpbGVNZXRhZGF0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1GaWxlTWV0YWRhdGE7CiAKICAgICAvLyBUaGVyZSBpcyBvbmx5IG9uZSB0cmFjawotICAgIE1ldGFEYXRhQmFzZSBtVHJhY2tNZXRhZGF0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1UcmFja01ldGFkYXRhOwogCiAgICAgRkxBQ0V4dHJhY3Rvcihjb25zdCBGTEFDRXh0cmFjdG9yICYpOwogICAgIEZMQUNFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBGTEFDRXh0cmFjdG9yICYpOwogCiB9OwogCi1ib29sIFNuaWZmRkxBQyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gRkxBQ19FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAKaW5kZXggNmU5ODExNC4uNDBjOTFlNyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL0FuZHJvaWQuYnAKQEAgLTEsNCArMSw0IEBACi1jY19saWJyYXJ5X3NoYXJlZCB7CitjY19saWJyYXJ5IHsKIAogICAgIHNyY3M6IFsiTWlkaUV4dHJhY3Rvci5jcHAiXSwKIApAQCAtNiw5ICs2LDEzIEBACiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAogICAgIF0sCiAKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKKwogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuY3BwCmluZGV4IGEzMGI2ZjguLjlmNGY5ZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5jcHAKQEAgLTI0LDM1ICsyNCwzNCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bGlic29uaXZveC9lYXNfcmV2ZXJiLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotLy8gaG93IG1hbnkgU29uaXZveCBvdXRwdXQgYnVmZmVycyB0byBhZ2dyZWdhdGUgaW50byBvbmUgTWVkaWFCdWZmZXJCYXNlCisvLyBob3cgbWFueSBTb25pdm94IG91dHB1dCBidWZmZXJzIHRvIGFnZ3JlZ2F0ZSBpbnRvIG9uZSBNZWRpYUJ1ZmZlcgogc3RhdGljIGNvbnN0IGludCBOVU1fQ09NQklORV9CVUZGRVJTID0gNDsKIAotY2xhc3MgTWlkaVNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK2NsYXNzIE1pZGlTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAKIHB1YmxpYzoKICAgICBNaWRpU291cmNlKAogICAgICAgICAgICAgTWlkaUVuZ2luZSAmZW5naW5lLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICZ0cmFja01ldGFkYXRhKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TWlkaVNvdXJjZSgpOwogCiBwcml2YXRlOgogICAgIE1pZGlFbmdpbmUgJm1FbmdpbmU7Ci0gICAgTWV0YURhdGFCYXNlICZtVHJhY2tNZXRhZGF0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1UcmFja01ldGFkYXRhOwogICAgIGJvb2wgbUluaXRDaGVjazsKICAgICBib29sIG1TdGFydGVkOwogCkBAIC02OSw3ICs2OCw3IEBACiAKIE1pZGlTb3VyY2U6Ok1pZGlTb3VyY2UoCiAgICAgICAgIE1pZGlFbmdpbmUgJmVuZ2luZSwKLSAgICAgICAgTWV0YURhdGFCYXNlICZ0cmFja01ldGFkYXRhKQorICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YWRhdGEpCiAgICAgOiBtRW5naW5lKGVuZ2luZSksCiAgICAgICBtVHJhY2tNZXRhZGF0YSh0cmFja01ldGFkYXRhKSwKICAgICAgIG1Jbml0Q2hlY2soZmFsc2UpLApAQCAtODcsMTcgKzg2LDE3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBNaWRpU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pCittZWRpYV9zdGF0dXNfdCBNaWRpU291cmNlOjpzdGFydCgpCiB7CiAgICAgQUxPR1YoIk1pZGlTb3VyY2U6OnN0YXJ0Iik7CiAKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogICAgIG1TdGFydGVkID0gdHJ1ZTsKLSAgICBtRW5naW5lLmFsbG9jYXRlQnVmZmVycygpOwotICAgIHJldHVybiBPSzsKKyAgICBtRW5naW5lLmFsbG9jYXRlQnVmZmVycyhtQnVmZmVyR3JvdXApOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1pZGlTb3VyY2U6OnN0b3AoKQorbWVkaWFfc3RhdHVzX3QgTWlkaVNvdXJjZTo6c3RvcCgpCiB7CiAgICAgQUxPR1YoIk1pZGlTb3VyY2U6OnN0b3AiKTsKIApAQCAtMTA1LDIwICsxMDQsMTkgQEAKICAgICBtU3RhcnRlZCA9IGZhbHNlOwogICAgIG1FbmdpbmUucmVsZWFzZUJ1ZmZlcnMoKTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNaWRpU291cmNlOjpnZXRGb3JtYXQoTWV0YURhdGFCYXNlICZtZXRhKQorbWVkaWFfc3RhdHVzX3QgTWlkaVNvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkKIHsKLSAgICBtZXRhID0gbVRyYWNrTWV0YWRhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtVHJhY2tNZXRhZGF0YSk7CiB9CiAKLXN0YXR1c190IE1pZGlTb3VyY2U6OnJlYWQoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dEJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpCittZWRpYV9zdGF0dXNfdCBNaWRpU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dEJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpCiB7CiAgICAgQUxPR1YoIk1pZGlTb3VyY2U6OnJlYWQiKTsKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcjsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOwogICAgIC8vIHByb2Nlc3MgYW4gb3B0aW9uYWwgc2VlayByZXF1ZXN0CiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwogICAgIFJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlOwpAQCAtMTMxLDcgKzEyOSw3IEBACiAgICAgYnVmZmVyID0gbUVuZ2luZS5yZWFkQnVmZmVyKCk7CiAgICAgKm91dEJ1ZmZlciA9IGJ1ZmZlcjsKICAgICBBTE9HVigiTWlkaVNvdXJjZTo6cmVhZCAlcCBkb25lIiwgdGhpcyk7Ci0gICAgcmV0dXJuIGJ1ZmZlciAhPSBOVUxMID8gKHN0YXR1c190KSBPSyA6IChzdGF0dXNfdCkgRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICByZXR1cm4gYnVmZmVyICE9IE5VTEwgPyBBTUVESUFfT0sgOiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKIH0KIAogc3RhdHVzX3QgTWlkaVNvdXJjZTo6aW5pdCgpCkBAIC0xNDIsMTAgKzE0MCw5IEBACiAKIC8vIE1pZGlFbmdpbmUKIAotTWlkaUVuZ2luZTo6TWlkaUVuZ2luZShEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKLSAgICAgICAgTWV0YURhdGFCYXNlICpmaWxlTWV0YWRhdGEsCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqdHJhY2tNZXRhZGF0YSkgOgotICAgICAgICAgICAgbUdyb3VwKE5VTEwpLAorTWlkaUVuZ2luZTo6TWlkaUVuZ2luZShDRGF0YVNvdXJjZSAqZGF0YVNvdXJjZSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YWRhdGEsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqdHJhY2tNZXRhZGF0YSkgOgogICAgICAgICAgICAgbUVhc0RhdGEoTlVMTCksCiAgICAgICAgICAgICBtRWFzSGFuZGxlKE5VTEwpLAogICAgICAgICAgICAgbUVhc0NvbmZpZyhOVUxMKSwKQEAgLTE3MCwxNiArMTY3LDIwIEBACiAgICAgfQogCiAgICAgaWYgKGZpbGVNZXRhZGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgIGZpbGVNZXRhZGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01JREkpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKGZpbGVNZXRhZGF0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NSURJKTsKICAgICB9CiAKICAgICBpZiAodHJhY2tNZXRhZGF0YSAhPSBOVUxMKSB7Ci0gICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOwotICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIDEwMDBsbCAqIHRlbXApOyAvLyBtaWxsaS0+bWljcm8KKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyh0cmFja01ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICB0cmFja01ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAxMDAwbGwgKiB0ZW1wKTsgLy8gbWlsbGktPm1pY3JvCiAgICAgICAgIG1FYXNDb25maWcgPSBFQVNfQ29uZmlnKCk7Ci0gICAgICAgIHRyYWNrTWV0YWRhdGEtPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBtRWFzQ29uZmlnLT5zYW1wbGVSYXRlKTsKLSAgICAgICAgdHJhY2tNZXRhZGF0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbUVhc0NvbmZpZy0+bnVtQ2hhbm5lbHMpOwotICAgICAgICB0cmFja01ldGFkYXRhLT5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoCisgICAgICAgICAgICAgICAgdHJhY2tNZXRhZGF0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgbUVhc0NvbmZpZy0+c2FtcGxlUmF0ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMigKKyAgICAgICAgICAgICAgICB0cmFja01ldGFkYXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIG1FYXNDb25maWctPm51bUNoYW5uZWxzKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKAorICAgICAgICAgICAgICAgIHRyYWNrTWV0YWRhdGEsIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLCBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKICAgICB9CiAgICAgbUlzSW5pdGlhbGl6ZWQgPSB0cnVlOwogfQpAQCAtMTkxLDcgKzE5Miw2IEBACiAgICAgaWYgKG1FYXNEYXRhKSB7CiAgICAgICAgIEVBU19TaHV0ZG93bihtRWFzRGF0YSk7CiAgICAgfQotICAgIGRlbGV0ZSBtR3JvdXA7CiAgICAgZGVsZXRlIG1Jb1dyYXBwZXI7CiB9CiAKQEAgLTE5OSwyMiArMTk5LDIwIEBACiAgICAgcmV0dXJuIG1Jc0luaXRpYWxpemVkID8gT0sgOiBVTktOT1dOX0VSUk9SOwogfQogCi1zdGF0dXNfdCBNaWRpRW5naW5lOjphbGxvY2F0ZUJ1ZmZlcnMoKSB7CitzdGF0dXNfdCBNaWRpRW5naW5lOjphbGxvY2F0ZUJ1ZmZlcnMoTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqZ3JvdXApIHsKICAgICAvLyBzZWxlY3QgcmV2ZXJiIHByZXNldCBhbmQgZW5hYmxlCiAgICAgRUFTX1NldFBhcmFtZXRlcihtRWFzRGF0YSwgRUFTX01PRFVMRV9SRVZFUkIsIEVBU19QQVJBTV9SRVZFUkJfUFJFU0VULCBFQVNfUEFSQU1fUkVWRVJCX0NIQU1CRVIpOwogICAgIEVBU19TZXRQYXJhbWV0ZXIobUVhc0RhdGEsIEVBU19NT0RVTEVfUkVWRVJCLCBFQVNfUEFSQU1fUkVWRVJCX0JZUEFTUywgRUFTX0ZBTFNFKTsKIAotICAgIG1Hcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwOwogICAgIGludCBidWZzaXplID0gc2l6ZW9mKEVBU19QQ00pCiAgICAgICAgICAgICAqIG1FYXNDb25maWctPm1peEJ1ZmZlclNpemUgKiBtRWFzQ29uZmlnLT5udW1DaGFubmVscyAqIE5VTV9DT01CSU5FX0JVRkZFUlM7CiAgICAgQUxPR1YoInVzaW5nICVkIGJ5dGUgYnVmZmVyIiwgYnVmc2l6ZSk7Ci0gICAgbUdyb3VwLT5hZGRfYnVmZmVyKE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKGJ1ZnNpemUpKTsKKyAgICBtR3JvdXAgPSBncm91cDsKKyAgICBtR3JvdXAtPmFkZF9idWZmZXIoYnVmc2l6ZSk7CiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBNaWRpRW5naW5lOjpyZWxlYXNlQnVmZmVycygpIHsKLSAgICBkZWxldGUgbUdyb3VwOwotICAgIG1Hcm91cCA9IE5VTEw7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yMjQsMTMgKzIyMiwxMyBAQAogICAgIHJldHVybiByZXN1bHQgPT0gRUFTX1NVQ0NFU1MgPyBPSyA6IFVOS05PV05fRVJST1I7CiB9CiAKLU1lZGlhQnVmZmVyQmFzZSogTWlkaUVuZ2luZTo6cmVhZEJ1ZmZlcigpIHsKK01lZGlhQnVmZmVySGVscGVyKiBNaWRpRW5naW5lOjpyZWFkQnVmZmVyKCkgewogICAgIEVBU19TVEFURSBzdGF0ZTsKICAgICBFQVNfU3RhdGUobUVhc0RhdGEsIG1FYXNIYW5kbGUsICZzdGF0ZSk7CiAgICAgaWYgKChzdGF0ZSA9PSBFQVNfU1RBVEVfU1RPUFBFRCkgfHwgKHN0YXRlID09IEVBU19TVEFURV9FUlJPUikpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOworICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXI7CiAgICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIEFMT0dFKCJyZWFkQnVmZmVyOiBubyBidWZmZXIiKTsKQEAgLTIzOSw3ICsyMzcsOSBAQAogICAgIEVBU19JMzIgdGltZU1zOwogICAgIEVBU19HZXRMb2NhdGlvbihtRWFzRGF0YSwgbUVhc0hhbmRsZSwgJnRpbWVNcyk7CiAgICAgaW50NjRfdCB0aW1lVXMgPSAxMDAwbGwgKiB0aW1lTXM7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVVcyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAKICAgICBFQVNfUENNKiBwID0gKEVBU19QQ00qKSBidWZmZXItPmRhdGEoKTsKICAgICBpbnQgbnVtQnl0ZXNPdXRwdXQgPSAwOwpAQCAtMjYzLDE4ICsyNjMsMjMgQEAKIC8vIE1pZGlFeHRyYWN0b3IKIAogTWlkaUV4dHJhY3Rvcjo6TWlkaUV4dHJhY3RvcigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UpCisgICAgICAgIENEYXRhU291cmNlICpkYXRhU291cmNlKQogICAgIDogbURhdGFTb3VyY2UoZGF0YVNvdXJjZSksCiAgICAgICBtSW5pdENoZWNrKGZhbHNlKQogewogICAgIEFMT0dWKCJNaWRpRXh0cmFjdG9yIGN0b3IiKTsKLSAgICBtRW5naW5lID0gbmV3IE1pZGlFbmdpbmUobURhdGFTb3VyY2UsICZtRmlsZU1ldGFkYXRhLCAmbVRyYWNrTWV0YWRhdGEpOworICAgIG1GaWxlTWV0YWRhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgbVRyYWNrTWV0YWRhdGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgbUVuZ2luZSA9IG5ldyBNaWRpRW5naW5lKG1EYXRhU291cmNlLCBtRmlsZU1ldGFkYXRhLCBtVHJhY2tNZXRhZGF0YSk7CiAgICAgbUluaXRDaGVjayA9IG1FbmdpbmUtPmluaXRDaGVjaygpOwogfQogCiBNaWRpRXh0cmFjdG9yOjp+TWlkaUV4dHJhY3RvcigpCiB7CiAgICAgQUxPR1YoIk1pZGlFeHRyYWN0b3IgZHRvciIpOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobUZpbGVNZXRhZGF0YSk7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtVHJhY2tNZXRhZGF0YSk7CisgICAgZGVsZXRlIG1FbmdpbmU7CiB9CiAKIHNpemVfdCBNaWRpRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpCkBAIC0yODIsNyArMjg3LDcgQEAKICAgICByZXR1cm4gbUluaXRDaGVjayA9PSBPSyA/IDEgOiAwOwogfQogCi1NZWRpYVRyYWNrICpNaWRpRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpCitNZWRpYVRyYWNrSGVscGVyICpNaWRpRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpCiB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjkwLDI3ICsyOTUsMjUgQEAKICAgICByZXR1cm4gbmV3IE1pZGlTb3VyY2UoKm1FbmdpbmUsIG1UcmFja01ldGFkYXRhKTsKIH0KIAotc3RhdHVzX3QgTWlkaUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgTWlkaUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgQUxPR1YoIk1pZGlFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEiKTsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSyB8fCBpbmRleCA+IDApIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9Ci0gICAgbWV0YSA9IG1UcmFja01ldGFkYXRhOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbVRyYWNrTWV0YWRhdGEpOwogfQogCi1zdGF0dXNfdCBNaWRpRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpCittZWRpYV9zdGF0dXNfdCBNaWRpRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpCiB7CiAgICAgQUxPR1YoIk1pZGlFeHRyYWN0b3I6OmdldE1ldGFEYXRhIik7Ci0gICAgbWV0YSA9IG1GaWxlTWV0YWRhdGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtRmlsZU1ldGFkYXRhKTsKIH0KIAogLy8gU25pZmZlcgogCi1ib29sIFNuaWZmTWlkaShEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkKK2Jvb2wgU25pZmZNaWRpKENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKQogewogICAgIE1pZGlFbmdpbmUgcChzb3VyY2UsIE5VTEwsIE5VTEwpOwogICAgIGlmIChwLmluaXRDaGVjaygpID09IE9LKSB7CkBAIC0zMjMsMjggKzMyNiw0NiBAQAogCiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgImlteSIsCisgICAgIm1pZCIsCisgICAgIm1pZGkiLAorICAgICJteG1mIiwKKyAgICAib3RhIiwKKyAgICAicnR0dGwiLAorICAgICJydHgiLAorICAgICJzbWYiLAorICAgICJ4bWYiLAorICAgIE5VTEwKK307CisKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoImVmNmNjYTBhLWY4YTItNDNlNi1iYTVmLWRmY2Q3YzlhN2VmMiIpLAogICAgICAgICAxLAogICAgICAgICAiTUlESSBFeHRyYWN0b3IiLAotICAgICAgICBbXSgKLSAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICB7CisgICAgICAgICAgICAudjMgPSB7CisgICAgICAgICAgICAgICAgW10oCisgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKICAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKICAgICAgICAgICAgICAgICB2b2lkICoqLAotICAgICAgICAgICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgLT4gTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIHsKLSAgICAgICAgICAgIGlmIChTbmlmZk1pZGkoc291cmNlLCBjb25maWRlbmNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWlkaUV4dHJhY3Rvcihzb3VyY2UpO307CisgICAgICAgICAgICAgICAgRnJlZU1ldGFGdW5jICopIC0+IENyZWF0b3JGdW5jIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFNuaWZmTWlkaShzb3VyY2UsIGNvbmZpZGVuY2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gW10oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gQ01lZGlhRXh0cmFjdG9yKiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyYXAobmV3IE1pZGlFeHRyYWN0b3Ioc291cmNlKSk7fTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CisgICAgICAgIH0sCiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbWlkaS9NaWRpRXh0cmFjdG9yLmgKaW5kZXggMjQ0ZGQwZi4uYjQ4NmZjNiAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9taWRpL01pZGlFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21pZGkvTWlkaUV4dHJhY3Rvci5oCkBAIC0xNywxMiArMTcsMTIgQEAKICNpZm5kZWYgTUlESV9FWFRSQUNUT1JfSF8KICNkZWZpbmUgTUlESV9FWFRSQUNUT1JfSF8KIAotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL01pZGlJb1dyYXBwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDxsaWJzb25pdm94L2Vhcy5oPgogCkBAIC0zMCw0OCArMzAsNDggQEAKIAogY2xhc3MgTWlkaUVuZ2luZSB7CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgTWlkaUVuZ2luZShEYXRhU291cmNlQmFzZSAqZGF0YVNvdXJjZSwKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGFkYXRhLAotICAgICAgICAgICAgTWV0YURhdGFCYXNlICp0cmFja01ldGFkYXRhKTsKKyAgICBleHBsaWNpdCBNaWRpRW5naW5lKENEYXRhU291cmNlICpkYXRhU291cmNlLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICpmaWxlTWV0YWRhdGEsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YWRhdGEpOwogICAgIH5NaWRpRW5naW5lKCk7CiAKICAgICBzdGF0dXNfdCBpbml0Q2hlY2soKTsKIAotICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVycygpOworICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVycyhNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICpncm91cCk7CiAgICAgc3RhdHVzX3QgcmVsZWFzZUJ1ZmZlcnMoKTsKICAgICBzdGF0dXNfdCBzZWVrVG8oaW50NjRfdCBwb3NpdGlvblVzKTsKLSAgICBNZWRpYUJ1ZmZlckJhc2UqIHJlYWRCdWZmZXIoKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciogcmVhZEJ1ZmZlcigpOwogcHJpdmF0ZToKICAgICBNaWRpSW9XcmFwcGVyICptSW9XcmFwcGVyOwotICAgIE1lZGlhQnVmZmVyR3JvdXAgKm1Hcm91cDsKKyAgICBNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICptR3JvdXA7CiAgICAgRUFTX0RBVEFfSEFORExFIG1FYXNEYXRhOwogICAgIEVBU19IQU5ETEUgbUVhc0hhbmRsZTsKICAgICBjb25zdCBTX0VBU19MSUJfQ09ORklHKiBtRWFzQ29uZmlnOwogICAgIGJvb2wgbUlzSW5pdGlhbGl6ZWQ7CiB9OwogCi1jbGFzcyBNaWRpRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK2NsYXNzIE1pZGlFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgewogCiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgTWlkaUV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBNaWRpRXh0cmFjdG9yKENEYXRhU291cmNlICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1pZGlFeHRyYWN0b3IiOyB9CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NaWRpRXh0cmFjdG9yKCk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIENEYXRhU291cmNlICptRGF0YVNvdXJjZTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwotICAgIE1ldGFEYXRhQmFzZSBtRmlsZU1ldGFkYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbUZpbGVNZXRhZGF0YTsKIAogICAgIC8vIFRoZXJlIGlzIG9ubHkgb25lIHRyYWNrCi0gICAgTWV0YURhdGFCYXNlIG1UcmFja01ldGFkYXRhOworICAgIEFNZWRpYUZvcm1hdCAqbVRyYWNrTWV0YWRhdGE7CiAKICAgICBNaWRpRW5naW5lICptRW5naW5lOwogCkBAIC04OCw3ICs4OCw3IEBACiAKIH07CiAKLWJvb2wgU25pZmZNaWRpKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKK2Jvb2wgU25pZmZNaWRpKENEYXRhU291cmNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L0FuZHJvaWQuYnAKaW5kZXggZjdlZDBjOC4uNjUwZDc5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9ta3YvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21rdi9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsNCBAQAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAKICAgICBzcmNzOiBbIk1hdHJvc2thRXh0cmFjdG9yLmNwcCJdLAogCkBAIC0xMSw3ICsxMSw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmNwcAppbmRleCBkNjU3NTgyLi4yNDU5YmY1IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuY3BwCkBAIC0yMCwyMSArMjAsMjAgQEAKIAogI2luY2x1ZGUgIkZMQUNEZWNvZGVyLmgiCiAjaW5jbHVkZSAiTWF0cm9za2FFeHRyYWN0b3IuaCIKKyNpbmNsdWRlICJjb21tb24vd2VibWlkcy5oIgogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRyYWN0b3JVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CkBAIC00NCw3ICs0Myw3IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0cnVjdCBEYXRhU291cmNlQmFzZVJlYWRlciA6IHB1YmxpYyBta3ZwYXJzZXI6OklNa3ZSZWFkZXIgewotICAgIGV4cGxpY2l0IERhdGFTb3VyY2VCYXNlUmVhZGVyKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCisgICAgZXhwbGljaXQgRGF0YVNvdXJjZUJhc2VSZWFkZXIoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgICAgICA6IG1Tb3VyY2Uoc291cmNlKSB7CiAgICAgfQogCkBAIC02OCw4ICs2NywxMiBAQAogICAgIHZpcnR1YWwgaW50IExlbmd0aChsb25nIGxvbmcqIHRvdGFsLCBsb25nIGxvbmcqIGF2YWlsYWJsZSkgewogICAgICAgICBvZmY2NF90IHNpemU7CiAgICAgICAgIGlmIChtU291cmNlLT5nZXRTaXplKCZzaXplKSAhPSBPSykgewotICAgICAgICAgICAgKnRvdGFsID0gLTE7Ci0gICAgICAgICAgICAqYXZhaWxhYmxlID0gKGxvbmcgbG9uZykoKDF1bGwgPDwgNjMpIC0gMSk7CisgICAgICAgICAgICBpZiAodG90YWwpIHsKKyAgICAgICAgICAgICAgICAqdG90YWwgPSAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChhdmFpbGFibGUpIHsKKyAgICAgICAgICAgICAgICAqYXZhaWxhYmxlID0gKGxvbmcgbG9uZykoKDF1bGwgPDwgNjMpIC0gMSk7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICB9CkBAIC04Niw3ICs4OSw3IEBACiAgICAgfQogCiBwcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlICptU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1Tb3VyY2U7CiAKICAgICBEYXRhU291cmNlQmFzZVJlYWRlcihjb25zdCBEYXRhU291cmNlQmFzZVJlYWRlciAmKTsKICAgICBEYXRhU291cmNlQmFzZVJlYWRlciAmb3BlcmF0b3I9KGNvbnN0IERhdGFTb3VyY2VCYXNlUmVhZGVyICYpOwpAQCAtMTE4LDIyICsxMjEsMjUgQEAKICAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrRW50cnkgKm1CbG9ja0VudHJ5OwogICAgIGxvbmcgbUJsb2NrRW50cnlJbmRleDsKIAorICAgIHVuc2lnbmVkIGxvbmcgbVRyYWNrVHlwZTsKKyAgICB2b2lkIHNlZWt3aXRob3V0Y3VlX2woaW50NjRfdCBzZWVrVGltZVVzLCBpbnQ2NF90ICphY3R1YWxGcmFtZVRpbWVVcyk7CisKICAgICB2b2lkIGFkdmFuY2VfbCgpOwogCiAgICAgQmxvY2tJdGVyYXRvcihjb25zdCBCbG9ja0l0ZXJhdG9yICYpOwogICAgIEJsb2NrSXRlcmF0b3IgJm9wZXJhdG9yPShjb25zdCBCbG9ja0l0ZXJhdG9yICYpOwogfTsKIAotc3RydWN0IE1hdHJvc2thU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworc3RydWN0IE1hdHJvc2thU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogICAgIE1hdHJvc2thU291cmNlKE1hdHJvc2thRXh0cmFjdG9yICpleHRyYWN0b3IsIHNpemVfdCBpbmRleCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk1hdHJvc2thU291cmNlKCk7CkBAIC0xNDMsNiArMTQ5LDkgQEAKICAgICAgICAgQVZDLAogICAgICAgICBBQUMsCiAgICAgICAgIEhFVkMsCisgICAgICAgIE1QMywKKyAgICAgICAgUENNLAorICAgICAgICBWT1JCSVMsCiAgICAgICAgIE9USEVSCiAgICAgfTsKIApAQCAtMTUzLDEyICsxNjIsMjEgQEAKICAgICBCbG9ja0l0ZXJhdG9yIG1CbG9ja0l0ZXI7CiAgICAgc3NpemVfdCBtTkFMU2l6ZUxlbjsgIC8vIGZvciB0eXBlIEFWQyBvciBIRVZDCiAKLSAgICBMaXN0PE1lZGlhQnVmZmVyQmFzZSAqPiBtUGVuZGluZ0ZyYW1lczsKKyAgICBMaXN0PE1lZGlhQnVmZmVySGVscGVyICo+IG1QZW5kaW5nRnJhbWVzOworCisgICAgaW50NjRfdCBtQ3VycmVudFRTOyAvLyBhZGQgZm9yIG1wMworICAgIHVpbnQzMl90IG1NUDNIZWFkZXI7CisKKyAgICBtZWRpYV9zdGF0dXNfdCBmaW5kTVAzSGVhZGVyKHVpbnQzMl90ICogaGVhZGVyLAorICAgICAgICBjb25zdCB1aW50OF90ICpkYXRhU291cmNlLCBpbnQgbGVuZ3RoLCBpbnQgKm91dFN0YXJ0UG9zKTsKKyAgICBtZWRpYV9zdGF0dXNfdCBtcDNGcmFtZVJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMsCisgICAgICAgICAgICBpbnQ2NF90IHRhcmdldFNhbXBsZVRpbWVVcyk7CiAKICAgICBzdGF0dXNfdCBhZHZhbmNlKCk7CiAKLSAgICBzdGF0dXNfdCBzZXRXZWJtQmxvY2tDcnlwdG9JbmZvKE1lZGlhQnVmZmVyQmFzZSAqbWJ1Zik7Ci0gICAgc3RhdHVzX3QgcmVhZEJsb2NrKCk7CisgICAgc3RhdHVzX3Qgc2V0V2VibUJsb2NrQ3J5cHRvSW5mbyhNZWRpYUJ1ZmZlckhlbHBlciAqbWJ1Zik7CisgICAgbWVkaWFfc3RhdHVzX3QgcmVhZEJsb2NrKCk7CiAgICAgdm9pZCBjbGVhclBlbmRpbmdGcmFtZXMoKTsKIAogICAgIE1hdHJvc2thU291cmNlKGNvbnN0IE1hdHJvc2thU291cmNlICYpOwpAQCAtMjIxLDQ3ICsyMzksNDMgQEAKICAgICAgIG1CbG9ja0l0ZXIobUV4dHJhY3RvciwKICAgICAgICAgICAgICAgICAgbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1UcmFja051bSwKICAgICAgICAgICAgICAgICAgaW5kZXgpLAotICAgICAgbU5BTFNpemVMZW4oLTEpIHsKLSAgICBNZXRhRGF0YUJhc2UgJm1ldGEgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLmVkaXRJdGVtQXQoaW5kZXgpLm1NZXRhOworICAgICAgbU5BTFNpemVMZW4oLTEpLAorICAgICAgbUN1cnJlbnRUUygwKSwKKyAgICAgIG1NUDNIZWFkZXIoMCkgeworICAgIE1hdHJvc2thRXh0cmFjdG9yOjpUcmFja0luZm8gJnRyYWNrSW5mbyA9IG1FeHRyYWN0b3ItPm1UcmFja3MuZWRpdEl0ZW1BdChpbmRleCk7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gdHJhY2tJbmZvLm1NZXRhOwogCiAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBDSEVDSyhtZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKTsKIAogICAgIG1Jc0F1ZGlvID0gIXN0cm5jYXNlY21wKCJhdWRpby8iLCBtaW1lLCA2KTsKIAogICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7CiAgICAgICAgIG1UeXBlID0gQVZDOwogCi0gICAgICAgIHVpbnQzMl90IGR1bW15OwotICAgICAgICBjb25zdCB1aW50OF90ICphdmNjOwotICAgICAgICBzaXplX3QgYXZjY1NpemU7Ci0gICAgICAgIGludDMyX3QgbmFsU2l6ZUxlbiA9IDA7Ci0gICAgICAgIGlmIChtZXRhLmZpbmRJbnQzMihrS2V5TmFsTGVuZ3RoU2l6ZSwgJm5hbFNpemVMZW4pKSB7Ci0gICAgICAgICAgICBpZiAobmFsU2l6ZUxlbiA+PSAwICYmIG5hbFNpemVMZW4gPD0gNCkgewotICAgICAgICAgICAgICAgIG1OQUxTaXplTGVuID0gbmFsU2l6ZUxlbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtZXRhLmZpbmREYXRhKGtLZXlBVkNDLCAmZHVtbXksIChjb25zdCB2b2lkICoqKSZhdmNjLCAmYXZjY1NpemUpCi0gICAgICAgICAgICAgICAgJiYgYXZjY1NpemUgPj0gNXUpIHsKLSAgICAgICAgICAgIG1OQUxTaXplTGVuID0gMSArIChhdmNjWzRdICYgMyk7Ci0gICAgICAgICAgICBBTE9HVigibU5BTFNpemVMZW4gPSAlemQiLCBtTkFMU2l6ZUxlbik7CisgICAgICAgIGludDMyX3QgbmFsU2l6ZUxlbiA9IHRyYWNrSW5mby5tTmFsTGVuZ3RoU2l6ZTsKKyAgICAgICAgaWYgKG5hbFNpemVMZW4gPj0gMCAmJiBuYWxTaXplTGVuIDw9IDQpIHsKKyAgICAgICAgICAgIG1OQUxTaXplTGVuID0gbmFsU2l6ZUxlbjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJObyBtTkFMU2l6ZUxlbiIpOworICAgICAgICAgICAgQUxPR0UoIk5vIEFWQyBtTkFMU2l6ZUxlbiIpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkgewogICAgICAgICBtVHlwZSA9IEhFVkM7CiAKLSAgICAgICAgdWludDMyX3QgZHVtbXk7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmh2Y2M7Ci0gICAgICAgIHNpemVfdCBodmNjU2l6ZTsKLSAgICAgICAgaWYgKG1ldGEuZmluZERhdGEoa0tleUhWQ0MsICZkdW1teSwgKGNvbnN0IHZvaWQgKiopJmh2Y2MsICZodmNjU2l6ZSkKLSAgICAgICAgICAgICAgICAmJiBodmNjU2l6ZSA+PSAyMnUpIHsKLSAgICAgICAgICAgIG1OQUxTaXplTGVuID0gMSArIChodmNjWzE0KzddICYgMyk7Ci0gICAgICAgICAgICBBTE9HVigibU5BTFNpemVMZW4gPSAlenUiLCBtTkFMU2l6ZUxlbik7CisgICAgICAgIGludDMyX3QgbmFsU2l6ZUxlbiA9IHRyYWNrSW5mby5tTmFsTGVuZ3RoU2l6ZTsKKyAgICAgICAgaWYgKG5hbFNpemVMZW4gPj0gMCAmJiBuYWxTaXplTGVuIDw9IDQpIHsKKyAgICAgICAgICAgIG1OQUxTaXplTGVuID0gbmFsU2l6ZUxlbjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJObyBtTkFMU2l6ZUxlbiIpOworICAgICAgICAgICAgQUxPR0UoIk5vIEhFVkMgbU5BTFNpemVMZW4iKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgewogICAgICAgICBtVHlwZSA9IEFBQzsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpKSB7CisgICAgICAgIG1UeXBlID0gTVAzOworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkgeworICAgICAgICBtVHlwZSA9IFBDTTsKKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykpIHsKKyAgICAgICAgbVR5cGUgPSBWT1JCSVM7CiAgICAgfQogfQogCkBAIC0yNjksMjUgKzI4MywzNiBAQAogICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOwogfQogCi1zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c3RhcnQoTWV0YURhdGFCYXNlICogLyogcGFyYW1zICovKSB7CittZWRpYV9zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6c3RhcnQoKSB7CiAgICAgaWYgKG1UeXBlID09IEFWQyAmJiBtTkFMU2l6ZUxlbiA8IDApIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCisgICAgLy8gYWxsb2NhdGUgb25lIHNtYWxsIGluaXRpYWwgYnVmZmVyLCBidXQgbGVhdmUgcGxlbnR5IG9mIHJvb20gdG8gZ3JvdworICAgIG1CdWZmZXJHcm91cC0+aW5pdCgxIC8qIG51bWJlciBvZiBidWZmZXJzICovLCAxMDI0IC8qIGJ1ZmZlciBzaXplICovLCA2NCAvKiBncm93dGggbGltaXQgKi8pOwogICAgIG1CbG9ja0l0ZXIucmVzZXQoKTsKIAotICAgIHJldHVybiBPSzsKKyAgICBpZiAobVR5cGUgPT0gTVAzICYmIG1NUDNIZWFkZXIgPT0gMCkgeworICAgICAgICBpbnQgc3RhcnQgPSAtMTsKKyAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gZmluZE1QM0hlYWRlcigmbU1QM0hlYWRlciwgTlVMTCwgMCwgJnN0YXJ0KTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIk5vIG1wMyBoZWFkZXIgZm91bmQiKTsKKyAgICAgICAgICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnN0b3AoKSB7CiAgICAgY2xlYXJQZW5kaW5nRnJhbWVzKCk7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5pdGVtQXQobVRyYWNrSW5kZXgpLm1NZXRhOwotICAgIHJldHVybiBPSzsKK21lZGlhX3N0YXR1c190IE1hdHJvc2thU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1FeHRyYWN0b3ItPm1UcmFja3MuaXRlbUF0KG1UcmFja0luZGV4KS5tTWV0YSk7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC0zMDAsNiArMzI1LDcgQEAKICAgICAgIG1DbHVzdGVyKE5VTEwpLAogICAgICAgbUJsb2NrRW50cnkoTlVMTCksCiAgICAgICBtQmxvY2tFbnRyeUluZGV4KDApIHsKKyAgICBtVHJhY2tUeXBlID0gbUV4dHJhY3Rvci0+bVNlZ21lbnQtPkdldFRyYWNrcygpLT5HZXRUcmFja0J5TnVtYmVyKHRyYWNrTnVtKS0+R2V0VHlwZSgpOwogICAgIHJlc2V0KCk7CiB9CiAKQEAgLTQ0Miw3ICs0NjgsNyBAQAogICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHsKICAgICAgICAgICAgIHBFbnRyeSA9IHBTSC0+R2V0RW50cnkoaW5kZXgpOwogCi0gICAgICAgICAgICBpZiAocEVudHJ5LT5pZCA9PSAweDBDNTNCQjZCKSB7IC8vIEN1ZXMgSUQKKyAgICAgICAgICAgIGlmIChwRW50cnktPmlkID09IGxpYndlYm06OmtNa3ZDdWVzKSB7IC8vIEN1ZXMgSUQKICAgICAgICAgICAgICAgICBsb25nIGxlbjsgbG9uZyBsb25nIHBvczsKICAgICAgICAgICAgICAgICBwU2VnbWVudC0+UGFyc2VDdWVzKHBFbnRyeS0+cG9zLCBwb3MsIGxlbik7CiAgICAgICAgICAgICAgICAgcEN1ZXMgPSBwU2VnbWVudC0+R2V0Q3VlcygpOwpAQCAtNDUyLDEyICs0NzgsMTQgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmICghcEN1ZXMpIHsKLSAgICAgICAgICAgIEFMT0dFKCJObyBDdWVzIGluIGZpbGUiKTsKKyAgICAgICAgICAgIEFMT0dWKCJObyBDdWVzIGluIGZpbGUsc2VlayB3aXRob3V0IGN1ZSBkYXRhIik7CisgICAgICAgICAgICBzZWVrd2l0aG91dGN1ZV9sKHNlZWtUaW1lVXMsIGFjdHVhbEZyYW1lVGltZVVzKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgIH0KICAgICBlbHNlIGlmICghcFNIKSB7Ci0gICAgICAgIEFMT0dFKCJObyBTZWVrSGVhZCIpOworICAgICAgICBBTE9HVigiTm8gU2Vla0hlYWQsIHNlZWsgd2l0aG91dCBjdWUgZGF0YSIpOworICAgICAgICBzZWVrd2l0aG91dGN1ZV9sKHNlZWtUaW1lVXMsIGFjdHVhbEZyYW1lVGltZVVzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNDY2LDcgKzQ5NCw5IEBACiAgICAgd2hpbGUgKCFwQ3Vlcy0+RG9uZVBhcnNpbmcoKSkgewogICAgICAgICBwQ3Vlcy0+TG9hZEN1ZVBvaW50KCk7CiAgICAgICAgIHBDUCA9IHBDdWVzLT5HZXRMYXN0KCk7Ci0gICAgICAgIENIRUNLKHBDUCk7CisgICAgICAgIEFMT0dWKCJwQ1AgPSAlcyIsIHBDUCA9PSBOVUxMID8gIk5VTEwiIDogIm5vdCBOVUxMIik7CisgICAgICAgIGlmIChwQ1AgPT0gTlVMTCkKKyAgICAgICAgICAgIGNvbnRpbnVlOwogCiAgICAgICAgIHNpemVfdCB0cmFja0NvdW50ID0gbUV4dHJhY3Rvci0+bVRyYWNrcy5zaXplKCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCB0cmFja0NvdW50OyArK2luZGV4KSB7CkBAIC01MDQsNiArNTM0LDcgQEAKICAgICAvLyBBbHdheXMgKnNlYXJjaCogYmFzZWQgb24gdGhlIHZpZGVvIHRyYWNrLCBidXQgZmluYWxpemUgYmFzZWQgb24gbVRyYWNrTnVtCiAgICAgaWYgKCFwVFApIHsKICAgICAgICAgQUxPR0UoIkRpZCBub3QgbG9jYXRlIHRoZSB2aWRlbyB0cmFjayBmb3Igc2Vla2luZyIpOworICAgICAgICBzZWVrd2l0aG91dGN1ZV9sKHNlZWtUaW1lVXMsIGFjdHVhbEZyYW1lVGltZVVzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNTQ3LDYgKzU3OCwzMSBAQAogICAgIHJldHVybiAobUJsb2NrRW50cnktPkdldEJsb2NrKCktPkdldFRpbWUobUNsdXN0ZXIpICsgNTAwbGwpIC8gMTAwMGxsOwogfQogCit2b2lkIEJsb2NrSXRlcmF0b3I6OnNlZWt3aXRob3V0Y3VlX2woaW50NjRfdCBzZWVrVGltZVVzLCBpbnQ2NF90ICphY3R1YWxGcmFtZVRpbWVVcykgeworICAgIG1DbHVzdGVyID0gbUV4dHJhY3Rvci0+bVNlZ21lbnQtPkZpbmRDbHVzdGVyKHNlZWtUaW1lVXMgKiAxMDAwbGwpOworICAgIGNvbnN0IGxvbmcgc3RhdHVzID0gbUNsdXN0ZXItPkdldEZpcnN0KG1CbG9ja0VudHJ5KTsKKyAgICBpZiAoc3RhdHVzIDwgMCkgeyAgLy8gZXJyb3IKKyAgICAgICAgQUxPR0UoImdldCBsYXN0IGJsb2NrZW5yeSBmYWlsZWQhIik7CisgICAgICAgIG1DbHVzdGVyID0gTlVMTDsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQmxvY2tFbnRyeUluZGV4ID0gMDsKKyAgICB3aGlsZSAoIWVvcygpICYmICgoYmxvY2soKS0+R2V0VHJhY2tOdW1iZXIoKSAhPSBtVHJhY2tOdW0pIHx8IChibG9ja1RpbWVVcygpIDwgc2Vla1RpbWVVcykpKSB7CisgICAgICAgIGFkdmFuY2VfbCgpOworICAgIH0KKworICAgIC8vIHZpZGVvIHRyYWNrIHdpbGwgc2VlayB0byB0aGUgbmV4dCBrZXkgZnJhbWUuCisgICAgaWYgKG1UcmFja1R5cGUgPT0gMSkgeworICAgICAgICB3aGlsZSAoIWVvcygpICYmICgoYmxvY2soKS0+R2V0VHJhY2tOdW1iZXIoKSAhPSBtVHJhY2tOdW0pIHx8CisgICAgICAgICAgICAgICAgICAgICAgIW1CbG9ja0VudHJ5LT5HZXRCbG9jaygpLT5Jc0tleSgpKSkgeworICAgICAgICAgICAgYWR2YW5jZV9sKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgKmFjdHVhbEZyYW1lVGltZVVzID0gYmxvY2tUaW1lVXMoKTsKKyAgICAgQUxPR1YoInNlZWtUaW1lVXM6JWxsZCwgYWN0dWFsRnJhbWVUaW1lVXM6JWxsZCwgdHJhY2tudW06JWxsZCIsCisgICAgICAgICAgICAgIChsb25nIGxvbmcpc2Vla1RpbWVVcywgKGxvbmcgbG9uZykqYWN0dWFsRnJhbWVUaW1lVXMsIChsb25nIGxvbmcpbVRyYWNrTnVtKTsKK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogc3RhdGljIHVuc2lnbmVkIFUyNF9BVChjb25zdCB1aW50OF90ICpwdHIpIHsKQEAgLTU3OSw3ICs2MzUsNyBAQAogCiB2b2lkIE1hdHJvc2thU291cmNlOjpjbGVhclBlbmRpbmdGcmFtZXMoKSB7CiAgICAgd2hpbGUgKCFtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKSB7Ci0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqZnJhbWUgPSAqbVBlbmRpbmdGcmFtZXMuYmVnaW4oKTsKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CiAgICAgICAgIG1QZW5kaW5nRnJhbWVzLmVyYXNlKG1QZW5kaW5nRnJhbWVzLmJlZ2luKCkpOwogCiAgICAgICAgIGZyYW1lLT5yZWxlYXNlKCk7CkBAIC01ODcsNyArNjQzLDcgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpzZXRXZWJtQmxvY2tDcnlwdG9JbmZvKE1lZGlhQnVmZmVyQmFzZSAqbWJ1Zikgeworc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OnNldFdlYm1CbG9ja0NyeXB0b0luZm8oTWVkaWFCdWZmZXJIZWxwZXIgKm1idWYpIHsKICAgICBpZiAobWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgPCAxIHx8IG1idWYtPnJhbmdlX2xlbmd0aCgpIC0gMSA+IElOVDMyX01BWCkgewogICAgICAgICAvLyAxLWJ5dGUgc2lnbmFsCiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CkBAIC02MDEsMTcgKzY1NywxNyBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIE1ldGFEYXRhQmFzZSAmbWV0YSA9IG1idWYtPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IG1idWYtPm1ldGFfZGF0YSgpOwogICAgIGlmIChlbmNyeXB0ZWQpIHsKICAgICAgICAgdWludDhfdCBjdHJDb3VudGVyWzE2XSA9IHsgMCB9OwotICAgICAgICB1aW50MzJfdCB0eXBlOwogICAgICAgICBjb25zdCB1aW50OF90ICprZXlJZDsKICAgICAgICAgc2l6ZV90IGtleUlkU2l6ZTsKLSAgICAgICAgY29uc3QgTWV0YURhdGFCYXNlICZ0cmFja01ldGEgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChtVHJhY2tJbmRleCkubU1ldGE7Ci0gICAgICAgIENIRUNLKHRyYWNrTWV0YS5maW5kRGF0YShrS2V5Q3J5cHRvS2V5LCAmdHlwZSwgKGNvbnN0IHZvaWQgKiopJmtleUlkLCAma2V5SWRTaXplKSk7Ci0gICAgICAgIG1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAwLCBrZXlJZCwga2V5SWRTaXplKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja01ldGEgPSBtRXh0cmFjdG9yLT5tVHJhY2tzLml0ZW1BdChtVHJhY2tJbmRleCkubU1ldGE7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2tNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksCisgICAgICAgICAgICAgICAgKHZvaWQqKikma2V5SWQsICZrZXlJZFNpemUpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwga2V5SWQsIGtleUlkU2l6ZSk7CiAgICAgICAgIG1lbWNweShjdHJDb3VudGVyLCBkYXRhICsgMSwgOCk7Ci0gICAgICAgIG1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvSVYsIDAsIGN0ckNvdW50ZXIsIDE2KTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19JViwgY3RyQ291bnRlciwgMTYpOwogICAgICAgICBpZiAocGFydGl0aW9uZWQpIHsKICAgICAgICAgICAgIC8qICAwICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgICAgICAzCiAgICAgICAgICAgICAgKiAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCkBAIC02NjQsOCArNzIwLDEwIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB1aW50MzJfdCBzaXplb2ZQbGFpblNpemVzID0gc2l6ZW9mKHVpbnQzMl90KSAqIHBsYWluU2l6ZXMuc2l6ZSgpOwogICAgICAgICAgICAgdWludDMyX3Qgc2l6ZW9mRW5jcnlwdGVkU2l6ZXMgPSBzaXplb2YodWludDMyX3QpICogZW5jcnlwdGVkU2l6ZXMuc2l6ZSgpOwotICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLCBwbGFpblNpemVzLmRhdGEoKSwgc2l6ZW9mUGxhaW5TaXplcyk7Ci0gICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAwLCBlbmNyeXB0ZWRTaXplcy5kYXRhKCksIHNpemVvZkVuY3J5cHRlZFNpemVzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMsCisgICAgICAgICAgICAgICAgICAgIHBsYWluU2l6ZXMuZGF0YSgpLCBzaXplb2ZQbGFpblNpemVzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTLAorICAgICAgICAgICAgICAgICAgICBlbmNyeXB0ZWRTaXplcy5kYXRhKCksIHNpemVvZkVuY3J5cHRlZFNpemVzKTsKICAgICAgICAgICAgIG1idWYtPnNldF9yYW5nZShmcmFtZU9mZnNldCwgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSBmcmFtZU9mZnNldCk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAvKgpAQCAtNjg1LDggKzc0MywxMCBAQAogICAgICAgICAgICAgICovCiAgICAgICAgICAgICBpbnQzMl90IHBsYWluU2l6ZXNbXSA9IHsgMCB9OwogICAgICAgICAgICAgaW50MzJfdCBlbmNyeXB0ZWRTaXplc1tdID0geyBzdGF0aWNfY2FzdDxpbnQzMl90PihtYnVmLT5yYW5nZV9sZW5ndGgoKSAtIDkpIH07Ci0gICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleVBsYWluU2l6ZXMsIDAsIHBsYWluU2l6ZXMsIHNpemVvZihwbGFpblNpemVzKSk7Ci0gICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAwLCBlbmNyeXB0ZWRTaXplcywgc2l6ZW9mKGVuY3J5cHRlZFNpemVzKSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTLAorICAgICAgICAgICAgICAgICAgICBwbGFpblNpemVzLCBzaXplb2YocGxhaW5TaXplcykpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMsCisgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZFNpemVzLCBzaXplb2YoZW5jcnlwdGVkU2l6ZXMpKTsKICAgICAgICAgICAgIG1idWYtPnNldF9yYW5nZSg5LCBtYnVmLT5yYW5nZV9sZW5ndGgoKSAtIDkpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTcwMywxOSArNzYzLDIxIEBACiAgICAgICAgICAqLwogICAgICAgICBpbnQzMl90IHBsYWluU2l6ZXNbXSA9IHsgc3RhdGljX2Nhc3Q8aW50MzJfdD4obWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSAxKSB9OwogICAgICAgICBpbnQzMl90IGVuY3J5cHRlZFNpemVzW10gPSB7IDAgfTsKLSAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLCBwbGFpblNpemVzLCBzaXplb2YocGxhaW5TaXplcykpOwotICAgICAgICBtZXRhLnNldERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAwLCBlbmNyeXB0ZWRTaXplcywgc2l6ZW9mKGVuY3J5cHRlZFNpemVzKSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMsCisgICAgICAgICAgICAgICAgcGxhaW5TaXplcywgc2l6ZW9mKHBsYWluU2l6ZXMpKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMsCisgICAgICAgICAgICAgICAgZW5jcnlwdGVkU2l6ZXMsIHNpemVvZihlbmNyeXB0ZWRTaXplcykpOwogICAgICAgICBtYnVmLT5zZXRfcmFuZ2UoMSwgbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCkgLSAxKTsKICAgICB9CiAKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpyZWFkQmxvY2soKSB7CittZWRpYV9zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6cmVhZEJsb2NrKCkgewogICAgIENIRUNLKG1QZW5kaW5nRnJhbWVzLmVtcHR5KCkpOwogCiAgICAgaWYgKG1CbG9ja0l0ZXIuZW9zKCkpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKICAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrICpibG9jayA9IG1CbG9ja0l0ZXIuYmxvY2soKTsKQEAgLTcyNywxOCArNzg5LDQxIEBACiAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2s6OkZyYW1lICZmcmFtZSA9IGJsb2NrLT5HZXRGcmFtZShpKTsKICAgICAgICAgc2l6ZV90IGxlbiA9IGZyYW1lLmxlbjsKICAgICAgICAgaWYgKFNJWkVfTUFYIC0gbGVuIDwgdHJhY2tJbmZvLT5tSGVhZGVyTGVuKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KIAogICAgICAgICBsZW4gKz0gdHJhY2tJbmZvLT5tSGVhZGVyTGVuOwotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKm1idWYgPSBNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShsZW4pOworICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqbWJ1ZjsKKyAgICAgICAgbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmbWJ1ZiwgZmFsc2UgLyogbm9uYmxvY2tpbmcgKi8sIGxlbiAvKiByZXF1ZXN0ZWQgc2l6ZSAqLyk7CisgICAgICAgIG1idWYtPnNldF9yYW5nZSgwLCBsZW4pOwogICAgICAgICB1aW50OF90ICpkYXRhID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPihtYnVmLT5kYXRhKCkpOwogICAgICAgICBpZiAodHJhY2tJbmZvLT5tSGVhZGVyKSB7CiAgICAgICAgICAgICBtZW1jcHkoZGF0YSwgdHJhY2tJbmZvLT5tSGVhZGVyLCB0cmFja0luZm8tPm1IZWFkZXJMZW4pOwogICAgICAgICB9CiAKLSAgICAgICAgbWJ1Zi0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0gICAgICAgIG1idWYtPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgYmxvY2stPklzS2V5KCkpOworICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtYnVmLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVVzKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgYmxvY2stPklzS2V5KCkpOworCisgICAgICAgIGlmIChtVHlwZSA9PSBWT1JCSVMpIHsKKyAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrSW5mby0+bU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDY0KHRyYWNrSW5mby0+bU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZHVyYXRpb25VcykpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIFRPRE86IEV4cGxvcmUgaWYgdGhpcyBjYW4gYmUgaGFuZGxlZCBzaW1pbGFyIHRvIE1QRUc0IGV4dHJhY3RvciB3aGVyZSBwYWRkaW5nIGlzCisgICAgICAgICAgICAvLyBzaWduYWxsZWQgaW5zdGVhZCBvZiBWQUxJRF9TQU1QTEVTCisgICAgICAgICAgICAvLyBSZW1haW5pbmcgdmFsaWQgc2FtcGxlcyBpbiBWb3JiaXMgdHJhY2sKKyAgICAgICAgICAgIGlmIChkdXJhdGlvblVzID4gdGltZVVzKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCB2YWxpZFNhbXBsZXMgPSAoKGR1cmF0aW9uVXMgLSB0aW1lVXMpICogc2FtcGxlUmF0ZSkgLyAxMDAwMDAwbGw7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUywgdmFsaWRTYW1wbGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIHN0YXR1c190IGVyciA9IGZyYW1lLlJlYWQobUV4dHJhY3Rvci0+bVJlYWRlciwgZGF0YSArIHRyYWNrSW5mby0+bUhlYWRlckxlbik7CiAgICAgICAgIGlmIChlcnIgPT0gT0sKQEAgLTc1Miw3ICs4MzcsNyBAQAogCiAgICAgICAgICAgICBtQmxvY2tJdGVyLmFkdmFuY2UoKTsKICAgICAgICAgICAgIG1idWYtPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KIAogICAgICAgICBtUGVuZGluZ0ZyYW1lcy5wdXNoX2JhY2sobWJ1Zik7CkBAIC03NjAsMTEgKzg0NSwxOTMgQEAKIAogICAgIG1CbG9ja0l0ZXIuYWR2YW5jZSgpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1hdHJvc2thU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CisvL3RoZSB2YWx1ZSBvZiBrTVAzSGVhZGVyTWFzayBpcyBmcm9tIE1QM0V4dHJhY3Rvcgorc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNUDNIZWFkZXJNYXNrID0gMHhmZmZlMGMwMDsKKworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6OmZpbmRNUDNIZWFkZXIodWludDMyX3QgKiBoZWFkZXIsCisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGFTb3VyY2UsIGludCBsZW5ndGgsIGludCAqb3V0U3RhcnRQb3MpIHsKKyAgICBpZiAoTlVMTCA9PSBoZWFkZXIpIHsKKyAgICAgICAgQUxPR0UoImhlYWRlciBpcyBudWxsISIpOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfQorCisgICAgLy90byBmaW5kIGhlYWRlciBzdGFydCBwb3NpdGlvbgorICAgIGlmICgwICE9ICpoZWFkZXIpIHsKKyAgICAgICAgaWYgKE5VTEwgPT0gZGF0YVNvdXJjZSkgeworICAgICAgICAgICAgKm91dFN0YXJ0UG9zID0gLTE7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IHRtcENvZGUgPSAwOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgICAgICAgICB0bXBDb2RlID0gKHRtcENvZGUgPDwgOCkgKyBkYXRhU291cmNlW2ldOworICAgICAgICAgICAgaWYgKCh0bXBDb2RlICYga01QM0hlYWRlck1hc2spID09ICgqaGVhZGVyICYga01QM0hlYWRlck1hc2spKSB7CisgICAgICAgICAgICAgICAgKm91dFN0YXJ0UG9zID0gaSAtIDM7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAqb3V0U3RhcnRQb3MgPSAtMTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisKKyAgICAvL3RvIGZpbmQgbXAzIGhlYWRlcgorICAgIHVpbnQzMl90IGNvZGUgPSAwOworICAgIHdoaWxlICgwID09ICpoZWFkZXIpIHsKKyAgICAgICAgd2hpbGUgKG1QZW5kaW5nRnJhbWVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IGVyciA9IHJlYWRCbG9jaygpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CisgICAgICAgIHNpemVfdCBzaXplID0gZnJhbWUtPnJhbmdlX2xlbmd0aCgpOworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gZnJhbWUtPnJhbmdlX29mZnNldCgpOworICAgICAgICBzaXplX3QgaTsKKyAgICAgICAgc2l6ZV90IGZyYW1lX3NpemU7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgIEFMT0dWKCJkYXRhWyV6dV09JXgiLCBpLCAqKCh1aW50OF90KilmcmFtZS0+ZGF0YSgpICsgb2Zmc2V0ICsgaSkpOworICAgICAgICAgICAgY29kZSA9IChjb2RlIDw8IDgpICsgKigodWludDhfdCopZnJhbWUtPmRhdGEoKSArIG9mZnNldCArIGkpOworICAgICAgICAgICAgaWYgKEdldE1QRUdBdWRpb0ZyYW1lU2l6ZShjb2RlLCAmZnJhbWVfc2l6ZSwgTlVMTCwgTlVMTCwgTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAqaGVhZGVyID0gY29kZTsKKyAgICAgICAgICAgICAgICBtQmxvY2tJdGVyLnJlc2V0KCk7CisgICAgICAgICAgICAgICAgY2xlYXJQZW5kaW5nRnJhbWVzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKK30KKworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FTb3VyY2U6Om1wM0ZyYW1lUmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zLAorICAgICAgICBpbnQ2NF90IHRhcmdldFNhbXBsZVRpbWVVcykgeworICAgIE1lZGlhQnVmZmVySGVscGVyICpmcmFtZSA9ICptUGVuZGluZ0ZyYW1lcy5iZWdpbigpOworICAgIGludDY0X3Qgc2Vla1RpbWVVczsKKyAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgeworICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50NjQoZnJhbWUtPm1ldGFfZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICZtQ3VycmVudFRTKSk7CisgICAgICAgIGlmIChtQ3VycmVudFRTIDwgMCkgeworICAgICAgICAgICAgbUN1cnJlbnRUUyA9IDA7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoZnJhbWUtPm1ldGFfZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIG1DdXJyZW50VFMpOworICAgICAgICB9CisgICAgfQorCisgICAgaW50MzJfdCBzdGFydCA9IC0xOworICAgIHdoaWxlIChzdGFydCA8IDApIHsKKyAgICAgICAgLy9maW5kIGhlYWRlciBzdGFydCBwb3NpdGlvbgorICAgICAgICBmaW5kTVAzSGVhZGVyKCZtTVAzSGVhZGVyLAorICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QqKWZyYW1lLT5kYXRhKCkgKyBmcmFtZS0+cmFuZ2Vfb2Zmc2V0KCksCisgICAgICAgICAgICBmcmFtZS0+cmFuZ2VfbGVuZ3RoKCksICZzdGFydCk7CisgICAgICAgIEFMT0dWKCJzdGFydD0lZCwgZnJhbWUtPnJhbmdlX2xlbmd0aCgpID0gJXp1LCBmcmFtZS0+cmFuZ2Vfb2Zmc2V0KCkgPSV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGZyYW1lLT5yYW5nZV9sZW5ndGgoKSwgZnJhbWUtPnJhbmdlX29mZnNldCgpKTsKKyAgICAgICAgaWYgKHN0YXJ0ID49IDApCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZnJhbWUtPnJlbGVhc2UoKTsKKyAgICAgICAgbVBlbmRpbmdGcmFtZXMuZXJhc2UobVBlbmRpbmdGcmFtZXMuYmVnaW4oKSk7CisgICAgICAgIHdoaWxlIChtUGVuZGluZ0ZyYW1lcy5lbXB0eSgpKSB7CisgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSByZWFkQmxvY2soKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBjbGVhclBlbmRpbmdGcmFtZXMoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CisgICAgfQorCisgICAgZnJhbWUtPnNldF9yYW5nZShmcmFtZS0+cmFuZ2Vfb2Zmc2V0KCkgKyBzdGFydCwgZnJhbWUtPnJhbmdlX2xlbmd0aCgpIC0gc3RhcnQpOworCisgICAgdWludDMyX3QgaGVhZGVyID0gKih1aW50MzJfdCopKCh1aW50OF90KilmcmFtZS0+ZGF0YSgpICsgZnJhbWUtPnJhbmdlX29mZnNldCgpKTsKKyAgICBoZWFkZXIgPSAoKGhlYWRlciA+PiAyNCkgJiAweGZmKSB8ICgoaGVhZGVyID4+IDgpICYgMHhmZjAwKSB8CisgICAgICAgICAgICAgICAgICAgICgoaGVhZGVyIDw8IDgpICYgMHhmZjAwMDApIHwgKChoZWFkZXIgPDwgMjQpICYgMHhmZjAwMDAwMCk7CisgICAgc2l6ZV90IGZyYW1lX3NpemU7CisgICAgaW50IG91dF9zYW1wbGluZ19yYXRlOworICAgIGludCBvdXRfY2hhbm5lbHM7CisgICAgaW50IG91dF9iaXRyYXRlOworICAgIGlmICghR2V0TVBFR0F1ZGlvRnJhbWVTaXplKGhlYWRlciwgJmZyYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dF9zYW1wbGluZ19yYXRlLCAmb3V0X2NoYW5uZWxzLCAmb3V0X2JpdHJhdGUpKSB7CisgICAgICAgIEFMT0dFKCJNUDMgSGVhZGVyIHJlYWQgZmFpbCEhIik7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorCisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcjsKKyAgICBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIsIGZhbHNlIC8qIG5vbmJsb2NraW5nICovLCBmcmFtZV9zaXplIC8qIHJlcXVlc3RlZCBzaXplICovKTsKKyAgICBidWZmZXItPnNldF9yYW5nZSgwLCBmcmFtZV9zaXplKTsKKworICAgIHVpbnQ4X3QgKmRhdGEgPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+KGJ1ZmZlci0+ZGF0YSgpKTsKKyAgICBBTE9HVigiTVAzIGZyYW1lICV6dSBmcmFtZS0+cmFuZ2VfbGVuZ3RoKCkgJXp1IiwgZnJhbWVfc2l6ZSwgZnJhbWUtPnJhbmdlX2xlbmd0aCgpKTsKKworICAgIGlmIChmcmFtZV9zaXplID4gZnJhbWUtPnJhbmdlX2xlbmd0aCgpKSB7CisgICAgICAgIG1lbWNweShkYXRhLCAodWludDhfdCopKGZyYW1lLT5kYXRhKCkpICsgZnJhbWUtPnJhbmdlX29mZnNldCgpLCBmcmFtZS0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICBzaXplX3Qgc3VtU2l6ZSA9IDA7CisgICAgICAgIHN1bVNpemUgKz0gZnJhbWUtPnJhbmdlX2xlbmd0aCgpOworICAgICAgICBzaXplX3QgbmVlZFNpemUgPSBmcmFtZV9zaXplIC0gZnJhbWUtPnJhbmdlX2xlbmd0aCgpOworICAgICAgICBmcmFtZS0+cmVsZWFzZSgpOworICAgICAgICBtUGVuZGluZ0ZyYW1lcy5lcmFzZShtUGVuZGluZ0ZyYW1lcy5iZWdpbigpKTsKKyAgICAgICAgd2hpbGUgKG1QZW5kaW5nRnJhbWVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IGVyciA9IHJlYWRCbG9jaygpOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOworICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZnJhbWUgPSAqbVBlbmRpbmdGcmFtZXMuYmVnaW4oKTsKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IGZyYW1lLT5yYW5nZV9vZmZzZXQoKTsKKyAgICAgICAgc2l6ZV90IHNpemUgPSBmcmFtZS0+cmFuZ2VfbGVuZ3RoKCk7CisKKyAgICAgICAgLy8gdGhlIG5leHQgYnVmZmVyIGZyYW1lIGlzIG5vdCBlbm91Z2ggdG8gZnVsbGZpbGwgbXAzIGZyYW1lLAorICAgICAgICAvLyB3ZSBoYXZlIHRvIHJlYWQgdW50aWwgbXAzIGZyYW1lIGlzIGNvbXBsZXRlZC4KKyAgICAgICAgd2hpbGUgKHNpemUgPCBuZWVkU2l6ZSkgeworICAgICAgICAgICAgbWVtY3B5KGRhdGEgKyBzdW1TaXplLCAodWludDhfdCopKGZyYW1lLT5kYXRhKCkpICsgb2Zmc2V0LCBzaXplKTsKKyAgICAgICAgICAgIG5lZWRTaXplIC09IHNpemU7CisgICAgICAgICAgICBzdW1TaXplICs9IHNpemU7CisgICAgICAgICAgICBmcmFtZS0+cmVsZWFzZSgpOworICAgICAgICAgICAgbVBlbmRpbmdGcmFtZXMuZXJhc2UobVBlbmRpbmdGcmFtZXMuYmVnaW4oKSk7CisgICAgICAgICAgICB3aGlsZSAobVBlbmRpbmdGcmFtZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IGVyciA9IHJlYWRCbG9jaygpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgY2xlYXJQZW5kaW5nRnJhbWVzKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJhbWUgPSAqbVBlbmRpbmdGcmFtZXMuYmVnaW4oKTsKKyAgICAgICAgICAgIG9mZnNldCA9IGZyYW1lLT5yYW5nZV9vZmZzZXQoKTsKKyAgICAgICAgICAgIHNpemUgPSBmcmFtZS0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgICAgIH0KKyAgICAgICAgbWVtY3B5KGRhdGEgKyBzdW1TaXplLCAodWludDhfdCopKGZyYW1lLT5kYXRhKCkpICsgb2Zmc2V0LCBuZWVkU2l6ZSk7CisgICAgICAgIGZyYW1lLT5zZXRfcmFuZ2Uob2Zmc2V0ICsgbmVlZFNpemUsIHNpemUgLSBuZWVkU2l6ZSk7CisgICAgIH0gZWxzZSB7CisgICAgICAgIHNpemVfdCBvZmZzZXQgPSBmcmFtZS0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgICAgIHNpemVfdCBzaXplID0gZnJhbWUtPnJhbmdlX2xlbmd0aCgpOworICAgICAgICBtZW1jcHkoZGF0YSwgKHVpbnQ4X3QqKShmcmFtZS0+ZGF0YSgpKSArIG9mZnNldCwgZnJhbWVfc2l6ZSk7CisgICAgICAgIGZyYW1lLT5zZXRfcmFuZ2Uob2Zmc2V0ICsgZnJhbWVfc2l6ZSwgc2l6ZSAtIGZyYW1lX3NpemUpOworICAgIH0KKyAgICBpZiAoZnJhbWUtPnJhbmdlX2xlbmd0aCgpIDwgNCkgeworICAgICAgICBmcmFtZS0+cmVsZWFzZSgpOworICAgICAgICBmcmFtZSA9IE5VTEw7CisgICAgICAgIG1QZW5kaW5nRnJhbWVzLmVyYXNlKG1QZW5kaW5nRnJhbWVzLmJlZ2luKCkpOworICAgIH0KKyAgICBBTE9HVigiTWF0cm9za2FTb3VyY2U6OnJlYWQgTVAzIGZyYW1lIGtLZXlUaW1lPSVsbGQsa0tleVRhcmdldFRpbWU9JWxsZCIsCisgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbUN1cnJlbnRUUywgKGxvbmcgbG9uZyl0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChidWZmZXItPm1ldGFfZGF0YSgpLAorICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCBtQ3VycmVudFRTKTsKKyAgICBtQ3VycmVudFRTICs9IChpbnQ2NF90KWZyYW1lX3NpemUgKiA4MDAwbGwgLyBvdXRfYml0cmF0ZTsKKworICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMGxsKQorICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmZmVyLT5tZXRhX2RhdGEoKSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICpvdXQgPSBidWZmZXI7CisgICAgQUxPR1YoIk1hdHJvc2thU291cmNlOjpyZWFkIE1QMywga2V5VGltZT0lbGxkIGZvciBuZXh0IGZyYW1lIiwgKGxvbmcgbG9uZyltQ3VycmVudFRTKTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCittZWRpYV9zdGF0dXNfdCBNYXRyb3NrYVNvdXJjZTo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKICAgICBpbnQ2NF90IHRhcmdldFNhbXBsZVRpbWVVcyA9IC0xbGw7CkBAIC03NzMsNyArMTA0MCw3IEBACiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CiAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKICAgICAgICAgaWYgKG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfRlJBTUVfSU5ERVgpIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIW1FeHRyYWN0b3ItPmlzTGl2ZVN0cmVhbWluZygpKSB7CkBAIC03OTEsNyArMTA1OCw3IEBACiAgICAgfQogCiAgICAgd2hpbGUgKG1QZW5kaW5nRnJhbWVzLmVtcHR5KCkpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVhZEJsb2NrKCk7CisgICAgICAgIG1lZGlhX3N0YXR1c190IGVyciA9IHJlYWRCbG9jaygpOwogCiAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgIGNsZWFyUGVuZGluZ0ZyYW1lcygpOwpAQCAtODAwLDE4ICsxMDY3LDQzIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmZyYW1lID0gKm1QZW5kaW5nRnJhbWVzLmJlZ2luKCk7CisgICAgaWYgKG1UeXBlID09IE1QMykgeworICAgICAgICByZXR1cm4gbXAzRnJhbWVSZWFkKG91dCwgb3B0aW9ucywgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICB9CisKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqZnJhbWUgPSAqbVBlbmRpbmdGcmFtZXMuYmVnaW4oKTsKICAgICBtUGVuZGluZ0ZyYW1lcy5lcmFzZShtUGVuZGluZ0ZyYW1lcy5iZWdpbigpKTsKIAogICAgIGlmICgobVR5cGUgIT0gQVZDICYmIG1UeXBlICE9IEhFVkMpIHx8IG1OQUxTaXplTGVuID09IDApIHsKICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwbGwpIHsKLSAgICAgICAgICAgIGZyYW1lLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoZnJhbWUtPm1ldGFfZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FLCB0YXJnZXRTYW1wbGVUaW1lVXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1UeXBlID09IFBDTSkgeworICAgICAgICAgICAgaW50MzJfdCBiaXRQZXJGcmFtZSA9IDE2OworICAgICAgICAgICAgaW50MzJfdCBiaWdFbmRpYW4gPSAwOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgICAgICAgICAgaWYgKGdldEZvcm1hdChtZXRhKSA9PSBBTUVESUFfT0sgJiYgbWV0YSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFLCAmYml0UGVyRnJhbWUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1BDTV9CSUdfRU5ESUFOLCAmYmlnRW5kaWFuKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobWV0YSk7CisgICAgICAgICAgICBpZiAoYmlnRW5kaWFuID09IDEgJiYgYml0UGVyRnJhbWUgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICAvLyBCaWctZW5kaWFuIC0+IGxpdHRsZS1lbmRpYW4KKyAgICAgICAgICAgICAgICB1aW50MTZfdCAqZHN0RGF0YSA9ICh1aW50MTZfdCAqKWZyYW1lLT5kYXRhKCkgKyBmcmFtZS0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgICAgICAgICAgICAgdWludDE2X3QgKnNyY0RhdGEgPSAodWludDE2X3QgKilmcmFtZS0+ZGF0YSgpICsgZnJhbWUtPnJhbmdlX29mZnNldCgpOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZnJhbWUtPnJhbmdlX2xlbmd0aCgpIC8gMjsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGRzdERhdGFbaV0gPSBudG9ocyhzcmNEYXRhW2ldKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICAqb3V0ID0gZnJhbWU7CiAKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgIH0KIAogICAgIC8vIEVhY2ggaW5wdXQgZnJhbWUgY29udGFpbnMgb25lIG9yIG1vcmUgTkFMIGZyYWdtZW50cywgZWFjaCBmcmFnbWVudApAQCAtODI5LDcgKzExMjEsNyBAQAogICAgIHNpemVfdCBzcmNTaXplID0gZnJhbWUtPnJhbmdlX2xlbmd0aCgpOwogCiAgICAgc2l6ZV90IGRzdFNpemUgPSAwOwotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyID0gTlVMTDsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyID0gTlVMTDsKICAgICB1aW50OF90ICpkc3RQdHIgPSBOVUxMOwogCiAgICAgZm9yIChpbnQzMl90IHBhc3MgPSAwOyBwYXNzIDwgMjsgKytwYXNzKSB7CkBAIC04NTAsNyArMTE0Miw3IEBACiAgICAgICAgICAgICAgICAgZnJhbWUtPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICBmcmFtZSA9IE5VTEw7CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzcmNPZmZzZXQgKyBtTkFMU2l6ZUxlbiArIE5BTHNpemUgPiBzcmNTaXplKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC04NzgsNyArMTE3MCw3IEBACiAgICAgICAgICAgICBmcmFtZS0+cmVsZWFzZSgpOwogICAgICAgICAgICAgZnJhbWUgPSBOVUxMOwogCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAocGFzcyA9PSAwKSB7CkBAIC04ODksMTYgKzExODEsMjAgQEAKICAgICAgICAgICAgICAgICAvLyBlYWNoIDQtYnl0ZSBuYWwgc2l6ZSB3aXRoIGEgNC1ieXRlIHN0YXJ0IGNvZGUKICAgICAgICAgICAgICAgICBidWZmZXIgPSBmcmFtZTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoZHN0U2l6ZSk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsIGZhbHNlIC8qIG5vbmJsb2NraW5nICovLCBkc3RTaXplIC8qIHJlcXVlc3RlZCBzaXplICovKTsKKyAgICAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBkc3RTaXplKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICpmcmFtZU1ldGEgPSBmcmFtZS0+bWV0YV9kYXRhKCk7CiAgICAgICAgICAgICBpbnQ2NF90IHRpbWVVczsKLSAgICAgICAgICAgIENIRUNLKGZyYW1lLT5tZXRhX2RhdGEoKS5maW5kSW50NjQoa0tleVRpbWUsICZ0aW1lVXMpKTsKKyAgICAgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQ2NChmcmFtZU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgJnRpbWVVcykpOwogICAgICAgICAgICAgaW50MzJfdCBpc1N5bmM7Ci0gICAgICAgICAgICBDSEVDSyhmcmFtZS0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlJc1N5bmNGcmFtZSwgJmlzU3luYykpOworICAgICAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKGZyYW1lTWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAmaXNTeW5jKSk7CiAKLSAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7Ci0gICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgaXNTeW5jKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqYnVmTWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmTWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB0aW1lVXMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zk1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgaXNTeW5jKTsKIAogICAgICAgICAgICAgZHN0UHRyID0gKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKTsKICAgICAgICAgfQpAQCAtOTEwLDE4ICsxMjA2LDExNiBAQAogICAgIH0KIAogICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMGxsKSB7Ci0gICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChidWZmZXItPm1ldGFfZGF0YSgpLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CiAgICAgfQogCiAgICAgKm91dCA9IGJ1ZmZlcjsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1NYXRyb3NrYUV4dHJhY3Rvcjo6TWF0cm9za2FFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK2VudW0gV2F2ZUlEIHsKKyAgICBNS1ZfUklGRl9XQVZFX0ZPUk1BVF9QQ00gPSAweDAwMDEsCisgICAgTUtWX1JJRkZfV0FWRV9GT1JNQVRfQURQQ01fbXMgPSAweDAwMDIsCisgICAgTUtWX1JJRkZfV0FWRV9GT1JNQVRfQURQQ01faW1hX3dhdiA9IDB4MDAxMSwKKyAgICBNS1ZfUklGRl9XQVZFX0ZPUk1BVF9NUEVHTDEyID0gMHgwMDUwLAorICAgIE1LVl9SSUZGX1dBVkVfRk9STUFUX01QRUdMMyA9IDB4MDA1NSwKKyAgICBNS1ZfUklGRl9XQVZFX0ZPUk1BVF9XTUFWMSA9IDB4MDE2MCwKKyAgICBNS1ZfUklGRl9XQVZFX0ZPUk1BVF9XTUFWMiA9IDB4MDE2MSwKK307CisKK3N0YXRpYyBjb25zdCBjaGFyICpNS1ZXYXZlMk1JTUUodWludDE2X3QgaWQpIHsKKyAgICBzd2l0Y2ggKGlkKSB7CisgICAgICAgIGNhc2UgIE1LVl9SSUZGX1dBVkVfRk9STUFUX01QRUdMMTI6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JSTsKKworICAgICAgICBjYXNlICBNS1ZfUklGRl9XQVZFX0ZPUk1BVF9NUEVHTDM6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRzsKKworICAgICAgICBjYXNlIE1LVl9SSUZGX1dBVkVfRk9STUFUX1BDTToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19SQVc7CisKKyAgICAgICAgY2FzZSBNS1ZfUklGRl9XQVZFX0ZPUk1BVF9BRFBDTV9tczoKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19NU19BRFBDTTsKKyAgICAgICAgY2FzZSBNS1ZfUklGRl9XQVZFX0ZPUk1BVF9BRFBDTV9pbWFfd2F2OgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX0RWSV9JTUFfQURQQ007CisKKyAgICAgICAgY2FzZSBNS1ZfUklGRl9XQVZFX0ZPUk1BVF9XTUFWMToKKyAgICAgICAgY2FzZSBNS1ZfUklGRl9XQVZFX0ZPUk1BVF9XTUFWMjoKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19XTUE7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygidW5rbm93biB3YXZlICV4IiwgaWQpOworICAgICAgICAgICAgcmV0dXJuICIiOworICAgIH07Cit9CisKK3N0YXRpYyBib29sIGlzTWt2QXVkaW9Dc2RTaXplT0soY29uc3QgY2hhciogbWltZSwgc2l6ZV90IGNzZFNpemUpIHsKKyAgICBpZiAoKCFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVNfQURQQ00pICYmIGNzZFNpemUgPCA1MCkgfHwKKyAgICAgICAgKCFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRFZJX0lNQV9BRFBDTSkgJiYgY3NkU2l6ZSA8IDIwKSB8fAorICAgICAgICAoIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19XTUEpICYmIGNzZFNpemUgPCAyOCkgfHwKKyAgICAgICAgKCFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRykgJiYgY3NkU2l6ZSA8IDMwKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCisvLyB0cmFucyBhbGwgRk9VUkNDICB0byBsb3dlciBjaGFyCitzdGF0aWMgdWludDMyX3QgRm91ckNDdG9Mb3dlcih1aW50MzJfdCBmb3VyY2MpIHsKKyAgICB1aW50OF90IGNoXzEgPSB0b2xvd2VyKChmb3VyY2MgPj4gMjQpICYgMHhmZik7CisgICAgdWludDhfdCBjaF8yID0gdG9sb3dlcigoZm91cmNjID4+IDE2KSAmIDB4ZmYpOworICAgIHVpbnQ4X3QgY2hfMyA9IHRvbG93ZXIoKGZvdXJjYyA+PiA4KSAmIDB4ZmYpOworICAgIHVpbnQ4X3QgY2hfNCA9IHRvbG93ZXIoKGZvdXJjYykgJiAweGZmKTsKKyAgICB1aW50MzJfdCBmb3VyY2Nfb3V0ID0gY2hfMSA8PCAyNCB8IGNoXzIgPDwgMTYgfCBjaF8zIDw8IDggfCBjaF80OworCisgICAgcmV0dXJuIGZvdXJjY19vdXQ7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpNS1ZGb3VyQ0MyTUlNRSh1aW50MzJfdCBmb3VyY2MpIHsKKyAgICBBTE9HVigiTUtWRm91ckNDMk1JTUUgZm91cmNjIDB4JTguOHgiLCBmb3VyY2MpOworICAgIHVpbnQzMl90IGxvd2VyRm91cmNjID0gRm91ckNDdG9Mb3dlcihmb3VyY2MpOworICAgIHN3aXRjaCAobG93ZXJGb3VyY2MpIHsKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1wNHYiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKKworICAgICAgICBjYXNlIEZPVVJDQygiczI2MyIpOgorICAgICAgICBjYXNlIEZPVVJDQygiaDI2MyIpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjM7CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoImF2YzEiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImgyNjQiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19BVkM7CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1wZzIiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMjsKKworICAgICAgICBjYXNlIEZPVVJDQygieHZpZCIpOgorICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX1ZJREVPX1hWSUQ7CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoImRpdngiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImR4NTAiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19ESVZYOworCisgICAgICAgIGNhc2UgRk9VUkNDKCJkaXYzIik6CisgICAgICAgIGNhc2UgRk9VUkNDKCJkaXY0Iik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fRElWWDM7CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1qcGciKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIm1wcGciKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19NSlBFRzsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY2hhciBmb3VyY2NTdHJpbmdbNV07CisgICAgICAgICAgICBNYWtlRm91ckNDU3RyaW5nKGZvdXJjYywgZm91cmNjU3RyaW5nKTsKKyAgICAgICAgICAgIEFMT0dXKCJta3YgdW5zdXBwb3J0IGZvdXJjYyAlcyIsIGZvdXJjY1N0cmluZyk7CisgICAgICAgICAgICByZXR1cm4gIiI7CisgICAgfQorfQorCisKK01hdHJvc2thRXh0cmFjdG9yOjpNYXRyb3NrYUV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbVJlYWRlcihuZXcgRGF0YVNvdXJjZUJhc2VSZWFkZXIobURhdGFTb3VyY2UpKSwKICAgICAgIG1TZWdtZW50KE5VTEwpLApAQCAtOTUzLDE3ICsxMzQ3LDU2IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICAvLyBmcm9tIG1rdnBhcnNlcjo6U2VnbWVudDo6TG9hZCgpLCBidXQgc3RvcCBhdCBmaXJzdCBjbHVzdGVyCi0gICAgcmV0ID0gbVNlZ21lbnQtPlBhcnNlSGVhZGVycygpOwotICAgIGlmIChyZXQgPT0gMCkgewotICAgICAgICBsb25nIGxlbjsKLSAgICAgICAgcmV0ID0gbVNlZ21lbnQtPkxvYWRDbHVzdGVyKHBvcywgbGVuKTsKLSAgICAgICAgaWYgKHJldCA+PSAxKSB7Ci0gICAgICAgICAgICAvLyBubyBtb3JlIGNsdXN0ZXJzCi0gICAgICAgICAgICByZXQgPSAwOworICAgIGlmIChtSXNMaXZlU3RyZWFtaW5nKSB7CisgICAgICAgIC8vIGZyb20gbWt2cGFyc2VyOjpTZWdtZW50OjpMb2FkKCksIGJ1dCBzdG9wIGF0IGZpcnN0IGNsdXN0ZXIKKyAgICAgICAgcmV0ID0gbVNlZ21lbnQtPlBhcnNlSGVhZGVycygpOworICAgICAgICBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIGxvbmcgbGVuOworICAgICAgICAgICAgcmV0ID0gbVNlZ21lbnQtPkxvYWRDbHVzdGVyKHBvcywgbGVuKTsKKyAgICAgICAgICAgIGlmIChyZXQgPj0gMSkgeworICAgICAgICAgICAgICAgIC8vIG5vIG1vcmUgY2x1c3RlcnMKKyAgICAgICAgICAgICAgICByZXQgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHJldCA+IDApIHsKKyAgICAgICAgICAgIHJldCA9IG1rdnBhcnNlcjo6RV9CVUZGRVJfTk9UX0ZVTEw7CiAgICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHJldCA+IDApIHsKLSAgICAgICAgcmV0ID0gbWt2cGFyc2VyOjpFX0JVRkZFUl9OT1RfRlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBtU2VnbWVudC0+UGFyc2VIZWFkZXJzKCk7CisgICAgICAgIGlmIChyZXQgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiU2VnbWVudCBwYXJzZSBoZWFkZXIgcmV0dXJuIGZhaWwgJWxsZCIsIHJldCk7CisgICAgICAgICAgICBkZWxldGUgbVNlZ21lbnQ7CisgICAgICAgICAgICBtU2VnbWVudCA9IE5VTEw7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAocmV0ID09IDApIHsKKyAgICAgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6Q3VlcyogbUN1ZXMgPSBtU2VnbWVudC0+R2V0Q3VlcygpOworICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpTZWVrSGVhZCogbVNIID0gbVNlZ21lbnQtPkdldFNlZWtIZWFkKCk7CisgICAgICAgICAgICBpZiAoKG1DdWVzID09IE5VTEwpICYmIChtU0ggIT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgY291bnQgPSBtU0gtPkdldENvdW50KCk7CisgICAgICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpTZWVrSGVhZDo6RW50cnkqIG1FbnRyeTsKKyAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7IGluZGV4KyspIHsKKyAgICAgICAgICAgICAgICAgICAgbUVudHJ5ID0gbVNILT5HZXRFbnRyeShpbmRleCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtRW50cnktPmlkID09IGxpYndlYm06OmtNa3ZDdWVzKSB7IC8vIEN1ZXMgSUQKKyAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBsb25nIHBvczsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZWdtZW50LT5QYXJzZUN1ZXMobUVudHJ5LT5wb3MsIHBvcywgbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DdWVzID0gbVNlZ21lbnQtPkdldEN1ZXMoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJmaW5kIGN1ZSBkYXRhIGJ5IHNlZWtoZWFkIik7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1DdWVzKSB7CisgICAgICAgICAgICAgICAgbG9uZyBsZW47CisgICAgICAgICAgICAgICAgcmV0ID0gbVNlZ21lbnQtPkxvYWRDbHVzdGVyKHBvcywgbGVuKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiaGFzIEN1ZSBkYXRhLCBDbHVzdGVyIG51bT0lbGQiLCBtU2VnbWVudC0+R2V0Q291bnQoKSk7CisgICAgICAgICAgICB9IGVsc2UgIHsKKyAgICAgICAgICAgICAgICBsb25nIHN0YXR1c19Mb2FkID0gbVNlZ21lbnQtPkxvYWQoKTsKKyAgICAgICAgICAgICAgICBBTE9HVygibm8gQ3VlIGRhdGEsU2VnbWVudCBMb2FkIHN0YXR1czolbGQiLHN0YXR1c19Mb2FkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChyZXQgPiAwKSB7CisgICAgICAgICAgICByZXQgPSBta3ZwYXJzZXI6OkVfQlVGRkVSX05PVF9GVUxMOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKHJldCA8IDApIHsKQEAgLTk5NCwxMyArMTQyNywyMiBAQAogCiAgICAgZGVsZXRlIG1SZWFkZXI7CiAgICAgbVJlYWRlciA9IE5VTEw7CisKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1UcmFja3Muc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdChpKTsKKyAgICAgICAgaWYgKGluZm8tPm1NZXRhKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGluZm8tPm1NZXRhKTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogc2l6ZV90IE1hdHJvc2thRXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKICAgICByZXR1cm4gbVRyYWNrcy5zaXplKCk7CiB9CiAKLU1lZGlhVHJhY2sgKk1hdHJvc2thRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXIgKk1hdHJvc2thRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKICAgICBpZiAoaW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTAwOCwxMSArMTQ1MCwxMSBAQAogICAgIHJldHVybiBuZXcgTWF0cm9za2FTb3VyY2UodGhpcywgaW5kZXgpOwogfQogCi1zdGF0dXNfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncykgewogICAgIGlmIChpbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIGlmICgoZmxhZ3MgJiBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhKSAmJiAhbUV4dHJhY3RlZFRodW1ibmFpbHMKQEAgLTEwMjEsOCArMTQ2Myw3IEBACiAgICAgICAgIG1FeHRyYWN0ZWRUaHVtYm5haWxzID0gdHJ1ZTsKICAgICB9CiAKLSAgICBtZXRhID0gbVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1NZXRhOwotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbVRyYWNrcy5pdGVtQXQoaW5kZXgpLm1NZXRhKTsKIH0KIAogYm9vbCBNYXRyb3NrYUV4dHJhY3Rvcjo6aXNMaXZlU3RyZWFtaW5nKCkgY29uc3QgewpAQCAtMTA1Nyw3ICsxNDk4LDcgQEAKIH0KIAogc3RhdGljIHZvaWQgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBib29sIGlzQXVkaW8sIGNvbnN0IHZvaWQgKnByaXYsIHNpemVfdCBwcml2U2l6ZSkgewogCiAgICAgaW50IHByaXZTaXplQnl0ZXNSZXF1aXJlZCA9IGJ5dGVzRm9yU2l6ZShwcml2U2l6ZSk7CkBAIC0xMDg1LDE0ICsxNTI2LDE0IEBACiAgICAgc3RvcmVTaXplKGVzZHMsIGlkeCwgcHJpdlNpemUpOwogICAgIG1lbWNweShlc2RzICsgaWR4LCBwcml2LCBwcml2U2l6ZSk7CiAKLSAgICBtZXRhLnNldERhdGEoa0tleUVTRFMsIDAsIGVzZHMsIGVzZHNTaXplKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIHByaXYsIHByaXZTaXplKTsKIAogICAgIGRlbGV0ZVtdIGVzZHM7CiAgICAgZXNkcyA9IE5VTEw7CiB9CiAKIHN0YXR1c190IGFkZFZvcmJpc0NvZGVjSW5mbygKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIGNvbnN0IHZvaWQgKl9jb2RlY1ByaXZhdGUsIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplKSB7CiAgICAgLy8gaGV4ZHVtcChfY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKIApAQCAtMTE1MCw3ICsxNTkxLDggQEAKICAgICBpZiAoY29kZWNQcml2YXRlW29mZnNldF0gIT0gMHgwMSkgewogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KLSAgICBtZXRhLnNldERhdGEoa0tleVZvcmJpc0luZm8sIDAsICZjb2RlY1ByaXZhdGVbb2Zmc2V0XSwgbGVuMSk7CisgICAgLy8gZm9ybWVybHkga0tleVZvcmJpc0luZm8KKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsICZjb2RlY1ByaXZhdGVbb2Zmc2V0XSwgbGVuMSk7CiAKICAgICBvZmZzZXQgKz0gbGVuMTsKICAgICBpZiAoY29kZWNQcml2YXRlW29mZnNldF0gIT0gMHgwMykgewpAQCAtMTE2MiwxOSArMTYwNCwyMCBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIG1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgIGtLZXlWb3JiaXNCb29rcywgMCwgJmNvZGVjUHJpdmF0ZVtvZmZzZXRdLAotICAgICAgICAgICAgY29kZWNQcml2YXRlU2l6ZSAtIG9mZnNldCk7CisgICAgLy8gZm9ybWVybHkga0tleVZvcmJpc0Jvb2tzCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8xLAorICAgICAgICAgICAgJmNvZGVjUHJpdmF0ZVtvZmZzZXRdLCBjb2RlY1ByaXZhdGVTaXplIC0gb2Zmc2V0KTsKIAogICAgIHJldHVybiBPSzsKIH0KIAogc3RhdGljIHN0YXR1c190IGFkZEZsYWNNZXRhZGF0YSgKLSAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhLAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIGNvbnN0IHZvaWQgKmNvZGVjUHJpdmF0ZSwgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemUpIHsKICAgICAvLyBoZXhkdW1wKGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CiAKLSAgICBtZXRhLnNldERhdGEoa0tleUZsYWNNZXRhZGF0YSwgMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAvLyBmb3JtZXJseSBrS2V5RmxhY01ldGFkYXRhCisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwogCiAgICAgaW50MzJfdCBtYXhJbnB1dFNpemUgPSA2NCA8PCAxMDsKICAgICBGTEFDRGVjb2RlciAqZmxhY0RlY29kZXIgPSBGTEFDRGVjb2Rlcjo6Q3JlYXRlKCk7CkBAIC0xMTk2LDcgKzE2MzksNyBAQAogICAgICAgICAgICAgICAgICogc3RyZWFtSW5mby5tYXhfYmxvY2tzaXplICogc3RyZWFtSW5mby5jaGFubmVsczsKICAgICAgICAgfQogICAgIH0KLSAgICBtZXRhLnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIG1heElucHV0U2l6ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIG1heElucHV0U2l6ZSk7CiAKICAgICBkZWxldGUgZmxhY0RlY29kZXI7CiAgICAgcmV0dXJuIE9LOwpAQCAtMTIyNSwxMCArMTY2OCw5MyBAQAogICAgIH0KIAogICAgIC8vIE92ZXJyaWRlIHRoZSBzeW50aGVzaXplZCBuYWwgbGVuZ3RoIHNpemUsIHdoaWNoIGlzIGFyYml0cmFyeQotICAgIHRyYWNrSW5mby0+bU1ldGEuc2V0SW50MzIoa0tleU5hbExlbmd0aFNpemUsIDApOworICAgIHRyYWNrSW5mby0+bU5hbExlbmd0aFNpemUgPSAwOwogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OnN5bnRoZXNpemVNUEVHMihUcmFja0luZm8gKnRyYWNrSW5mbywgc2l6ZV90IGluZGV4KSB7CisgICAgQUxPR1YoInN5bnRoZXNpemVNUEVHMiIpOworICAgIEJsb2NrSXRlcmF0b3IgaXRlcih0aGlzLCB0cmFja0luZm8tPm1UcmFja051bSwgaW5kZXgpOworICAgIGlmIChpdGVyLmVvcygpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jayAqYmxvY2sgPSBpdGVyLmJsb2NrKCk7CisgICAgaWYgKGJsb2NrLT5HZXRGcmFtZUNvdW50KCkgPD0gMCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIGNvbnN0IG1rdnBhcnNlcjo6QmxvY2s6OkZyYW1lICZmcmFtZSA9IGJsb2NrLT5HZXRGcmFtZSgwKTsKKyAgICBhdXRvIHRtcERhdGEgPSBoZWFwYnVmZmVyPHVuc2lnbmVkIGNoYXI+KGZyYW1lLmxlbik7CisgICAgbG9uZyBuID0gZnJhbWUuUmVhZChtUmVhZGVyLCB0bXBEYXRhLmdldCgpKTsKKyAgICBpZiAobiAhPSAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgc2l6ZV90IGhlYWRlcl9zdGFydCA9IDA7CisgICAgc2l6ZV90IGhlYWRlcl9sZW50aCA9IDA7CisgICAgZm9yIChoZWFkZXJfc3RhcnQgPSAwOyBoZWFkZXJfc3RhcnQgPCBmcmFtZS5sZW4gLSA0OyBoZWFkZXJfc3RhcnQrKykgeworICAgICAgICBpZiAobnRvaGwoMHgwMDAwMDFiMykgPT0gKih1aW50MzJfdCopKCh1aW50OF90Kil0bXBEYXRhLmdldCgpICsgaGVhZGVyX3N0YXJ0KSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgYm9vbCBpc0NvbXBsZXRlX2NzZCA9IGZhbHNlOworICAgIGZvciAoaGVhZGVyX2xlbnRoID0gMDsgaGVhZGVyX2xlbnRoIDwgZnJhbWUubGVuIC0gNCAtIGhlYWRlcl9zdGFydDsgaGVhZGVyX2xlbnRoKyspIHsKKyAgICAgICAgaWYgKG50b2hsKDB4MDAwMDAxYjgpID09ICoodWludDMyX3QqKSgodWludDhfdCopdG1wRGF0YS5nZXQoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGhlYWRlcl9zdGFydCArIGhlYWRlcl9sZW50aCkpIHsKKyAgICAgICAgICAgIGlzQ29tcGxldGVfY3NkID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmICghaXNDb21wbGV0ZV9jc2QpIHsKKyAgICAgICAgQUxPR0UoImNhbid0IHBhcnNlIGNvbXBsZXRlIGNzZCBmb3IgTVBFRzIhIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorICAgIGFkZEVTRFNGcm9tQ29kZWNQcml2YXRlKHRyYWNrSW5mby0+bU1ldGEsIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKSh0bXBEYXRhLmdldCgpKSArIGhlYWRlcl9zdGFydCwgaGVhZGVyX2xlbnRoKTsKKworICAgIHJldHVybiBPSzsKKworfQorCitzdGF0dXNfdCBNYXRyb3NrYUV4dHJhY3Rvcjo6c3ludGhlc2l6ZU1QRUc0KFRyYWNrSW5mbyAqdHJhY2tJbmZvLCBzaXplX3QgaW5kZXgpIHsKKyAgICBBTE9HVigic3ludGhlc2l6ZU1QRUc0Iik7CisgICAgQmxvY2tJdGVyYXRvciBpdGVyKHRoaXMsIHRyYWNrSW5mby0+bVRyYWNrTnVtLCBpbmRleCk7CisgICAgaWYgKGl0ZXIuZW9zKCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjb25zdCBta3ZwYXJzZXI6OkJsb2NrICpibG9jayA9IGl0ZXIuYmxvY2soKTsKKyAgICBpZiAoYmxvY2stPkdldEZyYW1lQ291bnQoKSA8PSAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgY29uc3QgbWt2cGFyc2VyOjpCbG9jazo6RnJhbWUgJmZyYW1lID0gYmxvY2stPkdldEZyYW1lKDApOworICAgIGF1dG8gdG1wRGF0YSA9IGhlYXBidWZmZXI8dW5zaWduZWQgY2hhcj4oZnJhbWUubGVuKTsKKyAgICBsb25nIG4gPSBmcmFtZS5SZWFkKG1SZWFkZXIsIHRtcERhdGEuZ2V0KCkpOworICAgIGlmIChuICE9IDApIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICAgc2l6ZV90IHZvc2VuZDsKKyAgICAgYm9vbCBpc0NvbXBsZXRlX2NzZCA9IGZhbHNlOworICAgICBmb3IgKHZvc2VuZCA9IDA7IChsb25nKXZvc2VuZCA8IGZyYW1lLmxlbiAtIDQ7IHZvc2VuZCsrKSB7CisgICAgICAgICBpZiAobnRvaGwoMHgwMDAwMDFiNikgPT0gKih1aW50MzJfdCopKCh1aW50OF90Kil0bXBEYXRhLmdldCgpICsgdm9zZW5kKSkgeworICAgICAgICAgICAgIGlzQ29tcGxldGVfY3NkID0gdHJ1ZTsKKyAgICAgICAgICAgICBicmVhazsgIC8vIFNlbmQgVk9TIHVudGlsIFZPUAorICAgICAgICAgfQorICAgICB9CisgICAgIGlmICghaXNDb21wbGV0ZV9jc2QpIHsKKyAgICAgICAgIEFMT0dFKCJjYW4ndCBwYXJzZSBjb21wbGV0ZSBjc2QgZm9yIE1QRUc0ISIpOworICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgfQorICAgICBhZGRFU0RTRnJvbUNvZGVjUHJpdmF0ZSh0cmFja0luZm8tPm1NZXRhLCBmYWxzZSwgdG1wRGF0YS5nZXQoKSwgdm9zZW5kKTsKKworICAgIHJldHVybiBPSzsKKworfQorCisKIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkSW50MzJDb2xvdXJWYWx1ZShsb25nIGxvbmcgdmFsdWUpIHsKICAgICByZXR1cm4gdmFsdWUgIT0gbWt2cGFyc2VyOjpDb2xvdXI6OmtWYWx1ZU5vdFByZXNlbnQKICAgICAgICAgICAgICYmIHZhbHVlID49IElOVDMyX01JTgpAQCAtMTI0Nyw3ICsxNzczLDcgQEAKIH0KIAogdm9pZCBNYXRyb3NrYUV4dHJhY3Rvcjo6Z2V0Q29sb3JJbmZvcm1hdGlvbigKLSAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpWaWRlb1RyYWNrICp2dHJhY2ssIE1ldGFEYXRhQmFzZSAmbWV0YSkgeworICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKnZ0cmFjaywgQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgY29uc3QgbWt2cGFyc2VyOjpDb2xvdXIgKmNvbG9yID0gdnRyYWNrLT5HZXRDb2xvdXIoKTsKICAgICBpZiAoY29sb3IgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CkBAIC0xMjU2LDcgKzE3ODIsNyBAQAogICAgIC8vIENvbG9yIEFzcGVjdHMKICAgICB7CiAgICAgICAgIGludDMyX3QgcHJpbWFyaWVzID0gMjsgLy8gSVNPIHVuc3BlY2lmaWVkCi0gICAgICAgIGludDMyX3QgdHJhbnNmZXIgPSAyOyAvLyBJU08gdW5zcGVjaWZpZWQKKyAgICAgICAgaW50MzJfdCBpc290cmFuc2ZlciA9IDI7IC8vIElTTyB1bnNwZWNpZmllZAogICAgICAgICBpbnQzMl90IGNvZWZmcyA9IDI7IC8vIElTTyB1bnNwZWNpZmllZAogICAgICAgICBib29sIGZ1bGxSYW5nZSA9IGZhbHNlOyAvLyBkZWZhdWx0CiAgICAgICAgIGJvb2wgcmFuZ2VTcGVjaWZpZWQgPSBmYWxzZTsKQEAgLTEyNjUsNyArMTc5MSw3IEBACiAgICAgICAgICAgICBwcmltYXJpZXMgPSBjb2xvci0+cHJpbWFyaWVzOwogICAgICAgICB9CiAgICAgICAgIGlmIChpc1ZhbGlkSW50MzJDb2xvdXJWYWx1ZShjb2xvci0+dHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzKSkgewotICAgICAgICAgICAgdHJhbnNmZXIgPSBjb2xvci0+dHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzOworICAgICAgICAgICAgaXNvdHJhbnNmZXIgPSBjb2xvci0+dHJhbnNmZXJfY2hhcmFjdGVyaXN0aWNzOwogICAgICAgICB9CiAgICAgICAgIGlmIChpc1ZhbGlkSW50MzJDb2xvdXJWYWx1ZShjb2xvci0+bWF0cml4X2NvZWZmaWNpZW50cykpIHsKICAgICAgICAgICAgIGNvZWZmcyA9IGNvbG9yLT5tYXRyaXhfY29lZmZpY2llbnRzOwpAQCAtMTI3OCwxNCArMTgwNCwyMSBAQAogICAgICAgICAgICAgcmFuZ2VTcGVjaWZpZWQgPSB0cnVlOwogICAgICAgICB9CiAKLSAgICAgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHM7Ci0gICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKLSAgICAgICAgICAgICAgICBwcmltYXJpZXMsIHRyYW5zZmVyLCBjb2VmZnMsIGZ1bGxSYW5nZSwgYXNwZWN0cyk7Ci0gICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUNvbG9yUHJpbWFyaWVzLCBhc3BlY3RzLm1QcmltYXJpZXMpOwotICAgICAgICBtZXRhLnNldEludDMyKGtLZXlUcmFuc2ZlckZ1bmN0aW9uLCBhc3BlY3RzLm1UcmFuc2Zlcik7Ci0gICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUNvbG9yTWF0cml4LCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMpOwotICAgICAgICBtZXRhLnNldEludDMyKAotICAgICAgICAgICAgICAgIGtLZXlDb2xvclJhbmdlLCByYW5nZVNwZWNpZmllZCA/IGFzcGVjdHMubVJhbmdlIDogQ29sb3JBc3BlY3RzOjpSYW5nZVVuc3BlY2lmaWVkKTsKKyAgICAgICAgaW50MzJfdCByYW5nZSA9IDA7CisgICAgICAgIGludDMyX3Qgc3RhbmRhcmQgPSAwOworICAgICAgICBpbnQzMl90IHRyYW5zZmVyID0gMDsKKyAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvUGxhdGZvcm1Bc3BlY3RzKAorICAgICAgICAgICAgICAgIHByaW1hcmllcywgaXNvdHJhbnNmZXIsIGNvZWZmcywgZnVsbFJhbmdlLAorICAgICAgICAgICAgICAgICZyYW5nZSwgJnN0YW5kYXJkLCAmdHJhbnNmZXIpOworICAgICAgICBpZiAocmFuZ2UgIT0gMCkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfUkFOR0UsIHJhbmdlKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhbmRhcmQgIT0gMCkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQsIHN0YW5kYXJkKTsKKyAgICAgICAgfQorICAgICAgICBpZiAodHJhbnNmZXIgIT0gMCkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfVFJBTlNGRVIsIHRyYW5zZmVyKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIC8vIEhEUiBTdGF0aWMgSW5mbwpAQCAtMTMyOSwyOCArMTg2MiwyOSBAQAogICAgICAgICAvLyBPbmx5IGFkdmVydGlzZSBzdGF0aWMgaW5mbyBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIGdyb3VwcyBoYXZlIGJlZW4gc3BlY2lmaWVkLgogICAgICAgICBpZiAobWVtY21wKCZpbmZvLCAmbnVsbEluZm8sIHNpemVvZihpbmZvKSkgIT0gMCkgewogICAgICAgICAgICAgaW5mby5tSUQgPSBIRFJTdGF0aWNJbmZvOjprVHlwZTE7Ci0gICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUhkclN0YXRpY0luZm8sICdoZHJTJywgJmluZm8sIHNpemVvZihpbmZvKSk7CisgICAgICAgICAgICBDb2xvclV0aWxzOjpzZXRIRFJTdGF0aWNJbmZvSW50b0FNZWRpYUZvcm1hdChpbmZvLCBtZXRhKTsKICAgICAgICAgfQogICAgIH0KIH0KIAogc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmluaXRUcmFja0luZm8oCi0gICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sgKnRyYWNrLCBNZXRhRGF0YUJhc2UgJm1ldGEsIFRyYWNrSW5mbyAqdHJhY2tJbmZvKSB7CisgICAgICAgIGNvbnN0IG1rdnBhcnNlcjo6VHJhY2sgKnRyYWNrLCBBTWVkaWFGb3JtYXQgKm1ldGEsIFRyYWNrSW5mbyAqdHJhY2tJbmZvKSB7CiAgICAgdHJhY2tJbmZvLT5tVHJhY2tOdW0gPSB0cmFjay0+R2V0TnVtYmVyKCk7CiAgICAgdHJhY2tJbmZvLT5tTWV0YSA9IG1ldGE7CiAgICAgdHJhY2tJbmZvLT5tRXh0cmFjdG9yID0gdGhpczsKICAgICB0cmFja0luZm8tPm1FbmNyeXB0ZWQgPSBmYWxzZTsKICAgICB0cmFja0luZm8tPm1IZWFkZXIgPSBOVUxMOwogICAgIHRyYWNrSW5mby0+bUhlYWRlckxlbiA9IDA7CisgICAgdHJhY2tJbmZvLT5tTmFsTGVuZ3RoU2l6ZSA9IC0xOwogCiAgICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHRyYWNrLT5HZXRDb250ZW50RW5jb2RpbmdDb3VudCgpOyBpKyspIHsKICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpDb250ZW50RW5jb2RpbmcgKmVuY29kaW5nID0gdHJhY2stPkdldENvbnRlbnRFbmNvZGluZ0J5SW5kZXgoaSk7Ci0gICAgICAgIGZvcihzaXplX3QgaiA9IDA7IGogPCBlbmNvZGluZy0+R2V0RW5jcnlwdGlvbkNvdW50KCk7IGorKykgeworICAgICAgICBpZiAoZW5jb2RpbmctPkdldEVuY3J5cHRpb25Db3VudCgpID4gMCkgewogICAgICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpDb250ZW50RW5jb2Rpbmc6OkNvbnRlbnRFbmNyeXB0aW9uICplbmNyeXB0aW9uOwotICAgICAgICAgICAgZW5jcnlwdGlvbiA9IGVuY29kaW5nLT5HZXRFbmNyeXB0aW9uQnlJbmRleChqKTsKLSAgICAgICAgICAgIHRyYWNrSW5mby0+bU1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAwLCBlbmNyeXB0aW9uLT5rZXlfaWQsIGVuY3J5cHRpb24tPmtleV9pZF9sZW4pOworICAgICAgICAgICAgZW5jcnlwdGlvbiA9IGVuY29kaW5nLT5HZXRFbmNyeXB0aW9uQnlJbmRleCgwKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIodHJhY2tJbmZvLT5tTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLCBlbmNyeXB0aW9uLT5rZXlfaWQsIGVuY3J5cHRpb24tPmtleV9pZF9sZW4pOwogICAgICAgICAgICAgdHJhY2tJbmZvLT5tRW5jcnlwdGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgZm9yKHNpemVfdCBqID0gMDsgaiA8IGVuY29kaW5nLT5HZXRDb21wcmVzc2lvbkNvdW50KCk7IGorKykgewpAQCAtMTM3Myw2ICsxOTA3LDggQEAKIHZvaWQgTWF0cm9za2FFeHRyYWN0b3I6OmFkZFRyYWNrcygpIHsKICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrcyAqdHJhY2tzID0gbVNlZ21lbnQtPkdldFRyYWNrcygpOwogCisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gbnVsbHB0cjsKKwogICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCB0cmFja3MtPkdldFRyYWNrc0NvdW50KCk7ICsraW5kZXgpIHsKICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayAqdHJhY2sgPSB0cmFja3MtPkdldFRyYWNrQnlJbmRleChpbmRleCk7CiAKQEAgLTEzOTcsOSArMTkzMywxNiBAQAogCiAgICAgICAgIGVudW0geyBWSURFT19UUkFDSyA9IDEsIEFVRElPX1RSQUNLID0gMiB9OwogCi0gICAgICAgIE1ldGFEYXRhQmFzZSBtZXRhOworICAgICAgICBpZiAobWV0YSkgeworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgfQogCiAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOworICAgICAgICBpbnQzMl90IG5hbFNpemUgPSAtMTsKKworICAgICAgICBib29sIGlzU2V0Q3NkRnJvbTFzdEZyYW1lID0gZmFsc2U7CiAKICAgICAgICAgc3dpdGNoICh0cmFjay0+R2V0VHlwZSgpKSB7CiAgICAgICAgICAgICBjYXNlIFZJREVPX1RSQUNLOgpAQCAtMTQwOCwzNyArMTk1MSw5NSBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKj4odHJhY2spOwogCiAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoIlZfTVBFRzQvSVNPL0FWQyIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5QVZDQywgMCwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiA0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuYWxTaXplID0gMSArIChjb2RlY1ByaXZhdGVbNF0gJiAzKTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiVl9NUEVHSC9JU08vSEVWQyIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQyk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlY1ByaXZhdGVTaXplID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlY1ByaXZhdGVTaXplID4gMTQgKyA3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFsU2l6ZSA9IDEgKyAoY29kZWNQcml2YXRlWzE0ICsgN10gJiAzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJIRVZDIGlzIGRldGVjdGVkLCBidXQgZG9lcyBub3QgaGF2ZSBjb25maWd1cmF0aW9uLiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlZfTVBFRzQvSVNPL0FTUCIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQpOwogICAgICAgICAgICAgICAgICAgICAgICAgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIGZhbHNlLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzIGlzIGRldGVjdGVkLCBidXQgZG9lcyBub3QgaGF2ZSBjb25maWd1cmF0aW9uLiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjSUQpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICBpc1NldENzZEZyb20xc3RGcmFtZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlZfVlA4IiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fVlA4KTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX1ZQOSIsIGNvZGVjSUQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoY29kZWNQcml2YXRlU2l6ZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAvLyAnY3NkLTAnIGZvciBWUDkgaXMgdGhlIEJsb2Igb2YgQ29kZWMgUHJpdmF0ZSBkYXRhIGFzCiAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lmaWVkIGluIGh0dHA6Ly93d3cud2VibXByb2plY3Qub3JnL3ZwOS9wcm9maWxlcy8uCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VnA5Q29kZWNQcml2YXRlLCAwLCBjb2RlY1ByaXZhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIlZfQVYxIiwgY29kZWNJRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChjb2RlY1ByaXZhdGVTaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gJ2NzZC0wJyBmb3IgQVYxIGlzIHRoZSBCbG9iIG9mIENvZGVjIFByaXZhdGUgZGF0YSBhcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3BlY2lmaWVkIGluIGh0dHBzOi8vYW9tZWRpYWNvZGVjLmdpdGh1Yi5pby9hdjEtaXNvYm1mZi8uCisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX01QRUcyIiwgY29kZWNJRCkgfHwgIXN0cmNtcCgiVl9NUEVHMSIsIGNvZGVjSUQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUobWV0YSwgZmFsc2UsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJObyBzcGVjaWZpYyBjb2RlYyBwcml2YXRlIGRhdGEsIGZpbmQgaXQgZnJvbSB0aGUgZmlyc3QgZnJhbWUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NldENzZEZyb20xc3RGcmFtZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX01KUEVHIiwgY29kZWNJRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9WSURFT19NSlBFRyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJWX01TL1ZGVy9GT1VSQ0MiLCBjb2RlY0lEKSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoTlVMTCA9PSBjb2RlY1ByaXZhdGUgfHxjb2RlY1ByaXZhdGVTaXplIDwgMjApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJWX01TL1ZGVy9GT1VSQ0MgaGFzIG5vIHZhbGlkIHByaXZhdGUgZGF0YSglcCksY29kZWNQcml2YXRlU2l6ZTolenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZm91cmNjID0gKih1aW50MzJfdCAqKShjb2RlY1ByaXZhdGUgKyAxNik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3VyY2MgPSBudG9obChmb3VyY2MpOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSA9IE1LVkZvdXJDQzJNSU1FKGZvdXJjYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiVl9NUy9WRlcvRk9VUkNDIHR5cGUgaXMgJXMiLCBtaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIG1pbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVl9NUy9WRlcvRk9VUkNDIGNvbnRpbnVlLHVuc3VwcG9ydCB2aWRlbyB0eXBlPSVzLGZvdXJjYz0weCUwOHguIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWUsIGZvdXJjYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX1hWSUQpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19ESVZYKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fRElWWDMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMikgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTZXRDc2RGcm9tMXN0RnJhbWUgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiRm91ckNDIGhhdmUgdW5zdXBwb3J0IGNvZGVjLCB0eXBlPSVzLGZvdXJjYz0weCUwOHguIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaW1lLCBmb3VyY2MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzIGlzIG5vdCBzdXBwb3J0ZWQuIiwgY29kZWNJRCk7CkBAIC0xNDU1LDggKzIwNTYsOCBAQAogICAgICAgICAgICAgICAgICAgICBBTE9HVygidHJhY2sgaGVpZ2h0IGV4Y2VlZHMgaW50MzJfdCwgJWxsZCIsIGhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlXaWR0aCwgKGludDMyX3Qpd2lkdGgpOwotICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUhlaWdodCwgKGludDMyX3QpaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgKGludDMyX3Qpd2lkdGgpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgKGludDMyX3QpaGVpZ2h0KTsKIAogICAgICAgICAgICAgICAgIC8vIHNldHRpbmcgZGlzcGxheSB3aWR0aC9oZWlnaHQgaXMgb3B0aW9uYWwKICAgICAgICAgICAgICAgICBjb25zdCBsb25nIGxvbmcgZGlzcGxheVVuaXQgPSB2dHJhY2stPkdldERpc3BsYXlVbml0KCk7CkBAIC0xNDY2LDggKzIwNjcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICYmIGRpc3BsYXlIZWlnaHQgPiAwICYmIGRpc3BsYXlIZWlnaHQgPD0gSU5UMzJfTUFYKSB7CiAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZGlzcGxheVVuaXQpIHsKICAgICAgICAgICAgICAgICAgICAgY2FzZSAwOiAvLyBwaXhlbHMKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlXaWR0aCwgKGludDMyX3QpZGlzcGxheVdpZHRoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlIZWlnaHQsIChpbnQzMl90KWRpc3BsYXlIZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9XSURUSCwgKGludDMyX3QpZGlzcGxheVdpZHRoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfSEVJR0hULCAoaW50MzJfdClkaXNwbGF5SGVpZ2h0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIDE6IC8vIGNlbnRpbWV0ZXJzCiAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjogLy8gaW5jaGVzCkBAIC0xNDgxLDggKzIwODQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGxvbmcgbG9uZyBjb21wdXRlZEhlaWdodCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWF4KGhlaWdodCwgd2lkdGggKiBkaXNwbGF5SGVpZ2h0IC8gZGlzcGxheVdpZHRoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjb21wdXRlZFdpZHRoIDw9IElOVDMyX01BWCAmJiBjb21wdXRlZEhlaWdodCA8PSBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlEaXNwbGF5V2lkdGgsIChpbnQzMl90KWNvbXB1dGVkV2lkdGgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleURpc3BsYXlIZWlnaHQsIChpbnQzMl90KWNvbXB1dGVkSGVpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9XSURUSCwgKGludDMyX3QpY29tcHV0ZWRXaWR0aCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfSEVJR0hULCAoaW50MzJfdCljb21wdXRlZEhlaWdodCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMTUwMiwzNCArMjEwNyw3NyBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBta3ZwYXJzZXI6OkF1ZGlvVHJhY2sgKj4odHJhY2spOwogCiAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAoIkFfQUFDIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0soY29kZWNQcml2YXRlU2l6ZSA+PSAyKTsKLQorICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNvZGVjUHJpdmF0ZVNpemUgPCAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiSW5jb21wbGV0ZSBBQUMgQ29kZWMgSW5mbyAlenUgYnl0ZSIsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgdHJ1ZSwgY29kZWNQcml2YXRlLCBjb2RlY1ByaXZhdGVTaXplKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfVk9SQklTIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUyk7CiAKICAgICAgICAgICAgICAgICAgICAgZXJyID0gYWRkVm9yYmlzQ29kZWNJbmZvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX09QVVMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKTsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlPcHVzSGVhZGVyLCAwLCBjb2RlY1ByaXZhdGUsIGNvZGVjUHJpdmF0ZVNpemUpOwotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldEludDY0KGtLZXlPcHVzQ29kZWNEZWxheSwgdHJhY2stPkdldENvZGVjRGVsYXkoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1ldGEuc2V0SW50NjQoa0tleU9wdXNTZWVrUHJlUm9sbCwgdHJhY2stPkdldFNlZWtQcmVSb2xsKCkpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgY29kZWNEZWxheSA9IHRyYWNrLT5HZXRDb2RlY0RlbGF5KCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8xLCAmY29kZWNEZWxheSwgc2l6ZW9mKGNvZGVjRGVsYXkpKTsKICAgICAgICAgICAgICAgICAgICAgbVNlZWtQcmVSb2xsTnMgPSB0cmFjay0+R2V0U2Vla1ByZVJvbGwoKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzIsICZtU2Vla1ByZVJvbGxOcywgc2l6ZW9mKG1TZWVrUHJlUm9sbE5zKSk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX01QRUcvTDMiLCBjb2RlY0lEKSkgewotICAgICAgICAgICAgICAgICAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOwogICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcCgiQV9GTEFDIiwgY29kZWNJRCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKTsKICAgICAgICAgICAgICAgICAgICAgZXJyID0gYWRkRmxhY01ldGFkYXRhKG1ldGEsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY21wKCJBX01QRUcvTDIiLCBjb2RlY0lEKSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAoIkFfUENNL0lOVC9MSVQiLCBjb2RlY0lEKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICFzdHJjbXAoIkFfUENNL0lOVC9CSUciLCBjb2RlY0lEKSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19SQVcpOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGJpZ0VuZGlhbiA9ICFzdHJjbXAoIkFfUENNL0lOVC9CSUciLCBjb2RlY0lEKSA/IDE6IDA7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfUENNX0JJR19FTkRJQU4sIGJpZ0VuZGlhbik7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoIXN0cmNtcCgiQV9NUy9BQ00iLCBjb2RlY0lEKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKChOVUxMID09IGNvZGVjUHJpdmF0ZSkgfHwgKGNvZGVjUHJpdmF0ZVNpemUgPCAxOCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJ1bnN1cHBvcnRlZCBhdWRpbzogQV9NUy9BQ00gaGFzIG5vIHZhbGlkIHByaXZhdGUgZGF0YTogJXMsIHNpemU6ICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNQcml2YXRlID09IE5VTEwgPyAibnVsbCIgOiAibm9uLW51bGwiLCBjb2RlY1ByaXZhdGVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgSUQgPSAqKHVpbnQxNl90ICopY29kZWNQcml2YXRlOworICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSA9IE1LVldhdmUyTUlNRShJRCk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiQV9NUy9BQ00gdHlwZSBpcyAlcyIsIG1pbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgbWltZSwgNikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNNa3ZBdWRpb0NzZFNpemVPSyhtaW1lLCBjb2RlY1ByaXZhdGVTaXplKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkFfTVMvQUNNIGNvbnRpbnVlLCB1bnN1cHBvcnRlZCBhdWRpbyB0eXBlPSVzLCBjc2RTaXplOiV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWUsIGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fV01BKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZEVTRFNGcm9tQ29kZWNQcml2YXRlKG1ldGEsIHRydWUsIGNvZGVjUHJpdmF0ZSwgY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFzdHJjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVNfQURQQ00pIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RyY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0FVRElPX0RWSV9JTUFfQURQQ00pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYmxvY2tBbGlnbiA9ICoodWludDE2X3QqKShjb2RlY1ByaXZhdGUgKyAxMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkRVNEU0Zyb21Db2RlY1ByaXZhdGUobWV0YSwgdHJ1ZSwgJmJsb2NrQWxpZ24sIHNpemVvZihibG9ja0FsaWduKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMgaXMgbm90IHN1cHBvcnRlZC4iLCBjb2RlY0lEKTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgYXRyYWNrLT5HZXRTYW1wbGluZ1JhdGUoKSk7Ci0gICAgICAgICAgICAgICAgbWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBhdHJhY2stPkdldENoYW5uZWxzKCkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBhdHJhY2stPkdldFNhbXBsaW5nUmF0ZSgpKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBhdHJhY2stPkdldENoYW5uZWxzKCkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgYXRyYWNrLT5HZXRCaXREZXB0aCgpKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIApAQCAtMTU0Miw3ICsyMTkwLDcgQEAKICAgICAgICAgICAgY2hhciBsYW5nWzRdOwogICAgICAgICAgICBzdHJuY3B5KGxhbmcsIGxhbmd1YWdlLCAzKTsKICAgICAgICAgICAgbGFuZ1szXSA9ICdcMCc7Ci0gICAgICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TWVkaWFMYW5ndWFnZSwgbGFuZyk7CisgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRSwgbGFuZyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CkBAIC0xNTUxLDIwICsyMTk5LDU0IEBACiAgICAgICAgIH0KIAogICAgICAgICBsb25nIGxvbmcgZHVyYXRpb25OcyA9IG1TZWdtZW50LT5HZXREdXJhdGlvbigpOwotICAgICAgICBtZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgKGR1cmF0aW9uTnMgKyA1MDApIC8gMTAwMCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoZHVyYXRpb25OcyArIDUwMCkgLyAxMDAwKTsKKworICAgICAgICBjb25zdCBjaGFyICptaW1ldHlwZSA9ICIiOworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZXR5cGUpKSB7CisgICAgICAgICAgICAvLyBkbyBub3QgYWRkIHRoaXMgdHJhY2sgdG8gdGhlIHRyYWNrIGxpc3QKKyAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyB0cmFjayB3aXRoIHVua25vd24gbWltZSIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAogICAgICAgICBtVHJhY2tzLnB1c2goKTsKICAgICAgICAgc2l6ZV90IG4gPSBtVHJhY2tzLnNpemUoKSAtIDE7CiAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdChuKTsKICAgICAgICAgaW5pdFRyYWNrSW5mbyh0cmFjaywgbWV0YSwgdHJhY2tJbmZvKTsKKyAgICAgICAgdHJhY2tJbmZvLT5tTmFsTGVuZ3RoU2l6ZSA9IG5hbFNpemU7CiAKLSAgICAgICAgaWYgKCFzdHJjbXAoIlZfTVBFRzQvSVNPL0FWQyIsIGNvZGVjSUQpICYmIGNvZGVjUHJpdmF0ZVNpemUgPT0gMCkgeworICAgICAgICBpZiAoKCFzdHJjbXAoIlZfTVBFRzQvSVNPL0FWQyIsIGNvZGVjSUQpICYmIGNvZGVjUHJpdmF0ZVNpemUgPT0gMCkgfHwKKyAgICAgICAgICAgICghc3RyY21wKG1pbWV0eXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpICYmIGlzU2V0Q3NkRnJvbTFzdEZyYW1lKSkgewogICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byByZWNvdmVyIGZyb20gQVZDIHRyYWNrIHdpdGhvdXQgY29kZWMgcHJpdmF0ZSBkYXRhCiAgICAgICAgICAgICBlcnIgPSBzeW50aGVzaXplQVZDQyh0cmFja0luZm8sIG4pOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIG1UcmFja3MucG9wKCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoKCFzdHJjbXAoIlZfTVBFRzIiLCBjb2RlY0lEKSAmJiBjb2RlY1ByaXZhdGVTaXplID09IDApIHx8CisgICAgICAgICAgICAoIXN0cmNtcChtaW1ldHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpICYmIGlzU2V0Q3NkRnJvbTFzdEZyYW1lKSkgeworICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byByZWNvdmVyIGZyb20gTVBFRzIgdHJhY2sgd2l0aG91dCBjb2RlYyBwcml2YXRlIGRhdGEKKyAgICAgICAgICAgIGVyciA9IHN5bnRoZXNpemVNUEVHMih0cmFja0luZm8sIG4pOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIG1UcmFja3MucG9wKCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoKCFzdHJjbXAoIlZfTVBFRzQvSVNPL0FTUCIsIGNvZGVjSUQpICYmIGNvZGVjUHJpdmF0ZVNpemUgPT0gMCkgfHwKKyAgICAgICAgICAgICghc3RyY21wKG1pbWV0eXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCkgJiYgaXNTZXRDc2RGcm9tMXN0RnJhbWUpIHx8CisgICAgICAgICAgICAoIXN0cmNtcChtaW1ldHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fWFZJRCkgJiYgaXNTZXRDc2RGcm9tMXN0RnJhbWUpIHx8CisgICAgICAgICAgICAoIXN0cmNtcChtaW1ldHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fRElWWCkgJiYgaXNTZXRDc2RGcm9tMXN0RnJhbWUpIHx8CisgICAgICAgICAgICAoIXN0cmNtcChtaW1ldHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fRElWWDMpICYmIGlzU2V0Q3NkRnJvbTFzdEZyYW1lKSkgeworICAgICAgICAgICAgLy8gQXR0ZW1wdCB0byByZWNvdmVyIGZyb20gTVBFRzQgdHJhY2sgd2l0aG91dCBjb2RlYyBwcml2YXRlIGRhdGEKKyAgICAgICAgICAgIGVyciA9IHN5bnRoZXNpemVNUEVHNCh0cmFja0luZm8sIG4pOworICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIG1UcmFja3MucG9wKCk7CisgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgLy8gdGhlIFRyYWNrSW5mbyBvd25zIHRoZSBtZXRhZGF0YSBub3cKKyAgICAgICAgbWV0YSA9IG51bGxwdHI7CisgICAgfQorICAgIGlmIChtZXRhKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobWV0YSk7CiAgICAgfQogfQogCkBAIC0xNTczLDcgKzIyNTUsNyBAQAogICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KGkpOwogCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgIENIRUNLKGluZm8tPm1NZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldFN0cmluZyhpbmZvLT5tTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogCiAgICAgICAgIGlmIChzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwpAQCAtMTU5OSwxNiArMjI4MSwxNiBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgaXRlci5hZHZhbmNlKCk7CiAgICAgICAgIH0KLSAgICAgICAgaW5mby0+bU1ldGEuc2V0SW50NjQoa0tleVRodW1ibmFpbFRpbWUsIHRodW1ibmFpbFRpbWVVcyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChpbmZvLT5tTWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FLCB0aHVtYm5haWxUaW1lVXMpOwogICAgIH0KIH0KIAotc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuc2V0Q1N0cmluZygKLSAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwKLSAgICAgICAgICAgIG1Jc1dlYm0gPyAidmlkZW8vd2VibSIgOiBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTUFUUk9TS0EpOworbWVkaWFfc3RhdHVzX3QgTWF0cm9za2FFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgbUlzV2VibSA/ICJ2aWRlby93ZWJtIiA6IE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NQVRST1NLQSk7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogdWludDMyX3QgTWF0cm9za2FFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewpAQCAtMTYyMSw3ICsyMzAzLDcgQEAKIH0KIAogYm9vbCBTbmlmZk1hdHJvc2thKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CiAgICAgRGF0YVNvdXJjZUJhc2VSZWFkZXIgcmVhZGVyKHNvdXJjZSk7CiAgICAgbWt2cGFyc2VyOjpFQk1MSGVhZGVyIGVibWxIZWFkZXI7CiAgICAgbG9uZyBsb25nIHBvczsKQEAgLTE2MzQsMjggKzIzMTYsNDAgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAibWthIiwKKyAgICAibWt2IiwKKyAgICAid2VibSIsCisgICAgTlVMTAorfTsKIAogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgVVVJRCgiYWJiZWRkOTItMzhjNC00OTA0LWE0YzEtYjNmNDVmODk5OTgwIiksCiAgICAgICAgIDEsCiAgICAgICAgICJNYXRyb3NrYSBFeHRyYWN0b3IiLAotICAgICAgICBbXSgKLSAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICAgICAgICAgIHZvaWQgKiosCi0gICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgewotICAgICAgICAgICAgaWYgKFNuaWZmTWF0cm9za2Eoc291cmNlLCBjb25maWRlbmNlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBbXSgKLSAgICAgICAgICAgICAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWF0cm9za2FFeHRyYWN0b3Ioc291cmNlKTt9OworICAgICAgICB7CisgICAgICAgICAgICAudjMgPSB7CisgICAgICAgICAgICAgICAgW10oCisgICAgICAgICAgICAgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAorICAgICAgICAgICAgICAgICAgICB2b2lkICoqLAorICAgICAgICAgICAgICAgICAgICBGcmVlTWV0YUZ1bmMgKikgLT4gQ3JlYXRvckZ1bmMgeworICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOworICAgICAgICAgICAgICAgICAgICBpZiAoU25pZmZNYXRyb3NrYSgmaGVscGVyLCBjb25maWRlbmNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IENNZWRpYUV4dHJhY3RvciogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB3cmFwKG5ldyBNYXRyb3NrYUV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7fTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAgICAgfTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21rdi9NYXRyb3NrYUV4dHJhY3Rvci5oCmluZGV4IDM1NjhlYTEuLjk5ZmFkMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbWt2L01hdHJvc2thRXh0cmFjdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9ta3YvTWF0cm9za2FFeHRyYWN0b3IuaApAQCAtMjAsOCArMjAsOSBAQAogCiAjaW5jbHVkZSAibWt2cGFyc2VyL21rdnBhcnNlci5oIgogCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKQEAgLTM0LDE2ICszNSwxNiBAQAogc3RydWN0IERhdGFTb3VyY2VCYXNlUmVhZGVyOwogc3RydWN0IE1hdHJvc2thU291cmNlOwogCi1zdHJ1Y3QgTWF0cm9za2FFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE1hdHJvc2thRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworc3RydWN0IE1hdHJvc2thRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKKyAgICBleHBsaWNpdCBNYXRyb3NrYUV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKIAotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgY29uc3Q7CiAKQEAgLTU3LDkgKzU4LDE1IEBACiAgICAgZnJpZW5kIHN0cnVjdCBCbG9ja0l0ZXJhdG9yOwogCiAgICAgc3RydWN0IFRyYWNrSW5mbyB7CisgICAgICAgIFRyYWNrSW5mbygpIHsKKyAgICAgICAgICAgIG1NZXRhID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIH5UcmFja0luZm8oKSB7CisgICAgICAgIH0KICAgICAgICAgdW5zaWduZWQgbG9uZyBtVHJhY2tOdW07CiAgICAgICAgIGJvb2wgbUVuY3J5cHRlZDsKLSAgICAgICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgICAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOwogICAgICAgICBjb25zdCBNYXRyb3NrYUV4dHJhY3RvciAqbUV4dHJhY3RvcjsKICAgICAgICAgVmVjdG9yPGNvbnN0IG1rdnBhcnNlcjo6Q3VlUG9pbnQqPiBtQ3VlUG9pbnRzOwogCkBAIC02OCw2ICs3NSw3IEBACiAgICAgICAgIC8vIGluIH5NYXRyb3NrYUV4dHJhY3Rvci4KICAgICAgICAgdW5zaWduZWQgY2hhciAqbUhlYWRlcjsKICAgICAgICAgc2l6ZV90IG1IZWFkZXJMZW47CisgICAgICAgIGludDMyX3QgbU5hbExlbmd0aFNpemU7CiAKICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpUcmFjayogZ2V0VHJhY2soKSBjb25zdDsKICAgICAgICAgY29uc3QgbWt2cGFyc2VyOjpDdWVQb2ludDo6VHJhY2tQb3NpdGlvbiAqZmluZChsb25nIGxvbmcgdGltZU5zKSBjb25zdDsKQEAgLTc2LDcgKzg0LDcgQEAKICAgICBNdXRleCBtTG9jazsKICAgICBWZWN0b3I8VHJhY2tJbmZvPiBtVHJhY2tzOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIERhdGFTb3VyY2VCYXNlUmVhZGVyICptUmVhZGVyOwogICAgIG1rdnBhcnNlcjo6U2VnbWVudCAqbVNlZ21lbnQ7CiAgICAgYm9vbCBtRXh0cmFjdGVkVGh1bWJuYWlsczsKQEAgLTg1LDE1ICs5MywxNyBAQAogICAgIGludDY0X3QgbVNlZWtQcmVSb2xsTnM7CiAKICAgICBzdGF0dXNfdCBzeW50aGVzaXplQVZDQyhUcmFja0luZm8gKnRyYWNrSW5mbywgc2l6ZV90IGluZGV4KTsKKyAgICBzdGF0dXNfdCBzeW50aGVzaXplTVBFRzIoVHJhY2tJbmZvICp0cmFja0luZm8sIHNpemVfdCBpbmRleCk7CisgICAgc3RhdHVzX3Qgc3ludGhlc2l6ZU1QRUc0KFRyYWNrSW5mbyAqdHJhY2tJbmZvLCBzaXplX3QgaW5kZXgpOwogICAgIHN0YXR1c190IGluaXRUcmFja0luZm8oCiAgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlRyYWNrICp0cmFjaywKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgICAgIFRyYWNrSW5mbyAqdHJhY2tJbmZvKTsKICAgICB2b2lkIGFkZFRyYWNrcygpOwogICAgIHZvaWQgZmluZFRodW1ibmFpbHMoKTsKICAgICB2b2lkIGdldENvbG9ySW5mb3JtYXRpb24oCiAgICAgICAgICAgICBjb25zdCBta3ZwYXJzZXI6OlZpZGVvVHJhY2sgKnZ0cmFjaywKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEpOwogICAgIGJvb2wgaXNMaXZlU3RyZWFtaW5nKCkgY29uc3Q7CiAKICAgICBNYXRyb3NrYUV4dHJhY3Rvcihjb25zdCBNYXRyb3NrYUV4dHJhY3RvciAmKTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9BbmRyb2lkLmJwCmluZGV4IDQ5NGNlYWMuLjZmMDJiMGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvQW5kcm9pZC5icApAQCAtMSw0ICsxLDQgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogCiAgICAgc3JjczogWwogICAgICAgICAgICAgIk1QM0V4dHJhY3Rvci5jcHAiLApAQCAtMTIsMTMgKzEyLDEzIEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgIF0sCiAKICAgICBuYW1lOiAibGlibXAzZXh0cmFjdG9yIiwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuY3BwCmluZGV4IDMzY2ZmOTYuLmE4MzhhZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL01QM0V4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmNwcApAQCAtMjQsOCArMjQsNiBAQAogI2luY2x1ZGUgIlZCUklTZWVrZXIuaCIKICNpbmNsdWRlICJYSU5HU2Vla2VyLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgpAQCAtNDYsNyArNDQsNyBAQAogc3RhdGljIGNvbnN0IHVpbnQzMl90IGtNYXNrID0gMHhmZmZlMGMwMDsKIAogc3RhdGljIGJvb2wgUmVzeW5jKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCB1aW50MzJfdCBtYXRjaF9oZWFkZXIsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgdWludDMyX3QgbWF0Y2hfaGVhZGVyLAogICAgICAgICBvZmY2NF90ICppbm91dF9wb3MsIG9mZjY0X3QgKnBvc3RfaWQzX3BvcywgdWludDMyX3QgKm91dF9oZWFkZXIpIHsKICAgICBpZiAocG9zdF9pZDNfcG9zICE9IE5VTEwpIHsKICAgICAgICAgKnBvc3RfaWQzX3BvcyA9IDA7CkBAIC0yMDksMzUgKzIwNywzNCBAQAogICAgIHJldHVybiB2YWxpZDsKIH0KIAotY2xhc3MgTVAzU291cmNlIDogcHVibGljIE1lZGlhVHJhY2sgeworY2xhc3MgTVAzU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogcHVibGljOgogICAgIE1QM1NvdXJjZSgKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICAgICAgb2ZmNjRfdCBmaXJzdF9mcmFtZV9wb3MsIHVpbnQzMl90IGZpeGVkX2hlYWRlciwKICAgICAgICAgICAgIE1QM1NlZWtlciAqc2Vla2VyKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5NUDNTb3VyY2UoKTsKIAogcHJpdmF0ZToKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhGcmFtZVNpemU7Ci0gICAgTWV0YURhdGFCYXNlICZtTWV0YTsKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptTWV0YTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBvZmY2NF90IG1GaXJzdEZyYW1lUG9zOwogICAgIHVpbnQzMl90IG1GaXhlZEhlYWRlcjsKICAgICBvZmY2NF90IG1DdXJyZW50UG9zOwogICAgIGludDY0X3QgbUN1cnJlbnRUaW1lVXM7CiAgICAgYm9vbCBtU3RhcnRlZDsKICAgICBNUDNTZWVrZXIgKm1TZWVrZXI7Ci0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwogCiAgICAgaW50NjRfdCBtQmFzaXNUaW1lVXM7CiAgICAgaW50NjRfdCBtU2FtcGxlc1JlYWQ7CkBAIC0yNTMsNyArMjUwLDcgQEAKIH07CiAKIE1QM0V4dHJhY3Rvcjo6TVAzRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBNcDNNZXRhICptZXRhKQorICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIE1wM01ldGEgKm1ldGEpCiAgICAgOiBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1GaXJzdEZyYW1lUG9zKC0xKSwKQEAgLTI4NSw2ICsyODIsNyBAQAogICAgIG1GaXhlZEhlYWRlciA9IGhlYWRlcjsKICAgICBYSU5HU2Vla2VyICpzZWVrZXIgPSBYSU5HU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKG1EYXRhU291cmNlLCBtRmlyc3RGcmFtZVBvcyk7CiAKKyAgICBtTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKICAgICBpZiAoc2Vla2VyID09IE5VTEwpIHsKICAgICAgICAgbVNlZWtlciA9IFZCUklTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UobURhdGFTb3VyY2UsIHBvc3RfaWQzX3Bvcyk7CiAgICAgfSBlbHNlIHsKQEAgLTI5Miw4ICsyOTAsOCBAQAogICAgICAgICBpbnQgZW5jZCA9IHNlZWtlci0+Z2V0RW5jb2RlckRlbGF5KCk7CiAgICAgICAgIGludCBlbmNwID0gc2Vla2VyLT5nZXRFbmNvZGVyUGFkZGluZygpOwogICAgICAgICBpZiAoZW5jZCAhPSAwIHx8IGVuY3AgIT0gMCkgewotICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJEZWxheSwgZW5jZCk7Ci0gICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsIGVuY3ApOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVksIGVuY2QpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORywgZW5jcCk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTMyOSwyMSArMzI3LDIzIEBACiAKICAgICBzd2l0Y2ggKGxheWVyKSB7CiAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgIG1NZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0kpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0kpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgMjoKLSAgICAgICAgICAgIG1NZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0lJKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobU1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JSSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgbU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUcpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CiAKLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlX3JhdGUpOwotICAgIG1NZXRhLnNldEludDMyKGtLZXlCaXRSYXRlLCBiaXRyYXRlICogMTAwMCk7Ci0gICAgbU1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbnVtX2NoYW5uZWxzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZV9yYXRlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIGJpdHJhdGUgKiAxMDAwKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbnVtX2NoYW5uZWxzKTsKIAogICAgIGludDY0X3QgZHVyYXRpb25VczsKIApAQCAtMzYzLDcgKzM2Myw3IEBACiAgICAgfQogCiAgICAgaWYgKGR1cmF0aW9uVXMgPj0gMCkgewotICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uVXMpOwogICAgIH0KIAogICAgIG1Jbml0Q2hlY2sgPSBPSzsKQEAgLTM3MSw3ICszNzEsOCBAQAogICAgIC8vIEdldCBpVHVuZXMtc3R5bGUgZ2FwbGVzcyBpbmZvIGlmIHByZXNlbnQuCiAgICAgLy8gV2hlbiBnZXR0aW5nIHRoZSBpZDMgdGFnLCBza2lwIHRoZSBWMSB0YWdzIHRvIHByZXZlbnQgdGhlIHNvdXJjZSBjYWNoZQogICAgIC8vIGZyb20gYmVpbmcgaXRlcmF0ZWQgdG8gdGhlIGVuZCBvZiB0aGUgZmlsZS4KLSAgICBJRDMgaWQzKG1EYXRhU291cmNlLCB0cnVlKTsKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihtRGF0YVNvdXJjZSk7CisgICAgSUQzIGlkMygmaGVscGVyLCB0cnVlKTsKICAgICBpZiAoaWQzLmlzVmFsaWQoKSkgewogICAgICAgICBJRDM6Okl0ZXJhdG9yICpjb20gPSBuZXcgSUQzOjpJdGVyYXRvcihpZDMsICJDT00iKTsKICAgICAgICAgaWYgKGNvbS0+ZG9uZSgpKSB7CkBAIC0zOTAsOCArMzkxLDggQEAKIAogICAgICAgICAgICAgICAgIGludDMyX3QgZGVsYXksIHBhZGRpbmc7CiAgICAgICAgICAgICAgICAgaWYgKHNzY2FuZih2YWx1ZSwgIiAlKnggJXggJXggJSp4IiwgJmRlbGF5LCAmcGFkZGluZykgPT0gMikgewotICAgICAgICAgICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7Ci0gICAgICAgICAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgcGFkZGluZyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZLCBkZWxheSk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX1BBRERJTkcsIHBhZGRpbmcpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTQwNCwxMyArNDA1LDE1IEBACiAKIE1QM0V4dHJhY3Rvcjo6fk1QM0V4dHJhY3RvcigpIHsKICAgICBkZWxldGUgbVNlZWtlcjsKKyAgICBkZWxldGUgbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtTWV0YSk7CiB9CiAKIHNpemVfdCBNUDNFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrICE9IE9LID8gMCA6IDE7CiB9CiAKLU1lZGlhVHJhY2sgKk1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNUDNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ICE9IDApIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtNDIwLDE0ICs0MjMsMTQgQEAKICAgICAgICAgICAgIG1TZWVrZXIpOwogfQogCi1zdGF0dXNfdCBNUDNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1QM0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggIT0gMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwpAQCAtNDQwLDcgKzQ0Myw3IEBACiAvLyBTZXQgb3VyIG1heCBmcmFtZSBzaXplIHRvIHRoZSBuZWFyZXN0IHBvd2VyIG9mIDIgYWJvdmUgdGhpcyBzaXplIChha2EsIDRrQikKIGNvbnN0IHNpemVfdCBNUDNTb3VyY2U6OmtNYXhGcmFtZVNpemUgPSAoMSA8PCAxMik7IC8qIDQwOTYgYnl0ZXMgKi8KIE1QM1NvdXJjZTo6TVAzU291cmNlKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICBvZmY2NF90IGZpcnN0X2ZyYW1lX3BvcywgdWludDMyX3QgZml4ZWRfaGVhZGVyLAogICAgICAgICBNUDNTZWVrZXIgKnNlZWtlcikKICAgICA6IG1NZXRhKG1ldGEpLApAQCAtNDUxLDcgKzQ1NCw2IEBACiAgICAgICBtQ3VycmVudFRpbWVVcygwKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1TZWVrZXIoc2Vla2VyKSwKLSAgICAgIG1Hcm91cChOVUxMKSwKICAgICAgIG1CYXNpc1RpbWVVcygwKSwKICAgICAgIG1TYW1wbGVzUmVhZCgwKSB7CiB9CkBAIC00NjIsMTIgKzQ2NCwxMCBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgTVAzU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKikgeworbWVkaWFfc3RhdHVzX3QgTVAzU291cmNlOjpzdGFydCgpIHsKICAgICBDSEVDSyghbVN0YXJ0ZWQpOwogCi0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXA7Ci0KLSAgICBtR3JvdXAtPmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoa01heEZyYW1lU2l6ZSkpOworICAgIG1CdWZmZXJHcm91cC0+YWRkX2J1ZmZlcihrTWF4RnJhbWVTaXplKTsKIAogICAgIG1DdXJyZW50UG9zID0gbUZpcnN0RnJhbWVQb3M7CiAgICAgbUN1cnJlbnRUaW1lVXMgPSAwOwpAQCAtNDc3LDI3ICs0NzcsMjMgQEAKIAogICAgIG1TdGFydGVkID0gdHJ1ZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUDNTb3VyY2U6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBNUDNTb3VyY2U6OnN0b3AoKSB7CiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUDNTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworbWVkaWFfc3RhdHVzX3QgTVAzU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKIH0KIAotc3RhdHVzX3QgTVAzU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBNUDNTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwpAQCAtNTA5LDExICs1MDUsMTEgQEAKICAgICAgICAgaWYgKG1TZWVrZXIgPT0gTlVMTAogICAgICAgICAgICAgICAgIHx8ICFtU2Vla2VyLT5nZXRPZmZzZXRGb3JUaW1lKCZhY3R1YWxTZWVrVGltZVVzLCAmbUN1cnJlbnRQb3MpKSB7CiAgICAgICAgICAgICBpbnQzMl90IGJpdHJhdGU7Ci0gICAgICAgICAgICBpZiAoIW1NZXRhLmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdHJhdGUpKSB7CisgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgJmJpdHJhdGUpKSB7CiAgICAgICAgICAgICAgICAgLy8gYml0cmF0ZSBpcyBpbiBiaXRzL3NlYy4KICAgICAgICAgICAgICAgICBBTE9HSSgibm8gYml0cmF0ZSIpOwogCi0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1DdXJyZW50VGltZVVzID0gc2Vla1RpbWVVczsKQEAgLTUyNywxMCArNTIzLDEwIEBACiAgICAgICAgIG1TYW1wbGVzUmVhZCA9IDA7CiAgICAgfQogCi0gICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXI7Ci0gICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmYnVmZmVyKTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyOworICAgIHN0YXR1c190IGVyciA9IG1CdWZmZXJHcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CiAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gZXJyOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgc2l6ZV90IGZyYW1lX3NpemU7CkBAIC01NDMsNyArNTM5LDggQEAKICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIChuIDwgMCA/IG4gOiBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgICAgIHJldHVybiAoKG4gPCAwICYmIG4gIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgPworICAgICAgICAgICAgICAgICAgICBBTUVESUFfRVJST1JfVU5LTk9XTiA6IEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNKTsKICAgICAgICAgfQogCiAgICAgICAgIHVpbnQzMl90IGhlYWRlciA9IFUzMl9BVCgoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpKTsKQEAgLTU3Miw3ICs1NjksNyBAQAogICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBidWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgfQogCiAgICAgICAgIG1DdXJyZW50UG9zID0gcG9zOwpAQCAtNTg3LDEzICs1ODQsMTUgQEAKICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIChuIDwgMCA/IG4gOiBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKKyAgICAgICAgcmV0dXJuICgobiA8IDAgJiYgbiAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSA/CisgICAgICAgICAgICAgICAgQU1FRElBX0VSUk9SX1VOS05PV04gOiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSk7CiAgICAgfQogCiAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnJhbWVfc2l6ZSk7CiAKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCBtQ3VycmVudFRpbWVVcyk7Ci0gICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgbUN1cnJlbnRUaW1lVXMpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIDEpOwogCiAgICAgbUN1cnJlbnRQb3MgKz0gZnJhbWVfc2l6ZTsKIApAQCAtNjAyLDM5ICs2MDEsNDAgQEAKIAogICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTVAzRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLmNsZWFyKCk7CittZWRpYV9zdGF0dXNfdCBNUDNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKICAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXVkaW8vbXBlZyIpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKIAotICAgIElEMyBpZDMobURhdGFTb3VyY2UpOworICAgIERhdGFTb3VyY2VIZWxwZXIgaGVscGVyKG1EYXRhU291cmNlKTsKKyAgICBJRDMgaWQzKCZoZWxwZXIpOwogCiAgICAgaWYgKCFpZDMuaXNWYWxpZCgpKSB7Ci0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICB9CiAKICAgICBzdHJ1Y3QgTWFwIHsKLSAgICAgICAgaW50IGtleTsKKyAgICAgICAgY29uc3QgY2hhciAqa2V5OwogICAgICAgICBjb25zdCBjaGFyICp0YWcxOwogICAgICAgICBjb25zdCBjaGFyICp0YWcyOwogICAgIH07CiAgICAgc3RhdGljIGNvbnN0IE1hcCBrTWFwW10gPSB7Ci0gICAgICAgIHsga0tleUFsYnVtLCAiVEFMQiIsICJUQUwiIH0sCi0gICAgICAgIHsga0tleUFydGlzdCwgIlRQRTEiLCAiVFAxIiB9LAotICAgICAgICB7IGtLZXlBbGJ1bUFydGlzdCwgIlRQRTIiLCAiVFAyIiB9LAotICAgICAgICB7IGtLZXlDb21wb3NlciwgIlRDT00iLCAiVENNIiB9LAotICAgICAgICB7IGtLZXlHZW5yZSwgIlRDT04iLCAiVENPIiB9LAotICAgICAgICB7IGtLZXlUaXRsZSwgIlRJVDIiLCAiVFQyIiB9LAotICAgICAgICB7IGtLZXlZZWFyLCAiVFlFIiwgIlRZRVIiIH0sCi0gICAgICAgIHsga0tleUF1dGhvciwgIlRYVCIsICJURVhUIiB9LAotICAgICAgICB7IGtLZXlDRFRyYWNrTnVtYmVyLCAiVFJLIiwgIlRSQ0siIH0sCi0gICAgICAgIHsga0tleURpc2NOdW1iZXIsICJUUEEiLCAiVFBPUyIgfSwKLSAgICAgICAgeyBrS2V5Q29tcGlsYXRpb24sICJUQ1AiLCAiVENNUCIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FMQlVNLCAiVEFMQiIsICJUQUwiIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9BUlRJU1QsICJUUEUxIiwgIlRQMSIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNULCAiVFBFMiIsICJUUDIiIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUiwgIlRDT00iLCAiVENNIiB9LAorICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfR0VOUkUsICJUQ09OIiwgIlRDTyIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX1RJVExFLCAiVElUMiIsICJUVDIiIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9ZRUFSLCAiVFlFIiwgIlRZRVIiIH0sCisgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9BVVRIT1IsICJUWFQiLCAiVEVYVCIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIsICJUUksiLCAiVFJDSyIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIsICJUUEEiLCAiVFBPUyIgfSwKKyAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OLCAiVENQIiwgIlRDTVAiIH0sCiAgICAgfTsKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1NYXBFbnRyaWVzID0gc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOwogCkBAIC02NTQsNyArNjU0LDcgQEAKICAgICAgICAgaXQtPmdldFN0cmluZygmcyk7CiAgICAgICAgIGRlbGV0ZSBpdDsKIAotICAgICAgICBtZXRhLnNldENTdHJpbmcoa01hcFtpXS5rZXksIHMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIGtNYXBbaV0ua2V5LCBzLnN0cmluZygpKTsKICAgICB9CiAKICAgICBzaXplX3QgZGF0YVNpemU7CkBAIC02NjIsMjggKzY2MiwyOCBAQAogICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBpZDMuZ2V0QWxidW1BcnQoJmRhdGFTaXplLCAmbWltZSk7CiAKICAgICBpZiAoZGF0YSkgewotICAgICAgICBtZXRhLnNldERhdGEoa0tleUFsYnVtQXJ0LCBNZXRhRGF0YTo6VFlQRV9OT05FLCBkYXRhLCBkYXRhU2l6ZSk7Ci0gICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCBtaW1lLnN0cmluZygpKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJULCBkYXRhLCBkYXRhU2l6ZSk7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICB2b2lkICptZXRhKSB7CiAgICAgTXAzTWV0YSAqbWV0YURhdGEgPSBzdGF0aWNfY2FzdDxNcDNNZXRhICo+KG1ldGEpOwotICAgIHJldHVybiBuZXcgTVAzRXh0cmFjdG9yKHNvdXJjZSwgbWV0YURhdGEpOworICAgIHJldHVybiB3cmFwKG5ldyBNUDNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSwgbWV0YURhdGEpKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSkgeworc3RhdGljIENyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCisgICAgICAgIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEpIHsKICAgICBvZmY2NF90IHBvcyA9IDA7CiAgICAgb2ZmNjRfdCBwb3N0X2lkM19wb3M7CiAgICAgdWludDMyX3QgaGVhZGVyOwogICAgIHVpbnQ4X3QgbXBlZ19oZWFkZXJbNV07Ci0gICAgaWYgKHNvdXJjZS0+cmVhZEF0KDAsIG1wZWdfaGVhZGVyLCBzaXplb2YobXBlZ19oZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihtcGVnX2hlYWRlcikpIHsKKyAgICBEYXRhU291cmNlSGVscGVyIGhlbHBlcihzb3VyY2UpOworICAgIGlmIChoZWxwZXIucmVhZEF0KDAsIG1wZWdfaGVhZGVyLCBzaXplb2YobXBlZ19oZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihtcGVnX2hlYWRlcikpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC02OTEsNyArNjkxLDcgQEAKICAgICAgICAgQUxPR1YoIk1QRUcxUFMgY29udGFpbmVyIGlzIG5vdCBzdXBwb3J0ZWQhIik7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBpZiAoIVJlc3luYyhzb3VyY2UsIDAsICZwb3MsICZwb3N0X2lkM19wb3MsICZoZWFkZXIpKSB7CisgICAgaWYgKCFSZXN5bmMoJmhlbHBlciwgMCwgJnBvcywgJnBvc3RfaWQzX3BvcywgJmhlYWRlcikpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC03MDcsMTYgKzcwNywyNSBAQAogICAgIHJldHVybiBDcmVhdGVFeHRyYWN0b3I7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgIm1wMiIsCisgICAgIm1wMyIsCisgICAgIm1wZWciLAorICAgICJtcGciLAorICAgICJtcGdhIiwKKyAgICBOVUxMCit9OworCiBleHRlcm4gIkMiIHsKIC8vIFRoaXMgaXMgdGhlIG9ubHkgc3ltYm9sIHRoYXQgbmVlZHMgdG8gYmUgZXhwb3J0ZWQKIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5ICgiZGVmYXVsdCIpKSkKLU1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgeworRXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKICAgICByZXR1cm4gewotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04sCisgICAgICAgIEVYVFJBQ1RPUkRFRl9WRVJTSU9OLAogICAgICAgICBVVUlEKCI4MTJhM2Y2Yy1jOGNmLTQ2ZGUtYjUyOS0zNzc0YjE0MTAzZDQiKSwKICAgICAgICAgMSwgLy8gdmVyc2lvbgogICAgICAgICAiTVAzIEV4dHJhY3RvciIsCi0gICAgICAgIFNuaWZmCisgICAgICAgIHsgLnYzID0ge1NuaWZmLCBleHRlbnNpb25zfSB9CiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvTVAzRXh0cmFjdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaAppbmRleCA0ODViMGNhLi4xZTM4YWI3IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9NUDNFeHRyYWN0b3IuaApAQCAtMTksMzUgKzE5LDM3IEBACiAjZGVmaW5lIE1QM19FWFRSQUNUT1JfSF8KIAogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKKwogc3RydWN0IEFNZXNzYWdlOwotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CiBzdHJ1Y3QgTVAzU2Vla2VyOwogY2xhc3MgU3RyaW5nODsKIHN0cnVjdCBNcDNNZXRhOwogCi1jbGFzcyBNUDNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgTVAzRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKIHB1YmxpYzoKLSAgICBNUDNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgTXAzTWV0YSAqbWV0YSk7CisgICAgTVAzRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgTXAzTWV0YSAqbWV0YSk7CiAgICAgfk1QM0V4dHJhY3RvcigpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QM0V4dHJhY3RvciI7IH0KIAogcHJpdmF0ZToKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIG9mZjY0X3QgbUZpcnN0RnJhbWVQb3M7Ci0gICAgTWV0YURhdGFCYXNlIG1NZXRhOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgdWludDMyX3QgbUZpeGVkSGVhZGVyOwogICAgIE1QM1NlZWtlciAqbVNlZWtlcjsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmNwcAppbmRleCBjZDE3OTY1Li5jYTUxYjg4IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmNwcApAQCAtMjcsNyArMjcsOSBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzcsNyArMzksNyBAQAogCiAvLyBzdGF0aWMKIFZCUklTZWVrZXIgKlZCUklTZWVrZXI6OkNyZWF0ZUZyb21Tb3VyY2UoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3QgcG9zdF9pZDNfcG9zKSB7CisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgb2ZmNjRfdCBwb3N0X2lkM19wb3MpIHsKICAgICBvZmY2NF90IHBvcyA9IHBvc3RfaWQzX3BvczsKIAogICAgIHVpbnQ4X3QgaGVhZGVyWzRdOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvVkJSSVNlZWtlci5oCmluZGV4IDkyMTNmNmUuLjUwNzg5OWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1ZCUklTZWVrZXIuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9WQlJJU2Vla2VyLmgKQEAgLTI0LDExICsyNCwxMSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIERhdGFTb3VyY2VCYXNlOworY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKIAogc3RydWN0IFZCUklTZWVrZXIgOiBwdWJsaWMgTVAzU2Vla2VyIHsKICAgICBzdGF0aWMgVkJSSVNlZWtlciAqQ3JlYXRlRnJvbVNvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3QgcG9zdF9pZDNfcG9zKTsKKyAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgb2ZmNjRfdCBwb3N0X2lkM19wb3MpOwogCiAgICAgdmlydHVhbCBib29sIGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpOwogICAgIHZpcnR1YWwgYm9vbCBnZXRPZmZzZXRGb3JUaW1lKGludDY0X3QgKnRpbWVVcywgb2ZmNjRfdCAqcG9zKTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5jcHAKaW5kZXggMDFlMDZjYS4uOWYxZmQ3YSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5jcHAKQEAgLTIxLDcgKzIxLDkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTc5LDcgKzgxLDcgQEAKIAogLy8gc3RhdGljCiBYSU5HU2Vla2VyICpYSU5HU2Vla2VyOjpDcmVhdGVGcm9tU291cmNlKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBvZmY2NF90IGZpcnN0X2ZyYW1lX3BvcykgeworICAgICAgICBEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zKSB7CiAKICAgICB1aW50OF90IGJ1ZmZlcls0XTsKICAgICBpbnQgb2Zmc2V0ID0gZmlyc3RfZnJhbWVfcG9zOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDMvWElOR1NlZWtlci5oCmluZGV4IDU4NjdlYWUuLjlhY2VlMzggMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXAzL1hJTkdTZWVrZXIuaAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wMy9YSU5HU2Vla2VyLmgKQEAgLTIyLDExICsyMiwxMSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIERhdGFTb3VyY2VCYXNlOworY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKIAogc3RydWN0IFhJTkdTZWVrZXIgOiBwdWJsaWMgTVAzU2Vla2VyIHsKICAgICBzdGF0aWMgWElOR1NlZWtlciAqQ3JlYXRlRnJvbVNvdXJjZSgKLSAgICAgICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIG9mZjY0X3QgZmlyc3RfZnJhbWVfcG9zKTsKKyAgICAgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgb2ZmNjRfdCBmaXJzdF9mcmFtZV9wb3MpOwogCiAgICAgdmlydHVhbCBib29sIGdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpOwogICAgIHZpcnR1YWwgYm9vbCBnZXRPZmZzZXRGb3JUaW1lKGludDY0X3QgKnRpbWVVcywgb2ZmNjRfdCAqcG9zKTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FDNFBhcnNlci5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BQzRQYXJzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEzZDYwYzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9BQzRQYXJzZXIuY3BwCkBAIC0wLDAgKzEsNjIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJBQzRQYXJzZXIiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KKworI2luY2x1ZGUgIkFDNFBhcnNlci5oIgorCisjZGVmaW5lIEJPT0xTVFIoYSkgICgoYSk/InRydWUiOiJmYWxzZSIpCisjZGVmaW5lIEJZVEVfQUxJR04gbUJpdFJlYWRlci5za2lwQml0cyhtQml0UmVhZGVyLm51bUJpdHNMZWZ0KCkgJSA4KQorI2RlZmluZSBDSEVDS19CSVRTX0xFRlQobikgaWYgKG1CaXRSZWFkZXIubnVtQml0c0xlZnQoKSA8IG4pIHtyZXR1cm4gZmFsc2U7fQorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0FDNFBhcnNlcjo6QUM0UGFyc2VyKCkgeworfQorCitBQzREU0lQYXJzZXI6OkFDNERTSVBhcnNlcihBQml0UmVhZGVyICZicikKKyAgICA6IG1CaXRSZWFkZXIoYnIpeworCisgICAgbURTSVNpemUgPSBtQml0UmVhZGVyLm51bUJpdHNMZWZ0KCk7Cit9CisKKy8vIEVUU0kgVFMgMTAzIDE5MC0yIFYxLjEuMSAoMjAxNS0wOSkgVGFibGUgNzk6IGNoYW5uZWxfbW9kZQorc3RhdGljIGNvbnN0IGNoYXIgKkNoYW5uZWxNb2Rlc1tdID0geworICAgICJtb25vIiwKKyAgICAic3RlcmVvIiwKKyAgICAiMy4wIiwKKyAgICAiNS4wIiwKKyAgICAiNS4xIiwKKyAgICAiNy4wICgzLzQvMCkiLAorICAgICI3LjEgKDMvNC8wLjEpIiwKKyAgICAiNy4wICg1LzIvMCkiLAorICAgICI3LjEgKDUvMi8wLjEpIiwKKyAgICAiNy4wICgzLzIvMikiLAorICAgICI3LjEgKDMvMi8yLjEpIiwKKyAgICAiNy4wLjQiLAorICAgICI3LjEuNCIsCisgICAgIjkuMC40IiwKKyAgICAiOS4xLjQiLAorICAgICIyMi4yIgorfTsKKworc3RhdGljIGNvbnN0IGNoYXIqIENvbnRlbnRDbGFzc2lmaWVyW10gPSB7CisgICAgIkNvbXBsZXRlIE1haW4iLAorICAgICJNdXNpYyBhbmQgRWZmZWN0cyIsCisgICAgIlZpc3VhbGx5IEltcGFpcmVkIiwKKyAgICAiSGVhcmluZyBJbXBhaXJlZCIsCisgICAgIkRpYWxvZyIsCisgICAgIkNvbW1lbnRhcnkiLAorICAgICJFbWVyZ2VuY3kiLAorICAgICJWb2ljZSBPdmVyIgorfTsKKworYm9vbCBBQzREU0lQYXJzZXI6OnBhcnNlTGFuZ3VhZ2VUYWcodWludDMyX3QgcHJlc2VudGF0aW9uSUQsIHVpbnQzMl90IHN1YnN0cmVhbUlEKXsKKyAgICBDSEVDS19CSVRTX0xFRlQoNik7CisgICAgdWludDMyX3Qgbl9sYW5ndWFnZV90YWdfYnl0ZXMgPSBtQml0UmVhZGVyLmdldEJpdHMoNik7CisgICAgaWYgKG5fbGFuZ3VhZ2VfdGFnX2J5dGVzIDwgMiB8fCBuX2xhbmd1YWdlX3RhZ19ieXRlcyA+PSA0MikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIENIRUNLX0JJVFNfTEVGVChuX2xhbmd1YWdlX3RhZ19ieXRlcyAqIDgpOworICAgIGNoYXIgbGFuZ3VhZ2VfdGFnX2J5dGVzWzQyXTsgLy8gVFMgMTAzIDE5MCBwYXJ0IDEgNC4zLjMuOC43CisgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5fbGFuZ3VhZ2VfdGFnX2J5dGVzOyBpKyspIHsKKyAgICAgICAgbGFuZ3VhZ2VfdGFnX2J5dGVzW2ldID0gKGNoYXIpbUJpdFJlYWRlci5nZXRCaXRzKDgpOworICAgIH0KKyAgICBsYW5ndWFnZV90YWdfYnl0ZXNbbl9sYW5ndWFnZV90YWdfYnl0ZXNdID0gMDsKKyAgICBBTE9HVigiJXUuJXU6IGxhbmd1YWdlX3RhZyA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsIGxhbmd1YWdlX3RhZ19ieXRlcyk7CisKKyAgICBzdGQ6OnN0cmluZyBsYW5ndWFnZShsYW5ndWFnZV90YWdfYnl0ZXMsIG5fbGFuZ3VhZ2VfdGFnX2J5dGVzKTsKKyAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25JRF0ubUxhbmd1YWdlID0gbGFuZ3VhZ2U7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVFMgMTAzIDE5MC0xIHYxLjIuMSBFLjUgYW5kIFRTIDEwMyAxOTAtMiB2MS4xLjEgRS45Citib29sIEFDNERTSVBhcnNlcjo6cGFyc2VTdWJzdHJlYW1EU0kodWludDMyX3QgcHJlc2VudGF0aW9uSUQsIHVpbnQzMl90IHN1YnN0cmVhbUlEKXsKKyAgICBDSEVDS19CSVRTX0xFRlQoNSk7CisgICAgdWludDMyX3QgY2hhbm5lbF9tb2RlID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgIENIRUNLX0JJVFNfTEVGVCgyKTsKKyAgICB1aW50MzJfdCBkc2lfc2ZfbXVsdGlwbGllciA9IG1CaXRSZWFkZXIuZ2V0Qml0cygyKTsKKyAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgYm9vbCBiX3N1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvciA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgQUxPR1YoIiV1LiV1OiBjaGFubmVsX21vZGUgPSAldSAoJXMpXG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsIGNoYW5uZWxfbW9kZSwKKyAgICBjaGFubmVsX21vZGUgPCBORUxFTShDaGFubmVsTW9kZXMpID8gQ2hhbm5lbE1vZGVzW2NoYW5uZWxfbW9kZV0gOiAicmVzZXJ2ZWQiKTsKKyAgICBBTE9HVigiJXUuJXU6IGRzaV9zZl9tdWx0aXBsaWVyID0gJXVcbiIsIHByZXNlbnRhdGlvbklELAorICAgICAgICBzdWJzdHJlYW1JRCwgZHNpX3NmX211bHRpcGxpZXIpOworICAgIEFMT0dWKCIldS4ldTogYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsCisgICAgICAgIHN1YnN0cmVhbUlELCBCT09MU1RSKGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yKSk7CisKKyAgICBpZiAoYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IpIHsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgICAgICB1aW50MzJfdCBzdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgIEFMT0dWKCIldS4ldTogc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yID0gJXVcbiIsIHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCwKKyAgICAgICAgICAgIHN1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvcik7CisgICAgfQorICAgIGlmIChjaGFubmVsX21vZGUgPj0gNyAmJiBjaGFubmVsX21vZGUgPD0gMTApIHsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICB1aW50MzJfdCBhZGRfY2hfYmFzZSA9IG1CaXRSZWFkZXIuZ2V0Qml0cygxKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1OiBhZGRfY2hfYmFzZSA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsIGFkZF9jaF9iYXNlKTsKKyAgICB9CisgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgIGJvb2wgYl9jb250ZW50X3R5cGUgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgIEFMT0dWKCIldS4ldTogYl9jb250ZW50X3R5cGUgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIHN1YnN0cmVhbUlELCBCT09MU1RSKGJfY29udGVudF90eXBlKSk7CisgICAgaWYgKGJfY29udGVudF90eXBlKSB7CisgICAgICAgIENIRUNLX0JJVFNfTEVGVCgzKTsKKyAgICAgICAgdWludDMyX3QgY29udGVudF9jbGFzc2lmaWVyID0gbUJpdFJlYWRlci5nZXRCaXRzKDMpOworICAgICAgICBBTE9HVigiJXUuJXU6IGNvbnRlbnRfY2xhc3NpZmllciA9ICV1ICglcylcbiIsIHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCwKKyAgICAgICAgICAgIGNvbnRlbnRfY2xhc3NpZmllciwgQ29udGVudENsYXNzaWZpZXJbY29udGVudF9jbGFzc2lmaWVyXSk7CisKKyAgICAgICAgLy8gRm9yIHN0cmVhbXMgYmFzZWQgb24gVFMgMTAzIDE5MCBwYXJ0IDEgdGhlIHByZXNlbnRhdGlvbiBsZXZlbCBjaGFubmVsX21vZGUgZG9lc24ndAorICAgICAgICAvLyBleGlzdCBhbmQgc28gd2UgdXNlIHRoZSBjaGFubmVsX21vZGUgZnJvbSBlaXRoZXIgdGhlIENNIG9yIE0mRSBzdWJzdHJlYW0KKyAgICAgICAgLy8gKHRoZXkgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZSkKKyAgICAgICAgaWYgKG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbklEXS5tQ2hhbm5lbE1vZGUgPT0gLTEgJiYKKyAgICAgICAgICAgIChjb250ZW50X2NsYXNzaWZpZXIgPT0gMCB8fCBjb250ZW50X2NsYXNzaWZpZXIgPT0gMSkpIHsKKyAgICAgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbklEXS5tQ2hhbm5lbE1vZGUgPSBjaGFubmVsX21vZGU7CisgICAgICAgIH0KKyAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uSURdLm1Db250ZW50Q2xhc3NpZmllciA9IGNvbnRlbnRfY2xhc3NpZmllcjsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICBib29sIGJfbGFuZ3VhZ2VfaW5kaWNhdG9yID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1OiBiX2xhbmd1YWdlX2luZGljYXRvciA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgc3Vic3RyZWFtSUQsCisgICAgICAgICAgICBCT09MU1RSKGJfbGFuZ3VhZ2VfaW5kaWNhdG9yKSk7CisgICAgICAgIGlmIChiX2xhbmd1YWdlX2luZGljYXRvcikgeworICAgICAgICAgICAgaWYgKCFwYXJzZUxhbmd1YWdlVGFnKHByZXNlbnRhdGlvbklELCBzdWJzdHJlYW1JRCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRVRTSSBUUyAxMDMgMTkwLTIgdjEuMS4xIHNlY3Rpb24gRS4xMQorYm9vbCBBQzREU0lQYXJzZXI6OnBhcnNlU3Vic3RyZWFtR3JvdXBEU0kodWludDMyX3QgcHJlc2VudGF0aW9uSUQsIHVpbnQzMl90IGdyb3VwSUQpCit7CisgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgIGJvb2wgYl9zdWJzdHJlYW1zX3ByZXNlbnQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICBib29sIGJfaHNmX2V4dCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgIGJvb2wgYl9jaGFubmVsX2NvZGVkID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICBDSEVDS19CSVRTX0xFRlQoOCk7CisgICAgdWludDMyX3Qgbl9zdWJzdHJlYW1zID0gbUJpdFJlYWRlci5nZXRCaXRzKDgpOworICAgIEFMT0dWKCIldS4ldTogYl9zdWJzdHJlYW1zX3ByZXNlbnQgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsCisgICAgICAgIEJPT0xTVFIoYl9zdWJzdHJlYW1zX3ByZXNlbnQpKTsKKyAgICBBTE9HVigiJXUuJXU6IGJfaHNmX2V4dCA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgQk9PTFNUUihiX2hzZl9leHQpKTsKKyAgICBBTE9HVigiJXUuJXU6IGJfY2hhbm5lbF9jb2RlZCA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgQk9PTFNUUihiX2NoYW5uZWxfY29kZWQpKTsKKyAgICBBTE9HVigiJXUuJXU6IG5fc3Vic3RyZWFtcyA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgbl9zdWJzdHJlYW1zKTsKKworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuX3N1YnN0cmVhbXM7IGkrKykgeworICAgICAgICBDSEVDS19CSVRTX0xFRlQoMik7CisgICAgICAgIHVpbnQzMl90IGRzaV9zZl9tdWx0aXBsaWVyID0gbUJpdFJlYWRlci5nZXRCaXRzKDIpOworICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgIGJvb2wgYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICBBTE9HVigiJXUuJXUuJXU6IGRzaV9zZl9tdWx0aXBsaWVyID0gJXVcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLCBkc2lfc2ZfbXVsdGlwbGllcik7CisgICAgICAgIEFMT0dWKCIldS4ldS4ldTogYl9zdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksCisgICAgICAgICAgICBCT09MU1RSKGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yKSk7CisKKyAgICAgICAgaWYgKGJfc3Vic3RyZWFtX2JpdHJhdGVfaW5kaWNhdG9yKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNSk7CisgICAgICAgICAgICB1aW50MzJfdCBzdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IHN1YnN0cmVhbV9iaXRyYXRlX2luZGljYXRvciA9ICV1XG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwKKyAgICAgICAgICAgICAgICBzdWJzdHJlYW1fYml0cmF0ZV9pbmRpY2F0b3IpOworICAgICAgICB9CisgICAgICAgIGlmIChiX2NoYW5uZWxfY29kZWQpIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgyNCk7CisgICAgICAgICAgICB1aW50MzJfdCBkc2lfc3Vic3RyZWFtX2NoYW5uZWxfbWFzayA9IG1CaXRSZWFkZXIuZ2V0Qml0cygyNCk7CisgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IGRzaV9zdWJzdHJlYW1fY2hhbm5lbF9tYXNrID0gMHglMDZ4XG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwKKyAgICAgICAgICAgICAgICBkc2lfc3Vic3RyZWFtX2NoYW5uZWxfbWFzayk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICBib29sIGJfYWpvYyA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IGJfYWpvYyA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwgaSwgQk9PTFNUUihiX2Fqb2MpKTsKKyAgICAgICAgICAgIGlmIChiX2Fqb2MpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICAgICAgYm9vbCBiX3N0YXRpY19kbXggPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgIEFMT0dWKCIldS4ldS4ldTogYl9zdGF0aWNfZG14ID0gJXNcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLAorICAgICAgICAgICAgICAgICAgICBCT09MU1RSKGJfc3RhdGljX2RteCkpOworICAgICAgICAgICAgICAgIGlmICghYl9zdGF0aWNfZG14KSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg0KTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbl9kbXhfb2JqZWN0c19taW51czEgPSBtQml0UmVhZGVyLmdldEJpdHMoNCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldS4ldS4ldTogbl9kbXhfb2JqZWN0c19taW51czEgPSAldVxuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIGksCisgICAgICAgICAgICAgICAgICAgICAgICBuX2RteF9vYmplY3RzX21pbnVzMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg2KTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBuX3VteF9vYmplY3RzX21pbnVzMSA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg2KTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXUuJXUuJXU6IG5fdW14X29iamVjdHNfbWludXMxID0gJXVcbiIsIHByZXNlbnRhdGlvbklELCBncm91cElELCBpLAorICAgICAgICAgICAgICAgICAgICBuX3VteF9vYmplY3RzX21pbnVzMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNCk7CisgICAgICAgICAgICBtQml0UmVhZGVyLnNraXBCaXRzKDQpOyAvLyBvYmplY3RzX2Fzc2lnbm1lbnRfbWFzaworICAgICAgICB9CisgICAgfQorCisgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgIGJvb2wgYl9jb250ZW50X3R5cGUgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgIEFMT0dWKCIldS4ldTogYl9jb250ZW50X3R5cGUgPSAlc1xuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsIEJPT0xTVFIoYl9jb250ZW50X3R5cGUpKTsKKyAgICBpZiAoYl9jb250ZW50X3R5cGUpIHsKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDMpOworICAgICAgICB1aW50MzJfdCBjb250ZW50X2NsYXNzaWZpZXIgPSBtQml0UmVhZGVyLmdldEJpdHMoMyk7CisgICAgICAgIEFMT0dWKCIldS4ldTogY29udGVudF9jbGFzc2lmaWVyID0gJXMgKCV1KVxuIiwgcHJlc2VudGF0aW9uSUQsIGdyb3VwSUQsCisgICAgICAgICAgICBDb250ZW50Q2xhc3NpZmllcltjb250ZW50X2NsYXNzaWZpZXJdLCBjb250ZW50X2NsYXNzaWZpZXIpOworCisgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbklEXS5tQ29udGVudENsYXNzaWZpZXIgPSBjb250ZW50X2NsYXNzaWZpZXI7CisKKyAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICBib29sIGJfbGFuZ3VhZ2VfaW5kaWNhdG9yID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgQUxPR1YoIiV1LiV1OiBiX2xhbmd1YWdlX2luZGljYXRvciA9ICVzXG4iLCBwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCwKKyAgICAgICAgICAgIEJPT0xTVFIoYl9sYW5ndWFnZV9pbmRpY2F0b3IpKTsKKworICAgICAgICBpZiAoYl9sYW5ndWFnZV9pbmRpY2F0b3IpIHsKKyAgICAgICAgICAgIGlmICghcGFyc2VMYW5ndWFnZVRhZyhwcmVzZW50YXRpb25JRCwgZ3JvdXBJRCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBBQzREU0lQYXJzZXI6OnBhcnNlQml0cmF0ZURzaSgpIHsKKyAgICBDSEVDS19CSVRTX0xFRlQoMiArIDMyICsgMzIpOworICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMoMik7IC8vIGJpdF9yYXRlX21vZGUKKyAgICBtQml0UmVhZGVyLnNraXBCaXRzKDMyKTsgLy8gYml0X3JhdGUKKyAgICBtQml0UmVhZGVyLnNraXBCaXRzKDMyKTsgLy8gYml0X3JhdGVfcHJlY2lzaW9uCisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVFMgMTAzIDE5MC0xIHNlY3Rpb24gRS40IChhYzRfZHNpKSBhbmQgVFMgMTAzIDE5MC0yIHNlY3Rpb24gRS42IChhYzRfZHNpX3YxKQorYm9vbCBBQzREU0lQYXJzZXI6OnBhcnNlKCkgeworICAgIENIRUNLX0JJVFNfTEVGVCgzKTsKKyAgICB1aW50MzJfdCBhYzRfZHNpX3ZlcnNpb24gPSBtQml0UmVhZGVyLmdldEJpdHMoMyk7CisgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA+IDEpIHsKKyAgICAgICAgQUxPR0UoImVycm9yIHdoaWxlIHBhcnNpbmcgYWMtNCBkc2k6IG9ubHkgdmVyc2lvbnMgMCBhbmQgMSBhcmUgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBDSEVDS19CSVRTX0xFRlQoNyArIDEgKyA0ICsgOSk7CisgICAgdWludDMyX3QgYml0c3RyZWFtX3ZlcnNpb24gPSBtQml0UmVhZGVyLmdldEJpdHMoNyk7CisgICAgbUJpdFJlYWRlci5za2lwQml0cygxKTsgLy8gZnNfaW5kZXgKKyAgICBtQml0UmVhZGVyLnNraXBCaXRzKDQpOyAvLyBmcmFtZV9yYXRlX2luZGV4CisgICAgdWludDMyX3Qgbl9wcmVzZW50YXRpb25zID0gbUJpdFJlYWRlci5nZXRCaXRzKDkpOworCisgICAgaW50MzJfdCBzaG9ydF9wcm9ncmFtX2lkID0gLTE7CisgICAgaWYgKGJpdHN0cmVhbV92ZXJzaW9uID4gMSkgeworICAgICAgICBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIGFjNCBkc2kiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgIGJvb2wgYl9wcm9ncmFtX2lkID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgaWYgKGJfcHJvZ3JhbV9pZCkgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDE2ICsgMSk7CisgICAgICAgICAgICBzaG9ydF9wcm9ncmFtX2lkID0gbUJpdFJlYWRlci5nZXRCaXRzKDE2KTsKKyAgICAgICAgICAgIGJvb2wgYl91dWlkID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgIGlmIChiX3V1aWQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBrQUM0VVVJRFNpemVJbkJ5dGVzID0gMTY7CisgICAgICAgICAgICAgICAgY2hhciBwcm9ncmFtX3V1aWRba0FDNFVVSURTaXplSW5CeXRlc107CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKGtBQzRVVUlEU2l6ZUluQnl0ZXMgKiA4KTsKKyAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwga0FDNFVVSURTaXplSW5CeXRlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2dyYW1fdXVpZFtpXSA9IChjaGFyKShtQml0UmVhZGVyLmdldEJpdHMoOCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiVVVJRCA9ICVzIiwgcHJvZ3JhbV91dWlkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPT0gMSkgeworICAgICAgICBpZiAoIXBhcnNlQml0cmF0ZURzaSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgQllURV9BTElHTjsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMl90IHByZXNlbnRhdGlvbiA9IDA7IHByZXNlbnRhdGlvbiA8IG5fcHJlc2VudGF0aW9uczsgcHJlc2VudGF0aW9uKyspIHsKKyAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tUHJvZ3JhbUlEID0gc2hvcnRfcHJvZ3JhbV9pZDsKKyAgICAgICAgLy8ga25vd24gYXMgYl9zaW5nbGVfc3Vic3RyZWFtIGluIGFjNF9kc2lfdmVyc2lvbiAwCisgICAgICAgIGJvb2wgYl9zaW5nbGVfc3Vic3RyZWFtX2dyb3VwID0gZmFsc2U7CisgICAgICAgIHVpbnQzMl90IHByZXNlbnRhdGlvbl9jb25maWcgPSAwLCBwcmVzZW50YXRpb25fdmVyc2lvbiA9IDA7CisgICAgICAgIHVpbnQzMl90IHByZXNfYnl0ZXMgPSAwOworICAgICAgICB1aW50NjRfdCBzdGFydCA9IDA7CisKKyAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSArIDUgKyA1KTsKKyAgICAgICAgICAgIGJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICBwcmVzZW50YXRpb25fY29uZmlnID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgcHJlc2VudGF0aW9uX3ZlcnNpb24gPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgIH0gZWxzZSBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg4ICsgOCk7CisgICAgICAgICAgICBwcmVzZW50YXRpb25fdmVyc2lvbiA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgIHByZXNfYnl0ZXMgPSBtQml0UmVhZGVyLmdldEJpdHMoOCk7CisgICAgICAgICAgICBpZiAocHJlc19ieXRlcyA9PSAweGZmKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDE2KTsKKyAgICAgICAgICAgICAgICBwcmVzX2J5dGVzICs9IG1CaXRSZWFkZXIuZ2V0Qml0cygxNik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiJXU6IHByZXNfYnl0ZXMgPSAldVxuIiwgcHJlc2VudGF0aW9uLCBwcmVzX2J5dGVzKTsKKyAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA+IDIpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQocHJlc19ieXRlcyAqIDgpOworICAgICAgICAgICAgICAgIG1CaXRSZWFkZXIuc2tpcEJpdHMocHJlc19ieXRlcyAqIDgpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogcmVjb3JkIGEgbWFya2VyLCBsZXNzIHRoZSBzaXplIG9mIHRoZSBwcmVzZW50YXRpb25fY29uZmlnICovCisgICAgICAgICAgICBzdGFydCA9IChtRFNJU2l6ZSAtIG1CaXRSZWFkZXIubnVtQml0c0xlZnQoKSkgLyA4OworICAgICAgICAgICAgLy8gYWM0X3ByZXNlbnRhdGlvbl92MF9kc2koKSwgYWM0X3ByZXNlbnRhdGlvbl92MV9kc2koKSBhbmQgYWM0X3ByZXNlbnRhdGlvbl92Ml9kc2koKQorICAgICAgICAgICAgLy8gYWxsIHN0YXJ0IHdpdGggYSBwcmVzZW50YXRpb25fY29uZmlnIG9mIDUgYml0cworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgICAgICAgICAgcHJlc2VudGF0aW9uX2NvbmZpZyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgIGJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCA9IChwcmVzZW50YXRpb25fY29uZmlnID09IDB4MWYpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgKlByZXNlbnRhdGlvbkNvbmZpZ1tdID0geworICAgICAgICAgICAgIk11c2ljJkVmZmVjdHMgKyBEaWFsb2ciLAorICAgICAgICAgICAgIk1haW4gKyBERSIsCisgICAgICAgICAgICAiTWFpbiArIEFzc29jaWF0ZSIsCisgICAgICAgICAgICAiTXVzaWMmRWZmZWN0cyArIERpYWxvZyArIEFzc29jaWF0ZSIsCisgICAgICAgICAgICAiTWFpbiArIERFICsgQXNzb2NpYXRlIiwKKyAgICAgICAgICAgICJBcmJpdHJhcnkgc3Vic3RyZWFtIGdyb3VwcyIsCisgICAgICAgICAgICAiRU1ERiBvbmx5IgorICAgICAgICB9OworICAgICAgICBBTE9HVigiJXU6IGJfc2luZ2xlX3N1YnN0cmVhbS9ncm91cCA9ICVzXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICBCT09MU1RSKGJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCkpOworICAgICAgICBBTE9HVigiJXU6IHByZXNlbnRhdGlvbl92ZXJzaW9uID0gJXVcbiIsIHByZXNlbnRhdGlvbiwgcHJlc2VudGF0aW9uX3ZlcnNpb24pOworICAgICAgICBBTE9HVigiJXU6IHByZXNlbnRhdGlvbl9jb25maWcgPSAldSAoJXMpXG4iLCBwcmVzZW50YXRpb24sIHByZXNlbnRhdGlvbl9jb25maWcsCisgICAgICAgICAgICAocHJlc2VudGF0aW9uX2NvbmZpZyA+PSBORUxFTShQcmVzZW50YXRpb25Db25maWcpID8KKyAgICAgICAgICAgICJyZXNlcnZlZCIgOiBQcmVzZW50YXRpb25Db25maWdbcHJlc2VudGF0aW9uX2NvbmZpZ10pKTsKKworICAgICAgICBib29sIGJfYWRkX2VtZGZfc3Vic3RyZWFtcyA9IGZhbHNlOworICAgICAgICBpZiAoIWJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCAmJiBwcmVzZW50YXRpb25fY29uZmlnID09IDYpIHsKKyAgICAgICAgICAgIGJfYWRkX2VtZGZfc3Vic3RyZWFtcyA9IHRydWU7CisgICAgICAgICAgICBBTE9HVigiJXU6IGJfYWRkX2VtZGZfc3Vic3RyZWFtcyA9ICVzXG4iLCBwcmVzZW50YXRpb24sIEJPT0xTVFIoYl9hZGRfZW1kZl9zdWJzdHJlYW1zKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMyArIDEpOworICAgICAgICAgICAgdWludDMyX3QgbWRjb21wYXQgPSBtQml0UmVhZGVyLmdldEJpdHMoMyk7CisgICAgICAgICAgICBBTE9HVigiJXU6IG1kY29tcGF0ID0gJWRcbiIsIHByZXNlbnRhdGlvbiwgbWRjb21wYXQpOworCisgICAgICAgICAgICBib29sIGJfcHJlc2VudGF0aW9uX2dyb3VwX2luZGV4ID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgIEFMT0dWKCIldTogYl9wcmVzZW50YXRpb25fZ3JvdXBfaW5kZXggPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgIEJPT0xTVFIoYl9wcmVzZW50YXRpb25fZ3JvdXBfaW5kZXgpKTsKKyAgICAgICAgICAgIGlmIChiX3ByZXNlbnRhdGlvbl9ncm91cF9pbmRleCkgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg1KTsKKyAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1Hcm91cEluZGV4ID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgICAgIEFMT0dWKCIldTogcHJlc2VudGF0aW9uX2dyb3VwX2luZGV4ID0gJWRcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tR3JvdXBJbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMik7CisgICAgICAgICAgICB1aW50MzJfdCBkc2lfZnJhbWVfcmF0ZV9tdWx0aXBseV9pbmZvID0gbUJpdFJlYWRlci5nZXRCaXRzKDIpOworICAgICAgICAgICAgQUxPR1YoIiV1OiBkc2lfZnJhbWVfcmF0ZV9tdWx0aXBseV9pbmZvID0gJWRcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICBkc2lfZnJhbWVfcmF0ZV9tdWx0aXBseV9pbmZvKTsKKyAgICAgICAgICAgIGlmIChhYzRfZHNpX3ZlcnNpb24gPT0gMSAmJiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMSB8fCBwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAyKSkgeworICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgyKTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBkc2lfZnJhbWVfcmF0ZV9mcmFjdGlvbl9pbmZvID0gbUJpdFJlYWRlci5nZXRCaXRzKDIpOworICAgICAgICAgICAgICAgIEFMT0dWKCIldTogZHNpX2ZyYW1lX3JhdGVfZnJhY3Rpb25faW5mbyA9ICVkXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgIGRzaV9mcmFtZV9yYXRlX2ZyYWN0aW9uX2luZm8pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUgKyAxMCk7CisgICAgICAgICAgICB1aW50MzJfdCBwcmVzZW50YXRpb25fZW1kZl92ZXJzaW9uID0gbUJpdFJlYWRlci5nZXRCaXRzKDUpOworICAgICAgICAgICAgdWludDMyX3QgcHJlc2VudGF0aW9uX2tleV9pZCA9IG1CaXRSZWFkZXIuZ2V0Qml0cygxMCk7CisgICAgICAgICAgICBBTE9HVigiJXU6IHByZXNlbnRhdGlvbl9lbWRmX3ZlcnNpb24gPSAlZFxuIiwgcHJlc2VudGF0aW9uLCBwcmVzZW50YXRpb25fZW1kZl92ZXJzaW9uKTsKKyAgICAgICAgICAgIEFMT0dWKCIldTogcHJlc2VudGF0aW9uX2tleV9pZCA9ICVkXG4iLCBwcmVzZW50YXRpb24sIHByZXNlbnRhdGlvbl9rZXlfaWQpOworCisgICAgICAgICAgICBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgICAgICBib29sIGJfcHJlc2VudGF0aW9uX2NoYW5uZWxfY29kZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBiX3ByZXNlbnRhdGlvbl9jaGFubmVsX2NvZGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICAgICAgICAgIGJfcHJlc2VudGF0aW9uX2NoYW5uZWxfY29kZWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGJfcHJlc2VudGF0aW9uX2NoYW5uZWxfY29kZWQgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICBCT09MU1RSKGJfcHJlc2VudGF0aW9uX2NoYW5uZWxfY29kZWQpKTsKKyAgICAgICAgICAgICAgICBpZiAoYl9wcmVzZW50YXRpb25fY2hhbm5lbF9jb2RlZCkgeworICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMSB8fCBwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoNSk7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkc2lfcHJlc2VudGF0aW9uX2NoX21vZGUgPSBtQml0UmVhZGVyLmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1DaGFubmVsTW9kZSA9IGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlID0gJWQgKCVzKVxuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc2lfcHJlc2VudGF0aW9uX2NoX21vZGUgPCBORUxFTShDaGFubmVsTW9kZXMpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsTW9kZXNbZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlXSA6ICJyZXNlcnZlZCIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHNpX3ByZXNlbnRhdGlvbl9jaF9tb2RlID49IDExICYmIGRzaV9wcmVzZW50YXRpb25fY2hfbW9kZSA8PSAxNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxICsgMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlc19iXzRfYmFja19jaGFubmVsc19wcmVzZW50ID0gbUJpdFJlYWRlci5nZXRCaXRzKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZXNfdG9wX2NoYW5uZWxfcGFpcnMgPSBtQml0UmVhZGVyLmdldEJpdHMoMik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzX2JfNF9iYWNrX2NoYW5uZWxzX3ByZXNlbnQgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MU1RSKHByZXNfYl80X2JhY2tfY2hhbm5lbHNfcHJlc2VudCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogcHJlc190b3BfY2hhbm5lbF9wYWlycyA9ICVkXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXNfdG9wX2NoYW5uZWxfcGFpcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIHByZXNlbnRhdGlvbl9jaGFubmVsX21hc2sgaW4gYWM0X3ByZXNlbnRhdGlvbl92MF9kc2koKQorICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMjQpOworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVzZW50YXRpb25fY2hhbm5lbF9tYXNrX3YxID0gbUJpdFJlYWRlci5nZXRCaXRzKDI0KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBwcmVzZW50YXRpb25fY2hhbm5lbF9tYXNrX3YxID0gMHglMDZ4XG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25fY2hhbm5lbF9tYXNrX3YxKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID09IDEgfHwgcHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMikgeworICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMSk7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgYl9wcmVzZW50YXRpb25fY29yZV9kaWZmZXJzID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiV1OiBiX3ByZXNlbnRhdGlvbl9jb3JlX2RpZmZlcnMgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgQk9PTFNUUihiX3ByZXNlbnRhdGlvbl9jb3JlX2RpZmZlcnMpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGJfcHJlc2VudGF0aW9uX2NvcmVfZGlmZmVycykgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBiX3ByZXNlbnRhdGlvbl9jb3JlX2NoYW5uZWxfY29kZWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJfcHJlc2VudGF0aW9uX2NvcmVfY2hhbm5lbF9jb2RlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQml0UmVhZGVyLnNraXBCaXRzKDIpOyAvLyBkc2lfcHJlc2VudGF0aW9uX2NoYW5uZWxfbW9kZV9jb3JlCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICBib29sIGJfcHJlc2VudGF0aW9uX2ZpbHRlciA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9wcmVzZW50YXRpb25fZmlsdGVyID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJPT0xTVFIoYl9wcmVzZW50YXRpb25fZmlsdGVyKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChiX3ByZXNlbnRhdGlvbl9maWx0ZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxICsgOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJfZW5hYmxlX3ByZXNlbnRhdGlvbiA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWJfZW5hYmxlX3ByZXNlbnRhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVzZW50YXRpb25zW3ByZXNlbnRhdGlvbl0ubUVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9lbmFibGVfcHJlc2VudGF0aW9uID0gJXNcbiIsIHByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MU1RSKGJfZW5hYmxlX3ByZXNlbnRhdGlvbikpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbl9maWx0ZXJfYnl0ZXMgPSBtQml0UmVhZGVyLmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQobl9maWx0ZXJfYnl0ZXMgKiA4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBuX2ZpbHRlcl9ieXRlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cyg4KTsgLy8gZmlsdGVyX2RhdGEKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLyogYWM0X2RzaV92ZXJzaW9uID09IDEgKi8KKworICAgICAgICAgICAgaWYgKGJfc2luZ2xlX3N1YnN0cmVhbV9ncm91cCkgeworICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1EU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKGFjNF9kc2lfdmVyc2lvbiA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBiX211bHRpX3BpZCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9tdWx0aV9waWQgPSAlc1xuIiwgcHJlc2VudGF0aW9uLCBCT09MU1RSKGJfbXVsdGlfcGlkKSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgICAgICAgICBib29sIGJfaHNmX2V4dCA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogYl9oc2ZfZXh0ID0gJXNcbiIsIHByZXNlbnRhdGlvbiwgQk9PTFNUUihiX2hzZl9leHQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3dpdGNoIChwcmVzZW50YXRpb25fY29uZmlnKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwOgorICAgICAgICAgICAgICAgIGNhc2UgMToKKyAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtR3JvdXBEU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICBjYXNlIDQ6CisgICAgICAgICAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtRFNJKHByZXNlbnRhdGlvbiwgMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXBhcnNlU3Vic3RyZWFtR3JvdXBEU0kocHJlc2VudGF0aW9uLCAwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIDEpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbUdyb3VwRFNJKHByZXNlbnRhdGlvbiwgMikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSA1OgorICAgICAgICAgICAgICAgICAgICBpZiAocHJlc2VudGF0aW9uX3ZlcnNpb24gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwYXJzZVN1YnN0cmVhbURTSShwcmVzZW50YXRpb24sIDApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbl9zdWJzdHJlYW1fZ3JvdXBzX21pbnVzMiA9IG1CaXRSZWFkZXIuZ2V0Qml0cygzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIldTogbl9zdWJzdHJlYW1fZ3JvdXBzX21pbnVzMiA9ICVkXG4iLCBwcmVzZW50YXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbl9zdWJzdHJlYW1fZ3JvdXBzX21pbnVzMik7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHVpbnQzMl90IHNnID0gMDsgc2cgPCBuX3N1YnN0cmVhbV9ncm91cHNfbWludXMyICsgMjsgc2crKykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcGFyc2VTdWJzdHJlYW1Hcm91cERTSShwcmVzZW50YXRpb24sIHNnKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCg3KTsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgbl9za2lwX2J5dGVzID0gbUJpdFJlYWRlci5nZXRCaXRzKDcpOworICAgICAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQobl9za2lwX2J5dGVzICogOCkKKyAgICAgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IG5fc2tpcF9ieXRlczsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQml0UmVhZGVyLmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEgKyAxKTsKKyAgICAgICAgICAgIGJvb2wgYl9wcmVfdmlydHVhbGl6ZWQgPSAobUJpdFJlYWRlci5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgbVByZXNlbnRhdGlvbnNbcHJlc2VudGF0aW9uXS5tUHJlVmlydHVhbGl6ZWQgPSBiX3ByZV92aXJ0dWFsaXplZDsKKyAgICAgICAgICAgIGJfYWRkX2VtZGZfc3Vic3RyZWFtcyA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICBBTE9HVigiJXU6IGJfcHJlX3ZpcnR1YWxpemVkID0gJXNcbiIsIHByZXNlbnRhdGlvbiwgQk9PTFNUUihiX3ByZV92aXJ0dWFsaXplZCkpOworICAgICAgICAgICAgQUxPR1YoIiV1OiBiX2FkZF9lbWRmX3N1YnN0cmVhbXMgPSAlc1xuIiwgcHJlc2VudGF0aW9uLAorICAgICAgICAgICAgICAgIEJPT0xTVFIoYl9hZGRfZW1kZl9zdWJzdHJlYW1zKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGJfYWRkX2VtZGZfc3Vic3RyZWFtcykgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDcpOworICAgICAgICAgICAgdWludDMyX3Qgbl9hZGRfZW1kZl9zdWJzdHJlYW1zID0gbUJpdFJlYWRlci5nZXRCaXRzKDcpOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IG5fYWRkX2VtZGZfc3Vic3RyZWFtczsgaisrKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUgKyAxMCk7CisgICAgICAgICAgICAgICAgdWludDMyX3Qgc3Vic3RyZWFtX2VtZGZfdmVyc2lvbiA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBzdWJzdHJlYW1fa2V5X2lkID0gbUJpdFJlYWRlci5nZXRCaXRzKDEwKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXU6IGVtZGZfc3Vic3RyZWFtWyVkXTogdmVyc2lvbj0lZCwga2V5X2lkPSVkXG4iLCBwcmVzZW50YXRpb24sIGosCisgICAgICAgICAgICAgICAgICAgIHN1YnN0cmVhbV9lbWRmX3ZlcnNpb24sIHN1YnN0cmVhbV9rZXlfaWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgYm9vbCBiX3ByZXNlbnRhdGlvbl9iaXRyYXRlX2luZm8gPSBmYWxzZTsKKyAgICAgICAgaWYgKHByZXNlbnRhdGlvbl92ZXJzaW9uID4gMCkgeworICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDEpOworICAgICAgICAgICAgYl9wcmVzZW50YXRpb25fYml0cmF0ZV9pbmZvID0gKG1CaXRSZWFkZXIuZ2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dWKCJiX3ByZXNlbnRhdGlvbl9iaXRyYXRlX2luZm8gPSAlc1xuIiwgQk9PTFNUUihiX3ByZXNlbnRhdGlvbl9iaXRyYXRlX2luZm8pKTsKKyAgICAgICAgaWYgKGJfcHJlc2VudGF0aW9uX2JpdHJhdGVfaW5mbykgeworICAgICAgICAgICAgaWYgKCFwYXJzZUJpdHJhdGVEc2koKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChwcmVzZW50YXRpb25fdmVyc2lvbiA+IDApIHsKKyAgICAgICAgICAgIENIRUNLX0JJVFNfTEVGVCgxKTsKKyAgICAgICAgICAgIGJvb2wgYl9hbHRlcm5hdGl2ZSA9IChtQml0UmVhZGVyLmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICBBTE9HVigiYl9hbHRlcm5hdGl2ZSA9ICVzXG4iLCBCT09MU1RSKGJfYWx0ZXJuYXRpdmUpKTsKKyAgICAgICAgICAgIGlmIChiX2FsdGVybmF0aXZlKSB7CisgICAgICAgICAgICAgICAgQllURV9BTElHTjsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoMTYpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IG5hbWVfbGVuID0gbUJpdFJlYWRlci5nZXRCaXRzKDE2KTsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQobmFtZV9sZW4gKiA4KTsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmcHJlc2VudGF0aW9uX25hbWUgPQorICAgICAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1EZXNjcmlwdGlvbjsKKyAgICAgICAgICAgICAgICBwcmVzZW50YXRpb25fbmFtZS5jbGVhcigpOworICAgICAgICAgICAgICAgIHByZXNlbnRhdGlvbl9uYW1lLnJlc2l6ZShuYW1lX2xlbik7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5hbWVfbGVuOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uX25hbWVbaV0gPSAoY2hhcikobUJpdFJlYWRlci5nZXRCaXRzKDgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQ0hFQ0tfQklUU19MRUZUKDUpOworICAgICAgICAgICAgICAgIHVpbnQzMl90IG5fdGFyZ2V0cyA9IG1CaXRSZWFkZXIuZ2V0Qml0cyg1KTsKKyAgICAgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQobl90YXJnZXRzICogKDMgKyA4KSk7CisgICAgICAgICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG5fdGFyZ2V0czsgaSsrKXsKKyAgICAgICAgICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cygzKTsgLy8gdGFyZ2V0X21kX2NvbXBhdAorICAgICAgICAgICAgICAgICAgICBtQml0UmVhZGVyLnNraXBCaXRzKDgpOyAvLyB0YXJnZXRfZGV2aWNlX2NhdGVnb3J5CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgQllURV9BTElHTjsKKworICAgICAgICBpZiAoYWM0X2RzaV92ZXJzaW9uID09IDEpIHsKKyAgICAgICAgICAgIHVpbnQ2NF90IGVuZCA9IChtRFNJU2l6ZSAtIG1CaXRSZWFkZXIubnVtQml0c0xlZnQoKSkgLyA4OworICAgICAgICAgICAgdWludDY0X3QgcHJlc2VudGF0aW9uX2J5dGVzID0gZW5kIC0gc3RhcnQ7CisgICAgICAgICAgICB1aW50NjRfdCBza2lwX2J5dGVzID0gcHJlc19ieXRlcyAtIHByZXNlbnRhdGlvbl9ieXRlczsKKyAgICAgICAgICAgIEFMT0dWKCJza2lwcGluZyA9ICUiIFBSSXU2NCAiIGJ5dGVzIiwgc2tpcF9ieXRlcyk7CisgICAgICAgICAgICBDSEVDS19CSVRTX0xFRlQoc2tpcF9ieXRlcyAqIDgpOworICAgICAgICAgICAgbUJpdFJlYWRlci5za2lwQml0cyhza2lwX2J5dGVzICogOCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB3ZSBzaG91bGQga25vdyB0aGlzIG9yIHNvbWV0aGluZyBpcyBwcm9iYWJseSB3cm9uZworICAgICAgICAvLyB3aXRoIHRoZSBiaXRzdHJlYW0gKG9yIHdlIGRvbid0IHN1cHBvcnQgaXQpCisgICAgICAgIGlmIChtUHJlc2VudGF0aW9uc1twcmVzZW50YXRpb25dLm1DaGFubmVsTW9kZSA9PSAtMSkgeworICAgICAgICAgICAgQUxPR0UoImNvdWxkIG5vdCBkZXRlcm1pbmcgY2hhbm5lbCBtb2RlIG9mIHByZXNlbnRhdGlvbiAlZCIsIHByZXNlbnRhdGlvbik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9IC8qIGVhY2ggcHJlc2VudGF0aW9uICovCisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FDNFBhcnNlci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQUM0UGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNiNmUzMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FDNFBhcnNlci5oCkBAIC0wLDAgKzEsMTA5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBQzRfUEFSU0VSX0hfCisjZGVmaW5lIEFDNF9QQVJTRVJfSF8KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEFDNFBhcnNlciB7CitwdWJsaWM6CisgICAgQUM0UGFyc2VyKCk7CisgICAgdmlydHVhbCB+QUM0UGFyc2VyKCkgeyB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcGFyc2UoKSA9IDA7CisKKyAgICBzdHJ1Y3QgQUM0UHJlc2VudGF0aW9uIHsKKyAgICAgICAgaW50MzJfdCBtQ2hhbm5lbE1vZGUgPSAtMTsKKyAgICAgICAgaW50MzJfdCBtUHJvZ3JhbUlEID0gLTE7CisgICAgICAgIGludDMyX3QgbUdyb3VwSW5kZXggPSAtMTsKKworICAgICAgICAvLyBUUyAxMDMgMTkwLTEgdjEuMi4xIDQuMy4zLjguMQorICAgICAgICBlbnVtIENvbnRlbnRDbGFzc2lmaWVycyB7CisgICAgICAgICAgICBrQ29tcGxldGVNYWluLAorICAgICAgICAgICAga011c2ljQW5kRWZmZWN0cywKKyAgICAgICAgICAgIGtWaXN1YWxseUltcGFpcmVkLAorICAgICAgICAgICAga0hlYXJpbmdJbXBhaXJlZCwKKyAgICAgICAgICAgIGtEaWFsb2csCisgICAgICAgICAgICBrQ29tbWVudGFyeSwKKyAgICAgICAgICAgIGtFbWVyZ2VuY3ksCisgICAgICAgICAgICBrVm9pY2VPdmVyCisgICAgICAgIH07CisKKyAgICAgICAgdWludDMyX3QgbUNvbnRlbnRDbGFzc2lmaWVyID0ga0NvbXBsZXRlTWFpbjsKKworICAgICAgICAvLyBFVFNJIFRTIDEwMyAxOTAtMiBWMS4xLjEgKDIwMTUtMDkpIFRhYmxlIDc5OiBjaGFubmVsX21vZGUKKyAgICAgICAgZW51bSBJbnB1dENoYW5uZWxNb2RlIHsKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV9Nb25vLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlX1N0ZXJlbywKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV8zXzAsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfNV8wLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzVfMSwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzBfMzQsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18xXzM0LAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMF81MiwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzFfNTIsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfN18wXzMyMiwKKyAgICAgICAgICAgIGtDaGFubmVsTW9kZV83XzFfMzIyLAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMF80LAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzdfMV80LAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzlfMF80LAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzlfMV80LAorICAgICAgICAgICAga0NoYW5uZWxNb2RlXzIyXzIsCisgICAgICAgICAgICBrQ2hhbm5lbE1vZGVfUmVzZXJ2ZWQsCisgICAgICAgIH07CisKKyAgICAgICAgYm9vbCBtSGFzRGlhbG9nRW5oYW5jZW1lbnRzID0gZmFsc2U7CisgICAgICAgIGJvb2wgbVByZVZpcnR1YWxpemVkID0gZmFsc2U7CisgICAgICAgIGJvb2wgbUVuYWJsZWQgPSB0cnVlOworCisgICAgICAgIHN0ZDo6c3RyaW5nIG1MYW5ndWFnZTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbURlc2NyaXB0aW9uOworICAgIH07CisgICAgdHlwZWRlZiBzdGQ6Om1hcDx1aW50MzJfdCwgQUM0UHJlc2VudGF0aW9uPiBBQzRQcmVzZW50YXRpb25zOworCisgICAgY29uc3QgQUM0UHJlc2VudGF0aW9ucyYgZ2V0UHJlc2VudGF0aW9ucygpIGNvbnN0IHsgcmV0dXJuIG1QcmVzZW50YXRpb25zOyB9CisKK3Byb3RlY3RlZDoKKyAgICBBQzRQcmVzZW50YXRpb25zIG1QcmVzZW50YXRpb25zOworfTsKKworY2xhc3MgQUM0RFNJUGFyc2VyOiBwdWJsaWMgQUM0UGFyc2VyIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBBQzREU0lQYXJzZXIoQUJpdFJlYWRlciAmYnIpOworICAgIHZpcnR1YWwgfkFDNERTSVBhcnNlcigpIHsgfQorCisgICAgYm9vbCBwYXJzZSgpOworCitwcml2YXRlOgorICAgIGJvb2wgcGFyc2VTdWJzdHJlYW1EU0kodWludDMyX3QgcHJlc2VudGF0aW9uSUQsIHVpbnQzMl90IHN1YnN0cmVhbUlEKTsKKyAgICBib29sIHBhcnNlU3Vic3RyZWFtR3JvdXBEU0kodWludDMyX3QgcHJlc2VudGF0aW9uSUQsIHVpbnQzMl90IGdyb3VwSUQpOworICAgIGJvb2wgcGFyc2VMYW5ndWFnZVRhZyh1aW50MzJfdCBwcmVzZW50YXRpb25JRCwgdWludDMyX3Qgc3Vic3RyZWFtSUQpOworICAgIGJvb2wgcGFyc2VCaXRyYXRlRHNpKCk7CisKKyAgICB1aW50NjRfdCBtRFNJU2l6ZTsKKyAgICBBQml0UmVhZGVyJiBtQml0UmVhZGVyOworfTsKKworfTsKKworI2VuZGlmICAvLyBBQzRfUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvQW5kcm9pZC5icAppbmRleCBmMzE2ZGY2Li5kOWYxMWZjIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0FuZHJvaWQuYnAKQEAgLTIsNiArMiw3IEBACiAgICAgbmFtZTogImxpYm1wNGV4dHJhY3Rvcl9kZWZhdWx0cyIsCiAKICAgICBzcmNzOiBbCisgICAgICAgICJBQzRQYXJzZXIuY3BwIiwKICAgICAgICAgIkl0ZW1UYWJsZS5jcHAiLAogICAgICAgICAiTVBFRzRFeHRyYWN0b3IuY3BwIiwKICAgICAgICAgIlNhbXBsZUl0ZXJhdG9yLmNwcCIsCkBAIC0xNCw3ICsxNSw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIgogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwpAQCAtMzQsNyArMzUsNyBAQAogICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJmaXJzdCIsCiB9CiAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogCiAKICAgICBuYW1lOiAibGlibXA0ZXh0cmFjdG9yIiwKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuY3BwCmluZGV4IGE0NjJkZTkuLjA3NzMzODcgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvSXRlbVRhYmxlLmNwcApAQCAtMTcsOCArMTcsMTEgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiSXRlbVRhYmxlIgogCisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKwogI2luY2x1ZGUgPEl0ZW1UYWJsZS5oPgotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KQEAgLTkyLDcgKzk1LDcgQEAKIAogc3RydWN0IEJveCB7CiBwcm90ZWN0ZWQ6Ci0gICAgQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIHVpbnQzMl90IHR5cGUpIDoKKyAgICBCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCB1aW50MzJfdCB0eXBlKSA6CiAgICAgICAgIG1EYXRhU291cmNlKHNvdXJjZSksIG1UeXBlKHR5cGUpIHt9CiAKICAgICB2aXJ0dWFsIH5Cb3goKSB7fQpAQCAtMTA0LDE0ICsxMDcsMTQgQEAKIAogICAgIGlubGluZSB1aW50MzJfdCB0eXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KIAotICAgIGlubGluZSBEYXRhU291cmNlQmFzZSAqc291cmNlKCkgY29uc3QgeyByZXR1cm4gbURhdGFTb3VyY2U7IH0KKyAgICBpbmxpbmUgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKCkgY29uc3QgeyByZXR1cm4gbURhdGFTb3VyY2U7IH0KIAogICAgIHN0YXR1c190IHBhcnNlQ2h1bmsob2ZmNjRfdCAqb2Zmc2V0KTsKIAogICAgIHN0YXR1c190IHBhcnNlQ2h1bmtzKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CiAKIHByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIHVpbnQzMl90IG1UeXBlOwogfTsKIApAQCAtMTg2LDcgKzE4OSw3IEBACiAKIHN0cnVjdCBGdWxsQm94IDogcHVibGljIEJveCB7CiBwcm90ZWN0ZWQ6Ci0gICAgRnVsbEJveChEYXRhU291cmNlQmFzZSAqc291cmNlLCB1aW50MzJfdCB0eXBlKSA6CisgICAgRnVsbEJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIHVpbnQzMl90IHR5cGUpIDoKICAgICAgICAgQm94KHNvdXJjZSwgdHlwZSksIG1WZXJzaW9uKDApLCBtRmxhZ3MoMCkge30KIAogICAgIGlubGluZSB1aW50OF90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtVmVyc2lvbjsgfQpAQCAtMjIxLDcgKzIyNCw3IEBACiAvLwogCiBzdHJ1Y3QgUGl0bUJveCA6IHB1YmxpYyBGdWxsQm94IHsKLSAgICBQaXRtQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UpIDoKKyAgICBQaXRtQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkgOgogICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCJwaXRtIikpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIHVpbnQzMl90ICpwcmltYXJ5SXRlbUlkKTsKQEAgLTMwMSw3ICszMDQsNyBAQAogfTsKIAogc3RydWN0IElsb2NCb3ggOiBwdWJsaWMgRnVsbEJveCB7Ci0gICAgSWxvY0JveChEYXRhU291cmNlQmFzZSAqc291cmNlLCBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSXRlbUxvYz4gKml0ZW1Mb2NzKSA6CisgICAgSWxvY0JveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIEtleWVkVmVjdG9yPHVpbnQzMl90LCBJdGVtTG9jPiAqaXRlbUxvY3MpIDoKICAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygiaWxvYyIpKSwKICAgICAgICAgbUl0ZW1Mb2NzKGl0ZW1Mb2NzKSwgbUhhc0NvbnN0cnVjdE1ldGhvZDEoZmFsc2UpIHt9CiAKQEAgLTQyMywxMCArNDI2LDggQEAKICAgICAgICAgfQogICAgICAgICBBTE9HVigiZXh0ZW50X2NvdW50ICVkIiwgZXh0ZW50X2NvdW50KTsKIAotICAgICAgICBpZiAoZXh0ZW50X2NvdW50ID4gMSAmJiAob2Zmc2V0X3NpemUgPT0gMCB8fCBsZW5ndGhfc2l6ZSA9PSAwKSkgewotICAgICAgICAgICAgLy8gaWYgdGhlIGl0ZW0gaXMgZGl2aWRlYyBpbnRvIG1vcmUgdGhhbiBvbmUgZXh0ZW50cywgb2Zmc2V0IGFuZAotICAgICAgICAgICAgLy8gbGVuZ3RoIG11c3QgYmUgcHJlc2VudC4KLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIGlmIChleHRlbnRfY291bnQgPiAxKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgIH0KICAgICAgICAgb2Zmc2V0ICs9IDI7CiAKQEAgLTQ3MSw3ICs0NzIsNyBAQAogLy8KIAogc3RydWN0IEl0ZW1SZWZlcmVuY2UgOiBwdWJsaWMgQm94LCBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgSXRlbVJlZmVyZW5jZShEYXRhU291cmNlQmFzZSAqc291cmNlLCB1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBpdGVtSWRTaXplKSA6CisgICAgSXRlbVJlZmVyZW5jZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IGl0ZW1JZFNpemUpIDoKICAgICAgICAgQm94KHNvdXJjZSwgdHlwZSksIG1JdGVtSWQoMCksIG1SZWZJZFNpemUoaXRlbUlkU2l6ZSkge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CkBAIC02MjYsNyArNjI3LDcgQEAKIH0KIAogc3RydWN0IElyZWZCb3ggOiBwdWJsaWMgRnVsbEJveCB7Ci0gICAgSXJlZkJveChEYXRhU291cmNlQmFzZSAqc291cmNlLCBWZWN0b3I8c3A8SXRlbVJlZmVyZW5jZT4gPiAqaXRlbVJlZnMpIDoKKyAgICBJcmVmQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgVmVjdG9yPHNwPEl0ZW1SZWZlcmVuY2U+ID4gKml0ZW1SZWZzKSA6CiAgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoImlyZWYiKSksIG1SZWZJZFNpemUoMCksIG1JdGVtUmVmcyhpdGVtUmVmcykge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CkBAIC02ODgsNyArNjg5LDcgQEAKIH07CiAKIHN0cnVjdCBJc3BlQm94IDogcHVibGljIEZ1bGxCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgewotICAgIElzcGVCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgOgorICAgIElzcGVCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKSA6CiAgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoImlzcGUiKSksIG1XaWR0aCgwKSwgbUhlaWdodCgwKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKQEAgLTY5OSw4ICs3MDAsOCBAQAogICAgIH0KIAogcHJpdmF0ZToKLSAgICB1aW50MzJfdCBtV2lkdGg7Ci0gICAgdWludDMyX3QgbUhlaWdodDsKKyAgICBpbnQzMl90IG1XaWR0aDsKKyAgICBpbnQzMl90IG1IZWlnaHQ7CiB9OwogCiBzdGF0dXNfdCBJc3BlQm94OjpwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIHsKQEAgLTcxNCwxNyArNzE1LDI0IEBACiAgICAgaWYgKHNpemUgPCA4KSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQotICAgIGlmICghc291cmNlKCktPmdldFVJbnQzMihvZmZzZXQsICZtV2lkdGgpCi0gICAgICAgICAgICB8fCAhc291cmNlKCktPmdldFVJbnQzMihvZmZzZXQgKyA0LCAmbUhlaWdodCkpIHsKKyAgICBpZiAoIXNvdXJjZSgpLT5nZXRVSW50MzIob2Zmc2V0LCAodWludDMyX3QgKikmbVdpZHRoKQorICAgICAgICAgICAgfHwgIXNvdXJjZSgpLT5nZXRVSW50MzIob2Zmc2V0ICsgNCwgKHVpbnQzMl90ICopJm1IZWlnaHQpKSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICB9Ci0gICAgQUxPR1YoInByb3BlcnR5IGlzcGU6ICVkeCVkIiwgbVdpZHRoLCBtSGVpZ2h0KTsKIAorICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIGRpbWVuc2lvbiBkb2Vzbid0IGNhdXNlIG92ZXJmbG93IG9uIGNhbGN1bGF0ZWQgbWF4IGlucHV0IHNpemUuCisgICAgLy8gTWF4IGlucHV0IHNpemUgaXMgd2lkdGgqaGVpZ2h0KjEuNSwgcmVzdHJpY3Qgd2lkdGgqaGVpZ2h0IHRvIDE8PDI5IHNvIHRoYXQKKyAgICAvLyB3ZSBkb24ndCBuZWVkIHRvIGNhc3QgdG8gaW50NjRfdCB3aGVuIGRvaW5nIG11bHRzLgorICAgIGlmIChtV2lkdGggPD0gMCB8fCBtSGVpZ2h0IDw9IDAgfHwgbVdpZHRoID4gKDEgPDwgMjkpIC8gbUhlaWdodCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIEFMT0dWKCJwcm9wZXJ0eSBpc3BlOiAlZHglZCIsIG1XaWR0aCwgbUhlaWdodCk7CiAgICAgcmV0dXJuIE9LOwogfQogCiBzdHJ1Y3QgSHZjY0JveCA6IHB1YmxpYyBCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgewotICAgIEh2Y2NCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgOgorICAgIEh2Y2NCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKSA6CiAgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygiaHZjQyIpKSB7fQogCiAgICAgc3RhdHVzX3QgcGFyc2Uob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKQEAgLTc1Nyw3ICs3NjUsNyBAQAogfQogCiBzdHJ1Y3QgSXJvdEJveCA6IHB1YmxpYyBCb3gsIHB1YmxpYyBJdGVtUHJvcGVydHkgewotICAgIElyb3RCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgOgorICAgIElyb3RCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKSA6CiAgICAgICAgIEJveChzb3VyY2UsIEZPVVJDQygiaXJvdCIpKSwgbUFuZ2xlKDApIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwpAQCAtNzg2LDcgKzc5NCw3IEBACiB9CiAKIHN0cnVjdCBDb2xyQm94IDogcHVibGljIEJveCwgcHVibGljIEl0ZW1Qcm9wZXJ0eSB7Ci0gICAgQ29sckJveChEYXRhU291cmNlQmFzZSAqc291cmNlKSA6CisgICAgQ29sckJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UpIDoKICAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCJjb2xyIikpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwpAQCAtODM0LDcgKzg0Miw3IEBACiB9CiAKIHN0cnVjdCBJcG1hQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIElwbWFCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICphc3NvY2lhdGlvbnMpIDoKKyAgICBJcG1hQm94KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICphc3NvY2lhdGlvbnMpIDoKICAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygiaXBtYSIpKSwgbUFzc29jaWF0aW9ucyhhc3NvY2lhdGlvbnMpIHt9CiAKICAgICBzdGF0dXNfdCBwYXJzZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwpAQCAtOTA4LDcgKzkxNiw3IEBACiB9CiAKIHN0cnVjdCBJcGNvQm94IDogcHVibGljIEJveCB7Ci0gICAgSXBjb0JveChEYXRhU291cmNlQmFzZSAqc291cmNlLCBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICpwcm9wZXJ0aWVzKSA6CisgICAgSXBjb0JveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIFZlY3RvcjxzcDxJdGVtUHJvcGVydHk+ID4gKnByb3BlcnRpZXMpIDoKICAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCJpcGNvIikpLCBtSXRlbVByb3BlcnRpZXMocHJvcGVydGllcykge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CkBAIC05NjUsNyArOTczLDcgQEAKIH0KIAogc3RydWN0IElwcnBCb3ggOiBwdWJsaWMgQm94IHsKLSAgICBJcHJwQm94KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgSXBycEJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsCiAgICAgICAgICAgICBWZWN0b3I8c3A8SXRlbVByb3BlcnR5PiA+ICpwcm9wZXJ0aWVzLAogICAgICAgICAgICAgVmVjdG9yPEFzc29jaWF0aW9uRW50cnk+ICphc3NvY2lhdGlvbnMpIDoKICAgICAgICAgQm94KHNvdXJjZSwgRk9VUkNDKCJpcHJwIikpLApAQCAtMTAyMiw3ICsxMDMwLDcgQEAKIH07CiAKIHN0cnVjdCBJbmZlQm94IDogcHVibGljIEZ1bGxCb3ggewotICAgIEluZmVCb3goRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkgOgorICAgIEluZmVCb3goRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKSA6CiAgICAgICAgIEZ1bGxCb3goc291cmNlLCBGT1VSQ0MoImluZmUiKSkge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgSXRlbUluZm8gKml0ZW1JbmZvKTsKQEAgLTExMjcsMjAgKzExMzUsMTkgQEAKIH0KIAogc3RydWN0IElpbmZCb3ggOiBwdWJsaWMgRnVsbEJveCB7Ci0gICAgSWluZkJveChEYXRhU291cmNlQmFzZSAqc291cmNlLCBWZWN0b3I8SXRlbUluZm8+ICppdGVtSW5mb3MpIDoKLSAgICAgICAgRnVsbEJveChzb3VyY2UsIEZPVVJDQygiaWluZiIpKSwKLSAgICAgICAgbUl0ZW1JbmZvcyhpdGVtSW5mb3MpLCBtSGFzR3JpZHMoZmFsc2UpIHt9CisgICAgSWluZkJveChEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIFZlY3RvcjxJdGVtSW5mbz4gKml0ZW1JbmZvcykgOgorICAgICAgICBGdWxsQm94KHNvdXJjZSwgRk9VUkNDKCJpaW5mIikpLCBtSXRlbUluZm9zKGl0ZW1JbmZvcykge30KIAogICAgIHN0YXR1c190IHBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CiAKLSAgICBib29sIGhhc0dyaWRzKCkgeyByZXR1cm4gbUhhc0dyaWRzOyB9CisgICAgYm9vbCBoYXNGb3VyQ0ModWludDMyX3QgdHlwZSkgeyByZXR1cm4gbUZvdXJDQ1NlZW4uY291bnQodHlwZSkgPiAwOyB9CiAKIHByb3RlY3RlZDoKICAgICBzdGF0dXNfdCBvbkNodW5rRGF0YSh1aW50MzJfdCB0eXBlLCBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogICAgIFZlY3RvcjxJdGVtSW5mbz4gKm1JdGVtSW5mb3M7Ci0gICAgYm9vbCBtSGFzR3JpZHM7CisgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHVpbnQzMl90PiBtRm91ckNDU2VlbjsKIH07CiAKIHN0YXR1c190IElpbmZCb3g6OnBhcnNlKG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSkgewpAQCAtMTE4Nyw3ICsxMTk0LDcgQEAKICAgICBzdGF0dXNfdCBlcnIgPSBpbmZlQm94LnBhcnNlKG9mZnNldCwgc2l6ZSwgJml0ZW1JbmZvKTsKICAgICBpZiAoZXJyID09IE9LKSB7CiAgICAgICAgIG1JdGVtSW5mb3MtPnB1c2hfYmFjayhpdGVtSW5mbyk7Ci0gICAgICAgIG1IYXNHcmlkcyB8PSAoaXRlbUluZm8uaXRlbVR5cGUgPT0gRk9VUkNDKCJncmlkIikpOworICAgICAgICBtRm91ckNDU2Vlbi5pbnNlcnQoaXRlbUluZm8uaXRlbVR5cGUpOwogICAgIH0KICAgICAvLyBJbmZlQm94IHBhcnNlIHJldHVybnMgRVJST1JfVU5TVVBQT1JURUQgaWYgdGhlIGJveCBpZiBhbiB1bnN1cHBvcnRlZAogICAgIC8vIHZlcnNpb24uIElnbm9yZSB0aGlzIGVycm9yIGFzIGl0J3Mgbm90IGZhdGFsLgpAQCAtMTE5Niw3ICsxMjAzLDcgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLUl0ZW1UYWJsZTo6SXRlbVRhYmxlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitJdGVtVGFibGU6Okl0ZW1UYWJsZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbVByaW1hcnlJdGVtSWQoMCksCiAgICAgICBtSWRhdE9mZnNldCgwKSwKQEAgLTEyNzYsNyArMTI4Myw3IEBACiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCi0gICAgaWYgKGlpbmZCb3guaGFzR3JpZHMoKSkgeworICAgIGlmIChpaW5mQm94Lmhhc0ZvdXJDQyhGT1VSQ0MoImdyaWQiKSkgfHwgaWluZkJveC5oYXNGb3VyQ0MoRk9VUkNDKCJFeGlmIikpKSB7CiAgICAgICAgIG1SZXF1aXJlZEJveGVzLmluc2VydCgnaXJlZicpOwogICAgIH0KIApAQCAtMTQ3Niw3ICsxNDgzLDcgQEAKICAgICByZXR1cm4gbUltYWdlSXRlbXNWYWxpZCA/IG1EaXNwbGF5YWJsZXMuc2l6ZSgpIDogMDsKIH0KIAotc3A8TWV0YURhdGE+IEl0ZW1UYWJsZTo6Z2V0SW1hZ2VNZXRhKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgpIHsKK0FNZWRpYUZvcm1hdCAqSXRlbVRhYmxlOjpnZXRJbWFnZU1ldGEoY29uc3QgdWludDMyX3QgaW1hZ2VJbmRleCkgewogICAgIGlmICghbUltYWdlSXRlbXNWYWxpZCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0xNTAxLDY0ICsxNTA4LDgyIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKLSAgICBtZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfSU1BR0VfQU5EUk9JRF9IRUlDKTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyk7CiAKICAgICBpZiAoaW1hZ2UtPml0ZW1JZCA9PSBtUHJpbWFyeUl0ZW1JZCkgewotICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VHJhY2tJc0RlZmF1bHQsIDEpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19ERUZBVUxULCAxKTsKICAgICB9CiAKICAgICBBTE9HVigiaW1hZ2VbJXVdOiBzaXplICVkeCVkIiwgaW1hZ2VJbmRleCwgaW1hZ2UtPndpZHRoLCBpbWFnZS0+aGVpZ2h0KTsKIAotICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgaW1hZ2UtPndpZHRoKTsKLSAgICBtZXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBpbWFnZS0+aGVpZ2h0KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgaW1hZ2UtPndpZHRoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsIGltYWdlLT5oZWlnaHQpOwogICAgIGlmIChpbWFnZS0+cm90YXRpb24gIT0gMCkgewogICAgICAgICAvLyBSb3RhdGlvbiBhbmdsZSBpbiBIRUlGIGlzIENDVywgY29udmVydCB0byBDVyBoZXJlIHRvIGJlCiAgICAgICAgIC8vIGNvbnNpc3RlbnQgd2l0aCB0aGUgb3RoZXIgbWVkaWEgZm9ybWF0cy4KICAgICAgICAgc3dpdGNoKGltYWdlLT5yb3RhdGlvbikgewotICAgICAgICAgICAgY2FzZSA5MDogbWV0YS0+c2V0SW50MzIoa0tleVJvdGF0aW9uLCAyNzApOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTgwOiBtZXRhLT5zZXRJbnQzMihrS2V5Um90YXRpb24sIDE4MCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyNzA6IG1ldGEtPnNldEludDMyKGtLZXlSb3RhdGlvbiwgOTApOyBicmVhazsKKyAgICAgICAgICAgIGNhc2UgOTA6CisgICAgICAgICAgICBjYXNlIDE4MDoKKyAgICAgICAgICAgIGNhc2UgMjcwOgorICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1JPVEFUSU9OLCAzNjAgLSBpbWFnZS0+cm90YXRpb24pOworICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDogYnJlYWs7IC8vIGRvbid0IHNldCBpZiBpbnZhbGlkCiAgICAgICAgIH0KICAgICB9Ci0gICAgbWV0YS0+c2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCAqIDEuNSk7CisgICAgLy8gd2UgdmFsaWRhdGVkIG5vIG92ZXJmbG93IGluIElzcGVCb3g6OnBhcnNlKCkKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsIGltYWdlLT53aWR0aCAqIGltYWdlLT5oZWlnaHQgKiAzIC8gMik7CiAKICAgICBpZiAoIWltYWdlLT50aHVtYm5haWxzLmVtcHR5KCkpIHsKICAgICAgICAgc3NpemVfdCB0aHVtYkl0ZW1JbmRleCA9IG1JdGVtSWRUb0l0ZW1NYXAuaW5kZXhPZktleShpbWFnZS0+dGh1bWJuYWlsc1swXSk7CiAgICAgICAgIGlmICh0aHVtYkl0ZW1JbmRleCA+PSAwKSB7CiAgICAgICAgICAgICBjb25zdCBJbWFnZUl0ZW0gJnRodW1ibmFpbCA9IG1JdGVtSWRUb0l0ZW1NYXBbdGh1bWJJdGVtSW5kZXhdOwogCi0gICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGh1bWJuYWlsV2lkdGgsIHRodW1ibmFpbC53aWR0aCk7Ci0gICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5VGh1bWJuYWlsSGVpZ2h0LCB0aHVtYm5haWwuaGVpZ2h0KTsKLSAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVRodW1ibmFpbEhWQ0MsIGtUeXBlSFZDQywKLSAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsLmh2Y2MtPmRhdGEoKSwgdGh1bWJuYWlsLmh2Y2MtPnNpemUoKSk7Ci0gICAgICAgICAgICBBTE9HVigiaW1hZ2VbJXVdOiB0aHVtYm5haWw6IHNpemUgJWR4JWQsIGl0ZW0gaW5kZXggJXpkIiwKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmRleCwgdGh1bWJuYWlsLndpZHRoLCB0aHVtYm5haWwuaGVpZ2h0LCB0aHVtYkl0ZW1JbmRleCk7CisgICAgICAgICAgICBpZiAodGh1bWJuYWlsLmh2Y2MgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfV0lEVEgsIHRodW1ibmFpbC53aWR0aCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9IRUlHSFQsIHRodW1ibmFpbC5oZWlnaHQpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0NTRF9IRVZDLAorICAgICAgICAgICAgICAgICAgICAgICAgdGh1bWJuYWlsLmh2Y2MtPmRhdGEoKSwgdGh1bWJuYWlsLmh2Y2MtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgQUxPR1YoImltYWdlWyV1XTogdGh1bWJuYWlsOiBzaXplICVkeCVkLCBpdGVtIGluZGV4ICV6ZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZGV4LCB0aHVtYm5haWwud2lkdGgsIHRodW1ibmFpbC5oZWlnaHQsIHRodW1iSXRlbUluZGV4KTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiB0aHVtYm5haWwgZGF0YSBpcyBtaXNzaW5nIGZvciBpbWFnZVsldV0hIiwgX19GVU5DVElPTl9fLCBpbWFnZUluZGV4KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dXKCIlczogUmVmZXJlbmNlZCB0aHVtYm5haWwgZG9lcyBub3QgZXhpc3QhIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChpbWFnZS0+aXNHcmlkKCkpIHsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUdyaWRSb3dzLCBpbWFnZS0+cm93cyk7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlHcmlkQ29scywgaW1hZ2UtPmNvbHVtbnMpOwotCisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9ST1dTLCBpbWFnZS0+cm93cyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9DT0xVTU5TLCBpbWFnZS0+Y29sdW1ucyk7CiAgICAgICAgIC8vIHBvaW50IGltYWdlIHRvIHRoZSBmaXJzdCB0aWxlIGZvciBncmlkIHNpemUgYW5kIEhWQ0MKICAgICAgICAgaW1hZ2UgPSAmbUl0ZW1JZFRvSXRlbU1hcC5lZGl0VmFsdWVBdCh0aWxlSXRlbUluZGV4KTsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRpbGVXaWR0aCwgaW1hZ2UtPndpZHRoKTsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRpbGVIZWlnaHQsIGltYWdlLT5oZWlnaHQpOwotICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBpbWFnZS0+d2lkdGggKiBpbWFnZS0+aGVpZ2h0ICogMS41KTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9USUxFX1dJRFRILCBpbWFnZS0+d2lkdGgpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RJTEVfSEVJR0hULCBpbWFnZS0+aGVpZ2h0KTsKKyAgICAgICAgLy8gd2UgdmFsaWRhdGVkIG5vIG92ZXJmbG93IGluIElzcGVCb3g6OnBhcnNlKCkKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgaW1hZ2UtPndpZHRoICogaW1hZ2UtPmhlaWdodCAqIDMgLyAyKTsKICAgICB9CiAKICAgICBpZiAoaW1hZ2UtPmh2Y2MgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiJXM6IGh2Y2MgaXMgbWlzc2luZyBmb3IgaW1hZ2VbJXVdISIsIF9fRlVOQ1RJT05fXywgaW1hZ2VJbmRleCk7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KLSAgICBtZXRhLT5zZXREYXRhKGtLZXlIVkNDLCBrVHlwZUhWQ0MsIGltYWdlLT5odmNjLT5kYXRhKCksIGltYWdlLT5odmNjLT5zaXplKCkpOworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsIGltYWdlLT5odmNjLT5kYXRhKCksIGltYWdlLT5odmNjLT5zaXplKCkpOwogCiAgICAgaWYgKGltYWdlLT5pY2MgIT0gTlVMTCkgewotICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlJY2NQcm9maWxlLCAwLCBpbWFnZS0+aWNjLT5kYXRhKCksIGltYWdlLT5pY2MtPnNpemUoKSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0lDQ19QUk9GSUxFLCBpbWFnZS0+aWNjLT5kYXRhKCksIGltYWdlLT5pY2MtPnNpemUoKSk7CiAgICAgfQogICAgIHJldHVybiBtZXRhOwogfQpAQCAtMTY3MSw4ICsxNjk2LDMxIEBACiAgICAgfQogCiAgICAgLy8gc2tpcCB0aGUgZmlyc3QgNC1ieXRlIG9mIHRoZSBvZmZzZXQgdG8gVElGRiBoZWFkZXIKLSAgICAqb2Zmc2V0ID0gbUl0ZW1JZFRvRXhpZk1hcFtleGlmSW5kZXhdLm9mZnNldCArIDQ7Ci0gICAgKnNpemUgPSBtSXRlbUlkVG9FeGlmTWFwW2V4aWZJbmRleF0uc2l6ZSAtIDQ7CisgICAgdWludDMyX3QgdGlmZk9mZnNldDsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICBtSXRlbUlkVG9FeGlmTWFwW2V4aWZJbmRleF0ub2Zmc2V0LCAmdGlmZk9mZnNldCwgNCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIC8vIFdlIG5lZWQgJ0V4aWZcMFwwJyBiZWZvcmUgdGhlIHRpZmYgaGVhZGVyCisgICAgdGlmZk9mZnNldCA9IG50b2hsKHRpZmZPZmZzZXQpOworICAgIGlmICh0aWZmT2Zmc2V0IDwgNikgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICAvLyBUaGUgZmlyc3QgNC1ieXRlIG9mIHRoZSBpdGVtIGlzIHRoZSBvZmZzZXQgb2YgdGhlIHRpZmYgaGVhZGVyIHdpdGhpbiB0aGUKKyAgICAvLyBleGlmIGRhdGEuIFRoZSBzaXplIG9mIHRoZSBpdGVtIHNob3VsZCBiZSA+IDQgZm9yIGEgbm9uLWVtcHR5IGV4aWYgKHRoaXMKKyAgICAvLyB3YXMgYWxyZWFkeSBjaGVja2VkIHdoZW4gdGhlIGl0ZW0gd2FzIGFkZGVkKS4gQWxzbyBjaGVjayB0aGF0IHRoZSB0aWZmCisgICAgLy8gaGVhZGVyIG9mZnNldCBpcyB2YWxpZC4KKyAgICBpZiAobUl0ZW1JZFRvRXhpZk1hcFtleGlmSW5kZXhdLnNpemUgPD0gNCB8fAorICAgICAgICAgICAgdGlmZk9mZnNldCA+IG1JdGVtSWRUb0V4aWZNYXBbZXhpZkluZGV4XS5zaXplIC0gNCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIC8vIE9mZnNldCBvZiAnRXhpZlwwXDAnIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgJ0V4aWYnIGl0ZW0KKyAgICAvLyAoZmlyc3QgNC1ieXRlIGlzIHRoZSB0aWZmIGhlYWRlciBvZmZzZXQpCisgICAgdWludDMyX3QgZXhpZk9mZnNldCA9IDQgKyB0aWZmT2Zmc2V0IC0gNjsKKyAgICAqb2Zmc2V0ID0gbUl0ZW1JZFRvRXhpZk1hcFtleGlmSW5kZXhdLm9mZnNldCArIGV4aWZPZmZzZXQ7CisgICAgKnNpemUgPSBtSXRlbUlkVG9FeGlmTWFwW2V4aWZJbmRleF0uc2l6ZSAtIGV4aWZPZmZzZXQ7CiAgICAgcmV0dXJuIE9LOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9JdGVtVGFibGUuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5oCmluZGV4IDUzNmRjYjAuLmJlODFiNTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L0l0ZW1UYWJsZS5oCkBAIC0xOSwxMyArMTksMTUgQEAKIAogI2luY2x1ZGUgPHNldD4KIAorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CisKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIERhdGFTb3VyY2VCYXNlOworY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKIGNsYXNzIE1ldGFEYXRhOwogCiBuYW1lc3BhY2UgaGVpZiB7CkBAIC00NSwxMyArNDcsMTMgQEAKIAogY2xhc3MgSXRlbVRhYmxlIDogcHVibGljIFJlZkJhc2UgewogcHVibGljOgotICAgIGV4cGxpY2l0IEl0ZW1UYWJsZShEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBJdGVtVGFibGUoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKIAogICAgIHN0YXR1c190IHBhcnNlKHVpbnQzMl90IHR5cGUsIG9mZjY0X3Qgb2Zmc2V0LCBzaXplX3Qgc2l6ZSk7CiAKICAgICBib29sIGlzVmFsaWQoKSB7IHJldHVybiBtSW1hZ2VJdGVtc1ZhbGlkOyB9CiAgICAgdWludDMyX3QgY291bnRJbWFnZXMoKSBjb25zdDsKLSAgICBzcDxNZXRhRGF0YT4gZ2V0SW1hZ2VNZXRhKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgpOworICAgIEFNZWRpYUZvcm1hdCAqZ2V0SW1hZ2VNZXRhKGNvbnN0IHVpbnQzMl90IGltYWdlSW5kZXgpOwogICAgIHN0YXR1c190IGZpbmRJbWFnZUl0ZW0oY29uc3QgdWludDMyX3QgaW1hZ2VJbmRleCwgdWludDMyX3QgKml0ZW1JbmRleCk7CiAgICAgc3RhdHVzX3QgZmluZFRodW1ibmFpbEl0ZW0oY29uc3QgdWludDMyX3QgaW1hZ2VJbmRleCwgdWludDMyX3QgKml0ZW1JbmRleCk7CiAgICAgc3RhdHVzX3QgZ2V0SW1hZ2VPZmZzZXRBbmRTaXplKApAQCAtNjIsNyArNjQsNyBAQAogICAgIH5JdGVtVGFibGUoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAKICAgICBLZXllZFZlY3Rvcjx1aW50MzJfdCwgSXRlbUxvYz4gbUl0ZW1Mb2NzOwogICAgIFZlY3RvcjxJdGVtSW5mbz4gbUl0ZW1JbmZvczsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcApvbGQgbW9kZSAxMDA2NDQKbmV3IG1vZGUgMTAwNzU1CmluZGV4IDAxNDIzMzMuLjg2ZWQ2MTAKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmNwcApAQCAtMjQsMjggKzI0LDMxIEBACiAjaW5jbHVkZSA8c3RkbGliLmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlICJBQzRQYXJzZXIuaCIKICNpbmNsdWRlICJNUEVHNEV4dHJhY3Rvci5oIgogI2luY2x1ZGUgIlNhbXBsZVRhYmxlLmgiCiAjaW5jbHVkZSAiSXRlbVRhYmxlLmgiCiAjaW5jbHVkZSAiaW5jbHVkZS9FU0RTLmgiCiAKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0V4dHJhY3RvclV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJpdFJlYWRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiAjaW5jbHVkZSA8Ynl0ZXN3YXAuaD4KQEAgLTY4LDM3ICs3MSwzOCBAQAogICAgIGtNYXhBdG9tU2l6ZSA9IDY0ICogMTAyNCAqIDEwMjQsCiB9OwogCitjbGFzcyBNUEVHNFNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKIHN0YXRpYyBjb25zdCBzaXplX3QgIGtNYXhQY21GcmFtZVNpemUgPSA4MTkyOwotCi1jbGFzcyBNUEVHNFNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKIHB1YmxpYzoKICAgICAvLyBDYWxsZXIgcmV0YWlucyBvd25lcnNoaXAgb2YgYm90aCAiZGF0YVNvdXJjZSIgYW5kICJzYW1wbGVUYWJsZSIuCi0gICAgTVBFRzRTb3VyY2UoTWV0YURhdGFCYXNlICZmb3JtYXQsCi0gICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCisgICAgTVBFRzRTb3VyY2UoQU1lZGlhRm9ybWF0ICpmb3JtYXQsCisgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqZGF0YVNvdXJjZSwKICAgICAgICAgICAgICAgICBpbnQzMl90IHRpbWVTY2FsZSwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxTYW1wbGVUYWJsZT4gJnNhbXBsZVRhYmxlLAogICAgICAgICAgICAgICAgIFZlY3RvcjxTaWR4RW50cnk+ICZzaWR4LAogICAgICAgICAgICAgICAgIGNvbnN0IFRyZXggKnRyZXgsCiAgICAgICAgICAgICAgICAgb2ZmNjRfdCBmaXJzdE1vb2ZPZmZzZXQsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3A8SXRlbVRhYmxlPiAmaXRlbVRhYmxlKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxJdGVtVGFibGU+ICZpdGVtVGFibGUsCisgICAgICAgICAgICAgICAgdWludDY0X3QgZWxzdFNoaWZ0U3RhcnRUaWNrcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0KCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBib29sIHN1cHBvcnROb25ibG9ja2luZ1JlYWQoKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBmcmFnbWVudGVkUmVhZChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIGJvb2wgc3VwcG9ydHNOb25CbG9ja2luZ1JlYWQoKSBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBmcmFnbWVudGVkUmVhZCgKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOwogCiAgICAgdmlydHVhbCB+TVBFRzRTb3VyY2UoKTsKIAogcHJpdmF0ZToKICAgICBNdXRleCBtTG9jazsKIAotICAgIE1ldGFEYXRhQmFzZSAmbUZvcm1hdDsKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRm9ybWF0ICptRm9ybWF0OworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOwogICAgIGludDMyX3QgbVRpbWVzY2FsZTsKICAgICBzcDxTYW1wbGVUYWJsZT4gbVNhbXBsZVRhYmxlOwogICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlSW5kZXg7CkBAIC0xMDgsNyArMTEyLDcgQEAKICAgICBvZmY2NF90IG1GaXJzdE1vb2ZPZmZzZXQ7CiAgICAgb2ZmNjRfdCBtQ3VycmVudE1vb2ZPZmZzZXQ7CiAgICAgb2ZmNjRfdCBtTmV4dE1vb2ZPZmZzZXQ7Ci0gICAgdWludDMyX3QgbUN1cnJlbnRUaW1lOworICAgIHVpbnQzMl90IG1DdXJyZW50VGltZTsgLy8gaW4gbWVkaWEgdGltZXNjYWxlIHRpY2tzCiAgICAgaW50MzJfdCBtTGFzdFBhcnNlZFRyYWNrSWQ7CiAgICAgaW50MzJfdCBtVHJhY2tJZDsKIApAQCAtMTI5LDE2ICsxMzMsMTMgQEAKIAogICAgIGJvb2wgbUlzQVZDOwogICAgIGJvb2wgbUlzSEVWQzsKKyAgICBib29sIG1Jc0FDNDsKICAgICBib29sIG1Jc1BjbTsKICAgICBzaXplX3QgbU5BTExlbmd0aFNpemU7CiAKICAgICBib29sIG1TdGFydGVkOwogCi0gICAgTWVkaWFCdWZmZXJHcm91cCAqbUdyb3VwOwotCi0gICAgTWVkaWFCdWZmZXJCYXNlICptQnVmZmVyOwotCi0gICAgYm9vbCBtV2FudHNOQUxGcmFnbWVudHM7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKm1CdWZmZXI7CiAKICAgICB1aW50OF90ICptU3JjQnVmZmVyOwogCkBAIC0xNDYsNiArMTQ3LDEwIEBACiAgICAgYm9vbCBtSXNBdWRpbzsKICAgICBzcDxJdGVtVGFibGU+IG1JdGVtVGFibGU7CiAKKyAgICAvLyBTdGFydCBvZmZzZXQgZnJvbSBjb21wb3NpdGlvbiB0aW1lIHRvIHByZXNlbnRhdGlvbiB0aW1lLgorICAgIC8vIFN1cHBvcnQgc2hpZnQgb25seSBmb3IgdmlkZW8gdHJhY2tzIHRocm91Z2ggbUVsc3RTaGlmdFN0YXJ0VGlja3MgZm9yIG5vdy4KKyAgICB1aW50NjRfdCBtRWxzdFNoaWZ0U3RhcnRUaWNrczsKKwogICAgIHNpemVfdCBwYXJzZU5BTFNpemUoY29uc3QgdWludDhfdCAqZGF0YSkgY29uc3Q7CiAgICAgc3RhdHVzX3QgcGFyc2VDaHVuayhvZmY2NF90ICpvZmZzZXQpOwogICAgIHN0YXR1c190IHBhcnNlVHJhY2tGcmFnbWVudEhlYWRlcihvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCBzaXplKTsKQEAgLTE1NCw2ICsxNTksOCBAQAogICAgIHN0YXR1c190IHBhcnNlU2FtcGxlQXV4aWxpYXJ5SW5mb3JtYXRpb25PZmZzZXRzKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IHNpemUpOwogICAgIHN0YXR1c190IHBhcnNlQ2xlYXJFbmNyeXB0ZWRTaXplcyhvZmY2NF90IG9mZnNldCwgYm9vbCBpc1N1YnNhbXBsZUVuY3J5cHRpb24sIHVpbnQzMl90IGZsYWdzKTsKICAgICBzdGF0dXNfdCBwYXJzZVNhbXBsZUVuY3J5cHRpb24ob2ZmNjRfdCBvZmZzZXQpOworICAgIC8vIHJldHVybnMgLTEgZm9yIGludmFsaWQgbGF5ZXIgSUQKKyAgICBpbnQzMl90IHBhcnNlSEVWQ0xheWVySWQoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwogCiAgICAgc3RydWN0IFRyYWNrRnJhZ21lbnRIZWFkZXJJbmZvIHsKICAgICAgICAgZW51bSBGbGFncyB7CkBAIC0xOTksMTQgKzIwNiwxNCBAQAogLy8gcG9zc2libHkgd3JhcHBpbmcgbXVsdGlwbGUgdGltZXMgdG8gY292ZXIgYWxsIHRyYWNrcywgaS5lLgogLy8gRWFjaCBDYWNoZWRSYW5nZWREYXRhU291cmNlIGNhY2hlcyB0aGUgc2FtcGxldGFibGUgbWV0YWRhdGEgZm9yIGEgc2luZ2xlIHRyYWNrLgogCi1zdHJ1Y3QgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlQmFzZSB7Ci0gICAgZXhwbGljaXQgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZShEYXRhU291cmNlQmFzZSAqc291cmNlKTsKK2NsYXNzIENhY2hlZFJhbmdlZERhdGFTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZUhlbHBlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogICAgIHZpcnR1YWwgfkNhY2hlZFJhbmdlZERhdGFTb3VyY2UoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKLSAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCk7CisgICAgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpIG92ZXJyaWRlOworICAgIHVpbnQzMl90IGZsYWdzKCkgb3ZlcnJpZGU7CiAKICAgICBzdGF0dXNfdCBzZXRDYWNoZWRSYW5nZShvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUsIGJvb2wgYXNzdW1lU291cmNlT3duZXJzaGlwT25TdWNjZXNzKTsKIApAQCAtMjE0LDcgKzIyMSw3IEBACiBwcml2YXRlOgogICAgIE11dGV4IG1Mb2NrOwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1Tb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbVNvdXJjZTsKICAgICBib29sIG1Pd25zRGF0YVNvdXJjZTsKICAgICBvZmY2NF90IG1DYWNoZWRPZmZzZXQ7CiAgICAgc2l6ZV90IG1DYWNoZWRTaXplOwpAQCAtMjI2LDggKzIzMyw5IEBACiAgICAgQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IENhY2hlZFJhbmdlZERhdGFTb3VyY2UgJik7CiB9OwogCi1DYWNoZWRSYW5nZWREYXRhU291cmNlOjpDYWNoZWRSYW5nZWREYXRhU291cmNlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCi0gICAgOiBtU291cmNlKHNvdXJjZSksCitDYWNoZWRSYW5nZWREYXRhU291cmNlOjpDYWNoZWRSYW5nZWREYXRhU291cmNlKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKKyAgICA6IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSwKKyAgICAgIG1Tb3VyY2Uoc291cmNlKSwKICAgICAgIG1Pd25zRGF0YVNvdXJjZShmYWxzZSksCiAgICAgICBtQ2FjaGVkT2Zmc2V0KDApLAogICAgICAgbUNhY2hlZFNpemUoMCksCkBAIC0yMzcsNyArMjQ1LDcgQEAKIENhY2hlZFJhbmdlZERhdGFTb3VyY2U6On5DYWNoZWRSYW5nZWREYXRhU291cmNlKCkgewogICAgIGNsZWFyQ2FjaGUoKTsKICAgICBpZiAobU93bnNEYXRhU291cmNlKSB7Ci0gICAgICAgIGRlbGV0ZSAoQ2FjaGVkUmFuZ2VkRGF0YVNvdXJjZSopbVNvdXJjZTsKKyAgICAgICAgZGVsZXRlIG1Tb3VyY2U7CiAgICAgfQogfQogCkBAIC0yNTEsMTAgKzI1OSw2IEBACiAgICAgbUNhY2hlZFNpemUgPSAwOwogfQogCi1zdGF0dXNfdCBDYWNoZWRSYW5nZWREYXRhU291cmNlOjppbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPmluaXRDaGVjaygpOwotfQotCiBzc2l6ZV90IENhY2hlZFJhbmdlZERhdGFTb3VyY2U6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCkBAIC0zMTYsNiArMzIwLDkgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoInNhd2IiKToKICAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0I7CiAKKyAgICAgICAgY2FzZSBGT1VSQ0MoImVjLTMiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzOworCiAgICAgICAgIGNhc2UgRk9VUkNDKCJtcDR2Iik6CiAgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQ7CiAKQEAgLTMzMCwxMyArMzM3LDIzIEBACiAgICAgICAgIGNhc2UgRk9VUkNDKCJodmMxIik6CiAgICAgICAgIGNhc2UgRk9VUkNDKCJoZXYxIik6CiAgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQzsKKyAgICAgICAgY2FzZSBGT1VSQ0MoImFjLTQiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQ7CisgICAgICAgIGNhc2UgRk9VUkNDKCJPcHVzIik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUzsKIAogICAgICAgICBjYXNlIEZPVVJDQygidHdvcyIpOgogICAgICAgICBjYXNlIEZPVVJDQygic293dCIpOgogICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVzsKICAgICAgICAgY2FzZSBGT1VSQ0MoImFsYWMiKToKICAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDOwotCisgICAgICAgIGNhc2UgRk9VUkNDKCJmTGFDIik6CisgICAgICAgICAgICByZXR1cm4gTUVESUFfTUlNRVRZUEVfQVVESU9fRkxBQzsKKyAgICAgICAgY2FzZSBGT1VSQ0MoImF2MDEiKToKKyAgICAgICAgICAgIHJldHVybiBNRURJQV9NSU1FVFlQRV9WSURFT19BVjE7CisgICAgICAgIGNhc2UgRk9VUkNDKCIubXAzIik6CisgICAgICAgIGNhc2UgMHg2RDczMDA1NTogLy8gIm1zIFUiIG1wMyBhdWRpbworICAgICAgICAgICAgcmV0dXJuIE1FRElBX01JTUVUWVBFX0FVRElPX01QRUc7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HVygiVW5rbm93biBmb3VyY2M6ICVjJWMlYyVjIiwKICAgICAgICAgICAgICAgICAgICAoZm91cmNjID4+IDI0KSAmIDB4ZmYsCkBAIC0zNjMsMTIgKzM4MCwxMSBAQAogICAgIHJldHVybiBmYWxzZTsKIH0KIAotTVBFRzRFeHRyYWN0b3I6Ok1QRUc0RXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpCitNUEVHNEV4dHJhY3Rvcjo6TVBFRzRFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBjb25zdCBjaGFyICptaW1lKQogICAgIDogbU1vb2ZPZmZzZXQoMCksCiAgICAgICBtTW9vZkZvdW5kKGZhbHNlKSwKICAgICAgIG1NZGF0Rm91bmQoZmFsc2UpLAogICAgICAgbURhdGFTb3VyY2Uoc291cmNlKSwKLSAgICAgIG1DYWNoZWRTb3VyY2UoTlVMTCksCiAgICAgICBtSW5pdENoZWNrKE5PX0lOSVQpLAogICAgICAgbUhlYWRlclRpbWVzY2FsZSgwKSwKICAgICAgIG1Jc1FUKGZhbHNlKSwKQEAgLTM3OCw2ICszOTQsNyBAQAogICAgICAgbUZpcnN0VHJhY2soTlVMTCksCiAgICAgICBtTGFzdFRyYWNrKE5VTEwpIHsKICAgICBBTE9HVigibWltZT0lcywgbVByZWZlckhlaWY9JWQiLCBtaW1lLCBtUHJlZmVySGVpZik7CisgICAgbUZpbGVNZXRhRGF0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKIH0KIAogTVBFRzRFeHRyYWN0b3I6On5NUEVHNEV4dHJhY3RvcigpIHsKQEAgLTM5NSw3ICs0MTIsOCBAQAogICAgIH0KICAgICBtUHNzaC5jbGVhcigpOwogCi0gICAgZGVsZXRlIG1DYWNoZWRTb3VyY2U7CisgICAgZGVsZXRlIG1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobUZpbGVNZXRhRGF0YSk7CiB9CiAKIHVpbnQzMl90IE1QRUc0RXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKQEAgLTQwNCwxMyArNDIyLDEzIEBACiAgICAgICAgICAgICAgICAgICAgIChDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSykgOiAwKTsKIH0KIAotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgeworbWVkaWFfc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIHN0YXR1c190IGVycjsKICAgICBpZiAoKGVyciA9IHJlYWRNZXRhRGF0YSgpKSAhPSBPSykgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KLSAgICBtZXRhID0gbUZpbGVNZXRhRGF0YTsKLSAgICByZXR1cm4gT0s7CisgICAgQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbUZpbGVNZXRhRGF0YSk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc2l6ZV90IE1QRUc0RXh0cmFjdG9yOjpjb3VudFRyYWNrcygpIHsKQEAgLTQzMSwxOCArNDQ5LDE4IEBACiAgICAgcmV0dXJuIG47CiB9CiAKLXN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCittZWRpYV9zdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKSB7CiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGlmICgoZXJyID0gcmVhZE1ldGFEYXRhKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgVHJhY2sgKnRyYWNrID0gbUZpcnN0VHJhY2s7CiAgICAgd2hpbGUgKGluZGV4ID4gMCkgewogICAgICAgICBpZiAodHJhY2sgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KIAogICAgICAgICB0cmFjayA9IHRyYWNrLT5uZXh0OwpAQCAtNDUwLDE3ICs0NjgsMTggQEAKICAgICB9CiAKICAgICBpZiAodHJhY2sgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIFs9XSB7CiAgICAgICAgIGludDY0X3QgZHVyYXRpb247CiAgICAgICAgIGludDMyX3Qgc2FtcGxlcmF0ZTsKKyAgICAgICAgLy8gT25seSBmb3IgYXVkaW8gdHJhY2suCiAgICAgICAgIGlmICh0cmFjay0+aGFzX2Vsc3QgJiYgbUhlYWRlclRpbWVzY2FsZSAhPSAwICYmCi0gICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSAmJgotICAgICAgICAgICAgICAgIHRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZXJhdGUpKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDY0KHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmZHVyYXRpb24pICYmCisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCAmc2FtcGxlcmF0ZSkpIHsKIAotICAgICAgICAgICAgLy8gZWxzdCBoYXMgdG8gYmUgcHJvY2Vzc2VkIG9ubHkgdGhlIGZpcnN0IHRpbWUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQKKyAgICAgICAgICAgIC8vIEVsc3QgaGFzIHRvIGJlIHByb2Nlc3NlZCBvbmx5IHRoZSBmaXJzdCB0aW1lIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgogICAgICAgICAgICAgdHJhY2stPmhhc19lbHN0ID0gZmFsc2U7CiAKICAgICAgICAgICAgIGlmICh0cmFjay0+ZWxzdF9zZWdtZW50X2R1cmF0aW9uID4gSU5UNjRfTUFYKSB7CkBAIC00NzYsNzcgKzQ5NSw3NiBAQAogICAgICAgICAgICAgICAgICAgaGFsZnNjYWxlLCBtSGVhZGVyVGltZXNjYWxlLCB0cmFjay0+dGltZXNjYWxlKTsKIAogICAgICAgICAgICAgaWYgKCh1aW50MzJfdClzYW1wbGVyYXRlICE9IHRyYWNrLT50aW1lc2NhbGUpewotICAgICAgICAgICAgICAgIEFMT0dWKCJzYW1wbGVyYXRlOiUiIFBSSWQzMiAiLCB0cmFjay0+dGltZXNjYWxlIGFuZCBzYW1wbGVyYXRlIGFyZSBkaWZmZXJlbnQhIiwgc2FtcGxlcmF0ZSk7CisgICAgICAgICAgICAgICAgQUxPR1YoInNhbXBsZXJhdGU6JSIgUFJJZDMyICIsIHRyYWNrLT50aW1lc2NhbGUgYW5kIHNhbXBsZXJhdGUgYXJlIGRpZmZlcmVudCEiLAorICAgICAgICAgICAgICAgICAgICBzYW1wbGVyYXRlKTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50NjRfdCBkZWxheTsKLSAgICAgICAgICAgIC8vIGRlbGF5ID0gKChtZWRpYV90aW1lICogc2FtcGxlcmF0ZSkgKyBoYWxmc2NhbGUpIC8gdHJhY2stPnRpbWVzY2FsZTsKLSAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1lZGlhX3RpbWUsIHNhbXBsZXJhdGUsICZkZWxheSkgfHwKLSAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhkZWxheSwgaGFsZnNjYWxlLCAmZGVsYXkpIHx8Ci0gICAgICAgICAgICAgICAgICAgIChkZWxheSAvPSBtSGVhZGVyVGltZXNjYWxlLCBmYWxzZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgLyogdGhlIGNhbGN1bGF0ZWQgZGVsYXkgc2hvdWxkIGJlIHNtYWxsLCBidXQgc29tZSBhcHBzCi0gICAgICAgICAgICAgICAgICAgICAqIGFwcGVhciB0byB3cml0ZSBhIGJvZ3VzIGVkaXQgbGlzdCB0aGF0IGNhdXNlcyBhIHJlYWxseQotICAgICAgICAgICAgICAgICAgICAgKiBsYXJnZSBkZWxheSwgcmVzdWx0aW5nIGluIHBsYXliYWNrIHByb2JsZW1zLgotICAgICAgICAgICAgICAgICAgICAgKiBJZ25vcmUgc3VjaCBlZGl0IGxpc3RzLgotICAgICAgICAgICAgICAgICAgICAgKiAoNDA5NiBpcyBlbm91Z2ggdG8gZHJvcCA0IGZ1bGwgc2FtcGxlcykKLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIGRlbGF5ID4gNDA5NiB8fAotICAgICAgICAgICAgICAgICAgICBkZWxheSA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgZWRpdCBsaXN0IHdpdGggYm9ndXMgdmFsdWVzIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoImRlbGF5ID0gJSIgUFJJZDY0LCBkZWxheSk7Ci0gICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RW5jb2RlckRlbGF5LCBkZWxheSk7Ci0KLSAgICAgICAgICAgIGludDY0X3Qgc2NhbGVkX2R1cmF0aW9uOwotICAgICAgICAgICAgLy8gc2NhbGVkX2R1cmF0aW9uID0gZHVyYXRpb24gKiBtSGVhZGVyVGltZXNjYWxlOwotICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3coZHVyYXRpb24sIG1IZWFkZXJUaW1lc2NhbGUsICZzY2FsZWRfZHVyYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoInNjYWxlZF9kdXJhdGlvbiA9ICUiIFBSSWQ2NCwgc2NhbGVkX2R1cmF0aW9uKTsKLQotICAgICAgICAgICAgaW50NjRfdCBzZWdtZW50X2VuZDsKLSAgICAgICAgICAgIGludDY0X3QgcGFkZGluZzsKLSAgICAgICAgICAgIGludDY0X3Qgc2VnbWVudF9kdXJhdGlvbl9lNjsKLSAgICAgICAgICAgIGludDY0X3QgbWVkaWFfdGltZV9zY2FsZWRfZTY7Ci0gICAgICAgICAgICBpbnQ2NF90IG1lZGlhX3RpbWVfc2NhbGVkOwotICAgICAgICAgICAgLy8gcGFkZGluZyA9IHNjYWxlZF9kdXJhdGlvbiAtICgoc2VnbWVudF9kdXJhdGlvbiAqIDEwMDAwMDApICsKLSAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgKChtZWRpYV90aW1lICogbUhlYWRlclRpbWVTY2FsZSAqIDEwMDAwMDApL3RyYWNrLT50aW1lc2NhbGUpICkKLSAgICAgICAgICAgIC8vIHNlZ21lbnRfZHVyYXRpb24gaXMgYmFzZWQgb24gdGltZXNjYWxlIGluIG1vdmllIGhlYWRlciBib3gobWRoZCkKLSAgICAgICAgICAgIC8vIG1lZGlhX3RpbWUgaXMgYmFzZWQgb24gdGltZXNjYWxlIHRyYWNrIGhlYWRlci9tZWRpYSB0aW1lc2NhbGUKLSAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KHNlZ21lbnRfZHVyYXRpb24sIDEwMDAwMDAsICZzZWdtZW50X2R1cmF0aW9uX2U2KSB8fAotICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobWVkaWFfdGltZSwgbUhlYWRlclRpbWVzY2FsZSwgJm1lZGlhX3RpbWVfc2NhbGVkKSB8fAotICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobWVkaWFfdGltZV9zY2FsZWQsIDEwMDAwMDAsICZtZWRpYV90aW1lX3NjYWxlZF9lNikpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtZWRpYV90aW1lX3NjYWxlZF9lNiAvPSB0cmFjay0+dGltZXNjYWxlOwotICAgICAgICAgICAgaWYoX19idWlsdGluX2FkZF9vdmVyZmxvdyhzZWdtZW50X2R1cmF0aW9uX2U2LCBtZWRpYV90aW1lX3NjYWxlZF9lNiwgJnNlZ21lbnRfZW5kKSB8fAotICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coc2NhbGVkX2R1cmF0aW9uLCBzZWdtZW50X2VuZCwgJnBhZGRpbmcpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoInNlZ21lbnRfZW5kID0gJSIgUFJJZDY0ICIsIHBhZGRpbmcgPSAlIiBQUklkNjQsIHNlZ21lbnRfZW5kLCBwYWRkaW5nKTsKLSAgICAgICAgICAgIGludDY0X3QgcGFkZGluZ3NhbXBsZXMgPSAwOwotICAgICAgICAgICAgaWYgKHBhZGRpbmcgPCAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gdHJhY2sgZHVyYXRpb24gZnJvbSBtZWRpYSBoZWFkZXIgKHdoaWNoIGlzIHdoYXQga0tleUR1cmF0aW9uIGlzKSBtaWdodAotICAgICAgICAgICAgICAgIC8vIGJlIHNsaWdodGx5IHNob3J0ZXIgdGhhbiB0aGUgc2VnbWVudCBkdXJhdGlvbiwgd2hpY2ggd291bGQgbWFrZSB0aGUKLSAgICAgICAgICAgICAgICAvLyBwYWRkaW5nIG5lZ2F0aXZlLiBDbGFtcCB0byB6ZXJvLgotICAgICAgICAgICAgICAgIHBhZGRpbmcgPSAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IGhhbGZzY2FsZV9lNjsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVzY2FsZV9lNjsKLSAgICAgICAgICAgICAgICAvLyBwYWRkaW5nc2FtcGxlcyA9ICgocGFkZGluZyAqIHNhbXBsZXJhdGUpICsgKGhhbGZzY2FsZSAqIDEwMDAwMDApKQotICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgIC8gKG1IZWFkZXJUaW1lc2NhbGUgKiAxMDAwMDAwKTsKLSAgICAgICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhwYWRkaW5nLCBzYW1wbGVyYXRlLCAmcGFkZGluZ3NhbXBsZXMpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KGhhbGZzY2FsZSwgMTAwMDAwMCwgJmhhbGZzY2FsZV9lNikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobUhlYWRlclRpbWVzY2FsZSwgMTAwMDAwMCwgJnRpbWVzY2FsZV9lNikgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3cocGFkZGluZ3NhbXBsZXMsIGhhbGZzY2FsZV9lNiwgJnBhZGRpbmdzYW1wbGVzKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKHBhZGRpbmdzYW1wbGVzIC89IHRpbWVzY2FsZV9lNiwgZmFsc2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBwYWRkaW5nc2FtcGxlcyA+IElOVDMyX01BWCkgeworICAgICAgICAgICAgLy8gQm90aCBkZWxheSBhbmQgcGFkZGluZ3NhbXBsZXMgaGF2ZSB0byBiZSBzZXQgaW5vcmRlciBmb3IgZWl0aGVyIHRvIGJlCisgICAgICAgICAgICAvLyBlZmZlY3RpdmUgaW4gdGhlIGxvd2VyIGxheWVycy4KKyAgICAgICAgICAgIGludDY0X3QgZGVsYXkgPSAwOworICAgICAgICAgICAgaWYgKG1lZGlhX3RpbWUgPiAwKSB7IC8vIEdhcGxlc3MgcGxheWJhY2sKKyAgICAgICAgICAgICAgICAvLyBkZWxheSA9ICgobWVkaWFfdGltZSAqIHNhbXBsZXJhdGUpICsgaGFsZnNjYWxlKSAvIHRyYWNrLT50aW1lc2NhbGU7CisgICAgICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9tdWxfb3ZlcmZsb3cobWVkaWFfdGltZSwgc2FtcGxlcmF0ZSwgJmRlbGF5KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhkZWxheSwgaGFsZnNjYWxlLCAmZGVsYXkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoZGVsYXkgLz0gdHJhY2stPnRpbWVzY2FsZSwgZmFsc2UpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxheSA+IElOVDMyX01BWCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXkgPCBJTlQzMl9NSU4pIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nIGVkaXQgbGlzdCB3aXRoIGJvZ3VzIHZhbHVlcyIpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoImRlbGF5ID0gJSIgUFJJZDY0LCBkZWxheSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9ERUxBWSwgZGVsYXkpOworCisgICAgICAgICAgICBpbnQ2NF90IHBhZGRpbmdzYW1wbGVzID0gMDsKKyAgICAgICAgICAgIGlmIChzZWdtZW50X2R1cmF0aW9uID4gMCkgeworICAgICAgICAgICAgICAgIGludDY0X3Qgc2NhbGVkX2R1cmF0aW9uOworICAgICAgICAgICAgICAgIC8vIHNjYWxlZF9kdXJhdGlvbiA9IGR1cmF0aW9uICogbUhlYWRlclRpbWVzY2FsZTsKKyAgICAgICAgICAgICAgICBpZiAoX19idWlsdGluX211bF9vdmVyZmxvdyhkdXJhdGlvbiwgbUhlYWRlclRpbWVzY2FsZSwgJnNjYWxlZF9kdXJhdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigic2NhbGVkX2R1cmF0aW9uID0gJSIgUFJJZDY0LCBzY2FsZWRfZHVyYXRpb24pOworCisgICAgICAgICAgICAgICAgaW50NjRfdCBzZWdtZW50X2VuZDsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHBhZGRpbmc7CisgICAgICAgICAgICAgICAgaW50NjRfdCBzZWdtZW50X2R1cmF0aW9uX2U2OworICAgICAgICAgICAgICAgIGludDY0X3QgbWVkaWFfdGltZV9zY2FsZWRfZTY7CisgICAgICAgICAgICAgICAgaW50NjRfdCBtZWRpYV90aW1lX3NjYWxlZDsKKyAgICAgICAgICAgICAgICAvLyBwYWRkaW5nID0gc2NhbGVkX2R1cmF0aW9uIC0gKChzZWdtZW50X2R1cmF0aW9uICogMTAwMDAwMCkgKworICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgKChtZWRpYV90aW1lICogbUhlYWRlclRpbWVzY2FsZSAqIDEwMDAwMDApL3RyYWNrLT50aW1lc2NhbGUpICkKKyAgICAgICAgICAgICAgICAvLyBzZWdtZW50X2R1cmF0aW9uIGlzIGJhc2VkIG9uIHRpbWVzY2FsZSBpbiBtb3ZpZSBoZWFkZXIgYm94KG1kaGQpCisgICAgICAgICAgICAgICAgLy8gbWVkaWFfdGltZSBpcyBiYXNlZCBvbiB0aW1lc2NhbGUgdHJhY2sgaGVhZGVyL21lZGlhIHRpbWVzY2FsZQorICAgICAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KHNlZ21lbnRfZHVyYXRpb24sIDEwMDAwMDAsICZzZWdtZW50X2R1cmF0aW9uX2U2KSB8fAorICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KG1lZGlhX3RpbWUsIG1IZWFkZXJUaW1lc2NhbGUsICZtZWRpYV90aW1lX3NjYWxlZCkgfHwKKyAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtZWRpYV90aW1lX3NjYWxlZCwgMTAwMDAwMCwgJm1lZGlhX3RpbWVfc2NhbGVkX2U2KSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1lZGlhX3RpbWVfc2NhbGVkX2U2IC89IHRyYWNrLT50aW1lc2NhbGU7CisgICAgICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3coc2VnbWVudF9kdXJhdGlvbl9lNiwgbWVkaWFfdGltZV9zY2FsZWRfZTYsICZzZWdtZW50X2VuZCkKKyAgICAgICAgICAgICAgICAgICAgfHwgX19idWlsdGluX3N1Yl9vdmVyZmxvdyhzY2FsZWRfZHVyYXRpb24sIHNlZ21lbnRfZW5kLCAmcGFkZGluZykpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HVigic2VnbWVudF9lbmQgPSAlIiBQUklkNjQgIiwgcGFkZGluZyA9ICUiIFBSSWQ2NCwgc2VnbWVudF9lbmQsIHBhZGRpbmcpOworICAgICAgICAgICAgICAgIC8vIHRyYWNrIGR1cmF0aW9uIGZyb20gbWVkaWEgaGVhZGVyICh3aGljaCBpcyB3aGF0IEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04gaXMpCisgICAgICAgICAgICAgICAgLy8gbWlnaHQgYmUgc2xpZ2h0bHkgc2hvcnRlciB0aGFuIHRoZSBzZWdtZW50IGR1cmF0aW9uLCB3aGljaCB3b3VsZCBtYWtlIHRoZQorICAgICAgICAgICAgICAgIC8vIHBhZGRpbmcgbmVnYXRpdmUuIENsYW1wIHRvIHplcm8uCisgICAgICAgICAgICAgICAgaWYgKHBhZGRpbmcgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgaGFsZnNjYWxlX21odCA9IG1IZWFkZXJUaW1lc2NhbGUgLyAyOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGhhbGZzY2FsZV9lNjsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc2NhbGVfZTY7CisgICAgICAgICAgICAgICAgICAgIC8vIHBhZGRpbmdzYW1wbGVzID0gKChwYWRkaW5nICogc2FtcGxlcmF0ZSkgKyAoaGFsZnNjYWxlX21odCAqIDEwMDAwMDApKQorICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAvIChtSGVhZGVyVGltZXNjYWxlICogMTAwMDAwMCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KHBhZGRpbmcsIHNhbXBsZXJhdGUsICZwYWRkaW5nc2FtcGxlcykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2J1aWx0aW5fbXVsX292ZXJmbG93KGhhbGZzY2FsZV9taHQsIDEwMDAwMDAsICZoYWxmc2NhbGVfZTYpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtSGVhZGVyVGltZXNjYWxlLCAxMDAwMDAwLCAmdGltZXNjYWxlX2U2KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3cocGFkZGluZ3NhbXBsZXMsIGhhbGZzY2FsZV9lNiwgJnBhZGRpbmdzYW1wbGVzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYWRkaW5nc2FtcGxlcyAvPSB0aW1lc2NhbGVfZTYsIGZhbHNlKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhZGRpbmdzYW1wbGVzID4gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigicGFkZGluZ3NhbXBsZXMgPSAlIiBQUklkNjQsIHBhZGRpbmdzYW1wbGVzKTsKLSAgICAgICAgICAgIHRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFbmNvZGVyUGFkZGluZywgcGFkZGluZ3NhbXBsZXMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORywgcGFkZGluZ3NhbXBsZXMpOwogICAgICAgICB9CiAgICAgfSgpOwogCkBAIC01NTUsNyArNTczLDcgQEAKICAgICAgICAgdHJhY2stPmluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YSA9IHRydWU7CiAKICAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgQ0hFQ0sodHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAgICAgICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKSB7CiAgICAgICAgICAgICAvLyBNUEVHMiB0cmFja3MgZG8gbm90IHByb3ZpZGUgQ1NELCBzbyByZWFkIHRoZSBzdHJlYW0gaGVhZGVyCiAgICAgICAgICAgICBpZiAoIXN0cmNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMikpIHsKQEAgLTU2OCwzNiArNTg2LDM4IEBACiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBoZWFkZXJba01heFRyYWNrSGVhZGVyU2l6ZV07CiAgICAgICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgJmhlYWRlciwgc2l6ZSkgPT0gKHNzaXplX3Qpc2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0RGF0YShrS2V5U3RyZWFtSGVhZGVyLCAnbWRhdCcsIGhlYWRlciwgc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKHRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01QRUcyX1NUUkVBTV9IRUFERVIsIGhlYWRlciwgc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChtTW9vZk9mZnNldCA+IDApIHsKICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uOwotICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bWV0YS5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb24pKSB7CisgICAgICAgICAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQ2NCh0cmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICZkdXJhdGlvbikpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gbm90aGluZyBmYW5jeSwganVzdCBwaWNrIGEgZnJhbWUgbmVhciAxLzR0aCBvZiB0aGUgZHVyYXRpb24KLSAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAga0tleVRodW1ibmFpbFRpbWUsIGR1cmF0aW9uIC8gNCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCh0cmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9USU1FLCBkdXJhdGlvbiAvIDQpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXg7Ci0gICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlVGltZTsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBzYW1wbGVUaW1lOwogICAgICAgICAgICAgICAgIGlmICh0cmFjay0+dGltZXNjYWxlICE9IDAgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zYW1wbGVUYWJsZS0+ZmluZFRodW1ibmFpbFNhbXBsZSgmc2FtcGxlSW5kZXgpID09IE9LCiAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0cmFjay0+c2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZUluZGV4LCBOVUxMIC8qIG9mZnNldCAqLywgTlVMTCAvKiBzaXplICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGVUaW1lKSA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICB0cmFjay0+bWV0YS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGh1bWJuYWlsVGltZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGludDY0X3Qpc2FtcGxlVGltZSAqIDEwMDAwMDApIC8gdHJhY2stPnRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQodHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoaW50NjRfdClzYW1wbGVUaW1lICogMTAwMDAwMCkgLyB0cmFjay0+dGltZXNjYWxlKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBtZXRhID0gdHJhY2stPm1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIHRyYWNrLT5tZXRhKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cmVhZE1ldGFEYXRhKCkgewpAQCAtNjMyLDEyICs2NTIsMTQgQEAKICAgICAgICAgb2ZmNjRfdCBleGlmT2Zmc2V0OwogICAgICAgICBzaXplX3QgZXhpZlNpemU7CiAgICAgICAgIGlmIChtSXRlbVRhYmxlLT5nZXRFeGlmT2Zmc2V0QW5kU2l6ZSgmZXhpZk9mZnNldCwgJmV4aWZTaXplKSA9PSBPSykgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQ2NChrS2V5RXhpZk9mZnNldCwgKGludDY0X3QpZXhpZk9mZnNldCk7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEludDY0KGtLZXlFeGlmU2l6ZSwgKGludDY0X3QpZXhpZlNpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9PRkZTRVQsIChpbnQ2NF90KWV4aWZPZmZzZXQpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9TSVpFLCAoaW50NjRfdClleGlmU2l6ZSk7CiAgICAgICAgIH0KICAgICAgICAgZm9yICh1aW50MzJfdCBpbWFnZUluZGV4ID0gMDsKICAgICAgICAgICAgICAgICBpbWFnZUluZGV4IDwgbUl0ZW1UYWJsZS0+Y291bnRJbWFnZXMoKTsgaW1hZ2VJbmRleCsrKSB7Ci0gICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1JdGVtVGFibGUtPmdldEltYWdlTWV0YShpbWFnZUluZGV4KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IG1JdGVtVGFibGUtPmdldEltYWdlTWV0YShpbWFnZUluZGV4KTsKICAgICAgICAgICAgIGlmIChtZXRhID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiaGVpZiBpbWFnZSAldSBoYXMgbm8gbWV0YSEiLCBpbWFnZUluZGV4KTsKICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTY1NCw3ICs2NzYsNiBAQAogCiAgICAgICAgICAgICBBTE9HVigiYWRkaW5nIEhFSUYgaW1hZ2UgdHJhY2sgJXUiLCBpbWFnZUluZGV4KTsKICAgICAgICAgICAgIFRyYWNrICp0cmFjayA9IG5ldyBUcmFjazsKLSAgICAgICAgICAgIHRyYWNrLT5uZXh0ID0gTlVMTDsKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5uZXh0ID0gdHJhY2s7CiAgICAgICAgICAgICB9IGVsc2UgewpAQCAtNjYyLDI2ICs2ODMsMjYgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1MYXN0VHJhY2sgPSB0cmFjazsKIAotICAgICAgICAgICAgdHJhY2stPm1ldGEgPSAqKG1ldGEuZ2V0KCkpOwotICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVRyYWNrSUQsIGltYWdlSW5kZXgpOwotICAgICAgICAgICAgdHJhY2stPmluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YSA9IGZhbHNlOwotICAgICAgICAgICAgdHJhY2stPnNraXBUcmFjayA9IGZhbHNlOworICAgICAgICAgICAgdHJhY2stPm1ldGEgPSBtZXRhOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCBpbWFnZUluZGV4KTsKICAgICAgICAgICAgIHRyYWNrLT50aW1lc2NhbGUgPSAxMDAwMDAwOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG1Jbml0Q2hlY2sgPT0gT0spIHsKICAgICAgICAgaWYgKGZpbmRUcmFja0J5TWltZVByZWZpeCgidmlkZW8vIikgIT0gTlVMTCkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHNCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUc0KTsKICAgICAgICAgfSBlbHNlIGlmIChmaW5kVHJhY2tCeU1pbWVQcmVmaXgoImF1ZGlvLyIpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICJhdWRpby9tcDQiKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAiYXVkaW8vbXA0Iik7CiAgICAgICAgIH0gZWxzZSBpZiAoZmluZFRyYWNrQnlNaW1lUHJlZml4KAogICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykgIT0gTlVMTCkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9IRUlGKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfSEVJRik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUluaXRDaGVjayA9IGVycjsKQEAgLTcwNiw3ICs3MjcsNyBAQAogICAgICAgICAgICAgbWVtY3B5KHB0ciArIDIwLCBtUHNzaFtpXS5kYXRhLCBtUHNzaFtpXS5kYXRhbGVuKTsKICAgICAgICAgICAgIHB0ciArPSAoMjAgKyBtUHNzaFtpXS5kYXRhbGVuKTsKICAgICAgICAgfQotICAgICAgICBtRmlsZU1ldGFEYXRhLnNldERhdGEoa0tleVBzc2gsICdwc3NoJywgYnVmLCBwc3Noc2l6ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9QU1NILCBidWYsIHBzc2hzaXplKTsKICAgICAgICAgZnJlZShidWYpOwogICAgIH0KIApAQCAtOTIyLDggKzk0Myw4IEBACiAKICAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlZFNvdXJjZS0+c2V0Q2FjaGVkUmFuZ2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKm9mZnNldCwgY2h1bmtfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FjaGVkU291cmNlICE9IE5VTEwgLyogYXNzdW1lIG93bmVyc2hpcCBvbiBzdWNjZXNzICovKSA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBtQ2FjaGVkU291cmNlID0gY2FjaGVkU291cmNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogYXNzdW1lIG93bmVyc2hpcCBvbiBzdWNjZXNzICovKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBjYWNoZWRTb3VyY2U7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGUgY2FjaGVkU291cmNlOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC05NDYsNyArOTY3LDYgQEAKIAogICAgICAgICAgICAgICAgIEFMT0dWKCJhZGRpbmcgbmV3IHRyYWNrIik7CiAgICAgICAgICAgICAgICAgVHJhY2sgKnRyYWNrID0gbmV3IFRyYWNrOwotICAgICAgICAgICAgICAgIHRyYWNrLT5uZXh0ID0gTlVMTDsKICAgICAgICAgICAgICAgICBpZiAobUxhc3RUcmFjaykgewogICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5uZXh0ID0gdHJhY2s7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTk1NCwxNyArOTc0LDMwIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2sgPSB0cmFjazsKIAotICAgICAgICAgICAgICAgIHRyYWNrLT5pbmNsdWRlc19leHBlbnNpdmVfbWV0YWRhdGEgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB0cmFjay0+c2tpcFRyYWNrID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgdHJhY2stPnRpbWVzY2FsZSA9IDA7Ci0gICAgICAgICAgICAgICAgdHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsICJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKLSAgICAgICAgICAgICAgICB0cmFjay0+aGFzX2Vsc3QgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB0cmFjay0+c3Vic2FtcGxlX2VuY3J5cHRpb24gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICB0cmFjay0+bWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKHRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldDsKICAgICAgICAgICAgIHdoaWxlICgqb2Zmc2V0IDwgc3RvcF9vZmZzZXQpIHsKKworICAgICAgICAgICAgICAgIC8vIHBhc3MgdWRhdGEgdGVybWluYXRlCisgICAgICAgICAgICAgICAgaWYgKG1Jc1FUICYmIHN0b3Bfb2Zmc2V0IC0gKm9mZnNldCA9PSA0ICYmIGNodW5rX3R5cGUgPT0gRk9VUkNDKCJ1ZHRhIikpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlIHRoZSBjYXNlIHRoYXQgdWR0YSB0ZXJtaW5hdGVzIHdpdGggdGVybWluYXRlIGNvZGUgeDAwMDAwMDAwCisgICAgICAgICAgICAgICAgICAgIC8vIG5vdGUgdGhhdCAwIHRlcm1pbmF0b3IgaXMgb3B0aW9uYWwgYW5kIHdlIGp1c3QgaGFuZGxlIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdGVybWluYXRlX2NvZGUgPSAxOworICAgICAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQsICZ0ZXJtaW5hdGVfY29kZSwgNCk7CisgICAgICAgICAgICAgICAgICAgIGlmICgwID09IHRlcm1pbmF0ZV9jb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IDQ7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgiVGVybWluYWwgY29kZSBmb3IgdWR0YSIpOworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiaW52YWxpZCB1ZHRhIFRlcm1pbmFsIGNvZGUiKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsob2Zmc2V0LCBkZXB0aCArIDEpOwogICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKGlzVHJhY2spIHsKQEAgLTk4MSw4ICsxMDE0LDEwIEBACiAKICAgICAgICAgICAgIGlmIChpc1RyYWNrKSB7CiAgICAgICAgICAgICAgICAgaW50MzJfdCB0cmFja0lkOwotICAgICAgICAgICAgICAgIC8vIFRoZXJlIG11c3QgYmUgZXhhY3Qgb25lIHRyYWNrIGhlYWRlciBwZXIgdHJhY2suCi0gICAgICAgICAgICAgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJnRyYWNrSWQpKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBleGFjdGx5IG9uZSB0cmFjayBoZWFkZXIgcGVyIHRyYWNrLgorCisgICAgICAgICAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQsICZ0cmFja0lkKSkgewogICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5za2lwVHJhY2sgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KIApAQCAtOTkxLDYgKzEwMjYsNyBAQAogICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5za2lwVHJhY2sgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KIAorCiAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2stPnNraXBUcmFjaykgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgdGhpcyB0cmFjay4uLiIpOwogICAgICAgICAgICAgICAgICAgICBUcmFjayAqY3VyID0gbUZpcnN0VHJhY2s7CkBAIC0xMDExLDYgKzEwNDcsMjEgQEAKIAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gcGxhY2UgdGhpbmdzIHdlIGJ1aWx0IGVsc2V3aGVyZSBpbnRvIHRoZWlyIGZpbmFsIGxvY2F0aW9ucworCisgICAgICAgICAgICAgICAgLy8gcHV0IGFnZ3JlZ2F0ZWQgdHgzZyBkYXRhIGludG8gdGhlIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2stPm1UeDNnRmlsbGVkID4gMCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiUHV0dGluZyAlenUgYnl0ZXMgb2YgdHgzZyBkYXRhIGludG8gbWV0YSBkYXRhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bVR4M2dGaWxsZWQpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RFWFRfRk9STUFUX0RBVEEsCisgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tVHgzZ0J1ZmZlciwgbUxhc3RUcmFjay0+bVR4M2dGaWxsZWQpOworICAgICAgICAgICAgICAgICAgICAvLyBkcm9wIGl0IG5vdyB0byByZWR1Y2Ugb3VyIGZvb3RwcmludAorICAgICAgICAgICAgICAgICAgICBmcmVlKG1MYXN0VHJhY2stPm1UeDNnQnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bVR4M2dCdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgfSBlbHNlIGlmIChjaHVua190eXBlID09IEZPVVJDQygibW9vdiIpKSB7CiAgICAgICAgICAgICAgICAgbUluaXRDaGVjayA9IE9LOwogCkBAIC0xMDU4LDcgKzExMDksNyBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtb2RlICE9IGtDcnlwdG9Nb2RlVW5lbmNyeXB0ZWQpIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDcnlwdG9Nb2RlLCBtb2RlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSwgbW9kZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTA4NSw2ICsxMTM2LDcgQEAKIAogICAgICAgICAgICAgaWYgKGVudHJ5X2NvdW50ICE9IDEpIHsKICAgICAgICAgICAgICAgICAvLyB3ZSBvbmx5IHN1cHBvcnQgYSBzaW5nbGUgZW50cnkgYXQgdGhlIG1vbWVudCwgZm9yIGdhcGxlc3MgcGxheWJhY2sKKyAgICAgICAgICAgICAgICAvLyBvciBzdGFydCBvZmZzZXQKICAgICAgICAgICAgICAgICBBTE9HVygiaWdub3JpbmcgZWRpdCBsaXN0IHdpdGggJWQgZW50cmllcyIsIGVudHJ5X2NvdW50KTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgb2ZmNjRfdCBlbnRyaWVzb2Zmc2V0ID0gZGF0YV9vZmZzZXQgKyA4OwpAQCAtMTEzNCw1MCArMTE4NiwyNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIEZvdXJDQzJNSU1FKG9yaWdpbmFsX2ZvdXJjYykpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIEZvdXJDQzJNSU1FKG9yaWdpbmFsX2ZvdXJjYykpOwogICAgICAgICAgICAgdWludDMyX3QgbnVtX2NoYW5uZWxzID0gMDsKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZV9yYXRlID0gMDsKICAgICAgICAgICAgIGlmIChBZGp1c3RDaGFubmVsc0FuZFJhdGUob3JpZ2luYWxfZm91cmNjLCAmbnVtX2NoYW5uZWxzLCAmc2FtcGxlX3JhdGUpKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1fY2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZV9yYXRlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbnVtX2NoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZV9yYXRlKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSWYgZm9ybWF0IHR5cGUgaXMgJ2FsYWMnLCBpdCBpcyBuZWNlc3NhcnkgdG8gZ2V0IHRoZSBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAvLyBmcm9tIGEgYWxhYyBhdG9tIHNwcmVhZGluZyBiZWhpbmQgdGhlIGZybWEgYXRvbS4KLSAgICAgICAgICAgIC8vIFNlZSAnZXh0ZXJuYWwvYWxhYy9BTEFDTWFnaWNDb29raWVEZXNjcmlwdGlvbi50eHQnLgotICAgICAgICAgICAgaWYgKG9yaWdpbmFsX2ZvdXJjYyA9PSBGT1VSQ0MoImFsYWMiKSkgewotICAgICAgICAgICAgICAgIC8vIFN0b3JlIEFMQUMgbWFnaWMgY29va2llIChkZWNvZGVyIG5lZWRzIGl0KS4KLSAgICAgICAgICAgICAgICB1aW50OF90IGFsYWNJbmZvWzEyXTsKLSAgICAgICAgICAgICAgICBkYXRhX29mZnNldCA9ICpvZmZzZXQ7Ci0gICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgYWxhY0luZm8sIHNpemVvZihhbGFjSW5mbykpIDwgKHNzaXplX3Qpc2l6ZW9mKGFsYWNJbmZvKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICBpZiAoIW1Jc1FUICYmIG9yaWdpbmFsX2ZvdXJjYyA9PSBGT1VSQ0MoImFsYWMiKSkgeworICAgICAgICAgICAgICAgIG9mZjY0X3QgdG1wT2Zmc2V0ID0gKm9mZnNldDsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUFMQUNTYW1wbGVFbnRyeSgmdG1wT2Zmc2V0KTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJwYXJzZUFMQUNTYW1wbGVFbnRyeSBlcnI6JWQgTGluZTolZCIsIGVyciwgX19MSU5FX18pOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB1aW50MzJfdCBzaXplID0gVTMyX0FUKCZhbGFjSW5mb1swXSk7Ci0gICAgICAgICAgICAgICAgaWYgKChzaXplICE9IEFMQUNfU1BFQ0lGSUNfSU5GT19TSVpFKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKFUzMl9BVCgmYWxhY0luZm9bNF0pICE9IEZPVVJDQygiYWxhYyIpKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKFUzMl9BVCgmYWxhY0luZm9bOF0pICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gc2l6ZW9mKGFsYWNJbmZvKTsKLSAgICAgICAgICAgICAgICB1aW50OF90IGNvb2tpZVtzaXplIC0gc2l6ZW9mKGFsYWNJbmZvKV07Ci0gICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgY29va2llLCBzaXplb2YoY29va2llKSkgPCAoc3NpemVfdClzaXplb2YoY29va2llKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgdWludDhfdCBiaXRzUGVyU2FtcGxlID0gY29va2llWzVdOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIGJpdHNQZXJTYW1wbGUpOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY29va2llWzldKTsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBVMzJfQVQoJmNvb2tpZVsyMF0pKTsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlBbGFjTWFnaWNDb29raWUsIE1ldGFEYXRhOjpUWVBFX05PTkUsIGNvb2tpZSwgc2l6ZW9mKGNvb2tpZSkpOwotCi0gICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBzaXplIG9mIEFMQUMgU3BlY2lmaWMgSW5mbyAoMzYgYnl0ZXMpIGFuZCB0ZXJtaW5hdG9yCi0gICAgICAgICAgICAgICAgLy8gYXRvbSAoOCBieXRlcykuCi0gICAgICAgICAgICAgICAgKm9mZnNldCArPSAoc2l6ZSArIDgpOworICAgICAgICAgICAgICAgICpvZmZzZXQgPSB0bXBPZmZzZXQgKyA4OwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0xMjczLDE2ICsxMzAyLDIzIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGludDMyX3QgdG1wQWxnb3JpdGhtSWQ7Ci0gICAgICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlDcnlwdG9Nb2RlLCAmdG1wQWxnb3JpdGhtSWQpKSB7Ci0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgZGVmYXVsdEFsZ29yaXRobUlkKTsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsICZ0bXBBbGdvcml0aG1JZCkpIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsIGRlZmF1bHRBbGdvcml0aG1JZCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsIGRlZmF1bHRJVlNpemUpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKGtLZXlDcnlwdG9LZXksICd0ZW5jJywgZGVmYXVsdEtleUlkLCAxNik7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2ssIGRlZmF1bHRFbmNyeXB0ZWRCeXRlQmxvY2spOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2tpcEJ5dGVCbG9jaywgZGVmYXVsdFNraXBCeXRlQmxvY2spOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSwgZGVmYXVsdElWU2l6ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgZGVmYXVsdEtleUlkLCAxNik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0ssIGRlZmF1bHRFbmNyeXB0ZWRCeXRlQmxvY2spOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1NLSVBfQllURV9CTE9DSywgZGVmYXVsdFNraXBCeXRlQmxvY2spOwogICAgICAgICAgICAgaWYgKGRlZmF1bHRDb25zdGFudEl2ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoa0tleUNyeXB0b0lWLCAnZGNpdicsIGRlZmF1bHRDb25zdGFudEl2LT5kYXRhKCksIGRlZmF1bHRDb25zdGFudEl2LT5zaXplKCkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYsCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0Q29uc3RhbnRJdi0+ZGF0YSgpLCBkZWZhdWx0Q29uc3RhbnRJdi0+c2l6ZSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNDMxLDggKzE0NjcsMTMgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtTGFzdFRyYWNrLT50aW1lc2NhbGUgIT0gMCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sIChkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBsb25nIGRvdWJsZSBkdXJhdGlvblVzID0gKChsb25nIGRvdWJsZSlkdXJhdGlvbiAqIDEwMDAwMDApIC8gbUxhc3RUcmFjay0+dGltZXNjYWxlOworICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvblVzIDwgMCB8fCBkdXJhdGlvblVzID4gSU5UNjRfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjYW5ub3QgcmVwcmVzZW50ICVsbGQgKiAxMDAwMDAwIC8gJWxsZCBpbiA2NCBiaXRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgZHVyYXRpb24sIChsb25nIGxvbmcpIG1MYXN0VHJhY2stPnRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBkdXJhdGlvblVzKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDhfdCBsYW5nWzJdOwpAQCAtMTQ1OSw4ICsxNTAwLDcgQEAKICAgICAgICAgICAgIGxhbmdfY29kZVsyXSA9IChsYW5nWzFdICYgMHgxZikgKyAweDYwOwogICAgICAgICAgICAgbGFuZ19jb2RlWzNdID0gJ1wwJzsKIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICBrS2V5TWVkaWFMYW5ndWFnZSwgbGFuZ19jb2RlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9MQU5HVUFHRSwgbGFuZ19jb2RlKTsKIAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTE0OTQsNyArMTUzNCw3IEBACiAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworICAgICAgICAgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogICAgICAgICAgICAgICAgIGlmIChzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1RFWFRfM0dQUCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmNhc2VjbXAobWltZSwgImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBub3cgd2Ugb25seSBzdXBwb3J0IGEgc2luZ2xlIHR5cGUgb2YgbWVkaWEgcGVyIHRyYWNrLgpAQCAtMTUyMSw4ICsxNTYxLDEyIEBACiAgICAgICAgIHsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKIAotICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgIC8vIHRoZSBhYnNvbHV0ZSBtaW5pbXVtIHNpemUgb2YgYSBjb21wbGlhbnQgbWV0dCBib3ggaXMgMTEgYnl0ZXM6CisgICAgICAgICAgICAvLyA2IGJ5dGUgcmVzZXJ2ZWQsIDIgYnl0ZSBpbmRleCwgbnVsbCBieXRlLCBvbmUgY2hhciBtaW1lX2Zvcm1hdCwgbnVsbCBieXRlCisgICAgICAgICAgICAvLyBUaGUgcmVzdWx0aW5nIG1pbWVfZm9ybWF0IHdvdWxkIGJlIGludmFsaWQgYXQgdGhhdCBzaXplIHRob3VnaC4KKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwgfHwgY2h1bmtfZGF0YV9zaXplIDwgMTEpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBhdXRvIGJ1ZmZlciA9IGhlYXBidWZmZXI8dWludDhfdD4oY2h1bmtfZGF0YV9zaXplKTsKICAgICAgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCkgewpAQCAtMTUzNCw5ICsxNTc4LDU0IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBTdHJpbmc4IG1pbWVGb3JtYXQoKGNvbnN0IGNoYXIgKikoYnVmZmVyLmdldCgpKSwgY2h1bmtfZGF0YV9zaXplKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIG1pbWVGb3JtYXQuc3RyaW5nKCkpOworICAgICAgICAgICAgLy8gSVNPLTE0NDk2LTEyOgorICAgICAgICAgICAgLy8gaW50OCByZXNlcnZlZFs2XTsgICAgICAgICAgICAgICAvLyBzaG91bGQgYmUgYWxsIHplcm9lcworICAgICAgICAgICAgLy8gaW50MTZfdCBkYXRhX3JlZmVyZW5jZV9pbmRleDsKKyAgICAgICAgICAgIC8vIGNoYXIgY29udGVudF9lbmNvZGluZ1tdOyAgICAgICAgLy8gbnVsbCB0ZXJtaW5hdGVkLCBvcHRpb25hbCAoPSBqdXN0IHRoZSBudWxsIGJ5dGUpCisgICAgICAgICAgICAvLyBjaGFyIG1pbWVfZm9ybWF0W107ICAgICAgICAgICAgIC8vIG51bGwgdGVybWluYXRlZCwgbWFuZGF0b3J5CisgICAgICAgICAgICAvLyBvcHRpb25hbCBvdGhlciBib3hlcworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEFQSSA8IDI5OgorICAgICAgICAgICAgLy8gY2hhciBtaW1lX2Zvcm1hdFtdOyAgICAgICAgICAgICAvLyBudWxsIHRlcm1pbmF0ZWQKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBBUEkgPj0gMjkKKyAgICAgICAgICAgIC8vIGNoYXIgbWltZV9mb3JtYXRbXTsgICAgICAgICAgICAgLy8gbnVsbCB0ZXJtaW5hdGVkCisgICAgICAgICAgICAvLyBjaGFyIG1pbWVfZm9ybWF0W107ICAgICAgICAgICAgIC8vIG51bGwgdGVybWluYXRlZAogCisgICAgICAgICAgICAvLyBQcmlvciB0byBBUEkgMjksIHRoZSBtZXRhZGF0YSB0cmFjayB3YXMgbm90IGNvbXBsaWFudCB3aXRoIElTTy9JRUMKKyAgICAgICAgICAgIC8vIDE0NDk2LTEyLTIwMTUuIFRoaXMgbGVkIHRvIHNvbWUgSVNPLWNvbXBsaWFudCBwYXJzZXJzIGZhaWxpbmcgdG8gcmVhZCB0aGUKKyAgICAgICAgICAgIC8vIG1ldGF0cmFjay4gQXMgb2YgQVBJIDI5IGFuZCBvbndhcmRzLCBhIGNoYW5nZSB3YXMgbWFkZSB0byBtZXRhZGF0YSB0cmFjayB0bworICAgICAgICAgICAgLy8gbWFrZSBpdCBzb21ld2hhdCBjb21wYXRpYmxlIHdpdGggdGhlIHN0YW5kYXJkLiBUaGUgd29ya2Fyb3VuZCBpcyB0byB3cml0ZSB0aGUKKyAgICAgICAgICAgIC8vIG51bGwtdGVybWluYXRlZCBtaW1lX2Zvcm1hdCBzdHJpbmcgdHdpY2UuIFRoaXMgYWxsb3dzIGNvbXBsaWFudCBwYXJzZXJzIHRvCisgICAgICAgICAgICAvLyByZWFkIHRoZSBtaXNzaW5nIHJlc2VydmVkLCBkYXRhX3JlZmVyZW5jZV9pbmRleCwgYW5kIGNvbnRlbnRfZW5jb2RpbmcgZmllbGRzCisgICAgICAgICAgICAvLyBmcm9tIHRoZSBmaXJzdCBtaW1lX3R5cGUgc3RyaW5nLiBUaGUgYWN0dWFsIG1pbWVfZm9ybWF0IGZpZWxkIHdvdWxkIHRoZW4gYmUKKyAgICAgICAgICAgIC8vIHJlYWQgY29ycmVjdGx5IGZyb20gdGhlIHNlY29uZCBzdHJpbmcuIFRoZSBub24tY29tcGxpYW50IEFuZHJvaWQgZnJhbWV3b3JrcworICAgICAgICAgICAgLy8gZnJvbSBBUEkgMjggYW5kIGVhcmxpZXIgd291bGQgc3RpbGwgYmUgYWJsZSB0byByZWFkIHRoZSBtaW1lX2Zvcm1hdCBjb3JyZWN0bHkKKyAgICAgICAgICAgIC8vIGFzIGl0IHdvdWxkIG9ubHkgcmVhZCB0aGUgZmlyc3QgbnVsbC10ZXJtaW5hdGVkIG1pbWVfZm9ybWF0IHN0cmluZy4gVG8gZW5hYmxlCisgICAgICAgICAgICAvLyByZWFkaW5nIG1ldGFkYXRhIHRyYWNrcyBnZW5lcmF0ZWQgZnJvbSBib3RoIHRoZSBub24tY29tcGxpYW50IGFuZCBjb21wbGlhbnQKKyAgICAgICAgICAgIC8vIGZvcm1hdHMsIGEgY2hlY2sgbmVlZHMgdG8gYmUgZG9uZSB0byBzZWUgd2hpY2ggZm9ybWF0IGlzIHVzZWQuCisgICAgICAgICAgICBjb25zdCBjaGFyICpzdHIgPSAoY29uc3QgY2hhciopIGJ1ZmZlci5nZXQoKTsKKyAgICAgICAgICAgIHNpemVfdCBzdHJpbmdfbGVuZ3RoID0gc3RybmxlbihzdHIsIGNodW5rX2RhdGFfc2l6ZSk7CisKKyAgICAgICAgICAgIGlmIChzdHJpbmdfbGVuZ3RoID09IGNodW5rX2RhdGFfc2l6ZSAtIDEpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGxpa2VseSBhIHByZSBBUEkgMjkgZmlsZSwgc2luY2UgaXQncyBhIHNpbmdsZSBudWxsIHRlcm1pbmF0ZWQKKyAgICAgICAgICAgICAgICAvLyBzdHJpbmcgZmlsbGluZyB0aGUgZW50aXJlIGJveC4KKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgc3RyKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVGhpcyBtaWdodCBiZSBhIGZ1bGx5IGNvbXBsaWFudCBtZXRhZGF0YSB0cmFjaywgYSAiZG91YmxlIG1pbWUiIGNvbXBhdGliaWxpdHkKKyAgICAgICAgICAgICAgICAvLyB0cmFjaywgb3IgYW55dGhpbmcgZWxzZSwgaW5jbHVkaW5nIGEgc2luZ2xlIG5vbi10ZXJtaW5hdGVkIHN0cmluZywgc28gd2UgbmVlZAorICAgICAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSB0aGUgbGVuZ3RoIG9mIGVhY2ggc3RyaW5nIHdlIHdhbnQgdG8gcGFyc2Ugb3V0IG9mIHRoZSBib3guCisgICAgICAgICAgICAgICAgc2l6ZV90IGVuY29kaW5nX2xlbmd0aCA9IHN0cm5sZW4oc3RyICsgOCwgY2h1bmtfZGF0YV9zaXplIC0gOCk7CisgICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nX2xlbmd0aCArIDggPj0gY2h1bmtfZGF0YV9zaXplIC0gMikgeworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZW5jb2RpbmcgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBib3gsIHNvIHRoZXJlJ3Mgbm8gbWltZV9mb3JtYXQKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU3RyaW5nOCBjb250ZW50RW5jb2Rpbmcoc3RyICsgOCwgZW5jb2RpbmdfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IG1pbWVGb3JtYXQoc3RyICsgOCArIGVuY29kaW5nX2xlbmd0aCArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICBjaHVua19kYXRhX3NpemUgLSA4IC0gZW5jb2RpbmdfbGVuZ3RoIC0gMSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBtaW1lRm9ybWF0LnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTE1NDQsMTMgKzE2MzMsMjcgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoImVuY2EiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoInNhbXIiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoInNhd2IiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIk9wdXMiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoInR3b3MiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoInNvd3QiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoImFsYWMiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImZMYUMiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoIi5tcDMiKToKKyAgICAgICAgY2FzZSAweDZENzMwMDU1OiAvLyAibXMgVSIgbXAzIGF1ZGlvCiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChtSXNRVCAmJiBjaHVua190eXBlID09IEZPVVJDQygibXA0YSIpCi0gICAgICAgICAgICAgICAgICAgICYmIGRlcHRoID49IDEgJiYgbVBhdGhbZGVwdGggLSAxXSA9PSBGT1VSQ0MoIndhdmUiKSkgewotICAgICAgICAgICAgICAgIC8vIElnbm9yZSBtcDRhIGVtYmVkZGVkIGluIFFUIHdhdmUgYXRvbQorICAgICAgICAgICAgaWYgKG1Jc1FUICYmIGRlcHRoID49IDEgJiYgbVBhdGhbZGVwdGggLSAxXSA9PSBGT1VSQ0MoIndhdmUiKSkgeworCisgICAgICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCJhbGFjIikpIHsKKyAgICAgICAgICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXRUbXAgPSAqb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUFMQUNTYW1wbGVFbnRyeSgmb2Zmc2V0VG1wKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoInBhcnNlQUxBQ1NhbXBsZUVudHJ5IGVycjolZCBMaW5lOiVkIiwgZXJyLCBfX0xJTkVfXyk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gSWdub3JlIGFsbCBhdG9tcyBlbWJlZGRlZCBpbiBRVCB3YXZlIGF0b20KKyAgICAgICAgICAgICAgICBBTE9HVigiSWdub3JlIGFsbCBhdG9tcyBlbWJlZGRlZCBpbiBRVCB3YXZlIGF0b20iKTsKICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CkBAIC0xNTc5LDcgKzE2ODIsNyBAQAogICAgICAgICAgICAgb2ZmNjRfdCBzdG9wX29mZnNldCA9ICpvZmZzZXQgKyBjaHVua19zaXplOwogICAgICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0ICsgc2l6ZW9mKGJ1ZmZlcik7CiAKLSAgICAgICAgICAgIGlmIChtSXNRVCAmJiBjaHVua190eXBlID09IEZPVVJDQygibXA0YSIpKSB7CisgICAgICAgICAgICBpZiAobUlzUVQpIHsKICAgICAgICAgICAgICAgICBpZiAodmVyc2lvbiA9PSAxKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KCpvZmZzZXQsIGJ1ZmZlciwgMTYpIDwgMTYpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKQEAgLTE2MTQsNTEgKzE3MTcsMTEyIEBACiAKICAgICAgICAgICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygiZW5jYSIpKSB7CiAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNodW5rIHR5cGUgaXMgZW5jYSwgd2UnbGwgZ2V0IHRoZSB0eXBlIGZyb20gdGhlIGZybWEgYm94IGxhdGVyCi0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOwogICAgICAgICAgICAgICAgIEFkanVzdENoYW5uZWxzQW5kUmF0ZShjaHVua190eXBlLCAmbnVtX2NoYW5uZWxzLCAmc2FtcGxlX3JhdGUpOwogCiAgICAgICAgICAgICAgICAgaWYgKCFzdHJjYXNlY21wKE1FRElBX01JTUVUWVBFX0FVRElPX1JBVywgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIHNhbXBsZV9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsIHNhbXBsZV9zaXplKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCJ0d29zIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVBjbUJpZ0VuZGlhbiwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fQklHX0VORElBTiwgMSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiKioqIGNvZGluZz0nJXMnICVkIGNoYW5uZWxzLCBzaXplICVkLCByYXRlICVkXG4iLAogICAgICAgICAgICAgICAgICAgIGNodW5rLCBudW1fY2hhbm5lbHMsIHNhbXBsZV9zaXplLCBzYW1wbGVfcmF0ZSk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIG51bV9jaGFubmVscyk7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVfcmF0ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBudW1fY2hhbm5lbHMpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZV9yYXRlKTsKIAotICAgICAgICAgICAgaWYgKGNodW5rX3R5cGUgPT0gRk9VUkNDKCJhbGFjIikpIHsKLQotICAgICAgICAgICAgICAgIC8vIFNlZSAnZXh0ZXJuYWwvYWxhYy9BTEFDTWFnaWNDb29raWVEZXNjcmlwdGlvbi50eHQgZm9yIHRoZSBkZXRhaWwnLgotICAgICAgICAgICAgICAgIC8vIFN0b3JlIEFMQUMgbWFnaWMgY29va2llIChkZWNvZGVyIG5lZWRzIGl0KS4KLSAgICAgICAgICAgICAgICB1aW50OF90IGFsYWNJbmZvWzEyXTsKKyAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygiT3B1cyIpKSB7CisgICAgICAgICAgICAgICAgdWludDhfdCBvcHVzSW5mb1tBT1BVU19PUFVTSEVBRF9NQVhTSVpFXTsKICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCArPSBzaXplb2YoYnVmZmVyKTsKLSAgICAgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBhbGFjSW5mbywgc2l6ZW9mKGFsYWNJbmZvKSkgPCAoc3NpemVfdClzaXplb2YoYWxhY0luZm8pKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdWludDMyX3Qgc2l6ZSA9IFUzMl9BVCgmYWxhY0luZm9bMF0pOwotICAgICAgICAgICAgICAgIGlmICgoc2l6ZSAhPSBBTEFDX1NQRUNJRklDX0lORk9fU0laRSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChVMzJfQVQoJmFsYWNJbmZvWzRdKSAhPSBGT1VSQ0MoImFsYWMiKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChVMzJfQVQoJmFsYWNJbmZvWzhdKSAhPSAwKSkgeworICAgICAgICAgICAgICAgIHNpemVfdCBvcHVzSW5mb1NpemUgPSBjaHVua19kYXRhX3NpemUgLSBzaXplb2YoYnVmZmVyKTsKKworICAgICAgICAgICAgICAgIGlmIChvcHVzSW5mb1NpemUgPCBBT1BVU19PUFVTSEVBRF9NSU5TSVpFIHx8CisgICAgICAgICAgICAgICAgICAgIG9wdXNJbmZvU2l6ZSA+IEFPUFVTX09QVVNIRUFEX01BWFNJWkUpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gc2l6ZW9mKGFsYWNJbmZvKTsKLSAgICAgICAgICAgICAgICB1aW50OF90IGNvb2tpZVtzaXplIC0gc2l6ZW9mKGFsYWNJbmZvKV07CisgICAgICAgICAgICAgICAgLy8gUmVhZCBPcHVzIEhlYWRlcgogICAgICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNvb2tpZSwgc2l6ZW9mKGNvb2tpZSkpIDwgKHNzaXplX3Qpc2l6ZW9mKGNvb2tpZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBvcHVzSW5mbywgb3B1c0luZm9TaXplKSA8IG9wdXNJbmZvU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgdWludDhfdCBiaXRzUGVyU2FtcGxlID0gY29va2llWzVdOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIGJpdHNQZXJTYW1wbGUpOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY29va2llWzldKTsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBVMzJfQVQoJmNvb2tpZVsyMF0pKTsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5QWxhY01hZ2ljQ29va2llLCBNZXRhRGF0YTo6VFlQRV9OT05FLCBjb29raWUsIHNpemVvZihjb29raWUpKTsKLSAgICAgICAgICAgICAgICBkYXRhX29mZnNldCArPSBzaXplb2YoY29va2llKTsKKyAgICAgICAgICAgICAgICAvLyBPcHVzSGVhZGVyIG11c3Qgc3RhcnQgd2l0aCB0aGlzIG1hZ2ljIHNlcXVlbmNlLCBvdmVyd3JpdGUgZmlyc3QgOCBieXRlcworICAgICAgICAgICAgICAgIC8vIGh0dHA6Ly93aWtpLnhpcGgub3JnL09nZ09wdXMjSURfSGVhZGVyCisgICAgICAgICAgICAgICAgc3RybmNweSgoY2hhciAqKW9wdXNJbmZvLCAiT3B1c0hlYWQiLCA4KTsKKworICAgICAgICAgICAgICAgIC8vIFZlcnNpb24gc2hhbGwgYmUgMCBhcyBwZXIgbXA0IE9wdXMgU3BlY2lmaWMgQm94CisgICAgICAgICAgICAgICAgLy8gKGh0dHBzOi8vb3B1cy1jb2RlYy5vcmcvZG9jcy9vcHVzX2luX2lzb2JtZmYuaHRtbCM0LjMuMikKKyAgICAgICAgICAgICAgICBpZiAob3B1c0luZm9bOF0pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gRm9yY2UgdmVyc2lvbiB0byAxIGFzIHBlciBPcHVzSGVhZCBkZWZpbml0aW9uCisgICAgICAgICAgICAgICAgLy8gKGh0dHA6Ly93aWtpLnhpcGgub3JnL09nZ09wdXMjSURfSGVhZGVyKQorICAgICAgICAgICAgICAgIG9wdXNJbmZvWzhdID0gMTsKKworICAgICAgICAgICAgICAgIC8vIFJlYWQgT3B1cyBTcGVjaWZpYyBCb3ggdmFsdWVzCisgICAgICAgICAgICAgICAgc2l6ZV90IG9wdXNPZmZzZXQgPSAxMDsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBwcmVfc2tpcCA9IFUxNl9BVCgmb3B1c0luZm9bb3B1c09mZnNldF0pOworICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZV9yYXRlID0gVTMyX0FUKCZvcHVzSW5mb1tvcHVzT2Zmc2V0ICsgMl0pOworICAgICAgICAgICAgICAgIHVpbnQxNl90IG91dF9nYWluID0gVTE2X0FUKCZvcHVzSW5mb1tvcHVzT2Zmc2V0ICsgNl0pOworCisgICAgICAgICAgICAgICAgLy8gQ29udmVydCBPcHVzIFNwZWNpZmljIEJveCB2YWx1ZXMuIFBhcnNlT3B1c0hlYWRlciBleHBlY3RzCisgICAgICAgICAgICAgICAgLy8gdGhlIHZhbHVlcyBpbiBMRSwgaG93ZXZlciBNUDQgc3RvcmVzIHRoZXNlIHZhbHVlcyBhcyBCRQorICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vb3B1cy1jb2RlYy5vcmcvZG9jcy9vcHVzX2luX2lzb2JtZmYuaHRtbCM0LjMuMgorICAgICAgICAgICAgICAgIG1lbWNweSgmb3B1c0luZm9bb3B1c09mZnNldF0sICZwcmVfc2tpcCwgc2l6ZW9mKHByZV9za2lwKSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZvcHVzSW5mb1tvcHVzT2Zmc2V0ICsgMl0sICZzYW1wbGVfcmF0ZSwgc2l6ZW9mKHNhbXBsZV9yYXRlKSk7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZvcHVzSW5mb1tvcHVzT2Zmc2V0ICsgNl0sICZvdXRfZ2Fpbiwgc2l6ZW9mKG91dF9nYWluKSk7CisKKyAgICAgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrU2Vla1ByZVJvbGxOcyA9IDgwMDAwMDAwOyAgLy8gRml4ZWQgODAgbXNlYworICAgICAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtPcHVzU2FtcGxlUmF0ZSA9IDQ4MDAwOworICAgICAgICAgICAgICAgIGludDY0X3QgY29kZWNEZWxheSA9IHByZV9za2lwICogMTAwMDAwMDAwMGxsIC8ga09wdXNTYW1wbGVSYXRlOworCisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIG9wdXNJbmZvLCBvcHVzSW5mb1NpemUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzEsICZjb2RlY0RlbGF5LCBzaXplb2YoY29kZWNEZWxheSkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzIsICZrU2Vla1ByZVJvbGxOcywgc2l6ZW9mKGtTZWVrUHJlUm9sbE5zKSk7CisKKyAgICAgICAgICAgICAgICBkYXRhX29mZnNldCArPSBvcHVzSW5mb1NpemU7CisgICAgICAgICAgICAgICAgKm9mZnNldCA9IGRhdGFfb2Zmc2V0OworICAgICAgICAgICAgICAgIENIRUNLX0VRKCpvZmZzZXQsIHN0b3Bfb2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCFtSXNRVCAmJiBjaHVua190eXBlID09IEZPVVJDQygiYWxhYyIpKSB7CisgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gc2l6ZW9mKGJ1ZmZlcik7CisKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZUFMQUNTYW1wbGVFbnRyeSgmZGF0YV9vZmZzZXQpOworICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoInBhcnNlQUxBQ1NhbXBsZUVudHJ5IGVycjolZCBMaW5lOiVkIiwgZXJyLCBfX0xJTkVfXyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldDsKKyAgICAgICAgICAgICAgICBDSEVDS19FUSgqb2Zmc2V0LCBzdG9wX29mZnNldCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjaHVua190eXBlID09IEZPVVJDQygiZkxhQyIpKSB7CisKKyAgICAgICAgICAgICAgICAvLyBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS94aXBoL2ZsYWMvYmxvYi9tYXN0ZXIvZG9jL2lzb2ZsYWMudHh0CisgICAgICAgICAgICAgICAgLy8gNCBmb3IgbWltZSwgNCBmb3IgYmxvY2tUeXBlIGFuZCBCbG9ja0xlbiwgMzQgZm9yIG1ldGFkYXRhCisgICAgICAgICAgICAgICAgdWludDhfdCBmbGFjSW5mb1s0ICsgNCArIDM0XTsKKyAgICAgICAgICAgICAgICAvLyBza2lwcGluZyBkRmxhLCB2ZXJzaW9uCisgICAgICAgICAgICAgICAgZGF0YV9vZmZzZXQgKz0gc2l6ZW9mKGJ1ZmZlcikgKyAxMjsKKyAgICAgICAgICAgICAgICBzaXplX3QgZmxhY09mZnNldCA9IDQ7CisgICAgICAgICAgICAgICAgLy8gQWRkIGZsYUMgaGVhZGVyIG1pbWUgdHlwZSB0byBDU0QKKyAgICAgICAgICAgICAgICBzdHJuY3B5KChjaGFyICopZmxhY0luZm8sICJmTGFDIiwgNCk7CisgICAgICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgZmxhY0luZm8gKyBmbGFjT2Zmc2V0LCBzaXplb2YoZmxhY0luZm8pIC0gZmxhY09mZnNldCkgPAorICAgICAgICAgICAgICAgICAgICAgICAgKHNzaXplX3Qpc2l6ZW9mKGZsYWNJbmZvKSAtIGZsYWNPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkYXRhX29mZnNldCArPSBzaXplb2YoZmxhY0luZm8pIC0gZmxhY09mZnNldDsKKworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgZmxhY0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmxhY0luZm8pKTsKICAgICAgICAgICAgICAgICAqb2Zmc2V0ID0gZGF0YV9vZmZzZXQ7CiAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEoKm9mZnNldCwgc3RvcF9vZmZzZXQpOwogICAgICAgICAgICAgfQpAQCAtMTY4NCw2ICsxODQ4LDcgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoImF2YzEiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoImh2YzEiKToKICAgICAgICAgY2FzZSBGT1VSQ0MoImhldjEiKToKKyAgICAgICAgY2FzZSBGT1VSQ0MoImF2MDEiKToKICAgICAgICAgewogICAgICAgICAgICAgdWludDhfdCBidWZmZXJbNzhdOwogICAgICAgICAgICAgaWYgKGNodW5rX2RhdGFfc2l6ZSA8IChzc2l6ZV90KXNpemVvZihidWZmZXIpKSB7CkBAIC0xNzE1LDEwICsxODgwLDExIEBACiAKICAgICAgICAgICAgIGlmIChjaHVua190eXBlICE9IEZPVVJDQygiZW5jdiIpKSB7CiAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGNodW5rIHR5cGUgaXMgZW5jdiwgd2UnbGwgZ2V0IHRoZSB0eXBlIGZyb20gdGhlIGZybWEgYm94IGxhdGVyCi0gICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgRm91ckNDMk1JTUUoY2h1bmtfdHlwZSkpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5V2lkdGgsIHdpZHRoKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCB3aWR0aCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsIGhlaWdodCk7CiAKICAgICAgICAgICAgIG9mZjY0X3Qgc3RvcF9vZmZzZXQgPSAqb2Zmc2V0ICsgY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICpvZmZzZXQgPSBkYXRhX29mZnNldCArIHNpemVvZihidWZmZXIpOwpAQCAtMTc5MCw2ICsxOTU2LDggQEAKICAgICAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBhZGp1c3RSYXdEZWZhdWx0RnJhbWVTaXplKCk7CisKICAgICAgICAgICAgIHNpemVfdCBtYXhfc2l6ZTsKICAgICAgICAgICAgIGVyciA9IG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5nZXRNYXhTYW1wbGVTaXplKCZtYXhfc2l6ZSk7CiAKQEAgLTE4MDYsMTIgKzE5NzQsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm1heCBzYW1wbGUgc2l6ZSB0b28gYmlnOiAlenUiLCBtYXhfc2l6ZSk7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4X3NpemUgKyAxMCAqIDIpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgbWF4X3NpemUgKyAxMCAqIDIpOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAvLyBObyBzaXplIHdhcyBzcGVjaWZpZWQuIFBpY2sgYSBjb25zZXJ2YXRpdmVseSBsYXJnZSBzaXplLgogICAgICAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgaWYgKCFtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5V2lkdGgsIChpbnQzMl90Kikmd2lkdGgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICFtTGFzdFRyYWNrLT5tZXRhLmZpbmRJbnQzMihrS2V5SGVpZ2h0LChpbnQzMl90KikgJmhlaWdodCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgKGludDMyX3QqKSZ3aWR0aCkgfHwKKyAgICAgICAgICAgICAgICAgICAgIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULChpbnQzMl90KikgJmhlaWdodCkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vIHdpZHRoIG9yIGhlaWdodCwgYXNzdW1pbmcgd29yc3QgY2FzZSAxMDgwcCIpOwogICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IDE5MjA7CiAgICAgICAgICAgICAgICAgICAgIGhlaWdodCA9IDEwODA7CkBAIC0xODI2LDcgKzE5OTcsNyBAQAogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAgICAgICAgICAgICAgICAgaWYgKCFzdHJuY21wKG1pbWUsICJhdWRpby8iLCA2KSkgewogICAgICAgICAgICAgICAgICAgICAvLyBmb3IgYXVkaW8sIHVzZSAxMjhLQgogICAgICAgICAgICAgICAgICAgICBtYXhfc2l6ZSA9IDEwMjQgKiAxMjg7CkBAIC0xODQzLDI2ICsyMDE0LDI4IEBACiAgICAgICAgICAgICAgICAgLy8gSEFDSzogYWxsb3cgMTAlIG92ZXJoZWFkCiAgICAgICAgICAgICAgICAgLy8gVE9ETzogcmVhZCBzYW1wbGUgc2l6ZSBmcm9tIHRyYWYgYXRvbSBmb3IgZnJhZ21lbnRlZCBNUEVHNC4KICAgICAgICAgICAgICAgICBtYXhfc2l6ZSArPSBtYXhfc2l6ZSAvIDEwOwotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleU1heElucHV0U2l6ZSwgbWF4X3NpemUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBtYXhfc2l6ZSk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIE5PVEU6IHNldHRpbmcgYW5vdGhlciBwaWVjZSBvZiBtZXRhZGF0YSBpbnZhbGlkYXRlcyBhbnkgcG9pbnRlcnMgKHN1Y2ggYXMgdGhlCiAgICAgICAgICAgICAvLyBtaW1ldHlwZSkgcHJldmlvdXNseSBvYnRhaW5lZCwgc28gZG9uJ3QgY2FjaGUgdGhlbS4KICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgICAgICBDSEVDSyhtTGFzdFRyYWNrLT5tZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICAgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIGF2ZXJhZ2UgZnJhbWUgcmF0ZS4KICAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKSB7CiAgICAgICAgICAgICAgICAgc2l6ZV90IG5TYW1wbGVzID0gbUxhc3RUcmFjay0+c2FtcGxlVGFibGUtPmNvdW50U2FtcGxlcygpOwogICAgICAgICAgICAgICAgIGlmIChuU2FtcGxlcyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHJhY2tJZDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlUcmFja0lELCAmdHJhY2tJZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQsICZ0cmFja0lkKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJleC5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyZXggKnQgPSAmbVRyZXguZWRpdEl0ZW1BdChpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodC0+dHJhY2tfSUQgPT0gKHVpbnQzMl90KSB0cmFja0lkKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LT5kZWZhdWx0X3NhbXBsZV9kdXJhdGlvbiA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVSYXRlID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+dGltZXNjYWxlIC8gdC0+ZGVmYXVsdF9zYW1wbGVfZHVyYXRpb247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlGcmFtZVJhdGUsIGZyYW1lUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLCBmcmFtZVJhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTE4NzAsMTUgKzIwNDMsMTggQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2stPm1ldGEuZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0SW50NjQobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmZHVyYXRpb25VcykpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkdXJhdGlvblVzID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVSYXRlID0gKG5TYW1wbGVzICogMTAwMDAwMExMICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZHVyYXRpb25VcyA+PiAxKSkgLyBkdXJhdGlvblVzOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUZyYW1lUmF0ZSwgZnJhbWVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSwgZnJhbWVSYXRlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBBTE9HVigic2V0dGluZyBmcmFtZSBjb3VudCAlenUiLCBuU2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUZyYW1lQ291bnQsIG5TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9DT1VOVCwgblNhbXBsZXMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtMTg5Miw2ICsyMDY4LDEzIEBACiAKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKIAorICAgICAgICAgICAgaWYgKGRlcHRoID49IDEgJiYgbVBhdGhbZGVwdGggLSAxXSAhPSBGT1VSQ0MoInN0YmwiKSkgeworICAgICAgICAgICAgICAgIGNoYXIgY2h1bmtbNV07CisgICAgICAgICAgICAgICAgTWFrZUZvdXJDQ1N0cmluZyhtUGF0aFtkZXB0aCAtIDFdLCBjaHVuayk7CisgICAgICAgICAgICAgICAgQUxPR1coInN0dHMncyBwYXJlbnQgYm94ICglcykgaXMgbm90IHN0YmwsIHNraXAgaXQuIiwgY2h1bmspOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPQogICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRUaW1lVG9TYW1wbGVQYXJhbXMoCiAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKTsKQEAgLTE5ODYsNyArMjE2OSw3IEBACiAgICAgICAgICAgICBpZiAoYnVmZmVyW2xlbiAtIDFdICE9ICcvJykgewogICAgICAgICAgICAgICAgIGJ1ZmZlcltsZW5dID0gJy8nOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlMb2NhdGlvbiwgJmJ1ZmZlclswXSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfTE9DQVRJT04sICZidWZmZXJbMF0pOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIApAQCAtMTk5OCw5ICsyMTgxLDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgdWludDhfdCBidWZmZXJbMjU2XTsKLSAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPiAob2ZmNjRfdClzaXplb2YoYnVmZmVyKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9CVUZGRVJfVE9PX1NNQUxMOworICAgICAgICAgICAgYXV0byB0bXAgPSBoZWFwYnVmZmVyPHVpbnQ4X3Q+KGNodW5rX2RhdGFfc2l6ZSk7CisgICAgICAgICAgICB1aW50OF90ICpidWZmZXIgPSB0bXAuZ2V0KCk7CisgICAgICAgICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLUVOT01FTTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQoCkBAIC0yMDE2LDggKzIyMDAsOCBAQAogICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkKICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlFU0RTLCBrVHlwZUVTRFMsICZidWZmZXJbNF0sIGNodW5rX2RhdGFfc2l6ZSAtIDQpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLCAKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9FU0RTLCAmYnVmZmVyWzRdLCBjaHVua19kYXRhX3NpemUgLSA0KTsKIAogICAgICAgICAgICAgaWYgKG1QYXRoLnNpemUoKSA+PSAyCiAgICAgICAgICAgICAgICAgICAgICYmIG1QYXRoW21QYXRoLnNpemUoKSAtIDJdID09IEZPVVJDQygibXA0YSIpKSB7CkBAIC0yMDQxLDcgKzIyMjUsOCBAQAogICAgICAgICAgICAgICAgIHVpbnQ4X3Qgb2JqZWN0VHlwZUluZGljYXRpb247CiAgICAgICAgICAgICAgICAgaWYgKGVzZHMuZ2V0T2JqZWN0VHlwZUluZGljYXRpb24oJm9iamVjdFR5cGVJbmRpY2F0aW9uKSA9PSBPSykgewogICAgICAgICAgICAgICAgICAgICBpZiAob2JqZWN0VHlwZUluZGljYXRpb24gPj0gMHg2MCAmJiBvYmplY3RUeXBlSW5kaWNhdGlvbiA8PSAweDY1KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMik7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtMjA2OCwxMCArMjI1MywxMiBAQAogICAgICAgICAgICAgdWludDMyX3QgbWF4Qml0cmF0ZSA9IFUzMl9BVCgmYnVmZmVyWzRdKTsKICAgICAgICAgICAgIHVpbnQzMl90IGF2Z0JpdHJhdGUgPSBVMzJfQVQoJmJ1ZmZlcls4XSk7CiAgICAgICAgICAgICBpZiAobWF4Qml0cmF0ZSA+IDAgJiYgbWF4Qml0cmF0ZSA8IElOVDMyX01BWCkgewotICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleU1heEJpdFJhdGUsIChpbnQzMl90KW1heEJpdHJhdGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfQklUX1JBVEUsIChpbnQzMl90KW1heEJpdHJhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKGF2Z0JpdHJhdGUgPiAwICYmIGF2Z0JpdHJhdGUgPCBJTlQzMl9NQVgpIHsKLSAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlCaXRSYXRlLCAoaW50MzJfdClhdmdCaXRyYXRlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIChpbnQzMl90KWF2Z0JpdHJhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTIwOTUsOCArMjI4Miw4IEBACiAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUFWQ0MsIGtUeXBlQVZDQywgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLCAKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yMTE3LDEzICsyMzA0LDM1IEBACiAgICAgICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICAgICAga0tleUhWQ0MsIGtUeXBlSFZDQywgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLCAKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQywgYnVmZmVyLmdldCgpLCBjaHVua19kYXRhX3NpemUpOwogCiAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQorICAgICAgICBjYXNlIEZPVVJDQygiYXYxQyIpOgorICAgICAgICB7CisgICAgICAgICAgICBhdXRvIGJ1ZmZlciA9IGhlYXBidWZmZXI8dWludDhfdD4oY2h1bmtfZGF0YV9zaXplKTsKIAorICAgICAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoImIvMjg0NzEyMDYiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBidWZmZXIuZ2V0KCksIGNodW5rX2RhdGFfc2l6ZSkgPCBjaHVua19kYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGJ1ZmZlci5nZXQoKSwgY2h1bmtfZGF0YV9zaXplKTsKKworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoImQyNjMiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwpAQCAtMjE1Myw3ICsyMzYyLDggQEAKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXREYXRhKGtLZXlEMjYzLCBrVHlwZUQyNjMsIGJ1ZmZlciwgY2h1bmtfZGF0YV9zaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EMjYzLCBidWZmZXIsIGNodW5rX2RhdGFfc2l6ZSk7CiAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yMjgxLDE1ICsyNDkxLDE1IEBACiAgICAgICAgICAgICAgICAgZHVyYXRpb24gPSBkMzI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDAgJiYgZHVyYXRpb24gPCBVSU5UNjRfTUFYIC8gMTAwMDAwMCkgewotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUZpbGVNZXRhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uICogMTAwMDAwMCAvIG1IZWFkZXJUaW1lc2NhbGUpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBTdHJpbmc4IHM7CiAgICAgICAgICAgICBpZiAoY29udmVydFRpbWVUb0RhdGUoY3JlYXRpb25UaW1lLCAmcykpIHsKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleURhdGUsIHMuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9EQVRFLCBzLnN0cmluZygpKTsKICAgICAgICAgICAgIH0KIAotCiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yMzMxLDcgKzI1NDEsOCBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoZHVyYXRpb24gIT0gMCAmJiBtSGVhZGVyVGltZXNjYWxlICE9IDApIHsKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb24gKiAxMDAwMDAwIC8gbUhlYWRlclRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBkdXJhdGlvbiAqIDEwMDAwMDAgLyBtSGVhZGVyVGltZXNjYWxlKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnJlYWs7CkBAIC0yMzY1LDcgKzI1NzYsOCBAQAogICAgICAgICAgICAgLy8gZm9yIGEgcHJhY3RpY2FsIHJlYXNvbiBhcyB2YXJpb3VzIE1QRUc0IGNvbnRhaW5lcnMgdXNlIGl0LgogICAgICAgICAgICAgaWYgKHR5cGUgPT0gRk9VUkNDKCJ0ZXh0IikgfHwgdHlwZSA9PSBGT1VSQ0MoInNidGwiKSkgewogICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKQEAgLTI0MDksNDIgKzI2MjEsNTUgQEAKICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7Ci0gICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7Ci0gICAgICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgICAgICAgICBzaXplID0gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChjaHVua19zaXplID4gU0laRV9NQVgpIHx8IChTSVpFX01BWCAtIGNodW5rX3NpemUgPD0gc2l6ZSkpIHsKKyAgICAgICAgICAgIC8vIGNvbXBsYWluIGFib3V0IHJpZGljdWxvdXMgY2h1bmtzCisgICAgICAgICAgICBpZiAoY2h1bmtfc2l6ZSA+IGtNYXhBdG9tU2l6ZSkgewogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W3NpemUgKyBjaHVua19zaXplXTsKLSAgICAgICAgICAgIGlmIChidWZmZXIgPT0gTlVMTCkgeworICAgICAgICAgICAgLy8gY29tcGxhaW4gYWJvdXQgZW1wdHkgYXRvbXMKKyAgICAgICAgICAgIGlmIChjaHVua19kYXRhX3NpemUgPD0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzEyNDMzMDIwNCIpOworICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTI0MzMwMjA0Iik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHNpemUgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGJ1ZmZlciwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICAvLyBzaG91bGQgZmlsbCBidWZmZXIgYmFzZWQgb24gImRhdGFfb2Zmc2V0IiBhbmQgImNodW5rX2RhdGFfc2l6ZSIKKyAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgKm9mZnNldCBhbmQgY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIC8vIGJ1dCB3ZSd2ZSBiZWVuIGZlZWRpbmcgdGhlIGV4dHJhIGRhdGEgdG8gY29uc3VtZXJzIGZvciBtdWx0aXBsZSByZWxlYXNlcyBhbmQKKyAgICAgICAgICAgIC8vIGlmIHRob3NlIGFwcHMgYXJlIGNvbXBlbnNhdGluZyBmb3IgaXQsIHdlJ2QgYnJlYWsgdGhlbSB3aXRoIHN1Y2ggYSBjaGFuZ2UKKyAgICAgICAgICAgIC8vCisKKyAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrLT5tVHgzZ1NpemUgLSBtTGFzdFRyYWNrLT5tVHgzZ0ZpbGxlZCA8IGNodW5rX3NpemUpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgZ3Jvd3RoID0ga1R4M2dHcm93dGg7CisgICAgICAgICAgICAgICAgaWYgKGdyb3d0aCA8IGNodW5rX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgZ3Jvd3RoID0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gYWx0aG91Z2ggdGhpcyBkaXNhbGxvd3MgMiB0eDNnIGF0b21zIG9mIG5lYXJseSBrTWF4QXRvbVNpemUuLi4KKyAgICAgICAgICAgICAgICBpZiAoKHVpbnQ2NF90KSBtTGFzdFRyYWNrLT5tVHgzZ1NpemUgKyBncm93dGggPiBrTWF4QXRvbVNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImIvMTI0MzMwMjA0IC0gdG9vIG11Y2ggc3BhY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMjQzMzAyMDQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgdWludDhfdCAqdXBkYXRlZCA9ICh1aW50OF90ICopcmVhbGxvYyhtTGFzdFRyYWNrLT5tVHgzZ0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1UeDNnU2l6ZSArIGdyb3d0aCk7CisgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZWQgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tVHgzZ0J1ZmZlciA9IHVwZGF0ZWQ7CisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bVR4M2dTaXplICs9IGdyb3d0aDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKChzaXplX3QpKG1EYXRhU291cmNlLT5yZWFkQXQoKm9mZnNldCwgYnVmZmVyICsgc2l6ZSwgY2h1bmtfc2l6ZSkpCisgICAgICAgICAgICBpZiAoKHNpemVfdCkobURhdGFTb3VyY2UtPnJlYWRBdCgqb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bVR4M2dCdWZmZXIgKyBtTGFzdFRyYWNrLT5tVHgzZ0ZpbGxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rX3NpemUpKQogICAgICAgICAgICAgICAgICAgICA8IGNodW5rX3NpemUpIHsKLSAgICAgICAgICAgICAgICBkZWxldGVbXSBidWZmZXI7Ci0gICAgICAgICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAogICAgICAgICAgICAgICAgIC8vIGFkdmFuY2UgcmVhZCBwb2ludGVyIHNvIHdlIGRvbid0IGVuZCB1cCByZWFkaW5nIHRoaXMgYWdhaW4KICAgICAgICAgICAgICAgICAqb2Zmc2V0ICs9IGNodW5rX3NpemU7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldERhdGEoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSwgMCwgYnVmZmVyLCBzaXplICsgY2h1bmtfc2l6ZSk7Ci0KLSAgICAgICAgICAgIGRlbGV0ZVtdIGJ1ZmZlcjsKLQorICAgICAgICAgICAgbUxhc3RUcmFjay0+bVR4M2dGaWxsZWQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNDczLDggKzI2OTgsOCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RGF0YSgKLSAgICAgICAgICAgICAgICBrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsCisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCwKICAgICAgICAgICAgICAgICBidWZmZXIuZ2V0KCkgKyBrU2tpcEJ5dGVzT2ZEYXRhQm94LCBjaHVua19kYXRhX3NpemUgLSBrU2tpcEJ5dGVzT2ZEYXRhQm94KTsKIAogICAgICAgICAgICAgYnJlYWs7CkBAIC0yNTQ4LDcgKzI3NzMsNDAgQEAKICAgICAgICAgY2FzZSBGT1VSQ0MoImFjLTMiKToKICAgICAgICAgewogICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOwotICAgICAgICAgICAgcmV0dXJuIHBhcnNlQUMzU2FtcGxlRW50cnkoZGF0YV9vZmZzZXQpOworICAgICAgICAgICAgLy8gYnlwYXNzIGFjLTMgaWYgcGFyc2UgZmFpbAorICAgICAgICAgICAgaWYgKHBhcnNlQUMzU3BlY2lmaWNCb3goZGF0YV9vZmZzZXQpICE9IE9LKSB7CisgICAgICAgICAgICAgICAgaWYgKG1MYXN0VHJhY2sgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiRmFpbCB0byBwYXJzZSBhYy0zIik7CisgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPnNraXBUcmFjayA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGT1VSQ0MoImVjLTMiKToKKyAgICAgICAgeworICAgICAgICAgICAgKm9mZnNldCArPSBjaHVua19zaXplOworICAgICAgICAgICAgLy8gYnlwYXNzIGVjLTMgaWYgcGFyc2UgZmFpbAorICAgICAgICAgICAgaWYgKHBhcnNlRUFDM1NwZWNpZmljQm94KGRhdGFfb2Zmc2V0KSAhPSBPSykgeworICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZhaWwgdG8gcGFyc2UgZWMtMyIpOworICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5za2lwVHJhY2sgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgRk9VUkNDKCJhYy00Iik6CisgICAgICAgIHsKKyAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKKyAgICAgICAgICAgIC8vIGJ5cGFzcyBhYy00IGlmIHBhcnNlIGZhaWwKKyAgICAgICAgICAgIGlmIChwYXJzZUFDNFNwZWNpZmljQm94KGRhdGFfb2Zmc2V0KSAhPSBPSykgeworICAgICAgICAgICAgICAgIGlmIChtTGFzdFRyYWNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIkZhaWwgdG8gcGFyc2UgYWMtNCIpOworICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5za2lwVHJhY2sgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgRk9VUkNDKCJmdHlwIik6CkBAIC0yNjIyLDM2ICsyODgwLDMzMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQUMzU2FtcGxlRW50cnkob2ZmNjRfdCBvZmZzZXQpIHsKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUNoYW5uZWxDb3VudFNhbXBsZVJhdGUoCisgICAgICAgIG9mZjY0X3QgKm9mZnNldCwgdWludDE2X3QgKmNoYW5uZWxDb3VudCwgdWludDE2X3QgKnNhbXBsZVJhdGUpIHsKICAgICAvLyBza2lwIDE2IGJ5dGVzOgogICAgIC8vICArIDYtYnl0ZSByZXNlcnZlZCwKICAgICAvLyAgKyAyLWJ5dGUgZGF0YSByZWZlcmVuY2UgaW5kZXgsCiAgICAgLy8gICsgOC1ieXRlIHJlc2VydmVkCi0gICAgb2Zmc2V0ICs9IDE2OwotICAgIHVpbnQxNl90IGNoYW5uZWxDb3VudDsKLSAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MTYob2Zmc2V0LCAmY2hhbm5lbENvdW50KSkgeworICAgICpvZmZzZXQgKz0gMTY7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KCpvZmZzZXQsIGNoYW5uZWxDb3VudCkpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIHNhbXBsZSBlbnRyeSBib3g6IGNhbm5vdCByZWFkIGNoYW5uZWwgY291bnQiKTsKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAgICAgLy8gc2tpcCA4IGJ5dGVzOgogICAgIC8vICArIDItYnl0ZSBjaGFubmVsQ291bnQsCiAgICAgLy8gICsgMi1ieXRlIHNhbXBsZSBzaXplLAogICAgIC8vICArIDQtYnl0ZSByZXNlcnZlZAotICAgIG9mZnNldCArPSA4OwotICAgIHVpbnQxNl90IHNhbXBsZVJhdGU7Ci0gICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDE2KG9mZnNldCwgJnNhbXBsZVJhdGUpKSB7Ci0gICAgICAgIEFMT0dFKCJNUEVHNEV4dHJhY3RvcjogZXJyb3Igd2hpbGUgcmVhZGluZyBhYy0zIGJsb2NrOiBjYW5ub3QgcmVhZCBzYW1wbGUgcmF0ZSIpOworICAgICpvZmZzZXQgKz0gODsKKyAgICBpZiAoIW1EYXRhU291cmNlLT5nZXRVSW50MTYoKm9mZnNldCwgc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIHNhbXBsZSBlbnRyeSBib3g6IGNhbm5vdCByZWFkIHNhbXBsZSByYXRlIik7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQotCiAgICAgLy8gc2tpcCA0IGJ5dGVzOgogICAgIC8vICArIDItYnl0ZSBzYW1wbGVSYXRlLAogICAgIC8vICArIDItYnl0ZSByZXNlcnZlZAotICAgIG9mZnNldCArPSA0OwotICAgIHJldHVybiBwYXJzZUFDM1NwZWNpZmljQm94KG9mZnNldCwgc2FtcGxlUmF0ZSk7CisgICAgKm9mZnNldCArPSA0OworICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlQUMzU3BlY2lmaWNCb3goCi0gICAgICAgIG9mZjY0X3Qgb2Zmc2V0LCB1aW50MTZfdCBzYW1wbGVSYXRlKSB7CitzdGF0dXNfdCBNUEVHNEV4dHJhY3Rvcjo6cGFyc2VBQzRTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCkgeworICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICB1aW50MTZfdCBzYW1wbGVSYXRlLCBjaGFubmVsQ291bnQ7CisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyc2VDaGFubmVsQ291bnRTYW1wbGVSYXRlKCZvZmZzZXQsICZjaGFubmVsQ291bnQsICZzYW1wbGVSYXRlKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICAvLyArIDQtYnl0ZSBzaXplCisgICAgLy8gKyA0LWJ5dGUgdHlwZQorICAgIC8vICsgMy1ieXRlIHBheWxvYWQKKyAgICBjb25zdCB1aW50MzJfdCBrQUM0TWluaW11bUJveFNpemUgPSA0ICsgNCArIDM7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnNpemUpIHx8IHNpemUgPCBrQUM0TWluaW11bUJveFNpemUpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTQgYmxvY2s6IGNhbm5vdCByZWFkIHNwZWNpZmljIGJveCBzaXplIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgLy8gKyA0LWJ5dGUgc2l6ZQorICAgIG9mZnNldCArPSA0OworICAgIHVpbnQzMl90IHR5cGU7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnR5cGUpIHx8IHR5cGUgIT0gRk9VUkNDKCJkYWM0IikpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTQgc3BlY2lmaWMgYmxvY2s6IGhlYWRlciBub3QgZGFjNCIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIC8vICsgNC1ieXRlIHR5cGUKKyAgICBvZmZzZXQgKz0gNDsKKyAgICBjb25zdCB1aW50MzJfdCBrQUM0U3BlY2lmaWNCb3hQYXlsb2FkU2l6ZSA9IDExNzY7CisgICAgdWludDhfdCBjaHVua1trQUM0U3BlY2lmaWNCb3hQYXlsb2FkU2l6ZV07CisgICAgc3NpemVfdCBkc2lTaXplID0gc2l6ZSAtIDg7IC8vIHNpemUgb2YgYm94IC0gc2l6ZSBhbmQgdHlwZSBmaWVsZHMKKyAgICBpZiAoZHNpU2l6ZSA+PSAoc3NpemVfdClrQUM0U3BlY2lmaWNCb3hQYXlsb2FkU2l6ZSB8fAorICAgICAgICBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgY2h1bmssIGRzaVNpemUpICE9IGRzaVNpemUpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGFjLTQgc3BlY2lmaWMgYmxvY2s6IGJpdHN0cmVhbSBmaWVsZHMiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgLy8gKyBzaXplLWJ5dGUgcGF5bG9hZAorICAgIG9mZnNldCArPSBkc2lTaXplOworICAgIEFCaXRSZWFkZXIgYnIoY2h1bmssIGRzaVNpemUpOworICAgIEFDNERTSVBhcnNlciBwYXJzZXIoYnIpOworICAgIGlmICghcGFyc2VyLnBhcnNlKCkpeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHBhcnNpbmcgYWMtNCBzcGVjaWZpYyBibG9jayIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNoYW5uZWxDb3VudCk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZVJhdGUpOworCisgICAgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uIHByZXNlbnRhdGlvbnM7CisgICAgLy8gdHJhbnNsYXRlIHRoZSBBQzQgcHJlc2VudGF0aW9uIGluZm9ybWF0aW9uIHRvIGF1ZGlvIHByZXNlbnRhdGlvbnMgZm9yIHRoaXMgdHJhY2sKKyAgICBBQzREU0lQYXJzZXI6OkFDNFByZXNlbnRhdGlvbnMgYWM0UHJlc2VudGF0aW9ucyA9IHBhcnNlci5nZXRQcmVzZW50YXRpb25zKCk7CisgICAgaWYgKCFhYzRQcmVzZW50YXRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhYzRQcmVzZW50YXRpb24gOiBhYzRQcmVzZW50YXRpb25zKSB7CisgICAgICAgICAgICBhdXRvJiBwcmVzZW50YXRpb24gPSBhYzRQcmVzZW50YXRpb24uc2Vjb25kOworICAgICAgICAgICAgaWYgKCFwcmVzZW50YXRpb24ubUVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvUHJlc2VudGF0aW9uVjEgYXA7CisgICAgICAgICAgICBhcC5tUHJlc2VudGF0aW9uSWQgPSBwcmVzZW50YXRpb24ubUdyb3VwSW5kZXg7CisgICAgICAgICAgICBhcC5tUHJvZ3JhbUlkID0gcHJlc2VudGF0aW9uLm1Qcm9ncmFtSUQ7CisgICAgICAgICAgICBhcC5tTGFuZ3VhZ2UgPSBwcmVzZW50YXRpb24ubUxhbmd1YWdlOworICAgICAgICAgICAgaWYgKHByZXNlbnRhdGlvbi5tUHJlVmlydHVhbGl6ZWQpIHsKKyAgICAgICAgICAgICAgICBhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbiA9IE1BU1RFUkVEX0ZPUl9IRUFEUEhPTkU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHN3aXRjaCAocHJlc2VudGF0aW9uLm1DaGFubmVsTW9kZSkgeworICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfTW9ubzoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlX1N0ZXJlbzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uID0gTUFTVEVSRURfRk9SX1NURVJFTzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfM18wOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfNV8wOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfNV8xOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18wXzM0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18xXzM0OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18wXzUyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18xXzUyOgorICAgICAgICAgICAgICAgICAgICAgICAgYXAubU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJFRF9GT1JfU1VSUk9VTkQ7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzdfMF8zMjI6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzFfMzIyOgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfN18wXzQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV83XzFfNDoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a0NoYW5uZWxNb2RlXzlfMF80OgorICAgICAgICAgICAgICAgICAgICBjYXNlIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprQ2hhbm5lbE1vZGVfOV8xXzQ6CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQUM0UGFyc2VyOjpBQzRQcmVzZW50YXRpb246OmtDaGFubmVsTW9kZV8yMl8yOgorICAgICAgICAgICAgICAgICAgICAgICAgYXAubU1hc3RlcmluZ0luZGljYXRpb24gPSBNQVNURVJFRF9GT1JfM0Q7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGNoYW5uZWwgbW9kZSBpbiBBQzQgcHJlc2VudGF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYXAubUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUgPSAocHJlc2VudGF0aW9uLm1Db250ZW50Q2xhc3NpZmllciA9PQorICAgICAgICAgICAgICAgICAgICBBQzRQYXJzZXI6OkFDNFByZXNlbnRhdGlvbjo6a1Zpc3VhbGx5SW1wYWlyZWQpOworICAgICAgICAgICAgYXAubVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSA9IChwcmVzZW50YXRpb24ubUNvbnRlbnRDbGFzc2lmaWVyID09CisgICAgICAgICAgICAgICAgICAgIEFDNFBhcnNlcjo6QUM0UHJlc2VudGF0aW9uOjprVm9pY2VPdmVyKTsKKyAgICAgICAgICAgIGFwLm1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlID0gcHJlc2VudGF0aW9uLm1IYXNEaWFsb2dFbmhhbmNlbWVudHM7CisgICAgICAgICAgICBpZiAoIWFwLm1MYW5ndWFnZS5lbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgYXAubUxhYmVscy5lbXBsYWNlKGFwLm1MYW5ndWFnZSwgcHJlc2VudGF0aW9uLm1EZXNjcmlwdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmVzZW50YXRpb25zLnB1c2hfYmFjayhzdGQ6Om1vdmUoYXApKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwcmVzZW50YXRpb25zLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gQ2xlYXIgYXVkaW8gcHJlc2VudGF0aW9uIGluZm8gaW4gbWV0YWRhdGEuCisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoCisgICAgICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fSU5GTywgbnVsbHB0ciwgMCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dFN0cmVhbShzdGQ6Omlvczo6b3V0KTsKKyAgICAgICAgc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKHByZXNlbnRhdGlvbnMsICZvdXRTdHJlYW0pOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKAorICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8sCisgICAgICAgICAgICAgICAgb3V0U3RyZWFtLnN0cigpLmRhdGEoKSwgb3V0U3RyZWFtLnN0cigpLnNpemUoKSk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTVBFRzRFeHRyYWN0b3I6OnBhcnNlRUFDM1NwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQxNl90IHNhbXBsZVJhdGUsIGNoYW5uZWxzOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcnNlQ2hhbm5lbENvdW50U2FtcGxlUmF0ZSgmb2Zmc2V0LCAmY2hhbm5lbHMsICZzYW1wbGVSYXRlKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgdWludDMyX3Qgc2l6ZTsKKyAgICAvLyArIDQtYnl0ZSBzaXplCisgICAgLy8gKyA0LWJ5dGUgdHlwZQorICAgIC8vICsgMy1ieXRlIHBheWxvYWQKKyAgICBjb25zdCB1aW50MzJfdCBrRUFDM1NwZWNpZmljQm94TWluU2l6ZSA9IDExOworICAgIC8vIDEzICsgMyArICg4ICogKDIgKyA1ICsgNSArIDMgKyAxICsgMyArIDQgKyAoMTQgKiA5ICsgMSkpKSBiaXRzID09IDE1MiBieXRlcyB0aGVvcmV0aWNhbCBtYXgKKyAgICAvLyBjYWxjdWxhdGVkIGZyb20gdGhlIHJlcXVpcmVkIGJpdHMgcmVhZCBiZWxvdyBhcyB3ZWxsIGFzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbmRlcGVuZGVudAorICAgIC8vIGFuZCBkZXBlbmRhbnQgc3ViIHN0cmVhbXMgeW91IGNhbiBoYXZlCisgICAgY29uc3QgdWludDMyX3Qga0VBQzNTcGVjaWZpY0JveE1heFNpemUgPSAxNTI7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnNpemUpIHx8CisgICAgICAgIHNpemUgPCBrRUFDM1NwZWNpZmljQm94TWluU2l6ZSB8fAorICAgICAgICBzaXplID4ga0VBQzNTcGVjaWZpY0JveE1heFNpemUpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGVhYy0zIGJsb2NrOiBjYW5ub3QgcmVhZCBzcGVjaWZpYyBib3ggc2l6ZSIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIG9mZnNldCArPSA0OworICAgIHVpbnQzMl90IHR5cGU7CisgICAgaWYgKCFtRGF0YVNvdXJjZS0+Z2V0VUludDMyKG9mZnNldCwgJnR5cGUpIHx8IHR5cGUgIT0gRk9VUkNDKCJkZWMzIikpIHsKKyAgICAgICAgQUxPR0UoIk1QRUc0RXh0cmFjdG9yOiBlcnJvciB3aGlsZSByZWFkaW5nIGVhYy0zIHNwZWNpZmljIGJsb2NrOiBoZWFkZXIgbm90IGRlYzMiKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBvZmZzZXQgKz0gNDsKKyAgICB1aW50OF90KiBjaHVuayA9IG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W3NpemVdOworICAgIGlmIChjaHVuayA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgaWYgKG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBjaHVuaywgc2l6ZSkgIT0gKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICBBTE9HRSgiTVBFRzRFeHRyYWN0b3I6IGVycm9yIHdoaWxlIHJlYWRpbmcgZWFjLTMgc3BlY2lmaWMgYmxvY2s6IGJpdHN0cmVhbSBmaWVsZHMiKTsKKyAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgQUJpdFJlYWRlciBicihjaHVuaywgc2l6ZSk7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYW5uZWxDb3VudFRhYmxlW10gPSB7MiwgMSwgMiwgMywgMywgNCwgNCwgNX07CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIHNhbXBsZVJhdGVUYWJsZVtdID0gezQ4MDAwLCA0NDEwMCwgMzIwMDB9OworCisgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAxNikgeworICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisgICAgdW5zaWduZWQgZGF0YV9yYXRlID0gYnIuZ2V0Qml0cygxMyk7CisgICAgQUxPR1YoIkVBQzMgZGF0YSByYXRlID0gJWQiLCBkYXRhX3JhdGUpOworCisgICAgdW5zaWduZWQgbnVtX2luZF9zdWIgPSBici5nZXRCaXRzKDMpICsgMTsKKyAgICBBTE9HVigiRUFDMyBpbmRlcGVuZGFudCBzdWJzdHJlYW1zID0gJWQiLCBudW1faW5kX3N1Yik7CisgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCAobnVtX2luZF9zdWIgKiAyMykpIHsKKyAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCisgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgbnVtX2luZF9zdWI7IGkrKykgeworICAgICAgICB1bnNpZ25lZCBmc2NvZCA9IGJyLmdldEJpdHMoMik7CisgICAgICAgIGlmIChmc2NvZCA9PSAzKSB7CisgICAgICAgICAgICBBTE9HRSgiSW5jb3JyZWN0IGZzY29kICgzKSBpbiBFQUMzIGhlYWRlciIpOworICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIHVuc2lnbmVkIGJveFNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlVGFibGVbZnNjb2RdOworICAgICAgICBpZiAoYm94U2FtcGxlUmF0ZSAhPSBzYW1wbGVSYXRlKSB7CisgICAgICAgICAgICBBTE9HRSgic2FtcGxlIHJhdGUgbWlzbWF0Y2g6IGJveFNhbXBsZVJhdGUgPSAlZCwgc2FtcGxlUmF0ZSA9ICVkIiwKKyAgICAgICAgICAgICAgICBib3hTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIGRlbGV0ZVtdIGNodW5rOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIHVuc2lnbmVkIGJzaWQgPSBici5nZXRCaXRzKDUpOworICAgICAgICBpZiAoYnNpZCA9PSA5IHx8IGJzaWQgPT0gMTApIHsKKyAgICAgICAgICAgIEFMT0dXKCJFQUMzIHN0cmVhbSAoYnNpZD0lZCkgbWF5IGJlIHNpbGVuY2VkIGJ5IHRoZSBkZWNvZGVyIiwgYnNpZCk7CisgICAgICAgIH0gZWxzZSBpZiAoYnNpZCA+IDE2KSB7CisgICAgICAgICAgICBBTE9HRSgiRUFDMyBzdHJlYW0gKGJzaWQ9JWQpIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggRVRTSSBUUyAxMDIgMzY2IHYxLjQuMSIsIGJzaWQpOworICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisKKyAgICAgICAgLy8gc2tpcAorICAgICAgICBici5za2lwQml0cygyKTsKKyAgICAgICAgdW5zaWduZWQgYnNtb2QgPSBici5nZXRCaXRzKDMpOworICAgICAgICB1bnNpZ25lZCBhY21vZCA9IGJyLmdldEJpdHMoMyk7CisgICAgICAgIHVuc2lnbmVkIGxmZW9uID0gYnIuZ2V0Qml0cygxKTsKKyAgICAgICAgLy8gd2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGUgZmlyc3Qgc3RyZWFtCisgICAgICAgIGlmIChpID09IDApCisgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnRUYWJsZVthY21vZF0gKyBsZmVvbjsKKyAgICAgICAgQUxPR1YoImJzbW9kID0gJWQsIGFjbW9kID0gJWQsIGxmZW9uID0gJWQiLCBic21vZCwgYWNtb2QsIGxmZW9uKTsKKworICAgICAgICBici5za2lwQml0cygzKTsKKyAgICAgICAgdW5zaWduZWQgbnVtX2RlcF9zdWIgPSBici5nZXRCaXRzKDQpOworICAgICAgICBBTE9HVigiRUFDMyBkZXBlbmRhbnQgc3Vic3RyZWFtcyA9ICVkIiwgbnVtX2RlcF9zdWIpOworICAgICAgICBpZiAobnVtX2RlcF9zdWIgIT0gMCkgeworICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA5KSB7CisgICAgICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjaGFuX2xvY190YmxbXSA9IHsgIkxjL1JjIiwiTHJzL1JycyIsIkNzIiwiVHMiLCJMc2QvUnNkIiwKKyAgICAgICAgICAgICAgICAiTHcvUnciLCJMdmgvUnZoIiwiQ3ZoIiwiTGZlMiIgfTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGNoYW5fbG9jID0gYnIuZ2V0Qml0cyg5KTsKKyAgICAgICAgICAgIHVuc2lnbmVkIG1hc2sgPSAxOworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMDsgaiA8IDk7IGorKywgbWFzayA8PD0gMSkgeworICAgICAgICAgICAgICAgIGlmICgoY2hhbl9sb2MgJiBtYXNrKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGN1cnJlbnRseSBvbmx5IHN1cHBvcnQgdGhlIGZpcnN0IHN0cmVhbQorICAgICAgICAgICAgICAgICAgICBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZXNlIGFyZSAyIGNoYW5uZWxzIGluIHRoZSBtYXNrCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiA9PSAwIHx8IGogPT0gMSB8fCBqID09IDQgfHwgaiA9PSA1IHx8IGogPT0gNikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIgJXMiLCBjaGFuX2xvY190Ymxbal0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpID09IDApIHsKKyAgICAgICAgICAgICAgICBkZWxldGVbXSBjaHVuazsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnIuc2tpcEJpdHMoMSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoYnIubnVtQml0c0xlZnQoKSAhPSAwKSB7CisgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgOCkgeworICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIHVuc2lnbmVkIG1hc2sgPSBici5nZXRCaXRzKDgpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgODsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKCgweDEgPDwgaSkgJiYgbWFzaykgPT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICAgICAgaWYgKGJyLm51bUJpdHNMZWZ0KCkgPCA4KSB7CisgICAgICAgICAgICAgICAgZGVsZXRlW10gY2h1bms7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoaSkgeworICAgICAgICAgICAgICAgIGNhc2UgMDogeworICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjb21wbGV4aXR5ID0gYnIuZ2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkZvdW5kIGEgSk9DIHN0cmVhbSB3aXRoIGNvbXBsZXhpdHkgPSAlZCIsIGNvbXBsZXhpdHkpOworICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDgpOworICAgICAgICAgICAgICAgIH1icmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDMyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgY2hhbm5lbENvdW50KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgc2FtcGxlUmF0ZSk7CisKKyAgICBkZWxldGVbXSBjaHVuazsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUFDM1NwZWNpZmljQm94KG9mZjY0X3Qgb2Zmc2V0KSB7CisgICAgaWYgKG1MYXN0VHJhY2sgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKworICAgIHVpbnQxNl90IHNhbXBsZVJhdGUsIGNoYW5uZWxzOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcnNlQ2hhbm5lbENvdW50U2FtcGxlUmF0ZSgmb2Zmc2V0LCAmY2hhbm5lbHMsICZzYW1wbGVSYXRlKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CiAgICAgdWludDMyX3Qgc2l6ZTsKICAgICAvLyArIDQtYnl0ZSBzaXplCiAgICAgLy8gKyA0LWJ5dGUgdHlwZQpAQCAtMjcwNiwxMiArMzI1OCw0OCBAQAogICAgIHVuc2lnbmVkIGxmZW9uID0gYnIuZ2V0Qml0cygxKTsKICAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnRUYWJsZVthY21vZF0gKyBsZmVvbjsKIAotICAgIGlmIChtTGFzdFRyYWNrID09IE5VTEwpIHsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCBjaGFubmVsQ291bnQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBzYW1wbGVSYXRlKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1QRUc0RXh0cmFjdG9yOjpwYXJzZUFMQUNTYW1wbGVFbnRyeShvZmY2NF90ICpvZmZzZXQpIHsKKyAgICAvLyBTZWUgJ2V4dGVybmFsL2FsYWMvQUxBQ01hZ2ljQ29va2llRGVzY3JpcHRpb24udHh0IGZvciB0aGUgZGV0YWlsJy4KKyAgICAvLyBTdG9yZSBBTEFDIG1hZ2ljIGNvb2tpZSAoZGVjb2RlciBuZWVkcyBpdCkuCisgICAgdWludDhfdCBhbGFjSW5mb1sxMl07CisgICAgb2ZmNjRfdCBkYXRhX29mZnNldCA9ICpvZmZzZXQ7CisKKyAgICBpZiAobURhdGFTb3VyY2UtPnJlYWRBdCgKKyAgICAgICAgICAgIGRhdGFfb2Zmc2V0LCBhbGFjSW5mbywgc2l6ZW9mKGFsYWNJbmZvKSkgPCAoc3NpemVfdClzaXplb2YoYWxhY0luZm8pKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9CisgICAgdWludDMyX3Qgc2l6ZSA9IFUzMl9BVCgmYWxhY0luZm9bMF0pOworICAgIGlmICgoc2l6ZSAhPSBBTEFDX1NQRUNJRklDX0lORk9fU0laRSkgfHwKKyAgICAgICAgICAgIChVMzJfQVQoJmFsYWNJbmZvWzRdKSAhPSBGT1VSQ0MoImFsYWMiKSkgfHwKKyAgICAgICAgICAgIChVMzJfQVQoJmFsYWNJbmZvWzhdKSAhPSAwKSkgeworICAgICAgICBBTE9HVigiU2l6ZToldSwgVTMyX0FUKCZhbGFjSW5mb1s0XSk6JXUsIFUzMl9BVCgmYWxhY0luZm9bOF0pOiV1IiwKKyAgICAgICAgICAgIHNpemUsIFUzMl9BVCgmYWxhY0luZm9bNF0pLCBVMzJfQVQoJmFsYWNJbmZvWzhdKSk7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDMyk7Ci0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBjaGFubmVsQ291bnQpOwotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIHNhbXBsZVJhdGUpOworICAgIGRhdGFfb2Zmc2V0ICs9IHNpemVvZihhbGFjSW5mbyk7CisgICAgdWludDhfdCBjb29raWVbc2l6ZSAtIHNpemVvZihhbGFjSW5mbyldOworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0KAorICAgICAgICAgICAgZGF0YV9vZmZzZXQsIGNvb2tpZSwgc2l6ZW9mKGNvb2tpZSkpIDwgKHNzaXplX3Qpc2l6ZW9mKGNvb2tpZSkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgIH0KKworICAgIHVpbnQ4X3QgYml0c1BlclNhbXBsZSA9IGNvb2tpZVs1XTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFLCBiaXRzUGVyU2FtcGxlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgY29va2llWzldKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIFUzMl9BVCgmY29va2llWzIwXSkpOworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGNvb2tpZSwgc2l6ZW9mKGNvb2tpZSkpOworICAgIGRhdGFfb2Zmc2V0ICs9IHNpemVvZihjb29raWUpOworICAgICpvZmZzZXQgPSBkYXRhX29mZnNldDsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTI4MzEsOCArMzQxOSw5IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAKICAgICBpbnQ2NF90IG1ldGFEdXJhdGlvbjsKLSAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJm1ldGFEdXJhdGlvbikgfHwgbWV0YUR1cmF0aW9uID09IDApIHsKLSAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIHNpZHhEdXJhdGlvbik7CisgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50NjQobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmbWV0YUR1cmF0aW9uKSB8fCBtZXRhRHVyYXRpb24gPT0gMCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgc2lkeER1cmF0aW9uKTsKICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQpAQCAtMjkzMCw3ICszNTE5LDcgQEAKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1NZXRhS2V5TWFwW2luZGV4XS5jX3N0cigpLCAiY29tLmFuZHJvaWQuY2FwdHVyZS5mcHMiKSkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRGbG9hdChrS2V5Q2FwdHVyZUZyYW1lcmF0ZSwgKihmbG9hdCAqKSZ2YWwpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEZsb2F0KG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfQ0FQVFVSRV9SQVRFLCAqKGZsb2F0ICopJnZhbCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKGRhdGFUeXBlID09IDY3ICYmIGRhdGFTaXplID49IDQpIHsKICAgICAgICAgLy8gQkUgc2lnbmVkIGludDMyCkBAIC0yOTM5LDcgKzM1MjgsOCBAQAogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgfQogICAgICAgICBpZiAoIXN0cmNhc2VjbXAobU1ldGFLZXlNYXBbaW5kZXhdLmNfc3RyKCksICJjb20uYW5kcm9pZC52aWRlby50ZW1wb3JhbF9sYXllcnNfY291bnQiKSkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRJbnQzMihrS2V5VGVtcG9yYWxMYXllckNvdW50LCB2YWwpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1GaWxlTWV0YURhdGEsCisgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfQ09VTlQsIHZhbCk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgICAvLyBhZGQgbW9yZSBrZXlzIGlmIG5lZWRlZApAQCAtMjk5Myw3ICszNTgzLDcgQEAKICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogCi0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5VHJhY2tJRCwgaWQpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCBpZCk7CiAKICAgICBzaXplX3QgbWF0cml4T2Zmc2V0ID0gZHluU2l6ZSArIDE2OwogICAgIGludDMyX3QgYTAwID0gVTMyX0FUKCZidWZmZXJbbWF0cml4T2Zmc2V0XSk7CkBAIC0zMDI5LDE1ICszNjE5LDE1IEBACiAgICAgfQogCiAgICAgaWYgKHJvdGF0aW9uRGVncmVlcyAhPSAwKSB7Ci0gICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVJvdGF0aW9uLCByb3RhdGlvbkRlZ3JlZXMpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTiwgcm90YXRpb25EZWdyZWVzKTsKICAgICB9CiAKICAgICAvLyBIYW5kbGUgcHJlc2VudGF0aW9uIGRpc3BsYXkgc2l6ZSwgd2hpY2ggY291bGQgYmUgZGlmZmVyZW50Ci0gICAgLy8gZnJvbSB0aGUgaW1hZ2Ugc2l6ZSBpbmRpY2F0ZWQgYnkga0tleVdpZHRoIGFuZCBrS2V5SGVpZ2h0LgorICAgIC8vIGZyb20gdGhlIGltYWdlIHNpemUgaW5kaWNhdGVkIGJ5IEFNRURJQUZPUk1BVF9LRVlfV0lEVEggYW5kIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULgogICAgIHVpbnQzMl90IHdpZHRoID0gVTMyX0FUKCZidWZmZXJbZHluU2l6ZSArIDUyXSk7CiAgICAgdWludDMyX3QgaGVpZ2h0ID0gVTMyX0FUKCZidWZmZXJbZHluU2l6ZSArIDU2XSk7Ci0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheVdpZHRoLCB3aWR0aCA+PiAxNik7Ci0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5RGlzcGxheUhlaWdodCwgaGVpZ2h0ID4+IDE2KTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRILCB3aWR0aCA+PiAxNik7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQsIGhlaWdodCA+PiAxNik7CiAKICAgICByZXR1cm4gT0s7CiB9CkBAIC0zMDY1LDUwICszNjU1LDUwIEBACiAKICAgICB1aW50MzJfdCBmbGFncyA9IFUzMl9BVChidWZmZXIpOwogCi0gICAgdWludDMyX3QgbWV0YWRhdGFLZXkgPSAwOworICAgIGNvbnN0IGNoYXIgKm1ldGFkYXRhS2V5ID0gbnVsbHB0cjsKICAgICBjaGFyIGNodW5rWzVdOwogICAgIE1ha2VGb3VyQ0NTdHJpbmcobVBhdGhbNF0sIGNodW5rKTsKICAgICBBTE9HVigibWV0YTogJXMgQCAlbGxkIiwgY2h1bmssIChsb25nIGxvbmcpb2Zmc2V0KTsKICAgICBzd2l0Y2ggKChpbnQzMl90KW1QYXRoWzRdKSB7CiAgICAgICAgIGNhc2UgRk9VUkNDKCJcMjUxYWxiIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFsYnVtOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYWxidW0iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoIlwyNTFBUlQiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QXJ0aXN0OworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYXJ0aXN0IjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJhQVJUIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFsYnVtQXJ0aXN0OworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYWxidW1hcnRpc3QiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoIlwyNTFkYXkiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5WWVhcjsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gInllYXIiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoIlwyNTFuYW0iKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5VGl0bGU7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJ0aXRsZSI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygiXDI1MXdydCIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlXcml0ZXI7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJ3cml0ZXIiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoImNvdnIiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5QWxidW1BcnQ7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJhbGJ1bWFydCI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygiZ25yZSIpOgogICAgICAgICBjYXNlIEZPVVJDQygiXDI1MWdlbiIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlHZW5yZTsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImdlbnJlIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJjcGlsIik6CkBAIC0zMTE4LDcgKzM3MDgsNyBAQAogICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWQiLAogICAgICAgICAgICAgICAgICAgICAgICAgKGludClidWZmZXJbc2l6ZSAtIDFdKTsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5Q29tcGlsYXRpb24sIHRtcCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OLCB0bXApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTMxMzAsNyArMzcyMCw3IEBACiAgICAgICAgICAgICAgICAgdWludDE2X3QqIHBUb3RhbFRyYWNrcyA9ICh1aW50MTZfdCopJmJ1ZmZlclsxMl07CiAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIlZC8lZCIsIG50b2hzKCpwVHJhY2spLCBudG9ocygqcFRvdGFsVHJhY2tzKSk7CiAKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoa0tleUNEVHJhY2tOdW1iZXIsIHRtcCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIsIHRtcCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzE0Miw3ICszNzMyLDcgQEAKICAgICAgICAgICAgICAgICB1aW50MTZfdCogcFRvdGFsRGlzY3MgPSAodWludDE2X3QqKSZidWZmZXJbMTJdOwogICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWQvJWQiLCBudG9ocygqcERpc2MpLCBudG9ocygqcFRvdGFsRGlzY3MpKTsKIAotICAgICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5RGlzY051bWJlciwgdG1wKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiwgdG1wKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zMTg2LDggKzM3NzYsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFbmNvZGVyRGVsYXksIGRlbGF5KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUVuY29kZXJQYWRkaW5nLCBwYWRkaW5nKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfREVMQVksIGRlbGF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0VOQ09ERVJfUEFERElORywgcGFkZGluZyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAKQEAgLTMyMDIsMTIgKzM3OTQsMTYgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGlmIChzaXplID49IDggJiYgbWV0YWRhdGFLZXkgJiYgIW1GaWxlTWV0YURhdGEuaGFzRGF0YShtZXRhZGF0YUtleSkpIHsKLSAgICAgICAgaWYgKG1ldGFkYXRhS2V5ID09IGtLZXlBbGJ1bUFydCkgewotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXREYXRhKAotICAgICAgICAgICAgICAgICAgICBrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsCisgICAgdm9pZCAqdG1wRGF0YTsKKyAgICBzaXplX3QgdG1wRGF0YVNpemU7CisgICAgY29uc3QgY2hhciAqczsKKyAgICBpZiAoc2l6ZSA+PSA4ICYmIG1ldGFkYXRhS2V5ICYmCisgICAgICAgICAgICAhQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihtRmlsZU1ldGFEYXRhLCBtZXRhZGF0YUtleSwgJnRtcERhdGEsICZ0bXBEYXRhU2l6ZSkgJiYKKyAgICAgICAgICAgICFBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIG1ldGFkYXRhS2V5LCAmcykpIHsKKyAgICAgICAgaWYgKCFzdHJjbXAobWV0YWRhdGFLZXksICJhbGJ1bWFydCIpKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1GaWxlTWV0YURhdGEsIG1ldGFkYXRhS2V5LAogICAgICAgICAgICAgICAgICAgICBidWZmZXIgKyA4LCBzaXplIC0gOCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobWV0YWRhdGFLZXkgPT0ga0tleUdlbnJlKSB7CisgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNtcChtZXRhZGF0YUtleSwgImdlbnJlIikpIHsKICAgICAgICAgICAgIGlmIChmbGFncyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgLy8gdWludDhfdCBnZW5yZSBjb2RlLCBpVHVuZXMgZ2VucmUgY29kZXMgYXJlCiAgICAgICAgICAgICAgICAgLy8gdGhlIHN0YW5kYXJkIGlkMyBjb2RlcywgZXhjZXB0IHRoZXkgc3RhcnQKQEAgLTMyMjEsMTggKzM4MTcsMTggQEAKICAgICAgICAgICAgICAgICBjaGFyIGdlbnJlWzEwXTsKICAgICAgICAgICAgICAgICBzcHJpbnRmKGdlbnJlLCAiJWQiLCBnZW5yZWNvZGUpOwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKG1ldGFkYXRhS2V5LCBnZW5yZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBtZXRhZGF0YUtleSwgZ2VucmUpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChmbGFncyA9PSAxKSB7CiAgICAgICAgICAgICAgICAgLy8gY3VzdG9tIGdlbnJlIHN0cmluZwogICAgICAgICAgICAgICAgIGJ1ZmZlcltzaXplXSA9ICdcMCc7CiAKLSAgICAgICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcoCisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhS2V5LCAoY29uc3QgY2hhciAqKWJ1ZmZlciArIDgpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYnVmZmVyW3NpemVdID0gJ1wwJzsKIAotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgbWV0YWRhdGFLZXksIChjb25zdCBjaGFyICopYnVmZmVyICsgOCk7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMjYyLDIxICszODU4LDMxIEBACiAgICAgaW50MzJfdCB0eXBlID0gVTMyX0FUKCZidWZmZXJbMF0pOwogICAgIGlmICgodHlwZSA9PSBGT1VSQ0MoIm5jbHgiKSAmJiBzaXplID49IDExKQogICAgICAgICAgICAgfHwgKHR5cGUgPT0gRk9VUkNDKCJuY2xjIikgJiYgc2l6ZSA+PSAxMCkpIHsKLSAgICAgICAgaW50MzJfdCBwcmltYXJpZXMgPSBVMTZfQVQoJmJ1ZmZlcls0XSk7Ci0gICAgICAgIGludDMyX3QgdHJhbnNmZXIgPSBVMTZfQVQoJmJ1ZmZlcls2XSk7Ci0gICAgICAgIGludDMyX3QgY29lZmZzID0gVTE2X0FUKCZidWZmZXJbOF0pOwotICAgICAgICBib29sIGZ1bGxSYW5nZSA9ICh0eXBlID09IEZPVVJDQygibmNseCIpKSAmJiAoYnVmZmVyWzEwXSAmIDEyOCk7Ci0KLSAgICAgICAgQ29sb3JBc3BlY3RzIGFzcGVjdHM7Ci0gICAgICAgIENvbG9yVXRpbHM6OmNvbnZlcnRJc29Db2xvckFzcGVjdHNUb0NvZGVjQXNwZWN0cygKLSAgICAgICAgICAgICAgICBwcmltYXJpZXMsIHRyYW5zZmVyLCBjb2VmZnMsIGZ1bGxSYW5nZSwgYXNwZWN0cyk7Ci0KICAgICAgICAgLy8gb25seSBzdG9yZSB0aGUgZmlyc3QgY29sb3Igc3BlY2lmaWNhdGlvbgotICAgICAgICBpZiAoIW1MYXN0VHJhY2stPm1ldGEuaGFzRGF0YShrS2V5Q29sb3JQcmltYXJpZXMpKSB7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlDb2xvclByaW1hcmllcywgYXNwZWN0cy5tUHJpbWFyaWVzKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleVRyYW5zZmVyRnVuY3Rpb24sIGFzcGVjdHMubVRyYW5zZmVyKTsKLSAgICAgICAgICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUNvbG9yTWF0cml4LCBhc3BlY3RzLm1NYXRyaXhDb2VmZnMpOwotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q29sb3JSYW5nZSwgYXNwZWN0cy5tUmFuZ2UpOworICAgICAgICBpbnQzMl90IGV4aXN0aW5nQ29sb3I7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRSwgJmV4aXN0aW5nQ29sb3IpKSB7CisgICAgICAgICAgICBpbnQzMl90IHByaW1hcmllcyA9IFUxNl9BVCgmYnVmZmVyWzRdKTsKKyAgICAgICAgICAgIGludDMyX3QgaXNvdHJhbnNmZXIgPSBVMTZfQVQoJmJ1ZmZlcls2XSk7CisgICAgICAgICAgICBpbnQzMl90IGNvZWZmcyA9IFUxNl9BVCgmYnVmZmVyWzhdKTsKKyAgICAgICAgICAgIGJvb2wgZnVsbFJhbmdlID0gKHR5cGUgPT0gRk9VUkNDKCJuY2x4IikpICYmIChidWZmZXJbMTBdICYgMTI4KTsKKworICAgICAgICAgICAgaW50MzJfdCByYW5nZSA9IDA7CisgICAgICAgICAgICBpbnQzMl90IHN0YW5kYXJkID0gMDsKKyAgICAgICAgICAgIGludDMyX3QgdHJhbnNmZXIgPSAwOworICAgICAgICAgICAgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvUGxhdGZvcm1Bc3BlY3RzKAorICAgICAgICAgICAgICAgICAgICBwcmltYXJpZXMsIGlzb3RyYW5zZmVyLCBjb2VmZnMsIGZ1bGxSYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgJnJhbmdlLCAmc3RhbmRhcmQsICZ0cmFuc2Zlcik7CisKKyAgICAgICAgICAgIGlmIChyYW5nZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfUkFOR0UsIHJhbmdlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzdGFuZGFyZCAhPSAwKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQsIHN0YW5kYXJkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0cmFuc2ZlciAhPSAwKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfVFJBTlNGRVIsIHRyYW5zZmVyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtMzMwMywyNiArMzkwOSwyNiBAQAogICAgICAgICByZXR1cm4gRVJST1JfSU87CiAgICAgfQogCi0gICAgdWludDMyX3QgbWV0YWRhdGFLZXkgPSAwOworICAgIGNvbnN0IGNoYXIgKm1ldGFkYXRhS2V5ID0gbnVsbHB0cjsKICAgICBzd2l0Y2ggKG1QYXRoW2RlcHRoXSkgewogICAgICAgICBjYXNlIEZPVVJDQygidGl0bCIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlUaXRsZTsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gInRpdGxlIjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIGNhc2UgRk9VUkNDKCJwZXJmIik6CiAgICAgICAgIHsKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFydGlzdDsKKyAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0gImFydGlzdCI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygiYXV0aCIpOgogICAgICAgICB7Ci0gICAgICAgICAgICBtZXRhZGF0YUtleSA9IGtLZXlXcml0ZXI7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJ3cml0ZXIiOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoImducmUiKToKICAgICAgICAgewotICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSBrS2V5R2VucmU7CisgICAgICAgICAgICBtZXRhZGF0YUtleSA9ICJnZW5yZSI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBjYXNlIEZPVVJDQygiYWxibSIpOgpAQCAtMzMzMSwxMCArMzkzNywxMCBAQAogICAgICAgICAgICAgICBjaGFyIHRtcFs0XTsKICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIldSIsIGJ1ZmZlcltzaXplIC0gMV0pOwogCi0gICAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5Q0RUcmFja051bWJlciwgdG1wKTsKKyAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIsIHRtcCk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIG1ldGFkYXRhS2V5ID0ga0tleUFsYnVtOworICAgICAgICAgICAgbWV0YWRhdGFLZXkgPSAiYWxidW0iOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoInlycmMiKToKQEAgLTMzNTIsNyArMzk1OCw3IEBACiAgICAgICAgICAgICBpZiAoeWVhciA8IDEwMDAwKSB7CiAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIldSIsIHllYXIpOwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtLZXlZZWFyLCB0bXApOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9ZRUFSLCB0bXApOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTMzNjEsNyArMzk2Nyw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBpZiAobWV0YWRhdGFLZXkgPiAwKSB7CisgICAgaWYgKG1ldGFkYXRhS2V5KSB7CiAgICAgICAgIGJvb2wgaXNVVEY4ID0gdHJ1ZTsgLy8gQ29tbW9uIGNhc2UKICAgICAgICAgY2hhcjE2X3QgKmZyYW1lZGF0YSA9IE5VTEw7CiAgICAgICAgIGludCBsZW4xNiA9IDA7IC8vIE51bWJlciBvZiBVVEYtMTYgY2hhcmFjdGVycwpAQCAtMzM5NywxMSArNDAwMywxMSBAQAogCiAgICAgICAgIGlmIChpc1VURjgpIHsKICAgICAgICAgICAgIGJ1ZmZlcltzaXplXSA9IDA7Ci0gICAgICAgICAgICBtRmlsZU1ldGFEYXRhLnNldENTdHJpbmcobWV0YWRhdGFLZXksIChjb25zdCBjaGFyICopYnVmZmVyICsgNik7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIG1ldGFkYXRhS2V5LCAoY29uc3QgY2hhciAqKWJ1ZmZlciArIDYpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gQ29udmVydCBmcm9tIFVURi0xNiBzdHJpbmcgdG8gVVRGLTggc3RyaW5nLgogICAgICAgICAgICAgU3RyaW5nOCB0bXBVVEY4c3RyKGZyYW1lZGF0YSwgbGVuMTYpOwotICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKG1ldGFkYXRhS2V5LCB0bXBVVEY4c3RyLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhRGF0YSwgbWV0YWRhdGFLZXksIHRtcFVURjhzdHIuc3RyaW5nKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC0zNDE2LDI3ICs0MDIyLDI4IEBACiAKICAgICBpZiAoaWQzLmlzVmFsaWQoKSkgewogICAgICAgICBzdHJ1Y3QgTWFwIHsKLSAgICAgICAgICAgIGludCBrZXk7CisgICAgICAgICAgICBjb25zdCBjaGFyICprZXk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICp0YWcxOwogICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnMjsKICAgICAgICAgfTsKICAgICAgICAgc3RhdGljIGNvbnN0IE1hcCBrTWFwW10gPSB7Ci0gICAgICAgICAgICB7IGtLZXlBbGJ1bSwgIlRBTEIiLCAiVEFMIiB9LAotICAgICAgICAgICAgeyBrS2V5QXJ0aXN0LCAiVFBFMSIsICJUUDEiIH0sCi0gICAgICAgICAgICB7IGtLZXlBbGJ1bUFydGlzdCwgIlRQRTIiLCAiVFAyIiB9LAotICAgICAgICAgICAgeyBrS2V5Q29tcG9zZXIsICJUQ09NIiwgIlRDTSIgfSwKLSAgICAgICAgICAgIHsga0tleUdlbnJlLCAiVENPTiIsICJUQ08iIH0sCi0gICAgICAgICAgICB7IGtLZXlUaXRsZSwgIlRJVDIiLCAiVFQyIiB9LAotICAgICAgICAgICAgeyBrS2V5WWVhciwgIlRZRSIsICJUWUVSIiB9LAotICAgICAgICAgICAgeyBrS2V5QXV0aG9yLCAiVFhUIiwgIlRFWFQiIH0sCi0gICAgICAgICAgICB7IGtLZXlDRFRyYWNrTnVtYmVyLCAiVFJLIiwgIlRSQ0siIH0sCi0gICAgICAgICAgICB7IGtLZXlEaXNjTnVtYmVyLCAiVFBBIiwgIlRQT1MiIH0sCi0gICAgICAgICAgICB7IGtLZXlDb21waWxhdGlvbiwgIlRDUCIsICJUQ01QIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0FMQlVNLCAiVEFMQiIsICJUQUwiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQVJUSVNULCAiVFBFMSIsICJUUDEiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QsICJUUEUyIiwgIlRQMiIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUiwgIlRDT00iLCAiVENNIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0dFTlJFLCAiVENPTiIsICJUQ08iIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfVElUTEUsICJUSVQyIiwgIlRUMiIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9ZRUFSLCAiVFlFIiwgIlRZRVIiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQVVUSE9SLCAiVFhUIiwgIlRFWFQiIH0sCisgICAgICAgICAgICB7IEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiwgIlRSSyIsICJUUkNLIiB9LAorICAgICAgICAgICAgeyBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIsICJUUEEiLCAiVFBPUyIgfSwKKyAgICAgICAgICAgIHsgQU1FRElBRk9STUFUX0tFWV9DT01QSUxBVElPTiwgIlRDUCIsICJUQ01QIiB9LAogICAgICAgICB9OwogICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1NYXBFbnRyaWVzID0gc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOwogCiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bU1hcEVudHJpZXM7ICsraSkgewotICAgICAgICAgICAgaWYgKCFtRmlsZU1ldGFEYXRhLmhhc0RhdGEoa01hcFtpXS5rZXkpKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpzczsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtRmlsZU1ldGFEYXRhLCBrTWFwW2ldLmtleSwgJnNzKSkgewogICAgICAgICAgICAgICAgIElEMzo6SXRlcmF0b3IgKml0ID0gbmV3IElEMzo6SXRlcmF0b3IoaWQzLCBrTWFwW2ldLnRhZzEpOwogICAgICAgICAgICAgICAgIGlmIChpdC0+ZG9uZSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBpdDsKQEAgLTM0NTIsNyArNDA1OSw3IEBACiAgICAgICAgICAgICAgICAgaXQtPmdldFN0cmluZygmcyk7CiAgICAgICAgICAgICAgICAgZGVsZXRlIGl0OwogCi0gICAgICAgICAgICAgICAgbUZpbGVNZXRhRGF0YS5zZXRDU3RyaW5nKGtNYXBbaV0ua2V5LCBzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1GaWxlTWV0YURhdGEsIGtNYXBbaV0ua2V5LCBzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0zNDYxLDEzICs0MDY4LDEyIEBACiAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBpZDMuZ2V0QWxidW1BcnQoJmRhdGFTaXplLCAmbWltZSk7CiAKICAgICAgICAgaWYgKGRhdGEpIHsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0RGF0YShrS2V5QWxidW1BcnQsIE1ldGFEYXRhOjpUWVBFX05PTkUsIGRhdGEsIGRhdGFTaXplKTsKLSAgICAgICAgICAgIG1GaWxlTWV0YURhdGEuc2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCBtaW1lLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUZpbGVNZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCwgZGF0YSwgZGF0YVNpemUpOwogICAgICAgICB9CiAgICAgfQogfQogCi1NZWRpYVRyYWNrICpNUEVHNEV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpNUEVHNEV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgc3RhdHVzX3QgZXJyOwogICAgIGlmICgoZXJyID0gcmVhZE1ldGFEYXRhKCkpICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzQ5MCw3ICs0MDk2LDcgQEAKIAogICAgIFRyZXggKnRyZXggPSBOVUxMOwogICAgIGludDMyX3QgdHJhY2tJZDsKLSAgICBpZiAodHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlUcmFja0lELCAmdHJhY2tJZCkpIHsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmdHJhY2tJZCkpIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtVHJleC5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgVHJleCAqdCA9ICZtVHJleC5lZGl0SXRlbUF0KGkpOwogICAgICAgICAgICAgaWYgKHQtPnRyYWNrX0lEID09ICh1aW50MzJfdCkgdHJhY2tJZCkgewpAQCAtMzUwNiwxNiArNDExMiwxNSBAQAogICAgIEFMT0dWKCJnZXRUcmFjayBjYWxsZWQsIHBzc2g6ICV6dSIsIG1Qc3NoLnNpemUoKSk7CiAKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIGlmICghdHJhY2stPm1ldGEuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpIHsKKyAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIHNwPEl0ZW1UYWJsZT4gaXRlbVRhYmxlOwogICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgJmRhdGEsICZzaXplKSkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgIH0KIApAQCAtMzUyNiwxMCArNDEzMSw5IEBACiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpCiAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpKSB7Ci0gICAgICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgIHZvaWQgKmRhdGE7CiAgICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CiAKQEAgLTM1NDEsMTEgKzQxNDUsMjkgQEAKICAgICAgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykpIHsKICAgICAgICAgICAgIGl0ZW1UYWJsZSA9IG1JdGVtVGFibGU7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSkpIHsKKyAgICAgICAgdm9pZCAqZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CisKKyAgICAgICAgaWYgKHNpemUgPCA1IHx8IHB0clswXSAhPSAweDgxKSB7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICh0cmFjay0+aGFzX2Vsc3QgYW5kICFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikgYW5kIHRyYWNrLT5lbHN0X21lZGlhX3RpbWUgPiAwKSB7CisgICAgICAgIHRyYWNrLT5lbHN0U2hpZnRTdGFydFRpY2tzID0gdHJhY2stPmVsc3RfbWVkaWFfdGltZTsKKyAgICAgICAgQUxPR1YoInZpZGVvIHRyYWNrLT5lbHN0U2hpZnRTdGFydFRpY2tzIDolIiBQUkl1NjQsIHRyYWNrLT5lbHN0U2hpZnRTdGFydFRpY2tzKTsKICAgICB9CiAKICAgICBNUEVHNFNvdXJjZSAqc291cmNlID0gIG5ldyBNUEVHNFNvdXJjZSgKICAgICAgICAgICAgIHRyYWNrLT5tZXRhLCBtRGF0YVNvdXJjZSwgdHJhY2stPnRpbWVzY2FsZSwgdHJhY2stPnNhbXBsZVRhYmxlLAotICAgICAgICAgICAgbVNpZHhFbnRyaWVzLCB0cmV4LCBtTW9vZk9mZnNldCwgaXRlbVRhYmxlKTsKKyAgICAgICAgICAgIG1TaWR4RW50cmllcywgdHJleCwgbU1vb2ZPZmZzZXQsIGl0ZW1UYWJsZSwKKyAgICAgICAgICAgIHRyYWNrLT5lbHN0U2hpZnRTdGFydFRpY2tzKTsKICAgICBpZiAoc291cmNlLT5pbml0KCkgIT0gT0spIHsKICAgICAgICAgZGVsZXRlIHNvdXJjZTsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC0zNTU2LDI2ICs0MTc4LDI2IEBACiAvLyBzdGF0aWMKIHN0YXR1c190IE1QRUc0RXh0cmFjdG9yOjp2ZXJpZnlUcmFjayhUcmFjayAqdHJhY2spIHsKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKHRyYWNrLT5tZXRhLmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0U3RyaW5nKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7CiAKLSAgICB1aW50MzJfdCB0eXBlOwotICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgdm9pZCAqZGF0YTsKICAgICBzaXplX3Qgc2l6ZTsKICAgICBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSkgewotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlBVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKQotICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0ga1R5cGVBVkNDKSB7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSkgewotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKQotICAgICAgICAgICAgICAgICAgICB8fCB0eXBlICE9IGtUeXBlSFZDQykgeworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRCdWZmZXIodHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkMsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWMSkpIHsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNCkKICAgICAgICAgICAgIHx8ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUcyKQogICAgICAgICAgICAgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSkgewotICAgICAgICBpZiAoIXRyYWNrLT5tZXRhLmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKQotICAgICAgICAgICAgICAgIHx8IHR5cGUgIT0ga1R5cGVFU0RTKSB7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9FU0RTLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgfQpAQCAtMzY2MCwxNiArNDI4MiwxNCBAQAogICAgICAgICBpZiAobUxhc3RUcmFjayA9PSBOVUxMKQogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAotICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19RQ0VMUCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19RQ0VMUCk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CiAKLSAgICBpZiAob2JqZWN0VHlwZUluZGljYXRpb24gID09IDB4NmIpIHsKLSAgICAgICAgLy8gVGhlIG1lZGlhIHN1YnR5cGUgaXMgTVAzIGF1ZGlvCi0gICAgICAgIC8vIE91ciBzb2Z0d2FyZSBNUDMgYXVkaW8gZGVjb2RlciBtYXkgbm90IGJlIGFibGUgdG8gaGFuZGxlCi0gICAgICAgIC8vIHBhY2tldGl6ZWQgTVAzIGF1ZGlvOyBmb3Igbm93LCBsZXRzIGp1c3QgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVECi0gICAgICAgIEFMT0dFKCJNUDMgdHJhY2sgaW4gTVA0LzNHUFAgZmlsZSBpcyBub3Qgc3VwcG9ydGVkIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICBpZiAob2JqZWN0VHlwZUluZGljYXRpb24gPT0gMHg2QiB8fCBvYmplY3RUeXBlSW5kaWNhdGlvbiA9PSAweDY5KSB7CisgICAgICAgIC8vIG1wMyBhdWRpbworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1MYXN0VHJhY2stPm1ldGEsQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKTsKKyAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAogICAgIGlmIChtTGFzdFRyYWNrICE9IE5VTEwpIHsKQEAgLTM2NzcsMTAgKzQyOTcsMTIgQEAKICAgICAgICAgdWludDMyX3QgYXZnQml0cmF0ZSA9IDA7CiAgICAgICAgIGVzZHMuZ2V0Qml0UmF0ZSgmbWF4Qml0cmF0ZSwgJmF2Z0JpdHJhdGUpOwogICAgICAgICBpZiAobWF4Qml0cmF0ZSA+IDAgJiYgbWF4Qml0cmF0ZSA8IElOVDMyX01BWCkgewotICAgICAgICAgICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5TWF4Qml0UmF0ZSwgKGludDMyX3QpbWF4Qml0cmF0ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfQklUX1JBVEUsIChpbnQzMl90KW1heEJpdHJhdGUpOwogICAgICAgICB9CiAgICAgICAgIGlmIChhdmdCaXRyYXRlID4gMCAmJiBhdmdCaXRyYXRlIDwgSU5UMzJfTUFYKSB7Ci0gICAgICAgICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlCaXRSYXRlLCAoaW50MzJfdClhdmdCaXRyYXRlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCAoaW50MzJfdClhdmdCaXRyYXRlKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzcwOCw2ICs0MzMwLDc3IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCisgICAgaWYgKG9iamVjdFR5cGVJbmRpY2F0aW9uID09IDB4ZGQpIHsKKyAgICAgICAgLy8gdm9yYmlzIGF1ZGlvCisgICAgICAgIGlmIChjc2RbMF0gIT0gMHgwMikgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvZGVjSW5mbyBzdGFydHMgd2l0aCB0d28gbGVuZ3RocywgbGVuMSBhbmQgbGVuMiwgdGhhdCBhcmUKKyAgICAgICAgLy8gIlhpcGgtc3R5bGUtbGFjaW5nIGVuY29kZWQiLi4KKworICAgICAgICBzaXplX3Qgb2Zmc2V0ID0gMTsKKyAgICAgICAgc2l6ZV90IGxlbjEgPSAwOworICAgICAgICB3aGlsZSAob2Zmc2V0IDwgY3NkX3NpemUgJiYgY3NkW29mZnNldF0gPT0gMHhmZikgeworICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3cobGVuMSwgMHhmZiwgJmxlbjEpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICsrb2Zmc2V0OworICAgICAgICB9CisgICAgICAgIGlmIChvZmZzZXQgPj0gY3NkX3NpemUpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3cobGVuMSwgY3NkW29mZnNldF0sICZsZW4xKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorICAgICAgICArK29mZnNldDsKKyAgICAgICAgaWYgKGxlbjEgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBsZW4yID0gMDsKKyAgICAgICAgd2hpbGUgKG9mZnNldCA8IGNzZF9zaXplICYmIGNzZFtvZmZzZXRdID09IDB4ZmYpIHsKKyAgICAgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KGxlbjIsIDB4ZmYsICZsZW4yKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK29mZnNldDsKKyAgICAgICAgfQorICAgICAgICBpZiAob2Zmc2V0ID49IGNzZF9zaXplKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KGxlbjIsIGNzZFtvZmZzZXRdLCAmbGVuMikpIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgKytvZmZzZXQ7CisgICAgICAgIGlmIChsZW4yID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG9mZnNldCA+PSBjc2Rfc2l6ZSB8fCBjc2Rbb2Zmc2V0XSAhPSAweDAxKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CisgICAgICAgIC8vIGZvcm1lcmx5IGtLZXlWb3JiaXNJbmZvCisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8wLCAmY3NkW29mZnNldF0sIGxlbjEpOworCisgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KG9mZnNldCwgbGVuMSwgJm9mZnNldCkgfHwKKyAgICAgICAgICAgICAgICBvZmZzZXQgPj0gY3NkX3NpemUgfHwgY3NkW29mZnNldF0gIT0gMHgwMykgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2J1aWx0aW5fYWRkX292ZXJmbG93KG9mZnNldCwgbGVuMiwgJm9mZnNldCkgfHwKKyAgICAgICAgICAgICAgICBvZmZzZXQgPj0gY3NkX3NpemUgfHwgY3NkW29mZnNldF0gIT0gMHgwNSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZvcm1lcmx5IGtLZXlWb3JiaXNCb29rcworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMSwgJmNzZFtvZmZzZXRdLCBjc2Rfc2l6ZSAtIG9mZnNldCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUyk7CisKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKwogICAgIHN0YXRpYyB1aW50MzJfdCBrU2FtcGxpbmdSYXRlW10gPSB7CiAgICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwKICAgICAgICAgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMCwgNzM1MApAQCAtMzcyNCw3ICs0NDE3LDcgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAogICAgIC8va2VlcCBBT1QgdHlwZQotICAgIG1MYXN0VHJhY2stPm1ldGEuc2V0SW50MzIoa0tleUFBQ0FPVCwgb2JqZWN0VHlwZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEUsIG9iamVjdFR5cGUpOwogCiAgICAgdWludDMyX3QgZnJlcUluZGV4ID0gYnIuZ2V0Qml0cyg0KTsKIApAQCAtMzc0NSw3ICs0NDM4LDcgQEAKICAgICAgICAgc2FtcGxlUmF0ZSA9IGtTYW1wbGluZ1JhdGVbZnJlcUluZGV4XTsKICAgICB9CiAKLSAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfU0JSIHx8IG9iamVjdFR5cGUgPT0gQU9UX1BTKSB7Ly9TQlIgc3BlY2lmaWMgY29uZmlnIHBlciAxNDQ5Ni0zIHRhYmxlIDEuMTMKKyAgICBpZiAob2JqZWN0VHlwZSA9PSBBT1RfU0JSIHx8IG9iamVjdFR5cGUgPT0gQU9UX1BTKSB7Ly9TQlIgc3BlY2lmaWMgY29uZmlnIHBlciAxNDQ5Ni0zIHRibCAxLjEzCiAgICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgNCkgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgdWludDMyX3QgZXh0RnJlcUluZGV4ID0gYnIuZ2V0Qml0cyg0KTsKICAgICAgICAgaW50MzJfdCBleHRTYW1wbGVSYXRlIF9fdW51c2VkOwpAQCAtMzc2Miw3ICs0NDU1LDcgQEAKICAgICAgICAgICAgIGV4dFNhbXBsZVJhdGUgPSBrU2FtcGxpbmdSYXRlW2V4dEZyZXFJbmRleF07CiAgICAgICAgIH0KICAgICAgICAgLy9UT0RPOiBzYXZlIHRoZSBleHRlbnNpb24gc2FtcGxpbmcgcmF0ZSB2YWx1ZSBpbiBtZXRhIGRhdGEgPT4KLSAgICAgICAgLy8gICAgICBtTGFzdFRyYWNrLT5tZXRhLnNldEludDMyKGtLZXlFeHRTYW1wbGVSYXRlLCBleHRTYW1wbGVSYXRlKTsKKyAgICAgICAgLy8gICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwga0tleUV4dFNhbXBsZVJhdGUsIGV4dFNhbXBsZVJhdGUpOwogICAgIH0KIAogICAgIHN3aXRjaCAobnVtQ2hhbm5lbHMpIHsKQEAgLTM5MTUsMzkgKzQ2MDgsNTUgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKIAogICAgIGludDMyX3QgcHJldlNhbXBsZVJhdGU7Ci0gICAgQ0hFQ0sobUxhc3RUcmFjay0+bWV0YS5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZwcmV2U2FtcGxlUmF0ZSkpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTGFzdFRyYWNrLT5tZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCAmcHJldlNhbXBsZVJhdGUpKTsKIAogICAgIGlmIChwcmV2U2FtcGxlUmF0ZSAhPSBzYW1wbGVSYXRlKSB7CiAgICAgICAgIEFMT0dWKCJtcGVnNCBhdWRpbyBzYW1wbGUgcmF0ZSBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cyBzZXR0aW5nLiAiCiAgICAgICAgICAgICAgIndhczogJWQsIG5vdzogJWQiLCBwcmV2U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CiAgICAgfQogCi0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZVJhdGUpOwogCiAgICAgaW50MzJfdCBwcmV2Q2hhbm5lbENvdW50OwotICAgIENIRUNLKG1MYXN0VHJhY2stPm1ldGEuZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZwcmV2Q2hhbm5lbENvdW50KSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1MYXN0VHJhY2stPm1ldGEsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsICZwcmV2Q2hhbm5lbENvdW50KSk7CiAKICAgICBpZiAocHJldkNoYW5uZWxDb3VudCAhPSBudW1DaGFubmVscykgewogICAgICAgICBBTE9HVigibXBlZzQgYXVkaW8gY2hhbm5lbCBjb3VudCBkaWZmZXJlbnQgZnJvbSBwcmV2aW91cyBzZXR0aW5nLiAiCiAgICAgICAgICAgICAgIndhczogJWQsIG5vdzogJWQiLCBwcmV2Q2hhbm5lbENvdW50LCBudW1DaGFubmVscyk7CiAgICAgfQogCi0gICAgbUxhc3RUcmFjay0+bWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBudW1DaGFubmVscyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1MYXN0VHJhY2stPm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbnVtQ2hhbm5lbHMpOwogCiAgICAgcmV0dXJuIE9LOwogfQogCit2b2lkIE1QRUc0RXh0cmFjdG9yOjphZGp1c3RSYXdEZWZhdWx0RnJhbWVTaXplKCkgeworICAgIGludDMyX3QgY2hhbkNvdW50ID0gMDsKKyAgICBpbnQzMl90IGJpdFdpZHRoID0gMDsKKyAgICBjb25zdCBjaGFyICptaW1lU3RyID0gTlVMTDsKKworICAgIGlmKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZVN0cikgJiYKKyAgICAgICAgIXN0cmNhc2VjbXAobWltZVN0ciwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSAmJgorICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULCAmY2hhbkNvdW50KSAmJgorICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUxhc3RUcmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsICZiaXRXaWR0aCkpIHsKKyAgICAgICAgLy8gc2FtcGxlc2l6ZSBpbiBzdHN6IG1heSBub3QgcmlnaHQgLCBzbyB1cGRhZGUgZGVmYXVsdCBzYW1wbGVzaXplCisgICAgICAgIG1MYXN0VHJhY2stPnNhbXBsZVRhYmxlLT5zZXRQcmVkaWN0U2FtcGxlU2l6ZShjaGFuQ291bnQgKiBiaXRXaWR0aCAvIDgpOworICAgIH0KK30KKwogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogTVBFRzRTb3VyY2U6Ok1QRUc0U291cmNlKAotICAgICAgICBNZXRhRGF0YUJhc2UgJmZvcm1hdCwKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0LAorICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAogICAgICAgICBpbnQzMl90IHRpbWVTY2FsZSwKICAgICAgICAgY29uc3Qgc3A8U2FtcGxlVGFibGU+ICZzYW1wbGVUYWJsZSwKICAgICAgICAgVmVjdG9yPFNpZHhFbnRyeT4gJnNpZHgsCiAgICAgICAgIGNvbnN0IFRyZXggKnRyZXgsCiAgICAgICAgIG9mZjY0X3QgZmlyc3RNb29mT2Zmc2V0LAotICAgICAgICBjb25zdCBzcDxJdGVtVGFibGU+ICZpdGVtVGFibGUpCisgICAgICAgIGNvbnN0IHNwPEl0ZW1UYWJsZT4gJml0ZW1UYWJsZSwKKyAgICAgICAgdWludDY0X3QgZWxzdFNoaWZ0U3RhcnRUaWNrcykKICAgICA6IG1Gb3JtYXQoZm9ybWF0KSwKICAgICAgIG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAogICAgICAgbVRpbWVzY2FsZSh0aW1lU2NhbGUpLApAQCAtMzk2OCw0NiArNDY3Nyw1MCBAQAogICAgICAgbUN1cnJlbnRTYW1wbGVJbmZvT2Zmc2V0cyhOVUxMKSwKICAgICAgIG1Jc0FWQyhmYWxzZSksCiAgICAgICBtSXNIRVZDKGZhbHNlKSwKKyAgICAgIG1Jc0FDNChmYWxzZSksCiAgICAgICBtSXNQY20oZmFsc2UpLAogICAgICAgbU5BTExlbmd0aFNpemUoMCksCiAgICAgICBtU3RhcnRlZChmYWxzZSksCi0gICAgICBtR3JvdXAoTlVMTCksCiAgICAgICBtQnVmZmVyKE5VTEwpLAotICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzKGZhbHNlKSwKICAgICAgIG1TcmNCdWZmZXIoTlVMTCksCiAgICAgICBtSXNIZWlmKGl0ZW1UYWJsZSAhPSBOVUxMKSwKLSAgICAgIG1JdGVtVGFibGUoaXRlbVRhYmxlKSB7CisgICAgICBtSXRlbVRhYmxlKGl0ZW1UYWJsZSksCisgICAgICBtRWxzdFNoaWZ0U3RhcnRUaWNrcyhlbHN0U2hpZnRTdGFydFRpY2tzKSB7CiAKICAgICBtZW1zZXQoJm1UcmFja0ZyYWdtZW50SGVhZGVySW5mbywgMCwgc2l6ZW9mKG1UcmFja0ZyYWdtZW50SGVhZGVySW5mbykpOwogCi0gICAgbUZvcm1hdC5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZtQ3J5cHRvTW9kZSk7CisgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCAmbUNyeXB0b01vZGUpOwogICAgIG1EZWZhdWx0SVZTaXplID0gMDsKLSAgICBtRm9ybWF0LmZpbmRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgJm1EZWZhdWx0SVZTaXplKTsKLSAgICB1aW50MzJfdCBrZXl0eXBlOwotICAgIGNvbnN0IHZvaWQgKmtleTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRSwgJm1EZWZhdWx0SVZTaXplKTsKKyAgICB2b2lkICprZXk7CiAgICAgc2l6ZV90IGtleXNpemU7Ci0gICAgaWYgKG1Gb3JtYXQuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJmtleXR5cGUsICZrZXksICZrZXlzaXplKSkgeworICAgIGlmIChBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVksICZrZXksICZrZXlzaXplKSkgewogICAgICAgICBDSEVDSyhrZXlzaXplIDw9IDE2KTsKICAgICAgICAgbWVtc2V0KG1DcnlwdG9LZXksIDAsIDE2KTsKICAgICAgICAgbWVtY3B5KG1DcnlwdG9LZXksIGtleSwga2V5c2l6ZSk7CiAgICAgfQogCi0gICAgbUZvcm1hdC5maW5kSW50MzIoa0tleUVuY3J5cHRlZEJ5dGVCbG9jaywgJm1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKLSAgICBtRm9ybWF0LmZpbmRJbnQzMihrS2V5U2tpcEJ5dGVCbG9jaywgJm1EZWZhdWx0U2tpcEJ5dGVCbG9jayk7CisgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsCisgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSywgJm1EZWZhdWx0RW5jcnlwdGVkQnl0ZUJsb2NrKTsKKyAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwKKyAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1NLSVBfQllURV9CTE9DSywgJm1EZWZhdWx0U2tpcEJ5dGVCbG9jayk7CiAKICAgICBjb25zdCBjaGFyICptaW1lOwotICAgIGJvb2wgc3VjY2VzcyA9IG1Gb3JtYXQuZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgYm9vbCBzdWNjZXNzID0gQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKICAgICBDSEVDSyhzdWNjZXNzKTsKIAogICAgIG1Jc0FWQyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CiAgICAgbUlzSEVWQyA9ICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpIHx8CiAgICAgICAgICAgICAgICFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyk7CisgICAgbUlzQUM0ID0gIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0KTsKIAogICAgIGlmIChtSXNBVkMpIHsKLSAgICAgICAgdWludDMyX3QgdHlwZTsKLSAgICAgICAgY29uc3Qgdm9pZCAqZGF0YTsKKyAgICAgICAgdm9pZCAqZGF0YTsKICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIENIRUNLKGZvcm1hdC5maW5kRGF0YShrS2V5QVZDQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpOworICAgICAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDLCAmZGF0YSwgJnNpemUpKTsKIAogICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAKQEAgLTQwMTcsMTAgKzQ3MzAsOSBAQAogICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgdG8gZW5jb2RlIHRoZSBsZW5ndGggb2YgYSBOQUwgdW5pdC4KICAgICAgICAgbU5BTExlbmd0aFNpemUgPSAxICsgKHB0cls0XSAmIDMpOwogICAgIH0gZWxzZSBpZiAobUlzSEVWQykgewotICAgICAgICB1aW50MzJfdCB0eXBlOwotICAgICAgICBjb25zdCB2b2lkICpkYXRhOworICAgICAgICB2b2lkICpkYXRhOwogICAgICAgICBzaXplX3Qgc2l6ZTsKLSAgICAgICAgQ0hFQ0soZm9ybWF0LmZpbmREYXRhKGtLZXlIVkNDLCAmdHlwZSwgJmRhdGEsICZzaXplKSk7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRCdWZmZXIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NTRF9IRVZDLCAmZGF0YSwgJnNpemUpKTsKIAogICAgICAgICBjb25zdCB1aW50OF90ICpwdHIgPSAoY29uc3QgdWludDhfdCAqKWRhdGE7CiAKQEAgLTQwMzYsMzIgKzQ3NDgsNTQgQEAKICAgICBpZiAobUlzUGNtKSB7CiAgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSAwOwogICAgICAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGUgPSAwOwotICAgICAgICBDSEVDSyhtRm9ybWF0LmZpbmRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgJmJpdHNQZXJTYW1wbGUpKTsKLSAgICAgICAgQ0hFQ0sobUZvcm1hdC5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm51bUNoYW5uZWxzKSk7CisgICAgICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSwgJmJpdHNQZXJTYW1wbGUpKTsKKyAgICAgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgJm51bUNoYW5uZWxzKSk7CiAKICAgICAgICAgaW50MzJfdCBieXRlc1BlclNhbXBsZSA9IGJpdHNQZXJTYW1wbGUgPj4gMzsKICAgICAgICAgaW50MzJfdCBwY21TYW1wbGVTaXplID0gYnl0ZXNQZXJTYW1wbGUgKiBudW1DaGFubmVsczsKIAogICAgICAgICBzaXplX3QgbWF4U2FtcGxlU2l6ZTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNhbXBsZVRhYmxlLT5nZXRNYXhTYW1wbGVTaXplKCZtYXhTYW1wbGVTaXplKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSyB8fCBtYXhTYW1wbGVTaXplICE9IHN0YXRpY19jYXN0PHNpemVfdD4ocGNtU2FtcGxlU2l6ZSkgfHwgYml0c1BlclNhbXBsZSAhPSAxNikgeworICAgICAgICBpZiAoZXJyICE9IE9LIHx8IG1heFNhbXBsZVNpemUgIT0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwY21TYW1wbGVTaXplKQorICAgICAgICAgICAgICAgfHwgYml0c1BlclNhbXBsZSAhPSAxNikgewogICAgICAgICAgICAgLy8gTm90IHN1cHBvcnRlZAogICAgICAgICAgICAgbUlzUGNtID0gZmFsc2U7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRm9ybWF0LnNldEludDMyKGtLZXlNYXhJbnB1dFNpemUsIHBjbVNhbXBsZVNpemUgKiBrTWF4UGNtRnJhbWVTaXplKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBwY21TYW1wbGVTaXplICoga01heFBjbUZyYW1lU2l6ZSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBDSEVDSyhmb3JtYXQuZmluZEludDMyKGtLZXlUcmFja0lELCAmbVRyYWNrSWQpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELCAmbVRyYWNrSWQpKTsKIAogfQogCiBzdGF0dXNfdCBNUEVHNFNvdXJjZTo6aW5pdCgpIHsKKyAgICBzdGF0dXNfdCBlcnIgPSBPSzsKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkpOwogICAgIGlmIChtRmlyc3RNb29mT2Zmc2V0ICE9IDApIHsKICAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSBtRmlyc3RNb29mT2Zmc2V0OwotICAgICAgICByZXR1cm4gcGFyc2VDaHVuaygmb2Zmc2V0KTsKKyAgICAgICAgZXJyID0gcGFyc2VDaHVuaygmb2Zmc2V0KTsKKyAgICAgICAgaWYoZXJyID09IE9LICYmICFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikKKyAgICAgICAgICAgICYmICFtQ3VycmVudFNhbXBsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBTdGFydCBvZmZzZXQgc2hvdWxkIGJlIGxlc3Mgb3IgZXF1YWwgdG8gY29tcG9zaXRpb24gdGltZSBvZiBmaXJzdCBzYW1wbGUuCisgICAgICAgICAgICAvLyBJU08gOiBzYW1wbGVfY29tcG9zaXRpb25fdGltZV9vZmZzZXQsIHZlcnNpb24gMCAodW5zaWduZWQpIGZvciBtYWpvciBicmFuZHMuCisgICAgICAgICAgICBtRWxzdFNoaWZ0U3RhcnRUaWNrcyA9IHN0ZDo6bWluKG1FbHN0U2hpZnRTdGFydFRpY2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDY0X3QpKCptQ3VycmVudFNhbXBsZXMuYmVnaW4oKSkuY29tcG9zaXRpb25PZmZzZXQpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQotICAgIHJldHVybiBPSzsKKworICAgIGlmICghc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKSB7CisgICAgICAgIHVpbnQ2NF90IGZpcnN0U2FtcGxlQ1RTID0gMDsKKyAgICAgICAgZXJyID0gbVNhbXBsZVRhYmxlLT5nZXRNZXRhRGF0YUZvclNhbXBsZSgwLCBOVUxMLCBOVUxMLCAmZmlyc3RTYW1wbGVDVFMpOworICAgICAgICAvLyBTdGFydCBvZmZzZXQgc2hvdWxkIGJlIGxlc3Mgb3IgZXF1YWwgdG8gY29tcG9zaXRpb24gdGltZSBvZiBmaXJzdCBzYW1wbGUuCisgICAgICAgIC8vIENvbXBvc2l0aW9uIHRpbWUgc3RhbXAgb2YgZmlyc3Qgc2FtcGxlIGNhbm5vdCBiZSBuZWdhdGl2ZS4KKyAgICAgICAgbUVsc3RTaGlmdFN0YXJ0VGlja3MgPSBzdGQ6Om1pbihtRWxzdFNoaWZ0U3RhcnRUaWNrcywgZmlyc3RTYW1wbGVDVFMpOworICAgIH0KKworICAgIHJldHVybiBlcnI7CiB9CiAKIE1QRUc0U291cmNlOjp+TVBFRzRTb3VyY2UoKSB7CkBAIC00MDcyLDIxICs0ODA2LDEzIEBACiAgICAgZnJlZShtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzKTsKIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHNFNvdXJjZTo6c3RhcnQoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIENIRUNLKCFtU3RhcnRlZCk7CiAKLSAgICBpbnQzMl90IHZhbDsKLSAgICBpZiAocGFyYW1zICYmIHBhcmFtcy0+ZmluZEludDMyKGtLZXlXYW50c05BTEZyYWdtZW50cywgJnZhbCkKLSAgICAgICAgJiYgdmFsICE9IDApIHsKLSAgICAgICAgbVdhbnRzTkFMRnJhZ21lbnRzID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtV2FudHNOQUxGcmFnbWVudHMgPSBmYWxzZTsKLSAgICB9Ci0KICAgICBpbnQzMl90IHRtcDsKLSAgICBDSEVDSyhtRm9ybWF0LmZpbmRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCAmdG1wKSk7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsICZ0bXApKTsKICAgICBzaXplX3QgbWF4X3NpemUgPSB0bXA7CiAKICAgICAvLyBBIHNvbWV3aGF0IGFyYml0cmFyeSBsaW1pdCB0aGF0IHNob3VsZCBiZSBzdWZmaWNpZW50IGZvciA4ayB2aWRlbyBmcmFtZXMKQEAgLTQwOTQsMzIgKzQ4MjAsMzAgQEAKICAgICBjb25zdCBzaXplX3Qga01heEJ1ZmZlclNpemUgPSA2NCAqIDEwMjQgKiAxMDI0OwogICAgIGlmIChtYXhfc2l6ZSA+IGtNYXhCdWZmZXJTaXplKSB7CiAgICAgICAgIEFMT0dFKCJib2d1cyBtYXggaW5wdXQgc2l6ZTogJXp1ID4gJXp1IiwgbWF4X3NpemUsIGtNYXhCdWZmZXJTaXplKTsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogICAgIGlmIChtYXhfc2l6ZSA9PSAwKSB7CiAgICAgICAgIEFMT0dFKCJ6ZXJvIG1heCBpbnB1dCBzaXplIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIC8vIEFsbG93IHVwIHRvIGtNYXhCdWZmZXJzLCBidXQgbm90IGlmIHRoZSB0b3RhbCBleGNlZWRzIGtNYXhCdWZmZXJTaXplLgogICAgIGNvbnN0IHNpemVfdCBrSW5pdGlhbEJ1ZmZlcnMgPSAyOwogICAgIGNvbnN0IHNpemVfdCBrTWF4QnVmZmVycyA9IDg7CiAgICAgY29uc3Qgc2l6ZV90IHJlYWxNYXhCdWZmZXJzID0gbWluKGtNYXhCdWZmZXJTaXplIC8gbWF4X3NpemUsIGtNYXhCdWZmZXJzKTsKLSAgICBtR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cChrSW5pdGlhbEJ1ZmZlcnMsIG1heF9zaXplLCByZWFsTWF4QnVmZmVycyk7CisgICAgbUJ1ZmZlckdyb3VwLT5pbml0KGtJbml0aWFsQnVmZmVycywgbWF4X3NpemUsIHJlYWxNYXhCdWZmZXJzKTsKICAgICBtU3JjQnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbbWF4X3NpemVdOwogICAgIGlmIChtU3JjQnVmZmVyID09IE5VTEwpIHsKICAgICAgICAgLy8gZmlsZSBwcm9iYWJseSBzcGVjaWZpZWQgYSBiYWQgbWF4IHNpemUKLSAgICAgICAgZGVsZXRlIG1Hcm91cDsKLSAgICAgICAgbUdyb3VwID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1QRUc0U291cmNlOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnN0b3AoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAogICAgIENIRUNLKG1TdGFydGVkKTsKQEAgLTQxMzIsMTMgKzQ4NTYsMTAgQEAKICAgICBkZWxldGVbXSBtU3JjQnVmZmVyOwogICAgIG1TcmNCdWZmZXIgPSBOVUxMOwogCi0gICAgZGVsZXRlIG1Hcm91cDsKLSAgICBtR3JvdXAgPSBOVUxMOwotCiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKICAgICBtQ3VycmVudFNhbXBsZUluZGV4ID0gMDsKIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VDaHVuayhvZmY2NF90ICpvZmZzZXQpIHsKQEAgLTQyNTYsNyArNDk3Nyw4IEBACiAgICAgICAgIH0KICAgICAgICAgY2FzZSBGT1VSQ0MoInNhaW8iKTogewogICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICAgICAgaWYgKChlcnIgPSBwYXJzZVNhbXBsZUF1eGlsaWFyeUluZm9ybWF0aW9uT2Zmc2V0cyhkYXRhX29mZnNldCwgY2h1bmtfZGF0YV9zaXplKSkgIT0gT0spIHsKKyAgICAgICAgICAgIGlmICgoZXJyID0gcGFyc2VTYW1wbGVBdXhpbGlhcnlJbmZvcm1hdGlvbk9mZnNldHMoZGF0YV9vZmZzZXQsIGNodW5rX2RhdGFfc2l6ZSkpCisgICAgICAgICAgICAgICAgICAgICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpvZmZzZXQgKz0gY2h1bmtfc2l6ZTsKQEAgLTQzODcsNyArNTEwOSw4IEBACiAgICAgaWYgKGVudHJ5Y291bnQgPiBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzQWxsb2NTaXplKSB7CiAgICAgICAgIHVpbnQ2NF90ICpuZXdQdHIgPSAodWludDY0X3QgKilyZWFsbG9jKG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMsIGVudHJ5Y291bnQgKiA4KTsKICAgICAgICAgaWYgKG5ld1B0ciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHJlYWxsb2MgJXUgLT4gJXUiLCBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzQWxsb2NTaXplLCBlbnRyeWNvdW50ICogOCk7CisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIHJlYWxsb2MgJXUgLT4gJXUiLAorICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZm9PZmZzZXRzQWxsb2NTaXplLCBlbnRyeWNvdW50ICogOCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICB9CiAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5mb09mZnNldHMgPSBuZXdQdHI7CkBAIC00NDI2LDEwICs1MTQ5LDEzIEBACiAgICAgcmV0dXJuIHBhcnNlQ2xlYXJFbmNyeXB0ZWRTaXplcyhkcm1vZmZzZXQsIGZhbHNlLCAwKTsKIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OnBhcnNlQ2xlYXJFbmNyeXB0ZWRTaXplcyhvZmY2NF90IG9mZnNldCwgYm9vbCBpc1N1YnNhbXBsZUVuY3J5cHRpb24sIHVpbnQzMl90IGZsYWdzKSB7CitzdGF0dXNfdCBNUEVHNFNvdXJjZTo6cGFyc2VDbGVhckVuY3J5cHRlZFNpemVzKAorICAgICAgICBvZmY2NF90IG9mZnNldCwgYm9vbCBpc1N1YnNhbXBsZUVuY3J5cHRpb24sIHVpbnQzMl90IGZsYWdzKSB7CiAKLSAgICBpbnQgaXZsZW5ndGg7Ci0gICAgQ0hFQ0sobUZvcm1hdC5maW5kSW50MzIoa0tleUNyeXB0b0RlZmF1bHRJVlNpemUsICZpdmxlbmd0aCkpOworICAgIGludDMyX3QgaXZsZW5ndGg7CisgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fREVGQVVMVF9JVl9TSVpFLCAmaXZsZW5ndGgpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQogCiAgICAgLy8gb25seSAwLCA4IGFuZCAxNiBieXRlIGluaXRpYWxpemF0aW9uIHZlY3RvcnMgYXJlIHN1cHBvcnRlZAogICAgIGlmIChpdmxlbmd0aCAhPSAwICYmIGl2bGVuZ3RoICE9IDggJiYgaXZsZW5ndGggIT0gMTYpIHsKQEAgLTQ2MTIsNyArNTMzOCw3IEBACiAKIHN0YXR1c190IE1QRUc0U291cmNlOjpwYXJzZVRyYWNrRnJhZ21lbnRSdW4ob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3Qgc2l6ZSkgewogCi0gICAgQUxPR1YoIk1QRUc0RXh0cmFjdG9yOjpwYXJzZVRyYWNrRnJhZ21lbnRSdW4iKTsKKyAgICBBTE9HVigiTVBFRzRTb3VyY2U6OnBhcnNlVHJhY2tGcmFnbWVudFJ1biIpOwogICAgIGlmIChzaXplIDwgOCkgewogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CkBAIC00NzE5LDggKzU0NDUsMzAgQEAKICAgICAgICAgc2FtcGxlQ3RzT2Zmc2V0ID0gMDsKICAgICB9CiAKLSAgICBpZiAoc2l6ZSA8IChvZmY2NF90KShzYW1wbGVDb3VudCAqIGJ5dGVzUGVyU2FtcGxlKSkgewotICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAoYnl0ZXNQZXJTYW1wbGUgIT0gMCkgeworICAgICAgICBpZiAoc2l6ZSA8IChvZmY2NF90KXNhbXBsZUNvdW50ICogYnl0ZXNQZXJTYW1wbGUpIHsKKyAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNhbXBsZUR1cmF0aW9uID09IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJiLzEyMzM4OTg4MSBzYW1wbGVEdXJhdGlvbiA9PSAwIik7CisgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjEyNDM4OTg4MSB6ZXJvIik7CisgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGFwcGx5IHNvbWUgc2FuaXR5ICh2cyBzdHJpY3QgbGVnYWxpdHkpIGNoZWNrcworICAgICAgICAvLworICAgICAgICAvLyBjbGFtcCB0aGUgY291bnQgb2YgZW50cmllcyBpbiB0aGUgdHJ1biBib3gsIHRvIGF2b2lkIHNwZW5kaW5nIGZvcmV2ZXIgcGFyc2luZworICAgICAgICAvLyB0aGlzIGJveC4gQ2xhbXBpbmcgKHZzIGVycm9yKSBsZXRzIHVzIHBsYXkgKnNvbWV0aGluZyouCisgICAgICAgIC8vIDEgbWlsbGlvbiBpcyBhYm91dCA0MDAgbXNlY3Mgb24gYSBQaXhlbDMsIHNob3VsZCBiZSBubyBtb3JlIHRoYW4gYSBjb3VwbGUgc2Vjb25kcworICAgICAgICAvLyBvbiB0aGUgc2xvd2VzdCBkZXZpY2VzLgorICAgICAgICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IGtNYXhUcnVuU2FtcGxlQ291bnQgPSAxMDAwMDAwOworICAgICAgICBpZiAoc2FtcGxlQ291bnQgPiBrTWF4VHJ1blNhbXBsZUNvdW50KSB7CisgICAgICAgICAgICBBTE9HVygiYi8xMjMzODk4ODEgY2xhbXAgc2FtcGxlQ291bnQoJXUpIEAga01heFRydW5TYW1wbGVDb3VudCgldSkiLAorICAgICAgICAgICAgICAgICAgc2FtcGxlQ291bnQsIGtNYXhUcnVuU2FtcGxlQ291bnQpOworICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMjQzODk4ODEgY291bnQiKTsKKworICAgICAgICB9CiAgICAgfQogCiAgICAgU2FtcGxlIHRtcDsKQEAgLTQ3NTQsMTAgKzU1MDIsMTAgQEAKICAgICAgICAgfQogCiAgICAgICAgIEFMT0dWKCJhZGRpbmcgc2FtcGxlICVkIGF0IG9mZnNldCAweCUwOCIgUFJJeDY0ICIsIHNpemUgJXUsIGR1cmF0aW9uICV1LCAiCi0gICAgICAgICAgICAgICIgZmxhZ3MgMHglMDh4IiwgaSArIDEsCisgICAgICAgICAgICAgICIgZmxhZ3MgMHglMDh4IGN0c09mZnNldCAlIiBQUkl1MzIsIGkgKyAxLAogICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsIHNhbXBsZVNpemUsIHNhbXBsZUR1cmF0aW9uLAogICAgICAgICAgICAgICAgIChmbGFncyAmIGtGaXJzdFNhbXBsZUZsYWdzUHJlc2VudCkgJiYgaSA9PSAwCi0gICAgICAgICAgICAgICAgICAgID8gZmlyc3RTYW1wbGVGbGFncyA6IHNhbXBsZUZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgPyBmaXJzdFNhbXBsZUZsYWdzIDogc2FtcGxlRmxhZ3MsIHNhbXBsZUN0c09mZnNldCk7CiAgICAgICAgIHRtcC5vZmZzZXQgPSBkYXRhT2Zmc2V0OwogICAgICAgICB0bXAuc2l6ZSA9IHNhbXBsZVNpemU7CiAgICAgICAgIHRtcC5kdXJhdGlvbiA9IHNhbXBsZUR1cmF0aW9uOwpAQCAtNDc3MywxMCArNTUyMSwxMCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTVBFRzRTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK21lZGlhX3N0YXR1c190IE1QRUc0U291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBtZXRhID0gbUZvcm1hdDsKLSAgICByZXR1cm4gT0s7CisgICAgQU1lZGlhRm9ybWF0X2NvcHkobWV0YSwgbUZvcm1hdCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogc2l6ZV90IE1QRUc0U291cmNlOjpwYXJzZU5BTFNpemUoY29uc3QgdWludDhfdCAqZGF0YSkgY29uc3QgewpAQCAtNDc5OCwxNSArNTU0Niw0NiBAQAogICAgIHJldHVybiAwOwogfQogCi1zdGF0dXNfdCBNUEVHNFNvdXJjZTo6cmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworaW50MzJfdCBNUEVHNFNvdXJjZTo6cGFyc2VIRVZDTGF5ZXJJZChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChkYXRhID09IG51bGxwdHIgfHwgc2l6ZSA8IG1OQUxMZW5ndGhTaXplICsgMikgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gSEVWQyBOQUwtaGVhZGVyICgxNi1iaXQpCisgICAgLy8gIDEgICA2ICAgICAgNiAgICAgMworICAgIC8vIHwtfHV1dXV1dXwtLS0tLS18aWlpfAorICAgIC8vICAgICAgXiAgICAgICAgICAgIF4KKyAgICAvLyAgTkFMX3R5cGUgICAgICAgIGxheWVyX2lkICsgMQorICAgIC8vCisgICAgLy8gTGF5ZXItaWQgaXMgbm9uLXplcm8gb25seSBmb3IgVGVtcG9yYWwgU3ViLWxheWVyIEFjY2VzcyBwaWN0dXJlcyAoVFNBKQorICAgIGVudW0geworICAgICAgICBUU0FfTiA9IDIsCisgICAgICAgIFRTQV9SID0gMywKKyAgICAgICAgU1RTQV9OID0gNCwKKyAgICAgICAgU1RTQV9SID0gNSwKKyAgICB9OworCisgICAgZGF0YSArPSBtTkFMTGVuZ3RoU2l6ZTsKKyAgICB1aW50MTZfdCBuYWxIZWFkZXIgPSBkYXRhWzBdIDw8IDggfCBkYXRhWzFdOworCisgICAgdWludDE2X3QgbmFsVHlwZSA9IChuYWxIZWFkZXIgPj4gOSkgJiAweDNGdTsKKyAgICBpZiAobmFsVHlwZSA9PSBUU0FfTiB8fCBuYWxUeXBlID09IFRTQV9SIHx8IG5hbFR5cGUgPT0gU1RTQV9OIHx8IG5hbFR5cGUgPT0gU1RTQV9SKSB7CisgICAgICAgIGludDMyX3QgbGF5ZXJJZFBsdXNPbmUgPSBuYWxIZWFkZXIgJiAweDd1OworICAgICAgICBBTE9HRF9JRihsYXllcklkUGx1c09uZSA9PSAwLCAiZ290IGxheWVySWQgMCBmb3IgVFNBIHBpY3R1cmUiKTsKKyAgICAgICAgcmV0dXJuIGxheWVySWRQbHVzT25lIC0gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK21lZGlhX3N0YXR1c190IE1QRUc0U291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgQ0hFQ0sobVN0YXJ0ZWQpOwogCi0gICAgaWYgKG9wdGlvbnMgIT0gbnVsbHB0ciAmJiBvcHRpb25zLT5nZXROb25CbG9ja2luZygpICYmICFtR3JvdXAtPmhhc19idWZmZXJzKCkpIHsKKyAgICBpZiAob3B0aW9ucyAhPSBudWxscHRyICYmIG9wdGlvbnMtPmdldE5vbkJsb2NraW5nKCkgJiYgIW1CdWZmZXJHcm91cC0+aGFzX2J1ZmZlcnMoKSkgewogICAgICAgICAqb3V0ID0gbnVsbHB0cjsKLSAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1dPVUxEX0JMT0NLOwogICAgIH0KIAogICAgIGlmIChtRmlyc3RNb29mT2Zmc2V0ID4gMCkgewpAQCAtNDgyMCwxMiArNTU5OSwxMyBAQAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKICAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZTsKICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgeworCiAgICAgICAgIGlmIChtSXNIZWlmKSB7CiAgICAgICAgICAgICBDSEVDSyhtU2FtcGxlVGFibGUgPT0gTlVMTCk7CiAgICAgICAgICAgICBDSEVDSyhtSXRlbVRhYmxlICE9IE5VTEwpOwogICAgICAgICAgICAgaW50MzJfdCBpbWFnZUluZGV4OwotICAgICAgICAgICAgaWYgKCFtRm9ybWF0LmZpbmRJbnQzMihrS2V5VHJhY2tJRCwgJmltYWdlSW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQsICZpbWFnZUluZGV4KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdGF0dXNfdCBlcnI7CkBAIC00ODM1LDcgKzU2MTUsNyBAQAogICAgICAgICAgICAgICAgIGVyciA9IG1JdGVtVGFibGUtPmZpbmRUaHVtYm5haWxJdGVtKGltYWdlSW5kZXgsICZtQ3VycmVudFNhbXBsZUluZGV4KTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHVpbnQzMl90IGZpbmRGbGFncyA9IDA7CkBAIC00ODU3LDYgKzU2MzcsOSBAQAogICAgICAgICAgICAgICAgICAgICBDSEVDSyghIlNob3VsZCBub3QgYmUgaGVyZS4iKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggbW9kZSAhPSBSZWFkT3B0aW9uczo6U0VFS19GUkFNRV9JTkRFWCkgeworICAgICAgICAgICAgICAgIHNlZWtUaW1lVXMgKz0gKChsb25nIGRvdWJsZSltRWxzdFNoaWZ0U3RhcnRUaWNrcyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZTsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlSW5kZXg7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBtU2FtcGxlVGFibGUtPmZpbmRTYW1wbGVBdFRpbWUoCkBAIC00ODgwLDcgKzU2NjMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlSW5kZXgsICZzeW5jU2FtcGxlSW5kZXgsIGZpbmRGbGFncyk7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVRpbWU7CisgICAgICAgICAgICB1aW50NjRfdCBzYW1wbGVUaW1lOwogICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICAgICAgICAgIGVyciA9IG1TYW1wbGVUYWJsZS0+Z2V0TWV0YURhdGFGb3JTYW1wbGUoCiAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVJbmRleCwgTlVMTCwgTlVMTCwgJnNhbXBsZVRpbWUpOwpAQCAtNDg5MywxNCArNTY3NiwxNSBAQAogICAgICAgICAgICAgICAgICAgICAvLyB0aGlzIGFsbCB0aGUgd2F5IHRvIHRoZSBNZWRpYVBsYXllciB3b3VsZCBjYXVzZSBhYm5vcm1hbAogICAgICAgICAgICAgICAgICAgICAvLyB0ZXJtaW5hdGlvbi4gTGVnYWN5IGJlaGF2aW91ciBhcHBlYXJzIHRvIGJlIHRvIGJlaGF2ZSBhcyBpZgogICAgICAgICAgICAgICAgICAgICAvLyB3ZSBoYWQgc2Vla2VkIHRvIHRoZSBlbmQgb2Ygc3RyZWFtLCBlbmRpbmcgbm9ybWFsbHkuCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR1YoImVuZCBvZiBzdHJlYW0iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVAogICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0gUmVhZE9wdGlvbnM6OlNFRUtfRlJBTUVfSU5ERVgpIHsKKyAgICAgICAgICAgICAgICBzYW1wbGVUaW1lIC09IG1FbHN0U2hpZnRTdGFydFRpY2tzOwogICAgICAgICAgICAgICAgIHRhcmdldFNhbXBsZVRpbWVVcyA9IChzYW1wbGVUaW1lICogMTAwMDAwMGxsKSAvIG1UaW1lc2NhbGU7CiAgICAgICAgICAgICB9CiAKQEAgLTQ5MjksNyArNTcxMyw3IEBACiAKICAgICBvZmY2NF90IG9mZnNldCA9IDA7CiAgICAgc2l6ZV90IHNpemUgPSAwOwotICAgIHVpbnQzMl90IGN0cywgc3R0czsKKyAgICB1aW50NjRfdCBjdHMsIHN0dHM7CiAgICAgYm9vbCBpc1N5bmNTYW1wbGU7CiAgICAgYm9vbCBuZXdCdWZmZXIgPSBmYWxzZTsKICAgICBpZiAobUJ1ZmZlciA9PSBOVUxMKSB7CkBAIC00OTM5LDYgKzU3MjMsMTQgQEAKICAgICAgICAgaWYgKCFtSXNIZWlmKSB7CiAgICAgICAgICAgICBlcnIgPSBtU2FtcGxlVGFibGUtPmdldE1ldGFEYXRhRm9yU2FtcGxlKAogICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4LCAmb2Zmc2V0LCAmc2l6ZSwgJmN0cywgJmlzU3luY1NhbXBsZSwgJnN0dHMpOworICAgICAgICAgICAgaWYoZXJyID09IE9LKSB7CisgICAgICAgICAgICAgICAgLyogQ29tcG9zaXRpb24gVGltZSBTdGFtcCBjYW5ub3QgYmUgbmVnYXRpdmUuIFNvbWUgZmlsZXMgaGF2ZSB2aWRlbyBTYW1wbGUKKyAgICAgICAgICAgICAgICAqIFRpbWUoU1RUUylkZWx0YSB3aXRoIHplcm8gdmFsdWUoYi8xMTc0MDI0MjApLiAgSGVuY2Ugc3VidHJhY3Qgb25seQorICAgICAgICAgICAgICAgICogbWluKGN0cywgbUVsc3RTaGlmdFN0YXJ0VGlja3MpLCBzbyB0aGF0IGF1ZGlvIHRyYWNrcyBjYW4gYmUgcGxheWVkLgorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgY3RzIC09IHN0ZDo6bWluKGN0cywgbUVsc3RTaGlmdFN0YXJ0VGlja3MpOworICAgICAgICAgICAgfQorCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBlcnIgPSBtSXRlbVRhYmxlLT5nZXRJbWFnZU9mZnNldEFuZFNpemUoCiAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkgPwpAQCAtNDk1MCwyNCArNTc0MiwyNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogCi0gICAgICAgIGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJm1CdWZmZXIpOworICAgICAgICBlcnIgPSBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZtQnVmZmVyKTsKIAogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICBDSEVDSyhtQnVmZmVyID09IE5VTEwpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogICAgICAgICBpZiAoc2l6ZSA+IG1CdWZmZXItPnNpemUoKSkgewogICAgICAgICAgICAgQUxPR0UoImJ1ZmZlciB0b28gc21hbGw6ICV6dSA+ICV6dSIsIHNpemUsIG1CdWZmZXItPnNpemUoKSk7CiAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9CVUZGRVJfVE9PX1NNQUxMOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOyAvLyBFUlJPUl9CVUZGRVJfVE9PX1NNQUxMCiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoKCFtSXNBVkMgJiYgIW1Jc0hFVkMpIHx8IG1XYW50c05BTEZyYWdtZW50cykgeworICAgIGlmICghbUlzQVZDICYmICFtSXNIRVZDICYmICFtSXNBQzQpIHsKICAgICAgICAgaWYgKG5ld0J1ZmZlcikgewogICAgICAgICAgICAgaWYgKG1Jc1BjbSkgewogICAgICAgICAgICAgICAgIC8vIFRoZSB0d29zJyBQQ00gYmxvY2sgcmVhZGVyIGFzc3VtZXMgdGhhdCBhbGwgc2FtcGxlcyBoYXMgdGhlIHNhbWUgc2l6ZS4KQEAgLTQ5ODIsMjQgKzU3NzcsMjcgQEAKICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzVG9SZWFkLCBzaXplLCBtQ3VycmVudFNhbXBsZUluZGV4LAogICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVUYWJsZS0+Z2V0TGFzdFNhbXBsZUluZGV4SW5DaHVuaygpKTsKIAotICAgICAgICAgICAgICAgIHNpemVfdCB0b3RhbFNpemUgPSBzYW1wbGVzVG9SZWFkICogc2l6ZTsKKyAgICAgICAgICAgICAgIHNpemVfdCB0b3RhbFNpemUgPSBzYW1wbGVzVG9SZWFkICogc2l6ZTsKICAgICAgICAgICAgICAgICB1aW50OF90KiBidWYgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKICAgICAgICAgICAgICAgICBzc2l6ZV90IGJ5dGVzUmVhZCA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBidWYsIHRvdGFsU2l6ZSk7CiAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA8IChzc2l6ZV90KXRvdGFsU2l6ZSkgewogICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5jbGVhcigpOwotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9jbGVhcihtZXRhKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGxvbmcgZG91YmxlKWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAKLSAgICAgICAgICAgICAgICBpbnQzMl90IGJ5dGVPcmRlcjsKLSAgICAgICAgICAgICAgICBtRm9ybWF0LmZpbmRJbnQzMihrS2V5UGNtQmlnRW5kaWFuLCAmYnl0ZU9yZGVyKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGJ5dGVPcmRlciA9IDA7CisgICAgICAgICAgICAgICAgYm9vbCBpc0dldEJpZ0VuZGlhbiA9IEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fQklHX0VORElBTiwgJmJ5dGVPcmRlcik7CiAKLSAgICAgICAgICAgICAgICBpZiAoYnl0ZU9yZGVyID09IDEpIHsKKyAgICAgICAgICAgICAgICBpZiAoaXNHZXRCaWdFbmRpYW4gJiYgYnl0ZU9yZGVyID09IDEpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gQmlnLWVuZGlhbiAtPiBsaXR0bGUtZW5kaWFuCiAgICAgICAgICAgICAgICAgICAgIHVpbnQxNl90ICpkc3REYXRhID0gKHVpbnQxNl90ICopYnVmOwogICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCAqc3JjRGF0YSA9ICh1aW50MTZfdCAqKWJ1ZjsKQEAgLTUwMTksMTY2ICs1ODE3LDgxIEBACiAgICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOwotICAgICAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGltZSwgKChpbnQ2NF90KWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfY2xlYXIobWV0YSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGxvbmcgZG91YmxlKWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgKChsb25nIGRvdWJsZSlzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKIAogICAgICAgICAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaWYgKGlzU3luY1NhbXBsZSkgewotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKICAgICAgICAgICAgICAgICB9Ci0KKyAKICAgICAgICAgICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIW1Jc0FWQyAmJiAhbUlzSEVWQykgewotICAgICAgICAgICAgKm91dCA9IG1CdWZmZXI7Ci0gICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKKyAgICAgICAgKm91dCA9IG1CdWZmZXI7CisgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKIAotICAgICAgICAvLyBFYWNoIE5BTCB1bml0IGlzIHNwbGl0IHVwIGludG8gaXRzIGNvbnN0aXR1ZW50IGZyYWdtZW50cyBhbmQKLSAgICAgICAgLy8gZWFjaCBvbmUgb2YgdGhlbSByZXR1cm5lZCBpbiBpdHMgb3duIGJ1ZmZlci4KLQotICAgICAgICBDSEVDSyhtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA+PSBtTkFMTGVuZ3RoU2l6ZSk7Ci0KLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjID0KLSAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpICsgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7Ci0KLSAgICAgICAgc2l6ZV90IG5hbF9zaXplID0gcGFyc2VOQUxTaXplKHNyYyk7Ci0gICAgICAgIGlmIChtTkFMTGVuZ3RoU2l6ZSA+IFNJWkVfTUFYIC0gbmFsX3NpemUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJiLzI0NDQxNTUzLCBiLzI0NDQ1MTIyIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gbU5BTExlbmd0aFNpemUgPCBuYWxfc2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoImluY29tcGxldGUgTkFMIHVuaXQuIik7Ci0KLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpjbG9uZSA9IG1CdWZmZXItPmNsb25lKCk7Ci0gICAgICAgIENIRUNLKGNsb25lICE9IE5VTEwpOwotICAgICAgICBjbG9uZS0+c2V0X3JhbmdlKG1CdWZmZXItPnJhbmdlX29mZnNldCgpICsgbU5BTExlbmd0aFNpemUsIG5hbF9zaXplKTsKLQorICAgIH0gZWxzZSBpZiAobUlzQUM0KSB7CiAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgKLSAgICAgICAgICAgICAgICBtQnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIG1OQUxMZW5ndGhTaXplICsgbmFsX3NpemUsCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBtTkFMTGVuZ3RoU2l6ZSAtIG5hbF9zaXplKTsKLQotICAgICAgICBpZiAobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPT0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICAqb3V0ID0gY2xvbmU7Ci0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFdob2xlIE5BTCB1bml0cyBhcmUgcmV0dXJuZWQgYnV0IGVhY2ggZnJhZ21lbnQgaXMgcHJlZml4ZWQgYnkKLSAgICAgICAgLy8gdGhlIHN0YXJ0IGNvZGUgKDB4MDAgMDAgMDAgMDEpLgotICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0gMDsKLSAgICAgICAgaW50MzJfdCBkcm0gPSAwOwotICAgICAgICBib29sIHVzZXNEUk0gPSAobUZvcm1hdC5maW5kSW50MzIoa0tleUlzRFJNLCAmZHJtKSAmJiBkcm0gIT0gMCk7Ci0gICAgICAgIGlmICh1c2VzRFJNKSB7Ci0gICAgICAgICAgICBudW1fYnl0ZXNfcmVhZCA9Ci0gICAgICAgICAgICAgICAgbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsICh1aW50OF90KiltQnVmZmVyLT5kYXRhKCksIHNpemUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbnVtX2J5dGVzX3JlYWQgPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgbVNyY0J1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobnVtX2J5dGVzX3JlYWQgPCAoc3NpemVfdClzaXplKSB7CisgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGVyZSBpcyBlbm91Z2ggc3BhY2UgdG8gd3JpdGUgdGhlIHN5bmMgaGVhZGVyIGFuZCB0aGUgcmF3IGZyYW1lCisgICAgICAgIGlmIChtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA8ICg3ICsgc2l6ZSkpIHsKICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKHVzZXNEUk0pIHsKLSAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgc2l6ZSk7CisgICAgICAgIHVpbnQ4X3QgKmRzdERhdGEgPSAodWludDhfdCAqKW1CdWZmZXItPmRhdGEoKTsKKyAgICAgICAgc2l6ZV90IGRzdE9mZnNldCA9IDA7CisgICAgICAgIC8vIEFkZCBBQy00IHN5bmMgaGVhZGVyIHRvIE1QRUc0IGVuY2Fwc3VsYXRlZCBBQy00IHJhdyBmcmFtZQorICAgICAgICAvLyBBQzQwIHN5bmMgd29yZCwgbWVhbmluZyBubyBDUkMgYXQgdGhlIGVuZCBvZiB0aGUgZnJhbWUKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAweEFDOworICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDB4NDA7CisgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMHhGRjsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAweEZGOworICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9ICh1aW50OF90KSgoc2l6ZSA+PiAxNikgJiAweEZGKTsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAodWludDhfdCkoKHNpemUgPj4gOCkgJiAweEZGKTsKKyAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAodWludDhfdCkoKHNpemUgPj4gMCkgJiAweEZGKTsKIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7Ci0gICAgICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKKyAgICAgICAgc3NpemVfdCBudW1CeXRlc1JlYWQgPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgZHN0RGF0YSArIGRzdE9mZnNldCwgc2l6ZSk7CisgICAgICAgIGlmIChudW1CeXRlc1JlYWQgIT0gKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgICAgIHdoaWxlIChzcmNPZmZzZXQgPCBzaXplKSB7Ci0gICAgICAgICAgICAgICAgYm9vbCBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBtTkFMTGVuZ3RoU2l6ZSk7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc01hbEZvcm1lZCkgewotICAgICAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7Ci0gICAgICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMTGVuZ3RoU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbmFsTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoaXNNYWxGb3JtZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlZpZGVvIGlzIG1hbGZvcm1lZCIpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYWxMZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZHN0T2Zmc2V0ID4gU0laRV9NQVggLSA0IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ID4gU0laRV9NQVggLSBuYWxMZW5ndGggfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgKyBuYWxMZW5ndGggPiBtQnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImIvMjcyMDg2MjEgOiAlenUgJXp1IiwgZHN0T2Zmc2V0LCBtQnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3MjA4NjIxIik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAxOwotICAgICAgICAgICAgICAgIG1lbWNweSgmZHN0RGF0YVtkc3RPZmZzZXRdLCAmbVNyY0J1ZmZlcltzcmNPZmZzZXRdLCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxMZW5ndGg7Ci0gICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbExlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENIRUNLX0VRKHNyY09mZnNldCwgc2l6ZSk7Ci0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRzdE9mZnNldCk7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgICAgICB9CiAKLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuY2xlYXIoKTsKLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwotICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICgoaW50NjRfdClzdHRzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIGRzdE9mZnNldCArIHNpemUpOworICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAoKGxvbmcgZG91YmxlKWN0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoKGxvbmcgZG91YmxlKXN0dHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwogCiAgICAgICAgIGlmICh0YXJnZXRTYW1wbGVUaW1lVXMgPj0gMCkgewotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlUYXJnZXRUaW1lLCB0YXJnZXRTYW1wbGVUaW1lVXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Jc0FWQykgewotICAgICAgICAgICAgdWludDMyX3QgbGF5ZXJJZCA9IEZpbmRBVkNMYXllcklkKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOwotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJJZCwgbGF5ZXJJZCk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNTeW5jRnJhbWUsIDEpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAgICAgICAgIH0KIAogICAgICAgICArK21DdXJyZW50U2FtcGxlSW5kZXg7CkBAIC01MTg2LDEyICs1ODk5LDEwNSBAQAogICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIE9LOworICAgICAgICByZXR1cm4gQU1FRElBX09LOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFdob2xlIE5BTCB1bml0cyBhcmUgcmV0dXJuZWQgYnV0IGVhY2ggZnJhZ21lbnQgaXMgcHJlZml4ZWQgYnkKKyAgICAgICAgLy8gdGhlIHN0YXJ0IGNvZGUgKDB4MDAgMDAgMDAgMDEpLgorICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0gMDsKKyAgICAgICAgbnVtX2J5dGVzX3JlYWQgPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG9mZnNldCwgbVNyY0J1ZmZlciwgc2l6ZSk7CisKKyAgICAgICAgaWYgKG51bV9ieXRlc19yZWFkIDwgKHNzaXplX3Qpc2l6ZSkgeworICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CisgICAgICAgIH0KKworICAgICAgICB1aW50OF90ICpkc3REYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7CisgICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOworICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKKworICAgICAgICB3aGlsZSAoc3JjT2Zmc2V0IDwgc2l6ZSkgeworICAgICAgICAgICAgYm9vbCBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBtTkFMTGVuZ3RoU2l6ZSk7CisgICAgICAgICAgICBzaXplX3QgbmFsTGVuZ3RoID0gMDsKKyAgICAgICAgICAgIGlmICghaXNNYWxGb3JtZWQpIHsKKyAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7CisgICAgICAgICAgICAgICAgc3JjT2Zmc2V0ICs9IG1OQUxMZW5ndGhTaXplOworICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG5hbExlbmd0aCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChpc01hbEZvcm1lZCkgeworICAgICAgICAgICAgICAgIC8vaWYgbmFsbGVuZ3RoIGFibm9ybWFsLGlnbm9yZSBpdC4KKyAgICAgICAgICAgICAgICBBTE9HVygiYWJub3JtYWwgbmFsbGVuZ3RoLCBpZ25vcmUgdGhpcyBOQUwiKTsKKyAgICAgICAgICAgICAgICBzcmNPZmZzZXQgPSBzaXplOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmFsTGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRzdE9mZnNldCA+IFNJWkVfTUFYIC0gNCB8fAorICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ID4gU0laRV9NQVggLSBuYWxMZW5ndGggfHwKKyAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCArIG5hbExlbmd0aCA+IG1CdWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI3MjA4NjIxIDogJXp1ICV6dSIsIGRzdE9mZnNldCwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI3MjA4NjIxIik7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDE7CisgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKKyAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxMZW5ndGg7CisgICAgICAgICAgICBkc3RPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICB9CisgICAgICAgIENIRUNLX0VRKHNyY09mZnNldCwgc2l6ZSk7CisgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOworCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICBBTWVkaWFGb3JtYXRfY2xlYXIobWV0YSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NCgKKyAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICgobG9uZyBkb3VibGUpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KAorICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sICgobG9uZyBkb3VibGUpc3R0cyAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CisKKyAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoCisgICAgICAgICAgICAgICAgICAgIG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobUlzQVZDKSB7CisgICAgICAgICAgICB1aW50MzJfdCBsYXllcklkID0gRmluZEFWQ0xheWVySWQoCisgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRCwgbGF5ZXJJZCk7CisgICAgICAgIH0gZWxzZSBpZiAobUlzSEVWQykgeworICAgICAgICAgICAgaW50MzJfdCBsYXllcklkID0gcGFyc2VIRVZDTGF5ZXJJZCgKKyAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgICAgIGlmIChsYXllcklkID49IDApIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRCwgbGF5ZXJJZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKKyAgICAgICAgfQorCisgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKKworICAgICAgICAqb3V0ID0gbUJ1ZmZlcjsKKyAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICB9CiB9CiAKLXN0YXR1c190IE1QRUc0U291cmNlOjpmcmFnbWVudGVkUmVhZCgKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworbWVkaWFfc3RhdHVzX3QgTVBFRzRTb3VyY2U6OmZyYWdtZW50ZWRSZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKIAogICAgIEFMT0dWKCJNUEVHNFNvdXJjZTo6ZnJhZ21lbnRlZFJlYWQiKTsKIApAQCAtNTIwNSw2ICs2MDExLDEwIEBACiAgICAgUmVhZE9wdGlvbnM6OlNlZWtNb2RlIG1vZGU7CiAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy0+Z2V0U2Vla1RvKCZzZWVrVGltZVVzLCAmbW9kZSkpIHsKIAorICAgICAgICBzZWVrVGltZVVzICs9ICgobG9uZyBkb3VibGUpbUVsc3RTaGlmdFN0YXJ0VGlja3MgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGU7CisgICAgICAgIEFMT0dWKCJzaGlmdGVkIHNlZWtUaW1lVXMgOiUiIFBSSWQ2NCAiLCBtRWxzdFNoaWZ0U3RhcnRUaWNrczolIiBQUkl1NjQsIHNlZWtUaW1lVXMsCisgICAgICAgICAgICAgIG1FbHN0U2hpZnRTdGFydFRpY2tzKTsKKwogICAgICAgICBpbnQgbnVtU2lkeEVudHJpZXMgPSBtU2VnbWVudHMuc2l6ZSgpOwogICAgICAgICBpZiAobnVtU2lkeEVudHJpZXMgIT0gMCkgewogICAgICAgICAgICAgaW50NjRfdCB0b3RhbFRpbWUgPSAwOwpAQCAtNTIzMiw3ICs2MDQyLDcgQEAKICAgICAgICAgICAgIG1DdXJyZW50U2FtcGxlSW5kZXggPSAwOwogICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFyc2VDaHVuaygmdG90YWxPZmZzZXQpOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUN1cnJlbnRUaW1lID0gdG90YWxUaW1lICogbVRpbWVzY2FsZSAvIDEwMDAwMDBsbDsKICAgICAgICAgfSBlbHNlIHsKQEAgLTUyNDQsNyArNjA1NCw3IEBACiAgICAgICAgICAgICBvZmY2NF90IHRtcCA9IG1DdXJyZW50TW9vZk9mZnNldDsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsoJnRtcCk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQ3VycmVudFRpbWUgPSAwOwogICAgICAgICB9CkBAIC01MjU5LDE2ICs2MDY5LDIwIEBACiAKICAgICBvZmY2NF90IG9mZnNldCA9IDA7CiAgICAgc2l6ZV90IHNpemUgPSAwOwotICAgIHVpbnQzMl90IGN0cyA9IDA7CisgICAgdWludDY0X3QgY3RzID0gMDsKICAgICBib29sIGlzU3luY1NhbXBsZSA9IGZhbHNlOwogICAgIGJvb2wgbmV3QnVmZmVyID0gZmFsc2U7Ci0gICAgaWYgKG1CdWZmZXIgPT0gTlVMTCkgeworICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgbUN1cnJlbnRTYW1wbGVJbmRleCA+PSBtQ3VycmVudFNhbXBsZXMuc2l6ZSgpKSB7CiAgICAgICAgIG5ld0J1ZmZlciA9IHRydWU7CiAKKyAgICAgICAgaWYgKG1CdWZmZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgIH0KICAgICAgICAgaWYgKG1DdXJyZW50U2FtcGxlSW5kZXggPj0gbUN1cnJlbnRTYW1wbGVzLnNpemUoKSkgewogICAgICAgICAgICAgLy8gbW92ZSB0byBuZXh0IGZyYWdtZW50IGlmIHRoZXJlIGlzIG9uZQogICAgICAgICAgICAgaWYgKG1OZXh0TW9vZk9mZnNldCA8PSBtQ3VycmVudE1vb2ZPZmZzZXQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBvZmY2NF90IG5leHRNb29mID0gbU5leHRNb29mT2Zmc2V0OwogICAgICAgICAgICAgbUN1cnJlbnRNb29mT2Zmc2V0ID0gbmV4dE1vb2Y7CkBAIC01Mjc2LDEwICs2MDkwLDEwIEBACiAgICAgICAgICAgICBtQ3VycmVudFNhbXBsZUluZGV4ID0gMDsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHBhcnNlQ2h1bmsoJm5leHRNb29mKTsKICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtQ3VycmVudFNhbXBsZUluZGV4ID49IG1DdXJyZW50U2FtcGxlcy5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtNTI4Nyw1OSArNjEwMSw2NSBAQAogICAgICAgICBvZmZzZXQgPSBzbXBsLT5vZmZzZXQ7CiAgICAgICAgIHNpemUgPSBzbXBsLT5zaXplOwogICAgICAgICBjdHMgPSBtQ3VycmVudFRpbWUgKyBzbXBsLT5jb21wb3NpdGlvbk9mZnNldDsKLSAgICAgICAgbUN1cnJlbnRUaW1lICs9IHNtcGwtPmR1cmF0aW9uOwotICAgICAgICBpc1N5bmNTYW1wbGUgPSAobUN1cnJlbnRTYW1wbGVJbmRleCA9PSAwKTsgLy8gWFhYCisgICAgICAgIC8qIENvbXBvc2l0aW9uIFRpbWUgU3RhbXAgY2Fubm90IGJlIG5lZ2F0aXZlLiBTb21lIGZpbGVzIGhhdmUgdmlkZW8gU2FtcGxlCisgICAgICAgICogVGltZShTVFRTKWRlbHRhIHdpdGggemVybyB2YWx1ZShiLzExNzQwMjQyMCkuICBIZW5jZSBzdWJ0cmFjdCBvbmx5CisgICAgICAgICogbWluKGN0cywgbUVsc3RTaGlmdFN0YXJ0VGlja3MpLCBzbyB0aGF0IGF1ZGlvIHRyYWNrcyBjYW4gYmUgcGxheWVkLgorICAgICAgICAqLworICAgICAgICBjdHMgLT0gc3RkOjptaW4oY3RzLCBtRWxzdFNoaWZ0U3RhcnRUaWNrcyk7CiAKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmbUJ1ZmZlcik7CisgICAgICAgIG1DdXJyZW50VGltZSArPSBzbXBsLT5kdXJhdGlvbjsKKyAgICAgICAgaXNTeW5jU2FtcGxlID0gKG1DdXJyZW50U2FtcGxlSW5kZXggPT0gMCk7CisKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmbUJ1ZmZlcik7CiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgQ0hFQ0sobUJ1ZmZlciA9PSBOVUxMKTsKICAgICAgICAgICAgIEFMT0dWKCJhY3F1aXJlX2J1ZmZlciByZXR1cm5lZCAlZCIsIGVycik7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgICAgICB9CiAgICAgICAgIGlmIChzaXplID4gbUJ1ZmZlci0+c2l6ZSgpKSB7CiAgICAgICAgICAgICBBTE9HRSgiYnVmZmVyIHRvbyBzbWFsbDogJXp1ID4gJXp1Iiwgc2l6ZSwgbUJ1ZmZlci0+c2l6ZSgpKTsKICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0JVRkZFUl9UT09fU01BTEw7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KICAgICB9CiAKICAgICBjb25zdCBTYW1wbGUgKnNtcGwgPSAmbUN1cnJlbnRTYW1wbGVzW21DdXJyZW50U2FtcGxlSW5kZXhdOwotICAgIE1ldGFEYXRhQmFzZSAmYnVmbWV0YSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOwotICAgIGJ1Zm1ldGEuY2xlYXIoKTsKKyAgICBBTWVkaWFGb3JtYXQgKmJ1Zm1ldGEgPSBtQnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXRfY2xlYXIoYnVmbWV0YSk7CiAgICAgaWYgKHNtcGwtPmVuY3J5cHRlZHNpemVzLnNpemUoKSkgewogICAgICAgICAvLyBzdG9yZSBjbGVhci9lbmNyeXB0ZWQgbGVuZ3RocyBpbiBtZXRhZGF0YQotICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleVBsYWluU2l6ZXMsIDAsCisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMsCiAgICAgICAgICAgICAgICAgc21wbC0+Y2xlYXJzaXplcy5hcnJheSgpLCBzbXBsLT5jbGVhcnNpemVzLnNpemUoKSAqIDQpOwotICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAwLAorICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9TSVpFUywKICAgICAgICAgICAgICAgICBzbXBsLT5lbmNyeXB0ZWRzaXplcy5hcnJheSgpLCBzbXBsLT5lbmNyeXB0ZWRzaXplcy5zaXplKCkgKiA0KTsKLSAgICAgICAgYnVmbWV0YS5zZXRJbnQzMihrS2V5Q3J5cHRvRGVmYXVsdElWU2l6ZSwgbURlZmF1bHRJVlNpemUpOwotICAgICAgICBidWZtZXRhLnNldEludDMyKGtLZXlDcnlwdG9Nb2RlLCBtQ3J5cHRvTW9kZSk7Ci0gICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvS2V5LCAwLCBtQ3J5cHRvS2V5LCAxNik7Ci0gICAgICAgIGJ1Zm1ldGEuc2V0SW50MzIoa0tleUVuY3J5cHRlZEJ5dGVCbG9jaywgbURlZmF1bHRFbmNyeXB0ZWRCeXRlQmxvY2spOwotICAgICAgICBidWZtZXRhLnNldEludDMyKGtLZXlTa2lwQnl0ZUJsb2NrLCBtRGVmYXVsdFNraXBCeXRlQmxvY2spOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fREVGQVVMVF9JVl9TSVpFLCBtRGVmYXVsdElWU2l6ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFLCBtQ3J5cHRvTW9kZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLCBtQ3J5cHRvS2V5LCAxNik7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihidWZtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9CWVRFX0JMT0NLLCBtRGVmYXVsdEVuY3J5cHRlZEJ5dGVCbG9jayk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihidWZtZXRhLAorICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1NLSVBfQllURV9CTE9DSywgbURlZmF1bHRTa2lwQnl0ZUJsb2NrKTsKIAotICAgICAgICB1aW50MzJfdCB0eXBlID0gMDsKLSAgICAgICAgY29uc3Qgdm9pZCAqaXYgPSBOVUxMOworICAgICAgICB2b2lkICppdiA9IE5VTEw7CiAgICAgICAgIHNpemVfdCBpdmxlbmd0aCA9IDA7Ci0gICAgICAgIGlmICghbUZvcm1hdC5maW5kRGF0YSgKLSAgICAgICAgICAgICAgICBrS2V5Q3J5cHRvSVYsICZ0eXBlLCAmaXYsICZpdmxlbmd0aCkpIHsKLSAgICAgICAgICAgIGl2ID0gc21wbC0+aXY7CisgICAgICAgIGlmICghQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihtRm9ybWF0LAorICAgICAgICAgICAgICAgICJjcnlwdG8taXYiLCAmaXYsICZpdmxlbmd0aCkpIHsKKyAgICAgICAgICAgIGl2ID0gKHZvaWQgKikgc21wbC0+aXY7CiAgICAgICAgICAgICBpdmxlbmd0aCA9IDE2OyAvLyB1c2UgMTYgb3IgdGhlIGFjdHVhbCBzaXplPwogICAgICAgICB9Ci0gICAgICAgIGJ1Zm1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvSVYsIDAsIGl2LCBpdmxlbmd0aCk7Ci0KKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihidWZtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19JViwgaXYsIGl2bGVuZ3RoKTsKICAgICB9CiAKLSAgICBpZiAoKCFtSXNBVkMgJiYgIW1Jc0hFVkMpfHwgbVdhbnRzTkFMRnJhZ21lbnRzKSB7CisgICAgaWYgKCFtSXNBVkMgJiYgIW1Jc0hFVkMpIHsKICAgICAgICAgaWYgKG5ld0J1ZmZlcikgewogICAgICAgICAgICAgaWYgKCFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBzaXplKSkgewogICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKICAgICAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAogICAgICAgICAgICAgICAgIEFMT0dFKCJmcmFnbWVudGVkUmVhZCBFUlJPUl9NQUxGT1JNRUQgc2l6ZSAlenUiLCBzaXplKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0KQEAgLTUzNTAsMTAzICs2MTcwLDU3IEBACiAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CiAKICAgICAgICAgICAgICAgICBBTE9HRSgiaS9vIGVycm9yIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7CiAgICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgc2l6ZSk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAga0tleVRpbWUsICgoaW50NjRfdCljdHMgKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOwotICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgIGtLZXlEdXJhdGlvbiwgKChpbnQ2NF90KXNtcGwtPmR1cmF0aW9uICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChidWZtZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICgobG9uZyBkb3VibGUpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChidWZtZXRhLAorICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAoKGxvbmcgZG91YmxlKXNtcGwtPmR1cmF0aW9uICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKIAogICAgICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAgICAgICAgICBrS2V5VGFyZ2V0VGltZSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaWYgKG1Jc0FWQykgewogICAgICAgICAgICAgICAgIHVpbnQzMl90IGxheWVySWQgPSBGaW5kQVZDTGF5ZXJJZCgKICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJJZCwgbGF5ZXJJZCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGJ1Zm1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfSUQsIGxheWVySWQpOworICAgICAgICAgICAgfSBlbHNlIGlmIChtSXNIRVZDKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBsYXllcklkID0gcGFyc2VIRVZDTGF5ZXJJZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5yYW5nZV9sZW5ndGgoKSk7CisgICAgICAgICAgICAgICAgaWYgKGxheWVySWQgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRCwgbGF5ZXJJZCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAoaXNTeW5jU2FtcGxlKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgKyttQ3VycmVudFNhbXBsZUluZGV4OwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCFtSXNBVkMgJiYgIW1Jc0hFVkMpIHsKLSAgICAgICAgICAgICpvdXQgPSBtQnVmZmVyOwotICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7CisgICAgICAgICpvdXQgPSBtQnVmZmVyOworICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CiAKLSAgICAgICAgLy8gRWFjaCBOQUwgdW5pdCBpcyBzcGxpdCB1cCBpbnRvIGl0cyBjb25zdGl0dWVudCBmcmFnbWVudHMgYW5kCi0gICAgICAgIC8vIGVhY2ggb25lIG9mIHRoZW0gcmV0dXJuZWQgaW4gaXRzIG93biBidWZmZXIuCi0KLSAgICAgICAgQ0hFQ0sobUJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgPj0gbU5BTExlbmd0aFNpemUpOwotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyYyA9Ci0gICAgICAgICAgICAoY29uc3QgdWludDhfdCAqKW1CdWZmZXItPmRhdGEoKSArIG1CdWZmZXItPnJhbmdlX29mZnNldCgpOwotCi0gICAgICAgIHNpemVfdCBuYWxfc2l6ZSA9IHBhcnNlTkFMU2l6ZShzcmMpOwotICAgICAgICBpZiAobU5BTExlbmd0aFNpemUgPiBTSVpFX01BWCAtIG5hbF9zaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYi8yNDQ0MTU1MywgYi8yNDQ0NTEyMiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gbU5BTExlbmd0aFNpemUgPCBuYWxfc2l6ZSkgewotICAgICAgICAgICAgQUxPR0UoImluY29tcGxldGUgTkFMIHVuaXQuIik7Ci0KLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotCi0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICB9Ci0KLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpjbG9uZSA9IG1CdWZmZXItPmNsb25lKCk7Ci0gICAgICAgIENIRUNLKGNsb25lICE9IE5VTEwpOwotICAgICAgICBjbG9uZS0+c2V0X3JhbmdlKG1CdWZmZXItPnJhbmdlX29mZnNldCgpICsgbU5BTExlbmd0aFNpemUsIG5hbF9zaXplKTsKLQotICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCkgKyBtTkFMTGVuZ3RoU2l6ZSArIG5hbF9zaXplLAotICAgICAgICAgICAgICAgIG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gbU5BTExlbmd0aFNpemUgLSBuYWxfc2l6ZSk7Ci0KLSAgICAgICAgaWYgKG1CdWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgKm91dCA9IGNsb25lOwotCi0gICAgICAgIHJldHVybiBPSzsKICAgICB9IGVsc2UgewogICAgICAgICBBTE9HVigid2hvbGUgTkFMIik7CiAgICAgICAgIC8vIFdob2xlIE5BTCB1bml0cyBhcmUgcmV0dXJuZWQgYnV0IGVhY2ggZnJhZ21lbnQgaXMgcHJlZml4ZWQgYnkKICAgICAgICAgLy8gdGhlIHN0YXJ0IGNvZGUgKDB4MDAgMDAgMDAgMDEpLgogICAgICAgICBzc2l6ZV90IG51bV9ieXRlc19yZWFkID0gMDsKLSAgICAgICAgaW50MzJfdCBkcm0gPSAwOwotICAgICAgICBib29sIHVzZXNEUk0gPSAobUZvcm1hdC5maW5kSW50MzIoa0tleUlzRFJNLCAmZHJtKSAmJiBkcm0gIT0gMCk7CiAgICAgICAgIHZvaWQgKmRhdGEgPSBOVUxMOwogICAgICAgICBib29sIGlzTWFsRm9ybWVkID0gZmFsc2U7Ci0gICAgICAgIGlmICh1c2VzRFJNKSB7Ci0gICAgICAgICAgICBpZiAobUJ1ZmZlciA9PSBOVUxMIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBzaXplKSkgewotICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IG1CdWZmZXItPmRhdGEoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBtYXhfc2l6ZTsKKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwgJm1heF9zaXplKQorICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgKHNpemVfdCltYXhfc2l6ZSwgc2l6ZSkpIHsKKyAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gdHJ1ZTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludDMyX3QgbWF4X3NpemU7Ci0gICAgICAgICAgICBpZiAoIW1Gb3JtYXQuZmluZEludDMyKGtLZXlNYXhJbnB1dFNpemUsICZtYXhfc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCAoc2l6ZV90KW1heF9zaXplLCBzaXplKSkgewotICAgICAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YSA9IG1TcmNCdWZmZXI7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhID0gbVNyY0J1ZmZlcjsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpc01hbEZvcm1lZCB8fCBkYXRhID09IE5VTEwpIHsKQEAgLTU0NTUsNyArNjIyOSw3IEBACiAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgICAgIG51bV9ieXRlc19yZWFkID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOwogCkBAIC01NDY0LDc1ICs2MjM4LDY5IEBACiAgICAgICAgICAgICBtQnVmZmVyID0gTlVMTDsKIAogICAgICAgICAgICAgQUxPR0UoImkvbyBlcnJvciIpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgfQogCi0gICAgICAgIGlmICh1c2VzRFJNKSB7Ci0gICAgICAgICAgICBDSEVDSyhtQnVmZmVyICE9IE5VTEwpOwotICAgICAgICAgICAgbUJ1ZmZlci0+c2V0X3JhbmdlKDAsIHNpemUpOworICAgICAgICB1aW50OF90ICpkc3REYXRhID0gKHVpbnQ4X3QgKiltQnVmZmVyLT5kYXRhKCk7CisgICAgICAgIHNpemVfdCBzcmNPZmZzZXQgPSAwOworICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKIAotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdWludDhfdCAqZHN0RGF0YSA9ICh1aW50OF90ICopbUJ1ZmZlci0+ZGF0YSgpOwotICAgICAgICAgICAgc2l6ZV90IHNyY09mZnNldCA9IDA7Ci0gICAgICAgICAgICBzaXplX3QgZHN0T2Zmc2V0ID0gMDsKLQotICAgICAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNpemUpIHsKLSAgICAgICAgICAgICAgICBpc01hbEZvcm1lZCA9ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgc2l6ZSwgc3JjT2Zmc2V0LCBtTkFMTGVuZ3RoU2l6ZSk7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG5hbExlbmd0aCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKCFpc01hbEZvcm1lZCkgewotICAgICAgICAgICAgICAgICAgICBuYWxMZW5ndGggPSBwYXJzZU5BTFNpemUoJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSk7Ci0gICAgICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBtTkFMTGVuZ3RoU2l6ZTsKLSAgICAgICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbmFsTGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBkc3RPZmZzZXQsIChzaXplX3QpNHUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIGRzdE9mZnNldCArIDQsIG5hbExlbmd0aCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGlzTWFsRm9ybWVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJWaWRlbyBpcyBtYWxmb3JtZWQ7IG5hbExlbmd0aCAlenUiLCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuYWxMZW5ndGggPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZHN0T2Zmc2V0ID4gU0laRV9NQVggLSA0IHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ID4gU0laRV9NQVggLSBuYWxMZW5ndGggfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRzdE9mZnNldCArIDQgKyBuYWxMZW5ndGggPiBtQnVmZmVyLT5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImIvMjYzNjUzNDkgOiAlenUgJXp1IiwgZHN0T2Zmc2V0LCBtQnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI2MzY1MzQ5Iik7Ci0gICAgICAgICAgICAgICAgICAgIG1CdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAwOwotICAgICAgICAgICAgICAgIGRzdERhdGFbZHN0T2Zmc2V0KytdID0gMDsKLSAgICAgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7Ci0gICAgICAgICAgICAgICAgZHN0RGF0YVtkc3RPZmZzZXQrK10gPSAxOwotICAgICAgICAgICAgICAgIG1lbWNweSgmZHN0RGF0YVtkc3RPZmZzZXRdLCAmbVNyY0J1ZmZlcltzcmNPZmZzZXRdLCBuYWxMZW5ndGgpOwotICAgICAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxMZW5ndGg7Ci0gICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICs9IG5hbExlbmd0aDsKKyAgICAgICAgd2hpbGUgKHNyY09mZnNldCA8IHNpemUpIHsKKyAgICAgICAgICAgIGlzTWFsRm9ybWVkID0gIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBzaXplLCBzcmNPZmZzZXQsIG1OQUxMZW5ndGhTaXplKTsKKyAgICAgICAgICAgIHNpemVfdCBuYWxMZW5ndGggPSAwOworICAgICAgICAgICAgaWYgKCFpc01hbEZvcm1lZCkgeworICAgICAgICAgICAgICAgIG5hbExlbmd0aCA9IHBhcnNlTkFMU2l6ZSgmbVNyY0J1ZmZlcltzcmNPZmZzZXRdKTsKKyAgICAgICAgICAgICAgICBzcmNPZmZzZXQgKz0gbU5BTExlbmd0aFNpemU7CisgICAgICAgICAgICAgICAgaXNNYWxGb3JtZWQgPSAhaXNJblJhbmdlKChzaXplX3QpMHUsIHNpemUsIHNyY09mZnNldCwgbmFsTGVuZ3RoKQorICAgICAgICAgICAgICAgICAgICAgICAgfHwgIWlzSW5SYW5nZSgoc2l6ZV90KTB1LCBtQnVmZmVyLT5zaXplKCksIGRzdE9mZnNldCwgKHNpemVfdCk0dSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8ICFpc0luUmFuZ2UoKHNpemVfdCkwdSwgbUJ1ZmZlci0+c2l6ZSgpLCBkc3RPZmZzZXQgKyA0LCBuYWxMZW5ndGgpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQ0hFQ0tfRVEoc3JjT2Zmc2V0LCBzaXplKTsKLSAgICAgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICBtQnVmZmVyLT5zZXRfcmFuZ2UoMCwgZHN0T2Zmc2V0KTsKLSAgICAgICAgfQogCi0gICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KAotICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAoKGludDY0X3QpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKLSAgICAgICAgbUJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoCi0gICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAoKGludDY0X3Qpc21wbC0+ZHVyYXRpb24gKiAxMDAwMDAwKSAvIG1UaW1lc2NhbGUpOworICAgICAgICAgICAgaWYgKGlzTWFsRm9ybWVkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlZpZGVvIGlzIG1hbGZvcm1lZDsgbmFsTGVuZ3RoICV6dSIsIG5hbExlbmd0aCk7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobmFsTGVuZ3RoID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKGRzdE9mZnNldCA+IFNJWkVfTUFYIC0gNCB8fAorICAgICAgICAgICAgICAgICAgICBkc3RPZmZzZXQgKyA0ID4gU0laRV9NQVggLSBuYWxMZW5ndGggfHwKKyAgICAgICAgICAgICAgICAgICAgZHN0T2Zmc2V0ICsgNCArIG5hbExlbmd0aCA+IG1CdWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJiLzI2MzY1MzQ5IDogJXp1ICV6dSIsIGRzdE9mZnNldCwgbUJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjI2MzY1MzQ5Iik7CisgICAgICAgICAgICAgICAgbUJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgIG1CdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDA7CisgICAgICAgICAgICBkc3REYXRhW2RzdE9mZnNldCsrXSA9IDE7CisgICAgICAgICAgICBtZW1jcHkoJmRzdERhdGFbZHN0T2Zmc2V0XSwgJm1TcmNCdWZmZXJbc3JjT2Zmc2V0XSwgbmFsTGVuZ3RoKTsKKyAgICAgICAgICAgIHNyY09mZnNldCArPSBuYWxMZW5ndGg7CisgICAgICAgICAgICBkc3RPZmZzZXQgKz0gbmFsTGVuZ3RoOworICAgICAgICB9CisgICAgICAgIENIRUNLX0VRKHNyY09mZnNldCwgc2l6ZSk7CisgICAgICAgIENIRUNLKG1CdWZmZXIgIT0gTlVMTCk7CisgICAgICAgIG1CdWZmZXItPnNldF9yYW5nZSgwLCBkc3RPZmZzZXQpOworCisgICAgICAgIEFNZWRpYUZvcm1hdCAqYnVmbWV0YSA9IG1CdWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwKKyAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICgobG9uZyBkb3VibGUpY3RzICogMTAwMDAwMCkgLyBtVGltZXNjYWxlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KGJ1Zm1ldGEsCisgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgKChsb25nIGRvdWJsZSlzbXBsLT5kdXJhdGlvbiAqIDEwMDAwMDApIC8gbVRpbWVzY2FsZSk7CiAKICAgICAgICAgaWYgKHRhcmdldFNhbXBsZVRpbWVVcyA+PSAwKSB7Ci0gICAgICAgICAgICBtQnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAga0tleVRhcmdldFRpbWUsIHRhcmdldFNhbXBsZVRpbWVVcyk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSwgdGFyZ2V0U2FtcGxlVGltZVVzKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChpc1N5bmNTYW1wbGUpIHsKLSAgICAgICAgICAgIG1CdWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoYnVmbWV0YSwgQU1FRElBRk9STUFUX0tFWV9JU19TWU5DX0ZSQU1FLCAxKTsKICAgICAgICAgfQogCiAgICAgICAgICsrbUN1cnJlbnRTYW1wbGVJbmRleDsKQEAgLTU1NDAsMTUgKzYzMDgsMTcgQEAKICAgICAgICAgKm91dCA9IG1CdWZmZXI7CiAgICAgICAgIG1CdWZmZXIgPSBOVUxMOwogCi0gICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICB9CisKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBNUEVHNEV4dHJhY3Rvcjo6VHJhY2sgKk1QRUc0RXh0cmFjdG9yOjpmaW5kVHJhY2tCeU1pbWVQcmVmaXgoCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWVQcmVmaXgpIHsKICAgICBmb3IgKFRyYWNrICp0cmFjayA9IG1GaXJzdFRyYWNrOyB0cmFjayAhPSBOVUxMOyB0cmFjayA9IHRyYWNrLT5uZXh0KSB7CiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgIGlmICh0cmFjay0+bWV0YS5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKQorICAgICAgICBpZiAoQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFjay0+bWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmbWltZSkKICAgICAgICAgICAgICAgICAmJiAhc3RybmNhc2VjbXAobWltZSwgbWltZVByZWZpeCwgc3RybGVuKG1pbWVQcmVmaXgpKSkgewogICAgICAgICAgICAgcmV0dXJuIHRyYWNrOwogICAgICAgICB9CkBAIC01NTU3LDcgKzYzMjcsNyBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1zdGF0aWMgYm9vbCBMZWdhY3lTbmlmZk1QRUc0KERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CitzdGF0aWMgYm9vbCBMZWdhY3lTbmlmZk1QRUc0KERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKICAgICB1aW50OF90IGhlYWRlcls4XTsKIAogICAgIHNzaXplX3QgbiA9IHNvdXJjZS0+cmVhZEF0KDQsIGhlYWRlciwgc2l6ZW9mKGhlYWRlcikpOwpAQCAtNTU4OCw2ICs2MzU4LDcgQEAKICAgICAgICAgRk9VUkNDKCJhdmMxIiksCiAgICAgICAgIEZPVVJDQygiaHZjMSIpLAogICAgICAgICBGT1VSQ0MoImhldjEiKSwKKyAgICAgICAgRk9VUkNDKCJhdjAxIiksCiAgICAgICAgIEZPVVJDQygiM2dwNCIpLAogICAgICAgICBGT1VSQ0MoIm1wNDEiKSwKICAgICAgICAgRk9VUkNDKCJtcDQyIiksCkBAIC01NTk4LDYgKzYzNjksNyBAQAogICAgICAgICAvLyBKdXN0IGdpdmUgdGhlc2UgZmlsZSB0eXBlcyBhIGNoYW5jZS4KICAgICAgICAgRk9VUkNDKCJxdCAgIiksICAvLyBBcHBsZSdzIFF1aWNrVGltZQogICAgICAgICBGT1VSQ0MoIk1TTlYiKSwgIC8vIFNvbnkncyBQU1AKKyAgICAgICAgRk9VUkNDKCJ3bWYgIiksCiAKICAgICAgICAgRk9VUkNDKCIzZzJhIiksICAvLyAzR1BQMgogICAgICAgICBGT1VSQ0MoIjNnMmIiKSwKQEAgLTU2MjMsNyArNjM5NSw3IEBACiAvLyBBbHNvIHRyeSB0byBpZGVudGlmeSB3aGVyZSB0aGlzIGZpbGUncyBtZXRhZGF0YSBlbmRzCiAvLyAoZW5kIG9mIHRoZSAnbW9vdicgYXRvbSkgYW5kIHJlcG9ydCBpdCB0byB0aGUgY2FsbGVyIGFzIHBhcnQgb2YKIC8vIHRoZSBtZXRhZGF0YS4KLXN0YXRpYyBib29sIEJldHRlclNuaWZmTVBFRzQoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKK3N0YXRpYyBib29sIEJldHRlclNuaWZmTVBFRzQoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgewogICAgIC8vIFdlIHNjYW4gdXAgdG8gMTI4IGJ5dGVzIHRvIGlkZW50aWZ5IHRoaXMgZmlsZSBhcyBhbiBNUDQuCiAgICAgc3RhdGljIGNvbnN0IG9mZjY0X3Qga01heFNjYW5PZmZzZXQgPSAxMjhsbDsKIApAQCAtNTY2OSw3ICs2NDQxLDggQEAKIAogICAgICAgICBjaGFyIGNodW5rc3RyaW5nWzVdOwogICAgICAgICBNYWtlRm91ckNDU3RyaW5nKGNodW5rVHlwZSwgY2h1bmtzdHJpbmcpOwotICAgICAgICBBTE9HVigic2F3IGNodW5rIHR5cGUgJXMsIHNpemUgJSIgUFJJdTY0ICIgQCAlbGxkIiwgY2h1bmtzdHJpbmcsIGNodW5rU2l6ZSwgKGxvbmcgbG9uZylvZmZzZXQpOworICAgICAgICBBTE9HVigic2F3IGNodW5rIHR5cGUgJXMsIHNpemUgJSIgUFJJdTY0ICIgQCAlbGxkIiwKKyAgICAgICAgICAgICAgICBjaHVua3N0cmluZywgY2h1bmtTaXplLCAobG9uZyBsb25nKW9mZnNldCk7CiAgICAgICAgIHN3aXRjaCAoY2h1bmtUeXBlKSB7CiAgICAgICAgICAgICBjYXNlIEZPVVJDQygiZnR5cCIpOgogICAgICAgICAgICAgewpAQCAtNTczMCwxOCArNjUwMywxOSBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3IqIENyZWF0ZUV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlLCB2b2lkICopIHsKLSAgICByZXR1cm4gbmV3IE1QRUc0RXh0cmFjdG9yKHNvdXJjZSk7CitzdGF0aWMgQ01lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoQ0RhdGFTb3VyY2UgKnNvdXJjZSwgdm9pZCAqKSB7CisgICAgcmV0dXJuIHdyYXAobmV3IE1QRUc0RXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKHNvdXJjZSkpKTsKIH0KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBTbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiosCi0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpGcmVlTWV0YUZ1bmMgKikgewotICAgIGlmIChCZXR0ZXJTbmlmZk1QRUc0KHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKK3N0YXRpYyBDcmVhdG9yRnVuYyBTbmlmZigKKyAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiosCisgICAgICAgIEZyZWVNZXRhRnVuYyAqKSB7CisgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIoc291cmNlKTsKKyAgICBpZiAoQmV0dGVyU25pZmZNUEVHNCgmaGVscGVyLCBjb25maWRlbmNlKSkgewogICAgICAgICByZXR1cm4gQ3JlYXRlRXh0cmFjdG9yOwogICAgIH0KIAotICAgIGlmIChMZWdhY3lTbmlmZk1QRUc0KHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKKyAgICBpZiAoTGVnYWN5U25pZmZNUEVHNCgmaGVscGVyLCBjb25maWRlbmNlKSkgewogICAgICAgICBBTE9HVygiSWRlbnRpZmllZCBzdXBwb3J0ZWQgbXBlZzQgdGhyb3VnaCBMZWdhY3lTbmlmZk1QRUc0LiIpOwogICAgICAgICByZXR1cm4gQ3JlYXRlRXh0cmFjdG9yOwogICAgIH0KQEAgLTU3NDksMTYgKzY1MjMsMzEgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAiM2cyIiwKKyAgICAiM2dhIiwKKyAgICAiM2dwIiwKKyAgICAiM2dwcCIsCisgICAgIjNncHAyIiwKKyAgICAibTRhIiwKKyAgICAibTRyIiwKKyAgICAibTR2IiwKKyAgICAibW92IiwKKyAgICAibXA0IiwKKyAgICAicXQiLAorICAgIE5VTEwKK307CisKIGV4dGVybiAiQyIgewogLy8gVGhpcyBpcyB0aGUgb25seSBzeW1ib2wgdGhhdCBuZWVkcyB0byBiZSBleHBvcnRlZAogX19hdHRyaWJ1dGVfXyAoKHZpc2liaWxpdHkgKCJkZWZhdWx0IikpKQotTWVkaWFFeHRyYWN0b3I6OkV4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CitFeHRyYWN0b3JEZWYgR0VURVhUUkFDVE9SREVGKCkgewogICAgIHJldHVybiB7Ci0gICAgICAgIE1lZGlhRXh0cmFjdG9yOjpFWFRSQUNUT1JERUZfVkVSU0lPTiwKKyAgICAgICAgRVhUUkFDVE9SREVGX1ZFUlNJT04sCiAgICAgICAgIFVVSUQoIjI3NTc1YzY3LTQ0MTctNGM1NC04ZDNkLThlNjI2OTg1YTE2NCIpLAotICAgICAgICAxLCAvLyB2ZXJzaW9uCisgICAgICAgIDIsIC8vIHZlcnNpb24KICAgICAgICAgIk1QNCBFeHRyYWN0b3IiLAotICAgICAgICBTbmlmZgorICAgICAgICB7IC52MyA9IHtTbmlmZiwgZXh0ZW5zaW9uc30gfSwKICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvTVBFRzRFeHRyYWN0b3IuaAppbmRleCAzZWEwOTYzLi5mY2RkYmI4IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9NUEVHNEV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L01QRUc0RXh0cmFjdG9yLmgKQEAgLTIwLDkgKzIwLDkgQEAKIAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgpAQCAtMzEsOCArMzEsOCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBzdHJ1Y3QgQU1lc3NhZ2U7Ci1jbGFzcyBEYXRhU291cmNlQmFzZTsKLXN0cnVjdCBDYWNoZWRSYW5nZWREYXRhU291cmNlOworc3RydWN0IENEYXRhU291cmNlOworY2xhc3MgRGF0YVNvdXJjZUhlbHBlcjsKIGNsYXNzIFNhbXBsZVRhYmxlOwogY2xhc3MgU3RyaW5nODsKIG5hbWVzcGFjZSBoZWlmIHsKQEAgLTUzLDE1ICs1MywxNSBAQAogICAgIHVpbnQzMl90IGRlZmF1bHRfc2FtcGxlX2ZsYWdzOwogfTsKIAotY2xhc3MgTVBFRzRFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgeworY2xhc3MgTVBFRzRFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgewogcHVibGljOgotICAgIGV4cGxpY2l0IE1QRUc0RXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUgPSBOVUxMKTsKKyAgICBleHBsaWNpdCBNUEVHNEV4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUgPSBOVUxMKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVBFRzRFeHRyYWN0b3IiOyB9CiAKQEAgLTc3LDE3ICs3Nyw1MyBAQAogICAgIH07CiAgICAgc3RydWN0IFRyYWNrIHsKICAgICAgICAgVHJhY2sgKm5leHQ7Ci0gICAgICAgIE1ldGFEYXRhQmFzZSBtZXRhOworICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGE7CiAgICAgICAgIHVpbnQzMl90IHRpbWVzY2FsZTsKICAgICAgICAgc3A8U2FtcGxlVGFibGU+IHNhbXBsZVRhYmxlOwogICAgICAgICBib29sIGluY2x1ZGVzX2V4cGVuc2l2ZV9tZXRhZGF0YTsKICAgICAgICAgYm9vbCBza2lwVHJhY2s7CiAgICAgICAgIGJvb2wgaGFzX2Vsc3Q7CisgICAgICAgIC8qIHNpZ25lZCBpbnQsIElTTyBTcGVjIGFsbG93cyBtZWRpYV90aW1lID0gLTEgZm9yIG90aGVyIHVzZSBjYXNlcy4KKyAgICAgICAgICogYnV0IHdlIGRvbid0IHN1cHBvcnQgZW1wdHkgZWRpdHMgZm9yIG5vdy4KKyAgICAgICAgICovCiAgICAgICAgIGludDY0X3QgZWxzdF9tZWRpYV90aW1lOwogICAgICAgICB1aW50NjRfdCBlbHN0X3NlZ21lbnRfZHVyYXRpb247CisgICAgICAgIC8vIHVuc2lnbmVkIGludCwgc2hpZnQgc3RhcnQgb2Zmc2V0IG9ubHkgd2hlbiBtZWRpYV90aW1lID4gMC4KKyAgICAgICAgdWludDY0X3QgZWxzdFNoaWZ0U3RhcnRUaWNrczsKICAgICAgICAgYm9vbCBzdWJzYW1wbGVfZW5jcnlwdGlvbjsKKworICAgICAgICB1aW50OF90ICptVHgzZ0J1ZmZlcjsKKyAgICAgICAgc2l6ZV90IG1UeDNnU2l6ZSwgbVR4M2dGaWxsZWQ7CisKKworICAgICAgICBUcmFjaygpIHsKKyAgICAgICAgICAgIG5leHQgPSBOVUxMOworICAgICAgICAgICAgbWV0YSA9IE5VTEw7CisgICAgICAgICAgICB0aW1lc2NhbGUgPSAwOworICAgICAgICAgICAgaW5jbHVkZXNfZXhwZW5zaXZlX21ldGFkYXRhID0gZmFsc2U7CisgICAgICAgICAgICBza2lwVHJhY2sgPSBmYWxzZTsKKyAgICAgICAgICAgIGhhc19lbHN0ID0gZmFsc2U7CisgICAgICAgICAgICBlbHN0X21lZGlhX3RpbWUgPSAwOworICAgICAgICAgICAgZWxzdFNoaWZ0U3RhcnRUaWNrcyA9IDA7CisgICAgICAgICAgICBzdWJzYW1wbGVfZW5jcnlwdGlvbiA9IGZhbHNlOworICAgICAgICAgICAgbVR4M2dCdWZmZXIgPSBOVUxMOworICAgICAgICAgICAgbVR4M2dTaXplID0gbVR4M2dGaWxsZWQgPSAwOworICAgICAgICB9CisgICAgICAgIH5UcmFjaygpIHsKKyAgICAgICAgICAgIGlmIChtZXRhKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtZXRhKTsKKyAgICAgICAgICAgICAgICBtZXRhID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZyZWUgKG1UeDNnQnVmZmVyKTsKKyAgICAgICAgICAgIG1UeDNnQnVmZmVyID0gTlVMTDsKKyAgICAgICAgfQorCisgICAgICBwcml2YXRlOgorICAgICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUcmFjayk7CiAgICAgfTsKIAorICAgIHN0YXRpYyBjb25zdCBpbnQga1R4M2dHcm93dGggPSAxNiAqIDEwMjQ7CisKICAgICBWZWN0b3I8U2lkeEVudHJ5PiBtU2lkeEVudHJpZXM7CiAgICAgb2ZmNjRfdCBtTW9vZk9mZnNldDsKICAgICBib29sIG1Nb29mRm91bmQ7CkBAIC05Nyw4ICsxMzMsNyBAQAogCiAgICAgVmVjdG9yPFRyZXg+IG1UcmV4OwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1EYXRhU291cmNlOwotICAgIENhY2hlZFJhbmdlZERhdGFTb3VyY2UgKm1DYWNoZWRTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKICAgICB1aW50MzJfdCBtSGVhZGVyVGltZXNjYWxlOwogICAgIGJvb2wgbUlzUVQ7CkBAIC0xMDgsNyArMTQzLDcgQEAKIAogICAgIFRyYWNrICptRmlyc3RUcmFjaywgKm1MYXN0VHJhY2s7CiAKLSAgICBNZXRhRGF0YUJhc2UgbUZpbGVNZXRhRGF0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1GaWxlTWV0YURhdGE7CiAKICAgICBWZWN0b3I8dWludDMyX3Q+IG1QYXRoOwogICAgIFN0cmluZzggbUxhc3RDb21tZW50TWVhbjsKQEAgLTEzOSwxNyArMTc0LDE4IEBACiAKICAgICBUcmFjayAqZmluZFRyYWNrQnlNaW1lUHJlZml4KGNvbnN0IGNoYXIgKm1pbWVQcmVmaXgpOwogCi0gICAgc3RhdHVzX3QgcGFyc2VBQzNTYW1wbGVFbnRyeShvZmY2NF90IG9mZnNldCk7Ci0gICAgc3RhdHVzX3QgcGFyc2VBQzNTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCwgdWludDE2X3Qgc2FtcGxlUmF0ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VDaGFubmVsQ291bnRTYW1wbGVSYXRlKAorICAgICAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LCB1aW50MTZfdCAqY2hhbm5lbENvdW50LCB1aW50MTZfdCAqc2FtcGxlUmF0ZSk7CisgICAgc3RhdHVzX3QgcGFyc2VBQzNTcGVjaWZpY0JveChvZmY2NF90IG9mZnNldCk7CisgICAgc3RhdHVzX3QgcGFyc2VFQUMzU3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQpOworICAgIHN0YXR1c190IHBhcnNlQUM0U3BlY2lmaWNCb3gob2ZmNjRfdCBvZmZzZXQpOworICAgIHN0YXR1c190IHBhcnNlQUxBQ1NhbXBsZUVudHJ5KG9mZjY0X3QgKm9mZnNldCk7CisgICAgdm9pZCBhZGp1c3RSYXdEZWZhdWx0RnJhbWVTaXplKCk7CiAKICAgICBNUEVHNEV4dHJhY3Rvcihjb25zdCBNUEVHNEV4dHJhY3RvciAmKTsKICAgICBNUEVHNEV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE1QRUc0RXh0cmFjdG9yICYpOwogfTsKIAotYm9vbCBTbmlmZk1QRUc0KAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLCBTdHJpbmc4ICptaW1lVHlwZSwgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgIHNwPEFNZXNzYWdlPiAqKTsKLQogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBNUEVHNF9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmNwcAppbmRleCA5M2VlN2M2Li44NWZiZjk3IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5jcHAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuY3BwCkBAIC0yMiw3ICsyMiw2IEBACiAKICNpbmNsdWRlIDxhcnBhL2luZXQuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogCkBAIC0xMTEsOCArMTEwLDE1IEBACiAgICAgICAgICAgICBpZiAoKGVyciA9IGdldFNhbXBsZVNpemVEaXJlY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RDaHVua1NhbXBsZUluZGV4ICsgaSwgJnNhbXBsZVNpemUpKSAhPSBPSykgewogICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRTYW1wbGVTaXplRGlyZWN0IHJldHVybiBlcnJvciIpOwotICAgICAgICAgICAgICAgIG1DdXJyZW50Q2h1bmtTYW1wbGVTaXplcy5jbGVhcigpOwotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgLy8gc3RzYyBzYW1wbGUgY291bnQgaXMgbm90IHN5bmMgd2l0aCBzdHN6IHNhbXBsZSBjb3VudAorICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfT1VUX09GX1JBTkdFKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJzdHNjIHNhbXBsZXMoJWQpIG5vdCBzeW5jIHdpdGggc3RzeiBzYW1wbGVzKCVkKSIsIG1TYW1wbGVzUGVyQ2h1bmssIGkpOworICAgICAgICAgICAgICAgICAgICBtU2FtcGxlc1BlckNodW5rID0gaTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSBlbHNleworICAgICAgICAgICAgICAgICAgICBtQ3VycmVudENodW5rU2FtcGxlU2l6ZXMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIG1DdXJyZW50Q2h1bmtTYW1wbGVTaXplcy5wdXNoKHNhbXBsZVNpemUpOwpAQCAtMzAxLDcgKzMwNyw3IEBACiB9CiAKIHN0YXR1c190IFNhbXBsZUl0ZXJhdG9yOjpmaW5kU2FtcGxlVGltZUFuZER1cmF0aW9uKAotICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwgdWludDMyX3QgKnRpbWUsIHVpbnQzMl90ICpkdXJhdGlvbikgeworICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwgdWludDY0X3QgKnRpbWUsIHVpbnQ2NF90ICpkdXJhdGlvbikgewogICAgIGlmIChzYW1wbGVJbmRleCA+PSBtVGFibGUtPm1OdW1TYW1wbGVTaXplcykgewogICAgICAgICByZXR1cm4gRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KQEAgLTMxNCw4ICszMjAsOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1UaW1lVG9TYW1wbGVJbmRleCA9PSBtVGFibGUtPm1UaW1lVG9TYW1wbGVDb3VudCB8fAotICAgICAgICAgICAgKG1UVFNEdXJhdGlvbiAhPSAwICYmIG1UVFNDb3VudCA+IFVJTlQzMl9NQVggLyBtVFRTRHVyYXRpb24pIHx8Ci0gICAgICAgICAgICBtVFRTU2FtcGxlVGltZSA+IFVJTlQzMl9NQVggLSAobVRUU0NvdW50ICogbVRUU0R1cmF0aW9uKSkgeworICAgICAgICAgICAgKG1UVFNEdXJhdGlvbiAhPSAwICYmIG1UVFNDb3VudCA+IFVJTlQ2NF9NQVggLyBtVFRTRHVyYXRpb24pIHx8CisgICAgICAgICAgICBtVFRTU2FtcGxlVGltZSA+IFVJTlQ2NF9NQVggLSAobVRUU0NvdW50ICogbVRUU0R1cmF0aW9uKSkgewogICAgICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKICAgICAgICAgfQogCkBAIC0zMjgsMTkgKzMzNCwyNyBAQAogICAgICAgICArK21UaW1lVG9TYW1wbGVJbmRleDsKICAgICB9CiAKLSAgICAqdGltZSA9IG1UVFNTYW1wbGVUaW1lICsgbVRUU0R1cmF0aW9uICogKHNhbXBsZUluZGV4IC0gbVRUU1NhbXBsZUluZGV4KTsKKyAgICAvLyBiZWxvdyBpcyBlcXVpdmFsZW50IHRvOgorICAgIC8vICp0aW1lID0gbVRUU1NhbXBsZVRpbWUgKyBtVFRTRHVyYXRpb24gKiAoc2FtcGxlSW5kZXggLSBtVFRTU2FtcGxlSW5kZXgpOworICAgIHVpbnQ2NF90IHRtcDsKKyAgICBpZiAoX19idWlsdGluX3N1Yl9vdmVyZmxvdyhzYW1wbGVJbmRleCwgbVRUU1NhbXBsZUluZGV4LCAmdG1wKSB8fAorICAgICAgICAgICAgX19idWlsdGluX211bF9vdmVyZmxvdyhtVFRTRHVyYXRpb24sIHRtcCwgJnRtcCkgfHwKKyAgICAgICAgICAgIF9fYnVpbHRpbl9hZGRfb3ZlcmZsb3cobVRUU1NhbXBsZVRpbWUsIHRtcCwgJnRtcCkpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKKyAgICB9CisgICAgKnRpbWUgPSB0bXA7CiAKICAgICBpbnQzMl90IG9mZnNldCA9IG1UYWJsZS0+Z2V0Q29tcG9zaXRpb25UaW1lT2Zmc2V0KHNhbXBsZUluZGV4KTsKICAgICBpZiAoKG9mZnNldCA8IDAgJiYgKnRpbWUgPCAob2Zmc2V0ID09IElOVDMyX01JTiA/Ci0gICAgICAgICAgICBJTlQzMl9NQVggOiB1aW50MzJfdCgtb2Zmc2V0KSkpIHx8Ci0gICAgICAgICAgICAob2Zmc2V0ID4gMCAmJiAqdGltZSA+IFVJTlQzMl9NQVggLSBvZmZzZXQpKSB7Ci0gICAgICAgIEFMT0dFKCIldSArICVkIHdvdWxkIG92ZXJmbG93IiwgKnRpbWUsIG9mZnNldCk7CisgICAgICAgICAgICBJTlQ2NF9NQVggOiB1aW50NjRfdCgtb2Zmc2V0KSkpIHx8CisgICAgICAgICAgICAob2Zmc2V0ID4gMCAmJiAqdGltZSA+IFVJTlQ2NF9NQVggLSBvZmZzZXQpKSB7CisgICAgICAgIEFMT0dFKCIlbGx1ICsgJWQgd291bGQgb3ZlcmZsb3ciLCAodW5zaWduZWQgbG9uZyBsb25nKSAqdGltZSwgb2Zmc2V0KTsKICAgICAgICAgcmV0dXJuIEVSUk9SX09VVF9PRl9SQU5HRTsKICAgICB9CiAgICAgaWYgKG9mZnNldCA+IDApIHsKICAgICAgICAgKnRpbWUgKz0gb2Zmc2V0OwogICAgIH0gZWxzZSB7Ci0gICAgICAgICp0aW1lIC09IChvZmZzZXQgPT0gSU5UMzJfTUlOID8gSU5UMzJfTUFYIDogKC1vZmZzZXQpKTsKKyAgICAgICAgKnRpbWUgLT0gKG9mZnNldCA9PSBJTlQzMl9NSU4gPyBJTlQ2NF9NQVggOiAoLW9mZnNldCkpOwogICAgIH0KIAogICAgICpkdXJhdGlvbiA9IG1UVFNEdXJhdGlvbjsKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmggYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVJdGVyYXRvci5oCmluZGV4IDZlNGY2MGUuLjVhMGVhNzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZUl0ZXJhdG9yLmgKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlSXRlcmF0b3IuaApAQCAtMzMsOCArMzMsOCBAQAogICAgIHVpbnQzMl90IGdldERlc2NJbmRleCgpIGNvbnN0IHsgcmV0dXJuIG1DaHVua0Rlc2M7IH0KICAgICBvZmY2NF90IGdldFNhbXBsZU9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50U2FtcGxlT2Zmc2V0OyB9CiAgICAgc2l6ZV90IGdldFNhbXBsZVNpemUoKSBjb25zdCB7IHJldHVybiBtQ3VycmVudFNhbXBsZVNpemU7IH0KLSAgICB1aW50MzJfdCBnZXRTYW1wbGVUaW1lKCkgY29uc3QgeyByZXR1cm4gbUN1cnJlbnRTYW1wbGVUaW1lOyB9Ci0gICAgdWludDMyX3QgZ2V0U2FtcGxlRHVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtQ3VycmVudFNhbXBsZUR1cmF0aW9uOyB9CisgICAgdWludDY0X3QgZ2V0U2FtcGxlVGltZSgpIGNvbnN0IHsgcmV0dXJuIG1DdXJyZW50U2FtcGxlVGltZTsgfQorICAgIHVpbnQ2NF90IGdldFNhbXBsZUR1cmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbUN1cnJlbnRTYW1wbGVEdXJhdGlvbjsgfQogCiAgICAgdWludDMyX3QgZ2V0TGFzdFNhbXBsZUluZGV4SW5DaHVuaygpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1DdXJyZW50U2FtcGxlSW5kZXggKyBtU2FtcGxlc1BlckNodW5rIC0KQEAgLTYzLDIwICs2MywyMCBAQAogCiAgICAgdWludDMyX3QgbVRpbWVUb1NhbXBsZUluZGV4OwogICAgIHVpbnQzMl90IG1UVFNTYW1wbGVJbmRleDsKLSAgICB1aW50MzJfdCBtVFRTU2FtcGxlVGltZTsKKyAgICB1aW50NjRfdCBtVFRTU2FtcGxlVGltZTsKICAgICB1aW50MzJfdCBtVFRTQ291bnQ7Ci0gICAgdWludDMyX3QgbVRUU0R1cmF0aW9uOworICAgIHVpbnQ2NF90IG1UVFNEdXJhdGlvbjsKIAogICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlSW5kZXg7CiAgICAgb2ZmNjRfdCBtQ3VycmVudFNhbXBsZU9mZnNldDsKICAgICBzaXplX3QgbUN1cnJlbnRTYW1wbGVTaXplOwotICAgIHVpbnQzMl90IG1DdXJyZW50U2FtcGxlVGltZTsKLSAgICB1aW50MzJfdCBtQ3VycmVudFNhbXBsZUR1cmF0aW9uOworICAgIHVpbnQ2NF90IG1DdXJyZW50U2FtcGxlVGltZTsKKyAgICB1aW50NjRfdCBtQ3VycmVudFNhbXBsZUR1cmF0aW9uOwogCiAgICAgdm9pZCByZXNldCgpOwogICAgIHN0YXR1c190IGZpbmRDaHVua1JhbmdlKHVpbnQzMl90IHNhbXBsZUluZGV4KTsKICAgICBzdGF0dXNfdCBnZXRDaHVua09mZnNldCh1aW50MzJfdCBjaHVuaywgb2ZmNjRfdCAqb2Zmc2V0KTsKLSAgICBzdGF0dXNfdCBmaW5kU2FtcGxlVGltZUFuZER1cmF0aW9uKHVpbnQzMl90IHNhbXBsZUluZGV4LCB1aW50MzJfdCAqdGltZSwgdWludDMyX3QgKmR1cmF0aW9uKTsKKyAgICBzdGF0dXNfdCBmaW5kU2FtcGxlVGltZUFuZER1cmF0aW9uKHVpbnQzMl90IHNhbXBsZUluZGV4LCB1aW50NjRfdCAqdGltZSwgdWludDY0X3QgKmR1cmF0aW9uKTsKIAogICAgIFNhbXBsZUl0ZXJhdG9yKGNvbnN0IFNhbXBsZUl0ZXJhdG9yICYpOwogICAgIFNhbXBsZUl0ZXJhdG9yICZvcGVyYXRvcj0oY29uc3QgU2FtcGxlSXRlcmF0b3IgJik7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5jcHAgYi9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5jcHAKaW5kZXggMjVmOGUyYS4uOWRkZGYyYyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmNwcApAQCAtMjUsNyArMjUsNyBAQAogCiAjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogCkBAIC0xMTQsNyArMTE0LDcgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotU2FtcGxlVGFibGU6OlNhbXBsZVRhYmxlKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitTYW1wbGVUYWJsZTo6U2FtcGxlVGFibGUoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1DaHVua09mZnNldE9mZnNldCgtMSksCiAgICAgICBtQ2h1bmtPZmZzZXRUeXBlKDApLApAQCAtNjE0LDcgKzYxNCw3IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi11aW50MzJfdCBhYnNfZGlmZmVyZW5jZSh1aW50MzJfdCB0aW1lMSwgdWludDMyX3QgdGltZTIpIHsKK3VpbnQzMl90IGFic19kaWZmZXJlbmNlKHVpbnQ2NF90IHRpbWUxLCB1aW50NjRfdCB0aW1lMikgewogICAgIHJldHVybiB0aW1lMSA+IHRpbWUyID8gdGltZTEgLSB0aW1lMiA6IHRpbWUyIC0gdGltZTE7CiB9CiAKQEAgLTY1NSw2ICs2NTUsNyBAQAogICAgIH0KIAogICAgIG1TYW1wbGVUaW1lRW50cmllcyA9IG5ldyAoc3RkOjpub3Rocm93KSBTYW1wbGVUaW1lRW50cnlbbU51bVNhbXBsZVNpemVzXTsKKyAgICBtZW1zZXQobVNhbXBsZVRpbWVFbnRyaWVzLCAwLCBzaXplb2YoU2FtcGxlVGltZUVudHJ5KSAqIG1OdW1TYW1wbGVTaXplcyk7CiAgICAgaWYgKCFtU2FtcGxlVGltZUVudHJpZXMpIHsKICAgICAgICAgQUxPR0UoIkNhbm5vdCBhbGxvY2F0ZSBzYW1wbGUgZW50cnkgdGFibGUgd2l0aCAlbGx1IGVudHJpZXMuIiwKICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW1OdW1TYW1wbGVTaXplcyk7CkBAIC02NjIsNyArNjYzLDcgQEAKICAgICB9CiAKICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCA9IDA7Ci0gICAgdWludDMyX3Qgc2FtcGxlVGltZSA9IDA7CisgICAgdWludDY0X3Qgc2FtcGxlVGltZSA9IDA7CiAKICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbVRpbWVUb1NhbXBsZUNvdW50OyArK2kpIHsKICAgICAgICAgdWludDMyX3QgbiA9IG1UaW1lVG9TYW1wbGVbMiAqIGldOwpAQCAtNjg0LDEzICs2ODUsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIChjb21wVGltZURlbHRhID09IElOVDMyX01JTiA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElOVDMyX01BWCA6IHVpbnQzMl90KC1jb21wVGltZURlbHRhKSkpCiAgICAgICAgICAgICAgICAgICAgICAgICB8fCAoY29tcFRpbWVEZWx0YSA+IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSA+IFVJTlQzMl9NQVggLSBjb21wVGltZURlbHRhKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXUgKyAlZCB3b3VsZCBvdmVyZmxvdywgY2xhbXBpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUsIGNvbXBUaW1lRGVsdGEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID4gVUlOVDY0X01BWCAtIGNvbXBUaW1lRGVsdGEpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlbGx1ICsgJWQgd291bGQgb3ZlcmZsb3csIGNsYW1waW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBzYW1wbGVUaW1lLCBjb21wVGltZURlbHRhKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBUaW1lRGVsdGEgPCAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID0gMDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgPSBVSU5UMzJfTUFYOworICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSA9IFVJTlQ2NF9NQVg7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgY29tcFRpbWVEZWx0YSA9IDA7CiAgICAgICAgICAgICAgICAgfQpAQCAtNzAxLDEwICs3MDIsMTAgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgKytzYW1wbGVJbmRleDsKLSAgICAgICAgICAgIGlmIChzYW1wbGVUaW1lID4gVUlOVDMyX01BWCAtIGRlbHRhKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiV1ICsgJXUgd291bGQgb3ZlcmZsb3csIGNsYW1waW5nIiwKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSwgZGVsdGEpOwotICAgICAgICAgICAgICAgIHNhbXBsZVRpbWUgPSBVSU5UMzJfTUFYOworICAgICAgICAgICAgaWYgKHNhbXBsZVRpbWUgPiBVSU5UNjRfTUFYIC0gZGVsdGEpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJWxsdSArICV1IHdvdWxkIG92ZXJmbG93LCBjbGFtcGluZyIsCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIHNhbXBsZVRpbWUsIGRlbHRhKTsKKyAgICAgICAgICAgICAgICBzYW1wbGVUaW1lID0gVUlOVDY0X01BWDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgc2FtcGxlVGltZSArPSBkZWx0YTsKICAgICAgICAgICAgIH0KQEAgLTg3MCwxOSArODcxLDE5IEBACiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZV90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CisgICAgICAgICAgICB1aW50NjRfdCBzYW1wbGVfdGltZSA9IG1TYW1wbGVJdGVyYXRvci0+Z2V0U2FtcGxlVGltZSgpOwogCiAgICAgICAgICAgICBlcnIgPSBtU2FtcGxlSXRlcmF0b3ItPnNlZWtUbyhtU3luY1NhbXBsZXNbbGVmdF0pOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCB1cHBlcl90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CisgICAgICAgICAgICB1aW50NjRfdCB1cHBlcl90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CiAKICAgICAgICAgICAgIGVyciA9IG1TYW1wbGVJdGVyYXRvci0+c2Vla1RvKG1TeW5jU2FtcGxlc1tsZWZ0IC0gMV0pOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCBsb3dlcl90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CisgICAgICAgICAgICB1aW50NjRfdCBsb3dlcl90aW1lID0gbVNhbXBsZUl0ZXJhdG9yLT5nZXRTYW1wbGVUaW1lKCk7CiAKICAgICAgICAgICAgIC8vIHVzZSBhYnNfZGlmZmVyZW5jZSBmb3Igc2FmZXR5CiAgICAgICAgICAgICBpZiAoYWJzX2RpZmZlcmVuY2UodXBwZXJfdGltZSwgc2FtcGxlX3RpbWUpID4KQEAgLTk1NSw5ICs5NTYsOSBAQAogICAgICAgICB1aW50MzJfdCBzYW1wbGVJbmRleCwKICAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LAogICAgICAgICBzaXplX3QgKnNpemUsCi0gICAgICAgIHVpbnQzMl90ICpjb21wb3NpdGlvblRpbWUsCisgICAgICAgIHVpbnQ2NF90ICpjb21wb3NpdGlvblRpbWUsCiAgICAgICAgIGJvb2wgKmlzU3luY1NhbXBsZSwKLSAgICAgICAgdWludDMyX3QgKnNhbXBsZUR1cmF0aW9uKSB7CisgICAgICAgIHVpbnQ2NF90ICpzYW1wbGVEdXJhdGlvbikgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICBzdGF0dXNfdCBlcnI7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5oIGIvbWVkaWEvZXh0cmFjdG9ycy9tcDQvU2FtcGxlVGFibGUuaAppbmRleCBkZDY4ODYwLi4wNzZmNGMzIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wNC9TYW1wbGVUYWJsZS5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXA0L1NhbXBsZVRhYmxlLmgKQEAgLTIxLDE4ICsyMSwxOSBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN0ZGludC5oPgogCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBEYXRhU291cmNlSGVscGVyOwogc3RydWN0IFNhbXBsZUl0ZXJhdG9yOwogCiBjbGFzcyBTYW1wbGVUYWJsZSA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKLSAgICBleHBsaWNpdCBTYW1wbGVUYWJsZShEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBTYW1wbGVUYWJsZShEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3Q7CiAKQEAgLTY1LDkgKzY2LDkgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZUluZGV4LAogICAgICAgICAgICAgb2ZmNjRfdCAqb2Zmc2V0LAogICAgICAgICAgICAgc2l6ZV90ICpzaXplLAotICAgICAgICAgICAgdWludDMyX3QgKmNvbXBvc2l0aW9uVGltZSwKKyAgICAgICAgICAgIHVpbnQ2NF90ICpjb21wb3NpdGlvblRpbWUsCiAgICAgICAgICAgICBib29sICppc1N5bmNTYW1wbGUgPSBOVUxMLAotICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZUR1cmF0aW9uID0gTlVMTCk7CisgICAgICAgICAgICB1aW50NjRfdCAqc2FtcGxlRHVyYXRpb24gPSBOVUxMKTsKIAogICAgIC8vIGNhbGwgb25seSBhZnRlciBnZXRNZXRhRGF0YUZvclNhbXBsZSBoYXMgYmVlbiBjYWxsZWQgc3VjY2Vzc2Z1bGx5LgogICAgIHVpbnQzMl90IGdldExhc3RTYW1wbGVJbmRleEluQ2h1bmsoKTsKQEAgLTg4LDYgKzg5LDEwIEBACiAKICAgICBzdGF0dXNfdCBmaW5kVGh1bWJuYWlsU2FtcGxlKHVpbnQzMl90ICpzYW1wbGVfaW5kZXgpOwogCisgICAgdm9pZCBzZXRQcmVkaWN0U2FtcGxlU2l6ZSh1aW50MzJfdCBzYW1wbGVTaXplKSB7CisgICAgICAgIG1EZWZhdWx0U2FtcGxlU2l6ZSA9IHNhbXBsZVNpemU7CisgICAgfQorCiBwcm90ZWN0ZWQ6CiAgICAgflNhbXBsZVRhYmxlKCk7CiAKQEAgLTEwMiw3ICsxMDcsNyBAQAogICAgIC8vIExpbWl0IHRoZSB0b3RhbCBzaXplIG9mIGFsbCBpbnRlcm5hbCB0YWJsZXMgdG8gMjAwTWlCLgogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heFRvdGFsU2l6ZSA9IDIwMCAqICgxIDw8IDIwKTsKIAotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBNdXRleCBtTG9jazsKIAogICAgIG9mZjY0X3QgbUNodW5rT2Zmc2V0T2Zmc2V0OwpAQCAtMTIzLDcgKzEyOCw3IEBACiAKICAgICBzdHJ1Y3QgU2FtcGxlVGltZUVudHJ5IHsKICAgICAgICAgdWludDMyX3QgbVNhbXBsZUluZGV4OwotICAgICAgICB1aW50MzJfdCBtQ29tcG9zaXRpb25UaW1lOworICAgICAgICB1aW50NjRfdCBtQ29tcG9zaXRpb25UaW1lOwogICAgIH07CiAgICAgU2FtcGxlVGltZUVudHJ5ICptU2FtcGxlVGltZUVudHJpZXM7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvQW5kcm9pZC5icAppbmRleCAzOGM4NmViLi4xNGJkNjQ0IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsNCBAQAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAKICAgICBzcmNzOiBbCiAgICAgICAgICJFeHRyYWN0b3JCdW5kbGUuY3BwIiwKQEAgLTE1LDIzICsxNSwyNyBAQAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXNAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzLm5hdGl2ZUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAogICAgICAgICAibGliY3J5cHRvIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKICAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl93aXRob3V0X2ltZW1vcnkiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJzdXBwb3J0IiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21wZWcyZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAogICAgIF0sCiAKICAgICBuYW1lOiAibGlibXBlZzJleHRyYWN0b3IiLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9FeHRyYWN0b3JCdW5kbGUuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9FeHRyYWN0b3JCdW5kbGUuY3BwCmluZGV4IDhhMGZhMDMuLmE3Yzc1NmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvRXh0cmFjdG9yQnVuZGxlLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL0V4dHJhY3RvckJ1bmRsZS5jcHAKQEAgLTE4LDM5ICsxOCw1NiBAQAogI2RlZmluZSBMT0dfVEFHICJNUEVHMkV4dHJhY3RvckJ1bmRsZSIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlICJNUEVHMlBTRXh0cmFjdG9yLmgiCiAjaW5jbHVkZSAiTVBFRzJUU0V4dHJhY3Rvci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK3N0cnVjdCBDRGF0YVNvdXJjZTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICJtMnAiLAorICAgIm0ydHMiLAorICAgIm10cyIsCisgICAidHMiLAorICAgTlVMTAorfTsKKwogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgVVVJRCgiM2QxZGNmZWItZTQwYS00MzZkLWE1NzQtYzI0MzhhNTU1ZTVmIiksCiAgICAgICAgIDEsCiAgICAgICAgICJNUEVHMi1QUy9UUyBFeHRyYWN0b3IiLAotICAgICAgICBbXSgKLSAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAotICAgICAgICAgICAgICAgIHZvaWQgKiosCi0gICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSAtPiBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgewotICAgICAgICAgICAgaWYgKFNuaWZmTVBFRzJUUyhzb3VyY2UsIGNvbmZpZGVuY2UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFtdKAotICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKikgLT4gTWVkaWFFeHRyYWN0b3IqIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNUEVHMlRTRXh0cmFjdG9yKHNvdXJjZSk7fTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoU25pZmZNUEVHMlBTKHNvdXJjZSwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgeworICAgICAgICAgICAgLnYzID0geworICAgICAgICAgICAgICAgIFtdKAorICAgICAgICAgICAgICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqKiwKKyAgICAgICAgICAgICAgICAgICAgRnJlZU1ldGFGdW5jICopIC0+IENyZWF0b3JGdW5jIHsKKyAgICAgICAgICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIoc291cmNlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFNuaWZmTVBFRzJUUygmaGVscGVyLCBjb25maWRlbmNlKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFtdKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICopIC0+IE1lZGlhRXh0cmFjdG9yKiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBNUEVHMlBTRXh0cmFjdG9yKHNvdXJjZSk7fTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBDTWVkaWFFeHRyYWN0b3IqIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChuZXcgTVBFRzJUU0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7fTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTbmlmZk1QRUcyUFMoJmhlbHBlciwgY29uZmlkZW5jZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBbXSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0RhdGFTb3VyY2UgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKSAtPiBDTWVkaWFFeHRyYWN0b3IqIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gd3JhcChuZXcgTVBFRzJQU0V4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7fTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgIGV4dGVuc2lvbnMKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9CisgICAgICAgIH0sCiAgICAgfTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5jcHAKaW5kZXggNjk4MGI4Mi4uMDAyYTg1NSAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlBTRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuY3BwCkBAIC0yMyw4ICsyMyw2IEBACiAjaW5jbHVkZSAibXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmgiCiAjaW5jbHVkZSAibXBlZzJ0cy9FU1F1ZXVlLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgpAQCAtMzQsMjIgKzMyLDIzIEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgTVBFRzJQU0V4dHJhY3Rvcjo6VHJhY2sgOiBwdWJsaWMgTWVkaWFUcmFjaywgcHVibGljIFJlZkJhc2Ugeworc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogICAgIFRyYWNrKE1QRUcyUFNFeHRyYWN0b3IgKmV4dHJhY3RvciwKICAgICAgICAgICB1bnNpZ25lZCBzdHJlYW1faWQsIHVuc2lnbmVkIHN0cmVhbV90eXBlKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0YXJ0KCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdG9wKCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgflRyYWNrKCk7CkBAIC03MiwyOSArNzEsMjkgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUcmFjayk7CiB9OwogCi1zdHJ1Y3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrIDogcHVibGljIE1lZGlhVHJhY2sgewotICAgIFdyYXBwZWRUcmFjayhNUEVHMlBTRXh0cmFjdG9yICpleHRyYWN0b3IsIGNvbnN0IHNwPFRyYWNrPiAmdHJhY2spOworc3RydWN0IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjayA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKKyAgICBXcmFwcGVkVHJhY2soTVBFRzJQU0V4dHJhY3RvciAqZXh0cmFjdG9yLCBUcmFjayAqdHJhY2spOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+V3JhcHBlZFRyYWNrKCk7CiAKIHByaXZhdGU6CiAgICAgTVBFRzJQU0V4dHJhY3RvciAqbUV4dHJhY3RvcjsKLSAgICBzcDxNUEVHMlBTRXh0cmFjdG9yOjpUcmFjaz4gbVRyYWNrOworICAgIE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrICptVHJhY2s7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhXcmFwcGVkVHJhY2spOwogfTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotTVBFRzJQU0V4dHJhY3Rvcjo6TVBFRzJQU0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorTVBFRzJQU0V4dHJhY3Rvcjo6TVBFRzJQU0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbU9mZnNldCgwKSwKICAgICAgIG1GaW5hbFJlc3VsdChPSyksCkBAIC0xMDgsMjUgKzEwNywzMyBAQAogICAgIH0KIAogICAgIC8vIFJlbW92ZSBhbGwgdHJhY2tzIHRoYXQgd2VyZSB1bmFibGUgdG8gZGV0ZXJtaW5lIHRoZWlyIGZvcm1hdC4KLSAgICBNZXRhRGF0YUJhc2UgbWV0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiAgICAgZm9yIChzaXplX3QgaSA9IG1UcmFja3Muc2l6ZSgpOyBpID4gMDspIHsKICAgICAgICAgaS0tOwotICAgICAgICBpZiAobVRyYWNrcy52YWx1ZUF0KGkpLT5nZXRGb3JtYXQobWV0YSkgIT0gT0spIHsKKyAgICAgICAgVHJhY2sgKnRyYWNrID0gbVRyYWNrcy52YWx1ZUF0KGkpOworICAgICAgICBpZiAodHJhY2stPmdldEZvcm1hdChtZXRhKSAhPSBBTUVESUFfT0spIHsKICAgICAgICAgICAgIG1UcmFja3MucmVtb3ZlSXRlbXNBdChpKTsKKyAgICAgICAgICAgIGRlbGV0ZSB0cmFjazsKICAgICAgICAgfQogICAgIH0KKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1ldGEpOwogCiAgICAgbVNjYW5uaW5nID0gZmFsc2U7CiB9CiAKIE1QRUcyUFNFeHRyYWN0b3I6On5NUEVHMlBTRXh0cmFjdG9yKCkgeworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKKyAgICBmb3IgKHNpemVfdCBpID0gbVRyYWNrcy5zaXplKCk7IGkgPiAwOykgeworICAgICAgICBpLS07CisgICAgICAgIGRlbGV0ZSBtVHJhY2tzLnZhbHVlQXQoaSk7CisgICAgfQogfQogCiBzaXplX3QgTVBFRzJQU0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CiAgICAgcmV0dXJuIG1UcmFja3Muc2l6ZSgpOwogfQogCi1NZWRpYVRyYWNrICpNUEVHMlBTRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXIgKk1QRUcyUFNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChpbmRleCA+PSBtVHJhY2tzLnNpemUoKSkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CkBAIC0xMzQsMjAgKzE0MSwyMCBAQAogICAgIHJldHVybiBuZXcgV3JhcHBlZFRyYWNrKHRoaXMsIG1UcmFja3MudmFsdWVBdChpbmRleCkpOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEsCiAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgLyogZmxhZ3MgKi8pIHsKICAgICBpZiAoaW5kZXggPj0gbVRyYWNrcy5zaXplKCkpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICByZXR1cm4gbVRyYWNrcy52YWx1ZUF0KGluZGV4KS0+Z2V0Rm9ybWF0KG1ldGEpOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICBtZXRhLnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJQUyk7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyUFMpOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHVpbnQzMl90IE1QRUcyUFNFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewpAQCAtNjM1LDQyICs2NDIsNTUgQEAKICAgICBtUXVldWUgPSBOVUxMOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6c3RhcnQoTWV0YURhdGFCYXNlICopIHsKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpzdGFydCgpIHsKICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCi0gICAgcmV0dXJuIG1Tb3VyY2UtPnN0YXJ0KE5VTEwpOyAvLyBBbm90aGVyUGFja2V0U291cmNlOjpzdGFydCBkb2Vzbid0IHVzZSBpdHMgYXJndW1lbnQKKyAgICAvLyBpbml0aWFsaXplIHdpdGggb25lIHNtYWxsIGJ1ZmZlciwgYnV0IGFsbG93IGdyb3d0aAorICAgIG1CdWZmZXJHcm91cC0+aW5pdCgxIC8qIG9uZSBidWZmZXIgKi8sIDI1NiAvKiBidWZmZXIgc2l6ZSAqLywgNjQgLyogbWF4IG51bWJlciBvZiBidWZmZXJzICovKTsKKworICAgIGlmIChtU291cmNlLT5zdGFydChOVUxMKSA9PSBPSykgeyAvLyBBbm90aGVyUGFja2V0U291cmNlOjpzdGFydCBkb2Vzbid0IHVzZSBpdHMgYXJndW1lbnQKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpzdG9wKCkgewogICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKLSAgICByZXR1cm4gbVNvdXJjZS0+c3RvcCgpOworICAgIGlmIChtU291cmNlLT5zdG9wKCkgPT0gT0spIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKKyAgICB9CisgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgewordm9pZCBjb3B5QU1lc3NhZ2VUb0FNZWRpYUZvcm1hdChBTWVkaWFGb3JtYXQgKmZvcm1hdCwgc3A8QU1lc3NhZ2U+IG1zZyk7CisKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIHNwPE1ldGFEYXRhPiBzb3VyY2VNZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci0gICAgbWV0YSA9ICpzb3VyY2VNZXRhOwotICAgIHJldHVybiBPSzsKKyAgICBzcDxBTWVzc2FnZT4gbXNnOworICAgIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShzb3VyY2VNZXRhLCAmbXNnKTsKKyAgICBjb3B5QU1lc3NhZ2VUb0FNZWRpYUZvcm1hdChtZXRhLCBtc2cpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OlRyYWNrOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6cmVhZCgKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CiAgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOwogICAgIH0KIAogICAgIHN0YXR1c190IGZpbmFsUmVzdWx0OwogICAgIHdoaWxlICghbVNvdXJjZS0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKICAgICAgICAgaWYgKGZpbmFsUmVzdWx0ICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICAgICAgfQogCiAgICAgICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPmZlZWRNb3JlKCk7CkBAIC02ODAsNyArNzAwLDUwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gbVNvdXJjZS0+cmVhZChidWZmZXIsIG9wdGlvbnMpOworICAgIE1lZGlhQnVmZmVyQmFzZSAqbWJ1ZjsKKyAgICBtU291cmNlLT5yZWFkKCZtYnVmLCAoTWVkaWFUcmFjazo6UmVhZE9wdGlvbnMqKSBvcHRpb25zKTsKKyAgICBzaXplX3QgbGVuZ3RoID0gbWJ1Zi0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKm91dGJ1ZjsKKyAgICBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZvdXRidWYsIGZhbHNlLCBsZW5ndGgpOworICAgIG1lbWNweShvdXRidWYtPmRhdGEoKSwgbWJ1Zi0+ZGF0YSgpLCBsZW5ndGgpOworICAgIG91dGJ1Zi0+c2V0X3JhbmdlKDAsIGxlbmd0aCk7CisgICAgKmJ1ZmZlciA9IG91dGJ1ZjsKKyAgICBNZXRhRGF0YUJhc2UgJmluTWV0YSA9IG1idWYtPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdCAqb3V0TWV0YSA9IG91dGJ1Zi0+bWV0YV9kYXRhKCk7CisgICAgaW50NjRfdCB2YWw2NDsKKyAgICBpZiAoaW5NZXRhLmZpbmRJbnQ2NChrS2V5VGltZSwgJnZhbDY0KSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB2YWw2NCk7CisgICAgfQorICAgIGludDMyX3QgdmFsMzI7CisgICAgaWYgKGluTWV0YS5maW5kSW50MzIoa0tleUlzU3luY0ZyYW1lLCAmdmFsMzIpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsIHZhbDMyKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kSW50MzIoa0tleUNyeXB0b01vZGUsICZ2YWwzMikpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX01PREUsIHZhbDMyKTsKKyAgICB9CisgICAgdWludDMyX3QgYnVmVHlwZTsKKyAgICBjb25zdCB2b2lkICpidWZEYXRhOworICAgIHNpemVfdCBidWZTaXplOworICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleUNyeXB0b0lWLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5Q3J5cHRvS2V5LCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0tFWSwgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleVBsYWluU2l6ZXMsICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMsIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMsIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlTRUksICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9TRUksIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8sICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fSU5GTywgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIG1idWYtPnJlbGVhc2UoKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiBzdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpUcmFjazo6YXBwZW5kUEVTRGF0YSgKQEAgLTcyNiw3ICs3ODksNyBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpXcmFwcGVkVHJhY2soCi0gICAgICAgIE1QRUcyUFNFeHRyYWN0b3IgKmV4dHJhY3RvciwgY29uc3Qgc3A8VHJhY2s+ICZ0cmFjaykKKyAgICAgICAgTVBFRzJQU0V4dHJhY3RvciAqZXh0cmFjdG9yLCBUcmFjayAqdHJhY2spCiAgICAgOiBtRXh0cmFjdG9yKGV4dHJhY3RvciksCiAgICAgICBtVHJhY2sodHJhY2spIHsKIH0KQEAgLTczNCwyNyArNzk3LDMwIEBACiBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6On5XcmFwcGVkVHJhY2soKSB7CiB9CiAKLXN0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6c3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMpIHsKLSAgICByZXR1cm4gbVRyYWNrLT5zdGFydChwYXJhbXMpOworbWVkaWFfc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpzdGFydCgpIHsKKyAgICBkZWxldGUgbVRyYWNrLT5tQnVmZmVyR3JvdXA7CisgICAgbVRyYWNrLT5tQnVmZmVyR3JvdXAgPSBtQnVmZmVyR3JvdXA7CisgICAgbUJ1ZmZlckdyb3VwID0gbnVsbHB0cjsKKyAgICByZXR1cm4gbVRyYWNrLT5zdGFydCgpOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OnN0b3AoKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OnN0b3AoKSB7CiAgICAgcmV0dXJuIG1UcmFjay0+c3RvcCgpOwogfQogCi1zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK21lZGlhX3N0YXR1c190IE1QRUcyUFNFeHRyYWN0b3I6OldyYXBwZWRUcmFjazo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIHJldHVybiBtVHJhY2stPmdldEZvcm1hdChtZXRhKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJQU0V4dHJhY3Rvcjo6V3JhcHBlZFRyYWNrOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlBTRXh0cmFjdG9yOjpXcmFwcGVkVHJhY2s6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgIHJldHVybiBtVHJhY2stPnJlYWQoYnVmZmVyLCBvcHRpb25zKTsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAogYm9vbCBTbmlmZk1QRUcyUFMoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKSB7CisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpIHsKICAgICB1aW50OF90IGhlYWRlcls1XTsKICAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyUFNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5oCmluZGV4IDhiOWRhZDkuLmU1ZDU5MWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJQU0V4dHJhY3Rvci5oCkBAIC0xOSw3ICsxOSw4IEBACiAjZGVmaW5lIE1QRUcyX1BTX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkhlbHBlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgpAQCAtMzEsMTQgKzMyLDE0IEBACiBzdHJ1Y3QgVHJhY2s7CiBjbGFzcyBTdHJpbmc4OwogCi1zdHJ1Y3QgTVBFRzJQU0V4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7Ci0gICAgZXhwbGljaXQgTVBFRzJQU0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKK3N0cnVjdCBNUEVHMlBTRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyIHsKKyAgICBleHBsaWNpdCBNUEVHMlBTRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSk7CiAKICAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpOwotICAgIHZpcnR1YWwgTWVkaWFUcmFjayAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRyYWNrTWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2tIZWxwZXIgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpOwogCiAgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OwogICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiTVBFRzJQU0V4dHJhY3RvciI7IH0KQEAgLTUxLDEyICs1MiwxMiBAQAogICAgIHN0cnVjdCBXcmFwcGVkVHJhY2s7CiAKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKIAogICAgIG9mZjY0X3QgbU9mZnNldDsKICAgICBzdGF0dXNfdCBtRmluYWxSZXN1bHQ7CiAgICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKLSAgICBLZXllZFZlY3Rvcjx1bnNpZ25lZCwgc3A8VHJhY2s+ID4gbVRyYWNrczsKKyAgICBLZXllZFZlY3Rvcjx1bnNpZ25lZCwgVHJhY2sqID4gbVRyYWNrczsKICAgICBib29sIG1TY2FubmluZzsKIAogICAgIGJvb2wgbVByb2dyYW1TdHJlYW1NYXBWYWxpZDsKQEAgLTcyLDcgKzczLDcgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNUEVHMlBTRXh0cmFjdG9yKTsKIH07CiAKLWJvb2wgU25pZmZNUEVHMlBTKERhdGFTb3VyY2VCYXNlICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKK2Jvb2wgU25pZmZNUEVHMlBTKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UpOwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9tcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmNwcAppbmRleCAyNjBjODhlLi41MGNlNjU3IDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5jcHAKQEAgLTI2LDcgKzI2LDYgQEAKIAogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSVN0cmVhbVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgpAQCAtMzUsNiArMzQsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogI2luY2x1ZGUgIm1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIgpAQCAtNTEsMTkgKzUxLDE5IEBACiBzdGF0aWMgY29uc3QgaW50IGtNYXhEdXJhdGlvblJlYWRTaXplID0gMjUwMDAwTEw7CiBzdGF0aWMgY29uc3QgaW50IGtNYXhEdXJhdGlvblJldHJ5ID0gNjsKIAotc3RydWN0IE1QRUcyVFNTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitzdHJ1Y3QgTVBFRzJUU1NvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrSGVscGVyIHsKICAgICBNUEVHMlRTU291cmNlKAogICAgICAgICAgICAgTVBFRzJUU0V4dHJhY3RvciAqZXh0cmFjdG9yLAogICAgICAgICAgICAgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwsCiAgICAgICAgICAgICBib29sIGRvZXNTZWVrKTsKICAgICB2aXJ0dWFsIH5NUEVHMlRTU291cmNlKCk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KE1ldGFEYXRhQmFzZSAqcGFyYW1zID0gTlVMTCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoTWV0YURhdGFCYXNlICYpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldEZvcm1hdChBTWVkaWFGb3JtYXQgKik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKIHByaXZhdGU6CiAgICAgTVBFRzJUU0V4dHJhY3RvciAqbUV4dHJhY3RvcjsKQEAgLTg4LDU2ICs4OCwxNzQgQEAKIE1QRUcyVFNTb3VyY2U6On5NUEVHMlRTU291cmNlKCkgewogfQogCi1zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKikgewotICAgIHJldHVybiBtSW1wbC0+c3RhcnQoTlVMTCk7IC8vIEFub3RoZXJQYWNrZXRTb3VyY2U6OnN0YXJ0KCkgZG9lc24ndCB1c2UgaXRzIGFyZ3VtZW50CittZWRpYV9zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpzdGFydCgpIHsKKyAgICAvLyBpbml0aWFsaXplIHdpdGggb25lIHNtYWxsIGJ1ZmZlciwgYnV0IGFsbG93IGdyb3d0aAorICAgIG1CdWZmZXJHcm91cC0+aW5pdCgxIC8qIG9uZSBidWZmZXIgKi8sIDI1NiAvKiBidWZmZXIgc2l6ZSAqLywgNjQgLyogbWF4IG51bWJlciBvZiBidWZmZXJzICovKTsKKworICAgIGlmICghbUltcGwtPnN0YXJ0KE5VTEwpKSB7IC8vIEFub3RoZXJQYWNrZXRTb3VyY2U6OnN0YXJ0KCkgZG9lc24ndCB1c2UgaXRzIGFyZ3VtZW50CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6c3RvcCgpIHsKLSAgICByZXR1cm4gbUltcGwtPnN0b3AoKTsKK21lZGlhX3N0YXR1c190IE1QRUcyVFNTb3VyY2U6OnN0b3AoKSB7CisgICAgaWYgKCFtSW1wbC0+c3RvcCgpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgewordm9pZCBjb3B5QU1lc3NhZ2VUb0FNZWRpYUZvcm1hdChBTWVkaWFGb3JtYXQgKmZvcm1hdCwgc3A8QU1lc3NhZ2U+IG1zZykgeworICAgIHNpemVfdCBudW1FbnRyaWVzID0gbXNnLT5jb3VudEVudHJpZXMoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUVudHJpZXM7IGkrKykgeworICAgICAgICBBTWVzc2FnZTo6VHlwZSB0eXBlOworICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gbXNnLT5nZXRFbnRyeU5hbWVBdChpLCAmdHlwZSk7CisgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBpZCA9IG1zZy0+Z2V0RW50cnlBdChpKTsKKworICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50MzI6CisgICAgICAgICAgICAgICAgaW50MzJfdCB2YWwzMjsKKyAgICAgICAgICAgICAgICBpZiAoaWQuZmluZCgmdmFsMzIpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihmb3JtYXQsIG5hbWUsIHZhbDMyKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUludDY0OgorICAgICAgICAgICAgICAgIGludDY0X3QgdmFsNjQ7CisgICAgICAgICAgICAgICAgaWYgKGlkLmZpbmQoJnZhbDY0KSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQoZm9ybWF0LCBuYW1lLCB2YWw2NCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVGbG9hdDoKKyAgICAgICAgICAgICAgICBmbG9hdCB2YWxmbG9hdDsKKyAgICAgICAgICAgICAgICBpZiAoaWQuZmluZCgmdmFsZmxvYXQpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRGbG9hdChmb3JtYXQsIG5hbWUsIHZhbGZsb2F0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZURvdWJsZToKKyAgICAgICAgICAgICAgICBkb3VibGUgdmFsZG91YmxlOworICAgICAgICAgICAgICAgIGlmIChpZC5maW5kKCZ2YWxkb3VibGUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXREb3VibGUoZm9ybWF0LCBuYW1lLCB2YWxkb3VibGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlU3RyaW5nOgorICAgICAgICAgICAgICAgIGlmIChBU3RyaW5nIHM7IGlkLmZpbmQoJnMpKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoZm9ybWF0LCBuYW1lLCBzLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlQnVmZmVyOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICBpZiAoaWQuZmluZCgmYnVmZmVyKSkgeworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKGZvcm1hdCwgbmFtZSwgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEFMT0dXKCJpZ25vcmluZyB1bnN1cHBvcnRlZCB0eXBlICVkICclcyciLCB0eXBlLCBuYW1lKTsKKyAgICAgICAgfQorICAgIH0KK30KKworbWVkaWFfc3RhdHVzX3QgTVBFRzJUU1NvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIHNwPE1ldGFEYXRhPiBpbXBsTWV0YSA9IG1JbXBsLT5nZXRGb3JtYXQoKTsKLSAgICBtZXRhID0gKmltcGxNZXRhOwotICAgIHJldHVybiBPSzsKKyAgICBzcDxBTWVzc2FnZT4gbXNnOworICAgIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShpbXBsTWV0YSwgJm1zZyk7CisgICAgY29weUFNZXNzYWdlVG9BTWVkaWFGb3JtYXQobWV0YSwgbXNnKTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCi1zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlRTU291cmNlOjpyZWFkKAorICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMpIHsKICAgICAqb3V0ID0gTlVMTDsKIAogICAgIGludDY0X3Qgc2Vla1RpbWVVczsKICAgICBSZWFkT3B0aW9uczo6U2Vla01vZGUgc2Vla01vZGU7CiAgICAgaWYgKG1Eb2VzU2VlayAmJiBvcHRpb25zICYmIG9wdGlvbnMtPmdldFNlZWtUbygmc2Vla1RpbWVVcywgJnNlZWtNb2RlKSkgewogICAgICAgICAvLyBzZWVrIGlzIG5lZWRlZAotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5zZWVrKHNlZWtUaW1lVXMsIHNlZWtNb2RlKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gbUV4dHJhY3Rvci0+c2VlayhzZWVrVGltZVVzLCAoUmVhZE9wdGlvbnM6OlNlZWtNb2RlKXNlZWtNb2RlKTsKKyAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAobUV4dHJhY3Rvci0+ZmVlZFVudGlsQnVmZmVyQXZhaWxhYmxlKG1JbXBsKSAhPSBPSykgewotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0KIAotICAgIHJldHVybiBtSW1wbC0+cmVhZChvdXQsIG9wdGlvbnMpOworICAgIE1lZGlhQnVmZmVyQmFzZSAqbWJ1ZjsKKyAgICBtSW1wbC0+cmVhZCgmbWJ1ZiwgKE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zKikgb3B0aW9ucyk7CisgICAgc2l6ZV90IGxlbmd0aCA9IG1idWYtPnJhbmdlX2xlbmd0aCgpOworICAgIE1lZGlhQnVmZmVySGVscGVyICpvdXRidWY7CisgICAgbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmb3V0YnVmLCBmYWxzZSwgbGVuZ3RoKTsKKyAgICBtZW1jcHkob3V0YnVmLT5kYXRhKCksIG1idWYtPmRhdGEoKSwgbGVuZ3RoKTsKKyAgICBvdXRidWYtPnNldF9yYW5nZSgwLCBsZW5ndGgpOworICAgICpvdXQgPSBvdXRidWY7CisgICAgTWV0YURhdGFCYXNlICZpbk1ldGEgPSBtYnVmLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXQgKm91dE1ldGEgPSBvdXRidWYtPm1ldGFfZGF0YSgpOworICAgIEFNZWRpYUZvcm1hdF9jbGVhcihvdXRNZXRhKTsKKyAgICBpbnQ2NF90IHZhbDY0OworICAgIGlmIChpbk1ldGEuZmluZEludDY0KGtLZXlUaW1lLCAmdmFsNjQpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHZhbDY0KTsKKyAgICB9CisgICAgaW50MzJfdCB2YWwzMjsKKyAgICBpZiAoaW5NZXRhLmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZ2YWwzMikpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgdmFsMzIpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgJnZhbDMyKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSwgdmFsMzIpOworICAgIH0KKyAgICB1aW50MzJfdCBidWZUeXBlOworICAgIGNvbnN0IHZvaWQgKmJ1ZkRhdGE7CisgICAgc2l6ZV90IGJ1ZlNpemU7CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5Q3J5cHRvSVYsICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYsIGJ1ZkRhdGEsIGJ1ZlNpemUpOworICAgIH0KKyAgICBpZiAoaW5NZXRhLmZpbmREYXRhKGtLZXlDcnlwdG9LZXksICZidWZUeXBlLCAmYnVmRGF0YSwgJmJ1ZlNpemUpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIob3V0TWV0YSwgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgaWYgKGluTWV0YS5maW5kRGF0YShrS2V5UGxhaW5TaXplcywgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19QTEFJTl9TSVpFUywgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleUVuY3J5cHRlZFNpemVzLCAmYnVmVHlwZSwgJmJ1ZkRhdGEsICZidWZTaXplKSkgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG91dE1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9TSVpFUywgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleVNFSSwgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NFSSwgYnVmRGF0YSwgYnVmU2l6ZSk7CisgICAgfQorICAgIGlmIChpbk1ldGEuZmluZERhdGEoa0tleUF1ZGlvUHJlc2VudGF0aW9uSW5mbywgJmJ1ZlR5cGUsICZidWZEYXRhLCAmYnVmU2l6ZSkpIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihvdXRNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9JTkZPLCBidWZEYXRhLCBidWZTaXplKTsKKyAgICB9CisgICAgbWJ1Zi0+cmVsZWFzZSgpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLU1QRUcyVFNFeHRyYWN0b3I6Ok1QRUcyVFNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK01QRUcyVFNFeHRyYWN0b3I6Ok1QRUcyVFNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKQogICAgIDogbURhdGFTb3VyY2Uoc291cmNlKSwKICAgICAgIG1QYXJzZXIobmV3IEFUU1BhcnNlciksCiAgICAgICBtTGFzdFN5bmNFdmVudCgwKSwKICAgICAgIG1PZmZzZXQoMCkgeworICAgIGNoYXIgaGVhZGVyOworICAgIGlmIChzb3VyY2UtPnJlYWRBdCgwLCAmaGVhZGVyLCAxKSA9PSAxICYmIGhlYWRlciA9PSAweDQ3KSB7CisgICAgICAgIG1IZWFkZXJTa2lwID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICBtSGVhZGVyU2tpcCA9IDQ7CisgICAgfQogICAgIGluaXQoKTsKIH0KIAorTVBFRzJUU0V4dHJhY3Rvcjo6fk1QRUcyVFNFeHRyYWN0b3IoKSB7CisgICAgZGVsZXRlIG1EYXRhU291cmNlOworfQorCiBzaXplX3QgTVBFRzJUU0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CiAgICAgcmV0dXJuIG1Tb3VyY2VJbXBscy5zaXplKCk7CiB9CiAKLU1lZGlhVHJhY2sgKk1QRUcyVFNFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgeworTWVkaWFUcmFja0hlbHBlciAqTVBFRzJUU0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKGluZGV4ID49IG1Tb3VyY2VJbXBscy5zaXplKCkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTQ4LDIyICsyNjYsMjMgQEAKICAgICAgICAgICAgIChtU2Vla1N5bmNQb2ludHMgPT0gJm1TeW5jUG9pbnRzLmVkaXRJdGVtQXQoaW5kZXgpKSk7CiB9CiAKLXN0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCAvKiBmbGFncyAqLykgewogICAgIHNwPE1ldGFEYXRhPiBpbXBsTWV0YSA9IGluZGV4IDwgbVNvdXJjZUltcGxzLnNpemUoKQogICAgICAgICA/IG1Tb3VyY2VJbXBscy5lZGl0SXRlbUF0KGluZGV4KS0+Z2V0Rm9ybWF0KCkgOiBOVUxMOwogICAgIGlmIChpbXBsTWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQotICAgIG1ldGEgPSAqaW1wbE1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2U7CisgICAgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKGltcGxNZXRhLCAmbXNnKTsKKyAgICBjb3B5QU1lc3NhZ2VUb0FNZWRpYUZvcm1hdChtZXRhLCBtc2cpOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9NUEVHMlRTKTsKLQotICAgIHJldHVybiBPSzsKK21lZGlhX3N0YXR1c190IE1QRUcyVFNFeHRyYWN0b3I6OmdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSkgeworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobWV0YSwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUyk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogLy9zdGF0aWMKQEAgLTE3NCw3ICsyOTMsNyBAQAogICAgICAgICAgICAgICAgICAgICB8fCAhc3RyY2FzZWNtcChNRURJQV9NSU1FVFlQRV9BVURJT19TQ1JBTUJMRUQsIG1pbWUpKTsKIH0KIAotc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6c2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogY2FzVG9rZW4sIHNpemVfdCBzaXplKSB7CittZWRpYV9zdGF0dXNfdCBNUEVHMlRTRXh0cmFjdG9yOjpzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiBjYXNUb2tlbiwgc2l6ZV90IHNpemUpIHsKICAgICBIYWxUb2tlbiBoYWxUb2tlbjsKICAgICBoYWxUb2tlbi5zZXRUb0V4dGVybmFsKCh1aW50OF90KiljYXNUb2tlbiwgc2l6ZSk7CiAgICAgc3A8SUNhcz4gY2FzID0gSUNhczo6Y2FzdEZyb20ocmV0cmlldmVIYWxJbnRlcmZhY2UoaGFsVG9rZW4pKTsKQEAgLTE4NCwyMCArMzAzLDI2IEBACiAgICAgaWYgKGVyciA9PSBPSykgewogICAgICAgICBBTE9HSSgiQWxsIHRyYWNrcyBub3cgaGF2ZSBkZXNjcmFtYmxlcnMiKTsKICAgICAgICAgaW5pdCgpOworICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgIH0KLSAgICByZXR1cm4gZXJyOworICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKK30KKworc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6ZmluZEluZGV4T2ZTb3VyY2UoY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gJmltcGwsIHNpemVfdCAqaW5kZXgpIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VJbXBscy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobVNvdXJjZUltcGxzW2ldID09IGltcGwpIHsKKyAgICAgICAgICAgICppbmRleCA9IGk7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogfQogCiB2b2lkIE1QRUcyVFNFeHRyYWN0b3I6OmFkZFNvdXJjZShjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCkgewotICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VJbXBscy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobVNvdXJjZUltcGxzW2ldID09IGltcGwpIHsKLSAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghZm91bmQpIHsKKyAgICBzaXplX3QgaW5kZXg7CisgICAgaWYgKGZpbmRJbmRleE9mU291cmNlKGltcGwsICZpbmRleCkgIT0gT0spIHsKICAgICAgICAgbVNvdXJjZUltcGxzLnB1c2goaW1wbCk7CisgICAgICAgIG1TeW5jUG9pbnRzLnB1c2goKTsKICAgICB9CiB9CiAKQEAgLTIwNSw2ICszMzAsNyBAQAogICAgIGJvb2wgaGF2ZUF1ZGlvID0gZmFsc2U7CiAgICAgYm9vbCBoYXZlVmlkZW8gPSBmYWxzZTsKICAgICBpbnQ2NF90IHN0YXJ0VGltZSA9IEFMb29wZXI6OkdldE5vd1VzKCk7CisgICAgc2l6ZV90IGluZGV4OwogCiAgICAgc3RhdHVzX3QgZXJyOwogICAgIHdoaWxlICgoZXJyID0gZmVlZE1vcmUodHJ1ZSAvKiBpc0luaXQgKi8pKSA9PSBPSwpAQCAtMjIzLDggKzM0OSw5IEBACiAgICAgICAgICAgICAgICAgICAgIGhhdmVWaWRlbyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGFkZFNvdXJjZShpbXBsKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NjcmFtYmxlZEZvcm1hdCgqKGZvcm1hdC5nZXQoKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3luY1BvaW50cy5wdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1N5bmNQb2ludHMgPSAmbVN5bmNQb2ludHMuZWRpdFRvcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbmRJbmRleE9mU291cmNlKGltcGwsICZpbmRleCkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2Vla1N5bmNQb2ludHMgPSAmbVN5bmNQb2ludHMuZWRpdEl0ZW1BdChpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CkBAIC0yMzgsMTAgKzM2NSw5IEBACiAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGhhdmVBdWRpbyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIGFkZFNvdXJjZShpbXBsKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFpc1NjcmFtYmxlZEZvcm1hdCgqKGZvcm1hdC5nZXQoKSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3luY1BvaW50cy5wdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWhhdmVWaWRlbykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrU3luY1BvaW50cyA9ICZtU3luY1BvaW50cy5lZGl0VG9wKCk7CisgICAgICAgICAgICAgICAgICAgIGlmICghaXNTY3JhbWJsZWRGb3JtYXQoKihmb3JtYXQuZ2V0KCkpKSAmJiAhaGF2ZVZpZGVvKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZEluZGV4T2ZTb3VyY2UoaW1wbCwgJmluZGV4KSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZWVrU3luY1BvaW50cyA9ICZtU3luY1BvaW50cy5lZGl0SXRlbUF0KGluZGV4KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KQEAgLTM0MCw3ICs0NjYsNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKICAgICB1aW50OF90IHBhY2tldFtrVFNQYWNrZXRTaXplXTsKLSAgICBzc2l6ZV90IG4gPSBtRGF0YVNvdXJjZS0+cmVhZEF0KG1PZmZzZXQsIHBhY2tldCwga1RTUGFja2V0U2l6ZSk7CisgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChtT2Zmc2V0ICsgbUhlYWRlclNraXAsIHBhY2tldCwga1RTUGFja2V0U2l6ZSk7CiAKICAgICBpZiAobiA8IChzc2l6ZV90KWtUU1BhY2tldFNpemUpIHsKICAgICAgICAgaWYgKG4gPj0gMCkgewpAQCAtMzUwLDcgKzQ3Niw3IEBACiAgICAgfQogCiAgICAgQVRTUGFyc2VyOjpTeW5jRXZlbnQgZXZlbnQobU9mZnNldCk7Ci0gICAgbU9mZnNldCArPSBuOworICAgIG1PZmZzZXQgKz0gbUhlYWRlclNraXAgKyBuOwogICAgIHN0YXR1c190IGVyciA9IG1QYXJzZXItPmZlZWRUU1BhY2tldChwYWNrZXQsIGtUU1BhY2tldFNpemUsICZldmVudCk7CiAgICAgaWYgKGV2ZW50Lmhhc1JldHVybmVkRGF0YSgpKSB7CiAgICAgICAgIGlmIChpc0luaXQpIHsKQEAgLTQxOSwxNSArNTQ1LDE1IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHNzaXplX3QgbiA9IG1EYXRhU291cmNlLT5yZWFkQXQob2Zmc2V0LCBwYWNrZXQsIGtUU1BhY2tldFNpemUpOworICAgICAgICAgICAgc3NpemVfdCBuID0gbURhdGFTb3VyY2UtPnJlYWRBdChvZmZzZXQrbUhlYWRlclNraXAsIHBhY2tldCwga1RTUGFja2V0U2l6ZSk7CiAgICAgICAgICAgICBpZiAobiA8IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gbjsKICAgICAgICAgICAgIH0gZWxzZSBpZiAobiA8IChzc2l6ZV90KWtUU1BhY2tldFNpemUpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgb2Zmc2V0ICs9IGtUU1BhY2tldFNpemU7Ci0gICAgICAgICAgICBieXRlc1JlYWQgKz0ga1RTUGFja2V0U2l6ZTsKKyAgICAgICAgICAgIG9mZnNldCArPSBrVFNQYWNrZXRTaXplICsgbUhlYWRlclNraXA7CisgICAgICAgICAgICBieXRlc1JlYWQgKz0ga1RTUGFja2V0U2l6ZSArIG1IZWFkZXJTa2lwOwogICAgICAgICAgICAgZXJyID0gcGFyc2VyLT5mZWVkVFNQYWNrZXQocGFja2V0LCBrVFNQYWNrZXRTaXplLCAmZXYpOwogICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CkBAIC00OTEsNyArNjE3LDcgQEAKIH0KIAogc3RhdHVzX3QgTVBFRzJUU0V4dHJhY3Rvcjo6c2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsCi0gICAgICAgIGNvbnN0IE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSAmc2Vla01vZGUpIHsKKyAgICAgICAgY29uc3QgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlICZzZWVrTW9kZSkgewogICAgIGlmIChtU2Vla1N5bmNQb2ludHMgPT0gTlVMTCB8fCBtU2Vla1N5bmNQb2ludHMtPmlzRW1wdHkoKSkgewogICAgICAgICBBTE9HVygiTm8gc3luYyBwb2ludCB0byBzZWVrIHRvLiIpOwogICAgICAgICAvLyAuLi4gYW5kIHRoZXJlZm9yZSB3ZSBoYXZlIG5vdGhpbmcgdXNlZnVsIHRvIGRvIGhlcmUuCkBAIC01MTIsMTggKzYzOCwxOCBAQAogICAgIH0KIAogICAgIHN3aXRjaCAoc2Vla01vZGUpIHsKLSAgICAgICAgY2FzZSBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkM6CisgICAgICAgIGNhc2UgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnM6OlNFRUtfTkVYVF9TWU5DOgogICAgICAgICAgICAgaWYgKGluZGV4ID09IG1TZWVrU3luY1BvaW50cy0+c2l6ZSgpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1coIk5leHQgc3luYyBub3QgZm91bmQ7IHN0YXJ0aW5nIGZyb20gdGhlIGxhdGVzdCBzeW5jLiIpOwogICAgICAgICAgICAgICAgIC0taW5kZXg7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkM6Ci0gICAgICAgIGNhc2UgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVDoKKyAgICAgICAgY2FzZSBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkM6CisgICAgICAgIGNhc2UgTWVkaWFUcmFja0hlbHBlcjo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVDoKICAgICAgICAgICAgIEFMT0dXKCJzZWVrTW9kZSBub3Qgc3VwcG9ydGVkOiAlZDsgZmFsbGluZyBiYWNrIHRvIFBSRVZJT1VTX1NZTkMiLAogICAgICAgICAgICAgICAgICAgICBzZWVrTW9kZSk7CiAgICAgICAgICAgICBGQUxMVEhST1VHSF9JTlRFTkRFRDsKLSAgICAgICAgY2FzZSBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOgorICAgICAgICBjYXNlIE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zOjpTRUVLX1BSRVZJT1VTX1NZTkM6CiAgICAgICAgICAgICBpZiAoaW5kZXggPT0gMCkgewogICAgICAgICAgICAgICAgIEFMT0dXKCJQcmV2aW91cyBzeW5jIG5vdCBmb3VuZDsgc3RhcnRpbmcgZnJvbSB0aGUgZWFybGllc3QgIgogICAgICAgICAgICAgICAgICAgICAgICAgInN5bmMuIik7CkBAIC02NjYsMTIgKzc5MiwyMiBAQAogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1ib29sIFNuaWZmTVBFRzJUUyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgeworYm9vbCBTbmlmZk1QRUcyVFMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSkgewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgKytpKSB7CiAgICAgICAgIGNoYXIgaGVhZGVyOwogICAgICAgICBpZiAoc291cmNlLT5yZWFkQXQoa1RTUGFja2V0U2l6ZSAqIGksICZoZWFkZXIsIDEpICE9IDEKICAgICAgICAgICAgICAgICB8fCBoZWFkZXIgIT0gMHg0NykgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgLy8gbm90IHRzIGZpbGUsIGNoZWNrIGlmIG0ydHMgZmlsZQorICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA1OyArK2opIHsKKyAgICAgICAgICAgICAgICBjaGFyIGhlYWRlcnNbNV07CisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS0+cmVhZEF0KChrVFNQYWNrZXRTaXplICsgNCkgKiBqLCAmaGVhZGVycywgNSkgIT0gNQorICAgICAgICAgICAgICAgICAgICB8fCBoZWFkZXJzWzRdICE9IDB4NDcpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbm90IG0ydHMgZmlsZSB0b28sIHJldHVybgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoInRoaXMgaXMgbTJ0cyBmaWxlXG4iKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL21wZWcyL01QRUcyVFNFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5oCmluZGV4IGNiZGQzY2IuLmRjZDFlN2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvbXBlZzIvTVBFRzJUU0V4dHJhY3Rvci5oCkBAIC0yMCw4ICsyMCw4IEBACiAjZGVmaW5lIE1QRUcyX1RTX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KQEAgLTM0LDMwICszNCwzMyBAQAogc3RydWN0IEFNZXNzYWdlOwogc3RydWN0IEFub3RoZXJQYWNrZXRTb3VyY2U7CiBzdHJ1Y3QgQVRTUGFyc2VyOwotY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitzdHJ1Y3QgQ0RhdGFTb3VyY2U7CiBzdHJ1Y3QgTVBFRzJUU1NvdXJjZTsKIGNsYXNzIFN0cmluZzg7CiAKLXN0cnVjdCBNUEVHMlRTRXh0cmFjdG9yIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKLSAgICBleHBsaWNpdCBNUEVHMlRTRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworc3RydWN0IE1QRUcyVFNFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgeworICAgIGV4cGxpY2l0IE1QRUcyVFNFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIC8qY2FzVG9rZW4qLywgc2l6ZV90IC8qc2l6ZSovKSBvdmVycmlkZTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIC8qY2FzVG9rZW4qLywgc2l6ZV90IC8qc2l6ZSovKSBvdmVycmlkZTsKIAogICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk1QRUcyVFNFeHRyYWN0b3IiOyB9CiAKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5NUEVHMlRTRXh0cmFjdG9yKCk7CisKIHByaXZhdGU6CiAgICAgZnJpZW5kIHN0cnVjdCBNUEVHMlRTU291cmNlOwogCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKIAotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKIAogICAgIHNwPEFUU1BhcnNlcj4gbVBhcnNlcjsKIApAQCAtODEsMjcgKzg0LDI5IEBACiAgICAgLy8gVHJ5IHRvIGZlZWQgbW9yZSBkYXRhIGZyb20gc291cmNlIHRvIHBhcnNlci4KICAgICAvLyB8aXNJbml0fCBtZWFucyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbnNpZGUgaW5pdCgpLiBUaGlzIGlzIGEgc2lnbmFsIHRvCiAgICAgLy8gc2F2ZSBTeW5jRXZlbnQgc28gdGhhdCBpbml0KCkgY2FuIGFkZCBTeW5jUG9pbnQgYWZ0ZXIgaXQgdXBkYXRlcyB8bVNvdXJjZUltcGxzfC4KLSAgICAvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgT0sgaWYgZXhwZWN0ZWQgYW1vdW50IG9mIGRhdGEgaXMgZmVkIGZyb20gRGF0YVNvdXJjZUJhc2UgdG8KKyAgICAvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgT0sgaWYgZXhwZWN0ZWQgYW1vdW50IG9mIGRhdGEgaXMgZmVkIGZyb20gRGF0YVNvdXJjZUhlbHBlciB0bwogICAgIC8vIHBhcnNlciBhbmQgaXMgc3VjY2Vzc2Z1bGx5IHBhcnNlZC4gT3RoZXJ3aXNlLCB2YXJpb3VzIGVycm9yIGNvZGVzIGNvdWxkIGJlCi0gICAgLy8gcmV0dXJuZWQsIGUuZy4sIEVSUk9SX0VORF9PRl9TVFJFQU0sIG9yIG5vIGRhdGEgYXZhaWxhbGJlIGZyb20gRGF0YVNvdXJjZUJhc2UsIG9yCisgICAgLy8gcmV0dXJuZWQsIGUuZy4sIEVSUk9SX0VORF9PRl9TVFJFQU0sIG9yIG5vIGRhdGEgYXZhaWxhbGJlIGZyb20gRGF0YVNvdXJjZUhlbHBlciwgb3IKICAgICAvLyB0aGUgZGF0YSBoYXMgc3ludGF4IGVycm9yIGR1cmluZyBwYXJzaW5nLCBldGMuCiAgICAgc3RhdHVzX3QgZmVlZE1vcmUoYm9vbCBpc0luaXQgPSBmYWxzZSk7CiAgICAgc3RhdHVzX3Qgc2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsCi0gICAgICAgICAgICBjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNlZWtNb2RlJiBzZWVrTW9kZSk7CisgICAgICAgICAgICBjb25zdCBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9uczo6U2Vla01vZGUmIHNlZWtNb2RlKTsKICAgICBzdGF0dXNfdCBxdWV1ZURpc2NvbnRpbnVpdHlGb3JTZWVrKGludDY0X3QgYWN0dWFsU2Vla1RpbWVVcyk7CiAgICAgc3RhdHVzX3Qgc2Vla0JleW9uZChpbnQ2NF90IHNlZWtUaW1lVXMpOwogCiAgICAgc3RhdHVzX3QgZmVlZFVudGlsQnVmZmVyQXZhaWxhYmxlKGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+ICZpbXBsKTsKKyAgICBzdGF0dXNfdCBmaW5kSW5kZXhPZlNvdXJjZShjb25zdCBzcDxBbm90aGVyUGFja2V0U291cmNlPiAmaW1wbCwgc2l6ZV90ICppbmRleCk7CiAKICAgICAvLyBBZGQgYSBTeW5Qb2ludCBkZXJpdmVkIGZyb20gfGV2ZW50fC4KICAgICB2b2lkIGFkZFN5bmNQb2ludF9sKGNvbnN0IEFUU1BhcnNlcjo6U3luY0V2ZW50ICZldmVudCk7CiAKICAgICBzdGF0dXNfdCAgZXN0aW1hdGVEdXJhdGlvbnNGcm9tVGltZXNVc0F0RW5kKCk7CiAKKyAgICBzaXplX3QgbUhlYWRlclNraXA7CiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTVBFRzJUU0V4dHJhY3Rvcik7CiB9OwogCi1ib29sIFNuaWZmTVBFRzJUUyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSk7Citib29sIFNuaWZmTVBFRzJUUyhEYXRhU291cmNlSGVscGVyICpzb3VyY2UsIGZsb2F0ICpjb25maWRlbmNlKTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icCBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL0FuZHJvaWQuYnAKaW5kZXggZjNkMjc5NC4uZTY2MWI1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvQW5kcm9pZC5icAorKysgYi9tZWRpYS9leHRyYWN0b3JzL29nZy9BbmRyb2lkLmJwCkBAIC0xLDQgKzEsNCBAQAotY2NfbGlicmFyeV9zaGFyZWQgeworY2NfbGlicmFyeSB7CiAKICAgICBzcmNzOiBbIk9nZ0V4dHJhY3Rvci5jcHAiXSwKIApAQCAtNywxMyArNywxOCBAQAogICAgICAgICAiZXh0ZXJuYWwvdHJlbW9sbyIsCiAgICAgXSwKIAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb19zeXN0ZW1faGVhZGVycyIsCisgICAgXSwKKwogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAorICAgICAgICAibGlibWVkaWFuZGsiLAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYnZvcmJpc2lkZWMiLAogICAgIF0sCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuY3BwIGIvbWVkaWEvZXh0cmFjdG9ycy9vZ2cvT2dnRXh0cmFjdG9yLmNwcAppbmRleCBiMmZlNjljLi43MmI5NGJiIDEwMDY0NAotLS0gYS9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5jcHAKQEAgLTIxLDE5ICsyMSwxNyBAQAogI2luY2x1ZGUgIk9nZ0V4dHJhY3Rvci5oIgogCiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL0V4dHJhY3RvclV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFUcmFjay5oPgotI2luY2x1ZGUgPG1lZGlhL1ZvcmJpc0NvbW1lbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBleHRlcm4gIkMiIHsKQEAgLTQ3LDE2ICs0NSwxNiBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBPZ2dTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFjayB7CitzdHJ1Y3QgT2dnU291cmNlIDogcHVibGljIE1lZGlhVHJhY2tIZWxwZXIgewogICAgIGV4cGxpY2l0IE9nZ1NvdXJjZShPZ2dFeHRyYWN0b3IgKmV4dHJhY3Rvcik7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICopOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHN0b3AoKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWQoCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlciwgY29uc3QgUmVhZE9wdGlvbnMgKm9wdGlvbnMgPSBOVUxMKTsKIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfk9nZ1NvdXJjZSgpOwpAQCAtNzEsMjggKzY5LDMwIEBACiAKIHN0cnVjdCBNeU9nZ0V4dHJhY3RvciB7CiAgICAgTXlPZ2dFeHRyYWN0b3IoCi0gICAgICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorICAgICAgICAgICAgRGF0YVNvdXJjZUhlbHBlciAqc291cmNlLAogICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUsCiAgICAgICAgICAgICBzaXplX3QgbnVtSGVhZGVycywKICAgICAgICAgICAgIGludDY0X3Qgc2Vla1ByZVJvbGxVcyk7CiAgICAgdmlydHVhbCB+TXlPZ2dFeHRyYWN0b3IoKTsKIAotICAgIHN0YXR1c190IGdldEZvcm1hdChNZXRhRGF0YUJhc2UgJikgY29uc3Q7CisgICAgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqKSBjb25zdDsKIAogICAgIC8vIFJldHVybnMgYW4gYXBwcm94aW1hdGUgYml0cmF0ZSBpbiBiaXRzIHBlciBzZWNvbmQuCiAgICAgdmlydHVhbCB1aW50NjRfdCBhcHByb3hCaXRyYXRlKCkgY29uc3QgPSAwOwogCiAgICAgc3RhdHVzX3Qgc2Vla1RvVGltZShpbnQ2NF90IHRpbWVVcyk7CiAgICAgc3RhdHVzX3Qgc2Vla1RvT2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlcikgPSAwOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIpID0gMDsKIAogICAgIHN0YXR1c190IGluaXQoKTsKIAotICAgIHN0YXR1c190IGdldEZpbGVNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLSAgICAgICAgbWV0YSA9IG1GaWxlTWV0YTsKLSAgICAgICAgcmV0dXJuIE9LOworICAgIG1lZGlhX3N0YXR1c190IGdldEZpbGVNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEpIHsKKyAgICAgICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1GaWxlTWV0YSk7CiAgICAgfQogCisgICAgdm9pZCBzZXRCdWZmZXJHcm91cChNZWRpYUJ1ZmZlckdyb3VwSGVscGVyICpncm91cCkgeworICAgICAgICBtQnVmZmVyR3JvdXAgPSBncm91cDsKKyAgICB9CiBwcm90ZWN0ZWQ6CiAgICAgc3RydWN0IFBhZ2UgewogICAgICAgICB1aW50NjRfdCBtR3JhbnVsZVBvc2l0aW9uOwpAQCAtMTEwLDcgKzExMCw4IEBACiAgICAgICAgIGludDY0X3QgbVRpbWVVczsKICAgICB9OwogCi0gICAgRGF0YVNvdXJjZUJhc2UgKm1Tb3VyY2U7CisgICAgTWVkaWFCdWZmZXJHcm91cEhlbHBlciAqbUJ1ZmZlckdyb3VwOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1Tb3VyY2U7CiAgICAgb2ZmNjRfdCBtT2Zmc2V0OwogICAgIFBhZ2UgbUN1cnJlbnRQYWdlOwogICAgIHVpbnQ2NF90IG1DdXJHcmFudWxlUG9zaXRpb247CkBAIC0xMjksMTEgKzEzMCwxMyBAQAogICAgIHZvcmJpc19pbmZvIG1WaTsKICAgICB2b3JiaXNfY29tbWVudCBtVmM7CiAKLSAgICBNZXRhRGF0YUJhc2UgbU1ldGE7Ci0gICAgTWV0YURhdGFCYXNlIG1GaWxlTWV0YTsKKyAgICBBTWVkaWFGb3JtYXQgKm1NZXRhOworICAgIEFNZWRpYUZvcm1hdCAqbUZpbGVNZXRhOwogCiAgICAgVmVjdG9yPFRPQ0VudHJ5PiBtVGFibGVPZkNvbnRlbnRzOwogCisgICAgaW50MzJfdCBtSGFwdGljQ2hhbm5lbENvdW50OworCiAgICAgc3NpemVfdCByZWFkUGFnZShvZmY2NF90IG9mZnNldCwgUGFnZSAqcGFnZSk7CiAgICAgc3RhdHVzX3QgZmluZE5leHRQYWdlKG9mZjY0X3Qgc3RhcnRPZmZzZXQsIG9mZjY0X3QgKnBhZ2VPZmZzZXQpOwogCkBAIC0xNDYsNyArMTQ5LDcgQEAKICAgICAvLyAxIC0gYml0c3RyZWFtIGlkZW50aWZpY2F0aW9uIGhlYWRlcgogICAgIC8vIDMgLSBjb21tZW50IGhlYWRlcgogICAgIC8vIDUgLSBjb2RlYyBzZXR1cCBoZWFkZXIgKFZvcmJpcyBvbmx5KQotICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpID0gMDsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHZlcmlmeUhlYWRlcihNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyLCB1aW50OF90IHR5cGUpID0gMDsKIAogICAgIC8vIFJlYWQgdGhlIG5leHQgb2dnIHBhY2tldCBmcm9tIHRoZSB1bmRlcmx5aW5nIGRhdGEgc291cmNlOyBvcHRpb25hbGx5CiAgICAgLy8gY2FsY3VsYXRlIHRoZSB0aW1lc3RhbXAgZm9yIHRoZSBvdXRwdXQgcGFja2V0IHdoaWxzdCBwcmV0ZW5kaW5nCkBAIC0xNTQsOSArMTU3LDkgQEAKICAgICAvLwogICAgIC8vICpidWZmZXIgaXMgTlVMTCdlZCBvdXQgaW1tZWRpYXRlbHkgdXBvbiBlbnRyeSwgYW5kIGlmIHN1Y2Nlc3NmdWwgYSBuZXcgYnVmZmVyIGlzIGFsbG9jYXRlZDsKICAgICAvLyBjbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgcmVsZWFzaW5nIHRoZSBvcmlnaW5hbCBidWZmZXIuCi0gICAgc3RhdHVzX3QgX3JlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgYm9vbCBjYWxjVm9yYmlzVGltZXN0YW1wKTsKKyAgICBtZWRpYV9zdGF0dXNfdCBfcmVhZE5leHRQYWNrZXQoTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGJvb2wgY2FsY1ZvcmJpc1RpbWVzdGFtcCk7CiAKLSAgICBpbnQzMl90IGdldFBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CisgICAgaW50MzJfdCBnZXRQYWNrZXRCbG9ja1NpemUoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcik7CiAKICAgICB2b2lkIHBhcnNlRmlsZU1ldGFEYXRhKCk7CiAKQEAgLTE2NCwxMiArMTY3LDE0IEBACiAKICAgICB2b2lkIGJ1aWxkVGFibGVPZkNvbnRlbnRzKCk7CiAKKyAgICB2b2lkIHNldENoYW5uZWxNYXNrKGludCBjaGFubmVsQ291bnQpOworCiAgICAgTXlPZ2dFeHRyYWN0b3IoY29uc3QgTXlPZ2dFeHRyYWN0b3IgJik7CiAgICAgTXlPZ2dFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNeU9nZ0V4dHJhY3RvciAmKTsKIH07CiAKIHN0cnVjdCBNeVZvcmJpc0V4dHJhY3RvciA6IHB1YmxpYyBNeU9nZ0V4dHJhY3RvciB7Ci0gICAgZXhwbGljaXQgTXlWb3JiaXNFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKKyAgICBleHBsaWNpdCBNeVZvcmJpc0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgICAgIDogTXlPZ2dFeHRyYWN0b3Ioc291cmNlLAogICAgICAgICAgICAgICAgIE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUywKICAgICAgICAgICAgICAgICAvKiBudW1IZWFkZXJzICovIDMsCkBAIC0xNzgsNyArMTgzLDcgQEAKIAogICAgIHZpcnR1YWwgdWludDY0X3QgYXBwcm94Qml0cmF0ZSgpIGNvbnN0OwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIpIHsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVySGVscGVyICoqYnVmZmVyKSB7CiAgICAgICAgIHJldHVybiBfcmVhZE5leHRQYWNrZXQoYnVmZmVyLCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi8gdHJ1ZSk7CiAgICAgfQogCkBAIC0xOTAsMTQgKzE5NSwxNCBAQAogICAgICAgICByZXR1cm4gZ3JhbnVsZVBvcyAqIDEwMDAwMDBsbCAvIG1WaS5yYXRlOwogICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7CiB9OwogCiBzdHJ1Y3QgTXlPcHVzRXh0cmFjdG9yIDogcHVibGljIE15T2dnRXh0cmFjdG9yIHsKICAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrT3B1c1NhbXBsZVJhdGUgPSA0ODAwMDsKICAgICBzdGF0aWMgY29uc3QgaW50NjRfdCBrT3B1c1NlZWtQcmVSb2xsVXMgPSA4MDAwMDsgLy8gODAgbXMKIAotICAgIGV4cGxpY2l0IE15T3B1c0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKQorICAgIGV4cGxpY2l0IE15T3B1c0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgICAgIDogTXlPZ2dFeHRyYWN0b3Ioc291cmNlLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCAvKm51bUhlYWRlcnMqLyAyLCBrT3B1c1NlZWtQcmVSb2xsVXMpLAogICAgICAgICAgIG1DaGFubmVsQ291bnQoMCksCiAgICAgICAgICAgbUNvZGVjRGVsYXkoMCksCkBAIC0yMDgsMTYgKzIxMywxNiBAQAogICAgICAgICByZXR1cm4gMDsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlcik7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqKmJ1ZmZlcik7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0VGltZVVzT2ZHcmFudWxlKHVpbnQ2NF90IGdyYW51bGVQb3MpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgdmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSk7CiAKIHByaXZhdGU6Ci0gICAgc3RhdHVzX3QgdmVyaWZ5T3B1c0hlYWRlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7Ci0gICAgc3RhdHVzX3QgdmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKTsKLSAgICB1aW50MzJfdCBnZXROdW1TYW1wbGVzSW5QYWNrZXQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIGNvbnN0OworICAgIG1lZGlhX3N0YXR1c190IHZlcmlmeU9wdXNIZWFkZXIoTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcik7CisgICAgbWVkaWFfc3RhdHVzX3QgdmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpOworICAgIHVpbnQzMl90IGdldE51bVNhbXBsZXNJblBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKSBjb25zdDsKIAogICAgIHVpbnQ4X3QgbUNoYW5uZWxDb3VudDsKICAgICB1aW50MTZfdCBtQ29kZWNEZWxheTsKQEAgLTIzNywyOCArMjQyLDMwIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBPZ2dTb3VyY2U6OmdldEZvcm1hdChNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK21lZGlhX3N0YXR1c190IE9nZ1NvdXJjZTo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgewogICAgIHJldHVybiBtRXh0cmFjdG9yLT5tSW1wbC0+Z2V0Rm9ybWF0KG1ldGEpOwogfQogCi1zdGF0dXNfdCBPZ2dTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhQmFzZSAqIC8qIHBhcmFtcyAqLykgeworbWVkaWFfc3RhdHVzX3QgT2dnU291cmNlOjpzdGFydCgpIHsKICAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLQorICAgIC8vIGluaXRpYWxpemUgYnVmZmVyIGdyb3VwIHdpdGggYSBzaW5nbGUgc21hbGwgYnVmZmVyLCBidXQgYSBnZW5lcm91cyB1cHBlciBsaW1pdAorICAgIG1CdWZmZXJHcm91cC0+aW5pdCgxIC8qIG51bWJlciBvZiBidWZmZXJzICovLCAxMjggLyogc2l6ZSAqLywgNjQgLyogbWF4IG51bWJlciBvZiBidWZmZXJzICovKTsKKyAgICBtRXh0cmFjdG9yLT5tSW1wbC0+c2V0QnVmZmVyR3JvdXAobUJ1ZmZlckdyb3VwKTsKICAgICBtU3RhcnRlZCA9IHRydWU7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgT2dnU291cmNlOjpzdG9wKCkgeworbWVkaWFfc3RhdHVzX3QgT2dnU291cmNlOjpzdG9wKCkgewogICAgIG1TdGFydGVkID0gZmFsc2U7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgT2dnU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBPZ2dTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwpAQCAtMjY2LDQxICsyNzMsNDMgQEAKICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtUaW1lVXMsICZtb2RlKSkgewogICAgICAgICBzdGF0dXNfdCBlcnIgPSBtRXh0cmFjdG9yLT5tSW1wbC0+c2Vla1RvVGltZShzZWVrVGltZVVzKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfQogICAgIH0KIAotICAgIE1lZGlhQnVmZmVyQmFzZSAqcGFja2V0OwotICAgIHN0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPm1JbXBsLT5yZWFkTmV4dFBhY2tldCgmcGFja2V0KTsKKyAgICBNZWRpYUJ1ZmZlckhlbHBlciAqcGFja2V0OworICAgIG1lZGlhX3N0YXR1c190IGVyciA9IG1FeHRyYWN0b3ItPm1JbXBsLT5yZWFkTmV4dFBhY2tldCgmcGFja2V0KTsKIAotICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICBpZiAoZXJyICE9IEFNRURJQV9PSykgewogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IHBhY2tldC0+bWV0YV9kYXRhKCk7CiAjaWYgMAogICAgIGludDY0X3QgdGltZVVzOwotICAgIGlmIChwYWNrZXQtPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpIHsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2ZpbmRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVTdGFtcFVzKSkgewogICAgICAgICBBTE9HSSgiZm91bmQgdGltZSA9ICVsbGQgdXMiLCB0aW1lVXMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dJKCJOTyB0aW1lIik7CiAgICAgfQogI2VuZGlmCiAKLSAgICBwYWNrZXQtPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAKICAgICAqb3V0ID0gcGFja2V0OwotCi0gICAgcmV0dXJuIE9LOworICAgIEFMT0dWKCJyZXR1cm5pbmcgYnVmZmVyICVwIiwgcGFja2V0KTsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCiBNeU9nZ0V4dHJhY3Rvcjo6TXlPZ2dFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwKICAgICAgICAgY29uc3QgY2hhciAqbWltZVR5cGUsCiAgICAgICAgIHNpemVfdCBudW1IZWFkZXJzLAogICAgICAgICBpbnQ2NF90IHNlZWtQcmVSb2xsVXMpCi0gICAgOiBtU291cmNlKHNvdXJjZSksCisgICAgOiBtQnVmZmVyR3JvdXAoTlVMTCksCisgICAgICBtU291cmNlKHNvdXJjZSksCiAgICAgICBtT2Zmc2V0KDApLAogICAgICAgbUN1ckdyYW51bGVQb3NpdGlvbigwKSwKICAgICAgIG1QcmV2R3JhbnVsZVBvc2l0aW9uKDApLApAQCAtMzExLDIxICszMjAsMjYgQEAKICAgICAgIG1NaW1lVHlwZShtaW1lVHlwZSksCiAgICAgICBtTnVtSGVhZGVycyhudW1IZWFkZXJzKSwKICAgICAgIG1TZWVrUHJlUm9sbFVzKHNlZWtQcmVSb2xsVXMpLAotICAgICAgbUZpcnN0RGF0YU9mZnNldCgtMSkgeworICAgICAgbUZpcnN0RGF0YU9mZnNldCgtMSksCisgICAgICBtSGFwdGljQ2hhbm5lbENvdW50KDApIHsKICAgICBtQ3VycmVudFBhZ2UubU51bVNlZ21lbnRzID0gMDsKKyAgICBtQ3VycmVudFBhZ2UubUZsYWdzID0gMDsKIAogICAgIHZvcmJpc19pbmZvX2luaXQoJm1WaSk7CiAgICAgdm9yYmlzX2NvbW1lbnRfaW5pdCgmbVZjKTsKKyAgICBtTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBtRmlsZU1ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiB9CiAKIE15T2dnRXh0cmFjdG9yOjp+TXlPZ2dFeHRyYWN0b3IoKSB7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShtRmlsZU1ldGEpOworICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobU1ldGEpOwogICAgIHZvcmJpc19jb21tZW50X2NsZWFyKCZtVmMpOwogICAgIHZvcmJpc19pbmZvX2NsZWFyKCZtVmkpOwogfQogCi1zdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgY29uc3QgewotICAgIG1ldGEgPSBtTWV0YTsKLSAgICByZXR1cm4gT0s7CittZWRpYV9zdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6Z2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSkgY29uc3QgeworICAgIHJldHVybiBBTWVkaWFGb3JtYXRfY29weShtZXRhLCBtTWV0YSk7CiB9CiAKIHN0YXR1c190IE15T2dnRXh0cmFjdG9yOjpmaW5kTmV4dFBhZ2UoCkBAIC0zNTEsNyArMzY1LDEzIEBACiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KIAotICAgICAgICArKypwYWdlT2Zmc2V0OworICAgICAgICAvLyBzZWUgaG93IGZhciBhaGVhZCB0byBza2lwOyBhdm9pZCBzb21lIGZydWl0bGVzcyBjb21wYXJpc29ucworICAgICAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDQgOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzaWduYXR1cmVbaV0gPT0gJ08nKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgICpwYWdlT2Zmc2V0ICs9IGk7CiAgICAgfQogfQogCkBAIC0zOTUsMTkgKzQxNSwxOCBAQAogCiAgICAgQUxPR1YoInByZXZQYWdlT2Zmc2V0IGF0ICVsbGQsIHBhZ2VPZmZzZXQgYXQgJWxsZCIsCiAgICAgICAgICAgICAobG9uZyBsb25nKXByZXZQYWdlT2Zmc2V0LCAobG9uZyBsb25nKXBhZ2VPZmZzZXQpOwotCisgICAgdWludDhfdCBmbGFnID0gMDsKICAgICBmb3IgKDs7KSB7CiAgICAgICAgIFBhZ2UgcHJldlBhZ2U7CiAgICAgICAgIHNzaXplX3QgbiA9IHJlYWRQYWdlKHByZXZQYWdlT2Zmc2V0LCAmcHJldlBhZ2UpOwogCiAgICAgICAgIGlmIChuIDw9IDApIHsKLSAgICAgICAgICAgIHJldHVybiAoc3RhdHVzX3QpbjsKKyAgICAgICAgICAgIHJldHVybiAoZmxhZyAmIDB4NCkgPyBPSyA6IChzdGF0dXNfdCluOwogICAgICAgICB9Ci0KKyAgICAgICAgZmxhZyA9IHByZXZQYWdlLm1GbGFnczsKICAgICAgICAgcHJldlBhZ2VPZmZzZXQgKz0gbjsKLQorICAgICAgICAqZ3JhbnVsZVBvcyA9IHByZXZQYWdlLm1HcmFudWxlUG9zaXRpb247CiAgICAgICAgIGlmIChwcmV2UGFnZU9mZnNldCA9PSBwYWdlT2Zmc2V0KSB7Ci0gICAgICAgICAgICAqZ3JhbnVsZVBvcyA9IHByZXZQYWdlLm1HcmFudWxlUG9zaXRpb247CiAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgIH0KICAgICB9CkBAIC01MDIsMzAgKzUyMSwzMCBAQAogICAgICAgICBBTE9HVigiZmFpbGVkIHRvIHJlYWQgJXp1IGJ5dGVzIGF0IG9mZnNldCAlIzAxNmxseCwgZ290ICV6ZCBieXRlcyIsCiAgICAgICAgICAgICAgICAgc2l6ZW9mKGhlYWRlciksIChsb25nIGxvbmcpb2Zmc2V0LCBuKTsKIAotICAgICAgICBpZiAobiA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiBuOwotICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIGlmIChuID09IDAgfHwgbiA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0gZWxzZSBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU87CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAobWVtY21wKGhlYWRlciwgIk9nZ1MiLCA0KSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBpZiAoaGVhZGVyWzRdICE9IDApIHsKICAgICAgICAgLy8gV3JvbmcgdmVyc2lvbi4KIAotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCiAgICAgcGFnZS0+bUZsYWdzID0gaGVhZGVyWzVdOwogCiAgICAgaWYgKHBhZ2UtPm1GbGFncyAmIH43KSB7CiAgICAgICAgIC8vIE9ubHkgYml0cyAwLTIgYXJlIGRlZmluZWQgaW4gdmVyc2lvbiAwLgotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBwYWdlLT5tR3JhbnVsZVBvc2l0aW9uID0gVTY0TEVfQVQoJmhlYWRlcls2XSk7CkBAIC01NDIsNyArNTYxLDcgQEAKICAgICBpZiAobVNvdXJjZS0+cmVhZEF0KAogICAgICAgICAgICAgICAgIG9mZnNldCArIHNpemVvZihoZWFkZXIpLCBwYWdlLT5tTGFjZSwgcGFnZS0+bU51bVNlZ21lbnRzKQogICAgICAgICAgICAgPCAoc3NpemVfdClwYWdlLT5tTnVtU2VnbWVudHMpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0lPOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0lPOwogICAgIH0KIAogICAgIHNpemVfdCB0b3RhbFNpemUgPSAwOzsKQEAgLTU2NSwyMiArNTg0LDIyIEBACiAgICAgcmV0dXJuIHNpemVvZihoZWFkZXIpICsgcGFnZS0+bU51bVNlZ21lbnRzICsgdG90YWxTaXplOwogfQogCi1zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnJlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKm91dCkgeworbWVkaWFfc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjpyZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCkgewogICAgIGlmIChtT2Zmc2V0IDw9IG1GaXJzdERhdGFPZmZzZXQgJiYgbVN0YXJ0R3JhbnVsZVBvc2l0aW9uIDwgMCkgewogICAgICAgICAvLyBUaGUgZmlyc3Qgc2FtcGxlIG1pZ2h0IG5vdCBzdGFydCBhdCB0aW1lIDA7IGZpbmQgb3V0IHdoZXJlIGJ5IHN1YnRyYWN0aW5nCiAgICAgICAgIC8vIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvbiB0aGUgZmlyc3QgcGFnZSBmcm9tIHRoZSBncmFudWxlIHBvc2l0aW9uCiAgICAgICAgIC8vIChwb3NpdGlvbiBvZiBsYXN0IGNvbXBsZXRlIHNhbXBsZSkgb2YgdGhlIGZpcnN0IHBhZ2UuIFRoaXMgaGFwcGVucwogICAgICAgICAvLyB0aGUgZmlyc3QgdGltZSBiZWZvcmUgd2UgYXR0ZW1wdCB0byByZWFkIGEgcGFja2V0IGZyb20gdGhlIGZpcnN0IHBhZ2UuCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqbUJ1ZjsKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKm1CdWY7CiAgICAgICAgIHVpbnQzMl90IG51bVNhbXBsZXMgPSAwOwogICAgICAgICB1aW50NjRfdCBjdXJHcmFudWxlUG9zaXRpb24gPSAwOwogICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gX3JlYWROZXh0UGFja2V0KCZtQnVmLCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi9mYWxzZSk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBfcmVhZE5leHRQYWNrZXQoJm1CdWYsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqL2ZhbHNlKTsKKyAgICAgICAgICAgIGlmIChlcnIgIT0gQU1FRElBX09LICYmIGVyciAhPSBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSkgewogICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBGaXJzdCB0d28gcGFnZXMgYXJlIGhlYWRlciBwYWdlcy4KLSAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSB8fCBtQ3VycmVudFBhZ2UubVBhZ2VObyA+IDIpIHsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0gfHwgbUN1cnJlbnRQYWdlLm1QYWdlTm8gPiAyKSB7CiAgICAgICAgICAgICAgICAgaWYgKG1CdWYgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBtQnVmLT5yZWxlYXNlKCk7CiAgICAgICAgICAgICAgICAgICAgIG1CdWYgPSBOVUxMOwpAQCAtNjAxLDMyICs2MjAsMzMgQEAKICAgICAgICAgc2Vla1RvT2Zmc2V0KDApOwogICAgIH0KIAotICAgIHN0YXR1c190IGVyciA9IF9yZWFkTmV4dFBhY2tldChvdXQsIC8qIGNhbGNWb3JiaXNUaW1lc3RhbXAgPSAqL2ZhbHNlKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gX3JlYWROZXh0UGFja2V0KG91dCwgLyogY2FsY1ZvcmJpc1RpbWVzdGFtcCA9ICovZmFsc2UpOworICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CiAgICAgICAgIHJldHVybiBlcnI7CiAgICAgfQogCiAgICAgaW50MzJfdCBjdXJyZW50UGFnZVNhbXBsZXM7CiAgICAgLy8gQ2FsY3VsYXRlIHRpbWVzdGFtcHMgYnkgYWNjdW11bGF0aW5nIGR1cmF0aW9ucyBzdGFydGluZyBmcm9tIHRoZSBmaXJzdCBzYW1wbGUgb2YgYSBwYWdlOwogICAgIC8vIFdlIGFzc3VtZSB0aGF0IHdlIG9ubHkgc2VlayB0byBwYWdlIGJvdW5kYXJpZXMuCi0gICAgaWYgKCgqb3V0KS0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlWYWxpZFNhbXBsZXMsICZjdXJyZW50UGFnZVNhbXBsZXMpKSB7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gKCpvdXQpLT5tZXRhX2RhdGEoKTsKKyAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUywgJmN1cnJlbnRQYWdlU2FtcGxlcykpIHsKICAgICAgICAgLy8gZmlyc3QgcGFja2V0IGluIHBhZ2UKICAgICAgICAgaWYgKG1PZmZzZXQgPT0gbUZpcnN0RGF0YU9mZnNldCkgewogICAgICAgICAgICAgY3VycmVudFBhZ2VTYW1wbGVzIC09IG1TdGFydEdyYW51bGVQb3NpdGlvbjsKLSAgICAgICAgICAgICgqb3V0KS0+bWV0YV9kYXRhKCkuc2V0SW50MzIoa0tleVZhbGlkU2FtcGxlcywgY3VycmVudFBhZ2VTYW1wbGVzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMsIGN1cnJlbnRQYWdlU2FtcGxlcyk7CiAgICAgICAgIH0KICAgICAgICAgbUN1ckdyYW51bGVQb3NpdGlvbiA9IG1DdXJyZW50UGFnZS5tR3JhbnVsZVBvc2l0aW9uIC0gY3VycmVudFBhZ2VTYW1wbGVzOwogICAgIH0KIAogICAgIGludDY0X3QgdGltZVVzID0gZ2V0VGltZVVzT2ZHcmFudWxlKG1DdXJHcmFudWxlUG9zaXRpb24pOwotICAgICgqb3V0KS0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVVzKTsKIAogICAgIHVpbnQzMl90IGZyYW1lcyA9IGdldE51bVNhbXBsZXNJblBhY2tldCgqb3V0KTsKICAgICBtQ3VyR3JhbnVsZVBvc2l0aW9uICs9IGZyYW1lczsKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotdWludDMyX3QgTXlPcHVzRXh0cmFjdG9yOjpnZXROdW1TYW1wbGVzSW5QYWNrZXQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIGNvbnN0IHsKK3VpbnQzMl90IE15T3B1c0V4dHJhY3Rvcjo6Z2V0TnVtU2FtcGxlc0luUGFja2V0KE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpIGNvbnN0IHsKICAgICBpZiAoYnVmZmVyID09IE5VTEwgfHwgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSA8IDEpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtNjY4LDE0ICs2ODgsNzAgQEAKICAgICAgICAgVFJFU1BBU1MoKTsKICAgICB9CiAKLSAgICB1aW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVTaXplVXMgKiBudW1GcmFtZXMgKiBrT3B1c1NhbXBsZVJhdGUgLyAxMDAwMDAwOworICAgIHVpbnQzMl90IG51bVNhbXBsZXMgPSAodWludDMyX3QpKCh1aW50NjRfdClmcmFtZVNpemVVcyAqIG51bUZyYW1lcyAqIGtPcHVzU2FtcGxlUmF0ZSkgLyAxMDAwMDAwOwogICAgIHJldHVybiBudW1TYW1wbGVzOwogfQogCi1zdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6X3JlYWROZXh0UGFja2V0KE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgYm9vbCBjYWxjVm9yYmlzVGltZXN0YW1wKSB7CisvKgorICogYmFzaWMgbWVkaWFidWZmZXIgaW1wbGVtZW50YXRpb24gdXNlZCBkdXJpbmcgaW5pdGlhbCBwYXJzaW5nIG9mIHRoZQorICogaGVhZGVyIHBhY2tldHMsIHdoaWNoIGhhcHBlbnMgYmVmb3JlIHdlIGhhdmUgYSBidWZmZXIgZ3JvdXAKKyAqLworY2xhc3MgU3RhbmRBbG9uZU1lZGlhQnVmZmVyIDogcHVibGljIE1lZGlhQnVmZmVySGVscGVyIHsKK3ByaXZhdGU6CisgICAgdm9pZCAqbURhdGE7CisgICAgc2l6ZV90IG1TaXplOworICAgIHNpemVfdCBtT2Zmc2V0OworICAgIHNpemVfdCBtTGVuZ3RoOworICAgIEFNZWRpYUZvcm1hdCAqbUZvcm1hdDsKK3B1YmxpYzoKKyAgICBTdGFuZEFsb25lTWVkaWFCdWZmZXIoc2l6ZV90IHNpemUpIDogTWVkaWFCdWZmZXJIZWxwZXIoTlVMTCkgeworICAgICAgICBtU2l6ZSA9IHNpemU7CisgICAgICAgIG1EYXRhID0gbWFsbG9jKG1TaXplKTsKKyAgICAgICAgbU9mZnNldCA9IDA7CisgICAgICAgIG1MZW5ndGggPSBtU2l6ZTsKKyAgICAgICAgbUZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgQUxPR1YoImNyZWF0ZWQgc3RhbmRhbG9uZSBtZWRpYSBidWZmZXIgJXAgb2Ygc2l6ZSAlenUiLCB0aGlzLCBtU2l6ZSk7CisgICAgfQorCisgICAgflN0YW5kQWxvbmVNZWRpYUJ1ZmZlcigpIG92ZXJyaWRlIHsKKyAgICAgICAgZnJlZShtRGF0YSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobUZvcm1hdCk7CisgICAgICAgIEFMT0dWKCJkZWxldGVkIHN0YW5kYWxvbmUgbWVkaWEgYnVmZmVyICVwIG9mIHNpemUgJXp1IiwgdGhpcywgbVNpemUpOworICAgIH0KKworICAgIHZvaWQgcmVsZWFzZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgZGVsZXRlIHRoaXM7CisgICAgfQorCisgICAgdm9pZCogZGF0YSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1EYXRhOworICAgIH0KKworICAgIHNpemVfdCBzaXplKCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gbVNpemU7CisgICAgfQorCisgICAgc2l6ZV90IHJhbmdlX29mZnNldCgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1PZmZzZXQ7CisgICAgfQorCisgICAgc2l6ZV90IHJhbmdlX2xlbmd0aCgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1MZW5ndGg7CisgICAgfQorCisgICAgdm9pZCBzZXRfcmFuZ2Uoc2l6ZV90IG9mZnNldCwgc2l6ZV90IGxlbmd0aCkgb3ZlcnJpZGUgeworICAgICAgICBtT2Zmc2V0ID0gb2Zmc2V0OworICAgICAgICBtTGVuZ3RoID0gbGVuZ3RoOworICAgIH0KKyAgICBBTWVkaWFGb3JtYXQgKm1ldGFfZGF0YSgpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIG1Gb3JtYXQ7CisgICAgfQorfTsKKworbWVkaWFfc3RhdHVzX3QgTXlPZ2dFeHRyYWN0b3I6Ol9yZWFkTmV4dFBhY2tldChNZWRpYUJ1ZmZlckhlbHBlciAqKm91dCwgYm9vbCBjYWxjVm9yYmlzVGltZXN0YW1wKSB7CiAgICAgKm91dCA9IE5VTEw7CiAKLSAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA9IE5VTEw7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciA9IE5VTEw7CiAgICAgaW50NjRfdCB0aW1lVXMgPSAtMTsKIAogICAgIGZvciAoOzspIHsKQEAgLTcwOSwxNiArNzg1LDIzIEBACiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HRSgiYi8zNjU5MjIwMiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKnRtcCA9IE1lZGlhQnVmZmVyQmFzZTo6Q3JlYXRlKGZ1bGxTaXplKTsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICp0bXA7CisgICAgICAgICAgICBpZiAobUJ1ZmZlckdyb3VwKSB7CisgICAgICAgICAgICAgICAgbUJ1ZmZlckdyb3VwLT5hY3F1aXJlX2J1ZmZlcigmdG1wLCBmYWxzZSwgZnVsbFNpemUpOworICAgICAgICAgICAgICAgIEFMT0dWKCJhY3F1aXJlZCBidWZmZXIgJXAgZnJvbSBncm91cCIsIHRtcCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHRtcCA9IG5ldyBTdGFuZEFsb25lTWVkaWFCdWZmZXIoZnVsbFNpemUpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgaWYgKHRtcCA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgaWYgKGJ1ZmZlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HRSgiYi8zNjU5MjIwMiIpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfY2xlYXIodG1wLT5tZXRhX2RhdGEoKSk7CiAgICAgICAgICAgICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKICAgICAgICAgICAgICAgICBtZW1jcHkodG1wLT5kYXRhKCksIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKICAgICAgICAgICAgICAgICB0bXAtPnNldF9yYW5nZSgwLCBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKQEAgLTczNyw3ICs4MjAsNyBAQAogICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwogICAgICAgICAgICAgICAgIEFMT0dWKCJmYWlsZWQgdG8gcmVhZCAlenUgYnl0ZXMgYXQgJSMwMTZsbHgsIGdvdCAlemQgYnl0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgcGFja2V0U2l6ZSwgKGxvbmcgbG9uZylkYXRhT2Zmc2V0LCBuKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfSU87CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgZnVsbFNpemUpOwpAQCAtNzQ4LDggKzgzMSw5IEBACiAgICAgICAgICAgICAgICAgLy8gV2UndmUganVzdCByZWFkIHRoZSBlbnRpcmUgcGFja2V0LgogCiAgICAgICAgICAgICAgICAgaWYgKG1GaXJzdFBhY2tldEluUGFnZSkgewotICAgICAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlWYWxpZFNhbXBsZXMsIG1DdXJyZW50UGFnZVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKm1ldGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YSwgQU1FRElBRk9STUFUX0tFWV9WQUxJRF9TQU1QTEVTLCBtQ3VycmVudFBhZ2VTYW1wbGVzKTsKICAgICAgICAgICAgICAgICAgICAgbUZpcnN0UGFja2V0SW5QYWdlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgfQogCkBAIC03NzAsMTEgKzg1NCwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRQYWdlLm1QcmV2UGFja2V0UG9zICs9IGFjdHVhbEJsb2NrU2l6ZSAvIDI7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFBhZ2UubVByZXZQYWNrZXRTaXplID0gY3VyQmxvY2tTaXplOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+bWV0YV9kYXRhKCkuc2V0SW50NjQoa0tleVRpbWUsIHRpbWVVcyk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSA9IGJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQ2NChtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsIHRpbWVVcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gZmFsbCB0aHJvdWdoLCB0aGUgYnVmZmVyIG5vdyBjb250YWlucyB0aGUgc3RhcnQgb2YgdGhlIHBhY2tldC4KQEAgLTc4Myw2ICs4NjgsNyBAQAogICAgICAgICBDSEVDS19FUShtTmV4dExhY2VJbmRleCwgbUN1cnJlbnRQYWdlLm1OdW1TZWdtZW50cyk7CiAKICAgICAgICAgbU9mZnNldCArPSBtQ3VycmVudFBhZ2VTaXplOworICAgICAgICB1aW50OF90IGZsYWcgPSBtQ3VycmVudFBhZ2UubUZsYWdzOwogICAgICAgICBzc2l6ZV90IG4gPSByZWFkUGFnZShtT2Zmc2V0LCAmbUN1cnJlbnRQYWdlKTsKIAogICAgICAgICBpZiAobiA8PSAwKSB7CkBAIC03OTMsNyArODc5LDggQEAKIAogICAgICAgICAgICAgQUxPR1YoInJlYWRQYWdlIHJldHVybmVkICV6ZCIsIG4pOwogCi0gICAgICAgICAgICByZXR1cm4gbiA8IDAgPyBuIDogKHN0YXR1c190KUVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICBpZiAoZmxhZyAmIDB4MDQpIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybiAobWVkaWFfc3RhdHVzX3QpIG47CiAgICAgICAgIH0KIAogICAgICAgICAvLyBQcmV2ZW50IGEgaGFybWxlc3MgdW5zaWduZWQgaW50ZWdlciBvdmVyZmxvdyBieSBjbGFtcGluZyB0byAwCkBAIC04MTYsMzYgKzkwMywzOCBAQAogICAgICAgICAgICAgICAgIC8vIGlzIGFscmVhZHkgY29tcGxldGUuCiAKICAgICAgICAgICAgICAgICBpZiAodGltZVVzID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tZXRhX2RhdGEoKS5zZXRJbnQ2NChrS2V5VGltZSwgdGltZVVzKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgdGltZVVzKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKAotICAgICAgICAgICAgICAgICAgICAgICAga0tleVZhbGlkU2FtcGxlcywgbUN1cnJlbnRQYWdlU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIoCisgICAgICAgICAgICAgICAgICAgICAgICBtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMsIG1DdXJyZW50UGFnZVNhbXBsZXMpOwogICAgICAgICAgICAgICAgIG1GaXJzdFBhY2tldEluUGFnZSA9IGZhbHNlOwogCiAgICAgICAgICAgICAgICAgKm91dCA9IGJ1ZmZlcjsKIAotICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX09LOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogfQogCiBzdGF0dXNfdCBNeU9nZ0V4dHJhY3Rvcjo6aW5pdCgpIHsKLSAgICBtTWV0YS5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbU1pbWVUeXBlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIG1NaW1lVHlwZSk7CiAKLSAgICBzdGF0dXNfdCBlcnI7Ci0gICAgTWVkaWFCdWZmZXJCYXNlICpwYWNrZXQ7CisgICAgbWVkaWFfc3RhdHVzX3QgZXJyOworICAgIE1lZGlhQnVmZmVySGVscGVyICpwYWNrZXQ7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTnVtSGVhZGVyczsgKytpKSB7CiAgICAgICAgIC8vIGlnbm9yZSB0aW1lc3RhbXAgZm9yIGNvbmZpZ3VyYXRpb24gcGFja2V0cwotICAgICAgICBpZiAoKGVyciA9IF9yZWFkTmV4dFBhY2tldCgmcGFja2V0LCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi8gZmFsc2UpKSAhPSBPSykgeworICAgICAgICBpZiAoKGVyciA9IF9yZWFkTmV4dFBhY2tldCgmcGFja2V0LCAvKiBjYWxjVm9yYmlzVGltZXN0YW1wID0gKi8gZmFsc2UpKSAhPSBBTUVESUFfT0spIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KICAgICAgICAgQUxPR1YoInJlYWQgcGFja2V0IG9mIHNpemUgJXp1XG4iLCBwYWNrZXQtPnJhbmdlX2xlbmd0aCgpKTsKICAgICAgICAgZXJyID0gdmVyaWZ5SGVhZGVyKHBhY2tldCwgLyogdHlwZSA9ICovIGkgKiAyICsgMSk7CiAgICAgICAgIHBhY2tldC0+cmVsZWFzZSgpOwogICAgICAgICBwYWNrZXQgPSBOVUxMOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIGlmIChlcnIgIT0gQU1FRElBX09LKSB7CiAgICAgICAgICAgICByZXR1cm4gZXJyOwogICAgICAgICB9CiAgICAgfQpAQCAtODY1LDEyICs5NTQsMTIgQEAKIAogICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSBnZXRUaW1lVXNPZkdyYW51bGUobGFzdEdyYW51bGVQb3NpdGlvbik7CiAKLSAgICAgICAgbU1ldGEuc2V0SW50NjQoa0tleUR1cmF0aW9uLCBkdXJhdGlvblVzKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCBkdXJhdGlvblVzKTsKIAogICAgICAgICBidWlsZFRhYmxlT2ZDb250ZW50cygpOwogICAgIH0KIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiB2b2lkIE15T2dnRXh0cmFjdG9yOjpidWlsZFRhYmxlT2ZDb250ZW50cygpIHsKQEAgLTkwMiw3ICs5OTEsNyBAQAogICAgICAgICBzaXplX3QgZGVub20gPSBudW1lcmF0b3IgLSBrTWF4TnVtVE9DRW50cmllczsKIAogICAgICAgICBzaXplX3QgYWNjdW0gPSAwOwotICAgICAgICBmb3IgKHNzaXplX3QgaSA9IG1UYWJsZU9mQ29udGVudHMuc2l6ZSgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgICAgZm9yIChzc2l6ZV90IGkgPSBtVGFibGVPZkNvbnRlbnRzLnNpemUoKTsgaSA+IDA7IC0taSkgewogICAgICAgICAgICAgYWNjdW0gKz0gZGVub207CiAgICAgICAgICAgICBpZiAoYWNjdW0gPj0gbnVtZXJhdG9yKSB7CiAgICAgICAgICAgICAgICAgbVRhYmxlT2ZDb250ZW50cy5yZW1vdmVBdChpKTsKQEAgLTkxMiw3ICsxMDAxLDcgQEAKICAgICB9CiB9CiAKLWludDMyX3QgTXlPZ2dFeHRyYWN0b3I6OmdldFBhY2tldEJsb2NrU2l6ZShNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgeworaW50MzJfdCBNeU9nZ0V4dHJhY3Rvcjo6Z2V0UGFja2V0QmxvY2tTaXplKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpIHsKICAgICBjb25zdCB1aW50OF90ICpkYXRhID0KICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CiAKQEAgLTk1Miw3ICsxMDQxLDcgQEAKICAgICByZXR1cm4gcGNtU2FtcGxlUG9zaXRpb24gKiAxMDAwMDAwbGwgLyBrT3B1c1NhbXBsZVJhdGU7CiB9CiAKLXN0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyLCB1aW50OF90IHR5cGUpIHsKK21lZGlhX3N0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5SGVhZGVyKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgewogICAgIHN3aXRjaCAodHlwZSkgewogICAgICAgICAvLyB0aGVyZSBhcmUgYWN0dWFsbHkgbm8gaGVhZGVyIHR5cGVzIGRlZmluZWQgaW4gdGhlIE9wdXMgc3BlYzsgd2UgY2hvb3NlIDEgYW5kIDMgdG8gbWVhbgogICAgICAgICAvLyBoZWFkZXIgYW5kIGNvbW1lbnRzIHN1Y2ggdGhhdCB3ZSBjYW4gc2hhcmUgY29kZSB3aXRoIE15Vm9yYmlzRXh0cmFjdG9yLgpAQCAtOTYxLDExICsxMDUwLDExIEBACiAgICAgICAgIGNhc2UgMzoKICAgICAgICAgICAgIHJldHVybiB2ZXJpZnlPcHVzQ29tbWVudHMoYnVmZmVyKTsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogfQogCi1zdGF0dXNfdCBNeU9wdXNFeHRyYWN0b3I6OnZlcmlmeU9wdXNIZWFkZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKK21lZGlhX3N0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5T3B1c0hlYWRlcihNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyKSB7CiAgICAgY29uc3Qgc2l6ZV90IGtPcHVzSGVhZGVyU2l6ZSA9IDE5OwogICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPQogICAgICAgICAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpICsgYnVmZmVyLT5yYW5nZV9vZmZzZXQoKTsKQEAgLTk3NSwyOSArMTA2NCwzMSBAQAogICAgIGlmIChzaXplIDwga09wdXNIZWFkZXJTaXplCiAgICAgICAgICAgICB8fCBtZW1jbXAoZGF0YSwgIk9wdXNIZWFkIiwgOCkKICAgICAgICAgICAgIHx8IC8qIHZlcnNpb24gPSAqLyBkYXRhWzhdICE9IDEpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgbUNoYW5uZWxDb3VudCA9IGRhdGFbOV07CiAgICAgbUNvZGVjRGVsYXkgPSBVMTZMRV9BVCgmZGF0YVsxMF0pOwogCi0gICAgbU1ldGEuc2V0RGF0YShrS2V5T3B1c0hlYWRlciwgMCwgZGF0YSwgc2l6ZSk7Ci0gICAgbU1ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIGtPcHVzU2FtcGxlUmF0ZSk7Ci0gICAgbU1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbUNoYW5uZWxDb3VudCk7Ci0gICAgbU1ldGEuc2V0SW50NjQoa0tleU9wdXNTZWVrUHJlUm9sbCAvKiBucyAqLywga09wdXNTZWVrUHJlUm9sbFVzICogMTAwMCAvKiA9IDgwIG1zKi8pOwotICAgIG1NZXRhLnNldEludDY0KGtLZXlPcHVzQ29kZWNEZWxheSAvKiBucyAqLywKLSAgICAgICAgICAgIG1Db2RlY0RlbGF5IC8qIHNhbXBsZS9zICovICogMTAwMDAwMDAwMGxsIC8ga09wdXNTYW1wbGVSYXRlKTsKKyAgICAvLyBrS2V5T3B1c0hlYWRlciBpcyBjc2QtMAorICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGRhdGEsIHNpemUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwga09wdXNTYW1wbGVSYXRlKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbUNoYW5uZWxDb3VudCk7CisgICAgaW50NjRfdCBjb2RlY2RlbGF5ID0gbUNvZGVjRGVsYXkgLyogc2FtcGxlL3MgKi8gKiAxMDAwMDAwMDAwbGwgLyBrT3B1c1NhbXBsZVJhdGU7CisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMSwgJmNvZGVjZGVsYXksIHNpemVvZihjb2RlY2RlbGF5KSk7CisgICAgaW50NjRfdCBwcmVyb2xsID0ga09wdXNTZWVrUHJlUm9sbFVzICogMTAwMCAvKiA9IDgwIG1zKi87CisgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMiwgJnByZXJvbGwsIHNpemVvZihwcmVyb2xsKSk7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTXlPcHVzRXh0cmFjdG9yOjp2ZXJpZnlPcHVzQ29tbWVudHMoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKK21lZGlhX3N0YXR1c190IE15T3B1c0V4dHJhY3Rvcjo6dmVyaWZ5T3B1c0NvbW1lbnRzKE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIpIHsKICAgICAvLyBhZGQgYXJ0aWZpY2lhbCBmcmFtaW5nIGJpdCBzbyB3ZSBjYW4gcmV1c2UgX3ZvcmJpc191bnBhY2tfY29tbWVudAogICAgIGludDMyX3QgY29tbWVudFNpemUgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpICsgMTsKICAgICBhdXRvIHRtcCA9IGhlYXBidWZmZXI8dWludDhfdD4oY29tbWVudFNpemUpOwogICAgIHVpbnQ4X3QgKmNvbW1lbnREYXRhID0gdG1wLmdldCgpOwogICAgIGlmIChjb21tZW50RGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAogICAgIG1lbWNweShjb21tZW50RGF0YSwKQEAgLTEwMjYsMTQgKzExMTcsMTQgQEAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlckxlbjsgKytpKSB7CiAgICAgICAgIGNoYXIgY2hyID0gb2dncGFja19yZWFkKCZiaXRzLCA4KTsKICAgICAgICAgaWYgKGNociAhPSBPcHVzVGFnc1tpXSkgewotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9CiAgICAgfQogCiAgICAgaW50MzJfdCB2ZW5kb3JMZW4gPSBvZ2dwYWNrX3JlYWQoJmJpdHMsIDMyKTsKICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IDQ7CiAgICAgaWYgKHZlbmRvckxlbiA8IDAgfHwgdmVuZG9yTGVuID4gY29tbWVudFNpemUgLSA4KSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICAvLyBza2lwIHZlbmRvciBzdHJpbmcKICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IHZlbmRvckxlbjsKQEAgLTEwNDQsMTMgKzExMzUsMTMgQEAKICAgICBpbnQzMl90IG4gPSBvZ2dwYWNrX3JlYWQoJmJpdHMsIDMyKTsKICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IDQ7CiAgICAgaWYgKG4gPCAwIHx8IG4gPiAoKGNvbW1lbnRTaXplIC0gb2dncGFja19ieXRlcygmYml0cykpID4+IDIpKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgICAgICBpbnQzMl90IGxlbiA9IG9nZ3BhY2tfcmVhZCgmYml0cywgMzIpOwogICAgICAgICBmcmFtaW5nQml0T2Zmc2V0ICs9IDQ7CiAgICAgICAgIGlmIChsZW4gIDwgMCB8fCBsZW4gID4gKGNvbW1lbnRTaXplIC0gb2dncGFja19ieXRlcygmYml0cykpKSB7Ci0gICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KICAgICAgICAgZnJhbWluZ0JpdE9mZnNldCArPSBsZW47CiAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbGVuOyArK2opIHsKQEAgLTEwNTgsNyArMTE0OSw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKGZyYW1pbmdCaXRPZmZzZXQgPCAwIHx8IGZyYW1pbmdCaXRPZmZzZXQgPj0gY29tbWVudFNpemUpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogICAgIGNvbW1lbnREYXRhW2ZyYW1pbmdCaXRPZmZzZXRdID0gMTsKIApAQCAtMTA3NSwyMiArMTE2NiwyMyBAQAogICAgIG9nZ3BhY2tfcmVhZGluaXQoJmJpdHMsICZyZWYpOwogICAgIGludCBlcnIgPSBfdm9yYmlzX3VucGFja19jb21tZW50KCZtVmMsICZiaXRzKTsKICAgICBpZiAoMCAhPSBlcnIpIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCiAgICAgcGFyc2VGaWxlTWV0YURhdGEoKTsKLSAgICByZXR1cm4gT0s7CisgICAgc2V0Q2hhbm5lbE1hc2sobUNoYW5uZWxDb3VudCk7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotc3RhdHVzX3QgTXlWb3JiaXNFeHRyYWN0b3I6OnZlcmlmeUhlYWRlcigKLSAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIsIHVpbnQ4X3QgdHlwZSkgeworbWVkaWFfc3RhdHVzX3QgTXlWb3JiaXNFeHRyYWN0b3I6OnZlcmlmeUhlYWRlcigKKyAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciwgdWludDhfdCB0eXBlKSB7CiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9CiAgICAgICAgIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOwogCiAgICAgc2l6ZV90IHNpemUgPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOwogCiAgICAgaWYgKHNpemUgPCA3IHx8IGRhdGFbMF0gIT0gdHlwZSB8fCBtZW1jbXAoJmRhdGFbMV0sICJ2b3JiaXMiLCA2KSkgewotICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKICAgICBvZ2dfYnVmZmVyIGJ1ZjsKQEAgLTExMDksNyArMTIwMSw3IEBACiAgICAgb2dncGFja19yZWFkaW5pdCgmYml0cywgJnJlZik7CiAKICAgICBpZiAob2dncGFja19yZWFkKCZiaXRzLCA4KSAhPSB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogICAgIH0KICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IDY7ICsraSkgewogICAgICAgICBvZ2dwYWNrX3JlYWQoJmJpdHMsIDgpOyAgLy8gc2tpcCAndm9yYmlzJwpAQCAtMTExOSwxMyArMTIxMSwxMyBAQAogICAgICAgICBjYXNlIDE6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2luZm8oJm1WaSwgJmJpdHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbU1ldGEuc2V0RGF0YShrS2V5Vm9yYmlzSW5mbywgMCwgZGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICBtTWV0YS5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgbVZpLnJhdGUpOwotICAgICAgICAgICAgbU1ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgbVZpLmNoYW5uZWxzKTsKLSAgICAgICAgICAgIG1NZXRhLnNldEludDMyKGtLZXlCaXRSYXRlLCBtVmkuYml0cmF0ZV9ub21pbmFsKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzAsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCBtVmkucmF0ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbVZpLmNoYW5uZWxzKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURSwgbVZpLmJpdHJhdGVfbm9taW5hbCk7CiAKICAgICAgICAgICAgIEFMT0dWKCJsb3dlci1iaXRyYXRlID0gJWxkIiwgbVZpLmJpdHJhdGVfbG93ZXIpOwogICAgICAgICAgICAgQUxPR1YoInVwcGVyLWJpdHJhdGUgPSAlbGQiLCBtVmkuYml0cmF0ZV91cHBlcik7CkBAIC0xMTQwLDcgKzEyMzIsNyBAQAogICAgICAgICAgICAgaWYgKG1Tb3VyY2UtPmdldFNpemUoJnNpemUpID09IE9LKSB7CiAgICAgICAgICAgICAgICAgdWludDY0X3QgYnBzID0gYXBwcm94Qml0cmF0ZSgpOwogICAgICAgICAgICAgICAgIGlmIChicHMgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtTWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIHNpemUgKiA4MDAwMDAwbGwgLyBicHMpOworICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIHNpemUgKiA4MDAwMDAwbGwgLyBicHMpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwpAQCAtMTE0OSwyNSArMTI0MSwyNiBAQAogICAgICAgICBjYXNlIDM6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICgwICE9IF92b3JiaXNfdW5wYWNrX2NvbW1lbnQoJm1WYywgJmJpdHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgcGFyc2VGaWxlTWV0YURhdGEoKTsKKyAgICAgICAgICAgIHNldENoYW5uZWxNYXNrKG1WaS5jaGFubmVscyk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgNToKICAgICAgICAgewogICAgICAgICAgICAgaWYgKDAgIT0gX3ZvcmJpc191bnBhY2tfYm9va3MoJm1WaSwgJmJpdHMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgbU1ldGEuc2V0RGF0YShrS2V5Vm9yYmlzQm9va3MsIDAsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMSwgZGF0YSwgc2l6ZSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiBPSzsKKyAgICByZXR1cm4gQU1FRElBX09LOwogfQogCiB1aW50NjRfdCBNeVZvcmJpc0V4dHJhY3Rvcjo6YXBwcm94Qml0cmF0ZSgpIGNvbnN0IHsKQEAgLTExODAsMjAgKzEyNzMsNDUgQEAKIAogCiB2b2lkIE15T2dnRXh0cmFjdG9yOjpwYXJzZUZpbGVNZXRhRGF0YSgpIHsKLSAgICBtRmlsZU1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0cpOworICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUZpbGVNZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9PR0cpOwogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtVmMuY29tbWVudHM7ICsraSkgewogICAgICAgICBjb25zdCBjaGFyICpjb21tZW50ID0gbVZjLnVzZXJfY29tbWVudHNbaV07CiAgICAgICAgIHNpemVfdCBjb21tZW50TGVuZ3RoID0gbVZjLmNvbW1lbnRfbGVuZ3Roc1tpXTsKLSAgICAgICAgcGFyc2VWb3JiaXNDb21tZW50KCZtRmlsZU1ldGEsIGNvbW1lbnQsIGNvbW1lbnRMZW5ndGgpOworICAgICAgICBwYXJzZVZvcmJpc0NvbW1lbnQobUZpbGVNZXRhLCBjb21tZW50LCBjb21tZW50TGVuZ3RoKTsKICAgICAgICAgLy9BTE9HSSgiY29tbWVudCAjJWQ6ICclcyciLCBpICsgMSwgbVZjLnVzZXJfY29tbWVudHNbaV0pOwogICAgIH0KKworICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtRmlsZU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSEFQVElDX0NIQU5ORUxfQ09VTlQsICZtSGFwdGljQ2hhbm5lbENvdW50KTsKK30KKwordm9pZCBNeU9nZ0V4dHJhY3Rvcjo6c2V0Q2hhbm5lbE1hc2soaW50IGNoYW5uZWxDb3VudCkgeworICAgIC8vIFNldCBjaGFubmVsIG1hc2sgYWNjb3JkaW5nIHRvIGNoYW5uZWwgY291bnQuIFdoZW4gaGFwdGljIGNoYW5uZWwgY291bnQgaXMgZm91bmQgaW4KKyAgICAvLyBmaWxlIG1ldGEsIHNldCBoYXB0aWMgY2hhbm5lbCBtYXNrIHRvIHRyeSBoYXB0aWMgcGxheWJhY2suCisgICAgaWYgKG1IYXB0aWNDaGFubmVsQ291bnQgPiAwKSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGhhcHRpY0NoYW5uZWxNYXNrID0KKyAgICAgICAgICAgICAgICBoYXB0aWNfY2hhbm5lbF9tYXNrX2Zyb21fY291bnQobUhhcHRpY0NoYW5uZWxDb3VudCk7CisgICAgICAgIGNvbnN0IGludDMyX3QgYXVkaW9DaGFubmVsQ291bnQgPSBjaGFubmVsQ291bnQgLSBtSGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICBpZiAoaGFwdGljQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9JTlZBTElECisgICAgICAgICAgICAgICAgfHwgYXVkaW9DaGFubmVsQ291bnQgPD0gMCB8fCBhdWRpb0NoYW5uZWxDb3VudCA+IEZDQ184KSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBoYXB0aWMgY2hhbm5lbCBjb3VudCBmb3VuZCBpbiBtZXRhZGF0YTogJWQiLCBtSGFwdGljQ2hhbm5lbENvdW50KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KAorICAgICAgICAgICAgICAgICAgICBhdWRpb0NoYW5uZWxDb3VudCkgfCBoYXB0aWNDaGFubmVsTWFzazsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0ssIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgbU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSEFQVElDX0NIQU5ORUxfQ09VTlQsIG1IYXB0aWNDaGFubmVsQ291bnQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfTUFTSywKKyAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KSk7CisgICAgfQogfQogCiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLU9nZ0V4dHJhY3Rvcjo6T2dnRXh0cmFjdG9yKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpCitPZ2dFeHRyYWN0b3I6Ok9nZ0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShzb3VyY2UpLAogICAgICAgbUluaXRDaGVjayhOT19JTklUKSwKICAgICAgIG1JbXBsKE5VTEwpIHsKQEAgLTEyMjAsMTMgKzEzMzgsMTQgQEAKIE9nZ0V4dHJhY3Rvcjo6fk9nZ0V4dHJhY3RvcigpIHsKICAgICBkZWxldGUgbUltcGw7CiAgICAgbUltcGwgPSBOVUxMOworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKIH0KIAogc2l6ZV90IE9nZ0V4dHJhY3Rvcjo6Y291bnRUcmFja3MoKSB7CiAgICAgcmV0dXJuIG1Jbml0Q2hlY2sgIT0gT0sgPyAwIDogMTsKIH0KIAotTWVkaWFUcmFjayAqT2dnRXh0cmFjdG9yOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKK01lZGlhVHJhY2tIZWxwZXIgKk9nZ0V4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CiAgICAgaWYgKGluZGV4ID49IDEpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQpAQCAtMTIzNCwzMyArMTM1MywzNCBAQAogICAgIHJldHVybiBuZXcgT2dnU291cmNlKHRoaXMpOwogfQogCi1zdGF0dXNfdCBPZ2dFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IE9nZ0V4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKGluZGV4ID49IDEpIHsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKICAgICB9CiAKICAgICByZXR1cm4gbUltcGwtPmdldEZvcm1hdChtZXRhKTsKIH0KIAotc3RhdHVzX3QgT2dnRXh0cmFjdG9yOjpnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKK21lZGlhX3N0YXR1c190IE9nZ0V4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgcmV0dXJuIG1JbXBsLT5nZXRGaWxlTWV0YURhdGEobWV0YSk7CiB9CiAKLXN0YXRpYyBNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENNZWRpYUV4dHJhY3RvciogQ3JlYXRlRXh0cmFjdG9yKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICB2b2lkICopIHsKLSAgICByZXR1cm4gbmV3IE9nZ0V4dHJhY3Rvcihzb3VyY2UpOworICAgIHJldHVybiB3cmFwKG5ldyBPZ2dFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIoc291cmNlKSkpOwogfQogCi1zdGF0aWMgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIFNuaWZmKAotICAgICAgICBEYXRhU291cmNlQmFzZSAqc291cmNlLAorc3RhdGljIENyZWF0b3JGdW5jIFNuaWZmKAorICAgICAgICBDRGF0YVNvdXJjZSAqc291cmNlLAogICAgICAgICBmbG9hdCAqY29uZmlkZW5jZSwKICAgICAgICAgdm9pZCAqKiwKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkZyZWVNZXRhRnVuYyAqKSB7CisgICAgICAgIEZyZWVNZXRhRnVuYyAqKSB7CisgICAgRGF0YVNvdXJjZUhlbHBlciBoZWxwZXIoc291cmNlKTsKICAgICBjaGFyIHRtcFs0XTsKLSAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgdG1wLCA0KSA8IDQgfHwgbWVtY21wKHRtcCwgIk9nZ1MiLCA0KSkgeworICAgIGlmIChoZWxwZXIucmVhZEF0KDAsIHRtcCwgNCkgPCA0IHx8IG1lbWNtcCh0bXAsICJPZ2dTIiwgNCkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC0xMjY5LDE2ICsxMzg5LDIzIEBACiAgICAgcmV0dXJuIENyZWF0ZUV4dHJhY3RvcjsKIH0KIAorc3RhdGljIGNvbnN0IGNoYXIgKmV4dGVuc2lvbnNbXSA9IHsKKyAgICAib2dhIiwKKyAgICAib2dnIiwKKyAgICAib3B1cyIsCisgICAgTlVMTAorfTsKKwogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgVVVJRCgiOGNjNWNkMDYtZjc3Mi00OTVlLThhNjItY2JhOTY0OTM3NGU5IiksCiAgICAgICAgIDEsIC8vIHZlcnNpb24KICAgICAgICAgIk9nZyBFeHRyYWN0b3IiLAotICAgICAgICBTbmlmZgorICAgICAgICB7IC52MyA9IHtTbmlmZiwgZXh0ZW5zaW9uc30gfSwKICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL29nZy9PZ2dFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5oCmluZGV4IDlmZTI5NDQuLmM3NWRmYTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvb2dnL09nZ0V4dHJhY3Rvci5oCkBAIC0xOSwyNSArMTksMjYgQEAKICNkZWZpbmUgT0dHX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7Ci1jbGFzcyBEYXRhU291cmNlQmFzZTsKIGNsYXNzIFN0cmluZzg7CiAKIHN0cnVjdCBNeU9nZ0V4dHJhY3RvcjsKIHN0cnVjdCBPZ2dTb3VyY2U7CiAKLXN0cnVjdCBPZ2dFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3IgewotICAgIGV4cGxpY2l0IE9nZ0V4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKK3N0cnVjdCBPZ2dFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgeworICAgIGV4cGxpY2l0IE9nZ0V4dHJhY3RvcihEYXRhU291cmNlSGVscGVyICpzb3VyY2UpOwogCiAgICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKTsKLSAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSwgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrSGVscGVyICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKTsKICAgICB2aXJ0dWFsIGNvbnN0IGNoYXIgKiBuYW1lKCkgeyByZXR1cm4gIk9nZ0V4dHJhY3RvciI7IH0KIAogcHJvdGVjdGVkOgpAQCAtNDYsNyArNDcsNyBAQAogcHJpdmF0ZToKICAgICBmcmllbmQgc3RydWN0IE9nZ1NvdXJjZTsKIAotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBEYXRhU291cmNlSGVscGVyICptRGF0YVNvdXJjZTsKICAgICBzdGF0dXNfdCBtSW5pdENoZWNrOwogCiAgICAgTXlPZ2dFeHRyYWN0b3IgKm1JbXBsOwpkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1OWMzMDgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw5NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJFeHRyYWN0b3JVbml0VGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbIkV4dHJhY3RvclVuaXRUZXN0LmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmFhY2V4dHJhY3RvciIsCisgICAgICAgICJsaWJhbXJleHRyYWN0b3IiLAorICAgICAgICAibGlibXAzZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYndhdmV4dHJhY3RvciIsCisgICAgICAgICJsaWJvZ2dleHRyYWN0b3IiLAorICAgICAgICAibGliZmxhY2V4dHJhY3RvciIsCisgICAgICAgICJsaWJtaWRpZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1rdmV4dHJhY3RvciIsCisgICAgICAgICJsaWJtcGVnMmV4dHJhY3RvciIsCisgICAgICAgICJsaWJtcDRleHRyYWN0b3IiLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJkYXRhc291cmNlIiwKKworICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfaWQzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZsYWNkZWMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZXNkcyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXBlZzJleHRyYWN0b3IiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tZXRhZGF0YXV0aWxzIiwKKworICAgICAgICAibGlibWVkaWFfbWlkaWlvd3JhcHBlciIsCisgICAgICAgICJsaWJzb25pdm94IiwKKyAgICAgICAgImxpYnZvcmJpc2lkZWMiLAorICAgICAgICAibGlid2VibSIsCisgICAgICAgICJsaWJGTEFDIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJjcnlwdG8iLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzLyIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0LyIsCisgICAgXSwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICJmaXJzdCIsCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBsZGZsYWdzOiBbCisgICAgICAgICItV2wiLAorICAgICAgICAiLUJzeW1ib2xpYyIsCisgICAgICAgIC8vIHRvIGlnbm9yZSBkdXBsaWNhdGUgc3ltYm9sOiBHRVRFWFRSQUNUT1JERUYKKyAgICAgICAgIi16IG11bGRlZnMiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZiYjJjOGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgZXh0cmFjdG9yIHVuaXQgdGVzdHMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJFeHRyYWN0b3JVbml0VGVzdCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJFeHRyYWN0b3JVbml0VGVzdC0+L2RhdGEvbG9jYWwvdG1wL0V4dHJhY3RvclVuaXRUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL2V4dHJhY3Rvci56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvRXh0cmFjdG9yVW5pdFRlc3RSZXMvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJFeHRyYWN0b3JVbml0VGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL0V4dHJhY3RvclVuaXRUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0V4dHJhY3RvclVuaXRUZXN0LmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvRXh0cmFjdG9yVW5pdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOGE3ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3Rlc3RzL0V4dHJhY3RvclVuaXRUZXN0LmNwcApAQCAtMCwwICsxLDc4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRXh0cmFjdG9yVW5pdFRlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxkYXRhc291cmNlL0ZpbGVTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuaD4KKworI2luY2x1ZGUgImFhYy9BQUNFeHRyYWN0b3IuaCIKKyNpbmNsdWRlICJhbXIvQU1SRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiZmxhYy9GTEFDRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAibWlkaS9NaWRpRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAibWt2L01hdHJvc2thRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAibXAzL01QM0V4dHJhY3Rvci5oIgorI2luY2x1ZGUgIm1wNC9NUEVHNEV4dHJhY3Rvci5oIgorI2luY2x1ZGUgIm1wNC9TYW1wbGVUYWJsZS5oIgorI2luY2x1ZGUgIm1wZWcyL01QRUcyUFNFeHRyYWN0b3IuaCIKKyNpbmNsdWRlICJtcGVnMi9NUEVHMlRTRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAib2dnL09nZ0V4dHJhY3Rvci5oIgorI2luY2x1ZGUgIndhdi9XQVZFeHRyYWN0b3IuaCIKKworI2luY2x1ZGUgIkV4dHJhY3RvclVuaXRUZXN0RW52aXJvbm1lbnQuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7CisKKyNkZWZpbmUgT1VUUFVUX0RVTVBfRklMRSAiL2RhdGEvbG9jYWwvdG1wL2V4dHJhY3Rvck91dHB1dCIKKworY29uc3RleHByIGludDMyX3Qga01heENvdW50ID0gMTA7Citjb25zdGV4cHIgaW50MzJfdCBrQXVkaW9EZWZhdWx0U2FtcGxlRHVyYXRpb24gPSAyMDAwMDsgICAgICAgICAgICAgICAgICAgICAgIC8vIDIwbXMKK2NvbnN0ZXhwciBpbnQzMl90IGtSYW5kb21TZWVrVG9sZXJhbmNlVXMgPSAyICoga0F1ZGlvRGVmYXVsdFNhbXBsZUR1cmF0aW9uOyAgLy8gNDAgbXM7Citjb25zdGV4cHIgaW50MzJfdCBrUmFuZG9tU2VlZCA9IDcwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtVbmRlZmluZWQgPSAtMTsKKworLy8gTG9va1VwVGFibGUgb2YgY2xpcHMgYW5kIG1ldGFkYXRhIGZvciBjb21wb25lbnQgdGVzdGluZworc3RhdGljIGNvbnN0IHN0cnVjdCBJbnB1dERhdGEgeworICAgIHN0cmluZyBtaW1lOworICAgIHN0cmluZyBpbnB1dEZpbGU7CisgICAgaW50MzJfdCBmaXJzdFBhcmFtOworICAgIGludDMyX3Qgc2Vjb25kUGFyYW07CisgICAgaW50MzJfdCBwcm9maWxlOworICAgIGludDMyX3QgZnJhbWVSYXRlOworfSBrSW5wdXREYXRhW10gPSB7CisgICAgICAgIHtNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJ0ZXN0X21vbm9fNDQxMDBIel9hYWMuYWFjIiwgNDQxMDAsIDEsIEFBQ09iamVjdExDLCBrVW5kZWZpbmVkfSwKKyAgICAgICAge01FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgImJiYl9tb25vXzhrSHpfYW1ybmIuYW1yIiwgODAwMCwgMSwga1VuZGVmaW5lZCwga1VuZGVmaW5lZH0sCisgICAgICAgIHtNRURJQV9NSU1FVFlQRV9BVURJT19BTVJfV0IsICJiYmJfbW9ub18xNmtIel9hbXJ3Yi5hbXIiLCAxNjAwMCwgMSwga1VuZGVmaW5lZCwga1VuZGVmaW5lZH0sCisgICAgICAgIHtNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsICJiYmJfc3RlcmVvXzQ4a0h6X3ZvcmJpcy5vZ2ciLCA0ODAwMCwgMiwga1VuZGVmaW5lZCwKKyAgICAgICAgIGtVbmRlZmluZWR9LAorICAgICAgICB7TUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00sICJ0ZXN0X21vbm9fOGtIel9nc20ud2F2IiwgODAwMCwgMSwga1VuZGVmaW5lZCwga1VuZGVmaW5lZH0sCisgICAgICAgIHtNRURJQV9NSU1FVFlQRV9BVURJT19SQVcsICJiYmJfc3RlcmVvXzQ4a0h6X2ZsYWMuZmxhYyIsIDQ4MDAwLCAyLCBrVW5kZWZpbmVkLCBrVW5kZWZpbmVkfSwKKyAgICAgICAge01FRElBX01JTUVUWVBFX0FVRElPX09QVVMsICJ0ZXN0X3N0ZXJlb180OGtIel9vcHVzLm9wdXMiLCA0ODAwMCwgMiwga1VuZGVmaW5lZCwKKyAgICAgICAgIGtVbmRlZmluZWR9LAorICAgICAgICB7TUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRywgImJiYl9zdGVyZW9fNDhrSHpfbXAzLm1wMyIsIDQ4MDAwLCAyLCBrVW5kZWZpbmVkLCBrVW5kZWZpbmVkfSwKKyAgICAgICAge01FRElBX01JTUVUWVBFX0FVRElPX1JBVywgIm1pZGlfYS5taWQiLCAyMjA1MCwgMiwga1VuZGVmaW5lZCwga1VuZGVmaW5lZH0sCisgICAgICAgIHtNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHMiwgImJiYl9jaWZfNzY4a2Jwc18zMGZwc19tcGVnMi50cyIsIDM1MiwgMjg4LCBNUEVHMlByb2ZpbGVNYWluLAorICAgICAgICAgMzB9LAorICAgICAgICB7TUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJiYmJfY2lmXzc2OGticHNfMzBmcHNfbXBlZzQubWt2IiwgMzUyLCAyODgsCisgICAgICAgICBNUEVHNFByb2ZpbGVTaW1wbGUsIDMwfSwKKyAgICAgICAgLy8gVGVzdCAoYi8xNTE2NzcyNjQpIGZvciBNUDQgZXh0cmFjdG9yCisgICAgICAgIHtNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDLCAiY3Jvd2RfNTA4eDI0MF8yNWZwc19oZXZjLm1wNCIsIDUwOCwgMjQwLCBIRVZDUHJvZmlsZU1haW4sCisgICAgICAgICAyNX0sCisgICAgICAgIHtNRURJQV9NSU1FVFlQRV9WSURFT19WUDksICJiYmJfMzQweDI4MF8zMGZwc192cDkud2VibSIsIDM0MCwgMjgwLCBWUDlQcm9maWxlMCwgMzB9LAorICAgICAgICB7TUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIsICJzd2lybF8xNDR4MTM2X21wZWcyLm1wZyIsIDE0NCwgMTM2LCBNUEVHMlByb2ZpbGVNYWluLCAxMn0sCit9OworCitzdGF0aWMgRXh0cmFjdG9yVW5pdFRlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK2NsYXNzIEV4dHJhY3RvclVuaXRUZXN0IHsKKyAgcHVibGljOgorICAgIEV4dHJhY3RvclVuaXRUZXN0KCkgOiBtSW5wdXRGcChudWxscHRyKSwgbURhdGFTb3VyY2UobnVsbHB0ciksIG1FeHRyYWN0b3IobnVsbHB0cikge30KKworICAgIH5FeHRyYWN0b3JVbml0VGVzdCgpIHsKKyAgICAgICAgaWYgKG1JbnB1dEZwKSB7CisgICAgICAgICAgICBmY2xvc2UobUlucHV0RnApOworICAgICAgICAgICAgbUlucHV0RnAgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGlmIChtRGF0YVNvdXJjZSkgeworICAgICAgICAgICAgbURhdGFTb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgICAgIG1EYXRhU291cmNlID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAobUV4dHJhY3RvcikgeworICAgICAgICAgICAgZGVsZXRlIG1FeHRyYWN0b3I7CisgICAgICAgICAgICBtRXh0cmFjdG9yID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgc2V0dXBFeHRyYWN0b3Ioc3RyaW5nIHdyaXRlckZvcm1hdCkgeworICAgICAgICBtRXh0cmFjdG9yTmFtZSA9IHVua25vd25fY29tcDsKKyAgICAgICAgbURpc2FibGVUZXN0ID0gZmFsc2U7CisKKyAgICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGFuZGFyZEV4dHJhY3RvcnM+IG1hcEV4dHJhY3RvciA9IHsKKyAgICAgICAgICAgICAgICB7ImFhYyIsIEFBQ30sICAgICB7ImFtciIsIEFNUn0sICAgICAgICAgeyJtcDMiLCBNUDN9LCAgICAgICAgeyJvZ2ciLCBPR0d9LAorICAgICAgICAgICAgICAgIHsid2F2IiwgV0FWfSwgICAgIHsibWt2IiwgTUtWfSwgICAgICAgICB7ImZsYWMiLCBGTEFDfSwgICAgICB7Im1pZGkiLCBNSURJfSwKKyAgICAgICAgICAgICAgICB7Im1wZWc0IiwgTVBFRzR9LCB7Im1wZWcydHMiLCBNUEVHMlRTfSwgeyJtcGVnMnBzIiwgTVBFRzJQU319OworICAgICAgICAvLyBGaW5kIHRoZSBjb21wb25lbnQgdHlwZQorICAgICAgICBpZiAobWFwRXh0cmFjdG9yLmZpbmQod3JpdGVyRm9ybWF0KSAhPSBtYXBFeHRyYWN0b3IuZW5kKCkpIHsKKyAgICAgICAgICAgIG1FeHRyYWN0b3JOYW1lID0gbWFwRXh0cmFjdG9yLmF0KHdyaXRlckZvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1FeHRyYWN0b3JOYW1lID09IHN0YW5kYXJkRXh0cmFjdG9yczo6dW5rbm93bl9jb21wKSB7CisgICAgICAgICAgICBjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkLiBJbnZhbGlkIGV4dHJhY3RvclxuIjsKKyAgICAgICAgICAgIG1EaXNhYmxlVGVzdCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpbnQzMl90IHNldERhdGFTb3VyY2Uoc3RyaW5nIGlucHV0RmlsZU5hbWUpOworCisgICAgaW50MzJfdCBjcmVhdGVFeHRyYWN0b3IoKTsKKworICAgIGVudW0gc3RhbmRhcmRFeHRyYWN0b3JzIHsKKyAgICAgICAgQUFDLAorICAgICAgICBBTVIsCisgICAgICAgIEZMQUMsCisgICAgICAgIE1JREksCisgICAgICAgIE1LViwKKyAgICAgICAgTVAzLAorICAgICAgICBNUEVHNCwKKyAgICAgICAgTVBFRzJQUywKKyAgICAgICAgTVBFRzJUUywKKyAgICAgICAgT0dHLAorICAgICAgICBXQVYsCisgICAgICAgIHVua25vd25fY29tcCwKKyAgICB9OworCisgICAgYm9vbCBtRGlzYWJsZVRlc3Q7CisgICAgc3RhbmRhcmRFeHRyYWN0b3JzIG1FeHRyYWN0b3JOYW1lOworCisgICAgRklMRSAqbUlucHV0RnA7CisgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CisgICAgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgKm1FeHRyYWN0b3I7Cit9OworCitjbGFzcyBFeHRyYWN0b3JGdW5jdGlvbmFsaXR5VGVzdCA6IHB1YmxpYyBFeHRyYWN0b3JVbml0VGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxwYWlyPHN0cmluZywgc3RyaW5nPj4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBzZXR1cEV4dHJhY3RvcihHZXRQYXJhbSgpLmZpcnN0KTsgfQorfTsKKworY2xhc3MgQ29uZmlnUGFyYW1UZXN0IDogcHVibGljIEV4dHJhY3RvclVuaXRUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxwYWlyPHN0cmluZywgaW50MzJfdD4+IHsKKyAgcHVibGljOgorICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsgc2V0dXBFeHRyYWN0b3IoR2V0UGFyYW0oKS5maXJzdCk7IH0KKworICAgIHN0cnVjdCBjb25maWdGb3JtYXQgeworICAgICAgICBzdHJpbmcgbWltZTsKKyAgICAgICAgaW50MzJfdCB3aWR0aDsKKyAgICAgICAgaW50MzJfdCBoZWlnaHQ7CisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgaW50MzJfdCBjaGFubmVsQ291bnQ7CisgICAgICAgIGludDMyX3QgcHJvZmlsZTsKKyAgICAgICAgaW50MzJfdCBmcmFtZVJhdGU7CisgICAgfTsKKworICAgIHZvaWQgZ2V0RmlsZVByb3BlcnRpZXMoaW50MzJfdCBpbnB1dElkeCwgc3RyaW5nICZpbnB1dEZpbGUsIGNvbmZpZ0Zvcm1hdCAmY29uZmlnUGFyYW0pOworfTsKKworaW50MzJfdCBFeHRyYWN0b3JVbml0VGVzdDo6c2V0RGF0YVNvdXJjZShzdHJpbmcgaW5wdXRGaWxlTmFtZSkgeworICAgIG1JbnB1dEZwID0gZm9wZW4oaW5wdXRGaWxlTmFtZS5jX3N0cigpLCAicmIiKTsKKyAgICBpZiAoIW1JbnB1dEZwKSB7CisgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gb3BlbiBpbnB1dCBmaWxlIGZvciByZWFkaW5nIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIHN0YXQoaW5wdXRGaWxlTmFtZS5jX3N0cigpLCAmYnVmKTsKKyAgICBpbnQzMl90IGZkID0gZmlsZW5vKG1JbnB1dEZwKTsKKyAgICBtRGF0YVNvdXJjZSA9IG5ldyBGaWxlU291cmNlKGR1cChmZCksIDAsIGJ1Zi5zdF9zaXplKTsKKyAgICBpZiAoIW1EYXRhU291cmNlKSByZXR1cm4gLTE7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludDMyX3QgRXh0cmFjdG9yVW5pdFRlc3Q6OmNyZWF0ZUV4dHJhY3RvcigpIHsKKyAgICBzd2l0Y2ggKG1FeHRyYWN0b3JOYW1lKSB7CisgICAgICAgIGNhc2UgQUFDOgorICAgICAgICAgICAgbUV4dHJhY3RvciA9IG5ldyBBQUNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIobURhdGFTb3VyY2UtPndyYXAoKSksIDApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQU1SOgorICAgICAgICAgICAgbUV4dHJhY3RvciA9IG5ldyBBTVJFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIobURhdGFTb3VyY2UtPndyYXAoKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVAzOgorICAgICAgICAgICAgbUV4dHJhY3RvciA9IG5ldyBNUDNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIobURhdGFTb3VyY2UtPndyYXAoKSksIG51bGxwdHIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgT0dHOgorICAgICAgICAgICAgbUV4dHJhY3RvciA9IG5ldyBPZ2dFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIobURhdGFTb3VyY2UtPndyYXAoKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV0FWOgorICAgICAgICAgICAgbUV4dHJhY3RvciA9IG5ldyBXQVZFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIobURhdGFTb3VyY2UtPndyYXAoKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUtWOgorICAgICAgICAgICAgbUV4dHJhY3RvciA9IG5ldyBNYXRyb3NrYUV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihtRGF0YVNvdXJjZS0+d3JhcCgpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGTEFDOgorICAgICAgICAgICAgbUV4dHJhY3RvciA9IG5ldyBGTEFDRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1QRUc0OgorICAgICAgICAgICAgbUV4dHJhY3RvciA9IG5ldyBNUEVHNEV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihtRGF0YVNvdXJjZS0+d3JhcCgpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNUEVHMlRTOgorICAgICAgICAgICAgbUV4dHJhY3RvciA9IG5ldyBNUEVHMlRTRXh0cmFjdG9yKG5ldyBEYXRhU291cmNlSGVscGVyKG1EYXRhU291cmNlLT53cmFwKCkpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1QRUcyUFM6CisgICAgICAgICAgICBtRXh0cmFjdG9yID0gbmV3IE1QRUcyUFNFeHRyYWN0b3IobmV3IERhdGFTb3VyY2VIZWxwZXIobURhdGFTb3VyY2UtPndyYXAoKSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTUlESToKKyAgICAgICAgICAgIG1FeHRyYWN0b3IgPSBuZXcgTWlkaUV4dHJhY3RvcihtRGF0YVNvdXJjZS0+d3JhcCgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpZiAoIW1FeHRyYWN0b3IpIHJldHVybiAtMTsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBDb25maWdQYXJhbVRlc3Q6OmdldEZpbGVQcm9wZXJ0aWVzKGludDMyX3QgaW5wdXRJZHgsIHN0cmluZyAmaW5wdXRGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ0Zvcm1hdCAmY29uZmlnUGFyYW0pIHsKKyAgICBpZiAoaW5wdXRJZHggPj0gc2l6ZW9mKGtJbnB1dERhdGEpIC8gc2l6ZW9mKGtJbnB1dERhdGFbMF0pKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW5wdXRGaWxlICs9IGtJbnB1dERhdGFbaW5wdXRJZHhdLmlucHV0RmlsZTsKKyAgICBjb25maWdQYXJhbS5taW1lID0ga0lucHV0RGF0YVtpbnB1dElkeF0ubWltZTsKKyAgICBzaXplX3QgZm91bmQgPSBjb25maWdQYXJhbS5taW1lLmZpbmQoImF1ZGlvLyIpOworICAgIC8vIENoZWNrIGlmICdhdWRpby8nIGlzIHByZXNlbnQgaW4gdGhlIGJlZ2luaW5pZyBvZiB0aGUgbWltZSB0eXBlCisgICAgaWYgKGZvdW5kID09IDApIHsKKyAgICAgICAgY29uZmlnUGFyYW0uc2FtcGxlUmF0ZSA9IGtJbnB1dERhdGFbaW5wdXRJZHhdLmZpcnN0UGFyYW07CisgICAgICAgIGNvbmZpZ1BhcmFtLmNoYW5uZWxDb3VudCA9IGtJbnB1dERhdGFbaW5wdXRJZHhdLnNlY29uZFBhcmFtOworICAgIH0gZWxzZSB7CisgICAgICAgIGNvbmZpZ1BhcmFtLndpZHRoID0ga0lucHV0RGF0YVtpbnB1dElkeF0uZmlyc3RQYXJhbTsKKyAgICAgICAgY29uZmlnUGFyYW0uaGVpZ2h0ID0ga0lucHV0RGF0YVtpbnB1dElkeF0uc2Vjb25kUGFyYW07CisgICAgfQorICAgIGNvbmZpZ1BhcmFtLnByb2ZpbGUgPSBrSW5wdXREYXRhW2lucHV0SWR4XS5wcm9maWxlOworICAgIGNvbmZpZ1BhcmFtLmZyYW1lUmF0ZSA9IGtJbnB1dERhdGFbaW5wdXRJZHhdLmZyYW1lUmF0ZTsKKyAgICByZXR1cm47Cit9CisKK3ZvaWQgcmFuZG9tU2Vla1Rlc3QoTWVkaWFUcmFja0hlbHBlciAqdHJhY2ssIGludDY0X3QgY2xpcER1cmF0aW9uKSB7CisgICAgaW50MzJfdCBzdGF0dXMgPSAwOworICAgIGludDMyX3Qgc2Vla0NvdW50ID0gMDsKKyAgICBib29sIGhhc1RpbWVzdGFtcCA9IGZhbHNlOworICAgIHZlY3RvcjxpbnQ2NF90PiBzZWVrVG9UaW1lU3RhbXA7CisgICAgc3RyaW5nIHNlZWtQdHNTdHJpbmc7CisKKyAgICBzcmFuZChrUmFuZG9tU2VlZCk7CisgICAgd2hpbGUgKHNlZWtDb3VudCA8IGtNYXhDb3VudCkgeworICAgICAgICBpbnQ2NF90IHRpbWVTdGFtcCA9ICgoZG91YmxlKXJhbmQoKSAvIFJBTkRfTUFYKSAqIGNsaXBEdXJhdGlvbjsKKyAgICAgICAgc2Vla1RvVGltZVN0YW1wLnB1c2hfYmFjayh0aW1lU3RhbXApOworICAgICAgICBzZWVrUHRzU3RyaW5nLmFwcGVuZCh0b19zdHJpbmcodGltZVN0YW1wKSk7CisgICAgICAgIHNlZWtQdHNTdHJpbmcuYXBwZW5kKCIsICIpOworICAgICAgICBzZWVrQ291bnQrKzsKKyAgICB9CisKKyAgICBmb3IgKGludDY0X3Qgc2Vla1B0cyA6IHNlZWtUb1RpbWVTdGFtcCkgeworICAgICAgICBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IG5ldyBNZWRpYVRyYWNrSGVscGVyOjpSZWFkT3B0aW9ucygKKyAgICAgICAgICAgICAgICBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX0NMT1NFU1QgfCBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLLCBzZWVrUHRzKTsKKyAgICAgICAgQVNTRVJUX05FKG9wdGlvbnMsIG51bGxwdHIpIDw8ICJDYW5ub3QgY3JlYXRlIHJlYWQgb3B0aW9uIjsKKworICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgc3RhdHVzID0gdHJhY2stPnJlYWQoJmJ1ZmZlciwgb3B0aW9ucyk7CisgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YURhdGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgaW50NjRfdCB0aW1lU3RhbXAgPSAwOworICAgICAgICAgICAgaGFzVGltZXN0YW1wID0gQU1lZGlhRm9ybWF0X2dldEludDY0KG1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICZ0aW1lU3RhbXApOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoaGFzVGltZXN0YW1wKSA8PCAiRXh0cmFjdG9yIGRpZG4ndCBzZXQgdGltZXN0YW1wIGZvciB0aGUgZ2l2ZW4gc2FtcGxlIjsKKworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBFWFBFQ1RfTEUoYWJzKHRpbWVTdGFtcCAtIHNlZWtQdHMpLCBrUmFuZG9tU2Vla1RvbGVyYW5jZVVzKQorICAgICAgICAgICAgICAgICAgICA8PCAiU2VlayB1bnN1Y2Nlc3NmdWwuIEV4cGVjdGVkIHRpbWVzdGFtcCByYW5nZSBbIgorICAgICAgICAgICAgICAgICAgICA8PCBzZWVrUHRzIC0ga1JhbmRvbVNlZWtUb2xlcmFuY2VVcyA8PCAiLCAiIDw8IHNlZWtQdHMgKyBrUmFuZG9tU2Vla1RvbGVyYW5jZVVzCisgICAgICAgICAgICAgICAgICAgIDw8ICJdICIKKyAgICAgICAgICAgICAgICAgICAgPDwgInJlY2VpdmVkICIgPDwgdGltZVN0YW1wIDw8ICIsIGxpc3Qgb2YgaW5wdXQgc2VlayB0aW1lc3RhbXBzIFsiCisgICAgICAgICAgICAgICAgICAgIDw8IHNlZWtQdHNTdHJpbmcgPDwgIl0iOworICAgICAgICB9CisgICAgICAgIGRlbGV0ZSBvcHRpb25zOworICAgIH0KK30KKwordm9pZCBnZXRTZWVrYWJsZVBvaW50cyh2ZWN0b3I8aW50NjRfdD4gJnNlZWthYmxlUG9pbnRzLCBNZWRpYVRyYWNrSGVscGVyICp0cmFjaykgeworICAgIGludDMyX3Qgc3RhdHVzID0gMDsKKyAgICBpZiAoIXNlZWthYmxlUG9pbnRzLmVtcHR5KCkpIHsKKyAgICAgICAgc2Vla2FibGVQb2ludHMuY2xlYXIoKTsKKyAgICB9CisgICAgaW50NjRfdCB0aW1lU3RhbXA7CisgICAgd2hpbGUgKHN0YXR1cyAhPSBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBNZWRpYUJ1ZmZlckhlbHBlciAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgc3RhdHVzID0gdHJhY2stPnJlYWQoJmJ1ZmZlcik7CisgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YURhdGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgaW50MzJfdCBpc1N5bmMgPSAwOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKG1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUsICZpc1N5bmMpOworICAgICAgICAgICAgaWYgKGlzU3luYykgeworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQ2NChtZXRhRGF0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCAmdGltZVN0YW1wKTsKKyAgICAgICAgICAgICAgICBzZWVrYWJsZVBvaW50cy5wdXNoX2JhY2sodGltZVN0YW1wKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOworICAgICAgICB9CisgICAgfQorfQorCitURVNUX1AoRXh0cmFjdG9yRnVuY3Rpb25hbGl0eVRlc3QsIENyZWF0ZUV4dHJhY3RvclRlc3QpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICBBTE9HVigiQ2hlY2tzIGlmIGEgdmFsaWQgZXh0cmFjdG9yIGlzIGNyZWF0ZWQgZm9yIGEgZ2l2ZW4gaW5wdXQgZmlsZSIpOworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpLnNlY29uZDsKKworICAgIEFTU0VSVF9FUShzZXREYXRhU291cmNlKGlucHV0RmlsZU5hbWUpLCAwKQorICAgICAgICAgICAgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKworICAgIEFTU0VSVF9FUShjcmVhdGVFeHRyYWN0b3IoKSwgMCkKKyAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKworICAgIC8vIEEgdmFsaWQgZXh0cmFjdG9yIGluc3RhY2Ugc2hvdWxkIHJldHVybiBzdWNjZXNzIGZvciBmb2xsb3dpbmcgY2FsbHMKKyAgICBBU1NFUlRfR1QobUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKSwgMCk7CisKKyAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBBU1NFUlRfTkUoZm9ybWF0LCBudWxscHRyKSA8PCAiQU1lZGlhRm9ybWF0X25ldyByZXR1cm5lZCBudWxsIEFNZWRpYWZvcm1hdCI7CisKKyAgICBBU1NFUlRfRVEobUV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoZm9ybWF0KSwgQU1FRElBX09LKTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKGZvcm1hdCk7Cit9CisKK1RFU1RfUChFeHRyYWN0b3JGdW5jdGlvbmFsaXR5VGVzdCwgRXh0cmFjdG9yVGVzdCkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIEFMT0dWKCJWYWxpZGF0ZXMgJXMgRXh0cmFjdG9yIGZvciBhIGdpdmVuIGlucHV0IGZpbGUiLCBHZXRQYXJhbSgpLmZpcnN0LmNfc3RyKCkpOworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpLnNlY29uZDsKKworICAgIGludDMyX3Qgc3RhdHVzID0gc2V0RGF0YVNvdXJjZShpbnB1dEZpbGVOYW1lKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBHZXRQYXJhbSgpLmZpcnN0IDw8ICJleHRyYWN0b3IiOworCisgICAgc3RhdHVzID0gY3JlYXRlRXh0cmFjdG9yKCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yIiA8PCBHZXRQYXJhbSgpLmZpcnN0IDw8ICJleHRyYWN0b3IiOworCisgICAgaW50MzJfdCBudW1UcmFja3MgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICAgIEFTU0VSVF9HVChudW1UcmFja3MsIDApIDw8ICJFeHRyYWN0b3IgZGlkbid0IGZpbmQgYW55IHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CisKKyAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgbnVtVHJhY2tzOyBpZHgrKykgeworICAgICAgICBNZWRpYVRyYWNrSGVscGVyICp0cmFjayA9IG1FeHRyYWN0b3ItPmdldFRyYWNrKGlkeCk7CisgICAgICAgIEFTU0VSVF9ORSh0cmFjaywgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBnZXQgdHJhY2sgZm9yIGluZGV4ICIgPDwgaWR4OworCisgICAgICAgIENNZWRpYVRyYWNrICpjVHJhY2sgPSB3cmFwKHRyYWNrKTsKKyAgICAgICAgQVNTRVJUX05FKGNUcmFjaywgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBnZXQgdHJhY2sgd3JhcHBlciBmb3IgaW5kZXggIiA8PCBpZHg7CisKKyAgICAgICAgTWVkaWFCdWZmZXJHcm91cCAqYnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCgpOworICAgICAgICBzdGF0dXMgPSBjVHJhY2stPnN0YXJ0KHRyYWNrLCBidWZmZXJHcm91cC0+d3JhcCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0YXJ0IHRoZSB0cmFjayI7CisKKyAgICAgICAgRklMRSAqb3V0RnAgPSBmb3BlbigoT1VUUFVUX0RVTVBfRklMRSArIHRvX3N0cmluZyhpZHgpKS5jX3N0cigpLCAid2IiKTsKKyAgICAgICAgaWYgKCFvdXRGcCkgeworICAgICAgICAgICAgQUxPR1coIlVuYWJsZSB0byBvcGVuIG91dHB1dCBmaWxlIGZvciBkdW1waW5nIGV4dHJhY3RlZCBzdHJlYW0iKTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChzdGF0dXMgIT0gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgc3RhdHVzID0gdHJhY2stPnJlYWQoJmJ1ZmZlcik7CisgICAgICAgICAgICBBTE9HVigidHJhY2stPnJlYWQgU3RhdHVzID0gJWQgYnVmZmVyICVwIiwgc3RhdHVzLCBidWZmZXIpOworICAgICAgICAgICAgaWYgKGJ1ZmZlcikgeworICAgICAgICAgICAgICAgIEFMT0dWKCJidWZmZXItPmRhdGEgJXAgYnVmZmVyLT5zaXplKCkgJXp1IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCksIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpOworICAgICAgICAgICAgICAgIGlmIChvdXRGcCkgZndyaXRlKGJ1ZmZlci0+ZGF0YSgpLCAxLCBidWZmZXItPnJhbmdlX2xlbmd0aCgpLCBvdXRGcCk7CisgICAgICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG91dEZwKSBmY2xvc2Uob3V0RnApOworICAgICAgICBzdGF0dXMgPSBjVHJhY2stPnN0b3AodHJhY2spOworICAgICAgICBBU1NFUlRfRVEoT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSB0cmFjayI7CisgICAgICAgIGRlbGV0ZSBidWZmZXJHcm91cDsKKyAgICAgICAgZGVsZXRlIHRyYWNrOworICAgIH0KK30KKworVEVTVF9QKEV4dHJhY3RvckZ1bmN0aW9uYWxpdHlUZXN0LCBNZXRhRGF0YUNvbXBhcmlzb25UZXN0KSB7CisgICAgaWYgKG1EaXNhYmxlVGVzdCkgcmV0dXJuOworCisgICAgQUxPR1YoIlZhbGlkYXRlcyBFeHRyYWN0b3IncyBtZXRhIGRhdGEgZm9yIGEgZ2l2ZW4gaW5wdXQgZmlsZSIpOworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpLnNlY29uZDsKKworICAgIGludDMyX3Qgc3RhdHVzID0gc2V0RGF0YVNvdXJjZShpbnB1dEZpbGVOYW1lKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBHZXRQYXJhbSgpLmZpcnN0IDw8ICJleHRyYWN0b3IiOworCisgICAgc3RhdHVzID0gY3JlYXRlRXh0cmFjdG9yKCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yIiA8PCBHZXRQYXJhbSgpLmZpcnN0IDw8ICJleHRyYWN0b3IiOworCisgICAgaW50MzJfdCBudW1UcmFja3MgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICAgIEFTU0VSVF9HVChudW1UcmFja3MsIDApIDw8ICJFeHRyYWN0b3IgZGlkbid0IGZpbmQgYW55IHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CisKKyAgICBBTWVkaWFGb3JtYXQgKmV4dHJhY3RvckZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBBU1NFUlRfTkUoZXh0cmFjdG9yRm9ybWF0LCBudWxscHRyKSA8PCAiQU1lZGlhRm9ybWF0X25ldyByZXR1cm5lZCBudWxsIEFNZWRpYWZvcm1hdCI7CisgICAgQU1lZGlhRm9ybWF0ICp0cmFja0Zvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICBBU1NFUlRfTkUodHJhY2tGb3JtYXQsIG51bGxwdHIpIDw8ICJBTWVkaWFGb3JtYXRfbmV3IHJldHVybmVkIG51bGwgQU1lZGlhZm9ybWF0IjsKKworICAgIGZvciAoaW50MzJfdCBpZHggPSAwOyBpZHggPCBudW1UcmFja3M7IGlkeCsrKSB7CisgICAgICAgIE1lZGlhVHJhY2tIZWxwZXIgKnRyYWNrID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2soaWR4KTsKKyAgICAgICAgQVNTRVJUX05FKHRyYWNrLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayBmb3IgaW5kZXggIiA8PCBpZHg7CisKKyAgICAgICAgQ01lZGlhVHJhY2sgKmNUcmFjayA9IHdyYXAodHJhY2spOworICAgICAgICBBU1NFUlRfTkUoY1RyYWNrLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayB3cmFwcGVyIGZvciBpbmRleCAiIDw8IGlkeDsKKworICAgICAgICBNZWRpYUJ1ZmZlckdyb3VwICpidWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwKCk7CisgICAgICAgIHN0YXR1cyA9IGNUcmFjay0+c3RhcnQodHJhY2ssIGJ1ZmZlckdyb3VwLT53cmFwKCkpOworICAgICAgICBBU1NFUlRfRVEoT0ssIChtZWRpYV9zdGF0dXNfdClzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RhcnQgdGhlIHRyYWNrIjsKKworICAgICAgICBzdGF0dXMgPSBtRXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKGV4dHJhY3RvckZvcm1hdCwgaWR4LCAxKTsKKyAgICAgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFja01ldGFEYXRhIjsKKworICAgICAgICBzdGF0dXMgPSB0cmFjay0+Z2V0Rm9ybWF0KHRyYWNrRm9ybWF0KTsKKyAgICAgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayBtZXRhIGRhdGEiOworCisgICAgICAgIGNvbnN0IGNoYXIgKmV4dHJhY3Rvck1pbWUsICp0cmFja01pbWU7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoZXh0cmFjdG9yRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZleHRyYWN0b3JNaW1lKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyh0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9NSU1FLCAmdHJhY2tNaW1lKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoIXN0cmNtcChleHRyYWN0b3JNaW1lLCB0cmFja01pbWUpKQorICAgICAgICAgICAgICAgIDw8ICJFeHRyYWN0b3IncyBmb3JtYXQgZG9lc24ndCBtYXRjaCB0cmFjayBmb3JtYXQiOworCisgICAgICAgIGlmICghc3RybmNtcChleHRyYWN0b3JNaW1lLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgICAgIGludDMyX3QgZXhTYW1wbGVSYXRlLCBleENoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIGludDMyX3QgdHJhY2tTYW1wbGVSYXRlLCB0cmFja0NoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihleHRyYWN0b3JGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXhDaGFubmVsQ291bnQpKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihleHRyYWN0b3JGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV4U2FtcGxlUmF0ZSkpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrQ2hhbm5lbENvdW50KSk7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrU2FtcGxlUmF0ZSkpOworICAgICAgICAgICAgQVNTRVJUX0VRKGV4Q2hhbm5lbENvdW50LCB0cmFja0NoYW5uZWxDb3VudCkgPDwgIkNoYW5uZWxDb3VudCBub3QgYXMgZXhwZWN0ZWQiOworICAgICAgICAgICAgQVNTRVJUX0VRKGV4U2FtcGxlUmF0ZSwgdHJhY2tTYW1wbGVSYXRlKSA8PCAiU2FtcGxlUmF0ZSBub3QgYXMgZXhwZWN0ZWQiOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaW50MzJfdCBleFdpZHRoLCBleEhlaWdodDsKKyAgICAgICAgICAgIGludDMyX3QgdHJhY2tXaWR0aCwgdHJhY2tIZWlnaHQ7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZXh0cmFjdG9yRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCAmZXhXaWR0aCkpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGV4dHJhY3RvckZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsICZleEhlaWdodCkpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCAmdHJhY2tXaWR0aCkpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgJnRyYWNrSGVpZ2h0KSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoZXhXaWR0aCwgdHJhY2tXaWR0aCkgPDwgIldpZHRoIG5vdCBhcyBleHBlY3RlZCI7CisgICAgICAgICAgICBBU1NFUlRfRVEoZXhIZWlnaHQsIHRyYWNrSGVpZ2h0KSA8PCAiSGVpZ2h0IG5vdCBhcyBleHBlY3RlZCI7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gY1RyYWNrLT5zdG9wKHRyYWNrKTsKKyAgICAgICAgQVNTRVJUX0VRKE9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgdHJhY2siOworICAgICAgICBkZWxldGUgYnVmZmVyR3JvdXA7CisgICAgICAgIGRlbGV0ZSB0cmFjazsKKyAgICB9CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZSh0cmFja0Zvcm1hdCk7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZShleHRyYWN0b3JGb3JtYXQpOworfQorCitURVNUX1AoRXh0cmFjdG9yRnVuY3Rpb25hbGl0eVRlc3QsIE11bHRpcGxlU3RhcnRTdG9wVGVzdCkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIEFMT0dWKCJUZXN0ICVzIGV4dHJhY3RvciBmb3IgbXVsdGlwbGUgc3RhcnQgYW5kIHN0b3AgY2FsbHMiLCBHZXRQYXJhbSgpLmZpcnN0LmNfc3RyKCkpOworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpLnNlY29uZDsKKworICAgIGludDMyX3Qgc3RhdHVzID0gc2V0RGF0YVNvdXJjZShpbnB1dEZpbGVOYW1lKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yIiA8PCBHZXRQYXJhbSgpLmZpcnN0IDw8ICJleHRyYWN0b3IiOworCisgICAgc3RhdHVzID0gY3JlYXRlRXh0cmFjdG9yKCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQgZm9yIiA8PCBHZXRQYXJhbSgpLmZpcnN0IDw8ICJleHRyYWN0b3IiOworCisgICAgaW50MzJfdCBudW1UcmFja3MgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICAgIEFTU0VSVF9HVChudW1UcmFja3MsIDApIDw8ICJFeHRyYWN0b3IgZGlkbid0IGZpbmQgYW55IHRyYWNrIGZvciB0aGUgZ2l2ZW4gY2xpcCI7CisKKyAgICAvLyBzdGFydC9zdG9wIHRoZSB0cmFja3MgbXVsdGlwbGUgdGltZXMKKyAgICBmb3IgKGludDMyX3QgY291bnQgPSAwOyBjb3VudCA8IGtNYXhDb3VudDsgY291bnQrKykgeworICAgICAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgbnVtVHJhY2tzOyBpZHgrKykgeworICAgICAgICAgICAgTWVkaWFUcmFja0hlbHBlciAqdHJhY2sgPSBtRXh0cmFjdG9yLT5nZXRUcmFjayhpZHgpOworICAgICAgICAgICAgQVNTRVJUX05FKHRyYWNrLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayBmb3IgaW5kZXggIiA8PCBpZHg7CisKKyAgICAgICAgICAgIENNZWRpYVRyYWNrICpjVHJhY2sgPSB3cmFwKHRyYWNrKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShjVHJhY2ssIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gZ2V0IHRyYWNrIHdyYXBwZXIgZm9yIGluZGV4ICIgPDwgaWR4OworCisgICAgICAgICAgICBNZWRpYUJ1ZmZlckdyb3VwICpidWZmZXJHcm91cCA9IG5ldyBNZWRpYUJ1ZmZlckdyb3VwKCk7CisgICAgICAgICAgICBzdGF0dXMgPSBjVHJhY2stPnN0YXJ0KHRyYWNrLCBidWZmZXJHcm91cC0+d3JhcCgpKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShPSywgKG1lZGlhX3N0YXR1c190KXN0YXR1cykgPDwgIkZhaWxlZCB0byBzdGFydCB0aGUgdHJhY2siOworICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICBzdGF0dXMgPSB0cmFjay0+cmVhZCgmYnVmZmVyKTsKKyAgICAgICAgICAgIGlmIChidWZmZXIpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiYnVmZmVyLT5kYXRhICVwIGJ1ZmZlci0+c2l6ZSgpICV6dSBidWZmZXItPnJhbmdlX2xlbmd0aCgpICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpLCBidWZmZXItPnJhbmdlX2xlbmd0aCgpKTsKKyAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1cyA9IGNUcmFjay0+c3RvcCh0cmFjayk7CisgICAgICAgICAgICBBU1NFUlRfRVEoT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBzdG9wIHRoZSB0cmFjayI7CisgICAgICAgICAgICBkZWxldGUgYnVmZmVyR3JvdXA7CisgICAgICAgICAgICBkZWxldGUgdHJhY2s7CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1RfUChFeHRyYWN0b3JGdW5jdGlvbmFsaXR5VGVzdCwgU2Vla1Rlc3QpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisKKyAgICBBTE9HVigiVmFsaWRhdGVzICVzIEV4dHJhY3RvciBiZWhhdmlvdXIgZm9yIGRpZmZlcmVudCBzZWVrIG1vZGVzIiwgR2V0UGFyYW0oKS5maXJzdC5jX3N0cigpKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKS5zZWNvbmQ7CisKKyAgICBpbnQzMl90IHN0YXR1cyA9IHNldERhdGFTb3VyY2UoaW5wdXRGaWxlTmFtZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlNldERhdGFTb3VyY2UgZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKworICAgIHN0YXR1cyA9IGNyZWF0ZUV4dHJhY3RvcigpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKworICAgIGludDMyX3QgbnVtVHJhY2tzID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKyAgICBBU1NFUlRfR1QobnVtVHJhY2tzLCAwKSA8PCAiRXh0cmFjdG9yIGRpZG4ndCBmaW5kIGFueSB0cmFjayBmb3IgdGhlIGdpdmVuIGNsaXAiOworCisgICAgdWludDMyX3Qgc2Vla0ZsYWcgPSBtRXh0cmFjdG9yLT5mbGFncygpOworICAgIGlmICghKHNlZWtGbGFnICYgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXI6OkNBTl9TRUVLKSkgeworICAgICAgICBjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkLiAiIDw8IEdldFBhcmFtKCkuZmlyc3QKKyAgICAgICAgICAgICA8PCAiIEV4dHJhY3RvciBkb2Vzbid0IHN1cHBvcnQgc2Vla1xuIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHZlY3RvcjxpbnQ2NF90PiBzZWVrYWJsZVBvaW50czsKKyAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgbnVtVHJhY2tzOyBpZHgrKykgeworICAgICAgICBNZWRpYVRyYWNrSGVscGVyICp0cmFjayA9IG1FeHRyYWN0b3ItPmdldFRyYWNrKGlkeCk7CisgICAgICAgIEFTU0VSVF9ORSh0cmFjaywgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBnZXQgdHJhY2sgZm9yIGluZGV4ICIgPDwgaWR4OworCisgICAgICAgIENNZWRpYVRyYWNrICpjVHJhY2sgPSB3cmFwKHRyYWNrKTsKKyAgICAgICAgQVNTRVJUX05FKGNUcmFjaywgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBnZXQgdHJhY2sgd3JhcHBlciBmb3IgaW5kZXggIiA8PCBpZHg7CisKKyAgICAgICAgLy8gR2V0IGFsbCB0aGUgc2Vla2FibGUgcG9pbnRzIG9mIGEgZ2l2ZW4gaW5wdXQKKyAgICAgICAgTWVkaWFCdWZmZXJHcm91cCAqYnVmZmVyR3JvdXAgPSBuZXcgTWVkaWFCdWZmZXJHcm91cCgpOworICAgICAgICBzdGF0dXMgPSBjVHJhY2stPnN0YXJ0KHRyYWNrLCBidWZmZXJHcm91cC0+d3JhcCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0YXJ0IHRoZSB0cmFjayI7CisKKyAgICAgICAgLy8gRm9yIEZsYWMsIFdhdiBhbmQgTWlkaSBleHRyYWN0b3IsIGFsbCBzYW1wbGVzIGFyZSBzZWVrIHBvaW50cy4KKyAgICAgICAgLy8gV2UgY2Fubm90IGNyZWF0ZSBsaXN0IG9mIGFsbCBzZWVrYWJsZSBwb2ludHMgZm9yIHRoZXNlLgorICAgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgaWYgd2UgcGFzcyBhIHNlZWtUb1RpbWVTdGFtcCBiZXR3ZWVuIHR3byBzZWVrIHBvaW50cywgd2UgbWF5CisgICAgICAgIC8vIGVuZCB1cCBnZXR0aW5nIHRoZSB0aW1lc3RhbXAgb2YgbmV4dCBzYW1wbGUgYXMgYSBzZWVrYWJsZSB0aW1lc3RhbXAuCisgICAgICAgIC8vIFRoaXMgdGltZXN0YW1wIG1heS9tYXkgbm90IGJlIGEgcGFydCBvZiB0aGUgc2Vla2FibGUgcG9pbnQgdmVjdG9yIHRoZXJlYnkgZmFpbGluZyB0aGUKKyAgICAgICAgLy8gdGVzdC4gU28gd2UgdGVzdCB0aGVzZSBleHRyYWN0b3JzIHVzaW5nIHJhbmRvbSBzZWVrIHRlc3QuCisgICAgICAgIGlmIChtRXh0cmFjdG9yTmFtZSA9PSBGTEFDIHx8IG1FeHRyYWN0b3JOYW1lID09IFdBViB8fCBtRXh0cmFjdG9yTmFtZSA9PSBNSURJKSB7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKnRyYWNrTWV0YSA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORSh0cmFja01ldGEsIG51bGxwdHIpIDw8ICJBTWVkaWFGb3JtYXRfbmV3IHJldHVybmVkIG51bGwgQU1lZGlhZm9ybWF0IjsKKworICAgICAgICAgICAgc3RhdHVzID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YSh0cmFja01ldGEsIGlkeCwgMSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoT0ssIChtZWRpYV9zdGF0dXNfdClzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRyYWNrTWV0YURhdGEiOworCisgICAgICAgICAgICBpbnQ2NF90IGNsaXBEdXJhdGlvbiA9IDA7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50NjQodHJhY2tNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLCAmY2xpcER1cmF0aW9uKTsKKyAgICAgICAgICAgIEFTU0VSVF9HVChjbGlwRHVyYXRpb24sIDApIDw8ICJJbnZhbGlkIGNsaXAgZHVyYXRpb24gIjsKKyAgICAgICAgICAgIHJhbmRvbVNlZWtUZXN0KHRyYWNrLCBjbGlwRHVyYXRpb24pOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZSh0cmFja01ldGEpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gUmVxdWVzdCBzZWVrYWJsZSBwb2ludHMgZm9yIHJlbWFpbmluZyBleHRyYWN0b3JzIHdoaWNoIHdpbGwgYmUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgc2VlaworICAgICAgICAvLyBhY2N1cmFjeSBmb3IgdGhlIGV4dHJhY3RvcnMuIERlcGVuZGluZyBvbiBTRUVLIE1vZGUsIHdlIGV4cGVjdCB0aGUgZXh0cmFjdG9ycyB0byByZXR1cm4KKyAgICAgICAgLy8gdGhlIGV4cGVjdGVkIHN5bmMgZnJhbWUuIFdlIGRvbid0IHByZWZlciByYW5kb20gc2VlayB0ZXN0IGZvciB0aGVzZSBleHRyYWN0b3JzIGJlY2F1c2UKKyAgICAgICAgLy8gdGhleSBhcmVuJ3QgZXhwZWN0ZWQgdG8gc2VlayB0byByYW5kb20gc2FtcGxlcy4gTVA0IGZvciBpbnN0YW5jZSBjYW4gc2VlayB0bworICAgICAgICAvLyBuZXh0L3ByZXZpb3VzIHN5bmMgZnJhbWVzIGJ1dCBub3QgdG8gc2FtcGxlcyBiZXR3ZWVuIHR3byBzeW5jIGZyYW1lcy4KKyAgICAgICAgZ2V0U2Vla2FibGVQb2ludHMoc2Vla2FibGVQb2ludHMsIHRyYWNrKTsKKyAgICAgICAgQVNTRVJUX0dUKHNlZWthYmxlUG9pbnRzLnNpemUoKSwgMCkKKyAgICAgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGdldCBzZWVrYWJsZSBwb2ludHMgZm9yICIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiIGV4dHJhY3RvciI7CisKKyAgICAgICAgQU1lZGlhRm9ybWF0ICp0cmFja0Zvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKKyAgICAgICAgQVNTRVJUX05FKHRyYWNrRm9ybWF0LCBudWxscHRyKSA8PCAiQU1lZGlhRm9ybWF0X25ldyByZXR1cm5lZCBudWxsIGZvcm1hdCI7CisgICAgICAgIHN0YXR1cyA9IHRyYWNrLT5nZXRGb3JtYXQodHJhY2tGb3JtYXQpOworICAgICAgICBBU1NFUlRfRVEoT0ssIChtZWRpYV9zdGF0dXNfdClzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRyYWNrIG1ldGEgZGF0YSI7CisKKyAgICAgICAgYm9vbCBpc09wdXMgPSBmYWxzZTsKKyAgICAgICAgaW50NjRfdCBvcHVzU2Vla1ByZVJvbGxVcyA9IDA7CisgICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpOworICAgICAgICBpZiAoIXN0cmNtcChtaW1lLCAiYXVkaW8vb3B1cyIpKSB7CisgICAgICAgICAgICBpc09wdXMgPSB0cnVlOworICAgICAgICAgICAgdm9pZCAqc2Vla1ByZVJvbGxCdWYgPSBudWxscHRyOworICAgICAgICAgICAgc2l6ZV90IHNpemUgPSAwOworICAgICAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyKHRyYWNrRm9ybWF0LCAiY3NkLTIiLCAmc2Vla1ByZVJvbGxCdWYsICZzaXplKSkgeworICAgICAgICAgICAgICAgIHNpemVfdCBvcHVzSGVhZFNpemUgPSAwOworICAgICAgICAgICAgICAgIHNpemVfdCBjb2RlY0RlbGF5QnVmU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgc2l6ZV90IHNlZWtQcmVSb2xsQnVmU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgdm9pZCAqY3NkQnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICB2b2lkICpvcHVzSGVhZEJ1ZiA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgdm9pZCAqY29kZWNEZWxheUJ1ZiA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcih0cmFja0Zvcm1hdCwgImNzZC0wIiwgJmNzZEJ1ZmZlciwgJnNpemUpOworICAgICAgICAgICAgICAgIEFTU0VSVF9ORShjc2RCdWZmZXIsIG51bGxwdHIpOworCisgICAgICAgICAgICAgICAgR2V0T3B1c0hlYWRlckJ1ZmZlcnMoKHVpbnQ4X3QgKiljc2RCdWZmZXIsIHNpemUsICZvcHVzSGVhZEJ1ZiwgJm9wdXNIZWFkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNEZWxheUJ1ZiwgJmNvZGVjRGVsYXlCdWZTaXplLCAmc2Vla1ByZVJvbGxCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlZWtQcmVSb2xsQnVmU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBU1NFUlRfTkUoc2Vla1ByZVJvbGxCdWYsIG51bGxwdHIpCisgICAgICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIHRyYWNrIGZvcm1hdC4gU2Vla1ByZVJvbGwgaW5mbyBtaXNzaW5nIGZvciBPcHVzIGZpbGUiOworICAgICAgICAgICAgb3B1c1NlZWtQcmVSb2xsVXMgPSAqKChpbnQ2NF90ICopc2Vla1ByZVJvbGxCdWYpOworICAgICAgICB9CisgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUodHJhY2tGb3JtYXQpOworCisgICAgICAgIGludDMyX3Qgc2Vla0lkeCA9IDA7CisgICAgICAgIHNpemVfdCBzZWVrYWJsZVBvaW50c1NpemUgPSBzZWVrYWJsZVBvaW50cy5zaXplKCk7CisgICAgICAgIGZvciAoaW50MzJfdCBtb2RlID0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOworICAgICAgICAgICAgIG1vZGUgPD0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUOyBtb2RlKyspIHsKKyAgICAgICAgICAgIGZvciAoaW50MzJfdCBzZWVrQ291bnQgPSAwOyBzZWVrQ291bnQgPCBrTWF4Q291bnQ7IHNlZWtDb3VudCsrKSB7CisgICAgICAgICAgICAgICAgc2Vla0lkeCA9IHJhbmQoKSAlIHNlZWthYmxlUG9pbnRzU2l6ZSArIDE7CisgICAgICAgICAgICAgICAgaWYgKHNlZWtJZHggPj0gc2Vla2FibGVQb2ludHNTaXplKSBzZWVrSWR4ID0gc2Vla2FibGVQb2ludHNTaXplIC0gMTsKKworICAgICAgICAgICAgICAgIGludDY0X3Qgc2Vla1RvVGltZVN0YW1wID0gc2Vla2FibGVQb2ludHNbc2Vla0lkeF07CisgICAgICAgICAgICAgICAgaWYgKHNlZWthYmxlUG9pbnRzU2l6ZSA+IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBwcmV2VGltZVN0YW1wID0gc2Vla2FibGVQb2ludHNbc2Vla0lkeCAtIDFdOworICAgICAgICAgICAgICAgICAgICBzZWVrVG9UaW1lU3RhbXAgPSBzZWVrVG9UaW1lU3RhbXAgLSAoKHNlZWtUb1RpbWVTdGFtcCAtIHByZXZUaW1lU3RhbXApID4+IDMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIE9wdXMgaGFzIGEgc2Vla1ByZVJvbGxVcy4gVGltZVN0YW1wIHJldHVybmVkIGJ5IHRoZQorICAgICAgICAgICAgICAgIC8vIGV4dHJhY3RvciBpcyBjYWxjdWxhdGVkIGJhc2VkIG9uIChzZWVrUHRzIC0gc2Vla1ByZVJvbGxVcykuCisgICAgICAgICAgICAgICAgLy8gU28gd2UgYWRkIHRoZSBwcmVSb2xsIHZhbHVlIHRvIHRoZSB0aW1lU3RhbXAgd2Ugd2FudCB0byBzZWVrIHRvLgorICAgICAgICAgICAgICAgIGlmIChpc09wdXMpIHsKKyAgICAgICAgICAgICAgICAgICAgc2Vla1RvVGltZVN0YW1wICs9IG9wdXNTZWVrUHJlUm9sbFVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zICpvcHRpb25zID0gbmV3IE1lZGlhVHJhY2tIZWxwZXI6OlJlYWRPcHRpb25zKAorICAgICAgICAgICAgICAgICAgICAgICAgbW9kZSB8IENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUssIHNlZWtUb1RpbWVTdGFtcCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKG9wdGlvbnMsIG51bGxwdHIpIDw8ICJDYW5ub3QgY3JlYXRlIHJlYWQgb3B0aW9uIjsKKworICAgICAgICAgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICpidWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IHRyYWNrLT5yZWFkKCZidWZmZXIsIG9wdGlvbnMpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIG9wdGlvbnM7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoYnVmZmVyKSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YURhdGEgPSBidWZmZXItPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVTdGFtcDsKKyAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDY0KG1ldGFEYXRhLCBBTUVESUFGT1JNQVRfS0VZX1RJTUVfVVMsICZ0aW1lU3RhbXApOworICAgICAgICAgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLIGlzIDguIFVzaW5nIG1hc2sgMDExMWIgdG8gZ2V0IHRydWUgbW9kZXMKKyAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChtb2RlICYgMHg3KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfUFJFVklPVVNfU1lOQzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2Vla2FibGVQb2ludHNTaXplID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVhQRUNUX0VRKHRpbWVTdGFtcCwgc2Vla2FibGVQb2ludHNbc2Vla0lkeF0pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVYUEVDVF9FUSh0aW1lU3RhbXAsIHNlZWthYmxlUG9pbnRzW3NlZWtJZHggLSAxXSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDTWVkaWFUcmFja1JlYWRPcHRpb25zOjpTRUVLX05FWFRfU1lOQzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6U0VFS19DTE9TRVNUX1NZTkM6CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIENNZWRpYVRyYWNrUmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFWFBFQ1RfRVEodGltZVN0YW1wLCBzZWVrYWJsZVBvaW50c1tzZWVrSWR4XSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlbGV0ZSBvcHRpb25zOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IGNUcmFjay0+c3RvcCh0cmFjayk7CisgICAgICAgIEFTU0VSVF9FUShPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgdGhlIHRyYWNrIjsKKyAgICAgICAgZGVsZXRlIGJ1ZmZlckdyb3VwOworICAgICAgICBkZWxldGUgdHJhY2s7CisgICAgfQorICAgIHNlZWthYmxlUG9pbnRzLmNsZWFyKCk7Cit9CisKKy8vIFRoaXMgdGVzdCB2YWxpZGF0ZXMgY29uZmlnIHBhcmFtcyBmb3IgYSBnaXZlbiBpbnB1dCBmaWxlLgorLy8gRm9yIHRoaXMgdGVzdCB3ZSBvbmx5IHRha2Ugc2luZ2xlIHRyYWNrIGZpbGVzIHNpbmNlIHRoZSBmb2N1cyBvZiB0aGlzIHRlc3QgaXMKKy8vIHRvIHZhbGlkYXRlIHRoZSBmaWxlIHByb3BlcnRpZXMgcmVwb3J0ZWQgYnkgRXh0cmFjdG9yIGFuZCBub3QgbXVsdGktdHJhY2sgYmVoYXZpb3IKK1RFU1RfUChDb25maWdQYXJhbVRlc3QsIENvbmZpZ1BhcmFtVmFsaWRhdGlvbikgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKworICAgIEFMT0dWKCJWYWxpZGF0ZXMgJXMgRXh0cmFjdG9yIGZvciBpbnB1dCdzIGZpbGUgcHJvcGVydGllcyIsIEdldFBhcmFtKCkuZmlyc3QuY19zdHIoKSk7CisgICAgc3RyaW5nIGlucHV0RmlsZU5hbWUgPSBnRW52LT5nZXRSZXMoKTsKKyAgICBpbnQzMl90IGlucHV0RmlsZUlkeCA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIGNvbmZpZ0Zvcm1hdCBjb25maWdQYXJhbTsKKyAgICBnZXRGaWxlUHJvcGVydGllcyhpbnB1dEZpbGVJZHgsIGlucHV0RmlsZU5hbWUsIGNvbmZpZ1BhcmFtKTsKKworICAgIGludDMyX3Qgc3RhdHVzID0gc2V0RGF0YVNvdXJjZShpbnB1dEZpbGVOYW1lKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiU2V0RGF0YVNvdXJjZSBmYWlsZWQgZm9yICIgPDwgR2V0UGFyYW0oKS5maXJzdCA8PCAiZXh0cmFjdG9yIjsKKworICAgIHN0YXR1cyA9IGNyZWF0ZUV4dHJhY3RvcigpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIGZvciAiIDw8IEdldFBhcmFtKCkuZmlyc3QgPDwgImV4dHJhY3RvciI7CisKKyAgICBpbnQzMl90IG51bVRyYWNrcyA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisgICAgQVNTRVJUX0dUKG51bVRyYWNrcywgMCkgPDwgIkV4dHJhY3RvciBkaWRuJ3QgZmluZCBhbnkgdHJhY2sgZm9yIHRoZSBnaXZlbiBjbGlwIjsKKworICAgIE1lZGlhVHJhY2tIZWxwZXIgKnRyYWNrID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2soMCk7CisgICAgQVNTRVJUX05FKHRyYWNrLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayBmb3IgaW5kZXggMCI7CisKKyAgICBBTWVkaWFGb3JtYXQgKnRyYWNrRm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOworICAgIEFTU0VSVF9ORSh0cmFja0Zvcm1hdCwgbnVsbHB0cikgPDwgIkFNZWRpYUZvcm1hdF9uZXcgcmV0dXJuZWQgbnVsbCBmb3JtYXQiOworCisgICAgc3RhdHVzID0gdHJhY2stPmdldEZvcm1hdCh0cmFja0Zvcm1hdCk7CisgICAgQVNTRVJUX0VRKE9LLCAobWVkaWFfc3RhdHVzX3Qpc3RhdHVzKSA8PCAiRmFpbGVkIHRvIGdldCB0cmFjayBtZXRhIGRhdGEiOworCisgICAgY29uc3QgY2hhciAqdHJhY2tNaW1lOworICAgIGJvb2wgdmFsdWVGb3VuZCA9IEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJnRyYWNrTWltZSk7CisgICAgQVNTRVJUX1RSVUUodmFsdWVGb3VuZCkgPDwgIk1pbWUgdHlwZSBub3Qgc2V0IGJ5IGV4dHJhY3RvciI7CisgICAgQVNTRVJUX1NUUkVRKGNvbmZpZ1BhcmFtLm1pbWUuY19zdHIoKSwgdHJhY2tNaW1lKSA8PCAiSW52YWxpZCB0cmFjayBmb3JtYXQiOworCisgICAgaWYgKCFzdHJuY21wKHRyYWNrTWltZSwgImF1ZGlvLyIsIDYpKSB7CisgICAgICAgIGludDMyX3QgdHJhY2tTYW1wbGVSYXRlLCB0cmFja0NoYW5uZWxDb3VudDsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2tDaGFubmVsQ291bnQpKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoCisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCAmdHJhY2tTYW1wbGVSYXRlKSk7CisgICAgICAgIEFTU0VSVF9FUShjb25maWdQYXJhbS5zYW1wbGVSYXRlLCB0cmFja1NhbXBsZVJhdGUpIDw8ICJTYW1wbGVSYXRlIG5vdCBhcyBleHBlY3RlZCI7CisgICAgICAgIEFTU0VSVF9FUShjb25maWdQYXJhbS5jaGFubmVsQ291bnQsIHRyYWNrQ2hhbm5lbENvdW50KSA8PCAiQ2hhbm5lbENvdW50IG5vdCBhcyBleHBlY3RlZCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50MzJfdCB0cmFja1dpZHRoLCB0cmFja0hlaWdodDsKKyAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCAmdHJhY2tXaWR0aCkpOworICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIodHJhY2tGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCAmdHJhY2tIZWlnaHQpKTsKKyAgICAgICAgQVNTRVJUX0VRKGNvbmZpZ1BhcmFtLndpZHRoLCB0cmFja1dpZHRoKSA8PCAiV2lkdGggbm90IGFzIGV4cGVjdGVkIjsKKyAgICAgICAgQVNTRVJUX0VRKGNvbmZpZ1BhcmFtLmhlaWdodCwgdHJhY2tIZWlnaHQpIDw8ICJIZWlnaHQgbm90IGFzIGV4cGVjdGVkIjsKKworICAgICAgICBpZiAoY29uZmlnUGFyYW0uZnJhbWVSYXRlICE9IGtVbmRlZmluZWQpIHsKKyAgICAgICAgICAgIGludDMyX3QgZnJhbWVSYXRlOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoCisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMih0cmFja0Zvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLCAmZnJhbWVSYXRlKSk7CisgICAgICAgICAgICBBU1NFUlRfRVEoY29uZmlnUGFyYW0uZnJhbWVSYXRlLCBmcmFtZVJhdGUpIDw8ICJmcmFtZVJhdGUgbm90IGFzIGV4cGVjdGVkIjsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyB2YWxpZGF0ZSB0aGUgcHJvZmlsZSBmb3IgdGhlIGlucHV0IGNsaXAKKyAgICBpbnQzMl90IHByb2ZpbGU7CisgICAgaWYgKGNvbmZpZ1BhcmFtLnByb2ZpbGUgIT0ga1VuZGVmaW5lZCkgeworICAgICAgICBpZiAoQU1lZGlhRm9ybWF0X2dldEludDMyKHRyYWNrRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1BST0ZJTEUsICZwcm9maWxlKSkgeworICAgICAgICAgICAgQVNTRVJUX0VRKGNvbmZpZ1BhcmFtLnByb2ZpbGUsIHByb2ZpbGUpIDw8ICJwcm9maWxlIG5vdCBhcyBleHBlY3RlZCI7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShmYWxzZSkgPDwgInByb2ZpbGUgbm90IHJldHVybmVkIGluIGV4dHJhY3RvciI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBkZWxldGUgdHJhY2s7CisgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZSh0cmFja0Zvcm1hdCk7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChDb25maWdQYXJhbVRlc3RBbGwsIENvbmZpZ1BhcmFtVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoImFhYyIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYW1yIiwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJhbXIiLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm9nZyIsIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigid2F2IiwgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJmbGFjIiwgNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJvZ2ciLCA2KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wMyIsIDcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibWlkaSIsIDgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzJ0cyIsIDkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibWt2IiwgMTApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzQiLCAxMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJta3YiLCAxMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcGVnMnBzIiwgMTMpKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChFeHRyYWN0b3JVbml0VGVzdEFsbCwgRXh0cmFjdG9yRnVuY3Rpb25hbGl0eVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJhYWMiLCAibG91ZHNvZnRhYWMuYWFjIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJhbXIiLCAidGVzdGFtci5hbXIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImFtciIsICJhbXJ3Yi53YXYiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm9nZyIsICJqb2huX2NhZ2Uub2dnIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJ3YXYiLCAibW9ub3Rlc3Rnc20ud2F2IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcGVnMnRzIiwgInNlZ21lbnQwMDAwMDEudHMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImZsYWMiLCAic2luZXN3ZWVwZmxhYy5mbGFjIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJvZ2ciLCAidGVzdG9wdXMub3B1cyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibWlkaSIsICJtaWRpX2EubWlkIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJta3YiLCAic2luZXN3ZWVwdm9yYmlzLm1rdiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzQiLCAic2luZXN3ZWVwb2dnbXA0Lm1wNCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXAzIiwgInNpbmVzd2VlcG1wM2xhbWUubXAzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJta3YiLCAic3dpcmxfMTQ0eDEzNl92cDkud2VibSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibWt2IiwgInN3aXJsXzE0NHgxMzZfdnA4LndlYm0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWcycHMiLCAic3dpcmxfMTQ0eDEzNl9tcGVnMi5tcGciKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIm1wZWc0IiwgInN3aXJsXzEzMngxMzBfbXBlZzQubXA0IikpKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgZ0VudiA9IG5ldyBFeHRyYWN0b3JVbml0VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HVigiVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvRXh0cmFjdG9yVW5pdFRlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9FeHRyYWN0b3JVbml0VGVzdEVudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNlOGZjMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvRXh0cmFjdG9yVW5pdFRlc3RFbnZpcm9ubWVudC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRVhUUkFDVE9SX1VOSVRfVEVTVF9FTlZJUk9OTUVOVF9IX18KKyNkZWZpbmUgX19FWFRSQUNUT1JfVU5JVF9URVNUX0VOVklST05NRU5UX0hfXworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGdldG9wdC5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjbGFzcyBFeHRyYWN0b3JVbml0VGVzdEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgRXh0cmFjdG9yVW5pdFRlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvIikge30KKworICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIgKl9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQorCisgIHByaXZhdGU6CisgICAgc3RyaW5nIHJlczsKK307CisKK2ludCBFeHRyYWN0b3JVbml0VGVzdEVudmlyb25tZW50Ojppbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0ge3sicmVzIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdQJ30sIHswLCAwLCAwLCAwfX07CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJQOiIsIG9wdGlvbnMsICZpbmRleCk7CisgICAgICAgIGlmIChjID09IC0xKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnUCc6CisgICAgICAgICAgICAgICAgc2V0UmVzKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdGluZCA8IGFyZ2MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBvcHRpb246ICVzXG5cbiIKKyAgICAgICAgICAgICAgICAidXNhZ2U6ICVzIDxndGVzdCBvcHRpb25zPiA8dGVzdCBvcHRpb25zPlxuXG4iCisgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKKyAgICAgICAgICAgICAgICAiLVAsIC0tcGF0aDogUmVzb3VyY2UgZmlsZXMgZGlyZWN0b3J5IGxvY2F0aW9uXG4iLAorICAgICAgICAgICAgICAgIGFyZ3Zbb3B0aW5kID86IDFdLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYgIC8vIF9fRVhUUkFDVE9SX1VOSVRfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvUkVBRE1FLm1kIGIvbWVkaWEvZXh0cmFjdG9ycy90ZXN0cy9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1MzhiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMzkgQEAKKyMjIE1lZGlhIFRlc3RpbmcgIyMKKy0tLQorIyMjIyBFeHRyYWN0b3IgOgorVGhlIEV4dHJhY3RvciBUZXN0IFN1aXRlIHZhbGlkYXRlcyB0aGUgZXh0cmFjdG9ycyBhdmFpbGFibGUgaW4gdGhlIGRldmljZS4KKworUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6CitgYGAKK20gRXh0cmFjdG9yVW5pdFRlc3QKK2BgYAorCitUaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LworCitUaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCisKK1RvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvRXh0cmFjdG9yVW5pdFRlc3QvRXh0cmFjdG9yVW5pdFRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9FeHRyYWN0b3JVbml0VGVzdC9FeHRyYWN0b3JVbml0VGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2V4dHJhY3RvcnMvdGVzdHMvZXh0cmFjdG9yLnppcCkuIERvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KKworYGBgCithZGIgcHVzaCBleHRyYWN0b3IgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK3VzYWdlOiBFeHRyYWN0b3JVbml0VGVzdCAtUCBcPHBhdGhfdG9fZm9sZGVyXD4KK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9FeHRyYWN0b3JVbml0VGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvZXh0cmFjdG9yLworYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBFeHRyYWN0b3JVbml0VGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9BbmRyb2lkLmJwCmluZGV4IGRkMDQ1YjkuLjUxZTNjMzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvZXh0cmFjdG9ycy93YXYvQW5kcm9pZC5icApAQCAtMSw0ICsxLDQgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogCiAgICAgc3JjczogWyJXQVZFeHRyYWN0b3IuY3BwIl0sCiAKQEAgLTcsMTEgKzcsMTMgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJpbmRlcl9uZGsiLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliZmlmbyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmNwcCBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5jcHAKaW5kZXggZmU1MDliZi4uNGZhN2YyNyAxMDA2NDQKLS0tIGEvbWVkaWEvZXh0cmFjdG9ycy93YXYvV0FWRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuY3BwCkBAIC0yMCwyMSArMjAsMzIgQEAKIAogI2luY2x1ZGUgIldBVkV4dHJhY3Rvci5oIgogCisjaW5jbHVkZSA8YW5kcm9pZC9iaW5kZXJfaWJpbmRlci5oPiAvLyBmb3IgQUlCaW5kZXJfZ2V0Q2FsbGluZ1VpZAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+IC8vIGZvciBBSURfTUVESUEKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL2JpdG9wcy5oPgogCiAjZGVmaW5lIENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUiAwCiAKKy8vIE5PVEU6IFRoaXMgY29kZSBhc3N1bWVzIHRoZSBkZXZpY2UgcHJvY2Vzc29yIGlzIGxpdHRsZSBlbmRpYW4uCisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLy8gTWVkaWFTZXJ2ZXIgaXMgY2FwYWJsZSBvZiBoYW5kbGluZyBmbG9hdCBleHRyYWN0b3Igb3V0cHV0LCBidXQgZ2VuZXJhbCBwcm9jZXNzZXMKKy8vIG1heSBub3QgYmUgYWJsZSB0byBkbyBzby4KKy8vIFRPRE86IEltcHJvdmUgQVBJIHRvIHNldCBleHRyYWN0b3IgZmxvYXQgb3V0cHV0LgorLy8gKE5vdGU6IGR1cGxpY2F0ZWQgd2l0aCBGTEFDRXh0cmFjdG9yLmNwcCkKK3N0YXRpYyBpbmxpbmUgYm9vbCBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChpbnQgYml0c1BlclNhbXBsZSkKK3sKKyAgICByZXR1cm4gYml0c1BlclNhbXBsZSA+IDE2ICYmIEFJQmluZGVyX2dldENhbGxpbmdVaWQoKSA9PSBBSURfTUVESUE7Cit9CisKIGVudW0gewogICAgIFdBVkVfRk9STUFUX1BDTSAgICAgICAgPSAweDAwMDEsCiAgICAgV0FWRV9GT1JNQVRfSUVFRV9GTE9BVCA9IDB4MDAwMywKQEAgLTU1LDIyICs2NiwyMiBAQAogICAgIHJldHVybiBwdHJbMV0gPDwgOCB8IHB0clswXTsKIH0KIAotc3RydWN0IFdBVlNvdXJjZSA6IHB1YmxpYyBNZWRpYVRyYWNrIHsKK3N0cnVjdCBXQVZTb3VyY2UgOiBwdWJsaWMgTWVkaWFUcmFja0hlbHBlciB7CiAgICAgV0FWU291cmNlKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKmRhdGFTb3VyY2UsCi0gICAgICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgICAgICBEYXRhU291cmNlSGVscGVyICpkYXRhU291cmNlLAorICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICAgICAgdWludDE2X3Qgd2F2ZUZvcm1hdCwKLSAgICAgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZSwKKyAgICAgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQsCiAgICAgICAgICAgICBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydChNZXRhRGF0YUJhc2UgKnBhcmFtcyA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCBzdGFydCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3Qgc3RvcCgpOworICAgIHZpcnR1YWwgbWVkaWFfc3RhdHVzX3QgZ2V0Rm9ybWF0KEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQoCi0gICAgICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CisgICAgdmlydHVhbCBtZWRpYV9zdGF0dXNfdCByZWFkKAorICAgICAgICAgICAgTWVkaWFCdWZmZXJIZWxwZXIgKipidWZmZXIsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zID0gTlVMTCk7CiAKLSAgICB2aXJ0dWFsIGJvb2wgc3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpIHsgcmV0dXJuIHRydWU7IH0KKyAgICBib29sIHN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkKCkgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfldBVlNvdXJjZSgpOwpAQCAtNzgsNjQgKzg5LDcyIEBACiBwcml2YXRlOgogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heEZyYW1lU2l6ZTsKIAotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKLSAgICBNZXRhRGF0YUJhc2UgJm1NZXRhOworICAgIERhdGFTb3VyY2VIZWxwZXIgKm1EYXRhU291cmNlOworICAgIEFNZWRpYUZvcm1hdCAqbU1ldGE7CiAgICAgdWludDE2X3QgbVdhdmVGb3JtYXQ7CisgICAgY29uc3QgYm9vbCBtT3V0cHV0RmxvYXQ7CiAgICAgaW50MzJfdCBtU2FtcGxlUmF0ZTsKICAgICBpbnQzMl90IG1OdW1DaGFubmVsczsKICAgICBpbnQzMl90IG1CaXRzUGVyU2FtcGxlOwogICAgIG9mZjY0X3QgbU9mZnNldDsKICAgICBzaXplX3QgbVNpemU7CiAgICAgYm9vbCBtU3RhcnRlZDsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICptR3JvdXA7CiAgICAgb2ZmNjRfdCBtQ3VycmVudFBvczsKIAogICAgIFdBVlNvdXJjZShjb25zdCBXQVZTb3VyY2UgJik7CiAgICAgV0FWU291cmNlICZvcGVyYXRvcj0oY29uc3QgV0FWU291cmNlICYpOwogfTsKIAotV0FWRXh0cmFjdG9yOjpXQVZFeHRyYWN0b3IoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSkKK1dBVkV4dHJhY3Rvcjo6V0FWRXh0cmFjdG9yKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSkKICAgICA6IG1EYXRhU291cmNlKHNvdXJjZSksCiAgICAgICBtVmFsaWRGb3JtYXQoZmFsc2UpLAogICAgICAgbUNoYW5uZWxNYXNrKENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUikgeworICAgIG1UcmFja01ldGEgPSBBTWVkaWFGb3JtYXRfbmV3KCk7CiAgICAgbUluaXRDaGVjayA9IGluaXQoKTsKIH0KIAogV0FWRXh0cmFjdG9yOjp+V0FWRXh0cmFjdG9yKCkgeworICAgIGRlbGV0ZSBtRGF0YVNvdXJjZTsKKyAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1UcmFja01ldGEpOwogfQogCi1zdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSkgewotICAgIG1ldGEuY2xlYXIoKTsKK21lZGlhX3N0YXR1c190IFdBVkV4dHJhY3Rvcjo6Z2V0TWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhKSB7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1ldGEpOwogICAgIGlmIChtSW5pdENoZWNrID09IE9LKSB7Ci0gICAgICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVYpOworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBVik7CiAgICAgfQogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKIHNpemVfdCBXQVZFeHRyYWN0b3I6OmNvdW50VHJhY2tzKCkgewogICAgIHJldHVybiBtSW5pdENoZWNrID09IE9LID8gMSA6IDA7CiB9CiAKLU1lZGlhVHJhY2sgKldBVkV4dHJhY3Rvcjo6Z2V0VHJhY2soc2l6ZV90IGluZGV4KSB7CitNZWRpYVRyYWNrSGVscGVyICpXQVZFeHRyYWN0b3I6OmdldFRyYWNrKHNpemVfdCBpbmRleCkgewogICAgIGlmIChtSW5pdENoZWNrICE9IE9LIHx8IGluZGV4ID4gMCkgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKICAgICByZXR1cm4gbmV3IFdBVlNvdXJjZSgKICAgICAgICAgICAgIG1EYXRhU291cmNlLCBtVHJhY2tNZXRhLAotICAgICAgICAgICAgbVdhdmVGb3JtYXQsIG1CaXRzUGVyU2FtcGxlLCBtRGF0YU9mZnNldCwgbURhdGFTaXplKTsKKyAgICAgICAgICAgIG1XYXZlRm9ybWF0LCBzaG91bGRFeHRyYWN0b3JPdXRwdXRGbG9hdChtQml0c1BlclNhbXBsZSksIG1EYXRhT2Zmc2V0LCBtRGF0YVNpemUpOwogfQogCi1zdGF0dXNfdCBXQVZFeHRyYWN0b3I6OmdldFRyYWNrTWV0YURhdGEoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKK21lZGlhX3N0YXR1c190IFdBVkV4dHJhY3Rvcjo6Z2V0VHJhY2tNZXRhRGF0YSgKKyAgICAgICAgQU1lZGlhRm9ybWF0ICptZXRhLAogICAgICAgICBzaXplX3QgaW5kZXgsIHVpbnQzMl90IC8qIGZsYWdzICovKSB7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0sgfHwgaW5kZXggPiAwKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCi0gICAgbWV0YSA9IG1UcmFja01ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIGNvbnN0IG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1UcmFja01ldGEpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLAorICAgICAgICAgICAgICAgIHNob3VsZEV4dHJhY3Rvck91dHB1dEZsb2F0KG1CaXRzUGVyU2FtcGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgPyBrQXVkaW9FbmNvZGluZ1BjbUZsb2F0IDoga0F1ZGlvRW5jb2RpbmdQY20xNmJpdCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IFdBVkV4dHJhY3Rvcjo6aW5pdCgpIHsKQEAgLTE4NSw3ICsyMDQsNyBAQAogICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9NVUxBVwogICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9NU0dTTQogICAgICAgICAgICAgICAgICAgICAmJiBtV2F2ZUZvcm1hdCAhPSBXQVZFX0ZPUk1BVF9FWFRFTlNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHVpbnQ4X3QgZm10U2l6ZSA9IDE2OwpAQCAtMTk4LDEzICsyMTcsMTMgQEAKIAogICAgICAgICAgICAgbU51bUNoYW5uZWxzID0gVTE2X0xFX0FUKCZmb3JtYXRTcGVjWzJdKTsKIAotICAgICAgICAgICAgaWYgKG1OdW1DaGFubmVscyA8IDEgfHwgbU51bUNoYW5uZWxzID4gOCkgeworICAgICAgICAgICAgaWYgKG1OdW1DaGFubmVscyA8IDEgfHwgbU51bUNoYW5uZWxzID4gRkNDXzgpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgbnVtYmVyIG9mIGNoYW5uZWxzICglZCkiLCBtTnVtQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICAgICAgICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpZiAobVdhdmVGb3JtYXQgIT0gV0FWRV9GT1JNQVRfRVhURU5TSUJMRSkgewotICAgICAgICAgICAgICAgIGlmIChtTnVtQ2hhbm5lbHMgIT0gMSAmJiBtTnVtQ2hhbm5lbHMgIT0gMikgeworICAgICAgICAgICAgICAgIGlmIChtTnVtQ2hhbm5lbHMgIT0gMSAmJiBtTnVtQ2hhbm5lbHMgIT0gRkNDXzIpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coIk1vcmUgdGhhbiAyIGNoYW5uZWxzICglZCkgaW4gbm9uLVdBVkVfRVhULCB1bmtub3duIGNoYW5uZWwgbWFzayIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bUNoYW5uZWxzKTsKICAgICAgICAgICAgICAgICB9CkBAIC0yMjQsNyArMjQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbGlkQml0c1BlclNhbXBsZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgidmFsaWRCaXRzKCVkKSAhPSBiaXRzUGVyU2FtcGxlKCVkKSBhcmUgbm90IHN1cHBvcnRlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkQml0c1BlclNhbXBsZSwgbUJpdHNQZXJTYW1wbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIG9ubHkgc3VwcG9ydCB2YWxpdEJpdHNQZXJTYW1wbGUgPT0gYml0c1BlclNhbXBsZSBidXQgc29tZSBXQVZfRVhUCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3cml0ZXJzIGRvbid0IGNvcnJlY3RseSBzZXQgdGhlIHZhbGlkIGJpdHMgdmFsdWUsIGFuZCBsZWF2ZSBpdCBhdCAwLgpAQCAtMjg0LDM1ICszMDMsMzMgQEAKICAgICAgICAgICAgICAgICBtRGF0YU9mZnNldCA9IG9mZnNldDsKICAgICAgICAgICAgICAgICBtRGF0YVNpemUgPSBjaHVua1NpemU7CiAKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2NsZWFyKG1UcmFja01ldGEpOwogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChtV2F2ZUZvcm1hdCkgewogICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX1BDTToKICAgICAgICAgICAgICAgICAgICAgY2FzZSBXQVZFX0ZPUk1BVF9JRUVFX0ZMT0FUOgotICAgICAgICAgICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRDU3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX1JBVyk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1UcmFja01ldGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBjYXNlIFdBVkVfRk9STUFUX0FMQVc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9BTEFXKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobVRyYWNrTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX0FMQVcpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgV0FWRV9GT1JNQVRfTVNHU006Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU00pOworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtVHJhY2tNZXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVdhdmVGb3JtYXQsICh1aW50MTZfdClXQVZFX0ZPUk1BVF9NVUxBVyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldENTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fRzcxMV9NTEFXKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobVRyYWNrTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLCBNRURJQV9NSU1FVFlQRV9BVURJT19HNzExX01MQVcpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCBtTnVtQ2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50MzIoa0tleUNoYW5uZWxNYXNrLCBtQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIG1UcmFja01ldGEuc2V0SW50MzIoa0tleVNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCBtQml0c1BlclNhbXBsZSk7Ci0gICAgICAgICAgICAgICAgbVRyYWNrTWV0YS5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQpOwotCisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbU51bUNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobVRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX01BU0ssIG1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1UcmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobVRyYWNrTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsIG1CaXRzUGVyU2FtcGxlKTsKICAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSAwOwogICAgICAgICAgICAgICAgIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9NU0dTTSkgewogICAgICAgICAgICAgICAgICAgICAvLyA2NSBieXRlcyBkZWNvZGUgdG8gMzIwIDhrSHogc2FtcGxlcwpAQCAtMzIyLDE4ICszMzksMTggQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzUGVyU2FtcGxlID0gbUJpdHNQZXJTYW1wbGUgPj4gMzsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoIWJ5dGVzUGVyU2FtcGxlIHx8ICFtTnVtQ2hhbm5lbHMpCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CiAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG51bV9zYW1wbGVzID0gbURhdGFTaXplIC8gKG1OdW1DaGFubmVscyAqIGJ5dGVzUGVyU2FtcGxlKTsKIAogICAgICAgICAgICAgICAgICAgICBpZiAoIW1TYW1wbGVSYXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfTUFMRk9STUVEOwogCiAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uVXMgPQogICAgICAgICAgICAgICAgICAgICAgICAgMTAwMDAwMExMICogbnVtX3NhbXBsZXMgLyBtU2FtcGxlUmF0ZTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBtVHJhY2tNZXRhLnNldEludDY0KGtLZXlEdXJhdGlvbiwgZHVyYXRpb25Vcyk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDY0KG1UcmFja01ldGEsIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04sIGR1cmF0aW9uVXMpOwogCiAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICAgICAgfQpAQCAtMzQ4LDI1ICszNjUsMjEgQEAKIGNvbnN0IHNpemVfdCBXQVZTb3VyY2U6OmtNYXhGcmFtZVNpemUgPSAzMjc2ODsKIAogV0FWU291cmNlOjpXQVZTb3VyY2UoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpkYXRhU291cmNlLAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCisgICAgICAgIERhdGFTb3VyY2VIZWxwZXIgKmRhdGFTb3VyY2UsCisgICAgICAgIEFNZWRpYUZvcm1hdCAqbWV0YSwKICAgICAgICAgdWludDE2X3Qgd2F2ZUZvcm1hdCwKLSAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlLAorICAgICAgICBib29sIG91dHB1dEZsb2F0LAogICAgICAgICBvZmY2NF90IG9mZnNldCwgc2l6ZV90IHNpemUpCiAgICAgOiBtRGF0YVNvdXJjZShkYXRhU291cmNlKSwKICAgICAgIG1NZXRhKG1ldGEpLAogICAgICAgbVdhdmVGb3JtYXQod2F2ZUZvcm1hdCksCi0gICAgICBtU2FtcGxlUmF0ZSgwKSwKLSAgICAgIG1OdW1DaGFubmVscygwKSwKLSAgICAgIG1CaXRzUGVyU2FtcGxlKGJpdHNQZXJTYW1wbGUpLAorICAgICAgbU91dHB1dEZsb2F0KG91dHB1dEZsb2F0KSwKICAgICAgIG1PZmZzZXQob2Zmc2V0KSwKICAgICAgIG1TaXplKHNpemUpLAotICAgICAgbVN0YXJ0ZWQoZmFsc2UpLAotICAgICAgbUdyb3VwKE5VTEwpIHsKLSAgICBDSEVDSyhtTWV0YS5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZtU2FtcGxlUmF0ZSkpOwotICAgIENIRUNLKG1NZXRhLmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbU51bUNoYW5uZWxzKSk7Ci0KLSAgICBtTWV0YS5zZXRJbnQzMihrS2V5TWF4SW5wdXRTaXplLCBrTWF4RnJhbWVTaXplKTsKKyAgICAgIG1TdGFydGVkKGZhbHNlKSB7CisgICAgQ0hFQ0soQU1lZGlhRm9ybWF0X2dldEludDMyKG1NZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCAmbVNhbXBsZVJhdGUpKTsKKyAgICBDSEVDSyhBTWVkaWFGb3JtYXRfZ2V0SW50MzIobU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgJm1OdW1DaGFubmVscykpOworICAgIENIRUNLKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihtTWV0YSwgQU1FRElBRk9STUFUX0tFWV9CSVRTX1BFUl9TQU1QTEUsICZtQml0c1BlclNhbXBsZSkpOwogfQogCiBXQVZTb3VyY2U6On5XQVZTb3VyY2UoKSB7CkBAIC0zNzUsNTIgKzM4OCw1MSBAQAogICAgIH0KIH0KIAotc3RhdHVzX3QgV0FWU291cmNlOjpzdGFydChNZXRhRGF0YUJhc2UgKiAvKiBwYXJhbXMgKi8pIHsKK21lZGlhX3N0YXR1c190IFdBVlNvdXJjZTo6c3RhcnQoKSB7CiAgICAgQUxPR1YoIldBVlNvdXJjZTo6c3RhcnQiKTsKIAogICAgIENIRUNLKCFtU3RhcnRlZCk7CiAKICAgICAvLyBzb21lIFdBViBmaWxlcyBtYXkgaGF2ZSBsYXJnZSBhdWRpbyBidWZmZXJzIHRoYXQgdXNlIHNoYXJlZCBtZW1vcnkgdHJhbnNmZXIuCi0gICAgbUdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXAoNCAvKiBidWZmZXJzICovLCBrTWF4RnJhbWVTaXplKTsKLQotICAgIGlmIChtQml0c1BlclNhbXBsZSA9PSA4KSB7Ci0gICAgICAgIC8vIEFzIGEgdGVtcG9yYXJ5IGJ1ZmZlciBmb3IgOC0+MTYgYml0IGNvbnZlcnNpb24uCi0gICAgICAgIG1Hcm91cC0+YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2U6OkNyZWF0ZShrTWF4RnJhbWVTaXplKSk7CisgICAgaWYgKCFtQnVmZmVyR3JvdXAtPmluaXQoNCAvKiBidWZmZXJzICovLCBrTWF4RnJhbWVTaXplKSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQogCiAgICAgbUN1cnJlbnRQb3MgPSBtT2Zmc2V0OwogCiAgICAgbVN0YXJ0ZWQgPSB0cnVlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IFdBVlNvdXJjZTo6c3RvcCgpIHsKK21lZGlhX3N0YXR1c190IFdBVlNvdXJjZTo6c3RvcCgpIHsKICAgICBBTE9HVigiV0FWU291cmNlOjpzdG9wIik7CiAKICAgICBDSEVDSyhtU3RhcnRlZCk7CiAKLSAgICBkZWxldGUgbUdyb3VwOwotICAgIG1Hcm91cCA9IE5VTEw7Ci0KICAgICBtU3RhcnRlZCA9IGZhbHNlOwogCi0gICAgcmV0dXJuIE9LOworICAgIHJldHVybiBBTUVESUFfT0s7CiB9CiAKLXN0YXR1c190IFdBVlNvdXJjZTo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSAmbWV0YSkgeworbWVkaWFfc3RhdHVzX3QgV0FWU291cmNlOjpnZXRGb3JtYXQoQU1lZGlhRm9ybWF0ICptZXRhKSB7CiAgICAgQUxPR1YoIldBVlNvdXJjZTo6Z2V0Rm9ybWF0Iik7CiAKLSAgICBtZXRhID0gbU1ldGE7Ci0gICAgcmV0dXJuIE9LOworICAgIGNvbnN0IG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUZvcm1hdF9jb3B5KG1ldGEsIG1NZXRhKTsKKyAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01BWF9JTlBVVF9TSVpFLCBrTWF4RnJhbWVTaXplKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfUENNX0VOQ09ESU5HLAorICAgICAgICAgICAgICAgIG1PdXRwdXRGbG9hdCA/IGtBdWRpb0VuY29kaW5nUGNtRmxvYXQgOiBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgV0FWU291cmNlOjpyZWFkKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGNvbnN0IFJlYWRPcHRpb25zICpvcHRpb25zKSB7CittZWRpYV9zdGF0dXNfdCBXQVZTb3VyY2U6OnJlYWQoCisgICAgICAgIE1lZGlhQnVmZmVySGVscGVyICoqb3V0LCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgewogICAgICpvdXQgPSBOVUxMOwogCi0gICAgaWYgKG9wdGlvbnMgIT0gbnVsbHB0ciAmJiBvcHRpb25zLT5nZXROb25CbG9ja2luZygpICYmICFtR3JvdXAtPmhhc19idWZmZXJzKCkpIHsKLSAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgIGlmIChvcHRpb25zICE9IG51bGxwdHIgJiYgb3B0aW9ucy0+Z2V0Tm9uQmxvY2tpbmcoKSAmJiAhbUJ1ZmZlckdyb3VwLT5oYXNfYnVmZmVycygpKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfV09VTERfQkxPQ0s7CiAgICAgfQogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzOwpAQCAtNDQyLDE4ICs0NTQsMjIgQEAKICAgICAgICAgbUN1cnJlbnRQb3MgPSBwb3MgKyBtT2Zmc2V0OwogICAgIH0KIAotICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyOwotICAgIHN0YXR1c190IGVyciA9IG1Hcm91cC0+YWNxdWlyZV9idWZmZXIoJmJ1ZmZlcik7CisgICAgTWVkaWFCdWZmZXJIZWxwZXIgKmJ1ZmZlcjsKKyAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBtQnVmZmVyR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZidWZmZXIpOwogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CiAKLSAgICAvLyBtYWtlIHN1cmUgdGhhdCBtYXhCeXRlc1RvUmVhZCBpcyBtdWx0aXBsZSBvZiAzLCBpbiAyNC1iaXQgY2FzZQotICAgIHNpemVfdCBtYXhCeXRlc1RvUmVhZCA9Ci0gICAgICAgIG1CaXRzUGVyU2FtcGxlID09IDggPyBrTWF4RnJhbWVTaXplIC8gMiA6IAotICAgICAgICAobUJpdHNQZXJTYW1wbGUgPT0gMjQgPyAzKihrTWF4RnJhbWVTaXplLzMpOiBrTWF4RnJhbWVTaXplKTsKKyAgICAvLyBtYXhCeXRlc1RvUmVhZCBtYXkgYmUgcmVkdWNlZCBzbyB0aGF0IGluLXBsYWNlIGRhdGEgY29udmVyc2lvbiB3aWxsIGZpdCBpbiBidWZmZXIgc2l6ZS4KKyAgICBjb25zdCBzaXplX3QgYnVmZmVyU2l6ZSA9IHN0ZDo6bWluKGJ1ZmZlci0+c2l6ZSgpLCBrTWF4RnJhbWVTaXplKTsKKyAgICBzaXplX3QgbWF4Qnl0ZXNUb1JlYWQ7CisgICAgaWYgKG1PdXRwdXRGbG9hdCkgeyAvLyBkZXN0aW5hdGlvbiBpcyBmbG9hdCBhdCA0IGJ5dGVzIHBlciBzYW1wbGUsIHNvdXJjZSBtYXkgYmUgbGVzcy4KKyAgICAgICAgbWF4Qnl0ZXNUb1JlYWQgPSAobUJpdHNQZXJTYW1wbGUgLyA4KSAqIChidWZmZXJTaXplIC8gNCk7CisgICAgfSBlbHNlIHsgLy8gZGVzdGluYXRpb24gaXMgaW50MTZfdCBhdCAyIGJ5dGVzIHBlciBzYW1wbGUsIG9ubHkgc291cmNlIG9mIDggYml0cyBpcyBsZXNzLgorICAgICAgICBtYXhCeXRlc1RvUmVhZCA9IG1CaXRzUGVyU2FtcGxlID09IDggPyBidWZmZXJTaXplIC8gMiA6IGJ1ZmZlclNpemU7CisgICAgfQogCi0gICAgc2l6ZV90IG1heEJ5dGVzQXZhaWxhYmxlID0KKyAgICBjb25zdCBzaXplX3QgbWF4Qnl0ZXNBdmFpbGFibGUgPQogICAgICAgICAobUN1cnJlbnRQb3MgLSBtT2Zmc2V0ID49IChvZmY2NF90KW1TaXplKQogICAgICAgICAgICAgPyAwIDogbVNpemUgLSAobUN1cnJlbnRQb3MgLSBtT2Zmc2V0KTsKIApAQCAtNDgyLDQ1ICs0OTgsNTkgQEAKICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CiAgICAgICAgIGJ1ZmZlciA9IE5VTEw7CiAKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTTsKICAgICB9CiAKICAgICBidWZmZXItPnNldF9yYW5nZSgwLCBuKTsKIAogICAgIC8vIFRPRE86IGFkZCBjYXBhYmlsaXR5IHRvIHJldHVybiBkYXRhIGFzIGZsb2F0IFBDTSBpbnN0ZWFkIG9mIDE2IGJpdCBQQ00uCiAgICAgaWYgKG1XYXZlRm9ybWF0ID09IFdBVkVfRk9STUFUX1BDTSkgewotICAgICAgICBpZiAobUJpdHNQZXJTYW1wbGUgPT0gOCkgewotICAgICAgICAgICAgLy8gQ29udmVydCA4LWJpdCB1bnNpZ25lZCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQuCi0KLSAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgYnVmZmVyIHdpdGggMiBieXRlIHdpZGUgc2FtcGxlcwotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICp0bXA7Ci0gICAgICAgICAgICBDSEVDS19FUShtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKCZ0bXApLCAoc3RhdHVzX3QpT0spOwotICAgICAgICAgICAgdG1wLT5zZXRfcmFuZ2UoMCwgMiAqIG4pOwotCi0gICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fdTgoKGludDE2X3QgKil0bXAtPmRhdGEoKSwgKGNvbnN0IHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSwgbik7Ci0gICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIGJ1ZmZlciA9IHRtcDsKLSAgICAgICAgfSBlbHNlIGlmIChtQml0c1BlclNhbXBsZSA9PSAyNCkgewotICAgICAgICAgICAgLy8gQ29udmVydCAyNC1iaXQgc2lnbmVkIHNhbXBsZXMgdG8gMTYtYml0IHNpZ25lZCBpbiBwbGFjZQotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBuIC8gMzsKLQotICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX3AyNCgoaW50MTZfdCAqKWJ1ZmZlci0+ZGF0YSgpLCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgY29uc3Qgc2l6ZV90IGJ5dGVzUGVyRnJhbWUgPSAobUJpdHNQZXJTYW1wbGUgPj4gMykgKiBtTnVtQ2hhbm5lbHM7CisgICAgICAgIGNvbnN0IHNpemVfdCBudW1GcmFtZXMgPSBuIC8gYnl0ZXNQZXJGcmFtZTsKKyAgICAgICAgY29uc3Qgc2l6ZV90IG51bVNhbXBsZXMgPSBudW1GcmFtZXMgKiBtTnVtQ2hhbm5lbHM7CisgICAgICAgIGlmIChtT3V0cHV0RmxvYXQpIHsKKyAgICAgICAgICAgIGZsb2F0ICpmZGVzdCA9IChmbG9hdCAqKWJ1ZmZlci0+ZGF0YSgpOworICAgICAgICAgICAgYnVmZmVyLT5zZXRfcmFuZ2UoMCwgNCAqIG51bVNhbXBsZXMpOworICAgICAgICAgICAgc3dpdGNoIChtQml0c1BlclNhbXBsZSkgeworICAgICAgICAgICAgY2FzZSA4OiB7CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21fdTgoZmRlc3QsIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY6IHsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoZmRlc3QsIChjb25zdCBpbnQxNl90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjQ6IHsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9wMjQoZmRlc3QsIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMzI6IHsgLy8gYnVmZmVyIHJhbmdlIGlzIGNvcnJlY3QKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMzIoZmRlc3QsIChjb25zdCBpbnQzMl90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGludDE2X3QgKmlkZXN0ID0gKGludDE2X3QgKilidWZmZXItPmRhdGEoKTsKICAgICAgICAgICAgIGJ1ZmZlci0+c2V0X3JhbmdlKDAsIDIgKiBudW1TYW1wbGVzKTsKLSAgICAgICAgfSAgZWxzZSBpZiAobUJpdHNQZXJTYW1wbGUgPT0gMzIpIHsKLSAgICAgICAgICAgIC8vIENvbnZlcnQgMzItYml0IHNpZ25lZCBzYW1wbGVzIHRvIDE2LWJpdCBzaWduZWQgaW4gcGxhY2UKLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBudW1TYW1wbGVzID0gbiAvIDQ7Ci0KLSAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9pMzIoKGludDE2X3QgKilidWZmZXItPmRhdGEoKSwgKGNvbnN0IGludDMyX3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCAyICogbnVtU2FtcGxlcyk7CisgICAgICAgICAgICBzd2l0Y2ggKG1CaXRzUGVyU2FtcGxlKSB7CisgICAgICAgICAgICBjYXNlIDg6IHsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fdTgoaWRlc3QsIChjb25zdCB1aW50OF90ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTY6CisgICAgICAgICAgICAgICAgLy8gbm8gY29udmVyc2lvbiBuZWVkZWQKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMjQ6IHsKKyAgICAgICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fcDI0KGlkZXN0LCAoY29uc3QgdWludDhfdCAqKWJ1ZmZlci0+ZGF0YSgpLCBudW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIDMyOiB7CisgICAgICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2kzMihpZGVzdCwgKGNvbnN0IGludDMyX3QgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtV2F2ZUZvcm1hdCA9PSBXQVZFX0ZPUk1BVF9JRUVFX0ZMT0FUKSB7Ci0gICAgICAgIGlmIChtQml0c1BlclNhbXBsZSA9PSAzMikgewotICAgICAgICAgICAgLy8gQ29udmVydCAzMi1iaXQgZmxvYXQgc2FtcGxlcyB0byAxNi1iaXQgc2lnbmVkIGluIHBsYWNlCisgICAgICAgIGlmICghbU91dHB1dEZsb2F0KSB7IC8vIG1CaXRzUGVyU2FtcGxlID09IDMyCisgICAgICAgICAgICBpbnQxNl90ICppZGVzdCA9IChpbnQxNl90ICopYnVmZmVyLT5kYXRhKCk7CiAgICAgICAgICAgICBjb25zdCBzaXplX3QgbnVtU2FtcGxlcyA9IG4gLyA0OwotCi0gICAgICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoKGludDE2X3QgKilidWZmZXItPmRhdGEoKSwgKGNvbnN0IGZsb2F0ICopYnVmZmVyLT5kYXRhKCksIG51bVNhbXBsZXMpOworICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KGlkZXN0LCAoY29uc3QgZmxvYXQgKilidWZmZXItPmRhdGEoKSwgbnVtU2FtcGxlcyk7CiAgICAgICAgICAgICBidWZmZXItPnNldF9yYW5nZSgwLCAyICogbnVtU2FtcGxlcyk7CiAgICAgICAgIH0KKyAgICAgICAgLy8gTm90ZTogaWYgb3V0cHV0IGVuY29kaW5nIGlzIGZsb2F0LCBubyBuZWVkIHRvIGNvbnZlcnQgaWYgc291cmNlIGlzIGZsb2F0LgogICAgIH0KIAogICAgIGludDY0X3QgdGltZVN0YW1wVXMgPSAwOwpAQCAtNTMzLDM5ICs1NjMsNDMgQEAKICAgICAgICAgICAgICAgICAvIChtTnVtQ2hhbm5lbHMgKiBieXRlc1BlclNhbXBsZSkgLyBtU2FtcGxlUmF0ZTsKICAgICB9CiAKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDY0KGtLZXlUaW1lLCB0aW1lU3RhbXBVcyk7CisgICAgQU1lZGlhRm9ybWF0ICptZXRhID0gYnVmZmVyLT5tZXRhX2RhdGEoKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobWV0YSwgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTLCB0aW1lU3RhbXBVcyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSwgMSk7CiAKLSAgICBidWZmZXItPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CiAgICAgbUN1cnJlbnRQb3MgKz0gbjsKIAogICAgICpvdXQgPSBidWZmZXI7CiAKLSAgICByZXR1cm4gT0s7CisgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIAotc3RhdGljIE1lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCitzdGF0aWMgQ01lZGlhRXh0cmFjdG9yKiBDcmVhdGVFeHRyYWN0b3IoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCiAgICAgICAgIHZvaWQgKikgewotICAgIHJldHVybiBuZXcgV0FWRXh0cmFjdG9yKHNvdXJjZSk7CisgICAgcmV0dXJuIHdyYXAobmV3IFdBVkV4dHJhY3RvcihuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpKSk7CiB9CiAKLXN0YXRpYyBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgU25pZmYoCi0gICAgICAgIERhdGFTb3VyY2VCYXNlICpzb3VyY2UsCitzdGF0aWMgQ3JlYXRvckZ1bmMgU25pZmYoCisgICAgICAgIENEYXRhU291cmNlICpzb3VyY2UsCiAgICAgICAgIGZsb2F0ICpjb25maWRlbmNlLAogICAgICAgICB2b2lkICoqLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICopIHsKKyAgICAgICAgRnJlZU1ldGFGdW5jICopIHsKKyAgICBEYXRhU291cmNlSGVscGVyICpoZWxwZXIgPSBuZXcgRGF0YVNvdXJjZUhlbHBlcihzb3VyY2UpOwogICAgIGNoYXIgaGVhZGVyWzEyXTsKLSAgICBpZiAoc291cmNlLT5yZWFkQXQoMCwgaGVhZGVyLCBzaXplb2YoaGVhZGVyKSkgPCAoc3NpemVfdClzaXplb2YoaGVhZGVyKSkgeworICAgIGlmIChoZWxwZXItPnJlYWRBdCgwLCBoZWFkZXIsIHNpemVvZihoZWFkZXIpKSA8IChzc2l6ZV90KXNpemVvZihoZWFkZXIpKSB7CisgICAgICAgIGRlbGV0ZSBoZWxwZXI7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAogICAgIGlmIChtZW1jbXAoaGVhZGVyLCAiUklGRiIsIDQpIHx8IG1lbWNtcCgmaGVhZGVyWzhdLCAiV0FWRSIsIDQpKSB7CisgICAgICAgIGRlbGV0ZSBoZWxwZXI7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIE1lZGlhRXh0cmFjdG9yICpleHRyYWN0b3IgPSBuZXcgV0FWRXh0cmFjdG9yKHNvdXJjZSk7CisgICAgV0FWRXh0cmFjdG9yICpleHRyYWN0b3IgPSBuZXcgV0FWRXh0cmFjdG9yKGhlbHBlcik7IC8vIGV4dHJhY3RvciBvd25zIHRoZSBoZWxwZXIKICAgICBpbnQgbnVtVHJhY2tzID0gZXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwogICAgIGRlbGV0ZSBleHRyYWN0b3I7CiAgICAgaWYgKG51bVRyYWNrcyA9PSAwKSB7CkBAIC01NzcsMTYgKzYxMSwyMSBAQAogICAgIHJldHVybiBDcmVhdGVFeHRyYWN0b3I7CiB9CiAKK3N0YXRpYyBjb25zdCBjaGFyICpleHRlbnNpb25zW10gPSB7CisgICAgIndhdiIsCisgICAgTlVMTAorfTsKKwogZXh0ZXJuICJDIiB7CiAvLyBUaGlzIGlzIHRoZSBvbmx5IHN5bWJvbCB0aGF0IG5lZWRzIHRvIGJlIGV4cG9ydGVkCiBfX2F0dHJpYnV0ZV9fICgodmlzaWJpbGl0eSAoImRlZmF1bHQiKSkpCi1NZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIEdFVEVYVFJBQ1RPUkRFRigpIHsKK0V4dHJhY3RvckRlZiBHRVRFWFRSQUNUT1JERUYoKSB7CiAgICAgcmV0dXJuIHsKLSAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkVYVFJBQ1RPUkRFRl9WRVJTSU9OLAorICAgICAgICBFWFRSQUNUT1JERUZfVkVSU0lPTiwKICAgICAgICAgVVVJRCgiN2Q2MTM4NTgtNTgzNy00YTM4LTg0YzUtMzMyZDFjZGRlZTI3IiksCiAgICAgICAgIDEsIC8vIHZlcnNpb24KICAgICAgICAgIldBViBFeHRyYWN0b3IiLAotICAgICAgICBTbmlmZgorICAgICAgICB7IC52MyA9IHtTbmlmZiwgZXh0ZW5zaW9uc30gfSwKICAgICB9OwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9leHRyYWN0b3JzL3dhdi9XQVZFeHRyYWN0b3IuaCBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5oCmluZGV4IDQ2N2QwYjcuLmI1MTQxOTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5oCisrKyBiL21lZGlhL2V4dHJhY3RvcnMvd2F2L1dBVkV4dHJhY3Rvci5oCkBAIC0xOSwzMCArMTksMzEgQEAKICNkZWZpbmUgV0FWX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQU1lc3NhZ2U7Ci1jbGFzcyBEYXRhU291cmNlQmFzZTsKK3N0cnVjdCBDRGF0YVNvdXJjZTsKIGNsYXNzIFN0cmluZzg7CiAKLWNsYXNzIFdBVkV4dHJhY3RvciA6IHB1YmxpYyBNZWRpYUV4dHJhY3RvciB7CitjbGFzcyBXQVZFeHRyYWN0b3IgOiBwdWJsaWMgTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIgewogcHVibGljOgotICAgIGV4cGxpY2l0IFdBVkV4dHJhY3RvcihEYXRhU291cmNlQmFzZSAqc291cmNlKTsKKyAgICBleHBsaWNpdCBXQVZFeHRyYWN0b3IoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlKTsKIAogICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpOworICAgIHZpcnR1YWwgTWVkaWFUcmFja0hlbHBlciAqZ2V0VHJhY2soc2l6ZV90IGluZGV4KTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldFRyYWNrTWV0YURhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBzaXplX3QgaW5kZXgsIHVpbnQzMl90IGZsYWdzKTsKIAotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKTsKKyAgICB2aXJ0dWFsIG1lZGlhX3N0YXR1c190IGdldE1ldGFEYXRhKEFNZWRpYUZvcm1hdCAqbWV0YSk7CiAgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICJXQVZFeHRyYWN0b3IiOyB9CiAKICAgICB2aXJ0dWFsIH5XQVZFeHRyYWN0b3IoKTsKIAogcHJpdmF0ZToKLSAgICBEYXRhU291cmNlQmFzZSAqbURhdGFTb3VyY2U7CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbURhdGFTb3VyY2U7CiAgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKICAgICBib29sIG1WYWxpZEZvcm1hdDsKICAgICB1aW50MTZfdCBtV2F2ZUZvcm1hdDsKQEAgLTUyLDcgKzUzLDcgQEAKICAgICB1aW50MTZfdCBtQml0c1BlclNhbXBsZTsKICAgICBvZmY2NF90IG1EYXRhT2Zmc2V0OwogICAgIHNpemVfdCBtRGF0YVNpemU7Ci0gICAgTWV0YURhdGFCYXNlIG1UcmFja01ldGE7CisgICAgQU1lZGlhRm9ybWF0ICptVHJhY2tNZXRhOwogCiAgICAgc3RhdHVzX3QgaW5pdCgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9pbWdfdXRpbHMvaW5jbHVkZS9pbWdfdXRpbHMvRG5nVXRpbHMuaCBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oCmluZGV4IGRlOGYxMjAuLjg4MTlmODcgMTAwNjQ0Ci0tLSBhL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oCisrKyBiL21lZGlhL2ltZ191dGlscy9pbmNsdWRlL2ltZ191dGlscy9EbmdVdGlscy5oCkBAIC00OSw2ICs0OSw3IEBACiAgICAgICAgICAgICBDRkFfUkdHQiwKICAgICAgICAgICAgIENGQV9CR0dSLAogICAgICAgICAgICAgQ0ZBX0dCUkcsCisgICAgICAgICAgICBDRkFfTk9ORSwKICAgICAgICAgfTsKIAogICAgICAgICBPcGNvZGVMaXN0QnVpbGRlcigpOwpAQCAtODksNyArOTAsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2ZhTGF5b3V0IGNmYSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0KiBsZW5zU2hhZGluZ01hcCk7CiAKLQogICAgICAgICAvKioKICAgICAgICAgICogQWRkIGEgR2Fpbk1hcCBvcGNvZGUgd2l0aCB0aGUgZ2l2ZW4gZmllbGRzLiAgVGhlIG1hcEdhaW5zIGFycmF5CiAgICAgICAgICAqIG11c3QgaGF2ZSBtYXBQb2ludHNWICogbWFwUG9pbnRzSCAqIG1hcFBsYW5lcyBlbGVtZW50cy4KQEAgLTE5Nyw2ICsxOTcsMzMgQEAKIAogICAgICAgICBzdGF0dXNfdCBhZGRPcGNvZGVQcmVhbWJsZSh1aW50MzJfdCBvcGNvZGVJZCk7CiAKKyAgICBwcml2YXRlOgorICAgICAgICAvKioKKyAgICAgICAgICogQWRkIEJheWVyIEdhaW5NYXAgb3Bjb2RlKHMpIGZvciB0aGUgZ2l2ZW4gbWV0YWRhdGEgcGFyYW1ldGVycy4KKyAgICAgICAgICogQ0ZBIGxheW91dCBtdXN0IG1hdGNoIHRoZSBsYXlvdXQgb2YgdGhlIHNoYWRpbmcgbWFwIHBhc3NlZCBpbnRvIHRoZQorICAgICAgICAgKiBsZW5zU2hhZGluZ01hcCBwYXJhbWV0ZXIuCisgICAgICAgICAqCisgICAgICAgICAqIFJldHVybnMgT0sgb24gc3VjY2Vzcywgb3IgYSBuZWdhdGl2ZSBlcnJvciBjb2RlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzX3QgYWRkQmF5ZXJHYWluTWFwc0Zvck1ldGFkYXRhKHVpbnQzMl90IGxzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENmYUxheW91dCBjZmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBBZGQgQmF5ZXIgR2Fpbk1hcCBvcGNvZGUocykgZm9yIHRoZSBnaXZlbiBtZXRhZGF0YSBwYXJhbWV0ZXJzLgorICAgICAgICAgKiBDRkEgbGF5b3V0IG11c3QgbWF0Y2ggdGhlIGxheW91dCBvZiB0aGUgc2hhZGluZyBtYXAgcGFzc2VkIGludG8gdGhlCisgICAgICAgICAqIGxlbnNTaGFkaW5nTWFwIHBhcmFtZXRlci4KKyAgICAgICAgICoKKyAgICAgICAgICogUmV0dXJucyBPSyBvbiBzdWNjZXNzLCBvciBhIG5lZ2F0aXZlIGVycm9yIGNvZGUuCisgICAgICAgICAqLworICAgICAgICBzdGF0dXNfdCBhZGRNb25vY2hyb21lR2Fpbk1hcHNGb3JNZXRhZGF0YSh1aW50MzJfdCBsc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxzbUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGFjdGl2ZUFyZWFIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApOwogfTsKIAogfSAvKm5hbWVzcGFjZSBpbWdfdXRpbHMqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvaW1nX3V0aWxzL3NyYy9EbmdVdGlscy5jcHAgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcAppbmRleCA5YWM3ZTJhLi43OTE0MDMwIDEwMDY0NAotLS0gYS9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcAorKysgYi9tZWRpYS9pbWdfdXRpbHMvc3JjL0RuZ1V0aWxzLmNwcApAQCAtNjAsMzQgKzYwLDM2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhUmlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDZmFMYXlvdXQgY2ZhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKSB7CisgICAgc3RhdHVzX3QgZXJyID0gT0s7CiAgICAgdWludDMyX3QgYWN0aXZlQXJlYVdpZHRoID0gYWN0aXZlQXJlYVJpZ2h0IC0gYWN0aXZlQXJlYUxlZnQ7CiAgICAgdWludDMyX3QgYWN0aXZlQXJlYUhlaWdodCA9IGFjdGl2ZUFyZWFCb3R0b20gLSBhY3RpdmVBcmVhVG9wOwotICAgIGRvdWJsZSBzcGFjaW5nViA9IDEuMCAvIHN0ZDo6bWF4KDF1LCBsc21IZWlnaHQgLSAxKTsKLSAgICBkb3VibGUgc3BhY2luZ0ggPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtV2lkdGggLSAxKTsKIAotICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiByZWRNYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOwotICAgIGZsb2F0ICpyZWRNYXAgPSByZWRNYXBWZWN0b3IuZGF0YSgpOwotCi0gICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGdyZWVuRXZlbk1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7Ci0gICAgZmxvYXQgKmdyZWVuRXZlbk1hcCA9IGdyZWVuRXZlbk1hcFZlY3Rvci5kYXRhKCk7Ci0KLSAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gZ3JlZW5PZGRNYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOwotICAgIGZsb2F0ICpncmVlbk9kZE1hcCA9IGdyZWVuT2RkTWFwVmVjdG9yLmRhdGEoKTsKLQotICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBibHVlTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKLSAgICBmbG9hdCAqYmx1ZU1hcCA9IGJsdWVNYXBWZWN0b3IuZGF0YSgpOwotCi0gICAgc2l6ZV90IGxzbU1hcFNpemUgPSBsc21XaWR0aCAqIGxzbUhlaWdodCAqIDQ7Ci0KLSAgICAvLyBTcGxpdCBsZW5zIHNoYWRpbmcgbWFwIGNoYW5uZWxzIGludG8gc2VwYXJhdGUgYXJyYXlzCi0gICAgc2l6ZV90IGogPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbHNtTWFwU2l6ZTsgaSArPSA0LCArK2opIHsKLSAgICAgICAgcmVkTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9SX0lORF07Ci0gICAgICAgIGdyZWVuRXZlbk1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fR0VfSU5EXTsKLSAgICAgICAgZ3JlZW5PZGRNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0dPX0lORF07Ci0gICAgICAgIGJsdWVNYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0JfSU5EXTsKKyAgICBzd2l0Y2ggKGNmYSkgeworICAgICAgICBjYXNlIENGQV9SR0dCOgorICAgICAgICBjYXNlIENGQV9HUkJHOgorICAgICAgICBjYXNlIENGQV9HQlJHOgorICAgICAgICBjYXNlIENGQV9CR0dSOgorICAgICAgICAgICAgZXJyID0gYWRkQmF5ZXJHYWluTWFwc0Zvck1ldGFkYXRhKGxzbVdpZHRoLCBsc21IZWlnaHQsIGFjdGl2ZUFyZWFXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlQXJlYUhlaWdodCwgY2ZhLCBsZW5zU2hhZGluZ01hcCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBDRkFfTk9ORToKKyAgICAgICAgICAgIGVyciA9IGFkZE1vbm9jaHJvbWVHYWluTWFwc0Zvck1ldGFkYXRhKGxzbVdpZHRoLCBsc21IZWlnaHQsIGFjdGl2ZUFyZWFXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlQXJlYUhlaWdodCwgbGVuc1NoYWRpbmdNYXApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVua25vd24gQ0ZBIGxheW91dCAlZCIsIF9fRlVOQ1RJT05fXywgY2ZhKTsKKyAgICAgICAgICAgIGVyciA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgIH0KKyAgICByZXR1cm4gZXJyOworfQogCitzdGF0dXNfdCBPcGNvZGVMaXN0QnVpbGRlcjo6YWRkQmF5ZXJHYWluTWFwc0Zvck1ldGFkYXRhKHVpbnQzMl90IGxzbVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgYWN0aXZlQXJlYUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENmYUxheW91dCBjZmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogbGVuc1NoYWRpbmdNYXApIHsKICAgICB1aW50MzJfdCByZWRUb3AgPSAwOwogICAgIHVpbnQzMl90IHJlZExlZnQgPSAwOwogICAgIHVpbnQzMl90IGdyZWVuRXZlblRvcCA9IDA7CkBAIC0xNDMsMTAgKzE0NSwzNiBAQAogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gcmVkTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKKyAgICBmbG9hdCAqcmVkTWFwID0gcmVkTWFwVmVjdG9yLmRhdGEoKTsKKworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiBncmVlbkV2ZW5NYXBWZWN0b3IobHNtV2lkdGggKiBsc21IZWlnaHQpOworICAgIGZsb2F0ICpncmVlbkV2ZW5NYXAgPSBncmVlbkV2ZW5NYXBWZWN0b3IuZGF0YSgpOworCisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGdyZWVuT2RkTWFwVmVjdG9yKGxzbVdpZHRoICogbHNtSGVpZ2h0KTsKKyAgICBmbG9hdCAqZ3JlZW5PZGRNYXAgPSBncmVlbk9kZE1hcFZlY3Rvci5kYXRhKCk7CisKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gYmx1ZU1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7CisgICAgZmxvYXQgKmJsdWVNYXAgPSBibHVlTWFwVmVjdG9yLmRhdGEoKTsKKworICAgIGRvdWJsZSBzcGFjaW5nViA9IDEuMCAvIHN0ZDo6bWF4KDF1LCBsc21IZWlnaHQgLSAxKTsKKyAgICBkb3VibGUgc3BhY2luZ0ggPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtV2lkdGggLSAxKTsKKworICAgIHNpemVfdCBsc21NYXBTaXplID0gbHNtV2lkdGggKiBsc21IZWlnaHQgKiA0OworCisgICAgLy8gU3BsaXQgbGVucyBzaGFkaW5nIG1hcCBjaGFubmVscyBpbnRvIHNlcGFyYXRlIGFycmF5cworICAgIHNpemVfdCBqID0gMDsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxzbU1hcFNpemU7IGkgKz0gNCwgKytqKSB7CisgICAgICAgIHJlZE1hcFtqXSA9IGxlbnNTaGFkaW5nTWFwW2kgKyBMU01fUl9JTkRdOworICAgICAgICBncmVlbkV2ZW5NYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpICsgTFNNX0dFX0lORF07CisgICAgICAgIGdyZWVuT2RkTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9HT19JTkRdOworICAgICAgICBibHVlTWFwW2pdID0gbGVuc1NoYWRpbmdNYXBbaSArIExTTV9CX0lORF07CisgICAgfQorCiAgICAgc3RhdHVzX3QgZXJyID0gYWRkR2Fpbk1hcCgvKnRvcCovcmVkVG9wLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypsZWZ0Ki9yZWRMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQgLSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypyaWdodCovYWN0aXZlQXJlYVdpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qYm90dG9tKi9hY3RpdmVBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypyaWdodCovYWN0aXZlQXJlYVdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypwbGFuZSovMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmVzKi8xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypyb3dQaXRjaCovMiwKQEAgLTE2Myw4ICsxOTEsOCBAQAogCiAgICAgZXJyID0gYWRkR2Fpbk1hcCgvKnRvcCovZ3JlZW5FdmVuVG9wLAogICAgICAgICAgICAgICAgICAgICAgLypsZWZ0Ki9ncmVlbkV2ZW5MZWZ0LAotICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQgLSAxLAotICAgICAgICAgICAgICAgICAgICAgLypyaWdodCovYWN0aXZlQXJlYVdpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qYm90dG9tKi9hY3RpdmVBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgLypyaWdodCovYWN0aXZlQXJlYVdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgLypwbGFuZSovMCwKICAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmVzKi8xLAogICAgICAgICAgICAgICAgICAgICAgLypyb3dQaXRjaCovMiwKQEAgLTE4MSw4ICsyMDksOCBAQAogCiAgICAgZXJyID0gYWRkR2Fpbk1hcCgvKnRvcCovZ3JlZW5PZGRUb3AsCiAgICAgICAgICAgICAgICAgICAgICAvKmxlZnQqL2dyZWVuT2RkTGVmdCwKLSAgICAgICAgICAgICAgICAgICAgIC8qYm90dG9tKi9hY3RpdmVBcmVhSGVpZ2h0IC0gMSwKLSAgICAgICAgICAgICAgICAgICAgIC8qcmlnaHQqL2FjdGl2ZUFyZWFXaWR0aCAtIDEsCisgICAgICAgICAgICAgICAgICAgICAvKmJvdHRvbSovYWN0aXZlQXJlYUhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgIC8qcmlnaHQqL2FjdGl2ZUFyZWFXaWR0aCwKICAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmUqLzAsCiAgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lcyovMSwKICAgICAgICAgICAgICAgICAgICAgIC8qcm93UGl0Y2gqLzIsCkBAIC0xOTksOCArMjI3LDggQEAKIAogICAgIGVyciA9IGFkZEdhaW5NYXAoLyp0b3AqL2JsdWVUb3AsCiAgICAgICAgICAgICAgICAgICAgICAvKmxlZnQqL2JsdWVMZWZ0LAotICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQgLSAxLAotICAgICAgICAgICAgICAgICAgICAgLypyaWdodCovYWN0aXZlQXJlYVdpZHRoIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgIC8qYm90dG9tKi9hY3RpdmVBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgLypyaWdodCovYWN0aXZlQXJlYVdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgLypwbGFuZSovMCwKICAgICAgICAgICAgICAgICAgICAgIC8qcGxhbmVzKi8xLAogICAgICAgICAgICAgICAgICAgICAgLypyb3dQaXRjaCovMiwKQEAgLTIxNiw2ICsyNDQsNDYgQEAKICAgICByZXR1cm4gZXJyOwogfQogCitzdGF0dXNfdCBPcGNvZGVMaXN0QnVpbGRlcjo6YWRkTW9ub2Nocm9tZUdhaW5NYXBzRm9yTWV0YWRhdGEodWludDMyX3QgbHNtV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBsc21IZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBhY3RpdmVBcmVhSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQqIGxlbnNTaGFkaW5nTWFwKSB7CisgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IG1hcFZlY3Rvcihsc21XaWR0aCAqIGxzbUhlaWdodCk7CisgICAgZmxvYXQgKm1hcCA9IG1hcFZlY3Rvci5kYXRhKCk7CisKKyAgICBkb3VibGUgc3BhY2luZ1YgPSAxLjAgLyBzdGQ6Om1heCgxdSwgbHNtSGVpZ2h0IC0gMSk7CisgICAgZG91YmxlIHNwYWNpbmdIID0gMS4wIC8gc3RkOjptYXgoMXUsIGxzbVdpZHRoIC0gMSk7CisKKyAgICBzaXplX3QgbHNtTWFwU2l6ZSA9IGxzbVdpZHRoICogbHNtSGVpZ2h0ICogNDsKKworICAgIC8vIFNwbGl0IGxlbnMgc2hhZGluZyBtYXAgY2hhbm5lbHMgaW50byBzZXBhcmF0ZSBhcnJheXMKKyAgICBzaXplX3QgaiA9IDA7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBsc21NYXBTaXplOyBpICs9IDQsICsraikgeworICAgICAgICBtYXBbal0gPSBsZW5zU2hhZGluZ01hcFtpXTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBlcnIgPSBhZGRHYWluTWFwKC8qdG9wKi8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypsZWZ0Ki8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypib3R0b20qL2FjdGl2ZUFyZWFIZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnJpZ2h0Ki9hY3RpdmVBcmVhV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnBsYW5lKi8wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypwbGFuZXMqLzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnJvd1BpdGNoKi8xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb2xQaXRjaCovMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwUG9pbnRzViovbHNtSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBQb2ludHNIKi9sc21XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwU3BhY2luZ1YqL3NwYWNpbmdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptYXBTcGFjaW5nSCovc3BhY2luZ0gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcE9yaWdpblYqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcE9yaWdpbkgqLzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKm1hcFBsYW5lcyovMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qbWFwR2FpbnMqL21hcCk7CisgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKworICAgIHJldHVybiBlcnI7Cit9CisKIHN0YXR1c190IE9wY29kZUxpc3RCdWlsZGVyOjphZGRHYWluTWFwKHVpbnQzMl90IHRvcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGxlZnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBib3R0b20sCkBAIC0yOTYsOCArMzY0LDggQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBkb3VibGUgbm9ybWFsaXplZE9DWCA9IG9wdGljYWxDZW50ZXJYIC8gc3RhdGljX2Nhc3Q8ZG91YmxlPihhY3RpdmVBcnJheVdpZHRoIC0gMSk7Ci0gICAgZG91YmxlIG5vcm1hbGl6ZWRPQ1kgPSBvcHRpY2FsQ2VudGVyWSAvIHN0YXRpY19jYXN0PGRvdWJsZT4oYWN0aXZlQXJyYXlIZWlnaHQgLSAxKTsKKyAgICBkb3VibGUgbm9ybWFsaXplZE9DWCA9IG9wdGljYWxDZW50ZXJYIC8gc3RhdGljX2Nhc3Q8ZG91YmxlPihhY3RpdmVBcnJheVdpZHRoKTsKKyAgICBkb3VibGUgbm9ybWFsaXplZE9DWSA9IG9wdGljYWxDZW50ZXJZIC8gc3RhdGljX2Nhc3Q8ZG91YmxlPihhY3RpdmVBcnJheUhlaWdodCk7CiAKICAgICBub3JtYWxpemVkT0NYID0gQ0xBTVAobm9ybWFsaXplZE9DWCwgMCwgMSk7CiAgICAgbm9ybWFsaXplZE9DWSA9IENMQU1QKG5vcm1hbGl6ZWRPQ1ksIDAsIDEpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5icAppbmRleCA0ODU3MDA4Li4xNDAwNTJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhYXVkaW8vQW5kcm9pZC5icApAQCAtMjQsNyArMjQsNyBAQAogbmRrX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJhYXVkaW8iLAogICAgIC8vIGRlbGliZXJhdGVseSBpbmNsdWRlcyBzeW1ib2xzIGZyb20gQUF1ZGlvVGVzdGluZy5oCi0gICAgc3ltYm9sX2ZpbGU6ICJsaWJhYXVkaW8ubWFwLnR4dCIsCisgICAgc3ltYm9sX2ZpbGU6ICJzcmMvbGliYWF1ZGlvLm1hcC50eHQiLAogICAgIGZpcnN0X3ZlcnNpb246ICIyNiIsCiAgICAgdW52ZXJzaW9uZWRfdW50aWw6ICJjdXJyZW50IiwKIH0KQEAgLTMyLDcgKzMyLDUgQEAKIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYmFhdWRpb19oZWFkZXJzIiwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKLSAgICB2ZXJzaW9uX3NjcmlwdDogImxpYmFhdWRpby5tYXAudHh0IiwKIH0KIAotc3ViZGlycyA9IFsiKiJdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9BbmRyb2lkLmJwCmluZGV4IDYzOWZhYjIuLjQ5YmQ1ZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9BbmRyb2lkLmJwCkBAIC0xLDUgKzEsMyBAQAotc3ViZGlycyA9IFsiKiJdCi0KIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYmFhdWRpb19leGFtcGxlX3V0aWxzIiwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbInV0aWxzIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2lucHV0X21vbml0b3IvQW5kcm9pZC5icAppbmRleCA1ZDM5OWI1Li5kOGM1ODQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL0FuZHJvaWQuYnAKQEAgLTUsNyArNSw2IEBACiAgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKICAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKICAgICBoZWFkZXJfbGliczogWyJsaWJhYXVkaW9fZXhhbXBsZV91dGlscyJdLAotICAgIHBhY2tfcmVsb2NhdGlvbnM6IGZhbHNlLAogfQogCiBjY190ZXN0IHsKQEAgLTE1LDUgKzE0LDQgQEAKICAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAogICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAogICAgIGhlYWRlcl9saWJzOiBbImxpYmFhdWRpb19leGFtcGxlX3V0aWxzIl0sCi0gICAgcGFja19yZWxvY2F0aW9uczogZmFsc2UsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQW5kcm9pZC5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMGI5ODFjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzCi0KLSMgTkRLIHJlY29tbWVuZHMgdXNpbmcgdGhpcyBraW5kIG9mIHJlbGF0aXZlIHBhdGggaW5zdGVhZCBvZiBhbiBhYnNvbHV0ZSBwYXRoLgotTE9DQUxfU1JDX0ZJTEVTOj0gLi4vc3JjL2lucHV0X21vbml0b3IuY3BwCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KLUxPQ0FMX01PRFVMRSA6PSBpbnB1dF9tb25pdG9yCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMKLQotTE9DQUxfU1JDX0ZJTEVTOj0gLi4vc3JjL2lucHV0X21vbml0b3JfY2FsbGJhY2suY3BwCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KLUxPQ0FMX01PRFVMRSA6PSBpbnB1dF9tb25pdG9yX2NhbGxiYWNrCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gbGliYWF1ZGlvX3ByZWJ1aWx0Ci1MT0NBTF9TUkNfRklMRVMgOj0gbGliYWF1ZGlvLnNvCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKLWluY2x1ZGUgJChQUkVCVUlMVF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BcHBsaWNhdGlvbi5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9pbnB1dF9tb25pdG9yL2puaS9BcHBsaWNhdGlvbi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc0NDc1Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvaW5wdXRfbW9uaXRvci9qbmkvQXBwbGljYXRpb24ubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLSMgVE9ETyByZW1vdmUgdGhlbiB3aGVuIHdlIHN1cHBvcnQgb3RoZXIgYXJjaGl0ZWN0dXJlcwotQVBQX0FCSSA6PSBhcm02NC12OGEKLUFQUF9DUFBGTEFHUyArPSAtc3RkPWMrKzExCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9BbmRyb2lkLmJwCmluZGV4IDUzZTUwMjAuLjViN2Q5NTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9BbmRyb2lkLmJwCkBAIC05LDUgKzksNCBAQAogICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgIF0sCiAgICAgaGVhZGVyX2xpYnM6IFsibGliYWF1ZGlvX2V4YW1wbGVfdXRpbHMiXSwKLSAgICBwYWNrX3JlbG9jYXRpb25zOiBmYWxzZSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQW5kcm9pZC5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9qbmkvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWViZTg3Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzCi0KLSMgTkRLIHJlY29tbWVuZHMgdXNpbmcgdGhpcyBraW5kIG9mIHJlbGF0aXZlIHBhdGggaW5zdGVhZCBvZiBhbiBhYnNvbHV0ZSBwYXRoLgotTE9DQUxfU1JDX0ZJTEVTOj0gLi4vc3JjL2xvb3BiYWNrLmNwcAotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlic25kZmlsZQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8gbGliYXVkaW91dGlscwotTE9DQUxfTU9EVUxFIDo9IGFhdWRpb19sb29wYmFjawotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FwcGxpY2F0aW9uLm1rIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL2puaS9BcHBsaWNhdGlvbi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0NGYzNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvbG9vcGJhY2svam5pL0FwcGxpY2F0aW9uLm1rCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotQVBQX0NQUEZMQUdTICs9IC1zdGQ9YysrMTEKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvTG9vcGJhY2tBbmFseXplci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9Mb29wYmFja0FuYWx5emVyLmgKaW5kZXggOTcxMWI4Ni4uOGViNzBiMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9Mb29wYmFja0FuYWx5emVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9Mb29wYmFja0FuYWx5emVyLmgKQEAgLTMxMCw3ICszMTAsNyBAQAogICAgIH0KIAogICAgIC8vIFdyaXRlIFNIT1JUIGRhdGEgZnJvbSB0aGUgZmlyc3QgY2hhbm5lbC4KLSAgICBpbnQgd3JpdGUoaW50MTZfdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsIGludCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90IHdyaXRlKGludDE2X3QgKmlucHV0RGF0YSwgaW50MzJfdCBpbnB1dENoYW5uZWxDb3VudCwgaW50MzJfdCBudW1GcmFtZXMpIHsKICAgICAgICAgLy8gc3RvcCBhdCBlbmQgb2YgYnVmZmVyCiAgICAgICAgIGlmICgobUZyYW1lQ291bnRlciArIG51bUZyYW1lcykgPiBtTWF4RnJhbWVzKSB7CiAgICAgICAgICAgICBudW1GcmFtZXMgPSBtTWF4RnJhbWVzIC0gbUZyYW1lQ291bnRlcjsKQEAgLTMyMiw3ICszMjIsNyBAQAogICAgIH0KIAogICAgIC8vIFdyaXRlIEZMT0FUIGRhdGEgZnJvbSB0aGUgZmlyc3QgY2hhbm5lbC4KLSAgICBpbnQgd3JpdGUoZmxvYXQgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LCBpbnQgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCB3cml0ZShmbG9hdCAqaW5wdXREYXRhLCBpbnQzMl90IGlucHV0Q2hhbm5lbENvdW50LCBpbnQzMl90IG51bUZyYW1lcykgewogICAgICAgICAvLyBzdG9wIGF0IGVuZCBvZiBidWZmZXIKICAgICAgICAgaWYgKChtRnJhbWVDb3VudGVyICsgbnVtRnJhbWVzKSA+IG1NYXhGcmFtZXMpIHsKICAgICAgICAgICAgIG51bUZyYW1lcyA9IG1NYXhGcmFtZXMgLSBtRnJhbWVDb3VudGVyOwpAQCAtMzMzLDcgKzMzMyw3IEBACiAgICAgICAgIHJldHVybiBudW1GcmFtZXM7CiAgICAgfQogCi0gICAgaW50IHNpemUoKSB7CisgICAgaW50MzJfdCBzaXplKCkgewogICAgICAgICByZXR1cm4gbUZyYW1lQ291bnRlcjsKICAgICB9CiAKQEAgLTQ0Myw5ICs0NDMsMTQgQEAKICAgICB2aXJ0dWFsIH5Mb29wYmFja1Byb2Nlc3NvcigpID0gZGVmYXVsdDsKIAogCisgICAgZW51bSBwcm9jZXNzX3Jlc3VsdCB7CisgICAgICAgIFBST0NFU1NfUkVTVUxUX09LLAorICAgICAgICBQUk9DRVNTX1JFU1VMVF9HTElUQ0gKKyAgICB9OworCiAgICAgdmlydHVhbCB2b2lkIHJlc2V0KCkge30KIAotICAgIHZpcnR1YWwgdm9pZCBwcm9jZXNzKGZsb2F0ICppbnB1dERhdGEsIGludCBpbnB1dENoYW5uZWxDb3VudCwKKyAgICB2aXJ0dWFsIHByb2Nlc3NfcmVzdWx0IHByb2Nlc3MoZmxvYXQgKmlucHV0RGF0YSwgaW50IGlucHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICBmbG9hdCAqb3V0cHV0RGF0YSwgaW50IG91dHB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgaW50IG51bUZyYW1lcykgPSAwOwogCkBAIC02MzksNyArNjQ0LDcgQEAKICAgICAgICAgcmV0dXJuIGdldFNhbXBsZVJhdGUoKSAvIDg7CiAgICAgfQogCi0gICAgdm9pZCBwcm9jZXNzKGZsb2F0ICppbnB1dERhdGEsIGludCBpbnB1dENoYW5uZWxDb3VudCwKKyAgICBwcm9jZXNzX3Jlc3VsdCBwcm9jZXNzKGZsb2F0ICppbnB1dERhdGEsIGludCBpbnB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgZmxvYXQgKm91dHB1dERhdGEsIGludCBvdXRwdXRDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgIGludCBudW1GcmFtZXMpIG92ZXJyaWRlIHsKICAgICAgICAgaW50IGNoYW5uZWxzVmFsaWQgPSBzdGQ6Om1pbihpbnB1dENoYW5uZWxDb3VudCwgb3V0cHV0Q2hhbm5lbENvdW50KTsKQEAgLTc1MCw2ICs3NTUsNyBAQAogCiAgICAgICAgIG1TdGF0ZSA9IG5leHRTdGF0ZTsKICAgICAgICAgbUxvb3BDb3VudGVyKys7CisgICAgICAgIHJldHVybiBQUk9DRVNTX1JFU1VMVF9PSzsKICAgICB9CiAKICAgICBpbnQgc2F2ZShjb25zdCBjaGFyICpmaWxlTmFtZSkgb3ZlcnJpZGUgewpAQCAtODk2LDkgKzkwMiwxMCBAQAogICAgICAqIEBwYXJhbSBpbnB1dERhdGEgY29udGFpbnMgbWljcm9waG9uZSBkYXRhIHdpdGggc2luZSBzaWduYWwgZmVlZGJhY2sKICAgICAgKiBAcGFyYW0gb3V0cHV0RGF0YSBjb250YWlucyB0aGUgcmVmZXJlbmNlIHNpbmUgd2F2ZQogICAgICAqLwotICAgIHZvaWQgcHJvY2VzcyhmbG9hdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsCisgICAgcHJvY2Vzc19yZXN1bHQgcHJvY2VzcyhmbG9hdCAqaW5wdXREYXRhLCBpbnQgaW5wdXRDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgIGZsb2F0ICpvdXRwdXREYXRhLCBpbnQgb3V0cHV0Q2hhbm5lbENvdW50LAogICAgICAgICAgICAgICAgICBpbnQgbnVtRnJhbWVzKSBvdmVycmlkZSB7CisgICAgICAgIHByb2Nlc3NfcmVzdWx0IHJlc3VsdCA9IFBST0NFU1NfUkVTVUxUX09LOwogICAgICAgICBtUHJvY2Vzc0NvdW50Kys7CiAKICAgICAgICAgZmxvYXQgcGVhayA9IG1lYXN1cmVQZWFrQW1wbGl0dWRlKGlucHV0RGF0YSwgaW5wdXRDaGFubmVsQ291bnQsIG51bUZyYW1lcyk7CkBAIC05NzgsNiArOTg1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgbU1heEdsaXRjaERlbHRhID0gc3RkOjptYXgobU1heEdsaXRjaERlbHRhLCBhYnNEaWZmKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKGFic0RpZmYgPiBtVG9sZXJhbmNlKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtR2xpdGNoQ291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IFBST0NFU1NfUkVTVUxUX0dMSVRDSDsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vcHJpbnRmKCIlNWQ6IEdvdCBhIGdsaXRjaCAjICVkLCBwcmVkaWN0ZWQgPSAlZiwgYWN0dWFsID0gJWZcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICBtRnJhbWVDb3VudGVyLCBtR2xpdGNoQ291bnQsIHByZWRpY3RlZCwgc2FtcGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0lNTVVORTsKQEAgLTEwMTgsNiArMTAyNiw3IEBACiAKICAgICAgICAgICAgIG1GcmFtZUNvdW50ZXIrKzsKICAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KIAogICAgIHZvaWQgcmVzZXRBY2N1bXVsYXRvcigpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy9sb29wYmFjay9zcmMvbG9vcGJhY2suY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9sb29wYmFjay5jcHAKaW5kZXggMmEwMmIyMC4uNDlkOTIxZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9sb29wYmFjay5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL2xvb3BiYWNrL3NyYy9sb29wYmFjay5jcHAKQEAgLTM0LDkgKzM0LDE0IEBACiAjaW5jbHVkZSAiQUF1ZGlvU2ltcGxlUmVjb3JkZXIuaCIKICNpbmNsdWRlICJBQXVkaW9FeGFtcGxlVXRpbHMuaCIKICNpbmNsdWRlICJMb29wYmFja0FuYWx5emVyLmgiCisjaW5jbHVkZSAiLi4vLi4vdXRpbHMvQUF1ZGlvRXhhbXBsZVV0aWxzLmgiCiAKLS8vIFYwLjQuMDAgPSByZWN0aWZ5IGFuZCBsb3ctcGFzcyBmaWx0ZXIgdGhlIGVjaG9zLCB1c2UgYXV0by1jb3JyZWxhdGlvbiBvbiBlbnRpcmUgZWNobwotI2RlZmluZSBBUFBfVkVSU0lPTiAgICAgICAgICAgICAiMC40LjAwIgorLy8gVjAuNC4wMCA9IHJlY3RpZnkgYW5kIGxvdy1wYXNzIGZpbHRlciB0aGUgZWNob3MsIGF1dG8tY29ycmVsYXRlIGVudGlyZSBlY2hvCisvLyBWMC40LjAxID0gYWRkIC1oIGhhbmcgb3B0aW9uCisvLyAgICAgICAgICAgZml4IC1uIG9wdGlvbiB0byBzZXQgb3V0cHV0IGJ1ZmZlciBmb3IgLXRtCisvLyAgICAgICAgICAgcGxvdCBmaXJzdCBnbGl0Y2gKKy8vIFYwLjQuMDIgPSBhbGxvdyAtbjAgZm9yIG1pbmltYWwgYnVmZmVyIHNpemUKKyNkZWZpbmUgQVBQX1ZFUlNJT04gICAgICAgICAgICAgIjAuNC4wMiIKIAogLy8gVGFnIGZvciBtYWNoaW5lIHJlYWRhYmxlIHJlc3VsdHMgYXMgcHJvcGVydHkgPSB2YWx1ZSBwYWlycwogI2RlZmluZSBSRVNVTFRfVEFHICAgICAgICAgICAgICAiUkVTVUxUOiAiCkBAIC00NywxMCArNTIsMTQgQEAKIGNvbnN0ZXhwciBpbnQga0xvZ1BlcmlvZE1pbGxpcyAgICAgICA9IDEwMDA7CiBjb25zdGV4cHIgaW50IGtOdW1JbnB1dENoYW5uZWxzICAgICAgPSAxOwogY29uc3RleHByIGludCBrTnVtQ2FsbGJhY2tzVG9EcmFpbiAgID0gMjA7Citjb25zdGV4cHIgaW50IGtOdW1DYWxsYmFja3NUb05vdFJlYWQgPSAwOyAvLyBsZXQgaW5wdXQgZmlsbCBiYWNrIHVwCiBjb25zdGV4cHIgaW50IGtOdW1DYWxsYmFja3NUb0Rpc2NhcmQgPSAyMDsKK2NvbnN0ZXhwciBpbnQga0RlZmF1bHRIYW5nVGltZU1pbGxpcyA9IDUwOworY29uc3RleHByIGludCBrTWF4R2xpdGNoRXZlbnRzVG9TYXZlID0gMzI7CiAKIHN0cnVjdCBMb29wYmFja0RhdGEgewogICAgIEFBdWRpb1N0cmVhbSAgICAgICppbnB1dFN0cmVhbSA9IG51bGxwdHI7CisgICAgQUF1ZGlvU3RyZWFtICAgICAgKm91dHB1dFN0cmVhbSA9IG51bGxwdHI7CiAgICAgaW50MzJfdCAgICAgICAgICAgIGlucHV0RnJhbWVzTWF4aW11bSA9IDA7CiAgICAgaW50MTZfdCAgICAgICAgICAgKmlucHV0U2hvcnREYXRhID0gbnVsbHB0cjsKICAgICBmbG9hdCAgICAgICAgICAgICAqaW5wdXRGbG9hdERhdGEgPSBudWxscHRyOwpAQCAtNTgsNiArNjcsNyBAQAogICAgIGludDMyX3QgICAgICAgICAgICBhY3R1YWxJbnB1dENoYW5uZWxDb3VudCA9IDA7CiAgICAgaW50MzJfdCAgICAgICAgICAgIGFjdHVhbE91dHB1dENoYW5uZWxDb3VudCA9IDA7CiAgICAgaW50MzJfdCAgICAgICAgICAgIG51bUNhbGxiYWNrc1RvRHJhaW4gPSBrTnVtQ2FsbGJhY2tzVG9EcmFpbjsKKyAgICBpbnQzMl90ICAgICAgICAgICAgbnVtQ2FsbGJhY2tzVG9Ob3RSZWFkID0ga051bUNhbGxiYWNrc1RvTm90UmVhZDsKICAgICBpbnQzMl90ICAgICAgICAgICAgbnVtQ2FsbGJhY2tzVG9EaXNjYXJkID0ga051bUNhbGxiYWNrc1RvRGlzY2FyZDsKICAgICBpbnQzMl90ICAgICAgICAgICAgbWluTnVtRnJhbWVzID0gSU5UMzJfTUFYOwogICAgIGludDMyX3QgICAgICAgICAgICBtYXhOdW1GcmFtZXMgPSAwOwpAQCAtNjUsNiArNzUsOSBAQAogICAgIGludDMyX3QgICAgICAgICAgICBpbnN1ZmZpY2llbnRSZWFkRnJhbWVzID0gMDsKICAgICBpbnQzMl90ICAgICAgICAgICAgZnJhbWVzUmVhZFRvdGFsID0gMDsKICAgICBpbnQzMl90ICAgICAgICAgICAgZnJhbWVzV3JpdHRlblRvdGFsID0gMDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgaGFuZ1BlcmlvZE1pbGxpcyA9IDUgKiAxMDAwOyAvLyB0aW1lIGJldHdlZW4gaGFuZ3MKKyAgICBpbnQzMl90ICAgICAgICAgICAgaGFuZ0NvdW50ZG93bkZyYW1lcyA9IDUgKiA0ODAwMDsgLy8gZnJhbWVzIHRpbCBuZXh0IGhhbmcKKyAgICBpbnQzMl90ICAgICAgICAgICAgaGFuZ1RpbWVNaWxsaXMgPSAwOyAvLyAwIGZvciBubyBoYW5nCiAgICAgYm9vbCAgICAgICAgICAgICAgIGlzRG9uZSA9IGZhbHNlOwogCiAgICAgYWF1ZGlvX3Jlc3VsdF90ICAgIGlucHV0RXJyb3IgPSBBQVVESU9fT0s7CkBAIC03NCw2ICs4NywyOSBAQAogICAgIEVjaG9BbmFseXplciAgICAgICBlY2hvQW5hbHl6ZXI7CiAgICAgQXVkaW9SZWNvcmRpbmcgICAgIGF1ZGlvUmVjb3JkaW5nOwogICAgIExvb3BiYWNrUHJvY2Vzc29yICpsb29wYmFja1Byb2Nlc3NvcjsKKworICAgIGludDMyX3QgICAgICAgICAgICBnbGl0Y2hGcmFtZXNba01heEdsaXRjaEV2ZW50c1RvU2F2ZV07CisgICAgaW50MzJfdCAgICAgICAgICAgIG51bUdsaXRjaEV2ZW50cyA9IDA7CisKKyAgICB2b2lkIGhhbmdJZlJlcXVlc3RlZChpbnQzMl90IG51bUZyYW1lcykgeworICAgICAgICBpZiAoaGFuZ1RpbWVNaWxsaXMgPiAwKSB7CisgICAgICAgICAgICBoYW5nQ291bnRkb3duRnJhbWVzIC09IG51bUZyYW1lczsKKyAgICAgICAgICAgIGlmIChoYW5nQ291bnRkb3duRnJhbWVzIDw9IDApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHN0YXJ0TmFub3MgPSBnZXROYW5vc2Vjb25kcygpOworICAgICAgICAgICAgICAgIHVzbGVlcChoYW5nVGltZU1pbGxpcyAqIDEwMDApOworICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgZW5kTmFub3MgPSBnZXROYW5vc2Vjb25kcygpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3QgZWxhcHNlZE1pY3JvcyA9IChpbnQzMl90KQorICAgICAgICAgICAgICAgICAgICAgICAgKChlbmROYW5vcyAtIHN0YXJ0TmFub3MpIC8gMTAwMCk7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJjYWxsYmFjayBoYW5naW5nIGZvciAlZCBtaWxsaXMsIGFjdHVhbCA9ICVkIG1pY3Jvc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgaGFuZ1RpbWVNaWxsaXMsIGVsYXBzZWRNaWNyb3MpOworICAgICAgICAgICAgICAgIGhhbmdDb3VudGRvd25GcmFtZXMgPSAoaW50NjRfdCkgaGFuZ1BlcmlvZE1pbGxpcworICAgICAgICAgICAgICAgICAgICAgICAgKiBBQXVkaW9TdHJlYW1fZ2V0U2FtcGxlUmF0ZShvdXRwdXRTdHJlYW0pCisgICAgICAgICAgICAgICAgICAgICAgICAvIDEwMDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworCisgICAgfQogfTsKIAogc3RhdGljIHZvaWQgY29udmVydFBjbTE2VG9GbG9hdChjb25zdCBpbnQxNl90ICpzb3VyY2UsCkBAIC0xMDUsOSArMTQxLDE0IEBACiAgICAgICAgIGFzc2VydChmYWxzZSk7CiAgICAgfQogICAgIGlmIChmcmFtZXNSZWFkIDwgMCkgewotICAgICAgICBteURhdGEtPmlucHV0RXJyb3IgPSBmcmFtZXNSZWFkOwotICAgICAgICBwcmludGYoIkVSUk9SIGluIHJlYWQgPSAlZCA9ICVzXG4iLCBmcmFtZXNSZWFkLAotICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQoZnJhbWVzUmVhZCkpOworICAgICAgICAvLyBFeHBlY3QgSU5WQUxJRF9TVEFURSBpZiBTVEFURV9TVEFSVElORworICAgICAgICBpZiAobXlEYXRhLT5mcmFtZXNSZWFkVG90YWwgPiAwKSB7CisgICAgICAgICAgICBteURhdGEtPmlucHV0RXJyb3IgPSBmcmFtZXNSZWFkOworICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiBpbiByZWFkID0gJWQgPSAlc1xuIiwgZnJhbWVzUmVhZCwKKyAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChmcmFtZXNSZWFkKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcmFtZXNSZWFkID0gMDsKKyAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIG15RGF0YS0+ZnJhbWVzUmVhZFRvdGFsICs9IGZyYW1lc1JlYWQ7CiAgICAgfQpAQCAtMTQ5LDggKzE5MCwxMCBAQAogICAgICAgICBpbnQzMl90IHRvdGFsRnJhbWVzUmVhZCA9IDA7CiAgICAgICAgIGRvIHsKICAgICAgICAgICAgIGFjdHVhbEZyYW1lc1JlYWQgPSByZWFkRm9ybWF0dGVkRGF0YShteURhdGEsIG51bUZyYW1lcyk7Ci0gICAgICAgICAgICBpZiAoYWN0dWFsRnJhbWVzUmVhZCkgeworICAgICAgICAgICAgaWYgKGFjdHVhbEZyYW1lc1JlYWQgPiAwKSB7CiAgICAgICAgICAgICAgICAgdG90YWxGcmFtZXNSZWFkICs9IGFjdHVhbEZyYW1lc1JlYWQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGFjdHVhbEZyYW1lc1JlYWQgPCAwKSB7CisgICAgICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gSWdub3JlIGVycm9ycyBiZWNhdXNlIGlucHV0IHN0cmVhbSBtYXkgbm90IGJlIHN0YXJ0ZWQgeWV0LgogICAgICAgICB9IHdoaWxlIChhY3R1YWxGcmFtZXNSZWFkID4gMCk7CkBAIC0xNTksNiArMjAyLDkgQEAKICAgICAgICAgICAgIG15RGF0YS0+bnVtQ2FsbGJhY2tzVG9EcmFpbi0tOwogICAgICAgICB9CiAKKyAgICB9IGVsc2UgaWYgKG15RGF0YS0+bnVtQ2FsbGJhY2tzVG9Ob3RSZWFkID4gMCkgeworICAgICAgICAvLyBMZXQgdGhlIGlucHV0IGZpbGwgdXAgYSBiaXQgc28gd2UgYXJlIG5vdCBzbyBjbG9zZSB0byB0aGUgd3JpdGUgcG9pbnRlci4KKyAgICAgICAgbXlEYXRhLT5udW1DYWxsYmFja3NUb05vdFJlYWQtLTsKICAgICB9IGVsc2UgaWYgKG15RGF0YS0+bnVtQ2FsbGJhY2tzVG9EaXNjYXJkID4gMCkgewogICAgICAgICAvLyBJZ25vcmUuIEFsbG93IHRoZSBpbnB1dCB0byBmaWxsIGJhY2sgdXAgdG8gZXF1aWxpYnJpdW0gd2l0aCB0aGUgb3V0cHV0LgogICAgICAgICBhY3R1YWxGcmFtZXNSZWFkID0gcmVhZEZvcm1hdHRlZERhdGEobXlEYXRhLCBudW1GcmFtZXMpOwpAQCAtMTY4LDYgKzIxNCw3IEBACiAgICAgICAgIG15RGF0YS0+bnVtQ2FsbGJhY2tzVG9EaXNjYXJkLS07CiAKICAgICB9IGVsc2UgeworICAgICAgICBteURhdGEtPmhhbmdJZlJlcXVlc3RlZChudW1GcmFtZXMpOwogCiAgICAgICAgIGludDMyX3QgbnVtSW5wdXRCeXRlcyA9IG51bUZyYW1lcyAqIG15RGF0YS0+YWN0dWFsSW5wdXRDaGFubmVsQ291bnQgKiBzaXplb2YoZmxvYXQpOwogICAgICAgICBtZW1zZXQobXlEYXRhLT5pbnB1dEZsb2F0RGF0YSwgMCAvKiB2YWx1ZSAqLywgbnVtSW5wdXRCeXRlcyk7CkBAIC0xODQsNyArMjMxLDcgQEAKIAogICAgICAgICAgICAgaWYgKGFjdHVhbEZyYW1lc1JlYWQgPCBudW1GcmFtZXMpIHsKICAgICAgICAgICAgICAgICBpZihhY3R1YWxGcmFtZXNSZWFkIDwgKGludDMyX3QpIGZyYW1lc0F2YWlsYWJsZSkgewotICAgICAgICAgICAgICAgICAgICBwcmludGYoImluc3VmZmljaWVudCBidXQgbnVtRnJhbWVzID0gJWQiCisgICAgICAgICAgICAgICAgICAgIHByaW50ZigiaW5zdWZmaWNpZW50IGZvciBubyByZWFzb24sIG51bUZyYW1lcyA9ICVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBhY3R1YWxGcmFtZXNSZWFkID0gJWQiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIGlucHV0RnJhbWVzV3JpdHRlbiA9ICVkIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBpbnB1dEZyYW1lc1JlYWQgPSAlZCIKQEAgLTIwNSwxNiArMjUyLDI1IEBACiAgICAgICAgICAgICBpZiAobXlEYXRhLT5hY3R1YWxJbnB1dEZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKICAgICAgICAgICAgICAgICBjb252ZXJ0UGNtMTZUb0Zsb2F0KG15RGF0YS0+aW5wdXRTaG9ydERhdGEsIG15RGF0YS0+aW5wdXRGbG9hdERhdGEsIG51bVNhbXBsZXMpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gU2F2ZSBmb3IgbGF0ZXIuCi0gICAgICAgICAgICBteURhdGEtPmF1ZGlvUmVjb3JkaW5nLndyaXRlKG15RGF0YS0+aW5wdXRGbG9hdERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15RGF0YS0+YWN0dWFsSW5wdXRDaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcyk7CisKICAgICAgICAgICAgIC8vIEFuYWx5emUgdGhlIGRhdGEuCi0gICAgICAgICAgICBteURhdGEtPmxvb3BiYWNrUHJvY2Vzc29yLT5wcm9jZXNzKG15RGF0YS0+aW5wdXRGbG9hdERhdGEsCisgICAgICAgICAgICBMb29wYmFja1Byb2Nlc3Nvcjo6cHJvY2Vzc19yZXN1bHQgcHJvY1Jlc3VsdCA9IG15RGF0YS0+bG9vcGJhY2tQcm9jZXNzb3ItPnByb2Nlc3MobXlEYXRhLT5pbnB1dEZsb2F0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlEYXRhLT5hY3R1YWxJbnB1dENoYW5uZWxDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlEYXRhLT5hY3R1YWxPdXRwdXRDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcyk7CisKKyAgICAgICAgICAgIGlmIChwcm9jUmVzdWx0ID09IExvb3BiYWNrUHJvY2Vzc29yOjpQUk9DRVNTX1JFU1VMVF9HTElUQ0gpIHsKKyAgICAgICAgICAgICAgICBpZiAobXlEYXRhLT5udW1HbGl0Y2hFdmVudHMgPCBrTWF4R2xpdGNoRXZlbnRzVG9TYXZlKSB7CisgICAgICAgICAgICAgICAgICAgIG15RGF0YS0+Z2xpdGNoRnJhbWVzW215RGF0YS0+bnVtR2xpdGNoRXZlbnRzKytdID0gbXlEYXRhLT5hdWRpb1JlY29yZGluZy5zaXplKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBTYXZlIGZvciBsYXRlci4KKyAgICAgICAgICAgIG15RGF0YS0+YXVkaW9SZWNvcmRpbmcud3JpdGUobXlEYXRhLT5pbnB1dEZsb2F0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlEYXRhLT5hY3R1YWxJbnB1dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsRnJhbWVzUmVhZCk7CisKICAgICAgICAgICAgIG15RGF0YS0+aXNEb25lID0gbXlEYXRhLT5sb29wYmFja1Byb2Nlc3Nvci0+aXNEb25lKCk7CiAgICAgICAgICAgICBpZiAobXlEYXRhLT5pc0RvbmUpIHsKICAgICAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7CkBAIC0yNDAsOCArMjk2LDEwIEBACiAgICAgQUF1ZGlvQXJnc1BhcnNlcjo6dXNhZ2UoKTsKICAgICBwcmludGYoIiAgICAgIC1Ce2ZyYW1lc30gICAgICAgIGlucHV0IGNhcGFjaXR5IGluIGZyYW1lc1xuIik7CiAgICAgcHJpbnRmKCIgICAgICAtQ3tjaGFubmVsc30gICAgICBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHNcbiIpOworICAgIHByaW50ZigiICAgICAgLUR7ZGV2aWNlSWR9ICAgICAgaW5wdXQgZGV2aWNlIElEXG4iKTsKICAgICBwcmludGYoIiAgICAgIC1GezAsMSwyfSAgICAgICAgIGlucHV0IGZvcm1hdCwgMT1JMTYsIDI9RkxPQVRcbiIpOwogICAgIHByaW50ZigiICAgICAgLWd7Z2Fpbn0gICAgICAgICAgcmVjaXJjdWxhdGluZyBsb29wYmFjayBnYWluXG4iKTsKKyAgICBwcmludGYoIiAgICAgIC1oe2hhbmdNaWxsaXN9ICAgIG9jY2FzaW9uYWxseSBoYW5nIGluIHRoZSBjYWxsYmFja1xuIik7CiAgICAgcHJpbnRmKCIgICAgICAtUHtpblBlcmZ9ICAgICAgICBzZXQgaW5wdXQgQUFVRElPX1BFUkZPUk1BTkNFX01PREUqXG4iKTsKICAgICBwcmludGYoIiAgICAgICAgICBuIGZvciBfTk9ORVxuIik7CiAgICAgcHJpbnRmKCIgICAgICAgICAgbCBmb3IgX0xBVEVOQ1lcbiIpOwpAQCAtMzAwLDkgKzM1OCw3IEBACiAgICAgcmV0dXJuIHRlc3RNb2RlOwogfQogCi12b2lkIHByaW50QXVkaW9HcmFwaChBdWRpb1JlY29yZGluZyAmcmVjb3JkaW5nLCBpbnQgbnVtU2FtcGxlcykgewotICAgIGludDMyX3Qgc3RhcnQgPSByZWNvcmRpbmcuc2l6ZSgpIC8gMjsKLSAgICBpbnQzMl90IGVuZCA9IHN0YXJ0ICsgbnVtU2FtcGxlczsKK3ZvaWQgcHJpbnRBdWRpb0dyYXBoUmVnaW9uKEF1ZGlvUmVjb3JkaW5nICZyZWNvcmRpbmcsIGludDMyX3Qgc3RhcnQsIGludDMyX3QgZW5kKSB7CiAgICAgaWYgKGVuZCA+PSByZWNvcmRpbmcuc2l6ZSgpKSB7CiAgICAgICAgIGVuZCA9IHJlY29yZGluZy5zaXplKCkgLSAxOwogICAgIH0KQEAgLTMzOSwxMyArMzk1LDE0IEBACiAgICAgQUF1ZGlvU3RyZWFtICAgICAgICAgKm91dHB1dFN0cmVhbSAgICAgICAgICAgICAgID0gbnVsbHB0cjsKIAogICAgIGFhdWRpb19yZXN1bHRfdCAgICAgICByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgaW50MzJfdCAgICAgICAgICAgICAgIHJlcXVlc3RlZElucHV0RGV2aWNlSWQgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCByZXF1ZXN0ZWRJbnB1dFNoYXJpbmdNb2RlICA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwogICAgIGludCAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRJbnB1dENoYW5uZWxDb3VudCA9IGtOdW1JbnB1dENoYW5uZWxzOwogICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICByZXF1ZXN0ZWRJbnB1dEZvcm1hdCAgICAgICA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgIHJlcXVlc3RlZElucHV0Q2FwYWNpdHkgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgaW5wdXRQZXJmb3JtYW5jZUxldmVsICA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZOwogCi0gICAgaW50MzJfdCAgICAgICAgICAgICAgIG91dHB1dEZyYW1lc1BlckJ1cnN0ID0gMDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgb3V0cHV0RnJhbWVzUGVyQnVyc3QgICAgICAgPSAwOwogCiAgICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgIGFjdHVhbE91dHB1dEZvcm1hdCAgICAgICAgID0gQUFVRElPX0ZPUk1BVF9JTlZBTElEOwogICAgIGludDMyX3QgICAgICAgICAgICAgICBhY3R1YWxTYW1wbGVSYXRlICAgICAgICAgICA9IDA7CkBAIC0zNTMsNiArNDEwLDcgQEAKIAogICAgIGludCAgICAgICAgICAgICAgICAgICB0ZXN0TW9kZSAgICAgICAgICAgICAgICAgICA9IFRFU1RfRUNIT19MQVRFTkNZOwogICAgIGRvdWJsZSAgICAgICAgICAgICAgICBnYWluICAgICAgICAgICAgICAgICAgICAgICA9IDEuMDsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgaGFuZ1RpbWVNaWxsaXMgICAgICAgICAgICAgPSAwOwogCiAgICAgLy8gTWFrZSBwcmludGYgcHJpbnQgaW1tZWRpYXRlbHkgc28gdGhhdCBkZWJ1ZyBpbmZvIGlzIG5vdCBzdHVjawogICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCkBAIC0zNzYsMTIgKzQzNCwyNCBAQAogICAgICAgICAgICAgICAgICAgICBjYXNlICdDJzoKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZElucHV0Q2hhbm5lbENvdW50ID0gYXRvaSgmYXJnWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjYXNlICdEJzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZElucHV0RGV2aWNlSWQgPSBhdG9pKCZhcmdbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ0YnOgogICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkSW5wdXRGb3JtYXQgPSBhdG9pKCZhcmdbMl0pOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ2cnOgogICAgICAgICAgICAgICAgICAgICAgICAgZ2FpbiA9IGF0b2YoJmFyZ1syXSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBXYXMgdGhlcmUgYSBudW1iZXIgYWZ0ZXIgdGhlICItaCI/CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJnWzJdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZ1RpbWVNaWxsaXMgPSBhdG9pKCZhcmdbMl0pOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBubyBudW1iZXIgdGhlbiB1c2UgdGhlIGRlZmF1bHQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZ1RpbWVNaWxsaXMgPSBrRGVmYXVsdEhhbmdUaW1lTWlsbGlzOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1AnOgogICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRQZXJmb3JtYW5jZUxldmVsID0gcGFyc2VQZXJmb3JtYW5jZU1vZGUoYXJnWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtNDE1LDYgKzQ4NSw4IEBACiAgICAgaW50MzJfdCB0aW1lTWlsbGlzID0gMDsKICAgICBpbnQzMl90IHJlY29yZGluZ0R1cmF0aW9uID0gc3RkOjptaW4oNjAgKiA1LCByZXF1ZXN0ZWREdXJhdGlvbik7CiAKKyAgICBpbnQzMl90IHJlcXVlc3RlZE91dHB1dEJ1cnN0cyA9IGFyZ1BhcnNlci5nZXROdW1iZXJPZkJ1cnN0cygpOworCiAgICAgc3dpdGNoKHRlc3RNb2RlKSB7CiAgICAgICAgIGNhc2UgVEVTVF9TSU5FX01BR05JVFVERToKICAgICAgICAgICAgIGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3NvciA9ICZsb29wYmFja0RhdGEuc2luZUFuYWx5emVyOwpAQCAtNDQ2LDcgKzUxOCw3IEBACiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSAgcGxheWVyLm9wZW4oKSByZXR1cm5lZCAlZFxuIiwgcmVzdWx0KTsKICAgICAgICAgZXhpdCgxKTsKICAgICB9Ci0gICAgb3V0cHV0U3RyZWFtID0gcGxheWVyLmdldFN0cmVhbSgpOworICAgIG91dHB1dFN0cmVhbSA9IGxvb3BiYWNrRGF0YS5vdXRwdXRTdHJlYW0gPSBwbGF5ZXIuZ2V0U3RyZWFtKCk7CiAKICAgICBhY3R1YWxPdXRwdXRGb3JtYXQgPSBBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KG91dHB1dFN0cmVhbSk7CiAgICAgaWYgKGFjdHVhbE91dHB1dEZvcm1hdCAhPSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewpAQCAtNDYzLDcgKzUzNSw4IEBACiAKICAgICBwcmludGYoIklOUFVUICBzdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICAgLy8gVXNlIGRpZmZlcmVudCBwYXJhbWV0ZXJzIGZvciB0aGUgaW5wdXQuCi0gICAgYXJnUGFyc2VyLnNldE51bWJlck9mQnVyc3RzKEFBVURJT19VTlNQRUNJRklFRCk7CisgICAgYXJnUGFyc2VyLnNldERldmljZUlkKHJlcXVlc3RlZElucHV0RGV2aWNlSWQpOworICAgIGFyZ1BhcnNlci5zZXROdW1iZXJPZkJ1cnN0cyhBQXVkaW9QYXJhbWV0ZXJzOjprRGVmYXVsdE51bWJlck9mQnVyc3RzKTsKICAgICBhcmdQYXJzZXIuc2V0Rm9ybWF0KHJlcXVlc3RlZElucHV0Rm9ybWF0KTsKICAgICBhcmdQYXJzZXIuc2V0UGVyZm9ybWFuY2VNb2RlKGlucHV0UGVyZm9ybWFuY2VMZXZlbCk7CiAgICAgYXJnUGFyc2VyLnNldENoYW5uZWxDb3VudChyZXF1ZXN0ZWRJbnB1dENoYW5uZWxDb3VudCk7CkBAIC00ODIsMjQgKzU1NSwyOSBAQAogCiAgICAgewogICAgICAgICBpbnQzMl90IGFjdHVhbENhcGFjaXR5ID0gQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoaW5wdXRTdHJlYW0pOwotICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKGlucHV0U3RyZWFtLCBhY3R1YWxDYXBhY2l0eSk7Ci0gICAgICAgIGlmIChyZXN1bHQgPCAwKSB7Ci0gICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkVSUk9SIC0gIEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoKSByZXR1cm5lZCAlZFxuIiwgcmVzdWx0KTsKLSAgICAgICAgICAgIGdvdG8gZmluaXNoOwotICAgICAgICB9IGVsc2Uge30KLSAgICB9CisgICAgICAgICh2b2lkKSBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKGlucHV0U3RyZWFtLCBhY3R1YWxDYXBhY2l0eSk7CiAKLSAgICBhcmdQYXJzZXIuY29tcGFyZVdpdGhTdHJlYW0oaW5wdXRTdHJlYW0pOworICAgICAgICBpZiAodGVzdE1vZGUgPT0gVEVTVF9TSU5FX01BR05JVFVERQorICAgICAgICAgICAgICAgICYmIHJlcXVlc3RlZE91dHB1dEJ1cnN0cyA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMob3V0cHV0U3RyZWFtLCBhY3R1YWxDYXBhY2l0eSk7CisgICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkgeworICAgICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSAgQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhvdXRwdXQpIHJldHVybmVkICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0KTsKKyAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJPdXRwdXQgYnVmZmVyIHNpemUgc2V0IHRvIG1hdGNoIGlucHV0IGNhcGFjaXR5ID0gJWQgZnJhbWVzIVxuIiwgcmVzdWx0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCi0gICAgLy8gSWYgdGhlIGlucHV0IHN0cmVhbSBpcyB0b28gc21hbGwgdGhlbiB3ZSBjYW5ub3Qgc2F0aXNmeSB0aGUgb3V0cHV0IGNhbGxiYWNrLgotICAgIHsKLSAgICAgICAgaW50MzJfdCBhY3R1YWxDYXBhY2l0eSA9IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKGlucHV0U3RyZWFtKTsKKyAgICAgICAgLy8gSWYgdGhlIGlucHV0IHN0cmVhbSBpcyB0b28gc21hbGwgdGhlbiB3ZSBjYW5ub3Qgc2F0aXNmeSB0aGUgb3V0cHV0IGNhbGxiYWNrLgogICAgICAgICBpZiAoYWN0dWFsQ2FwYWNpdHkgPCAyICogb3V0cHV0RnJhbWVzUGVyQnVyc3QpIHsKICAgICAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSBpbnB1dCBjYXBhY2l0eSA8IDIgKiBvdXRwdXRGcmFtZXNQZXJCdXJzdFxuIik7CiAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKICAgICAgICAgfQogICAgIH0KIAorICAgIGFyZ1BhcnNlci5jb21wYXJlV2l0aFN0cmVhbShpbnB1dFN0cmVhbSk7CisKICAgICAvLyAtLS0tLS0tIFNldHVwIGxvb3BiYWNrRGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIGxvb3BiYWNrRGF0YS5hY3R1YWxJbnB1dEZvcm1hdCA9IEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQoaW5wdXRTdHJlYW0pOwogCkBAIC01MTgsNiArNTk2LDggQEAKIAogICAgIGxvb3BiYWNrRGF0YS5sb29wYmFja1Byb2Nlc3Nvci0+cmVzZXQoKTsKIAorICAgIGxvb3BiYWNrRGF0YS5oYW5nVGltZU1pbGxpcyA9IGhhbmdUaW1lTWlsbGlzOworCiAgICAgLy8gU3RhcnQgT1VUUFVUIGZpcnN0IHNvIElOUFVUIGRvZXMgbm90IG92ZXJmbG93LgogICAgIHJlc3VsdCA9IHBsYXllci5zdGFydCgpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CkBAIC02MDQsNyArNjg0LDE3IEBACiAKICAgICBpZiAobG9vcGJhY2tEYXRhLmlucHV0RXJyb3IgPT0gQUFVRElPX09LKSB7CiAgICAgICAgIGlmICh0ZXN0TW9kZSA9PSBURVNUX1NJTkVfTUFHTklUVURFKSB7Ci0gICAgICAgICAgICBwcmludEF1ZGlvR3JhcGgobG9vcGJhY2tEYXRhLmF1ZGlvUmVjb3JkaW5nLCAyMDApOworICAgICAgICAgICAgaWYgKGxvb3BiYWNrRGF0YS5udW1HbGl0Y2hFdmVudHMgPiAwKSB7CisgICAgICAgICAgICAgICAgLy8gR3JhcGggYXJvdW5kIHRoZSBmaXJzdCBnbGl0Y2ggaWYgdGhlcmUgaXMgb25lLgorICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc3RhcnQgPSBsb29wYmFja0RhdGEuZ2xpdGNoRnJhbWVzWzBdIC0gODsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGVuZCA9IHN0YXJ0ICsgb3V0cHV0RnJhbWVzUGVyQnVyc3QgKyA4ICsgODsKKyAgICAgICAgICAgICAgICBwcmludEF1ZGlvR3JhcGhSZWdpb24obG9vcGJhY2tEYXRhLmF1ZGlvUmVjb3JkaW5nLCBzdGFydCwgZW5kKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gT3IgZ3JhcGggdGhlIG1pZGRsZSBvZiB0aGUgc2lnbmFsLgorICAgICAgICAgICAgICAgIGNvbnN0IGludDMyX3Qgc3RhcnQgPSBsb29wYmFja0RhdGEuYXVkaW9SZWNvcmRpbmcuc2l6ZSgpIC8gMjsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGVuZCA9IHN0YXJ0ICsgMjAwOworICAgICAgICAgICAgICAgIHByaW50QXVkaW9HcmFwaFJlZ2lvbihsb29wYmFja0RhdGEuYXVkaW9SZWNvcmRpbmcsIHN0YXJ0LCBlbmQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5yZXBvcnQoKTsKQEAgLTY1NCw2ICs3NDQsMTEgQEAKICAgICBkZWxldGVbXSBsb29wYmFja0RhdGEuaW5wdXRTaG9ydERhdGE7CiAKIHJlcG9ydF9yZXN1bHQ6CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvb3BiYWNrRGF0YS5udW1HbGl0Y2hFdmVudHM7IGkrKykgeworICAgICAgICBwcmludGYoIiAgZ2xpdGNoIGF0IGZyYW1lICVkXG4iLCBsb29wYmFja0RhdGEuZ2xpdGNoRnJhbWVzW2ldKTsKKyAgICB9CisKICAgICB3cml0dGVuID0gbG9vcGJhY2tEYXRhLmxvb3BiYWNrUHJvY2Vzc29yLT5zYXZlKEZJTEVOQU1FX1BST0NFU1NFRCk7CiAgICAgaWYgKHdyaXR0ZW4gPiAwKSB7CiAgICAgICAgIHByaW50ZigibWFpbigpIHdyb3RlICU4ZCBwcm9jZXNzZWQgc2FtcGxlcyB0byBcIiVzXCIgb24gQW5kcm9pZCBkZXZpY2VcbiIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvQXJnc1BhcnNlci5oIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb0FyZ3NQYXJzZXIuaAppbmRleCBhMmI5MTc3Li45MTE1Nzc4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvQXJnc1BhcnNlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9BcmdzUGFyc2VyLmgKQEAgLTM2LDExICszNiwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudFR5cGUpID0gbnVsbHB0cjsKIHN0YXRpYyB2b2lkICgqc19zZXRJbnB1dFByZXNldCkoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2lucHV0X3ByZXNldF90IGlucHV0UHJlc2V0KSA9IG51bGxwdHI7CitzdGF0aWMgdm9pZCAoKnNfc2V0QWxsb3dlZENhcHR1cmVQb2xpY3kpKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IHVzYWdlKSA9IG51bGxwdHI7CiAKIHN0YXRpYyBib29sIHNfbG9hZEF0dGVtcHRlZCA9IGZhbHNlOwogc3RhdGljIGFhdWRpb191c2FnZV90ICgqc19nZXRVc2FnZSkoQUF1ZGlvU3RyZWFtICpzdHJlYW0pID0gbnVsbHB0cjsKIHN0YXRpYyBhYXVkaW9fY29udGVudF90eXBlX3QgKCpzX2dldENvbnRlbnRUeXBlKShBQXVkaW9TdHJlYW0gKnN0cmVhbSkgPSBudWxscHRyOwogc3RhdGljIGFhdWRpb19pbnB1dF9wcmVzZXRfdCAoKnNfZ2V0SW5wdXRQcmVzZXQpKEFBdWRpb1N0cmVhbSAqc3RyZWFtKSA9IG51bGxwdHI7CitzdGF0aWMgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCAoKnNfZ2V0QWxsb3dlZENhcHR1cmVQb2xpY3kpKEFBdWRpb1N0cmVhbSAqc3RyZWFtKSA9IG51bGxwdHI7CiAKIC8vIExpbmsgdG8gdGVzdCBmdW5jdGlvbnMgaW4gc2hhcmVkIGxpYnJhcnkuCiBzdGF0aWMgdm9pZCBsb2FkRnV0dXJlRnVuY3Rpb25zKCkgewpAQCAtNjEsNiArNjQsMTAgQEAKICAgICAgICAgICAgICAgICBkbHN5bShoYW5kbGUsICJBQXVkaW9TdHJlYW1CdWlsZGVyX3NldElucHV0UHJlc2V0Iik7CiAgICAgICAgIGlmIChzX3NldElucHV0UHJlc2V0ID09IG51bGxwdHIpIGdvdG8gZXJyb3I7CiAKKyAgICAgICAgc19zZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSA9ICh2b2lkICgqKShBQXVkaW9TdHJlYW1CdWlsZGVyICosIGFhdWRpb19pbnB1dF9wcmVzZXRfdCkpCisgICAgICAgICAgICAgICAgZGxzeW0oaGFuZGxlLCAiQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSIpOworICAgICAgICBpZiAoc19zZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSA9PSBudWxscHRyKSBnb3RvIGVycm9yOworCiAgICAgICAgIHNfZ2V0VXNhZ2UgPSAoYWF1ZGlvX3VzYWdlX3QgKCopKEFBdWRpb1N0cmVhbSAqKSkKICAgICAgICAgICAgICAgICBkbHN5bShoYW5kbGUsICJBQXVkaW9TdHJlYW1fZ2V0VXNhZ2UiKTsKICAgICAgICAgaWYgKHNfZ2V0VXNhZ2UgPT0gbnVsbHB0cikgZ290byBlcnJvcjsKQEAgLTcyLDYgKzc5LDEwIEBACiAgICAgICAgIHNfZ2V0SW5wdXRQcmVzZXQgPSAoYWF1ZGlvX2lucHV0X3ByZXNldF90ICgqKShBQXVkaW9TdHJlYW0gKikpCiAgICAgICAgICAgICAgICAgZGxzeW0oaGFuZGxlLCAiQUF1ZGlvU3RyZWFtX2dldElucHV0UHJlc2V0Iik7CiAgICAgICAgIGlmIChzX2dldElucHV0UHJlc2V0ID09IG51bGxwdHIpIGdvdG8gZXJyb3I7CisKKyAgICAgICAgc19nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSA9IChhYXVkaW9faW5wdXRfcHJlc2V0X3QgKCopKEFBdWRpb1N0cmVhbSAqKSkKKyAgICAgICAgICAgICAgICBkbHN5bShoYW5kbGUsICJBQXVkaW9TdHJlYW1fZ2V0QWxsb3dlZENhcHR1cmVQb2xpY3kiKTsKKyAgICAgICAgaWYgKHNfZ2V0QWxsb3dlZENhcHR1cmVQb2xpY3kgPT0gbnVsbHB0cikgZ290byBlcnJvcjsKICAgICB9CiAgICAgcmV0dXJuOwogCkBAIC0xMzAsMTIgKzE0MSwxMCBAQAogICAgIH0KIAogICAgIGludDMyX3QgZ2V0QnVmZmVyQ2FwYWNpdHkoKSBjb25zdCB7Ci0gICAgICAgIHByaW50ZigiJXMoKSByZXR1cm5zICVkXG4iLCBfX2Z1bmNfXywgbUJ1ZmZlckNhcGFjaXR5KTsKICAgICAgICAgcmV0dXJuIG1CdWZmZXJDYXBhY2l0eTsKICAgICB9CiAKICAgICB2b2lkIHNldEJ1ZmZlckNhcGFjaXR5KGludDMyX3QgZnJhbWVzKSB7Ci0gICAgICAgIHByaW50ZigiJXMoJWQpXG4iLCBfX2Z1bmNfXywgZnJhbWVzKTsKICAgICAgICAgbUJ1ZmZlckNhcGFjaXR5ID0gZnJhbWVzOwogICAgIH0KIApAQCAtMTcxLDYgKzE4MCwxNCBAQAogICAgICAgICBtSW5wdXRQcmVzZXQgPSBpbnB1dFByZXNldDsKICAgICB9CiAKKyAgICBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IGdldEFsbG93ZWRDYXB0dXJlUG9saWN5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUFsbG93ZWRDYXB0dXJlUG9saWN5OworICAgIH0KKworICAgIHZvaWQgc2V0QWxsb3dlZENhcHR1cmVQb2xpY3koYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBwb2xpY3kpIHsKKyAgICAgICAgbUFsbG93ZWRDYXB0dXJlUG9saWN5ID0gcG9saWN5OworICAgIH0KKwogICAgIGludDMyX3QgZ2V0RGV2aWNlSWQoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtRGV2aWNlSWQ7CiAgICAgfQpAQCAtMjI1LDggKzI0MiwxNyBAQAogICAgICAgICB9IGVsc2UgaWYgKG1Vc2FnZSAhPSBBQVVESU9fVU5TUEVDSUZJRUQpewogICAgICAgICAgICAgcHJpbnRmKCJXQVJOSU5HOiBzZXRJbnB1dFByZXNldCBub3Qgc3VwcG9ydGVkIik7CiAgICAgICAgIH0KKworICAgICAgICAvLyBDYWxsIFEgZnVuY3Rpb25zIGlmIHN1cHBvcnRlZC4KKyAgICAgICAgaWYgKHNfc2V0QWxsb3dlZENhcHR1cmVQb2xpY3kgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgc19zZXRBbGxvd2VkQ2FwdHVyZVBvbGljeShidWlsZGVyLCBtQWxsb3dlZENhcHR1cmVQb2xpY3kpOworICAgICAgICB9IGVsc2UgaWYgKG1BbGxvd2VkQ2FwdHVyZVBvbGljeSAhPSBBQVVESU9fVU5TUEVDSUZJRUQpeworICAgICAgICAgICAgcHJpbnRmKCJXQVJOSU5HOiBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIH0KICAgICB9CiAKKyAgICBzdGF0aWMgY29uc3RleHByIGludDMyX3QgICBrRGVmYXVsdE51bWJlck9mQnVyc3RzID0gMjsKKwogcHJpdmF0ZToKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50ICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICAgICAgIG1Gb3JtYXQgICAgICAgICAgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOwpAQCAtMjQwLDggKzI2Niw5IEBACiAgICAgYWF1ZGlvX3VzYWdlX3QgICAgICAgICAgICAgbVVzYWdlICAgICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBhYXVkaW9fY29udGVudF90eXBlX3QgICAgICBtQ29udGVudFR5cGUgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCAgICAgIG1JbnB1dFByZXNldCAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CisgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBtQWxsb3dlZENhcHR1cmVQb2xpY3kgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogCi0gICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbU51bWJlck9mQnVyc3RzICA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtTnVtYmVyT2ZCdXJzdHMgID0ga0RlZmF1bHROdW1iZXJPZkJ1cnN0czsKICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUGVyQ2FsbGJhY2sgPSBBQVVESU9fVU5TUEVDSUZJRUQ7CiB9OwogCkBAIC0yNjksNiArMjk2LDkgQEAKICAgICAgICAgICAgICAgICBjYXNlICdjJzoKICAgICAgICAgICAgICAgICAgICAgc2V0Q2hhbm5lbENvdW50KGF0b2koJmFyZ1syXSkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlICdDJzoKKyAgICAgICAgICAgICAgICAgICAgc2V0QWxsb3dlZENhcHR1cmVQb2xpY3kocGFyc2VBbGxvd2VkQ2FwdHVyZVBvbGljeShhcmdbMl0pKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSAnZCc6CiAgICAgICAgICAgICAgICAgICAgIHNldERldmljZUlkKGF0b2koJmFyZ1syXSkpOwogICAgICAgICAgICAgICAgICAgICBicmVhazsKQEAgLTI4Myw3ICszMTMsNyBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoc3RybGVuKGFyZykgPiAyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3kgPSBhdG9pKCZhcmdbMl0pOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICghQUF1ZGlvX3NldE1NYXBQb2xpY3kocG9saWN5KSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoQUF1ZGlvX3NldE1NYXBQb2xpY3kocG9saWN5KSAhPSBBQVVESU9fT0spIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRVJST1I6IGludmFsaWQgTU1BUCBwb2xpY3kgbW9kZSAlaVxuIiwgcG9saWN5KTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0gYnJlYWs7CkBAIC0zNDMsNiArMzczLDEwIEBACiAgICAgICAgIHByaW50ZigiICAgICAgRGVmYXVsdCB2YWx1ZXMgYXJlIFVOU1BFQ0lGSUVEIHVubGVzcyBvdGhlcndpc2Ugc3RhdGVkLlxuIik7CiAgICAgICAgIHByaW50ZigiICAgICAgLWJ7YnVmZmVyQ2FwYWNpdHl9IGZyYW1lc1xuIik7CiAgICAgICAgIHByaW50ZigiICAgICAgLWN7Y2hhbm5lbHN9IGZvciBleGFtcGxlIDIgZm9yIHN0ZXJlb1xuIik7CisgICAgICAgIHByaW50ZigiICAgICAgLUN7YXxzfG59IHNldCBwbGF5YmFjayBjYXB0dXJlIHBvbGljeVxuIik7CisgICAgICAgIHByaW50ZigiICAgICAgICAgIGEgPSBfQUxMIChkZWZhdWx0KVxuIik7CisgICAgICAgIHByaW50ZigiICAgICAgICAgIHMgPSBfU1lTVEVNXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAgICAgbiA9IF9OT05FXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAtZHtkZXZpY2VJZH0gZGVmYXVsdCBpcyAlZFxuIiwgQUFVRElPX1VOU1BFQ0lGSUVEKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAtZnswfDF8Mn0gc2V0IGZvcm1hdFxuIik7CiAgICAgICAgIHByaW50ZigiICAgICAgICAgIDAgPSBVTlNQRUNJRklFRFxuIik7CkBAIC0zNTQsNyArMzg4LDcgQEAKICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgMSA9IF9ORVZFUiwgbmV2ZXIgdXNlIE1NQVBcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgICAgICAyID0gX0FVVE8sIHVzZSBNTUFQIGlmIGF2YWlsYWJsZSwgZGVmYXVsdCBmb3IgLW0gd2l0aCBubyBudW1iZXJcbiIpOwogICAgICAgICBwcmludGYoIiAgICAgICAgICAzID0gX0FMV0FZUywgdXNlIE1NQVAgb3IgZmFpbFxuIik7Ci0gICAgICAgIHByaW50ZigiICAgICAgLW57bnVtYmVyT2ZCdXJzdHN9IGZvciBzZXRCdWZmZXJTaXplXG4iKTsKKyAgICAgICAgcHJpbnRmKCIgICAgICAtbntudW1iZXJPZkJ1cnN0c30gZm9yIHNldEJ1ZmZlclNpemUsIGRlZmF1bHQgJWRcbiIsIGtEZWZhdWx0TnVtYmVyT2ZCdXJzdHMpOwogICAgICAgICBwcmludGYoIiAgICAgIC1we3BlcmZvcm1hbmNlTW9kZX0gc2V0IG91dHB1dCBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERSosIGRlZmF1bHQgTk9ORVxuIik7CiAgICAgICAgIHByaW50ZigiICAgICAgICAgIG4gZm9yIF9OT05FXG4iKTsKICAgICAgICAgcHJpbnRmKCIgICAgICAgICAgbCBmb3IgX0xBVEVOQ1lcbiIpOwpAQCAtMzY3LDYgKzQwMSwyNSBAQAogICAgICAgICBwcmludGYoIiAgICAgIC16e2NhbGxiYWNrU2l6ZX0gb3IgYmxvY2sgc2l6ZSwgaW4gZnJhbWVzLCBkZWZhdWx0ID0gMFxuIik7CiAgICAgfQogCisgICAgc3RhdGljIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGFyc2VBbGxvd2VkQ2FwdHVyZVBvbGljeShjaGFyIGMpIHsKKyAgICAgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBwb2xpY3kgPSBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9BTEw7CisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnYSc6CisgICAgICAgICAgICAgICAgcG9saWN5ID0gQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfQUxMOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAncyc6CisgICAgICAgICAgICAgICAgcG9saWN5ID0gQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfU1lTVEVNOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAnbic6CisgICAgICAgICAgICAgICAgcG9saWN5ID0gQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfTk9ORTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgcHJpbnRmKCJFUlJPUjogaW52YWxpZCBwbGF5YmFjayBjYXB0dXJlIHBvbGljeSAlY1xuIiwgYyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHBvbGljeTsKKyAgICB9CisKICAgICBzdGF0aWMgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwYXJzZVBlcmZvcm1hbmNlTW9kZShjaGFyIGMpIHsKICAgICAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBtb2RlID0gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORTsKICAgICAgICAgc3dpdGNoIChjKSB7CkBAIC00MDksMTcgKzQ2MiwyOCBAQAogICAgICAgICAgICAgICAgZ2V0Rm9ybWF0KCksIEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQoc3RyZWFtKSk7CiAKICAgICAgICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdCA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNQZXJCdXJzdChzdHJlYW0pOwotICAgICAgICBpbnQzMl90IHNpemVGcmFtZXMgPSBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyU2l6ZUluRnJhbWVzKHN0cmVhbSk7CiAgICAgICAgIHByaW50ZigiICBCdWZmZXI6ICAgICAgIGJ1cnN0ICAgICA9ICVkXG4iLCBmcmFtZXNQZXJCdXJzdCk7CisKKyAgICAgICAgaW50MzJfdCBzaXplRnJhbWVzID0gQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlclNpemVJbkZyYW1lcyhzdHJlYW0pOwogICAgICAgICBpZiAoZnJhbWVzUGVyQnVyc3QgPiAwKSB7Ci0gICAgICAgICAgICBwcmludGYoIiAgQnVmZmVyOiAgICAgICBzaXplICAgICAgPSAlZCA9ICglZCAqICVkKSArICVkXG4iLAorICAgICAgICAgICAgaW50MzJfdCByZXF1ZXN0ZWRTaXplID0gZ2V0TnVtYmVyT2ZCdXJzdHMoKSAqIGZyYW1lc1BlckJ1cnN0OworICAgICAgICAgICAgcHJpbnRmKCIgIEJ1ZmZlclNpemU6ICAgcmVxdWVzdGVkID0gJTRkLCBhY3R1YWwgPSAlNGQgPSAoJWQgKiAlZCkgKyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRTaXplLAogICAgICAgICAgICAgICAgICAgIHNpemVGcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgKHNpemVGcmFtZXMgLyBmcmFtZXNQZXJCdXJzdCksCiAgICAgICAgICAgICAgICAgICAgZnJhbWVzUGVyQnVyc3QsCiAgICAgICAgICAgICAgICAgICAgKHNpemVGcmFtZXMgJSBmcmFtZXNQZXJCdXJzdCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgIHByaW50ZigiICBCdWZmZXJTaXplOiAgICAlZFxuIiwgc2l6ZUZyYW1lcyk7CiAgICAgICAgIH0KLSAgICAgICAgcHJpbnRmKCIgIENhcGFjaXR5OiAgICAgcmVxdWVzdGVkID0gJWQsIGFjdHVhbCA9ICVkXG4iLCBnZXRCdWZmZXJDYXBhY2l0eSgpLAotICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoc3RyZWFtKSk7CisKKyAgICAgICAgaW50MzJfdCBjYXBhY2l0eUZyYW1lcyA9IEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKHN0cmVhbSk7CisgICAgICAgIHByaW50ZigiICBDYXBhY2l0eTogICAgIHJlcXVlc3RlZCA9ICU0ZCwgYWN0dWFsID0gJTRkID0gKCVkICogJWQpICsgJWRcbiIsCisgICAgICAgICAgICAgICBnZXRCdWZmZXJDYXBhY2l0eSgpLAorICAgICAgICAgICAgICAgY2FwYWNpdHlGcmFtZXMsCisgICAgICAgICAgICAgICAoY2FwYWNpdHlGcmFtZXMgLyBmcmFtZXNQZXJCdXJzdCksCisgICAgICAgICAgICAgICBmcmFtZXNQZXJCdXJzdCwKKyAgICAgICAgICAgICAgIChjYXBhY2l0eUZyYW1lcyAlIGZyYW1lc1BlckJ1cnN0KSk7CiAKICAgICAgICAgcHJpbnRmKCIgIENhbGxiYWNrU2l6ZTogcmVxdWVzdGVkID0gJWQsIGFjdHVhbCA9ICVkXG4iLCBnZXRGcmFtZXNQZXJDYWxsYmFjaygpLAogICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1BlckRhdGFDYWxsYmFjayhzdHJlYW0pKTsKQEAgLTQ1MSw2ICs1MTUsMTEgQEAKICAgICAgICAgcHJpbnRmKCIgIElzIE1NQVAgdXNlZD8gJXNcbiIsIEFBdWRpb1N0cmVhbV9pc01NYXBVc2VkKHN0cmVhbSkKICAgICAgICAgICAgICAgID8gInllcyIgOiAibm8iKTsKIAorICAgICAgICBpZiAoc19nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBwcmludGYoIiAgQ29udGVudFR5cGU6ICByZXF1ZXN0ZWQgPSAlZCwgYWN0dWFsID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgZ2V0QWxsb3dlZENhcHR1cmVQb2xpY3koKSwgc19nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeShzdHJlYW0pKTsKKyAgICAgICAgfQorCiAgICAgfQogCiAgICAgaW50MzJfdCBnZXREdXJhdGlvblNlY29uZHMoKSBjb25zdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmggYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMvQUF1ZGlvU2ltcGxlUGxheWVyLmgKaW5kZXggMTY0NTk4Ni4uZmQxZmM0NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzL0FBdWRpb1NpbXBsZVBsYXllci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy91dGlscy9BQXVkaW9TaW1wbGVQbGF5ZXIuaApAQCAtMzIsOCArMzIsNiBAQAogCiAvLyBBcmJpdHJhcnkgcGVyaW9kIGZvciBnbGl0Y2hlcwogI2RlZmluZSBGT1JDRURfVU5ERVJSVU5fUEVSSU9EX0ZSQU1FUyAgICAoMiAqIDQ4MDAwKQotLy8gSG93IGxvbmcgdG8gc2xlZXAgaW4gYSBjYWxsYmFjayB0byBjYXVzZSBhbiBpbnRlbnRpb25hbCBnbGl0Y2guIEZvciB0ZXN0aW5nLgotI2RlZmluZSBGT1JDRURfVU5ERVJSVU5fU0xFRVBfTUlDUk9TICAgICAoMTAgKiAxMDAwKQogCiAjZGVmaW5lIE1BWF9USU1FU1RBTVBTICAgICAgICAgICAgICAgICAgIDE2CiAKQEAgLTEyMiwxMCArMTIwLDkgQEAKIAogICAgICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgewogICAgICAgICAgICAgaW50MzJfdCBzaXplSW5CdXJzdHMgPSBwYXJhbWV0ZXJzLmdldE51bWJlck9mQnVyc3RzKCk7Ci0gICAgICAgICAgICBpZiAoc2l6ZUluQnVyc3RzID4gMCkgewotICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzUGVyQnVyc3QgPSBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUGVyQnVyc3QobVN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhtU3RyZWFtLCBzaXplSW5CdXJzdHMgKiBmcmFtZXNQZXJCdXJzdCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IGZyYW1lc1BlckJ1cnN0ID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1BlckJ1cnN0KG1TdHJlYW0pOworICAgICAgICAgICAgaW50MzJfdCBidWZmZXJTaXplRnJhbWVzID0gc2l6ZUluQnVyc3RzICogZnJhbWVzUGVyQnVyc3Q7CisgICAgICAgICAgICBBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzKG1TdHJlYW0sIGJ1ZmZlclNpemVGcmFtZXMpOwogICAgICAgICB9CiAKICAgICAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUoYnVpbGRlcik7CkBAIC0yNzUsNyArMjcyLDcgQEAKIAogICAgIGludCAgICAgICAgICAgICAgICBzY2hlZHVsZXIgPSAwOwogICAgIGJvb2wgICAgICAgICAgICAgICBzY2hlZHVsZXJDaGVja2VkID0gZmFsc2U7Ci0gICAgYm9vbCAgICAgICAgICAgICAgIGZvcmNlVW5kZXJydW5zID0gZmFsc2U7CisgICAgaW50MzJfdCAgICAgICAgICAgIGhhbmdUaW1lTVNlYyA9IDA7CiAKICAgICBBQXVkaW9TaW1wbGVQbGF5ZXIgc2ltcGxlUGxheWVyOwogICAgIGludDMyX3QgICAgICAgICAgICBjYWxsYmFja0NvdW50ID0gMDsKQEAgLTMyNywxMCArMzI0LDEyIEBACiAgICAgICAgIHNpbmVEYXRhLT5zZXR1cFNpbmVTd2VlcHMoKTsKICAgICB9CiAKLSAgICBpZiAoc2luZURhdGEtPmZvcmNlVW5kZXJydW5zKSB7CisgICAgaWYgKHNpbmVEYXRhLT5oYW5nVGltZU1TZWMgPiAwKSB7CiAgICAgICAgIGlmIChzaW5lRGF0YS0+ZnJhbWVzVG90YWwgPiBzaW5lRGF0YS0+bmV4dEZyYW1lVG9HbGl0Y2gpIHsKLSAgICAgICAgICAgIHVzbGVlcChGT1JDRURfVU5ERVJSVU5fU0xFRVBfTUlDUk9TKTsKLSAgICAgICAgICAgIHByaW50ZigiU2ltdWxhdGUgZ2xpdGNoIGF0ICVsbGRcbiIsIChsb25nIGxvbmcpIHNpbmVEYXRhLT5mcmFtZXNUb3RhbCk7CisgICAgICAgICAgICB1c2xlZXAoc2luZURhdGEtPmhhbmdUaW1lTVNlYyAqIDEwMDApOworICAgICAgICAgICAgcHJpbnRmKCJIYW5nIGNhbGxiYWNrIGF0ICVsbGQgZnJhbWVzIGZvciAlZCBtc2VjXG4iLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBzaW5lRGF0YS0+ZnJhbWVzVG90YWwsCisgICAgICAgICAgICAgICAgICAgc2luZURhdGEtPmhhbmdUaW1lTVNlYyk7CiAgICAgICAgICAgICBzaW5lRGF0YS0+bmV4dEZyYW1lVG9HbGl0Y2ggKz0gRk9SQ0VEX1VOREVSUlVOX1BFUklPRF9GUkFNRVM7CiAgICAgICAgIH0KICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvQW5kcm9pZC5icAppbmRleCBjYzgwODYxLi5hYTI1ZTY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL0FuZHJvaWQuYnAKQEAgLTQsNyArNCw2IEBACiAgICAgY2ZsYWdzOiBbIi1XYWxsIiwgIi1XZXJyb3IiXSwKICAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKICAgICBoZWFkZXJfbGliczogWyJsaWJhYXVkaW9fZXhhbXBsZV91dGlscyJdLAotICAgIHBhY2tfcmVsb2NhdGlvbnM6IGZhbHNlLAogfQogCiBjY190ZXN0IHsKQEAgLTEzLDUgKzEyLDQgQEAKICAgICBjZmxhZ3M6IFsiLVdhbGwiLCAiLVdlcnJvciJdLAogICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAogICAgIGhlYWRlcl9saWJzOiBbImxpYmFhdWRpb19leGFtcGxlX3V0aWxzIl0sCi0gICAgcGFja19yZWxvY2F0aW9uczogZmFsc2UsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9qbmkvQW5kcm9pZC5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTFiZDQzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmFhdWRpby9zcmMgXAotICAgIGZyYW1ld29ya3MvYXYvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3V0aWxzCi0KLSMgTkRLIHJlY29tbWVuZHMgdXNpbmcgdGhpcyBraW5kIG9mIHJlbGF0aXZlIHBhdGggaW5zdGVhZCBvZiBhbiBhYnNvbHV0ZSBwYXRoLgotTE9DQUxfU1JDX0ZJTEVTOj0gLi4vc3JjL3dyaXRlX3NpbmUuY3BwCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KLUxPQ0FMX01PRFVMRSA6PSB3cml0ZV9zaW5lCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvdXRpbHMKLQotTE9DQUxfU1JDX0ZJTEVTOj0gLi4vc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBsaWJhYXVkaW8KLUxPQ0FMX01PRFVMRSA6PSB3cml0ZV9zaW5lX2NhbGxiYWNrCi1pbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gbGliYWF1ZGlvX3ByZWJ1aWx0Ci1MT0NBTF9TUkNfRklMRVMgOj0gbGliYWF1ZGlvLnNvCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFUyA6PSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKLWluY2x1ZGUgJChQUkVCVUlMVF9TSEFSRURfTElCUkFSWSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BcHBsaWNhdGlvbi5tayBiL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL2puaS9BcHBsaWNhdGlvbi5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE0NGYzNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9qbmkvQXBwbGljYXRpb24ubWsKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1BUFBfQ1BQRkxBR1MgKz0gLXN0ZD1jKysxMQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwIGIvbWVkaWEvbGliYWF1ZGlvL2V4YW1wbGVzL3dyaXRlX3NpbmUvc3JjL3dyaXRlX3NpbmVfY2FsbGJhY2suY3BwCmluZGV4IDdhNDgxNTMuLmNhNjAyMzMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9leGFtcGxlcy93cml0ZV9zaW5lL3NyYy93cml0ZV9zaW5lX2NhbGxiYWNrLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vZXhhbXBsZXMvd3JpdGVfc2luZS9zcmMvd3JpdGVfc2luZV9jYWxsYmFjay5jcHAKQEAgLTI2LDExICsyNiwxNCBAQAogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisKICNpbmNsdWRlICJBQXVkaW9FeGFtcGxlVXRpbHMuaCIKICNpbmNsdWRlICJBQXVkaW9TaW1wbGVQbGF5ZXIuaCIKICNpbmNsdWRlICJBQXVkaW9BcmdzUGFyc2VyLmgiCiAKLSNkZWZpbmUgQVBQX1ZFUlNJT04gICIwLjEuNSIKKyNkZWZpbmUgQVBQX1ZFUlNJT04gICIwLjEuNyIKKworY29uc3RleHByIGludDMyX3Qga0RlZmF1bHRIYW5nVGltZU1TZWMgPSAxMDsKIAogLyoqCiAgKiBPcGVuIHN0cmVhbSwgcGxheSBzb21lIHNpbmUgd2F2ZXMsIHRoZW4gY2xvc2UgdGhlIHN0cmVhbS4KQEAgLTQxLDcgKzQ0LDcgQEAKIHN0YXRpYyBhYXVkaW9fcmVzdWx0X3QgdGVzdE9wZW5QbGF5Q2xvc2UoQUF1ZGlvQXJnc1BhcnNlciAmYXJnUGFyc2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGxvb3BDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmVmaXhUb25lTXNlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZVVuZGVycnVucykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoYW5nVGltZU1TZWMpCiB7CiAgICAgU2luZVRocmVhZGVkRGF0YV90IG15RGF0YTsKICAgICBBQXVkaW9TaW1wbGVQbGF5ZXIgJnBsYXllciA9IG15RGF0YS5zaW1wbGVQbGF5ZXI7CkBAIC01MywxMCArNTYsMTIgQEAKICAgICBwcmludGYoIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJ1biBjb21wbGV0ZSB0ZXN0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsKICAgICBteURhdGEuc2NoZWR1bGVyQ2hlY2tlZCA9IGZhbHNlOwogICAgIG15RGF0YS5jYWxsYmFja0NvdW50ID0gMDsKLSAgICBteURhdGEuZm9yY2VVbmRlcnJ1bnMgPSBmb3JjZVVuZGVycnVuczsgLy8gdGVzdCBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KCkKKyAgICBteURhdGEuaGFuZ1RpbWVNU2VjID0gaGFuZ1RpbWVNU2VjOyAvLyB0ZXN0IEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQoKQogCiAgICAgcmVzdWx0ID0gcGxheWVyLm9wZW4oYXJnUGFyc2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZVBsYXllckRhdGFDYWxsYmFja1Byb2MsIFNpbXBsZVBsYXllckVycm9yQ2FsbGJhY2tQcm9jLCAmbXlEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBTaW1wbGVQbGF5ZXJEYXRhQ2FsbGJhY2tQcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNpbXBsZVBsYXllckVycm9yQ2FsbGJhY2tQcm9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICZteURhdGEpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1IgLSAgcGxheWVyLm9wZW4oKSByZXR1cm5lZCAlc1xuIiwKICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKQEAgLTExNSwxMiArMTIwLDE3IEBACiAgICAgICAgICAgICBpbnQ2NF90IG1pbGxpcyA9CiAgICAgICAgICAgICAgICAgICAgIChnZXROYW5vc2Vjb25kcyhDTE9DS19NT05PVE9OSUMpIC0gc3RhcnRlZEF0TmFub3MpIC8gTkFOT1NfUEVSX01JTExJU0VDT05EOwogICAgICAgICAgICAgcmVzdWx0ID0gbXlEYXRhLndha2VyLmdldCgpOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCBmcmFtZXNXcml0dGVuID0gKGludDMyX3QpIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKHBsYXllci5nZXRTdHJlYW0oKSk7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IGZyYW1lc1JlYWQgPSAoaW50MzJfdCkgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQocGxheWVyLmdldFN0cmVhbSgpKTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgeHJ1bnMgPSBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KHBsYXllci5nZXRTdHJlYW0oKSk7CiAgICAgICAgICAgICBwcmludGYoIiB3YWtlciByZXN1bHQgPSAlZCwgYXQgJTZkIG1pbGxpcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIsIHNlY29uZCA9ICUzZCwgZnJhbWVzV3JpdHRlbiA9ICU4ZCwgdW5kZXJydW5zID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiLCBzZWNvbmQgPSAlM2QsIGZyYW1lcyB3cml0dGVuICU4ZCAtIHJlYWQgJThkID0gJThkLCB1bmRlcnJ1bnMgPSAlZFxuIiwKICAgICAgICAgICAgICAgICAgICByZXN1bHQsIChpbnQpIG1pbGxpcywKICAgICAgICAgICAgICAgICAgICBzZWNvbmQsCi0gICAgICAgICAgICAgICAgICAgKGludCkgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW4ocGxheWVyLmdldFN0cmVhbSgpKSwKLSAgICAgICAgICAgICAgICAgICAoaW50KSBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50KHBsYXllci5nZXRTdHJlYW0oKSkpOworICAgICAgICAgICAgICAgICAgIGZyYW1lc1dyaXR0ZW4sCisgICAgICAgICAgICAgICAgICAgZnJhbWVzUmVhZCwKKyAgICAgICAgICAgICAgICAgICBmcmFtZXNXcml0dGVuIC0gZnJhbWVzUmVhZCwKKyAgICAgICAgICAgICAgICAgICB4cnVucyk7CiAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICAgICAgICAgIGRpc2Nvbm5lY3RlZCA9IChyZXN1bHQgPT0gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCk7CiAgICAgICAgICAgICAgICAgYmFpbE91dCA9IHRydWU7CkBAIC0yMTAsNyArMjIwLDkgQEAKICAgICBBQXVkaW9BcmdzUGFyc2VyOjp1c2FnZSgpOwogICAgIHByaW50ZigiICAgICAgLWx7Y291bnR9IGxvb3BDb3VudCBzdGFydC9zdG9wLCBldmVyeSBvdGhlciBvbmUgaXMgc2lsZW50XG4iKTsKICAgICBwcmludGYoIiAgICAgIC10e21zZWN9ICBwbGF5IGEgaGlnaCBwaXRjaGVkIHRvbmUgYXQgdGhlIGJlZ2lubmluZ1xuIik7Ci0gICAgcHJpbnRmKCIgICAgICAteiAgICAgICAgZm9yY2UgcGVyaW9kaWMgdW5kZXJydW5zIGJ5IHNsZWVwaW5nIGluIGNhbGxiYWNrXG4iKTsKKyAgICBwcmludGYoIiAgICAgIC1oe21zZWN9ICBmb3JjZSBwZXJpb2RpYyB1bmRlcnJ1bnMgYnkgaGFuZ2luZyBpbiBjYWxsYmFja1xuIik7CisgICAgcHJpbnRmKCIgICAgICAgICAgICAgICAgSWYgbm8gdmFsdWUgc3BlY2lmaWVkIHRoZW4gJWQgdXNlZC5cbiIsCisgICAgICAgICAgICBrRGVmYXVsdEhhbmdUaW1lTVNlYyk7CiB9CiAKIGludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICoqYXJndikKQEAgLTIxOSwxMyArMjMxLDE0IEBACiAgICAgYWF1ZGlvX3Jlc3VsdF90ICAgIHJlc3VsdDsKICAgICBpbnQzMl90ICAgICAgICAgICAgbG9vcENvdW50ID0gMTsKICAgICBpbnQzMl90ICAgICAgICAgICAgcHJlZml4VG9uZU1zZWMgPSAwOwotICAgIGJvb2wgICAgICAgICAgICAgICBmb3JjZVVuZGVycnVucyA9IGZhbHNlOworICAgIGludDMyX3QgICAgICAgICAgICBoYW5nVGltZU1TZWMgPSAwOwogCiAgICAgLy8gTWFrZSBwcmludGYgcHJpbnQgaW1tZWRpYXRlbHkgc28gdGhhdCBkZWJ1ZyBpbmZvIGlzIG5vdCBzdHVjawogICAgIC8vIGluIGEgYnVmZmVyIGlmIHdlIGhhbmcgb3IgY3Jhc2guCiAgICAgc2V0dmJ1ZihzdGRvdXQsIG51bGxwdHIsIF9JT05CRiwgKHNpemVfdCkgMCk7CiAKLSAgICBwcmludGYoIiVzIC0gUGxheSBhIHNpbmUgc3dlZXAgdXNpbmcgYW4gQUF1ZGlvIGNhbGxiYWNrIFYlc1xuIiwgYXJndlswXSwgQVBQX1ZFUlNJT04pOworICAgIHByaW50ZigiJXMgLSBQbGF5IGEgc2luZSBzd2VlcCB1c2luZyBhbiBBQXVkaW8gY2FsbGJhY2sgViVzXG4iLAorICAgICAgICBhcmd2WzBdLCBBUFBfVkVSU0lPTik7CiAKICAgICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgewogICAgICAgICBjb25zdCBjaGFyICphcmcgPSBhcmd2W2ldOwpAQCAtMjQwLDggKzI1MywxMCBAQAogICAgICAgICAgICAgICAgICAgICBjYXNlICd0JzoKICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeFRvbmVNc2VjID0gYXRvaSgmYXJnWzJdKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlICd6JzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlVW5kZXJydW5zID0gdHJ1ZTsgIC8vIFp6enp6enoKKyAgICAgICAgICAgICAgICAgICAgY2FzZSAnaCc6CisgICAgICAgICAgICAgICAgICAgICAgICBoYW5nVGltZU1TZWMgPSAoYXJnWzJdKSAvLyB2YWx1ZSBzcGVjaWZpZWQ/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gYXRvaSgmYXJnWzJdKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtEZWZhdWx0SGFuZ1RpbWVNU2VjOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSgpOwpAQCAtMjU3LDcgKzI3Miw4IEBACiAgICAgfQogCiAgICAgLy8gS2VlcCBsb29waW5nIHVudGlsIHdlIGNhbiBjb21wbGV0ZSB0aGUgdGVzdCB3aXRob3V0IGRpc2Nvbm5lY3RpbmcuCi0gICAgd2hpbGUoKHJlc3VsdCA9IHRlc3RPcGVuUGxheUNsb3NlKGFyZ1BhcnNlciwgbG9vcENvdW50LCBwcmVmaXhUb25lTXNlYywgZm9yY2VVbmRlcnJ1bnMpKQorICAgIHdoaWxlKChyZXN1bHQgPSB0ZXN0T3BlblBsYXlDbG9zZShhcmdQYXJzZXIsIGxvb3BDb3VudCwKKyAgICAgICAgICAgIHByZWZpeFRvbmVNc2VjLCBoYW5nVGltZU1TZWMpKQogICAgICAgICAgICAgPT0gQUFVRElPX0VSUk9SX0RJU0NPTk5FQ1RFRCk7CiAKICAgICByZXR1cm4gKHJlc3VsdCkgPyBFWElUX0ZBSUxVUkUgOiBFWElUX1NVQ0NFU1M7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmggYi9tZWRpYS9saWJhYXVkaW8vaW5jbHVkZS9hYXVkaW8vQUF1ZGlvLmgKaW5kZXggMTQ5M2IyNi4uODE3M2UzYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL2luY2x1ZGUvYWF1ZGlvL0FBdWRpby5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9pbmNsdWRlL2FhdWRpby9BQXVkaW8uaApAQCAtMzcsNyArMzcsNyBAQAogCiAvKioKICAqIFRoaXMgaXMgdXNlZCB0byByZXByZXNlbnQgYSB2YWx1ZSB0aGF0IGhhcyBub3QgYmVlbiBzcGVjaWZpZWQuCi0gKiBGb3IgZXhhbXBsZSwgYW4gYXBwbGljYXRpb24gY291bGQgdXNlIEFBVURJT19VTlNQRUNJRklFRCB0byBpbmRpY2F0ZQorICogRm9yIGV4YW1wbGUsIGFuIGFwcGxpY2F0aW9uIGNvdWxkIHVzZSB7QGxpbmsgI0FBVURJT19VTlNQRUNJRklFRH0gdG8gaW5kaWNhdGUKICAqIHRoYXQgaXMgZGlkIG5vdCBub3QgY2FyZSB3aGF0IHRoZSBzcGVjaWZpYyB2YWx1ZSBvZiBhIHBhcmFtZXRlciB3YXMKICAqIGFuZCB3b3VsZCBhY2NlcHQgd2hhdGV2ZXIgaXQgd2FzIGdpdmVuLgogICovCkBAIC0yMzIsNyArMjMyLDggQEAKICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBieSBjZXJ0YWluIHBsYXRmb3JtcyBvciByb3V0aW5nIHBvbGljaWVzCiAgKiB0byBtYWtlIG1vcmUgcmVmaW5lZCB2b2x1bWUgb3Igcm91dGluZyBkZWNpc2lvbnMuCiAgKgotICogTm90ZSB0aGF0IHRoZXNlIG1hdGNoIHRoZSBlcXVpdmFsZW50IHZhbHVlcyBpbiBBdWRpb0F0dHJpYnV0ZXMgaW4gdGhlIEFuZHJvaWQgSmF2YSBBUEkuCisgKiBOb3RlIHRoYXQgdGhlc2UgbWF0Y2ggdGhlIGVxdWl2YWxlbnQgdmFsdWVzIGluIHtAbGluayBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlc30KKyAqIGluIHRoZSBBbmRyb2lkIEphdmEgQVBJLgogICoKICAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOC4KICAqLwpAQCAtMzAzLDEyICszMDQsMTMgQEAKIC8qKgogICogVGhlIENPTlRFTlRfVFlQRSBhdHRyaWJ1dGUgZGVzY3JpYmVzICJ3aGF0IiB5b3UgYXJlIHBsYXlpbmcuCiAgKiBJdCBleHByZXNzZXMgdGhlIGdlbmVyYWwgY2F0ZWdvcnkgb2YgdGhlIGNvbnRlbnQuIFRoaXMgaW5mb3JtYXRpb24gaXMgb3B0aW9uYWwuCi0gKiBCdXQgaW4gY2FzZSBpdCBpcyBrbm93biAoZm9yIGluc3RhbmNlIHtAbGluayAjQUFVRElPX0NPTlRFTlRfVFlQRV9NT1ZJRX0gZm9yIGEKLSAqIG1vdmllIHN0cmVhbWluZyBzZXJ2aWNlIG9yIHtAbGluayAjQUFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0h9IGZvcgorICogQnV0IGluIGNhc2UgaXQgaXMga25vd24gKGZvciBpbnN0YW5jZSBBQVVESU9fQ09OVEVOVF9UWVBFX01PVklFIGZvciBhCisgKiBtb3ZpZSBzdHJlYW1pbmcgc2VydmljZSBvciBBQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCBmb3IKICAqIGFuIGF1ZGlvIGJvb2sgYXBwbGljYXRpb24pIHRoaXMgaW5mb3JtYXRpb24gbWlnaHQgYmUgdXNlZCBieSB0aGUgYXVkaW8gZnJhbWV3b3JrIHRvCiAgKiBlbmZvcmNlIGF1ZGlvIGZvY3VzLgogICoKLSAqIE5vdGUgdGhhdCB0aGVzZSBtYXRjaCB0aGUgZXF1aXZhbGVudCB2YWx1ZXMgaW4gQXVkaW9BdHRyaWJ1dGVzIGluIHRoZSBBbmRyb2lkIEphdmEgQVBJLgorICogTm90ZSB0aGF0IHRoZXNlIG1hdGNoIHRoZSBlcXVpdmFsZW50IHZhbHVlcyBpbiB7QGxpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb0F0dHJpYnV0ZXN9CisgKiBpbiB0aGUgQW5kcm9pZCBKYXZhIEFQSS4KICAqCiAgKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCiAgKi8KQEAgLTM3MywxMCArMzc1LDU5IEBACiAgICAgICogc28gdGhlIHJlY29yZGVkIHZvbHVtZSBtYXkgYmUgdmVyeSBsb3cuCiAgICAgICovCiAgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9VTlBST0NFU1NFRCA9IDksCisKKyAgICAvKioKKyAgICAgKiBVc2UgdGhpcyBwcmVzZXQgZm9yIGNhcHR1cmluZyBhdWRpbyBtZWFudCB0byBiZSBwcm9jZXNzZWQgaW4gcmVhbCB0aW1lCisgICAgICogYW5kIHBsYXllZCBiYWNrIGZvciBsaXZlIHBlcmZvcm1hbmNlIChlLmcga2FyYW9rZSkuCisgICAgICogVGhlIGNhcHR1cmUgcGF0aCB3aWxsIG1pbmltaXplIGxhdGVuY3kgYW5kIGNvdXBsaW5nIHdpdGggcGxheWJhY2sgcGF0aC4KKyAgICAgKi8KKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1BFUkZPUk1BTkNFID0gMTAsCiB9OwogdHlwZWRlZiBpbnQzMl90IGFhdWRpb19pbnB1dF9wcmVzZXRfdDsKIAogLyoqCisgKiBTcGVjaWZ5aW5nIGlmIGF1ZGlvIG1heSBvciBtYXkgbm90IGJlIGNhcHR1cmVkIGJ5IG90aGVyIGFwcHMgb3IgdGhlIHN5c3RlbS4KKyAqCisgKiBOb3RlIHRoYXQgdGhlc2UgbWF0Y2ggdGhlIGVxdWl2YWxlbnQgdmFsdWVzIGluIHtAbGluayBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlc30KKyAqIGluIHRoZSBBbmRyb2lkIEphdmEgQVBJLgorICoKKyAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOS4KKyAqLworZW51bSB7CisgICAgLyoqCisgICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIGF1ZGlvIG1heSBiZSBjYXB0dXJlZCBieSBhbnkgYXBwLgorICAgICAqCisgICAgICogRm9yIHByaXZhY3ksIHRoZSBmb2xsb3dpbmcgdXNhZ2VzIGNhbiBub3QgYmUgcmVjb3JkZWQ6IEFBVURJT19WT0lDRV9DT01NVU5JQ0FUSU9OKiwKKyAgICAgKiBBQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OKiwgQUFVRElPX1VTQUdFX0FTU0lTVEFOQ0UqIGFuZCB7QGxpbmsgI0FBVURJT19VU0FHRV9BU1NJU1RBTlR9LgorICAgICAqCisgICAgICogT24ge0BsaW5rIGFuZHJvaWQub3MuQnVpbGQuVkVSU0lPTl9DT0RFUyNRfSwgdGhpcyBtZWFucyBvbmx5IHtAbGluayAjQUFVRElPX1VTQUdFX01FRElBfQorICAgICAqIGFuZCB7QGxpbmsgI0FBVURJT19VU0FHRV9HQU1FfSBtYXkgYmUgY2FwdHVyZWQuCisgICAgICoKKyAgICAgKiBTZWUge0BsaW5rIGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzI0FMTE9XX0NBUFRVUkVfQllfQUxMfS4KKyAgICAgKi8KKyAgICBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9BTEwgPSAxLAorICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBhdWRpbyBtYXkgb25seSBiZSBjYXB0dXJlZCBieSBzeXN0ZW0gYXBwcy4KKyAgICAgKgorICAgICAqIFN5c3RlbSBhcHBzIGNhbiBjYXB0dXJlIGZvciBtYW55IHB1cnBvc2VzIGxpa2UgYWNjZXNzaWJpbGl0eSwgdXNlciBndWlkYW5jZS4uLgorICAgICAqIGJ1dCBoYXZlIHN0cm9uZyByZXN0cmljdGlvbi4gU2VlCisgICAgICoge0BsaW5rIGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzI0FMTE9XX0NBUFRVUkVfQllfU1lTVEVNfSBmb3Igd2hhdCB0aGUgc3lzdGVtIGFwcHMKKyAgICAgKiBjYW4gZG8gd2l0aCB0aGUgY2FwdHVyZSBhdWRpby4KKyAgICAgKi8KKyAgICBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9TWVNURU0gPSAyLAorICAgIC8qKgorICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBhdWRpbyBtYXkgbm90IGJlIHJlY29yZGVkIGJ5IGFueSBhcHAsIGV2ZW4gaWYgaXQgaXMgYSBzeXN0ZW0gYXBwLgorICAgICAqCisgICAgICogSXQgaXMgZW5jb3VyYWdlZCB0byB1c2Uge0BsaW5rICNBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9TWVNURU19IGluc3RlYWQgb2YgdGhpcyB2YWx1ZSBhcyBzeXN0ZW0gYXBwcworICAgICAqIHByb3ZpZGUgc2lnbmlmaWNhbnQgYW5kIHVzZWZ1bCBmZWF0dXJlcyBmb3IgdGhlIHVzZXIgKGVnLiBhY2Nlc3NpYmlsaXR5KS4KKyAgICAgKiBTZWUge0BsaW5rIGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzI0FMTE9XX0NBUFRVUkVfQllfTk9ORX0uCisgICAgICovCisgICAgQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfTk9ORSA9IDMsCit9OworCit0eXBlZGVmIGludDMyX3QgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdDsKKworLyoqCiAgKiBUaGVzZSBtYXkgYmUgdXNlZCB3aXRoIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2Vzc2lvbklkKCkuCiAgKgogICogQWRkZWQgaW4gQVBJIGxldmVsIDI4LgpAQCAtNDIxLDYgKzQ3Miw4IEBACiAgKiBUaGlzIGlzIGludGVuZGVkIGZvciBkZXZlbG9wZXJzIHRvIHVzZSB3aGVuIGRlYnVnZ2luZy4KICAqIEl0IGlzIG5vdCBmb3IgZGlzcGxheSB0byB1c2Vycy4KICAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI2LgorICoKICAqIEByZXR1cm4gcG9pbnRlciB0byBhIHRleHQgcmVwcmVzZW50YXRpb24gb2YgYW4gQUF1ZGlvIHJlc3VsdCBjb2RlLgogICovCiBBQVVESU9fQVBJIGNvbnN0IGNoYXIgKiBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChhYXVkaW9fcmVzdWx0X3QgcmV0dXJuQ29kZSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKQEAgLTQzMSw2ICs0ODQsOCBAQAogICogVGhpcyBpcyBpbnRlbmRlZCBmb3IgZGV2ZWxvcGVycyB0byB1c2Ugd2hlbiBkZWJ1Z2dpbmcuCiAgKiBJdCBpcyBub3QgZm9yIGRpc3BsYXkgdG8gdXNlcnMuCiAgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KKyAqCiAgKiBAcmV0dXJuIHBvaW50ZXIgdG8gYSB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIGFuIEFBdWRpbyBzdGF0ZS4KICAqLwogQUFVRElPX0FQSSBjb25zdCBjaGFyICogQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUpCkBAIC00NDUsMTIgKzUwMCwxNCBAQAogICoKICAqIFRoZSBkZXZpY2VJZCBpcyBpbml0aWFsbHkgdW5zcGVjaWZpZWQsIG1lYW5pbmcgdGhhdCB0aGUgY3VycmVudCBkZWZhdWx0IGRldmljZSB3aWxsIGJlIHVzZWQuCiAgKgotICogVGhlIGRlZmF1bHQgZGlyZWN0aW9uIGlzIEFBVURJT19ESVJFQ1RJT05fT1VUUFVULgotICogVGhlIGRlZmF1bHQgc2hhcmluZyBtb2RlIGlzIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVELgorICogVGhlIGRlZmF1bHQgZGlyZWN0aW9uIGlzIHtAbGluayAjQUFVRElPX0RJUkVDVElPTl9PVVRQVVR9LgorICogVGhlIGRlZmF1bHQgc2hhcmluZyBtb2RlIGlzIHtAbGluayAjQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUR9LgogICogVGhlIGRhdGEgZm9ybWF0LCBzYW1wbGVzUGVyRnJhbWVzIGFuZCBzYW1wbGVSYXRlIGFyZSB1bnNwZWNpZmllZCBhbmQgd2lsbCBiZQogICogY2hvc2VuIGJ5IHRoZSBkZXZpY2Ugd2hlbiBpdCBpcyBvcGVuZWQuCiAgKgogICogQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUoKSBtdXN0IGJlIGNhbGxlZCB3aGVuIHlvdSBhcmUgZG9uZSB1c2luZyB0aGUgYnVpbGRlci4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI2LgogICovCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcihBQXVkaW9TdHJlYW1CdWlsZGVyKiogYnVpbGRlcikKICAgICAgICAgX19JTlRST0RVQ0VEX0lOKDI2KTsKQEAgLTQ1OSwxMSArNTE2LDEzIEBACiAgKiBSZXF1ZXN0IGFuIGF1ZGlvIGRldmljZSBpZGVudGlmaWVkIGRldmljZSB1c2luZyBhbiBJRC4KICAqIE9uIEFuZHJvaWQsIGZvciBleGFtcGxlLCB0aGUgSUQgY291bGQgYmUgb2J0YWluZWQgZnJvbSB0aGUgSmF2YSBBdWRpb01hbmFnZXIuCiAgKgotICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyBBQVVESU9fVU5TUEVDSUZJRUQsCisgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIHtAbGluayAjQUFVRElPX1VOU1BFQ0lGSUVEfSwKICAqIGluIHdoaWNoIGNhc2UgdGhlIHByaW1hcnkgZGV2aWNlIHdpbGwgYmUgdXNlZC4KICAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI2LgorICoKICAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCi0gKiBAcGFyYW0gZGV2aWNlSWQgZGV2aWNlIGlkZW50aWZpZXIgb3IgQUFVRElPX1VOU1BFQ0lGSUVECisgKiBAcGFyYW0gZGV2aWNlSWQgZGV2aWNlIGlkZW50aWZpZXIgb3Ige0BsaW5rICNBQVVESU9fVU5TUEVDSUZJRUR9CiAgKi8KIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERldmljZUlkKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGRldmljZUlkKSBfX0lOVFJPRFVDRURfSU4oMjYpOwpAQCAtNDcxLDcgKzUzMCw3IEBACiAvKioKICAqIFJlcXVlc3QgYSBzYW1wbGUgcmF0ZSBpbiBIZXJ0ei4KICAqCi0gKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIEFBVURJT19VTlNQRUNJRklFRC4KKyAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMge0BsaW5rICNBQVVESU9fVU5TUEVDSUZJRUR9LgogICogQW4gb3B0aW1hbCB2YWx1ZSB3aWxsIHRoZW4gYmUgY2hvc2VuIHdoZW4gdGhlIHN0cmVhbSBpcyBvcGVuZWQuCiAgKiBBZnRlciBvcGVuaW5nIGEgc3RyZWFtIHdpdGggYW4gdW5zcGVjaWZpZWQgdmFsdWUsIHRoZSBhcHBsaWNhdGlvbiBtdXN0CiAgKiBxdWVyeSBmb3IgdGhlIGFjdHVhbCB2YWx1ZSwgd2hpY2ggbWF5IHZhcnkgYnkgZGV2aWNlLgpAQCAtNDc5LDYgKzUzOCw4IEBACiAgKiBJZiBhbiBleGFjdCB2YWx1ZSBpcyBzcGVjaWZpZWQgdGhlbiBhbiBvcGVuZWQgc3RyZWFtIHdpbGwgdXNlIHRoYXQgdmFsdWUuCiAgKiBJZiBhIHN0cmVhbSBjYW5ub3QgYmUgb3BlbmVkIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSB0aGVuIHRoZSBvcGVuIHdpbGwgZmFpbC4KICAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI2LgorICoKICAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCiAgKiBAcGFyYW0gc2FtcGxlUmF0ZSBmcmFtZXMgcGVyIHNlY29uZC4gQ29tbW9uIHJhdGVzIGluY2x1ZGUgNDQxMDAgYW5kIDQ4MDAwIEh6LgogICovCkBAIC00ODgsNyArNTQ5LDcgQEAKIC8qKgogICogUmVxdWVzdCBhIG51bWJlciBvZiBjaGFubmVscyBmb3IgdGhlIHN0cmVhbS4KICAqCi0gKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIEFBVURJT19VTlNQRUNJRklFRC4KKyAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMge0BsaW5rICNBQVVESU9fVU5TUEVDSUZJRUR9LgogICogQW4gb3B0aW1hbCB2YWx1ZSB3aWxsIHRoZW4gYmUgY2hvc2VuIHdoZW4gdGhlIHN0cmVhbSBpcyBvcGVuZWQuCiAgKiBBZnRlciBvcGVuaW5nIGEgc3RyZWFtIHdpdGggYW4gdW5zcGVjaWZpZWQgdmFsdWUsIHRoZSBhcHBsaWNhdGlvbiBtdXN0CiAgKiBxdWVyeSBmb3IgdGhlIGFjdHVhbCB2YWx1ZSwgd2hpY2ggbWF5IHZhcnkgYnkgZGV2aWNlLgpAQCAtNDk2LDYgKzU1Nyw4IEBACiAgKiBJZiBhbiBleGFjdCB2YWx1ZSBpcyBzcGVjaWZpZWQgdGhlbiBhbiBvcGVuZWQgc3RyZWFtIHdpbGwgdXNlIHRoYXQgdmFsdWUuCiAgKiBJZiBhIHN0cmVhbSBjYW5ub3QgYmUgb3BlbmVkIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSB0aGVuIHRoZSBvcGVuIHdpbGwgZmFpbC4KICAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI2LgorICoKICAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCiAgKiBAcGFyYW0gY2hhbm5lbENvdW50IE51bWJlciBvZiBjaGFubmVscyBkZXNpcmVkLgogICovCkBAIC01MDUsNiArNTY4LDggQEAKIC8qKgogICogSWRlbnRpY2FsIHRvIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbENvdW50KCkuCiAgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KKyAqCiAgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQogICogQHBhcmFtIHNhbXBsZXNQZXJGcmFtZSBOdW1iZXIgb2Ygc2FtcGxlcyBpbiBhIGZyYW1lLgogICovCkBAIC01MTIsOSArNTc3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCi0gKiBSZXF1ZXN0IGEgc2FtcGxlIGRhdGEgZm9ybWF0LCBmb3IgZXhhbXBsZSBBQVVESU9fRk9STUFUX1BDTV9JMTYuCisgKiBSZXF1ZXN0IGEgc2FtcGxlIGRhdGEgZm9ybWF0LCBmb3IgZXhhbXBsZSB7QGxpbmsgI0FBVURJT19GT1JNQVRfUENNX0kxNn0uCiAgKgotICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyBBQVVESU9fVU5TUEVDSUZJRUQuCisgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIHtAbGluayAjQUFVRElPX1VOU1BFQ0lGSUVEfS4KICAqIEFuIG9wdGltYWwgdmFsdWUgd2lsbCB0aGVuIGJlIGNob3NlbiB3aGVuIHRoZSBzdHJlYW0gaXMgb3BlbmVkLgogICogQWZ0ZXIgb3BlbmluZyBhIHN0cmVhbSB3aXRoIGFuIHVuc3BlY2lmaWVkIHZhbHVlLCB0aGUgYXBwbGljYXRpb24gbXVzdAogICogcXVlcnkgZm9yIHRoZSBhY3R1YWwgdmFsdWUsIHdoaWNoIG1heSB2YXJ5IGJ5IGRldmljZS4KQEAgLTUyMiw4ICs1ODcsMTEgQEAKICAqIElmIGFuIGV4YWN0IHZhbHVlIGlzIHNwZWNpZmllZCB0aGVuIGFuIG9wZW5lZCBzdHJlYW0gd2lsbCB1c2UgdGhhdCB2YWx1ZS4KICAqIElmIGEgc3RyZWFtIGNhbm5vdCBiZSBvcGVuZWQgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlIHRoZW4gdGhlIG9wZW4gd2lsbCBmYWlsLgogICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjYuCisgKgogICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKLSAqIEBwYXJhbSBmb3JtYXQgY29tbW9uIGZvcm1hdHMgYXJlIEFBVURJT19GT1JNQVRfUENNX0ZMT0FUIGFuZCBBQVVESU9fRk9STUFUX1BDTV9JMTYuCisgKiBAcGFyYW0gZm9ybWF0IGNvbW1vbiBmb3JtYXRzIGFyZSB7QGxpbmsgI0FBVURJT19GT1JNQVRfUENNX0ZMT0FUfSBhbmQKKyAqICAgICAgICAgICAgICAge0BsaW5rICNBQVVESU9fRk9STUFUX1BDTV9JMTZ9LgogICovCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGb3JtYXQoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBfX0lOVFJPRFVDRURfSU4oMjYpOwpAQCAtNTMxLDEzICs1OTksMTUgQEAKIC8qKgogICogUmVxdWVzdCBhIG1vZGUgZm9yIHNoYXJpbmcgdGhlIGRldmljZS4KICAqCi0gKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVELgorICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyB7QGxpbmsgI0FBVURJT19TSEFSSU5HX01PREVfU0hBUkVEfS4KICAqCiAgKiBUaGUgcmVxdWVzdGVkIHNoYXJpbmcgbW9kZSBtYXkgbm90IGJlIGF2YWlsYWJsZS4KICAqIFRoZSBhcHBsaWNhdGlvbiBjYW4gcXVlcnkgZm9yIHRoZSBhY3R1YWwgbW9kZSBhZnRlciB0aGUgc3RyZWFtIGlzIG9wZW5lZC4KICAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI2LgorICoKICAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCi0gKiBAcGFyYW0gc2hhcmluZ01vZGUgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQgb3IgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkUKKyAqIEBwYXJhbSBzaGFyaW5nTW9kZSB7QGxpbmsgI0FBVURJT19TSEFSSU5HX01PREVfU0hBUkVEfSBvciB7QGxpbmsgI0FBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFfQogICovCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTaGFyaW5nTW9kZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAogICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUpIF9fSU5UUk9EVUNFRF9JTigyNik7CkBAIC01NDUsMTAgKzYxNSwxMiBAQAogLyoqCiAgKiBSZXF1ZXN0IHRoZSBkaXJlY3Rpb24gZm9yIGEgc3RyZWFtLgogICoKLSAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQuCisgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIHtAbGluayAjQUFVRElPX0RJUkVDVElPTl9PVVRQVVR9LgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjYuCiAgKgogICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKLSAqIEBwYXJhbSBkaXJlY3Rpb24gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQgb3IgQUFVRElPX0RJUkVDVElPTl9JTlBVVAorICogQHBhcmFtIGRpcmVjdGlvbiB7QGxpbmsgI0FBVURJT19ESVJFQ1RJT05fT1VUUFVUfSBvciB7QGxpbmsgI0FBVURJT19ESVJFQ1RJT05fSU5QVVR9CiAgKi8KIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERpcmVjdGlvbihBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAogICAgICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSBfX0lOVFJPRFVDRURfSU4oMjYpOwpAQCAtNTU3LDEwICs2MjksMTIgQEAKICAqIFNldCB0aGUgcmVxdWVzdGVkIGJ1ZmZlciBjYXBhY2l0eSBpbiBmcmFtZXMuCiAgKiBUaGUgZmluYWwgQUF1ZGlvU3RyZWFtIGNhcGFjaXR5IG1heSBkaWZmZXIsIGJ1dCB3aWxsIHByb2JhYmx5IGJlIGF0IGxlYXN0IHRoaXMgYmlnLgogICoKLSAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMgQUFVRElPX1VOU1BFQ0lGSUVELgorICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyB7QGxpbmsgI0FBVURJT19VTlNQRUNJRklFRH0uCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KICAqCiAgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQotICogQHBhcmFtIG51bUZyYW1lcyB0aGUgZGVzaXJlZCBidWZmZXIgY2FwYWNpdHkgaW4gZnJhbWVzIG9yIEFBVURJT19VTlNQRUNJRklFRAorICogQHBhcmFtIG51bUZyYW1lcyB0aGUgZGVzaXJlZCBidWZmZXIgY2FwYWNpdHkgaW4gZnJhbWVzIG9yIHtAbGluayAjQUFVRElPX1VOU1BFQ0lGSUVEfQogICovCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCiAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzKSBfX0lOVFJPRFVDRURfSU4oMjYpOwpAQCAtNTY4LDE2ICs2NDIsMTkgQEAKIC8qKgogICogU2V0IHRoZSByZXF1ZXN0ZWQgcGVyZm9ybWFuY2UgbW9kZS4KICAqCi0gKiBTdXBwb3J0ZWQgbW9kZXMgYXJlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkUsIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX1BPV0VSX1NBVklORwotICogYW5kIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLgorICogU3VwcG9ydGVkIG1vZGVzIGFyZSB7QGxpbmsgI0FBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkV9LAorICoge0BsaW5rICNBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkd9ICogYW5kIHtAbGluayAjQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1l9LgogICoKLSAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORS4KKyAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMge0BsaW5rICNBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FfS4KICAqCiAgKiBZb3UgbWF5IG5vdCBnZXQgdGhlIG1vZGUgeW91IHJlcXVlc3RlZC4KLSAqIFlvdSBjYW4gY2FsbCBBQXVkaW9TdHJlYW1fZ2V0UGVyZm9ybWFuY2VNb2RlKCkgdG8gZmluZCBvdXQgdGhlIGZpbmFsIG1vZGUgZm9yIHRoZSBzdHJlYW0uCisgKiBZb3UgY2FuIGNhbGwgQUF1ZGlvU3RyZWFtX2dldFBlcmZvcm1hbmNlTW9kZSgpCisgKiB0byBmaW5kIG91dCB0aGUgZmluYWwgbW9kZSBmb3IgdGhlIHN0cmVhbS4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI2LgogICoKICAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCi0gKiBAcGFyYW0gbW9kZSB0aGUgZGVzaXJlZCBwZXJmb3JtYW5jZSBtb2RlLCBlZy4gQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kKKyAqIEBwYXJhbSBtb2RlIHRoZSBkZXNpcmVkIHBlcmZvcm1hbmNlIG1vZGUsIGVnLiB7QGxpbmsgI0FBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZfQogICovCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQZXJmb3JtYW5jZU1vZGUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKICAgICAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBtb2RlKSBfX0lOVFJPRFVDRURfSU4oMjYpOwpAQCAtNTg5LDEyICs2NjYsMTIgQEAKICAqIGJlaGF2aW9yIG9mIHRoZSBzdHJlYW0uCiAgKiBUaGlzIGNvdWxkLCBmb3IgZXhhbXBsZSwgYWZmZWN0IGhvdyB2b2x1bWUgYW5kIGZvY3VzIGlzIGhhbmRsZWQgZm9yIHRoZSBzdHJlYW0uCiAgKgotICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyBBQVVESU9fVVNBR0VfTUVESUEuCisgKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIHtAbGluayAjQUFVRElPX1VTQUdFX01FRElBfS4KICAqCi0gKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI4LgogICoKICAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCi0gKiBAcGFyYW0gdXNhZ2UgdGhlIGRlc2lyZWQgdXNhZ2UsIGVnLiBBQVVESU9fVVNBR0VfR0FNRQorICogQHBhcmFtIHVzYWdlIHRoZSBkZXNpcmVkIHVzYWdlLCBlZy4ge0BsaW5rICNBQVVESU9fVVNBR0VfR0FNRX0KICAqLwogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0VXNhZ2UoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKICAgICAgICAgYWF1ZGlvX3VzYWdlX3QgdXNhZ2UpIF9fSU5UUk9EVUNFRF9JTigyOCk7CkBAIC02MDYsMTIgKzY4MywxMiBAQAogICogYmVoYXZpb3Igb2YgdGhlIHN0cmVhbS4KICAqIFRoaXMgY291bGQsIGZvciBleGFtcGxlLCBhZmZlY3Qgd2hldGhlciBhIHN0cmVhbSBpcyBwYXVzZWQgd2hlbiBhIG5vdGlmaWNhdGlvbiBvY2N1cnMuCiAgKgotICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyBBQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLgorICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyB7QGxpbmsgI0FBVURJT19DT05URU5UX1RZUEVfTVVTSUN9LgogICoKLSAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOC4KKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjguCiAgKgogICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKLSAqIEBwYXJhbSBjb250ZW50VHlwZSB0aGUgdHlwZSBvZiBhdWRpbyBkYXRhLCBlZy4gQUFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0gKKyAqIEBwYXJhbSBjb250ZW50VHlwZSB0aGUgdHlwZSBvZiBhdWRpbyBkYXRhLCBlZy4ge0BsaW5rICNBQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSH0KICAqLwogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q29udGVudFR5cGUoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKICAgICAgICAgYWF1ZGlvX2NvbnRlbnRfdHlwZV90IGNvbnRlbnRUeXBlKSBfX0lOVFJPRFVDRURfSU4oMjgpOwpAQCAtNjI0LDExICs3MDEsMTEgQEAKICAqIFRoaXMgY291bGQsIGZvciBleGFtcGxlLCBhZmZlY3Qgd2hpY2ggbWljcm9waG9uZXMgYXJlIHVzZWQgYW5kIGhvdyB0aGUKICAqIHJlY29yZGVkIGRhdGEgaXMgcHJvY2Vzc2VkLgogICoKLSAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTi4KKyAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMge0BsaW5rICNBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1JFQ09HTklUSU9OfS4KICAqIFRoYXQgaXMgYmVjYXVzZSBWT0lDRV9SRUNPR05JVElPTiBpcyB0aGUgcHJlc2V0IHdpdGggdGhlIGxvd2VzdCBsYXRlbmN5CiAgKiBvbiBtYW55IHBsYXRmb3Jtcy4KICAqCi0gKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI4LgogICoKICAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCiAgKiBAcGFyYW0gaW5wdXRQcmVzZXQgdGhlIGRlc2lyZWQgY29uZmlndXJhdGlvbiBmb3IgcmVjb3JkaW5nCkBAIC02MzYsMTQgKzcxMywzMCBAQAogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0SW5wdXRQcmVzZXQoQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKICAgICAgICAgYWF1ZGlvX2lucHV0X3ByZXNldF90IGlucHV0UHJlc2V0KSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCisvKioKKyAqIFNwZWNpZnkgd2hldGhlciB0aGlzIHN0cmVhbSBhdWRpbyBtYXkgb3IgbWF5IG5vdCBiZSBjYXB0dXJlZCBieSBvdGhlciBhcHBzIG9yIHRoZSBzeXN0ZW0uCisgKgorICogVGhlIGRlZmF1bHQgaXMge0BsaW5rICNBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9BTEx9LgorICoKKyAqIE5vdGUgdGhhdCBhbiBhcHBsaWNhdGlvbiBjYW4gYWxzbyBzZXQgaXRzIGdsb2JhbCBwb2xpY3ksIGluIHdoaWNoIGNhc2UgdGhlIG1vc3QgcmVzdHJpY3RpdmUKKyAqIHBvbGljeSBpcyBhbHdheXMgYXBwbGllZC4gU2VlIHtAbGluayBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlcyNzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeShpbnQpfQorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjkuCisgKgorICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKKyAqIEBwYXJhbSBpbnB1dFByZXNldCB0aGUgZGVzaXJlZCBsZXZlbCBvZiBvcHQtb3V0IGZyb20gYmVpbmcgY2FwdHVyZWQuCisgKi8KK0FBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEFsbG93ZWRDYXB0dXJlUG9saWN5KEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCisgICAgICAgIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgY2FwdHVyZVBvbGljeSkgX19JTlRST0RVQ0VEX0lOKDI5KTsKKwogLyoqIFNldCB0aGUgcmVxdWVzdGVkIHNlc3Npb24gSUQuCiAgKgogICogVGhlIHNlc3Npb24gSUQgY2FuIGJlIHVzZWQgdG8gYXNzb2NpYXRlIGEgc3RyZWFtIHdpdGggZWZmZWN0cyBwcm9jZXNzb3JzLgogICogVGhlIGVmZmVjdHMgYXJlIGNvbnRyb2xsZWQgdXNpbmcgdGhlIEFuZHJvaWQgQXVkaW9FZmZlY3QgSmF2YSBBUEkuCiAgKgotICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyBBQVVESU9fU0VTU0lPTl9JRF9OT05FLgorICogVGhlIGRlZmF1bHQsIGlmIHlvdSBkbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uLCBpcyB7QGxpbmsgI0FBVURJT19TRVNTSU9OX0lEX05PTkV9LgogICoKLSAqIElmIHNldCB0byBBQVVESU9fU0VTU0lPTl9JRF9BTExPQ0FURSB0aGVuIGEgc2Vzc2lvbiBJRCB3aWxsIGJlIGFsbG9jYXRlZAorICogSWYgc2V0IHRvIHtAbGluayAjQUFVRElPX1NFU1NJT05fSURfQUxMT0NBVEV9IHRoZW4gYSBzZXNzaW9uIElEIHdpbGwgYmUgYWxsb2NhdGVkCiAgKiB3aGVuIHRoZSBzdHJlYW0gaXMgb3BlbmVkLgogICoKICAqIFRoZSBhbGxvY2F0ZWQgc2Vzc2lvbiBJRCBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZyBBQXVkaW9TdHJlYW1fZ2V0U2Vzc2lvbklkKCkKQEAgLTY1OCwxMCArNzUxLDEwIEBACiAgKgogICogQWxsb2NhdGVkIHNlc3Npb24gSURzIHdpbGwgYWx3YXlzIGJlIHBvc2l0aXZlIGFuZCBub256ZXJvLgogICoKLSAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOC4KKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjguCiAgKgogICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKLSAqIEBwYXJhbSBzZXNzaW9uSWQgYW4gYWxsb2NhdGVkIHNlc3Npb25JRCBvciBBQVVESU9fU0VTU0lPTl9JRF9BTExPQ0FURQorICogQHBhcmFtIHNlc3Npb25JZCBhbiBhbGxvY2F0ZWQgc2Vzc2lvbklEIG9yIHtAbGluayAjQUFVRElPX1NFU1NJT05fSURfQUxMT0NBVEV9CiAgKi8KIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNlc3Npb25JZChBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAogICAgICAgICBhYXVkaW9fc2Vzc2lvbl9pZF90IHNlc3Npb25JZCkgX19JTlRST0RVQ0VEX0lOKDI4KTsKQEAgLTc0NCwxOCArODM3LDIxIEBACiAgKgogICogTm90ZSB0aGF0IHdoZW4gdXNpbmcgdGhpcyBjYWxsYmFjaywgdGhlIGF1ZGlvIGRhdGEgd2lsbCBiZSBwYXNzZWQgaW4gb3Igb3V0CiAgKiBvZiB0aGUgZnVuY3Rpb24gYXMgYW4gYXJndW1lbnQuCi0gKiBTbyB5b3UgY2Fubm90IGNhbGwgQUF1ZGlvU3RyZWFtX3dyaXRlKCkgb3IgQUF1ZGlvU3RyZWFtX3JlYWQoKSBvbiB0aGUgc2FtZSBzdHJlYW0KLSAqIHRoYXQgaGFzIGFuIGFjdGl2ZSBkYXRhIGNhbGxiYWNrLgorICogU28geW91IGNhbm5vdCBjYWxsIEFBdWRpb1N0cmVhbV93cml0ZSgpIG9yIEFBdWRpb1N0cmVhbV9yZWFkKCkKKyAqIG9uIHRoZSBzYW1lIHN0cmVhbSB0aGF0IGhhcyBhbiBhY3RpdmUgZGF0YSBjYWxsYmFjay4KICAqCi0gKiBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gd2lsbCBzdGFydCBiZWluZyBjYWxsZWQgYWZ0ZXIgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydCgpIGlzIGNhbGxlZC4KKyAqIFRoZSBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIHN0YXJ0IGJlaW5nIGNhbGxlZCBhZnRlciBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KCkKKyAqIGlzIGNhbGxlZC4KICAqIEl0IHdpbGwgc3RvcCBiZWluZyBjYWxsZWQgYWZ0ZXIgQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZSgpIG9yCiAgKiBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoKSBpcyBjYWxsZWQuCiAgKgogICogVGhpcyBjYWxsYmFjayBmdW5jdGlvbiB3aWxsIGJlIGNhbGxlZCBvbiBhIHJlYWwtdGltZSB0aHJlYWQgb3duZWQgYnkgQUF1ZGlvLiBTZWUKLSAqIHtAbGluayBBQXVkaW9TdHJlYW1fZGF0YUNhbGxiYWNrfSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAqIHtAbGluayAjQUF1ZGlvU3RyZWFtX2RhdGFDYWxsYmFja30gZm9yIG1vcmUgaW5mb3JtYXRpb24uCiAgKgogICogTm90ZSB0aGF0IHRoZSBBQXVkaW8gY2FsbGJhY2tzIHdpbGwgbmV2ZXIgYmUgY2FsbGVkIHNpbXVsdGFuZW91c2x5IGZyb20gbXVsdGlwbGUgdGhyZWFkcy4KICAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI2LgorICoKICAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCiAgKiBAcGFyYW0gY2FsbGJhY2sgcG9pbnRlciB0byBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBwcm9jZXNzIGF1ZGlvIGRhdGEuCiAgKiBAcGFyYW0gdXNlckRhdGEgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbiBkYXRhIHN0cnVjdHVyZSB0aGF0IHdpbGwgYmUgcGFzc2VkCkBAIC03NjYsOSArODYyLDkgQEAKIAogLyoqCiAgKiBTZXQgdGhlIHJlcXVlc3RlZCBkYXRhIGNhbGxiYWNrIGJ1ZmZlciBzaXplIGluIGZyYW1lcy4KLSAqIFNlZSB7QGxpbmsgQUF1ZGlvU3RyZWFtX2RhdGFDYWxsYmFja30uCisgKiBTZWUge0BsaW5rICNBQXVkaW9TdHJlYW1fZGF0YUNhbGxiYWNrfS4KICAqCi0gKiBUaGUgZGVmYXVsdCwgaWYgeW91IGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24sIGlzIEFBVURJT19VTlNQRUNJRklFRC4KKyAqIFRoZSBkZWZhdWx0LCBpZiB5b3UgZG8gbm90IGNhbGwgdGhpcyBmdW5jdGlvbiwgaXMge0BsaW5rICNBQVVESU9fVU5TUEVDSUZJRUR9LgogICoKICAqIEZvciB0aGUgbG93ZXN0IHBvc3NpYmxlIGxhdGVuY3ksIGRvIG5vdCBjYWxsIHRoaXMgZnVuY3Rpb24uIEFBdWRpbyB3aWxsIHRoZW4KICAqIGNhbGwgdGhlIGRhdGFQcm9jIGNhbGxiYWNrIGZ1bmN0aW9uIHdpdGggd2hhdGV2ZXIgc2l6ZSBpcyBvcHRpbWFsLgpAQCAtNzg0LDggKzg4MCwxMCBAQAogICogSWYgeW91IGRvIGNhbGwgdGhpcyBmdW5jdGlvbiB0aGVuIHRoZSByZXF1ZXN0ZWQgc2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuCiAgKiBoYWxmIHRoZSBidWZmZXIgY2FwYWNpdHksIHRvIGFsbG93IGRvdWJsZSBidWZmZXJpbmcuCiAgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KKyAqCiAgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQotICogQHBhcmFtIG51bUZyYW1lcyB0aGUgZGVzaXJlZCBidWZmZXIgc2l6ZSBpbiBmcmFtZXMgb3IgQUFVRElPX1VOU1BFQ0lGSUVECisgKiBAcGFyYW0gbnVtRnJhbWVzIHRoZSBkZXNpcmVkIGJ1ZmZlciBzaXplIGluIGZyYW1lcyBvciB7QGxpbmsgI0FBVURJT19VTlNQRUNJRklFRH0KICAqLwogQUFVRElPX0FQSSB2b2lkIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKEFBdWRpb1N0cmVhbUJ1aWxkZXIqIGJ1aWxkZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMpIF9fSU5UUk9EVUNFRF9JTigyNik7CkBAIC04MzUsNiArOTMzLDggQEAKICAqCiAgKiBOb3RlIHRoYXQgdGhlIEFBdWRpbyBjYWxsYmFja3Mgd2lsbCBuZXZlciBiZSBjYWxsZWQgc2ltdWx0YW5lb3VzbHkgZnJvbSBtdWx0aXBsZSB0aHJlYWRzLgogICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjYuCisgKgogICogQHBhcmFtIGJ1aWxkZXIgcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyKCkKICAqIEBwYXJhbSBjYWxsYmFjayBwb2ludGVyIHRvIGEgZnVuY3Rpb24gdGhhdCB3aWxsIGJlIGNhbGxlZCBpZiBhbiBlcnJvciBvY2N1cnMuCiAgKiBAcGFyYW0gdXNlckRhdGEgcG9pbnRlciB0byBhbiBhcHBsaWNhdGlvbiBkYXRhIHN0cnVjdHVyZSB0aGF0IHdpbGwgYmUgcGFzc2VkCkBAIC04NDYsMTIgKzk0NiwxNCBAQAogLyoqCiAgKiBPcGVuIGEgc3RyZWFtIGJhc2VkIG9uIHRoZSBvcHRpb25zIGluIHRoZSBTdHJlYW1CdWlsZGVyLgogICoKLSAqIEFBdWRpb1N0cmVhbV9jbG9zZSBtdXN0IGJlIGNhbGxlZCB3aGVuIGZpbmlzaGVkIHdpdGggdGhlIHN0cmVhbSB0byByZWNvdmVyCisgKiBBQXVkaW9TdHJlYW1fY2xvc2UoKSBtdXN0IGJlIGNhbGxlZCB3aGVuIGZpbmlzaGVkIHdpdGggdGhlIHN0cmVhbSB0byByZWNvdmVyCiAgKiB0aGUgbWVtb3J5IGFuZCB0byBmcmVlIHRoZSBhc3NvY2lhdGVkIHJlc291cmNlcy4KICAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI2LgorICoKICAqIEBwYXJhbSBidWlsZGVyIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigpCiAgKiBAcGFyYW0gc3RyZWFtIHBvaW50ZXIgdG8gYSB2YXJpYWJsZSB0byByZWNlaXZlIHRoZSBuZXcgc3RyZWFtIHJlZmVyZW5jZQotICogQHJldHVybiBBQVVESU9fT0sgb3IgYSBuZWdhdGl2ZSBlcnJvci4KKyAqIEByZXR1cm4ge0BsaW5rICNBQVVESU9fT0t9IG9yIGEgbmVnYXRpdmUgZXJyb3IuCiAgKi8KIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oQUF1ZGlvU3RyZWFtQnVpbGRlciogYnVpbGRlciwKICAgICAgICAgQUF1ZGlvU3RyZWFtKiogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjYpOwpAQCAtODU5LDggKzk2MSwxMCBAQAogLyoqCiAgKiBEZWxldGUgdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggdGhlIFN0cmVhbUJ1aWxkZXIuCiAgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KKyAqCiAgKiBAcGFyYW0gYnVpbGRlciByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoKQotICogQHJldHVybiBBQVVESU9fT0sgb3IgYSBuZWdhdGl2ZSBlcnJvci4KKyAqIEByZXR1cm4ge0BsaW5rICNBQVVESU9fT0t9IG9yIGEgbmVnYXRpdmUgZXJyb3IuCiAgKi8KIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyKQogICAgIF9fSU5UUk9EVUNFRF9JTigyNik7CkBAIC04NzIsOCArOTc2LDEwIEBACiAvKioKICAqIEZyZWUgdGhlIHJlc291cmNlcyBhc3NvY2lhdGVkIHdpdGggYSBzdHJlYW0gY3JlYXRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjYuCisgKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKLSAqIEByZXR1cm4gQUFVRElPX09LIG9yIGEgbmVnYXRpdmUgZXJyb3IuCisgKiBAcmV0dXJuIHtAbGluayAjQUFVRElPX09LfSBvciBhIG5lZ2F0aXZlIGVycm9yLgogICovCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX2Nsb3NlKEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCkBAIC04ODEsMjQgKzk4NywzMCBAQAogICogQXN5bmNocm9ub3VzbHkgcmVxdWVzdCB0byBzdGFydCBwbGF5aW5nIHRoZSBzdHJlYW0uIEZvciBvdXRwdXQgc3RyZWFtcywgb25lIHNob3VsZAogICogd3JpdGUgdG8gdGhlIHN0cmVhbSB0byBmaWxsIHRoZSBidWZmZXIgYmVmb3JlIHN0YXJ0aW5nLgogICogT3RoZXJ3aXNlIGl0IHdpbGwgdW5kZXJmbG93LgotICogQWZ0ZXIgdGhpcyBjYWxsIHRoZSBzdGF0ZSB3aWxsIGJlIGluIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkcgb3IgQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVELgorICogQWZ0ZXIgdGhpcyBjYWxsIHRoZSBzdGF0ZSB3aWxsIGJlIGluIHtAbGluayAjQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElOR30gb3IKKyAqIHtAbGluayAjQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEfS4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI2LgogICoKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCi0gKiBAcmV0dXJuIEFBVURJT19PSyBvciBhIG5lZ2F0aXZlIGVycm9yLgorICogQHJldHVybiB7QGxpbmsgI0FBVURJT19PS30gb3IgYSBuZWdhdGl2ZSBlcnJvci4KICAqLwogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgogICogQXN5bmNocm9ub3VzIHJlcXVlc3QgZm9yIHRoZSBzdHJlYW0gdG8gcGF1c2UuCiAgKiBQYXVzaW5nIGEgc3RyZWFtIHdpbGwgZnJlZXplIHRoZSBkYXRhIGZsb3cgYnV0IG5vdCBmbHVzaCBhbnkgYnVmZmVycy4KLSAqIFVzZSBBQXVkaW9TdHJlYW1fU3RhcnQoKSB0byByZXN1bWUgcGxheWJhY2sgYWZ0ZXIgYSBwYXVzZS4KLSAqIEFmdGVyIHRoaXMgY2FsbCB0aGUgc3RhdGUgd2lsbCBiZSBpbiBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNJTkcgb3IgQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTRUQuCisgKiBVc2UgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydCgpIHRvIHJlc3VtZSBwbGF5YmFjayBhZnRlciBhIHBhdXNlLgorICogQWZ0ZXIgdGhpcyBjYWxsIHRoZSBzdGF0ZSB3aWxsIGJlIGluIHtAbGluayAjQUFVRElPX1NUUkVBTV9TVEFURV9QQVVTSU5HfSBvcgorICoge0BsaW5rICNBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNFRH0uCiAgKgotICogVGhpcyB3aWxsIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRCBmb3IgaW5wdXQgc3RyZWFtcy4KKyAqIFRoaXMgd2lsbCByZXR1cm4ge0BsaW5rICNBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRH0gZm9yIGlucHV0IHN0cmVhbXMuCiAgKiBGb3IgaW5wdXQgc3RyZWFtcyB1c2UgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKCkuCiAgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KKyAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQotICogQHJldHVybiBBQVVESU9fT0sgb3IgYSBuZWdhdGl2ZSBlcnJvci4KKyAqIEByZXR1cm4ge0BsaW5rICNBQVVESU9fT0t9IG9yIGEgbmVnYXRpdmUgZXJyb3IuCiAgKi8KIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCkBAIC05MDcsMzIgKzEwMTksNDAgQEAKICAqIEZsdXNoaW5nIHdpbGwgZGlzY2FyZCBhbnkgcGVuZGluZyBkYXRhLgogICogVGhpcyBjYWxsIG9ubHkgd29ya3MgaWYgdGhlIHN0cmVhbSBpcyBwYXVzaW5nIG9yIHBhdXNlZC4gVE9ETyByZXZpZXcKICAqIEZyYW1lIGNvdW50ZXJzIGFyZSBub3QgcmVzZXQgYnkgYSBmbHVzaC4gVGhleSBtYXkgYmUgYWR2YW5jZWQuCi0gKiBBZnRlciB0aGlzIGNhbGwgdGhlIHN0YXRlIHdpbGwgYmUgaW4gQUFVRElPX1NUUkVBTV9TVEFURV9GTFVTSElORyBvciBBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNIRUQuCisgKiBBZnRlciB0aGlzIGNhbGwgdGhlIHN0YXRlIHdpbGwgYmUgaW4ge0BsaW5rICNBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNISU5HfSBvcgorICoge0BsaW5rICNBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNIRUR9LgogICoKLSAqIFRoaXMgd2lsbCByZXR1cm4gQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQgZm9yIGlucHV0IHN0cmVhbXMuCisgKiBUaGlzIHdpbGwgcmV0dXJuIHtAbGluayAjQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUR9IGZvciBpbnB1dCBzdHJlYW1zLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjYuCiAgKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKLSAqIEByZXR1cm4gQUFVRElPX09LIG9yIGEgbmVnYXRpdmUgZXJyb3IuCisgKiBAcmV0dXJuIHtAbGluayAjQUFVRElPX09LfSBvciBhIG5lZ2F0aXZlIGVycm9yLgogICovCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaChBQXVkaW9TdHJlYW0qIHN0cmVhbSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCiAgKiBBc3luY2hyb25vdXMgcmVxdWVzdCBmb3IgdGhlIHN0cmVhbSB0byBzdG9wLgogICogVGhlIHN0cmVhbSB3aWxsIHN0b3AgYWZ0ZXIgYWxsIG9mIHRoZSBkYXRhIGN1cnJlbnRseSBidWZmZXJlZCBoYXMgYmVlbiBwbGF5ZWQuCi0gKiBBZnRlciB0aGlzIGNhbGwgdGhlIHN0YXRlIHdpbGwgYmUgaW4gQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORyBvciBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUQuCisgKiBBZnRlciB0aGlzIGNhbGwgdGhlIHN0YXRlIHdpbGwgYmUgaW4ge0BsaW5rICNBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HfSBvcgorICoge0BsaW5rICNBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQRUR9LgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjYuCiAgKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKLSAqIEByZXR1cm4gQUFVRElPX09LIG9yIGEgbmVnYXRpdmUgZXJyb3IuCisgKiBAcmV0dXJuIHtAbGluayAjQUFVRElPX09LfSBvciBhIG5lZ2F0aXZlIGVycm9yLgogICovCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjYpOwogCiAvKioKLSAqIFF1ZXJ5IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjbGllbnQsIGVnLiBBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNJTkcKKyAqIFF1ZXJ5IHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBjbGllbnQsIGVnLiB7QGxpbmsgI0FBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lOR30KICAqCiAgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgaW1tZWRpYXRlbHkgcmV0dXJuIHRoZSBzdGF0ZSB3aXRob3V0IHVwZGF0aW5nIHRoZSBzdGF0ZS4KICAqIElmIHlvdSB3YW50IHRvIHVwZGF0ZSB0aGUgY2xpZW50IHN0YXRlIGJhc2VkIG9uIHRoZSBzZXJ2ZXIgc3RhdGUgdGhlbgogICogY2FsbCBBQXVkaW9TdHJlYW1fd2FpdEZvclN0YXRlQ2hhbmdlKCkgd2l0aCBjdXJyZW50U3RhdGUKLSAqIHNldCB0byBBQVVESU9fU1RSRUFNX1NUQVRFX1VOS05PV04gYW5kIGEgemVybyB0aW1lb3V0LgorICogc2V0IHRvIHtAbGluayAjQUFVRElPX1NUUkVBTV9TVEFURV9VTktOT1dOfSBhbmQgYSB6ZXJvIHRpbWVvdXQuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KICAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICovCkBAIC05NTQsMTEgKzEwNzQsMTMgQEAKICAqIH0KICAqIDwvY29kZT48L3ByZT4KICAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI2LgorICoKICAqIEBwYXJhbSBzdHJlYW0gQSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKICAqIEBwYXJhbSBpbnB1dFN0YXRlIFRoZSBzdGF0ZSB3ZSB3YW50IHRvIGF2b2lkLgogICogQHBhcmFtIG5leHRTdGF0ZSBQb2ludGVyIHRvIGEgdmFyaWFibGUgdGhhdCB3aWxsIGJlIHNldCB0byB0aGUgbmV3IHN0YXRlLgogICogQHBhcmFtIHRpbWVvdXROYW5vc2Vjb25kcyBNYXhpbXVtIG51bWJlciBvZiBuYW5vc2Vjb25kcyB0byB3YWl0IGZvciBjb21wbGV0aW9uLgotICogQHJldHVybiBBQVVESU9fT0sgb3IgYSBuZWdhdGl2ZSBlcnJvci4KKyAqIEByZXR1cm4ge0BsaW5rICNBQVVESU9fT0t9IG9yIGEgbmVnYXRpdmUgZXJyb3IuCiAgKi8KIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1N0cmVhbV93YWl0Rm9yU3RhdGVDaGFuZ2UoQUF1ZGlvU3RyZWFtKiBzdHJlYW0sCiAgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBpbnB1dFN0YXRlLCBhYXVkaW9fc3RyZWFtX3N0YXRlX3QgKm5leHRTdGF0ZSwKQEAgLTk4Miw2ICsxMTA0LDggQEAKICAqCiAgKiBJZiB0aGUgY2FsbCB0aW1lcyBvdXQgdGhlbiB6ZXJvIG9yIGEgcGFydGlhbCBmcmFtZSBjb3VudCB3aWxsIGJlIHJldHVybmVkLgogICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjYuCisgKgogICogQHBhcmFtIHN0cmVhbSBBIHN0cmVhbSBjcmVhdGVkIHVzaW5nIEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpLgogICogQHBhcmFtIGJ1ZmZlciBUaGUgYWRkcmVzcyBvZiB0aGUgZmlyc3Qgc2FtcGxlLgogICogQHBhcmFtIG51bUZyYW1lcyBOdW1iZXIgb2YgZnJhbWVzIHRvIHJlYWQuIE9ubHkgY29tcGxldGUgZnJhbWVzIHdpbGwgYmUgd3JpdHRlbi4KQEAgLTEwMDUsNiArMTEyOSw4IEBACiAgKgogICogSWYgdGhlIGNhbGwgdGltZXMgb3V0IHRoZW4gemVybyBvciBhIHBhcnRpYWwgZnJhbWUgY291bnQgd2lsbCBiZSByZXR1cm5lZC4KICAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI2LgorICoKICAqIEBwYXJhbSBzdHJlYW0gQSBzdHJlYW0gY3JlYXRlZCB1c2luZyBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKS4KICAqIEBwYXJhbSBidWZmZXIgVGhlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IHNhbXBsZS4KICAqIEBwYXJhbSBudW1GcmFtZXMgTnVtYmVyIG9mIGZyYW1lcyB0byB3cml0ZS4gT25seSBjb21wbGV0ZSBmcmFtZXMgd2lsbCBiZSB3cml0dGVuLgpAQCAtMTAzMCw2ICsxMTU2LDggQEAKICAqIFlvdSBjYW4gY2hlY2sgdGhlIHJldHVybiB2YWx1ZSBvciBjYWxsIEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJTaXplSW5GcmFtZXMoKQogICogdG8gc2VlIHdoYXQgdGhlIGFjdHVhbCBmaW5hbCBzaXplIGlzLgogICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjYuCisgKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKICAqIEBwYXJhbSBudW1GcmFtZXMgcmVxdWVzdGVkIG51bWJlciBvZiBmcmFtZXMgdGhhdCBjYW4gYmUgZmlsbGVkIHdpdGhvdXQgYmxvY2tpbmcKICAqIEByZXR1cm4gYWN0dWFsIGJ1ZmZlciBzaXplIGluIGZyYW1lcyBvciBhIG5lZ2F0aXZlIGVycm9yCkBAIC0xMDQwLDYgKzExNjgsOCBAQAogLyoqCiAgKiBRdWVyeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgZnJhbWVzIHRoYXQgY2FuIGJlIGZpbGxlZCB3aXRob3V0IGJsb2NraW5nLgogICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjYuCisgKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKICAqIEByZXR1cm4gYnVmZmVyIHNpemUgaW4gZnJhbWVzLgogICovCkBAIC0xMDU1LDYgKzExODUsOCBAQAogICogRm9yIHNvbWUgZW5kcG9pbnRzLCB0aGUgYnVyc3Qgc2l6ZSBjYW4gdmFyeSBkeW5hbWljYWxseS4KICAqIEJ1dCB0aGVzZSB0ZW5kIHRvIGJlIGRldmljZXMgd2l0aCBoaWdoIGxhdGVuY3kuCiAgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KKyAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiBidXJzdCBzaXplCiAgKi8KQEAgLTEwNjMsNiArMTE5NSw4IEBACiAvKioKICAqIFF1ZXJ5IG1heGltdW0gYnVmZmVyIGNhcGFjaXR5IGluIGZyYW1lcy4KICAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI2LgorICoKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCiAgKiBAcmV0dXJuICBidWZmZXIgY2FwYWNpdHkgaW4gZnJhbWVzCiAgKi8KQEAgLTEwNzUsMTcgKzEyMDksMTkgQEAKICAqIFRoaXMgY2FsbCBjYW4gYmUgdXNlZCBpZiB0aGUgYXBwbGljYXRpb24gbmVlZHMgdG8ga25vdyB0aGUgdmFsdWUgb2YgbnVtRnJhbWVzIGJlZm9yZQogICogdGhlIHN0cmVhbSBpcyBzdGFydGVkLiBUaGlzIGlzIG5vdCBub3JtYWxseSBuZWNlc3NhcnkuCiAgKgotICogSWYgYSBzcGVjaWZpYyBzaXplIHdhcyByZXF1ZXN0ZWQgYnkgY2FsbGluZyBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZyYW1lc1BlckRhdGFDYWxsYmFjaygpCi0gKiB0aGVuIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBzaXplLgorICogSWYgYSBzcGVjaWZpYyBzaXplIHdhcyByZXF1ZXN0ZWQgYnkgY2FsbGluZworICogQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKSB0aGVuIHRoaXMgd2lsbCBiZSB0aGUgc2FtZSBzaXplLgogICoKICAqIElmIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKCkgd2FzIG5vdCBjYWxsZWQgdGhlbiB0aGlzIHdpbGwKLSAqIHJldHVybiB0aGUgc2l6ZSBjaG9zZW4gYnkgQUF1ZGlvLCBvciBBQVVESU9fVU5TUEVDSUZJRUQuCisgKiByZXR1cm4gdGhlIHNpemUgY2hvc2VuIGJ5IEFBdWRpbywgb3Ige0BsaW5rICNBQVVESU9fVU5TUEVDSUZJRUR9LgogICoKLSAqIEFBVURJT19VTlNQRUNJRklFRCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2FsbGJhY2sgYnVmZmVyIHNpemUgZm9yIHRoaXMgc3RyZWFtCisgKiB7QGxpbmsgI0FBVURJT19VTlNQRUNJRklFRH0gaW5kaWNhdGVzIHRoYXQgdGhlIGNhbGxiYWNrIGJ1ZmZlciBzaXplIGZvciB0aGlzIHN0cmVhbQogICogbWF5IHZhcnkgZnJvbSBvbmUgZGF0YVByb2MgY2FsbGJhY2sgdG8gdGhlIG5leHQuCiAgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KKyAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQotICogQHJldHVybiBjYWxsYmFjayBidWZmZXIgc2l6ZSBpbiBmcmFtZXMgb3IgQUFVRElPX1VOU1BFQ0lGSUVECisgKiBAcmV0dXJuIGNhbGxiYWNrIGJ1ZmZlciBzaXplIGluIGZyYW1lcyBvciB7QGxpbmsgI0FBVURJT19VTlNQRUNJRklFRH0KICAqLwogQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKQEAgLTExMDEsMTIgKzEyMzcsMTYgQEAKICAqIE5vdGUgdGhhdCBzb21lIElOUFVUIGRldmljZXMgbWF5IG5vdCBzdXBwb3J0IHRoaXMgZnVuY3Rpb24uCiAgKiBJbiB0aGF0IGNhc2UgYSAwIHdpbGwgYWx3YXlzIGJlIHJldHVybmVkLgogICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjYuCisgKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKICAqIEByZXR1cm4gdGhlIHVuZGVycnVuIG9yIG92ZXJydW4gY291bnQKICAqLwogQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KKyAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiBhY3R1YWwgc2FtcGxlIHJhdGUKICAqLwpAQCAtMTExNiw2ICsxMjU2LDggQEAKICAqIEEgc3RyZWFtIGhhcyBvbmUgb3IgbW9yZSBjaGFubmVscyBvZiBkYXRhLgogICogQSBmcmFtZSB3aWxsIGNvbnRhaW4gb25lIHNhbXBsZSBmb3IgZWFjaCBjaGFubmVsLgogICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjYuCisgKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKICAqIEByZXR1cm4gYWN0dWFsIG51bWJlciBvZiBjaGFubmVscwogICovCkBAIC0xMTI0LDE4ICsxMjY2LDI0IEBACiAvKioKICAqIElkZW50aWNhbCB0byBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50KCkuCiAgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KKyAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiBhY3R1YWwgbnVtYmVyIG9mIHNhbXBsZXMgZnJhbWUKICAqLwogQUFVRElPX0FQSSBpbnQzMl90IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVzUGVyRnJhbWUoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KKyAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiBhY3R1YWwgZGV2aWNlIElECiAgKi8KIEFBVURJT19BUEkgaW50MzJfdCBBQXVkaW9TdHJlYW1fZ2V0RGV2aWNlSWQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pIF9fSU5UUk9EVUNFRF9JTigyNik7CiAKIC8qKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KKyAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiBhY3R1YWwgZGF0YSBmb3JtYXQKICAqLwpAQCAtMTE0Myw2ICsxMjkxLDkgQEAKIAogLyoqCiAgKiBQcm92aWRlIGFjdHVhbCBzaGFyaW5nIG1vZGUuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KKyAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiAgYWN0dWFsIHNoYXJpbmcgbW9kZQogICovCkBAIC0xMTUyLDEyICsxMzAzLDE2IEBACiAvKioKICAqIEdldCB0aGUgcGVyZm9ybWFuY2UgbW9kZSB1c2VkIGJ5IHRoZSBzdHJlYW0uCiAgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KKyAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICovCiBBQVVESU9fQVBJIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgQUF1ZGlvU3RyZWFtX2dldFBlcmZvcm1hbmNlTW9kZShBQXVkaW9TdHJlYW0qIHN0cmVhbSkKICAgICAgICAgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAogLyoqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI2LgorICoKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCiAgKiBAcmV0dXJuIGRpcmVjdGlvbgogICovCkBAIC0xMTcxLDYgKzEzMjYsOCBAQAogICoKICAqIFRoZSBmcmFtZSBwb3NpdGlvbiBpcyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuCiAgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KKyAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiBmcmFtZXMgd3JpdHRlbgogICovCkBAIC0xMTg0LDYgKzEzNDEsOCBAQAogICoKICAqIFRoZSBmcmFtZSBwb3NpdGlvbiBpcyBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuCiAgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KKyAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiBmcmFtZXMgcmVhZAogICovCkBAIC0xMTk1LDIxICsxMzU0LDIyIEBACiAgKiBUaGUgc2Vzc2lvbiBJRCBjYW4gYmUgdXNlZCB0byBhc3NvY2lhdGUgYSBzdHJlYW0gd2l0aCBlZmZlY3RzIHByb2Nlc3NvcnMuCiAgKiBUaGUgZWZmZWN0cyBhcmUgY29udHJvbGxlZCB1c2luZyB0aGUgQW5kcm9pZCBBdWRpb0VmZmVjdCBKYXZhIEFQSS4KICAqCi0gKiBJZiBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNlc3Npb25JZCgpIHdhcyBjYWxsZWQgd2l0aCBBQVVESU9fU0VTU0lPTl9JRF9BTExPQ0FURQorICogSWYgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTZXNzaW9uSWQoKSB3YXMKKyAqIGNhbGxlZCB3aXRoIHtAbGluayAjQUFVRElPX1NFU1NJT05fSURfQUxMT0NBVEV9CiAgKiB0aGVuIGEgbmV3IHNlc3Npb24gSUQgc2hvdWxkIGJlIGFsbG9jYXRlZCBvbmNlIHdoZW4gdGhlIHN0cmVhbSBpcyBvcGVuZWQuCiAgKgogICogSWYgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTZXNzaW9uSWQoKSB3YXMgY2FsbGVkIHdpdGggYSBwcmV2aW91c2x5IGFsbG9jYXRlZAogICogc2Vzc2lvbiBJRCB0aGVuIHRoYXQgdmFsdWUgc2hvdWxkIGJlIHJldHVybmVkLgogICoKICAqIElmIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2Vzc2lvbklkKCkgd2FzIG5vdCBjYWxsZWQgdGhlbiB0aGlzIGZ1bmN0aW9uIHNob3VsZAotICogcmV0dXJuIEFBVURJT19TRVNTSU9OX0lEX05PTkUuCisgKiByZXR1cm4ge0BsaW5rICNBQVVESU9fU0VTU0lPTl9JRF9OT05FfS4KICAqCiAgKiBUaGUgc2Vzc2lvbklEIGZvciBhIHN0cmVhbSBzaG91bGQgbm90IGNoYW5nZSBvbmNlIHRoZSBzdHJlYW0gaGFzIGJlZW4gb3BlbmVkLgogICoKLSAqIEFkZGVkIGluIEFQSSBsZXZlbCAyOC4KKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjguCiAgKgogICogQHBhcmFtIHN0cmVhbSByZWZlcmVuY2UgcHJvdmlkZWQgYnkgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkKLSAqIEByZXR1cm4gc2Vzc2lvbiBJRCBvciBBQVVESU9fU0VTU0lPTl9JRF9OT05FCisgKiBAcmV0dXJuIHNlc3Npb24gSUQgb3Ige0BsaW5rICNBQVVESU9fU0VTU0lPTl9JRF9OT05FfQogICovCiBBQVVESU9fQVBJIGFhdWRpb19zZXNzaW9uX2lkX3QgQUF1ZGlvU3RyZWFtX2dldFNlc3Npb25JZChBQXVkaW9TdHJlYW0qIHN0cmVhbSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIApAQCAtMTIxOCwyMiArMTM3OCwyNCBAQAogICogVGhpcyBjYW4gYmUgdXNlZCB0byBzeW5jaHJvbml6ZSBhdWRpbyB3aXRoIHZpZGVvIG9yIE1JREkuCiAgKiBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGFsaWduIGEgcmVjb3JkZWQgc3RyZWFtIHdpdGggYSBwbGF5YmFjayBzdHJlYW0uCiAgKgotICogVGltZXN0YW1wcyBhcmUgb25seSB2YWxpZCB3aGVuIHRoZSBzdHJlYW0gaXMgaW4gQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVELgotICogQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEUgd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgc3RyZWFtIGlzIG5vdCBzdGFydGVkLgorICogVGltZXN0YW1wcyBhcmUgb25seSB2YWxpZCB3aGVuIHRoZSBzdHJlYW0gaXMgaW4ge0BsaW5rICNBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUR9LgorICoge0BsaW5rICNBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURX0gd2lsbCBiZSByZXR1cm5lZCBpZiB0aGUgc3RyZWFtIGlzIG5vdCBzdGFydGVkLgogICogTm90ZSB0aGF0IGJlY2F1c2UgcmVxdWVzdFN0YXJ0KCkgaXMgYXN5bmNocm9ub3VzLCB0aW1lc3RhbXBzIHdpbGwgbm90IGJlIHZhbGlkIHVudGlsCiAgKiBhIHNob3J0IHRpbWUgYWZ0ZXIgY2FsbGluZyByZXF1ZXN0U3RhcnQoKS4KLSAqIFNvIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFIHNob3VsZCBub3QgYmUgY29uc2lkZXJlZCBhIGZhdGFsIGVycm9yLgorICogU28ge0BsaW5rICNBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURX0gc2hvdWxkIG5vdCBiZSBjb25zaWRlcmVkIGEgZmF0YWwgZXJyb3IuCiAgKiBKdXN0IHRyeSBjYWxsaW5nIGFnYWluIGxhdGVyLgogICoKICAqIElmIGFuIGVycm9yIG9jY3VycywgdGhlbiB0aGUgcG9zaXRpb24gYW5kIHRpbWUgd2lsbCBub3QgYmUgbW9kaWZpZWQuCiAgKgogICogVGhlIHBvc2l0aW9uIGFuZCB0aW1lIHBhc3NlZCBiYWNrIGFyZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcuCiAgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KKyAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHBhcmFtIGNsb2NraWQgQ0xPQ0tfTU9OT1RPTklDIG9yIENMT0NLX0JPT1RUSU1FCiAgKiBAcGFyYW0gZnJhbWVQb3NpdGlvbiBwb2ludGVyIHRvIGEgdmFyaWFibGUgdG8gcmVjZWl2ZSB0aGUgcG9zaXRpb24KICAqIEBwYXJhbSB0aW1lTmFub3NlY29uZHMgcG9pbnRlciB0byBhIHZhcmlhYmxlIHRvIHJlY2VpdmUgdGhlIHRpbWUKLSAqIEByZXR1cm4gQUFVRElPX09LIG9yIGEgbmVnYXRpdmUgZXJyb3IKKyAqIEByZXR1cm4ge0BsaW5rICNBQVVESU9fT0t9IG9yIGEgbmVnYXRpdmUgZXJyb3IKICAqLwogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU3RyZWFtX2dldFRpbWVzdGFtcChBQXVkaW9TdHJlYW0qIHN0cmVhbSwKICAgICAgICAgY2xvY2tpZF90IGNsb2NraWQsIGludDY0X3QgKmZyYW1lUG9zaXRpb24sIGludDY0X3QgKnRpbWVOYW5vc2Vjb25kcykgX19JTlRST0RVQ0VEX0lOKDI2KTsKQEAgLTEyNDEsNyArMTQwMyw3IEBACiAvKioKICAqIFJldHVybiB0aGUgdXNlIGNhc2UgZm9yIHRoZSBzdHJlYW0uCiAgKgotICogQWRkZWQgaW4gQVBJIGxldmVsIDI4LgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyOC4KICAqCiAgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQogICogQHJldHVybiBmcmFtZXMgcmVhZApAQCAtMTI1MSwxMCArMTQxMywxMCBAQAogLyoqCiAgKiBSZXR1cm4gdGhlIGNvbnRlbnQgdHlwZSBmb3IgdGhlIHN0cmVhbS4KICAqCi0gKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI4LgogICoKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCi0gKiBAcmV0dXJuIGNvbnRlbnQgdHlwZSwgZm9yIGV4YW1wbGUgQUFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQworICogQHJldHVybiBjb250ZW50IHR5cGUsIGZvciBleGFtcGxlIHtAbGluayAjQUFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQ30KICAqLwogQUFVRElPX0FQSSBhYXVkaW9fY29udGVudF90eXBlX3QgQUF1ZGlvU3RyZWFtX2dldENvbnRlbnRUeXBlKEFBdWRpb1N0cmVhbSogc3RyZWFtKQogICAgICAgICBfX0lOVFJPRFVDRURfSU4oMjgpOwpAQCAtMTI2MiwxNCArMTQyNCwyNiBAQAogLyoqCiAgKiBSZXR1cm4gdGhlIGlucHV0IHByZXNldCBmb3IgdGhlIHN0cmVhbS4KICAqCi0gKiBBZGRlZCBpbiBBUEkgbGV2ZWwgMjguCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI4LgogICoKICAqIEBwYXJhbSBzdHJlYW0gcmVmZXJlbmNlIHByb3ZpZGVkIGJ5IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbSgpCi0gKiBAcmV0dXJuIGlucHV0IHByZXNldCwgZm9yIGV4YW1wbGUgQUFVRElPX0lOUFVUX1BSRVNFVF9DQU1DT1JERVIKKyAqIEByZXR1cm4gaW5wdXQgcHJlc2V0LCBmb3IgZXhhbXBsZSB7QGxpbmsgI0FBVURJT19JTlBVVF9QUkVTRVRfQ0FNQ09SREVSfQogICovCiBBQVVESU9fQVBJIGFhdWRpb19pbnB1dF9wcmVzZXRfdCBBQXVkaW9TdHJlYW1fZ2V0SW5wdXRQcmVzZXQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCiAgICAgICAgIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKKy8qKgorICogUmV0dXJuIHRoZSBwb2xpY3kgdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGF1ZGlvIG1heSBvciBtYXkgbm90IGJlIGNhcHR1cmVkCisgKiBieSBvdGhlciBhcHBzIG9yIHRoZSBzeXN0ZW0uCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyOS4KKyAqCisgKiBAcGFyYW0gc3RyZWFtIHJlZmVyZW5jZSBwcm92aWRlZCBieSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oKQorICogQHJldHVybiB0aGUgYWxsb3dlZCBjYXB0dXJlIHBvbGljeSwgZm9yIGV4YW1wbGUge0BsaW5rICNBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9BTEx9CisgKi8KK0FBVURJT19BUEkgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBBQXVkaW9TdHJlYW1fZ2V0QWxsb3dlZENhcHR1cmVQb2xpY3koCisgICAgICAgIEFBdWRpb1N0cmVhbSogc3RyZWFtKSBfX0lOVFJPRFVDRURfSU4oMjkpOworCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0KICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL2xpYmFhdWRpby5tYXAudHh0IGIvbWVkaWEvbGliYWF1ZGlvL2xpYmFhdWRpby5tYXAudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYmY1OTIxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9saWJhYXVkaW8ubWFwLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLUxJQkFBVURJTyB7Ci0gIGdsb2JhbDoKLSAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dDsKLSAgICBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0OwotICAgIEFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyOwotICAgIEFBdWRpb19nZXRNTWFwUG9saWN5OwotICAgIEFBdWRpb19zZXRNTWFwUG9saWN5OwotICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlOwotICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGV2aWNlSWQ7Ci0gICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREYXRhQ2FsbGJhY2s7Ci0gICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRFcnJvckNhbGxiYWNrOwotICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrOwotICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlUmF0ZTsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZXNQZXJGcmFtZTsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudDsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZvcm1hdDsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNoYXJpbmdNb2RlOwotICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGlyZWN0aW9uOwotICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lczsKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFVzYWdlOyAgICAgICAjIGludHJvZHVjZWQ9MjgKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENvbnRlbnRUeXBlOyAjIGludHJvZHVjZWQ9MjgKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldElucHV0UHJlc2V0OyAjIGludHJvZHVjZWQ9MjgKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNlc3Npb25JZDsgICAjIGludHJvZHVjZWQ9MjgKLSAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW07Ci0gICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGU7Ci0gICAgQUF1ZGlvU3RyZWFtX2Nsb3NlOwotICAgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQ7Ci0gICAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RQYXVzZTsKLSAgICBBQXVkaW9TdHJlYW1fcmVxdWVzdEZsdXNoOwotICAgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcDsKLSAgICBBQXVkaW9TdHJlYW1fZ2V0U3RhdGU7Ci0gICAgQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZTsKLSAgICBBQXVkaW9TdHJlYW1fcmVhZDsKLSAgICBBQXVkaW9TdHJlYW1fd3JpdGU7Ci0gICAgQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lczsKLSAgICBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyU2l6ZUluRnJhbWVzOwotICAgIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2s7Ci0gICAgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1BlckJ1cnN0OwotICAgIEFBdWRpb1N0cmVhbV9nZXRCdWZmZXJDYXBhY2l0eUluRnJhbWVzOwotICAgIEFBdWRpb1N0cmVhbV9nZXRYUnVuQ291bnQ7Ci0gICAgQUF1ZGlvU3RyZWFtX2dldFNhbXBsZVJhdGU7Ci0gICAgQUF1ZGlvU3RyZWFtX2dldFNhbXBsZXNQZXJGcmFtZTsKLSAgICBBQXVkaW9TdHJlYW1fZ2V0Q2hhbm5lbENvdW50OwotICAgIEFBdWRpb1N0cmVhbV9nZXRQZXJmb3JtYW5jZU1vZGU7Ci0gICAgQUF1ZGlvU3RyZWFtX2dldERldmljZUlkOwotICAgIEFBdWRpb1N0cmVhbV9nZXRGb3JtYXQ7Ci0gICAgQUF1ZGlvU3RyZWFtX2dldFNoYXJpbmdNb2RlOwotICAgIEFBdWRpb1N0cmVhbV9nZXREaXJlY3Rpb247Ci0gICAgQUF1ZGlvU3RyZWFtX2dldFVzYWdlOyAgICAgICAjIGludHJvZHVjZWQ9MjgKLSAgICBBQXVkaW9TdHJlYW1fZ2V0Q29udGVudFR5cGU7ICMgaW50cm9kdWNlZD0yOAotICAgIEFBdWRpb1N0cmVhbV9nZXRJbnB1dFByZXNldDsgIyBpbnRyb2R1Y2VkPTI4Ci0gICAgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW47Ci0gICAgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQ7Ci0gICAgQUF1ZGlvU3RyZWFtX2dldFNlc3Npb25JZDsgICAjIGludHJvZHVjZWQ9MjgKLSAgICBBQXVkaW9TdHJlYW1fZ2V0VGltZXN0YW1wOwotICAgIEFBdWRpb1N0cmVhbV9pc01NYXBVc2VkOwotICBsb2NhbDoKLSAgICAqOwotfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmFhdWRpby9zcmMvQW5kcm9pZC5icAppbmRleCBiOWUyOGEwLi4yNTI0NmIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9BbmRyb2lkLmJwCkBAIC02LDQyICs2LDE4IEBACiAgICAgICAgICJjbGllbnQiLAogICAgICAgICAiY29yZSIsCiAgICAgICAgICJmaWZvIiwKKyAgICAgICAgImZsb3dncmFwaCIsCiAgICAgICAgICJsZWdhY3kiLAogICAgICAgICAidXRpbGl0eSIsCiAgICAgXSwKLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKLSAgICBoZWFkZXJfbGliczogWyJsaWJhYXVkaW9faGVhZGVycyJdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhYXVkaW9faGVhZGVycyIsCisgICAgXSwKICAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbImxpYmFhdWRpb19oZWFkZXJzIl0sCisgICAgdmVyc2lvbl9zY3JpcHQ6ICJsaWJhYXVkaW8ubWFwLnR4dCIsCiAKICAgICBzcmNzOiBbCi0gICAgICAgICJjb3JlL0F1ZGlvU3RyZWFtLmNwcCIsCi0gICAgICAgICJjb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5jcHAiLAogICAgICAgICAiY29yZS9BQXVkaW9BdWRpby5jcHAiLAotICAgICAgICAiY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcCIsCi0gICAgICAgICJsZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwIiwKLSAgICAgICAgImxlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAiLAotICAgICAgICAibGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwIiwKLSAgICAgICAgInV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmNwcCIsCi0gICAgICAgICJ1dGlsaXR5L0ZpeGVkQmxvY2tBZGFwdGVyLmNwcCIsCi0gICAgICAgICJ1dGlsaXR5L0ZpeGVkQmxvY2tSZWFkZXIuY3BwIiwKLSAgICAgICAgInV0aWxpdHkvRml4ZWRCbG9ja1dyaXRlci5jcHAiLAotICAgICAgICAidXRpbGl0eS9MaW5lYXJSYW1wLmNwcCIsCi0gICAgICAgICJmaWZvL0ZpZm9CdWZmZXIuY3BwIiwKLSAgICAgICAgImZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcCIsCi0gICAgICAgICJjbGllbnQvQXVkaW9FbmRwb2ludC5jcHAiLAotICAgICAgICAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwIiwKLSAgICAgICAgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAiLAotICAgICAgICAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcCIsCi0gICAgICAgICJjbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcCIsCi0gICAgICAgICJiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmNwcCIsCi0gICAgICAgICJiaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAiLAotICAgICAgICAiYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmNwcCIsCi0gICAgICAgICJiaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwIiwKLSAgICAgICAgImJpbmRpbmcvSUFBdWRpb0NsaWVudC5jcHAiLAotICAgICAgICAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5jcHAiLAotICAgICAgICAiYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5jcHAiLAotICAgICAgICAiYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcCIsCi0gICAgICAgICJiaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuY3BwIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC01NiwxMiArMzIsOTMgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpb19pbnRlcm5hbCIsCiAgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCiAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmF1ZGlvbWFuYWdlciIsCisgICAgXSwKKworICAgIHN0dWJzOiB7CisgICAgICAgIHN5bWJvbF9maWxlOiAibGliYWF1ZGlvLm1hcC50eHQiLAorICAgICAgICB2ZXJzaW9uczogWyIyOCJdLAorICAgIH0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJhYXVkaW9faW50ZXJuYWwiLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJiaW5kaW5nIiwKKyAgICAgICAgImNsaWVudCIsCisgICAgICAgICJjb3JlIiwKKyAgICAgICAgImZpZm8iLAorICAgICAgICAibGVnYWN5IiwKKyAgICAgICAgInV0aWxpdHkiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYWF1ZGlvX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfaGVhZGVycyIKKyAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsibGliYWF1ZGlvX2hlYWRlcnMiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLXVudXNlZC1wYXJhbWV0ZXIiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImNvcmUvQXVkaW9HbG9iYWwuY3BwIiwKKyAgICAgICAgImNvcmUvQXVkaW9TdHJlYW0uY3BwIiwKKyAgICAgICAgImNvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcCIsCisgICAgICAgICJjb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwIiwKKyAgICAgICAgImxlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAiLAorICAgICAgICAibGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcCIsCisgICAgICAgICJsZWdhY3kvQXVkaW9TdHJlYW1UcmFjay5jcHAiLAorICAgICAgICAidXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwIiwKKyAgICAgICAgInV0aWxpdHkvRml4ZWRCbG9ja0FkYXB0ZXIuY3BwIiwKKyAgICAgICAgInV0aWxpdHkvRml4ZWRCbG9ja1JlYWRlci5jcHAiLAorICAgICAgICAidXRpbGl0eS9GaXhlZEJsb2NrV3JpdGVyLmNwcCIsCisgICAgICAgICJmaWZvL0ZpZm9CdWZmZXIuY3BwIiwKKyAgICAgICAgImZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcCIsCisgICAgICAgICJjbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmNwcCIsCisgICAgICAgICJjbGllbnQvQXVkaW9FbmRwb2ludC5jcHAiLAorICAgICAgICAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwIiwKKyAgICAgICAgImNsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAiLAorICAgICAgICAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcCIsCisgICAgICAgICJjbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcCIsCisgICAgICAgICJiaW5kaW5nL0F1ZGlvRW5kcG9pbnRQYXJjZWxhYmxlLmNwcCIsCisgICAgICAgICJiaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAiLAorICAgICAgICAiYmluZGluZy9BQXVkaW9TdHJlYW1SZXF1ZXN0LmNwcCIsCisgICAgICAgICJiaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwIiwKKyAgICAgICAgImJpbmRpbmcvSUFBdWRpb0NsaWVudC5jcHAiLAorICAgICAgICAiYmluZGluZy9JQUF1ZGlvU2VydmljZS5jcHAiLAorICAgICAgICAiYmluZGluZy9SaW5nQnVmZmVyUGFyY2VsYWJsZS5jcHAiLAorICAgICAgICAiYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcCIsCisgICAgICAgICJiaW5kaW5nL1NoYXJlZFJlZ2lvblBhcmNlbGFibGUuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvUmFtcExpbmVhci5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NpbmtGbG9hdC5jcHAiLAorICAgICAgICAiZmxvd2dyYXBoL1NpbmtJMTYuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9TaW5rSTI0LmNwcCIsCisgICAgICAgICJmbG93Z3JhcGgvU291cmNlRmxvYXQuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VJMTYuY3BwIiwKKyAgICAgICAgImZsb3dncmFwaC9Tb3VyY2VJMjQuY3BwIiwKICAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb0JpbmRlckNsaWVudC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcAppbmRleCBkZDYyMGUzLi43YjBkMzFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvQmluZGVyQ2xpZW50LmNwcApAQCAtOTcsOCArOTcsNyBAQAogICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGJpbmRlci0+bGlua1RvRGVhdGgobUFBdWRpb0NsaWVudCk7CiAgICAgICAgICAgICAgICAgLy8gVE9ETyByZXZpZXcgd2hhdCB3ZSBzaG91bGQgZG8gaWYgdGhpcyBmYWlscwogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImdldEFBdWRpb1NlcnZpY2U6IGxpbmtUb0RlYXRoKG1BQXVkaW9DbGllbnQgPSAlcCkgcmV0dXJuZWQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtQUF1ZGlvQ2xpZW50LmdldCgpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXMoKSAtIGxpbmtUb0RlYXRoKCkgcmV0dXJuZWQgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgbUFBdWRpb1NlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJQUF1ZGlvU2VydmljZT4oYmluZGVyKTsKICAgICAgICAgICAgICAgICBuZWVkVG9SZWdpc3RlciA9IHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5jcHAKaW5kZXggOTU5ZGI2MS4uYTk4N2ZhYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0FBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9BQXVkaW9TdHJlYW1Db25maWd1cmF0aW9uLmNwcApAQCAtMTQsNiArMTQsMTAgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbiIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKwogI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KQEAgLTM2LDYgKzQwLDcgQEAKIAogc3RhdHVzX3QgQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbjo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewogICAgIHN0YXR1c190IHN0YXR1czsKKwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihnZXREZXZpY2VJZCgpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihnZXRTYW1wbGVSYXRlKCkpOwpAQCAtNDYsNiArNTEsNyBAQAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBnZXRGb3JtYXQoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMigoaW50MzJfdCkgZ2V0RGlyZWN0aW9uKCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CiAgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKGdldEJ1ZmZlckNhcGFjaXR5KCkpOwpAQCAtNTYsMTEgKzYyLDEzIEBACiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpIGdldElucHV0UHJlc2V0KCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIGdvdG8gZXJyb3I7CisgICAgc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KSBnZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSBnb3RvIGVycm9yOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihnZXRTZXNzaW9uSWQoKSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICByZXR1cm4gTk9fRVJST1I7CiBlcnJvcjoKLSAgICBBTE9HRSgiQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi53cml0ZVRvUGFyY2VsKCk6IHdyaXRlIGZhaWxlZCA9ICVkIiwgc3RhdHVzKTsKKyAgICBBTE9HRSgiJXMoKTogd3JpdGUgZmFpbGVkID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC04MCw3ICs4OCw4IEBACiAgICAgc2V0U2hhcmluZ01vZGUoKGFhdWRpb19zaGFyaW5nX21vZGVfdCkgdmFsdWUpOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKLSAgICBzZXRGb3JtYXQoKGFhdWRpb19mb3JtYXRfdCkgdmFsdWUpOworICAgIHNldEZvcm1hdCgoYXVkaW9fZm9ybWF0X3QpIHZhbHVlKTsKKwogICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBzZXREaXJlY3Rpb24oKGFhdWRpb19kaXJlY3Rpb25fdCkgdmFsdWUpOwpAQCAtOTgsOSArMTA3LDEzIEBACiAgICAgc2V0SW5wdXRQcmVzZXQoKGFhdWRpb19pbnB1dF9wcmVzZXRfdCkgdmFsdWUpOwogICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKKyAgICBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgoYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCkgdmFsdWUpOworICAgIHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZ2YWx1ZSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgZ290byBlcnJvcjsKICAgICBzZXRTZXNzaW9uSWQodmFsdWUpOworCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogZXJyb3I6Ci0gICAgQUxPR0UoIkFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24ucmVhZEZyb21QYXJjZWwoKTogcmVhZCBmYWlsZWQgPSAlZCIsIHN0YXR1cyk7CisgICAgQUxPR0UoIiVzKCk6IHJlYWQgZmFpbGVkID0gJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9JQUF1ZGlvU2VydmljZS5jcHAKaW5kZXggNjIwZWRjNy4uOTdhZDJiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvSUFBdWRpb1NlcnZpY2UuY3BwCkBAIC03Miw3ICs3Miw2IEBACiAgICAgICAgICAgICBBTE9HRSgiQnBBQXVkaW9TZXJ2aWNlOjpjbGllbnQgdHJhbnNhY3QoT1BFTl9TVFJFQU0pIHJlYWRJbnQgJWQiLCBlcnIpOwogICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KGVycik7CiAgICAgICAgIH0gZWxzZSBpZiAoc3RyZWFtIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoIkJwQUF1ZGlvU2VydmljZTo6Y2xpZW50IE9QRU5fU1RSRUFNIHBhc3NlZCBzdHJlYW0gJWQiLCBzdHJlYW0pOwogICAgICAgICAgICAgcmV0dXJuIHN0cmVhbTsKICAgICAgICAgfQogICAgICAgICBlcnIgPSBjb25maWd1cmF0aW9uT3V0cHV0LnJlYWRGcm9tUGFyY2VsKCZyZXBseSk7CkBAIC0yNTIsOCArMjUxLDE1IEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUFBdWRpb1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHNwPElBQXVkaW9DbGllbnQ+IGNsaWVudCA9IGludGVyZmFjZV9jYXN0PElBQXVkaW9DbGllbnQ+KAogICAgICAgICAgICAgICAgICAgICBkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICAgICByZWdpc3RlckNsaWVudChjbGllbnQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgLy8gcmVhZFN0cm9uZ0JpbmRlcigpIGNhbiByZXR1cm4gbnVsbAorICAgICAgICAgICAgaWYgKGNsaWVudC5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkJuQUF1ZGlvU2VydmljZTo6JXMoUkVHSVNURVJfQ0xJRU5UKSBjbGllbnQgaXMgTlVMTCEiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMTYyMzA0NTMiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJlZ2lzdGVyQ2xpZW50KGNsaWVudCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgT1BFTl9TVFJFQU06IHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmNwcAppbmRleCAwYjBjZjc3Li5iNmU4NDcyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuY3BwCkBAIC00Myw3ICs0Myw3IEBACiAKIHZvaWQgU2hhcmVkTWVtb3J5UGFyY2VsYWJsZTo6c2V0dXAoY29uc3QgdW5pcXVlX2ZkJiBmZCwgaW50MzJfdCBzaXplSW5CeXRlcykgewogICAgIG1GZC5yZXNldChkdXAoZmQuZ2V0KCkpKTsgLy8gc3RvcmUgYSBkdXBsaWNhdGUgZmQKLSAgICBBTE9HVigic2V0dXAoJWQgLT4gJWQsICVkKSB0aGlzID0gJXBcbiIsIGZkLmdldCgpLCBtRmQuZ2V0KCksIHNpemVJbkJ5dGVzLCB0aGlzKTsKKyAgICBBTE9HVigic2V0dXAoZmQgPSAlZCAtPiAlZCwgc2l6ZSA9ICVkKSB0aGlzID0gJXBcbiIsIGZkLmdldCgpLCBtRmQuZ2V0KCksIHNpemVJbkJ5dGVzLCB0aGlzKTsKICAgICBtU2l6ZUluQnl0ZXMgPSBzaXplSW5CeXRlczsKIH0KIApAQCAtMTA0LDcgKzEwNCw4IEBACiAgICAgbVJlc29sdmVkQWRkcmVzcyA9ICh1aW50OF90ICopIG1tYXAoMCwgbVNpemVJbkJ5dGVzLCBQUk9UX1JFQUQgfCBQUk9UX1dSSVRFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BUF9TSEFSRUQsIGZkLmdldCgpLCAwKTsKICAgICBpZiAobVJlc29sdmVkQWRkcmVzcyA9PSBNTUFQX1VOUkVTT0xWRURfQUREUkVTUykgewotICAgICAgICBBTE9HRSgibW1hcCgpIGZhaWxlZCBmb3IgZmQgPSAlZCwgZXJybm8gPSAlcyIsIGZkLmdldCgpLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICBBTE9HRSgibW1hcCgpIGZhaWxlZCBmb3IgZmQgPSAlZCwgbkJ5dGVzID0gJWQsIGVycm5vID0gJXMiLAorICAgICAgICAgICAgICBmZC5nZXQoKSwgbVNpemVJbkJ5dGVzLCBzdHJlcnJvcihlcnJubykpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOwogICAgIH0KICAgICByZXR1cm4gQUFVRElPX09LOwpAQCAtMTU2LDUgKzE1Nyw0IEBACiB2b2lkIFNoYXJlZE1lbW9yeVBhcmNlbGFibGU6OmR1bXAoKSB7CiAgICAgQUxPR0QoIm1GZCA9ICVkIiwgbUZkLmdldCgpKTsKICAgICBBTE9HRCgibVNpemVJbkJ5dGVzID0gJWQiLCBtU2l6ZUluQnl0ZXMpOwotICAgIEFMT0dEKCJtUmVzb2x2ZWRBZGRyZXNzID0gJXAiLCBtUmVzb2x2ZWRBZGRyZXNzKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2JpbmRpbmcvU2hhcmVkTWVtb3J5UGFyY2VsYWJsZS5oCmluZGV4IDgyYzIyNDAuLjRlYzM4YzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvYmluZGluZy9TaGFyZWRNZW1vcnlQYXJjZWxhYmxlLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9iaW5kaW5nL1NoYXJlZE1lbW9yeVBhcmNlbGFibGUuaApAQCAtNzAsOCArNzAsOCBAQAogICAgIGFhdWRpb19yZXN1bHRfdCByZXNvbHZlU2hhcmVkTWVtb3J5KGNvbnN0IGFuZHJvaWQ6OmJhc2U6OnVuaXF1ZV9mZCYgZmQpOwogCiAgICAgYW5kcm9pZDo6YmFzZTo6dW5pcXVlX2ZkICAgbUZkOwotICAgIGludDMyX3QgICAgIG1TaXplSW5CeXRlcyA9IDA7Ci0gICAgdWludDhfdCAgICAqbVJlc29sdmVkQWRkcmVzcyA9IE1NQVBfVU5SRVNPTFZFRF9BRERSRVNTOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1TaXplSW5CeXRlcyA9IDA7CisgICAgdWludDhfdCAgICAgICAgICAgICAgICAgICAqbVJlc29sdmVkQWRkcmVzcyA9IE1NQVBfVU5SRVNPTFZFRF9BRERSRVNTOwogCiBwcml2YXRlOgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjJjNDg4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmNwcApAQCAtMCwwICsxLDExNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQUF1ZGlvRmxvd0dyYXBoIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQUF1ZGlvRmxvd0dyYXBoLmgiCisKKyNpbmNsdWRlIDxmbG93Z3JhcGgvQ2xpcFRvUmFuZ2UuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvUmFtcExpbmVhci5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9TaW5rRmxvYXQuaD4KKyNpbmNsdWRlIDxmbG93Z3JhcGgvU2lua0kxNi5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9TaW5rSTI0Lmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1NvdXJjZUZsb2F0Lmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1NvdXJjZUkxNi5oPgorI2luY2x1ZGUgPGZsb3dncmFwaC9Tb3VyY2VJMjQuaD4KKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb0Zsb3dHcmFwaDo6Y29uZmlndXJlKGF1ZGlvX2Zvcm1hdF90IHNvdXJjZUZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzb3VyY2VDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IHNpbmtGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2lua0NoYW5uZWxDb3VudCkgeworICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0ICpsYXN0T3V0cHV0ID0gbnVsbHB0cjsKKworICAgIEFMT0dWKCIlcygpIHNvdXJjZSBmb3JtYXQgPSAweCUwOHgsIGNoYW5uZWxzID0gJWQsIHNpbmsgZm9ybWF0ID0gMHglMDh4LCBjaGFubmVscyA9ICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywgc291cmNlRm9ybWF0LCBzb3VyY2VDaGFubmVsQ291bnQsIHNpbmtGb3JtYXQsIHNpbmtDaGFubmVsQ291bnQpOworCisgICAgc3dpdGNoIChzb3VyY2VGb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgbVNvdXJjZSA9IHN0ZDo6bWFrZV91bmlxdWU8U291cmNlRmxvYXQ+KHNvdXJjZUNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIG1Tb3VyY2UgPSBzdGQ6Om1ha2VfdW5pcXVlPFNvdXJjZUkxNj4oc291cmNlQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDoKKyAgICAgICAgICAgIG1Tb3VyY2UgPSBzdGQ6Om1ha2VfdW5pcXVlPFNvdXJjZUkyND4oc291cmNlQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OiAvLyBUT0RPIGFkZCBJMzIKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIFVuc3VwcG9ydGVkIHNvdXJjZSBmb3JtYXQgPSAlZCIsIF9fZnVuY19fLCBzb3VyY2VGb3JtYXQpOworICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEOworICAgIH0KKyAgICBsYXN0T3V0cHV0ID0gJm1Tb3VyY2UtPm91dHB1dDsKKworICAgIC8vIEFwcGx5IHZvbHVtZSBhcyBhIHJhbXAgdG8gYXZvaWQgcG9wcy4KKyAgICBtVm9sdW1lUmFtcCA9IHN0ZDo6bWFrZV91bmlxdWU8UmFtcExpbmVhcj4oc291cmNlQ2hhbm5lbENvdW50KTsKKyAgICBsYXN0T3V0cHV0LT5jb25uZWN0KCZtVm9sdW1lUmFtcC0+aW5wdXQpOworICAgIGxhc3RPdXRwdXQgPSAmbVZvbHVtZVJhbXAtPm91dHB1dDsKKworICAgIC8vIEZvciBhIHB1cmUgZmxvYXQgZ3JhcGgsIHRoZXJlIGlzIGNoYW5jZSB0aGF0IHRoZSBkYXRhIHJhbmdlIG1heSBiZSB2ZXJ5IGxhcmdlLgorICAgIC8vIFNvIHdlIHNob3VsZCBjbGlwIHRvIGEgcmVhc29uYWJsZSB2YWx1ZSB0aGF0IGFsbG93cyBhIGxpdHRsZSBoZWFkcm9vbS4KKyAgICBpZiAoc291cmNlRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQgJiYgc2lua0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgIG1DbGlwcGVyID0gc3RkOjptYWtlX3VuaXF1ZTxDbGlwVG9SYW5nZT4oc291cmNlQ2hhbm5lbENvdW50KTsKKyAgICAgICAgbGFzdE91dHB1dC0+Y29ubmVjdCgmbUNsaXBwZXItPmlucHV0KTsKKyAgICAgICAgbGFzdE91dHB1dCA9ICZtQ2xpcHBlci0+b3V0cHV0OworICAgIH0KKworICAgIC8vIEV4cGFuZCB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIGlmIHJlcXVpcmVkLgorICAgIGlmIChzb3VyY2VDaGFubmVsQ291bnQgPT0gMSAmJiBzaW5rQ2hhbm5lbENvdW50ID4gMSkgeworICAgICAgICBtQ2hhbm5lbENvbnZlcnRlciA9IHN0ZDo6bWFrZV91bmlxdWU8TW9ub1RvTXVsdGlDb252ZXJ0ZXI+KHNpbmtDaGFubmVsQ291bnQpOworICAgICAgICBsYXN0T3V0cHV0LT5jb25uZWN0KCZtQ2hhbm5lbENvbnZlcnRlci0+aW5wdXQpOworICAgICAgICBsYXN0T3V0cHV0ID0gJm1DaGFubmVsQ29udmVydGVyLT5vdXRwdXQ7CisgICAgfSBlbHNlIGlmIChzb3VyY2VDaGFubmVsQ291bnQgIT0gc2lua0NoYW5uZWxDb3VudCkgeworICAgICAgICBBTE9HRSgiJXMoKSBDaGFubmVsIHJlZHVjdGlvbiBub3Qgc3VwcG9ydGVkLiIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEOworICAgIH0KKworICAgIHN3aXRjaCAoc2lua0Zvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICBtU2luayA9IHN0ZDo6bWFrZV91bmlxdWU8U2lua0Zsb2F0PihzaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgbVNpbmsgPSBzdGQ6Om1ha2VfdW5pcXVlPFNpbmtJMTY+KHNpbmtDaGFubmVsQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VEOgorICAgICAgICAgICAgbVNpbmsgPSBzdGQ6Om1ha2VfdW5pcXVlPFNpbmtJMjQ+KHNpbmtDaGFubmVsQ291bnQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IC8vIFRPRE8gYWRkIEkzMgorICAgICAgICAgICAgQUxPR0UoIiVzKCkgVW5zdXBwb3J0ZWQgc2luayBmb3JtYXQgPSAlZCIsIF9fZnVuY19fLCBzaW5rRm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRDsKKyAgICB9CisgICAgbGFzdE91dHB1dC0+Y29ubmVjdCgmbVNpbmstPmlucHV0KTsKKworICAgIHJldHVybiBBQVVESU9fT0s7Cit9CisKK3ZvaWQgQUF1ZGlvRmxvd0dyYXBoOjpwcm9jZXNzKGNvbnN0IHZvaWQgKnNvdXJjZSwgdm9pZCAqZGVzdGluYXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgbVNvdXJjZS0+c2V0RGF0YShzb3VyY2UsIG51bUZyYW1lcyk7CisgICAgbVNpbmstPnJlYWQoZGVzdGluYXRpb24sIG51bUZyYW1lcyk7Cit9CisKKy8qKgorICogQHBhcmFtIHZvbHVtZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCisgKi8KK3ZvaWQgQUF1ZGlvRmxvd0dyYXBoOjpzZXRUYXJnZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgbVZvbHVtZVJhbXAtPnNldFRhcmdldCh2b2x1bWUpOworfQorCit2b2lkIEFBdWRpb0Zsb3dHcmFwaDo6c2V0UmFtcExlbmd0aEluRnJhbWVzKGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgbVZvbHVtZVJhbXAtPnNldExlbmd0aEluRnJhbWVzKG51bUZyYW1lcyk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0FBdWRpb0Zsb3dHcmFwaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OWY2NGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BQXVkaW9GbG93R3JhcGguaApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0FBVURJT19GTE9XX0dSQVBIX0gKKyNkZWZpbmUgQU5EUk9JRF9BQVVESU9fRkxPV19HUkFQSF9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL0NsaXBUb1JhbmdlLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmg+CisjaW5jbHVkZSA8Zmxvd2dyYXBoL1JhbXBMaW5lYXIuaD4KKworY2xhc3MgQUF1ZGlvRmxvd0dyYXBoIHsKK3B1YmxpYzoKKyAgICAvKiogQ29ubmVjdCBzZXZlcmFsIG1vZHVsZXMgdG9nZXRoZXIgdG8gY29udmVydCBmcm9tIHNvdXJjZSB0byBzaW5rLgorICAgICAqIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2ggaW5zdGFuY2UuCisgICAgICoKKyAgICAgKiBAcGFyYW0gc291cmNlRm9ybWF0CisgICAgICogQHBhcmFtIHNvdXJjZUNoYW5uZWxDb3VudAorICAgICAqIEBwYXJhbSBzaW5rRm9ybWF0CisgICAgICogQHBhcmFtIHNpbmtDaGFubmVsQ291bnQKKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgYWF1ZGlvX3Jlc3VsdF90IGNvbmZpZ3VyZShhdWRpb19mb3JtYXRfdCBzb3VyY2VGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNvdXJjZUNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IHNpbmtGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNpbmtDaGFubmVsQ291bnQpOworCisgICAgdm9pZCBwcm9jZXNzKGNvbnN0IHZvaWQgKnNvdXJjZSwgdm9pZCAqZGVzdGluYXRpb24sIGludDMyX3QgbnVtRnJhbWVzKTsKKworICAgIC8qKgorICAgICAqIEBwYXJhbSB2b2x1bWUgYmV0d2VlbiAwLjAgYW5kIDEuMAorICAgICAqLworICAgIHZvaWQgc2V0VGFyZ2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSk7CisKKyAgICB2b2lkIHNldFJhbXBMZW5ndGhJbkZyYW1lcyhpbnQzMl90IG51bUZyYW1lcyk7CisKK3ByaXZhdGU6CisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6QXVkaW9Tb3VyY2U+ICAgICAgICAgIG1Tb3VyY2U7CisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6UmFtcExpbmVhcj4gICAgICAgICAgIG1Wb2x1bWVSYW1wOworICAgIHN0ZDo6dW5pcXVlX3B0cjxmbG93Z3JhcGg6OkNsaXBUb1JhbmdlPiAgICAgICAgICBtQ2xpcHBlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Zmxvd2dyYXBoOjpNb25vVG9NdWx0aUNvbnZlcnRlcj4gbUNoYW5uZWxDb252ZXJ0ZXI7CisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb3dncmFwaDo6QXVkaW9TaW5rPiAgICAgICAgICAgIG1TaW5rOworfTsKKworCisjZW5kaWYgLy9BTkRST0lEX0FBVURJT19GTE9XX0dSQVBIX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvRW5kcG9pbnQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5jcHAKaW5kZXggZjhlMzRkMS4uMjE0Zjg4OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9FbmRwb2ludC5jcHAKQEAgLTE5Niw3ICsxOTYsNyBAQAogCiBpbnQzMl90IEF1ZGlvRW5kcG9pbnQ6OmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCkKIHsKLSAgICByZXR1cm4gbURhdGFRdWV1ZS0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CisgICAgcmV0dXJuIG1EYXRhUXVldWUtPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CiB9CiAKIGludDMyX3QgQXVkaW9FbmRwb2ludDo6Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZShXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIpCkBAIC0yMDYsMTUgKzIwNiwxNSBAQAogCiBpbnQzMl90IEF1ZGlvRW5kcG9pbnQ6OmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKQogewotICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgIHJldHVybiBtRGF0YVF1ZXVlLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CiB9CiAKIHZvaWQgQXVkaW9FbmRwb2ludDo6YWR2YW5jZVdyaXRlSW5kZXgoaW50MzJfdCBkZWx0YUZyYW1lcykgewotICAgIG1EYXRhUXVldWUtPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5hZHZhbmNlV3JpdGVJbmRleChkZWx0YUZyYW1lcyk7CisgICAgbURhdGFRdWV1ZS0+YWR2YW5jZVdyaXRlSW5kZXgoZGVsdGFGcmFtZXMpOwogfQogCiB2b2lkIEF1ZGlvRW5kcG9pbnQ6OmFkdmFuY2VSZWFkSW5kZXgoaW50MzJfdCBkZWx0YUZyYW1lcykgewotICAgIG1EYXRhUXVldWUtPmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5hZHZhbmNlUmVhZEluZGV4KGRlbHRhRnJhbWVzKTsKKyAgICBtRGF0YVF1ZXVlLT5hZHZhbmNlUmVhZEluZGV4KGRlbHRhRnJhbWVzKTsKIH0KIAogdm9pZCBBdWRpb0VuZHBvaW50OjpzZXREYXRhUmVhZENvdW50ZXIoZmlmb19jb3VudGVyX3QgZnJhbWVzUmVhZCkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKaW5kZXggOTIwNDgyNC4uZmIyNzZjMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5jcHAKQEAgLTM2LDEwICszNiwxMCBAQAogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU3RyZWFtQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgImJpbmRpbmcvSUFBdWRpb1NlcnZpY2UuaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VNZXNzYWdlLmgiCisjaW5jbHVkZSAiY29yZS9BdWRpb0dsb2JhbC5oIgogI2luY2x1ZGUgImNvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmgiCiAjaW5jbHVkZSAiZmlmby9GaWZvQnVmZmVyLmgiCiAjaW5jbHVkZSAidXRpbGl0eS9BdWRpb0Nsb2NrLmgiCi0jaW5jbHVkZSAidXRpbGl0eS9MaW5lYXJSYW1wLmgiCiAKICNpbmNsdWRlICJBdWRpb1N0cmVhbUludGVybmFsLmgiCiAKQEAgLTYzLDcgKzYzLDcgQEAKICAgICAgICAgLCBtU2VydmljZVN0cmVhbUhhbmRsZShBQVVESU9fSEFORExFX0lOVkFMSUQpCiAgICAgICAgICwgbUluU2VydmljZShpblNlcnZpY2UpCiAgICAgICAgICwgbVNlcnZpY2VJbnRlcmZhY2Uoc2VydmljZUludGVyZmFjZSkKLSAgICAgICAgLCBtQXRvbWljVGltZXN0YW1wKCkKKyAgICAgICAgLCBtQXRvbWljSW50ZXJuYWxUaW1lc3RhbXAoKQogICAgICAgICAsIG1XYWtldXBEZWxheU5hbm9zKEFBdWRpb1Byb3BlcnR5X2dldFdha2V1cERlbGF5TWljcm9zKCkgKiBBQVVESU9fTkFOT1NfUEVSX01JQ1JPU0VDT05EKQogICAgICAgICAsIG1NaW5pbXVtU2xlZXBOYW5vcyhBQXVkaW9Qcm9wZXJ0eV9nZXRNaW5pbXVtU2xlZXBNaWNyb3MoKSAqIEFBVURJT19OQU5PU19QRVJfTUlDUk9TRUNPTkQpCiAgICAgICAgIHsKQEAgLTc3LDYgKzc3LDcgQEAKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogICAgIGludDMyX3QgY2FwYWNpdHk7CiAgICAgaW50MzJfdCBmcmFtZXNQZXJCdXJzdDsKKyAgICBpbnQzMl90IGZyYW1lc1BlckhhcmR3YXJlQnVyc3Q7CiAgICAgQUF1ZGlvU3RyZWFtUmVxdWVzdCByZXF1ZXN0OwogICAgIEFBdWRpb1N0cmVhbUNvbmZpZ3VyYXRpb24gY29uZmlndXJhdGlvbk91dHB1dDsKIApAQCAtOTEsMTIgKzkyLDE1IEBACiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCisgICAgY29uc3QgaW50MzJfdCBidXJzdE1pbk1pY3JvcyA9IEFBdWRpb1Byb3BlcnR5X2dldEhhcmR3YXJlQnVyc3RNaW5NaWNyb3MoKTsKKyAgICBpbnQzMl90IGJ1cnN0TWljcm9zID0gMDsKKwogICAgIC8vIFdlIGhhdmUgdG8gZG8gdm9sdW1lIHNjYWxpbmcuIFNvIHdlIHByZWZlciBGTE9BVCBmb3JtYXQuCi0gICAgaWYgKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQpIHsKLSAgICAgICAgc2V0Rm9ybWF0KEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKTsKKyAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQVVESU9fRk9STUFUX0RFRkFVTFQpIHsKKyAgICAgICAgc2V0Rm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOwogICAgIH0KICAgICAvLyBSZXF1ZXN0IEZMT0FUIGZvciB0aGUgc2hhcmVkIG1peGVyLgotICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldEZvcm1hdChBQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CisgICAgcmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0Rm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOwogCiAgICAgLy8gQnVpbGQgdGhlIHJlcXVlc3QgdG8gc2VuZCB0byB0aGUgc2VydmVyLgogICAgIHJlcXVlc3Quc2V0VXNlcklkKGdldHVpZCgpKTsKQEAgLTEyNiwxMyArMTMwLDEyIEBACiAgICAgICAgIC8vIGlmIHRoYXQgZmFpbGVkIHRoZW4gdHJ5IHN3aXRjaGluZyBmcm9tIG1vbm8gdG8gc3RlcmVvIGlmIE9VVFBVVC4KICAgICAgICAgLy8gT25seSBkbyB0aGlzIGluIHRoZSBjbGllbnQuIE90aGVyd2lzZSB3ZSBlbmQgdXAgd2l0aCBhIG1vbm8gbWl4ZXIgaW4gdGhlIHNlcnZpY2UKICAgICAgICAgLy8gdGhhdCB3cml0ZXMgdG8gYSBzdGVyZW8gTU1BUCBzdHJlYW0uCi0gICAgICAgIEFMT0dEKCIlcyAtIG9wZW5TdHJlYW0oKSByZXR1cm5lZCAlZCwgdHJ5IHN3aXRjaGluZyBmcm9tIE1PTk8gdG8gU1RFUkVPIiwKKyAgICAgICAgQUxPR0QoIiVzKCkgLSBvcGVuU3RyZWFtKCkgcmV0dXJuZWQgJWQsIHRyeSBzd2l0Y2hpbmcgZnJvbSBNT05PIHRvIFNURVJFTyIsCiAgICAgICAgICAgICAgIF9fZnVuY19fLCBtU2VydmljZVN0cmVhbUhhbmRsZSk7CiAgICAgICAgIHJlcXVlc3QuZ2V0Q29uZmlndXJhdGlvbigpLnNldFNhbXBsZXNQZXJGcmFtZSgyKTsgLy8gc3RlcmVvCiAgICAgICAgIG1TZXJ2aWNlU3RyZWFtSGFuZGxlID0gbVNlcnZpY2VJbnRlcmZhY2Uub3BlblN0cmVhbShyZXF1ZXN0LCBjb25maWd1cmF0aW9uT3V0cHV0KTsKICAgICB9CiAgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlIDwgMCkgewotICAgICAgICBBTE9HRSgiJXMgLSBvcGVuU3RyZWFtKCkgcmV0dXJuZWQgJWQiLCBfX2Z1bmNfXywgbVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogICAgICAgICByZXR1cm4gbVNlcnZpY2VTdHJlYW1IYW5kbGU7CiAgICAgfQogCkBAIC0xNzUsOCArMTc4LDIyIEBACiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfQogCi0gICAgLy8gVmFsaWRhdGUgcmVzdWx0IGZyb20gc2VydmVyLgotICAgIGZyYW1lc1BlckJ1cnN0ID0gbUVuZHBvaW50RGVzY3JpcHRvci5kYXRhUXVldWVEZXNjcmlwdG9yLmZyYW1lc1BlckJ1cnN0OworICAgIGZyYW1lc1BlckhhcmR3YXJlQnVyc3QgPSBtRW5kcG9pbnREZXNjcmlwdG9yLmRhdGFRdWV1ZURlc2NyaXB0b3IuZnJhbWVzUGVyQnVyc3Q7CisKKyAgICAvLyBTY2FsZSB1cCB0aGUgYnVyc3Qgc2l6ZSB0byBtZWV0IHRoZSBtaW5pbXVtIGVxdWl2YWxlbnQgaW4gbWljcm9zZWNvbmRzLgorICAgIC8vIFRoaXMgaXMgdG8gYXZvaWQgd2FraW5nIHRoZSBDUFUgdG9vIG9mdGVuIHdoZW4gdGhlIEhXIGJ1cnN0IGlzIHZlcnkgc21hbGwKKyAgICAvLyBvciBhdCBoaWdoIHNhbXBsZSByYXRlcy4KKyAgICBmcmFtZXNQZXJCdXJzdCA9IGZyYW1lc1BlckhhcmR3YXJlQnVyc3Q7CisgICAgZG8geworICAgICAgICBpZiAoYnVyc3RNaWNyb3MgPiAwKSB7ICAvLyBza2lwIGZpcnN0IGxvb3AKKyAgICAgICAgICAgIGZyYW1lc1BlckJ1cnN0ICo9IDI7CisgICAgICAgIH0KKyAgICAgICAgYnVyc3RNaWNyb3MgPSBmcmFtZXNQZXJCdXJzdCAqIHN0YXRpY19jYXN0PGludDY0X3Q+KDEwMDAwMDApIC8gZ2V0U2FtcGxlUmF0ZSgpOworICAgIH0gd2hpbGUgKGJ1cnN0TWljcm9zIDwgYnVyc3RNaW5NaWNyb3MpOworICAgIEFMT0dEKCIlcygpIG9yaWdpbmFsIEhXIGJ1cnN0ID0gJWQsIG1pbk1pY3JvcyA9ICVkID0+IFNXIGJ1cnN0ID0gJWRcbiIsCisgICAgICAgICAgX19mdW5jX18sIGZyYW1lc1BlckhhcmR3YXJlQnVyc3QsIGJ1cnN0TWluTWljcm9zLCBmcmFtZXNQZXJCdXJzdCk7CisKKyAgICAvLyBWYWxpZGF0ZSBmaW5hbCBidXJzdCBzaXplLgogICAgIGlmIChmcmFtZXNQZXJCdXJzdCA8IE1JTl9GUkFNRVNfUEVSX0JVUlNUIHx8IGZyYW1lc1BlckJ1cnN0ID4gTUFYX0ZSQU1FU19QRVJfQlVSU1QpIHsKICAgICAgICAgQUxPR0UoIiVzIC0gZnJhbWVzUGVyQnVyc3Qgb3V0IG9mIHJhbmdlID0gJWQiLCBfX2Z1bmNfXywgZnJhbWVzUGVyQnVyc3QpOwogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwpAQCAtMTkyLDE4ICsyMDksMTggQEAKICAgICB9CiAKICAgICBtQ2xvY2tNb2RlbC5zZXRTYW1wbGVSYXRlKGdldFNhbXBsZVJhdGUoKSk7Ci0gICAgbUNsb2NrTW9kZWwuc2V0RnJhbWVzUGVyQnVyc3QobUZyYW1lc1BlckJ1cnN0KTsKKyAgICBtQ2xvY2tNb2RlbC5zZXRGcmFtZXNQZXJCdXJzdChmcmFtZXNQZXJIYXJkd2FyZUJ1cnN0KTsKIAogICAgIGlmIChpc0RhdGFDYWxsYmFja1NldCgpKSB7CiAgICAgICAgIG1DYWxsYmFja0ZyYW1lcyA9IGJ1aWxkZXIuZ2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrKCk7CiAgICAgICAgIGlmIChtQ2FsbGJhY2tGcmFtZXMgPiBnZXRCdWZmZXJDYXBhY2l0eSgpIC8gMikgewotICAgICAgICAgICAgQUxPR0UoIiVzIC0gZnJhbWVzUGVyQ2FsbGJhY2sgdG9vIGJpZyA9ICVkLCBjYXBhY2l0eSA9ICVkIiwKKyAgICAgICAgICAgIEFMT0dXKCIlcyAtIGZyYW1lc1BlckNhbGxiYWNrIHRvbyBiaWcgPSAlZCwgY2FwYWNpdHkgPSAlZCIsCiAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUNhbGxiYWNrRnJhbWVzLCBnZXRCdWZmZXJDYXBhY2l0eSgpKTsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogCiAgICAgICAgIH0gZWxzZSBpZiAobUNhbGxiYWNrRnJhbWVzIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoIiVzIC0gZnJhbWVzUGVyQ2FsbGJhY2sgbmVnYXRpdmUiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBBTE9HVygiJXMgLSBmcmFtZXNQZXJDYWxsYmFjayBuZWdhdGl2ZSIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogCkBAIC0yMTIsOSArMjI5LDcgQEAKICAgICAgICAgICAgIG1DYWxsYmFja0ZyYW1lcyA9IG1GcmFtZXNQZXJCdXJzdDsKICAgICAgICAgfQogCi0gICAgICAgIGludDMyX3QgYnl0ZXNQZXJGcmFtZSA9IGdldFNhbXBsZXNQZXJGcmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGdldEZvcm1hdCgpKTsKLSAgICAgICAgaW50MzJfdCBjYWxsYmFja0J1ZmZlclNpemUgPSBtQ2FsbGJhY2tGcmFtZXMgKiBieXRlc1BlckZyYW1lOworICAgICAgICBjb25zdCBpbnQzMl90IGNhbGxiYWNrQnVmZmVyU2l6ZSA9IG1DYWxsYmFja0ZyYW1lcyAqIGdldEJ5dGVzUGVyRnJhbWUoKTsKICAgICAgICAgbUNhbGxiYWNrQnVmZmVyID0gbmV3IHVpbnQ4X3RbY2FsbGJhY2tCdWZmZXJTaXplXTsKICAgICB9CiAKQEAgLTIyNywyMiArMjQyLDE4IEBACiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCB1bmRlciBtU3RyZWFtTG9jay4KIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpjbG9zZSgpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwotICAgIEFMT0dEKCIlcygpOiBtU2VydmljZVN0cmVhbUhhbmRsZSA9IDB4JTA4WCIsIF9fZnVuY19fLCBtU2VydmljZVN0cmVhbUhhbmRsZSk7CisgICAgQUxPR1YoIiVzKCk6IG1TZXJ2aWNlU3RyZWFtSGFuZGxlID0gMHglMDhYIiwgX19mdW5jX18sIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgIT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7CiAgICAgICAgIC8vIERvbid0IGNsb3NlIGEgc3RyZWFtIHdoaWxlIGl0IGlzIHJ1bm5pbmcuCiAgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBjdXJyZW50U3RhdGUgPSBnZXRTdGF0ZSgpOwotICAgICAgICBpZiAoaXNBY3RpdmUoKSkgeworICAgICAgICAvLyBEb24ndCBjbG9zZSBhIHN0cmVhbSB3aGlsZSBpdCBpcyBydW5uaW5nLiBTdG9wIGl0IGZpcnN0LgorICAgICAgICAvLyBJZiBESVNDT05ORUNURUQgdGhlbiB3ZSBzaG91bGQgc3RpbGwgdHJ5IHRvIHN0b3AgaW4gY2FzZSB0aGUKKyAgICAgICAgLy8gZXJyb3IgY2FsbGJhY2sgaXMgc3RpbGwgcnVubmluZy4KKyAgICAgICAgaWYgKGlzQWN0aXZlKCkgfHwgY3VycmVudFN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICByZXF1ZXN0U3RvcCgpOwotICAgICAgICAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IG5leHRTdGF0ZTsKLSAgICAgICAgICAgIGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzID0gTUlOX1RJTUVPVVRfTkFOT1M7Ci0gICAgICAgICAgICByZXN1bHQgPSB3YWl0Rm9yU3RhdGVDaGFuZ2UoY3VycmVudFN0YXRlLCAmbmV4dFN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVvdXROYW5vc2Vjb25kcyk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpIHdhaXRGb3JTdGF0ZUNoYW5nZSgpIHJldHVybmVkICVkICVzIiwKLSAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX0NMT1NJTkcpOwogICAgICAgICBhYXVkaW9faGFuZGxlX3Qgc2VydmljZVN0cmVhbUhhbmRsZSA9IG1TZXJ2aWNlU3RyZWFtSGFuZGxlOwpAQCAtMjg3LDE3ICsyOTgsMTcgQEAKIHsKICAgICBpbnQ2NF90IHN0YXJ0VGltZTsKICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7Ci0gICAgICAgIEFMT0dFKCJyZXF1ZXN0U3RhcnQoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkIik7CisgICAgICAgIEFMT0dEKCJyZXF1ZXN0U3RhcnQoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAgICAgaWYgKGlzQWN0aXZlKCkpIHsKLSAgICAgICAgQUxPR0UoInJlcXVlc3RTdGFydCgpIGFscmVhZHkgYWN0aXZlIik7CisgICAgICAgIEFMT0dEKCJyZXF1ZXN0U3RhcnQoKSBhbHJlYWR5IGFjdGl2ZSIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCiAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IG9yaWdpbmFsU3RhdGUgPSBnZXRTdGF0ZSgpOwogICAgIGlmIChvcmlnaW5hbFN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSB7Ci0gICAgICAgIEFMT0dFKCJyZXF1ZXN0U3RhcnQoKSBidXQgRElTQ09OTkVDVEVEIik7CisgICAgICAgIEFMT0dEKCJyZXF1ZXN0U3RhcnQoKSBidXQgRElTQ09OTkVDVEVEIik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEOwogICAgIH0KICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJUSU5HKTsKQEAgLTM0MywzOSArMzU0LDQ4IEBACiAgICAgcmV0dXJuIGNhbGN1bGF0ZVJlYXNvbmFibGVUaW1lb3V0KGdldEZyYW1lc1BlckJ1cnN0KCkpOwogfQogCisvLyBUaGlzIG11c3QgYmUgY2FsbGVkIHVuZGVyIG1TdHJlYW1Mb2NrLgogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnN0b3BDYWxsYmFjaygpCiB7Ci0gICAgaWYgKGlzRGF0YUNhbGxiYWNrQWN0aXZlKCkpIHsKKyAgICBpZiAoaXNEYXRhQ2FsbGJhY2tTZXQoKQorICAgICAgICAgICAgJiYgKGlzQWN0aXZlKCkgfHwgZ2V0U3RhdGUoKSA9PSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRCkpIHsKICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7Ci0gICAgICAgIHJldHVybiBqb2luVGhyZWFkKE5VTEwpOworICAgICAgICByZXR1cm4gam9pblRocmVhZChOVUxMKTsgLy8gbWF5IHRlbXBvcmFyaWx5IHVubG9jayBtU3RyZWFtTG9jawogICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CiAgICAgfQogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6cmVxdWVzdFN0b3AoKQoteworLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCB1bmRlciBtU3RyZWFtTG9jay4KK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsOjpyZXF1ZXN0U3RvcCgpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc3RvcENhbGxiYWNrKCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CisgICAgLy8gVGhlIHN0cmVhbSBtYXkgaGF2ZSBiZWVuIHVubG9ja2VkIHRlbXBvcmFyaWx5IHRvIGxldCBhIGNhbGxiYWNrIGZpbmlzaAorICAgIC8vIGFuZCB0aGUgY2FsbGJhY2sgbWF5IGhhdmUgc3RvcHBlZCB0aGUgc3RyZWFtLgorICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSB0aGUgc3RyZWFtIHN0aWxsIG5lZWRzIHRvIGJlIHN0b3BwZWQuCisgICAgLy8gU2VlIGFsc28gQXVkaW9TdHJlYW06OnNhZmVTdG9wKCkuCisgICAgaWYgKCEoaXNBY3RpdmUoKSB8fCBnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfRElTQ09OTkVDVEVEKSkgeworICAgICAgICByZXR1cm4gQUFVRElPX09LOworICAgIH0KIAogICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSA9PSBBQVVESU9fSEFORExFX0lOVkFMSUQpIHsKLSAgICAgICAgQUxPR0UoInJlcXVlc3RTdG9wSW50ZXJuYWwoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkID0gMHglMDhYIiwKLSAgICAgICAgICAgICAgbVNlcnZpY2VTdHJlYW1IYW5kbGUpOworICAgICAgICBBTE9HVygiJXMoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkID0gMHglMDhYIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIG1TZXJ2aWNlU3RyZWFtSGFuZGxlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIAogICAgIG1DbG9ja01vZGVsLnN0b3AoQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7CiAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORyk7Ci0gICAgbUF0b21pY1RpbWVzdGFtcC5jbGVhcigpOworICAgIG1BdG9taWNJbnRlcm5hbFRpbWVzdGFtcC5jbGVhcigpOwogCiAgICAgcmV0dXJuIG1TZXJ2aWNlSW50ZXJmYWNlLnN0b3BTdHJlYW0obVNlcnZpY2VTdHJlYW1IYW5kbGUpOwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6cmVnaXN0ZXJUaHJlYWQoKSB7CiAgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlID09IEFBVURJT19IQU5ETEVfSU5WQUxJRCkgewotICAgICAgICBBTE9HRSgicmVnaXN0ZXJUaHJlYWQoKSBtU2VydmljZVN0cmVhbUhhbmRsZSBpbnZhbGlkIik7CisgICAgICAgIEFMT0dXKCIlcygpIG1TZXJ2aWNlU3RyZWFtSGFuZGxlIGludmFsaWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAgICAgcmV0dXJuIG1TZXJ2aWNlSW50ZXJmYWNlLnJlZ2lzdGVyQXVkaW9UaHJlYWQobVNlcnZpY2VTdHJlYW1IYW5kbGUsCkBAIC0zODUsNyArNDA1LDcgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6OnVucmVnaXN0ZXJUaHJlYWQoKSB7CiAgICAgaWYgKG1TZXJ2aWNlU3RyZWFtSGFuZGxlID09IEFBVURJT19IQU5ETEVfSU5WQUxJRCkgewotICAgICAgICBBTE9HRSgidW5yZWdpc3RlclRocmVhZCgpIG1TZXJ2aWNlU3RyZWFtSGFuZGxlIGludmFsaWQiKTsKKyAgICAgICAgQUxPR1coIiVzKCkgbVNlcnZpY2VTdHJlYW1IYW5kbGUgaW52YWxpZCIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KICAgICByZXR1cm4gbVNlcnZpY2VJbnRlcmZhY2UudW5yZWdpc3RlckF1ZGlvVGhyZWFkKG1TZXJ2aWNlU3RyZWFtSGFuZGxlLCBnZXR0aWQoKSk7CkBAIC00MTcsOCArNDM3LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKmZyYW1lUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3NlY29uZHMpIHsKICAgICAvLyBHZW5lcmF0ZWQgaW4gc2VydmVyIGFuZCBwYXNzZWQgdG8gY2xpZW50LiBSZXR1cm4gbGF0ZXN0LgotICAgIGlmIChtQXRvbWljVGltZXN0YW1wLmlzVmFsaWQoKSkgewotICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1RpbWVzdGFtcC5yZWFkKCk7CisgICAgaWYgKG1BdG9taWNJbnRlcm5hbFRpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKKyAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNJbnRlcm5hbFRpbWVzdGFtcC5yZWFkKCk7CiAgICAgICAgIGludDY0X3QgcG9zaXRpb24gPSB0aW1lc3RhbXAuZ2V0UG9zaXRpb24oKSArIG1GcmFtZXNPZmZzZXRGcm9tU2VydmljZTsKICAgICAgICAgaWYgKHBvc2l0aW9uID49IDApIHsKICAgICAgICAgICAgICpmcmFtZVBvc2l0aW9uID0gcG9zaXRpb247CkBAIC00NjUsNyArNDg1LDcgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWw6Om9uVGltZXN0YW1wSGFyZHdhcmUoQUF1ZGlvU2VydmljZU1lc3NhZ2UgKm1lc3NhZ2UpIHsKICAgICBUaW1lc3RhbXAgdGltZXN0YW1wKG1lc3NhZ2UtPnRpbWVzdGFtcC5wb3NpdGlvbiwgbWVzc2FnZS0+dGltZXN0YW1wLnRpbWVzdGFtcCk7Ci0gICAgbUF0b21pY1RpbWVzdGFtcC53cml0ZSh0aW1lc3RhbXApOworICAgIG1BdG9taWNJbnRlcm5hbFRpbWVzdGFtcC53cml0ZSh0aW1lc3RhbXApOwogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKQEAgLTY5Niw3ICs3MTYsNiBAQAogICAgIH0KIAogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBtQXVkaW9FbmRwb2ludC5zZXRCdWZmZXJTaXplSW5GcmFtZXMoYWRqdXN0ZWRGcmFtZXMsICZhY3R1YWxGcmFtZXMpOwotICAgIEFMT0dEKCJzZXRCdWZmZXJTaXplKCkgcmVxID0gJWQgPT4gJWQiLCByZXF1ZXN0ZWRGcmFtZXMsIGFjdHVhbEZyYW1lcyk7CiAgICAgaWYgKHJlc3VsdCA8IDApIHsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9IGVsc2UgewpAQCAtNzE2LDYgKzczNSwxMSBAQAogICAgIHJldHVybiBtRnJhbWVzUGVyQnVyc3Q7CiB9CiAKKy8vIFRoaXMgbXVzdCBiZSBjYWxsZWQgdW5kZXIgbVN0cmVhbUxvY2suCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbDo6am9pblRocmVhZCh2b2lkKiogcmV0dXJuQXJnKSB7CiAgICAgcmV0dXJuIEF1ZGlvU3RyZWFtOjpqb2luVGhyZWFkKHJldHVybkFyZywgY2FsY3VsYXRlUmVhc29uYWJsZVRpbWVvdXQoZ2V0RnJhbWVzUGVyQnVyc3QoKSkpOwogfQorCitib29sIEF1ZGlvU3RyZWFtSW50ZXJuYWw6OmlzQ2xvY2tNb2RlbEluQ29udHJvbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNBY3RpdmUoKSAmJiBtQXVkaW9FbmRwb2ludC5pc0ZyZWVSdW5uaW5nKCkgJiYgbUNsb2NrTW9kZWwuaXNSdW5uaW5nKCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsLmgKaW5kZXggMDQyNWNkNS4uODZjNDY5OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbC5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaApAQCAtMjcsNyArMjcsNiBAQAogI2luY2x1ZGUgImNsaWVudC9BdWRpb0VuZHBvaW50LmgiCiAjaW5jbHVkZSAiY29yZS9BdWRpb1N0cmVhbS5oIgogI2luY2x1ZGUgInV0aWxpdHkvQXVkaW9DbG9jay5oIgotI2luY2x1ZGUgInV0aWxpdHkvTGluZWFyUmFtcC5oIgogCiB1c2luZyBhbmRyb2lkOjpzcDsKIHVzaW5nIGFuZHJvaWQ6OklBQXVkaW9TZXJ2aWNlOwpAQCAtMTQ1LDYgKzE0NCwxNCBAQAogICAgICAqLwogICAgIGJvb2wgaXNJblNlcnZpY2UoKSBjb25zdCB7IHJldHVybiBtSW5TZXJ2aWNlOyB9CiAKKyAgICAvKioKKyAgICAgKiBJcyB0aGUgc2VydmljZSBGSUZPIHBvc2l0aW9uIGN1cnJlbnRseSBjb250cm9sbGVkIGJ5IHRoZSBBQXVkaW8gc2VydmljZSBvciBIQUwsCisgICAgICogb3Igc2V0IGJhc2VkIG9uIHRoZSBDbG9jayBNb2RlbC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgQ2xvY2tNb2RlbCBpcyBjdXJyZW50bHkgZGV0ZXJtaW5pbmcgdGhlIEZJRk8gcG9zaXRpb24KKyAgICAgKi8KKyAgICBib29sIGlzQ2xvY2tNb2RlbEluQ29udHJvbCgpIGNvbnN0OworCiAgICAgSXNvY2hyb25vdXNDbG9ja01vZGVsICAgIG1DbG9ja01vZGVsOyAgICAgIC8vIHRpbWluZyBtb2RlbCBmb3IgY2hhc2luZyB0aGUgSEFMCiAKICAgICBBdWRpb0VuZHBvaW50ICAgICAgICAgICAgbUF1ZGlvRW5kcG9pbnQ7ICAgLy8gc291cmNlIGZvciByZWFkcyBvciBzaW5rIGZvciB3cml0ZXMKQEAgLTE2NCw3ICsxNzEsNyBAQAogCiAgICAgQUF1ZGlvU2VydmljZUludGVyZmFjZSAgJm1TZXJ2aWNlSW50ZXJmYWNlOyAgIC8vIGFic3RyYWN0IGludGVyZmFjZSB0byB0aGUgc2VydmljZQogCi0gICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNUaW1lc3RhbXA7CisgICAgU2ltcGxlRG91YmxlQnVmZmVyPFRpbWVzdGFtcD4gIG1BdG9taWNJbnRlcm5hbFRpbWVzdGFtcDsKIAogICAgIEF0b21pY1JlcXVlc3RvciAgICAgICAgICBtTmVlZENhdGNoVXA7ICAgLy8gQXNrIHJlYWQoKSBvciB3cml0ZSgpIHRvIHN5bmMgb24gZmlyc3QgdGltZXN0YW1wLgogCkBAIC0xOTMsNiArMjAwLDggQEAKIAogICAgIGludDY0X3QgICAgICAgICAgICAgICAgICBtU2VydmljZUxhdGVuY3lOYW5vcyA9IDA7CiAKKyAgICAvLyBTb21ldGltZXMgdGhlIGhhcmR3YXJlIGlzIG9wZXJhdGluZyB3aXRoIGEgZGlmZmVyZW50IGNoYW5uZWwgY291bnQgZnJvbSB0aGUgYXBwLgorICAgIC8vIFRoZW4gd2UgcmVxdWlyZSBjb252ZXJzaW9uIGluIEFBdWRpby4KICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgbURldmljZUNoYW5uZWxDb3VudCA9IDA7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZS5jcHAKaW5kZXggMDcxOWZlMS4uMzY2Y2M4NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlLmNwcApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKICNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuaCIKQEAgLTg4LDcgKzg5LDExIEBACiAgICAgaWYgKG1BdWRpb0VuZHBvaW50LmlzRnJlZVJ1bm5pbmcoKSkgewogICAgICAgICAvL0FMT0dEKCJBdWRpb1N0cmVhbUludGVybmFsQ2FwdHVyZTo6cHJvY2Vzc0RhdGFOb3coKSAtIHVwZGF0ZSByZW1vdGUgY291bnRlciIpOwogICAgICAgICAvLyBVcGRhdGUgZGF0YSBxdWV1ZSBiYXNlZCBvbiB0aGUgdGltaW5nIG1vZGVsLgotICAgICAgICBpbnQ2NF90IGVzdGltYXRlZFJlbW90ZUNvdW50ZXIgPSBtQ2xvY2tNb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24oY3VycmVudE5hbm9UaW1lKTsKKyAgICAgICAgLy8gSml0dGVyIGluIHRoZSBEU1AgY2FuIGNhdXNlIGxhdGUgd3JpdGVzIHRvIHRoZSBGSUZPLgorICAgICAgICAvLyBUaGlzIG1pZ2h0IGJlIGNhdXNlZCBieSByZXNhbXBsaW5nLgorICAgICAgICAvLyBXZSB3YW50IHRvIHJlYWQgdGhlIEZJRk8gYWZ0ZXIgdGhlIGxhdGVzdCBwb3NzaWJsZSB0aW1lCisgICAgICAgIC8vIHRoYXQgdGhlIERTUCBjb3VsZCBoYXZlIHdyaXR0ZW4gdGhlIGRhdGEuCisgICAgICAgIGludDY0X3QgZXN0aW1hdGVkUmVtb3RlQ291bnRlciA9IG1DbG9ja01vZGVsLmNvbnZlcnRMYXRlc3RUaW1lVG9Qb3NpdGlvbihjdXJyZW50TmFub1RpbWUpOwogICAgICAgICAvLyBUT0RPIHJlZmFjdG9yLCBtYXliZSB1c2Ugc2V0UmVtb3RlQ291bnRlcigpCiAgICAgICAgIG1BdWRpb0VuZHBvaW50LnNldERhdGFXcml0ZUNvdW50ZXIoZXN0aW1hdGVkUmVtb3RlQ291bnRlcik7CiAgICAgfQpAQCAtMTM4LDcgKzE0Myw3IEBACiAgICAgICAgICAgICAgICAgLy8gdGhlIHdyaXRlQ291bnRlciBtaWdodCBoYXZlIGp1c3QgYWR2YW5jZWQgaW4gdGhlIGJhY2tncm91bmQsCiAgICAgICAgICAgICAgICAgLy8gY2F1c2luZyB1cyB0byBzbGVlcCB1bnRpbCBhIGxhdGVyIGJ1cnN0LgogICAgICAgICAgICAgICAgIGludDY0X3QgbmV4dFBvc2l0aW9uID0gbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVJlYWRDb3VudGVyKCkgKyBtRnJhbWVzUGVyQnVyc3Q7Ci0gICAgICAgICAgICAgICAgd2FrZVRpbWUgPSBtQ2xvY2tNb2RlbC5jb252ZXJ0UG9zaXRpb25Ub1RpbWUobmV4dFBvc2l0aW9uKTsKKyAgICAgICAgICAgICAgICB3YWtlVGltZSA9IG1DbG9ja01vZGVsLmNvbnZlcnRQb3NpdGlvblRvTGF0ZXN0VGltZShuZXh0UG9zaXRpb24pOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgZGVmYXVsdDoKQEAgLTE2NSwzNSArMTcwLDM2IEBACiAgICAgLy8gUmVhZCBkYXRhIGluIG9uZSBvciB0d28gcGFydHMuCiAgICAgZm9yIChpbnQgcGFydEluZGV4ID0gMDsgZnJhbWVzTGVmdCA+IDAgJiYgcGFydEluZGV4IDwgV3JhcHBpbmdCdWZmZXI6OlNJWkU7IHBhcnRJbmRleCsrKSB7CiAgICAgICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gZnJhbWVzTGVmdDsKLSAgICAgICAgaW50MzJfdCBmcmFtZXNBdmFpbGFibGUgPSB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbcGFydEluZGV4XTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBmcmFtZXNBdmFpbGFibGUgPSB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbcGFydEluZGV4XTsKICAgICAgICAgaWYgKGZyYW1lc0F2YWlsYWJsZSA8PSAwKSBicmVhazsKIAogICAgICAgICBpZiAoZnJhbWVzVG9Qcm9jZXNzID4gZnJhbWVzQXZhaWxhYmxlKSB7CiAgICAgICAgICAgICBmcmFtZXNUb1Byb2Nlc3MgPSBmcmFtZXNBdmFpbGFibGU7CiAgICAgICAgIH0KIAotICAgICAgICBpbnQzMl90IG51bUJ5dGVzID0gZ2V0Qnl0ZXNQZXJGcmFtZSgpICogZnJhbWVzVG9Qcm9jZXNzOwotICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICAgICAgY29uc3QgaW50MzJfdCBudW1CeXRlcyA9IGdldEJ5dGVzUGVyRnJhbWUoKSAqIGZyYW1lc1RvUHJvY2VzczsKKyAgICAgICAgY29uc3QgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogZ2V0U2FtcGxlc1BlckZyYW1lKCk7CiAKKyAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3Qgc291cmNlRm9ybWF0ID0gZ2V0RGV2aWNlRm9ybWF0KCk7CisgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGRlc3RpbmF0aW9uRm9ybWF0ID0gZ2V0Rm9ybWF0KCk7CiAgICAgICAgIC8vIFRPRE8gZmFjdG9yIHRoaXMgb3V0IGludG8gYSB1dGlsaXR5IGZ1bmN0aW9uCi0gICAgICAgIGlmIChnZXREZXZpY2VGb3JtYXQoKSA9PSBnZXRGb3JtYXQoKSkgeworICAgICAgICBpZiAoc291cmNlRm9ybWF0ID09IGRlc3RpbmF0aW9uRm9ybWF0KSB7CiAgICAgICAgICAgICBtZW1jcHkoZGVzdGluYXRpb24sIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwgbnVtQnl0ZXMpOwotICAgICAgICB9IGVsc2UgaWYgKGdldERldmljZUZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0kxNgotICAgICAgICAgICAgICAgICAgICYmIGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdCgKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAorICAgICAgICB9IGVsc2UgaWYgKHNvdXJjZUZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgICAgICAgICAgICAgICAgICYmIGRlc3RpbmF0aW9uRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNigKICAgICAgICAgICAgICAgICAgICAgKGZsb2F0ICopIGRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAxLjBmKTsKLSAgICAgICAgfSBlbHNlIGlmIChnZXREZXZpY2VGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVAotICAgICAgICAgICAgICAgICAgICYmIGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoCi0gICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCisgICAgICAgICAgICAgICAgICAgIChjb25zdCBpbnQxNl90ICopIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyk7CisgICAgICAgIH0gZWxzZSBpZiAoc291cmNlRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKKyAgICAgICAgICAgICAgICAgICAmJiBkZXN0aW5hdGlvbkZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgeworICAgICAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KAogICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgMS4wZik7CisgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSB3cmFwcGluZ0J1ZmZlci5kYXRhW3BhcnRJbmRleF0sCisgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIkZvcm1hdCBjb252ZXJzaW9uIG5vdCBzdXBwb3J0ZWQhIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoKSAtIEZvcm1hdCBjb252ZXJzaW9uIG5vdCBzdXBwb3J0ZWQhIGF1ZGlvX2Zvcm1hdF90IHNvdXJjZSA9ICV1LCBkZXN0ID0gJXUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzb3VyY2VGb3JtYXQsIGRlc3RpbmF0aW9uRm9ybWF0KTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9GT1JNQVQ7CiAgICAgICAgIH0KICAgICAgICAgZGVzdGluYXRpb24gKz0gbnVtQnl0ZXM7CkBAIC0yMDgsMTcgKzIxNCwxMiBAQAogfQogCiBpbnQ2NF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxDYXB0dXJlOjpnZXRGcmFtZXNXcml0dGVuKCkgewotICAgIGludDY0X3QgZnJhbWVzV3JpdHRlbkhhcmR3YXJlOwotICAgIGlmIChpc0FjdGl2ZSgpKSB7Ci0gICAgICAgIGZyYW1lc1dyaXR0ZW5IYXJkd2FyZSA9IG1DbG9ja01vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcmFtZXNXcml0dGVuSGFyZHdhcmUgPSBtQXVkaW9FbmRwb2ludC5nZXREYXRhV3JpdGVDb3VudGVyKCk7Ci0gICAgfQotICAgIC8vIFByZXZlbnQgcmV0cm9ncmFkZSBtb3Rpb24uCisgICAgY29uc3QgaW50NjRfdCBmcmFtZXNXcml0dGVuSGFyZHdhcmUgPSBpc0Nsb2NrTW9kZWxJbkNvbnRyb2woKQorICAgICAgICAgICAgPyBtQ2xvY2tNb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24oQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSkKKyAgICAgICAgICAgIDogbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVdyaXRlQ291bnRlcigpOworICAgIC8vIEFkZCBzZXJ2aWNlIG9mZnNldCBhbmQgcHJldmVudCByZXRyb2dyYWRlIG1vdGlvbi4KICAgICBtTGFzdEZyYW1lc1dyaXR0ZW4gPSBzdGQ6Om1heChtTGFzdEZyYW1lc1dyaXR0ZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzV3JpdHRlbkhhcmR3YXJlICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlKTsKLSAgICAvL0FMT0dEKCJnZXRGcmFtZXNXcml0dGVuKCkgcmV0dXJucyAlbGxkIiwKLSAgICAvLyAgICAgIChsb25nIGxvbmcpbUxhc3RGcmFtZXNXcml0dGVuKTsKICAgICByZXR1cm4gbUxhc3RGcmFtZXNXcml0dGVuOwogfQogCkBAIC0yNTYsNyArMjU3LDggQEAKICAgICAgICAgY2FsbGJhY2tSZXN1bHQgPSBtYXliZUNhbGxEYXRhQ2FsbGJhY2sobUNhbGxiYWNrQnVmZmVyLCBtQ2FsbGJhY2tGcmFtZXMpOwogCiAgICAgICAgIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1ApIHsKLSAgICAgICAgICAgIEFMT0dEKCJjYWxsYmFjayByZXR1cm5lZCBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AiKTsKKyAgICAgICAgICAgIEFMT0dEKCIlcygpOiBjYWxsYmFjayByZXR1cm5lZCBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXN1bHQgPSBzeXN0ZW1TdG9wRnJvbUNhbGxiYWNrKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmNwcAppbmRleCA3OTViYTJjLi5iOGVmMjQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuY3BwCkBAIC00MywxMyArNDMsMjIgQEAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6b3Blbihjb25zdCBBdWRpb1N0cmVhbUJ1aWxkZXIgJmJ1aWxkZXIpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQXVkaW9TdHJlYW1JbnRlcm5hbDo6b3BlbihidWlsZGVyKTsKICAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICByZXN1bHQgPSBtRmxvd0dyYXBoLmNvbmZpZ3VyZShnZXRGb3JtYXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2FtcGxlc1BlckZyYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZUZvcm1hdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VDaGFubmVsQ291bnQoKSk7CisKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIGNsb3NlKCk7CisgICAgICAgIH0KICAgICAgICAgLy8gU2FtcGxlIHJhdGUgaXMgY29uc3RyYWluZWQgdG8gY29tbW9uIHZhbHVlcyBieSBub3cgYW5kIHNob3VsZCBub3Qgb3ZlcmZsb3cuCiAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzID0ga1JhbXBNU2VjICogZ2V0U2FtcGxlUmF0ZSgpIC8gQUFVRElPX01JTExJU19QRVJfU0VDT05EOwotICAgICAgICBtVm9sdW1lUmFtcC5zZXRMZW5ndGhJbkZyYW1lcyhudW1GcmFtZXMpOworICAgICAgICBtRmxvd0dyYXBoLnNldFJhbXBMZW5ndGhJbkZyYW1lcyhudW1GcmFtZXMpOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQogCisvLyBUaGlzIG11c3QgYmUgY2FsbGVkIHVuZGVyIG1TdHJlYW1Mb2NrLgogYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpyZXF1ZXN0UGF1c2UoKQogewogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzdG9wQ2FsbGJhY2soKTsKQEAgLTU3LDE5ICs2NiwxOSBAQAogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KICAgICBpZiAobVNlcnZpY2VTdHJlYW1IYW5kbGUgPT0gQUFVRElPX0hBTkRMRV9JTlZBTElEKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpIG1TZXJ2aWNlU3RyZWFtSGFuZGxlIGludmFsaWQiLCBfX2Z1bmNfXyk7CisgICAgICAgIEFMT0dXKCIlcygpIG1TZXJ2aWNlU3RyZWFtSGFuZGxlIGludmFsaWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKICAgICBtQ2xvY2tNb2RlbC5zdG9wKEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkpOwogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0lORyk7Ci0gICAgbUF0b21pY1RpbWVzdGFtcC5jbGVhcigpOworICAgIG1BdG9taWNJbnRlcm5hbFRpbWVzdGFtcC5jbGVhcigpOwogICAgIHJldHVybiBtU2VydmljZUludGVyZmFjZS5wYXVzZVN0cmVhbShtU2VydmljZVN0cmVhbUhhbmRsZSk7CiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbUludGVybmFsUGxheTo6cmVxdWVzdEZsdXNoKCkgewogICAgIGlmIChtU2VydmljZVN0cmVhbUhhbmRsZSA9PSBBQVVESU9fSEFORExFX0lOVkFMSUQpIHsKLSAgICAgICAgQUxPR0UoIiVzKCkgbVNlcnZpY2VTdHJlYW1IYW5kbGUgaW52YWxpZCIsIF9fZnVuY19fKTsKKyAgICAgICAgQUxPR1coIiVzKCkgbVNlcnZpY2VTdHJlYW1IYW5kbGUgaW52YWxpZCIsIF9fZnVuY19fKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIApAQCAtMjE2LDIyICsyMjUsMTAgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgaW50MzJfdCBudW1CeXRlcyA9IGdldEJ5dGVzUGVyRnJhbWUoKSAqIGZyYW1lc1RvV3JpdGU7Ci0gICAgICAgICAgICAvLyBEYXRhIGNvbnZlcnNpb24uCi0gICAgICAgICAgICBmbG9hdCBsZXZlbEZyb207Ci0gICAgICAgICAgICBmbG9hdCBsZXZlbFRvOwotICAgICAgICAgICAgbVZvbHVtZVJhbXAubmV4dFNlZ21lbnQoZnJhbWVzVG9Xcml0ZSwgJmxldmVsRnJvbSwgJmxldmVsVG8pOwogCi0gICAgICAgICAgICBBQXVkaW9EYXRhQ29udmVydGVyOjpGb3JtYXR0ZWREYXRhIHNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKilieXRlQnVmZmVyLAotICAgICAgICAgICAgICAgICAgICBnZXRGb3JtYXQoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0U2FtcGxlc1BlckZyYW1lKCkpOwotICAgICAgICAgICAgQUF1ZGlvRGF0YUNvbnZlcnRlcjo6Rm9ybWF0dGVkRGF0YSBkZXN0aW5hdGlvbigKLSAgICAgICAgICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXIuZGF0YVtwYXJ0SW5kZXhdLAotICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JtYXQoKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlQ2hhbm5lbENvdW50KCkpOwotCi0gICAgICAgICAgICBBQXVkaW9EYXRhQ29udmVydGVyOjpjb252ZXJ0KHNvdXJjZSwgZGVzdGluYXRpb24sIGZyYW1lc1RvV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwgbGV2ZWxUbyk7CisgICAgICAgICAgICBtRmxvd0dyYXBoLnByb2Nlc3MoKHZvaWQgKilieXRlQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyYXBwaW5nQnVmZmVyLmRhdGFbcGFydEluZGV4XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNUb1dyaXRlKTsKIAogICAgICAgICAgICAgYnl0ZUJ1ZmZlciArPSBudW1CeXRlczsKICAgICAgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzVG9Xcml0ZTsKQEAgLTI0NiwyNyArMjQzLDE3IEBACiAgICAgcmV0dXJuIGZyYW1lc1dyaXR0ZW47CiB9CiAKLWludDY0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OmdldEZyYW1lc1JlYWQoKQotewotICAgIGludDY0X3QgZnJhbWVzUmVhZEhhcmR3YXJlOwotICAgIGlmIChpc0FjdGl2ZSgpKSB7Ci0gICAgICAgIGZyYW1lc1JlYWRIYXJkd2FyZSA9IG1DbG9ja01vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihBdWRpb0Nsb2NrOjpnZXROYW5vc2Vjb25kcygpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBmcmFtZXNSZWFkSGFyZHdhcmUgPSBtQXVkaW9FbmRwb2ludC5nZXREYXRhUmVhZENvdW50ZXIoKTsKLSAgICB9Ci0gICAgaW50NjRfdCBmcmFtZXNSZWFkID0gZnJhbWVzUmVhZEhhcmR3YXJlICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlOwotICAgIC8vIFByZXZlbnQgcmV0cm9ncmFkZSBtb3Rpb24uCi0gICAgaWYgKGZyYW1lc1JlYWQgPCBtTGFzdEZyYW1lc1JlYWQpIHsKLSAgICAgICAgZnJhbWVzUmVhZCA9IG1MYXN0RnJhbWVzUmVhZDsKLSAgICB9IGVsc2UgewotICAgICAgICBtTGFzdEZyYW1lc1JlYWQgPSBmcmFtZXNSZWFkOwotICAgIH0KLSAgICByZXR1cm4gZnJhbWVzUmVhZDsKK2ludDY0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OmdldEZyYW1lc1JlYWQoKSB7CisgICAgY29uc3QgaW50NjRfdCBmcmFtZXNSZWFkSGFyZHdhcmUgPSBpc0Nsb2NrTW9kZWxJbkNvbnRyb2woKQorICAgICAgICAgICAgPyBtQ2xvY2tNb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24oQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSkKKyAgICAgICAgICAgIDogbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVJlYWRDb3VudGVyKCk7CisgICAgLy8gQWRkIHNlcnZpY2Ugb2Zmc2V0IGFuZCBwcmV2ZW50IHJldHJvZ3JhZGUgbW90aW9uLgorICAgIG1MYXN0RnJhbWVzUmVhZCA9IHN0ZDo6bWF4KG1MYXN0RnJhbWVzUmVhZCwgZnJhbWVzUmVhZEhhcmR3YXJlICsgbUZyYW1lc09mZnNldEZyb21TZXJ2aWNlKTsKKyAgICByZXR1cm4gbUxhc3RGcmFtZXNSZWFkOwogfQogCi1pbnQ2NF90IEF1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5OjpnZXRGcmFtZXNXcml0dGVuKCkKLXsKLSAgICBpbnQ2NF90IGZyYW1lc1dyaXR0ZW4gPSBtQXVkaW9FbmRwb2ludC5nZXREYXRhV3JpdGVDb3VudGVyKCkKK2ludDY0X3QgQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXk6OmdldEZyYW1lc1dyaXR0ZW4oKSB7CisgICAgY29uc3QgaW50NjRfdCBmcmFtZXNXcml0dGVuID0gbUF1ZGlvRW5kcG9pbnQuZ2V0RGF0YVdyaXRlQ291bnRlcigpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtRnJhbWVzT2Zmc2V0RnJvbVNlcnZpY2U7CiAgICAgcmV0dXJuIGZyYW1lc1dyaXR0ZW47CiB9CkBAIC0yOTcsNyArMjg0LDggQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChjYWxsYmFja1Jlc3VsdCA9PSBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1ApIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcygpOiBjYWxsYmFjayByZXR1cm5lZCBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1AiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBBTE9HRCgiJXMoKTogY2FsbGJhY2sgcmV0dXJuZWQgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmVzdWx0ID0gc3lzdGVtU3RvcEZyb21DYWxsYmFjaygpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICB9CkBAIC0zMTMsNiArMzAxLDYgQEAKICAgICBmbG9hdCBjb21iaW5lZFZvbHVtZSA9IG1TdHJlYW1Wb2x1bWUgKiBnZXREdWNrQW5kTXV0ZVZvbHVtZSgpOwogICAgIEFMT0dEKCIlcygpIG1TdHJlYW1Wb2x1bWUgKiBkdWNrQW5kTXV0ZVZvbHVtZSA9ICVmICogJWYgPSAlZiIsCiAgICAgICAgICAgX19mdW5jX18sIG1TdHJlYW1Wb2x1bWUsIGdldER1Y2tBbmRNdXRlVm9sdW1lKCksIGNvbWJpbmVkVm9sdW1lKTsKLSAgICBtVm9sdW1lUmFtcC5zZXRUYXJnZXQoY29tYmluZWRWb2x1bWUpOworICAgIG1GbG93R3JhcGguc2V0VGFyZ2V0Vm9sdW1lKGNvbWJpbmVkVm9sdW1lKTsKICAgICByZXR1cm4gYW5kcm9pZDo6Tk9fRVJST1I7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaAppbmRleCA5NzdhOTA5Li5jYWIyOTQyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9BdWRpb1N0cmVhbUludGVybmFsUGxheS5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWxQbGF5LmgKQEAgLTIxLDYgKzIxLDcgQEAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CiAKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb1NlcnZpY2VJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjbGllbnQvQUF1ZGlvRmxvd0dyYXBoLmgiCiAjaW5jbHVkZSAiY2xpZW50L0F1ZGlvU3RyZWFtSW50ZXJuYWwuaCIKIAogdXNpbmcgYW5kcm9pZDo6c3A7CkBAIC05Myw3ICs5NCw3IEBACiAKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgbUxhc3RGcmFtZXNSZWFkID0gMDsgLy8gdXNlZCB0byBwcmV2ZW50IHJldHJvZ3JhZGUgbW90aW9uCiAKLSAgICBMaW5lYXJSYW1wICAgICAgICAgICAgICAgbVZvbHVtZVJhbXA7CisgICAgQUF1ZGlvRmxvd0dyYXBoICAgICAgICAgIG1GbG93R3JhcGg7CiAKIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuY3BwCmluZGV4IDk1YjUyYmUuLjlhYmRmNTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY2xpZW50L0lzb2Nocm9ub3VzQ2xvY2tNb2RlbC5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmNwcApAQCAtMTksMTIgKzE5LDExIEBACiAjaW5jbHVkZSA8bG9nL2xvZy5oPgogCiAjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgogCiAjaW5jbHVkZSAidXRpbGl0eS9BdWRpb0Nsb2NrLmgiCiAjaW5jbHVkZSAiSXNvY2hyb25vdXNDbG9ja01vZGVsLmgiCiAKLSNkZWZpbmUgTUlOX0xBVEVORVNTX05BTk9TICgxMCAqIEFBVURJT19OQU5PU19QRVJfTUlDUk9TRUNPTkQpCi0KIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CiAKIElzb2Nocm9ub3VzQ2xvY2tNb2RlbDo6SXNvY2hyb25vdXNDbG9ja01vZGVsKCkKQEAgLTMyLDcgKzMxLDcgQEAKICAgICAgICAgLCBtTWFya2VyTmFub1RpbWUoMCkKICAgICAgICAgLCBtU2FtcGxlUmF0ZSg0ODAwMCkKICAgICAgICAgLCBtRnJhbWVzUGVyQnVyc3QoNjQpCi0gICAgICAgICwgbU1heExhdGVuZXNzSW5OYW5vcygwKQorICAgICAgICAsIG1NYXhNZWFzdXJlZExhdGVuZXNzTmFub3MoMCkKICAgICAgICAgLCBtU3RhdGUoU1RBVEVfU1RPUFBFRCkKIHsKIH0KQEAgLTQxLDggKzQwLDcgQEAKIH0KIAogdm9pZCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OnNldFBvc2l0aW9uQW5kVGltZShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDY0X3QgbmFub1RpbWUpIHsKLSAgICBBTE9HVigic2V0UG9zaXRpb25BbmRUaW1lKCVsbGQsICVsbGQpIiwKLSAgICAgICAgICAobG9uZyBsb25nKSBmcmFtZVBvc2l0aW9uLCAobG9uZyBsb25nKSBuYW5vVGltZSk7CisgICAgQUxPR1YoInNldFBvc2l0aW9uQW5kVGltZSwgJWxsZCwgJWxsZCIsIChsb25nIGxvbmcpIGZyYW1lUG9zaXRpb24sIChsb25nIGxvbmcpIG5hbm9UaW1lKTsKICAgICBtTWFya2VyRnJhbWVQb3NpdGlvbiA9IGZyYW1lUG9zaXRpb247CiAgICAgbU1hcmtlck5hbm9UaW1lID0gbmFub1RpbWU7CiB9CkBAIC01NCwyMCArNTIsMjcgQEAKIH0KIAogdm9pZCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OnN0b3AoaW50NjRfdCBuYW5vVGltZSkgewotICAgIEFMT0dWKCJzdG9wKG5hbm9zID0gJWxsZClcbiIsIChsb25nIGxvbmcpIG5hbm9UaW1lKTsKKyAgICBBTE9HRCgic3RvcChuYW5vcyA9ICVsbGQpIG1heCBsYXRlbmVzcyA9ICVkIG1pY3Jvc1xuIiwKKyAgICAgICAgKGxvbmcgbG9uZykgbmFub1RpbWUsCisgICAgICAgIChpbnQpIChtTWF4TWVhc3VyZWRMYXRlbmVzc05hbm9zIC8gMTAwMCkpOwogICAgIHNldFBvc2l0aW9uQW5kVGltZShjb252ZXJ0VGltZVRvUG9zaXRpb24obmFub1RpbWUpLCBuYW5vVGltZSk7CiAgICAgLy8gVE9ETyBzaG91bGQgd2Ugc2V0IHBvc2l0aW9uPwogICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7CiB9CiAKLWJvb2wgSXNvY2hyb25vdXNDbG9ja01vZGVsOjppc1N0YXJ0aW5nKCkgeworYm9vbCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OmlzU3RhcnRpbmcoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1TdGF0ZSA9PSBTVEFURV9TVEFSVElORzsKIH0KIAorYm9vbCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OmlzUnVubmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX1JVTk5JTkc7Cit9CisKIHZvaWQgSXNvY2hyb25vdXNDbG9ja01vZGVsOjpwcm9jZXNzVGltZXN0YW1wKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50NjRfdCBuYW5vVGltZSkgewotLy8gICAgQUxPR0QoInByb2Nlc3NUaW1lc3RhbXAoKSAtIGZyYW1lUG9zaXRpb24gPSAlbGxkIGF0IG5hbm9UaW1lICVsbHUiLAotLy8gICAgICAgICAobG9uZyBsb25nKWZyYW1lUG9zaXRpb24sCi0vLyAgICAgICAgIChsb25nIGxvbmcpbmFub1RpbWUpOworICAgIG1UaW1lc3RhbXBDb3VudCsrOworLy8gTG9nIHBvc2l0aW9uIGFuZCB0aW1lIGluIENTViBmb3JtYXQgc28gd2UgY2FuIGltcG9ydCBpdCBlYXNpbHkgaW50byBzcHJlYWRzaGVldHMuCisgICAgLy9BTE9HRCgiJXMoKSBDU1YsICVkLCAlbGxkLCAlbGxkIiwgX19mdW5jX18sCisgICAgICAgICAgLy9tVGltZXN0YW1wQ291bnQsIChsb25nIGxvbmcpZnJhbWVQb3NpdGlvbiwgKGxvbmcgbG9uZyluYW5vVGltZSk7CiAgICAgaW50NjRfdCBmcmFtZXNEZWx0YSA9IGZyYW1lUG9zaXRpb24gLSBtTWFya2VyRnJhbWVQb3NpdGlvbjsKICAgICBpbnQ2NF90IG5hbm9zRGVsdGEgPSBuYW5vVGltZSAtIG1NYXJrZXJOYW5vVGltZTsKICAgICBpZiAobmFub3NEZWx0YSA8IDEwMDApIHsKQEAgLTEwNCwxNyArMTA5LDU2IEBACiAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgogICAgICAgICBpZiAobmFub3NEZWx0YSA8IGV4cGVjdGVkTmFub3NEZWx0YSkgewogICAgICAgICAgICAgLy8gRWFybGllciB0aGFuIGV4cGVjdGVkIHRpbWVzdGFtcC4KLSAgICAgICAgICAgIC8vIFRoaXMgZGF0YSBpcyBwcm9iYWJseSBtb3JlIGFjY3VyYXRlIHNvIHVzZSBpdC4KLSAgICAgICAgICAgIC8vIG9yIHdlIG1heSBiZSBkcmlmdGluZyBkdWUgdG8gYSBzbG93IEhXIGNsb2NrLgotLy8gICAgICAgICAgICBBTE9HRCgicHJvY2Vzc1RpbWVzdGFtcCgpIC0gU1RBVEVfUlVOTklORyAtICVkIDwgJWQgbWljcm9zIC0gRUFSTFkiLAotLy8gICAgICAgICAgICAgICAgIChpbnQpIChuYW5vc0RlbHRhIC8gMTAwMCksIChpbnQpKGV4cGVjdGVkTmFub3NEZWx0YSAvIDEwMDApKTsKKyAgICAgICAgICAgIC8vIFRoaXMgZGF0YSBpcyBwcm9iYWJseSBtb3JlIGFjY3VyYXRlLCBzbyB1c2UgaXQuCisgICAgICAgICAgICAvLyBPciB3ZSBtYXkgYmUgZHJpZnRpbmcgZHVlIHRvIGEgZmFzdCBIVyBjbG9jay4KKyAgICAgICAgICAgIC8vaW50IG1pY3Jvc0RlbHRhID0gKGludCkgKG5hbm9zRGVsdGEgLyAxMDAwKTsKKyAgICAgICAgICAgIC8vaW50IGV4cGVjdGVkTWljcm9zRGVsdGEgPSAoaW50KSAoZXhwZWN0ZWROYW5vc0RlbHRhIC8gMTAwMCk7CisgICAgICAgICAgICAvL0FMT0dEKCIlcygpIC0gU1RBVEVfUlVOTklORyAtICMlZCwgJTRkIG1pY3JvcyBFQVJMWSIsCisgICAgICAgICAgICAgICAgLy9fX2Z1bmNfXywgbVRpbWVzdGFtcENvdW50LCBleHBlY3RlZE1pY3Jvc0RlbHRhIC0gbWljcm9zRGVsdGEpOworCiAgICAgICAgICAgICBzZXRQb3NpdGlvbkFuZFRpbWUoZnJhbWVQb3NpdGlvbiwgbmFub1RpbWUpOwotICAgICAgICB9IGVsc2UgaWYgKG5hbm9zRGVsdGEgPiAoZXhwZWN0ZWROYW5vc0RlbHRhICsgbU1heExhdGVuZXNzSW5OYW5vcykpIHsKLSAgICAgICAgICAgIC8vIExhdGVyIHRoYW4gZXhwZWN0ZWQgdGltZXN0YW1wLgotLy8gICAgICAgICAgICBBTE9HRCgicHJvY2Vzc1RpbWVzdGFtcCgpIC0gU1RBVEVfUlVOTklORyAtICVkID4gJWQgKyAlZCBtaWNyb3MgLSBMQVRFIiwKLS8vICAgICAgICAgICAgICAgICAoaW50KSAobmFub3NEZWx0YSAvIDEwMDApLCAoaW50KShleHBlY3RlZE5hbm9zRGVsdGEgLyAxMDAwKSwKLS8vICAgICAgICAgICAgICAgICAoaW50KSAobU1heExhdGVuZXNzSW5OYW5vcyAvIDEwMDApKTsKLSAgICAgICAgICAgIHNldFBvc2l0aW9uQW5kVGltZShmcmFtZVBvc2l0aW9uIC0gbUZyYW1lc1BlckJ1cnN0LCAgbmFub1RpbWUgLSBtTWF4TGF0ZW5lc3NJbk5hbm9zKTsKKyAgICAgICAgfSBlbHNlIGlmIChuYW5vc0RlbHRhID4gKGV4cGVjdGVkTmFub3NEZWx0YSArICgyICogbUJ1cnN0UGVyaW9kTmFub3MpKSkgeworICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHdlIGRvIG5vdCB1cGRhdGUgbU1heE1lYXN1cmVkTGF0ZW5lc3NOYW5vcyBiZWNhdXNlIGl0CisgICAgICAgICAgICAvLyB3b3VsZCBmb3JjZSBpdCB0b28gaGlnaC4KKyAgICAgICAgICAgIC8vIG1NYXhNZWFzdXJlZExhdGVuZXNzTmFub3Mgc2hvdWxkIHJhbmdlIGZyb20gMSB0byAyICogbUJ1cnN0UGVyaW9kTmFub3MKKyAgICAgICAgICAgIC8vaW50MzJfdCBtZWFzdXJlZExhdGVuZXNzTmFub3MgPSAoaW50MzJfdCkobmFub3NEZWx0YSAtIGV4cGVjdGVkTmFub3NEZWx0YSk7CisgICAgICAgICAgICAvL0FMT0dEKCIlcygpIC0gU1RBVEVfUlVOTklORyAtICMlZCwgbGF0ZW5lc3MgJWQgLSBtYXggJWQgPSAlNGQgbWljcm9zIFZFUlkgTEFURSIsCisgICAgICAgICAgICAgICAgICAvL19fZnVuY19fLAorICAgICAgICAgICAgICAgICAgLy9tVGltZXN0YW1wQ291bnQsCisgICAgICAgICAgICAgICAgICAvL21lYXN1cmVkTGF0ZW5lc3NOYW5vcyAvIDEwMDAsCisgICAgICAgICAgICAgICAgICAvL21NYXhNZWFzdXJlZExhdGVuZXNzTmFub3MgLyAxMDAwLAorICAgICAgICAgICAgICAgICAgLy8obWVhc3VyZWRMYXRlbmVzc05hbm9zIC0gbU1heE1lYXN1cmVkTGF0ZW5lc3NOYW5vcykgLyAxMDAwCisgICAgICAgICAgICAgICAgICAvLyk7CisKKyAgICAgICAgICAgIC8vIFRoaXMgdHlwaWNhbGx5IGhhcHBlbnMgd2hlbiB3ZSBhcmUgbW9kZWxsaW5nIGEgc2VydmljZSBpbnN0ZWFkIG9mIGEgRFNQLgorICAgICAgICAgICAgc2V0UG9zaXRpb25BbmRUaW1lKGZyYW1lUG9zaXRpb24sICBuYW5vVGltZSAtICgyICogbUJ1cnN0UGVyaW9kTmFub3MpKTsKKyAgICAgICAgfSBlbHNlIGlmIChuYW5vc0RlbHRhID4gKGV4cGVjdGVkTmFub3NEZWx0YSArIG1NYXhNZWFzdXJlZExhdGVuZXNzTmFub3MpKSB7CisgICAgICAgICAgICAvL2ludDMyX3QgcHJldmlvdXNMYXRlbmVzc05hbm9zID0gbU1heE1lYXN1cmVkTGF0ZW5lc3NOYW5vczsKKyAgICAgICAgICAgIG1NYXhNZWFzdXJlZExhdGVuZXNzTmFub3MgPSAoaW50MzJfdCkobmFub3NEZWx0YSAtIGV4cGVjdGVkTmFub3NEZWx0YSk7CisKKyAgICAgICAgICAgIC8vQUxPR0QoIiVzKCkgLSBTVEFURV9SVU5OSU5HIC0gIyVkLCBuZXdtYXggJWQgLSBvbGRtYXggJWQgPSAlNGQgbWljcm9zIExBVEUiLAorICAgICAgICAgICAgICAgICAgLy9fX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgIC8vbVRpbWVzdGFtcENvdW50LAorICAgICAgICAgICAgICAgICAgLy9tTWF4TWVhc3VyZWRMYXRlbmVzc05hbm9zIC8gMTAwMCwKKyAgICAgICAgICAgICAgICAgIC8vcHJldmlvdXNMYXRlbmVzc05hbm9zIC8gMTAwMCwKKyAgICAgICAgICAgICAgICAgIC8vKG1NYXhNZWFzdXJlZExhdGVuZXNzTmFub3MgLSBwcmV2aW91c0xhdGVuZXNzTmFub3MpIC8gMTAwMAorICAgICAgICAgICAgICAgICAgLy8pOworCisgICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBsYXRlLCBpdCBtYXkgYmUgYmVjYXVzZSBvZiBwcmVlbXB0aW9uIGluIHRoZSBrZXJuZWwsCisgICAgICAgICAgICAvLyBvciB0aW1pbmcgaml0dGVyIGNhdXNlZCBieSByZXNhbXBsaW5nIGluIHRoZSBEU1AsCisgICAgICAgICAgICAvLyBvciB3ZSBtYXkgYmUgZHJpZnRpbmcgZHVlIHRvIGEgc2xvdyBIVyBjbG9jay4KKyAgICAgICAgICAgIC8vIFdlIGFkZCBzbGlnaHQgZHJpZnQgdmFsdWUganVzdCBpbiBjYXNlIHRoZXJlIGlzIGFjdHVhbCBsb25nIHRlcm0gZHJpZnQKKyAgICAgICAgICAgIC8vIGZvcndhcmQgY2F1c2VkIGJ5IGEgc2xvd2VyIGNsb2NrLgorICAgICAgICAgICAgLy8gSWYgdGhlIGNsb2NrIGlzIGZhc3RlciB0aGFuIHRoZSBtb2RlbCB3aWxsIGdldCBwdXNoZWQgZWFybGllcgorICAgICAgICAgICAgLy8gYnkgdGhlIGNvZGUgaW4gdGhlIHByZWNlZGluZyBicmFuY2guCisgICAgICAgICAgICAvLyBUaGUgdHdvIG9wcG9zaW5nIGZvcmNlcyBzaG91bGQgYWxsb3cgdGhlIG1vZGVsIHRvIHRyYWNrIHRoZSByZWFsIGNsb2NrCisgICAgICAgICAgICAvLyBvdmVyIGEgbG9uZyB0aW1lLgorICAgICAgICAgICAgaW50NjRfdCBkcmlmdGluZ1RpbWUgPSBtTWFya2VyTmFub1RpbWUgKyBleHBlY3RlZE5hbm9zRGVsdGEgKyBrRHJpZnROYW5vczsKKyAgICAgICAgICAgIHNldFBvc2l0aW9uQW5kVGltZShmcmFtZVBvc2l0aW9uLCAgZHJpZnRpbmdUaW1lKTsKKyAgICAgICAgICAgIC8vQUxPR0QoIiVzKCkgLSAjJWQsIG1heCBsYXRlbmVzcyA9ICVkIG1pY3JvcyIsCisgICAgICAgICAgICAgICAgICAvL19fZnVuY19fLAorICAgICAgICAgICAgICAgICAgLy9tVGltZXN0YW1wQ291bnQsCisgICAgICAgICAgICAgICAgICAvLyhpbnQpIChtTWF4TWVhc3VyZWRMYXRlbmVzc05hbm9zIC8gMTAwMCkpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CkBAIC0xMzQsOSArMTc4LDEyIEBACiAgICAgdXBkYXRlKCk7CiB9CiAKKy8vIFVwZGF0ZSBleHBlY3RlZCBsYXRlbmVzcyBiYXNlZCBvbiBzYW1wbGVSYXRlIGFuZCBmcmFtZXNQZXJCdXJzdAogdm9pZCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OnVwZGF0ZSgpIHsKLSAgICBpbnQ2NF90IG5hbm9zTGF0ZSA9IGNvbnZlcnREZWx0YVBvc2l0aW9uVG9UaW1lKG1GcmFtZXNQZXJCdXJzdCk7IC8vIHVzZXMgbVNhbXBsZVJhdGUKLSAgICBtTWF4TGF0ZW5lc3NJbk5hbm9zID0gKG5hbm9zTGF0ZSA+IE1JTl9MQVRFTkVTU19OQU5PUykgPyBuYW5vc0xhdGUgOiBNSU5fTEFURU5FU1NfTkFOT1M7CisgICAgbUJ1cnN0UGVyaW9kTmFub3MgPSBjb252ZXJ0RGVsdGFQb3NpdGlvblRvVGltZShtRnJhbWVzUGVyQnVyc3QpOyAvLyB1c2VzIG1TYW1wbGVSYXRlCisgICAgLy8gVGltZXN0YW1wcyBtYXkgYmUgbGF0ZSBieSB1cCB0byBhIGJ1cnN0IGJlY2F1c2Ugd2UgYXJlIHJhbmRvbWx5IHNhbXBsaW5nIHRoZSB0aW1lIHBlcmlvZAorICAgIC8vIGFmdGVyIHRoZSBEU1AgcG9zaXRpb24gaXMgYWN0dWFsbHkgdXBkYXRlZC4KKyAgICBtTWF4TWVhc3VyZWRMYXRlbmVzc05hbm9zID0gbUJ1cnN0UGVyaW9kTmFub3M7CiB9CiAKIGludDY0X3QgSXNvY2hyb25vdXNDbG9ja01vZGVsOjpjb252ZXJ0RGVsdGFQb3NpdGlvblRvVGltZShpbnQ2NF90IGZyYW1lc0RlbHRhKSBjb25zdCB7CkBAIC0xNzksMTEgKzIyNiwyNSBAQAogICAgIHJldHVybiBwb3NpdGlvbjsKIH0KIAoraW50MzJfdCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OmdldExhdGVUaW1lT2Zmc2V0TmFub3MoKSBjb25zdCB7CisgICAgLy8gVGhpcyB3aWxsIG5ldmVyIGJlIDwgMCBiZWNhdXNlIG1NYXhMYXRlbmVzc05hbm9zIHN0YXJ0cyBhdAorICAgIC8vIG1CdXJzdFBlcmlvZE5hbm9zIGFuZCBvbmx5IGdldHMgYmlnZ2VyLgorICAgIHJldHVybiAobU1heE1lYXN1cmVkTGF0ZW5lc3NOYW5vcyAtIG1CdXJzdFBlcmlvZE5hbm9zKSArIGtFeHRyYUxhdGVuZXNzTmFub3M7Cit9CisKK2ludDY0X3QgSXNvY2hyb25vdXNDbG9ja01vZGVsOjpjb252ZXJ0UG9zaXRpb25Ub0xhdGVzdFRpbWUoaW50NjRfdCBmcmFtZVBvc2l0aW9uKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnZlcnRQb3NpdGlvblRvVGltZShmcmFtZVBvc2l0aW9uKSArIGdldExhdGVUaW1lT2Zmc2V0TmFub3MoKTsKK30KKworaW50NjRfdCBJc29jaHJvbm91c0Nsb2NrTW9kZWw6OmNvbnZlcnRMYXRlc3RUaW1lVG9Qb3NpdGlvbihpbnQ2NF90IG5hbm9UaW1lKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnZlcnRUaW1lVG9Qb3NpdGlvbihuYW5vVGltZSAtIGdldExhdGVUaW1lT2Zmc2V0TmFub3MoKSk7Cit9CisKIHZvaWQgSXNvY2hyb25vdXNDbG9ja01vZGVsOjpkdW1wKCkgY29uc3QgewogICAgIEFMT0dEKCJtTWFya2VyRnJhbWVQb3NpdGlvbiA9ICVsbGQiLCAobG9uZyBsb25nKSBtTWFya2VyRnJhbWVQb3NpdGlvbik7CiAgICAgQUxPR0QoIm1NYXJrZXJOYW5vVGltZSAgICAgID0gJWxsZCIsIChsb25nIGxvbmcpIG1NYXJrZXJOYW5vVGltZSk7CiAgICAgQUxPR0QoIm1TYW1wbGVSYXRlICAgICAgICAgID0gJTZkIiwgbVNhbXBsZVJhdGUpOwogICAgIEFMT0dEKCJtRnJhbWVzUGVyQnVyc3QgICAgICA9ICU2ZCIsIG1GcmFtZXNQZXJCdXJzdCk7Ci0gICAgQUxPR0QoIm1NYXhMYXRlbmVzc0luTmFub3MgID0gJTZkIiwgbU1heExhdGVuZXNzSW5OYW5vcyk7CisgICAgQUxPR0QoIm1NYXhNZWFzdXJlZExhdGVuZXNzTmFub3MgPSAlNmQiLCBtTWF4TWVhc3VyZWRMYXRlbmVzc05hbm9zKTsKICAgICBBTE9HRCgibVN0YXRlICAgICAgICAgICAgICAgPSAlNmQiLCBtU3RhdGUpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jbGllbnQvSXNvY2hyb25vdXNDbG9ja01vZGVsLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaAppbmRleCA3MTgyMzc2Li41ODJiZjRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX0FBVURJT19JU09DSFJPTk9VU19DTE9DS19NT0RFTF9ICiAKICNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlICJ1dGlsaXR5L0F1ZGlvQ2xvY2suaCIKIAogbmFtZXNwYWNlIGFhdWRpbyB7CiAKQEAgLTM2LDcgKzM3LDE1IEBACiAgICAgdm9pZCBzdGFydChpbnQ2NF90IG5hbm9UaW1lKTsKICAgICB2b2lkIHN0b3AoaW50NjRfdCBuYW5vVGltZSk7CiAKLSAgICBib29sIGlzU3RhcnRpbmcoKTsKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1vZGVsIGlzIHN0YXJ0aW5nIHVwCisgICAgICovCisgICAgYm9vbCBpc1N0YXJ0aW5nKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIG1vZGVsIGlzIHJ1bm5pbmcgYW5kIHByb2R1Y2luZyB2YWxpZCByZXN1bHRzCisgICAgICovCisgICAgYm9vbCBpc1J1bm5pbmcoKSBjb25zdDsKIAogICAgIHZvaWQgcHJvY2Vzc1RpbWVzdGFtcChpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDY0X3QgbmFub1RpbWUpOwogCkBAIC03MSw2ICs4MCwxNSBAQAogICAgIGludDY0X3QgY29udmVydFBvc2l0aW9uVG9UaW1lKGludDY0X3QgZnJhbWVQb3NpdGlvbikgY29uc3Q7CiAKICAgICAvKioKKyAgICAgKiBDYWxjdWxhdGUgdGhlIGxhdGVzdCBlc3RpbWF0ZWQgdGltZSB0aGF0IHRoZSBzdHJlYW0gd2lsbCBiZSBhdCB0aGF0IHBvc2l0aW9uLgorICAgICAqIFRoZSBtb3JlIGppdHRlcnkgdGhlIGNsb2NrIGlzIHRoZW4gdGhlIGxhdGVyIHRoaXMgd2lsbCBiZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFtZVBvc2l0aW9uCisgICAgICogQHJldHVybiB0aW1lIGluIG5hbm9zZWNvbmRzCisgICAgICovCisgICAgaW50NjRfdCBjb252ZXJ0UG9zaXRpb25Ub0xhdGVzdFRpbWUoaW50NjRfdCBmcmFtZVBvc2l0aW9uKSBjb25zdDsKKworICAgIC8qKgogICAgICAqIENhbGN1bGF0ZSBhbiBlc3RpbWF0ZWQgcG9zaXRpb24gd2hlcmUgdGhlIHN0cmVhbSB3aWxsIGJlIGF0IHRoZSBzcGVjaWZpZWQgdGltZS4KICAgICAgKgogICAgICAqIEBwYXJhbSBuYW5vVGltZSB0aW1lIG9mIGludGVyZXN0CkBAIC03OSw2ICs5NywxOCBAQAogICAgIGludDY0X3QgY29udmVydFRpbWVUb1Bvc2l0aW9uKGludDY0X3QgbmFub1RpbWUpIGNvbnN0OwogCiAgICAgLyoqCisgICAgICogQ2FsY3VsYXRlIHRoZSBjb3JyZXNwb25kaW5nIGVzdGltYXRlZCBwb3NpdGlvbiBiYXNlZCBvbiB0aGUgc3BlY2lmaWVkIHRpbWUgYmVpbmcKKyAgICAgKiB0aGUgbGF0ZXN0IHBvc3NpYmxlIHRpbWUuCisgICAgICoKKyAgICAgKiBGb3IgdGhlIHNhbWUgbmFub1RpbWUsIHRoaXMgbWF5IHJldHVybiBhbiBlYXJsaWVyIHBvc2l0aW9uIHRoYW4KKyAgICAgKiBjb252ZXJ0VGltZVRvUG9zaXRpb24oKS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBuYW5vVGltZQorICAgICAqIEByZXR1cm4gcG9zaXRpb24gaW4gZnJhbWVzCisgICAgICovCisgICAgaW50NjRfdCBjb252ZXJ0TGF0ZXN0VGltZVRvUG9zaXRpb24oaW50NjRfdCBuYW5vVGltZSkgY29uc3Q7CisKKyAgICAvKioKICAgICAgKiBAcGFyYW0gZnJhbWVzRGVsdGEgZGlmZmVyZW5jZSBpbiBmcmFtZXMKICAgICAgKiBAcmV0dXJuIGR1cmF0aW9uIGluIG5hbm9zZWNvbmRzCiAgICAgICovCkBAIC05Myw2ICsxMjMsOSBAQAogICAgIHZvaWQgZHVtcCgpIGNvbnN0OwogCiBwcml2YXRlOgorCisgICAgaW50MzJfdCBnZXRMYXRlVGltZU9mZnNldE5hbm9zKCkgY29uc3Q7CisKICAgICBlbnVtIGNsb2NrX21vZGVsX3N0YXRlX3QgewogICAgICAgICBTVEFURV9TVE9QUEVELAogICAgICAgICBTVEFURV9TVEFSVElORywKQEAgLTEwMCwxMyArMTMzLDIzIEBACiAgICAgICAgIFNUQVRFX1JVTk5JTkcKICAgICB9OwogCisgICAgLy8gQW1vdW50IG9mIHRpbWUgdG8gZHJpZnQgZm9yd2FyZCB3aGVuIHdlIGdldCBhIGxhdGUgdGltZXN0YW1wLgorICAgIC8vIFRoaXMgdmFsdWUgd2FzIGNhbGN1bGF0ZWQgdG8gYWxsb3cgdHJhY2tpbmcgb2YgYSBjbG9jayB3aXRoIDUwIHBwbSBlcnJvci4KKyAgICBzdGF0aWMgY29uc3RleHByIGludDMyX3QgICBrRHJpZnROYW5vcyAgICAgICAgID0gIDEwICogMTAwMDsKKyAgICAvLyBUT0RPIHJldmlldyB2YWx1ZSBvZiBrRXh0cmFMYXRlbmVzc05hbm9zCisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90ICAga0V4dHJhTGF0ZW5lc3NOYW5vcyA9IDEwMCAqIDEwMDA7CisKICAgICBpbnQ2NF90ICAgICAgICAgICAgIG1NYXJrZXJGcmFtZVBvc2l0aW9uOwogICAgIGludDY0X3QgICAgICAgICAgICAgbU1hcmtlck5hbm9UaW1lOwogICAgIGludDMyX3QgICAgICAgICAgICAgbVNhbXBsZVJhdGU7CiAgICAgaW50MzJfdCAgICAgICAgICAgICBtRnJhbWVzUGVyQnVyc3Q7Ci0gICAgaW50MzJfdCAgICAgICAgICAgICBtTWF4TGF0ZW5lc3NJbk5hbm9zOworICAgIGludDMyX3QgICAgICAgICAgICAgbUJ1cnN0UGVyaW9kTmFub3M7CisgICAgLy8gSW5jbHVkZXMgbUJ1cnN0UGVyaW9kTmFub3MgYmVjYXVzZSB3ZSBzYW1wbGUgcmFuZG9tbHkgb3ZlciB0aW1lLgorICAgIGludDMyX3QgICAgICAgICAgICAgbU1heE1lYXN1cmVkTGF0ZW5lc3NOYW5vczsKICAgICBjbG9ja19tb2RlbF9zdGF0ZV90IG1TdGF0ZTsKIAorICAgIGludDMyX3QgICAgICAgICAgICAgbVRpbWVzdGFtcENvdW50ID0gMDsKKwogICAgIHZvaWQgdXBkYXRlKCk7CiB9OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb0F1ZGlvLmNwcAppbmRleCBkZjBkYjc5Li44MDQwZTZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvQXVkaW8uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9BdWRpby5jcHAKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvVGVzdGluZy5oPgogCiAjaW5jbHVkZSAiQXVkaW9DbG9jay5oIgorI2luY2x1ZGUgIkF1ZGlvR2xvYmFsLmgiCiAjaW5jbHVkZSAiQXVkaW9TdHJlYW1CdWlsZGVyLmgiCiAjaW5jbHVkZSAiQXVkaW9TdHJlYW0uaCIKICNpbmNsdWRlICJiaW5kaW5nL0FBdWRpb0NvbW1vbi5oIgpAQCAtNDUsNjMgKzQ2LDE0IEBACiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsgXAogICAgIH0KIAotI2RlZmluZSBBQVVESU9fQ0FTRV9FTlVNKG5hbWUpIGNhc2UgbmFtZTogcmV0dXJuICNuYW1lCi0KIEFBVURJT19BUEkgY29uc3QgY2hhciAqIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KGFhdWRpb19yZXN1bHRfdCByZXR1cm5Db2RlKSB7Ci0gICAgc3dpdGNoIChyZXR1cm5Db2RlKSB7Ci0gICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX09LKTsKLSAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fRVJST1JfRElTQ09OTkVDVEVEKTsKLSAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVCk7Ci0gICAgICAgIC8vIHJlc2VydmVkCi0gICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX0VSUk9SX0lOVEVSTkFMKTsKLSAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURSk7Ci0gICAgICAgIC8vIHJlc2VydmVkCi0gICAgICAgIC8vIHJlc2VydmVkCi0gICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX0VSUk9SX0lOVkFMSURfSEFORExFKTsKLSAgICAgICAgIC8vIHJlc2VydmVkCi0gICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX0VSUk9SX1VOSU1QTEVNRU5URUQpOwotICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRSk7Ci0gICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX0VSUk9SX05PX0ZSRUVfSEFORExFUyk7Ci0gICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX0VSUk9SX05PX01FTU9SWSk7Ci0gICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX0VSUk9SX05VTEwpOwotICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19FUlJPUl9USU1FT1VUKTsKLSAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fRVJST1JfV09VTERfQkxPQ0spOwotICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19FUlJPUl9JTlZBTElEX0ZPUk1BVCk7Ci0gICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX0VSUk9SX09VVF9PRl9SQU5HRSk7Ci0gICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX0VSUk9SX05PX1NFUlZJQ0UpOwotICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19FUlJPUl9JTlZBTElEX1JBVEUpOwotICAgIH0KLSAgICByZXR1cm4gIlVucmVjb2duaXplZCBBQXVkaW8gZXJyb3IuIjsKKyAgICByZXR1cm4gQXVkaW9HbG9iYWxfY29udmVydFJlc3VsdFRvVGV4dChyZXR1cm5Db2RlKTsKIH0KIAogQUFVRElPX0FQSSBjb25zdCBjaGFyICogQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChhYXVkaW9fc3RyZWFtX3N0YXRlX3Qgc3RhdGUpIHsKLSAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVEKTsKLSAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fU1RSRUFNX1NUQVRFX1VOS05PV04pOwotICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19TVFJFQU1fU1RBVEVfT1BFTik7Ci0gICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElORyk7Ci0gICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEKTsKLSAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNJTkcpOwotICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEKTsKLSAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNISU5HKTsKLSAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNIRUQpOwotICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpOwotICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRCk7Ci0gICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpOwotICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0lORyk7Ci0gICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpOwotICAgIH0KLSAgICByZXR1cm4gIlVucmVjb2duaXplZCBBQXVkaW8gc3RhdGUuIjsKKyAgICByZXR1cm4gQXVkaW9HbG9iYWxfY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KHN0YXRlKTsKIH0KIAotI3VuZGVmIEFBVURJT19DQVNFX0VOVU0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiBTdGF0aWMgZ2xvYmFscy4KLSAqLwotc3RhdGljIGFhdWRpb19wb2xpY3lfdCBzX01NYXBQb2xpY3kgPSBBQVVESU9fVU5TUEVDSUZJRUQ7Ci0KIHN0YXRpYyBBdWRpb1N0cmVhbSAqY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgcmV0dXJuIChBdWRpb1N0cmVhbSopIHN0cmVhbTsKQEAgLTE0NiwxNCArOTgsMTQgQEAKIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldENoYW5uZWxDb3VudChBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50KQogewotICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOwotICAgIHN0cmVhbUJ1aWxkZXItPnNldFNhbXBsZXNQZXJGcmFtZShjaGFubmVsQ291bnQpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0U2FtcGxlc1BlckZyYW1lKGJ1aWxkZXIsIGNoYW5uZWxDb3VudCk7CiB9CiAKIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZXNQZXJGcmFtZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lKQogewotICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbENvdW50KGJ1aWxkZXIsIGNoYW5uZWxDb3VudCk7CisgICAgQXVkaW9TdHJlYW1CdWlsZGVyICpzdHJlYW1CdWlsZGVyID0gY29udmVydEFBdWRpb0J1aWxkZXJUb1N0cmVhbUJ1aWxkZXIoYnVpbGRlcik7CisgICAgc3RyZWFtQnVpbGRlci0+c2V0U2FtcGxlc1BlckZyYW1lKHNhbXBsZXNQZXJGcmFtZSk7CiB9CiAKIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERpcmVjdGlvbihBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLApAQCAtMTY3LDcgKzExOSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQogewogICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOwotICAgIHN0cmVhbUJ1aWxkZXItPnNldEZvcm1hdChmb3JtYXQpOworICAgIC8vIFVzZSBhdWRpb19mb3JtYXRfdCBldmVyeXdoZXJlIGludGVybmFsbHkuCisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgaW50ZXJuYWxGb3JtYXQgPSBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoZm9ybWF0KTsKKyAgICBzdHJlYW1CdWlsZGVyLT5zZXRGb3JtYXQoaW50ZXJuYWxGb3JtYXQpOwogfQogCiBBQVVESU9fQVBJIHZvaWQgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTaGFyaW5nTW9kZShBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLApAQCAtMjAyLDYgKzE1NiwxMiBAQAogICAgIHN0cmVhbUJ1aWxkZXItPnNldEJ1ZmZlckNhcGFjaXR5KGZyYW1lcyk7CiB9CiAKK0FBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEFsbG93ZWRDYXB0dXJlUG9saWN5KAorICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLCBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IHBvbGljeSkgeworICAgIEF1ZGlvU3RyZWFtQnVpbGRlciAqc3RyZWFtQnVpbGRlciA9IGNvbnZlcnRBQXVkaW9CdWlsZGVyVG9TdHJlYW1CdWlsZGVyKGJ1aWxkZXIpOworICAgIHN0cmVhbUJ1aWxkZXItPnNldEFsbG93ZWRDYXB0dXJlUG9saWN5KHBvbGljeSk7Cit9CisKIEFBVURJT19BUEkgdm9pZCBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNlc3Npb25JZChBQXVkaW9TdHJlYW1CdWlsZGVyKiBidWlsZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zZXNzaW9uX2lkX3Qgc2Vzc2lvbklkKQogewpAQCAtMjM4LDE4ICsxOTgsMjAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUF1ZGlvU3RyZWFtKiogc3RyZWFtUHRyKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IG51bGxwdHI7CisgICAgYWF1ZGlvX3N0cmVhbV9pZF90IGlkID0gMDsKICAgICAvLyBQbGVhc2UgbGVhdmUgdGhlc2UgbG9ncyBiZWNhdXNlIHRoZXkgYXJlIHZlcnkgaGVscGZ1bCB3aGVuIGRlYnVnZ2luZy4KLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkgY2FsbGVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iKTsKKyAgICBBTE9HSSgiJXMoKSBjYWxsZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIsIF9fZnVuY19fKTsKICAgICBBdWRpb1N0cmVhbUJ1aWxkZXIgKnN0cmVhbUJ1aWxkZXIgPSBDT01NT05fR0VUX0ZST01fQlVJTERFUl9PUl9SRVRVUk4oc3RyZWFtUHRyKTsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc3RyZWFtQnVpbGRlci0+YnVpbGQoJmF1ZGlvU3RyZWFtKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtKCkgcmV0dXJucyAlZCA9ICVzIGZvciAoJXApIC0tLS0tLS0tLS0tLS0tLS0iLAotICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSwgYXVkaW9TdHJlYW0pOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CiAgICAgICAgIGF1ZGlvU3RyZWFtLT5yZWdpc3RlclBsYXllckJhc2UoKTsKICAgICAgICAgKnN0cmVhbVB0ciA9IChBQXVkaW9TdHJlYW0qKSBhdWRpb1N0cmVhbTsKKyAgICAgICAgaWQgPSBhdWRpb1N0cmVhbS0+Z2V0SWQoKTsKICAgICB9IGVsc2UgewogICAgICAgICAqc3RyZWFtUHRyID0gbnVsbHB0cjsKICAgICB9CisgICAgQUxPR0koIiVzKCkgcmV0dXJucyAlZCA9ICVzIGZvciBzIyV1IC0tLS0tLS0tLS0tLS0tLS0iLAorICAgICAgICBfX2Z1bmNfXywgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpLCBpZCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMjY3LDggKzIyOSw5IEBACiB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19FUlJPUl9OVUxMOwogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9jbG9zZSglcCkgY2FsbGVkIC0tLS0tLS0tLS0tLS0tLSIsIHN0cmVhbSk7CiAgICAgaWYgKGF1ZGlvU3RyZWFtICE9IG51bGxwdHIpIHsKKyAgICAgICAgYWF1ZGlvX3N0cmVhbV9pZF90IGlkID0gYXVkaW9TdHJlYW0tPmdldElkKCk7CisgICAgICAgIEFMT0dEKCIlcyhzIyV1KSBjYWxsZWQgLS0tLS0tLS0tLS0tLS0tIiwgX19mdW5jX18sIGlkKTsKICAgICAgICAgcmVzdWx0ID0gYXVkaW9TdHJlYW0tPnNhZmVDbG9zZSgpOwogICAgICAgICAvLyBDbG9zZSB3aWxsIG9ubHkgZmFpbCBpZiBjYWxsZWQgaWxsZWdhbGx5LCBmb3IgZXhhbXBsZSwgZnJvbSBhIGNhbGxiYWNrLgogICAgICAgICAvLyBUaGF0IHdvdWxkIHJlc3VsdCBpbiBkZWxldGluZyBhbiBhY3RpdmUgc3RyZWFtLCB3aGljaCB3b3VsZCBjYXVzZSBhIGNyYXNoLgpAQCAtMjc4LDQzICsyNDEsNDAgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEFMT0dXKCIlcyBhdHRlbXB0IHRvIGNsb3NlIGZhaWxlZC4gQ2xvc2UgaXQgZnJvbSBhbm90aGVyIHRocmVhZC4iLCBfX2Z1bmNfXyk7CiAgICAgICAgIH0KKyAgICAgICAgQUxPR0QoIiVzKHMjJXUpIHJldHVybmVkICVkIC0tLS0tLS0tLSIsIF9fZnVuY19fLCBpZCwgcmVzdWx0KTsKICAgICB9Ci0gICAgLy8gV2UncmUgcG90ZW50aWFsbHkgZnJlZWluZyBgc3RyZWFtYCBhYm92ZSwgc28gaXRzIHVzZSBoZXJlIG1ha2VzIHNvbWUKLSAgICAvLyBzdGF0aWMgYW5hbHlzaXMgdG9vbHMgdW5oYXBweS4gQ2FzdGluZyB0byB1aW50cHRyX3QgaGVscHMgYXNzdXJlCi0gICAgLy8gc2FpZCB0b29scyB0aGF0IHdlJ3JlIG5vdCBkb2luZyBhbnl0aGluZyBiYWQgaGVyZS4KLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX2Nsb3NlKCUjIiBQUkl4UFRSICIpIHJldHVybmVkICVkIC0tLS0tLS0tLSIsCi0gICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHN0cmVhbSksIHJlc3VsdCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoQUF1ZGlvU3RyZWFtKiBzdHJlYW0pCiB7CiAgICAgQXVkaW9TdHJlYW0gKmF1ZGlvU3RyZWFtID0gY29udmVydEFBdWRpb1N0cmVhbVRvQXVkaW9TdHJlYW0oc3RyZWFtKTsKLSAgICBBTE9HRCgiQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydCglcCkgY2FsbGVkIC0tLS0tLS0tLS0tLS0tIiwgc3RyZWFtKTsKKyAgICBhYXVkaW9fc3RyZWFtX2lkX3QgaWQgPSBhdWRpb1N0cmVhbS0+Z2V0SWQoKTsKKyAgICBBTE9HRCgiJXMocyMldSkgY2FsbGVkIC0tLS0tLS0tLS0tLS0tIiwgX19mdW5jX18sIGlkKTsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gYXVkaW9TdHJlYW0tPnN5c3RlbVN0YXJ0KCk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoJXApIHJldHVybmVkICVkIC0tLS0tLS0tLSIsIHN0cmVhbSwgcmVzdWx0KTsKKyAgICBBTE9HRCgiJXMocyMldSkgcmV0dXJuZWQgJWQgLS0tLS0tLS0tIiwgX19mdW5jX18sIGlkLCByZXN1bHQpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdFBhdXNlKEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2UoJXApIiwgc3RyZWFtKTsKKyAgICBBTE9HRCgiJXMocyMldSkgY2FsbGVkIiwgX19mdW5jX18sIGF1ZGlvU3RyZWFtLT5nZXRJZCgpKTsKICAgICByZXR1cm4gYXVkaW9TdHJlYW0tPnN5c3RlbVBhdXNlKCk7CiB9CiAKIEFBVURJT19BUEkgYWF1ZGlvX3Jlc3VsdF90ICBBQXVkaW9TdHJlYW1fcmVxdWVzdEZsdXNoKEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0Rmx1c2goJXApIiwgc3RyZWFtKTsKKyAgICBBTE9HRCgiJXMocyMldSkgY2FsbGVkIiwgX19mdW5jX18sIGF1ZGlvU3RyZWFtLT5nZXRJZCgpKTsKICAgICByZXR1cm4gYXVkaW9TdHJlYW0tPnNhZmVGbHVzaCgpOwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgQUxPR0QoIkFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcCglcCkiLCBzdHJlYW0pOwotICAgIHJldHVybiBhdWRpb1N0cmVhbS0+c3lzdGVtU3RvcCgpOworICAgIEFMT0dEKCIlcyhzIyV1KSBjYWxsZWQiLCBfX2Z1bmNfXywgYXVkaW9TdHJlYW0tPmdldElkKCkpOworICAgIHJldHVybiBhdWRpb1N0cmVhbS0+c3lzdGVtU3RvcEZyb21BcHAoKTsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU3RyZWFtX3dhaXRGb3JTdGF0ZUNoYW5nZShBQXVkaW9TdHJlYW0qIHN0cmVhbSwKQEAgLTM2Myw3ICszMjMsNyBAQAogCiAgICAgLy8gRG9uJ3QgYWxsb3cgd3JpdGVzIHdoZW4gcGxheWluZyB3aXRoIGEgY2FsbGJhY2suCiAgICAgaWYgKGF1ZGlvU3RyZWFtLT5pc0RhdGFDYWxsYmFja0FjdGl2ZSgpKSB7Ci0gICAgICAgIEFMT0dFKCJDYW5ub3Qgd3JpdGUgdG8gYSBjYWxsYmFjayBzdHJlYW0gd2hlbiBydW5uaW5nLiIpOworICAgICAgICBBTE9HRCgiQ2Fubm90IHdyaXRlIHRvIGEgY2FsbGJhY2sgc3RyZWFtIHdoZW4gcnVubmluZy4iKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIApAQCAtNDA4LDcgKzM2OCw5IEBACiBBQVVESU9fQVBJIGFhdWRpb19mb3JtYXRfdCBBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0KEFBdWRpb1N0cmVhbSogc3RyZWFtKQogewogICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7Ci0gICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5nZXRGb3JtYXQoKTsKKyAgICAvLyBVc2UgYXVkaW9fZm9ybWF0X3QgaW50ZXJuYWxseS4KKyAgICBhdWRpb19mb3JtYXRfdCBpbnRlcm5hbEZvcm1hdCA9IGF1ZGlvU3RyZWFtLT5nZXRGb3JtYXQoKTsKKyAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9EYXRhRm9ybWF0KGludGVybmFsRm9ybWF0KTsKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU3RyZWFtX3NldEJ1ZmZlclNpemVJbkZyYW1lcyhBQXVkaW9TdHJlYW0qIHN0cmVhbSwKQEAgLTQ5MCw2ICs0NTIsMTMgQEAKICAgICByZXR1cm4gYXVkaW9TdHJlYW0tPmdldElucHV0UHJlc2V0KCk7CiB9CiAKK0FBVURJT19BUEkgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBBQXVkaW9TdHJlYW1fZ2V0QWxsb3dlZENhcHR1cmVQb2xpY3koCisgICAgICAgIEFBdWRpb1N0cmVhbSogc3RyZWFtKQoreworICAgIEF1ZGlvU3RyZWFtICphdWRpb1N0cmVhbSA9IGNvbnZlcnRBQXVkaW9TdHJlYW1Ub0F1ZGlvU3RyZWFtKHN0cmVhbSk7CisgICAgcmV0dXJuIGF1ZGlvU3RyZWFtLT5nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpOworfQorCiBBQVVESU9fQVBJIGludDMyX3QgQUF1ZGlvU3RyZWFtX2dldFNlc3Npb25JZChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKIHsKICAgICBBdWRpb1N0cmVhbSAqYXVkaW9TdHJlYW0gPSBjb252ZXJ0QUF1ZGlvU3RyZWFtVG9BdWRpb1N0cmVhbShzdHJlYW0pOwpAQCAtNTI2LDIzICs0OTUsMTEgQEAKIH0KIAogQUFVRElPX0FQSSBhYXVkaW9fcG9saWN5X3QgQUF1ZGlvX2dldE1NYXBQb2xpY3koKSB7Ci0gICAgcmV0dXJuIHNfTU1hcFBvbGljeTsKKyAgICByZXR1cm4gQXVkaW9HbG9iYWxfZ2V0TU1hcFBvbGljeSgpOwogfQogCiBBQVVESU9fQVBJIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9fc2V0TU1hcFBvbGljeShhYXVkaW9fcG9saWN5X3QgcG9saWN5KSB7Ci0gICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKLSAgICBzd2l0Y2gocG9saWN5KSB7Ci0gICAgICAgIGNhc2UgQUFVRElPX1VOU1BFQ0lGSUVEOgotICAgICAgICBjYXNlIEFBVURJT19QT0xJQ1lfTkVWRVI6Ci0gICAgICAgIGNhc2UgQUFVRElPX1BPTElDWV9BVVRPOgotICAgICAgICBjYXNlIEFBVURJT19QT0xJQ1lfQUxXQVlTOgotICAgICAgICAgICAgc19NTWFwUG9saWN5ID0gcG9saWN5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OworICAgIHJldHVybiBBdWRpb0dsb2JhbF9zZXRNTWFwUG9saWN5KHBvbGljeSk7CiB9CiAKIEFBVURJT19BUEkgYm9vbCBBQXVkaW9TdHJlYW1faXNNTWFwVXNlZChBQXVkaW9TdHJlYW0qIHN0cmVhbSkKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmNwcAppbmRleCBkNTY3MDFiLi5jOTcxMWRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuY3BwCkBAIC0zNSwyOCArMzUsNDMgQEAKIEFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6On5BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzKCkge30KIAogdm9pZCBBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzOjpjb3B5RnJvbShjb25zdCBBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzICZvdGhlcikgewotICAgIG1TYW1wbGVzUGVyRnJhbWUgPSBvdGhlci5tU2FtcGxlc1BlckZyYW1lOwotICAgIG1TYW1wbGVSYXRlICAgICAgPSBvdGhlci5tU2FtcGxlUmF0ZTsKLSAgICBtRGV2aWNlSWQgICAgICAgID0gb3RoZXIubURldmljZUlkOwotICAgIG1TZXNzaW9uSWQgICAgICAgPSBvdGhlci5tU2Vzc2lvbklkOwotICAgIG1TaGFyaW5nTW9kZSAgICAgPSBvdGhlci5tU2hhcmluZ01vZGU7Ci0gICAgbUF1ZGlvRm9ybWF0ICAgICA9IG90aGVyLm1BdWRpb0Zvcm1hdDsKLSAgICBtRGlyZWN0aW9uICAgICAgID0gb3RoZXIubURpcmVjdGlvbjsKLSAgICBtQnVmZmVyQ2FwYWNpdHkgID0gb3RoZXIubUJ1ZmZlckNhcGFjaXR5OwotICAgIG1Vc2FnZSAgICAgICAgICAgPSBvdGhlci5tVXNhZ2U7Ci0gICAgbUNvbnRlbnRUeXBlICAgICA9IG90aGVyLm1Db250ZW50VHlwZTsKLSAgICBtSW5wdXRQcmVzZXQgICAgID0gb3RoZXIubUlucHV0UHJlc2V0OworICAgIG1TYW1wbGVzUGVyRnJhbWUgICAgICA9IG90aGVyLm1TYW1wbGVzUGVyRnJhbWU7CisgICAgbVNhbXBsZVJhdGUgICAgICAgICAgID0gb3RoZXIubVNhbXBsZVJhdGU7CisgICAgbURldmljZUlkICAgICAgICAgICAgID0gb3RoZXIubURldmljZUlkOworICAgIG1TZXNzaW9uSWQgICAgICAgICAgICA9IG90aGVyLm1TZXNzaW9uSWQ7CisgICAgbVNoYXJpbmdNb2RlICAgICAgICAgID0gb3RoZXIubVNoYXJpbmdNb2RlOworICAgIG1BdWRpb0Zvcm1hdCAgICAgICAgICA9IG90aGVyLm1BdWRpb0Zvcm1hdDsKKyAgICBtRGlyZWN0aW9uICAgICAgICAgICAgPSBvdGhlci5tRGlyZWN0aW9uOworICAgIG1CdWZmZXJDYXBhY2l0eSAgICAgICA9IG90aGVyLm1CdWZmZXJDYXBhY2l0eTsKKyAgICBtVXNhZ2UgICAgICAgICAgICAgICAgPSBvdGhlci5tVXNhZ2U7CisgICAgbUNvbnRlbnRUeXBlICAgICAgICAgID0gb3RoZXIubUNvbnRlbnRUeXBlOworICAgIG1JbnB1dFByZXNldCAgICAgICAgICA9IG90aGVyLm1JbnB1dFByZXNldDsKKyAgICBtQWxsb3dlZENhcHR1cmVQb2xpY3kgPSBvdGhlci5tQWxsb3dlZENhcHR1cmVQb2xpY3k7Cit9CisKK3N0YXRpYyBhYXVkaW9fcmVzdWx0X3QgaXNGb3JtYXRWYWxpZChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICBicmVhazsgLy8gdmFsaWQKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dEKCJhdWRpb0Zvcm1hdCBub3QgdmFsaWQsIGF1ZGlvX2Zvcm1hdF90ID0gMHglMDh4IiwgZm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9GT1JNQVQ7CisgICAgICAgICAgICAvLyBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1N0cmVhbVBhcmFtZXRlcnM6OnZhbGlkYXRlKCkgY29uc3QgewogICAgIGlmIChtU2FtcGxlc1BlckZyYW1lICE9IEFBVURJT19VTlNQRUNJRklFRAogICAgICAgICAmJiAobVNhbXBsZXNQZXJGcmFtZSA8IFNBTVBMRVNfUEVSX0ZSQU1FX01JTiB8fCBtU2FtcGxlc1BlckZyYW1lID4gU0FNUExFU19QRVJfRlJBTUVfTUFYKSkgewotICAgICAgICBBTE9HRSgiY2hhbm5lbENvdW50IG91dCBvZiByYW5nZSA9ICVkIiwgbVNhbXBsZXNQZXJGcmFtZSk7CisgICAgICAgIEFMT0dEKCJjaGFubmVsQ291bnQgb3V0IG9mIHJhbmdlID0gJWQiLCBtU2FtcGxlc1BlckZyYW1lKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogCiAgICAgaWYgKG1EZXZpY2VJZCA8IDApIHsKLSAgICAgICAgQUxPR0UoImRldmljZUlkIG91dCBvZiByYW5nZSA9ICVkIiwgbURldmljZUlkKTsKKyAgICAgICAgQUxPR0QoImRldmljZUlkIG91dCBvZiByYW5nZSA9ICVkIiwgbURldmljZUlkKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogCkBAIC03NCwzMCArODksMjIgQEAKICAgICAgICAgY2FzZSBBQVVESU9fU0hBUklOR19NT0RFX1NIQVJFRDoKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoImlsbGVnYWwgc2hhcmluZ01vZGUgPSAlZCIsIG1TaGFyaW5nTW9kZSk7CisgICAgICAgICAgICBBTE9HRCgiaWxsZWdhbCBzaGFyaW5nTW9kZSA9ICVkIiwgbVNoYXJpbmdNb2RlKTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKICAgICAgICAgICAgIC8vIGJyZWFrOwogICAgIH0KIAotICAgIHN3aXRjaCAobUF1ZGlvRm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDoKLSAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9JMTY6Ci0gICAgICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6Ci0gICAgICAgICAgICBicmVhazsgLy8gdmFsaWQKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJhdWRpb0Zvcm1hdCBub3QgdmFsaWQgPSAlZCIsIG1BdWRpb0Zvcm1hdCk7Ci0gICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfRk9STUFUOwotICAgICAgICAgICAgLy8gYnJlYWs7Ci0gICAgfQorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBpc0Zvcm1hdFZhbGlkIChtQXVkaW9Gb3JtYXQpOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSByZXR1cm4gcmVzdWx0OwogCiAgICAgaWYgKG1TYW1wbGVSYXRlICE9IEFBVURJT19VTlNQRUNJRklFRAogICAgICAgICAmJiAobVNhbXBsZVJhdGUgPCBTQU1QTEVfUkFURV9IWl9NSU4gfHwgbVNhbXBsZVJhdGUgPiBTQU1QTEVfUkFURV9IWl9NQVgpKSB7Ci0gICAgICAgIEFMT0dFKCJzYW1wbGVSYXRlIG91dCBvZiByYW5nZSA9ICVkIiwgbVNhbXBsZVJhdGUpOworICAgICAgICBBTE9HRCgic2FtcGxlUmF0ZSBvdXQgb2YgcmFuZ2UgPSAlZCIsIG1TYW1wbGVSYXRlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1JBVEU7CiAgICAgfQogCiAgICAgaWYgKG1CdWZmZXJDYXBhY2l0eSA8IDApIHsKLSAgICAgICAgQUxPR0UoImJ1ZmZlckNhcGFjaXR5IG91dCBvZiByYW5nZSA9ICVkIiwgbUJ1ZmZlckNhcGFjaXR5KTsKKyAgICAgICAgQUxPR0QoImJ1ZmZlckNhcGFjaXR5IG91dCBvZiByYW5nZSA9ICVkIiwgbUJ1ZmZlckNhcGFjaXR5KTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9PVVRfT0ZfUkFOR0U7CiAgICAgfQogCkBAIC0xMDYsNyArMTEzLDcgQEAKICAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDoKICAgICAgICAgICAgIGJyZWFrOyAvLyB2YWxpZAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoImRpcmVjdGlvbiBub3QgdmFsaWQgPSAlZCIsIG1EaXJlY3Rpb24pOworICAgICAgICAgICAgQUxPR0QoImRpcmVjdGlvbiBub3QgdmFsaWQgPSAlZCIsIG1EaXJlY3Rpb24pOwogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UOwogICAgICAgICAgICAgLy8gYnJlYWs7CiAgICAgfQpAQCAtMTI3LDcgKzEzNCw3IEBACiAgICAgICAgIGNhc2UgQUFVRElPX1VTQUdFX0FTU0lTVEFOVDoKICAgICAgICAgICAgIGJyZWFrOyAvLyB2YWxpZAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoInVzYWdlIG5vdCB2YWxpZCA9ICVkIiwgbVVzYWdlKTsKKyAgICAgICAgICAgIEFMT0dEKCJ1c2FnZSBub3QgdmFsaWQgPSAlZCIsIG1Vc2FnZSk7CiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7CiAgICAgICAgICAgICAvLyBicmVhazsKICAgICB9CkBAIC0xNDAsNyArMTQ3LDcgQEAKICAgICAgICAgY2FzZSBBQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDoKICAgICAgICAgICAgIGJyZWFrOyAvLyB2YWxpZAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoImNvbnRlbnQgdHlwZSBub3QgdmFsaWQgPSAlZCIsIG1Db250ZW50VHlwZSk7CisgICAgICAgICAgICBBTE9HRCgiY29udGVudCB0eXBlIG5vdCB2YWxpZCA9ICVkIiwgbUNvbnRlbnRUeXBlKTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKICAgICAgICAgICAgIC8vIGJyZWFrOwogICAgIH0KQEAgLTE1Miw5ICsxNTksMjIgQEAKICAgICAgICAgY2FzZSBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT046CiAgICAgICAgIGNhc2UgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTjoKICAgICAgICAgY2FzZSBBQVVESU9fSU5QVVRfUFJFU0VUX1VOUFJPQ0VTU0VEOgorICAgICAgICBjYXNlIEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUEVSRk9STUFOQ0U6CiAgICAgICAgICAgICBicmVhazsgLy8gdmFsaWQKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dFKCJpbnB1dCBwcmVzZXQgbm90IHZhbGlkID0gJWQiLCBtSW5wdXRQcmVzZXQpOworICAgICAgICAgICAgQUxPR0QoImlucHV0IHByZXNldCBub3QgdmFsaWQgPSAlZCIsIG1JbnB1dFByZXNldCk7CisgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7CisgICAgICAgICAgICAvLyBicmVhazsKKyAgICB9CisKKyAgICBzd2l0Y2ggKG1BbGxvd2VkQ2FwdHVyZVBvbGljeSkgeworICAgICAgICBjYXNlIEFBVURJT19VTlNQRUNJRklFRDoKKyAgICAgICAgY2FzZSBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9BTEw6CisgICAgICAgIGNhc2UgQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfU1lTVEVNOgorICAgICAgICBjYXNlIEFBVURJT19BTExPV19DQVBUVVJFX0JZX05PTkU6CisgICAgICAgICAgICBicmVhazsgLy8gdmFsaWQKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dEKCJhbGxvd2VkIGNhcHR1cmUgcG9saWN5IG5vdCB2YWxpZCA9ICVkIiwgbUFsbG93ZWRDYXB0dXJlUG9saWN5KTsKICAgICAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKICAgICAgICAgICAgIC8vIGJyZWFrOwogICAgIH0KQEAgLTE2MywxNSArMTgzLDE2IEBACiB9CiAKIHZvaWQgQUF1ZGlvU3RyZWFtUGFyYW1ldGVyczo6ZHVtcCgpIGNvbnN0IHsKLSAgICBBTE9HRCgibURldmljZUlkICAgICAgICA9ICU2ZCIsIG1EZXZpY2VJZCk7Ci0gICAgQUxPR0QoIm1TZXNzaW9uSWQgICAgICAgPSAlNmQiLCBtU2Vzc2lvbklkKTsKLSAgICBBTE9HRCgibVNhbXBsZVJhdGUgICAgICA9ICU2ZCIsIG1TYW1wbGVSYXRlKTsKLSAgICBBTE9HRCgibVNhbXBsZXNQZXJGcmFtZSA9ICU2ZCIsIG1TYW1wbGVzUGVyRnJhbWUpOwotICAgIEFMT0dEKCJtU2hhcmluZ01vZGUgICAgID0gJTZkIiwgKGludCltU2hhcmluZ01vZGUpOwotICAgIEFMT0dEKCJtQXVkaW9Gb3JtYXQgICAgID0gJTZkIiwgKGludCltQXVkaW9Gb3JtYXQpOwotICAgIEFMT0dEKCJtRGlyZWN0aW9uICAgICAgID0gJTZkIiwgbURpcmVjdGlvbik7Ci0gICAgQUxPR0QoIm1CdWZmZXJDYXBhY2l0eSAgPSAlNmQiLCBtQnVmZmVyQ2FwYWNpdHkpOwotICAgIEFMT0dEKCJtVXNhZ2UgICAgICAgICAgID0gJTZkIiwgbVVzYWdlKTsKLSAgICBBTE9HRCgibUNvbnRlbnRUeXBlICAgICA9ICU2ZCIsIG1Db250ZW50VHlwZSk7Ci0gICAgQUxPR0QoIm1JbnB1dFByZXNldCAgICAgPSAlNmQiLCBtSW5wdXRQcmVzZXQpOworICAgIEFMT0dEKCJtRGV2aWNlSWQgICAgICAgICAgICAgPSAlNmQiLCBtRGV2aWNlSWQpOworICAgIEFMT0dEKCJtU2Vzc2lvbklkICAgICAgICAgICAgPSAlNmQiLCBtU2Vzc2lvbklkKTsKKyAgICBBTE9HRCgibVNhbXBsZVJhdGUgICAgICAgICAgID0gJTZkIiwgbVNhbXBsZVJhdGUpOworICAgIEFMT0dEKCJtU2FtcGxlc1BlckZyYW1lICAgICAgPSAlNmQiLCBtU2FtcGxlc1BlckZyYW1lKTsKKyAgICBBTE9HRCgibVNoYXJpbmdNb2RlICAgICAgICAgID0gJTZkIiwgKGludCltU2hhcmluZ01vZGUpOworICAgIEFMT0dEKCJtQXVkaW9Gb3JtYXQgICAgICAgICAgPSAlNmQiLCAoaW50KW1BdWRpb0Zvcm1hdCk7CisgICAgQUxPR0QoIm1EaXJlY3Rpb24gICAgICAgICAgICA9ICU2ZCIsIG1EaXJlY3Rpb24pOworICAgIEFMT0dEKCJtQnVmZmVyQ2FwYWNpdHkgICAgICAgPSAlNmQiLCBtQnVmZmVyQ2FwYWNpdHkpOworICAgIEFMT0dEKCJtVXNhZ2UgICAgICAgICAgICAgICAgPSAlNmQiLCBtVXNhZ2UpOworICAgIEFMT0dEKCJtQ29udGVudFR5cGUgICAgICAgICAgPSAlNmQiLCBtQ29udGVudFR5cGUpOworICAgIEFMT0dEKCJtSW5wdXRQcmVzZXQgICAgICAgICAgPSAlNmQiLCBtSW5wdXRQcmVzZXQpOworICAgIEFMT0dEKCJtQWxsb3dlZENhcHR1cmVQb2xpY3kgPSAlNmQiLCBtQWxsb3dlZENhcHR1cmVQb2xpY3kpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BQXVkaW9TdHJlYW1QYXJhbWV0ZXJzLmgKaW5kZXggY2U1ZGFjZC4uMmUyMWE4ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0FBdWRpb1N0cmVhbVBhcmFtZXRlcnMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQUF1ZGlvU3RyZWFtUGFyYW1ldGVycy5oCkBAIC01NiwxMSArNTYsMTEgQEAKICAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSA9IHNhbXBsZXNQZXJGcmFtZTsKICAgICB9CiAKLSAgICBhYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgY29uc3QgeworICAgIGF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1BdWRpb0Zvcm1hdDsKICAgICB9CiAKLSAgICB2b2lkIHNldEZvcm1hdChhYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQpIHsKKyAgICB2b2lkIHNldEZvcm1hdChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCkgewogICAgICAgICBtQXVkaW9Gb3JtYXQgPSBhdWRpb0Zvcm1hdDsKICAgICB9CiAKQEAgLTExMiw2ICsxMTIsMTQgQEAKICAgICAgICAgbUlucHV0UHJlc2V0ID0gaW5wdXRQcmVzZXQ7CiAgICAgfQogCisgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBnZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BbGxvd2VkQ2FwdHVyZVBvbGljeTsKKyAgICB9CisKKyAgICB2b2lkIHNldEFsbG93ZWRDYXB0dXJlUG9saWN5KGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgcG9saWN5KSB7CisgICAgICAgIG1BbGxvd2VkQ2FwdHVyZVBvbGljeSA9IHBvbGljeTsKKyAgICB9CisKICAgICBhYXVkaW9fc2Vzc2lvbl9pZF90IGdldFNlc3Npb25JZCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1TZXNzaW9uSWQ7CiAgICAgfQpAQCAtMTIwLDggKzEyOCwxMSBAQAogICAgICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwogICAgIH0KIAorICAgIC8qKgorICAgICAqIEByZXR1cm4gYnl0ZXMgcGVyIGZyYW1lIG9mIGdldEZvcm1hdCgpCisgICAgICovCiAgICAgaW50MzJfdCBjYWxjdWxhdGVCeXRlc1BlckZyYW1lKCkgY29uc3QgewotICAgICAgICByZXR1cm4gZ2V0U2FtcGxlc1BlckZyYW1lKCkgKiBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMoZ2V0Rm9ybWF0KCkpOworICAgICAgICByZXR1cm4gZ2V0U2FtcGxlc1BlckZyYW1lKCkgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGdldEZvcm1hdCgpKTsKICAgICB9CiAKICAgICAvKioKQEAgLTEzNSwxNyArMTQ2LDE4IEBACiAgICAgdm9pZCBkdW1wKCkgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSA9IEFBVURJT19VTlNQRUNJRklFRDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwotICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VJZCAgICAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7Ci0gICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90ICAgICAgbVNoYXJpbmdNb2RlICAgICA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwotICAgIGFhdWRpb19mb3JtYXRfdCAgICAgICAgICAgIG1BdWRpb0Zvcm1hdCAgICAgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOwotICAgIGFhdWRpb19kaXJlY3Rpb25fdCAgICAgICAgIG1EaXJlY3Rpb24gICAgICAgPSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDsKLSAgICBhYXVkaW9fdXNhZ2VfdCAgICAgICAgICAgICBtVXNhZ2UgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwotICAgIGFhdWRpb19jb250ZW50X3R5cGVfdCAgICAgIG1Db250ZW50VHlwZSAgICAgPSBBQVVESU9fVU5TUEVDSUZJRUQ7Ci0gICAgYWF1ZGlvX2lucHV0X3ByZXNldF90ICAgICAgbUlucHV0UHJlc2V0ICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKLSAgICBpbnQzMl90ICAgICAgICAgICAgICAgICAgICBtQnVmZmVyQ2FwYWNpdHkgID0gQUFVRElPX1VOU1BFQ0lGSUVEOwotICAgIGFhdWRpb19zZXNzaW9uX2lkX3QgICAgICAgIG1TZXNzaW9uSWQgICAgICAgPSBBQVVESU9fU0VTU0lPTl9JRF9OT05FOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZXNQZXJGcmFtZSAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgbURldmljZUlkICAgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCAgICAgICAgICAgbVNoYXJpbmdNb2RlICAgICAgICAgID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7CisgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgICAgICBtQXVkaW9Gb3JtYXQgICAgICAgICAgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKKyAgICBhYXVkaW9fZGlyZWN0aW9uX3QgICAgICAgICAgICAgIG1EaXJlY3Rpb24gICAgICAgICAgICA9IEFBVURJT19ESVJFQ1RJT05fT1VUUFVUOworICAgIGFhdWRpb191c2FnZV90ICAgICAgICAgICAgICAgICAgbVVzYWdlICAgICAgICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19jb250ZW50X3R5cGVfdCAgICAgICAgICAgbUNvbnRlbnRUeXBlICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19pbnB1dF9wcmVzZXRfdCAgICAgICAgICAgbUlucHV0UHJlc2V0ICAgICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlckNhcGFjaXR5ICAgICAgID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgbUFsbG93ZWRDYXB0dXJlUG9saWN5ID0gQUFVRElPX1VOU1BFQ0lGSUVEOworICAgIGFhdWRpb19zZXNzaW9uX2lkX3QgICAgICAgICAgICAgbVNlc3Npb25JZCAgICAgICAgICAgID0gQUFVRElPX1NFU1NJT05fSURfTk9ORTsKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvR2xvYmFsLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb0dsb2JhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZkOWEwZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb0dsb2JhbC5jcHAKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGFhdWRpby9BQXVkaW9UZXN0aW5nLmg+CisKKyNpbmNsdWRlICJBdWRpb0dsb2JhbC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBTdGF0aWMgZ2xvYmFscy4KKyAqLworbmFtZXNwYWNlIGFhdWRpbyB7CisKK3N0YXRpYyBhYXVkaW9fcG9saWN5X3QgZ19NTWFwUG9saWN5ID0gQUFVRElPX1VOU1BFQ0lGSUVEOworCithYXVkaW9fcG9saWN5X3QgQXVkaW9HbG9iYWxfZ2V0TU1hcFBvbGljeSgpIHsKKyAgcmV0dXJuIGdfTU1hcFBvbGljeTsKK30KKworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvR2xvYmFsX3NldE1NYXBQb2xpY3koYWF1ZGlvX3BvbGljeV90IHBvbGljeSkgeworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQVVESU9fT0s7CisgICAgc3dpdGNoKHBvbGljeSkgeworICAgICAgICBjYXNlIEFBVURJT19VTlNQRUNJRklFRDoKKyAgICAgICAgY2FzZSBBQVVESU9fUE9MSUNZX05FVkVSOgorICAgICAgICBjYXNlIEFBVURJT19QT0xJQ1lfQVVUTzoKKyAgICAgICAgY2FzZSBBQVVESU9fUE9MSUNZX0FMV0FZUzoKKyAgICAgICAgICAgIGdfTU1hcFBvbGljeSA9IHBvbGljeTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lMTEVHQUxfQVJHVU1FTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2RlZmluZSBBQVVESU9fQ0FTRV9FTlVNKG5hbWUpIGNhc2UgbmFtZTogcmV0dXJuICNuYW1lCisKK2NvbnN0IGNoYXIqIEF1ZGlvR2xvYmFsX2NvbnZlcnRSZXN1bHRUb1RleHQoYWF1ZGlvX3Jlc3VsdF90IHJldHVybkNvZGUpIHsKKyAgICBzd2l0Y2ggKHJldHVybkNvZGUpIHsKKyAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fT0spOworICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19FUlJPUl9ESVNDT05ORUNURUQpOworICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UKTsKKyAgICAgICAgLy8gcmVzZXJ2ZWQKKyAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fRVJST1JfSU5URVJOQUwpOworICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFKTsKKyAgICAgICAgLy8gcmVzZXJ2ZWQKKyAgICAgICAgLy8gcmVzZXJ2ZWQKKyAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fRVJST1JfSU5WQUxJRF9IQU5ETEUpOworICAgICAgICAgLy8gcmVzZXJ2ZWQKKyAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fRVJST1JfVU5JTVBMRU1FTlRFRCk7CisgICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFKTsKKyAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fRVJST1JfTk9fRlJFRV9IQU5ETEVTKTsKKyAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fRVJST1JfTk9fTUVNT1JZKTsKKyAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fRVJST1JfTlVMTCk7CisgICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX0VSUk9SX1RJTUVPVVQpOworICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19FUlJPUl9XT1VMRF9CTE9DSyk7CisgICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX0VSUk9SX0lOVkFMSURfRk9STUFUKTsKKyAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFKTsKKyAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fRVJST1JfTk9fU0VSVklDRSk7CisgICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX0VSUk9SX0lOVkFMSURfUkFURSk7CisgICAgfQorICAgIHJldHVybiAiVW5yZWNvZ25pemVkIEFBdWRpbyBlcnJvci4iOworfQorCitjb25zdCBjaGFyKiBBdWRpb0dsb2JhbF9jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoYWF1ZGlvX3N0cmVhbV9zdGF0ZV90IHN0YXRlKSB7CisgICAgICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVEKTsKKyAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fU1RSRUFNX1NUQVRFX1VOS05PV04pOworICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19TVFJFQU1fU1RBVEVfT1BFTik7CisgICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVElORyk7CisgICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEKTsKKyAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fU1RSRUFNX1NUQVRFX1BBVVNJTkcpOworICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19TVFJFQU1fU1RBVEVfUEFVU0VEKTsKKyAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNISU5HKTsKKyAgICAgICAgQUFVRElPX0NBU0VfRU5VTShBQVVESU9fU1RSRUFNX1NUQVRFX0ZMVVNIRUQpOworICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpOworICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBFRCk7CisgICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpOworICAgICAgICBBQVVESU9fQ0FTRV9FTlVNKEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0lORyk7CisgICAgICAgIEFBVURJT19DQVNFX0VOVU0oQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQpOworICAgIH0KKyAgICByZXR1cm4gIlVucmVjb2duaXplZCBBQXVkaW8gc3RhdGUuIjsKK30KKworI3VuZGVmIEFBVURJT19DQVNFX0VOVU0KKworfSAgLy8gbmFtZXNwYWNlIGFhdWRpbwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvR2xvYmFsLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9HbG9iYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTJjZWYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvR2xvYmFsLmgKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQUFVRElPX0FVRElPR0xPQkFMX0gKKyNkZWZpbmUgQUFVRElPX0FVRElPR0xPQkFMX0gKKworI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvVGVzdGluZy5oPgorCisKK25hbWVzcGFjZSBhYXVkaW8geworCithYXVkaW9fcG9saWN5X3QgQXVkaW9HbG9iYWxfZ2V0TU1hcFBvbGljeSgpOworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvR2xvYmFsX3NldE1NYXBQb2xpY3koYWF1ZGlvX3BvbGljeV90IHBvbGljeSk7CisKK2NvbnN0IGNoYXIqIEF1ZGlvR2xvYmFsX2NvbnZlcnRSZXN1bHRUb1RleHQoYWF1ZGlvX3Jlc3VsdF90IHJldHVybkNvZGUpOworY29uc3QgY2hhciogQXVkaW9HbG9iYWxfY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSk7CisKK30KKworI2VuZGlmICAvLyBBQVVESU9fQVVESU9HTE9CQUxfSAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmNwcAppbmRleCAzNTgwMjFiLi42YThkYjIyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbS5jcHAKQEAgLTI1LDQ2ICsyNSwzOCBAQAogI2luY2x1ZGUgIkF1ZGlvU3RyZWFtQnVpbGRlci5oIgogI2luY2x1ZGUgIkF1ZGlvU3RyZWFtLmgiCiAjaW5jbHVkZSAiQXVkaW9DbG9jay5oIgorI2luY2x1ZGUgIkF1ZGlvR2xvYmFsLmgiCiAKLXVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CituYW1lc3BhY2UgYWF1ZGlvIHsKKworCisvLyBTZXF1ZW50aWFsIG51bWJlciBhc3NpZ25lZCB0byBzdHJlYW1zIHNvbGVseSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzLgorc3RhdGljIGFhdWRpb19zdHJlYW1faWRfdCBBQXVkaW9fZ2V0TmV4dFN0cmVhbUlkKCkgeworICAgIHN0YXRpYyBzdGQ6OmF0b21pYyA8YWF1ZGlvX3N0cmVhbV9pZF90PiBuZXh0U3RyZWFtSWR7MX07CisgICAgcmV0dXJuIG5leHRTdHJlYW1JZCsrOworfQogCiBBdWRpb1N0cmVhbTo6QXVkaW9TdHJlYW0oKQogICAgICAgICA6IG1QbGF5ZXJCYXNlKG5ldyBNeVBsYXllckJhc2UodGhpcykpCi17CisgICAgICAgICwgbVN0cmVhbUlkKEFBdWRpb19nZXROZXh0U3RyZWFtSWQoKSkKKyAgICAgICAgewogICAgIC8vIG1UaHJlYWQgaXMgYSBwdGhyZWFkX3Qgb2YgdW5rbm93biBzaXplIHNvIHdlIG5lZWQgbWVtc2V0LgogICAgIG1lbXNldCgmbVRocmVhZCwgMCwgc2l6ZW9mKG1UaHJlYWQpKTsKICAgICBzZXRQZXJpb2ROYW5vc2Vjb25kcygwKTsKIH0KIAogQXVkaW9TdHJlYW06On5BdWRpb1N0cmVhbSgpIHsKLSAgICBBTE9HRCgiZGVzdHJveWluZyAlcCwgc3RhdGUgPSAlcyIsIHRoaXMsIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoZ2V0U3RhdGUoKSkpOwogICAgIC8vIElmIHRoZSBzdHJlYW0gaXMgZGVsZXRlZCB3aGVuIE9QRU4gb3IgaW4gdXNlIHRoZW4gYXVkaW8gcmVzb3VyY2VzIHdpbGwgbGVhay4KICAgICAvLyBUaGlzIHdvdWxkIGluZGljYXRlIGFuIGludGVybmFsIGVycm9yLiBTbyB3ZSB3YW50IHRvIGZpbmQgdGhpcyBBU0FQLgogICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIShnZXRTdGF0ZSgpID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VECiAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9VTklOSVRJQUxJWkVECiAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpLAogICAgICAgICAgICAgICAgICAgICAgICAgIn5BdWRpb1N0cmVhbSgpIC0gc3RpbGwgaW4gdXNlLCBzdGF0ZSA9ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoZ2V0U3RhdGUoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9HbG9iYWxfY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KGdldFN0YXRlKCkpKTsKIAogICAgIG1QbGF5ZXJCYXNlLT5jbGVhclBhcmVudFJlZmVyZW5jZSgpOyAvLyByZW1vdmUgcmVmZXJlbmNlIHRvIHRoaXMgQXVkaW9TdHJlYW0KIH0KIAotc3RhdGljIGNvbnN0IGNoYXIgKkF1ZGlvU3RyZWFtX2NvbnZlcnRTaGFyaW5nTW9kZVRvU2hvcnRUZXh0KGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgewotICAgIGNvbnN0IGNoYXIgKnJlc3VsdDsKLSAgICBzd2l0Y2ggKHNoYXJpbmdNb2RlKSB7Ci0gICAgICAgIGNhc2UgQUFVRElPX1NIQVJJTkdfTU9ERV9FWENMVVNJVkU6Ci0gICAgICAgICAgICByZXN1bHQgPSAiRVgiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ6Ci0gICAgICAgICAgICByZXN1bHQgPSAiU0giOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXN1bHQgPSAiPyEiOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6b3Blbihjb25zdCBBdWRpb1N0cmVhbUJ1aWxkZXImIGJ1aWxkZXIpCiB7CiAgICAgLy8gQ2FsbCBoZXJlIGFzIHdlbGwgYmVjYXVzZSB0aGUgQUF1ZGlvU2VydmljZSB3aWxsIGNhbGwgdGhpcyB3aXRob3V0IGNhbGxpbmcgYnVpbGQoKS4KQEAgLTk1LDYgKzg3LDEwIEBACiAgICAgaWYgKG1JbnB1dFByZXNldCA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKICAgICAgICAgbUlucHV0UHJlc2V0ID0gQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTjsKICAgICB9CisgICAgbUFsbG93ZWRDYXB0dXJlUG9saWN5ID0gYnVpbGRlci5nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpOworICAgIGlmIChtQWxsb3dlZENhcHR1cmVQb2xpY3kgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CisgICAgICAgIG1BbGxvd2VkQ2FwdHVyZVBvbGljeSA9IEFBVURJT19BTExPV19DQVBUVVJFX0JZX0FMTDsKKyAgICB9CiAKICAgICAvLyBjYWxsYmFja3MKICAgICBtRnJhbWVzUGVyRGF0YUNhbGxiYWNrID0gYnVpbGRlci5nZXRGcmFtZXNQZXJEYXRhQ2FsbGJhY2soKTsKQEAgLTEwMywzOCArOTksMzIgQEAKICAgICBtRGF0YUNhbGxiYWNrVXNlckRhdGEgPSBidWlsZGVyLmdldERhdGFDYWxsYmFja1VzZXJEYXRhKCk7CiAgICAgbUVycm9yQ2FsbGJhY2tVc2VyRGF0YSA9IGJ1aWxkZXIuZ2V0RXJyb3JDYWxsYmFja1VzZXJEYXRhKCk7CiAKLSAgICAvLyBUaGlzIGlzIHZlcnkgaGVscGZ1bCBmb3IgZGVidWdnaW5nIGluIHRoZSBmdXR1cmUuIFBsZWFzZSBsZWF2ZSBpdCBpbi4KLSAgICBBTE9HSSgib3BlbigpIHJhdGUgICA9ICVkLCBjaGFubmVscyAgICA9ICVkLCBmb3JtYXQgICA9ICVkLCBzaGFyaW5nID0gJXMsIGRpciA9ICVzIiwKLSAgICAgICAgICBtU2FtcGxlUmF0ZSwgbVNhbXBsZXNQZXJGcmFtZSwgbUZvcm1hdCwKLSAgICAgICAgICBBdWRpb1N0cmVhbV9jb252ZXJ0U2hhcmluZ01vZGVUb1Nob3J0VGV4dChtU2hhcmluZ01vZGUpLAotICAgICAgICAgIChnZXREaXJlY3Rpb24oKSA9PSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkgPyAiT1VUUFVUIiA6ICJJTlBVVCIpOwotICAgIEFMT0dJKCJvcGVuKCkgZGV2aWNlID0gJWQsIHNlc3Npb25JZCAgID0gJWQsIHBlcmZNb2RlID0gJWQsIGNhbGxiYWNrOiAlcyB3aXRoIGZyYW1lcyA9ICVkIiwKLSAgICAgICAgICBtRGV2aWNlSWQsCi0gICAgICAgICAgbVNlc3Npb25JZCwKLSAgICAgICAgICBtUGVyZm9ybWFuY2VNb2RlLAotICAgICAgICAgIChpc0RhdGFDYWxsYmFja1NldCgpID8gIk9OIiA6ICJPRkYiKSwKLSAgICAgICAgICBtRnJhbWVzUGVyRGF0YUNhbGxiYWNrKTsKLSAgICBBTE9HSSgib3BlbigpIHVzYWdlICA9ICVkLCBjb250ZW50VHlwZSA9ICVkLCBpbnB1dFByZXNldCA9ICVkIiwKLSAgICAgICAgICBtVXNhZ2UsIG1Db250ZW50VHlwZSwgbUlucHV0UHJlc2V0KTsKLQogICAgIHJldHVybiBBQVVESU9fT0s7CiB9CiAKLWFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZVN0YXJ0KCkgeworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzeXN0ZW1TdGFydCgpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTG9jayk7CisKICAgICBpZiAoY29sbGlkZXNXaXRoQ2FsbGJhY2soKSkgewogICAgICAgICBBTE9HRSgiJXMgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGEgY2FsbGJhY2shIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQotICAgIHJldHVybiByZXF1ZXN0U3RhcnQoKTsKKworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSByZXF1ZXN0U3RhcnQoKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICAvLyBXZSBvbmx5IGNhbGwgdGhpcyBmb3IgbG9nZ2luZyBpbiAiZHVtcHN5cyBhdWRpbyIuIFNvIGlnbm9yZSByZXR1cm4gY29kZS4KKyAgICAgICAgKHZvaWQpIG1QbGF5ZXJCYXNlLT5zdGFydCgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnNhZmVQYXVzZSgpIHsKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c3lzdGVtUGF1c2UoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOworCiAgICAgaWYgKCFpc1BhdXNlU3VwcG9ydGVkKCkpIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTklNUExFTUVOVEVEOwogICAgIH0KIAotICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKICAgICBpZiAoY29sbGlkZXNXaXRoQ2FsbGJhY2soKSkgewogICAgICAgICBBTE9HRSgiJXMgY2Fubm90IGJlIGNhbGxlZCBmcm9tIGEgY2FsbGJhY2shIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CkBAIC0xNjYsMTEgKzE1NiwxNiBAQAogICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEOgogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR1coInNhZmVQYXVzZSgpIHN0cmVhbSBub3QgcnVubmluZywgc3RhdGUgPSAlcyIsCi0gICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KGdldFN0YXRlKCkpKTsKKyAgICAgICAgICAgICAgICAgIEF1ZGlvR2xvYmFsX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChnZXRTdGF0ZSgpKSk7CiAgICAgICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCi0gICAgcmV0dXJuIHJlcXVlc3RQYXVzZSgpOworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSByZXF1ZXN0UGF1c2UoKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICAvLyBXZSBvbmx5IGNhbGwgdGhpcyBmb3IgbG9nZ2luZyBpbiAiZHVtcHN5cyBhdWRpbyIuIFNvIGlnbm9yZSByZXR1cm4gY29kZS4KKyAgICAgICAgKHZvaWQpIG1QbGF5ZXJCYXNlLT5wYXVzZSgpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnNhZmVGbHVzaCgpIHsKQEAgLTE5MywxMiArMTg4LDMyIEBACiAgICAgcmV0dXJuIHJlcXVlc3RGbHVzaCgpOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OnNhZmVTdG9wKCkgeworYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpzeXN0ZW1TdG9wRnJvbUNhbGxiYWNrKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1TdHJlYW1Mb2NrKTsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gc2FmZVN0b3AoKTsKKyAgICBpZiAocmVzdWx0ID09IEFBVURJT19PSykgeworICAgICAgICAvLyBXZSBvbmx5IGNhbGwgdGhpcyBmb3IgbG9nZ2luZyBpbiAiZHVtcHN5cyBhdWRpbyIuIFNvIGlnbm9yZSByZXR1cm4gY29kZS4KKyAgICAgICAgKHZvaWQpIG1QbGF5ZXJCYXNlLT5zdG9wKCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c3lzdGVtU3RvcEZyb21BcHAoKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVN0cmVhbUxvY2spOwogICAgIGlmIChjb2xsaWRlc1dpdGhDYWxsYmFjaygpKSB7Ci0gICAgICAgIEFMT0dFKCJzdHJlYW0gY2Fubm90IGJlIHN0b3BwZWQgZnJvbSBhIGNhbGxiYWNrISIpOworICAgICAgICBBTE9HRSgic3RyZWFtIGNhbm5vdCBiZSBzdG9wcGVkIGJ5IGNhbGxpbmcgZnJvbSBhIGNhbGxiYWNrISIpOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzYWZlU3RvcCgpOworICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CisgICAgICAgIC8vIFdlIG9ubHkgY2FsbCB0aGlzIGZvciBsb2dnaW5nIGluICJkdW1wc3lzIGF1ZGlvIi4gU28gaWdub3JlIHJldHVybiBjb2RlLgorICAgICAgICAodm9pZCkgbVBsYXllckJhc2UtPnN0b3AoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gVGhpcyBtdXN0IGJlIGNhbGxlZCB1bmRlciBtU3RyZWFtTG9jay4KK2FhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZVN0b3AoKSB7CiAKICAgICBzd2l0Y2ggKGdldFN0YXRlKCkpIHsKICAgICAgICAgLy8gUHJvY2VlZCB3aXRoIHN0b3BwaW5nLgpAQCAtMjI1LDggKzI0MCw4IEBACiAgICAgICAgIGNhc2UgQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TSU5HOgogICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEOgogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coInJlcXVlc3RTdG9wKCkgc3RyZWFtIG5vdCBydW5uaW5nLCBzdGF0ZSA9ICVzIiwKLSAgICAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoZ2V0U3RhdGUoKSkpOworICAgICAgICAgICAgQUxPR1coIiVzKCkgc3RyZWFtIG5vdCBydW5uaW5nLCBzdGF0ZSA9ICVzIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICBBdWRpb0dsb2JhbF9jb252ZXJ0U3RyZWFtU3RhdGVUb1RleHQoZ2V0U3RhdGUoKSkpOwogICAgICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KIApAQCAtMjM0LDYgKzI0OSw3IEBACiB9CiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbTo6c2FmZUNsb3NlKCkgeworICAgIC8vIFRoaXMgZ2V0IHRlbXBvcmFyaWx5IHVubG9ja2VkIGluIHRoZSBjbG9zZSB3aGVuIGpvaW5pbmcgY2FsbGJhY2sgdGhyZWFkcy4KICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtU3RyZWFtTG9jayk7CiAgICAgaWYgKGNvbGxpZGVzV2l0aENhbGxiYWNrKCkpIHsKICAgICAgICAgQUxPR0UoIiVzIGNhbm5vdCBiZSBjYWxsZWQgZnJvbSBhIGNhbGxiYWNrISIsIF9fZnVuY19fKTsKQEAgLTI0MywxNSArMjU5LDE1IEBACiB9CiAKIHZvaWQgQXVkaW9TdHJlYW06OnNldFN0YXRlKGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSkgewotICAgIEFMT0dWKCIlcyglcCkgZnJvbSAlZCB0byAlZCIsIF9fZnVuY19fLCB0aGlzLCBtU3RhdGUsIHN0YXRlKTsKKyAgICBBTE9HVigiJXMoJWQpIGZyb20gJWQgdG8gJWQiLCBfX2Z1bmNfXywgZ2V0SWQoKSwgbVN0YXRlLCBzdGF0ZSk7CiAgICAgLy8gQ0xPU0VEIGlzIGEgZmluYWwgc3RhdGUKICAgICBpZiAobVN0YXRlID09IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEKSB7Ci0gICAgICAgIEFMT0dFKCIlcyglcCkgdHJpZWQgdG8gc2V0IHRvICVkIGJ1dCBhbHJlYWR5IENMT1NFRCIsIF9fZnVuY19fLCB0aGlzLCBzdGF0ZSk7CisgICAgICAgIEFMT0dFKCIlcyglZCkgdHJpZWQgdG8gc2V0IHRvICVkIGJ1dCBhbHJlYWR5IENMT1NFRCIsIF9fZnVuY19fLCBnZXRJZCgpLCBzdGF0ZSk7CiAKICAgICAvLyBPbmNlIERJU0NPTk5FQ1RFRCwgd2UgY2FuIG9ubHkgbW92ZSB0byBDTE9TRUQgc3RhdGUuCiAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQKICAgICAgICAgICAgICAgICYmIHN0YXRlICE9IEFBVURJT19TVFJFQU1fU1RBVEVfQ0xPU0VEKSB7Ci0gICAgICAgIEFMT0dFKCIlcyglcCkgdHJpZWQgdG8gc2V0IHRvICVkIGJ1dCBhbHJlYWR5IERJU0NPTk5FQ1RFRCIsIF9fZnVuY19fLCB0aGlzLCBzdGF0ZSk7CisgICAgICAgIEFMT0dFKCIlcyglZCkgdHJpZWQgdG8gc2V0IHRvICVkIGJ1dCBhbHJlYWR5IERJU0NPTk5FQ1RFRCIsIF9fZnVuY19fLCBnZXRJZCgpLCBzdGF0ZSk7CiAKICAgICB9IGVsc2UgewogICAgICAgICBtU3RhdGUgPSBzdGF0ZTsKQEAgLTM1MCwyMSArMzY2LDM3IEBACiAgICAgfQogfQogCi1hYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW06OmpvaW5UaHJlYWQodm9pZCoqIHJldHVybkFyZywgaW50NjRfdCB0aW1lb3V0TmFub3NlY29uZHMpCisvLyBUaGlzIG11c3QgYmUgY2FsbGVkIHVuZGVyIG1TdHJlYW1Mb2NrLgorYWF1ZGlvX3Jlc3VsdF90IEF1ZGlvU3RyZWFtOjpqb2luVGhyZWFkKHZvaWQqKiByZXR1cm5BcmcsIGludDY0X3QgdGltZW91dE5hbm9zZWNvbmRzIF9fdW51c2VkKQogewogICAgIGlmICghbUhhc1RocmVhZCkgewogICAgICAgICBBTE9HRSgiam9pblRocmVhZCgpIC0gYnV0IGhhcyBubyB0aHJlYWQiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgIH0KKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworICAgIC8vIElmIHRoZSBjYWxsYmFjayBpcyBzdG9wcGluZyB0aGUgc3RyZWFtIGJlY2F1c2UgdGhlIGFwcCBwYXNzZWQgYmFjayBTVE9QCisgICAgLy8gdGhlbiB3ZSBkb24ndCBuZWVkIHRvIGpvaW4oKS4gVGhlIHRocmVhZCBpcyBhbHJlYWR5IGFib3V0IHRvIGV4aXQuCisgICAgaWYgKHB0aHJlYWRfc2VsZigpICE9IG1UaHJlYWQpIHsKKyAgICAgICAgLy8gQ2FsbGVkIGZyb20gYW4gYXBwIHRocmVhZC4gTm90IHRoZSBjYWxsYmFjay4KKyAgICAgICAgLy8gVW5sb2NrIGJlY2F1c2UgdGhlIGNhbGxiYWNrIG1heSBiZSB0cnlpbmcgdG8gc3RvcCB0aGUgc3RyZWFtIGJ1dCBpcyBibG9ja2VkLgorICAgICAgICBtU3RyZWFtTG9jay51bmxvY2soKTsKICNpZiAwCi0gICAgLy8gVE9ETyBpbXBsZW1lbnQgZXF1aXZhbGVudCBvZiBwdGhyZWFkX3RpbWVkam9pbl9ucCgpCi0gICAgc3RydWN0IHRpbWVzcGVjIGFic3RpbWU7Ci0gICAgaW50IGVyciA9IHB0aHJlYWRfdGltZWRqb2luX25wKG1UaHJlYWQsIHJldHVybkFyZywgJmFic3RpbWUpOworICAgICAgICAvLyBUT0RPIGltcGxlbWVudCBlcXVpdmFsZW50IG9mIHB0aHJlYWRfdGltZWRqb2luX25wKCkKKyAgICAgICAgc3RydWN0IHRpbWVzcGVjIGFic3RpbWU7CisgICAgICAgIGludCBlcnIgPSBwdGhyZWFkX3RpbWVkam9pbl9ucChtVGhyZWFkLCByZXR1cm5BcmcsICZhYnN0aW1lKTsKICNlbHNlCi0gICAgaW50IGVyciA9IHB0aHJlYWRfam9pbihtVGhyZWFkLCByZXR1cm5BcmcpOworICAgICAgICBpbnQgZXJyID0gcHRocmVhZF9qb2luKG1UaHJlYWQsIHJldHVybkFyZyk7CiAjZW5kaWYKKyAgICAgICAgbVN0cmVhbUxvY2subG9jaygpOworICAgICAgICBpZiAoZXJyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMoKSBwdGhyZWFkX2pvaW4oKSByZXR1cm5zIGVyciA9ICVkIiwgX19mdW5jX18sIGVycik7CisgICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdCgtZXJyKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBUaGlzIG11c3QgYmUgc2V0IGZhbHNlIHNvIHRoYXQgdGhlIGNhbGxiYWNrIHRocmVhZCBjYW4gYmUgY3JlYXRlZAorICAgIC8vIHdoZW4gdGhlIHN0cmVhbSBpcyByZXN0YXJ0ZWQuCiAgICAgbUhhc1RocmVhZCA9IGZhbHNlOwotICAgIHJldHVybiBlcnIgPyBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdCgtZXJybm8pIDogbVRocmVhZFJlZ2lzdHJhdGlvblJlc3VsdDsKKyAgICByZXR1cm4gKHJlc3VsdCAhPSBBQVVESU9fT0spID8gcmVzdWx0IDogbVRocmVhZFJlZ2lzdHJhdGlvblJlc3VsdDsKIH0KIAogYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgQXVkaW9TdHJlYW06Om1heWJlQ2FsbERhdGFDYWxsYmFjayh2b2lkICphdWRpb0RhdGEsCkBAIC00MzgsMTIgKzQ3MCwxMSBAQAogfQogCiBBdWRpb1N0cmVhbTo6TXlQbGF5ZXJCYXNlOjp+TXlQbGF5ZXJCYXNlKCkgewotICAgIEFMT0dWKCJNeVBsYXllckJhc2U6On5NeVBsYXllckJhc2UoJXApIGRlbGV0ZWQiLCB0aGlzKTsKIH0KIAogdm9pZCBBdWRpb1N0cmVhbTo6TXlQbGF5ZXJCYXNlOjpyZWdpc3RlcldpdGhBdWRpb01hbmFnZXIoKSB7CiAgICAgaWYgKCFtUmVnaXN0ZXJlZCkgewotICAgICAgICBpbml0KGFuZHJvaWQ6OlBMQVlFUl9UWVBFX0FBVURJTywgQVVESU9fVVNBR0VfTUVESUEpOworICAgICAgICBpbml0KGFuZHJvaWQ6OlBMQVlFUl9UWVBFX0FBVURJTywgQUF1ZGlvQ29udmVydF91c2FnZVRvSW50ZXJuYWwobVBhcmVudC0+Z2V0VXNhZ2UoKSkpOwogICAgICAgICBtUmVnaXN0ZXJlZCA9IHRydWU7CiAgICAgfQogfQpAQCAtNDU4LDMgKzQ4OSw1IEBACiB2b2lkIEF1ZGlvU3RyZWFtOjpNeVBsYXllckJhc2U6OmRlc3Ryb3koKSB7CiAgICAgdW5yZWdpc3RlcldpdGhBdWRpb01hbmFnZXIoKTsKIH0KKworfSAgLy8gbmFtZXNwYWNlIGFhdWRpbwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uaAppbmRleCAzMWI4OTVjLi4wNDRjOTc5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW0uaApAQCAtMzYsNiArMzYsNyBAQAogbmFtZXNwYWNlIGFhdWRpbyB7CiAKIHR5cGVkZWYgdm9pZCAqKCphYXVkaW9fYXVkaW9fdGhyZWFkX3Byb2NfdCkodm9pZCAqKTsKK3R5cGVkZWYgdWludDMyX3QgYWF1ZGlvX3N0cmVhbV9pZF90OwogCiBjbGFzcyBBdWRpb1N0cmVhbUJ1aWxkZXI7CiAKQEAgLTUxLDIxICs1Miw2IEBACiAKICAgICB2aXJ0dWFsIH5BdWRpb1N0cmVhbSgpOwogCi0gICAgLyoqCi0gICAgICogTG9jayBhIG11dGV4IGFuZCBtYWtlIHN1cmUgd2UgYXJlIG5vdCBjYWxsaW5nIGZyb20gYSBjYWxsYmFjayBmdW5jdGlvbi4KLSAgICAgKiBAcmV0dXJuIHJlc3VsdCBvZiByZXF1ZXN0U3RhcnQoKTsKLSAgICAgKi8KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZVN0YXJ0KCk7Ci0KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZVBhdXNlKCk7Ci0KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZUZsdXNoKCk7Ci0KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc2FmZVN0b3AoKTsKLQotICAgIGFhdWRpb19yZXN1bHRfdCBzYWZlQ2xvc2UoKTsKLQotICAgIC8vID09PT09PT09PT09IEJlZ2luIEFCU1RSQUNUIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09CiBwcm90ZWN0ZWQ6CiAKICAgICAvKiBBc3luY2hyb25vdXMgcmVxdWVzdHMuCkBAIC03NCw3ICs2MCw3IEBACiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgcmVxdWVzdFN0YXJ0KCkgPSAwOwogCiAgICAgLyoqCi0gICAgICogQ2hlY2sgdGhlIHN0YXRlIHRvIHNlZSBpZiBQYXVzZSBpZiBjdXJyZW50bHkgbGVnYWwuCisgICAgICogQ2hlY2sgdGhlIHN0YXRlIHRvIHNlZSBpZiBQYXVzZSBpcyBjdXJyZW50bHkgbGVnYWwuCiAgICAgICoKICAgICAgKiBAcGFyYW0gcmVzdWx0IHBvaW50ZXIgdG8gcmV0dXJuIGNvZGUKICAgICAgKiBAcmV0dXJuIHRydWUgaWYgT0sgdG8gY29udGludWUsIGlmIGZhbHNlIHRoZW4gcmV0dXJuIHJlc3VsdApAQCAtMTM2LDYgKzEyMiwxMiBAQAogICAgICAgICByZXR1cm4gQUFVRElPX09LOwogICAgIH0KIAorICAgIC8vIFRoaXMgaXMgb25seSB1c2VkIHRvIGlkZW50aWZ5IGEgc3RyZWFtIGluIHRoZSBsb2dzIHdpdGhvdXQKKyAgICAvLyByZXZlYWxpbmcgYW55IHBvaW50ZXJzLgorICAgIGFhdWRpb19zdHJlYW1faWRfdCBnZXRJZCgpIHsKKyAgICAgICAgcmV0dXJuIG1TdHJlYW1JZDsKKyAgICB9CisKICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzZXRCdWZmZXJTaXplKGludDMyX3QgcmVxdWVzdGVkRnJhbWVzKSA9IDA7CiAKICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBjcmVhdGVUaHJlYWQoaW50NjRfdCBwZXJpb2ROYW5vc2Vjb25kcywKQEAgLTE5Miw3ICsxODQsNyBAQAogICAgICAgICByZXR1cm4gbVNhbXBsZVJhdGU7CiAgICAgfQogCi0gICAgYWF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpICBjb25zdCB7CisgICAgYXVkaW9fZm9ybWF0X3QgZ2V0Rm9ybWF0KCkgIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1Gb3JtYXQ7CiAgICAgfQogCkBAIC0yMzQsNiArMjI2LDEwIEBACiAgICAgICAgIHJldHVybiBtSW5wdXRQcmVzZXQ7CiAgICAgfQogCisgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBnZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BbGxvd2VkQ2FwdHVyZVBvbGljeTsKKyAgICB9CisKICAgICBpbnQzMl90IGdldFNlc3Npb25JZCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1TZXNzaW9uSWQ7CiAgICAgfQpAQCAtMjQ5LDIxICsyNDUsMTQgQEAKICAgICAgKiBUaGlzIGlzIG9ubHkgdmFsaWQgYWZ0ZXIgc2V0Rm9ybWF0KCkgaGFzIGJlZW4gY2FsbGVkLgogICAgICAqLwogICAgIGludDMyX3QgZ2V0Qnl0ZXNQZXJTYW1wbGUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMobUZvcm1hdCk7CisgICAgICAgIHJldHVybiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1Gb3JtYXQpOwogICAgIH0KIAogICAgIC8qKgogICAgICAqIFRoaXMgaXMgb25seSB2YWxpZCBhZnRlciBzZXRTYW1wbGVzUGVyRnJhbWUoKSBhbmQgc2V0RGV2aWNlRm9ybWF0KCkgaGF2ZSBiZWVuIGNhbGxlZC4KICAgICAgKi8KICAgICBpbnQzMl90IGdldEJ5dGVzUGVyRGV2aWNlRnJhbWUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtU2FtcGxlc1BlckZyYW1lICogZ2V0Qnl0ZXNQZXJEZXZpY2VTYW1wbGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGlzIG9ubHkgdmFsaWQgYWZ0ZXIgc2V0RGV2aWNlRm9ybWF0KCkgaGFzIGJlZW4gY2FsbGVkLgotICAgICAqLwotICAgIGludDMyX3QgZ2V0Qnl0ZXNQZXJEZXZpY2VTYW1wbGUoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2Zvcm1hdFRvU2l6ZUluQnl0ZXMoZ2V0RGV2aWNlRm9ybWF0KCkpOworICAgICAgICByZXR1cm4gZ2V0U2FtcGxlc1BlckZyYW1lKCkgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGdldERldmljZUZvcm1hdCgpKTsKICAgICB9CiAKICAgICB2aXJ0dWFsIGludDY0X3QgZ2V0RnJhbWVzV3JpdHRlbigpID0gMDsKQEAgLTM2MywzMyArMzUyLDI4IEBACiAgICAgICAgIG1QbGF5ZXJCYXNlLT51bnJlZ2lzdGVyV2l0aEF1ZGlvTWFuYWdlcigpOwogICAgIH0KIAotICAgIC8vIFBhc3Mgc3RhcnQgcmVxdWVzdCB0aHJvdWdoIFBsYXllckJhc2UgZm9yIHRyYWNraW5nLgotICAgIGFhdWRpb19yZXN1bHRfdCBzeXN0ZW1TdGFydCgpIHsKLSAgICAgICAgbVBsYXllckJhc2UtPnN0YXJ0KCk7Ci0gICAgICAgIC8vIFBhc3MgYWF1ZGlvX3Jlc3VsdF90IGFyb3VuZCB0aGUgUGxheWVyQmFzZSBpbnRlcmZhY2UsIHdoaWNoIHVzZXMgc3RhdHVzX190LgotICAgICAgICByZXR1cm4gbVBsYXllckJhc2UtPmdldFJlc3VsdCgpOwotICAgIH0KKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3lzdGVtU3RhcnQoKTsKIAotICAgIC8vIFBhc3MgcGF1c2UgcmVxdWVzdCB0aHJvdWdoIFBsYXllckJhc2UgZm9yIHRyYWNraW5nLgotICAgIGFhdWRpb19yZXN1bHRfdCBzeXN0ZW1QYXVzZSgpIHsKLSAgICAgICAgbVBsYXllckJhc2UtPnBhdXNlKCk7Ci0gICAgICAgIHJldHVybiBtUGxheWVyQmFzZS0+Z2V0UmVzdWx0KCk7Ci0gICAgfQorICAgIGFhdWRpb19yZXN1bHRfdCBzeXN0ZW1QYXVzZSgpOwogCi0gICAgLy8gUGFzcyBzdG9wIHJlcXVlc3QgdGhyb3VnaCBQbGF5ZXJCYXNlIGZvciB0cmFja2luZy4KLSAgICBhYXVkaW9fcmVzdWx0X3Qgc3lzdGVtU3RvcCgpIHsKLSAgICAgICAgbVBsYXllckJhc2UtPnN0b3AoKTsKLSAgICAgICAgcmV0dXJuIG1QbGF5ZXJCYXNlLT5nZXRSZXN1bHQoKTsKLSAgICB9CisgICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVGbHVzaCgpOworCisgICAgLyoqCisgICAgICogVGhpcyBpcyBjYWxsZWQgd2hlbiBhbiBhcHAgY2FsbHMgQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdG9wKCk7CisgICAgICogSXQgcHJldmVudHMgY2FsbHMgZnJvbSBhIGNhbGxiYWNrLgorICAgICAqLworICAgIGFhdWRpb19yZXN1bHRfdCBzeXN0ZW1TdG9wRnJvbUFwcCgpOworCisgICAgLyoqCisgICAgICogVGhpcyBpcyBjYWxsZWQgaW50ZXJuYWxseSB3aGVuIGFuIGFwcCBjYWxsYmFjayByZXR1cm5zIEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUC4KKyAgICAgKi8KKyAgICBhYXVkaW9fcmVzdWx0X3Qgc3lzdGVtU3RvcEZyb21DYWxsYmFjaygpOworCisgICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVDbG9zZSgpOwogCiBwcm90ZWN0ZWQ6CiAKLSAgICAvLyBQbGF5ZXJCYXNlIGFsbG93cyB0aGUgc3lzdGVtIHRvIGNvbnRyb2wgdGhlIHN0cmVhbS4KLSAgICAvLyBDYWxsaW5nIHRocm91Z2ggUGxheWVyQmFzZS0+c3RhcnQoKSBub3RpZmllcyB0aGUgQXVkaW9NYW5hZ2VyIG9mIHRoZSBwbGF5ZXIgc3RhdGUuCi0gICAgLy8gVGhlIEF1ZGlvTWFuYWdlciBhbHNvIGNhbiBzdGFydC9zdG9wIGEgc3RyZWFtIGJ5IGNhbGxpbmcgbVBsYXllckJhc2UtPnBsYXllclN0YXJ0KCkuCi0gICAgLy8gc3lzdGVtU3RhcnQoKSA9PT4gbVBsYXllckJhc2UtPnN0YXJ0KCkgICBtUGxheWVyQmFzZS0+cGxheWVyU3RhcnQoKSA9PT4gcmVxdWVzdFN0YXJ0KCkKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgIFwgICAgICAgICAgICAgICAgICAgICAgICAgICAvCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgLS0tLS0tIEF1ZGlvTWFuYWdlciAtLS0tLS0tCisgICAgLy8gUGxheWVyQmFzZSBhbGxvd3MgdGhlIHN5c3RlbSB0byBjb250cm9sIHRoZSBzdHJlYW0gdm9sdW1lLgogICAgIGNsYXNzIE15UGxheWVyQmFzZSA6IHB1YmxpYyBhbmRyb2lkOjpQbGF5ZXJCYXNlIHsKICAgICBwdWJsaWM6CiAgICAgICAgIGV4cGxpY2l0IE15UGxheWVyQmFzZShBdWRpb1N0cmVhbSAqcGFyZW50KTsKQEAgLTQxMywyMCArMzk3LDE5IEBACiAKICAgICAgICAgdm9pZCBjbGVhclBhcmVudFJlZmVyZW5jZSgpIHsgbVBhcmVudCA9IG51bGxwdHI7IH0KIAorICAgICAgICAvLyBKdXN0IGEgc3R1Yi4gVGhlIGFiaWxpdHkgdG8gc3RhcnQgYXVkaW8gdGhyb3VnaCBQbGF5ZXJCYXNlIGlzIGJlaW5nIGRlcHJlY2F0ZWQuCiAgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHBsYXllclN0YXJ0KCkgb3ZlcnJpZGUgewotICAgICAgICAgICAgLy8gbVBhcmVudCBzaG91bGQgTk9UIGJlIG51bGwuIFNvIGdvIGFoZWFkIGFuZCBjcmFzaCBpZiBpdCBpcy4KLSAgICAgICAgICAgIG1SZXN1bHQgPSBtUGFyZW50LT5zYWZlU3RhcnQoKTsKLSAgICAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhtUmVzdWx0KTsKKyAgICAgICAgICAgIHJldHVybiBhbmRyb2lkOjpOT19FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIC8vIEp1c3QgYSBzdHViLiBUaGUgYWJpbGl0eSB0byBwYXVzZSBhdWRpbyB0aHJvdWdoIFBsYXllckJhc2UgaXMgYmVpbmcgZGVwcmVjYXRlZC4KICAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGxheWVyUGF1c2UoKSBvdmVycmlkZSB7Ci0gICAgICAgICAgICBtUmVzdWx0ID0gbVBhcmVudC0+c2FmZVBhdXNlKCk7Ci0gICAgICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTdGF0dXMobVJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gYW5kcm9pZDo6Tk9fRVJST1I7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBKdXN0IGEgc3R1Yi4gVGhlIGFiaWxpdHkgdG8gc3RvcCBhdWRpbyB0aHJvdWdoIFBsYXllckJhc2UgaXMgYmVpbmcgZGVwcmVjYXRlZC4KICAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGxheWVyU3RvcCgpIG92ZXJyaWRlIHsKLSAgICAgICAgICAgIG1SZXN1bHQgPSBtUGFyZW50LT5zYWZlU3RvcCgpOwotICAgICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU3RhdHVzKG1SZXN1bHQpOworICAgICAgICAgICAgcmV0dXJuIGFuZHJvaWQ6Ok5PX0VSUk9SOwogICAgICAgICB9CiAKICAgICAgICAgYW5kcm9pZDo6c3RhdHVzX3QgcGxheWVyU2V0Vm9sdW1lKCkgb3ZlcnJpZGUgewpAQCAtNDc4LDE4ICs0NjEsMTggQEAKICAgICAvKioKICAgICAgKiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIHRoZSBvcGVuKCkgY2FsbC4KICAgICAgKi8KLSAgICB2b2lkIHNldEZvcm1hdChhYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgdm9pZCBzZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CiAgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CiAgICAgfQogCiAgICAgLyoqCiAgICAgICogVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciB0aGUgb3BlbigpIGNhbGwuCiAgICAgICovCi0gICAgdm9pZCBzZXREZXZpY2VGb3JtYXQoYWF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgeworICAgIHZvaWQgc2V0RGV2aWNlRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewogICAgICAgICBtRGV2aWNlRm9ybWF0ID0gZm9ybWF0OwogICAgIH0KIAotICAgIGFhdWRpb19mb3JtYXRfdCBnZXREZXZpY2VGb3JtYXQoKSBjb25zdCB7CisgICAgYXVkaW9fZm9ybWF0X3QgZ2V0RGV2aWNlRm9ybWF0KCkgY29uc3QgewogICAgICAgICByZXR1cm4gbURldmljZUZvcm1hdDsKICAgICB9CiAKQEAgLTU1Myw4ICs1MzYsMTcgQEAKICAgICAgICAgbUlucHV0UHJlc2V0ID0gaW5wdXRQcmVzZXQ7CiAgICAgfQogCisgICAgLyoqCisgICAgICogVGhpcyBzaG91bGQgbm90IGJlIGNhbGxlZCBhZnRlciB0aGUgb3BlbigpIGNhbGwuCisgICAgICovCisgICAgdm9pZCBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeShhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IHBvbGljeSkgeworICAgICAgICBtQWxsb3dlZENhcHR1cmVQb2xpY3kgPSBwb2xpY3k7CisgICAgfQorCiBwcml2YXRlOgogCisgICAgYWF1ZGlvX3Jlc3VsdF90IHNhZmVTdG9wKCk7CisKICAgICBzdGQ6Om11dGV4ICAgICAgICAgICAgICAgICBtU3RyZWFtTG9jazsKIAogICAgIGNvbnN0IGFuZHJvaWQ6OnNwPE15UGxheWVyQmFzZT4gICBtUGxheWVyQmFzZTsKQEAgLTU2NSwxOSArNTU3LDIwIEBACiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2VJZCA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgICAgICAgbVNoYXJpbmdNb2RlID0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgIG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQgPSBmYWxzZTsgLy8gbXVzdCBtYXRjaCBzaGFyaW5nIG1vZGUgcmVxdWVzdGVkCi0gICAgYWF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgIG1Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOworICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgICAgICBtRm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7CiAgICAgYWF1ZGlvX3N0cmVhbV9zdGF0ZV90ICAgICAgIG1TdGF0ZSA9IEFBVURJT19TVFJFQU1fU1RBVEVfVU5JTklUSUFMSVpFRDsKICAgICBhYXVkaW9fcGVyZm9ybWFuY2VfbW9kZV90ICAgbVBlcmZvcm1hbmNlTW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU7CiAKICAgICBhYXVkaW9fdXNhZ2VfdCAgICAgICAgICAgICAgbVVzYWdlICAgICAgICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBhYXVkaW9fY29udGVudF90eXBlX3QgICAgICAgbUNvbnRlbnRUeXBlICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKICAgICBhYXVkaW9faW5wdXRfcHJlc2V0X3QgICAgICAgbUlucHV0UHJlc2V0ICAgICA9IEFBVURJT19VTlNQRUNJRklFRDsKKyAgICBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IG1BbGxvd2VkQ2FwdHVyZVBvbGljeSA9IEFBVURJT19BTExPV19DQVBUVVJFX0JZX0FMTDsKIAogICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkID0gQUFVRElPX1VOU1BFQ0lGSUVEOwogCiAgICAgLy8gU29tZXRpbWVzIHRoZSBoYXJkd2FyZSBpcyBvcGVyYXRpbmcgd2l0aCBhIGRpZmZlcmVudCBmb3JtYXQgZnJvbSB0aGUgYXBwLgogICAgIC8vIFRoZW4gd2UgcmVxdWlyZSBjb252ZXJzaW9uIGluIEFBdWRpby4KLSAgICBhYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgbURldmljZUZvcm1hdCA9IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQ7CisgICAgYXVkaW9fZm9ybWF0X3QgICAgICAgICAgICAgIG1EZXZpY2VGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKIAogICAgIC8vIGNhbGxiYWNrIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNjAxLDYgKzU5NCw4IEBACiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgKm1UaHJlYWRBcmcgPSBudWxscHRyOwogICAgIGFhdWRpb19yZXN1bHRfdCAgICAgICAgICAgICBtVGhyZWFkUmVnaXN0cmF0aW9uUmVzdWx0ID0gQUFVRElPX09LOwogCisgICAgY29uc3QgYWF1ZGlvX3N0cmVhbV9pZF90ICAgIG1TdHJlYW1JZDsKKwogfTsKIAogfSAvKiBuYW1lc3BhY2UgYWF1ZGlvICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwCmluZGV4IDRlZjc2NWQuLjQ0ZjQ1YjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuY3BwCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSAiYmluZGluZy9BQXVkaW9CaW5kZXJDbGllbnQuaCIKICNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbENhcHR1cmUuaCIKICNpbmNsdWRlICJjbGllbnQvQXVkaW9TdHJlYW1JbnRlcm5hbFBsYXkuaCIKKyNpbmNsdWRlICJjb3JlL0F1ZGlvR2xvYmFsLmgiCiAjaW5jbHVkZSAiY29yZS9BdWRpb1N0cmVhbS5oIgogI2luY2x1ZGUgImNvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmgiCiAjaW5jbHVkZSAibGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmgiCkBAIC0xMDQsMTMgKzEwNSwxNSBAQAogICAgIH0KICAgICAqc3RyZWFtUHRyID0gbnVsbHB0cjsKIAorICAgIGxvZ1BhcmFtZXRlcnMoKTsKKwogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSB2YWxpZGF0ZSgpOwogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfQogCiAgICAgLy8gVGhlIEFQSSBzZXR0aW5nIGlzIHRoZSBoaWdoZXN0IHByaW9yaXR5LgotICAgIGFhdWRpb19wb2xpY3lfdCBtbWFwUG9saWN5ID0gQUF1ZGlvX2dldE1NYXBQb2xpY3koKTsKKyAgICBhYXVkaW9fcG9saWN5X3QgbW1hcFBvbGljeSA9IEF1ZGlvR2xvYmFsX2dldE1NYXBQb2xpY3koKTsKICAgICAvLyBJZiBub3Qgc3BlY2lmaWVkIHRoZW4gZ2V0IGZyb20gYSBzeXN0ZW0gcHJvcGVydHkuCiAgICAgaWYgKG1tYXBQb2xpY3kgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSB7CiAgICAgICAgIG1tYXBQb2xpY3kgPSBBQXVkaW9Qcm9wZXJ0eV9nZXRNTWFwUG9saWN5KCk7CkBAIC0yMTcsMyArMjIwLDQxIEBACiAKICAgICByZXR1cm4gQUFVRElPX09LOwogfQorCitzdGF0aWMgY29uc3QgY2hhciAqQUF1ZGlvX2NvbnZlcnRTaGFyaW5nTW9kZVRvU2hvcnRUZXh0KGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgeworICAgIHN3aXRjaCAoc2hhcmluZ01vZGUpIHsKKyAgICAgICAgY2FzZSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRToKKyAgICAgICAgICAgIHJldHVybiAiRVgiOworICAgICAgICBjYXNlIEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOgorICAgICAgICAgICAgcmV0dXJuICJTSCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIj8hIjsKKyAgICB9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpBQXVkaW9fY29udmVydERpcmVjdGlvblRvVGV4dChhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CisgICAgc3dpdGNoIChkaXJlY3Rpb24pIHsKKyAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX09VVFBVVDoKKyAgICAgICAgICAgIHJldHVybiAiT1VUUFVUIjsKKyAgICAgICAgY2FzZSBBQVVESU9fRElSRUNUSU9OX0lOUFVUOgorICAgICAgICAgICAgcmV0dXJuICJJTlBVVCI7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gIj8hIjsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9TdHJlYW1CdWlsZGVyOjpsb2dQYXJhbWV0ZXJzKCkgY29uc3QgeworICAgIC8vIFRoaXMgaXMgdmVyeSBoZWxwZnVsIGZvciBkZWJ1Z2dpbmcgaW4gdGhlIGZ1dHVyZS4gUGxlYXNlIGxlYXZlIGl0IGluLgorICAgIEFMT0dJKCJyYXRlICAgPSAlNmQsIGNoYW5uZWxzICA9ICVkLCBmb3JtYXQgICA9ICVkLCBzaGFyaW5nID0gJXMsIGRpciA9ICVzIiwKKyAgICAgICAgICBnZXRTYW1wbGVSYXRlKCksIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBnZXRGb3JtYXQoKSwKKyAgICAgICAgICBBQXVkaW9fY29udmVydFNoYXJpbmdNb2RlVG9TaG9ydFRleHQoZ2V0U2hhcmluZ01vZGUoKSksCisgICAgICAgICAgQUF1ZGlvX2NvbnZlcnREaXJlY3Rpb25Ub1RleHQoZ2V0RGlyZWN0aW9uKCkpKTsKKyAgICBBTE9HSSgiZGV2aWNlID0gJTZkLCBzZXNzaW9uSWQgPSAlZCwgcGVyZk1vZGUgPSAlZCwgY2FsbGJhY2s6ICVzIHdpdGggZnJhbWVzID0gJWQiLAorICAgICAgICAgIGdldERldmljZUlkKCksCisgICAgICAgICAgZ2V0U2Vzc2lvbklkKCksCisgICAgICAgICAgZ2V0UGVyZm9ybWFuY2VNb2RlKCksCisgICAgICAgICAgKChnZXREYXRhQ2FsbGJhY2tQcm9jKCkgIT0gbnVsbHB0cikgPyAiT04iIDogIk9GRiIpLAorICAgICAgICAgIG1GcmFtZXNQZXJEYXRhQ2FsbGJhY2spOworICAgIEFMT0dJKCJ1c2FnZSAgPSAlNmQsIGNvbnRlbnRUeXBlID0gJWQsIGlucHV0UHJlc2V0ID0gJWQsIGFsbG93ZWRDYXB0dXJlUG9saWN5ID0gJWQiLAorICAgICAgICAgIGdldFVzYWdlKCksIGdldENvbnRlbnRUeXBlKCksIGdldElucHV0UHJlc2V0KCksIGdldEFsbG93ZWRDYXB0dXJlUG9saWN5KCkpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9jb3JlL0F1ZGlvU3RyZWFtQnVpbGRlci5oCmluZGV4IGE0M2NmYTguLjgxNDlhZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvY29yZS9BdWRpb1N0cmVhbUJ1aWxkZXIuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2NvcmUvQXVkaW9TdHJlYW1CdWlsZGVyLmgKQEAgLTEwMiw2ICsxMDIsOCBAQAogCiAgICAgdmlydHVhbCBhYXVkaW9fcmVzdWx0X3QgdmFsaWRhdGUoKSBjb25zdCBvdmVycmlkZTsKIAorICAgIHZvaWQgbG9nUGFyYW1ldGVycygpIGNvbnN0OworCiBwcml2YXRlOgogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgIG1TaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQgPSBmYWxzZTsgLy8gbXVzdCBtYXRjaCBzaGFyaW5nIG1vZGUgcmVxdWVzdGVkCiAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCAgbVBlcmZvcm1hbmNlTW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5jcHAKaW5kZXggYjA5MjU4ZS4uZjUxMTNmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmNwcApAQCAtMjMsMzAgKzIzLDI2IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWVtb3J5PgogCiAjaW5jbHVkZSAiRmlmb0NvbnRyb2xsZXJCYXNlLmgiCiAjaW5jbHVkZSAiRmlmb0NvbnRyb2xsZXIuaCIKICNpbmNsdWRlICJGaWZvQ29udHJvbGxlckluZGlyZWN0LmgiCiAjaW5jbHVkZSAiRmlmb0J1ZmZlci5oIgogCi11c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKK3VzaW5nIGFuZHJvaWQ6OkZpZm9CdWZmZXI7Cit1c2luZyBhbmRyb2lkOjpmaWZvX2ZyYW1lc190OwogCiBGaWZvQnVmZmVyOjpGaWZvQnVmZmVyKGludDMyX3QgYnl0ZXNQZXJGcmFtZSwgZmlmb19mcmFtZXNfdCBjYXBhY2l0eUluRnJhbWVzKQotICAgICAgICA6IG1GcmFtZUNhcGFjaXR5KGNhcGFjaXR5SW5GcmFtZXMpCi0gICAgICAgICwgbUJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSkKLSAgICAgICAgLCBtU3RvcmFnZShudWxscHRyKQotICAgICAgICAsIG1GcmFtZXNSZWFkQ291bnQoMCkKLSAgICAgICAgLCBtRnJhbWVzVW5kZXJydW5Db3VudCgwKQotICAgICAgICAsIG1VbmRlcnJ1bkNvdW50KDApCisgICAgICAgIDogbUJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSkKIHsKLSAgICAvLyBUT0RPIEhhbmRsZSBwb3NzaWJsZSBmYWlsdXJlcyB0byBhbGxvY2F0ZS4gTW92ZSBvdXQgb2YgY29uc3RydWN0b3I/Ci0gICAgbUZpZm8gPSBuZXcgRmlmb0NvbnRyb2xsZXIoY2FwYWNpdHlJbkZyYW1lcywgY2FwYWNpdHlJbkZyYW1lcyk7CisgICAgbUZpZm8gPSBzdGQ6Om1ha2VfdW5pcXVlPEZpZm9Db250cm9sbGVyPihjYXBhY2l0eUluRnJhbWVzLCBjYXBhY2l0eUluRnJhbWVzKTsKICAgICAvLyBhbGxvY2F0ZSBidWZmZXIKICAgICBpbnQzMl90IGJ5dGVzUGVyQnVmZmVyID0gYnl0ZXNQZXJGcmFtZSAqIGNhcGFjaXR5SW5GcmFtZXM7CiAgICAgbVN0b3JhZ2UgPSBuZXcgdWludDhfdFtieXRlc1BlckJ1ZmZlcl07CiAgICAgbVN0b3JhZ2VPd25lZCA9IHRydWU7Ci0gICAgQUxPR1YoImNhcGFjaXR5SW5GcmFtZXMgPSAlZCwgYnl0ZXNQZXJGcmFtZSA9ICVkIiwKLSAgICAgICAgICBjYXBhY2l0eUluRnJhbWVzLCBieXRlc1BlckZyYW1lKTsKKyAgICBBTE9HVigiJXMoKSBjYXBhY2l0eUluRnJhbWVzID0gJWQsIGJ5dGVzUGVyRnJhbWUgPSAlZCIsCisgICAgICAgICAgX19mdW5jX18sIGNhcGFjaXR5SW5GcmFtZXMsIGJ5dGVzUGVyRnJhbWUpOwogfQogCiBGaWZvQnVmZmVyOjpGaWZvQnVmZmVyKCBpbnQzMl90ICAgYnl0ZXNQZXJGcmFtZSwKQEAgLTU1LDE0ICs1MSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgZmlmb19jb3VudGVyX3QgKiAgd3JpdGVJbmRleEFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogIGRhdGFTdG9yYWdlQWRkcmVzcwogICAgICAgICAgICAgICAgICAgICAgICAgKQotICAgICAgICA6IG1GcmFtZUNhcGFjaXR5KGNhcGFjaXR5SW5GcmFtZXMpCi0gICAgICAgICwgbUJ5dGVzUGVyRnJhbWUoYnl0ZXNQZXJGcmFtZSkKKyAgICAgICAgOiBtQnl0ZXNQZXJGcmFtZShieXRlc1BlckZyYW1lKQogICAgICAgICAsIG1TdG9yYWdlKHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4oZGF0YVN0b3JhZ2VBZGRyZXNzKSkKLSAgICAgICAgLCBtRnJhbWVzUmVhZENvdW50KDApCi0gICAgICAgICwgbUZyYW1lc1VuZGVycnVuQ291bnQoMCkKLSAgICAgICAgLCBtVW5kZXJydW5Db3VudCgwKQogewotICAgIG1GaWZvID0gbmV3IEZpZm9Db250cm9sbGVySW5kaXJlY3QoY2FwYWNpdHlJbkZyYW1lcywKKyAgICBtRmlmbyA9IHN0ZDo6bWFrZV91bmlxdWU8Rmlmb0NvbnRyb2xsZXJJbmRpcmVjdD4oY2FwYWNpdHlJbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5SW5GcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkSW5kZXhBZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVJbmRleEFkZHJlc3MpOwpAQCAtNzMsMTAgKzY1LDggQEAKICAgICBpZiAobVN0b3JhZ2VPd25lZCkgewogICAgICAgICBkZWxldGVbXSBtU3RvcmFnZTsKICAgICB9Ci0gICAgZGVsZXRlIG1GaWZvOwogfQogCi0KIGludDMyX3QgRmlmb0J1ZmZlcjo6Y29udmVydEZyYW1lc1RvQnl0ZXMoZmlmb19mcmFtZXNfdCBmcmFtZXMpIHsKICAgICByZXR1cm4gZnJhbWVzICogbUJ5dGVzUGVyRnJhbWU7CiB9CkBAIC04NywxMSArNzcsMTIgQEAKICAgICB3cmFwcGluZ0J1ZmZlci0+ZGF0YVsxXSA9IG51bGxwdHI7CiAgICAgd3JhcHBpbmdCdWZmZXItPm51bUZyYW1lc1sxXSA9IDA7CiAgICAgaWYgKGZyYW1lc0F2YWlsYWJsZSA+IDApIHsKKyAgICAgICAgZmlmb19mcmFtZXNfdCBjYXBhY2l0eSA9IG1GaWZvLT5nZXRDYXBhY2l0eSgpOwogICAgICAgICB1aW50OF90ICpzb3VyY2UgPSAmbVN0b3JhZ2VbY29udmVydEZyYW1lc1RvQnl0ZXMoc3RhcnRJbmRleCldOwogICAgICAgICAvLyBEb2VzIHRoZSBhdmFpbGFibGUgZGF0YSBjcm9zcyB0aGUgZW5kIG9mIHRoZSBGSUZPPwotICAgICAgICBpZiAoKHN0YXJ0SW5kZXggKyBmcmFtZXNBdmFpbGFibGUpID4gbUZyYW1lQ2FwYWNpdHkpIHsKKyAgICAgICAgaWYgKChzdGFydEluZGV4ICsgZnJhbWVzQXZhaWxhYmxlKSA+IGNhcGFjaXR5KSB7CiAgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci0+ZGF0YVswXSA9IHNvdXJjZTsKLSAgICAgICAgICAgIGZpZm9fZnJhbWVzX3QgZmlyc3RGcmFtZXMgPSBtRnJhbWVDYXBhY2l0eSAtIHN0YXJ0SW5kZXg7CisgICAgICAgICAgICBmaWZvX2ZyYW1lc190IGZpcnN0RnJhbWVzID0gY2FwYWNpdHkgLSBzdGFydEluZGV4OwogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPm51bUZyYW1lc1swXSA9IGZpcnN0RnJhbWVzOwogICAgICAgICAgICAgd3JhcHBpbmdCdWZmZXItPmRhdGFbMV0gPSAmbVN0b3JhZ2VbMF07CiAgICAgICAgICAgICB3cmFwcGluZ0J1ZmZlci0+bnVtRnJhbWVzWzFdID0gZnJhbWVzQXZhaWxhYmxlIC0gZmlyc3RGcmFtZXM7CkBAIC0xMDcsNyArOTgsOCBAQAogCiBmaWZvX2ZyYW1lc190IEZpZm9CdWZmZXI6OmdldEZ1bGxEYXRhQXZhaWxhYmxlKFdyYXBwaW5nQnVmZmVyICp3cmFwcGluZ0J1ZmZlcikgewogICAgIC8vIFRoZSBGSUZPIG1pZ2h0IGJlIG92ZXJmdWxsIHNvIGNsaXAgdG8gY2FwYWNpdHkuCi0gICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPSBzdGQ6Om1pbihtRmlmby0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpLCBtRnJhbWVDYXBhY2l0eSk7CisgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPSBzdGQ6Om1pbihtRmlmby0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZpZm8tPmdldENhcGFjaXR5KCkpOwogICAgIGZpZm9fZnJhbWVzX3Qgc3RhcnRJbmRleCA9IG1GaWZvLT5nZXRSZWFkSW5kZXgoKTsKICAgICBmaWxsV3JhcHBpbmdCdWZmZXIod3JhcHBpbmdCdWZmZXIsIGZyYW1lc0F2YWlsYWJsZSwgc3RhcnRJbmRleCk7CiAgICAgcmV0dXJuIGZyYW1lc0F2YWlsYWJsZTsKQEAgLTExNSw3ICsxMDcsOCBAQAogCiBmaWZvX2ZyYW1lc190IEZpZm9CdWZmZXI6OmdldEVtcHR5Um9vbUF2YWlsYWJsZShXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIpIHsKICAgICAvLyBUaGUgRklGTyBtaWdodCBoYXZlIHVuZGVycnVuIHNvIGNsaXAgdG8gY2FwYWNpdHkuCi0gICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPSBzdGQ6Om1pbihtRmlmby0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKSwgbUZyYW1lQ2FwYWNpdHkpOworICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0gc3RkOjptaW4obUZpZm8tPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRmlmby0+Z2V0Q2FwYWNpdHkoKSk7CiAgICAgZmlmb19mcmFtZXNfdCBzdGFydEluZGV4ID0gbUZpZm8tPmdldFdyaXRlSW5kZXgoKTsKICAgICBmaWxsV3JhcHBpbmdCdWZmZXIod3JhcHBpbmdCdWZmZXIsIGZyYW1lc0F2YWlsYWJsZSwgc3RhcnRJbmRleCk7CiAgICAgcmV0dXJuIGZyYW1lc0F2YWlsYWJsZTsKQEAgLTE4MywyMyArMTc2LDYgQEAKICAgICByZXR1cm4gZnJhbWVzV3JpdHRlbjsKIH0KIAotZmlmb19mcmFtZXNfdCBGaWZvQnVmZmVyOjpyZWFkTm93KHZvaWQgKmJ1ZmZlciwgZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKLSAgICBtTGFzdFJlYWRTaXplID0gbnVtRnJhbWVzOwotICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzTGVmdCA9IG51bUZyYW1lczsKLSAgICBmaWZvX2ZyYW1lc190IGZyYW1lc1JlYWQgPSByZWFkKGJ1ZmZlciwgbnVtRnJhbWVzKTsKLSAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1JlYWQ7Ci0gICAgbUZyYW1lc1JlYWRDb3VudCArPSBmcmFtZXNSZWFkOwotICAgIG1GcmFtZXNVbmRlcnJ1bkNvdW50ICs9IGZyYW1lc0xlZnQ7Ci0gICAgLy8gWmVybyBvdXQgYW55IHNhbXBsZXMgd2UgY291bGQgbm90IHNldC4KLSAgICBpZiAoZnJhbWVzTGVmdCA+IDApIHsKLSAgICAgICAgbVVuZGVycnVuQ291bnQrKzsKLSAgICAgICAgaW50MzJfdCBieXRlc1RvWmVybyA9IGNvbnZlcnRGcmFtZXNUb0J5dGVzKGZyYW1lc0xlZnQpOwotICAgICAgICBtZW1zZXQoYnVmZmVyLCAwLCBieXRlc1RvWmVybyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZyYW1lc1JlYWQ7Ci19Ci0KIGZpZm9fZnJhbWVzX3QgRmlmb0J1ZmZlcjo6Z2V0VGhyZXNob2xkKCkgewogICAgIHJldHVybiBtRmlmby0+Z2V0VGhyZXNob2xkKCk7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9CdWZmZXIuaAppbmRleCBmNWE5ZTI3Li4wZDE4OGM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0J1ZmZlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQnVmZmVyLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgRklGT19GSUZPX0JVRkZFUl9ICiAjZGVmaW5lIEZJRk9fRklGT19CVUZGRVJfSAogCisjaW5jbHVkZSA8bWVtb3J5PgogI2luY2x1ZGUgPHN0ZGludC5oPgogCiAjaW5jbHVkZSAiRmlmb0NvbnRyb2xsZXJCYXNlLmgiCkBAIC03NywyNCArNzgsMTIgQEAKICAgICAgKi8KICAgICBmaWZvX2ZyYW1lc190IGdldEVtcHR5Um9vbUF2YWlsYWJsZShXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIpOwogCi0gICAgLyoqCi0gICAgICogQ29weSBkYXRhIGZyb20gdGhlIEZJRk8gaW50byB0aGUgYnVmZmVyLgotICAgICAqIEBwYXJhbSBidWZmZXIKLSAgICAgKiBAcGFyYW0gbnVtRnJhbWVzCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIGZpZm9fZnJhbWVzX3QgcmVhZE5vdyh2b2lkICpidWZmZXIsIGZpZm9fZnJhbWVzX3QgbnVtRnJhbWVzKTsKLQotICAgIGludDY0X3QgZ2V0TmV4dFJlYWRUaW1lKGludDMyX3QgZnJhbWVSYXRlKTsKLQotICAgIGludDMyX3QgZ2V0VW5kZXJydW5Db3VudCgpIGNvbnN0IHsgcmV0dXJuIG1VbmRlcnJ1bkNvdW50OyB9Ci0KLSAgICBGaWZvQ29udHJvbGxlckJhc2UgKmdldEZpZm9Db250cm9sbGVyQmFzZSgpIHsgcmV0dXJuIG1GaWZvOyB9Ci0KICAgICBpbnQzMl90IGdldEJ5dGVzUGVyRnJhbWUoKSB7CiAgICAgICAgIHJldHVybiBtQnl0ZXNQZXJGcmFtZTsKICAgICB9CiAKKyAgICAvLyBQcm94eSBtZXRob2RzIGZvciB0aGUgaW50ZXJuYWwgRmlmb0NvbnRyb2xsZXIKKwogICAgIGZpZm9fY291bnRlcl90IGdldFJlYWRDb3VudGVyKCkgewogICAgICAgICByZXR1cm4gbUZpZm8tPmdldFJlYWRDb3VudGVyKCk7CiAgICAgfQpAQCAtMTExLDYgKzEwMCwyMiBAQAogICAgICAgICBtRmlmby0+c2V0V3JpdGVDb3VudGVyKG4pOwogICAgIH0KIAorICAgIHZvaWQgYWR2YW5jZVJlYWRJbmRleChmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgeworICAgICAgICBtRmlmby0+YWR2YW5jZVJlYWRJbmRleChudW1GcmFtZXMpOworICAgIH0KKworICAgIHZvaWQgYWR2YW5jZVdyaXRlSW5kZXgoZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKKyAgICAgICAgbUZpZm8tPmFkdmFuY2VXcml0ZUluZGV4KG51bUZyYW1lcyk7CisgICAgfQorCisgICAgZmlmb19mcmFtZXNfdCBnZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1GaWZvLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgIH0KKworICAgIGZpZm9fZnJhbWVzX3QgZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpIHsKKyAgICAgICAgcmV0dXJuIG1GaWZvLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgfQorCiAgICAgLyoKICAgICAgKiBUaGlzIGlzIGdlbmVyYWxseSBvbmx5IGNhbGxlZCBiZWZvcmUgb3IgYWZ0ZXIgdGhlIGJ1ZmZlciBpcyB1c2VkLgogICAgICAqLwpAQCAtMTIxLDE1ICsxMjYsMTIgQEAKICAgICB2b2lkIGZpbGxXcmFwcGluZ0J1ZmZlcihXcmFwcGluZ0J1ZmZlciAqd3JhcHBpbmdCdWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXNBdmFpbGFibGUsIGludDMyX3Qgc3RhcnRJbmRleCk7CiAKLSAgICBjb25zdCBmaWZvX2ZyYW1lc190IG1GcmFtZUNhcGFjaXR5OwotICAgIGNvbnN0IGludDMyX3QgbUJ5dGVzUGVyRnJhbWU7Ci0gICAgdWludDhfdCAqbVN0b3JhZ2U7Ci0gICAgYm9vbCBtU3RvcmFnZU93bmVkOyAvLyBkaWQgdGhpcyBvYmplY3QgYWxsb2NhdGUgdGhlIHN0b3JhZ2U/Ci0gICAgRmlmb0NvbnRyb2xsZXJCYXNlICptRmlmbzsKLSAgICBmaWZvX2NvdW50ZXJfdCBtRnJhbWVzUmVhZENvdW50OwotICAgIGZpZm9fY291bnRlcl90IG1GcmFtZXNVbmRlcnJ1bkNvdW50OwotICAgIGludDMyX3QgbVVuZGVycnVuQ291bnQ7IC8vIG5lZWQ/IGp1c3QgdXNlIGZyYW1lcwotICAgIGludDMyX3QgbUxhc3RSZWFkU2l6ZTsKKyAgICBjb25zdCBpbnQzMl90ICAgICAgICAgICAgIG1CeXRlc1BlckZyYW1lOworICAgIC8vIFdlIGRvIG5vdCB1c2UgYSBzdGQ6OnVuaXF1ZV9wdHIgZm9yIG1TdG9yYWdlIGJlY2F1c2UgaXQgaXMgb2Z0ZW4gYSBwb2ludGVyIHRvCisgICAgLy8gbWVtb3J5IHNoYXJlZCBiZXR3ZWVuIHByb2Nlc3NlcyBhbmQgY2Fubm90IGJlIGRlbGV0ZWQgdHJpdmlhbGx5LgorICAgIHVpbnQ4X3QgICAgICAgICAgICAgICAgICAqbVN0b3JhZ2UgPSBudWxscHRyOworICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgbVN0b3JhZ2VPd25lZCA9IGZhbHNlOyAvLyBkaWQgdGhpcyBvYmplY3QgYWxsb2NhdGUgdGhlIHN0b3JhZ2U/CisgICAgc3RkOjp1bmlxdWVfcHRyPEZpZm9Db250cm9sbGVyQmFzZT4gbUZpZm97fTsKIH07CiAKIH0gIC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyLmgKaW5kZXggNzlkOThhMS4uMDU3YTk0ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyLmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyLmgKQEAgLTMwLDcgKzMwLDcgQEAKIGNsYXNzIEZpZm9Db250cm9sbGVyIDogcHVibGljIEZpZm9Db250cm9sbGVyQmFzZQogewogcHVibGljOgotICAgIEZpZm9Db250cm9sbGVyKGZpZm9fY291bnRlcl90IGJ1ZmZlclNpemUsIGZpZm9fY291bnRlcl90IHRocmVzaG9sZCkKKyAgICBGaWZvQ29udHJvbGxlcihmaWZvX2ZyYW1lc190IGJ1ZmZlclNpemUsIGZpZm9fZnJhbWVzX3QgdGhyZXNob2xkKQogICAgIDogRmlmb0NvbnRyb2xsZXJCYXNlKGJ1ZmZlclNpemUsIHRocmVzaG9sZCkKICAgICAsIG1SZWFkQ291bnRlcigwKQogICAgICwgbVdyaXRlQ291bnRlcigwKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcAppbmRleCA1MWE4ZTM0Li42NmUyNDdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmNwcApAQCAtNTksNSArNTksMTAgQEAKIH0KIAogdm9pZCBGaWZvQ29udHJvbGxlckJhc2U6OnNldFRocmVzaG9sZChmaWZvX2ZyYW1lc190IHRocmVzaG9sZCkgeworICAgIGlmICh0aHJlc2hvbGQgPiBtQ2FwYWNpdHkpIHsKKyAgICAgICAgdGhyZXNob2xkID0gbUNhcGFjaXR5OworICAgIH0gZWxzZSBpZiAodGhyZXNob2xkIDwgMCkgeworICAgICAgICB0aHJlc2hvbGQgPSAwOworICAgIH0KICAgICBtVGhyZXNob2xkID0gdGhyZXNob2xkOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9maWZvL0ZpZm9Db250cm9sbGVyQmFzZS5oCmluZGV4IDY0YWY3NzcuLjFlZGI4YTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmlmby9GaWZvQ29udHJvbGxlckJhc2UuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2ZpZm8vRmlmb0NvbnRyb2xsZXJCYXNlLmgKQEAgLTEwMiw2ICsxMDIsOSBAQAogICAgIC8qKgogICAgICAqIFlvdSBjYW4gcmVxdWVzdCB0aGF0IHRoZSBidWZmZXIgbm90IGJlIGZpbGxlZCBhYm92ZSBhIG1heGltdW0KICAgICAgKiBudW1iZXIgb2YgZnJhbWVzLgorICAgICAqCisgICAgICogVGhlIHRocmVzaG9sZCB3aWxsIGJlIGNsaXBwZWQgYmV0d2VlbiB6ZXJvIGFuZCB0aGUgYnVmZmVyIGNhcGFjaXR5LgorICAgICAqCiAgICAgICogQHBhcmFtIHRocmVzaG9sZCBlZmZlY3RpdmUgc2l6ZSBvZiB0aGUgYnVmZmVyCiAgICAgICovCiAgICAgdm9pZCBzZXRUaHJlc2hvbGQoZmlmb19mcmFtZXNfdCB0aHJlc2hvbGQpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvQXVkaW9Qcm9jZXNzb3JCYXNlLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY2N2ZkYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5jcHAKQEAgLTAsMCArMSw4MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgQXVkaW9Qcm9jZXNzb3JCYXNlOjpwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaWYgKGZyYW1lUG9zaXRpb24gPiBtTGFzdEZyYW1lUG9zaXRpb24pIHsKKyAgICAgICAgbUxhc3RGcmFtZVBvc2l0aW9uID0gZnJhbWVQb3NpdGlvbjsKKyAgICAgICAgbUZyYW1lc1ZhbGlkID0gb25Qcm9jZXNzKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7CisgICAgfQorICAgIHJldHVybiBtRnJhbWVzVmFsaWQ7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitBdWRpb0Zsb2F0QmxvY2tQb3J0OjpBdWRpb0Zsb2F0QmxvY2tQb3J0KEF1ZGlvUHJvY2Vzc29yQmFzZSAmcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVzUGVyQmxvY2spCisgICAgICAgIDogQXVkaW9Qb3J0KHBhcmVudCwgc2FtcGxlc1BlckZyYW1lKQorICAgICAgICAsIG1GcmFtZXNQZXJCbG9jayhmcmFtZXNQZXJCbG9jaykKKyAgICAgICAgLCBtU2FtcGxlQmxvY2soTlVMTCkgeworICAgIGludDMyX3QgbnVtRmxvYXRzID0gZnJhbWVzUGVyQmxvY2sgKiBnZXRTYW1wbGVzUGVyRnJhbWUoKTsKKyAgICBtU2FtcGxlQmxvY2sgPSBuZXcgZmxvYXRbbnVtRmxvYXRzXXswLjBmfTsKK30KKworQXVkaW9GbG9hdEJsb2NrUG9ydDo6fkF1ZGlvRmxvYXRCbG9ja1BvcnQoKSB7CisgICAgZGVsZXRlW10gbVNhbXBsZUJsb2NrOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworaW50MzJfdCBBdWRpb0Zsb2F0T3V0cHV0UG9ydDo6cHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIG51bUZyYW1lcyA9IHN0ZDo6bWluKGdldEZyYW1lc1BlckJsb2NrKCksIG51bUZyYW1lcyk7CisgICAgcmV0dXJuIG1QYXJlbnQucHVsbERhdGEoZnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKK30KKworLy8gVGhlc2UgbmVlZCB0byBiZSBpbiB0aGUgLmNwcCBmaWxlIGJlY2F1c2Ugb2YgZm9yd2FyZCBjcm9zcyByZWZlcmVuY2VzLgordm9pZCBBdWRpb0Zsb2F0T3V0cHV0UG9ydDo6Y29ubmVjdChBdWRpb0Zsb2F0SW5wdXRQb3J0ICpwb3J0KSB7CisgICAgcG9ydC0+Y29ubmVjdCh0aGlzKTsKK30KKwordm9pZCBBdWRpb0Zsb2F0T3V0cHV0UG9ydDo6ZGlzY29ubmVjdChBdWRpb0Zsb2F0SW5wdXRQb3J0ICpwb3J0KSB7CisgICAgcG9ydC0+ZGlzY29ubmVjdCh0aGlzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgQXVkaW9GbG9hdElucHV0UG9ydDo6cHVsbERhdGEoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIHJldHVybiAobUNvbm5lY3RlZCA9PSBOVUxMKQorICAgICAgICAgICAgPyBzdGQ6Om1pbihnZXRGcmFtZXNQZXJCbG9jaygpLCBudW1GcmFtZXMpCisgICAgICAgICAgICA6IG1Db25uZWN0ZWQtPnB1bGxEYXRhKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7Cit9CisKK2Zsb2F0ICpBdWRpb0Zsb2F0SW5wdXRQb3J0OjpnZXRCbG9jaygpIHsKKyAgICBpZiAobUNvbm5lY3RlZCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBBdWRpb0Zsb2F0QmxvY2tQb3J0OjpnZXRCbG9jaygpOyAvLyBsb2FkZWQgdXNpbmcgc2V0VmFsdWUoKQorICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtQ29ubmVjdGVkLT5nZXRCbG9jaygpOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2ludDMyX3QgQXVkaW9TaW5rOjpwdWxsKGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCBhY3R1YWxGcmFtZXMgPSBpbnB1dC5wdWxsRGF0YShtRnJhbWVQb3NpdGlvbiwgbnVtRnJhbWVzKTsKKyAgICBtRnJhbWVQb3NpdGlvbiArPSBhY3R1YWxGcmFtZXM7CisgICAgcmV0dXJuIGFjdHVhbEZyYW1lczsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0F1ZGlvUHJvY2Vzc29yQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYTQ2YWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9BdWRpb1Byb2Nlc3NvckJhc2UuaApAQCAtMCwwICsxLDI5MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoKKyAqIEF1ZGlvUHJvY2Vzc29yQmFzZS5oCisgKgorICogQXVkaW8gcHJvY2Vzc2luZyBub2RlIGFuZCBwb3J0cyB0aGF0IGNhbiBiZSB1c2VkIGluIGEgc2ltcGxlIGRhdGEgZmxvdyBncmFwaC4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9BVURJT19QUk9DRVNTT1JfQkFTRV9ICisjZGVmaW5lIEZMT1dHUkFQSF9BVURJT19QUk9DRVNTT1JfQkFTRV9ICisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworLy8gVE9ETyBjb25zaWRlciBwdWJsaXNoaW5nIGFsbCBoZWFkZXIgZmlsZXMgdW5kZXIgImluY2x1ZGUvbGliYWF1ZGlvL0Zsb3dHcmFwaC5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworLy8gRGVmYXVsdCBibG9jayBzaXplIHRoYXQgY2FuIGJlIG92ZXJyaWRkZW4gd2hlbiB0aGUgQXVkaW9GbG9hdEJsb2NrUG9ydCBpcyBjcmVhdGVkLgorLy8gSWYgaXQgaXMgdG9vIHNtYWxsIHRoZW4gd2Ugd2lsbCBoYXZlIHRvbyBtdWNoIG92ZXJoZWFkIGZyb20gc3dpdGNoaW5nIGJldHdlZW4gbm9kZXMuCisvLyBJZiBpdCBpcyB0b28gaGlnaCB0aGVuIHdlIHdpbGwgdGhyYXNoIHRoZSBjYWNoZXMuCitjb25zdGV4cHIgaW50IGtEZWZhdWx0QmxvY2tTaXplID0gODsgLy8gYXJiaXRyYXJ5CisKK2NsYXNzIEF1ZGlvRmxvYXRJbnB1dFBvcnQ7CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjbGFzcyBBdWRpb1Byb2Nlc3NvckJhc2UgeworcHVibGljOgorICAgIHZpcnR1YWwgfkF1ZGlvUHJvY2Vzc29yQmFzZSgpID0gZGVmYXVsdDsKKworICAgIC8qKgorICAgICAqIFBlcmZvcm0gY3VzdG9tIGZ1bmN0aW9uLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYW1lUG9zaXRpb24gaW5kZXggb2YgZmlyc3QgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIG51bUZyYW1lcyBtYXhpbXVtIG51bWJlciBvZiBmcmFtZXMgcmVxdWVzdGVkIGZvciBwcm9jZXNzaW5nCisgICAgICogQHJldHVybiBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IHByb2Nlc3NlZAorICAgICAqLworICAgIHZpcnR1YWwgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgPSAwOworCisgICAgLyoqCisgICAgICogSWYgdGhlIGZyYW1lUG9zaXRpb24gaXMgYXQgb3IgYWZ0ZXIgdGhlIGxhc3QgZnJhbWUgcG9zaXRpb24gdGhlbiBjYWxsIG9uUHJvY2VzcygpLgorICAgICAqIFRoaXMgcHJldmVudHMgaW5maW5pdGUgcmVjdXJzaW9uIGluIGNhc2Ugb2YgY3ljbGljIGdyYXBocy4KKyAgICAgKiBJdCBhbHNvIHByZXZlbnRzIG5vZGVzIHVwc3RyZWFtIGZyb20gYSBicmFuY2ggZnJvbSBiZWluZyBleGVjdXRlZCB0d2ljZS4KKyAgICAgKgorICAgICAqIEBwYXJhbSBmcmFtZVBvc2l0aW9uCisgICAgICogQHBhcmFtIG51bUZyYW1lcworICAgICAqIEByZXR1cm4KKyAgICAgKi8KKyAgICBpbnQzMl90IHB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpOworCitwcm90ZWN0ZWQ6CisgICAgaW50NjRfdCAgbUxhc3RGcmFtZVBvc2l0aW9uID0gLTE7IC8vIFN0YXJ0IGF0IC0xIHNvIHRoYXQgdGhlIGZpcnN0IHB1bGwgd29ya3MuCisKK3ByaXZhdGU6CisgICAgaW50MzJfdCAgbUZyYW1lc1ZhbGlkID0gMDsgLy8gbnVtIHZhbGlkIGZyYW1lcyBpbiB0aGUgYmxvY2sKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAgKiBUaGlzIGlzIGEgY29ubmVjdG9yIHRoYXQgYWxsb3dzIGRhdGEgdG8gZmxvdyBiZXR3ZWVuIG1vZHVsZXMuCisgICovCitjbGFzcyBBdWRpb1BvcnQgeworcHVibGljOgorICAgIEF1ZGlvUG9ydChBdWRpb1Byb2Nlc3NvckJhc2UgJnBhcmVudCwgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpCisgICAgICAgICAgICA6IG1QYXJlbnQocGFyZW50KQorICAgICAgICAgICAgLCBtU2FtcGxlc1BlckZyYW1lKHNhbXBsZXNQZXJGcmFtZSkgeworICAgIH0KKworICAgIC8vIFBvcnRzIGFyZSBvZnRlbiBkZWNsYXJlZCBwdWJsaWMuIFNvIGxldCdzIG1ha2UgdGhlbSBub24tY29weWFibGUuCisgICAgQXVkaW9Qb3J0KGNvbnN0IEF1ZGlvUG9ydCYpID0gZGVsZXRlOworICAgIEF1ZGlvUG9ydCYgb3BlcmF0b3I9KGNvbnN0IEF1ZGlvUG9ydCYpID0gZGVsZXRlOworCisgICAgaW50MzJfdCBnZXRTYW1wbGVzUGVyRnJhbWUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtU2FtcGxlc1BlckZyYW1lOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIEF1ZGlvUHJvY2Vzc29yQmFzZSAmbVBhcmVudDsKKworcHJpdmF0ZToKKyAgICBjb25zdCBpbnQzMl90ICAgIG1TYW1wbGVzUGVyRnJhbWUgPSAxOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKgorICogVGhpcyBwb3J0IGNvbnRhaW5zIGEgZmxvYXQgdHlwZSBidWZmZXIuCisgKiBUaGUgc2l6ZSBpcyBmcmFtZXNQZXJCbG9jayAqIHNhbXBsZXNQZXJGcmFtZSkuCisgKi8KK2NsYXNzIEF1ZGlvRmxvYXRCbG9ja1BvcnQgIDogcHVibGljIEF1ZGlvUG9ydCB7CitwdWJsaWM6CisgICAgQXVkaW9GbG9hdEJsb2NrUG9ydChBdWRpb1Byb2Nlc3NvckJhc2UgJm1QYXJlbnQsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCisgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmcmFtZXNQZXJCbG9jayA9IGtEZWZhdWx0QmxvY2tTaXplCisgICAgICAgICAgICAgICAgKTsKKworICAgIHZpcnR1YWwgfkF1ZGlvRmxvYXRCbG9ja1BvcnQoKTsKKworICAgIGludDMyX3QgZ2V0RnJhbWVzUGVyQmxvY2soKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRnJhbWVzUGVyQmxvY2s7CisgICAgfQorCitwcm90ZWN0ZWQ6CisKKyAgICAvKioKKyAgICAgKiBAcmV0dXJuIGJ1ZmZlciBpbnRlcm5hbCB0byB0aGUgcG9ydCBvciBmcm9tIGEgY29ubmVjdGVkIHBvcnQKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGZsb2F0ICpnZXRCbG9jaygpIHsKKyAgICAgICAgcmV0dXJuIG1TYW1wbGVCbG9jazsKKyAgICB9CisKKworcHJpdmF0ZToKKyAgICBjb25zdCBpbnQzMl90ICAgIG1GcmFtZXNQZXJCbG9jayA9IDE7CisgICAgZmxvYXQgICAgICAgICAgICptU2FtcGxlQmxvY2sgPSBudWxscHRyOyAvLyBhbGxvY2F0ZWQgaW4gY29uc3RydWN0b3IKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioKKyAgKiBUaGUgcmVzdWx0cyBvZiBhIG1vZHVsZSBhcmUgc3RvcmVkIGluIHRoZSBidWZmZXIgb2YgdGhlIG91dHB1dCBwb3J0cy4KKyAgKi8KK2NsYXNzIEF1ZGlvRmxvYXRPdXRwdXRQb3J0IDogcHVibGljIEF1ZGlvRmxvYXRCbG9ja1BvcnQgeworcHVibGljOgorICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0KEF1ZGlvUHJvY2Vzc29yQmFzZSAmcGFyZW50LCBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSkKKyAgICAgICAgICAgIDogQXVkaW9GbG9hdEJsb2NrUG9ydChwYXJlbnQsIHNhbXBsZXNQZXJGcmFtZSkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkF1ZGlvRmxvYXRPdXRwdXRQb3J0KCkgPSBkZWZhdWx0OworCisgICAgdXNpbmcgQXVkaW9GbG9hdEJsb2NrUG9ydDo6Z2V0QmxvY2s7CisKKyAgICAvKioKKyAgICAgKiBDYWxsIHRoZSBwYXJlbnQgbW9kdWxlJ3Mgb25Qcm9jZXNzKCkgbWV0aG9kLgorICAgICAqIFRoYXQgbWF5IHB1bGwgZGF0YSBmcm9tIGl0cyBpbnB1dHMgYW5kIHJlY3Vyc2l2ZWx5CisgICAgICogcHJvY2VzcyB0aGUgZW50aXJlIGdyYXBoLgorICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGZyYW1lcyBhY3R1YWxseSBwdWxsZWQKKyAgICAgKi8KKyAgICBpbnQzMl90IHB1bGxEYXRhKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpOworCisgICAgLyoqCisgICAgICogQ29ubmVjdCB0byB0aGUgaW5wdXQgb2YgYW5vdGhlciBtb2R1bGUuCisgICAgICogQW4gaW5wdXQgcG9ydCBjYW4gb25seSBoYXZlIG9uZSBjb25uZWN0aW9uLgorICAgICAqIEFuIG91dHB1dCBwb3J0IGNhbiBoYXZlIG11bHRpcGxlIGNvbm5lY3Rpb25zLgorICAgICAqIElmIHlvdSBjb25uZWN0IGEgc2Vjb25kIG91dHB1dCBwb3J0IHRvIGFuIGlucHV0IHBvcnQKKyAgICAgKiB0aGVuIGl0IG92ZXJ3cml0ZXMgdGhlIHByZXZpb3VzIGNvbm5lY3Rpb24uCisgICAgICoKKyAgICAgKiBUaGlzIG5vdCB0aHJlYWQgc2FmZS4gRG8gbm90IG1vZGlmeSB0aGUgZ3JhcGggdG9wb2xvZ3kgZm9ybSBhbm90aGVyIHRocmVhZCB3aGlsZSBydW5uaW5nLgorICAgICAqLworICAgIHZvaWQgY29ubmVjdChBdWRpb0Zsb2F0SW5wdXRQb3J0ICpwb3J0KTsKKworICAgIC8qKgorICAgICAqIERpc2Nvbm5lY3QgZnJvbSB0aGUgaW5wdXQgb2YgYW5vdGhlciBtb2R1bGUuCisgICAgICogVGhpcyBub3QgdGhyZWFkIHNhZmUuCisgICAgICovCisgICAgdm9pZCBkaXNjb25uZWN0KEF1ZGlvRmxvYXRJbnB1dFBvcnQgKnBvcnQpOworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NsYXNzIEF1ZGlvRmxvYXRJbnB1dFBvcnQgOiBwdWJsaWMgQXVkaW9GbG9hdEJsb2NrUG9ydCB7CitwdWJsaWM6CisgICAgQXVkaW9GbG9hdElucHV0UG9ydChBdWRpb1Byb2Nlc3NvckJhc2UgJnBhcmVudCwgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUpCisgICAgICAgICAgICA6IEF1ZGlvRmxvYXRCbG9ja1BvcnQocGFyZW50LCBzYW1wbGVzUGVyRnJhbWUpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5BdWRpb0Zsb2F0SW5wdXRQb3J0KCkgPSBkZWZhdWx0OworCisgICAgLyoqCisgICAgICogSWYgY29ubmVjdGVkIHRvIGFuIG91dHB1dCBwb3J0IHRoZW4gdGhpcyB3aWxsIHJldHVybgorICAgICAqIHRoYXQgb3V0cHV0IHBvcnRzIGJ1ZmZlcnMuCisgICAgICogSWYgbm90IGNvbm5lY3RlZCB0aGVuIGl0IHJldHVybnMgdGhlIGlucHV0IHBvcnRzIG93biBidWZmZXIKKyAgICAgKiB3aGljaCBjYW4gYmUgbG9hZGVkIHVzaW5nIHNldFZhbHVlKCkuCisgICAgICovCisgICAgZmxvYXQgKmdldEJsb2NrKCkgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBQdWxsIGRhdGEgZnJvbSBhbnkgb3V0cHV0IHBvcnQgdGhhdCBpcyBjb25uZWN0ZWQuCisgICAgICovCisgICAgaW50MzJfdCBwdWxsRGF0YShpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKTsKKworICAgIC8qKgorICAgICAqIFdyaXRlIGV2ZXJ5IHZhbHVlIG9mIHRoZSBmbG9hdCBidWZmZXIuCisgICAgICogVGhpcyB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQgaWYgYW4gb3V0cHV0IHBvcnQgaXMgY29ubmVjdGVkCisgICAgICogdG8gdGhpcyBwb3J0LgorICAgICAqLworICAgIHZvaWQgc2V0VmFsdWUoZmxvYXQgdmFsdWUpIHsKKyAgICAgICAgaW50IG51bUZsb2F0cyA9IGtEZWZhdWx0QmxvY2tTaXplICogZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgICAgIGZsb2F0ICpidWZmZXIgPSBnZXRCbG9jaygpOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUZsb2F0czsgaSsrKSB7CisgICAgICAgICAgICAqYnVmZmVyKysgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIENvbm5lY3QgdG8gdGhlIG91dHB1dCBvZiBhbm90aGVyIG1vZHVsZS4KKyAgICAgKiBBbiBpbnB1dCBwb3J0IGNhbiBvbmx5IGhhdmUgb25lIGNvbm5lY3Rpb24uCisgICAgICogQW4gb3V0cHV0IHBvcnQgY2FuIGhhdmUgbXVsdGlwbGUgY29ubmVjdGlvbnMuCisgICAgICogVGhpcyBub3QgdGhyZWFkIHNhZmUuCisgICAgICovCisgICAgdm9pZCBjb25uZWN0KEF1ZGlvRmxvYXRPdXRwdXRQb3J0ICpwb3J0KSB7CisgICAgICAgIGFzc2VydChnZXRTYW1wbGVzUGVyRnJhbWUoKSA9PSBwb3J0LT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CisgICAgICAgIG1Db25uZWN0ZWQgPSBwb3J0OworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdChBdWRpb0Zsb2F0T3V0cHV0UG9ydCAqcG9ydCkgeworICAgICAgICBhc3NlcnQobUNvbm5lY3RlZCA9PSBwb3J0KTsKKyAgICAgICAgKHZvaWQpIHBvcnQ7CisgICAgICAgIG1Db25uZWN0ZWQgPSBudWxscHRyOworICAgIH0KKworICAgIHZvaWQgZGlzY29ubmVjdCgpIHsKKyAgICAgICAgbUNvbm5lY3RlZCA9IG51bGxwdHI7CisgICAgfQorCitwcml2YXRlOgorICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0ICptQ29ubmVjdGVkID0gbnVsbHB0cjsKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjbGFzcyBBdWRpb1NvdXJjZSA6IHB1YmxpYyBBdWRpb1Byb2Nlc3NvckJhc2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IEF1ZGlvU291cmNlKGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICAgICAgOiBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgIH0KKworICAgIHZpcnR1YWwgfkF1ZGlvU291cmNlKCkgPSBkZWZhdWx0OworCisgICAgQXVkaW9GbG9hdE91dHB1dFBvcnQgb3V0cHV0OworCisgICAgdm9pZCBzZXREYXRhKGNvbnN0IHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgICAgIG1EYXRhID0gZGF0YTsKKyAgICAgICAgbVNpemVJbkZyYW1lcyA9IG51bUZyYW1lczsKKyAgICAgICAgbUZyYW1lSW5kZXggPSAwOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIGNvbnN0IHZvaWQgKm1EYXRhID0gbnVsbHB0cjsKKyAgICBpbnQzMl90ICAgICBtU2l6ZUluRnJhbWVzID0gMDsgLy8gbnVtYmVyIG9mIGZyYW1lcyBpbiBtRGF0YQorICAgIGludDMyX3QgICAgIG1GcmFtZUluZGV4ID0gMDsgLy8gaW5kZXggb2YgbmV4dCBmcmFtZSB0byBiZSBwcm9jZXNzZWQKK307CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjbGFzcyBBdWRpb1NpbmsgOiBwdWJsaWMgQXVkaW9Qcm9jZXNzb3JCYXNlIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBBdWRpb1NpbmsoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgICAgICA6IGlucHV0KCp0aGlzLCBjaGFubmVsQ291bnQpIHsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5BdWRpb1NpbmsoKSA9IGRlZmF1bHQ7CisKKyAgICBBdWRpb0Zsb2F0SW5wdXRQb3J0IGlucHV0OworCisgICAgLyoqCisgICAgICogRHVtbXkgcHJvY2Vzc29yLiBUaGUgd29yayBoYXBwZW5zIGluIHRoZSByZWFkKCkgbWV0aG9kLgorICAgICAqCisgICAgICogQHBhcmFtIGZyYW1lUG9zaXRpb24gaW5kZXggb2YgZmlyc3QgZnJhbWUgdG8gYmUgcHJvY2Vzc2VkCisgICAgICogQHBhcmFtIG51bUZyYW1lcworICAgICAqIEByZXR1cm4gbnVtYmVyIG9mIGZyYW1lcyBhY3R1YWxseSBwcm9jZXNzZWQKKyAgICAgKi8KKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKSBmcmFtZVBvc2l0aW9uOworICAgICAgICAodm9pZCkgbnVtRnJhbWVzOworICAgICAgICByZXR1cm4gMDsKKyAgICB9OworCisgICAgdmlydHVhbCBpbnQzMl90IHJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpID0gMDsKKworcHJvdGVjdGVkOgorICAgIGludDMyX3QgcHVsbChpbnQzMl90IG51bUZyYW1lcyk7CisKK3ByaXZhdGU6CisgICAgaW50NjRfdCBtRnJhbWVQb3NpdGlvbiA9IDA7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8qIEZMT1dHUkFQSF9BVURJT19QUk9DRVNTT1JfQkFTRV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ5YzIyYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmNwcApAQCAtMCwwICsxLDQwIEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIkNsaXBUb1JhbmdlLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK0NsaXBUb1JhbmdlOjpDbGlwVG9SYW5nZShpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBpbnB1dCgqdGhpcywgY2hhbm5lbENvdW50KQorICAgICAgICAsIG91dHB1dCgqdGhpcywgY2hhbm5lbENvdW50KSB7Cit9CisKK2ludDMyX3QgQ2xpcFRvUmFuZ2U6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBpbnB1dC5wdWxsRGF0YShmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOworICAgIGNvbnN0IGZsb2F0ICppbnB1dEJ1ZmZlciA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgZmxvYXQgKm91dHB1dEJ1ZmZlciA9IG91dHB1dC5nZXRCbG9jaygpOworCisgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG51bVNhbXBsZXM7IGkrKykgeworICAgICAgICAqb3V0cHV0QnVmZmVyKysgPSBzdGQ6Om1pbihtTWF4aW11bSwgc3RkOjptYXgobU1pbmltdW0sICppbnB1dEJ1ZmZlcisrKSk7CisgICAgfQorCisgICAgcmV0dXJuIGZyYW1lc1RvUHJvY2VzczsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllZWYyNTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9DbGlwVG9SYW5nZS5oCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX0NMSVBfVE9fUkFOR0VfSAorI2RlZmluZSBGTE9XR1JBUEhfQ0xJUF9UT19SQU5HRV9ICisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKKy8vIFRoaXMgaXMgMyBkQiwgKDEwXigzLzIwKSksIHRvIG1hdGNoIHRoZSBtYXhpbXVtIGhlYWRyb29tIGluIEF1ZGlvVHJhY2sgZm9yIGZsb2F0IGRhdGEuCisvLyBJdCBpcyBkZXNpZ25lZCB0byBhbGxvdyBvY2Nhc2lvbmFsIHRyYW5zaWVudCBwZWFrcy4KK2NvbnN0ZXhwciBmbG9hdCBrRGVmYXVsdE1heEhlYWRyb29tID0gMS40MTI1Mzc1NGY7Citjb25zdGV4cHIgZmxvYXQga0RlZmF1bHRNaW5IZWFkcm9vbSA9IC1rRGVmYXVsdE1heEhlYWRyb29tOworCitjbGFzcyBDbGlwVG9SYW5nZSA6IHB1YmxpYyBBdWRpb1Byb2Nlc3NvckJhc2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IENsaXBUb1JhbmdlKGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIHZpcnR1YWwgfkNsaXBUb1JhbmdlKCkgPSBkZWZhdWx0OworCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldE1pbmltdW0oZmxvYXQgbWluKSB7CisgICAgICAgIG1NaW5pbXVtID0gbWluOworICAgIH0KKworICAgIGZsb2F0IGdldE1pbmltdW0oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTWluaW11bTsKKyAgICB9CisKKyAgICB2b2lkIHNldE1heGltdW0oZmxvYXQgbWluKSB7CisgICAgICAgIG1NYXhpbXVtID0gbWluOworICAgIH0KKworICAgIGZsb2F0IGdldE1heGltdW0oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTWF4aW11bTsKKyAgICB9CisKKyAgICBBdWRpb0Zsb2F0SW5wdXRQb3J0IGlucHV0OworICAgIEF1ZGlvRmxvYXRPdXRwdXRQb3J0IG91dHB1dDsKKworcHJpdmF0ZToKKyAgICBmbG9hdCBtTWluaW11bSA9IGtEZWZhdWx0TWluSGVhZHJvb207CisgICAgZmxvYXQgbU1heGltdW0gPSBrRGVmYXVsdE1heEhlYWRyb29tOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9DTElQX1RPX1JBTkdFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGFhZDUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvTW9ub1RvTXVsdGlDb252ZXJ0ZXIuY3BwCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIk1vbm9Ub011bHRpQ29udmVydGVyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK01vbm9Ub011bHRpQ29udmVydGVyOjpNb25vVG9NdWx0aUNvbnZlcnRlcihpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBpbnB1dCgqdGhpcywgMSkKKyAgICAgICAgLCBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworfQorCitNb25vVG9NdWx0aUNvbnZlcnRlcjo6fk1vbm9Ub011bHRpQ29udmVydGVyKCkgeyB9CisKK2ludDMyX3QgTW9ub1RvTXVsdGlDb252ZXJ0ZXI6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBpbnB1dC5wdWxsRGF0YShmcmFtZVBvc2l0aW9uLCBudW1GcmFtZXMpOworCisgICAgY29uc3QgZmxvYXQgKmlucHV0QnVmZmVyID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJsb2NrKCk7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisgICAgLy8gVE9ETyBtYXliZSBtb3ZlIHRvIGF1ZGlvX3V0aWwgYXMgYXVkaW9fbW9ub190b19tdWx0aSgpCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZXNUb1Byb2Nlc3M7IGkrKykgeworICAgICAgICAvLyByZWFkIG9uZSwgd3JpdGUgbWFueQorICAgICAgICBmbG9hdCBzYW1wbGUgPSAqaW5wdXRCdWZmZXIrKzsKKyAgICAgICAgZm9yIChpbnQgY2hhbm5lbCA9IDA7IGNoYW5uZWwgPCBjaGFubmVsQ291bnQ7IGNoYW5uZWwrKykgeworICAgICAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gc2FtcGxlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZDUzYzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Nb25vVG9NdWx0aUNvbnZlcnRlci5oCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBGTE9XR1JBUEhfTU9OT19UT19NVUxUSV9DT05WRVJURVJfSAorI2RlZmluZSBGTE9XR1JBUEhfTU9OT19UT19NVUxUSV9DT05WRVJURVJfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIE1vbm9Ub011bHRpQ29udmVydGVyIDogcHVibGljIEF1ZGlvUHJvY2Vzc29yQmFzZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgTW9ub1RvTXVsdGlDb252ZXJ0ZXIoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgdmlydHVhbCB+TW9ub1RvTXVsdGlDb252ZXJ0ZXIoKTsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCisgICAgQXVkaW9GbG9hdElucHV0UG9ydCBpbnB1dDsKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCBvdXRwdXQ7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX01PTk9fVE9fTVVMVElfQ09OVkVSVEVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI2MDgyOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1JhbXBMaW5lYXIuY3BwCkBAIC0wLDAgKzEsODUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiUmFtcExpbmVhciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJSYW1wTGluZWFyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK1JhbXBMaW5lYXI6OlJhbXBMaW5lYXIoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogaW5wdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkKKyAgICAgICAgLCBvdXRwdXQoKnRoaXMsIGNoYW5uZWxDb3VudCkgeworICAgIG1UYXJnZXQuc3RvcmUoMS4wZik7Cit9CisKK3ZvaWQgUmFtcExpbmVhcjo6c2V0TGVuZ3RoSW5GcmFtZXMoaW50MzJfdCBmcmFtZXMpIHsKKyAgICBtTGVuZ3RoSW5GcmFtZXMgPSBmcmFtZXM7Cit9CisKK3ZvaWQgUmFtcExpbmVhcjo6c2V0VGFyZ2V0KGZsb2F0IHRhcmdldCkgeworICAgIG1UYXJnZXQuc3RvcmUodGFyZ2V0KTsKK30KKworZmxvYXQgUmFtcExpbmVhcjo6aW50ZXJwb2xhdGVDdXJyZW50KCkgeworICAgIHJldHVybiBtTGV2ZWxUbyAtIChtUmVtYWluaW5nICogbVNjYWxlcik7Cit9CisKK2ludDMyX3QgUmFtcExpbmVhcjo6b25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIHsKKyAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IGlucHV0LnB1bGxEYXRhKGZyYW1lUG9zaXRpb24sIG51bUZyYW1lcyk7CisgICAgY29uc3QgZmxvYXQgKmlucHV0QnVmZmVyID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJsb2NrKCk7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBmbG9hdCB0YXJnZXQgPSBnZXRUYXJnZXQoKTsKKyAgICBpZiAodGFyZ2V0ICE9IG1MZXZlbFRvKSB7CisgICAgICAgIC8vIFN0YXJ0IG5ldyByYW1wLiBDb250aW51ZSBmcm9tIHByZXZpb3VzIGxldmVsLgorICAgICAgICBtTGV2ZWxGcm9tID0gaW50ZXJwb2xhdGVDdXJyZW50KCk7CisgICAgICAgIG1MZXZlbFRvID0gdGFyZ2V0OworICAgICAgICBtUmVtYWluaW5nID0gbUxlbmd0aEluRnJhbWVzOworICAgICAgICBBTE9HVigiJXMoKSBtTGV2ZWxGcm9tID0gJWYsIG1MZXZlbFRvID0gJWYsIG1SZW1haW5pbmcgPSAlZCwgbVNjYWxlciA9ICVmIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIG1MZXZlbEZyb20sIG1MZXZlbFRvLCBtUmVtYWluaW5nLCBtU2NhbGVyKTsKKyAgICAgICAgbVNjYWxlciA9IChtTGV2ZWxUbyAtIG1MZXZlbEZyb20pIC8gbUxlbmd0aEluRnJhbWVzOyAvLyBmb3IgaW50ZXJwb2xhdGlvbgorICAgIH0KKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IGZyYW1lc1RvUHJvY2VzczsKKworICAgIGlmIChtUmVtYWluaW5nID4gMCkgeyAvLyBSYW1waW5nPyBUaGlzIGRvZXNuJ3QgaGFwcGVuIHZlcnkgb2Z0ZW4uCisgICAgICAgIGludDMyX3QgZnJhbWVzVG9SYW1wID0gc3RkOjptaW4oZnJhbWVzTGVmdCwgbVJlbWFpbmluZyk7CisgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzVG9SYW1wOworICAgICAgICB3aGlsZSAoZnJhbWVzVG9SYW1wID4gMCkgeworICAgICAgICAgICAgZmxvYXQgY3VycmVudExldmVsID0gaW50ZXJwb2xhdGVDdXJyZW50KCk7CisgICAgICAgICAgICBmb3IgKGludCBjaCA9IDA7IGNoIDwgY2hhbm5lbENvdW50OyBjaCsrKSB7CisgICAgICAgICAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gKmlucHV0QnVmZmVyKysgKiBjdXJyZW50TGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUmVtYWluaW5nLS07CisgICAgICAgICAgICBmcmFtZXNUb1JhbXAtLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFByb2Nlc3MgYW55IGZyYW1lcyBhZnRlciB0aGUgcmFtcC4KKyAgICBpbnQzMl90IHNhbXBsZXNMZWZ0ID0gZnJhbWVzTGVmdCAqIGNoYW5uZWxDb3VudDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHNhbXBsZXNMZWZ0OyBpKyspIHsKKyAgICAgICAgKm91dHB1dEJ1ZmZlcisrID0gKmlucHV0QnVmZmVyKysgKiBtTGV2ZWxUbzsKKyAgICB9CisKKyAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvUmFtcExpbmVhci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYzhmNDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9SYW1wTGluZWFyLmgKQEAgLTAsMCArMSw4NyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfUkFNUF9MSU5FQVJfSAorI2RlZmluZSBGTE9XR1JBUEhfUkFNUF9MSU5FQVJfSAorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBSYW1wTGluZWFyIDogcHVibGljIEF1ZGlvUHJvY2Vzc29yQmFzZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgUmFtcExpbmVhcihpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICB2aXJ0dWFsIH5SYW1wTGluZWFyKCkgPSBkZWZhdWx0OworCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7CisKKyAgICAvKioKKyAgICAgKiBUaGlzIGlzIHVzZWQgZm9yIHRoZSBuZXh0IHJhbXAuCisgICAgICogQ2FsbGluZyB0aGlzIGRvZXMgbm90IGFmZmVjdCBhIHJhbXAgdGhhdCBpcyBpbiBwcm9ncmVzcy4KKyAgICAgKi8KKyAgICB2b2lkIHNldExlbmd0aEluRnJhbWVzKGludDMyX3QgZnJhbWVzKTsKKworICAgIGludDMyX3QgZ2V0TGVuZ3RoSW5GcmFtZXMoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtTGVuZ3RoSW5GcmFtZXM7CisgICAgfQorCisgICAgLyoqCisgICAgICogVGhpcyBtYXkgYmUgc2FmZWx5IGNhbGxlZCBieSBhbm90aGVyIHRocmVhZC4KKyAgICAgKiBAcGFyYW0gdGFyZ2V0CisgICAgICovCisgICAgdm9pZCBzZXRUYXJnZXQoZmxvYXQgdGFyZ2V0KTsKKworICAgIGZsb2F0IGdldFRhcmdldCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1UYXJnZXQubG9hZCgpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEZvcmNlIHRoZSBuZXh0U2VnbWVudCB0byBzdGFydCBmcm9tIHRoaXMgbGV2ZWwuCisgICAgICoKKyAgICAgKiBXQVJOSU5HOiB0aGlzIGNhbiBjYXVzZSBhIGRpc2NvbnRpbnVpdHkgaWYgY2FsbGVkIHdoaWxlIHRoZSByYW1wIGlzIGJlaW5nIHVzZWQuCisgICAgICogT25seSBjYWxsIHRoaXMgd2hlbiBzZXR0aW5nIHRoZSBpbml0aWFsIHJhbXAuCisgICAgICoKKyAgICAgKiBAcGFyYW0gbGV2ZWwKKyAgICAgKi8KKyAgICB2b2lkIGZvcmNlQ3VycmVudChmbG9hdCBsZXZlbCkgeworICAgICAgICBtTGV2ZWxGcm9tID0gbGV2ZWw7CisgICAgICAgIG1MZXZlbFRvID0gbGV2ZWw7CisgICAgfQorCisgICAgQXVkaW9GbG9hdElucHV0UG9ydCBpbnB1dDsKKyAgICBBdWRpb0Zsb2F0T3V0cHV0UG9ydCBvdXRwdXQ7CisKK3ByaXZhdGU6CisKKyAgICBmbG9hdCBpbnRlcnBvbGF0ZUN1cnJlbnQoKTsKKworICAgIHN0ZDo6YXRvbWljPGZsb2F0PiAgbVRhcmdldDsKKworICAgIGludDMyX3QgICAgICAgICAgICAgbUxlbmd0aEluRnJhbWVzICA9IDQ4MDAwLjBmIC8gMTAwLjBmIDsgLy8gMTAgbXNlYyBhdCA0ODAwMCBIejsKKyAgICBpbnQzMl90ICAgICAgICAgICAgIG1SZW1haW5pbmcgICAgICAgPSAwOworICAgIGZsb2F0ICAgICAgICAgICAgICAgbVNjYWxlciAgICAgICAgICA9IDAuMGY7CisgICAgZmxvYXQgICAgICAgICAgICAgICBtTGV2ZWxGcm9tICAgICAgID0gMC4wZjsKKyAgICBmbG9hdCAgICAgICAgICAgICAgIG1MZXZlbFRvICAgICAgICAgPSAwLjBmOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9SQU1QX0xJTkVBUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjNkY2JjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmNwcApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlNpbmtGbG9hdC5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitTaW5rRmxvYXQ6OlNpbmtGbG9hdChpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBBdWRpb1NpbmsoY2hhbm5lbENvdW50KSB7Cit9CisKK2ludDMyX3QgU2lua0Zsb2F0OjpyZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgZmxvYXQgKmZsb2F0RGF0YSA9IChmbG9hdCAqKSBkYXRhOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gaW5wdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBudW1GcmFtZXM7CisgICAgd2hpbGUgKGZyYW1lc0xlZnQgPiAwKSB7CisgICAgICAgIC8vIFJ1biB0aGUgZ3JhcGggYW5kIHB1bGwgZGF0YSB0aHJvdWdoIHRoZSBpbnB1dCBwb3J0LgorICAgICAgICBpbnQzMl90IGZyYW1lc1JlYWQgPSBwdWxsKGZyYW1lc0xlZnQpOworICAgICAgICBpZiAoZnJhbWVzUmVhZCA8PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjb25zdCBmbG9hdCAqc2lnbmFsID0gaW5wdXQuZ2V0QmxvY2soKTsKKyAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzUmVhZCAqIGNoYW5uZWxDb3VudDsKKyAgICAgICAgbWVtY3B5KGZsb2F0RGF0YSwgc2lnbmFsLCBudW1TYW1wbGVzICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIGZsb2F0RGF0YSArPSBudW1TYW1wbGVzOworICAgICAgICBmcmFtZXNMZWZ0IC09IGZyYW1lc1JlYWQ7CisgICAgfQorICAgIHJldHVybiBudW1GcmFtZXMgLSBmcmFtZXNMZWZ0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rRmxvYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Nzc1YzA4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0Zsb2F0LmgKQEAgLTAsMCArMSwzOCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjaWZuZGVmIEZMT1dHUkFQSF9TSU5LX0ZMT0FUX0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NJTktfRkxPQVRfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIFNpbmtGbG9hdCA6IHB1YmxpYyBBdWRpb1NpbmsgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNpbmtGbG9hdChpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQzMl90IHJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworCit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1NJTktfRkxPQVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTE2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmVjOGY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5jcHAKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2lmZGVmIF9fQU5EUk9JRF9fCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJTaW5rSTE2LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK1NpbmtJMTY6OlNpbmtJMTYoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9TaW5rKGNoYW5uZWxDb3VudCkge30KKworaW50MzJfdCBTaW5rSTE2OjpyZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgaW50MTZfdCAqc2hvcnREYXRhID0gKGludDE2X3QgKikgZGF0YTsKKyAgICBjb25zdCBpbnQzMl90IGNoYW5uZWxDb3VudCA9IGlucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOworICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgeworICAgICAgICAvLyBSdW4gdGhlIGdyYXBoIGFuZCBwdWxsIGRhdGEgdGhyb3VnaCB0aGUgaW5wdXQgcG9ydC4KKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbChmcmFtZXNMZWZ0KTsKKyAgICAgICAgaWYgKGZyYW1lc1JlYWQgPD0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgZmxvYXQgKnNpZ25hbCA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1JlYWQgKiBjaGFubmVsQ291bnQ7CisjaWZkZWYgX19BTkRST0lEX18KKyAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KHNob3J0RGF0YSwgc2lnbmFsLCBudW1TYW1wbGVzKTsKKyAgICAgICAgc2hvcnREYXRhICs9IG51bVNhbXBsZXM7CisgICAgICAgIHNpZ25hbCArPSBudW1TYW1wbGVzOworI2Vsc2UKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGludDMyX3QgbiA9IChpbnQzMl90KSAoKnNpZ25hbCsrICogMzI3NjguMGYpOworICAgICAgICAgICAgKnNob3J0RGF0YSsrID0gc3RkOjptaW4oSU5UMTZfTUFYLCBzdGQ6Om1heChJTlQxNl9NSU4sIG4pKTsgLy8gY2xpcAorICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgZnJhbWVzTGVmdCAtPSBmcmFtZXNSZWFkOworICAgIH0KKyAgICByZXR1cm4gbnVtRnJhbWVzIC0gZnJhbWVzTGVmdDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMTYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDg2MjY2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU2lua0kxNi5oCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRkxPV0dSQVBIX1NJTktfSTE2X0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NJTktfSTE2X0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTaW5rSTE2IDogcHVibGljIEF1ZGlvU2luayB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU2lua0kxNihpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQzMl90IHJlYWQodm9pZCAqZGF0YSwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9TSU5LX0kxNl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1OTI4MjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmNwcApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlNpbmtJMjQuaCIKKwordXNpbmcgbmFtZXNwYWNlIGZsb3dncmFwaDsKKworCitTaW5rSTI0OjpTaW5rSTI0KGludDMyX3QgY2hhbm5lbENvdW50KQorICAgICAgICA6IEF1ZGlvU2luayhjaGFubmVsQ291bnQpIHt9CisKK2ludDMyX3QgU2lua0kyNDo6cmVhZCh2b2lkICpkYXRhLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIHVpbnQ4X3QgKmJ5dGVEYXRhID0gKHVpbnQ4X3QgKikgZGF0YTsKKyAgICBjb25zdCBpbnQzMl90IGNoYW5uZWxDb3VudCA9IGlucHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbnVtRnJhbWVzOworICAgIHdoaWxlIChmcmFtZXNMZWZ0ID4gMCkgeworICAgICAgICAvLyBSdW4gdGhlIGdyYXBoIGFuZCBwdWxsIGRhdGEgdGhyb3VnaCB0aGUgaW5wdXQgcG9ydC4KKyAgICAgICAgaW50MzJfdCBmcmFtZXNSZWFkID0gcHVsbChmcmFtZXNMZWZ0KTsKKyAgICAgICAgaWYgKGZyYW1lc1JlYWQgPD0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgZmxvYXQgKmZsb2F0RGF0YSA9IGlucHV0LmdldEJsb2NrKCk7CisgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1JlYWQgKiBjaGFubmVsQ291bnQ7CisjaWZkZWYgX19BTkRST0lEX18KKyAgICAgICAgbWVtY3B5X3RvX3AyNF9mcm9tX2Zsb2F0KGJ5dGVEYXRhLCBmbG9hdERhdGEsIG51bVNhbXBsZXMpOworICAgICAgICBzdGF0aWMgY29uc3QgaW50IGtCeXRlc1BlckkyNFBhY2tlZCA9IDM7CisgICAgICAgIGJ5dGVEYXRhICs9IG51bVNhbXBsZXMgKiBrQnl0ZXNQZXJJMjRQYWNrZWQ7CisgICAgICAgIGZsb2F0RGF0YSArPSBudW1TYW1wbGVzOworI2Vsc2UKKyAgICAgICAgY29uc3QgaW50MzJfdCBrSTI0UGFja2VkTWF4ID0gMHgwMDdGRkZGRjsKKyAgICAgICAgY29uc3QgaW50MzJfdCBrSTI0UGFja2VkTWluID0gMHhGRjgwMDAwMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgICAgIGludDMyX3QgbiA9IChpbnQzMl90KSAoKmZsb2F0RGF0YSsrICogMHgwMDgwMDAwMCk7CisgICAgICAgICAgICBuID0gc3RkOjptaW4oa0kyNFBhY2tlZE1heCwgc3RkOjptYXgoa0kyNFBhY2tlZE1pbiwgbikpOyAvLyBjbGlwCisgICAgICAgICAgICAvLyBXcml0ZSBhcyBhIHBhY2tlZCAyNC1iaXQgaW50ZWdlciBpbiBMaXR0bGUgRW5kaWFuIGZvcm1hdC4KKyAgICAgICAgICAgICpieXRlRGF0YSsrID0gKHVpbnQ4X3QpIG47CisgICAgICAgICAgICAqYnl0ZURhdGErKyA9ICh1aW50OF90KSAobiA+PiA4KTsKKyAgICAgICAgICAgICpieXRlRGF0YSsrID0gKHVpbnQ4X3QpIChuID4+IDE2KTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGZyYW1lc0xlZnQgLT0gZnJhbWVzUmVhZDsKKyAgICB9CisgICAgcmV0dXJuIG51bUZyYW1lcyAtIGZyYW1lc0xlZnQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9TaW5rSTI0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI5YjUwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NpbmtJMjQuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9TSU5LX0kyNF9ICisjZGVmaW5lIEZMT1dHUkFQSF9TSU5LX0kyNF9ICisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorCituYW1lc3BhY2UgZmxvd2dyYXBoIHsKKworY2xhc3MgU2lua0kyNCA6IHB1YmxpYyBBdWRpb1NpbmsgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNpbmtJMjQoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgaW50MzJfdCByZWFkKHZvaWQgKmRhdGEsIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfU0lOS19JMjRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiYjY3NGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5jcHAKQEAgLTAsMCArMSw0MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKyNpbmNsdWRlICJTb3VyY2VGbG9hdC5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitTb3VyY2VGbG9hdDo6U291cmNlRmxvYXQoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9Tb3VyY2UoY2hhbm5lbENvdW50KSB7Cit9CisKK2ludDMyX3QgU291cmNlRmxvYXQ6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisKKyAgICBmbG9hdCAqb3V0cHV0QnVmZmVyID0gb3V0cHV0LmdldEJsb2NrKCk7CisgICAgaW50MzJfdCBjaGFubmVsQ291bnQgPSBvdXRwdXQuZ2V0U2FtcGxlc1BlckZyYW1lKCk7CisKKyAgICBpbnQzMl90IGZyYW1lc0xlZnQgPSBtU2l6ZUluRnJhbWVzIC0gbUZyYW1lSW5kZXg7CisgICAgaW50MzJfdCBmcmFtZXNUb1Byb2Nlc3MgPSBzdGQ6Om1pbihudW1GcmFtZXMsIGZyYW1lc0xlZnQpOworICAgIGludDMyX3QgbnVtU2FtcGxlcyA9IGZyYW1lc1RvUHJvY2VzcyAqIGNoYW5uZWxDb3VudDsKKworICAgIGNvbnN0IGZsb2F0ICpmbG9hdEJhc2UgPSAoZmxvYXQgKikgbURhdGE7CisgICAgY29uc3QgZmxvYXQgKmZsb2F0RGF0YSA9ICZmbG9hdEJhc2VbbUZyYW1lSW5kZXggKiBjaGFubmVsQ291bnRdOworICAgIG1lbWNweShvdXRwdXRCdWZmZXIsIGZsb2F0RGF0YSwgbnVtU2FtcGxlcyAqIHNpemVvZihmbG9hdCkpOworICAgIG1GcmFtZUluZGV4ICs9IGZyYW1lc1RvUHJvY2VzczsKKyAgICByZXR1cm4gZnJhbWVzVG9Qcm9jZXNzOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VGbG9hdC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmVlZDlmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlRmxvYXQuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9TT1VSQ0VfRkxPQVRfSAorI2RlZmluZSBGTE9XR1JBUEhfU09VUkNFX0ZMT0FUX0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTb3VyY2VGbG9hdCA6IHB1YmxpYyBBdWRpb1NvdXJjZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU291cmNlRmxvYXQoaW50MzJfdCBjaGFubmVsQ291bnQpOworCisgICAgaW50MzJfdCBvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgb3ZlcnJpZGU7Cit9OworCit9IC8qIG5hbWVzcGFjZSBmbG93Z3JhcGggKi8KKworI2VuZGlmIC8vRkxPV0dSQVBIX1NPVVJDRV9GTE9BVF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2ZjZWMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTE2LmNwcApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaWZkZWYgX19BTkRST0lEX18KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjZW5kaWYKKworI2luY2x1ZGUgIkF1ZGlvUHJvY2Vzc29yQmFzZS5oIgorI2luY2x1ZGUgIlNvdXJjZUkxNi5oIgorCit1c2luZyBuYW1lc3BhY2UgZmxvd2dyYXBoOworCitTb3VyY2VJMTY6OlNvdXJjZUkxNihpbnQzMl90IGNoYW5uZWxDb3VudCkKKyAgICAgICAgOiBBdWRpb1NvdXJjZShjaGFubmVsQ291bnQpIHsKK30KKworaW50MzJfdCBTb3VyY2VJMTY6Om9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSB7CisgICAgZmxvYXQgKmZsb2F0RGF0YSA9IG91dHB1dC5nZXRCbG9jaygpOworICAgIGludDMyX3QgY2hhbm5lbENvdW50ID0gb3V0cHV0LmdldFNhbXBsZXNQZXJGcmFtZSgpOworCisgICAgaW50MzJfdCBmcmFtZXNMZWZ0ID0gbVNpemVJbkZyYW1lcyAtIG1GcmFtZUluZGV4OworICAgIGludDMyX3QgZnJhbWVzVG9Qcm9jZXNzID0gc3RkOjptaW4obnVtRnJhbWVzLCBmcmFtZXNMZWZ0KTsKKyAgICBpbnQzMl90IG51bVNhbXBsZXMgPSBmcmFtZXNUb1Byb2Nlc3MgKiBjaGFubmVsQ291bnQ7CisKKyAgICBjb25zdCBpbnQxNl90ICpzaG9ydEJhc2UgPSBzdGF0aWNfY2FzdDxjb25zdCBpbnQxNl90ICo+KG1EYXRhKTsKKyAgICBjb25zdCBpbnQxNl90ICpzaG9ydERhdGEgPSAmc2hvcnRCYXNlW21GcmFtZUluZGV4ICogY2hhbm5lbENvdW50XTsKKworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KGZsb2F0RGF0YSwgc2hvcnREYXRhLCBudW1TYW1wbGVzKTsKKyNlbHNlCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgKmZsb2F0RGF0YSsrID0gKnNob3J0RGF0YSsrICogKDEuMGYgLyAzMjc2OCk7CisgICAgfQorI2VuZGlmCisKKyAgICBtRnJhbWVJbmRleCArPSBmcmFtZXNUb1Byb2Nlc3M7CisgICAgcmV0dXJuIGZyYW1lc1RvUHJvY2VzczsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuaCBiL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkxNi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMTE2Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMTYuaApAQCAtMCwwICsxLDM2IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZMT1dHUkFQSF9TT1VSQ0VfSTE2X0gKKyNkZWZpbmUgRkxPV0dSQVBIX1NPVVJDRV9JMTZfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlICJBdWRpb1Byb2Nlc3NvckJhc2UuaCIKKworbmFtZXNwYWNlIGZsb3dncmFwaCB7CisKK2NsYXNzIFNvdXJjZUkxNiA6IHB1YmxpYyBBdWRpb1NvdXJjZSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgU291cmNlSTE2KGludDMyX3QgY2hhbm5lbENvdW50KTsKKworICAgIGludDMyX3Qgb25Qcm9jZXNzKGludDY0X3QgZnJhbWVQb3NpdGlvbiwgaW50MzJfdCBudW1GcmFtZXMpIG92ZXJyaWRlOworfTsKKworfSAvKiBuYW1lc3BhY2UgZmxvd2dyYXBoICovCisKKyNlbmRpZiAvL0ZMT1dHUkFQSF9TT1VSQ0VfSTE2X0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvZmxvd2dyYXBoL1NvdXJjZUkyNC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMTk4ODAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuY3BwCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisjaW5jbHVkZSAiU291cmNlSTI0LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK2NvbnN0ZXhwciBpbnQga0J5dGVzUGVySTI0UGFja2VkID0gMzsKKworU291cmNlSTI0OjpTb3VyY2VJMjQoaW50MzJfdCBjaGFubmVsQ291bnQpCisgICAgICAgIDogQXVkaW9Tb3VyY2UoY2hhbm5lbENvdW50KSB7Cit9CisKK2ludDMyX3QgU291cmNlSTI0OjpvblByb2Nlc3MoaW50NjRfdCBmcmFtZVBvc2l0aW9uLCBpbnQzMl90IG51bUZyYW1lcykgeworICAgIGZsb2F0ICpmbG9hdERhdGEgPSBvdXRwdXQuZ2V0QmxvY2soKTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudCA9IG91dHB1dC5nZXRTYW1wbGVzUGVyRnJhbWUoKTsKKworICAgIGludDMyX3QgZnJhbWVzTGVmdCA9IG1TaXplSW5GcmFtZXMgLSBtRnJhbWVJbmRleDsKKyAgICBpbnQzMl90IGZyYW1lc1RvUHJvY2VzcyA9IHN0ZDo6bWluKG51bUZyYW1lcywgZnJhbWVzTGVmdCk7CisgICAgaW50MzJfdCBudW1TYW1wbGVzID0gZnJhbWVzVG9Qcm9jZXNzICogY2hhbm5lbENvdW50OworCisgICAgY29uc3QgdWludDhfdCAqYnl0ZUJhc2UgPSAodWludDhfdCAqKSBtRGF0YTsKKyAgICBjb25zdCB1aW50OF90ICpieXRlRGF0YSA9ICZieXRlQmFzZVttRnJhbWVJbmRleCAqIGNoYW5uZWxDb3VudCAqIGtCeXRlc1BlckkyNFBhY2tlZF07CisKKyNpZmRlZiBfX0FORFJPSURfXworICAgIG1lbWNweV90b19mbG9hdF9mcm9tX3AyNChmbG9hdERhdGEsIGJ5dGVEYXRhLCBudW1TYW1wbGVzKTsKKyNlbHNlCisgICAgc3RhdGljIGNvbnN0IGZsb2F0IHNjYWxlID0gMS4gLyAoZmxvYXQpKDFVTCA8PCAzMSk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKKyAgICAgICAgLy8gQXNzZW1ibGUgdGhlIGRhdGEgYXNzdW1pbmcgTGl0dGxlIEVuZGlhbiBmb3JtYXQuCisgICAgICAgIGludDMyX3QgcGFkID0gYnl0ZURhdGFbMl07CisgICAgICAgIHBhZCA8PD0gODsKKyAgICAgICAgcGFkIHw9IGJ5dGVEYXRhWzFdOworICAgICAgICBwYWQgPDw9IDg7CisgICAgICAgIHBhZCB8PSBieXRlRGF0YVswXTsKKyAgICAgICAgcGFkIDw8PSA4OyAvLyBTaGlmdCB0byAzMiBiaXQgZGF0YSBzbyB0aGUgc2lnbiBpcyBjb3JyZWN0LgorICAgICAgICBieXRlRGF0YSArPSBrQnl0ZXNQZXJJMjRQYWNrZWQ7CisgICAgICAgICpmbG9hdERhdGErKyA9IHBhZCAqIHNjYWxlOyAvLyBzY2FsZSB0byByYW5nZSAtMS4wIHRvIDEuMAorICAgIH0KKyNlbmRpZgorCisgICAgbUZyYW1lSW5kZXggKz0gZnJhbWVzVG9Qcm9jZXNzOworICAgIHJldHVybiBmcmFtZXNUb1Byb2Nlc3M7Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2Zsb3dncmFwaC9Tb3VyY2VJMjQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWYxNGRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9mbG93Z3JhcGgvU291cmNlSTI0LmgKQEAgLTAsMCArMSwzNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBGTE9XR1JBUEhfU09VUkNFX0kyNF9ICisjZGVmaW5lIEZMT1dHUkFQSF9TT1VSQ0VfSTI0X0gKKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9jZXNzb3JCYXNlLmgiCisKK25hbWVzcGFjZSBmbG93Z3JhcGggeworCitjbGFzcyBTb3VyY2VJMjQgOiBwdWJsaWMgQXVkaW9Tb3VyY2UgeworcHVibGljOgorICAgIGV4cGxpY2l0IFNvdXJjZUkyNChpbnQzMl90IGNoYW5uZWxDb3VudCk7CisKKyAgICBpbnQzMl90IG9uUHJvY2VzcyhpbnQ2NF90IGZyYW1lUG9zaXRpb24sIGludDMyX3QgbnVtRnJhbWVzKSBvdmVycmlkZTsKK307CisKK30gLyogbmFtZXNwYWNlIGZsb3dncmFwaCAqLworCisjZW5kaWYgLy9GTE9XR1JBUEhfU09VUkNFX0kyNF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5jcHAKaW5kZXggYTZiOWY1ZC4uOTFkMmVmZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmNwcApAQCAtNzgsOCArNzgsOSBAQAogCiB2b2lkIEF1ZGlvU3RyZWFtTGVnYWN5Ojpwcm9jZXNzQ2FsbGJhY2tDb21tb24oYWF1ZGlvX2NhbGxiYWNrX29wZXJhdGlvbl90IG9wY29kZSwgdm9pZCAqaW5mbykgewogICAgIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IGNhbGxiYWNrUmVzdWx0OwotICAgIC8vIFRoaXMgaWxsZWdhbCBzaXplIGNhbiBiZSB1c2VkIHRvIHRlbGwgQXVkaW9GbGluZ2VyIHRvIHN0b3AgY2FsbGluZyB1cy4KLSAgICAvLyBUaGlzIHRha2VzIGFkdmFudGFnZSBvZiBBdWRpb0ZsaW5nZXIga2lsbGluZyB0aGUgc3RyZWFtLgorICAgIC8vIFRoaXMgaWxsZWdhbCBzaXplIGNhbiBiZSB1c2VkIHRvIHRlbGwgQXVkaW9SZWNvcmQgb3IgQXVkaW9UcmFjayB0byBzdG9wIGNhbGxpbmcgdXMuCisgICAgLy8gVGhpcyB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhlbSBraWxsaW5nIHRoZSBzdHJlYW0gd2hlbiB0aGV5IHNlZSBhIHNpemUgb3V0IG9mIHJhbmdlLgorICAgIC8vIFRoYXQgaXMgYW4gdW5kb2N1bWVudGVkIGJlaGF2aW9yLgogICAgIC8vIFRPRE8gYWRkIHRvIEFQSSBpbiBBdWRpb1JlY29yZCBhbmQgQXVkaW9UcmFjawogICAgIGNvbnN0IHNpemVfdCBTSVpFX1NUT1BfQ0FMTEJBQ0tTID0gU0laRV9NQVg7CiAKQEAgLTk1LDcgKzk2LDcgQEAKICAgICAgICAgICAgICAgICBBTE9HVygicHJvY2Vzc0NhbGxiYWNrQ29tbW9uKCkgZGF0YSwgc3RyZWFtIGRpc2Nvbm5lY3RlZCIpOwogICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gU0laRV9TVE9QX0NBTExCQUNLUzsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoIW1DYWxsYmFja0VuYWJsZWQubG9hZCgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInByb2Nlc3NDYWxsYmFja0NvbW1vbigpIHN0b3BwaW5nIGJlY2F1c2UgY2FsbGJhY2sgZGlzYWJsZWQiKTsKKyAgICAgICAgICAgICAgICBBTE9HVygicHJvY2Vzc0NhbGxiYWNrQ29tbW9uKCkgbm8gZGF0YSBiZWNhdXNlIGNhbGxiYWNrIGRpc2FibGVkIik7CiAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSBTSVpFX1NUT1BfQ0FMTEJBQ0tTOwogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICBpZiAoYXVkaW9CdWZmZXItPmZyYW1lQ291bnQgPT0gMCkgewpAQCAtMTE1LDEwICsxMTYsMTYgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUUpIHsKICAgICAgICAgICAgICAgICAgICAgYXVkaW9CdWZmZXItPnNpemUgPSBhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCAqIGdldEJ5dGVzUGVyRGV2aWNlRnJhbWUoKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgeyAvLyBTVE9QIG9yIGludmFsaWQgcmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGNhbGxiYWNrIHJlcXVlc3RlZCBzdG9wLCBmYWtlIGFuIGVycm9yIiwgX19mdW5jX18pOwotICAgICAgICAgICAgICAgICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IFNJWkVfU1RPUF9DQUxMQkFDS1M7Ci0gICAgICAgICAgICAgICAgICAgIC8vIERpc2FibGUgdGhlIGNhbGxiYWNrIGp1c3QgaW4gY2FzZSBBdWRpb0ZsaW5nZXIga2VlcHMgdHJ5aW5nIHRvIGNhbGwgdXMuCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhbGxiYWNrUmVzdWx0ID09IEFBVURJT19DQUxMQkFDS19SRVNVTFRfU1RPUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0QoIiVzKCkgY2FsbGJhY2sgcmV0dXJuZWQgQUFVRElPX0NBTExCQUNLX1JFU1VMVF9TVE9QIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgY2FsbGJhY2sgcmV0dXJuZWQgaW52YWxpZCByZXN1bHQgPSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2FsbGJhY2tSZXN1bHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgc3lzdGVtU3RvcEZyb21DYWxsYmFjaygpOworICAgICAgICAgICAgICAgICAgICAvLyBEaXNhYmxlIHRoZSBjYWxsYmFjayBqdXN0IGluIGNhc2UgdGhlIHN5c3RlbSBrZWVwcyB0cnlpbmcgdG8gY2FsbCB1cy4KICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZShmYWxzZSk7CiAgICAgICAgICAgICAgICAgfQogCkBAIC0xOTksNyArMjA2LDkgQEAKIAogdm9pZCBBdWRpb1N0cmVhbUxlZ2FjeTo6b25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKQogewotICAgIEFMT0dEKCJvbkF1ZGlvRGV2aWNlVXBkYXRlKCkgZGV2aWNlSWQgJWQiLCAoaW50KWRldmljZUlkKTsKKyAgICAvLyBEZXZpY2Ugcm91dGluZyBpcyBhIGNvbW1vbiBzb3VyY2Ugb2YgZXJyb3JzIGFuZCBESVNDT05ORUNUUy4KKyAgICAvLyBQbGVhc2UgbGVhdmUgdGhpcyBsb2cgaW4gcGxhY2UuCisgICAgQUxPR0QoIiVzKCkgZGV2SWQgJWQgPT4gJWQiLCBfX2Z1bmNfXywgKGludCkgZ2V0RGV2aWNlSWQoKSwgKGludClkZXZpY2VJZCk7CiAgICAgaWYgKGdldERldmljZUlkKCkgIT0gQUFVRElPX1VOU1BFQ0lGSUVEICYmIGdldERldmljZUlkKCkgIT0gZGV2aWNlSWQgJiYKICAgICAgICAgICAgIGdldFN0YXRlKCkgIT0gQUFVRElPX1NUUkVBTV9TVEFURV9ESVNDT05ORUNURUQpIHsKICAgICAgICAgLy8gTm90ZSB0aGF0IGlzRGF0YUNhbGxiYWNrQWN0aXZlKCkgaXMgYWZmZWN0ZWQgYnkgc3RhdGUgc28gY2FsbCBpdCBiZWZvcmUgRElTQ09OTkVDVElORy4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmggYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbUxlZ2FjeS5oCmluZGV4IDQ5NGVkYmMuLjhlNzg1NTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtTGVnYWN5LmgKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1MZWdhY3kuaApAQCAtNzcsNyArNzcsNiBAQAogCiAgICAgdmlydHVhbCBpbnQ2NF90IGluY3JlbWVudENsaWVudEZyYW1lQ291bnRlcihpbnQzMl90IGZyYW1lcykgID0gMDsKIAotCiAgICAgdmlydHVhbCBpbnQ2NF90IGdldEZyYW1lc1dyaXR0ZW4oKSBvdmVycmlkZSB7CiAgICAgICAgIHJldHVybiBtRnJhbWVzV3JpdHRlbi5nZXQoKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVJlY29yZC5jcHAKaW5kZXggNTA1ZjJlZS4uNzFlZmMzMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy9sZWdhY3kvQXVkaW9TdHJlYW1SZWNvcmQuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtUmVjb3JkLmNwcApAQCAtNTcsMzIgKzU3LDQxIEBACiAKICAgICAvLyBUcnkgdG8gY3JlYXRlIGFuIEF1ZGlvUmVjb3JkCiAKKyAgICBjb25zdCBhYXVkaW9fc2Vzc2lvbl9pZF90IHJlcXVlc3RlZFNlc3Npb25JZCA9IGJ1aWxkZXIuZ2V0U2Vzc2lvbklkKCk7CisgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKHJlcXVlc3RlZFNlc3Npb25JZCk7CisKICAgICAvLyBUT0RPIFN1cHBvcnQgVU5TUEVDSUZJRUQgaW4gQXVkaW9SZWNvcmQuIEZvciBub3csIHVzZSBzdGVyZW8gaWYgdW5zcGVjaWZpZWQuCiAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUgPSAoZ2V0U2FtcGxlc1BlckZyYW1lKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAyIDogZ2V0U2FtcGxlc1BlckZyYW1lKCk7Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX2luX21hc2tfZnJvbV9jb3VudChzYW1wbGVzUGVyRnJhbWUpOworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gc2FtcGxlc1BlckZyYW1lIDw9IDIgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KHNhbXBsZXNQZXJGcmFtZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19mb3JfaW5kZXhfYXNzaWdubWVudF9mcm9tX2NvdW50KHNhbXBsZXNQZXJGcmFtZSk7CiAKICAgICBzaXplX3QgZnJhbWVDb3VudCA9IChidWlsZGVyLmdldEJ1ZmZlckNhcGFjaXR5KCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSA/IDAKICAgICAgICAgICAgICAgICAgICAgICAgIDogYnVpbGRlci5nZXRCdWZmZXJDYXBhY2l0eSgpOwogCiAKLSAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FOworICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3M7CiAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSA9IGdldFBlcmZvcm1hbmNlTW9kZSgpOwogICAgIHN3aXRjaCAocGVyZk1vZGUpIHsKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWToKLSAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChBVURJT19JTlBVVF9GTEFHX0ZBU1QgfCBBVURJT19JTlBVVF9GTEFHX1JBVyk7CisgICAgICAgICAgICAvLyBJZiB0aGUgYXBwIGFza3MgZm9yIGEgc2Vzc2lvbklkIHRoZW4gaXQgbWVhbnMgdGhleSB3YW50IHRvIHVzZSBlZmZlY3RzLgorICAgICAgICAgICAgLy8gU28gZG9uJ3QgdXNlIFJBVyBmbGFnLgorICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9faW5wdXRfZmxhZ3NfdCkgKChyZXF1ZXN0ZWRTZXNzaW9uSWQgPT0gQUFVRElPX1NFU1NJT05fSURfTk9ORSkKKyAgICAgICAgICAgICAgICAgICAgPyAoQVVESU9fSU5QVVRfRkxBR19GQVNUIHwgQVVESU9fSU5QVVRfRkxBR19SQVcpCisgICAgICAgICAgICAgICAgICAgIDogKEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkpOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9QT1dFUl9TQVZJTkc6CiAgICAgICAgIGNhc2UgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORToKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIC8vIE5vIGZsYWdzLgorICAgICAgICAgICAgZmxhZ3MgPSBBVURJT19JTlBVVF9GTEFHX05PTkU7CiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKICAgICAvLyBQcmVzZXJ2ZSBiZWhhdmlvciBvZiBBUEkgMjYKLSAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRCkgewotICAgICAgICBzZXRGb3JtYXQoQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOworICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICBzZXRGb3JtYXQoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CiAgICAgfQogCiAgICAgLy8gTWF5YmUgY2hhbmdlIGRldmljZSBmb3JtYXQgdG8gZ2V0IGEgRkFTVCBwYXRoLgpAQCAtOTksMTIgKzEwOCwxMiBAQAogICAgIC8vIFdlIGp1c3QgbWF5IG5vdCBnZXQgYSBGQVNUIHRyYWNrLgogICAgIC8vIEJ1dCB3ZSB3b3VsZG4ndCBoYXZlIGFueXdheSB3aXRob3V0IHRoaXMgaGFjay4KICAgICBjb25zdGV4cHIgaW50MzJfdCBrTW9zdExpa2VseVNhbXBsZVJhdGVGb3JGYXN0ID0gNDgwMDA7Ci0gICAgaWYgKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUCisgICAgaWYgKGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQKICAgICAgICAgICAgICYmIHBlcmZNb2RlID09IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZCiAgICAgICAgICAgICAmJiAoc2FtcGxlc1BlckZyYW1lIDw9IDIpIC8vIEZBU1Qgb25seSBmb3IgbW9ubyBhbmQgc3RlcmVvCiAgICAgICAgICAgICAmJiAoZ2V0U2FtcGxlUmF0ZSgpID09IGtNb3N0TGlrZWx5U2FtcGxlUmF0ZUZvckZhc3QKICAgICAgICAgICAgICAgICB8fCBnZXRTYW1wbGVSYXRlKCkgPT0gQUFVRElPX1VOU1BFQ0lGSUVEKSkgewotICAgICAgICBzZXREZXZpY2VGb3JtYXQoQUFVRElPX0ZPUk1BVF9QQ01fSTE2KTsKKyAgICAgICAgc2V0RGV2aWNlRm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKTsKICAgICB9IGVsc2UgewogICAgICAgICBzZXREZXZpY2VGb3JtYXQoZ2V0Rm9ybWF0KCkpOwogICAgIH0KQEAgLTE0MSwxNCArMTUwLDEwIEBACiAgICAgICAgICAgICAudGFncyA9ICIiCiAgICAgfTsKIAotICAgIGFhdWRpb19zZXNzaW9uX2lkX3QgcmVxdWVzdGVkU2Vzc2lvbklkID0gYnVpbGRlci5nZXRTZXNzaW9uSWQoKTsKLSAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQocmVxdWVzdGVkU2Vzc2lvbklkKTsKLQogICAgIC8vIC0tLS0tLS0tLS0tIG9wZW4gdGhlIEF1ZGlvUmVjb3JkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAgIC8vIE1pZ2h0IHJldHJ5LCBidXQgbmV2ZXIgbW9yZSB0aGFuIG9uY2UuCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyBpICsrKSB7Ci0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IHJlcXVlc3RlZEludGVybmFsRm9ybWF0ID0KLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQoZ2V0RGV2aWNlRm9ybWF0KCkpOworICAgICAgICBjb25zdCBhdWRpb19mb3JtYXRfdCByZXF1ZXN0ZWRJbnRlcm5hbEZvcm1hdCA9IGdldERldmljZUZvcm1hdCgpOwogCiAgICAgICAgIG1BdWRpb1JlY29yZCA9IG5ldyBBdWRpb1JlY29yZCgKICAgICAgICAgICAgICAgICBtT3BQYWNrYWdlTmFtZSAvLyBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSBUT0RPIGRvZXMgbm90IGNvbXBpbGUKQEAgLTIxNCw4ICsyMTksOCBAQAogICAgIH0KIAogICAgIC8vIEFsbG9jYXRlIGZvcm1hdCBjb252ZXJzaW9uIGJ1ZmZlciBpZiBuZWVkZWQuCi0gICAgaWYgKGdldERldmljZUZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfUENNX0kxNgotICAgICAgICAmJiBnZXRGb3JtYXQoKSA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgeworICAgIGlmIChnZXREZXZpY2VGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVAorICAgICAgICAmJiBnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CiAKICAgICAgICAgaWYgKGJ1aWxkZXIuZ2V0RGF0YUNhbGxiYWNrUHJvYygpICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYSBjYWxsYmFjayB0aGVuIHdlIG5lZWQgdG8gY29udmVydCB0aGUgZGF0YSBpbnRvIGFuIGludGVybmFsIGZsb2F0CkBAIC0zMjMsMTYgKzMyOCwxMyBAQAogICAgIGlmIChtQXVkaW9SZWNvcmQuZ2V0KCkgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQotICAgIC8vIEdldCBjdXJyZW50IHBvc2l0aW9uIHNvIHdlIGNhbiBkZXRlY3Qgd2hlbiB0aGUgdHJhY2sgaXMgcmVjb3JkaW5nLgotICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1JlY29yZC0+Z2V0UG9zaXRpb24oJm1Qb3NpdGlvbldoZW5TdGFydGluZyk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoZXJyKTsKLSAgICB9CiAKLSAgICAvLyBFbmFibGUgY2FsbGJhY2sgYmVmb3JlIHN0YXJ0aW5nIEF1ZGlvVHJhY2sgdG8gYXZvaWQgc2h1dHRpbmcKKyAgICAvLyBFbmFibGUgY2FsbGJhY2sgYmVmb3JlIHN0YXJ0aW5nIEF1ZGlvUmVjb3JkIHRvIGF2b2lkIHNodXR0aW5nCiAgICAgLy8gZG93biBiZWNhdXNlIG9mIGEgcmFjZSBjb25kaXRpb24uCiAgICAgbUNhbGxiYWNrRW5hYmxlZC5zdG9yZSh0cnVlKTsKLSAgICBlcnIgPSBtQXVkaW9SZWNvcmQtPnN0YXJ0KCk7CisgICAgbUZyYW1lc1dyaXR0ZW4ucmVzZXQzMigpOyAvLyBzZXJ2aWNlIHdyaXRlcyBmcmFtZXMKKyAgICBtVGltZXN0YW1wUG9zaXRpb24ucmVzZXQzMigpOworICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1JlY29yZC0+c3RhcnQoKTsgLy8gcmVzZXRzIHBvc2l0aW9uIHRvIHplcm8KICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgIHJldHVybiBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwogICAgIH0gZWxzZSB7CkBAIC0zNDYsMTIgKzM0OCwxMCBAQAogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogICAgIHNldFN0YXRlKEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkcpOwotICAgIGluY3JlbWVudEZyYW1lc1dyaXR0ZW4oZ2V0RnJhbWVzUmVhZCgpIC0gZ2V0RnJhbWVzV3JpdHRlbigpKTsgLy8gVE9ETyByZXZpZXcKLSAgICBtVGltZXN0YW1wUG9zaXRpb24uc2V0KGdldEZyYW1lc1JlYWQoKSk7CisgICAgbUZyYW1lc1dyaXR0ZW4uY2F0Y2hVcFRvKGdldEZyYW1lc1JlYWQoKSk7CisgICAgbVRpbWVzdGFtcFBvc2l0aW9uLmNhdGNoVXBUbyhnZXRGcmFtZXNSZWFkKCkpOwogICAgIG1BdWRpb1JlY29yZC0+c3RvcCgpOwogICAgIG1DYWxsYmFja0VuYWJsZWQuc3RvcmUoZmFsc2UpOwotICAgIG1GcmFtZXNXcml0dGVuLnJlc2V0MzIoKTsgLy8gc2VydmljZSB3cml0ZXMgZnJhbWVzLCBzZXJ2aWNlIHBvc2l0aW9uIHJlc2V0IG9uIGZsdXNoCi0gICAgbVRpbWVzdGFtcFBvc2l0aW9uLnJlc2V0MzIoKTsKICAgICAvLyBQYXNzIGZhbHNlIHRvIHByZXZlbnQgZXJyb3JDYWxsYmFjayBmcm9tIGJlaW5nIGNhbGxlZCBhZnRlciBkaXNjb25uZWN0CiAgICAgLy8gd2hlbiBhcHAgaGFzIGFscmVhZHkgcmVxdWVzdGVkIGEgc3RvcCgpLgogICAgIHJldHVybiBjaGVja0ZvckRpc2Nvbm5lY3RSZXF1ZXN0KGZhbHNlKTsKQEAgLTM2NSwxMCArMzY1LDEyIEBACiAgICAgc3dpdGNoIChnZXRTdGF0ZSgpKSB7CiAgICAgLy8gVE9ETyBhZGQgYmV0dGVyIHN0YXRlIHZpc2liaWxpdHkgdG8gQXVkaW9SZWNvcmQKICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRJTkc6CisgICAgICAgIC8vIFdoZW4gc3RhcnRpbmcsIHRoZSBwb3NpdGlvbiB3aWxsIGJlZ2luIGF0IHplcm8gYW5kIHRoZW4gZ28gcG9zaXRpdmUuCisgICAgICAgIC8vIFRoZSBwb3NpdGlvbiBjYW4gd3JhcCBidXQgYnkgdGhhdCB0aW1lIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBTVEFSVElORy4KICAgICAgICAgZXJyID0gbUF1ZGlvUmVjb3JkLT5nZXRQb3NpdGlvbigmcG9zaXRpb24pOwogICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb1Jlc3VsdChlcnIpOwotICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uICE9IG1Qb3NpdGlvbldoZW5TdGFydGluZykgeworICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID4gMCkgewogICAgICAgICAgICAgc2V0U3RhdGUoQUFVRElPX1NUUkVBTV9TVEFURV9TVEFSVEVEKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKQEAgLTQ4Myw2ICs0ODUsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpmcmFtZVBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICp0aW1lTmFub3NlY29uZHMpIHsKICAgICBFeHRlbmRlZFRpbWVzdGFtcCBleHRlbmRlZFRpbWVzdGFtcDsKKyAgICBpZiAoZ2V0U3RhdGUoKSAhPSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJURUQpIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOworICAgIH0KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9SZWNvcmQtPmdldFRpbWVzdGFtcCgmZXh0ZW5kZWRUaW1lc3RhbXApOwogICAgIGlmIChzdGF0dXMgPT0gV09VTERfQkxPQ0spIHsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwpAQCAtNDk4LDEyICs1MDMsMTIgQEAKICAgICBzd2l0Y2ggKGdldFN0YXRlKCkpIHsKICAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUQVJUSU5HOgogICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RBUlRFRDoKLSAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HOgogICAgICAgICAgICAgcmVzdWx0ID0gbUF1ZGlvUmVjb3JkLT5nZXRQb3NpdGlvbigmcG9zaXRpb24pOwogICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgewogICAgICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuLnVwZGF0ZTMyKHBvc2l0aW9uKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFBVURJT19TVFJFQU1fU1RBVEVfU1RPUFBJTkc6CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBicmVhazsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xlZ2FjeS9BdWRpb1N0cmVhbVRyYWNrLmNwcCBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwCmluZGV4IDUwNWNkNzcuLjA5NGNkZDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvbGVnYWN5L0F1ZGlvU3RyZWFtVHJhY2suY3BwCkBAIC01OSwxOCArNTksMjcgQEAKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKKyAgICBjb25zdCBhYXVkaW9fc2Vzc2lvbl9pZF90IHJlcXVlc3RlZFNlc3Npb25JZCA9IGJ1aWxkZXIuZ2V0U2Vzc2lvbklkKCk7CisgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKHJlcXVlc3RlZFNlc3Npb25JZCk7CisKICAgICAvLyBUcnkgdG8gY3JlYXRlIGFuIEF1ZGlvVHJhY2sKICAgICAvLyBVc2Ugc3RlcmVvIGlmIHVuc3BlY2lmaWVkLgogICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lID0gKGdldFNhbXBsZXNQZXJGcmFtZSgpID09IEFBVURJT19VTlNQRUNJRklFRCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gMiA6IGdldFNhbXBsZXNQZXJGcmFtZSgpOwotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KHNhbXBsZXNQZXJGcmFtZSk7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBzYW1wbGVzUGVyRnJhbWUgPD0gMiA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KHNhbXBsZXNQZXJGcmFtZSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19mb3JfaW5kZXhfYXNzaWdubWVudF9mcm9tX2NvdW50KHNhbXBsZXNQZXJGcmFtZSk7CiAKLSAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3M7CiAgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSA9IGdldFBlcmZvcm1hbmNlTW9kZSgpOwogICAgIHN3aXRjaChwZXJmTW9kZSkgewogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZOgogICAgICAgICAgICAgLy8gQnlwYXNzIHRoZSBub3JtYWwgbWl4ZXIgYW5kIGdvIHN0cmFpZ2h0IHRvIHRoZSBGQVNUIG1peGVyLgotICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgfCBBVURJT19PVVRQVVRfRkxBR19SQVcpOworICAgICAgICAgICAgLy8gSWYgdGhlIGFwcCBhc2tzIGZvciBhIHNlc3Npb25JZCB0aGVuIGl0IG1lYW5zIHRoZXkgd2FudCB0byB1c2UgZWZmZWN0cy4KKyAgICAgICAgICAgIC8vIFNvIGRvbid0IHVzZSBSQVcgZmxhZy4KKyAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAoKHJlcXVlc3RlZFNlc3Npb25JZCA9PSBBQVVESU9fU0VTU0lPTl9JRF9OT05FKQorICAgICAgICAgICAgICAgICAgICA/IChBVURJT19PVVRQVVRfRkxBR19GQVNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfUkFXKQorICAgICAgICAgICAgICAgICAgICA6IChBVURJT19PVVRQVVRfRkxBR19GQVNUKSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX1BPV0VSX1NBVklORzoKQEAgLTgxLDYgKzkwLDcgQEAKICAgICAgICAgY2FzZSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOgogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgLy8gTm8gZmxhZ3MuIFVzZSBhIG5vcm1hbCBtaXhlciBpbiBmcm9udCBvZiB0aGUgRkFTVCBtaXhlci4KKyAgICAgICAgICAgIGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtODgsOSArOTgsOSBAQAogCiAgICAgaW50MzJfdCBub3RpZmljYXRpb25GcmFtZXMgPSAwOwogCi0gICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGdldEZvcm1hdCgpID09IEFBVURJT19GT1JNQVRfVU5TUEVDSUZJRUQpCisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gKGdldEZvcm1hdCgpID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKQogICAgICAgICAgICAgPyBBVURJT19GT1JNQVRfUENNX0ZMT0FUCi0gICAgICAgICAgICA6IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChnZXRGb3JtYXQoKSk7CisgICAgICAgICAgICA6IGdldEZvcm1hdCgpOwogCiAgICAgLy8gU2V0dXAgdGhlIGNhbGxiYWNrIGlmIHRoZXJlIGlzIG9uZS4KICAgICBBdWRpb1RyYWNrOjpjYWxsYmFja190IGNhbGxiYWNrID0gbnVsbHB0cjsKQEAgLTEyNiwyMCArMTM2LDE3IEBACiAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2NvbnRlbnRUeXBlVG9JbnRlcm5hbChidWlsZGVyLmdldENvbnRlbnRUeXBlKCkpOwogICAgIGNvbnN0IGF1ZGlvX3VzYWdlX3QgdXNhZ2UgPQogICAgICAgICAgICAgQUF1ZGlvQ29udmVydF91c2FnZVRvSW50ZXJuYWwoYnVpbGRlci5nZXRVc2FnZSgpKTsKKyAgICBjb25zdCBhdWRpb19mbGFnc19tYXNrX3QgYXR0cmlidXRlc0ZsYWdzID0KKyAgICAgICAgQUF1ZGlvQ29udmVydF9hbGxvd0NhcHR1cmVQb2xpY3lUb0F1ZGlvRmxhZ3NNYXNrKGJ1aWxkZXIuZ2V0QWxsb3dlZENhcHR1cmVQb2xpY3koKSk7CiAKICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHsKICAgICAgICAgICAgIC5jb250ZW50X3R5cGUgPSBjb250ZW50VHlwZSwKICAgICAgICAgICAgIC51c2FnZSA9IHVzYWdlLAogICAgICAgICAgICAgLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9ERUZBVUxULCAvLyBvbmx5IHVzZWQgZm9yIHJlY29yZGluZwotICAgICAgICAgICAgLmZsYWdzID0gQVVESU9fRkxBR19OT05FLCAvLyBEaWZmZXJlbnQgdGhhbiB0aGUgQVVESU9fT1VUUFVUX0ZMQUdTCisgICAgICAgICAgICAuZmxhZ3MgPSBhdHRyaWJ1dGVzRmxhZ3MsCiAgICAgICAgICAgICAudGFncyA9ICIiCiAgICAgfTsKIAotICAgIHN0YXRpY19hc3NlcnQoQUFVRElPX1VOU1BFQ0lGSUVEID09IEFVRElPX1NFU1NJT05fQUxMT0NBVEUsICJTZXNzaW9uIElEcyBzaG91bGQgbWF0Y2giKTsKLQotICAgIGFhdWRpb19zZXNzaW9uX2lkX3QgcmVxdWVzdGVkU2Vzc2lvbklkID0gYnVpbGRlci5nZXRTZXNzaW9uSWQoKTsKLSAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQUF1ZGlvQ29udmVydF9hYXVkaW9Ub0FuZHJvaWRTZXNzaW9uSWQocmVxdWVzdGVkU2Vzc2lvbklkKTsKLQogICAgIG1BdWRpb1RyYWNrID0gbmV3IEF1ZGlvVHJhY2soKTsKICAgICBtQXVkaW9UcmFjay0+c2V0KAogICAgICAgICAgICAgQVVESU9fU1RSRUFNX0RFRkFVTFQsICAvLyBpZ25vcmVkIGJlY2F1c2Ugd2UgcGFzcyBhdHRyaWJ1dGVzIGJlbG93CkBAIC0xNzgsMTAgKzE4NSw4IEBACiAKICAgICAvLyBHZXQgdGhlIGFjdHVhbCB2YWx1ZXMgZnJvbSB0aGUgQXVkaW9UcmFjay4KICAgICBzZXRTYW1wbGVzUGVyRnJhbWUobUF1ZGlvVHJhY2stPmNoYW5uZWxDb3VudCgpKTsKLSAgICBhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0ID0KLSAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdChtQXVkaW9UcmFjay0+Zm9ybWF0KCkpOwotICAgIHNldEZvcm1hdChhYXVkaW9Gb3JtYXQpOwotICAgIHNldERldmljZUZvcm1hdChhYXVkaW9Gb3JtYXQpOworICAgIHNldEZvcm1hdChtQXVkaW9UcmFjay0+Zm9ybWF0KCkpOworICAgIHNldERldmljZUZvcm1hdChtQXVkaW9UcmFjay0+Zm9ybWF0KCkpOwogCiAgICAgaW50MzJfdCBhY3R1YWxTYW1wbGVSYXRlID0gbUF1ZGlvVHJhY2stPmdldFNhbXBsZVJhdGUoKTsKICAgICBBTE9HV19JRihhY3R1YWxTYW1wbGVSYXRlICE9IGdldFNhbXBsZVJhdGUoKSwKQEAgLTI4Nyw3ICsyOTIsNyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdFBhdXNlKCkgewogICAgIGlmIChtQXVkaW9UcmFjay5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJyZXF1ZXN0UGF1c2UoKSBubyBBdWRpb1RyYWNrIik7CisgICAgICAgIEFMT0dFKCIlcygpIG5vIEF1ZGlvVHJhY2siLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKQEAgLTMwMyw3ICszMDgsNyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQXVkaW9TdHJlYW1UcmFjazo6cmVxdWVzdEZsdXNoKCkgewogICAgIGlmIChtQXVkaW9UcmFjay5nZXQoKSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJyZXF1ZXN0Rmx1c2goKSBubyBBdWRpb1RyYWNrIik7CisgICAgICAgIEFMT0dFKCIlcygpIG5vIEF1ZGlvVHJhY2siLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKQEAgLTMxNywxMyArMzIyLDEzIEBACiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpyZXF1ZXN0U3RvcCgpIHsKICAgICBpZiAobUF1ZGlvVHJhY2suZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgicmVxdWVzdFN0b3AoKSBubyBBdWRpb1RyYWNrIik7CisgICAgICAgIEFMT0dFKCIlcygpIG5vIEF1ZGlvVHJhY2siLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfSU5WQUxJRF9TVEFURTsKICAgICB9CiAKICAgICBzZXRTdGF0ZShBQVVESU9fU1RSRUFNX1NUQVRFX1NUT1BQSU5HKTsKLSAgICBpbmNyZW1lbnRGcmFtZXNSZWFkKGdldEZyYW1lc1dyaXR0ZW4oKSAtIGdldEZyYW1lc1JlYWQoKSk7IC8vIFRPRE8gcmV2aWV3Ci0gICAgbVRpbWVzdGFtcFBvc2l0aW9uLnNldChnZXRGcmFtZXNXcml0dGVuKCkpOworICAgIG1GcmFtZXNSZWFkLmNhdGNoVXBUbyhnZXRGcmFtZXNXcml0dGVuKCkpOworICAgIG1UaW1lc3RhbXBQb3NpdGlvbi5jYXRjaFVwVG8oZ2V0RnJhbWVzV3JpdHRlbigpKTsKICAgICBtRnJhbWVzUmVhZC5yZXNldDMyKCk7IC8vIHNlcnZpY2UgcmVhZHMgZnJhbWVzLCBzZXJ2aWNlIHBvc2l0aW9uIHJlc2V0IG9uIHN0b3AKICAgICBtVGltZXN0YW1wUG9zaXRpb24ucmVzZXQzMigpOwogICAgIG1BdWRpb1RyYWNrLT5zdG9wKCk7CkBAIC00MTksNiArNDI0LDEwIEBACiAKIGFhdWRpb19yZXN1bHRfdCBBdWRpb1N0cmVhbVRyYWNrOjpzZXRCdWZmZXJTaXplKGludDMyX3QgcmVxdWVzdGVkRnJhbWVzKQogeworICAgIC8vIERvIG5vdCBhc2sgZm9yIGxlc3MgdGhhbiBvbmUgYnVyc3QuCisgICAgaWYgKHJlcXVlc3RlZEZyYW1lcyA8IGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKKyAgICAgICAgcmVxdWVzdGVkRnJhbWVzID0gZ2V0RnJhbWVzUGVyQnVyc3QoKTsKKyAgICB9CiAgICAgc3NpemVfdCByZXN1bHQgPSBtQXVkaW9UcmFjay0+c2V0QnVmZmVyU2l6ZUluRnJhbWVzKHJlcXVlc3RlZEZyYW1lcyk7CiAgICAgaWYgKHJlc3VsdCA8IDApIHsKICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHJlc3VsdCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL2xpYmFhdWRpby5tYXAudHh0IGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9saWJhYXVkaW8ubWFwLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODdlZGUzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy9saWJhYXVkaW8ubWFwLnR4dApAQCAtMCwwICsxLDYxIEBACitMSUJBQVVESU8geworICBnbG9iYWw6CisgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQ7CisgICAgQUF1ZGlvX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dDsKKyAgICBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcjsKKyAgICBBQXVkaW9fZ2V0TU1hcFBvbGljeTsKKyAgICBBQXVkaW9fc2V0TU1hcFBvbGljeTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERldmljZUlkOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGF0YUNhbGxiYWNrOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RXJyb3JDYWxsYmFjazsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEZyYW1lc1BlckRhdGFDYWxsYmFjazsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFNhbXBsZVJhdGU7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTYW1wbGVzUGVyRnJhbWU7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDaGFubmVsQ291bnQ7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGb3JtYXQ7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTaGFyaW5nTW9kZTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERpcmVjdGlvbjsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXM7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRVc2FnZTsgICAgICAgIyBpbnRyb2R1Y2VkPTI4CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRDb250ZW50VHlwZTsgIyBpbnRyb2R1Y2VkPTI4CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRJbnB1dFByZXNldDsgIyBpbnRyb2R1Y2VkPTI4CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRBbGxvd2VkQ2FwdHVyZVBvbGljeTsgIyBpbnRyb2R1Y2VkPTI5CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTZXNzaW9uSWQ7ICAgIyBpbnRyb2R1Y2VkPTI4CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlOworICAgIEFBdWRpb1N0cmVhbV9jbG9zZTsKKyAgICBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0OworICAgIEFBdWRpb1N0cmVhbV9yZXF1ZXN0UGF1c2U7CisgICAgQUF1ZGlvU3RyZWFtX3JlcXVlc3RGbHVzaDsKKyAgICBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3A7CisgICAgQUF1ZGlvU3RyZWFtX2dldFN0YXRlOworICAgIEFBdWRpb1N0cmVhbV93YWl0Rm9yU3RhdGVDaGFuZ2U7CisgICAgQUF1ZGlvU3RyZWFtX3JlYWQ7CisgICAgQUF1ZGlvU3RyZWFtX3dyaXRlOworICAgIEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXM7CisgICAgQUF1ZGlvU3RyZWFtX2dldEJ1ZmZlclNpemVJbkZyYW1lczsKKyAgICBBQXVkaW9TdHJlYW1fZ2V0RnJhbWVzUGVyRGF0YUNhbGxiYWNrOworICAgIEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNQZXJCdXJzdDsKKyAgICBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lczsKKyAgICBBQXVkaW9TdHJlYW1fZ2V0WFJ1bkNvdW50OworICAgIEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVSYXRlOworICAgIEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVzUGVyRnJhbWU7CisgICAgQUF1ZGlvU3RyZWFtX2dldENoYW5uZWxDb3VudDsKKyAgICBBQXVkaW9TdHJlYW1fZ2V0UGVyZm9ybWFuY2VNb2RlOworICAgIEFBdWRpb1N0cmVhbV9nZXREZXZpY2VJZDsKKyAgICBBQXVkaW9TdHJlYW1fZ2V0Rm9ybWF0OworICAgIEFBdWRpb1N0cmVhbV9nZXRTaGFyaW5nTW9kZTsKKyAgICBBQXVkaW9TdHJlYW1fZ2V0RGlyZWN0aW9uOworICAgIEFBdWRpb1N0cmVhbV9nZXRVc2FnZTsgICAgICAgIyBpbnRyb2R1Y2VkPTI4CisgICAgQUF1ZGlvU3RyZWFtX2dldENvbnRlbnRUeXBlOyAjIGludHJvZHVjZWQ9MjgKKyAgICBBQXVkaW9TdHJlYW1fZ2V0SW5wdXRQcmVzZXQ7ICMgaW50cm9kdWNlZD0yOAorICAgIEFBdWRpb1N0cmVhbV9nZXRBbGxvd2VkQ2FwdHVyZVBvbGljeTsgIyBpbnRyb2R1Y2VkPTI5CisgICAgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1dyaXR0ZW47CisgICAgQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQ7CisgICAgQUF1ZGlvU3RyZWFtX2dldFNlc3Npb25JZDsgICAjIGludHJvZHVjZWQ9MjgKKyAgICBBQXVkaW9TdHJlYW1fZ2V0VGltZXN0YW1wOworICAgIEFBdWRpb1N0cmVhbV9pc01NYXBVc2VkOworICBsb2NhbDoKKyAgICAqOworfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKaW5kZXggNDBlYmI3Ni4uY2RkMDJjMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KIAogI2luY2x1ZGUgImFhdWRpby9BQXVkaW8uaCIKKyNpbmNsdWRlICJjb3JlL0F1ZGlvR2xvYmFsLmgiCiAjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpb1Rlc3RpbmcuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLWJhc2UuaD4KQEAgLTMzLDM5NSArMzQsNiBAQAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotLy8gVGhpcyBpcyAzIGRCLCAoMTBeKDMvMjApKSwgdG8gbWF0Y2ggdGhlIG1heGltdW0gaGVhZHJvb20gaW4gQXVkaW9UcmFjayBmb3IgZmxvYXQgZGF0YS4KLS8vIEl0IGlzIGRlc2lnbmVkIHRvIGFsbG93IG9jY2FzaW9uYWwgdHJhbnNpZW50IHBlYWtzLgotI2RlZmluZSBNQVhfSEVBRFJPT00gKDEuNDEyNTM3NTRmKQotI2RlZmluZSBNSU5fSEVBRFJPT00gKDAgLSBNQVhfSEVBRFJPT00pCi0KLWludDMyX3QgQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKLSAgICBpbnQzMl90IHNpemUgPSBBQVVESU9fRVJST1JfSUxMRUdBTF9BUkdVTUVOVDsKLSAgICBzd2l0Y2ggKGZvcm1hdCkgewotICAgICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kxNjoKLSAgICAgICAgICAgIHNpemUgPSBzaXplb2YoaW50MTZfdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKLSAgICAgICAgICAgIHNpemUgPSBzaXplb2YoZmxvYXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLS8vIFRPRE8gZXhwb3NlIGFuZCBjYWxsIGNsYW1wMTZfZnJvbV9mbG9hdCBmdW5jdGlvbiBpbiBwcmltaXRpdmVzLmgKLXN0YXRpYyBpbmxpbmUgaW50MTZfdCBjbGFtcDE2X2Zyb21fZmxvYXQoZmxvYXQgZikgewotICAgIHN0YXRpYyBjb25zdCBmbG9hdCBzY2FsZSA9IDEgPDwgMTU7Ci0gICAgcmV0dXJuIChpbnQxNl90KSByb3VuZGYoZm1heGYoZm1pbmYoZiAqIHNjYWxlLCBzY2FsZSAtIDEuZiksIC1zY2FsZSkpOwotfQotCi0vLyBDbGlwIHRvIHZhbGlkIHJhbmdlIG9mIGEgZmxvYXQgc2FtcGxlIHRvIHByZXZlbnQgZXhjZXNzaXZlIHZvbHVtZS4KLS8vIEJ5IHVzaW5nIGZtaW4gYW5kIGZtYXggd2UgYWxzbyBwcm90ZWN0IGFnYWluc3QgTmFOLgotc3RhdGljIGZsb2F0IGNsaXBUb01pbk1heEhlYWRyb29tKGZsb2F0IGlucHV0KSB7Ci0gICAgcmV0dXJuIGZtaW4oTUFYX0hFQURST09NLCBmbWF4KE1JTl9IRUFEUk9PTSwgaW5wdXQpKTsKLX0KLQotc3RhdGljIGZsb2F0IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihmbG9hdCBzYW1wbGUsIGZsb2F0IHNjYWxlcikgewotICAgIC8vIENsaXAgdG8gdmFsaWQgcmFuZ2Ugb2YgYSBmbG9hdCBzYW1wbGUgdG8gcHJldmVudCBleGNlc3NpdmUgdm9sdW1lLgotICAgIHNhbXBsZSA9IGNsaXBUb01pbk1heEhlYWRyb29tKHNhbXBsZSk7Ci0KLSAgICAvLyBTY2FsZSBhbmQgY29udmVydCB0byBhIHNob3J0LgotICAgIGZsb2F0IGZ2YWwgPSBzYW1wbGUgKiBzY2FsZXI7Ci0gICAgcmV0dXJuIGNsYW1wMTZfZnJvbV9mbG9hdChmdmFsKTsKLX0KLQotdm9pZCBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNihjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpIHsKLSAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TYW1wbGVzOyBpKyspIHsKLSAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihzYW1wbGUsIHNjYWxlcik7Ci0gICAgfQotfQotCi12b2lkIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVzUGVyRnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxOwotICAgIC8vIGRpdmlkZSBieSBudW1GcmFtZXMgc28gdGhhdCB3ZSBhbG1vc3QgcmVhY2ggYW1wbGl0dWRlMgotICAgIGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHNhbXBsZUluZGV4ID0gMDsgc2FtcGxlSW5kZXggPCBzYW1wbGVzUGVyRnJhbWU7IHNhbXBsZUluZGV4KyspIHsKLSAgICAgICAgICAgIGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKLSAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gY2xpcEFuZENsYW1wRmxvYXRUb1BjbTE2KHNhbXBsZSwgc2NhbGVyKTsKLSAgICAgICAgfQotICAgICAgICBzY2FsZXIgKz0gZGVsdGE7Ci0gICAgfQotfQotCi0jZGVmaW5lIFNIT1JUX1NDQUxFICAzMjc2OAotCi12b2lkIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSkgewotICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZSAvIFNIT1JUX1NDQUxFOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtU2FtcGxlczsgaSsrKSB7Ci0gICAgICAgIGRlc3RpbmF0aW9uW2ldID0gc291cmNlW2ldICogc2NhbGVyOwotICAgIH0KLX0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdChjb25zdCBpbnQxNl90ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlMSAvIFNIT1JUX1NDQUxFOwotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIChTSE9SVF9TQ0FMRSAqIChmbG9hdCkgbnVtRnJhbWVzKTsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHNhbXBsZUluZGV4ID0gMDsgc2FtcGxlSW5kZXggPCBzYW1wbGVzUGVyRnJhbWU7IHNhbXBsZUluZGV4KyspIHsKLSAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gKnNvdXJjZSsrICogc2NhbGVyOwotICAgICAgICB9Ci0gICAgICAgIHNjYWxlciArPSBkZWx0YTsKLSAgICB9Ci19Ci0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9fbGluZWFyUmFtcChjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTE7Ci0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgZm9yIChpbnQgc2FtcGxlSW5kZXggPSAwOyBzYW1wbGVJbmRleCA8IHNhbXBsZXNQZXJGcmFtZTsgc2FtcGxlSW5kZXgrKykgewotICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotICAgICAgICAgICAgLy8gQ2xpcCB0byB2YWxpZCByYW5nZSBvZiBhIGZsb2F0IHNhbXBsZSB0byBwcmV2ZW50IGV4Y2Vzc2l2ZSB2b2x1bWUuCi0gICAgICAgICAgICBzYW1wbGUgPSBjbGlwVG9NaW5NYXhIZWFkcm9vbShzYW1wbGUpOwotCi0gICAgICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZSAqIHNjYWxlcjsKLSAgICAgICAgfQotICAgICAgICBzY2FsZXIgKz0gZGVsdGE7Ci0gICAgfQotfQotCi0vLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCi12b2lkIEFBdWRpb19saW5lYXJSYW1wKGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMikgewotICAgIC8vIEJlY2F1c2Ugd2UgYXJlIGNvbnZlcnRpbmcgZnJvbSBpbnQxNiB0byAxbnQxNiwgd2UgZG8gbm90IGhhdmUgdG8gc2NhbGUgYnkgMS8zMjc2OC4KLSAgICBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxOwotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGZvciAoaW50IHNhbXBsZUluZGV4ID0gMDsgc2FtcGxlSW5kZXggPCBzYW1wbGVzUGVyRnJhbWU7IHNhbXBsZUluZGV4KyspIHsKLSAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gY2xpcCBiZWNhdXNlIGludDE2X3QgcmFuZ2UgaXMgaW5oZXJlbnRseSBsaW1pdGVkLgotICAgICAgICAgICAgZmxvYXQgc2FtcGxlID0gICpzb3VyY2UrKyAqIHNjYWxlcjsKLSAgICAgICAgICAgICpkZXN0aW5hdGlvbisrID0gKGludDE2X3QpIHJvdW5kZihzYW1wbGUpOwotICAgICAgICB9Ci0gICAgICAgIHNjYWxlciArPSBkZWx0YTsKLSAgICB9Ci19Ci0KLS8vICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLS8vIENvbnZlcnQgTW9ubyBUbyBTdGVyZW8gYXQgdGhlIHNhbWUgdGltZSBhcyBjb252ZXJ0aW5nIGZvcm1hdC4KLXZvaWQgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUpIHsKLSAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgewotICAgICAgICBmbG9hdCBzYW1wbGUgPSAqc291cmNlKys7Ci0gICAgICAgIGludDE2X3Qgc2FtcGxlMTYgPSBjbGlwQW5kQ2xhbXBGbG9hdFRvUGNtMTYoc2FtcGxlLCBzY2FsZXIpOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTE2OwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTE2OwotICAgIH0KLX0KLQotdm9pZCBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbyhjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTIpIHsKLSAgICAvLyBkaXZpZGUgYnkgbnVtRnJhbWVzIHNvIHRoYXQgd2UgYWxtb3N0IHJlYWNoIGFtcGxpdHVkZTIKLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyBudW1GcmFtZXM7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBjb25zdCBmbG9hdCBzY2FsZXIgPSBhbXBsaXR1ZGUxICsgKGZyYW1lSW5kZXggKiBkZWx0YSk7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHNhbXBsZSA9ICpzb3VyY2UrKzsKLSAgICAgICAgaW50MTZfdCBzYW1wbGUxNiA9IGNsaXBBbmRDbGFtcEZsb2F0VG9QY20xNihzYW1wbGUsIHNjYWxlcik7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgfQotfQotCi12b2lkIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKSB7Ci0gICAgY29uc3QgZmxvYXQgc2NhbGVyID0gYW1wbGl0dWRlIC8gU0hPUlRfU0NBTEU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1GcmFtZXM7IGkrKykgewotICAgICAgICBmbG9hdCBzYW1wbGUgPSBzb3VyY2VbaV0gKiBzY2FsZXI7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZTsKLSAgICB9Ci19Ci0KLS8vIFRoaXMgY29kZSBhc3N1bWVzIGFtcGxpdHVkZTEgYW5kIGFtcGxpdHVkZTIgYXJlIGJldHdlZW4gMC4wIGFuZCAxLjAKLXZvaWQgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgY29uc3QgZmxvYXQgc2NhbGVyMSA9IGFtcGxpdHVkZTEgLyBTSE9SVF9TQ0FMRTsKLSAgICBjb25zdCBmbG9hdCBkZWx0YSA9IChhbXBsaXR1ZGUyIC0gYW1wbGl0dWRlMSkgLyAoU0hPUlRfU0NBTEUgKiAoZmxvYXQpIG51bUZyYW1lcyk7Ci0gICAgZm9yIChpbnQgZnJhbWVJbmRleCA9IDA7IGZyYW1lSW5kZXggPCBudW1GcmFtZXM7IGZyYW1lSW5kZXgrKykgewotICAgICAgICBmbG9hdCBzY2FsZXIgPSBzY2FsZXIxICsgKGZyYW1lSW5kZXggKiBkZWx0YSk7Ci0gICAgICAgIGZsb2F0IHNhbXBsZSA9IHNvdXJjZVtmcmFtZUluZGV4XSAqIHNjYWxlcjsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGU7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlOwotICAgIH0KLX0KLQotLy8gVGhpcyBjb2RlIGFzc3VtZXMgYW1wbGl0dWRlMSBhbmQgYW1wbGl0dWRlMiBhcmUgYmV0d2VlbiAwLjAgYW5kIDEuMAotdm9pZCBBQXVkaW9fbGluZWFyUmFtcE1vbm9Ub1N0ZXJlbyhjb25zdCBmbG9hdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgY29uc3QgZmxvYXQgZGVsdGEgPSAoYW1wbGl0dWRlMiAtIGFtcGxpdHVkZTEpIC8gbnVtRnJhbWVzOwotICAgIGZvciAoaW50IGZyYW1lSW5kZXggPSAwOyBmcmFtZUluZGV4IDwgbnVtRnJhbWVzOyBmcmFtZUluZGV4KyspIHsKLSAgICAgICAgZmxvYXQgc2FtcGxlID0gKnNvdXJjZSsrOwotCi0gICAgICAgIC8vIENsaXAgdG8gdmFsaWQgcmFuZ2Ugb2YgYSBmbG9hdCBzYW1wbGUgdG8gcHJldmVudCBleGNlc3NpdmUgdm9sdW1lLgotICAgICAgICBzYW1wbGUgPSBjbGlwVG9NaW5NYXhIZWFkcm9vbShzYW1wbGUpOwotCi0gICAgICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTEgKyAoZnJhbWVJbmRleCAqIGRlbHRhKTsKLSAgICAgICAgZmxvYXQgc2FtcGxlU2NhbGVkID0gc2FtcGxlICogc2NhbGVyOwotICAgICAgICAqZGVzdGluYXRpb24rKyA9IHNhbXBsZVNjYWxlZDsKLSAgICAgICAgKmRlc3RpbmF0aW9uKysgPSBzYW1wbGVTY2FsZWQ7Ci0gICAgfQotfQotCi0vLyBUaGlzIGNvZGUgYXNzdW1lcyBhbXBsaXR1ZGUxIGFuZCBhbXBsaXR1ZGUyIGFyZSBiZXR3ZWVuIDAuMCBhbmQgMS4wCi12b2lkIEFBdWRpb19saW5lYXJSYW1wTW9ub1RvU3RlcmVvKGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKSB7Ci0gICAgLy8gQmVjYXVzZSB3ZSBhcmUgY29udmVydGluZyBmcm9tIGludDE2IHRvIDFudDE2LCB3ZSBkbyBub3QgaGF2ZSB0byBzY2FsZSBieSAxLzMyNzY4LgotICAgIGNvbnN0IGZsb2F0IGRlbHRhID0gKGFtcGxpdHVkZTIgLSBhbXBsaXR1ZGUxKSAvIG51bUZyYW1lczsKLSAgICBmb3IgKGludCBmcmFtZUluZGV4ID0gMDsgZnJhbWVJbmRleCA8IG51bUZyYW1lczsgZnJhbWVJbmRleCsrKSB7Ci0gICAgICAgIGNvbnN0IGZsb2F0IHNjYWxlciA9IGFtcGxpdHVkZTEgKyAoZnJhbWVJbmRleCAqIGRlbHRhKTsKLSAgICAgICAgLy8gTm8gbmVlZCB0byBjbGlwIGJlY2F1c2UgaW50MTZfdCByYW5nZSBpcyBpbmhlcmVudGx5IGxpbWl0ZWQuCi0gICAgICAgIGNvbnN0IGZsb2F0IHNhbXBsZSA9ICAqc291cmNlKysgKiBzY2FsZXI7Ci0gICAgICAgIGludDE2X3Qgc2FtcGxlMTYgPSAoaW50MTZfdCkgcm91bmRmKHNhbXBsZSk7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgICAgICpkZXN0aW5hdGlvbisrID0gc2FtcGxlMTY7Ci0gICAgfQotfQotCi0vLyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi12b2lkIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OmNvbnZlcnQoCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgY29uc3QgRm9ybWF0dGVkRGF0YSAmZGVzdGluYXRpb24sCi0gICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgIGZsb2F0IGxldmVsVG8pIHsKLQotICAgIGlmIChzb3VyY2UuY2hhbm5lbENvdW50ID09IDEgJiYgZGVzdGluYXRpb24uY2hhbm5lbENvdW50ID09IDIpIHsKLSAgICAgICAgY29udmVydE1vbm9Ub1N0ZXJlbyhzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBXZSBvbmx5IHN1cHBvcnQgbW9ubyB0byBzdGVyZW8gY29udmVyc2lvbi4gT3RoZXJ3aXNlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KLSAgICAgICAgLy8gbXVzdCBtYXRjaC4KLSAgICAgICAgYXNzZXJ0KHNvdXJjZS5jaGFubmVsQ291bnQgPT0gZGVzdGluYXRpb24uY2hhbm5lbENvdW50KTsKLSAgICAgICAgY29udmVydENoYW5uZWxzTWF0Y2goc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgIH0KLX0KLQotdm9pZCBBQXVkaW9EYXRhQ29udmVydGVyOjpjb252ZXJ0TW9ub1RvU3RlcmVvKAotICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAotICAgICAgICBmbG9hdCBsZXZlbFRvKSB7Ci0KLSAgICAvLyBUaGUgZm9ybWF0cyBhcmUgdmFsaWRhdGVkIHdoZW4gdGhlIHN0cmVhbSBpcyBvcGVuZWQgc28gd2UgZG8gbm90IGhhdmUgdG8KLSAgICAvLyBjaGVjayBmb3IgaWxsZWdhbCBjb21iaW5hdGlvbnMgaGVyZS4KLSAgICBpZiAoc291cmNlLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgICAgICBBQXVkaW9fbGluZWFyUmFtcE1vbm9Ub1N0ZXJlbygKLSAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgIGlmIChsZXZlbEZyb20gIT0gbGV2ZWxUbykgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGZsb2F0ICopIHNvdXJjZS5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zvcm1hdE1vbm9Ub1N0ZXJlbygKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoc291cmNlLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCkgewotICAgICAgICAgICAgaWYgKGxldmVsRnJvbSAhPSBsZXZlbFRvKSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mb3JtYXRNb25vVG9TdGVyZW8oCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxGcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfZm9ybWF0TW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wTW9ub1RvU3RlcmVvKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIEFBdWRpb0RhdGFDb252ZXJ0ZXI6OmNvbnZlcnRDaGFubmVsc01hdGNoKAotICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZzb3VyY2UsCi0gICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgZmxvYXQgbGV2ZWxGcm9tLAotICAgICAgICBmbG9hdCBsZXZlbFRvKSB7Ci0gICAgY29uc3QgaW50MzJfdCBudW1TYW1wbGVzID0gbnVtRnJhbWVzICogc291cmNlLmNoYW5uZWxDb3VudDsKLQotICAgIC8vIFRoZSBmb3JtYXRzIGFyZSB2YWxpZGF0ZWQgd2hlbiB0aGUgc3RyZWFtIGlzIG9wZW5lZCBzbyB3ZSBkbyBub3QgaGF2ZSB0bwotICAgIC8vIGNoZWNrIGZvciBpbGxlZ2FsIGNvbWJpbmF0aW9ucyBoZXJlLgotICAgIGlmIChzb3VyY2UuZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGVzdGluYXRpb24uZm9ybWF0ID09IEFBVURJT19GT1JNQVRfUENNX0kxNikgewotICAgICAgICAgICAgaWYgKGxldmVsRnJvbSAhPSBsZXZlbFRvKSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgZmxvYXQgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaW50MTZfdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLmNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsRnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBQXVkaW9Db252ZXJ0X2Zsb2F0VG9QY20xNigKLSAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBmbG9hdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQxNl90ICopIGRlc3RpbmF0aW9uLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxUbyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHNvdXJjZS5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2KSB7Ci0gICAgICAgIGlmIChkZXN0aW5hdGlvbi5mb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgICAgIGlmIChsZXZlbEZyb20gIT0gbGV2ZWxUbykgewotICAgICAgICAgICAgICAgIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KAotICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IGludDE2X3QgKikgc291cmNlLmRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxvYXQgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS5jaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBsZXZlbFRvKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbG9hdCAqKSBkZXN0aW5hdGlvbi5kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGRlc3RpbmF0aW9uLmZvcm1hdCA9PSBBQVVESU9fRk9STUFUX1BDTV9JMTYpIHsKLSAgICAgICAgICAgIEFBdWRpb19saW5lYXJSYW1wKAotICAgICAgICAgICAgICAgICAgICAoY29uc3QgaW50MTZfdCAqKSBzb3VyY2UuZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKGludDE2X3QgKikgZGVzdGluYXRpb24uZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICBzb3VyY2UuY2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgIGxldmVsVG8pOwotICAgICAgICB9Ci0gICAgfQotfQotCiBzdGF0dXNfdCBBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZFN0YXR1cyhhYXVkaW9fcmVzdWx0X3QgcmVzdWx0KSB7CiAgICAgLy8gVGhpcyBjb3ZlcnMgdGhlIGNhc2UgZm9yIEFBVURJT19PSyBhbmQgZm9yIHBvc2l0aXZlIHJlc3VsdHMuCiAgICAgaWYgKHJlc3VsdCA+PSAwKSB7CkBAIC01MTMsNiArMTI1LDkgQEAKIGF1ZGlvX2Zvcm1hdF90IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChhYXVkaW9fZm9ybWF0X3QgYWF1ZGlvRm9ybWF0KSB7CiAgICAgYXVkaW9fZm9ybWF0X3QgYW5kcm9pZEZvcm1hdDsKICAgICBzd2l0Y2ggKGFhdWRpb0Zvcm1hdCkgeworICAgIGNhc2UgQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDoKKyAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOworICAgICAgICBicmVhazsKICAgICBjYXNlIEFBVURJT19GT1JNQVRfUENNX0kxNjoKICAgICAgICAgYW5kcm9pZEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogICAgICAgICBicmVhazsKQEAgLTUyMCwxNiArMTM1LDE5IEBACiAgICAgICAgIGFuZHJvaWRGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBhbmRyb2lkRm9ybWF0ID0gQVVESU9fRk9STUFUX0RFRkFVTFQ7Ci0gICAgICAgIEFMT0dFKCJBQXVkaW9Db252ZXJ0X2FhdWRpb1RvQW5kcm9pZERhdGFGb3JtYXQgMHglMDhYIHVucmVjb2duaXplZCIsIGFhdWRpb0Zvcm1hdCk7CisgICAgICAgIGFuZHJvaWRGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICAgICAgQUxPR0UoIiVzKCkgMHglMDhYIHVucmVjb2duaXplZCIsIF9fZnVuY19fLCBhYXVkaW9Gb3JtYXQpOwogICAgICAgICBicmVhazsKICAgICB9CiAgICAgcmV0dXJuIGFuZHJvaWRGb3JtYXQ7CiB9CiAKIGFhdWRpb19mb3JtYXRfdCBBQXVkaW9Db252ZXJ0X2FuZHJvaWRUb0FBdWRpb0RhdGFGb3JtYXQoYXVkaW9fZm9ybWF0X3QgYW5kcm9pZEZvcm1hdCkgewotICAgIGFhdWRpb19mb3JtYXRfdCBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgYWF1ZGlvX2Zvcm1hdF90IGFhdWRpb0Zvcm1hdDsKICAgICBzd2l0Y2ggKGFuZHJvaWRGb3JtYXQpIHsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9ERUZBVUxUOgorICAgICAgICBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1VOU1BFQ0lGSUVEOworICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgogICAgICAgICBhYXVkaW9Gb3JtYXQgPSBBQVVESU9fRk9STUFUX1BDTV9JMTY7CiAgICAgICAgIGJyZWFrOwpAQCAtNTM4LDcgKzE1Niw3IEBACiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIGFhdWRpb0Zvcm1hdCA9IEFBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICAgICAgQUxPR0UoIkFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdCAweCUwOFggdW5yZWNvZ25pemVkIiwgYW5kcm9pZEZvcm1hdCk7CisgICAgICAgIEFMT0dFKCIlcygpIDB4JTA4WCB1bnJlY29nbml6ZWQiLCBfX2Z1bmNfXywgYW5kcm9pZEZvcm1hdCk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICByZXR1cm4gYWF1ZGlvRm9ybWF0OwpAQCAtNTkzLDEyICsyMTEsMjkgQEAKICAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfUkVDT0dOSVRJT04gPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKTsKICAgICBTVEFUSUNfQVNTRVJUKEFBVURJT19JTlBVVF9QUkVTRVRfVk9JQ0VfQ09NTVVOSUNBVElPTiA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTik7CiAgICAgU1RBVElDX0FTU0VSVChBQVVESU9fSU5QVVRfUFJFU0VUX1VOUFJPQ0VTU0VEID09IEFVRElPX1NPVVJDRV9VTlBST0NFU1NFRCk7CisgICAgU1RBVElDX0FTU0VSVChBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1BFUkZPUk1BTkNFID09IEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRSk7CiAgICAgaWYgKHByZXNldCA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKICAgICAgICAgcHJlc2V0ID0gQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTjsKICAgICB9CiAgICAgcmV0dXJuIChhdWRpb19zb3VyY2VfdCkgcHJlc2V0OyAvLyBzYW1lIHZhbHVlCiB9CiAKK2F1ZGlvX2ZsYWdzX21hc2tfdCBBQXVkaW9Db252ZXJ0X2FsbG93Q2FwdHVyZVBvbGljeVRvQXVkaW9GbGFnc01hc2soCisgICAgICAgIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgcG9saWN5KSB7CisgICAgc3dpdGNoIChwb2xpY3kpIHsKKyAgICAgICAgY2FzZSBBQVVESU9fVU5TUEVDSUZJRUQ6CisgICAgICAgIGNhc2UgQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfQUxMOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0ZMQUdfTk9ORTsKKyAgICAgICAgY2FzZSBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9TWVNURU06CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19OT19NRURJQV9QUk9KRUNUSU9OOworICAgICAgICBjYXNlIEFBVURJT19BTExPV19DQVBUVVJFX0JZX05PTkU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fRkxBR19OT19NRURJQV9QUk9KRUNUSU9OIHwgQVVESU9fRkxBR19OT19TWVNURU1fQ0FQVFVSRTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlcygpIDB4JTA4WCB1bnJlY29nbml6ZWQiLCBfX2Z1bmNfXywgcG9saWN5KTsKKyAgICAgICAgICAgIHJldHVybiBBVURJT19GTEFHX05PTkU7IC8vCisgICAgfQorfQorCiBpbnQzMl90IEFBdWRpb0NvbnZlcnRfZnJhbWVzVG9CeXRlcyhpbnQzMl90IG51bUZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgYnl0ZXNQZXJGcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKnNpemVJbkJ5dGVzKSB7CkBAIC03MjEsNyArMzU2LDcgQEAKICAgICAgICAgY2FzZSBBQVVESU9fU1RSRUFNX1NUQVRFX0RJU0NPTk5FQ1RFRDoKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCJjYW4gb25seSBmbHVzaCBzdHJlYW0gd2hlbiBQQVVTRUQsIE9QRU4gb3IgU1RPUFBFRCwgc3RhdGUgPSAlcyIsCi0gICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFN0cmVhbVN0YXRlVG9UZXh0KHN0YXRlKSk7CisgICAgICAgICAgICAgICAgICBhYXVkaW86OkF1ZGlvR2xvYmFsX2NvbnZlcnRTdHJlYW1TdGF0ZVRvVGV4dChzdGF0ZSkpOwogICAgICAgICAgICAgcmVzdWx0ID0gIEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0FBdWRpb1V0aWxpdGllcy5oCmluZGV4IDRiOTc1ZTguLjc2ZDA0NTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9BQXVkaW9VdGlsaXRpZXMuaAorKysgYi9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgKQEAgLTQ1LDE1NiArNDUsNiBAQAogYXVkaW9fc2Vzc2lvbl90IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkU2Vzc2lvbklkKGFhdWRpb19zZXNzaW9uX2lkX3Qgc2Vzc2lvbklkKTsKIAogLyoqCi0gKiBDb252ZXJ0IGFuIGFycmF5IG9mIGZsb2F0cyB0byBhbiBhcnJheSBvZiBpbnQxNl90LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bVNhbXBsZXMgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGUgYXJyYXkKLSAqIEBwYXJhbSBhbXBsaXR1ZGUgbGV2ZWwgYmV0d2VlbiAwLjAgYW5kIDEuMAotICovCi12b2lkIEFBdWRpb0NvbnZlcnRfZmxvYXRUb1BjbTE2KGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSk7Ci0KLS8qKgotICogQ29udmVydCBmbG9hdHMgdG8gaW50MTZfdCBhbmQgc2NhbGUgYnkgYSBsaW5lYXIgcmFtcC4KLSAqCi0gKiBUaGUgcmFtcCBzdG9wcyBqdXN0IHNob3J0IG9mIHJlYWNoaW5nIGFtcGxpdHVkZTIgc28gdGhhdCB0aGUgbmV4dAotICogcmFtcCBjYW4gc3RhcnQgYXQgYW1wbGl0dWRlMiB3aXRob3V0IGNhdXNpbmcgYSBkaXNjb250aW51aXR5LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bUZyYW1lcwotICogQHBhcmFtIHNhbXBsZXNQZXJGcmFtZSBBS0EgbnVtYmVyIG9mIGNoYW5uZWxzCi0gKiBAcGFyYW0gYW1wbGl0dWRlMSBsZXZlbCBhdCBzdGFydCBvZiByYW1wLCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKiBAcGFyYW0gYW1wbGl0dWRlMiBsZXZlbCBwYXN0IGVuZCBvZiByYW1wLCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKi8KLXZvaWQgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoY29uc3QgZmxvYXQgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci0KLS8qKgotICogQ29udmVydCBpbnQxNl90IGFycmF5IHRvIGZsb2F0IGFycmF5IHJhbmdpbmcgZnJvbSAtMS4wIHRvICsxLjAuCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1TYW1wbGVzCi0gKi8KLS8vdm9pZCBBQXVkaW9Db252ZXJ0X3BjbTE2VG9GbG9hdChjb25zdCBpbnQxNl90ICpzb3VyY2UsIGludDMyX3QgbnVtU2FtcGxlcywKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24pOwotCi0vKioKLSAqCi0gKiBDb252ZXJ0IGludDE2X3QgYXJyYXkgdG8gZmxvYXQgYXJyYXkgcmFuZ2luZyBmcm9tICsvLSBhbXBsaXR1ZGUuCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1TYW1wbGVzCi0gKiBAcGFyYW0gYW1wbGl0dWRlCi0gKi8KLXZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKTsKLQotLyoqCi0gKiBDb252ZXJ0IGZsb2F0cyB0byBpbnQxNl90IGFuZCBzY2FsZSBieSBhIGxpbmVhciByYW1wLgotICoKLSAqIFRoZSByYW1wIHN0b3BzIGp1c3Qgc2hvcnQgb2YgcmVhY2hpbmcgYW1wbGl0dWRlMiBzbyB0aGF0IHRoZSBuZXh0Ci0gKiByYW1wIGNhbiBzdGFydCBhdCBhbXBsaXR1ZGUyIHdpdGhvdXQgY2F1c2luZyBhIGRpc2NvbnRpbnVpdHkuCi0gKgotICogQHBhcmFtIHNvdXJjZQotICogQHBhcmFtIGRlc3RpbmF0aW9uCi0gKiBAcGFyYW0gbnVtRnJhbWVzCi0gKiBAcGFyYW0gc2FtcGxlc1BlckZyYW1lIEFLQSBudW1iZXIgb2YgY2hhbm5lbHMKLSAqIEBwYXJhbSBhbXBsaXR1ZGUxIGxldmVsIGF0IHN0YXJ0IG9mIHJhbXAsIGJldHdlZW4gMC4wIGFuZCAxLjAKLSAqIEBwYXJhbSBhbXBsaXR1ZGUyIGxldmVsIGF0IGVuZCBvZiByYW1wLCBiZXR3ZWVuIDAuMCBhbmQgMS4wCi0gKi8KLXZvaWQgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZXNQZXJGcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci0KLS8qKgotICogU2NhbGUgZmxvYXRzIGJ5IGEgbGluZWFyIHJhbXAuCi0gKgotICogVGhlIHJhbXAgc3RvcHMganVzdCBzaG9ydCBvZiByZWFjaGluZyBhbXBsaXR1ZGUyIHNvIHRoYXQgdGhlIG5leHQKLSAqIHJhbXAgY2FuIHN0YXJ0IGF0IGFtcGxpdHVkZTIgd2l0aG91dCBjYXVzaW5nIGEgZGlzY29udGludWl0eS4KLSAqCi0gKiBAcGFyYW0gc291cmNlCi0gKiBAcGFyYW0gZGVzdGluYXRpb24KLSAqIEBwYXJhbSBudW1GcmFtZXMKLSAqIEBwYXJhbSBzYW1wbGVzUGVyRnJhbWUKLSAqIEBwYXJhbSBhbXBsaXR1ZGUxCi0gKiBAcGFyYW0gYW1wbGl0dWRlMgotICovCi12b2lkIEFBdWRpb19saW5lYXJSYW1wKGNvbnN0IGZsb2F0ICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKTsKLQotLyoqCi0gKiBTY2FsZSBpbnQxNl90J3MgYnkgYSBsaW5lYXIgcmFtcC4KLSAqCi0gKiBUaGUgcmFtcCBzdG9wcyBqdXN0IHNob3J0IG9mIHJlYWNoaW5nIGFtcGxpdHVkZTIgc28gdGhhdCB0aGUgbmV4dAotICogcmFtcCBjYW4gc3RhcnQgYXQgYW1wbGl0dWRlMiB3aXRob3V0IGNhdXNpbmcgYSBkaXNjb250aW51aXR5LgotICoKLSAqIEBwYXJhbSBzb3VyY2UKLSAqIEBwYXJhbSBkZXN0aW5hdGlvbgotICogQHBhcmFtIG51bUZyYW1lcwotICogQHBhcmFtIHNhbXBsZXNQZXJGcmFtZQotICogQHBhcmFtIGFtcGxpdHVkZTEKLSAqIEBwYXJhbSBhbXBsaXR1ZGUyCi0gKi8KLXZvaWQgQUF1ZGlvX2xpbmVhclJhbXAoY29uc3QgaW50MTZfdCAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUxLAotICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBhbXBsaXR1ZGUyKTsKLQotY2xhc3MgQUF1ZGlvRGF0YUNvbnZlcnRlciB7Ci1wdWJsaWM6Ci0KLSAgICBzdHJ1Y3QgRm9ybWF0dGVkRGF0YSB7Ci0KLSAgICAgICAgRm9ybWF0dGVkRGF0YSh2b2lkICpkYXRhLCBhYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBpbnQzMl90IGNoYW5uZWxDb3VudCkKLSAgICAgICAgICAgIDogZGF0YShkYXRhKQotICAgICAgICAgICAgLCBmb3JtYXQoZm9ybWF0KQotICAgICAgICAgICAgLCBjaGFubmVsQ291bnQoY2hhbm5lbENvdW50KSB7fQotCi0gICAgICAgIGNvbnN0IHZvaWQgICAgICAgICAgICAqZGF0YSA9IG51bGxwdHI7Ci0gICAgICAgIGNvbnN0IGFhdWRpb19mb3JtYXRfdCAgZm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRDsKLSAgICAgICAgY29uc3QgaW50MzJfdCAgICAgICAgICBjaGFubmVsQ291bnQgPSAxOwotICAgIH07Ci0KLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0KGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbFRvKTsKLQotcHJpdmF0ZToKLSAgICBzdGF0aWMgdm9pZCBjb252ZXJ0TW9ub1RvU3RlcmVvKGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdHRlZERhdGEgJmRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1GcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbFRvKTsKLQotICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRDaGFubmVsc01hdGNoKGNvbnN0IEZvcm1hdHRlZERhdGEgJnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXR0ZWREYXRhICZkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBsZXZlbEZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgbGV2ZWxUbyk7Ci19OwotCi0vKioKICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFuZCBwcmV2ZW50IG51bWVyaWMgb3ZlcmZsb3cuCiAgKiBUaGUgKnNpemVJbkJ5dGVzIHdpbGwgYmUgc2V0IHRvIHplcm8gaWYgdGhlcmUgaXMgYW4gZXJyb3IuCiAgKgpAQCAtMjM1LDEwICs4NSwxMiBAQAogYXVkaW9fc291cmNlX3QgQUF1ZGlvQ29udmVydF9pbnB1dFByZXNldFRvQXVkaW9Tb3VyY2UoYWF1ZGlvX2lucHV0X3ByZXNldF90IHByZXNldCk7CiAKIC8qKgotICogQHJldHVybiB0aGUgc2l6ZSBvZiBhIHNhbXBsZSBvZiB0aGUgZ2l2ZW4gZm9ybWF0IGluIGJ5dGVzIG9yIEFBVURJT19FUlJPUl9JTExFR0FMX0FSR1VNRU5UCisgKiBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB2YWxpZGF0ZSB0aGUgcGFzc2VkIGluIHZhbHVlLgorICogVGhhdCBpcyBkb25lIHNvbWV3aGVyZSBlbHNlLgorICogQHJldHVybiBpbnRlcm5hbCBhdWRpbyBmbGFncyBtYXNrCiAgKi8KLWludDMyX3QgQUF1ZGlvQ29udmVydF9mb3JtYXRUb1NpemVJbkJ5dGVzKGFhdWRpb19mb3JtYXRfdCBmb3JtYXQpOwotCithdWRpb19mbGFnc19tYXNrX3QgQUF1ZGlvQ29udmVydF9hbGxvd0NhcHR1cmVQb2xpY3lUb0F1ZGlvRmxhZ3NNYXNrKAorICAgICAgICBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV90IHBvbGljeSk7CiAKIC8vIE5vdGUgdGhhdCB0aGlzIGNvZGUgbWF5IGJlIHJlcGxhY2VkIGJ5IFNldHRpbmdzIG9yIGJ5IHNvbWUgb3RoZXIgc3lzdGVtIGNvbmZpZ3VyYXRpb24gdG9vbC4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0xpbmVhclJhbXAuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0xpbmVhclJhbXAuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzE0YmJmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9MaW5lYXJSYW1wLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJMaW5lYXJSYW1wLmgiCi0KLWJvb2wgTGluZWFyUmFtcDo6aXNSYW1waW5nKCkgewotICAgIGZsb2F0IHRhcmdldCA9IG1UYXJnZXQubG9hZCgpOwotICAgIGlmICh0YXJnZXQgIT0gbUxldmVsVG8pIHsKLSAgICAgICAgLy8gVXBkYXRlIHRhcmdldC4gQ29udGludWUgZnJvbSBwcmV2aW91cyBsZXZlbC4KLSAgICAgICAgbUxldmVsVG8gPSB0YXJnZXQ7Ci0gICAgICAgIG1SZW1haW5pbmcgPSBtTGVuZ3RoSW5GcmFtZXM7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtUmVtYWluaW5nID4gMDsKLSAgICB9Ci19Ci0KLWJvb2wgTGluZWFyUmFtcDo6bmV4dFNlZ21lbnQoaW50MzJfdCBmcmFtZXMsIGZsb2F0ICpsZXZlbEZyb20sIGZsb2F0ICpsZXZlbFRvKSB7Ci0gICAgYm9vbCByYW1waW5nID0gaXNSYW1waW5nKCk7Ci0gICAgKmxldmVsRnJvbSA9IG1MZXZlbEZyb207Ci0gICAgaWYgKHJhbXBpbmcpIHsKLSAgICAgICAgZmxvYXQgbGV2ZWw7Ci0gICAgICAgIGlmIChmcmFtZXMgPj0gbVJlbWFpbmluZykgewotICAgICAgICAgICAgbGV2ZWwgPSBtTGV2ZWxUbzsKLSAgICAgICAgICAgIG1SZW1haW5pbmcgPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gSW50ZXJwb2xhdGUgdG8gYSBwb2ludCBhbG9uZyB0aGUgZnVsbCByYW1wLgotICAgICAgICAgICAgbGV2ZWwgPSBtTGV2ZWxGcm9tICsgKGZyYW1lcyAqIChtTGV2ZWxUbyAtIG1MZXZlbEZyb20pIC8gbVJlbWFpbmluZyk7Ci0gICAgICAgICAgICBtUmVtYWluaW5nIC09IGZyYW1lczsKLSAgICAgICAgfQotICAgICAgICBtTGV2ZWxGcm9tID0gbGV2ZWw7IC8vIGZvciBuZXh0IHJhbXAKLSAgICAgICAgKmxldmVsVG8gPSBsZXZlbDsKLSAgICB9IGVsc2UgewotICAgICAgICAqbGV2ZWxUbyA9IG1MZXZlbFRvOwotICAgIH0KLSAgICByZXR1cm4gcmFtcGluZzsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L0xpbmVhclJhbXAuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIxYjhlMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTGluZWFyUmFtcC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBQVVESU9fTElORUFSX1JBTVBfSAotI2RlZmluZSBBQVVESU9fTElORUFSX1JBTVBfSAotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPHN0ZGludC5oPgotCi0vKioKLSAqIEdlbmVyYXRlIHNlZ21lbnRzIGFsb25nIGEgbGluZWFyIHJhbXAuCi0gKiBUaGUgcmFtcCB0YXJnZXQgY2FuIGJlIHVwZGF0ZWQgZnJvbSBhbm90aGVyIHRocmVhZC4KLSAqIFdoZW4gdGhlIHRhcmdldCBpcyB1cGRhdGVkLCBhIG5ldyByYW1wIGlzIHN0YXJ0ZWQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbi4KLSAqCi0gKiBUaGUgZmlyc3QgcmFtcCBzdGFydHMgYXQgMC4wLgotICoKLSAqLwotY2xhc3MgTGluZWFyUmFtcCB7Ci1wdWJsaWM6Ci0gICAgTGluZWFyUmFtcCgpIHsKLSAgICAgICAgbVRhcmdldC5zdG9yZSgxLjBmKTsKLSAgICB9Ci0KLSAgICB2b2lkIHNldExlbmd0aEluRnJhbWVzKGludDMyX3QgZnJhbWVzKSB7Ci0gICAgICAgIG1MZW5ndGhJbkZyYW1lcyA9IGZyYW1lczsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGdldExlbmd0aEluRnJhbWVzKCkgewotICAgICAgICByZXR1cm4gbUxlbmd0aEluRnJhbWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWF5IGJlIGNhbGxlZCBieSBhbm90aGVyIHRocmVhZC4KLSAgICAgKiBAcGFyYW0gdGFyZ2V0Ci0gICAgICovCi0gICAgdm9pZCBzZXRUYXJnZXQoZmxvYXQgdGFyZ2V0KSB7Ci0gICAgICAgIG1UYXJnZXQuc3RvcmUodGFyZ2V0KTsKLSAgICB9Ci0KLSAgICBmbG9hdCBnZXRUYXJnZXQoKSB7Ci0gICAgICAgIHJldHVybiBtVGFyZ2V0LmxvYWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3JjZSB0aGUgbmV4dFNlZ21lbnQgdG8gc3RhcnQgZnJvbSB0aGlzIGxldmVsLgotICAgICAqCi0gICAgICogV0FSTklORzogdGhpcyBjYW4gY2F1c2UgYSBkaXNjb250aW51aXR5IGlmIGNhbGxlZCB3aGlsZSB0aGUgcmFtcCBpcyBiZWluZyB1c2VkLgotICAgICAqIE9ubHkgY2FsbCB0aGlzIHdoZW4gc2V0dGluZyB0aGUgaW5pdGlhbCByYW1wLgotICAgICAqCi0gICAgICogQHBhcmFtIGxldmVsCi0gICAgICovCi0gICAgdm9pZCBmb3JjZUN1cnJlbnQoZmxvYXQgbGV2ZWwpIHsKLSAgICAgICAgbUxldmVsRnJvbSA9IGxldmVsOwotICAgICAgICBtTGV2ZWxUbyA9IGxldmVsOyAvLyBmb3JjZXMgYSByYW1wIGlmIGl0IGRvZXMgbm90IG1hdGNoIHRhcmdldAotICAgIH0KLQotICAgIGZsb2F0IGdldEN1cnJlbnQoKSB7Ci0gICAgICAgIHJldHVybiBtTGV2ZWxGcm9tOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCBsZXZlbHMgZm9yIG5leHQgcmFtcCBzZWdtZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGZyYW1lcyBudW1iZXIgb2YgZnJhbWVzIGluIHRoZSBzZWdtZW50Ci0gICAgICogQHBhcmFtIGxldmVsRnJvbSBwb2ludGVyIHRvIHN0YXJ0aW5nIGFtcGxpdHVkZQotICAgICAqIEBwYXJhbSBsZXZlbFRvIHBvaW50ZXIgdG8gZW5kaW5nIGFtcGxpdHVkZQotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiByYW1wIGlzIHN0aWxsIG1vdmluZyB0b3dhcmRzIHRoZSB0YXJnZXQKLSAgICAgKi8KLSAgICBib29sIG5leHRTZWdtZW50KGludDMyX3QgZnJhbWVzLCBmbG9hdCAqbGV2ZWxGcm9tLCBmbG9hdCAqbGV2ZWxUbyk7Ci0KLXByaXZhdGU6Ci0KLSAgICBib29sIGlzUmFtcGluZygpOwotCi0gICAgc3RkOjphdG9taWM8ZmxvYXQ+ICAgbVRhcmdldDsKLQotICAgIGludDMyX3QgbUxlbmd0aEluRnJhbWVzICA9IDQ4MDAwIC8gMTAwOyAvLyAxMCBtc2VjIGF0IDQ4MDAwIEh6Ci0gICAgaW50MzJfdCBtUmVtYWluaW5nICAgICAgID0gMDsKLSAgICBmbG9hdCAgIG1MZXZlbEZyb20gICAgICAgPSAwLjBmOwotICAgIGZsb2F0ICAgbUxldmVsVG8gICAgICAgICA9IDAuMGY7Ci19OwotCi0KLSNlbmRpZiAvL0FBVURJT19MSU5FQVJfUkFNUF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oIGIvbWVkaWEvbGliYWF1ZGlvL3NyYy91dGlsaXR5L01vbm90b25pY0NvdW50ZXIuaAppbmRleCA1ODMzZWFiLi42M2FkZDRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vc3JjL3V0aWxpdHkvTW9ub3RvbmljQ291bnRlci5oCisrKyBiL21lZGlhL2xpYmFhdWRpby9zcmMvdXRpbGl0eS9Nb25vdG9uaWNDb3VudGVyLmgKQEAgLTQxLDEwICs0MSwxMiBAQAogICAgIH0KIAogICAgIC8qKgotICAgICAqIHNldCB0aGUgY3VycmVudCB2YWx1ZSBvZiB0aGUgY291bnRlcgorICAgICAqIGFkdmFuY2UgdGhlIGN1cnJlbnQgdmFsdWUgdG8gbWF0Y2ggdGhlIGNvdW50ZXIKICAgICAgKi8KLSAgICB2b2lkIHNldChpbnQ2NF90IGNvdW50ZXIpIHsKLSAgICAgICAgbUNvdW50ZXI2NCA9IGNvdW50ZXI7CisgICAgdm9pZCBjYXRjaFVwVG8oaW50NjRfdCBjb3VudGVyKSB7CisgICAgICAgIGlmICgoY291bnRlciAtIG1Db3VudGVyNjQpID4gMCkgeworICAgICAgICAgICAgbUNvdW50ZXI2NCA9IGNvdW50ZXI7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvKioKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggNjgxOTRkYi4uMTljZDBhMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTExLDcgKzExLDcgQEAKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3RfbWFyc2hhbGxpbmcuY3BwIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJhYXVkaW9faW50ZXJuYWwiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJ1dGlscyIsCkBAIC0xOSwxMCArMTksMjIgQEAKIH0KIAogY2NfdGVzdCB7CisgICAgbmFtZTogInRlc3RfY2xvY2tfbW9kZWwiLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9jbG9ja19tb2RlbC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvX2ludGVybmFsIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKICAgICBuYW1lOiAidGVzdF9ibG9ja19hZGFwdGVyIiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3RfYmxvY2tfYWRhcHRlci5jcHAiXSwKLSAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW9faW50ZXJuYWwiXSwKIH0KIAogY2NfdGVzdCB7CkBAIC0zNCwxMyArNDYsNiBAQAogfQogCiBjY190ZXN0IHsKLSAgICBuYW1lOiAidGVzdF9saW5lYXJfcmFtcCIsCi0gICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCi0gICAgc3JjczogWyJ0ZXN0X2xpbmVhcl9yYW1wLmNwcCJdLAotICAgIHNoYXJlZF9saWJzOiBbImxpYmFhdWRpbyJdLAotfQotCi1jY190ZXN0IHsKICAgICBuYW1lOiAidGVzdF9vcGVuX3BhcmFtcyIsCiAgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X29wZW5fcGFyYW1zLmNwcCJdLApAQCAtMTY1LDUgKzE3MCw0OCBAQAogICAgIG5hbWU6ICJ0ZXN0X2F0b21pY19maWZvIiwKICAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3RfYXRvbWljX2ZpZm8uY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsibGliYWF1ZGlvX2ludGVybmFsIl0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X2Zsb3dncmFwaCIsCisgICAgZGVmYXVsdHM6IFsibGliYWF1ZGlvX3Rlc3RzX2RlZmF1bHRzIl0sCisgICAgc3JjczogWyJ0ZXN0X2Zsb3dncmFwaC5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYWF1ZGlvX2ludGVybmFsIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJ0ZXN0X3JldHVybl9zdG9wIiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3RfcmV0dXJuX3N0b3AuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9zdG9wX2hhbmciLAorICAgIGRlZmF1bHRzOiBbImxpYmFhdWRpb190ZXN0c19kZWZhdWx0cyJdLAorICAgIHNyY3M6IFsidGVzdF9zdG9wX2hhbmcuY3BwIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmFhdWRpbyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAidGVzdF9mdWxsX3F1ZXVlIiwKKyAgICBkZWZhdWx0czogWyJsaWJhYXVkaW9fdGVzdHNfZGVmYXVsdHMiXSwKKyAgICBzcmNzOiBbInRlc3RfZnVsbF9xdWV1ZS5jcHAiXSwKICAgICBzaGFyZWRfbGliczogWyJsaWJhYXVkaW8iXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0b21pY19maWZvLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0b21pY19maWZvLmNwcAppbmRleCAwZWRmZWJlLi4xMzBlZjQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9hdG9taWNfZmlmby5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXRvbWljX2ZpZm8uY3BwCkBAIC0xNTgsMTQgKzE1OCwxNCBAQAogICAgICAgICAvLyBEb2VzIHRoZSBzdW0gb2YgdGhlIHR3byBwYXJ0cyBtYXRjaCB0aGUgYXZhaWxhYmxlIHZhbHVlIHJldHVybmVkPwogICAgICAgICAvLyBGb3IgRW1wdHlSb29tCiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzQXZhaWxhYmxlID0KLSAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGaWZvQ29udHJvbGxlckJhc2UoKS0+Z2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICBmaWZvX2ZyYW1lc190IHdyYXBBdmFpbGFibGUgPSBtRmlmb0J1ZmZlci5nZXRFbXB0eVJvb21BdmFpbGFibGUoJndyYXBwaW5nQnVmZmVyKTsKICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc0F2YWlsYWJsZSwgd3JhcEF2YWlsYWJsZSk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgYm90aEF2YWlsYWJsZSA9IHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1swXSArIHdyYXBwaW5nQnVmZmVyLm51bUZyYW1lc1sxXTsKICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc0F2YWlsYWJsZSwgYm90aEF2YWlsYWJsZSk7CiAgICAgICAgIC8vIEZvciBGdWxsRGF0YQogICAgICAgICBmcmFtZXNBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICB3cmFwQXZhaWxhYmxlID0gbUZpZm9CdWZmZXIuZ2V0RnVsbERhdGFBdmFpbGFibGUoJndyYXBwaW5nQnVmZmVyKTsKICAgICAgICAgRVhQRUNUX0VRKGZyYW1lc0F2YWlsYWJsZSwgd3JhcEF2YWlsYWJsZSk7CiAgICAgICAgIGJvdGhBdmFpbGFibGUgPSB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMF0gKyB3cmFwcGluZ0J1ZmZlci5udW1GcmFtZXNbMV07CkBAIC0xOTgsNyArMTk4LDcgQEAKICAgICAvLyBXcml0ZSBkYXRhIGJ1dCBkbyBub3Qgb3ZlcmZsb3cuCiAgICAgdm9pZCB3cml0ZU11bHRpcGxlRGF0YUZyYW1lcyhmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgewogICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9Ci0gICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RW1wdHlGcmFtZXNBdmFpbGFibGUoKTsKICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNUb1dyaXRlID0gc3RkOjptaW4oZnJhbWVzQXZhaWxhYmxlLCBudW1GcmFtZXMpOwogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lc1RvV3JpdGU7IGkrKykgewogICAgICAgICAgICAgbURhdGFbaV0gPSBtTmV4dFdyaXRlSW5kZXgrKzsKQEAgLTIxMCw3ICsyMTAsNyBAQAogICAgIC8vIFJlYWQgd2hhdGV2ZXIgZGF0YSBpcyBhdmFpbGFibGUsIERvIG5vdCB1bmRlcmZsb3cuCiAgICAgdm9pZCB2ZXJpZnlNdWx0aXBsZURhdGFGcmFtZXMoZmlmb19mcmFtZXNfdCBudW1GcmFtZXMpIHsKICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNBdmFpbGFibGUgPQotICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc1RvUmVhZCA9IHN0ZDo6bWluKGZyYW1lc0F2YWlsYWJsZSwgbnVtRnJhbWVzKTsKICAgICAgICAgZmlmb19mcmFtZXNfdCBhY3R1YWwgPSBtRmlmb0J1ZmZlci5yZWFkKG1EYXRhLCBmcmFtZXNUb1JlYWQpOwogICAgICAgICBBU1NFUlRfRVEoZnJhbWVzVG9SZWFkLCBhY3R1YWwpOwpAQCAtMjIyLDcgKzIyMiw3IEBACiAgICAgLy8gUmVhZCBzcGVjaWZpZWQgbnVtYmVyIG9mIGZyYW1lcwogICAgIHZvaWQgdmVyaWZ5UmVxdWVzdGVkRGF0YShmaWZvX2ZyYW1lc190IG51bUZyYW1lcykgewogICAgICAgICBmaWZvX2ZyYW1lc190IGZyYW1lc0F2YWlsYWJsZSA9Ci0gICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRGdWxsRnJhbWVzQXZhaWxhYmxlKCk7CiAgICAgICAgIEFTU0VSVF9MRShudW1GcmFtZXMsIGZyYW1lc0F2YWlsYWJsZSk7CiAgICAgICAgIGZpZm9fZnJhbWVzX3QgZnJhbWVzVG9SZWFkID0gc3RkOjptaW4oZnJhbWVzQXZhaWxhYmxlLCBudW1GcmFtZXMpOwogICAgICAgICBmaWZvX2ZyYW1lc190IGFjdHVhbCA9IG1GaWZvQnVmZmVyLnJlYWQobURhdGEsIGZyYW1lc1RvUmVhZCk7CkBAIC0yODIsMTIgKzI4MiwxMiBAQAogICAgIHZvaWQgY2hlY2tSYW5kb21Xcml0ZVJlYWQoKSB7CiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjA7IGkrKykgewogICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNFbXB0eSA9Ci0gICAgICAgICAgICAgICAgICAgIG1GaWZvQnVmZmVyLmdldEZpZm9Db250cm9sbGVyQmFzZSgpLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgICAgICBtRmlmb0J1ZmZlci5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBudW1GcmFtZXMgPSAoZmlmb19mcmFtZXNfdCkoZHJhbmQ0OCgpICogZnJhbWVzRW1wdHkpOwogICAgICAgICAgICAgd3JpdGVNdWx0aXBsZURhdGFGcmFtZXMobnVtRnJhbWVzKTsKIAogICAgICAgICAgICAgZmlmb19mcmFtZXNfdCBmcmFtZXNGdWxsID0KLSAgICAgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEZ1bGxGcmFtZXNBdmFpbGFibGUoKTsKKyAgICAgICAgICAgICAgICAgICAgbUZpZm9CdWZmZXIuZ2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOwogICAgICAgICAgICAgbnVtRnJhbWVzID0gKGZpZm9fZnJhbWVzX3QpKGRyYW5kNDgoKSAqIGZyYW1lc0Z1bGwpOwogICAgICAgICAgICAgdmVyaWZ5TXVsdGlwbGVEYXRhRnJhbWVzKG51bUZyYW1lcyk7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2F0dHJpYnV0ZXMuY3BwIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXR0cmlidXRlcy5jcHAKaW5kZXggYjAxYWYyNS4uMzJlZTJhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXR0cmlidXRlcy5jcHAKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfYXR0cmlidXRlcy5jcHAKQEAgLTMyLDYgKzMyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fdXNhZ2VfdCB1c2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fY29udGVudF90eXBlX3QgY29udGVudFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX2lucHV0X3ByZXNldF90IHByZXNldCA9IERPTlRfU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgY2FwdHVyZVBvbGljeSA9IERPTlRfU0VULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19kaXJlY3Rpb25fdCBkaXJlY3Rpb24gPSBBQVVESU9fRElSRUNUSU9OX09VVFBVVCkgewogCiAgICAgZmxvYXQgKmJ1ZmZlciA9IG5ldyBmbG9hdFtrTnVtRnJhbWVzICoga0NoYW5uZWxDb3VudF07CkBAIC01Niw2ICs1Nyw5IEBACiAgICAgaWYgKHByZXNldCAhPSBET05UX1NFVCkgewogICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldElucHV0UHJlc2V0KGFhdWRpb0J1aWxkZXIsIHByZXNldCk7CiAgICAgfQorICAgIGlmIChjYXB0dXJlUG9saWN5ICE9IERPTlRfU0VUKSB7CisgICAgICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0QWxsb3dlZENhcHR1cmVQb2xpY3koYWF1ZGlvQnVpbGRlciwgY2FwdHVyZVBvbGljeSk7CisgICAgfQogCiAgICAgLy8gQ3JlYXRlIGFuIEFBdWRpb1N0cmVhbSB1c2luZyB0aGUgQnVpbGRlci4KICAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oYWF1ZGlvQnVpbGRlciwgJmFhdWRpb1N0cmVhbSkpOwpAQCAtODAsNiArODQsMTIgQEAKICAgICAgICAgICAgIDogcHJlc2V0OwogICAgIEVYUEVDVF9FUShleHBlY3RlZFByZXNldCwgQUF1ZGlvU3RyZWFtX2dldElucHV0UHJlc2V0KGFhdWRpb1N0cmVhbSkpOwogCisgICAgYWF1ZGlvX2FsbG93ZWRfY2FwdHVyZV9wb2xpY3lfdCBleHBlY3RlZENhcHR1cmVQb2xpY3kgPQorICAgICAgICAgICAgKGNhcHR1cmVQb2xpY3kgPT0gRE9OVF9TRVQgfHwgY2FwdHVyZVBvbGljeSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpCisgICAgICAgICAgICA/IEFBVURJT19BTExPV19DQVBUVVJFX0JZX0FMTCAvLyBkZWZhdWx0CisgICAgICAgICAgICA6IHByZXNldDsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRDYXB0dXJlUG9saWN5LCBBQXVkaW9TdHJlYW1fZ2V0QWxsb3dlZENhcHR1cmVQb2xpY3koYWF1ZGlvU3RyZWFtKSk7CisKICAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KGFhdWRpb1N0cmVhbSkpOwogCiAgICAgaWYgKGRpcmVjdGlvbiA9PSBBQVVESU9fRElSRUNUSU9OX0lOUFVUKSB7CkBAIC0xMzAsNiArMTQwLDE1IEBACiAgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9WT0lDRV9SRUNPR05JVElPTiwKICAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX0NPTU1VTklDQVRJT04sCiAgICAgQUFVRElPX0lOUFVUX1BSRVNFVF9VTlBST0NFU1NFRCwKKyAgICBBQVVESU9fSU5QVVRfUFJFU0VUX1ZPSUNFX1BFUkZPUk1BTkNFLAorfTsKKworc3RhdGljIGNvbnN0IGFhdWRpb19pbnB1dF9wcmVzZXRfdCBzQWxsb3dDYXB0dXJlUG9saWNpZXNbXSA9IHsKKyAgICBET05UX1NFVCwKKyAgICBBQVVESU9fVU5TUEVDSUZJRUQsCisgICAgQUFVRElPX0FMTE9XX0NBUFRVUkVfQllfQUxMLAorICAgIEFBVURJT19BTExPV19DQVBUVVJFX0JZX1NZU1RFTSwKKyAgICBBQVVESU9fQUxMT1dfQ0FQVFVSRV9CWV9OT05FLAogfTsKIAogc3RhdGljIHZvaWQgY2hlY2tBdHRyaWJ1dGVzVXNhZ2UoYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBwZXJmTW9kZSkgewpAQCAtMTM4LDcgKzE1Nyw3IEBACiAgICAgfQogfQogCi1zdGF0aWMgdm9pZCBjaGVja0F0dHJpYnV0ZXNDb250ZW50VHlwZShhYXVkaW9faW5wdXRfcHJlc2V0X3QgcGVyZk1vZGUpIHsKK3N0YXRpYyB2b2lkIGNoZWNrQXR0cmlidXRlc0NvbnRlbnRUeXBlKGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUpIHsKICAgICBmb3IgKGFhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZSA6IHNDb250ZW50eXBlcykgewogICAgICAgICBjaGVja0F0dHJpYnV0ZXMocGVyZk1vZGUsIERPTlRfU0VULCBjb250ZW50VHlwZSk7CiAgICAgfQpAQCAtMTUwLDYgKzE2OSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgRE9OVF9TRVQsCiAgICAgICAgICAgICAgICAgICAgICAgICBET05UX1NFVCwKICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0UHJlc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgRE9OVF9TRVQsCisgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fRElSRUNUSU9OX0lOUFVUKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIGNoZWNrQXR0cmlidXRlc0FsbG93ZWRDYXB0dXJlUG9saWN5KGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUpIHsKKyAgICBmb3IgKGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3QgcG9saWN5IDogc0FsbG93Q2FwdHVyZVBvbGljaWVzKSB7CisgICAgICAgIGNoZWNrQXR0cmlidXRlcyhwZXJmTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERPTlRfU0VULAorICAgICAgICAgICAgICAgICAgICAgICAgRE9OVF9TRVQsCisgICAgICAgICAgICAgICAgICAgICAgICBET05UX1NFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBvbGljeSwKICAgICAgICAgICAgICAgICAgICAgICAgIEFBVURJT19ESVJFQ1RJT05fSU5QVVQpOwogICAgIH0KIH0KQEAgLTE2Niw2ICsxOTcsMTAgQEAKICAgICBjaGVja0F0dHJpYnV0ZXNJbnB1dFByZXNldChBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FKTsKIH0KIAorVEVTVCh0ZXN0X2F0dHJpYnV0ZXMsIGFhdWRpb19hbGxvd2VkX2NhcHR1cmVfcG9saWN5X3BlcmZub25lKSB7CisgICAgY2hlY2tBdHRyaWJ1dGVzQWxsb3dlZENhcHR1cmVQb2xpY3koQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSk7Cit9CisKIFRFU1QodGVzdF9hdHRyaWJ1dGVzLCBhYXVkaW9fdXNhZ2VfbG93bGF0KSB7CiAgICAgY2hlY2tBdHRyaWJ1dGVzVXNhZ2UoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpOwogfQpAQCAtMTc3LDMgKzIxMiw3IEBACiBURVNUKHRlc3RfYXR0cmlidXRlcywgYWF1ZGlvX2lucHV0X3ByZXNldF9sb3dsYXQpIHsKICAgICBjaGVja0F0dHJpYnV0ZXNJbnB1dFByZXNldChBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSk7CiB9CisKK1RFU1QodGVzdF9hdHRyaWJ1dGVzLCBhYXVkaW9fYWxsb3dlZF9jYXB0dXJlX3BvbGljeV9sb3dsYXQpIHsKKyAgICBjaGVja0F0dHJpYnV0ZXNBbGxvd2VkQ2FwdHVyZVBvbGljeShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9jbG9ja19tb2RlbC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9jbG9ja19tb2RlbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3YWJiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Nsb2NrX21vZGVsLmNwcApAQCAtMCwwICsxLDE2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFVuaXQgdGVzdHMgZm9yIElzb2Nocm9ub3VzIENsb2NrIE1vZGVsCisKKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKworI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgorI2luY2x1ZGUgPGNsaWVudC9Jc29jaHJvbm91c0Nsb2NrTW9kZWwuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCit1c2luZyBuYW1lc3BhY2UgYWF1ZGlvOworCisvLyBXZSBjYW4gdXNlIGFyYml0cmFyeSB2YWx1ZXMgaGVyZSBiZWNhdXNlIHdlIGFyZSBub3Qgb3BlbmluZyBhIHJlYWwgYXVkaW8gc3RyZWFtLgorI2RlZmluZSBTQU1QTEVfUkFURSAgICAgICAgICAgICA0ODAwMAorI2RlZmluZSBIV19GUkFNRVNfUEVSX0JVUlNUICAgICA0OAorI2RlZmluZSBOQU5PU19QRVJfQlVSU1QgICAgICAgICAoTkFOT1NfUEVSX1NFQ09ORCAqIEhXX0ZSQU1FU19QRVJfQlVSU1QgLyBTQU1QTEVfUkFURSkKKworY2xhc3MgQ2xvY2tNb2RlbFRlc3RGaXh0dXJlOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKK3B1YmxpYzoKKyAgICBDbG9ja01vZGVsVGVzdEZpeHR1cmUoKSB7CisgICAgfQorCisgICAgdm9pZCBTZXRVcCgpIHsKKyAgICAgICAgbW9kZWwuc2V0U2FtcGxlUmF0ZShTQU1QTEVfUkFURSk7CisgICAgICAgIG1vZGVsLnNldEZyYW1lc1BlckJ1cnN0KEhXX0ZSQU1FU19QRVJfQlVSU1QpOworICAgIH0KKworICAgIHZvaWQgVGVhckRvd24oKSB7CisgICAgfQorCisgICAgfkNsb2NrTW9kZWxUZXN0Rml4dHVyZSgpICB7CisgICAgICAgIC8vIGNsZWFudXAgYW55IHBlbmRpbmcgc3R1ZmYsIGJ1dCBubyBleGNlcHRpb25zIGFsbG93ZWQKKyAgICB9CisKKyAgICAvLyBUZXN0IHByb2Nlc3Npbmcgb2YgdGltZXN0YW1wcyB3aGVuIHRoZSBoYXJkd2FyZSBtYXkgYmUgc2xpZ2h0bHkgb2ZmIGZyb20KKyAgICAvLyB0aGUgZXhwZWN0ZWQgc2FtcGxlIHJhdGUuCisgICAgdm9pZCBjaGVja0RyaWZ0aW5nQ2xvY2soZG91YmxlIGhhcmR3YXJlRnJhbWVzUGVyU2Vjb25kLCBpbnQgbnVtTG9vcHMpIHsKKyAgICAgICAgY29uc3QgaW50NjRfdCBzdGFydFRpbWVOYW5vcyA9IDUwMDAwMDAwMDsgLy8gYXJiaXRyYXJ5CisgICAgICAgIG1vZGVsLnN0YXJ0KHN0YXJ0VGltZU5hbm9zKTsKKworICAgICAgICBjb25zdCBpbnQ2NF90IHN0YXJ0UG9zaXRpb25GcmFtZXMgPSBIV19GUkFNRVNfUEVSX0JVUlNUOyAvLyBoYXJkd2FyZQorICAgICAgICAvLyBhcmJpdHJhcnkgdGltZSBmb3IgZmlyc3QgYnVyc3QKKyAgICAgICAgY29uc3QgaW50NjRfdCBtYXJrZXJUaW1lID0gc3RhcnRUaW1lTmFub3MgKyBOQU5PU19QRVJfTUlMTElTRUNPTkQKKyAgICAgICAgICAgICAgICArICgyMDAgKiBOQU5PU19QRVJfTUlDUk9TRUNPTkQpOworCisgICAgICAgIC8vIFNob3VsZCBzZXQgaW5pdGlhbCBtYXJrZXIuCisgICAgICAgIG1vZGVsLnByb2Nlc3NUaW1lc3RhbXAoc3RhcnRQb3NpdGlvbkZyYW1lcywgbWFya2VyVGltZSk7CisgICAgICAgIEFTU0VSVF9FUShzdGFydFBvc2l0aW9uRnJhbWVzLCBtb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24obWFya2VyVGltZSkpOworCisgICAgICAgIGRvdWJsZSBlbGFwc2VkVGltZVNlY29uZHMgPSBzdGFydFRpbWVOYW5vcyAvIChkb3VibGUpIE5BTk9TX1BFUl9TRUNPTkQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtTG9vcHM7IGkrKykgeworICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHJhbmRvbSBkZWxheSBvdmVyIHNldmVyYWwgYnVyc3RzLgorICAgICAgICAgICAgY29uc3QgZG91YmxlIHRpbWVEZWxheVNlY29uZHMgPSAxMC4wICogZHJhbmQ0OCgpICogTkFOT1NfUEVSX0JVUlNUIC8gTkFOT1NfUEVSX1NFQ09ORDsKKyAgICAgICAgICAgIGVsYXBzZWRUaW1lU2Vjb25kcyArPSB0aW1lRGVsYXlTZWNvbmRzOworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBlbGFwc2VkVGltZU5hbm9zID0gKGludDY0X3QpKGVsYXBzZWRUaW1lU2Vjb25kcyAqIE5BTk9TX1BFUl9TRUNPTkQpOworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBjdXJyZW50VGltZU5hbm9zID0gc3RhcnRUaW1lTmFub3MgKyBlbGFwc2VkVGltZU5hbm9zOworICAgICAgICAgICAgLy8gU2ltdWxhdGUgRFNQIHJ1bm5pbmcgYXQgdGhlIHNwZWNpZmllZCByYXRlLgorICAgICAgICAgICAgY29uc3QgaW50NjRfdCBjdXJyZW50VGltZUZyYW1lcyA9IHN0YXJ0UG9zaXRpb25GcmFtZXMgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KShoYXJkd2FyZUZyYW1lc1BlclNlY29uZCAqIGVsYXBzZWRUaW1lU2Vjb25kcyk7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IG51bUJ1cnN0cyA9IGN1cnJlbnRUaW1lRnJhbWVzIC8gSFdfRlJBTUVTX1BFUl9CVVJTVDsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgYWxpZ25lZFBvc2l0aW9uID0gc3RhcnRQb3NpdGlvbkZyYW1lcyArIChudW1CdXJzdHMgKiBIV19GUkFNRVNfUEVSX0JVUlNUKTsKKworICAgICAgICAgICAgLy8gQXBwbHkgZHJpZnRpbmcgdGltZXN0YW1wLgorICAgICAgICAgICAgbW9kZWwucHJvY2Vzc1RpbWVzdGFtcChhbGlnbmVkUG9zaXRpb24sIGN1cnJlbnRUaW1lTmFub3MpOworCisgICAgICAgICAgICBBU1NFUlRfRVEoYWxpZ25lZFBvc2l0aW9uLCBtb2RlbC5jb252ZXJ0VGltZVRvUG9zaXRpb24oY3VycmVudFRpbWVOYW5vcykpOworICAgICAgICB9CisgICAgfQorCisgICAgSXNvY2hyb25vdXNDbG9ja01vZGVsIG1vZGVsOworfTsKKworLy8gQ2hlY2sgZGVmYXVsdCBzZXR1cC4KK1RFU1RfRihDbG9ja01vZGVsVGVzdEZpeHR1cmUsIGNsb2NrX3NldHVwKSB7CisgICAgQVNTRVJUX0VRKFNBTVBMRV9SQVRFLCBtb2RlbC5nZXRTYW1wbGVSYXRlKCkpOworICAgIEFTU0VSVF9FUShIV19GUkFNRVNfUEVSX0JVUlNULCBtb2RlbC5nZXRGcmFtZXNQZXJCdXJzdCgpKTsKK30KKworLy8gVGVzdCBkZWx0YSBjYWxjdWxhdGlvbnMuCitURVNUX0YoQ2xvY2tNb2RlbFRlc3RGaXh0dXJlLCBjbG9ja19kZWx0YXMpIHsKKyAgICBpbnQ2NF90IHBvc2l0aW9uID0gbW9kZWwuY29udmVydERlbHRhVGltZVRvUG9zaXRpb24oTkFOT1NfUEVSX1NFQ09ORCk7CisgICAgQVNTRVJUX0VRKFNBTVBMRV9SQVRFLCBwb3NpdGlvbik7CisKKyAgICAvLyBEZWx0YXMgYXJlIG5vdCBxdWFudGl6ZWQuCisgICAgLy8gQ29tcGFyZSB0aW1lIHRvIHRoZSBlcXVpdmFsZW50IHBvc2l0aW9uIGluIGZyYW1lcy4KKyAgICBjb25zdGV4cHIgaW50NjRfdCBrTmFub3NQZXJCdXJzdCA9IEhXX0ZSQU1FU19QRVJfQlVSU1QgKiBOQU5PU19QRVJfU0VDT05EIC8gU0FNUExFX1JBVEU7CisgICAgcG9zaXRpb24gPSBtb2RlbC5jb252ZXJ0RGVsdGFUaW1lVG9Qb3NpdGlvbihOQU5PU19QRVJfU0VDT05EICsgKGtOYW5vc1BlckJ1cnN0IC8gMikpOworICAgIEFTU0VSVF9FUShTQU1QTEVfUkFURSArIChIV19GUkFNRVNfUEVSX0JVUlNUIC8gMiksIHBvc2l0aW9uKTsKKworICAgIGludDY0X3QgdGltZSA9IG1vZGVsLmNvbnZlcnREZWx0YVBvc2l0aW9uVG9UaW1lKFNBTVBMRV9SQVRFKTsKKyAgICBBU1NFUlRfRVEoTkFOT1NfUEVSX1NFQ09ORCwgdGltZSk7CisKKyAgICAvLyBDb21wYXJlIHBvc2l0aW9uIGluIGZyYW1lcyB0byB0aGUgZXF1aXZhbGVudCB0aW1lLgorICAgIHRpbWUgPSBtb2RlbC5jb252ZXJ0RGVsdGFQb3NpdGlvblRvVGltZShTQU1QTEVfUkFURSArIChIV19GUkFNRVNfUEVSX0JVUlNUIC8gMikpOworICAgIEFTU0VSVF9FUShOQU5PU19QRVJfU0VDT05EICsgKGtOYW5vc1BlckJ1cnN0IC8gMiksIHRpbWUpOworfQorCisvLyBzdGFydCgpIHNob3VsZCBmb3JjZSB0aGUgaW50ZXJuYWwgbWFya2VycworVEVTVF9GKENsb2NrTW9kZWxUZXN0Rml4dHVyZSwgY2xvY2tfc3RhcnQpIHsKKyAgICBjb25zdCBpbnQ2NF90IHN0YXJ0VGltZSA9IDEwMDAwMDsKKyAgICBtb2RlbC5zdGFydChzdGFydFRpbWUpOworCisgICAgaW50NjRfdCBwb3NpdGlvbiA9IG1vZGVsLmNvbnZlcnRUaW1lVG9Qb3NpdGlvbihzdGFydFRpbWUpOworICAgIEVYUEVDVF9FUSgwLCBwb3NpdGlvbik7CisKKyAgICBpbnQ2NF90IHRpbWUgPSBtb2RlbC5jb252ZXJ0UG9zaXRpb25Ub1RpbWUocG9zaXRpb24pOworICAgIEVYUEVDVF9FUShzdGFydFRpbWUsIHRpbWUpOworCisgICAgdGltZSA9IHN0YXJ0VGltZSArICg1MDAgKiBOQU5PU19QRVJfTUlDUk9TRUNPTkQpOworICAgIHBvc2l0aW9uID0gbW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKHRpbWUpOworICAgIEVYUEVDVF9FUSgwLCBwb3NpdGlvbik7Cit9CisKKy8vIHRpbWVzdGFtcHMgbW92ZXMgdGhlIHdpbmRvdyBpZiBvdXRzaWRlIHRoZSBib3VuZHMKK1RFU1RfRihDbG9ja01vZGVsVGVzdEZpeHR1cmUsIGNsb2NrX3RpbWVzdGFtcCkgeworICAgIGNvbnN0IGludDY0X3Qgc3RhcnRUaW1lID0gMTAwMDAwMDAwOworICAgIG1vZGVsLnN0YXJ0KHN0YXJ0VGltZSk7CisKKyAgICBjb25zdCBpbnQ2NF90IHBvc2l0aW9uID0gSFdfRlJBTUVTX1BFUl9CVVJTVDsgLy8gaGFyZHdhcmUKKyAgICBpbnQ2NF90IG1hcmtlclRpbWUgPSBzdGFydFRpbWUgKyBOQU5PU19QRVJfTUlMTElTRUNPTkQgKyAoMjAwICogTkFOT1NfUEVSX01JQ1JPU0VDT05EKTsKKworICAgIC8vIFNob3VsZCBzZXQgbWFya2VyLgorICAgIG1vZGVsLnByb2Nlc3NUaW1lc3RhbXAocG9zaXRpb24sIG1hcmtlclRpbWUpOworICAgIEVYUEVDVF9FUShwb3NpdGlvbiwgbW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKG1hcmtlclRpbWUpKTsKKworICAgIC8vIGNvbnZlcnRUaW1lVG9Qb3NpdGlvbiByb3VuZHMgZG93bgorICAgIEVYUEVDVF9FUShwb3NpdGlvbiwgbW9kZWwuY29udmVydFRpbWVUb1Bvc2l0aW9uKG1hcmtlclRpbWUgKyAoNzMgKiBOQU5PU19QRVJfTUlDUk9TRUNPTkQpKSk7CisKKyAgICAvLyBjb252ZXJ0UG9zaXRpb25Ub1RpbWUgcm91bmRzIHVwCisgICAgRVhQRUNUX0VRKG1hcmtlclRpbWUgKyBOQU5PU19QRVJfQlVSU1QsIG1vZGVsLmNvbnZlcnRQb3NpdGlvblRvVGltZShwb3NpdGlvbiArIDE3KSk7Cit9CisKKyNkZWZpbmUgTlVNX0xPT1BTX0RSSUZUICAgMTAwMDAKKworLy8gdGVzdCBudWRnaW5nIHRoZSB3aW5kb3cgYnkgdXNpbmcgYSBkcmlmdGluZyBIVyBjbG9jaworVEVTVF9GKENsb2NrTW9kZWxUZXN0Rml4dHVyZSwgY2xvY2tfbm9fZHJpZnQpIHsKKyAgICBjaGVja0RyaWZ0aW5nQ2xvY2soU0FNUExFX1JBVEUsIE5VTV9MT09QU19EUklGVCk7Cit9CisKKy8vIFRoZXNlIHNsb3cgZHJpZnQgcmF0ZXMgY2F1c2VkIGVycm9ycyB3aGVuIEkgZGlzYWJsZWQgdGhlIGNvZGUgdGhhdCBoYW5kbGVzCisvLyBkcmlmdGluZyBpbiB0aGUgY2xvY2sgbW9kZWwuIFNvIEkgdGhpbmsgdGhlIHRlc3QgaXMgdmFsaWQuCisvLyBJdCBpcyB1bmxpa2VseSB0aGF0IHJlYWwgaGFyZHdhcmUgd291bGQgYmUgb2ZmIGJ5IG1vcmUgdGhhbiB0aGlzIGFtb3VudC4KK1RFU1RfRihDbG9ja01vZGVsVGVzdEZpeHR1cmUsIGNsb2NrX3Nsb3dfZHJpZnQpIHsKKyAgICBjaGVja0RyaWZ0aW5nQ2xvY2soMC45OTggKiBTQU1QTEVfUkFURSwgTlVNX0xPT1BTX0RSSUZUKTsKK30KKworVEVTVF9GKENsb2NrTW9kZWxUZXN0Rml4dHVyZSwgY2xvY2tfZmFzdF9kcmlmdCkgeworICAgIGNoZWNrRHJpZnRpbmdDbG9jaygxLjAwMiAqIFNBTVBMRV9SQVRFLCBOVU1fTE9PUFNfRFJJRlQpOworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X2Zsb3dncmFwaC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9mbG93Z3JhcGguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1NjNhN2UKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9mbG93Z3JhcGguY3BwCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGVzdCBGbG93R3JhcGgKKyAqLworCisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAiZmxvd2dyYXBoL0NsaXBUb1JhbmdlLmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL01vbm9Ub011bHRpQ29udmVydGVyLmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL1NvdXJjZUZsb2F0LmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL1JhbXBMaW5lYXIuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvU2lua0Zsb2F0LmgiCisjaW5jbHVkZSAiZmxvd2dyYXBoL1NpbmtJMTYuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvU2lua0kyNC5oIgorI2luY2x1ZGUgImZsb3dncmFwaC9Tb3VyY2VJMTYuaCIKKyNpbmNsdWRlICJmbG93Z3JhcGgvU291cmNlSTI0LmgiCisKK3VzaW5nIG5hbWVzcGFjZSBmbG93Z3JhcGg7CisKK2NvbnN0ZXhwciBpbnQga0J5dGVzUGVySTI0UGFja2VkID0gMzsKKworVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX3NpbmtpMTYpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgaW5wdXRbXSA9IHsxLjBmLCAwLjVmLCAtMC4yNWYsIC0xLjBmLCAwLjBmLCA1My45ZiwgLTg3LjJmfTsKKyAgICBzdGF0aWMgY29uc3QgaW50MTZfdCBleHBlY3RlZFtdID0gezMyNzY3LCAxNjM4NCwgLTgxOTIsIC0zMjc2OCwgMCwgMzI3NjcsIC0zMjc2OH07CisgICAgaW50MTZfdCBvdXRwdXRbMjBdOworICAgIFNvdXJjZUZsb2F0IHNvdXJjZUZsb2F0ezF9OworICAgIFNpbmtJMTYgc2lua0kxNnsxfTsKKworICAgIGludCBudW1JbnB1dEZyYW1lcyA9IHNpemVvZihpbnB1dCkgLyBzaXplb2YoaW5wdXRbMF0pOworICAgIHNvdXJjZUZsb2F0LnNldERhdGEoaW5wdXQsIG51bUlucHV0RnJhbWVzKTsKKyAgICBzb3VyY2VGbG9hdC5vdXRwdXQuY29ubmVjdCgmc2lua0kxNi5pbnB1dCk7CisKKyAgICBpbnQgbnVtT3V0cHV0RnJhbWVzID0gc2l6ZW9mKG91dHB1dCkgLyBzaXplb2YoaW50MTZfdCk7CisgICAgaW50MzJfdCBudW1SZWFkID0gc2lua0kxNi5yZWFkKG91dHB1dCwgbnVtT3V0cHV0RnJhbWVzKTsKKyAgICBBU1NFUlRfRVEobnVtSW5wdXRGcmFtZXMsIG51bVJlYWQpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVhZDsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZFtpXSwgb3V0cHV0W2ldKTsKKyAgICB9Cit9CisKK1RFU1QodGVzdF9mbG93Z3JhcGgsIG1vZHVsZV9tb25vX3RvX3N0ZXJlbykgeworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBpbnB1dFtdID0gezEuMGYsIDIuMGYsIDMuMGZ9OworICAgIGZsb2F0IG91dHB1dFsxMDBdID0ge307CisgICAgU291cmNlRmxvYXQgc291cmNlRmxvYXR7MX07CisgICAgTW9ub1RvTXVsdGlDb252ZXJ0ZXIgbW9ub1RvU3RlcmVvezJ9OworICAgIFNpbmtGbG9hdCBzaW5rRmxvYXR7Mn07CisKKyAgICBzb3VyY2VGbG9hdC5zZXREYXRhKGlucHV0LCAzKTsKKworICAgIHNvdXJjZUZsb2F0Lm91dHB1dC5jb25uZWN0KCZtb25vVG9TdGVyZW8uaW5wdXQpOworICAgIG1vbm9Ub1N0ZXJlby5vdXRwdXQuY29ubmVjdCgmc2lua0Zsb2F0LmlucHV0KTsKKworICAgIGludDMyX3QgbnVtUmVhZCA9IHNpbmtGbG9hdC5yZWFkKG91dHB1dCwgOCk7CisgICAgQVNTRVJUX0VRKDMsIG51bVJlYWQpOworICAgIEVYUEVDVF9FUShpbnB1dFswXSwgb3V0cHV0WzBdKTsKKyAgICBFWFBFQ1RfRVEoaW5wdXRbMF0sIG91dHB1dFsxXSk7CisgICAgRVhQRUNUX0VRKGlucHV0WzFdLCBvdXRwdXRbMl0pOworICAgIEVYUEVDVF9FUShpbnB1dFsxXSwgb3V0cHV0WzNdKTsKK30KKworVEVTVCh0ZXN0X2Zsb3dncmFwaCwgbW9kdWxlX3JhbXBfbGluZWFyKSB7CisgICAgY29uc3RleHByIGludCByYW1wU2l6ZSA9IDU7CisgICAgY29uc3RleHByIGludCBudW1PdXRwdXQgPSAxMDA7CisgICAgY29uc3RleHByIGZsb2F0IHZhbHVlID0gMS4wZjsKKyAgICBjb25zdGV4cHIgZmxvYXQgdGFyZ2V0ID0gMTAwLjBmOworICAgIGZsb2F0IG91dHB1dFtudW1PdXRwdXRdID0ge307CisgICAgUmFtcExpbmVhciByYW1wTGluZWFyezF9OworICAgIFNpbmtGbG9hdCBzaW5rRmxvYXR7MX07CisKKyAgICByYW1wTGluZWFyLmlucHV0LnNldFZhbHVlKHZhbHVlKTsKKyAgICByYW1wTGluZWFyLnNldExlbmd0aEluRnJhbWVzKHJhbXBTaXplKTsKKyAgICByYW1wTGluZWFyLnNldFRhcmdldCh0YXJnZXQpOworICAgIHJhbXBMaW5lYXIuZm9yY2VDdXJyZW50KDAuMGYpOworCisgICAgcmFtcExpbmVhci5vdXRwdXQuY29ubmVjdCgmc2lua0Zsb2F0LmlucHV0KTsKKworICAgIGludDMyX3QgbnVtUmVhZCA9IHNpbmtGbG9hdC5yZWFkKG91dHB1dCwgbnVtT3V0cHV0KTsKKyAgICBBU1NFUlRfRVEobnVtT3V0cHV0LCBudW1SZWFkKTsKKyAgICBjb25zdGV4cHIgZmxvYXQgdG9sZXJhbmNlID0gMC4wMDAxZjsgLy8gYXJiaXRyYXJ5CisgICAgaW50IGkgPSAwOworICAgIGZvciAoOyBpIDwgcmFtcFNpemU7IGkrKykgeworICAgICAgICBmbG9hdCBleHBlY3RlZCA9IGkgKiB2YWx1ZSAqIHRhcmdldCAvIHJhbXBTaXplOworICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZCwgb3V0cHV0W2ldLCB0b2xlcmFuY2UpOworICAgIH0KKyAgICBmb3IgKDsgaSA8IG51bU91dHB1dDsgaSsrKSB7CisgICAgICAgIGZsb2F0IGV4cGVjdGVkID0gdmFsdWUgKiB0YXJnZXQ7CisgICAgICAgIEVYUEVDVF9ORUFSKGV4cGVjdGVkLCBvdXRwdXRbaV0sIHRvbGVyYW5jZSk7CisgICAgfQorfQorCisvLyBJdCBpcyBlYXNpZXN0IHRvIHJlcHJlc2VudCBwYWNrZWQgMjQtYml0IGRhdGEgYXMgYSBieXRlIGFycmF5LgorLy8gVGhpcyB0ZXN0IHdpbGwgcmVhZCBmcm9tIGlucHV0LCBjb252ZXJ0IHRvIGZsb2F0LCB0aGVuIHdyaXRlCisvLyBiYWNrIHRvIG91dHB1dCBhcyBieXRlcy4KK1RFU1QodGVzdF9mbG93Z3JhcGgsIG1vZHVsZV9wYWNrZWRfMjQpIHsKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBpbnB1dFtdID0gezB4MDEsIDB4MjMsIDB4NDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDY3LCAweDg5LCAweEFCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhDRCwgMHhFRiwgMHg1QX07CisgICAgdWludDhfdCBvdXRwdXRbOTldID0ge307CisgICAgU291cmNlSTI0IHNvdXJjZUkyNHsxfTsKKyAgICBTaW5rSTI0IHNpbmtJMjR7MX07CisKKyAgICBpbnQgbnVtSW5wdXRGcmFtZXMgPSBzaXplb2YoaW5wdXQpIC8ga0J5dGVzUGVySTI0UGFja2VkOworICAgIHNvdXJjZUkyNC5zZXREYXRhKGlucHV0LCBudW1JbnB1dEZyYW1lcyk7CisgICAgc291cmNlSTI0Lm91dHB1dC5jb25uZWN0KCZzaW5rSTI0LmlucHV0KTsKKworICAgIGludDMyX3QgbnVtUmVhZCA9IHNpbmtJMjQucmVhZChvdXRwdXQsIHNpemVvZihvdXRwdXQpIC8ga0J5dGVzUGVySTI0UGFja2VkKTsKKyAgICBBU1NFUlRfRVEobnVtSW5wdXRGcmFtZXMsIG51bVJlYWQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mKGlucHV0KTsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9FUShpbnB1dFtpXSwgb3V0cHV0W2ldKTsKKyAgICB9Cit9CisKK1RFU1QodGVzdF9mbG93Z3JhcGgsIG1vZHVsZV9jbGlwX3RvX3JhbmdlKSB7CisgICAgY29uc3RleHByIGZsb2F0IG15TWluID0gLTIuMGY7CisgICAgY29uc3RleHByIGZsb2F0IG15TWF4ID0gMS41ZjsKKworICAgIHN0YXRpYyBjb25zdCBmbG9hdCBpbnB1dFtdID0gey05LjcsIDAuNWYsIC0wLjI1LCAxLjBmLCAxMi4zfTsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgZXhwZWN0ZWRbXSA9IHtteU1pbiwgMC41ZiwgLTAuMjUsIDEuMGYsIG15TWF4fTsKKyAgICBmbG9hdCBvdXRwdXRbMTAwXTsKKyAgICBTb3VyY2VGbG9hdCBzb3VyY2VGbG9hdHsxfTsKKyAgICBDbGlwVG9SYW5nZSBjbGlwcGVyezF9OworICAgIFNpbmtGbG9hdCBzaW5rRmxvYXR7MX07CisKKyAgICBpbnQgbnVtSW5wdXRGcmFtZXMgPSBzaXplb2YoaW5wdXQpIC8gc2l6ZW9mKGlucHV0WzBdKTsKKyAgICBzb3VyY2VGbG9hdC5zZXREYXRhKGlucHV0LCBudW1JbnB1dEZyYW1lcyk7CisKKyAgICBjbGlwcGVyLnNldE1pbmltdW0obXlNaW4pOworICAgIGNsaXBwZXIuc2V0TWF4aW11bShteU1heCk7CisKKyAgICBzb3VyY2VGbG9hdC5vdXRwdXQuY29ubmVjdCgmY2xpcHBlci5pbnB1dCk7CisgICAgY2xpcHBlci5vdXRwdXQuY29ubmVjdCgmc2lua0Zsb2F0LmlucHV0KTsKKworICAgIGludCBudW1PdXRwdXRGcmFtZXMgPSBzaXplb2Yob3V0cHV0KSAvIHNpemVvZihvdXRwdXRbMF0pOworICAgIGludDMyX3QgbnVtUmVhZCA9IHNpbmtGbG9hdC5yZWFkKG91dHB1dCwgbnVtT3V0cHV0RnJhbWVzKTsKKyAgICBBU1NFUlRfRVEobnVtSW5wdXRGcmFtZXMsIG51bVJlYWQpOworICAgIGNvbnN0ZXhwciBmbG9hdCB0b2xlcmFuY2UgPSAwLjAwMDAwMWY7IC8vIGFyYml0cmFyeQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtUmVhZDsgaSsrKSB7CisgICAgICAgIEVYUEVDVF9ORUFSKGV4cGVjdGVkW2ldLCBvdXRwdXRbaV0sIHRvbGVyYW5jZSk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfZnVsbF9xdWV1ZS5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9mdWxsX3F1ZXVlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmQ0ZmEzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfZnVsbF9xdWV1ZS5jcHAKQEAgLTAsMCArMSw5MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFRlc3Qgd2hldGhlciBhIHN0cmVhbSBkaWVzIGlmIGl0IGlzIHdyaXR0ZW4gdG8gYWZ0ZXIgYSBkZWxheS4KKy8vIE1heWJlIGJlY2F1c2UgdGhlIG1lc3NhZ2UgcXVldWUgZnJvbSB0aGUgQUF1ZGlvIHNlcnZpY2UgZmlsbHMgdXAuCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKK2NvbnN0ZXhwciBpbnQ2NF90IGtOYW5vc1BlclNlY29uZCA9IDEwMDAwMDAwMDA7Citjb25zdGV4cHIgaW50NjRfdCBrVGltZW91dE5hbm9zID0ga05hbm9zUGVyU2Vjb25kIC8gMjsKK2NvbnN0ZXhwciBpbnQga051bUZyYW1lcyA9IDI1NjsKK2NvbnN0ZXhwciBpbnQga0NoYW5uZWxDb3VudCA9IDI7CisKK3N0YXRpYyB2b2lkIGNoZWNrRnVsbFF1ZXVlKGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHNsZWVwTWlsbGlzKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPGZsb2F0W10+IGJ1ZmZlciA9IHN0ZDo6bWFrZV91bmlxdWU8ZmxvYXRbXT4oCisgICAgICAgICAgICBrTnVtRnJhbWVzICoga0NoYW5uZWxDb3VudCk7CisKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICphYXVkaW9CdWlsZGVyID0gbnVsbHB0cjsKKworICAgIC8vIFVzZSBhbiBBQXVkaW9TdHJlYW1CdWlsZGVyIHRvIGNvbnRhaW4gcmVxdWVzdGVkIHBhcmFtZXRlcnMuCisgICAgQVNTRVJUX0VRKEFBVURJT19PSywgQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoJmFhdWRpb0J1aWxkZXIpKTsKKworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0Q2hhbm5lbENvdW50KGFhdWRpb0J1aWxkZXIsIGtDaGFubmVsQ291bnQpOworCisgICAgLy8gUmVxdWVzdCBzdHJlYW0gcHJvcGVydGllcy4KKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldFBlcmZvcm1hbmNlTW9kZShhYXVkaW9CdWlsZGVyLCBwZXJmTW9kZSk7CisKKyAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgIEFBdWRpb1N0cmVhbSAqYWF1ZGlvU3RyZWFtID0gbnVsbHB0cjsKKyAgICBBU1NFUlRfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oYWF1ZGlvQnVpbGRlciwKKyAgICAgICAgICAgICZhYXVkaW9TdHJlYW0pKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShhYXVkaW9CdWlsZGVyKTsKKworICAgIEVYUEVDVF9FUShBQVVESU9fT0ssIEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoYWF1ZGlvU3RyZWFtKSk7CisKKyAgICAvLyBTbGVlcCBmb3IgYXdoaWxlLiBUaGlzIG1pZ2h0IGtpbGwgdGhlIHN0cmVhbS4KKyAgICB1c2xlZXAoc2xlZXBNaWxsaXMgKiAxMDAwKTsgLy8gMTAwMCBtaWxsaXMgaW4gYSBtaWNyb3NlY29uZAorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7CisgICAgICAgIGNvbnN0IGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TdHJlYW1fd3JpdGUoYWF1ZGlvU3RyZWFtLAorICAgICAgICAgICAgICAgIGJ1ZmZlci5nZXQoKSwKKyAgICAgICAgICAgICAgICBrTnVtRnJhbWVzLAorICAgICAgICAgICAgICAgIGtUaW1lb3V0TmFub3MpOworICAgICAgICBFWFBFQ1RfRVEoa051bUZyYW1lcywgcmVzdWx0KTsKKyAgICAgICAgaWYgKGtOdW1GcmFtZXMgIT0gcmVzdWx0KSBicmVhazsKKyAgICB9CisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoYWF1ZGlvU3RyZWFtKSk7CisKKyAgICBFWFBFQ1RfRVEoQUFVRElPX09LLCBBQXVkaW9TdHJlYW1fY2xvc2UoYWF1ZGlvU3RyZWFtKSk7Cit9CisKK1RFU1QodGVzdF9mdWxsX3F1ZXVlLCBhYXVkaW9fZnVsbF9xdWV1ZV9wZXJmX25vbmVfNTApIHsKKyAgICBjaGVja0Z1bGxRdWV1ZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FLCA1MCAvKiBzbGVlcE1pbGxpcyAqLyk7Cit9CisKK1RFU1QodGVzdF9mdWxsX3F1ZXVlLCBhYXVkaW9fZnVsbF9xdWV1ZV9wZXJmX25vbmVfMjAwKSB7CisgICAgY2hlY2tGdWxsUXVldWUoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSwgMjAwIC8qIHNsZWVwTWlsbGlzICovKTsKK30KKworVEVTVCh0ZXN0X2Z1bGxfcXVldWUsIGFhdWRpb19mdWxsX3F1ZXVlX3BlcmZfbm9uZV8xMDAwKSB7CisgICAgY2hlY2tGdWxsUXVldWUoQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTk9ORSwgMTAwMCAvKiBzbGVlcE1pbGxpcyAqLyk7Cit9CisKK1RFU1QodGVzdF9mdWxsX3F1ZXVlLCBhYXVkaW9fZnVsbF9xdWV1ZV9sb3dfbGF0ZW5jeV81MCkgeworICAgIGNoZWNrRnVsbFF1ZXVlKEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX0xPV19MQVRFTkNZLCA1MCAvKiBzbGVlcE1pbGxpcyAqLyk7Cit9CisKK1RFU1QodGVzdF9mdWxsX3F1ZXVlLCBhYXVkaW9fZnVsbF9xdWV1ZV9sb3dfbGF0ZW5jeV8yMDApIHsKKyAgICBjaGVja0Z1bGxRdWV1ZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwgMjAwIC8qIHNsZWVwTWlsbGlzICovKTsKK30KKworVEVTVCh0ZXN0X2Z1bGxfcXVldWUsIGFhdWRpb19mdWxsX3F1ZXVlX2xvd19sYXRlbmN5XzEwMDApIHsKKyAgICBjaGVja0Z1bGxRdWV1ZShBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWSwgMTAwMCAvKiBzbGVlcE1pbGxpcyAqLyk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9saW5lYXJfcmFtcC5jcHAgYi9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF9saW5lYXJfcmFtcC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMjI2YmEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfbGluZWFyX3JhbXAuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8bWF0aC5oPgotCi0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2luY2x1ZGUgInV0aWxpdHkvQUF1ZGlvVXRpbGl0aWVzLmgiCi0jaW5jbHVkZSAidXRpbGl0eS9MaW5lYXJSYW1wLmgiCi0KLVRFU1QodGVzdF9saW5lYXJfcmFtcCwgbGluZWFyX3JhbXBfc2VnbWVudHMpIHsKLSAgICBMaW5lYXJSYW1wIHJhbXA7Ci0gICAgY29uc3QgZmxvYXQgc291cmNlWzRdID0gezEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLSAgICBmbG9hdCBkZXN0aW5hdGlvbls0XSA9IHsxLjBmLCAxLjBmLCAxLjBmLCAxLjBmIH07Ci0KLSAgICBmbG9hdCBsZXZlbEZyb20gPSAtMS4wZjsKLSAgICBmbG9hdCBsZXZlbFRvID0gLTEuMGY7Ci0gICAgcmFtcC5zZXRMZW5ndGhJbkZyYW1lcyg4KTsKLSAgICByYW1wLnNldFRhcmdldCg4LjBmKTsKLQotICAgIEVYUEVDVF9FUSg4LCByYW1wLmdldExlbmd0aEluRnJhbWVzKCkpOwotCi0gICAgYm9vbCByYW1waW5nID0gcmFtcC5uZXh0U2VnbWVudCg0LCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDEsIHJhbXBpbmcpOwotICAgIEVYUEVDVF9FUSgwLjBmLCBsZXZlbEZyb20pOwotICAgIEVYUEVDVF9FUSg0LjBmLCBsZXZlbFRvKTsKLQotICAgIEFBdWRpb19saW5lYXJSYW1wKHNvdXJjZSwgZGVzdGluYXRpb24sIDQsIDEsIGxldmVsRnJvbSwgbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDAuMGYsIGRlc3RpbmF0aW9uWzBdKTsKLSAgICBFWFBFQ1RfRVEoMS4wZiwgZGVzdGluYXRpb25bMV0pOwotICAgIEVYUEVDVF9FUSgyLjBmLCBkZXN0aW5hdGlvblsyXSk7Ci0gICAgRVhQRUNUX0VRKDMuMGYsIGRlc3RpbmF0aW9uWzNdKTsKLQotICAgIHJhbXBpbmcgPSByYW1wLm5leHRTZWdtZW50KDQsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoMSwgcmFtcGluZyk7Ci0gICAgRVhQRUNUX0VRKDQuMGYsIGxldmVsRnJvbSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGxldmVsVG8pOwotCi0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoNC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEVYUEVDVF9FUSg1LjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgRVhQRUNUX0VRKDYuMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBFWFBFQ1RfRVEoNy4wZiwgZGVzdGluYXRpb25bM10pOwotCi0gICAgcmFtcGluZyA9IHJhbXAubmV4dFNlZ21lbnQoNCwgJmxldmVsRnJvbSwgJmxldmVsVG8pOwotICAgIEVYUEVDVF9FUSgwLCByYW1waW5nKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxGcm9tKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgbGV2ZWxUbyk7Ci0KLSAgICBBQXVkaW9fbGluZWFyUmFtcChzb3VyY2UsIGRlc3RpbmF0aW9uLCA0LCAxLCBsZXZlbEZyb20sIGxldmVsVG8pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblswXSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzFdKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMl0pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblszXSk7Ci0KLX07Ci0KLQotVEVTVCh0ZXN0X2xpbmVhcl9yYW1wLCBsaW5lYXJfcmFtcF9mb3JjZWQpIHsKLSAgICBMaW5lYXJSYW1wIHJhbXA7Ci0gICAgY29uc3QgZmxvYXQgc291cmNlWzRdID0gezEuMGYsIDEuMGYsIDEuMGYsIDEuMGYgfTsKLSAgICBmbG9hdCBkZXN0aW5hdGlvbls0XSA9IHsxLjBmLCAxLjBmLCAxLjBmLCAxLjBmIH07Ci0KLSAgICBmbG9hdCBsZXZlbEZyb20gPSAtMS4wZjsKLSAgICBmbG9hdCBsZXZlbFRvID0gLTEuMGY7Ci0gICAgcmFtcC5zZXRMZW5ndGhJbkZyYW1lcyg0KTsKLSAgICByYW1wLnNldFRhcmdldCg4LjBmKTsKLSAgICByYW1wLmZvcmNlQ3VycmVudCg0LjBmKTsKLSAgICBFWFBFQ1RfRVEoNC4wZiwgcmFtcC5nZXRDdXJyZW50KCkpOwotCi0gICAgYm9vbCByYW1waW5nID0gcmFtcC5uZXh0U2VnbWVudCg0LCAmbGV2ZWxGcm9tLCAmbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDEsIHJhbXBpbmcpOwotICAgIEVYUEVDVF9FUSg0LjBmLCBsZXZlbEZyb20pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBsZXZlbFRvKTsKLQotICAgIEFBdWRpb19saW5lYXJSYW1wKHNvdXJjZSwgZGVzdGluYXRpb24sIDQsIDEsIGxldmVsRnJvbSwgbGV2ZWxUbyk7Ci0gICAgRVhQRUNUX0VRKDQuMGYsIGRlc3RpbmF0aW9uWzBdKTsKLSAgICBFWFBFQ1RfRVEoNS4wZiwgZGVzdGluYXRpb25bMV0pOwotICAgIEVYUEVDVF9FUSg2LjBmLCBkZXN0aW5hdGlvblsyXSk7Ci0gICAgRVhQRUNUX0VRKDcuMGYsIGRlc3RpbmF0aW9uWzNdKTsKLQotICAgIHJhbXBpbmcgPSByYW1wLm5leHRTZWdtZW50KDQsICZsZXZlbEZyb20sICZsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoMCwgcmFtcGluZyk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGxldmVsRnJvbSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGxldmVsVG8pOwotCi0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgNCwgMSwgbGV2ZWxGcm9tLCBsZXZlbFRvKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bMF0pOwotICAgIEVYUEVDVF9FUSg4LjBmLCBkZXN0aW5hdGlvblsxXSk7Ci0gICAgRVhQRUNUX0VRKDguMGYsIGRlc3RpbmF0aW9uWzJdKTsKLSAgICBFWFBFQ1RfRVEoOC4wZiwgZGVzdGluYXRpb25bM10pOwotCi19OwotCi1jb25zdGV4cHIgaW50MTZfdCBrTWF4STE2ID0gSU5UMTZfTUFYOwotY29uc3RleHByIGludDE2X3Qga01pbkkxNiA9IElOVDE2X01JTjsKLWNvbnN0ZXhwciBpbnQxNl90IGtIYWxmSTE2ID0gMTYzODQ7Ci1jb25zdGV4cHIgaW50MTZfdCBrVGVudGhJMTYgPSAzMjc3OwotCi0vL3ZvaWQgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoY29uc3QgZmxvYXQgKnNvdXJjZSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICpkZXN0aW5hdGlvbiwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG51bVNhbXBsZXMsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlKTsKLVRFU1QodGVzdF9saW5lYXJfcmFtcCwgZmxvYXRfdG9faTE2KSB7Ci0gICAgY29uc3QgZmxvYXQgc291cmNlW10gPSB7MTIzNDUuNmYsIDEuMGYsIDAuNWYsIDAuMWYsIDAuMGYsIC0wLjFmLCAtMC41ZiwgLTEuMGYsIC0xMjM0NS42Zn07Ci0gICAgY29uc3RleHByIHNpemVfdCBjb3VudCA9IHNpemVvZihzb3VyY2UpIC8gc2l6ZW9mKHNvdXJjZVswXSk7Ci0gICAgaW50MTZfdCBkZXN0aW5hdGlvbltjb3VudF07Ci0gICAgY29uc3QgaW50MTZfdCBleHBlY3RlZFtjb3VudF0gPSB7a01heEkxNiwga01heEkxNiwga0hhbGZJMTYsIGtUZW50aEkxNiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAta1RlbnRoSTE2LCAta0hhbGZJMTYsIGtNaW5JMTYsIGtNaW5JMTZ9OwotCi0gICAgQUF1ZGlvQ29udmVydF9mbG9hdFRvUGNtMTYoc291cmNlLCBkZXN0aW5hdGlvbiwgY291bnQsIDEuMGYpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIGRlc3RpbmF0aW9uW2ldKTsKLSAgICB9Ci0KLX0KLQotLy92b2lkIEFBdWRpb0NvbnZlcnRfcGNtMTZUb0Zsb2F0KGNvbnN0IGludDE2X3QgKnNvdXJjZSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCAqZGVzdGluYXRpb24sCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBudW1TYW1wbGVzLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZSk7Ci1URVNUKHRlc3RfbGluZWFyX3JhbXAsIGkxNl90b19mbG9hdCkgewotICAgIGNvbnN0IGludDE2X3Qgc291cmNlW10gPSB7a01heEkxNiwga0hhbGZJMTYsIGtUZW50aEkxNiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1rVGVudGhJMTYsIC1rSGFsZkkxNiwga01pbkkxNn07Ci0gICAgY29uc3RleHByIHNpemVfdCBjb3VudCA9IHNpemVvZihzb3VyY2UpIC8gc2l6ZW9mKHNvdXJjZVswXSk7Ci0gICAgZmxvYXQgZGVzdGluYXRpb25bY291bnRdOwotICAgIGNvbnN0IGZsb2F0IGV4cGVjdGVkW2NvdW50XSA9IHsoMzI3NjcuMGYgLyAzMjc2OC4wZiksIDAuNWYsIDAuMWYsIDAuMGYsIC0wLjFmLCAtMC41ZiwgLTEuMGZ9OwotCi0gICAgQUF1ZGlvQ29udmVydF9wY20xNlRvRmxvYXQoc291cmNlLCBkZXN0aW5hdGlvbiwgY291bnQsIDEuMGYpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBFWFBFQ1RfTkVBUihleHBlY3RlZFtpXSwgZGVzdGluYXRpb25baV0sIDAuMDAwMWYpOwotICAgIH0KLQotfQotCi0vL3ZvaWQgQUF1ZGlvX2xpbmVhclJhbXAoY29uc3QgaW50MTZfdCAqc291cmNlLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgKmRlc3RpbmF0aW9uLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbnVtRnJhbWVzLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlc1BlckZyYW1lLAotLy8gICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGFtcGxpdHVkZTEsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgYW1wbGl0dWRlMik7Ci1URVNUKHRlc3RfbGluZWFyX3JhbXAsIHJhbXBfaTE2X3RvX2kxNikgewotICAgIGNvbnN0IGludDE2X3Qgc291cmNlW10gPSB7MSwgMSwgMSwgMSwgMSwgMSwgMSwgMX07Ci0gICAgY29uc3RleHByIHNpemVfdCBjb3VudCA9IHNpemVvZihzb3VyY2UpIC8gc2l6ZW9mKHNvdXJjZVswXSk7Ci0gICAgaW50MTZfdCBkZXN0aW5hdGlvbltjb3VudF07Ci0gICAgLy8gUmFtcCB3aWxsIHN3ZWVwIGZyb20gLTEgdG8gYWxtb3N0ICsxCi0gICAgY29uc3QgaW50MTZfdCBleHBlY3RlZFtjb3VudF0gPSB7Ci0gICAgICAgICAgICAtMSwgLy8gZnJvbSAtMS4wMAotICAgICAgICAgICAgLTEsIC8vIGZyb20gLTAuNzUKLSAgICAgICAgICAgIC0xLCAvLyBmcm9tIC0wLjU1LCByb3VuZCBhd2F5IGZyb20gemVybwotICAgICAgICAgICAgMCwgIC8vIGZyb20gLTAuMjUsIHJvdW5kIHVwIHRvIHplcm8KLSAgICAgICAgICAgIDAsICAvLyBmcm9tICAwLjAwCi0gICAgICAgICAgICAwLCAgLy8gZnJvbSAgMC4yNSwgcm91bmQgZG93biB0byB6ZXJvCi0gICAgICAgICAgICAxLCAgLy8gZnJvbSAgMC41MCwgcm91bmQgYXdheSBmcm9tIHplcm8KLSAgICAgICAgICAgIDEgICAvLyBmcm9tICAwLjc1Ci0gICAgfTsKLQotICAgIC8vIHN3ZWVwIGFjcm9zcyB6ZXJvIHRvIHRlc3Qgc3ltbWV0cnkKLSAgICBjb25zdGV4cHIgZmxvYXQgYW1wbGl0dWRlMSA9IC0xLjA7Ci0gICAgY29uc3RleHByIGZsb2F0IGFtcGxpdHVkZTIgPSAxLjA7Ci0gICAgQUF1ZGlvX2xpbmVhclJhbXAoc291cmNlLCBkZXN0aW5hdGlvbiwgY291bnQsIDEsIGFtcGxpdHVkZTEsIGFtcGxpdHVkZTIpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRbaV0sIGRlc3RpbmF0aW9uW2ldKTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3JldHVybl9zdG9wLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3JldHVybl9zdG9wLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjUyZGQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3RfcmV0dXJuX3N0b3AuY3BwCkBAIC0wLDAgKzEsMzAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqCisgKiBSZXR1cm4gc3RvcCBmcm9tIHRoZSBjYWxsYmFjay4KKyAqIEV4cGVjdCB0aGUgY2FsbGJhY2sgdG8gY2Vhc2UuCisgKiBDaGVjayB0aGUgbG9nY2F0IGZvciBiYWQgYmVoYXZpb3IuCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8YWF1ZGlvL0FBdWRpby5oPgorCisjZGVmaW5lIERFRkFVTFRfVElNRU9VVF9OQU5PUyAgKChpbnQ2NF90KTEwMDAwMDAwMDApCisjZGVmaW5lIFNUT1BfQVRfTVNFQyAgICAgICAgICAxMDAwCisjZGVmaW5lIExPT1BfRFVSQVRJT05fTVNFQyAgICA0MDAwCisjZGVmaW5lIFNMRUVQX0RVUkFUSU9OX01TRUMgICAgMjAwCisKK3N0YXRpYyB2b2lkIHNfbXlFcnJvckNhbGxiYWNrUHJvYygKKyAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0sCisgICAgICAgIHZvaWQgKnVzZXJEYXRhLAorICAgICAgICBhYXVkaW9fcmVzdWx0X3QgZXJyb3IpOworCitzdHJ1Y3QgQXVkaW9FbmdpbmUgeworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXIgKmJ1aWxkZXIgPSBudWxscHRyOworICAgIEFBdWRpb1N0cmVhbSAgICAgICAgKnN0cmVhbSA9IG51bGxwdHI7CisgICAgc3RkOjp0aHJlYWQgICAgICAgICAqdGhyZWFkID0gbnVsbHB0cjsKKyAgICBpbnQzMl90ICAgICAgICAgICAgICBzdG9wQXRGcmFtZSA9IDA7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgc3RvcHBlZCA9IGZhbHNlOworICAgIC8vIFRoZXNlIGNvdW50ZXJzIGFyZSByZWFkIGFuZCB3cml0dGVuIGJ5IHRoZSBjYWxsYmFjayBhbmQgdGhlIG1haW4gdGhyZWFkLgorICAgIHN0ZDo6YXRvbWljPGludDMyX3Q+IGZyYW1lc1JlYWR7fTsKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiBzdGFydGluZ0ZyYW1lc1JlYWR7fTsKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiBmcmFtZXNDYWxsZWR7fTsKKyAgICBzdGQ6OmF0b21pYzxpbnQzMl90PiBjYWxsYmFja0NvdW50e307CisgICAgc3RkOjphdG9taWM8aW50MzJfdD4gY2FsbGJhY2tDb3VudEFmdGVyU3RvcHt9OworCisgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgZnJhbWVzUmVhZC5zdG9yZSgwKTsKKyAgICAgICAgc3RhcnRpbmdGcmFtZXNSZWFkLnN0b3JlKDApOworICAgICAgICBmcmFtZXNDYWxsZWQuc3RvcmUoMCk7CisgICAgICAgIGNhbGxiYWNrQ291bnQuc3RvcmUoMCk7CisgICAgICAgIGNhbGxiYWNrQ291bnRBZnRlclN0b3Auc3RvcmUoMCk7CisgICAgICAgIHN0b3BwZWQgPSBmYWxzZTsKKyAgICB9Cit9OworCisvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgorc3RhdGljIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IHNfbXlEYXRhQ2FsbGJhY2tQcm9jKAorICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgIHZvaWQgKmF1ZGlvRGF0YSwKKyAgICAgICAgaW50MzJfdCBudW1GcmFtZXMKKykgeworICAgICh2b2lkKSBhdWRpb0RhdGE7CisgICAgKHZvaWQpIG51bUZyYW1lczsKKyAgICBBdWRpb0VuZ2luZSAqZW5naW5lID0gKHN0cnVjdCBBdWRpb0VuZ2luZSAqKXVzZXJEYXRhOworICAgIGVuZ2luZS0+Y2FsbGJhY2tDb3VudCsrOworICAgIGlmIChlbmdpbmUtPnN0b3BwZWQpIHsKKyAgICAgICAgZW5naW5lLT5jYWxsYmFja0NvdW50QWZ0ZXJTdG9wKys7CisgICAgfQorCisgICAgZW5naW5lLT5mcmFtZXNSZWFkID0gKGludDMyX3QpQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoc3RyZWFtKTsKKyAgICBpZiAoZW5naW5lLT5zdGFydGluZ0ZyYW1lc1JlYWQgPT0gMCkgeworICAgICAgICBlbmdpbmUtPnN0YXJ0aW5nRnJhbWVzUmVhZC5zdG9yZShlbmdpbmUtPmZyYW1lc1JlYWQubG9hZCgpKTsKKyAgICB9CisgICAgZW5naW5lLT5mcmFtZXNDYWxsZWQgKz0gbnVtRnJhbWVzOworICAgIGlmIChlbmdpbmUtPmZyYW1lc0NhbGxlZCA+PSBlbmdpbmUtPnN0b3BBdEZyYW1lKSB7CisgICAgICAgIGVuZ2luZS0+c3RvcHBlZCA9IHRydWU7CisgICAgICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEFBVURJT19DQUxMQkFDS19SRVNVTFRfQ09OVElOVUU7CisgICAgfQorfQorCitzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IHNfT3BlbkF1ZGlvU3RyZWFtKHN0cnVjdCBBdWRpb0VuZ2luZSAqZW5naW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUpIHsKKyAgICAvLyBVc2UgYW4gQUF1ZGlvU3RyZWFtQnVpbGRlciB0byBjb250YWluIHJlcXVlc3RlZCBwYXJhbWV0ZXJzLgorICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlcigmZW5naW5lLT5idWlsZGVyKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBwcmludGYoIkFBdWRpb19jcmVhdGVTdHJlYW1CdWlsZGVyIHJldHVybmVkICVzIiwKKyAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIC8vIFJlcXVlc3Qgc3RyZWFtIHByb3BlcnRpZXMuCisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRGb3JtYXQoZW5naW5lLT5idWlsZGVyLCBBQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRQZXJmb3JtYW5jZU1vZGUoZW5naW5lLT5idWlsZGVyLCBwZXJmTW9kZSk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRTaGFyaW5nTW9kZShlbmdpbmUtPmJ1aWxkZXIsIHNoYXJpbmdNb2RlKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldERpcmVjdGlvbihlbmdpbmUtPmJ1aWxkZXIsIGRpcmVjdGlvbik7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXREYXRhQ2FsbGJhY2soZW5naW5lLT5idWlsZGVyLCBzX215RGF0YUNhbGxiYWNrUHJvYywgZW5naW5lKTsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX3NldEVycm9yQ2FsbGJhY2soZW5naW5lLT5idWlsZGVyLCBzX215RXJyb3JDYWxsYmFja1Byb2MsIGVuZ2luZSk7CisKKyAgICAvLyBDcmVhdGUgYW4gQUF1ZGlvU3RyZWFtIHVzaW5nIHRoZSBCdWlsZGVyLgorICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbUJ1aWxkZXJfb3BlblN0cmVhbShlbmdpbmUtPmJ1aWxkZXIsICZlbmdpbmUtPnN0cmVhbSk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0gcmV0dXJuZWQgJXMiLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGFhdWRpb19yZXN1bHRfdCBzX0Nsb3NlQXVkaW9TdHJlYW0oc3RydWN0IEF1ZGlvRW5naW5lICplbmdpbmUpIHsKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOworICAgIGlmIChlbmdpbmUtPnN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9jbG9zZShlbmdpbmUtPnN0cmVhbSk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBwcmludGYoIkFBdWRpb1N0cmVhbV9jbG9zZSByZXR1cm5lZCAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgfQorICAgICAgICBlbmdpbmUtPnN0cmVhbSA9IG51bGxwdHI7CisgICAgfQorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfZGVsZXRlKGVuZ2luZS0+YnVpbGRlcik7CisgICAgZW5naW5lLT5idWlsZGVyID0gbnVsbHB0cjsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0aWMgdm9pZCBzX215RXJyb3JDYWxsYmFja1Byb2MoCisgICAgICAgIEFBdWRpb1N0cmVhbSAqc3RyZWFtIF9fdW51c2VkLAorICAgICAgICB2b2lkICp1c2VyRGF0YSBfX3VudXNlZCwKKyAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IGVycm9yKSB7CisgICAgcHJpbnRmKCIlcygpIC0gZXJyb3IgPSAlZFxuIiwgX19mdW5jX18sIGVycm9yKTsKK30KKworc3RhdGljIHZvaWQgc191c2FnZSgpIHsKKyAgICBwcmludGYoInRlc3RfcmV0dXJuX3N0b3AgWy1pXSBbLXhdIFstbl0gWy1jXVxuIik7CisgICAgcHJpbnRmKCIgICAgIC1pIGRpcmVjdGlvbiBJTlBVVCwgb3RoZXJ3aXNlIE9VVFBVVFxuIik7CisgICAgcHJpbnRmKCIgICAgIC14IHNoYXJpbmcgbW9kZSBFWENMVVNJVkUsIG90aGVyd2lzZSBTSEFSRURcbiIpOworICAgIHByaW50ZigiICAgICAtbiBwZXJmb3JtYW5jZSBtb2RlIE5PTkUsIG90aGVyd2lzZSBMT1dfTEFURU5DWVxuIik7CisgICAgcHJpbnRmKCIgICAgIC1jIGFsd2F5cyByZXR1cm4gQ09OVElOVUUgZnJvbSBjYWxsYmFjaywgbm90IFNUT1BcbiIpOworfQorCisvKioKKyAqIEByZXR1cm4gMCBpcyBPSywgLTEgZm9yIGVycm9yCisgKi8KK3N0YXRpYyBpbnQgc19jaGVja0VuZ2luZVBvc2l0aW9ucyhBdWRpb0VuZ2luZSAqZW5naW5lKSB7CisgICAgY29uc3QgaW50NjRfdCBmcmFtZXNSZWFkID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1JlYWQoZW5naW5lLT5zdHJlYW0pOworICAgIGNvbnN0IGludDY0X3QgZnJhbWVzV3JpdHRlbiA9IEFBdWRpb1N0cmVhbV9nZXRGcmFtZXNXcml0dGVuKGVuZ2luZS0+c3RyZWFtKTsKKyAgICBjb25zdCBpbnQzMl90IGRlbHRhID0gKGludDMyX3QpKGZyYW1lc1dyaXR0ZW4gLSBmcmFtZXNSZWFkKTsKKyAgICBwcmludGYoInBsYXlpbmcgZnJhbWVzUmVhZCA9ICU3ZCwgZnJhbWVzV3JpdHRlbiA9ICU3ZCIKKyAgICAgICAgICAgIiwgZGVsdGEgPSAlNGQsIGZyYW1lc0NhbGxlZCA9ICU2ZCwgY2FsbGJhY2tDb3VudCA9ICU0ZFxuIiwKKyAgICAgICAgICAgKGludDMyX3QpIGZyYW1lc1JlYWQsCisgICAgICAgICAgIChpbnQzMl90KSBmcmFtZXNXcml0dGVuLAorICAgICAgICAgICBkZWx0YSwKKyAgICAgICAgICAgZW5naW5lLT5mcmFtZXNDYWxsZWQubG9hZCgpLAorICAgICAgICAgICBlbmdpbmUtPmNhbGxiYWNrQ291bnQubG9hZCgpCisgICAgKTsKKyAgICBpZiAoZGVsdGEgPiBBQXVkaW9TdHJlYW1fZ2V0QnVmZmVyQ2FwYWNpdHlJbkZyYW1lcyhlbmdpbmUtPnN0cmVhbSkpIHsKKyAgICAgICAgcHJpbnRmKCJFUlJPUiAtIGRlbHRhID4gY2FwYWNpdHlcbiIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICAodm9pZCkgYXJnYzsKKyAgICAodm9pZCkgYXJndjsKKyAgICBzdHJ1Y3QgQXVkaW9FbmdpbmUgZW5naW5lOworICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOworICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZk1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9MT1dfTEFURU5DWTsKKyAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uID0gQUFVRElPX0RJUkVDVElPTl9PVVRQVVQ7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICBib29sIGFsd2F5c0NvbnRpbnVlID0gZmFsc2U7CisgICAgaW50IGVycm9yQ291bnQgPSAwOworICAgIGludCBjYWxsYmFja1Jlc3VsdCA9IEVYSVRfU1VDQ0VTUzsKKworICAgIC8vIE1ha2UgcHJpbnRmIHByaW50IGltbWVkaWF0ZWx5IHNvIHRoYXQgZGVidWcgaW5mbyBpcyBub3Qgc3R1Y2sKKyAgICAvLyBpbiBhIGJ1ZmZlciBpZiB3ZSBoYW5nIG9yIGNyYXNoLgorICAgIHNldHZidWYoc3Rkb3V0LCBudWxscHRyLCBfSU9OQkYsIChzaXplX3QpIDApOworCisgICAgcHJpbnRmKCJUZXN0IFJldHVybiBTdG9wIFYxLjBcbiIpOworICAgIHByaW50ZigiV2FpdCBmb3IgYSBmZXcgc2Vjb25kcy5cbiIpOworICAgIHByaW50ZigiWW91IHNob3VsZCBzZWUgY2FsbGJhY2tDb3VudCBhbmQgZnJhbWVzUmVhZCBzdG9wIGFkdmFuY2luZ1xuIik7CisgICAgcHJpbnRmKCJ3aGVuIGNhbGxiYWNrQ291bnQgcmVhY2hlcyAlZCBtc2VjXG4iLCBTVE9QX0FUX01TRUMpOworICAgIHByaW50ZigiXG4iKTsKKworICAgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmFyZyA9IGFyZ3ZbaV07CisgICAgICAgIGlmIChhcmdbMF0gPT0gJy0nKSB7CisgICAgICAgICAgICBjaGFyIG9wdGlvbiA9IGFyZ1sxXTsKKyAgICAgICAgICAgIHN3aXRjaCAob3B0aW9uKSB7CisgICAgICAgICAgICAgICAgY2FzZSAnYyc6CisgICAgICAgICAgICAgICAgICAgIGFsd2F5c0NvbnRpbnVlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAnaSc6CisgICAgICAgICAgICAgICAgICAgIGRpcmVjdGlvbiA9IEFBVURJT19ESVJFQ1RJT05fSU5QVVQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ24nOgorICAgICAgICAgICAgICAgICAgICBwZXJmTW9kZSA9IEFBVURJT19QRVJGT1JNQU5DRV9NT0RFX05PTkU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgJ3gnOgorICAgICAgICAgICAgICAgICAgICBzaGFyaW5nTW9kZSA9IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBzX3VzYWdlKCk7CisgICAgICAgICAgICAgICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzX3VzYWdlKCk7CisgICAgICAgICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlc3VsdCA9IHNfT3BlbkF1ZGlvU3RyZWFtKCZlbmdpbmUsIGRpcmVjdGlvbiwgc2hhcmluZ01vZGUsIHBlcmZNb2RlKTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBwcmludGYoInNfT3BlbkF1ZGlvU3RyZWFtIHJldHVybmVkICVzXG4iLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CisgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICB9CisKKyAgICBpbnQzMl90IGZyYW1lc1BlckJ1cnN0ID0gQUF1ZGlvU3RyZWFtX2dldEZyYW1lc1BlckJ1cnN0KGVuZ2luZS5zdHJlYW0pOworICAgIC8vIFVzZSBkb3VibGUgYnVmZmVyZWQgc3RyZWFtLgorICAgIGNvbnN0IGludDMyX3QgYnVmZmVyU2l6ZSA9IEFBdWRpb1N0cmVhbV9zZXRCdWZmZXJTaXplSW5GcmFtZXMoZW5naW5lLnN0cmVhbSwgMiAqIGZyYW1lc1BlckJ1cnN0KTsKKyAgICBpZiAoYnVmZmVyU2l6ZSA8IDApIHsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fc2V0QnVmZmVyU2l6ZUluRnJhbWVzIHJldHVybmVkICVzXG4iLAorICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQoYnVmZmVyU2l6ZSkpOworICAgICAgICBlcnJvckNvdW50Kys7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdG8gc2VlIHdoYXQga2luZCBvZiBzdHJlYW0gd2UgYWN0dWFsbHkgZ290LgorICAgIGludDMyX3QgZGV2aWNlSWQgPSBBQXVkaW9TdHJlYW1fZ2V0RGV2aWNlSWQoZW5naW5lLnN0cmVhbSk7CisgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBhY3R1YWxQZXJmTW9kZSA9IEFBdWRpb1N0cmVhbV9nZXRQZXJmb3JtYW5jZU1vZGUoZW5naW5lLnN0cmVhbSk7CisgICAgcHJpbnRmKCItLS0tLS0tLSBvcGVuZWQ6IGRldmljZUlkID0gJTNkLCBmcmFtZXNQZXJCdXJzdCA9ICUzZCwgcGVyZk1vZGUgPSAlZFxuIiwKKyAgICAgICAgICAgZGV2aWNlSWQsIGZyYW1lc1BlckJ1cnN0LCBhY3R1YWxQZXJmTW9kZSk7CisKKyAgICAvLyBDYWxjdWxhdGUgaG93IG1hbnkgY2FsbGJhY2tzIG5lZWRlZC4KKyAgICBpZiAoYWx3YXlzQ29udGludWUpIHsKKyAgICAgICAgZW5naW5lLnN0b3BBdEZyYW1lID0gSU5UMzJfTUFYOworICAgIH0gZWxzZSB7CisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IEFBdWRpb1N0cmVhbV9nZXRTYW1wbGVSYXRlKGVuZ2luZS5zdHJlYW0pOworICAgICAgICBlbmdpbmUuc3RvcEF0RnJhbWUgPSBTVE9QX0FUX01TRUMgKiBzYW1wbGVSYXRlIC8gMTAwMDsKKyAgICB9CisKKyAgICBmb3IgKGludCBsb29wcyA9IDA7IGxvb3BzIDwgMiAmJiByZXN1bHQgPT0gQUFVRElPX09LOyBsb29wcysrKSB7CisgICAgICAgIGVuZ2luZS5yZXNldCgpOworCisgICAgICAgIC8vIFN0YXJ0IHN0cmVhbS4KKyAgICAgICAgcmVzdWx0ID0gQUF1ZGlvU3RyZWFtX3JlcXVlc3RTdGFydChlbmdpbmUuc3RyZWFtKTsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KCkgcmV0dXJuZWQgJWQgPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PlxuIiwgcmVzdWx0KTsKKyAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgIGNvbnN0IGludCB3YXRjaExvb3BzID0gTE9PUF9EVVJBVElPTl9NU0VDIC8gU0xFRVBfRFVSQVRJT05fTVNFQzsKKyAgICAgICAgICAgIGZvciAoaW50IGkgPSB3YXRjaExvb3BzOyBpID4gMDsgaS0tKSB7CisgICAgICAgICAgICAgICAgZXJyb3JDb3VudCArPSBzX2NoZWNrRW5naW5lUG9zaXRpb25zKCZlbmdpbmUpID8gMSA6IDA7CisgICAgICAgICAgICAgICAgdXNsZWVwKFNMRUVQX0RVUkFUSU9OX01TRUMgKiAxMDAwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmdpbmUuc3RvcEF0RnJhbWUgIT0gSU5UMzJfTUFYKSB7CisgICAgICAgICAgICBjYWxsYmFja1Jlc3VsdCA9IChlbmdpbmUuY2FsbGJhY2tDb3VudEFmdGVyU3RvcCA9PSAwKSA/IEVYSVRfU1VDQ0VTUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBFWElUX0ZBSUxVUkU7CisgICAgICAgICAgICBpZiAoY2FsbGJhY2tSZXN1bHQpIHsKKyAgICAgICAgICAgICAgICBwcmludGYoIkVSUk9SIC0gQ2FsbGJhY2sgY291bnQgYWZ0ZXIgU1RPUCA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBlbmdpbmUuY2FsbGJhY2tDb3VudEFmdGVyU3RvcC5sb2FkKCkpOworICAgICAgICAgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChlbmdpbmUuc3RhcnRpbmdGcmFtZXNSZWFkLmxvYWQoKSA9PSBlbmdpbmUuZnJhbWVzUmVhZC5sb2FkKCkpIHsKKyAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBmcmFtZXNSZWFkIGRpZCBub3QgYWR2YW5jZSBhY3Jvc3MgY2FsbGJhY2tzXG4iKTsKKyAgICAgICAgICAgIGVycm9yQ291bnQrKzsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RvcChlbmdpbmUuc3RyZWFtKTsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0b3AoKSByZXR1cm5lZCAlZCA8PDw8PDw8PDw8PDw8PDw8PDw8PDxcbiIsIHJlc3VsdCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgICAgICBlcnJvckNvdW50Kys7CisgICAgICAgIH0KKyAgICAgICAgdXNsZWVwKFNMRUVQX0RVUkFUSU9OX01TRUMgKiAxMDAwKTsKKyAgICAgICAgZXJyb3JDb3VudCArPSBzX2NoZWNrRW5naW5lUG9zaXRpb25zKCZlbmdpbmUpID8gMSA6IDA7CisgICAgfQorCisgICAgc19DbG9zZUF1ZGlvU3RyZWFtKCZlbmdpbmUpOworCisgICAgcHJpbnRmKCJhYXVkaW8gcmVzdWx0ID0gJWQgPSAlc1xuIiwgcmVzdWx0LCBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICBwcmludGYoInRlc3QgJXNcbiIsIGVycm9yQ291bnQgPyAiRkFJTEVEIiA6ICJQQVNTRUQiKTsKKworICAgIHJldHVybiBlcnJvckNvdW50ID8gRVhJVF9GQUlMVVJFIDogRVhJVF9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYWF1ZGlvL3Rlc3RzL3Rlc3Rfc3RvcF9oYW5nLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3N0b3BfaGFuZy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM5N2I2YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3N0b3BfaGFuZy5jcHAKQEAgLTAsMCArMSwxNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioKKyAqIFJldHVybiBzdG9wIGZyb20gdGhlIGNhbGxiYWNrCisgKiBhbmQgdGhlbiBjbG9zZSB0aGUgc3RyZWFtIGltbWVkaWF0ZWx5LgorICovCisKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhYXVkaW8vQUF1ZGlvLmg+CisKKyNkZWZpbmUgRFVSQVRJT05fU0VDT05EUyAgIDUKKworc3RydWN0IEF1ZGlvRW5naW5lIHsKKyAgICBBQXVkaW9TdHJlYW1CdWlsZGVyICpidWlsZGVyID0gbnVsbHB0cjsKKyAgICBBQXVkaW9TdHJlYW0gICAgICAgICpzdHJlYW0gPSBudWxscHRyOworICAgIHN0ZDo6dGhyZWFkICAgICAgICAgKnRocmVhZCA9IG51bGxwdHI7CisKKyAgICBzdGQ6OmF0b21pYzxib29sPiAgIHN0YXJ0ZWR7ZmFsc2V9OworICAgIHN0ZDo6bXV0ZXggICAgICAgICAgZG9uZUxvY2s7IC8vIFVzZSBhIG11dGV4IHNvIHdlIGNhbiBzbGVlcCBvbiBpdCB3aGlsZSBqb2luKClpbmcuCisgICAgc3RkOjphdG9taWM8Ym9vbD4gICBkb25le2ZhbHNlfTsKKworICAgIGFhdWRpb19yZXN1bHRfdCBqb2luKCkgeworICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CisgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdpbGwgYmxvY2sgaWYgdGhlIHRocmVhZCBpcyBydW5uaW5nLgorICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIG11dGV4IGlzIHVzZWQgdG8gY2xvc2UoKSBpbW1lZGlhdGVseSBhZnRlciB0aGUgY2FsbGJhY2sgcmV0dXJucworICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYmVmb3JlIHRoZSByZXF1ZXN0U3RvcCgpIGlzIGNhbGxlZC4KKyAgICAgICAgICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZG9uZUxvY2spOworICAgICAgICAgICAgICAgICAgICBpZiAoZG9uZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByaW50Zigiam9pbigpIGdvdCBtdXRleCBidXQgc3RyZWFtIG5vdCBkb25lISIpOworICAgICAgICAgICAgICAgIHVzbGVlcCgxMCAqIDEwMDApOyAvLyBzbGVlcCB0aGVuIGNoZWNrIGFnYWluCisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1fY2xvc2Uoc3RyZWFtKTsKKyAgICAgICAgICAgIHN0cmVhbSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9Cit9OworCisvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgorc3RhdGljIGFhdWRpb19kYXRhX2NhbGxiYWNrX3Jlc3VsdF90IHNfbXlEYXRhQ2FsbGJhY2tQcm9jKAorICAgICAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSwKKyAgICAgICAgdm9pZCAqdXNlckRhdGEsCisgICAgICAgIHZvaWQgKmF1ZGlvRGF0YSwKKyAgICAgICAgaW50MzJfdCBudW1GcmFtZXMKKykgeworICAgICh2b2lkKSBzdHJlYW07CisgICAgKHZvaWQpIGF1ZGlvRGF0YTsKKyAgICAodm9pZCkgbnVtRnJhbWVzOworICAgIEF1ZGlvRW5naW5lICplbmdpbmUgPSAoc3RydWN0IEF1ZGlvRW5naW5lICopdXNlckRhdGE7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soZW5naW5lLT5kb25lTG9jayk7CisgICAgZW5naW5lLT5zdGFydGVkID0gdHJ1ZTsKKyAgICB1c2xlZXAoRFVSQVRJT05fU0VDT05EUyAqIDEwMDAgKiAxMDAwKTsgLy8gTWltaWMgU3ludGhNYXJrIHByb2NlZHVyZS4KKyAgICBlbmdpbmUtPmRvbmUgPSB0cnVlOworICAgIHJldHVybiBBQVVESU9fQ0FMTEJBQ0tfUkVTVUxUX1NUT1A7Cit9CisKK3N0YXRpYyB2b2lkIHNfbXlFcnJvckNhbGxiYWNrUHJvYygKKyAgICBBQXVkaW9TdHJlYW0gKnN0cmVhbSBfX3VudXNlZCwKKyAgICB2b2lkICp1c2VyRGF0YSBfX3VudXNlZCwKKyAgICBhYXVkaW9fcmVzdWx0X3QgZXJyb3IpIHsKKyAgICBwcmludGYoIiVzKCkgLSBlcnJvciA9ICVkXG4iLCBfX2Z1bmNfXywgZXJyb3IpOworfQorCitzdGF0aWMgYWF1ZGlvX3Jlc3VsdF90IHNfT3BlbkF1ZGlvU3RyZWFtKHN0cnVjdCBBdWRpb0VuZ2luZSAqZW5naW5lKSB7CisgICAgLy8gVXNlIGFuIEFBdWRpb1N0cmVhbUJ1aWxkZXIgdG8gY29udGFpbiByZXF1ZXN0ZWQgcGFyYW1ldGVycy4KKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvX2NyZWF0ZVN0cmVhbUJ1aWxkZXIoJmVuZ2luZS0+YnVpbGRlcik7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcHJpbnRmKCJBQXVkaW9fY3JlYXRlU3RyZWFtQnVpbGRlciByZXR1cm5lZCAlcyIsCisgICAgICAgICAgICAgICBBQXVkaW9fY29udmVydFJlc3VsdFRvVGV4dChyZXN1bHQpKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisKKyAgICAvLyBSZXF1ZXN0IHN0cmVhbSBwcm9wZXJ0aWVzLgorICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0UGVyZm9ybWFuY2VNb2RlKGVuZ2luZS0+YnVpbGRlciwgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1kpOworICAgIEFBdWRpb1N0cmVhbUJ1aWxkZXJfc2V0RGF0YUNhbGxiYWNrKGVuZ2luZS0+YnVpbGRlciwgc19teURhdGFDYWxsYmFja1Byb2MsIGVuZ2luZSk7CisgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9zZXRFcnJvckNhbGxiYWNrKGVuZ2luZS0+YnVpbGRlciwgc19teUVycm9yQ2FsbGJhY2tQcm9jLCBlbmdpbmUpOworCisgICAgLy8gQ3JlYXRlIGFuIEFBdWRpb1N0cmVhbSB1c2luZyB0aGUgQnVpbGRlci4KKyAgICByZXN1bHQgPSBBQXVkaW9TdHJlYW1CdWlsZGVyX29wZW5TdHJlYW0oZW5naW5lLT5idWlsZGVyLCAmZW5naW5lLT5zdHJlYW0pOworICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CisgICAgICAgIHByaW50ZigiQUF1ZGlvU3RyZWFtQnVpbGRlcl9vcGVuU3RyZWFtIHJldHVybmVkICVzIiwKKyAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgICh2b2lkKSBhcmdjOworICAgICh2b2lkKSBhcmd2OworICAgIHN0cnVjdCBBdWRpb0VuZ2luZSBlbmdpbmU7CisgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKKyAgICBpbnQgZXJyb3JDb3VudCA9IDA7CisKKyAgICAvLyBNYWtlIHByaW50ZiBwcmludCBpbW1lZGlhdGVseSBzbyB0aGF0IGRlYnVnIGluZm8gaXMgbm90IHN0dWNrCisgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KKyAgICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTkJGLCAoc2l6ZV90KSAwKTsKKworICAgIHByaW50ZigiVGVzdCBSZXR1cm4gU3RvcCBIYW5nIFYxLjBcbiIpOworCisgICAgcmVzdWx0ID0gc19PcGVuQXVkaW9TdHJlYW0oJmVuZ2luZSk7CisgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgcHJpbnRmKCJzX09wZW5BdWRpb1N0cmVhbSByZXR1cm5lZCAlc1xuIiwKKyAgICAgICAgICAgICAgIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgICAgICBlcnJvckNvdW50Kys7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdG8gc2VlIHdoYXQga2luZCBvZiBzdHJlYW0gd2UgYWN0dWFsbHkgZ290LgorICAgIGludDMyX3QgZGV2aWNlSWQgPSBBQXVkaW9TdHJlYW1fZ2V0RGV2aWNlSWQoZW5naW5lLnN0cmVhbSk7CisgICAgYWF1ZGlvX3BlcmZvcm1hbmNlX21vZGVfdCBhY3R1YWxQZXJmTW9kZSA9IEFBdWRpb1N0cmVhbV9nZXRQZXJmb3JtYW5jZU1vZGUoZW5naW5lLnN0cmVhbSk7CisgICAgcHJpbnRmKCItLS0tLS0tLSBvcGVuZWQ6IGRldmljZUlkID0gJTNkLCBwZXJmTW9kZSA9ICVkXG4iLCBkZXZpY2VJZCwgYWN0dWFsUGVyZk1vZGUpOworCisgICAgLy8gU3RhcnQgc3RyZWFtLgorICAgIHJlc3VsdCA9IEFBdWRpb1N0cmVhbV9yZXF1ZXN0U3RhcnQoZW5naW5lLnN0cmVhbSk7CisgICAgcHJpbnRmKCJBQXVkaW9TdHJlYW1fcmVxdWVzdFN0YXJ0KCkgcmV0dXJuZWQgJWQgPj4+Pj4+Pj4+Pj4+Pj4+Pj4+Pj4+PlxuIiwgcmVzdWx0KTsKKyAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgeworICAgICAgICBlcnJvckNvdW50Kys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOworICAgICAgICB3aGlsZSAoIWVuZ2luZS5zdGFydGVkKSB7CisgICAgICAgICAgICBwcmludGYoIldhaXRpbmcgZm9yIHN0cmVhbSB0byBzdGFydCwgJWRcbiIsIGNvdW50ZXIrKyk7CisgICAgICAgICAgICB1c2xlZXAoNSAqIDEwMDApOworICAgICAgICB9CisgICAgICAgIHByaW50ZigiWW91IHNob3VsZCBzZWUgbW9yZSBtZXNzYWdlcyAlZCBzZWNvbmRzIGFmdGVyIHRoaXMuIElmIG5vdCB0aGVuIHRoZSB0ZXN0IGZhaWxlZCFcbiIsCisgICAgICAgICAgICAgICBEVVJBVElPTl9TRUNPTkRTKTsKKyAgICAgICAgcmVzdWx0ID0gZW5naW5lLmpvaW4oKTsgLy8gVGhpcyBtaWdodCBoYW5nIQorICAgICAgICBBQXVkaW9TdHJlYW1CdWlsZGVyX2RlbGV0ZShlbmdpbmUuYnVpbGRlcik7CisgICAgICAgIGVuZ2luZS5idWlsZGVyID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBwcmludGYoImFhdWRpbyByZXN1bHQgPSAlZCA9ICVzXG4iLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOworICAgIHByaW50ZigidGVzdCAlc1xuIiwgZXJyb3JDb3VudCA/ICJGQUlMRUQiIDogIlBBU1NFRCIpOworCisgICAgcmV0dXJuIGVycm9yQ291bnQgPyBFWElUX0ZBSUxVUkUgOiBFWElUX1NVQ0NFU1M7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhYXVkaW8vdGVzdHMvdGVzdF90aW1lc3RhbXBzLmNwcCBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3RpbWVzdGFtcHMuY3BwCmluZGV4IGRmYTc4MTUuLjdiMWRmZDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3RpbWVzdGFtcHMuY3BwCisrKyBiL21lZGlhL2xpYmFhdWRpby90ZXN0cy90ZXN0X3RpbWVzdGFtcHMuY3BwCkBAIC0zNSw2ICszNSw3IEBACiAKICNkZWZpbmUgTlVNX1NFQ09ORFMgICAgICAgICAgICAgMQogI2RlZmluZSBOVU1fTE9PUFMgICAgICAgICAgICAgICA0CisjZGVmaW5lIE1BWF9URVNUUyAgICAgICAgICAgICAgIDIwCiAKIHR5cGVkZWYgc3RydWN0IFRpbWVzdGFtcEluZm8gewogICAgIGludDY0X3QgICAgICAgICBmcmFtZXNUb3RhbDsKQEAgLTUzLDYgKzU0LDQ5IEBACiAgICAgYm9vbCAgICAgICAgICAgZm9yY2VVbmRlcnJ1bnMgPSBmYWxzZTsKIH0gVGltZXN0YW1wQ2FsbGJhY2tEYXRhX3Q7CiAKK3N0cnVjdCBUaW1lU3RhbXBUZXN0TG9nIHsKKyAgICBhYXVkaW9fcG9saWN5X3QgICAgICAgICAgIGlzTW1hcDsKKyAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3QgICAgIHNoYXJpbmdNb2RlOworICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZm9ybWFuY2VNb2RlOworICAgIGFhdWRpb19kaXJlY3Rpb25fdCAgICAgICAgZGlyZWN0aW9uOworICAgIGFhdWRpb19yZXN1bHRfdCAgICAgICAgICAgcmVzdWx0OworfTsKKworc3RhdGljIGludCBzX251bVRlc3RzID0gMDsKKy8vIFVzZSBhIHBsYWluIG9sZCBhcnJheSBiZWNhdXNlIHdlIHJlZmVyZW5jZSB0aGlzIGZyb20gdGhlIGNhbGxiYWNrIGFuZCBkbyBub3Qgd2FudCBhbnkKKy8vIGF1dG9tYXRpYyBtZW1vcnkgYWxsb2NhdGlvbi4KK3N0YXRpYyBUaW1lU3RhbXBUZXN0TG9nIHNfdGVzdExvZ3NbTUFYX1RFU1RTXXt9OworCitzdGF0aWMgdm9pZCBsb2dUZXN0UmVzdWx0KGJvb2wgaXNNbWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fc2hhcmluZ19tb2RlX3Qgc2hhcmluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19wZXJmb3JtYW5jZV9tb2RlX3QgcGVyZm9ybWFuY2VNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0KSB7CisgICAgaWYoc19udW1UZXN0cyA+PSBNQVhfVEVTVFMpIHsKKyAgICAgICAgcHJpbnRmKCJFUlJPUiAtIE1BWF9URVNUUyB0b28gc21hbGwgPSAlZFxuIiwgTUFYX1RFU1RTKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzX3Rlc3RMb2dzW3NfbnVtVGVzdHNdLmlzTW1hcCA9IGlzTW1hcDsKKyAgICBzX3Rlc3RMb2dzW3NfbnVtVGVzdHNdLnNoYXJpbmdNb2RlID0gc2hhcmluZ01vZGU7CisgICAgc190ZXN0TG9nc1tzX251bVRlc3RzXS5wZXJmb3JtYW5jZU1vZGUgPSBwZXJmb3JtYW5jZU1vZGU7CisgICAgc190ZXN0TG9nc1tzX251bVRlc3RzXS5kaXJlY3Rpb24gPSBkaXJlY3Rpb247CisgICAgc190ZXN0TG9nc1tzX251bVRlc3RzXS5yZXN1bHQgPSByZXN1bHQ7CisgICAgc19udW1UZXN0cysrOworfQorCitzdGF0aWMgdm9pZCBwcmludFRlc3RSZXN1bHRzKCkgeworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc19udW1UZXN0czsgaSsrKSB7CisgICAgICAgIFRpbWVTdGFtcFRlc3RMb2cgKmxvZyA9ICZzX3Rlc3RMb2dzW2ldOworICAgICAgICBwcmludGYoIiUyZDogbW1hcCA9ICUzcywgc2hhcmluZyA9ICU5cywgcGVyZiA9ICUxMXMsIGRpciA9ICU2cyAtLS0tICU0c1xuIiwKKyAgICAgICAgICAgICAgIGksCisgICAgICAgICAgICAgICBsb2ctPmlzTW1hcCA/ICJ5ZXMiIDogIm5vIiwKKyAgICAgICAgICAgICAgIGdldFNoYXJpbmdNb2RlVGV4dChsb2ctPnNoYXJpbmdNb2RlKSwKKyAgICAgICAgICAgICAgIGdldFBlcmZvcm1hbmNlTW9kZVRleHQobG9nLT5wZXJmb3JtYW5jZU1vZGUpLAorICAgICAgICAgICAgICAgZ2V0RGlyZWN0aW9uVGV4dChsb2ctPmRpcmVjdGlvbiksCisgICAgICAgICAgICAgICBsb2ctPnJlc3VsdCA/ICJGQUlMIiA6ICJwYXNzIik7CisgICAgfQorfQorCiAvLyBDYWxsYmFjayBmdW5jdGlvbiB0aGF0IGZpbGxzIHRoZSBhdWRpbyBvdXRwdXQgYnVmZmVyLgogYWF1ZGlvX2RhdGFfY2FsbGJhY2tfcmVzdWx0X3QgdGltZXN0YW1wRGF0YUNhbGxiYWNrUHJvYygKICAgICAgICAgQUF1ZGlvU3RyZWFtICpzdHJlYW0sCkBAIC0xMTUsNiArMTU5LDcgQEAKICAgICBpbnQzMl90IG9yaWdpbmFsQnVmZmVyU2l6ZSA9IDA7CiAgICAgaW50MzJfdCByZXF1ZXN0ZWRCdWZmZXJTaXplID0gMDsKICAgICBpbnQzMl90IGZpbmFsQnVmZmVyU2l6ZSA9IDA7CisgICAgYm9vbCAgICBpc01tYXAgPSBmYWxzZTsKICAgICBhYXVkaW9fZm9ybWF0X3QgYWN0dWFsRGF0YUZvcm1hdCA9IEFBVURJT19GT1JNQVRfUENNX0ZMT0FUOwogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBhY3R1YWxTaGFyaW5nTW9kZSA9IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEOwogICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBhY3R1YWxQZXJmb3JtYW5jZU1vZGUgPSBBQVVESU9fUEVSRk9STUFOQ0VfTU9ERV9OT05FOwpAQCAtMTI0LDcgKzE2OSw4IEBACiAKICAgICBtZW1zZXQoJnNUaW1lc3RhbXBEYXRhLCAwLCBzaXplb2Yoc1RpbWVzdGFtcERhdGEpKTsKIAotICAgIHByaW50ZigiLS0tLS0tLS0tLS0tIHRlc3RUaW1lU3RhbXBzKHBvbGljeSA9ICVkLCBzaGFyaW5nID0gJXMsIHBlcmYgPSAlcywgZGlyID0gJXMpIC0tLS0tLS0tLS0tXG4iLAorICAgIHByaW50ZigiXG49PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpOworICAgIHByaW50ZigiLS0tLS0tLS0tIHRlc3RUaW1lU3RhbXBzKHBvbGljeSA9ICVkLCBzaGFyaW5nID0gJXMsIHBlcmYgPSAlcywgZGlyID0gJXMpIC0tLS0tLS0tXG4iLAogICAgICAgICAgICBtbWFwUG9saWN5LAogICAgICAgICAgICBnZXRTaGFyaW5nTW9kZVRleHQoc2hhcmluZ01vZGUpLAogICAgICAgICAgICBnZXRQZXJmb3JtYW5jZU1vZGVUZXh0KHBlcmZvcm1hbmNlTW9kZSksCkBAIC0xNzcsOCArMjIzLDggQEAKIAogICAgIHByaW50ZigiICAgIGNoYW5zID0gJTNkLCByYXRlID0gJTZkIGZvcm1hdCA9ICVkXG4iLAogICAgICAgICAgICBhY3R1YWxDaGFubmVsQ291bnQsIGFjdHVhbFNhbXBsZVJhdGUsIGFjdHVhbERhdGFGb3JtYXQpOwotICAgIHByaW50ZigiICAgIElzIE1NQVAgdXNlZD8gJXNcbiIsIEFBdWRpb1N0cmVhbV9pc01NYXBVc2VkKGFhdWRpb1N0cmVhbSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICJ5ZXMiIDogIm5vIik7CisgICAgaXNNbWFwID0gQUF1ZGlvU3RyZWFtX2lzTU1hcFVzZWQoYWF1ZGlvU3RyZWFtKTsKKyAgICBwcmludGYoIiAgICBJcyBNTUFQIHVzZWQ/ICVzXG4iLCBpc01tYXAgPyAieWVzIiA6ICJubyIpOwogCiAgICAgLy8gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGZyYW1lcyB0aGF0IGFyZSByZWFkIGluIG9uZSBjaHVuayBieSBhIERNQSBjb250cm9sbGVyCiAgICAgLy8gb3IgYSBEU1Agb3IgYSBtaXhlci4KQEAgLTIxOCw3ICsyNjQsNyBAQAogCiAgICAgICAgIGZvciAoaW50IHNlY29uZCA9IDA7IHNlY29uZCA8IE5VTV9TRUNPTkRTOyBzZWNvbmQrKykgewogICAgICAgICAgICAgLy8gR2l2ZSBBQXVkaW8gY2FsbGJhY2sgdGltZSB0byBydW4gaW4gdGhlIGJhY2tncm91bmQuCi0gICAgICAgICAgICBzbGVlcCgxKTsKKyAgICAgICAgICAgIHVzbGVlcCgyMDAgKiAxMDAwKTsKIAogICAgICAgICAgICAgLy8gUGVyaW9kaWNhbGx5IHByaW50IHRoZSBwcm9ncmVzcyBzbyB3ZSBrbm93IGl0IGhhc24ndCBkaWVkLgogICAgICAgICAgICAgcHJpbnRmKCJmcmFtZXNXcml0dGVuID0gJWQsIFhSdW5zID0gJWRcbiIsCkBAIC0yMzQsMTggKzI4MCwyNSBAQAogICAgICAgICB9CiAKICAgICAgICAgcHJpbnRmKCJ0aW1lc3RhbXBDb3VudCA9ICVkXG4iLCBzVGltZXN0YW1wRGF0YS50aW1lc3RhbXBDb3VudCk7Ci0gICAgICAgIGludCBwcmludGVkID0gMDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzVGltZXN0YW1wRGF0YS50aW1lc3RhbXBDb3VudDsgaSsrKSB7CisgICAgICAgIGludCBwcmludGVkR29vZCA9IDA7CisgICAgICAgIGludCBwcmludGVkQmFkID0gMDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDE7IGkgPCBzVGltZXN0YW1wRGF0YS50aW1lc3RhbXBDb3VudDsgaSsrKSB7CiAgICAgICAgICAgICBUaW1lc3RhbXBJbmZvICp0aW1lc3RhbXAgPSAmc1RpbWVzdGFtcERhdGEudGltZXN0YW1wc1tpXTsKLSAgICAgICAgICAgIGJvb2wgcG9zQ2hhbmdlZCA9ICh0aW1lc3RhbXAtPnRpbWVzdGFtcFBvc2l0aW9uICE9ICh0aW1lc3RhbXAgLSAxKS0+dGltZXN0YW1wUG9zaXRpb24pOwotICAgICAgICAgICAgYm9vbCB0aW1lQ2hhbmdlZCA9ICh0aW1lc3RhbXAtPnRpbWVzdGFtcE5hbm9zICE9ICh0aW1lc3RhbXAgLSAxKS0+dGltZXN0YW1wTmFub3MpOwotICAgICAgICAgICAgaWYgKChwcmludGVkIDwgMjApICYmICgoaSA8IDEwKSB8fCBwb3NDaGFuZ2VkIHx8IHRpbWVDaGFuZ2VkKSkgewotICAgICAgICAgICAgICAgIHByaW50ZigiICAlM2QgOiBmcmFtZXMgJThsbGQsIHhmZXJkICU4bGxkIiwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT5mcmFtZXNUb3RhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT5hcHBQb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVzdGFtcC0+cmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgICAgICAgICBwcmludGYoIiwgcmVzdWx0ID0gJXNcbiIsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHRpbWVzdGFtcC0+cmVzdWx0KSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICh0aW1lc3RhbXAtPnJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgICAgICBpZiAocHJpbnRlZEJhZCA8IDUpIHsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIgICUzZCA6IGZyYW1lcyAlOGxsZCwgeGZlcmQgJThsbGQsIHJlc3VsdCA9ICVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVzdGFtcC0+ZnJhbWVzVG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSB0aW1lc3RhbXAtPmFwcFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQodGltZXN0YW1wLT5yZXN1bHQpKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlZEJhZCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29uc3QgYm9vbCBwb3NDaGFuZ2VkID0gKHRpbWVzdGFtcC0+dGltZXN0YW1wUG9zaXRpb24gIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRpbWVzdGFtcCAtIDEpLT50aW1lc3RhbXBQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgY29uc3QgYm9vbCB0aW1lQ2hhbmdlZCA9ICh0aW1lc3RhbXAtPnRpbWVzdGFtcE5hbm9zCisgICAgICAgICAgICAgICAgICAgICAgICAhPSAodGltZXN0YW1wIC0gMSktPnRpbWVzdGFtcE5hbm9zKTsKKyAgICAgICAgICAgICAgICBpZiAoKHByaW50ZWRHb29kIDwgMjApICYmIChwb3NDaGFuZ2VkIHx8IHRpbWVDaGFuZ2VkKSkgewogICAgICAgICAgICAgICAgICAgICBib29sIG5lZ2F0aXZlID0gdGltZXN0YW1wLT50aW1lc3RhbXBQb3NpdGlvbiA8IDA7CiAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmV0cm8gPSAoaSA+IDAgJiYgKHRpbWVzdGFtcC0+dGltZXN0YW1wUG9zaXRpb24gPAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGltZXN0YW1wIC0gMSktPnRpbWVzdGFtcFBvc2l0aW9uKSk7CkBAIC0yNTMsMTcgKzMwNiwzOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAocmV0cm8gPyAiICA8PSBSRVRST0dSQURFISIgOiAiIik7CiAKICAgICAgICAgICAgICAgICAgICAgZG91YmxlIGxhdGVuY3kgPSBjYWxjdWxhdGVMYXRlbmN5TWlsbGlzKHRpbWVzdGFtcC0+dGltZXN0YW1wUG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnRpbWVzdGFtcE5hbm9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5hcHBQb3NpdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+YXBwTmFub3NlY29uZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxTYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIsIFNUQU1QOiBwb3MgPSAlOGxsZCwgbmFub3MgPSAlOGxsZCwgbGF0ID0gJTcuMWYgbXNlYyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dGltZXN0YW1wTmFub3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPmFwcFBvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5hcHBOYW5vc2Vjb25kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdHVhbFNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiAgJTNkIDogZnJhbWVzICU4bGxkLCB4ZmVyZCAlOGxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT5mcmFtZXNUb3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIHRpbWVzdGFtcC0+YXBwUG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBwcmludGYoIiBTVEFNUDogcG9zID0gJThsbGQsIG5hbm9zID0gJThsbGQsIGxhdCA9ICU3LjFmIG1zZWMgJXNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSB0aW1lc3RhbXAtPnRpbWVzdGFtcFBvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykgdGltZXN0YW1wLT50aW1lc3RhbXBOYW5vcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlKTsKKyAgICAgICAgICAgICAgICAgICAgcHJpbnRlZEdvb2QrKzsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcHJpbnRlZCsrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKHByaW50ZWRHb29kID09IDApIHsKKyAgICAgICAgICAgIHByaW50ZigiRVJST1IgLSBBQXVkaW9TdHJlYW1fZ2V0VGltZXN0YW1wKCkgbmV2ZXIgZ2F2ZSB1cyBhIHZhbGlkIHRpbWVzdGFtcFxuIik7CisgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfSU5URVJOQUw7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgd2UgZG8gbm90IGdldCB0aW1lc3RhbXBzIHdoZW4gc3RvcHBlZC4KKyAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb247CisgICAgICAgICAgICBpbnQ2NF90IHRpbWU7CisgICAgICAgICAgICBhYXVkaW9fcmVzdWx0X3QgdGVtcFJlc3VsdCA9IEFBdWRpb1N0cmVhbV9nZXRUaW1lc3RhbXAoYWF1ZGlvU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENMT0NLX01PTk9UT05JQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9zaXRpb24sICZ0aW1lKTsKKyAgICAgICAgICAgIGlmICh0ZW1wUmVzdWx0ICE9IEFBVURJT19FUlJPUl9JTlZBTElEX1NUQVRFKSB7CisgICAgICAgICAgICAgICAgcHJpbnRmKCJFUlJPUiAtIEFBdWRpb1N0cmVhbV9nZXRUaW1lc3RhbXAoKSBzaG91bGQgcmV0dXJuIgorICAgICAgICAgICAgICAgICAgICAgICAiIElOVkFMSURfU1RBVEUgd2hlbiBzdG9wcGVkISAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQodGVtcFJlc3VsdCkpOworICAgICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9JTlRFUk5BTDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yNzMsMTIgKzM0OCwxNCBAQAogICAgIH0KIAogZmluaXNoOgorCisgICAgbG9nVGVzdFJlc3VsdChpc01tYXAsIHNoYXJpbmdNb2RlLCBwZXJmb3JtYW5jZU1vZGUsIGRpcmVjdGlvbiwgcmVzdWx0KTsKKwogICAgIGlmIChhYXVkaW9TdHJlYW0gIT0gbnVsbHB0cikgewogICAgICAgICBBQXVkaW9TdHJlYW1fY2xvc2UoYWF1ZGlvU3RyZWFtKTsKICAgICB9CiAgICAgQUF1ZGlvU3RyZWFtQnVpbGRlcl9kZWxldGUoYWF1ZGlvQnVpbGRlcik7CiAgICAgcHJpbnRmKCJyZXN1bHQgPSAlZCA9ICVzXG4iLCByZXN1bHQsIEFBdWRpb19jb252ZXJ0UmVzdWx0VG9UZXh0KHJlc3VsdCkpOwotCiAgICAgcmV0dXJuIHJlc3VsdDsKIH0KIApAQCAtMjkyLDcgKzM2OSw3IEBACiAgICAgLy8gaW4gYSBidWZmZXIgaWYgd2UgaGFuZyBvciBjcmFzaC4KICAgICBzZXR2YnVmKHN0ZG91dCwgbnVsbHB0ciwgX0lPTkJGLCAoc2l6ZV90KSAwKTsKIAotICAgIHByaW50ZigiVGVzdCBUaW1lc3RhbXBzIFYwLjEuM1xuIik7CisgICAgcHJpbnRmKCJUZXN0IFRpbWVzdGFtcHMgVjAuMS40XG4iKTsKIAogICAgIC8vIExlZ2FjeQogICAgIGFhdWRpb19wb2xpY3lfdCBwb2xpY3kgPSBBQVVESU9fUE9MSUNZX05FVkVSOwpAQCAtMzMyLDUgKzQwOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX1BFUkZPUk1BTkNFX01PREVfTE9XX0xBVEVOQ1ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFVRElPX0RJUkVDVElPTl9PVVRQVVQpOwogCisgICAgcHJpbnRUZXN0UmVzdWx0cygpOworCiAgICAgcmV0dXJuIChyZXN1bHQgPT0gQUFVRElPX09LKSA/IEVYSVRfU1VDQ0VTUyA6IEVYSVRfRkFJTFVSRTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BbmRyb2lkLmJwCmluZGV4IGMxNmZhNmUuLmQxODEyZTYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQW5kcm9pZC5icApAQCAtMSw2ICsxLDM4IEBACiBjY19saWJyYXJ5X2hlYWRlcnMgewogICAgIG5hbWU6ICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJBdWRpb0F0dHJpYnV0ZXMuY3BwIiwKKyAgICAgICAgIkF1ZGlvUG9saWN5LmNwcCIsCisgICAgICAgICJBdWRpb1Byb2R1Y3RTdHJhdGVneS5jcHAiLAorICAgICAgICAiQXVkaW9Wb2x1bWVHcm91cC5jcHAiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKyAgICBpbmNsdWRlX2RpcnM6IFsic3lzdGVtL21lZGlhL2F1ZGlvX3V0aWxzL2luY2x1ZGUiXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIH0KIApAQCAtMjMsNyArNTUsNiBAQAogICAgICAgICAiOmxpYmF1ZGlvY2xpZW50X2FpZGwiLAogCiAgICAgICAgICJBdWRpb0VmZmVjdC5jcHAiLAotICAgICAgICAiQXVkaW9Qb2xpY3kuY3BwIiwKICAgICAgICAgIkF1ZGlvUmVjb3JkLmNwcCIsCiAgICAgICAgICJBdWRpb1N5c3RlbS5jcHAiLAogICAgICAgICAiQXVkaW9UcmFjay5jcHAiLApAQCAtMzcsMTkgKzY4LDI1IEBACiAgICAgICAgICJJRWZmZWN0Q2xpZW50LmNwcCIsCiAgICAgICAgICJUb25lR2VuZXJhdG9yLmNwcCIsCiAgICAgICAgICJQbGF5ZXJCYXNlLmNwcCIsCisgICAgICAgICJSZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXIuY3BwIiwKICAgICAgICAgIlRyYWNrUGxheWVyQmFzZS5jcHAiLAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJjdXRpbHMiLAotICAgICAgICAibGlicHJvY2Vzc2dyb3VwIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb24iLAogICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeSIsCiAgICAgICAgICJsaWJhdWRpb21hbmFnZXIiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYm5ibG9nIiwKKyAgICAgICAgImxpYnByb2Nlc3Nncm91cCIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ2aWJyYXRvciIsCiAgICAgXSwKICAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbImxpYmJpbmRlciJdLAogCkBAIC01Nyw2ICs5NCw3IEBACiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAogICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIF0sCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWyJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIl0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvQXR0cmlidXRlcy5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0F0dHJpYnV0ZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmNGJhMDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0F0dHJpYnV0ZXMuY3BwCkBAIC0wLDAgKzEsNjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvQXR0cmlidXRlcyIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQXR0cmlidXRlcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXR1c190IEF1ZGlvQXR0cmlidXRlczo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpCit7CisgICAgc3RhdHVzX3QgcmV0ID0gTk9fRVJST1I7CisgICAgbUF0dHJpYnV0ZXMuY29udGVudF90eXBlID0gc3RhdGljX2Nhc3Q8YXVkaW9fY29udGVudF90eXBlX3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOworICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gc3RhdGljX2Nhc3Q8YXVkaW9fdXNhZ2VfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgbUF0dHJpYnV0ZXMuc291cmNlID0gc3RhdGljX2Nhc3Q8YXVkaW9fc291cmNlX3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOworICAgIG1BdHRyaWJ1dGVzLmZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9fZmxhZ3NfbWFza190PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKKyAgICBjb25zdCBib29sIGhhc0ZsYXR0ZW5lZFRhZyA9IChwYXJjZWwtPnJlYWRJbnQzMigpID09IDEpOworICAgIGlmIChoYXNGbGF0dGVuZWRUYWcpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgdGFnczsKKyAgICAgICAgcmV0ID0gcGFyY2VsLT5yZWFkVXRmOEZyb21VdGYxNigmdGFncyk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjpzdHJuY3B5KG1BdHRyaWJ1dGVzLnRhZ3MsIHRhZ3MuY19zdHIoKSwgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RyY3B5KG1BdHRyaWJ1dGVzLnRhZ3MsICIiKTsKKyAgICB9CisgICAgbVN0cmVhbVR5cGUgPSBzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKKyAgICBtR3JvdXBJZCA9IHN0YXRpY19jYXN0PHZvbHVtZV9ncm91cF90PihwYXJjZWwtPnJlYWRVaW50MzIoKSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb0F0dHJpYnV0ZXM6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0Cit7CisgICAgcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSkpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihtQXR0cmlidXRlcy51c2FnZSkpOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihtQXR0cmlidXRlcy5zb3VyY2UpKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obUF0dHJpYnV0ZXMuZmxhZ3MpKTsKKyAgICBpZiAoc3RybGVuKG1BdHRyaWJ1dGVzLnRhZ3MpID09IDApIHsKKyAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKDApOworICAgIH0gZWxzZSB7CisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMigxKTsKKyAgICAgICAgcGFyY2VsLT53cml0ZVV0ZjhBc1V0ZjE2KHN0ZDo6c3RyaW5nKG1BdHRyaWJ1dGVzLnRhZ3MpKTsKKyAgICB9CisgICAgcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1TdHJlYW1UeXBlKSk7CisgICAgcGFyY2VsLT53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4obUdyb3VwSWQpKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvRWZmZWN0LmNwcAppbmRleCBiNDBmMGRiLi4yYjI1MDZjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb0VmZmVjdC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9FZmZlY3QuY3BwCkBAIC00OCwxMiArNDgsMTMgQEAKICAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgICAgICAgICAgdm9pZCogdXNlciwKICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvCisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8sCisgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlCiAgICAgICAgICAgICAgICAgKQogICAgIDogbVN0YXR1cyhOT19JTklUKSwgbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtQ29uc3RydWN0TG9jayk7Ci0gICAgbVN0YXR1cyA9IHNldCh0eXBlLCB1dWlkLCBwcmlvcml0eSwgY2JmLCB1c2VyLCBzZXNzaW9uSWQsIGlvKTsKKyAgICBtU3RhdHVzID0gc2V0KHR5cGUsIHV1aWQsIHByaW9yaXR5LCBjYmYsIHVzZXIsIHNlc3Npb25JZCwgaW8sIGRldmljZSk7CiB9CiAKIEF1ZGlvRWZmZWN0OjpBdWRpb0VmZmVjdChjb25zdCBjaGFyICp0eXBlU3RyLApAQCAtNjMsNyArNjQsOCBAQAogICAgICAgICAgICAgICAgIGVmZmVjdF9jYWxsYmFja190IGNiZiwKICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyLAogICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8KKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKKyAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UKICAgICAgICAgICAgICAgICApCiAgICAgOiBtU3RhdHVzKE5PX0lOSVQpLCBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKQogewpAQCAtODcsNyArODksNyBAQAogICAgIH0KIAogICAgIEF1dG9NdXRleCBsb2NrKG1Db25zdHJ1Y3RMb2NrKTsKLSAgICBtU3RhdHVzID0gc2V0KHBUeXBlLCBwVXVpZCwgcHJpb3JpdHksIGNiZiwgdXNlciwgc2Vzc2lvbklkLCBpbyk7CisgICAgbVN0YXR1cyA9IHNldChwVHlwZSwgcFV1aWQsIHByaW9yaXR5LCBjYmYsIHVzZXIsIHNlc3Npb25JZCwgaW8sIGRldmljZSk7CiB9CiAKIHN0YXR1c190IEF1ZGlvRWZmZWN0OjpzZXQoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKQEAgLTk2LDcgKzk4LDggQEAKICAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYsCiAgICAgICAgICAgICAgICAgdm9pZCogdXNlciwKICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvKQorICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAorICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSkKIHsKICAgICBzcDxJRWZmZWN0PiBpRWZmZWN0OwogICAgIHNwPElNZW1vcnk+IGNibGs7CkBAIC0xMDksNiArMTEyLDEwIEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKKyAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fREVWSUNFICYmIGlvICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIEFMT0dXKCJJTyBoYW5kbGUgc2hvdWxkIG5vdCBiZSBzcGVjaWZpZWQgZm9yIGRldmljZSBlZmZlY3QiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhdWRpb0ZsaW5nZXIgPT0gMCkgewogICAgICAgICBBTE9HRSgic2V0KCk6IENvdWxkIG5vdCBnZXQgYXVkaW9mbGluZ2VyIik7CkBAIC0xMzMsMTUgKzE0MCwxNyBAQAogICAgIG1DbGllbnRQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAKICAgICBpRWZmZWN0ID0gYXVkaW9GbGluZ2VyLT5jcmVhdGVFZmZlY3QoKGVmZmVjdF9kZXNjcmlwdG9yX3QgKikmbURlc2NyaXB0b3IsCi0gICAgICAgICAgICBtSUVmZmVjdENsaWVudCwgcHJpb3JpdHksIGlvLCBtU2Vzc2lvbklkLCBtT3BQYWNrYWdlTmFtZSwgbUNsaWVudFBpZCwKKyAgICAgICAgICAgIG1JRWZmZWN0Q2xpZW50LCBwcmlvcml0eSwgaW8sIG1TZXNzaW9uSWQsIGRldmljZSwgbU9wUGFja2FnZU5hbWUsIG1DbGllbnRQaWQsCiAgICAgICAgICAgICAmbVN0YXR1cywgJm1JZCwgJmVuYWJsZWQpOwogCiAgICAgaWYgKGlFZmZlY3QgPT0gMCB8fCAobVN0YXR1cyAhPSBOT19FUlJPUiAmJiBtU3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSkgewotICAgICAgICBjaGFyIHR5cGVCdWZmZXJbNjRdLCB1dWlkQnVmZmVyWzY0XTsKKyAgICAgICAgY2hhciB0eXBlQnVmZmVyWzY0XSA9IHt9LCB1dWlkQnVmZmVyWzY0XSA9IHt9OwogICAgICAgICBndWlkVG9TdHJpbmcodHlwZSwgdHlwZUJ1ZmZlciwgc2l6ZW9mKHR5cGVCdWZmZXIpKTsKICAgICAgICAgZ3VpZFRvU3RyaW5nKHV1aWQsIHV1aWRCdWZmZXIsIHNpemVvZih1dWlkQnVmZmVyKSk7CiAgICAgICAgIEFMT0dFKCJzZXQoKTogQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgZWZmZWN0ICVzIC8gJXMsIHN0YXR1czogJWQiLAotICAgICAgICAgICAgICAgIHR5cGVCdWZmZXIsIHV1aWRCdWZmZXIsIG1TdGF0dXMpOworICAgICAgICAgICAgICAgIHR5cGUgIT0gbnVsbHB0ciA/IHR5cGVCdWZmZXIgOiAiTlVMTCIsCisgICAgICAgICAgICAgICAgdXVpZCAhPSBudWxscHRyID8gdXVpZEJ1ZmZlciA6ICJOVUxMIiwKKyAgICAgICAgICAgICAgICBtU3RhdHVzKTsKICAgICAgICAgaWYgKGlFZmZlY3QgPT0gMCkgewogICAgICAgICAgICAgbVN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIH0KQEAgLTE2Nyw3ICsxNzYsNyBAQAogICAgIEFMT0dWKCJzZXQoKSAlcCBPSyBlZmZlY3Q6ICVzIGlkOiAlZCBzdGF0dXMgJWQgZW5hYmxlZCAlZCBwaWQgJWQiLCB0aGlzLCBtRGVzY3JpcHRvci5uYW1lLCBtSWQsCiAgICAgICAgICAgICBtU3RhdHVzLCBtRW5hYmxlZCwgbUNsaWVudFBpZCk7CiAKLSAgICBpZiAobVNlc3Npb25JZCA+IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgeworICAgIGlmICghYXVkaW9faXNfZ2xvYmFsX3Nlc3Npb24obVNlc3Npb25JZCkpIHsKICAgICAgICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChtU2Vzc2lvbklkLCBtQ2xpZW50UGlkKTsKICAgICB9CiAKQEAgLTE4MCw3ICsxODksNyBAQAogICAgIEFMT0dWKCJEZXN0cnVjdG9yICVwIiwgdGhpcyk7CiAKICAgICBpZiAobVN0YXR1cyA9PSBOT19FUlJPUiB8fCBtU3RhdHVzID09IEFMUkVBRFlfRVhJU1RTKSB7Ci0gICAgICAgIGlmIChtU2Vzc2lvbklkID4gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgIGlmICghYXVkaW9faXNfZ2xvYmFsX3Nlc3Npb24obVNlc3Npb25JZCkpIHsKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobVNlc3Npb25JZCwgbUNsaWVudFBpZCk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKG1JRWZmZWN0ICE9IE5VTEwpIHsKQEAgLTQzMiwxNCArNDQxLDE1IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvRWZmZWN0OjpnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3IpIC8qY29uc3QqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikKIHsKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhZi0+Z2V0RWZmZWN0RGVzY3JpcHRvcih1dWlkLCBkZXNjcmlwdG9yKTsKKyAgICByZXR1cm4gYWYtPmdldEVmZmVjdERlc2NyaXB0b3IodXVpZCwgdHlwZSwgcHJlZmVycmVkVHlwZUZsYWcsIGRlc2NyaXB0b3IpOwogfQogCi0KIHN0YXR1c190IEF1ZGlvRWZmZWN0OjpxdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKQEAgLTQ0OCw2ICs0NTgsOTUgQEAKICAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICByZXR1cm4gYXBzLT5xdWVyeURlZmF1bHRQcmVQcm9jZXNzaW5nKGF1ZGlvU2Vzc2lvbiwgZGVzY3JpcHRvcnMsIGNvdW50KTsKIH0KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6Om5ld0VmZmVjdFVuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgICppZCA9IGFmLT5uZXdBdWRpb1VuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfRUZGRUNUKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvRWZmZWN0OjphZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGNoYXIgKnR5cGVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnV1aWRTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgKmlkKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICBpZiAodHlwZVN0ciA9PSBOVUxMICYmIHV1aWRTdHIgPT0gTlVMTCkgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIC8vIENvbnZlcnQgdHlwZSAmIHV1aWQgZnJvbSBzdHJpbmcgdG8gZWZmZWN0X3V1aWRfdC4KKyAgICBlZmZlY3RfdXVpZF90IHR5cGU7CisgICAgaWYgKHR5cGVTdHIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBzdHJpbmdUb0d1aWQodHlwZVN0ciwgJnR5cGUpOworICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHR5cGUgPSAqRUZGRUNUX1VVSURfTlVMTDsKKyAgICB9CisKKyAgICBlZmZlY3RfdXVpZF90IHV1aWQ7CisgICAgaWYgKHV1aWRTdHIgIT0gTlVMTCkgeworICAgICAgICBzdGF0dXNfdCByZXMgPSBzdHJpbmdUb0d1aWQodXVpZFN0ciwgJnV1aWQpOworICAgICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOworICAgIH0gZWxzZSB7CisgICAgICAgIHV1aWQgPSAqRUZGRUNUX1VVSURfTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gYXBzLT5hZGRTb3VyY2VEZWZhdWx0RWZmZWN0KCZ0eXBlLCBvcFBhY2thZ2VOYW1lLCAmdXVpZCwgcHJpb3JpdHksIHNvdXJjZSwgaWQpOworfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6YWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBjaGFyICp0eXBlU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp1dWlkU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCAqaWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIGlmICh0eXBlU3RyID09IE5VTEwgJiYgdXVpZFN0ciA9PSBOVUxMKSByZXR1cm4gQkFEX1ZBTFVFOworCisgICAgLy8gQ29udmVydCB0eXBlICYgdXVpZCBmcm9tIHN0cmluZyB0byBlZmZlY3RfdXVpZF90LgorICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKKyAgICBpZiAodHlwZVN0ciAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHN0cmluZ1RvR3VpZCh0eXBlU3RyLCAmdHlwZSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdHlwZSA9ICpFRkZFQ1RfVVVJRF9OVUxMOworICAgIH0KKworICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKKyAgICBpZiAodXVpZFN0ciAhPSBOVUxMKSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IHN0cmluZ1RvR3VpZCh1dWlkU3RyLCAmdXVpZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHJldHVybiByZXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdXVpZCA9ICpFRkZFQ1RfVVVJRF9OVUxMOworICAgIH0KKworICAgIHJldHVybiBhcHMtPmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoJnR5cGUsIG9wUGFja2FnZU5hbWUsICZ1dWlkLCBwcmlvcml0eSwgdXNhZ2UsIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIHJldHVybiBhcHMtPnJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoaWQpOworfQorCitzdGF0dXNfdCBBdWRpb0VmZmVjdDo6cmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgcmV0dXJuIGFwcy0+cmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChpZCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdHVzX3QgQXVkaW9FZmZlY3Q6OnN0cmluZ1RvR3VpZChjb25zdCBjaGFyICpzdHIsIGVmZmVjdF91dWlkX3QgKmd1aWQpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1BvbGljeS5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1BvbGljeS5jcHAKaW5kZXggZDFmNzUyNS4uMDZmYzIzYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qb2xpY3kuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUG9saWN5LmNwcApAQCAtNDAsMTEgKzQwLDIyIEBACiBzdGF0dXNfdCBBdWRpb01peE1hdGNoQ3JpdGVyaW9uOjpyZWFkRnJvbVBhcmNlbChQYXJjZWwgKnBhcmNlbCkKIHsKICAgICBtUnVsZSA9IHBhcmNlbC0+cmVhZEludDMyKCk7Ci0gICAgaWYgKG1SdWxlID09IFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFIHx8Ci0gICAgICAgICAgICBtUnVsZSA9PSBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFKSB7Ci0gICAgICAgIG1WYWx1ZS5tVXNhZ2UgPSAoYXVkaW9fdXNhZ2VfdClwYXJjZWwtPnJlYWRJbnQzMigpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1WYWx1ZS5tU291cmNlID0gKGF1ZGlvX3NvdXJjZV90KXBhcmNlbC0+cmVhZEludDMyKCk7CisgICAgc3dpdGNoIChtUnVsZSkgeworICAgIGNhc2UgUlVMRV9NQVRDSF9BVFRSSUJVVEVfVVNBR0U6CisgICAgY2FzZSBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFOgorICAgICAgICBtVmFsdWUubVVzYWdlID0gKGF1ZGlvX3VzYWdlX3QpIHBhcmNlbC0+cmVhZEludDMyKCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgUlVMRV9NQVRDSF9BVFRSSUJVVEVfQ0FQVFVSRV9QUkVTRVQ6CisgICAgY2FzZSBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUOgorICAgICAgICBtVmFsdWUubVNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgcGFyY2VsLT5yZWFkSW50MzIoKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSVUxFX01BVENIX1VJRDoKKyAgICBjYXNlIFJVTEVfRVhDTFVERV9VSUQ6CisgICAgICAgIG1WYWx1ZS5tVWlkID0gKHVpZF90KSBwYXJjZWwtPnJlYWRJbnQzMigpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiVHJ5aW5nIHRvIGJ1aWxkIEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24gZnJvbSB1bmtub3duIHJ1bGUgJWQiLCBtUnVsZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTcwLDYgKzgxLDcgQEAKICAgICBtRGV2aWNlVHlwZSA9IChhdWRpb19kZXZpY2VzX3QpIHBhcmNlbC0+cmVhZEludDMyKCk7CiAgICAgbURldmljZUFkZHJlc3MgPSBwYXJjZWwtPnJlYWRTdHJpbmc4KCk7CiAgICAgbUNiRmxhZ3MgPSAodWludDMyX3QpcGFyY2VsLT5yZWFkSW50MzIoKTsKKyAgICBtQWxsb3dQcml2aWxlZ2VkUGxheWJhY2tDYXB0dXJlID0gcGFyY2VsLT5yZWFkQm9vbCgpOwogICAgIHNpemVfdCBzaXplID0gKHNpemVfdClwYXJjZWwtPnJlYWRJbnQzMigpOwogICAgIGlmIChzaXplID4gTUFYX0NSSVRFUklBX1BFUl9NSVgpIHsKICAgICAgICAgc2l6ZSA9IE1BWF9DUklURVJJQV9QRVJfTUlYOwpAQCAtOTMsNiArMTA1LDcgQEAKICAgICBwYXJjZWwtPndyaXRlSW50MzIobURldmljZVR5cGUpOwogICAgIHBhcmNlbC0+d3JpdGVTdHJpbmc4KG1EZXZpY2VBZGRyZXNzKTsKICAgICBwYXJjZWwtPndyaXRlSW50MzIobUNiRmxhZ3MpOworICAgIHBhcmNlbC0+d3JpdGVCb29sKG1BbGxvd1ByaXZpbGVnZWRQbGF5YmFja0NhcHR1cmUpOwogICAgIHNpemVfdCBzaXplID0gbUNyaXRlcmlhLnNpemUoKTsKICAgICBpZiAoc2l6ZSA+IE1BWF9DUklURVJJQV9QRVJfTUlYKSB7CiAgICAgICAgIHNpemUgPSBNQVhfQ1JJVEVSSUFfUEVSX01JWDsKQEAgLTExNiw0ICsxMjksNDMgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3ZvaWQgQXVkaW9NaXg6OnNldEV4Y2x1ZGVVaWQodWlkX3QgdWlkKSBjb25zdCB7CisgICAgQXVkaW9NaXhNYXRjaENyaXRlcmlvbiBjcml0OworICAgIGNyaXQubVJ1bGUgPSBSVUxFX0VYQ0xVREVfVUlEOworICAgIGNyaXQubVZhbHVlLm1VaWQgPSB1aWQ7CisgICAgbUNyaXRlcmlhLmFkZChjcml0KTsKK30KKwordm9pZCBBdWRpb01peDo6c2V0TWF0Y2hVaWQodWlkX3QgdWlkKSBjb25zdCB7CisgICAgQXVkaW9NaXhNYXRjaENyaXRlcmlvbiBjcml0OworICAgIGNyaXQubVJ1bGUgPSBSVUxFX01BVENIX1VJRDsKKyAgICBjcml0Lm1WYWx1ZS5tVWlkID0gdWlkOworICAgIG1Dcml0ZXJpYS5hZGQoY3JpdCk7Cit9CisKK2Jvb2wgQXVkaW9NaXg6Omhhc1VpZFJ1bGUoYm9vbCBtYXRjaCwgdWlkX3QgdWlkKSBjb25zdCB7CisgICAgY29uc3QgdWludDMyX3QgcnVsZSA9IG1hdGNoID8gUlVMRV9NQVRDSF9VSUQgOiBSVUxFX0VYQ0xVREVfVUlEOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNyaXRlcmlhLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtQ3JpdGVyaWFbaV0ubVJ1bGUgPT0gcnVsZQorICAgICAgICAgICAgICAgICYmIG1Dcml0ZXJpYVtpXS5tVmFsdWUubVVpZCA9PSB1aWQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb01peDo6aGFzTWF0Y2hVaWRSdWxlKCkgY29uc3QgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNyaXRlcmlhLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtQ3JpdGVyaWFbaV0ubVJ1bGUgPT0gUlVMRV9NQVRDSF9VSUQpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb01peDo6aXNEZXZpY2VBZmZpbml0eUNvbXBhdGlibGUoKSBjb25zdCB7CisgICAgcmV0dXJuICgobU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykKKyAgICAgICAgICAgICYmIChtUm91dGVGbGFncyA9PSBNSVhfUk9VVEVfRkxBR19SRU5ERVIpKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuY3BwIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlMWRmYWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1Byb2R1Y3RTdHJhdGVneS5jcHAKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Qcm9kdWN0U3RyYXRlZ3kiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXR1c190IEF1ZGlvUHJvZHVjdFN0cmF0ZWd5OjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkKK3sKKyAgICBtSWQgPSBzdGF0aWNfY2FzdDxwcm9kdWN0X3N0cmF0ZWd5X3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOworICAgIHN0YXR1c190IHJldCA9IHBhcmNlbC0+cmVhZFV0ZjhGcm9tVXRmMTYoJm1OYW1lKTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorICAgIHNpemVfdCBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlOworICAgICAgICByZXQgPSBhdHRyaWJ1dGUucmVhZEZyb21QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgbUF1ZGlvQXR0cmlidXRlcy5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzLnB1c2hfYmFjayhhdHRyaWJ1dGUpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUHJvZHVjdFN0cmF0ZWd5Ojp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdAoreworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PihtSWQpKTsKKyAgICBwYXJjZWwtPndyaXRlVXRmOEFzVXRmMTYobU5hbWUpOworICAgIHNpemVfdCBzaXplID0gbUF1ZGlvQXR0cmlidXRlcy5zaXplKCk7CisgICAgc2l6ZV90IHNpemVQb3NpdGlvbiA9IHBhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgICAgcGFyY2VsLT53cml0ZUludDMyKHNpemUpOworICAgIHNpemVfdCBmaW5hbFNpemUgPSBzaXplOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZShtQXVkaW9BdHRyaWJ1dGVzW2ldKTsKKyAgICAgICAgc3RhdHVzX3QgcmV0ID0gYXR0cmlidXRlLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcGFyY2VsLT5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICAgICAgZmluYWxTaXplLS07CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHNpemUgIT0gZmluYWxTaXplKSB7CisgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IHBhcmNlbC0+ZGF0YVBvc2l0aW9uKCk7CisgICAgICAgIHBhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKHNpemVQb3NpdGlvbik7CisgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihmaW5hbFNpemUpOworICAgICAgICBwYXJjZWwtPnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworYm9vbCBBdWRpb1Byb2R1Y3RTdHJhdGVneTo6YXR0cmlidXRlc01hdGNoZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190IHJlZkF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGNsaWVudEF0dHJpdHViZXMpCit7CisgICAgaWYgKHJlZkF0dHJpYnV0ZXMgPT0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUikgeworICAgICAgICAvLyBUaGUgZGVmYXVsdCBwcm9kdWN0IHN0cmF0ZWd5IGlzIHRoZSBzdHJhdGVneSB0aGF0IGhvbGRzIGRlZmF1bHQgYXR0cmlidXRlcyBieSBjb252ZW50aW9uLgorICAgICAgICAvLyBBbGwgYXR0cmlidXRlcyB0aGF0IGZhaWwgdG8gbWF0Y2ggd2lsbCBmb2xsb3cgdGhlIGRlZmF1bHQgc3RyYXRlZ3kgZm9yIHJvdXRpbmcuCisgICAgICAgIC8vIENob29zaW5nIHRoZSBkZWZhdWx0IG11c3QgYmUgZG9uZSBhcyBhIGZhbGxiYWNrLCB0aGUgYXR0cmlidXRlcyBtYXRjaCBzaGFsbCBub3QKKyAgICAgICAgLy8gc2VsZWN0IHRoZSBkZWZhdWx0LgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiAoKHJlZkF0dHJpYnV0ZXMudXNhZ2UgPT0gQVVESU9fVVNBR0VfVU5LTk9XTikgfHwKKyAgICAgICAgICAgIChjbGllbnRBdHRyaXR1YmVzLnVzYWdlID09IHJlZkF0dHJpYnV0ZXMudXNhZ2UpKSAmJgorICAgICAgICAgICAgKChyZWZBdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9PSBBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTikgfHwKKyAgICAgICAgICAgICAoY2xpZW50QXR0cml0dWJlcy5jb250ZW50X3R5cGUgPT0gcmVmQXR0cmlidXRlcy5jb250ZW50X3R5cGUpKSAmJgorICAgICAgICAgICAgKChyZWZBdHRyaWJ1dGVzLmZsYWdzID09IEFVRElPX0ZMQUdfTk9ORSkgfHwKKyAgICAgICAgICAgICAoY2xpZW50QXR0cml0dWJlcy5mbGFncyAhPSBBVURJT19GTEFHX05PTkUgJiYKKyAgICAgICAgICAgIChjbGllbnRBdHRyaXR1YmVzLmZsYWdzICYgcmVmQXR0cmlidXRlcy5mbGFncykgPT0gcmVmQXR0cmlidXRlcy5mbGFncykpICYmCisgICAgICAgICAgICAoKHN0cmxlbihyZWZBdHRyaWJ1dGVzLnRhZ3MpID09IDApIHx8CisgICAgICAgICAgICAgKHN0ZDo6c3RyY21wKGNsaWVudEF0dHJpdHViZXMudGFncywgcmVmQXR0cmlidXRlcy50YWdzKSA9PSAwKSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvUmVjb3JkLmNwcAppbmRleCA4ZTJkYTllLi4yNzFlMTg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9SZWNvcmQuY3BwCkBAIC0yMiw3ICsyMiwxMSBAQAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KIAorI2luY2x1ZGUgPGF1ZGlvbWFuYWdlci9BdWRpb01hbmFnZXIuaD4KKyNpbmNsdWRlIDxhdWRpb21hbmFnZXIvSUF1ZGlvTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZWNvcmQuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KQEAgLTUwLDggKzU0LDkgQEAKICAgICBzaXplX3Qgc2l6ZTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRCdWZmZXJTaXplKHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssICZzaXplKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb1N5c3RlbSBjb3VsZCBub3QgcXVlcnkgdGhlIGlucHV0IGJ1ZmZlciBzaXplIGZvciBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCAiCi0gICAgICAgICAgICAgICJjaGFubmVsTWFzayAlI3g7IHN0YXR1cyAlZCIsIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcygpOiBBdWRpb1N5c3RlbSBjb3VsZCBub3QgcXVlcnkgdGhlIGlucHV0IGJ1ZmZlciBzaXplIGZvciIKKyAgICAgICAgICAgICAgIiBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3g7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICBfX2Z1bmNfXywgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKQEAgLTU5LDggKzY0LDggQEAKICAgICAvLyBBc3N1bWVzIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KQogICAgIGlmICgoKmZyYW1lQ291bnQgPSAoc2l6ZSAqIDIpIC8gKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKSAqCiAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCkpKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJVbnN1cHBvcnRlZCBjb25maWd1cmF0aW9uOiBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3giLAotICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayk7CisgICAgICAgIEFMT0dFKCIlcygpOiBVbnN1cHBvcnRlZCBjb25maWd1cmF0aW9uOiBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3giLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTY5LDcwICs3NCwzNCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3RhdGljIHN0ZDo6c3RyaW5nIGF1ZGlvRm9ybWF0VHlwZVN0cmluZyhhdWRpb19mb3JtYXRfdCB2YWx1ZSkgewotICAgIHN0ZDo6c3RyaW5nIGZvcm1hdFR5cGU7Ci0gICAgaWYgKEZvcm1hdENvbnZlcnRlcjo6dG9TdHJpbmcodmFsdWUsIGZvcm1hdFR5cGUpKSB7Ci0gICAgICAgIHJldHVybiBmb3JtYXRUeXBlOwotICAgIH0KLSAgICBjaGFyIHJhd2J1ZmZlclsxNl07ICAvLyByb29tIGZvciAiJWQiCi0gICAgc25wcmludGYocmF3YnVmZmVyLCBzaXplb2YocmF3YnVmZmVyKSwgIiVkIiwgdmFsdWUpOwotICAgIHJldHVybiByYXdidWZmZXI7Ci19Ci0KLXN0YXRpYyBzdGQ6OnN0cmluZyBhdWRpb1NvdXJjZVN0cmluZyhhdWRpb19zb3VyY2VfdCB2YWx1ZSkgewotICAgIHN0ZDo6c3RyaW5nIHNvdXJjZTsKLSAgICBpZiAoU291cmNlVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcodmFsdWUsIHNvdXJjZSkpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZTsKLSAgICB9Ci0gICAgY2hhciByYXdidWZmZXJbMTZdOyAgLy8gcm9vbSBmb3IgIiVkIgotICAgIHNucHJpbnRmKHJhd2J1ZmZlciwgc2l6ZW9mKHJhd2J1ZmZlciksICIlZCIsIHZhbHVlKTsKLSAgICByZXR1cm4gcmF3YnVmZmVyOwotfQotCiB2b2lkIEF1ZGlvUmVjb3JkOjpNZWRpYU1ldHJpY3M6OmdhdGhlcihjb25zdCBBdWRpb1JlY29yZCAqcmVjb3JkKQogewotICAgIC8vIGtleSBmb3IgbWVkaWEgc3RhdGlzdGljcyBpcyBkZWZpbmVkIGluIHRoZSBoZWFkZXIKLSAgICAvLyBhdHRycyBmb3IgbWVkaWEgc3RhdGlzdGljcwotICAgIC8vIE5COiB0aGVzZSBhcmUgbWF0Y2hlZCB3aXRoIHB1YmxpYyBKYXZhIEFQSSBjb25zdGFudHMgZGVmaW5lZAotICAgIC8vIGluIGZyYW1ld29ya3MvYmFzZS9tZWRpYS9qYXZhL2FuZHJvaWQvbWVkaWEvQXVkaW9SZWNvcmQuamF2YQotICAgIC8vIFRoZXNlIG11c3QgYmUga2VwdCBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgY29uc3RhbnRzIHRoZXJlLgotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9SZWNvcmRFbmNvZGluZ1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuZW5jb2RpbmciOwotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9SZWNvcmRTb3VyY2VbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLnNvdXJjZSI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1JlY29yZExhdGVuY3lbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmxhdGVuY3kiOwotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9SZWNvcmRTYW1wbGVSYXRlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5zYW1wbGVyYXRlIjsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUmVjb3JkQ2hhbm5lbENvdW50W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5jaGFubmVscyI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1JlY29yZENyZWF0ZWRbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmNyZWF0ZWRNcyI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1JlY29yZER1cmF0aW9uW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5kdXJhdGlvbk1zIjsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUmVjb3JkQ291bnRbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLm4iOwotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9SZWNvcmRFcnJvcltdID0gImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuZXJyY29kZSI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1JlY29yZEVycm9yRnVuY3Rpb25bXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmVycmZ1bmMiOworI2RlZmluZSBNTV9QUkVGSVggImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuIiAvLyBhdm9pZCBjdXQtbi1wYXN0ZSBlcnJvcnMuCiAKLSAgICAvLyBjb25zdHJ1Y3RvciBndWFyYW50ZWVzIG1BbmFseXRpY3NJdGVtIGlzIHZhbGlkCisgICAgLy8gSmF2YSBBUEkgMjggZW50cmllcywgZG8gbm90IGNoYW5nZS4KKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggImVuY29kaW5nIiwgdG9TdHJpbmcocmVjb3JkLT5tRm9ybWF0KS5jX3N0cigpKTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggInNvdXJjZSIsIHRvU3RyaW5nKHJlY29yZC0+bUF0dHJpYnV0ZXMuc291cmNlKS5jX3N0cigpKTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJsYXRlbmN5IiwgKGludDMyX3QpcmVjb3JkLT5tTGF0ZW5jeSk7IC8vIGJhZCBlc3RpbWF0ZS4KKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJzYW1wbGVyYXRlIiwgKGludDMyX3QpcmVjb3JkLT5tU2FtcGxlUmF0ZSk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAiY2hhbm5lbHMiLCAoaW50MzJfdClyZWNvcmQtPm1DaGFubmVsQ291bnQpOwogCi0gICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtBdWRpb1JlY29yZExhdGVuY3ksIHJlY29yZC0+bUxhdGVuY3kpOwotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQXVkaW9SZWNvcmRTYW1wbGVSYXRlLCByZWNvcmQtPm1TYW1wbGVSYXRlKTsKLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0F1ZGlvUmVjb3JkQ2hhbm5lbENvdW50LCByZWNvcmQtPm1DaGFubmVsQ291bnQpOwotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1JlY29yZEVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0VHlwZVN0cmluZyhyZWNvcmQtPm1Gb3JtYXQpLmNfc3RyKCkpOwotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1JlY29yZFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1NvdXJjZVN0cmluZyhyZWNvcmQtPm1BdHRyaWJ1dGVzLnNvdXJjZSkuY19zdHIoKSk7CisgICAgLy8gTm9uLUFQSSBlbnRyaWVzLCB0aGVzZSBjYW4gY2hhbmdlLgorICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggInBvcnRJZCIsIChpbnQzMl90KXJlY29yZC0+bVBvcnRJZCk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAiZnJhbWVDb3VudCIsIChpbnQzMl90KXJlY29yZC0+bUZyYW1lQ291bnQpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAiYXR0cmlidXRlcyIsIHRvU3RyaW5nKHJlY29yZC0+bUF0dHJpYnV0ZXMpLmNfc3RyKCkpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChNTV9QUkVGSVggImNoYW5uZWxNYXNrIiwgKGludDY0X3QpcmVjb3JkLT5tQ2hhbm5lbE1hc2spOwogCi0gICAgLy8gbG9nIHRvdGFsIGR1cmF0aW9uIHJlY29yZGluZywgaW5jbHVkaW5nIGFueXRoaW5nIGN1cnJlbnRseSBydW5uaW5nIFthbmQgY291bnRdLgotICAgIG5zZWNzX3QgYWN0aXZlID0gMDsKKyAgICAvLyBsb2cgdG90YWwgZHVyYXRpb24gcmVjb3JkaW5nLCBpbmNsdWRpbmcgYW55dGhpbmcgY3VycmVudGx5IHJ1bm5pbmcuCisgICAgaW50NjRfdCBhY3RpdmVOcyA9IDA7CiAgICAgaWYgKG1TdGFydGVkTnMgIT0gMCkgewotICAgICAgICBhY3RpdmUgPSBzeXN0ZW1UaW1lKCkgLSBtU3RhcnRlZE5zOworICAgICAgICBhY3RpdmVOcyA9IHN5c3RlbVRpbWUoKSAtIG1TdGFydGVkTnM7CiAgICAgfQotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrQXVkaW9SZWNvcmREdXJhdGlvbiwgKG1EdXJhdGlvbk5zICsgYWN0aXZlKSAvICgxMDAwICogMTAwMCkpOwotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQXVkaW9SZWNvcmRDb3VudCwgbUNvdW50KTsKLQotICAgIC8vIFhYWCBJIGRvbid0IGtub3cgdGhhdCB0aGlzIGFkZHMgYSBsb3Qgb2YgdmFsdWUsIGxvbmcgdGVybQotICAgIGlmIChtQ3JlYXRlZE5zICE9IDApIHsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtBdWRpb1JlY29yZENyZWF0ZWQsIG1DcmVhdGVkTnMgLyAoMTAwMCAqIDEwMDApKTsKLSAgICB9CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggImR1cmF0aW9uTXMiLCAobUR1cmF0aW9uTnMgKyBhY3RpdmVOcykgKiAxZS02KTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoTU1fUFJFRklYICJzdGFydENvdW50IiwgKGludDY0X3QpbUNvdW50KTsKIAogICAgIGlmIChtTGFzdEVycm9yICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQXVkaW9SZWNvcmRFcnJvciwgbUxhc3RFcnJvcik7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1JlY29yZEVycm9yRnVuY3Rpb24sIG1MYXN0RXJyb3JGdW5jLmNfc3RyKCkpOworICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJsYXN0RXJyb3IuY29kZSIsIChpbnQzMl90KW1MYXN0RXJyb3IpOworICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggImxhc3RFcnJvci5hdCIsIG1MYXN0RXJyb3JGdW5jLmNfc3RyKCkpOwogICAgIH0KIH0KIApAQCAtMTUyLDcgKzEyMSw5IEBACiAgICAgOiBtQWN0aXZlKGZhbHNlKSwgbVN0YXR1cyhOT19JTklUKSwgbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSksCiAgICAgICBtU2Vzc2lvbklkKEFVRElPX1NFU1NJT05fQUxMT0NBVEUpLAogICAgICAgbVByZXZpb3VzUHJpb3JpdHkoQU5EUk9JRF9QUklPUklUWV9OT1JNQUwpLCBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXAoU1BfREVGQVVMVCksCi0gICAgICBtU2VsZWN0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwgbVJvdXRlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpCisgICAgICBtU2VsZWN0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwgbVJvdXRlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAorICAgICAgbVNlbGVjdGVkTWljRGlyZWN0aW9uKE1JQ19ESVJFQ1RJT05fVU5TUEVDSUZJRUQpLAorICAgICAgbVNlbGVjdGVkTWljRmllbGREaW1lbnNpb24oTUlDX0ZJRUxEX0RJTUVOU0lPTl9ERUZBVUxUKQogewogfQogCkBAIC0xNzIsNyArMTQzLDkgQEAKICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICBwaWRfdCBwaWQsCiAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsCi0gICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCkKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAorICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IHNlbGVjdGVkTWljRGlyZWN0aW9uLAorICAgICAgICBmbG9hdCBtaWNyb3Bob25lRmllbGREaW1lbnNpb24pCiAgICAgOiBtQWN0aXZlKGZhbHNlKSwKICAgICAgIG1TdGF0dXMoTk9fSU5JVCksCiAgICAgICBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwKQEAgLTE4Myw3ICsxNTYsOCBAQAogewogICAgICh2b2lkKXNldChpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgY2JmLCB1c2VyLAogICAgICAgICAgICAgbm90aWZpY2F0aW9uRnJhbWVzLCBmYWxzZSAvKnRocmVhZENhbkNhbGxKYXZhKi8sIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBmbGFncywKLSAgICAgICAgICAgIHVpZCwgcGlkLCBwQXR0cmlidXRlcywgc2VsZWN0ZWREZXZpY2VJZCk7CisgICAgICAgICAgICB1aWQsIHBpZCwgcEF0dHJpYnV0ZXMsIHNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICBzZWxlY3RlZE1pY0RpcmVjdGlvbiwgbWljcm9waG9uZUZpZWxkRGltZW5zaW9uKTsKIH0KIAogQXVkaW9SZWNvcmQ6On5BdWRpb1JlY29yZCgpCkBAIC0yMDMsMTUgKzE3NywxNSBAQAogICAgICAgICB9CiAgICAgICAgIC8vIE5vIGxvY2sgaGVyZTogd29yc3QgY2FzZSB3ZSByZW1vdmUgYSBOVUxMIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgYSBub3AKICAgICAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwICYmIG1JbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbUlucHV0KTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1JbnB1dCwgbVBvcnRJZCk7CiAgICAgICAgIH0KICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobUF1ZGlvUmVjb3JkKS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgdGhpcyk7CiAgICAgICAgIG1BdWRpb1JlY29yZC5jbGVhcigpOwogICAgICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOwogICAgICAgICBtQnVmZmVyTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICAgICAgQUxPR1YoIn5BdWRpb1JlY29yZCwgcmVsZWFzaW5nIHNlc3Npb24gaWQgJWQiLAotICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQpOworICAgICAgICBBTE9HVigiJXMoJWQpOiByZWxlYXNpbmcgc2Vzc2lvbiBpZCAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIG1TZXNzaW9uSWQpOwogICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIC0xIC8qcGlkKi8pOwogICAgIH0KIH0KQEAgLTIzMiwyMCArMjA2LDI4IEBACiAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzLAotICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQpCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBzZWxlY3RlZE1pY0RpcmVjdGlvbiwKKyAgICAgICAgZmxvYXQgbWljcm9waG9uZUZpZWxkRGltZW5zaW9uKQogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudDsKICAgICBwaWRfdCBjYWxsaW5nUGlkOwogICAgIHBpZF90IG15UGlkOwogCi0gICAgQUxPR1YoInNldCgpOiBpbnB1dFNvdXJjZSAlZCwgc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV6dSwgIgorICAgIC8vIE5vdGUgbVBvcnRJZCBpcyBub3QgdmFsaWQgdW50aWwgdGhlIHRyYWNrIGlzIGNyZWF0ZWQsIHNvIG9taXQgbVBvcnRJZCBpbiBBTE9HIGZvciBzZXQuCisgICAgQUxPR1YoIiVzKCk6IGlucHV0U291cmNlICVkLCBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXp1LCAiCiAgICAgICAgICAgIm5vdGlmaWNhdGlvbkZyYW1lcyAldSwgc2Vzc2lvbklkICVkLCB0cmFuc2ZlclR5cGUgJWQsIGZsYWdzICUjeCwgb3BQYWNrYWdlTmFtZSAlcyAiCiAgICAgICAgICAgInVpZCAlZCwgcGlkICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywKICAgICAgICAgICBpbnB1dFNvdXJjZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCBmbGFncywgU3RyaW5nOChtT3BQYWNrYWdlTmFtZSkuc3RyaW5nKCksIHVpZCwgcGlkKTsKIAorICAgIG1UcmFja2VyLnJlc2V0KG5ldyBSZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXIoKSk7CisKICAgICBtU2VsZWN0ZWREZXZpY2VJZCA9IHNlbGVjdGVkRGV2aWNlSWQ7CisgICAgbVNlbGVjdGVkTWljRGlyZWN0aW9uID0gc2VsZWN0ZWRNaWNEaXJlY3Rpb247CisgICAgbVNlbGVjdGVkTWljRmllbGREaW1lbnNpb24gPSBtaWNyb3Bob25lRmllbGREaW1lbnNpb247CiAKICAgICBzd2l0Y2ggKHRyYW5zZmVyVHlwZSkgewogICAgIGNhc2UgVFJBTlNGRVJfREVGQVVMVDoKQEAgLTI1Nyw3ICsyMzksNyBAQAogICAgICAgICBicmVhazsKICAgICBjYXNlIFRSQU5TRkVSX0NBTExCQUNLOgogICAgICAgICBpZiAoY2JmID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX0NBTExCQUNLIGJ1dCBjYmYgPT0gTlVMTCIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IFRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfQ0FMTEJBQ0sgYnV0IGNiZiA9PSBOVUxMIiwgX19mdW5jX18pOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CkBAIC0yNjYsNyArMjQ4LDcgQEAKICAgICBjYXNlIFRSQU5TRkVSX1NZTkM6CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIHRyYW5zZmVyIHR5cGUgJWQiLCB0cmFuc2ZlclR5cGUpOworICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwgX19mdW5jX18sIHRyYW5zZmVyVHlwZSk7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTI3NCw3ICsyNTYsNyBAQAogCiAgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvUmVjb3JkICE9IDAgaXMgdHJ1ZSBvbmx5IGFmdGVyIHNldCgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5CiAgICAgaWYgKG1BdWRpb1JlY29yZCAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJUcmFjayBhbHJlYWR5IGluIHVzZSIpOworICAgICAgICBBTE9HRSgiJXMoKTogVHJhY2sgYWxyZWFkeSBpbiB1c2UiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtMjg1LDggKzI2Nyw4IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gc3RyZWFtIHR5cGUgc2hvdWxkbid0IGJlIGxvb2tlZCBhdCwgdGhpcyB0cmFjayBoYXMgYXVkaW8gYXR0cmlidXRlcwogICAgICAgICBtZW1jcHkoJm1BdHRyaWJ1dGVzLCBwQXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICBBTE9HVigiQnVpbGRpbmcgQXVkaW9SZWNvcmQgd2l0aCBhdHRyaWJ1dGVzOiBzb3VyY2U9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAotICAgICAgICAgICAgICBtQXR0cmlidXRlcy5zb3VyY2UsIG1BdHRyaWJ1dGVzLmZsYWdzLCBtQXR0cmlidXRlcy50YWdzKTsKKyAgICAgICAgQUxPR1YoIiVzKCk6IEJ1aWxkaW5nIEF1ZGlvUmVjb3JkIHdpdGggYXR0cmlidXRlczogc291cmNlPSVkIGZsYWdzPTB4JXggdGFncz1bJXNdIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUF0dHJpYnV0ZXMuc291cmNlLCBtQXR0cmlidXRlcy5mbGFncywgbUF0dHJpYnV0ZXMudGFncyk7CiAgICAgfQogCiAgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOwpAQCAtMjk5LDE0ICsyODEsMTQgQEAKICAgICAvLyB2YWxpZGF0ZSBwYXJhbWV0ZXJzCiAgICAgLy8gQXVkaW9GbGluZ2VyIGNhcHR1cmUgb25seSBzdXBwb3J0cyBsaW5lYXIgUENNCiAgICAgaWYgKCFhdWRpb19pc192YWxpZF9mb3JtYXQoZm9ybWF0KSB8fCAhYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7Ci0gICAgICAgIEFMT0dFKCJGb3JtYXQgJSN4IGlzIG5vdCBsaW5lYXIgcGNtIiwgZm9ybWF0KTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEZvcm1hdCAlI3ggaXMgbm90IGxpbmVhciBwY20iLCBfX2Z1bmNfXywgZm9ybWF0KTsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CiAKICAgICBpZiAoIWF1ZGlvX2lzX2lucHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBjaGFubmVsTWFzayk7CisgICAgICAgIEFMT0dFKCIlcygpOiBJbnZhbGlkIGNoYW5uZWwgbWFzayAlI3giLCBfX2Z1bmNfXywgY2hhbm5lbE1hc2spOwogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC0zMjcsNyArMzA5LDcgQEAKICAgICAvLyBtTm90aWZpY2F0aW9uRnJhbWVzQWN0IGlzIGluaXRpYWxpemVkIGluIGNyZWF0ZVJlY29yZF9sCiAKICAgICBtU2Vzc2lvbklkID0gc2Vzc2lvbklkOwotICAgIEFMT0dWKCJzZXQoKTogbVNlc3Npb25JZCAlZCIsIG1TZXNzaW9uSWQpOworICAgIEFMT0dWKCIlcygpOiBtU2Vzc2lvbklkICVkIiwgX19mdW5jX18sIG1TZXNzaW9uSWQpOwogCiAgICAgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICBteVBpZCA9IGdldHBpZCgpOwpAQCAtMzQ2LDEzICszMjgsMTggQEAKICAgICBtQ2JmID0gY2JmOwogCiAgICAgaWYgKGNiZiAhPSBOVUxMKSB7Ci0gICAgICAgIG1BdWRpb1JlY29yZFRocmVhZCA9IG5ldyBBdWRpb1JlY29yZFRocmVhZCgqdGhpcywgdGhyZWFkQ2FuQ2FsbEphdmEpOworICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQgPSBuZXcgQXVkaW9SZWNvcmRUaHJlYWQoKnRoaXMpOwogICAgICAgICBtQXVkaW9SZWNvcmRUaHJlYWQtPnJ1bigiQXVkaW9SZWNvcmQiLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKICAgICAgICAgLy8gdGhyZWFkIGJlZ2lucyBpbiBwYXVzZWQgc3RhdGUsIGFuZCB3aWxsIG5vdCByZWZlcmVuY2UgdXMgdW50aWwgc3RhcnQoKQogICAgIH0KIAogICAgIC8vIGNyZWF0ZSB0aGUgSUF1ZGlvUmVjb3JkCi0gICAgc3RhdHVzID0gY3JlYXRlUmVjb3JkX2woMCAvKmVwb2NoKi8sIG1PcFBhY2thZ2VOYW1lKTsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgc3RhdHVzID0gY3JlYXRlUmVjb3JkX2woMCAvKmVwb2NoKi8sIG1PcFBhY2thZ2VOYW1lKTsKKyAgICB9CisKKyAgICBBTE9HVigiJXMoJWQpOiBzdGF0dXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKIAogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgaWYgKG1BdWRpb1JlY29yZFRocmVhZCAhPSAwKSB7CkBAIC0zODksNyArMzc2LDcgQEAKIAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OnN0YXJ0KEF1ZGlvU3lzdGVtOjpzeW5jX2V2ZW50X3QgZXZlbnQsIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbikKIHsKLSAgICBBTE9HVigic3RhcnQsIHN5bmMgZXZlbnQgJWQgdHJpZ2dlciBzZXNzaW9uICVkIiwgZXZlbnQsIHRyaWdnZXJTZXNzaW9uKTsKKyAgICBBTE9HVigiJXMoJWQpOiBzeW5jIGV2ZW50ICVkIHRyaWdnZXIgc2Vzc2lvbiAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCBldmVudCwgdHJpZ2dlclNlc3Npb24pOwogCiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtQWN0aXZlKSB7CkBAIC00MTUsNiArNDAyLDcgQEAKICAgICAvLyBUaGlzIGlzIGxlZ2FjeSBiZWhhdmlvci4gIFRoaXMgaXMgbm90IGRvbmUgaW4gc3RvcCgpIHRvIGF2b2lkIGEgcmFjZSBjb25kaXRpb24KICAgICAvLyB3aGVyZSB0aGUgbGFzdCBtYXJrZXIgZXZlbnQgaXMgaXNzdWVkIHR3aWNlLgogICAgIG1NYXJrZXJSZWFjaGVkID0gZmFsc2U7CisgICAgLy8gbUFjdGl2ZSBpcyBjaGVja2VkIGJ5IHJlc3RvcmVSZWNvcmRfbAogICAgIG1BY3RpdmUgPSB0cnVlOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CkBAIC00MjgsMTAgKzQxNiwxNiBAQAogICAgICAgICBzdGF0dXMgPSByZXN0b3JlUmVjb3JkX2woInN0YXJ0Iik7CiAgICAgfQogCisgICAgLy8gQ2FsbCB0aGVzZSBkaXJlY3RseSBiZWNhdXNlIHdlIGFyZSBhbHJlYWR5IGhvbGRpbmcgdGhlIGxvY2suCisgICAgbUF1ZGlvUmVjb3JkLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKG1TZWxlY3RlZE1pY0RpcmVjdGlvbik7CisgICAgbUF1ZGlvUmVjb3JkLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24obVNlbGVjdGVkTWljRmllbGREaW1lbnNpb24pOworCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBtQWN0aXZlID0gZmFsc2U7Ci0gICAgICAgIEFMT0dFKCJzdGFydCgpIHN0YXR1cyAlZCIsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IHN0YXR1cyAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMpOworICAgICAgICBtTWVkaWFNZXRyaWNzLm1hcmtFcnJvcihzdGF0dXMsIF9fRlVOQ1RJT05fXyk7CiAgICAgfSBlbHNlIHsKKyAgICAgICAgbVRyYWNrZXItPnJlY29yZGluZ1N0YXJ0ZWQoKTsKICAgICAgICAgc3A8QXVkaW9SZWNvcmRUaHJlYWQ+IHQgPSBtQXVkaW9SZWNvcmRUaHJlYWQ7CiAgICAgICAgIGlmICh0ICE9IDApIHsKICAgICAgICAgICAgIHQtPnJlc3VtZSgpOwpAQCAtNDQ0LDE2ICs0MzgsMTMgQEAKICAgICAgICAgLy8gd2UndmUgc3VjY2Vzc2Z1bGx5IHN0YXJ0ZWQsIGxvZyB0aGF0IHRpbWUKICAgICAgICAgbU1lZGlhTWV0cmljcy5sb2dTdGFydChzeXN0ZW1UaW1lKCkpOwogICAgIH0KLQotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgbU1lZGlhTWV0cmljcy5tYXJrRXJyb3Ioc3RhdHVzLCBfX0ZVTkNUSU9OX18pOwotICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCiB2b2lkIEF1ZGlvUmVjb3JkOjpzdG9wKCkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzKCVkKTogbUFjdGl2ZTolZFxuIiwgX19mdW5jX18sIG1Qb3J0SWQsIG1BY3RpdmUpOwogICAgIGlmICghbUFjdGl2ZSkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNDYxLDYgKzQ1Miw3IEBACiAgICAgbUFjdGl2ZSA9IGZhbHNlOwogICAgIG1Qcm94eS0+aW50ZXJydXB0KCk7CiAgICAgbUF1ZGlvUmVjb3JkLT5zdG9wKCk7CisgICAgbVRyYWNrZXItPnJlY29yZGluZ1N0b3BwZWQoKTsKIAogICAgIC8vIE5vdGU6IGxlZ2FjeSBoYW5kbGluZyAtIHN0b3AgZG9lcyBub3QgY2xlYXIgcmVjb3JkIG1hcmtlciBhbmQKICAgICAvLyBwZXJpb2RpYyB1cGRhdGUgcG9zaXRpb247IHdlIHVwZGF0ZSB0aG9zZSBvbiBzdGFydCgpLgpAQCAtNjMyLDggKzYyNCw4IEBACiAgICAgU3RyaW5nOCByZXN1bHQ7CiAKICAgICByZXN1bHQuYXBwZW5kKCIgQXVkaW9SZWNvcmQ6OmR1bXBcbiIpOwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgc3RhdHVzKCVkKSwgYWN0aXZlKCVkKSwgc2Vzc2lvbiBJZCglZClcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzLCBtQWN0aXZlLCBtU2Vzc2lvbklkKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGlkKCVkKSBzdGF0dXMoJWQpLCBhY3RpdmUoJWQpLCBzZXNzaW9uIElkKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qb3J0SWQsIG1TdGF0dXMsIG1BY3RpdmUsIG1TZXNzaW9uSWQpOwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgZmxhZ3MoJSN4KSwgcmVxLiBmbGFncyglI3gpLCBhdWRpbyBzb3VyY2UoJWQpXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzLCBtT3JpZ0ZsYWdzLCBtQXR0cmlidXRlcy5zb3VyY2UpOwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgZm9ybWF0KCUjeCksIGNoYW5uZWwgbWFzayglI3gpLCBjaGFubmVsIGNvdW50KCV1KSwgc2FtcGxlIHJhdGUoJXUpXG4iLApAQCAtNjQ0LDYgKzYzNiw4IEBACiAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCwgbU5vdGlmaWNhdGlvbkZyYW1lc1JlcSk7CiAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBpbnB1dCglZCksIGxhdGVuY3koJXUpLCBzZWxlY3RlZCBkZXZpY2UgSWQoJWQpLCByb3V0ZWQgZGV2aWNlIElkKCVkKVxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dCwgbUxhdGVuY3ksIG1TZWxlY3RlZERldmljZUlkLCBtUm91dGVkRGV2aWNlSWQpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgbWljIGRpcmVjdGlvbiglZCkgbWljIGZpZWxkIGRpbWVuc2lvbiglZikiLAorICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkTWljRGlyZWN0aW9uLCBtU2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbik7CiAgICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC02NzUsNyArNjY5LDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAKICAgICBpZiAoYXVkaW9GbGluZ2VyID09IDApIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgYXVkaW9mbGluZ2VyIik7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgYXVkaW9mbGluZ2VyIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtNzAyLDcgKzY5Niw4IEBACiAgICAgICAgICAgICAvLyB1c2UgY2FzZSAzOiBvYnRhaW4vcmVsZWFzZSBtb2RlCiAgICAgICAgICAgICAobVRyYW5zZmVyID09IFRSQU5TRkVSX09CVEFJTik7CiAgICAgICAgIGlmICghdXNlQ2FzZUFsbG93ZWQpIHsKLSAgICAgICAgICAgIEFMT0dXKCJBVURJT19JTlBVVF9GTEFHX0ZBU1QgZGVuaWVkLCBpbmNvbXBhdGlibGUgdHJhbnNmZXIgPSAlcyIsCisgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiBBVURJT19JTlBVVF9GTEFHX0ZBU1QgZGVuaWVkLCBpbmNvbXBhdGlibGUgdHJhbnNmZXIgPSAlcyIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUcmFuc2ZlclRvVGV4dChtVHJhbnNmZXIpKTsKICAgICAgICAgICAgIG1GbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAobUZsYWdzICYgfihBVURJT19JTlBVVF9GTEFHX0ZBU1QgfAogICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX1JBVykpOwpAQCAtNzIyLDYgKzcxNyw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaW5wdXQub3BQYWNrYWdlTmFtZSA9IG9wUGFja2FnZU5hbWU7CisgICAgaW5wdXQucmlpZCA9IG1UcmFja2VyLT5nZXRSaWlkKCk7CiAKICAgICBpbnB1dC5mbGFncyA9IG1GbGFnczsKICAgICAvLyBUaGUgbm90aWZpY2F0aW9uIGZyYW1lIGNvdW50IGlzIHRoZSBwZXJpb2QgYmV0d2VlbiBjYWxsYmFja3MsIGFzIHN1Z2dlc3RlZCBieSB0aGUgY2xpZW50CkBAIC03MzcsNyArNzMzLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSByZWNvcmQgdHJhY2ssIHN0YXR1czogJWQiLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSByZWNvcmQgdHJhY2ssIHN0YXR1czogJWQiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdHVzKTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBBTE9HX0FTU0VSVChyZWNvcmQgIT0gMCk7CkBAIC03NDcsNyArNzQ0LDggQEAKIAogICAgIG1Bd2FpdEJvb3N0ID0gZmFsc2U7CiAgICAgaWYgKG91dHB1dC5mbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgewotICAgICAgICBBTE9HSSgiQVVESU9fSU5QVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsCisgICAgICAgIEFMT0dJKCIlcyglZCk6IEFVRElPX0lOUFVUX0ZMQUdfRkFTVCBzdWNjZXNzZnVsOyBmcmFtZUNvdW50ICV6dSAtPiAlenUiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgbVJlcUZyYW1lQ291bnQsIG91dHB1dC5mcmFtZUNvdW50KTsKICAgICAgICAgbUF3YWl0Qm9vc3QgPSB0cnVlOwogICAgIH0KQEAgLTc1NywxMyArNzU1LDEzIEBACiAgICAgbVNhbXBsZVJhdGUgPSBvdXRwdXQuc2FtcGxlUmF0ZTsKIAogICAgIGlmIChvdXRwdXQuY2JsayA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGNvbnRyb2wgYmxvY2siKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogICAgIGlNZW1Qb2ludGVyID0gb3V0cHV0LmNibGsgLT5wb2ludGVyKCk7CiAgICAgaWYgKGlNZW1Qb2ludGVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayBwb2ludGVyIik7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayBwb2ludGVyIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtNzc4LDcgKzc3Niw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgYnVmZmVycyA9IG91dHB1dC5idWZmZXJzLT5wb2ludGVyKCk7CiAgICAgICAgIGlmIChidWZmZXJzID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGJ1ZmZlciBwb2ludGVyIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGJ1ZmZlciBwb2ludGVyIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtNzk3LDI2ICs3OTUsMjkgQEAKICAgICBtQ2JsayA9IGNibGs7CiAgICAgLy8gbm90ZSB0aGF0IG91dHB1dC5mcmFtZUNvdW50IGlzIHRoZSAocG9zc2libHkgcmV2aXNlZCkgdmFsdWUgb2YgbVJlcUZyYW1lQ291bnQKICAgICBpZiAob3V0cHV0LmZyYW1lQ291bnQgPCBtUmVxRnJhbWVDb3VudCB8fCAobVJlcUZyYW1lQ291bnQgPT0gMCAmJiBvdXRwdXQuZnJhbWVDb3VudCA9PSAwKSkgewotICAgICAgICBBTE9HVygiUmVxdWVzdGVkIGZyYW1lQ291bnQgJXp1IGJ1dCByZWNlaXZlZCBmcmFtZUNvdW50ICV6dSIsCisgICAgICAgIEFMT0dXKCIlcyglZCk6IFJlcXVlc3RlZCBmcmFtZUNvdW50ICV6dSBidXQgcmVjZWl2ZWQgZnJhbWVDb3VudCAlenUiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgb3V0cHV0LnBvcnRJZCwKICAgICAgICAgICAgICAgbVJlcUZyYW1lQ291bnQsICBvdXRwdXQuZnJhbWVDb3VudCk7CiAgICAgfQogCiAgICAgLy8gTWFrZSBzdXJlIHRoYXQgYXBwbGljYXRpb24gaXMgbm90aWZpZWQgd2l0aCBzdWZmaWNpZW50IG1hcmdpbiBiZWZvcmUgb3ZlcnJ1bi4KICAgICAvLyBUaGUgY29tcHV0YXRpb24gaXMgZG9uZSBvbiBzZXJ2ZXIgc2lkZS4KICAgICBpZiAobU5vdGlmaWNhdGlvbkZyYW1lc1JlcSA+IDAgJiYgb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQgIT0gbU5vdGlmaWNhdGlvbkZyYW1lc1JlcSkgewotICAgICAgICBBTE9HVygiU2VydmVyIGFkanVzdGVkIG5vdGlmaWNhdGlvbkZyYW1lcyBmcm9tICV1IHRvICV6dSBmb3IgZnJhbWVDb3VudCAlenUiLAorICAgICAgICBBTE9HVygiJXMoJWQpOiBTZXJ2ZXIgYWRqdXN0ZWQgbm90aWZpY2F0aW9uRnJhbWVzIGZyb20gJXUgdG8gJXp1IGZvciBmcmFtZUNvdW50ICV6dSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG91dHB1dC5wb3J0SWQsCiAgICAgICAgICAgICAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc1JlcSwgb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQsIG91dHB1dC5mcmFtZUNvdW50KTsKICAgICB9CiAgICAgbU5vdGlmaWNhdGlvbkZyYW1lc0FjdCA9ICh1aW50MzJfdClvdXRwdXQubm90aWZpY2F0aW9uRnJhbWVDb3VudDsKIAogICAgIC8vbUlucHV0ICE9IGlucHV0IGluY2x1ZGVzIHRoZSBjYXNlIHdoZXJlIG1JbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSBmb3IgZmlyc3QgY3JlYXRpb24KLSAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDAgJiYgbUlucHV0ICE9IG91dHB1dC5pbnB1dElkKSB7CisgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwKSB7CiAgICAgICAgIGlmIChtSW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1JbnB1dCk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtSW5wdXQsIG1Qb3J0SWQpOwogICAgICAgICB9Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG91dHB1dC5pbnB1dElkKTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgb3V0cHV0LmlucHV0SWQsIG91dHB1dC5wb3J0SWQpOwogICAgIH0KIAorICAgIG1Qb3J0SWQgPSBvdXRwdXQucG9ydElkOwogICAgIC8vIFdlIHJldGFpbiBhIGNvcHkgb2YgdGhlIEkvTyBoYW5kbGUsIGJ1dCBkb24ndCBvd24gdGhlIHJlZmVyZW5jZQogICAgIG1JbnB1dCA9IG91dHB1dC5pbnB1dElkOwogICAgIG1SZWZyZXNoUmVtYWluaW5nID0gdHJ1ZTsKQEAgLTg3Miw3ICs4NzMsNyBAQAogICAgICAgICB0aW1lb3V0LnR2X25zZWMgPSAobG9uZykgKG1zICUgMTAwMCkgKiAxMDAwMDAwOwogICAgICAgICByZXF1ZXN0ZWQgPSAmdGltZW91dDsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCB3YWl0Q291bnQgJWQiLCBfX2Z1bmNfXywgd2FpdENvdW50KTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogaW52YWxpZCB3YWl0Q291bnQgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgd2FpdENvdW50KTsKICAgICAgICAgcmVxdWVzdGVkID0gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIG9idGFpbkJ1ZmZlcihhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMIC8qZWxhcHNlZCovLCBub25Db250aWcpOwpAQCAtODgzLDcgKzg4NCw2IEBACiB7CiAgICAgLy8gcHJldmlvdXMgYW5kIG5ldyBJQXVkaW9SZWNvcmQgc2VxdWVuY2UgbnVtYmVycyBhcmUgdXNlZCB0byBkZXRlY3QgdHJhY2sgcmUtY3JlYXRpb24KICAgICB1aW50MzJfdCBvbGRTZXF1ZW5jZSA9IDA7Ci0gICAgdWludDMyX3QgbmV3U2VxdWVuY2U7CiAKICAgICBQcm94eTo6QnVmZmVyIGJ1ZmZlcjsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKQEAgLTkwMSw3ICs5MDEsNyBAQAogICAgICAgICAgICAgLy8gc3RhcnQgb2YgbG9jayBzY29wZQogICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogCi0gICAgICAgICAgICBuZXdTZXF1ZW5jZSA9IG1TZXF1ZW5jZTsKKyAgICAgICAgICAgIHVpbnQzMl90IG5ld1NlcXVlbmNlID0gbVNlcXVlbmNlOwogICAgICAgICAgICAgLy8gZGlkIHByZXZpb3VzIG9idGFpbkJ1ZmZlcigpIGZhaWwgZHVlIHRvIG1lZGlhIHNlcnZlciBkZWF0aCBvciB2b2x1bnRhcnkgaW52YWxpZGF0aW9uPwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBERUFEX09CSkVDVCkgewogICAgICAgICAgICAgICAgIC8vIHJlLWNyZWF0ZSB0cmFjaywgdW5sZXNzIHNvbWVvbmUgZWxzZSBoYXMgYWxyZWFkeSBkb25lIHNvCkBAIC05MzgsNiArOTM4LDcgQEAKICAgICBhdWRpb0J1ZmZlci0+ZnJhbWVDb3VudCA9IGJ1ZmZlci5tRnJhbWVDb3VudDsKICAgICBhdWRpb0J1ZmZlci0+c2l6ZSA9IGJ1ZmZlci5tRnJhbWVDb3VudCAqIG1GcmFtZVNpemU7CiAgICAgYXVkaW9CdWZmZXItPnJhdyA9IGJ1ZmZlci5tUmF3OworICAgIGF1ZGlvQnVmZmVyLT5zZXF1ZW5jZSA9IG9sZFNlcXVlbmNlOwogICAgIGlmIChub25Db250aWcgIT0gTlVMTCkgewogICAgICAgICAqbm9uQ29udGlnID0gYnVmZmVyLm1Ob25Db250aWc7CiAgICAgfQpAQCAtOTU4LDYgKzk1OSwxMiBAQAogICAgIGJ1ZmZlci5tUmF3ID0gYXVkaW9CdWZmZXItPnJhdzsKIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBpZiAoYXVkaW9CdWZmZXItPnNlcXVlbmNlICE9IG1TZXF1ZW5jZSkgeworICAgICAgICAvLyBUaGlzIEJ1ZmZlciBjYW1lIGZyb20gYSBkaWZmZXJlbnQgSUF1ZGlvUmVjb3JkIGluc3RhbmNlLCBzbyBpZ25vcmUgdGhlIHJlbGVhc2VCdWZmZXIKKyAgICAgICAgQUxPR0QoIiVzIGlzIG5vLW9wIGR1ZSB0byBJQXVkaW9SZWNvcmQgc2VxdWVuY2UgbWlzbWF0Y2ggJXUgIT0gJXUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBhdWRpb0J1ZmZlci0+c2VxdWVuY2UsIG1TZXF1ZW5jZSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgbUluT3ZlcnJ1biA9IGZhbHNlOwogICAgIG1Qcm94eS0+cmVsZWFzZUJ1ZmZlcigmYnVmZmVyKTsKIApAQCAtOTgxLDcgKzk4OCw4IEBACiAgICAgaWYgKHNzaXplX3QodXNlclNpemUpIDwgMCB8fCAoYnVmZmVyID09IE5VTEwgJiYgdXNlclNpemUgIT0gMCkpIHsKICAgICAgICAgLy8gc2FuaXR5LWNoZWNrLiB1c2VyIGlzIG1vc3QtbGlrZWx5IHBhc3NpbmcgYW4gZXJyb3IgY29kZSwgYW5kIGl0IHdvdWxkCiAgICAgICAgIC8vIG1ha2UgdGhlIHJldHVybiB2YWx1ZSBhbWJpZ3VvdXMgKGFjdHVhbFNpemUgdnMgZXJyb3IpLgotICAgICAgICBBTE9HRSgiQXVkaW9SZWNvcmQ6OnJlYWQoYnVmZmVyPSVwLCBzaXplPSV6dSAoJXp1KSIsIGJ1ZmZlciwgdXNlclNpemUsIHVzZXJTaXplKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKSAoYnVmZmVyPSVwLCBzaXplPSV6dSAoJXp1KSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIGJ1ZmZlciwgdXNlclNpemUsIHVzZXJTaXplKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTEwMzgsNyArMTA0Niw3IEBACiAgICAgICAgICAgICBwb2xsVXMgPDw9IDE7CiAgICAgICAgIH0gd2hpbGUgKHRyeUNvdW50ZXItLSA+IDApOwogICAgICAgICBpZiAodHJ5Q291bnRlciA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJkaWQgbm90IHJlY2VpdmUgZXhwZWN0ZWQgcHJpb3JpdHkgYm9vc3Qgb24gdGltZSIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogZGlkIG5vdCByZWNlaXZlIGV4cGVjdGVkIHByaW9yaXR5IGJvb3N0IG9uIHRpbWUiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIH0KICAgICAgICAgLy8gUnVuIGFnYWluIGltbWVkaWF0ZWx5CiAgICAgICAgIHJldHVybiAwOwpAQCAtMTE2MSw3ICsxMTY5LDggQEAKICAgICBpZiAobnMgIT0gTlNfV0hFTkVWRVIpIHsKICAgICAgICAgdGltZW91dC50dl9zZWMgPSBucyAvIDEwMDAwMDAwMDBMTDsKICAgICAgICAgdGltZW91dC50dl9uc2VjID0gbnMgJSAxMDAwMDAwMDAwTEw7Ci0gICAgICAgIEFMT0dWKCJ0aW1lb3V0ICVsZC4lMDNkIiwgdGltZW91dC50dl9zZWMsIChpbnQpIHRpbWVvdXQudHZfbnNlYyAvIDEwMDAwMDApOworICAgICAgICBBTE9HVigiJXMoJWQpOiB0aW1lb3V0ICVsZC4lMDNkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgdGltZW91dC50dl9zZWMsIChpbnQpIHRpbWVvdXQudHZfbnNlYyAvIDEwMDAwMDApOwogICAgICAgICByZXF1ZXN0ZWQgPSAmdGltZW91dDsKICAgICB9CiAKQEAgLTExNzMsMTYgKzExODIsMTggQEAKICAgICAgICAgc2l6ZV90IG5vbkNvbnRpZzsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gb2J0YWluQnVmZmVyKCZhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMLCAmbm9uQ29udGlnKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigoZXJyICE9IE5PX0VSUk9SKSAhPSAoYXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9PSAwKSwKLSAgICAgICAgICAgICAgICAib2J0YWluQnVmZmVyKCkgZXJyPSVkIGZyYW1lQ291bnQ9JXp1IiwgZXJyLCBhdWRpb0J1ZmZlci5mcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiBvYnRhaW5CdWZmZXIoKSBlcnI9JWQgZnJhbWVDb3VudD0lenUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICByZXF1ZXN0ZWQgPSAmQ2xpZW50UHJveHk6OmtOb25CbG9ja2luZzsKICAgICAgICAgc2l6ZV90IGF2YWlsID0gYXVkaW9CdWZmZXIuZnJhbWVDb3VudCArIG5vbkNvbnRpZzsKLSAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXp1ID0gJXp1ICsgJXp1IGVyciAlZCIsCi0gICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogb2J0YWluQnVmZmVyKCV1KSByZXR1cm5lZCAlenUgPSAlenUgKyAlenUgZXJyICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKGVyciA9PSBUSU1FRF9PVVQgfHwgZXJyID09IFdPVUxEX0JMT0NLIHx8IGVyciA9PSAtRUlOVFIpIHsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dFKCJFcnJvciAlZCBvYnRhaW5pbmcgYW4gYXVkaW8gYnVmZmVyLCBnaXZpbmcgdXAuIiwgZXJyKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IEVycm9yICVkIG9idGFpbmluZyBhbiBhdWRpbyBidWZmZXIsIGdpdmluZyB1cC4iLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgZXJyKTsKICAgICAgICAgICAgIHJldHVybiBOU19ORVZFUjsKICAgICAgICAgfQogCkBAIC0xMjA0LDggKzEyMTUsOCBAQAogCiAgICAgICAgIC8vIFNhbml0eSBjaGVjayBvbiByZXR1cm5lZCBzaXplCiAgICAgICAgIGlmIChzc2l6ZV90KHJlYWRTaXplKSA8IDAgfHwgcmVhZFNpemUgPiByZXFTaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgIHJlcVNpemUsIHNzaXplX3QocmVhZFNpemUpKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6ICBFVkVOVF9NT1JFX0RBVEEgcmVxdWVzdGVkICV6dSBieXRlcyBidXQgY2FsbGJhY2sgcmV0dXJuZWQgJXpkIGJ5dGVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHJlcVNpemUsIHNzaXplX3QocmVhZFNpemUpKTsKICAgICAgICAgICAgIHJldHVybiBOU19ORVZFUjsKICAgICAgICAgfQogCkBAIC0xMjY1LDcgKzEyNzYsNyBAQAogCiBzdGF0dXNfdCBBdWRpb1JlY29yZDo6cmVzdG9yZVJlY29yZF9sKGNvbnN0IGNoYXIgKmZyb20pCiB7Ci0gICAgQUxPR1coImRlYWQgSUF1ZGlvUmVjb3JkLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcygpIiwgZnJvbSk7CisgICAgQUxPR1coIiVzKCVkKTogZGVhZCBJQXVkaW9SZWNvcmQsIGNyZWF0aW5nIGEgbmV3IG9uZSBmcm9tICVzKCkiLCBfX2Z1bmNfXywgbVBvcnRJZCwgZnJvbSk7CiAgICAgKyttU2VxdWVuY2U7CiAKICAgICBjb25zdCBpbnQgSU5JVElBTF9SRVRSSUVTID0gMzsKQEAgLTEyODUsMTAgKzEyOTYsNyBAQAogICAgIG1OZXdQb3NpdGlvbiA9IHBvc2l0aW9uICsgbVVwZGF0ZVBlcmlvZDsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjcmVhdGVSZWNvcmRfbChwb3NpdGlvbiwgbU9wUGFja2FnZU5hbWUpOwogCi0gICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygiJXMoKTogY3JlYXRlUmVjb3JkX2wgZmFpbGVkLCBkbyBub3QgcmV0cnkiLCBfX2Z1bmNfXyk7Ci0gICAgICAgIHJldHJpZXMgPSAwOwotICAgIH0gZWxzZSB7CisgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewogICAgICAgICBpZiAobUFjdGl2ZSkgewogICAgICAgICAgICAgLy8gY2FsbGJhY2sgdGhyZWFkIG9yIHN5bmMgZXZlbnQgaGFzbid0IGNoYW5nZWQKICAgICAgICAgICAgIC8vIEZJWE1FIHRoaXMgZmFpbHMgaWYgd2UgaGF2ZSBhIG5ldyBBdWRpb0ZsaW5nZXIgaW5zdGFuY2UKQEAgLTEyOTksMTUgKzEzMDcsMTcgQEAKICAgICB9CiAKICAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCIlcygpIGZhaWxlZCBzdGF0dXMgJWQsIHJldHJpZXMgJWQiLCBfX2Z1bmNfXywgcmVzdWx0LCByZXRyaWVzKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogZmFpbGVkIHN0YXR1cyAlZCwgcmV0cmllcyAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCByZXN1bHQsIHJldHJpZXMpOwogICAgICAgICBpZiAoLS1yZXRyaWVzID4gMCkgeworICAgICAgICAgICAgLy8gbGVhdmUgdGltZSBmb3IgYW4gZXZlbnR1YWwgcmFjZSBjb25kaXRpb24gdG8gY2xlYXIgYmVmb3JlIHJldHJ5aW5nCisgICAgICAgICAgICB1c2xlZXAoNTAwMDAwKTsKICAgICAgICAgICAgIGdvdG8gcmV0cnk7CiAgICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCJyZXN0b3JlUmVjb3JkX2woKSBmYWlsZWQgc3RhdHVzICVkIiwgcmVzdWx0KTsKLSAgICAgICAgbUFjdGl2ZSA9IGZhbHNlOworICAgICAgICAvLyBpZiBubyByZXRyaWVzIGxlZnQsIHNldCBpbnZhbGlkIGJpdCB0byBmb3JjZSByZXN0b3JpbmcgYXQgbmV4dCBvY2Nhc2lvbgorICAgICAgICAvLyBhbmQgYXZvaWQgaW5jb25zaXN0ZW50IGFjdGl2ZSBzdGF0ZSBvbiBjbGllbnQgYW5kIHNlcnZlciBzaWRlcworICAgICAgICBpZiAobUNibGsgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19JTlZBTElELCAmbUNibGstPm1GbGFncyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMTMxNiwyMSArMTMyNiwyMSBAQAogc3RhdHVzX3QgQXVkaW9SZWNvcmQ6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaykKIHsKICAgICBpZiAoY2FsbGJhY2sgPT0gMCkgewotICAgICAgICBBTE9HVygiJXMgYWRkaW5nIE5VTEwgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogYWRkaW5nIE5VTEwgY2FsbGJhY2shIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CiAgICAgaWYgKG1EZXZpY2VDYWxsYmFjay51bnNhZmVfZ2V0KCkgPT0gY2FsbGJhY2suZ2V0KCkpIHsKLSAgICAgICAgQUxPR1coIiVzIGFkZGluZyBzYW1lIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGFkZGluZyBzYW1lIGNhbGxiYWNrISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICBpZiAobUlucHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CiAgICAgICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sgIT0gMCkgewotICAgICAgICAgICAgQUxPR1coIiVzIGNhbGxiYWNrIGFscmVhZHkgcHJlc2VudCEiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbUlucHV0KTsKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IGNhbGxiYWNrIGFscmVhZHkgcHJlc2VudCEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtSW5wdXQsIG1Qb3J0SWQpOwogICAgICAgICB9Ci0gICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1JbnB1dCk7CisgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1JbnB1dCwgbVBvcnRJZCk7CiAgICAgfQogICAgIG1EZXZpY2VDYWxsYmFjayA9IGNhbGxiYWNrOwogICAgIHJldHVybiBzdGF0dXM7CkBAIC0xMzQwLDE3ICsxMzUwLDE3IEBACiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spCiB7CiAgICAgaWYgKGNhbGxiYWNrID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzIHJlbW92aW5nIE5VTEwgY2FsbGJhY2shIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogcmVtb3ZpbmcgTlVMTCBjYWxsYmFjayEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBpZiAobURldmljZUNhbGxiYWNrLnVuc2FmZV9nZXQoKSAhPSBjYWxsYmFjay5nZXQoKSkgewotICAgICAgICBBTE9HVygiJXMgcmVtb3ZpbmcgZGlmZmVyZW50IGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IHJlbW92aW5nIGRpZmZlcmVudCBjYWxsYmFjayEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgbURldmljZUNhbGxiYWNrLmNsZWFyKCk7CiAgICAgaWYgKG1JbnB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtSW5wdXQpOworICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtSW5wdXQsIG1Qb3J0SWQpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0xMzg0LDYgKzEzOTQsMzkgQEAKICAgICByZXR1cm4gbUF1ZGlvUmVjb3JkLT5nZXRBY3RpdmVNaWNyb3Bob25lcyhhY3RpdmVNaWNyb3Bob25lcykudHJhbnNhY3Rpb25FcnJvcigpOwogfQogCitzdGF0dXNfdCBBdWRpb1JlY29yZDo6c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikKK3sKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgaWYgKG1TZWxlY3RlZE1pY0RpcmVjdGlvbiA9PSBkaXJlY3Rpb24pIHsKKyAgICAgICAgLy8gTk9QCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtU2VsZWN0ZWRNaWNEaXJlY3Rpb24gPSBkaXJlY3Rpb247CisgICAgaWYgKG1BdWRpb1JlY29yZCA9PSAwKSB7CisgICAgICAgIC8vIHRoZSBpbnRlcm5hbCBBdWRpb1JlY29yZCBoYXNuJ3QgYmUgY3JlYXRlZCB5ZXQsIHNvIGp1c3Qgc3Rhc2ggdGhlIGF0dHJpYnV0ZS4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtQXVkaW9SZWNvcmQtPnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oZGlyZWN0aW9uKS50cmFuc2FjdGlvbkVycm9yKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1JlY29yZDo6c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIHsKKyAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgaWYgKG1TZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uID09IHpvb20pIHsKKyAgICAgICAgLy8gTk9QCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBtU2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbiA9IHpvb207CisgICAgaWYgKG1BdWRpb1JlY29yZCA9PSAwKSB7CisgICAgICAgIC8vIHRoZSBpbnRlcm5hbCBBdWRpb1JlY29yZCBoYXNuJ3QgYmUgY3JlYXRlZCB5ZXQsIHNvIGp1c3Qgc3Rhc2ggdGhlIGF0dHJpYnV0ZS4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBtQXVkaW9SZWNvcmQtPnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKS50cmFuc2FjdGlvbkVycm9yKCk7CisgICAgfQorfQorCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIHZvaWQgQXVkaW9SZWNvcmQ6OkRlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyBfX3VudXNlZCkKQEAgLTEzOTcsOCArMTQ0MCw5IEBACiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotQXVkaW9SZWNvcmQ6OkF1ZGlvUmVjb3JkVGhyZWFkOjpBdWRpb1JlY29yZFRocmVhZChBdWRpb1JlY29yZCYgcmVjZWl2ZXIsIGJvb2wgYkNhbkNhbGxKYXZhKQotICAgIDogVGhyZWFkKGJDYW5DYWxsSmF2YSksIG1SZWNlaXZlcihyZWNlaXZlciksIG1QYXVzZWQodHJ1ZSksIG1QYXVzZWRJbnQoZmFsc2UpLCBtUGF1c2VkTnMoMExMKSwKK0F1ZGlvUmVjb3JkOjpBdWRpb1JlY29yZFRocmVhZDo6QXVkaW9SZWNvcmRUaHJlYWQoQXVkaW9SZWNvcmQmIHJlY2VpdmVyKQorICAgIDogVGhyZWFkKHRydWUgLyogYkNhbkNhbGxKYXZhICovKSAgLy8gYmluZGVyIHJlY3Vyc2lvbiBvbiByZXN0b3JlUmVjb3JkX2woKSBtYXkgY2FsbCBKYXZhLgorICAgICwgbVJlY2VpdmVyKHJlY2VpdmVyKSwgbVBhdXNlZCh0cnVlKSwgbVBhdXNlZEludChmYWxzZSksIG1QYXVzZWROcygwTEwpLAogICAgICAgbUlnbm9yZU5leHRQYXVzZWRJbnQoZmFsc2UpCiB7CiB9CkBAIC0xNDUwLDcgKzE0OTQsNyBAQAogICAgICAgICBucyA9IElOVDY0X01BWDsKICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihucyA8IDAsICJwcm9jZXNzQXVkaW9CdWZmZXIoKSByZXR1cm5lZCAlIiBQUklkNjQsIG5zKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihucyA8IDAsICIlcygpIHJldHVybmVkICVsbGQiLCBfX2Z1bmNfXywgKGxvbmcgbG9uZylucyk7CiAgICAgICAgIHBhdXNlSW50ZXJuYWwobnMpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1N5c3RlbS5jcHAKaW5kZXggYzA3MjkwMS4uNDgxYmVjYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9TeXN0ZW0uY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvU3lzdGVtLmNwcApAQCAtMjUsNiArMjUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlci5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CiAjaW5jbHVkZSA8bWF0aC5oPgogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CkBAIC00MjcsNiArNDI4LDcgQEAKIAogYXVkaW9fdW5pcXVlX2lkX3QgQXVkaW9TeXN0ZW06Om5ld0F1ZGlvVW5pcXVlSWQoYXVkaW9fdW5pcXVlX2lkX3VzZV90IHVzZSkKIHsKKyAgICAvLyBNdXN0IG5vdCB1c2UgQUYgYXMgSURzIHdpbGwgcmUtcm9sbCBvbiBhdWRpb3NlcnZlciByZXN0YXJ0LCBiLzEzMDM2OTUyOS4KICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICBpZiAoYWYgPT0gMCkgcmV0dXJuIEFVRElPX1VOSVFVRV9JRF9BTExPQ0FURTsKICAgICByZXR1cm4gYWYtPm5ld0F1ZGlvVW5pcXVlSWQodXNlKTsKQEAgLTUyMSwxMCArNTIzLDEwIEBACiAgICAgaWYgKGlvRGVzYyA9PSAwIHx8IGlvRGVzYy0+bUlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSByZXR1cm47CiAKICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICBWZWN0b3IgPCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiA+IGNhbGxiYWNrczsKLQorICAgIHN0ZDo6dmVjdG9yPHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+PiBjYWxsYmFja3NUb0NhbGw7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBhdXRvIGNhbGxiYWNrcyA9IHN0ZDo6bWFwPGF1ZGlvX3BvcnRfaGFuZGxlX3QsIHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+PigpOwogCiAgICAgICAgIHN3aXRjaCAoZXZlbnQpIHsKICAgICAgICAgY2FzZSBBVURJT19PVVRQVVRfT1BFTkVEOgpAQCAtNTQyLDkgKzU0NCw5IEBACiAgICAgICAgICAgICBpZiAoaW9EZXNjLT5nZXREZXZpY2VJZCgpICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKICAgICAgICAgICAgICAgICBkZXZpY2VJZCA9IGlvRGVzYy0+Z2V0RGV2aWNlSWQoKTsKICAgICAgICAgICAgICAgICBpZiAoZXZlbnQgPT0gQVVESU9fT1VUUFVUX09QRU5FRCB8fCBldmVudCA9PSBBVURJT19JTlBVVF9PUEVORUQpIHsKLSAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpb0luZGV4ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmluZGV4T2ZLZXkoaW9EZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaW9JbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MudmFsdWVBdChpb0luZGV4KTsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBpdCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5maW5kKGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGl0ICE9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzID0gaXQtPnNlY29uZDsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTU2OCw3ICs1NzAsNyBAQAogICAgICAgICAgICAgICAgICAgZXZlbnQgPT0gQVVESU9fT1VUUFVUX0NMT1NFRCA/ICJvdXRwdXQiIDogImlucHV0IiwgaW9EZXNjLT5tSW9IYW5kbGUpOwogCiAgICAgICAgICAgICBtSW9EZXNjcmlwdG9ycy5yZW1vdmVJdGVtKGlvRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrcy5yZW1vdmVJdGVtKGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrcy5lcmFzZShpb0Rlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIGNhc2UgQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEOgpAQCAtNTg0LDkgKzU4Niw5IEBACiAKICAgICAgICAgICAgIGlmIChkZXZpY2VJZCAhPSBpb0Rlc2MtPmdldERldmljZUlkKCkpIHsKICAgICAgICAgICAgICAgICBkZXZpY2VJZCA9IGlvRGVzYy0+Z2V0RGV2aWNlSWQoKTsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IGlvSW5kZXggPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuaW5kZXhPZktleShpb0Rlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlvSW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MudmFsdWVBdChpb0luZGV4KTsKKyAgICAgICAgICAgICAgICBhdXRvIGl0ID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmZpbmQoaW9EZXNjLT5tSW9IYW5kbGUpOworICAgICAgICAgICAgICAgIGlmIChpdCAhPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tzID0gaXQtPnNlY29uZDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiaW9Db25maWdDaGFuZ2VkKCkgbmV3IGNvbmZpZyBmb3IgJXMgJWQgc2FtcGxpbmdSYXRlICV1LCBmb3JtYXQgJSN4ICIKQEAgLTU5NywyNSArNTk5LDQwIEBACiAgICAgICAgICAgICAgICAgICAgIGlvRGVzYy0+Z2V0RGV2aWNlSWQoKSk7CiAKICAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19DTElFTlRfU1RBUlRFRDogeworICAgICAgICAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IG9sZERlc2MgPSBnZXRJb0Rlc2NyaXB0b3JfbChpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICBpZiAob2xkRGVzYyA9PSAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImlvQ29uZmlnQ2hhbmdlZCgpIHN0YXJ0IGNsaWVudCBvbiB1bmtub3duIGlvISAlZCIsIGlvRGVzYy0+bUlvSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJpb0NvbmZpZ0NoYW5nZWQoKSBBVURJT19DTElFTlRfU1RBUlRFRCAgaW8gJWQgcG9ydCAlZCBudW0gY2FsbGJhY2tzICV6dSIsCisgICAgICAgICAgICAgICAgaW9EZXNjLT5tSW9IYW5kbGUsIGlvRGVzYy0+bVBvcnRJZCwgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnNpemUoKSk7CisgICAgICAgICAgICBvbGREZXNjLT5tUGF0Y2ggPSBpb0Rlc2MtPm1QYXRjaDsKKyAgICAgICAgICAgIGF1dG8gaXQgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuZmluZChpb0Rlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICBpZiAoaXQgIT0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgYXV0byBjYmtzID0gaXQtPnNlY29uZDsKKyAgICAgICAgICAgICAgICBhdXRvIGl0MiA9IGNia3MuZmluZChpb0Rlc2MtPm1Qb3J0SWQpOworICAgICAgICAgICAgICAgIGlmIChpdDIgIT0gY2Jrcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrcy5lbXBsYWNlKGlvRGVzYy0+bVBvcnRJZCwgaXQyLT5zZWNvbmQpOworICAgICAgICAgICAgICAgICAgIGRldmljZUlkID0gb2xkRGVzYy0+Z2V0RGV2aWNlSWQoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8gd3BDYmsgOiBjYWxsYmFja3MpIHsKKyAgICAgICAgICAgIHNwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+IHNwQ2JrID0gd3BDYmsuc2Vjb25kLnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChzcENiayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgY2FsbGJhY2tzVG9DYWxsLnB1c2hfYmFjayhzcENiayk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgYm9vbCBjYWxsYmFja1JlbW92ZWQgPSBmYWxzZTsKLSAgICAvLyBjYWxsYmFja3Muc2l6ZSgpICE9IDAgPT4gIGlvRGVzYy0+bUlvSGFuZGxlIGFuZCBkZXZpY2VJZCBhcmUgdmFsaWQKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7ICkgewotICAgICAgICBzcDxBdWRpb0RldmljZUNhbGxiYWNrPiBjYWxsYmFjayA9IGNhbGxiYWNrc1tpXS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChjYWxsYmFjay5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBjYWxsYmFjay0+b25BdWRpb0RldmljZVVwZGF0ZShpb0Rlc2MtPm1Jb0hhbmRsZSwgZGV2aWNlSWQpOwotICAgICAgICAgICAgaSsrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY2FsbGJhY2tzLnJlbW92ZUF0KGkpOwotICAgICAgICAgICAgY2FsbGJhY2tSZW1vdmVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvLyBjbGVhbiB1cCBjYWxsYmFjayBsaXN0IHdoaWxlIHdlIGFyZSBoZXJlIGlmIHNvbWUgY2xpZW50cyBoYXZlIGRpc2FwcGVhcmVkIHdpdGhvdXQKLSAgICAvLyB1bnJlZ2lzdGVyaW5nIHRoZWlyIGNhbGxiYWNrCi0gICAgaWYgKGNhbGxiYWNrUmVtb3ZlZCkgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBtQXVkaW9EZXZpY2VDYWxsYmFja3MucmVwbGFjZVZhbHVlRm9yKGlvRGVzYy0+bUlvSGFuZGxlLCBjYWxsYmFja3MpOworCisgICAgLy8gQ2FsbGJhY2tzIG11c3QgYmUgY2FsbGVkIHdpdGhvdXQgbUxvY2sgaGVsZC4gTWF5IGxlYWQgdG8gZGVhZCBsb2NrIGlmIGNhbGxpbmcgZm9yCisgICAgLy8gZXhhbXBsZSBnZXRSb3V0ZWREZXZpY2UgdGhhdCB1cGRhdGVzIHRoZSBkZXZpY2UgYW5kIHRyaWVzIHRvIGFjcXVpcmUgbUxvY2suCisgICAgZm9yIChhdXRvIGNiICA6IGNhbGxiYWNrc1RvQ2FsbCkgeworICAgICAgICAvLyBJZiBjYWxsYmFja3NUb0NhbGwgaXMgbm90IGVtcHR5LCBpdCBpbXBsaWVzIGlvRGVzYy0+bUlvSGFuZGxlIGFuZCBkZXZpY2VJZCBhcmUgdmFsaWQKKyAgICAgICAgY2ItPm9uQXVkaW9EZXZpY2VVcGRhdGUoaW9EZXNjLT5tSW9IYW5kbGUsIGRldmljZUlkKTsKICAgICB9CiB9CiAKQEAgLTY2OCw1MCArNjg1LDM0IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soCi0gICAgICAgIGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbykKKyAgICAgICAgY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKKyAgICBBTE9HVigiJXMgYXVkaW9JbyAlZCBwb3J0SWQgJWQiLCBfX2Z1bmNfXywgYXVkaW9JbywgcG9ydElkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFZlY3RvciA8IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+ID4gY2FsbGJhY2tzOwotICAgIHNzaXplX3QgaW9JbmRleCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5pbmRleE9mS2V5KGF1ZGlvSW8pOwotICAgIGlmIChpb0luZGV4ID49IDApIHsKLSAgICAgICAgY2FsbGJhY2tzID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnZhbHVlQXQoaW9JbmRleCk7CisgICAgYXV0byYgY2FsbGJhY2tzID0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmVtcGxhY2UoYXVkaW9Jbywgc3RkOjptYXA8YXVkaW9fcG9ydF9oYW5kbGVfdCwgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4+KCkpLmZpcnN0LT5zZWNvbmQ7CisgICAgYXV0byByZXN1bHQgPSBjYWxsYmFja3MudHJ5X2VtcGxhY2UocG9ydElkLCBjYWxsYmFjayk7CisgICAgaWYgKCFyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBjYkluZGV4ID0gMDsgY2JJbmRleCA8IGNhbGxiYWNrcy5zaXplKCk7IGNiSW5kZXgrKykgewotICAgICAgICBpZiAoY2FsbGJhY2tzW2NiSW5kZXhdLnVuc2FmZV9nZXQoKSA9PSBjYWxsYmFjay51bnNhZmVfZ2V0KCkpIHsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgIH0KLSAgICBjYWxsYmFja3MuYWRkKGNhbGxiYWNrKTsKLQotICAgIG1BdWRpb0RldmljZUNhbGxiYWNrcy5yZXBsYWNlVmFsdWVGb3IoYXVkaW9JbywgY2FsbGJhY2tzKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpBdWRpb0ZsaW5nZXJDbGllbnQ6OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soCi0gICAgICAgIGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbykKKyAgICAgICAgY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrIF9fdW51c2VkLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKKyAgICBBTE9HVigiJXMgYXVkaW9JbyAlZCBwb3J0SWQgJWQiLCBfX2Z1bmNfXywgYXVkaW9JbywgcG9ydElkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHNzaXplX3QgaW9JbmRleCA9IG1BdWRpb0RldmljZUNhbGxiYWNrcy5pbmRleE9mS2V5KGF1ZGlvSW8pOwotICAgIGlmIChpb0luZGV4IDwgMCkgeworICAgIGF1dG8gaXQgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MuZmluZChhdWRpb0lvKTsKKyAgICBpZiAoaXQgPT0gbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLmVuZCgpKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgVmVjdG9yIDwgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4gPiBjYWxsYmFja3MgPSBtQXVkaW9EZXZpY2VDYWxsYmFja3MudmFsdWVBdChpb0luZGV4KTsKLQotICAgIHNpemVfdCBjYkluZGV4OwotICAgIGZvciAoY2JJbmRleCA9IDA7IGNiSW5kZXggPCBjYWxsYmFja3Muc2l6ZSgpOyBjYkluZGV4KyspIHsKLSAgICAgICAgaWYgKGNhbGxiYWNrc1tjYkluZGV4XS51bnNhZmVfZ2V0KCkgPT0gY2FsbGJhY2sudW5zYWZlX2dldCgpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoY2JJbmRleCA9PSBjYWxsYmFja3Muc2l6ZSgpKSB7CisgICAgaWYgKGl0LT5zZWNvbmQuZXJhc2UocG9ydElkKSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9Ci0gICAgY2FsbGJhY2tzLnJlbW92ZUF0KGNiSW5kZXgpOwotICAgIGlmIChjYWxsYmFja3Muc2l6ZSgpICE9IDApIHsKLSAgICAgICAgbUF1ZGlvRGV2aWNlQ2FsbGJhY2tzLnJlcGxhY2VWYWx1ZUZvcihhdWRpb0lvLCBjYWxsYmFja3MpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrcy5yZW1vdmVJdGVtKGF1ZGlvSW8pOworICAgIGlmIChpdC0+c2Vjb25kLnNpemUoKSA9PSAwKSB7CisgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrcy5lcmFzZShhdWRpb0lvKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtNzczLDYgKzc3NCw3IEBACiAgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwogICAgICAgICBhcC0+cmVnaXN0ZXJDbGllbnQoYXBjKTsKICAgICAgICAgYXAtPnNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoYXBjLT5pc0F1ZGlvUG9ydENiRW5hYmxlZCgpKTsKKyAgICAgICAgYXAtPnNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGFwYy0+aXNBdWRpb1ZvbHVtZUdyb3VwQ2JFbmFibGVkKCkpOwogICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKICAgICB9CiAKQEAgLTc4MSwxMCArNzgzLDE4IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCit2b2lkIEF1ZGlvU3lzdGVtOjpvbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZSgpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybjsKKyAgICBhcHMtPm9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCk7Cit9CisKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgY29uc3QgY2hhciAqYWRkcmVzcyA9ICIiOwpAQCAtNzk4LDcgKzgwOCw3IEBACiAgICAgaWYgKGRldmljZV9uYW1lICE9IE5VTEwpIHsKICAgICAgICAgbmFtZSA9IGRldmljZV9uYW1lOwogICAgIH0KLSAgICByZXR1cm4gYXBzLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwgYWRkcmVzcywgbmFtZSk7CisgICAgcmV0dXJuIGFwcy0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGFkZHJlc3MsIG5hbWUsIGVuY29kZWRGb3JtYXQpOwogfQogCiBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgQXVkaW9TeXN0ZW06OmdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLApAQCAtODEyLDcgKzgyMiw4IEBACiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MgPSAiIjsKQEAgLTgyNiw3ICs4MzcsNyBAQAogICAgIGlmIChkZXZpY2VfbmFtZSAhPSBOVUxMKSB7CiAgICAgICAgIG5hbWUgPSBkZXZpY2VfbmFtZTsKICAgICB9Ci0gICAgcmV0dXJuIGFwcy0+aGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGRldmljZSwgYWRkcmVzcywgbmFtZSk7CisgICAgcmV0dXJuIGFwcy0+aGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGRldmljZSwgYWRkcmVzcywgbmFtZSwgZW5jb2RlZEZvcm1hdCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKQEAgLTg2MCw3ICs4NzEsNyBAQAogICAgIHJldHVybiBhcHMtPmdldE91dHB1dChzdHJlYW0pOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCkBAIC04NjksNDQgKzg4MCw0MCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cykKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CiAgICAgcmV0dXJuIGFwcy0+Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCBvdXRwdXQsIHNlc3Npb24sIHN0cmVhbSwgcGlkLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQsIHNlY29uZGFyeU91dHB1dHMpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RhcnRPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHJldHVybiBhcHMtPnN0YXJ0T3V0cHV0KHBvcnRJZCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0b3BPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHJldHVybiBhcHMtPnN0b3BPdXRwdXQocG9ydElkKTsKIH0KIAotdm9pZCBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKICAgICBpZiAoYXBzID09IDApIHJldHVybjsKLSAgICBhcHMtPnJlbGVhc2VPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIGFwcy0+cmVsZWFzZU91dHB1dChwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCkBAIC05MTksMTUgKzkyNiwxNSBAQAogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gTk9fSU5JVDsKICAgICByZXR1cm4gYXBzLT5nZXRJbnB1dEZvckF0dHIoCi0gICAgICAgICAgICBhdHRyLCBpbnB1dCwgc2Vzc2lvbiwgcGlkLCB1aWQsIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICBhdHRyLCBpbnB1dCwgcmlpZCwgc2Vzc2lvbiwgcGlkLCB1aWQsIG9wUGFja2FnZU5hbWUsCiAgICAgICAgICAgICBjb25maWcsIGZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgYm9vbCAqc2lsZW5jZWQpCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0YXJ0SW5wdXQocG9ydElkLCBzaWxlbmNlZCk7CisgICAgcmV0dXJuIGFwcy0+c3RhcnRJbnB1dChwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQpAQCAtOTcxLDEwICs5NzgsNDIgQEAKICAgICByZXR1cm4gYXBzLT5nZXRTdHJlYW1Wb2x1bWVJbmRleChzdHJlYW0sIGluZGV4LCBkZXZpY2UpOwogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+c2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGF0dHIsIGluZGV4LCBkZXZpY2UpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyLCBpbmRleCwgZGV2aWNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5nZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0ciwgaW5kZXgpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6Z2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50ICZpbmRleCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyLCBpbmRleCk7Cit9CisKIHVpbnQzMl90IEF1ZGlvU3lzdGVtOjpnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwotICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIDA7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUFJPRFVDVF9TVFJBVEVHWV9OT05FOwogICAgIHJldHVybiBhcHMtPmdldFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7CiB9CiAKQEAgLTEwMTgsNiArMTA1NywxMyBAQAogICAgIHJldHVybiBhcHMtPnNldEVmZmVjdEVuYWJsZWQoaWQsIGVuYWJsZWQpOwogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6bW92ZUVmZmVjdHNUb0lvKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGlkcywgYXVkaW9faW9faGFuZGxlX3QgaW8pCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5tb3ZlRWZmZWN0c1RvSW8oaWRzLCBpbyk7Cit9CisKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCogc3RhdGUsIHVpbnQzMl90IGluUGFzdE1zKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CkBAIC0xMDg0LDYgKzExMzAsMTIgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aWRfdCB1aWQsIGF1ZGlvX2ZsYWdzX21hc2tfdCBmbGFncykgeworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSBudWxscHRyKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+c2V0QWxsb3dlZENhcHR1cmVQb2xpY3kodWlkLCBmbGFncyk7Cit9CisKIGJvb2wgQXVkaW9TeXN0ZW06OmlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgaW5mbykKIHsKICAgICBBTE9HVigiaXNPZmZsb2FkU3VwcG9ydGVkKCkiKTsKQEAgLTExNzQsMTQgKzEyMjYsNDcgQEAKICAgICByZXR1cm4gKHJldCA8IDApID8gSU5WQUxJRF9PUEVSQVRJT04gOiBOT19FUlJPUjsKIH0KIAorc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmFkZEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayhjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjaykKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGdMb2NrQVBTKTsKKyAgICBpZiAoZ0F1ZGlvUG9saWN5U2VydmljZUNsaWVudCA9PSAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBpbnQgcmV0ID0gZ0F1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+YWRkQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrKGNhbGxiYWNrKTsKKyAgICBpZiAocmV0ID09IDEpIHsKKyAgICAgICAgYXBzLT5zZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZCh0cnVlKTsKKyAgICB9CisgICAgcmV0dXJuIChyZXQgPCAwKSA/IElOVkFMSURfT1BFUkFUSU9OIDogTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChnTG9ja0FQUyk7CisgICAgaWYgKGdBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaW50IHJldCA9IGdBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPnJlbW92ZUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayhjYWxsYmFjayk7CisgICAgaWYgKHJldCA9PSAwKSB7CisgICAgICAgIGFwcy0+c2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoZmFsc2UpOworICAgIH0KKyAgICByZXR1cm4gKHJldCA8IDApID8gSU5WQUxJRF9PUEVSQVRJT04gOiBOT19FUlJPUjsKK30KKwogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soCi0gICAgICAgIGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbykKKyAgICAgICAgY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXJDbGllbnQ+IGFmYyA9IGdldEF1ZGlvRmxpbmdlckNsaWVudCgpOwogICAgIGlmIChhZmMgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gYWZjLT5hZGRBdWRpb0RldmljZUNhbGxiYWNrKGNhbGxiYWNrLCBhdWRpb0lvKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBhZmMtPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY2FsbGJhY2ssIGF1ZGlvSW8sIHBvcnRJZCk7CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKICAgICAgICAgaWYgKGFmICE9IDApIHsKQEAgLTExOTIsMTMgKzEyNzcsMTQgQEAKIH0KIAogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soCi0gICAgICAgIGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbykKKyAgICAgICAgY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLCBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXJDbGllbnQ+IGFmYyA9IGdldEF1ZGlvRmxpbmdlckNsaWVudCgpOwogICAgIGlmIChhZmMgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgcmV0dXJuIGFmYy0+cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhjYWxsYmFjaywgYXVkaW9Jbyk7CisgICAgcmV0dXJuIGFmYy0+cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhjYWxsYmFjaywgYXVkaW9JbywgcG9ydElkKTsKIH0KIAogYXVkaW9fcG9ydF9oYW5kbGVfdCBBdWRpb1N5c3RlbTo6Z2V0RGV2aWNlSWRGb3JJbyhhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKQpAQCAtMTI0MiwyMCArMTMyOCwzMyBAQAogICAgIHJldHVybiBhcHMtPnJlZ2lzdGVyUG9saWN5TWl4ZXMobWl4ZXMsIHJlZ2lzdHJhdGlvbik7CiB9CiAKLXN0YXR1c190IEF1ZGlvU3lzdGVtOjpzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQogewogICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CiAgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgcmV0dXJuIGFwcy0+c3RhcnRBdWRpb1NvdXJjZShzb3VyY2UsIGF0dHJpYnV0ZXMsIGhhbmRsZSk7CisgICAgcmV0dXJuIGFwcy0+c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWQsIGRldmljZXMpOwogfQogCi1zdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpyZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCkgeworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+cmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWQpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwogICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwotICAgIHJldHVybiBhcHMtPnN0b3BBdWRpb1NvdXJjZShoYW5kbGUpOworICAgIHJldHVybiBhcHMtPnN0YXJ0QXVkaW9Tb3VyY2Uoc291cmNlLCBhdHRyaWJ1dGVzLCBwb3J0SWQpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+c3RvcEF1ZGlvU291cmNlKHBvcnRJZCk7CiB9CiAKIHN0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubykKQEAgLTEyNzIsNiArMTM3MSwyMCBAQAogICAgIHJldHVybiBhcHMtPmdldE1hc3Rlck1vbm8obW9ubyk7CiB9CiAKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvRmxpbmdlcj4mIGFmID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CisgICAgaWYgKGFmID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYWYtPnNldE1hc3RlckJhbGFuY2UoYmFsYW5jZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRNYXN0ZXJCYWxhbmNlKGZsb2F0ICpiYWxhbmNlKQoreworICAgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICAgIGlmIChhZiA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFmLT5nZXRNYXN0ZXJCYWxhbmNlKGJhbGFuY2UpOworfQorCiBmbG9hdCBBdWRpb1N5c3RlbTo6Z2V0U3RyZWFtVm9sdW1lREIoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleCwgYXVkaW9fZGV2aWNlc190IGRldmljZSkKIHsKICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOwpAQCAtMTI4Niw2ICsxMzk5LDEyIEBACiAgICAgcmV0dXJuIGFmLT5nZXRNaWNyb3Bob25lcyhtaWNyb3Bob25lcyk7CiB9CiAKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpzZXRBdWRpb0hhbFBpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8cGlkX3Q+JiBwaWRzKSB7CisgIGNvbnN0IHNwPElBdWRpb0ZsaW5nZXI+JiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOworICBpZiAoYWYgPT0gbnVsbHB0cikgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICByZXR1cm4gYWYtPnNldEF1ZGlvSGFsUGlkcyhwaWRzKTsKK30KKwogc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFN1cnJvdW5kRm9ybWF0cyh1bnNpZ25lZCBpbnQgKm51bVN1cnJvdW5kRm9ybWF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgKnN1cnJvdW5kRm9ybWF0cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqc3Vycm91bmRGb3JtYXRzRW5hYmxlZCwKQEAgLTEzMDQsNiArMTQyMywxNTEgQEAKICAgICByZXR1cm4gYXBzLT5zZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9Gb3JtYXQsIGVuYWJsZWQpOwogfQogCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCkKK3sKKyAgICBjb25zdCBzcCA8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKworICAgIHJldHVybiBhcHMtPnNldEFzc2lzdGFudFVpZCh1aWQpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6c2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpCit7CisgICAgY29uc3Qgc3AgPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisKKyAgICByZXR1cm4gYXBzLT5zZXRBMTF5U2VydmljZXNVaWRzKHVpZHMpOworfQorCitib29sIEF1ZGlvU3lzdGVtOjppc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBhcHMtPmlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cykgeworICAgIGNvbnN0IHNwIDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPgorICAgICAgICAmIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5nZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKGZvcm1hdHMpOworfQorCitzdGF0dXNfdCBBdWRpb1N5c3RlbTo6bGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5saXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhzdHJhdGVnaWVzKTsKK30KKworYXVkaW9fYXR0cmlidXRlc190IEF1ZGlvU3lzdGVtOjpzdHJlYW1UeXBlVG9BdHRyaWJ1dGVzKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQoreworICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yIHN0cmF0ZWdpZXM7CisgICAgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoc3RyYXRlZ2llcyk7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJhdGVneSA6IHN0cmF0ZWdpZXMpIHsKKyAgICAgICAgYXV0byBhdHRyVmVjdCA9IHN0cmF0ZWd5LmdldEF1ZGlvQXR0cmlidXRlcygpOworICAgICAgICBhdXRvIGl0ZXIgPSBzdGQ6OmZpbmRfaWYoYmVnaW4oYXR0clZlY3QpLCBlbmQoYXR0clZlY3QpLCBbJnN0cmVhbV0oY29uc3QgYXV0byAmYXR0cmlidXRlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdHRyaWJ1dGVzLmdldFN0cmVhbVR5cGUoKSA9PSBzdHJlYW07IH0pOworICAgICAgICBpZiAoaXRlciAhPSBlbmQoYXR0clZlY3QpKSB7CisgICAgICAgICAgICByZXR1cm4gaXRlci0+Z2V0QXR0cmlidXRlcygpOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dFKCJpbnZhbGlkIHN0cmVhbSB0eXBlICVzIHdoZW4gY29udmVydGluZyB0byBhdHRyaWJ1dGVzIiwgIHRvU3RyaW5nKHN0cmVhbSkuY19zdHIoKSk7CisgICAgcmV0dXJuIEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7Cit9CisKK2F1ZGlvX3N0cmVhbV90eXBlX3QgQXVkaW9TeXN0ZW06OmF0dHJpYnV0ZXNUb1N0cmVhbVR5cGUoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKQoreworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBwc0lkOworICAgIHN0YXR1c190IHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKEF1ZGlvQXR0cmlidXRlcyhhdHRyKSwgcHNJZCk7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgibm8gc3RyYXRlZ3kgZm91bmQgZm9yIGF0dHJpYnV0ZXMgJXMiLCAgdG9TdHJpbmcoYXR0cikuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7CisgICAgfQorICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yIHN0cmF0ZWdpZXM7CisgICAgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoc3RyYXRlZ2llcyk7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJhdGVneSA6IHN0cmF0ZWdpZXMpIHsKKyAgICAgICAgaWYgKHN0cmF0ZWd5LmdldElkKCkgPT0gcHNJZCkgeworICAgICAgICAgICAgYXV0byBhdHRyVmVjdCA9IHN0cmF0ZWd5LmdldEF1ZGlvQXR0cmlidXRlcygpOworICAgICAgICAgICAgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGJlZ2luKGF0dHJWZWN0KSwgZW5kKGF0dHJWZWN0KSwgWyZhdHRyXShjb25zdCBhdXRvICZyZWZBdHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBBdWRpb1Byb2R1Y3RTdHJhdGVneTo6YXR0cmlidXRlc01hdGNoZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWZBdHRyLmdldEF0dHJpYnV0ZXMoKSwgYXR0cik7IH0pOworICAgICAgICAgICAgaWYgKGl0ZXIgIT0gZW5kKGF0dHJWZWN0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBpdGVyLT5nZXRTdHJlYW1UeXBlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgc3dpdGNoIChhdHRyLnVzYWdlKSB7CisgICAgICAgIGNhc2UgQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0U6CisgICAgICAgICAgICAvLyB2aXJ0dWFsIHNvdXJjZSBpcyBub3QgZXhwZWN0ZWQgdG8gaGF2ZSBhbiBhc3NvY2lhdGVkIHByb2R1Y3Qgc3RyYXRlZ3kKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgQUxPR0UoImludmFsaWQgYXR0cmlidXRlcyAlcyB3aGVuIGNvbnZlcnRpbmcgdG8gc3RyZWFtIiwgIHRvU3RyaW5nKGF0dHIpLmNfc3RyKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7Cit9CisKK3N0YXR1c190IEF1ZGlvU3lzdGVtOjpnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIHJldHVybiBhcHMtPmdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoYWEscHJvZHVjdFN0cmF0ZWd5KTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06Omxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5saXN0QXVkaW9Wb2x1bWVHcm91cHMoZ3JvdXBzKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCAmdm9sdW1lR3JvdXApCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICByZXR1cm4gYXBzLT5nZXRWb2x1bWVHcm91cEZyb21BdWRpb0F0dHJpYnV0ZXMoYWEsIHZvbHVtZUdyb3VwKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFJ0dEVuYWJsZWQoYm9vbCBlbmFibGVkKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgcmV0dXJuIGFwcy0+c2V0UnR0RW5hYmxlZChlbmFibGVkKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpCit7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYXBzLT5zZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZGV2aWNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OnJlbW92ZVByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkKK3sKKyAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlPiYgYXBzID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19wb2xpY3lfc2VydmljZSgpOworICAgIGlmIChhcHMgPT0gMCkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBhcHMtPnJlbW92ZVByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKK30KKworc3RhdHVzX3QgQXVkaW9TeXN0ZW06OmdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKQoreworICAgIGNvbnN0IHNwPElBdWRpb1BvbGljeVNlcnZpY2U+JiBhcHMgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX3BvbGljeV9zZXJ2aWNlKCk7CisgICAgaWYgKGFwcyA9PSAwKSB7CisgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICB9CisgICAgcmV0dXJuIGFwcy0+Z2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGRldmljZSk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBpbnQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6YWRkQXVkaW9Qb3J0Q2FsbGJhY2soCkBAIC0xMzUzLDYgKzE2MTcsNDcgQEAKICAgICB9CiB9CiAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2ludCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjphZGRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaz4mIGNhbGxiYWNrKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrW2ldID09IGNhbGxiYWNrKSB7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjay5hZGQoY2FsbGJhY2spOworICAgIHJldHVybiBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrLnNpemUoKTsKK30KKworaW50IEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OnJlbW92ZUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjaygKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzaXplX3QgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjay5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja1tpXSA9PSBjYWxsYmFjaykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGkgPT0gbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjay5zaXplKCkpIHsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrLnJlbW92ZUF0KGkpOworICAgIHJldHVybiBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrLnNpemUoKTsKK30KKwordm9pZCBBdWRpb1N5c3RlbTo6QXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OjpvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjay5zaXplKCk7IGkrKykgeworICAgICAgICBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrW2ldLT5vbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKGdyb3VwLCBmbGFncyk7CisgICAgfQorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiB2b2lkIEF1ZGlvU3lzdGVtOjpBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6Om9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKAogICAgICAgICBTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKQogewpAQCAtMTM2OSw5ICsxNjc0LDE0IEBACiB9CiAKIHZvaWQgQXVkaW9TeXN0ZW06OkF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAotICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgewogICAgIHJlY29yZF9jb25maWdfY2FsbGJhY2sgY2IgPSBOVUxMOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKEF1ZGlvU3lzdGVtOjpnTG9jayk7CkBAIC0xMzc5LDcgKzE2ODksOCBAQAogICAgIH0KIAogICAgIGlmIChjYiAhPSBOVUxMKSB7Ci0gICAgICAgIGNiKGV2ZW50LCBjbGllbnRJbmZvLCBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOworICAgICAgICBjYihldmVudCwgY2xpZW50SW5mbywgY2xpZW50Q29uZmlnLCBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICBkZXZpY2VDb25maWcsIGVmZmVjdHMsIHBhdGNoSGFuZGxlLCBzb3VyY2UpOwogICAgIH0KIH0KIApAQCAtMTM5MCw2ICsxNzAxLDkgQEAKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Qb3J0Q2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBtQXVkaW9Qb3J0Q2FsbGJhY2tzW2ldLT5vblNlcnZpY2VEaWVkKCk7CiAgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrW2ldLT5vblNlcnZpY2VEaWVkKCk7CisgICAgICAgIH0KICAgICB9CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2woZ0xvY2tBUFMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcAppbmRleCBhMzQxM2UxLi45YTY2ZDQ4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrLmNwcApAQCAtMzEsOSArMzEsMTAgQEAKICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KICNpbmNsdWRlIDxwcm9jZXNzZ3JvdXAvc2NoZWRfcG9saWN5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvRmxpbmdlci5oPgorI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgogI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KIApAQCAtMTIxLDIyICsxMjIsMjIgQEAKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgmYWZTYW1wbGVSYXRlLCBzdHJlYW1UeXBlKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcXVlcnkgb3V0cHV0IHNhbXBsZSByYXRlIGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoKTogVW5hYmxlIHRvIHF1ZXJ5IG91dHB1dCBzYW1wbGUgcmF0ZSBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0cmVhbVR5cGUsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7CiAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZyYW1lQ291bnQoJmFmRnJhbWVDb3VudCwgc3RyZWFtVHlwZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHF1ZXJ5IG91dHB1dCBmcmFtZSBjb3VudCBmb3Igc3RyZWFtIHR5cGUgJWQ7IHN0YXR1cyAlZCIsCi0gICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwgc3RhdHVzKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IFVuYWJsZSB0byBxdWVyeSBvdXRwdXQgZnJhbWUgY291bnQgZm9yIHN0cmVhbSB0eXBlICVkOyBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBzdHJlYW1UeXBlLCBzdGF0dXMpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KICAgICB1aW50MzJfdCBhZkxhdGVuY3k7CiAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dExhdGVuY3koJmFmTGF0ZW5jeSwgc3RyZWFtVHlwZSk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIHF1ZXJ5IG91dHB1dCBsYXRlbmN5IGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCBzdGF0dXMpOworICAgICAgICBBTE9HRSgiJXMoKTogVW5hYmxlIHRvIHF1ZXJ5IG91dHB1dCBsYXRlbmN5IGZvciBzdHJlYW0gdHlwZSAlZDsgc3RhdHVzICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RyZWFtVHlwZSwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKQEAgLTE0OSw4NSArMTUwLDUyIEBACiAgICAgLy8gQXVkaW9UcmFjay5TQU1QTEVfUkFURV9IWl9NSU4gPD0gc2FtcGxlUmF0ZSA8PSBBdWRpb1RyYWNrLlNBTVBMRV9SQVRFX0haX01BWC4KICAgICAvLyBSZXR1cm4gZXJyb3IgaW4gdGhlIHVubGlrZWx5IGV2ZW50IHRoYXQgaXQgZG9lcyBub3QsIGFzIHRoYXQncyBwYXJ0IG9mIHRoZSBBUEkgY29udHJhY3QuCiAgICAgaWYgKCpmcmFtZUNvdW50ID09IDApIHsKLSAgICAgICAgQUxPR0UoIkF1ZGlvVHJhY2s6OmdldE1pbkZyYW1lQ291bnQgZmFpbGVkIGZvciBzdHJlYW1UeXBlICVkLCBzYW1wbGVSYXRlICV1IiwKLSAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IGZhaWxlZCBmb3Igc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAldSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0cmVhbVR5cGUsIHNhbXBsZVJhdGUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBBTE9HVigiZ2V0TWluRnJhbWVDb3VudD0lenU6IGFmRnJhbWVDb3VudD0lenUsIGFmU2FtcGxlUmF0ZT0ldSwgYWZMYXRlbmN5PSV1IiwKLSAgICAgICAgICAgICpmcmFtZUNvdW50LCBhZkZyYW1lQ291bnQsIGFmU2FtcGxlUmF0ZSwgYWZMYXRlbmN5KTsKKyAgICBBTE9HVigiJXMoKTogZ2V0TWluRnJhbWVDb3VudD0lenU6IGFmRnJhbWVDb3VudD0lenUsIGFmU2FtcGxlUmF0ZT0ldSwgYWZMYXRlbmN5PSV1IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCAqZnJhbWVDb3VudCwgYWZGcmFtZUNvdW50LCBhZlNhbXBsZVJhdGUsIGFmTGF0ZW5jeSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCisvLyBzdGF0aWMKK2Jvb2wgQXVkaW9UcmFjazo6aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpIHsKKyAgICBBTE9HVigiJXMoKSIsIF9fRlVOQ1RJT05fXyk7CisgICAgY29uc3Qgc3A8SUF1ZGlvUG9saWN5U2VydmljZT4mIGFwcyA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fcG9saWN5X3NlcnZpY2UoKTsKKyAgICBpZiAoYXBzID09IDApIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gYXBzLT5pc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25maWcsIGF0dHJpYnV0ZXMpOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotc3RhdGljIHN0ZDo6c3RyaW5nIGF1ZGlvQ29udGVudFR5cGVTdHJpbmcoYXVkaW9fY29udGVudF90eXBlX3QgdmFsdWUpIHsKLSAgICBzdGQ6OnN0cmluZyBjb250ZW50VHlwZTsKLSAgICBpZiAoQXVkaW9Db250ZW50VHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcodmFsdWUsIGNvbnRlbnRUeXBlKSkgewotICAgICAgICByZXR1cm4gY29udGVudFR5cGU7Ci0gICAgfQotICAgIGNoYXIgcmF3YnVmZmVyWzE2XTsgIC8vIHJvb20gZm9yICIlZCIKLSAgICBzbnByaW50ZihyYXdidWZmZXIsIHNpemVvZihyYXdidWZmZXIpLCAiJWQiLCB2YWx1ZSk7Ci0gICAgcmV0dXJuIHJhd2J1ZmZlcjsKLX0KLQotc3RhdGljIHN0ZDo6c3RyaW5nIGF1ZGlvVXNhZ2VTdHJpbmcoYXVkaW9fdXNhZ2VfdCB2YWx1ZSkgewotICAgIHN0ZDo6c3RyaW5nIHVzYWdlOwotICAgIGlmIChVc2FnZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKHZhbHVlLCB1c2FnZSkpIHsKLSAgICAgICAgcmV0dXJuIHVzYWdlOwotICAgIH0KLSAgICBjaGFyIHJhd2J1ZmZlclsxNl07ICAvLyByb29tIGZvciAiJWQiCi0gICAgc25wcmludGYocmF3YnVmZmVyLCBzaXplb2YocmF3YnVmZmVyKSwgIiVkIiwgdmFsdWUpOwotICAgIHJldHVybiByYXdidWZmZXI7Ci19Ci0KIHZvaWQgQXVkaW9UcmFjazo6TWVkaWFNZXRyaWNzOjpnYXRoZXIoY29uc3QgQXVkaW9UcmFjayAqdHJhY2spCiB7Ci0KLSAgICAvLyBrZXkgZm9yIG1lZGlhIHN0YXRpc3RpY3MgaXMgZGVmaW5lZCBpbiB0aGUgaGVhZGVyCi0gICAgLy8gYXR0cnMgZm9yIG1lZGlhIHN0YXRpc3RpY3MKLSAgICAvLyBOQjogdGhlc2UgYXJlIG1hdGNoZWQgd2l0aCBwdWJsaWMgSmF2YSBBUEkgY29uc3RhbnRzIGRlZmluZWQKLSAgICAvLyBpbiBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2suamF2YQotICAgIC8vIFRoZXNlIG11c3QgYmUga2VwdCBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgY29uc3RhbnRzIHRoZXJlLgotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1N0cmVhbVR5cGVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suc3RyZWFtdHlwZSI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1RyYWNrQ29udGVudFR5cGVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2sudHlwZSI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1RyYWNrVXNhZ2VbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2sudXNhZ2UiOwotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1NhbXBsZVJhdGVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suc2FtcGxlcmF0ZSI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1RyYWNrQ2hhbm5lbE1hc2tbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suY2hhbm5lbG1hc2siOwotCi0gICAgLy8gTkI6IFRoZXNlIGFyZSBub3QgeWV0IGV4cG9zZWQgYXMgcHVibGljIEphdmEgQVBJIGNvbnN0YW50cy4KLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tVbmRlcnJ1bkZyYW1lc1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay51bmRlcnJ1bmZyYW1lcyI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtBdWRpb1RyYWNrU3RhcnR1cEdsaXRjaFtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay5nbGl0Y2guc3RhcnR1cCI7Ci0KICAgICAvLyBvbmx5IGlmIHdlJ3JlIGluIGEgZ29vZCBzdGF0ZS4uLgogICAgIC8vIFhYWDogc2hhbGwgd2UgZ2F0aGVyIGFsdGVybmF0aXZlIGluZm8gaWYgZmFpbGluZz8KICAgICBjb25zdCBzdGF0dXNfdCBsc3RhdHVzID0gdHJhY2stPmluaXRDaGVjaygpOwogICAgIGlmIChsc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dEKCJubyBtZXRyaWNzIGdhdGhlcmVkLCB0cmFjayBzdGF0dXM9JWQiLCAoaW50KSBsc3RhdHVzKTsKKyAgICAgICAgQUxPR0QoIiVzKCk6IG5vIG1ldHJpY3MgZ2F0aGVyZWQsIHRyYWNrIHN0YXR1cz0lZCIsIF9fZnVuY19fLCAoaW50KSBsc3RhdHVzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIGNvbnN0cnVjdG9yIGd1YXJhbnRlZXMgbUFuYWx5dGljc0l0ZW0gaXMgdmFsaWQKKyNkZWZpbmUgTU1fUFJFRklYICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suIiAvLyBhdm9pZCBjdXQtbi1wYXN0ZSBlcnJvcnMuCiAKLSAgICBjb25zdCBpbnQzMl90IHVuZGVycnVuRnJhbWVzID0gdHJhY2stPmdldFVuZGVycnVuRnJhbWVzKCk7Ci0gICAgaWYgKHVuZGVycnVuRnJhbWVzICE9IDApIHsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtBdWRpb1RyYWNrVW5kZXJydW5GcmFtZXMsIHVuZGVycnVuRnJhbWVzKTsKLSAgICB9CisgICAgLy8gSmF2YSBBUEkgMjggZW50cmllcywgZG8gbm90IGNoYW5nZS4KKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggInN0cmVhbXR5cGUiLCB0b1N0cmluZyh0cmFjay0+c3RyZWFtVHlwZSgpKS5jX3N0cigpKTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggInR5cGUiLAorICAgICAgICAgICAgdG9TdHJpbmcodHJhY2stPm1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSkuY19zdHIoKSk7CisgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJ1c2FnZSIsIHRvU3RyaW5nKHRyYWNrLT5tQXR0cmlidXRlcy51c2FnZSkuY19zdHIoKSk7CiAKLSAgICBpZiAodHJhY2stPm1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQpIHsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtBdWRpb1RyYWNrU3RhcnR1cEdsaXRjaCwgMSk7Ci0gICAgfQotCi0gICAgaWYgKHRyYWNrLT5tU3RyZWFtVHlwZSAhPSAtMSkgewotICAgICAgICAvLyBkZXByZWNhdGVkLCBidXQgdGhpcyB3aWxsIHRlbGwgdXMgd2hvIHN0aWxsIHVzZXMgaXQuCi0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQXVkaW9UcmFja1N0cmVhbVR5cGUsIHRyYWNrLT5tU3RyZWFtVHlwZSk7Ci0gICAgfQotICAgIC8vIFhYWDogY29uc2lkZXIgaW5jbHVkaW5nIGZyb20gbUF0dHJpYnV0ZXM6IHNvdXJjZSB0eXBlCi0gICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa0F1ZGlvVHJhY2tDb250ZW50VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb0NvbnRlbnRUeXBlU3RyaW5nKHRyYWNrLT5tQXR0cmlidXRlcy5jb250ZW50X3R5cGUpLmNfc3RyKCkpOwotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1RyYWNrVXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Vc2FnZVN0cmluZyh0cmFjay0+bUF0dHJpYnV0ZXMudXNhZ2UpLmNfc3RyKCkpOwotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQXVkaW9UcmFja1NhbXBsZVJhdGUsIHRyYWNrLT5tU2FtcGxlUmF0ZSk7Ci0gICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtBdWRpb1RyYWNrQ2hhbm5lbE1hc2ssIHRyYWNrLT5tQ2hhbm5lbE1hc2spOworICAgIC8vIE5vbi1BUEkgZW50cmllcywgdGhlc2UgY2FuIGNoYW5nZSBkdWUgdG8gYSBKYXZhIHN0cmluZyBtaXN0YWtlLgorICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggInNhbXBsZVJhdGUiLCAoaW50MzJfdCl0cmFjay0+bVNhbXBsZVJhdGUpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChNTV9QUkVGSVggImNoYW5uZWxNYXNrIiwgKGludDY0X3QpdHJhY2stPm1DaGFubmVsTWFzayk7CisgICAgLy8gTm9uLUFQSSBlbnRyaWVzLCB0aGVzZSBjYW4gY2hhbmdlLgorICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggInBvcnRJZCIsIChpbnQzMl90KXRyYWNrLT5tUG9ydElkKTsKKyAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggImVuY29kaW5nIiwgdG9TdHJpbmcodHJhY2stPm1Gb3JtYXQpLmNfc3RyKCkpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggImZyYW1lQ291bnQiLCAoaW50MzJfdCl0cmFjay0+bUZyYW1lQ291bnQpOworICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAiYXR0cmlidXRlcyIsIHRvU3RyaW5nKHRyYWNrLT5tQXR0cmlidXRlcykuY19zdHIoKSk7CiB9CiAKIC8vIGhhbmQgdGhlIHVzZXIgYSBzbmFwc2hvdCBvZiB0aGUgbWV0cmljcy4KQEAgLTI4MiwxMCArMjUwLDcgQEAKICAgICAgIG1QcmV2aW91c1NjaGVkdWxpbmdHcm91cChTUF9ERUZBVUxUKSwKICAgICAgIG1QYXVzZWRQb3NpdGlvbigwKQogewotICAgIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOOwotICAgIG1BdHRyaWJ1dGVzLnVzYWdlID0gQVVESU9fVVNBR0VfVU5LTk9XTjsKLSAgICBtQXR0cmlidXRlcy5mbGFncyA9IDB4MDsKLSAgICBzdHJjcHkobUF0dHJpYnV0ZXMudGFncywgIiIpOworICAgIG1BdHRyaWJ1dGVzID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKIAogICAgICh2b2lkKXNldChzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgZnJhbWVDb3VudCwgZmxhZ3MsIGNiZiwgdXNlciwgbm90aWZpY2F0aW9uRnJhbWVzLApAQCAtMzE4LDEwICsyODMsNyBAQAogICAgICAgbVBhdXNlZFBvc2l0aW9uKDApLAogICAgICAgbVNlbGVjdGVkRGV2aWNlSWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkKIHsKLSAgICBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTjsKLSAgICBtQXR0cmlidXRlcy51c2FnZSA9IEFVRElPX1VTQUdFX1VOS05PV047Ci0gICAgbUF0dHJpYnV0ZXMuZmxhZ3MgPSAweDA7Ci0gICAgc3RyY3B5KG1BdHRyaWJ1dGVzLnRhZ3MsICIiKTsKKyAgICBtQXR0cmlidXRlcyA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CiAKICAgICAodm9pZClzZXQoc3RyZWFtVHlwZSwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywKICAgICAgICAgICAgIDAgLypmcmFtZUNvdW50Ki8sIGZsYWdzLCBjYmYsIHVzZXIsIG5vdGlmaWNhdGlvbkZyYW1lcywKQEAgLTM0NywxNCArMzA5LDE1IEBACiAgICAgICAgIH0KICAgICAgICAgLy8gTm8gbG9jayBoZXJlOiB3b3JzdCBjYXNlIHdlIHJlbW92ZSBhIE5VTEwgY2FsbGJhY2sgd2hpY2ggd2lsbCBiZSBhIG5vcAogICAgICAgICBpZiAobURldmljZUNhbGxiYWNrICE9IDAgJiYgbU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtT3V0cHV0LCBtUG9ydElkKTsKICAgICAgICAgfQogICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihtQXVkaW9UcmFjayktPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIsIHRoaXMpOwogICAgICAgICBtQXVkaW9UcmFjay5jbGVhcigpOwogICAgICAgICBtQ2Jsa01lbW9yeS5jbGVhcigpOwogICAgICAgICBtU2hhcmVkQnVmZmVyLmNsZWFyKCk7CiAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICAgICAgQUxPR1YoIn5BdWRpb1RyYWNrLCByZWxlYXNpbmcgc2Vzc2lvbiBpZCAlZCBmcm9tICVkIG9uIGJlaGFsZiBvZiAlZCIsCisgICAgICAgIEFMT0dWKCIlcyglZCksIHJlbGVhc2luZyBzZXNzaW9uIGlkICVkIGZyb20gJWQgb24gYmVoYWxmIG9mICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOwogICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZUF1ZGlvU2Vzc2lvbklkKG1TZXNzaW9uSWQsIG1DbGllbnRQaWQpOwogICAgIH0KQEAgLTM4Nyw4ICszNTAsMTAgQEAKICAgICBwaWRfdCBjYWxsaW5nUGlkOwogICAgIHBpZF90IG15UGlkOwogCi0gICAgQUxPR1YoInNldCgpOiBzdHJlYW1UeXBlICVkLCBzYW1wbGVSYXRlICV1LCBmb3JtYXQgJSN4LCBjaGFubmVsTWFzayAlI3gsIGZyYW1lQ291bnQgJXp1LCAiCisgICAgLy8gTm90ZSBtUG9ydElkIGlzIG5vdCB2YWxpZCB1bnRpbCB0aGUgdHJhY2sgaXMgY3JlYXRlZCwgc28gb21pdCBtUG9ydElkIGluIEFMT0cgZm9yIHNldC4KKyAgICBBTE9HVigiJXMoKTogc3RyZWFtVHlwZSAlZCwgc2FtcGxlUmF0ZSAldSwgZm9ybWF0ICUjeCwgY2hhbm5lbE1hc2sgJSN4LCBmcmFtZUNvdW50ICV6dSwgIgogICAgICAgICAgICJmbGFncyAjJXgsIG5vdGlmaWNhdGlvbkZyYW1lcyAlZCwgc2Vzc2lvbklkICVkLCB0cmFuc2ZlclR5cGUgJWQsIHVpZCAlZCwgcGlkICVkIiwKKyAgICAgICAgICBfX2Z1bmNfXywKICAgICAgICAgICBzdHJlYW1UeXBlLCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBmbGFncywgbm90aWZpY2F0aW9uRnJhbWVzLAogICAgICAgICAgIHNlc3Npb25JZCwgdHJhbnNmZXJUeXBlLCB1aWQsIHBpZCk7CiAKQEAgLTQwNyw4ICszNzIsMTAgQEAKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBjYXNlIFRSQU5TRkVSX0NBTExCQUNLOgorICAgIGNhc2UgVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSzoKICAgICAgICAgaWYgKGNiZiA9PSBOVUxMIHx8IHNoYXJlZEJ1ZmZlciAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVHJhbnNmZXIgdHlwZSBUUkFOU0ZFUl9DQUxMQkFDSyBidXQgY2JmID09IE5VTEwgfHwgc2hhcmVkQnVmZmVyICE9IDAiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpOiBUcmFuc2ZlciB0eXBlICVzIGJ1dCBjYmYgPT0gTlVMTCB8fCBzaGFyZWRCdWZmZXIgIT0gMCIsCisgICAgICAgICAgICAgICAgICAgIGNvbnZlcnRUcmFuc2ZlclRvVGV4dCh0cmFuc2ZlclR5cGUpLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KQEAgLTQxNiwyMCArMzgzLDIxIEBACiAgICAgY2FzZSBUUkFOU0ZFUl9PQlRBSU46CiAgICAgY2FzZSBUUkFOU0ZFUl9TWU5DOgogICAgICAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX09CVEFJTiBidXQgc2hhcmVkQnVmZmVyICE9IDAiKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcygpOiBUcmFuc2ZlciB0eXBlIFRSQU5TRkVSX09CVEFJTiBidXQgc2hhcmVkQnVmZmVyICE9IDAiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBUUkFOU0ZFUl9TSEFSRUQ6CiAgICAgICAgIGlmIChzaGFyZWRCdWZmZXIgPT0gMCkgewotICAgICAgICAgICAgQUxPR0UoIlRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfU0hBUkVEIGJ1dCBzaGFyZWRCdWZmZXIgPT0gMCIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IFRyYW5zZmVyIHR5cGUgVFJBTlNGRVJfU0hBUkVEIGJ1dCBzaGFyZWRCdWZmZXIgPT0gMCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgotICAgICAgICBBTE9HRSgiSW52YWxpZCB0cmFuc2ZlciB0eXBlICVkIiwgdHJhbnNmZXJUeXBlKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgdHJhbnNmZXIgdHlwZSAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIHRyYW5zZmVyVHlwZSk7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTQzNywxNCArNDA1LDE1IEBACiAgICAgbVRyYW5zZmVyID0gdHJhbnNmZXJUeXBlOwogICAgIG1Eb05vdFJlY29ubmVjdCA9IGRvTm90UmVjb25uZWN0OwogCi0gICAgQUxPR1ZfSUYoc2hhcmVkQnVmZmVyICE9IDAsICJzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlenUiLCBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSwKLSAgICAgICAgICAgIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKKyAgICBBTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgIiVzKCk6IHNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKIAotICAgIEFMT0dWKCJzZXQoKSBzdHJlYW1UeXBlICVkIGZyYW1lQ291bnQgJXp1IGZsYWdzICUwNHgiLCBzdHJlYW1UeXBlLCBmcmFtZUNvdW50LCBmbGFncyk7CisgICAgQUxPR1YoIiVzKCk6IHN0cmVhbVR5cGUgJWQgZnJhbWVDb3VudCAlenUgZmxhZ3MgJTA0eCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgc3RyZWFtVHlwZSwgZnJhbWVDb3VudCwgZmxhZ3MpOwogCiAgICAgLy8gaW52YXJpYW50IHRoYXQgbUF1ZGlvVHJhY2sgIT0gMCBpcyB0cnVlIG9ubHkgYWZ0ZXIgc2V0KCkgcmV0dXJucyBzdWNjZXNzZnVsbHkKICAgICBpZiAobUF1ZGlvVHJhY2sgIT0gMCkgewotICAgICAgICBBTE9HRSgiVHJhY2sgYWxyZWFkeSBpbiB1c2UiKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IFRyYWNrIGFscmVhZHkgaW4gdXNlIiwgX19mdW5jX18pOwogICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KQEAgLTQ1NSw3ICs0MjQsNyBAQAogICAgIH0KICAgICBpZiAocEF0dHJpYnV0ZXMgPT0gTlVMTCkgewogICAgICAgICBpZiAodWludDMyX3Qoc3RyZWFtVHlwZSkgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIHN0cmVhbSB0eXBlICVkIiwgc3RyZWFtVHlwZSk7CisgICAgICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCBzdHJlYW0gdHlwZSAlZCIsIF9fZnVuY19fLCBzdHJlYW1UeXBlKTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtNDY0LDE5ICs0MzMsMTIgQEAKICAgICB9IGVsc2UgewogICAgICAgICAvLyBzdHJlYW0gdHlwZSBzaG91bGRuJ3QgYmUgbG9va2VkIGF0LCB0aGlzIHRyYWNrIGhhcyBhdWRpbyBhdHRyaWJ1dGVzCiAgICAgICAgIG1lbWNweSgmbUF0dHJpYnV0ZXMsIHBBdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgICAgIEFMT0dWKCJCdWlsZGluZyBBdWRpb1RyYWNrIHdpdGggYXR0cmlidXRlczogdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCi0gICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMudXNhZ2UsIG1BdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSwgbUF0dHJpYnV0ZXMuZmxhZ3MsIG1BdHRyaWJ1dGVzLnRhZ3MpOworICAgICAgICBBTE9HVigiJXMoKTogQnVpbGRpbmcgQXVkaW9UcmFjayB3aXRoIGF0dHJpYnV0ZXM6IgorICAgICAgICAgICAgICAgICIgdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sCisgICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLnVzYWdlLCBtQXR0cmlidXRlcy5jb250ZW50X3R5cGUsIG1BdHRyaWJ1dGVzLmZsYWdzLCBtQXR0cmlidXRlcy50YWdzKTsKICAgICAgICAgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fREVGQVVMVDsKLSAgICAgICAgaWYgKChtQXR0cmlidXRlcy5mbGFncyAmIEFVRElPX0ZMQUdfSFdfQVZfU1lOQykgIT0gMCkgewotICAgICAgICAgICAgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKChtQXR0cmlidXRlcy5mbGFncyAmIEFVRElPX0ZMQUdfTE9XX0xBVEVOQ1kpICE9IDApIHsKLSAgICAgICAgICAgIGZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19GQVNUKTsKLSAgICAgICAgfQotICAgICAgICAvLyBjaGVjayBkZWVwIGJ1ZmZlciBhZnRlciBmbGFncyBoYXZlIGJlZW4gbW9kaWZpZWQgYWJvdmUKLSAgICAgICAgaWYgKGZsYWdzID09IEFVRElPX09VVFBVVF9GTEFHX05PTkUgJiYgKG1BdHRyaWJ1dGVzLmZsYWdzICYgQVVESU9fRkxBR19ERUVQX0JVRkZFUikgIT0gMCkgewotICAgICAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUjsKLSAgICAgICAgfQorICAgICAgICBhdWRpb19mbGFnc190b19hdWRpb19vdXRwdXRfZmxhZ3MobUF0dHJpYnV0ZXMuZmxhZ3MsICZmbGFncyk7CiAgICAgfQogCiAgICAgLy8gdGhlc2UgYmVsb3cgc2hvdWxkIHByb2JhYmx5IGNvbWUgZnJvbSB0aGUgYXVkaW9GbGluZ2VyIHRvby4uLgpAQCAtNDg4LDE0ICs0NTAsMTQgQEAKIAogICAgIC8vIHZhbGlkYXRlIHBhcmFtZXRlcnMKICAgICBpZiAoIWF1ZGlvX2lzX3ZhbGlkX2Zvcm1hdChmb3JtYXQpKSB7Ci0gICAgICAgIEFMT0dFKCJJbnZhbGlkIGZvcm1hdCAlI3giLCBmb3JtYXQpOworICAgICAgICBBTE9HRSgiJXMoKTogSW52YWxpZCBmb3JtYXQgJSN4IiwgX19mdW5jX18sIGZvcm1hdCk7CiAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICBtRm9ybWF0ID0gZm9ybWF0OwogCiAgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfY2hhbm5lbChjaGFubmVsTWFzaykpIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgQUxPR0UoIiVzKCk6IEludmFsaWQgY2hhbm5lbCBtYXNrICUjeCIsICBfX2Z1bmNfXywgY2hhbm5lbE1hc2spOwogICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC01MDgsOCArNDcwLDkgQEAKICAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkKICAgICAgICAgICAgIHx8ICFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkpIHsKICAgICAgICAgQUxPR1YoIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpCi0gICAgICAgICAgICAgICAgICAgID8gIk9mZmxvYWQgcmVxdWVzdCwgZm9yY2luZyB0byBEaXJlY3QgT3V0cHV0IgotICAgICAgICAgICAgICAgICAgICA6ICJOb3QgbGluZWFyIFBDTSwgZm9yY2luZyB0byBEaXJlY3QgT3V0cHV0Iik7CisgICAgICAgICAgICAgICAgICAgID8gIiVzKCk6IE9mZmxvYWQgcmVxdWVzdCwgZm9yY2luZyB0byBEaXJlY3QgT3V0cHV0IgorICAgICAgICAgICAgICAgICAgICA6ICIlcygpOiBOb3QgbGluZWFyIFBDTSwgZm9yY2luZyB0byBEaXJlY3QgT3V0cHV0IiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18pOwogICAgICAgICBmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkKICAgICAgICAgICAgICAgICAvLyBGSVhNRSB3aHkgY2FuJ3Qgd2UgYWxsb3cgZGlyZWN0IEFORCBmYXN0PwogICAgICAgICAgICAgICAgICgoZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwpAQCAtNTY1LDE0ICs1MjgsMTQgQEAKICAgICAgICAgbU5vdGlmaWNhdGlvbnNQZXJCdWZmZXJSZXEgPSAwOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmICghKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJub3RpZmljYXRpb25GcmFtZXM9JWQgbm90IHBlcm1pdHRlZCBmb3Igbm9uLWZhc3QgdHJhY2siLAotICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IG5vdGlmaWNhdGlvbkZyYW1lcz0lZCBub3QgcGVybWl0dGVkIGZvciBub24tZmFzdCB0cmFjayIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBub3RpZmljYXRpb25GcmFtZXMpOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAgICAgICAgIGlmIChmcmFtZUNvdW50ID4gMCkgewotICAgICAgICAgICAgQUxPR0UoIm5vdGlmaWNhdGlvbkZyYW1lcz0lZCBub3QgcGVybWl0dGVkIHdpdGggbm9uLXplcm8gZnJhbWVDb3VudD0lenUiLAotICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25GcmFtZXMsIGZyYW1lQ291bnQpOworICAgICAgICAgICAgQUxPR0UoIiVzKCk6IG5vdGlmaWNhdGlvbkZyYW1lcz0lZCBub3QgcGVybWl0dGVkIHdpdGggbm9uLXplcm8gZnJhbWVDb3VudD0lenUiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbm90aWZpY2F0aW9uRnJhbWVzLCBmcmFtZUNvdW50KTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgfQpAQCAtNTgyLDcgKzU0NSw4IEBACiAgICAgICAgIG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxID0gbWluKG1heE5vdGlmaWNhdGlvbnNQZXJCdWZmZXIsCiAgICAgICAgICAgICAgICAgbWF4KCh1aW50MzJfdCkgLW5vdGlmaWNhdGlvbkZyYW1lcywgbWluTm90aWZpY2F0aW9uc1BlckJ1ZmZlcikpOwogICAgICAgICBBTE9HV19JRihtTm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSAhPSAodWludDMyX3QpIC1ub3RpZmljYXRpb25GcmFtZXMsCi0gICAgICAgICAgICAgICAgIm5vdGlmaWNhdGlvbkZyYW1lcz0lZCBjbGFtcGVkIHRvIHRoZSByYW5nZSAtJXUgdG8gLSV1IiwKKyAgICAgICAgICAgICAgICAiJXMoKTogbm90aWZpY2F0aW9uRnJhbWVzPSVkIGNsYW1wZWQgdG8gdGhlIHJhbmdlIC0ldSB0byAtJXUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLAogICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkZyYW1lcywgbWluTm90aWZpY2F0aW9uc1BlckJ1ZmZlciwgbWF4Tm90aWZpY2F0aW9uc1BlckJ1ZmZlcik7CiAgICAgfQogICAgIG1Ob3RpZmljYXRpb25GcmFtZXNBY3QgPSAwOwpAQCAtNjAzLDE0ICs1NjcsMTYgQEAKICAgICBtQ2JmID0gY2JmOwogCiAgICAgaWYgKGNiZiAhPSBOVUxMKSB7Ci0gICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkID0gbmV3IEF1ZGlvVHJhY2tUaHJlYWQoKnRoaXMsIHRocmVhZENhbkNhbGxKYXZhKTsKKyAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQgPSBuZXcgQXVkaW9UcmFja1RocmVhZCgqdGhpcyk7CiAgICAgICAgIG1BdWRpb1RyYWNrVGhyZWFkLT5ydW4oIkF1ZGlvVHJhY2siLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPLCAwIC8qc3RhY2sqLyk7CiAgICAgICAgIC8vIHRocmVhZCBiZWdpbnMgaW4gcGF1c2VkIHN0YXRlLCBhbmQgd2lsbCBub3QgcmVmZXJlbmNlIHVzIHVudGlsIHN0YXJ0KCkKICAgICB9CiAKICAgICAvLyBjcmVhdGUgdGhlIElBdWRpb1RyYWNrCi0gICAgc3RhdHVzID0gY3JlYXRlVHJhY2tfbCgpOwotCisgICAgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgIHN0YXR1cyA9IGNyZWF0ZVRyYWNrX2woKTsKKyAgICB9CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBpZiAobUF1ZGlvVHJhY2tUaHJlYWQgIT0gMCkgewogICAgICAgICAgICAgbUF1ZGlvVHJhY2tUaHJlYWQtPnJlcXVlc3RFeGl0KCk7ICAgLy8gc2VlIGNvbW1lbnQgaW4gQXVkaW9UcmFjay5oCkBAIC02MzksNyArNjA1LDEwIEBACiAgICAgbUluVW5kZXJydW4gPSBmYWxzZTsKICAgICBtUHJldmlvdXNUaW1lc3RhbXBWYWxpZCA9IGZhbHNlOwogICAgIG1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQgPSBmYWxzZTsKLSAgICBtUmV0cm9ncmFkZU1vdGlvblJlcG9ydGVkID0gZmFsc2U7CisgICAgbVRpbWVzdGFtcFJldHJvZ3JhZGVQb3NpdGlvblJlcG9ydGVkID0gZmFsc2U7CisgICAgbVRpbWVzdGFtcFJldHJvZ3JhZGVUaW1lUmVwb3J0ZWQgPSBmYWxzZTsKKyAgICBtVGltZXN0YW1wU3RhbGxSZXBvcnRlZCA9IGZhbHNlOworICAgIG1UaW1lc3RhbXBTdGFsZVRpbWVSZXBvcnRlZCA9IGZhbHNlOwogICAgIG1QcmV2aW91c0xvY2F0aW9uID0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0lOVkFMSUQ7CiAgICAgbVN0YXJ0VHMubVBvc2l0aW9uID0gMDsKICAgICBtVW5kZXJydW5Db3VudE9mZnNldCA9IDA7CkBAIC02NTgsNiArNjI3LDcgQEAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnN0YXJ0KCkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgQUxPR1YoIiVzKCVkKTogcHJpb3Igc3RhdGU6JXMiLCBfX2Z1bmNfXywgbVBvcnRJZCwgc3RhdGVUb1N0cmluZyhtU3RhdGUpKTsKIAogICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQUNUSVZFKSB7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKQEAgLTY4OSw3ICs2NTksMTAgQEAKICAgICAgICAgbVBvc2l0aW9uID0gMDsKICAgICAgICAgbVByZXZpb3VzVGltZXN0YW1wVmFsaWQgPSBmYWxzZTsKICAgICAgICAgbVRpbWVzdGFtcFN0YXJ0dXBHbGl0Y2hSZXBvcnRlZCA9IGZhbHNlOwotICAgICAgICBtUmV0cm9ncmFkZU1vdGlvblJlcG9ydGVkID0gZmFsc2U7CisgICAgICAgIG1UaW1lc3RhbXBSZXRyb2dyYWRlUG9zaXRpb25SZXBvcnRlZCA9IGZhbHNlOworICAgICAgICBtVGltZXN0YW1wUmV0cm9ncmFkZVRpbWVSZXBvcnRlZCA9IGZhbHNlOworICAgICAgICBtVGltZXN0YW1wU3RhbGxSZXBvcnRlZCA9IGZhbHNlOworICAgICAgICBtVGltZXN0YW1wU3RhbGVUaW1lUmVwb3J0ZWQgPSBmYWxzZTsKICAgICAgICAgbVByZXZpb3VzTG9jYXRpb24gPSBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fSU5WQUxJRDsKIAogICAgICAgICBpZiAoIWlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpCkBAIC02OTcsNyArNjcwLDggQEAKICAgICAgICAgICAgIC8vIFNlcnZlciBzaWRlIGhhcyBjb25zdW1lZCBzb21ldGhpbmcsIGJ1dCBpcyBpdCBmaW5pc2hlZCBjb25zdW1pbmc/CiAgICAgICAgICAgICAvLyBJdCBpcyBwb3NzaWJsZSBzaW5jZSBmbHVzaCBhbmQgc3RvcCBhcmUgYXN5bmNocm9ub3VzIHRoYXQgdGhlIHNlcnZlcgogICAgICAgICAgICAgLy8gaXMgc3RpbGwgYWN0aXZlIGF0IHRoaXMgcG9pbnQuCi0gICAgICAgICAgICBBTE9HVigic3RhcnQ6IHNlcnZlciByZWFkOiVsbGQgIGN1bXVsYXRpdmUgZmx1c2hlZDolbGxkICBjbGllbnQgd3JpdHRlbjolbGxkIiwKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHNlcnZlciByZWFkOiVsbGQgIGN1bXVsYXRpdmUgZmx1c2hlZDolbGxkICBjbGllbnQgd3JpdHRlbjolbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKG1GcmFtZXNXcml0dGVuU2VydmVyT2Zmc2V0CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtU3RhcnRFdHMubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdKSwKICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltU3RhcnRFdHMubUZsdXNoZWQsCkBAIC03NTgsNyArNzMyLDcgQEAKICAgICAgICAgLy8gU3RhcnQgb3VyIGxvY2FsIFZvbHVtZUhhbmRsZXIgZm9yIHJlc3RvcmF0aW9uIHB1cnBvc2VzLgogICAgICAgICBtVm9sdW1lSGFuZGxlci0+c2V0U3RhcnRlZCgpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydCgpIHN0YXR1cyAlZCIsIHN0YXR1cyk7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IHN0YXR1cyAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMpOwogICAgICAgICBtU3RhdGUgPSBwcmV2aW91c1N0YXRlOwogICAgICAgICBpZiAodCAhPSAwKSB7CiAgICAgICAgICAgICBpZiAocHJldmlvdXNTdGF0ZSAhPSBTVEFURV9TVE9QUElORykgewpAQCAtNzc2LDYgKzc1MCw4IEBACiB2b2lkIEF1ZGlvVHJhY2s6OnN0b3AoKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBwcmlvciBzdGF0ZTolcyIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0ZVRvU3RyaW5nKG1TdGF0ZSkpOworCiAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9BQ1RJVkUgJiYgbVN0YXRlICE9IFNUQVRFX1BBVVNFRCkgewogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNzg1LDcgKzc2MSw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRDsKICAgICAgICAgQUxPR0RfSUYobVNoYXJlZEJ1ZmZlciA9PSBudWxscHRyLAotICAgICAgICAgICAgICAgICJzdG9wKCkgY2FsbGVkIHdpdGggJXUgZnJhbWVzIGRlbGl2ZXJlZCIsIG1SZWxlYXNlZC52YWx1ZSgpKTsKKyAgICAgICAgICAgICAgICAiJXMoJWQpOiBjYWxsZWQgd2l0aCAldSBmcmFtZXMgZGVsaXZlcmVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIG1SZWxlYXNlZC52YWx1ZSgpKTsKICAgICAgICAgbVJlbGVhc2VkID0gMDsKICAgICB9CiAKQEAgLTgwNiw2ICs3ODIsMTAgQEAKICAgICBpZiAodCAhPSAwKSB7CiAgICAgICAgIGlmICghaXNPZmZsb2FkZWRfbCgpKSB7CiAgICAgICAgICAgICB0LT5wYXVzZSgpOworICAgICAgICB9IGVsc2UgaWYgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLKSB7CisgICAgICAgICAgICAvLyBjYXVzZXMgd2FrZSB1cCBvZiB0aGUgcGxheWJhY2sgdGhyZWFkLCB0aGF0IHdpbGwgY2FsbGJhY2sgdGhlIGNsaWVudCBmb3IKKyAgICAgICAgICAgIC8vIEVWRU5UX1NUUkVBTV9FTkQgaW4gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkKKyAgICAgICAgICAgIHQtPndha2UoKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIHNldHByaW9yaXR5KFBSSU9fUFJPQ0VTUywgMCwgbVByZXZpb3VzUHJpb3JpdHkpOwpAQCAtODIxLDEwICs4MDEsMTIgQEAKIAogdm9pZCBBdWRpb1RyYWNrOjpmbHVzaCgpCiB7CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIEFMT0dWKCIlcyglZCk6IHByaW9yIHN0YXRlOiVzIiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXRlVG9TdHJpbmcobVN0YXRlKSk7CisKICAgICBpZiAobVNoYXJlZEJ1ZmZlciAhPSAwKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfQUNUSVZFKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CkBAIC04NTMsNiArODM1LDggQEAKIHZvaWQgQXVkaW9UcmFjazo6cGF1c2UoKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBwcmlvciBzdGF0ZTolcyIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0ZVRvU3RyaW5nKG1TdGF0ZSkpOworCiAgICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9BQ1RJVkUpIHsKICAgICAgICAgbVN0YXRlID0gU1RBVEVfUEFVU0VEOwogICAgIH0gZWxzZSBpZiAobVN0YXRlID09IFNUQVRFX1NUT1BQSU5HKSB7CkBAIC04NzgsNyArODYyLDggQEAKIAogICAgICAgICAgICAgdWludDMyX3QgaGFsRnJhbWVzOwogICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmdldFJlbmRlclBvc2l0aW9uKG1PdXRwdXQsICZoYWxGcmFtZXMsICZtUGF1c2VkUG9zaXRpb24pOwotICAgICAgICAgICAgQUxPR1YoIkF1ZGlvVHJhY2s6OnBhdXNlIGZvciBvZmZsb2FkLCBjYWNoZSBjdXJyZW50IHBvc2l0aW9uICV1IiwgbVBhdXNlZFBvc2l0aW9uKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IGZvciBvZmZsb2FkLCBjYWNoZSBjdXJyZW50IHBvc2l0aW9uICV1IiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIG1QYXVzZWRQb3NpdGlvbik7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC05MzIsMTAgKzkxNywxMyBAQAogc3RhdHVzX3QgQXVkaW9UcmFjazo6c2V0U2FtcGxlUmF0ZSh1aW50MzJfdCByYXRlKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICBBTE9HVigiJXMoJWQpOiBwcmlvciBzdGF0ZTolcyByYXRlOiV1IiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXRlVG9TdHJpbmcobVN0YXRlKSwgcmF0ZSk7CisKICAgICBpZiAocmF0ZSA9PSBtU2FtcGxlUmF0ZSkgewogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQotICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSB8fCAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkpIHsKKyAgICBpZiAoaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgfHwgKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpCisgICAgICAgICAgICB8fCAobUNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIGlmIChtT3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CkBAIC05OTcsOCArOTg1LDggQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUgKGlucHV0KTogbVNhbXBsZVJhdGU6JXUgIG1TcGVlZDolZiAgbVBpdGNoOiVmIiwKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICBBTE9HVigiJXMoJWQpOiBtU2FtcGxlUmF0ZToldSAgbVNwZWVkOiVmICBtUGl0Y2g6JWYiLAorICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIG1TYW1wbGVSYXRlLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKICAgICAvLyBwaXRjaCBpcyBlbXVsYXRlZCBieSBhZGp1c3Rpbmcgc3BlZWQgYW5kIHNhbXBsZVJhdGUKICAgICBjb25zdCB1aW50MzJfdCBlZmZlY3RpdmVSYXRlID0gYWRqdXN0U2FtcGxlUmF0ZShtU2FtcGxlUmF0ZSwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CiAgICAgY29uc3QgZmxvYXQgZWZmZWN0aXZlU3BlZWQgPSBhZGp1c3RTcGVlZChwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKQEAgLTEwMDcsMzIgKzk5NSwzMiBAQAogICAgIHBsYXliYWNrUmF0ZVRlbXAubVNwZWVkID0gZWZmZWN0aXZlU3BlZWQ7CiAgICAgcGxheWJhY2tSYXRlVGVtcC5tUGl0Y2ggPSBlZmZlY3RpdmVQaXRjaDsKIAotICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUgKGVmZmVjdGl2ZSk6IG1TYW1wbGVSYXRlOiV1ICBtU3BlZWQ6JWYgIG1QaXRjaDolZiIsCi0gICAgICAgICAgICBlZmZlY3RpdmVSYXRlLCBlZmZlY3RpdmVTcGVlZCwgZWZmZWN0aXZlUGl0Y2gpOworICAgIEFMT0dWKCIlcyglZCkgKGVmZmVjdGl2ZSkgbVNhbXBsZVJhdGU6JXUgIG1TcGVlZDolZiAgbVBpdGNoOiVmIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBlZmZlY3RpdmVSYXRlLCBlZmZlY3RpdmVTcGVlZCwgZWZmZWN0aXZlUGl0Y2gpOwogCiAgICAgaWYgKCFpc0F1ZGlvUGxheWJhY2tSYXRlVmFsaWQocGxheWJhY2tSYXRlVGVtcCkpIHsKLSAgICAgICAgQUxPR1coInNldFBsYXliYWNrUmF0ZSglZiwgJWYpIGZhaWxlZCAoZWZmZWN0aXZlIHJhdGUgb3V0IG9mIGJvdW5kcykiLAotICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOworICAgICAgICBBTE9HVygiJXMoJWQpICglZiwgJWYpIGZhaWxlZCAoZWZmZWN0aXZlIHJhdGUgb3V0IG9mIGJvdW5kcykiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gQ2hlY2sgaWYgdGhlIGJ1ZmZlciBzaXplIGlzIGNvbXBhdGlibGUuCiAgICAgaWYgKCFpc1NhbXBsZVJhdGVTcGVlZEFsbG93ZWRfbChlZmZlY3RpdmVSYXRlLCBlZmZlY3RpdmVTcGVlZCkpIHsKLSAgICAgICAgQUxPR1coInNldFBsYXliYWNrUmF0ZSglZiwgJWYpIGZhaWxlZCAoYnVmZmVyIHNpemUpIiwKLSAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQgKGJ1ZmZlciBzaXplKSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHBsYXliYWNrUmF0ZS5tU3BlZWQsIHBsYXliYWNrUmF0ZS5tUGl0Y2gpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIC8vIENoZWNrIHJlc2FtcGxlciByYXRpb3MgYXJlIHdpdGhpbiBib3VuZHMKICAgICBpZiAoKHVpbnQ2NF90KWVmZmVjdGl2ZVJhdGUgPiAodWludDY0X3QpbVNhbXBsZVJhdGUgKgogICAgICAgICAgICAgKHVpbnQ2NF90KUFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWCkgewotICAgICAgICBBTE9HVygic2V0UGxheWJhY2tSYXRlKCVmLCAlZikgZmFpbGVkLiBSZXNhbXBsZSByYXRlIGV4Y2VlZHMgbWF4IGFjY2VwdGVkIHZhbHVlIiwKLSAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQuIFJlc2FtcGxlIHJhdGUgZXhjZWVkcyBtYXggYWNjZXB0ZWQgdmFsdWUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBpZiAoKHVpbnQ2NF90KWVmZmVjdGl2ZVJhdGUgKiAodWludDY0X3QpQVVESU9fUkVTQU1QTEVSX1VQX1JBVElPX01BWCA8ICh1aW50NjRfdCltU2FtcGxlUmF0ZSkgewotICAgICAgICBBTE9HVygic2V0UGxheWJhY2tSYXRlKCVmLCAlZikgZmFpbGVkLiBSZXNhbXBsZSByYXRlIGJlbG93IG1pbiBhY2NlcHRlZCB2YWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUubVNwZWVkLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKSAoJWYsICVmKSBmYWlsZWQuIFJlc2FtcGxlIHJhdGUgYmVsb3cgbWluIGFjY2VwdGVkIHZhbHVlIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgcGxheWJhY2tSYXRlLm1TcGVlZCwgcGxheWJhY2tSYXRlLm1QaXRjaCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIG1QbGF5YmFja1JhdGUgPSBwbGF5YmFja1JhdGU7CkBAIC0xMjMzLDcgKzEyMjEsOCBAQAogICAgICAgICB1aW50MzJfdCBkc3BGcmFtZXMgPSAwOwogCiAgICAgICAgIGlmIChpc09mZmxvYWRlZF9sKCkgJiYgKChtU3RhdGUgPT0gU1RBVEVfUEFVU0VEKSB8fCAobVN0YXRlID09IFNUQVRFX1BBVVNFRF9TVE9QUElORykpKSB7Ci0gICAgICAgICAgICBBTE9HVigiZ2V0UG9zaXRpb24gY2FsbGVkIGluIHBhdXNlZCBzdGF0ZSwgcmV0dXJuIGNhY2hlZCBwb3NpdGlvbiAldSIsIG1QYXVzZWRQb3NpdGlvbik7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBjYWxsZWQgaW4gcGF1c2VkIHN0YXRlLCByZXR1cm4gY2FjaGVkIHBvc2l0aW9uICV1IiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVBhdXNlZFBvc2l0aW9uKTsKICAgICAgICAgICAgICpwb3NpdGlvbiA9IG1QYXVzZWRQb3NpdGlvbjsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQpAQCAtMTM2MCw3ICsxMzQ5LDcgQEAKIGF1ZGlvX3N0cmVhbV90eXBlX3QgQXVkaW9UcmFjazo6c3RyZWFtVHlwZSgpIGNvbnN0CiB7CiAgICAgaWYgKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSB7Ci0gICAgICAgIHJldHVybiBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKCZtQXR0cmlidXRlcyk7CisgICAgICAgIHJldHVybiBBdWRpb1N5c3RlbTo6YXR0cmlidXRlc1RvU3RyZWFtVHlwZShtQXR0cmlidXRlcyk7CiAgICAgfQogICAgIHJldHVybiBtU3RyZWFtVHlwZTsKIH0KQEAgLTEzNzksNyArMTM2OCw3IEBACiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldExhdGVuY3kobU91dHB1dCwgJm1BZkxhdGVuY3kpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1coImdldExhdGVuY3koJWQpIGZhaWxlZCBzdGF0dXMgJWQiLCBtT3V0cHV0LCBzdGF0dXMpOworICAgICAgICBBTE9HVygiJXMoJWQpOiBnZXRMYXRlbmN5KCVkKSBmYWlsZWQgc3RhdHVzICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIG1PdXRwdXQsIHN0YXR1cyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gRklYTUUgZG9uJ3QgYmVsaWV2ZSB0aGlzIGxpZQogICAgICAgICBtTGF0ZW5jeSA9IG1BZkxhdGVuY3kgKyAoMTAwMExMICogbUZyYW1lQ291bnQpIC8gbVNhbXBsZVJhdGU7CkBAIC0xMzk1LDYgKzEzODQsNyBAQAogICAgICAgICBNRURJQV9DQVNFX0VOVU0oVFJBTlNGRVJfT0JUQUlOKTsKICAgICAgICAgTUVESUFfQ0FTRV9FTlVNKFRSQU5TRkVSX1NZTkMpOwogICAgICAgICBNRURJQV9DQVNFX0VOVU0oVFJBTlNGRVJfU0hBUkVEKTsKKyAgICAgICAgTUVESUFfQ0FTRV9FTlVNKFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuICJVTlJFQ09HTklaRUQiOwogICAgIH0KQEAgLTE0MDcsNyArMTM5Nyw4IEBACiAKICAgICBjb25zdCBzcDxJQXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyID0gQXVkaW9TeXN0ZW06OmdldF9hdWRpb19mbGluZ2VyKCk7CiAgICAgaWYgKGF1ZGlvRmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBDb3VsZCBub3QgZ2V0IGF1ZGlvZmxpbmdlciIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICBzdGF0dXMgPSBOT19JTklUOwogICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQpAQCAtMTQyNiwxMSArMTQxNywxNCBAQAogICAgICAgICAgICAgLy8gdXNlIGNhc2UgMzogb2J0YWluL3JlbGVhc2UgbW9kZQogICAgICAgICAgICAgKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9PQlRBSU4pIHx8CiAgICAgICAgICAgICAvLyB1c2UgY2FzZSA0OiBzeW5jaHJvbm91cyB3cml0ZQotICAgICAgICAgICAgKChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQykgJiYgbVRocmVhZENhbkNhbGxKYXZhKTsKKyAgICAgICAgICAgICgobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkMgfHwgbVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spCisgICAgICAgICAgICAgICAgICAgICYmIG1UaHJlYWRDYW5DYWxsSmF2YSk7CiAKICAgICAgICAgYm9vbCBmYXN0QWxsb3dlZCA9IHNoYXJlZEJ1ZmZlciB8fCB0cmFuc2ZlckFsbG93ZWQ7CiAgICAgICAgIGlmICghZmFzdEFsbG93ZWQpIHsKLSAgICAgICAgICAgIEFMT0dXKCJBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBjbGllbnQsIG5vdCBzaGFyZWQgYnVmZmVyIGFuZCB0cmFuc2ZlciA9ICVzIiwKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IGNsaWVudCwiCisgICAgICAgICAgICAgICAgICAiIG5vdCBzaGFyZWQgYnVmZmVyIGFuZCB0cmFuc2ZlciA9ICVzIiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgY29udmVydFRyYW5zZmVyVG9UZXh0KG1UcmFuc2ZlcikpOwogICAgICAgICAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAobUZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOwogICAgICAgICB9CkBAIC0xNDM4LDcgKzE0MzIsNyBAQAogCiAgICAgSUF1ZGlvRmxpbmdlcjo6Q3JlYXRlVHJhY2tJbnB1dCBpbnB1dDsKICAgICBpZiAobVN0cmVhbVR5cGUgIT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpIHsKLSAgICAgICAgc3RyZWFtX3R5cGVfdG9fYXVkaW9fYXR0cmlidXRlcyhtU3RyZWFtVHlwZSwgJmlucHV0LmF0dHIpOworICAgICAgICBpbnB1dC5hdHRyID0gQXVkaW9TeXN0ZW06OnN0cmVhbVR5cGVUb0F0dHJpYnV0ZXMobVN0cmVhbVR5cGUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGlucHV0LmF0dHIgPSBtQXR0cmlidXRlczsKICAgICB9CkBAIC0xNDc5LDcgKzE0NzMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXR1cyk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8IG91dHB1dC5vdXRwdXRJZCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBBTE9HRSgiQXVkaW9GbGluZ2VyIGNvdWxkIG5vdCBjcmVhdGUgdHJhY2ssIHN0YXR1czogJWQgb3V0cHV0ICVkIiwgc3RhdHVzLCBvdXRwdXQub3V0cHV0SWQpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBBdWRpb0ZsaW5nZXIgY291bGQgbm90IGNyZWF0ZSB0cmFjaywgc3RhdHVzOiAlZCBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMsIG91dHB1dC5vdXRwdXRJZCk7CiAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIH0KQEAgLTE1MDksMTMgKzE1MDQsMTMgQEAKICAgICAvLyBGSVhNRSBjb21wYXJlIHRvIEF1ZGlvUmVjb3JkCiAgICAgc3A8SU1lbW9yeT4gaU1lbSA9IHRyYWNrLT5nZXRDYmxrKCk7CiAgICAgaWYgKGlNZW0gPT0gMCkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIik7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IENvdWxkIG5vdCBnZXQgY29udHJvbCBibG9jayIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICAgICAgZ290byBleGl0OwogICAgIH0KICAgICB2b2lkICppTWVtUG9pbnRlciA9IGlNZW0tPnBvaW50ZXIoKTsKICAgICBpZiAoaU1lbVBvaW50ZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIHBvaW50ZXIiKTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBjb250cm9sIGJsb2NrIHBvaW50ZXIiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CkBAIC0xNTM0LDI3ICsxNTI5LDI4IEBACiAgICAgbUF3YWl0Qm9vc3QgPSBmYWxzZTsKICAgICBpZiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewogICAgICAgICBpZiAob3V0cHV0LmZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgewotICAgICAgICAgICAgQUxPR0koIkFVRElPX09VVFBVVF9GTEFHX0ZBU1Qgc3VjY2Vzc2Z1bDsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwKLSAgICAgICAgICAgICAgICAgIG1SZXFGcmFtZUNvdW50LCBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HSSgiJXMoJWQpOiBBVURJT19PVVRQVVRfRkxBR19GQVNUIHN1Y2Nlc3NmdWw7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVJlcUZyYW1lQ291bnQsIG1GcmFtZUNvdW50KTsKICAgICAgICAgICAgIGlmICghbVRocmVhZENhbkNhbGxKYXZhKSB7CiAgICAgICAgICAgICAgICAgbUF3YWl0Qm9vc3QgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1coIkFVRElPX09VVFBVVF9GTEFHX0ZBU1QgZGVuaWVkIGJ5IHNlcnZlcjsgZnJhbWVDb3VudCAlenUgLT4gJXp1IiwgbVJlcUZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCk7CisgICAgICAgICAgICBBTE9HVygiJXMoJWQpOiBBVURJT19PVVRQVVRfRkxBR19GQVNUIGRlbmllZCBieSBzZXJ2ZXI7IGZyYW1lQ291bnQgJXp1IC0+ICV6dSIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVJlcUZyYW1lQ291bnQsIG1GcmFtZUNvdW50KTsKICAgICAgICAgfQogICAgIH0KICAgICBtRmxhZ3MgPSBvdXRwdXQuZmxhZ3M7CiAKICAgICAvL21PdXRwdXQgIT0gb3V0cHV0IGluY2x1ZGVzIHRoZSBjYXNlIHdoZXJlIG1PdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUgZm9yIGZpcnN0IGNyZWF0aW9uCi0gICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwICYmIG1PdXRwdXQgIT0gb3V0cHV0Lm91dHB1dElkKSB7CisgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwKSB7CiAgICAgICAgIGlmIChtT3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtT3V0cHV0KTsKKyAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1PdXRwdXQsIG1Qb3J0SWQpOwogICAgICAgICB9Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG91dHB1dC5vdXRwdXRJZCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjphZGRBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG91dHB1dC5vdXRwdXRJZCwgb3V0cHV0LnBvcnRJZCk7CiAgICAgICAgIGNhbGxiYWNrQWRkZWQgPSB0cnVlOwogICAgIH0KIAorICAgIG1Qb3J0SWQgPSBvdXRwdXQucG9ydElkOwogICAgIC8vIFdlIHJldGFpbiBhIGNvcHkgb2YgdGhlIEkvTyBoYW5kbGUsIGJ1dCBkb24ndCBvd24gdGhlIHJlZmVyZW5jZQogICAgIG1PdXRwdXQgPSBvdXRwdXQub3V0cHV0SWQ7CiAgICAgbVJlZnJlc2hSZW1haW5pbmcgPSB0cnVlOwpAQCAtMTU2OSw3ICsxNTY1LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBidWZmZXJzID0gbVNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpOwogICAgICAgICBpZiAoYnVmZmVycyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ291bGQgbm90IGdldCBidWZmZXIgcG9pbnRlciIpOworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogQ291bGQgbm90IGdldCBidWZmZXIgcG9pbnRlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgIHN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgIH0KQEAgLTE2MTksNyArMTYxNSw3IEBACiBleGl0OgogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgY2FsbGJhY2tBZGRlZCkgewogICAgICAgICAvLyBub3RlOiBtT3V0cHV0IGlzIGFsd2F5cyB2YWxpZCBpcyBjYWxsYmFja0FkZGVkIGlzIHRydWUKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKHRoaXMsIG1PdXRwdXQsIG1Qb3J0SWQpOwogICAgIH0KIAogICAgIG1TdGF0dXMgPSBzdGF0dXM7CkBAIC0xNjU4LDcgKzE2NTQsNyBAQAogICAgICAgICB0aW1lb3V0LnR2X25zZWMgPSAobG9uZykgKG1zICUgMTAwMCkgKiAxMDAwMDAwOwogICAgICAgICByZXF1ZXN0ZWQgPSAmdGltZW91dDsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCB3YWl0Q291bnQgJWQiLCBfX2Z1bmNfXywgd2FpdENvdW50KTsKKyAgICAgICAgQUxPR0UoIiVzKCVkKTogaW52YWxpZCB3YWl0Q291bnQgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgd2FpdENvdW50KTsKICAgICAgICAgcmVxdWVzdGVkID0gTlVMTDsKICAgICB9CiAgICAgcmV0dXJuIG9idGFpbkJ1ZmZlcihhdWRpb0J1ZmZlciwgcmVxdWVzdGVkLCBOVUxMIC8qZWxhcHNlZCovLCBub25Db250aWcpOwpAQCAtMTY2OSw3ICsxNjY1LDYgQEAKIHsKICAgICAvLyBwcmV2aW91cyBhbmQgbmV3IElBdWRpb1RyYWNrIHNlcXVlbmNlIG51bWJlcnMgYXJlIHVzZWQgdG8gZGV0ZWN0IHRyYWNrIHJlLWNyZWF0aW9uCiAgICAgdWludDMyX3Qgb2xkU2VxdWVuY2UgPSAwOwotICAgIHVpbnQzMl90IG5ld1NlcXVlbmNlOwogCiAgICAgUHJveHk6OkJ1ZmZlciBidWZmZXI7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CkBAIC0xNjg2LDcgKzE2ODEsNyBAQAogICAgICAgICB7ICAgLy8gc3RhcnQgb2YgbG9jayBzY29wZQogICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogCi0gICAgICAgICAgICBuZXdTZXF1ZW5jZSA9IG1TZXF1ZW5jZTsKKyAgICAgICAgICAgIHVpbnQzMl90IG5ld1NlcXVlbmNlID0gbVNlcXVlbmNlOwogICAgICAgICAgICAgLy8gZGlkIHByZXZpb3VzIG9idGFpbkJ1ZmZlcigpIGZhaWwgZHVlIHRvIG1lZGlhIHNlcnZlciBkZWF0aCBvciB2b2x1bnRhcnkgaW52YWxpZGF0aW9uPwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBERUFEX09CSkVDVCkgewogICAgICAgICAgICAgICAgIC8vIHJlLWNyZWF0ZSB0cmFjaywgdW5sZXNzIHNvbWVvbmUgZWxzZSBoYXMgYWxyZWFkeSBkb25lIHNvCkBAIC0xNzMzLDYgKzE3MjgsNyBAQAogICAgIGF1ZGlvQnVmZmVyLT5mcmFtZUNvdW50ID0gYnVmZmVyLm1GcmFtZUNvdW50OwogICAgIGF1ZGlvQnVmZmVyLT5zaXplID0gYnVmZmVyLm1GcmFtZUNvdW50ICogbUZyYW1lU2l6ZTsKICAgICBhdWRpb0J1ZmZlci0+cmF3ID0gYnVmZmVyLm1SYXc7CisgICAgYXVkaW9CdWZmZXItPnNlcXVlbmNlID0gb2xkU2VxdWVuY2U7CiAgICAgaWYgKG5vbkNvbnRpZyAhPSBOVUxMKSB7CiAgICAgICAgICpub25Db250aWcgPSBidWZmZXIubU5vbkNvbnRpZzsKICAgICB9CkBAIC0xNzU2LDYgKzE3NTIsMTIgQEAKICAgICBidWZmZXIubVJhdyA9IGF1ZGlvQnVmZmVyLT5yYXc7CiAKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgaWYgKGF1ZGlvQnVmZmVyLT5zZXF1ZW5jZSAhPSBtU2VxdWVuY2UpIHsKKyAgICAgICAgLy8gVGhpcyBCdWZmZXIgY2FtZSBmcm9tIGEgZGlmZmVyZW50IElBdWRpb1RyYWNrIGluc3RhbmNlLCBzbyBpZ25vcmUgdGhlIHJlbGVhc2VCdWZmZXIKKyAgICAgICAgQUxPR0QoIiVzIGlzIG5vLW9wIGR1ZSB0byBJQXVkaW9UcmFjayBzZXF1ZW5jZSBtaXNtYXRjaCAldSAhPSAldSIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIGF1ZGlvQnVmZmVyLT5zZXF1ZW5jZSwgbVNlcXVlbmNlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBtUmVsZWFzZWQgKz0gc3RlcENvdW50OwogICAgIG1JblVuZGVycnVuID0gZmFsc2U7CiAgICAgbVByb3h5LT5yZWxlYXNlQnVmZmVyKCZidWZmZXIpOwpAQCAtMTc2OCw3ICsxNzcwLDggQEAKIHsKICAgICBpbnQzMl90IGZsYWdzID0gYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0RJU0FCTEVELCAmbUNibGstPm1GbGFncyk7CiAgICAgaWYgKChtU3RhdGUgPT0gU1RBVEVfQUNUSVZFKSAmJiAoZmxhZ3MgJiBDQkxLX0RJU0FCTEVEKSkgewotICAgICAgICBBTE9HVygicmVsZWFzZUJ1ZmZlcigpIHRyYWNrICVwIGRpc2FibGVkIGR1ZSB0byBwcmV2aW91cyB1bmRlcnJ1biwgcmVzdGFydGluZyIsIHRoaXMpOworICAgICAgICBBTE9HVygiJXMoJWQpOiByZWxlYXNlQnVmZmVyKCkgdHJhY2sgJXAgZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgdGhpcyk7CiAgICAgICAgIC8vIEZJWE1FIGlnbm9yaW5nIHN0YXR1cwogICAgICAgICBtQXVkaW9UcmFjay0+c3RhcnQoKTsKICAgICB9CkBAIC0xNzc4LDcgKzE3ODEsNyBAQAogCiBzc2l6ZV90IEF1ZGlvVHJhY2s6OndyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHVzZXJTaXplLCBib29sIGJsb2NraW5nKQogewotICAgIGlmIChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQykgeworICAgIGlmIChtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQyAmJiBtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCkBAIC0xNzk1LDcgKzE3OTgsOCBAQAogICAgIGlmIChzc2l6ZV90KHVzZXJTaXplKSA8IDAgfHwgKGJ1ZmZlciA9PSBOVUxMICYmIHVzZXJTaXplICE9IDApKSB7CiAgICAgICAgIC8vIFNhbml0eS1jaGVjazogdXNlciBpcyBtb3N0LWxpa2VseSBwYXNzaW5nIGFuIGVycm9yIGNvZGUsIGFuZCBpdCB3b3VsZAogICAgICAgICAvLyBtYWtlIHRoZSByZXR1cm4gdmFsdWUgYW1iaWd1b3VzIChhY3R1YWxTaXplIHZzIGVycm9yKS4KLSAgICAgICAgQUxPR0UoIkF1ZGlvVHJhY2s6OndyaXRlKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6ZCkiLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IEF1ZGlvVHJhY2s6OndyaXRlKGJ1ZmZlcj0lcCwgc2l6ZT0lenUgKCV6ZCkiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBidWZmZXIsIHVzZXJTaXplLCB1c2VyU2l6ZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCkBAIC0xODI4LDcgKzE4MzIsMTcgQEAKIAogICAgIGlmICh3cml0dGVuID4gMCkgewogICAgICAgICBtRnJhbWVzV3JpdHRlbiArPSB3cml0dGVuIC8gbUZyYW1lU2l6ZTsKKworICAgICAgICBpZiAobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvVHJhY2tUaHJlYWQ+IHQgPSBtQXVkaW9UcmFja1RocmVhZDsKKyAgICAgICAgICAgIGlmICh0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBjYXVzZXMgd2FrZSB1cCBvZiB0aGUgcGxheWJhY2sgdGhyZWFkLCB0aGF0IHdpbGwgY2FsbGJhY2sgdGhlIGNsaWVudCBmb3IKKyAgICAgICAgICAgICAgICAvLyBtb3JlIGRhdGEgKHdpdGggRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSkgaW4gcHJvY2Vzc0F1ZGlvQnVmZmVyKCkKKyAgICAgICAgICAgICAgICB0LT53YWtlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CisKICAgICByZXR1cm4gd3JpdHRlbjsKIH0KIApAQCAtMTg1Nyw3ICsxODcxLDggQEAKICAgICAgICAgICAgIHBvbGxVcyA8PD0gMTsKICAgICAgICAgfSB3aGlsZSAodHJ5Q291bnRlci0tID4gMCk7CiAgICAgICAgIGlmICh0cnlDb3VudGVyIDwgMCkgewotICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgcmVjZWl2ZSBleHBlY3RlZCBwcmlvcml0eSBib29zdCBvbiB0aW1lIik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBkaWQgbm90IHJlY2VpdmUgZXhwZWN0ZWQgcHJpb3JpdHkgYm9vc3Qgb24gdGltZSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgfQogICAgICAgICAvLyBSdW4gYWdhaW4gaW1tZWRpYXRlbHkKICAgICAgICAgcmV0dXJuIDA7CkBAIC0yMDgxLDggKzIwOTYsOCBAQAogICAgICAgICBpZiAobnMgPCAwKSBucyA9IDA7CiAgICAgfQogCi0gICAgLy8gSWYgbm90IHN1cHBseWluZyBkYXRhIGJ5IEVWRU5UX01PUkVfREFUQSwgdGhlbiB3ZSdyZSBkb25lCi0gICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9DQUxMQkFDSykgeworICAgIC8vIElmIG5vdCBzdXBwbHlpbmcgZGF0YSBieSBFVkVOVF9NT1JFX0RBVEEgb3IgRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSwgdGhlbiB3ZSdyZSBkb25lCisgICAgaWYgKG1UcmFuc2ZlciAhPSBUUkFOU0ZFUl9DQUxMQkFDSyAmJiBtVHJhbnNmZXIgIT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgewogICAgICAgICByZXR1cm4gbnM7CiAgICAgfQogCkBAIC0yMDk4LDcgKzIxMTMsOCBAQAogICAgIGlmIChucyAhPSBOU19XSEVORVZFUikgewogICAgICAgICB0aW1lb3V0LnR2X3NlYyA9IG5zIC8gMTAwMDAwMDAwMExMOwogICAgICAgICB0aW1lb3V0LnR2X25zZWMgPSBucyAlIDEwMDAwMDAwMDBMTDsKLSAgICAgICAgQUxPR1YoInRpbWVvdXQgJWxkLiUwM2QiLCB0aW1lb3V0LnR2X3NlYywgKGludCkgdGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCk7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IHRpbWVvdXQgJWxkLiUwM2QiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCB0aW1lb3V0LnR2X3NlYywgKGludCkgdGltZW91dC50dl9uc2VjIC8gMTAwMDAwMCk7CiAgICAgICAgIHJlcXVlc3RlZCA9ICZ0aW1lb3V0OwogICAgIH0KIApAQCAtMjExMCwxOCArMjEyNiwyMCBAQAogICAgICAgICBzaXplX3Qgbm9uQ29udGlnOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBvYnRhaW5CdWZmZXIoJmF1ZGlvQnVmZmVyLCByZXF1ZXN0ZWQsIE5VTEwsICZub25Db250aWcpOwogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChlcnIgIT0gTk9fRVJST1IpICE9IChhdWRpb0J1ZmZlci5mcmFtZUNvdW50ID09IDApLAotICAgICAgICAgICAgICAgICJvYnRhaW5CdWZmZXIoKSBlcnI9JWQgZnJhbWVDb3VudD0lenUiLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICIlcyglZCk6IG9idGFpbkJ1ZmZlcigpIGVycj0lZCBmcmFtZUNvdW50PSV6dSIsCisgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBlcnIsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQpOwogICAgICAgICByZXF1ZXN0ZWQgPSAmQ2xpZW50UHJveHk6OmtOb25CbG9ja2luZzsKICAgICAgICAgc2l6ZV90IGF2YWlsID0gYXVkaW9CdWZmZXIuZnJhbWVDb3VudCArIG5vbkNvbnRpZzsKLSAgICAgICAgQUxPR1YoIm9idGFpbkJ1ZmZlcigldSkgcmV0dXJuZWQgJXp1ID0gJXp1ICsgJXp1IGVyciAlZCIsCi0gICAgICAgICAgICAgICAgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogb2J0YWluQnVmZmVyKCV1KSByZXR1cm5lZCAlenUgPSAlenUgKyAlenUgZXJyICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgbVJlbWFpbmluZ0ZyYW1lcywgYXZhaWwsIGF1ZGlvQnVmZmVyLmZyYW1lQ291bnQsIG5vbkNvbnRpZywgZXJyKTsKICAgICAgICAgaWYgKGVyciAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKGVyciA9PSBUSU1FRF9PVVQgfHwgZXJyID09IFdPVUxEX0JMT0NLIHx8IGVyciA9PSAtRUlOVFIgfHwKICAgICAgICAgICAgICAgICAgICAgKGlzT2ZmbG9hZGVkKCkgJiYgKGVyciA9PSBERUFEX09CSkVDVCkpKSB7CiAgICAgICAgICAgICAgICAgLy8gRklYTUUgYnVnIDI1MTk1NzU5CiAgICAgICAgICAgICAgICAgcmV0dXJuIDEwMDAwMDA7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HRSgiRXJyb3IgJWQgb2J0YWluaW5nIGFuIGF1ZGlvIGJ1ZmZlciwgZ2l2aW5nIHVwLiIsIGVycik7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBFcnJvciAlZCBvYnRhaW5pbmcgYW4gYXVkaW8gYnVmZmVyLCBnaXZpbmcgdXAuIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIGVycik7CiAgICAgICAgICAgICByZXR1cm4gTlNfTkVWRVI7CiAgICAgICAgIH0KIApAQCAtMjEzMiwyNiArMjE1MCw1OCBAQAogICAgICAgICAgICAgICAgICAgICBjb25zdCBuc2Vjc190IHRpbWVOb3cgPSBzeXN0ZW1UaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgIG5zID0gbWF4KChuc2Vjc190KTAsIG5zIC0gKHRpbWVOb3cgLSB0aW1lQWZ0ZXJDYWxsYmFja3MpKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbnNlY3NfdCBteW5zID0gZnJhbWVzVG9OYW5vc2Vjb25kcyhtUmVtYWluaW5nRnJhbWVzIC0gYXZhaWwsIHNhbXBsZVJhdGUsIHNwZWVkKTsKLSAgICAgICAgICAgICAgICBpZiAobnMgPCAwIC8qIE5TX1dIRU5FVkVSICovIHx8IG15bnMgPCBucykgewotICAgICAgICAgICAgICAgICAgICBucyA9IG15bnM7CisKKyAgICAgICAgICAgICAgICAvLyBkZWxheU5zIGlzIGZpcnN0IGNvbXB1dGVkIGJ5IHRoZSBhZGRpdGlvbmFsIGZyYW1lcyByZXF1aXJlZCBpbiB0aGUgYnVmZmVyLgorICAgICAgICAgICAgICAgIG5zZWNzX3QgZGVsYXlOcyA9IGZyYW1lc1RvTmFub3NlY29uZHMoCisgICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nRnJhbWVzIC0gYXZhaWwsIHNhbXBsZVJhdGUsIHNwZWVkKTsKKworICAgICAgICAgICAgICAgIC8vIGFmTnMgaXMgdGhlIEF1ZGlvRmxpbmdlciBtaXhlciBwZXJpb2QgaW4gbnMuCisgICAgICAgICAgICAgICAgY29uc3QgbnNlY3NfdCBhZk5zID0gZnJhbWVzVG9OYW5vc2Vjb25kcyhtQWZGcmFtZUNvdW50LCBtQWZTYW1wbGVSYXRlLCBzcGVlZCk7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgQXVkaW9UcmFjayBpcyBkb3VibGUgYnVmZmVyZWQgYmFzZWQgb24gdGhlIEF1ZGlvRmxpbmdlciBtaXhlciBwZXJpb2QsCisgICAgICAgICAgICAgICAgLy8gd2UgbWF5IGhhdmUgYSByYWNlIGlmIHdlIHdhaXQgYmFzZWQgb24gdGhlIG51bWJlciBvZiBmcmFtZXMgZGVzaXJlZC4KKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgcG9zc2libGUgaXNzdWUgd2l0aCByZXNhbXBsaW5nIGFuZCBBQXVkaW8uCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBUaGUgZ3JhbnVsYXJpdHkgb2YgYXVkaW9mbGluZ2VyIHByb2Nlc3NpbmcgaXMgb25lIG1peGVyIHBlcmlvZDsgaWYKKyAgICAgICAgICAgICAgICAvLyBvdXIgd2FpdCB0aW1lIGlzIGxlc3MgdGhhbiBvbmUgbWl4ZXIgcGVyaW9kLCB3YWl0IGF0IG1vc3QgaGFsZiB0aGUgcGVyaW9kLgorICAgICAgICAgICAgICAgIGlmIChkZWxheU5zIDwgYWZOcykgeworICAgICAgICAgICAgICAgICAgICBkZWxheU5zID0gc3RkOjptaW4oZGVsYXlOcywgYWZOcyAvIDIpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIGFkanVzdCBvdXIgbnMgd2FpdCBieSBkZWxheU5zLgorICAgICAgICAgICAgICAgIGlmIChucyA8IDAgLyogTlNfV0hFTkVWRVIgKi8gfHwgZGVsYXlOcyA8IG5zKSB7CisgICAgICAgICAgICAgICAgICAgIG5zID0gZGVsYXlOczsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIG5zOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgc2l6ZV90IHJlcVNpemUgPSBhdWRpb0J1ZmZlci5zaXplOwotICAgICAgICBtQ2JmKEVWRU5UX01PUkVfREFUQSwgbVVzZXJEYXRhLCAmYXVkaW9CdWZmZXIpOworICAgICAgICBpZiAobVRyYW5zZmVyID09IFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0spIHsKKyAgICAgICAgICAgIC8vIHdoZW4gbm90aWZ5aW5nIGNsaWVudCBpdCBjYW4gd3JpdGUgbW9yZSBkYXRhLCBwYXNzIHRoZSB0b3RhbCBzaXplIHRoYXQgY2FuIGJlCisgICAgICAgICAgICAvLyB3cml0dGVuIGluIHRoZSBuZXh0IHdyaXRlKCkgY2FsbCwgc2luY2UgaXQncyBub3QgcGFzc2VkIHRocm91Z2ggdGhlIGNhbGxiYWNrCisgICAgICAgICAgICBhdWRpb0J1ZmZlci5zaXplICs9IG5vbkNvbnRpZzsKKyAgICAgICAgfQorICAgICAgICBtQ2JmKG1UcmFuc2ZlciA9PSBUUkFOU0ZFUl9DQUxMQkFDSyA/IEVWRU5UX01PUkVfREFUQSA6IEVWRU5UX0NBTl9XUklURV9NT1JFX0RBVEEsCisgICAgICAgICAgICAgICAgbVVzZXJEYXRhLCAmYXVkaW9CdWZmZXIpOwogICAgICAgICBzaXplX3Qgd3JpdHRlblNpemUgPSBhdWRpb0J1ZmZlci5zaXplOwogCiAgICAgICAgIC8vIFNhbml0eSBjaGVjayBvbiByZXR1cm5lZCBzaXplCiAgICAgICAgIGlmIChzc2l6ZV90KHdyaXR0ZW5TaXplKSA8IDAgfHwgd3JpdHRlblNpemUgPiByZXFTaXplKSB7Ci0gICAgICAgICAgICBBTE9HRSgiRVZFTlRfTU9SRV9EQVRBIHJlcXVlc3RlZCAlenUgYnl0ZXMgYnV0IGNhbGxiYWNrIHJldHVybmVkICV6ZCBieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgIHJlcVNpemUsIHNzaXplX3Qod3JpdHRlblNpemUpKTsKKyAgICAgICAgICAgIEFMT0dFKCIlcyglZCk6IEVWRU5UX01PUkVfREFUQSByZXF1ZXN0ZWQgJXp1IGJ5dGVzIGJ1dCBjYWxsYmFjayByZXR1cm5lZCAlemQgYnl0ZXMiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgcmVxU2l6ZSwgc3NpemVfdCh3cml0dGVuU2l6ZSkpOwogICAgICAgICAgICAgcmV0dXJuIE5TX05FVkVSOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHdyaXR0ZW5TaXplID09IDApIHsKKyAgICAgICAgICAgIGlmIChtVHJhbnNmZXIgPT0gVFJBTlNGRVJfU1lOQ19OT1RJRl9DQUxMQkFDSykgeworICAgICAgICAgICAgICAgIC8vIFRoZSBjYWxsYmFjayBFVkVOVF9DQU5fV1JJVEVfTU9SRV9EQVRBIHdhcyBwcm9jZXNzZWQgaW4gdGhlIEpOSSBvZgorICAgICAgICAgICAgICAgIC8vIGFuZHJvaWQubWVkaWEuQXVkaW9UcmFjay4gVGhlIEpOSSBpcyBub3QgdXNpbmcgdGhlIGNhbGxiYWNrIHRvIHByb3ZpZGUgZGF0YSwKKyAgICAgICAgICAgICAgICAvLyBpdCBvbmx5IHNpZ25hbHMgdG8gdGhlIEphdmEgY2xpZW50IHRoYXQgaXQgY2FuIHByb3ZpZGUgbW9yZSBkYXRhLCB3aGljaAorICAgICAgICAgICAgICAgIC8vIHRoaXMgdHJhY2sgaXMgcmVhZCB0byBhY2NlcHQgbm93LgorICAgICAgICAgICAgICAgIC8vIFRoZSBwbGF5YmFjayB0aHJlYWQgd2lsbCBiZSBhd2FrZW4gYXQgdGhlIG5leHQgOjp3cml0ZSgpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5TX1dIRU5FVkVSOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVGhlIGNhbGxiYWNrIGlzIGRvbmUgZmlsbGluZyBidWZmZXJzCiAgICAgICAgICAgICAvLyBLZWVwIHRoaXMgdGhyZWFkIGdvaW5nIHRvIGhhbmRsZSB0aW1lZCBldmVudHMgYW5kCiAgICAgICAgICAgICAvLyBzdGlsbCB0cnkgdG8gZ2V0IG1vcmUgZGF0YSBpbiBpbnRlcnZhbHMgb2YgV0FJVF9QRVJJT0RfTVMKQEAgLTIyNDIsOCArMjI5Miw4IEBACiAKIHN0YXR1c190IEF1ZGlvVHJhY2s6OnJlc3RvcmVUcmFja19sKGNvbnN0IGNoYXIgKmZyb20pCiB7Ci0gICAgQUxPR1coImRlYWQgSUF1ZGlvVHJhY2ssICVzLCBjcmVhdGluZyBhIG5ldyBvbmUgZnJvbSAlcygpIiwKLSAgICAgICAgICBpc09mZmxvYWRlZE9yRGlyZWN0X2woKSA/ICJPZmZsb2FkZWQgb3IgRGlyZWN0IiA6ICJQQ00iLCBmcm9tKTsKKyAgICBBTE9HVygiJXMoJWQpOiBkZWFkIElBdWRpb1RyYWNrLCAlcywgY3JlYXRpbmcgYSBuZXcgb25lIGZyb20gJXMoKSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgaXNPZmZsb2FkZWRPckRpcmVjdF9sKCkgPyAiT2ZmbG9hZGVkIG9yIERpcmVjdCIgOiAiUENNIiwgZnJvbSk7CiAgICAgKyttU2VxdWVuY2U7CiAKICAgICAvLyByZWZyZXNoIHRoZSBhdWRpbyBjb25maWd1cmF0aW9uIGNhY2hlIGluIHRoaXMgcHJvY2VzcyB0byBtYWtlIHN1cmUgd2UgZ2V0IG5ldwpAQCAtMjI4NiwxMCArMjMzNiw3IEBACiAgICAgLy8gSWYgYSBuZXcgSUF1ZGlvVHJhY2sgY2Fubm90IGJlIGNyZWF0ZWQsIHRoZSBwcmV2aW91cyAoZGVhZCkgaW5zdGFuY2Ugd2lsbCBiZSBsZWZ0IGludGFjdC4KICAgICBzdGF0dXNfdCByZXN1bHQgPSBjcmVhdGVUcmFja19sKCk7CiAKLSAgICBpZiAocmVzdWx0ICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dXKCIlcygpOiBjcmVhdGVUcmFja19sIGZhaWxlZCwgZG8gbm90IHJldHJ5IiwgX19mdW5jX18pOwotICAgICAgICByZXRyaWVzID0gMDsKLSAgICB9IGVsc2UgeworICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKICAgICAgICAgLy8gdGFrZSB0aGUgZnJhbWVzIHRoYXQgd2lsbCBiZSBsb3N0IGJ5IHRyYWNrIHJlY3JlYXRpb24gaW50byBhY2NvdW50IGluIHNhdmVkIHBvc2l0aW9uCiAgICAgICAgIC8vIEZvciBzdHJlYW1pbmcgdHJhY2tzLCB0aGlzIGlzIHRoZSBhbW91bnQgd2Ugb2J0YWluZWQgZnJvbSB0aGUgdXNlci9jbGllbnQKICAgICAgICAgLy8gKG5vdCB0aGUgbnVtYmVyIGFjdHVhbGx5IGNvbnN1bWVkIGF0IHRoZSBzZXJ2ZXIgLSB0aG9zZSBhcmUgYWxyZWFkeSBsb3N0KS4KQEAgLTIzMDQsNyArMjM1MSw3IEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1TdGF0aWNQcm94eS0+c2V0QnVmZmVyUG9zaXRpb24oYnVmZmVyUG9zaXRpb24pOwogICAgICAgICAgICAgICAgIGlmIChidWZmZXJQb3NpdGlvbiA9PSBtRnJhbWVDb3VudCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRCgicmVzdG9yaW5nIHRyYWNrIGF0IGVuZCBvZiBzdGF0aWMgYnVmZmVyIik7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCIlcyglZCk6IHJlc3RvcmluZyB0cmFjayBhdCBlbmQgb2Ygc3RhdGljIGJ1ZmZlciIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIzMzQsMTQgKzIzODEsMTggQEAKICAgICAgICAgbUZyYW1lc1dyaXR0ZW5BdFJlc3RvcmUgPSBtRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldDsKICAgICB9CiAgICAgaWYgKHJlc3VsdCAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVygiJXMoKSBmYWlsZWQgc3RhdHVzICVkLCByZXRyaWVzICVkIiwgX19mdW5jX18sIHJlc3VsdCwgcmV0cmllcyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGZhaWxlZCBzdGF0dXMgJWQsIHJldHJpZXMgJWQiLCBfX2Z1bmNfXywgbVBvcnRJZCwgcmVzdWx0LCByZXRyaWVzKTsKICAgICAgICAgaWYgKC0tcmV0cmllcyA+IDApIHsKKyAgICAgICAgICAgIC8vIGxlYXZlIHRpbWUgZm9yIGFuIGV2ZW50dWFsIHJhY2UgY29uZGl0aW9uIHRvIGNsZWFyIGJlZm9yZSByZXRyeWluZworICAgICAgICAgICAgdXNsZWVwKDUwMDAwMCk7CiAgICAgICAgICAgICBnb3RvIHJldHJ5OwogICAgICAgICB9Ci0gICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7Ci0gICAgICAgIG1SZWxlYXNlZCA9IDA7CisgICAgICAgIC8vIGlmIG5vIHJldHJpZXMgbGVmdCwgc2V0IGludmFsaWQgYml0IHRvIGZvcmNlIHJlc3RvcmluZyBhdCBuZXh0IG9jY2FzaW9uCisgICAgICAgIC8vIGFuZCBhdm9pZCBpbmNvbnNpc3RlbnQgYWN0aXZlIHN0YXRlIG9uIGNsaWVudCBhbmQgc2VydmVyIHNpZGVzCisgICAgICAgIGlmIChtQ2JsayAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19vcihDQkxLX0lOVkFMSUQsICZtQ2Jsay0+bUZsYWdzKTsKKyAgICAgICAgfQogICAgIH0KLQogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTIzNTksOCArMjQxMCw4IEBACiAgICAgLy8gICAgICB1bmxlc3MgdGhlIHNlcnZlciBoYXMgbW9yZSB0aGFuIDJeMzEgZnJhbWVzIGluIGl0cyBidWZmZXIsCiAgICAgLy8gICAgICBpbiB3aGljaCBjYXNlIHRoZSB1c2Ugb2YgdWludDMyX3QgZm9yIHRoZXNlIGNvdW50ZXJzIGhhcyBiaWdnZXIgaXNzdWVzLgogICAgIEFMT0dFX0lGKGRlbHRhIDwgMCwKLSAgICAgICAgICAgICJkZXRlY3RlZCBpbGxlZ2FsIHJldHJvZ3JhZGUgbW90aW9uIGJ5IHRoZSBzZXJ2ZXI6IG1TZXJ2ZXIgYWR2YW5jZWQgYnkgJWQiLAotICAgICAgICAgICAgZGVsdGEpOworICAgICAgICAgICAgIiVzKCVkKTogZGV0ZWN0ZWQgaWxsZWdhbCByZXRyb2dyYWRlIG1vdGlvbiBieSB0aGUgc2VydmVyOiBtU2VydmVyIGFkdmFuY2VkIGJ5ICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBkZWx0YSk7CiAgICAgbVNlcnZlciA9IG5ld1NlcnZlcjsKICAgICBpZiAoZGVsdGEgPiAwKSB7IC8vIGF2b2lkIHJldHJvZ3JhZGUKICAgICAgICAgbVBvc2l0aW9uICs9IGRlbHRhOwpAQCAtMjM4MCw5ICsyNDMxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIHNwZWVkIC8qLCAwIG1Ob3RpZmljYXRpb25zUGVyQnVmZmVyUmVxKi8pOwogICAgIGNvbnN0IGJvb2wgYWxsb3dlZCA9IG1GcmFtZUNvdW50ID49IG1pbkZyYW1lQ291bnQ7CiAgICAgQUxPR0RfSUYoIWFsbG93ZWQsCi0gICAgICAgICAgICAiaXNTYW1wbGVSYXRlU3BlZWRBbGxvd2VkX2wgZGVuaWVkICIKKyAgICAgICAgICAgICIlcyglZCk6IGRlbmllZCAiCiAgICAgICAgICAgICAibUFmTGF0ZW5jeToldSAgbUFmRnJhbWVDb3VudDolenUgIG1BZlNhbXBsZVJhdGU6JXUgIHNhbXBsZVJhdGU6JXUgIHNwZWVkOiVmICIKICAgICAgICAgICAgICJtRnJhbWVDb3VudDolenUgPCBtaW5GcmFtZUNvdW50OiV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgIG1BZkxhdGVuY3ksIG1BZkZyYW1lQ291bnQsIG1BZlNhbXBsZVJhdGUsIHNhbXBsZVJhdGUsIHNwZWVkLAogICAgICAgICAgICAgbUZyYW1lQ291bnQsIG1pbkZyYW1lQ291bnQpOwogICAgIHJldHVybiBhbGxvd2VkOwpAQCAtMjQwMCw3ICsyNDUyLDggQEAKICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7CiAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVByZXNlbnRhdGlvbklkKSwgcHJlc2VudGF0aW9uSWQpOwogICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlQcm9ncmFtSWQpLCBwcm9ncmFtSWQpOwotICAgIEFMT0dWKCJQcmVzZW50YXRpb25JZC9Qcm9ncmFtSWRbJXNdIixwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKKyAgICBBTE9HVigiJXMoJWQpOiBQcmVzZW50YXRpb25JZC9Qcm9ncmFtSWRbJXNdIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBwYXJhbS50b1N0cmluZygpLnN0cmluZygpKTsKIAogICAgIHJldHVybiBtQXVkaW9UcmFjay0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKIH0KQEAgLTI0MjcsNyArMjQ4MCw3IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gd2FybiBvbmx5IGlmIG5vdCBhbiBleHBlY3RlZCByZXN0b3JlIGZhaWx1cmUuCiAgICAgICAgIEFMT0dXX0lGKCEoKGlzT2ZmbG9hZGVkT3JEaXJlY3RfbCgpIHx8IG1Eb05vdFJlY29ubmVjdCkgJiYgc3RhdHVzID09IERFQURfT0JKRUNUKSwKLSAgICAgICAgICAgICAgICAiYXBwbHlWb2x1bWVTaGFwZXIgZmFpbGVkOiAlZCIsIHN0YXR1cyk7CisgICAgICAgICAgICAgICAgIiVzKCVkKTogYXBwbHlWb2x1bWVTaGFwZXIgZmFpbGVkOiAlZCIsIF9fZnVuY19fLCBtUG9ydElkLCBzdGF0dXMpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtMjQ2OCw3ICsyNTIxLDggQEAKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyAvLyBub3Qgc3VwcG9ydGVkCiAgICAgfQogICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qcm94eS0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdGF0dXMgIT0gT0ssICJzdGF0dXMgJWQgbm90IGFsbG93ZWQgZnJvbSBwcm94eSBnZXRUaW1lc3RhbXAiLCBzdGF0dXMpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdHVzICE9IE9LLCAiJXMoJWQpOiBzdGF0dXMgJWQgbm90IGFsbG93ZWQgZnJvbSBwcm94eSBnZXRUaW1lc3RhbXAiLAorICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CiAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwogICAgIHRpbWVzdGFtcC0+bVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9DTElFTlRdID0gbUZyYW1lc1dyaXR0ZW47CiAgICAgdGltZXN0YW1wLT5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9DTElFTlRdID0gMDsKQEAgLTI1MTEsNyArMjU2NSw4IEBACiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7IC8vIG9mZmxvYWRlZCB0cmFja3MgaGFuZGxlZCBiZWxvdwogICAgIGRlZmF1bHQ6Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoIkludmFsaWQgbVN0YXRlIGluIGdldFRpbWVzdGFtcCgpOiAlZCIsIG1TdGF0ZSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzKCVkKTogSW52YWxpZCBtU3RhdGUgaW4gZ2V0VGltZXN0YW1wKCk6ICVkIiwKKyAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLCBtU3RhdGUpOwogICAgICAgICBicmVhazsKICAgICB9CiAKQEAgLTI1NDUsNyArMjYwMCw4IEBACiAgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlIHdlIGFkanVzdCB0aGUgcG9zaXRpb24gZnJvbSB0aGUgcHJldmlvdXMgY29tcHV0ZWQgbGF0ZW5jeS4KICAgICAgICAgICAgICAgICBpZiAobG9jYXRpb24gPT0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUikgewogICAgICAgICAgICAgICAgICAgICBBTE9HV19JRihtUHJldmlvdXNMb2NhdGlvbiA9PSBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXRUaW1lc3RhbXAoKSBsb2NhdGlvbiBtb3ZlZCBmcm9tIGtlcm5lbCB0byBzZXJ2ZXIiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJWQpOiBsb2NhdGlvbiBtb3ZlZCBmcm9tIGtlcm5lbCB0byBzZXJ2ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhhdCB0aGUgbGFzdCBrZXJuZWwgT0sgdGltZSBpbmZvIGV4aXN0cyBhbmQgdGhlIHBvc2l0aW9ucwogICAgICAgICAgICAgICAgICAgICAvLyBhcmUgdmFsaWQgKGlmIHRoZXkgcHJlZGF0ZSB0aGUgY3VycmVudCB0cmFjaywgdGhlIHBvc2l0aW9ucyBtYXkKICAgICAgICAgICAgICAgICAgICAgLy8gYmUgemVybyBvciBuZWdhdGl2ZSkuCkBAIC0yNTYwLDggKzI2MTYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZXRzLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSX0xBU1RLRVJORUxPS10KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGV0cy5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF9MQVNUS0VSTkVMT0tdKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImZyYW1lIGFkanVzdG1lbnQ6JWxsZCAgdGltZXN0YW1wOiVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWZyYW1lcywgZXRzLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IGZyYW1lIGFkanVzdG1lbnQ6JWxsZCAgdGltZXN0YW1wOiVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgKGxvbmcgbG9uZylmcmFtZXMsIGV0cy50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgICAgICBpZiAoZnJhbWVzID49IGV0cy5tUG9zaXRpb25bbG9jYXRpb25dKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gMDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTI1NjksNyArMjYyNSwyNyBAQAogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsb2NhdGlvbiA9PSBFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWX0lGKG1QcmV2aW91c0xvY2F0aW9uID09IEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFRpbWVzdGFtcCgpIGxvY2F0aW9uIG1vdmVkIGZyb20gc2VydmVyIHRvIGtlcm5lbCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglZCk6IGxvY2F0aW9uIG1vdmVkIGZyb20gc2VydmVyIHRvIGtlcm5lbCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQpOworCisgICAgICAgICAgICAgICAgICAgIGlmIChldHMubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXRzLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gUSwgd2UgZG9uJ3QgcmV0dXJuIGVycm9ycyBhcyBhbiBpbnZhbGlkIHRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBpbnN0ZWFkIHdlIGxlYXZlIHRoZSBsYXN0IGtlcm5lbCBnb29kIHRpbWVzdGFtcCBhbG9uZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBzZXJ2ZXIgaXMgaWRlbnRpY2FsIHRvIGtlcm5lbCwgdGhlIGRldmljZSBkYXRhIHBpcGVsaW5lIGlzIGlkbGUuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBIGJldHRlciBzdGFydCB0aW1lIGlzIG5vdy4gIFRoZSByZXRyb2dyYWRlIGNoZWNrIGVuc3VyZXMKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRpbWVzdGFtcCBtb25vdG9uaWNpdHkuCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IG5vd05zID0gc3lzdGVtVGltZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtVGltZXN0YW1wU3RhbGxSZXBvcnRlZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCIlcyglZCk6IGRldmljZSBzdGFsbCB0aW1lIGNvcnJlY3RlZCB1c2luZyBjdXJyZW50IHRpbWUgJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwgKGxvbmcgbG9uZylub3dOcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFN0YWxsUmVwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lID0gY29udmVydE5zVG9UaW1lc3BlYyhub3dOcyk7CisgICAgICAgICAgICAgICAgICAgIH0gIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFN0YWxsUmVwb3J0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIC8vIFdlIHVwZGF0ZSB0aGUgdGltZXN0YW1wIHRpbWUgZXZlbiB3aGVuIHBhdXNlZC4KQEAgLTI1OTMsNyArMjY2OSw3IEBACiAgICAgICAgICAgICAgICAgbVByZXZpb3VzTG9jYXRpb24gPSBsb2NhdGlvbjsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gcmlnaHQgYWZ0ZXIgQXVkaW9UcmFjayBpcyBzdGFydGVkLCBvbmUgbWF5IG5vdCBmaW5kIGEgdGltZXN0YW1wCi0gICAgICAgICAgICAgICAgQUxPR1YoImdldEJlc3RUaW1lc3RhbXAgZGlkIG5vdCBmaW5kIHRpbWVzdGFtcCIpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IGdldEJlc3RUaW1lc3RhbXAgZGlkIG5vdCBmaW5kIHRpbWVzdGFtcCIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoc3RhdHVzID09IElOVkFMSURfT1BFUkFUSU9OKSB7CkBAIC0yNjAzLDcgKzI2NzksOCBAQAogICAgICAgICAgICAgLy8gdG8gYmUgemVybyB3ZSBjb252ZXJ0IHRoaXMgdG8gV09VTERfQkxPQ0sgKHdpdGggdGhlIGltcGxpY2l0IG1lYW5pbmcgb2YKICAgICAgICAgICAgIC8vICJ6ZXJvIiBmb3IgTnVQbGF5ZXIpLiAgV2UgZG9uJ3QgY29udmVydCBmb3IgdHJhY2sgcmVzdG9yYXRpb24gYXMgcG9zaXRpb24KICAgICAgICAgICAgIC8vIGRvZXMgbm90IHJlc2V0LgotICAgICAgICAgICAgQUxPR1YoInRpbWVzdGFtcCBzZXJ2ZXIgb2Zmc2V0OiVsbGQgcmVzdG9yZSBmcmFtZXM6JWxsZCIsCisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiB0aW1lc3RhbXAgc2VydmVyIG9mZnNldDolbGxkIHJlc3RvcmUgZnJhbWVzOiVsbGQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltRnJhbWVzV3JpdHRlblNlcnZlck9mZnNldCwgKGxvbmcgbG9uZyltRnJhbWVzV3JpdHRlbkF0UmVzdG9yZSk7CiAgICAgICAgICAgICBpZiAobUZyYW1lc1dyaXR0ZW5TZXJ2ZXJPZmZzZXQgIT0gbUZyYW1lc1dyaXR0ZW5BdFJlc3RvcmUpIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBXT1VMRF9CTE9DSzsKQEAgLTI2MTEsNyArMjY4OCw3IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HVl9JRihzdGF0dXMgIT0gV09VTERfQkxPQ0ssICJnZXRUaW1lc3RhbXAgZXJyb3I6JSN4Iiwgc3RhdHVzKTsKKyAgICAgICAgQUxPR1ZfSUYoc3RhdHVzICE9IFdPVUxEX0JMT0NLLCAiJXMoJWQpOiBnZXRUaW1lc3RhbXAgZXJyb3I6JSN4IiwgX19mdW5jX18sIG1Qb3J0SWQsIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogICAgIGlmIChpc09mZmxvYWRlZE9yRGlyZWN0X2woKSkgewpAQCAtMjY1MCw4ICsyNzI3LDkgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIHN0YXJ0IHRpbWUuICBJZiBncmVhdGVyLCB0aGVuIHRoYXQgbWVhbnMgd2UgbWF5IGhhdmUgZmFpbGVkCiAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGNvbXBsZXRlbHkgZmx1c2ggb3Igc3RvcCB0aGUgcHJldmlvdXMgcGxheWluZyB0cmFjay4KICAgICAgICAgICAgICAgICAgICAgQUxPR1dfSUYoIW1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldFRpbWVzdGFtcCBzdGFydHVwIGdsaXRjaCBkZXRlY3RlZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJWQpOiBzdGFydHVwIGdsaXRjaCBkZXRlY3RlZCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRlbHRhVGltZVVzKCVsbGQpIGRlbHRhUG9zaXRpb25VcyglbGxkKSB0c21Qb3NpdGlvbigldSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGVsdGFUaW1lVXMsIChsb25nIGxvbmcpZGVsdGFQb3NpdGlvbkJ5VXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbik7CiAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQgPSB0cnVlOwpAQCAtMjcwNSwzMyArMjc4Myw0OSBAQAogICAgIC8vIFByZXZlbnQgcmV0cm9ncmFkZSBtb3Rpb24gaW4gdGltZXN0YW1wLgogICAgIC8vIFRoaXMgaXMgc29tZXRpbWVzIGNhdXNlZCBieSBlcnJhdGljIHJlcG9ydHMgb2YgdGhlIGF2YWlsYWJsZSBzcGFjZSBpbiB0aGUgQUxTQSBkcml2ZXJzLgogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gRml4IHN0YWxlIHRpbWUgd2hlbiBjaGVja2luZyB0aW1lc3RhbXAgcmlnaHQgYWZ0ZXIgc3RhcnQoKS4KKyAgICAgICAgLy8gVGhlIHBvc2l0aW9uIGlzIGF0IHRoZSBsYXN0IHJlcG9ydGVkIGxvY2F0aW9uIGJ1dCB0aGUgdGltZSBjYW4gYmUgc3RhbGUKKyAgICAgICAgLy8gZHVlIHRvIHBhdXNlIG9yIHN0YW5kYnkgb3IgY29sZCBzdGFydCBsYXRlbmN5LgorICAgICAgICAvLworICAgICAgICAvLyBXZSBrZWVwIGFkdmFuY2luZyB0aGUgdGltZSAoYnV0IG5vdCB0aGUgcG9zaXRpb24pIHRvIGVuc3VyZSB0aGF0IHRoZQorICAgICAgICAvLyBzdGFsZSB2YWx1ZSBkb2VzIG5vdCBjb25mdXNlIHRoZSBhcHBsaWNhdGlvbi4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gRm9yIG9mZmxvYWQgY29tcGF0aWJpbGl0eSwgdXNlIGEgZGVmYXVsdCBsYWcgdmFsdWUgaGVyZS4KKyAgICAgICAgLy8gQW55IHRpbWUgZGlzY3JlcGFuY3kgYmV0d2VlbiB0aGlzIHVwZGF0ZSBhbmQgdGhlIHBhdXNlIHRpbWVzdGFtcCBpcyBoYW5kbGVkCisgICAgICAgIC8vIGJ5IHRoZSByZXRyb2dyYWRlIGNoZWNrIGFmdGVyd2FyZHMuCisgICAgICAgIGludDY0X3QgY3VycmVudFRpbWVOYW5vcyA9IGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJnRpbWVzdGFtcC5tVGltZSk7CisgICAgICAgIGNvbnN0IGludDY0X3QgbGFnTnMgPSBpbnQ2NF90KG1BZkxhdGVuY3kgKiAxMDAwMDAwTEwpOworICAgICAgICBjb25zdCBpbnQ2NF90IGxpbWl0TnMgPSBtU3RhcnROcyAtIGxhZ05zOworICAgICAgICBpZiAoY3VycmVudFRpbWVOYW5vcyA8IGxpbWl0TnMpIHsKKyAgICAgICAgICAgIGlmICghbVRpbWVzdGFtcFN0YWxlVGltZVJlcG9ydGVkKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIiVzKCVkKTogc3RhbGUgdGltZXN0YW1wIHRpbWUgY29ycmVjdGVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiY3VycmVudFRpbWVOYW5vczogJWxsZCA8IGxpbWl0TnM6ICVsbGQgPCBtU3RhcnROczogJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpY3VycmVudFRpbWVOYW5vcywgKGxvbmcgbG9uZylsaW1pdE5zLCAobG9uZyBsb25nKW1TdGFydE5zKTsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wU3RhbGVUaW1lUmVwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lID0gY29udmVydE5zVG9UaW1lc3BlYyhsaW1pdE5zKTsKKyAgICAgICAgICAgIGN1cnJlbnRUaW1lTmFub3MgPSBsaW1pdE5zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbVRpbWVzdGFtcFN0YWxlVGltZVJlcG9ydGVkID0gZmFsc2U7CisgICAgICAgIH0KKwogICAgICAgICAvLyBwcmV2aW91c1RpbWVzdGFtcFZhbGlkIGlzIHNldCB0byBmYWxzZSB3aGVuIHN0YXJ0aW5nIGFmdGVyIGEgc3RvcCBvciBmbHVzaC4KICAgICAgICAgaWYgKHByZXZpb3VzVGltZXN0YW1wVmFsaWQpIHsKICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgcHJldmlvdXNUaW1lTmFub3MgPQogICAgICAgICAgICAgICAgICAgICBhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZtUHJldmlvdXNUaW1lc3RhbXAubVRpbWUpOwotICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50VGltZU5hbm9zID0gYXVkaW9fdXRpbHNfbnNfZnJvbV90aW1lc3BlYygmdGltZXN0YW1wLm1UaW1lKTsKLQotICAgICAgICAgICAgLy8gRml4IHN0YWxlIHRpbWUgd2hlbiBjaGVja2luZyB0aW1lc3RhbXAgcmlnaHQgYWZ0ZXIgc3RhcnQoKS4KLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBGb3Igb2ZmbG9hZCBjb21wYXRpYmlsaXR5LCB1c2UgYSBkZWZhdWx0IGxhZyB2YWx1ZSBoZXJlLgotICAgICAgICAgICAgLy8gQW55IHRpbWUgZGlzY3JlcGFuY3kgYmV0d2VlbiB0aGlzIHVwZGF0ZSBhbmQgdGhlIHBhdXNlIHRpbWVzdGFtcCBpcyBoYW5kbGVkCi0gICAgICAgICAgICAvLyBieSB0aGUgcmV0cm9ncmFkZSBjaGVjayBhZnRlcndhcmRzLgotICAgICAgICAgICAgY29uc3QgaW50NjRfdCBsYWdOcyA9IGludDY0X3QobUFmTGF0ZW5jeSAqIDEwMDAwMDBMTCk7Ci0gICAgICAgICAgICBjb25zdCBpbnQ2NF90IGxpbWl0TnMgPSBtU3RhcnROcyAtIGxhZ05zOwotICAgICAgICAgICAgaWYgKGN1cnJlbnRUaW1lTmFub3MgPCBsaW1pdE5zKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0QoImNvcnJlY3RpbmcgdGltZXN0YW1wIHRpbWUgZm9yIHBhdXNlLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiY3VycmVudFRpbWVOYW5vczogJWxsZCA8IGxpbWl0TnM6ICVsbGQgPCBtU3RhcnROczogJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWN1cnJlbnRUaW1lTmFub3MsIChsb25nIGxvbmcpbGltaXROcywgKGxvbmcgbG9uZyltU3RhcnROcyk7Ci0gICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lID0gY29udmVydE5zVG9UaW1lc3BlYyhsaW1pdE5zKTsKLSAgICAgICAgICAgICAgICBjdXJyZW50VGltZU5hbm9zID0gbGltaXROczsKLSAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gcmV0cm9ncmFkZSBjaGVjawogICAgICAgICAgICAgaWYgKGN1cnJlbnRUaW1lTmFub3MgPCBwcmV2aW91c1RpbWVOYW5vcykgewotICAgICAgICAgICAgICAgIEFMT0dXKCJyZXRyb2dyYWRlIHRpbWVzdGFtcCB0aW1lIGNvcnJlY3RlZCwgJWxsZCA8ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyljdXJyZW50VGltZU5hbm9zLCAobG9uZyBsb25nKXByZXZpb3VzVGltZU5hbm9zKTsKKyAgICAgICAgICAgICAgICBpZiAoIW1UaW1lc3RhbXBSZXRyb2dyYWRlVGltZVJlcG9ydGVkKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IHJldHJvZ3JhZGUgdGltZXN0YW1wIHRpbWUgY29ycmVjdGVkLCAlbGxkIDwgJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1Qb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyljdXJyZW50VGltZU5hbm9zLCAobG9uZyBsb25nKXByZXZpb3VzVGltZU5hbm9zKTsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFJldHJvZ3JhZGVUaW1lUmVwb3J0ZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWUgPSBtUHJldmlvdXNUaW1lc3RhbXAubVRpbWU7Ci0gICAgICAgICAgICAgICAgLy8gY3VycmVudFRpbWVOYW5vcyBub3QgdXNlZCBiZWxvdy4KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFJldHJvZ3JhZGVUaW1lUmVwb3J0ZWQgPSBmYWxzZTsKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gTG9va2luZyBhdCBzaWduZWQgZGVsdGEgd2lsbCB3b3JrIGV2ZW4gd2hlbiB0aGUgdGltZXN0YW1wcwpAQCAtMjc0MCwxNSArMjgzNCwxNiBAQAogICAgICAgICAgICAgICAgICAgICAtIG1QcmV2aW91c1RpbWVzdGFtcC5tUG9zaXRpb24pLnNpZ25lZFZhbHVlKCk7CiAgICAgICAgICAgICBpZiAoZGVsdGFQb3NpdGlvbiA8IDApIHsKICAgICAgICAgICAgICAgICAvLyBPbmx5IHJlcG9ydCBvbmNlIHBlciBwb3NpdGlvbiBpbnN0ZWFkIG9mIHNwYW1taW5nIHRoZSBsb2cuCi0gICAgICAgICAgICAgICAgaWYgKCFtUmV0cm9ncmFkZU1vdGlvblJlcG9ydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJyZXRyb2dyYWRlIHRpbWVzdGFtcCBwb3NpdGlvbiBjb3JyZWN0ZWQsICVkID0gJXUgLSAldSIsCisgICAgICAgICAgICAgICAgaWYgKCFtVGltZXN0YW1wUmV0cm9ncmFkZVBvc2l0aW9uUmVwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogcmV0cm9ncmFkZSB0aW1lc3RhbXAgcG9zaXRpb24gY29ycmVjdGVkLCAlZCA9ICV1IC0gJXUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUG9ydElkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhUG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNUaW1lc3RhbXAubVBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgbVJldHJvZ3JhZGVNb3Rpb25SZXBvcnRlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBSZXRyb2dyYWRlUG9zaXRpb25SZXBvcnRlZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUmV0cm9ncmFkZU1vdGlvblJlcG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFJldHJvZ3JhZGVQb3NpdGlvblJlcG9ydGVkID0gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoZGVsdGFQb3NpdGlvbiA8IDApIHsKICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gbVByZXZpb3VzVGltZXN0YW1wLm1Qb3NpdGlvbjsKQEAgLTI3NjEsNyArMjg1Niw4IEBACiAgICAgICAgICAgICBpZiAoZGVsdGFUaW1lICE9IDApIHsKICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGNvbXB1dGVkU2FtcGxlUmF0ZSA9CiAgICAgICAgICAgICAgICAgICAgICAgICBkZWx0YVBvc2l0aW9uICogKGxvbmcgbG9uZylOQU5PU19QRVJfU0VDT05EIC8gZGVsdGFUaW1lOwotICAgICAgICAgICAgICAgIEFMT0dEKCJjb21wdXRlZFNhbXBsZVJhdGU6JXUgIHNhbXBsZVJhdGU6JXUiLAorICAgICAgICAgICAgICAgIEFMT0dEKCIlcyglZCk6IGNvbXB1dGVkU2FtcGxlUmF0ZToldSAgc2FtcGxlUmF0ZToldSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCljb21wdXRlZFNhbXBsZVJhdGUsIG1TYW1wbGVSYXRlKTsKICAgICAgICAgICAgIH0KICNlbmRpZgpAQCAtMjgwNywxMSArMjkwMywxMiBAQAogICAgIFN0cmluZzggcmVzdWx0OwogCiAgICAgcmVzdWx0LmFwcGVuZCgiIEF1ZGlvVHJhY2s6OmR1bXBcbiIpOwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgc3RhdHVzKCVkKSwgc3RhdGUoJWQpLCBzZXNzaW9uIElkKCVkKSwgZmxhZ3MoJSN4KVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXMsIG1TdGF0ZSwgbVNlc3Npb25JZCwgbUZsYWdzKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGlkKCVkKSBzdGF0dXMoJWQpLCBzdGF0ZSglZCksIHNlc3Npb24gSWQoJWQpLCBmbGFncyglI3gpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbVBvcnRJZCwgbVN0YXR1cywgbVN0YXRlLCBtU2Vzc2lvbklkLCBtRmxhZ3MpOwogICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgc3RyZWFtIHR5cGUoJWQpLCBsZWZ0IC0gcmlnaHQgdm9sdW1lKCVmLCAlZilcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAobVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZSgmbUF0dHJpYnV0ZXMpIDogbVN0cmVhbVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OmF0dHJpYnV0ZXNUb1N0cmVhbVR5cGUobUF0dHJpYnV0ZXMpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVbQVVESU9fSU5URVJMRUFWRV9MRUZUXSwgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX1JJR0hUXSk7CiAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBmb3JtYXQoJSN4KSwgY2hhbm5lbCBtYXNrKCUjeCksIGNoYW5uZWwgY291bnQoJXUpXG4iLAogICAgICAgICAgICAgICAgICAgbUZvcm1hdCwgbUNoYW5uZWxNYXNrLCBtQ2hhbm5lbENvdW50KTsKQEAgLTI4NDksMjIgKzI5NDYsMjMgQEAKIAogc3RhdHVzX3QgQXVkaW9UcmFjazo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKQogeworCiAgICAgaWYgKGNhbGxiYWNrID09IDApIHsKLSAgICAgICAgQUxPR1coIiVzIGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGFkZGluZyBOVUxMIGNhbGxiYWNrISIsIF9fZnVuY19fLCBtUG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOwogICAgIGlmIChtRGV2aWNlQ2FsbGJhY2sudW5zYWZlX2dldCgpID09IGNhbGxiYWNrLmdldCgpKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBBTE9HVygiJXMoJWQpOiBhZGRpbmcgc2FtZSBjYWxsYmFjayEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAgICAgaWYgKG1PdXRwdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgaWYgKG1EZXZpY2VDYWxsYmFjayAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXMgY2FsbGJhY2sgYWxyZWFkeSBwcmVzZW50ISIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtT3V0cHV0KTsKKyAgICAgICAgICAgIEFMT0dXKCIlcyglZCk6IGNhbGxiYWNrIGFscmVhZHkgcHJlc2VudCEiLCBfX2Z1bmNfXywgbVBvcnRJZCk7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtT3V0cHV0LCBtUG9ydElkKTsKICAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6YWRkQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtT3V0cHV0KTsKKyAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCwgbVBvcnRJZCk7CiAgICAgfQogICAgIG1EZXZpY2VDYWxsYmFjayA9IGNhbGxiYWNrOwogICAgIHJldHVybiBzdGF0dXM7CkBAIC0yODc0LDcgKzI5NzIsNyBAQAogICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKQogewogICAgIGlmIChjYWxsYmFjayA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlcyByZW1vdmluZyBOVUxMIGNhbGxiYWNrISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IHJlbW92aW5nIE5VTEwgY2FsbGJhY2shIiwgX19mdW5jX18sIG1Qb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CkBAIC0yODg0LDcgKzI5ODIsNyBAQAogICAgIH0KICAgICBtRGV2aWNlQ2FsbGJhY2suY2xlYXIoKTsKICAgICBpZiAobU91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayh0aGlzLCBtT3V0cHV0KTsKKyAgICAgICAgQXVkaW9TeXN0ZW06OnJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2sodGhpcywgbU91dHB1dCwgbVBvcnRJZCk7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTI5MDYsNiArMzAwNCw3IEBACiAgICAgICAgICAgICBtUm91dGVkRGV2aWNlSWQgPSBkZXZpY2VJZDsKICAgICAgICAgfQogICAgIH0KKwogICAgIGlmIChjYWxsYmFjay5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIGNhbGxiYWNrLT5vbkF1ZGlvRGV2aWNlVXBkYXRlKG1PdXRwdXQsIG1Sb3V0ZWREZXZpY2VJZCk7CiAgICAgfQpAQCAtMjk4NSw3ICszMDg0LDcgQEAKICAgICBjYXNlIFNUQVRFX0ZMVVNIRUQ6CiAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIHdlJ3JlIG5vdCBhY3RpdmUKICAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJJbnZhbGlkIG1TdGF0ZSBpbiBoYXNTdGFydGVkKCk6ICVkIiwgbVN0YXRlKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXMoJWQpOiBJbnZhbGlkIG1TdGF0ZSBpbiBoYXNTdGFydGVkKCk6ICVkIiwgX19mdW5jX18sIG1Qb3J0SWQsIG1TdGF0ZSk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KIApAQCAtMzAwMSw3ICszMTAwLDggQEAKICAgICAgICAgfSBlbHNlIGlmIChzdGF0dXMgPT0gT0spIHsKICAgICAgICAgICAgIHdhaXQgPSAodHMubVBvc2l0aW9uID09IDAgfHwgdHMubVBvc2l0aW9uID09IG1TdGFydFRzLm1Qb3NpdGlvbik7CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoImhhc1N0YXJ0ZWQgd2FpdDolZCAgdHM6JXUgIHN0YXJ0IHBvc2l0aW9uOiVsbGQiLAorICAgICAgICBBTE9HVigiJXMoJWQpOiBoYXNTdGFydGVkIHdhaXQ6JWQgIHRzOiV1ICBzdGFydCBwb3NpdGlvbjolbGxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAoaW50KXdhaXQsCiAgICAgICAgICAgICAgICAgdHMubVBvc2l0aW9uLAogICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVN0YXJ0VHMubVBvc2l0aW9uKTsKQEAgLTMwMjIsNyArMzEyMiw4IEBACiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgQUxPR1YoImhhc1N0YXJ0ZWQgd2FpdDolZCAgZXRzOiVsbGQgIHN0YXJ0IHBvc2l0aW9uOiVsbGQiLAorICAgICAgICBBTE9HVigiJXMoJWQpOiBoYXNTdGFydGVkIHdhaXQ6JWQgIGV0czolbGxkICBzdGFydCBwb3NpdGlvbjolbGxkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRJZCwKICAgICAgICAgICAgICAgICAoaW50KXdhaXQsCiAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylldHMubVBvc2l0aW9uW2xvY2F0aW9uXSwKICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW1TdGFydEV0cy5tUG9zaXRpb25bbG9jYXRpb25dKTsKQEAgLTMwNDMsOCArMzE0NCw5IEBACiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotQXVkaW9UcmFjazo6QXVkaW9UcmFja1RocmVhZDo6QXVkaW9UcmFja1RocmVhZChBdWRpb1RyYWNrJiByZWNlaXZlciwgYm9vbCBiQ2FuQ2FsbEphdmEpCi0gICAgOiBUaHJlYWQoYkNhbkNhbGxKYXZhKSwgbVJlY2VpdmVyKHJlY2VpdmVyKSwgbVBhdXNlZCh0cnVlKSwgbVBhdXNlZEludChmYWxzZSksIG1QYXVzZWROcygwTEwpLAorQXVkaW9UcmFjazo6QXVkaW9UcmFja1RocmVhZDo6QXVkaW9UcmFja1RocmVhZChBdWRpb1RyYWNrJiByZWNlaXZlcikKKyAgICA6IFRocmVhZCh0cnVlIC8qIGJDYW5DYWxsSmF2YSAqLykgIC8vIGJpbmRlciByZWN1cnNpb24gb24gcmVzdG9yZVRyYWNrX2woKSBtYXkgY2FsbCBKYXZhLgorICAgICwgbVJlY2VpdmVyKHJlY2VpdmVyKSwgbVBhdXNlZCh0cnVlKSwgbVBhdXNlZEludChmYWxzZSksIG1QYXVzZWROcygwTEwpLAogICAgICAgbUlnbm9yZU5leHRQYXVzZWRJbnQoZmFsc2UpCiB7CiB9CkBAIC0zMDk3LDcgKzMxOTksOCBAQAogICAgICAgICBucyA9IElOVDY0X01BWDsKICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAgICAgZGVmYXVsdDoKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihucyA8IDAsICJwcm9jZXNzQXVkaW9CdWZmZXIoKSByZXR1cm5lZCAlIiBQUklkNjQsIG5zKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihucyA8IDAsICIlcyglZCk6IHByb2Nlc3NBdWRpb0J1ZmZlcigpIHJldHVybmVkICVsbGQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtUmVjZWl2ZXIubVBvcnRJZCwgKGxvbmcgbG9uZylucyk7CiAgICAgICAgIHBhdXNlSW50ZXJuYWwobnMpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1RyYWNrU2hhcmVkLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwCmluZGV4IDAxZjQwMGQuLmVlNmMzMzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVHJhY2tTaGFyZWQuY3BwCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL21hY3Jvcy5oPgogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3NhZmVfbWF0aC5oPgogCiAjaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgpAQCAtMTg2LDcgKzE4Nyw3IEBACiAgICAgICAgICAgICBmcm9udCA9IGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQ7CiAgICAgICAgIH0KICAgICAgICAgLy8gd3JpdGUgdG8gcmVhciwgcmVhZCBmcm9tIGZyb250Ci0gICAgICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGZyb250OworICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IGF1ZGlvX3V0aWxzOjpzYWZlX3N1Yl9vdmVyZmxvdyhyZWFyLCBmcm9udCk7CiAgICAgICAgIC8vIHBpcGUgc2hvdWxkIG5vdCBiZSBvdmVyZnVsbAogICAgICAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7CiAgICAgICAgICAgICBpZiAobUlzT3V0KSB7CkBAIC02ODQsNyArNjg1LDcgQEAKICAgICAgICAgY29uc3Qgc2l6ZV90IG92ZXJmbG93Qml0ID0gbUZyYW1lQ291bnRQMiA8PCAxOwogICAgICAgICBjb25zdCBzaXplX3QgbWFzayA9IG92ZXJmbG93Qml0IC0gMTsKICAgICAgICAgaW50MzJfdCBuZXdGcm9udCA9IChmcm9udCAmIH5tYXNrKSB8IChmbHVzaCAmIG1hc2spOwotICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBuZXdGcm9udDsKKyAgICAgICAgc3NpemVfdCBmaWxsZWQgPSBhdWRpb191dGlsczo6c2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgbmV3RnJvbnQpOwogICAgICAgICBpZiAoZmlsbGVkID49IChzc2l6ZV90KW92ZXJmbG93Qml0KSB7CiAgICAgICAgICAgICAvLyBmcm9udCBhbmQgcmVhciBvZmZzZXRzIHNwYW4gdGhlIG92ZXJmbG93IGJpdCBvZiB0aGUgcDIgbWFzawogICAgICAgICAgICAgLy8gc28gcmViYXNpbmcgbmV3RnJvbnQgb24gdGhlIGZyb250IG9mZnNldCBpcyBvZmYgYnkgdGhlIG92ZXJmbG93IGJpdC4KQEAgLTcyNiw3ICs3MjcsNyBAQAogICAgICAgICBjb25zdCBzaXplX3Qgb3ZlcmZsb3dCaXQgPSBtRnJhbWVDb3VudFAyIDw8IDE7CiAgICAgICAgIGNvbnN0IHNpemVfdCBtYXNrID0gb3ZlcmZsb3dCaXQgLSAxOwogICAgICAgICBpbnQzMl90IG5ld1JlYXIgPSAocmVhciAmIH5tYXNrKSB8IChzdG9wICYgbWFzayk7Ci0gICAgICAgIHNzaXplX3QgZmlsbGVkID0gbmV3UmVhciAtIGZyb250OworICAgICAgICBzc2l6ZV90IGZpbGxlZCA9IGF1ZGlvX3V0aWxzOjpzYWZlX3N1Yl9vdmVyZmxvdyhuZXdSZWFyLCBmcm9udCk7CiAgICAgICAgIC8vIG92ZXJmbG93Qml0IGlzIHVuc2lnbmVkLCBzbyBjYXN0IHRvIHNpZ25lZCBmb3IgY29tcGFyaXNvbi4KICAgICAgICAgaWYgKGZpbGxlZCA+PSAoc3NpemVfdClvdmVyZmxvd0JpdCkgewogICAgICAgICAgICAgLy8gZnJvbnQgYW5kIHJlYXIgb2Zmc2V0cyBzcGFuIHRoZSBvdmVyZmxvdyBiaXQgb2YgdGhlIHAyIG1hc2sKQEAgLTc3OCw3ICs3NzksNyBAQAogICAgICAgICBmcm9udCA9IGFuZHJvaWRfYXRvbWljX2FjcXVpcmVfbG9hZCgmY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udCk7CiAgICAgICAgIHJlYXIgPSBjYmxrLT51Lm1TdHJlYW1pbmcubVJlYXI7CiAgICAgfQotICAgIHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGZyb250OworICAgIHNzaXplX3QgZmlsbGVkID0gYXVkaW9fdXRpbHM6OnNhZmVfc3ViX292ZXJmbG93KHJlYXIsIGZyb250KTsKICAgICAvLyBwaXBlIHNob3VsZCBub3QgYWxyZWFkeSBiZSBvdmVyZnVsbAogICAgIGlmICghKDAgPD0gZmlsbGVkICYmIChzaXplX3QpIGZpbGxlZCA8PSBtRnJhbWVDb3VudCkpIHsKICAgICAgICAgQUxPR0UoIlNoYXJlZCBtZW1vcnkgY29udHJvbCBibG9jayBpcyBjb3JydXB0IChmaWxsZWQ9JXpkLCBtRnJhbWVDb3VudD0lenUpOyBzaHV0dGluZyBkb3duIiwKQEAgLTkwNSw3ICs5MDYsNyBAQAogICAgICAgICByZXR1cm4gbUZyYW1lQ291bnQ7CiAgICAgfQogICAgIGNvbnN0IGludDMyX3QgcmVhciA9IGdldFJlYXIoKTsKLSAgICBzc2l6ZV90IGZpbGxlZCA9IHJlYXIgLSBjYmxrLT51Lm1TdHJlYW1pbmcubUZyb250OworICAgIHNzaXplX3QgZmlsbGVkID0gYXVkaW9fdXRpbHM6OnNhZmVfc3ViX292ZXJmbG93KHJlYXIsIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQpOwogICAgIC8vIHBpcGUgc2hvdWxkIG5vdCBhbHJlYWR5IGJlIG92ZXJmdWxsCiAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewogICAgICAgICBBTE9HRSgiU2hhcmVkIG1lbW9yeSBjb250cm9sIGJsb2NrIGlzIGNvcnJ1cHQgKGZpbGxlZD0lemQsIG1GcmFtZUNvdW50PSV6dSk7IHNodXR0aW5nIGRvd24iLApAQCAtOTMxLDcgKzkzMiw3IEBACiAgICAgICAgIHJldHVybiBtRnJhbWVDb3VudDsKICAgICB9CiAgICAgY29uc3QgaW50MzJfdCByZWFyID0gZ2V0UmVhcigpOwotICAgIGNvbnN0IHNzaXplX3QgZmlsbGVkID0gcmVhciAtIGNibGstPnUubVN0cmVhbWluZy5tRnJvbnQ7CisgICAgY29uc3Qgc3NpemVfdCBmaWxsZWQgPSBhdWRpb191dGlsczo6c2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgY2Jsay0+dS5tU3RyZWFtaW5nLm1Gcm9udCk7CiAgICAgaWYgKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IG1GcmFtZUNvdW50KSkgewogICAgICAgICByZXR1cm4gMDsgLy8gZXJyb3IgY29uZGl0aW9uLCBzaWxlbnRseSByZXR1cm4gMC4KICAgICB9CkBAIC0xMjMzLDYgKzEyMzQsMjEgQEAKICAgICByZXR1cm4gMDsKIH0KIAorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCitzaXplX3QgQXVkaW9SZWNvcmRTZXJ2ZXJQcm94eTo6ZnJhbWVzUmVhZHlTYWZlKCkgY29uc3QKK3sKKyAgICBpZiAobUlzU2h1dGRvd24pIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGNvbnN0IGludDMyX3QgZnJvbnQgPSBhbmRyb2lkX2F0b21pY19hY3F1aXJlX2xvYWQoJm1DYmxrLT51Lm1TdHJlYW1pbmcubUZyb250KTsKKyAgICBjb25zdCBpbnQzMl90IHJlYXIgPSBtQ2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyOworICAgIGNvbnN0IHNzaXplX3QgZmlsbGVkID0gYXVkaW9fdXRpbHM6OnNhZmVfc3ViX292ZXJmbG93KHJlYXIsIGZyb250KTsKKyAgICBpZiAoISgwIDw9IGZpbGxlZCAmJiAoc2l6ZV90KSBmaWxsZWQgPD0gbUZyYW1lQ291bnQpKSB7CisgICAgICAgIHJldHVybiAwOyAvLyBlcnJvciBjb25kaXRpb24sIHNpbGVudGx5IHJldHVybiAwLgorICAgIH0KKyAgICByZXR1cm4gZmlsbGVkOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1ZvbHVtZUdyb3VwLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0F1ZGlvVm9sdW1lR3JvdXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3OWEzNjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1ZvbHVtZUdyb3VwLmNwcApAQCAtMCwwICsxLDg0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb1ZvbHVtZUdyb3VwIgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1ZvbHVtZUdyb3VwLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdHVzX3QgQXVkaW9Wb2x1bWVHcm91cDo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpCit7CisgICAgc3RhdHVzX3QgcmV0ID0gcGFyY2VsLT5yZWFkVXRmOEZyb21VdGYxNigmbU5hbWUpOworICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgbUdyb3VwSWQgPSBzdGF0aWNfY2FzdDx2b2x1bWVfZ3JvdXBfdD4ocGFyY2VsLT5yZWFkSW50MzIoKSk7CisgICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgIEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGU7CisgICAgICAgIGF0dHJpYnV0ZS5yZWFkRnJvbVBhcmNlbChwYXJjZWwpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzLmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMucHVzaF9iYWNrKGF0dHJpYnV0ZS5nZXRBdHRyaWJ1dGVzKCkpOworICAgIH0KKyAgICBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwtPnJlYWRJbnQzMigpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHN0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHBhcmNlbC0+cmVhZEludDMyKCkpOworICAgICAgICBtU3RyZWFtcy5wdXNoX2JhY2soc3RyZWFtKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1ZvbHVtZUdyb3VwOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdAoreworICAgIHBhcmNlbC0+d3JpdGVVdGY4QXNVdGYxNihtTmFtZSk7CisgICAgcGFyY2VsLT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KG1Hcm91cElkKSk7CisgICAgc2l6ZV90IHNpemUgPSBtQXVkaW9BdHRyaWJ1dGVzLnNpemUoKTsKKyAgICBzaXplX3Qgc2l6ZVBvc2l0aW9uID0gcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIoc2l6ZSk7CisgICAgc2l6ZV90IGZpbmFsU2l6ZSA9IHNpemU7CisgICAgZm9yIChjb25zdCBhdXRvICZhdHRyaWJ1dGVzIDogbUF1ZGlvQXR0cmlidXRlcykgeworICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBwYXJjZWwtPmRhdGFQb3NpdGlvbigpOworICAgICAgICBBdWRpb0F0dHJpYnV0ZXMgYXR0cmlidXRlKGF0dHJpYnV0ZXMpOworICAgICAgICBzdGF0dXNfdCByZXQgPSBhdHRyaWJ1dGUud3JpdGVUb1BhcmNlbChwYXJjZWwpOworICAgICAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBwYXJjZWwtPnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICBmaW5hbFNpemUtLTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoc2l6ZSAhPSBmaW5hbFNpemUpIHsKKyAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oc2l6ZVBvc2l0aW9uKTsKKyAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKGZpbmFsU2l6ZSk7CisgICAgICAgIHBhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICB9CisgICAgcGFyY2VsLT53cml0ZUludDMyKG1TdHJlYW1zLnNpemUoKSk7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJlYW0gOiBtU3RyZWFtcykgeworICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RyZWFtKSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvRmxpbmdlci5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcAppbmRleCA5ZjNiNzQyLi41M2Q0NmYxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyLmNwcApAQCAtMjQsMTAgKzI0LDggQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvVGltZUNoZWNrLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1RpbWVDaGVjay5oPgogI2luY2x1ZGUgIklBdWRpb0ZsaW5nZXIuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtODksMTAgKzg3LDE1IEBACiAgICAgU1lTVEVNX1JFQURZLAogICAgIEZSQU1FX0NPVU5UX0hBTCwKICAgICBHRVRfTUlDUk9QSE9ORVMsCisgICAgU0VUX01BU1RFUl9CQUxBTkNFLAorICAgIEdFVF9NQVNURVJfQkFMQU5DRSwKKyAgICBTRVRfRUZGRUNUX1NVU1BFTkRFRCwKKyAgICBTRVRfQVVESU9fSEFMX1BJRFMKIH07CiAKICNkZWZpbmUgTUFYX0lURU1TX1BFUl9MSVNUIDEwMjQKIAorCiBjbGFzcyBCcEF1ZGlvRmxpbmdlciA6IHB1YmxpYyBCcEludGVyZmFjZTxJQXVkaW9GbGluZ2VyPgogewogcHVibGljOgpAQCAtMjQ0LDYgKzI0NywzNCBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgc3RhdHVzX3Qgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUZsb2F0KGJhbGFuY2UpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX01BU1RFUl9CQUxBTkNFLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkSW50MzIoKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBnZXRNYXN0ZXJCYWxhbmNlKGZsb2F0ICpiYWxhbmNlKSBjb25zdCBvdmVycmlkZQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvRmxpbmdlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NQVNURVJfQkFMQU5DRSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgKmJhbGFuY2UgPSByZXBseS5yZWFkRmxvYXQoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2YWx1ZSwKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkKICAgICB7CkBAIC0zNjMsMjAgKzM5NCwxOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3JCYXNlPiYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKICAgICB7Ci0gICAgICAgIGlmIChvdXRwdXQgPT0gTlVMTCB8fCBjb25maWcgPT0gTlVMTCB8fCBkZXZpY2VzID09IE5VTEwgfHwgbGF0ZW5jeU1zID09IE5VTEwpIHsKKyAgICAgICAgaWYgKG91dHB1dCA9PSBudWxscHRyIHx8IGNvbmZpZyA9PSBudWxscHRyIHx8IGRldmljZSA9PSBudWxscHRyIHx8IGxhdGVuY3lNcyA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihtb2R1bGUpOwogICAgICAgICBkYXRhLndyaXRlKGNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigqZGV2aWNlcyk7Ci0gICAgICAgIGRhdGEud3JpdGVTdHJpbmc4KGFkZHJlc3MpOworICAgICAgICBkYXRhLndyaXRlUGFyY2VsYWJsZSgqZGV2aWNlKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBmbGFncyk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChPUEVOX09VVFBVVCwgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewpAQCAtMzkxLDcgKzQyMCw2IEBACiAgICAgICAgICpvdXRwdXQgPSAoYXVkaW9faW9faGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0KCkgcmV0dXJuZWQgb3V0cHV0LCAlZCIsICpvdXRwdXQpOwogICAgICAgICByZXBseS5yZWFkKGNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7Ci0gICAgICAgICpkZXZpY2VzID0gKGF1ZGlvX2RldmljZXNfdClyZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgKmxhdGVuY3lNcyA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQpAQCAtNjAwLDE0ICs2MjgsMTggQEAKICAgICB9CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVmZmVjdERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcFV1aWQsCi0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZWZlcnJlZFR5cGVGbGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgY29uc3QKICAgICB7Ci0gICAgICAgIGlmIChwVXVpZCA9PSBOVUxMIHx8IHBEZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICAgICAgaWYgKHBVdWlkID09IE5VTEwgfHwgcFR5cGUgPT0gTlVMTCB8fCBwRGVzY3JpcHRvciA9PSBOVUxMKSB7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGUocFV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgIGRhdGEud3JpdGUocFR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgIGRhdGEud3JpdGVVaW50MzIocHJlZmVycmVkVHlwZUZsYWcpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0VGRkVDVF9ERVNDUklQVE9SLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwpAQCAtNjI2LDYgKzY1OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywKQEAgLTYzNCwxMiArNjY3LDExIEBACiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIHNwPElFZmZlY3Q+IGVmZmVjdDsKLQogICAgICAgICBpZiAocERlc2MgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGVmZmVjdDsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTlVMTCkgewogICAgICAgICAgICAgICAgICpzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICAgICAgfQogCiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtNjQ4LDYgKzY4MCwxMiBAQAogICAgICAgICBkYXRhLndyaXRlSW50MzIocHJpb3JpdHkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIG91dHB1dCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uSWQpOworICAgICAgICBpZiAoZGF0YS53cml0ZVBhcmNlbGFibGUoZGV2aWNlKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKnN0YXR1cyA9IE5PX0lOSVQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQogICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYob3BQYWNrYWdlTmFtZSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgcGlkKTsKIApAQCAtNjg2LDYgKzcyNCwxOCBAQAogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQogCisgICAgdmlydHVhbCB2b2lkIHNldEVmZmVjdFN1c3BlbmRlZChpbnQgZWZmZWN0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kZWQpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9GbGluZ2VyOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoZWZmZWN0SWQpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc2Vzc2lvbklkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHN1c3BlbmRlZCA/IDEgOiAwKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9FRkZFQ1RfU1VTUEVOREVELCBkYXRhLCAmcmVwbHkpOworICAgIH0KKwogICAgIHZpcnR1YWwgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGxvYWRId01vZHVsZShjb25zdCBjaGFyICpuYW1lKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtODU4LDYgKzkwOCwyMCBAQAogICAgICAgICBzdGF0dXMgPSByZXBseS5yZWFkUGFyY2VsYWJsZVZlY3RvcihtaWNyb3Bob25lcyk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9IYWxQaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHBpZF90PiYgcGlkcykKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb0ZsaW5nZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwaWRzLnNpemUoKSk7CisgICAgICAgIGZvciAoYXV0byBwaWQgOiBwaWRzKSB7CisgICAgICAgICAgICBkYXRhLndyaXRlSW50MzIocGlkKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0FVRElPX0hBTF9QSURTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKEF1ZGlvRmxpbmdlciwgImFuZHJvaWQubWVkaWEuSUF1ZGlvRmxpbmdlciIpOwpAQCAtODgxLDYgKzk0NSw3IEBACiAgICAgICAgIGNhc2UgSU5WQUxJREFURV9TVFJFQU06CiAgICAgICAgIGNhc2UgU0VUX1ZPSUNFX1ZPTFVNRToKICAgICAgICAgY2FzZSBNT1ZFX0VGRkVDVFM6CisgICAgICAgIGNhc2UgU0VUX0VGRkVDVF9TVVNQRU5ERUQ6CiAgICAgICAgIGNhc2UgTE9BRF9IV19NT0RVTEU6CiAgICAgICAgIGNhc2UgTElTVF9BVURJT19QT1JUUzoKICAgICAgICAgY2FzZSBHRVRfQVVESU9fUE9SVDoKQEAgLTg5NCw2ICs5NTksNyBAQAogICAgICAgICAgICAgLy8gcmV0dXJuIHN0YXR1cyBvbmx5IGZvciBub24gdm9pZCBtZXRob2RzCiAgICAgICAgICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgICAgICAgICBjYXNlIFNFVF9SRUNPUkRfU0lMRU5DRUQ6CisgICAgICAgICAgICAgICAgY2FzZSBTRVRfRUZGRUNUX1NVU1BFTkRFRDoKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4gKElOVkFMSURfT1BFUkFUSU9OKSk7CkBAIC05MTEsOCArOTc3LDkgQEAKICAgICAgICAgY2FzZSBTRVRfTU9ERToKICAgICAgICAgY2FzZSBTRVRfTUlDX01VVEU6CiAgICAgICAgIGNhc2UgU0VUX0xPV19SQU1fREVWSUNFOgotICAgICAgICBjYXNlIFNZU1RFTV9SRUFEWTogewotICAgICAgICAgICAgaWYgKG11bHRpdXNlcl9nZXRfYXBwX2lkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkgPj0gQUlEX0FQUF9TVEFSVCkgeworICAgICAgICBjYXNlIFNZU1RFTV9SRUFEWToKKyAgICAgICAgY2FzZSBTRVRfQVVESU9fSEFMX1BJRFM6IHsKKyAgICAgICAgICAgIGlmICghaXNTZXJ2aWNlVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiJXM6IHRyYW5zYWN0aW9uICVkIHJlY2VpdmVkIGZyb20gUElEICVkIHVuYXV0aG9yaXplZCBVSUQgJWQiLAogICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjb2RlLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKTsKQEAgLTk1MSw5ICsxMDE4LDggQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAotICAgIGNoYXIgdGltZUNoZWNrU3RyaW5nWzY0XTsKLSAgICBzbnByaW50Zih0aW1lQ2hlY2tTdHJpbmcsIHNpemVvZih0aW1lQ2hlY2tTdHJpbmcpLCAiSUF1ZGlvRmxpbmdlcjogJWQiLCBjb2RlKTsKLSAgICBUaW1lQ2hlY2sgY2hlY2sodGltZUNoZWNrU3RyaW5nKTsKKyAgICBzdGQ6OnN0cmluZyB0YWcoIklBdWRpb0ZsaW5nZXIgY29tbWFuZCAiICsgc3RkOjp0b19zdHJpbmcoY29kZSkpOworICAgIFRpbWVDaGVjayBjaGVjayh0YWcuY19zdHIoKSk7CiAKICAgICBzd2l0Y2ggKGNvZGUpIHsKICAgICAgICAgY2FzZSBDUkVBVEVfVFJBQ0s6IHsKQEAgLTEwNDksNiArMTExNSwyMSBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoIG1hc3Rlck11dGUoKSApOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNFVF9NQVNURVJfQkFMQU5DRTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKCBzZXRNYXN0ZXJCYWxhbmNlKGRhdGEucmVhZEZsb2F0KCkpICk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgR0VUX01BU1RFUl9CQUxBTkNFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgZmxvYXQgZjsKKyAgICAgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IGdldE1hc3RlckJhbGFuY2UoJmYpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3Qpc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAodm9pZClyZXBseS0+d3JpdGVGbG9hdChmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBTRVRfU1RSRUFNX1ZPTFVNRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIGludCBzdHJlYW0gPSBkYXRhLnJlYWRJbnQzMigpOwpAQCAtMTEzOSwxOSArMTIyMCwyMSBAQAogICAgICAgICAgICAgaWYgKGRhdGEucmVhZCgmY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX3QpKSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIEFMT0dFKCJiLzIzOTA1OTUxIik7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IChhdWRpb19kZXZpY2VzX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyhkYXRhLnJlYWRTdHJpbmc4KCkpOworICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+IGRldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yQmFzZShBVURJT19ERVZJQ0VfTk9ORSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICAgICAgICAgIGlmICgoc3RhdHVzID0gZGF0YS5yZWFkUGFyY2VsYWJsZShkZXZpY2UuZ2V0KCkpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KXN0YXR1cyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQogICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICB1aW50MzJfdCBsYXRlbmN5TXMgPSAwOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvcGVuT3V0cHV0KG1vZHVsZSwgJm91dHB1dCwgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZXMsIGFkZHJlc3MsICZsYXRlbmN5TXMsIGZsYWdzKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IG9wZW5PdXRwdXQobW9kdWxlLCAmb3V0cHV0LCAmY29uZmlnLCBkZXZpY2UsICZsYXRlbmN5TXMsIGZsYWdzKTsKICAgICAgICAgICAgIEFMT0dWKCJPUEVOX09VVFBVVCBvdXRwdXQsICVkIiwgb3V0cHV0KTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKChpbnQzMl90KXN0YXR1cyk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoKGludDMyX3Qpb3V0cHV0KTsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGUoJmNvbmZpZywgc2l6ZW9mKGF1ZGlvX2NvbmZpZ190KSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZGV2aWNlcyk7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobGF0ZW5jeU1zKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKQEAgLTEyNzgsMTAgKzEzNjEsMTcgQEAKICAgICAgICAgfQogICAgICAgICBjYXNlIEdFVF9FRkZFQ1RfREVTQ1JJUFRPUjogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKLSAgICAgICAgICAgIGRhdGEucmVhZCgmdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdXVpZCA9IHt9OworICAgICAgICAgICAgaWYgKGRhdGEucmVhZCgmdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTM5NDE3MTg5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlZmZlY3RfdXVpZF90IHR5cGUgPSB7fTsKKyAgICAgICAgICAgIGlmIChkYXRhLnJlYWQoJnR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVMb2coMHg1MzRlNDU1NCwgIjEzOTQxNzE4OSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcgPSBkYXRhLnJlYWRVaW50MzIoKTsKICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYyA9IHt9OwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0RWZmZWN0RGVzY3JpcHRvcigmdXVpZCwgJmRlc2MpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0RWZmZWN0RGVzY3JpcHRvcigmdXVpZCwgJnR5cGUsIHByZWZlcnJlZFR5cGVGbGFnLCAmZGVzYyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZSgmZGVzYywgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKTsKQEAgLTEyOTgsMTQgKzEzODgsMTggQEAKICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gKGF1ZGlvX2lvX2hhbmRsZV90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IChhdWRpb19zZXNzaW9uX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyIGRldmljZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgICAgICAgICAgaWYgKChzdGF0dXMgPSBkYXRhLnJlYWRQYXJjZWxhYmxlKCZkZXZpY2UpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lID0gZGF0YS5yZWFkU3RyaW5nMTYoKTsKICAgICAgICAgICAgIHBpZF90IHBpZCA9IChwaWRfdClkYXRhLnJlYWRJbnQzMigpOwogCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKICAgICAgICAgICAgIGludCBpZCA9IDA7CiAgICAgICAgICAgICBpbnQgZW5hYmxlZCA9IDA7CiAKLSAgICAgICAgICAgIHNwPElFZmZlY3Q+IGVmZmVjdCA9IGNyZWF0ZUVmZmVjdCgmZGVzYywgY2xpZW50LCBwcmlvcml0eSwgb3V0cHV0LCBzZXNzaW9uSWQsCisgICAgICAgICAgICBzcDxJRWZmZWN0PiBlZmZlY3QgPSBjcmVhdGVFZmZlY3QoJmRlc2MsIGNsaWVudCwgcHJpb3JpdHksIG91dHB1dCwgc2Vzc2lvbklkLCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUsIHBpZCwgJnN0YXR1cywgJmlkLCAmZW5hYmxlZCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaWQpOwpAQCAtMTMyMiw2ICsxNDE2LDE0IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihtb3ZlRWZmZWN0cyhzZXNzaW9uLCBzcmNPdXRwdXQsIGRzdE91dHB1dCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIFNFVF9FRkZFQ1RfU1VTUEVOREVEOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgaW50IGVmZmVjdElkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSAoYXVkaW9fc2Vzc2lvbl90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYm9vbCBzdXNwZW5kZWQgPSBkYXRhLnJlYWRJbnQzMigpID09IDE7CisgICAgICAgICAgICBzZXRFZmZlY3RTdXNwZW5kZWQoZWZmZWN0SWQsIHNlc3Npb25JZCwgc3VzcGVuZGVkKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBMT0FEX0hXX01PRFVMRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb0ZsaW5nZXIsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGxvYWRId01vZHVsZShkYXRhLnJlYWRDU3RyaW5nKCkpKTsKQEAgLTE0NzEsNiArMTU3MywzMSBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CisgICAgICAgIGNhc2UgU0VUX0FVRElPX0hBTF9QSURTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvRmxpbmdlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8cGlkX3Q+IHBpZHM7CisgICAgICAgICAgICBpbnQzMl90IHNpemU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmc2l6ZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaXplIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2l6ZSA+IE1BWF9JVEVNU19QRVJfTElTVCkgeworICAgICAgICAgICAgICAgIHNpemUgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHBpZDsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAgZGF0YS5yZWFkSW50MzIoJnBpZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBwaWRzLnB1c2hfYmFjayhwaWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0QXVkaW9IYWxQaWRzKHBpZHMpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9GbGluZ2VyQ2xpZW50LmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCmluZGV4IGIyZGJjNGMuLjQ3ZWI3ZGMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb0ZsaW5nZXJDbGllbnQuY3BwCkBAIC01Miw2ICs1Miw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQ2NChpb0Rlc2MtPm1GcmFtZUNvdW50KTsKICAgICAgICAgZGF0YS53cml0ZUludDY0KGlvRGVzYy0+bUZyYW1lQ291bnRIQUwpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIoaW9EZXNjLT5tTGF0ZW5jeSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihpb0Rlc2MtPm1Qb3J0SWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSU9fQ09ORklHX0NIQU5HRUQsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KIH07CkBAIC03Niw2ICs3Nyw3IEBACiAgICAgICAgICAgICBpb0Rlc2MtPm1GcmFtZUNvdW50ID0gZGF0YS5yZWFkSW50NjQoKTsKICAgICAgICAgICAgIGlvRGVzYy0+bUZyYW1lQ291bnRIQUwgPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgaW9EZXNjLT5tTGF0ZW5jeSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpb0Rlc2MtPm1Qb3J0SWQgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaW9Db25maWdDaGFuZ2VkKGV2ZW50LCBpb0Rlc2MpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZS5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAppbmRleCA4Y2Q0YTg1Li4yNGQ3YzkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcApAQCAtMjQsMTEgKzI0LDEwIEBACiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL211bHRpdXNlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL1RpbWVDaGVjay5oPgotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvVGltZUNoZWNrLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTUyLDYgKzUxLDEwIEBACiAgICAgSU5JVF9TVFJFQU1fVk9MVU1FLAogICAgIFNFVF9TVFJFQU1fVk9MVU1FLAogICAgIEdFVF9TVFJFQU1fVk9MVU1FLAorICAgIFNFVF9WT0xVTUVfQVRUUklCVVRFUywKKyAgICBHRVRfVk9MVU1FX0FUVFJJQlVURVMsCisgICAgR0VUX01JTl9WT0xVTUVfRk9SX0FUVFJJQlVURVMsCisgICAgR0VUX01BWF9WT0xVTUVfRk9SX0FUVFJJQlVURVMsCiAgICAgR0VUX1NUUkFURUdZX0ZPUl9TVFJFQU0sCiAgICAgR0VUX09VVFBVVF9GT1JfRUZGRUNULAogICAgIFJFR0lTVEVSX0VGRkVDVCwKQEAgLTYzLDYgKzY2LDcgQEAKICAgICBTRVRfRUZGRUNUX0VOQUJMRUQsCiAgICAgSVNfU1RSRUFNX0FDVElWRV9SRU1PVEVMWSwKICAgICBJU19PRkZMT0FEX1NVUFBPUlRFRCwKKyAgICBJU19ESVJFQ1RfT1VUUFVUX1NVUFBPUlRFRCwKICAgICBMSVNUX0FVRElPX1BPUlRTLAogICAgIEdFVF9BVURJT19QT1JULAogICAgIENSRUFURV9BVURJT19QQVRDSCwKQEAgLTc4LDExICs4MiwzMyBAQAogICAgIFNUQVJUX0FVRElPX1NPVVJDRSwKICAgICBTVE9QX0FVRElPX1NPVVJDRSwKICAgICBTRVRfQVVESU9fUE9SVF9DQUxMQkFDS19FTkFCTEVELAorICAgIFNFVF9BVURJT19WT0xVTUVfR1JPVVBfQ0FMTEJBQ0tfRU5BQkxFRCwKICAgICBTRVRfTUFTVEVSX01PTk8sCiAgICAgR0VUX01BU1RFUl9NT05PLAogICAgIEdFVF9TVFJFQU1fVk9MVU1FX0RCLAogICAgIEdFVF9TVVJST1VORF9GT1JNQVRTLAotICAgIFNFVF9TVVJST1VORF9GT1JNQVRfRU5BQkxFRAorICAgIFNFVF9TVVJST1VORF9GT1JNQVRfRU5BQkxFRCwKKyAgICBBRERfU1RSRUFNX0RFRkFVTFRfRUZGRUNULAorICAgIFJFTU9WRV9TVFJFQU1fREVGQVVMVF9FRkZFQ1QsCisgICAgQUREX1NPVVJDRV9ERUZBVUxUX0VGRkVDVCwKKyAgICBSRU1PVkVfU09VUkNFX0RFRkFVTFRfRUZGRUNULAorICAgIFNFVF9BU1NJU1RBTlRfVUlELAorICAgIFNFVF9BMTFZX1NFUlZJQ0VTX1VJRFMsCisgICAgSVNfSEFQVElDX1BMQVlCQUNLX1NVUFBPUlRFRCwKKyAgICBTRVRfVUlEX0RFVklDRV9BRkZJTklUWSwKKyAgICBSRU1PVkVfVUlEX0RFVklDRV9BRkZJTklUWSwKKyAgICBHRVRfT0ZGTE9BRF9GT1JNQVRTX0EyRFAsCisgICAgTElTVF9BVURJT19QUk9EVUNUX1NUUkFURUdJRVMsCisgICAgR0VUX1NUUkFURUdZX0ZPUl9BVFRSSUJVVEVTLAorICAgIExJU1RfQVVESU9fVk9MVU1FX0dST1VQUywKKyAgICBHRVRfVk9MVU1FX0dST1VQX0ZPUl9BVFRSSUJVVEVTLAorICAgIFNFVF9BTExPV0VEX0NBUFRVUkVfUE9MSUNZLAorICAgIE1PVkVfRUZGRUNUU19UT19JTywKKyAgICBTRVRfUlRUX0VOQUJMRUQsCisgICAgU0VUX1BSRUZFUlJFRF9ERVZJQ0VfRk9SX1BST0RVQ1RfU1RSQVRFR1ksCisgICAgUkVNT1ZFX1BSRUZFUlJFRF9ERVZJQ0VfRk9SX1BST0RVQ1RfU1RSQVRFR1ksCisgICAgR0VUX1BSRUZFUlJFRF9ERVZJQ0VfRk9SX1BST0RVQ1RfU1RSQVRFR1ksCisgICAgQVVESU9fTU9EVUxFU19VUERBVEVELCAgLy8gb25ld2F5CiB9OwogCiAjZGVmaW5lIE1BWF9JVEVNU19QRVJfTElTVCAxMDI0CkBAIC05OSw3ICsxMjUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtMTA3LDYgKzEzNCw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXRlKSk7CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKGRldmljZV9hZGRyZXNzKTsKICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcoZGV2aWNlX25hbWUpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihlbmNvZGVkRm9ybWF0KSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfREVWSUNFX0NPTk5FQ1RJT05fU1RBVEUsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQpAQCAtMTI1LDEzICsxNTMsMTUgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGRldmljZSkpOwogICAgICAgICBkYXRhLndyaXRlQ1N0cmluZyhkZXZpY2VfYWRkcmVzcyk7CiAgICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKGRldmljZV9uYW1lKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oZW5jb2RlZEZvcm1hdCkpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoSEFORExFX0RFVklDRV9DT05GSUdfQ0hBTkdFLCBkYXRhLCAmcmVwbHkpOwogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KQEAgLTE3Myw0NyArMjAzLDQxIEBACiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8YXVkaW9faW9faGFuZGxlX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCisgICAgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKSBvdmVycmlkZQogICAgICAgICB7CiAgICAgICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgICAgIGlmIChhdHRyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RyZWFtID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoImdldE91dHB1dEZvckF0dHIoKTogTlVMTCBhdWRpbyBhdHRyaWJ1dGVzIGFuZCBzdHJlYW0gdHlwZSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKnN0cmVhbSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0ciB1bnNwZWNpZmllZCBzdHJlYW0gdHlwZSIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyIE5VTEwgb3V0cHV0IC0gc2hvdWxkbid0IGhhcHBlbiIpOworICAgICAgICAgICAgaWYgKGF0dHIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBOVUxMIGF1ZGlvIGF0dHJpYnV0ZXMiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzZWxlY3RlZERldmljZUlkID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0ciBOVUxMIHNlbGVjdGVkRGV2aWNlSWQgLSBzaG91bGRuJ3QgaGFwcGVuIik7CisgICAgICAgICAgICBpZiAob3V0cHV0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgTlVMTCBvdXRwdXQgLSBzaG91bGRuJ3QgaGFwcGVuIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocG9ydElkID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0ciBOVUxMIHBvcnRJZCAtIHNob3VsZG4ndCBoYXBwZW4iKTsKKyAgICAgICAgICAgIGlmIChzZWxlY3RlZERldmljZUlkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMgTlVMTCBzZWxlY3RlZERldmljZUlkIC0gc2hvdWxkbid0IGhhcHBlbiIsIF9fZnVuY19fKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF0dHIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgICAgIGRhdGEud3JpdGUoYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHBvcnRJZCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIE5VTEwgcG9ydElkIC0gc2hvdWxkbid0IGhhcHBlbiIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlY29uZGFyeU91dHB1dHMgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcyBOVUxMIHNlY29uZGFyeU91dHB1dHMgLSBzaG91bGRuJ3QgaGFwcGVuIiwgX19mdW5jX18pOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkYXRhLndyaXRlKGF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihzZXNzaW9uKTsKICAgICAgICAgICAgIGlmIChzdHJlYW0gPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMigwKTsKQEAgLTIzNSw2ICsyNTksMTAgQEAKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWQoJmF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQogICAgICAgICAgICAgKm91dHB1dCA9IChhdWRpb19pb19oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbFN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KXJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBOVUxMKSB7CkBAIC0yNDIsNDkgKzI3MCw0MCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgICpwb3J0SWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdClyZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICBzZWNvbmRhcnlPdXRwdXRzLT5yZXNpemUocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWQoc2Vjb25kYXJ5T3V0cHV0cy0+ZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5T3V0cHV0cy0+c2l6ZSgpICogc2l6ZW9mKGF1ZGlvX2lvX2hhbmRsZV90KSk7CiAgICAgICAgIH0KIAotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG91dHB1dCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc3RyZWFtKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzZXNzaW9uKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KXBvcnRJZCk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTVEFSVF9PVVRQVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMihvdXRwdXQpOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIHN0cmVhbSk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgc2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClwb3J0SWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUF9PVVRQVVQsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKG91dHB1dCk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClzdHJlYW0pOwotICAgICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3Qpc2Vzc2lvbik7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdClwb3J0SWQpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVMRUFTRV9PVVRQVVQsIGRhdGEsICZyZXBseSk7CiAgICAgfQogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCkBAIC0zMTQsNiArMzMzLDcgQEAKICAgICAgICAgfQogICAgICAgICBkYXRhLndyaXRlKGF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKCppbnB1dCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihyaWlkKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHNlc3Npb24pOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocGlkKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHVpZCk7CkBAIC0zMzYsMTYgKzM1NiwxMyBAQAogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzaWxlbmNlZCkKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgewogICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocG9ydElkKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKCpzaWxlbmNlZCA/IDEgOiAwKTsKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNUQVJUX0lOUFVULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICpzaWxlbmNlZCA9IHJlcGx5LnJlYWRJbnQzMigpID09IDE7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCkBAIC00MDcsMTMgKzQyNCw3NyBAQAogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOwogICAgIH0KIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihpbmRleCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KGRldmljZSkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1ZPTFVNRV9BVFRSSUJVVEVTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgaW50ICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihkZXZpY2UpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9WT0xVTUVfQVRUUklCVVRFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTUlOX1ZPTFVNRV9GT1JfQVRUUklCVVRFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfTUFYX1ZPTFVNRV9GT1JfQVRUUklCVVRFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgaW5kZXggPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RyZWFtKSk7CiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChHRVRfU1RSQVRFR1lfRk9SX1NUUkVBTSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZFVpbnQzMigpOwogICAgIH0KIAogICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCkBAIC00NzAsNiArNTUxLDIyIEBACiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CiAgICAgfQogCisgICAgc3RhdHVzX3QgbW92ZUVmZmVjdHNUb0lvKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGlkcywgYXVkaW9faW9faGFuZGxlX3QgaW8pIG92ZXJyaWRlCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoaWRzLnNpemUoKSk7CisgICAgICAgIGZvciAoYXV0byBpZCA6IGlkcykgeworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKGlkKTsKKyAgICAgICAgfQorICAgICAgICBkYXRhLndyaXRlSW50MzIoaW8pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTU9WRV9FRkZFQ1RTX1RPX0lPLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCiAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcykgY29uc3QKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTUyNCw2ICs2MjEsMTUgQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKKyAgICBzdGF0dXNfdCBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aWRfdCB1aWQsIGF1ZGlvX2ZsYWdzX21hc2tfdCBmbGFncykgb3ZlcnJpZGUgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIodWlkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGZsYWdzKTsKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BTExPV0VEX0NBUFRVUkVfUE9MSUNZLCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CisgICAgfQorCiAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgaW5mbykKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKQEAgLTUzMyw2ICs2MzksMTYgQEAKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KIAorICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfYmFzZV90KSk7CisgICAgICAgIGRhdGEud3JpdGUoJmF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KElTX0RJUkVDVF9PVVRQVVRfU1VQUE9SVEVELCBkYXRhLCAmcmVwbHkpOworICAgICAgICByZXR1cm4gc3RhdHVzID09IE5PX0VSUk9SID8gc3RhdGljX2Nhc3Q8Ym9vbD4ocmVwbHkucmVhZEludDMyKCkpIDogZmFsc2U7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLApAQCAtNjc0LDYgKzc5MCwxNCBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0FVRElPX1BPUlRfQ0FMTEJBQ0tfRU5BQkxFRCwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGVuYWJsZWQgPyAxIDogMCk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQVVESU9fVk9MVU1FX0dST1VQX0NBTExCQUNLX0VOQUJMRUQsIGRhdGEsICZyZXBseSk7CisgICAgfQorCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2UpCkBAIC03NTMsMTEgKzg3NywxMSBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGlmIChzb3VyY2UgPT0gTlVMTCB8fCBhdHRyaWJ1dGVzID09IE5VTEwgfHwgaGFuZGxlID09IE5VTEwpIHsKKyAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMIHx8IGF0dHJpYnV0ZXMgPT0gTlVMTCB8fCBwb3J0SWQgPT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgICAgICBkYXRhLndyaXRlKHNvdXJjZSwgc2l6ZW9mKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZykpOwpAQCAtNzcwLDE1ICs4OTQsMTUgQEAKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQotICAgICAgICAqaGFuZGxlID0gKGF1ZGlvX3BhdGNoX2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICAqcG9ydElkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgZGF0YS53cml0ZUludDMyKGhhbmRsZSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwb3J0SWQpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU1RPUF9BVURJT19TT1VSQ0UsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CkBAIC04NzksNiArMTAwMywzNDcgQEAKICAgICAgICAgfQogICAgICAgICByZXR1cm4gcmVwbHkucmVhZEludDMyKCk7CiAgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cykKKyAgICB7CisgICAgICAgIGlmIChmb3JtYXRzID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX09GRkxPQURfRk9STUFUU19BMkRQLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SIHx8IChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGxpc3Rfc2l6ZSA9IHJlcGx5LnJlYWRVaW50MzIoKTsKKworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxpc3Rfc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBmb3JtYXRzLT5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KHJlcGx5LnJlYWRJbnQzMigpKSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworCisgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyZWFtRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSh0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYob3BQYWNrYWdlTmFtZSk7CisgICAgICAgIGRhdGEud3JpdGUodXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHByaW9yaXR5KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSB1c2FnZSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChBRERfU1RSRUFNX0RFRkFVTFRfRUZGRUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgKmlkID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGlkKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFJFTU9WRV9TVFJFQU1fREVGQVVMVF9FRkZFQ1QsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSh0eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICBkYXRhLndyaXRlU3RyaW5nMTYob3BQYWNrYWdlTmFtZSk7CisgICAgICAgIGRhdGEud3JpdGUodXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHByaW9yaXR5KTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzb3VyY2UpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoQUREX1NPVVJDRV9ERUZBVUxUX0VGRkVDVCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgICppZCA9IHJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihpZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfU09VUkNFX0RFRkFVTFRfRUZGRUNULCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdCA8c3RhdHVzX3Q+IChyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHVpZCk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfQVNTSVNUQU5UX1VJRCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3QgPHN0YXR1c190PiAocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlSW50MzIodWlkcy5zaXplKCkpOworICAgICAgICBmb3IgKGF1dG8gdWlkIDogdWlkcykgeworICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKHVpZCk7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9BMTFZX1NFUlZJQ0VTX1VJRFMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0IDxzdGF0dXNfdD4gKHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoSVNfSEFQVElDX1BMQVlCQUNLX1NVUFBPUlRFRCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXBseS5yZWFkQm9vbCgpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSB1aWQpOworICAgICAgICBzaXplX3Qgc2l6ZSA9IGRldmljZXMuc2l6ZSgpOworICAgICAgICBzaXplX3Qgc2l6ZVBvc2l0aW9uID0gZGF0YS5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzaXplKTsKKyAgICAgICAgc2l6ZV90IGZpbmFsU2l6ZSA9IHNpemU7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBkYXRhLmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgaWYgKGRldmljZXNbaV0ud3JpdGVUb1BhcmNlbCgmZGF0YSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBkYXRhLnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgZmluYWxTaXplLS07CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgIT0gZmluYWxTaXplKSB7CisgICAgICAgICAgICBzaXplX3QgcG9zaXRpb24gPSBkYXRhLmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgZGF0YS5zZXREYXRhUG9zaXRpb24oc2l6ZVBvc2l0aW9uKTsKKyAgICAgICAgICAgIGRhdGEud3JpdGVJbnQzMihmaW5hbFNpemUpOworICAgICAgICAgICAgZGF0YS5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9VSURfREVWSUNFX0FGRklOSVRZLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKSB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSB1aWQpOworCisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX1VJRF9ERVZJQ0VfQUZGSU5JVFksIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IChzdGF0dXNfdCkgcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9BVURJT19QUk9EVUNUX1NUUkFURUdJRVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogcGVybWlzc2lvbiBkZW5pZWQiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgdWludDMyX3QgbnVtU3RyYXRlZ2llcyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3RyYXRlZ2llczsgaSsrKSB7CisgICAgICAgICAgICBBdWRpb1Byb2R1Y3RTdHJhdGVneSBzdHJhdGVneTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHN0cmF0ZWd5LnJlYWRGcm9tUGFyY2VsKCZyZXBseSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gcmVhZCBzdHJhdGVnaWVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBzdHJhdGVnaWVzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0cmF0ZWdpZXMucHVzaF9iYWNrKHN0cmF0ZWd5KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5KQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWEud3JpdGVUb1BhcmNlbCgmZGF0YSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9TVFJBVEVHWV9GT1JfQVRUUklCVVRFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXMgPSBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHByb2R1Y3RTdHJhdGVneSA9IHN0YXRpY19jYXN0PHByb2R1Y3Rfc3RyYXRlZ3lfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoTElTVF9BVURJT19WT0xVTUVfR1JPVVBTLCBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHN0YXRpY19jYXN0PHN0YXR1c190PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgdWludDMyX3QgbnVtR3JvdXBzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1Hcm91cHM7IGkrKykgeworICAgICAgICAgICAgQXVkaW9Wb2x1bWVHcm91cCBncm91cDsKKyAgICAgICAgICAgIHN0YXR1cyA9IGdyb3VwLnJlYWRGcm9tUGFyY2VsKCZyZXBseSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gcmVhZCB2b2x1bWUgZ3JvdXBzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBncm91cHMuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ3JvdXBzLnB1c2hfYmFjayhncm91cCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgJnZvbHVtZUdyb3VwKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWEud3JpdGVUb1BhcmNlbCgmZGF0YSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9WT0xVTUVfR1JPVVBfRk9SX0FUVFJJQlVURVMsIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlcGx5LnJlYWRJbnQzMigpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICB2b2x1bWVHcm91cCA9IHN0YXRpY19jYXN0PHZvbHVtZV9ncm91cF90PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFJ0dEVuYWJsZWQoYm9vbCBlbmFibGVkKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+KGVuYWJsZWQpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KFNFVF9SVFRfRU5BQkxFRCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyYXRlZ3kpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlLndyaXRlVG9QYXJjZWwoJmRhdGEpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChTRVRfUFJFRkVSUkVEX0RFVklDRV9GT1JfUFJPRFVDVF9TVFJBVEVHWSwKKyAgICAgICAgICAgICAgICBkYXRhLCAmcmVwbHkpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0YXR1c190PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpCisgICAgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBkYXRhLndyaXRlVWludDMyKHN0YXRpY19jYXN0PHVpbnQzMl90PihzdHJhdGVneSkpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoUkVNT1ZFX1BSRUZFUlJFRF9ERVZJQ0VfRk9SX1BST0RVQ1RfU1RSQVRFR1ksCisgICAgICAgICAgICAgICAgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4ocmVwbHkucmVhZEludDMyKCkpOworICAgIH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RyYXRlZ3kpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9QUkVGRVJSRURfREVWSUNFX0ZPUl9QUk9EVUNUX1NUUkFURUdZLAorICAgICAgICAgICAgICAgIGRhdGEsICZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgc3RhdHVzID0gZGV2aWNlLnJlYWRGcm9tUGFyY2VsKCZyZXBseSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0YXR1c190PihyZXBseS5yZWFkSW50MzIoKSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCkKKyAgICB7CisgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKKyAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChBVURJT19NT0RVTEVTX1VQREFURUQsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOworICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShBdWRpb1BvbGljeVNlcnZpY2UsICJhbmRyb2lkLm1lZGlhLklBdWRpb1BvbGljeVNlcnZpY2UiKTsKQEAgLTg5Nyw3ICsxMzYyLDYgQEAKICAgICAgICAgY2FzZSBTVEFSVF9JTlBVVDoKICAgICAgICAgY2FzZSBTVE9QX0lOUFVUOgogICAgICAgICBjYXNlIFJFTEVBU0VfSU5QVVQ6Ci0gICAgICAgIGNhc2UgR0VUX1NUUkFURUdZX0ZPUl9TVFJFQU06CiAgICAgICAgIGNhc2UgR0VUX09VVFBVVF9GT1JfRUZGRUNUOgogICAgICAgICBjYXNlIFJFR0lTVEVSX0VGRkVDVDoKICAgICAgICAgY2FzZSBVTlJFR0lTVEVSX0VGRkVDVDoKQEAgLTkwNSw2ICsxMzY5LDcgQEAKICAgICAgICAgY2FzZSBHRVRfT1VUUFVUX0ZPUl9BVFRSOgogICAgICAgICBjYXNlIEFDUVVJUkVfU09VTkRUUklHR0VSX1NFU1NJT046CiAgICAgICAgIGNhc2UgUkVMRUFTRV9TT1VORFRSSUdHRVJfU0VTU0lPTjoKKyAgICAgICAgY2FzZSBNT1ZFX0VGRkVDVFNfVE9fSU86CiAgICAgICAgICAgICBBTE9HVygiJXM6IHRyYW5zYWN0aW9uICVkIHJlY2VpdmVkIGZyb20gUElEICVkIiwKICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjb2RlLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwogICAgICAgICAgICAgLy8gcmV0dXJuIHN0YXR1cyBvbmx5IGZvciBub24gdm9pZCBtZXRob2RzCkBAIC05MzIsMTEgKzEzOTcsMjEgQEAKICAgICAgICAgY2FzZSBTRVRfU1RSRUFNX1ZPTFVNRToKICAgICAgICAgY2FzZSBSRUdJU1RFUl9QT0xJQ1lfTUlYRVM6CiAgICAgICAgIGNhc2UgU0VUX01BU1RFUl9NT05POgotICAgICAgICBjYXNlIFNUQVJUX0FVRElPX1NPVVJDRToKLSAgICAgICAgY2FzZSBTVE9QX0FVRElPX1NPVVJDRToKICAgICAgICAgY2FzZSBHRVRfU1VSUk9VTkRfRk9STUFUUzoKLSAgICAgICAgY2FzZSBTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQ6IHsKLSAgICAgICAgICAgIGlmIChtdWx0aXVzZXJfZ2V0X2FwcF9pZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpID49IEFJRF9BUFBfU1RBUlQpIHsKKyAgICAgICAgY2FzZSBTRVRfU1VSUk9VTkRfRk9STUFUX0VOQUJMRUQ6CisgICAgICAgIGNhc2UgU0VUX0FTU0lTVEFOVF9VSUQ6CisgICAgICAgIGNhc2UgU0VUX0ExMVlfU0VSVklDRVNfVUlEUzoKKyAgICAgICAgY2FzZSBTRVRfVUlEX0RFVklDRV9BRkZJTklUWToKKyAgICAgICAgY2FzZSBSRU1PVkVfVUlEX0RFVklDRV9BRkZJTklUWToKKyAgICAgICAgY2FzZSBHRVRfT0ZGTE9BRF9GT1JNQVRTX0EyRFA6CisgICAgICAgIGNhc2UgTElTVF9BVURJT19WT0xVTUVfR1JPVVBTOgorICAgICAgICBjYXNlIEdFVF9WT0xVTUVfR1JPVVBfRk9SX0FUVFJJQlVURVM6CisgICAgICAgIGNhc2UgU0VUX1JUVF9FTkFCTEVEOgorICAgICAgICBjYXNlIFNFVF9QUkVGRVJSRURfREVWSUNFX0ZPUl9QUk9EVUNUX1NUUkFURUdZOgorICAgICAgICBjYXNlIFJFTU9WRV9QUkVGRVJSRURfREVWSUNFX0ZPUl9QUk9EVUNUX1NUUkFURUdZOgorICAgICAgICBjYXNlIEdFVF9QUkVGRVJSRURfREVWSUNFX0ZPUl9QUk9EVUNUX1NUUkFURUdZOgorICAgICAgICBjYXNlIEFVRElPX01PRFVMRVNfVVBEQVRFRDogeworICAgICAgICAgICAgaWYgKCFpc1NlcnZpY2VVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICAgICAgICAgIEFMT0dXKCIlczogdHJhbnNhY3Rpb24gJWQgcmVjZWl2ZWQgZnJvbSBQSUQgJWQgdW5hdXRob3JpemVkIFVJRCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNvZGUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpOwpAQCAtOTQ4LDkgKzE0MjMsOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgY2hhciB0aW1lQ2hlY2tTdHJpbmdbNjRdOwotICAgIHNucHJpbnRmKHRpbWVDaGVja1N0cmluZywgc2l6ZW9mKHRpbWVDaGVja1N0cmluZyksICJJQXVkaW9Qb2xpY3lTZXJ2aWNlOiAlZCIsIGNvZGUpOwotICAgIFRpbWVDaGVjayBjaGVjayh0aW1lQ2hlY2tTdHJpbmcpOworICAgIHN0ZDo6c3RyaW5nIHRhZygiSUF1ZGlvUG9saWN5U2VydmljZSBjb21tYW5kICIgKyBzdGQ6OnRvX3N0cmluZyhjb2RlKSk7CisgICAgVGltZUNoZWNrIGNoZWNrKHRhZy5jX3N0cigpKTsKIAogICAgIHN3aXRjaCAoY29kZSkgewogICAgICAgICBjYXNlIFNFVF9ERVZJQ0VfQ09OTkVDVElPTl9TVEFURTogewpAQCAtOTYxLDYgKzE0MzUsNyBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzID0gZGF0YS5yZWFkQ1N0cmluZygpOwogICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBjb2RlY0Zvcm1hdCA9IHN0YXRpY19jYXN0IDxhdWRpb19mb3JtYXRfdD4oZGF0YS5yZWFkSW50MzIoKSk7CiAgICAgICAgICAgICBpZiAoZGV2aWNlX2FkZHJlc3MgPT0gbnVsbHB0ciB8fCBkZXZpY2VfbmFtZSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIkJhZCBCaW5kZXIgdHJhbnNhY3Rpb246IFNFVF9ERVZJQ0VfQ09OTkVDVElPTl9TVEFURSBmb3IgZGV2aWNlICV1IiwgZGV2aWNlKTsKICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdDxpbnQzMl90PiAoQkFEX1ZBTFVFKSk7CkBAIC05NjgsNyArMTQ0Myw4IEBACiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjRm9ybWF0KSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtOTk0LDEzICsxNDcwLDE2IEBACiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19kZXZpY2VzX3Q+KGRhdGEucmVhZEludDMyKCkpOwogICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MgPSBkYXRhLnJlYWRDU3RyaW5nKCk7CiAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSA9IGRhdGEucmVhZENTdHJpbmcoKTsKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGNvZGVjRm9ybWF0ID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3QgPGF1ZGlvX2Zvcm1hdF90PihkYXRhLnJlYWRJbnQzMigpKTsKICAgICAgICAgICAgIGlmIChkZXZpY2VfYWRkcmVzcyA9PSBudWxscHRyIHx8IGRldmljZV9uYW1lID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiQmFkIEJpbmRlciB0cmFuc2FjdGlvbjogSEFORExFX0RFVklDRV9DT05GSUdfQ0hBTkdFIGZvciBkZXZpY2UgJXUiLCBkZXZpY2UpOwogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0PGludDMyX3Q+IChCQURfVkFMVUUpKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+IChoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjRm9ybWF0KSkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwpAQCAtMTA0MSwxMiArMTUyMCwxMiBAQAogCiAgICAgICAgIGNhc2UgR0VUX09VVFBVVF9GT1JfQVRUUjogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0ge307Ci0gICAgICAgICAgICBib29sIGhhc0F0dHJpYnV0ZXMgPSBkYXRhLnJlYWRJbnQzMigpICE9IDA7Ci0gICAgICAgICAgICBpZiAoaGFzQXR0cmlidXRlcykgewotICAgICAgICAgICAgICAgIGRhdGEucmVhZCgmYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICAgICAgICAgIHNhbmV0aXplQXVkaW9BdHRyaWJ1dGVzKCZhdHRyKTsKKyAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBzYW5ldGl6ZUF1ZGlvQXR0cmlidXRlcygmYXR0cik7CiAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IChhdWRpb19zZXNzaW9uX3QpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CiAgICAgICAgICAgICBib29sIGhhc1N0cmVhbSA9IGRhdGEucmVhZEludDMyKCkgIT0gMDsKQEAgLTEwNjMsNDggKzE1NDIsNDMgQEAKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSAwOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0T3V0cHV0Rm9yQXR0cihoYXNBdHRyaWJ1dGVzID8gJmF0dHIgOiBOVUxMLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IHNlY29uZGFyeU91dHB1dHM7CisgICAgICAgICAgICBzdGF0dXMgPSBnZXRPdXRwdXRGb3JBdHRyKCZhdHRyLAogICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LCBzZXNzaW9uLCAmc3RyZWFtLCBwaWQsIHVpZCwKICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MsICZzZWxlY3RlZERldmljZUlkLCAmcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgZmxhZ3MsICZzZWxlY3RlZERldmljZUlkLCAmcG9ydElkLCAmc2Vjb25kYXJ5T3V0cHV0cyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgc3RhdHVzID0gcmVwbHktPndyaXRlKCZhdHRyLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKG91dHB1dCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdHJlYW0pOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2VsZWN0ZWREZXZpY2VJZCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihwb3J0SWQpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2Vjb25kYXJ5T3V0cHV0cy5zaXplKCkpOworICAgICAgICAgICAgcmV0dXJuIHJlcGx5LT53cml0ZShzZWNvbmRhcnlPdXRwdXRzLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5T3V0cHV0cy5zaXplKCkgKiBzaXplb2YoYXVkaW9faW9faGFuZGxlX3QpKTsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIFNUQVJUX09VVFBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19zdHJlYW1fdHlwZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGFydE91dHB1dChvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbikpKTsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvcnRfaGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGFydE91dHB1dChwb3J0SWQpKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBTVE9QX09VVFBVVDogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHN0YXRpY19jYXN0IDxhdWRpb19pb19oYW5kbGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0IDxhdWRpb19zdHJlYW1fdHlwZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdG9wT3V0cHV0KG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbikpKTsKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gc3RhdGljX2Nhc3QgPGF1ZGlvX3BvcnRfaGFuZGxlX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdG9wT3V0cHV0KHBvcnRJZCkpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBjYXNlIFJFTEVBU0VfT1VUUFVUOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gc3RhdGljX2Nhc3QgPGF1ZGlvX2lvX2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmVsZWFzZU91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IHN0YXRpY19jYXN0IDxhdWRpb19wb3J0X2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKKyAgICAgICAgICAgIHJlbGVhc2VPdXRwdXQocG9ydElkKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIApAQCAtMTExNCw2ICsxNTg4LDcgQEAKICAgICAgICAgICAgIGRhdGEucmVhZCgmYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwogICAgICAgICAgICAgc2FuZXRpemVBdWRpb0F0dHJpYnV0ZXMoJmF0dHIpOwogICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSAoYXVkaW9faW9faGFuZGxlX3QpZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IHJpaWQgPSAoYXVkaW9fdW5pcXVlX2lkX3QpZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uID0gKGF1ZGlvX3Nlc3Npb25fdClkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcGlkX3QgcGlkID0gKHBpZF90KWRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICB1aWRfdCB1aWQgPSAodWlkX3QpZGF0YS5yZWFkSW50MzIoKTsKQEAgLTExMjQsNyArMTU5OSw3IEBACiAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIGRhdGEucmVhZEludDMyKCk7CiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gKGF1ZGlvX3BvcnRfaGFuZGxlX3QpZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldElucHV0Rm9yQXR0cigmYXR0ciwgJmlucHV0LCBzZXNzaW9uLCBwaWQsIHVpZCwKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldElucHV0Rm9yQXR0cigmYXR0ciwgJmlucHV0LCByaWlkLCBzZXNzaW9uLCBwaWQsIHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcFBhY2thZ2VOYW1lLCAmY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzLCAmc2VsZWN0ZWREZXZpY2VJZCwgJnBvcnRJZCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwpAQCAtMTEzOSwxMCArMTYxNCw4IEBACiAgICAgICAgIGNhc2UgU1RBUlRfSU5QVVQ6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IHN0YXRpY19jYXN0IDxhdWRpb19wb3J0X2hhbmRsZV90PihkYXRhLnJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQgPSBkYXRhLnJlYWRJbnQzMigpID09IDE7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGFydElucHV0KHBvcnRJZCwgJnNpbGVuY2VkKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0SW5wdXQocG9ydElkKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhdHVzKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzaWxlbmNlZCA/IDEgOiAwKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIApAQCAtMTE5OCw3ICsxNjcxLDc0IEBACiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPQogICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdCA8YXVkaW9fc3RyZWFtX3R5cGVfdD4oZGF0YS5yZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihnZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVVpbnQzMihnZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIFNFVF9WT0xVTUVfQVRUUklCVVRFUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzID0ge307CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJmF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50IGluZGV4ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBzdGF0aWNfY2FzdCA8YXVkaW9fZGV2aWNlc190PihkYXRhLnJlYWRJbnQzMigpKTsKKworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBkZXZpY2UpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKKyAgICAgICAgY2FzZSBHRVRfVk9MVU1FX0FUVFJJQlVURVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHt9OworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkKCZhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBzdGF0aWNfY2FzdCA8YXVkaW9fZGV2aWNlc190PihkYXRhLnJlYWRJbnQzMigpKTsKKworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIHN0YXR1cyA9IGdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBpbmRleCwgZGV2aWNlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDx1aW50MzJfdD4oc3RhdHVzKSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaW5kZXgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgR0VUX01JTl9WT0xVTUVfRk9SX0FUVFJJQlVURVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHt9OworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkKCZhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgICAgIHN0YXR1cyA9IGdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBpbmRleCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8dWludDMyX3Q+KHN0YXR1cykpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGluZGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfSBicmVhazsKKworICAgICAgICBjYXNlIEdFVF9NQVhfVk9MVU1FX0ZPUl9BVFRSSUJVVEVTOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7fTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgICAgICBzdGF0dXMgPSBnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPHVpbnQzMl90PihzdGF0dXMpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihpbmRleCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKQEAgLTEyNTYsNiArMTc5NiwzMSBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCisgICAgICAgIGNhc2UgTU9WRV9FRkZFQ1RTX1RPX0lPOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiBpZHM7CisgICAgICAgICAgICBpbnQzMl90IHNpemU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWRJbnQzMigmc2l6ZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaXplID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgICAgICAgICAgICAgIGludCBpZDsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAgZGF0YS5yZWFkSW50MzIoJmlkKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlkcy5wdXNoX2JhY2soaWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4obW92ZUVmZmVjdHNUb0lvKGlkcywgaW8pKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKICAgICAgICAgY2FzZSBJU19TVFJFQU1fQUNUSVZFOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSAoYXVkaW9fc3RyZWFtX3R5cGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKQEAgLTEzMTMsNiArMTg3OCwxOCBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBJU19ESVJFQ1RfT1VUUFVUX1NVUFBPUlRFRDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnID0ge307CisgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHt9OworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkKCZjb25maWcsIHNpemVvZihhdWRpb19jb25maWdfYmFzZV90KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkKCZhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uZmlnLCBhdHRyaWJ1dGVzKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKwogICAgICAgICBjYXNlIExJU1RfQVVESU9fUE9SVFM6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBhdWRpb19wb3J0X3JvbGVfdCByb2xlID0gKGF1ZGlvX3BvcnRfcm9sZV90KWRhdGEucmVhZEludDMyKCk7CkBAIC0xNDM4LDYgKzIwMTUsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIAorICAgICAgICBjYXNlIFNFVF9BVURJT19WT0xVTUVfR1JPVVBfQ0FMTEJBQ0tfRU5BQkxFRDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGRhdGEucmVhZEludDMyKCkgPT0gMSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKICAgICAgICAgY2FzZSBBQ1FVSVJFX1NPVU5EVFJJR0dFUl9TRVNTSU9OOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgc3A8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4gY2xpZW50ID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvUG9saWN5U2VydmljZUNsaWVudD4oCkBAIC0xNDk4LDE3ICsyMDgxLDE3IEBACiAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHt9OwogICAgICAgICAgICAgZGF0YS5yZWFkKCZhdHRyaWJ1dGVzLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CiAgICAgICAgICAgICBzYW5ldGl6ZUF1ZGlvQXR0cmlidXRlcygmYXR0cmlidXRlcyk7Ci0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0YXJ0QXVkaW9Tb3VyY2UoJnNvdXJjZSwgJmF0dHJpYnV0ZXMsICZoYW5kbGUpOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc3RhcnRBdWRpb1NvdXJjZSgmc291cmNlLCAmYXR0cmlidXRlcywgJnBvcnRJZCk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaGFuZGxlKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHBvcnRJZCk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgY2FzZSBTVE9QX0FVRElPX1NPVVJDRTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IChhdWRpb19wYXRjaF9oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BBdWRpb1NvdXJjZShoYW5kbGUpOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSAoYXVkaW9fcG9ydF9oYW5kbGVfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BBdWRpb1NvdXJjZShwb3J0SWQpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKQEAgLTE1ODcsNiArMjE3MCwzMDkgQEAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIGNhc2UgR0VUX09GRkxPQURfRk9STUFUU19BMkRQOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+IGVuY29kaW5nRm9ybWF0czsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEh3T2ZmbG9hZEVuY29kaW5nRm9ybWF0c1N1cHBvcnRlZEZvckEyRFAoJmVuY29kaW5nRm9ybWF0cyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZVVpbnQzMihzdGF0aWNfY2FzdDx1aW50MzJfdD4oZW5jb2RpbmdGb3JtYXRzLnNpemUoKSkpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbmNvZGluZ0Zvcm1hdHMuc2l6ZSgpOyBpKyspCisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4oZW5jb2RpbmdGb3JtYXRzW2ldKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworCisgICAgICAgIGNhc2UgQUREX1NUUkVBTV9ERUZBVUxUX0VGRkVDVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdHlwZTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZCgmdHlwZSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nMTYgb3BQYWNrYWdlTmFtZTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZFN0cmluZzE2KCZvcFBhY2thZ2VOYW1lKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWZmZWN0X3V1aWRfdCB1dWlkOworICAgICAgICAgICAgc3RhdHVzID0gZGF0YS5yZWFkKCZ1dWlkLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UgPSAoYXVkaW9fdXNhZ2VfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGlkID0gMDsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCZ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpZCkpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGlkKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgUkVNT1ZFX1NUUkVBTV9ERUZBVUxUX0VGRkVDVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IGlkID0gc3RhdGljX2Nhc3Q8YXVkaW9fdW5pcXVlX2lkX3Q+KGRhdGEucmVhZEludDMyKCkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdGljX2Nhc3QgPGludDMyX3Q+KHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoaWQpKSk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEFERF9TT1VSQ0VfREVGQVVMVF9FRkZFQ1Q6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBlZmZlY3RfdXVpZF90IHR5cGU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWQoJnR5cGUsIHNpemVvZihlZmZlY3RfdXVpZF90KSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZzE2IG9wUGFja2FnZU5hbWU7CisgICAgICAgICAgICBzdGF0dXMgPSBkYXRhLnJlYWRTdHJpbmcxNigmb3BQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVmZmVjdF91dWlkX3QgdXVpZDsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRhdGEucmVhZCgmdXVpZCwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCBpZCA9IDA7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4oYWRkU291cmNlRGVmYXVsdEVmZmVjdCgmdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlkKSkpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaWQpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBSRU1PVkVfU09VUkNFX0RFRkFVTFRfRUZGRUNUOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgaWQgPSBzdGF0aWNfY2FzdDxhdWRpb191bmlxdWVfaWRfdD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0aWNfY2FzdCA8aW50MzJfdD4ocmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChpZCkpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VUX0FTU0lTVEFOVF9VSUQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBpbnQzMl90IHVpZDsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRhdGEucmVhZEludDMyKCZ1aWQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGF0dXMgPSBzZXRBc3Npc3RhbnRVaWQodWlkKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VUX0ExMVlfU0VSVklDRVNfVUlEUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpZF90PiB1aWRzOworICAgICAgICAgICAgaW50MzJfdCBzaXplOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkSW50MzIoJnNpemUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2l6ZSA+IE1BWF9JVEVNU19QRVJfTElTVCkgeworICAgICAgICAgICAgICAgIHNpemUgPSBNQVhfSVRFTVNfUEVSX0xJU1Q7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHVpZDsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSAgZGF0YS5yZWFkSW50MzIoJnVpZCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB1aWRzLnB1c2hfYmFjayh1aWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gc2V0QTExeVNlcnZpY2VzVWlkcyh1aWRzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXRpY19jYXN0IDxpbnQzMl90PihzdGF0dXMpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgSVNfSEFQVElDX1BMQVlCQUNLX1NVUFBPUlRFRDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIGJvb2wgaXNTdXBwb3J0ZWQgPSBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVCb29sKGlzU3VwcG9ydGVkKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VUX1VJRF9ERVZJQ0VfQUZGSU5JVFk6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBjb25zdCB1aWRfdCB1aWQgPSAodWlkX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4gZGV2aWNlczsKKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gKHNpemVfdClkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyIGRldmljZTsKKyAgICAgICAgICAgICAgICBpZiAoZGV2aWNlLnJlYWRGcm9tUGFyY2VsKChQYXJjZWwqKSZkYXRhKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZpY2UpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldFVpZERldmljZUFmZmluaXRpZXModWlkLCBkZXZpY2VzKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIFJFTU9WRV9VSURfREVWSUNFX0FGRklOSVRZOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgY29uc3QgdWlkX3QgdWlkID0gKHVpZF90KSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgTElTVF9BVURJT19QUk9EVUNUX1NUUkFURUdJRVM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciBzdHJhdGVnaWVzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoc3RyYXRlZ2llcyk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNpemVfdCBzaXplID0gc3RyYXRlZ2llcy5zaXplKCk7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZVBvc2l0aW9uID0gcmVwbHktPmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2l6ZSk7CisgICAgICAgICAgICBzaXplX3QgZmluYWxTaXplID0gc2l6ZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gcmVwbHktPmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChzdHJhdGVnaWVzW2ldLndyaXRlVG9QYXJjZWwocmVwbHkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIHJlcGx5LT5zZXREYXRhUG9zaXRpb24ocG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBmaW5hbFNpemUtLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2l6ZSAhPSBmaW5hbFNpemUpIHsKKyAgICAgICAgICAgICAgICBzaXplX3QgcG9zaXRpb24gPSByZXBseS0+ZGF0YVBvc2l0aW9uKCk7CisgICAgICAgICAgICAgICAgcmVwbHktPnNldERhdGFQb3NpdGlvbihzaXplUG9zaXRpb24pOworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGZpbmFsU2l6ZSk7CisgICAgICAgICAgICAgICAgcmVwbHktPnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEdFVF9TVFJBVEVHWV9GT1JfQVRUUklCVVRFUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGVzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXR0cmlidXRlcy5yZWFkRnJvbVBhcmNlbCgmZGF0YSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoYXR0cmlidXRlcywgc3RyYXRlZ3kpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVVaW50MzIoc3RhdGljX2Nhc3Q8aW50PihzdHJhdGVneSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBMSVNUX0FVRElPX1ZPTFVNRV9HUk9VUFM6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yIGdyb3VwczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxpc3RBdWRpb1ZvbHVtZUdyb3Vwcyhncm91cHMpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGdyb3Vwcy5zaXplKCk7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZVBvc2l0aW9uID0gcmVwbHktPmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2l6ZSk7CisgICAgICAgICAgICBzaXplX3QgZmluYWxTaXplID0gc2l6ZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICAgICAgc2l6ZV90IHBvc2l0aW9uID0gcmVwbHktPmRhdGFQb3NpdGlvbigpOworICAgICAgICAgICAgICAgIGlmIChncm91cHNbaV0ud3JpdGVUb1BhcmNlbChyZXBseSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVwbHktPnNldERhdGFQb3NpdGlvbihwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgICAgIGZpbmFsU2l6ZS0tOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChzaXplICE9IGZpbmFsU2l6ZSkgeworICAgICAgICAgICAgICAgIHNpemVfdCBwb3NpdGlvbiA9IHJlcGx5LT5kYXRhUG9zaXRpb24oKTsKKyAgICAgICAgICAgICAgICByZXBseS0+c2V0RGF0YVBvc2l0aW9uKHNpemVQb3NpdGlvbik7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZmluYWxTaXplKTsKKyAgICAgICAgICAgICAgICByZXBseS0+c2V0RGF0YVBvc2l0aW9uKHBvc2l0aW9uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgR0VUX1ZPTFVNRV9HUk9VUF9GT1JfQVRUUklCVVRFUzogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGVzOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXR0cmlidXRlcy5yZWFkRnJvbVBhcmNlbCgmZGF0YSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHZvbHVtZV9ncm91cF90IGdyb3VwOworICAgICAgICAgICAgc3RhdHVzID0gZ2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIGdyb3VwKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwbHktPndyaXRlVWludDMyKHN0YXRpY19jYXN0PGludD4oZ3JvdXApKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VUX0FMTE9XRURfQ0FQVFVSRV9QT0xJQ1k6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICB1aWRfdCB1aWQgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgYXVkaW9fZmxhZ3NfbWFza190IGZsYWdzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldEFsbG93ZWRDYXB0dXJlUG9saWN5KHVpZCwgZmxhZ3MpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VUX1JUVF9FTkFCTEVEOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSUF1ZGlvUG9saWN5U2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYm9vbCBlbmFibGVkID0gc3RhdGljX2Nhc3Q8Ym9vbD4oZGF0YS5yZWFkSW50MzIoKSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRSdHRFbmFibGVkKGVuYWJsZWQpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgU0VUX1BSRUZFUlJFRF9ERVZJQ0VfRk9SX1BST0RVQ1RfU1RSQVRFR1k6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSAocHJvZHVjdF9zdHJhdGVneV90KSBkYXRhLnJlYWRVaW50MzIoKTsKKyAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgZGV2aWNlOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlLnJlYWRGcm9tUGFyY2VsKChQYXJjZWwqKSZkYXRhKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3RhdHVzID0gc2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGRldmljZSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBSRU1PVkVfUFJFRkVSUkVEX0RFVklDRV9GT1JfUFJPRFVDVF9TVFJBVEVHWTogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSA9IChwcm9kdWN0X3N0cmF0ZWd5X3QpIGRhdGEucmVhZFVpbnQzMigpOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3kpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIGNhc2UgR0VUX1BSRUZFUlJFRF9ERVZJQ0VfRk9SX1BST0RVQ1RfU1RSQVRFR1k6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSAocHJvZHVjdF9zdHJhdGVneV90KSBkYXRhLnJlYWRVaW50MzIoKTsKKyAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgZGV2aWNlOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGRldmljZSk7CisgICAgICAgICAgICBzdGF0dXNfdCBtYXJzaGFsbF9zdGF0dXMgPSBkZXZpY2Uud3JpdGVUb1BhcmNlbChyZXBseSk7CisgICAgICAgICAgICBpZiAobWFyc2hhbGxfc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1hcnNoYWxsX3N0YXR1czsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIEFVRElPX01PRFVMRVNfVVBEQVRFRDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIG9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0gYnJlYWs7CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcAppbmRleCBhZDdmMWRlLi4wZjk1ODBjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LmNwcApAQCAtMzEsNyArMzEsOCBAQAogICAgIFBPUlRfTElTVF9VUERBVEUgPSBJQmluZGVyOjpGSVJTVF9DQUxMX1RSQU5TQUNUSU9OLAogICAgIFBBVENIX0xJU1RfVVBEQVRFLAogICAgIE1JWF9TVEFURV9VUERBVEUsCi0gICAgUkVDT1JESU5HX0NPTkZJR1VSQVRJT05fVVBEQVRFCisgICAgUkVDT1JESU5HX0NPTkZJR1VSQVRJT05fVVBEQVRFLAorICAgIFZPTFVNRV9HUk9VUF9DSEFOR0VELAogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNDksMTUgKzUwLDQyIEBACiB9CiAKIGlubGluZSB2b2lkIHJlYWRSZWNvcmRDbGllbnRJbmZvRnJvbVBhcmNlbChjb25zdCBQYXJjZWwmIGRhdGEsIHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvKSB7CisgICAgY2xpZW50SW5mby0+cmlpZCA9IChhdWRpb191bmlxdWVfaWRfdCkgZGF0YS5yZWFkSW50MzIoKTsKICAgICBjbGllbnRJbmZvLT51aWQgPSAodWlkX3QpIGRhdGEucmVhZFVpbnQzMigpOwogICAgIGNsaWVudEluZm8tPnNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KSBkYXRhLnJlYWRJbnQzMigpOwogICAgIGNsaWVudEluZm8tPnNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgZGF0YS5yZWFkSW50MzIoKTsKKyAgICBkYXRhLnJlYWQoJmNsaWVudEluZm8tPnBvcnRfaWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7CisgICAgY2xpZW50SW5mby0+c2lsZW5jZWQgPSBkYXRhLnJlYWRCb29sKCk7CiB9CiAKLWlubGluZSB2b2lkIHdyaXRlUmVjb3JkQ2xpZW50SW5mb0Zyb21QYXJjZWwoUGFyY2VsJiBkYXRhLCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbykgeworaW5saW5lIHZvaWQgd3JpdGVSZWNvcmRDbGllbnRJbmZvVG9QYXJjZWwoUGFyY2VsJiBkYXRhLCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbykgeworICAgIGRhdGEud3JpdGVJbnQzMigoaW50MzJfdCkgY2xpZW50SW5mby0+cmlpZCk7CiAgICAgZGF0YS53cml0ZVVpbnQzMigodWludDMyX3QpIGNsaWVudEluZm8tPnVpZCk7CiAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBjbGllbnRJbmZvLT5zZXNzaW9uKTsKICAgICBkYXRhLndyaXRlSW50MzIoKGludDMyX3QpIGNsaWVudEluZm8tPnNvdXJjZSk7CisgICAgZGF0YS53cml0ZSgmY2xpZW50SW5mby0+cG9ydF9pZCwgc2l6ZW9mKGF1ZGlvX3BvcnRfaGFuZGxlX3QpKTsKKyAgICBkYXRhLndyaXRlQm9vbChjbGllbnRJbmZvLT5zaWxlbmNlZCk7Cit9CisKK2lubGluZSB2b2lkIHJlYWRFZmZlY3RWZWN0b3JGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCYgZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+ICplZmZlY3RzKSB7CisgICAgaW50MzJfdCBudW1FZmZlY3RzID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBudW1FZmZlY3RzOyBpKyspIHsKKyAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBlZmZlY3Q7CisgICAgICAgIGlmIChkYXRhLnJlYWQoJmVmZmVjdCwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKCplZmZlY3RzKS5wdXNoX2JhY2soZWZmZWN0KTsKKyAgICB9Cit9CisKK2lubGluZSB2b2lkIHdyaXRlRWZmZWN0VmVjdG9yVG9QYXJjZWwoUGFyY2VsJiBkYXRhLCBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzKSB7CisgICAgZGF0YS53cml0ZVVpbnQzMigodWludDMyX3QpIGVmZmVjdHMuc2l6ZSgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGVmZmVjdCA6IGVmZmVjdHMpIHsKKyAgICAgICAgaWYgKGRhdGEud3JpdGUoJmVmZmVjdCwgc2l6ZW9mKGVmZmVjdF9kZXNjcmlwdG9yX3QpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTgzLDYgKzExMSwxNSBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUEFUQ0hfTElTVF9VUERBVEUsIGRhdGEsICZyZXBseSwgSUJpbmRlcjo6RkxBR19PTkVXQVkpOwogICAgIH0KIAorICAgIHZvaWQgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVVpbnQzMihncm91cCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihmbGFncyk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChWT0xVTUVfR1JPVVBfQ0hBTkdFRCwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CisgICAgfQorCiAgICAgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKQogICAgIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwpAQCAtOTIsMTYgKzEyOSwyNCBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoTUlYX1NUQVRFX1VQREFURSwgZGF0YSwgJnJlcGx5LCBJQmluZGVyOjpGTEFHX09ORVdBWSk7CiAgICAgfQogCi0gICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpIHsKKyAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQ6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihldmVudCk7Ci0gICAgICAgIHdyaXRlUmVjb3JkQ2xpZW50SW5mb0Zyb21QYXJjZWwoZGF0YSwgY2xpZW50SW5mbyk7CisgICAgICAgIHdyaXRlUmVjb3JkQ2xpZW50SW5mb1RvUGFyY2VsKGRhdGEsIGNsaWVudEluZm8pOwogICAgICAgICB3cml0ZUF1ZGlvQ29uZmlnQmFzZVRvUGFyY2VsKGRhdGEsIGNsaWVudENvbmZpZyk7CisgICAgICAgIHdyaXRlRWZmZWN0VmVjdG9yVG9QYXJjZWwoZGF0YSwgY2xpZW50RWZmZWN0cyk7CiAgICAgICAgIHdyaXRlQXVkaW9Db25maWdCYXNlVG9QYXJjZWwoZGF0YSwgZGV2aWNlQ29uZmlnKTsKKyAgICAgICAgd3JpdGVFZmZlY3RWZWN0b3JUb1BhcmNlbChkYXRhLCBlZmZlY3RzKTsKICAgICAgICAgZGF0YS53cml0ZUludDMyKHBhdGNoSGFuZGxlKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKChpbnQzMl90KSBzb3VyY2UpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoUkVDT1JESU5HX0NPTkZJR1VSQVRJT05fVVBEQVRFLCBkYXRhLCAmcmVwbHksIElCaW5kZXI6OkZMQUdfT05FV0FZKTsKICAgICB9CiB9OwpAQCAtMTI0LDYgKzE2OSwxMyBAQAogICAgICAgICAgICAgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOworICAgIGNhc2UgVk9MVU1FX0dST1VQX0NIQU5HRUQ6IHsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50LCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCBncm91cCA9IHN0YXRpY19jYXN0PHZvbHVtZV9ncm91cF90PihkYXRhLnJlYWRVaW50MzIoKSk7CisgICAgICAgICAgICBpbnQgZmxhZ3MgPSBkYXRhLnJlYWRJbnQzMigpOworICAgICAgICAgICAgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZChncm91cCwgZmxhZ3MpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgIGNhc2UgTUlYX1NUQVRFX1VQREFURTogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQsIGRhdGEsIHJlcGx5KTsKICAgICAgICAgICAgIFN0cmluZzggcmVnSWQgPSBkYXRhLnJlYWRTdHJpbmc4KCk7CkBAIC0xMzksMTAgKzE5MSwxNSBAQAogICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBkZXZpY2VDb25maWc7CiAgICAgICAgICAgICByZWFkUmVjb3JkQ2xpZW50SW5mb0Zyb21QYXJjZWwoZGF0YSwgJmNsaWVudEluZm8pOwogICAgICAgICAgICAgcmVhZEF1ZGlvQ29uZmlnQmFzZUZyb21QYXJjZWwoZGF0YSwgJmNsaWVudENvbmZpZyk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzOworICAgICAgICAgICAgcmVhZEVmZmVjdFZlY3RvckZyb21QYXJjZWwoZGF0YSwgJmNsaWVudEVmZmVjdHMpOwogICAgICAgICAgICAgcmVhZEF1ZGlvQ29uZmlnQmFzZUZyb21QYXJjZWwoZGF0YSwgJmRldmljZUNvbmZpZyk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzOworICAgICAgICAgICAgcmVhZEVmZmVjdFZlY3RvckZyb21QYXJjZWwoZGF0YSwgJmVmZmVjdHMpOwogICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpIGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsICZjbGllbnRJbmZvLCAmY2xpZW50Q29uZmlnLCAmZGV2aWNlQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSAoYXVkaW9fc291cmNlX3QpIGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoZXZlbnQsICZjbGllbnRJbmZvLCAmY2xpZW50Q29uZmlnLCBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VDb25maWcsIGVmZmVjdHMsIHBhdGNoSGFuZGxlLCBzb3VyY2UpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9UcmFjay5jcHAgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9JQXVkaW9UcmFjay5jcHAKaW5kZXggYWRmZjA1Ny4uODNhNTY4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvSUF1ZGlvVHJhY2suY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L0lBdWRpb1RyYWNrLmNwcApAQCAtMzksNiArMzksNyBAQAogICAgIFBBVVNFLAogICAgIEFUVEFDSF9BVVhfRUZGRUNULAogICAgIFNFVF9QQVJBTUVURVJTLAorICAgIFNFTEVDVF9QUkVTRU5UQVRJT04sCiAgICAgR0VUX1RJTUVTVEFNUCwKICAgICBTSUdOQUwsCiAgICAgQVBQTFlfVk9MVU1FX1NIQVBFUiwKQEAgLTEyNyw2ICsxMjgsMTkgQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKKyAgICAvKiBTZWxlY3RzIHRoZSBwcmVzZW50YXRpb24gKGlmIGF2YWlsYWJsZSkgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSUF1ZGlvVHJhY2s6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwcmVzZW50YXRpb25JZCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihwcm9ncmFtSWQpOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VMRUNUX1BSRVNFTlRBVElPTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElBdWRpb1RyYWNrOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwpAQCAtMjM5LDYgKzI1MywxMSBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgU0VMRUNUX1BSRVNFTlRBVElPTjogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElBdWRpb1RyYWNrLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZWxlY3RQcmVzZW50YXRpb24oZGF0YS5yZWFkSW50MzIoKSwgZGF0YS5yZWFkSW50MzIoKSkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEdFVF9USU1FU1RBTVA6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJQXVkaW9UcmFjaywgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgQXVkaW9UaW1lc3RhbXAgdGltZXN0YW1wOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1JlY29yZGluZ0FjdGl2aXR5VHJhY2tlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJkNDM2MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1JlY29yZGluZ0FjdGl2aXR5VHJhY2tlci5jcHAKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhdWRpb21hbmFnZXIvQXVkaW9NYW5hZ2VyLmg+CisjaW5jbHVkZSA8YXVkaW9tYW5hZ2VyL0lBdWRpb01hbmFnZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXIvQmluZGVyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL1JlY29yZGluZ0FjdGl2aXR5VHJhY2tlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK1JlY29yZGluZ0FjdGl2aXR5VHJhY2tlcjo6UmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyKCkKKyAgICAgICAgOiBtUklJZChSRUNPUkRfUklJRF9JTlZBTElEKSwgbVRva2VuKG5ldyBCQmluZGVyKCkpCit7CisgICAgLy8gdXNlIGNoZWNrU2VydmljZSgpIHRvIGF2b2lkIGJsb2NraW5nIGlmIGF1ZGlvIHNlcnZpY2UgaXMgbm90IHVwIHlldAorICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5jaGVja1NlcnZpY2UoU3RyaW5nMTYoImF1ZGlvIikpOworICAgIGlmIChiaW5kZXIgIT0gMCkgeworICAgICAgICBtQXVkaW9NYW5hZ2VyID0gaW50ZXJmYWNlX2Nhc3Q8SUF1ZGlvTWFuYWdlcj4oYmluZGVyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyKCk6IGJpbmRpbmcgdG8gYXVkaW8gc2VydmljZSBmYWlsZWQsIHNlcnZpY2UgdXA/Iik7CisgICAgfQorfQorCitSZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXI6On5SZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXIoKQoreworICAgIGlmIChtUklJZCAhPSBSRUNPUkRfUklJRF9JTlZBTElEICYmIG1BdWRpb01hbmFnZXIpIHsKKyAgICAgICAgbUF1ZGlvTWFuYWdlci0+cmVsZWFzZVJlY29yZGVyKG1SSUlkKTsKKyAgICB9Cit9CisKK2F1ZGlvX3VuaXF1ZV9pZF90IFJlY29yZGluZ0FjdGl2aXR5VHJhY2tlcjo6Z2V0UmlpZCgpCit7CisgICAgaWYgKG1SSUlkID09IFJFQ09SRF9SSUlEX0lOVkFMSUQgJiYgbUF1ZGlvTWFuYWdlcikgeworICAgICAgICBtUklJZCA9IG1BdWRpb01hbmFnZXItPnRyYWNrUmVjb3JkZXIobVRva2VuKTsKKyAgICB9CisgICAgcmV0dXJuIG1SSUlkOworfQorCit2b2lkIFJlY29yZGluZ0FjdGl2aXR5VHJhY2tlcjo6cmVjb3JkaW5nU3RhcnRlZCgpCit7CisgICAgaWYgKGdldFJpaWQoKSAhPSBSRUNPUkRfUklJRF9JTlZBTElEICYmIG1BdWRpb01hbmFnZXIpIHsKKyAgICAgICAgbUF1ZGlvTWFuYWdlci0+cmVjb3JkZXJFdmVudChtUklJZCwgUkVDT1JERVJfU1RBVEVfU1RBUlRFRCk7CisgICAgfQorfQorCit2b2lkIFJlY29yZGluZ0FjdGl2aXR5VHJhY2tlcjo6cmVjb3JkaW5nU3RvcHBlZCgpCit7CisgICAgaWYgKGdldFJpaWQoKSAhPSBSRUNPUkRfUklJRF9JTlZBTElEICYmIG1BdWRpb01hbmFnZXIpIHsKKyAgICAgICAgbUF1ZGlvTWFuYWdlci0+cmVjb3JkZXJFdmVudChtUklJZCwgUkVDT1JERVJfU1RBVEVfU1RPUFBFRCk7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9Ub25lR2VuZXJhdG9yLmNwcCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RvbmVHZW5lcmF0b3IuY3BwCmluZGV4IDVjNWRiZDYuLjUzNmIwMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RvbmVHZW5lcmF0b3IuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L1RvbmVHZW5lcmF0b3IuY3BwCkBAIC0yMCw3ICsyMCw2IEBACiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KICNpbmNsdWRlICJtZWRpYS9Ub25lR2VuZXJhdG9yLmgiCiAKIApAQCAtMTI0Miw3ICsxMjQxLDcgQEAKICAgICBpZiAobVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpIHsKICAgICAgICAgc3RyZWFtVHlwZSA9IEFVRElPX1NUUkVBTV9EVE1GOwogICAgIH0KLSAgICBzdHJlYW1fdHlwZV90b19hdWRpb19hdHRyaWJ1dGVzKHN0cmVhbVR5cGUsICZhdHRyKTsKKyAgICBhdHRyID0gQXVkaW9TeXN0ZW06OnN0cmVhbVR5cGVUb0F0dHJpYnV0ZXMoc3RyZWFtVHlwZSk7CiAKICAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IG1Qcm9jZXNzU2l6ZTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcEF1ZGlvVHJhY2stPnNldCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2FpZGwvYW5kcm9pZC9tZWRpYS9JQXVkaW9SZWNvcmQuYWlkbAppbmRleCAwMWUwYTcxLi5lY2Y1OGI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9haWRsL2FuZHJvaWQvbWVkaWEvSUF1ZGlvUmVjb3JkLmFpZGwKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvYWlkbC9hbmRyb2lkL21lZGlhL0lBdWRpb1JlY29yZC5haWRsCkBAIC0zNiw0ICszNiwxMiBAQAogICAvKiBHZXQgYSBsaXN0IG9mIGN1cnJlbnQgYWN0aXZlIG1pY3JvcGhvbmVzLgogICAgKi8KICAgdm9pZCBnZXRBY3RpdmVNaWNyb3Bob25lcyhvdXQgTWljcm9waG9uZUluZm9bXSBhY3RpdmVNaWNyb3Bob25lcyk7CisKKyAgLyogU2V0IHRoZSBtaWNyb3Bob25lIGRpcmVjdGlvbiAoZm9yIHByb2Nlc3NpbmcpLgorICAgKi8KKyAgdm9pZCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGludCAvKmF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QqLyBkaXJlY3Rpb24pOworCisgIC8qIFNldCB0aGUgbWljcm9waG9uZSB6b29tIChmb3IgcHJvY2Vzc2luZykuCisgICAqLworICB2b2lkIHNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhMzVlOWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5oCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db21tb25UeXBlcy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvQXR0cmlidXRlcyA6IHB1YmxpYyBQYXJjZWxhYmxlCit7CitwdWJsaWM6CisgICAgQXVkaW9BdHRyaWJ1dGVzKCkgPSBkZWZhdWx0OworICAgIEF1ZGlvQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMpIDogbUF0dHJpYnV0ZXMoYXR0cmlidXRlcykge30KKyAgICBBdWRpb0F0dHJpYnV0ZXModm9sdW1lX2dyb3VwX3QgZ3JvdXBJZCwKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcykgOgorICAgICAgICAgbUF0dHJpYnV0ZXMoYXR0cmlidXRlcyksIG1TdHJlYW1UeXBlKHN0cmVhbSksIG1Hcm91cElkKGdyb3VwSWQpIHt9CisKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgZ2V0QXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1BdHRyaWJ1dGVzOyB9CisKKyAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IGdldFN0cmVhbVR5cGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZTsgfQorICAgIHZvbHVtZV9ncm91cF90IGdldEdyb3VwSWQoKSBjb25zdCB7IHJldHVybiBtR3JvdXBJZDsgfQorCitwcml2YXRlOgorICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBtQXR0cmlidXRlcyA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CisgICAgLyoqCisgICAgICogQGJyaWVmIG1TdHJlYW1UeXBlOiBmb3IgbGVnYWN5IHZvbHVtZSBtYW5hZ2VtZW50LCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gY29udmVydCBhbiBhdHRyaWJ1dGUKKyAgICAgKiB0byBhIGdpdmVuIHN0cmVhbSB0eXBlLgorICAgICAqLworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fREVGQVVMVDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBtR3JvdXBJZDogZm9yIGZ1dHVyZSB2b2x1bWUgbWFuYWdlbWVudCwgZGVmaW5lIGdyb3VwcyB3aXRoaW4gYSBzdHJhdGVneSB0aGF0IGZvbGxvd3MKKyAgICAgKiB0aGUgc2FtZSBjdXJ2ZXMgb2Ygdm9sdW1lIChleHRlbnNpb24gb2Ygc3RyZWFtIHR5cGVzIHRvIG1hbmFnZSB2b2x1bWUpCisgICAgICovCisgICAgdm9sdW1lX2dyb3VwX3QgbUdyb3VwSWQgPSBWT0xVTUVfR1JPVVBfTk9ORTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Db21tb25UeXBlcy5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0NvbW1vblR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU0NDZlYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Db21tb25UeXBlcy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSBwcm9kdWN0X3N0cmF0ZWd5X3QgOiB1aW50MzJfdDsKK2NvbnN0IHByb2R1Y3Rfc3RyYXRlZ3lfdCBQUk9EVUNUX1NUUkFURUdZX05PTkUgPSBzdGF0aWNfY2FzdDxwcm9kdWN0X3N0cmF0ZWd5X3Q+KC0xKTsKKwordXNpbmcgQXR0cmlidXRlc1ZlY3RvciA9IHN0ZDo6dmVjdG9yPGF1ZGlvX2F0dHJpYnV0ZXNfdD47Cit1c2luZyBTdHJlYW1UeXBlVmVjdG9yID0gc3RkOjp2ZWN0b3I8YXVkaW9fc3RyZWFtX3R5cGVfdD47CisKK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yPT0oY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZsaHMsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmcmhzKQoreworICAgIHJldHVybiBsaHMudXNhZ2UgPT0gcmhzLnVzYWdlICYmIGxocy5jb250ZW50X3R5cGUgPT0gcmhzLmNvbnRlbnRfdHlwZSAmJgorICAgICAgICAgICAgbGhzLmZsYWdzID09IHJocy5mbGFncyAmJiAoc3RkOjpzdHJjbXAobGhzLnRhZ3MsIHJocy50YWdzKSA9PSAwKTsKK30KK2NvbnN0ZXhwciBib29sIG9wZXJhdG9yIT0oY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZsaHMsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmcmhzKQoreworICAgIHJldHVybiAhKGxocz09cmhzKTsKK30KKworZW51bSB2b2x1bWVfZ3JvdXBfdCA6IHVpbnQzMl90Oworc3RhdGljIGNvbnN0IHZvbHVtZV9ncm91cF90IFZPTFVNRV9HUk9VUF9OT05FID0gc3RhdGljX2Nhc3Q8dm9sdW1lX2dyb3VwX3Q+KC0xKTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvRWZmZWN0LmgKaW5kZXggMzI0YmNiOS4uZjE3ZDczNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0VmZmVjdC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9FZmZlY3QuaApAQCAtOTAsMjcgKzkwLDM0IEBACiAgICAgICovCiAgICAgc3RhdGljIHN0YXR1c190IHF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKTsKIAotCiAgICAgLyoKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIGVmZmVjdCB1dWlkLgorICAgICAqIFJldHVybnMgYSBkZXNjcmlwdG9yIGZvciB0aGUgc3BlY2lmaWVkIGVmZmVjdCB1dWlkIG9yIHR5cGUuCisgICAgICoKKyAgICAgKiBMb29rdXAgYW4gZWZmZWN0IGJ5IHV1aWQsIG9yIGlmIHRoYXQncyB1bnNwZWNpZmllZCAoRUZGRUNUX1VVSURfTlVMTCksCisgICAgICogZG8gc28gYnkgdHlwZSBhbmQgcHJlZmVycmVkIGZsYWdzIGluc3RlYWQuCiAgICAgICoKICAgICAgKiBQYXJhbWV0ZXJzOgogICAgICAqICAgICAgdXVpZDogICAgICAgcG9pbnRlciB0byBlZmZlY3QgdXVpZC4KKyAgICAgKiAgICAgIHR5cGU6ICAgICAgIHBvaW50ZXIgdG8gZWZmZWN0IHR5cGUgdXVpZC4KKyAgICAgKiAgICAgIHByZWZlcnJlZFR5cGVGbGFnczogaWYgbXVsdGlwbGUgZWZmZWN0cyBvZiB0aGUgZ2l2ZW4gdHlwZSBleGlzdCwKKyAgICAgKiAgICAgICAgICAgICAgICAgIG9uZSB3aXRoIGEgbWF0Y2hpbmcgdHlwZSBmbGFnIHdpbGwgYmUgY2hvc2VuIG92ZXIgb25lIHdpdGhvdXQuCisgICAgICogICAgICAgICAgICAgICAgICBVc2UgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLIHRvIGluZGljYXRlIG5vIHByZWZlcmVuY2UuCiAgICAgICogICAgICBkZXNjcmlwdG9yOiBhZGRyZXNzIHdoZXJlIHRoZSBlZmZlY3QgZGVzY3JpcHRvciBzaG91bGQgYmUgcmV0dXJuZWQuCiAgICAgICoKICAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKICAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KICAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQogICAgICAqICAgICAgTk9fSU5JVCAgICAgICAgIGVmZmVjdCBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplCi0gICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCB1dWlkIG9yIGRlc2NyaXB0b3IgcG9pbnRlcnMKKyAgICAgKiAgICAgIEJBRF9WQUxVRSAgICAgICBpbnZhbGlkIHR5cGUgb3IgZGVzY3JpcHRvciBwb2ludGVycwogICAgICAqICAgICAgTkFNRV9OT1RfRk9VTkQgIG5vIGVmZmVjdCB3aXRoIHRoaXMgdXVpZCBmb3VuZAogICAgICAqCiAgICAgICogUmV0dXJuZWQgdmFsdWUKICAgICAgKiAgICpkZXNjcmlwdG9yIHVwZGF0ZWQgd2l0aCBlZmZlY3QgZGVzY3JpcHRvcgogICAgICAqLwogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikgLypjb25zdCovOwotCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKTsKIAogICAgIC8qCiAgICAgICogUmV0dXJucyBhIGxpc3Qgb2YgZGVzY3JpcHRvcnMgY29ycmVzcG9uZGluZyB0byB0aGUgcHJlIHByb2Nlc3NpbmdzIGVuYWJsZWQgYnkgZGVmYXVsdApAQCAtMTQ0LDYgKzE1MSwxMzIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpOwogCiAgICAgLyoKKyAgICAgKiBHZXRzIGEgbmV3IHN5c3RlbS13aWRlIHVuaXF1ZSBlZmZlY3QgaWQuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICAgICAgaWQ6IFRoZSBhZGRyZXNzIHRvIHJldHVybiB0aGUgZ2VuZXJhdGVkIGlkLgorICAgICAqCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogICAgICBOT19FUlJPUiAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNhbGxlciBsYWNrcyByZXF1aXJlZCBwZXJtaXNzaW9ucy4KKyAgICAgKiBSZXR1cm5lZCB2YWx1ZQorICAgICAqICAgKmlkOiAgVGhlIG5ldyB1bmlxdWUgc3lzdGVtLXdpZGUgZWZmZWN0IGlkLgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCBuZXdFZmZlY3RVbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdCogaWQpOworCisgICAgLyoKKyAgICAgKiBTdGF0aWMgbWV0aG9kcyBmb3IgYWRkaW5nL3JlbW92aW5nIHN5c3RlbS13aWRlIGVmZmVjdHMuCisgICAgICovCisKKyAgICAvKgorICAgICAqIEFkZHMgYW4gZWZmZWN0IHRvIHRoZSBsaXN0IG9mIGRlZmF1bHQgb3V0cHV0IGVmZmVjdHMgZm9yIGEgZ2l2ZW4gc291cmNlIHR5cGUuCisgICAgICoKKyAgICAgKiBJZiB0aGUgZWZmZWN0IGlzIG5vIGxvbmdlciBhdmFpbGFibGUgd2hlbiBhIHNvdXJjZSBvZiB0aGUgZ2l2ZW4gdHlwZQorICAgICAqIGlzIGNyZWF0ZWQsIHRoZSBzeXN0ZW0gd2lsbCBjb250aW51ZSB3aXRob3V0IGFkZGluZyBpdC4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogICB0eXBlU3RyOiAgVHlwZSB1dWlkIG9mIGVmZmVjdCB0byBiZSBhIGRlZmF1bHQ6IGNhbiBiZSBudWxsIGlmIHV1aWRTdHIgaXMgc3BlY2lmaWVkLgorICAgICAqICAgICAgICAgICAgIFRoaXMgbWF5IGNvcnJlc3BvbmQgdG8gdGhlIE9wZW5TTCBFUyBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgdGhpcyBlZmZlY3QsCisgICAgICogICAgICAgICAgICAgb3IgY291bGQgYmUgc29tZSB2ZW5kb3ItZGVmaW5lZCB0eXBlLgorICAgICAqICAgb3BQYWNrYWdlTmFtZTogVGhlIHBhY2thZ2UgbmFtZSB1c2VkIGZvciBhcHAgb3AgY2hlY2tzLgorICAgICAqICAgdXVpZFN0cjogIFV1aWQgb2YgZWZmZWN0IHRvIGJlIGEgZGVmYXVsdDogY2FuIGJlIG51bGwgaWYgdHlwZSBpcyBzcGVjaWZpZWQuCisgICAgICogICAgICAgICAgICAgVGhpcyB1dWlkIGNvcnJlc3BvbmRzIHRvIGEgcGFydGljdWxhciBpbXBsZW1lbnRhdGlvbiBvZiBhbiBlZmZlY3QgdHlwZS4KKyAgICAgKiAgICAgICAgICAgICBOb3RlIGlmIGJvdGggdXVpZFN0ciBhbmQgdHlwZVN0ciBhcmUgc3BlY2lmaWVkLCB0eXBlU3RyIGlzIGlnbm9yZWQuCisgICAgICogICBwcmlvcml0eTogUmVxdWVzdGVkIHByaW9yaXR5IGZvciBlZmZlY3QgY29udHJvbDogdGhlIHByaW9yaXR5IGxldmVsIGNvcnJlc3BvbmRzIHRvIHRoZQorICAgICAqICAgICAgICAgICAgIHZhbHVlIG9mIHByaW9yaXR5IHBhcmFtZXRlcjogbmVnYXRpdmUgdmFsdWVzIGluZGljYXRlIGxvd2VyIHByaW9yaXRpZXMsIHBvc2l0aXZlCisgICAgICogICAgICAgICAgICAgdmFsdWVzIGhpZ2hlciBwcmlvcml0aWVzLCAwIGJlaW5nIHRoZSBub3JtYWwgcHJpb3JpdHkuCisgICAgICogICBzb3VyY2U6ICAgVGhlIHNvdXJjZSB0aGlzIGVmZmVjdCBzaG91bGQgYmUgYSBkZWZhdWx0IGZvci4KKyAgICAgKiAgIGlkOiAgICAgICBBZGRyZXNzIHdoZXJlIHRoZSBzeXN0ZW0td2lkZSB1bmlxdWUgaWQgb2YgdGhlIGRlZmF1bHQgZWZmZWN0IHNob3VsZCBiZSByZXR1cm5lZC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgorICAgICAqICAgICAgTk9fRVJST1IgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICAgICAqICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBjYWxsZXIgbGFja3MgcmVxdWlyZWQgcGVybWlzc2lvbnMuCisgICAgICogICAgICBOT19JTklUICAgICAgICAgZWZmZWN0IGxpYnJhcnkgZmFpbGVkIHRvIGluaXRpYWxpemUuCisgICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCBzb3VyY2UsIHR5cGUgdXVpZCBvciBpbXBsZW1lbnRhdGlvbiB1dWlkLgorICAgICAqICAgICAgTkFNRV9OT1RfRk9VTkQgIG5vIGVmZmVjdCB3aXRoIHRoaXMgdXVpZCBvciB0eXBlIGZvdW5kLgorICAgICAqCisgICAgICogUmV0dXJuZWQgdmFsdWUKKyAgICAgKiAgICppZDogIFRoZSBzeXN0ZW0td2lkZSB1bmlxdWUgaWQgb2YgdGhlIGFkZGVkIGRlZmF1bHQgZWZmZWN0LgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGNoYXIqIHR5cGVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXVpZFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOworCisgICAgLyoKKyAgICAgKiBBZGRzIGFuIGVmZmVjdCB0byB0aGUgbGlzdCBvZiBkZWZhdWx0IG91dHB1dCBlZmZlY3RzIGZvciBhIGdpdmVuIHN0cmVhbSB0eXBlLgorICAgICAqCisgICAgICogSWYgdGhlIGVmZmVjdCBpcyBubyBsb25nZXIgYXZhaWxhYmxlIHdoZW4gYSBzdHJlYW0gb2YgdGhlIGdpdmVuIHR5cGUKKyAgICAgKiBpcyBjcmVhdGVkLCB0aGUgc3lzdGVtIHdpbGwgY29udGludWUgd2l0aG91dCBhZGRpbmcgaXQuCisgICAgICoKKyAgICAgKiBQYXJhbWV0ZXJzOgorICAgICAqICAgdHlwZVN0cjogIFR5cGUgdXVpZCBvZiBlZmZlY3QgdG8gYmUgYSBkZWZhdWx0OiBjYW4gYmUgbnVsbCBpZiB1dWlkU3RyIGlzIHNwZWNpZmllZC4KKyAgICAgKiAgICAgICAgICAgICBUaGlzIG1heSBjb3JyZXNwb25kIHRvIHRoZSBPcGVuU0wgRVMgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IHRoaXMgZWZmZWN0LAorICAgICAqICAgICAgICAgICAgIG9yIGNvdWxkIGJlIHNvbWUgdmVuZG9yLWRlZmluZWQgdHlwZS4KKyAgICAgKiAgIG9wUGFja2FnZU5hbWU6IFRoZSBwYWNrYWdlIG5hbWUgdXNlZCBmb3IgYXBwIG9wIGNoZWNrcy4KKyAgICAgKiAgIHV1aWRTdHI6ICBVdWlkIG9mIGVmZmVjdCB0byBiZSBhIGRlZmF1bHQ6IGNhbiBiZSBudWxsIGlmIHR5cGUgaXMgc3BlY2lmaWVkLgorICAgICAqICAgICAgICAgICAgIFRoaXMgdXVpZCBjb3JyZXNwb25kcyB0byBhIHBhcnRpY3VsYXIgaW1wbGVtZW50YXRpb24gb2YgYW4gZWZmZWN0IHR5cGUuCisgICAgICogICAgICAgICAgICAgTm90ZSBpZiBib3RoIHV1aWRTdHIgYW5kIHR5cGVTdHIgYXJlIHNwZWNpZmllZCwgdHlwZVN0ciBpcyBpZ25vcmVkLgorICAgICAqICAgcHJpb3JpdHk6IFJlcXVlc3RlZCBwcmlvcml0eSBmb3IgZWZmZWN0IGNvbnRyb2w6IHRoZSBwcmlvcml0eSBsZXZlbCBjb3JyZXNwb25kcyB0byB0aGUKKyAgICAgKiAgICAgICAgICAgICB2YWx1ZSBvZiBwcmlvcml0eSBwYXJhbWV0ZXI6IG5lZ2F0aXZlIHZhbHVlcyBpbmRpY2F0ZSBsb3dlciBwcmlvcml0aWVzLCBwb3NpdGl2ZQorICAgICAqICAgICAgICAgICAgIHZhbHVlcyBoaWdoZXIgcHJpb3JpdGllcywgMCBiZWluZyB0aGUgbm9ybWFsIHByaW9yaXR5LgorICAgICAqICAgdXNhZ2U6ICAgIFRoZSB1c2FnZSB0aGlzIGVmZmVjdCBzaG91bGQgYmUgYSBkZWZhdWx0IGZvci4gVW5yZWNvZ25pemVkIHZhbHVlcyB3aWxsIGJlCisgICAgICogICAgICAgICAgICAgdHJlYXRlZCBhcyBBVURJT19VU0FHRV9VTktOT1dOLgorICAgICAqICAgaWQ6ICAgICAgIEFkZHJlc3Mgd2hlcmUgdGhlIHN5c3RlbS13aWRlIHVuaXF1ZSBpZCBvZiB0aGUgZGVmYXVsdCBlZmZlY3Qgc2hvdWxkIGJlIHJldHVybmVkLgorICAgICAqCisgICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6CisgICAgICogICAgICBOT19FUlJPUiAgICAgICAgc3VjY2Vzc2Z1bCBvcGVyYXRpb24uCisgICAgICogICAgICBQRVJNSVNTSU9OX0RFTklFRCBjb3VsZCBub3QgZ2V0IEF1ZGlvRmxpbmdlciBpbnRlcmZhY2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgIG9yIGNhbGxlciBsYWNrcyByZXF1aXJlZCBwZXJtaXNzaW9ucy4KKyAgICAgKiAgICAgIE5PX0lOSVQgICAgICAgICBlZmZlY3QgbGlicmFyeSBmYWlsZWQgdG8gaW5pdGlhbGl6ZS4KKyAgICAgKiAgICAgIEJBRF9WQUxVRSAgICAgICBpbnZhbGlkIHR5cGUgdXVpZCBvciBpbXBsZW1lbnRhdGlvbiB1dWlkLgorICAgICAqICAgICAgTkFNRV9OT1RfRk9VTkQgIG5vIGVmZmVjdCB3aXRoIHRoaXMgdXVpZCBvciB0eXBlIGZvdW5kLgorICAgICAqCisgICAgICogUmV0dXJuZWQgdmFsdWUKKyAgICAgKiAgICppZDogIFRoZSBzeXN0ZW0td2lkZSB1bmlxdWUgaWQgb2YgdGhlIGFkZGVkIGRlZmF1bHQgZWZmZWN0LgorICAgICAqLworICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGNoYXIqIHR5cGVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdXVpZFN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKTsKKworICAgIC8qCisgICAgICogUmVtb3ZlcyBhbiBlZmZlY3QgZnJvbSB0aGUgbGlzdCBvZiBkZWZhdWx0IG91dHB1dCBlZmZlY3RzIGZvciBhIGdpdmVuIHNvdXJjZSB0eXBlLgorICAgICAqCisgICAgICogUGFyYW1ldGVyczoKKyAgICAgKiAgICAgIGlkOiBUaGUgc3lzdGVtLXdpZGUgdW5pcXVlIGlkIG9mIHRoZSBlZmZlY3QgdGhhdCBzaG91bGQgbm8gbG9uZ2VyIGJlIGEgZGVmYXVsdC4KKyAgICAgKgorICAgICAqIFJldHVybmVkIHN0YXR1cyAoZnJvbSB1dGlscy9FcnJvcnMuaCkgY2FuIGJlOgorICAgICAqICAgICAgTk9fRVJST1IgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorICAgICAqICAgICAgUEVSTUlTU0lPTl9ERU5JRUQgY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIgaW50ZXJmYWNlCisgICAgICogICAgICAgICAgICAgICAgICAgICAgICBvciBjYWxsZXIgbGFja3MgcmVxdWlyZWQgcGVybWlzc2lvbnMuCisgICAgICogICAgICBOT19JTklUICAgICAgICAgZWZmZWN0IGxpYnJhcnkgZmFpbGVkIHRvIGluaXRpYWxpemUuCisgICAgICogICAgICBCQURfVkFMVUUgICAgICAgaW52YWxpZCBpZC4KKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3QgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCk7CisKKyAgICAvKgorICAgICAqIFJlbW92ZXMgYW4gZWZmZWN0IGZyb20gdGhlIGxpc3Qgb2YgZGVmYXVsdCBvdXRwdXQgZWZmZWN0cyBmb3IgYSBnaXZlbiBzdHJlYW0gdHlwZS4KKyAgICAgKgorICAgICAqIFBhcmFtZXRlcnM6CisgICAgICogICAgICBpZDogVGhlIHN5c3RlbS13aWRlIHVuaXF1ZSBpZCBvZiB0aGUgZWZmZWN0IHRoYXQgc2hvdWxkIG5vIGxvbmdlciBiZSBhIGRlZmF1bHQuCisgICAgICoKKyAgICAgKiBSZXR1cm5lZCBzdGF0dXMgKGZyb20gdXRpbHMvRXJyb3JzLmgpIGNhbiBiZToKKyAgICAgKiAgICAgIE5PX0VSUk9SICAgICAgICBzdWNjZXNzZnVsIG9wZXJhdGlvbi4KKyAgICAgKiAgICAgIFBFUk1JU1NJT05fREVOSUVEIGNvdWxkIG5vdCBnZXQgQXVkaW9GbGluZ2VyIGludGVyZmFjZQorICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgb3IgY2FsbGVyIGxhY2tzIHJlcXVpcmVkIHBlcm1pc3Npb25zLgorICAgICAqICAgICAgTk9fSU5JVCAgICAgICAgIGVmZmVjdCBsaWJyYXJ5IGZhaWxlZCB0byBpbml0aWFsaXplLgorICAgICAqICAgICAgQkFEX1ZBTFVFICAgICAgIGludmFsaWQgaWQuCisgICAgICovCisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpOworCisgICAgLyoKICAgICAgKiBFdmVudHMgdXNlZCBieSBjYWxsYmFjayBmdW5jdGlvbiAoZWZmZWN0X2NhbGxiYWNrX3QpLgogICAgICAqLwogICAgIGVudW0gZXZlbnRfdHlwZSB7CkBAIC0yMjksMTcgKzM2MiwyMSBAQAogICAgICAqICAgICAgKEF1ZGlvVHJhY2sgb3IgTWVkaWFQTGF5ZXIpIHdpdGhpbiB0aGUgc2FtZSBhdWRpbyBzZXNzaW9uLgogICAgICAqIGlvOiAgSEFMIGF1ZGlvIG91dHB1dCBvciBpbnB1dCBzdHJlYW0gdG8gd2hpY2ggdGhpcyBlZmZlY3QgbXVzdCBiZSBhdHRhY2hlZC4gTGVhdmUgYXQgMCBmb3IKICAgICAgKiAgICAgIGF1dG9tYXRpYyBvdXRwdXQgc2VsZWN0aW9uIGJ5IEF1ZGlvRmxpbmdlci4KKyAgICAgKiBkZXZpY2U6IEFuIGF1ZGlvIGRldmljZSBkZXNjcmlwdG9yLiBPbmx5IHVzZWQgd2hlbiAic2Vzc2lvbklEIiBpcyBBVURJT19TRVNTSU9OX0RFVklDRS4KKyAgICAgKiAgICAgICAgIFNwZWNpZmllcyB0aGUgYXVkaW8gZGV2aWNlIHR5cGUgYW5kIGFkZHJlc3MgdGhlIGVmZmVjdCBtdXN0IGJlIGF0dGFjaGVkIHRvLgorICAgICAqICAgICAgICAgSWYgInNlc3Npb25JRCIgaXMgQVVESU9fU0VTU0lPTl9ERVZJQ0UgdGhlbiAiaW8iIG11c3QgYmUgQVVESU9fSU9fSEFORExFX05PTkUuCiAgICAgICovCiAKICAgICBBdWRpb0VmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAogICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSA9IDAsCi0gICAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgdm9pZCogdXNlciA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLAotICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBBVURJT19JT19IQU5ETEVfTk9ORQotICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5ID0gMCwKKyAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAorICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIgPSBOVUxMLAorICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsCisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBBVURJT19JT19IQU5ETEVfTk9ORSwKKyAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UgPSB7fQorICAgICAgICAgICAgICAgICk7CiAKICAgICAvKiBDb25zdHJ1Y3Rvci4KICAgICAgKiAgICAgIFNhbWUgYXMgYWJvdmUgYnV0IHdpdGggdHlwZSBhbmQgdXVpZCBzcGVjaWZpZWQgYnkgY2hhcmFjdGVyIHN0cmluZ3MKQEAgLTI1MSw3ICszODgsOCBAQAogICAgICAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBBVURJT19JT19IQU5ETEVfTk9ORQorICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UgPSB7fQogICAgICAgICAgICAgICAgICAgICApOwogCiAgICAgLyogVGVybWluYXRlcyB0aGUgQXVkaW9FZmZlY3QgYW5kIHVucmVnaXN0ZXJzIGl0IGZyb20gQXVkaW9GbGluZ2VyLgpAQCAtMjczLDcgKzQxMSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gQVVESU9fSU9fSEFORExFX05PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSA9IHt9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKIAogICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvRWZmZWN0LiBUaGlzIG11c3QgYmUgY2hlY2tlZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oCmluZGV4IDg1OWYxYTkuLjk4MWQzM2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Jb0Rlc2NyaXB0b3IuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvSW9EZXNjcmlwdG9yLmgKQEAgLTI4LDYgKzI4LDcgQEAKICAgICBBVURJT19JTlBVVF9PUEVORUQsCiAgICAgQVVESU9fSU5QVVRfQ0xPU0VELAogICAgIEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VELAorICAgIEFVRElPX0NMSUVOVF9TVEFSVEVELAogfTsKIAogLy8gYXVkaW8gaW5wdXQvb3V0cHV0IGRlc2NyaXB0b3IgdXNlZCB0byBjYWNoZSBvdXRwdXQgY29uZmlndXJhdGlvbnMgaW4gY2xpZW50IHByb2Nlc3MgdG8gYXZvaWQKQEAgLTM3LDcgKzM4LDcgQEAKICAgICBBdWRpb0lvRGVzY3JpcHRvcigpIDoKICAgICAgICAgbUlvSGFuZGxlKEFVRElPX0lPX0hBTkRMRV9OT05FKSwKICAgICAgICAgbVNhbXBsaW5nUmF0ZSgwKSwgbUZvcm1hdChBVURJT19GT1JNQVRfREVGQVVMVCksIG1DaGFubmVsTWFzayhBVURJT19DSEFOTkVMX05PTkUpLAotICAgICAgICBtRnJhbWVDb3VudCgwKSwgbUZyYW1lQ291bnRIQUwoMCksIG1MYXRlbmN5KDApCisgICAgICAgIG1GcmFtZUNvdW50KDApLCBtRnJhbWVDb3VudEhBTCgwKSwgbUxhdGVuY3koMCksIG1Qb3J0SWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkKICAgICB7CiAgICAgICAgIG1lbXNldCgmbVBhdGNoLCAwLCBzaXplb2Yoc3RydWN0IGF1ZGlvX3BhdGNoKSk7CiAgICAgfQpAQCAtNjYsNiArNjcsNyBAQAogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50OwogICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1GcmFtZUNvdW50SEFMOwogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgIG1MYXRlbmN5OyAgIC8vIG9ubHkgdmFsaWQgZm9yIG91dHB1dAorICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Qb3J0SWQ7ICAgIC8vIHZhbGlkIGZvciBldmVudCBBVURJT19DTElFTlRfU1RBUlRFRAogfTsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvTWl4ZXIuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlci5oCmluZGV4IGNmN2Q5MGYuLjNmN2NkNDggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlci5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlci5oCkBAIC0xOSwzOTAgKzE5LDIxNiBAQAogI2RlZmluZSBBTkRST0lEX0FVRElPX01JWEVSX0gKIAogI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAKLSNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvb3MvSUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9NaXhlckJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9CdWZmZXJQcm92aWRlcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0NvbXBhdC5oPgogI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KIAogLy8gRklYTUUgVGhpcyBpcyBhY3R1YWxseSB1bml0eSBnYWluLCB3aGljaCBtaWdodCBub3QgYmUgbWF4IGluIGZ1dHVyZSwgZXhwcmVzc2VkIGluIFUuMTIKLSNkZWZpbmUgTUFYX0dBSU5fSU5UIEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fSU5UCi0KLS8vIFRoaXMgbXVzdCBtYXRjaCBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9Db25maWd1cmF0aW9uLmgKLSNkZWZpbmUgRkxPQVRfQVVYCisjZGVmaW5lIE1BWF9HQUlOX0lOVCBBdWRpb01peGVyQmFzZTo6VU5JVFlfR0FJTl9JTlQKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIEF1ZGlvTWl4ZXIKKy8vIEF1ZGlvTWl4ZXIgZXh0ZW5kcyBBdWRpb01peGVyQmFzZSBieSBhZGRpbmcgc3VwcG9ydCBmb3IgZG93bi0gYW5kIHVwLW1peGluZworLy8gYW5kIHRpbWUgc3RyZXRjaCB0aGF0IGFyZSBpbXBsZW1lbnRlZCB2aWEgRWZmZWN0cyBIQUwsIGFuZCBhZGRpbmcgc3VwcG9ydAorLy8gZm9yIGhhcHRpYyBjaGFubmVscyB3aGljaCBkZXBlbmRzIG9uIFZpYnJhdG9yIHNlcnZpY2UuIFRoaXMgaXMgdGhlIHZlcnNpb24KKy8vIHRoYXQgaXMgdXNlZCBieSBBdWRpb2ZsaW5nZXIuCisKK2NsYXNzIEF1ZGlvTWl4ZXIgOiBwdWJsaWMgQXVkaW9NaXhlckJhc2UKIHsKIHB1YmxpYzoKLSAgICAvLyBEbyBub3QgY2hhbmdlIHRoZXNlIHVubGVzcyB1bmRlcmx5aW5nIGNvZGUgY2hhbmdlcy4KLSAgICAvLyBUaGlzIG1peGVyIGhhcyBhIGhhcmQtY29kZWQgdXBwZXIgbGltaXQgb2YgOCBjaGFubmVscyBmb3Igb3V0cHV0LgotICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgTUFYX05VTV9DSEFOTkVMUyA9IEZDQ184OwotICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgTUFYX05VTV9WT0xVTUVTID0gRkNDXzI7IC8vIHN0ZXJlbyB2b2x1bWUgb25seQogICAgIC8vIG1heGltdW0gbnVtYmVyIG9mIGNoYW5uZWxzIHN1cHBvcnRlZCBmb3IgdGhlIGNvbnRlbnQKICAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgTUFYX05VTV9DSEFOTkVMU19UT19ET1dOTUlYID0gQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVg7CiAKLSAgICBzdGF0aWMgY29uc3QgdWludDE2X3QgVU5JVFlfR0FJTl9JTlQgPSAweDEwMDA7Ci0gICAgc3RhdGljIGNvbnN0IENPTlNURVhQUiBmbG9hdCBVTklUWV9HQUlOX0ZMT0FUID0gMS4wZjsKLQotICAgIGVudW0geyAvLyBuYW1lcwotICAgICAgICAvLyBzZXRQYXJhbWV0ZXIgdGFyZ2V0cwotICAgICAgICBUUkFDSyAgICAgICAgICAgPSAweDMwMDAsCi0gICAgICAgIFJFU0FNUExFICAgICAgICA9IDB4MzAwMSwKLSAgICAgICAgUkFNUF9WT0xVTUUgICAgID0gMHgzMDAyLCAvLyByYW1wIHRvIG5ldyB2b2x1bWUKLSAgICAgICAgVk9MVU1FICAgICAgICAgID0gMHgzMDAzLCAvLyBkb24ndCByYW1wCi0gICAgICAgIFRJTUVTVFJFVENIICAgICA9IDB4MzAwNCwKLQotICAgICAgICAvLyBzZXQgUGFyYW1ldGVyIG5hbWVzCi0gICAgICAgIC8vIGZvciB0YXJnZXQgVFJBQ0sKLSAgICAgICAgQ0hBTk5FTF9NQVNLICAgID0gMHg0MDAwLAotICAgICAgICBGT1JNQVQgICAgICAgICAgPSAweDQwMDEsCi0gICAgICAgIE1BSU5fQlVGRkVSICAgICA9IDB4NDAwMiwKLSAgICAgICAgQVVYX0JVRkZFUiAgICAgID0gMHg0MDAzLAotICAgICAgICBET1dOTUlYX1RZUEUgICAgPSAwWDQwMDQsCi0gICAgICAgIE1JWEVSX0ZPUk1BVCAgICA9IDB4NDAwNSwgLy8gQVVESU9fRk9STUFUX1BDTV8oRkxPQVR8MTZfQklUKQotICAgICAgICBNSVhFUl9DSEFOTkVMX01BU0sgPSAweDQwMDYsIC8vIENoYW5uZWwgbWFzayBmb3IgbWl4ZXIgb3V0cHV0Ci0gICAgICAgIC8vIGZvciB0YXJnZXQgUkVTQU1QTEUKLSAgICAgICAgU0FNUExFX1JBVEUgICAgID0gMHg0MTAwLCAvLyBDb25maWd1cmUgc2FtcGxlIHJhdGUgY29udmVyc2lvbiBvbiB0aGlzIHRyYWNrIG5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyICd2YWx1ZScgaXMgdGhlIG5ldyBzYW1wbGUgcmF0ZSBpbiBIei4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGNyZWF0ZXMgYSBzYW1wbGUgcmF0ZSBjb252ZXJ0ZXIgdGhlIGZpcnN0IHRpbWUgdGhhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSB0cmFjayBzYW1wbGUgcmF0ZSBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgbWl4IHNhbXBsZSByYXRlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSBuZXcgc2FtcGxlIHJhdGUgaXMgdGhlIHNhbWUgYXMgdGhlIG1peCBzYW1wbGUgcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgYSBzYW1wbGUgcmF0ZSBjb252ZXJ0ZXIgYWxyZWFkeSBleGlzdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlbiB0aGUgc2FtcGxlIHJhdGUgY29udmVydGVyIHJlbWFpbnMgcHJlc2VudCBidXQgaXMgYSBuby1vcC4KLSAgICAgICAgUkVTRVQgICAgICAgICAgID0gMHg0MTAxLCAvLyBSZXNldCBzYW1wbGUgcmF0ZSBjb252ZXJ0ZXIgd2l0aG91dCBjaGFuZ2luZyBzYW1wbGUgcmF0ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGNsZWFycyBvdXQgdGhlIHJlc2FtcGxlcidzIGlucHV0IGJ1ZmZlci4KLSAgICAgICAgUkVNT1ZFICAgICAgICAgID0gMHg0MTAyLCAvLyBSZW1vdmUgdGhlIHNhbXBsZSByYXRlIGNvbnZlcnRlciBvbiB0aGlzIHRyYWNrIG5hbWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRyYWNrIGlzIHJlc3RvcmVkIHRvIHRoZSBtaXggc2FtcGxlIHJhdGUuCi0gICAgICAgIC8vIGZvciB0YXJnZXQgUkFNUF9WT0xVTUUgYW5kIFZPTFVNRSAoOCBjaGFubmVscyBtYXgpCi0gICAgICAgIC8vIEZJWE1FIHVzZSBmbG9hdCBmb3IgdGhlc2UgMyB0byBpbXByb3ZlIHRoZSBkeW5hbWljIHJhbmdlCi0gICAgICAgIFZPTFVNRTAgICAgICAgICA9IDB4NDIwMCwKLSAgICAgICAgVk9MVU1FMSAgICAgICAgID0gMHg0MjAxLAotICAgICAgICBBVVhMRVZFTCAgICAgICAgPSAweDQyMTAsCisgICAgZW51bSB7IC8vIGV4dGVuc2lvbiBvZiBBdWRpb01peGVyQmFzZSBwYXJhbWV0ZXJzCisgICAgICAgIERPV05NSVhfVFlQRSAgICA9IDB4NDAwNCwKKyAgICAgICAgLy8gZm9yIGhhcHRpYworICAgICAgICBIQVBUSUNfRU5BQkxFRCAgPSAweDQwMDcsIC8vIFNldCBoYXB0aWMgZGF0YSBmcm9tIHRoaXMgdHJhY2sgc2hvdWxkIGJlIHBsYXllZCBvciBub3QuCisgICAgICAgIEhBUFRJQ19JTlRFTlNJVFkgPSAweDQwMDgsIC8vIFNldCB0aGUgaW50ZW5zaXR5IHRvIHBsYXkgaGFwdGljIGRhdGEuCiAgICAgICAgIC8vIGZvciB0YXJnZXQgVElNRVNUUkVUQ0gKICAgICAgICAgUExBWUJBQ0tfUkFURSAgID0gMHg0MzAwLCAvLyBDb25maWd1cmUgdGltZXN0cmV0Y2ggb24gdGhpcyB0cmFjayBuYW1lOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcmFtZXRlciAndmFsdWUnIGlzIGEgcG9pbnRlciB0byB0aGUgbmV3IHBsYXliYWNrIHJhdGUuCiAgICAgfTsKIAotICAgIEF1ZGlvTWl4ZXIoc2l6ZV90IGZyYW1lQ291bnQsIHVpbnQzMl90IHNhbXBsZVJhdGUpCi0gICAgICAgIDogbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSkKLSAgICAgICAgLCBtRnJhbWVDb3VudChmcmFtZUNvdW50KSB7Ci0gICAgICAgIHB0aHJlYWRfb25jZSgmc09uY2VDb250cm9sLCAmc0luaXRSb3V0aW5lKTsKLSAgICB9CisgICAgdHlwZWRlZiBlbnVtIHsgLy8gSGFwdGljIGludGVuc2l0eSwgc2hvdWxkIGtlZXAgY29uc2lzdGVudCB3aXRoIFZpYnJhdG9yU2VydmljZQorICAgICAgICBIQVBUSUNfU0NBTEVfTVVURSA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX01VVEUsCisgICAgICAgIEhBUFRJQ19TQ0FMRV9WRVJZX0xPVyA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX1ZFUllfTE9XLAorICAgICAgICBIQVBUSUNfU0NBTEVfTE9XID0gb3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZTo6U0NBTEVfTE9XLAorICAgICAgICBIQVBUSUNfU0NBTEVfTk9ORSA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX05PTkUsCisgICAgICAgIEhBUFRJQ19TQ0FMRV9ISUdIID0gb3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZTo6U0NBTEVfSElHSCwKKyAgICAgICAgSEFQVElDX1NDQUxFX1ZFUllfSElHSCA9IG9zOjpJRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U6OlNDQUxFX1ZFUllfSElHSCwKKyAgICB9IGhhcHRpY19pbnRlbnNpdHlfdDsKKyAgICBzdGF0aWMgY29uc3RleHByIGZsb2F0IEhBUFRJQ19TQ0FMRV9WRVJZX0xPV19SQVRJTyA9IDIuMGYgLyAzLjBmOworICAgIHN0YXRpYyBjb25zdGV4cHIgZmxvYXQgSEFQVElDX1NDQUxFX0xPV19SQVRJTyA9IDMuMGYgLyA0LjBmOworICAgIHN0YXRpYyBjb25zdCBjb25zdGV4cHIgZmxvYXQgSEFQVElDX01BWF9BTVBMSVRVREVfRkxPQVQgPSAxLjBmOwogCi0gICAgLy8gQ3JlYXRlIGEgbmV3IHRyYWNrIGluIHRoZSBtaXhlci4KLSAgICAvLwotICAgIC8vIFxwYXJhbSBuYW1lICAgICAgICBhIHVuaXF1ZSB1c2VyLXByb3ZpZGVkIGludGVnZXIgYXNzb2NpYXRlZCB3aXRoIHRoZSB0cmFjay4KLSAgICAvLyAgICAgICAgICAgICAgICAgICAgSWYgbmFtZSBhbHJlYWR5IGV4aXN0cywgdGhlIGZ1bmN0aW9uIHdpbGwgYWJvcnQuCi0gICAgLy8gXHBhcmFtIGNoYW5uZWxNYXNrIG91dHB1dCBjaGFubmVsIG1hc2suCi0gICAgLy8gXHBhcmFtIGZvcm1hdCAgICAgIFBDTSBmb3JtYXQKLSAgICAvLyBccGFyYW0gc2Vzc2lvbklkICAgU2Vzc2lvbiBpZCBmb3IgdGhlIHRyYWNrLiBUcmFja3Mgd2l0aCB0aGUgc2FtZQotICAgIC8vICAgICAgICAgICAgICAgICAgICBzZXNzaW9uIGlkIHdpbGwgYmUgc3VibWl4ZWQgdG9nZXRoZXIuCi0gICAgLy8KLSAgICAvLyBccmV0dXJuIE9LICAgICAgICBvbiBzdWNjZXNzLgotICAgIC8vICAgICAgICAgQkFEX1ZBTFVFIGlmIHRoZSBmb3JtYXQgZG9lcyBub3Qgc2F0aXNmeSBpc1ZhbGlkRm9ybWF0KCkKLSAgICAvLyAgICAgICAgICAgICAgICAgICBvciB0aGUgY2hhbm5lbE1hc2sgZG9lcyBub3Qgc2F0aXNmeSBpc1ZhbGlkQ2hhbm5lbE1hc2soKS4KLSAgICBzdGF0dXNfdCAgICBjcmVhdGUoCi0gICAgICAgICAgICBpbnQgbmFtZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IHNlc3Npb25JZCk7Ci0KLSAgICBib29sICAgICAgICBleGlzdHMoaW50IG5hbWUpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1UcmFja3MuY291bnQobmFtZSkgPiAwOwotICAgIH0KLQotICAgIC8vIEZyZWUgYW4gYWxsb2NhdGVkIHRyYWNrIGJ5IG5hbWUuCi0gICAgdm9pZCAgICAgICAgZGVzdHJveShpbnQgbmFtZSk7Ci0KLSAgICAvLyBFbmFibGUgb3IgZGlzYWJsZSBhbiBhbGxvY2F0ZWQgdHJhY2sgYnkgbmFtZQotICAgIHZvaWQgICAgICAgIGVuYWJsZShpbnQgbmFtZSk7Ci0gICAgdm9pZCAgICAgICAgZGlzYWJsZShpbnQgbmFtZSk7Ci0KLSAgICB2b2lkICAgICAgICBzZXRQYXJhbWV0ZXIoaW50IG5hbWUsIGludCB0YXJnZXQsIGludCBwYXJhbSwgdm9pZCAqdmFsdWUpOwotCi0gICAgdm9pZCAgICAgICAgc2V0QnVmZmVyUHJvdmlkZXIoaW50IG5hbWUsIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIGJ1ZmZlclByb3ZpZGVyKTsKLQotICAgIHZvaWQgICAgICAgIHByb2Nlc3MoKSB7Ci0gICAgICAgICh0aGlzLT4qbUhvb2spKCk7Ci0gICAgfQotCi0gICAgc2l6ZV90ICAgICAgZ2V0VW5yZWxlYXNlZEZyYW1lcyhpbnQgbmFtZSkgY29uc3Q7Ci0KLSAgICBzdGQ6OnN0cmluZyB0cmFja05hbWVzKCkgY29uc3QgewotICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKLSAgICAgICAgZm9yIChjb25zdCBhdXRvICZwYWlyIDogbVRyYWNrcykgewotICAgICAgICAgICAgc3MgPDwgcGFpci5maXJzdCA8PCAiICI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNzLnN0cigpOwotICAgIH0KLQotICAgIHZvaWQgICAgICAgIHNldE5CTG9nV3JpdGVyKE5CTG9nOjpXcml0ZXIgKmxvZ1dyaXRlcikgewotICAgICAgICBtTkJMb2dXcml0ZXIgPSBsb2dXcml0ZXI7Ci0gICAgfQotCi0gICAgc3RhdGljIGlubGluZSBib29sIGlzVmFsaWRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7Ci0gICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV84X0JJVDoKLSAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKLSAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQ6Ci0gICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ6Ci0gICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNWYWxpZEhhcHRpY0ludGVuc2l0eShoYXB0aWNfaW50ZW5zaXR5X3QgaGFwdGljSW50ZW5zaXR5KSB7CisgICAgICAgIHN3aXRjaCAoaGFwdGljSW50ZW5zaXR5KSB7CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX01VVEU6CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX1ZFUllfTE9XOgorICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9MT1c6CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX05PTkU6CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX0hJR0g6CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX1ZFUllfSElHSDoKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgfQogCi0gICAgc3RhdGljIGlubGluZSBib29sIGlzVmFsaWRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgewotICAgICAgICByZXR1cm4gYXVkaW9fY2hhbm5lbF9tYXNrX2lzX3ZhbGlkKGNoYW5uZWxNYXNrKTsgLy8gdGhlIFJlbWl4QnVmZmVyUHJvdmlkZXIgaXMgZmxleGlibGUuCisgICAgQXVkaW9NaXhlcihzaXplX3QgZnJhbWVDb3VudCwgdWludDMyX3Qgc2FtcGxlUmF0ZSkKKyAgICAgICAgICAgIDogQXVkaW9NaXhlckJhc2UoZnJhbWVDb3VudCwgc2FtcGxlUmF0ZSkgeworICAgICAgICBwdGhyZWFkX29uY2UoJnNPbmNlQ29udHJvbCwgJnNJbml0Um91dGluZSk7CiAgICAgfQogCisgICAgYm9vbCBpc1ZhbGlkQ2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2spIGNvbnN0IG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRQYXJhbWV0ZXIoaW50IG5hbWUsIGludCB0YXJnZXQsIGludCBwYXJhbSwgdm9pZCAqdmFsdWUpIG92ZXJyaWRlOworICAgIHZvaWQgc2V0QnVmZmVyUHJvdmlkZXIoaW50IG5hbWUsIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIGJ1ZmZlclByb3ZpZGVyKTsKKwogcHJpdmF0ZToKIAotICAgIC8qIEZvciBtdWx0aS1mb3JtYXQgZnVuY3Rpb25zIChjYWxscyB0ZW1wbGF0ZSBmdW5jdGlvbnMKLSAgICAgKiBpbiBBdWRpb01peGVyT3BzLmgpLiAgVGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlIGFzIGZvbGxvd3M6Ci0gICAgICoKLSAgICAgKiAgIE1JWFRZUEUgICAgIChzZWUgQXVkaW9NaXhlck9wcy5oIE1JWFRZUEVfKiBlbnVtZXJhdGlvbikKLSAgICAgKiAgIFVTRUZMT0FUVk9MIChzZXQgdG8gdHJ1ZSBpZiBmbG9hdCB2b2x1bWUgaXMgdXNlZCkKLSAgICAgKiAgIEFESlVTVFZPTCAgIChzZXQgdG8gdHJ1ZSBpZiB2b2x1bWUgcmFtcCBwYXJhbWV0ZXJzIG5lZWRzIGFkanVzdG1lbnQgYWZ0ZXJ3YXJkcykKLSAgICAgKiAgIFRPOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKLSAgICAgKiAgIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0Ci0gICAgICogICBUQTogaW50MzJfdCAoUTQuMjcpCi0gICAgICovCi0KLSAgICBlbnVtIHsKLSAgICAgICAgLy8gRklYTUUgdGhpcyByZXByZXNlbnRhdGlvbiBwZXJtaXRzIHVwIHRvIDggY2hhbm5lbHMKLSAgICAgICAgTkVFRFNfQ0hBTk5FTF9DT1VOVF9fTUFTSyAgID0gMHgwMDAwMDAwNywKLSAgICB9OwotCi0gICAgZW51bSB7Ci0gICAgICAgIE5FRURTX0NIQU5ORUxfMSAgICAgICAgICAgICA9IDB4MDAwMDAwMDAsICAgLy8gbW9ubwotICAgICAgICBORUVEU19DSEFOTkVMXzIgICAgICAgICAgICAgPSAweDAwMDAwMDAxLCAgIC8vIHN0ZXJlbwotCi0gICAgICAgIC8vIHNhbXBsZSBmb3JtYXQgaXMgbm90IGV4cGxpY2l0bHkgc3BlY2lmaWVkLCBhbmQgaXMgYXNzdW1lZCB0byBiZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVAotCi0gICAgICAgIE5FRURTX01VVEUgICAgICAgICAgICAgICAgICA9IDB4MDAwMDAxMDAsCi0gICAgICAgIE5FRURTX1JFU0FNUExFICAgICAgICAgICAgICA9IDB4MDAwMDEwMDAsCi0gICAgICAgIE5FRURTX0FVWCAgICAgICAgICAgICAgICAgICA9IDB4MDAwMTAwMDAsCi0gICAgfTsKLQotICAgIC8vIGhvb2sgdHlwZXMKLSAgICBlbnVtIHsKLSAgICAgICAgUFJPQ0VTU1RZUEVfTk9SRVNBTVBMRU9ORVRSQUNLLCAvLyBvdGhlcnMgc2V0IGVsc2V3aGVyZQotICAgIH07Ci0KLSAgICBlbnVtIHsKLSAgICAgICAgVFJBQ0tUWVBFX05PUCwKLSAgICAgICAgVFJBQ0tUWVBFX1JFU0FNUExFLAotICAgICAgICBUUkFDS1RZUEVfTk9SRVNBTVBMRSwKLSAgICAgICAgVFJBQ0tUWVBFX05PUkVTQU1QTEVNT05PLAotICAgIH07Ci0KLSAgICAvLyBwcm9jZXNzIGhvb2sgZnVuY3Rpb25hbGl0eQotICAgIHVzaW5nIHByb2Nlc3NfaG9va190ID0gdm9pZChBdWRpb01peGVyOjoqKSgpOwotCi0gICAgc3RydWN0IFRyYWNrOwotICAgIHVzaW5nIGhvb2tfdCA9IHZvaWQoVHJhY2s6OiopKGludDMyX3QqIG91dHB1dCwgc2l6ZV90IG51bU91dEZyYW1lcywgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KTsKLQotICAgIHN0cnVjdCBUcmFjayB7Ci0gICAgICAgIFRyYWNrKCkKLSAgICAgICAgICAgIDogYnVmZmVyUHJvdmlkZXIobnVsbHB0cikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVE9ETzogbW92ZSBhZGRpdGlvbmFsIGluaXRpYWxpemF0aW9uIGhlcmUuCi0gICAgICAgIH0KKyAgICBzdHJ1Y3QgVHJhY2sgOiBwdWJsaWMgVHJhY2tCYXNlIHsKKyAgICAgICAgVHJhY2soKSA6IFRyYWNrQmFzZSgpIHt9CiAKICAgICAgICAgflRyYWNrKCkKICAgICAgICAgewotICAgICAgICAgICAgLy8gYnVmZmVyUHJvdmlkZXIsIG1JbnB1dEJ1ZmZlclByb3ZpZGVyIG5lZWQgbm90IGJlIGRlbGV0ZWQuCi0gICAgICAgICAgICBtUmVzYW1wbGVyLnJlc2V0KG51bGxwdHIpOworICAgICAgICAgICAgLy8gbUlucHV0QnVmZmVyUHJvdmlkZXIgbmVlZCBub3QgYmUgZGVsZXRlZC4KICAgICAgICAgICAgIC8vIEVuc3VyZSB0aGUgb3JkZXIgb2YgZGVzdHJ1Y3Rpb24gb2YgYnVmZmVyIHByb3ZpZGVycyBhcyB0aGV5CiAgICAgICAgICAgICAvLyByZWxlYXNlIHRoZSB1cHN0cmVhbSBwcm92aWRlciBpbiB0aGUgZGVzdHJ1Y3Rvci4KICAgICAgICAgICAgIG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOwogICAgICAgICAgICAgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKICAgICAgICAgICAgIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKICAgICAgICAgICAgIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOworICAgICAgICAgICAgbUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLnJlc2V0KG51bGxwdHIpOworICAgICAgICAgICAgbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CiAgICAgICAgIH0KIAotICAgICAgICBib29sICAgICAgICBuZWVkc1JhbXAoKSB7IHJldHVybiAodm9sdW1lSW5jWzBdIHwgdm9sdW1lSW5jWzFdIHwgYXV4SW5jKSAhPSAwOyB9Ci0gICAgICAgIGJvb2wgICAgICAgIHNldFJlc2FtcGxlcih1aW50MzJfdCB0cmFja1NhbXBsZVJhdGUsIHVpbnQzMl90IGRldlNhbXBsZVJhdGUpOwotICAgICAgICBib29sICAgICAgICBkb2VzUmVzYW1wbGUoKSBjb25zdCB7IHJldHVybiBtUmVzYW1wbGVyLmdldCgpICE9IG51bGxwdHI7IH0KLSAgICAgICAgdm9pZCAgICAgICAgcmVzZXRSZXNhbXBsZXIoKSB7IGlmIChtUmVzYW1wbGVyLmdldCgpICE9IG51bGxwdHIpIG1SZXNhbXBsZXItPnJlc2V0KCk7IH0KLSAgICAgICAgdm9pZCAgICAgICAgYWRqdXN0Vm9sdW1lUmFtcChib29sIGF1eCwgYm9vbCB1c2VGbG9hdCA9IGZhbHNlKTsKLSAgICAgICAgc2l6ZV90ICAgICAgZ2V0VW5yZWxlYXNlZEZyYW1lcygpIGNvbnN0IHsgcmV0dXJuIG1SZXNhbXBsZXIuZ2V0KCkgIT0gbnVsbHB0ciA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc2FtcGxlci0+Z2V0VW5yZWxlYXNlZEZyYW1lcygpIDogMDsgfTsKKyAgICAgICAgdWludDMyX3QgZ2V0T3V0cHV0Q2hhbm5lbENvdW50KCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgcmV0dXJuIG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyID8gbU1peGVyQ2hhbm5lbENvdW50IDogY2hhbm5lbENvdW50OworICAgICAgICB9CisgICAgICAgIHVpbnQzMl90IGdldE1peGVyQ2hhbm5lbENvdW50KCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgcmV0dXJuIG1NaXhlckNoYW5uZWxDb3VudCArIG1NaXhlckhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgfQogCiAgICAgICAgIHN0YXR1c190ICAgIHByZXBhcmVGb3JEb3dubWl4KCk7CiAgICAgICAgIHZvaWQgICAgICAgIHVucHJlcGFyZUZvckRvd25taXgoKTsKICAgICAgICAgc3RhdHVzX3QgICAgcHJlcGFyZUZvclJlZm9ybWF0KCk7CiAgICAgICAgIHZvaWQgICAgICAgIHVucHJlcGFyZUZvclJlZm9ybWF0KCk7CisgICAgICAgIHN0YXR1c190ICAgIHByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpOworICAgICAgICB2b2lkICAgICAgICB1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVscygpOworICAgICAgICBzdGF0dXNfdCAgICBwcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZShzaXplX3QgZnJhbWVzKTsKKyAgICAgICAgdm9pZCAgICAgICAgdW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZSgpOworICAgICAgICB2b2lkICAgICAgICBjbGVhckNvbnRyYWN0ZWRCdWZmZXIoKTsKICAgICAgICAgYm9vbCAgICAgICAgc2V0UGxheWJhY2tSYXRlKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpOwogICAgICAgICB2b2lkICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOwogCi0gICAgICAgIHN0YXRpYyBob29rX3QgZ2V0VHJhY2tIb29rKGludCB0cmFja1R5cGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBtaXhlckluRm9ybWF0LCBhdWRpb19mb3JtYXRfdCBtaXhlck91dEZvcm1hdCk7Ci0KLSAgICAgICAgdm9pZCB0cmFja19fbm9wKGludDMyX3QqIG91dCwgc2l6ZV90IG51bUZyYW1lcywgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KTsKLQotICAgICAgICB0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIGJvb2wgVVNFRkxPQVRWT0wsIGJvb2wgQURKVVNUVk9MLAotICAgICAgICAgICAgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KLSAgICAgICAgdm9pZCB2b2x1bWVNaXgoVE8gKm91dCwgc2l6ZV90IG91dEZyYW1lcywgY29uc3QgVEkgKmluLCBUQSAqYXV4LCBib29sIHJhbXApOwotCi0gICAgICAgIHVpbnQzMl90ICAgIG5lZWRzOwotCi0gICAgICAgIC8vIFRPRE86IEV2ZW50dWFsbHkgcmVtb3ZlIGxlZ2FjeSBpbnRlZ2VyIHZvbHVtZSBzZXR0aW5ncwotICAgICAgICB1bmlvbiB7Ci0gICAgICAgIGludDE2X3QgICAgIHZvbHVtZVtNQVhfTlVNX1ZPTFVNRVNdOyAvLyBVNC4xMiBmaXhlZCBwb2ludCAodG9wIGJpdCBzaG91bGQgYmUgemVybykKLSAgICAgICAgaW50MzJfdCAgICAgdm9sdW1lUkw7Ci0gICAgICAgIH07Ci0KLSAgICAgICAgaW50MzJfdCAgICAgcHJldlZvbHVtZVtNQVhfTlVNX1ZPTFVNRVNdOwotICAgICAgICBpbnQzMl90ICAgICB2b2x1bWVJbmNbTUFYX05VTV9WT0xVTUVTXTsKLSAgICAgICAgaW50MzJfdCAgICAgYXV4SW5jOwotICAgICAgICBpbnQzMl90ICAgICBwcmV2QXV4TGV2ZWw7Ci0gICAgICAgIGludDE2X3QgICAgIGF1eExldmVsOyAgICAgICAvLyAwIDw9IGF1eExldmVsIDw9IE1BWF9HQUlOX0lOVCwgYnV0IHNpZ25lZCBmb3IgbXVsIHBlcmZvcm1hbmNlCi0KLSAgICAgICAgdWludDE2X3QgICAgZnJhbWVDb3VudDsKLQotICAgICAgICB1aW50OF90ICAgICBjaGFubmVsQ291bnQ7ICAgLy8gMSBvciAyLCByZWR1bmRhbnQgd2l0aCAobmVlZHMgJiBORUVEU19DSEFOTkVMX0NPVU5UX19NQVNLKQotICAgICAgICB1aW50OF90ICAgICB1bnVzZWRfcGFkZGluZzsgLy8gZm9ybWVybHkgZm9ybWF0LCB3YXMgYWx3YXlzIDE2Ci0gICAgICAgIHVpbnQxNl90ICAgIGVuYWJsZWQ7ICAgICAgICAvLyBhY3R1YWxseSBib29sCi0gICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrOwotCi0gICAgICAgIC8vIGFjdHVhbCBidWZmZXIgcHJvdmlkZXIgdXNlZCBieSB0aGUgdHJhY2sgaG9va3MsIHNlZSBEb3dubWl4ZXJCdWZmZXJQcm92aWRlciBiZWxvdwotICAgICAgICAvLyAgZm9yIGhvdyB0aGUgVHJhY2sgYnVmZmVyIHByb3ZpZGVyIGlzIHdyYXBwZWQgYnkgYW5vdGhlciBvbmUgd2hlbiBkb3dtaXhpbmcgaXMgcmVxdWlyZWQKLSAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogICAgICAgICAgICAgICAgYnVmZmVyUHJvdmlkZXI7Ci0KLSAgICAgICAgbXV0YWJsZSBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgYnVmZmVyOyAvLyA4IGJ5dGVzCi0KLSAgICAgICAgaG9va190ICAgICAgaG9vazsKLSAgICAgICAgY29uc3Qgdm9pZCAgKm1JbjsgICAgICAgICAgICAgLy8gY3VycmVudCBsb2NhdGlvbiBpbiBidWZmZXIKLQotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QXVkaW9SZXNhbXBsZXI+IG1SZXNhbXBsZXI7Ci0gICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgc2FtcGxlUmF0ZTsKLSAgICAgICAgaW50MzJfdCogICAgICAgICAgIG1haW5CdWZmZXI7Ci0gICAgICAgIGludDMyX3QqICAgICAgICAgICBhdXhCdWZmZXI7Ci0KICAgICAgICAgLyogQnVmZmVyIHByb3ZpZGVycyBhcmUgY29uc3RydWN0ZWQgdG8gdHJhbnNsYXRlIHRoZSB0cmFjayBpbnB1dCBkYXRhIGFzIG5lZWRlZC4KKyAgICAgICAgICogU2VlIERvd25taXhlckJ1ZmZlclByb3ZpZGVyIGJlbG93IGZvciBob3cgdGhlIFRyYWNrIGJ1ZmZlciBwcm92aWRlcgorICAgICAgICAgKiBpcyB3cmFwcGVkIGJ5IGFub3RoZXIgb25lIHdoZW4gZG93bWl4aW5nIGlzIHJlcXVpcmVkLgogICAgICAgICAgKgogICAgICAgICAgKiBUT0RPOiBwZXJoYXBzIG1ha2UgYSBzaW5nbGUgUGxheWJhY2tDb252ZXJ0ZXJQcm92aWRlciBjbGFzcyB0byBtb3ZlCiAgICAgICAgICAqIGFsbCBwcmUtbWl4ZXIgdHJhY2sgYnVmZmVyIGNvbnZlcnNpb25zIG91dHNpZGUgdGhlIEF1ZGlvTWl4ZXIgY2xhc3MuCiAgICAgICAgICAqCiAgICAgICAgICAqIDEpIG1JbnB1dEJ1ZmZlclByb3ZpZGVyOiBUaGUgQXVkaW9UcmFjayBidWZmZXIgcHJvdmlkZXIuCi0gICAgICAgICAqIDIpIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgdGhlIGF1ZGlvIHJlZm9ybWF0IHRvCisgICAgICAgICAqIDIpIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyOiBFeHBhbmRzIG9yIGNvbnRyYWN0cyBzYW1wbGUgZGF0YSBmcm9tIG9uZSBpbnRlcmxlYXZlZAorICAgICAgICAgKiAgICBjaGFubmVsIGZvcm1hdCB0byBhbm90aGVyLiBFeHBhbmRlZCBjaGFubmVscyBhcmUgZmlsbGVkIHdpdGggemVyb3MgYW5kIHB1dCBhdCB0aGUgZW5kCisgICAgICAgICAqICAgIG9mIGVhY2ggYXVkaW8gZnJhbWUuIENvbnRyYWN0ZWQgY2hhbm5lbHMgYXJlIGNvcGllZCB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisgICAgICAgICAqIDMpIG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlcjogTm9uLWRlc3RydWN0aXZlbHkgY29udHJhY3Qgc2FtcGxlIGRhdGEuCisgICAgICAgICAqICAgIFRoaXMgaXMgY3VycmVudGx5IHVzaW5nIGF0IGF1ZGlvLWhhcHRpYyBjb3VwbGVkIHBsYXliYWNrIHRvIHNlcGFyYXRlIGF1ZGlvIGFuZCBoYXB0aWMKKyAgICAgICAgICogICAgZGF0YS4gQ29udHJhY3RlZCBjaGFubmVscyBjb3VsZCBiZSB3cml0dGVuIHRvIGdpdmVuIGJ1ZmZlci4KKyAgICAgICAgICogNCkgbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgYXVkaW8gcmVmb3JtYXQgdG8KICAgICAgICAgICogICAgbWF0Y2ggZWl0aGVyIG1NaXhlckluRm9ybWF0IG9yIG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQsIGlmIHRoZSBkb3dubWl4ZXIKICAgICAgICAgICogICAgcmVxdWlyZXMgcmVmb3JtYXQuIEZvciBleGFtcGxlLCBpdCBtYXkgY29udmVydCBmbG9hdGluZyBwb2ludCBpbnB1dCB0bwogICAgICAgICAgKiAgICBQQ01fMTZfYml0IGlmIHRoYXQncyByZXF1aXJlZCBieSB0aGUgZG93bm1peGVyLgotICAgICAgICAgKiAzKSBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgY2hhbm5lbCByZW1peGluZyB0byBtYXRjaAorICAgICAgICAgKiA1KSBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXI6IElmIG5vdCBOVUxMLCBwZXJmb3JtcyB0aGUgY2hhbm5lbCByZW1peGluZyB0byBtYXRjaAogICAgICAgICAgKiAgICB0aGUgbnVtYmVyIG9mIGNoYW5uZWxzIHJlcXVpcmVkIGJ5IHRoZSBtaXhlciBzaW5rLgotICAgICAgICAgKiA0KSBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOiBJZiBub3QgTlVMTCwgcGVyZm9ybXMgcmVmb3JtYXR0aW5nIGZyb20KKyAgICAgICAgICogNikgbVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlcjogSWYgbm90IE5VTEwsIHBlcmZvcm1zIHJlZm9ybWF0dGluZyBmcm9tCiAgICAgICAgICAqICAgIHRoZSBkb3dubWl4ZXIgcmVxdWlyZW1lbnRzIHRvIHRoZSBtaXhlciBlbmdpbmUgaW5wdXQgcmVxdWlyZW1lbnRzLgotICAgICAgICAgKiA1KSBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjogQWRkcyB0aW1lc3RyZXRjaGluZyBmb3IgcGxheWJhY2sgcmF0ZQorICAgICAgICAgKiA3KSBtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjogQWRkcyB0aW1lc3RyZXRjaGluZyBmb3IgcGxheWJhY2sgcmF0ZQogICAgICAgICAgKi8KLSAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogICAgIG1JbnB1dEJ1ZmZlclByb3ZpZGVyOyAgICAvLyBleHRlcm5hbGx5IHByb3ZpZGVkIGJ1ZmZlciBwcm92aWRlci4KKyAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogbUlucHV0QnVmZmVyUHJvdmlkZXI7ICAgIC8vIGV4dGVybmFsbHkgcHJvdmlkZWQgYnVmZmVyIHByb3ZpZGVyLgorICAgICAgICAvLyBUT0RPOiBjb21iaW5lIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyIGFuZAorICAgICAgICAvLyBtQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI+IG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyOwogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXI7CiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXNzdGhydUJ1ZmZlclByb3ZpZGVyPiBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXI7CiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQYXNzdGhydUJ1ZmZlclByb3ZpZGVyPiBtUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyOwogICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFzc3RocnVCdWZmZXJQcm92aWRlcj4gbVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI7CiAKLSAgICAgICAgaW50MzJfdCAgICAgc2Vzc2lvbklkOwotCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1NaXhlckZvcm1hdDsgICAgIC8vIG91dHB1dCBtaXggZm9ybWF0OiBBVURJT19GT1JNQVRfUENNXyhGTE9BVHwxNl9CSVQpCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7ICAgICAgICAgIC8vIGlucHV0IHRyYWNrIGZvcm1hdAotICAgICAgICBhdWRpb19mb3JtYXRfdCBtTWl4ZXJJbkZvcm1hdDsgICAvLyBtaXggaW50ZXJuYWwgZm9ybWF0IEFVRElPX0ZPUk1BVF9QQ01fKEZMT0FUfDE2X0JJVCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZWFjaCB0cmFjayBtdXN0IGJlIGNvbnZlcnRlZCB0byB0aGlzIGZvcm1hdC4KICAgICAgICAgYXVkaW9fZm9ybWF0X3QgbURvd25taXhSZXF1aXJlc0Zvcm1hdDsgIC8vIHJlcXVpcmVkIGRvd25taXhlciBmb3JtYXQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIGlmIDE2IGJpdCBuZWNlc3NhcnkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFVRElPX0ZPUk1BVF9JTlZBTElEIGlmIG5vIHJlcXVpcmVkIGZvcm1hdAogCi0gICAgICAgIGZsb2F0ICAgICAgICAgIG1Wb2x1bWVbTUFYX05VTV9WT0xVTUVTXTsgICAgIC8vIGZsb2F0aW5nIHBvaW50IHNldCB2b2x1bWUKLSAgICAgICAgZmxvYXQgICAgICAgICAgbVByZXZWb2x1bWVbTUFYX05VTV9WT0xVTUVTXTsgLy8gZmxvYXRpbmcgcG9pbnQgcHJldmlvdXMgdm9sdW1lCi0gICAgICAgIGZsb2F0ICAgICAgICAgIG1Wb2x1bWVJbmNbTUFYX05VTV9WT0xVTUVTXTsgIC8vIGZsb2F0aW5nIHBvaW50IHZvbHVtZSBpbmNyZW1lbnQKLQotICAgICAgICBmbG9hdCAgICAgICAgICBtQXV4TGV2ZWw7ICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgc2V0IGF1eCBsZXZlbAotICAgICAgICBmbG9hdCAgICAgICAgICBtUHJldkF1eExldmVsOyAgICAgICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgcHJldiBhdXggbGV2ZWwKLSAgICAgICAgZmxvYXQgICAgICAgICAgbUF1eEluYzsgICAgICAgICAgICAgICAgICAgICAgIC8vIGZsb2F0aW5nIHBvaW50IGF1eCBpbmNyZW1lbnQKLQotICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtTWl4ZXJDaGFubmVsTWFzazsKLSAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbU1peGVyQ2hhbm5lbENvdW50OwotCiAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlICAgIG1QbGF5YmFja1JhdGU7CiAKLSAgICBwcml2YXRlOgotICAgICAgICAvLyBob29rcwotICAgICAgICB2b2lkIHRyYWNrX19nZW5lcmljUmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3QgbnVtRnJhbWVzLCBpbnQzMl90KiB0ZW1wLCBpbnQzMl90KiBhdXgpOwotICAgICAgICB2b2lkIHRyYWNrX18xNkJpdHNTdGVyZW8oaW50MzJfdCogb3V0LCBzaXplX3QgbnVtRnJhbWVzLCBpbnQzMl90KiB0ZW1wLCBpbnQzMl90KiBhdXgpOwotICAgICAgICB2b2lkIHRyYWNrX18xNkJpdHNNb25vKGludDMyX3QqIG91dCwgc2l6ZV90IG51bUZyYW1lcywgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KTsKKyAgICAgICAgLy8gSGFwdGljCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQ7CisgICAgICAgIGhhcHRpY19pbnRlbnNpdHlfdCAgIG1IYXB0aWNJbnRlbnNpdHk7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1IYXB0aWNDaGFubmVsTWFzazsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbU1peGVySGFwdGljQ2hhbm5lbE1hc2s7CisgICAgICAgIHVpbnQzMl90ICAgICAgICAgICAgIG1NaXhlckhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUFkanVzdEluQ2hhbm5lbENvdW50OworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtQWRqdXN0T3V0Q2hhbm5lbENvdW50OworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudDsKKyAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgbUFkanVzdE5vbkRlc3RydWN0aXZlT3V0Q2hhbm5lbENvdW50OworICAgICAgICBib29sICAgICAgICAgICAgICAgICBtS2VlcENvbnRyYWN0ZWRDaGFubmVsczsKIAotICAgICAgICB2b2lkIHZvbHVtZVJhbXBTdGVyZW8oaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KTsKLSAgICAgICAgdm9pZCB2b2x1bWVTdGVyZW8oaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KTsKKyAgICAgICAgZmxvYXQgZ2V0SGFwdGljU2NhbGVHYW1tYSgpIGNvbnN0IHsKKyAgICAgICAgLy8gTmVlZCB0byBrZWVwIGNvbnNpc3RlbnQgd2l0aCB0aGUgdmFsdWUgaW4gVmlicmF0b3JTZXJ2aWNlLgorICAgICAgICBzd2l0Y2ggKG1IYXB0aWNJbnRlbnNpdHkpIHsKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfVkVSWV9MT1c6CisgICAgICAgICAgICByZXR1cm4gMi4wZjsKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfTE9XOgorICAgICAgICAgICAgcmV0dXJuIDEuNWY7CisgICAgICAgIGNhc2UgSEFQVElDX1NDQUxFX0hJR0g6CisgICAgICAgICAgICByZXR1cm4gMC41ZjsKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfVkVSWV9ISUdIOgorICAgICAgICAgICAgcmV0dXJuIDAuMjVmOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIDEuMGY7CisgICAgICAgIH0KKyAgICAgICAgfQogCi0gICAgICAgIC8vIG11bHRpLWZvcm1hdCB0cmFjayBob29rcwotICAgICAgICB0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+Ci0gICAgICAgIHZvaWQgdHJhY2tfX1Jlc2FtcGxlKFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LCBUTyogdGVtcCBfX3VudXNlZCwgVEEqIGF1eCk7Ci0gICAgICAgIHRlbXBsYXRlIDxpbnQgTUlYVFlQRSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KLSAgICAgICAgdm9pZCB0cmFja19fTm9SZXNhbXBsZShUTyogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgVE8qIHRlbXAgX191bnVzZWQsIFRBKiBhdXgpOworICAgICAgICBmbG9hdCBnZXRIYXB0aWNNYXhBbXBsaXR1ZGVSYXRpbygpIGNvbnN0IHsKKyAgICAgICAgLy8gTmVlZCB0byBrZWVwIGNvbnNpc3RlbnQgd2l0aCB0aGUgdmFsdWUgaW4gVmlicmF0b3JTZXJ2aWNlLgorICAgICAgICBzd2l0Y2ggKG1IYXB0aWNJbnRlbnNpdHkpIHsKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfVkVSWV9MT1c6CisgICAgICAgICAgICByZXR1cm4gSEFQVElDX1NDQUxFX1ZFUllfTE9XX1JBVElPOworICAgICAgICBjYXNlIEhBUFRJQ19TQ0FMRV9MT1c6CisgICAgICAgICAgICByZXR1cm4gSEFQVElDX1NDQUxFX0xPV19SQVRJTzsKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfTk9ORToKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfSElHSDoKKyAgICAgICAgY2FzZSBIQVBUSUNfU0NBTEVfVkVSWV9ISUdIOgorICAgICAgICAgICAgcmV0dXJuIDEuMGY7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gMC4wZjsKKyAgICAgICAgfQorICAgICAgICB9CiAgICAgfTsKIAotICAgIC8vIFRPRE86IHJlbW92ZSBCTE9DS1NJWkUgdW5pdCBvZiBwcm9jZXNzaW5nIC0gaXQgaXNuJ3QgbmVlZGVkIGFueW1vcmUuCi0gICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgQkxPQ0tTSVpFID0gMTY7Ci0KLSAgICBib29sIHNldENoYW5uZWxNYXNrcyhpbnQgbmFtZSwKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHRyYWNrQ2hhbm5lbE1hc2ssIGF1ZGlvX2NoYW5uZWxfbWFza190IG1peGVyQ2hhbm5lbE1hc2spOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdHJhY2sgaW5mbyBjaGFuZ2VzIGFuZCBhIG5ldyBwcm9jZXNzIGhvb2sgc2hvdWxkIGJlIGRldGVybWluZWQuCi0gICAgdm9pZCBpbnZhbGlkYXRlKCkgewotICAgICAgICBtSG9vayA9ICZBdWRpb01peGVyOjpwcm9jZXNzX192YWxpZGF0ZTsKKyAgICBpbmxpbmUgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiBnZXRUcmFjayhpbnQgbmFtZSkgeworICAgICAgICByZXR1cm4gc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0PFRyYWNrPihtVHJhY2tzW25hbWVdKTsKICAgICB9CiAKLSAgICB2b2lkIHByb2Nlc3NfX3ZhbGlkYXRlKCk7Ci0gICAgdm9pZCBwcm9jZXNzX19ub3AoKTsKLSAgICB2b2lkIHByb2Nlc3NfX2dlbmVyaWNOb1Jlc2FtcGxpbmcoKTsKLSAgICB2b2lkIHByb2Nlc3NfX2dlbmVyaWNSZXNhbXBsaW5nKCk7Ci0gICAgdm9pZCBwcm9jZXNzX19vbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZygpOworICAgIHN0ZDo6c2hhcmVkX3B0cjxUcmFja0Jhc2U+IHByZUNyZWF0ZVRyYWNrKCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgcG9zdENyZWF0ZVRyYWNrKFRyYWNrQmFzZSAqdHJhY2spIG92ZXJyaWRlOwogCi0gICAgdGVtcGxhdGUgPGludCBNSVhUWVBFLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgotICAgIHZvaWQgcHJvY2Vzc19fbm9SZXNhbXBsZU9uZVRyYWNrKCk7CisgICAgdm9pZCBwcmVQcm9jZXNzKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBwb3N0UHJvY2VzcygpIG92ZXJyaWRlOwogCi0gICAgc3RhdGljIHByb2Nlc3NfaG9va190IGdldFByb2Nlc3NIb29rKGludCBwcm9jZXNzVHlwZSwgdWludDMyX3QgY2hhbm5lbENvdW50LAotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgbWl4ZXJJbkZvcm1hdCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQpOwotCi0gICAgc3RhdGljIHZvaWQgY29udmVydE1peGVyRm9ybWF0KHZvaWQgKm91dCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQsCi0gICAgICAgICAgICB2b2lkICppbiwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJJbkZvcm1hdCwgc2l6ZV90IHNhbXBsZUNvdW50KTsKKyAgICBib29sIHNldENoYW5uZWxNYXNrcyhpbnQgbmFtZSwKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHRyYWNrQ2hhbm5lbE1hc2ssIGF1ZGlvX2NoYW5uZWxfbWFza190IG1peGVyQ2hhbm5lbE1hc2spIG92ZXJyaWRlOwogCiAgICAgc3RhdGljIHZvaWQgc0luaXRSb3V0aW5lKCk7CiAKLSAgICAvLyBpbml0aWFsaXphdGlvbiBjb25zdGFudHMKLSAgICBjb25zdCB1aW50MzJfdCBtU2FtcGxlUmF0ZTsKLSAgICBjb25zdCBzaXplX3QgbUZyYW1lQ291bnQ7Ci0KLSAgICBOQkxvZzo6V3JpdGVyICptTkJMb2dXcml0ZXIgPSBudWxscHRyOyAgIC8vIGFzc29jaWF0ZWQgTkJMb2c6OldyaXRlcgotCi0gICAgcHJvY2Vzc19ob29rX3QgbUhvb2sgPSAmQXVkaW9NaXhlcjo6cHJvY2Vzc19fbm9wOyAgIC8vIG9uZSBvZiBwcm9jZXNzX18qLCBuZXZlciBudWxscHRyCi0KLSAgICAvLyB0aGUgc2l6ZSBvZiB0aGUgdHlwZSAoaW50MzJfdCkgc2hvdWxkIGJlIHRoZSBsYXJnZXN0IG9mIGFsbCB0eXBlcyBzdXBwb3J0ZWQKLSAgICAvLyBieSB0aGUgbWl4ZXIuCi0gICAgc3RkOjp1bmlxdWVfcHRyPGludDMyX3RbXT4gbU91dHB1dFRlbXA7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGludDMyX3RbXT4gbVJlc2FtcGxlVGVtcDsKLQotICAgIC8vIHRyYWNrIG5hbWVzIGdyb3VwZWQgYnkgbWFpbiBidWZmZXIsIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIgb2YgbWFpbiBidWZmZXIuCi0gICAgLy8gaG93ZXZlciBuYW1lcyBmb3IgYSBwYXJ0aWN1bGFyIG1haW4gYnVmZmVyIGFyZSBpbiBvcmRlciAoYnkgY29uc3RydWN0aW9uKS4KLSAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dm9pZCAqIC8qIG1haW5CdWZmZXIgKi8sIHN0ZDo6dmVjdG9yPGludCAvKiBuYW1lICovPj4gbUdyb3VwczsKLQotICAgIC8vIHRyYWNrIG5hbWVzIHRoYXQgYXJlIGVuYWJsZWQsIGluIGluY3JlYXNpbmcgb3JkZXIgKGJ5IGNvbnN0cnVjdGlvbikuCi0gICAgc3RkOjp2ZWN0b3I8aW50IC8qIG5hbWUgKi8+IG1FbmFibGVkOwotCi0gICAgLy8gdHJhY2sgc21hcnQgcG9pbnRlcnMsIGJ5IG5hbWUsIGluIGluY3JlYXNpbmcgb3JkZXIgb2YgbmFtZS4KLSAgICBzdGQ6Om1hcDxpbnQgLyogbmFtZSAqLywgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPj4gbVRyYWNrczsKLQogICAgIHN0YXRpYyBwdGhyZWFkX29uY2VfdCBzT25jZUNvbnRyb2w7IC8vIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yIGJ5IGZpcnN0IG5ldwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjdkODk1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9QYXJhbWV0ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA4LTIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfQVVESU9QQVJBTUVURVJfSF8KLSNkZWZpbmUgQU5EUk9JRF9BVURJT1BBUkFNRVRFUl9IXwotCi0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgQXVkaW9QYXJhbWV0ZXIgewotCi1wdWJsaWM6Ci0gICAgQXVkaW9QYXJhbWV0ZXIoKSB7fQotICAgIEF1ZGlvUGFyYW1ldGVyKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwotICAgIHZpcnR1YWwgfkF1ZGlvUGFyYW1ldGVyKCk7Ci0KLSAgICAvLyByZXNlcnZlZCBwYXJhbWV0ZXIga2V5cyBmb3IgY2hhbmdpbmcgc3RhbmRhcmQgcGFyYW1ldGVycyB3aXRoIHNldFBhcmFtZXRlcnMoKSBmdW5jdGlvbi4KLSAgICAvLyBVc2luZyB0aGVzZSBrZXlzIGlzIG1hbmRhdG9yeSBmb3IgQXVkaW9GbGluZ2VyIHRvIHByb3Blcmx5IG1vbml0b3IgYXVkaW8gb3V0cHV0L2lucHV0Ci0gICAgLy8gY29uZmlndXJhdGlvbiBjaGFuZ2VzIGFuZCBhY3QgYWNjb3JkaW5nbHkuCi0gICAgLy8gIGtleVJvdXRpbmc6IHRvIGNoYW5nZSBhdWRpbyByb3V0aW5nLCB2YWx1ZSBpcyBhbiBpbnQgaW4gYXVkaW9fZGV2aWNlc190Ci0gICAgLy8gIGtleVNhbXBsaW5nUmF0ZTogdG8gY2hhbmdlIHNhbXBsaW5nIHJhdGUgcm91dGluZywgdmFsdWUgaXMgYW4gaW50Ci0gICAgLy8gIGtleUZvcm1hdDogdG8gY2hhbmdlIGF1ZGlvIGZvcm1hdCwgdmFsdWUgaXMgYW4gaW50IGluIGF1ZGlvX2Zvcm1hdF90Ci0gICAgLy8gIGtleUNoYW5uZWxzOiB0byBjaGFuZ2UgYXVkaW8gY2hhbm5lbCBjb25maWd1cmF0aW9uLCB2YWx1ZSBpcyBhbiBpbnQgaW4gYXVkaW9fY2hhbm5lbHNfdAotICAgIC8vICBrZXlGcmFtZUNvdW50OiB0byBjaGFuZ2UgYXVkaW8gb3V0cHV0IGZyYW1lIGNvdW50LCB2YWx1ZSBpcyBhbiBpbnQKLSAgICAvLyAga2V5SW5wdXRTb3VyY2U6IHRvIGNoYW5nZSBhdWRpbyBpbnB1dCBzb3VyY2UsIHZhbHVlIGlzIGFuIGludCBpbiBhdWRpb19zb3VyY2VfdAotICAgIC8vICAgICAoZGVmaW5lZCBpbiBtZWRpYS9tZWRpYXJlY29yZGVyLmgpCi0gICAgLy8gIGtleVNjcmVlblN0YXRlOiBlaXRoZXIgIm9uIiBvciAib2ZmIgotICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5Um91dGluZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVNhbXBsaW5nUmF0ZTsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleUZvcm1hdDsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleUNoYW5uZWxzOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5RnJhbWVDb3VudDsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleUlucHV0U291cmNlOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5U2NyZWVuU3RhdGU7Ci0KLSAgICAvLyAga2V5QnROcmVjOiBCVCBTQ08gTm9pc2UgUmVkdWN0aW9uICsgRWNobyBDYW5jZWxsYXRpb24gcGFyYW1ldGVycwotICAgIC8vICBrZXlId0F2U3luYzogZ2V0IEhXIHN5bmNocm9uaXphdGlvbiBzb3VyY2UgaWRlbnRpZmllciBmcm9tIGEgZGV2aWNlCi0gICAgLy8gIGtleU1vbm9PdXRwdXQ6IEVuYWJsZSBtb25vIGF1ZGlvIHBsYXliYWNrCi0gICAgLy8gIGtleVN0cmVhbUh3QXZTeW5jOiBzZXQgSFcgc3luY2hyb25pemF0aW9uIHNvdXJjZSBpZGVudGlmaWVyIG9uIGEgc3RyZWFtCi0gICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlCdE5yZWM7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlId0F2U3luYzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleU1vbm9PdXRwdXQ7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlTdHJlYW1Id0F2U3luYzsKLQotICAgIC8vICBrZXlzIGZvciBwcmVzZW50YXRpb24gc2VsZWN0aW9uCi0gICAgLy8gIGtleVByZXNlbnRhdGlvbklkOiBBdWRpbyBwcmVzZW50YXRpb24gaWRlbnRpZmllcgotICAgIC8vICBrZXlQcm9ncmFtSWQ6IEF1ZGlvIHByZXNlbnRhdGlvbiBwcm9ncmFtIGlkZW50aWZpZXIKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVByZXNlbnRhdGlvbklkOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5UHJvZ3JhbUlkOwotCi0gICAgLy8gIGtleVN0cmVhbUNvbm5lY3QgLyBEaXNjb25uZWN0OiB2YWx1ZSBpcyBhbiBpbnQgaW4gYXVkaW9fZGV2aWNlc190Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlTdHJlYW1Db25uZWN0OwotICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5U3RyZWFtRGlzY29ubmVjdDsKLQotICAgIC8vIEZvciBxdWVyeWluZyBzdHJlYW0gY2FwYWJpbGl0aWVzLiBBbGwgdGhlIHJldHVybmVkIHZhbHVlcyBhcmUgbGlzdHMuCi0gICAgLy8gICBrZXlTdHJlYW1TdXBwb3J0ZWRGb3JtYXRzOiBhdWRpb19mb3JtYXRfdAotICAgIC8vICAga2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHM6IGF1ZGlvX2NoYW5uZWxfbWFza190Ci0gICAgLy8gICBrZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzOiBzYW1wbGluZyByYXRlIHZhbHVlcwotICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5U3RyZWFtU3VwcG9ydGVkRm9ybWF0czsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5U3RyZWFtU3VwcG9ydGVkU2FtcGxpbmdSYXRlczsKLQotICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmFsdWVPbjsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZhbHVlT2ZmOwotCi0gICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2YWx1ZUxpc3RTZXBhcmF0b3I7Ci0KLSAgICAvLyBrZXlSZWNvbmZpZ0EyZHA6IEFzayBId01vZHVsZSB0byByZWNvbmZpZ3VyZSBBMkRQIG9mZmxvYWRlZCBjb2RlYwotICAgIC8vIGtleVJlY29uZmlnQTJkcFN1cHBvcnRlZDogUXVlcnkgaWYgSHdNb2R1bGUgc3VwcG9ydHMgQTJEUCBvZmZsb2FkIGNvZGVjIGNvbmZpZwotICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5UmVjb25maWdBMmRwOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5UmVjb25maWdBMmRwU3VwcG9ydGVkOwotCi0gICAgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0IHsgcmV0dXJuIHRvU3RyaW5nSW1wbCh0cnVlKTsgfQotICAgIFN0cmluZzgga2V5c1RvU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gdG9TdHJpbmdJbXBsKGZhbHNlKTsgfQotCi0gICAgc3RhdHVzX3QgYWRkKGNvbnN0IFN0cmluZzgmIGtleSwgY29uc3QgU3RyaW5nOCYgdmFsdWUpOwotICAgIHN0YXR1c190IGFkZEludChjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IGludCB2YWx1ZSk7Ci0gICAgc3RhdHVzX3QgYWRkS2V5KGNvbnN0IFN0cmluZzgmIGtleSk7Ci0gICAgc3RhdHVzX3QgYWRkRmxvYXQoY29uc3QgU3RyaW5nOCYga2V5LCBjb25zdCBmbG9hdCB2YWx1ZSk7Ci0KLSAgICBzdGF0dXNfdCByZW1vdmUoY29uc3QgU3RyaW5nOCYga2V5KTsKLQotICAgIHN0YXR1c190IGdldChjb25zdCBTdHJpbmc4JiBrZXksIFN0cmluZzgmIHZhbHVlKSBjb25zdDsKLSAgICBzdGF0dXNfdCBnZXRJbnQoY29uc3QgU3RyaW5nOCYga2V5LCBpbnQmIHZhbHVlKSBjb25zdDsKLSAgICBzdGF0dXNfdCBnZXRGbG9hdChjb25zdCBTdHJpbmc4JiBrZXksIGZsb2F0JiB2YWx1ZSkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgZ2V0QXQoc2l6ZV90IGluZGV4LCBTdHJpbmc4JiBrZXkpIGNvbnN0OwotICAgIHN0YXR1c190IGdldEF0KHNpemVfdCBpbmRleCwgU3RyaW5nOCYga2V5LCBTdHJpbmc4JiB2YWx1ZSkgY29uc3Q7Ci0KLSAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1QYXJhbWV0ZXJzLnNpemUoKTsgfQotCi1wcml2YXRlOgotICAgIFN0cmluZzggbUtleVZhbHVlUGFpcnM7Ci0gICAgS2V5ZWRWZWN0b3IgPFN0cmluZzgsIFN0cmluZzg+IG1QYXJhbWV0ZXJzOwotCi0gICAgU3RyaW5nOCB0b1N0cmluZ0ltcGwoYm9vbCB1c2VWYWx1ZXMpIGNvbnN0OwotfTsKLQotfTsgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLypBTkRST0lEX0FVRElPUEFSQU1FVEVSX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3kuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3kuaAppbmRleCA4ZGEwMDY5Li4wYWIxYzlkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUG9saWN5LmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeS5oCkBAIC0xOCw5ICsxOCwxMCBAQAogI2lmbmRlZiBBTkRST0lEX0FVRElPX1BPTElDWV9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9fUE9MSUNZX0gKIAorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAKQEAgLTQ5LDggKzUwLDEyIEBACiAjZGVmaW5lIE1JWF9TVEFURV9JRExFIDAKICNkZWZpbmUgTUlYX1NUQVRFX01JWElORyAxCiAKKy8qKiBDb250cm9sIHRvIHdoaWNoIGRldmljZSBzb21lIGF1ZGlvIGlzIHJlbmRlcmVkICovCiAjZGVmaW5lIE1JWF9ST1VURV9GTEFHX1JFTkRFUiAweDEKKy8qKiBMb29wIGJhY2sgc29tZSBhdWRpbyBpbnN0ZWFkIG9mIHJlbmRlcmluZyBpdCAqLwogI2RlZmluZSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0sgKDB4MSA8PCAxKQorLyoqIExvb3AgYmFjayBzb21lIGF1ZGlvIHdoaWxlIGl0IGlzIHJlbmRlcmVkICovCisjZGVmaW5lIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDS19BTkRfUkVOREVSIChNSVhfUk9VVEVfRkxBR19SRU5ERVIgfCBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spCiAjZGVmaW5lIE1JWF9ST1VURV9GTEFHX0FMTCAoTUlYX1JPVVRFX0ZMQUdfUkVOREVSIHwgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKQogCiAjZGVmaW5lIE1BWF9NSVhFU19QRVJfUE9MSUNZIDEwCkBAIC04NywyMSArOTIsMzcgQEAKICAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChQYXJjZWwgKnBhcmNlbCk7CiAgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Q7CiAKLSAgICBWZWN0b3I8QXVkaW9NaXhNYXRjaENyaXRlcmlvbj4gbUNyaXRlcmlhOworICAgIHZvaWQgc2V0RXhjbHVkZVVpZCh1aWRfdCB1aWQpIGNvbnN0OworICAgIHZvaWQgc2V0TWF0Y2hVaWQodWlkX3QgdWlkKSBjb25zdDsKKyAgICAvKiogcmV0dXJucyB0cnVlIGlmIHRoaXMgbWl4IGhhcyBhIHJ1bGUgdG8gbWF0Y2ggb3IgZXhjbHVkZSB0aGUgZ2l2ZW4gdWlkICovCisgICAgYm9vbCBoYXNVaWRSdWxlKGJvb2wgbWF0Y2gsIHVpZF90IHVpZCkgY29uc3Q7CisgICAgLyoqIHJldHVybnMgdHJ1ZSBpZiB0aGlzIG1peCBoYXMgYSBydWxlIGZvciB1aWQgbWF0Y2ggKGFueSB1aWQpICovCisgICAgYm9vbCBoYXNNYXRjaFVpZFJ1bGUoKSBjb25zdDsKKyAgICAvKiogcmV0dXJucyB0cnVlIGlmIHRoaXMgbWl4IGNhbiBiZSB1c2VkIGZvciB1aWQtZGV2aWNlIGFmZmluaXR5IHJvdXRpbmcgKi8KKyAgICBib29sIGlzRGV2aWNlQWZmaW5pdHlDb21wYXRpYmxlKCkgY29uc3Q7CisKKyAgICBtdXRhYmxlIFZlY3RvcjxBdWRpb01peE1hdGNoQ3JpdGVyaW9uPiBtQ3JpdGVyaWE7CiAgICAgdWludDMyX3QgICAgICAgIG1NaXhUeXBlOwogICAgIGF1ZGlvX2NvbmZpZ190ICBtRm9ybWF0OwogICAgIHVpbnQzMl90ICAgICAgICBtUm91dGVGbGFnczsKICAgICBhdWRpb19kZXZpY2VzX3QgbURldmljZVR5cGU7CiAgICAgU3RyaW5nOCAgICAgICAgIG1EZXZpY2VBZGRyZXNzOwogICAgIHVpbnQzMl90ICAgICAgICBtQ2JGbGFnczsgLy8gZmxhZ3MgaW5kaWNhdGluZyB3aGljaCBjYWxsYmFja3MgdG8gdXNlLCBzZWUga0NiRmxhZyoKKyAgICAvKiogSWdub3JlIHRoZSBBVURJT19GTEFHX05PX01FRElBX1BST0pFQ1RJT04gKi8KKyAgICBib29sICAgICAgICAgICAgbUFsbG93UHJpdmlsZWdlZFBsYXliYWNrQ2FwdHVyZSA9IGZhbHNlOwogfTsKIAogCi0vLyBkZWZpbml0aW9ucyBmb3IgYXVkaW8gcmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24gdXBkYXRlcwotLy8gd2hpY2ggdXBkYXRlIHR5cGUgaXMgcmVwb3J0ZWQKLSNkZWZpbmUgUkVDT1JEX0NPTkZJR19FVkVOVF9OT05FIC0xCi0jZGVmaW5lIFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQgMQotI2RlZmluZSBSRUNPUkRfQ09ORklHX0VWRU5UX1NUT1AgIDAKKy8vIGRlZmluaXRpb25zIGZvciBhdWRpbyByZWNvcmRpbmcgY29uZmlndXJhdGlvbiB1cGRhdGVzOworLy8ga2VlcCBpbiBzeW5jIHdpdGggQXVkaW9NYW5hZ2VyLmphdmEgZm9yIHZhbHVlcyB1c2VkIGZyb20gbmF0aXZlIGNvZGUKKyNkZWZpbmUgUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCAgMAorI2RlZmluZSBSRUNPUkRfQ09ORklHX0VWRU5UX1NUT1AgICAxCisjZGVmaW5lIFJFQ09SRF9DT05GSUdfRVZFTlRfVVBEQVRFIDIKKworc3RhdGljIGlubGluZSBib29sIGlzX21peF9sb29wYmFja19yZW5kZXIodWludDMyX3Qgcm91dGVGbGFncykgeworICAgIHJldHVybiAocm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDS19BTkRfUkVOREVSKQorICAgICAgICAgICA9PSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0tfQU5EX1JFTkRFUjsKK30KIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYmU5NTQ2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLSNpZm5kZWYgQVVESU9fUE9MSUNZX0hFTFBFUl9IXwotI2RlZmluZSBBVURJT19QT0xJQ1lfSEVMUEVSX0hfCi0KLSNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLXN0YXRpYyBpbmxpbmUKLWF1ZGlvX3N0cmVhbV90eXBlX3QgYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpCi17Ci0gICAgLy8gZmxhZ3MgdG8gc3RyZWFtIHR5cGUgbWFwcGluZwotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpID09IEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgewotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU7Ci0gICAgfQotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX1NDTykgPT0gQVVESU9fRkxBR19TQ08pIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOwotICAgIH0KLQotICAgIC8vIHVzYWdlIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKLSAgICBzd2l0Y2ggKGF0dHItPnVzYWdlKSB7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTlQ6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1NZU1RFTTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0RUTUY7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FMQVJNOwotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9SSU5HOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgfQotfQotCi1zdGF0aWMgaW5saW5lCi12b2lkIHN0cmVhbV90eXBlX3RvX2F1ZGlvX2F0dHJpYnV0ZXMoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cikgewotICAgIG1lbXNldChhdHRyLCAwLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0KLSAgICBzd2l0Y2ggKHN0cmVhbVR5cGUpIHsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9ERUZBVUxUOgotICAgIGNhc2UgQVVESU9fU1RSRUFNX01VU0lDOgotICAgICAgICBhdHRyLT5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfTVVTSUM7Ci0gICAgICAgIGF0dHItPnVzYWdlID0gQVVESU9fVVNBR0VfTUVESUE7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEw6Ci0gICAgICAgIGF0dHItPmNvbnRlbnRfdHlwZSA9IEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0g7Ci0gICAgICAgIGF0dHItPnVzYWdlID0gQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRToKLSAgICAgICAgYXR0ci0+ZmxhZ3MgIHw9IEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRDsKLSAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7IC8vIGF0dHJpYnV0ZXMgaW4gY29tbW9uIHdpdGggU1RSRUFNX1NZU1RFTQotICAgIGNhc2UgQVVESU9fU1RSRUFNX1NZU1RFTToKLSAgICAgICAgYXR0ci0+Y29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX1NPTklGSUNBVElPTjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fUklORzoKLSAgICAgICAgYXR0ci0+Y29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9BTEFSTToKLSAgICAgICAgYXR0ci0+Y29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9BTEFSTTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOgotICAgICAgICBhdHRyLT5jb250ZW50X3R5cGUgPSBBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OOwotICAgICAgICBhdHRyLT51c2FnZSA9IEFVRElPX1VTQUdFX05PVElGSUNBVElPTjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTzoKLSAgICAgICAgYXR0ci0+Y29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OOwotICAgICAgICBhdHRyLT5mbGFncyB8PSBBVURJT19GTEFHX1NDTzsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fRFRNRjoKLSAgICAgICAgYXR0ci0+Y29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTjsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX1RUUzoKLSAgICAgICAgYXR0ci0+Y29udGVudF90eXBlID0gQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSDsKLSAgICAgICAgYXR0ci0+dXNhZ2UgPSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk7Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dFKCJpbnZhbGlkIHN0cmVhbSB0eXBlICVkIHdoZW4gY29udmVydGluZyB0byBhdHRyaWJ1dGVzIiwgc3RyZWFtVHlwZSk7Ci0gICAgfQotfQotCi0jZW5kaWYgLy9BVURJT19QT0xJQ1lfSEVMUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQ0MTA5NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9kdWN0U3RyYXRlZ3kuaApAQCAtMCwwICsxLDY2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0F0dHJpYnV0ZXMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBdWRpb1Byb2R1Y3RTdHJhdGVneSA6IHB1YmxpYyBQYXJjZWxhYmxlCit7CitwdWJsaWM6CisgICAgQXVkaW9Qcm9kdWN0U3RyYXRlZ3koKSB7fQorICAgIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBjb25zdCBzdGQ6OnZlY3RvcjxBdWRpb0F0dHJpYnV0ZXM+ICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBpZCkgOgorICAgICAgICBtTmFtZShuYW1lKSwgbUF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwgbUlkKGlkKSB7fQorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtTmFtZTsgfQorICAgIHN0ZDo6dmVjdG9yPEF1ZGlvQXR0cmlidXRlcz4gZ2V0QXVkaW9BdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gbUF1ZGlvQXR0cmlidXRlczsgfQorICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRJZCgpIGNvbnN0IHsgcmV0dXJuIG1JZDsgfQorCisgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICpwYXJjZWwpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGF0dHJpYnV0ZXNNYXRjaGVzOiBjaGVja3MgaWYgY2xpZW50IGF0dHJpYnV0ZXMgbWF0Y2hlcyB3aXRoIGEgcmVmZXJlbmNlIGF0dHJpYnV0ZXMKKyAgICAgKiAibWF0Y2hpbmciIG1lYW5zIHRoZSB1c2FnZSBzaGFsbCBtYXRjaCBpZiByZWZlcmVuY2UgYXR0cmlidXRlcyBoYXMgYSBkZWZpbmVkIHVzYWdlLCBBTkQKKyAgICAgKiBjb250ZW50IHR5cGUgc2hhbGwgbWF0Y2ggaWYgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgaGFzIGEgZGVmaW5lZCBjb250ZW50IHR5cGUgQU5ECisgICAgICogZmxhZ3Mgc2hhbGwgbWF0Y2ggaWYgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgaGFzIGRlZmluZWQgZmxhZ3MgQU5ECisgICAgICogdGFncyBzaGFsbCBtYXRjaCBpZiByZWZlcmVuY2UgYXR0cmlidXRlcyBoYXMgZGVmaW5lZCB0YWdzLgorICAgICAqIFJlZmVyZW5jZSBhdHRyaWJ1dGVzICJkZWZhdWx0IiBzaGFsbCBub3QgYmUgY29uc2lkZXJlZCBhcyBhICJ0cnVlIiBjYXNlLiBUaGlzIGNvbnZlbnRpb24KKyAgICAgKiBpcyB1c2VkIHRvIGlkZW50aWZ5IHRoZSBkZWZhdWx0IHN0cmF0ZWd5LgorICAgICAqIEBwYXJhbSByZWZBdHRyaWJ1dGVzIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gY2xpZW50QXR0cml0dWJlcyB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiB0cnVlIGlmIG1hdGNoaW5nLCBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBzdGF0aWMgYm9vbCBhdHRyaWJ1dGVzTWF0Y2hlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgcmVmQXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgY2xpZW50QXR0cml0dWJlcyk7Citwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIG1OYW1lOworICAgIHN0ZDo6dmVjdG9yPEF1ZGlvQXR0cmlidXRlcz4gbUF1ZGlvQXR0cmlidXRlczsKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgbUlkOworfTsKKwordXNpbmcgQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgPSBzdGQ6OnZlY3RvcjxBdWRpb1Byb2R1Y3RTdHJhdGVneT47CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1JlY29yZC5oCmluZGV4IDgwNjI4MGEuLjU3NDMwMmIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9SZWNvcmQuaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvUmVjb3JkLmgKQEAgLTE3LDYgKzE3LDkgQEAKICNpZm5kZWYgQU5EUk9JRF9BVURJT1JFQ09SRF9ICiAjZGVmaW5lIEFORFJPSURfQVVESU9SRUNPUkRfSAogCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKwogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3NjaGVkX3BvbGljeS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CkBAIC0yNCw5ICsyNyw5IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvTW9kdWxvLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWljcm9waG9uZUluZm8uaD4KKyNpbmNsdWRlIDxtZWRpYS9SZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXIuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImFuZHJvaWQvbWVkaWEvSUF1ZGlvUmVjb3JkLmgiCiAKQEAgLTg5LDYgKzkyLDExIEBACiAgICAgICAgICAgICBpbnQ4X3QqICAgICBpODsgICAgICAgICAvLyB1bnNpZ25lZCA4LWJpdCwgb2Zmc2V0IGJ5IDB4ODAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlucHV0IHRvIG9idGFpbkJ1ZmZlcigpOiB1bnVzZWQsIG91dHB1dDogcG9pbnRlciB0byBidWZmZXIKICAgICAgICAgfTsKKworICAgICAgICB1aW50MzJfdCAgICBzZXF1ZW5jZTsgICAgICAgLy8gSUF1ZGlvUmVjb3JkIGluc3RhbmNlIHNlcXVlbmNlIG51bWJlciwgYXMgb2Ygb2J0YWluQnVmZmVyKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJdCBpcyBzZXQgYnkgb2J0YWluQnVmZmVyKCkgYW5kIGNvbmZpcm1lZCBieSByZWxlYXNlQnVmZmVyKCkuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3QgInVzZXItc2VydmljZWFibGUiLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyBDb25zaWRlciBzcDxJTWVtb3J5PiBpbnN0ZWFkLCBvciBpbiBhZGRpdGlvbiB0byB0aGlzLgogICAgIH07CiAKICAgICAvKiBBcyBhIGNvbnZlbmllbmNlLCBpZiBhIGNhbGxiYWNrIGlzIHN1cHBsaWVkLCBhIGhhbmRsZXIgdGhyZWFkCkBAIC0xODksNyArMTk3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQgPSBBVURJT19VSURfSU5WQUxJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCA9IC0xLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRNaWNEaXJlY3Rpb24gPSBNSUNfRElSRUNUSU9OX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbiA9IE1JQ19GSUVMRF9ESU1FTlNJT05fREVGQVVMVCk7CiAKICAgICAvKiBUZXJtaW5hdGVzIHRoZSBBdWRpb1JlY29yZCBhbmQgdW5yZWdpc3RlcnMgaXQgZnJvbSBBdWRpb0ZsaW5nZXIuCiAgICAgICogQWxzbyBkZXN0cm95cyBhbGwgcmVzb3VyY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGUgQXVkaW9SZWNvcmQuCkBAIC0yMjgsNyArMjM5LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkID0gQVVESU9fVUlEX0lOVkFMSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkID0gLTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcyA9IE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkTWljRGlyZWN0aW9uID0gTUlDX0RJUkVDVElPTl9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uID0gTUlDX0ZJRUxEX0RJTUVOU0lPTl9ERUZBVUxUKTsKIAogICAgIC8qIFJlc3VsdCBvZiBjb25zdHJ1Y3RpbmcgdGhlIEF1ZGlvUmVjb3JkLiBUaGlzIG11c3QgYmUgY2hlY2tlZCBmb3Igc3VjY2Vzc2Z1bCBpbml0aWFsaXphdGlvbgogICAgICAqIGJlZm9yZSB1c2luZyBhbnkgQXVkaW9SZWNvcmQgQVBJIChleGNlcHQgZm9yIHNldCgpKSwgYmVjYXVzZSB1c2luZwpAQCAtNDExLDE0ICs0MjUsMTcgQEAKICAgICAgKiAgZnJhbWVDb3VudCAgbnVtYmVyIG9mIGZyYW1lcyByZXF1ZXN0ZWQKICAgICAgKiAgc2l6ZSAgICAgICAgaWdub3JlZAogICAgICAqICByYXcgICAgICAgICBpZ25vcmVkCisgICAgICogIHNlcXVlbmNlICAgIGlnbm9yZWQKICAgICAgKiBBZnRlciBlcnJvciByZXR1cm46CiAgICAgICogIGZyYW1lQ291bnQgIDAKICAgICAgKiAgc2l6ZSAgICAgICAgMAogICAgICAqICByYXcgICAgICAgICB1bmRlZmluZWQKKyAgICAgKiAgc2VxdWVuY2UgICAgdW5kZWZpbmVkCiAgICAgICogQWZ0ZXIgc3VjY2Vzc2Z1bCByZXR1cm46CiAgICAgICogIGZyYW1lQ291bnQgIGFjdHVhbCBudW1iZXIgb2YgZnJhbWVzIGF2YWlsYWJsZSwgPD0gbnVtYmVyIHJlcXVlc3RlZAogICAgICAqICBzaXplICAgICAgICBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZQogICAgICAqICByYXcgICAgICAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIKKyAgICAgKiAgc2VxdWVuY2UgICAgSUF1ZGlvUmVjb3JkIGluc3RhbmNlIHNlcXVlbmNlIG51bWJlciwgYXMgb2Ygb2J0YWluQnVmZmVyKCkKICAgICAgKi8KIAogICAgICAgICAgICAgc3RhdHVzX3QgICAgb2J0YWluQnVmZmVyKEJ1ZmZlciogYXVkaW9CdWZmZXIsIGludDMyX3Qgd2FpdENvdW50LApAQCAtNTM0LDkgKzU1MSwyMyBAQAogICAgICAqLwogICAgICAgICAgICAgc3RhdHVzX3QgICAgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOwogCi0gICAgLyoKLSAgICAgKiBEdW1wcyB0aGUgc3RhdGUgb2YgYW4gYXVkaW8gcmVjb3JkLgorICAgIC8qIFNldCB0aGUgTWljcm9waG9uZSBkaXJlY3Rpb24gKGZvciBwcm9jZXNzaW5nIHB1cnBvc2VzKS4KICAgICAgKi8KKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOworCisgICAgLyogU2V0IHRoZSBNaWNyb3Bob25lIHpvb20gZmFjdG9yIChmb3IgcHJvY2Vzc2luZyBwdXJwb3NlcykuCisgICAgICovCisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CisKKyAgICAgLyogR2V0IHRoZSB1bmlxdWUgcG9ydCBJRCBhc3NpZ25lZCB0byB0aGlzIEF1ZGlvUmVjb3JkIGluc3RhbmNlIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyLgorICAgICAgKiBUaGUgSUQgaXMgdW5pcXVlIGFjcm9zcyBhbGwgYXVkaW9zZXJ2ZXIgY2xpZW50cyBhbmQgY2FuIGNoYW5nZSBkdXJpbmcgdGhlIGxpZmUgY3ljbGUKKyAgICAgICogb2YgYSBnaXZlbiBBdWRpb1JlY29yZCBpbnN0YW5jZSBpZiB0aGUgY29ubmVjdGlvbiB0byBhdWRpb3NlcnZlciBpcyByZXN0b3JlZC4KKyAgICAgICovCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFBvcnRJZCgpIGNvbnN0IHsgcmV0dXJuIG1Qb3J0SWQ7IH07CisKKyAgICAgLyoKKyAgICAgICogRHVtcHMgdGhlIHN0YXRlIG9mIGFuIGF1ZGlvIHJlY29yZC4KKyAgICAgICovCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgY29uc3Q7CiAKIHByaXZhdGU6CkBAIC01NDgsNyArNTc5LDcgQEAKICAgICBjbGFzcyBBdWRpb1JlY29yZFRocmVhZCA6IHB1YmxpYyBUaHJlYWQKICAgICB7CiAgICAgcHVibGljOgotICAgICAgICBBdWRpb1JlY29yZFRocmVhZChBdWRpb1JlY29yZCYgcmVjZWl2ZXIsIGJvb2wgYkNhbkNhbGxKYXZhID0gZmFsc2UpOworICAgICAgICBBdWRpb1JlY29yZFRocmVhZChBdWRpb1JlY29yZCYgcmVjZWl2ZXIpOwogCiAgICAgICAgIC8vIERvIG5vdCBjYWxsIFRocmVhZDo6cmVxdWVzdEV4aXRBbmRXYWl0KCkgd2l0aG91dCBmaXJzdCBjYWxsaW5nIHJlcXVlc3RFeGl0KCkuCiAgICAgICAgIC8vIFRocmVhZDo6cmVxdWVzdEV4aXRBbmRXYWl0KCkgaXMgbm90IHZpcnR1YWwsIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gZG9lc24ndCBkbyBlbm91Z2guCkBAIC01OTgsNiArNjI5LDggQEAKICAgICBzcDxBdWRpb1JlY29yZFRocmVhZD4gICBtQXVkaW9SZWNvcmRUaHJlYWQ7CiAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgbUxvY2s7CiAKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyPiBtVHJhY2tlcjsKKwogICAgIC8vIEN1cnJlbnQgY2xpZW50IHN0YXRlOiAgZmFsc2UgPSBzdG9wcGVkLCB0cnVlID0gYWN0aXZlLiAgUHJvdGVjdGVkIGJ5IG1Mb2NrLiAgSWYgbW9yZSBzdGF0ZXMKICAgICAvLyBhcmUgYWRkZWQsIGNvbnNpZGVyIGNoYW5naW5nIHRoaXMgdG8gZW51bSBTdGF0ZSB7IC4uLiB9IG1TdGF0ZSBhcyBpbiBBdWRpb1RyYWNrLgogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1BY3RpdmU7CkBAIC02NTQsNiArNjg3LDcgQEAKICAgICBhdWRpb19pbnB1dF9mbGFnc190ICAgICBtT3JpZ0ZsYWdzOyAgICAgICAgICAgICAvLyBhcyBzcGVjaWZpZWQgaW4gY29uc3RydWN0b3Igb3Igc2V0KCksIGNvbnN0CiAKICAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICBtU2Vzc2lvbklkOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Qb3J0SWQ7ICAgICAgICAgICAgICAgICAgICAvLyBJZCBmcm9tIEF1ZGlvIFBvbGljeSBNYW5hZ2VyCiAgICAgdHJhbnNmZXJfdHlwZSAgICAgICAgICAgbVRyYW5zZmVyOwogCiAgICAgLy8gTmV4dCA1IGZpZWxkcyBtYXkgYmUgY2hhbmdlZCBpZiBJQXVkaW9SZWNvcmQgaXMgcmUtY3JlYXRlZCwgYnV0IGFsd2F5cyAhPSAwCkBAIC02NjIsNyArNjk2LDcgQEAKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQ2Jsa01lbW9yeTsKICAgICBhdWRpb190cmFja19jYmxrX3QqICAgICBtQ2JsazsgICAgICAgICAgICAgIC8vIHJlLWxvYWQgYWZ0ZXIgbUxvY2sudW5sb2NrKCkKICAgICBzcDxJTWVtb3J5PiAgICAgICAgICAgICBtQnVmZmVyTWVtb3J5OwotICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1JbnB1dDsgICAgICAgICAgICAgLy8gcmV0dXJuZWQgYnkgQXVkaW9TeXN0ZW06OmdldElucHV0KCkKKyAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtSW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsgLy8gZnJvbSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRmb3JBdHRyKCkKIAogICAgIGludCAgICAgICAgICAgICAgICAgICAgIG1QcmV2aW91c1ByaW9yaXR5OyAgLy8gYmVmb3JlIHN0YXJ0KCkKICAgICBTY2hlZFBvbGljeSAgICAgICAgICAgICBtUHJldmlvdXNTY2hlZHVsaW5nR3JvdXA7CkBAIC03MDEsMTAgKzczNSwxMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFjdGl2aXR5IGFuZCBjb25uZWN0ZWQgZGV2aWNlcwogICAgIHdwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiBtRGV2aWNlQ2FsbGJhY2s7CiAKKyAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IG1TZWxlY3RlZE1pY0RpcmVjdGlvbjsKKyAgICBmbG9hdCBtU2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbjsKKwogcHJpdmF0ZToKICAgICBjbGFzcyBNZWRpYU1ldHJpY3MgewogICAgICAgcHVibGljOgotICAgICAgICBNZWRpYU1ldHJpY3MoKSA6IG1BbmFseXRpY3NJdGVtKG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oImF1ZGlvcmVjb3JkIikpLAorICAgICAgICBNZWRpYU1ldHJpY3MoKSA6IG1BbmFseXRpY3NJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKCJhdWRpb3JlY29yZCIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3JlYXRlZE5zKHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfUkVBTFRJTUUpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhcnRlZE5zKDApLCBtRHVyYXRpb25OcygwKSwgbUNvdW50KDApLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RXJyb3IoTk9fRVJST1IpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9TeXN0ZW0uaAppbmRleCA0YzBmNzk2Li45MjViYzg5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvU3lzdGVtLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1N5c3RlbS5oCkBAIC0xOSw3ICsxOSwxMCBAQAogCiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0lvRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPG1lZGlhL0lBdWRpb0ZsaW5nZXJDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50Lmg+CkBAIC0zNSw5ICszOCwxNCBAQAogCiB0eXBlZGVmIHZvaWQgKCphdWRpb19lcnJvcl9jYWxsYmFjaykoc3RhdHVzX3QgZXJyKTsKIHR5cGVkZWYgdm9pZCAoKmR5bmFtaWNfcG9saWN5X2NhbGxiYWNrKShpbnQgZXZlbnQsIFN0cmluZzggcmVnSWQsIGludCB2YWwpOwotdHlwZWRlZiB2b2lkICgqcmVjb3JkX2NvbmZpZ19jYWxsYmFjaykoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKLSAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7Cit0eXBlZGVmIHZvaWQgKCpyZWNvcmRfY29uZmlnX2NhbGxiYWNrKShpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpOwogCiBjbGFzcyBJQXVkaW9GbGluZ2VyOwogY2xhc3MgSUF1ZGlvUG9saWN5U2VydmljZTsKQEAgLTIwMywxOCArMjExLDIxIEBACiAgICAgLy8KICAgICAvLyBJQXVkaW9Qb2xpY3lTZXJ2aWNlIGludGVyZmFjZSAoc2VlIEF1ZGlvUG9saWN5SW50ZXJmYWNlIGZvciBtZXRob2QgZGVzY3JpcHRpb25zKQogICAgIC8vCisgICAgc3RhdGljIHZvaWQgb25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGUoKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLCBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KTsKICAgICBzdGF0aWMgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgc3RhdGljIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZyk7CiAgICAgc3RhdGljIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKTsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCkBAIC0yMjMsMjEgKzIzNCwxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgc3RhdGljIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICBzdGF0aWMgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgc3RhdGljIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgIHN0YXRpYyB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgLy8gQ2xpZW50IG11c3Qgc3VjY2Vzc2Z1bGx5IGhhbmQgb2ZmIHRoZSBoYW5kbGUgcmVmZXJlbmNlIHRvIEF1ZGlvRmxpbmdlciB2aWEgY3JlYXRlUmVjb3JkKCksCiAgICAgLy8gb3IgcmVsZWFzZSBpdCB3aXRoIHJlbGVhc2VJbnB1dCgpLgogICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLApAQCAtMjQ3LDggKzI1NCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKIAotICAgIHN0YXRpYyBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnNpbGVuY2VkKTsKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgc3RhdGljIHN0YXR1c190IHN0b3BJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgc3RhdGljIHZvaWQgcmVsZWFzZUlucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKQEAgLTI2MSw2ICsyNjcsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworCisgICAgc3RhdGljIHN0YXR1c190IGdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpOworCisgICAgc3RhdGljIHN0YXR1c190IGdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpOworCiAgICAgc3RhdGljIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKICAgICBzdGF0aWMgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogCkBAIC0yNzIsNiArMjg5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCk7CiAgICAgc3RhdGljIHN0YXR1c190IHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKTsKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0RWZmZWN0RW5hYmxlZChpbnQgaWQsIGJvb2wgZW5hYmxlZCk7CisgICAgc3RhdGljIHN0YXR1c190IG1vdmVFZmZlY3RzVG9Jbyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBpZHMsIGF1ZGlvX2lvX2hhbmRsZV90IGlvKTsKIAogICAgIC8vIGNsZWFyIHN0cmVhbSB0byBvdXRwdXQgbWFwcGluZyBjYWNoZSAoZ1N0cmVhbU91dHB1dE1hcCkKICAgICAvLyBhbmQgb3V0cHV0IGNvbmZpZ3VyYXRpb24gY2FjaGUgKGdPdXRwdXRzKQpAQCAtMjg1LDYgKzMwMyw4IEBACiAKICAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0TG93UmFtRGV2aWNlKGJvb2wgaXNMb3dSYW1EZXZpY2UsIGludDY0X3QgdG90YWxNZW1vcnkpOwogCisgICAgc3RhdGljIHN0YXR1c190IHNldEFsbG93ZWRDYXB0dXJlUG9saWN5KHVpZF90IHVpZCwgYXVkaW9fZmxhZ3NfbWFza190IGZsYWdzKTsKKwogICAgIC8vIENoZWNrIGlmIGh3IG9mZmxvYWQgaXMgcG9zc2libGUgZm9yIGdpdmVuIGZvcm1hdCwgc3RyZWFtIHR5cGUsIHNhbXBsZSByYXRlLAogICAgIC8vIGJpdCByYXRlLCBkdXJhdGlvbiwgdmlkZW8gYW5kIHN0cmVhbWluZyBvciBvZmZsb2FkIHByb3BlcnR5IGlzIGVuYWJsZWQKICAgICBzdGF0aWMgYm9vbCBpc09mZmxvYWRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fb2ZmbG9hZF9pbmZvX3QmIGluZm8pOwpAQCAtMzI3LDE5ICszNDcsMjkgQEAKIAogICAgIHN0YXRpYyBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzLCBib29sIHJlZ2lzdHJhdGlvbik7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcyk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpOworCiAgICAgc3RhdGljIHN0YXR1c190IHN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSk7Ci0gICAgc3RhdGljIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOworICAgIHN0YXRpYyBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgc3RhdGljIHN0YXR1c190IHNldE1hc3Rlck1vbm8oYm9vbCBtb25vKTsKICAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0TWFzdGVyTW9ubyhib29sICptb25vKTsKIAorICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpOworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRNYXN0ZXJCYWxhbmNlKGZsb2F0ICpiYWxhbmNlKTsKKwogICAgIHN0YXRpYyBmbG9hdCAgICBnZXRTdHJlYW1Wb2x1bWVEQigKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwogCiAgICAgc3RhdGljIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKIAorICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKTsKKwogICAgIC8vIG51bVN1cnJvdW5kRm9ybWF0cyBob2xkcyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZm9ybWF0cyBhbmQgYm9vbCB2YWx1ZSBhbGxvd2VkIGluIHRoZSBhcnJheS4KICAgICAvLyBXaGVuIG51bVN1cnJvdW5kRm9ybWF0cyBpcyAwLCBzdXJyb3VuZEZvcm1hdHMgYW5kIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgd2lsbCBub3QgYmUKICAgICAvLyBwb3B1bGF0ZWQuIFRoZSBhY3R1YWwgbnVtYmVyIG9mIHN1cnJvdW5kIGZvcm1hdHMgc2hvdWxkIGJlIHJldHVybmVkIGF0IG51bVN1cnJvdW5kRm9ybWF0cy4KQEAgLTM0OSw4ICszNzksNTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwb3J0ZWQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCk7CiAKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCk7CisgICAgc3RhdGljIHN0YXR1c190IHNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKTsKKworICAgIHN0YXRpYyBib29sICAgICBpc0hhcHRpY1BsYXliYWNrU3VwcG9ydGVkKCk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpOworICAgIHN0YXRpYyBzdGF0dXNfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5KTsKKworICAgIHN0YXRpYyBhdWRpb19hdHRyaWJ1dGVzX3Qgc3RyZWFtVHlwZVRvQXR0cmlidXRlcyhhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgc3RhdGljIGF1ZGlvX3N0cmVhbV90eXBlX3QgYXR0cmlidXRlc1RvU3RyZWFtVHlwZShjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpOworCisgICAgc3RhdGljIHN0YXR1c190IGxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpOworCisgICAgc3RhdGljIHN0YXR1c190IGdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgJnZvbHVtZUdyb3VwKTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRSdHRFbmFibGVkKGJvb2wgZW5hYmxlZCk7CisKKyAgICAgLyoqCisgICAgICogU2VuZCBhdWRpbyBIQUwgc2VydmVyIHByb2Nlc3MgcGlkcyB0byBuYXRpdmUgYXVkaW9zZXJ2ZXIgcHJvY2VzcyBmb3IgdXNlCisgICAgICogd2hlbiBnZW5lcmF0aW5nIGF1ZGlvIEhBTCBzZXJ2ZXJzIHRvbWJzdG9uZXMKKyAgICAgKi8KKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0QXVkaW9IYWxQaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHBpZF90PiYgcGlkcyk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3Qgc2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKTsKKworICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpOworCisgICAgc3RhdGljIHN0YXR1c190IGdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSk7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKTsKKwogICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorICAgIGNsYXNzIEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayA6IHB1YmxpYyBSZWZCYXNlCisgICAgeworICAgIHB1YmxpYzoKKworICAgICAgICBBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soKSB7fQorICAgICAgICB2aXJ0dWFsIH5BdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soKSB7fQorCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpID0gMDsKKyAgICAgICAgdmlydHVhbCB2b2lkIG9uU2VydmljZURpZWQoKSA9IDA7CisKKyAgICB9OworCisgICAgc3RhdGljIHN0YXR1c190IGFkZEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayhjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjayk7CisgICAgc3RhdGljIHN0YXR1c190IHJlbW92ZUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayhjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjayk7CisKICAgICBjbGFzcyBBdWRpb1BvcnRDYWxsYmFjayA6IHB1YmxpYyBSZWZCYXNlCiAgICAgewogICAgIHB1YmxpYzoKQEAgLTM3OSw5ICs0NjAsMTEgQEAKICAgICB9OwogCiAgICAgc3RhdGljIHN0YXR1c190IGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHN0YXRpYyBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgIHN0YXRpYyBhdWRpb19wb3J0X2hhbmRsZV90IGdldERldmljZUlkRm9ySW8oYXVkaW9faW9faGFuZGxlX3QgYXVkaW9Jbyk7CiAKQEAgLTQxMiwxNyArNDk1LDIwIEBACiAKIAogICAgICAgICBzdGF0dXNfdCBhZGRBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHdwPEF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9Jbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICAgICAgc3RhdHVzX3QgcmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9Jbyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXREZXZpY2VJZEZvcklvKGF1ZGlvX2lvX2hhbmRsZV90IGF1ZGlvSW8pOwogCiAgICAgcHJpdmF0ZToKICAgICAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CiAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdCwgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+ID4gICBtSW9EZXNjcmlwdG9yczsKLSAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90LCBWZWN0b3IgPCB3cDxBdWRpb0RldmljZUNhbGxiYWNrPiA+ID4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrczsKKworICAgICAgICBzdGQ6Om1hcDxhdWRpb19pb19oYW5kbGVfdCwgc3RkOjptYXA8YXVkaW9fcG9ydF9oYW5kbGVfdCwgd3A8QXVkaW9EZXZpY2VDYWxsYmFjaz4+PgorICAgICAgICAgICAgICAgIG1BdWRpb0RldmljZUNhbGxiYWNrczsKICAgICAgICAgLy8gY2FjaGVkIHZhbHVlcyBmb3IgcmVjb3JkaW5nIGdldElucHV0QnVmZmVyU2l6ZSgpIHF1ZXJpZXMKICAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluQnVmZlNpemU7ICAgIC8vIHplcm8gaW5kaWNhdGVzIGNhY2hlIGlzIGludmFsaWQKICAgICAgICAgdWludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluU2FtcGxpbmdSYXRlOwpAQCAtNDQyLDIxICs1MjgsMzEgQEAKICAgICAgICAgaW50IHJlbW92ZUF1ZGlvUG9ydENhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvUG9ydENhbGxiYWNrPiYgY2FsbGJhY2spOwogICAgICAgICBib29sIGlzQXVkaW9Qb3J0Q2JFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gKG1BdWRpb1BvcnRDYWxsYmFja3Muc2l6ZSgpICE9IDApOyB9CiAKKyAgICAgICAgaW50IGFkZEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjayhjb25zdCBzcDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+JiBjYWxsYmFjayk7CisgICAgICAgIGludCByZW1vdmVBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrPiYgY2FsbGJhY2spOworICAgICAgICBib29sIGlzQXVkaW9Wb2x1bWVHcm91cENiRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIChtQXVkaW9Wb2x1bWVHcm91cENhbGxiYWNrLnNpemUoKSAhPSAwKTsgfQorCiAgICAgICAgIC8vIERlYXRoUmVjaXBpZW50CiAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOwogCiAgICAgICAgIC8vIElBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQKICAgICAgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKTsKICAgICAgICAgdmlydHVhbCB2b2lkIG9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKFN0cmluZzggcmVnSWQsIGludDMyX3Qgc3RhdGUpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKIAogICAgIHByaXZhdGU6CiAgICAgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwogICAgICAgICBWZWN0b3IgPHNwIDxBdWRpb1BvcnRDYWxsYmFjaz4gPiAgICBtQXVkaW9Qb3J0Q2FsbGJhY2tzOworICAgICAgICBWZWN0b3IgPHNwIDxBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2s+ID4gbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFjazsKICAgICB9OwogCiAgICAgc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVGltZXN0YW1wLmgKaW5kZXggNDk4ZGU4ZS4uZTU5MjVkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RpbWVzdGFtcC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9UaW1lc3RhbXAuaApAQCAtMTM1LDggKzEzNSwyMyBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCisgICAgZG91YmxlIGdldE91dHB1dFNlcnZlckxhdGVuY3lNcyh1aW50MzJfdCBzYW1wbGVSYXRlKSBjb25zdCB7CisgICAgICAgIHJldHVybiBnZXRMYXRlbmN5TXMoc2FtcGxlUmF0ZSwgTE9DQVRJT05fU0VSVkVSLCBMT0NBVElPTl9LRVJORUwpOworICAgIH0KKworICAgIGRvdWJsZSBnZXRMYXRlbmN5TXModWludDMyX3Qgc2FtcGxlUmF0ZSwgTG9jYXRpb24gbG9jYXRpb24xLCBMb2NhdGlvbiBsb2NhdGlvbjIpIGNvbnN0IHsKKyAgICAgICAgaWYgKHNhbXBsZVJhdGUgPiAwICYmIG1UaW1lTnNbbG9jYXRpb24xXSA+IDAgJiYgbVRpbWVOc1tsb2NhdGlvbjJdID4gMCkgeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBmcmFtZURpZmZlcmVuY2UgPQorICAgICAgICAgICAgICAgICAgICBtUG9zaXRpb25bbG9jYXRpb24xXSAtIG1Qb3NpdGlvbltsb2NhdGlvbjJdOworICAgICAgICAgICAgY29uc3QgaW50NjRfdCB0aW1lRGlmZmVyZW5jZU5zID0KKyAgICAgICAgICAgICAgICAgICAgbVRpbWVOc1tsb2NhdGlvbjFdIC0gbVRpbWVOc1tsb2NhdGlvbjJdOworICAgICAgICAgICAgcmV0dXJuICgoZG91YmxlKWZyYW1lRGlmZmVyZW5jZSAqIDFlOSAvIHNhbXBsZVJhdGUgLSB0aW1lRGlmZmVyZW5jZU5zKSAqIDFlLTY7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDAuOworICAgIH0KKwogICAgIC8vIGNvbnZlcnQgZmllbGRzIHRvIGEgcHJpbnRhYmxlIHN0cmluZwotICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgeworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3QgewogICAgICAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKIAogICAgICAgICBzcyA8PCAiQk9PVFRJTUUgb2Zmc2V0ICIgPDwgbVRpbWViYXNlT2Zmc2V0W1RJTUVCQVNFX0JPT1RUSU1FXSA8PCAiXG4iOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9BdWRpb1RyYWNrLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAppbmRleCA1OWM2ZjRjLi5jNjA3OTE4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVHJhY2suaApAQCAtNzQsNiArNzQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIG1hcHBpbmcgZnJvbSBmcmFtZSBwb3NpdGlvbiB0byBwcmVzZW50YXRpb24gdGltZS4KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSBBdWRpb1RpbWVzdGFtcCBmb3IgdGhlIGluZm9ybWF0aW9uIGluY2x1ZGVkIHdpdGggZXZlbnQuCiAjZW5kaWYKKyAgICAgICAgRVZFTlRfQ0FOX1dSSVRFX01PUkVfREFUQSA9IDksLy8gTm90aWZpY2F0aW9uIHRoYXQgbW9yZSBkYXRhIGNhbiBiZSBnaXZlbiBieSB3cml0ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGV2ZW50IG9ubHkgb2NjdXJzIGZvciBUUkFOU0ZFUl9TWU5DX05PVElGX0NBTExCQUNLLgogICAgIH07CiAKICAgICAvKiBDbGllbnQgc2hvdWxkIGRlY2xhcmUgYSBCdWZmZXIgYW5kIHBhc3MgdGhlIGFkZHJlc3MgdG8gb2J0YWluQnVmZmVyKCkKQEAgLTEwNSw2ICsxMDcsMTEgQEAKICAgICAgICAgICAgIGludDE2X3QqICAgIGkxNjsgICAgICAvLyBzaWduZWQgMTYtYml0CiAgICAgICAgICAgICBpbnQ4X3QqICAgICBpODsgICAgICAgLy8gdW5zaWduZWQgOC1iaXQsIG9mZnNldCBieSAweDgwCiAgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5wdXQgdG8gb2J0YWluQnVmZmVyKCk6IHVudXNlZCwgb3V0cHV0OiBwb2ludGVyIHRvIGJ1ZmZlcgorCisgICAgICAgIHVpbnQzMl90ICAgIHNlcXVlbmNlOyAgICAgICAvLyBJQXVkaW9UcmFjayBpbnN0YW5jZSBzZXF1ZW5jZSBudW1iZXIsIGFzIG9mIG9idGFpbkJ1ZmZlcigpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXQgaXMgc2V0IGJ5IG9idGFpbkJ1ZmZlcigpIGFuZCBjb25maXJtZWQgYnkgcmVsZWFzZUJ1ZmZlcigpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ICJ1c2VyLXNlcnZpY2VhYmxlIi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8gQ29uc2lkZXIgc3A8SU1lbW9yeT4gaW5zdGVhZCwgb3IgaW4gYWRkaXRpb24gdG8gdGhpcy4KICAgICB9OwogCiAgICAgLyogQXMgYSBjb252ZW5pZW5jZSwgaWYgYSBjYWxsYmFjayBpcyBzdXBwbGllZCwgYSBoYW5kbGVyIHRocmVhZApAQCAtMTQ1LDYgKzE1MiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlKTsKIAorICAgIC8qIENoZWNrIGlmIGRpcmVjdCBwbGF5YmFjayBpcyBwb3NzaWJsZSBmb3IgdGhlIGdpdmVuIGF1ZGlvIGNvbmZpZ3VyYXRpb24gYW5kIGF0dHJpYnV0ZXMuCisgICAgICogUmV0dXJuIHRydWUgaWYgb3V0cHV0IGlzIHBvc3NpYmxlIGZvciB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCisgICAgICovCisgICAgc3RhdGljIGJvb2wgaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcyk7CisKICAgICAvKiBIb3cgZGF0YSBpcyB0cmFuc2ZlcnJlZCB0byBBdWRpb1RyYWNrCiAgICAgICovCiAgICAgZW51bSB0cmFuc2Zlcl90eXBlIHsKQEAgLTE1Myw2ICsxNjYsNyBAQAogICAgICAgICBUUkFOU0ZFUl9PQlRBSU4sICAgIC8vIGNhbGwgb2J0YWluQnVmZmVyKCkgYW5kIHJlbGVhc2VCdWZmZXIoKQogICAgICAgICBUUkFOU0ZFUl9TWU5DLCAgICAgIC8vIHN5bmNocm9ub3VzIHdyaXRlKCkKICAgICAgICAgVFJBTlNGRVJfU0hBUkVELCAgICAvLyBzaGFyZWQgbWVtb3J5CisgICAgICAgIFRSQU5TRkVSX1NZTkNfTk9USUZfQ0FMTEJBQ0ssIC8vIHN5bmNocm9ub3VzIHdyaXRlKCksIG5vdGlmIEVWRU5UX0NBTl9XUklURV9NT1JFX0RBVEEKICAgICB9OwogCiAgICAgLyogQ29uc3RydWN0cyBhbiB1bmluaXRpYWxpemVkIEF1ZGlvVHJhY2suIE5vIGNvbm5lY3Rpb24gd2l0aApAQCAtMjk1LDYgKzMwOSw4IEBACiAgICAgICogUGFyYW1ldGVycyBub3QgbGlzdGVkIGluIHRoZSBBdWRpb1RyYWNrIGNvbnN0cnVjdG9ycyBhYm92ZToKICAgICAgKgogICAgICAqIHRocmVhZENhbkNhbGxKYXZhOiAgV2hldGhlciBjYWxsYmFja3MgYXJlIG1hZGUgZnJvbSBhbiBhdHRhY2hlZCB0aHJlYWQgYW5kIHRodXMgY2FuIGNhbGwgSk5JLgorICAgICAqICAgICAgT25seSBzZXQgdG8gdHJ1ZSB3aGVuIEF1ZGlvVHJhY2sgb2JqZWN0IGlzIHVzZWQgZm9yIGEgamF2YSBhbmRyb2lkLm1lZGlhLkF1ZGlvVHJhY2sKKyAgICAgKiAgICAgIGluIGl0cyBKTkkgY29kZS4KICAgICAgKgogICAgICAqIEludGVybmFsIHN0YXRlIHBvc3QgY29uZGl0aW9uOgogICAgICAqICAgICAgKG1TdHJlYW1UeXBlID09IEFVRElPX1NUUkVBTV9ERUZBVUxUKSBpbXBsaWVzIHRoaXMgQXVkaW9UcmFjayBoYXMgdmFsaWQgYXR0cmlidXRlcwpAQCAtNjgxLDE0ICs2OTcsMTcgQEAKICAgICAgKiAgZnJhbWVDb3VudCAgbnVtYmVyIG9mIFtlbXB0eSBzbG90cyBmb3JdIGZyYW1lcyByZXF1ZXN0ZWQKICAgICAgKiAgc2l6ZSAgICAgICAgaWdub3JlZAogICAgICAqICByYXcgICAgICAgICBpZ25vcmVkCisgICAgICogIHNlcXVlbmNlICAgIGlnbm9yZWQKICAgICAgKiBBZnRlciBlcnJvciByZXR1cm46CiAgICAgICogIGZyYW1lQ291bnQgIDAKICAgICAgKiAgc2l6ZSAgICAgICAgMAogICAgICAqICByYXcgICAgICAgICB1bmRlZmluZWQKKyAgICAgKiAgc2VxdWVuY2UgICAgdW5kZWZpbmVkCiAgICAgICogQWZ0ZXIgc3VjY2Vzc2Z1bCByZXR1cm46CiAgICAgICogIGZyYW1lQ291bnQgIGFjdHVhbCBudW1iZXIgb2YgW2VtcHR5IHNsb3RzIGZvcl0gZnJhbWVzIGF2YWlsYWJsZSwgPD0gbnVtYmVyIHJlcXVlc3RlZAogICAgICAqICBzaXplICAgICAgICBhY3R1YWwgbnVtYmVyIG9mIGJ5dGVzIGF2YWlsYWJsZQogICAgICAqICByYXcgICAgICAgICBwb2ludGVyIHRvIHRoZSBidWZmZXIKKyAgICAgKiAgc2VxdWVuY2UgICAgSUF1ZGlvVHJhY2sgaW5zdGFuY2Ugc2VxdWVuY2UgbnVtYmVyLCBhcyBvZiBvYnRhaW5CdWZmZXIoKQogICAgICAqLwogICAgICAgICAgICAgc3RhdHVzX3QgICAgb2J0YWluQnVmZmVyKEJ1ZmZlciogYXVkaW9CdWZmZXIsIGludDMyX3Qgd2FpdENvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKm5vbkNvbnRpZyA9IE5VTEwpOwpAQCAtOTA3LDcgKzkyNiwxNCBAQAogICAgICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICAgICAgICAgICAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX0FDVElWRSB8fCBtU3RhdGUgPT0gU1RBVEVfU1RPUFBJTkc7CiAgICAgICAgICAgICB9Ci1wcm90ZWN0ZWQ6CisKKyAgICAvKiBHZXQgdGhlIHVuaXF1ZSBwb3J0IElEIGFzc2lnbmVkIHRvIHRoaXMgQXVkaW9UcmFjayBpbnN0YW5jZSBieSBhdWRpbyBwb2xpY3kgbWFuYWdlci4KKyAgICAgKiBUaGUgSUQgaXMgdW5pcXVlIGFjcm9zcyBhbGwgYXVkaW9zZXJ2ZXIgY2xpZW50cyBhbmQgY2FuIGNoYW5nZSBkdXJpbmcgdGhlIGxpZmUgY3ljbGUKKyAgICAgKiBvZiBhIGdpdmVuIEF1ZGlvVHJhY2sgaW5zdGFuY2UgaWYgdGhlIGNvbm5lY3Rpb24gdG8gYXVkaW9zZXJ2ZXIgaXMgcmVzdG9yZWQuCisgICAgICovCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldFBvcnRJZCgpIGNvbnN0IHsgcmV0dXJuIG1Qb3J0SWQ7IH07CisKKyBwcm90ZWN0ZWQ6CiAgICAgLyogY29weWluZyBhdWRpbyB0cmFja3MgaXMgbm90IGFsbG93ZWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvVHJhY2soY29uc3QgQXVkaW9UcmFjayYgb3RoZXIpOwogICAgICAgICAgICAgQXVkaW9UcmFjayYgb3BlcmF0b3IgPSAoY29uc3QgQXVkaW9UcmFjayYgb3RoZXIpOwpAQCAtOTE2LDcgKzk0Miw3IEBACiAgICAgY2xhc3MgQXVkaW9UcmFja1RocmVhZCA6IHB1YmxpYyBUaHJlYWQKICAgICB7CiAgICAgcHVibGljOgotICAgICAgICBBdWRpb1RyYWNrVGhyZWFkKEF1ZGlvVHJhY2smIHJlY2VpdmVyLCBib29sIGJDYW5DYWxsSmF2YSA9IGZhbHNlKTsKKyAgICAgICAgQXVkaW9UcmFja1RocmVhZChBdWRpb1RyYWNrJiByZWNlaXZlcik7CiAKICAgICAgICAgLy8gRG8gbm90IGNhbGwgVGhyZWFkOjpyZXF1ZXN0RXhpdEFuZFdhaXQoKSB3aXRob3V0IGZpcnN0IGNhbGxpbmcgcmVxdWVzdEV4aXQoKS4KICAgICAgICAgLy8gVGhyZWFkOjpyZXF1ZXN0RXhpdEFuZFdhaXQoKSBpcyBub3QgdmlydHVhbCwgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGRvIGVub3VnaC4KQEAgLTEwMDMsNyArMTAyOSw3IEBACiAgICAgc3A8SUF1ZGlvVHJhY2s+ICAgICAgICAgbUF1ZGlvVHJhY2s7CiAgICAgc3A8SU1lbW9yeT4gICAgICAgICAgICAgbUNibGtNZW1vcnk7CiAgICAgYXVkaW9fdHJhY2tfY2Jsa190KiAgICAgbUNibGs7ICAgICAgICAgICAgICAgICAgLy8gcmUtbG9hZCBhZnRlciBtTG9jay51bmxvY2soKQotICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgIG1PdXRwdXQ7ICAgICAgICAgICAgICAgIC8vIHJldHVybmVkIGJ5IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKCkKKyAgICBhdWRpb19pb19oYW5kbGVfdCAgICAgICBtT3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7IC8vIGZyb20gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoKQogCiAgICAgc3A8QXVkaW9UcmFja1RocmVhZD4gICAgbUF1ZGlvVHJhY2tUaHJlYWQ7CiAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVRocmVhZENhbkNhbGxKYXZhOwpAQCAtMTA1OCw2ICsxMDg0LDE5IEBACiAgICAgICAgIFNUQVRFX1NUT1BQSU5HLAogICAgIH0gICAgICAgICAgICAgICAgICAgICAgIG1TdGF0ZTsKIAorICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqc3RhdGVUb1N0cmluZyhTdGF0ZSBzdGF0ZSkKKyAgICB7CisgICAgICAgIHN3aXRjaCAoc3RhdGUpIHsKKyAgICAgICAgY2FzZSBTVEFURV9BQ1RJVkU6ICAgICAgICAgIHJldHVybiAiU1RBVEVfQUNUSVZFIjsKKyAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEOiAgICAgICAgIHJldHVybiAiU1RBVEVfU1RPUFBFRCI7CisgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOiAgICAgICAgICByZXR1cm4gIlNUQVRFX1BBVVNFRCI7CisgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEX1NUT1BQSU5HOiByZXR1cm4gIlNUQVRFX1BBVVNFRF9TVE9QUElORyI7CisgICAgICAgIGNhc2UgU1RBVEVfRkxVU0hFRDogICAgICAgICByZXR1cm4gIlNUQVRFX0ZMVVNIRUQiOworICAgICAgICBjYXNlIFNUQVRFX1NUT1BQSU5HOiAgICAgICAgcmV0dXJuICJTVEFURV9TVE9QUElORyI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gIlVOS05PV04iOworICAgICAgICB9CisgICAgfQorCiAgICAgLy8gZm9yIGNsaWVudCBjYWxsYmFjayBoYW5kbGVyCiAgICAgY2FsbGJhY2tfdCAgICAgICAgICAgICAgbUNiZjsgICAgICAgICAgICAgICAgICAgLy8gY2FsbGJhY2sgaGFuZGxlciBmb3IgZXZlbnRzLCBvciBOVUxMCiAgICAgdm9pZCogICAgICAgICAgICAgICAgICAgbVVzZXJEYXRhOwpAQCAtMTEyMCw4ICsxMTU5LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQXVkaW9UcmFja3MuCiAKICAgICBib29sICAgICAgICAgICAgICAgICAgICBtUHJldmlvdXNUaW1lc3RhbXBWYWxpZDsvLyB0cnVlIGlmIG1QcmV2aW91c1RpbWVzdGFtcCBpcyB2YWxpZAotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQ7IC8vIHJlZHVjZSBsb2cgc3BhbQotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1SZXRyb2dyYWRlTW90aW9uUmVwb3J0ZWQ7IC8vIHJlZHVjZSBsb2cgc3BhbQorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBTdGFydHVwR2xpdGNoUmVwb3J0ZWQ7ICAgICAgLy8gcmVkdWNlIGxvZyBzcGFtCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFJldHJvZ3JhZGVQb3NpdGlvblJlcG9ydGVkOyAvLyByZWR1Y2UgbG9nIHNwYW0KKyAgICBib29sICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wUmV0cm9ncmFkZVRpbWVSZXBvcnRlZDsgICAgIC8vIHJlZHVjZSBsb2cgc3BhbQorICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBTdGFsbFJlcG9ydGVkOyAgICAgICAgICAgICAgLy8gcmVkdWNlIGxvZyBzcGFtCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFN0YWxlVGltZVJlcG9ydGVkOyAgICAgICAgICAvLyByZWR1Y2UgbG9nIHNwYW0KICAgICBBdWRpb1RpbWVzdGFtcCAgICAgICAgICBtUHJldmlvdXNUaW1lc3RhbXA7ICAgICAvLyB1c2VkIHRvIGRldGVjdCByZXRyb2dyYWRlIG1vdGlvbgogICAgIEV4dGVuZGVkVGltZXN0YW1wOjpMb2NhdGlvbiBtUHJldmlvdXNMb2NhdGlvbjsgIC8vIGxvY2F0aW9uIHVzZWQgZm9yIHByZXZpb3VzIHRpbWVzdGFtcAogCkBAIC0xMTQ4LDYgKzExOTAsNyBAQAogCiAgICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgbVNlc3Npb25JZDsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtQXV4RWZmZWN0SWQ7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbVBvcnRJZDsgICAgICAgICAgICAgICAgICAgIC8vIElkIGZyb20gQXVkaW8gUG9saWN5IE1hbmFnZXIKIAogICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgIG1Mb2NrOwogCkBAIC0xMTk1LDcgKzEyMzgsNyBAQAogcHJpdmF0ZToKICAgICBjbGFzcyBNZWRpYU1ldHJpY3MgewogICAgICAgcHVibGljOgotICAgICAgICBNZWRpYU1ldHJpY3MoKSA6IG1BbmFseXRpY3NJdGVtKG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oImF1ZGlvdHJhY2siKSkgeworICAgICAgICBNZWRpYU1ldHJpY3MoKSA6IG1BbmFseXRpY3NJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKCJhdWRpb3RyYWNrIikpIHsKICAgICAgICAgfQogICAgICAgICB+TWVkaWFNZXRyaWNzKCkgewogICAgICAgICAgICAgLy8gbUFuYWx5dGljc0l0ZW0gYWxsb2MgZmFpbHVyZSB3aWxsIGJlIGZsYWdnZWQgaW4gdGhlIGNvbnN0cnVjdG9yCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvQXVkaW9Wb2x1bWVHcm91cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhNmVhMDcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQXVkaW9Wb2x1bWVHcm91cCA6IHB1YmxpYyBQYXJjZWxhYmxlCit7CitwdWJsaWM6CisgICAgQXVkaW9Wb2x1bWVHcm91cCgpIHt9CisgICAgQXVkaW9Wb2x1bWVHcm91cChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90IGdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlc1ZlY3RvciAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbXMpIDoKKyAgICAgICAgbU5hbWUobmFtZSksIG1Hcm91cElkKGdyb3VwKSwgbUF1ZGlvQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwgbVN0cmVhbXMoc3RyZWFtcykge30KKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKyAgICB2b2x1bWVfZ3JvdXBfdCBnZXRJZCgpIGNvbnN0IHsgcmV0dXJuIG1Hcm91cElkOyB9CisgICAgQXR0cmlidXRlc1ZlY3RvciBnZXRBdWRpb0F0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBtQXVkaW9BdHRyaWJ1dGVzOyB9CisgICAgU3RyZWFtVHlwZVZlY3RvciBnZXRTdHJlYW1UeXBlcygpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1zOyB9CisKKyAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgbU5hbWU7CisgICAgdm9sdW1lX2dyb3VwX3QgbUdyb3VwSWQgPSBWT0xVTUVfR1JPVVBfTk9ORTsKKyAgICBBdHRyaWJ1dGVzVmVjdG9yIG1BdWRpb0F0dHJpYnV0ZXM7CisgICAgU3RyZWFtVHlwZVZlY3RvciBtU3RyZWFtczsKK307CisKK3VzaW5nIEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgPSBzdGQ6OnZlY3RvcjxBdWRpb1ZvbHVtZUdyb3VwPjsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9FeHRlbmRlZEF1ZGlvQnVmZmVyUHJvdmlkZXIuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyLmgKcmVuYW1lIHRvIG1lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvRmxpbmdlci5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKaW5kZXggZTZiZjcyZi4uMWMzNWZmMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9GbGluZ2VyLmgKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0NsaWVudC5oPgorI2luY2x1ZGUgPG1lZGlhL0RldmljZURlc2NyaXB0b3JCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSUF1ZGlvVHJhY2suaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9GbGluZ2VyQ2xpZW50Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CkBAIC0xNDYsNiArMTQ3LDcgQEAKICAgICAgICAgICAgIGFmU2FtcGxlUmF0ZSA9IHBhcmNlbC0+cmVhZEludDY0KCk7CiAgICAgICAgICAgICBhZkxhdGVuY3lNcyA9IHBhcmNlbC0+cmVhZEludDMyKCk7CiAgICAgICAgICAgICAodm9pZClwYXJjZWwtPnJlYWQoJm91dHB1dElkLCBzaXplb2YoYXVkaW9faW9faGFuZGxlX3QpKTsKKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmcG9ydElkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTE2Myw2ICsxNjUsNyBAQAogICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZUludDY0KGFmU2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50MzIoYWZMYXRlbmN5TXMpOwogICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmb3V0cHV0SWQsIHNpemVvZihhdWRpb19pb19oYW5kbGVfdCkpOworICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmcG9ydElkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTE3OSw2ICsxODIsNyBAQAogICAgICAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7CiAgICAgICAgIHVpbnQzMl90IGFmTGF0ZW5jeU1zOwogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRJZDsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQ7CiAgICAgfTsKIAogICAgIC8qIENyZWF0ZVJlY29yZElucHV0IGNvbnRhaW5zIGFsbCBpbnB1dCBhcmd1bWVudHMgc2VudCBieSBBdWRpb1JlY29yZCB0byBBdWRpb0ZsaW5nZXIKQEAgLTIwMiw2ICsyMDYsOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUgPSBwYXJjZWwtPnJlYWRTdHJpbmcxNigpOworICAgICAgICAgICAgaWYgKHBhcmNlbC0+cmVhZCgmcmlpZCwgc2l6ZW9mKGF1ZGlvX3VuaXF1ZV9pZF90KSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8qIGlucHV0L291dHB1dCBhcmd1bWVudHMqLwogICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT5yZWFkKCZmbGFncywgc2l6ZW9mKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKTsKQEAgLTIxOCw2ICsyMjUsNyBAQAogICAgICAgICAgICAgKHZvaWQpcGFyY2VsLT53cml0ZSgmY29uZmlnLCBzaXplb2YoYXVkaW9fY29uZmlnX2Jhc2VfdCkpOwogICAgICAgICAgICAgKHZvaWQpY2xpZW50SW5mby53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CiAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlU3RyaW5nMTYob3BQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZyaWlkLCBzaXplb2YoYXVkaW9fdW5pcXVlX2lkX3QpKTsKIAogICAgICAgICAgICAgLyogaW5wdXQvb3V0cHV0IGFyZ3VtZW50cyovCiAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZmbGFncywgc2l6ZW9mKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKTsKQEAgLTIzMyw2ICsyNDEsNyBAQAogICAgICAgICBhdWRpb19jb25maWdfYmFzZV90IGNvbmZpZzsKICAgICAgICAgQXVkaW9DbGllbnQgY2xpZW50SW5mbzsKICAgICAgICAgU3RyaW5nMTYgb3BQYWNrYWdlTmFtZTsKKyAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZDsKIAogICAgICAgICAvKiBpbnB1dC9vdXRwdXQgKi8KICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFnczsKQEAgLTI3MSw2ICsyODAsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICh2b2lkKXBhcmNlbC0+cmVhZCgmcG9ydElkLCBzaXplb2YoYXVkaW9fcG9ydF9oYW5kbGVfdCkpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKQEAgLTI5Nyw2ICszMDcsNyBAQAogICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlSW50MzIoMCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAodm9pZClwYXJjZWwtPndyaXRlKCZwb3J0SWQsIHNpemVvZihhdWRpb19wb3J0X2hhbmRsZV90KSk7CiAKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQpAQCAtMzEzLDYgKzMyNCw3IEBACiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0SWQ7CiAgICAgICAgIHNwPElNZW1vcnk+IGNibGs7CiAgICAgICAgIHNwPElNZW1vcnk+IGJ1ZmZlcnM7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkOwogICAgIH07CiAKICAgICAvLyBpbnZhcmlhbnQgb24gZXhpdCBmb3IgYWxsIEFQSXMgdGhhdCByZXR1cm4gYW4gc3A8PjoKQEAgLTM1Myw2ICszNjUsOSBAQAogICAgIHZpcnR1YWwgICAgIGZsb2F0ICAgICAgIG1hc3RlclZvbHVtZSgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBtYXN0ZXJNdXRlKCkgY29uc3QgPSAwOwogCisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSA9IDA7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgZ2V0TWFzdGVyQmFsYW5jZShmbG9hdCAqYmFsYW5jZSkgY29uc3QgPSAwOworCiAgICAgLyogc2V0L2dldCBzdHJlYW0gdHlwZSBzdGF0ZS4gVGhpcyB3aWxsIHByb2JhYmx5IGJlIHVzZWQgYnkKICAgICAgKiB0aGUgcHJlZmVyZW5jZSBwYW5lbCwgbW9zdGx5LgogICAgICAqLwpAQCAtMzkwLDggKzQwNSw3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+JiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpsYXRlbmN5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKSA9IDA7CiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBvcGVuRHVwbGljYXRlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dDEsCkBAIC00MjgsNyArNDQyLDkgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgY29uc3QgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVVUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSBjb25zdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBUeXBlVVVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSBjb25zdCA9IDA7CiAKICAgICB2aXJ0dWFsIHNwPElFZmZlY3Q+IGNyZWF0ZUVmZmVjdCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjLApAQCAtNDM3LDYgKzQ1Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb0ZsaW5nZXIgZG9lc24ndCB0YWtlIG92ZXIgaGFuZGxlIHJlZmVyZW5jZSBmcm9tIGNsaWVudAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjYWxsaW5nUGFja2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCkBAIC00NDYsNiArNDYzLDEwIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBtb3ZlRWZmZWN0cyhhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwgYXVkaW9faW9faGFuZGxlX3Qgc3JjT3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0KSA9IDA7CiAKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RWZmZWN0U3VzcGVuZGVkKGludCBlZmZlY3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmRlZCkgPSAwOworCiAgICAgdmlydHVhbCBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbG9hZEh3TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpID0gMDsKIAogICAgIC8vIGhlbHBlcnMgZm9yIGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyLmdldFByb3BlcnR5KCksIHNlZSBkZXNjcmlwdGlvbiB0aGVyZSBmb3IgbWVhbmluZwpAQCAtNDkxLDYgKzUxMiw4IEBACiAKICAgICAvKiBMaXN0IGF2YWlsYWJsZSBtaWNyb3Bob25lcyBhbmQgdGhlaXIgY2hhcmFjdGVyaXN0aWNzICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb0hhbFBpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8cGlkX3Q+JiBwaWRzKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZS5oIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKaW5kZXggYzM4NzZhZi4uM2VkYWMzMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTIwLDE1ICsyMCwxNSBAQAogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHVuaXN0ZC5oPgotCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KICNpbmNsdWRlIDxtZWRpYS9JQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50Lmg+Ci0KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQyLDIxICs0MiwyNCBAQAogICAgIC8vCiAgICAgLy8gSUF1ZGlvUG9saWN5U2VydmljZSBpbnRlcmZhY2UgKHNlZSBBdWRpb1BvbGljeUludGVyZmFjZSBmb3IgbWV0aG9kIGRlc2NyaXB0aW9ucykKICAgICAvLworICAgIHZpcnR1YWwgdm9pZCBvbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZSgpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpID0gMDsKICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykgPSAwOwogICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpID0gMDsKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKQEAgLTY1LDE4ICs2OCwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+ICpzZWNvbmRhcnlPdXRwdXRzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCAgZ2V0SW5wdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKQEAgLTg1LDggKzg0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpzaWxlbmNlZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKQEAgLTk4LDYgKzk2LDE3IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdHJlYW1Wb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpID0gMDsKKwogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7CiAgICAgdmlydHVhbCBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykgPSAwOwpAQCAtMTA4LDYgKzExNyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBtb3ZlRWZmZWN0c1RvSW8oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaWRzLCBhdWRpb19pb19oYW5kbGVfdCBpbykgPSAwOwogICAgIHZpcnR1YWwgYm9vbCAgICAgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgYm9vbCAgICAgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA9IDA7CkBAIC0xMTUsMTAgKzEyNSwyOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QWxsb3dlZENhcHR1cmVQb2xpY3kodWlkX3QgdWlkLCBhdWRpb19mbGFnc19tYXNrX3QgZmxhZ3MpID0gMDsKICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaXMgcG9zc2libGUgZm9yIGdpdmVuIGZvcm1hdCwgc3RyZWFtIHR5cGUsIHNhbXBsZSByYXRlLAogICAgIC8vIGJpdCByYXRlLCBkdXJhdGlvbiwgdmlkZW8gYW5kIHN0cmVhbWluZyBvciBvZmZsb2FkIHByb3BlcnR5IGlzIGVuYWJsZWQKICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBpbmZvKSA9IDA7CiAKKyAgICAvLyBDaGVjayBpZiBkaXJlY3QgcGxheWJhY2sgaXMgcG9zc2libGUgZm9yIGdpdmVuIGZvcm1hdCwgc2FtcGxlIHJhdGUsIGNoYW5uZWwgbWFzayBhbmQgZmxhZ3MuCisgICAgdmlydHVhbCBib29sIGlzRGlyZWN0T3V0cHV0U3VwcG9ydGVkKGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKSA9IDA7CisKICAgICAvKiBMaXN0IGF2YWlsYWJsZSBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCkBAIC0xNDcsNiArMTc2LDggQEAKIAogICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCkgPSAwOwogCisgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCkgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKSA9IDA7CkBAIC0xNTcsMTAgKzE4OCwxNSBAQAogCiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzLCBib29sIHJlZ2lzdHJhdGlvbikgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQorICAgICAgICAgICAgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCkgPSAwOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTW9ubyhib29sIG1vbm8pID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck1vbm8oYm9vbCAqbW9ubykgPSAwOwpAQCAtMTcxLDcgKzIwNywzMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICpzdXJyb3VuZEZvcm1hdHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqc3Vycm91bmRGb3JtYXRzRW5hYmxlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cykgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0LCBib29sIGVuYWJsZWQpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QTExeVNlcnZpY2VzVWlkcyhjb25zdCBzdGQ6OnZlY3Rvcjx1aWRfdD4mIHVpZHMpID0gMDsKKworICAgIHZpcnR1YWwgYm9vbCAgICAgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5KSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90ICZ2b2x1bWVHcm91cCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRSdHRFbmFibGVkKGJvb2wgZW5hYmxlZCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkgPSAwOwogfTsKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCmluZGV4IGUwZDI0OTUuLjQ3YjMxZWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCisrKyBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC5oCkBAIC0xNywxOSArMTcsMjYgQEAKICNpZm5kZWYgQU5EUk9JRF9JQVVESU9QT0xJQ1lTRVJWSUNFQ0xJRU5UX0gKICNkZWZpbmUgQU5EUk9JRF9JQVVESU9QT0xJQ1lTRVJWSUNFQ0xJRU5UX0gKIAorI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0cnVjdCByZWNvcmRfY2xpZW50X2luZm8geworICAgIGF1ZGlvX3VuaXF1ZV9pZF90IHJpaWQ7CiAgICAgdWlkX3QgdWlkOwogICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uOwogICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRfaWQ7CisgICAgYm9vbCBzaWxlbmNlZDsKIH07CiAKIHR5cGVkZWYgc3RydWN0IHJlY29yZF9jbGllbnRfaW5mbyByZWNvcmRfY2xpZW50X2luZm9fdDsKQEAgLTQxLDYgKzQ4LDggQEAKIHB1YmxpYzoKICAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKEF1ZGlvUG9saWN5U2VydmljZUNsaWVudCk7CiAKKyAgICAvLyBOb3RpZmllcyBhIGNoYW5nZSBvZiB2b2x1bWUgZ3JvdXAKKyAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgaW50IGZsYWdzKSA9IDA7CiAgICAgLy8gTm90aWZpZXMgYSBjaGFuZ2Ugb2YgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgogICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKSA9IDA7CiAgICAgLy8gTm90aWZpZXMgYSBjaGFuZ2Ugb2YgYXVkaW8gcGF0Y2ggY29uZmlndXJhdGlvbi4KQEAgLTUxLDggKzYwLDExIEBACiAgICAgdmlydHVhbCB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgZXZlbnQsCiAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCiAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkgPSAwOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKSA9IDA7CiB9OwogCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvSUF1ZGlvVHJhY2suaAppbmRleCA5NGFmZTNjLi4wNmU3ODZkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL0lBdWRpb1RyYWNrLmgKKysrIGIvbWVkaWEvbGliYXVkaW9jbGllbnQvaW5jbHVkZS9tZWRpYS9JQXVkaW9UcmFjay5oCkBAIC03MCw2ICs3MCw5IEBACiAgICAgLyogU2VuZCBwYXJhbWV0ZXJzIHRvIHRoZSBhdWRpbyBoYXJkd2FyZSAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKSA9IDA7CiAKKyAgICAvKiBTZWxlY3RzIHRoZSBwcmVzZW50YXRpb24gKGlmIGF2YWlsYWJsZSkgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpID0gMDsKKwogICAgIC8qIFJldHVybiBOT19FUlJPUiBpZiB0aW1lc3RhbXAgaXMgdmFsaWQuICB0aW1lc3RhbXAgaXMgdW5kZWZpbmVkIG90aGVyd2lzZS4gKi8KICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKSA9IDA7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvY2xpZW50L2luY2x1ZGUvbWVkaWEvUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyLmggYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1JlY29yZGluZ0FjdGl2aXR5VHJhY2tlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OTFhNzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC9pbmNsdWRlL21lZGlhL1JlY29yZGluZ0FjdGl2aXR5VHJhY2tlci5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fQU5EUk9JRF9SRUNPUkRJTkdfQUNUSVZJVFlfVFJBQ0tFUl9IX18KKyNkZWZpbmUgX19BTkRST0lEX1JFQ09SRElOR19BQ1RJVklUWV9UUkFDS0VSX0hfXworCisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElBdWRpb01hbmFnZXI7CitjbGFzcyBJQmluZGVyOworCitjbGFzcyBSZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXIKK3sKK3B1YmxpYzoKKyAgICBSZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXIoKTsKKyAgICB+UmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyKCk7CisgICAgYXVkaW9fdW5pcXVlX2lkX3QgZ2V0UmlpZCgpOworICAgIHZvaWQgcmVjb3JkaW5nU3RhcnRlZCgpOworICAgIHZvaWQgcmVjb3JkaW5nU3RvcHBlZCgpOworCitwcml2YXRlOgorICAgIHNwPElBdWRpb01hbmFnZXI+IG1BdWRpb01hbmFnZXI7CisgICAgYXVkaW9fdW5pcXVlX2lkX3QgbVJJSWQ7CisgICAgc3A8SUJpbmRlcj4gICAgICAgbVRva2VuOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gX19BTkRST0lEX1JFQ09SRElOR19BQ1RJVklUWV9UUkFDS0VSX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvY2xpZW50L3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggNTJiYjJmYi4uZDUwOWJlNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9jbGllbnQvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb2NsaWVudC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0xMSw2ICsxMSw5IEBACiAgICAgZGVmYXVsdHM6IFsibGliYXVkaW9jbGllbnRfdGVzdHNfZGVmYXVsdHMiXSwKICAgICBzcmNzOiBbInRlc3RfY3JlYXRlX2F1ZGlvdHJhY2suY3BwIiwKICAgICAgICAgICAgInRlc3RfY3JlYXRlX3V0aWxzLmNwcCJdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCiAgICAgICAgICJsaWJiaW5kZXIiLApAQCAtMjUsNiArMjgsOSBAQAogICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvY2xpZW50X3Rlc3RzX2RlZmF1bHRzIl0sCiAgICAgc3JjczogWyJ0ZXN0X2NyZWF0ZV9hdWRpb3JlY29yZC5jcHAiLAogICAgICAgICAgICAidGVzdF9jcmVhdGVfdXRpbHMuY3BwIl0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKICAgICAgICAgImxpYmJpbmRlciIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzYmM0ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQW5kcm9pZC5icApAQCAtMCwwICsxLDUwIEBACitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJhdWRpb2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfaGVscGVyX2hlYWRlcnMiLAorICAgIF0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfaGVscGVyX2hlYWRlcnMiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJhdWRpb2ZvdW5kYXRpb24iLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiQXVkaW9Db250YWluZXJzLmNwcCIsCisgICAgICAgICJBdWRpb0RldmljZVR5cGVBZGRyLmNwcCIsCisgICAgICAgICJBdWRpb0dhaW4uY3BwIiwKKyAgICAgICAgIkF1ZGlvUG9ydC5jcHAiLAorICAgICAgICAiQXVkaW9Qcm9maWxlLmNwcCIsCisgICAgICAgICJEZXZpY2VEZXNjcmlwdG9yQmFzZS5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGliYXVkaW9mb3VuZGF0aW9uX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Db250YWluZXJzLmNwcCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb0NvbnRhaW5lcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxMjU3ZDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Db250YWluZXJzLmNwcApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NvbnN0IERldmljZVR5cGVTZXQmIGdldEF1ZGlvRGV2aWNlT3V0QWxsU2V0KCkgeworICAgIHN0YXRpYyBjb25zdCBEZXZpY2VUeXBlU2V0IGF1ZGlvRGV2aWNlT3V0QWxsU2V0ID0gRGV2aWNlVHlwZVNldCgKKyAgICAgICAgICAgIHN0ZDo6YmVnaW4oQVVESU9fREVWSUNFX09VVF9BTExfQVJSQVkpLAorICAgICAgICAgICAgc3RkOjplbmQoQVVESU9fREVWSUNFX09VVF9BTExfQVJSQVkpKTsKKyAgICByZXR1cm4gYXVkaW9EZXZpY2VPdXRBbGxTZXQ7Cit9CisKK2NvbnN0IERldmljZVR5cGVTZXQmIGdldEF1ZGlvRGV2aWNlT3V0QWxsQTJkcFNldCgpIHsKKyAgICBzdGF0aWMgY29uc3QgRGV2aWNlVHlwZVNldCBhdWRpb0RldmljZU91dEFsbEEyZHBTZXQgPSBEZXZpY2VUeXBlU2V0KAorICAgICAgICAgICAgc3RkOjpiZWdpbihBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQX0FSUkFZKSwKKyAgICAgICAgICAgIHN0ZDo6ZW5kKEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFBfQVJSQVkpKTsKKyAgICByZXR1cm4gYXVkaW9EZXZpY2VPdXRBbGxBMmRwU2V0OworfQorCitjb25zdCBEZXZpY2VUeXBlU2V0JiBnZXRBdWRpb0RldmljZU91dEFsbFNjb1NldCgpIHsKKyAgICBzdGF0aWMgY29uc3QgRGV2aWNlVHlwZVNldCBhdWRpb0RldmljZU91dEFsbFNjb1NldCA9IERldmljZVR5cGVTZXQoCisgICAgICAgICAgICBzdGQ6OmJlZ2luKEFVRElPX0RFVklDRV9PVVRfQUxMX1NDT19BUlJBWSksCisgICAgICAgICAgICBzdGQ6OmVuZChBVURJT19ERVZJQ0VfT1VUX0FMTF9TQ09fQVJSQVkpKTsKKyAgICByZXR1cm4gYXVkaW9EZXZpY2VPdXRBbGxTY29TZXQ7Cit9CisKK2NvbnN0IERldmljZVR5cGVTZXQmIGdldEF1ZGlvRGV2aWNlT3V0QWxsVXNiU2V0KCkgeworICAgIHN0YXRpYyBjb25zdCBEZXZpY2VUeXBlU2V0IGF1ZGlvRGV2aWNlT3V0QWxsVXNiU2V0ID0gRGV2aWNlVHlwZVNldCgKKyAgICAgICAgICAgIHN0ZDo6YmVnaW4oQVVESU9fREVWSUNFX09VVF9BTExfVVNCX0FSUkFZKSwKKyAgICAgICAgICAgIHN0ZDo6ZW5kKEFVRElPX0RFVklDRV9PVVRfQUxMX1VTQl9BUlJBWSkpOworICAgIHJldHVybiBhdWRpb0RldmljZU91dEFsbFVzYlNldDsKK30KKworY29uc3QgRGV2aWNlVHlwZVNldCYgZ2V0QXVkaW9EZXZpY2VJbkFsbFNldCgpIHsKKyAgICBzdGF0aWMgY29uc3QgRGV2aWNlVHlwZVNldCBhdWRpb0RldmljZUluQWxsU2V0ID0gRGV2aWNlVHlwZVNldCgKKyAgICAgICAgICAgIHN0ZDo6YmVnaW4oQVVESU9fREVWSUNFX0lOX0FMTF9BUlJBWSksCisgICAgICAgICAgICBzdGQ6OmVuZChBVURJT19ERVZJQ0VfSU5fQUxMX0FSUkFZKSk7CisgICAgcmV0dXJuIGF1ZGlvRGV2aWNlSW5BbGxTZXQ7Cit9CisKK2NvbnN0IERldmljZVR5cGVTZXQmIGdldEF1ZGlvRGV2aWNlSW5BbGxVc2JTZXQoKSB7CisgICAgc3RhdGljIGNvbnN0IERldmljZVR5cGVTZXQgYXVkaW9EZXZpY2VJbkFsbFVzYlNldCA9IERldmljZVR5cGVTZXQoCisgICAgICAgICAgICBzdGQ6OmJlZ2luKEFVRElPX0RFVklDRV9JTl9BTExfVVNCX0FSUkFZKSwKKyAgICAgICAgICAgIHN0ZDo6ZW5kKEFVRElPX0RFVklDRV9JTl9BTExfVVNCX0FSUkFZKSk7CisgICAgcmV0dXJuIGF1ZGlvRGV2aWNlSW5BbGxVc2JTZXQ7Cit9CisKK2Jvb2wgZGV2aWNlVHlwZXNUb1N0cmluZyhjb25zdCBEZXZpY2VUeXBlU2V0ICZkZXZpY2VUeXBlcywgc3RkOjpzdHJpbmcgJnN0cikgeworICAgIGlmIChkZXZpY2VUeXBlcy5lbXB0eSgpKSB7CisgICAgICAgIHN0ciA9ICJFbXB0eSBkZXZpY2UgdHlwZXMiOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgYm9vbCByZXQgPSB0cnVlOworICAgIGZvciAoYXV0byBpdCA9IGRldmljZVR5cGVzLmJlZ2luKCk7IGl0ICE9IGRldmljZVR5cGVzLmVuZCgpOykgeworICAgICAgICBzdGQ6OnN0cmluZyBkZXZpY2VUeXBlU3RyOworICAgICAgICByZXQgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlKCppdCkgPworICAgICAgICAgICAgICBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OnRvU3RyaW5nKCppdCwgZGV2aWNlVHlwZVN0cikgOgorICAgICAgICAgICAgICBJbnB1dERldmljZUNvbnZlcnRlcjo6dG9TdHJpbmcoKml0LCBkZXZpY2VUeXBlU3RyKTsKKyAgICAgICAgaWYgKCFyZXQpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN0ci5hcHBlbmQoZGV2aWNlVHlwZVN0cik7CisgICAgICAgIGlmICgrK2l0ICE9IGRldmljZVR5cGVzLmVuZCgpKSB7CisgICAgICAgICAgICBzdHIuYXBwZW5kKCIgLCAiKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoIXJldCkgeworICAgICAgICBzdHIgPSAiVW5rbm93biB2YWx1ZXMiOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGQ6OnN0cmluZyBkdW1wRGV2aWNlVHlwZXMoY29uc3QgRGV2aWNlVHlwZVNldCAmZGV2aWNlVHlwZXMpIHsKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgZm9yIChhdXRvIGl0ID0gZGV2aWNlVHlwZXMuYmVnaW4oKTsgaXQgIT0gZGV2aWNlVHlwZXMuZW5kKCk7KSB7CisgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgICAgICBzcyA8PCAiMHgiIDw8IHN0ZDo6aGV4IDw8ICgqaXQpOworICAgICAgICByZXQuYXBwZW5kKHNzLnN0cigpKTsKKyAgICAgICAgaWYgKCsraXQgIT0gZGV2aWNlVHlwZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldC5hcHBlbmQoIiAsICIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzKSB7CisgICAgc3RkOjpzdHJpbmcgcmV0OworICAgIGRldmljZVR5cGVzVG9TdHJpbmcoZGV2aWNlVHlwZXMsIHJldCk7CisgICAgcmV0dXJuIHJldDsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvRGV2aWNlVHlwZUFkZHIuY3BwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL0F1ZGlvRGV2aWNlVHlwZUFkZHIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NDA0M2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9EZXZpY2VUeXBlQWRkci5jcHAKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY29uc3QgY2hhciogQXVkaW9EZXZpY2VUeXBlQWRkcjo6Z2V0QWRkcmVzcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUFkZHJlc3MuY19zdHIoKTsKK30KKworYm9vbCBBdWRpb0RldmljZVR5cGVBZGRyOjplcXVhbHMoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gbVR5cGUgPT0gb3RoZXIubVR5cGUgJiYgbUFkZHJlc3MgPT0gb3RoZXIubUFkZHJlc3M7Cit9CisKK2Jvb2wgQXVkaW9EZXZpY2VUeXBlQWRkcjo6b3BlcmF0b3I8KGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIG90aGVyKSBjb25zdCB7CisgICAgaWYgKG1UeXBlIDwgb3RoZXIubVR5cGUpICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAobVR5cGUgPiBvdGhlci5tVHlwZSkgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChtQWRkcmVzcyA8IG90aGVyLm1BZGRyZXNzKSAgcmV0dXJuIHRydWU7CisgICAgLy8gaWYgKG1BZGRyZXNzID4gb3RoZXIubUFkZHJlc3MpICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQXVkaW9EZXZpY2VUeXBlQWRkcjo6cmVzZXQoKSB7CisgICAgbVR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBtQWRkcmVzcyA9ICIiOworfQorCitzdGF0dXNfdCBBdWRpb0RldmljZVR5cGVBZGRyOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkgeworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMigmbVR5cGUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRVdGY4RnJvbVV0ZjE2KCZtQWRkcmVzcyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9EZXZpY2VUeXBlQWRkcjo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgeworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVVaW50MzIobVR5cGUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlVXRmOEFzVXRmMTYobUFkZHJlc3MpOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworRGV2aWNlVHlwZVNldCBnZXRBdWRpb0RldmljZVR5cGVzKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3ImIGRldmljZVR5cGVBZGRycykgeworICAgIERldmljZVR5cGVTZXQgZGV2aWNlVHlwZXM7CisgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2VUeXBlQWRkciA6IGRldmljZVR5cGVBZGRycykgeworICAgICAgICBkZXZpY2VUeXBlcy5pbnNlcnQoZGV2aWNlVHlwZUFkZHIubVR5cGUpOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlVHlwZXM7Cit9CisKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9HYWluLmNwcCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb0dhaW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMjgzMzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9HYWluLmNwcApAQCAtMCwwICsxLDE5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9HYWluIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisvLyNkZWZpbmUgVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNpZmRlZiBWRVJZX1ZFUkJPU0VfTE9HR0lORworI2RlZmluZSBBTE9HVlYgQUxPR1YKKyNlbHNlCisjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKKyNlbmRpZgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvR2Fpbi5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWF0aC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0F1ZGlvR2Fpbjo6QXVkaW9HYWluKGludCBpbmRleCwgYm9vbCB1c2VJbkNoYW5uZWxNYXNrKQoreworICAgIG1JbmRleCA9IGluZGV4OworICAgIG1Vc2VJbkNoYW5uZWxNYXNrID0gdXNlSW5DaGFubmVsTWFzazsKKyAgICBtZW1zZXQoJm1HYWluLCAwLCBzaXplb2Yoc3RydWN0IGF1ZGlvX2dhaW4pKTsKK30KKwordm9pZCBBdWRpb0dhaW46OmdldERlZmF1bHRDb25maWcoc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpCit7CisgICAgY29uZmlnLT5pbmRleCA9IG1JbmRleDsKKyAgICBjb25maWctPm1vZGUgPSBtR2Fpbi5tb2RlOworICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrID0gbUdhaW4uY2hhbm5lbF9tYXNrOworICAgIGlmICgobUdhaW4ubW9kZSAmIEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgPT0gQVVESU9fR0FJTl9NT0RFX0pPSU5UKSB7CisgICAgICAgIGNvbmZpZy0+dmFsdWVzWzBdID0gbUdhaW4uZGVmYXVsdF92YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50MzJfdCBudW1WYWx1ZXM7CisgICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgeworICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUdhaW4uY2hhbm5lbF9tYXNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtR2Fpbi5jaGFubmVsX21hc2spOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHsKKyAgICAgICAgICAgIGNvbmZpZy0+dmFsdWVzW2ldID0gbUdhaW4uZGVmYXVsdF92YWx1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoKG1HYWluLm1vZGUgJiBBVURJT19HQUlOX01PREVfUkFNUCkgPT0gQVVESU9fR0FJTl9NT0RFX1JBTVApIHsKKyAgICAgICAgY29uZmlnLT5yYW1wX2R1cmF0aW9uX21zID0gbUdhaW4ubWluX3JhbXBfbXM7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb0dhaW46OmNoZWNrQ29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKQoreworICAgIGlmICgoY29uZmlnLT5tb2RlICYgfm1HYWluLm1vZGUpICE9IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKChjb25maWctPm1vZGUgJiBBVURJT19HQUlOX01PREVfSk9JTlQpID09IEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgeworICAgICAgICBpZiAoKGNvbmZpZy0+dmFsdWVzWzBdIDwgbUdhaW4ubWluX3ZhbHVlKSB8fAorICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT52YWx1ZXNbMF0gPiBtR2Fpbi5tYXhfdmFsdWUpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKChjb25maWctPmNoYW5uZWxfbWFzayAmIH5tR2Fpbi5jaGFubmVsX21hc2spICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgdWludDMyX3QgbnVtVmFsdWVzOworICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKKyAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWctPmNoYW5uZWxfbWFzayk7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1WYWx1ZXM7IGkrKykgeworICAgICAgICAgICAgaWYgKChjb25maWctPnZhbHVlc1tpXSA8IG1HYWluLm1pbl92YWx1ZSkgfHwKKyAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+dmFsdWVzW2ldID4gbUdhaW4ubWF4X3ZhbHVlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKChjb25maWctPm1vZGUgJiBBVURJT19HQUlOX01PREVfUkFNUCkgPT0gQVVESU9fR0FJTl9NT0RFX1JBTVApIHsKKyAgICAgICAgaWYgKChjb25maWctPnJhbXBfZHVyYXRpb25fbXMgPCBtR2Fpbi5taW5fcmFtcF9tcykgfHwKKyAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+cmFtcF9kdXJhdGlvbl9tcyA+IG1HYWluLm1heF9yYW1wX21zKSkgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9HYWluOjpkdW1wKHN0ZDo6c3RyaW5nICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiUqc0dhaW4gJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKSk7CisgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMtIG1vZGU6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1vZGUpKTsKKyAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiUqcy0gY2hhbm5lbF9tYXNrOiAlMDh4XG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5jaGFubmVsX21hc2spKTsKKyAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiUqcy0gbWluX3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWluX3ZhbHVlKSk7CisgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMtIG1heF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1heF92YWx1ZSkpOworICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzLSBkZWZhdWx0X3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uZGVmYXVsdF92YWx1ZSkpOworICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzLSBzdGVwX3ZhbHVlOiAlZCBtQlxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uc3RlcF92YWx1ZSkpOworICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzLSBtaW5fcmFtcF9tczogJWQgbXNcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1pbl9yYW1wX21zKSk7CisgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMtIG1heF9yYW1wX21zOiAlZCBtc1xuIiwgc3BhY2VzLCAiIiwgbUdhaW4ubWF4X3JhbXBfbXMpKTsKK30KKworYm9vbCBBdWRpb0dhaW46OmVxdWFscyhjb25zdCBzcDxBdWRpb0dhaW4+JiBvdGhlcikgY29uc3QKK3sKKyAgICByZXR1cm4gb3RoZXIgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICBtVXNlSW5DaGFubmVsTWFzayA9PSBvdGhlci0+bVVzZUluQ2hhbm5lbE1hc2sgJiYKKyAgICAgICAgICAgbVVzZUZvclZvbHVtZSA9PSBvdGhlci0+bVVzZUZvclZvbHVtZSAmJgorICAgICAgICAgICAvLyBDb21wYXJlIGF1ZGlvIGdhaW4KKyAgICAgICAgICAgbUdhaW4ubW9kZSA9PSBvdGhlci0+bUdhaW4ubW9kZSAmJgorICAgICAgICAgICBtR2Fpbi5jaGFubmVsX21hc2sgPT0gb3RoZXItPm1HYWluLmNoYW5uZWxfbWFzayAmJgorICAgICAgICAgICBtR2Fpbi5taW5fdmFsdWUgPT0gb3RoZXItPm1HYWluLm1pbl92YWx1ZSAmJgorICAgICAgICAgICBtR2Fpbi5tYXhfdmFsdWUgPT0gb3RoZXItPm1HYWluLm1heF92YWx1ZSAmJgorICAgICAgICAgICBtR2Fpbi5kZWZhdWx0X3ZhbHVlID09IG90aGVyLT5tR2Fpbi5kZWZhdWx0X3ZhbHVlICYmCisgICAgICAgICAgIG1HYWluLnN0ZXBfdmFsdWUgPT0gb3RoZXItPm1HYWluLnN0ZXBfdmFsdWUgJiYKKyAgICAgICAgICAgbUdhaW4ubWluX3JhbXBfbXMgPT0gb3RoZXItPm1HYWluLm1pbl9yYW1wX21zICYmCisgICAgICAgICAgIG1HYWluLm1heF9yYW1wX21zID09IG90aGVyLT5tR2Fpbi5tYXhfcmFtcF9tczsKK30KKworc3RhdHVzX3QgQXVkaW9HYWluOjp3cml0ZVRvUGFyY2VsKGFuZHJvaWQ6OlBhcmNlbCAqcGFyY2VsKSBjb25zdAoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG1JbmRleCkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZUJvb2wobVVzZUluQ2hhbm5lbE1hc2spKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVCb29sKG1Vc2VGb3JWb2x1bWUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVVaW50MzIobUdhaW4ubW9kZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVVpbnQzMihtR2Fpbi5jaGFubmVsX21hc2spKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtR2Fpbi5taW5fdmFsdWUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtR2Fpbi5tYXhfdmFsdWUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtR2Fpbi5kZWZhdWx0X3ZhbHVlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlVWludDMyKG1HYWluLnN0ZXBfdmFsdWUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVVaW50MzIobUdhaW4ubWluX3JhbXBfbXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBzdGF0dXMgPSBwYXJjZWwtPndyaXRlVWludDMyKG1HYWluLm1heF9yYW1wX21zKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb0dhaW46OnJlYWRGcm9tUGFyY2VsKGNvbnN0IGFuZHJvaWQ6OlBhcmNlbCAqcGFyY2VsKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1JbmRleCkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkQm9vbCgmbVVzZUluQ2hhbm5lbE1hc2spKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZEJvb2woJm1Vc2VGb3JWb2x1bWUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMigmbUdhaW4ubW9kZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkVWludDMyKCZtR2Fpbi5jaGFubmVsX21hc2spKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZtR2Fpbi5taW5fdmFsdWUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZtR2Fpbi5tYXhfdmFsdWUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZtR2Fpbi5kZWZhdWx0X3ZhbHVlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRVaW50MzIoJm1HYWluLnN0ZXBfdmFsdWUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMigmbUdhaW4ubWluX3JhbXBfbXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBzdGF0dXMgPSBwYXJjZWwtPnJlYWRVaW50MzIoJm1HYWluLm1heF9yYW1wX21zKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitib29sIEF1ZGlvR2FpbnM6OmVxdWFscyhjb25zdCBBdWRpb0dhaW5zICZvdGhlcikgY29uc3QKK3sKKyAgICByZXR1cm4gc3RkOjplcXVhbChiZWdpbigpLCBlbmQoKSwgb3RoZXIuYmVnaW4oKSwgb3RoZXIuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3Qgc3A8QXVkaW9HYWluPiYgbGVmdCwgY29uc3Qgc3A8QXVkaW9HYWluPiYgcmlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQtPmVxdWFscyhyaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgfSk7Cit9CisKK3N0YXR1c190IEF1ZGlvR2FpbnM6OndyaXRlVG9QYXJjZWwoYW5kcm9pZDo6UGFyY2VsICpwYXJjZWwpIGNvbnN0IHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVWZWN0b3JTaXplKCp0aGlzKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgZm9yIChjb25zdCBhdXRvICZhdWRpb0dhaW4gOiAqdGhpcykgeworICAgICAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVQYXJjZWxhYmxlKCphdWRpb0dhaW4pKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9HYWluczo6cmVhZEZyb21QYXJjZWwoY29uc3QgYW5kcm9pZDo6UGFyY2VsICpwYXJjZWwpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICB0aGlzLT5jbGVhcigpOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZXNpemVPdXRWZWN0b3IodGhpcykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGhpcy0+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgdGhpcy0+YXQoaSkgPSBuZXcgQXVkaW9HYWluKDAsIGZhbHNlKTsKKyAgICAgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRQYXJjZWxhYmxlKHRoaXMtPmF0KGkpLmdldCgpKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIHRoaXMtPmNsZWFyKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Qb3J0LmNwcCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1BvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5ODg2OTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Qb3J0LmNwcApAQCAtMCwwICsxLDI4NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9ydCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvcnQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIEF1ZGlvUG9ydDo6aW1wb3J0QXVkaW9Qb3J0KGNvbnN0IHNwPEF1ZGlvUG9ydD4mIHBvcnQsIGJvb2wgZm9yY2UgX191bnVzZWQpCit7CisgICAgZm9yIChjb25zdCBhdXRvJiBwcm9maWxlVG9JbXBvcnQgOiBwb3J0LT5tUHJvZmlsZXMpIHsKKyAgICAgICAgLy8gSW1wb3J0IG9ubHkgdmFsaWQgcG9ydCwgaS5lLiB2YWxpZCBmb3JtYXQsIG5vbiBlbXB0eSByYXRlcyBhbmQgY2hhbm5lbHMgbWFza3MKKyAgICAgICAgaWYgKCFwcm9maWxlVG9JbXBvcnQtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0ZDo6ZmluZF9pZihtUHJvZmlsZXMuYmVnaW4oKSwgbVByb2ZpbGVzLmVuZCgpLAorICAgICAgICAgICAgICAgIFtwcm9maWxlVG9JbXBvcnRdKGNvbnN0IGF1dG8gJnByb2ZpbGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAqcHJvZmlsZSA9PSAqcHJvZmlsZVRvSW1wb3J0OyB9KSA9PSBtUHJvZmlsZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIGFkZEF1ZGlvUHJvZmlsZShwcm9maWxlVG9JbXBvcnQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvUG9ydDo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0IHsKKyAgICAvLyBUT0RPOiB1cGRhdGUgdGhpcyBmdW5jdGlvbiBvbmNlIGF1ZGlvX3BvcnQgc3RydWN0dXJlIHJlZmxlY3RzIHRoZSBuZXcgcHJvZmlsZSBkZWZpbml0aW9uLgorICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbjogZmxhdGVuaW5nIHRoZSBBdWRpb1Byb2ZpbGUgaW50byBhdWRpb19wb3J0IHN0cnVjdHVyZS4KKyAgICBGb3JtYXRTZXQgZmxhdGVuZWRGb3JtYXRzOworICAgIFNhbXBsZVJhdGVTZXQgZmxhdGVuZWRSYXRlczsKKyAgICBDaGFubmVsTWFza1NldCBmbGF0ZW5lZENoYW5uZWxzOworICAgIGZvciAoY29uc3QgYXV0byYgcHJvZmlsZSA6IG1Qcm9maWxlcykgeworICAgICAgICBpZiAocHJvZmlsZS0+aXNWYWxpZCgpKSB7CisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXRUb0V4cG9ydCA9IHByb2ZpbGUtPmdldEZvcm1hdCgpOworICAgICAgICAgICAgY29uc3QgU2FtcGxlUmF0ZVNldCAmcmF0ZXNUb0V4cG9ydCA9IHByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCk7CisgICAgICAgICAgICBjb25zdCBDaGFubmVsTWFza1NldCAmY2hhbm5lbHNUb0V4cG9ydCA9IHByb2ZpbGUtPmdldENoYW5uZWxzKCk7CisKKyAgICAgICAgICAgIGZsYXRlbmVkRm9ybWF0cy5pbnNlcnQoZm9ybWF0VG9FeHBvcnQpOworICAgICAgICAgICAgZmxhdGVuZWRSYXRlcy5pbnNlcnQocmF0ZXNUb0V4cG9ydC5iZWdpbigpLCByYXRlc1RvRXhwb3J0LmVuZCgpKTsKKyAgICAgICAgICAgIGZsYXRlbmVkQ2hhbm5lbHMuaW5zZXJ0KGNoYW5uZWxzVG9FeHBvcnQuYmVnaW4oKSwgY2hhbm5lbHNUb0V4cG9ydC5lbmQoKSk7CisKKyAgICAgICAgICAgIGlmIChmbGF0ZW5lZFJhdGVzLnNpemUoKSA+IEFVRElPX1BPUlRfTUFYX1NBTVBMSU5HX1JBVEVTIHx8CisgICAgICAgICAgICAgICAgICAgIGZsYXRlbmVkQ2hhbm5lbHMuc2l6ZSgpID4gQVVESU9fUE9SVF9NQVhfQ0hBTk5FTF9NQVNLUyB8fAorICAgICAgICAgICAgICAgICAgICBmbGF0ZW5lZEZvcm1hdHMuc2l6ZSgpID4gQVVESU9fUE9SVF9NQVhfRk9STUFUUykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogYmFpbGluZyBvdXQ6IGNhbm5vdCBleHBvcnQgcHJvZmlsZXMgdG8gcG9ydCBjb25maWciLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHBvcnQtPnJvbGUgPSBtUm9sZTsKKyAgICBwb3J0LT50eXBlID0gbVR5cGU7CisgICAgc3RybGNweShwb3J0LT5uYW1lLCBtTmFtZS5jX3N0cigpLCBBVURJT19QT1JUX01BWF9OQU1FX0xFTik7CisgICAgcG9ydC0+bnVtX3NhbXBsZV9yYXRlcyA9IGZsYXRlbmVkUmF0ZXMuc2l6ZSgpOworICAgIHBvcnQtPm51bV9jaGFubmVsX21hc2tzID0gZmxhdGVuZWRDaGFubmVscy5zaXplKCk7CisgICAgcG9ydC0+bnVtX2Zvcm1hdHMgPSBmbGF0ZW5lZEZvcm1hdHMuc2l6ZSgpOworICAgIHN0ZDo6Y29weShmbGF0ZW5lZFJhdGVzLmJlZ2luKCksIGZsYXRlbmVkUmF0ZXMuZW5kKCksIHBvcnQtPnNhbXBsZV9yYXRlcyk7CisgICAgc3RkOjpjb3B5KGZsYXRlbmVkQ2hhbm5lbHMuYmVnaW4oKSwgZmxhdGVuZWRDaGFubmVscy5lbmQoKSwgcG9ydC0+Y2hhbm5lbF9tYXNrcyk7CisgICAgc3RkOjpjb3B5KGZsYXRlbmVkRm9ybWF0cy5iZWdpbigpLCBmbGF0ZW5lZEZvcm1hdHMuZW5kKCksIHBvcnQtPmZvcm1hdHMpOworCisgICAgQUxPR1YoIkF1ZGlvUG9ydDo6dG9BdWRpb1BvcnQoKSBudW0gZ2FpbnMgJXp1IiwgbUdhaW5zLnNpemUoKSk7CisKKyAgICBwb3J0LT5udW1fZ2FpbnMgPSBzdGQ6Om1pbihtR2FpbnMuc2l6ZSgpLCAoc2l6ZV90KSBBVURJT19QT1JUX01BWF9HQUlOUyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwb3J0LT5udW1fZ2FpbnM7IGkrKykgeworICAgICAgICBwb3J0LT5nYWluc1tpXSA9IG1HYWluc1tpXS0+Z2V0R2FpbigpOworICAgIH0KK30KKwordm9pZCBBdWRpb1BvcnQ6OmR1bXAoc3RkOjpzdHJpbmcgKmRzdCwgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlKSBjb25zdCB7CisgICAgaWYgKCFtTmFtZS5lbXB0eSgpKSB7CisgICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuY19zdHIoKSkpOworICAgIH0KKyAgICBpZiAodmVyYm9zZSkgeworICAgICAgICBzdGQ6OnN0cmluZyBwcm9maWxlc1N0cjsKKyAgICAgICAgbVByb2ZpbGVzLmR1bXAoJnByb2ZpbGVzU3RyLCBzcGFjZXMpOworICAgICAgICBkc3QtPmFwcGVuZChwcm9maWxlc1N0cik7CisKKyAgICAgICAgaWYgKG1HYWlucy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMtIGdhaW5zOlxuIiwgc3BhY2VzLCAiIikpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtR2FpbnMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBnYWluU3RyOworICAgICAgICAgICAgICAgIG1HYWluc1tpXS0+ZHVtcCgmZ2FpblN0ciwgc3BhY2VzICsgMiwgaSk7CisgICAgICAgICAgICAgICAgZHN0LT5hcHBlbmQoZ2FpblN0cik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb3J0Ojpsb2coY29uc3QgY2hhciogaW5kZW50KSBjb25zdAoreworICAgIEFMT0dJKCIlcyBQb3J0W25tOiVzLCB0eXBlOiVkLCByb2xlOiVkXSIsIGluZGVudCwgbU5hbWUuY19zdHIoKSwgbVR5cGUsIG1Sb2xlKTsKK30KKworYm9vbCBBdWRpb1BvcnQ6OmVxdWFscyhjb25zdCBzcDxBdWRpb1BvcnQ+ICZvdGhlcikgY29uc3QKK3sKKyAgICByZXR1cm4gb3RoZXIgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICBtR2FpbnMuZXF1YWxzKG90aGVyLT5nZXRHYWlucygpKSAmJgorICAgICAgICAgICBtTmFtZS5jb21wYXJlKG90aGVyLT5nZXROYW1lKCkpID09IDAgJiYKKyAgICAgICAgICAgbVR5cGUgPT0gb3RoZXItPmdldFR5cGUoKSAmJgorICAgICAgICAgICBtUm9sZSA9PSBvdGhlci0+Z2V0Um9sZSgpICYmCisgICAgICAgICAgIG1Qcm9maWxlcy5lcXVhbHMob3RoZXItPmdldEF1ZGlvUHJvZmlsZXMoKSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9ydDo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVVdGY4QXNVdGYxNihtTmFtZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVVpbnQzMihtVHlwZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVVpbnQzMihtUm9sZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVBhcmNlbGFibGUobVByb2ZpbGVzKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlUGFyY2VsYWJsZShtR2FpbnMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvcnQ6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkVXRmOEZyb21VdGYxNigmbU5hbWUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihtVHlwZSkgPT0gc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRVaW50MzIocmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZtVHlwZSkpKSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihtUm9sZSkgPT0gc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRVaW50MzIocmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZtUm9sZSkpKSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBtUHJvZmlsZXMuY2xlYXIoKTsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFBhcmNlbGFibGUoJm1Qcm9maWxlcykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIG1HYWlucy5jbGVhcigpOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkUGFyY2VsYWJsZSgmbUdhaW5zKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworLy8gLS0tIEF1ZGlvUG9ydENvbmZpZyBjbGFzcyBpbXBsZW1lbnRhdGlvbgorCitzdGF0dXNfdCBBdWRpb1BvcnRDb25maWc6OmFwcGx5QXVkaW9Qb3J0Q29uZmlnKAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpiYWNrdXBDb25maWcgX191bnVzZWQpCit7CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkgeworICAgICAgICBtU2FtcGxpbmdSYXRlID0gY29uZmlnLT5zYW1wbGVfcmF0ZTsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spIHsKKyAgICAgICAgbUNoYW5uZWxNYXNrID0gY29uZmlnLT5jaGFubmVsX21hc2s7CisgICAgfQorICAgIGlmIChjb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7CisgICAgICAgIG1Gb3JtYXQgPSBjb25maWctPmZvcm1hdDsKKyAgICB9CisgICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKSB7CisgICAgICAgIG1HYWluID0gY29uZmlnLT5nYWluOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworbmFtZXNwYWNlIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3ZvaWQgdXBkYXRlRmllbGQoCisgICAgICAgIGNvbnN0IFQmIHBvcnRDb25maWdGaWVsZCwgVCBhdWRpb19wb3J0X2NvbmZpZzo6KnBvcnRfY29uZmlnX2ZpZWxkLAorICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcsCisgICAgICAgIHVuc2lnbmVkIGludCBjb25maWdNYXNrLCBUIGRlZmF1bHRWYWx1ZSkKK3sKKyAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIGNvbmZpZ01hc2spIHsKKyAgICAgICAgaWYgKChzcmNDb25maWcgIT0gbnVsbHB0cikgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBjb25maWdNYXNrKSkgeworICAgICAgICAgICAgZHN0Q29uZmlnLT4qcG9ydF9jb25maWdfZmllbGQgPSBzcmNDb25maWctPipwb3J0X2NvbmZpZ19maWVsZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRzdENvbmZpZy0+KnBvcnRfY29uZmlnX2ZpZWxkID0gcG9ydENvbmZpZ0ZpZWxkOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgZHN0Q29uZmlnLT4qcG9ydF9jb25maWdfZmllbGQgPSBkZWZhdWx0VmFsdWU7CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZQorCit2b2lkIEF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoCisgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNyY0NvbmZpZykgY29uc3QKK3sKKyAgICB1cGRhdGVGaWVsZChtU2FtcGxpbmdSYXRlLCAmYXVkaW9fcG9ydF9jb25maWc6OnNhbXBsZV9yYXRlLAorICAgICAgICAgICAgZHN0Q29uZmlnLCBzcmNDb25maWcsIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFLCAwdSk7CisgICAgdXBkYXRlRmllbGQobUNoYW5uZWxNYXNrLCAmYXVkaW9fcG9ydF9jb25maWc6OmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgIGRzdENvbmZpZywgc3JjQ29uZmlnLCBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAoYXVkaW9fY2hhbm5lbF9tYXNrX3QpQVVESU9fQ0hBTk5FTF9OT05FKTsKKyAgICB1cGRhdGVGaWVsZChtRm9ybWF0LCAmYXVkaW9fcG9ydF9jb25maWc6OmZvcm1hdCwKKyAgICAgICAgICAgIGRzdENvbmZpZywgc3JjQ29uZmlnLCBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQsIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKKyAgICBkc3RDb25maWctPmlkID0gbUlkOworCisgICAgc3A8QXVkaW9Qb3J0PiBhdWRpb3BvcnQgPSBnZXRBdWRpb1BvcnQoKTsKKyAgICBpZiAoKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKSAmJiBhdWRpb3BvcnQgIT0gTlVMTCkgeworICAgICAgICBkc3RDb25maWctPmdhaW4gPSBtR2FpbjsKKyAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKQorICAgICAgICAgICAgICAgICYmIGF1ZGlvcG9ydC0+Y2hlY2tHYWluKCZzcmNDb25maWctPmdhaW4sIHNyY0NvbmZpZy0+Z2Fpbi5pbmRleCkgPT0gT0spIHsKKyAgICAgICAgICAgIGRzdENvbmZpZy0+Z2FpbiA9IHNyY0NvbmZpZy0+Z2FpbjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRzdENvbmZpZy0+Z2Fpbi5pbmRleCA9IC0xOworICAgIH0KKyAgICBpZiAoZHN0Q29uZmlnLT5nYWluLmluZGV4ICE9IC0xKSB7CisgICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfR0FJTjsKKyAgICB9IGVsc2UgeworICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrICY9IH5BVURJT19QT1JUX0NPTkZJR19HQUlOOworICAgIH0KK30KKworYm9vbCBBdWRpb1BvcnRDb25maWc6Omhhc0dhaW5Db250cm9sbGVyKGJvb2wgY2FuVXNlRm9yVm9sdW1lKSBjb25zdAoreworICAgIHNwPEF1ZGlvUG9ydD4gYXVkaW9wb3J0ID0gZ2V0QXVkaW9Qb3J0KCk7CisgICAgaWYgKCFhdWRpb3BvcnQpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gY2FuVXNlRm9yVm9sdW1lID8gYXVkaW9wb3J0LT5nZXRHYWlucygpLmNhblVzZUZvclZvbHVtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGF1ZGlvcG9ydC0+Z2V0R2FpbnMoKS5zaXplKCkgPiAwOworfQorCitib29sIEF1ZGlvUG9ydENvbmZpZzo6ZXF1YWxzKGNvbnN0IHNwPEF1ZGlvUG9ydENvbmZpZz4gJm90aGVyKSBjb25zdAoreworICAgIHJldHVybiBvdGhlciAhPSBudWxscHRyICYmCisgICAgICAgICAgIG1TYW1wbGluZ1JhdGUgPT0gb3RoZXItPmdldFNhbXBsaW5nUmF0ZSgpICYmCisgICAgICAgICAgIG1Gb3JtYXQgPT0gb3RoZXItPmdldEZvcm1hdCgpICYmCisgICAgICAgICAgIG1DaGFubmVsTWFzayA9PSBvdGhlci0+Z2V0Q2hhbm5lbE1hc2soKSAmJgorICAgICAgICAgICAvLyBDb21wYXJlIGF1ZGlvIGdhaW4gY29uZmlnCisgICAgICAgICAgIG1HYWluLmluZGV4ID09IG90aGVyLT5tR2Fpbi5pbmRleCAmJgorICAgICAgICAgICBtR2Fpbi5tb2RlID09IG90aGVyLT5tR2Fpbi5tb2RlICYmCisgICAgICAgICAgIG1HYWluLmNoYW5uZWxfbWFzayA9PSBvdGhlci0+bUdhaW4uY2hhbm5lbF9tYXNrICYmCisgICAgICAgICAgIHN0ZDo6ZXF1YWwoc3RkOjpiZWdpbihtR2Fpbi52YWx1ZXMpLCBzdGQ6OmVuZChtR2Fpbi52YWx1ZXMpLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmVnaW4ob3RoZXItPm1HYWluLnZhbHVlcykpICYmCisgICAgICAgICAgIG1HYWluLnJhbXBfZHVyYXRpb25fbXMgPT0gb3RoZXItPm1HYWluLnJhbXBfZHVyYXRpb25fbXM7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9ydENvbmZpZzo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVVaW50MzIobVNhbXBsaW5nUmF0ZSkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVVpbnQzMihtRm9ybWF0KSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlVWludDMyKG1DaGFubmVsTWFzaykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZUludDMyKG1JZCkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIC8vIFdyaXRlIG1HYWluIHRvIHBhcmNlbC4KKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMihtR2Fpbi5pbmRleCkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVVpbnQzMihtR2Fpbi5tb2RlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlVWludDMyKG1HYWluLmNoYW5uZWxfbWFzaykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVVpbnQzMihtR2Fpbi5yYW1wX2R1cmF0aW9uX21zKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgc3RkOjp2ZWN0b3I8aW50PiB2YWx1ZXMoc3RkOjpiZWdpbihtR2Fpbi52YWx1ZXMpLCBzdGQ6OmVuZChtR2Fpbi52YWx1ZXMpKTsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVJbnQzMlZlY3Rvcih2YWx1ZXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvcnRDb25maWc6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkVWludDMyKCZtU2FtcGxpbmdSYXRlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YobUZvcm1hdCkgPT0gc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRVaW50MzIocmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZtRm9ybWF0KSkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkVWludDMyKCZtQ2hhbm5lbE1hc2spKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyKCZtSWQpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICAvLyBSZWFkIG1HYWluIGZyb20gcGFyY2VsLgorICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzIoJm1HYWluLmluZGV4KSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRVaW50MzIoJm1HYWluLm1vZGUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFVpbnQzMigmbUdhaW4uY2hhbm5lbF9tYXNrKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRVaW50MzIoJm1HYWluLnJhbXBfZHVyYXRpb25fbXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IHZhbHVlczsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyVmVjdG9yKCZ2YWx1ZXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAodmFsdWVzLnNpemUoKSAhPSBzdGQ6OnNpemUobUdhaW4udmFsdWVzKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzdGQ6OmNvcHkodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSwgbUdhaW4udmFsdWVzKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Qcm9maWxlLmNwcCBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9BdWRpb1Byb2ZpbGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYmUzNDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vQXVkaW9Qcm9maWxlLmNwcApAQCAtMCwwICsxLDMwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzZXQ+CisKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Qcm9maWxlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUHJvZmlsZS5oPgorI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitib29sIG9wZXJhdG9yID09IChjb25zdCBBdWRpb1Byb2ZpbGUgJmxlZnQsIGNvbnN0IEF1ZGlvUHJvZmlsZSAmcmlnaHQpCit7CisgICAgcmV0dXJuIChsZWZ0LmdldEZvcm1hdCgpID09IHJpZ2h0LmdldEZvcm1hdCgpKSAmJgorICAgICAgICAgICAgKGxlZnQuZ2V0Q2hhbm5lbHMoKSA9PSByaWdodC5nZXRDaGFubmVscygpKSAmJgorICAgICAgICAgICAgKGxlZnQuZ2V0U2FtcGxlUmF0ZXMoKSA9PSByaWdodC5nZXRTYW1wbGVSYXRlcygpKTsKK30KKworLy8gc3RhdGljCitzcDxBdWRpb1Byb2ZpbGU+IEF1ZGlvUHJvZmlsZTo6Y3JlYXRlRnVsbER5bmFtaWMoYXVkaW9fZm9ybWF0X3QgZHluYW1pY0Zvcm1hdCkKK3sKKyAgICBBdWRpb1Byb2ZpbGUqIGR5bmFtaWNQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShkeW5hbWljRm9ybWF0LAorICAgICAgICAgICAgQ2hhbm5lbE1hc2tTZXQoKSwgU2FtcGxlUmF0ZVNldCgpKTsKKyAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsKKyAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY0NoYW5uZWxzKHRydWUpOworICAgIGR5bmFtaWNQcm9maWxlLT5zZXREeW5hbWljUmF0ZSh0cnVlKTsKKyAgICByZXR1cm4gZHluYW1pY1Byb2ZpbGU7Cit9CisKK0F1ZGlvUHJvZmlsZTo6QXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSkgOgorICAgICAgICBtTmFtZSgiIiksCisgICAgICAgIG1Gb3JtYXQoZm9ybWF0KQoreworICAgIG1DaGFubmVsTWFza3MuaW5zZXJ0KGNoYW5uZWxNYXNrcyk7CisgICAgbVNhbXBsaW5nUmF0ZXMuaW5zZXJ0KHNhbXBsaW5nUmF0ZSk7Cit9CisKK0F1ZGlvUHJvZmlsZTo6QXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENoYW5uZWxNYXNrU2V0ICZjaGFubmVsTWFza3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYW1wbGVSYXRlU2V0ICZzYW1wbGluZ1JhdGVDb2xsZWN0aW9uKSA6CisgICAgICAgIG1OYW1lKCIiKSwKKyAgICAgICAgbUZvcm1hdChmb3JtYXQpLAorICAgICAgICBtQ2hhbm5lbE1hc2tzKGNoYW5uZWxNYXNrcyksCisgICAgICAgIG1TYW1wbGluZ1JhdGVzKHNhbXBsaW5nUmF0ZUNvbGxlY3Rpb24pIHt9CisKK3ZvaWQgQXVkaW9Qcm9maWxlOjpzZXRDaGFubmVscyhjb25zdCBDaGFubmVsTWFza1NldCAmY2hhbm5lbE1hc2tzKQoreworICAgIGlmIChtSXNEeW5hbWljQ2hhbm5lbHMpIHsKKyAgICAgICAgbUNoYW5uZWxNYXNrcyA9IGNoYW5uZWxNYXNrczsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qcm9maWxlOjpzZXRTYW1wbGVSYXRlcyhjb25zdCBTYW1wbGVSYXRlU2V0ICZzYW1wbGVSYXRlcykKK3sKKyAgICBpZiAobUlzRHluYW1pY1JhdGUpIHsKKyAgICAgICAgbVNhbXBsaW5nUmF0ZXMgPSBzYW1wbGVSYXRlczsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qcm9maWxlOjpjbGVhcigpCit7CisgICAgaWYgKG1Jc0R5bmFtaWNDaGFubmVscykgeworICAgICAgICBtQ2hhbm5lbE1hc2tzLmNsZWFyKCk7CisgICAgfQorICAgIGlmIChtSXNEeW5hbWljUmF0ZSkgeworICAgICAgICBtU2FtcGxpbmdSYXRlcy5jbGVhcigpOworICAgIH0KK30KKwordm9pZCBBdWRpb1Byb2ZpbGU6OmR1bXAoc3RkOjpzdHJpbmcgKmRzdCwgaW50IHNwYWNlcykgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiVzJXMlc1xuIiwgbUlzRHluYW1pY0Zvcm1hdCA/ICJbZHluYW1pYyBmb3JtYXRdIiA6ICIiLAorICAgICAgICAgICAgIG1Jc0R5bmFtaWNDaGFubmVscyA/ICJbZHluYW1pYyBjaGFubmVsc10iIDogIiIsCisgICAgICAgICAgICAgbUlzRHluYW1pY1JhdGUgPyAiW2R5bmFtaWMgcmF0ZXNdIiA6ICIiKSk7CisgICAgaWYgKG1OYW1lLmxlbmd0aCgpICE9IDApIHsKKyAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMtIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtTmFtZS5jX3N0cigpKSk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIGZvcm1hdExpdGVyYWw7CisgICAgaWYgKEZvcm1hdENvbnZlcnRlcjo6dG9TdHJpbmcobUZvcm1hdCwgZm9ybWF0TGl0ZXJhbCkpIHsKKyAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMtIGZvcm1hdDogJXNcbiIsIHNwYWNlcywgIiIsIGZvcm1hdExpdGVyYWwuY19zdHIoKSkpOworICAgIH0KKyAgICBpZiAoIW1TYW1wbGluZ1JhdGVzLmVtcHR5KCkpIHsKKyAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMtIHNhbXBsaW5nIHJhdGVzOiIsIHNwYWNlcywgIiIpKTsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbVNhbXBsaW5nUmF0ZXMuYmVnaW4oKTsgaXQgIT0gbVNhbXBsaW5nUmF0ZXMuZW5kKCk7KSB7CisgICAgICAgICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiVkIiwgKml0KSk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZCgrK2l0ID09IG1TYW1wbGluZ1JhdGVzLmVuZCgpID8gIiIgOiAiLCAiKTsKKyAgICAgICAgfQorICAgICAgICBkc3QtPmFwcGVuZCgiXG4iKTsKKyAgICB9CisKKyAgICBpZiAoIW1DaGFubmVsTWFza3MuZW1wdHkoKSkgeworICAgICAgICBkc3QtPmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiUqcy0gY2hhbm5lbCBtYXNrczoiLCBzcGFjZXMsICIiKSk7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1DaGFubmVsTWFza3MuYmVnaW4oKTsgaXQgIT0gbUNoYW5uZWxNYXNrcy5lbmQoKTspIHsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiMHglMDR4IiwgKml0KSk7CisgICAgICAgICAgICBkc3QtPmFwcGVuZCgrK2l0ID09IG1DaGFubmVsTWFza3MuZW5kKCkgPyAiIiA6ICIsICIpOworICAgICAgICB9CisgICAgICAgIGRzdC0+YXBwZW5kKCJcbiIpOworICAgIH0KK30KKworYm9vbCBBdWRpb1Byb2ZpbGU6OmVxdWFscyhjb25zdCBzcDxBdWRpb1Byb2ZpbGU+JiBvdGhlcikgY29uc3QKK3sKKyAgICByZXR1cm4gb3RoZXIgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICBtTmFtZS5jb21wYXJlKG90aGVyLT5tTmFtZSkgPT0gMCAmJgorICAgICAgICAgICBtRm9ybWF0ID09IG90aGVyLT5nZXRGb3JtYXQoKSAmJgorICAgICAgICAgICBtQ2hhbm5lbE1hc2tzID09IG90aGVyLT5nZXRDaGFubmVscygpICYmCisgICAgICAgICAgIG1TYW1wbGluZ1JhdGVzID09IG90aGVyLT5nZXRTYW1wbGVSYXRlcygpICYmCisgICAgICAgICAgIG1Jc0R5bmFtaWNGb3JtYXQgPT0gb3RoZXItPmlzRHluYW1pY0Zvcm1hdCgpICYmCisgICAgICAgICAgIG1Jc0R5bmFtaWNDaGFubmVscyA9PSBvdGhlci0+aXNEeW5hbWljQ2hhbm5lbHMoKSAmJgorICAgICAgICAgICBtSXNEeW5hbWljUmF0ZSA9PSBvdGhlci0+aXNEeW5hbWljUmF0ZSgpOworfQorCitzdGF0dXNfdCBBdWRpb1Byb2ZpbGU6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0Cit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlVXRmOEFzVXRmMTYobU5hbWUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVVaW50MzIobUZvcm1hdCkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIHN0ZDo6dmVjdG9yPGludD4gdmFsdWVzKG1DaGFubmVsTWFza3MuYmVnaW4oKSwgbUNoYW5uZWxNYXNrcy5lbmQoKSk7CisgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzJWZWN0b3IodmFsdWVzKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgdmFsdWVzLmNsZWFyKCk7CisgICAgdmFsdWVzLmFzc2lnbihtU2FtcGxpbmdSYXRlcy5iZWdpbigpLCBtU2FtcGxpbmdSYXRlcy5lbmQoKSk7CisgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlSW50MzJWZWN0b3IodmFsdWVzKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlQm9vbChtSXNEeW5hbWljRm9ybWF0KSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPndyaXRlQm9vbChtSXNEeW5hbWljQ2hhbm5lbHMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVCb29sKG1Jc0R5bmFtaWNSYXRlKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qcm9maWxlOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFV0ZjhGcm9tVXRmMTYoJm1OYW1lKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YobUZvcm1hdCkgPT0gc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRVaW50MzIocmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCo+KCZtRm9ybWF0KSkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPGludD4gdmFsdWVzOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkSW50MzJWZWN0b3IoJnZhbHVlcykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIG1DaGFubmVsTWFza3MuY2xlYXIoKTsKKyAgICBtQ2hhbm5lbE1hc2tzLmluc2VydCh2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpKTsKKyAgICB2YWx1ZXMuY2xlYXIoKTsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZEludDMyVmVjdG9yKCZ2YWx1ZXMpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBtU2FtcGxpbmdSYXRlcy5jbGVhcigpOworICAgIG1TYW1wbGluZ1JhdGVzLmluc2VydCh2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpKTsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZEJvb2woJm1Jc0R5bmFtaWNGb3JtYXQpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZEJvb2woJm1Jc0R5bmFtaWNDaGFubmVscykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZWFkQm9vbCgmbUlzRHluYW1pY1JhdGUpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzc2l6ZV90IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6YWRkKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUpCit7CisgICAgc3NpemVfdCBpbmRleCA9IHNpemUoKTsKKyAgICBwdXNoX2JhY2socHJvZmlsZSk7CisgICAgcmV0dXJuIGluZGV4OworfQorCit2b2lkIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Y2xlYXJQcm9maWxlcygpCit7CisgICAgZm9yIChhdXRvIGl0ID0gYmVnaW4oKTsgaXQgIT0gZW5kKCk7KSB7CisgICAgICAgIGlmICgoKml0KS0+aXNEeW5hbWljRm9ybWF0KCkgJiYgKCppdCktPmhhc1ZhbGlkRm9ybWF0KCkpIHsKKyAgICAgICAgICAgIGl0ID0gZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKCppdCktPmNsZWFyKCk7CisgICAgICAgICAgICArK2l0OworICAgICAgICB9CisgICAgfQorfQorCitzcDxBdWRpb1Byb2ZpbGU+IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Z2V0Rmlyc3RWYWxpZFByb2ZpbGUoKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmcHJvZmlsZSA6ICp0aGlzKSB7CisgICAgICAgIGlmIChwcm9maWxlLT5pc1ZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBwcm9maWxlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitzcDxBdWRpb1Byb2ZpbGU+IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Z2V0Rmlyc3RWYWxpZFByb2ZpbGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmcHJvZmlsZSA6ICp0aGlzKSB7CisgICAgICAgIGlmIChwcm9maWxlLT5pc1ZhbGlkKCkgJiYgcHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gcHJvZmlsZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKworRm9ybWF0VmVjdG9yIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6Z2V0U3VwcG9ydGVkRm9ybWF0cygpIGNvbnN0Cit7CisgICAgRm9ybWF0VmVjdG9yIHN1cHBvcnRlZEZvcm1hdHM7CisgICAgZm9yIChjb25zdCBhdXRvICZwcm9maWxlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKHByb2ZpbGUtPmhhc1ZhbGlkRm9ybWF0KCkpIHsKKyAgICAgICAgICAgIHN1cHBvcnRlZEZvcm1hdHMucHVzaF9iYWNrKHByb2ZpbGUtPmdldEZvcm1hdCgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3VwcG9ydGVkRm9ybWF0czsKK30KKworYm9vbCBBdWRpb1Byb2ZpbGVWZWN0b3I6Omhhc0R5bmFtaWNDaGFubmVsc0ZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZwcm9maWxlIDogKnRoaXMpIHsKKyAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNDaGFubmVscygpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgQXVkaW9Qcm9maWxlVmVjdG9yOjpoYXNEeW5hbWljRm9ybWF0KCkgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnByb2ZpbGUgOiAqdGhpcykgeworICAgICAgICBpZiAocHJvZmlsZS0+aXNEeW5hbWljRm9ybWF0KCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1Byb2ZpbGVWZWN0b3I6Omhhc0R5bmFtaWNQcm9maWxlKCkgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnByb2ZpbGUgOiAqdGhpcykgeworICAgICAgICBpZiAocHJvZmlsZS0+aXNEeW5hbWljKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1Byb2ZpbGVWZWN0b3I6Omhhc0R5bmFtaWNSYXRlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnByb2ZpbGUgOiAqdGhpcykgeworICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY1JhdGUoKSkgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIEF1ZGlvUHJvZmlsZVZlY3Rvcjo6ZHVtcChzdGQ6OnN0cmluZyAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzLSBQcm9maWxlczpcbiIsIHNwYWNlcywgIiIpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzUHJvZmlsZSAlenU6Iiwgc3BhY2VzICsgNCwgIiIsIGkpKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgcHJvZmlsZVN0cjsKKyAgICAgICAgYXQoaSktPmR1bXAoJnByb2ZpbGVTdHIsIHNwYWNlcyArIDgpOworICAgICAgICBkc3QtPmFwcGVuZChwcm9maWxlU3RyKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUHJvZmlsZVZlY3Rvcjo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVWZWN0b3JTaXplKCp0aGlzKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgZm9yIChjb25zdCBhdXRvICZhdWRpb1Byb2ZpbGUgOiAqdGhpcykgeworICAgICAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+d3JpdGVQYXJjZWxhYmxlKCphdWRpb1Byb2ZpbGUpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qcm9maWxlVmVjdG9yOjpyZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwgKnBhcmNlbCkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICB0aGlzLT5jbGVhcigpOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT5yZXNpemVPdXRWZWN0b3IodGhpcykpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGhpcy0+c2l6ZSgpOyArK2kpIHsKKyAgICAgICAgdGhpcy0+YXQoaSkgPSBuZXcgQXVkaW9Qcm9maWxlKEFVRElPX0ZPUk1BVF9ERUZBVUxULCBBVURJT19DSEFOTkVMX05PTkUsIDAgLypzYW1wbGVSYXRlKi8pOworICAgICAgICBpZiAoKHN0YXR1cyA9IHBhcmNlbC0+cmVhZFBhcmNlbGFibGUodGhpcy0+YXQoaSkuZ2V0KCkpKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgdGhpcy0+Y2xlYXIoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2Jvb2wgQXVkaW9Qcm9maWxlVmVjdG9yOjplcXVhbHMoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yJiBvdGhlcikgY29uc3QKK3sKKyAgICByZXR1cm4gc3RkOjplcXVhbChiZWdpbigpLCBlbmQoKSwgb3RoZXIuYmVnaW4oKSwgb3RoZXIuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiYgbGVmdCwgY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiYgcmlnaHQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGxlZnQtPmVxdWFscyhyaWdodCk7CisgICAgICAgICAgICAgICAgICAgICAgfSk7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9EZXZpY2VEZXNjcmlwdG9yQmFzZS5jcHAgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vRGV2aWNlRGVzY3JpcHRvckJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNzU3NmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vRGV2aWNlRGVzY3JpcHRvckJhc2UuY3BwCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VEZXNjcmlwdG9yQmFzZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9zdHJpbmdwcmludGYuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9zdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9EZXZpY2VEZXNjcmlwdG9yQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitEZXZpY2VEZXNjcmlwdG9yQmFzZTo6RGV2aWNlRGVzY3JpcHRvckJhc2UoYXVkaW9fZGV2aWNlc190IHR5cGUpIDoKKyAgICAgICAgRGV2aWNlRGVzY3JpcHRvckJhc2UodHlwZSwgIiIpCit7Cit9CisKK0RldmljZURlc2NyaXB0b3JCYXNlOjpEZXZpY2VEZXNjcmlwdG9yQmFzZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGFkZHJlc3MpIDoKKyAgICAgICAgRGV2aWNlRGVzY3JpcHRvckJhc2UoQXVkaW9EZXZpY2VUeXBlQWRkcih0eXBlLCBhZGRyZXNzKSkKK3sKK30KKworRGV2aWNlRGVzY3JpcHRvckJhc2U6OkRldmljZURlc2NyaXB0b3JCYXNlKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZVR5cGVBZGRyKSA6CisgICAgICAgIEF1ZGlvUG9ydCgiIiwgQVVESU9fUE9SVF9UWVBFX0RFVklDRSwKKyAgICAgICAgICAgICAgICAgIGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlVHlwZUFkZHIubVR5cGUpID8gQVVESU9fUE9SVF9ST0xFX1NJTksgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU09VUkNFKSwKKyAgICAgICAgbURldmljZVR5cGVBZGRyKGRldmljZVR5cGVBZGRyKQoreworICAgIGlmIChtRGV2aWNlVHlwZUFkZHIubUFkZHJlc3MuZW1wdHkoKSAmJiBhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShtRGV2aWNlVHlwZUFkZHIubVR5cGUpKSB7CisgICAgICAgIG1EZXZpY2VUeXBlQWRkci5tQWRkcmVzcyA9ICIwIjsKKyAgICB9Cit9CisKK3ZvaWQgRGV2aWNlRGVzY3JpcHRvckJhc2U6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Cit7CisgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX0dBSU47CisgICAgaWYgKG1TYW1wbGluZ1JhdGUgIT0gMCkgeworICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFOworICAgIH0KKyAgICBpZiAobUNoYW5uZWxNYXNrICE9IEFVRElPX0NIQU5ORUxfTk9ORSkgeworICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSzsKKyAgICB9CisgICAgaWYgKG1Gb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQpIHsKKyAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQ7CisgICAgfQorCisgICAgaWYgKHNyY0NvbmZpZyAhPSBOVUxMKSB7CisgICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gc3JjQ29uZmlnLT5jb25maWdfbWFzazsKKyAgICB9CisKKyAgICBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKKworICAgIGRzdENvbmZpZy0+cm9sZSA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2UobURldmljZVR5cGVBZGRyLm1UeXBlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU0lOSyA6IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CisgICAgZHN0Q29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRTsKKyAgICBkc3RDb25maWctPmV4dC5kZXZpY2UudHlwZSA9IG1EZXZpY2VUeXBlQWRkci5tVHlwZTsKKworICAgICh2b2lkKWF1ZGlvX3V0aWxzX3N0cmxjcHlfemVyb2ZpbGwoZHN0Q29uZmlnLT5leHQuZGV2aWNlLmFkZHJlc3MsIG1EZXZpY2VUeXBlQWRkci5nZXRBZGRyZXNzKCkpOworfQorCit2b2lkIERldmljZURlc2NyaXB0b3JCYXNlOjp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKK3sKKyAgICBBTE9HVigiRGV2aWNlRGVzY3JpcHRvckJhc2U6OnRvQXVkaW9Qb3J0KCkgaGFuZGxlICVkIHR5cGUgJTA4eCIsIG1JZCwgbURldmljZVR5cGVBZGRyLm1UeXBlKTsKKyAgICBBdWRpb1BvcnQ6OnRvQXVkaW9Qb3J0KHBvcnQpOworICAgIHRvQXVkaW9Qb3J0Q29uZmlnKCZwb3J0LT5hY3RpdmVfY29uZmlnKTsKKyAgICBwb3J0LT5pZCA9IG1JZDsKKyAgICBwb3J0LT5leHQuZGV2aWNlLnR5cGUgPSBtRGV2aWNlVHlwZUFkZHIubVR5cGU7CisgICAgKHZvaWQpYXVkaW9fdXRpbHNfc3RybGNweV96ZXJvZmlsbChwb3J0LT5leHQuZGV2aWNlLmFkZHJlc3MsIG1EZXZpY2VUeXBlQWRkci5nZXRBZGRyZXNzKCkpOworfQorCit2b2lkIERldmljZURlc2NyaXB0b3JCYXNlOjpkdW1wKHN0ZDo6c3RyaW5nICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0cmFJbmZvLCBib29sIHZlcmJvc2UpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnNEZXZpY2UgJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCArIDEpKTsKKyAgICBpZiAobUlkICE9IDApIHsKKyAgICAgICAgZHN0LT5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlKnMtIGlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1JZCkpOworICAgIH0KKworICAgIGlmIChleHRyYUluZm8gIT0gbnVsbHB0cikgeworICAgICAgICBkc3QtPmFwcGVuZChleHRyYUluZm8pOworICAgIH0KKworICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJSpzLSB0eXBlOiAlLTQ4c1xuIiwKKyAgICAgICAgICAgIHNwYWNlcywgIiIsIDo6YW5kcm9pZDo6dG9TdHJpbmcobURldmljZVR5cGVBZGRyLm1UeXBlKS5jX3N0cigpKSk7CisKKyAgICBpZiAobURldmljZVR5cGVBZGRyLm1BZGRyZXNzLnNpemUoKSAhPSAwKSB7CisgICAgICAgIGRzdC0+YXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigKKyAgICAgICAgICAgICAgICAiJSpzLSBhZGRyZXNzOiAlLTMyc1xuIiwgc3BhY2VzLCAiIiwgbURldmljZVR5cGVBZGRyLmdldEFkZHJlc3MoKSkpOworICAgIH0KKyAgICBBdWRpb1BvcnQ6OmR1bXAoZHN0LCBzcGFjZXMsIHZlcmJvc2UpOworfQorCitzdGQ6OnN0cmluZyBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6dG9TdHJpbmcoKSBjb25zdAoreworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzdHJlYW07CisgICAgc3N0cmVhbSA8PCAidHlwZToweCIgPDwgc3RkOjpoZXggPDwgdHlwZSgpIDw8ICIsQDoiIDw8IG1EZXZpY2VUeXBlQWRkci5tQWRkcmVzczsKKyAgICByZXR1cm4gc3N0cmVhbS5zdHIoKTsKK30KKwordm9pZCBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6bG9nKCkgY29uc3QKK3sKKyAgICBBTE9HSSgiRGV2aWNlIGlkOiVkIHR5cGU6MHglMDhYOiVzLCBhZGRyOiVzIiwgbUlkLCAgbURldmljZVR5cGVBZGRyLm1UeXBlLAorICAgICAgICAgIDo6YW5kcm9pZDo6dG9TdHJpbmcobURldmljZVR5cGVBZGRyLm1UeXBlKS5jX3N0cigpLAorICAgICAgICAgIG1EZXZpY2VUeXBlQWRkci5nZXRBZGRyZXNzKCkpOworCisgICAgQXVkaW9Qb3J0Ojpsb2coIiAgIik7Cit9CisKK2Jvb2wgRGV2aWNlRGVzY3JpcHRvckJhc2U6OmVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4gJm90aGVyKSBjb25zdAoreworICAgIHJldHVybiBvdGhlciAhPSBudWxscHRyICYmCisgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEF1ZGlvUG9ydCo+KHRoaXMpLT5lcXVhbHMob3RoZXIpICYmCisgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEF1ZGlvUG9ydENvbmZpZyo+KHRoaXMpLT5lcXVhbHMob3RoZXIpICYmCisgICAgICAgICAgIG1EZXZpY2VUeXBlQWRkci5lcXVhbHMob3RoZXItPm1EZXZpY2VUeXBlQWRkcik7Cit9CisKK3N0YXR1c190IERldmljZURlc2NyaXB0b3JCYXNlOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCAqcGFyY2VsKSBjb25zdAoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmICgoc3RhdHVzID0gQXVkaW9Qb3J0Ojp3cml0ZVRvUGFyY2VsKHBhcmNlbCkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gQXVkaW9Qb3J0Q29uZmlnOjp3cml0ZVRvUGFyY2VsKHBhcmNlbCkpICE9IE5PX0VSUk9SKSByZXR1cm4gc3RhdHVzOworICAgIGlmICgoc3RhdHVzID0gcGFyY2VsLT53cml0ZVBhcmNlbGFibGUobURldmljZVR5cGVBZGRyKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgRGV2aWNlRGVzY3JpcHRvckJhc2U6OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmICgoc3RhdHVzID0gQXVkaW9Qb3J0OjpyZWFkRnJvbVBhcmNlbChwYXJjZWwpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBpZiAoKHN0YXR1cyA9IEF1ZGlvUG9ydENvbmZpZzo6cmVhZEZyb21QYXJjZWwocGFyY2VsKSkgIT0gTk9fRVJST1IpIHJldHVybiBzdGF0dXM7CisgICAgaWYgKChzdGF0dXMgPSBwYXJjZWwtPnJlYWRQYXJjZWxhYmxlKCZtRGV2aWNlVHlwZUFkZHIpKSAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBEZXZpY2VEZXNjcmlwdG9yQmFzZVZlY3RvciYgZGV2aWNlcykKK3sKKyAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2UgOiBkZXZpY2VzKSB7CisgICAgICAgIGlmIChkZXZpY2UgIT0gKmRldmljZXMuYmVnaW4oKSkgeworICAgICAgICAgICAgcmV0ICs9ICI7IjsKKyAgICAgICAgfQorICAgICAgICByZXQgKz0gZGV2aWNlLT50b1N0cmluZygpOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIGRldmljZVR5cGVBZGRyc0Zyb21EZXNjcmlwdG9ycyhjb25zdCBEZXZpY2VEZXNjcmlwdG9yQmFzZVZlY3RvciYgZGV2aWNlcykKK3sKKyAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIGRldmljZVR5cGVBZGRyczsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IGRldmljZXMpIHsKKyAgICAgICAgZGV2aWNlVHlwZUFkZHJzLnB1c2hfYmFjayhkZXZpY2UtPmdldERldmljZVR5cGVBZGRyKCkpOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlVHlwZUFkZHJzOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vVEVTVF9NQVBQSU5HIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQyNDlhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDcgQEAKK3sKKyAgInByZXN1Ym1pdCI6IFsKKyAgICB7CisgICAgICAgIm5hbWUiOiAiYXVkaW9mb3VuZGF0aW9uX3BhcmNlbGFibGVfdGVzdCIKKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvQ29udGFpbmVycy5oIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Db250YWluZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzJmZGE0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvQ29udGFpbmVycy5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIENoYW5uZWxNYXNrU2V0ID0gc3RkOjpzZXQ8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+OwordXNpbmcgRGV2aWNlVHlwZVNldCA9IHN0ZDo6c2V0PGF1ZGlvX2RldmljZXNfdD47Cit1c2luZyBGb3JtYXRTZXQgPSBzdGQ6OnNldDxhdWRpb19mb3JtYXRfdD47Cit1c2luZyBTYW1wbGVSYXRlU2V0ID0gc3RkOjpzZXQ8dWludDMyX3Q+OworCit1c2luZyBGb3JtYXRWZWN0b3IgPSBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD47CisKK2NvbnN0IERldmljZVR5cGVTZXQmIGdldEF1ZGlvRGV2aWNlT3V0QWxsU2V0KCk7Citjb25zdCBEZXZpY2VUeXBlU2V0JiBnZXRBdWRpb0RldmljZU91dEFsbEEyZHBTZXQoKTsKK2NvbnN0IERldmljZVR5cGVTZXQmIGdldEF1ZGlvRGV2aWNlT3V0QWxsU2NvU2V0KCk7Citjb25zdCBEZXZpY2VUeXBlU2V0JiBnZXRBdWRpb0RldmljZU91dEFsbFVzYlNldCgpOworY29uc3QgRGV2aWNlVHlwZVNldCYgZ2V0QXVkaW9EZXZpY2VJbkFsbFNldCgpOworY29uc3QgRGV2aWNlVHlwZVNldCYgZ2V0QXVkaW9EZXZpY2VJbkFsbFVzYlNldCgpOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RhdGljIHN0ZDo6dmVjdG9yPFQ+IEludGVyc2VjdGlvbihjb25zdCBzdGQ6OnNldDxUPiYgYSwgY29uc3Qgc3RkOjpzZXQ8VD4mIGIpIHsKKyAgICBzdGQ6OnZlY3RvcjxUPiBpbnRlcnNlY3Rpb247CisgICAgc3RkOjpzZXRfaW50ZXJzZWN0aW9uKGEuYmVnaW4oKSwgYS5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYi5iZWdpbigpLCBiLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoaW50ZXJzZWN0aW9uKSk7CisgICAgcmV0dXJuIGludGVyc2VjdGlvbjsKK30KKworc3RhdGljIGlubGluZSBDaGFubmVsTWFza1NldCBhc0luTWFzayhjb25zdCBDaGFubmVsTWFza1NldCYgY2hhbm5lbE1hc2tzKSB7CisgICAgQ2hhbm5lbE1hc2tTZXQgaW5NYXNrU2V0OworICAgIGZvciAoY29uc3QgYXV0byAmY2hhbm5lbCA6IGNoYW5uZWxNYXNrcykgeworICAgICAgICBpZiAoYXVkaW9fY2hhbm5lbF9tYXNrX291dF90b19pbihjaGFubmVsKSAhPSBBVURJT19DSEFOTkVMX0lOVkFMSUQpIHsKKyAgICAgICAgICAgIGluTWFza1NldC5pbnNlcnQoYXVkaW9fY2hhbm5lbF9tYXNrX291dF90b19pbihjaGFubmVsKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGluTWFza1NldDsKK30KKworc3RhdGljIGlubGluZSBDaGFubmVsTWFza1NldCBhc091dE1hc2soY29uc3QgQ2hhbm5lbE1hc2tTZXQmIGNoYW5uZWxNYXNrcykgeworICAgIENoYW5uZWxNYXNrU2V0IG91dE1hc2tTZXQ7CisgICAgZm9yIChjb25zdCBhdXRvICZjaGFubmVsIDogY2hhbm5lbE1hc2tzKSB7CisgICAgICAgIGlmIChhdWRpb19jaGFubmVsX21hc2tfaW5fdG9fb3V0KGNoYW5uZWwpICE9IEFVRElPX0NIQU5ORUxfSU5WQUxJRCkgeworICAgICAgICAgICAgb3V0TWFza1NldC5pbnNlcnQoYXVkaW9fY2hhbm5lbF9tYXNrX2luX3RvX291dChjaGFubmVsKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG91dE1hc2tTZXQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBpc1NpbmdsZURldmljZVR5cGUoY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlKSB7CisgICAgcmV0dXJuIGRldmljZVR5cGVzLnNpemUoKSA9PSAxICYmICooZGV2aWNlVHlwZXMuYmVnaW4oKSkgPT0gZGV2aWNlVHlwZTsKK30KKwordHlwZWRlZiBib29sICgqRGV2aWNlVHlwZVVuYXJ5UHJlZGljYXRlKShhdWRpb19kZXZpY2VzX3QpOworc3RhdGljIGlubGluZSBib29sIGlzU2luZ2xlRGV2aWNlVHlwZShjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVHlwZVVuYXJ5UHJlZGljYXRlIHApIHsKKyAgICByZXR1cm4gZGV2aWNlVHlwZXMuc2l6ZSgpID09IDEgJiYgcCgqKGRldmljZVR5cGVzLmJlZ2luKCkpKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGFyZUFsbE9mU2FtZURldmljZVR5cGUoY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woYXVkaW9fZGV2aWNlc190KT4gcCkgeworICAgIHJldHVybiBzdGQ6OmFsbF9vZihkZXZpY2VUeXBlcy5iZWdpbigpLCBkZXZpY2VUeXBlcy5lbmQoKSwgcCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZCByZXNldERldmljZVR5cGVzKERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzLCBhdWRpb19kZXZpY2VzX3QgdHlwZVRvQWRkKSB7CisgICAgZGV2aWNlVHlwZXMuY2xlYXIoKTsKKyAgICBkZXZpY2VUeXBlcy5pbnNlcnQodHlwZVRvQWRkKTsKK30KKworLy8gRklYTUU6IFRoaXMgaXMgdGVtcG9yYXJ5IGhlbHBlciBmdW5jdGlvbi4gUmVtb3ZlIHRoaXMgd2hlbiBnZXR0aW5nIHJpZCBvZiBhbGwKKy8vICBiaXQgbWFzayB1c2FnZXMgb2YgYXVkaW8gZGV2aWNlIHR5cGVzLgorc3RhdGljIGlubGluZSBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZXNUb0JpdE1hc2soY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpIHsKKyAgICBhdWRpb19kZXZpY2VzX3QgdHlwZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBmb3IgKGF1dG8gZGV2aWNlVHlwZSA6IGRldmljZVR5cGVzKSB7CisgICAgICAgIHR5cGVzIHw9IGRldmljZVR5cGU7CisgICAgfQorICAgIHJldHVybiB0eXBlczsKK30KKworLy8gRklYTUU6IFRoaXMgaXMgdGVtcG9yYXJ5IGhlbHBlciBmdW5jdGlvbi4gUmVtb3ZlIHRoaXMgd2hlbiBnZXR0aW5nIHJpZCBvZiBhbGwKKy8vICBiaXQgbWFzayB1c2FnZXMgb2YgYXVkaW8gZGV2aWNlIHR5cGVzLgorc3RhdGljIGlubGluZSBEZXZpY2VUeXBlU2V0IGRldmljZVR5cGVzRnJvbUJpdE1hc2soYXVkaW9fZGV2aWNlc190IHR5cGVzKSB7CisgICAgRGV2aWNlVHlwZVNldCBkZXZpY2VUeXBlczsKKyAgICBpZiAoKHR5cGVzICYgQVVESU9fREVWSUNFX0JJVF9JTikgPT0gMCkgeworICAgICAgICBmb3IgKGF1dG8gZGV2aWNlVHlwZSA6IEFVRElPX0RFVklDRV9PVVRfQUxMX0FSUkFZKSB7CisgICAgICAgICAgICBpZiAoKHR5cGVzICYgZGV2aWNlVHlwZSkgPT0gZGV2aWNlVHlwZSkgeworICAgICAgICAgICAgICAgIGRldmljZVR5cGVzLmluc2VydChkZXZpY2VUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoYXV0byBkZXZpY2VUeXBlIDogQVVESU9fREVWSUNFX0lOX0FMTF9BUlJBWSkgeworICAgICAgICAgICAgaWYgKCh0eXBlcyAmIGRldmljZVR5cGUpID09IGRldmljZVR5cGUpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VUeXBlcy5pbnNlcnQoZGV2aWNlVHlwZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGRldmljZVR5cGVzOworfQorCitib29sIGRldmljZVR5cGVzVG9TdHJpbmcoY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMsIHN0ZDo6c3RyaW5nICZzdHIpOworCitzdGQ6OnN0cmluZyBkdW1wRGV2aWNlVHlwZXMoY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpOworCisvKioKKyAqIFJldHVybiBodW1hbiByZWFkYWJsZSBzdHJpbmcgZm9yIGRldmljZSB0eXBlcy4KKyAqLworc3RkOjpzdHJpbmcgdG9TdHJpbmcoY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpOworCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmggYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBlYTc4ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvRGV2aWNlVHlwZUFkZHIuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db250YWluZXJzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgOiBwdWJsaWMgUGFyY2VsYWJsZSB7CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkcigpID0gZGVmYXVsdDsKKworICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzKSA6CisgICAgICAgICAgICBtVHlwZSh0eXBlKSwgbUFkZHJlc3MoYWRkcmVzcykge30KKworICAgIGNvbnN0IGNoYXIqIGdldEFkZHJlc3MoKSBjb25zdDsKKworICAgIGJvb2wgZXF1YWxzKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIG90aGVyKSBjb25zdDsKKworICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHImIG9wZXJhdG9yPSAoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYpID0gZGVmYXVsdDsKKworICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIG90aGVyKSBjb25zdDsKKworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAqcGFyY2VsKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOworCisgICAgYXVkaW9fZGV2aWNlc190IG1UeXBlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgc3RkOjpzdHJpbmcgbUFkZHJlc3M7Cit9OworCit1c2luZyBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yID0gc3RkOjp2ZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj47CisKKy8qKgorICogUmV0dXJuIGEgY29sbGVjdGlvbiBvZiBhdWRpbyBkZXZpY2UgdHlwZXMgZnJvbSBhIGNvbGxlY3Rpb24gb2YgQXVkaW9EZXZpY2VUeXBlQWRkcgorICovCitEZXZpY2VUeXBlU2V0IGdldEF1ZGlvRGV2aWNlVHlwZXMoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciYgZGV2aWNlVHlwZUFkZHJzKTsKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9HYWluLmggYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb0dhaW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTlmMWU3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9HYWluLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvR2FpbjogcHVibGljIFJlZkJhc2UsIHB1YmxpYyBQYXJjZWxhYmxlCit7CitwdWJsaWM6CisgICAgQXVkaW9HYWluKGludCBpbmRleCwgYm9vbCB1c2VJbkNoYW5uZWxNYXNrKTsKKyAgICB2aXJ0dWFsIH5BdWRpb0dhaW4oKSB7fQorCisgICAgdm9pZCBzZXRNb2RlKGF1ZGlvX2dhaW5fbW9kZV90IG1vZGUpIHsgbUdhaW4ubW9kZSA9IG1vZGU7IH0KKyAgICBjb25zdCBhdWRpb19nYWluX21vZGVfdCAmZ2V0TW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1HYWluLm1vZGU7IH0KKworICAgIHZvaWQgc2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWFzaykgeyBtR2Fpbi5jaGFubmVsX21hc2sgPSBtYXNrOyB9CisgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgJmdldENoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUdhaW4uY2hhbm5lbF9tYXNrOyB9CisKKyAgICB2b2lkIHNldE1pblZhbHVlSW5NYihpbnQgbWluVmFsdWUpIHsgbUdhaW4ubWluX3ZhbHVlID0gbWluVmFsdWU7IH0KKyAgICBpbnQgZ2V0TWluVmFsdWVJbk1iKCkgY29uc3QgeyByZXR1cm4gbUdhaW4ubWluX3ZhbHVlOyB9CisKKyAgICB2b2lkIHNldE1heFZhbHVlSW5NYihpbnQgbWF4VmFsdWUpIHsgbUdhaW4ubWF4X3ZhbHVlID0gbWF4VmFsdWU7IH0KKyAgICBpbnQgZ2V0TWF4VmFsdWVJbk1iKCkgY29uc3QgeyByZXR1cm4gbUdhaW4ubWF4X3ZhbHVlOyB9CisKKyAgICB2b2lkIHNldERlZmF1bHRWYWx1ZUluTWIoaW50IGRlZmF1bHRWYWx1ZSkgeyBtR2Fpbi5kZWZhdWx0X3ZhbHVlID0gZGVmYXVsdFZhbHVlOyB9CisgICAgaW50IGdldERlZmF1bHRWYWx1ZUluTWIoKSBjb25zdCB7IHJldHVybiBtR2Fpbi5kZWZhdWx0X3ZhbHVlOyB9CisKKyAgICB2b2lkIHNldFN0ZXBWYWx1ZUluTWIodWludDMyX3Qgc3RlcFZhbHVlKSB7IG1HYWluLnN0ZXBfdmFsdWUgPSBzdGVwVmFsdWU7IH0KKyAgICBpbnQgZ2V0U3RlcFZhbHVlSW5NYigpIGNvbnN0IHsgcmV0dXJuIG1HYWluLnN0ZXBfdmFsdWU7IH0KKworICAgIHZvaWQgc2V0TWluUmFtcEluTXModWludDMyX3QgbWluUmFtcCkgeyBtR2Fpbi5taW5fcmFtcF9tcyA9IG1pblJhbXA7IH0KKyAgICBpbnQgZ2V0TWluUmFtcEluTXMoKSBjb25zdCB7IHJldHVybiBtR2Fpbi5taW5fcmFtcF9tczsgfQorCisgICAgdm9pZCBzZXRNYXhSYW1wSW5Ncyh1aW50MzJfdCBtYXhSYW1wKSB7IG1HYWluLm1heF9yYW1wX21zID0gbWF4UmFtcDsgfQorICAgIGludCBnZXRNYXhSYW1wSW5NcygpIGNvbnN0IHsgcmV0dXJuIG1HYWluLm1heF9yYW1wX21zOyB9CisKKyAgICAvLyBUT0RPOiByZW1vdmUgZHVtcCBmcm9tIGhlcmUgKHNwbGl0IHNlcmlhbGl6YXRpb24pCisgICAgdm9pZCBkdW1wKHN0ZDo6c3RyaW5nICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisKKyAgICB2b2lkIGdldERlZmF1bHRDb25maWcoc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpOworICAgIHN0YXR1c190IGNoZWNrQ29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKTsKKworICAgIHZvaWQgc2V0VXNlRm9yVm9sdW1lKGJvb2wgY2FuVXNlRm9yVm9sdW1lKSB7IG1Vc2VGb3JWb2x1bWUgPSBjYW5Vc2VGb3JWb2x1bWU7IH0KKyAgICBib29sIGNhblVzZUZvclZvbHVtZSgpIGNvbnN0IHsgcmV0dXJuIG1Vc2VGb3JWb2x1bWU7IH0KKworICAgIGNvbnN0IHN0cnVjdCBhdWRpb19nYWluICZnZXRHYWluKCkgY29uc3QgeyByZXR1cm4gbUdhaW47IH0KKworICAgIGJvb2wgZXF1YWxzKGNvbnN0IHNwPEF1ZGlvR2Fpbj4mIG90aGVyKSBjb25zdDsKKworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOworICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBpbnQgICAgICAgICAgICAgICBtSW5kZXg7CisgICAgc3RydWN0IGF1ZGlvX2dhaW4gbUdhaW47CisgICAgYm9vbCAgICAgICAgICAgICAgbVVzZUluQ2hhbm5lbE1hc2s7CisgICAgYm9vbCAgICAgICAgICAgICAgbVVzZUZvclZvbHVtZSA9IGZhbHNlOworfTsKKworY2xhc3MgQXVkaW9HYWlucyA6IHB1YmxpYyBzdGQ6OnZlY3RvcjxzcDxBdWRpb0dhaW4+ID4sIHB1YmxpYyBQYXJjZWxhYmxlCit7CitwdWJsaWM6CisgICAgYm9vbCBjYW5Vc2VGb3JWb2x1bWUoKSBjb25zdAorICAgIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZnYWluOiAqdGhpcykgeworICAgICAgICAgICAgaWYgKGdhaW4tPmNhblVzZUZvclZvbHVtZSgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGludDMyX3QgYWRkKGNvbnN0IHNwPEF1ZGlvR2Fpbj4gZ2FpbikKKyAgICB7CisgICAgICAgIHB1c2hfYmFjayhnYWluKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgYm9vbCBlcXVhbHMoY29uc3QgQXVkaW9HYWlucyYgb3RoZXIpIGNvbnN0OworCisgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Qb3J0LmggYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9BdWRpb1BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzAxM2NiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Qb3J0LmgKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGJpbmRlci9QYXJjZWwuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsYWJsZS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvR2Fpbi5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUHJvZmlsZS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQXVkaW9Qb3J0IDogcHVibGljIHZpcnR1YWwgUmVmQmFzZSwgcHVibGljIHZpcnR1YWwgUGFyY2VsYWJsZQoreworcHVibGljOgorICAgIEF1ZGlvUG9ydChjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwgIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpIDoKKyAgICAgICAgICAgIG1OYW1lKG5hbWUpLCBtVHlwZSh0eXBlKSwgbVJvbGUocm9sZSkge30KKworICAgIHZpcnR1YWwgfkF1ZGlvUG9ydCgpID0gZGVmYXVsdDsKKworICAgIHZvaWQgc2V0TmFtZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgeyBtTmFtZSA9IG5hbWU7IH0KKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisKKyAgICBhdWRpb19wb3J0X3R5cGVfdCBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KKyAgICBhdWRpb19wb3J0X3JvbGVfdCBnZXRSb2xlKCkgY29uc3QgeyByZXR1cm4gbVJvbGU7IH0KKworICAgIHZvaWQgc2V0R2FpbnMoY29uc3QgQXVkaW9HYWlucyAmZ2FpbnMpIHsgbUdhaW5zID0gZ2FpbnM7IH0KKyAgICBjb25zdCBBdWRpb0dhaW5zICZnZXRHYWlucygpIGNvbnN0IHsgcmV0dXJuIG1HYWluczsgfQorCisgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBhZGRBdWRpb1Byb2ZpbGUoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZSkgeworICAgICAgICBtUHJvZmlsZXMuYWRkKHByb2ZpbGUpOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXJBdWRpb1Byb2ZpbGVzKCkgeworICAgICAgICBtUHJvZmlsZXMuY2xlYXJQcm9maWxlcygpOworICAgIH0KKworICAgIGJvb2wgaGFzVmFsaWRBdWRpb1Byb2ZpbGUoKSBjb25zdCB7IHJldHVybiBtUHJvZmlsZXMuaGFzVmFsaWRQcm9maWxlKCk7IH0KKworICAgIGJvb2wgaGFzRHluYW1pY0F1ZGlvUHJvZmlsZSgpIGNvbnN0IHsgcmV0dXJuIG1Qcm9maWxlcy5oYXNEeW5hbWljUHJvZmlsZSgpOyB9CisKKyAgICB2b2lkIHNldEF1ZGlvUHJvZmlsZXMoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yICZwcm9maWxlcykgeyBtUHJvZmlsZXMgPSBwcm9maWxlczsgfQorICAgIEF1ZGlvUHJvZmlsZVZlY3RvciAmZ2V0QXVkaW9Qcm9maWxlcygpIHsgcmV0dXJuIG1Qcm9maWxlczsgfQorCisgICAgdmlydHVhbCB2b2lkIGltcG9ydEF1ZGlvUG9ydChjb25zdCBzcDxBdWRpb1BvcnQ+JiBwb3J0LCBib29sIGZvcmNlID0gZmFsc2UpOworCisgICAgc3RhdHVzX3QgY2hlY2tHYWluKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqZ2FpbkNvbmZpZywgaW50IGluZGV4KSBjb25zdCB7CisgICAgICAgIGlmIChpbmRleCA8IDAgfHwgKHNpemVfdClpbmRleCA+PSBtR2FpbnMuc2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBtR2FpbnNbaW5kZXhdLT5jaGVja0NvbmZpZyhnYWluQ29uZmlnKTsKKyAgICB9CisKKyAgICBib29sIHVzZUlucHV0Q2hhbm5lbE1hc2soKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuICgobVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgJiYgKG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpKSB8fAorICAgICAgICAgICAgICAgICgobVR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgJiYgKG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSk7CisgICAgfQorCisgICAgdm9pZCBkdW1wKHN0ZDo6c3RyaW5nICpkc3QsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OworCisgICAgdm9pZCBsb2coY29uc3QgY2hhciogaW5kZW50KSBjb25zdDsKKworICAgIGJvb2wgZXF1YWxzKGNvbnN0IHNwPEF1ZGlvUG9ydD4mIG90aGVyKSBjb25zdDsKKworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOworICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKKworICAgIEF1ZGlvR2FpbnMgbUdhaW5zOyAvLyBnYWluIGNvbnRyb2xsZXJzCitwcm90ZWN0ZWQ6CisgICAgc3RkOjpzdHJpbmcgIG1OYW1lOworICAgIGF1ZGlvX3BvcnRfdHlwZV90IG1UeXBlOworICAgIGF1ZGlvX3BvcnRfcm9sZV90IG1Sb2xlOworICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBtUHJvZmlsZXM7IC8vIEF1ZGlvUHJvZmlsZXMgc3VwcG9ydGVkIGJ5IHRoaXMgcG9ydCAoZm9ybWF0LCBSYXRlcywgQ2hhbm5lbHMpCit9OworCisKK2NsYXNzIEF1ZGlvUG9ydENvbmZpZyA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UsIHB1YmxpYyB2aXJ0dWFsIFBhcmNlbGFibGUKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5BdWRpb1BvcnRDb25maWcoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBhcHBseUF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqYmFja3VwQ29uZmlnID0gTlVMTCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CisKKyAgICB1bnNpZ25lZCBpbnQgZ2V0U2FtcGxpbmdSYXRlKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsaW5nUmF0ZTsgfQorICAgIGF1ZGlvX2Zvcm1hdF90IGdldEZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1Gb3JtYXQ7IH0KKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBnZXRDaGFubmVsTWFzaygpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsTWFzazsgfQorICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtSWQ7IH0KKworICAgIGJvb2wgaGFzR2FpbkNvbnRyb2xsZXIoYm9vbCBjYW5Vc2VGb3JWb2x1bWUgPSBmYWxzZSkgY29uc3Q7CisKKyAgICBib29sIGVxdWFscyhjb25zdCBzcDxBdWRpb1BvcnRDb25maWc+JiBvdGhlcikgY29uc3Q7CisKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgICB1bnNpZ25lZCBpbnQgbVNhbXBsaW5nUmF0ZSA9IDB1OworICAgIGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyBtR2FpbiA9IHsgLmluZGV4ID0gLTEgfTsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvUHJvZmlsZS5oIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvQXVkaW9Qcm9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzMwMTM4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL0F1ZGlvUHJvZmlsZS5oCkBAIC0wLDAgKzEsMTE4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db250YWluZXJzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIEF1ZGlvUHJvZmlsZSBmaW5hbCA6IHB1YmxpYyBSZWZCYXNlLCBwdWJsaWMgUGFyY2VsYWJsZQoreworcHVibGljOgorICAgIHN0YXRpYyBzcDxBdWRpb1Byb2ZpbGU+IGNyZWF0ZUZ1bGxEeW5hbWljKGF1ZGlvX2Zvcm1hdF90IGR5bmFtaWNGb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCk7CisKKyAgICBBdWRpb1Byb2ZpbGUoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFza3MsIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSk7CisgICAgQXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgY29uc3QgQ2hhbm5lbE1hc2tTZXQgJmNoYW5uZWxNYXNrcywKKyAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxlUmF0ZVNldCAmc2FtcGxpbmdSYXRlQ29sbGVjdGlvbik7CisKKyAgICBhdWRpb19mb3JtYXRfdCBnZXRGb3JtYXQoKSBjb25zdCB7IHJldHVybiBtRm9ybWF0OyB9CisgICAgY29uc3QgQ2hhbm5lbE1hc2tTZXQgJmdldENoYW5uZWxzKCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxNYXNrczsgfQorICAgIGNvbnN0IFNhbXBsZVJhdGVTZXQgJmdldFNhbXBsZVJhdGVzKCkgY29uc3QgeyByZXR1cm4gbVNhbXBsaW5nUmF0ZXM7IH0KKyAgICB2b2lkIHNldENoYW5uZWxzKGNvbnN0IENoYW5uZWxNYXNrU2V0ICZjaGFubmVsTWFza3MpOworICAgIHZvaWQgc2V0U2FtcGxlUmF0ZXMoY29uc3QgU2FtcGxlUmF0ZVNldCAmc2FtcGxlUmF0ZXMpOworCisgICAgdm9pZCBjbGVhcigpOworICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIGhhc1ZhbGlkRm9ybWF0KCkgJiYgaGFzVmFsaWRSYXRlcygpICYmIGhhc1ZhbGlkQ2hhbm5lbHMoKTsgfQorICAgIGJvb2wgc3VwcG9ydHNDaGFubmVscyhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVscykgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtQ2hhbm5lbE1hc2tzLmNvdW50KGNoYW5uZWxzKSAhPSAwOworICAgIH0KKyAgICBib29sIHN1cHBvcnRzUmF0ZSh1aW50MzJfdCByYXRlKSBjb25zdCB7IHJldHVybiBtU2FtcGxpbmdSYXRlcy5jb3VudChyYXRlKSAhPSAwOyB9CisKKyAgICBib29sIGhhc1ZhbGlkRm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVDsgfQorICAgIGJvb2wgaGFzVmFsaWRSYXRlcygpIGNvbnN0IHsgcmV0dXJuICFtU2FtcGxpbmdSYXRlcy5lbXB0eSgpOyB9CisgICAgYm9vbCBoYXNWYWxpZENoYW5uZWxzKCkgY29uc3QgeyByZXR1cm4gIW1DaGFubmVsTWFza3MuZW1wdHkoKTsgfQorCisgICAgdm9pZCBzZXREeW5hbWljQ2hhbm5lbHMoYm9vbCBkeW5hbWljKSB7IG1Jc0R5bmFtaWNDaGFubmVscyA9IGR5bmFtaWM7IH0KKyAgICBib29sIGlzRHluYW1pY0NoYW5uZWxzKCkgY29uc3QgeyByZXR1cm4gbUlzRHluYW1pY0NoYW5uZWxzOyB9CisKKyAgICB2b2lkIHNldER5bmFtaWNSYXRlKGJvb2wgZHluYW1pYykgeyBtSXNEeW5hbWljUmF0ZSA9IGR5bmFtaWM7IH0KKyAgICBib29sIGlzRHluYW1pY1JhdGUoKSBjb25zdCB7IHJldHVybiBtSXNEeW5hbWljUmF0ZTsgfQorCisgICAgdm9pZCBzZXREeW5hbWljRm9ybWF0KGJvb2wgZHluYW1pYykgeyBtSXNEeW5hbWljRm9ybWF0ID0gZHluYW1pYzsgfQorICAgIGJvb2wgaXNEeW5hbWljRm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUlzRHluYW1pY0Zvcm1hdDsgfQorCisgICAgYm9vbCBpc0R5bmFtaWMoKSB7IHJldHVybiBtSXNEeW5hbWljRm9ybWF0IHx8IG1Jc0R5bmFtaWNDaGFubmVscyB8fCBtSXNEeW5hbWljUmF0ZTsgfQorCisgICAgdm9pZCBkdW1wKHN0ZDo6c3RyaW5nICpkc3QsIGludCBzcGFjZXMpIGNvbnN0OworCisgICAgYm9vbCBlcXVhbHMoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiYgb3RoZXIpIGNvbnN0OworCisgICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nICBtTmFtZTsKKyAgICBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OyAvLyBUaGUgZm9ybWF0IGZvciBhbiBhdWRpbyBwcm9maWxlIHNob3VsZCBvbmx5IGJlIHNldCB3aGVuIGluaXRpYWxpemVkLgorICAgIENoYW5uZWxNYXNrU2V0IG1DaGFubmVsTWFza3M7CisgICAgU2FtcGxlUmF0ZVNldCBtU2FtcGxpbmdSYXRlczsKKworICAgIGJvb2wgbUlzRHluYW1pY0Zvcm1hdCA9IGZhbHNlOworICAgIGJvb2wgbUlzRHluYW1pY0NoYW5uZWxzID0gZmFsc2U7CisgICAgYm9vbCBtSXNEeW5hbWljUmF0ZSA9IGZhbHNlOworfTsKKworY2xhc3MgQXVkaW9Qcm9maWxlVmVjdG9yIDogcHVibGljIHN0ZDo6dmVjdG9yPHNwPEF1ZGlvUHJvZmlsZT4+LCBwdWJsaWMgUGFyY2VsYWJsZQoreworcHVibGljOgorICAgIHZpcnR1YWwgfkF1ZGlvUHJvZmlsZVZlY3RvcigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgc3NpemVfdCBhZGQoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZSk7CisKKyAgICAvLyBJZiB0aGUgcHJvZmlsZSBpcyBkeW5hbWljIGZvcm1hdCBhbmQgaGFzIHZhbGlkIGZvcm1hdCwgaXQgd2lsbCBiZSByZW1vdmVkIHdoZW4gZG9pbmcKKyAgICAvLyBjbGVhclByb2ZpbGVzKCkuIE90aGVyd2lzZSwgQXVkaW9Qcm9maWxlOjpjbGVhcigpIHdpbGwgYmUgY2FsbGVkLgorICAgIHZpcnR1YWwgdm9pZCBjbGVhclByb2ZpbGVzKCk7CisKKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGdldEZpcnN0VmFsaWRQcm9maWxlKCkgY29uc3Q7CisgICAgc3A8QXVkaW9Qcm9maWxlPiBnZXRGaXJzdFZhbGlkUHJvZmlsZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0OworICAgIGJvb2wgaGFzVmFsaWRQcm9maWxlKCkgY29uc3QgeyByZXR1cm4gZ2V0Rmlyc3RWYWxpZFByb2ZpbGUoKSAhPSAwOyB9CisKKyAgICBGb3JtYXRWZWN0b3IgZ2V0U3VwcG9ydGVkRm9ybWF0cygpIGNvbnN0OworICAgIGJvb2wgaGFzRHluYW1pY0NoYW5uZWxzRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7CisgICAgYm9vbCBoYXNEeW5hbWljRm9ybWF0KCkgY29uc3Q7CisgICAgYm9vbCBoYXNEeW5hbWljUHJvZmlsZSgpIGNvbnN0OworICAgIGJvb2wgaGFzRHluYW1pY1JhdGVGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKKworICAgIHZpcnR1YWwgdm9pZCBkdW1wKHN0ZDo6c3RyaW5nICpkc3QsIGludCBzcGFjZXMpIGNvbnN0OworCisgICAgYm9vbCBlcXVhbHMoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yJiBvdGhlcikgY29uc3Q7CisKKyAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Cit9OworCitib29sIG9wZXJhdG9yID09IChjb25zdCBBdWRpb1Byb2ZpbGUgJmxlZnQsIGNvbnN0IEF1ZGlvUHJvZmlsZSAmcmlnaHQpOworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9EZXZpY2VEZXNjcmlwdG9yQmFzZS5oIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvRGV2aWNlRGVzY3JpcHRvckJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YzAzNjY3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvRGV2aWNlRGVzY3JpcHRvckJhc2UuaApAQCAtMCwwICsxLDg1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0NvbnRhaW5lcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvcnQuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEZXZpY2VEZXNjcmlwdG9yQmFzZSA6IHB1YmxpYyBBdWRpb1BvcnQsIHB1YmxpYyBBdWRpb1BvcnRDb25maWcKK3sKK3B1YmxpYzoKKyAgICAgLy8gTm90ZSB0aGF0IGVtcHR5IG5hbWUgcmVmZXJzIGJ5IGNvbnZlbnRpb24gdG8gYSBnZW5lcmljIGRldmljZS4KKyAgICBleHBsaWNpdCBEZXZpY2VEZXNjcmlwdG9yQmFzZShhdWRpb19kZXZpY2VzX3QgdHlwZSk7CisgICAgRGV2aWNlRGVzY3JpcHRvckJhc2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzKTsKKyAgICBleHBsaWNpdCBEZXZpY2VEZXNjcmlwdG9yQmFzZShjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2VUeXBlQWRkcik7CisKKyAgICB2aXJ0dWFsIH5EZXZpY2VEZXNjcmlwdG9yQmFzZSgpIHt9CisKKyAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlQWRkci5tVHlwZTsgfQorICAgIHN0ZDo6c3RyaW5nIGFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZUFkZHIubUFkZHJlc3M7IH0KKyAgICB2b2lkIHNldEFkZHJlc3MoY29uc3Qgc3RkOjpzdHJpbmcgJmFkZHJlc3MpIHsgbURldmljZVR5cGVBZGRyLm1BZGRyZXNzID0gYWRkcmVzczsgfQorICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGdldERldmljZVR5cGVBZGRyKCkgY29uc3QgeyByZXR1cm4gbURldmljZVR5cGVBZGRyOyB9CisKKyAgICAvLyBBdWRpb1BvcnRDb25maWcKKyAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QXVkaW9Qb3J0Kj4oY29uc3RfY2FzdDxEZXZpY2VEZXNjcmlwdG9yQmFzZSo+KHRoaXMpKTsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKKworICAgIC8vIEF1ZGlvUG9ydAorICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAoc3RkOjpzdHJpbmcgKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4LAorICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHRyYUluZm8gPSBudWxscHRyLCBib29sIHZlcmJvc2UgPSB0cnVlKSBjb25zdDsKKyAgICB2b2lkIGxvZygpIGNvbnN0OworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisKKyAgICBib29sIGVxdWFscyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4mIG90aGVyKSBjb25zdDsKKworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsKiBwYXJjZWwpIGNvbnN0IG92ZXJyaWRlOworICAgIHN0YXR1c190IHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgbURldmljZVR5cGVBZGRyOworfTsKKwordXNpbmcgRGV2aWNlRGVzY3JpcHRvckJhc2VWZWN0b3IgPSBzdGQ6OnZlY3RvcjxzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4+OworCisvKioKKyAqIFJldHVybiBodW1hbiByZWFkYWJsZSBzdHJpbmcgZm9yIGNvbGxlY3Rpb24gb2YgRGV2aWNlRGVzY3JpcHRvckJhc2UuCisgKiBGb3IgYSBEZXZpY2VEZXNjcmlwdG9yQmFzZSwgaXQgY29udGFpbnMgcG9ydCBpZCwgYXVkaW8gZGV2aWNlIHR5cGUgYW5kIGFkZHJlc3MuCisgKi8KK3N0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IERldmljZURlc2NyaXB0b3JCYXNlVmVjdG9yJiBkZXZpY2VzKTsKKworLyoqCisgKiBSZXR1cm4gYSBzZXQgb2YgZGV2aWNlIHR5cGVzIGFuZCBhZGRyZXNzZXMgZnJvbSBjb2xsZWN0aW9uIG9mIERldmljZURlc2NyaXB0b3JCYXNlLgorICovCitBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIGRldmljZVR5cGVBZGRyc0Zyb21EZXNjcmlwdG9ycyhjb25zdCBEZXZpY2VEZXNjcmlwdG9yQmFzZVZlY3RvciYgZGV2aWNlcyk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjI1OGIxNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMjUgQEAKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJhdWRpb2ZvdW5kYXRpb25fcGFyY2VsYWJsZV90ZXN0IiwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb24iLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb19zeXN0ZW1faGVhZGVycyIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImF1ZGlvZm91bmRhdGlvbl9wYXJjZWxhYmxlX3Rlc3QuY3BwIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vdGVzdHMvYXVkaW9mb3VuZGF0aW9uX3BhcmNlbGFibGVfdGVzdC5jcHAgYi9tZWRpYS9saWJhdWRpb2ZvdW5kYXRpb24vdGVzdHMvYXVkaW9mb3VuZGF0aW9uX3BhcmNlbGFibGVfdGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWJhYTA3MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvZm91bmRhdGlvbi90ZXN0cy9hdWRpb2ZvdW5kYXRpb25fcGFyY2VsYWJsZV90ZXN0LmNwcApAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiYXVkaW9mb3VuZGF0aW9uX3BhcmNlbGFibGVfdGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbGFibGUuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9HYWluLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb3J0Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qcm9maWxlLmg+CisjaW5jbHVkZSA8bWVkaWEvRGV2aWNlRGVzY3JpcHRvckJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0YXRpYyBjb25zdCBhdWRpb19wb3J0X2NvbmZpZyBURVNUX0FVRElPX1BPUlRfQ09ORklHID0geworICAgICAgICAuaWQgPSAwLAorICAgICAgICAucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LLAorICAgICAgICAudHlwZSA9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsCisgICAgICAgIC5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFIHwgQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLIHwKKyAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUIHwgQVVESU9fUE9SVF9DT05GSUdfR0FJTiwKKyAgICAgICAgLnNhbXBsZV9yYXRlID0gNDgwMDAsCisgICAgICAgIC5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sCisgICAgICAgIC5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKKyAgICAgICAgLmdhaW4gPSB7CisgICAgICAgICAgICAgICAgLmluZGV4ID0gMCwKKyAgICAgICAgICAgICAgICAubW9kZSA9IEFVRElPX0dBSU5fTU9ERV9KT0lOVCwKKyAgICAgICAgICAgICAgICAuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAorICAgICAgICB9Cit9OworCitjbGFzcyBBdWRpb1BvcnRDb25maWdUZXN0U3R1YiA6IHB1YmxpYyBBdWRpb1BvcnRDb25maWcgeworcHVibGljOgorICAgIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbnVsbHB0cjsgfQorfTsKKworQXVkaW9HYWlucyBnZXRBdWRpb0dhaW5zRm9yVGVzdCgpIHsKKyAgICBBdWRpb0dhaW5zIGF1ZGlvR2FpbnM7CisgICAgc3A8QXVkaW9HYWluPiBhdWRpb0dhaW4gPSBuZXcgQXVkaW9HYWluKDAgLyppbmRleCovLCBmYWxzZSAvKnVzZUluQ2hhbm5lbE1hc2sqLyk7CisgICAgYXVkaW9HYWluLT5zZXRNb2RlKEFVRElPX0dBSU5fTU9ERV9KT0lOVCk7CisgICAgYXVkaW9HYWluLT5zZXRDaGFubmVsTWFzayhBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOworICAgIGF1ZGlvR2Fpbi0+c2V0TWluVmFsdWVJbk1iKC0zMjAwKTsKKyAgICBhdWRpb0dhaW4tPnNldE1heFZhbHVlSW5NYig2MDApOworICAgIGF1ZGlvR2Fpbi0+c2V0RGVmYXVsdFZhbHVlSW5NYigwKTsKKyAgICBhdWRpb0dhaW4tPnNldFN0ZXBWYWx1ZUluTWIoMTAwKTsKKyAgICBhdWRpb0dhaW4tPnNldE1pblJhbXBJbk1zKDEwMCk7CisgICAgYXVkaW9HYWluLT5zZXRNYXhSYW1wSW5Ncyg1MDApOworICAgIGF1ZGlvR2FpbnMucHVzaF9iYWNrKGF1ZGlvR2Fpbik7CisgICAgcmV0dXJuIGF1ZGlvR2FpbnM7Cit9CisKK0F1ZGlvUHJvZmlsZVZlY3RvciBnZXRBdWRpb1Byb2ZpbGVWZWN0b3JGb3JUZXN0KCkgeworICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBhdWRpb1Byb2ZpbGVzOworICAgIHNwPEF1ZGlvUHJvZmlsZT4gYXVkaW9Qcm9maWxlID0gQXVkaW9Qcm9maWxlOjpjcmVhdGVGdWxsRHluYW1pYygpOworICAgIGF1ZGlvUHJvZmlsZS0+c2V0Q2hhbm5lbHMoe0FVRElPX0NIQU5ORUxfT1VUX01PTk8sIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFT30pOworICAgIGF1ZGlvUHJvZmlsZS0+c2V0U2FtcGxlUmF0ZXMoezQ4MDAwfSk7CisgICAgYXVkaW9Qcm9maWxlcy5hZGQoYXVkaW9Qcm9maWxlKTsKKyAgICByZXR1cm4gYXVkaW9Qcm9maWxlczsKK30KKworVEVTVChBdWRpb0ZvdW5kYXRpb25QYXJjZWxhYmxlVGVzdCwgUGFyY2VsaW5nQXVkaW9HYWluKSB7CisgICAgUGFyY2VsIGRhdGE7CisgICAgQXVkaW9HYWlucyBhdWRpb0dhaW5zID0gZ2V0QXVkaW9HYWluc0ZvclRlc3QoKTsKKworICAgIEFTU0VSVF9FUShkYXRhLndyaXRlUGFyY2VsYWJsZShhdWRpb0dhaW5zKSwgTk9fRVJST1IpOworICAgIGRhdGEuc2V0RGF0YVBvc2l0aW9uKDApOworICAgIEF1ZGlvR2FpbnMgYXVkaW9HYWluc0Zyb21QYXJjZWw7CisgICAgQVNTRVJUX0VRKGRhdGEucmVhZFBhcmNlbGFibGUoJmF1ZGlvR2FpbnNGcm9tUGFyY2VsKSwgTk9fRVJST1IpOworICAgIEFTU0VSVF9UUlVFKGF1ZGlvR2FpbnNGcm9tUGFyY2VsLmVxdWFscyhhdWRpb0dhaW5zKSk7Cit9CisKK1RFU1QoQXVkaW9Gb3VuZGF0aW9uUGFyY2VsYWJsZVRlc3QsIFBhcmNlbGluZ0F1ZGlvUHJvZmlsZVZlY3RvcikgeworICAgIFBhcmNlbCBkYXRhOworICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBhdWRpb1Byb2ZpbGVzID0gZ2V0QXVkaW9Qcm9maWxlVmVjdG9yRm9yVGVzdCgpOworCisgICAgQVNTRVJUX0VRKGRhdGEud3JpdGVQYXJjZWxhYmxlKGF1ZGlvUHJvZmlsZXMpLCBOT19FUlJPUik7CisgICAgZGF0YS5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgQXVkaW9Qcm9maWxlVmVjdG9yIGF1ZGlvUHJvZmlsZXNGcm9tUGFyY2VsOworICAgIEFTU0VSVF9FUShkYXRhLnJlYWRQYXJjZWxhYmxlKCZhdWRpb1Byb2ZpbGVzRnJvbVBhcmNlbCksIE5PX0VSUk9SKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb1Byb2ZpbGVzRnJvbVBhcmNlbC5lcXVhbHMoYXVkaW9Qcm9maWxlcykpOworfQorCitURVNUKEF1ZGlvRm91bmRhdGlvblBhcmNlbGFibGVUZXN0LCBQYXJjZWxpbmdBdWRpb1BvcnQpIHsKKyAgICBQYXJjZWwgZGF0YTsKKyAgICBzcDxBdWRpb1BvcnQ+IGF1ZGlvUG9ydCA9IG5ldyBBdWRpb1BvcnQoCisgICAgICAgICAgICAiQXVkaW9Qb3J0TmFtZSIsIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UsIEFVRElPX1BPUlRfUk9MRV9TSU5LKTsKKyAgICBhdWRpb1BvcnQtPnNldEdhaW5zKGdldEF1ZGlvR2FpbnNGb3JUZXN0KCkpOworICAgIGF1ZGlvUG9ydC0+c2V0QXVkaW9Qcm9maWxlcyhnZXRBdWRpb1Byb2ZpbGVWZWN0b3JGb3JUZXN0KCkpOworCisgICAgQVNTRVJUX0VRKGRhdGEud3JpdGVQYXJjZWxhYmxlKCphdWRpb1BvcnQpLCBOT19FUlJPUik7CisgICAgZGF0YS5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgc3A8QXVkaW9Qb3J0PiBhdWRpb1BvcnRGcm9tUGFyY2VsID0gbmV3IEF1ZGlvUG9ydCgKKyAgICAgICAgICAgICIiLCBBVURJT19QT1JUX1RZUEVfTk9ORSwgQVVESU9fUE9SVF9ST0xFX05PTkUpOworICAgIEFTU0VSVF9FUShkYXRhLnJlYWRQYXJjZWxhYmxlKGF1ZGlvUG9ydEZyb21QYXJjZWwuZ2V0KCkpLCBOT19FUlJPUik7CisgICAgQVNTRVJUX1RSVUUoYXVkaW9Qb3J0RnJvbVBhcmNlbC0+ZXF1YWxzKGF1ZGlvUG9ydCkpOworfQorCitURVNUKEF1ZGlvRm91bmRhdGlvblBhcmNlbGFibGVUZXN0LCBQYXJjZWxpbmdBdWRpb1BvcnRDb25maWcpIHsKKyAgICBQYXJjZWwgZGF0YTsKKyAgICBzcDxBdWRpb1BvcnRDb25maWc+IGF1ZGlvUG9ydENvbmZpZyA9IG5ldyBBdWRpb1BvcnRDb25maWdUZXN0U3R1YigpOworICAgIGF1ZGlvUG9ydENvbmZpZy0+YXBwbHlBdWRpb1BvcnRDb25maWcoJlRFU1RfQVVESU9fUE9SVF9DT05GSUcpOworCisgICAgQVNTRVJUX0VRKGRhdGEud3JpdGVQYXJjZWxhYmxlKCphdWRpb1BvcnRDb25maWcpLCBOT19FUlJPUik7CisgICAgZGF0YS5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgc3A8QXVkaW9Qb3J0Q29uZmlnPiBhdWRpb1BvcnRDb25maWdGcm9tUGFyY2VsID0gbmV3IEF1ZGlvUG9ydENvbmZpZ1Rlc3RTdHViKCk7CisgICAgQVNTRVJUX0VRKGRhdGEucmVhZFBhcmNlbGFibGUoYXVkaW9Qb3J0Q29uZmlnRnJvbVBhcmNlbC5nZXQoKSksIE5PX0VSUk9SKTsKKyAgICBBU1NFUlRfVFJVRShhdWRpb1BvcnRDb25maWdGcm9tUGFyY2VsLT5lcXVhbHMoYXVkaW9Qb3J0Q29uZmlnKSk7Cit9CisKK1RFU1QoQXVkaW9Gb3VuZGF0aW9uUGFyY2VsYWJsZVRlc3QsIFBhcmNlbGluZ0RldmljZURlc2NyaXB0b3JCYXNlKSB7CisgICAgUGFyY2VsIGRhdGE7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+IGRlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvckJhc2UoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKTsKKyAgICBkZXNjLT5zZXRHYWlucyhnZXRBdWRpb0dhaW5zRm9yVGVzdCgpKTsKKyAgICBkZXNjLT5zZXRBdWRpb1Byb2ZpbGVzKGdldEF1ZGlvUHJvZmlsZVZlY3RvckZvclRlc3QoKSk7CisgICAgZGVzYy0+YXBwbHlBdWRpb1BvcnRDb25maWcoJlRFU1RfQVVESU9fUE9SVF9DT05GSUcpOworICAgIGRlc2MtPnNldEFkZHJlc3MoIkRldmljZURlc2NyaXB0b3JCYXNlVGVzdEFkZHJlc3MiKTsKKworICAgIEFTU0VSVF9FUShkYXRhLndyaXRlUGFyY2VsYWJsZSgqZGVzYyksIE5PX0VSUk9SKTsKKyAgICBkYXRhLnNldERhdGFQb3NpdGlvbigwKTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4gZGVzY0Zyb21QYXJjZWwgPSBuZXcgRGV2aWNlRGVzY3JpcHRvckJhc2UoQVVESU9fREVWSUNFX05PTkUpOworICAgIEFTU0VSVF9FUShkYXRhLnJlYWRQYXJjZWxhYmxlKGRlc2NGcm9tUGFyY2VsLmdldCgpKSwgTk9fRVJST1IpOworICAgIEFTU0VSVF9UUlVFKGRlc2NGcm9tUGFyY2VsLT5lcXVhbHMoZGVzYykpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzRiNDM1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotY2NfbGlicmFyeV9zaGFyZWQgewotICAgIG5hbWU6ICJsaWJhdWRpb2hhbEAyLjAiLAotCi0gICAgc3JjczogWwotICAgICAgICAiRGV2aWNlSGFsTG9jYWwuY3BwIiwKLSAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcCIsCi0gICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcCIsCi0gICAgICAgICJTdHJlYW1IYWxMb2NhbC5jcHAiLAotCi0gICAgICAgICJDb252ZXJzaW9uSGVscGVySGlkbC5jcHAiLAotICAgICAgICAiRGV2aWNlSGFsSGlkbC5jcHAiLAotICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcCIsCi0gICAgICAgICJFZmZlY3RCdWZmZXJIYWxIaWRsLmNwcCIsCi0gICAgICAgICJFZmZlY3RIYWxIaWRsLmNwcCIsCi0gICAgICAgICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIiwKLSAgICAgICAgIlN0cmVhbUhhbEhpZGwuY3BwIiwKLSAgICBdLAotCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XYWxsIiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgIF0sCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmF1ZGlvaGFsX2RlYXRoaGFuZGxlciIsCi0gICAgICAgICJsaWJhdWRpb3V0aWxzIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGliaGFyZHdhcmUiLAotICAgICAgICAibGliYmFzZSIsCi0gICAgICAgICJsaWJmbXEiLAotICAgICAgICAibGliaHdiaW5kZXIiLAotICAgICAgICAibGliaGlkbGJhc2UiLAotICAgICAgICAibGliaGlkbG1lbW9yeSIsCi0gICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9AMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDIuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAtdXRpbCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAotICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAotICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKLSAgICAgICAgImxpYm1lZGlhdXRpbHMiLAotICAgIF0sCi0gICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImxpYmF1ZGlvaGFsX2hlYWRlcnMiCi0gICAgXSwKLQotICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKLSAgICAgICAgImxpYmZtcSIsCi0gICAgXSwKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjBiZjhiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBMT0dfVEFHICJIYWxIaWRsIgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UmVzdWx0OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgQ29udmVyc2lvbkhlbHBlckhpZGw6OmtleXNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpIHsKLSAgICBBdWRpb1BhcmFtZXRlciBoYWxLZXlzKGtleXMpOwotICAgIGlmIChoYWxLZXlzLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgIGhpZGxLZXlzLT5yZXNpemUoaGFsS2V5cy5zaXplKCkpOwotICAgIC8vRklYTUU6ICBrZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyBhbmQga2V5U3RyZWFtU3VwcG9ydGVkU2FtcGxpbmdSYXRlcyBjb21lIHdpdGggYQotICAgIC8vICJrZXlGb3JtYXQ9PHZhbHVlPiIgcGFpci4gV2UgbmVlZCB0byB0cmFuc2Zvcm0gaXQgaW50byBhIHNpbmdsZSBrZXkgc3RyaW5nIHNvIHRoYXQgaXQgaXMKLSAgICAvLyBjYXJyaWVkIG92ZXIgdG8gdGhlIGxlZ2FjeSBIQUwgdmlhIEhJREwuCi0gICAgU3RyaW5nOCB2YWx1ZTsKLSAgICBib29sIGtlZXBGb3JtYXRWYWx1ZSA9IGhhbEtleXMuc2l6ZSgpID09IDIgJiYKLSAgICAgICAgIChoYWxLZXlzLmdldChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyksIHZhbHVlKSA9PSBOT19FUlJPUiB8fAotICAgICAgICAgaGFsS2V5cy5nZXQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkU2FtcGxpbmdSYXRlcyksIHZhbHVlKSA9PSBOT19FUlJPUik7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhhbEtleXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgU3RyaW5nOCBrZXk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGhhbEtleXMuZ2V0QXQoaSwga2V5KTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgaWYgKGtlZXBGb3JtYXRWYWx1ZSAmJiBrZXkgPT0gQXVkaW9QYXJhbWV0ZXI6OmtleUZvcm1hdCkgewotICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgZm9ybWF0UGFyYW07Ci0gICAgICAgICAgICBoYWxLZXlzLmdldEF0KGksIGtleSwgdmFsdWUpOwotICAgICAgICAgICAgZm9ybWF0UGFyYW0uYWRkKGtleSwgdmFsdWUpOwotICAgICAgICAgICAga2V5ID0gZm9ybWF0UGFyYW0udG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICAoKmhpZGxLZXlzKVtpXSA9IGtleS5zdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjpwYXJhbWV0ZXJzRnJvbUhhbCgKLSAgICAgICAgY29uc3QgU3RyaW5nOCYga3ZQYWlycywgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+ICpoaWRsUGFyYW1zKSB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW1zKGt2UGFpcnMpOwotICAgIGlmIChwYXJhbXMuc2l6ZSgpID09IDApIHJldHVybiBCQURfVkFMVUU7Ci0gICAgaGlkbFBhcmFtcy0+cmVzaXplKHBhcmFtcy5zaXplKCkpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGFyYW1zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFN0cmluZzgga2V5LCB2YWx1ZTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1zLmdldEF0KGksIGtleSwgdmFsdWUpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgICAgICAoKmhpZGxQYXJhbXMpW2ldLmtleSA9IGtleS5zdHJpbmcoKTsKLSAgICAgICAgKCpoaWRsUGFyYW1zKVtpXS52YWx1ZSA9IHZhbHVlLnN0cmluZygpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBDb252ZXJzaW9uSGVscGVySGlkbDo6cGFyYW1ldGVyc1RvSGFsKAotICAgICAgICBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMsIFN0cmluZzggKnZhbHVlcykgewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtczsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtZXRlcnMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgcGFyYW1zLmFkZChTdHJpbmc4KHBhcmFtZXRlcnNbaV0ua2V5LmNfc3RyKCkpLCBTdHJpbmc4KHBhcmFtZXRlcnNbaV0udmFsdWUuY19zdHIoKSkpOwotICAgIH0KLSAgICB2YWx1ZXMtPnNldFRvKHBhcmFtcy50b1N0cmluZygpKTsKLX0KLQotQ29udmVyc2lvbkhlbHBlckhpZGw6OkNvbnZlcnNpb25IZWxwZXJIaWRsKGNvbnN0IGNoYXIqIGNsYXNzTmFtZSkKLSAgICAgICAgOiBtQ2xhc3NOYW1lKGNsYXNzTmFtZSkgewotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjphbmFseXplUmVzdWx0KGNvbnN0IFJlc3VsdCYgcmVzdWx0KSB7Ci0gICAgc3dpdGNoIChyZXN1bHQpIHsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUzogcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfU1RBVEU6IHJldHVybiBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6IHJldHVybiBOT19JTklUOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX1NVUFBPUlRFRDogcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci19Ci0KLXZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6OmVtaXRFcnJvcihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgY2hhciogZGVzY3JpcHRpb24pIHsKLSAgICBBTE9HRSgiJXMgJXAgJXM6ICVzIChmcm9tIHJwYykiLCBtQ2xhc3NOYW1lLCB0aGlzLCBmdW5jTmFtZSwgZGVzY3JpcHRpb24pOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzM1NmYzNy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvQ29udmVyc2lvbkhlbHBlckhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDgzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC90eXBlcy5oPgotI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgQ29udmVyc2lvbkhlbHBlckhpZGwgewotICBwcm90ZWN0ZWQ6Ci0gICAgc3RhdGljIHN0YXR1c190IGtleXNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGtleXMsIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiAqaGlkbEtleXMpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBwYXJhbWV0ZXJzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrdlBhaXJzLCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gKmhpZGxQYXJhbXMpOwotICAgIHN0YXRpYyB2b2lkIHBhcmFtZXRlcnNUb0hhbChjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICBDb252ZXJzaW9uSGVscGVySGlkbChjb25zdCBjaGFyKiBjbGFzc05hbWUpOwotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVD4KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48Uj4mIHJldCwgVCAqcmV0dmFsKSB7Ci0gICAgICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIHdheSBpdCBhbHNvIHdvcmtzIGZvciBlbnVtIGNsYXNzIHRvIHVuc2NvcGVkIGVudW0gY29udmVyc2lvbi4KLSAgICAgICAgICAgICpyZXR2YWwgPSBzdGF0aWNfY2FzdDxUPihzdGF0aWNfY2FzdDxSPihyZXQpKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybihmdW5jTmFtZSwgcmV0KTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxUPiYgcmV0KSB7Ci0gICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IE9LIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLQotICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdD4mIHJldCkgewotICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKAotICAgICAgICAgICAgY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxUPiYgcmV0LCBoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdCByZXR2YWwpIHsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIGNvbnN0IGNoYXIqIG1DbGFzc05hbWU7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgYW5hbHl6ZVJlc3VsdChjb25zdCBoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdCYgcmVzdWx0KTsKLQotICAgIHZvaWQgZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWI5OWQ3MC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JUHJpbWFyeURldmljZS5oPgotI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+Ci0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKLSNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvQ29uZmlnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9EZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0lucHV0RmxhZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvT3V0cHV0RmxhZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvUGF0Y2hIYW5kbGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb1BvcnQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb1BvcnRDb25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb01vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb1NvdXJjZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkhpZGxVdGlsczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpEZXZpY2VBZGRyZXNzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklQcmltYXJ5RGV2aWNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotbmFtZXNwYWNlIHsKLQotc3RhdHVzX3QgZGV2aWNlQWRkcmVzc0Zyb21IYWwoCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGNvbnN0IGNoYXIqIGhhbEFkZHJlc3MsIERldmljZUFkZHJlc3MqIGFkZHJlc3MpIHsKLSAgICBhZGRyZXNzLT5kZXZpY2UgPSBBdWRpb0RldmljZShkZXZpY2UpOwotCi0gICAgaWYgKGhhbEFkZHJlc3MgPT0gbnVsbHB0ciB8fCBzdHJubGVuKGhhbEFkZHJlc3MsIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pID09IDApIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICBjb25zdCBib29sIGlzSW5wdXQgPSAoZGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMDsKLSAgICBpZiAoaXNJbnB1dCkgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApICE9IDApCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSAhPSAwKSkgewotICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgIiVoaFg6JWhoWDolaGhYOiVoaFg6JWhoWDolaGhYIiwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMF0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1sxXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzJdLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLm1hY1szXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzRdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbNV0pOwotICAgICAgICByZXR1cm4gc3RhdHVzID09IDYgPyBPSyA6IEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9JUCkgIT0gMCkKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fSVApICE9IDApKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiJWhodS4laGh1LiVoaHUuJWhodSIsCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFswXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsxXSwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzJdLCAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzNdKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSA0ID8gT0sgOiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX1VTQikpICE9IDAKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQUxMX1VTQikpICE9IDApIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAotICAgICAgICAgICAgICAgICJjYXJkPSVkO2RldmljZT0lZCIsCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5jYXJkLCAmYWRkcmVzcy0+YWRkcmVzcy5hbHNhLmRldmljZSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gMiA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0JVUykgIT0gMCkKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQlVTKSAhPSAwKSkgewotICAgICAgICBpZiAoaGFsQWRkcmVzcyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBhZGRyZXNzLT5idXNBZGRyZXNzID0gaGFsQWRkcmVzczsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgpKSAhPSAwCi0gICAgICAgICAgICB8fCAoaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpICE9IDApKSB7Ci0gICAgICAgIGlmIChoYWxBZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGFkZHJlc3MtPnJTdWJtaXhBZGRyZXNzID0gaGFsQWRkcmVzczsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1EZXZpY2VIYWxIaWRsOjpEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpCi0gICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkRldmljZSIpLCBtRGV2aWNlKGRldmljZSksCi0gICAgICAgICAgbVByaW1hcnlEZXZpY2UoSVByaW1hcnlEZXZpY2U6OmNhc3RGcm9tKGRldmljZSkpIHsKLX0KLQotRGV2aWNlSGFsSGlkbDo6fkRldmljZUhhbEhpZGwoKSB7Ci0gICAgaWYgKG1EZXZpY2UgIT0gMCkgewotICAgICAgICBtRGV2aWNlLmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90KikgewotICAgIC8vIE9ic29sZXRlLgotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6aW5pdENoZWNrKCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJpbml0Q2hlY2siLCBtRGV2aWNlLT5pbml0Q2hlY2soKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvaWNlVm9sdW1lIiwgbVByaW1hcnlEZXZpY2UtPnNldFZvaWNlVm9sdW1lKHZvbHVtZSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyVm9sdW1lIiwgbVByaW1hcnlEZXZpY2UtPnNldE1hc3RlclZvbHVtZSh2b2x1bWUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1QcmltYXJ5RGV2aWNlLT5nZXRNYXN0ZXJWb2x1bWUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGZsb2F0IHYpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqdm9sdW1lID0gdjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWFzdGVyVm9sdW1lIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TW9kZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRNb2RlKEF1ZGlvTW9kZShtb2RlKSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWljTXV0ZSIsIG1EZXZpY2UtPnNldE1pY011dGUoc3RhdGUpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljTXV0ZShib29sICpzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1pY011dGUoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1pY011dGUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJNdXRlIiwgbURldmljZS0+c2V0TWFzdGVyTXV0ZShzdGF0ZSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWFzdGVyTXV0ZSgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgYm9vbCBtdXRlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnN0YXRlID0gbXV0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWFzdGVyTXV0ZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGhpZGxQYXJhbXM7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFyYW1ldGVyc0Zyb21IYWwoa3ZQYWlycywgJmhpZGxQYXJhbXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLCBtRGV2aWNlLT5zZXRQYXJhbWV0ZXJzKGhpZGxQYXJhbXMpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGtleXNGcm9tSGFsKGtleXMsICZoaWRsS2V5cyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRQYXJhbWV0ZXJzKAotICAgICAgICAgICAgaGlkbEtleXMsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNUb0hhbChwYXJhbWV0ZXJzLCB2YWx1ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQYXJhbWV0ZXJzIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRJbnB1dEJ1ZmZlclNpemUoCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywgc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0SW5wdXRCdWZmZXJTaXplKAotICAgICAgICAgICAgaGlkbENvbmZpZywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgYnVmZmVyU2l6ZSkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihidWZmZXJTaXplKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRCdWZmZXJTaXplIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5vcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgaGFuZGxlLAotICAgICAgICAgICAgaGlkbERldmljZSwKLSAgICAgICAgICAgIGhpZGxDb25maWcsCi0gICAgICAgICAgICBBdWRpb091dHB1dEZsYWcoZmxhZ3MpLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJU3RyZWFtT3V0PiYgcmVzdWx0LCBjb25zdCBBdWRpb0NvbmZpZyYgc3VnZ2VzdGVkQ29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKm91dFN0cmVhbSA9IG5ldyBTdHJlYW1PdXRIYWxIaWRsKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdUb0hhbChzdWdnZXN0ZWRDb25maWcsIGNvbmZpZyk7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigib3Blbk91dHB1dFN0cmVhbSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6b3BlbklucHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIERldmljZUFkZHJlc3MgaGlkbERldmljZTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2VBZGRyZXNzRnJvbUhhbChkZXZpY2VzLCBhZGRyZXNzLCAmaGlkbERldmljZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgIGhpZGxEZXZpY2UsCi0gICAgICAgICAgICBoaWRsQ29uZmlnLAotICAgICAgICAgICAgQXVkaW9JbnB1dEZsYWcoZmxhZ3MpLAotICAgICAgICAgICAgQXVkaW9Tb3VyY2Uoc291cmNlKSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbUluPiYgcmVzdWx0LCBjb25zdCBBdWRpb0NvbmZpZyYgc3VnZ2VzdGVkQ29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsSGlkbChyZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5JbnB1dFN0cmVhbSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzQXVkaW9QYXRjaGVzIiwgbURldmljZS0+c3VwcG9ydHNBdWRpb1BhdGNoZXMoKSwgc3VwcG9ydHNQYXRjaGVzKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Y3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPEF1ZGlvUG9ydENvbmZpZz4gaGlkbFNvdXJjZXMsIGhpZGxTaW5rczsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zb3VyY2VzLCBzb3VyY2VzLCAmaGlkbFNvdXJjZXMpOwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnc0Zyb21IYWwobnVtX3NpbmtzLCBzaW5rcywgJmhpZGxTaW5rcyk7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Y3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIGhpZGxTb3VyY2VzLCBoaWRsU2lua3MsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIEF1ZGlvUGF0Y2hIYW5kbGUgaGlkbFBhdGNoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnBhdGNoID0gc3RhdGljX2Nhc3Q8YXVkaW9fcGF0Y2hfaGFuZGxlX3Q+KGhpZGxQYXRjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImNyZWF0ZUF1ZGlvUGF0Y2giLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbGVhc2VBdWRpb1BhdGNoIiwgbURldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgQXVkaW9Qb3J0IGhpZGxQb3J0OwotICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0RnJvbUhhbCgqcG9ydCwgJmhpZGxQb3J0KTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRBdWRpb1BvcnQoCi0gICAgICAgICAgICBoaWRsUG9ydCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgQXVkaW9Qb3J0JiBwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRUb0hhbChwLCBwb3J0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qb3J0IiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBBdWRpb1BvcnRDb25maWcgaGlkbENvbmZpZzsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRBdWRpb1BvcnRDb25maWciLCBtRGV2aWNlLT5zZXRBdWRpb1BvcnRDb25maWcoaGlkbENvbmZpZykpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNyb3Bob25lcygKLSAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXNJbmZvIF9fdW51c2VkKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpkdW1wKGludCBmZCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+ZGVidWdEdW1wKGhpZGxIYW5kbGUpOwotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMWNiNTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lEZXZpY2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JUHJpbWFyeURldmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVByaW1hcnlEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlSGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAotewotICBwdWJsaWM6Ci0gICAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgJ2RldmljZXMnIHRvIGEgYml0bWFzayBvZiAxIG9yIG1vcmUgdmFsdWVzIG9mIGF1ZGlvX2RldmljZXNfdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpOwotCi0gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIG9mIGEgdm9pY2UgY2FsbC4gUmFuZ2UgaXMgYmV0d2VlbiAwLjAgYW5kIDEuMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBmb3IgYWxsIGF1ZGlvIGFjdGl2aXRpZXMgb3RoZXIgdGhhbiB2b2ljZSBjYWxsLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbWFzdGVyIHZvbHVtZSB2YWx1ZSBmb3IgdGhlIEhBTC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKTsKLQotICAgIC8vIE11dGluZyBjb250cm9sLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY011dGUoYm9vbCAqc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpOwotCi0gICAgLy8gU2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIFJldHVybnMgYXVkaW8gaW5wdXQgYnVmZmVyIHNpemUgYWNjb3JkaW5nIHRvIHBhcmFtZXRlcnMgcGFzc2VkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJTaXplKGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOwotCi0gICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7Ci0KLSAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKLQotICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwotCi0gICAgLy8gTGlzdCBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOwotICAgIHNwPElEZXZpY2U+IG1EZXZpY2U7Ci0gICAgc3A8SVByaW1hcnlEZXZpY2U+IG1QcmltYXJ5RGV2aWNlOyAgLy8gTnVsbCBpZiBpdCdzIG5vdCBhIHByaW1hcnkgZGV2aWNlLgotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IERldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgotICAgIHZpcnR1YWwgfkRldmljZUhhbEhpZGwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYzNiZjc4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VIYWxMb2NhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlSGFsTG9jYWwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1EZXZpY2VIYWxMb2NhbDo6RGV2aWNlSGFsTG9jYWwoYXVkaW9faHdfZGV2aWNlX3QgKmRldikKLSAgICAgICAgOiBtRGV2KGRldikgewotfQotCi1EZXZpY2VIYWxMb2NhbDo6fkRldmljZUhhbExvY2FsKCkgewotICAgIGludCBzdGF0dXMgPSBhdWRpb19od19kZXZpY2VfY2xvc2UobURldik7Ci0gICAgQUxPR1dfSUYoc3RhdHVzLCAiRXJyb3IgY2xvc2luZyBhdWRpbyBodyBkZXZpY2UgJXA6ICVzIiwgbURldiwgc3RyZXJyb3IoLXN0YXR1cykpOwotICAgIG1EZXYgPSAwOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcykgewotICAgIGlmIChtRGV2LT5nZXRfc3VwcG9ydGVkX2RldmljZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICpkZXZpY2VzID0gbURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzKG1EZXYpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmluaXRDaGVjaygpIHsKLSAgICByZXR1cm4gbURldi0+aW5pdF9jaGVjayhtRGV2KTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIHJldHVybiBtRGV2LT5zZXRfdm9pY2Vfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl92b2x1bWUobURldiwgdm9sdW1lKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl92b2x1bWUobURldiwgdm9sdW1lKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X21vZGUobURldiwgbW9kZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X21pY19tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKLSAgICByZXR1cm4gbURldi0+Z2V0X21pY19tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSkgewotICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX211dGUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5zZXRfbWFzdGVyX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgewotICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX211dGUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5nZXRfbWFzdGVyX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9wYXJhbWV0ZXJzKG1EZXYsIGt2UGFpcnMuc3RyaW5nKCkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICBjaGFyICpoYWxWYWx1ZXMgPSBtRGV2LT5nZXRfcGFyYW1ldGVycyhtRGV2LCBrZXlzLnN0cmluZygpKTsKLSAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKLSAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOwotICAgICAgICBmcmVlKGhhbFZhbHVlcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmFsdWVzLT5jbGVhcigpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRJbnB1dEJ1ZmZlclNpemUoCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywgc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBtRGV2LT5nZXRfaW5wdXRfYnVmZmVyX3NpemUobURldiwgY29uZmlnKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pIHsKLSAgICBhdWRpb19zdHJlYW1fb3V0X3QgKmhhbFN0cmVhbTsKLSAgICBBTE9HVigib3Blbl9vdXRwdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCIKLSAgICAgICAgICAgICJzcmF0ZTogJWQgZm9ybWF0ICUjeCBjaGFubmVscyAleCBhZGRyZXNzICVzIiwKLSAgICAgICAgICAgIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsCi0gICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICBhZGRyZXNzKTsKLSAgICBpbnQgb3BlblJlc3V0ID0gbURldi0+b3Blbl9vdXRwdXRfc3RyZWFtKAotICAgICAgICAgICAgbURldiwgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywgY29uZmlnLCAmaGFsU3RyZWFtLCBhZGRyZXNzKTsKLSAgICBpZiAob3BlblJlc3V0ID09IE9LKSB7Ci0gICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsTG9jYWwoaGFsU3RyZWFtLCB0aGlzKTsKLSAgICB9Ci0gICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBzdGF0dXMgJWQgc3RyZWFtICVwIiwgb3BlblJlc3V0LCBoYWxTdHJlYW0pOwotICAgIHJldHVybiBvcGVuUmVzdXQ7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7Ci0gICAgYXVkaW9fc3RyZWFtX2luX3QgKmhhbFN0cmVhbTsKLSAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gaGFuZGxlOiAlZCBkZXZpY2VzOiAleCBmbGFnczogJSN4ICIKLSAgICAgICAgICAgICJzcmF0ZTogJWQgZm9ybWF0ICUjeCBjaGFubmVscyAleCBhZGRyZXNzICVzIHNvdXJjZSAlZCIsCi0gICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAotICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgYWRkcmVzcywgc291cmNlKTsKLSAgICBpbnQgb3BlblJlc3VsdCA9IG1EZXYtPm9wZW5faW5wdXRfc3RyZWFtKAotICAgICAgICAgICAgbURldiwgaGFuZGxlLCBkZXZpY2VzLCBjb25maWcsICZoYWxTdHJlYW0sIGZsYWdzLCBhZGRyZXNzLCBzb3VyY2UpOwotICAgIGlmIChvcGVuUmVzdWx0ID09IE9LKSB7Ci0gICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7Ci0gICAgfQotICAgIEFMT0dWKCJvcGVuX2lucHV0X3N0cmVhbSBzdGF0dXMgJWQgc3RyZWFtICVwIiwgb3BlblJlc3VsdCwgaW5TdHJlYW0pOwotICAgIHJldHVybiBvcGVuUmVzdWx0OwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7Ci0gICAgKnN1cHBvcnRzUGF0Y2hlcyA9IHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgcmV0dXJuIG1EZXYtPmNyZWF0ZV9hdWRpb19wYXRjaCgKLSAgICAgICAgICAgICAgICBtRGV2LCBudW1fc291cmNlcywgc291cmNlcywgbnVtX3NpbmtzLCBzaW5rcywgcGF0Y2gpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgewotICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewotICAgICAgICByZXR1cm4gbURldi0+cmVsZWFzZV9hdWRpb19wYXRjaChtRGV2LCBwYXRjaCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgewotICAgIHJldHVybiBtRGV2LT5nZXRfYXVkaW9fcG9ydChtRGV2LCBwb3J0KTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgewotICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkKLSAgICAgICAgcmV0dXJuIG1EZXYtPnNldF9hdWRpb19wb3J0X2NvbmZpZyhtRGV2LCBjb25maWcpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljcm9waG9uZXMoCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6ZHVtcChpbnQgZmQpIHsKLSAgICByZXR1cm4gbURldi0+ZHVtcChtRGV2LCBmZCk7Ci19Ci0KLXZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlT3V0cHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0ICpzdHJlYW1fb3V0KSB7Ci0gICAgbURldi0+Y2xvc2Vfb3V0cHV0X3N0cmVhbShtRGV2LCBzdHJlYW1fb3V0KTsKLX0KLQotdm9pZCBEZXZpY2VIYWxMb2NhbDo6Y2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pIHsKLSAgICBtRGV2LT5jbG9zZV9pbnB1dF9zdHJlYW0obURldiwgc3RyZWFtX2luKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVjMjAxYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlSGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfSAotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKLQotICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOwotCi0gICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7Ci0KLSAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7Ci0KLSAgICAvLyBNdXRpbmcgY29udHJvbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKLQotICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBzaXplX3QgKnNpemUpOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOwotCi0gICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCi0gICAgICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpOwotCi0gICAgLy8gQ3JlYXRlcyBhbiBhdWRpbyBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaCgKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlcywKLSAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoKTsKLQotICAgIC8vIFJlbGVhc2VzIGFuIGF1ZGlvIHBhdGNoLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2gpOwotCi0gICAgLy8gRmlsbHMgdGhlIGxpc3Qgb2Ygc3VwcG9ydGVkIGF0dHJpYnV0ZXMgZm9yIGEgZ2l2ZW4gYXVkaW8gcG9ydC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKLQotICAgIC8vIExpc3QgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgdm9pZCBjbG9zZU91dHB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX291dCAqc3RyZWFtX291dCk7Ci0gICAgdm9pZCBjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbik7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19od19kZXZpY2VfdCAqbURldjsKLQotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIGV4cGxpY2l0IERldmljZUhhbExvY2FsKGF1ZGlvX2h3X2RldmljZV90ICpkZXYpOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIGRldmljZS4KLSAgICB2aXJ0dWFsIH5EZXZpY2VIYWxMb2NhbCgpOwotCi0gICAgdWludDMyX3QgdmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1EZXYtPmNvbW1vbi52ZXJzaW9uOyB9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWIzMzU5Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSURldmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL2hpZGwvSGFsRGVhdGhIYW5kbGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLURldmljZXNGYWN0b3J5SGFsSGlkbDo6RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkgewotICAgIG1EZXZpY2VzRmFjdG9yeSA9IElEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZSgpOwotICAgIGlmIChtRGV2aWNlc0ZhY3RvcnkgIT0gMCkgewotICAgICAgICAvLyBJdCBpcyBhc3N1bWVkIHRoYXQgRGV2aWNlc0ZhY3RvcnkgaXMgb3duZWQgYnkgQXVkaW9GbGluZ2VyCi0gICAgICAgIC8vIGFuZCB0aHVzIGhhdmUgdGhlIHNhbWUgbGlmZXNwYW4uCi0gICAgICAgIG1EZXZpY2VzRmFjdG9yeS0+bGlua1RvRGVhdGgoSGFsRGVhdGhIYW5kbGVyOjpnZXRJbnN0YW5jZSgpLCAwIC8qY29va2llKi8pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb2J0YWluIElEZXZpY2VzRmFjdG9yeSBzZXJ2aWNlLCB0ZXJtaW5hdGluZyBwcm9jZXNzLiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICAvLyBUaGUgTVNEIGZhY3RvcnkgaXMgb3B0aW9uYWwKLSAgICBtRGV2aWNlc0ZhY3RvcnlNc2QgPSBJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoQVVESU9fSEFMX1NFUlZJQ0VfTkFNRV9NU0QpOwotICAgIC8vIFRPRE86IFJlZ2lzdGVyIGRlYXRoIGhhbmRsZXIsIGFuZCBhZGQgJ3Jlc3RhcnQnIGRpcmVjdGl2ZSB0byBhdWRpb3NlcnZlci5yYwotfQotCi1EZXZpY2VzRmFjdG9yeUhhbEhpZGw6On5EZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSB7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpuYW1lRnJvbUhhbChjb25zdCBjaGFyICpuYW1lLCBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZSAqZGV2aWNlKSB7Ci0gICAgaWYgKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSkgPT0gMCkgewotICAgICAgICAqZGV2aWNlID0gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlBSSU1BUlk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQKSA9PSAwKSB7Ci0gICAgICAgICpkZXZpY2UgPSBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6QTJEUDsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1VTQikgPT0gMCkgewotICAgICAgICAqZGV2aWNlID0gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlVTQjsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1JFTU9URV9TVUJNSVgpID09IDApIHsKLSAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpSX1NVQk1JWDsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1NUVUIpID09IDApIHsKLSAgICAgICAgKmRldmljZSA9IElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpTVFVCOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIEFMT0dFKCJJbnZhbGlkIGRldmljZSBuYW1lICVzIiwgbmFtZSk7Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgewotICAgIGlmIChtRGV2aWNlc0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgSURldmljZXNGYWN0b3J5OjpEZXZpY2UgaGlkbERldmljZTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBuYW1lRnJvbUhhbChuYW1lLCAmaGlkbERldmljZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2VzRmFjdG9yeS0+b3BlbkRldmljZSgKLSAgICAgICAgICAgIGhpZGxEZXZpY2UsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElEZXZpY2U+JiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqZGV2aWNlID0gbmV3IERldmljZUhhbEhpZGwocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKLSAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0ODg0OS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lEZXZpY2VzRmFjdG9yeS5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SURldmljZXNGYWN0b3J5OwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZXNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCi0gICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkOwotCi0gICAgc3A8SURldmljZXNGYWN0b3J5PiBtRGV2aWNlc0ZhY3Rvcnk7Ci0gICAgc3A8SURldmljZXNGYWN0b3J5PiBtRGV2aWNlc0ZhY3RvcnlNc2Q7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgbmFtZUZyb21IYWwoY29uc3QgY2hhciAqbmFtZSwgSURldmljZXNGYWN0b3J5OjpEZXZpY2UgKmRldmljZSk7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCk7Ci0KLSAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbEhpZGwoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzRiZTc0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLURldmljZXNGYWN0b3J5SGFsSHlicmlkOjpEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpCi0gICAgICAgIDogbUxvY2FsRmFjdG9yeShuZXcgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpKSwKLSAgICAgICAgICBtSGlkbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsSGlkbCgpKSB7Ci19Ci0KLURldmljZXNGYWN0b3J5SGFsSHlicmlkOjp+RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKSB7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsSHlicmlkOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgewotICAgIGlmIChtSGlkbEZhY3RvcnkgIT0gMCAmJiBzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0EyRFAsIG5hbWUpICE9IDAgJiYKLSAgICAgICAgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9IRUFSSU5HX0FJRCwgbmFtZSkgIT0gMCkgewotICAgICAgICByZXR1cm4gbUhpZGxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7Ci0gICAgfQotICAgIHJldHVybiBtTG9jYWxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDU3ZDYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF9ICi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCi0gICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIERldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7Ci0KLSAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOwotCi0gICAgc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1Mb2NhbEZhY3Rvcnk7Ci0gICAgc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1IaWRsRmFjdG9yeTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxM2E5YWNkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2luY2x1ZGUgPGhhcmR3YXJlL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJEZXZpY2VIYWxMb2NhbC5oIgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgc3RhdHVzX3QgbG9hZF9hdWRpb19pbnRlcmZhY2UoY29uc3QgY2hhciAqaWZfbmFtZSwgYXVkaW9faHdfZGV2aWNlX3QgKipkZXYpCi17Ci0gICAgY29uc3QgaHdfbW9kdWxlX3QgKm1vZDsKLSAgICBpbnQgcmM7Ci0KLSAgICByYyA9IGh3X2dldF9tb2R1bGVfYnlfY2xhc3MoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCAmbW9kKTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgQUxPR0UoIiVzIGNvdWxkbid0IGxvYWQgYXVkaW8gaHcgbW9kdWxlICVzLiVzICglcykiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsIHN0cmVycm9yKC1yYykpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgcmMgPSBhdWRpb19od19kZXZpY2Vfb3Blbihtb2QsIGRldik7Ci0gICAgaWYgKHJjKSB7Ci0gICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBvcGVuIGF1ZGlvIGh3IGRldmljZSBpbiAlcy4lcyAoJXMpIiwgX19mdW5jX18sCi0gICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIGlmICgoKmRldiktPmNvbW1vbi52ZXJzaW9uIDwgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OX01JTikgewotICAgICAgICBBTE9HRSgiJXMgd3JvbmcgYXVkaW8gaHcgZGV2aWNlIHZlcnNpb24gJTA0eCIsIF9fZnVuY19fLCAoKmRldiktPmNvbW1vbi52ZXJzaW9uKTsKLSAgICAgICAgcmMgPSBCQURfVkFMVUU7Ci0gICAgICAgIGF1ZGlvX2h3X2RldmljZV9jbG9zZSgqZGV2KTsKLSAgICAgICAgZ290byBvdXQ7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLQotb3V0OgotICAgICpkZXYgPSBOVUxMOwotICAgIHJldHVybiByYzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKLSAgICBhdWRpb19od19kZXZpY2VfdCAqZGV2OwotICAgIHN0YXR1c190IHJjID0gbG9hZF9hdWRpb19pbnRlcmZhY2UobmFtZSwgJmRldik7Ci0gICAgaWYgKHJjID09IE9LKSB7Ci0gICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsTG9jYWwoZGV2KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJjOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjlkMThhYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMX0gKLQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEZXZpY2VzRmFjdG9yeUhhbExvY2FsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKLSAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQ7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpIHt9Ci0KLSAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbExvY2FsKCkge30KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNmE1MDAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8YXRvbWljPgotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdEJ1ZmZlckhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvYWxsb2NhdG9yLzEuMC9JQWxsb2NhdG9yLmg+Ci0jaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoaWRsOjphbGxvY2F0b3I6OlYxXzA6OklBbGxvY2F0b3I7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RhdGljCi11aW50NjRfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptYWtlVW5pcXVlSWQoKSB7Ci0gICAgc3RhdGljIHN0ZDo6YXRvbWljPHVpbnQ2NF90PiBjb3VudGVyezF9OwotICAgIHJldHVybiBjb3VudGVyKys7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmFsbG9jYXRlKAotICAgICAgICBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7Ci0gICAgcmV0dXJuIG1pcnJvcihudWxscHRyLCBzaXplLCBidWZmZXIpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjptaXJyb3IoCi0gICAgICAgIHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7Ci0gICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiB0ZW1wQnVmZmVyID0gbmV3IEVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZSk7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KHRlbXBCdWZmZXIuZ2V0KCkpLT5pbml0KCk7Ci0gICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICB0ZW1wQnVmZmVyLT5zZXRFeHRlcm5hbERhdGEoZXh0ZXJuYWwpOwotICAgICAgICAqYnVmZmVyID0gdGVtcEJ1ZmZlcjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRWZmZWN0QnVmZmVySGFsSGlkbDo6RWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSkKLSAgICAgICAgOiBtQnVmZmVyU2l6ZShzaXplKSwgbUZyYW1lQ291bnRDaGFuZ2VkKGZhbHNlKSwKLSAgICAgICAgICBtRXh0ZXJuYWxEYXRhKG51bGxwdHIpLCBtQXVkaW9CdWZmZXJ7MCwge251bGxwdHJ9fSB7Ci0gICAgbUhpZGxCdWZmZXIuaWQgPSBtYWtlVW5pcXVlSWQoKTsKLSAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKLX0KLQotRWZmZWN0QnVmZmVySGFsSGlkbDo6fkVmZmVjdEJ1ZmZlckhhbEhpZGwoKSB7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmluaXQoKSB7Ci0gICAgc3A8SUFsbG9jYXRvcj4gYXNobWVtID0gSUFsbG9jYXRvcjo6Z2V0U2VydmljZSgiYXNobWVtIik7Ci0gICAgaWYgKGFzaG1lbSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmV0cmlldmUgYXNobWVtIGFsbG9jYXRvciBzZXJ2aWNlIik7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBzdGF0dXNfdCByZXR2YWwgPSBOT19NRU1PUlk7Ci0gICAgUmV0dXJuPHZvaWQ+IHJlc3VsdCA9IGFzaG1lbS0+YWxsb2NhdGUoCi0gICAgICAgICAgICBtQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIFsmXShib29sIHN1Y2Nlc3MsIGNvbnN0IGhpZGxfbWVtb3J5JiBtZW1vcnkpIHsKLSAgICAgICAgICAgICAgICBpZiAoc3VjY2VzcykgewotICAgICAgICAgICAgICAgICAgICBtSGlkbEJ1ZmZlci5kYXRhID0gbWVtb3J5OwotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBPSzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmVzdWx0LmlzT2soKSAmJiByZXR2YWwgPT0gT0spIHsKLSAgICAgICAgbU1lbW9yeSA9IGhhcmR3YXJlOjptYXBNZW1vcnkobUhpZGxCdWZmZXIuZGF0YSk7Ci0gICAgICAgIGlmIChtTWVtb3J5ICE9IDApIHsKLSAgICAgICAgICAgIG1NZW1vcnktPnVwZGF0ZSgpOwotICAgICAgICAgICAgbUF1ZGlvQnVmZmVyLnJhdyA9IHN0YXRpY19jYXN0PHZvaWQqPihtTWVtb3J5LT5nZXRQb2ludGVyKCkpOwotICAgICAgICAgICAgbWVtc2V0KG1BdWRpb0J1ZmZlci5yYXcsIDAsIG1NZW1vcnktPmdldFNpemUoKSk7Ci0gICAgICAgICAgICBtTWVtb3J5LT5jb21taXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFwIGFsbG9jYXRlZCBhc2htZW0iKTsKLSAgICAgICAgICAgIHJldHZhbCA9IE5PX01FTU9SWTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gYWxsb2NhdGUgJWQgYnl0ZXMgZnJvbSBhc2htZW0iLCAoaW50KW1CdWZmZXJTaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdC5pc09rKCkgPyByZXR2YWwgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLWF1ZGlvX2J1ZmZlcl90KiBFZmZlY3RCdWZmZXJIYWxIaWRsOjphdWRpb0J1ZmZlcigpIHsKLSAgICByZXR1cm4gJm1BdWRpb0J1ZmZlcjsKLX0KLQotdm9pZCogRWZmZWN0QnVmZmVySGFsSGlkbDo6ZXh0ZXJuYWxEYXRhKCkgY29uc3QgewotICAgIHJldHVybiBtRXh0ZXJuYWxEYXRhOwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpIHsKLSAgICBtSGlkbEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKLSAgICBtQXVkaW9CdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gdHJ1ZTsKLX0KLQotYm9vbCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKSB7Ci0gICAgYm9vbCByZXN1bHQgPSBtRnJhbWVDb3VudENoYW5nZWQ7Ci0gICAgbUZyYW1lQ291bnRDaGFuZ2VkID0gZmFsc2U7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRFeHRlcm5hbERhdGEodm9pZCogZXh0ZXJuYWwpIHsKLSAgICBtRXh0ZXJuYWxEYXRhID0gZXh0ZXJuYWw7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKCkgewotICAgIHVwZGF0ZShtQnVmZmVyU2l6ZSk7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KCkgewotICAgIGNvbW1pdChtQnVmZmVyU2l6ZSk7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6dXBkYXRlKHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOwotICAgIG1NZW1vcnktPnVwZGF0ZSgpOwotICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKLSAgICBtZW1jcHkobUF1ZGlvQnVmZmVyLnJhdywgbUV4dGVybmFsRGF0YSwgc2l6ZSk7Ci0gICAgbU1lbW9yeS0+Y29tbWl0KCk7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y29tbWl0KHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1FeHRlcm5hbERhdGEgPT0gbnVsbHB0cikgcmV0dXJuOwotICAgIGlmIChzaXplID4gbUJ1ZmZlclNpemUpIHNpemUgPSBtQnVmZmVyU2l6ZTsKLSAgICBtZW1jcHkobUV4dGVybmFsRGF0YSwgbUF1ZGlvQnVmZmVyLnJhdywgc2l6ZSk7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0QnVmZmVySGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWUwMDg3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+Ci0KLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpBdWRpb0J1ZmZlcjsKLXVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKLXVzaW5nIGFuZHJvaWQ6OmhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBFZmZlY3RCdWZmZXJIYWxIaWRsIDogcHVibGljIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgc3RhdGljIHN0YXR1c190IGFsbG9jYXRlKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBtaXJyb3Iodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpOwotCi0gICAgdmlydHVhbCBhdWRpb19idWZmZXJfdCogYXVkaW9CdWZmZXIoKTsKLSAgICB2aXJ0dWFsIHZvaWQqIGV4dGVybmFsRGF0YSgpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1CdWZmZXJTaXplOyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0RnJhbWVDb3VudChzaXplX3QgZnJhbWVDb3VudCk7Ci0gICAgdmlydHVhbCBib29sIGNoZWNrRnJhbWVDb3VudENoYW5nZSgpOwotCi0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZSgpOwotICAgIHZpcnR1YWwgdm9pZCBjb21taXQoKTsKLSAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKHNpemVfdCBzaXplKTsKLSAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KHNpemVfdCBzaXplKTsKLQotICAgIGNvbnN0IEF1ZGlvQnVmZmVyJiBoaWRsQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUhpZGxCdWZmZXI7IH0KLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U7Ci0KLSAgICBzdGF0aWMgdWludDY0X3QgbWFrZVVuaXF1ZUlkKCk7Ci0KLSAgICBjb25zdCBzaXplX3QgbUJ1ZmZlclNpemU7Ci0gICAgYm9vbCBtRnJhbWVDb3VudENoYW5nZWQ7Ci0gICAgdm9pZCogbUV4dGVybmFsRGF0YTsKLSAgICBBdWRpb0J1ZmZlciBtSGlkbEJ1ZmZlcjsKLSAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OwotICAgIGF1ZGlvX2J1ZmZlcl90IG1BdWRpb0J1ZmZlcjsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemVfdCBzaXplKTsKLQotICAgIHZpcnR1YWwgfkVmZmVjdEJ1ZmZlckhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IGluaXQoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0SGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYjAzMmMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkVmZmVjdEhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEJ1ZmZlckhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCi0jaW5jbHVkZSAiSGlkbFV0aWxzLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkF1ZGlvQnVmZmVyOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6RWZmZWN0QnVmZmVyQWNjZXNzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6RWZmZWN0Q29uZmlnUGFyYW1ldGVyczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6Ok1lc3NhZ2VRdWV1ZUZsYWdCaXRzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6SGlkbFV0aWxzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjJfMDo6QXVkaW9DaGFubmVsTWFzazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvRm9ybWF0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUVmZmVjdEhhbEhpZGw6OkVmZmVjdEhhbEhpZGwoY29uc3Qgc3A8SUVmZmVjdD4mIGVmZmVjdCwgdWludDY0X3QgZWZmZWN0SWQpCi0gICAgICAgIDogbUVmZmVjdChlZmZlY3QpLCBtRWZmZWN0SWQoZWZmZWN0SWQpLCBtQnVmZmVyc0NoYW5nZWQodHJ1ZSksIG1FZkdyb3VwKG51bGxwdHIpIHsKLX0KLQotRWZmZWN0SGFsSGlkbDo6fkVmZmVjdEhhbEhpZGwoKSB7Ci0gICAgaWYgKG1FZmZlY3QgIT0gMCkgewotICAgICAgICBjbG9zZSgpOwotICAgICAgICBtRWZmZWN0LmNsZWFyKCk7Ci0gICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgfQotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbCgKLSAgICAgICAgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgZGVzY3JpcHRvciwgZWZmZWN0X2Rlc2NyaXB0b3JfdCogaGFsRGVzY3JpcHRvcikgewotICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudHlwZSwgJmhhbERlc2NyaXB0b3ItPnR5cGUpOwotICAgIEhpZGxVdGlsczo6dXVpZFRvSGFsKGRlc2NyaXB0b3IudXVpZCwgJmhhbERlc2NyaXB0b3ItPnV1aWQpOwotICAgIGhhbERlc2NyaXB0b3ItPmZsYWdzID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGRlc2NyaXB0b3IuZmxhZ3MpOwotICAgIGhhbERlc2NyaXB0b3ItPmNwdUxvYWQgPSBkZXNjcmlwdG9yLmNwdUxvYWQ7Ci0gICAgaGFsRGVzY3JpcHRvci0+bWVtb3J5VXNhZ2UgPSBkZXNjcmlwdG9yLm1lbW9yeVVzYWdlOwotICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5uYW1lLCBkZXNjcmlwdG9yLm5hbWUuZGF0YSgpLCBkZXNjcmlwdG9yLm5hbWUuc2l6ZSgpKTsKLSAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+aW1wbGVtZW50b3IsCi0gICAgICAgICAgICBkZXNjcmlwdG9yLmltcGxlbWVudG9yLmRhdGEoKSwgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5zaXplKCkpOwotfQotCi0vLyBUT0RPKG1uYWdhbm92KTogVGhlc2UgYnVmZmVyIGNvbnZlcnNpb24gZnVuY3Rpb25zIHNob3VsZCBiZSBzaGFyZWQgd2l0aCBFZmZlY3Qgd3JhcHBlcgotLy8gdmlhIEhpZGxVdGlscy4gTW92ZSB0aGVtIHRoZXJlIHdoZW4gaGFyZHdhcmUvaW50ZXJmYWNlcyB3aWxsIGdldCB1bi1mcm96ZW4gYWdhaW4uCi0KLS8vIHN0YXRpYwotdm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAotICAgICAgICBjb25zdCBidWZmZXJfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0QnVmZmVyQ29uZmlnKiBjb25maWcpIHsKLSAgICBjb25maWctPnNhbXBsaW5nUmF0ZUh6ID0gaGFsQ29uZmlnLnNhbXBsaW5nUmF0ZTsKLSAgICBjb25maWctPmNoYW5uZWxzID0gQXVkaW9DaGFubmVsTWFzayhoYWxDb25maWcuY2hhbm5lbHMpOwotICAgIGNvbmZpZy0+Zm9ybWF0ID0gQXVkaW9Gb3JtYXQoaGFsQ29uZmlnLmZvcm1hdCk7Ci0gICAgY29uZmlnLT5hY2Nlc3NNb2RlID0gRWZmZWN0QnVmZmVyQWNjZXNzKGhhbENvbmZpZy5hY2Nlc3NNb2RlKTsKLSAgICBjb25maWctPm1hc2sgPSBFZmZlY3RDb25maWdQYXJhbWV0ZXJzKGhhbENvbmZpZy5tYXNrKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKAotICAgICAgICBjb25zdCBFZmZlY3RCdWZmZXJDb25maWcmIGNvbmZpZywgYnVmZmVyX2NvbmZpZ190KiBoYWxDb25maWcpIHsKLSAgICBoYWxDb25maWctPmJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKLSAgICBoYWxDb25maWctPmJ1ZmZlci5yYXcgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+c2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsaW5nUmF0ZUh6OwotICAgIGhhbENvbmZpZy0+Y2hhbm5lbHMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29uZmlnLmNoYW5uZWxzKTsKLSAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7Ci0gICAgaGFsQ29uZmlnLT5mb3JtYXQgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcuZm9ybWF0KTsKLSAgICBoYWxDb25maWctPmFjY2Vzc01vZGUgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcuYWNjZXNzTW9kZSk7Ci0gICAgaGFsQ29uZmlnLT5tYXNrID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLm1hc2spOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0Q29uZmlnRnJvbUhhbChjb25zdCBlZmZlY3RfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0Q29uZmlnKiBjb25maWcpIHsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5pbnB1dENmZywgJmNvbmZpZy0+aW5wdXRDZmcpOwotICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoaGFsQ29uZmlnLm91dHB1dENmZywgJmNvbmZpZy0+b3V0cHV0Q2ZnKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ1RvSGFsKGNvbnN0IEVmZmVjdENvbmZpZyYgY29uZmlnLCBlZmZlY3RfY29uZmlnX3QqIGhhbENvbmZpZykgewotICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKGNvbmZpZy5pbnB1dENmZywgJmhhbENvbmZpZy0+aW5wdXRDZmcpOwotICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKGNvbmZpZy5vdXRwdXRDZmcsICZoYWxDb25maWctPm91dHB1dENmZyk7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCkgewotICAgIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OlJFU1VMVF9UT09fQklHOiByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgewotICAgIGlmICghbUJ1ZmZlcnNDaGFuZ2VkKSB7Ci0gICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtSW5CdWZmZXIuZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLmdldCgpICE9IG1JbkJ1ZmZlci5nZXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtSW5CdWZmZXItPmF1ZGlvQnVmZmVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbUluQnVmZmVyID0gYnVmZmVyOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgewotICAgIGlmICghbUJ1ZmZlcnNDaGFuZ2VkKSB7Ci0gICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtT3V0QnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtT3V0QnVmZmVyLmdldCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLT5hdWRpb0J1ZmZlcigpICE9IG1PdXRCdWZmZXItPmF1ZGlvQnVmZmVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbU91dEJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3MoKSB7Ci0gICAgcmV0dXJuIHByb2Nlc3NJbXBsKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6UkVRVUVTVF9QUk9DRVNTKSk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3NSZXZlcnNlKCkgewotICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTU19SRVZFUlNFKSk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByZXBhcmVGb3JQcm9jZXNzaW5nKCkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPnByZXBhcmVGb3JQcm9jZXNzaW5nKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNUURlc2NyaXB0b3JTeW5jPFJlc3VsdD4mIHN0YXR1c01RKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgJiYgdGVtcFN0YXR1c01RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLSAgICBpZiAoIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwgIW1FZkdyb3VwKSB7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciBlZmZlY3RzIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciBlZmZlY3RzIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgZWZmZWN0cyBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOwotICAgIHJldHVybiBPSzsKLX0KLQotYm9vbCBFZmZlY3RIYWxIaWRsOjpuZWVkVG9SZXNldEJ1ZmZlcnMoKSB7Ci0gICAgaWYgKG1CdWZmZXJzQ2hhbmdlZCkgcmV0dXJuIHRydWU7Ci0gICAgYm9vbCBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkID0gbUluQnVmZmVyLT5jaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKLSAgICBib29sIG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkID0gbU91dEJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7Ci0gICAgcmV0dXJuIGluQnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgfHwgb3V0QnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3NJbXBsKHVpbnQzMl90IG1xRmxhZykgewotICAgIGlmIChtRWZmZWN0ID09IDAgfHwgbUluQnVmZmVyID09IDAgfHwgbU91dEJ1ZmZlciA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKCFtU3RhdHVzTVEgJiYgKHN0YXR1cyA9IHByZXBhcmVGb3JQcm9jZXNzaW5nKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIGlmIChuZWVkVG9SZXNldEJ1ZmZlcnMoKSAmJiAoc3RhdHVzID0gc2V0UHJvY2Vzc0J1ZmZlcnMoKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgLy8gVGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgYnVmZmVycywganVzdCBuZWVkIHRvIGZsdXNoIGl0IGFuZCB3YWtlIHVwIHRoZSBzZXJ2ZXIgc2lkZS4KLSAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7Ci0gICAgbUVmR3JvdXAtPndha2UobXFGbGFnKTsKLSAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKLXJldHJ5OgotICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpLCAmZWZTdGF0ZSk7Ci0gICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OkRPTkVfUFJPQ0VTU0lORykpIHsKLSAgICAgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICBtU3RhdHVzTVEtPnJlYWQoJnJldHZhbCk7Ci0gICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSyB8fCByZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX1NUQVRFKSB7Ci0gICAgICAgICAgICAvLyBTeW5jIGJhY2sgdGhlIGNoYW5nZWQgY29udGVudHMgb2YgdGhlIGJ1ZmZlci4KLSAgICAgICAgICAgIHN0ZDo6YXRvbWljX3RocmVhZF9mZW5jZShzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5hbHl6ZVJlc3VsdChyZXR2YWwpOwotICAgIH0KLSAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgewotICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KLSAgICAgICAgZ290byByZXRyeTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0UHJvY2Vzc0J1ZmZlcnMoKSB7Ci0gICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gbUVmZmVjdC0+c2V0UHJvY2Vzc0J1ZmZlcnMoCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4obUluQnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1PdXRCdWZmZXIuZ2V0KCkpLT5oaWRsQnVmZmVyKCkpOwotICAgIGlmIChyZXQuaXNPaygpICYmIHJldCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGZhbHNlOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAotICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7Ci0gICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0KLSAgICAvLyBTcGVjaWFsIGNhc2VzLgotICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJRyB8fCBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJR19SRVZFUlNFKSB7Ci0gICAgICAgIHJldHVybiBzZXRDb25maWdJbXBsKGNtZENvZGUsIGNtZFNpemUsIHBDbWREYXRhLCByZXBseVNpemUsIHBSZXBseURhdGEpOwotICAgIH0gZWxzZSBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUdfUkVWRVJTRSkgewotICAgICAgICByZXR1cm4gZ2V0Q29uZmlnSW1wbChjbWRDb2RlLCByZXBseVNpemUsIHBSZXBseURhdGEpOwotICAgIH0KLQotICAgIC8vIENvbW1vbiBjYXNlLgotICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGhpZGxEYXRhOwotICAgIGlmIChwQ21kRGF0YSAhPSBudWxscHRyICYmIGNtZFNpemUgPiAwKSB7Ci0gICAgICAgIGhpZGxEYXRhLnNldFRvRXh0ZXJuYWwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocENtZERhdGEpLCBjbWRTaXplKTsKLSAgICB9Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIHVpbnQzMl90IHJlcGx5U2l6ZVN0dWIgPSAwOwotICAgIGlmIChyZXBseVNpemUgPT0gbnVsbHB0ciB8fCBwUmVwbHlEYXRhID09IG51bGxwdHIpIHJlcGx5U2l6ZSA9ICZyZXBseVNpemVTdHViOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5jb21tYW5kKGNtZENvZGUsIGhpZGxEYXRhLCAqcmVwbHlTaXplLAotICAgICAgICAgICAgWyZdKGludDMyX3QgcywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgqcmVwbHlTaXplID4gcmVzdWx0LnNpemUoKSkgKnJlcGx5U2l6ZSA9IHJlc3VsdC5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhICE9IG51bGxwdHIgJiYgKnJlcGx5U2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCAmcmVzdWx0WzBdLCAqcmVwbHlTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiByZXQuaXNPaygpID8gc3RhdHVzIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0gICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5nZXREZXNjcmlwdG9yKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmNsb3NlKCkgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPmNsb3NlKCk7Ci0gICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmdldENvbmZpZ0ltcGwoCi0gICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKLSAgICBpZiAocmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIFJldHVybjx2b2lkPiByZXQ7Ci0gICAgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHKSB7Ci0gICAgICAgIHJldCA9IG1FZmZlY3QtPmdldENvbmZpZyhbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7Ci0gICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWdSZXZlcnNlKFsmXSAoUmVzdWx0IHIsIGNvbnN0IEVmZmVjdENvbmZpZyAmaGlkbENvbmZpZykgewotICAgICAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyKTsKLSAgICAgICAgICAgIGlmIChyID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICBlZmZlY3RDb25maWdUb0hhbChoaWRsQ29uZmlnLCBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwUmVwbHlEYXRhKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLSAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgcmVzdWx0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRDb25maWdJbXBsKAotICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewotICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwKLSAgICAgICAgICAgIHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBjb25zdCBlZmZlY3RfY29uZmlnX3QgKmhhbENvbmZpZyA9IHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBDbWREYXRhKTsKLSAgICBpZiAoaGFsQ29uZmlnLT5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAotICAgICAgICAgICAgaGFsQ29uZmlnLT5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyICE9IE5VTEwgfHwKLSAgICAgICAgICAgIGhhbENvbmZpZy0+b3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAhPSBOVUxMIHx8Ci0gICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkJ1ZmZlciBwcm92aWRlciBjYWxsYmFja3MgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICB9Ci0gICAgRWZmZWN0Q29uZmlnIGhpZGxDb25maWc7Ci0gICAgZWZmZWN0Q29uZmlnRnJvbUhhbCgqaGFsQ29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgPwotICAgICAgICAgICAgbUVmZmVjdC0+c2V0Q29uZmlnKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpIDoKLSAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZ1JldmVyc2UoaGlkbENvbmZpZywgbnVsbHB0ciwgbnVsbHB0cik7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocmV0KTsKLSAgICAgICAgKnN0YXRpY19jYXN0PGludDMyX3QqPihwUmVwbHlEYXRhKSA9IHJlc3VsdDsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9FZmZlY3RIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmZmRhZjEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdEhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzIuMC9JRWZmZWN0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgotI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdEJ1ZmZlckNvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdENvbmZpZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OkVmZmVjdERlc2NyaXB0b3I7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpJRWZmZWN0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEVmZmVjdEhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0SGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXQgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7Ci0KLSAgICAvLyBTZXQgdGhlIG91dHB1dCBidWZmZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRCdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKTsKLQotICAgIC8vIEVmZmVjdCBwcm9jZXNzIGZ1bmN0aW9uLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2VzcygpOwotCi0gICAgLy8gUHJvY2VzcyByZXZlcnNlIHN0cmVhbSBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHBhc3MKLSAgICAvLyBhIHJlZmVyZW5jZSBzdHJlYW0gdG8gdGhlIGVmZmVjdCBlbmdpbmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzUmV2ZXJzZSgpOwotCi0gICAgLy8gU2VuZCBhIGNvbW1hbmQgYW5kIHJlY2VpdmUgYSByZXNwb25zZSB0by9mcm9tIGVmZmVjdCBlbmdpbmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAotICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOwotCi0gICAgLy8gRnJlZSByZXNvdXJjZXMgb24gdGhlIHJlbW90ZSBzaWRlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKTsKLQotICAgIC8vIFdoZXRoZXIgaXQncyBhIGxvY2FsIGltcGxlbWVudGF0aW9uLgotICAgIHZpcnR1YWwgYm9vbCBpc0xvY2FsKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAgIHVpbnQ2NF90IGVmZmVjdElkKCkgY29uc3QgeyByZXR1cm4gbUVmZmVjdElkOyB9Ci0KLSAgICBzdGF0aWMgdm9pZCBlZmZlY3REZXNjcmlwdG9yVG9IYWwoCi0gICAgICAgICAgICBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBoYWxEZXNjcmlwdG9yKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGw7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8Ci0gICAgICAgIGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWMl8wOjpSZXN1bHQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKLQotICAgIHNwPElFZmZlY3Q+IG1FZmZlY3Q7Ci0gICAgY29uc3QgdWludDY0X3QgbUVmZmVjdElkOwotICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gbUluQnVmZmVyOwotICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gbU91dEJ1ZmZlcjsKLSAgICBib29sIG1CdWZmZXJzQ2hhbmdlZDsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKLSAgICBFdmVudEZsYWcqIG1FZkdyb3VwOwotCi0gICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgaGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OlJlc3VsdCYgcmVzdWx0KTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKAotICAgICAgICAgICAgY29uc3QgYnVmZmVyX2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdEJ1ZmZlckNvbmZpZyogY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RCdWZmZXJDb25maWdUb0hhbCgKLSAgICAgICAgICAgIGNvbnN0IEVmZmVjdEJ1ZmZlckNvbmZpZyYgY29uZmlnLCBidWZmZXJfY29uZmlnX3QqIGhhbENvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0Q29uZmlnRnJvbUhhbChjb25zdCBlZmZlY3RfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0Q29uZmlnKiBjb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdENvbmZpZ1RvSGFsKGNvbnN0IEVmZmVjdENvbmZpZyYgY29uZmlnLCBlZmZlY3RfY29uZmlnX3QqIGhhbENvbmZpZyk7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IHJlbGVhc2VzIHRoZSBlZmZlY3QuCi0gICAgdmlydHVhbCB+RWZmZWN0SGFsSGlkbCgpOwotCi0gICAgc3RhdHVzX3QgZ2V0Q29uZmlnSW1wbCh1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUHJvY2Vzc2luZygpOwotICAgIGJvb2wgbmVlZFRvUmVzZXRCdWZmZXJzKCk7Ci0gICAgc3RhdHVzX3QgcHJvY2Vzc0ltcGwodWludDMyX3QgbXFGbGFnKTsKLSAgICBzdGF0dXNfdCBzZXRDb25maWdJbXBsKAotICAgICAgICAgICAgdWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCi0gICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKLSAgICBzdGF0dXNfdCBzZXRQcm9jZXNzQnVmZmVycygpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ0MGU2ZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdHNGYWN0b3J5SGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpIaWRsVXRpbHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpVdWlkOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6SUVmZmVjdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1FZmZlY3RzRmFjdG9yeUhhbEhpZGw6OkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkVmZmVjdHNGYWN0b3J5IikgewotICAgIG1FZmZlY3RzRmFjdG9yeSA9IElFZmZlY3RzRmFjdG9yeTo6Z2V0U2VydmljZSgpOwotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiBJRWZmZWN0c0ZhY3Rvcnkgc2VydmljZSwgdGVybWluYXRpbmcgcHJvY2Vzcy4iKTsKLSAgICAgICAgZXhpdCgxKTsKLSAgICB9Ci19Ci0KLUVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6fkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpIHsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeUFsbERlc2NyaXB0b3JzKCkgewotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldEFsbERlc2NyaXB0b3JzKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgbUxhc3REZXNjcmlwdG9ycyA9IHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICByZXR1cm4gcmV0dmFsID09IFJlc3VsdDo6T0sgPyBPSyA6IE5PX0lOSVQ7Ci0gICAgfQotICAgIG1MYXN0RGVzY3JpcHRvcnMucmVzaXplKDApOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKSB7Ci0gICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Ci0gICAgaWYgKHF1ZXJ5UmVzdWx0ID09IE9LKSB7Ci0gICAgICAgICpwTnVtRWZmZWN0cyA9IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpOwotICAgIH0KLSAgICByZXR1cm4gcXVlcnlSZXN1bHQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKLSAgICAgICAgdWludDMyX3QgaW5kZXgsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0gICAgLy8gVE9ETzogV2UgbmVlZCBzb21laG93IHRvIHRyYWNrIHRoZSBjaGFuZ2VzIG9uIHRoZSBzZXJ2ZXIgc2lkZQotICAgIC8vIG9yIGZpZ3VyZSBvdXQgaG93IHRvIGNvbnZlcnQgZXZlcnlib2R5IHRvIHF1ZXJ5IGFsbCB0aGUgZGVzY3JpcHRvcnMgYXQgb25jZS4KLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgbnVsbHB0cgotICAgIGlmIChtTGFzdERlc2NyaXB0b3JzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHN0YXR1c190IHF1ZXJ5UmVzdWx0ID0gcXVlcnlBbGxEZXNjcmlwdG9ycygpOwotICAgICAgICBpZiAocXVlcnlSZXN1bHQgIT0gT0spIHJldHVybiBxdWVyeVJlc3VsdDsKLSAgICB9Ci0gICAgaWYgKGluZGV4ID49IG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKG1MYXN0RGVzY3JpcHRvcnNbaW5kZXhdLCBwRGVzY3JpcHRvcik7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmdldERlc2NyaXB0b3IoCi0gICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCi0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBVdWlkIGhpZGxVdWlkOwotICAgIEhpZGxVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5nZXREZXNjcmlwdG9yKGhpZGxVdWlkLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSByZXR1cm4gT0s7Ci0gICAgICAgIGVsc2UgaWYgKHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfQVJHVU1FTlRTKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Ci0gICAgICAgIGVsc2UgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpjcmVhdGVFZmZlY3QoCi0gICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAotICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpIHsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFV1aWQgaGlkbFV1aWQ7Ci0gICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmNyZWF0ZUVmZmVjdCgKLSAgICAgICAgICAgIGhpZGxVdWlkLCBzZXNzaW9uSWQsIGlvSWQsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElFZmZlY3Q+JiByZXN1bHQsIHVpbnQ2NF90IGVmZmVjdElkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmVmZmVjdCA9IG5ldyBFZmZlY3RIYWxIaWRsKHJlc3VsdCwgZWZmZWN0SWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOwotICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6ZHVtcEVmZmVjdHMoaW50IGZkKSB7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+ZGVidWdEdW1wKGhpZGxIYW5kbGUpOwotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjphbGxvY2F0ZUJ1ZmZlcihzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7Ci0gICAgcmV0dXJuIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmFsbG9jYXRlKHNpemUsIGJ1ZmZlcik7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6bWlycm9yQnVmZmVyKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7Ci0gICAgcmV0dXJuIEVmZmVjdEJ1ZmZlckhhbEhpZGw6Om1pcnJvcihleHRlcm5hbCwgc2l6ZSwgYnVmZmVyKTsKLX0KLQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYjU0ODEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL2VmZmVjdC8yLjAvSUVmZmVjdHNGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjJfMDo6RWZmZWN0RGVzY3JpcHRvcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OklFZmZlY3RzRmFjdG9yeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotCi1jbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAotewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpZmZlcmVudCBlZmZlY3RzIGluIGFsbCBsb2FkZWQgbGlicmFyaWVzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cyk7Ci0KLSAgICAvLyBSZXR1cm5zIGEgZGVzY3JpcHRvciBvZiB0aGUgbmV4dCBhdmFpbGFibGUgZWZmZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcih1aW50MzJfdCBpbmRleCwKLSAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKLSAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKTsKLQotICAgIC8vIENyZWF0ZXMgYW4gZWZmZWN0IGVuZ2luZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0gICAgLy8gVG8gcmVsZWFzZSB0aGUgZWZmZWN0IGVuZ2luZSwgaXQgaXMgbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcwotICAgIC8vIHRvIHRoZSByZXR1cm5lZCBlZmZlY3Qgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlRWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKLSAgICAgICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBFZmZlY3RzKGludCBmZCk7Ci0KLSAgICBzdGF0dXNfdCBhbGxvY2F0ZUJ1ZmZlcihzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCBtaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlOwotCi0gICAgc3A8SUVmZmVjdHNGYWN0b3J5PiBtRWZmZWN0c0ZhY3Rvcnk7Ci0gICAgaGlkbF92ZWM8RWZmZWN0RGVzY3JpcHRvcj4gbUxhc3REZXNjcmlwdG9yczsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKLSAgICB2aXJ0dWFsIH5FZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUU19GQUNUT1JZX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjJjYmQ0NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vMi4wL0lTdHJlYW1PdXRDYWxsYmFjay5oPgotI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKLSNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OkF1ZGlvQ2hhbm5lbE1hc2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWMl8wOjpBdWRpb0Zvcm1hdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlYyXzA6OlRocmVhZEluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6QXVkaW9EcmFpbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtT3V0Q2FsbGJhY2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6TWVzc2FnZVF1ZXVlRmxhZ0JpdHM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6TW1hcEJ1ZmZlckluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6TW1hcFBvc2l0aW9uOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlBhcmFtZXRlclZhbHVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpUaW1lU3BlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwotdXNpbmcgUmVhZENvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbUluOjpSZWFkQ29tbWFuZDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1TdHJlYW1IYWxIaWRsOjpTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSkKLSAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiU3RyZWFtIiksCi0gICAgICAgICAgbVN0cmVhbShzdHJlYW0pLAotICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eShIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpLAotICAgICAgICAgIG1DYWNoZWRCdWZmZXJTaXplKDApewotCi0gICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgotICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpKSB7Ci0gICAgICAgIC8vIE9idGFpbiBhdWRpbyBwcm9wZXJ0aWVzIChzZWUgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKCkgYmVsb3cpLgotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgQXVkaW9DaGFubmVsTWFzayBtLCBBdWRpb0Zvcm1hdCBmKSB7Ci0gICAgICAgICAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQoc3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obSksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZikpOwotICAgICAgICAgICAgfSk7Ci0gICAgfQotfQotCi1TdHJlYW1IYWxIaWRsOjp+U3RyZWFtSGFsSGlkbCgpIHsKLSAgICBtU3RyZWFtID0gbnVsbHB0cjsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFNhbXBsZVJhdGUiLCBtU3RyZWFtLT5nZXRTYW1wbGVSYXRlKCksIHJhdGUpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigiZ2V0QnVmZmVyU2l6ZSIsIG1TdHJlYW0tPmdldEJ1ZmZlclNpemUoKSwgc2l6ZSk7Ci0gICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSA9ICpzaXplOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaykgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldENoYW5uZWxNYXNrIiwgbVN0cmVhbS0+Z2V0Q2hhbm5lbE1hc2soKSwgbWFzayk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Rm9ybWF0IiwgbVN0cmVhbS0+Z2V0Rm9ybWF0KCksIGZvcm1hdCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgWyZdKHVpbnQzMl90IHNyLCBBdWRpb0NoYW5uZWxNYXNrIG0sIEF1ZGlvRm9ybWF0IGYpIHsKLSAgICAgICAgICAgICAgICAqc2FtcGxlUmF0ZSA9IHNyOwotICAgICAgICAgICAgICAgICptYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pOwotICAgICAgICAgICAgICAgICpmb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZik7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qcm9wZXJ0aWVzIiwgcmV0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsIG1TdHJlYW0tPnNldFBhcmFtZXRlcnMoaGlkbFBhcmFtcykpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIHZhbHVlcy0+Y2xlYXIoKTsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UGFyYW1ldGVycygKLSAgICAgICAgICAgIGhpZGxLZXlzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiYWRkRWZmZWN0IiwgbVN0cmVhbS0+YWRkRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZW1vdmVFZmZlY3QiLCBtU3RyZWFtLT5yZW1vdmVFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YW5kYnkoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhbmRieSIsIG1TdHJlYW0tPnN0YW5kYnkoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmRlYnVnRHVtcChoaWRsSGFuZGxlKTsKLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoaWRsSGFuZGxlKTsKLSAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdGFydCgpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdGFydCIsIG1TdHJlYW0tPnN0YXJ0KCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzdG9wKCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0b3AiLCBtU3RyZWFtLT5zdG9wKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgewotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmNyZWF0ZU1tYXBCdWZmZXIoCi0gICAgICAgICAgICBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNbWFwQnVmZmVySW5mbyYgaGlkbEluZm8pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBuYXRpdmVfaGFuZGxlICpoYW5kbGUgPSBoaWRsSW5mby5zaGFyZWRNZW1vcnkuaGFuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGUtPm51bUZkcyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNoYXJlZF9tZW1vcnlfZmQgPSBoYW5kbGUtPmRhdGFbMF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgPSBoaWRsSW5mby5idWZmZXJTaXplRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTmVnYXRpdmUgYnVmZmVyIHNpemUgZnJhbWUgd2FzIGEgaGFjayBpbiBPIGFuZCBQIHRvCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSB0aGF0IHRoZSBidWZmZXIgaXMgc2hhcmVhYmxlIHRvIGFwcGxpY2F0aW9ucwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idWZmZXJfc2l6ZV9mcmFtZXMgKj0gLTE7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+ZmxhZ3MgPSBhdWRpb19tbWFwX2J1ZmZlcl9mbGFnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+ZmxhZ3MgfCBBVURJT19NTUFQX0FQUExJQ0FUSU9OX1NIQVJFQUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5idXJzdF9zaXplX2ZyYW1lcyA9IGhpZGxJbmZvLmJ1cnN0U2l6ZUZyYW1lczsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZm8tPnNoYXJlZF9tZW1vcnlfYWRkcmVzcyBpcyBub3QgbmVlZGVkIGluIEhJREwgY29udGV4dAotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9hZGRyZXNzID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImNyZWF0ZU1tYXBCdWZmZXIiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRNbWFwUG9zaXRpb24oCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBQb3NpdGlvbiYgaGlkbFBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcG9zaXRpb24tPnRpbWVfbmFub3NlY29uZHMgPSBoaWRsUG9zaXRpb24udGltZU5hbm9zZWNvbmRzOwotICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi0+cG9zaXRpb25fZnJhbWVzID0gaGlkbFBvc2l0aW9uLnBvc2l0aW9uRnJhbWVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNbWFwUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSkgewotICAgIG1IYWxUaHJlYWRQcmlvcml0eSA9IHByaW9yaXR5OwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAobUNhY2hlZEJ1ZmZlclNpemUgIT0gMCkgewotICAgICAgICAqc2l6ZSA9IG1DYWNoZWRCdWZmZXJTaXplOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIHJldHVybiBnZXRCdWZmZXJTaXplKHNpemUpOwotfQotCi1ib29sIFN0cmVhbUhhbEhpZGw6OnJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKSB7Ci0gICAgaWYgKG1IYWxUaHJlYWRQcmlvcml0eSA9PSBIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGludCBlcnIgPSByZXF1ZXN0UHJpb3JpdHkoCi0gICAgICAgICAgICB0aHJlYWRQaWQsIHRocmVhZElkLAotICAgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5LCBmYWxzZSAvKmlzRm9yQXBwKi8sIHRydWUgLyphc3luY2hyb25vdXMqLyk7Ci0gICAgQUxPR0VfSUYoZXJyLCAiZmFpbGVkIHRvIHNldCBwcmlvcml0eSAlZCBmb3IgcGlkICVkIHRpZCAlZDsgZXJyb3IgJWQiLAotICAgICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5LCB0aHJlYWRQaWQsIHRocmVhZElkLCBlcnIpOwotICAgIC8vIEF1ZGlvIHdpbGwgc3RpbGwgd29yaywgYnV0IGxhdGVuY3kgd2lsbCBiZSBoaWdoZXIgYW5kIHNvbWV0aW1lcyB1bmFjY2VwdGFibGUuCi0gICAgcmV0dXJuIGVyciA9PSAwOwotfQotCi1uYW1lc3BhY2UgewotCi0vKiBOb3RlcyBvbiBjYWxsYmFjayBvd25lcnNoaXAuCi0KLVRoaXMgaXMgaG93IChIdylCaW5kZXIgb3duZXJzaGlwIG1vZGVsIGxvb2tzIGxpa2UuIFRoZSBzZXJ2ZXIgaW1wbGVtZW50YXRpb24KLWlzIG93bmVkIGJ5IEJpbmRlciBmcmFtZXdvcmsgKHZpYSBzcDw+KS4gUHJveGllcyBhcmUgb3duZWQgYnkgY2xpZW50cy4KLVdoZW4gdGhlIGxhc3QgcHJveHkgZGlzYXBwZWFycywgQmluZGVyIGZyYW1ld29yayByZWxlYXNlcyB0aGUgc2VydmVyIGltcGwuCi0KLVRodXMsIGl0IGlzIG5vdCBuZWVkZWQgdG8ga2VlcCBhbnkgcmVmZXJlbmNlcyB0byBTdHJlYW1PdXRDYWxsYmFjayAodGhpcyBpcwotdGhlIHNlcnZlciBpbXBsKSAtLSBpdCB3aWxsIGxpdmUgYXMgbG9uZyBhcyBIQUwgc2VydmVyIGhvbGRzIGEgc3Ryb25nIHJlZiB0bwotSVN0cmVhbU91dENhbGxiYWNrIHByb3h5LiBXZSBjbGVhciB0aGF0IHJlZmVyZW5jZSBieSBjYWxsaW5nICdjbGVhckNhbGxiYWNrJwotZnJvbSB0aGUgZGVzdHJ1Y3RvciBvZiBTdHJlYW1PdXRIYWxIaWRsLgotCi1UaGUgY2FsbGJhY2sgb25seSBrZWVwcyBhIHdlYWsgcmVmZXJlbmNlIHRvIHRoZSBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgb3duZWQKLWJ5IEF1ZGlvRmxpbmdlci4KLQotKi8KLQotc3RydWN0IFN0cmVhbU91dENhbGxiYWNrIDogcHVibGljIElTdHJlYW1PdXRDYWxsYmFjayB7Ci0gICAgU3RyZWFtT3V0Q2FsbGJhY2soY29uc3Qgd3A8U3RyZWFtT3V0SGFsSGlkbD4mIHN0cmVhbSkgOiBtU3RyZWFtKHN0cmVhbSkge30KLQotICAgIC8vIElTdHJlYW1PdXRDYWxsYmFjayBpbXBsZW1lbnRhdGlvbgotICAgIFJldHVybjx2b2lkPiBvbldyaXRlUmVhZHkoKSAgb3ZlcnJpZGUgewotICAgICAgICBzcDxTdHJlYW1PdXRIYWxIaWRsPiBzdHJlYW0gPSBtU3RyZWFtLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7Ci0gICAgICAgICAgICBzdHJlYW0tPm9uV3JpdGVSZWFkeSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IG9uRHJhaW5SZWFkeSgpICBvdmVycmlkZSB7Ci0gICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKLSAgICAgICAgICAgIHN0cmVhbS0+b25EcmFpblJlYWR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gb25FcnJvcigpICBvdmVycmlkZSB7Ci0gICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKLSAgICAgICAgICAgIHN0cmVhbS0+b25FcnJvcigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gIHByaXZhdGU6Ci0gICAgd3A8U3RyZWFtT3V0SGFsSGlkbD4gbVN0cmVhbTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1TdHJlYW1PdXRIYWxIaWRsOjpTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1PdXQ+JiBzdHJlYW0pCi0gICAgICAgIDogU3RyZWFtSGFsSGlkbChzdHJlYW0uZ2V0KCkpLCBtU3RyZWFtKHN0cmVhbSksIG1Xcml0ZXJDbGllbnQoMCksIG1FZkdyb3VwKG51bGxwdHIpIHsKLX0KLQotU3RyZWFtT3V0SGFsSGlkbDo6flN0cmVhbU91dEhhbEhpZGwoKSB7Ci0gICAgaWYgKG1TdHJlYW0gIT0gMCkgewotICAgICAgICBpZiAobUNhbGxiYWNrLnVuc2FmZV9nZXQoKSkgewotICAgICAgICAgICAgcHJvY2Vzc1JldHVybigiY2xlYXJDYWxsYmFjayIsIG1TdHJlYW0tPmNsZWFyQ2FsbGJhY2soKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvY2Vzc1JldHVybigiY2xvc2UiLCBtU3RyZWFtLT5jbG9zZSgpKTsKLSAgICAgICAgbVN0cmVhbS5jbGVhcigpOwotICAgIH0KLSAgICBtQ2FsbGJhY2suY2xlYXIoKTsKLSAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwotICAgIGlmIChtRWZHcm91cCkgewotICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRGcmFtZVNpemUiLCBtU3RyZWFtLT5nZXRGcmFtZVNpemUoKSwgc2l6ZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVdyaXRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7Ci0gICAgICAgIHJldHVybiBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6R0VUX0xBVEVOQ1ksICJnZXRMYXRlbmN5IiwgbnVsbHB0ciwgMCwKLSAgICAgICAgICAgICAgICBbJl0oY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICpsYXRlbmN5ID0gd3JpdGVTdGF0dXMucmVwbHkubGF0ZW5jeU1zOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRMYXRlbmN5IiwgbVN0cmVhbS0+Z2V0TGF0ZW5jeSgpLCBsYXRlbmN5KTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2x1bWUiLCBtU3RyZWFtLT5zZXRWb2x1bWUobGVmdCwgcmlnaHQpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgICp3cml0dGVuID0gMDsKLQotICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7Ci0gICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgd3JpdGUgcmVxdWVzdC4KLSAgICAgICAgQUxPR1dfSUYobUNhbGxiYWNrLnVuc2FmZV9nZXQoKSwgIkZpcnN0IGNhbGwgdG8gYXN5bmMgd3JpdGUgd2l0aCAwIGJ5dGVzIik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKCFtRGF0YU1RKSB7Ci0gICAgICAgIC8vIEluIGNhc2UgaWYgcGxheWJhY2sgc3RhcnRzIGNsb3NlIHRvIHRoZSBlbmQgb2YgYSBjb21wcmVzc2VkIHRyYWNrLCB0aGUgYnl0ZXMKLSAgICAgICAgLy8gdGhhdCBuZWVkIHRvIGJlIHdyaXR0ZW4gaXMgbGVzcyB0aGFuIHRoZSBhY3R1YWwgYnVmZmVyIHNpemUuIE5lZWQgdG8gdXNlCi0gICAgICAgIC8vIGZ1bGwgYnVmZmVyIHNpemUgZm9yIHRoZSBNUSBzaW5jZSBvdGhlcndpc2UgYWZ0ZXIgc2Vla2luZyBiYWNrIHRvIHRoZSBtaWRkbGUKLSAgICAgICAgLy8gZGF0YSB3aWxsIGJlIHRydW5jYXRlZC4KLSAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemU7Ci0gICAgICAgIGlmICgoc3RhdHVzID0gZ2V0Q2FjaGVkQnVmZmVyU2l6ZSgmYnVmZmVyU2l6ZSkpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChieXRlcyA+IGJ1ZmZlclNpemUpIGJ1ZmZlclNpemUgPSBieXRlczsKLSAgICAgICAgaWYgKChzdGF0dXMgPSBwcmVwYXJlRm9yV3JpdGluZyhidWZmZXJTaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0dXMgPSBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpXUklURSwgIndyaXRlIiwgc3RhdGljX2Nhc3Q8Y29uc3QgdWludDhfdCo+KGJ1ZmZlciksIGJ5dGVzLAotICAgICAgICAgICAgWyZdIChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAqd3JpdHRlbiA9IHdyaXRlU3RhdHVzLnJlcGx5LndyaXR0ZW47Ci0gICAgICAgICAgICAgICAgLy8gRGlhZ25vc3RpY3Mgb2YgdGhlIGNhdXNlIG9mIGIvMzU4MTMxMTMuCi0gICAgICAgICAgICAgICAgQUxPR0VfSUYoKndyaXR0ZW4gPiBieXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICJoYWwgcmVwb3J0cyBtb3JlIGJ5dGVzIHdyaXR0ZW4gdGhhbiBhc2tlZCBmb3I6ICVsbGQgPiAlbGxkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpKndyaXR0ZW4sIChsb25nIGxvbmcpYnl0ZXMpOwotICAgICAgICAgICAgfSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICBXcml0ZUNvbW1hbmQgY21kLCBjb25zdCBjaGFyKiBjbWROYW1lLAotICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsIFN0cmVhbU91dEhhbEhpZGw6OldyaXRlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgaWYgKCFtQ29tbWFuZE1RLT53cml0ZSgmY21kKSkgewotICAgICAgICBBTE9HRSgiY29tbWFuZCBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIHJldHVybiAtRUFHQUlOOwotICAgIH0KLSAgICBpZiAoZGF0YSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHNpemVfdCBhdmFpbGFibGVUb1dyaXRlID0gbURhdGFNUS0+YXZhaWxhYmxlVG9Xcml0ZSgpOwotICAgICAgICBpZiAoZGF0YVNpemUgPiBhdmFpbGFibGVUb1dyaXRlKSB7Ci0gICAgICAgICAgICBBTE9HVygidHJ1bmNhdGluZyB3cml0ZSBkYXRhIGZyb20gJWxsZCB0byAlbGxkIGR1ZSB0byBpbnN1ZmZpY2llbnQgZGF0YSBxdWV1ZSBzcGFjZSIsCi0gICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpZGF0YVNpemUsIChsb25nIGxvbmcpYXZhaWxhYmxlVG9Xcml0ZSk7Ci0gICAgICAgICAgICBkYXRhU2l6ZSA9IGF2YWlsYWJsZVRvV3JpdGU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFtRGF0YU1RLT53cml0ZShkYXRhLCBkYXRhU2l6ZSkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJkYXRhIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpOwotCi0gICAgLy8gVE9ETzogUmVtb3ZlIG1hbnVhbCBldmVudCBmbGFnIGhhbmRsaW5nIG9uY2UgYmxvY2tpbmcgTVEgaXMgaW1wbGVtZW50ZWQuIGIvMzM4MTU0MjIKLSAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKLXJldHJ5OgotICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpLCAmZWZTdGF0ZSk7Ci0gICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSkgewotICAgICAgICBXcml0ZVN0YXR1cyB3cml0ZVN0YXR1czsKLSAgICAgICAgd3JpdGVTdGF0dXMucmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgICAgIGlmICghbVN0YXR1c01RLT5yZWFkKCZ3cml0ZVN0YXR1cykpIHsKLSAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHdyaXRlU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICByZXQgPSBPSzsKLSAgICAgICAgICAgIGNhbGxiYWNrKHdyaXRlU3RhdHVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldCA9IHByb2Nlc3NSZXR1cm4oY21kTmFtZSwgd3JpdGVTdGF0dXMucmV0dmFsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgewotICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KLSAgICAgICAgZ290byByZXRyeTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cHJlcGFyZUZvcldyaXRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvcldyaXRpbmcoCi0gICAgICAgICAgICAxLCBidWZmZXJTaXplLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7Ci0gICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgewotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvcldyaXRpbmciLCByZXQsIHJldHZhbCk7Ci0gICAgfQotICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAotICAgICAgICAgICAgIW1FZkdyb3VwKSB7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAotICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3Igd3JpdGluZyBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7Ci0KLSAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOwotICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7Ci0gICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7Ci0gICAgbVdyaXRlckNsaWVudCA9IGdldHRpZCgpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFJlbmRlclBvc2l0aW9uKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50MzJfdCBkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKmRzcEZyYW1lcyA9IGQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFJlbmRlclBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0TmV4dFdyaXRlVGltZXN0YW1wKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBpbnQ2NF90IHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqdGltZXN0YW1wID0gdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UmVuZGVyUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oCi0gICAgICAgICAgICAic2V0Q2FsbGJhY2siLCBtU3RyZWFtLT5zZXRDYWxsYmFjayhuZXcgU3RyZWFtT3V0Q2FsbGJhY2sodGhpcykpKTsKLSAgICBpZiAoc3RhdHVzID09IE9LKSB7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoCi0gICAgICAgICAgICBbJl0oYm9vbCBwLCBib29sIHIpIHsKLSAgICAgICAgICAgICAgICAqc3VwcG9ydHNQYXVzZSA9IHA7Ci0gICAgICAgICAgICAgICAgKnN1cHBvcnRzUmVzdW1lID0gcjsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c1BhdXNlQW5kUmVzdW1lIiwgcmV0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cGF1c2UoKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cGF1c2UoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnJlc3VtZSgpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5yZXN1bWUoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0RyYWluIiwgbVN0cmVhbS0+c3VwcG9ydHNEcmFpbigpLCBzdXBwb3J0c0RyYWluKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6ZHJhaW4oYm9vbCBlYXJseU5vdGlmeSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKAotICAgICAgICAgICAgImRyYWluIiwgbVN0cmVhbS0+ZHJhaW4oZWFybHlOb3RpZnkgPyBBdWRpb0RyYWluOjpFQVJMWV9OT1RJRlkgOiBBdWRpb0RyYWluOjpBTEwpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Zmx1c2goKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+Zmx1c2goKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1Xcml0ZXJDbGllbnQgPT0gZ2V0dGlkKCkgJiYgbUNvbW1hbmRNUSkgewotICAgICAgICByZXR1cm4gY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OkdFVF9QUkVTRU5UQVRJT05fUE9TSVRJT04sICJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIG51bGxwdHIsIDAsCi0gICAgICAgICAgICAgICAgWyZdKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24uZnJhbWVzOwotICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X3NlYyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLnRpbWVTdGFtcC50dlNlYzsKLSAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9uc2VjID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24udGltZVN0YW1wLnR2TlNlYzsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICBSZXN1bHQgcmV0dmFsOwotICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24oCi0gICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCBjb25zdCBUaW1lU3BlYyYgaGlkbFRpbWVTdGFtcCkgewotICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9zZWMgPSBoaWRsVGltZVN0YW1wLnR2U2VjOwotICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9uc2VjID0gaGlkbFRpbWVTdGFtcC50dk5TZWM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFByZXNlbnRhdGlvblBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6dXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIC8qIHNvdXJjZU1ldGFkYXRhICovKSB7Ci0gICAgLy8gQXVkaW8gSEFMIFYyLjAgZG9lcyBub3Qgc3VwcG9ydCBwcm9wYWdhdGluZyBzb3VyY2UgbWV0YWRhdGEKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXZvaWQgU3RyZWFtT3V0SGFsSGlkbDo6b25Xcml0ZVJlYWR5KCkgewotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKLSAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbldyaXRlUmVhZHkiKTsKLSAgICBjYWxsYmFjay0+b25Xcml0ZVJlYWR5KCk7Ci19Ci0KLXZvaWQgU3RyZWFtT3V0SGFsSGlkbDo6b25EcmFpblJlYWR5KCkgewotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKLSAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbkRyYWluUmVhZHkiKTsKLSAgICBjYWxsYmFjay0+b25EcmFpblJlYWR5KCk7Ci19Ci0KLXZvaWQgU3RyZWFtT3V0SGFsSGlkbDo6b25FcnJvcigpIHsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25FcnJvciIpOwotICAgIGNhbGxiYWNrLT5vbkVycm9yKCk7Ci19Ci0KLQotU3RyZWFtSW5IYWxIaWRsOjpTdHJlYW1JbkhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbUluPiYgc3RyZWFtKQotICAgICAgICA6IFN0cmVhbUhhbEhpZGwoc3RyZWFtLmdldCgpKSwgbVN0cmVhbShzdHJlYW0pLCBtUmVhZGVyQ2xpZW50KDApLCBtRWZHcm91cChudWxscHRyKSB7Ci19Ci0KLVN0cmVhbUluSGFsSGlkbDo6flN0cmVhbUluSGFsSGlkbCgpIHsKLSAgICBpZiAobVN0cmVhbSAhPSAwKSB7Ci0gICAgICAgIHByb2Nlc3NSZXR1cm4oImNsb3NlIiwgbVN0cmVhbS0+Y2xvc2UoKSk7Ci0gICAgICAgIG1TdHJlYW0uY2xlYXIoKTsKLSAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICB9Ci0gICAgaWYgKG1FZkdyb3VwKSB7Ci0gICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0RnJhbWVTaXplIiwgbVN0cmVhbS0+Z2V0RnJhbWVTaXplKCksIHNpemUpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnNldEdhaW4oZmxvYXQgZ2FpbikgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRHYWluIiwgbVN0cmVhbS0+c2V0R2FpbihnYWluKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgKnJlYWQgPSAwOwotCi0gICAgaWYgKGJ5dGVzID09IDAgJiYgIW1EYXRhTVEpIHsKLSAgICAgICAgLy8gQ2FuJ3QgZGV0ZXJtaW5lIHRoZSBzaXplIGZvciB0aGUgTVEgYnVmZmVyLiBXYWl0IGZvciBhIG5vbi1lbXB0eSByZWFkIHJlcXVlc3QuCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKCFtRGF0YU1RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yUmVhZGluZyhieXRlcykpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgUmVhZFBhcmFtZXRlcnMgcGFyYW1zOwotICAgIHBhcmFtcy5jb21tYW5kID0gUmVhZENvbW1hbmQ6OlJFQUQ7Ci0gICAgcGFyYW1zLnBhcmFtcy5yZWFkID0gYnl0ZXM7Ci0gICAgc3RhdHVzID0gY2FsbFJlYWRlclRocmVhZChwYXJhbXMsICJyZWFkIiwKLSAgICAgICAgICAgIFsmXShjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGF2YWlsVG9SZWFkID0gbURhdGFNUS0+YXZhaWxhYmxlVG9SZWFkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFtRGF0YU1RLT5yZWFkKHN0YXRpY19jYXN0PHVpbnQ4X3QqPihidWZmZXIpLCBzdGQ6Om1pbihieXRlcywgYXZhaWxUb1JlYWQpKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZGF0YSBtZXNzYWdlIHF1ZXVlIHJlYWQgZmFpbGVkIGZvciBcInJlYWRcIiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HV19JRihhdmFpbFRvUmVhZCAhPSByZWFkU3RhdHVzLnJlcGx5LnJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAiSEFMIHJlYWQgcmVwb3J0IGluY29uc2lzdGVudDogbXEgPSAlZCwgc3RhdHVzID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpYXZhaWxUb1JlYWQsIChpbnQzMl90KXJlYWRTdGF0dXMucmVwbHkucmVhZCk7Ci0gICAgICAgICAgICAgICAgKnJlYWQgPSByZWFkU3RhdHVzLnJlcGx5LnJlYWQ7Ci0gICAgICAgICAgICB9KTsKLSAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKnJlYWQpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Y2FsbFJlYWRlclRocmVhZCgKLSAgICAgICAgY29uc3QgUmVhZFBhcmFtZXRlcnMmIHBhcmFtcywgY29uc3QgY2hhciogY21kTmFtZSwKLSAgICAgICAgU3RyZWFtSW5IYWxIaWRsOjpSZWFkZXJDYWxsYmFjayBjYWxsYmFjaykgewotICAgIGlmICghbUNvbW1hbmRNUS0+d3JpdGUoJnBhcmFtcykpIHsKLSAgICAgICAgQUxPR1coImNvbW1hbmQgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIC1FQUdBSU47Ci0gICAgfQotICAgIG1FZkdyb3VwLT53YWtlKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpKTsKLQotICAgIC8vIFRPRE86IFJlbW92ZSBtYW51YWwgZXZlbnQgZmxhZyBoYW5kbGluZyBvbmNlIGJsb2NraW5nIE1RIGlzIGltcGxlbWVudGVkLiBiLzMzODE1NDIyCi0gICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7Ci1yZXRyeToKLSAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSksICZlZlN0YXRlKTsKLSAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSkgewotICAgICAgICBSZWFkU3RhdHVzIHJlYWRTdGF0dXM7Ci0gICAgICAgIHJlYWRTdGF0dXMucmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgICAgIGlmICghbVN0YXR1c01RLT5yZWFkKCZyZWFkU3RhdHVzKSkgewotICAgICAgICAgICAgQUxPR0UoInN0YXR1cyBtZXNzYWdlIHJlYWQgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKLSAgICAgICAgfQotICAgICAgICAgaWYgKHJlYWRTdGF0dXMucmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgIHJldCA9IE9LOwotICAgICAgICAgICAgY2FsbGJhY2socmVhZFN0YXR1cyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBwcm9jZXNzUmV0dXJuKGNtZE5hbWUsIHJlYWRTdGF0dXMucmV0dmFsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgewotICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KLSAgICAgICAgZ290byByZXRyeTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpwcmVwYXJlRm9yUmVhZGluZyhzaXplX3QgYnVmZmVyU2l6ZSkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IHRlbXBDb21tYW5kTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gdGVtcERhdGFNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIHBpZF90IGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5wcmVwYXJlRm9yUmVhZGluZygKLSAgICAgICAgICAgIDEsIGJ1ZmZlclNpemUsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1hbmRNUTo6RGVzY3JpcHRvciYgY29tbWFuZE1RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTVE6OkRlc2NyaXB0b3ImIGRhdGFNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdHVzTVE6OkRlc2NyaXB0b3ImIHN0YXR1c01RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWRJbmZvJiBoYWxUaHJlYWRJbmZvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcENvbW1hbmRNUS5yZXNldChuZXcgQ29tbWFuZE1RKGNvbW1hbmRNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wRGF0YU1RLnJlc2V0KG5ldyBEYXRhTVEoZGF0YU1RKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBEYXRhTVEtPmlzVmFsaWQoKSAmJiB0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRQaWQgPSBoYWxUaHJlYWRJbmZvLnBpZDsKLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkVGlkID0gaGFsVGhyZWFkSW5mby50aWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwcmVwYXJlRm9yUmVhZGluZyIsIHJldCwgcmV0dmFsKTsKLSAgICB9Ci0gICAgaWYgKCF0ZW1wQ29tbWFuZE1RIHx8ICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICF0ZW1wRGF0YU1RIHx8ICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhbUVmR3JvdXApIHsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBDb21tYW5kTVEsICJGYWlsZWQgdG8gb2J0YWluIGNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wQ29tbWFuZE1RICYmICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIkNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wRGF0YU1RLCAiRmFpbGVkIHRvIG9idGFpbiBkYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcERhdGFNUSAmJiAhdGVtcERhdGFNUS0+aXNWYWxpZCgpLCAiRGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciByZWFkaW5nIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkKTsKLQotICAgIG1Db21tYW5kTVEgPSBzdGQ6Om1vdmUodGVtcENvbW1hbmRNUSk7Ci0gICAgbURhdGFNUSA9IHN0ZDo6bW92ZSh0ZW1wRGF0YU1RKTsKLSAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKLSAgICBtUmVhZGVyQ2xpZW50ID0gZ2V0dGlkKCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRJbnB1dEZyYW1lc0xvc3QiLCBtU3RyZWFtLT5nZXRJbnB1dEZyYW1lc0xvc3QoKSwgZnJhbWVzTG9zdCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUmVhZGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKLSAgICAgICAgUmVhZFBhcmFtZXRlcnMgcGFyYW1zOwotICAgICAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpHRVRfQ0FQVFVSRV9QT1NJVElPTjsKLSAgICAgICAgcmV0dXJuIGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwKLSAgICAgICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gcmVhZFN0YXR1cy5yZXBseS5jYXB0dXJlUG9zaXRpb24uZnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAqdGltZSA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLnRpbWU7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgUmVzdWx0IHJldHZhbDsKLSAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldENhcHR1cmVQb3NpdGlvbigKLSAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGhpZGxGcmFtZXMsIHVpbnQ2NF90IGhpZGxUaW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IGhpZGxGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqdGltZSA9IGhpZGxUaW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDYXB0dXJlUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKAotICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyBfX3VudXNlZCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjp1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiAvKiBzaW5rTWV0YWRhdGEgKi8pIHsKLSAgICAvLyBBdWRpbyBIQUwgVjIuMCBkb2VzIG5vdCBzdXBwb3J0IHByb3BhZ2F0aW5nIHNpbmsgbWV0YWRhdGEKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmFkOGFlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzIuMC9JU3RyZWFtLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVN0cmVhbUluLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSVN0cmVhbU91dC5oPgotI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KLSNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1JbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJU3RyZWFtT3V0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgUmVhZFBhcmFtZXRlcnMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbUluOjpSZWFkUGFyYW1ldGVyczsKLXVzaW5nIFJlYWRTdGF0dXMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjJfMDo6SVN0cmVhbUluOjpSZWFkU3RhdHVzOwotdXNpbmcgV3JpdGVDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1PdXQ6OldyaXRlQ29tbWFuZDsKLXVzaW5nIFdyaXRlU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlYyXzA6OklTdHJlYW1PdXQ6OldyaXRlU3RhdHVzOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZUhhbEhpZGw7Ci0KLWNsYXNzIFN0cmVhbUhhbEhpZGwgOiBwdWJsaWMgdmlydHVhbCBTdHJlYW1IYWxJbnRlcmZhY2UsIHB1YmxpYyBDb252ZXJzaW9uSGVscGVySGlkbAotewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7Ci0KLSAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0KLSAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKLQotICAgIC8vIFNldCB0aGUgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBIQUwKLSAgICAvLyAobXVzdCBtYXRjaCB0aGUgcHJpb3JpdHkgb2YgdGhlIGF1ZGlvZmxpbmdlcidzIHRocmVhZCB0aGF0IGNhbGxzICdyZWFkJyAvICd3cml0ZScpCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpOwotCi0gIHByb3RlY3RlZDoKLSAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBleHBsaWNpdCBTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSk7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgotICAgIHZpcnR1YWwgflN0cmVhbUhhbEhpZGwoKTsKLQotICAgIHN0YXR1c190IGdldENhY2hlZEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIGJvb2wgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpOwotCi0gICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgotICAgIFN0cmVhbVBvd2VyTG9nIG1TdHJlYW1Qb3dlckxvZzsKLQotICBwcml2YXRlOgotICAgIGNvbnN0IGludCBIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQgPSAtMTsKLSAgICBJU3RyZWFtICptU3RyZWFtOwotICAgIGludCBtSGFsVGhyZWFkUHJpb3JpdHk7Ci0gICAgc2l6ZV90IG1DYWNoZWRCdWZmZXJTaXplOwotfTsKLQotY2xhc3MgU3RyZWFtT3V0SGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1PdXRIYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxIaWRsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKLQotICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7Ci0KLSAgICAvLyBXcml0ZSBhdWRpbyBidWZmZXIgdG8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbik7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgd3JpdHRlbiBieSB0aGUgYXVkaW8gZHNwIHRvIERBQyBzaW5jZQotICAgIC8vIHRoZSBvdXRwdXQgaGFzIGV4aXRlZCBzdGFuZGJ5LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcyk7Ci0KLSAgICAvLyBHZXQgdGhlIGxvY2FsIHRpbWUgYXQgd2hpY2ggdGhlIG5leHQgd3JpdGUgdG8gdGhlIGF1ZGlvIGRyaXZlciB3aWxsIGJlIHByZXNlbnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApOwotCi0gICAgLy8gU2V0IHRoZSBjYWxsYmFjayBmb3Igbm90aWZ5aW5nIGNvbXBsZXRpb24gb2Ygbm9uLWJsb2NraW5nIHdyaXRlIGFuZCBkcmFpbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgcGF1c2UgYW5kIHJlc3VtZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcGF1c2UoKTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gcmVzdW1lIHBsYXliYWNrIGZvbGxvd2luZyBhIHBhdXNlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzdW1lKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgZHJhaW4gb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbik7Ci0KLSAgICAvLyBSZXF1ZXN0cyBub3RpZmljYXRpb24gd2hlbiBkYXRhIGJ1ZmZlcmVkIGJ5IHRoZSBkcml2ZXIvaGFyZHdhcmUgaGFzIGJlZW4gcGxheWVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHJhaW4oYm9vbCBlYXJseU5vdGlmeSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIGZsdXNoIHRoZSBxdWV1ZWQgZGF0YS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZsdXNoKCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcHJlc2VudGVkIHRvIGFuIGV4dGVybmFsIG9ic2VydmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gICAgLy8gTWV0aG9kcyB1c2VkIGJ5IFN0cmVhbU91dENhbGxiYWNrIChISURMKS4KLSAgICB2b2lkIG9uV3JpdGVSZWFkeSgpOwotICAgIHZvaWQgb25EcmFpblJlYWR5KCk7Ci0gICAgdm9pZCBvbkVycm9yKCk7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZUNvbW1hbmQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBDb21tYW5kTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8dWludDhfdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IERhdGFNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxXcml0ZVN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROwotCi0gICAgd3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IG1DYWxsYmFjazsKLSAgICBzcDxJU3RyZWFtT3V0PiBtU3RyZWFtOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKLSAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVdyaXRlckNsaWVudDsKLSAgICBFdmVudEZsYWcqIG1FZkdyb3VwOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSk7Ci0KLSAgICB2aXJ0dWFsIH5TdHJlYW1PdXRIYWxIaWRsKCk7Ci0KLSAgICB1c2luZyBXcml0ZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpPjsKLSAgICBzdGF0dXNfdCBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwgV3JpdGVyQ2FsbGJhY2sgY2FsbGJhY2spOwotICAgIHN0YXR1c190IHByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKTsKLX07Ci0KLWNsYXNzIFN0cmVhbUluSGFsSGlkbCA6IHB1YmxpYyBTdHJlYW1JbkhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFNldCB0aGUgaW5wdXQgZ2FpbiBmb3IgdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEdhaW4oZmxvYXQgZ2Fpbik7Ci0KLSAgICAvLyBSZWFkIGF1ZGlvIGJ1ZmZlciBpbiBmcm9tIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBpbnB1dCBmcmFtZXMgbG9zdCBpbiB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KTsKLQotICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyByZWNlaXZlZCBhbmQKLSAgICAvLyB0aGUgY2xvY2sgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmcmFtZSBjb3VudC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpOwotCi0gICAgLy8gR2V0IGFjdGl2ZSBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QWN0aXZlTWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxIaWRsOwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRQYXJhbWV0ZXJzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROwotCi0gICAgc3A8SVN0cmVhbUluPiBtU3RyZWFtOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKLSAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVJlYWRlckNsaWVudDsKLSAgICBFdmVudEZsYWcqIG1FZkdyb3VwOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIFN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pOwotCi0gICAgdmlydHVhbCB+U3RyZWFtSW5IYWxIaWRsKCk7Ci0KLSAgICB1c2luZyBSZWFkZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKT47Ci0gICAgc3RhdHVzX3QgY2FsbFJlYWRlclRocmVhZCgKLSAgICAgICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsIFJlYWRlckNhbGxiYWNrIGNhbGxiYWNrKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUmVhZGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbExvY2FsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTgxMDdlNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC8yLjAvU3RyZWFtSGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbExvY2FsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1TdHJlYW1IYWxMb2NhbDo6U3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBtRGV2aWNlKGRldmljZSksCi0gICAgICAgICAgbVN0cmVhbShzdHJlYW0pIHsKLSAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgotICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCi0gICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKLSAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQobVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pLAotICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKSwKLSAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pKTsKLSAgICB9Ci19Ci0KLVN0cmVhbUhhbExvY2FsOjp+U3RyZWFtSGFsTG9jYWwoKSB7Ci0gICAgbVN0cmVhbSA9IDA7Ci0gICAgbURldmljZS5jbGVhcigpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgewotICAgICpyYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBtU3RyZWFtLT5nZXRfYnVmZmVyX3NpemUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKLSAgICAqbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgewotICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7Ci0gICAgKnNhbXBsZVJhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7Ci0gICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7Ci0gICAgKmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF9wYXJhbWV0ZXJzKG1TdHJlYW0sIGt2UGFpcnMuc3RyaW5nKCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICBjaGFyICpoYWxWYWx1ZXMgPSBtU3RyZWFtLT5nZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrZXlzLnN0cmluZygpKTsKLSAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKLSAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOwotICAgICAgICBmcmVlKGhhbFZhbHVlcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmFsdWVzLT5jbGVhcigpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjphZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgewotICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgewotICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzdGFuZGJ5KCkgewotICAgIHJldHVybiBtU3RyZWFtLT5zdGFuZGJ5KG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6ZHVtcChpbnQgZmQpIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5kdW1wKG1TdHJlYW0sIGZkKTsKLSAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCkgewotICAgIC8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYXMgbG9jYWwgaGFsIGlzIGV4ZWN1dGVkIGJ5IGF1ZGlvZmxpbmdlciBkaXJlY3RseQotICAgIC8vIG9uIHRoZSBzYW1lIHRocmVhZC4KLSAgICByZXR1cm4gT0s7Ci19Ci0KLVN0cmVhbU91dEhhbExvY2FsOjpTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBTdHJlYW1IYWxMb2NhbCgmc3RyZWFtLT5jb21tb24sIGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7Ci19Ci0KLVN0cmVhbU91dEhhbExvY2FsOjp+U3RyZWFtT3V0SGFsTG9jYWwoKSB7Ci0gICAgbUNhbGxiYWNrLmNsZWFyKCk7Ci0gICAgbURldmljZS0+Y2xvc2VPdXRwdXRTdHJlYW0obVN0cmVhbSk7Ci0gICAgbVN0cmVhbSA9IDA7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgewotICAgICpsYXRlbmN5ID0gbVN0cmVhbS0+Z2V0X2xhdGVuY3kobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7Ci0gICAgaWYgKG1TdHJlYW0tPnNldF92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfdm9sdW1lKG1TdHJlYW0sIGxlZnQsIHJpZ2h0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKLSAgICBzc2l6ZV90IHdyaXRlUmVzdWx0ID0gbVN0cmVhbS0+d3JpdGUobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7Ci0gICAgaWYgKHdyaXRlUmVzdWx0ID4gMCkgewotICAgICAgICAqd3JpdHRlbiA9IHdyaXRlUmVzdWx0OwotICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKndyaXR0ZW4gPSAwOwotICAgICAgICByZXR1cm4gd3JpdGVSZXN1bHQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0UmVuZGVyUG9zaXRpb24odWludDMyX3QgKmRzcEZyYW1lcykgewotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfcmVuZGVyX3Bvc2l0aW9uKG1TdHJlYW0sIGRzcEZyYW1lcyk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9uZXh0X3dyaXRlX3RpbWVzdGFtcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9uZXh0X3dyaXRlX3RpbWVzdGFtcChtU3RyZWFtLCB0aW1lc3RhbXApOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnNldF9jYWxsYmFjayA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gbVN0cmVhbS0+c2V0X2NhbGxiYWNrKG1TdHJlYW0sIFN0cmVhbU91dEhhbExvY2FsOjphc3luY0NhbGxiYWNrLCB0aGlzKTsKLSAgICBpZiAocmVzdWx0ID09IE9LKSB7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBzdGF0aWMKLWludCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjayhzdHJlYW1fY2FsbGJhY2tfZXZlbnRfdCBldmVudCwgdm9pZCosIHZvaWQgKmNvb2tpZSkgewotICAgIC8vIFdlIGFjdCBhcyBpZiB3ZSBnYXZlIGEgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHRvIEhBTC4gVGhpcyB3YXkgd2Ugc2hvdWxkIGhhbmRsZQotICAgIC8vIGNvcnJlY3RseSB0aGUgY2FzZSB3aGVuIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkIHdoaWxlIFN0cmVhbU91dEhhbExvY2FsJ3MgZGVzdHJ1Y3RvciBpcwotICAgIC8vIGFscmVhZHkgcnVubmluZywgYmVjYXVzZSB0aGUgZGVzdHJ1Y3RvciBpcyBpbnZva2VkIGFmdGVyIHRoZSByZWZjb3VudCBoYXMgYmVlbiBhdG9taWNhbGx5Ci0gICAgLy8gZGVjcmVtZW50ZWQuCi0gICAgd3A8U3RyZWFtT3V0SGFsTG9jYWw+IHdlYWtTZWxmKHN0YXRpY19jYXN0PFN0cmVhbU91dEhhbExvY2FsKj4oY29va2llKSk7Ci0gICAgc3A8U3RyZWFtT3V0SGFsTG9jYWw+IHNlbGYgPSB3ZWFrU2VsZi5wcm9tb3RlKCk7Ci0gICAgaWYgKHNlbGYgPT0gMCkgcmV0dXJuIDA7Ci0gICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gc2VsZi0+bUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuIDA7Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2soKSBldmVudCAlZCIsIGV2ZW50KTsKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9XUklURV9SRUFEWToKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbldyaXRlUmVhZHkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfRFJBSU5fUkVBRFk6Ci0gICAgICAgICAgICBjYWxsYmFjay0+b25EcmFpblJlYWR5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0VSUk9SOgotICAgICAgICAgICAgY2FsbGJhY2stPm9uRXJyb3IoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coImFzeW5jQ2FsbGJhY2soKSB1bmtub3duIGV2ZW50ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHJldHVybiAwOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSkgewotICAgICpzdXBwb3J0c1BhdXNlID0gbVN0cmVhbS0+cGF1c2UgIT0gTlVMTDsKLSAgICAqc3VwcG9ydHNSZXN1bWUgPSBtU3RyZWFtLT5yZXN1bWUgIT0gTlVMTDsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpwYXVzZSgpIHsKLSAgICBpZiAobVN0cmVhbS0+cGF1c2UgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5wYXVzZShtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnJlc3VtZSgpIHsKLSAgICBpZiAobVN0cmVhbS0+cmVzdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+cmVzdW1lKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKSB7Ci0gICAgKnN1cHBvcnRzRHJhaW4gPSBtU3RyZWFtLT5kcmFpbiAhPSBOVUxMOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKLSAgICBpZiAobVN0cmVhbS0+ZHJhaW4gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5kcmFpbihtU3RyZWFtLCBlYXJseU5vdGlmeSA/IEFVRElPX0RSQUlOX0VBUkxZX05PVElGWSA6IEFVRElPX0RSQUlOX0FMTCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpmbHVzaCgpIHsKLSAgICBpZiAobVN0cmVhbS0+Zmx1c2ggPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5mbHVzaChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uKG1TdHJlYW0sIGZyYW1lcywgdGltZXN0YW1wKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGNvbnN0IFNvdXJjZU1ldGFkYXRhJiBzb3VyY2VNZXRhZGF0YSkgewotICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBjb25zdCBzb3VyY2VfbWV0YWRhdGFfdCBtZXRhZGF0YSB7Ci0gICAgICAgIC50cmFja19jb3VudCA9IHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5zaXplKCksCi0gICAgICAgIC8vIGNvbnN0IGNhc3QgaXMgZmluZSBhcyBpdCBpcyBpbiBhIGNvbnN0IHN0cnVjdHVyZQotICAgICAgICAudHJhY2tzID0gY29uc3RfY2FzdDxwbGF5YmFja190cmFja19tZXRhZGF0YSo+KHNvdXJjZU1ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAotICAgIH07Ci0gICAgbVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YShtU3RyZWFtLCAmbWV0YWRhdGEpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0YXJ0KCkgewotICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3RvcCgpIHsKLSAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgewotICAgIGlmIChtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIobVN0cmVhbSwgbWluU2l6ZUZyYW1lcywgaW5mbyk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOwotfQotCi1TdHJlYW1JbkhhbExvY2FsOjpTdHJlYW1JbkhhbExvY2FsKGF1ZGlvX3N0cmVhbV9pbl90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpCi0gICAgICAgIDogU3RyZWFtSGFsTG9jYWwoJnN0cmVhbS0+Y29tbW9uLCBkZXZpY2UpLCBtU3RyZWFtKHN0cmVhbSkgewotfQotCi1TdHJlYW1JbkhhbExvY2FsOjp+U3RyZWFtSW5IYWxMb2NhbCgpIHsKLSAgICBtRGV2aWNlLT5jbG9zZUlucHV0U3RyZWFtKG1TdHJlYW0pOwotICAgIG1TdHJlYW0gPSAwOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBhdWRpb19zdHJlYW1faW5fZnJhbWVfc2l6ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnNldEdhaW4oZmxvYXQgZ2FpbikgewotICAgIHJldHVybiBtU3RyZWFtLT5zZXRfZ2FpbihtU3RyZWFtLCBnYWluKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKSB7Ci0gICAgc3NpemVfdCByZWFkUmVzdWx0ID0gbVN0cmVhbS0+cmVhZChtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKLSAgICBpZiAocmVhZFJlc3VsdCA+IDApIHsKLSAgICAgICAgKnJlYWQgPSByZWFkUmVzdWx0OwotICAgICAgICBtU3RyZWFtUG93ZXJMb2cubG9nKCBidWZmZXIsICpyZWFkKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICpyZWFkID0gMDsKLSAgICAgICAgcmV0dXJuIHJlYWRSZXN1bHQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKLSAgICAqZnJhbWVzTG9zdCA9IG1TdHJlYW0tPmdldF9pbnB1dF9mcmFtZXNfbG9zdChtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfY2FwdHVyZV9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWUpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjp1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIHsKLSAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIGNvbnN0IHNpbmtfbWV0YWRhdGFfdCBtZXRhZGF0YSB7Ci0gICAgICAgIC50cmFja19jb3VudCA9IHNpbmtNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAotICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKLSAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cmVjb3JkX3RyYWNrX21ldGFkYXRhKj4oc2lua01ldGFkYXRhLnRyYWNrcy5kYXRhKCkpLAotICAgIH07Ci0gICAgbVN0cmVhbS0+dXBkYXRlX3NpbmtfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnN0YXJ0KCkgewotICAgIGlmIChtU3RyZWFtLT5zdGFydCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0YXJ0KG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdG9wKCkgewotICAgIGlmIChtU3RyZWFtLT5zdG9wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RvcChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24obVN0cmVhbSwgcG9zaXRpb24pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKLSAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1IYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbExvY2FsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYThkMGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbUhhbExvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMX0gKLQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRGV2aWNlSGFsTG9jYWw7Ci0KLWNsYXNzIFN0cmVhbUhhbExvY2FsIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKTsKLQotICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgbWFzay4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZWZmZWN0IG9uIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLQotICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgPSAwOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pID0gMDsKLQotICAgIC8vIFNldCB0aGUgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBIQUwKLSAgICAvLyAobXVzdCBtYXRjaCB0aGUgcHJpb3JpdHkgb2YgdGhlIGF1ZGlvZmxpbmdlcidzIHRocmVhZCB0aGF0IGNhbGxzICdyZWFkJyAvICd3cml0ZScpCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpOwotCi0gIHByb3RlY3RlZDoKLSAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1IYWxMb2NhbChhdWRpb19zdHJlYW1fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCB+U3RyZWFtSGFsTG9jYWwoKTsKLQotICAgIHNwPERldmljZUhhbExvY2FsPiBtRGV2aWNlOwotCi0gICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgotICAgIFN0cmVhbVBvd2VyTG9nIG1TdHJlYW1Qb3dlckxvZzsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV90ICptU3RyZWFtOwotfTsKLQotY2xhc3MgU3RyZWFtT3V0SGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtT3V0SGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsTG9jYWwgewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOwotCi0gICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKLQotICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKTsKLQotICAgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIGJ5IHRoZSBhdWRpbyBkc3AgdG8gREFDIHNpbmNlCi0gICAgLy8gdGhlIG91dHB1dCBoYXMgZXhpdGVkIHN0YW5kYnkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKTsKLQotICAgIC8vIEdldCB0aGUgbG9jYWwgdGltZSBhdCB3aGljaCB0aGUgbmV4dCB3cml0ZSB0byB0aGUgYXVkaW8gZHJpdmVyIHdpbGwgYmUgcHJlc2VudGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBTZXQgdGhlIGNhbGxiYWNrIGZvciBub3RpZnlpbmcgY29tcGxldGlvbiBvZiBub24tYmxvY2tpbmcgd3JpdGUgYW5kIGRyYWluLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBwYXVzZSBhbmQgcmVzdW1lIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBkcmFpbiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKTsKLQotICAgIC8vIFJlcXVlc3RzIG5vdGlmaWNhdGlvbiB3aGVuIGRhdGEgYnVmZmVyZWQgYnkgdGhlIGRyaXZlci9oYXJkd2FyZSBoYXMgYmVlbiBwbGF5ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkcmFpbihib29sIGVhcmx5Tm90aWZ5KTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gZmx1c2ggdGhlIHF1ZXVlZCBkYXRhLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKLQotICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBwcmVzZW50ZWQgdG8gYW4gZXh0ZXJuYWwgb2JzZXJ2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9fc3RyZWFtX291dF90ICptU3RyZWFtOwotICAgIHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBtQ2FsbGJhY2s7Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtT3V0SGFsTG9jYWwoYXVkaW9fc3RyZWFtX291dF90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOwotCi0gICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsTG9jYWwoKTsKLQotICAgIHN0YXRpYyBpbnQgYXN5bmNDYWxsYmFjayhzdHJlYW1fY2FsbGJhY2tfZXZlbnRfdCBldmVudCwgdm9pZCAqcGFyYW0sIHZvaWQgKmNvb2tpZSk7Ci19OwotCi1jbGFzcyBTdHJlYW1JbkhhbExvY2FsIDogcHVibGljIFN0cmVhbUluSGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsTG9jYWwgewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFNldCB0aGUgaW5wdXQgZ2FpbiBmb3IgdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEdhaW4oZmxvYXQgZ2Fpbik7Ci0KLSAgICAvLyBSZWFkIGF1ZGlvIGJ1ZmZlciBpbiBmcm9tIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBpbnB1dCBmcmFtZXMgbG9zdCBpbiB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KTsKLQotICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyByZWNlaXZlZCBhbmQKLSAgICAvLyB0aGUgY2xvY2sgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmcmFtZSBjb3VudC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKLQotICAgIC8vIEdldCBhY3RpdmUgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc2luayBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19zdHJlYW1faW5fdCAqbVN0cmVhbTsKLQotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1JbkhhbExvY2FsKGF1ZGlvX3N0cmVhbV9pbl90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOwotCi0gICAgdmlydHVhbCB+U3RyZWFtSW5IYWxMb2NhbCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzIuMC9TdHJlYW1Qb3dlckxvZy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbVBvd2VyTG9nLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3OGIxYWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvMi4wL1N0cmVhbVBvd2VyTG9nLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fUE9XRVJfTE9HX0gKLQotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+Ci0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvUG93ZXJMb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN0cmVhbVBvd2VyTG9nIHsKLXB1YmxpYzoKLSAgICBTdHJlYW1Qb3dlckxvZygpIDoKLSAgICAgICAgbUlzVXNlckRlYnVnT3JFbmdCdWlsZChpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkpLAotICAgICAgICBtUG93ZXJMb2cobnVsbHB0ciksCi0gICAgICAgIG1GcmFtZVNpemUoMCkgewotICAgICAgICAvLyB1c2UgaW5pdCgpIHRvIHNldCB1cCB0aGUgcG93ZXIgbG9nLgotICAgIH0KLQotICAgIH5TdHJlYW1Qb3dlckxvZygpIHsKLSAgICAgICAgcG93ZXJfbG9nX2Rlc3Ryb3kobVBvd2VyTG9nKTsgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCi0gICAgICAgIG1Qb3dlckxvZyA9IG51bGxwdHI7Ci0gICAgfQotCi0gICAgLy8gQSBvbmUtdGltZSBpbml0aWFsaXphdGlvbiAoZG8gbm90IGNhbGwgdHdpY2UpIGJlZm9yZSB1c2luZyBTdHJlYW1Qb3dlckxvZy4KLSAgICB2b2lkIGluaXQodWludDMyX3Qgc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewotICAgICAgICBpZiAobVBvd2VyTG9nID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIC8vIE5vdGU6IEEgd2F5IHRvIGdldCBjaGFubmVsIGNvdW50IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgY2hhbm5lbCBtYXNrcwotICAgICAgICAgICAgLy8gYnV0IGRvZXMgbm90IGNoZWNrIHZhbGlkaXR5IG9mIHRoZSBjaGFubmVsIG1hc2suCi0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoY2hhbm5lbE1hc2spKTsKLSAgICAgICAgICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7Ci0gICAgICAgICAgICBpZiAobUZyYW1lU2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkgPQotICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzYW1wbGVSYXRlICoga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zIC8gMTAwMDsKLSAgICAgICAgICAgICAgICBtUG93ZXJMb2cgPSBwb3dlcl9sb2dfY3JlYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0VudHJpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gbVBvd2VyTG9nIG1heSBiZSBOVUxMIChub3QgdGhlIHJpZ2h0IGJ1aWxkLCBmb3JtYXQgbm90IGFjY2VwdGVkLCBldGMuKS4KLSAgICB9Ci0KLSAgICAvLyBEdW1wIHRoZSBwb3dlciBsb2cgdG8gZmQuCi0gICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3QgewotICAgICAgICAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKLSAgICAgICAgKHZvaWQpcG93ZXJfbG9nX2R1bXAoCi0gICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBmZCwgIiAgICAgICIgLyogcHJlZml4ICovLCBrUG93ZXJMb2dMaW5lcywgMCAvKiBsaW1pdF9ucyAqLyk7Ci0gICAgfQotCi0gICAgLy8gTG9nIHRoZSBhdWRpbyBkYXRhIGNvbnRhaW5lZCBpbiBidWZmZXIuCi0gICAgdm9pZCBsb2coY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZUluQnl0ZXMpIGNvbnN0IHsKLSAgICAgICAgaWYgKG1Qb3dlckxvZyAhPSBudWxscHRyKSB7IC8vIG1GcmFtZVNpemUgaXMgYWx3YXlzIG5vbnplcm8gaWYgbVBvd2VyTG9nIGV4aXN0cy4KLSAgICAgICAgICAgIHBvd2VyX2xvZ19sb2coCi0gICAgICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgYnVmZmVyLCBzaXplSW5CeXRlcyAvIG1GcmFtZVNpemUsIGF1ZGlvX3V0aWxzX2dldF9yZWFsX3RpbWVfbnMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sIGlzVXNlckRlYnVnT3JFbmdCdWlsZCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQ7Ci0gICAgfQotCi1wcml2YXRlOgotCi0gICAgc3RhdGljIGlubGluZSBib29sIGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSB7Ci0gICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAgICAgKHZvaWQpcHJvcGVydHlfZ2V0KCJyby5idWlsZC50eXBlIiwgdmFsdWUsICJ1bmtub3duIik7IC8vIGlnbm9yZSBhY3R1YWwgbGVuZ3RoCi0gICAgICAgIHJldHVybiBzdHJjbXAodmFsdWUsICJ1c2VyZGVidWciKSA9PSAwIHx8IHN0cmNtcCh2YWx1ZSwgImVuZyIpID09IDA7Ci0gICAgfQotCi0gICAgLy8gQXVkaW8gc2lnbmFsIHBvd2VyIGxvZyBjb25maWd1cmF0aW9uLgotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nTGluZXMgPSA0MDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyA9IDUwOwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nRW50cmllcyA9ICgxIC8qIG1pbnV0ZXMgKi8gKiA2MCAvKiBzZWNvbmRzICovICogMTAwMCAvKiBtc2VjICovCi0gICAgICAgICAgICAvIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyk7Ci0KLSAgICBjb25zdCBib29sIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQ7Ci0gICAgcG93ZXJfbG9nX3QgKm1Qb3dlckxvZzsKLSAgICBzaXplX3QgbUZyYW1lU2l6ZTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzNkZWZhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotY2NfbGlicmFyeV9zaGFyZWQgewotICAgIG5hbWU6ICJsaWJhdWRpb2hhbEA0LjAiLAotCi0gICAgc3JjczogWwotICAgICAgICAiRGV2aWNlSGFsTG9jYWwuY3BwIiwKLSAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcCIsCi0gICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcCIsCi0gICAgICAgICJTdHJlYW1IYWxMb2NhbC5jcHAiLAotCi0gICAgICAgICJDb252ZXJzaW9uSGVscGVySGlkbC5jcHAiLAotICAgICAgICAiRGV2aWNlSGFsSGlkbC5jcHAiLAotICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcCIsCi0gICAgICAgICJFZmZlY3RCdWZmZXJIYWxIaWRsLmNwcCIsCi0gICAgICAgICJFZmZlY3RIYWxIaWRsLmNwcCIsCi0gICAgICAgICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwuY3BwIiwKLSAgICAgICAgIlN0cmVhbUhhbEhpZGwuY3BwIiwKLSAgICBdLAotCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XYWxsIiwKLSAgICAgICAgIi1XZXh0cmEiLAotICAgICAgICAiLVdlcnJvciIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYXVkaW9oYWxfZGVhdGhoYW5kbGVyIiwKLSAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGliaGFyZHdhcmUiLAotICAgICAgICAibGliYmFzZSIsCi0gICAgICAgICJsaWJmbXEiLAotICAgICAgICAibGliaHdiaW5kZXIiLAotICAgICAgICAibGliaGlkbGJhc2UiLAotICAgICAgICAibGliaGlkbG1lbW9yeSIsCi0gICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANC4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uLXV0aWwiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANC4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDQuMC11dGlsIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0QDQuMCIsCi0gICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCi0gICAgICAgICJhbmRyb2lkLmhpZGwubWVtb3J5QDEuMCIsCi0gICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAotICAgICAgICAibGlibWVkaWF1dGlscyIsCi0gICAgXSwKLSAgICBoZWFkZXJfbGliczogWwotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb24udXRpbEBhbGwtdmVyc2lvbnMiLAotICAgICAgICAibGliYXVkaW9oYWxfaGVhZGVycyIKLSAgICBdLAotCi0gICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWwotICAgICAgICAibGliZm1xIiwKLSAgICBdLAotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9Db252ZXJzaW9uSGVscGVySGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMjc1MDQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIExPR19UQUcgIkhhbEhpZGwiCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpEZXZpY2VBZGRyZXNzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6Ok1pY3JvcGhvbmVJbmZvOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi0vLyBzdGF0aWMKLXN0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjprZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKSB7Ci0gICAgQXVkaW9QYXJhbWV0ZXIgaGFsS2V5cyhrZXlzKTsKLSAgICBpZiAoaGFsS2V5cy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICBoaWRsS2V5cy0+cmVzaXplKGhhbEtleXMuc2l6ZSgpKTsKLSAgICAvL0ZJWE1FOiAga2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMgYW5kIGtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMgY29tZSB3aXRoIGEKLSAgICAvLyAia2V5Rm9ybWF0PTx2YWx1ZT4iIHBhaXIuIFdlIG5lZWQgdG8gdHJhbnNmb3JtIGl0IGludG8gYSBzaW5nbGUga2V5IHN0cmluZyBzbyB0aGF0IGl0IGlzCi0gICAgLy8gY2FycmllZCBvdmVyIHRvIHRoZSBsZWdhY3kgSEFMIHZpYSBISURMLgotICAgIFN0cmluZzggdmFsdWU7Ci0gICAgYm9vbCBrZWVwRm9ybWF0VmFsdWUgPSBoYWxLZXlzLnNpemUoKSA9PSAyICYmCi0gICAgICAgICAoaGFsS2V5cy5nZXQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMpLCB2YWx1ZSkgPT0gTk9fRVJST1IgfHwKLSAgICAgICAgIGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMpLCB2YWx1ZSkgPT0gTk9fRVJST1IpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxLZXlzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIFN0cmluZzgga2V5OwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBoYWxLZXlzLmdldEF0KGksIGtleSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIGlmIChrZWVwRm9ybWF0VmFsdWUgJiYga2V5ID09IEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpIHsKLSAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIGZvcm1hdFBhcmFtOwotICAgICAgICAgICAgaGFsS2V5cy5nZXRBdChpLCBrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIGZvcm1hdFBhcmFtLmFkZChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIGtleSA9IGZvcm1hdFBhcmFtLnRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgKCpoaWRsS2V5cylbaV0gPSBrZXkuc3RyaW5nKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6cGFyYW1ldGVyc0Zyb21IYWwoCi0gICAgICAgIGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcykgewotICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtcyhrdlBhaXJzKTsKLSAgICBpZiAocGFyYW1zLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOwotICAgIGhpZGxQYXJhbXMtPnJlc2l6ZShwYXJhbXMuc2l6ZSgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtcy5zaXplKCk7ICsraSkgewotICAgICAgICBTdHJpbmc4IGtleSwgdmFsdWU7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtcy5nZXRBdChpLCBrZXksIHZhbHVlKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgKCpoaWRsUGFyYW1zKVtpXS5rZXkgPSBrZXkuc3RyaW5nKCk7Ci0gICAgICAgICgqaGlkbFBhcmFtcylbaV0udmFsdWUgPSB2YWx1ZS5zdHJpbmcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNUb0hhbCgKLSAgICAgICAgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHBhcmFtcy5hZGQoU3RyaW5nOChwYXJhbWV0ZXJzW2ldLmtleS5jX3N0cigpKSwgU3RyaW5nOChwYXJhbWV0ZXJzW2ldLnZhbHVlLmNfc3RyKCkpKTsKLSAgICB9Ci0gICAgdmFsdWVzLT5zZXRUbyhwYXJhbXMudG9TdHJpbmcoKSk7Ci19Ci0KLUNvbnZlcnNpb25IZWxwZXJIaWRsOjpDb252ZXJzaW9uSGVscGVySGlkbChjb25zdCBjaGFyKiBjbGFzc05hbWUpCi0gICAgICAgIDogbUNsYXNzTmFtZShjbGFzc05hbWUpIHsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCkgewotICAgIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotfQotCi12b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjplbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKSB7Ci0gICAgQUxPR0UoIiVzICVwICVzOiAlcyAoZnJvbSBycGMpIiwgbUNsYXNzTmFtZSwgdGhpcywgZnVuY05hbWUsIGRlc2NyaXB0aW9uKTsKLX0KLQotLy8gVE9ETzogVXNlIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uIGluIHRoZSBoYWwgd2hlbiBpdCBtb3ZlcyB0byBhIHV0aWwgbGlicmFyeS4KLXN0ZDo6c3RyaW5nIGRldmljZUFkZHJlc3NUb0hhbChjb25zdCBEZXZpY2VBZGRyZXNzJiBhZGRyZXNzKSB7Ci0gICAgLy8gSEFMIGFzc3VtZXMgdGhhdCB0aGUgYWRkcmVzcyBpcyBOVUwtdGVybWluYXRlZC4KLSAgICBjaGFyIGhhbEFkZHJlc3NbQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTl07Ci0gICAgbWVtc2V0KGhhbEFkZHJlc3MsIDAsIHNpemVvZihoYWxBZGRyZXNzKSk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGhhbERldmljZSA9IHN0YXRpY19jYXN0PGF1ZGlvX2RldmljZXNfdD4oYWRkcmVzcy5kZXZpY2UpOwotICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwOwotICAgIGlmIChpc0lucHV0KSBoYWxEZXZpY2UgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47Ci0gICAgaWYgKCghaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCkgIT0gMCkgfHwKLSAgICAgICAgKGlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgIT0gMCkpIHsKLSAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJTAyWDolMDJYOiUwMlg6JTAyWDolMDJYOiUwMlgiLAotICAgICAgICAgICAgICAgICBhZGRyZXNzLmFkZHJlc3MubWFjWzBdLCBhZGRyZXNzLmFkZHJlc3MubWFjWzFdLCBhZGRyZXNzLmFkZHJlc3MubWFjWzJdLAotICAgICAgICAgICAgICAgICBhZGRyZXNzLmFkZHJlc3MubWFjWzNdLCBhZGRyZXNzLmFkZHJlc3MubWFjWzRdLCBhZGRyZXNzLmFkZHJlc3MubWFjWzVdKTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9JUCkgIT0gMCkgfHwKLSAgICAgICAgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fSVApICE9IDApKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVkLiVkLiVkLiVkIiwgYWRkcmVzcy5hZGRyZXNzLmlwdjRbMF0sCi0gICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzFdLCBhZGRyZXNzLmFkZHJlc3MuaXB2NFsyXSwgYWRkcmVzcy5hZGRyZXNzLmlwdjRbM10pOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9VU0IpICE9IDApIHx8Ci0gICAgICAgICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0FMTF9VU0IpICE9IDApKSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgImNhcmQ9JWQ7ZGV2aWNlPSVkIiwgYWRkcmVzcy5hZGRyZXNzLmFsc2EuY2FyZCwKLSAgICAgICAgICAgICAgICAgYWRkcmVzcy5hZGRyZXNzLmFsc2EuZGV2aWNlKTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9CVVMpICE9IDApIHx8Ci0gICAgICAgICAgICAgICAoaXNJbnB1dCAmJiAoaGFsRGV2aWNlICYgQVVESU9fREVWSUNFX0lOX0JVUykgIT0gMCkpIHsKLSAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJXMiLCBhZGRyZXNzLmJ1c0FkZHJlc3MuY19zdHIoKSk7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGhhbERldmljZSAmIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCkpICE9IDAgfHwKLSAgICAgICAgICAgICAgIChpc0lucHV0ICYmIChoYWxEZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgIT0gMCkpIHsKLSAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJXMiLCBhZGRyZXNzLnJTdWJtaXhBZGRyZXNzLmNfc3RyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVzIiwgYWRkcmVzcy5idXNBZGRyZXNzLmNfc3RyKCkpOwotICAgIH0KLSAgICByZXR1cm4gaGFsQWRkcmVzczsKLX0KLQotLy9sb2NhbCBjb252ZXJzaW9uIGhlbHBlcnMKLQotYXVkaW9fbWljcm9waG9uZV9jaGFubmVsX21hcHBpbmdfdCAgY2hhbm5lbE1hcHBpbmdUb0hhbChBdWRpb01pY3JvcGhvbmVDaGFubmVsTWFwcGluZyBtYXBwaW5nKSB7Ci0gICAgc3dpdGNoIChtYXBwaW5nKSB7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc6OlVOVVNFRDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19VTlVTRUQ7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc6OkRJUkVDVDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19ESVJFQ1Q7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmc6OlBST0NFU1NFRDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19QUk9DRVNTRUQ7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIGNoYW5uZWxNYXBwaW5nVG9IYWwgY29udmVyc2lvbiAlZCIsIG1hcHBpbmcpOwotICAgIH0KLX0KLQotYXVkaW9fbWljcm9waG9uZV9sb2NhdGlvbl90IGxvY2F0aW9uVG9IYWwoQXVkaW9NaWNyb3Bob25lTG9jYXRpb24gbG9jYXRpb24pIHsKLSAgICBzd2l0Y2ggKGxvY2F0aW9uKSB7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246OlVOS05PV046Ci0gICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9VTktOT1dOOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpNQUlOQk9EWToKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX01BSU5CT0RZOwotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpNQUlOQk9EWV9NT1ZBQkxFOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fTUFJTkJPRFlfTU9WQUJMRTsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6UEVSSVBIRVJBTDoKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX1BFUklQSEVSQUw7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIGxvY2F0aW9uVG9IYWwgY29udmVyc2lvbiAlZCIsIGxvY2F0aW9uKTsKLSAgICB9Ci19Ci1hdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbmFsaXR5X3QgZGlyZWN0aW9uYWxpdHlUb0hhbChBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eSBkaXIpIHsKLSAgICBzd2l0Y2ggKGRpcikgewotICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpVTktOT1dOOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfRElSRUNUSU9OQUxJVFlfVU5LTk9XTjsKLSAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6T01OSToKLSAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX09NTkk7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6OkJJX0RJUkVDVElPTkFMOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfRElSRUNUSU9OQUxJVFlfQklfRElSRUNUSU9OQUw7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6OkNBUkRJT0lEOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfRElSRUNUSU9OQUxJVFlfQ0FSRElPSUQ7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6OkhZUEVSX0NBUkRJT0lEOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfRElSRUNUSU9OQUxJVFlfSFlQRVJfQ0FSRElPSUQ7Ci0gICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6OlNVUEVSX0NBUkRJT0lEOgotICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfRElSRUNUSU9OQUxJVFlfU1VQRVJfQ0FSRElPSUQ7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIGRpcmVjdGlvbmFsaXR5VG9IYWwgY29udmVyc2lvbiAlZCIsIGRpcik7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLXZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6Om1pY3JvcGhvbmVJbmZvVG9IYWwoY29uc3QgTWljcm9waG9uZUluZm8mIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9jaGFyYWN0ZXJpc3RpY190ICpwRHN0KSB7Ci0gICAgaWYgKHBEc3QgIT0gTlVMTCkgewotICAgICAgICBzbnByaW50ZihwRHN0LT5kZXZpY2VfaWQsIHNpemVvZihwRHN0LT5kZXZpY2VfaWQpLAotICAgICAgICAgICAgICAgICAiJXMiLCBzcmMuZGV2aWNlSWQuY19zdHIoKSk7Ci0gICAgICAgIHBEc3QtPmRldmljZSA9IHN0YXRpY19jYXN0PGF1ZGlvX2RldmljZXNfdD4oc3JjLmRldmljZUFkZHJlc3MuZGV2aWNlKTsKLSAgICAgICAgc25wcmludGYocERzdC0+YWRkcmVzcywgc2l6ZW9mKHBEc3QtPmFkZHJlc3MpLAotICAgICAgICAgICAgICAgICAiJXMiLCBkZXZpY2VBZGRyZXNzVG9IYWwoc3JjLmRldmljZUFkZHJlc3MpLmNfc3RyKCkpOwotICAgICAgICBpZiAoc3JjLmNoYW5uZWxNYXBwaW5nLnNpemUoKSA+IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYKSB7Ci0gICAgICAgICAgICBBTE9HVygibWljcm9waG9uZUluZm9Ub1N0cnVjdCBmb3VuZCAlenUgY2hhbm5lbE1hcHBpbmcgZWxlbWVudHMuIE1heCBleHBlY3RlZCBpcyAlZCIsCi0gICAgICAgICAgICAgICAgICBzcmMuY2hhbm5lbE1hcHBpbmcuc2l6ZSgpLCBBVURJT19DSEFOTkVMX0NPVU5UX01BWCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2l6ZV90IGNoOwotICAgICAgICBmb3IgKGNoID0gMDsgY2ggPCBzcmMuY2hhbm5lbE1hcHBpbmcuc2l6ZSgpICYmIGNoIDwgQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVg7IGNoKyspIHsKLSAgICAgICAgICAgIHBEc3QtPmNoYW5uZWxfbWFwcGluZ1tjaF0gPSBjaGFubmVsTWFwcGluZ1RvSGFsKHNyYy5jaGFubmVsTWFwcGluZ1tjaF0pOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoOyBjaCA8IEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYOyBjaCsrKSB7Ci0gICAgICAgICAgICBwRHN0LT5jaGFubmVsX21hcHBpbmdbY2hdID0gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfVU5VU0VEOwotICAgICAgICB9Ci0gICAgICAgIHBEc3QtPmxvY2F0aW9uID0gbG9jYXRpb25Ub0hhbChzcmMubG9jYXRpb24pOwotICAgICAgICBwRHN0LT5ncm91cCA9IChhdWRpb19taWNyb3Bob25lX2dyb3VwX3Qpc3JjLmdyb3VwOwotICAgICAgICBwRHN0LT5pbmRleF9pbl90aGVfZ3JvdXAgPSAodW5zaWduZWQgaW50KXNyYy5pbmRleEluVGhlR3JvdXA7Ci0gICAgICAgIHBEc3QtPnNlbnNpdGl2aXR5ID0gc3JjLnNlbnNpdGl2aXR5OwotICAgICAgICBwRHN0LT5tYXhfc3BsID0gc3JjLm1heFNwbDsKLSAgICAgICAgcERzdC0+bWluX3NwbCA9IHNyYy5taW5TcGw7Ci0gICAgICAgIHBEc3QtPmRpcmVjdGlvbmFsaXR5ID0gZGlyZWN0aW9uYWxpdHlUb0hhbChzcmMuZGlyZWN0aW9uYWxpdHkpOwotICAgICAgICBwRHN0LT5udW1fZnJlcXVlbmN5X3Jlc3BvbnNlcyA9ICh1bnNpZ25lZCBpbnQpc3JjLmZyZXF1ZW5jeVJlc3BvbnNlLnNpemUoKTsKLSAgICAgICAgaWYgKHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzID4gQVVESU9fTUlDUk9QSE9ORV9NQVhfRlJFUVVFTkNZX1JFU1BPTlNFUykgewotICAgICAgICAgICAgQUxPR1coIm1pY3JvcGhvbmVJbmZvVG9TdHJ1Y3QgZm91bmQgJWQgZnJlcXVlbmN5IHJlc3BvbnNlcy4gTWF4IGV4cGVjdGVkIGlzICVkIiwKLSAgICAgICAgICAgICAgICAgIHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzLCBBVURJT19NSUNST1BIT05FX01BWF9GUkVRVUVOQ1lfUkVTUE9OU0VTKTsKLSAgICAgICAgICAgIHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzID0gQVVESU9fTUlDUk9QSE9ORV9NQVhfRlJFUVVFTkNZX1JFU1BPTlNFUzsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzOyBrKyspIHsKLSAgICAgICAgICAgIHBEc3QtPmZyZXF1ZW5jeV9yZXNwb25zZXNbMF1ba10gPSBzcmMuZnJlcXVlbmN5UmVzcG9uc2Vba10uZnJlcXVlbmN5OwotICAgICAgICAgICAgcERzdC0+ZnJlcXVlbmN5X3Jlc3BvbnNlc1sxXVtrXSA9IHNyYy5mcmVxdWVuY3lSZXNwb25zZVtrXS5sZXZlbDsKLSAgICAgICAgfQotICAgICAgICBwRHN0LT5nZW9tZXRyaWNfbG9jYXRpb24ueCA9IHNyYy5wb3NpdGlvbi54OwotICAgICAgICBwRHN0LT5nZW9tZXRyaWNfbG9jYXRpb24ueSA9IHNyYy5wb3NpdGlvbi55OwotICAgICAgICBwRHN0LT5nZW9tZXRyaWNfbG9jYXRpb24ueiA9IHNyYy5wb3NpdGlvbi56OwotICAgICAgICBwRHN0LT5vcmllbnRhdGlvbi54ID0gc3JjLm9yaWVudGF0aW9uLng7Ci0gICAgICAgIHBEc3QtPm9yaWVudGF0aW9uLnkgPSBzcmMub3JpZW50YXRpb24ueTsKLSAgICAgICAgcERzdC0+b3JpZW50YXRpb24ueiA9IHNyYy5vcmllbnRhdGlvbi56OwotICAgIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIFY0XzAKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvQ29udmVyc2lvbkhlbHBlckhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9Db252ZXJzaW9uSGVscGVySGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODIzYThkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9Db252ZXJzaW9uSGVscGVySGlkbC5oCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9DT05WRVJTSU9OX0hFTFBFUl9ISURMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF80XzBfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UGFyYW1ldGVyVmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6TWljcm9waG9uZUluZm87Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIENvbnZlcnNpb25IZWxwZXJIaWRsIHsKLSAgcHJvdGVjdGVkOgotICAgIHN0YXRpYyBzdGF0dXNfdCBrZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgcGFyYW1ldGVyc0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga3ZQYWlycywgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+ICpoaWRsUGFyYW1zKTsKLSAgICBzdGF0aWMgdm9pZCBwYXJhbWV0ZXJzVG9IYWwoY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpOwotICAgIHN0YXRpYyB2b2lkIG1pY3JvcGhvbmVJbmZvVG9IYWwoY29uc3QgTWljcm9waG9uZUluZm8mIHNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCAqcERzdCk7Ci0KLSAgICBDb252ZXJzaW9uSGVscGVySGlkbChjb25zdCBjaGFyKiBjbGFzc05hbWUpOwotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVD4KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48Uj4mIHJldCwgVCAqcmV0dmFsKSB7Ci0gICAgICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIHdheSBpdCBhbHNvIHdvcmtzIGZvciBlbnVtIGNsYXNzIHRvIHVuc2NvcGVkIGVudW0gY29udmVyc2lvbi4KLSAgICAgICAgICAgICpyZXR2YWwgPSBzdGF0aWNfY2FzdDxUPihzdGF0aWNfY2FzdDxSPihyZXQpKTsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybihmdW5jTmFtZSwgcmV0KTsKLSAgICB9Ci0KLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxUPiYgcmV0KSB7Ci0gICAgICAgIGlmICghcmV0LmlzT2soKSkgewotICAgICAgICAgICAgZW1pdEVycm9yKGZ1bmNOYW1lLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0LmlzT2soKSA/IE9LIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLQotICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdD4mIHJldCkgewotICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIGVtaXRFcnJvcihmdW5jTmFtZSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci0gICAgfQotCi0gICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgICBzdGF0dXNfdCBwcm9jZXNzUmV0dXJuKAotICAgICAgICAgICAgY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxUPiYgcmV0LCBoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdCByZXR2YWwpIHsKLSAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLQotICBwcml2YXRlOgotICAgIGNvbnN0IGNoYXIqIG1DbGFzc05hbWU7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgYW5hbHl6ZVJlc3VsdChjb25zdCBoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlc3VsdCYgcmVzdWx0KTsKLQotICAgIHZvaWQgZW1pdEVycm9yKGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgVjRfMAotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbEhpZGwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmFjY2E5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlSGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lQcmltYXJ5RGV2aWNlLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLSNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8Y29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uVXRpbHMuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKLSNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCi0jaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCi0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvQ29uZmlnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9EZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0lucHV0RmxhZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvT3V0cHV0RmxhZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvUGF0Y2hIYW5kbGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb1BvcnQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb1BvcnRDb25maWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb01vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb1NvdXJjZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkhpZGxVdGlsczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OnV0aWxzOjpta0VudW1Db252ZXJ0ZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6RGV2aWNlQWRkcmVzczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJUHJpbWFyeURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpQYXJhbWV0ZXJWYWx1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6U2lua01ldGFkYXRhOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1uYW1lc3BhY2UgewotCi1zdGF0dXNfdCBkZXZpY2VBZGRyZXNzRnJvbUhhbCgKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgY2hhciogaGFsQWRkcmVzcywgRGV2aWNlQWRkcmVzcyogYWRkcmVzcykgewotICAgIGFkZHJlc3MtPmRldmljZSA9IEF1ZGlvRGV2aWNlKGRldmljZSk7Ci0KLSAgICBpZiAoaGFsQWRkcmVzcyA9PSBudWxscHRyIHx8IHN0cm5sZW4oaGFsQWRkcmVzcywgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMCkgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIGNvbnN0IGJvb2wgaXNJbnB1dCA9IChkZXZpY2UgJiBBVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwOwotICAgIGlmIChpc0lucHV0KSBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47Ci0gICAgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCkgIT0gMCkKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApICE9IDApKSB7Ci0gICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKLSAgICAgICAgICAgICAgICAiJWhoWDolaGhYOiVoaFg6JWhoWDolaGhYOiVoaFgiLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLm1hY1swXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzFdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMl0sCi0gICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzNdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbNF0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s1XSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXMgPT0gNiA/IE9LIDogQkFEX1ZBTFVFOwotICAgIH0gZWxzZSBpZiAoKCFpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0lQKSAhPSAwKQotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9JUCkgIT0gMCkpIHsKLSAgICAgICAgaW50IHN0YXR1cyA9IHNzY2FuZihoYWxBZGRyZXNzLAotICAgICAgICAgICAgICAgICIlaGh1LiVoaHUuJWhodS4laGh1IiwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzBdLCAmYWRkcmVzcy0+YWRkcmVzcy5pcHY0WzFdLAotICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMl0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbM10pOwotICAgICAgICByZXR1cm4gc3RhdHVzID09IDQgPyBPSyA6IEJBRF9WQUxVRTsKLSAgICB9IGVsc2UgaWYgKCghaXNJbnB1dCAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSkgIT0gMAotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9BTExfVVNCKSkgIT0gMCkgewotICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCi0gICAgICAgICAgICAgICAgImNhcmQ9JWQ7ZGV2aWNlPSVkIiwKLSAgICAgICAgICAgICAgICAmYWRkcmVzcy0+YWRkcmVzcy5hbHNhLmNhcmQsICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuZGV2aWNlKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSAyID8gT0sgOiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQlVTKSAhPSAwKQotICAgICAgICAgICAgfHwgKGlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9JTl9CVVMpICE9IDApKSB7Ci0gICAgICAgIGlmIChoYWxBZGRyZXNzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGFkZHJlc3MtPmJ1c0FkZHJlc3MgPSBoYWxBZGRyZXNzOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfSBlbHNlIGlmICgoIWlzSW5wdXQgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCkpICE9IDAKLSAgICAgICAgICAgIHx8IChpc0lucHV0ICYmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCkgIT0gMCkpIHsKLSAgICAgICAgaWYgKGhhbEFkZHJlc3MgIT0gTlVMTCkgewotICAgICAgICAgICAgYWRkcmVzcy0+clN1Ym1peEFkZHJlc3MgPSBoYWxBZGRyZXNzOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLURldmljZUhhbEhpZGw6OkRldmljZUhhbEhpZGwoY29uc3Qgc3A8SURldmljZT4mIGRldmljZSkKLSAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiRGV2aWNlIiksIG1EZXZpY2UoZGV2aWNlKSwKLSAgICAgICAgICBtUHJpbWFyeURldmljZShJUHJpbWFyeURldmljZTo6Y2FzdEZyb20oZGV2aWNlKSkgewotfQotCi1EZXZpY2VIYWxIaWRsOjp+RGV2aWNlSGFsSGlkbCgpIHsKLSAgICBpZiAobURldmljZSAhPSAwKSB7Ci0gICAgICAgIG1EZXZpY2UuY2xlYXIoKTsKLSAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldFN1cHBvcnRlZERldmljZXModWludDMyX3QqKSB7Ci0gICAgLy8gT2Jzb2xldGUuCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjppbml0Q2hlY2soKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImluaXRDaGVjayIsIG1EZXZpY2UtPmluaXRDaGVjaygpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaWYgKG1QcmltYXJ5RGV2aWNlID09IDApIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0Vm9pY2VWb2x1bWUiLCBtUHJpbWFyeURldmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJWb2x1bWUiLCBtUHJpbWFyeURldmljZS0+c2V0TWFzdGVyVm9sdW1lKHZvbHVtZSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVByaW1hcnlEZXZpY2UtPmdldE1hc3RlclZvbHVtZSgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgZmxvYXQgdikgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICp2b2x1bWUgPSB2OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNYXN0ZXJWb2x1bWUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNb2RlIiwgbVByaW1hcnlEZXZpY2UtPnNldE1vZGUoQXVkaW9Nb2RlKG1vZGUpKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnNldE1pY011dGUoYm9vbCBzdGF0ZSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNaWNNdXRlIiwgbURldmljZS0+c2V0TWljTXV0ZShzdGF0ZSkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWljTXV0ZSgKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgYm9vbCBtdXRlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnN0YXRlID0gbXV0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0TWljTXV0ZSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1hc3Rlck11dGUiLCBtRGV2aWNlLT5zZXRNYXN0ZXJNdXRlKHN0YXRlKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNYXN0ZXJNdXRlKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNYXN0ZXJNdXRlIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICAvLyBUT0RPOiBjaGFuZ2UgdGhlIEFQSSBzbyB0aGF0IGNvbnRleHQgYW5kIGt2UGFpcnMgYXJlIHNlcGFyYXRlZAotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQYXJhbWV0ZXJzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsczo6c2V0UGFyYW1ldGVycyhtRGV2aWNlLCB7fSAvKiBjb250ZXh0ICovLCBoaWRsUGFyYW1zKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgdmFsdWVzLT5jbGVhcigpOwotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gdXRpbHM6OmdldFBhcmFtZXRlcnMobURldmljZSwKLSAgICAgICAgICAgIHt9IC8qIGNvbnRleHQgKi8sCi0gICAgICAgICAgICBoaWRsS2V5cywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyc1RvSGFsKHBhcmFtZXRlcnMsIHZhbHVlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFBhcmFtZXRlcnMiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldElucHV0QnVmZmVyU2l6ZSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLCBzaXplX3QgKnNpemUpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRJbnB1dEJ1ZmZlclNpemUoCi0gICAgICAgICAgICBoaWRsQ29uZmlnLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBidWZmZXJTaXplKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KGJ1ZmZlclNpemUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRJbnB1dEJ1ZmZlclNpemUiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIERldmljZUFkZHJlc3MgaGlkbERldmljZTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2VBZGRyZXNzRnJvbUhhbChkZXZpY2VzLCBhZGRyZXNzLCAmaGlkbERldmljZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPm9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgICAgICBoYW5kbGUsCi0gICAgICAgICAgICBoaWRsRGV2aWNlLAotICAgICAgICAgICAgaGlkbENvbmZpZywKLSAgICAgICAgICAgIG1rRW51bUNvbnZlcnRlcjxBdWRpb091dHB1dEZsYWc+KGZsYWdzKSwKLSAgICAgICAgICAgIHt9IC8qIG1ldGFkYXRhICovLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJU3RyZWFtT3V0PiYgcmVzdWx0LCBjb25zdCBBdWRpb0NvbmZpZyYgc3VnZ2VzdGVkQ29uZmlnKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgKm91dFN0cmVhbSA9IG5ldyBTdHJlYW1PdXRIYWxIaWRsKHJlc3VsdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdUb0hhbChzdWdnZXN0ZWRDb25maWcsIGNvbmZpZyk7Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigib3Blbk91dHB1dFN0cmVhbSIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6b3BlbklucHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIERldmljZUFkZHJlc3MgaGlkbERldmljZTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2VBZGRyZXNzRnJvbUhhbChkZXZpY2VzLCBhZGRyZXNzLCAmaGlkbERldmljZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICBBdWRpb0NvbmZpZyBoaWRsQ29uZmlnOwotICAgIEhpZGxVdGlsczo6YXVkaW9Db25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgLy8gVE9ETzogY29ycmVjdGx5IHByb3BhZ2F0ZSB0aGUgdHJhY2tzIHNvdXJjZXMgYW5kIHZvbHVtZQotICAgIC8vICAgICAgIGZvciBub3csIG9ubHkgc2VuZCB0aGUgbWFpbiBzb3VyY2UgYXQgMWRiZnMKLSAgICBTaW5rTWV0YWRhdGEgbWV0YWRhdGEgPSB7e3tBdWRpb1NvdXJjZShzb3VyY2UpLCAxfX19OwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5vcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBoYW5kbGUsCi0gICAgICAgICAgICBoaWRsRGV2aWNlLAotICAgICAgICAgICAgaGlkbENvbmZpZywKLSAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgbWV0YWRhdGEsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IHNwPElTdHJlYW1Jbj4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbEhpZGwocmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ1RvSGFsKHN1Z2dlc3RlZENvbmZpZywgY29uZmlnKTsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJvcGVuSW5wdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OnN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcykgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdXBwb3J0c0F1ZGlvUGF0Y2hlcyIsIG1EZXZpY2UtPnN1cHBvcnRzQXVkaW9QYXRjaGVzKCksIHN1cHBvcnRzUGF0Y2hlcyk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBoaWRsX3ZlYzxBdWRpb1BvcnRDb25maWc+IGhpZGxTb3VyY2VzLCBoaWRsU2lua3M7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdzRnJvbUhhbChudW1fc291cmNlcywgc291cmNlcywgJmhpZGxTb3VyY2VzKTsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zaW5rcywgc2lua3MsICZoaWRsU2lua3MpOwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgICAgICBoaWRsU291cmNlcywgaGlkbFNpbmtzLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBBdWRpb1BhdGNoSGFuZGxlIGhpZGxQYXRjaCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwYXRjaCA9IHN0YXRpY19jYXN0PGF1ZGlvX3BhdGNoX2hhbmRsZV90PihoaWRsUGF0Y2gpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJjcmVhdGVBdWRpb1BhdGNoIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZWxlYXNlQXVkaW9QYXRjaCIsIG1EZXZpY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoKSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbEhpZGw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgewotICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOwotICAgIEF1ZGlvUG9ydCBoaWRsUG9ydDsKLSAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydEZyb21IYWwoKnBvcnQsICZoaWRsUG9ydCk7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0QXVkaW9Qb3J0KAotICAgICAgICAgICAgaGlkbFBvcnQsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEF1ZGlvUG9ydCYgcCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0VG9IYWwocCwgcG9ydCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEF1ZGlvUG9ydCIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgQXVkaW9Qb3J0Q29uZmlnIGhpZGxDb25maWc7Ci0gICAgSGlkbFV0aWxzOjphdWRpb1BvcnRDb25maWdGcm9tSGFsKCpjb25maWcsICZoaWRsQ29uZmlnKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0QXVkaW9Qb3J0Q29uZmlnIiwgbURldmljZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKGhpZGxDb25maWcpKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXNJbmZvKSB7Ci0gICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWljcm9waG9uZXMoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGhpZGxfdmVjPE1pY3JvcGhvbmVJbmZvPiBtaWNBcnJheUhhbCkgewotICAgICAgICByZXR2YWwgPSByOwotICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IG1pY0FycmF5SGFsLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgZHN0OwotICAgICAgICAgICAgLy9jb252ZXJ0Ci0gICAgICAgICAgICBtaWNyb3Bob25lSW5mb1RvSGFsKG1pY0FycmF5SGFsW2tdLCAmZHN0KTsKLSAgICAgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKGRzdCk7Ci0gICAgICAgICAgICBtaWNyb3Bob25lc0luZm8tPnB1c2hfYmFjayhtaWNyb3Bob25lKTsKLSAgICAgICAgfQotICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNaWNyb3Bob25lcyIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6ZHVtcChpbnQgZmQpIHsKLSAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKLSAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmRlYnVnKGhpZGxIYW5kbGUsIHt9IC8qIG9wdGlvbnMgKi8pOwotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZDIxNzUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF80XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfSElETF80XzBfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSURldmljZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lQcmltYXJ5RGV2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJUHJpbWFyeURldmljZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBEZXZpY2VIYWxIaWRsIDogcHVibGljIERldmljZUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBTZXRzIHRoZSB2YWx1ZSBvZiAnZGV2aWNlcycgdG8gYSBiaXRtYXNrIG9mIDEgb3IgbW9yZSB2YWx1ZXMgb2YgYXVkaW9fZGV2aWNlc190LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcyk7Ci0KLSAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwotCi0gICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgb2YgYSB2b2ljZSBjYWxsLiBSYW5nZSBpcyBiZXR3ZWVuIDAuMCBhbmQgMS4wLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIGZvciBhbGwgYXVkaW8gYWN0aXZpdGllcyBvdGhlciB0aGFuIHZvaWNlIGNhbGwuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIEdldCB0aGUgY3VycmVudCBtYXN0ZXIgdm9sdW1lIHZhbHVlIGZvciB0aGUgSEFMLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyVm9sdW1lKGZsb2F0ICp2b2x1bWUpOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGF1ZGlvIG1vZGUgY2hhbmdlcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpOwotCi0gICAgLy8gTXV0aW5nIGNvbnRyb2wuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNaWNNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljTXV0ZShib29sICpzdGF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSk7Ci0KLSAgICAvLyBTZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gUmV0dXJucyBhdWRpbyBpbnB1dCBidWZmZXIgc2l6ZSBhY2NvcmRpbmcgdG8gcGFyYW1ldGVycyBwYXNzZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlclNpemUoY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBvdXRwdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKTsKLQotICAgIC8vIENyZWF0ZXMgYW5kIG9wZW5zIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCi0gICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+ICppblN0cmVhbSk7Ci0KLSAgICAvLyBSZXR1cm5zIHdoZXRoZXIgY3JlYXRlQXVkaW9QYXRjaCBhbmQgcmVsZWFzZUF1ZGlvUGF0Y2ggb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKTsKLQotICAgIC8vIENyZWF0ZXMgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NvdXJjZXMsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCi0gICAgICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rcywKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCk7Ci0KLSAgICAvLyBSZWxlYXNlcyBhbiBhdWRpbyBwYXRjaC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKTsKLQotICAgIC8vIEZpbGxzIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpOwotCi0gICAgLy8gU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbi4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7Ci0KLSAgICAvLyBMaXN0IG1pY3JvcGhvbmVzCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGw7Ci0gICAgc3A8SURldmljZT4gbURldmljZTsKLSAgICBzcDxJUHJpbWFyeURldmljZT4gbVByaW1hcnlEZXZpY2U7ICAvLyBOdWxsIGlmIGl0J3Mgbm90IGEgcHJpbWFyeSBkZXZpY2UuCi0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgRGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCi0gICAgdmlydHVhbCB+RGV2aWNlSGFsSGlkbCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMjQ1ZGQ5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VIYWxMb2NhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlSGFsTG9jYWwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsTG9jYWwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1EZXZpY2VIYWxMb2NhbDo6RGV2aWNlSGFsTG9jYWwoYXVkaW9faHdfZGV2aWNlX3QgKmRldikKLSAgICAgICAgOiBtRGV2KGRldikgewotfQotCi1EZXZpY2VIYWxMb2NhbDo6fkRldmljZUhhbExvY2FsKCkgewotICAgIGludCBzdGF0dXMgPSBhdWRpb19od19kZXZpY2VfY2xvc2UobURldik7Ci0gICAgQUxPR1dfSUYoc3RhdHVzLCAiRXJyb3IgY2xvc2luZyBhdWRpbyBodyBkZXZpY2UgJXA6ICVzIiwgbURldiwgc3RyZXJyb3IoLXN0YXR1cykpOwotICAgIG1EZXYgPSAwOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcykgewotICAgIGlmIChtRGV2LT5nZXRfc3VwcG9ydGVkX2RldmljZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICpkZXZpY2VzID0gbURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzKG1EZXYpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmluaXRDaGVjaygpIHsKLSAgICByZXR1cm4gbURldi0+aW5pdF9jaGVjayhtRGV2KTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgIHJldHVybiBtRGV2LT5zZXRfdm9pY2Vfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl92b2x1bWUobURldiwgdm9sdW1lKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7Ci0gICAgaWYgKG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl92b2x1bWUobURldiwgdm9sdW1lKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X21vZGUobURldiwgbW9kZSk7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIHsKLSAgICByZXR1cm4gbURldi0+c2V0X21pY19tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKLSAgICByZXR1cm4gbURldi0+Z2V0X21pY19tdXRlKG1EZXYsIHN0YXRlKTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSkgewotICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX211dGUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5zZXRfbWFzdGVyX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgewotICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX211dGUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtRGV2LT5nZXRfbWFzdGVyX211dGUobURldiwgc3RhdGUpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7Ci0gICAgcmV0dXJuIG1EZXYtPnNldF9wYXJhbWV0ZXJzKG1EZXYsIGt2UGFpcnMuc3RyaW5nKCkpOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKLSAgICBjaGFyICpoYWxWYWx1ZXMgPSBtRGV2LT5nZXRfcGFyYW1ldGVycyhtRGV2LCBrZXlzLnN0cmluZygpKTsKLSAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKLSAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOwotICAgICAgICBmcmVlKGhhbFZhbHVlcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdmFsdWVzLT5jbGVhcigpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRJbnB1dEJ1ZmZlclNpemUoCi0gICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywgc2l6ZV90ICpzaXplKSB7Ci0gICAgKnNpemUgPSBtRGV2LT5nZXRfaW5wdXRfYnVmZmVyX3NpemUobURldiwgY29uZmlnKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpvcGVuT3V0cHV0U3RyZWFtKAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAotICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pIHsKLSAgICBhdWRpb19zdHJlYW1fb3V0X3QgKmhhbFN0cmVhbTsKLSAgICBBTE9HVigib3Blbl9vdXRwdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCIKLSAgICAgICAgICAgICJzcmF0ZTogJWQgZm9ybWF0ICUjeCBjaGFubmVscyAleCBhZGRyZXNzICVzIiwKLSAgICAgICAgICAgIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsCi0gICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICBhZGRyZXNzKTsKLSAgICBpbnQgb3BlblJlc3V0ID0gbURldi0+b3Blbl9vdXRwdXRfc3RyZWFtKAotICAgICAgICAgICAgbURldiwgaGFuZGxlLCBkZXZpY2VzLCBmbGFncywgY29uZmlnLCAmaGFsU3RyZWFtLCBhZGRyZXNzKTsKLSAgICBpZiAob3BlblJlc3V0ID09IE9LKSB7Ci0gICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsTG9jYWwoaGFsU3RyZWFtLCB0aGlzKTsKLSAgICB9Ci0gICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBzdGF0dXMgJWQgc3RyZWFtICVwIiwgb3BlblJlc3V0LCBoYWxTdHJlYW0pOwotICAgIHJldHVybiBvcGVuUmVzdXQ7Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpvcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gKmluU3RyZWFtKSB7Ci0gICAgYXVkaW9fc3RyZWFtX2luX3QgKmhhbFN0cmVhbTsKLSAgICBBTE9HVigib3Blbl9pbnB1dF9zdHJlYW0gaGFuZGxlOiAlZCBkZXZpY2VzOiAleCBmbGFnczogJSN4ICIKLSAgICAgICAgICAgICJzcmF0ZTogJWQgZm9ybWF0ICUjeCBjaGFubmVscyAleCBhZGRyZXNzICVzIHNvdXJjZSAlZCIsCi0gICAgICAgICAgICBoYW5kbGUsIGRldmljZXMsIGZsYWdzLAotICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgYWRkcmVzcywgc291cmNlKTsKLSAgICBpbnQgb3BlblJlc3VsdCA9IG1EZXYtPm9wZW5faW5wdXRfc3RyZWFtKAotICAgICAgICAgICAgbURldiwgaGFuZGxlLCBkZXZpY2VzLCBjb25maWcsICZoYWxTdHJlYW0sIGZsYWdzLCBhZGRyZXNzLCBzb3VyY2UpOwotICAgIGlmIChvcGVuUmVzdWx0ID09IE9LKSB7Ci0gICAgICAgICppblN0cmVhbSA9IG5ldyBTdHJlYW1JbkhhbExvY2FsKGhhbFN0cmVhbSwgdGhpcyk7Ci0gICAgfQotICAgIEFMT0dWKCJvcGVuX2lucHV0X3N0cmVhbSBzdGF0dXMgJWQgc3RyZWFtICVwIiwgb3BlblJlc3VsdCwgaW5TdHJlYW0pOwotICAgIHJldHVybiBvcGVuUmVzdWx0OwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7Ci0gICAgKnN1cHBvcnRzUGF0Y2hlcyA9IHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmNyZWF0ZUF1ZGlvUGF0Y2goCi0gICAgICAgIHVuc2lnbmVkIGludCBudW1fc291cmNlcywKLSAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICB1bnNpZ25lZCBpbnQgbnVtX3NpbmtzLAotICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNpbmtzLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpIHsKLSAgICBpZiAodmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzApIHsKLSAgICAgICAgcmV0dXJuIG1EZXYtPmNyZWF0ZV9hdWRpb19wYXRjaCgKLSAgICAgICAgICAgICAgICBtRGV2LCBudW1fc291cmNlcywgc291cmNlcywgbnVtX3NpbmtzLCBzaW5rcywgcGF0Y2gpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci19Ci0KLXN0YXR1c190IERldmljZUhhbExvY2FsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCkgewotICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgewotICAgICAgICByZXR1cm4gbURldi0+cmVsZWFzZV9hdWRpb19wYXRjaChtRGV2LCBwYXRjaCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgewotICAgIHJldHVybiBtRGV2LT5nZXRfYXVkaW9fcG9ydChtRGV2LCBwb3J0KTsKLX0KLQotc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgewotICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkKLSAgICAgICAgcmV0dXJuIG1EZXYtPnNldF9hdWRpb19wb3J0X2NvbmZpZyhtRGV2LCBjb25maWcpOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpIHsKLSAgICBpZiAobURldi0+Z2V0X21pY3JvcGhvbmVzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBzaXplX3QgYWN0dWFsX21pY3MgPSBBVURJT19NSUNST1BIT05FX01BWF9DT1VOVDsKLSAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgbWljX2FycmF5W0FVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UXTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtRGV2LT5nZXRfbWljcm9waG9uZXMobURldiwgJm1pY19hcnJheVswXSwgJmFjdHVhbF9taWNzKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdHVhbF9taWNzOyBpKyspIHsKLSAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmVJbmZvID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKG1pY19hcnJheVtpXSk7Ci0gICAgICAgIG1pY3JvcGhvbmVzLT5wdXNoX2JhY2sobWljcm9waG9uZUluZm8pOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6ZHVtcChpbnQgZmQpIHsKLSAgICByZXR1cm4gbURldi0+ZHVtcChtRGV2LCBmZCk7Ci19Ci0KLXZvaWQgRGV2aWNlSGFsTG9jYWw6OmNsb3NlT3V0cHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0ICpzdHJlYW1fb3V0KSB7Ci0gICAgbURldi0+Y2xvc2Vfb3V0cHV0X3N0cmVhbShtRGV2LCBzdHJlYW1fb3V0KTsKLX0KLQotdm9pZCBEZXZpY2VIYWxMb2NhbDo6Y2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pIHsKLSAgICBtRGV2LT5jbG9zZV9pbnB1dF9zdHJlYW0obURldiwgc3RyZWFtX2luKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsTG9jYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgzNDFhNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlSGFsTG9jYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRV9IQUxfTE9DQUxfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0xPQ0FMXzRfMF9ICi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIERldmljZUhhbExvY2FsIDogcHVibGljIERldmljZUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gU2V0cyB0aGUgdmFsdWUgb2YgJ2RldmljZXMnIHRvIGEgYml0bWFzayBvZiAxIG9yIG1vcmUgdmFsdWVzIG9mIGF1ZGlvX2RldmljZXNfdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN1cHBvcnRlZERldmljZXModWludDMyX3QgKmRldmljZXMpOwotCi0gICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBhdWRpbyBoYXJkd2FyZSBpbnRlcmZhY2UgaGFzIGJlZW4gaW5pdGlhbGl6ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKTsKLQotICAgIC8vIFNldCB0aGUgYXVkaW8gdm9sdW1lIG9mIGEgdm9pY2UgY2FsbC4gUmFuZ2UgaXMgYmV0d2VlbiAwLjAgYW5kIDEuMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBmb3IgYWxsIGF1ZGlvIGFjdGl2aXRpZXMgb3RoZXIgdGhhbiB2b2ljZSBjYWxsLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0KLSAgICAvLyBHZXQgdGhlIGN1cnJlbnQgbWFzdGVyIHZvbHVtZSB2YWx1ZSBmb3IgdGhlIEhBTC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBhdWRpbyBtb2RlIGNoYW5nZXMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNb2RlKGF1ZGlvX21vZGVfdCBtb2RlKTsKLQotICAgIC8vIE11dGluZyBjb250cm9sLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWljTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pY011dGUoYm9vbCAqc3RhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFzdGVyTXV0ZShib29sIHN0YXRlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1hc3Rlck11dGUoYm9vbCAqc3RhdGUpOwotCi0gICAgLy8gU2V0IGdsb2JhbCBhdWRpbyBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKLQotICAgIC8vIEdldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKLQotICAgIC8vIFJldHVybnMgYXVkaW8gaW5wdXQgYnVmZmVyIHNpemUgYWNjb3JkaW5nIHRvIHBhcmFtZXRlcnMgcGFzc2VkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRCdWZmZXJTaXplKGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgIHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgb3V0cHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKLSAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXRTdHJlYW0oCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKLSAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZT4gKm91dFN0cmVhbSk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuZCBvcGVucyB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQgc3RyZWFtLiBUaGUgc3RyZWFtIGlzIGNsb3NlZAotICAgIC8vIGJ5IHJlbGVhc2luZyBhbGwgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7Ci0KLSAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAotICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAotICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCi0gICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOwotCi0gICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7Ci0KLSAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKLQotICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOwotCi0gICAgLy8gTGlzdCBtaWNyb3Bob25lcwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgICB2b2lkIGNsb3NlT3V0cHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1fb3V0ICpzdHJlYW1fb3V0KTsKLSAgICB2b2lkIGNsb3NlSW5wdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9pbiAqc3RyZWFtX2luKTsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX2h3X2RldmljZV90ICptRGV2OwotCi0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsTG9jYWw7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgRGV2aWNlSGFsTG9jYWwoYXVkaW9faHdfZGV2aWNlX3QgKmRldik7Ci0KLSAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgZGV2aWNlLgotICAgIHZpcnR1YWwgfkRldmljZUhhbExvY2FsKCk7Ci0KLSAgICB1aW50MzJfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gbURldi0+Y29tbW9uLnZlcnNpb247IH0KLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgzMTk0ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSURldmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL2hpZGwvSGFsRGVhdGhIYW5kbGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklEZXZpY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLURldmljZXNGYWN0b3J5SGFsSGlkbDo6RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkgewotICAgIG1EZXZpY2VzRmFjdG9yeSA9IElEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZSgpOwotICAgIGlmIChtRGV2aWNlc0ZhY3RvcnkgIT0gMCkgewotICAgICAgICAvLyBJdCBpcyBhc3N1bWVkIHRoYXQgRGV2aWNlc0ZhY3RvcnkgaXMgb3duZWQgYnkgQXVkaW9GbGluZ2VyCi0gICAgICAgIC8vIGFuZCB0aHVzIGhhdmUgdGhlIHNhbWUgbGlmZXNwYW4uCi0gICAgICAgIG1EZXZpY2VzRmFjdG9yeS0+bGlua1RvRGVhdGgoSGFsRGVhdGhIYW5kbGVyOjpnZXRJbnN0YW5jZSgpLCAwIC8qY29va2llKi8pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb2J0YWluIElEZXZpY2VzRmFjdG9yeSBzZXJ2aWNlLCB0ZXJtaW5hdGluZyBwcm9jZXNzLiIpOwotICAgICAgICBleGl0KDEpOwotICAgIH0KLSAgICAvLyBUaGUgTVNEIGZhY3RvcnkgaXMgb3B0aW9uYWwKLSAgICBtRGV2aWNlc0ZhY3RvcnlNc2QgPSBJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoQVVESU9fSEFMX1NFUlZJQ0VfTkFNRV9NU0QpOwotICAgIC8vIFRPRE86IFJlZ2lzdGVyIGRlYXRoIGhhbmRsZXIsIGFuZCBhZGQgJ3Jlc3RhcnQnIGRpcmVjdGl2ZSB0byBhdWRpb3NlcnZlci5yYwotfQotCi1EZXZpY2VzRmFjdG9yeUhhbEhpZGw6On5EZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSB7Ci19Ci0KLXN0YXR1c190IERldmljZXNGYWN0b3J5SGFsSGlkbDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKLSAgICBpZiAobURldmljZXNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZXNGYWN0b3J5LT5vcGVuRGV2aWNlKAotICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SURldmljZT4mIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsSGlkbChyZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOwotICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTQ4ODliLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMXzRfMF9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMXzRfMF9ICi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JRGV2aWNlc0ZhY3RvcnkuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklEZXZpY2VzRmFjdG9yeTsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIE9wZW5zIGEgZGV2aWNlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUbyBjbG9zZSB0aGUgZGV2aWNlLCBpdCBpcwotICAgIC8vIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5EZXZpY2UoY29uc3QgY2hhciAqbmFtZSwgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiAqZGV2aWNlKTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDsKLQotICAgIHNwPElEZXZpY2VzRmFjdG9yeT4gbURldmljZXNGYWN0b3J5OwotICAgIHNwPElEZXZpY2VzRmFjdG9yeT4gbURldmljZXNGYWN0b3J5TXNkOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIERldmljZXNGYWN0b3J5SGFsSGlkbCgpOwotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSElETF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmZjFlYzdkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGxpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oPgotI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsTG9jYWwuaCIKLSNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbEhpZGwuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6RGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKQotICAgICAgICA6IG1Mb2NhbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSksCi0gICAgICAgICAgbUhpZGxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoKSkgewotfQotCi1EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6fkRldmljZXNGYWN0b3J5SGFsSHlicmlkKCkgewotfQotCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKLSAgICBpZiAobUhpZGxGYWN0b3J5ICE9IDAgJiYgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9BMkRQLCBuYW1lKSAhPSAwICYmCi0gICAgICAgIHN0cmNtcChBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfSEVBUklOR19BSUQsIG5hbWUpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1IaWRsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOwotICAgIH0KLSAgICByZXR1cm4gbUxvY2FsRmFjdG9yeS0+b3BlbkRldmljZShuYW1lLCBkZXZpY2UpOwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NGVkZDQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCi0jaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLXN0YXRpYyBzdGF0dXNfdCBsb2FkX2F1ZGlvX2ludGVyZmFjZShjb25zdCBjaGFyICppZl9uYW1lLCBhdWRpb19od19kZXZpY2VfdCAqKmRldikKLXsKLSAgICBjb25zdCBod19tb2R1bGVfdCAqbW9kOwotICAgIGludCByYzsKLQotICAgIHJjID0gaHdfZ2V0X21vZHVsZV9ieV9jbGFzcyhBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsICZtb2QpOwotICAgIGlmIChyYykgewotICAgICAgICBBTE9HRSgiJXMgY291bGRuJ3QgbG9hZCBhdWRpbyBodyBtb2R1bGUgJXMuJXMgKCVzKSIsIF9fZnVuY19fLAotICAgICAgICAgICAgICAgIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRCwgaWZfbmFtZSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIGdvdG8gb3V0OwotICAgIH0KLSAgICByYyA9IGF1ZGlvX2h3X2RldmljZV9vcGVuKG1vZCwgZGV2KTsKLSAgICBpZiAocmMpIHsKLSAgICAgICAgQUxPR0UoIiVzIGNvdWxkbid0IG9wZW4gYXVkaW8gaHcgZGV2aWNlIGluICVzLiVzICglcykiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsIHN0cmVycm9yKC1yYykpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgaWYgKCgqZGV2KS0+Y29tbW9uLnZlcnNpb24gPCBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fTUlOKSB7Ci0gICAgICAgIEFMT0dFKCIlcyB3cm9uZyBhdWRpbyBodyBkZXZpY2UgdmVyc2lvbiAlMDR4IiwgX19mdW5jX18sICgqZGV2KS0+Y29tbW9uLnZlcnNpb24pOwotICAgICAgICByYyA9IEJBRF9WQUxVRTsKLSAgICAgICAgYXVkaW9faHdfZGV2aWNlX2Nsb3NlKCpkZXYpOwotICAgICAgICBnb3RvIG91dDsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotCi1vdXQ6Ci0gICAgKmRldiA9IE5VTEw7Ci0gICAgcmV0dXJuIHJjOwotfQotCi1zdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbExvY2FsOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgewotICAgIGF1ZGlvX2h3X2RldmljZV90ICpkZXY7Ci0gICAgc3RhdHVzX3QgcmMgPSBsb2FkX2F1ZGlvX2ludGVyZmFjZShuYW1lLCAmZGV2KTsKLSAgICBpZiAocmMgPT0gT0spIHsKLSAgICAgICAgKmRldmljZSA9IG5ldyBEZXZpY2VIYWxMb2NhbChkZXYpOwotICAgIH0KLSAgICByZXR1cm4gcmM7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzFjNTIxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfNF8wX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMXzRfMF9ICi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCi0gICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQotCi0gICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpIHt9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfTE9DQUxfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU3Yzg5Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxhdG9taWM+Ci0KLSNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0QnVmZmVySGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9hbGxvY2F0b3IvMS4wL0lBbGxvY2F0b3IuaD4KLSNpbmNsdWRlIDxoaWRsbWVtb3J5L21hcHBpbmcuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhpZGw6OmFsbG9jYXRvcjo6VjFfMDo6SUFsbG9jYXRvcjsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi0vLyBzdGF0aWMKLXVpbnQ2NF90IEVmZmVjdEJ1ZmZlckhhbEhpZGw6Om1ha2VVbmlxdWVJZCgpIHsKLSAgICBzdGF0aWMgc3RkOjphdG9taWM8dWludDY0X3Q+IGNvdW50ZXJ7MX07Ci0gICAgcmV0dXJuIGNvdW50ZXIrKzsKLX0KLQotc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6YWxsb2NhdGUoCi0gICAgICAgIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKLSAgICByZXR1cm4gbWlycm9yKG51bGxwdHIsIHNpemUsIGJ1ZmZlcik7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEJ1ZmZlckhhbEhpZGw6Om1pcnJvcigKLSAgICAgICAgdm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKLSAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IHRlbXBCdWZmZXIgPSBuZXcgRWZmZWN0QnVmZmVySGFsSGlkbChzaXplKTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4odGVtcEJ1ZmZlci5nZXQoKSktPmluaXQoKTsKLSAgICBpZiAocmVzdWx0ID09IE9LKSB7Ci0gICAgICAgIHRlbXBCdWZmZXItPnNldEV4dGVybmFsRGF0YShleHRlcm5hbCk7Ci0gICAgICAgICpidWZmZXIgPSB0ZW1wQnVmZmVyOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1FZmZlY3RCdWZmZXJIYWxIaWRsOjpFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemVfdCBzaXplKQotICAgICAgICA6IG1CdWZmZXJTaXplKHNpemUpLCBtRnJhbWVDb3VudENoYW5nZWQoZmFsc2UpLAotICAgICAgICAgIG1FeHRlcm5hbERhdGEobnVsbHB0ciksIG1BdWRpb0J1ZmZlcnswLCB7bnVsbHB0cn19IHsKLSAgICBtSGlkbEJ1ZmZlci5pZCA9IG1ha2VVbmlxdWVJZCgpOwotICAgIG1IaWRsQnVmZmVyLmZyYW1lQ291bnQgPSAwOwotfQotCi1FZmZlY3RCdWZmZXJIYWxIaWRsOjp+RWZmZWN0QnVmZmVySGFsSGlkbCgpIHsKLX0KLQotc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6aW5pdCgpIHsKLSAgICBzcDxJQWxsb2NhdG9yPiBhc2htZW0gPSBJQWxsb2NhdG9yOjpnZXRTZXJ2aWNlKCJhc2htZW0iKTsKLSAgICBpZiAoYXNobWVtID09IDApIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZXRyaWV2ZSBhc2htZW0gYWxsb2NhdG9yIHNlcnZpY2UiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHN0YXR1c190IHJldHZhbCA9IE5PX01FTU9SWTsKLSAgICBSZXR1cm48dm9pZD4gcmVzdWx0ID0gYXNobWVtLT5hbGxvY2F0ZSgKLSAgICAgICAgICAgIG1CdWZmZXJTaXplLAotICAgICAgICAgICAgWyZdKGJvb2wgc3VjY2VzcywgY29uc3QgaGlkbF9tZW1vcnkmIG1lbW9yeSkgewotICAgICAgICAgICAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1IaWRsQnVmZmVyLmRhdGEgPSBtZW1vcnk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IE9LOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXN1bHQuaXNPaygpICYmIHJldHZhbCA9PSBPSykgewotICAgICAgICBtTWVtb3J5ID0gaGFyZHdhcmU6Om1hcE1lbW9yeShtSGlkbEJ1ZmZlci5kYXRhKTsKLSAgICAgICAgaWYgKG1NZW1vcnkgIT0gMCkgewotICAgICAgICAgICAgbU1lbW9yeS0+dXBkYXRlKCk7Ci0gICAgICAgICAgICBtQXVkaW9CdWZmZXIucmF3ID0gc3RhdGljX2Nhc3Q8dm9pZCo+KG1NZW1vcnktPmdldFBvaW50ZXIoKSk7Ci0gICAgICAgICAgICBtZW1zZXQobUF1ZGlvQnVmZmVyLnJhdywgMCwgbU1lbW9yeS0+Z2V0U2l6ZSgpKTsKLSAgICAgICAgICAgIG1NZW1vcnktPmNvbW1pdCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBtYXAgYWxsb2NhdGVkIGFzaG1lbSIpOwotICAgICAgICAgICAgcmV0dmFsID0gTk9fTUVNT1JZOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBhbGxvY2F0ZSAlZCBieXRlcyBmcm9tIGFzaG1lbSIsIChpbnQpbUJ1ZmZlclNpemUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0LmlzT2soKSA/IHJldHZhbCA6IEZBSUxFRF9UUkFOU0FDVElPTjsKLX0KLQotYXVkaW9fYnVmZmVyX3QqIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmF1ZGlvQnVmZmVyKCkgewotICAgIHJldHVybiAmbUF1ZGlvQnVmZmVyOwotfQotCi12b2lkKiBFZmZlY3RCdWZmZXJIYWxIaWRsOjpleHRlcm5hbERhdGEoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1FeHRlcm5hbERhdGE7Ci19Ci0KLXZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6c2V0RnJhbWVDb3VudChzaXplX3QgZnJhbWVDb3VudCkgewotICAgIG1IaWRsQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OwotICAgIG1BdWRpb0J1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVDb3VudDsKLSAgICBtRnJhbWVDb3VudENoYW5nZWQgPSB0cnVlOwotfQotCi1ib29sIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNoZWNrRnJhbWVDb3VudENoYW5nZSgpIHsKLSAgICBib29sIHJlc3VsdCA9IG1GcmFtZUNvdW50Q2hhbmdlZDsKLSAgICBtRnJhbWVDb3VudENoYW5nZWQgPSBmYWxzZTsKLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnNldEV4dGVybmFsRGF0YSh2b2lkKiBleHRlcm5hbCkgewotICAgIG1FeHRlcm5hbERhdGEgPSBleHRlcm5hbDsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjp1cGRhdGUoKSB7Ci0gICAgdXBkYXRlKG1CdWZmZXJTaXplKTsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjb21taXQoKSB7Ci0gICAgY29tbWl0KG1CdWZmZXJTaXplKTsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjp1cGRhdGUoc2l6ZV90IHNpemUpIHsKLSAgICBpZiAobUV4dGVybmFsRGF0YSA9PSBudWxscHRyKSByZXR1cm47Ci0gICAgbU1lbW9yeS0+dXBkYXRlKCk7Ci0gICAgaWYgKHNpemUgPiBtQnVmZmVyU2l6ZSkgc2l6ZSA9IG1CdWZmZXJTaXplOwotICAgIG1lbWNweShtQXVkaW9CdWZmZXIucmF3LCBtRXh0ZXJuYWxEYXRhLCBzaXplKTsKLSAgICBtTWVtb3J5LT5jb21taXQoKTsKLX0KLQotdm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpjb21taXQoc2l6ZV90IHNpemUpIHsKLSAgICBpZiAobUV4dGVybmFsRGF0YSA9PSBudWxscHRyKSByZXR1cm47Ci0gICAgaWYgKHNpemUgPiBtQnVmZmVyU2l6ZSkgc2l6ZSA9IG1CdWZmZXJTaXplOwotICAgIG1lbWNweShtRXh0ZXJuYWxEYXRhLCBtQXVkaW9CdWZmZXIucmF3LCBzaXplKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RCdWZmZXJIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkNTc4YzYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF80XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfNF8wX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzQuMC90eXBlcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tZW1vcnkvMS4wL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgotCi11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6QXVkaW9CdWZmZXI7Ci11c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Ci11c2luZyBhbmRyb2lkOjpoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnk7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRWZmZWN0QnVmZmVySGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIHN0YXRpYyBzdGF0dXNfdCBhbGxvY2F0ZShzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgbWlycm9yKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKTsKLQotICAgIHZpcnR1YWwgYXVkaW9fYnVmZmVyX3QqIGF1ZGlvQnVmZmVyKCk7Ci0gICAgdmlydHVhbCB2b2lkKiBleHRlcm5hbERhdGEoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc2l6ZV90IGdldFNpemUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBtQnVmZmVyU2l6ZTsgfQotCi0gICAgdmlydHVhbCB2b2lkIHNldEV4dGVybmFsRGF0YSh2b2lkKiBleHRlcm5hbCk7Ci0gICAgdmlydHVhbCB2b2lkIHNldEZyYW1lQ291bnQoc2l6ZV90IGZyYW1lQ291bnQpOwotICAgIHZpcnR1YWwgYm9vbCBjaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKLQotICAgIHZpcnR1YWwgdm9pZCB1cGRhdGUoKTsKLSAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KCk7Ci0gICAgdmlydHVhbCB2b2lkIHVwZGF0ZShzaXplX3Qgc2l6ZSk7Ci0gICAgdmlydHVhbCB2b2lkIGNvbW1pdChzaXplX3Qgc2l6ZSk7Ci0KLSAgICBjb25zdCBBdWRpb0J1ZmZlciYgaGlkbEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIG1IaWRsQnVmZmVyOyB9Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlOwotCi0gICAgc3RhdGljIHVpbnQ2NF90IG1ha2VVbmlxdWVJZCgpOwotCi0gICAgY29uc3Qgc2l6ZV90IG1CdWZmZXJTaXplOwotICAgIGJvb2wgbUZyYW1lQ291bnRDaGFuZ2VkOwotICAgIHZvaWQqIG1FeHRlcm5hbERhdGE7Ci0gICAgQXVkaW9CdWZmZXIgbUhpZGxCdWZmZXI7Ci0gICAgc3A8SU1lbW9yeT4gbU1lbW9yeTsKLSAgICBhdWRpb19idWZmZXJfdCBtQXVkaW9CdWZmZXI7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgRWZmZWN0QnVmZmVySGFsSGlkbChzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIH5FZmZlY3RCdWZmZXJIYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBpbml0KCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5YzRjOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0SGFsSGlkbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0SGFsSGlkbCIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPGNvbW1vbi9hbGwtdmVyc2lvbnMvVmVyc2lvblV0aWxzLmg+Ci0jaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgotI2luY2x1ZGUgIkhpZGxVdGlscy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpBdWRpb0J1ZmZlcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkVmZmVjdEJ1ZmZlckFjY2VzczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkVmZmVjdENvbmZpZ1BhcmFtZXRlcnM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpNZXNzYWdlUXVldWVGbGFnQml0czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OlJlc3VsdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkhpZGxVdGlsczsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvQ2hhbm5lbE1hc2s7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0Zvcm1hdDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OnV0aWxzOjpta0VudW1Db252ZXJ0ZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotRWZmZWN0SGFsSGlkbDo6RWZmZWN0SGFsSGlkbChjb25zdCBzcDxJRWZmZWN0PiYgZWZmZWN0LCB1aW50NjRfdCBlZmZlY3RJZCkKLSAgICAgICAgOiBtRWZmZWN0KGVmZmVjdCksIG1FZmZlY3RJZChlZmZlY3RJZCksIG1CdWZmZXJzQ2hhbmdlZCh0cnVlKSwgbUVmR3JvdXAobnVsbHB0cikgewotfQotCi1FZmZlY3RIYWxIaWRsOjp+RWZmZWN0SGFsSGlkbCgpIHsKLSAgICBpZiAobUVmZmVjdCAhPSAwKSB7Ci0gICAgICAgIGNsb3NlKCk7Ci0gICAgICAgIG1FZmZlY3QuY2xlYXIoKTsKLSAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICB9Ci0gICAgaWYgKG1FZkdyb3VwKSB7Ci0gICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKAotICAgICAgICBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiBkZXNjcmlwdG9yLCBlZmZlY3RfZGVzY3JpcHRvcl90KiBoYWxEZXNjcmlwdG9yKSB7Ci0gICAgSGlkbFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci50eXBlLCAmaGFsRGVzY3JpcHRvci0+dHlwZSk7Ci0gICAgSGlkbFV0aWxzOjp1dWlkVG9IYWwoZGVzY3JpcHRvci51dWlkLCAmaGFsRGVzY3JpcHRvci0+dXVpZCk7Ci0gICAgaGFsRGVzY3JpcHRvci0+ZmxhZ3MgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oZGVzY3JpcHRvci5mbGFncyk7Ci0gICAgaGFsRGVzY3JpcHRvci0+Y3B1TG9hZCA9IGRlc2NyaXB0b3IuY3B1TG9hZDsKLSAgICBoYWxEZXNjcmlwdG9yLT5tZW1vcnlVc2FnZSA9IGRlc2NyaXB0b3IubWVtb3J5VXNhZ2U7Ci0gICAgbWVtY3B5KGhhbERlc2NyaXB0b3ItPm5hbWUsIGRlc2NyaXB0b3IubmFtZS5kYXRhKCksIGRlc2NyaXB0b3IubmFtZS5zaXplKCkpOwotICAgIG1lbWNweShoYWxEZXNjcmlwdG9yLT5pbXBsZW1lbnRvciwKLSAgICAgICAgICAgIGRlc2NyaXB0b3IuaW1wbGVtZW50b3IuZGF0YSgpLCBkZXNjcmlwdG9yLmltcGxlbWVudG9yLnNpemUoKSk7Ci19Ci0KLS8vIFRPRE8obW5hZ2Fub3YpOiBUaGVzZSBidWZmZXIgY29udmVyc2lvbiBmdW5jdGlvbnMgc2hvdWxkIGJlIHNoYXJlZCB3aXRoIEVmZmVjdCB3cmFwcGVyCi0vLyB2aWEgSGlkbFV0aWxzLiBNb3ZlIHRoZW0gdGhlcmUgd2hlbiBoYXJkd2FyZS9pbnRlcmZhY2VzIHdpbGwgZ2V0IHVuLWZyb3plbiBhZ2Fpbi4KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoCi0gICAgICAgIGNvbnN0IGJ1ZmZlcl9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RCdWZmZXJDb25maWcqIGNvbmZpZykgewotICAgIGNvbmZpZy0+c2FtcGxpbmdSYXRlSHogPSBoYWxDb25maWcuc2FtcGxpbmdSYXRlOwotICAgIGNvbmZpZy0+Y2hhbm5lbHMgPSBta0VudW1Db252ZXJ0ZXI8QXVkaW9DaGFubmVsTWFzaz4oaGFsQ29uZmlnLmNoYW5uZWxzKTsKLSAgICBjb25maWctPmZvcm1hdCA9IEF1ZGlvRm9ybWF0KGhhbENvbmZpZy5mb3JtYXQpOwotICAgIGNvbmZpZy0+YWNjZXNzTW9kZSA9IEVmZmVjdEJ1ZmZlckFjY2VzcyhoYWxDb25maWcuYWNjZXNzTW9kZSk7Ci0gICAgY29uZmlnLT5tYXNrID0gbWtFbnVtQ29udmVydGVyPEVmZmVjdENvbmZpZ1BhcmFtZXRlcnM+KGhhbENvbmZpZy5tYXNrKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKAotICAgICAgICBjb25zdCBFZmZlY3RCdWZmZXJDb25maWcmIGNvbmZpZywgYnVmZmVyX2NvbmZpZ190KiBoYWxDb25maWcpIHsKLSAgICBoYWxDb25maWctPmJ1ZmZlci5mcmFtZUNvdW50ID0gMDsKLSAgICBoYWxDb25maWctPmJ1ZmZlci5yYXcgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+c2FtcGxpbmdSYXRlID0gY29uZmlnLnNhbXBsaW5nUmF0ZUh6OwotICAgIGhhbENvbmZpZy0+Y2hhbm5lbHMgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oY29uZmlnLmNoYW5uZWxzKTsKLSAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IE5VTEw7Ci0gICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwotICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7Ci0gICAgaGFsQ29uZmlnLT5mb3JtYXQgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcuZm9ybWF0KTsKLSAgICBoYWxDb25maWctPmFjY2Vzc01vZGUgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcuYWNjZXNzTW9kZSk7Ci0gICAgaGFsQ29uZmlnLT5tYXNrID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oY29uZmlnLm1hc2spOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0Q29uZmlnRnJvbUhhbChjb25zdCBlZmZlY3RfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0Q29uZmlnKiBjb25maWcpIHsKLSAgICBlZmZlY3RCdWZmZXJDb25maWdGcm9tSGFsKGhhbENvbmZpZy5pbnB1dENmZywgJmNvbmZpZy0+aW5wdXRDZmcpOwotICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoaGFsQ29uZmlnLm91dHB1dENmZywgJmNvbmZpZy0+b3V0cHV0Q2ZnKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEVmZmVjdEhhbEhpZGw6OmVmZmVjdENvbmZpZ1RvSGFsKGNvbnN0IEVmZmVjdENvbmZpZyYgY29uZmlnLCBlZmZlY3RfY29uZmlnX3QqIGhhbENvbmZpZykgewotICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKGNvbmZpZy5pbnB1dENmZywgJmhhbENvbmZpZy0+aW5wdXRDZmcpOwotICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKGNvbmZpZy5vdXRwdXRDZmcsICZoYWxDb25maWctPm91dHB1dENmZyk7Ci19Ci0KLS8vIHN0YXRpYwotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCkgewotICAgIHN3aXRjaCAocmVzdWx0KSB7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOwotICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKLSAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgY2FzZSBSZXN1bHQ6OlJFU1VMVF9UT09fQklHOiByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICBkZWZhdWx0OiByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgewotICAgIGlmICghbUJ1ZmZlcnNDaGFuZ2VkKSB7Ci0gICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtSW5CdWZmZXIuZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLmdldCgpICE9IG1JbkJ1ZmZlci5nZXQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci0+YXVkaW9CdWZmZXIoKSAhPSBtSW5CdWZmZXItPmF1ZGlvQnVmZmVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbUluQnVmZmVyID0gYnVmZmVyOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0T3V0QnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcikgewotICAgIGlmICghbUJ1ZmZlcnNDaGFuZ2VkKSB7Ci0gICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtT3V0QnVmZmVyLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGJ1ZmZlci5nZXQoKSAhPSBtT3V0QnVmZmVyLmdldCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLT5hdWRpb0J1ZmZlcigpICE9IG1PdXRCdWZmZXItPmF1ZGlvQnVmZmVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbU91dEJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3MoKSB7Ci0gICAgcmV0dXJuIHByb2Nlc3NJbXBsKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6UkVRVUVTVF9QUk9DRVNTKSk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3NSZXZlcnNlKCkgewotICAgIHJldHVybiBwcm9jZXNzSW1wbChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OlJFUVVFU1RfUFJPQ0VTU19SRVZFUlNFKSk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByZXBhcmVGb3JQcm9jZXNzaW5nKCkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROwotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPnByZXBhcmVGb3JQcm9jZXNzaW5nKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBNUURlc2NyaXB0b3JTeW5jPFJlc3VsdD4mIHN0YXR1c01RKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgJiYgdGVtcFN0YXR1c01RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBTdGF0dXNNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLSAgICBpZiAoIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwgIW1FZkdyb3VwKSB7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciBlZmZlY3RzIik7Ci0gICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciBlZmZlY3RzIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgZWZmZWN0cyBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOwotICAgIHJldHVybiBPSzsKLX0KLQotYm9vbCBFZmZlY3RIYWxIaWRsOjpuZWVkVG9SZXNldEJ1ZmZlcnMoKSB7Ci0gICAgaWYgKG1CdWZmZXJzQ2hhbmdlZCkgcmV0dXJuIHRydWU7Ci0gICAgYm9vbCBpbkJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkID0gbUluQnVmZmVyLT5jaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKLSAgICBib29sIG91dEJ1ZmZlckZyYW1lQ291bnRVcGRhdGVkID0gbU91dEJ1ZmZlci0+Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCk7Ci0gICAgcmV0dXJuIGluQnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgfHwgb3V0QnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQ7Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OnByb2Nlc3NJbXBsKHVpbnQzMl90IG1xRmxhZykgewotICAgIGlmIChtRWZmZWN0ID09IDAgfHwgbUluQnVmZmVyID09IDAgfHwgbU91dEJ1ZmZlciA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKCFtU3RhdHVzTVEgJiYgKHN0YXR1cyA9IHByZXBhcmVGb3JQcm9jZXNzaW5nKCkpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIGlmIChuZWVkVG9SZXNldEJ1ZmZlcnMoKSAmJiAoc3RhdHVzID0gc2V0UHJvY2Vzc0J1ZmZlcnMoKSkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgLy8gVGhlIGRhdGEgaXMgYWxyZWFkeSBpbiB0aGUgYnVmZmVycywganVzdCBuZWVkIHRvIGZsdXNoIGl0IGFuZCB3YWtlIHVwIHRoZSBzZXJ2ZXIgc2lkZS4KLSAgICBzdGQ6OmF0b21pY190aHJlYWRfZmVuY2Uoc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSk7Ci0gICAgbUVmR3JvdXAtPndha2UobXFGbGFnKTsKLSAgICB1aW50MzJfdCBlZlN0YXRlID0gMDsKLXJldHJ5OgotICAgIHN0YXR1c190IHJldCA9IG1FZkdyb3VwLT53YWl0KAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpET05FX1BST0NFU1NJTkcpLCAmZWZTdGF0ZSk7Ci0gICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OkRPTkVfUFJPQ0VTU0lORykpIHsKLSAgICAgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgICAgICBtU3RhdHVzTVEtPnJlYWQoJnJldHZhbCk7Ci0gICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSyB8fCByZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX1NUQVRFKSB7Ci0gICAgICAgICAgICAvLyBTeW5jIGJhY2sgdGhlIGNoYW5nZWQgY29udGVudHMgb2YgdGhlIGJ1ZmZlci4KLSAgICAgICAgICAgIHN0ZDo6YXRvbWljX3RocmVhZF9mZW5jZShzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYW5hbHl6ZVJlc3VsdChyZXR2YWwpOwotICAgIH0KLSAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgewotICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KLSAgICAgICAgZ290byByZXRyeTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0UHJvY2Vzc0J1ZmZlcnMoKSB7Ci0gICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gbUVmZmVjdC0+c2V0UHJvY2Vzc0J1ZmZlcnMoCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4obUluQnVmZmVyLmdldCgpKS0+aGlkbEJ1ZmZlcigpLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0QnVmZmVySGFsSGlkbCo+KG1PdXRCdWZmZXIuZ2V0KCkpLT5oaWRsQnVmZmVyKCkpOwotICAgIGlmIChyZXQuaXNPaygpICYmIHJldCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIG1CdWZmZXJzQ2hhbmdlZCA9IGZhbHNlOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAotICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKSB7Ci0gICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0KLSAgICAvLyBTcGVjaWFsIGNhc2VzLgotICAgIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJRyB8fCBjbWRDb2RlID09IEVGRkVDVF9DTURfU0VUX0NPTkZJR19SRVZFUlNFKSB7Ci0gICAgICAgIHJldHVybiBzZXRDb25maWdJbXBsKGNtZENvZGUsIGNtZFNpemUsIHBDbWREYXRhLCByZXBseVNpemUsIHBSZXBseURhdGEpOwotICAgIH0gZWxzZSBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUcgfHwgY21kQ29kZSA9PSBFRkZFQ1RfQ01EX0dFVF9DT05GSUdfUkVWRVJTRSkgewotICAgICAgICByZXR1cm4gZ2V0Q29uZmlnSW1wbChjbWRDb2RlLCByZXBseVNpemUsIHBSZXBseURhdGEpOwotICAgIH0KLQotICAgIC8vIENvbW1vbiBjYXNlLgotICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGhpZGxEYXRhOwotICAgIGlmIChwQ21kRGF0YSAhPSBudWxscHRyICYmIGNtZFNpemUgPiAwKSB7Ci0gICAgICAgIGhpZGxEYXRhLnNldFRvRXh0ZXJuYWwocmVpbnRlcnByZXRfY2FzdDx1aW50OF90Kj4ocENtZERhdGEpLCBjbWRTaXplKTsKLSAgICB9Ci0gICAgc3RhdHVzX3Qgc3RhdHVzOwotICAgIHVpbnQzMl90IHJlcGx5U2l6ZVN0dWIgPSAwOwotICAgIGlmIChyZXBseVNpemUgPT0gbnVsbHB0ciB8fCBwUmVwbHlEYXRhID09IG51bGxwdHIpIHJlcGx5U2l6ZSA9ICZyZXBseVNpemVTdHViOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5jb21tYW5kKGNtZENvZGUsIGhpZGxEYXRhLCAqcmVwbHlTaXplLAotICAgICAgICAgICAgWyZdKGludDMyX3QgcywgY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgqcmVwbHlTaXplID4gcmVzdWx0LnNpemUoKSkgKnJlcGx5U2l6ZSA9IHJlc3VsdC5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwUmVwbHlEYXRhICE9IG51bGxwdHIgJiYgKnJlcGx5U2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lbWNweShwUmVwbHlEYXRhLCAmcmVzdWx0WzBdLCAqcmVwbHlTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiByZXQuaXNPaygpID8gc3RhdHVzIDogRkFJTEVEX1RSQU5TQUNUSU9OOwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpnZXREZXNjcmlwdG9yKGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7Ci0gICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0LT5nZXREZXNjcmlwdG9yKAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBFZmZlY3REZXNjcmlwdG9yJiByZXN1bHQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBlZmZlY3REZXNjcmlwdG9yVG9IYWwocmVzdWx0LCBwRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmNsb3NlKCkgewotICAgIGlmIChtRWZmZWN0ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJldHVybjxSZXN1bHQ+IHJldCA9IG1FZmZlY3QtPmNsb3NlKCk7Ci0gICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Ci19Ci0KLXN0YXR1c190IEVmZmVjdEhhbEhpZGw6OmdldENvbmZpZ0ltcGwoCi0gICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKLSAgICBpZiAocmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIFJldHVybjx2b2lkPiByZXQ7Ci0gICAgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHKSB7Ci0gICAgICAgIHJldCA9IG1FZmZlY3QtPmdldENvbmZpZyhbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7Ci0gICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWdSZXZlcnNlKFsmXSAoUmVzdWx0IHIsIGNvbnN0IEVmZmVjdENvbmZpZyAmaGlkbENvbmZpZykgewotICAgICAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyKTsKLSAgICAgICAgICAgIGlmIChyID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICBlZmZlY3RDb25maWdUb0hhbChoaWRsQ29uZmlnLCBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwUmVwbHlEYXRhKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLSAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgcmVzdWx0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRDb25maWdJbXBsKAotICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgewotICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwKLSAgICAgICAgICAgIHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBjb25zdCBlZmZlY3RfY29uZmlnX3QgKmhhbENvbmZpZyA9IHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBDbWREYXRhKTsKLSAgICBpZiAoaGFsQ29uZmlnLT5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAotICAgICAgICAgICAgaGFsQ29uZmlnLT5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyICE9IE5VTEwgfHwKLSAgICAgICAgICAgIGhhbENvbmZpZy0+b3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAhPSBOVUxMIHx8Ci0gICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkJ1ZmZlciBwcm92aWRlciBjYWxsYmFja3MgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKLSAgICB9Ci0gICAgRWZmZWN0Q29uZmlnIGhpZGxDb25maWc7Ci0gICAgZWZmZWN0Q29uZmlnRnJvbUhhbCgqaGFsQ29uZmlnLCAmaGlkbENvbmZpZyk7Ci0gICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgPwotICAgICAgICAgICAgbUVmZmVjdC0+c2V0Q29uZmlnKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpIDoKLSAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZ1JldmVyc2UoaGlkbENvbmZpZywgbnVsbHB0ciwgbnVsbHB0cik7Ci0gICAgc3RhdHVzX3QgcmVzdWx0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocmV0KTsKLSAgICAgICAgKnN0YXRpY19jYXN0PGludDMyX3QqPihwUmVwbHlEYXRhKSA9IHJlc3VsdDsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RIYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhNGRhYjEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdEhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF80XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF80XzBfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvNC4wL0lFZmZlY3QuaD4KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxmbXEvRXZlbnRGbGFnLmg+Ci0jaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3QuaD4KLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6RWZmZWN0QnVmZmVyQ29uZmlnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6RWZmZWN0Q29uZmlnOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6RWZmZWN0RGVzY3JpcHRvcjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OklFZmZlY3Q7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpFdmVudEZsYWc7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNZXNzYWdlUXVldWU7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRWZmZWN0SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RIYWxJbnRlcmZhY2UKLXsKLSAgcHVibGljOgotICAgIC8vIFNldCB0aGUgaW5wdXQgYnVmZmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKTsKLQotICAgIC8vIFNldCB0aGUgb3V0cHV0IGJ1ZmZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dEJ1ZmZlcihjb25zdCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+JiBidWZmZXIpOwotCi0gICAgLy8gRWZmZWN0IHByb2Nlc3MgZnVuY3Rpb24uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzKCk7Ci0KLSAgICAvLyBQcm9jZXNzIHJldmVyc2Ugc3RyZWFtIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGFzcwotICAgIC8vIGEgcmVmZXJlbmNlIHN0cmVhbSB0byB0aGUgZWZmZWN0IGVuZ2luZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb2Nlc3NSZXZlcnNlKCk7Ci0KLSAgICAvLyBTZW5kIGEgY29tbWFuZCBhbmQgcmVjZWl2ZSBhIHJlc3BvbnNlIHRvL2Zyb20gZWZmZWN0IGVuZ2luZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbW1hbmQodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCi0gICAgICAgICAgICB1aW50MzJfdCAqcmVwbHlTaXplLCB2b2lkICpwUmVwbHlEYXRhKTsKLQotICAgIC8vIFJldHVybnMgdGhlIGVmZmVjdCBkZXNjcmlwdG9yLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RGVzY3JpcHRvcihlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7Ci0KLSAgICAvLyBGcmVlIHJlc291cmNlcyBvbiB0aGUgcmVtb3RlIHNpZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZSgpOwotCi0gICAgLy8gV2hldGhlciBpdCdzIGEgbG9jYWwgaW1wbGVtZW50YXRpb24uCi0gICAgdmlydHVhbCBib29sIGlzTG9jYWwoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0gICAgdWludDY0X3QgZWZmZWN0SWQoKSBjb25zdCB7IHJldHVybiBtRWZmZWN0SWQ7IH0KLQotICAgIHN0YXRpYyB2b2lkIGVmZmVjdERlc2NyaXB0b3JUb0hhbCgKLSAgICAgICAgICAgIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIGhhbERlc2NyaXB0b3IpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbDsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTwKLSAgICAgICAgaGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OlJlc3VsdCwgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROwotCi0gICAgc3A8SUVmZmVjdD4gbUVmZmVjdDsKLSAgICBjb25zdCB1aW50NjRfdCBtRWZmZWN0SWQ7Ci0gICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBtSW5CdWZmZXI7Ci0gICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBtT3V0QnVmZmVyOwotICAgIGJvb2wgbUJ1ZmZlcnNDaGFuZ2VkOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gbVN0YXR1c01ROwotICAgIEV2ZW50RmxhZyogbUVmR3JvdXA7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgYW5hbHl6ZVJlc3VsdChjb25zdCBoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6UmVzdWx0JiByZXN1bHQpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoCi0gICAgICAgICAgICBjb25zdCBidWZmZXJfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0QnVmZmVyQ29uZmlnKiBjb25maWcpOwotICAgIHN0YXRpYyB2b2lkIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKAotICAgICAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBlZmZlY3RDb25maWdGcm9tSGFsKGNvbnN0IGVmZmVjdF9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RDb25maWcqIGNvbmZpZyk7Ci0gICAgc3RhdGljIHZvaWQgZWZmZWN0Q29uZmlnVG9IYWwoY29uc3QgRWZmZWN0Q29uZmlnJiBjb25maWcsIGVmZmVjdF9jb25maWdfdCogaGFsQ29uZmlnKTsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBFZmZlY3RIYWxIaWRsKGNvbnN0IHNwPElFZmZlY3Q+JiBlZmZlY3QsIHVpbnQ2NF90IGVmZmVjdElkKTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgcmVsZWFzZXMgdGhlIGVmZmVjdC4KLSAgICB2aXJ0dWFsIH5FZmZlY3RIYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBnZXRDb25maWdJbXBsKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOwotICAgIHN0YXR1c190IHByZXBhcmVGb3JQcm9jZXNzaW5nKCk7Ci0gICAgYm9vbCBuZWVkVG9SZXNldEJ1ZmZlcnMoKTsKLSAgICBzdGF0dXNfdCBwcm9jZXNzSW1wbCh1aW50MzJfdCBtcUZsYWcpOwotICAgIHN0YXR1c190IHNldENvbmZpZ0ltcGwoCi0gICAgICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKLSAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOwotICAgIHN0YXR1c190IHNldFByb2Nlc3NCdWZmZXJzKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZlZDc4NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotI2luY2x1ZGUgPGxpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaD4KLQotI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCi0jaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgotI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKLSNpbmNsdWRlICJIaWRsVXRpbHMuaCIKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6SGlkbFV0aWxzOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6VXVpZDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OklFZmZlY3Q7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpSZXN1bHQ7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKSA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJFZmZlY3RzRmFjdG9yeSIpIHsKLSAgICBtRWZmZWN0c0ZhY3RvcnkgPSBJRWZmZWN0c0ZhY3Rvcnk6OmdldFNlcnZpY2UoKTsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBvYnRhaW4gSUVmZmVjdHNGYWN0b3J5IHNlcnZpY2UsIHRlcm1pbmF0aW5nIHByb2Nlc3MuIik7Ci0gICAgICAgIGV4aXQoMSk7Ci0gICAgfQotfQotCi1FZmZlY3RzRmFjdG9yeUhhbEhpZGw6On5FZmZlY3RzRmFjdG9yeUhhbEhpZGwoKSB7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6cXVlcnlBbGxEZXNjcmlwdG9ycygpIHsKLSAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5nZXRBbGxEZXNjcmlwdG9ycygKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgaGlkbF92ZWM8RWZmZWN0RGVzY3JpcHRvcj4mIHJlc3VsdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MYXN0RGVzY3JpcHRvcnMgPSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKHJldC5pc09rKCkpIHsKLSAgICAgICAgcmV0dXJuIHJldHZhbCA9PSBSZXN1bHQ6Ok9LID8gT0sgOiBOT19JTklUOwotICAgIH0KLSAgICBtTGFzdERlc2NyaXB0b3JzLnJlc2l6ZSgwKTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6cXVlcnlOdW1iZXJFZmZlY3RzKHVpbnQzMl90ICpwTnVtRWZmZWN0cykgewotICAgIHN0YXR1c190IHF1ZXJ5UmVzdWx0ID0gcXVlcnlBbGxEZXNjcmlwdG9ycygpOwotICAgIGlmIChxdWVyeVJlc3VsdCA9PSBPSykgewotICAgICAgICAqcE51bUVmZmVjdHMgPSBtTGFzdERlc2NyaXB0b3JzLnNpemUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHF1ZXJ5UmVzdWx0OwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmdldERlc2NyaXB0b3IoCi0gICAgICAgIHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcikgewotICAgIC8vIFRPRE86IFdlIG5lZWQgc29tZWhvdyB0byB0cmFjayB0aGUgY2hhbmdlcyBvbiB0aGUgc2VydmVyIHNpZGUKLSAgICAvLyBvciBmaWd1cmUgb3V0IGhvdyB0byBjb252ZXJ0IGV2ZXJ5Ym9keSB0byBxdWVyeSBhbGwgdGhlIGRlc2NyaXB0b3JzIGF0IG9uY2UuCi0gICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKLSAgICBpZiAobUxhc3REZXNjcmlwdG9ycy5zaXplKCkgPT0gMCkgewotICAgICAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKLSAgICAgICAgaWYgKHF1ZXJ5UmVzdWx0ICE9IE9LKSByZXR1cm4gcXVlcnlSZXN1bHQ7Ci0gICAgfQotICAgIGlmIChpbmRleCA+PSBtTGFzdERlc2NyaXB0b3JzLnNpemUoKSkgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChtTGFzdERlc2NyaXB0b3JzW2luZGV4XSwgcERlc2NyaXB0b3IpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAotICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKLSAgICAvLyBUT0RPOiBjaGVjayBmb3IgbnVsbHB0cgotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgVXVpZCBoaWRsVXVpZDsKLSAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKLSAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Z2V0RGVzY3JpcHRvcihoaWRsVXVpZCwKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgRWZmZWN0RGVzY3JpcHRvciYgcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0RGVzY3JpcHRvclRvSGFsKHJlc3VsdCwgcERlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIGlmIChyZXQuaXNPaygpKSB7Ci0gICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOwotICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwotICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Y3JlYXRlRWZmZWN0KAotICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwKLSAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KSB7Ci0gICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBVdWlkIGhpZGxVdWlkOwotICAgIEhpZGxVdGlsczo6dXVpZEZyb21IYWwoKnBFZmZlY3RVdWlkLCAmaGlkbFV1aWQpOwotICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5jcmVhdGVFZmZlY3QoCi0gICAgICAgICAgICBoaWRsVXVpZCwgc2Vzc2lvbklkLCBpb0lkLAotICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRWZmZWN0PiYgcmVzdWx0LCB1aW50NjRfdCBlZmZlY3RJZCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICplZmZlY3QgPSBuZXcgRWZmZWN0SGFsSGlkbChyZXN1bHQsIGVmZmVjdElkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICBpZiAocmV0LmlzT2soKSkgewotICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKLSAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOwotfQotCi1zdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmR1bXBFZmZlY3RzKGludCBmZCkgewotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoaWRsSGFuZGxlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwgMCk7Ci0gICAgaGlkbEhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmRlYnVnKGhpZGxIYW5kbGUsIHt9IC8qIG9wdGlvbnMgKi8pOwotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKF9fRlVOQ1RJT05fXywgcmV0KTsKLX0KLQotc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjphbGxvY2F0ZUJ1ZmZlcihzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7Ci0gICAgcmV0dXJuIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmFsbG9jYXRlKHNpemUsIGJ1ZmZlcik7Ci19Ci0KLXN0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6bWlycm9yQnVmZmVyKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7Ci0gICAgcmV0dXJuIEVmZmVjdEJ1ZmZlckhhbEhpZGw6Om1pcnJvcihleHRlcm5hbCwgc2l6ZSwgYnVmZmVyKTsKLX0KLQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsSGlkbC5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhMmY1ZjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbEhpZGwuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsODI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbEhpZGwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvLzQuMC9JU3RyZWFtT3V0Q2FsbGJhY2suaD4KLSNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKLSNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCi0jaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgotI2luY2x1ZGUgIlZlcnNpb25VdGlscy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb0NoYW5uZWxNYXNrOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Db250ZW50VHlwZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OlY0XzA6OkF1ZGlvRm9ybWF0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6QXVkaW9Tb3VyY2U7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpWNF8wOjpBdWRpb1VzYWdlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6VjRfMDo6VGhyZWFkSW5mbzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpBdWRpb0RyYWluOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1PdXRDYWxsYmFjazsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpNZXNzYWdlUXVldWVGbGFnQml0czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpNaWNyb3Bob25lSW5mbzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpNbWFwQnVmZmVySW5mbzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpNbWFwUG9zaXRpb247Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UGFyYW1ldGVyVmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UGxheWJhY2tUcmFja01ldGFkYXRhOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlJlY29yZFRyYWNrTWV0YWRhdGE7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OlRpbWVTcGVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TVFEZXNjcmlwdG9yU3luYzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Ci11c2luZyBSZWFkQ29tbWFuZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtSW46OlJlYWRDb21tYW5kOwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLVN0cmVhbUhhbEhpZGw6OlN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKQotICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJTdHJlYW0iKSwKLSAgICAgICAgICBtU3RyZWFtKHN0cmVhbSksCi0gICAgICAgICAgbUhhbFRocmVhZFByaW9yaXR5KEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCksCi0gICAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUoMCl7Ci0KLSAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgotICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCi0gICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkpIHsKLSAgICAgICAgLy8gT2J0YWluIGF1ZGlvIHByb3BlcnRpZXMgKHNlZSBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoKSBiZWxvdykuCi0gICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBdWRpb1Byb3BlcnRpZXMoCi0gICAgICAgICAgICAgICAgWyZdKGF1dG8gc3IsIGF1dG8gbSwgYXV0byBmKSB7Ci0gICAgICAgICAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQoc3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obSksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZikpOwotICAgICAgICAgICAgfSk7Ci0gICAgfQotfQotCi1TdHJlYW1IYWxIaWRsOjp+U3RyZWFtSGFsSGlkbCgpIHsKLSAgICBtU3RyZWFtID0gbnVsbHB0cjsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFNhbXBsZVJhdGUiLCBtU3RyZWFtLT5nZXRTYW1wbGVSYXRlKCksIHJhdGUpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigiZ2V0QnVmZmVyU2l6ZSIsIG1TdHJlYW0tPmdldEJ1ZmZlclNpemUoKSwgc2l6ZSk7Ci0gICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICBtQ2FjaGVkQnVmZmVyU2l6ZSA9ICpzaXplOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaykgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldENoYW5uZWxNYXNrIiwgbVN0cmVhbS0+Z2V0Q2hhbm5lbE1hc2soKSwgbWFzayk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Rm9ybWF0IiwgbVN0cmVhbS0+Z2V0Rm9ybWF0KCksIGZvcm1hdCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgWyZdKHVpbnQzMl90IHNyLCBhdXRvIG0sIGF1dG8gZikgewotICAgICAgICAgICAgICAgICpzYW1wbGVSYXRlID0gc3I7Ci0gICAgICAgICAgICAgICAgKm1hc2sgPSBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4obSk7Ci0gICAgICAgICAgICAgICAgKmZvcm1hdCA9IHN0YXRpY19jYXN0PGF1ZGlvX2Zvcm1hdF90PihmKTsKLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBdWRpb1Byb3BlcnRpZXMiLCByZXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRQYXJhbWV0ZXJzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1dGlsczo6c2V0UGFyYW1ldGVycyhtU3RyZWFtLCBoaWRsUGFyYW1zLCB7fSAvKiBvcHRpb25zICovKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKSB7Ci0gICAgdmFsdWVzLT5jbGVhcigpOwotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGtleXNGcm9tSGFsKGtleXMsICZoaWRsS2V5cyk7Ci0gICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSB1dGlsczo6Z2V0UGFyYW1ldGVycygKLSAgICAgICAgICAgIG1TdHJlYW0sCi0gICAgICAgICAgICB7fSAvKiBjb250ZXh0ICovLAotICAgICAgICAgICAgaGlkbEtleXMsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycykgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnNUb0hhbChwYXJhbWV0ZXJzLCB2YWx1ZXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQYXJhbWV0ZXJzIiwgcmV0LCByZXR2YWwpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjphZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJhZGRFZmZlY3QiLCBtU3RyZWFtLT5hZGRFZmZlY3QoCi0gICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbEhpZGw6OnJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbW92ZUVmZmVjdCIsIG1TdHJlYW0tPnJlbW92ZUVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RhbmRieSgpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdGFuZGJ5IiwgbVN0cmVhbS0+c3RhbmRieSgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6ZHVtcChpbnQgZmQpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7Ci0gICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7Ci0gICAgbVN0cmVhbVBvd2VyTG9nLmR1bXAoZmQpOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJkdW1wIiwgcmV0KTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RhcnQoKSB7Ci0gICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhcnQiLCBtU3RyZWFtLT5zdGFydCgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c3RvcCgpIHsKLSAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzdG9wIiwgbVN0cmVhbS0+c3RvcCgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5jcmVhdGVNbWFwQnVmZmVyKAotICAgICAgICAgICAgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcEJ1ZmZlckluZm8mIGhpZGxJbmZvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgbmF0aXZlX2hhbmRsZSAqaGFuZGxlID0gaGlkbEluZm8uc2hhcmVkTWVtb3J5LmhhbmRsZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLT5udW1GZHMgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2ZkID0gaGFuZGxlLT5kYXRhWzBdOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+ZmxhZ3MgPSBhdWRpb19tbWFwX2J1ZmZlcl9mbGFnKGhpZGxJbmZvLmZsYWdzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyA9IGhpZGxJbmZvLmJ1ZmZlclNpemVGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWdhdGl2ZSBidWZmZXIgc2l6ZSBmcmFtZSB3YXMgYSBoYWNrIGluIE8gYW5kIFAgdG8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRoYXQgdGhlIGJ1ZmZlciBpcyBzaGFyZWFibGUgdG8gYXBwbGljYXRpb25zCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzIDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyAqPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyA9IGF1ZGlvX21tYXBfYnVmZmVyX2ZsYWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyB8IEFVRElPX01NQVBfQVBQTElDQVRJT05fU0hBUkVBQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1cnN0X3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVyc3RTaXplRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mby0+c2hhcmVkX21lbW9yeV9hZGRyZXNzIGlzIG5vdCBuZWVkZWQgaW4gSElETCBjb250ZXh0Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiY3JlYXRlTW1hcEJ1ZmZlciIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgewotICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE1tYXBQb3NpdGlvbigKLSAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcFBvc2l0aW9uJiBoaWRsUG9zaXRpb24pIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi0+dGltZV9uYW5vc2Vjb25kcyA9IGhpZGxQb3NpdGlvbi50aW1lTmFub3NlY29uZHM7Ci0gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT5wb3NpdGlvbl9mcmFtZXMgPSBoaWRsUG9zaXRpb24ucG9zaXRpb25GcmFtZXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1tYXBQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KSB7Ci0gICAgbUhhbFRocmVhZFByaW9yaXR5ID0gcHJpb3JpdHk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgewotICAgIGlmIChtQ2FjaGVkQnVmZmVyU2l6ZSAhPSAwKSB7Ci0gICAgICAgICpzaXplID0gbUNhY2hlZEJ1ZmZlclNpemU7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0gICAgcmV0dXJuIGdldEJ1ZmZlclNpemUoc2l6ZSk7Ci19Ci0KLWJvb2wgU3RyZWFtSGFsSGlkbDo6cmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpIHsKLSAgICBpZiAobUhhbFRocmVhZFByaW9yaXR5ID09IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaW50IGVyciA9IHJlcXVlc3RQcmlvcml0eSgKLSAgICAgICAgICAgIHRocmVhZFBpZCwgdGhyZWFkSWQsCi0gICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIGZhbHNlIC8qaXNGb3JBcHAqLywgdHJ1ZSAvKmFzeW5jaHJvbm91cyovKTsKLSAgICBBTE9HRV9JRihlcnIsICJmYWlsZWQgdG8gc2V0IHByaW9yaXR5ICVkIGZvciBwaWQgJWQgdGlkICVkOyBlcnJvciAlZCIsCi0gICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIHRocmVhZFBpZCwgdGhyZWFkSWQsIGVycik7Ci0gICAgLy8gQXVkaW8gd2lsbCBzdGlsbCB3b3JrLCBidXQgbGF0ZW5jeSB3aWxsIGJlIGhpZ2hlciBhbmQgc29tZXRpbWVzIHVuYWNjZXB0YWJsZS4KLSAgICByZXR1cm4gZXJyID09IDA7Ci19Ci0KLW5hbWVzcGFjZSB7Ci0KLS8qIE5vdGVzIG9uIGNhbGxiYWNrIG93bmVyc2hpcC4KLQotVGhpcyBpcyBob3cgKEh3KUJpbmRlciBvd25lcnNoaXAgbW9kZWwgbG9va3MgbGlrZS4gVGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgotaXMgb3duZWQgYnkgQmluZGVyIGZyYW1ld29yayAodmlhIHNwPD4pLiBQcm94aWVzIGFyZSBvd25lZCBieSBjbGllbnRzLgotV2hlbiB0aGUgbGFzdCBwcm94eSBkaXNhcHBlYXJzLCBCaW5kZXIgZnJhbWV3b3JrIHJlbGVhc2VzIHRoZSBzZXJ2ZXIgaW1wbC4KLQotVGh1cywgaXQgaXMgbm90IG5lZWRlZCB0byBrZWVwIGFueSByZWZlcmVuY2VzIHRvIFN0cmVhbU91dENhbGxiYWNrICh0aGlzIGlzCi10aGUgc2VydmVyIGltcGwpIC0tIGl0IHdpbGwgbGl2ZSBhcyBsb25nIGFzIEhBTCBzZXJ2ZXIgaG9sZHMgYSBzdHJvbmcgcmVmIHRvCi1JU3RyZWFtT3V0Q2FsbGJhY2sgcHJveHkuIFdlIGNsZWFyIHRoYXQgcmVmZXJlbmNlIGJ5IGNhbGxpbmcgJ2NsZWFyQ2FsbGJhY2snCi1mcm9tIHRoZSBkZXN0cnVjdG9yIG9mIFN0cmVhbU91dEhhbEhpZGwuCi0KLVRoZSBjYWxsYmFjayBvbmx5IGtlZXBzIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBvd25lZAotYnkgQXVkaW9GbGluZ2VyLgotCi0qLwotCi1zdHJ1Y3QgU3RyZWFtT3V0Q2FsbGJhY2sgOiBwdWJsaWMgSVN0cmVhbU91dENhbGxiYWNrIHsKLSAgICBTdHJlYW1PdXRDYWxsYmFjayhjb25zdCB3cDxTdHJlYW1PdXRIYWxIaWRsPiYgc3RyZWFtKSA6IG1TdHJlYW0oc3RyZWFtKSB7fQotCi0gICAgLy8gSVN0cmVhbU91dENhbGxiYWNrIGltcGxlbWVudGF0aW9uCi0gICAgUmV0dXJuPHZvaWQ+IG9uV3JpdGVSZWFkeSgpICBvdmVycmlkZSB7Ci0gICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOwotICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKLSAgICAgICAgICAgIHN0cmVhbS0+b25Xcml0ZVJlYWR5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gb25EcmFpblJlYWR5KCkgIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChzdHJlYW0gIT0gMCkgewotICAgICAgICAgICAgc3RyZWFtLT5vbkRyYWluUmVhZHkoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBvbkVycm9yKCkgIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChzdHJlYW0gIT0gMCkgewotICAgICAgICAgICAgc3RyZWFtLT5vbkVycm9yKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgcHJpdmF0ZToKLSAgICB3cDxTdHJlYW1PdXRIYWxIaWRsPiBtU3RyZWFtOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLVN0cmVhbU91dEhhbEhpZGw6OlN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSkKLSAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVdyaXRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgewotfQotCi1TdHJlYW1PdXRIYWxIaWRsOjp+U3RyZWFtT3V0SGFsSGlkbCgpIHsKLSAgICBpZiAobVN0cmVhbSAhPSAwKSB7Ci0gICAgICAgIGlmIChtQ2FsbGJhY2sudW5zYWZlX2dldCgpKSB7Ci0gICAgICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbGVhckNhbGxiYWNrIiwgbVN0cmVhbS0+Y2xlYXJDYWxsYmFjaygpKTsKLSAgICAgICAgfQotICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOwotICAgICAgICBtU3RyZWFtLmNsZWFyKCk7Ci0gICAgfQotICAgIG1DYWxsYmFjay5jbGVhcigpOwotICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0gICAgaWYgKG1FZkdyb3VwKSB7Ci0gICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKLSAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfTEFURU5DWSwgImdldExhdGVuY3kiLCBudWxscHRyLCAwLAotICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKLSAgICAgICAgICAgICAgICAgICAgKmxhdGVuY3kgPSB3cml0ZVN0YXR1cy5yZXBseS5sYXRlbmN5TXM7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldExhdGVuY3kiLCBtU3RyZWFtLT5nZXRMYXRlbmN5KCksIGxhdGVuY3kpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvbHVtZSIsIG1TdHJlYW0tPnNldFZvbHVtZShsZWZ0LCByaWdodCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgKndyaXR0ZW4gPSAwOwotCi0gICAgaWYgKGJ5dGVzID09IDAgJiYgIW1EYXRhTVEpIHsKLSAgICAgICAgLy8gQ2FuJ3QgZGV0ZXJtaW5lIHRoZSBzaXplIGZvciB0aGUgTVEgYnVmZmVyLiBXYWl0IGZvciBhIG5vbi1lbXB0eSB3cml0ZSByZXF1ZXN0LgotICAgICAgICBBTE9HV19JRihtQ2FsbGJhY2sudW5zYWZlX2dldCgpLCAiRmlyc3QgY2FsbCB0byBhc3luYyB3cml0ZSB3aXRoIDAgYnl0ZXMiKTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHN0YXR1c190IHN0YXR1czsKLSAgICBpZiAoIW1EYXRhTVEpIHsKLSAgICAgICAgLy8gSW4gY2FzZSBpZiBwbGF5YmFjayBzdGFydHMgY2xvc2UgdG8gdGhlIGVuZCBvZiBhIGNvbXByZXNzZWQgdHJhY2ssIHRoZSBieXRlcwotICAgICAgICAvLyB0aGF0IG5lZWQgdG8gYmUgd3JpdHRlbiBpcyBsZXNzIHRoYW4gdGhlIGFjdHVhbCBidWZmZXIgc2l6ZS4gTmVlZCB0byB1c2UKLSAgICAgICAgLy8gZnVsbCBidWZmZXIgc2l6ZSBmb3IgdGhlIE1RIHNpbmNlIG90aGVyd2lzZSBhZnRlciBzZWVraW5nIGJhY2sgdG8gdGhlIG1pZGRsZQotICAgICAgICAvLyBkYXRhIHdpbGwgYmUgdHJ1bmNhdGVkLgotICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZTsKLSAgICAgICAgaWYgKChzdGF0dXMgPSBnZXRDYWNoZWRCdWZmZXJTaXplKCZidWZmZXJTaXplKSkgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ5dGVzID4gYnVmZmVyU2l6ZSkgYnVmZmVyU2l6ZSA9IGJ5dGVzOwotICAgICAgICBpZiAoKHN0YXR1cyA9IHByZXBhcmVGb3JXcml0aW5nKGJ1ZmZlclNpemUpKSAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXR1cyA9IGNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgICAgICBXcml0ZUNvbW1hbmQ6OldSSVRFLCAid3JpdGUiLCBzdGF0aWNfY2FzdDxjb25zdCB1aW50OF90Kj4oYnVmZmVyKSwgYnl0ZXMsCi0gICAgICAgICAgICBbJl0gKGNvbnN0IFdyaXRlU3RhdHVzJiB3cml0ZVN0YXR1cykgewotICAgICAgICAgICAgICAgICp3cml0dGVuID0gd3JpdGVTdGF0dXMucmVwbHkud3JpdHRlbjsKLSAgICAgICAgICAgICAgICAvLyBEaWFnbm9zdGljcyBvZiB0aGUgY2F1c2Ugb2YgYi8zNTgxMzExMy4KLSAgICAgICAgICAgICAgICBBTE9HRV9JRigqd3JpdHRlbiA+IGJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgImhhbCByZXBvcnRzIG1vcmUgYnl0ZXMgd3JpdHRlbiB0aGFuIGFza2VkIGZvcjogJWxsZCA+ICVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZykqd3JpdHRlbiwgKGxvbmcgbG9uZylieXRlcyk7Ci0gICAgICAgICAgICB9KTsKLSAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKndyaXR0ZW4pOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmNhbGxXcml0ZXJUaHJlYWQoCi0gICAgICAgIFdyaXRlQ29tbWFuZCBjbWQsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBkYXRhU2l6ZSwgU3RyZWFtT3V0SGFsSGlkbDo6V3JpdGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZjbWQpKSB7Ci0gICAgICAgIEFMT0dFKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKLSAgICAgICAgcmV0dXJuIC1FQUdBSU47Ci0gICAgfQotICAgIGlmIChkYXRhICE9IG51bGxwdHIpIHsKLSAgICAgICAgc2l6ZV90IGF2YWlsYWJsZVRvV3JpdGUgPSBtRGF0YU1RLT5hdmFpbGFibGVUb1dyaXRlKCk7Ci0gICAgICAgIGlmIChkYXRhU2l6ZSA+IGF2YWlsYWJsZVRvV3JpdGUpIHsKLSAgICAgICAgICAgIEFMT0dXKCJ0cnVuY2F0aW5nIHdyaXRlIGRhdGEgZnJvbSAlbGxkIHRvICVsbGQgZHVlIHRvIGluc3VmZmljaWVudCBkYXRhIHF1ZXVlIHNwYWNlIiwKLSAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkYXRhU2l6ZSwgKGxvbmcgbG9uZylhdmFpbGFibGVUb1dyaXRlKTsKLSAgICAgICAgICAgIGRhdGFTaXplID0gYXZhaWxhYmxlVG9Xcml0ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1EYXRhTVEtPndyaXRlKGRhdGEsIGRhdGFTaXplKSkgewotICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1FZkdyb3VwLT53YWtlKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSk7Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgotICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOwotcmV0cnk6Ci0gICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCksICZlZlN0YXRlKTsKLSAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpKSB7Ci0gICAgICAgIFdyaXRlU3RhdHVzIHdyaXRlU3RhdHVzOwotICAgICAgICB3cml0ZVN0YXR1cy5yZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKLSAgICAgICAgaWYgKCFtU3RhdHVzTVEtPnJlYWQoJndyaXRlU3RhdHVzKSkgewotICAgICAgICAgICAgQUxPR0UoInN0YXR1cyBtZXNzYWdlIHJlYWQgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZiAod3JpdGVTdGF0dXMucmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgIHJldCA9IE9LOwotICAgICAgICAgICAgY2FsbGJhY2sod3JpdGVTdGF0dXMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCB3cml0ZVN0YXR1cy5yZXR2YWwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7Ci0gICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgotICAgICAgICBnb3RvIHJldHJ5OwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpwcmVwYXJlRm9yV3JpdGluZyhzaXplX3QgYnVmZmVyU2l6ZSkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IHRlbXBDb21tYW5kTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gdGVtcERhdGFNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIHBpZF90IGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5wcmVwYXJlRm9yV3JpdGluZygKLSAgICAgICAgICAgIDEsIGJ1ZmZlclNpemUsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1hbmRNUTo6RGVzY3JpcHRvciYgY29tbWFuZE1RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTVE6OkRlc2NyaXB0b3ImIGRhdGFNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdHVzTVE6OkRlc2NyaXB0b3ImIHN0YXR1c01RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWRJbmZvJiBoYWxUaHJlYWRJbmZvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcENvbW1hbmRNUS5yZXNldChuZXcgQ29tbWFuZE1RKGNvbW1hbmRNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wRGF0YU1RLnJlc2V0KG5ldyBEYXRhTVEoZGF0YU1RKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBEYXRhTVEtPmlzVmFsaWQoKSAmJiB0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRQaWQgPSBoYWxUaHJlYWRJbmZvLnBpZDsKLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkVGlkID0gaGFsVGhyZWFkSW5mby50aWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwcmVwYXJlRm9yV3JpdGluZyIsIHJldCwgcmV0dmFsKTsKLSAgICB9Ci0gICAgaWYgKCF0ZW1wQ29tbWFuZE1RIHx8ICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICF0ZW1wRGF0YU1RIHx8ICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhbUVmR3JvdXApIHsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBDb21tYW5kTVEsICJGYWlsZWQgdG8gb2J0YWluIGNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wQ29tbWFuZE1RICYmICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIkNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wRGF0YU1RLCAiRmFpbGVkIHRvIG9idGFpbiBkYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcERhdGFNUSAmJiAhdGVtcERhdGFNUS0+aXNWYWxpZCgpLCAiRGF0YSBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciB3cml0aW5nIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkKTsKLQotICAgIG1Db21tYW5kTVEgPSBzdGQ6Om1vdmUodGVtcENvbW1hbmRNUSk7Ci0gICAgbURhdGFNUSA9IHN0ZDo6bW92ZSh0ZW1wRGF0YU1RKTsKLSAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKLSAgICBtV3JpdGVyQ2xpZW50ID0gZ2V0dGlkKCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0UmVuZGVyUG9zaXRpb24oCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQzMl90IGQpIHsKLSAgICAgICAgICAgICAgICByZXR2YWwgPSByOwotICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAqZHNwRnJhbWVzID0gZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UmVuZGVyUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXROZXh0V3JpdGVUaW1lc3RhbXAoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGludDY0X3QgdCkgewotICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICp0aW1lc3RhbXAgPSB0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZW5kZXJQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcHJvY2Vzc1JldHVybigKLSAgICAgICAgICAgICJzZXRDYWxsYmFjayIsIG1TdHJlYW0tPnNldENhbGxiYWNrKG5ldyBTdHJlYW1PdXRDYWxsYmFjayh0aGlzKSkpOwotICAgIGlmIChzdGF0dXMgPT0gT0spIHsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+c3VwcG9ydHNQYXVzZUFuZFJlc3VtZSgKLSAgICAgICAgICAgIFsmXShib29sIHAsIGJvb2wgcikgewotICAgICAgICAgICAgICAgICpzdXBwb3J0c1BhdXNlID0gcDsKLSAgICAgICAgICAgICAgICAqc3VwcG9ydHNSZXN1bWUgPSByOwotICAgICAgICAgICAgfSk7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzUGF1c2VBbmRSZXN1bWUiLCByZXQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpwYXVzZSgpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5wYXVzZSgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6cmVzdW1lKCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPnJlc3VtZSgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzRHJhaW4iLCBtU3RyZWFtLT5zdXBwb3J0c0RyYWluKCksIHN1cHBvcnRzRHJhaW4pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oCi0gICAgICAgICAgICAiZHJhaW4iLCBtU3RyZWFtLT5kcmFpbihlYXJseU5vdGlmeSA/IEF1ZGlvRHJhaW46OkVBUkxZX05PVElGWSA6IEF1ZGlvRHJhaW46OkFMTCkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpmbHVzaCgpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicGF1c2UiLCBtU3RyZWFtLT5mbHVzaCgpKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICBpZiAobVdyaXRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7Ci0gICAgICAgIHJldHVybiBjYWxsV3JpdGVyVGhyZWFkKAotICAgICAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6R0VUX1BSRVNFTlRBVElPTl9QT1NJVElPTiwgImdldFByZXNlbnRhdGlvblBvc2l0aW9uIiwgbnVsbHB0ciwgMCwKLSAgICAgICAgICAgICAgICBbJl0oY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi5mcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfc2VjID0gd3JpdGVTdGF0dXMucmVwbHkucHJlc2VudGF0aW9uUG9zaXRpb24udGltZVN0YW1wLnR2U2VjOwotICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X25zZWMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi50aW1lU3RhbXAudHZOU2VjOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFJlc3VsdCByZXR2YWw7Ci0gICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbigKLSAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGhpZGxGcmFtZXMsIGNvbnN0IFRpbWVTcGVjJiBoaWRsVGltZVN0YW1wKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IGhpZGxGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X3NlYyA9IGhpZGxUaW1lU3RhbXAudHZTZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAtPnR2X25zZWMgPSBoaWRsVGltZVN0YW1wLnR2TlNlYzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci0gICAgfQotfQotCi0vKiogVHJhbnNmb3JtIGEgc3RhbmRhcmQgY29sbGVjdGlvbiB0byBhbiBISURMIHZlY3Rvci4gKi8KLXRlbXBsYXRlIDxjbGFzcyBWYWx1ZXMsIGNsYXNzIEVsZW1lbnRDb252ZXJ0ZXI+Ci1zdGF0aWMgYXV0byB0cmFuc2Zvcm1Ub0hpZGxWZWMoY29uc3QgVmFsdWVzJiB2YWx1ZXMsIEVsZW1lbnRDb252ZXJ0ZXIgY29udmVydGVyKSB7Ci0gICAgaGlkbF92ZWM8ZGVjbHR5cGUoY29udmVydGVyKCp2YWx1ZXMuYmVnaW4oKSkpPiByZXN1bHR7dmFsdWVzLnNpemUoKX07Ci0gICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLSAgICB0cmFuc2Zvcm0oYmVnaW4odmFsdWVzKSwgZW5kKHZhbHVlcyksIGJlZ2luKHJlc3VsdCksIGNvbnZlcnRlcik7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6dXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSB7Ci0gICAgaGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpTb3VyY2VNZXRhZGF0YSBoYWxNZXRhZGF0YSA9IHsKLSAgICAgICAgLnRyYWNrcyA9IHRyYW5zZm9ybVRvSGlkbFZlYyhzb3VyY2VNZXRhZGF0YS50cmFja3MsCi0gICAgICAgICAgICAgIFtdKGNvbnN0IHBsYXliYWNrX3RyYWNrX21ldGFkYXRhJiBtZXRhZGF0YSkgLT4gUGxheWJhY2tUcmFja01ldGFkYXRhIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiB7Ci0gICAgICAgICAgICAgICAgICAgIC51c2FnZT1zdGF0aWNfY2FzdDxBdWRpb1VzYWdlPihtZXRhZGF0YS51c2FnZSksCi0gICAgICAgICAgICAgICAgICAgIC5jb250ZW50VHlwZT1zdGF0aWNfY2FzdDxBdWRpb0NvbnRlbnRUeXBlPihtZXRhZGF0YS5jb250ZW50X3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAuZ2Fpbj1tZXRhZGF0YS5nYWluLAotICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgfSl9OwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJ1cGRhdGVTb3VyY2VNZXRhZGF0YSIsIG1TdHJlYW0tPnVwZGF0ZVNvdXJjZU1ldGFkYXRhKGhhbE1ldGFkYXRhKSk7Ci19Ci0KLXZvaWQgU3RyZWFtT3V0SGFsSGlkbDo6b25Xcml0ZVJlYWR5KCkgewotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKLSAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbldyaXRlUmVhZHkiKTsKLSAgICBjYWxsYmFjay0+b25Xcml0ZVJlYWR5KCk7Ci19Ci0KLXZvaWQgU3RyZWFtT3V0SGFsSGlkbDo6b25EcmFpblJlYWR5KCkgewotICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IG1DYWxsYmFjay5wcm9tb3RlKCk7Ci0gICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybjsKLSAgICBBTE9HVigiYXN5bmNDYWxsYmFjayBvbkRyYWluUmVhZHkiKTsKLSAgICBjYWxsYmFjay0+b25EcmFpblJlYWR5KCk7Ci19Ci0KLXZvaWQgU3RyZWFtT3V0SGFsSGlkbDo6b25FcnJvcigpIHsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47Ci0gICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25FcnJvciIpOwotICAgIGNhbGxiYWNrLT5vbkVycm9yKCk7Ci19Ci0KLQotU3RyZWFtSW5IYWxIaWRsOjpTdHJlYW1JbkhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbUluPiYgc3RyZWFtKQotICAgICAgICA6IFN0cmVhbUhhbEhpZGwoc3RyZWFtLmdldCgpKSwgbVN0cmVhbShzdHJlYW0pLCBtUmVhZGVyQ2xpZW50KDApLCBtRWZHcm91cChudWxscHRyKSB7Ci19Ci0KLVN0cmVhbUluSGFsSGlkbDo6flN0cmVhbUluSGFsSGlkbCgpIHsKLSAgICBpZiAobVN0cmVhbSAhPSAwKSB7Ci0gICAgICAgIHByb2Nlc3NSZXR1cm4oImNsb3NlIiwgbVN0cmVhbS0+Y2xvc2UoKSk7Ci0gICAgICAgIG1TdHJlYW0uY2xlYXIoKTsKLSAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmZsdXNoQ29tbWFuZHMoKTsKLSAgICB9Ci0gICAgaWYgKG1FZkdyb3VwKSB7Ci0gICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0RnJhbWVTaXplIiwgbVN0cmVhbS0+Z2V0RnJhbWVTaXplKCksIHNpemUpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnNldEdhaW4oZmxvYXQgZ2FpbikgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRHYWluIiwgbVN0cmVhbS0+c2V0R2FpbihnYWluKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cmVhZCh2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICpyZWFkKSB7Ci0gICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgKnJlYWQgPSAwOwotCi0gICAgaWYgKGJ5dGVzID09IDAgJiYgIW1EYXRhTVEpIHsKLSAgICAgICAgLy8gQ2FuJ3QgZGV0ZXJtaW5lIHRoZSBzaXplIGZvciB0aGUgTVEgYnVmZmVyLiBXYWl0IGZvciBhIG5vbi1lbXB0eSByZWFkIHJlcXVlc3QuCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKCFtRGF0YU1RICYmIChzdGF0dXMgPSBwcmVwYXJlRm9yUmVhZGluZyhieXRlcykpICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgUmVhZFBhcmFtZXRlcnMgcGFyYW1zOwotICAgIHBhcmFtcy5jb21tYW5kID0gUmVhZENvbW1hbmQ6OlJFQUQ7Ci0gICAgcGFyYW1zLnBhcmFtcy5yZWFkID0gYnl0ZXM7Ci0gICAgc3RhdHVzID0gY2FsbFJlYWRlclRocmVhZChwYXJhbXMsICJyZWFkIiwKLSAgICAgICAgICAgIFsmXShjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGF2YWlsVG9SZWFkID0gbURhdGFNUS0+YXZhaWxhYmxlVG9SZWFkKCk7Ci0gICAgICAgICAgICAgICAgaWYgKCFtRGF0YU1RLT5yZWFkKHN0YXRpY19jYXN0PHVpbnQ4X3QqPihidWZmZXIpLCBzdGQ6Om1pbihieXRlcywgYXZhaWxUb1JlYWQpKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZGF0YSBtZXNzYWdlIHF1ZXVlIHJlYWQgZmFpbGVkIGZvciBcInJlYWRcIiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HV19JRihhdmFpbFRvUmVhZCAhPSByZWFkU3RhdHVzLnJlcGx5LnJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAiSEFMIHJlYWQgcmVwb3J0IGluY29uc2lzdGVudDogbXEgPSAlZCwgc3RhdHVzID0gJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpYXZhaWxUb1JlYWQsIChpbnQzMl90KXJlYWRTdGF0dXMucmVwbHkucmVhZCk7Ci0gICAgICAgICAgICAgICAgKnJlYWQgPSByZWFkU3RhdHVzLnJlcGx5LnJlYWQ7Ci0gICAgICAgICAgICB9KTsKLSAgICBtU3RyZWFtUG93ZXJMb2cubG9nKGJ1ZmZlciwgKnJlYWQpOwotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Y2FsbFJlYWRlclRocmVhZCgKLSAgICAgICAgY29uc3QgUmVhZFBhcmFtZXRlcnMmIHBhcmFtcywgY29uc3QgY2hhciogY21kTmFtZSwKLSAgICAgICAgU3RyZWFtSW5IYWxIaWRsOjpSZWFkZXJDYWxsYmFjayBjYWxsYmFjaykgewotICAgIGlmICghbUNvbW1hbmRNUS0+d3JpdGUoJnBhcmFtcykpIHsKLSAgICAgICAgQUxPR1coImNvbW1hbmQgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQiKTsKLSAgICAgICAgcmV0dXJuIC1FQUdBSU47Ci0gICAgfQotICAgIG1FZkdyb3VwLT53YWtlKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0ZVTEwpKTsKLQotICAgIC8vIFRPRE86IFJlbW92ZSBtYW51YWwgZXZlbnQgZmxhZyBoYW5kbGluZyBvbmNlIGJsb2NraW5nIE1RIGlzIGltcGxlbWVudGVkLiBiLzMzODE1NDIyCi0gICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7Ci1yZXRyeToKLSAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSksICZlZlN0YXRlKTsKLSAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6Tk9UX0VNUFRZKSkgewotICAgICAgICBSZWFkU3RhdHVzIHJlYWRTdGF0dXM7Ci0gICAgICAgIHJlYWRTdGF0dXMucmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7Ci0gICAgICAgIGlmICghbVN0YXR1c01RLT5yZWFkKCZyZWFkU3RhdHVzKSkgewotICAgICAgICAgICAgQUxPR0UoInN0YXR1cyBtZXNzYWdlIHJlYWQgZmFpbGVkIGZvciBcIiVzXCIiLCBjbWROYW1lKTsKLSAgICAgICAgfQotICAgICAgICAgaWYgKHJlYWRTdGF0dXMucmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgIHJldCA9IE9LOwotICAgICAgICAgICAgY2FsbGJhY2socmVhZFN0YXR1cyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXQgPSBwcm9jZXNzUmV0dXJuKGNtZE5hbWUsIHJlYWRTdGF0dXMucmV0dmFsKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBpZiAocmV0ID09IC1FQUdBSU4gfHwgcmV0ID09IC1FSU5UUikgewotICAgICAgICAvLyBTcHVyaW91cyB3YWtldXAuIFRoaXMgbm9ybWFsbHkgcmV0cmllcyBubyBtb3JlIHRoYW4gb25jZS4KLSAgICAgICAgZ290byByZXRyeTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpwcmVwYXJlRm9yUmVhZGluZyhzaXplX3QgYnVmZmVyU2l6ZSkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IHRlbXBDb21tYW5kTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gdGVtcERhdGFNUTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IHRlbXBTdGF0dXNNUTsKLSAgICBSZXN1bHQgcmV0dmFsOwotICAgIHBpZF90IGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkOwotICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5wcmVwYXJlRm9yUmVhZGluZygKLSAgICAgICAgICAgIDEsIGJ1ZmZlclNpemUsCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbW1hbmRNUTo6RGVzY3JpcHRvciYgY29tbWFuZE1RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTVE6OkRlc2NyaXB0b3ImIGRhdGFNUSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhdHVzTVE6OkRlc2NyaXB0b3ImIHN0YXR1c01RLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBUaHJlYWRJbmZvJiBoYWxUaHJlYWRJbmZvKSB7Ci0gICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKLSAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgdGVtcENvbW1hbmRNUS5yZXNldChuZXcgQ29tbWFuZE1RKGNvbW1hbmRNUSkpOwotICAgICAgICAgICAgICAgICAgICB0ZW1wRGF0YU1RLnJlc2V0KG5ldyBEYXRhTVEoZGF0YU1RKSk7Ci0gICAgICAgICAgICAgICAgICAgIHRlbXBTdGF0dXNNUS5yZXNldChuZXcgU3RhdHVzTVEoc3RhdHVzTVEpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRlbXBEYXRhTVEtPmlzVmFsaWQoKSAmJiB0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50RmxhZzo6Y3JlYXRlRXZlbnRGbGFnKHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSwgJm1FZkdyb3VwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRQaWQgPSBoYWxUaHJlYWRJbmZvLnBpZDsKLSAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkVGlkID0gaGFsVGhyZWFkSW5mby50aWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgaWYgKCFyZXQuaXNPaygpIHx8IHJldHZhbCAhPSBSZXN1bHQ6Ok9LKSB7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwcmVwYXJlRm9yUmVhZGluZyIsIHJldCwgcmV0dmFsKTsKLSAgICB9Ci0gICAgaWYgKCF0ZW1wQ29tbWFuZE1RIHx8ICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICF0ZW1wRGF0YU1RIHx8ICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgfHwKLSAgICAgICAgICAgICF0ZW1wU3RhdHVzTVEgfHwgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpIHx8Ci0gICAgICAgICAgICAhbUVmR3JvdXApIHsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBDb21tYW5kTVEsICJGYWlsZWQgdG8gb2J0YWluIGNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOwotICAgICAgICBBTE9HRV9JRih0ZW1wQ29tbWFuZE1RICYmICF0ZW1wQ29tbWFuZE1RLT5pc1ZhbGlkKCksCi0gICAgICAgICAgICAgICAgIkNvbW1hbmQgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7Ci0gICAgICAgIEFMT0dFX0lGKCF0ZW1wRGF0YU1RLCAiRmFpbGVkIHRvIG9idGFpbiBkYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcERhdGFNUSAmJiAhdGVtcERhdGFNUS0+aXNWYWxpZCgpLCAiRGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKLSAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmciKTsKLSAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKLSAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIHJlYWRpbmcgaXMgaW52YWxpZCIpOwotICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciByZWFkaW5nIGZhaWxlZCIpOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KGhhbFRocmVhZFBpZCwgaGFsVGhyZWFkVGlkKTsKLQotICAgIG1Db21tYW5kTVEgPSBzdGQ6Om1vdmUodGVtcENvbW1hbmRNUSk7Ci0gICAgbURhdGFNUSA9IHN0ZDo6bW92ZSh0ZW1wRGF0YU1RKTsKLSAgICBtU3RhdHVzTVEgPSBzdGQ6Om1vdmUodGVtcFN0YXR1c01RKTsKLSAgICBtUmVhZGVyQ2xpZW50ID0gZ2V0dGlkKCk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRJbnB1dEZyYW1lc0xvc3QiLCBtU3RyZWFtLT5nZXRJbnB1dEZyYW1lc0xvc3QoKSwgZnJhbWVzTG9zdCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSkgewotICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOwotICAgIGlmIChtUmVhZGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKLSAgICAgICAgUmVhZFBhcmFtZXRlcnMgcGFyYW1zOwotICAgICAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpHRVRfQ0FQVFVSRV9QT1NJVElPTjsKLSAgICAgICAgcmV0dXJuIGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwKLSAgICAgICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gcmVhZFN0YXR1cy5yZXBseS5jYXB0dXJlUG9zaXRpb24uZnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAqdGltZSA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLnRpbWU7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgUmVzdWx0IHJldHZhbDsKLSAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldENhcHR1cmVQb3NpdGlvbigKLSAgICAgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGhpZGxGcmFtZXMsIHVpbnQ2NF90IGhpZGxUaW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IGhpZGxGcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICAqdGltZSA9IGhpZGxUaW1lOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDYXB0dXJlUG9zaXRpb24iLCByZXQsIHJldHZhbCk7Ci0gICAgfQotfQotCi0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCi0gICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzSW5mbykgewotICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgUmVzdWx0IHJldHZhbDsKLSAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QWN0aXZlTWljcm9waG9uZXMoCi0gICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGhpZGxfdmVjPE1pY3JvcGhvbmVJbmZvPiBtaWNBcnJheUhhbCkgewotICAgICAgICByZXR2YWwgPSByOwotICAgICAgICBmb3IgKHNpemVfdCBrID0gMDsgayA8IG1pY0FycmF5SGFsLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgZHN0OwotICAgICAgICAgICAgLy8gY29udmVydAotICAgICAgICAgICAgbWljcm9waG9uZUluZm9Ub0hhbChtaWNBcnJheUhhbFtrXSwgJmRzdCk7Ci0gICAgICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZSA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhkc3QpOwotICAgICAgICAgICAgbWljcm9waG9uZXNJbmZvLT5wdXNoX2JhY2sobWljcm9waG9uZSk7Ci0gICAgICAgIH0KLSAgICB9KTsKLSAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QWN0aXZlTWljcm9waG9uZXMiLCByZXQsIHJldHZhbCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7Ci0gICAgaGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpTaW5rTWV0YWRhdGEgaGFsTWV0YWRhdGEgPSB7Ci0gICAgICAgIC50cmFja3MgPSB0cmFuc2Zvcm1Ub0hpZGxWZWMoc2lua01ldGFkYXRhLnRyYWNrcywKLSAgICAgICAgICAgICAgW10oY29uc3QgcmVjb3JkX3RyYWNrX21ldGFkYXRhJiBtZXRhZGF0YSkgLT4gUmVjb3JkVHJhY2tNZXRhZGF0YSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gewotICAgICAgICAgICAgICAgICAgICAuc291cmNlPXN0YXRpY19jYXN0PEF1ZGlvU291cmNlPihtZXRhZGF0YS5zb3VyY2UpLAotICAgICAgICAgICAgICAgICAgICAuZ2Fpbj1tZXRhZGF0YS5nYWluLAotICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgfSl9OwotICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJ1cGRhdGVTaW5rTWV0YWRhdGEiLCBtU3RyZWFtLT51cGRhdGVTaW5rTWV0YWRhdGEoaGFsTWV0YWRhdGEpKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxIaWRsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZGEwZjguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1N0cmVhbUhhbEhpZGwuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF80XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF80XzBfSAotCi0jaW5jbHVkZSA8YXRvbWljPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSVN0cmVhbS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lTdHJlYW1Jbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL0lTdHJlYW1PdXQuaD4KLSNpbmNsdWRlIDxmbXEvRXZlbnRGbGFnLmg+Ci0jaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgotCi0jaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKLSNpbmNsdWRlICJTdHJlYW1Qb3dlckxvZy5oIgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtSW47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6SVN0cmVhbU91dDsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKLXVzaW5nIFJlYWRQYXJhbWV0ZXJzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1Jbjo6UmVhZFBhcmFtZXRlcnM7Ci11c2luZyBSZWFkU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklTdHJlYW1Jbjo6UmVhZFN0YXR1czsKLXVzaW5nIFdyaXRlQ29tbWFuZCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtT3V0OjpXcml0ZUNvbW1hbmQ7Ci11c2luZyBXcml0ZVN0YXR1cyA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpWNF8wOjpJU3RyZWFtT3V0OjpXcml0ZVN0YXR1czsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBEZXZpY2VIYWxIaWRsOwotCi1jbGFzcyBTdHJlYW1IYWxIaWRsIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKLXsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgc2FtcGxpbmcgcmF0ZSBpbiBIeiAtIGVnLiA0NDEwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpOwotCi0gICAgLy8gUmV0dXJuIHNpemUgb2YgaW5wdXQvb3V0cHV0IGJ1ZmZlciBpbiBieXRlcyBmb3IgdGhpcyBzdHJlYW0gLSBlZy4gNDgwMC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgY2hhbm5lbCBtYXNrLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBmb3JtYXQgLSBlLmcuIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOwotCi0gICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIFNldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7Ci0KLSAgICAvLyBHZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7Ci0KLSAgICAvLyBBZGQgb3IgcmVtb3ZlIHRoZSBlZmZlY3Qgb24gdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotCi0gICAgLy8gUHV0IHRoZSBhdWRpbyBoYXJkd2FyZSBpbnB1dC9vdXRwdXQgaW50byBzdGFuZGJ5IG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFuZGJ5KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKLQotICAgIC8vIFN0YXJ0IGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbyk7Ci0KLSAgICAvLyBHZXQgY3VycmVudCByZWFkL3dyaXRlIHBvc2l0aW9uIGluIHRoZSBtbWFwIGJ1ZmZlcgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbik7Ci0KLSAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCi0gICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKLQotICBwcm90ZWN0ZWQ6Ci0gICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgZXhwbGljaXQgU3RyZWFtSGFsSGlkbChJU3RyZWFtICpzdHJlYW0pOwotCi0gICAgLy8gVGhlIGRlc3RydWN0b3IgYXV0b21hdGljYWxseSBjbG9zZXMgdGhlIHN0cmVhbS4KLSAgICB2aXJ0dWFsIH5TdHJlYW1IYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICBib29sIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShwaWRfdCB0aHJlYWRQaWQsIHBpZF90IHRocmVhZElkKTsKLQotICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KLSAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7Ci0KLSAgcHJpdmF0ZToKLSAgICBjb25zdCBpbnQgSEFMX1RIUkVBRF9QUklPUklUWV9ERUZBVUxUID0gLTE7Ci0gICAgSVN0cmVhbSAqbVN0cmVhbTsKLSAgICBpbnQgbUhhbFRocmVhZFByaW9yaXR5OwotICAgIHNpemVfdCBtQ2FjaGVkQnVmZmVyU2l6ZTsKLX07Ci0KLWNsYXNzIFN0cmVhbU91dEhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtT3V0SGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsSGlkbCB7Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIGZyYW1lIHNpemUgKG51bWJlciBvZiBieXRlcyBwZXIgc2FtcGxlKSBvZiBhIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhdWRpbyBoYXJkd2FyZSBkcml2ZXIgZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSk7Ci0KLSAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwotCi0gICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOwotCi0gICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKLSAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOwotCi0gICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKLQotICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7Ci0KLSAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOwotCi0gICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOwotCi0gICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOwotCi0gICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCi0gICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKLQotICAgIC8vIE1ldGhvZHMgdXNlZCBieSBTdHJlYW1PdXRDYWxsYmFjayAoSElETCkuCi0gICAgdm9pZCBvbldyaXRlUmVhZHkoKTsKLSAgICB2b2lkIG9uRHJhaW5SZWFkeSgpOwotICAgIHZvaWQgb25FcnJvcigpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVDb21tYW5kLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7Ci0gICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKLQotICAgIHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBtQ2FsbGJhY2s7Ci0gICAgc3A8SVN0cmVhbU91dD4gbVN0cmVhbTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7Ci0gICAgc3RkOjphdG9taWM8cGlkX3Q+IG1Xcml0ZXJDbGllbnQ7Ci0gICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1PdXQ+JiBzdHJlYW0pOwotCi0gICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsSGlkbCgpOwotCi0gICAgdXNpbmcgV3JpdGVyQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKT47Ci0gICAgc3RhdHVzX3QgY2FsbFdyaXRlclRocmVhZCgKLSAgICAgICAgICAgIFdyaXRlQ29tbWFuZCBjbWQsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCi0gICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsIFdyaXRlckNhbGxiYWNrIGNhbGxiYWNrKTsKLSAgICBzdGF0dXNfdCBwcmVwYXJlRm9yV3JpdGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Ci19OwotCi1jbGFzcyBTdHJlYW1JbkhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxIaWRsIHsKLSAgcHVibGljOgotICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOwotCi0gICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOwotCi0gICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7Ci0KLSAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCi0gICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKLQotICAgIC8vIEdldCBhY3RpdmUgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc2luayBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsSGlkbDsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZWFkUGFyYW1ldGVycywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IENvbW1hbmRNUTsKLSAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gRGF0YU1ROwotICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKLQotICAgIHNwPElTdHJlYW1Jbj4gbVN0cmVhbTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROwotICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7Ci0gICAgc3RkOjphdG9taWM8cGlkX3Q+IG1SZWFkZXJDbGllbnQ7Ci0gICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1JbkhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbUluPiYgc3RyZWFtKTsKLQotICAgIHZpcnR1YWwgflN0cmVhbUluSGFsSGlkbCgpOwotCi0gICAgdXNpbmcgUmVhZGVyQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cyk+OwotICAgIHN0YXR1c190IGNhbGxSZWFkZXJUaHJlYWQoCi0gICAgICAgICAgICBjb25zdCBSZWFkUGFyYW1ldGVycyYgcGFyYW1zLCBjb25zdCBjaGFyKiBjbWROYW1lLCBSZWFkZXJDYWxsYmFjayBjYWxsYmFjayk7Ci0gICAgc3RhdHVzX3QgcHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsTG9jYWwuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWQ5NmJmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxMb2NhbC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiU3RyZWFtSGFsTG9jYWwiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKLSNpbmNsdWRlICJTdHJlYW1IYWxMb2NhbC5oIgotI2luY2x1ZGUgIlZlcnNpb25VdGlscy5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLVN0cmVhbUhhbExvY2FsOjpTdHJlYW1IYWxMb2NhbChhdWRpb19zdHJlYW1fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQotICAgICAgICA6IG1EZXZpY2UoZGV2aWNlKSwKLSAgICAgICAgICBtU3RyZWFtKHN0cmVhbSkgewotICAgIC8vIEluc3RydW1lbnQgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCi0gICAgLy8gTm90ZTogVGhpcyBhc3N1bWVzIGNoYW5uZWwgbWFzaywgZm9ybWF0LCBhbmQgc2FtcGxlIHJhdGUgZG8gbm90IGNoYW5nZSBhZnRlciBjcmVhdGlvbi4KLSAgICBpZiAobVN0cmVhbSAhPSBudWxscHRyICYmIG1TdHJlYW1Qb3dlckxvZy5pc1VzZXJEZWJ1Z09yRW5nQnVpbGQoKSkgewotICAgICAgICBtU3RyZWFtUG93ZXJMb2cuaW5pdChtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSksCi0gICAgICAgICAgICAgICAgbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pLAotICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSkpOwotICAgIH0KLX0KLQotU3RyZWFtSGFsTG9jYWw6On5TdHJlYW1IYWxMb2NhbCgpIHsKLSAgICBtU3RyZWFtID0gMDsKLSAgICBtRGV2aWNlLmNsZWFyKCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKSB7Ci0gICAgKnJhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IG1TdHJlYW0tPmdldF9idWZmZXJfc2l6ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaykgewotICAgICptYXNrID0gbVN0cmVhbS0+Z2V0X2NoYW5uZWxzKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7Ci0gICAgKmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKAotICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpIHsKLSAgICAqc2FtcGxlUmF0ZSA9IG1TdHJlYW0tPmdldF9zYW1wbGVfcmF0ZShtU3RyZWFtKTsKLSAgICAqbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKLSAgICAqZm9ybWF0ID0gbVN0cmVhbS0+Z2V0X2Zvcm1hdChtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpIHsKLSAgICByZXR1cm4gbVN0cmVhbS0+c2V0X3BhcmFtZXRlcnMobVN0cmVhbSwga3ZQYWlycy5zdHJpbmcoKSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgewotICAgIGNoYXIgKmhhbFZhbHVlcyA9IG1TdHJlYW0tPmdldF9wYXJhbWV0ZXJzKG1TdHJlYW0sIGtleXMuc3RyaW5nKCkpOwotICAgIGlmIChoYWxWYWx1ZXMgIT0gTlVMTCkgewotICAgICAgICB2YWx1ZXMtPnNldFRvKGhhbFZhbHVlcyk7Ci0gICAgICAgIGZyZWUoaGFsVmFsdWVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICB2YWx1ZXMtPmNsZWFyKCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmFkZEVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+KSB7Ci0gICAgTE9HX0FMV0FZU19GQVRBTCgiTG9jYWwgc3RyZWFtcyBjYW4gbm90IGhhdmUgZWZmZWN0cyIpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+KSB7Ci0gICAgTE9HX0FMV0FZU19GQVRBTCgiTG9jYWwgc3RyZWFtcyBjYW4gbm90IGhhdmUgZWZmZWN0cyIpOwotICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnN0YW5kYnkoKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnN0YW5kYnkobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUhhbExvY2FsOjpkdW1wKGludCBmZCkgewotICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW0tPmR1bXAobVN0cmVhbSwgZmQpOwotICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50KSB7Ci0gICAgLy8gRG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyBhcyBsb2NhbCBoYWwgaXMgZXhlY3V0ZWQgYnkgYXVkaW9mbGluZ2VyIGRpcmVjdGx5Ci0gICAgLy8gb24gdGhlIHNhbWUgdGhyZWFkLgotICAgIHJldHVybiBPSzsKLX0KLQotU3RyZWFtT3V0SGFsTG9jYWw6OlN0cmVhbU91dEhhbExvY2FsKGF1ZGlvX3N0cmVhbV9vdXRfdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQotICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKLX0KLQotU3RyZWFtT3V0SGFsTG9jYWw6On5TdHJlYW1PdXRIYWxMb2NhbCgpIHsKLSAgICBtQ2FsbGJhY2suY2xlYXIoKTsKLSAgICBtRGV2aWNlLT5jbG9zZU91dHB1dFN0cmVhbShtU3RyZWFtKTsKLSAgICBtU3RyZWFtID0gMDsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IGF1ZGlvX3N0cmVhbV9vdXRfZnJhbWVfc2l6ZShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KSB7Ci0gICAgKmxhdGVuY3kgPSBtU3RyZWFtLT5nZXRfbGF0ZW5jeShtU3RyZWFtKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLSAgICBpZiAobVN0cmVhbS0+c2V0X3ZvbHVtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF92b2x1bWUobVN0cmVhbSwgbGVmdCwgcmlnaHQpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6d3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqd3JpdHRlbikgewotICAgIHNzaXplX3Qgd3JpdGVSZXN1bHQgPSBtU3RyZWFtLT53cml0ZShtU3RyZWFtLCBidWZmZXIsIGJ5dGVzKTsKLSAgICBpZiAod3JpdGVSZXN1bHQgPiAwKSB7Ci0gICAgICAgICp3cml0dGVuID0gd3JpdGVSZXN1bHQ7Ci0gICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9IGVsc2UgewotICAgICAgICAqd3JpdHRlbiA9IDA7Ci0gICAgICAgIHJldHVybiB3cml0ZVJlc3VsdDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9yZW5kZXJfcG9zaXRpb24obVN0cmVhbSwgZHNwRnJhbWVzKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldE5leHRXcml0ZVRpbWVzdGFtcChpbnQ2NF90ICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X25leHRfd3JpdGVfdGltZXN0YW1wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X25leHRfd3JpdGVfdGltZXN0YW1wKG1TdHJlYW0sIHRpbWVzdGFtcCk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKLSAgICBpZiAobVN0cmVhbS0+c2V0X2NhbGxiYWNrID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBtU3RyZWFtLT5zZXRfY2FsbGJhY2sobVN0cmVhbSwgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2ssIHRoaXMpOwotICAgIGlmIChyZXN1bHQgPT0gT0spIHsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIHN0YXRpYwotaW50IFN0cmVhbU91dEhhbExvY2FsOjphc3luY0NhbGxiYWNrKHN0cmVhbV9jYWxsYmFja19ldmVudF90IGV2ZW50LCB2b2lkKiwgdm9pZCAqY29va2llKSB7Ci0gICAgLy8gV2UgYWN0IGFzIGlmIHdlIGdhdmUgYSB3cDxTdHJlYW1PdXRIYWxMb2NhbD4gdG8gSEFMLiBUaGlzIHdheSB3ZSBzaG91bGQgaGFuZGxlCi0gICAgLy8gY29ycmVjdGx5IHRoZSBjYXNlIHdoZW4gdGhlIGNhbGxiYWNrIGlzIGludm9rZWQgd2hpbGUgU3RyZWFtT3V0SGFsTG9jYWwncyBkZXN0cnVjdG9yIGlzCi0gICAgLy8gYWxyZWFkeSBydW5uaW5nLCBiZWNhdXNlIHRoZSBkZXN0cnVjdG9yIGlzIGludm9rZWQgYWZ0ZXIgdGhlIHJlZmNvdW50IGhhcyBiZWVuIGF0b21pY2FsbHkKLSAgICAvLyBkZWNyZW1lbnRlZC4KLSAgICB3cDxTdHJlYW1PdXRIYWxMb2NhbD4gd2Vha1NlbGYoc3RhdGljX2Nhc3Q8U3RyZWFtT3V0SGFsTG9jYWwqPihjb29raWUpKTsKLSAgICBzcDxTdHJlYW1PdXRIYWxMb2NhbD4gc2VsZiA9IHdlYWtTZWxmLnByb21vdGUoKTsKLSAgICBpZiAoc2VsZiA9PSAwKSByZXR1cm4gMDsKLSAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBzZWxmLT5tQ2FsbGJhY2sucHJvbW90ZSgpOwotICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm4gMDsKLSAgICBBTE9HVigiYXN5bmNDYWxsYmFjaygpIGV2ZW50ICVkIiwgZXZlbnQpOwotICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX1dSSVRFX1JFQURZOgotICAgICAgICAgICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9EUkFJTl9SRUFEWToKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vbkRyYWluUmVhZHkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfRVJST1I6Ci0gICAgICAgICAgICBjYWxsYmFjay0+b25FcnJvcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBBTE9HVygiYXN5bmNDYWxsYmFjaygpIHVua25vd24gZXZlbnQgJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdXBwb3J0c1BhdXNlQW5kUmVzdW1lKGJvb2wgKnN1cHBvcnRzUGF1c2UsIGJvb2wgKnN1cHBvcnRzUmVzdW1lKSB7Ci0gICAgKnN1cHBvcnRzUGF1c2UgPSBtU3RyZWFtLT5wYXVzZSAhPSBOVUxMOwotICAgICpzdXBwb3J0c1Jlc3VtZSA9IG1TdHJlYW0tPnJlc3VtZSAhPSBOVUxMOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnBhdXNlKCkgewotICAgIGlmIChtU3RyZWFtLT5wYXVzZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnBhdXNlKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cmVzdW1lKCkgewotICAgIGlmIChtU3RyZWFtLT5yZXN1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5yZXN1bWUobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pIHsKLSAgICAqc3VwcG9ydHNEcmFpbiA9IG1TdHJlYW0tPmRyYWluICE9IE5VTEw7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6ZHJhaW4oYm9vbCBlYXJseU5vdGlmeSkgewotICAgIGlmIChtU3RyZWFtLT5kcmFpbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmRyYWluKG1TdHJlYW0sIGVhcmx5Tm90aWZ5ID8gQVVESU9fRFJBSU5fRUFSTFlfTk9USUZZIDogQVVESU9fRFJBSU5fQUxMKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmZsdXNoKCkgewotICAgIGlmIChtU3RyZWFtLT5mbHVzaCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmZsdXNoKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0UHJlc2VudGF0aW9uUG9zaXRpb24odWludDY0X3QgKmZyYW1lcywgc3RydWN0IHRpbWVzcGVjICp0aW1lc3RhbXApIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9wcmVzZW50YXRpb25fcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lc3RhbXApOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6dXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEgPT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIGNvbnN0IHNvdXJjZV9tZXRhZGF0YV90IG1ldGFkYXRhIHsKLSAgICAgICAgLnRyYWNrX2NvdW50ID0gc291cmNlTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKLSAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCi0gICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHBsYXliYWNrX3RyYWNrX21ldGFkYXRhKj4oc291cmNlTWV0YWRhdGEudHJhY2tzLmRhdGEoKSksCi0gICAgfTsKLSAgICBtU3RyZWFtLT51cGRhdGVfc291cmNlX21ldGFkYXRhKG1TdHJlYW0sICZtZXRhZGF0YSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c3RhcnQoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0YXJ0ID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RhcnQobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdG9wKCkgewotICAgIGlmIChtU3RyZWFtLT5zdG9wID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RvcChtU3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKLX0KLQotc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbihtU3RyZWFtLCBwb3NpdGlvbik7Ci19Ci0KLVN0cmVhbUluSGFsTG9jYWw6OlN0cmVhbUluSGFsTG9jYWwoYXVkaW9fc3RyZWFtX2luX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKLSAgICAgICAgOiBTdHJlYW1IYWxMb2NhbCgmc3RyZWFtLT5jb21tb24sIGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7Ci19Ci0KLVN0cmVhbUluSGFsTG9jYWw6On5TdHJlYW1JbkhhbExvY2FsKCkgewotICAgIG1EZXZpY2UtPmNsb3NlSW5wdXRTdHJlYW0obVN0cmVhbSk7Ci0gICAgbVN0cmVhbSA9IDA7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldEZyYW1lU2l6ZShzaXplX3QgKnNpemUpIHsKLSAgICAqc2l6ZSA9IGF1ZGlvX3N0cmVhbV9pbl9mcmFtZV9zaXplKG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0R2FpbihmbG9hdCBnYWluKSB7Ci0gICAgcmV0dXJuIG1TdHJlYW0tPnNldF9nYWluKG1TdHJlYW0sIGdhaW4pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpyZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpIHsKLSAgICBzc2l6ZV90IHJlYWRSZXN1bHQgPSBtU3RyZWFtLT5yZWFkKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOwotICAgIGlmIChyZWFkUmVzdWx0ID4gMCkgewotICAgICAgICAqcmVhZCA9IHJlYWRSZXN1bHQ7Ci0gICAgICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coIGJ1ZmZlciwgKnJlYWQpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgKnJlYWQgPSAwOwotICAgICAgICByZXR1cm4gcmVhZFJlc3VsdDsKLSAgICB9Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCkgewotICAgICpmcmFtZXNMb3N0ID0gbVN0cmVhbS0+Z2V0X2lucHV0X2ZyYW1lc19sb3N0KG1TdHJlYW0pOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0Q2FwdHVyZVBvc2l0aW9uKGludDY0X3QgKmZyYW1lcywgaW50NjRfdCAqdGltZSkgewotICAgIGlmIChtU3RyZWFtLT5nZXRfY2FwdHVyZV9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgcmV0dXJuIG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uKG1TdHJlYW0sIGZyYW1lcywgdGltZSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgewotICAgIGlmIChtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YSA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgY29uc3Qgc2lua19tZXRhZGF0YV90IG1ldGFkYXRhIHsKLSAgICAgICAgLnRyYWNrX2NvdW50ID0gc2lua01ldGFkYXRhLnRyYWNrcy5zaXplKCksCi0gICAgICAgIC8vIGNvbnN0IGNhc3QgaXMgZmluZSBhcyBpdCBpcyBpbiBhIGNvbnN0IHN0cnVjdHVyZQotICAgICAgICAudHJhY2tzID0gY29uc3RfY2FzdDxyZWNvcmRfdHJhY2tfbWV0YWRhdGEqPihzaW5rTWV0YWRhdGEudHJhY2tzLmRhdGEoKSksCi0gICAgfTsKLSAgICBtU3RyZWFtLT51cGRhdGVfc2lua19tZXRhZGF0YShtU3RyZWFtLCAmbWV0YWRhdGEpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RhcnQoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0YXJ0ID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICByZXR1cm4gbVN0cmVhbS0+c3RhcnQobVN0cmVhbSk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnN0b3AoKSB7Ci0gICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOwotfQotCi1zdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgewotICAgIGlmIChtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5jcmVhdGVfbW1hcF9idWZmZXIobVN0cmVhbSwgbWluU2l6ZUZyYW1lcywgaW5mbyk7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pIHsKLSAgICBpZiAobVN0cmVhbS0+Z2V0X21tYXBfcG9zaXRpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbihtU3RyZWFtLCBwb3NpdGlvbik7Ci19Ci0KLXN0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKSB7Ci0gICAgaWYgKG1TdHJlYW0tPmdldF9hY3RpdmVfbWljcm9waG9uZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHNpemVfdCBhY3R1YWxfbWljcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UOwotICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBtaWNfYXJyYXlbQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlRdOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1TdHJlYW0tPmdldF9hY3RpdmVfbWljcm9waG9uZXMobVN0cmVhbSwgJm1pY19hcnJheVswXSwgJmFjdHVhbF9taWNzKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGFjdHVhbF9taWNzOyBpKyspIHsKLSAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmVJbmZvID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKG1pY19hcnJheVtpXSk7Ci0gICAgICAgIG1pY3JvcGhvbmVzLT5wdXNoX2JhY2sobWljcm9waG9uZUluZm8pOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtSGFsTG9jYWwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxMb2NhbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjM3NTA5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1IYWxMb2NhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX0hBTF9MT0NBTF80XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfNF8wX0gKLQotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBWNF8wIHsKLQotY2xhc3MgRGV2aWNlSGFsTG9jYWw7Ci0KLWNsYXNzIFN0cmVhbUhhbExvY2FsIDogcHVibGljIHZpcnR1YWwgU3RyZWFtSGFsSW50ZXJmYWNlCi17Ci0gIHB1YmxpYzoKLSAgICAvLyBSZXR1cm4gdGhlIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKTsKLQotICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgbWFzay4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKLQotICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKLSAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7Ci0KLSAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOwotCi0gICAgLy8gR2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOwotCi0gICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZWZmZWN0IG9uIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKLQotICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOwotCi0gICAgLy8gUmV0cmlldmUgaW5mb3JtYXRpb24gb24gdGhlIGRhdGEgYnVmZmVyIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fbW1hcF9idWZmZXJfaW5mbyAqaW5mbykgPSAwOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pID0gMDsKLQotICAgIC8vIFNldCB0aGUgcHJpb3JpdHkgb2YgdGhlIHRocmVhZCB0aGF0IGludGVyYWN0cyB3aXRoIHRoZSBIQUwKLSAgICAvLyAobXVzdCBtYXRjaCB0aGUgcHJpb3JpdHkgb2YgdGhlIGF1ZGlvZmxpbmdlcidzIHRocmVhZCB0aGF0IGNhbGxzICdyZWFkJyAvICd3cml0ZScpCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRIYWxUaHJlYWRQcmlvcml0eShpbnQgcHJpb3JpdHkpOwotCi0gIHByb3RlY3RlZDoKLSAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1IYWxMb2NhbChhdWRpb19zdHJlYW1fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKLQotICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCi0gICAgdmlydHVhbCB+U3RyZWFtSGFsTG9jYWwoKTsKLQotICAgIHNwPERldmljZUhhbExvY2FsPiBtRGV2aWNlOwotCi0gICAgLy8gbVN0cmVhbVBvd2VyTG9nIGlzIHVzZWQgZm9yIGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgotICAgIFN0cmVhbVBvd2VyTG9nIG1TdHJlYW1Qb3dlckxvZzsKLQotICBwcml2YXRlOgotICAgIGF1ZGlvX3N0cmVhbV90ICptU3RyZWFtOwotfTsKLQotY2xhc3MgU3RyZWFtT3V0SGFsTG9jYWwgOiBwdWJsaWMgU3RyZWFtT3V0SGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsTG9jYWwgewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOwotCi0gICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKLQotICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKTsKLQotICAgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIGJ5IHRoZSBhdWRpbyBkc3AgdG8gREFDIHNpbmNlCi0gICAgLy8gdGhlIG91dHB1dCBoYXMgZXhpdGVkIHN0YW5kYnkuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKTsKLQotICAgIC8vIEdldCB0aGUgbG9jYWwgdGltZSBhdCB3aGljaCB0aGUgbmV4dCB3cml0ZSB0byB0aGUgYXVkaW8gZHJpdmVyIHdpbGwgYmUgcHJlc2VudGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBTZXQgdGhlIGNhbGxiYWNrIGZvciBub3RpZnlpbmcgY29tcGxldGlvbiBvZiBub24tYmxvY2tpbmcgd3JpdGUgYW5kIGRyYWluLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBwYXVzZSBhbmQgcmVzdW1lIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwotCi0gICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKTsKLQotICAgIC8vIFJldHVybnMgd2hldGhlciBkcmFpbiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKTsKLQotICAgIC8vIFJlcXVlc3RzIG5vdGlmaWNhdGlvbiB3aGVuIGRhdGEgYnVmZmVyZWQgYnkgdGhlIGRyaXZlci9oYXJkd2FyZSBoYXMgYmVlbiBwbGF5ZWQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkcmFpbihib29sIGVhcmx5Tm90aWZ5KTsKLQotICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gZmx1c2ggdGhlIHF1ZXVlZCBkYXRhLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKLQotICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBwcmVzZW50ZWQgdG8gYW4gZXh0ZXJuYWwgb2JzZXJ2ZXIuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCk7Ci0KLSAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKLQotICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKLQotICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOwotCi0gICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOwotCi0gICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KLSAgICBzdGF0dXNfdCB1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIG92ZXJyaWRlOwotCi0gIHByaXZhdGU6Ci0gICAgYXVkaW9fc3RyZWFtX291dF90ICptU3RyZWFtOwotICAgIHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBtQ2FsbGJhY2s7Ci0KLSAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgU3RyZWFtT3V0SGFsTG9jYWwoYXVkaW9fc3RyZWFtX291dF90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOwotCi0gICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsTG9jYWwoKTsKLQotICAgIHN0YXRpYyBpbnQgYXN5bmNDYWxsYmFjayhzdHJlYW1fY2FsbGJhY2tfZXZlbnRfdCBldmVudCwgdm9pZCAqcGFyYW0sIHZvaWQgKmNvb2tpZSk7Ci19OwotCi1jbGFzcyBTdHJlYW1JbkhhbExvY2FsIDogcHVibGljIFN0cmVhbUluSGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsTG9jYWwgewotICBwdWJsaWM6Ci0gICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKLQotICAgIC8vIFNldCB0aGUgaW5wdXQgZ2FpbiBmb3IgdGhlIGF1ZGlvIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEdhaW4oZmxvYXQgZ2Fpbik7Ci0KLSAgICAvLyBSZWFkIGF1ZGlvIGJ1ZmZlciBpbiBmcm9tIGRyaXZlci4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCk7Ci0KLSAgICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBpbnB1dCBmcmFtZXMgbG9zdCBpbiB0aGUgYXVkaW8gZHJpdmVyLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KTsKLQotICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyByZWNlaXZlZCBhbmQKLSAgICAvLyB0aGUgY2xvY2sgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmcmFtZSBjb3VudC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpOwotCi0gICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0KLSAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKLQotICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKLQotICAgIC8vIEdldCBhY3RpdmUgbWljcm9waG9uZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKLQotICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc2luayBoYXMgYmVlbiBjaGFuZ2VkLgotICAgIHN0YXR1c190IHVwZGF0ZVNpbmtNZXRhZGF0YShjb25zdCBTaW5rTWV0YWRhdGEmIHNpbmtNZXRhZGF0YSkgb3ZlcnJpZGU7Ci0KLSAgcHJpdmF0ZToKLSAgICBhdWRpb19zdHJlYW1faW5fdCAqbVN0cmVhbTsKLQotICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxMb2NhbDsKLQotICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KLSAgICBTdHJlYW1JbkhhbExvY2FsKGF1ZGlvX3N0cmVhbV9pbl90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOwotCi0gICAgdmlydHVhbCB+U3RyZWFtSW5IYWxMb2NhbCgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvU3RyZWFtUG93ZXJMb2cuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1Qb3dlckxvZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2I3MjAxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9TdHJlYW1Qb3dlckxvZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR180XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9QT1dFUl9MT0dfNF8wX0gKLQotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+Ci0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvUG93ZXJMb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLWNsYXNzIFN0cmVhbVBvd2VyTG9nIHsKLXB1YmxpYzoKLSAgICBTdHJlYW1Qb3dlckxvZygpIDoKLSAgICAgICAgbUlzVXNlckRlYnVnT3JFbmdCdWlsZChpc191c2VyZGVidWdfb3JfZW5nX2J1aWxkKCkpLAotICAgICAgICBtUG93ZXJMb2cobnVsbHB0ciksCi0gICAgICAgIG1GcmFtZVNpemUoMCkgewotICAgICAgICAvLyB1c2UgaW5pdCgpIHRvIHNldCB1cCB0aGUgcG93ZXIgbG9nLgotICAgIH0KLQotICAgIH5TdHJlYW1Qb3dlckxvZygpIHsKLSAgICAgICAgcG93ZXJfbG9nX2Rlc3Ryb3kobVBvd2VyTG9nKTsgLy8gT0sgZm9yIG51bGwgbVBvd2VyTG9nCi0gICAgICAgIG1Qb3dlckxvZyA9IG51bGxwdHI7Ci0gICAgfQotCi0gICAgLy8gQSBvbmUtdGltZSBpbml0aWFsaXphdGlvbiAoZG8gbm90IGNhbGwgdHdpY2UpIGJlZm9yZSB1c2luZyBTdHJlYW1Qb3dlckxvZy4KLSAgICB2b2lkIGluaXQodWludDMyX3Qgc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewotICAgICAgICBpZiAobVBvd2VyTG9nID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIC8vIE5vdGU6IEEgd2F5IHRvIGdldCBjaGFubmVsIGNvdW50IGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgY2hhbm5lbCBtYXNrcwotICAgICAgICAgICAgLy8gYnV0IGRvZXMgbm90IGNoZWNrIHZhbGlkaXR5IG9mIHRoZSBjaGFubmVsIG1hc2suCi0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBwb3Bjb3VudChhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoY2hhbm5lbE1hc2spKTsKLSAgICAgICAgICAgIG1GcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCk7Ci0gICAgICAgICAgICBpZiAobUZyYW1lU2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qga1Bvd2VyTG9nRnJhbWVzUGVyRW50cnkgPQotICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzYW1wbGVSYXRlICoga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zIC8gMTAwMDsKLSAgICAgICAgICAgICAgICBtUG93ZXJMb2cgPSBwb3dlcl9sb2dfY3JlYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0VudHJpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gbVBvd2VyTG9nIG1heSBiZSBOVUxMIChub3QgdGhlIHJpZ2h0IGJ1aWxkLCBmb3JtYXQgbm90IGFjY2VwdGVkLCBldGMuKS4KLSAgICB9Ci0KLSAgICAvLyBEdW1wIHRoZSBwb3dlciBsb2cgdG8gZmQuCi0gICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3QgewotICAgICAgICAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKLSAgICAgICAgKHZvaWQpcG93ZXJfbG9nX2R1bXAoCi0gICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBmZCwgIiAgICAgICIgLyogcHJlZml4ICovLCBrUG93ZXJMb2dMaW5lcywgMCAvKiBsaW1pdF9ucyAqLyk7Ci0gICAgfQotCi0gICAgLy8gTG9nIHRoZSBhdWRpbyBkYXRhIGNvbnRhaW5lZCBpbiBidWZmZXIuCi0gICAgdm9pZCBsb2coY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZUluQnl0ZXMpIGNvbnN0IHsKLSAgICAgICAgaWYgKG1Qb3dlckxvZyAhPSBudWxscHRyKSB7IC8vIG1GcmFtZVNpemUgaXMgYWx3YXlzIG5vbnplcm8gaWYgbVBvd2VyTG9nIGV4aXN0cy4KLSAgICAgICAgICAgIHBvd2VyX2xvZ19sb2coCi0gICAgICAgICAgICAgICAgICAgIG1Qb3dlckxvZywgYnVmZmVyLCBzaXplSW5CeXRlcyAvIG1GcmFtZVNpemUsIGF1ZGlvX3V0aWxzX2dldF9yZWFsX3RpbWVfbnMoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sIGlzVXNlckRlYnVnT3JFbmdCdWlsZCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQ7Ci0gICAgfQotCi1wcml2YXRlOgotCi0gICAgc3RhdGljIGlubGluZSBib29sIGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSB7Ci0gICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAgICAgKHZvaWQpcHJvcGVydHlfZ2V0KCJyby5idWlsZC50eXBlIiwgdmFsdWUsICJ1bmtub3duIik7IC8vIGlnbm9yZSBhY3R1YWwgbGVuZ3RoCi0gICAgICAgIHJldHVybiBzdHJjbXAodmFsdWUsICJ1c2VyZGVidWciKSA9PSAwIHx8IHN0cmNtcCh2YWx1ZSwgImVuZyIpID09IDA7Ci0gICAgfQotCi0gICAgLy8gQXVkaW8gc2lnbmFsIHBvd2VyIGxvZyBjb25maWd1cmF0aW9uLgotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nTGluZXMgPSA0MDsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyA9IDUwOwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nRW50cmllcyA9ICgxIC8qIG1pbnV0ZXMgKi8gKiA2MCAvKiBzZWNvbmRzICovICogMTAwMCAvKiBtc2VjICovCi0gICAgICAgICAgICAvIGtQb3dlckxvZ1NhbXBsaW5nSW50ZXJ2YWxNcyk7Ci0KLSAgICBjb25zdCBib29sIG1Jc1VzZXJEZWJ1Z09yRW5nQnVpbGQ7Ci0gICAgcG93ZXJfbG9nX3QgKm1Qb3dlckxvZzsKLSAgICBzaXplX3QgbUZyYW1lU2l6ZTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR180XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1ZlcnNpb25VdGlscy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvNC4wL1ZlcnNpb25VdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjQ2YzJlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9WZXJzaW9uVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfVkVSU0lPTl9VVElMU180XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfNF8wX0gKLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vNC4wL3R5cGVzLmg+Ci0jaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UGFyYW1ldGVyVmFsdWU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6VjRfMDo6UmVzdWx0OwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotbmFtZXNwYWNlIHV0aWxzIHsKLQotdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENhbGxiYWNrPgotUmV0dXJuPHZvaWQ+IGdldFBhcmFtZXRlcnMoVCYgb2JqZWN0LCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBrZXlzLCBDYWxsYmFjayBjYWxsYmFjaykgewotICAgIHJldHVybiBvYmplY3QtPmdldFBhcmFtZXRlcnMoY29udGV4dCwga2V5cywgY2FsbGJhY2spOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLVJldHVybjxSZXN1bHQ+IHNldFBhcmFtZXRlcnMoVCYgb2JqZWN0LCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGtleXMpIHsKLSAgICByZXR1cm4gb2JqZWN0LT5zZXRQYXJhbWV0ZXJzKGNvbnRleHQsIGtleXMpOwotfQotCi19IC8vIG5hbWVzcGFjZSB1dGlscwotfSAvLyBuYW1lc3BhY2UgVjRfMAotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9WRVJTSU9OX1VUSUxTXzRfMF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvaW5jbHVkZS9saWJhdWRpb2hhbC80LjAvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9pbmNsdWRlL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmY2ZGUwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9pbmNsdWRlL2xpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF80XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0RFVklDRVNfRkFDVE9SWV9IQUxfSFlCUklEXzRfMF9ICi0KLSNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIFY0XzAgewotCi1jbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQotewotICBwdWJsaWM6Ci0gICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCi0gICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOwotCi0gIHByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlOwotCi0gICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICAgIERldmljZXNGYWN0b3J5SGFsSHlicmlkKCk7Ci0KLSAgICB2aXJ0dWFsIH5EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOwotCi0gICAgc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1Mb2NhbEZhY3Rvcnk7Ci0gICAgc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IG1IaWRsRmFjdG9yeTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIFY0XzAKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfNF8wX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9pbmNsdWRlL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsLzQuMC9pbmNsdWRlL2xpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjgwYjdhMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC80LjAvaW5jbHVkZS9saWJhdWRpb2hhbC80LjAvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF80XzBfSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF80XzBfSAotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvNC4wL0lFZmZlY3RzRmFjdG9yeS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzQuMC90eXBlcy5oPgotI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgVjRfMCB7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlY0XzA6OkVmZmVjdERlc2NyaXB0b3I7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpWNF8wOjpJRWZmZWN0c0ZhY3Rvcnk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKLQotY2xhc3MgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKLXsKLSAgcHVibGljOgotICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBkaWZmZXJlbnQgZWZmZWN0cyBpbiBhbGwgbG9hZGVkIGxpYnJhcmllcy4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpOwotCi0gICAgLy8gUmV0dXJucyBhIGRlc2NyaXB0b3Igb2YgdGhlIG5leHQgYXZhaWxhYmxlIGVmZmVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IodWludDMyX3QgaW5kZXgsCi0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCi0gICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpwRGVzY3JpcHRvcik7Ci0KLSAgICAvLyBDcmVhdGVzIGFuIGVmZmVjdCBlbmdpbmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotICAgIC8vIFRvIHJlbGVhc2UgdGhlIGVmZmVjdCBlbmdpbmUsIGl0IGlzIG5lY2Vzc2FyeSB0byByZWxlYXNlIHJlZmVyZW5jZXMKLSAgICAvLyB0byB0aGUgcmV0dXJuZWQgZWZmZWN0IG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKLSAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCi0gICAgICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wRWZmZWN0cyhpbnQgZmQpOwotCi0gICAgc3RhdHVzX3QgYWxsb2NhdGVCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3QgbWlycm9yQnVmZmVyKHZvaWQqIGV4dGVybmFsLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSBvdmVycmlkZTsKLQotICBwcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTsKLQotICAgIHNwPElFZmZlY3RzRmFjdG9yeT4gbUVmZmVjdHNGYWN0b3J5OwotICAgIGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+IG1MYXN0RGVzY3JpcHRvcnM7Ci0KLSAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0gICAgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7Ci0gICAgdmlydHVhbCB+RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKCk7Ci0KLSAgICBzdGF0dXNfdCBxdWVyeUFsbERlc2NyaXB0b3JzKCk7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBWNF8wCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF80XzBfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5icCBiL21lZGlhL2xpYmF1ZGlvaGFsL0FuZHJvaWQuYnAKaW5kZXggM2E1ZGYyNy4uMTcwOWQxZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9BbmRyb2lkLmJwCkBAIC00LDI1ICs0LDMyIEBACiAgICAgc3JjczogWwogICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwIiwKICAgICAgICAgIkVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcCIsCisgICAgICAgICJGYWN0b3J5SGFsSGlkbC5jcHAiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmVmZmVjdEAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANC4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9AMi4wIiwKLSAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANC4wIiwKKyAgICByZXF1aXJlZDogWwogICAgICAgICAibGliYXVkaW9oYWxAMi4wIiwKICAgICAgICAgImxpYmF1ZGlvaGFsQDQuMCIsCisgICAgICAgICJsaWJhdWRpb2hhbEA1LjAiLAorICAgICAgICAibGliYXVkaW9oYWxANi4wIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJhdWRpb2hhbF9oZWFkZXJzIgorICAgICAgICAibGliYXVkaW9oYWxfaGVhZGVycyIsCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAogICAgIF0KIH0KIApAQCAtNTMsNCArNjAsMTAgQEAKICAgICBuYW1lOiAibGliYXVkaW9oYWxfaGVhZGVycyIsCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIC8vIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UgdGhlIHN0cmVhbSBpbnRlcmZhY2UgaW5jbHVkZXMgbWVkaWEvTWljcm9waG9uZUluZm8uaAorICAgIC8vIHdoaWNoIGlzIG5vdCBpbiBhbnkgbGlicmFyeSBidXQgaGFzIGEgZGVwZW5kZW5jeSBvbiBoZWFkZXJzIGZyb20gbGliYmluZGVyLgorICAgIGhlYWRlcl9saWJzOiBbImxpYmJpbmRlcl9oZWFkZXJzIl0sCisKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbImxpYmJpbmRlcl9oZWFkZXJzIl0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKaW5kZXggNGM4ZWFmNi4uMzI1YTU0NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcApAQCAtMTQsMjMgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby8yLjAvSURldmljZXNGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby80LjAvSURldmljZXNGYWN0b3J5Lmg+Ci0KLSNpbmNsdWRlIDxEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oPgotI2luY2x1ZGUgPGxpYmF1ZGlvaGFsLzQuMC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyBzdGF0aWMKIHNwPERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlPiBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZTo6Y3JlYXRlKCkgewotICAgIGlmIChoYXJkd2FyZTo6YXVkaW86OlY0XzA6OklEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZSgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBWNF8wOjpEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZCgpOwotICAgIH0KLSAgICBpZiAoaGFyZHdhcmU6OmF1ZGlvOjpWMl8wOjpJRGV2aWNlc0ZhY3Rvcnk6OmdldFNlcnZpY2UoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIGNyZWF0ZVByZWZlcnJlZEltcGw8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+KAorICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8iLCAiSURldmljZXNGYWN0b3J5Iik7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmNwcAppbmRleCBlYWQxZmEyLi5iYzNiNGMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuY3BwCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTQsMjQgKzE0LDE1IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvMi4wL0lFZmZlY3RzRmFjdG9yeS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0LzQuMC9JRWZmZWN0c0ZhY3RvcnkuaD4KLQotI2luY2x1ZGUgPEVmZmVjdHNGYWN0b3J5SGFsSGlkbC5oPgotI2luY2x1ZGUgPGxpYmF1ZGlvaGFsLzQuMC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaD4KLQorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyBzdGF0aWMKIHNwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6Y3JlYXRlKCkgewotICAgIGlmIChoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6VjRfMDo6SUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCkgIT0gbnVsbHB0cikgewotICAgICAgICByZXR1cm4gbmV3IFY0XzA6OkVmZmVjdHNGYWN0b3J5SGFsSGlkbCgpOwotICAgIH0KLSAgICBpZiAoaGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OlYyXzA6OklFZmZlY3RzRmFjdG9yeTo6Z2V0U2VydmljZSgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBFZmZlY3RzRmFjdG9yeUhhbEhpZGwoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIGNyZWF0ZVByZWZlcnJlZEltcGw8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+KAorICAgICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uZWZmZWN0IiwgIklFZmZlY3RzRmFjdG9yeSIpOwogfQogCiAvLyBzdGF0aWMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OTg1ZWYwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJGYWN0b3J5SGFsSGlkbCIKKworI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0ZhY3RvcnlIYWxIaWRsLmg+CisKKyNpbmNsdWRlIDxkbGZjbi5oPgorCisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21hbmFnZXIvMS4wL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGhpZGwvU2VydmljZU1hbmFnZW1lbnQuaD4KKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZDo6ZGV0YWlsIHsKKworbmFtZXNwYWNlIHsKKy8qKiBTdXBwb3J0ZWQgSEFMIHZlcnNpb25zLCBpbiBvcmRlciBvZiBwcmVmZXJlbmNlLgorICovCitjb25zdCBjaGFyKiBzQXVkaW9IQUxWZXJzaW9uc1tdID0geworICAgICI2LjAiLAorICAgICI1LjAiLAorICAgICI0LjAiLAorICAgICIyLjAiLAorICAgIG51bGxwdHIKK307CisKK2Jvb2wgY3JlYXRlSGFsU2VydmljZShjb25zdCBzdGQ6OnN0cmluZyYgdmVyc2lvbiwgY29uc3Qgc3RkOjpzdHJpbmcmIGludGVyZmFjZSwKKyAgICAgICAgdm9pZCoqIHJhd0ludGVyZmFjZSkgeworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGxpYk5hbWUgPSAibGliYXVkaW9oYWxAIiArIHZlcnNpb24gKyAiLnNvIjsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBmYWN0b3J5RnVuY3Rpb25OYW1lID0gImNyZWF0ZSIgKyBpbnRlcmZhY2U7CisgICAgY29uc3RleHByIGludCBkbE1vZGUgPSBSVExEX0xBWlk7CisgICAgdm9pZCogaGFuZGxlID0gbnVsbHB0cjsKKyAgICBkbGVycm9yKCk7IC8vIGNsZWFyCisgICAgaGFuZGxlID0gZGxvcGVuKGxpYk5hbWUuY19zdHIoKSwgZGxNb2RlKTsKKyAgICBpZiAoaGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgY29uc3QgY2hhciogZXJyb3IgPSBkbGVycm9yKCk7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZGxvcGVuICVzOiAlcyIsIGxpYk5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICBlcnJvciAhPSBudWxscHRyID8gZXJyb3IgOiAidW5rbm93biBlcnJvciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHZvaWQqICgqZmFjdG9yeUZ1bmN0aW9uKSgpOworICAgICoodm9pZCAqKikoJmZhY3RvcnlGdW5jdGlvbikgPSBkbHN5bShoYW5kbGUsIGZhY3RvcnlGdW5jdGlvbk5hbWUuY19zdHIoKSk7CisgICAgaWYgKCFmYWN0b3J5RnVuY3Rpb24pIHsKKyAgICAgICAgY29uc3QgY2hhciogZXJyb3IgPSBkbGVycm9yKCk7CisgICAgICAgIEFMT0dFKCJGYWN0b3J5IGZ1bmN0aW9uICVzIG5vdCBmb3VuZCBpbiBsaWJyYXJ5ICVzOiAlcyIsCisgICAgICAgICAgICAgICAgZmFjdG9yeUZ1bmN0aW9uTmFtZS5jX3N0cigpLCBsaWJOYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgZXJyb3IgIT0gbnVsbHB0ciA/IGVycm9yIDogInVua25vd24gZXJyb3IiKTsKKyAgICAgICAgZGxjbG9zZShoYW5kbGUpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgICpyYXdJbnRlcmZhY2UgPSAoKmZhY3RvcnlGdW5jdGlvbikoKTsKKyAgICBBTE9HV19JRighKnJhd0ludGVyZmFjZSwgIkZhY3RvcnkgZnVuY3Rpb24gJXMgZnJvbSAlcyByZXR1cm5lZCBudWxscHRyIiwKKyAgICAgICAgICAgIGZhY3RvcnlGdW5jdGlvbk5hbWUuY19zdHIoKSwgbGliTmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBoYXNIYWxTZXJ2aWNlKGNvbnN0IHN0ZDo6c3RyaW5nJiBwYWNrYWdlLCBjb25zdCBzdGQ6OnN0cmluZyYgdmVyc2lvbiwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGludGVyZmFjZSkgeworICAgIHVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6bWFuYWdlcjo6VjFfMDo6SVNlcnZpY2VNYW5hZ2VyOworICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICBpZiAoIXNtKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb2J0YWluIEhJREwgU2VydmljZU1hbmFnZXIiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBTaW5jZSBhdWRpbyBIQUwgZG9lc24ndCBzdXBwb3J0IG11bHRpcGxlIGNsaWVudHMsIGF2b2lkIGluc3RhbnRpYXRpbmcKKyAgICAvLyB0aGUgaW50ZXJmYWNlIHJpZ2h0IGF3YXkuIEluc3RlYWQsIHF1ZXJ5IHRoZSB0cmFuc3BvcnQgdHlwZSBmb3IgaXQuCisgICAgdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOworICAgIHVzaW5nIFRyYW5zcG9ydCA9IElTZXJ2aWNlTWFuYWdlcjo6VHJhbnNwb3J0OworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGZxTmFtZSA9IHBhY2thZ2UgKyAiQCIgKyB2ZXJzaW9uICsgIjo6IiArIGludGVyZmFjZTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBpbnN0YW5jZSA9ICJkZWZhdWx0IjsKKyAgICBSZXR1cm48VHJhbnNwb3J0PiB0cmFuc3BvcnQgPSBzbS0+Z2V0VHJhbnNwb3J0KGZxTmFtZSwgaW5zdGFuY2UpOworICAgIGlmICghdHJhbnNwb3J0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9idGFpbiB0cmFuc3BvcnQgdHlwZSBmb3IgJXMvJXM6ICVzIiwKKyAgICAgICAgICAgICAgICBmcU5hbWUuY19zdHIoKSwgaW5zdGFuY2UuY19zdHIoKSwgdHJhbnNwb3J0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRyYW5zcG9ydCAhPSBUcmFuc3BvcnQ6OkVNUFRZOworfQorCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCogY3JlYXRlUHJlZmVycmVkSW1wbChjb25zdCBzdGQ6OnN0cmluZyYgcGFja2FnZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGludGVyZmFjZSkgeworICAgIGZvciAoYXV0byB2ZXJzaW9uID0gZGV0YWlsOjpzQXVkaW9IQUxWZXJzaW9uczsgdmVyc2lvbiAhPSBudWxscHRyOyArK3ZlcnNpb24pIHsKKyAgICAgICAgdm9pZCogcmF3SW50ZXJmYWNlID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKGhhc0hhbFNlcnZpY2UocGFja2FnZSwgKnZlcnNpb24sIGludGVyZmFjZSkKKyAgICAgICAgICAgICAgICAmJiBjcmVhdGVIYWxTZXJ2aWNlKCp2ZXJzaW9uLCBpbnRlcmZhY2UsICZyYXdJbnRlcmZhY2UpKSB7CisgICAgICAgICAgICByZXR1cm4gcmF3SW50ZXJmYWNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZDo6ZGV0YWlsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3ZmJhMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQW5kcm9pZC5icApAQCAtMCwwICsxLDExOCBAQAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJhdWRpb2hhbF9kZWZhdWx0IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkRldmljZUhhbExvY2FsLmNwcCIsCisgICAgICAgICJEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAiLAorICAgICAgICAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAiLAorICAgICAgICAiU3RyZWFtSGFsTG9jYWwuY3BwIiwKKworICAgICAgICAiQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwIiwKKyAgICAgICAgIkRldmljZUhhbEhpZGwuY3BwIiwKKyAgICAgICAgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAiLAorICAgICAgICAiRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAiLAorICAgICAgICAiRWZmZWN0SGFsSGlkbC5jcHAiLAorICAgICAgICAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcCIsCisgICAgICAgICJTdHJlYW1IYWxIaWRsLmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAorICAgICAgICAibGliYXVkaW9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmF1ZGlvaGFsX2RlYXRoaGFuZGxlciIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJmbXEiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYm1lZGlhdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uLnV0aWxAYWxsLXZlcnNpb25zIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9oYWxfaGVhZGVycyIKKyAgICBdLAorCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliZm1xIiwKKyAgICBdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsQDIuMCIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9oYWxfZGVmYXVsdCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9AMi4wIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURNQUpPUl9WRVJTSU9OPTIiLAorICAgICAgICAiLURNSU5PUl9WRVJTSU9OPTAiLAorICAgICAgICAiLWluY2x1ZGUgY29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uTWFjcm8uaCIsCisgICAgXQorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsQDQuMCIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9oYWxfZGVmYXVsdCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA0LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANC4wLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANC4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANC4wIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURNQUpPUl9WRVJTSU9OPTQiLAorICAgICAgICAiLURNSU5PUl9WRVJTSU9OPTAiLAorICAgICAgICAiLWluY2x1ZGUgY29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uTWFjcm8uaCIsCisgICAgXQorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsQDUuMCIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9oYWxfZGVmYXVsdCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA1LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANS4wLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANS4wIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURNQUpPUl9WRVJTSU9OPTUiLAorICAgICAgICAiLURNSU5PUl9WRVJTSU9OPTAiLAorICAgICAgICAiLWluY2x1ZGUgY29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uTWFjcm8uaCIsCisgICAgXQorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvaGFsQDYuMCIsCisgICAgZGVmYXVsdHM6IFsibGliYXVkaW9oYWxfZGVmYXVsdCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmF1ZGlvLmNvbW1vbkA2LjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25ANi4wLXV0aWwiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5lZmZlY3RANi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuYXVkaW9ANi4wIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURNQUpPUl9WRVJTSU9OPTYiLAorICAgICAgICAiLURNSU5PUl9WRVJTSU9OPTAiLAorICAgICAgICAiLWluY2x1ZGUgY29tbW9uL2FsbC12ZXJzaW9ucy9WZXJzaW9uTWFjcm8uaCIsCisgICAgXQorfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYyOWIwZjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0NvbnZlcnNpb25IZWxwZXJIaWRsLmNwcApAQCAtMCwwICsxLDIzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2RlZmluZSBMT0dfVEFHICJIYWxIaWRsIgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOworCisvLyBzdGF0aWMKK3N0YXR1c190IENvbnZlcnNpb25IZWxwZXJIaWRsOjprZXlzRnJvbUhhbChjb25zdCBTdHJpbmc4JiBrZXlzLCBoaWRsX3ZlYzxoaWRsX3N0cmluZz4gKmhpZGxLZXlzKSB7CisgICAgQXVkaW9QYXJhbWV0ZXIgaGFsS2V5cyhrZXlzKTsKKyAgICBpZiAoaGFsS2V5cy5zaXplKCkgPT0gMCkgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBoaWRsS2V5cy0+cmVzaXplKGhhbEtleXMuc2l6ZSgpKTsKKyAgICAvL0ZJWE1FOiAga2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMgYW5kIGtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMgY29tZSB3aXRoIGEKKyAgICAvLyAia2V5Rm9ybWF0PTx2YWx1ZT4iIHBhaXIuIFdlIG5lZWQgdG8gdHJhbnNmb3JtIGl0IGludG8gYSBzaW5nbGUga2V5IHN0cmluZyBzbyB0aGF0IGl0IGlzCisgICAgLy8gY2FycmllZCBvdmVyIHRvIHRoZSBsZWdhY3kgSEFMIHZpYSBISURMLgorICAgIFN0cmluZzggdmFsdWU7CisgICAgYm9vbCBrZWVwRm9ybWF0VmFsdWUgPSBoYWxLZXlzLnNpemUoKSA9PSAyICYmCisgICAgICAgICAoaGFsS2V5cy5nZXQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkQ2hhbm5lbHMpLCB2YWx1ZSkgPT0gTk9fRVJST1IgfHwKKyAgICAgICAgIGhhbEtleXMuZ2V0KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMpLCB2YWx1ZSkgPT0gTk9fRVJST1IpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxLZXlzLnNpemUoKTsgKytpKSB7CisgICAgICAgIFN0cmluZzgga2V5OworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBoYWxLZXlzLmdldEF0KGksIGtleSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgICAgIGlmIChrZWVwRm9ybWF0VmFsdWUgJiYga2V5ID09IEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQpIHsKKyAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIGZvcm1hdFBhcmFtOworICAgICAgICAgICAgaGFsS2V5cy5nZXRBdChpLCBrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIGZvcm1hdFBhcmFtLmFkZChrZXksIHZhbHVlKTsKKyAgICAgICAgICAgIGtleSA9IGZvcm1hdFBhcmFtLnRvU3RyaW5nKCk7CisgICAgICAgIH0KKyAgICAgICAgKCpoaWRsS2V5cylbaV0gPSBrZXkuc3RyaW5nKCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworLy8gc3RhdGljCitzdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6cGFyYW1ldGVyc0Zyb21IYWwoCisgICAgICAgIGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcykgeworICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtcyhrdlBhaXJzKTsKKyAgICBpZiAocGFyYW1zLnNpemUoKSA9PSAwKSByZXR1cm4gQkFEX1ZBTFVFOworICAgIGhpZGxQYXJhbXMtPnJlc2l6ZShwYXJhbXMuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBhcmFtcy5zaXplKCk7ICsraSkgeworICAgICAgICBTdHJpbmc4IGtleSwgdmFsdWU7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtcy5nZXRBdChpLCBrZXksIHZhbHVlKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgKCpoaWRsUGFyYW1zKVtpXS5rZXkgPSBrZXkuc3RyaW5nKCk7CisgICAgICAgICgqaGlkbFBhcmFtcylbaV0udmFsdWUgPSB2YWx1ZS5zdHJpbmcoKTsKKyAgICB9CisgICAgcmV0dXJuIE9LOworfQorCisvLyBzdGF0aWMKK3ZvaWQgQ29udmVyc2lvbkhlbHBlckhpZGw6OnBhcmFtZXRlcnNUb0hhbCgKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+JiBwYXJhbWV0ZXJzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXJhbWV0ZXJzLnNpemUoKTsgKytpKSB7CisgICAgICAgIHBhcmFtcy5hZGQoU3RyaW5nOChwYXJhbWV0ZXJzW2ldLmtleS5jX3N0cigpKSwgU3RyaW5nOChwYXJhbWV0ZXJzW2ldLnZhbHVlLmNfc3RyKCkpKTsKKyAgICB9CisgICAgdmFsdWVzLT5zZXRUbyhwYXJhbXMudG9TdHJpbmcoKSk7Cit9CisKK0NvbnZlcnNpb25IZWxwZXJIaWRsOjpDb252ZXJzaW9uSGVscGVySGlkbChjb25zdCBjaGFyKiBjbGFzc05hbWUpCisgICAgICAgIDogbUNsYXNzTmFtZShjbGFzc05hbWUpIHsKK30KKworLy8gc3RhdGljCitzdGF0dXNfdCBDb252ZXJzaW9uSGVscGVySGlkbDo6YW5hbHl6ZVJlc3VsdChjb25zdCBSZXN1bHQmIHJlc3VsdCkgeworICAgIHN3aXRjaCAocmVzdWx0KSB7CisgICAgICAgIGNhc2UgUmVzdWx0OjpPSzogcmV0dXJuIE9LOworICAgICAgICBjYXNlIFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFM6IHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX1NUQVRFOiByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok5PVF9TVVBQT1JURUQ6IHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgZGVmYXVsdDogcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorfQorCit2b2lkIENvbnZlcnNpb25IZWxwZXJIaWRsOjplbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKSB7CisgICAgQUxPR0UoIiVzICVwICVzOiAlcyAoZnJvbSBycGMpIiwgbUNsYXNzTmFtZSwgdGhpcywgZnVuY05hbWUsIGRlc2NyaXB0aW9uKTsKK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPj0gNAorLy8gVE9ETzogVXNlIHRoZSBzYW1lIGltcGxlbWVudGF0aW9uIGluIHRoZSBoYWwgd2hlbiBpdCBtb3ZlcyB0byBhIHV0aWwgbGlicmFyeS4KK3N0YXRpYyBzdGQ6OnN0cmluZyBkZXZpY2VBZGRyZXNzVG9IYWwoY29uc3QgRGV2aWNlQWRkcmVzcyYgYWRkcmVzcykgeworICAgIC8vIEhBTCBhc3N1bWVzIHRoYXQgdGhlIGFkZHJlc3MgaXMgTlVMLXRlcm1pbmF0ZWQuCisgICAgY2hhciBoYWxBZGRyZXNzW0FVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU5dOworICAgIG1lbXNldChoYWxBZGRyZXNzLCAwLCBzaXplb2YoaGFsQWRkcmVzcykpOworICAgIGF1ZGlvX2RldmljZXNfdCBoYWxEZXZpY2UgPSBzdGF0aWNfY2FzdDxhdWRpb19kZXZpY2VzX3Q+KGFkZHJlc3MuZGV2aWNlKTsKKyAgICBpZiAoZ2V0QXVkaW9EZXZpY2VPdXRBbGxBMmRwU2V0KCkuY291bnQoaGFsRGV2aWNlKSA+IDAgfHwKKyAgICAgICAgaGFsRGV2aWNlID09IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlMDJYOiUwMlg6JTAyWDolMDJYOiUwMlg6JTAyWCIsCisgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5tYWNbMF0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbMV0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbMl0sCisgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5tYWNbM10sIGFkZHJlc3MuYWRkcmVzcy5tYWNbNF0sIGFkZHJlc3MuYWRkcmVzcy5tYWNbNV0pOworICAgIH0gZWxzZSBpZiAoaGFsRGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfSVAgfHwgaGFsRGV2aWNlID09IEFVRElPX0RFVklDRV9JTl9JUCkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICIlZC4lZC4lZC4lZCIsIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzBdLAorICAgICAgICAgICAgICAgICBhZGRyZXNzLmFkZHJlc3MuaXB2NFsxXSwgYWRkcmVzcy5hZGRyZXNzLmlwdjRbMl0sIGFkZHJlc3MuYWRkcmVzcy5pcHY0WzNdKTsKKyAgICB9IGVsc2UgaWYgKGdldEF1ZGlvRGV2aWNlT3V0QWxsVXNiU2V0KCkuY291bnQoaGFsRGV2aWNlKSA+IDAgfHwKKyAgICAgICAgICAgICAgIGdldEF1ZGlvRGV2aWNlSW5BbGxVc2JTZXQoKS5jb3VudChoYWxEZXZpY2UpID4gMCkgeworICAgICAgICBzbnByaW50ZihoYWxBZGRyZXNzLCBzaXplb2YoaGFsQWRkcmVzcyksICJjYXJkPSVkO2RldmljZT0lZCIsIGFkZHJlc3MuYWRkcmVzcy5hbHNhLmNhcmQsCisgICAgICAgICAgICAgICAgIGFkZHJlc3MuYWRkcmVzcy5hbHNhLmRldmljZSk7CisgICAgfSBlbHNlIGlmIChoYWxEZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9CVVMgfHwgaGFsRGV2aWNlID09IEFVRElPX0RFVklDRV9JTl9CVVMpIHsKKyAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJXMiLCBhZGRyZXNzLmJ1c0FkZHJlc3MuY19zdHIoKSk7CisgICAgfSBlbHNlIGlmIChoYWxEZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYIHx8CisgICAgICAgICAgICAgICBoYWxEZXZpY2UgPT0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpIHsKKyAgICAgICAgc25wcmludGYoaGFsQWRkcmVzcywgc2l6ZW9mKGhhbEFkZHJlc3MpLCAiJXMiLCBhZGRyZXNzLnJTdWJtaXhBZGRyZXNzLmNfc3RyKCkpOworICAgIH0gZWxzZSB7CisgICAgICAgIHNucHJpbnRmKGhhbEFkZHJlc3MsIHNpemVvZihoYWxBZGRyZXNzKSwgIiVzIiwgYWRkcmVzcy5idXNBZGRyZXNzLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gaGFsQWRkcmVzczsKK30KKworLy9sb2NhbCBjb252ZXJzaW9uIGhlbHBlcnMKKworc3RhdGljIGF1ZGlvX21pY3JvcGhvbmVfY2hhbm5lbF9tYXBwaW5nX3QgIGNoYW5uZWxNYXBwaW5nVG9IYWwoQXVkaW9NaWNyb3Bob25lQ2hhbm5lbE1hcHBpbmcgbWFwcGluZykgeworICAgIHN3aXRjaCAobWFwcGluZykgeworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOjpVTlVTRUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfVU5VU0VEOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOjpESVJFQ1Q6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfRElSRUNUOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUNoYW5uZWxNYXBwaW5nOjpQUk9DRVNTRUQ6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9DSEFOTkVMX01BUFBJTkdfUFJPQ0VTU0VEOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiVW5rbm93biBjaGFubmVsTWFwcGluZ1RvSGFsIGNvbnZlcnNpb24gJWQiLCBtYXBwaW5nKTsKKyAgICB9Cit9CisKK3N0YXRpYyBhdWRpb19taWNyb3Bob25lX2xvY2F0aW9uX3QgbG9jYXRpb25Ub0hhbChBdWRpb01pY3JvcGhvbmVMb2NhdGlvbiBsb2NhdGlvbikgeworICAgIHN3aXRjaCAobG9jYXRpb24pIHsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVMb2NhdGlvbjo6VU5LTk9XTjoKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0xPQ0FUSU9OX1VOS05PV047CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246Ok1BSU5CT0RZOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fTUFJTkJPRFk7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lTG9jYXRpb246Ok1BSU5CT0RZX01PVkFCTEU6CisgICAgICAgICAgICByZXR1cm4gQVVESU9fTUlDUk9QSE9ORV9MT0NBVElPTl9NQUlOQk9EWV9NT1ZBQkxFOworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZUxvY2F0aW9uOjpQRVJJUEhFUkFMOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfTE9DQVRJT05fUEVSSVBIRVJBTDsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVua25vd24gbG9jYXRpb25Ub0hhbCBjb252ZXJzaW9uICVkIiwgbG9jYXRpb24pOworICAgIH0KK30KK3N0YXRpYyBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbmFsaXR5X3QgZGlyZWN0aW9uYWxpdHlUb0hhbChBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eSBkaXIpIHsKKyAgICBzd2l0Y2ggKGRpcikgeworICAgICAgICBjYXNlIEF1ZGlvTWljcm9waG9uZURpcmVjdGlvbmFsaXR5OjpVTktOT1dOOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfRElSRUNUSU9OQUxJVFlfVU5LTk9XTjsKKyAgICAgICAgY2FzZSBBdWRpb01pY3JvcGhvbmVEaXJlY3Rpb25hbGl0eTo6T01OSToKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NSUNST1BIT05FX0RJUkVDVElPTkFMSVRZX09NTkk7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6OkJJX0RJUkVDVElPTkFMOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfRElSRUNUSU9OQUxJVFlfQklfRElSRUNUSU9OQUw7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6OkNBUkRJT0lEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfRElSRUNUSU9OQUxJVFlfQ0FSRElPSUQ7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6OkhZUEVSX0NBUkRJT0lEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfRElSRUNUSU9OQUxJVFlfSFlQRVJfQ0FSRElPSUQ7CisgICAgICAgIGNhc2UgQXVkaW9NaWNyb3Bob25lRGlyZWN0aW9uYWxpdHk6OlNVUEVSX0NBUkRJT0lEOgorICAgICAgICAgICAgcmV0dXJuIEFVRElPX01JQ1JPUEhPTkVfRElSRUNUSU9OQUxJVFlfU1VQRVJfQ0FSRElPSUQ7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJVbmtub3duIGRpcmVjdGlvbmFsaXR5VG9IYWwgY29udmVyc2lvbiAlZCIsIGRpcik7CisgICAgfQorfQorCit2b2lkIG1pY3JvcGhvbmVJbmZvVG9IYWwoY29uc3QgTWljcm9waG9uZUluZm8mIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgKnBEc3QpIHsKKyAgICBpZiAocERzdCAhPSBOVUxMKSB7CisgICAgICAgIHNucHJpbnRmKHBEc3QtPmRldmljZV9pZCwgc2l6ZW9mKHBEc3QtPmRldmljZV9pZCksCisgICAgICAgICAgICAgICAgICIlcyIsIHNyYy5kZXZpY2VJZC5jX3N0cigpKTsKKyAgICAgICAgcERzdC0+ZGV2aWNlID0gc3RhdGljX2Nhc3Q8YXVkaW9fZGV2aWNlc190PihzcmMuZGV2aWNlQWRkcmVzcy5kZXZpY2UpOworICAgICAgICBzbnByaW50ZihwRHN0LT5hZGRyZXNzLCBzaXplb2YocERzdC0+YWRkcmVzcyksCisgICAgICAgICAgICAgICAgICIlcyIsIGRldmljZUFkZHJlc3NUb0hhbChzcmMuZGV2aWNlQWRkcmVzcykuY19zdHIoKSk7CisgICAgICAgIGlmIChzcmMuY2hhbm5lbE1hcHBpbmcuc2l6ZSgpID4gQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVgpIHsKKyAgICAgICAgICAgIEFMT0dXKCJtaWNyb3Bob25lSW5mb1RvU3RydWN0IGZvdW5kICV6dSBjaGFubmVsTWFwcGluZyBlbGVtZW50cy4gTWF4IGV4cGVjdGVkIGlzICVkIiwKKyAgICAgICAgICAgICAgICAgIHNyYy5jaGFubmVsTWFwcGluZy5zaXplKCksIEFVRElPX0NIQU5ORUxfQ09VTlRfTUFYKTsKKyAgICAgICAgfQorICAgICAgICBzaXplX3QgY2g7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IHNyYy5jaGFubmVsTWFwcGluZy5zaXplKCkgJiYgY2ggPCBBVURJT19DSEFOTkVMX0NPVU5UX01BWDsgY2grKykgeworICAgICAgICAgICAgcERzdC0+Y2hhbm5lbF9tYXBwaW5nW2NoXSA9IGNoYW5uZWxNYXBwaW5nVG9IYWwoc3JjLmNoYW5uZWxNYXBwaW5nW2NoXSk7CisgICAgICAgIH0KKyAgICAgICAgZm9yICg7IGNoIDwgQVVESU9fQ0hBTk5FTF9DT1VOVF9NQVg7IGNoKyspIHsKKyAgICAgICAgICAgIHBEc3QtPmNoYW5uZWxfbWFwcGluZ1tjaF0gPSBBVURJT19NSUNST1BIT05FX0NIQU5ORUxfTUFQUElOR19VTlVTRUQ7CisgICAgICAgIH0KKyAgICAgICAgcERzdC0+bG9jYXRpb24gPSBsb2NhdGlvblRvSGFsKHNyYy5sb2NhdGlvbik7CisgICAgICAgIHBEc3QtPmdyb3VwID0gKGF1ZGlvX21pY3JvcGhvbmVfZ3JvdXBfdClzcmMuZ3JvdXA7CisgICAgICAgIHBEc3QtPmluZGV4X2luX3RoZV9ncm91cCA9ICh1bnNpZ25lZCBpbnQpc3JjLmluZGV4SW5UaGVHcm91cDsKKyAgICAgICAgcERzdC0+c2Vuc2l0aXZpdHkgPSBzcmMuc2Vuc2l0aXZpdHk7CisgICAgICAgIHBEc3QtPm1heF9zcGwgPSBzcmMubWF4U3BsOworICAgICAgICBwRHN0LT5taW5fc3BsID0gc3JjLm1pblNwbDsKKyAgICAgICAgcERzdC0+ZGlyZWN0aW9uYWxpdHkgPSBkaXJlY3Rpb25hbGl0eVRvSGFsKHNyYy5kaXJlY3Rpb25hbGl0eSk7CisgICAgICAgIHBEc3QtPm51bV9mcmVxdWVuY3lfcmVzcG9uc2VzID0gKHVuc2lnbmVkIGludClzcmMuZnJlcXVlbmN5UmVzcG9uc2Uuc2l6ZSgpOworICAgICAgICBpZiAocERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMgPiBBVURJT19NSUNST1BIT05FX01BWF9GUkVRVUVOQ1lfUkVTUE9OU0VTKSB7CisgICAgICAgICAgICBBTE9HVygibWljcm9waG9uZUluZm9Ub1N0cnVjdCBmb3VuZCAlZCBmcmVxdWVuY3kgcmVzcG9uc2VzLiBNYXggZXhwZWN0ZWQgaXMgJWQiLAorICAgICAgICAgICAgICAgICAgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMsIEFVRElPX01JQ1JPUEhPTkVfTUFYX0ZSRVFVRU5DWV9SRVNQT05TRVMpOworICAgICAgICAgICAgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXMgPSBBVURJT19NSUNST1BIT05FX01BWF9GUkVRVUVOQ1lfUkVTUE9OU0VTOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgcERzdC0+bnVtX2ZyZXF1ZW5jeV9yZXNwb25zZXM7IGsrKykgeworICAgICAgICAgICAgcERzdC0+ZnJlcXVlbmN5X3Jlc3BvbnNlc1swXVtrXSA9IHNyYy5mcmVxdWVuY3lSZXNwb25zZVtrXS5mcmVxdWVuY3k7CisgICAgICAgICAgICBwRHN0LT5mcmVxdWVuY3lfcmVzcG9uc2VzWzFdW2tdID0gc3JjLmZyZXF1ZW5jeVJlc3BvbnNlW2tdLmxldmVsOworICAgICAgICB9CisgICAgICAgIHBEc3QtPmdlb21ldHJpY19sb2NhdGlvbi54ID0gc3JjLnBvc2l0aW9uLng7CisgICAgICAgIHBEc3QtPmdlb21ldHJpY19sb2NhdGlvbi55ID0gc3JjLnBvc2l0aW9uLnk7CisgICAgICAgIHBEc3QtPmdlb21ldHJpY19sb2NhdGlvbi56ID0gc3JjLnBvc2l0aW9uLno7CisgICAgICAgIHBEc3QtPm9yaWVudGF0aW9uLnggPSBzcmMub3JpZW50YXRpb24ueDsKKyAgICAgICAgcERzdC0+b3JpZW50YXRpb24ueSA9IHNyYy5vcmllbnRhdGlvbi55OworICAgICAgICBwRHN0LT5vcmllbnRhdGlvbi56ID0gc3JjLm9yaWVudGF0aW9uLno7CisgICAgfQorfQorI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvQ29udmVyc2lvbkhlbHBlckhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYjNiYjlkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9Db252ZXJzaW9uSGVscGVySGlkbC5oCkBAIC0wLDAgKzEsOTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF9ICisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vdHlwZXMuaCkKKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlBhcmFtZXRlclZhbHVlOwordXNpbmcgQ29yZVJlc3VsdCA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6UmVzdWx0OworCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBDb252ZXJzaW9uSGVscGVySGlkbCB7CisgIHByb3RlY3RlZDoKKyAgICBzdGF0aWMgc3RhdHVzX3Qga2V5c0Zyb21IYWwoY29uc3QgU3RyaW5nOCYga2V5cywgaGlkbF92ZWM8aGlkbF9zdHJpbmc+ICpoaWRsS2V5cyk7CisgICAgc3RhdGljIHN0YXR1c190IHBhcmFtZXRlcnNGcm9tSGFsKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMsIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiAqaGlkbFBhcmFtcyk7CisgICAgc3RhdGljIHZvaWQgcGFyYW1ldGVyc1RvSGFsKGNvbnN0IGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiYgcGFyYW1ldGVycywgU3RyaW5nOCAqdmFsdWVzKTsKKworICAgIENvbnZlcnNpb25IZWxwZXJIaWRsKGNvbnN0IGNoYXIqIGNsYXNzTmFtZSk7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBUPgorICAgIHN0YXR1c190IHByb2Nlc3NSZXR1cm4oY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IFJldHVybjxSPiYgcmV0LCBUICpyZXR2YWwpIHsKKyAgICAgICAgaWYgKHJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgd2F5IGl0IGFsc28gd29ya3MgZm9yIGVudW0gY2xhc3MgdG8gdW5zY29wZWQgZW51bSBjb252ZXJzaW9uLgorICAgICAgICAgICAgKnJldHZhbCA9IHN0YXRpY19jYXN0PFQ+KHN0YXRpY19jYXN0PFI+KHJldCkpOworICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CisgICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKGZ1bmNOYW1lLCByZXQpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPFQ+JiByZXQpIHsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQuaXNPaygpID8gT0sgOiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorCisgICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybihjb25zdCBjaGFyKiBmdW5jTmFtZSwgY29uc3QgUmV0dXJuPENvcmVSZXN1bHQ+JiByZXQpIHsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXQpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgc3RhdHVzX3QgcHJvY2Vzc1JldHVybigKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZ1bmNOYW1lLCBjb25zdCBSZXR1cm48VD4mIHJldCwgQ29yZVJlc3VsdCByZXR2YWwpIHsKKyAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgICBlbWl0RXJyb3IoZnVuY05hbWUsIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiByZXQuaXNPaygpID8gYW5hbHl6ZVJlc3VsdChyZXR2YWwpIDogRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IGNoYXIqIG1DbGFzc05hbWU7CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgYW5hbHl6ZVJlc3VsdChjb25zdCBDb3JlUmVzdWx0JiByZXN1bHQpOworCisgICAgdm9pZCBlbWl0RXJyb3IoY29uc3QgY2hhciogZnVuY05hbWUsIGNvbnN0IGNoYXIqIGRlc2NyaXB0aW9uKTsKK307CisKKyNpZiBNQUpPUl9WRVJTSU9OID49IDQKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6TWljcm9waG9uZUluZm87Cit2b2lkIG1pY3JvcGhvbmVJbmZvVG9IYWwoY29uc3QgTWljcm9waG9uZUluZm8mIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgKnBEc3QpOworI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfQ09OVkVSU0lPTl9IRUxQRVJfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTI5Y2QxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmNwcApAQCAtMCwwICsxLDQzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIExPR19UQUcgIkRldmljZUhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVByaW1hcnlEZXZpY2UuaCkKKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPGh3YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db250YWluZXJzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxjb21tb24vYWxsLXZlcnNpb25zL1ZlcnNpb25VdGlscy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKKyNpbmNsdWRlICJIaWRsVXRpbHMuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxIaWRsLmgiCisjaW5jbHVkZSAiVmVyc2lvblV0aWxzLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOjppbXBsZW1lbnRhdGlvbjo6SGlkbFV0aWxzOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6dXRpbHM6OkVudW1CaXRmaWVsZDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjsKK3VzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT047CisKK3VzaW5nIEVmZmVjdEhhbEhpZGwgPSA6OmFuZHJvaWQ6OmVmZmVjdDo6Q1BQX1ZFUlNJT046OkVmZmVjdEhhbEhpZGw7CisKK25hbWVzcGFjZSB7CisKK3N0YXR1c190IGRldmljZUFkZHJlc3NGcm9tSGFsKAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBjaGFyKiBoYWxBZGRyZXNzLCBEZXZpY2VBZGRyZXNzKiBhZGRyZXNzKSB7CisgICAgYWRkcmVzcy0+ZGV2aWNlID0gQXVkaW9EZXZpY2UoZGV2aWNlKTsKKworICAgIGlmIChoYWxBZGRyZXNzID09IG51bGxwdHIgfHwgc3RybmxlbihoYWxBZGRyZXNzLCBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgaWYgKGdldEF1ZGlvRGV2aWNlT3V0QWxsQTJkcFNldCgpLmNvdW50KGRldmljZSkgPiAwCisgICAgICAgICAgICB8fCBkZXZpY2UgPT0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKKyAgICAgICAgICAgICAgICAiJWhoWDolaGhYOiVoaFg6JWhoWDolaGhYOiVoaFgiLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLm1hY1swXSwgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzFdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbMl0sCisgICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MubWFjWzNdLCAmYWRkcmVzcy0+YWRkcmVzcy5tYWNbNF0sICZhZGRyZXNzLT5hZGRyZXNzLm1hY1s1XSk7CisgICAgICAgIHJldHVybiBzdGF0dXMgPT0gNiA/IE9LIDogQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfSVAgfHwgZGV2aWNlID09IEFVRElPX0RFVklDRV9JTl9JUCkgeworICAgICAgICBpbnQgc3RhdHVzID0gc3NjYW5mKGhhbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgIiVoaHUuJWhodS4laGh1LiVoaHUiLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMF0sICZhZGRyZXNzLT5hZGRyZXNzLmlwdjRbMV0sCisgICAgICAgICAgICAgICAgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFsyXSwgJmFkZHJlc3MtPmFkZHJlc3MuaXB2NFszXSk7CisgICAgICAgIHJldHVybiBzdGF0dXMgPT0gNCA/IE9LIDogQkFEX1ZBTFVFOworICAgIH0gZWxzZSBpZiAoZ2V0QXVkaW9EZXZpY2VPdXRBbGxVc2JTZXQoKS5jb3VudChkZXZpY2UpID4gMAorICAgICAgICAgICAgfHwgZ2V0QXVkaW9EZXZpY2VJbkFsbFVzYlNldCgpLmNvdW50KGRldmljZSkgPiAwKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBzc2NhbmYoaGFsQWRkcmVzcywKKyAgICAgICAgICAgICAgICAiY2FyZD0lZDtkZXZpY2U9JWQiLAorICAgICAgICAgICAgICAgICZhZGRyZXNzLT5hZGRyZXNzLmFsc2EuY2FyZCwgJmFkZHJlc3MtPmFkZHJlc3MuYWxzYS5kZXZpY2UpOworICAgICAgICByZXR1cm4gc3RhdHVzID09IDIgPyBPSyA6IEJBRF9WQUxVRTsKKyAgICB9IGVsc2UgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0JVUyB8fCBkZXZpY2UgPT0gQVVESU9fREVWSUNFX0lOX0JVUykgeworICAgICAgICBhZGRyZXNzLT5idXNBZGRyZXNzID0gaGFsQWRkcmVzczsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWAorICAgICAgICAgICAgfHwgZGV2aWNlID09IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSB7CisgICAgICAgIGFkZHJlc3MtPnJTdWJtaXhBZGRyZXNzID0gaGFsQWRkcmVzczsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitEZXZpY2VIYWxIaWRsOjpEZXZpY2VIYWxIaWRsKGNvbnN0IHNwPElEZXZpY2U+JiBkZXZpY2UpCisgICAgICAgIDogQ29udmVyc2lvbkhlbHBlckhpZGwoIkRldmljZSIpLCBtRGV2aWNlKGRldmljZSksCisgICAgICAgICAgbVByaW1hcnlEZXZpY2UoSVByaW1hcnlEZXZpY2U6OmNhc3RGcm9tKGRldmljZSkpIHsKK30KKworRGV2aWNlSGFsSGlkbDo6fkRldmljZUhhbEhpZGwoKSB7CisgICAgaWYgKG1EZXZpY2UgIT0gMCkgeworI2lmIE1BSk9SX1ZFUlNJT04gPD0gNQorICAgICAgICBtRGV2aWNlLmNsZWFyKCk7CisgICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDYKKyAgICAgICAgbURldmljZS0+Y2xvc2UoKTsKKyNlbmRpZgorICAgIH0KK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCopIHsKKyAgICAvLyBPYnNvbGV0ZS4KKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmluaXRDaGVjaygpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiaW5pdENoZWNrIiwgbURldmljZS0+aW5pdENoZWNrKCkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVByaW1hcnlEZXZpY2UgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRWb2ljZVZvbHVtZSIsIG1QcmltYXJ5RGV2aWNlLT5zZXRWb2ljZVZvbHVtZSh2b2x1bWUpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWFzdGVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRNYXN0ZXJWb2x1bWUiLCBtRGV2aWNlLT5zZXRNYXN0ZXJWb2x1bWUodm9sdW1lKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Z2V0TWFzdGVyVm9sdW1lKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBmbG9hdCB2KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnZvbHVtZSA9IHY7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3RlclZvbHVtZSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtUHJpbWFyeURldmljZSA9PSAwKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1vZGUiLCBtUHJpbWFyeURldmljZS0+c2V0TW9kZShBdWRpb01vZGUobW9kZSkpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c2V0TWljTXV0ZShib29sIHN0YXRlKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldE1pY011dGUiLCBtRGV2aWNlLT5zZXRNaWNNdXRlKHN0YXRlKSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNNdXRlKAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBib29sIG11dGUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqc3RhdGUgPSBtdXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRNaWNNdXRlIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRNYXN0ZXJNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0TWFzdGVyTXV0ZSIsIG1EZXZpY2UtPnNldE1hc3Rlck11dGUoc3RhdGUpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldE1hc3Rlck11dGUoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGJvb2wgbXV0ZSkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpzdGF0ZSA9IG11dGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1hc3Rlck11dGUiLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycykgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBoaWRsUGFyYW1zOworICAgIHN0YXR1c190IHN0YXR1cyA9IHBhcmFtZXRlcnNGcm9tSGFsKGt2UGFpcnMsICZoaWRsUGFyYW1zKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIC8vIFRPRE86IGNoYW5nZSB0aGUgQVBJIHNvIHRoYXQgY29udGV4dCBhbmQga3ZQYWlycyBhcmUgc2VwYXJhdGVkCisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFBhcmFtZXRlcnMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIHV0aWxzOjpzZXRQYXJhbWV0ZXJzKG1EZXZpY2UsIHt9IC8qIGNvbnRleHQgKi8sIGhpZGxQYXJhbXMpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICB2YWx1ZXMtPmNsZWFyKCk7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgaGlkbF92ZWM8aGlkbF9zdHJpbmc+IGhpZGxLZXlzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGtleXNGcm9tSGFsKGtleXMsICZoaWRsS2V5cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSB1dGlsczo6Z2V0UGFyYW1ldGVycyhtRGV2aWNlLAorICAgICAgICAgICAge30gLyogY29udGV4dCAqLywKKyAgICAgICAgICAgIGhpZGxLZXlzLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0SW5wdXRCdWZmZXJTaXplKAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsIHNpemVfdCAqc2l6ZSkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1EZXZpY2UtPmdldElucHV0QnVmZmVyU2l6ZSgKKyAgICAgICAgICAgIGhpZGxDb25maWcsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIHVpbnQ2NF90IGJ1ZmZlclNpemUpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICAqc2l6ZSA9IHN0YXRpY19jYXN0PHNpemVfdD4oYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldElucHV0QnVmZmVyU2l6ZSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlPiAqb3V0U3RyZWFtKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgRGV2aWNlQWRkcmVzcyBoaWRsRGV2aWNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRldmljZUFkZHJlc3NGcm9tSGFsKGRldmljZVR5cGUsIGFkZHJlc3MsICZoaWRsRGV2aWNlKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIEF1ZGlvQ29uZmlnIGhpZGxDb25maWc7CisgICAgSGlkbFV0aWxzOjphdWRpb0NvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3Blbk91dHB1dFN0cmVhbSgKKyAgICAgICAgICAgIGhhbmRsZSwKKyAgICAgICAgICAgIGhpZGxEZXZpY2UsCisgICAgICAgICAgICBoaWRsQ29uZmlnLAorICAgICAgICAgICAgRW51bUJpdGZpZWxkPEF1ZGlvT3V0cHV0RmxhZz4oZmxhZ3MpLAorI2lmIE1BSk9SX1ZFUlNJT04gPj0gNAorICAgICAgICAgICAge30gLyogbWV0YWRhdGEgKi8sCisjZW5kaWYKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbU91dD4mIHJlc3VsdCwgY29uc3QgQXVkaW9Db25maWcmIHN1Z2dlc3RlZENvbmZpZykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsSGlkbChyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5PdXRwdXRTdHJlYW0iLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6Om9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKm91dHB1dERldmljZUFkZHJlc3MsCisgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBEZXZpY2VBZGRyZXNzIGhpZGxEZXZpY2U7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGV2aWNlQWRkcmVzc0Zyb21IYWwoZGV2aWNlcywgYWRkcmVzcywgJmhpZGxEZXZpY2UpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgQXVkaW9Db25maWcgaGlkbENvbmZpZzsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnRnJvbUhhbCgqY29uZmlnLCAmaGlkbENvbmZpZyk7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorICAgIGF1dG8gc2lua01ldGFkYXRhID0gQXVkaW9Tb3VyY2Uoc291cmNlKTsKKyNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAorICAgIC8vIFRPRE86IGNvcnJlY3RseSBwcm9wYWdhdGUgdGhlIHRyYWNrcyBzb3VyY2VzIGFuZCB2b2x1bWUKKyAgICAvLyAgICAgICBmb3Igbm93LCBvbmx5IHNlbmQgdGhlIG1haW4gc291cmNlIGF0IDFkYmZzCisgICAgU2lua01ldGFkYXRhIHNpbmtNZXRhZGF0YSA9IHt7eyAuc291cmNlID0gQXVkaW9Tb3VyY2Uoc291cmNlKSwgLmdhaW4gPSAxIH19fTsKKyNlbmRpZgorI2lmIE1BSk9SX1ZFUlNJT04gPCA1CisgICAgKHZvaWQpb3V0cHV0RGV2aWNlOworICAgICh2b2lkKW91dHB1dERldmljZUFkZHJlc3M7CisjZWxzZQorICAgIGlmIChvdXRwdXREZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgRGV2aWNlQWRkcmVzcyBoaWRsT3V0cHV0RGV2aWNlOworICAgICAgICBzdGF0dXMgPSBkZXZpY2VBZGRyZXNzRnJvbUhhbChvdXRwdXREZXZpY2UsIG91dHB1dERldmljZUFkZHJlc3MsICZoaWRsT3V0cHV0RGV2aWNlKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgc2lua01ldGFkYXRhLnRyYWNrc1swXS5kZXN0aW5hdGlvbi5kZXZpY2Uoc3RkOjptb3ZlKGhpZGxPdXRwdXREZXZpY2UpKTsKKyAgICB9CisjZW5kaWYKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+b3BlbklucHV0U3RyZWFtKAorICAgICAgICAgICAgaGFuZGxlLAorICAgICAgICAgICAgaGlkbERldmljZSwKKyAgICAgICAgICAgIGhpZGxDb25maWcsCisgICAgICAgICAgICBFbnVtQml0ZmllbGQ8QXVkaW9JbnB1dEZsYWc+KGZsYWdzKSwKKyAgICAgICAgICAgIHNpbmtNZXRhZGF0YSwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SVN0cmVhbUluPiYgcmVzdWx0LCBjb25zdCBBdWRpb0NvbmZpZyYgc3VnZ2VzdGVkQ29uZmlnKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsSGlkbChyZXN1bHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBIaWRsVXRpbHM6OmF1ZGlvQ29uZmlnVG9IYWwoc3VnZ2VzdGVkQ29uZmlnLCBjb25maWcpOworICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oIm9wZW5JbnB1dFN0cmVhbSIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6c3VwcG9ydHNBdWRpb1BhdGNoZXMoYm9vbCAqc3VwcG9ydHNQYXRjaGVzKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN1cHBvcnRzQXVkaW9QYXRjaGVzIiwgbURldmljZS0+c3VwcG9ydHNBdWRpb1BhdGNoZXMoKSwgc3VwcG9ydHNQYXRjaGVzKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPEF1ZGlvUG9ydENvbmZpZz4gaGlkbFNvdXJjZXMsIGhpZGxTaW5rczsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ3NGcm9tSGFsKG51bV9zb3VyY2VzLCBzb3VyY2VzLCAmaGlkbFNvdXJjZXMpOworICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0Q29uZmlnc0Zyb21IYWwobnVtX3NpbmtzLCBzaW5rcywgJmhpZGxTaW5rcyk7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgIGhpZGxTb3VyY2VzLCBoaWRsU2lua3MsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIEF1ZGlvUGF0Y2hIYW5kbGUgaGlkbFBhdGNoKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnBhdGNoID0gc3RhdGljX2Nhc3Q8YXVkaW9fcGF0Y2hfaGFuZGxlX3Q+KGhpZGxQYXRjaCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImNyZWF0ZUF1ZGlvUGF0Y2giLCByZXQsIHJldHZhbCk7Cit9CisKK3N0YXR1c190IERldmljZUhhbEhpZGw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInJlbGVhc2VBdWRpb1BhdGNoIiwgbURldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gpKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgQXVkaW9Qb3J0IGhpZGxQb3J0OworICAgIEhpZGxVdGlsczo6YXVkaW9Qb3J0RnJvbUhhbCgqcG9ydCwgJmhpZGxQb3J0KTsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRBdWRpb1BvcnQoCisgICAgICAgICAgICBoaWRsUG9ydCwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgQXVkaW9Qb3J0JiBwKSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgSGlkbFV0aWxzOjphdWRpb1BvcnRUb0hhbChwLCBwb3J0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qb3J0IiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBBdWRpb1BvcnRDb25maWcgaGlkbENvbmZpZzsKKyAgICBIaWRsVXRpbHM6OmF1ZGlvUG9ydENvbmZpZ0Zyb21IYWwoKmNvbmZpZywgJmhpZGxDb25maWcpOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJzZXRBdWRpb1BvcnRDb25maWciLCBtRGV2aWNlLT5zZXRBdWRpb1BvcnRDb25maWcoaGlkbENvbmZpZykpOworfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXNJbmZvIF9fdW51c2VkKSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lc0luZm8pIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRGV2aWNlLT5nZXRNaWNyb3Bob25lcygKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaGlkbF92ZWM8TWljcm9waG9uZUluZm8+IG1pY0FycmF5SGFsKSB7CisgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbWljQXJyYXlIYWwuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBkc3Q7CisgICAgICAgICAgICAvL2NvbnZlcnQKKyAgICAgICAgICAgIG1pY3JvcGhvbmVJbmZvVG9IYWwobWljQXJyYXlIYWxba10sICZkc3QpOworICAgICAgICAgICAgbWVkaWE6Ok1pY3JvcGhvbmVJbmZvIG1pY3JvcGhvbmUgPSBtZWRpYTo6TWljcm9waG9uZUluZm8oZHN0KTsKKyAgICAgICAgICAgIG1pY3JvcGhvbmVzSW5mby0+cHVzaF9iYWNrKG1pY3JvcGhvbmUpOworICAgICAgICB9CisgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1pY3JvcGhvbmVzIiwgcmV0LCByZXR2YWwpOworfQorI2VuZGlmCisKKyNpZiBNQUpPUl9WRVJTSU9OID49IDYKK3N0YXR1c190IERldmljZUhhbEhpZGw6OmFkZERldmljZUVmZmVjdCgKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2UsIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7CisgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImFkZERldmljZUVmZmVjdCIsIG1EZXZpY2UtPmFkZERldmljZUVmZmVjdCgKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEF1ZGlvUG9ydEhhbmRsZT4oZGV2aWNlKSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Cit9CisjZWxzZQorc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6YWRkRGV2aWNlRWZmZWN0KAorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZSBfX3VudXNlZCwgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QgX191bnVzZWQpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisjZW5kaWYKKworI2lmIE1BSk9SX1ZFUlNJT04gPj0gNgorc3RhdHVzX3QgRGV2aWNlSGFsSGlkbDo6cmVtb3ZlRGV2aWNlRWZmZWN0KAorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZSwgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKKyAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicmVtb3ZlRGV2aWNlRWZmZWN0IiwgbURldmljZS0+cmVtb3ZlRGV2aWNlRWZmZWN0KAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QXVkaW9Qb3J0SGFuZGxlPihkZXZpY2UpLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8RWZmZWN0SGFsSGlkbCo+KGVmZmVjdC5nZXQoKSktPmVmZmVjdElkKCkpKTsKK30KKyNlbHNlCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpyZW1vdmVEZXZpY2VFZmZlY3QoCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlIF9fdW51c2VkLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKyNlbmRpZgorCitzdGF0dXNfdCBEZXZpY2VIYWxIaWRsOjpkdW1wKGludCBmZCkgeworICAgIGlmIChtRGV2aWNlID09IDApIHJldHVybiBOT19JTklUOworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGlkbEhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOworICAgIGhpZGxIYW5kbGUtPmRhdGFbMF0gPSBmZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbURldmljZS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImR1bXAiLCByZXQpOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzQyZDRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxIaWRsLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0hJRExfSAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lEZXZpY2UuaCkKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVByaW1hcnlEZXZpY2UuaCkKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVByaW1hcnlEZXZpY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZUhhbEhpZGwgOiBwdWJsaWMgRGV2aWNlSGFsSW50ZXJmYWNlLCBwdWJsaWMgQ29udmVyc2lvbkhlbHBlckhpZGwKK3sKKyAgcHVibGljOgorICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7CisKKyAgICAvLyBNdXRpbmcgY29udHJvbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKKworICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBzaXplX3QgKnNpemUpOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCisgICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqb3V0cHV0RGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7CisKKyAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOworCisgICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7CisKKyAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKworICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCisgICAgLy8gTGlzdCBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgc3RhdHVzX3QgYWRkRGV2aWNlRWZmZWN0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgcmVtb3ZlRGV2aWNlRWZmZWN0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbEhpZGw7CisgICAgc3A8SURldmljZT4gbURldmljZTsKKyAgICBzcDxJUHJpbWFyeURldmljZT4gbVByaW1hcnlEZXZpY2U7ICAvLyBOdWxsIGlmIGl0J3Mgbm90IGEgcHJpbWFyeSBkZXZpY2UuCisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgZXhwbGljaXQgRGV2aWNlSGFsSGlkbChjb25zdCBzcDxJRGV2aWNlPiYgZGV2aWNlKTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCisgICAgdmlydHVhbCB+RGV2aWNlSGFsSGlkbCgpOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODAyMWQ5MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlSGFsTG9jYWwuY3BwCkBAIC0wLDAgKzEsMjMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJEZXZpY2VIYWxMb2NhbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxMb2NhbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitEZXZpY2VIYWxMb2NhbDo6RGV2aWNlSGFsTG9jYWwoYXVkaW9faHdfZGV2aWNlX3QgKmRldikKKyAgICAgICAgOiBtRGV2KGRldikgeworfQorCitEZXZpY2VIYWxMb2NhbDo6fkRldmljZUhhbExvY2FsKCkgeworICAgIGludCBzdGF0dXMgPSBhdWRpb19od19kZXZpY2VfY2xvc2UobURldik7CisgICAgQUxPR1dfSUYoc3RhdHVzLCAiRXJyb3IgY2xvc2luZyBhdWRpbyBodyBkZXZpY2UgJXA6ICVzIiwgbURldiwgc3RyZXJyb3IoLXN0YXR1cykpOworICAgIG1EZXYgPSAwOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0U3VwcG9ydGVkRGV2aWNlcyh1aW50MzJfdCAqZGV2aWNlcykgeworICAgIGlmIChtRGV2LT5nZXRfc3VwcG9ydGVkX2RldmljZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICpkZXZpY2VzID0gbURldi0+Z2V0X3N1cHBvcnRlZF9kZXZpY2VzKG1EZXYpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmluaXRDaGVjaygpIHsKKyAgICByZXR1cm4gbURldi0+aW5pdF9jaGVjayhtRGV2KTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSkgeworICAgIHJldHVybiBtRGV2LT5zZXRfdm9pY2Vfdm9sdW1lKG1EZXYsIHZvbHVtZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNYXN0ZXJWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgICAgaWYgKG1EZXYtPnNldF9tYXN0ZXJfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+c2V0X21hc3Rlcl92b2x1bWUobURldiwgdm9sdW1lKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1hc3RlclZvbHVtZShmbG9hdCAqdm9sdW1lKSB7CisgICAgaWYgKG1EZXYtPmdldF9tYXN0ZXJfdm9sdW1lID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbURldi0+Z2V0X21hc3Rlcl92b2x1bWUobURldiwgdm9sdW1lKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpIHsKKyAgICByZXR1cm4gbURldi0+c2V0X21vZGUobURldiwgbW9kZSk7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzZXRNaWNNdXRlKGJvb2wgc3RhdGUpIHsKKyAgICByZXR1cm4gbURldi0+c2V0X21pY19tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmdldE1pY011dGUoYm9vbCAqc3RhdGUpIHsKKyAgICByZXR1cm4gbURldi0+Z2V0X21pY19tdXRlKG1EZXYsIHN0YXRlKTsKK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSkgeworICAgIGlmIChtRGV2LT5zZXRfbWFzdGVyX211dGUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtRGV2LT5zZXRfbWFzdGVyX211dGUobURldiwgc3RhdGUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0TWFzdGVyTXV0ZShib29sICpzdGF0ZSkgeworICAgIGlmIChtRGV2LT5nZXRfbWFzdGVyX211dGUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtRGV2LT5nZXRfbWFzdGVyX211dGUobURldiwgc3RhdGUpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgcmV0dXJuIG1EZXYtPnNldF9wYXJhbWV0ZXJzKG1EZXYsIGt2UGFpcnMuc3RyaW5nKCkpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICBjaGFyICpoYWxWYWx1ZXMgPSBtRGV2LT5nZXRfcGFyYW1ldGVycyhtRGV2LCBrZXlzLnN0cmluZygpKTsKKyAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKKyAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOworICAgICAgICBmcmVlKGhhbFZhbHVlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWVzLT5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRJbnB1dEJ1ZmZlclNpemUoCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywgc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBtRGV2LT5nZXRfaW5wdXRfYnVmZmVyX3NpemUobURldiwgY29uZmlnKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pIHsKKyAgICBhdWRpb19zdHJlYW1fb3V0X3QgKmhhbFN0cmVhbTsKKyAgICBBTE9HVigib3Blbl9vdXRwdXRfc3RyZWFtIGhhbmRsZTogJWQgZGV2aWNlczogJXggZmxhZ3M6ICUjeCIKKyAgICAgICAgICAgICJzcmF0ZTogJWQgZm9ybWF0ICUjeCBjaGFubmVscyAleCBhZGRyZXNzICVzIiwKKyAgICAgICAgICAgIGhhbmRsZSwgZGV2aWNlVHlwZSwgZmxhZ3MsCisgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCisgICAgICAgICAgICBhZGRyZXNzKTsKKyAgICBpbnQgb3BlblJlc3V0ID0gbURldi0+b3Blbl9vdXRwdXRfc3RyZWFtKAorICAgICAgICAgICAgbURldiwgaGFuZGxlLCBkZXZpY2VUeXBlLCBmbGFncywgY29uZmlnLCAmaGFsU3RyZWFtLCBhZGRyZXNzKTsKKyAgICBpZiAob3BlblJlc3V0ID09IE9LKSB7CisgICAgICAgICpvdXRTdHJlYW0gPSBuZXcgU3RyZWFtT3V0SGFsTG9jYWwoaGFsU3RyZWFtLCB0aGlzKTsKKyAgICB9CisgICAgQUxPR1YoIm9wZW5fb3V0cHV0X3N0cmVhbSBzdGF0dXMgJWQgc3RyZWFtICVwIiwgb3BlblJlc3V0LCBoYWxTdHJlYW0pOworICAgIHJldHVybiBvcGVuUmVzdXQ7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpvcGVuSW5wdXRTdHJlYW0oCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgLypvdXRwdXREZXZpY2UqLywKKyAgICAgICAgY29uc3QgY2hhciAqLypvdXRwdXREZXZpY2VBZGRyZXNzKi8sCisgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pIHsKKyAgICBhdWRpb19zdHJlYW1faW5fdCAqaGFsU3RyZWFtOworICAgIEFMT0dWKCJvcGVuX2lucHV0X3N0cmVhbSBoYW5kbGU6ICVkIGRldmljZXM6ICV4IGZsYWdzOiAlI3ggIgorICAgICAgICAgICAgInNyYXRlOiAlZCBmb3JtYXQgJSN4IGNoYW5uZWxzICV4IGFkZHJlc3MgJXMgc291cmNlICVkIiwKKyAgICAgICAgICAgIGhhbmRsZSwgZGV2aWNlcywgZmxhZ3MsCisgICAgICAgICAgICBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCisgICAgICAgICAgICBhZGRyZXNzLCBzb3VyY2UpOworICAgIGludCBvcGVuUmVzdWx0ID0gbURldi0+b3Blbl9pbnB1dF9zdHJlYW0oCisgICAgICAgICAgICBtRGV2LCBoYW5kbGUsIGRldmljZXMsIGNvbmZpZywgJmhhbFN0cmVhbSwgZmxhZ3MsIGFkZHJlc3MsIHNvdXJjZSk7CisgICAgaWYgKG9wZW5SZXN1bHQgPT0gT0spIHsKKyAgICAgICAgKmluU3RyZWFtID0gbmV3IFN0cmVhbUluSGFsTG9jYWwoaGFsU3RyZWFtLCB0aGlzKTsKKyAgICB9CisgICAgQUxPR1YoIm9wZW5faW5wdXRfc3RyZWFtIHN0YXR1cyAlZCBzdHJlYW0gJXAiLCBvcGVuUmVzdWx0LCBpblN0cmVhbSk7CisgICAgcmV0dXJuIG9wZW5SZXN1bHQ7Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpzdXBwb3J0c0F1ZGlvUGF0Y2hlcyhib29sICpzdXBwb3J0c1BhdGNoZXMpIHsKKyAgICAqc3VwcG9ydHNQYXRjaGVzID0gdmVyc2lvbigpID49IEFVRElPX0RFVklDRV9BUElfVkVSU0lPTl8zXzA7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Y3JlYXRlQXVkaW9QYXRjaCgKKyAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZXMsCisgICAgICAgIHVuc2lnbmVkIGludCBudW1fc2lua3MsCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaCkgeworICAgIGlmICh2ZXJzaW9uKCkgPj0gQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCkgeworICAgICAgICByZXR1cm4gbURldi0+Y3JlYXRlX2F1ZGlvX3BhdGNoKAorICAgICAgICAgICAgICAgIG1EZXYsIG51bV9zb3VyY2VzLCBzb3VyY2VzLCBudW1fc2lua3MsIHNpbmtzLCBwYXRjaCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KK30KKworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoKSB7CisgICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKSB7CisgICAgICAgIHJldHVybiBtRGV2LT5yZWxlYXNlX2F1ZGlvX3BhdGNoKG1EZXYsIHBhdGNoKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSB7CisgICAgcmV0dXJuIG1EZXYtPmdldF9hdWRpb19wb3J0KG1EZXYsIHBvcnQpOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSB7CisgICAgaWYgKHZlcnNpb24oKSA+PSBBVURJT19ERVZJQ0VfQVBJX1ZFUlNJT05fM18wKQorICAgICAgICByZXR1cm4gbURldi0+c2V0X2F1ZGlvX3BvcnRfY29uZmlnKG1EZXYsIGNvbmZpZyk7CisgICAgZWxzZQorICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpnZXRNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgeworICAgIGlmIChtRGV2LT5nZXRfbWljcm9waG9uZXMgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHNpemVfdCBhY3R1YWxfbWljcyA9IEFVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UOworICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBtaWNfYXJyYXlbQVVESU9fTUlDUk9QSE9ORV9NQVhfQ09VTlRdOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1EZXYtPmdldF9taWNyb3Bob25lcyhtRGV2LCAmbWljX2FycmF5WzBdLCAmYWN0dWFsX21pY3MpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0dWFsX21pY3M7IGkrKykgeworICAgICAgICBtZWRpYTo6TWljcm9waG9uZUluZm8gbWljcm9waG9uZUluZm8gPSBtZWRpYTo6TWljcm9waG9uZUluZm8obWljX2FycmF5W2ldKTsKKyAgICAgICAgbWljcm9waG9uZXMtPnB1c2hfYmFjayhtaWNyb3Bob25lSW5mbyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisjZW5kaWYKKworLy8gTG9jYWwgSEFMIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHN1cHBvcnQgZWZmZWN0cworc3RhdHVzX3QgRGV2aWNlSGFsTG9jYWw6OmFkZERldmljZUVmZmVjdCgKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2UgX191bnVzZWQsIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0IF9fdW51c2VkKSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCitzdGF0dXNfdCBEZXZpY2VIYWxMb2NhbDo6cmVtb3ZlRGV2aWNlRWZmZWN0KAorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZSBfX3VudXNlZCwgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QgX191bnVzZWQpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IERldmljZUhhbExvY2FsOjpkdW1wKGludCBmZCkgeworICAgIHJldHVybiBtRGV2LT5kdW1wKG1EZXYsIGZkKTsKK30KKwordm9pZCBEZXZpY2VIYWxMb2NhbDo6Y2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpIHsKKyAgICBtRGV2LT5jbG9zZV9vdXRwdXRfc3RyZWFtKG1EZXYsIHN0cmVhbV9vdXQpOworfQorCit2b2lkIERldmljZUhhbExvY2FsOjpjbG9zZUlucHV0U3RyZWFtKHN0cnVjdCBhdWRpb19zdHJlYW1faW4gKnN0cmVhbV9pbikgeworICAgIG1EZXYtPmNsb3NlX2lucHV0X3N0cmVhbShtRGV2LCBzdHJlYW1faW4pOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VIYWxMb2NhbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NWUyYTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZUhhbExvY2FsLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICisKKyNpbmNsdWRlIDxoYXJkd2FyZS9hdWRpby5oPgorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitjbGFzcyBEZXZpY2VIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIC8vIFNldHMgdGhlIHZhbHVlIG9mICdkZXZpY2VzJyB0byBhIGJpdG1hc2sgb2YgMSBvciBtb3JlIHZhbHVlcyBvZiBhdWRpb19kZXZpY2VzX3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKHVpbnQzMl90ICpkZXZpY2VzKTsKKworICAgIC8vIENoZWNrIHRvIHNlZSBpZiB0aGUgYXVkaW8gaGFyZHdhcmUgaW50ZXJmYWNlIGhhcyBiZWVuIGluaXRpYWxpemVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCk7CisKKyAgICAvLyBTZXQgdGhlIGF1ZGlvIHZvbHVtZSBvZiBhIHZvaWNlIGNhbGwuIFJhbmdlIGlzIGJldHdlZW4gMC4wIGFuZCAxLjAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gU2V0IHRoZSBhdWRpbyB2b2x1bWUgZm9yIGFsbCBhdWRpbyBhY3Rpdml0aWVzIG90aGVyIHRoYW4gdm9pY2UgY2FsbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3RlclZvbHVtZShmbG9hdCB2b2x1bWUpOworCisgICAgLy8gR2V0IHRoZSBjdXJyZW50IG1hc3RlciB2b2x1bWUgdmFsdWUgZm9yIHRoZSBIQUwuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJWb2x1bWUoZmxvYXQgKnZvbHVtZSk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgYXVkaW8gbW9kZSBjaGFuZ2VzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7CisKKyAgICAvLyBNdXRpbmcgY29udHJvbC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1pY011dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaWNNdXRlKGJvb2wgKnN0YXRlKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck11dGUoYm9vbCBzdGF0ZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNdXRlKGJvb2wgKnN0YXRlKTsKKworICAgIC8vIFNldCBnbG9iYWwgYXVkaW8gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga3ZQYWlycyk7CisKKyAgICAvLyBHZXQgZ2xvYmFsIGF1ZGlvIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcyk7CisKKyAgICAvLyBSZXR1cm5zIGF1ZGlvIGlucHV0IGJ1ZmZlciBzaXplIGFjY29yZGluZyB0byBwYXJhbWV0ZXJzIHBhc3NlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0QnVmZmVyU2l6ZShjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCisgICAgICAgICAgICBzaXplX3QgKnNpemUpOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIG91dHB1dCBzdHJlYW0uIFRoZSBzdHJlYW0gaXMgY2xvc2VkCisgICAgLy8gYnkgcmVsZWFzaW5nIGFsbCByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuT3V0cHV0U3RyZWFtKAorICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCisgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2U+ICpvdXRTdHJlYW0pOworCisgICAgLy8gQ3JlYXRlcyBhbmQgb3BlbnMgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0IHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBjbG9zZWQKKyAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5JbnB1dFN0cmVhbSgKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqb3V0cHV0RGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGNyZWF0ZUF1ZGlvUGF0Y2ggYW5kIHJlbGVhc2VBdWRpb1BhdGNoIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzQXVkaW9QYXRjaGVzKGJvb2wgKnN1cHBvcnRzUGF0Y2hlcyk7CisKKyAgICAvLyBDcmVhdGVzIGFuIGF1ZGlvIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zb3VyY2VzLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VzLAorICAgICAgICAgICAgdW5zaWduZWQgaW50IG51bV9zaW5rcywKKyAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc2lua3MsCisgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2gpOworCisgICAgLy8gUmVsZWFzZXMgYW4gYXVkaW8gcGF0Y2guCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaCk7CisKKyAgICAvLyBGaWxscyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KTsKKworICAgIC8vIFNldCBhdWRpbyBwb3J0IGNvbmZpZ3VyYXRpb24uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpOworCisgICAgLy8gTGlzdCBtaWNyb3Bob25lcworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOworCisgICAgc3RhdHVzX3QgYWRkRGV2aWNlRWZmZWN0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgb3ZlcnJpZGU7CisgICAgc3RhdHVzX3QgcmVtb3ZlRGV2aWNlRWZmZWN0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKworICAgIHZvaWQgY2xvc2VPdXRwdXRTdHJlYW0oc3RydWN0IGF1ZGlvX3N0cmVhbV9vdXQgKnN0cmVhbV9vdXQpOworICAgIHZvaWQgY2xvc2VJbnB1dFN0cmVhbShzdHJ1Y3QgYXVkaW9fc3RyZWFtX2luICpzdHJlYW1faW4pOworCisgIHByaXZhdGU6CisgICAgYXVkaW9faHdfZGV2aWNlX3QgKm1EZXY7CisKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBleHBsaWNpdCBEZXZpY2VIYWxMb2NhbChhdWRpb19od19kZXZpY2VfdCAqZGV2KTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBkZXZpY2UuCisgICAgdmlydHVhbCB+RGV2aWNlSGFsTG9jYWwoKTsKKworICAgIHVpbnQzMl90IHZlcnNpb24oKSBjb25zdCB7IHJldHVybiBtRGV2LT5jb21tb24udmVyc2lvbjsgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9MT0NBTF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWMwZWFjYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmNwcApAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzZXQ+CisKKyNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21hbmFnZXIvMS4wL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tYW5hZ2VyLzEuMC9JU2VydmljZU5vdGlmaWNhdGlvbi5oPgorI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JRGV2aWNlLmgpCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvaGlkbC9IYWxEZWF0aEhhbmRsZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgorI2luY2x1ZGUgIkRldmljZXNGYWN0b3J5SGFsSGlkbC5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2U7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlJlc3VsdDsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlZvaWQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhpZGw6Om1hbmFnZXI6OlYxXzA6OklTZXJ2aWNlTWFuYWdlcjsKK3VzaW5nIDo6YW5kcm9pZDo6aGlkbDo6bWFuYWdlcjo6VjFfMDo6SVNlcnZpY2VOb3RpZmljYXRpb247CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIFNlcnZpY2VOb3RpZmljYXRpb25MaXN0ZW5lciA6IHB1YmxpYyBJU2VydmljZU5vdGlmaWNhdGlvbiB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBTZXJ2aWNlTm90aWZpY2F0aW9uTGlzdGVuZXIoc3A8RGV2aWNlc0ZhY3RvcnlIYWxIaWRsPiBmYWN0b3J5KQorICAgICAgICAgICAgOiBtRmFjdG9yeShmYWN0b3J5KSB7fQorCisgICAgUmV0dXJuPHZvaWQ+IG9uUmVnaXN0cmF0aW9uKGNvbnN0IGhpZGxfc3RyaW5nJiAvKmZ1bGx5X3F1YWxpZmllZF9uYW1lKi8sCisgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgaW5zdGFuY2VfbmFtZSwKKyAgICAgICAgICAgIGJvb2wgLypwcmVfZXhpc3RpbmcqLykgb3ZlcnJpZGUgeworICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8c3RkOjpzdHJpbmc+KGluc3RhbmNlX25hbWUpID09ICJkZWZhdWx0IikgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgc3A8RGV2aWNlc0ZhY3RvcnlIYWxIaWRsPiBmYWN0b3J5ID0gbUZhY3RvcnkucHJvbW90ZSgpOworICAgICAgICBpZiAoIWZhY3RvcnkpIHJldHVybiBWb2lkKCk7CisgICAgICAgIHNwPElEZXZpY2VzRmFjdG9yeT4gaGFsRmFjdG9yeSA9IElEZXZpY2VzRmFjdG9yeTo6Z2V0U2VydmljZShpbnN0YW5jZV9uYW1lKTsKKyAgICAgICAgaWYgKGhhbEZhY3RvcnkpIHsKKyAgICAgICAgICAgIGZhY3RvcnktPmFkZERldmljZUZhY3RvcnkoaGFsRmFjdG9yeSwgdHJ1ZSAvKm5lZWRUb05vdGlmeSovKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHdwPERldmljZXNGYWN0b3J5SGFsSGlkbD4gbUZhY3Rvcnk7Cit9OworCitEZXZpY2VzRmFjdG9yeUhhbEhpZGw6OkRldmljZXNGYWN0b3J5SGFsSGlkbChzcDxJRGV2aWNlc0ZhY3Rvcnk+IGRldmljZXNGYWN0b3J5KSB7CisgICAgQUxPR19BU1NFUlQoZGV2aWNlc0ZhY3RvcnkgIT0gbnVsbHB0ciwgIlByb3ZpZGVkIGRlZmF1bHQgSURldmljZXNGYWN0b3J5IHNlcnZpY2UgaXMgTlVMTCIpOworICAgIGFkZERldmljZUZhY3RvcnkoZGV2aWNlc0ZhY3RvcnksIGZhbHNlIC8qbmVlZFRvTm90aWZ5Ki8pOworfQorCit2b2lkIERldmljZXNGYWN0b3J5SGFsSGlkbDo6b25GaXJzdFJlZigpIHsKKyAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gSVNlcnZpY2VNYW5hZ2VyOjpnZXRTZXJ2aWNlKCk7CisgICAgQUxPR19BU1NFUlQoc20gIT0gbnVsbHB0ciwgIkhhcmR3YXJlIHNlcnZpY2UgbWFuYWdlciBpcyBub3QgcnVubmluZyIpOworICAgIHNwPFNlcnZpY2VOb3RpZmljYXRpb25MaXN0ZW5lcj4gbGlzdGVuZXIgPSBuZXcgU2VydmljZU5vdGlmaWNhdGlvbkxpc3RlbmVyKHRoaXMpOworICAgIFJldHVybjxib29sPiByZXN1bHQgPSBzbS0+cmVnaXN0ZXJGb3JOb3RpZmljYXRpb25zKAorICAgICAgICAgICAgSURldmljZXNGYWN0b3J5OjpkZXNjcmlwdG9yLCAiIiwgbGlzdGVuZXIpOworICAgIGlmIChyZXN1bHQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFX0lGKCFzdGF0aWNfY2FzdDxib29sPihyZXN1bHQpLAorICAgICAgICAgICAgICAgICJIYXJkd2FyZSBzZXJ2aWNlIG1hbmFnZXIgcmVmdXNlZCB0byByZWdpc3RlciBsaXN0ZW5lciIpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gcmVnaXN0ZXIgZm9yIGhhcmR3YXJlIHNlcnZpY2UgbWFuYWdlciBub3RpZmljYXRpb25zOiAlcyIsCisgICAgICAgICAgICAgICAgcmVzdWx0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0aWMgSURldmljZXNGYWN0b3J5OjpEZXZpY2UgaWRGcm9tSGFsKGNvbnN0IGNoYXIgKm5hbWUsIHN0YXR1c190KiBzdGF0dXMpIHsKKyAgICAqc3RhdHVzID0gT0s7CisgICAgaWYgKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSkgPT0gMCkgeworICAgICAgICByZXR1cm4gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OlBSSU1BUlk7CisgICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfQTJEUCkgPT0gMCkgeworICAgICAgICByZXR1cm4gSURldmljZXNGYWN0b3J5OjpEZXZpY2U6OkEyRFA7CisgICAgfSBlbHNlIGlmKHN0cmNtcChuYW1lLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfVVNCKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6VVNCOworICAgIH0gZWxzZSBpZihzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1JFTU9URV9TVUJNSVgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIElEZXZpY2VzRmFjdG9yeTo6RGV2aWNlOjpSX1NVQk1JWDsKKyAgICB9IGVsc2UgaWYoc3RyY21wKG5hbWUsIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9TVFVCKSA9PSAwKSB7CisgICAgICAgIHJldHVybiBJRGV2aWNlc0ZhY3Rvcnk6OkRldmljZTo6U1RVQjsKKyAgICB9CisgICAgQUxPR0UoIkludmFsaWQgZGV2aWNlIG5hbWUgJXMiLCBuYW1lKTsKKyAgICAqc3RhdHVzID0gQkFEX1ZBTFVFOworICAgIHJldHVybiB7fTsKK30KKyNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAorc3RhdGljIGNvbnN0IGNoYXIqIGlkRnJvbUhhbChjb25zdCBjaGFyICpuYW1lLCBzdGF0dXNfdCogc3RhdHVzKSB7CisgICAgKnN0YXR1cyA9IE9LOworICAgIHJldHVybiBuYW1lOworfQorI2VuZGlmCisKK3N0YXR1c190IERldmljZXNGYWN0b3J5SGFsSGlkbDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKKyAgICBhdXRvIGZhY3RvcmllcyA9IGNvcHlEZXZpY2VGYWN0b3JpZXMoKTsKKyAgICBpZiAoZmFjdG9yaWVzLmVtcHR5KCkpIHJldHVybiBOT19JTklUOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBhdXRvIGhpZGxJZCA9IGlkRnJvbUhhbChuYW1lLCAmc3RhdHVzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSByZXR1cm4gc3RhdHVzOworICAgIFJlc3VsdCByZXR2YWwgPSBSZXN1bHQ6Ok5PVF9JTklUSUFMSVpFRDsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZhY3RvcnkgOiBmYWN0b3JpZXMpIHsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IGZhY3RvcnktPm9wZW5EZXZpY2UoCisgICAgICAgICAgICAgICAgaGlkbElkLAorICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3Qgc3A8SURldmljZT4mIHJlc3VsdCkgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsSGlkbChyZXN1bHQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICAgICAgc3dpdGNoIChyZXR2YWwpIHsKKyAgICAgICAgICAgIC8vIERldmljZSB3YXMgZm91bmQgYW5kIHdhcyBpbml0aWFsaXplZCBzdWNjZXNzZnVsbHkuCisgICAgICAgICAgICBjYXNlIFJlc3VsdDo6T0s6IHJldHVybiBPSzsKKyAgICAgICAgICAgIC8vIERldmljZSB3YXMgZm91bmQgYnV0IGZhaWxlZCB0byBpbml0YWxpemUuCisgICAgICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOiByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgICAgIC8vIE90aGVyd2lzZSBjb250aW51ZSBpdGVyYXRpbmcuCisgICAgICAgICAgICBkZWZhdWx0OiA7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1coIlRoZSBzcGVjaWZpZWQgZGV2aWNlIG5hbWUgaXMgbm90IHJlY29nbml6ZWQ6IFwiJXNcIiIsIG5hbWUpOworICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3N0YXR1c190IERldmljZXNGYWN0b3J5SGFsSGlkbDo6Z2V0SGFsUGlkcyhzdGQ6OnZlY3RvcjxwaWRfdD4gKnBpZHMpIHsKKyAgICBzdGQ6OnNldDxwaWRfdD4gcGlkc1NldDsKKyAgICBhdXRvIGZhY3RvcmllcyA9IGNvcHlEZXZpY2VGYWN0b3JpZXMoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZhY3RvcnkgOiBmYWN0b3JpZXMpIHsKKyAgICAgICAgdXNpbmcgOjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpEZWJ1Z0luZm87CisKKyAgICAgICAgRGVidWdJbmZvIGRlYnVnSW5mbzsKKyAgICAgICAgYXV0byByZXQgPSBmYWN0b3J5LT5nZXREZWJ1Z0luZm8oWyZdIChjb25zdCBhdXRvICZpbmZvKSB7CisgICAgICAgICAgICAgICBkZWJ1Z0luZm8gPSBpbmZvOworICAgICAgICAgICAgfSk7CisgICAgICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlYnVnSW5mby5waWQgPT0gKGludClJU2VydmljZU1hbmFnZXI6OlBpZENvbnN0YW50OjpOT19QSUQpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHBpZHNTZXQuaW5zZXJ0KGRlYnVnSW5mby5waWQpOworICAgIH0KKworICAgICpwaWRzID0ge3BpZHNTZXQuYmVnaW4oKSwgcGlkc1NldC5lbmQoKX07CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBEZXZpY2VzRmFjdG9yeUhhbEhpZGw6OnNldENhbGxiYWNrT25jZShzcDxEZXZpY2VzRmFjdG9yeUhhbENhbGxiYWNrPiBjYWxsYmFjaykgeworICAgIEFMT0dfQVNTRVJUKGNhbGxiYWNrICE9IG51bGxwdHIpOworICAgIGJvb2wgbmVlZFRvQ2FsbENhbGxiYWNrID0gZmFsc2U7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgICAgIGlmIChtQ2FsbGJhY2sudW5zYWZlX2dldCgpKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICBpZiAobUhhdmVVbmRlbGl2ZXJlZE5vdGlmaWNhdGlvbnMpIHsKKyAgICAgICAgICAgIG5lZWRUb0NhbGxDYWxsYmFjayA9IHRydWU7CisgICAgICAgICAgICBtSGF2ZVVuZGVsaXZlcmVkTm90aWZpY2F0aW9ucyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGlmIChuZWVkVG9DYWxsQ2FsbGJhY2spIHsKKyAgICAgICAgY2FsbGJhY2stPm9uTmV3RGV2aWNlc0F2YWlsYWJsZSgpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjphZGREZXZpY2VGYWN0b3J5KHNwPElEZXZpY2VzRmFjdG9yeT4gZmFjdG9yeSwgYm9vbCBuZWVkVG9Ob3RpZnkpIHsKKyAgICAvLyBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlIGluc3RhbmNlIGlzIG93bmVkCisgICAgLy8gYnkgQXVkaW9GbGluZ2VyIGFuZCB0aHVzIGhhdmUgdGhlIHNhbWUgbGlmZXNwYW4uCisgICAgZmFjdG9yeS0+bGlua1RvRGVhdGgoSGFsRGVhdGhIYW5kbGVyOjpnZXRJbnN0YW5jZSgpLCAwIC8qY29va2llKi8pOworICAgIHNwPERldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2s+IGNhbGxiYWNrOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgICAgICBtRGV2aWNlRmFjdG9yaWVzLnB1c2hfYmFjayhmYWN0b3J5KTsKKyAgICAgICAgaWYgKG5lZWRUb05vdGlmeSkgeworICAgICAgICAgICAgY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKCFjYWxsYmFjaykgeworICAgICAgICAgICAgICAgIG1IYXZlVW5kZWxpdmVyZWROb3RpZmljYXRpb25zID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY2FsbGJhY2spIHsKKyAgICAgICAgY2FsbGJhY2stPm9uTmV3RGV2aWNlc0F2YWlsYWJsZSgpOworICAgIH0KK30KKworc3RkOjp2ZWN0b3I8c3A8SURldmljZXNGYWN0b3J5Pj4gRGV2aWNlc0ZhY3RvcnlIYWxIaWRsOjpjb3B5RGV2aWNlRmFjdG9yaWVzKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbURldmljZUZhY3RvcmllczsKK30KKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZmODRlZmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSGlkbC5oCkBAIC0wLDAgKzEsNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hJRExfSAorCisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lEZXZpY2VzRmFjdG9yeS5oKQorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsSGlkbC5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2VzRmFjdG9yeTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIaWRsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoc3A8SURldmljZXNGYWN0b3J5PiBkZXZpY2VzRmFjdG9yeSk7CisgICAgdm9pZCBvbkZpcnN0UmVmKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBPcGVucyBhIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gVG8gY2xvc2UgdGhlIGRldmljZSwgaXQgaXMKKyAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCisgICAgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgZ2V0SGFsUGlkcyhzdGQ6OnZlY3RvcjxwaWRfdD4gKnBpZHMpIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3Qgc2V0Q2FsbGJhY2tPbmNlKHNwPERldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2s+IGNhbGxiYWNrKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBTZXJ2aWNlTm90aWZpY2F0aW9uTGlzdGVuZXI7CisgICAgdm9pZCBhZGREZXZpY2VGYWN0b3J5KHNwPElEZXZpY2VzRmFjdG9yeT4gZmFjdG9yeSwgYm9vbCBuZWVkVG9Ob3RpZnkpOworICAgIHN0ZDo6dmVjdG9yPHNwPElEZXZpY2VzRmFjdG9yeT4+IGNvcHlEZXZpY2VGYWN0b3JpZXMoKTsKKworICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgc3RkOjp2ZWN0b3I8c3A8SURldmljZXNGYWN0b3J5Pj4gbURldmljZUZhY3RvcmllczsgIC8vIEdVQVJERURfQlkobUxvY2spCisgICAgd3A8RGV2aWNlc0ZhY3RvcnlIYWxDYWxsYmFjaz4gbUNhbGxiYWNrOyAgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICBib29sIG1IYXZlVW5kZWxpdmVyZWROb3RpZmljYXRpb25zID0gZmFsc2U7ICAvLyBHVUFSREVEX0JZKG1Mb2NrKQorCisgICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxIaWRsKCkgPSBkZWZhdWx0OworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9ISURMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RlOGQ4NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuY3BwCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkRldmljZXNGYWN0b3J5SGFsSHlicmlkIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIaWRsLmgiCisjaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQuaCIKKyNpbmNsdWRlICJEZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK0RldmljZXNGYWN0b3J5SGFsSHlicmlkOjpEZXZpY2VzRmFjdG9yeUhhbEh5YnJpZChzcDxJRGV2aWNlc0ZhY3Rvcnk+IGhpZGxGYWN0b3J5KQorICAgICAgICA6IG1Mb2NhbEZhY3RvcnkobmV3IERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSksCisgICAgICAgICAgbUhpZGxGYWN0b3J5KG5ldyBEZXZpY2VzRmFjdG9yeUhhbEhpZGwoaGlkbEZhY3RvcnkpKSB7Cit9CisKK3N0YXR1c190IERldmljZXNGYWN0b3J5SGFsSHlicmlkOjpvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgeworICAgIGlmIChtSGlkbEZhY3RvcnkgIT0gMCAmJiBzdHJjbXAoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0EyRFAsIG5hbWUpICE9IDAgJiYKKyAgICAgICAgc3RyY21wKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9IRUFSSU5HX0FJRCwgbmFtZSkgIT0gMCkgeworICAgICAgICByZXR1cm4gbUhpZGxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7CisgICAgfQorICAgIHJldHVybiBtTG9jYWxGYWN0b3J5LT5vcGVuRGV2aWNlKG5hbWUsIGRldmljZSk7Cit9CisKK3N0YXR1c190IERldmljZXNGYWN0b3J5SGFsSHlicmlkOjpnZXRIYWxQaWRzKHN0ZDo6dmVjdG9yPHBpZF90PiAqcGlkcykgeworICAgIGlmIChtSGlkbEZhY3RvcnkgIT0gMCkgeworICAgICAgICByZXR1cm4gbUhpZGxGYWN0b3J5LT5nZXRIYWxQaWRzKHBpZHMpOworICAgIH0KKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IERldmljZXNGYWN0b3J5SGFsSHlicmlkOjpzZXRDYWxsYmFja09uY2Uoc3A8RGV2aWNlc0ZhY3RvcnlIYWxDYWxsYmFjaz4gY2FsbGJhY2spIHsKKyAgICBpZiAobUhpZGxGYWN0b3J5KSB7CisgICAgICAgIHJldHVybiBtSGlkbEZhY3RvcnktPnNldENhbGxiYWNrT25jZShjYWxsYmFjayk7CisgICAgfQorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KKworZXh0ZXJuICJDIiBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKSB2b2lkKiBjcmVhdGVJRGV2aWNlc0ZhY3RvcnkoKSB7CisgICAgYXV0byBzZXJ2aWNlID0gaGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SURldmljZXNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7CisgICAgcmV0dXJuIHNlcnZpY2UgPyBuZXcgQ1BQX1ZFUlNJT046OkRldmljZXNGYWN0b3J5SGFsSHlicmlkKHNlcnZpY2UpIDogbnVsbHB0cjsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbEh5YnJpZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OGExZmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsSHlicmlkLmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0hZQlJJRF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL0lEZXZpY2VzRmFjdG9yeS5oKQorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklEZXZpY2VzRmFjdG9yeTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxIeWJyaWQgOiBwdWJsaWMgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UKK3sKKyAgcHVibGljOgorICAgIERldmljZXNGYWN0b3J5SGFsSHlicmlkKHNwPElEZXZpY2VzRmFjdG9yeT4gaGlkbEZhY3RvcnkpOworCisgICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCisgICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOworCisgICAgICAgICAgICBzdGF0dXNfdCBnZXRIYWxQaWRzKHN0ZDo6dmVjdG9yPHBpZF90PiAqcGlkcykgb3ZlcnJpZGU7CisKKyAgICAgICAgICAgIHN0YXR1c190IHNldENhbGxiYWNrT25jZShzcDxEZXZpY2VzRmFjdG9yeUhhbENhbGxiYWNrPiBjYWxsYmFjaykgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gbUxvY2FsRmFjdG9yeTsKKyAgICBzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gbUhpZGxGYWN0b3J5OworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfREVWSUNFU19GQUNUT1JZX0hBTF9IWUJSSURfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWY2N2ZmNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5jcHAKQEAgLTAsMCArMSw3MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHN0cmluZy5oPgorCisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbExvY2FsLmgiCisjaW5jbHVkZSAiRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitzdGF0aWMgc3RhdHVzX3QgbG9hZF9hdWRpb19pbnRlcmZhY2UoY29uc3QgY2hhciAqaWZfbmFtZSwgYXVkaW9faHdfZGV2aWNlX3QgKipkZXYpCit7CisgICAgY29uc3QgaHdfbW9kdWxlX3QgKm1vZDsKKyAgICBpbnQgcmM7CisKKyAgICByYyA9IGh3X2dldF9tb2R1bGVfYnlfY2xhc3MoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCAmbW9kKTsKKyAgICBpZiAocmMpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNvdWxkbid0IGxvYWQgYXVkaW8gaHcgbW9kdWxlICVzLiVzICglcykiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSUQsIGlmX25hbWUsIHN0cmVycm9yKC1yYykpOworICAgICAgICBnb3RvIG91dDsKKyAgICB9CisgICAgcmMgPSBhdWRpb19od19kZXZpY2Vfb3Blbihtb2QsIGRldik7CisgICAgaWYgKHJjKSB7CisgICAgICAgIEFMT0dFKCIlcyBjb3VsZG4ndCBvcGVuIGF1ZGlvIGh3IGRldmljZSBpbiAlcy4lcyAoJXMpIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lELCBpZl9uYW1lLCBzdHJlcnJvcigtcmMpKTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIGlmICgoKmRldiktPmNvbW1vbi52ZXJzaW9uIDwgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OX01JTikgeworICAgICAgICBBTE9HRSgiJXMgd3JvbmcgYXVkaW8gaHcgZGV2aWNlIHZlcnNpb24gJTA0eCIsIF9fZnVuY19fLCAoKmRldiktPmNvbW1vbi52ZXJzaW9uKTsKKyAgICAgICAgcmMgPSBCQURfVkFMVUU7CisgICAgICAgIGF1ZGlvX2h3X2RldmljZV9jbG9zZSgqZGV2KTsKKyAgICAgICAgZ290byBvdXQ7CisgICAgfQorICAgIHJldHVybiBPSzsKKworb3V0OgorICAgICpkZXYgPSBOVUxMOworICAgIHJldHVybiByYzsKK30KKworc3RhdHVzX3QgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbDo6b3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpIHsKKyAgICBhdWRpb19od19kZXZpY2VfdCAqZGV2OworICAgIHN0YXR1c190IHJjID0gbG9hZF9hdWRpb19pbnRlcmZhY2UobmFtZSwgJmRldik7CisgICAgaWYgKHJjID09IE9LKSB7CisgICAgICAgICpkZXZpY2UgPSBuZXcgRGV2aWNlSGFsTG9jYWwoZGV2KTsKKyAgICB9CisgICAgcmV0dXJuIHJjOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0RldmljZXNGYWN0b3J5SGFsTG9jYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmJmMzYyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9EZXZpY2VzRmFjdG9yeUhhbExvY2FsLmgKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMX0gKKworI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCA6IHB1YmxpYyBEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gT3BlbnMgYSBkZXZpY2Ugd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRvIGNsb3NlIHRoZSBkZXZpY2UsIGl0IGlzCisgICAgLy8gbmVjZXNzYXJ5IHRvIHJlbGVhc2UgcmVmZXJlbmNlcyB0byB0aGUgcmV0dXJuZWQgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbkRldmljZShjb25zdCBjaGFyICpuYW1lLCBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+ICpkZXZpY2UpOworCisgICAgICAgICAgICBzdGF0dXNfdCBnZXRIYWxQaWRzKHN0ZDo6dmVjdG9yPHBpZF90PiAqcGlkcyBfX3VudXNlZCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdHVzX3Qgc2V0Q2FsbGJhY2tPbmNlKHNwPERldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2s+IGNhbGxiYWNrIF9fdW51c2VkKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSHlicmlkOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIERldmljZXNGYWN0b3J5SGFsTG9jYWwoKSB7fQorCisgICAgdmlydHVhbCB+RGV2aWNlc0ZhY3RvcnlIYWxMb2NhbCgpIHt9Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VTX0ZBQ1RPUllfSEFMX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNjc5NzIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuY3BwCkBAIC0wLDAgKzEsMTQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGF0b21pYz4KKworI2RlZmluZSBMT0dfVEFHICJFZmZlY3RCdWZmZXJIYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL2FsbG9jYXRvci8xLjAvSUFsbG9jYXRvci5oPgorI2luY2x1ZGUgPGhpZGxtZW1vcnkvbWFwcGluZy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQ29udmVyc2lvbkhlbHBlckhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIDo6YW5kcm9pZDo6aGlkbDo6YWxsb2NhdG9yOjpWMV8wOjpJQWxsb2NhdG9yOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0IHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKKy8vIHN0YXRpYwordWludDY0X3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWFrZVVuaXF1ZUlkKCkgeworICAgIHN0YXRpYyBzdGQ6OmF0b21pYzx1aW50NjRfdD4gY291bnRlcnsxfTsKKyAgICByZXR1cm4gY291bnRlcisrOworfQorCitzdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjphbGxvY2F0ZSgKKyAgICAgICAgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgeworICAgIHJldHVybiBtaXJyb3IobnVsbHB0ciwgc2l6ZSwgYnVmZmVyKTsKK30KKworc3RhdHVzX3QgRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKAorICAgICAgICB2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgeworICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gdGVtcEJ1ZmZlciA9IG5ldyBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemUpOworICAgIHN0YXR1c190IHJlc3VsdCA9IHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPih0ZW1wQnVmZmVyLmdldCgpKS0+aW5pdCgpOworICAgIGlmIChyZXN1bHQgPT0gT0spIHsKKyAgICAgICAgdGVtcEJ1ZmZlci0+c2V0RXh0ZXJuYWxEYXRhKGV4dGVybmFsKTsKKyAgICAgICAgKmJ1ZmZlciA9IHRlbXBCdWZmZXI7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK0VmZmVjdEJ1ZmZlckhhbEhpZGw6OkVmZmVjdEJ1ZmZlckhhbEhpZGwoc2l6ZV90IHNpemUpCisgICAgICAgIDogbUJ1ZmZlclNpemUoc2l6ZSksIG1GcmFtZUNvdW50Q2hhbmdlZChmYWxzZSksCisgICAgICAgICAgbUV4dGVybmFsRGF0YShudWxscHRyKSwgbUF1ZGlvQnVmZmVyezAsIHtudWxscHRyfX0geworICAgIG1IaWRsQnVmZmVyLmlkID0gbWFrZVVuaXF1ZUlkKCk7CisgICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IDA7Cit9CisKK0VmZmVjdEJ1ZmZlckhhbEhpZGw6On5FZmZlY3RCdWZmZXJIYWxIaWRsKCkgeworfQorCitzdGF0dXNfdCBFZmZlY3RCdWZmZXJIYWxIaWRsOjppbml0KCkgeworICAgIHNwPElBbGxvY2F0b3I+IGFzaG1lbSA9IElBbGxvY2F0b3I6OmdldFNlcnZpY2UoImFzaG1lbSIpOworICAgIGlmIChhc2htZW0gPT0gMCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIGFzaG1lbSBhbGxvY2F0b3Igc2VydmljZSIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgc3RhdHVzX3QgcmV0dmFsID0gTk9fTUVNT1JZOworICAgIFJldHVybjx2b2lkPiByZXN1bHQgPSBhc2htZW0tPmFsbG9jYXRlKAorICAgICAgICAgICAgbUJ1ZmZlclNpemUsCisgICAgICAgICAgICBbJl0oYm9vbCBzdWNjZXNzLCBjb25zdCBoaWRsX21lbW9yeSYgbWVtb3J5KSB7CisgICAgICAgICAgICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgICAgICAgICAgICAgbUhpZGxCdWZmZXIuZGF0YSA9IG1lbW9yeTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gT0s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgaWYgKHJlc3VsdC5pc09rKCkgJiYgcmV0dmFsID09IE9LKSB7CisgICAgICAgIG1NZW1vcnkgPSBoYXJkd2FyZTo6bWFwTWVtb3J5KG1IaWRsQnVmZmVyLmRhdGEpOworICAgICAgICBpZiAobU1lbW9yeSAhPSAwKSB7CisgICAgICAgICAgICBtTWVtb3J5LT51cGRhdGUoKTsKKyAgICAgICAgICAgIG1BdWRpb0J1ZmZlci5yYXcgPSBzdGF0aWNfY2FzdDx2b2lkKj4obU1lbW9yeS0+Z2V0UG9pbnRlcigpKTsKKyAgICAgICAgICAgIG1lbXNldChtQXVkaW9CdWZmZXIucmF3LCAwLCBtTWVtb3J5LT5nZXRTaXplKCkpOworICAgICAgICAgICAgbU1lbW9yeS0+Y29tbWl0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG1hcCBhbGxvY2F0ZWQgYXNobWVtIik7CisgICAgICAgICAgICByZXR2YWwgPSBOT19NRU1PUlk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlICVkIGJ5dGVzIGZyb20gYXNobWVtIiwgKGludCltQnVmZmVyU2l6ZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQuaXNPaygpID8gcmV0dmFsIDogRkFJTEVEX1RSQU5TQUNUSU9OOworfQorCithdWRpb19idWZmZXJfdCogRWZmZWN0QnVmZmVySGFsSGlkbDo6YXVkaW9CdWZmZXIoKSB7CisgICAgcmV0dXJuICZtQXVkaW9CdWZmZXI7Cit9CisKK3ZvaWQqIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmV4dGVybmFsRGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUV4dGVybmFsRGF0YTsKK30KKwordm9pZCBFZmZlY3RCdWZmZXJIYWxIaWRsOjpzZXRGcmFtZUNvdW50KHNpemVfdCBmcmFtZUNvdW50KSB7CisgICAgbUhpZGxCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgbUF1ZGlvQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IHRydWU7Cit9CisKK2Jvb2wgRWZmZWN0QnVmZmVySGFsSGlkbDo6Y2hlY2tGcmFtZUNvdW50Q2hhbmdlKCkgeworICAgIGJvb2wgcmVzdWx0ID0gbUZyYW1lQ291bnRDaGFuZ2VkOworICAgIG1GcmFtZUNvdW50Q2hhbmdlZCA9IGZhbHNlOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRWZmZWN0QnVmZmVySGFsSGlkbDo6c2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKSB7CisgICAgbUV4dGVybmFsRGF0YSA9IGV4dGVybmFsOworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZSgpIHsKKyAgICB1cGRhdGUobUJ1ZmZlclNpemUpOworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdCgpIHsKKyAgICBjb21taXQobUJ1ZmZlclNpemUpOworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OnVwZGF0ZShzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKKyAgICBtTWVtb3J5LT51cGRhdGUoKTsKKyAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7CisgICAgbWVtY3B5KG1BdWRpb0J1ZmZlci5yYXcsIG1FeHRlcm5hbERhdGEsIHNpemUpOworICAgIG1NZW1vcnktPmNvbW1pdCgpOworfQorCit2b2lkIEVmZmVjdEJ1ZmZlckhhbEhpZGw6OmNvbW1pdChzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtRXh0ZXJuYWxEYXRhID09IG51bGxwdHIpIHJldHVybjsKKyAgICBpZiAoc2l6ZSA+IG1CdWZmZXJTaXplKSBzaXplID0gbUJ1ZmZlclNpemU7CisgICAgbWVtY3B5KG1FeHRlcm5hbERhdGEsIG1BdWRpb0J1ZmZlci5yYXcsIHNpemUpOworfQorCit9IC8vIG5hbWVzcGFjZSBlZmZlY3QKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0QnVmZmVySGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4MjY4MTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEJ1ZmZlckhhbEhpZGwuaApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9CVUZGRVJfSEFMX0hJRExfSAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0L0ZJTEVfVkVSU0lPTi90eXBlcy5oKQorI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tZW1vcnkvMS4wL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxoaWRsL0hpZGxTdXBwb3J0Lmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Cit1c2luZyBhbmRyb2lkOjpoaWRsOjptZW1vcnk6OlYxXzA6OklNZW1vcnk7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlZmZlY3QgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOworCitjbGFzcyBFZmZlY3RCdWZmZXJIYWxIaWRsIDogcHVibGljIEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgc3RhdGljIHN0YXR1c190IGFsbG9jYXRlKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpOworICAgIHN0YXRpYyBzdGF0dXNfdCBtaXJyb3Iodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpOworCisgICAgdmlydHVhbCBhdWRpb19idWZmZXJfdCogYXVkaW9CdWZmZXIoKTsKKyAgICB2aXJ0dWFsIHZvaWQqIGV4dGVybmFsRGF0YSgpIGNvbnN0OworCisgICAgdmlydHVhbCBzaXplX3QgZ2V0U2l6ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1CdWZmZXJTaXplOyB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RXh0ZXJuYWxEYXRhKHZvaWQqIGV4dGVybmFsKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RnJhbWVDb3VudChzaXplX3QgZnJhbWVDb3VudCk7CisgICAgdmlydHVhbCBib29sIGNoZWNrRnJhbWVDb3VudENoYW5nZSgpOworCisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZSgpOworICAgIHZpcnR1YWwgdm9pZCBjb21taXQoKTsKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlKHNpemVfdCBzaXplKTsKKyAgICB2aXJ0dWFsIHZvaWQgY29tbWl0KHNpemVfdCBzaXplKTsKKworICAgIGNvbnN0IEF1ZGlvQnVmZmVyJiBoaWRsQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUhpZGxCdWZmZXI7IH0KKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U7CisKKyAgICBzdGF0aWMgdWludDY0X3QgbWFrZVVuaXF1ZUlkKCk7CisKKyAgICBjb25zdCBzaXplX3QgbUJ1ZmZlclNpemU7CisgICAgYm9vbCBtRnJhbWVDb3VudENoYW5nZWQ7CisgICAgdm9pZCogbUV4dGVybmFsRGF0YTsKKyAgICBBdWRpb0J1ZmZlciBtSGlkbEJ1ZmZlcjsKKyAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OworICAgIGF1ZGlvX2J1ZmZlcl90IG1BdWRpb0J1ZmZlcjsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBleHBsaWNpdCBFZmZlY3RCdWZmZXJIYWxIaWRsKHNpemVfdCBzaXplKTsKKworICAgIHZpcnR1YWwgfkVmZmVjdEJ1ZmZlckhhbEhpZGwoKTsKKworICAgIHN0YXR1c190IGluaXQoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBlZmZlY3QKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0JVRkZFUl9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuY3BwIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWY1NzVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmNwcApAQCAtMCwwICsxLDM0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0SGFsSGlkbCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGNvbW1vbi9hbGwtdmVyc2lvbnMvVmVyc2lvblV0aWxzLmg+CisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPG1lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJFZmZlY3RCdWZmZXJIYWxIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0SGFsSGlkbC5oIgorI2luY2x1ZGUgIkhpZGxVdGlscy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Y29tbW9uOjpDUFBfVkVSU0lPTjo6aW1wbGVtZW50YXRpb246OkhpZGxVdGlsczsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OnV0aWxzOjpFbnVtQml0ZmllbGQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1RRGVzY3JpcHRvclN5bmM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlZmZlY3QgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOworCitFZmZlY3RIYWxIaWRsOjpFZmZlY3RIYWxIaWRsKGNvbnN0IHNwPElFZmZlY3Q+JiBlZmZlY3QsIHVpbnQ2NF90IGVmZmVjdElkKQorICAgICAgICA6IG1FZmZlY3QoZWZmZWN0KSwgbUVmZmVjdElkKGVmZmVjdElkKSwgbUJ1ZmZlcnNDaGFuZ2VkKHRydWUpLCBtRWZHcm91cChudWxscHRyKSB7Cit9CisKK0VmZmVjdEhhbEhpZGw6On5FZmZlY3RIYWxIaWRsKCkgeworICAgIGlmIChtRWZmZWN0ICE9IDApIHsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgbUVmZmVjdC5jbGVhcigpOworICAgICAgICBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworICAgIH0KKyAgICBpZiAobUVmR3JvdXApIHsKKyAgICAgICAgRXZlbnRGbGFnOjpkZWxldGVFdmVudEZsYWcoJm1FZkdyb3VwKTsKKyAgICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwoCisgICAgICAgIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIGhhbERlc2NyaXB0b3IpIHsKKyAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnR5cGUsICZoYWxEZXNjcmlwdG9yLT50eXBlKTsKKyAgICBIaWRsVXRpbHM6OnV1aWRUb0hhbChkZXNjcmlwdG9yLnV1aWQsICZoYWxEZXNjcmlwdG9yLT51dWlkKTsKKyAgICBoYWxEZXNjcmlwdG9yLT5mbGFncyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihkZXNjcmlwdG9yLmZsYWdzKTsKKyAgICBoYWxEZXNjcmlwdG9yLT5jcHVMb2FkID0gZGVzY3JpcHRvci5jcHVMb2FkOworICAgIGhhbERlc2NyaXB0b3ItPm1lbW9yeVVzYWdlID0gZGVzY3JpcHRvci5tZW1vcnlVc2FnZTsKKyAgICBtZW1jcHkoaGFsRGVzY3JpcHRvci0+bmFtZSwgZGVzY3JpcHRvci5uYW1lLmRhdGEoKSwgZGVzY3JpcHRvci5uYW1lLnNpemUoKSk7CisgICAgbWVtY3B5KGhhbERlc2NyaXB0b3ItPmltcGxlbWVudG9yLAorICAgICAgICAgICAgZGVzY3JpcHRvci5pbXBsZW1lbnRvci5kYXRhKCksIGRlc2NyaXB0b3IuaW1wbGVtZW50b3Iuc2l6ZSgpKTsKK30KKworLy8gVE9ETyhtbmFnYW5vdik6IFRoZXNlIGJ1ZmZlciBjb252ZXJzaW9uIGZ1bmN0aW9ucyBzaG91bGQgYmUgc2hhcmVkIHdpdGggRWZmZWN0IHdyYXBwZXIKKy8vIHZpYSBIaWRsVXRpbHMuIE1vdmUgdGhlbSB0aGVyZSB3aGVuIGhhcmR3YXJlL2ludGVyZmFjZXMgd2lsbCBnZXQgdW4tZnJvemVuIGFnYWluLgorCisvLyBzdGF0aWMKK3ZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbCgKKyAgICAgICAgY29uc3QgYnVmZmVyX2NvbmZpZ190JiBoYWxDb25maWcsIEVmZmVjdEJ1ZmZlckNvbmZpZyogY29uZmlnKSB7CisgICAgY29uZmlnLT5zYW1wbGluZ1JhdGVIeiA9IGhhbENvbmZpZy5zYW1wbGluZ1JhdGU7CisgICAgY29uZmlnLT5jaGFubmVscyA9IEVudW1CaXRmaWVsZDxBdWRpb0NoYW5uZWxNYXNrPihoYWxDb25maWcuY2hhbm5lbHMpOworICAgIGNvbmZpZy0+Zm9ybWF0ID0gQXVkaW9Gb3JtYXQoaGFsQ29uZmlnLmZvcm1hdCk7CisgICAgY29uZmlnLT5hY2Nlc3NNb2RlID0gRWZmZWN0QnVmZmVyQWNjZXNzKGhhbENvbmZpZy5hY2Nlc3NNb2RlKTsKKyAgICBjb25maWctPm1hc2sgPSBFbnVtQml0ZmllbGQ8RWZmZWN0Q29uZmlnUGFyYW1ldGVycz4oaGFsQ29uZmlnLm1hc2spOworfQorCisvLyBzdGF0aWMKK3ZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoCisgICAgICAgIGNvbnN0IEVmZmVjdEJ1ZmZlckNvbmZpZyYgY29uZmlnLCBidWZmZXJfY29uZmlnX3QqIGhhbENvbmZpZykgeworICAgIGhhbENvbmZpZy0+YnVmZmVyLmZyYW1lQ291bnQgPSAwOworICAgIGhhbENvbmZpZy0+YnVmZmVyLnJhdyA9IE5VTEw7CisgICAgaGFsQ29uZmlnLT5zYW1wbGluZ1JhdGUgPSBjb25maWcuc2FtcGxpbmdSYXRlSHo7CisgICAgaGFsQ29uZmlnLT5jaGFubmVscyA9IHN0YXRpY19jYXN0PHVpbnQzMl90Pihjb25maWcuY2hhbm5lbHMpOworICAgIGhhbENvbmZpZy0+YnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgICBoYWxDb25maWctPmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgICAgaGFsQ29uZmlnLT5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgICBoYWxDb25maWctPmZvcm1hdCA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5mb3JtYXQpOworICAgIGhhbENvbmZpZy0+YWNjZXNzTW9kZSA9IHN0YXRpY19jYXN0PHVpbnQ4X3Q+KGNvbmZpZy5hY2Nlc3NNb2RlKTsKKyAgICBoYWxDb25maWctPm1hc2sgPSBzdGF0aWNfY2FzdDx1aW50OF90Pihjb25maWcubWFzayk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBFZmZlY3RIYWxIaWRsOjplZmZlY3RDb25maWdGcm9tSGFsKGNvbnN0IGVmZmVjdF9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RDb25maWcqIGNvbmZpZykgeworICAgIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoaGFsQ29uZmlnLmlucHV0Q2ZnLCAmY29uZmlnLT5pbnB1dENmZyk7CisgICAgZWZmZWN0QnVmZmVyQ29uZmlnRnJvbUhhbChoYWxDb25maWcub3V0cHV0Q2ZnLCAmY29uZmlnLT5vdXRwdXRDZmcpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgRWZmZWN0SGFsSGlkbDo6ZWZmZWN0Q29uZmlnVG9IYWwoY29uc3QgRWZmZWN0Q29uZmlnJiBjb25maWcsIGVmZmVjdF9jb25maWdfdCogaGFsQ29uZmlnKSB7CisgICAgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoY29uZmlnLmlucHV0Q2ZnLCAmaGFsQ29uZmlnLT5pbnB1dENmZyk7CisgICAgZWZmZWN0QnVmZmVyQ29uZmlnVG9IYWwoY29uZmlnLm91dHB1dENmZywgJmhhbENvbmZpZy0+b3V0cHV0Q2ZnKTsKK30KKworLy8gc3RhdGljCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjphbmFseXplUmVzdWx0KGNvbnN0IFJlc3VsdCYgcmVzdWx0KSB7CisgICAgc3dpdGNoIChyZXN1bHQpIHsKKyAgICAgICAgY2FzZSBSZXN1bHQ6Ok9LOiByZXR1cm4gT0s7CisgICAgICAgIGNhc2UgUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUzogcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgY2FzZSBSZXN1bHQ6OklOVkFMSURfU1RBVEU6IHJldHVybiBOT1RfRU5PVUdIX0RBVEE7CisgICAgICAgIGNhc2UgUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ6IHJldHVybiBOT19JTklUOworICAgICAgICBjYXNlIFJlc3VsdDo6Tk9UX1NVUFBPUlRFRDogcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBjYXNlIFJlc3VsdDo6UkVTVUxUX1RPT19CSUc6IHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIGRlZmF1bHQ6IHJldHVybiBOT19JTklUOworICAgIH0KK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6c2V0SW5CdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7CisgICAgaWYgKCFtQnVmZmVyc0NoYW5nZWQpIHsKKyAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBudWxscHRyIHx8IG1JbkJ1ZmZlci5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXIuZ2V0KCkgIT0gbUluQnVmZmVyLmdldCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLT5hdWRpb0J1ZmZlcigpICE9IG1JbkJ1ZmZlci0+YXVkaW9CdWZmZXIoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtSW5CdWZmZXIgPSBidWZmZXI7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRPdXRCdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKSB7CisgICAgaWYgKCFtQnVmZmVyc0NoYW5nZWQpIHsKKyAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBudWxscHRyIHx8IG1PdXRCdWZmZXIuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gYnVmZmVyLmdldCgpICE9IG1PdXRCdWZmZXIuZ2V0KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtQnVmZmVyc0NoYW5nZWQgPSBidWZmZXItPmF1ZGlvQnVmZmVyKCkgIT0gbU91dEJ1ZmZlci0+YXVkaW9CdWZmZXIoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtT3V0QnVmZmVyID0gYnVmZmVyOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2VzcygpIHsKKyAgICByZXR1cm4gcHJvY2Vzc0ltcGwoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpSRVFVRVNUX1BST0NFU1MpKTsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2Vzc1JldmVyc2UoKSB7CisgICAgcmV0dXJuIHByb2Nlc3NJbXBsKHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6UkVRVUVTVF9QUk9DRVNTX1JFVkVSU0UpKTsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJlcGFyZUZvclByb2Nlc3NpbmcoKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbUVmZmVjdC0+cHJlcGFyZUZvclByb2Nlc3NpbmcoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1RRGVzY3JpcHRvclN5bmM8UmVzdWx0PiYgc3RhdHVzTVEpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSAmJiB0ZW1wU3RhdHVzTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcFN0YXR1c01RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKKyAgICAgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldHZhbCkgOiBGQUlMRURfVFJBTlNBQ1RJT047CisgICAgfQorICAgIGlmICghdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fCAhbUVmR3JvdXApIHsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBTdGF0dXNNUSwgIkZhaWxlZCB0byBvYnRhaW4gc3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIGVmZmVjdHMiKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcFN0YXR1c01RICYmICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSwKKyAgICAgICAgICAgICAgICAiU3RhdHVzIG1lc3NhZ2UgcXVldWUgZm9yIGVmZmVjdHMgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighbUVmR3JvdXAsICJFdmVudCBmbGFnIGNyZWF0aW9uIGZvciBlZmZlY3RzIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7CisgICAgcmV0dXJuIE9LOworfQorCitib29sIEVmZmVjdEhhbEhpZGw6Om5lZWRUb1Jlc2V0QnVmZmVycygpIHsKKyAgICBpZiAobUJ1ZmZlcnNDaGFuZ2VkKSByZXR1cm4gdHJ1ZTsKKyAgICBib29sIGluQnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgPSBtSW5CdWZmZXItPmNoZWNrRnJhbWVDb3VudENoYW5nZSgpOworICAgIGJvb2wgb3V0QnVmZmVyRnJhbWVDb3VudFVwZGF0ZWQgPSBtT3V0QnVmZmVyLT5jaGVja0ZyYW1lQ291bnRDaGFuZ2UoKTsKKyAgICByZXR1cm4gaW5CdWZmZXJGcmFtZUNvdW50VXBkYXRlZCB8fCBvdXRCdWZmZXJGcmFtZUNvdW50VXBkYXRlZDsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6cHJvY2Vzc0ltcGwodWludDMyX3QgbXFGbGFnKSB7CisgICAgaWYgKG1FZmZlY3QgPT0gMCB8fCBtSW5CdWZmZXIgPT0gMCB8fCBtT3V0QnVmZmVyID09IDApIHJldHVybiBOT19JTklUOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICBpZiAoIW1TdGF0dXNNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclByb2Nlc3NpbmcoKSkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKG5lZWRUb1Jlc2V0QnVmZmVycygpICYmIChzdGF0dXMgPSBzZXRQcm9jZXNzQnVmZmVycygpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICAvLyBUaGUgZGF0YSBpcyBhbHJlYWR5IGluIHRoZSBidWZmZXJzLCBqdXN0IG5lZWQgdG8gZmx1c2ggaXQgYW5kIHdha2UgdXAgdGhlIHNlcnZlciBzaWRlLgorICAgIHN0ZDo6YXRvbWljX3RocmVhZF9mZW5jZShzdGQ6Om1lbW9yeV9vcmRlcl9yZWxlYXNlKTsKKyAgICBtRWZHcm91cC0+d2FrZShtcUZsYWcpOworICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOworcmV0cnk6CisgICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6OkRPTkVfUFJPQ0VTU0lORyksICZlZlN0YXRlKTsKKyAgICBpZiAoZWZTdGF0ZSAmIHN0YXRpY19jYXN0PHVpbnQzMl90PihNZXNzYWdlUXVldWVGbGFnQml0czo6RE9ORV9QUk9DRVNTSU5HKSkgeworICAgICAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgICAgIG1TdGF0dXNNUS0+cmVhZCgmcmV0dmFsKTsKKyAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LIHx8IHJldHZhbCA9PSBSZXN1bHQ6OklOVkFMSURfU1RBVEUpIHsKKyAgICAgICAgICAgIC8vIFN5bmMgYmFjayB0aGUgY2hhbmdlZCBjb250ZW50cyBvZiB0aGUgYnVmZmVyLgorICAgICAgICAgICAgc3RkOjphdG9taWNfdGhyZWFkX2ZlbmNlKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBhbmFseXplUmVzdWx0KHJldHZhbCk7CisgICAgfQorICAgIGlmIChyZXQgPT0gLUVBR0FJTiB8fCByZXQgPT0gLUVJTlRSKSB7CisgICAgICAgIC8vIFNwdXJpb3VzIHdha2V1cC4gVGhpcyBub3JtYWxseSByZXRyaWVzIG5vIG1vcmUgdGhhbiBvbmNlLgorICAgICAgICBnb3RvIHJldHJ5OworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRQcm9jZXNzQnVmZmVycygpIHsKKyAgICBSZXR1cm48UmVzdWx0PiByZXQgPSBtRWZmZWN0LT5zZXRQcm9jZXNzQnVmZmVycygKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEJ1ZmZlckhhbEhpZGwqPihtSW5CdWZmZXIuZ2V0KCkpLT5oaWRsQnVmZmVyKCksCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RCdWZmZXJIYWxIaWRsKj4obU91dEJ1ZmZlci5nZXQoKSktPmhpZGxCdWZmZXIoKSk7CisgICAgaWYgKHJldC5pc09rKCkgJiYgcmV0ID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgbUJ1ZmZlcnNDaGFuZ2VkID0gZmFsc2U7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIHJldC5pc09rKCkgPyBhbmFseXplUmVzdWx0KHJldCkgOiBGQUlMRURfVFJBTlNBQ1RJT047Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OmNvbW1hbmQodWludDMyX3QgY21kQ29kZSwgdWludDMyX3QgY21kU2l6ZSwgdm9pZCAqcENtZERhdGEsCisgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKKyAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKworICAgIC8vIFNwZWNpYWwgY2FzZXMuCisgICAgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHIHx8IGNtZENvZGUgPT0gRUZGRUNUX0NNRF9TRVRfQ09ORklHX1JFVkVSU0UpIHsKKyAgICAgICAgcmV0dXJuIHNldENvbmZpZ0ltcGwoY21kQ29kZSwgY21kU2l6ZSwgcENtZERhdGEsIHJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CisgICAgfSBlbHNlIGlmIChjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJRyB8fCBjbWRDb2RlID09IEVGRkVDVF9DTURfR0VUX0NPTkZJR19SRVZFUlNFKSB7CisgICAgICAgIHJldHVybiBnZXRDb25maWdJbXBsKGNtZENvZGUsIHJlcGx5U2l6ZSwgcFJlcGx5RGF0YSk7CisgICAgfQorCisgICAgLy8gQ29tbW9uIGNhc2UuCisgICAgaGlkbF92ZWM8dWludDhfdD4gaGlkbERhdGE7CisgICAgaWYgKHBDbWREYXRhICE9IG51bGxwdHIgJiYgY21kU2l6ZSA+IDApIHsKKyAgICAgICAgaGlkbERhdGEuc2V0VG9FeHRlcm5hbChyZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihwQ21kRGF0YSksIGNtZFNpemUpOworICAgIH0KKyAgICBzdGF0dXNfdCBzdGF0dXM7CisgICAgdWludDMyX3QgcmVwbHlTaXplU3R1YiA9IDA7CisgICAgaWYgKHJlcGx5U2l6ZSA9PSBudWxscHRyIHx8IHBSZXBseURhdGEgPT0gbnVsbHB0cikgcmVwbHlTaXplID0gJnJlcGx5U2l6ZVN0dWI7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPmNvbW1hbmQoY21kQ29kZSwgaGlkbERhdGEsICpyZXBseVNpemUsCisgICAgICAgICAgICBbJl0oaW50MzJfdCBzLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgcmVzdWx0KSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCpyZXBseVNpemUgPiByZXN1bHQuc2l6ZSgpKSAqcmVwbHlTaXplID0gcmVzdWx0LnNpemUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgIT0gbnVsbHB0ciAmJiAqcmVwbHlTaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KHBSZXBseURhdGEsICZyZXN1bHRbMF0sICpyZXBseVNpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHJldC5pc09rKCkgPyBzdGF0dXMgOiBGQUlMRURfVFJBTlNBQ1RJT047Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OmdldERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKKyAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPmdldERlc2NyaXB0b3IoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0dmFsKSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6Y2xvc2UoKSB7CisgICAgaWYgKG1FZmZlY3QgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gbUVmZmVjdC0+Y2xvc2UoKTsKKyAgICByZXR1cm4gcmV0LmlzT2soKSA/IGFuYWx5emVSZXN1bHQocmV0KSA6IEZBSUxFRF9UUkFOU0FDVElPTjsKK30KKworc3RhdHVzX3QgRWZmZWN0SGFsSGlkbDo6ZHVtcChpbnQgZmQpIHsKKyAgICBpZiAobUVmZmVjdCA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3QtPmRlYnVnKGhpZGxIYW5kbGUsIHt9IC8qIG9wdGlvbnMgKi8pOworICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOworICAgIHJldHVybiByZXQuaXNPaygpID8gT0sgOiBGQUlMRURfVFJBTlNBQ1RJT047Cit9CisKK3N0YXR1c190IEVmZmVjdEhhbEhpZGw6OmdldENvbmZpZ0ltcGwoCisgICAgICAgIHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpIHsKKyAgICBpZiAocmVwbHlTaXplID09IE5VTEwgfHwgKnJlcGx5U2l6ZSAhPSBzaXplb2YoZWZmZWN0X2NvbmZpZ190KSB8fCBwUmVwbHlEYXRhID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIFJldHVybjx2b2lkPiByZXQ7CisgICAgaWYgKGNtZENvZGUgPT0gRUZGRUNUX0NNRF9HRVRfQ09ORklHKSB7CisgICAgICAgIHJldCA9IG1FZmZlY3QtPmdldENvbmZpZyhbJl0gKFJlc3VsdCByLCBjb25zdCBFZmZlY3RDb25maWcgJmhpZGxDb25maWcpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocik7CisgICAgICAgICAgICBpZiAociA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgZWZmZWN0Q29uZmlnVG9IYWwoaGlkbENvbmZpZywgc3RhdGljX2Nhc3Q8ZWZmZWN0X2NvbmZpZ190Kj4ocFJlcGx5RGF0YSkpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBtRWZmZWN0LT5nZXRDb25maWdSZXZlcnNlKFsmXSAoUmVzdWx0IHIsIGNvbnN0IEVmZmVjdENvbmZpZyAmaGlkbENvbmZpZykgeworICAgICAgICAgICAgcmVzdWx0ID0gYW5hbHl6ZVJlc3VsdChyKTsKKyAgICAgICAgICAgIGlmIChyID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICBlZmZlY3RDb25maWdUb0hhbChoaWRsQ29uZmlnLCBzdGF0aWNfY2FzdDxlZmZlY3RfY29uZmlnX3QqPihwUmVwbHlEYXRhKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgcmVzdWx0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBFZmZlY3RIYWxIaWRsOjpzZXRDb25maWdJbXBsKAorICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSkgeworICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgIT0gc2l6ZW9mKGVmZmVjdF9jb25maWdfdCkgfHwKKyAgICAgICAgICAgIHJlcGx5U2l6ZSA9PSBOVUxMIHx8ICpyZXBseVNpemUgIT0gc2l6ZW9mKGludDMyX3QpIHx8IHBSZXBseURhdGEgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBjb25zdCBlZmZlY3RfY29uZmlnX3QgKmhhbENvbmZpZyA9IHN0YXRpY19jYXN0PGVmZmVjdF9jb25maWdfdCo+KHBDbWREYXRhKTsKKyAgICBpZiAoaGFsQ29uZmlnLT5pbnB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgIT0gTlVMTCB8fAorICAgICAgICAgICAgaGFsQ29uZmlnLT5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyICE9IE5VTEwgfHwKKyAgICAgICAgICAgIGhhbENvbmZpZy0+b3V0cHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciAhPSBOVUxMIHx8CisgICAgICAgICAgICBoYWxDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkJ1ZmZlciBwcm92aWRlciBjYWxsYmFja3MgYXJlIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICB9CisgICAgRWZmZWN0Q29uZmlnIGhpZGxDb25maWc7CisgICAgZWZmZWN0Q29uZmlnRnJvbUhhbCgqaGFsQ29uZmlnLCAmaGlkbENvbmZpZyk7CisgICAgUmV0dXJuPFJlc3VsdD4gcmV0ID0gY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9DT05GSUcgPworICAgICAgICAgICAgbUVmZmVjdC0+c2V0Q29uZmlnKGhpZGxDb25maWcsIG51bGxwdHIsIG51bGxwdHIpIDoKKyAgICAgICAgICAgIG1FZmZlY3QtPnNldENvbmZpZ1JldmVyc2UoaGlkbENvbmZpZywgbnVsbHB0ciwgbnVsbHB0cik7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgIHJlc3VsdCA9IGFuYWx5emVSZXN1bHQocmV0KTsKKyAgICAgICAgKnN0YXRpY19jYXN0PGludDMyX3QqPihwUmVwbHlEYXRhKSA9IHJlc3VsdDsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGVmZmVjdAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdEhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjIzOGMwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RIYWxIaWRsLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRUZGRUNUX0hBTF9ISURMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RfSEFMX0hJRExfSAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vZWZmZWN0L0ZJTEVfVkVSU0lPTi9JRWZmZWN0LmgpCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8Zm1xL0V2ZW50RmxhZy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0Lmg+CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OkV2ZW50RmxhZzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGVmZmVjdCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT047CisKK2NsYXNzIEVmZmVjdEhhbEhpZGwgOiBwdWJsaWMgRWZmZWN0SGFsSW50ZXJmYWNlCit7CisgIHB1YmxpYzoKKyAgICAvLyBTZXQgdGhlIGlucHV0IGJ1ZmZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEluQnVmZmVyKGNvbnN0IHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4mIGJ1ZmZlcik7CisKKyAgICAvLyBTZXQgdGhlIG91dHB1dCBidWZmZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRPdXRCdWZmZXIoY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiYgYnVmZmVyKTsKKworICAgIC8vIEVmZmVjdCBwcm9jZXNzIGZ1bmN0aW9uLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvY2VzcygpOworCisgICAgLy8gUHJvY2VzcyByZXZlcnNlIHN0cmVhbSBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHBhc3MKKyAgICAvLyBhIHJlZmVyZW5jZSBzdHJlYW0gdG8gdGhlIGVmZmVjdCBlbmdpbmUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBwcm9jZXNzUmV2ZXJzZSgpOworCisgICAgLy8gU2VuZCBhIGNvbW1hbmQgYW5kIHJlY2VpdmUgYSByZXNwb25zZSB0by9mcm9tIGVmZmVjdCBlbmdpbmUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb21tYW5kKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90IGNtZFNpemUsIHZvaWQgKnBDbWREYXRhLAorICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwgdm9pZCAqcFJlcGx5RGF0YSk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBlZmZlY3QgZGVzY3JpcHRvci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldERlc2NyaXB0b3IoZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOworCisgICAgLy8gRnJlZSByZXNvdXJjZXMgb24gdGhlIHJlbW90ZSBzaWRlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xvc2UoKTsKKworICAgIC8vIFdoZXRoZXIgaXQncyBhIGxvY2FsIGltcGxlbWVudGF0aW9uLgorICAgIHZpcnR1YWwgYm9vbCBpc0xvY2FsKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworCisgICAgdWludDY0X3QgZWZmZWN0SWQoKSBjb25zdCB7IHJldHVybiBtRWZmZWN0SWQ7IH0KKworICAgIHN0YXRpYyB2b2lkIGVmZmVjdERlc2NyaXB0b3JUb0hhbCgKKyAgICAgICAgICAgIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsIGVmZmVjdF9kZXNjcmlwdG9yX3QqIGhhbERlc2NyaXB0b3IpOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbDsKKyAgICB0eXBlZGVmIE1lc3NhZ2VRdWV1ZTxSZXN1bHQsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKKworICAgIHNwPElFZmZlY3Q+IG1FZmZlY3Q7CisgICAgY29uc3QgdWludDY0X3QgbUVmZmVjdElkOworICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gbUluQnVmZmVyOworICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4gbU91dEJ1ZmZlcjsKKyAgICBib29sIG1CdWZmZXJzQ2hhbmdlZDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKKyAgICBFdmVudEZsYWcqIG1FZkdyb3VwOworCisgICAgc3RhdGljIHN0YXR1c190IGFuYWx5emVSZXN1bHQoY29uc3QgUmVzdWx0JiByZXN1bHQpOworICAgIHN0YXRpYyB2b2lkIGVmZmVjdEJ1ZmZlckNvbmZpZ0Zyb21IYWwoCisgICAgICAgICAgICBjb25zdCBidWZmZXJfY29uZmlnX3QmIGhhbENvbmZpZywgRWZmZWN0QnVmZmVyQ29uZmlnKiBjb25maWcpOworICAgIHN0YXRpYyB2b2lkIGVmZmVjdEJ1ZmZlckNvbmZpZ1RvSGFsKAorICAgICAgICAgICAgY29uc3QgRWZmZWN0QnVmZmVyQ29uZmlnJiBjb25maWcsIGJ1ZmZlcl9jb25maWdfdCogaGFsQ29uZmlnKTsKKyAgICBzdGF0aWMgdm9pZCBlZmZlY3RDb25maWdGcm9tSGFsKGNvbnN0IGVmZmVjdF9jb25maWdfdCYgaGFsQ29uZmlnLCBFZmZlY3RDb25maWcqIGNvbmZpZyk7CisgICAgc3RhdGljIHZvaWQgZWZmZWN0Q29uZmlnVG9IYWwoY29uc3QgRWZmZWN0Q29uZmlnJiBjb25maWcsIGVmZmVjdF9jb25maWdfdCogaGFsQ29uZmlnKTsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBFZmZlY3RIYWxIaWRsKGNvbnN0IHNwPElFZmZlY3Q+JiBlZmZlY3QsIHVpbnQ2NF90IGVmZmVjdElkKTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgcmVsZWFzZXMgdGhlIGVmZmVjdC4KKyAgICB2aXJ0dWFsIH5FZmZlY3RIYWxIaWRsKCk7CisKKyAgICBzdGF0dXNfdCBnZXRDb25maWdJbXBsKHVpbnQzMl90IGNtZENvZGUsIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOworICAgIHN0YXR1c190IHByZXBhcmVGb3JQcm9jZXNzaW5nKCk7CisgICAgYm9vbCBuZWVkVG9SZXNldEJ1ZmZlcnMoKTsKKyAgICBzdGF0dXNfdCBwcm9jZXNzSW1wbCh1aW50MzJfdCBtcUZsYWcpOworICAgIHN0YXR1c190IHNldENvbmZpZ0ltcGwoCisgICAgICAgICAgICB1aW50MzJfdCBjbWRDb2RlLCB1aW50MzJfdCBjbWRTaXplLCB2b2lkICpwQ21kRGF0YSwKKyAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUsIHZvaWQgKnBSZXBseURhdGEpOworICAgIHN0YXR1c190IHNldFByb2Nlc3NCdWZmZXJzKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgZWZmZWN0Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVF9IQUxfSElETF9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL0VmZmVjdHNGYWN0b3J5SGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5MmEzMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmNwcApAQCAtMCwwICsxLDE2OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiRWZmZWN0c0ZhY3RvcnlIYWxIaWRsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKworI2luY2x1ZGUgIkNvbnZlcnNpb25IZWxwZXJIaWRsLmgiCisjaW5jbHVkZSAiRWZmZWN0QnVmZmVySGFsSGlkbC5oIgorI2luY2x1ZGUgIkVmZmVjdEhhbEhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RzRmFjdG9yeUhhbEhpZGwuaCIKKyNpbmNsdWRlICJIaWRsVXRpbHMuaCIKKwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT046OmltcGxlbWVudGF0aW9uOjpIaWRsVXRpbHM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBlZmZlY3QgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpjb21tb246OkNQUF9WRVJTSU9OOwordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjplZmZlY3Q6OkNQUF9WRVJTSU9OOworCitFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OkVmZmVjdHNGYWN0b3J5SGFsSGlkbChzcDxJRWZmZWN0c0ZhY3Rvcnk+IGVmZmVjdHNGYWN0b3J5KQorICAgICAgICA6IENvbnZlcnNpb25IZWxwZXJIaWRsKCJFZmZlY3RzRmFjdG9yeSIpIHsKKyAgICBBTE9HX0FTU0VSVChlZmZlY3RzRmFjdG9yeSAhPSBudWxscHRyLCAiUHJvdmlkZWQgSURldmljZXNGYWN0b3J5IHNlcnZpY2UgaXMgTlVMTCIpOworICAgIG1FZmZlY3RzRmFjdG9yeSA9IGVmZmVjdHNGYWN0b3J5OworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5QWxsRGVzY3JpcHRvcnMoKSB7CisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+Z2V0QWxsRGVzY3JpcHRvcnMoCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IGhpZGxfdmVjPEVmZmVjdERlc2NyaXB0b3I+JiByZXN1bHQpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBtTGFzdERlc2NyaXB0b3JzID0gcmVzdWx0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXR2YWwgPT0gUmVzdWx0OjpPSyA/IE9LIDogTk9fSU5JVDsKKyAgICB9CisgICAgbUxhc3REZXNjcmlwdG9ycy5yZXNpemUoMCk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OnF1ZXJ5TnVtYmVyRWZmZWN0cyh1aW50MzJfdCAqcE51bUVmZmVjdHMpIHsKKyAgICBzdGF0dXNfdCBxdWVyeVJlc3VsdCA9IHF1ZXJ5QWxsRGVzY3JpcHRvcnMoKTsKKyAgICBpZiAocXVlcnlSZXN1bHQgPT0gT0spIHsKKyAgICAgICAgKnBOdW1FZmZlY3RzID0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCk7CisgICAgfQorICAgIHJldHVybiBxdWVyeVJlc3VsdDsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjpnZXREZXNjcmlwdG9yKAorICAgICAgICB1aW50MzJfdCBpbmRleCwgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpIHsKKyAgICAvLyBUT0RPOiBXZSBuZWVkIHNvbWVob3cgdG8gdHJhY2sgdGhlIGNoYW5nZXMgb24gdGhlIHNlcnZlciBzaWRlCisgICAgLy8gb3IgZmlndXJlIG91dCBob3cgdG8gY29udmVydCBldmVyeWJvZHkgdG8gcXVlcnkgYWxsIHRoZSBkZXNjcmlwdG9ycyBhdCBvbmNlLgorICAgIC8vIFRPRE86IGNoZWNrIGZvciBudWxscHRyCisgICAgaWYgKG1MYXN0RGVzY3JpcHRvcnMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgc3RhdHVzX3QgcXVlcnlSZXN1bHQgPSBxdWVyeUFsbERlc2NyaXB0b3JzKCk7CisgICAgICAgIGlmIChxdWVyeVJlc3VsdCAhPSBPSykgcmV0dXJuIHF1ZXJ5UmVzdWx0OworICAgIH0KKyAgICBpZiAoaW5kZXggPj0gbUxhc3REZXNjcmlwdG9ycy5zaXplKCkpIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICBFZmZlY3RIYWxIaWRsOjplZmZlY3REZXNjcmlwdG9yVG9IYWwobUxhc3REZXNjcmlwdG9yc1tpbmRleF0sIHBEZXNjcmlwdG9yKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6Z2V0RGVzY3JpcHRvcigKKyAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGVmZmVjdF9kZXNjcmlwdG9yX3QgKnBEZXNjcmlwdG9yKSB7CisgICAgLy8gVE9ETzogY2hlY2sgZm9yIG51bGxwdHIKKyAgICBpZiAobUVmZmVjdHNGYWN0b3J5ID09IDApIHJldHVybiBOT19JTklUOworICAgIFV1aWQgaGlkbFV1aWQ7CisgICAgSGlkbFV0aWxzOjp1dWlkRnJvbUhhbCgqcEVmZmVjdFV1aWQsICZoaWRsVXVpZCk7CisgICAgUmVzdWx0IHJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmdldERlc2NyaXB0b3IoaGlkbFV1aWQsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IEVmZmVjdERlc2NyaXB0b3ImIHJlc3VsdCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIEVmZmVjdEhhbEhpZGw6OmVmZmVjdERlc2NyaXB0b3JUb0hhbChyZXN1bHQsIHBEZXNjcmlwdG9yKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHJldHVybiBPSzsKKyAgICAgICAgZWxzZSBpZiAocmV0dmFsID09IFJlc3VsdDo6SU5WQUxJRF9BUkdVTUVOVFMpIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICAgICAgZWxzZSByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmNyZWF0ZUVmZmVjdCgKKyAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCisgICAgICAgIGludDMyX3QgZGV2aWNlSWQgX191bnVzZWQsIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCkgeworICAgIGlmIChtRWZmZWN0c0ZhY3RvcnkgPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgVXVpZCBoaWRsVXVpZDsKKyAgICBIaWRsVXRpbHM6OnV1aWRGcm9tSGFsKCpwRWZmZWN0VXVpZCwgJmhpZGxVdWlkKTsKKyAgICBSZXN1bHQgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldDsKKyNpZiBNQUpPUl9WRVJTSU9OID49IDYKKyAgICByZXQgPSBtRWZmZWN0c0ZhY3RvcnktPmNyZWF0ZUVmZmVjdCgKKyAgICAgICAgICAgIGhpZGxVdWlkLCBzZXNzaW9uSWQsIGlvSWQsIGRldmljZUlkLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRWZmZWN0PiYgcmVzdWx0LCB1aW50NjRfdCBlZmZlY3RJZCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICplZmZlY3QgPSBuZXcgRWZmZWN0SGFsSGlkbChyZXN1bHQsIGVmZmVjdElkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyNlbHNlCisgICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX0RFVklDRSAmJiBpb0lkID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgcmV0ID0gbUVmZmVjdHNGYWN0b3J5LT5jcmVhdGVFZmZlY3QoCisgICAgICAgICAgICBoaWRsVXVpZCwgc2Vzc2lvbklkLCBpb0lkLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBzcDxJRWZmZWN0PiYgcmVzdWx0LCB1aW50NjRfdCBlZmZlY3RJZCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICplZmZlY3QgPSBuZXcgRWZmZWN0SGFsSGlkbChyZXN1bHQsIGVmZmVjdElkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyNlbmRpZgorICAgIGlmIChyZXQuaXNPaygpKSB7CisgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgcmV0dXJuIE9LOworICAgICAgICBlbHNlIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpJTlZBTElEX0FSR1VNRU5UUykgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOworICAgICAgICBlbHNlIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybihfX0ZVTkNUSU9OX18sIHJldCk7Cit9CisKK3N0YXR1c190IEVmZmVjdHNGYWN0b3J5SGFsSGlkbDo6ZHVtcEVmZmVjdHMoaW50IGZkKSB7CisgICAgaWYgKG1FZmZlY3RzRmFjdG9yeSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1FZmZlY3RzRmFjdG9yeS0+ZGVidWcoaGlkbEhhbmRsZSwge30gLyogb3B0aW9ucyAqLyk7CisgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGlkbEhhbmRsZSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oX19GVU5DVElPTl9fLCByZXQpOworfQorCitzdGF0dXNfdCBFZmZlY3RzRmFjdG9yeUhhbEhpZGw6OmFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6YWxsb2NhdGUoc2l6ZSwgYnVmZmVyKTsKK30KKworc3RhdHVzX3QgRWZmZWN0c0ZhY3RvcnlIYWxIaWRsOjptaXJyb3JCdWZmZXIodm9pZCogZXh0ZXJuYWwsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIHsKKyAgICByZXR1cm4gRWZmZWN0QnVmZmVySGFsSGlkbDo6bWlycm9yKGV4dGVybmFsLCBzaXplLCBidWZmZXIpOworfQorCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgZWZmZWN0CisKK2V4dGVybiAiQyIgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkgdm9pZCogY3JlYXRlSUVmZmVjdHNGYWN0b3J5KCkgeworICAgIGF1dG8gc2VydmljZSA9IGhhcmR3YXJlOjphdWRpbzo6ZWZmZWN0OjpDUFBfVkVSU0lPTjo6SUVmZmVjdHNGYWN0b3J5OjpnZXRTZXJ2aWNlKCk7CisgICAgcmV0dXJuIHNlcnZpY2UgPyBuZXcgZWZmZWN0OjpDUFBfVkVSU0lPTjo6RWZmZWN0c0ZhY3RvcnlIYWxIaWRsKHNlcnZpY2UpIDogbnVsbHB0cjsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9FZmZlY3RzRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVjZTFiYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvRWZmZWN0c0ZhY3RvcnlIYWxIaWRsLmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX0VGRkVDVFNfRkFDVE9SWV9IQUxfSElETF9ICisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9lZmZlY3QvRklMRV9WRVJTSU9OL0lFZmZlY3RzRmFjdG9yeS5oKQorI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZWZmZWN0IHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgOjphbmRyb2lkOjpDUFBfVkVSU0lPTjo6Q29udmVyc2lvbkhlbHBlckhpZGw7Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmVmZmVjdDo6Q1BQX1ZFUlNJT047CisKK2NsYXNzIEVmZmVjdHNGYWN0b3J5SGFsSGlkbCA6IHB1YmxpYyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCit7CisgIHB1YmxpYzoKKyAgICBFZmZlY3RzRmFjdG9yeUhhbEhpZGwoc3A8SUVmZmVjdHNGYWN0b3J5PiBlZmZlY3RzRmFjdG9yeSk7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGlmZmVyZW50IGVmZmVjdHMgaW4gYWxsIGxvYWRlZCBsaWJyYXJpZXMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeU51bWJlckVmZmVjdHModWludDMyX3QgKnBOdW1FZmZlY3RzKTsKKworICAgIC8vIFJldHVybnMgYSBkZXNjcmlwdG9yIG9mIHRoZSBuZXh0IGF2YWlsYWJsZSBlZmZlY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKHVpbnQzMl90IGluZGV4LAorICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXREZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAorICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2NyaXB0b3IpOworCisgICAgLy8gQ3JlYXRlcyBhbiBlZmZlY3QgZW5naW5lIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgICAvLyBUbyByZWxlYXNlIHRoZSBlZmZlY3QgZW5naW5lLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzCisgICAgLy8gdG8gdGhlIHJldHVybmVkIGVmZmVjdCBvYmplY3QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCisgICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLCBpbnQzMl90IGRldmljZUlkLAorICAgICAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcEVmZmVjdHMoaW50IGZkKTsKKworICAgIHN0YXR1c190IGFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpIG92ZXJyaWRlOworICAgIHN0YXR1c190IG1pcnJvckJ1ZmZlcih2b2lkKiBleHRlcm5hbCwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBzcDxJRWZmZWN0c0ZhY3Rvcnk+IG1FZmZlY3RzRmFjdG9yeTsKKyAgICBoaWRsX3ZlYzxFZmZlY3REZXNjcmlwdG9yPiBtTGFzdERlc2NyaXB0b3JzOworCisgICAgc3RhdHVzX3QgcXVlcnlBbGxEZXNjcmlwdG9ycygpOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGVmZmVjdAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9FRkZFQ1RTX0ZBQ1RPUllfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxIaWRsLmNwcCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4ZGRkYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5jcHAKQEAgLTAsMCArMSw4ODMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbEhpZGwiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbU91dENhbGxiYWNrLmgpCisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkRldmljZUhhbEhpZGwuaCIKKyNpbmNsdWRlICJFZmZlY3RIYWxIaWRsLmgiCisjaW5jbHVkZSAiU3RyZWFtSGFsSGlkbC5oIgorI2luY2x1ZGUgIlZlcnNpb25VdGlscy5oIgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKwordXNpbmcgRWZmZWN0SGFsSGlkbCA9IDo6YW5kcm9pZDo6ZWZmZWN0OjpDUFBfVkVSU0lPTjo6RWZmZWN0SGFsSGlkbDsKK3VzaW5nIFJlYWRDb21tYW5kID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtSW46OlJlYWRDb21tYW5kOworCit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OmNvbW1vbjo6Q1BQX1ZFUlNJT047Cit1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOworCitTdHJlYW1IYWxIaWRsOjpTdHJlYW1IYWxIaWRsKElTdHJlYW0gKnN0cmVhbSkKKyAgICAgICAgOiBDb252ZXJzaW9uSGVscGVySGlkbCgiU3RyZWFtIiksCisgICAgICAgICAgbVN0cmVhbShzdHJlYW0pLAorICAgICAgICAgIG1IYWxUaHJlYWRQcmlvcml0eShIQUxfVEhSRUFEX1BSSU9SSVRZX0RFRkFVTFQpLAorICAgICAgICAgIG1DYWNoZWRCdWZmZXJTaXplKDApeworCisgICAgLy8gSW5zdHJ1bWVudCBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICAvLyBOb3RlOiBUaGlzIGFzc3VtZXMgY2hhbm5lbCBtYXNrLCBmb3JtYXQsIGFuZCBzYW1wbGUgcmF0ZSBkbyBub3QgY2hhbmdlIGFmdGVyIGNyZWF0aW9uLgorICAgIGlmIChtU3RyZWFtICE9IG51bGxwdHIgLyogJiYgbVN0cmVhbVBvd2VyTG9nLmlzVXNlckRlYnVnT3JFbmdCdWlsZCgpICovKSB7CisgICAgICAgIC8vIE9idGFpbiBhdWRpbyBwcm9wZXJ0aWVzIChzZWUgU3RyZWFtSGFsSGlkbDo6Z2V0QXVkaW9Qcm9wZXJ0aWVzKCkgYmVsb3cpLgorICAgICAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKAorICAgICAgICAgICAgICAgIFsmXShhdXRvIHNyLCBhdXRvIG0sIGF1dG8gZikgeworICAgICAgICAgICAgICAgIG1TdHJlYW1Qb3dlckxvZy5pbml0KHNyLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KGYpKTsKKyAgICAgICAgICAgIH0pOworICAgIH0KK30KKworU3RyZWFtSGFsSGlkbDo6flN0cmVhbUhhbEhpZGwoKSB7CisgICAgbVN0cmVhbSA9IG51bGxwdHI7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmdldFNhbXBsZVJhdGUodWludDMyX3QgKnJhdGUpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRTYW1wbGVSYXRlIiwgbVN0cmVhbS0+Z2V0U2FtcGxlUmF0ZSgpLCByYXRlKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHN0YXR1c190IHN0YXR1cyA9IHByb2Nlc3NSZXR1cm4oImdldEJ1ZmZlclNpemUiLCBtU3RyZWFtLT5nZXRCdWZmZXJTaXplKCksIHNpemUpOworICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgbUNhY2hlZEJ1ZmZlclNpemUgPSAqc2l6ZTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRDaGFubmVsTWFzayIsIG1TdHJlYW0tPmdldENoYW5uZWxNYXNrKCksIG1hc2spOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZvcm1hdCIsIG1TdHJlYW0tPmdldEZvcm1hdCgpLCBmb3JtYXQpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgIFsmXSh1aW50MzJfdCBzciwgYXV0byBtLCBhdXRvIGYpIHsKKyAgICAgICAgICAgICAgICAqc2FtcGxlUmF0ZSA9IHNyOworICAgICAgICAgICAgICAgICptYXNrID0gc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KG0pOworICAgICAgICAgICAgICAgICpmb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4oZik7CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0QXVkaW9Qcm9wZXJ0aWVzIiwgcmV0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gaGlkbFBhcmFtczsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJhbWV0ZXJzRnJvbUhhbChrdlBhaXJzLCAmaGlkbFBhcmFtcyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UGFyYW1ldGVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdXRpbHM6OnNldFBhcmFtZXRlcnMobVN0cmVhbSwge30gLyogY29udGV4dCAqLywgaGlkbFBhcmFtcykpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleXMsIFN0cmluZzggKnZhbHVlcykgeworICAgIHZhbHVlcy0+Y2xlYXIoKTsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIGhpZGxfdmVjPGhpZGxfc3RyaW5nPiBoaWRsS2V5czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBrZXlzRnJvbUhhbChrZXlzLCAmaGlkbEtleXMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHJldHVybiBzdGF0dXM7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gdXRpbHM6OmdldFBhcmFtZXRlcnMoCisgICAgICAgICAgICBtU3RyZWFtLAorICAgICAgICAgICAge30gLyogY29udGV4dCAqLywKKyAgICAgICAgICAgIGhpZGxLZXlzLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLCBjb25zdCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4mIHBhcmFtZXRlcnMpIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzVG9IYWwocGFyYW1ldGVycywgdmFsdWVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0UGFyYW1ldGVycyIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6YWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiYWRkRWZmZWN0IiwgbVN0cmVhbS0+YWRkRWZmZWN0KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxFZmZlY3RIYWxIaWRsKj4oZWZmZWN0LmdldCgpKS0+ZWZmZWN0SWQoKSkpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKKyAgICBpZiAoIW1TdHJlYW0pIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJyZW1vdmVFZmZlY3QiLCBtU3RyZWFtLT5yZW1vdmVFZmZlY3QoCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEVmZmVjdEhhbEhpZGwqPihlZmZlY3QuZ2V0KCkpLT5lZmZlY3RJZCgpKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YW5kYnkoKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RhbmRieSIsIG1TdHJlYW0tPnN0YW5kYnkoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmR1bXAoaW50IGZkKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBuYXRpdmVfaGFuZGxlX3QqIGhpZGxIYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLCAwKTsKKyAgICBoaWRsSGFuZGxlLT5kYXRhWzBdID0gZmQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmRlYnVnKGhpZGxIYW5kbGUsIHt9IC8qIG9wdGlvbnMgKi8pOworICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhpZGxIYW5kbGUpOworICAgIG1TdHJlYW1Qb3dlckxvZy5kdW1wKGZkKTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZHVtcCIsIHJldCk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0YXJ0KCkgeworICAgIGlmICghbVN0cmVhbSkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInN0YXJ0IiwgbVN0cmVhbS0+c3RhcnQoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OnN0b3AoKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3RvcCIsIG1TdHJlYW0tPnN0b3AoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbEhpZGw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+Y3JlYXRlTW1hcEJ1ZmZlcigKKyAgICAgICAgICAgIG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICBbJl0oUmVzdWx0IHIsIGNvbnN0IE1tYXBCdWZmZXJJbmZvJiBoaWRsSW5mbykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGUgKmhhbmRsZSA9IGhpZGxJbmZvLnNoYXJlZE1lbW9yeS5oYW5kbGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhbmRsZS0+bnVtRmRzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2hhcmVkX21lbW9yeV9mZCA9IGhhbmRsZS0+ZGF0YVswXTsKKyNpZiBNQUpPUl9WRVJTSU9OID49IDQKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmZsYWdzID0gYXVkaW9fbW1hcF9idWZmZXJfZmxhZyhoaWRsSW5mby5mbGFncyk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyA9IGhpZGxJbmZvLmJ1ZmZlclNpemVGcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBOZWdhdGl2ZSBidWZmZXIgc2l6ZSBmcmFtZSB3YXMgYSBoYWNrIGluIE8gYW5kIFAgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluZGljYXRlIHRoYXQgdGhlIGJ1ZmZlciBpcyBzaGFyZWFibGUgdG8gYXBwbGljYXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW5mby0+YnVmZmVyX3NpemVfZnJhbWVzIDwgMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1ZmZlcl9zaXplX2ZyYW1lcyAqPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyA9IGF1ZGlvX21tYXBfYnVmZmVyX2ZsYWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5mbGFncyB8IEFVRElPX01NQVBfQVBQTElDQVRJT05fU0hBUkVBQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPmJ1cnN0X3NpemVfZnJhbWVzID0gaGlkbEluZm8uYnVyc3RTaXplRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mby0+c2hhcmVkX21lbW9yeV9hZGRyZXNzIGlzIG5vdCBuZWVkZWQgaW4gSElETCBjb250ZXh0CisgICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zaGFyZWRfbWVtb3J5X2FkZHJlc3MgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gUmVzdWx0OjpOT1RfSU5JVElBTElaRUQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiY3JlYXRlTW1hcEJ1ZmZlciIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgeworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE1tYXBQb3NpdGlvbigKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgY29uc3QgTW1hcFBvc2l0aW9uJiBoaWRsUG9zaXRpb24pIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbi0+dGltZV9uYW5vc2Vjb25kcyA9IGhpZGxQb3NpdGlvbi50aW1lTmFub3NlY29uZHM7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uLT5wb3NpdGlvbl9mcmFtZXMgPSBoaWRsUG9zaXRpb24ucG9zaXRpb25GcmFtZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldE1tYXBQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsSGlkbDo6c2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KSB7CisgICAgbUhhbFRocmVhZFByaW9yaXR5ID0gcHJpb3JpdHk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxIaWRsOjpnZXRDYWNoZWRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSkgeworICAgIGlmIChtQ2FjaGVkQnVmZmVyU2l6ZSAhPSAwKSB7CisgICAgICAgICpzaXplID0gbUNhY2hlZEJ1ZmZlclNpemU7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgcmV0dXJuIGdldEJ1ZmZlclNpemUoc2l6ZSk7Cit9CisKK2Jvb2wgU3RyZWFtSGFsSGlkbDo6cmVxdWVzdEhhbFRocmVhZFByaW9yaXR5KHBpZF90IHRocmVhZFBpZCwgcGlkX3QgdGhyZWFkSWQpIHsKKyAgICBpZiAobUhhbFRocmVhZFByaW9yaXR5ID09IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaW50IGVyciA9IHJlcXVlc3RQcmlvcml0eSgKKyAgICAgICAgICAgIHRocmVhZFBpZCwgdGhyZWFkSWQsCisgICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIGZhbHNlIC8qaXNGb3JBcHAqLywgdHJ1ZSAvKmFzeW5jaHJvbm91cyovKTsKKyAgICBBTE9HRV9JRihlcnIsICJmYWlsZWQgdG8gc2V0IHByaW9yaXR5ICVkIGZvciBwaWQgJWQgdGlkICVkOyBlcnJvciAlZCIsCisgICAgICAgICAgICBtSGFsVGhyZWFkUHJpb3JpdHksIHRocmVhZFBpZCwgdGhyZWFkSWQsIGVycik7CisgICAgLy8gQXVkaW8gd2lsbCBzdGlsbCB3b3JrLCBidXQgbGF0ZW5jeSB3aWxsIGJlIGhpZ2hlciBhbmQgc29tZXRpbWVzIHVuYWNjZXB0YWJsZS4KKyAgICByZXR1cm4gZXJyID09IDA7Cit9CisKK25hbWVzcGFjZSB7CisKKy8qIE5vdGVzIG9uIGNhbGxiYWNrIG93bmVyc2hpcC4KKworVGhpcyBpcyBob3cgKEh3KUJpbmRlciBvd25lcnNoaXAgbW9kZWwgbG9va3MgbGlrZS4gVGhlIHNlcnZlciBpbXBsZW1lbnRhdGlvbgoraXMgb3duZWQgYnkgQmluZGVyIGZyYW1ld29yayAodmlhIHNwPD4pLiBQcm94aWVzIGFyZSBvd25lZCBieSBjbGllbnRzLgorV2hlbiB0aGUgbGFzdCBwcm94eSBkaXNhcHBlYXJzLCBCaW5kZXIgZnJhbWV3b3JrIHJlbGVhc2VzIHRoZSBzZXJ2ZXIgaW1wbC4KKworVGh1cywgaXQgaXMgbm90IG5lZWRlZCB0byBrZWVwIGFueSByZWZlcmVuY2VzIHRvIFN0cmVhbU91dENhbGxiYWNrICh0aGlzIGlzCit0aGUgc2VydmVyIGltcGwpIC0tIGl0IHdpbGwgbGl2ZSBhcyBsb25nIGFzIEhBTCBzZXJ2ZXIgaG9sZHMgYSBzdHJvbmcgcmVmIHRvCitJU3RyZWFtT3V0Q2FsbGJhY2sgcHJveHkuIFdlIGNsZWFyIHRoYXQgcmVmZXJlbmNlIGJ5IGNhbGxpbmcgJ2NsZWFyQ2FsbGJhY2snCitmcm9tIHRoZSBkZXN0cnVjdG9yIG9mIFN0cmVhbU91dEhhbEhpZGwuCisKK1RoZSBjYWxsYmFjayBvbmx5IGtlZXBzIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIHN0cmVhbS4gVGhlIHN0cmVhbSBpcyBvd25lZAorYnkgQXVkaW9GbGluZ2VyLgorCisqLworCitzdHJ1Y3QgU3RyZWFtT3V0Q2FsbGJhY2sgOiBwdWJsaWMgSVN0cmVhbU91dENhbGxiYWNrIHsKKyAgICBTdHJlYW1PdXRDYWxsYmFjayhjb25zdCB3cDxTdHJlYW1PdXRIYWxIaWRsPiYgc3RyZWFtKSA6IG1TdHJlYW0oc3RyZWFtKSB7fQorCisgICAgLy8gSVN0cmVhbU91dENhbGxiYWNrIGltcGxlbWVudGF0aW9uCisgICAgUmV0dXJuPHZvaWQ+IG9uV3JpdGVSZWFkeSgpICBvdmVycmlkZSB7CisgICAgICAgIHNwPFN0cmVhbU91dEhhbEhpZGw+IHN0cmVhbSA9IG1TdHJlYW0ucHJvbW90ZSgpOworICAgICAgICBpZiAoc3RyZWFtICE9IDApIHsKKyAgICAgICAgICAgIHN0cmVhbS0+b25Xcml0ZVJlYWR5KCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgICBSZXR1cm48dm9pZD4gb25EcmFpblJlYWR5KCkgIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzdHJlYW0gIT0gMCkgeworICAgICAgICAgICAgc3RyZWFtLT5vbkRyYWluUmVhZHkoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIFJldHVybjx2b2lkPiBvbkVycm9yKCkgIG92ZXJyaWRlIHsKKyAgICAgICAgc3A8U3RyZWFtT3V0SGFsSGlkbD4gc3RyZWFtID0gbVN0cmVhbS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzdHJlYW0gIT0gMCkgeworICAgICAgICAgICAgc3RyZWFtLT5vbkVycm9yKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB3cDxTdHJlYW1PdXRIYWxIaWRsPiBtU3RyZWFtOworfTsKKworfSAgLy8gbmFtZXNwYWNlCisKK1N0cmVhbU91dEhhbEhpZGw6OlN0cmVhbU91dEhhbEhpZGwoY29uc3Qgc3A8SVN0cmVhbU91dD4mIHN0cmVhbSkKKyAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVdyaXRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgeworfQorCitTdHJlYW1PdXRIYWxIaWRsOjp+U3RyZWFtT3V0SGFsSGlkbCgpIHsKKyAgICBpZiAobVN0cmVhbSAhPSAwKSB7CisgICAgICAgIGlmIChtQ2FsbGJhY2sudW5zYWZlX2dldCgpKSB7CisgICAgICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbGVhckNhbGxiYWNrIiwgbVN0cmVhbS0+Y2xlYXJDYWxsYmFjaygpKTsKKyAgICAgICAgfQorICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOworICAgICAgICBtU3RyZWFtLmNsZWFyKCk7CisgICAgfQorICAgIG1DYWxsYmFjay5jbGVhcigpOworICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgaWYgKG1FZkdyb3VwKSB7CisgICAgICAgIEV2ZW50RmxhZzo6ZGVsZXRlRXZlbnRGbGFnKCZtRWZHcm91cCk7CisgICAgfQorfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKKyAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCisgICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfTEFURU5DWSwgImdldExhdGVuY3kiLCBudWxscHRyLCAwLAorICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKmxhdGVuY3kgPSB3cml0ZVN0YXR1cy5yZXBseS5sYXRlbmN5TXM7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldExhdGVuY3kiLCBtU3RyZWFtLT5nZXRMYXRlbmN5KCksIGxhdGVuY3kpOworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNldFZvbHVtZSIsIG1TdHJlYW0tPnNldFZvbHVtZShsZWZ0LCByaWdodCkpOworfQorCisjaWYgTUFKT1JfVkVSU0lPTiA9PSAyCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgc3RkOjp2ZWN0b3I8UGFyYW1ldGVyVmFsdWU+IHBhcmFtZXRlcnM7CisgICAgU3RyaW5nOCBoYWxQYXJhbWV0ZXJzOworICAgIHBhcmFtZXRlcnMucHVzaF9iYWNrKHtBdWRpb1BhcmFtZXRlcjo6a2V5UHJlc2VudGF0aW9uSWQsIHN0ZDo6dG9fc3RyaW5nKHByZXNlbnRhdGlvbklkKX0pOworICAgIHBhcmFtZXRlcnMucHVzaF9iYWNrKHtBdWRpb1BhcmFtZXRlcjo6a2V5UHJvZ3JhbUlkLCBzdGQ6OnRvX3N0cmluZyhwcm9ncmFtSWQpfSk7CisgICAgcGFyYW1ldGVyc1RvSGFsKGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPihwYXJhbWV0ZXJzKSwgJmhhbFBhcmFtZXRlcnMpOworICAgIHJldHVybiBzZXRQYXJhbWV0ZXJzKGhhbFBhcmFtZXRlcnMpOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInNlbGVjdFByZXNlbnRhdGlvbiIsCisgICAgICAgICAgICBtU3RyZWFtLT5zZWxlY3RQcmVzZW50YXRpb24ocHJlc2VudGF0aW9uSWQsIHByb2dyYW1JZCkpOworfQorI2VuZGlmCisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OndyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICAqd3JpdHRlbiA9IDA7CisKKyAgICBpZiAoYnl0ZXMgPT0gMCAmJiAhbURhdGFNUSkgeworICAgICAgICAvLyBDYW4ndCBkZXRlcm1pbmUgdGhlIHNpemUgZm9yIHRoZSBNUSBidWZmZXIuIFdhaXQgZm9yIGEgbm9uLWVtcHR5IHdyaXRlIHJlcXVlc3QuCisgICAgICAgIEFMT0dXX0lGKG1DYWxsYmFjay51bnNhZmVfZ2V0KCksICJGaXJzdCBjYWxsIHRvIGFzeW5jIHdyaXRlIHdpdGggMCBieXRlcyIpOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghbURhdGFNUSkgeworICAgICAgICAvLyBJbiBjYXNlIGlmIHBsYXliYWNrIHN0YXJ0cyBjbG9zZSB0byB0aGUgZW5kIG9mIGEgY29tcHJlc3NlZCB0cmFjaywgdGhlIGJ5dGVzCisgICAgICAgIC8vIHRoYXQgbmVlZCB0byBiZSB3cml0dGVuIGlzIGxlc3MgdGhhbiB0aGUgYWN0dWFsIGJ1ZmZlciBzaXplLiBOZWVkIHRvIHVzZQorICAgICAgICAvLyBmdWxsIGJ1ZmZlciBzaXplIGZvciB0aGUgTVEgc2luY2Ugb3RoZXJ3aXNlIGFmdGVyIHNlZWtpbmcgYmFjayB0byB0aGUgbWlkZGxlCisgICAgICAgIC8vIGRhdGEgd2lsbCBiZSB0cnVuY2F0ZWQuCisgICAgICAgIHNpemVfdCBidWZmZXJTaXplOworICAgICAgICBpZiAoKHN0YXR1cyA9IGdldENhY2hlZEJ1ZmZlclNpemUoJmJ1ZmZlclNpemUpKSAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgICAgICBpZiAoYnl0ZXMgPiBidWZmZXJTaXplKSBidWZmZXJTaXplID0gYnl0ZXM7CisgICAgICAgIGlmICgoc3RhdHVzID0gcHJlcGFyZUZvcldyaXRpbmcoYnVmZmVyU2l6ZSkpICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzID0gY2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgICAgIFdyaXRlQ29tbWFuZDo6V1JJVEUsICJ3cml0ZSIsIHN0YXRpY19jYXN0PGNvbnN0IHVpbnQ4X3QqPihidWZmZXIpLCBieXRlcywKKyAgICAgICAgICAgIFsmXSAoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVN0YXR1cy5yZXBseS53cml0dGVuOworICAgICAgICAgICAgICAgIC8vIERpYWdub3N0aWNzIG9mIHRoZSBjYXVzZSBvZiBiLzM1ODEzMTEzLgorICAgICAgICAgICAgICAgIEFMT0dFX0lGKCp3cml0dGVuID4gYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAiaGFsIHJlcG9ydHMgbW9yZSBieXRlcyB3cml0dGVuIHRoYW4gYXNrZWQgZm9yOiAlbGxkID4gJWxsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKSp3cml0dGVuLCAobG9uZyBsb25nKWJ5dGVzKTsKKyAgICAgICAgICAgIH0pOworICAgIG1TdHJlYW1Qb3dlckxvZy5sb2coYnVmZmVyLCAqd3JpdHRlbik7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Y2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgV3JpdGVDb21tYW5kIGNtZCwgY29uc3QgY2hhciogY21kTmFtZSwKKyAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFTaXplLCBTdHJlYW1PdXRIYWxIaWRsOjpXcml0ZXJDYWxsYmFjayBjYWxsYmFjaykgeworICAgIGlmICghbUNvbW1hbmRNUS0+d3JpdGUoJmNtZCkpIHsKKyAgICAgICAgQUxPR0UoImNvbW1hbmQgbWVzc2FnZSBxdWV1ZSB3cml0ZSBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOworICAgICAgICByZXR1cm4gLUVBR0FJTjsKKyAgICB9CisgICAgaWYgKGRhdGEgIT0gbnVsbHB0cikgeworICAgICAgICBzaXplX3QgYXZhaWxhYmxlVG9Xcml0ZSA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvV3JpdGUoKTsKKyAgICAgICAgaWYgKGRhdGFTaXplID4gYXZhaWxhYmxlVG9Xcml0ZSkgeworICAgICAgICAgICAgQUxPR1coInRydW5jYXRpbmcgd3JpdGUgZGF0YSBmcm9tICVsbGQgdG8gJWxsZCBkdWUgdG8gaW5zdWZmaWNpZW50IGRhdGEgcXVldWUgc3BhY2UiLAorICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWRhdGFTaXplLCAobG9uZyBsb25nKWF2YWlsYWJsZVRvV3JpdGUpOworICAgICAgICAgICAgZGF0YVNpemUgPSBhdmFpbGFibGVUb1dyaXRlOworICAgICAgICB9CisgICAgICAgIGlmICghbURhdGFNUS0+d3JpdGUoZGF0YSwgZGF0YVNpemUpKSB7CisgICAgICAgICAgICBBTE9HRSgiZGF0YSBtZXNzYWdlIHF1ZXVlIHdyaXRlIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUVmR3JvdXAtPndha2Uoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpKTsKKworICAgIC8vIFRPRE86IFJlbW92ZSBtYW51YWwgZXZlbnQgZmxhZyBoYW5kbGluZyBvbmNlIGJsb2NraW5nIE1RIGlzIGltcGxlbWVudGVkLiBiLzMzODE1NDIyCisgICAgdWludDMyX3QgZWZTdGF0ZSA9IDA7CityZXRyeToKKyAgICBzdGF0dXNfdCByZXQgPSBtRWZHcm91cC0+d2FpdChzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSwgJmVmU3RhdGUpOworICAgIGlmIChlZlN0YXRlICYgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRlVMTCkpIHsKKyAgICAgICAgV3JpdGVTdGF0dXMgd3JpdGVTdGF0dXM7CisgICAgICAgIHdyaXRlU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmd3JpdGVTdGF0dXMpKSB7CisgICAgICAgICAgICBBTE9HRSgic3RhdHVzIG1lc3NhZ2UgcmVhZCBmYWlsZWQgZm9yIFwiJXNcIiIsIGNtZE5hbWUpOworICAgICAgICB9CisgICAgICAgIGlmICh3cml0ZVN0YXR1cy5yZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgcmV0ID0gT0s7CisgICAgICAgICAgICBjYWxsYmFjayh3cml0ZVN0YXR1cyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXQgPSBwcm9jZXNzUmV0dXJuKGNtZE5hbWUsIHdyaXRlU3RhdHVzLnJldHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKKyAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnByZXBhcmVGb3JXcml0aW5nKHNpemVfdCBidWZmZXJTaXplKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPENvbW1hbmRNUT4gdGVtcENvbW1hbmRNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RGF0YU1RPiB0ZW1wRGF0YU1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxTdGF0dXNNUT4gdGVtcFN0YXR1c01ROworICAgIFJlc3VsdCByZXR2YWw7CisgICAgcGlkX3QgaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQ7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPnByZXBhcmVGb3JXcml0aW5nKAorICAgICAgICAgICAgMSwgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29tbWFuZE1ROjpEZXNjcmlwdG9yJiBjb21tYW5kTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFNUTo6RGVzY3JpcHRvciYgZGF0YU1RLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTdGF0dXNNUTo6RGVzY3JpcHRvciYgc3RhdHVzTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRocmVhZEluZm8mIGhhbFRocmVhZEluZm8pIHsKKyAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgIGlmIChyZXR2YWwgPT0gUmVzdWx0OjpPSykgeworICAgICAgICAgICAgICAgICAgICB0ZW1wQ29tbWFuZE1RLnJlc2V0KG5ldyBDb21tYW5kTVEoY29tbWFuZE1RKSk7CisgICAgICAgICAgICAgICAgICAgIHRlbXBEYXRhTVEucmVzZXQobmV3IERhdGFNUShkYXRhTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcFN0YXR1c01RLnJlc2V0KG5ldyBTdGF0dXNNUShzdGF0dXNNUSkpOworICAgICAgICAgICAgICAgICAgICBpZiAodGVtcERhdGFNUS0+aXNWYWxpZCgpICYmIHRlbXBEYXRhTVEtPmdldEV2ZW50RmxhZ1dvcmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRGbGFnOjpjcmVhdGVFdmVudEZsYWcodGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpLCAmbUVmR3JvdXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFBpZCA9IGhhbFRocmVhZEluZm8ucGlkOworICAgICAgICAgICAgICAgICAgICBoYWxUaHJlYWRUaWQgPSBoYWxUaHJlYWRJbmZvLnRpZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkgfHwgcmV0dmFsICE9IFJlc3VsdDo6T0spIHsKKyAgICAgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInByZXBhcmVGb3JXcml0aW5nIiwgcmV0LCByZXR2YWwpOworICAgIH0KKyAgICBpZiAoIXRlbXBDb21tYW5kTVEgfHwgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIXRlbXBEYXRhTVEgfHwgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIXRlbXBTdGF0dXNNUSB8fCAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCkgfHwKKyAgICAgICAgICAgICFtRWZHcm91cCkgeworICAgICAgICBBTE9HRV9JRighdGVtcENvbW1hbmRNUSwgIkZhaWxlZCB0byBvYnRhaW4gY29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBDb21tYW5kTVEgJiYgIXRlbXBDb21tYW5kTVEtPmlzVmFsaWQoKSwKKyAgICAgICAgICAgICAgICAiQ29tbWFuZCBtZXNzYWdlIHF1ZXVlIGZvciB3cml0aW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIXRlbXBEYXRhTVEsICJGYWlsZWQgdG8gb2J0YWluIGRhdGEgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wRGF0YU1RICYmICF0ZW1wRGF0YU1RLT5pc1ZhbGlkKCksICJEYXRhIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighdGVtcFN0YXR1c01RLCAiRmFpbGVkIHRvIG9idGFpbiBzdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyIpOworICAgICAgICBBTE9HRV9JRih0ZW1wU3RhdHVzTVEgJiYgIXRlbXBTdGF0dXNNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJTdGF0dXMgbWVzc2FnZSBxdWV1ZSBmb3Igd3JpdGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCFtRWZHcm91cCwgIkV2ZW50IGZsYWcgY3JlYXRpb24gZm9yIHdyaXRpbmcgZmFpbGVkIik7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkoaGFsVGhyZWFkUGlkLCBoYWxUaHJlYWRUaWQpOworCisgICAgbUNvbW1hbmRNUSA9IHN0ZDo6bW92ZSh0ZW1wQ29tbWFuZE1RKTsKKyAgICBtRGF0YU1RID0gc3RkOjptb3ZlKHRlbXBEYXRhTVEpOworICAgIG1TdGF0dXNNUSA9IHN0ZDo6bW92ZSh0ZW1wU3RhdHVzTVEpOworICAgIG1Xcml0ZXJDbGllbnQgPSBnZXR0aWQoKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRSZW5kZXJQb3NpdGlvbigKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDMyX3QgZCkgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICpkc3BGcmFtZXMgPSBkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRSZW5kZXJQb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIFJlc3VsdCByZXR2YWw7CisgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldE5leHRXcml0ZVRpbWVzdGFtcCgKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaW50NjRfdCB0KSB7CisgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgKnRpbWVzdGFtcCA9IHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldFJlbmRlclBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBwcm9jZXNzUmV0dXJuKAorICAgICAgICAgICAgInNldENhbGxiYWNrIiwgbVN0cmVhbS0+c2V0Q2FsbGJhY2sobmV3IFN0cmVhbU91dENhbGxiYWNrKHRoaXMpKSk7CisgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6c3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5zdXBwb3J0c1BhdXNlQW5kUmVzdW1lKAorICAgICAgICAgICAgWyZdKGJvb2wgcCwgYm9vbCByKSB7CisgICAgICAgICAgICAgICAgKnN1cHBvcnRzUGF1c2UgPSBwOworICAgICAgICAgICAgICAgICpzdXBwb3J0c1Jlc3VtZSA9IHI7CisgICAgICAgICAgICB9KTsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNQYXVzZUFuZFJlc3VtZSIsIHJldCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnBhdXNlKCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPnBhdXNlKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpyZXN1bWUoKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInBhdXNlIiwgbVN0cmVhbS0+cmVzdW1lKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic3VwcG9ydHNEcmFpbiIsIG1TdHJlYW0tPnN1cHBvcnRzRHJhaW4oKSwgc3VwcG9ydHNEcmFpbik7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmRyYWluKGJvb2wgZWFybHlOb3RpZnkpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigKKyAgICAgICAgICAgICJkcmFpbiIsIG1TdHJlYW0tPmRyYWluKGVhcmx5Tm90aWZ5ID8gQXVkaW9EcmFpbjo6RUFSTFlfTk9USUZZIDogQXVkaW9EcmFpbjo6QUxMKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OmZsdXNoKCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJwYXVzZSIsIG1TdHJlYW0tPmZsdXNoKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxIaWRsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgIGlmIChtV3JpdGVyQ2xpZW50ID09IGdldHRpZCgpICYmIG1Db21tYW5kTVEpIHsKKyAgICAgICAgcmV0dXJuIGNhbGxXcml0ZXJUaHJlYWQoCisgICAgICAgICAgICAgICAgV3JpdGVDb21tYW5kOjpHRVRfUFJFU0VOVEFUSU9OX1BPU0lUSU9OLCAiZ2V0UHJlc2VudGF0aW9uUG9zaXRpb24iLCBudWxscHRyLCAwLAorICAgICAgICAgICAgICAgIFsmXShjb25zdCBXcml0ZVN0YXR1cyYgd3JpdGVTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLmZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLT50dl9zZWMgPSB3cml0ZVN0YXR1cy5yZXBseS5wcmVzZW50YXRpb25Qb3NpdGlvbi50aW1lU3RhbXAudHZTZWM7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IHdyaXRlU3RhdHVzLnJlcGx5LnByZXNlbnRhdGlvblBvc2l0aW9uLnRpbWVTdGFtcC50dk5TZWM7CisgICAgICAgICAgICAgICAgfSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgUmVzdWx0IHJldHZhbDsKKyAgICAgICAgUmV0dXJuPHZvaWQ+IHJldCA9IG1TdHJlYW0tPmdldFByZXNlbnRhdGlvblBvc2l0aW9uKAorICAgICAgICAgICAgICAgIFsmXShSZXN1bHQgciwgdWludDY0X3QgaGlkbEZyYW1lcywgY29uc3QgVGltZVNwZWMmIGhpZGxUaW1lU3RhbXApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gcjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqZnJhbWVzID0gaGlkbEZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfc2VjID0gaGlkbFRpbWVTdGFtcC50dlNlYzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+dHZfbnNlYyA9IGhpZGxUaW1lU3RhbXAudHZOU2VjOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRQcmVzZW50YXRpb25Qb3NpdGlvbiIsIHJldCwgcmV0dmFsKTsKKyAgICB9Cit9CisKKyNpZiBNQUpPUl9WRVJTSU9OID09IDIKK3N0YXR1c190IFN0cmVhbU91dEhhbEhpZGw6OnVwZGF0ZVNvdXJjZU1ldGFkYXRhKAorICAgICAgICBjb25zdCBTdHJlYW1PdXRIYWxJbnRlcmZhY2U6OlNvdXJjZU1ldGFkYXRhJiAvKiBzb3VyY2VNZXRhZGF0YSAqLykgeworICAgIC8vIEF1ZGlvIEhBTCBWMi4wIGRvZXMgbm90IHN1cHBvcnQgcHJvcGFnYXRpbmcgc291cmNlIG1ldGFkYXRhCisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CisvKiogVHJhbnNmb3JtIGEgc3RhbmRhcmQgY29sbGVjdGlvbiB0byBhbiBISURMIHZlY3Rvci4gKi8KK3RlbXBsYXRlIDxjbGFzcyBWYWx1ZXMsIGNsYXNzIEVsZW1lbnRDb252ZXJ0ZXI+CitzdGF0aWMgYXV0byB0cmFuc2Zvcm1Ub0hpZGxWZWMoY29uc3QgVmFsdWVzJiB2YWx1ZXMsIEVsZW1lbnRDb252ZXJ0ZXIgY29udmVydGVyKSB7CisgICAgaGlkbF92ZWM8ZGVjbHR5cGUoY29udmVydGVyKCp2YWx1ZXMuYmVnaW4oKSkpPiByZXN1bHR7dmFsdWVzLnNpemUoKX07CisgICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKKyAgICB0cmFuc2Zvcm0oYmVnaW4odmFsdWVzKSwgZW5kKHZhbHVlcyksIGJlZ2luKHJlc3VsdCksIGNvbnZlcnRlcik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsSGlkbDo6dXBkYXRlU291cmNlTWV0YWRhdGEoCisgICAgICAgIGNvbnN0IFN0cmVhbU91dEhhbEludGVyZmFjZTo6U291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSB7CisgICAgQ1BQX1ZFUlNJT046OlNvdXJjZU1ldGFkYXRhIGhhbE1ldGFkYXRhID0geworICAgICAgICAudHJhY2tzID0gdHJhbnNmb3JtVG9IaWRsVmVjKHNvdXJjZU1ldGFkYXRhLnRyYWNrcywKKyAgICAgICAgICAgICAgW10oY29uc3QgcGxheWJhY2tfdHJhY2tfbWV0YWRhdGEmIG1ldGFkYXRhKSAtPiBQbGF5YmFja1RyYWNrTWV0YWRhdGEgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICAgICAgLnVzYWdlPXN0YXRpY19jYXN0PEF1ZGlvVXNhZ2U+KG1ldGFkYXRhLnVzYWdlKSwKKyAgICAgICAgICAgICAgICAgICAgLmNvbnRlbnRUeXBlPXN0YXRpY19jYXN0PEF1ZGlvQ29udGVudFR5cGU+KG1ldGFkYXRhLmNvbnRlbnRfdHlwZSksCisgICAgICAgICAgICAgICAgICAgIC5nYWluPW1ldGFkYXRhLmdhaW4sCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICB9KX07CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInVwZGF0ZVNvdXJjZU1ldGFkYXRhIiwgbVN0cmVhbS0+dXBkYXRlU291cmNlTWV0YWRhdGEoaGFsTWV0YWRhdGEpKTsKK30KKyNlbmRpZgorCit2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uV3JpdGVSZWFkeSgpIHsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25Xcml0ZVJlYWR5Iik7CisgICAgY2FsbGJhY2stPm9uV3JpdGVSZWFkeSgpOworfQorCit2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRHJhaW5SZWFkeSgpIHsKKyAgICBzcDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOworICAgIGlmIChjYWxsYmFjayA9PSAwKSByZXR1cm47CisgICAgQUxPR1YoImFzeW5jQ2FsbGJhY2sgb25EcmFpblJlYWR5Iik7CisgICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOworfQorCit2b2lkIFN0cmVhbU91dEhhbEhpZGw6Om9uRXJyb3IoKSB7CisgICAgc3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKKyAgICBpZiAoY2FsbGJhY2sgPT0gMCkgcmV0dXJuOworICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrIG9uRXJyb3IiKTsKKyAgICBjYWxsYmFjay0+b25FcnJvcigpOworfQorCisKK1N0cmVhbUluSGFsSGlkbDo6U3RyZWFtSW5IYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1Jbj4mIHN0cmVhbSkKKyAgICAgICAgOiBTdHJlYW1IYWxIaWRsKHN0cmVhbS5nZXQoKSksIG1TdHJlYW0oc3RyZWFtKSwgbVJlYWRlckNsaWVudCgwKSwgbUVmR3JvdXAobnVsbHB0cikgeworfQorCitTdHJlYW1JbkhhbEhpZGw6On5TdHJlYW1JbkhhbEhpZGwoKSB7CisgICAgaWYgKG1TdHJlYW0gIT0gMCkgeworICAgICAgICBwcm9jZXNzUmV0dXJuKCJjbG9zZSIsIG1TdHJlYW0tPmNsb3NlKCkpOworICAgICAgICBtU3RyZWFtLmNsZWFyKCk7CisgICAgICAgIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7CisgICAgfQorICAgIGlmIChtRWZHcm91cCkgeworICAgICAgICBFdmVudEZsYWc6OmRlbGV0ZUV2ZW50RmxhZygmbUVmR3JvdXApOworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgaWYgKG1TdHJlYW0gPT0gMCkgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oImdldEZyYW1lU2l6ZSIsIG1TdHJlYW0tPmdldEZyYW1lU2l6ZSgpLCBzaXplKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0R2FpbiIsIG1TdHJlYW0tPnNldEdhaW4oZ2FpbikpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgeworICAgIGlmIChtU3RyZWFtID09IDApIHJldHVybiBOT19JTklUOworICAgICpyZWFkID0gMDsKKworICAgIGlmIChieXRlcyA9PSAwICYmICFtRGF0YU1RKSB7CisgICAgICAgIC8vIENhbid0IGRldGVybWluZSB0aGUgc2l6ZSBmb3IgdGhlIE1RIGJ1ZmZlci4gV2FpdCBmb3IgYSBub24tZW1wdHkgcmVhZCByZXF1ZXN0LgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc3RhdHVzOworICAgIGlmICghbURhdGFNUSAmJiAoc3RhdHVzID0gcHJlcGFyZUZvclJlYWRpbmcoYnl0ZXMpKSAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKKyAgICBwYXJhbXMuY29tbWFuZCA9IFJlYWRDb21tYW5kOjpSRUFEOworICAgIHBhcmFtcy5wYXJhbXMucmVhZCA9IGJ5dGVzOworICAgIHN0YXR1cyA9IGNhbGxSZWFkZXJUaHJlYWQocGFyYW1zLCAicmVhZCIsCisgICAgICAgICAgICBbJl0oY29uc3QgUmVhZFN0YXR1cyYgcmVhZFN0YXR1cykgeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhdmFpbFRvUmVhZCA9IG1EYXRhTVEtPmF2YWlsYWJsZVRvUmVhZCgpOworICAgICAgICAgICAgICAgIGlmICghbURhdGFNUS0+cmVhZChzdGF0aWNfY2FzdDx1aW50OF90Kj4oYnVmZmVyKSwgc3RkOjptaW4oYnl0ZXMsIGF2YWlsVG9SZWFkKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImRhdGEgbWVzc2FnZSBxdWV1ZSByZWFkIGZhaWxlZCBmb3IgXCJyZWFkXCIiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1dfSUYoYXZhaWxUb1JlYWQgIT0gcmVhZFN0YXR1cy5yZXBseS5yZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgIkhBTCByZWFkIHJlcG9ydCBpbmNvbnNpc3RlbnQ6IG1xID0gJWQsIHN0YXR1cyA9ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KWF2YWlsVG9SZWFkLCAoaW50MzJfdClyZWFkU3RhdHVzLnJlcGx5LnJlYWQpOworICAgICAgICAgICAgICAgICpyZWFkID0gcmVhZFN0YXR1cy5yZXBseS5yZWFkOworICAgICAgICAgICAgfSk7CisgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICpyZWFkKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmNhbGxSZWFkZXJUaHJlYWQoCisgICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCisgICAgICAgIFN0cmVhbUluSGFsSGlkbDo6UmVhZGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICBpZiAoIW1Db21tYW5kTVEtPndyaXRlKCZwYXJhbXMpKSB7CisgICAgICAgIEFMT0dXKCJjb21tYW5kIG1lc3NhZ2UgcXVldWUgd3JpdGUgZmFpbGVkIik7CisgICAgICAgIHJldHVybiAtRUFHQUlOOworICAgIH0KKyAgICBtRWZHcm91cC0+d2FrZShzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9GVUxMKSk7CisKKyAgICAvLyBUT0RPOiBSZW1vdmUgbWFudWFsIGV2ZW50IGZsYWcgaGFuZGxpbmcgb25jZSBibG9ja2luZyBNUSBpcyBpbXBsZW1lbnRlZC4gYi8zMzgxNTQyMgorICAgIHVpbnQzMl90IGVmU3RhdGUgPSAwOworcmV0cnk6CisgICAgc3RhdHVzX3QgcmV0ID0gbUVmR3JvdXAtPndhaXQoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE1lc3NhZ2VRdWV1ZUZsYWdCaXRzOjpOT1RfRU1QVFkpLCAmZWZTdGF0ZSk7CisgICAgaWYgKGVmU3RhdGUgJiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTWVzc2FnZVF1ZXVlRmxhZ0JpdHM6Ok5PVF9FTVBUWSkpIHsKKyAgICAgICAgUmVhZFN0YXR1cyByZWFkU3RhdHVzOworICAgICAgICByZWFkU3RhdHVzLnJldHZhbCA9IFJlc3VsdDo6Tk9UX0lOSVRJQUxJWkVEOworICAgICAgICBpZiAoIW1TdGF0dXNNUS0+cmVhZCgmcmVhZFN0YXR1cykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJzdGF0dXMgbWVzc2FnZSByZWFkIGZhaWxlZCBmb3IgXCIlc1wiIiwgY21kTmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgIGlmIChyZWFkU3RhdHVzLnJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICByZXQgPSBPSzsKKyAgICAgICAgICAgIGNhbGxiYWNrKHJlYWRTdGF0dXMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0ID0gcHJvY2Vzc1JldHVybihjbWROYW1lLCByZWFkU3RhdHVzLnJldHZhbCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisgICAgaWYgKHJldCA9PSAtRUFHQUlOIHx8IHJldCA9PSAtRUlOVFIpIHsKKyAgICAgICAgLy8gU3B1cmlvdXMgd2FrZXVwLiBUaGlzIG5vcm1hbGx5IHJldHJpZXMgbm8gbW9yZSB0aGFuIG9uY2UuCisgICAgICAgIGdvdG8gcmV0cnk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6cHJlcGFyZUZvclJlYWRpbmcoc2l6ZV90IGJ1ZmZlclNpemUpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiB0ZW1wQ29tbWFuZE1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IHRlbXBEYXRhTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiB0ZW1wU3RhdHVzTVE7CisgICAgUmVzdWx0IHJldHZhbDsKKyAgICBwaWRfdCBoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZDsKKyAgICBSZXR1cm48dm9pZD4gcmV0ID0gbVN0cmVhbS0+cHJlcGFyZUZvclJlYWRpbmcoCisgICAgICAgICAgICAxLCBidWZmZXJTaXplLAorICAgICAgICAgICAgWyZdKFJlc3VsdCByLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21tYW5kTVE6OkRlc2NyaXB0b3ImIGNvbW1hbmRNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YU1ROjpEZXNjcmlwdG9yJiBkYXRhTVEsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXR1c01ROjpEZXNjcmlwdG9yJiBzdGF0dXNNUSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkSW5mbyYgaGFsVGhyZWFkSW5mbykgeworICAgICAgICAgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgICAgICAgICAgaWYgKHJldHZhbCA9PSBSZXN1bHQ6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIHRlbXBDb21tYW5kTVEucmVzZXQobmV3IENvbW1hbmRNUShjb21tYW5kTVEpKTsKKyAgICAgICAgICAgICAgICAgICAgdGVtcERhdGFNUS5yZXNldChuZXcgRGF0YU1RKGRhdGFNUSkpOworICAgICAgICAgICAgICAgICAgICB0ZW1wU3RhdHVzTVEucmVzZXQobmV3IFN0YXR1c01RKHN0YXR1c01RKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICh0ZW1wRGF0YU1RLT5pc1ZhbGlkKCkgJiYgdGVtcERhdGFNUS0+Z2V0RXZlbnRGbGFnV29yZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBFdmVudEZsYWc6OmNyZWF0ZUV2ZW50RmxhZyh0ZW1wRGF0YU1RLT5nZXRFdmVudEZsYWdXb3JkKCksICZtRWZHcm91cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaGFsVGhyZWFkUGlkID0gaGFsVGhyZWFkSW5mby5waWQ7CisgICAgICAgICAgICAgICAgICAgIGhhbFRocmVhZFRpZCA9IGhhbFRocmVhZEluZm8udGlkOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSB8fCByZXR2YWwgIT0gUmVzdWx0OjpPSykgeworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigicHJlcGFyZUZvclJlYWRpbmciLCByZXQsIHJldHZhbCk7CisgICAgfQorICAgIGlmICghdGVtcENvbW1hbmRNUSB8fCAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcERhdGFNUSB8fCAhdGVtcERhdGFNUS0+aXNWYWxpZCgpIHx8CisgICAgICAgICAgICAhdGVtcFN0YXR1c01RIHx8ICF0ZW1wU3RhdHVzTVEtPmlzVmFsaWQoKSB8fAorICAgICAgICAgICAgIW1FZkdyb3VwKSB7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wQ29tbWFuZE1RLCAiRmFpbGVkIHRvIG9idGFpbiBjb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmciKTsKKyAgICAgICAgQUxPR0VfSUYodGVtcENvbW1hbmRNUSAmJiAhdGVtcENvbW1hbmRNUS0+aXNWYWxpZCgpLAorICAgICAgICAgICAgICAgICJDb21tYW5kIG1lc3NhZ2UgcXVldWUgZm9yIHdyaXRpbmcgaXMgaW52YWxpZCIpOworICAgICAgICBBTE9HRV9JRighdGVtcERhdGFNUSwgIkZhaWxlZCB0byBvYnRhaW4gZGF0YSBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBEYXRhTVEgJiYgIXRlbXBEYXRhTVEtPmlzVmFsaWQoKSwgIkRhdGEgbWVzc2FnZSBxdWV1ZSBmb3IgcmVhZGluZyBpcyBpbnZhbGlkIik7CisgICAgICAgIEFMT0dFX0lGKCF0ZW1wU3RhdHVzTVEsICJGYWlsZWQgdG8gb2J0YWluIHN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIik7CisgICAgICAgIEFMT0dFX0lGKHRlbXBTdGF0dXNNUSAmJiAhdGVtcFN0YXR1c01RLT5pc1ZhbGlkKCksCisgICAgICAgICAgICAgICAgIlN0YXR1cyBtZXNzYWdlIHF1ZXVlIGZvciByZWFkaW5nIGlzIGludmFsaWQiKTsKKyAgICAgICAgQUxPR0VfSUYoIW1FZkdyb3VwLCAiRXZlbnQgZmxhZyBjcmVhdGlvbiBmb3IgcmVhZGluZyBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJlcXVlc3RIYWxUaHJlYWRQcmlvcml0eShoYWxUaHJlYWRQaWQsIGhhbFRocmVhZFRpZCk7CisKKyAgICBtQ29tbWFuZE1RID0gc3RkOjptb3ZlKHRlbXBDb21tYW5kTVEpOworICAgIG1EYXRhTVEgPSBzdGQ6Om1vdmUodGVtcERhdGFNUSk7CisgICAgbVN0YXR1c01RID0gc3RkOjptb3ZlKHRlbXBTdGF0dXNNUSk7CisgICAgbVJlYWRlckNsaWVudCA9IGdldHRpZCgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRJbnB1dEZyYW1lc0xvc3QodWludDMyX3QgKmZyYW1lc0xvc3QpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0SW5wdXRGcmFtZXNMb3N0IiwgbVN0cmVhbS0+Z2V0SW5wdXRGcmFtZXNMb3N0KCksIGZyYW1lc0xvc3QpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OmdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICBpZiAobVJlYWRlckNsaWVudCA9PSBnZXR0aWQoKSAmJiBtQ29tbWFuZE1RKSB7CisgICAgICAgIFJlYWRQYXJhbWV0ZXJzIHBhcmFtczsKKyAgICAgICAgcGFyYW1zLmNvbW1hbmQgPSBSZWFkQ29tbWFuZDo6R0VUX0NBUFRVUkVfUE9TSVRJT047CisgICAgICAgIHJldHVybiBjYWxsUmVhZGVyVGhyZWFkKHBhcmFtcywgImdldENhcHR1cmVQb3NpdGlvbiIsCisgICAgICAgICAgICAgICAgWyZdKGNvbnN0IFJlYWRTdGF0dXMmIHJlYWRTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgKmZyYW1lcyA9IHJlYWRTdGF0dXMucmVwbHkuY2FwdHVyZVBvc2l0aW9uLmZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSByZWFkU3RhdHVzLnJlcGx5LmNhcHR1cmVQb3NpdGlvbi50aW1lOworICAgICAgICAgICAgICAgIH0pOworICAgIH0gZWxzZSB7CisgICAgICAgIFJlc3VsdCByZXR2YWw7CisgICAgICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oCisgICAgICAgICAgICAgICAgWyZdKFJlc3VsdCByLCB1aW50NjRfdCBoaWRsRnJhbWVzLCB1aW50NjRfdCBoaWRsVGltZSkgeworICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSByOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0dmFsID09IFJlc3VsdDo6T0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICpmcmFtZXMgPSBoaWRsRnJhbWVzOworICAgICAgICAgICAgICAgICAgICAgICAgKnRpbWUgPSBoaWRsVGltZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0pOworICAgICAgICByZXR1cm4gcHJvY2Vzc1JldHVybigiZ2V0Q2FwdHVyZVBvc2l0aW9uIiwgcmV0LCByZXR2YWwpOworICAgIH0KK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMgX191bnVzZWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6dXBkYXRlU2lua01ldGFkYXRhKAorICAgICAgICBjb25zdCBTdHJlYW1JbkhhbEludGVyZmFjZTo6U2lua01ldGFkYXRhJiAvKiBzaW5rTWV0YWRhdGEgKi8pIHsKKyAgICAvLyBBdWRpbyBIQUwgVjIuMCBkb2VzIG5vdCBzdXBwb3J0IHByb3BhZ2F0aW5nIHNpbmsgbWV0YWRhdGEKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKKyNlbGlmIE1BSk9SX1ZFUlNJT04gPj0gNAorc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXNJbmZvKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICBSZXN1bHQgcmV0dmFsOworICAgIFJldHVybjx2b2lkPiByZXQgPSBtU3RyZWFtLT5nZXRBY3RpdmVNaWNyb3Bob25lcygKKyAgICAgICAgICAgIFsmXShSZXN1bHQgciwgaGlkbF92ZWM8TWljcm9waG9uZUluZm8+IG1pY0FycmF5SGFsKSB7CisgICAgICAgIHJldHZhbCA9IHI7CisgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgbWljQXJyYXlIYWwuc2l6ZSgpOyBrKyspIHsKKyAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfY2hhcmFjdGVyaXN0aWNfdCBkc3Q7CisgICAgICAgICAgICAvLyBjb252ZXJ0CisgICAgICAgICAgICBtaWNyb3Bob25lSW5mb1RvSGFsKG1pY0FycmF5SGFsW2tdLCAmZHN0KTsKKyAgICAgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lID0gbWVkaWE6Ok1pY3JvcGhvbmVJbmZvKGRzdCk7CisgICAgICAgICAgICBtaWNyb3Bob25lc0luZm8tPnB1c2hfYmFjayhtaWNyb3Bob25lKTsKKyAgICAgICAgfQorICAgIH0pOworICAgIHJldHVybiBwcm9jZXNzUmV0dXJuKCJnZXRBY3RpdmVNaWNyb3Bob25lcyIsIHJldCwgcmV0dmFsKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjp1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QKKyAgICAgICAgU3RyZWFtSW5IYWxJbnRlcmZhY2U6OlNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7CisgICAgQ1BQX1ZFUlNJT046OlNpbmtNZXRhZGF0YSBoYWxNZXRhZGF0YSA9IHsKKyAgICAgICAgLnRyYWNrcyA9IHRyYW5zZm9ybVRvSGlkbFZlYyhzaW5rTWV0YWRhdGEudHJhY2tzLAorICAgICAgICAgICAgICBbXShjb25zdCByZWNvcmRfdHJhY2tfbWV0YWRhdGEmIG1ldGFkYXRhKSAtPiBSZWNvcmRUcmFja01ldGFkYXRhIHsKKyAgICAgICAgICAgICAgICAgIHJldHVybiB7CisgICAgICAgICAgICAgICAgICAgIC5zb3VyY2U9c3RhdGljX2Nhc3Q8QXVkaW9Tb3VyY2U+KG1ldGFkYXRhLnNvdXJjZSksCisgICAgICAgICAgICAgICAgICAgIC5nYWluPW1ldGFkYXRhLmdhaW4sCisgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICB9KX07CisgICAgcmV0dXJuIHByb2Nlc3NSZXR1cm4oInVwZGF0ZVNpbmtNZXRhZGF0YSIsIG1TdHJlYW0tPnVwZGF0ZVNpbmtNZXRhZGF0YShoYWxNZXRhZGF0YSkpOworfQorI2VuZGlmCisKKyNpZiBNQUpPUl9WRVJTSU9OIDwgNQorc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKAorICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24gX191bnVzZWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsSGlkbDo6c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20gX191bnVzZWQpIHsKKyAgICBpZiAobVN0cmVhbSA9PSAwKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisjZWxzZQorc3RhdHVzX3QgU3RyZWFtSW5IYWxIaWRsOjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbiIsCisgICAgICAgIG1TdHJlYW0tPnNldE1pY3JvcGhvbmVEaXJlY3Rpb24oc3RhdGljX2Nhc3Q8TWljcm9waG9uZURpcmVjdGlvbj4oZGlyZWN0aW9uKSkpOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbEhpZGw6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgaWYgKCFtU3RyZWFtKSByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gcHJvY2Vzc1JldHVybigic2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uIiwKKyAgICAgICAgICAgICAgICBtU3RyZWFtLT5zZXRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSkpOworfQorI2VuZGlmCisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsSGlkbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1ODc4ODkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbEhpZGwuaApAQCAtMCwwICsxLDI2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfSElETF9ICisKKyNpbmNsdWRlIDxhdG9taWM+CisKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbS5oKQorI2luY2x1ZGUgUEFUSChhbmRyb2lkL2hhcmR3YXJlL2F1ZGlvL0ZJTEVfVkVSU0lPTi9JU3RyZWFtSW4uaCkKKyNpbmNsdWRlIFBBVEgoYW5kcm9pZC9oYXJkd2FyZS9hdWRpby9GSUxFX1ZFUlNJT04vSVN0cmVhbU91dC5oKQorI2luY2x1ZGUgPGZtcS9FdmVudEZsYWcuaD4KKyNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+CisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmg+CisKKyNpbmNsdWRlICJDb252ZXJzaW9uSGVscGVySGlkbC5oIgorI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCisKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbTsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmF1ZGlvOjpDUFBfVkVSU0lPTjo6SVN0cmVhbUluOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtT3V0OwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6RXZlbnRGbGFnOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgUmVhZFBhcmFtZXRlcnMgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1Jbjo6UmVhZFBhcmFtZXRlcnM7Cit1c2luZyBSZWFkU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtSW46OlJlYWRTdGF0dXM7Cit1c2luZyBXcml0ZUNvbW1hbmQgPSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OklTdHJlYW1PdXQ6OldyaXRlQ29tbWFuZDsKK3VzaW5nIFdyaXRlU3RhdHVzID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpJU3RyZWFtT3V0OjpXcml0ZVN0YXR1czsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgRGV2aWNlSGFsSGlkbDsKKworY2xhc3MgU3RyZWFtSGFsSGlkbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZSwgcHVibGljIENvbnZlcnNpb25IZWxwZXJIaWRsCit7CisgIHB1YmxpYzoKKyAgICAvLyBSZXR1cm4gdGhlIHNhbXBsaW5nIHJhdGUgaW4gSHogLSBlZy4gNDQxMDAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTYW1wbGVSYXRlKHVpbnQzMl90ICpyYXRlKTsKKworICAgIC8vIFJldHVybiBzaXplIG9mIGlucHV0L291dHB1dCBidWZmZXIgaW4gYnl0ZXMgZm9yIHRoaXMgc3RyZWFtIC0gZWcuIDQ4MDAuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGNoYW5uZWwgbWFzay4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrKTsKKworICAgIC8vIFJldHVybiB0aGUgYXVkaW8gZm9ybWF0IC0gZS5nLiBBVURJT19GT1JNQVRfUENNXzE2X0JJVC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZvcm1hdChhdWRpb19mb3JtYXRfdCAqZm9ybWF0KTsKKworICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgICAgIHVpbnQzMl90ICpzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzaywgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7CisKKyAgICAvLyBTZXQgYXVkaW8gc3RyZWFtIHBhcmFtZXRlcnMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGt2UGFpcnMpOworCisgICAgLy8gR2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpOworCisgICAgLy8gQWRkIG9yIHJlbW92ZSB0aGUgZWZmZWN0IG9uIHRoZSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKKworICAgIC8vIFB1dCB0aGUgYXVkaW8gaGFyZHdhcmUgaW5wdXQvb3V0cHV0IGludG8gc3RhbmRieSBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCk7CisKKyAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKworICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOworCisgICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOworCisgICAgLy8gU2V0IHRoZSBwcmlvcml0eSBvZiB0aGUgdGhyZWFkIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhlIEhBTAorICAgIC8vIChtdXN0IG1hdGNoIHRoZSBwcmlvcml0eSBvZiB0aGUgYXVkaW9mbGluZ2VyJ3MgdGhyZWFkIHRoYXQgY2FsbHMgJ3JlYWQnIC8gJ3dyaXRlJykKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEhhbFRocmVhZFByaW9yaXR5KGludCBwcmlvcml0eSk7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIFN1YmNsYXNzZXMgY2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIGV4cGxpY2l0IFN0cmVhbUhhbEhpZGwoSVN0cmVhbSAqc3RyZWFtKTsKKworICAgIC8vIFRoZSBkZXN0cnVjdG9yIGF1dG9tYXRpY2FsbHkgY2xvc2VzIHRoZSBzdHJlYW0uCisgICAgdmlydHVhbCB+U3RyZWFtSGFsSGlkbCgpOworCisgICAgc3RhdHVzX3QgZ2V0Q2FjaGVkQnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgYm9vbCByZXF1ZXN0SGFsVGhyZWFkUHJpb3JpdHkocGlkX3QgdGhyZWFkUGlkLCBwaWRfdCB0aHJlYWRJZCk7CisKKyAgICAvLyBtU3RyZWFtUG93ZXJMb2cgaXMgdXNlZCBmb3IgYXVkaW8gc2lnbmFsIHBvd2VyIGxvZ2dpbmcuCisgICAgU3RyZWFtUG93ZXJMb2cgbVN0cmVhbVBvd2VyTG9nOworCisgIHByaXZhdGU6CisgICAgY29uc3QgaW50IEhBTF9USFJFQURfUFJJT1JJVFlfREVGQVVMVCA9IC0xOworICAgIElTdHJlYW0gKm1TdHJlYW07CisgICAgaW50IG1IYWxUaHJlYWRQcmlvcml0eTsKKyAgICBzaXplX3QgbUNhY2hlZEJ1ZmZlclNpemU7Cit9OworCitjbGFzcyBTdHJlYW1PdXRIYWxIaWRsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbEhpZGwgeworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFJldHVybiB0aGUgYXVkaW8gaGFyZHdhcmUgZHJpdmVyIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOworCisgICAgLy8gVXNlIHRoaXMgbWV0aG9kIGluIHNpdHVhdGlvbnMgd2hlcmUgYXVkaW8gbWl4aW5nIGlzIGRvbmUgaW4gdGhlIGhhcmR3YXJlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKKworICAgIC8vIFNlbGVjdHMgdGhlIGF1ZGlvIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpOworCisgICAgLy8gV3JpdGUgYXVkaW8gYnVmZmVyIHRvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKndyaXR0ZW4pOworCisgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHdyaXR0ZW4gYnkgdGhlIGF1ZGlvIGRzcCB0byBEQUMgc2luY2UKKyAgICAvLyB0aGUgb3V0cHV0IGhhcyBleGl0ZWQgc3RhbmRieS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpOworCisgICAgLy8gR2V0IHRoZSBsb2NhbCB0aW1lIGF0IHdoaWNoIHRoZSBuZXh0IHdyaXRlIHRvIHRoZSBhdWRpbyBkcml2ZXIgd2lsbCBiZSBwcmVzZW50ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0V3JpdGVUaW1lc3RhbXAoaW50NjRfdCAqdGltZXN0YW1wKTsKKworICAgIC8vIFNldCB0aGUgY2FsbGJhY2sgZm9yIG5vdGlmeWluZyBjb21wbGV0aW9uIG9mIG5vbi1ibG9ja2luZyB3cml0ZSBhbmQgZHJhaW4uCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRDYWxsYmFjayh3cDxTdHJlYW1PdXRIYWxJbnRlcmZhY2VDYWxsYmFjaz4gY2FsbGJhY2spOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIHBhdXNlIGFuZCByZXN1bWUgb3BlcmF0aW9ucyBhcmUgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNQYXVzZUFuZFJlc3VtZShib29sICpzdXBwb3J0c1BhdXNlLCBib29sICpzdXBwb3J0c1Jlc3VtZSk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKKyAgICAvLyBOb3RpZmllcyB0byB0aGUgYXVkaW8gZHJpdmVyIHRvIHJlc3VtZSBwbGF5YmFjayBmb2xsb3dpbmcgYSBwYXVzZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3VtZSgpOworCisgICAgLy8gUmV0dXJucyB3aGV0aGVyIGRyYWluIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdXBwb3J0c0RyYWluKGJvb2wgKnN1cHBvcnRzRHJhaW4pOworCisgICAgLy8gUmVxdWVzdHMgbm90aWZpY2F0aW9uIHdoZW4gZGF0YSBidWZmZXJlZCBieSB0aGUgZHJpdmVyL2hhcmR3YXJlIGhhcyBiZWVuIHBsYXllZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGRyYWluKGJvb2wgZWFybHlOb3RpZnkpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byBmbHVzaCB0aGUgcXVldWVkIGRhdGEuCisgICAgdmlydHVhbCBzdGF0dXNfdCBmbHVzaCgpOworCisgICAgLy8gUmV0dXJuIGEgcmVjZW50IGNvdW50IG9mIHRoZSBudW1iZXIgb2YgYXVkaW8gZnJhbWVzIHByZXNlbnRlZCB0byBhbiBleHRlcm5hbCBvYnNlcnZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByZXNlbnRhdGlvblBvc2l0aW9uKHVpbnQ2NF90ICpmcmFtZXMsIHN0cnVjdCB0aW1lc3BlYyAqdGltZXN0YW1wKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXRhZGF0YSBvZiB0aGUgc3RyZWFtJ3Mgc291cmNlIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgc3RhdHVzX3QgdXBkYXRlU291cmNlTWV0YWRhdGEoY29uc3QgU291cmNlTWV0YWRhdGEmIHNvdXJjZU1ldGFkYXRhKSBvdmVycmlkZTsKKworICAgIC8vIE1ldGhvZHMgdXNlZCBieSBTdHJlYW1PdXRDYWxsYmFjayAoSElETCkuCisgICAgdm9pZCBvbldyaXRlUmVhZHkoKTsKKyAgICB2b2lkIG9uRHJhaW5SZWFkeSgpOworICAgIHZvaWQgb25FcnJvcigpOworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIERldmljZUhhbEhpZGw7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVDb21tYW5kLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8V3JpdGVTdGF0dXMsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBTdGF0dXNNUTsKKworICAgIHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBtQ2FsbGJhY2s7CisgICAgc3A8SVN0cmVhbU91dD4gbVN0cmVhbTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29tbWFuZE1RPiBtQ29tbWFuZE1ROworICAgIHN0ZDo6dW5pcXVlX3B0cjxEYXRhTVE+IG1EYXRhTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPFN0YXR1c01RPiBtU3RhdHVzTVE7CisgICAgc3RkOjphdG9taWM8cGlkX3Q+IG1Xcml0ZXJDbGllbnQ7CisgICAgRXZlbnRGbGFnKiBtRWZHcm91cDsKKworICAgIC8vIENhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KKyAgICBTdHJlYW1PdXRIYWxIaWRsKGNvbnN0IHNwPElTdHJlYW1PdXQ+JiBzdHJlYW0pOworCisgICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsSGlkbCgpOworCisgICAgdXNpbmcgV3JpdGVyQ2FsbGJhY2sgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgV3JpdGVTdGF0dXMmIHdyaXRlU3RhdHVzKT47CisgICAgc3RhdHVzX3QgY2FsbFdyaXRlclRocmVhZCgKKyAgICAgICAgICAgIFdyaXRlQ29tbWFuZCBjbWQsIGNvbnN0IGNoYXIqIGNtZE5hbWUsCisgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YVNpemUsIFdyaXRlckNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlRm9yV3JpdGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Cit9OworCitjbGFzcyBTdHJlYW1JbkhhbEhpZGwgOiBwdWJsaWMgU3RyZWFtSW5IYWxJbnRlcmZhY2UsIHB1YmxpYyBTdHJlYW1IYWxIaWRsIHsKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBTZXQgdGhlIGlucHV0IGdhaW4gZm9yIHRoZSBhdWRpbyBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRHYWluKGZsb2F0IGdhaW4pOworCisgICAgLy8gUmVhZCBhdWRpbyBidWZmZXIgaW4gZnJvbSBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpOworCisgICAgLy8gUmV0dXJuIHRoZSBhbW91bnQgb2YgaW5wdXQgZnJhbWVzIGxvc3QgaW4gdGhlIGF1ZGlvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0RnJhbWVzTG9zdCh1aW50MzJfdCAqZnJhbWVzTG9zdCk7CisKKyAgICAvLyBSZXR1cm4gYSByZWNlbnQgY291bnQgb2YgdGhlIG51bWJlciBvZiBhdWRpbyBmcmFtZXMgcmVjZWl2ZWQgYW5kCisgICAgLy8gdGhlIGNsb2NrIHRpbWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQgZnJhbWUgY291bnQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKTsKKworICAgIC8vIEdldCBhY3RpdmUgbWljcm9waG9uZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKKworICAgIC8vIFNldCBtaWNyb3Bob25lIGRpcmVjdGlvbiAoZm9yIHByb2Nlc3NpbmcpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSBvdmVycmlkZTsKKworICAgIC8vIFNldCBtaWNyb3Bob25lIHpvb20gKGZvciBwcm9jZXNzaW5nKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIG92ZXJyaWRlOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzaW5rIGhhcyBiZWVuIGNoYW5nZWQuCisgICAgc3RhdHVzX3QgdXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSBvdmVycmlkZTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEZXZpY2VIYWxIaWRsOworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPFJlYWRQYXJhbWV0ZXJzLCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT4gQ29tbWFuZE1ROworICAgIHR5cGVkZWYgTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPiBEYXRhTVE7CisgICAgdHlwZWRlZiBNZXNzYWdlUXVldWU8UmVhZFN0YXR1cywgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+IFN0YXR1c01ROworCisgICAgc3A8SVN0cmVhbUluPiBtU3RyZWFtOworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb21tYW5kTVE+IG1Db21tYW5kTVE7CisgICAgc3RkOjp1bmlxdWVfcHRyPERhdGFNUT4gbURhdGFNUTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U3RhdHVzTVE+IG1TdGF0dXNNUTsKKyAgICBzdGQ6OmF0b21pYzxwaWRfdD4gbVJlYWRlckNsaWVudDsKKyAgICBFdmVudEZsYWcqIG1FZkdyb3VwOworCisgICAgLy8gQ2FuIG5vdCBiZSBjb25zdHJ1Y3RlZCBkaXJlY3RseSBieSBjbGllbnRzLgorICAgIFN0cmVhbUluSGFsSGlkbChjb25zdCBzcDxJU3RyZWFtSW4+JiBzdHJlYW0pOworCisgICAgdmlydHVhbCB+U3RyZWFtSW5IYWxIaWRsKCk7CisKKyAgICB1c2luZyBSZWFkZXJDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBSZWFkU3RhdHVzJiByZWFkU3RhdHVzKT47CisgICAgc3RhdHVzX3QgY2FsbFJlYWRlclRocmVhZCgKKyAgICAgICAgICAgIGNvbnN0IFJlYWRQYXJhbWV0ZXJzJiBwYXJhbXMsIGNvbnN0IGNoYXIqIGNtZE5hbWUsIFJlYWRlckNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgICBzdGF0dXNfdCBwcmVwYXJlRm9yUmVhZGluZyhzaXplX3QgYnVmZmVyU2l6ZSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBDUFBfVkVSU0lPTgorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5jcHAgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODE4ZmQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1IYWxMb2NhbC5jcHAKQEAgLTAsMCArMSwzOTYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIlN0cmVhbUhhbExvY2FsIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8aGFyZHdhcmUvYXVkaW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiRGV2aWNlSGFsTG9jYWwuaCIKKyNpbmNsdWRlICJTdHJlYW1IYWxMb2NhbC5oIgorI2luY2x1ZGUgIlZlcnNpb25VdGlscy5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworCitTdHJlYW1IYWxMb2NhbDo6U3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKKyAgICAgICAgOiBtRGV2aWNlKGRldmljZSksCisgICAgICAgICAgbVN0cmVhbShzdHJlYW0pIHsKKyAgICAvLyBJbnN0cnVtZW50IGF1ZGlvIHNpZ25hbCBwb3dlciBsb2dnaW5nLgorICAgIC8vIE5vdGU6IFRoaXMgYXNzdW1lcyBjaGFubmVsIG1hc2ssIGZvcm1hdCwgYW5kIHNhbXBsZSByYXRlIGRvIG5vdCBjaGFuZ2UgYWZ0ZXIgY3JlYXRpb24uCisgICAgaWYgKG1TdHJlYW0gIT0gbnVsbHB0ciAvKiAmJiBtU3RyZWFtUG93ZXJMb2cuaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkgKi8pIHsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmluaXQobVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pLAorICAgICAgICAgICAgICAgIG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKSwKKyAgICAgICAgICAgICAgICBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pKTsKKyAgICB9Cit9CisKK1N0cmVhbUhhbExvY2FsOjp+U3RyZWFtSGFsTG9jYWwoKSB7CisgICAgbVN0cmVhbSA9IDA7CisgICAgbURldmljZS5jbGVhcigpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSkgeworICAgICpyYXRlID0gbVN0cmVhbS0+Z2V0X3NhbXBsZV9yYXRlKG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEJ1ZmZlclNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBtU3RyZWFtLT5nZXRfYnVmZmVyX3NpemUobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2spIHsKKyAgICAqbWFzayA9IG1TdHJlYW0tPmdldF9jaGFubmVscyhtU3RyZWFtKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCkgeworICAgICpmb3JtYXQgPSBtU3RyZWFtLT5nZXRfZm9ybWF0KG1TdHJlYW0pOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OmdldEF1ZGlvUHJvcGVydGllcygKKyAgICAgICAgdWludDMyX3QgKnNhbXBsZVJhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICptYXNrLCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0KSB7CisgICAgKnNhbXBsZVJhdGUgPSBtU3RyZWFtLT5nZXRfc2FtcGxlX3JhdGUobVN0cmVhbSk7CisgICAgKm1hc2sgPSBtU3RyZWFtLT5nZXRfY2hhbm5lbHMobVN0cmVhbSk7CisgICAgKmZvcm1hdCA9IG1TdHJlYW0tPmdldF9mb3JtYXQobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6c2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKSB7CisgICAgcmV0dXJuIG1TdHJlYW0tPnNldF9wYXJhbWV0ZXJzKG1TdHJlYW0sIGt2UGFpcnMuc3RyaW5nKCkpOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzLCBTdHJpbmc4ICp2YWx1ZXMpIHsKKyAgICBjaGFyICpoYWxWYWx1ZXMgPSBtU3RyZWFtLT5nZXRfcGFyYW1ldGVycyhtU3RyZWFtLCBrZXlzLnN0cmluZygpKTsKKyAgICBpZiAoaGFsVmFsdWVzICE9IE5VTEwpIHsKKyAgICAgICAgdmFsdWVzLT5zZXRUbyhoYWxWYWx1ZXMpOworICAgICAgICBmcmVlKGhhbFZhbHVlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWVzLT5jbGVhcigpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjphZGRFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgeworICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpyZW1vdmVFZmZlY3Qoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPikgeworICAgIExPR19BTFdBWVNfRkFUQUwoIkxvY2FsIHN0cmVhbXMgY2FuIG5vdCBoYXZlIGVmZmVjdHMiKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisKK3N0YXR1c190IFN0cmVhbUhhbExvY2FsOjpzdGFuZGJ5KCkgeworICAgIHJldHVybiBtU3RyZWFtLT5zdGFuZGJ5KG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1IYWxMb2NhbDo6ZHVtcChpbnQgZmQpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5kdW1wKG1TdHJlYW0sIGZkKTsKKyAgICBtU3RyZWFtUG93ZXJMb2cuZHVtcChmZCk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgU3RyZWFtSGFsTG9jYWw6OnNldEhhbFRocmVhZFByaW9yaXR5KGludCkgeworICAgIC8vIERvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcgYXMgbG9jYWwgaGFsIGlzIGV4ZWN1dGVkIGJ5IGF1ZGlvZmxpbmdlciBkaXJlY3RseQorICAgIC8vIG9uIHRoZSBzYW1lIHRocmVhZC4KKyAgICByZXR1cm4gT0s7Cit9CisKK1N0cmVhbU91dEhhbExvY2FsOjpTdHJlYW1PdXRIYWxMb2NhbChhdWRpb19zdHJlYW1fb3V0X3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSkKKyAgICAgICAgOiBTdHJlYW1IYWxMb2NhbCgmc3RyZWFtLT5jb21tb24sIGRldmljZSksIG1TdHJlYW0oc3RyZWFtKSB7Cit9CisKK1N0cmVhbU91dEhhbExvY2FsOjp+U3RyZWFtT3V0SGFsTG9jYWwoKSB7CisgICAgbUNhbGxiYWNrLmNsZWFyKCk7CisgICAgbURldmljZS0+Y2xvc2VPdXRwdXRTdHJlYW0obVN0cmVhbSk7CisgICAgbVN0cmVhbSA9IDA7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKSB7CisgICAgKnNpemUgPSBhdWRpb19zdHJlYW1fb3V0X2ZyYW1lX3NpemUobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TGF0ZW5jeSh1aW50MzJfdCAqbGF0ZW5jeSkgeworICAgICpsYXRlbmN5ID0gbVN0cmVhbS0+Z2V0X2xhdGVuY3kobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7CisgICAgaWYgKG1TdHJlYW0tPnNldF92b2x1bWUgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfdm9sdW1lKG1TdHJlYW0sIGxlZnQsIHJpZ2h0KTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpIHsKKyAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKKyAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5UHJlc2VudGF0aW9uSWQpLCBwcmVzZW50YXRpb25JZCk7CisgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVByb2dyYW1JZCksIHByb2dyYW1JZCk7CisgICAgcmV0dXJuIHNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSB7CisgICAgc3NpemVfdCB3cml0ZVJlc3VsdCA9IG1TdHJlYW0tPndyaXRlKG1TdHJlYW0sIGJ1ZmZlciwgYnl0ZXMpOworICAgIGlmICh3cml0ZVJlc3VsdCA+IDApIHsKKyAgICAgICAgKndyaXR0ZW4gPSB3cml0ZVJlc3VsdDsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyhidWZmZXIsICp3cml0dGVuKTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgICp3cml0dGVuID0gMDsKKyAgICAgICAgcmV0dXJuIHdyaXRlUmVzdWx0OworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OmdldFJlbmRlclBvc2l0aW9uKHVpbnQzMl90ICpkc3BGcmFtZXMpIHsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3JlbmRlcl9wb3NpdGlvbihtU3RyZWFtLCBkc3BGcmFtZXMpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5nZXRfbmV4dF93cml0ZV90aW1lc3RhbXAobVN0cmVhbSwgdGltZXN0YW1wKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnNldENhbGxiYWNrKHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjaykgeworICAgIGlmIChtU3RyZWFtLT5zZXRfY2FsbGJhY2sgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1TdHJlYW0tPnNldF9jYWxsYmFjayhtU3RyZWFtLCBTdHJlYW1PdXRIYWxMb2NhbDo6YXN5bmNDYWxsYmFjaywgdGhpcyk7CisgICAgaWYgKHJlc3VsdCA9PSBPSykgeworICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gc3RhdGljCitpbnQgU3RyZWFtT3V0SGFsTG9jYWw6OmFzeW5jQ2FsbGJhY2soc3RyZWFtX2NhbGxiYWNrX2V2ZW50X3QgZXZlbnQsIHZvaWQqLCB2b2lkICpjb29raWUpIHsKKyAgICAvLyBXZSBhY3QgYXMgaWYgd2UgZ2F2ZSBhIHdwPFN0cmVhbU91dEhhbExvY2FsPiB0byBIQUwuIFRoaXMgd2F5IHdlIHNob3VsZCBoYW5kbGUKKyAgICAvLyBjb3JyZWN0bHkgdGhlIGNhc2Ugd2hlbiB0aGUgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGlsZSBTdHJlYW1PdXRIYWxMb2NhbCdzIGRlc3RydWN0b3IgaXMKKyAgICAvLyBhbHJlYWR5IHJ1bm5pbmcsIGJlY2F1c2UgdGhlIGRlc3RydWN0b3IgaXMgaW52b2tlZCBhZnRlciB0aGUgcmVmY291bnQgaGFzIGJlZW4gYXRvbWljYWxseQorICAgIC8vIGRlY3JlbWVudGVkLgorICAgIHdwPFN0cmVhbU91dEhhbExvY2FsPiB3ZWFrU2VsZihzdGF0aWNfY2FzdDxTdHJlYW1PdXRIYWxMb2NhbCo+KGNvb2tpZSkpOworICAgIHNwPFN0cmVhbU91dEhhbExvY2FsPiBzZWxmID0gd2Vha1NlbGYucHJvbW90ZSgpOworICAgIGlmIChzZWxmID09IDApIHJldHVybiAwOworICAgIHNwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBjYWxsYmFjayA9IHNlbGYtPm1DYWxsYmFjay5wcm9tb3RlKCk7CisgICAgaWYgKGNhbGxiYWNrID09IDApIHJldHVybiAwOworICAgIEFMT0dWKCJhc3luY0NhbGxiYWNrKCkgZXZlbnQgJWQiLCBldmVudCk7CisgICAgc3dpdGNoIChldmVudCkgeworICAgICAgICBjYXNlIFNUUkVBTV9DQktfRVZFTlRfV1JJVEVfUkVBRFk6CisgICAgICAgICAgICBjYWxsYmFjay0+b25Xcml0ZVJlYWR5KCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVFJFQU1fQ0JLX0VWRU5UX0RSQUlOX1JFQURZOgorICAgICAgICAgICAgY2FsbGJhY2stPm9uRHJhaW5SZWFkeSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgU1RSRUFNX0NCS19FVkVOVF9FUlJPUjoKKyAgICAgICAgICAgIGNhbGxiYWNrLT5vbkVycm9yKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJhc3luY0NhbGxiYWNrKCkgdW5rbm93biBldmVudCAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpIHsKKyAgICAqc3VwcG9ydHNQYXVzZSA9IG1TdHJlYW0tPnBhdXNlICE9IE5VTEw7CisgICAgKnN1cHBvcnRzUmVzdW1lID0gbVN0cmVhbS0+cmVzdW1lICE9IE5VTEw7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6cGF1c2UoKSB7CisgICAgaWYgKG1TdHJlYW0tPnBhdXNlID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+cGF1c2UobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpyZXN1bWUoKSB7CisgICAgaWYgKG1TdHJlYW0tPnJlc3VtZSA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnJlc3VtZShtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN1cHBvcnRzRHJhaW4oYm9vbCAqc3VwcG9ydHNEcmFpbikgeworICAgICpzdXBwb3J0c0RyYWluID0gbVN0cmVhbS0+ZHJhaW4gIT0gTlVMTDsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpkcmFpbihib29sIGVhcmx5Tm90aWZ5KSB7CisgICAgaWYgKG1TdHJlYW0tPmRyYWluID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+ZHJhaW4obVN0cmVhbSwgZWFybHlOb3RpZnkgPyBBVURJT19EUkFJTl9FQVJMWV9OT1RJRlkgOiBBVURJT19EUkFJTl9BTEwpOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Zmx1c2goKSB7CisgICAgaWYgKG1TdHJlYW0tPmZsdXNoID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Zmx1c2gobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCkgeworICAgIGlmIChtU3RyZWFtLT5nZXRfcHJlc2VudGF0aW9uX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X3ByZXNlbnRhdGlvbl9wb3NpdGlvbihtU3RyZWFtLCBmcmFtZXMsIHRpbWVzdGFtcCk7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjp1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIHsKKyAgICBpZiAobVN0cmVhbS0+dXBkYXRlX3NvdXJjZV9tZXRhZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgY29uc3Qgc291cmNlX21ldGFkYXRhX3QgbWV0YWRhdGEgeworICAgICAgICAudHJhY2tfY291bnQgPSBzb3VyY2VNZXRhZGF0YS50cmFja3Muc2l6ZSgpLAorICAgICAgICAvLyBjb25zdCBjYXN0IGlzIGZpbmUgYXMgaXQgaXMgaW4gYSBjb25zdCBzdHJ1Y3R1cmUKKyAgICAgICAgLnRyYWNrcyA9IGNvbnN0X2Nhc3Q8cGxheWJhY2tfdHJhY2tfbWV0YWRhdGEqPihzb3VyY2VNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKKyAgICB9OworICAgIG1TdHJlYW0tPnVwZGF0ZV9zb3VyY2VfbWV0YWRhdGEobVN0cmVhbSwgJm1ldGFkYXRhKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0cmVhbU91dEhhbExvY2FsOjpzdGFydCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtT3V0SGFsTG9jYWw6OnN0b3AoKSB7CisgICAgaWYgKG1TdHJlYW0tPnN0b3AgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zdG9wKG1TdHJlYW0pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Y3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pIHsKKyAgICBpZiAobVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Y3JlYXRlX21tYXBfYnVmZmVyKG1TdHJlYW0sIG1pblNpemVGcmFtZXMsIGluZm8pOworfQorCitzdGF0dXNfdCBTdHJlYW1PdXRIYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgeworICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKK30KKworU3RyZWFtSW5IYWxMb2NhbDo6U3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKQorICAgICAgICA6IFN0cmVhbUhhbExvY2FsKCZzdHJlYW0tPmNvbW1vbiwgZGV2aWNlKSwgbVN0cmVhbShzdHJlYW0pIHsKK30KKworU3RyZWFtSW5IYWxMb2NhbDo6flN0cmVhbUluSGFsTG9jYWwoKSB7CisgICAgbURldmljZS0+Y2xvc2VJbnB1dFN0cmVhbShtU3RyZWFtKTsKKyAgICBtU3RyZWFtID0gMDsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSkgeworICAgICpzaXplID0gYXVkaW9fc3RyZWFtX2luX2ZyYW1lX3NpemUobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzZXRHYWluKGZsb2F0IGdhaW4pIHsKKyAgICByZXR1cm4gbVN0cmVhbS0+c2V0X2dhaW4obVN0cmVhbSwgZ2Fpbik7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgeworICAgIHNzaXplX3QgcmVhZFJlc3VsdCA9IG1TdHJlYW0tPnJlYWQobVN0cmVhbSwgYnVmZmVyLCBieXRlcyk7CisgICAgaWYgKHJlYWRSZXN1bHQgPiAwKSB7CisgICAgICAgICpyZWFkID0gcmVhZFJlc3VsdDsKKyAgICAgICAgbVN0cmVhbVBvd2VyTG9nLmxvZyggYnVmZmVyLCAqcmVhZCk7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICAqcmVhZCA9IDA7CisgICAgICAgIHJldHVybiByZWFkUmVzdWx0OworICAgIH0KK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KSB7CisgICAgKmZyYW1lc0xvc3QgPSBtU3RyZWFtLT5nZXRfaW5wdXRfZnJhbWVzX2xvc3QobVN0cmVhbSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSB7CisgICAgaWYgKG1TdHJlYW0tPmdldF9jYXB0dXJlX3Bvc2l0aW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+Z2V0X2NhcHR1cmVfcG9zaXRpb24obVN0cmVhbSwgZnJhbWVzLCB0aW1lKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6dXBkYXRlU2lua01ldGFkYXRhKGNvbnN0IFNpbmtNZXRhZGF0YSYgc2lua01ldGFkYXRhKSB7CisgICAgaWYgKG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBjb25zdCBzaW5rX21ldGFkYXRhX3QgbWV0YWRhdGEgeworICAgICAgICAudHJhY2tfY291bnQgPSBzaW5rTWV0YWRhdGEudHJhY2tzLnNpemUoKSwKKyAgICAgICAgLy8gY29uc3QgY2FzdCBpcyBmaW5lIGFzIGl0IGlzIGluIGEgY29uc3Qgc3RydWN0dXJlCisgICAgICAgIC50cmFja3MgPSBjb25zdF9jYXN0PHJlY29yZF90cmFja19tZXRhZGF0YSo+KHNpbmtNZXRhZGF0YS50cmFja3MuZGF0YSgpKSwKKyAgICB9OworICAgIG1TdHJlYW0tPnVwZGF0ZV9zaW5rX21ldGFkYXRhKG1TdHJlYW0sICZtZXRhZGF0YSk7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpzdGFydCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RhcnQgPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zdGFydChtU3RyZWFtKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c3RvcCgpIHsKKyAgICBpZiAobVN0cmVhbS0+c3RvcCA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPnN0b3AobVN0cmVhbSk7Cit9CisKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OmNyZWF0ZU1tYXBCdWZmZXIoaW50MzJfdCBtaW5TaXplRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKSB7CisgICAgaWYgKG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlciA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmNyZWF0ZV9tbWFwX2J1ZmZlcihtU3RyZWFtLCBtaW5TaXplRnJhbWVzLCBpbmZvKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0TW1hcFBvc2l0aW9uKHN0cnVjdCBhdWRpb19tbWFwX3Bvc2l0aW9uICpwb3NpdGlvbikgeworICAgIGlmIChtU3RyZWFtLT5nZXRfbW1hcF9wb3NpdGlvbiA9PSBOVUxMKSByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgcmV0dXJuIG1TdHJlYW0tPmdldF9tbWFwX3Bvc2l0aW9uKG1TdHJlYW0sIHBvc2l0aW9uKTsKK30KKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgorc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6Z2V0QWN0aXZlTWljcm9waG9uZXMoCisgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzIF9fdW51c2VkKSB7CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorI2VsaWYgTUFKT1JfVkVSU0lPTiA+PSA0CitzdGF0dXNfdCBTdHJlYW1JbkhhbExvY2FsOjpnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgeworICAgIGlmIChtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICBzaXplX3QgYWN0dWFsX21pY3MgPSBBVURJT19NSUNST1BIT05FX01BWF9DT1VOVDsKKyAgICBhdWRpb19taWNyb3Bob25lX2NoYXJhY3RlcmlzdGljX3QgbWljX2FycmF5W0FVRElPX01JQ1JPUEhPTkVfTUFYX0NPVU5UXTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtU3RyZWFtLT5nZXRfYWN0aXZlX21pY3JvcGhvbmVzKG1TdHJlYW0sICZtaWNfYXJyYXlbMF0sICZhY3R1YWxfbWljcyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3R1YWxfbWljczsgaSsrKSB7CisgICAgICAgIG1lZGlhOjpNaWNyb3Bob25lSW5mbyBtaWNyb3Bob25lSW5mbyA9IG1lZGlhOjpNaWNyb3Bob25lSW5mbyhtaWNfYXJyYXlbaV0pOworICAgICAgICBtaWNyb3Bob25lcy0+cHVzaF9iYWNrKG1pY3JvcGhvbmVJbmZvKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKyNlbmRpZgorCisjaWYgTUFKT1JfVkVSU0lPTiA8IDUKK3N0YXR1c190IFN0cmVhbUluSGFsTG9jYWw6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oCisgICAgICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbiBfX3VudXNlZCkgeworICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20gX191bnVzZWQpIHsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Cit9CisjZWxzZQorc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgeworICAgIGlmIChtU3RyZWFtLT5zZXRfbWljcm9waG9uZV9kaXJlY3Rpb24gPT0gTlVMTCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIHJldHVybiBtU3RyZWFtLT5zZXRfbWljcm9waG9uZV9kaXJlY3Rpb24obVN0cmVhbSwgZGlyZWN0aW9uKTsKK30KKworc3RhdHVzX3QgU3RyZWFtSW5IYWxMb2NhbDo6c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pIHsKKyAgICBpZiAobVN0cmVhbS0+c2V0X21pY3JvcGhvbmVfZmllbGRfZGltZW5zaW9uID09IE5VTEwpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICByZXR1cm4gbVN0cmVhbS0+c2V0X21pY3JvcGhvbmVfZmllbGRfZGltZW5zaW9uKG1TdHJlYW0sIHpvb20pOworCit9CisjZW5kaWYKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbUhhbExvY2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzRmMmJkOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2ltcGwvU3RyZWFtSGFsTG9jYWwuaApAQCAtMCwwICsxLDIzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMX0gKKyNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9TVFJFQU1fSEFMX0xPQ0FMX0gKKworI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgorI2luY2x1ZGUgIlN0cmVhbVBvd2VyTG9nLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBDUFBfVkVSU0lPTiB7CisKK2NsYXNzIERldmljZUhhbExvY2FsOworCitjbGFzcyBTdHJlYW1IYWxMb2NhbCA6IHB1YmxpYyB2aXJ0dWFsIFN0cmVhbUhhbEludGVyZmFjZQoreworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBzYW1wbGluZyByYXRlIGluIEh6IC0gZWcuIDQ0MTAwLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2FtcGxlUmF0ZSh1aW50MzJfdCAqcmF0ZSk7CisKKyAgICAvLyBSZXR1cm4gc2l6ZSBvZiBpbnB1dC9vdXRwdXQgYnVmZmVyIGluIGJ5dGVzIGZvciB0aGlzIHN0cmVhbSAtIGVnLiA0ODAwLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyU2l6ZShzaXplX3QgKnNpemUpOworCisgICAgLy8gUmV0dXJuIHRoZSBjaGFubmVsIG1hc2suCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAqbWFzayk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGZvcm1hdCAtIGUuZy4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgKmZvcm1hdCk7CisKKyAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdWRpb1Byb3BlcnRpZXMoCisgICAgICAgICAgICB1aW50MzJfdCAqc2FtcGxlUmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgKm1hc2ssIGF1ZGlvX2Zvcm1hdF90ICpmb3JtYXQpOworCisgICAgLy8gU2V0IGF1ZGlvIHN0cmVhbSBwYXJhbWV0ZXJzLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrdlBhaXJzKTsKKworICAgIC8vIEdldCBhdWRpbyBzdHJlYW0gcGFyYW1ldGVycy4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cywgU3RyaW5nOCAqdmFsdWVzKTsKKworICAgIC8vIEFkZCBvciByZW1vdmUgdGhlIGVmZmVjdCBvbiB0aGUgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0KHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUVmZmVjdChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7CisKKyAgICAvLyBQdXQgdGhlIGF1ZGlvIGhhcmR3YXJlIGlucHV0L291dHB1dCBpbnRvIHN0YW5kYnkgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YW5kYnkoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworCisgICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCkgPSAwOworCisgICAgLy8gU3RvcCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpID0gMDsKKworICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pID0gMDsKKworICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKSA9IDA7CisKKyAgICAvLyBTZXQgdGhlIHByaW9yaXR5IG9mIHRoZSB0aHJlYWQgdGhhdCBpbnRlcmFjdHMgd2l0aCB0aGUgSEFMCisgICAgLy8gKG11c3QgbWF0Y2ggdGhlIHByaW9yaXR5IG9mIHRoZSBhdWRpb2ZsaW5nZXIncyB0aHJlYWQgdGhhdCBjYWxscyAncmVhZCcgLyAnd3JpdGUnKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0SGFsVGhyZWFkUHJpb3JpdHkoaW50IHByaW9yaXR5KTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gU3ViY2xhc3NlcyBjYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgU3RyZWFtSGFsTG9jYWwoYXVkaW9fc3RyZWFtX3QgKnN0cmVhbSwgc3A8RGV2aWNlSGFsTG9jYWw+IGRldmljZSk7CisKKyAgICAvLyBUaGUgZGVzdHJ1Y3RvciBhdXRvbWF0aWNhbGx5IGNsb3NlcyB0aGUgc3RyZWFtLgorICAgIHZpcnR1YWwgflN0cmVhbUhhbExvY2FsKCk7CisKKyAgICBzcDxEZXZpY2VIYWxMb2NhbD4gbURldmljZTsKKworICAgIC8vIG1TdHJlYW1Qb3dlckxvZyBpcyB1c2VkIGZvciBhdWRpbyBzaWduYWwgcG93ZXIgbG9nZ2luZy4KKyAgICBTdHJlYW1Qb3dlckxvZyBtU3RyZWFtUG93ZXJMb2c7CisKKyAgcHJpdmF0ZToKKyAgICBhdWRpb19zdHJlYW1fdCAqbVN0cmVhbTsKK307CisKK2NsYXNzIFN0cmVhbU91dEhhbExvY2FsIDogcHVibGljIFN0cmVhbU91dEhhbEludGVyZmFjZSwgcHVibGljIFN0cmVhbUhhbExvY2FsIHsKKyAgcHVibGljOgorICAgIC8vIFJldHVybiB0aGUgZnJhbWUgc2l6ZSAobnVtYmVyIG9mIGJ5dGVzIHBlciBzYW1wbGUpIG9mIGEgc3RyZWFtLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVTaXplKHNpemVfdCAqc2l6ZSk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGF1ZGlvIGhhcmR3YXJlIGRyaXZlciBlc3RpbWF0ZWQgbGF0ZW5jeSBpbiBtaWxsaXNlY29uZHMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRMYXRlbmN5KHVpbnQzMl90ICpsYXRlbmN5KTsKKworICAgIC8vIFVzZSB0aGlzIG1ldGhvZCBpbiBzaXR1YXRpb25zIHdoZXJlIGF1ZGlvIG1peGluZyBpcyBkb25lIGluIHRoZSBoYXJkd2FyZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZShmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCk7CisKKyAgICAvLyBTZWxlY3RzIHRoZSBhdWRpbyBwcmVzZW50YXRpb24gKGlmIGF2YWlsYWJsZSkuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKTsKKworICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKTsKKworICAgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyB3cml0dGVuIGJ5IHRoZSBhdWRpbyBkc3AgdG8gREFDIHNpbmNlCisgICAgLy8gdGhlIG91dHB1dCBoYXMgZXhpdGVkIHN0YW5kYnkuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqZHNwRnJhbWVzKTsKKworICAgIC8vIEdldCB0aGUgbG9jYWwgdGltZSBhdCB3aGljaCB0aGUgbmV4dCB3cml0ZSB0byB0aGUgYXVkaW8gZHJpdmVyIHdpbGwgYmUgcHJlc2VudGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TmV4dFdyaXRlVGltZXN0YW1wKGludDY0X3QgKnRpbWVzdGFtcCk7CisKKyAgICAvLyBTZXQgdGhlIGNhbGxiYWNrIGZvciBub3RpZnlpbmcgY29tcGxldGlvbiBvZiBub24tYmxvY2tpbmcgd3JpdGUgYW5kIGRyYWluLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FsbGJhY2sod3A8U3RyZWFtT3V0SGFsSW50ZXJmYWNlQ2FsbGJhY2s+IGNhbGxiYWNrKTsKKworICAgIC8vIFJldHVybnMgd2hldGhlciBwYXVzZSBhbmQgcmVzdW1lIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN1cHBvcnRzUGF1c2VBbmRSZXN1bWUoYm9vbCAqc3VwcG9ydHNQYXVzZSwgYm9vbCAqc3VwcG9ydHNSZXN1bWUpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCisgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOworCisgICAgLy8gTm90aWZpZXMgdG8gdGhlIGF1ZGlvIGRyaXZlciB0byByZXN1bWUgcGxheWJhY2sgZm9sbG93aW5nIGEgcGF1c2UuCisgICAgdmlydHVhbCBzdGF0dXNfdCByZXN1bWUoKTsKKworICAgIC8vIFJldHVybnMgd2hldGhlciBkcmFpbiBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3VwcG9ydHNEcmFpbihib29sICpzdXBwb3J0c0RyYWluKTsKKworICAgIC8vIFJlcXVlc3RzIG5vdGlmaWNhdGlvbiB3aGVuIGRhdGEgYnVmZmVyZWQgYnkgdGhlIGRyaXZlci9oYXJkd2FyZSBoYXMgYmVlbiBwbGF5ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBkcmFpbihib29sIGVhcmx5Tm90aWZ5KTsKKworICAgIC8vIE5vdGlmaWVzIHRvIHRoZSBhdWRpbyBkcml2ZXIgdG8gZmx1c2ggdGhlIHF1ZXVlZCBkYXRhLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZmx1c2goKTsKKworICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyBwcmVzZW50ZWQgdG8gYW4gZXh0ZXJuYWwgb2JzZXJ2ZXIuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVzZW50YXRpb25Qb3NpdGlvbih1aW50NjRfdCAqZnJhbWVzLCBzdHJ1Y3QgdGltZXNwZWMgKnRpbWVzdGFtcCk7CisKKyAgICAvLyBTdGFydCBhIHN0cmVhbSBvcGVyYXRpbmcgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKTsKKworICAgIC8vIFN0b3AgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKTsKKworICAgIC8vIFJldHJpZXZlIGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhIGJ1ZmZlciBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVNbWFwQnVmZmVyKGludDMyX3QgbWluU2l6ZUZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX21tYXBfYnVmZmVyX2luZm8gKmluZm8pOworCisgICAgLy8gR2V0IGN1cnJlbnQgcmVhZC93cml0ZSBwb3NpdGlvbiBpbiB0aGUgbW1hcCBidWZmZXIKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1tYXBQb3NpdGlvbihzdHJ1Y3QgYXVkaW9fbW1hcF9wb3NpdGlvbiAqcG9zaXRpb24pOworCisgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1ldGFkYXRhIG9mIHRoZSBzdHJlYW0ncyBzb3VyY2UgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICBzdGF0dXNfdCB1cGRhdGVTb3VyY2VNZXRhZGF0YShjb25zdCBTb3VyY2VNZXRhZGF0YSYgc291cmNlTWV0YWRhdGEpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgYXVkaW9fc3RyZWFtX291dF90ICptU3RyZWFtOworICAgIHdwPFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrPiBtQ2FsbGJhY2s7CisKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgU3RyZWFtT3V0SGFsTG9jYWwoYXVkaW9fc3RyZWFtX291dF90ICpzdHJlYW0sIHNwPERldmljZUhhbExvY2FsPiBkZXZpY2UpOworCisgICAgdmlydHVhbCB+U3RyZWFtT3V0SGFsTG9jYWwoKTsKKworICAgIHN0YXRpYyBpbnQgYXN5bmNDYWxsYmFjayhzdHJlYW1fY2FsbGJhY2tfZXZlbnRfdCBldmVudCwgdm9pZCAqcGFyYW0sIHZvaWQgKmNvb2tpZSk7Cit9OworCitjbGFzcyBTdHJlYW1JbkhhbExvY2FsIDogcHVibGljIFN0cmVhbUluSGFsSW50ZXJmYWNlLCBwdWJsaWMgU3RyZWFtSGFsTG9jYWwgeworICBwdWJsaWM6CisgICAgLy8gUmV0dXJuIHRoZSBmcmFtZSBzaXplIChudW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZSkgb2YgYSBzdHJlYW0uCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRGcmFtZVNpemUoc2l6ZV90ICpzaXplKTsKKworICAgIC8vIFNldCB0aGUgaW5wdXQgZ2FpbiBmb3IgdGhlIGF1ZGlvIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEdhaW4oZmxvYXQgZ2Fpbik7CisKKyAgICAvLyBSZWFkIGF1ZGlvIGJ1ZmZlciBpbiBmcm9tIGRyaXZlci4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCk7CisKKyAgICAvLyBSZXR1cm4gdGhlIGFtb3VudCBvZiBpbnB1dCBmcmFtZXMgbG9zdCBpbiB0aGUgYXVkaW8gZHJpdmVyLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SW5wdXRGcmFtZXNMb3N0KHVpbnQzMl90ICpmcmFtZXNMb3N0KTsKKworICAgIC8vIFJldHVybiBhIHJlY2VudCBjb3VudCBvZiB0aGUgbnVtYmVyIG9mIGF1ZGlvIGZyYW1lcyByZWNlaXZlZCBhbmQKKyAgICAvLyB0aGUgY2xvY2sgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhhdCBmcmFtZSBjb3VudC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpOworCisgICAgLy8gU3RhcnQgYSBzdHJlYW0gb3BlcmF0aW5nIGluIG1tYXAgbW9kZS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7CisKKyAgICAvLyBTdG9wIGEgc3RyZWFtIG9wZXJhdGluZyBpbiBtbWFwIG1vZGUuCisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7CisKKyAgICAvLyBSZXRyaWV2ZSBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBidWZmZXIgaW4gbW1hcCBtb2RlLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlTW1hcEJ1ZmZlcihpbnQzMl90IG1pblNpemVGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19tbWFwX2J1ZmZlcl9pbmZvICppbmZvKTsKKworICAgIC8vIEdldCBjdXJyZW50IHJlYWQvd3JpdGUgcG9zaXRpb24gaW4gdGhlIG1tYXAgYnVmZmVyCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNbWFwUG9zaXRpb24oc3RydWN0IGF1ZGlvX21tYXBfcG9zaXRpb24gKnBvc2l0aW9uKTsKKworICAgIC8vIEdldCBhY3RpdmUgbWljcm9waG9uZXMKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4gKm1pY3JvcGhvbmVzKTsKKworICAgIC8vIFNldHMgbWljcm9waG9uZSBkaXJlY3Rpb24gKGZvciBwcm9jZXNzaW5nKQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7CisKKyAgICAvLyBTZXRzIG1pY3JvcGhvbmUgem9vbSAoZm9yIHByb2Nlc3NpbmcpCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CisKKyAgICAvLyBDYWxsZWQgd2hlbiB0aGUgbWV0YWRhdGEgb2YgdGhlIHN0cmVhbSdzIHNpbmsgaGFzIGJlZW4gY2hhbmdlZC4KKyAgICBzdGF0dXNfdCB1cGRhdGVTaW5rTWV0YWRhdGEoY29uc3QgU2lua01ldGFkYXRhJiBzaW5rTWV0YWRhdGEpIG92ZXJyaWRlOworCisgIHByaXZhdGU6CisgICAgYXVkaW9fc3RyZWFtX2luX3QgKm1TdHJlYW07CisKKyAgICBmcmllbmQgY2xhc3MgRGV2aWNlSGFsTG9jYWw7CisKKyAgICAvLyBDYW4gbm90IGJlIGNvbnN0cnVjdGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMuCisgICAgU3RyZWFtSW5IYWxMb2NhbChhdWRpb19zdHJlYW1faW5fdCAqc3RyZWFtLCBzcDxEZXZpY2VIYWxMb2NhbD4gZGV2aWNlKTsKKworICAgIHZpcnR1YWwgflN0cmVhbUluSGFsTG9jYWwoKTsKK307CisKK30gLy8gbmFtZXNwYWNlIENQUF9WRVJTSU9OCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NUUkVBTV9IQUxfTE9DQUxfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1Qb3dlckxvZy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9TdHJlYW1Qb3dlckxvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZDM5MTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1N0cmVhbVBvd2VyTG9nLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1Bvd2VyTG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIENQUF9WRVJTSU9OIHsKKworY2xhc3MgU3RyZWFtUG93ZXJMb2cgeworcHVibGljOgorICAgIFN0cmVhbVBvd2VyTG9nKCkgOgorICAgICAgICBtSXNVc2VyRGVidWdPckVuZ0J1aWxkKGlzX3VzZXJkZWJ1Z19vcl9lbmdfYnVpbGQoKSksCisgICAgICAgIG1Qb3dlckxvZyhudWxscHRyKSwKKyAgICAgICAgbUZyYW1lU2l6ZSgwKSB7CisgICAgICAgIC8vIHVzZSBpbml0KCkgdG8gc2V0IHVwIHRoZSBwb3dlciBsb2cuCisgICAgfQorCisgICAgflN0cmVhbVBvd2VyTG9nKCkgeworICAgICAgICBwb3dlcl9sb2dfZGVzdHJveShtUG93ZXJMb2cpOyAvLyBPSyBmb3IgbnVsbCBtUG93ZXJMb2cKKyAgICAgICAgbVBvd2VyTG9nID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLyBBIG9uZS10aW1lIGluaXRpYWxpemF0aW9uIChkbyBub3QgY2FsbCB0d2ljZSkgYmVmb3JlIHVzaW5nIFN0cmVhbVBvd2VyTG9nLgorICAgIHZvaWQgaW5pdCh1aW50MzJfdCBzYW1wbGVSYXRlLCBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSB7CisgICAgICAgIGlmIChtUG93ZXJMb2cgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gTm90ZTogQSB3YXkgdG8gZ2V0IGNoYW5uZWwgY291bnQgZm9yIGJvdGggaW5wdXQgYW5kIG91dHB1dCBjaGFubmVsIG1hc2tzCisgICAgICAgICAgICAvLyBidXQgZG9lcyBub3QgY2hlY2sgdmFsaWRpdHkgb2YgdGhlIGNoYW5uZWwgbWFzay4KKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IHBvcGNvdW50KGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykpOworICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IGNoYW5uZWxDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KTsKKyAgICAgICAgICAgIGlmIChtRnJhbWVTaXplID4gMCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dGcmFtZXNQZXJFbnRyeSA9CisgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXNhbXBsZVJhdGUgKiBrUG93ZXJMb2dTYW1wbGluZ0ludGVydmFsTXMgLyAxMDAwOworICAgICAgICAgICAgICAgIG1Qb3dlckxvZyA9IHBvd2VyX2xvZ19jcmVhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAga1Bvd2VyTG9nRW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQb3dlckxvZ0ZyYW1lc1BlckVudHJ5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBtUG93ZXJMb2cgbWF5IGJlIE5VTEwgKG5vdCB0aGUgcmlnaHQgYnVpbGQsIGZvcm1hdCBub3QgYWNjZXB0ZWQsIGV0Yy4pLgorICAgIH0KKworICAgIC8vIER1bXAgdGhlIHBvd2VyIGxvZyB0byBmZC4KKyAgICB2b2lkIGR1bXAoaW50IGZkKSBjb25zdCB7CisgICAgICAgIC8vIE9LIGZvciBudWxsIG1Qb3dlckxvZworICAgICAgICAodm9pZClwb3dlcl9sb2dfZHVtcCgKKyAgICAgICAgICAgICAgICBtUG93ZXJMb2csIGZkLCAiICAgICAgIiAvKiBwcmVmaXggKi8sIGtQb3dlckxvZ0xpbmVzLCAwIC8qIGxpbWl0X25zICovKTsKKyAgICB9CisKKyAgICAvLyBMb2cgdGhlIGF1ZGlvIGRhdGEgY29udGFpbmVkIGluIGJ1ZmZlci4KKyAgICB2b2lkIGxvZyhjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplSW5CeXRlcykgY29uc3QgeworICAgICAgICBpZiAobVBvd2VyTG9nICE9IG51bGxwdHIpIHsgLy8gbUZyYW1lU2l6ZSBpcyBhbHdheXMgbm9uemVybyBpZiBtUG93ZXJMb2cgZXhpc3RzLgorICAgICAgICAgICAgcG93ZXJfbG9nX2xvZygKKyAgICAgICAgICAgICAgICAgICAgbVBvd2VyTG9nLCBidWZmZXIsIHNpemVJbkJ5dGVzIC8gbUZyYW1lU2l6ZSwgYXVkaW9fdXRpbHNfZ2V0X3JlYWxfdGltZV9ucygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJvb2wgaXNVc2VyRGVidWdPckVuZ0J1aWxkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgaXNfdXNlcmRlYnVnX29yX2VuZ19idWlsZCgpIHsKKyAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICAodm9pZClwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLnR5cGUiLCB2YWx1ZSwgInVua25vd24iKTsgLy8gaWdub3JlIGFjdHVhbCBsZW5ndGgKKyAgICAgICAgcmV0dXJuIHN0cmNtcCh2YWx1ZSwgInVzZXJkZWJ1ZyIpID09IDAgfHwgc3RyY21wKHZhbHVlLCAiZW5nIikgPT0gMDsKKyAgICB9CisKKyAgICAvLyBBdWRpbyBzaWduYWwgcG93ZXIgbG9nIGNvbmZpZ3VyYXRpb24uCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dMaW5lcyA9IDQwOworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zID0gNTA7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrUG93ZXJMb2dFbnRyaWVzID0gKDEgLyogbWludXRlcyAqLyAqIDYwIC8qIHNlY29uZHMgKi8gKiAxMDAwIC8qIG1zZWMgKi8KKyAgICAgICAgICAgIC8ga1Bvd2VyTG9nU2FtcGxpbmdJbnRlcnZhbE1zKTsKKworICAgIGNvbnN0IGJvb2wgbUlzVXNlckRlYnVnT3JFbmdCdWlsZDsKKyAgICBwb3dlcl9sb2dfdCAqbVBvd2VyTG9nOworICAgIHNpemVfdCBtRnJhbWVTaXplOworfTsKKworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfU1RSRUFNX1BPV0VSX0xPR19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbXBsL1ZlcnNpb25VdGlscy5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9WZXJzaW9uVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjBhNDJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW1wbC9WZXJzaW9uVXRpbHMuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX1ZFUlNJT05fVVRJTFNfSAorCisjaW5jbHVkZSBQQVRIKGFuZHJvaWQvaGFyZHdhcmUvYXVkaW8vRklMRV9WRVJTSU9OL3R5cGVzLmgpCisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjphdWRpbzo6Q1BQX1ZFUlNJT046OlBhcmFtZXRlclZhbHVlOwordXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6YXVkaW86OkNQUF9WRVJTSU9OOjpSZXN1bHQ7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgQ1BQX1ZFUlNJT04geworbmFtZXNwYWNlIHV0aWxzIHsKKworI2lmIE1BSk9SX1ZFUlNJT04gPT0gMgordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENhbGxiYWNrPgorUmV0dXJuPHZvaWQ+IGdldFBhcmFtZXRlcnMoVCYgb2JqZWN0LCBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4gLypjb250ZXh0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4ga2V5cywgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICByZXR1cm4gb2JqZWN0LT5nZXRQYXJhbWV0ZXJzKGtleXMsIGNhbGxiYWNrKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitSZXR1cm48UmVzdWx0PiBzZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IC8qY29udGV4dCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxQYXJhbWV0ZXJWYWx1ZT4ga2V5cykgeworICAgIHJldHVybiBvYmplY3QtPnNldFBhcmFtZXRlcnMoa2V5cyk7Cit9CisjZWxpZiBNQUpPUl9WRVJTSU9OID49IDQKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBDYWxsYmFjaz4KK1JldHVybjx2b2lkPiBnZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoaWRsX3ZlYzxoaWRsX3N0cmluZz4ga2V5cywgQ2FsbGJhY2sgY2FsbGJhY2spIHsKKyAgICByZXR1cm4gb2JqZWN0LT5nZXRQYXJhbWV0ZXJzKGNvbnRleHQsIGtleXMsIGNhbGxiYWNrKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitSZXR1cm48UmVzdWx0PiBzZXRQYXJhbWV0ZXJzKFQmIG9iamVjdCwgaGlkbF92ZWM8UGFyYW1ldGVyVmFsdWU+IGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPFBhcmFtZXRlclZhbHVlPiBrZXlzKSB7CisgICAgcmV0dXJuIG9iamVjdC0+c2V0UGFyYW1ldGVycyhjb250ZXh0LCBrZXlzKTsKK30KKyNlbmRpZgorCit9IC8vIG5hbWVzcGFjZSB1dGlscworfSAvLyBuYW1lc3BhY2UgQ1BQX1ZFUlNJT04KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIEFORFJPSURfSEFSRFdBUkVfVkVSU0lPTl9VVElMU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaAppbmRleCA3ZGU4ZWIzLi4xZTA0YjIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZUhhbEludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlSGFsSW50ZXJmYWNlLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9ERVZJQ0VfSEFMX0lOVEVSRkFDRV9ICiAjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfREVWSUNFX0hBTF9JTlRFUkZBQ0VfSAogCisjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWljcm9waG9uZUluZm8uaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KQEAgLTY5LDcgKzcwLDcgQEAKICAgICAvLyBieSByZWxlYXNpbmcgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIHJldHVybmVkIG9iamVjdC4KICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXRTdHJlYW0oCiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLAogICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCiAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLApAQCAtODQsNiArODUsOCBAQAogICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCiAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqb3V0cHV0RGV2aWNlQWRkcmVzcywKICAgICAgICAgICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiAqaW5TdHJlYW0pID0gMDsKIAogICAgIC8vIFJldHVybnMgd2hldGhlciBjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQuCkBAIC0xMDksNiArMTEyLDExIEBACiAgICAgLy8gTGlzdCBtaWNyb3Bob25lcwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRGV2aWNlRWZmZWN0KAorICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2UsIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVEZXZpY2VFZmZlY3QoCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZSwgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpID0gMDsKIAogICBwcm90ZWN0ZWQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0RldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKaW5kZXggMTRhZjM4NC4uNTA5MTU1OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9EZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2UuaApAQCAtMjAsOSArMjAsMTYgQEAKICNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9EZXZpY2VIYWxJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NsYXNzIERldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2sgOiBwdWJsaWMgUmVmQmFzZQoreworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIG9uTmV3RGV2aWNlc0F2YWlsYWJsZSgpID0gMDsKK307CisKIGNsYXNzIERldmljZXNGYWN0b3J5SGFsSW50ZXJmYWNlIDogcHVibGljIFJlZkJhc2UKIHsKICAgcHVibGljOgpAQCAtMzAsNiArMzcsMTIgQEAKICAgICAvLyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzIHRvIHRoZSByZXR1cm5lZCBvYmplY3QuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuRGV2aWNlKGNvbnN0IGNoYXIgKm5hbWUsIHNwPERldmljZUhhbEludGVyZmFjZT4gKmRldmljZSkgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRIYWxQaWRzKHN0ZDo6dmVjdG9yPHBpZF90PiAqcGlkcykgPSAwOworCisgICAgLy8gU2V0cyBhIERldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2sgdG8gbm90aWZ5IHRoZSBjbGllbnQuCisgICAgLy8gVGhlIGNhbGxiYWNrIGNhbiBiZSBvbmx5IHNldCBvbmNlLgorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Q2FsbGJhY2tPbmNlKHNwPERldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2s+IGNhbGxiYWNrKSA9IDA7CisKICAgICBzdGF0aWMgc3A8RGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGNyZWF0ZSgpOwogCiAgIHByb3RlY3RlZDoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmggYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oCmluZGV4IDkyNjIyYWEuLjAzMTY1YmQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0SGFsSW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RIYWxJbnRlcmZhY2UuaApAQCAtNTUsNiArNTUsOCBAQAogICAgIC8vIFdoZXRoZXIgaXQncyBhIGxvY2FsIGltcGxlbWVudGF0aW9uLgogICAgIHZpcnR1YWwgYm9vbCBpc0xvY2FsKCkgY29uc3QgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCkgPSAwOworCiAgIHByb3RlY3RlZDoKICAgICAvLyBTdWJjbGFzc2VzIGNhbiBub3QgYmUgY29uc3RydWN0ZWQgZGlyZWN0bHkgYnkgY2xpZW50cy4KICAgICBFZmZlY3RIYWxJbnRlcmZhY2UoKSB7fQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oCmluZGV4IDMxNmE0NmMuLjNhNzZmOWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmgKQEAgLTQxLDcgKzQxLDcgQEAKICAgICAvLyBUbyByZWxlYXNlIHRoZSBlZmZlY3QgZW5naW5lLCBpdCBpcyBuZWNlc3NhcnkgdG8gcmVsZWFzZSByZWZlcmVuY2VzCiAgICAgLy8gdG8gdGhlIHJldHVybmVkIGVmZmVjdCBvYmplY3QuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCi0gICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLAorICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgaW9JZCwgaW50MzJfdCBkZXZpY2VJZCwKICAgICAgICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCkgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wRWZmZWN0cyhpbnQgZmQpID0gMDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvRmFjdG9yeUhhbEhpZGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzUzZWQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9GYWN0b3J5SGFsSGlkbC5oCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfRkFDVE9SWV9IQUxfSElETF9ICisjZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfRkFDVE9SWV9IQUxfSElETF9ICisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworbmFtZXNwYWNlIGRldGFpbCB7CisKK3ZvaWQqIGNyZWF0ZVByZWZlcnJlZEltcGwoY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnRlcmZhY2UpOworCit9ICAvLyBuYW1lc3BhY2UgZGV0YWlsCisKKy8qKiBAUmV0dXJuIHRoZSBwcmVmZXJyZWQgYXZhaWxhYmxlIGltcGxlbWVudGF0aW9uIG9yIG51bGxwdHIgaWYgbm9uZSBhcmUgYXZhaWxhYmxlLiAqLwordGVtcGxhdGUgPGNsYXNzIEludGVyZmFjZT4KK3N0YXRpYyBzcDxJbnRlcmZhY2U+IGNyZWF0ZVByZWZlcnJlZEltcGwoY29uc3Qgc3RkOjpzdHJpbmcmIHBhY2thZ2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbnRlcmZhY2UpIHsKKyAgICByZXR1cm4gc3A8SW50ZXJmYWNlPntzdGF0aWNfY2FzdDxJbnRlcmZhY2UqPihkZXRhaWw6OmNyZWF0ZVByZWZlcnJlZEltcGwocGFja2FnZSwgaW50ZXJmYWNlKSl9OworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX0ZBQ1RPUllfSEFMX0hJRExfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaCBiL21lZGlhL2xpYmF1ZGlvaGFsL2luY2x1ZGUvbWVkaWEvYXVkaW9oYWwvU3RyZWFtSGFsSW50ZXJmYWNlLmgKaW5kZXggYzk2OWUyOC4uNmMzYjIxYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9oYWwvaW5jbHVkZS9tZWRpYS9hdWRpb2hhbC9TdHJlYW1IYWxJbnRlcmZhY2UuaAorKysgYi9tZWRpYS9saWJhdWRpb2hhbC9pbmNsdWRlL21lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oCkBAIC0xMDksNiArMTA5LDkgQEAKICAgICAvLyBVc2UgdGhpcyBtZXRob2QgaW4gc2l0dWF0aW9ucyB3aGVyZSBhdWRpbyBtaXhpbmcgaXMgZG9uZSBpbiB0aGUgaGFyZHdhcmUuCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpID0gMDsKIAorICAgIC8vIFNlbGVjdHMgdGhlIGF1ZGlvIHByZXNlbnRhdGlvbiAoaWYgYXZhaWxhYmxlKS4KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpID0gMDsKKwogICAgIC8vIFdyaXRlIGF1ZGlvIGJ1ZmZlciB0byBkcml2ZXIuCiAgICAgdmlydHVhbCBzdGF0dXNfdCB3cml0ZShjb25zdCB2b2lkICpidWZmZXIsIHNpemVfdCBieXRlcywgc2l6ZV90ICp3cml0dGVuKSA9IDA7CiAKQEAgLTE3Niw2ICsxNzksMTIgQEAKICAgICAvLyBHZXQgYWN0aXZlIG1pY3JvcGhvbmVzCiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+ICptaWNyb3Bob25lcykgPSAwOwogCisgICAgLy8gU2V0IGRpcmVjdGlvbiBmb3IgY2FwdHVyZSBwcm9jZXNzaW5nCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QpID0gMDsKKworICAgIC8vIFNldCB6b29tIGZhY3RvciBmb3IgY2FwdHVyZSBzdHJlYW0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSA9IDA7CisKICAgICBzdHJ1Y3QgU2lua01ldGFkYXRhIHsKICAgICAgICAgc3RkOjp2ZWN0b3I8cmVjb3JkX3RyYWNrX21ldGFkYXRhX3Q+IHRyYWNrczsKICAgICB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQW5kcm9pZC5icAppbmRleCA4MTdmYjBiLi5lNzU2YWRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQW5kcm9pZC5icApAQCAtMywxNCArMywxMiBAQAogCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAKKyAgICBoZWFkZXJfbGliczogWyJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIl0sCisKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYXVkaW9oYWwiLAogICAgICAgICAibGliYXVkaW91dGlscyIsCiAgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm5iYWlvIiwKLSAgICAgICAgImxpYm5ibG9nIiwKLSAgICAgICAgImxpYnNvbmljIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCkBAIC0yMSw2ICsxOSwyNSBAQAogICAgICAgICAvLyB1bmNvbW1lbnQgdG8gZGlzYWJsZSBORU9OIG9uIGFyY2hpdGVjdHVyZXMgdGhhdCBhY3R1YWxseSBkbyBzdXBwb3J0IE5FT04sIGZvciBiZW5jaG1hcmtpbmcKICAgICAgICAgLy8gIi1EVVNFX05FT049ZmFsc2UiLAogICAgIF0sCisKKyAgICBhcmNoOiB7CisgICAgICAgIHg4NjogeworICAgICAgICAgICAgYXZ4MjogeworICAgICAgICAgICAgICAgIGNmbGFnczogWworICAgICAgICAgICAgICAgICAgICAiLW1hdngyIiwKKyAgICAgICAgICAgICAgICAgICAgIi1tZm1hIiwKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgfSwKKyAgICAgICAgfSwKKyAgICAgICAgeDg2XzY0OiB7CisgICAgICAgICAgICBhdngyOiB7CisgICAgICAgICAgICAgICAgY2ZsYWdzOiBbCisgICAgICAgICAgICAgICAgICAgICItbWF2eDIiLAorICAgICAgICAgICAgICAgICAgICAiLW1mbWEiLAorICAgICAgICAgICAgICAgIF0sCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgIH0sCiB9CiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKQEAgLTI4LDE4ICs0NSwzMiBAQAogICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvcHJvY2Vzc2luZ19kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWworICAgICAgICAiQXVkaW9NaXhlci5jcHAiLAogICAgICAgICAiQnVmZmVyUHJvdmlkZXJzLmNwcCIsCiAgICAgICAgICJSZWNvcmRCdWZmZXJDb252ZXJ0ZXIuY3BwIiwKICAgICBdLAotICAgIHdob2xlX3N0YXRpY19saWJzOiBbImxpYmF1ZGlvcHJvY2Vzc2luZ19hcm0iXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGlibWVkaWFfaGVhZGVycyIKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvaGFsIiwKKyAgICAgICAgImxpYnNvbmljIiwKKyAgICAgICAgImxpYnZpYnJhdG9yIiwKKyAgICBdLAorCisgICAgd2hvbGVfc3RhdGljX2xpYnM6IFsibGliYXVkaW9wcm9jZXNzaW5nX2Jhc2UiXSwKIH0KIAogY2NfbGlicmFyeV9zdGF0aWMgewotICAgIG5hbWU6ICJsaWJhdWRpb3Byb2Nlc3NpbmdfYXJtIiwKKyAgICBuYW1lOiAibGliYXVkaW9wcm9jZXNzaW5nX2Jhc2UiLAogICAgIGRlZmF1bHRzOiBbImxpYmF1ZGlvcHJvY2Vzc2luZ19kZWZhdWx0cyJdLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAKICAgICBzcmNzOiBbCi0gICAgICAgICJBdWRpb01peGVyLmNwcCIsCisgICAgICAgICJBdWRpb01peGVyQmFzZS5jcHAiLAogICAgICAgICAiQXVkaW9SZXNhbXBsZXIuY3BwIiwKICAgICAgICAgIkF1ZGlvUmVzYW1wbGVyQ3ViaWMuY3BwIiwKICAgICAgICAgIkF1ZGlvUmVzYW1wbGVyU2luYy5jcHAiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvTWl4ZXIuY3BwCmluZGV4IGYzZWE4MjYuLmMwYjExYTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlci5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9NaXhlciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAorI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3RyaW5nLmg+CiAjaW5jbHVkZSA8c3RkbGliLmg+CkBAIC0yNyw5ICsyOCw2IEBACiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9EZWJ1Zy5oPgotCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CkBAIC01OCwxMjMgKzU2LDE1IEBACiAjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUgKDApCiAjZW5kaWYKIAotI2lmbmRlZiBBUlJBWV9TSVpFCi0jZGVmaW5lIEFSUkFZX1NJWkUoeCkgKHNpemVvZih4KS9zaXplb2YoKHgpWzBdKSkKLSNlbmRpZgotCi0vLyBTZXQga1VzZU5ld01peGVyIHRvIHRydWUgdG8gdXNlIHRoZSBuZXcgbWl4ZXIgZW5naW5lIGFsd2F5cy4gT3RoZXJ3aXNlIHRoZQotLy8gb3JpZ2luYWwgY29kZSB3aWxsIGJlIHVzZWQgZm9yIHN0ZXJlbyBzaW5rcywgdGhlIG5ldyBtaXhlciBmb3IgbXVsdGljaGFubmVsLgotc3RhdGljIGNvbnN0ZXhwciBib29sIGtVc2VOZXdNaXhlciA9IHRydWU7Ci0KLS8vIFNldCBrVXNlRmxvYXQgdG8gdHJ1ZSB0byBhbGxvdyBmbG9hdGluZyBpbnB1dCBpbnRvIHRoZSBtaXhlciBlbmdpbmUuCi0vLyBJZiBrVXNlTmV3TWl4ZXIgaXMgZmFsc2UsIHRoaXMgaXMgaWdub3JlZCBvciBtYXkgYmUgb3ZlcnJpZGRlbiBpbnRlcm5hbGx5Ci0vLyBiZWNhdXNlIG9mIGRvd25taXgvdXBtaXggc3VwcG9ydC4KLXN0YXRpYyBjb25zdGV4cHIgYm9vbCBrVXNlRmxvYXQgPSB0cnVlOwotCi0jaWZkZWYgRkxPQVRfQVVYCi11c2luZyBUWVBFX0FVWCA9IGZsb2F0Owotc3RhdGljX2Fzc2VydChrVXNlTmV3TWl4ZXIgJiYga1VzZUZsb2F0LAotICAgICAgICAia1VzZU5ld01peGVyIGFuZCBrVXNlRmxvYXQgbXVzdCBiZSB0cnVlIGZvciBGTE9BVF9BVVggb3B0aW9uIik7Ci0jZWxzZQotdXNpbmcgVFlQRV9BVVggPSBpbnQzMl90OyAvLyBxNC4yNwotI2VuZGlmCi0KIC8vIFNldCB0byBkZWZhdWx0IGNvcHkgYnVmZmVyIHNpemUgaW4gZnJhbWVzIGZvciBpbnB1dCBwcm9jZXNzaW5nLgotc3RhdGljIGNvbnN0IHNpemVfdCBrQ29weUJ1ZmZlckZyYW1lQ291bnQgPSAyNTY7CitzdGF0aWMgY29uc3RleHByIHNpemVfdCBrQ29weUJ1ZmZlckZyYW1lQ291bnQgPSAyNTY7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi1zdGF0aWMgaW5saW5lIGF1ZGlvX2Zvcm1hdF90IHNlbGVjdE1peGVySW5Gb3JtYXQoYXVkaW9fZm9ybWF0X3QgaW5wdXRGb3JtYXQgX191bnVzZWQpIHsKLSAgICByZXR1cm4ga1VzZUZsb2F0ICYmIGtVc2VOZXdNaXhlciA/IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQgOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKLX0KLQotc3RhdHVzX3QgQXVkaW9NaXhlcjo6Y3JlYXRlKAotICAgICAgICBpbnQgbmFtZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IHNlc3Npb25JZCkKLXsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGV4aXN0cyhuYW1lKSwgIm5hbWUgJWQgYWxyZWFkeSBleGlzdHMiLCBuYW1lKTsKLQotICAgIGlmICghaXNWYWxpZENoYW5uZWxNYXNrKGNoYW5uZWxNYXNrKSkgewotICAgICAgICBBTE9HRSgiJXMgaW52YWxpZCBjaGFubmVsTWFzazogJSN4IiwgX19mdW5jX18sIGNoYW5uZWxNYXNrKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgaWYgKCFpc1ZhbGlkRm9ybWF0KGZvcm1hdCkpIHsKLSAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgZm9ybWF0OiAlI3giLCBfX2Z1bmNfXywgZm9ybWF0KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBhdXRvIHQgPSBzdGQ6Om1ha2Vfc2hhcmVkPFRyYWNrPigpOwotICAgIHsKLSAgICAgICAgLy8gVE9ETzogbW92ZSBpbml0aWFsaXphdGlvbiB0byB0aGUgVHJhY2sgY29uc3RydWN0b3IuCi0gICAgICAgIC8vIGFzc3VtZSBkZWZhdWx0IHBhcmFtZXRlcnMgZm9yIHRoZSB0cmFjaywgZXhjZXB0IHdoZXJlIG5vdGVkIGJlbG93Ci0gICAgICAgIHQtPm5lZWRzID0gMDsKLQotICAgICAgICAvLyBJbnRlZ2VyIHZvbHVtZS4KLSAgICAgICAgLy8gQ3VycmVudGx5IGludGVnZXIgdm9sdW1lIGlzIGtlcHQgZm9yIHRoZSBsZWdhY3kgaW50ZWdlciBtaXhlci4KLSAgICAgICAgLy8gV2lsbCBiZSByZW1vdmVkIHdoZW4gdGhlIGxlZ2FjeSBtaXhlciBwYXRoIGlzIHJlbW92ZWQuCi0gICAgICAgIHQtPnZvbHVtZVswXSA9IFVOSVRZX0dBSU5fSU5UOwotICAgICAgICB0LT52b2x1bWVbMV0gPSBVTklUWV9HQUlOX0lOVDsKLSAgICAgICAgdC0+cHJldlZvbHVtZVswXSA9IFVOSVRZX0dBSU5fSU5UIDw8IDE2OwotICAgICAgICB0LT5wcmV2Vm9sdW1lWzFdID0gVU5JVFlfR0FJTl9JTlQgPDwgMTY7Ci0gICAgICAgIHQtPnZvbHVtZUluY1swXSA9IDA7Ci0gICAgICAgIHQtPnZvbHVtZUluY1sxXSA9IDA7Ci0gICAgICAgIHQtPmF1eExldmVsID0gMDsKLSAgICAgICAgdC0+YXV4SW5jID0gMDsKLSAgICAgICAgdC0+cHJldkF1eExldmVsID0gMDsKLQotICAgICAgICAvLyBGbG9hdGluZyBwb2ludCB2b2x1bWUuCi0gICAgICAgIHQtPm1Wb2x1bWVbMF0gPSBVTklUWV9HQUlOX0ZMT0FUOwotICAgICAgICB0LT5tVm9sdW1lWzFdID0gVU5JVFlfR0FJTl9GTE9BVDsKLSAgICAgICAgdC0+bVByZXZWb2x1bWVbMF0gPSBVTklUWV9HQUlOX0ZMT0FUOwotICAgICAgICB0LT5tUHJldlZvbHVtZVsxXSA9IFVOSVRZX0dBSU5fRkxPQVQ7Ci0gICAgICAgIHQtPm1Wb2x1bWVJbmNbMF0gPSAwLjsKLSAgICAgICAgdC0+bVZvbHVtZUluY1sxXSA9IDAuOwotICAgICAgICB0LT5tQXV4TGV2ZWwgPSAwLjsKLSAgICAgICAgdC0+bUF1eEluYyA9IDAuOwotICAgICAgICB0LT5tUHJldkF1eExldmVsID0gMC47Ci0KLSAgICAgICAgLy8gbm8gaW5pdGlhbGl6YXRpb24gbmVlZGVkCi0gICAgICAgIC8vIHQtPmZyYW1lQ291bnQKLSAgICAgICAgdC0+Y2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKLSAgICAgICAgdC0+ZW5hYmxlZCA9IGZhbHNlOwotICAgICAgICBBTE9HVl9JRihhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoY2hhbm5lbE1hc2spICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKLSAgICAgICAgICAgICAgICAiTm9uLXN0ZXJlbyBjaGFubmVsIG1hc2s6ICVkXG4iLCBjaGFubmVsTWFzayk7Ci0gICAgICAgIHQtPmNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7Ci0gICAgICAgIHQtPnNlc3Npb25JZCA9IHNlc3Npb25JZDsKLSAgICAgICAgLy8gc2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgQXVkaW9CdWZmZXJQcm92aWRlciAqKSBpcyByZXF1aXJlZCBiZWZvcmUgZW5hYmxlKG5hbWUpCi0gICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKLSAgICAgICAgdC0+YnVmZmVyLnJhdyA9IE5VTEw7Ci0gICAgICAgIC8vIG5vIGluaXRpYWxpemF0aW9uIG5lZWRlZAotICAgICAgICAvLyB0LT5idWZmZXIuZnJhbWVDb3VudAotICAgICAgICB0LT5ob29rID0gTlVMTDsKLSAgICAgICAgdC0+bUluID0gTlVMTDsKLSAgICAgICAgdC0+c2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlOwotICAgICAgICAvLyBzZXRQYXJhbWV0ZXIobmFtZSwgVFJBQ0ssIE1BSU5fQlVGRkVSLCBtaXhCdWZmZXIpIGlzIHJlcXVpcmVkIGJlZm9yZSBlbmFibGUobmFtZSkKLSAgICAgICAgdC0+bWFpbkJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIHQtPmF1eEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgIHQtPm1JbnB1dEJ1ZmZlclByb3ZpZGVyID0gTlVMTDsKLSAgICAgICAgdC0+bU1peGVyRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0gICAgICAgIHQtPm1Gb3JtYXQgPSBmb3JtYXQ7Ci0gICAgICAgIHQtPm1NaXhlckluRm9ybWF0ID0gc2VsZWN0TWl4ZXJJbkZvcm1hdChmb3JtYXQpOwotICAgICAgICB0LT5tRG93bm1peFJlcXVpcmVzRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7IC8vIG5vIGZvcm1hdCByZXF1aXJlZAotICAgICAgICB0LT5tTWl4ZXJDaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfbWFza19mcm9tX3JlcHJlc2VudGF0aW9uX2FuZF9iaXRzKAotICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT04sIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7Ci0gICAgICAgIHQtPm1NaXhlckNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayh0LT5tTWl4ZXJDaGFubmVsTWFzayk7Ci0gICAgICAgIHQtPm1QbGF5YmFja1JhdGUgPSBBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQ7Ci0gICAgICAgIC8vIENoZWNrIHRoZSBkb3dubWl4aW5nIChvciB1cG1peGluZykgcmVxdWlyZW1lbnRzLgotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSB0LT5wcmVwYXJlRm9yRG93bm1peCgpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQXVkaW9NaXhlcjo6Z2V0VHJhY2tOYW1lIGludmFsaWQgY2hhbm5lbE1hc2sgKCUjeCkiLCBjaGFubmVsTWFzayk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIC8vIHByZXBhcmVGb3JEb3dubWl4KCkgbWF5IGNoYW5nZSBtRG93bm1peFJlcXVpcmVzRm9ybWF0Ci0gICAgICAgIEFMT0dWVigibU1peGVyRm9ybWF0OiUjeCAgbU1peGVySW5Gb3JtYXQ6JSN4XG4iLCB0LT5tTWl4ZXJGb3JtYXQsIHQtPm1NaXhlckluRm9ybWF0KTsKLSAgICAgICAgdC0+cHJlcGFyZUZvclJlZm9ybWF0KCk7Ci0KLSAgICAgICAgbVRyYWNrc1tuYW1lXSA9IHQ7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Citib29sIEF1ZGlvTWl4ZXI6OmlzVmFsaWRDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaykgY29uc3QgeworICAgIHJldHVybiBhdWRpb19jaGFubmVsX21hc2tfaXNfdmFsaWQoY2hhbm5lbE1hc2spOyAvLyB0aGUgUmVtaXhCdWZmZXJQcm92aWRlciBpcyBmbGV4aWJsZS4KIH0KIAogLy8gQ2FsbGVkIHdoZW4gY2hhbm5lbCBtYXNrcyBoYXZlIGNoYW5nZWQgZm9yIGEgdHJhY2sgbmFtZQpAQCAtMTgzLDE1ICs3MywyMiBAQAogYm9vbCBBdWRpb01peGVyOjpzZXRDaGFubmVsTWFza3MoaW50IG5hbWUsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHRyYWNrQ2hhbm5lbE1hc2ssIGF1ZGlvX2NoYW5uZWxfbWFza190IG1peGVyQ2hhbm5lbE1hc2spIHsKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFleGlzdHMobmFtZSksICJpbnZhbGlkIG5hbWU6ICVkIiwgbmFtZSk7Ci0gICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdHJhY2sgPSBtVHJhY2tzW25hbWVdOworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnRyYWNrID0gZ2V0VHJhY2sobmFtZSk7CiAKLSAgICBpZiAodHJhY2tDaGFubmVsTWFzayA9PSB0cmFjay0+Y2hhbm5lbE1hc2sKLSAgICAgICAgICAgICYmIG1peGVyQ2hhbm5lbE1hc2sgPT0gdHJhY2stPm1NaXhlckNoYW5uZWxNYXNrKSB7CisgICAgaWYgKHRyYWNrQ2hhbm5lbE1hc2sgPT0gKHRyYWNrLT5jaGFubmVsTWFzayB8IHRyYWNrLT5tSGFwdGljQ2hhbm5lbE1hc2spCisgICAgICAgICAgICAmJiBtaXhlckNoYW5uZWxNYXNrID09ICh0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2sgfCB0cmFjay0+bU1peGVySGFwdGljQ2hhbm5lbE1hc2spKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIG5vIG5lZWQgdG8gY2hhbmdlCiAgICAgfQorICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IGhhcHRpY0NoYW5uZWxNYXNrID0gdHJhY2tDaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICB0cmFja0NoYW5uZWxNYXNrICY9IH5BVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7CisgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWl4ZXJIYXB0aWNDaGFubmVsTWFzayA9IG1peGVyQ2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7CisgICAgbWl4ZXJDaGFubmVsTWFzayAmPSB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMOwogICAgIC8vIGFsd2F5cyByZWNvbXB1dGUgZm9yIGJvdGggY2hhbm5lbCBtYXNrcyBldmVuIGlmIG9ubHkgb25lIGhhcyBjaGFuZ2VkLgogICAgIGNvbnN0IHVpbnQzMl90IHRyYWNrQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHRyYWNrQ2hhbm5lbE1hc2spOwogICAgIGNvbnN0IHVpbnQzMl90IG1peGVyQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1peGVyQ2hhbm5lbE1hc2spOworICAgIGNvbnN0IHVpbnQzMl90IGhhcHRpY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhoYXB0aWNDaGFubmVsTWFzayk7CisgICAgY29uc3QgdWludDMyX3QgbWl4ZXJIYXB0aWNDaGFubmVsQ291bnQgPQorICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1peGVySGFwdGljQ2hhbm5lbE1hc2spOwogCiAgICAgQUxPR19BU1NFUlQoKHRyYWNrQ2hhbm5lbENvdW50IDw9IE1BWF9OVU1fQ0hBTk5FTFNfVE9fRE9XTk1JWCkKICAgICAgICAgICAgICYmIHRyYWNrQ2hhbm5lbENvdW50CkBAIC0yMDAsNiArOTcsMjQgQEAKICAgICB0cmFjay0+Y2hhbm5lbENvdW50ID0gdHJhY2tDaGFubmVsQ291bnQ7CiAgICAgdHJhY2stPm1NaXhlckNoYW5uZWxNYXNrID0gbWl4ZXJDaGFubmVsTWFzazsKICAgICB0cmFjay0+bU1peGVyQ2hhbm5lbENvdW50ID0gbWl4ZXJDaGFubmVsQ291bnQ7CisgICAgdHJhY2stPm1IYXB0aWNDaGFubmVsTWFzayA9IGhhcHRpY0NoYW5uZWxNYXNrOworICAgIHRyYWNrLT5tSGFwdGljQ2hhbm5lbENvdW50ID0gaGFwdGljQ2hhbm5lbENvdW50OworICAgIHRyYWNrLT5tTWl4ZXJIYXB0aWNDaGFubmVsTWFzayA9IG1peGVySGFwdGljQ2hhbm5lbE1hc2s7CisgICAgdHJhY2stPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudCA9IG1peGVySGFwdGljQ2hhbm5lbENvdW50OworCisgICAgaWYgKHRyYWNrLT5tSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICB0cmFjay0+bUFkanVzdEluQ2hhbm5lbENvdW50ID0gdHJhY2stPmNoYW5uZWxDb3VudCArIHRyYWNrLT5tSGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICB0cmFjay0+bUFkanVzdE91dENoYW5uZWxDb3VudCA9IHRyYWNrLT5jaGFubmVsQ291bnQgKyB0cmFjay0+bU1peGVySGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICB0cmFjay0+bUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQgPSB0cmFjay0+bUFkanVzdE91dENoYW5uZWxDb3VudDsKKyAgICAgICAgdHJhY2stPm1BZGp1c3ROb25EZXN0cnVjdGl2ZU91dENoYW5uZWxDb3VudCA9IHRyYWNrLT5jaGFubmVsQ291bnQ7CisgICAgICAgIHRyYWNrLT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscyA9IHRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkOworICAgIH0gZWxzZSB7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0SW5DaGFubmVsQ291bnQgPSAwOworICAgICAgICB0cmFjay0+bUFkanVzdE91dENoYW5uZWxDb3VudCA9IDA7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudCA9IDA7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQgPSAwOworICAgICAgICB0cmFjay0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMgPSBmYWxzZTsKKyAgICB9CiAKICAgICAvLyBjaGFubmVsIG1hc2tzIGhhdmUgY2hhbmdlZCwgZG9lcyB0aGlzIHRyYWNrIG5lZWQgYSBkb3dubWl4ZXI/CiAgICAgLy8gdXBkYXRlIHRvIHRyeSB1c2luZyBvdXIgZGVzaXJlZCBmb3JtYXQgKGlmIHdlIGFyZW4ndCBhbHJlYWR5IHVzaW5nIGl0KQpAQCAtMjEyLDE0ICsxMjcsMTEgQEAKICAgICAvLyBkbyBpdCBhZnRlciBkb3dubWl4IHNpbmNlIHRyYWNrIGZvcm1hdCBtYXkgY2hhbmdlIQogICAgIHRyYWNrLT5wcmVwYXJlRm9yUmVmb3JtYXQoKTsKIAotICAgIGlmICh0cmFjay0+bVJlc2FtcGxlci5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIC8vIHJlc2FtcGxlciBjaGFubmVscyBtYXkgaGF2ZSBjaGFuZ2VkLgotICAgICAgICBjb25zdCB1aW50MzJfdCByZXNldFRvU2FtcGxlUmF0ZSA9IHRyYWNrLT5zYW1wbGVSYXRlOwotICAgICAgICB0cmFjay0+bVJlc2FtcGxlci5yZXNldChudWxscHRyKTsKLSAgICAgICAgdHJhY2stPnNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsgLy8gd2l0aG91dCByZXNhbXBsZXIsIHRyYWNrIHJhdGUgaXMgZGV2aWNlIHNhbXBsZSByYXRlLgotICAgICAgICAvLyByZWNyZWF0ZSB0aGUgcmVzYW1wbGVyIHdpdGggdXBkYXRlZCBmb3JtYXQsIGNoYW5uZWxzLCBzYXZlZCBzYW1wbGVSYXRlLgotICAgICAgICB0cmFjay0+c2V0UmVzYW1wbGVyKHJlc2V0VG9TYW1wbGVSYXRlIC8qdHJhY2tTYW1wbGVSYXRlKi8sIG1TYW1wbGVSYXRlIC8qZGV2U2FtcGxlUmF0ZSovKTsKLSAgICB9CisgICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKKyAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CisKKyAgICAvLyBSZXNhbXBsZXIgY2hhbm5lbHMgbWF5IGhhdmUgY2hhbmdlZC4KKyAgICB0cmFjay0+cmVjcmVhdGVSZXNhbXBsZXIobVNhbXBsZVJhdGUpOwogICAgIHJldHVybiB0cnVlOwogfQogCkBAIC0yNjAsMTQgKzE3MiwxOSBAQAogICAgIGlmIChhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKGNoYW5uZWxNYXNrKQogICAgICAgICAgICAgICAgID09IEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT04KICAgICAgICAgICAgICYmIERvd25taXhlckJ1ZmZlclByb3ZpZGVyOjppc011bHRpY2hhbm5lbENhcGFibGUoKSkgewotICAgICAgICBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIucmVzZXQobmV3IERvd25taXhlckJ1ZmZlclByb3ZpZGVyKGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIG1NaXhlckNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIC8qIFRPRE86IHVzZSBtTWl4ZXJJbkZvcm1hdCwgbm93IG9ubHkgUENNIDE2ICovLAotICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIHNlc3Npb25JZCwga0NvcHlCdWZmZXJGcmFtZUNvdW50KSk7Ci0gICAgICAgIGlmIChzdGF0aWNfY2FzdDxEb3dubWl4ZXJCdWZmZXJQcm92aWRlciAqPihtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIuZ2V0KCkpLT5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgIG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsgLy8gUENNIDE2IGJpdCByZXF1aXJlZCBmb3IgZG93bm1peAotICAgICAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKworICAgICAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGEgZmxvYXQgb3IgaW50MTYgZG93bm1peGVyLCBpbiB0aGF0IG9yZGVyLgorICAgICAgICBmb3IgKGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA6IHsgQVVESU9fRk9STUFUX1BDTV9GTE9BVCwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgfSkgeworICAgICAgICAgICAgbURvd25taXhlckJ1ZmZlclByb3ZpZGVyLnJlc2V0KG5ldyBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIG1NaXhlckNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIHNlc3Npb25JZCwga0NvcHlCdWZmZXJGcmFtZUNvdW50KSk7CisgICAgICAgICAgICBpZiAoc3RhdGljX2Nhc3Q8RG93bm1peGVyQnVmZmVyUHJvdmlkZXIgKj4obURvd25taXhlckJ1ZmZlclByb3ZpZGVyLmdldCgpKQorICAgICAgICAgICAgICAgICAgICAtPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgICAgIG1Eb3dubWl4UmVxdWlyZXNGb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgICAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgLy8gbURvd25taXhlckJ1ZmZlclByb3ZpZGVyIHJlc2V0IGJlbG93LgogICAgIH0KQEAgLTMzNSw5ICsyNTIsODIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3ZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OnVucHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCkKK3sKKyAgICBBTE9HVigiQVVESU9NSVhFUjo6dW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMiKTsKKyAgICBpZiAobUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5yZXNldChudWxscHRyKTsKKyAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvTWl4ZXI6OlRyYWNrOjpwcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKQoreworICAgIEFMT0dWKCJBdWRpb01peGVyOjpwcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoJXApIHdpdGggaW5DaGFubmVsQ291bnQ6ICV1LCBvdXRDaGFubmVsQ291bnQ6ICV1IiwKKyAgICAgICAgICAgIHRoaXMsIG1BZGp1c3RJbkNoYW5uZWxDb3VudCwgbUFkanVzdE91dENoYW5uZWxDb3VudCk7CisgICAgdW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHMoKTsKKyAgICBpZiAobUFkanVzdEluQ2hhbm5lbENvdW50ICE9IG1BZGp1c3RPdXRDaGFubmVsQ291bnQpIHsKKyAgICAgICAgbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIucmVzZXQobmV3IEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgbUZvcm1hdCwgbUFkanVzdEluQ2hhbm5lbENvdW50LCBtQWRqdXN0T3V0Q2hhbm5lbENvdW50LCBrQ29weUJ1ZmZlckZyYW1lQ291bnQpKTsKKyAgICAgICAgcmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjp1bnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKCkKK3sKKyAgICBBTE9HVigiQVVESU9NSVhFUjo6dW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZSIpOworICAgIGlmIChtQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBtQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIucmVzZXQobnVsbHB0cik7CisgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb01peGVyOjpUcmFjazo6cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUoc2l6ZV90IGZyYW1lcykKK3sKKyAgICBBTE9HVigiQXVkaW9NaXhlcjo6cHJlcGFyZUZvckFkanVzdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmUoJXApIHdpdGggaW5DaGFubmVsQ291bnQ6ICV1LCAiCisgICAgICAgICAgIm91dENoYW5uZWxDb3VudDogJXUsIGtlZXBDb250cmFjdGVkQ2hhbm5lbHM6ICVkIiwKKyAgICAgICAgICAgIHRoaXMsIG1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50LCBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICBtS2VlcENvbnRyYWN0ZWRDaGFubmVscyk7CisgICAgdW5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZSgpOworICAgIGlmIChtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVJbkNoYW5uZWxDb3VudCAhPSBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQpIHsKKyAgICAgICAgdWludDhfdCogYnVmZmVyID0gbUtlZXBDb250cmFjdGVkQ2hhbm5lbHMKKyAgICAgICAgICAgICAgICA/ICh1aW50OF90KiltYWluQnVmZmVyICsgZnJhbWVzICogYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVyQ2hhbm5lbENvdW50LCBtTWl4ZXJGb3JtYXQpCisgICAgICAgICAgICAgICAgOiBOVUxMOworICAgICAgICBtQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIucmVzZXQoCisgICAgICAgICAgICAgICAgbmV3IEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoCisgICAgICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgbUFkanVzdE5vbkRlc3RydWN0aXZlSW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBtQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBtS2VlcENvbnRyYWN0ZWRDaGFubmVscyA/IG1NaXhlckZvcm1hdCA6IEFVRElPX0ZPUk1BVF9JTlZBTElELAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyKSk7CisgICAgICAgIHJlY29uZmlndXJlQnVmZmVyUHJvdmlkZXJzKCk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBBdWRpb01peGVyOjpUcmFjazo6Y2xlYXJDb250cmFjdGVkQnVmZmVyKCkKK3sKKyAgICBpZiAobUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgc3RhdGljX2Nhc3Q8QWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcio+KAorICAgICAgICAgICAgICAgIG1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci5nZXQoKSktPmNsZWFyQ29udHJhY3RlZEZyYW1lcygpOworICAgIH0KK30KKwogdm9pZCBBdWRpb01peGVyOjpUcmFjazo6cmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKQogeworICAgIC8vIGNvbmZpZ3VyZSBmcm9tIHVwc3RyZWFtIHRvIGRvd25zdHJlYW0gYnVmZmVyIHByb3ZpZGVycy4KICAgICBidWZmZXJQcm92aWRlciA9IG1JbnB1dEJ1ZmZlclByb3ZpZGVyOworICAgIGlmIChtQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIG1BZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyLT5zZXRCdWZmZXJQcm92aWRlcihidWZmZXJQcm92aWRlcik7CisgICAgICAgIGJ1ZmZlclByb3ZpZGVyID0gbUFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIuZ2V0KCk7CisgICAgfQorICAgIGlmIChtQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBtQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXItPnNldEJ1ZmZlclByb3ZpZGVyKGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgYnVmZmVyUHJvdmlkZXIgPSBtQ29udHJhY3RDaGFubmVsc05vbkRlc3RydWN0aXZlQnVmZmVyUHJvdmlkZXIuZ2V0KCk7CisgICAgfQogICAgIGlmIChtUmVmb3JtYXRCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIG1SZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5zZXRCdWZmZXJQcm92aWRlcihidWZmZXJQcm92aWRlcik7CiAgICAgICAgIGJ1ZmZlclByb3ZpZGVyID0gbVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCk7CkBAIC0zNTYsMTcxICszNDYsMTAgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9NaXhlcjo6ZGVzdHJveShpbnQgbmFtZSkKLXsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFleGlzdHMobmFtZSksICJpbnZhbGlkIG5hbWU6ICVkIiwgbmFtZSk7Ci0gICAgQUxPR1YoImRlbGV0ZVRyYWNrTmFtZSglZCkiLCBuYW1lKTsKLQotICAgIGlmIChtVHJhY2tzW25hbWVdLT5lbmFibGVkKSB7Ci0gICAgICAgIGludmFsaWRhdGUoKTsKLSAgICB9Ci0gICAgbVRyYWNrcy5lcmFzZShuYW1lKTsgLy8gZGVhbGxvY2F0ZSB0cmFjawotfQotCi12b2lkIEF1ZGlvTWl4ZXI6OmVuYWJsZShpbnQgbmFtZSkKLXsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFleGlzdHMobmFtZSksICJpbnZhbGlkIG5hbWU6ICVkIiwgbmFtZSk7Ci0gICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdHJhY2sgPSBtVHJhY2tzW25hbWVdOwotCi0gICAgaWYgKCF0cmFjay0+ZW5hYmxlZCkgewotICAgICAgICB0cmFjay0+ZW5hYmxlZCA9IHRydWU7Ci0gICAgICAgIEFMT0dWKCJlbmFibGUoJWQpIiwgbmFtZSk7Ci0gICAgICAgIGludmFsaWRhdGUoKTsKLSAgICB9Ci19Ci0KLXZvaWQgQXVkaW9NaXhlcjo6ZGlzYWJsZShpbnQgbmFtZSkKLXsKLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFleGlzdHMobmFtZSksICJpbnZhbGlkIG5hbWU6ICVkIiwgbmFtZSk7Ci0gICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdHJhY2sgPSBtVHJhY2tzW25hbWVdOwotCi0gICAgaWYgKHRyYWNrLT5lbmFibGVkKSB7Ci0gICAgICAgIHRyYWNrLT5lbmFibGVkID0gZmFsc2U7Ci0gICAgICAgIEFMT0dWKCJkaXNhYmxlKCVkKSIsIG5hbWUpOwotICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgfQotfQotCi0vKiBTZXRzIHRoZSB2b2x1bWUgcmFtcCB2YXJpYWJsZXMgZm9yIHRoZSBBdWRpb01peGVyLgotICoKLSAqIFRoZSB2b2x1bWUgcmFtcCB2YXJpYWJsZXMgYXJlIHVzZWQgdG8gdHJhbnNpdGlvbiBmcm9tIHRoZSBwcmV2aW91cwotICogdm9sdW1lIHRvIHRoZSBzZXQgdm9sdW1lLiAgcmFtcCBjb250cm9scyB0aGUgZHVyYXRpb24gb2YgdGhlIHRyYW5zaXRpb24uCi0gKiBJdHMgdmFsdWUgaXMgdHlwaWNhbGx5IG9uZSBzdGF0ZSBmcmFtZWNvdW50IHBlcmlvZCwgYnV0IG1heSBhbHNvIGJlIDAsCi0gKiBtZWFuaW5nICJpbW1lZGlhdGUuIgotICoKLSAqIEZJWE1FOiAxKSBWb2x1bWUgcmFtcCBpcyBlbmFibGVkIG9ubHkgaWYgdGhlcmUgaXMgYSBub256ZXJvIGludGVnZXIgaW5jcmVtZW50Ci0gKiBldmVuIGlmIHRoZXJlIGlzIGEgbm9uemVybyBmbG9hdGluZyBwb2ludCBpbmNyZW1lbnQgKGluIHRoYXQgY2FzZSwgdGhlIHZvbHVtZQotICogY2hhbmdlIGlzIGltbWVkaWF0ZSkuICBUaGlzIHJlc3RyaWN0aW9uIHNob3VsZCBiZSBjaGFuZ2VkIHdoZW4gdGhlIGxlZ2FjeSBtaXhlcgotICogaXMgcmVtb3ZlZCAoc2VlICMyKS4KLSAqIEZJWE1FOiAyKSBJbnRlZ2VyIHZvbHVtZSB2YXJpYWJsZXMgYXJlIHVzZWQgZm9yIExlZ2FjeSBtaXhpbmcgYW5kIHNob3VsZCBiZSByZW1vdmVkCi0gKiB3aGVuIG5vIGxvbmdlciBuZWVkZWQuCi0gKgotICogQHBhcmFtIG5ld1ZvbHVtZSBzZXQgdm9sdW1lIHRhcmdldCBpbiBmbG9hdGluZyBwb2ludCBbMC4wLCAxLjBdLgotICogQHBhcmFtIHJhbXAgbnVtYmVyIG9mIGZyYW1lcyB0byBpbmNyZW1lbnQgb3Zlci4gaWYgcmFtcCBpcyAwLCB0aGUgdm9sdW1lCi0gKiBzaG91bGQgYmUgc2V0IGltbWVkaWF0ZWx5LiAgQ3VycmVudGx5IHJhbXAgc2hvdWxkIG5vdCBleGNlZWQgNjU1MzUgKGZyYW1lcykuCi0gKiBAcGFyYW0gcEludFNldFZvbHVtZSBwb2ludGVyIHRvIHRoZSBVNC4xMiBpbnRlZ2VyIHRhcmdldCB2b2x1bWUsIHNldCBvbiByZXR1cm4uCi0gKiBAcGFyYW0gcEludFByZXZWb2x1bWUgcG9pbnRlciB0byB0aGUgVTQuMjggaW50ZWdlciBwcmV2aW91cyB2b2x1bWUsIHNldCBvbiByZXR1cm4uCi0gKiBAcGFyYW0gcEludFZvbHVtZUluYyBwb2ludGVyIHRvIHRoZSBVNC4yOCBpbmNyZW1lbnQgcGVyIG91dHB1dCBhdWRpbyBmcmFtZSwgc2V0IG9uIHJldHVybi4KLSAqIEBwYXJhbSBwU2V0Vm9sdW1lIHBvaW50ZXIgdG8gdGhlIGZsb2F0IHRhcmdldCB2b2x1bWUsIHNldCBvbiByZXR1cm4uCi0gKiBAcGFyYW0gcFByZXZWb2x1bWUgcG9pbnRlciB0byB0aGUgZmxvYXQgcHJldmlvdXMgdm9sdW1lLCBzZXQgb24gcmV0dXJuLgotICogQHBhcmFtIHBWb2x1bWVJbmMgcG9pbnRlciB0byB0aGUgZmxvYXQgaW5jcmVtZW50IHBlciBvdXRwdXQgYXVkaW8gZnJhbWUsIHNldCBvbiByZXR1cm4uCi0gKiBAcmV0dXJuIHRydWUgaWYgdGhlIHZvbHVtZSBoYXMgY2hhbmdlZCwgZmFsc2UgaWYgdm9sdW1lIGlzIHNhbWUuCi0gKi8KLXN0YXRpYyBpbmxpbmUgYm9vbCBzZXRWb2x1bWVSYW1wVmFyaWFibGVzKGZsb2F0IG5ld1ZvbHVtZSwgaW50MzJfdCByYW1wLAotICAgICAgICBpbnQxNl90ICpwSW50U2V0Vm9sdW1lLCBpbnQzMl90ICpwSW50UHJldlZvbHVtZSwgaW50MzJfdCAqcEludFZvbHVtZUluYywKLSAgICAgICAgZmxvYXQgKnBTZXRWb2x1bWUsIGZsb2F0ICpwUHJldlZvbHVtZSwgZmxvYXQgKnBWb2x1bWVJbmMpIHsKLSAgICAvLyBjaGVjayBmbG9hdGluZyBwb2ludCB2b2x1bWUgdG8gc2VlIGlmIGl0IGlzIGlkZW50aWNhbCB0byB0aGUgcHJldmlvdXNseQotICAgIC8vIHNldCB2b2x1bWUuCi0gICAgLy8gV2UgZG8gbm90IHVzZSBhIHRvbGVyYW5jZSBoZXJlIChhbmQgcmVqZWN0IGNoYW5nZXMgdG9vIHNtYWxsKQotICAgIC8vIGFzIGl0IG1heSBiZSBjb25mdXNpbmcgdG8gdXNlIGEgZGlmZmVyZW50IHZhbHVlIHRoYW4gdGhlIG9uZSBzZXQuCi0gICAgLy8gSWYgdGhlIHJlc3VsdGluZyB2b2x1bWUgaXMgdG9vIHNtYWxsIHRvIHJhbXAsIGl0IGlzIGEgZGlyZWN0IHNldCBvZiB0aGUgdm9sdW1lLgotICAgIGlmIChuZXdWb2x1bWUgPT0gKnBTZXRWb2x1bWUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAobmV3Vm9sdW1lIDwgMCkgewotICAgICAgICBuZXdWb2x1bWUgPSAwOyAvLyBzaG91bGQgbm90IGhhdmUgbmVnYXRpdmUgdm9sdW1lcwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoZnBjbGFzc2lmeShuZXdWb2x1bWUpKSB7Ci0gICAgICAgIGNhc2UgRlBfU1VCTk9STUFMOgotICAgICAgICBjYXNlIEZQX05BTjoKLSAgICAgICAgICAgIG5ld1ZvbHVtZSA9IDA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGUF9aRVJPOgotICAgICAgICAgICAgYnJlYWs7IC8vIHplcm8gdm9sdW1lIGlzIGZpbmUKLSAgICAgICAgY2FzZSBGUF9JTkZJTklURToKLSAgICAgICAgICAgIC8vIEluZmluaXRlIHZvbHVtZSBjb3VsZCBiZSBoYW5kbGVkIGNvbnNpc3RlbnRseSBzaW5jZQotICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgbWF0aCBzYXR1cmF0ZXMgYXQgaW5maW5pdGllcywKLSAgICAgICAgICAgIC8vIGJ1dCB3ZSBsaW1pdCB2b2x1bWUgdG8gdW5pdHkgZ2FpbiBmbG9hdC4KLSAgICAgICAgICAgIC8vIHJhbXAgPSAwOyBicmVhazsKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICBuZXdWb2x1bWUgPSBBdWRpb01peGVyOjpVTklUWV9HQUlOX0ZMT0FUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRlBfTk9STUFMOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gRmxvYXRpbmcgcG9pbnQgZG9lcyBub3QgaGF2ZSBwcm9ibGVtcyB3aXRoIG92ZXJmbG93IHdyYXAKLSAgICAgICAgICAgIC8vIHRoYXQgaW50ZWdlciBoYXMuICBIb3dldmVyLCB3ZSBsaW1pdCB0aGUgdm9sdW1lIHRvCi0gICAgICAgICAgICAvLyB1bml0eSBnYWluIGhlcmUuCi0gICAgICAgICAgICAvLyBUT0RPOiBSZXZpc2l0IHRoZSB2b2x1bWUgbGltaXRhdGlvbiBhbmQgcGVyaGFwcyBwYXJhbWV0ZXJpemUuCi0gICAgICAgICAgICBpZiAobmV3Vm9sdW1lID4gQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVCkgewotICAgICAgICAgICAgICAgIG5ld1ZvbHVtZSA9IEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHNldCBmbG9hdGluZyBwb2ludCB2b2x1bWUgcmFtcAotICAgIGlmIChyYW1wICE9IDApIHsKLSAgICAgICAgLy8gd2hlbiB0aGUgcmFtcCBjb21wbGV0ZXMsICpwUHJldlZvbHVtZSBpcyBzZXQgdG8gKnBTZXRWb2x1bWUsIHNvIHRoZXJlCi0gICAgICAgIC8vIGlzIG5vIGNvbXB1dGF0aW9uYWwgbWlzbWF0Y2g7IGhlbmNlIGVxdWFsaXR5IGlzIGNoZWNrZWQgaGVyZS4KLSAgICAgICAgQUxPR0RfSUYoKnBQcmV2Vm9sdW1lICE9ICpwU2V0Vm9sdW1lLCAicHJldmlvdXMgZmxvYXQgcmFtcCBoYXNuJ3QgZmluaXNoZWQsIgotICAgICAgICAgICAgICAgICIgcHJldjolZiAgc2V0X3RvOiVmIiwgKnBQcmV2Vm9sdW1lLCAqcFNldFZvbHVtZSk7Ci0gICAgICAgIGNvbnN0IGZsb2F0IGluYyA9IChuZXdWb2x1bWUgLSAqcFByZXZWb2x1bWUpIC8gcmFtcDsgLy8gY291bGQgYmUgaW5mLCBuYW4sIHN1Ym5vcm1hbAotICAgICAgICAvLyBjb3VsZCBiZSBpbmYsIGNhbm5vdCBiZSBuYW4sIHN1Ym5vcm1hbAotICAgICAgICBjb25zdCBmbG9hdCBtYXh2ID0gc3RkOjptYXgobmV3Vm9sdW1lLCAqcFByZXZWb2x1bWUpOwotCi0gICAgICAgIGlmIChpc25vcm1hbChpbmMpIC8vIGluYyBtdXN0IGJlIGEgbm9ybWFsIG51bWJlciAobm8gc3Vibm9ybWFscywgaW5maW5pdGUsIG5hbikKLSAgICAgICAgICAgICAgICAmJiBtYXh2ICsgaW5jICE9IG1heHYpIHsgLy8gaW5jIG11c3QgbWFrZSBmb3J3YXJkIHByb2dyZXNzCi0gICAgICAgICAgICAqcFZvbHVtZUluYyA9IGluYzsKLSAgICAgICAgICAgIC8vIHJhbXAgaXMgc2V0IG5vdy4KLSAgICAgICAgICAgIC8vIE5vdGU6IGlmIG5ld1ZvbHVtZSBpcyAwLCB0aGVuIG5lYXIgdGhlIGVuZCBvZiB0aGUgcmFtcCwKLSAgICAgICAgICAgIC8vIGl0IG1heSBiZSBwb3NzaWJsZSB0aGF0IHRoZSByYW1wZWQgdm9sdW1lIG1heSBiZSBzdWJub3JtYWwgb3IKLSAgICAgICAgICAgIC8vIHRlbXBvcmFyaWx5IG5lZ2F0aXZlIGJ5IGEgc21hbGwgYW1vdW50IG9yIHN1Ym5vcm1hbCBkdWUgdG8gZmxvYXRpbmcKLSAgICAgICAgICAgIC8vIHBvaW50IGluYWNjdXJhY2llcy4KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJhbXAgPSAwOyAvLyByYW1wIG5vdCBhbGxvd2VkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBjb21wdXRlIGFuZCBjaGVjayBpbnRlZ2VyIHZvbHVtZSwgbm8gbmVlZCB0byBjaGVjayBuZWdhdGl2ZSB2YWx1ZXMKLSAgICAvLyBUaGUgaW50ZWdlciB2b2x1bWUgaXMgbGltaXRlZCB0byAidW5pdHlfZ2FpbiIgdG8gYXZvaWQgd3JhcHBpbmcgYW5kIG90aGVyCi0gICAgLy8gYXVkaW8gYXJ0aWZhY3RzLCBzbyBpdCBuZXZlciByZWFjaGVzIHRoZSByYW5nZSBsaW1pdCBvZiBVNC4yOC4KLSAgICAvLyBXZSBzYWZlbHkgdXNlIHNpZ25lZCAxNiBhbmQgMzIgYml0IGludGVnZXJzIGhlcmUuCi0gICAgY29uc3QgZmxvYXQgc2NhbGVkVm9sdW1lID0gbmV3Vm9sdW1lICogQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9JTlQ7IC8vIG5vdCBuZWcsIHN1Ym5vcm1hbCwgbmFuCi0gICAgY29uc3QgaW50MzJfdCBpbnRWb2x1bWUgPSAoc2NhbGVkVm9sdW1lID49IChmbG9hdClBdWRpb01peGVyOjpVTklUWV9HQUlOX0lOVCkgPwotICAgICAgICAgICAgQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9JTlQgOiAoaW50MzJfdClzY2FsZWRWb2x1bWU7Ci0KLSAgICAvLyBzZXQgaW50ZWdlciB2b2x1bWUgcmFtcAotICAgIGlmIChyYW1wICE9IDApIHsKLSAgICAgICAgLy8gaW50ZWdlciB2b2x1bWUgaXMgVTQuMTIgKHRvIHVzZSAxNiBiaXQgbXVsdGlwbGllcyksIGJ1dCByYW1waW5nIHVzZXMgVTQuMjguCi0gICAgICAgIC8vIHdoZW4gdGhlIHJhbXAgY29tcGxldGVzLCAqcEludFByZXZWb2x1bWUgaXMgc2V0IHRvICpwSW50U2V0Vm9sdW1lIDw8IDE2LCBzbyB0aGVyZQotICAgICAgICAvLyBpcyBubyBjb21wdXRhdGlvbmFsIG1pc21hdGNoOyBoZW5jZSBlcXVhbGl0eSBpcyBjaGVja2VkIGhlcmUuCi0gICAgICAgIEFMT0dEX0lGKCpwSW50UHJldlZvbHVtZSAhPSAqcEludFNldFZvbHVtZSA8PCAxNiwgInByZXZpb3VzIGludCByYW1wIGhhc24ndCBmaW5pc2hlZCwiCi0gICAgICAgICAgICAgICAgIiBwcmV2OiVkICBzZXRfdG86JWQiLCAqcEludFByZXZWb2x1bWUsICpwSW50U2V0Vm9sdW1lIDw8IDE2KTsKLSAgICAgICAgY29uc3QgaW50MzJfdCBpbmMgPSAoKGludFZvbHVtZSA8PCAxNikgLSAqcEludFByZXZWb2x1bWUpIC8gcmFtcDsKLQotICAgICAgICBpZiAoaW5jICE9IDApIHsgLy8gaW5jIG11c3QgbWFrZSBmb3J3YXJkIHByb2dyZXNzCi0gICAgICAgICAgICAqcEludFZvbHVtZUluYyA9IGluYzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJhbXAgPSAwOyAvLyByYW1wIG5vdCBhbGxvd2VkCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBpZiBubyByYW1wLCBvciByYW1wIG5vdCBhbGxvd2VkLCB0aGVuIGNsZWFyIGZsb2F0IGFuZCBpbnRlZ2VyIGluY3JlbWVudHMKLSAgICBpZiAocmFtcCA9PSAwKSB7Ci0gICAgICAgICpwVm9sdW1lSW5jID0gMDsKLSAgICAgICAgKnBQcmV2Vm9sdW1lID0gbmV3Vm9sdW1lOwotICAgICAgICAqcEludFZvbHVtZUluYyA9IDA7Ci0gICAgICAgICpwSW50UHJldlZvbHVtZSA9IGludFZvbHVtZSA8PCAxNjsKLSAgICB9Ci0gICAgKnBTZXRWb2x1bWUgPSBuZXdWb2x1bWU7Ci0gICAgKnBJbnRTZXRWb2x1bWUgPSBpbnRWb2x1bWU7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KIHZvaWQgQXVkaW9NaXhlcjo6c2V0UGFyYW1ldGVyKGludCBuYW1lLCBpbnQgdGFyZ2V0LCBpbnQgcGFyYW0sIHZvaWQgKnZhbHVlKQogewogICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWV4aXN0cyhuYW1lKSwgImludmFsaWQgbmFtZTogJWQiLCBuYW1lKTsKLSAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0cmFjayA9IG1UcmFja3NbbmFtZV07CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdHJhY2sgPSBnZXRUcmFjayhuYW1lKTsKIAogICAgIGludCB2YWx1ZUludCA9IHN0YXRpY19jYXN0PGludD4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHZhbHVlKSk7CiAgICAgaW50MzJfdCAqdmFsdWVCdWYgPSByZWludGVycHJldF9jYXN0PGludDMyX3QqPih2YWx1ZSk7CkBAIC01MzIsNyArMzYxLDggQEAKICAgICAgICAgY2FzZSBDSEFOTkVMX01BU0s6IHsKICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NoYW5uZWxfbWFza190IHRyYWNrQ2hhbm5lbE1hc2sgPQogICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190Pih2YWx1ZUludCk7Ci0gICAgICAgICAgICBpZiAoc2V0Q2hhbm5lbE1hc2tzKG5hbWUsIHRyYWNrQ2hhbm5lbE1hc2ssIHRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzaykpIHsKKyAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgdHJhY2tDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgKHRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzayB8IHRyYWNrLT5tTWl4ZXJIYXB0aWNDaGFubmVsTWFzaykpKSB7CiAgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgQ0hBTk5FTF9NQVNLLCAleCkiLCB0cmFja0NoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICB9CkBAIC01NDEsMTUgKzM3MSwxNCBAQAogICAgICAgICAgICAgaWYgKHRyYWNrLT5tYWluQnVmZmVyICE9IHZhbHVlQnVmKSB7CiAgICAgICAgICAgICAgICAgdHJhY2stPm1haW5CdWZmZXIgPSB2YWx1ZUJ1ZjsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNQUlOX0JVRkZFUiwgJXApIiwgdmFsdWVCdWYpOworICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgQVVYX0JVRkZFUjoKLSAgICAgICAgICAgIGlmICh0cmFjay0+YXV4QnVmZmVyICE9IHZhbHVlQnVmKSB7Ci0gICAgICAgICAgICAgICAgdHJhY2stPmF1eEJ1ZmZlciA9IHZhbHVlQnVmOwotICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIEFVWF9CVUZGRVIsICVwKSIsIHZhbHVlQnVmKTsKLSAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBBdWRpb01peGVyQmFzZTo6c2V0UGFyYW1ldGVyKG5hbWUsIHRhcmdldCwgcGFyYW0sIHZhbHVlKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEZPUk1BVDogewogICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KHZhbHVlSW50KTsKQEAgLTU3MCwxNDMgKzM5OSw3MyBAQAogICAgICAgICAgICAgaWYgKHRyYWNrLT5tTWl4ZXJGb3JtYXQgIT0gZm9ybWF0KSB7CiAgICAgICAgICAgICAgICAgdHJhY2stPm1NaXhlckZvcm1hdCA9IGZvcm1hdDsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNSVhFUl9GT1JNQVQsICUjeCkiLCBmb3JtYXQpOworICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMpIHsKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIE1JWEVSX0NIQU5ORUxfTUFTSzogewogICAgICAgICAgICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWl4ZXJDaGFubmVsTWFzayA9CiAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190Pih2YWx1ZUludCk7Ci0gICAgICAgICAgICBpZiAoc2V0Q2hhbm5lbE1hc2tzKG5hbWUsIHRyYWNrLT5jaGFubmVsTWFzaywgbWl4ZXJDaGFubmVsTWFzaykpIHsKKyAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgdHJhY2stPmNoYW5uZWxNYXNrIHwgdHJhY2stPm1IYXB0aWNDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgbWl4ZXJDaGFubmVsTWFzaykpIHsKICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNSVhFUl9DSEFOTkVMX01BU0ssICUjeCkiLCBtaXhlckNoYW5uZWxNYXNrKTsKICAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEhBUFRJQ19FTkFCTEVEOiB7CisgICAgICAgICAgICBjb25zdCBib29sIGhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IHN0YXRpY19jYXN0PGJvb2w+KHZhbHVlSW50KTsKKyAgICAgICAgICAgIGlmICh0cmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCAhPSBoYXB0aWNQbGF5YmFja0VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICB0cmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IGhhcHRpY1BsYXliYWNrRW5hYmxlZDsKKyAgICAgICAgICAgICAgICB0cmFjay0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMgPSBoYXB0aWNQbGF5YmFja0VuYWJsZWQ7CisgICAgICAgICAgICAgICAgdHJhY2stPnByZXBhcmVGb3JBZGp1c3RDaGFubmVsc05vbkRlc3RydWN0aXZlKG1GcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICB0cmFjay0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEhBUFRJQ19JTlRFTlNJVFk6IHsKKyAgICAgICAgICAgIGNvbnN0IGhhcHRpY19pbnRlbnNpdHlfdCBoYXB0aWNJbnRlbnNpdHkgPSBzdGF0aWNfY2FzdDxoYXB0aWNfaW50ZW5zaXR5X3Q+KHZhbHVlSW50KTsKKyAgICAgICAgICAgIGlmICh0cmFjay0+bUhhcHRpY0ludGVuc2l0eSAhPSBoYXB0aWNJbnRlbnNpdHkpIHsKKyAgICAgICAgICAgICAgICB0cmFjay0+bUhhcHRpY0ludGVuc2l0eSA9IGhhcHRpY0ludGVuc2l0eTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJzZXRQYXJhbWV0ZXIgdHJhY2s6IGJhZCBwYXJhbSAlZCIsIHBhcmFtKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgUkVTQU1QTEU6Ci0gICAgICAgIHN3aXRjaCAocGFyYW0pIHsKLSAgICAgICAgY2FzZSBTQU1QTEVfUkFURToKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKHZhbHVlSW50ID4gMCwgImJhZCBzYW1wbGUgcmF0ZSAlZCIsIHZhbHVlSW50KTsKLSAgICAgICAgICAgIGlmICh0cmFjay0+c2V0UmVzYW1wbGVyKHVpbnQzMl90KHZhbHVlSW50KSwgbVNhbXBsZVJhdGUpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihSRVNBTVBMRSwgU0FNUExFX1JBVEUsICV1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCh2YWx1ZUludCkpOwotICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFJFU0VUOgotICAgICAgICAgICAgdHJhY2stPnJlc2V0UmVzYW1wbGVyKCk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSRU1PVkU6Ci0gICAgICAgICAgICB0cmFjay0+bVJlc2FtcGxlci5yZXNldChudWxscHRyKTsKLSAgICAgICAgICAgIHRyYWNrLT5zYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInNldFBhcmFtZXRlciByZXNhbXBsZTogYmFkIHBhcmFtICVkIiwgcGFyYW0pOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCiAgICAgY2FzZSBSQU1QX1ZPTFVNRToKICAgICBjYXNlIFZPTFVNRToKKyAgICAgICAgQXVkaW9NaXhlckJhc2U6OnNldFBhcmFtZXRlcihuYW1lLCB0YXJnZXQsIHBhcmFtLCB2YWx1ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgVElNRVNUUkVUQ0g6CiAgICAgICAgIHN3aXRjaCAocGFyYW0pIHsKLSAgICAgICAgY2FzZSBBVVhMRVZFTDoKLSAgICAgICAgICAgIGlmIChzZXRWb2x1bWVSYW1wVmFyaWFibGVzKCpyZWludGVycHJldF9jYXN0PGZsb2F0Kj4odmFsdWUpLAotICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPT0gUkFNUF9WT0xVTUUgPyBtRnJhbWVDb3VudCA6IDAsCi0gICAgICAgICAgICAgICAgICAgICZ0cmFjay0+YXV4TGV2ZWwsICZ0cmFjay0+cHJldkF1eExldmVsLCAmdHJhY2stPmF1eEluYywKLSAgICAgICAgICAgICAgICAgICAgJnRyYWNrLT5tQXV4TGV2ZWwsICZ0cmFjay0+bVByZXZBdXhMZXZlbCwgJnRyYWNrLT5tQXV4SW5jKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoJXMsIEFVWExFVkVMOiAlMDR4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPT0gVk9MVU1FID8gIlZPTFVNRSIgOiAiUkFNUF9WT0xVTUUiLCB0cmFjay0+YXV4TGV2ZWwpOwotICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgY2FzZSBQTEFZQkFDS19SQVRFOiB7CisgICAgICAgICAgICBjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAqcGxheWJhY2tSYXRlID0KKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBdWRpb1BsYXliYWNrUmF0ZSo+KHZhbHVlKTsKKyAgICAgICAgICAgIEFMT0dXX0lGKCFpc0F1ZGlvUGxheWJhY2tSYXRlVmFsaWQoKnBsYXliYWNrUmF0ZSksCisgICAgICAgICAgICAgICAgICAgICJiYWQgcGFyYW1ldGVycyBzcGVlZCAlZiwgcGl0Y2ggJWYiLAorICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUtPm1TcGVlZCwgcGxheWJhY2tSYXRlLT5tUGl0Y2gpOworICAgICAgICAgICAgaWYgKHRyYWNrLT5zZXRQbGF5YmFja1JhdGUoKnBsYXliYWNrUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRJTUVTVFJFVENILCBQTEFZQkFDS19SQVRFLCBTVFJFVENIX01PREUsIEZBTExCQUNLX01PREUgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiVmICVmICVkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS0+bVNwZWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tSYXRlLT5tUGl0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1JhdGUtPm1TdHJldGNoTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS0+bUZhbGxiYWNrTW9kZSk7CisgICAgICAgICAgICAgICAgLy8gaW52YWxpZGF0ZSgpOyAgKHNob3VsZCBub3QgcmVxdWlyZSByZWNvbmZpZ3VyZSkKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGJyZWFrOwogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaWYgKCh1bnNpZ25lZClwYXJhbSA+PSBWT0xVTUUwICYmICh1bnNpZ25lZClwYXJhbSA8IFZPTFVNRTAgKyBNQVhfTlVNX1ZPTFVNRVMpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2V0Vm9sdW1lUmFtcFZhcmlhYmxlcygqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KHZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9PSBSQU1QX1ZPTFVNRSA/IG1GcmFtZUNvdW50IDogMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFjay0+dm9sdW1lW3BhcmFtIC0gVk9MVU1FMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2stPnByZXZWb2x1bWVbcGFyYW0gLSBWT0xVTUUwXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFjay0+dm9sdW1lSW5jW3BhcmFtIC0gVk9MVU1FMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAmdHJhY2stPm1Wb2x1bWVbcGFyYW0gLSBWT0xVTUUwXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFjay0+bVByZXZWb2x1bWVbcGFyYW0gLSBWT0xVTUUwXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFjay0+bVZvbHVtZUluY1twYXJhbSAtIFZPTFVNRTBdKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKCVzLCBWT0xVTUUlZDogJTA0eCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9PSBWT0xVTUUgPyAiVk9MVU1FIiA6ICJSQU1QX1ZPTFVNRSIsIHBhcmFtIC0gVk9MVU1FMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT52b2x1bWVbcGFyYW0gLSBWT0xVTUUwXSk7Ci0gICAgICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInNldFBhcmFtZXRlciB2b2x1bWU6IGJhZCBwYXJhbSAlZCIsIHBhcmFtKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInNldFBhcmFtZXRlciB0aW1lc3RyZXRjaDogYmFkIHBhcmFtICVkIiwgcGFyYW0pOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRJTUVTVFJFVENIOgotICAgICAgICAgICAgc3dpdGNoIChwYXJhbSkgewotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19SQVRFOiB7Ci0gICAgICAgICAgICAgICAgY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgKnBsYXliYWNrUmF0ZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEF1ZGlvUGxheWJhY2tSYXRlKj4odmFsdWUpOwotICAgICAgICAgICAgICAgIEFMT0dXX0lGKCFpc0F1ZGlvUGxheWJhY2tSYXRlVmFsaWQoKnBsYXliYWNrUmF0ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAiYmFkIHBhcmFtZXRlcnMgc3BlZWQgJWYsIHBpdGNoICVmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS0+bVNwZWVkLCBwbGF5YmFja1JhdGUtPm1QaXRjaCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5zZXRQbGF5YmFja1JhdGUoKnBsYXliYWNrUmF0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUSU1FU1RSRVRDSCwgUExBWUJBQ0tfUkFURSwgU1RSRVRDSF9NT0RFLCBGQUxMQkFDS19NT0RFICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJWYgJWYgJWQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS0+bVNwZWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS0+bVBpdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS0+bVN0cmV0Y2hNb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrUmF0ZS0+bUZhbGxiYWNrTW9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGludmFsaWRhdGUoKTsgIChzaG91bGQgbm90IHJlcXVpcmUgcmVjb25maWd1cmUpCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgic2V0UGFyYW1ldGVyIHRpbWVzdHJldGNoOiBiYWQgcGFyYW0gJWQiLCBwYXJhbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKIAogICAgIGRlZmF1bHQ6CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInNldFBhcmFtZXRlcjogYmFkIHRhcmdldCAlZCIsIHRhcmdldCk7CiAgICAgfQogfQogCi1ib29sIEF1ZGlvTWl4ZXI6OlRyYWNrOjpzZXRSZXNhbXBsZXIodWludDMyX3QgdHJhY2tTYW1wbGVSYXRlLCB1aW50MzJfdCBkZXZTYW1wbGVSYXRlKQotewotICAgIGlmICh0cmFja1NhbXBsZVJhdGUgIT0gZGV2U2FtcGxlUmF0ZSB8fCBtUmVzYW1wbGVyLmdldCgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgaWYgKHNhbXBsZVJhdGUgIT0gdHJhY2tTYW1wbGVSYXRlKSB7Ci0gICAgICAgICAgICBzYW1wbGVSYXRlID0gdHJhY2tTYW1wbGVSYXRlOwotICAgICAgICAgICAgaWYgKG1SZXNhbXBsZXIuZ2V0KCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dWKCJDcmVhdGluZyByZXNhbXBsZXIgZnJvbSB0cmFjayAlZCBIeiB0byBkZXZpY2UgJWQgSHoiLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tTYW1wbGVSYXRlLCBkZXZTYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICAgICBBdWRpb1Jlc2FtcGxlcjo6c3JjX3F1YWxpdHkgcXVhbGl0eTsKLSAgICAgICAgICAgICAgICAvLyBmb3JjZSBsb3dlc3QgcXVhbGl0eSBsZXZlbCByZXNhbXBsZXIgaWYgdXNlIGNhc2UgaXNuJ3QgbXVzaWMgb3IgdmlkZW8KLSAgICAgICAgICAgICAgICAvLyBGSVhNRSB0aGlzIGlzIGZsYXdlZCBmb3IgZHluYW1pYyBzYW1wbGUgcmF0ZXMsIGFzIHdlIGNob29zZSB0aGUgcmVzYW1wbGVyCi0gICAgICAgICAgICAgICAgLy8gcXVhbGl0eSBsZXZlbCBiYXNlZCBvbiB0aGUgaW5pdGlhbCByYXRpbywgYnV0IHRoYXQgY291bGQgY2hhbmdlIGxhdGVyLgotICAgICAgICAgICAgICAgIC8vIFNob3VsZCBoYXZlIGEgd2F5IHRvIGRpc3Rpbmd1aXNoIHRyYWNrcyB3aXRoIHN0YXRpYyByYXRpb3MgdnMuIGR5bmFtaWMgcmF0aW9zLgotICAgICAgICAgICAgICAgIGlmIChpc011c2ljUmF0ZSh0cmFja1NhbXBsZVJhdGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBBdWRpb1Jlc2FtcGxlcjo6REVGQVVMVF9RVUFMSVRZOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHF1YWxpdHkgPSBBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIFRPRE86IFJlbW92ZSBNT05PX0hBQ0suIFJlc2FtcGxlciBzZWVzICNjaGFubmVscyBhZnRlciB0aGUgZG93bm1peGVyCi0gICAgICAgICAgICAgICAgLy8gYnV0IGlmIG5vbmUgZXhpc3RzLCBpdCBpcyB0aGUgY2hhbm5lbCBjb3VudCAoMSBmb3IgbW9ubykuCi0gICAgICAgICAgICAgICAgY29uc3QgaW50IHJlc2FtcGxlckNoYW5uZWxDb3VudCA9IG1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyCi0gICAgICAgICAgICAgICAgICAgICAgICA/IG1NaXhlckNoYW5uZWxDb3VudCA6IGNoYW5uZWxDb3VudDsKLSAgICAgICAgICAgICAgICBBTE9HVlYoIkNyZWF0aW5nIHJlc2FtcGxlcjoiCi0gICAgICAgICAgICAgICAgICAgICAgICAiIGZvcm1hdCglI3gpIGNoYW5uZWxzKCVkKSBkZXZTYW1wbGVSYXRlKCV1KSBxdWFsaXR5KCVkKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlckluRm9ybWF0LCByZXNhbXBsZXJDaGFubmVsQ291bnQsIGRldlNhbXBsZVJhdGUsIHF1YWxpdHkpOwotICAgICAgICAgICAgICAgIG1SZXNhbXBsZXIucmVzZXQoQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlckluRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzYW1wbGVyQ2hhbm5lbENvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgZGV2U2FtcGxlUmF0ZSwgcXVhbGl0eSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCiBib29sIEF1ZGlvTWl4ZXI6OlRyYWNrOjpzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnBsYXliYWNrUmF0ZSkKIHsKICAgICBpZiAoKG1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLmdldCgpID09IG51bGxwdHIgJiYKQEAgLTcxOSw4ICs0NzgsNyBAQAogICAgIGlmIChtVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlci5nZXQoKSA9PSBudWxscHRyKSB7CiAgICAgICAgIC8vIFRPRE86IFJlbW92ZSBNT05PX0hBQ0suIFJlc2FtcGxlciBzZWVzICNjaGFubmVscyBhZnRlciB0aGUgZG93bm1peGVyCiAgICAgICAgIC8vIGJ1dCBpZiBub25lIGV4aXN0cywgaXQgaXMgdGhlIGNoYW5uZWwgY291bnQgKDEgZm9yIG1vbm8pLgotICAgICAgICBjb25zdCBpbnQgdGltZXN0cmV0Y2hDaGFubmVsQ291bnQgPSBtRG93bm1peGVyQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cgotICAgICAgICAgICAgICAgID8gbU1peGVyQ2hhbm5lbENvdW50IDogY2hhbm5lbENvdW50OworICAgICAgICBjb25zdCBpbnQgdGltZXN0cmV0Y2hDaGFubmVsQ291bnQgPSBnZXRPdXRwdXRDaGFubmVsQ291bnQoKTsKICAgICAgICAgbVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIucmVzZXQobmV3IFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIodGltZXN0cmV0Y2hDaGFubmVsQ291bnQsCiAgICAgICAgICAgICAgICAgbU1peGVySW5Gb3JtYXQsIHNhbXBsZVJhdGUsIHBsYXliYWNrUmF0ZSkpOwogICAgICAgICByZWNvbmZpZ3VyZUJ1ZmZlclByb3ZpZGVycygpOwpAQCAtNzMxLDc3NSArNDg5LDMzIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLS8qIENoZWNrcyB0byBzZWUgaWYgdGhlIHZvbHVtZSByYW1wIGhhcyBjb21wbGV0ZWQgYW5kIGNsZWFycyB0aGUgaW5jcmVtZW50Ci0gKiB2YXJpYWJsZXMgYXBwcm9wcmlhdGVseS4KLSAqCi0gKiBGSVhNRTogVGhlcmUgaXMgY29kZSB0byBoYW5kbGUgaW50L2Zsb2F0IHJhbXAgdmFyaWFibGUgc3dpdGNob3ZlciBzaG91bGQgaXQgbm90Ci0gKiBjb21wbGV0ZSB3aXRoaW4gYSBtaXhlciBidWZmZXIgcHJvY2Vzc2luZyBjYWxsLCBidXQgaXQgaXMgcHJlZmVycmVkIHRvIGF2b2lkIHN3aXRjaG92ZXIKLSAqIGR1ZSB0byBwcmVjaXNpb24gaXNzdWVzLiAgVGhlIHN3aXRjaG92ZXIgY29kZSBpcyBpbmNsdWRlZCBmb3IgbGVnYWN5IGNvZGUgcHVycG9zZXMKLSAqIGFuZCBjYW4gYmUgcmVtb3ZlZCBvbmNlIHRoZSBpbnRlZ2VyIHZvbHVtZSBpcyByZW1vdmVkLgotICoKLSAqIEl0IGlzIG5vdCBzdWZmaWNpZW50IHRvIGNsZWFyIG9ubHkgdGhlIHZvbHVtZUluYyBpbnRlZ2VyIHZhcmlhYmxlIGJlY2F1c2UKLSAqIGlmIG9uZSBjaGFubmVsIHJlcXVpcmVzIHJhbXBpbmcsIGFsbCBjaGFubmVscyBhcmUgcmFtcGVkLgotICoKLSAqIFRoZXJlIGlzIGEgYml0IG9mIGR1cGxpY2F0ZWQgY29kZSBoZXJlLCBidXQgaXQga2VlcHMgYmFja3dhcmQgY29tcGF0aWJpbGl0eS4KLSAqLwotaW5saW5lIHZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OmFkanVzdFZvbHVtZVJhbXAoYm9vbCBhdXgsIGJvb2wgdXNlRmxvYXQpCi17Ci0gICAgaWYgKHVzZUZsb2F0KSB7Ci0gICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBNQVhfTlVNX1ZPTFVNRVM7IGkrKykgewotICAgICAgICAgICAgaWYgKChtVm9sdW1lSW5jW2ldID4gMCAmJiBtUHJldlZvbHVtZVtpXSArIG1Wb2x1bWVJbmNbaV0gPj0gbVZvbHVtZVtpXSkgfHwKLSAgICAgICAgICAgICAgICAgICAgIChtVm9sdW1lSW5jW2ldIDwgMCAmJiBtUHJldlZvbHVtZVtpXSArIG1Wb2x1bWVJbmNbaV0gPD0gbVZvbHVtZVtpXSkpIHsKLSAgICAgICAgICAgICAgICB2b2x1bWVJbmNbaV0gPSAwOwotICAgICAgICAgICAgICAgIHByZXZWb2x1bWVbaV0gPSB2b2x1bWVbaV0gPDwgMTY7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUluY1tpXSA9IDAuOwotICAgICAgICAgICAgICAgIG1QcmV2Vm9sdW1lW2ldID0gbVZvbHVtZVtpXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy9BTE9HVigicmFtcDogJWYgJWYgJWYiLCBtVm9sdW1lW2ldLCBtUHJldlZvbHVtZVtpXSwgbVZvbHVtZUluY1tpXSk7Ci0gICAgICAgICAgICAgICAgcHJldlZvbHVtZVtpXSA9IHU0XzI4X2Zyb21fZmxvYXQobVByZXZWb2x1bWVbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IE1BWF9OVU1fVk9MVU1FUzsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoKCh2b2x1bWVJbmNbaV0+MCkgJiYgKCgocHJldlZvbHVtZVtpXSt2b2x1bWVJbmNbaV0pPj4xNikgPj0gdm9sdW1lW2ldKSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKCh2b2x1bWVJbmNbaV08MCkgJiYgKCgocHJldlZvbHVtZVtpXSt2b2x1bWVJbmNbaV0pPj4xNikgPD0gdm9sdW1lW2ldKSkpIHsKLSAgICAgICAgICAgICAgICB2b2x1bWVJbmNbaV0gPSAwOwotICAgICAgICAgICAgICAgIHByZXZWb2x1bWVbaV0gPSB2b2x1bWVbaV0gPDwgMTY7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUluY1tpXSA9IDAuOwotICAgICAgICAgICAgICAgIG1QcmV2Vm9sdW1lW2ldID0gbVZvbHVtZVtpXTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy9BTE9HVigicmFtcDogJWQgJWQgJWQiLCB2b2x1bWVbaV0gPDwgMTYsIHByZXZWb2x1bWVbaV0sIHZvbHVtZUluY1tpXSk7Ci0gICAgICAgICAgICAgICAgbVByZXZWb2x1bWVbaV0gID0gZmxvYXRfZnJvbV91NF8yOChwcmV2Vm9sdW1lW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChhdXgpIHsKLSNpZmRlZiBGTE9BVF9BVVgKLSAgICAgICAgaWYgKHVzZUZsb2F0KSB7Ci0gICAgICAgICAgICBpZiAoKG1BdXhJbmMgPiAwLmYgJiYgbVByZXZBdXhMZXZlbCArIG1BdXhJbmMgPj0gbUF1eExldmVsKSB8fAotICAgICAgICAgICAgICAgICAgICAobUF1eEluYyA8IDAuZiAmJiBtUHJldkF1eExldmVsICsgbUF1eEluYyA8PSBtQXV4TGV2ZWwpKSB7Ci0gICAgICAgICAgICAgICAgYXV4SW5jID0gMDsKLSAgICAgICAgICAgICAgICBwcmV2QXV4TGV2ZWwgPSBhdXhMZXZlbCA8PCAxNjsKLSAgICAgICAgICAgICAgICBtQXV4SW5jID0gMC5mOwotICAgICAgICAgICAgICAgIG1QcmV2QXV4TGV2ZWwgPSBtQXV4TGV2ZWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZQotI2VuZGlmCi0gICAgICAgIGlmICgoYXV4SW5jID4gMCAmJiAoKHByZXZBdXhMZXZlbCArIGF1eEluYykgPj4gMTYpID49IGF1eExldmVsKSB8fAotICAgICAgICAgICAgICAgIChhdXhJbmMgPCAwICYmICgocHJldkF1eExldmVsICsgYXV4SW5jKSA+PiAxNikgPD0gYXV4TGV2ZWwpKSB7Ci0gICAgICAgICAgICBhdXhJbmMgPSAwOwotICAgICAgICAgICAgcHJldkF1eExldmVsID0gYXV4TGV2ZWwgPDwgMTY7Ci0gICAgICAgICAgICBtQXV4SW5jID0gMC5mOwotICAgICAgICAgICAgbVByZXZBdXhMZXZlbCA9IG1BdXhMZXZlbDsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc2l6ZV90IEF1ZGlvTWl4ZXI6OmdldFVucmVsZWFzZWRGcmFtZXMoaW50IG5hbWUpIGNvbnN0Ci17Ci0gICAgY29uc3QgYXV0byBpdCA9IG1UcmFja3MuZmluZChuYW1lKTsKLSAgICBpZiAoaXQgIT0gbVRyYWNrcy5lbmQoKSkgewotICAgICAgICByZXR1cm4gaXQtPnNlY29uZC0+Z2V0VW5yZWxlYXNlZEZyYW1lcygpOwotICAgIH0KLSAgICByZXR1cm4gMDsKLX0KLQogdm9pZCBBdWRpb01peGVyOjpzZXRCdWZmZXJQcm92aWRlcihpbnQgbmFtZSwgQXVkaW9CdWZmZXJQcm92aWRlciogYnVmZmVyUHJvdmlkZXIpCiB7CiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighZXhpc3RzKG5hbWUpLCAiaW52YWxpZCBuYW1lOiAlZCIsIG5hbWUpOwotICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnRyYWNrID0gbVRyYWNrc1tuYW1lXTsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0cmFjayA9IGdldFRyYWNrKG5hbWUpOwogCiAgICAgaWYgKHRyYWNrLT5tSW5wdXRCdWZmZXJQcm92aWRlciA9PSBidWZmZXJQcm92aWRlcikgewogICAgICAgICByZXR1cm47IC8vIGRvbid0IHJlc2V0IGFueSBidWZmZXIgcHJvdmlkZXJzIGlmIGlkZW50aWNhbC4KICAgICB9Ci0gICAgaWYgKHRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHRyYWNrLT5tUmVmb3JtYXRCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKLSAgICB9IGVsc2UgaWYgKHRyYWNrLT5tRG93bm1peGVyQnVmZmVyUHJvdmlkZXIgIT0gbnVsbHB0cikgewotICAgICAgICB0cmFjay0+bURvd25taXhlckJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgIC8vIHJlc2V0IG9yZGVyIGZyb20gZG93bnN0cmVhbSB0byB1cHN0cmVhbSBidWZmZXIgcHJvdmlkZXJzLgorICAgIGlmICh0cmFjay0+bVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICB0cmFjay0+bVRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CiAgICAgfSBlbHNlIGlmICh0cmFjay0+bVBvc3REb3dubWl4UmVmb3JtYXRCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgIHRyYWNrLT5tUG9zdERvd25taXhSZWZvcm1hdEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOwotICAgIH0gZWxzZSBpZiAodHJhY2stPm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgdHJhY2stPm1UaW1lc3RyZXRjaEJ1ZmZlclByb3ZpZGVyLT5yZXNldCgpOworICAgIH0gZWxzZSBpZiAodHJhY2stPm1Eb3dubWl4ZXJCdWZmZXJQcm92aWRlciAhPSBudWxscHRyKSB7CisgICAgICAgIHRyYWNrLT5tRG93bm1peGVyQnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CisgICAgfSBlbHNlIGlmICh0cmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICB0cmFjay0+bVJlZm9ybWF0QnVmZmVyUHJvdmlkZXItPnJlc2V0KCk7CisgICAgfSBlbHNlIGlmICh0cmFjay0+bUNvbnRyYWN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZUJ1ZmZlclByb3ZpZGVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgdHJhY2stPm1Db250cmFjdENoYW5uZWxzTm9uRGVzdHJ1Y3RpdmVCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKKyAgICB9IGVsc2UgaWYgKHRyYWNrLT5tQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIHRyYWNrLT5tQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKICAgICB9CiAKICAgICB0cmFjay0+bUlucHV0QnVmZmVyUHJvdmlkZXIgPSBidWZmZXJQcm92aWRlcjsKICAgICB0cmFjay0+cmVjb25maWd1cmVCdWZmZXJQcm92aWRlcnMoKTsKIH0KIAotdm9pZCBBdWRpb01peGVyOjpwcm9jZXNzX192YWxpZGF0ZSgpCi17Ci0gICAgLy8gVE9ETzogZml4IGFsbDE2Qml0c1N0ZXJlTm9SZXNhbXBsZSBsb2dpYyB0bwotICAgIC8vIGVpdGhlciBwcm9wZXJseSBoYW5kbGUgbXV0ZWQgdHJhY2tzIChpdCBzaG91bGQgaWdub3JlIHRoZW0pCi0gICAgLy8gb3IgcmVtb3ZlIGFsdG9nZXRoZXIgYXMgYW4gb2Jzb2xldGUgb3B0aW1pemF0aW9uLgotICAgIGJvb2wgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSA9IHRydWU7Ci0gICAgYm9vbCByZXNhbXBsaW5nID0gZmFsc2U7Ci0gICAgYm9vbCB2b2x1bWVSYW1wID0gZmFsc2U7Ci0KLSAgICBtRW5hYmxlZC5jbGVhcigpOwotICAgIG1Hcm91cHMuY2xlYXIoKTsKLSAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBtVHJhY2tzKSB7Ci0gICAgICAgIGNvbnN0IGludCBuYW1lID0gcGFpci5maXJzdDsKLSAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IHBhaXIuc2Vjb25kOwotICAgICAgICBpZiAoIXQtPmVuYWJsZWQpIGNvbnRpbnVlOwotCi0gICAgICAgIG1FbmFibGVkLmVtcGxhY2VfYmFjayhuYW1lKTsgIC8vIHdlIGFkZCB0byBtRW5hYmxlZCBpbiBvcmRlciBvZiBuYW1lLgotICAgICAgICBtR3JvdXBzW3QtPm1haW5CdWZmZXJdLmVtcGxhY2VfYmFjayhuYW1lKTsgLy8gbUdyb3VwcyBhbHNvIGluIG9yZGVyIG9mIG5hbWUuCi0KLSAgICAgICAgdWludDMyX3QgbiA9IDA7Ci0gICAgICAgIC8vIEZJWE1FIGNhbiBvdmVyZmxvdyAobWFzayBpcyBvbmx5IDMgYml0cykKLSAgICAgICAgbiB8PSBORUVEU19DSEFOTkVMXzEgKyB0LT5jaGFubmVsQ291bnQgLSAxOwotICAgICAgICBpZiAodC0+ZG9lc1Jlc2FtcGxlKCkpIHsKLSAgICAgICAgICAgIG4gfD0gTkVFRFNfUkVTQU1QTEU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHQtPmF1eExldmVsICE9IDAgJiYgdC0+YXV4QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG4gfD0gTkVFRFNfQVVYOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHQtPnZvbHVtZUluY1swXXx0LT52b2x1bWVJbmNbMV0pIHsKLSAgICAgICAgICAgIHZvbHVtZVJhbXAgPSB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKCF0LT5kb2VzUmVzYW1wbGUoKSAmJiB0LT52b2x1bWVSTCA9PSAwKSB7Ci0gICAgICAgICAgICBuIHw9IE5FRURTX01VVEU7Ci0gICAgICAgIH0KLSAgICAgICAgdC0+bmVlZHMgPSBuOwotCi0gICAgICAgIGlmIChuICYgTkVFRFNfTVVURSkgewotICAgICAgICAgICAgdC0+aG9vayA9ICZUcmFjazo6dHJhY2tfX25vcDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChuICYgTkVFRFNfQVVYKSB7Ci0gICAgICAgICAgICAgICAgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG4gJiBORUVEU19SRVNBTVBMRSkgewotICAgICAgICAgICAgICAgIGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICByZXNhbXBsaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB0LT5ob29rID0gVHJhY2s6OmdldFRyYWNrSG9vayhUUkFDS1RZUEVfUkVTQU1QTEUsIHQtPm1NaXhlckNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1NaXhlckluRm9ybWF0LCB0LT5tTWl4ZXJGb3JtYXQpOwotICAgICAgICAgICAgICAgIEFMT0dWX0lGKChuICYgTkVFRFNfQ0hBTk5FTF9DT1VOVF9fTUFTSykgPiBORUVEU19DSEFOTkVMXzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiVHJhY2sgJWQgbmVlZHMgZG93bm1peCArIHJlc2FtcGxlIiwgbmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmICgobiAmIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0spID09IE5FRURTX0NIQU5ORUxfMSl7Ci0gICAgICAgICAgICAgICAgICAgIHQtPmhvb2sgPSBUcmFjazo6Z2V0VHJhY2tIb29rKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0LT5tTWl4ZXJDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gIC8vIFRPRE86IE1PTk9fSEFDSwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgdC0+Y2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfTU9OTykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBUUkFDS1RZUEVfTk9SRVNBTVBMRU1PTk8gOiBUUkFDS1RZUEVfTk9SRVNBTVBMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT5tTWl4ZXJDaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+bU1peGVySW5Gb3JtYXQsIHQtPm1NaXhlckZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChuICYgTkVFRFNfQ0hBTk5FTF9DT1VOVF9fTUFTSykgPj0gTkVFRFNfQ0hBTk5FTF8yKXsKLSAgICAgICAgICAgICAgICAgICAgdC0+aG9vayA9IFRyYWNrOjpnZXRUcmFja0hvb2soVFJBQ0tUWVBFX05PUkVTQU1QTEUsIHQtPm1NaXhlckNoYW5uZWxDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0LT5tTWl4ZXJJbkZvcm1hdCwgdC0+bU1peGVyRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1ZfSUYoKG4gJiBORUVEU19DSEFOTkVMX0NPVU5UX19NQVNLKSA+IE5FRURTX0NIQU5ORUxfMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJhY2sgJWQgbmVlZHMgZG93bm1peCIsIG5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIHNlbGVjdCB0aGUgcHJvY2Vzc2luZyBob29rcwotICAgIG1Ib29rID0gJkF1ZGlvTWl4ZXI6OnByb2Nlc3NfX25vcDsKLSAgICBpZiAobUVuYWJsZWQuc2l6ZSgpID4gMCkgewotICAgICAgICBpZiAocmVzYW1wbGluZykgewotICAgICAgICAgICAgaWYgKG1PdXRwdXRUZW1wLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBtT3V0cHV0VGVtcC5yZXNldChuZXcgaW50MzJfdFtNQVhfTlVNX0NIQU5ORUxTICogbUZyYW1lQ291bnRdKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUmVzYW1wbGVUZW1wLmdldCgpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBtUmVzYW1wbGVUZW1wLnJlc2V0KG5ldyBpbnQzMl90W01BWF9OVU1fQ0hBTk5FTFMgKiBtRnJhbWVDb3VudF0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUhvb2sgPSAmQXVkaW9NaXhlcjo6cHJvY2Vzc19fZ2VuZXJpY1Jlc2FtcGxpbmc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyB3ZSBrZWVwIHRlbXAgYXJyYXlzIGFyb3VuZC4KLSAgICAgICAgICAgIG1Ib29rID0gJkF1ZGlvTWl4ZXI6OnByb2Nlc3NfX2dlbmVyaWNOb1Jlc2FtcGxpbmc7Ci0gICAgICAgICAgICBpZiAoYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSAmJiAhdm9sdW1lUmFtcCkgewotICAgICAgICAgICAgICAgIGlmIChtRW5hYmxlZC5zaXplKCkgPT0gMSkgewotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0ID0gbVRyYWNrc1ttRW5hYmxlZFswXV07Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodC0+bmVlZHMgJiBORUVEU19NVVRFKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2hlY2sgcHJldmVudHMgYSBtdXRlZCB0cmFjayBmcm9tIGFjcXVpcmluZyBhIHByb2Nlc3MgaG9vay4KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGRhbmdlcm91cyBpZiB0aGUgdHJhY2sgaXMgTU9OTyBhcyB0aGF0IHJlcXVpcmVzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgaGFuZGxpbmcgZHVlIHRvIGltcGxpY2l0IGNoYW5uZWwgZHVwbGljYXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVyZW8gb3IgTXVsdGljaGFubmVsIHNob3VsZCBhY3R1YWxseSBiZSBmaW5lIGhlcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBtSG9vayA9IGdldFByb2Nlc3NIb29rKFBST0NFU1NUWVBFX05PUkVTQU1QTEVPTkVUUkFDSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+bU1peGVyQ2hhbm5lbENvdW50LCB0LT5tTWl4ZXJJbkZvcm1hdCwgdC0+bU1peGVyRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dWKCJtaXhlciBjb25maWd1cmF0aW9uIGNoYW5nZTogJXp1ICIKLSAgICAgICAgImFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGU9JWQsIHJlc2FtcGxpbmc9JWQsIHZvbHVtZVJhbXA9JWQiLAotICAgICAgICBtRW5hYmxlZC5zaXplKCksIGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUsIHJlc2FtcGxpbmcsIHZvbHVtZVJhbXApOwotCi0gICBwcm9jZXNzKCk7Ci0KLSAgICAvLyBOb3cgdGhhdCB0aGUgdm9sdW1lIHJhbXAgaGFzIGJlZW4gZG9uZSwgc2V0IG9wdGltYWwgc3RhdGUgYW5kCi0gICAgLy8gdHJhY2sgaG9va3MgZm9yIHN1YnNlcXVlbnQgbWl4ZXIgcHJvY2VzcwotICAgIGlmIChtRW5hYmxlZC5zaXplKCkgPiAwKSB7Ci0gICAgICAgIGJvb2wgYWxsTXV0ZWQgPSB0cnVlOwotCi0gICAgICAgIGZvciAoY29uc3QgaW50IG5hbWUgOiBtRW5hYmxlZCkgewotICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IG1UcmFja3NbbmFtZV07Ci0gICAgICAgICAgICBpZiAoIXQtPmRvZXNSZXNhbXBsZSgpICYmIHQtPnZvbHVtZVJMID09IDApIHsKLSAgICAgICAgICAgICAgICB0LT5uZWVkcyB8PSBORUVEU19NVVRFOwotICAgICAgICAgICAgICAgIHQtPmhvb2sgPSAmVHJhY2s6OnRyYWNrX19ub3A7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGFsbE11dGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFsbE11dGVkKSB7Ci0gICAgICAgICAgICBtSG9vayA9ICZBdWRpb01peGVyOjpwcm9jZXNzX19ub3A7Ci0gICAgICAgIH0gZWxzZSBpZiAoYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSkgewotICAgICAgICAgICAgaWYgKG1FbmFibGVkLnNpemUoKSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgLy9jb25zdCBpbnQgaSA9IDMxIC0gX19idWlsdGluX2NseihlbmFibGVkVHJhY2tzKTsKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0ID0gbVRyYWNrc1ttRW5hYmxlZFswXV07Ci0gICAgICAgICAgICAgICAgLy8gTXV0ZWQgc2luZ2xlIHRyYWNrcyBoYW5kbGVkIGJ5IGFsbE11dGVkIGFib3ZlLgotICAgICAgICAgICAgICAgIG1Ib29rID0gZ2V0UHJvY2Vzc0hvb2soUFJPQ0VTU1RZUEVfTk9SRVNBTVBMRU9ORVRSQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgdC0+bU1peGVyQ2hhbm5lbENvdW50LCB0LT5tTWl4ZXJJbkZvcm1hdCwgdC0+bU1peGVyRm9ybWF0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBBdWRpb01peGVyOjpUcmFjazo6dHJhY2tfX2dlbmVyaWNSZXNhbXBsZSgKLSAgICAgICAgaW50MzJfdCogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KQotewotICAgIEFMT0dWVigidHJhY2tfX2dlbmVyaWNSZXNhbXBsZVxuIik7Ci0gICAgbVJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShzYW1wbGVSYXRlKTsKLQotICAgIC8vIHJhbXAgZ2FpbiAtIHJlc2FtcGxlIHRvIHRlbXAgYnVmZmVyIGFuZCBzY2FsZS9taXggaW4gMm5kIHN0ZXAKLSAgICBpZiAoYXV4ICE9IE5VTEwpIHsKLSAgICAgICAgLy8gYWx3YXlzIHJlc2FtcGxlIHdpdGggdW5pdHkgZ2FpbiB3aGVuIHNlbmRpbmcgdG8gYXV4aWxpYXJ5IGJ1ZmZlciB0byBiZSBhYmxlCi0gICAgICAgIC8vIHRvIGFwcGx5IHNlbmQgbGV2ZWwgYWZ0ZXIgcmVzYW1wbGluZwotICAgICAgICBtUmVzYW1wbGVyLT5zZXRWb2x1bWUoVU5JVFlfR0FJTl9GTE9BVCwgVU5JVFlfR0FJTl9GTE9BVCk7Ci0gICAgICAgIG1lbXNldCh0ZW1wLCAwLCBvdXRGcmFtZUNvdW50ICogbU1peGVyQ2hhbm5lbENvdW50ICogc2l6ZW9mKGludDMyX3QpKTsKLSAgICAgICAgbVJlc2FtcGxlci0+cmVzYW1wbGUodGVtcCwgb3V0RnJhbWVDb3VudCwgYnVmZmVyUHJvdmlkZXIpOwotICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodm9sdW1lSW5jWzBdfHZvbHVtZUluY1sxXXxhdXhJbmMpKSB7Ci0gICAgICAgICAgICB2b2x1bWVSYW1wU3RlcmVvKG91dCwgb3V0RnJhbWVDb3VudCwgdGVtcCwgYXV4KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZvbHVtZVN0ZXJlbyhvdXQsIG91dEZyYW1lQ291bnQsIHRlbXAsIGF1eCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodm9sdW1lSW5jWzBdfHZvbHVtZUluY1sxXSkpIHsKLSAgICAgICAgICAgIG1SZXNhbXBsZXItPnNldFZvbHVtZShVTklUWV9HQUlOX0ZMT0FULCBVTklUWV9HQUlOX0ZMT0FUKTsKLSAgICAgICAgICAgIG1lbXNldCh0ZW1wLCAwLCBvdXRGcmFtZUNvdW50ICogTUFYX05VTV9DSEFOTkVMUyAqIHNpemVvZihpbnQzMl90KSk7Ci0gICAgICAgICAgICBtUmVzYW1wbGVyLT5yZXNhbXBsZSh0ZW1wLCBvdXRGcmFtZUNvdW50LCBidWZmZXJQcm92aWRlcik7Ci0gICAgICAgICAgICB2b2x1bWVSYW1wU3RlcmVvKG91dCwgb3V0RnJhbWVDb3VudCwgdGVtcCwgYXV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbnN0YW50IGdhaW4KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBtUmVzYW1wbGVyLT5zZXRWb2x1bWUobVZvbHVtZVswXSwgbVZvbHVtZVsxXSk7Ci0gICAgICAgICAgICBtUmVzYW1wbGVyLT5yZXNhbXBsZShvdXQsIG91dEZyYW1lQ291bnQsIGJ1ZmZlclByb3ZpZGVyKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBBdWRpb01peGVyOjpUcmFjazo6dHJhY2tfX25vcChpbnQzMl90KiBvdXQgX191bnVzZWQsCi0gICAgICAgIHNpemVfdCBvdXRGcmFtZUNvdW50IF9fdW51c2VkLCBpbnQzMl90KiB0ZW1wIF9fdW51c2VkLCBpbnQzMl90KiBhdXggX191bnVzZWQpCi17Ci19Ci0KLXZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OnZvbHVtZVJhbXBTdGVyZW8oCi0gICAgICAgIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCkKLXsKLSAgICBpbnQzMl90IHZsID0gcHJldlZvbHVtZVswXTsKLSAgICBpbnQzMl90IHZyID0gcHJldlZvbHVtZVsxXTsKLSAgICBjb25zdCBpbnQzMl90IHZsSW5jID0gdm9sdW1lSW5jWzBdOwotICAgIGNvbnN0IGludDMyX3QgdnJJbmMgPSB2b2x1bWVJbmNbMV07Ci0KLSAgICAvL0FMT0dEKCJbMF0gJXA6IGluYz0lZiwgdjA9JWYsIHYxPSVkLCBmaW5hbD0lZiwgY291bnQ9JWQiLAotICAgIC8vICAgICAgICB0LCB2bEluYy82NTUzNi4wZiwgdmwvNjU1MzYuMGYsIHZvbHVtZVswXSwKLSAgICAvLyAgICAgICAodmwgKyB2bEluYypmcmFtZUNvdW50KS82NTUzNi4wZiwgZnJhbWVDb3VudCk7Ci0KLSAgICAvLyByYW1wIHZvbHVtZQotICAgIGlmIChDQ19VTkxJS0VMWShhdXggIT0gTlVMTCkpIHsKLSAgICAgICAgaW50MzJfdCB2YSA9IHByZXZBdXhMZXZlbDsKLSAgICAgICAgY29uc3QgaW50MzJfdCB2YUluYyA9IGF1eEluYzsKLSAgICAgICAgaW50MzJfdCBsOwotICAgICAgICBpbnQzMl90IHI7Ci0KLSAgICAgICAgZG8gewotICAgICAgICAgICAgbCA9ICgqdGVtcCsrID4+IDEyKTsKLSAgICAgICAgICAgIHIgPSAoKnRlbXArKyA+PiAxMik7Ci0gICAgICAgICAgICAqb3V0KysgKz0gKHZsID4+IDE2KSAqIGw7Ci0gICAgICAgICAgICAqb3V0KysgKz0gKHZyID4+IDE2KSAqIHI7Ci0gICAgICAgICAgICAqYXV4KysgKz0gKHZhID4+IDE3KSAqIChsICsgcik7Ci0gICAgICAgICAgICB2bCArPSB2bEluYzsKLSAgICAgICAgICAgIHZyICs9IHZySW5jOwotICAgICAgICAgICAgdmEgKz0gdmFJbmM7Ci0gICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7Ci0gICAgICAgIHByZXZBdXhMZXZlbCA9IHZhOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgICpvdXQrKyArPSAodmwgPj4gMTYpICogKCp0ZW1wKysgPj4gMTIpOwotICAgICAgICAgICAgKm91dCsrICs9ICh2ciA+PiAxNikgKiAoKnRlbXArKyA+PiAxMik7Ci0gICAgICAgICAgICB2bCArPSB2bEluYzsKLSAgICAgICAgICAgIHZyICs9IHZySW5jOwotICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOwotICAgIH0KLSAgICBwcmV2Vm9sdW1lWzBdID0gdmw7Ci0gICAgcHJldlZvbHVtZVsxXSA9IHZyOwotICAgIGFkanVzdFZvbHVtZVJhbXAoYXV4ICE9IE5VTEwpOwotfQotCi12b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjp2b2x1bWVTdGVyZW8oCi0gICAgICAgIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCkKLXsKLSAgICBjb25zdCBpbnQxNl90IHZsID0gdm9sdW1lWzBdOwotICAgIGNvbnN0IGludDE2X3QgdnIgPSB2b2x1bWVbMV07Ci0KLSAgICBpZiAoQ0NfVU5MSUtFTFkoYXV4ICE9IE5VTEwpKSB7Ci0gICAgICAgIGNvbnN0IGludDE2X3QgdmEgPSBhdXhMZXZlbDsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgaW50MTZfdCBsID0gKGludDE2X3QpKCp0ZW1wKysgPj4gMTIpOwotICAgICAgICAgICAgaW50MTZfdCByID0gKGludDE2X3QpKCp0ZW1wKysgPj4gMTIpOwotICAgICAgICAgICAgb3V0WzBdID0gbXVsQWRkKGwsIHZsLCBvdXRbMF0pOwotICAgICAgICAgICAgaW50MTZfdCBhID0gKGludDE2X3QpKCgoaW50MzJfdClsICsgcikgPj4gMSk7Ci0gICAgICAgICAgICBvdXRbMV0gPSBtdWxBZGQociwgdnIsIG91dFsxXSk7Ci0gICAgICAgICAgICBvdXQgKz0gMjsKLSAgICAgICAgICAgIGF1eFswXSA9IG11bEFkZChhLCB2YSwgYXV4WzBdKTsKLSAgICAgICAgICAgIGF1eCsrOwotICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGludDE2X3QgbCA9IChpbnQxNl90KSgqdGVtcCsrID4+IDEyKTsKLSAgICAgICAgICAgIGludDE2X3QgciA9IChpbnQxNl90KSgqdGVtcCsrID4+IDEyKTsKLSAgICAgICAgICAgIG91dFswXSA9IG11bEFkZChsLCB2bCwgb3V0WzBdKTsKLSAgICAgICAgICAgIG91dFsxXSA9IG11bEFkZChyLCB2ciwgb3V0WzFdKTsKLSAgICAgICAgICAgIG91dCArPSAyOwotICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb01peGVyOjpUcmFjazo6dHJhY2tfXzE2Qml0c1N0ZXJlbygKLSAgICAgICAgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCBfX3VudXNlZCwgaW50MzJfdCogYXV4KQotewotICAgIEFMT0dWVigidHJhY2tfXzE2Qml0c1N0ZXJlb1xuIik7Ci0gICAgY29uc3QgaW50MTZfdCAqaW4gPSBzdGF0aWNfY2FzdDxjb25zdCBpbnQxNl90ICo+KG1Jbik7Ci0KLSAgICBpZiAoQ0NfVU5MSUtFTFkoYXV4ICE9IE5VTEwpKSB7Ci0gICAgICAgIGludDMyX3QgbDsKLSAgICAgICAgaW50MzJfdCByOwotICAgICAgICAvLyByYW1wIGdhaW4KLSAgICAgICAgaWYgKENDX1VOTElLRUxZKHZvbHVtZUluY1swXXx2b2x1bWVJbmNbMV18YXV4SW5jKSkgewotICAgICAgICAgICAgaW50MzJfdCB2bCA9IHByZXZWb2x1bWVbMF07Ci0gICAgICAgICAgICBpbnQzMl90IHZyID0gcHJldlZvbHVtZVsxXTsKLSAgICAgICAgICAgIGludDMyX3QgdmEgPSBwcmV2QXV4TGV2ZWw7Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IHZsSW5jID0gdm9sdW1lSW5jWzBdOwotICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2ckluYyA9IHZvbHVtZUluY1sxXTsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdmFJbmMgPSBhdXhJbmM7Ci0gICAgICAgICAgICAvLyBBTE9HRCgiWzFdICVwOiBpbmM9JWYsIHYwPSVmLCB2MT0lZCwgZmluYWw9JWYsIGNvdW50PSVkIiwKLSAgICAgICAgICAgIC8vICAgICAgICB0LCB2bEluYy82NTUzNi4wZiwgdmwvNjU1MzYuMGYsIHZvbHVtZVswXSwKLSAgICAgICAgICAgIC8vICAgICAgICAodmwgKyB2bEluYypmcmFtZUNvdW50KS82NTUzNi4wZiwgZnJhbWVDb3VudCk7Ci0KLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBsID0gKGludDMyX3QpKmluKys7Ci0gICAgICAgICAgICAgICAgciA9IChpbnQzMl90KSppbisrOwotICAgICAgICAgICAgICAgICpvdXQrKyArPSAodmwgPj4gMTYpICogbDsKLSAgICAgICAgICAgICAgICAqb3V0KysgKz0gKHZyID4+IDE2KSAqIHI7Ci0gICAgICAgICAgICAgICAgKmF1eCsrICs9ICh2YSA+PiAxNykgKiAobCArIHIpOwotICAgICAgICAgICAgICAgIHZsICs9IHZsSW5jOwotICAgICAgICAgICAgICAgIHZyICs9IHZySW5jOwotICAgICAgICAgICAgICAgIHZhICs9IHZhSW5jOwotICAgICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKLQotICAgICAgICAgICAgcHJldlZvbHVtZVswXSA9IHZsOwotICAgICAgICAgICAgcHJldlZvbHVtZVsxXSA9IHZyOwotICAgICAgICAgICAgcHJldkF1eExldmVsID0gdmE7Ci0gICAgICAgICAgICBhZGp1c3RWb2x1bWVSYW1wKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gY29uc3RhbnQgZ2FpbgotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHZybCA9IHZvbHVtZVJMOwotICAgICAgICAgICAgY29uc3QgaW50MTZfdCB2YSA9IChpbnQxNl90KWF1eExldmVsOwotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oaW4pOwotICAgICAgICAgICAgICAgIGludDE2X3QgYSA9IChpbnQxNl90KSgoKGludDMyX3QpaW5bMF0gKyBpblsxXSkgPj4gMSk7Ci0gICAgICAgICAgICAgICAgaW4gKz0gMjsKLSAgICAgICAgICAgICAgICBvdXRbMF0gPSBtdWxBZGRSTCgxLCBybCwgdnJsLCBvdXRbMF0pOwotICAgICAgICAgICAgICAgIG91dFsxXSA9IG11bEFkZFJMKDAsIHJsLCB2cmwsIG91dFsxXSk7Ci0gICAgICAgICAgICAgICAgb3V0ICs9IDI7Ci0gICAgICAgICAgICAgICAgYXV4WzBdID0gbXVsQWRkKGEsIHZhLCBhdXhbMF0pOwotICAgICAgICAgICAgICAgIGF1eCsrOwotICAgICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIHJhbXAgZ2FpbgotICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodm9sdW1lSW5jWzBdfHZvbHVtZUluY1sxXSkpIHsKLSAgICAgICAgICAgIGludDMyX3QgdmwgPSBwcmV2Vm9sdW1lWzBdOwotICAgICAgICAgICAgaW50MzJfdCB2ciA9IHByZXZWb2x1bWVbMV07Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IHZsSW5jID0gdm9sdW1lSW5jWzBdOwotICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2ckluYyA9IHZvbHVtZUluY1sxXTsKLQotICAgICAgICAgICAgLy8gQUxPR0QoIlsxXSAlcDogaW5jPSVmLCB2MD0lZiwgdjE9JWQsIGZpbmFsPSVmLCBjb3VudD0lZCIsCi0gICAgICAgICAgICAvLyAgICAgICAgdCwgdmxJbmMvNjU1MzYuMGYsIHZsLzY1NTM2LjBmLCB2b2x1bWVbMF0sCi0gICAgICAgICAgICAvLyAgICAgICAgKHZsICsgdmxJbmMqZnJhbWVDb3VudCkvNjU1MzYuMGYsIGZyYW1lQ291bnQpOwotCi0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgKm91dCsrICs9ICh2bCA+PiAxNikgKiAoaW50MzJfdCkgKmluKys7Ci0gICAgICAgICAgICAgICAgKm91dCsrICs9ICh2ciA+PiAxNikgKiAoaW50MzJfdCkgKmluKys7Ci0gICAgICAgICAgICAgICAgdmwgKz0gdmxJbmM7Ci0gICAgICAgICAgICAgICAgdnIgKz0gdnJJbmM7Ci0gICAgICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOwotCi0gICAgICAgICAgICBwcmV2Vm9sdW1lWzBdID0gdmw7Ci0gICAgICAgICAgICBwcmV2Vm9sdW1lWzFdID0gdnI7Ci0gICAgICAgICAgICBhZGp1c3RWb2x1bWVSYW1wKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGNvbnN0YW50IGdhaW4KLSAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICBjb25zdCB1aW50MzJfdCB2cmwgPSB2b2x1bWVSTDsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBybCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KGluKTsKLSAgICAgICAgICAgICAgICBpbiArPSAyOwotICAgICAgICAgICAgICAgIG91dFswXSA9IG11bEFkZFJMKDEsIHJsLCB2cmwsIG91dFswXSk7Ci0gICAgICAgICAgICAgICAgb3V0WzFdID0gbXVsQWRkUkwoMCwgcmwsIHZybCwgb3V0WzFdKTsKLSAgICAgICAgICAgICAgICBvdXQgKz0gMjsKLSAgICAgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbUluID0gaW47Ci19Ci0KLXZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OnRyYWNrX18xNkJpdHNNb25vKAotICAgICAgICBpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wIF9fdW51c2VkLCBpbnQzMl90KiBhdXgpCi17Ci0gICAgQUxPR1ZWKCJ0cmFja19fMTZCaXRzTW9ub1xuIik7Ci0gICAgY29uc3QgaW50MTZfdCAqaW4gPSBzdGF0aWNfY2FzdDxpbnQxNl90IGNvbnN0ICo+KG1Jbik7Ci0KLSAgICBpZiAoQ0NfVU5MSUtFTFkoYXV4ICE9IE5VTEwpKSB7Ci0gICAgICAgIC8vIHJhbXAgZ2FpbgotICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodm9sdW1lSW5jWzBdfHZvbHVtZUluY1sxXXxhdXhJbmMpKSB7Ci0gICAgICAgICAgICBpbnQzMl90IHZsID0gcHJldlZvbHVtZVswXTsKLSAgICAgICAgICAgIGludDMyX3QgdnIgPSBwcmV2Vm9sdW1lWzFdOwotICAgICAgICAgICAgaW50MzJfdCB2YSA9IHByZXZBdXhMZXZlbDsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdmxJbmMgPSB2b2x1bWVJbmNbMF07Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IHZySW5jID0gdm9sdW1lSW5jWzFdOwotICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2YUluYyA9IGF1eEluYzsKLQotICAgICAgICAgICAgLy8gQUxPR0QoIlsyXSAlcDogaW5jPSVmLCB2MD0lZiwgdjE9JWQsIGZpbmFsPSVmLCBjb3VudD0lZCIsCi0gICAgICAgICAgICAvLyAgICAgICAgIHQsIHZsSW5jLzY1NTM2LjBmLCB2bC82NTUzNi4wZiwgdm9sdW1lWzBdLAotICAgICAgICAgICAgLy8gICAgICAgICAodmwgKyB2bEluYypmcmFtZUNvdW50KS82NTUzNi4wZiwgZnJhbWVDb3VudCk7Ci0KLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGwgPSAqaW4rKzsKLSAgICAgICAgICAgICAgICAqb3V0KysgKz0gKHZsID4+IDE2KSAqIGw7Ci0gICAgICAgICAgICAgICAgKm91dCsrICs9ICh2ciA+PiAxNikgKiBsOwotICAgICAgICAgICAgICAgICphdXgrKyArPSAodmEgPj4gMTYpICogbDsKLSAgICAgICAgICAgICAgICB2bCArPSB2bEluYzsKLSAgICAgICAgICAgICAgICB2ciArPSB2ckluYzsKLSAgICAgICAgICAgICAgICB2YSArPSB2YUluYzsKLSAgICAgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7Ci0KLSAgICAgICAgICAgIHByZXZWb2x1bWVbMF0gPSB2bDsKLSAgICAgICAgICAgIHByZXZWb2x1bWVbMV0gPSB2cjsKLSAgICAgICAgICAgIHByZXZBdXhMZXZlbCA9IHZhOwotICAgICAgICAgICAgYWRqdXN0Vm9sdW1lUmFtcCh0cnVlKTsKLSAgICAgICAgfQotICAgICAgICAvLyBjb25zdGFudCBnYWluCi0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgY29uc3QgaW50MTZfdCB2bCA9IHZvbHVtZVswXTsKLSAgICAgICAgICAgIGNvbnN0IGludDE2X3QgdnIgPSB2b2x1bWVbMV07Ci0gICAgICAgICAgICBjb25zdCBpbnQxNl90IHZhID0gKGludDE2X3QpYXV4TGV2ZWw7Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaW50MTZfdCBsID0gKmluKys7Ci0gICAgICAgICAgICAgICAgb3V0WzBdID0gbXVsQWRkKGwsIHZsLCBvdXRbMF0pOwotICAgICAgICAgICAgICAgIG91dFsxXSA9IG11bEFkZChsLCB2ciwgb3V0WzFdKTsKLSAgICAgICAgICAgICAgICBvdXQgKz0gMjsKLSAgICAgICAgICAgICAgICBhdXhbMF0gPSBtdWxBZGQobCwgdmEsIGF1eFswXSk7Ci0gICAgICAgICAgICAgICAgYXV4Kys7Ci0gICAgICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gcmFtcCBnYWluCi0gICAgICAgIGlmIChDQ19VTkxJS0VMWSh2b2x1bWVJbmNbMF18dm9sdW1lSW5jWzFdKSkgewotICAgICAgICAgICAgaW50MzJfdCB2bCA9IHByZXZWb2x1bWVbMF07Ci0gICAgICAgICAgICBpbnQzMl90IHZyID0gcHJldlZvbHVtZVsxXTsKLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdmxJbmMgPSB2b2x1bWVJbmNbMF07Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IHZySW5jID0gdm9sdW1lSW5jWzFdOwotCi0gICAgICAgICAgICAvLyBBTE9HRCgiWzJdICVwOiBpbmM9JWYsIHYwPSVmLCB2MT0lZCwgZmluYWw9JWYsIGNvdW50PSVkIiwKLSAgICAgICAgICAgIC8vICAgICAgICAgdCwgdmxJbmMvNjU1MzYuMGYsIHZsLzY1NTM2LjBmLCB2b2x1bWVbMF0sCi0gICAgICAgICAgICAvLyAgICAgICAgICh2bCArIHZsSW5jKmZyYW1lQ291bnQpLzY1NTM2LjBmLCBmcmFtZUNvdW50KTsKLQotICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgIGludDMyX3QgbCA9ICppbisrOwotICAgICAgICAgICAgICAgICpvdXQrKyArPSAodmwgPj4gMTYpICogbDsKLSAgICAgICAgICAgICAgICAqb3V0KysgKz0gKHZyID4+IDE2KSAqIGw7Ci0gICAgICAgICAgICAgICAgdmwgKz0gdmxJbmM7Ci0gICAgICAgICAgICAgICAgdnIgKz0gdnJJbmM7Ci0gICAgICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOwotCi0gICAgICAgICAgICBwcmV2Vm9sdW1lWzBdID0gdmw7Ci0gICAgICAgICAgICBwcmV2Vm9sdW1lWzFdID0gdnI7Ci0gICAgICAgICAgICBhZGp1c3RWb2x1bWVSYW1wKGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICAvLyBjb25zdGFudCBnYWluCi0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgY29uc3QgaW50MTZfdCB2bCA9IHZvbHVtZVswXTsKLSAgICAgICAgICAgIGNvbnN0IGludDE2X3QgdnIgPSB2b2x1bWVbMV07Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgaW50MTZfdCBsID0gKmluKys7Ci0gICAgICAgICAgICAgICAgb3V0WzBdID0gbXVsQWRkKGwsIHZsLCBvdXRbMF0pOwotICAgICAgICAgICAgICAgIG91dFsxXSA9IG11bEFkZChsLCB2ciwgb3V0WzFdKTsKLSAgICAgICAgICAgICAgICBvdXQgKz0gMjsKLSAgICAgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbUluID0gaW47Ci19Ci0KLS8vIG5vLW9wIGNhc2UKLXZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fbm9wKCkKLXsKLSAgICBBTE9HVlYoInByb2Nlc3NfX25vcFxuIik7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBtR3JvdXBzKSB7Ci0gICAgICAgIC8vIHByb2Nlc3MgYnkgZ3JvdXAgb2YgdHJhY2tzIHdpdGggc2FtZSBvdXRwdXQgYnVmZmVyIHRvCi0gICAgICAgIC8vIGF2b2lkIG11bHRpcGxlIG1lbXNldCgpIG9uIHNhbWUgYnVmZmVyCi0gICAgICAgIGNvbnN0IGF1dG8gJmdyb3VwID0gcGFpci5zZWNvbmQ7Ci0KLSAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IG1UcmFja3NbZ3JvdXBbMF1dOwotICAgICAgICBtZW1zZXQodC0+bWFpbkJ1ZmZlciwgMCwKLSAgICAgICAgICAgICAgICBtRnJhbWVDb3VudCAqIHQtPm1NaXhlckNoYW5uZWxDb3VudAotICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0LT5tTWl4ZXJGb3JtYXQpKTsKLQotICAgICAgICAvLyBub3cgY29uc3VtZSBkYXRhCi0gICAgICAgIGZvciAoY29uc3QgaW50IG5hbWUgOiBncm91cCkgewotICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IG1UcmFja3NbbmFtZV07Ci0gICAgICAgICAgICBzaXplX3Qgb3V0RnJhbWVzID0gbUZyYW1lQ291bnQ7Ci0gICAgICAgICAgICB3aGlsZSAob3V0RnJhbWVzKSB7Ci0gICAgICAgICAgICAgICAgdC0+YnVmZmVyLmZyYW1lQ291bnQgPSBvdXRGcmFtZXM7Ci0gICAgICAgICAgICAgICAgdC0+YnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJnQtPmJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgaWYgKHQtPmJ1ZmZlci5yYXcgPT0gTlVMTCkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgb3V0RnJhbWVzIC09IHQtPmJ1ZmZlci5mcmFtZUNvdW50OwotICAgICAgICAgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZ0LT5idWZmZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vLyBnZW5lcmljIGNvZGUgd2l0aG91dCByZXNhbXBsaW5nCi12b2lkIEF1ZGlvTWl4ZXI6OnByb2Nlc3NfX2dlbmVyaWNOb1Jlc2FtcGxpbmcoKQotewotICAgIEFMT0dWVigicHJvY2Vzc19fZ2VuZXJpY05vUmVzYW1wbGluZ1xuIik7Ci0gICAgaW50MzJfdCBvdXRUZW1wW0JMT0NLU0laRSAqIE1BWF9OVU1fQ0hBTk5FTFNdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBtR3JvdXBzKSB7Ci0gICAgICAgIC8vIHByb2Nlc3MgYnkgZ3JvdXAgb2YgdHJhY2tzIHdpdGggc2FtZSBvdXRwdXQgbWFpbiBidWZmZXIgdG8KLSAgICAgICAgLy8gYXZvaWQgbXVsdGlwbGUgbWVtc2V0KCkgb24gc2FtZSBidWZmZXIKLSAgICAgICAgY29uc3QgYXV0byAmZ3JvdXAgPSBwYWlyLnNlY29uZDsKLQotICAgICAgICAvLyBhY3F1aXJlIGJ1ZmZlcgotICAgICAgICBmb3IgKGNvbnN0IGludCBuYW1lIDogZ3JvdXApIHsKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnQgPSBtVHJhY2tzW25hbWVdOwotICAgICAgICAgICAgdC0+YnVmZmVyLmZyYW1lQ291bnQgPSBtRnJhbWVDb3VudDsKLSAgICAgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZ0LT5idWZmZXIpOwotICAgICAgICAgICAgdC0+ZnJhbWVDb3VudCA9IHQtPmJ1ZmZlci5mcmFtZUNvdW50OwotICAgICAgICAgICAgdC0+bUluID0gdC0+YnVmZmVyLnJhdzsKLSAgICAgICAgfQotCi0gICAgICAgIGludDMyX3QgKm91dCA9IChpbnQgKilwYWlyLmZpcnN0OwotICAgICAgICBzaXplX3QgbnVtRnJhbWVzID0gMDsKLSAgICAgICAgZG8gewotICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBzdGQ6Om1pbigoc2l6ZV90KUJMT0NLU0laRSwgbUZyYW1lQ291bnQgLSBudW1GcmFtZXMpOwotICAgICAgICAgICAgbWVtc2V0KG91dFRlbXAsIDAsIHNpemVvZihvdXRUZW1wKSk7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IGludCBuYW1lIDogZ3JvdXApIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0ID0gbVRyYWNrc1tuYW1lXTsKLSAgICAgICAgICAgICAgICBpbnQzMl90ICphdXggPSBOVUxMOwotICAgICAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWSh0LT5uZWVkcyAmIE5FRURTX0FVWCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXV4ID0gdC0+YXV4QnVmZmVyICsgbnVtRnJhbWVzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3IgKGludCBvdXRGcmFtZXMgPSBmcmFtZUNvdW50OyBvdXRGcmFtZXMgPiAwOyApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gdC0+aW4gPT0gbnVsbHB0ciBjYW4gaGFwcGVuIGlmIHRoZSB0cmFjayB3YXMgZmx1c2hlZCBqdXN0IGFmdGVyIGhhdmluZwotICAgICAgICAgICAgICAgICAgICAvLyBiZWVuIGVuYWJsZWQgZm9yIG1peGluZy4KLSAgICAgICAgICAgICAgICAgICAgaWYgKHQtPm1JbiA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzaXplX3QgaW5GcmFtZXMgPSAodC0+ZnJhbWVDb3VudCA+IG91dEZyYW1lcyk/b3V0RnJhbWVzOnQtPmZyYW1lQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbkZyYW1lcyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICh0LmdldCgpLT4qdC0+aG9vaykoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dFRlbXAgKyAoZnJhbWVDb3VudCAtIG91dEZyYW1lcykgKiB0LT5tTWl4ZXJDaGFubmVsQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluRnJhbWVzLCBtUmVzYW1wbGVUZW1wLmdldCgpIC8qIG5ha2VkIHB0ciAqLywgYXV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHQtPmZyYW1lQ291bnQgLT0gaW5GcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRGcmFtZXMgLT0gaW5GcmFtZXM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkoYXV4ICE9IE5VTEwpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV4ICs9IGluRnJhbWVzOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0LT5mcmFtZUNvdW50ID09IDAgJiYgb3V0RnJhbWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0LT5idWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmdC0+YnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHQtPmJ1ZmZlci5mcmFtZUNvdW50ID0gKG1GcmFtZUNvdW50IC0gbnVtRnJhbWVzKSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmcmFtZUNvdW50IC0gb3V0RnJhbWVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZ0LT5idWZmZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgdC0+bUluID0gdC0+YnVmZmVyLnJhdzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0LT5tSW4gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdC0+ZnJhbWVDb3VudCA9IHQtPmJ1ZmZlci5mcmFtZUNvdW50OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0MSA9IG1UcmFja3NbZ3JvdXBbMF1dOwotICAgICAgICAgICAgY29udmVydE1peGVyRm9ybWF0KG91dCwgdDEtPm1NaXhlckZvcm1hdCwgb3V0VGVtcCwgdDEtPm1NaXhlckluRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50ICogdDEtPm1NaXhlckNoYW5uZWxDb3VudCk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBmaXggdWdseSBjYXN0aW5nIGR1ZSB0byBjaG9pY2Ugb2Ygb3V0IHBvaW50ZXIgdHlwZQotICAgICAgICAgICAgb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oKHVpbnQ4X3QqKW91dAotICAgICAgICAgICAgICAgICAgICArIGZyYW1lQ291bnQgKiB0MS0+bU1peGVyQ2hhbm5lbENvdW50Ci0gICAgICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0MS0+bU1peGVyRm9ybWF0KSk7Ci0gICAgICAgICAgICBudW1GcmFtZXMgKz0gZnJhbWVDb3VudDsKLSAgICAgICAgfSB3aGlsZSAobnVtRnJhbWVzIDwgbUZyYW1lQ291bnQpOwotCi0gICAgICAgIC8vIHJlbGVhc2UgZWFjaCB0cmFjaydzIGJ1ZmZlcgotICAgICAgICBmb3IgKGNvbnN0IGludCBuYW1lIDogZ3JvdXApIHsKLSAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFjaz4gJnQgPSBtVHJhY2tzW25hbWVdOwotICAgICAgICAgICAgdC0+YnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJnQtPmJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8vIGdlbmVyaWMgY29kZSB3aXRoIHJlc2FtcGxpbmcKLXZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fZ2VuZXJpY1Jlc2FtcGxpbmcoKQotewotICAgIEFMT0dWVigicHJvY2Vzc19fZ2VuZXJpY1Jlc2FtcGxpbmdcbiIpOwotICAgIGludDMyX3QgKiBjb25zdCBvdXRUZW1wID0gbU91dHB1dFRlbXAuZ2V0KCk7IC8vIG5ha2VkIHB0cgotICAgIHNpemVfdCBudW1GcmFtZXMgPSBtRnJhbWVDb3VudDsKLQotICAgIGZvciAoY29uc3QgYXV0byAmcGFpciA6IG1Hcm91cHMpIHsKLSAgICAgICAgY29uc3QgYXV0byAmZ3JvdXAgPSBwYWlyLnNlY29uZDsKLSAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdDEgPSBtVHJhY2tzW2dyb3VwWzBdXTsKLQotICAgICAgICAvLyBjbGVhciB0ZW1wIGJ1ZmZlcgotICAgICAgICBtZW1zZXQob3V0VGVtcCwgMCwgc2l6ZW9mKCpvdXRUZW1wKSAqIHQxLT5tTWl4ZXJDaGFubmVsQ291bnQgKiBtRnJhbWVDb3VudCk7Ci0gICAgICAgIGZvciAoY29uc3QgaW50IG5hbWUgOiBncm91cCkgewotICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IG1UcmFja3NbbmFtZV07Ci0gICAgICAgICAgICBpbnQzMl90ICphdXggPSBOVUxMOwotICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKHQtPm5lZWRzICYgTkVFRFNfQVVYKSkgewotICAgICAgICAgICAgICAgIGF1eCA9IHQtPmF1eEJ1ZmZlcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gdGhpcyBpcyBhIGxpdHRsZSBnb29meSwgb24gdGhlIHJlc2FtcGxpbmcgY2FzZSB3ZSBkb24ndAotICAgICAgICAgICAgLy8gYWNxdWlyZS9yZWxlYXNlIHRoZSBidWZmZXJzIGJlY2F1c2UgaXQncyBkb25lIGJ5Ci0gICAgICAgICAgICAvLyB0aGUgcmVzYW1wbGVyLgotICAgICAgICAgICAgaWYgKHQtPm5lZWRzICYgTkVFRFNfUkVTQU1QTEUpIHsKLSAgICAgICAgICAgICAgICAodC5nZXQoKS0+KnQtPmhvb2spKG91dFRlbXAsIG51bUZyYW1lcywgbVJlc2FtcGxlVGVtcC5nZXQoKSAvKiBuYWtlZCBwdHIgKi8sIGF1eCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgc2l6ZV90IG91dEZyYW1lcyA9IDA7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAob3V0RnJhbWVzIDwgbnVtRnJhbWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHQtPmJ1ZmZlci5mcmFtZUNvdW50ID0gbnVtRnJhbWVzIC0gb3V0RnJhbWVzOwotICAgICAgICAgICAgICAgICAgICB0LT5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmdC0+YnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgdC0+bUluID0gdC0+YnVmZmVyLnJhdzsKLSAgICAgICAgICAgICAgICAgICAgLy8gdC0+bUluID09IG51bGxwdHIgY2FuIGhhcHBlbiBpZiB0aGUgdHJhY2sgd2FzIGZsdXNoZWQganVzdCBhZnRlciBoYXZpbmcKLSAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBlbmFibGVkIGZvciBtaXhpbmcuCi0gICAgICAgICAgICAgICAgICAgIGlmICh0LT5tSW4gPT0gbnVsbHB0cikgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgICAgICAgKHQuZ2V0KCktPip0LT5ob29rKSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRUZW1wICsgb3V0RnJhbWVzICogdC0+bU1peGVyQ2hhbm5lbENvdW50LCB0LT5idWZmZXIuZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzYW1wbGVUZW1wLmdldCgpIC8qIG5ha2VkIHB0ciAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXggIT0gbnVsbHB0ciA/IGF1eCArIG91dEZyYW1lcyA6IG51bGxwdHIpOwotICAgICAgICAgICAgICAgICAgICBvdXRGcmFtZXMgKz0gdC0+YnVmZmVyLmZyYW1lQ291bnQ7Ci0KLSAgICAgICAgICAgICAgICAgICAgdC0+YnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJnQtPmJ1ZmZlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNvbnZlcnRNaXhlckZvcm1hdCh0MS0+bWFpbkJ1ZmZlciwgdDEtPm1NaXhlckZvcm1hdCwKLSAgICAgICAgICAgICAgICBvdXRUZW1wLCB0MS0+bU1peGVySW5Gb3JtYXQsIG51bUZyYW1lcyAqIHQxLT5tTWl4ZXJDaGFubmVsQ291bnQpOwotICAgIH0KLX0KLQotLy8gb25lIHRyYWNrLCAxNiBiaXRzIHN0ZXJlbyB3aXRob3V0IHJlc2FtcGxpbmcgaXMgdGhlIG1vc3QgY29tbW9uIGNhc2UKLXZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fb25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmcoKQotewotICAgIEFMT0dWVigicHJvY2Vzc19fb25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmdcbiIpOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUVuYWJsZWQuc2l6ZSgpICE9IDAsCi0gICAgICAgICAgICAiJXp1ICE9IDEgdHJhY2tzIGVuYWJsZWQiLCBtRW5hYmxlZC5zaXplKCkpOwotICAgIGNvbnN0IGludCBuYW1lID0gbUVuYWJsZWRbMF07Ci0gICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IG1UcmFja3NbbmFtZV07Ci0KLSAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGIodC0+YnVmZmVyKTsKLQotICAgIGludDMyX3QqIG91dCA9IHQtPm1haW5CdWZmZXI7Ci0gICAgZmxvYXQgKmZvdXQgPSByZWludGVycHJldF9jYXN0PGZsb2F0Kj4ob3V0KTsKLSAgICBzaXplX3QgbnVtRnJhbWVzID0gbUZyYW1lQ291bnQ7Ci0KLSAgICBjb25zdCBpbnQxNl90IHZsID0gdC0+dm9sdW1lWzBdOwotICAgIGNvbnN0IGludDE2X3QgdnIgPSB0LT52b2x1bWVbMV07Ci0gICAgY29uc3QgdWludDMyX3QgdnJsID0gdC0+dm9sdW1lUkw7Ci0gICAgd2hpbGUgKG51bUZyYW1lcykgewotICAgICAgICBiLmZyYW1lQ291bnQgPSBudW1GcmFtZXM7Ci0gICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZiKTsKLSAgICAgICAgY29uc3QgaW50MTZfdCAqaW4gPSBiLmkxNjsKLQotICAgICAgICAvLyBpbiA9PSBOVUxMIGNhbiBoYXBwZW4gaWYgdGhlIHRyYWNrIHdhcyBmbHVzaGVkIGp1c3QgYWZ0ZXIgaGF2aW5nCi0gICAgICAgIC8vIGJlZW4gZW5hYmxlZCBmb3IgbWl4aW5nLgotICAgICAgICBpZiAoaW4gPT0gTlVMTCB8fCAoKCh1aW50cHRyX3QpaW4pICYgMykpIHsKLSAgICAgICAgICAgIGlmICggQVVESU9fRk9STUFUX1BDTV9GTE9BVCA9PSB0LT5tTWl4ZXJGb3JtYXQgKSB7Ci0gICAgICAgICAgICAgICAgIG1lbXNldCgoY2hhciopZm91dCwgMCwgbnVtRnJhbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgKiB0LT5tTWl4ZXJDaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHQtPm1NaXhlckZvcm1hdCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgbWVtc2V0KChjaGFyKilvdXQsIDAsIG51bUZyYW1lcwotICAgICAgICAgICAgICAgICAgICAgICAgICogdC0+bU1peGVyQ2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0LT5tTWl4ZXJGb3JtYXQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dFX0lGKCgoKHVpbnRwdHJfdClpbikgJiAzKSwKLSAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NfX29uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nOiBtaXNhbGlnbmVkIGJ1ZmZlciIKLSAgICAgICAgICAgICAgICAgICAgIiAlcCB0cmFjayAlZCwgY2hhbm5lbHMgJWQsIG5lZWRzICUwOHgsIHZvbHVtZSAlMDh4IHZmbCAlZiB2ZnIgJWYiLAotICAgICAgICAgICAgICAgICAgICBpbiwgbmFtZSwgdC0+Y2hhbm5lbENvdW50LCB0LT5uZWVkcywgdnJsLCB0LT5tVm9sdW1lWzBdLCB0LT5tVm9sdW1lWzFdKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzaXplX3Qgb3V0RnJhbWVzID0gYi5mcmFtZUNvdW50OwotCi0gICAgICAgIHN3aXRjaCAodC0+bU1peGVyRm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBybCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KGluKTsKLSAgICAgICAgICAgICAgICBpbiArPSAyOwotICAgICAgICAgICAgICAgIGludDMyX3QgbCA9IG11bFJMKDEsIHJsLCB2cmwpOwotICAgICAgICAgICAgICAgIGludDMyX3QgciA9IG11bFJMKDAsIHJsLCB2cmwpOwotICAgICAgICAgICAgICAgICpmb3V0KysgPSBmbG9hdF9mcm9tX3E0XzI3KGwpOwotICAgICAgICAgICAgICAgICpmb3V0KysgPSBmbG9hdF9mcm9tX3E0XzI3KHIpOwotICAgICAgICAgICAgICAgIC8vIE5vdGU6IEluIGNhc2Ugb2YgbGF0ZXIgaW50MTZfdCBzaW5rIG91dHB1dCwKLSAgICAgICAgICAgICAgICAvLyBjb252ZXJzaW9uIGFuZCBjbGFtcGluZyBpcyBkb25lIGJ5IG1lbWNweV90b19pMTZfZnJvbV9mbG9hdCgpLgotICAgICAgICAgICAgfSB3aGlsZSAoLS1vdXRGcmFtZXMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6Ci0gICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodWludDMyX3QodmwpID4gVU5JVFlfR0FJTl9JTlQgfHwgdWludDMyX3QodnIpID4gVU5JVFlfR0FJTl9JTlQpKSB7Ci0gICAgICAgICAgICAgICAgLy8gdm9sdW1lIGlzIGJvb3N0ZWQsIHNvIHdlIG1pZ2h0IG5lZWQgdG8gY2xhbXAgZXZlbiB0aG91Z2gKLSAgICAgICAgICAgICAgICAvLyB3ZSBwcm9jZXNzIG9ubHkgb25lIHRyYWNrLgotICAgICAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmwgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPihpbik7Ci0gICAgICAgICAgICAgICAgICAgIGluICs9IDI7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgbCA9IG11bFJMKDEsIHJsLCB2cmwpID4+IDEyOwotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHIgPSBtdWxSTCgwLCBybCwgdnJsKSA+PiAxMjsKLSAgICAgICAgICAgICAgICAgICAgLy8gY2xhbXBpbmcuLi4KLSAgICAgICAgICAgICAgICAgICAgbCA9IGNsYW1wMTYobCk7Ci0gICAgICAgICAgICAgICAgICAgIHIgPSBjbGFtcDE2KHIpOwotICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSAocjw8MTYpIHwgKGwgJiAweEZGRkYpOwotICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3V0RnJhbWVzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBybCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KGluKTsKLSAgICAgICAgICAgICAgICAgICAgaW4gKz0gMjsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsID0gbXVsUkwoMSwgcmwsIHZybCkgPj4gMTI7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgciA9IG11bFJMKDAsIHJsLCB2cmwpID4+IDEyOwotICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSAocjw8MTYpIHwgKGwgJiAweEZGRkYpOwotICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3V0RnJhbWVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVyIGZvcm1hdDogJWQiLCB0LT5tTWl4ZXJGb3JtYXQpOwotICAgICAgICB9Ci0gICAgICAgIG51bUZyYW1lcyAtPSBiLmZyYW1lQ291bnQ7Ci0gICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZiKTsKLSAgICB9Ci19Ci0KIC8qc3RhdGljKi8gcHRocmVhZF9vbmNlX3QgQXVkaW9NaXhlcjo6c09uY2VDb250cm9sID0gUFRIUkVBRF9PTkNFX0lOSVQ7CiAKIC8qc3RhdGljKi8gdm9pZCBBdWRpb01peGVyOjpzSW5pdFJvdXRpbmUoKQpAQCAtMTUwNyw0MjIgKzUyMyw5NiBAQAogICAgIERvd25taXhlckJ1ZmZlclByb3ZpZGVyOjppbml0KCk7IC8vIGZvciB0aGUgZG93bm1peGVyCiB9CiAKLS8qIFRPRE86IGNvbnNpZGVyIHdoZXRoZXIgdGhpcyBsZXZlbCBvZiBvcHRpbWl6YXRpb24gaXMgbmVjZXNzYXJ5LgotICogUGVyaGFwcyBqdXN0IHN0aWNrIHdpdGggYSBzaW5nbGUgZm9yIGxvb3AuCi0gKi8KLQotLy8gTmVlZHMgdG8gZGVyaXZlIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50IChjb25zdGV4cHIpLiAgQ291bGQgYmUgdGFyZ2V0ZWQgdG8gZ28KLS8vIHRvIGEgTU9OT1ZPTCBtaXh0eXBlIGJhc2VkIG9uIE1BWF9OVU1fVk9MVU1FUywgYnV0IHRoYXQncyBhbiB1bm5lY2Vzc2FyeSBjb21wbGljYXRpb24uCi0jZGVmaW5lIE1JWFRZUEVfTU9OT1ZPTChtaXh0eXBlKSAoKG1peHR5cGUpID09IE1JWFRZUEVfTVVMVEkgPyBNSVhUWVBFX01VTFRJX01PTk9WT0wgOiBcCi0gICAgICAgIChtaXh0eXBlKSA9PSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZID8gTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MIDogKG1peHR5cGUpKQotCi0vKiBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCi0gKiBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0Ci0gKiBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAotICogVEE6IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAotICovCi10ZW1wbGF0ZSA8aW50IE1JWFRZUEUsCi0gICAgICAgIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVFYsIHR5cGVuYW1lIFRBLCB0eXBlbmFtZSBUQVY+Ci1zdGF0aWMgdm9pZCB2b2x1bWVSYW1wTXVsdGkodWludDMyX3QgY2hhbm5lbHMsIFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAotICAgICAgICBjb25zdCBUSSogaW4sIFRBKiBhdXgsIFRWICp2b2wsIGNvbnN0IFRWICp2b2xpbmMsIFRBViAqdm9sYSwgVEFWIHZvbGFpbmMpCitzdGQ6OnNoYXJlZF9wdHI8QXVkaW9NaXhlckJhc2U6OlRyYWNrQmFzZT4gQXVkaW9NaXhlcjo6cHJlQ3JlYXRlVHJhY2soKQogewotICAgIHN3aXRjaCAoY2hhbm5lbHMpIHsKLSAgICBjYXNlIDE6Ci0gICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFLCAxPihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRSwgMj4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgMz4ob3V0LAotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA0OgotICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA0PihvdXQsCi0gICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xpbmMsIHZvbGEsIHZvbGFpbmMpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDU6Ci0gICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDU+KG91dCwKLSAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNjoKLSAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgNj4ob3V0LAotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSA3OgotICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA3PihvdXQsCi0gICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xpbmMsIHZvbGEsIHZvbGFpbmMpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIDg6Ci0gICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDg+KG91dCwKLSAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7Ci0gICAgICAgIGJyZWFrOworICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPFRyYWNrPigpOworfQorCitzdGF0dXNfdCBBdWRpb01peGVyOjpwb3N0Q3JlYXRlVHJhY2soVHJhY2tCYXNlICp0cmFjaykKK3sKKyAgICBUcmFjayogdCA9IHN0YXRpY19jYXN0PFRyYWNrKj4odHJhY2spOworCisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSB0LT5jaGFubmVsTWFzazsKKyAgICB0LT5tSGFwdGljQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICB0LT5tSGFwdGljQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHQtPm1IYXB0aWNDaGFubmVsTWFzayk7CisgICAgY2hhbm5lbE1hc2sgJj0gfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTDsKKyAgICB0LT5jaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgIEFMT0dWX0lGKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAorICAgICAgICAgICAgIk5vbi1zdGVyZW8gY2hhbm5lbCBtYXNrOiAlZFxuIiwgY2hhbm5lbE1hc2spOworICAgIHQtPmNoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CisgICAgdC0+bUlucHV0QnVmZmVyUHJvdmlkZXIgPSBOVUxMOworICAgIHQtPm1Eb3dubWl4UmVxdWlyZXNGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsgLy8gbm8gZm9ybWF0IHJlcXVpcmVkCisgICAgdC0+bVBsYXliYWNrUmF0ZSA9IEFVRElPX1BMQVlCQUNLX1JBVEVfREVGQVVMVDsKKyAgICAvLyBoYXB0aWMKKyAgICB0LT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gZmFsc2U7CisgICAgdC0+bUhhcHRpY0ludGVuc2l0eSA9IEhBUFRJQ19TQ0FMRV9OT05FOworICAgIHQtPm1NaXhlckhhcHRpY0NoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgIHQtPm1NaXhlckhhcHRpY0NoYW5uZWxDb3VudCA9IDA7CisgICAgdC0+bUFkanVzdEluQ2hhbm5lbENvdW50ID0gdC0+Y2hhbm5lbENvdW50ICsgdC0+bUhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICB0LT5tQWRqdXN0T3V0Q2hhbm5lbENvdW50ID0gdC0+Y2hhbm5lbENvdW50ICsgdC0+bU1peGVySGFwdGljQ2hhbm5lbENvdW50OworICAgIHQtPm1BZGp1c3ROb25EZXN0cnVjdGl2ZUluQ2hhbm5lbENvdW50ID0gdC0+bUFkanVzdE91dENoYW5uZWxDb3VudDsKKyAgICB0LT5tQWRqdXN0Tm9uRGVzdHJ1Y3RpdmVPdXRDaGFubmVsQ291bnQgPSB0LT5jaGFubmVsQ291bnQ7CisgICAgdC0+bUtlZXBDb250cmFjdGVkQ2hhbm5lbHMgPSBmYWxzZTsKKyAgICAvLyBDaGVjayB0aGUgZG93bm1peGluZyAob3IgdXBtaXhpbmcpIHJlcXVpcmVtZW50cy4KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSB0LT5wcmVwYXJlRm9yRG93bm1peCgpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIkF1ZGlvTWl4ZXI6OmdldFRyYWNrTmFtZSBpbnZhbGlkIGNoYW5uZWxNYXNrICglI3gpIiwgY2hhbm5lbE1hc2spOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAvLyBwcmVwYXJlRm9yRG93bm1peCgpIG1heSBjaGFuZ2UgbURvd25taXhSZXF1aXJlc0Zvcm1hdAorICAgIEFMT0dWVigibU1peGVyRm9ybWF0OiUjeCAgbU1peGVySW5Gb3JtYXQ6JSN4XG4iLCB0LT5tTWl4ZXJGb3JtYXQsIHQtPm1NaXhlckluRm9ybWF0KTsKKyAgICB0LT5wcmVwYXJlRm9yUmVmb3JtYXQoKTsKKyAgICB0LT5wcmVwYXJlRm9yQWRqdXN0Q2hhbm5lbHNOb25EZXN0cnVjdGl2ZShtRnJhbWVDb3VudCk7CisgICAgdC0+cHJlcGFyZUZvckFkanVzdENoYW5uZWxzKCk7CisgICAgcmV0dXJuIE9LOworfQorCit2b2lkIEF1ZGlvTWl4ZXI6OnByZVByb2Nlc3MoKQoreworICAgIGZvciAoY29uc3QgYXV0byAmcGFpciA6IG1UcmFja3MpIHsKKyAgICAgICAgLy8gQ2xlYXIgY29udHJhY3RlZCBidWZmZXIgYmVmb3JlIHByb2Nlc3NpbmcgaWYgY29udHJhY3RlZCBjaGFubmVscyBhcmUgc2F2ZWQKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrQmFzZT4gJnRiID0gcGFpci5zZWNvbmQ7CisgICAgICAgIFRyYWNrICp0ID0gc3RhdGljX2Nhc3Q8VHJhY2sqPih0Yi5nZXQoKSk7CisgICAgICAgIGlmICh0LT5tS2VlcENvbnRyYWN0ZWRDaGFubmVscykgeworICAgICAgICAgICAgdC0+Y2xlYXJDb250cmFjdGVkQnVmZmVyKCk7CisgICAgICAgIH0KICAgICB9CiB9CiAKLS8qIE1JWFRZUEUgICAgIChzZWUgQXVkaW9NaXhlck9wcy5oIE1JWFRZUEVfKiBlbnVtZXJhdGlvbikKLSAqIFRPOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKLSAqIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0Ci0gKiBUQTogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0Ci0gKi8KLXRlbXBsYXRlIDxpbnQgTUlYVFlQRSwKLSAgICAgICAgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUViwgdHlwZW5hbWUgVEEsIHR5cGVuYW1lIFRBVj4KLXN0YXRpYyB2b2lkIHZvbHVtZU11bHRpKHVpbnQzMl90IGNoYW5uZWxzLCBUTyogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwKLSAgICAgICAgY29uc3QgVEkqIGluLCBUQSogYXV4LCBjb25zdCBUViAqdm9sLCBUQVYgdm9sYSkKK3ZvaWQgQXVkaW9NaXhlcjo6cG9zdFByb2Nlc3MoKQogewotICAgIHN3aXRjaCAoY2hhbm5lbHMpIHsKLSAgICBjYXNlIDE6Ci0gICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEUsIDE+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFLCAyPihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCAzPihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNDoKLSAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA0PihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNToKLSAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA1PihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNjoKLSAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA2PihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgNzoKLSAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA3PihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgODoKLSAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA4PihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9sYSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogTUlYVFlQRSAgICAgKHNlZSBBdWRpb01peGVyT3BzLmggTUlYVFlQRV8qIGVudW1lcmF0aW9uKQotICogVVNFRkxPQVRWT0wgKHNldCB0byB0cnVlIGlmIGZsb2F0IHZvbHVtZSBpcyB1c2VkKQotICogQURKVVNUVk9MICAgKHNldCB0byB0cnVlIGlmIHZvbHVtZSByYW1wIHBhcmFtZXRlcnMgbmVlZHMgYWRqdXN0bWVudCBhZnRlcndhcmRzKQotICogVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAotICogVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKLSAqIFRBOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKLSAqLwotdGVtcGxhdGUgPGludCBNSVhUWVBFLCBib29sIFVTRUZMT0FUVk9MLCBib29sIEFESlVTVFZPTCwKLSAgICB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgotdm9pZCBBdWRpb01peGVyOjpUcmFjazo6dm9sdW1lTWl4KFRPICpvdXQsIHNpemVfdCBvdXRGcmFtZXMsCi0gICAgICAgIGNvbnN0IFRJICppbiwgVEEgKmF1eCwgYm9vbCByYW1wKQotewotICAgIGlmIChVU0VGTE9BVFZPTCkgewotICAgICAgICBpZiAocmFtcCkgewotICAgICAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEU+KG1NaXhlckNoYW5uZWxDb3VudCwgb3V0LCBvdXRGcmFtZXMsIGluLCBhdXgsCi0gICAgICAgICAgICAgICAgICAgIG1QcmV2Vm9sdW1lLCBtVm9sdW1lSW5jLAotI2lmZGVmIEZMT0FUX0FVWAotICAgICAgICAgICAgICAgICAgICAmbVByZXZBdXhMZXZlbCwgbUF1eEluYwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgJnByZXZBdXhMZXZlbCwgYXV4SW5jCi0jZW5kaWYKLSAgICAgICAgICAgICAgICApOwotICAgICAgICAgICAgaWYgKEFESlVTVFZPTCkgewotICAgICAgICAgICAgICAgIGFkanVzdFZvbHVtZVJhbXAoYXV4ICE9IE5VTEwsIHRydWUpOworICAgIC8vIFByb2Nlc3MgaGFwdGljIGRhdGEuCisgICAgLy8gTmVlZCB0byBrZWVwIGNvbnNpc3RlbnQgd2l0aCBWaWJyYXRpb25FZmZlY3Quc2NhbGUoaW50LCBmbG9hdCwgaW50KQorICAgIGZvciAoY29uc3QgYXV0byAmcGFpciA6IG1Hcm91cHMpIHsKKyAgICAgICAgLy8gcHJvY2VzcyBieSBncm91cCBvZiB0cmFja3Mgd2l0aCBzYW1lIG91dHB1dCBtYWluIGJ1ZmZlci4KKyAgICAgICAgY29uc3QgYXV0byAmZ3JvdXAgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgZm9yIChjb25zdCBpbnQgbmFtZSA6IGdyb3VwKSB7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2s+ICZ0ID0gZ2V0VHJhY2sobmFtZSk7CisgICAgICAgICAgICBpZiAodC0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIHNpemVfdCBzYW1wbGVDb3VudCA9IG1GcmFtZUNvdW50ICogdC0+bU1peGVySGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICAgICAgICAgIGZsb2F0IGdhbW1hID0gdC0+Z2V0SGFwdGljU2NhbGVHYW1tYSgpOworICAgICAgICAgICAgICAgIGZsb2F0IG1heEFtcGxpdHVkZVJhdGlvID0gdC0+Z2V0SGFwdGljTWF4QW1wbGl0dWRlUmF0aW8oKTsKKyAgICAgICAgICAgICAgICB1aW50OF90KiBidWZmZXIgPSAodWludDhfdCopcGFpci5maXJzdCArIG1GcmFtZUNvdW50ICogYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKAorICAgICAgICAgICAgICAgICAgICAgICAgdC0+bU1peGVyQ2hhbm5lbENvdW50LCB0LT5tTWl4ZXJGb3JtYXQpOworICAgICAgICAgICAgICAgIHN3aXRjaCAodC0+bU1peGVyRm9ybWF0KSB7CisgICAgICAgICAgICAgICAgLy8gTWl4ZXIgZm9ybWF0IHNob3VsZCBiZSBBVURJT19GT1JNQVRfUENNX0ZMT0FULgorICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDogeworICAgICAgICAgICAgICAgICAgICBmbG9hdCogZm91dCA9IChmbG9hdCopIGJ1ZmZlcjsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzYW1wbGVDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBtdWwgPSBmb3V0W2ldID49IDAgPyAxLjAgOiAtMS4wOworICAgICAgICAgICAgICAgICAgICAgICAgZm91dFtpXSA9IHBvd2YoZmFic2YoZm91dFtpXSAvIEhBUFRJQ19NQVhfQU1QTElUVURFX0ZMT0FUKSwgZ2FtbWEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogbWF4QW1wbGl0dWRlUmF0aW8gKiBIQVBUSUNfTUFYX0FNUExJVFVERV9GTE9BVCAqIG11bDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1NaXhlckZvcm1hdDogJSN4IiwgdC0+bU1peGVyRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRT4obU1peGVyQ2hhbm5lbENvdW50LCBvdXQsIG91dEZyYW1lcywgaW4sIGF1eCwKLSAgICAgICAgICAgICAgICAgICAgbVZvbHVtZSwKLSNpZmRlZiBGTE9BVF9BVVgKLSAgICAgICAgICAgICAgICAgICAgbUF1eExldmVsCi0jZWxzZQotICAgICAgICAgICAgICAgICAgICBhdXhMZXZlbAotI2VuZGlmCi0gICAgICAgICAgICApOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHJhbXApIHsKLSAgICAgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFPihtTWl4ZXJDaGFubmVsQ291bnQsIG91dCwgb3V0RnJhbWVzLCBpbiwgYXV4LAotICAgICAgICAgICAgICAgICAgICBwcmV2Vm9sdW1lLCB2b2x1bWVJbmMsICZwcmV2QXV4TGV2ZWwsIGF1eEluYyk7Ci0gICAgICAgICAgICBpZiAoQURKVVNUVk9MKSB7Ci0gICAgICAgICAgICAgICAgYWRqdXN0Vm9sdW1lUmFtcChhdXggIT0gTlVMTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFPihtTWl4ZXJDaGFubmVsQ291bnQsIG91dCwgb3V0RnJhbWVzLCBpbiwgYXV4LAotICAgICAgICAgICAgICAgICAgICB2b2x1bWUsIGF1eExldmVsKTsKICAgICAgICAgfQogICAgIH0KIH0KIAotLyogVGhpcyBwcm9jZXNzIGhvb2sgaXMgY2FsbGVkIHdoZW4gdGhlcmUgaXMgYSBzaW5nbGUgdHJhY2sgd2l0aG91dAotICogYXV4IGJ1ZmZlciwgdm9sdW1lIHJhbXAsIG9yIHJlc2FtcGxpbmcuCi0gKiBUT0RPOiBVcGRhdGUgdGhlIGhvb2sgc2VsZWN0aW9uOiB0aGlzIGNhbiBwcm9wZXJseSBoYW5kbGUgYXV4IGFuZCByYW1wLgotICoKLSAqIE1JWFRZUEUgICAgIChzZWUgQXVkaW9NaXhlck9wcy5oIE1JWFRZUEVfKiBlbnVtZXJhdGlvbikKLSAqIFRPOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKLSAqIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0Ci0gKiBUQTogaW50MzJfdCAoUTQuMjcpCi0gKi8KLXRlbXBsYXRlIDxpbnQgTUlYVFlQRSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KLXZvaWQgQXVkaW9NaXhlcjo6cHJvY2Vzc19fbm9SZXNhbXBsZU9uZVRyYWNrKCkKLXsKLSAgICBBTE9HVlYoInByb2Nlc3NfX25vUmVzYW1wbGVPbmVUcmFja1xuIik7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRW5hYmxlZC5zaXplKCkgIT0gMSwKLSAgICAgICAgICAgICIlenUgIT0gMSB0cmFja3MgZW5hYmxlZCIsIG1FbmFibGVkLnNpemUoKSk7Ci0gICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrPiAmdCA9IG1UcmFja3NbbUVuYWJsZWRbMF1dOwotICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxzID0gdC0+bU1peGVyQ2hhbm5lbENvdW50OwotICAgIFRPKiBvdXQgPSByZWludGVycHJldF9jYXN0PFRPKj4odC0+bWFpbkJ1ZmZlcik7Ci0gICAgVEEqIGF1eCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VEEqPih0LT5hdXhCdWZmZXIpOwotICAgIGNvbnN0IGJvb2wgcmFtcCA9IHQtPm5lZWRzUmFtcCgpOwotCi0gICAgZm9yIChzaXplX3QgbnVtRnJhbWVzID0gbUZyYW1lQ291bnQ7IG51bUZyYW1lcyA+IDA7ICkgewotICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGIodC0+YnVmZmVyKTsKLSAgICAgICAgLy8gZ2V0IGlucHV0IGJ1ZmZlcgotICAgICAgICBiLmZyYW1lQ291bnQgPSBudW1GcmFtZXM7Ci0gICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZiKTsKLSAgICAgICAgY29uc3QgVEkgKmluID0gcmVpbnRlcnByZXRfY2FzdDxUSSo+KGIucmF3KTsKLQotICAgICAgICAvLyBpbiA9PSBOVUxMIGNhbiBoYXBwZW4gaWYgdGhlIHRyYWNrIHdhcyBmbHVzaGVkIGp1c3QgYWZ0ZXIgaGF2aW5nCi0gICAgICAgIC8vIGJlZW4gZW5hYmxlZCBmb3IgbWl4aW5nLgotICAgICAgICBpZiAoaW4gPT0gTlVMTCB8fCAoKCh1aW50cHRyX3QpaW4pICYgMykpIHsKLSAgICAgICAgICAgIG1lbXNldChvdXQsIDAsIG51bUZyYW1lcwotICAgICAgICAgICAgICAgICAgICAqIGNoYW5uZWxzICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0LT5tTWl4ZXJGb3JtYXQpKTsKLSAgICAgICAgICAgIEFMT0dFX0lGKCgoKHVpbnRwdHJfdClpbikgJiAzKSwgInByb2Nlc3NfX25vUmVzYW1wbGVPbmVUcmFjazogYnVzIGVycm9yOiAiCi0gICAgICAgICAgICAgICAgICAgICJidWZmZXIgJXAgdHJhY2sgJXAsIGNoYW5uZWxzICVkLCBuZWVkcyAlI3giLAotICAgICAgICAgICAgICAgICAgICBpbiwgJnQsIHQtPmNoYW5uZWxDb3VudCwgdC0+bmVlZHMpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3Qgc2l6ZV90IG91dEZyYW1lcyA9IGIuZnJhbWVDb3VudDsKLSAgICAgICAgdC0+dm9sdW1lTWl4PE1JWFRZUEUsIGlzX3NhbWU8VEksIGZsb2F0Pjo6dmFsdWUgLyogVVNFRkxPQVRWT0wgKi8sIGZhbHNlIC8qIEFESlVTVFZPTCAqLz4gKAotICAgICAgICAgICAgICAgIG91dCwgb3V0RnJhbWVzLCBpbiwgYXV4LCByYW1wKTsKLQotICAgICAgICBvdXQgKz0gb3V0RnJhbWVzICogY2hhbm5lbHM7Ci0gICAgICAgIGlmIChhdXggIT0gTlVMTCkgewotICAgICAgICAgICAgYXV4ICs9IG91dEZyYW1lczsKLSAgICAgICAgfQotICAgICAgICBudW1GcmFtZXMgLT0gYi5mcmFtZUNvdW50OwotCi0gICAgICAgIC8vIHJlbGVhc2UgYnVmZmVyCi0gICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZiKTsKLSAgICB9Ci0gICAgaWYgKHJhbXApIHsKLSAgICAgICAgdC0+YWRqdXN0Vm9sdW1lUmFtcChhdXggIT0gTlVMTCwgaXNfc2FtZTxUSSwgZmxvYXQ+Ojp2YWx1ZSk7Ci0gICAgfQotfQotCi0vKiBUaGlzIHRyYWNrIGhvb2sgaXMgY2FsbGVkIHRvIGRvIHJlc2FtcGxpbmcgdGhlbiBtaXhpbmcsCi0gKiBwdWxsaW5nIGZyb20gdGhlIHRyYWNrJ3MgdXBzdHJlYW0gQXVkaW9CdWZmZXJQcm92aWRlci4KLSAqCi0gKiBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCi0gKiBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0Ci0gKiBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAotICogVEE6IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAotICovCi10ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+Ci12b2lkIEF1ZGlvTWl4ZXI6OlRyYWNrOjp0cmFja19fUmVzYW1wbGUoVE8qIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsIFRPKiB0ZW1wLCBUQSogYXV4KQotewotICAgIEFMT0dWVigidHJhY2tfX1Jlc2FtcGxlXG4iKTsKLSAgICBtUmVzYW1wbGVyLT5zZXRTYW1wbGVSYXRlKHNhbXBsZVJhdGUpOwotICAgIGNvbnN0IGJvb2wgcmFtcCA9IG5lZWRzUmFtcCgpOwotICAgIGlmIChyYW1wIHx8IGF1eCAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIGlmIHJhbXA6ICAgICAgICByZXNhbXBsZSB3aXRoIHVuaXR5IGdhaW4gdG8gdGVtcCBidWZmZXIgYW5kIHNjYWxlL21peCBpbiAybmQgc3RlcC4KLSAgICAgICAgLy8gaWYgYXV4ICE9IE5VTEw6IHJlc2FtcGxlIHdpdGggdW5pdHkgZ2FpbiB0byB0ZW1wIGJ1ZmZlciB0aGVuIGFwcGx5IHNlbmQgbGV2ZWwuCi0KLSAgICAgICAgbVJlc2FtcGxlci0+c2V0Vm9sdW1lKFVOSVRZX0dBSU5fRkxPQVQsIFVOSVRZX0dBSU5fRkxPQVQpOwotICAgICAgICBtZW1zZXQodGVtcCwgMCwgb3V0RnJhbWVDb3VudCAqIG1NaXhlckNoYW5uZWxDb3VudCAqIHNpemVvZihUTykpOwotICAgICAgICBtUmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50MzJfdCopdGVtcCwgb3V0RnJhbWVDb3VudCwgYnVmZmVyUHJvdmlkZXIpOwotCi0gICAgICAgIHZvbHVtZU1peDxNSVhUWVBFLCBpc19zYW1lPFRJLCBmbG9hdD46OnZhbHVlIC8qIFVTRUZMT0FUVk9MICovLCB0cnVlIC8qIEFESlVTVFZPTCAqLz4oCi0gICAgICAgICAgICAgICAgb3V0LCBvdXRGcmFtZUNvdW50LCB0ZW1wLCBhdXgsIHJhbXApOwotCi0gICAgfSBlbHNlIHsgLy8gY29uc3RhbnQgdm9sdW1lIGdhaW4KLSAgICAgICAgbVJlc2FtcGxlci0+c2V0Vm9sdW1lKG1Wb2x1bWVbMF0sIG1Wb2x1bWVbMV0pOwotICAgICAgICBtUmVzYW1wbGVyLT5yZXNhbXBsZSgoaW50MzJfdCopb3V0LCBvdXRGcmFtZUNvdW50LCBidWZmZXJQcm92aWRlcik7Ci0gICAgfQotfQotCi0vKiBUaGlzIHRyYWNrIGhvb2sgaXMgY2FsbGVkIHRvIG1peCBhIHRyYWNrLCB3aGVuIG5vIHJlc2FtcGxpbmcgaXMgcmVxdWlyZWQuCi0gKiBUaGUgaW5wdXQgYnVmZmVyIHNob3VsZCBiZSBwcmVzZW50IGluIGluLgotICoKLSAqIE1JWFRZUEUgICAgIChzZWUgQXVkaW9NaXhlck9wcy5oIE1JWFRZUEVfKiBlbnVtZXJhdGlvbikKLSAqIFRPOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKLSAqIFRJOiBpbnQzMl90IChRNC4yNykgb3IgaW50MTZfdCAoUTAuMTUpIG9yIGZsb2F0Ci0gKiBUQTogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0Ci0gKi8KLXRlbXBsYXRlIDxpbnQgTUlYVFlQRSwgdHlwZW5hbWUgVE8sIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUQT4KLXZvaWQgQXVkaW9NaXhlcjo6VHJhY2s6OnRyYWNrX19Ob1Jlc2FtcGxlKFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LCBUTyogdGVtcCBfX3VudXNlZCwgVEEqIGF1eCkKLXsKLSAgICBBTE9HVlYoInRyYWNrX19Ob1Jlc2FtcGxlXG4iKTsKLSAgICBjb25zdCBUSSAqaW4gPSBzdGF0aWNfY2FzdDxjb25zdCBUSSAqPihtSW4pOwotCi0gICAgdm9sdW1lTWl4PE1JWFRZUEUsIGlzX3NhbWU8VEksIGZsb2F0Pjo6dmFsdWUgLyogVVNFRkxPQVRWT0wgKi8sIHRydWUgLyogQURKVVNUVk9MICovPigKLSAgICAgICAgICAgIG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgbmVlZHNSYW1wKCkpOwotCi0gICAgLy8gTUlYVFlQRV9NT05PRVhQQU5EIHJlYWRzIGEgc2luZ2xlIGlucHV0IGNoYW5uZWwgYW5kIGV4cGFuZHMgdG8gTkNIQU4gb3V0cHV0IGNoYW5uZWxzLgotICAgIC8vIE1JWFRZUEVfTVVMVEkgcmVhZHMgTkNIQU4gaW5wdXQgY2hhbm5lbHMgYW5kIHBsYWNlcyB0byBOQ0hBTiBvdXRwdXQgY2hhbm5lbHMuCi0gICAgaW4gKz0gKE1JWFRZUEUgPT0gTUlYVFlQRV9NT05PRVhQQU5EKSA/IGZyYW1lQ291bnQgOiBmcmFtZUNvdW50ICogbU1peGVyQ2hhbm5lbENvdW50OwotICAgIG1JbiA9IGluOwotfQotCi0vKiBUaGUgTWl4ZXIgZW5naW5lIGdlbmVyYXRlcyBlaXRoZXIgaW50MzJfdCAoUTRfMjcpIG9yIGZsb2F0IGRhdGEuCi0gKiBXZSB1c2UgdGhpcyBmdW5jdGlvbiB0byBjb252ZXJ0IHRoZSBlbmdpbmUgYnVmZmVycwotICogdG8gdGhlIGRlc2lyZWQgbWl4ZXIgb3V0cHV0IGZvcm1hdCwgZWl0aGVyIGludDE2X3QgKFEuMTUpIG9yIGZsb2F0LgotICovCi0vKiBzdGF0aWMgKi8KLXZvaWQgQXVkaW9NaXhlcjo6Y29udmVydE1peGVyRm9ybWF0KHZvaWQgKm91dCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQsCi0gICAgICAgIHZvaWQgKmluLCBhdWRpb19mb3JtYXRfdCBtaXhlckluRm9ybWF0LCBzaXplX3Qgc2FtcGxlQ291bnQpCi17Ci0gICAgc3dpdGNoIChtaXhlckluRm9ybWF0KSB7Ci0gICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgotICAgICAgICBzd2l0Y2ggKG1peGVyT3V0Rm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKLSAgICAgICAgICAgIG1lbWNweShvdXQsIGluLCBzYW1wbGVDb3VudCAqIHNpemVvZihmbG9hdCkpOyAvLyBNRU1DUFkuIFRPRE8gb3B0aW1pemUgb3V0Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKLSAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdCgoaW50MTZfdCopb3V0LCAoZmxvYXQqKWluLCBzYW1wbGVDb3VudCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlck91dEZvcm1hdDogJSN4IiwgbWl4ZXJPdXRGb3JtYXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKLSAgICAgICAgc3dpdGNoIChtaXhlck91dEZvcm1hdCkgewotICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6Ci0gICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9xNF8yNygoZmxvYXQqKW91dCwgKGNvbnN0IGludDMyX3QqKWluLCBzYW1wbGVDb3VudCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKLSAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9xNF8yNygoaW50MTZfdCopb3V0LCAoY29uc3QgaW50MzJfdCopaW4sIHNhbXBsZUNvdW50KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVyT3V0Rm9ybWF0OiAlI3giLCBtaXhlck91dEZvcm1hdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJJbkZvcm1hdDogJSN4IiwgbWl4ZXJJbkZvcm1hdCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotLyogUmV0dXJucyB0aGUgcHJvcGVyIHRyYWNrIGhvb2sgdG8gdXNlIGZvciBtaXhpbmcgdGhlIHRyYWNrIGludG8gdGhlIG91dHB1dCBidWZmZXIuCi0gKi8KLS8qIHN0YXRpYyAqLwotQXVkaW9NaXhlcjo6aG9va190IEF1ZGlvTWl4ZXI6OlRyYWNrOjpnZXRUcmFja0hvb2soaW50IHRyYWNrVHlwZSwgdWludDMyX3QgY2hhbm5lbENvdW50LAotICAgICAgICBhdWRpb19mb3JtYXRfdCBtaXhlckluRm9ybWF0LCBhdWRpb19mb3JtYXRfdCBtaXhlck91dEZvcm1hdCBfX3VudXNlZCkKLXsKLSAgICBpZiAoIWtVc2VOZXdNaXhlciAmJiBjaGFubmVsQ291bnQgPT0gRkNDXzIgJiYgbWl4ZXJJbkZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICBzd2l0Y2ggKHRyYWNrVHlwZSkgewotICAgICAgICBjYXNlIFRSQUNLVFlQRV9OT1A6Ci0gICAgICAgICAgICByZXR1cm4gJlRyYWNrOjp0cmFja19fbm9wOwotICAgICAgICBjYXNlIFRSQUNLVFlQRV9SRVNBTVBMRToKLSAgICAgICAgICAgIHJldHVybiAmVHJhY2s6OnRyYWNrX19nZW5lcmljUmVzYW1wbGU7Ci0gICAgICAgIGNhc2UgVFJBQ0tUWVBFX05PUkVTQU1QTEVNT05POgotICAgICAgICAgICAgcmV0dXJuICZUcmFjazo6dHJhY2tfXzE2Qml0c01vbm87Ci0gICAgICAgIGNhc2UgVFJBQ0tUWVBFX05PUkVTQU1QTEU6Ci0gICAgICAgICAgICByZXR1cm4gJlRyYWNrOjp0cmFja19fMTZCaXRzU3RlcmVvOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIHRyYWNrVHlwZTogJWQiLCB0cmFja1R5cGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihjaGFubmVsQ291bnQgPiBNQVhfTlVNX0NIQU5ORUxTKTsKLSAgICBzd2l0Y2ggKHRyYWNrVHlwZSkgewotICAgIGNhc2UgVFJBQ0tUWVBFX05PUDoKLSAgICAgICAgcmV0dXJuICZUcmFjazo6dHJhY2tfX25vcDsKLSAgICBjYXNlIFRSQUNLVFlQRV9SRVNBTVBMRToKLSAgICAgICAgc3dpdGNoIChtaXhlckluRm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKLSAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlcjo6aG9va190KSAmVHJhY2s6OnRyYWNrX19SZXNhbXBsZTwKLSAgICAgICAgICAgICAgICAgICAgTUlYVFlQRV9NVUxUSSwgZmxvYXQgLypUTyovLCBmbG9hdCAvKlRJKi8sIFRZUEVfQVVYPjsKLSAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKLSAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlcjo6aG9va190KSAmVHJhY2s6OnRyYWNrX19SZXNhbXBsZTwKLSAgICAgICAgICAgICAgICAgICAgTUlYVFlQRV9NVUxUSSwgaW50MzJfdCAvKlRPKi8sIGludDE2X3QgLypUSSovLCBUWVBFX0FVWD47Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJJbkZvcm1hdDogJSN4IiwgbWl4ZXJJbkZvcm1hdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFRSQUNLVFlQRV9OT1JFU0FNUExFTU9OTzoKLSAgICAgICAgc3dpdGNoIChtaXhlckluRm9ybWF0KSB7Ci0gICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKLSAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlcjo6aG9va190KSAmVHJhY2s6OnRyYWNrX19Ob1Jlc2FtcGxlPAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JWFRZUEVfTU9OT0VYUEFORCwgZmxvYXQgLypUTyovLCBmbG9hdCAvKlRJKi8sIFRZUEVfQVVYPjsKLSAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKLSAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlcjo6aG9va190KSAmVHJhY2s6OnRyYWNrX19Ob1Jlc2FtcGxlPAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JWFRZUEVfTU9OT0VYUEFORCwgaW50MzJfdCAvKlRPKi8sIGludDE2X3QgLypUSSovLCBUWVBFX0FVWD47Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJJbkZvcm1hdDogJSN4IiwgbWl4ZXJJbkZvcm1hdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIFRSQUNLVFlQRV9OT1JFU0FNUExFOgotICAgICAgICBzd2l0Y2ggKG1peGVySW5Gb3JtYXQpIHsKLSAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgotICAgICAgICAgICAgcmV0dXJuIChBdWRpb01peGVyOjpob29rX3QpICZUcmFjazo6dHJhY2tfX05vUmVzYW1wbGU8Ci0gICAgICAgICAgICAgICAgICAgIE1JWFRZUEVfTVVMVEksIGZsb2F0IC8qVE8qLywgZmxvYXQgLypUSSovLCBUWVBFX0FVWD47Ci0gICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6Ci0gICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXI6Omhvb2tfdCkgJlRyYWNrOjp0cmFja19fTm9SZXNhbXBsZTwKLSAgICAgICAgICAgICAgICAgICAgTUlYVFlQRV9NVUxUSSwgaW50MzJfdCAvKlRPKi8sIGludDE2X3QgLypUSSovLCBUWVBFX0FVWD47Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJJbkZvcm1hdDogJSN4IiwgbWl4ZXJJbkZvcm1hdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgdHJhY2tUeXBlOiAlZCIsIHRyYWNrVHlwZSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotLyogUmV0dXJucyB0aGUgcHJvcGVyIHByb2Nlc3MgaG9vayBmb3IgbWl4aW5nIHRyYWNrcy4gQ3VycmVudGx5IHdvcmtzIG9ubHkgZm9yCi0gKiBQUk9DRVNTVFlQRV9OT1JFU0FNUExFT05FVFJBQ0ssIGEgbWl4IGludm9sdmluZyBvbmUgdHJhY2ssIG5vIHJlc2FtcGxpbmcuCi0gKgotICogVE9ETzogRHVlIHRvIHRoZSBzcGVjaWFsIG1peGluZyBjb25zaWRlcmF0aW9ucyBvZiBkdXBsaWNhdGluZyB0bwotICogYSBzdGVyZW8gb3V0cHV0IHRyYWNrLCB0aGUgaW5wdXQgdHJhY2sgY2Fubm90IGJlIE1PTk8uICBUaGlzIHNob3VsZCBiZQotICogcHJldmVudGVkIGJ5IHRoZSBjYWxsZXIuCi0gKi8KLS8qIHN0YXRpYyAqLwotQXVkaW9NaXhlcjo6cHJvY2Vzc19ob29rX3QgQXVkaW9NaXhlcjo6Z2V0UHJvY2Vzc0hvb2soCi0gICAgICAgIGludCBwcm9jZXNzVHlwZSwgdWludDMyX3QgY2hhbm5lbENvdW50LAotICAgICAgICBhdWRpb19mb3JtYXRfdCBtaXhlckluRm9ybWF0LCBhdWRpb19mb3JtYXRfdCBtaXhlck91dEZvcm1hdCkKLXsKLSAgICBpZiAocHJvY2Vzc1R5cGUgIT0gUFJPQ0VTU1RZUEVfTk9SRVNBTVBMRU9ORVRSQUNLKSB7IC8vIE9ubHkgTk9SRVNBTVBMRU9ORVRSQUNLCi0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBwcm9jZXNzVHlwZTogJWQiLCBwcm9jZXNzVHlwZSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoIWtVc2VOZXdNaXhlciAmJiBjaGFubmVsQ291bnQgPT0gRkNDXzIgJiYgbWl4ZXJJbkZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgewotICAgICAgICByZXR1cm4gJkF1ZGlvTWl4ZXI6OnByb2Nlc3NfX29uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nOwotICAgIH0KLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNoYW5uZWxDb3VudCA+IE1BWF9OVU1fQ0hBTk5FTFMpOwotICAgIHN3aXRjaCAobWl4ZXJJbkZvcm1hdCkgewotICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKLSAgICAgICAgc3dpdGNoIChtaXhlck91dEZvcm1hdCkgewotICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6Ci0gICAgICAgICAgICByZXR1cm4gJkF1ZGlvTWl4ZXI6OnByb2Nlc3NfX25vUmVzYW1wbGVPbmVUcmFjazwKLSAgICAgICAgICAgICAgICAgICAgTUlYVFlQRV9NVUxUSV9TQVZFT05MWSwgZmxvYXQgLypUTyovLCBmbG9hdCAvKlRJKi8sIFRZUEVfQVVYPjsKLSAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKLSAgICAgICAgICAgIHJldHVybiAmQXVkaW9NaXhlcjo6cHJvY2Vzc19fbm9SZXNhbXBsZU9uZVRyYWNrPAotICAgICAgICAgICAgICAgICAgICBNSVhUWVBFX01VTFRJX1NBVkVPTkxZLCBpbnQxNl90IC8qVE8qLywgZmxvYXQgLypUSSovLCBUWVBFX0FVWD47Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJPdXRGb3JtYXQ6ICUjeCIsIG1peGVyT3V0Rm9ybWF0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6Ci0gICAgICAgIHN3aXRjaCAobWl4ZXJPdXRGb3JtYXQpIHsKLSAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgotICAgICAgICAgICAgcmV0dXJuICZBdWRpb01peGVyOjpwcm9jZXNzX19ub1Jlc2FtcGxlT25lVHJhY2s8Ci0gICAgICAgICAgICAgICAgICAgIE1JWFRZUEVfTVVMVElfU0FWRU9OTFksIGZsb2F0IC8qVE8qLywgaW50MTZfdCAvKlRJKi8sIFRZUEVfQVVYPjsKLSAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKLSAgICAgICAgICAgIHJldHVybiAmQXVkaW9NaXhlcjo6cHJvY2Vzc19fbm9SZXNhbXBsZU9uZVRyYWNrPAotICAgICAgICAgICAgICAgICAgICBNSVhUWVBFX01VTFRJX1NBVkVPTkxZLCBpbnQxNl90IC8qVE8qLywgaW50MTZfdCAvKlRJKi8sIFRZUEVfQVVYPjsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlck91dEZvcm1hdDogJSN4IiwgbWl4ZXJPdXRGb3JtYXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVySW5Gb3JtYXQ6ICUjeCIsIG1peGVySW5Gb3JtYXQpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb01peGVyQmFzZS5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlckJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YzA3N2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9NaXhlckJhc2UuY3BwCkBAIC0wLDAgKzEsMTY5MiBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb01peGVyIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KKyNpbmNsdWRlIDxjdXRpbHMvY29tcGlsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb01peGVyQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiQXVkaW9NaXhlck9wcy5oIgorCisvLyBUaGUgRkNDXzIgbWFjcm8gcmVmZXJzIHRvIHRoZSBGaXhlZCBDaGFubmVsIENvdW50IG9mIDIgZm9yIHRoZSBsZWdhY3kgaW50ZWdlciBtaXhlci4KKyNpZm5kZWYgRkNDXzIKKyNkZWZpbmUgRkNDXzIgMgorI2VuZGlmCisKKy8vIExvb2sgZm9yIE1PTk9fSEFDSyBmb3IgYW55IE1vbm8gaGFjayBpbnZvbHZpbmcgbGVnYWN5IG1vbm8gY2hhbm5lbCB0bworLy8gc3RlcmVvIGNoYW5uZWwgY29udmVyc2lvbi4KKworLyogVkVSWV9WRVJZX1ZFUkJPU0VfTE9HR0lORyB3aWxsIHNob3cgZXhhY3RseSB3aGljaCBwcm9jZXNzIGhvb2sgYW5kIHRyYWNrIGhvb2sgaXMKKyAqIGJlaW5nIHVzZWQuIFRoaXMgaXMgYSBjb25zaWRlcmFibGUgYW1vdW50IG9mIGxvZyBzcGFtLCBzbyBkb24ndCBlbmFibGUgdW5sZXNzIHlvdQorICogYXJlIHZlcmlmeWluZyB0aGUgaG9vayBiYXNlZCBjb2RlLgorICovCisvLyNkZWZpbmUgVkVSWV9WRVJZX1ZFUkJPU0VfTE9HR0lORworI2lmZGVmIFZFUllfVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNkZWZpbmUgQUxPR1ZWIEFMT0dWCisvL2RlZmluZSBBTE9HVlYgcHJpbnRmICAvLyBmb3IgdGVzdC1taXhlci5jcHAKKyNlbHNlCisjZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUgKDApCisjZW5kaWYKKworLy8gVE9ETzogcmVtb3ZlIEJMT0NLU0laRSB1bml0IG9mIHByb2Nlc3NpbmcgLSBpdCBpc24ndCBuZWVkZWQgYW55bW9yZS4KK3N0YXRpYyBjb25zdGV4cHIgaW50IEJMT0NLU0laRSA9IDE2OworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworYm9vbCBBdWRpb01peGVyQmFzZTo6aXNWYWxpZEZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Cit7CisgICAgc3dpdGNoIChmb3JtYXQpIHsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQ6CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRDoKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUOgorICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKworYm9vbCBBdWRpb01peGVyQmFzZTo6aXNWYWxpZENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdAoreworICAgIHJldHVybiBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spIDw9IE1BWF9OVU1fQ0hBTk5FTFM7Cit9CisKK3N0ZDo6c2hhcmVkX3B0cjxBdWRpb01peGVyQmFzZTo6VHJhY2tCYXNlPiBBdWRpb01peGVyQmFzZTo6cHJlQ3JlYXRlVHJhY2soKQoreworICAgIHJldHVybiBzdGQ6Om1ha2Vfc2hhcmVkPFRyYWNrQmFzZT4oKTsKK30KKworc3RhdHVzX3QgQXVkaW9NaXhlckJhc2U6OmNyZWF0ZSgKKyAgICAgICAgaW50IG5hbWUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBzZXNzaW9uSWQpCit7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihleGlzdHMobmFtZSksICJuYW1lICVkIGFscmVhZHkgZXhpc3RzIiwgbmFtZSk7CisKKyAgICBpZiAoIWlzVmFsaWRDaGFubmVsTWFzayhjaGFubmVsTWFzaykpIHsKKyAgICAgICAgQUxPR0UoIiVzIGludmFsaWQgY2hhbm5lbE1hc2s6ICUjeCIsIF9fZnVuY19fLCBjaGFubmVsTWFzayk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICghaXNWYWxpZEZvcm1hdChmb3JtYXQpKSB7CisgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIGZvcm1hdDogJSN4IiwgX19mdW5jX18sIGZvcm1hdCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgYXV0byB0ID0gcHJlQ3JlYXRlVHJhY2soKTsKKyAgICB7CisgICAgICAgIC8vIFRPRE86IG1vdmUgaW5pdGlhbGl6YXRpb24gdG8gdGhlIFRyYWNrIGNvbnN0cnVjdG9yLgorICAgICAgICAvLyBhc3N1bWUgZGVmYXVsdCBwYXJhbWV0ZXJzIGZvciB0aGUgdHJhY2ssIGV4Y2VwdCB3aGVyZSBub3RlZCBiZWxvdworICAgICAgICB0LT5uZWVkcyA9IDA7CisKKyAgICAgICAgLy8gSW50ZWdlciB2b2x1bWUuCisgICAgICAgIC8vIEN1cnJlbnRseSBpbnRlZ2VyIHZvbHVtZSBpcyBrZXB0IGZvciB0aGUgbGVnYWN5IGludGVnZXIgbWl4ZXIuCisgICAgICAgIC8vIFdpbGwgYmUgcmVtb3ZlZCB3aGVuIHRoZSBsZWdhY3kgbWl4ZXIgcGF0aCBpcyByZW1vdmVkLgorICAgICAgICB0LT52b2x1bWVbMF0gPSAwOworICAgICAgICB0LT52b2x1bWVbMV0gPSAwOworICAgICAgICB0LT5wcmV2Vm9sdW1lWzBdID0gMCA8PCAxNjsKKyAgICAgICAgdC0+cHJldlZvbHVtZVsxXSA9IDAgPDwgMTY7CisgICAgICAgIHQtPnZvbHVtZUluY1swXSA9IDA7CisgICAgICAgIHQtPnZvbHVtZUluY1sxXSA9IDA7CisgICAgICAgIHQtPmF1eExldmVsID0gMDsKKyAgICAgICAgdC0+YXV4SW5jID0gMDsKKyAgICAgICAgdC0+cHJldkF1eExldmVsID0gMDsKKworICAgICAgICAvLyBGbG9hdGluZyBwb2ludCB2b2x1bWUuCisgICAgICAgIHQtPm1Wb2x1bWVbMF0gPSAwLmY7CisgICAgICAgIHQtPm1Wb2x1bWVbMV0gPSAwLmY7CisgICAgICAgIHQtPm1QcmV2Vm9sdW1lWzBdID0gMC5mOworICAgICAgICB0LT5tUHJldlZvbHVtZVsxXSA9IDAuZjsKKyAgICAgICAgdC0+bVZvbHVtZUluY1swXSA9IDAuOworICAgICAgICB0LT5tVm9sdW1lSW5jWzFdID0gMC47CisgICAgICAgIHQtPm1BdXhMZXZlbCA9IDAuOworICAgICAgICB0LT5tQXV4SW5jID0gMC47CisgICAgICAgIHQtPm1QcmV2QXV4TGV2ZWwgPSAwLjsKKworICAgICAgICAvLyBubyBpbml0aWFsaXphdGlvbiBuZWVkZWQKKyAgICAgICAgLy8gdC0+ZnJhbWVDb3VudAorICAgICAgICB0LT5jaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgICAgICB0LT5lbmFibGVkID0gZmFsc2U7CisgICAgICAgIEFMT0dWX0lGKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAorICAgICAgICAgICAgICAgICJOb24tc3RlcmVvIGNoYW5uZWwgbWFzazogJWRcbiIsIGNoYW5uZWxNYXNrKTsKKyAgICAgICAgdC0+Y2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKKyAgICAgICAgdC0+c2Vzc2lvbklkID0gc2Vzc2lvbklkOworICAgICAgICAvLyBzZXRCdWZmZXJQcm92aWRlcihuYW1lLCBBdWRpb0J1ZmZlclByb3ZpZGVyICopIGlzIHJlcXVpcmVkIGJlZm9yZSBlbmFibGUobmFtZSkKKyAgICAgICAgdC0+YnVmZmVyUHJvdmlkZXIgPSBOVUxMOworICAgICAgICB0LT5idWZmZXIucmF3ID0gTlVMTDsKKyAgICAgICAgLy8gbm8gaW5pdGlhbGl6YXRpb24gbmVlZGVkCisgICAgICAgIC8vIHQtPmJ1ZmZlci5mcmFtZUNvdW50CisgICAgICAgIHQtPmhvb2sgPSBOVUxMOworICAgICAgICB0LT5tSW4gPSBOVUxMOworICAgICAgICB0LT5zYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CisgICAgICAgIC8vIHNldFBhcmFtZXRlcihuYW1lLCBUUkFDSywgTUFJTl9CVUZGRVIsIG1peEJ1ZmZlcikgaXMgcmVxdWlyZWQgYmVmb3JlIGVuYWJsZShuYW1lKQorICAgICAgICB0LT5tYWluQnVmZmVyID0gTlVMTDsKKyAgICAgICAgdC0+YXV4QnVmZmVyID0gTlVMTDsKKyAgICAgICAgdC0+bU1peGVyRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgICAgIHQtPm1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgIHQtPm1NaXhlckluRm9ybWF0ID0ga1VzZUZsb2F0ICYmIGtVc2VOZXdNaXhlciA/CisgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV9GTE9BVCA6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICB0LT5tTWl4ZXJDaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfbWFza19mcm9tX3JlcHJlc2VudGF0aW9uX2FuZF9iaXRzKAorICAgICAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT04sIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7CisgICAgICAgIHQtPm1NaXhlckNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayh0LT5tTWl4ZXJDaGFubmVsTWFzayk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHBvc3RDcmVhdGVUcmFjayh0LmdldCgpKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSykgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgbVRyYWNrc1tuYW1lXSA9IHQ7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9Cit9CisKKy8vIENhbGxlZCB3aGVuIGNoYW5uZWwgbWFza3MgaGF2ZSBjaGFuZ2VkIGZvciBhIHRyYWNrIG5hbWUKK2Jvb2wgQXVkaW9NaXhlckJhc2U6OnNldENoYW5uZWxNYXNrcyhpbnQgbmFtZSwKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgdHJhY2tDaGFubmVsTWFzaywgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWl4ZXJDaGFubmVsTWFzaykKK3sKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCFleGlzdHMobmFtZSksICJpbnZhbGlkIG5hbWU6ICVkIiwgbmFtZSk7CisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrQmFzZT4gJnRyYWNrID0gbVRyYWNrc1tuYW1lXTsKKworICAgIGlmICh0cmFja0NoYW5uZWxNYXNrID09IHRyYWNrLT5jaGFubmVsTWFzayAmJiBtaXhlckNoYW5uZWxNYXNrID09IHRyYWNrLT5tTWl4ZXJDaGFubmVsTWFzaykgeworICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBubyBuZWVkIHRvIGNoYW5nZQorICAgIH0KKyAgICAvLyBhbHdheXMgcmVjb21wdXRlIGZvciBib3RoIGNoYW5uZWwgbWFza3MgZXZlbiBpZiBvbmx5IG9uZSBoYXMgY2hhbmdlZC4KKyAgICBjb25zdCB1aW50MzJfdCB0cmFja0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayh0cmFja0NoYW5uZWxNYXNrKTsKKyAgICBjb25zdCB1aW50MzJfdCBtaXhlckNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtaXhlckNoYW5uZWxNYXNrKTsKKworICAgIEFMT0dfQVNTRVJUKHRyYWNrQ2hhbm5lbENvdW50ICYmIG1peGVyQ2hhbm5lbENvdW50KTsKKyAgICB0cmFjay0+Y2hhbm5lbE1hc2sgPSB0cmFja0NoYW5uZWxNYXNrOworICAgIHRyYWNrLT5jaGFubmVsQ291bnQgPSB0cmFja0NoYW5uZWxDb3VudDsKKyAgICB0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2sgPSBtaXhlckNoYW5uZWxNYXNrOworICAgIHRyYWNrLT5tTWl4ZXJDaGFubmVsQ291bnQgPSBtaXhlckNoYW5uZWxDb3VudDsKKworICAgIC8vIFJlc2FtcGxlciBjaGFubmVscyBtYXkgaGF2ZSBjaGFuZ2VkLgorICAgIHRyYWNrLT5yZWNyZWF0ZVJlc2FtcGxlcihtU2FtcGxlUmF0ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQXVkaW9NaXhlckJhc2U6OmRlc3Ryb3koaW50IG5hbWUpCit7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRighZXhpc3RzKG5hbWUpLCAiaW52YWxpZCBuYW1lOiAlZCIsIG5hbWUpOworICAgIEFMT0dWKCJkZWxldGVUcmFja05hbWUoJWQpIiwgbmFtZSk7CisKKyAgICBpZiAobVRyYWNrc1tuYW1lXS0+ZW5hYmxlZCkgeworICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgfQorICAgIG1UcmFja3MuZXJhc2UobmFtZSk7IC8vIGRlYWxsb2NhdGUgdHJhY2sKK30KKwordm9pZCBBdWRpb01peGVyQmFzZTo6ZW5hYmxlKGludCBuYW1lKQoreworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWV4aXN0cyhuYW1lKSwgImludmFsaWQgbmFtZTogJWQiLCBuYW1lKTsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2tCYXNlPiAmdHJhY2sgPSBtVHJhY2tzW25hbWVdOworCisgICAgaWYgKCF0cmFjay0+ZW5hYmxlZCkgeworICAgICAgICB0cmFjay0+ZW5hYmxlZCA9IHRydWU7CisgICAgICAgIEFMT0dWKCJlbmFibGUoJWQpIiwgbmFtZSk7CisgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9NaXhlckJhc2U6OmRpc2FibGUoaW50IG5hbWUpCit7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRighZXhpc3RzKG5hbWUpLCAiaW52YWxpZCBuYW1lOiAlZCIsIG5hbWUpOworICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFja0Jhc2U+ICZ0cmFjayA9IG1UcmFja3NbbmFtZV07CisKKyAgICBpZiAodHJhY2stPmVuYWJsZWQpIHsKKyAgICAgICAgdHJhY2stPmVuYWJsZWQgPSBmYWxzZTsKKyAgICAgICAgQUxPR1YoImRpc2FibGUoJWQpIiwgbmFtZSk7CisgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICB9Cit9CisKKy8qIFNldHMgdGhlIHZvbHVtZSByYW1wIHZhcmlhYmxlcyBmb3IgdGhlIEF1ZGlvTWl4ZXIuCisgKgorICogVGhlIHZvbHVtZSByYW1wIHZhcmlhYmxlcyBhcmUgdXNlZCB0byB0cmFuc2l0aW9uIGZyb20gdGhlIHByZXZpb3VzCisgKiB2b2x1bWUgdG8gdGhlIHNldCB2b2x1bWUuICByYW1wIGNvbnRyb2xzIHRoZSBkdXJhdGlvbiBvZiB0aGUgdHJhbnNpdGlvbi4KKyAqIEl0cyB2YWx1ZSBpcyB0eXBpY2FsbHkgb25lIHN0YXRlIGZyYW1lY291bnQgcGVyaW9kLCBidXQgbWF5IGFsc28gYmUgMCwKKyAqIG1lYW5pbmcgImltbWVkaWF0ZS4iCisgKgorICogRklYTUU6IDEpIFZvbHVtZSByYW1wIGlzIGVuYWJsZWQgb25seSBpZiB0aGVyZSBpcyBhIG5vbnplcm8gaW50ZWdlciBpbmNyZW1lbnQKKyAqIGV2ZW4gaWYgdGhlcmUgaXMgYSBub256ZXJvIGZsb2F0aW5nIHBvaW50IGluY3JlbWVudCAoaW4gdGhhdCBjYXNlLCB0aGUgdm9sdW1lCisgKiBjaGFuZ2UgaXMgaW1tZWRpYXRlKS4gIFRoaXMgcmVzdHJpY3Rpb24gc2hvdWxkIGJlIGNoYW5nZWQgd2hlbiB0aGUgbGVnYWN5IG1peGVyCisgKiBpcyByZW1vdmVkIChzZWUgIzIpLgorICogRklYTUU6IDIpIEludGVnZXIgdm9sdW1lIHZhcmlhYmxlcyBhcmUgdXNlZCBmb3IgTGVnYWN5IG1peGluZyBhbmQgc2hvdWxkIGJlIHJlbW92ZWQKKyAqIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZC4KKyAqCisgKiBAcGFyYW0gbmV3Vm9sdW1lIHNldCB2b2x1bWUgdGFyZ2V0IGluIGZsb2F0aW5nIHBvaW50IFswLjAsIDEuMF0uCisgKiBAcGFyYW0gcmFtcCBudW1iZXIgb2YgZnJhbWVzIHRvIGluY3JlbWVudCBvdmVyLiBpZiByYW1wIGlzIDAsIHRoZSB2b2x1bWUKKyAqIHNob3VsZCBiZSBzZXQgaW1tZWRpYXRlbHkuICBDdXJyZW50bHkgcmFtcCBzaG91bGQgbm90IGV4Y2VlZCA2NTUzNSAoZnJhbWVzKS4KKyAqIEBwYXJhbSBwSW50U2V0Vm9sdW1lIHBvaW50ZXIgdG8gdGhlIFU0LjEyIGludGVnZXIgdGFyZ2V0IHZvbHVtZSwgc2V0IG9uIHJldHVybi4KKyAqIEBwYXJhbSBwSW50UHJldlZvbHVtZSBwb2ludGVyIHRvIHRoZSBVNC4yOCBpbnRlZ2VyIHByZXZpb3VzIHZvbHVtZSwgc2V0IG9uIHJldHVybi4KKyAqIEBwYXJhbSBwSW50Vm9sdW1lSW5jIHBvaW50ZXIgdG8gdGhlIFU0LjI4IGluY3JlbWVudCBwZXIgb3V0cHV0IGF1ZGlvIGZyYW1lLCBzZXQgb24gcmV0dXJuLgorICogQHBhcmFtIHBTZXRWb2x1bWUgcG9pbnRlciB0byB0aGUgZmxvYXQgdGFyZ2V0IHZvbHVtZSwgc2V0IG9uIHJldHVybi4KKyAqIEBwYXJhbSBwUHJldlZvbHVtZSBwb2ludGVyIHRvIHRoZSBmbG9hdCBwcmV2aW91cyB2b2x1bWUsIHNldCBvbiByZXR1cm4uCisgKiBAcGFyYW0gcFZvbHVtZUluYyBwb2ludGVyIHRvIHRoZSBmbG9hdCBpbmNyZW1lbnQgcGVyIG91dHB1dCBhdWRpbyBmcmFtZSwgc2V0IG9uIHJldHVybi4KKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdm9sdW1lIGhhcyBjaGFuZ2VkLCBmYWxzZSBpZiB2b2x1bWUgaXMgc2FtZS4KKyAqLworc3RhdGljIGlubGluZSBib29sIHNldFZvbHVtZVJhbXBWYXJpYWJsZXMoZmxvYXQgbmV3Vm9sdW1lLCBpbnQzMl90IHJhbXAsCisgICAgICAgIGludDE2X3QgKnBJbnRTZXRWb2x1bWUsIGludDMyX3QgKnBJbnRQcmV2Vm9sdW1lLCBpbnQzMl90ICpwSW50Vm9sdW1lSW5jLAorICAgICAgICBmbG9hdCAqcFNldFZvbHVtZSwgZmxvYXQgKnBQcmV2Vm9sdW1lLCBmbG9hdCAqcFZvbHVtZUluYykgeworICAgIC8vIGNoZWNrIGZsb2F0aW5nIHBvaW50IHZvbHVtZSB0byBzZWUgaWYgaXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBwcmV2aW91c2x5CisgICAgLy8gc2V0IHZvbHVtZS4KKyAgICAvLyBXZSBkbyBub3QgdXNlIGEgdG9sZXJhbmNlIGhlcmUgKGFuZCByZWplY3QgY2hhbmdlcyB0b28gc21hbGwpCisgICAgLy8gYXMgaXQgbWF5IGJlIGNvbmZ1c2luZyB0byB1c2UgYSBkaWZmZXJlbnQgdmFsdWUgdGhhbiB0aGUgb25lIHNldC4KKyAgICAvLyBJZiB0aGUgcmVzdWx0aW5nIHZvbHVtZSBpcyB0b28gc21hbGwgdG8gcmFtcCwgaXQgaXMgYSBkaXJlY3Qgc2V0IG9mIHRoZSB2b2x1bWUuCisgICAgaWYgKG5ld1ZvbHVtZSA9PSAqcFNldFZvbHVtZSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChuZXdWb2x1bWUgPCAwKSB7CisgICAgICAgIG5ld1ZvbHVtZSA9IDA7IC8vIHNob3VsZCBub3QgaGF2ZSBuZWdhdGl2ZSB2b2x1bWVzCisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoIChmcGNsYXNzaWZ5KG5ld1ZvbHVtZSkpIHsKKyAgICAgICAgY2FzZSBGUF9TVUJOT1JNQUw6CisgICAgICAgIGNhc2UgRlBfTkFOOgorICAgICAgICAgICAgbmV3Vm9sdW1lID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZQX1pFUk86CisgICAgICAgICAgICBicmVhazsgLy8gemVybyB2b2x1bWUgaXMgZmluZQorICAgICAgICBjYXNlIEZQX0lORklOSVRFOgorICAgICAgICAgICAgLy8gSW5maW5pdGUgdm9sdW1lIGNvdWxkIGJlIGhhbmRsZWQgY29uc2lzdGVudGx5IHNpbmNlCisgICAgICAgICAgICAvLyBmbG9hdGluZyBwb2ludCBtYXRoIHNhdHVyYXRlcyBhdCBpbmZpbml0aWVzLAorICAgICAgICAgICAgLy8gYnV0IHdlIGxpbWl0IHZvbHVtZSB0byB1bml0eSBnYWluIGZsb2F0LgorICAgICAgICAgICAgLy8gcmFtcCA9IDA7IGJyZWFrOworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIG5ld1ZvbHVtZSA9IEF1ZGlvTWl4ZXJCYXNlOjpVTklUWV9HQUlOX0ZMT0FUOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRlBfTk9STUFMOgorICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgLy8gRmxvYXRpbmcgcG9pbnQgZG9lcyBub3QgaGF2ZSBwcm9ibGVtcyB3aXRoIG92ZXJmbG93IHdyYXAKKyAgICAgICAgICAgIC8vIHRoYXQgaW50ZWdlciBoYXMuICBIb3dldmVyLCB3ZSBsaW1pdCB0aGUgdm9sdW1lIHRvCisgICAgICAgICAgICAvLyB1bml0eSBnYWluIGhlcmUuCisgICAgICAgICAgICAvLyBUT0RPOiBSZXZpc2l0IHRoZSB2b2x1bWUgbGltaXRhdGlvbiBhbmQgcGVyaGFwcyBwYXJhbWV0ZXJpemUuCisgICAgICAgICAgICBpZiAobmV3Vm9sdW1lID4gQXVkaW9NaXhlckJhc2U6OlVOSVRZX0dBSU5fRkxPQVQpIHsKKyAgICAgICAgICAgICAgICBuZXdWb2x1bWUgPSBBdWRpb01peGVyQmFzZTo6VU5JVFlfR0FJTl9GTE9BVDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gc2V0IGZsb2F0aW5nIHBvaW50IHZvbHVtZSByYW1wCisgICAgaWYgKHJhbXAgIT0gMCkgeworICAgICAgICAvLyB3aGVuIHRoZSByYW1wIGNvbXBsZXRlcywgKnBQcmV2Vm9sdW1lIGlzIHNldCB0byAqcFNldFZvbHVtZSwgc28gdGhlcmUKKyAgICAgICAgLy8gaXMgbm8gY29tcHV0YXRpb25hbCBtaXNtYXRjaDsgaGVuY2UgZXF1YWxpdHkgaXMgY2hlY2tlZCBoZXJlLgorICAgICAgICBBTE9HRF9JRigqcFByZXZWb2x1bWUgIT0gKnBTZXRWb2x1bWUsICJwcmV2aW91cyBmbG9hdCByYW1wIGhhc24ndCBmaW5pc2hlZCwiCisgICAgICAgICAgICAgICAgIiBwcmV2OiVmICBzZXRfdG86JWYiLCAqcFByZXZWb2x1bWUsICpwU2V0Vm9sdW1lKTsKKyAgICAgICAgY29uc3QgZmxvYXQgaW5jID0gKG5ld1ZvbHVtZSAtICpwUHJldlZvbHVtZSkgLyByYW1wOyAvLyBjb3VsZCBiZSBpbmYsIG5hbiwgc3Vibm9ybWFsCisgICAgICAgIC8vIGNvdWxkIGJlIGluZiwgY2Fubm90IGJlIG5hbiwgc3Vibm9ybWFsCisgICAgICAgIGNvbnN0IGZsb2F0IG1heHYgPSBzdGQ6Om1heChuZXdWb2x1bWUsICpwUHJldlZvbHVtZSk7CisKKyAgICAgICAgaWYgKGlzbm9ybWFsKGluYykgLy8gaW5jIG11c3QgYmUgYSBub3JtYWwgbnVtYmVyIChubyBzdWJub3JtYWxzLCBpbmZpbml0ZSwgbmFuKQorICAgICAgICAgICAgICAgICYmIG1heHYgKyBpbmMgIT0gbWF4dikgeyAvLyBpbmMgbXVzdCBtYWtlIGZvcndhcmQgcHJvZ3Jlc3MKKyAgICAgICAgICAgICpwVm9sdW1lSW5jID0gaW5jOworICAgICAgICAgICAgLy8gcmFtcCBpcyBzZXQgbm93LgorICAgICAgICAgICAgLy8gTm90ZTogaWYgbmV3Vm9sdW1lIGlzIDAsIHRoZW4gbmVhciB0aGUgZW5kIG9mIHRoZSByYW1wLAorICAgICAgICAgICAgLy8gaXQgbWF5IGJlIHBvc3NpYmxlIHRoYXQgdGhlIHJhbXBlZCB2b2x1bWUgbWF5IGJlIHN1Ym5vcm1hbCBvcgorICAgICAgICAgICAgLy8gdGVtcG9yYXJpbHkgbmVnYXRpdmUgYnkgYSBzbWFsbCBhbW91bnQgb3Igc3Vibm9ybWFsIGR1ZSB0byBmbG9hdGluZworICAgICAgICAgICAgLy8gcG9pbnQgaW5hY2N1cmFjaWVzLgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmFtcCA9IDA7IC8vIHJhbXAgbm90IGFsbG93ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGNvbXB1dGUgYW5kIGNoZWNrIGludGVnZXIgdm9sdW1lLCBubyBuZWVkIHRvIGNoZWNrIG5lZ2F0aXZlIHZhbHVlcworICAgIC8vIFRoZSBpbnRlZ2VyIHZvbHVtZSBpcyBsaW1pdGVkIHRvICJ1bml0eV9nYWluIiB0byBhdm9pZCB3cmFwcGluZyBhbmQgb3RoZXIKKyAgICAvLyBhdWRpbyBhcnRpZmFjdHMsIHNvIGl0IG5ldmVyIHJlYWNoZXMgdGhlIHJhbmdlIGxpbWl0IG9mIFU0LjI4LgorICAgIC8vIFdlIHNhZmVseSB1c2Ugc2lnbmVkIDE2IGFuZCAzMiBiaXQgaW50ZWdlcnMgaGVyZS4KKyAgICBjb25zdCBmbG9hdCBzY2FsZWRWb2x1bWUgPSBuZXdWb2x1bWUgKiBBdWRpb01peGVyQmFzZTo6VU5JVFlfR0FJTl9JTlQ7IC8vIG5vdCBuZWcsIHN1Ym5vcm1hbCwgbmFuCisgICAgY29uc3QgaW50MzJfdCBpbnRWb2x1bWUgPSAoc2NhbGVkVm9sdW1lID49IChmbG9hdClBdWRpb01peGVyQmFzZTo6VU5JVFlfR0FJTl9JTlQpID8KKyAgICAgICAgICAgIEF1ZGlvTWl4ZXJCYXNlOjpVTklUWV9HQUlOX0lOVCA6IChpbnQzMl90KXNjYWxlZFZvbHVtZTsKKworICAgIC8vIHNldCBpbnRlZ2VyIHZvbHVtZSByYW1wCisgICAgaWYgKHJhbXAgIT0gMCkgeworICAgICAgICAvLyBpbnRlZ2VyIHZvbHVtZSBpcyBVNC4xMiAodG8gdXNlIDE2IGJpdCBtdWx0aXBsaWVzKSwgYnV0IHJhbXBpbmcgdXNlcyBVNC4yOC4KKyAgICAgICAgLy8gd2hlbiB0aGUgcmFtcCBjb21wbGV0ZXMsICpwSW50UHJldlZvbHVtZSBpcyBzZXQgdG8gKnBJbnRTZXRWb2x1bWUgPDwgMTYsIHNvIHRoZXJlCisgICAgICAgIC8vIGlzIG5vIGNvbXB1dGF0aW9uYWwgbWlzbWF0Y2g7IGhlbmNlIGVxdWFsaXR5IGlzIGNoZWNrZWQgaGVyZS4KKyAgICAgICAgQUxPR0RfSUYoKnBJbnRQcmV2Vm9sdW1lICE9ICpwSW50U2V0Vm9sdW1lIDw8IDE2LCAicHJldmlvdXMgaW50IHJhbXAgaGFzbid0IGZpbmlzaGVkLCIKKyAgICAgICAgICAgICAgICAiIHByZXY6JWQgIHNldF90bzolZCIsICpwSW50UHJldlZvbHVtZSwgKnBJbnRTZXRWb2x1bWUgPDwgMTYpOworICAgICAgICBjb25zdCBpbnQzMl90IGluYyA9ICgoaW50Vm9sdW1lIDw8IDE2KSAtICpwSW50UHJldlZvbHVtZSkgLyByYW1wOworCisgICAgICAgIGlmIChpbmMgIT0gMCkgeyAvLyBpbmMgbXVzdCBtYWtlIGZvcndhcmQgcHJvZ3Jlc3MKKyAgICAgICAgICAgICpwSW50Vm9sdW1lSW5jID0gaW5jOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmFtcCA9IDA7IC8vIHJhbXAgbm90IGFsbG93ZWQKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGlmIG5vIHJhbXAsIG9yIHJhbXAgbm90IGFsbG93ZWQsIHRoZW4gY2xlYXIgZmxvYXQgYW5kIGludGVnZXIgaW5jcmVtZW50cworICAgIGlmIChyYW1wID09IDApIHsKKyAgICAgICAgKnBWb2x1bWVJbmMgPSAwOworICAgICAgICAqcFByZXZWb2x1bWUgPSBuZXdWb2x1bWU7CisgICAgICAgICpwSW50Vm9sdW1lSW5jID0gMDsKKyAgICAgICAgKnBJbnRQcmV2Vm9sdW1lID0gaW50Vm9sdW1lIDw8IDE2OworICAgIH0KKyAgICAqcFNldFZvbHVtZSA9IG5ld1ZvbHVtZTsKKyAgICAqcEludFNldFZvbHVtZSA9IGludFZvbHVtZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBBdWRpb01peGVyQmFzZTo6c2V0UGFyYW1ldGVyKGludCBuYW1lLCBpbnQgdGFyZ2V0LCBpbnQgcGFyYW0sIHZvaWQgKnZhbHVlKQoreworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWV4aXN0cyhuYW1lKSwgImludmFsaWQgbmFtZTogJWQiLCBuYW1lKTsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2tCYXNlPiAmdHJhY2sgPSBtVHJhY2tzW25hbWVdOworCisgICAgaW50IHZhbHVlSW50ID0gc3RhdGljX2Nhc3Q8aW50PihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4odmFsdWUpKTsKKyAgICBpbnQzMl90ICp2YWx1ZUJ1ZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MzJfdCo+KHZhbHVlKTsKKworICAgIHN3aXRjaCAodGFyZ2V0KSB7CisKKyAgICBjYXNlIFRSQUNLOgorICAgICAgICBzd2l0Y2ggKHBhcmFtKSB7CisgICAgICAgIGNhc2UgQ0hBTk5FTF9NQVNLOiB7CisgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCB0cmFja0NoYW5uZWxNYXNrID0KKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4odmFsdWVJbnQpOworICAgICAgICAgICAgaWYgKHNldENoYW5uZWxNYXNrcyhuYW1lLCB0cmFja0NoYW5uZWxNYXNrLCB0cmFjay0+bU1peGVyQ2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgQ0hBTk5FTF9NQVNLLCAleCkiLCB0cmFja0NoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIE1BSU5fQlVGRkVSOgorICAgICAgICAgICAgaWYgKHRyYWNrLT5tYWluQnVmZmVyICE9IHZhbHVlQnVmKSB7CisgICAgICAgICAgICAgICAgdHJhY2stPm1haW5CdWZmZXIgPSB2YWx1ZUJ1ZjsKKyAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBNQUlOX0JVRkZFUiwgJXApIiwgdmFsdWVCdWYpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFVWF9CVUZGRVI6CisgICAgICAgICAgICBpZiAodHJhY2stPmF1eEJ1ZmZlciAhPSB2YWx1ZUJ1ZikgeworICAgICAgICAgICAgICAgIHRyYWNrLT5hdXhCdWZmZXIgPSB2YWx1ZUJ1ZjsKKyAgICAgICAgICAgICAgICBBTE9HVigic2V0UGFyYW1ldGVyKFRSQUNLLCBBVVhfQlVGRkVSLCAlcCkiLCB2YWx1ZUJ1Zik7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgRk9STUFUOiB7CisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBzdGF0aWNfY2FzdDxhdWRpb19mb3JtYXRfdD4odmFsdWVJbnQpOworICAgICAgICAgICAgaWYgKHRyYWNrLT5tRm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSwgIkludmFsaWQgZm9ybWF0ICUjeCIsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgdHJhY2stPm1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgRk9STUFULCAlI3gpIiwgZm9ybWF0KTsKKyAgICAgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIE1JWEVSX0ZPUk1BVDogeworICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fZm9ybWF0X3Q+KHZhbHVlSW50KTsKKyAgICAgICAgICAgIGlmICh0cmFjay0+bU1peGVyRm9ybWF0ICE9IGZvcm1hdCkgeworICAgICAgICAgICAgICAgIHRyYWNrLT5tTWl4ZXJGb3JtYXQgPSBmb3JtYXQ7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihUUkFDSywgTUlYRVJfRk9STUFULCAlI3gpIiwgZm9ybWF0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgTUlYRVJfQ0hBTk5FTF9NQVNLOiB7CisgICAgICAgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckNoYW5uZWxNYXNrID0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KHZhbHVlSW50KTsKKyAgICAgICAgICAgIGlmIChzZXRDaGFubmVsTWFza3MobmFtZSwgdHJhY2stPmNoYW5uZWxNYXNrLCBtaXhlckNoYW5uZWxNYXNrKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoVFJBQ0ssIE1JWEVSX0NIQU5ORUxfTUFTSywgJSN4KSIsIG1peGVyQ2hhbm5lbE1hc2spOworICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJzZXRQYXJhbWV0ZXIgdHJhY2s6IGJhZCBwYXJhbSAlZCIsIHBhcmFtKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgIGNhc2UgUkVTQU1QTEU6CisgICAgICAgIHN3aXRjaCAocGFyYW0pIHsKKyAgICAgICAgY2FzZSBTQU1QTEVfUkFURToKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKHZhbHVlSW50ID4gMCwgImJhZCBzYW1wbGUgcmF0ZSAlZCIsIHZhbHVlSW50KTsKKyAgICAgICAgICAgIGlmICh0cmFjay0+c2V0UmVzYW1wbGVyKHVpbnQzMl90KHZhbHVlSW50KSwgbVNhbXBsZVJhdGUpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlcihSRVNBTVBMRSwgU0FNUExFX1JBVEUsICV1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCh2YWx1ZUludCkpOworICAgICAgICAgICAgICAgIGludmFsaWRhdGUoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJFU0VUOgorICAgICAgICAgICAgdHJhY2stPnJlc2V0UmVzYW1wbGVyKCk7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBSRU1PVkU6CisgICAgICAgICAgICB0cmFjay0+bVJlc2FtcGxlci5yZXNldChudWxscHRyKTsKKyAgICAgICAgICAgIHRyYWNrLT5zYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CisgICAgICAgICAgICBpbnZhbGlkYXRlKCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoInNldFBhcmFtZXRlciByZXNhbXBsZTogYmFkIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBSQU1QX1ZPTFVNRToKKyAgICBjYXNlIFZPTFVNRToKKyAgICAgICAgc3dpdGNoIChwYXJhbSkgeworICAgICAgICBjYXNlIEFVWExFVkVMOgorICAgICAgICAgICAgaWYgKHNldFZvbHVtZVJhbXBWYXJpYWJsZXMoKnJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQqPih2YWx1ZSksCisgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9PSBSQU1QX1ZPTFVNRSA/IG1GcmFtZUNvdW50IDogMCwKKyAgICAgICAgICAgICAgICAgICAgJnRyYWNrLT5hdXhMZXZlbCwgJnRyYWNrLT5wcmV2QXV4TGV2ZWwsICZ0cmFjay0+YXV4SW5jLAorICAgICAgICAgICAgICAgICAgICAmdHJhY2stPm1BdXhMZXZlbCwgJnRyYWNrLT5tUHJldkF1eExldmVsLCAmdHJhY2stPm1BdXhJbmMpKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInNldFBhcmFtZXRlciglcywgQVVYTEVWRUw6ICUwNHgpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9PSBWT0xVTUUgPyAiVk9MVU1FIiA6ICJSQU1QX1ZPTFVNRSIsIHRyYWNrLT5hdXhMZXZlbCk7CisgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBpZiAoKHVuc2lnbmVkKXBhcmFtID49IFZPTFVNRTAgJiYgKHVuc2lnbmVkKXBhcmFtIDwgVk9MVU1FMCArIE1BWF9OVU1fVk9MVU1FUykgeworICAgICAgICAgICAgICAgIGlmIChzZXRWb2x1bWVSYW1wVmFyaWFibGVzKCpyZWludGVycHJldF9jYXN0PGZsb2F0Kj4odmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID09IFJBTVBfVk9MVU1FID8gbUZyYW1lQ291bnQgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrLT52b2x1bWVbcGFyYW0gLSBWT0xVTUUwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFjay0+cHJldlZvbHVtZVtwYXJhbSAtIFZPTFVNRTBdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrLT52b2x1bWVJbmNbcGFyYW0gLSBWT0xVTUUwXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZ0cmFjay0+bVZvbHVtZVtwYXJhbSAtIFZPTFVNRTBdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrLT5tUHJldlZvbHVtZVtwYXJhbSAtIFZPTFVNRTBdLAorICAgICAgICAgICAgICAgICAgICAgICAgJnRyYWNrLT5tVm9sdW1lSW5jW3BhcmFtIC0gVk9MVU1FMF0pKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzZXRQYXJhbWV0ZXIoJXMsIFZPTFVNRSVkOiAlMDR4KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID09IFZPTFVNRSA/ICJWT0xVTUUiIDogIlJBTVBfVk9MVU1FIiwgcGFyYW0gLSBWT0xVTUUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnZvbHVtZVtwYXJhbSAtIFZPTFVNRTBdKTsKKyAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgic2V0UGFyYW1ldGVyIHZvbHVtZTogYmFkIHBhcmFtICVkIiwgcGFyYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgic2V0UGFyYW1ldGVyOiBiYWQgdGFyZ2V0ICVkIiwgdGFyZ2V0KTsKKyAgICB9Cit9CisKK2Jvb2wgQXVkaW9NaXhlckJhc2U6OlRyYWNrQmFzZTo6c2V0UmVzYW1wbGVyKHVpbnQzMl90IHRyYWNrU2FtcGxlUmF0ZSwgdWludDMyX3QgZGV2U2FtcGxlUmF0ZSkKK3sKKyAgICBpZiAodHJhY2tTYW1wbGVSYXRlICE9IGRldlNhbXBsZVJhdGUgfHwgbVJlc2FtcGxlci5nZXQoKSAhPSBudWxscHRyKSB7CisgICAgICAgIGlmIChzYW1wbGVSYXRlICE9IHRyYWNrU2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgc2FtcGxlUmF0ZSA9IHRyYWNrU2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIGlmIChtUmVzYW1wbGVyLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiQ3JlYXRpbmcgcmVzYW1wbGVyIGZyb20gdHJhY2sgJWQgSHogdG8gZGV2aWNlICVkIEh6IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrU2FtcGxlUmF0ZSwgZGV2U2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgQXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IHF1YWxpdHk7CisgICAgICAgICAgICAgICAgLy8gZm9yY2UgbG93ZXN0IHF1YWxpdHkgbGV2ZWwgcmVzYW1wbGVyIGlmIHVzZSBjYXNlIGlzbid0IG11c2ljIG9yIHZpZGVvCisgICAgICAgICAgICAgICAgLy8gRklYTUUgdGhpcyBpcyBmbGF3ZWQgZm9yIGR5bmFtaWMgc2FtcGxlIHJhdGVzLCBhcyB3ZSBjaG9vc2UgdGhlIHJlc2FtcGxlcgorICAgICAgICAgICAgICAgIC8vIHF1YWxpdHkgbGV2ZWwgYmFzZWQgb24gdGhlIGluaXRpYWwgcmF0aW8sIGJ1dCB0aGF0IGNvdWxkIGNoYW5nZSBsYXRlci4KKyAgICAgICAgICAgICAgICAvLyBTaG91bGQgaGF2ZSBhIHdheSB0byBkaXN0aW5ndWlzaCB0cmFja3Mgd2l0aCBzdGF0aWMgcmF0aW9zIHZzLiBkeW5hbWljIHJhdGlvcy4KKyAgICAgICAgICAgICAgICBpZiAoaXNNdXNpY1JhdGUodHJhY2tTYW1wbGVSYXRlKSkgeworICAgICAgICAgICAgICAgICAgICBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OkRFRkFVTFRfUVVBTElUWTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBxdWFsaXR5ID0gQXVkaW9SZXNhbXBsZXI6OkRZTl9MT1dfUVVBTElUWTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZW1vdmUgTU9OT19IQUNLLiBSZXNhbXBsZXIgc2VlcyAjY2hhbm5lbHMgYWZ0ZXIgdGhlIGRvd25taXhlcgorICAgICAgICAgICAgICAgIC8vIGJ1dCBpZiBub25lIGV4aXN0cywgaXQgaXMgdGhlIGNoYW5uZWwgY291bnQgKDEgZm9yIG1vbm8pLgorICAgICAgICAgICAgICAgIGNvbnN0IGludCByZXNhbXBsZXJDaGFubmVsQ291bnQgPSBnZXRPdXRwdXRDaGFubmVsQ291bnQoKTsKKyAgICAgICAgICAgICAgICBBTE9HVlYoIkNyZWF0aW5nIHJlc2FtcGxlcjoiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGZvcm1hdCglI3gpIGNoYW5uZWxzKCVkKSBkZXZTYW1wbGVSYXRlKCV1KSBxdWFsaXR5KCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlckluRm9ybWF0LCByZXNhbXBsZXJDaGFubmVsQ291bnQsIGRldlNhbXBsZVJhdGUsIHF1YWxpdHkpOworICAgICAgICAgICAgICAgIG1SZXNhbXBsZXIucmVzZXQoQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlckluRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzYW1wbGVyQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgZGV2U2FtcGxlUmF0ZSwgcXVhbGl0eSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCisvKiBDaGVja3MgdG8gc2VlIGlmIHRoZSB2b2x1bWUgcmFtcCBoYXMgY29tcGxldGVkIGFuZCBjbGVhcnMgdGhlIGluY3JlbWVudAorICogdmFyaWFibGVzIGFwcHJvcHJpYXRlbHkuCisgKgorICogRklYTUU6IFRoZXJlIGlzIGNvZGUgdG8gaGFuZGxlIGludC9mbG9hdCByYW1wIHZhcmlhYmxlIHN3aXRjaG92ZXIgc2hvdWxkIGl0IG5vdAorICogY29tcGxldGUgd2l0aGluIGEgbWl4ZXIgYnVmZmVyIHByb2Nlc3NpbmcgY2FsbCwgYnV0IGl0IGlzIHByZWZlcnJlZCB0byBhdm9pZCBzd2l0Y2hvdmVyCisgKiBkdWUgdG8gcHJlY2lzaW9uIGlzc3Vlcy4gIFRoZSBzd2l0Y2hvdmVyIGNvZGUgaXMgaW5jbHVkZWQgZm9yIGxlZ2FjeSBjb2RlIHB1cnBvc2VzCisgKiBhbmQgY2FuIGJlIHJlbW92ZWQgb25jZSB0aGUgaW50ZWdlciB2b2x1bWUgaXMgcmVtb3ZlZC4KKyAqCisgKiBJdCBpcyBub3Qgc3VmZmljaWVudCB0byBjbGVhciBvbmx5IHRoZSB2b2x1bWVJbmMgaW50ZWdlciB2YXJpYWJsZSBiZWNhdXNlCisgKiBpZiBvbmUgY2hhbm5lbCByZXF1aXJlcyByYW1waW5nLCBhbGwgY2hhbm5lbHMgYXJlIHJhbXBlZC4KKyAqCisgKiBUaGVyZSBpcyBhIGJpdCBvZiBkdXBsaWNhdGVkIGNvZGUgaGVyZSwgYnV0IGl0IGtlZXBzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCisgKi8KK3ZvaWQgQXVkaW9NaXhlckJhc2U6OlRyYWNrQmFzZTo6YWRqdXN0Vm9sdW1lUmFtcChib29sIGF1eCwgYm9vbCB1c2VGbG9hdCkKK3sKKyAgICBpZiAodXNlRmxvYXQpIHsKKyAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IE1BWF9OVU1fVk9MVU1FUzsgaSsrKSB7CisgICAgICAgICAgICBpZiAoKG1Wb2x1bWVJbmNbaV0gPiAwICYmIG1QcmV2Vm9sdW1lW2ldICsgbVZvbHVtZUluY1tpXSA+PSBtVm9sdW1lW2ldKSB8fAorICAgICAgICAgICAgICAgICAgICAgKG1Wb2x1bWVJbmNbaV0gPCAwICYmIG1QcmV2Vm9sdW1lW2ldICsgbVZvbHVtZUluY1tpXSA8PSBtVm9sdW1lW2ldKSkgeworICAgICAgICAgICAgICAgIHZvbHVtZUluY1tpXSA9IDA7CisgICAgICAgICAgICAgICAgcHJldlZvbHVtZVtpXSA9IHZvbHVtZVtpXSA8PCAxNjsKKyAgICAgICAgICAgICAgICBtVm9sdW1lSW5jW2ldID0gMC47CisgICAgICAgICAgICAgICAgbVByZXZWb2x1bWVbaV0gPSBtVm9sdW1lW2ldOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL0FMT0dWKCJyYW1wOiAlZiAlZiAlZiIsIG1Wb2x1bWVbaV0sIG1QcmV2Vm9sdW1lW2ldLCBtVm9sdW1lSW5jW2ldKTsKKyAgICAgICAgICAgICAgICBwcmV2Vm9sdW1lW2ldID0gdTRfMjhfZnJvbV9mbG9hdChtUHJldlZvbHVtZVtpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgTUFYX05VTV9WT0xVTUVTOyBpKyspIHsKKyAgICAgICAgICAgIGlmICgoKHZvbHVtZUluY1tpXT4wKSAmJiAoKChwcmV2Vm9sdW1lW2ldK3ZvbHVtZUluY1tpXSk+PjE2KSA+PSB2b2x1bWVbaV0pKSB8fAorICAgICAgICAgICAgICAgICAgICAoKHZvbHVtZUluY1tpXTwwKSAmJiAoKChwcmV2Vm9sdW1lW2ldK3ZvbHVtZUluY1tpXSk+PjE2KSA8PSB2b2x1bWVbaV0pKSkgeworICAgICAgICAgICAgICAgIHZvbHVtZUluY1tpXSA9IDA7CisgICAgICAgICAgICAgICAgcHJldlZvbHVtZVtpXSA9IHZvbHVtZVtpXSA8PCAxNjsKKyAgICAgICAgICAgICAgICBtVm9sdW1lSW5jW2ldID0gMC47CisgICAgICAgICAgICAgICAgbVByZXZWb2x1bWVbaV0gPSBtVm9sdW1lW2ldOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvL0FMT0dWKCJyYW1wOiAlZCAlZCAlZCIsIHZvbHVtZVtpXSA8PCAxNiwgcHJldlZvbHVtZVtpXSwgdm9sdW1lSW5jW2ldKTsKKyAgICAgICAgICAgICAgICBtUHJldlZvbHVtZVtpXSAgPSBmbG9hdF9mcm9tX3U0XzI4KHByZXZWb2x1bWVbaV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGF1eCkgeworI2lmZGVmIEZMT0FUX0FVWAorICAgICAgICBpZiAodXNlRmxvYXQpIHsKKyAgICAgICAgICAgIGlmICgobUF1eEluYyA+IDAuZiAmJiBtUHJldkF1eExldmVsICsgbUF1eEluYyA+PSBtQXV4TGV2ZWwpIHx8CisgICAgICAgICAgICAgICAgICAgIChtQXV4SW5jIDwgMC5mICYmIG1QcmV2QXV4TGV2ZWwgKyBtQXV4SW5jIDw9IG1BdXhMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICBhdXhJbmMgPSAwOworICAgICAgICAgICAgICAgIHByZXZBdXhMZXZlbCA9IGF1eExldmVsIDw8IDE2OworICAgICAgICAgICAgICAgIG1BdXhJbmMgPSAwLmY7CisgICAgICAgICAgICAgICAgbVByZXZBdXhMZXZlbCA9IG1BdXhMZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgaWYgKChhdXhJbmMgPiAwICYmICgocHJldkF1eExldmVsICsgYXV4SW5jKSA+PiAxNikgPj0gYXV4TGV2ZWwpIHx8CisgICAgICAgICAgICAgICAgKGF1eEluYyA8IDAgJiYgKChwcmV2QXV4TGV2ZWwgKyBhdXhJbmMpID4+IDE2KSA8PSBhdXhMZXZlbCkpIHsKKyAgICAgICAgICAgIGF1eEluYyA9IDA7CisgICAgICAgICAgICBwcmV2QXV4TGV2ZWwgPSBhdXhMZXZlbCA8PCAxNjsKKyAgICAgICAgICAgIG1BdXhJbmMgPSAwLmY7CisgICAgICAgICAgICBtUHJldkF1eExldmVsID0gbUF1eExldmVsOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvTWl4ZXJCYXNlOjpUcmFja0Jhc2U6OnJlY3JlYXRlUmVzYW1wbGVyKHVpbnQzMl90IGRldlNhbXBsZVJhdGUpCit7CisgICAgaWYgKG1SZXNhbXBsZXIuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBjb25zdCB1aW50MzJfdCByZXNldFRvU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgICAgIG1SZXNhbXBsZXIucmVzZXQobnVsbHB0cik7CisgICAgICAgIHNhbXBsZVJhdGUgPSBkZXZTYW1wbGVSYXRlOyAvLyB3aXRob3V0IHJlc2FtcGxlciwgdHJhY2sgcmF0ZSBpcyBkZXZpY2Ugc2FtcGxlIHJhdGUuCisgICAgICAgIC8vIHJlY3JlYXRlIHRoZSByZXNhbXBsZXIgd2l0aCB1cGRhdGVkIGZvcm1hdCwgY2hhbm5lbHMsIHNhdmVkIHNhbXBsZVJhdGUuCisgICAgICAgIHNldFJlc2FtcGxlcihyZXNldFRvU2FtcGxlUmF0ZSAvKnRyYWNrU2FtcGxlUmF0ZSovLCBkZXZTYW1wbGVSYXRlKTsKKyAgICB9Cit9CisKK3NpemVfdCBBdWRpb01peGVyQmFzZTo6Z2V0VW5yZWxlYXNlZEZyYW1lcyhpbnQgbmFtZSkgY29uc3QKK3sKKyAgICBjb25zdCBhdXRvIGl0ID0gbVRyYWNrcy5maW5kKG5hbWUpOworICAgIGlmIChpdCAhPSBtVHJhY2tzLmVuZCgpKSB7CisgICAgICAgIHJldHVybiBpdC0+c2Vjb25kLT5nZXRVbnJlbGVhc2VkRnJhbWVzKCk7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGQ6OnN0cmluZyBBdWRpb01peGVyQmFzZTo6dHJhY2tOYW1lcygpIGNvbnN0Cit7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgZm9yIChjb25zdCBhdXRvICZwYWlyIDogbVRyYWNrcykgeworICAgICAgICBzcyA8PCBwYWlyLmZpcnN0IDw8ICIgIjsKKyAgICB9CisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCit2b2lkIEF1ZGlvTWl4ZXJCYXNlOjpwcm9jZXNzX192YWxpZGF0ZSgpCit7CisgICAgLy8gVE9ETzogZml4IGFsbDE2Qml0c1N0ZXJlTm9SZXNhbXBsZSBsb2dpYyB0bworICAgIC8vIGVpdGhlciBwcm9wZXJseSBoYW5kbGUgbXV0ZWQgdHJhY2tzIChpdCBzaG91bGQgaWdub3JlIHRoZW0pCisgICAgLy8gb3IgcmVtb3ZlIGFsdG9nZXRoZXIgYXMgYW4gb2Jzb2xldGUgb3B0aW1pemF0aW9uLgorICAgIGJvb2wgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSA9IHRydWU7CisgICAgYm9vbCByZXNhbXBsaW5nID0gZmFsc2U7CisgICAgYm9vbCB2b2x1bWVSYW1wID0gZmFsc2U7CisKKyAgICBtRW5hYmxlZC5jbGVhcigpOworICAgIG1Hcm91cHMuY2xlYXIoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBtVHJhY2tzKSB7CisgICAgICAgIGNvbnN0IGludCBuYW1lID0gcGFpci5maXJzdDsKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrQmFzZT4gJnQgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgaWYgKCF0LT5lbmFibGVkKSBjb250aW51ZTsKKworICAgICAgICBtRW5hYmxlZC5lbXBsYWNlX2JhY2sobmFtZSk7ICAvLyB3ZSBhZGQgdG8gbUVuYWJsZWQgaW4gb3JkZXIgb2YgbmFtZS4KKyAgICAgICAgbUdyb3Vwc1t0LT5tYWluQnVmZmVyXS5lbXBsYWNlX2JhY2sobmFtZSk7IC8vIG1Hcm91cHMgYWxzbyBpbiBvcmRlciBvZiBuYW1lLgorCisgICAgICAgIHVpbnQzMl90IG4gPSAwOworICAgICAgICAvLyBGSVhNRSBjYW4gb3ZlcmZsb3cgKG1hc2sgaXMgb25seSAzIGJpdHMpCisgICAgICAgIG4gfD0gTkVFRFNfQ0hBTk5FTF8xICsgdC0+Y2hhbm5lbENvdW50IC0gMTsKKyAgICAgICAgaWYgKHQtPmRvZXNSZXNhbXBsZSgpKSB7CisgICAgICAgICAgICBuIHw9IE5FRURTX1JFU0FNUExFOworICAgICAgICB9CisgICAgICAgIGlmICh0LT5hdXhMZXZlbCAhPSAwICYmIHQtPmF1eEJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgICAgICBuIHw9IE5FRURTX0FVWDsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0LT52b2x1bWVJbmNbMF18dC0+dm9sdW1lSW5jWzFdKSB7CisgICAgICAgICAgICB2b2x1bWVSYW1wID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmICghdC0+ZG9lc1Jlc2FtcGxlKCkgJiYgdC0+dm9sdW1lUkwgPT0gMCkgeworICAgICAgICAgICAgbiB8PSBORUVEU19NVVRFOworICAgICAgICB9CisgICAgICAgIHQtPm5lZWRzID0gbjsKKworICAgICAgICBpZiAobiAmIE5FRURTX01VVEUpIHsKKyAgICAgICAgICAgIHQtPmhvb2sgPSAmVHJhY2tCYXNlOjp0cmFja19fbm9wOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKG4gJiBORUVEU19BVVgpIHsKKyAgICAgICAgICAgICAgICBhbGwxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxlID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAobiAmIE5FRURTX1JFU0FNUExFKSB7CisgICAgICAgICAgICAgICAgYWxsMTZCaXRzU3RlcmVvTm9SZXNhbXBsZSA9IGZhbHNlOworICAgICAgICAgICAgICAgIHJlc2FtcGxpbmcgPSB0cnVlOworICAgICAgICAgICAgICAgIHQtPmhvb2sgPSBUcmFja0Jhc2U6OmdldFRyYWNrSG9vayhUUkFDS1RZUEVfUkVTQU1QTEUsIHQtPm1NaXhlckNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1NaXhlckluRm9ybWF0LCB0LT5tTWl4ZXJGb3JtYXQpOworICAgICAgICAgICAgICAgIEFMT0dWX0lGKChuICYgTkVFRFNfQ0hBTk5FTF9DT1VOVF9fTUFTSykgPiBORUVEU19DSEFOTkVMXzIsCisgICAgICAgICAgICAgICAgICAgICAgICAiVHJhY2sgJWQgbmVlZHMgZG93bm1peCArIHJlc2FtcGxlIiwgbmFtZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICgobiAmIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0spID09IE5FRURTX0NIQU5ORUxfMSl7CisgICAgICAgICAgICAgICAgICAgIHQtPmhvb2sgPSBUcmFja0Jhc2U6OmdldFRyYWNrSG9vaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodC0+bU1peGVyQ2hhbm5lbE1hc2sgPT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPICAvLyBUT0RPOiBNT05PX0hBQ0sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHQtPmNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX01PTk8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gVFJBQ0tUWVBFX05PUkVTQU1QTEVNT05PIDogVFJBQ0tUWVBFX05PUkVTQU1QTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+bU1peGVyQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1NaXhlckluRm9ybWF0LCB0LT5tTWl4ZXJGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBhbGwxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxlID0gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgobiAmIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0spID49IE5FRURTX0NIQU5ORUxfMil7CisgICAgICAgICAgICAgICAgICAgIHQtPmhvb2sgPSBUcmFja0Jhc2U6OmdldFRyYWNrSG9vayhUUkFDS1RZUEVfTk9SRVNBTVBMRSwgdC0+bU1peGVyQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1NaXhlckluRm9ybWF0LCB0LT5tTWl4ZXJGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBBTE9HVl9JRigobiAmIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0spID4gTkVFRFNfQ0hBTk5FTF8yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcmFjayAlZCBuZWVkcyBkb3dubWl4IiwgbmFtZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gc2VsZWN0IHRoZSBwcm9jZXNzaW5nIGhvb2tzCisgICAgbUhvb2sgPSAmQXVkaW9NaXhlckJhc2U6OnByb2Nlc3NfX25vcDsKKyAgICBpZiAobUVuYWJsZWQuc2l6ZSgpID4gMCkgeworICAgICAgICBpZiAocmVzYW1wbGluZykgeworICAgICAgICAgICAgaWYgKG1PdXRwdXRUZW1wLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtT3V0cHV0VGVtcC5yZXNldChuZXcgaW50MzJfdFtNQVhfTlVNX0NIQU5ORUxTICogbUZyYW1lQ291bnRdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUmVzYW1wbGVUZW1wLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBtUmVzYW1wbGVUZW1wLnJlc2V0KG5ldyBpbnQzMl90W01BWF9OVU1fQ0hBTk5FTFMgKiBtRnJhbWVDb3VudF0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbUhvb2sgPSAmQXVkaW9NaXhlckJhc2U6OnByb2Nlc3NfX2dlbmVyaWNSZXNhbXBsaW5nOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gd2Uga2VlcCB0ZW1wIGFycmF5cyBhcm91bmQuCisgICAgICAgICAgICBtSG9vayA9ICZBdWRpb01peGVyQmFzZTo6cHJvY2Vzc19fZ2VuZXJpY05vUmVzYW1wbGluZzsKKyAgICAgICAgICAgIGlmIChhbGwxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxlICYmICF2b2x1bWVSYW1wKSB7CisgICAgICAgICAgICAgICAgaWYgKG1FbmFibGVkLnNpemUoKSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFja0Jhc2U+ICZ0ID0gbVRyYWNrc1ttRW5hYmxlZFswXV07CisgICAgICAgICAgICAgICAgICAgIGlmICgodC0+bmVlZHMgJiBORUVEU19NVVRFKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgY2hlY2sgcHJldmVudHMgYSBtdXRlZCB0cmFjayBmcm9tIGFjcXVpcmluZyBhIHByb2Nlc3MgaG9vay4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGRhbmdlcm91cyBpZiB0aGUgdHJhY2sgaXMgTU9OTyBhcyB0aGF0IHJlcXVpcmVzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcGVjaWFsIGNhc2UgaGFuZGxpbmcgZHVlIHRvIGltcGxpY2l0IGNoYW5uZWwgZHVwbGljYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTdGVyZW8gb3IgTXVsdGljaGFubmVsIHNob3VsZCBhY3R1YWxseSBiZSBmaW5lIGhlcmUuCisgICAgICAgICAgICAgICAgICAgICAgICBtSG9vayA9IGdldFByb2Nlc3NIb29rKFBST0NFU1NUWVBFX05PUkVTQU1QTEVPTkVUUkFDSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdC0+bU1peGVyQ2hhbm5lbENvdW50LCB0LT5tTWl4ZXJJbkZvcm1hdCwgdC0+bU1peGVyRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIEFMT0dWKCJtaXhlciBjb25maWd1cmF0aW9uIGNoYW5nZTogJXp1ICIKKyAgICAgICAgImFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGU9JWQsIHJlc2FtcGxpbmc9JWQsIHZvbHVtZVJhbXA9JWQiLAorICAgICAgICBtRW5hYmxlZC5zaXplKCksIGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUsIHJlc2FtcGxpbmcsIHZvbHVtZVJhbXApOworCisgICAgcHJvY2VzcygpOworCisgICAgLy8gTm93IHRoYXQgdGhlIHZvbHVtZSByYW1wIGhhcyBiZWVuIGRvbmUsIHNldCBvcHRpbWFsIHN0YXRlIGFuZAorICAgIC8vIHRyYWNrIGhvb2tzIGZvciBzdWJzZXF1ZW50IG1peGVyIHByb2Nlc3MKKyAgICBpZiAobUVuYWJsZWQuc2l6ZSgpID4gMCkgeworICAgICAgICBib29sIGFsbE11dGVkID0gdHJ1ZTsKKworICAgICAgICBmb3IgKGNvbnN0IGludCBuYW1lIDogbUVuYWJsZWQpIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFja0Jhc2U+ICZ0ID0gbVRyYWNrc1tuYW1lXTsKKyAgICAgICAgICAgIGlmICghdC0+ZG9lc1Jlc2FtcGxlKCkgJiYgdC0+dm9sdW1lUkwgPT0gMCkgeworICAgICAgICAgICAgICAgIHQtPm5lZWRzIHw9IE5FRURTX01VVEU7CisgICAgICAgICAgICAgICAgdC0+aG9vayA9ICZUcmFja0Jhc2U6OnRyYWNrX19ub3A7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGFsbE11dGVkID0gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFsbE11dGVkKSB7CisgICAgICAgICAgICBtSG9vayA9ICZBdWRpb01peGVyQmFzZTo6cHJvY2Vzc19fbm9wOworICAgICAgICB9IGVsc2UgaWYgKGFsbDE2Qml0c1N0ZXJlb05vUmVzYW1wbGUpIHsKKyAgICAgICAgICAgIGlmIChtRW5hYmxlZC5zaXplKCkgPT0gMSkgeworICAgICAgICAgICAgICAgIC8vY29uc3QgaW50IGkgPSAzMSAtIF9fYnVpbHRpbl9jbHooZW5hYmxlZFRyYWNrcyk7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrQmFzZT4gJnQgPSBtVHJhY2tzW21FbmFibGVkWzBdXTsKKyAgICAgICAgICAgICAgICAvLyBNdXRlZCBzaW5nbGUgdHJhY2tzIGhhbmRsZWQgYnkgYWxsTXV0ZWQgYWJvdmUuCisgICAgICAgICAgICAgICAgbUhvb2sgPSBnZXRQcm9jZXNzSG9vayhQUk9DRVNTVFlQRV9OT1JFU0FNUExFT05FVFJBQ0ssCisgICAgICAgICAgICAgICAgICAgICAgICB0LT5tTWl4ZXJDaGFubmVsQ291bnQsIHQtPm1NaXhlckluRm9ybWF0LCB0LT5tTWl4ZXJGb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvTWl4ZXJCYXNlOjpUcmFja0Jhc2U6OnRyYWNrX19nZW5lcmljUmVzYW1wbGUoCisgICAgICAgIGludDMyX3QqIG91dCwgc2l6ZV90IG91dEZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAsIGludDMyX3QqIGF1eCkKK3sKKyAgICBBTE9HVlYoInRyYWNrX19nZW5lcmljUmVzYW1wbGVcbiIpOworICAgIG1SZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoc2FtcGxlUmF0ZSk7CisKKyAgICAvLyByYW1wIGdhaW4gLSByZXNhbXBsZSB0byB0ZW1wIGJ1ZmZlciBhbmQgc2NhbGUvbWl4IGluIDJuZCBzdGVwCisgICAgaWYgKGF1eCAhPSBOVUxMKSB7CisgICAgICAgIC8vIGFsd2F5cyByZXNhbXBsZSB3aXRoIHVuaXR5IGdhaW4gd2hlbiBzZW5kaW5nIHRvIGF1eGlsaWFyeSBidWZmZXIgdG8gYmUgYWJsZQorICAgICAgICAvLyB0byBhcHBseSBzZW5kIGxldmVsIGFmdGVyIHJlc2FtcGxpbmcKKyAgICAgICAgbVJlc2FtcGxlci0+c2V0Vm9sdW1lKFVOSVRZX0dBSU5fRkxPQVQsIFVOSVRZX0dBSU5fRkxPQVQpOworICAgICAgICBtZW1zZXQodGVtcCwgMCwgb3V0RnJhbWVDb3VudCAqIG1NaXhlckNoYW5uZWxDb3VudCAqIHNpemVvZihpbnQzMl90KSk7CisgICAgICAgIG1SZXNhbXBsZXItPnJlc2FtcGxlKHRlbXAsIG91dEZyYW1lQ291bnQsIGJ1ZmZlclByb3ZpZGVyKTsKKyAgICAgICAgaWYgKENDX1VOTElLRUxZKHZvbHVtZUluY1swXXx2b2x1bWVJbmNbMV18YXV4SW5jKSkgeworICAgICAgICAgICAgdm9sdW1lUmFtcFN0ZXJlbyhvdXQsIG91dEZyYW1lQ291bnQsIHRlbXAsIGF1eCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB2b2x1bWVTdGVyZW8ob3V0LCBvdXRGcmFtZUNvdW50LCB0ZW1wLCBhdXgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKENDX1VOTElLRUxZKHZvbHVtZUluY1swXXx2b2x1bWVJbmNbMV0pKSB7CisgICAgICAgICAgICBtUmVzYW1wbGVyLT5zZXRWb2x1bWUoVU5JVFlfR0FJTl9GTE9BVCwgVU5JVFlfR0FJTl9GTE9BVCk7CisgICAgICAgICAgICBtZW1zZXQodGVtcCwgMCwgb3V0RnJhbWVDb3VudCAqIE1BWF9OVU1fQ0hBTk5FTFMgKiBzaXplb2YoaW50MzJfdCkpOworICAgICAgICAgICAgbVJlc2FtcGxlci0+cmVzYW1wbGUodGVtcCwgb3V0RnJhbWVDb3VudCwgYnVmZmVyUHJvdmlkZXIpOworICAgICAgICAgICAgdm9sdW1lUmFtcFN0ZXJlbyhvdXQsIG91dEZyYW1lQ291bnQsIHRlbXAsIGF1eCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBjb25zdGFudCBnYWluCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbVJlc2FtcGxlci0+c2V0Vm9sdW1lKG1Wb2x1bWVbMF0sIG1Wb2x1bWVbMV0pOworICAgICAgICAgICAgbVJlc2FtcGxlci0+cmVzYW1wbGUob3V0LCBvdXRGcmFtZUNvdW50LCBidWZmZXJQcm92aWRlcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9NaXhlckJhc2U6OlRyYWNrQmFzZTo6dHJhY2tfX25vcChpbnQzMl90KiBvdXQgX191bnVzZWQsCisgICAgICAgIHNpemVfdCBvdXRGcmFtZUNvdW50IF9fdW51c2VkLCBpbnQzMl90KiB0ZW1wIF9fdW51c2VkLCBpbnQzMl90KiBhdXggX191bnVzZWQpCit7Cit9CisKK3ZvaWQgQXVkaW9NaXhlckJhc2U6OlRyYWNrQmFzZTo6dm9sdW1lUmFtcFN0ZXJlbygKKyAgICAgICAgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KQoreworICAgIGludDMyX3QgdmwgPSBwcmV2Vm9sdW1lWzBdOworICAgIGludDMyX3QgdnIgPSBwcmV2Vm9sdW1lWzFdOworICAgIGNvbnN0IGludDMyX3QgdmxJbmMgPSB2b2x1bWVJbmNbMF07CisgICAgY29uc3QgaW50MzJfdCB2ckluYyA9IHZvbHVtZUluY1sxXTsKKworICAgIC8vQUxPR0QoIlswXSAlcDogaW5jPSVmLCB2MD0lZiwgdjE9JWQsIGZpbmFsPSVmLCBjb3VudD0lZCIsCisgICAgLy8gICAgICAgIHQsIHZsSW5jLzY1NTM2LjBmLCB2bC82NTUzNi4wZiwgdm9sdW1lWzBdLAorICAgIC8vICAgICAgICh2bCArIHZsSW5jKmZyYW1lQ291bnQpLzY1NTM2LjBmLCBmcmFtZUNvdW50KTsKKworICAgIC8vIHJhbXAgdm9sdW1lCisgICAgaWYgKENDX1VOTElLRUxZKGF1eCAhPSBOVUxMKSkgeworICAgICAgICBpbnQzMl90IHZhID0gcHJldkF1eExldmVsOworICAgICAgICBjb25zdCBpbnQzMl90IHZhSW5jID0gYXV4SW5jOworICAgICAgICBpbnQzMl90IGw7CisgICAgICAgIGludDMyX3QgcjsKKworICAgICAgICBkbyB7CisgICAgICAgICAgICBsID0gKCp0ZW1wKysgPj4gMTIpOworICAgICAgICAgICAgciA9ICgqdGVtcCsrID4+IDEyKTsKKyAgICAgICAgICAgICpvdXQrKyArPSAodmwgPj4gMTYpICogbDsKKyAgICAgICAgICAgICpvdXQrKyArPSAodnIgPj4gMTYpICogcjsKKyAgICAgICAgICAgICphdXgrKyArPSAodmEgPj4gMTcpICogKGwgKyByKTsKKyAgICAgICAgICAgIHZsICs9IHZsSW5jOworICAgICAgICAgICAgdnIgKz0gdnJJbmM7CisgICAgICAgICAgICB2YSArPSB2YUluYzsKKyAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKKyAgICAgICAgcHJldkF1eExldmVsID0gdmE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZG8geworICAgICAgICAgICAgKm91dCsrICs9ICh2bCA+PiAxNikgKiAoKnRlbXArKyA+PiAxMik7CisgICAgICAgICAgICAqb3V0KysgKz0gKHZyID4+IDE2KSAqICgqdGVtcCsrID4+IDEyKTsKKyAgICAgICAgICAgIHZsICs9IHZsSW5jOworICAgICAgICAgICAgdnIgKz0gdnJJbmM7CisgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7CisgICAgfQorICAgIHByZXZWb2x1bWVbMF0gPSB2bDsKKyAgICBwcmV2Vm9sdW1lWzFdID0gdnI7CisgICAgYWRqdXN0Vm9sdW1lUmFtcChhdXggIT0gTlVMTCk7Cit9CisKK3ZvaWQgQXVkaW9NaXhlckJhc2U6OlRyYWNrQmFzZTo6dm9sdW1lU3RlcmVvKAorICAgICAgICBpbnQzMl90KiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LCBpbnQzMl90KiB0ZW1wLCBpbnQzMl90KiBhdXgpCit7CisgICAgY29uc3QgaW50MTZfdCB2bCA9IHZvbHVtZVswXTsKKyAgICBjb25zdCBpbnQxNl90IHZyID0gdm9sdW1lWzFdOworCisgICAgaWYgKENDX1VOTElLRUxZKGF1eCAhPSBOVUxMKSkgeworICAgICAgICBjb25zdCBpbnQxNl90IHZhID0gYXV4TGV2ZWw7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGludDE2X3QgbCA9IChpbnQxNl90KSgqdGVtcCsrID4+IDEyKTsKKyAgICAgICAgICAgIGludDE2X3QgciA9IChpbnQxNl90KSgqdGVtcCsrID4+IDEyKTsKKyAgICAgICAgICAgIG91dFswXSA9IG11bEFkZChsLCB2bCwgb3V0WzBdKTsKKyAgICAgICAgICAgIGludDE2X3QgYSA9IChpbnQxNl90KSgoKGludDMyX3QpbCArIHIpID4+IDEpOworICAgICAgICAgICAgb3V0WzFdID0gbXVsQWRkKHIsIHZyLCBvdXRbMV0pOworICAgICAgICAgICAgb3V0ICs9IDI7CisgICAgICAgICAgICBhdXhbMF0gPSBtdWxBZGQoYSwgdmEsIGF1eFswXSk7CisgICAgICAgICAgICBhdXgrKzsKKyAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBkbyB7CisgICAgICAgICAgICBpbnQxNl90IGwgPSAoaW50MTZfdCkoKnRlbXArKyA+PiAxMik7CisgICAgICAgICAgICBpbnQxNl90IHIgPSAoaW50MTZfdCkoKnRlbXArKyA+PiAxMik7CisgICAgICAgICAgICBvdXRbMF0gPSBtdWxBZGQobCwgdmwsIG91dFswXSk7CisgICAgICAgICAgICBvdXRbMV0gPSBtdWxBZGQociwgdnIsIG91dFsxXSk7CisgICAgICAgICAgICBvdXQgKz0gMjsKKyAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9NaXhlckJhc2U6OlRyYWNrQmFzZTo6dHJhY2tfXzE2Qml0c1N0ZXJlbygKKyAgICAgICAgaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCBfX3VudXNlZCwgaW50MzJfdCogYXV4KQoreworICAgIEFMT0dWVigidHJhY2tfXzE2Qml0c1N0ZXJlb1xuIik7CisgICAgY29uc3QgaW50MTZfdCAqaW4gPSBzdGF0aWNfY2FzdDxjb25zdCBpbnQxNl90ICo+KG1Jbik7CisKKyAgICBpZiAoQ0NfVU5MSUtFTFkoYXV4ICE9IE5VTEwpKSB7CisgICAgICAgIGludDMyX3QgbDsKKyAgICAgICAgaW50MzJfdCByOworICAgICAgICAvLyByYW1wIGdhaW4KKyAgICAgICAgaWYgKENDX1VOTElLRUxZKHZvbHVtZUluY1swXXx2b2x1bWVJbmNbMV18YXV4SW5jKSkgeworICAgICAgICAgICAgaW50MzJfdCB2bCA9IHByZXZWb2x1bWVbMF07CisgICAgICAgICAgICBpbnQzMl90IHZyID0gcHJldlZvbHVtZVsxXTsKKyAgICAgICAgICAgIGludDMyX3QgdmEgPSBwcmV2QXV4TGV2ZWw7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHZsSW5jID0gdm9sdW1lSW5jWzBdOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2ckluYyA9IHZvbHVtZUluY1sxXTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdmFJbmMgPSBhdXhJbmM7CisgICAgICAgICAgICAvLyBBTE9HRCgiWzFdICVwOiBpbmM9JWYsIHYwPSVmLCB2MT0lZCwgZmluYWw9JWYsIGNvdW50PSVkIiwKKyAgICAgICAgICAgIC8vICAgICAgICB0LCB2bEluYy82NTUzNi4wZiwgdmwvNjU1MzYuMGYsIHZvbHVtZVswXSwKKyAgICAgICAgICAgIC8vICAgICAgICAodmwgKyB2bEluYypmcmFtZUNvdW50KS82NTUzNi4wZiwgZnJhbWVDb3VudCk7CisKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBsID0gKGludDMyX3QpKmluKys7CisgICAgICAgICAgICAgICAgciA9IChpbnQzMl90KSppbisrOworICAgICAgICAgICAgICAgICpvdXQrKyArPSAodmwgPj4gMTYpICogbDsKKyAgICAgICAgICAgICAgICAqb3V0KysgKz0gKHZyID4+IDE2KSAqIHI7CisgICAgICAgICAgICAgICAgKmF1eCsrICs9ICh2YSA+PiAxNykgKiAobCArIHIpOworICAgICAgICAgICAgICAgIHZsICs9IHZsSW5jOworICAgICAgICAgICAgICAgIHZyICs9IHZySW5jOworICAgICAgICAgICAgICAgIHZhICs9IHZhSW5jOworICAgICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKKworICAgICAgICAgICAgcHJldlZvbHVtZVswXSA9IHZsOworICAgICAgICAgICAgcHJldlZvbHVtZVsxXSA9IHZyOworICAgICAgICAgICAgcHJldkF1eExldmVsID0gdmE7CisgICAgICAgICAgICBhZGp1c3RWb2x1bWVSYW1wKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gY29uc3RhbnQgZ2FpbgorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHZybCA9IHZvbHVtZVJMOworICAgICAgICAgICAgY29uc3QgaW50MTZfdCB2YSA9IChpbnQxNl90KWF1eExldmVsOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHVpbnQzMl90IHJsID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyX3QgKj4oaW4pOworICAgICAgICAgICAgICAgIGludDE2X3QgYSA9IChpbnQxNl90KSgoKGludDMyX3QpaW5bMF0gKyBpblsxXSkgPj4gMSk7CisgICAgICAgICAgICAgICAgaW4gKz0gMjsKKyAgICAgICAgICAgICAgICBvdXRbMF0gPSBtdWxBZGRSTCgxLCBybCwgdnJsLCBvdXRbMF0pOworICAgICAgICAgICAgICAgIG91dFsxXSA9IG11bEFkZFJMKDAsIHJsLCB2cmwsIG91dFsxXSk7CisgICAgICAgICAgICAgICAgb3V0ICs9IDI7CisgICAgICAgICAgICAgICAgYXV4WzBdID0gbXVsQWRkKGEsIHZhLCBhdXhbMF0pOworICAgICAgICAgICAgICAgIGF1eCsrOworICAgICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHJhbXAgZ2FpbgorICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodm9sdW1lSW5jWzBdfHZvbHVtZUluY1sxXSkpIHsKKyAgICAgICAgICAgIGludDMyX3QgdmwgPSBwcmV2Vm9sdW1lWzBdOworICAgICAgICAgICAgaW50MzJfdCB2ciA9IHByZXZWb2x1bWVbMV07CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHZsSW5jID0gdm9sdW1lSW5jWzBdOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2ckluYyA9IHZvbHVtZUluY1sxXTsKKworICAgICAgICAgICAgLy8gQUxPR0QoIlsxXSAlcDogaW5jPSVmLCB2MD0lZiwgdjE9JWQsIGZpbmFsPSVmLCBjb3VudD0lZCIsCisgICAgICAgICAgICAvLyAgICAgICAgdCwgdmxJbmMvNjU1MzYuMGYsIHZsLzY1NTM2LjBmLCB2b2x1bWVbMF0sCisgICAgICAgICAgICAvLyAgICAgICAgKHZsICsgdmxJbmMqZnJhbWVDb3VudCkvNjU1MzYuMGYsIGZyYW1lQ291bnQpOworCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgKm91dCsrICs9ICh2bCA+PiAxNikgKiAoaW50MzJfdCkgKmluKys7CisgICAgICAgICAgICAgICAgKm91dCsrICs9ICh2ciA+PiAxNikgKiAoaW50MzJfdCkgKmluKys7CisgICAgICAgICAgICAgICAgdmwgKz0gdmxJbmM7CisgICAgICAgICAgICAgICAgdnIgKz0gdnJJbmM7CisgICAgICAgICAgICB9IHdoaWxlICgtLWZyYW1lQ291bnQpOworCisgICAgICAgICAgICBwcmV2Vm9sdW1lWzBdID0gdmw7CisgICAgICAgICAgICBwcmV2Vm9sdW1lWzFdID0gdnI7CisgICAgICAgICAgICBhZGp1c3RWb2x1bWVSYW1wKGZhbHNlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNvbnN0YW50IGdhaW4KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCB2cmwgPSB2b2x1bWVSTDsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBybCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KGluKTsKKyAgICAgICAgICAgICAgICBpbiArPSAyOworICAgICAgICAgICAgICAgIG91dFswXSA9IG11bEFkZFJMKDEsIHJsLCB2cmwsIG91dFswXSk7CisgICAgICAgICAgICAgICAgb3V0WzFdID0gbXVsQWRkUkwoMCwgcmwsIHZybCwgb3V0WzFdKTsKKyAgICAgICAgICAgICAgICBvdXQgKz0gMjsKKyAgICAgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUluID0gaW47Cit9CisKK3ZvaWQgQXVkaW9NaXhlckJhc2U6OlRyYWNrQmFzZTo6dHJhY2tfXzE2Qml0c01vbm8oCisgICAgICAgIGludDMyX3QqIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIGludDMyX3QqIHRlbXAgX191bnVzZWQsIGludDMyX3QqIGF1eCkKK3sKKyAgICBBTE9HVlYoInRyYWNrX18xNkJpdHNNb25vXG4iKTsKKyAgICBjb25zdCBpbnQxNl90ICppbiA9IHN0YXRpY19jYXN0PGludDE2X3QgY29uc3QgKj4obUluKTsKKworICAgIGlmIChDQ19VTkxJS0VMWShhdXggIT0gTlVMTCkpIHsKKyAgICAgICAgLy8gcmFtcCBnYWluCisgICAgICAgIGlmIChDQ19VTkxJS0VMWSh2b2x1bWVJbmNbMF18dm9sdW1lSW5jWzFdfGF1eEluYykpIHsKKyAgICAgICAgICAgIGludDMyX3QgdmwgPSBwcmV2Vm9sdW1lWzBdOworICAgICAgICAgICAgaW50MzJfdCB2ciA9IHByZXZWb2x1bWVbMV07CisgICAgICAgICAgICBpbnQzMl90IHZhID0gcHJldkF1eExldmVsOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2bEluYyA9IHZvbHVtZUluY1swXTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdnJJbmMgPSB2b2x1bWVJbmNbMV07CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IHZhSW5jID0gYXV4SW5jOworCisgICAgICAgICAgICAvLyBBTE9HRCgiWzJdICVwOiBpbmM9JWYsIHYwPSVmLCB2MT0lZCwgZmluYWw9JWYsIGNvdW50PSVkIiwKKyAgICAgICAgICAgIC8vICAgICAgICAgdCwgdmxJbmMvNjU1MzYuMGYsIHZsLzY1NTM2LjBmLCB2b2x1bWVbMF0sCisgICAgICAgICAgICAvLyAgICAgICAgICh2bCArIHZsSW5jKmZyYW1lQ291bnQpLzY1NTM2LjBmLCBmcmFtZUNvdW50KTsKKworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGludDMyX3QgbCA9ICppbisrOworICAgICAgICAgICAgICAgICpvdXQrKyArPSAodmwgPj4gMTYpICogbDsKKyAgICAgICAgICAgICAgICAqb3V0KysgKz0gKHZyID4+IDE2KSAqIGw7CisgICAgICAgICAgICAgICAgKmF1eCsrICs9ICh2YSA+PiAxNikgKiBsOworICAgICAgICAgICAgICAgIHZsICs9IHZsSW5jOworICAgICAgICAgICAgICAgIHZyICs9IHZySW5jOworICAgICAgICAgICAgICAgIHZhICs9IHZhSW5jOworICAgICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKKworICAgICAgICAgICAgcHJldlZvbHVtZVswXSA9IHZsOworICAgICAgICAgICAgcHJldlZvbHVtZVsxXSA9IHZyOworICAgICAgICAgICAgcHJldkF1eExldmVsID0gdmE7CisgICAgICAgICAgICBhZGp1c3RWb2x1bWVSYW1wKHRydWUpOworICAgICAgICB9CisgICAgICAgIC8vIGNvbnN0YW50IGdhaW4KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjb25zdCBpbnQxNl90IHZsID0gdm9sdW1lWzBdOworICAgICAgICAgICAgY29uc3QgaW50MTZfdCB2ciA9IHZvbHVtZVsxXTsKKyAgICAgICAgICAgIGNvbnN0IGludDE2X3QgdmEgPSAoaW50MTZfdClhdXhMZXZlbDsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQxNl90IGwgPSAqaW4rKzsKKyAgICAgICAgICAgICAgICBvdXRbMF0gPSBtdWxBZGQobCwgdmwsIG91dFswXSk7CisgICAgICAgICAgICAgICAgb3V0WzFdID0gbXVsQWRkKGwsIHZyLCBvdXRbMV0pOworICAgICAgICAgICAgICAgIG91dCArPSAyOworICAgICAgICAgICAgICAgIGF1eFswXSA9IG11bEFkZChsLCB2YSwgYXV4WzBdKTsKKyAgICAgICAgICAgICAgICBhdXgrKzsKKyAgICAgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyByYW1wIGdhaW4KKyAgICAgICAgaWYgKENDX1VOTElLRUxZKHZvbHVtZUluY1swXXx2b2x1bWVJbmNbMV0pKSB7CisgICAgICAgICAgICBpbnQzMl90IHZsID0gcHJldlZvbHVtZVswXTsKKyAgICAgICAgICAgIGludDMyX3QgdnIgPSBwcmV2Vm9sdW1lWzFdOworICAgICAgICAgICAgY29uc3QgaW50MzJfdCB2bEluYyA9IHZvbHVtZUluY1swXTsKKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgdnJJbmMgPSB2b2x1bWVJbmNbMV07CisKKyAgICAgICAgICAgIC8vIEFMT0dEKCJbMl0gJXA6IGluYz0lZiwgdjA9JWYsIHYxPSVkLCBmaW5hbD0lZiwgY291bnQ9JWQiLAorICAgICAgICAgICAgLy8gICAgICAgICB0LCB2bEluYy82NTUzNi4wZiwgdmwvNjU1MzYuMGYsIHZvbHVtZVswXSwKKyAgICAgICAgICAgIC8vICAgICAgICAgKHZsICsgdmxJbmMqZnJhbWVDb3VudCkvNjU1MzYuMGYsIGZyYW1lQ291bnQpOworCisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBsID0gKmluKys7CisgICAgICAgICAgICAgICAgKm91dCsrICs9ICh2bCA+PiAxNikgKiBsOworICAgICAgICAgICAgICAgICpvdXQrKyArPSAodnIgPj4gMTYpICogbDsKKyAgICAgICAgICAgICAgICB2bCArPSB2bEluYzsKKyAgICAgICAgICAgICAgICB2ciArPSB2ckluYzsKKyAgICAgICAgICAgIH0gd2hpbGUgKC0tZnJhbWVDb3VudCk7CisKKyAgICAgICAgICAgIHByZXZWb2x1bWVbMF0gPSB2bDsKKyAgICAgICAgICAgIHByZXZWb2x1bWVbMV0gPSB2cjsKKyAgICAgICAgICAgIGFkanVzdFZvbHVtZVJhbXAoZmFsc2UpOworICAgICAgICB9CisgICAgICAgIC8vIGNvbnN0YW50IGdhaW4KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjb25zdCBpbnQxNl90IHZsID0gdm9sdW1lWzBdOworICAgICAgICAgICAgY29uc3QgaW50MTZfdCB2ciA9IHZvbHVtZVsxXTsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBpbnQxNl90IGwgPSAqaW4rKzsKKyAgICAgICAgICAgICAgICBvdXRbMF0gPSBtdWxBZGQobCwgdmwsIG91dFswXSk7CisgICAgICAgICAgICAgICAgb3V0WzFdID0gbXVsQWRkKGwsIHZyLCBvdXRbMV0pOworICAgICAgICAgICAgICAgIG91dCArPSAyOworICAgICAgICAgICAgfSB3aGlsZSAoLS1mcmFtZUNvdW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtSW4gPSBpbjsKK30KKworLy8gbm8tb3AgY2FzZQordm9pZCBBdWRpb01peGVyQmFzZTo6cHJvY2Vzc19fbm9wKCkKK3sKKyAgICBBTE9HVlYoInByb2Nlc3NfX25vcFxuIik7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBtR3JvdXBzKSB7CisgICAgICAgIC8vIHByb2Nlc3MgYnkgZ3JvdXAgb2YgdHJhY2tzIHdpdGggc2FtZSBvdXRwdXQgYnVmZmVyIHRvCisgICAgICAgIC8vIGF2b2lkIG11bHRpcGxlIG1lbXNldCgpIG9uIHNhbWUgYnVmZmVyCisgICAgICAgIGNvbnN0IGF1dG8gJmdyb3VwID0gcGFpci5zZWNvbmQ7CisKKyAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrQmFzZT4gJnQgPSBtVHJhY2tzW2dyb3VwWzBdXTsKKyAgICAgICAgbWVtc2V0KHQtPm1haW5CdWZmZXIsIDAsCisgICAgICAgICAgICAgICAgbUZyYW1lQ291bnQgKiBhdWRpb19ieXRlc19wZXJfZnJhbWUodC0+Z2V0TWl4ZXJDaGFubmVsQ291bnQoKSwgdC0+bU1peGVyRm9ybWF0KSk7CisKKyAgICAgICAgLy8gbm93IGNvbnN1bWUgZGF0YQorICAgICAgICBmb3IgKGNvbnN0IGludCBuYW1lIDogZ3JvdXApIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFja0Jhc2U+ICZ0ID0gbVRyYWNrc1tuYW1lXTsKKyAgICAgICAgICAgIHNpemVfdCBvdXRGcmFtZXMgPSBtRnJhbWVDb3VudDsKKyAgICAgICAgICAgIHdoaWxlIChvdXRGcmFtZXMpIHsKKyAgICAgICAgICAgICAgICB0LT5idWZmZXIuZnJhbWVDb3VudCA9IG91dEZyYW1lczsKKyAgICAgICAgICAgICAgICB0LT5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmdC0+YnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAodC0+YnVmZmVyLnJhdyA9PSBOVUxMKSBicmVhazsKKyAgICAgICAgICAgICAgICBvdXRGcmFtZXMgLT0gdC0+YnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgdC0+YnVmZmVyUHJvdmlkZXItPnJlbGVhc2VCdWZmZXIoJnQtPmJ1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIGdlbmVyaWMgY29kZSB3aXRob3V0IHJlc2FtcGxpbmcKK3ZvaWQgQXVkaW9NaXhlckJhc2U6OnByb2Nlc3NfX2dlbmVyaWNOb1Jlc2FtcGxpbmcoKQoreworICAgIEFMT0dWVigicHJvY2Vzc19fZ2VuZXJpY05vUmVzYW1wbGluZ1xuIik7CisgICAgaW50MzJfdCBvdXRUZW1wW0JMT0NLU0laRSAqIE1BWF9OVU1fQ0hBTk5FTFNdIF9fYXR0cmlidXRlX18oKGFsaWduZWQoMzIpKSk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBtR3JvdXBzKSB7CisgICAgICAgIC8vIHByb2Nlc3MgYnkgZ3JvdXAgb2YgdHJhY2tzIHdpdGggc2FtZSBvdXRwdXQgbWFpbiBidWZmZXIgdG8KKyAgICAgICAgLy8gYXZvaWQgbXVsdGlwbGUgbWVtc2V0KCkgb24gc2FtZSBidWZmZXIKKyAgICAgICAgY29uc3QgYXV0byAmZ3JvdXAgPSBwYWlyLnNlY29uZDsKKworICAgICAgICAvLyBhY3F1aXJlIGJ1ZmZlcgorICAgICAgICBmb3IgKGNvbnN0IGludCBuYW1lIDogZ3JvdXApIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFja0Jhc2U+ICZ0ID0gbVRyYWNrc1tuYW1lXTsKKyAgICAgICAgICAgIHQtPmJ1ZmZlci5mcmFtZUNvdW50ID0gbUZyYW1lQ291bnQ7CisgICAgICAgICAgICB0LT5idWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmdC0+YnVmZmVyKTsKKyAgICAgICAgICAgIHQtPmZyYW1lQ291bnQgPSB0LT5idWZmZXIuZnJhbWVDb3VudDsKKyAgICAgICAgICAgIHQtPm1JbiA9IHQtPmJ1ZmZlci5yYXc7CisgICAgICAgIH0KKworICAgICAgICBpbnQzMl90ICpvdXQgPSAoaW50ICopcGFpci5maXJzdDsKKyAgICAgICAgc2l6ZV90IG51bUZyYW1lcyA9IDA7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBmcmFtZUNvdW50ID0gc3RkOjptaW4oKHNpemVfdClCTE9DS1NJWkUsIG1GcmFtZUNvdW50IC0gbnVtRnJhbWVzKTsKKyAgICAgICAgICAgIG1lbXNldChvdXRUZW1wLCAwLCBzaXplb2Yob3V0VGVtcCkpOworICAgICAgICAgICAgZm9yIChjb25zdCBpbnQgbmFtZSA6IGdyb3VwKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrQmFzZT4gJnQgPSBtVHJhY2tzW25hbWVdOworICAgICAgICAgICAgICAgIGludDMyX3QgKmF1eCA9IE5VTEw7CisgICAgICAgICAgICAgICAgaWYgKENDX1VOTElLRUxZKHQtPm5lZWRzICYgTkVFRFNfQVVYKSkgeworICAgICAgICAgICAgICAgICAgICBhdXggPSB0LT5hdXhCdWZmZXIgKyBudW1GcmFtZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaW50IG91dEZyYW1lcyA9IGZyYW1lQ291bnQ7IG91dEZyYW1lcyA+IDA7ICkgeworICAgICAgICAgICAgICAgICAgICAvLyB0LT5pbiA9PSBudWxscHRyIGNhbiBoYXBwZW4gaWYgdGhlIHRyYWNrIHdhcyBmbHVzaGVkIGp1c3QgYWZ0ZXIgaGF2aW5nCisgICAgICAgICAgICAgICAgICAgIC8vIGJlZW4gZW5hYmxlZCBmb3IgbWl4aW5nLgorICAgICAgICAgICAgICAgICAgICBpZiAodC0+bUluID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBpbkZyYW1lcyA9ICh0LT5mcmFtZUNvdW50ID4gb3V0RnJhbWVzKT9vdXRGcmFtZXM6dC0+ZnJhbWVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGluRnJhbWVzID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKHQuZ2V0KCktPip0LT5ob29rKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0VGVtcCArIChmcmFtZUNvdW50IC0gb3V0RnJhbWVzKSAqIHQtPm1NaXhlckNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5GcmFtZXMsIG1SZXNhbXBsZVRlbXAuZ2V0KCkgLyogbmFrZWQgcHRyICovLCBhdXgpOworICAgICAgICAgICAgICAgICAgICAgICAgdC0+ZnJhbWVDb3VudCAtPSBpbkZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgICAgIG91dEZyYW1lcyAtPSBpbkZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWShhdXggIT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXggKz0gaW5GcmFtZXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHQtPmZyYW1lQ291bnQgPT0gMCAmJiBvdXRGcmFtZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZ0LT5idWZmZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgdC0+YnVmZmVyLmZyYW1lQ291bnQgPSAobUZyYW1lQ291bnQgLSBudW1GcmFtZXMpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZyYW1lQ291bnQgLSBvdXRGcmFtZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgdC0+YnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJnQtPmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgICAgICB0LT5tSW4gPSB0LT5idWZmZXIucmF3OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHQtPm1JbiA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB0LT5mcmFtZUNvdW50ID0gdC0+YnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFja0Jhc2U+ICZ0MSA9IG1UcmFja3NbZ3JvdXBbMF1dOworICAgICAgICAgICAgY29udmVydE1peGVyRm9ybWF0KG91dCwgdDEtPm1NaXhlckZvcm1hdCwgb3V0VGVtcCwgdDEtPm1NaXhlckluRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50ICogdDEtPm1NaXhlckNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAvLyBUT0RPOiBmaXggdWdseSBjYXN0aW5nIGR1ZSB0byBjaG9pY2Ugb2Ygb3V0IHBvaW50ZXIgdHlwZQorICAgICAgICAgICAgb3V0ID0gcmVpbnRlcnByZXRfY2FzdDxpbnQzMl90Kj4oKHVpbnQ4X3QqKW91dAorICAgICAgICAgICAgICAgICAgICArIGZyYW1lQ291bnQgKiB0MS0+bU1peGVyQ2hhbm5lbENvdW50CisgICAgICAgICAgICAgICAgICAgICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0MS0+bU1peGVyRm9ybWF0KSk7CisgICAgICAgICAgICBudW1GcmFtZXMgKz0gZnJhbWVDb3VudDsKKyAgICAgICAgfSB3aGlsZSAobnVtRnJhbWVzIDwgbUZyYW1lQ291bnQpOworCisgICAgICAgIC8vIHJlbGVhc2UgZWFjaCB0cmFjaydzIGJ1ZmZlcgorICAgICAgICBmb3IgKGNvbnN0IGludCBuYW1lIDogZ3JvdXApIHsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxUcmFja0Jhc2U+ICZ0ID0gbVRyYWNrc1tuYW1lXTsKKyAgICAgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZ0LT5idWZmZXIpOworICAgICAgICB9CisgICAgfQorfQorCisvLyBnZW5lcmljIGNvZGUgd2l0aCByZXNhbXBsaW5nCit2b2lkIEF1ZGlvTWl4ZXJCYXNlOjpwcm9jZXNzX19nZW5lcmljUmVzYW1wbGluZygpCit7CisgICAgQUxPR1ZWKCJwcm9jZXNzX19nZW5lcmljUmVzYW1wbGluZ1xuIik7CisgICAgaW50MzJfdCAqIGNvbnN0IG91dFRlbXAgPSBtT3V0cHV0VGVtcC5nZXQoKTsgLy8gbmFrZWQgcHRyCisgICAgc2l6ZV90IG51bUZyYW1lcyA9IG1GcmFtZUNvdW50OworCisgICAgZm9yIChjb25zdCBhdXRvICZwYWlyIDogbUdyb3VwcykgeworICAgICAgICBjb25zdCBhdXRvICZncm91cCA9IHBhaXIuc2Vjb25kOworICAgICAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2tCYXNlPiAmdDEgPSBtVHJhY2tzW2dyb3VwWzBdXTsKKworICAgICAgICAvLyBjbGVhciB0ZW1wIGJ1ZmZlcgorICAgICAgICBtZW1zZXQob3V0VGVtcCwgMCwgc2l6ZW9mKCpvdXRUZW1wKSAqIHQxLT5tTWl4ZXJDaGFubmVsQ291bnQgKiBtRnJhbWVDb3VudCk7CisgICAgICAgIGZvciAoY29uc3QgaW50IG5hbWUgOiBncm91cCkgeworICAgICAgICAgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPFRyYWNrQmFzZT4gJnQgPSBtVHJhY2tzW25hbWVdOworICAgICAgICAgICAgaW50MzJfdCAqYXV4ID0gTlVMTDsKKyAgICAgICAgICAgIGlmIChDQ19VTkxJS0VMWSh0LT5uZWVkcyAmIE5FRURTX0FVWCkpIHsKKyAgICAgICAgICAgICAgICBhdXggPSB0LT5hdXhCdWZmZXI7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgYSBsaXR0bGUgZ29vZnksIG9uIHRoZSByZXNhbXBsaW5nIGNhc2Ugd2UgZG9uJ3QKKyAgICAgICAgICAgIC8vIGFjcXVpcmUvcmVsZWFzZSB0aGUgYnVmZmVycyBiZWNhdXNlIGl0J3MgZG9uZSBieQorICAgICAgICAgICAgLy8gdGhlIHJlc2FtcGxlci4KKyAgICAgICAgICAgIGlmICh0LT5uZWVkcyAmIE5FRURTX1JFU0FNUExFKSB7CisgICAgICAgICAgICAgICAgKHQuZ2V0KCktPip0LT5ob29rKShvdXRUZW1wLCBudW1GcmFtZXMsIG1SZXNhbXBsZVRlbXAuZ2V0KCkgLyogbmFrZWQgcHRyICovLCBhdXgpOworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIHNpemVfdCBvdXRGcmFtZXMgPSAwOworCisgICAgICAgICAgICAgICAgd2hpbGUgKG91dEZyYW1lcyA8IG51bUZyYW1lcykgeworICAgICAgICAgICAgICAgICAgICB0LT5idWZmZXIuZnJhbWVDb3VudCA9IG51bUZyYW1lcyAtIG91dEZyYW1lczsKKyAgICAgICAgICAgICAgICAgICAgdC0+YnVmZmVyUHJvdmlkZXItPmdldE5leHRCdWZmZXIoJnQtPmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgICAgIHQtPm1JbiA9IHQtPmJ1ZmZlci5yYXc7CisgICAgICAgICAgICAgICAgICAgIC8vIHQtPm1JbiA9PSBudWxscHRyIGNhbiBoYXBwZW4gaWYgdGhlIHRyYWNrIHdhcyBmbHVzaGVkIGp1c3QgYWZ0ZXIgaGF2aW5nCisgICAgICAgICAgICAgICAgICAgIC8vIGJlZW4gZW5hYmxlZCBmb3IgbWl4aW5nLgorICAgICAgICAgICAgICAgICAgICBpZiAodC0+bUluID09IG51bGxwdHIpIGJyZWFrOworCisgICAgICAgICAgICAgICAgICAgICh0LmdldCgpLT4qdC0+aG9vaykoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0VGVtcCArIG91dEZyYW1lcyAqIHQtPm1NaXhlckNoYW5uZWxDb3VudCwgdC0+YnVmZmVyLmZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc2FtcGxlVGVtcC5nZXQoKSAvKiBuYWtlZCBwdHIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXV4ICE9IG51bGxwdHIgPyBhdXggKyBvdXRGcmFtZXMgOiBudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0RnJhbWVzICs9IHQtPmJ1ZmZlci5mcmFtZUNvdW50OworCisgICAgICAgICAgICAgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZ0LT5idWZmZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBjb252ZXJ0TWl4ZXJGb3JtYXQodDEtPm1haW5CdWZmZXIsIHQxLT5tTWl4ZXJGb3JtYXQsCisgICAgICAgICAgICAgICAgb3V0VGVtcCwgdDEtPm1NaXhlckluRm9ybWF0LCBudW1GcmFtZXMgKiB0MS0+bU1peGVyQ2hhbm5lbENvdW50KTsKKyAgICB9Cit9CisKKy8vIG9uZSB0cmFjaywgMTYgYml0cyBzdGVyZW8gd2l0aG91dCByZXNhbXBsaW5nIGlzIHRoZSBtb3N0IGNvbW1vbiBjYXNlCit2b2lkIEF1ZGlvTWl4ZXJCYXNlOjpwcm9jZXNzX19vbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZygpCit7CisgICAgQUxPR1ZWKCJwcm9jZXNzX19vbmVUcmFjazE2Qml0c1N0ZXJlb05vUmVzYW1wbGluZ1xuIik7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRW5hYmxlZC5zaXplKCkgIT0gMCwKKyAgICAgICAgICAgICIlenUgIT0gMSB0cmFja3MgZW5hYmxlZCIsIG1FbmFibGVkLnNpemUoKSk7CisgICAgY29uc3QgaW50IG5hbWUgPSBtRW5hYmxlZFswXTsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2tCYXNlPiAmdCA9IG1UcmFja3NbbmFtZV07CisKKyAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGIodC0+YnVmZmVyKTsKKworICAgIGludDMyX3QqIG91dCA9IHQtPm1haW5CdWZmZXI7CisgICAgZmxvYXQgKmZvdXQgPSByZWludGVycHJldF9jYXN0PGZsb2F0Kj4ob3V0KTsKKyAgICBzaXplX3QgbnVtRnJhbWVzID0gbUZyYW1lQ291bnQ7CisKKyAgICBjb25zdCBpbnQxNl90IHZsID0gdC0+dm9sdW1lWzBdOworICAgIGNvbnN0IGludDE2X3QgdnIgPSB0LT52b2x1bWVbMV07CisgICAgY29uc3QgdWludDMyX3QgdnJsID0gdC0+dm9sdW1lUkw7CisgICAgd2hpbGUgKG51bUZyYW1lcykgeworICAgICAgICBiLmZyYW1lQ291bnQgPSBudW1GcmFtZXM7CisgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZiKTsKKyAgICAgICAgY29uc3QgaW50MTZfdCAqaW4gPSBiLmkxNjsKKworICAgICAgICAvLyBpbiA9PSBOVUxMIGNhbiBoYXBwZW4gaWYgdGhlIHRyYWNrIHdhcyBmbHVzaGVkIGp1c3QgYWZ0ZXIgaGF2aW5nCisgICAgICAgIC8vIGJlZW4gZW5hYmxlZCBmb3IgbWl4aW5nLgorICAgICAgICBpZiAoaW4gPT0gTlVMTCB8fCAoKCh1aW50cHRyX3QpaW4pICYgMykpIHsKKyAgICAgICAgICAgIGlmICggQVVESU9fRk9STUFUX1BDTV9GTE9BVCA9PSB0LT5tTWl4ZXJGb3JtYXQgKSB7CisgICAgICAgICAgICAgICAgIG1lbXNldCgoY2hhciopZm91dCwgMCwgbnVtRnJhbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgKiB0LT5tTWl4ZXJDaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKHQtPm1NaXhlckZvcm1hdCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgbWVtc2V0KChjaGFyKilvdXQsIDAsIG51bUZyYW1lcworICAgICAgICAgICAgICAgICAgICAgICAgICogdC0+bU1peGVyQ2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0LT5tTWl4ZXJGb3JtYXQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dFX0lGKCgoKHVpbnRwdHJfdClpbikgJiAzKSwKKyAgICAgICAgICAgICAgICAgICAgInByb2Nlc3NfX29uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nOiBtaXNhbGlnbmVkIGJ1ZmZlciIKKyAgICAgICAgICAgICAgICAgICAgIiAlcCB0cmFjayAlZCwgY2hhbm5lbHMgJWQsIG5lZWRzICUwOHgsIHZvbHVtZSAlMDh4IHZmbCAlZiB2ZnIgJWYiLAorICAgICAgICAgICAgICAgICAgICBpbiwgbmFtZSwgdC0+Y2hhbm5lbENvdW50LCB0LT5uZWVkcywgdnJsLCB0LT5tVm9sdW1lWzBdLCB0LT5tVm9sdW1lWzFdKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzaXplX3Qgb3V0RnJhbWVzID0gYi5mcmFtZUNvdW50OworCisgICAgICAgIHN3aXRjaCAodC0+bU1peGVyRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCBybCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KGluKTsKKyAgICAgICAgICAgICAgICBpbiArPSAyOworICAgICAgICAgICAgICAgIGludDMyX3QgbCA9IG11bFJMKDEsIHJsLCB2cmwpOworICAgICAgICAgICAgICAgIGludDMyX3QgciA9IG11bFJMKDAsIHJsLCB2cmwpOworICAgICAgICAgICAgICAgICpmb3V0KysgPSBmbG9hdF9mcm9tX3E0XzI3KGwpOworICAgICAgICAgICAgICAgICpmb3V0KysgPSBmbG9hdF9mcm9tX3E0XzI3KHIpOworICAgICAgICAgICAgICAgIC8vIE5vdGU6IEluIGNhc2Ugb2YgbGF0ZXIgaW50MTZfdCBzaW5rIG91dHB1dCwKKyAgICAgICAgICAgICAgICAvLyBjb252ZXJzaW9uIGFuZCBjbGFtcGluZyBpcyBkb25lIGJ5IG1lbWNweV90b19pMTZfZnJvbV9mbG9hdCgpLgorICAgICAgICAgICAgfSB3aGlsZSAoLS1vdXRGcmFtZXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICBpZiAoQ0NfVU5MSUtFTFkodWludDMyX3QodmwpID4gVU5JVFlfR0FJTl9JTlQgfHwgdWludDMyX3QodnIpID4gVU5JVFlfR0FJTl9JTlQpKSB7CisgICAgICAgICAgICAgICAgLy8gdm9sdW1lIGlzIGJvb3N0ZWQsIHNvIHdlIG1pZ2h0IG5lZWQgdG8gY2xhbXAgZXZlbiB0aG91Z2gKKyAgICAgICAgICAgICAgICAvLyB3ZSBwcm9jZXNzIG9ubHkgb25lIHRyYWNrLgorICAgICAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcmwgPSAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzJfdCAqPihpbik7CisgICAgICAgICAgICAgICAgICAgIGluICs9IDI7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgbCA9IG11bFJMKDEsIHJsLCB2cmwpID4+IDEyOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHIgPSBtdWxSTCgwLCBybCwgdnJsKSA+PiAxMjsKKyAgICAgICAgICAgICAgICAgICAgLy8gY2xhbXBpbmcuLi4KKyAgICAgICAgICAgICAgICAgICAgbCA9IGNsYW1wMTYobCk7CisgICAgICAgICAgICAgICAgICAgIHIgPSBjbGFtcDE2KHIpOworICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSAocjw8MTYpIHwgKGwgJiAweEZGRkYpOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3V0RnJhbWVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBybCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMl90ICo+KGluKTsKKyAgICAgICAgICAgICAgICAgICAgaW4gKz0gMjsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBsID0gbXVsUkwoMSwgcmwsIHZybCkgPj4gMTI7CisgICAgICAgICAgICAgICAgICAgIGludDMyX3QgciA9IG11bFJMKDAsIHJsLCB2cmwpID4+IDEyOworICAgICAgICAgICAgICAgICAgICAqb3V0KysgPSAocjw8MTYpIHwgKGwgJiAweEZGRkYpOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3V0RnJhbWVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVyIGZvcm1hdDogJWQiLCB0LT5tTWl4ZXJGb3JtYXQpOworICAgICAgICB9CisgICAgICAgIG51bUZyYW1lcyAtPSBiLmZyYW1lQ291bnQ7CisgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZiKTsKKyAgICB9Cit9CisKKy8qIFRPRE86IGNvbnNpZGVyIHdoZXRoZXIgdGhpcyBsZXZlbCBvZiBvcHRpbWl6YXRpb24gaXMgbmVjZXNzYXJ5LgorICogUGVyaGFwcyBqdXN0IHN0aWNrIHdpdGggYSBzaW5nbGUgZm9yIGxvb3AuCisgKi8KKworLy8gTmVlZHMgdG8gZGVyaXZlIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50IChjb25zdGV4cHIpLiAgQ291bGQgYmUgdGFyZ2V0ZWQgdG8gZ28KKy8vIHRvIGEgTU9OT1ZPTCBtaXh0eXBlIGJhc2VkIG9uIE1BWF9OVU1fVk9MVU1FUywgYnV0IHRoYXQncyBhbiB1bm5lY2Vzc2FyeSBjb21wbGljYXRpb24uCisjZGVmaW5lIE1JWFRZUEVfTU9OT1ZPTChtaXh0eXBlKSAoKG1peHR5cGUpID09IE1JWFRZUEVfTVVMVEkgPyBNSVhUWVBFX01VTFRJX01PTk9WT0wgOiBcCisgICAgICAgIChtaXh0eXBlKSA9PSBNSVhUWVBFX01VTFRJX1NBVkVPTkxZID8gTUlYVFlQRV9NVUxUSV9TQVZFT05MWV9NT05PVk9MIDogKG1peHR5cGUpKQorCisvKiBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCisgKiBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogVEE6IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICovCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsCisgICAgICAgIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVFYsIHR5cGVuYW1lIFRBLCB0eXBlbmFtZSBUQVY+CitzdGF0aWMgdm9pZCB2b2x1bWVSYW1wTXVsdGkodWludDMyX3QgY2hhbm5lbHMsIFRPKiBvdXQsIHNpemVfdCBmcmFtZUNvdW50LAorICAgICAgICBjb25zdCBUSSogaW4sIFRBKiBhdXgsIFRWICp2b2wsIGNvbnN0IFRWICp2b2xpbmMsIFRBViAqdm9sYSwgVEFWIHZvbGFpbmMpCit7CisgICAgc3dpdGNoIChjaGFubmVscykgeworICAgIGNhc2UgMToKKyAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEUsIDE+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xpbmMsIHZvbGEsIHZvbGFpbmMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFLCAyPihvdXQsIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCAzPihvdXQsCisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xpbmMsIHZvbGEsIHZvbGFpbmMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDQ6CisgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDQ+KG91dCwKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgNToKKyAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgNT4ob3V0LAorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRV9NT05PVk9MKE1JWFRZUEUpLCA2PihvdXQsCisgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xpbmMsIHZvbGEsIHZvbGFpbmMpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDc6CisgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDc+KG91dCwKKyAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGluYywgdm9sYSwgdm9sYWluYyk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgODoKKyAgICAgICAgdm9sdW1lUmFtcE11bHRpPE1JWFRZUEVfTU9OT1ZPTChNSVhUWVBFKSwgOD4ob3V0LAorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIGluLCBhdXgsIHZvbCwgdm9saW5jLCB2b2xhLCB2b2xhaW5jKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCisgKiBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogVEE6IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICovCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsCisgICAgICAgIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVFYsIHR5cGVuYW1lIFRBLCB0eXBlbmFtZSBUQVY+CitzdGF0aWMgdm9pZCB2b2x1bWVNdWx0aSh1aW50MzJfdCBjaGFubmVscywgVE8qIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIGNvbnN0IFRJKiBpbiwgVEEqIGF1eCwgY29uc3QgVFYgKnZvbCwgVEFWIHZvbGEpCit7CisgICAgc3dpdGNoIChjaGFubmVscykgeworICAgIGNhc2UgMToKKyAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRSwgMT4ob3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCB2b2wsIHZvbGEpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEUsIDI+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDM+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA0OgorICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDQ+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA1OgorICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDU+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA2OgorICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDY+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA3OgorICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDc+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSA4OgorICAgICAgICB2b2x1bWVNdWx0aTxNSVhUWVBFX01PTk9WT0woTUlYVFlQRSksIDg+KG91dCwgZnJhbWVDb3VudCwgaW4sIGF1eCwgdm9sLCB2b2xhKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorfQorCisvKiBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCisgKiBVU0VGTE9BVFZPTCAoc2V0IHRvIHRydWUgaWYgZmxvYXQgdm9sdW1lIGlzIHVzZWQpCisgKiBBREpVU1RWT0wgICAoc2V0IHRvIHRydWUgaWYgdm9sdW1lIHJhbXAgcGFyYW1ldGVycyBuZWVkcyBhZGp1c3RtZW50IGFmdGVyd2FyZHMpCisgKiBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogVEE6IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICovCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIGJvb2wgVVNFRkxPQVRWT0wsIGJvb2wgQURKVVNUVk9MLAorICAgIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+Cit2b2lkIEF1ZGlvTWl4ZXJCYXNlOjpUcmFja0Jhc2U6OnZvbHVtZU1peChUTyAqb3V0LCBzaXplX3Qgb3V0RnJhbWVzLAorICAgICAgICBjb25zdCBUSSAqaW4sIFRBICphdXgsIGJvb2wgcmFtcCkKK3sKKyAgICBpZiAoVVNFRkxPQVRWT0wpIHsKKyAgICAgICAgaWYgKHJhbXApIHsKKyAgICAgICAgICAgIHZvbHVtZVJhbXBNdWx0aTxNSVhUWVBFPihtTWl4ZXJDaGFubmVsQ291bnQsIG91dCwgb3V0RnJhbWVzLCBpbiwgYXV4LAorICAgICAgICAgICAgICAgICAgICBtUHJldlZvbHVtZSwgbVZvbHVtZUluYywKKyNpZmRlZiBGTE9BVF9BVVgKKyAgICAgICAgICAgICAgICAgICAgJm1QcmV2QXV4TGV2ZWwsIG1BdXhJbmMKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICZwcmV2QXV4TGV2ZWwsIGF1eEluYworI2VuZGlmCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGlmIChBREpVU1RWT0wpIHsKKyAgICAgICAgICAgICAgICBhZGp1c3RWb2x1bWVSYW1wKGF1eCAhPSBOVUxMLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZvbHVtZU11bHRpPE1JWFRZUEU+KG1NaXhlckNoYW5uZWxDb3VudCwgb3V0LCBvdXRGcmFtZXMsIGluLCBhdXgsCisgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWUsCisjaWZkZWYgRkxPQVRfQVVYCisgICAgICAgICAgICAgICAgICAgIG1BdXhMZXZlbAorI2Vsc2UKKyAgICAgICAgICAgICAgICAgICAgYXV4TGV2ZWwKKyNlbmRpZgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChyYW1wKSB7CisgICAgICAgICAgICB2b2x1bWVSYW1wTXVsdGk8TUlYVFlQRT4obU1peGVyQ2hhbm5lbENvdW50LCBvdXQsIG91dEZyYW1lcywgaW4sIGF1eCwKKyAgICAgICAgICAgICAgICAgICAgcHJldlZvbHVtZSwgdm9sdW1lSW5jLCAmcHJldkF1eExldmVsLCBhdXhJbmMpOworICAgICAgICAgICAgaWYgKEFESlVTVFZPTCkgeworICAgICAgICAgICAgICAgIGFkanVzdFZvbHVtZVJhbXAoYXV4ICE9IE5VTEwpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdm9sdW1lTXVsdGk8TUlYVFlQRT4obU1peGVyQ2hhbm5lbENvdW50LCBvdXQsIG91dEZyYW1lcywgaW4sIGF1eCwKKyAgICAgICAgICAgICAgICAgICAgdm9sdW1lLCBhdXhMZXZlbCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIFRoaXMgcHJvY2VzcyBob29rIGlzIGNhbGxlZCB3aGVuIHRoZXJlIGlzIGEgc2luZ2xlIHRyYWNrIHdpdGhvdXQKKyAqIGF1eCBidWZmZXIsIHZvbHVtZSByYW1wLCBvciByZXNhbXBsaW5nLgorICogVE9ETzogVXBkYXRlIHRoZSBob29rIHNlbGVjdGlvbjogdGhpcyBjYW4gcHJvcGVybHkgaGFuZGxlIGF1eCBhbmQgcmFtcC4KKyAqCisgKiBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCisgKiBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogVEE6IGludDMyX3QgKFE0LjI3KQorICovCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+Cit2b2lkIEF1ZGlvTWl4ZXJCYXNlOjpwcm9jZXNzX19ub1Jlc2FtcGxlT25lVHJhY2soKQoreworICAgIEFMT0dWVigicHJvY2Vzc19fbm9SZXNhbXBsZU9uZVRyYWNrXG4iKTsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1FbmFibGVkLnNpemUoKSAhPSAxLAorICAgICAgICAgICAgIiV6dSAhPSAxIHRyYWNrcyBlbmFibGVkIiwgbUVuYWJsZWQuc2l6ZSgpKTsKKyAgICBjb25zdCBzdGQ6OnNoYXJlZF9wdHI8VHJhY2tCYXNlPiAmdCA9IG1UcmFja3NbbUVuYWJsZWRbMF1dOworICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxzID0gdC0+bU1peGVyQ2hhbm5lbENvdW50OworICAgIFRPKiBvdXQgPSByZWludGVycHJldF9jYXN0PFRPKj4odC0+bWFpbkJ1ZmZlcik7CisgICAgVEEqIGF1eCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VEEqPih0LT5hdXhCdWZmZXIpOworICAgIGNvbnN0IGJvb2wgcmFtcCA9IHQtPm5lZWRzUmFtcCgpOworCisgICAgZm9yIChzaXplX3QgbnVtRnJhbWVzID0gbUZyYW1lQ291bnQ7IG51bUZyYW1lcyA+IDA7ICkgeworICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGIodC0+YnVmZmVyKTsKKyAgICAgICAgLy8gZ2V0IGlucHV0IGJ1ZmZlcgorICAgICAgICBiLmZyYW1lQ291bnQgPSBudW1GcmFtZXM7CisgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5nZXROZXh0QnVmZmVyKCZiKTsKKyAgICAgICAgY29uc3QgVEkgKmluID0gcmVpbnRlcnByZXRfY2FzdDxUSSo+KGIucmF3KTsKKworICAgICAgICAvLyBpbiA9PSBOVUxMIGNhbiBoYXBwZW4gaWYgdGhlIHRyYWNrIHdhcyBmbHVzaGVkIGp1c3QgYWZ0ZXIgaGF2aW5nCisgICAgICAgIC8vIGJlZW4gZW5hYmxlZCBmb3IgbWl4aW5nLgorICAgICAgICBpZiAoaW4gPT0gTlVMTCB8fCAoKCh1aW50cHRyX3QpaW4pICYgMykpIHsKKyAgICAgICAgICAgIG1lbXNldChvdXQsIDAsIG51bUZyYW1lcworICAgICAgICAgICAgICAgICAgICAqIGNoYW5uZWxzICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh0LT5tTWl4ZXJGb3JtYXQpKTsKKyAgICAgICAgICAgIEFMT0dFX0lGKCgoKHVpbnRwdHJfdClpbikgJiAzKSwgInByb2Nlc3NfX25vUmVzYW1wbGVPbmVUcmFjazogYnVzIGVycm9yOiAiCisgICAgICAgICAgICAgICAgICAgICJidWZmZXIgJXAgdHJhY2sgJXAsIGNoYW5uZWxzICVkLCBuZWVkcyAlI3giLAorICAgICAgICAgICAgICAgICAgICBpbiwgJnQsIHQtPmNoYW5uZWxDb3VudCwgdC0+bmVlZHMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc2l6ZV90IG91dEZyYW1lcyA9IGIuZnJhbWVDb3VudDsKKyAgICAgICAgdC0+dm9sdW1lTWl4PE1JWFRZUEUsIGlzX3NhbWU8VEksIGZsb2F0Pjo6dmFsdWUgLyogVVNFRkxPQVRWT0wgKi8sIGZhbHNlIC8qIEFESlVTVFZPTCAqLz4gKAorICAgICAgICAgICAgICAgIG91dCwgb3V0RnJhbWVzLCBpbiwgYXV4LCByYW1wKTsKKworICAgICAgICBvdXQgKz0gb3V0RnJhbWVzICogY2hhbm5lbHM7CisgICAgICAgIGlmIChhdXggIT0gTlVMTCkgeworICAgICAgICAgICAgYXV4ICs9IG91dEZyYW1lczsKKyAgICAgICAgfQorICAgICAgICBudW1GcmFtZXMgLT0gYi5mcmFtZUNvdW50OworCisgICAgICAgIC8vIHJlbGVhc2UgYnVmZmVyCisgICAgICAgIHQtPmJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZiKTsKKyAgICB9CisgICAgaWYgKHJhbXApIHsKKyAgICAgICAgdC0+YWRqdXN0Vm9sdW1lUmFtcChhdXggIT0gTlVMTCwgaXNfc2FtZTxUSSwgZmxvYXQ+Ojp2YWx1ZSk7CisgICAgfQorfQorCisvKiBUaGlzIHRyYWNrIGhvb2sgaXMgY2FsbGVkIHRvIGRvIHJlc2FtcGxpbmcgdGhlbiBtaXhpbmcsCisgKiBwdWxsaW5nIGZyb20gdGhlIHRyYWNrJ3MgdXBzdHJlYW0gQXVkaW9CdWZmZXJQcm92aWRlci4KKyAqCisgKiBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCisgKiBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgKiBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICogVEE6IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICovCit0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+Cit2b2lkIEF1ZGlvTWl4ZXJCYXNlOjpUcmFja0Jhc2U6OnRyYWNrX19SZXNhbXBsZShUTyogb3V0LCBzaXplX3Qgb3V0RnJhbWVDb3VudCwgVE8qIHRlbXAsIFRBKiBhdXgpCit7CisgICAgQUxPR1ZWKCJ0cmFja19fUmVzYW1wbGVcbiIpOworICAgIG1SZXNhbXBsZXItPnNldFNhbXBsZVJhdGUoc2FtcGxlUmF0ZSk7CisgICAgY29uc3QgYm9vbCByYW1wID0gbmVlZHNSYW1wKCk7CisgICAgaWYgKHJhbXAgfHwgYXV4ICE9IE5VTEwpIHsKKyAgICAgICAgLy8gaWYgcmFtcDogICAgICAgIHJlc2FtcGxlIHdpdGggdW5pdHkgZ2FpbiB0byB0ZW1wIGJ1ZmZlciBhbmQgc2NhbGUvbWl4IGluIDJuZCBzdGVwLgorICAgICAgICAvLyBpZiBhdXggIT0gTlVMTDogcmVzYW1wbGUgd2l0aCB1bml0eSBnYWluIHRvIHRlbXAgYnVmZmVyIHRoZW4gYXBwbHkgc2VuZCBsZXZlbC4KKworICAgICAgICBtUmVzYW1wbGVyLT5zZXRWb2x1bWUoVU5JVFlfR0FJTl9GTE9BVCwgVU5JVFlfR0FJTl9GTE9BVCk7CisgICAgICAgIG1lbXNldCh0ZW1wLCAwLCBvdXRGcmFtZUNvdW50ICogbU1peGVyQ2hhbm5lbENvdW50ICogc2l6ZW9mKFRPKSk7CisgICAgICAgIG1SZXNhbXBsZXItPnJlc2FtcGxlKChpbnQzMl90Kil0ZW1wLCBvdXRGcmFtZUNvdW50LCBidWZmZXJQcm92aWRlcik7CisKKyAgICAgICAgdm9sdW1lTWl4PE1JWFRZUEUsIGlzX3NhbWU8VEksIGZsb2F0Pjo6dmFsdWUgLyogVVNFRkxPQVRWT0wgKi8sIHRydWUgLyogQURKVVNUVk9MICovPigKKyAgICAgICAgICAgICAgICBvdXQsIG91dEZyYW1lQ291bnQsIHRlbXAsIGF1eCwgcmFtcCk7CisKKyAgICB9IGVsc2UgeyAvLyBjb25zdGFudCB2b2x1bWUgZ2FpbgorICAgICAgICBtUmVzYW1wbGVyLT5zZXRWb2x1bWUobVZvbHVtZVswXSwgbVZvbHVtZVsxXSk7CisgICAgICAgIG1SZXNhbXBsZXItPnJlc2FtcGxlKChpbnQzMl90KilvdXQsIG91dEZyYW1lQ291bnQsIGJ1ZmZlclByb3ZpZGVyKTsKKyAgICB9Cit9CisKKy8qIFRoaXMgdHJhY2sgaG9vayBpcyBjYWxsZWQgdG8gbWl4IGEgdHJhY2ssIHdoZW4gbm8gcmVzYW1wbGluZyBpcyByZXF1aXJlZC4KKyAqIFRoZSBpbnB1dCBidWZmZXIgc2hvdWxkIGJlIHByZXNlbnQgaW4gaW4uCisgKgorICogTUlYVFlQRSAgICAgKHNlZSBBdWRpb01peGVyT3BzLmggTUlYVFlQRV8qIGVudW1lcmF0aW9uKQorICogVE86IGludDMyX3QgKFE0LjI3KSBvciBmbG9hdAorICogVEk6IGludDMyX3QgKFE0LjI3KSBvciBpbnQxNl90IChRMC4xNSkgb3IgZmxvYXQKKyAqIFRBOiBpbnQzMl90IChRNC4yNykgb3IgZmxvYXQKKyAqLwordGVtcGxhdGUgPGludCBNSVhUWVBFLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgordm9pZCBBdWRpb01peGVyQmFzZTo6VHJhY2tCYXNlOjp0cmFja19fTm9SZXNhbXBsZSgKKyAgICAgICAgVE8qIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIFRPKiB0ZW1wIF9fdW51c2VkLCBUQSogYXV4KQoreworICAgIEFMT0dWVigidHJhY2tfX05vUmVzYW1wbGVcbiIpOworICAgIGNvbnN0IFRJICppbiA9IHN0YXRpY19jYXN0PGNvbnN0IFRJICo+KG1Jbik7CisKKyAgICB2b2x1bWVNaXg8TUlYVFlQRSwgaXNfc2FtZTxUSSwgZmxvYXQ+Ojp2YWx1ZSAvKiBVU0VGTE9BVFZPTCAqLywgdHJ1ZSAvKiBBREpVU1RWT0wgKi8+KAorICAgICAgICAgICAgb3V0LCBmcmFtZUNvdW50LCBpbiwgYXV4LCBuZWVkc1JhbXAoKSk7CisKKyAgICAvLyBNSVhUWVBFX01PTk9FWFBBTkQgcmVhZHMgYSBzaW5nbGUgaW5wdXQgY2hhbm5lbCBhbmQgZXhwYW5kcyB0byBOQ0hBTiBvdXRwdXQgY2hhbm5lbHMuCisgICAgLy8gTUlYVFlQRV9NVUxUSSByZWFkcyBOQ0hBTiBpbnB1dCBjaGFubmVscyBhbmQgcGxhY2VzIHRvIE5DSEFOIG91dHB1dCBjaGFubmVscy4KKyAgICBpbiArPSAoTUlYVFlQRSA9PSBNSVhUWVBFX01PTk9FWFBBTkQpID8gZnJhbWVDb3VudCA6IGZyYW1lQ291bnQgKiBtTWl4ZXJDaGFubmVsQ291bnQ7CisgICAgbUluID0gaW47Cit9CisKKy8qIFRoZSBNaXhlciBlbmdpbmUgZ2VuZXJhdGVzIGVpdGhlciBpbnQzMl90IChRNF8yNykgb3IgZmxvYXQgZGF0YS4KKyAqIFdlIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIGNvbnZlcnQgdGhlIGVuZ2luZSBidWZmZXJzCisgKiB0byB0aGUgZGVzaXJlZCBtaXhlciBvdXRwdXQgZm9ybWF0LCBlaXRoZXIgaW50MTZfdCAoUS4xNSkgb3IgZmxvYXQuCisgKi8KKy8qIHN0YXRpYyAqLwordm9pZCBBdWRpb01peGVyQmFzZTo6Y29udmVydE1peGVyRm9ybWF0KHZvaWQgKm91dCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQsCisgICAgICAgIHZvaWQgKmluLCBhdWRpb19mb3JtYXRfdCBtaXhlckluRm9ybWF0LCBzaXplX3Qgc2FtcGxlQ291bnQpCit7CisgICAgc3dpdGNoIChtaXhlckluRm9ybWF0KSB7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICBzd2l0Y2ggKG1peGVyT3V0Rm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIG1lbWNweShvdXQsIGluLCBzYW1wbGVDb3VudCAqIHNpemVvZihmbG9hdCkpOyAvLyBNRU1DUFkuIFRPRE8gb3B0aW1pemUgb3V0CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdCgoaW50MTZfdCopb3V0LCAoZmxvYXQqKWluLCBzYW1wbGVDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlck91dEZvcm1hdDogJSN4IiwgbWl4ZXJPdXRGb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgc3dpdGNoIChtaXhlck91dEZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ6CisgICAgICAgICAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9xNF8yNygoZmxvYXQqKW91dCwgKGNvbnN0IGludDMyX3QqKWluLCBzYW1wbGVDb3VudCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIG1lbWNweV90b19pMTZfZnJvbV9xNF8yNygoaW50MTZfdCopb3V0LCAoY29uc3QgaW50MzJfdCopaW4sIHNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVyT3V0Rm9ybWF0OiAlI3giLCBtaXhlck91dEZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJJbkZvcm1hdDogJSN4IiwgbWl4ZXJJbkZvcm1hdCk7CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworLyogUmV0dXJucyB0aGUgcHJvcGVyIHRyYWNrIGhvb2sgdG8gdXNlIGZvciBtaXhpbmcgdGhlIHRyYWNrIGludG8gdGhlIG91dHB1dCBidWZmZXIuCisgKi8KKy8qIHN0YXRpYyAqLworQXVkaW9NaXhlckJhc2U6Omhvb2tfdCBBdWRpb01peGVyQmFzZTo6VHJhY2tCYXNlOjpnZXRUcmFja0hvb2soaW50IHRyYWNrVHlwZSwgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBtaXhlckluRm9ybWF0LCBhdWRpb19mb3JtYXRfdCBtaXhlck91dEZvcm1hdCBfX3VudXNlZCkKK3sKKyAgICBpZiAoIWtVc2VOZXdNaXhlciAmJiBjaGFubmVsQ291bnQgPT0gRkNDXzIgJiYgbWl4ZXJJbkZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNXzE2X0JJVCkgeworICAgICAgICBzd2l0Y2ggKHRyYWNrVHlwZSkgeworICAgICAgICBjYXNlIFRSQUNLVFlQRV9OT1A6CisgICAgICAgICAgICByZXR1cm4gJlRyYWNrQmFzZTo6dHJhY2tfX25vcDsKKyAgICAgICAgY2FzZSBUUkFDS1RZUEVfUkVTQU1QTEU6CisgICAgICAgICAgICByZXR1cm4gJlRyYWNrQmFzZTo6dHJhY2tfX2dlbmVyaWNSZXNhbXBsZTsKKyAgICAgICAgY2FzZSBUUkFDS1RZUEVfTk9SRVNBTVBMRU1PTk86CisgICAgICAgICAgICByZXR1cm4gJlRyYWNrQmFzZTo6dHJhY2tfXzE2Qml0c01vbm87CisgICAgICAgIGNhc2UgVFJBQ0tUWVBFX05PUkVTQU1QTEU6CisgICAgICAgICAgICByZXR1cm4gJlRyYWNrQmFzZTo6dHJhY2tfXzE2Qml0c1N0ZXJlbzsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCB0cmFja1R5cGU6ICVkIiwgdHJhY2tUeXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIExPR19BTFdBWVNfRkFUQUxfSUYoY2hhbm5lbENvdW50ID4gTUFYX05VTV9DSEFOTkVMUyk7CisgICAgc3dpdGNoICh0cmFja1R5cGUpIHsKKyAgICBjYXNlIFRSQUNLVFlQRV9OT1A6CisgICAgICAgIHJldHVybiAmVHJhY2tCYXNlOjp0cmFja19fbm9wOworICAgIGNhc2UgVFJBQ0tUWVBFX1JFU0FNUExFOgorICAgICAgICBzd2l0Y2ggKG1peGVySW5Gb3JtYXQpIHsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICAgICAgcmV0dXJuIChBdWRpb01peGVyQmFzZTo6aG9va190KSAmVHJhY2tCYXNlOjp0cmFja19fUmVzYW1wbGU8CisgICAgICAgICAgICAgICAgICAgIE1JWFRZUEVfTVVMVEksIGZsb2F0IC8qVE8qLywgZmxvYXQgLypUSSovLCBUWVBFX0FVWD47CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXJCYXNlOjpob29rX3QpICZUcmFja0Jhc2U6OnRyYWNrX19SZXNhbXBsZTwKKyAgICAgICAgICAgICAgICAgICAgTUlYVFlQRV9NVUxUSSwgaW50MzJfdCAvKlRPKi8sIGludDE2X3QgLypUSSovLCBUWVBFX0FVWD47CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgbWl4ZXJJbkZvcm1hdDogJSN4IiwgbWl4ZXJJbkZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIFRSQUNLVFlQRV9OT1JFU0FNUExFTU9OTzoKKyAgICAgICAgc3dpdGNoIChtaXhlckluRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlckJhc2U6Omhvb2tfdCkgJlRyYWNrQmFzZTo6dHJhY2tfX05vUmVzYW1wbGU8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlYVFlQRV9NT05PRVhQQU5ELCBmbG9hdCAvKlRPKi8sIGZsb2F0IC8qVEkqLywgVFlQRV9BVVg+OworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgcmV0dXJuIChBdWRpb01peGVyQmFzZTo6aG9va190KSAmVHJhY2tCYXNlOjp0cmFja19fTm9SZXNhbXBsZTwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSVhUWVBFX01PTk9FWFBBTkQsIGludDMyX3QgLypUTyovLCBpbnQxNl90IC8qVEkqLywgVFlQRV9BVVg+OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVySW5Gb3JtYXQ6ICUjeCIsIG1peGVySW5Gb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBUUkFDS1RZUEVfTk9SRVNBTVBMRToKKyAgICAgICAgc3dpdGNoIChtaXhlckluRm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIHJldHVybiAoQXVkaW9NaXhlckJhc2U6Omhvb2tfdCkgJlRyYWNrQmFzZTo6dHJhY2tfX05vUmVzYW1wbGU8CisgICAgICAgICAgICAgICAgICAgIE1JWFRZUEVfTVVMVEksIGZsb2F0IC8qVE8qLywgZmxvYXQgLypUSSovLCBUWVBFX0FVWD47CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ6CisgICAgICAgICAgICByZXR1cm4gKEF1ZGlvTWl4ZXJCYXNlOjpob29rX3QpICZUcmFja0Jhc2U6OnRyYWNrX19Ob1Jlc2FtcGxlPAorICAgICAgICAgICAgICAgICAgICBNSVhUWVBFX01VTFRJLCBpbnQzMl90IC8qVE8qLywgaW50MTZfdCAvKlRJKi8sIFRZUEVfQVVYPjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlckluRm9ybWF0OiAlI3giLCBtaXhlckluRm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCB0cmFja1R5cGU6ICVkIiwgdHJhY2tUeXBlKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCisvKiBSZXR1cm5zIHRoZSBwcm9wZXIgcHJvY2VzcyBob29rIGZvciBtaXhpbmcgdHJhY2tzLiBDdXJyZW50bHkgd29ya3Mgb25seSBmb3IKKyAqIFBST0NFU1NUWVBFX05PUkVTQU1QTEVPTkVUUkFDSywgYSBtaXggaW52b2x2aW5nIG9uZSB0cmFjaywgbm8gcmVzYW1wbGluZy4KKyAqCisgKiBUT0RPOiBEdWUgdG8gdGhlIHNwZWNpYWwgbWl4aW5nIGNvbnNpZGVyYXRpb25zIG9mIGR1cGxpY2F0aW5nIHRvCisgKiBhIHN0ZXJlbyBvdXRwdXQgdHJhY2ssIHRoZSBpbnB1dCB0cmFjayBjYW5ub3QgYmUgTU9OTy4gIFRoaXMgc2hvdWxkIGJlCisgKiBwcmV2ZW50ZWQgYnkgdGhlIGNhbGxlci4KKyAqLworLyogc3RhdGljICovCitBdWRpb01peGVyQmFzZTo6cHJvY2Vzc19ob29rX3QgQXVkaW9NaXhlckJhc2U6OmdldFByb2Nlc3NIb29rKAorICAgICAgICBpbnQgcHJvY2Vzc1R5cGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgbWl4ZXJJbkZvcm1hdCwgYXVkaW9fZm9ybWF0X3QgbWl4ZXJPdXRGb3JtYXQpCit7CisgICAgaWYgKHByb2Nlc3NUeXBlICE9IFBST0NFU1NUWVBFX05PUkVTQU1QTEVPTkVUUkFDSykgeyAvLyBPbmx5IE5PUkVTQU1QTEVPTkVUUkFDSworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJiYWQgcHJvY2Vzc1R5cGU6ICVkIiwgcHJvY2Vzc1R5cGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFrVXNlTmV3TWl4ZXIgJiYgY2hhbm5lbENvdW50ID09IEZDQ18yICYmIG1peGVySW5Gb3JtYXQgPT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKKyAgICAgICAgcmV0dXJuICZBdWRpb01peGVyQmFzZTo6cHJvY2Vzc19fb25lVHJhY2sxNkJpdHNTdGVyZW9Ob1Jlc2FtcGxpbmc7CisgICAgfQorICAgIExPR19BTFdBWVNfRkFUQUxfSUYoY2hhbm5lbENvdW50ID4gTUFYX05VTV9DSEFOTkVMUyk7CisgICAgc3dpdGNoIChtaXhlckluRm9ybWF0KSB7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICBzd2l0Y2ggKG1peGVyT3V0Rm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIHJldHVybiAmQXVkaW9NaXhlckJhc2U6OnByb2Nlc3NfX25vUmVzYW1wbGVPbmVUcmFjazwKKyAgICAgICAgICAgICAgICAgICAgTUlYVFlQRV9NVUxUSV9TQVZFT05MWSwgZmxvYXQgLypUTyovLCBmbG9hdCAvKlRJKi8sIFRZUEVfQVVYPjsKKyAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDoKKyAgICAgICAgICAgIHJldHVybiAmQXVkaW9NaXhlckJhc2U6OnByb2Nlc3NfX25vUmVzYW1wbGVPbmVUcmFjazwKKyAgICAgICAgICAgICAgICAgICAgTUlYVFlQRV9NVUxUSV9TQVZFT05MWSwgaW50MTZfdCAvKlRPKi8sIGZsb2F0IC8qVEkqLywgVFlQRV9BVVg+OworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVyT3V0Rm9ybWF0OiAlI3giLCBtaXhlck91dEZvcm1hdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICBzd2l0Y2ggKG1peGVyT3V0Rm9ybWF0KSB7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIHJldHVybiAmQXVkaW9NaXhlckJhc2U6OnByb2Nlc3NfX25vUmVzYW1wbGVPbmVUcmFjazwKKyAgICAgICAgICAgICAgICAgICAgTUlYVFlQRV9NVUxUSV9TQVZFT05MWSwgZmxvYXQgLypUTyovLCBpbnQxNl90IC8qVEkqLywgVFlQRV9BVVg+OworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgcmV0dXJuICZBdWRpb01peGVyQmFzZTo6cHJvY2Vzc19fbm9SZXNhbXBsZU9uZVRyYWNrPAorICAgICAgICAgICAgICAgICAgICBNSVhUWVBFX01VTFRJX1NBVkVPTkxZLCBpbnQxNl90IC8qVE8qLywgaW50MTZfdCAvKlRJKi8sIFRZUEVfQVVYPjsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImJhZCBtaXhlck91dEZvcm1hdDogJSN4IiwgbWl4ZXJPdXRGb3JtYXQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiYmFkIG1peGVySW5Gb3JtYXQ6ICUjeCIsIG1peGVySW5Gb3JtYXQpOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uY3BwCmluZGV4IGVlZWVjY2UuLmVjNTZiMDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckR5bi5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmNwcApAQCAtMjAxLDYgKzIwMSw4IEBACiAgICAgICAgICAgICAicm8uYXVkaW8ucmVzYW1wbGVyLnBzZC5zdG9wYmFuZCIsIG1Qcm9wZXJ0eVN0b3BiYW5kQXR0ZW51YXRpb24pOwogICAgIG1Qcm9wZXJ0eUN1dG9mZlBlcmNlbnQgPSBwcm9wZXJ0eV9nZXRfaW50MzIoCiAgICAgICAgICAgICAicm8uYXVkaW8ucmVzYW1wbGVyLnBzZC5jdXRvZmZfcGVyY2VudCIsIG1Qcm9wZXJ0eUN1dG9mZlBlcmNlbnQpOworICAgIG1Qcm9wZXJ0eVRyYW5zaXRpb25CYW5kd2lkdGhDaGVhdCA9IHByb3BlcnR5X2dldF9pbnQzMigKKyAgICAgICAgICAgICJyby5hdWRpby5yZXNhbXBsZXIucHNkLnRid2NoZWF0IiwgbVByb3BlcnR5VHJhbnNpdGlvbkJhbmR3aWR0aENoZWF0KTsKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVEMsIHR5cGVuYW1lIFRJLCB0eXBlbmFtZSBUTz4KQEAgLTI0Myw3ICsyNDUsNyBAQAogewogICAgIC8vIGNvbXB1dGUgdGhlIG5vcm1hbGl6ZWQgdHJhbnNpdGlvbiBiYW5kd2lkdGgKICAgICBjb25zdCBkb3VibGUgdGJ3ID0gZmlyS2Fpc2VyVGJ3KGMubUhhbGZOdW1Db2Vmcywgc3RvcEJhbmRBdHRlbik7Ci0gICAgY29uc3QgZG91YmxlIGhhbGZidyA9IHRidyAvIDIuOworICAgIGNvbnN0IGRvdWJsZSBoYWxmYncgPSB0YncgKiAwLjU7CiAKICAgICBkb3VibGUgZmNyOyAvLyBjb21wdXRlIGZjciwgdGhlIDMgZEIgYW1wbGl0dWRlIGN1dC1vZmYuCiAgICAgaWYgKGluU2FtcGxlUmF0ZSA8IG91dFNhbXBsZVJhdGUpIHsgLy8gdXBzYW1wbGUKQEAgLTI5MCw3ICsyOTIsNyBAQAogCiAjaWYgMAogICAgIC8vIEtlZXAgdGhpcyBkZWJ1ZyBjb2RlIGluIGNhc2UgYW4gYXBwIGNhdXNlcyByZXNhbXBsZXIgZGVzaWduIGlzc3Vlcy4KLSAgICBjb25zdCBkb3VibGUgaGFsZmJ3ID0gdGJ3IC8gMi47CisgICAgY29uc3QgZG91YmxlIGhhbGZidyA9IHRidyAqIDAuNTsKICAgICAvLyBwcmludCBiYXNpYyBmaWx0ZXIgc3RhdHMKICAgICBBTE9HRCgiTDolZCAgaG5jOiVkICBzdG9wQmFuZEF0dGVuOiVsZiAgZmNyOiVsZiAgYXR0ZW46JWxmICB0Ync6JWxmXG4iLAogICAgICAgICAgICAgYy5tTCwgYy5tSGFsZk51bUNvZWZzLCBzdG9wQmFuZEF0dGVuLCBmY3IsIGF0dGVudWF0aW9uLCB0YncpOwpAQCAtMzA1LDcgKzMwNyw3IEBACiAKICAgICBjb25zdCBpbnQzMl90IHBhc3NTdGVwcyA9IDEwMDA7CiAKLSAgICB0ZXN0RmlyKGNvZWZzLCBjLm1MLCBjLm1IYWxmTnVtQ29lZnMsIGZwLCBmcywgcGFzc1N0ZXBzLCBwYXNzU3RlcHMgKiBjLk1MIC8qc3RvcFN0ZXBzKi8sCisgICAgdGVzdEZpcihjb2VmcywgYy5tTCwgYy5tSGFsZk51bUNvZWZzLCBmcCwgZnMsIHBhc3NTdGVwcywgcGFzc1N0ZXBzICogYy5tTCAvKnN0b3BTdGVwcyovLAogICAgICAgICAgICAgcGFzc01pbiwgcGFzc01heCwgcGFzc1JpcHBsZSwgc3RvcE1heCwgc3RvcFJpcHBsZSk7CiAgICAgQUxPR0QoInBhc3NiYW5kKCVsZiwgJWxmKTogJS44bGYgJS44bGYgJS44bGZcbiIsIDAuLCBmcCwgcGFzc01pbiwgcGFzc01heCwgcGFzc1JpcHBsZSk7CiAgICAgQUxPR0QoInN0b3BiYW5kKCVsZiwgJWxmKTogJS44bGYgJS4zbGZcbiIsIGZzLCAwLjUsIHN0b3BNYXgsIHN0b3BSaXBwbGUpOwpAQCAtMzc5LDEyICszODEsMjggQEAKICAgICAgICAgICAgIGhhbGZMZW5ndGggPSBtUHJvcGVydHlIYWxmRmlsdGVyTGVuZ3RoOwogICAgICAgICAgICAgc3RvcEJhbmRBdHRlbiA9IG1Qcm9wZXJ0eVN0b3BiYW5kQXR0ZW51YXRpb247CiAgICAgICAgICAgICB1c2VTMzIgPSB0cnVlOwotICAgICAgICAgICAgZmNyID0gbUluU2FtcGxlUmF0ZSA8PSBtU2FtcGxlUmF0ZQotICAgICAgICAgICAgICAgICAgICA/IDAuNSA6IDAuNSAqIG1TYW1wbGVSYXRlIC8gbUluU2FtcGxlUmF0ZTsKLSAgICAgICAgICAgIGZjciAqPSBtUHJvcGVydHlDdXRvZmZQZXJjZW50IC8gMTAwLjsKKworICAgICAgICAgICAgLy8gVXNlIGVpdGhlciB0aGUgc3RvcGJhbmQgbG9jYXRpb24gZm9yIGRlc2lnbiAodGJ3Q2hlYXQpCisgICAgICAgICAgICAvLyBvciB1c2UgdGhlIDNkQiBjdXRvZmYgbG9jYXRpb24gZm9yIGRlc2lnbiAoZmNyKS4KKyAgICAgICAgICAgIC8vIFRoaXMgY2hvaWNlIGlzIGV4Y2x1c2l2ZSBhbmQgYmFzZWQgb24gd2hldGhlciBmY3IgPiAwLgorICAgICAgICAgICAgaWYgKG1Qcm9wZXJ0eVRyYW5zaXRpb25CYW5kd2lkdGhDaGVhdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgdGJ3Q2hlYXQgPSBtUHJvcGVydHlUcmFuc2l0aW9uQmFuZHdpZHRoQ2hlYXQgLyAxMDAuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBmY3IgPSBtSW5TYW1wbGVSYXRlIDw9IG1TYW1wbGVSYXRlCisgICAgICAgICAgICAgICAgICAgICAgICA/IDAuNSA6IDAuNSAqIG1TYW1wbGVSYXRlIC8gbUluU2FtcGxlUmF0ZTsKKyAgICAgICAgICAgICAgICBmY3IgKj0gbVByb3BlcnR5Q3V0b2ZmUGVyY2VudCAvIDEwMC47CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBWb2ljZSBxdWFsaXR5IGRldmljZXMgaGF2ZSBsb3dlciBzYW1wbGluZyByYXRlcworICAgICAgICAgICAgLy8gKGFuZCBtYXkgYmUgYSBjb25zZXF1ZW5jZSBvZiBkb3duc3RyZWFtIEFNUi1XQiAvIEcuNzIyIGNvZGVjcykuCisgICAgICAgICAgICAvLyBGb3IgdGhlc2UgZGV2aWNlcywgd2UgZW5zdXJlIGEgd2lkZXIgcmVzYW1wbGVyIHBhc3NiYW5kCisgICAgICAgICAgICAvLyBhdCB0aGUgZXhwZW5zZSBvZiBhbGlhc2luZyBub2lzZSAoc3RvcGJhbmQgYXR0ZW51YXRpb24KKyAgICAgICAgICAgIC8vIGFuZCBzdG9wYmFuZCBmcmVxdWVuY3kpLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGNvbnN0ZXhwciB1aW50MzJfdCBrVm9pY2VEZXZpY2VTYW1wbGVSYXRlID0gMTYwMDA7CisKICAgICAgICAgICAgIGlmIChtRmlsdGVyUXVhbGl0eSA9PSBEWU5fSElHSF9RVUFMSVRZKSB7Ci0gICAgICAgICAgICAgICAgLy8gMzJiIGNvZWZmaWNpZW50cywgNjQgbGVuZ3RoCisgICAgICAgICAgICAgICAgLy8gZmxvYXQgb3IgMzJiIGNvZWZmaWNpZW50cwogICAgICAgICAgICAgICAgIHVzZVMzMiA9IHRydWU7CiAgICAgICAgICAgICAgICAgc3RvcEJhbmRBdHRlbiA9IDk4LjsKICAgICAgICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogNCkgewpAQCAtMzk0LDggKzQxMiwxOCBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggPSAzMjsKICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobVNhbXBsZVJhdGUgPD0ga1ZvaWNlRGV2aWNlU2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogMikgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCArPSAxNjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbGZMZW5ndGggKz0gODsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBzdG9wQmFuZEF0dGVuID0gODQuOworICAgICAgICAgICAgICAgICAgICB0YndDaGVhdCA9IDEuMDU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIGlmIChtRmlsdGVyUXVhbGl0eSA9PSBEWU5fTE9XX1FVQUxJVFkpIHsKLSAgICAgICAgICAgICAgICAvLyAxNmIgY29lZmZpY2llbnRzLCAxNi0zMiBsZW5ndGgKKyAgICAgICAgICAgICAgICAvLyBmbG9hdCBvciAxNmIgY29lZmZpY2llbnRzCiAgICAgICAgICAgICAgICAgdXNlUzMyID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgc3RvcEJhbmRBdHRlbiA9IDgwLjsKICAgICAgICAgICAgICAgICBpZiAoaW5TYW1wbGVSYXRlID49IG1TYW1wbGVSYXRlICogNCkgewpAQCAtNDA1LDEzICs0MzMsMTggQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gODsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGluU2FtcGxlUmF0ZSA8PSBtU2FtcGxlUmF0ZSkgeworICAgICAgICAgICAgICAgIGlmIChtU2FtcGxlUmF0ZSA8PSBrVm9pY2VEZXZpY2VTYW1wbGVSYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoICs9IDg7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGJ3Q2hlYXQgPSAxLjA1OworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5TYW1wbGVSYXRlIDw9IG1TYW1wbGVSYXRlKSB7CiAgICAgICAgICAgICAgICAgICAgIHRid0NoZWF0ID0gMS4wNTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICB0YndDaGVhdCA9IDEuMDM7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsgLy8gRFlOX01FRF9RVUFMSVRZCi0gICAgICAgICAgICAgICAgLy8gMTZiIGNvZWZmaWNpZW50cywgMzItNjQgbGVuZ3RoCisgICAgICAgICAgICAgICAgLy8gZmxvYXQgb3IgMTZiIGNvZWZmaWNpZW50cwogICAgICAgICAgICAgICAgIC8vIG5vdGU6ID4gNjQgbGVuZ3RoIGZpbHRlcnMgd2l0aCAxNmIgY29lZnMgY2FuIGhhdmUgcXVhbnRpemF0aW9uIG5vaXNlIHByb2JsZW1zCiAgICAgICAgICAgICAgICAgdXNlUzMyID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgc3RvcEJhbmRBdHRlbiA9IDg0LjsKQEAgLTQyMiw3ICs0NTUsMTUgQEAKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoID0gMTY7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChpblNhbXBsZVJhdGUgPD0gbVNhbXBsZVJhdGUpIHsKKworICAgICAgICAgICAgICAgIGlmIChtU2FtcGxlUmF0ZSA8PSBrVm9pY2VEZXZpY2VTYW1wbGVSYXRlKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChpblNhbXBsZVJhdGUgPj0gbVNhbXBsZVJhdGUgKiAyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBoYWxmTGVuZ3RoICs9IDE2OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFsZkxlbmd0aCArPSA4OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHRid0NoZWF0ID0gMS4wNTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGluU2FtcGxlUmF0ZSA8PSBtU2FtcGxlUmF0ZSkgewogICAgICAgICAgICAgICAgICAgICB0YndDaGVhdCA9IDEuMDM7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgdGJ3Q2hlYXQgPSAxLjAxOwpAQCAtNDMwLDYgKzQ3MSwxOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgaWYgKGZjciA+IDAuKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IG1GaWx0ZXJRdWFsaXR5OiVkIGluU2FtcGxlUmF0ZTolZCBtU2FtcGxlUmF0ZTolZCBoYWxmTGVuZ3RoOiVkICIKKyAgICAgICAgICAgICAgICAgICAgInN0b3BCYW5kQXR0ZW46JWxmIGZjcjolbGYiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUZpbHRlclF1YWxpdHksIGluU2FtcGxlUmF0ZSwgbVNhbXBsZVJhdGUsIGhhbGZMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIHN0b3BCYW5kQXR0ZW4sIGZjcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IG1GaWx0ZXJRdWFsaXR5OiVkIGluU2FtcGxlUmF0ZTolZCBtU2FtcGxlUmF0ZTolZCBoYWxmTGVuZ3RoOiVkICIKKyAgICAgICAgICAgICAgICAgICAgInN0b3BCYW5kQXR0ZW46JWxmIHRid0NoZWF0OiVsZiIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtRmlsdGVyUXVhbGl0eSwgaW5TYW1wbGVSYXRlLCBtU2FtcGxlUmF0ZSwgaGFsZkxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgc3RvcEJhbmRBdHRlbiwgdGJ3Q2hlYXQpOworICAgICAgICB9CisKKwogICAgICAgICAvLyBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBwb2x5cGhhc2VzIGluIHRoZSBmaWx0ZXJiYW5rLgogICAgICAgICAvLyBmb3IgMTZiLCBpdCBpcyBkZXNpcmFibGUgdG8gaGF2ZSAyXigxNi8yKSA9IDI1NiBwaGFzZXMuCiAgICAgICAgIC8vIGh0dHBzOi8vY2NybWEuc3RhbmZvcmQuZWR1L35qb3MvcmVzYW1wbGUvUmVsYXRpb25fSW50ZXJwb2xhdGlvbl9FcnJvcl9RdWFudGl6YXRpb24uaHRtbApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRHluLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uaAppbmRleCA5MjE0NGQwLi44MmI5NTA1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uaAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJEeW4uaApAQCAtNTUsNiArNTUsMTEgQEAKICAgICB2aXJ0dWFsIHNpemVfdCByZXNhbXBsZShpbnQzMl90KiBvdXQsIHNpemVfdCBvdXRGcmFtZUNvdW50LAogICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogcHJvdmlkZXIpOwogCisgICAgdm9pZCByZXNldCgpIG92ZXJyaWRlIHsKKyAgICAgICAgQXVkaW9SZXNhbXBsZXI6OnJlc2V0KCk7CisgICAgICAgIG1JbkJ1ZmZlci5yZXNldCgpOworICAgIH0KKwogICAgIC8vIE1ha2UgYXZhaWxhYmxlIGtleSBkZXNpZ24gY3JpdGVyaWEgZm9yIHRlc3RpbmcKICAgICBpbnQgZ2V0SGFsZkxlbmd0aCgpIGNvbnN0IHsKICAgICAgICAgcmV0dXJuIG1Db25zdGFudHMubUhhbGZOdW1Db2VmczsKQEAgLTE4OCw2ICsxOTMsMTMgQEAKICAgICAgICAgICAgICAgaW50MzJfdCBtUHJvcGVydHlDdXRvZmZQZXJjZW50ID0gMTAwOwogICAgICAgICAgICAgICAgICAgICAgIC8vICJyby5hdWRpby5yZXNhbXBsZXIucHNkLmN1dG9mZl9wZXJjZW50IgogCisgICAgICAgICAgICAgIC8vIFNwZWNpZnkgdGhlIHRyYW5zaXRpb24gYmFuZHdpZHRoIGV4dGVuc2lvbiBiZXlvbmQgTnlxdWlzdC4KKyAgICAgICAgICAgICAgLy8gSWYgdGhpcyBpcyBub256ZXJvIHRoZW4gbVByb3BlcnR5Q3V0b2ZmUGVyY2VudCBpcyBpZ25vcmVkLgorICAgICAgICAgICAgICAvLyBBIHZhbHVlIG9mIDEwMCBvciBncmVhdGVyIGlzIHR5cGljYWxseSB1c2VkLCB3aGVyZSAxMDAgbWVhbnMgdGhlCisgICAgICAgICAgICAgIC8vIHN0b3BiYW5kIGlzIGF0IE55cXVpc3QgKHRoaXMgaXMgYSB0eXBpY2FsIGRlc2lnbikuCisgICAgICAgICAgICAgIGludDMyX3QgbVByb3BlcnR5VHJhbnNpdGlvbkJhbmR3aWR0aENoZWF0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAvLyAicm8uYXVkaW8ucmVzYW1wbGVyLnBzZC50YndjaGVhdCIKKwogICAgIC8vIEZpbHRlciBjcmVhdGlvbiBkZXNpZ24gcGFyYW1ldGVycywgc2VlIHNldFNhbXBsZVJhdGUoKQogICAgICAgICAgICAgIGRvdWJsZSBtU3RvcGJhbmRBdHRlbnVhdGlvbkRiID0gMC47CiAgICAgICAgICAgICAgZG91YmxlIG1QYXNzYmFuZFJpcHBsZURiID0gMC47CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJHZW4uaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpckdlbi5oCmluZGV4IDM5Y2FmZWIuLjEwMGJhYTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpckdlbi5oCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpckdlbi5oCkBAIC01NDcsOCArNTQ3LDggQEAKICAgICAgICAgd3N0YXJ0ICs9IHdzdGVwOwogICAgIH0KICAgICAvLyByZW5vcm1hbGl6ZSAtIHRoaXMgaXMgbmVlZGVkIGZvciBpbnRlZ2VyIGZpbHRlciB0eXBlcywgdXNlIDEgZm9yIGZsb2F0IG9yIGRvdWJsZS4KLSAgICBjb25zdGV4cHIgaW50NjRfdCBpbnRlZ3JhbFNoaWZ0ID0gc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUgPyAoc2l6ZW9mKFQpICogOCAtIDEpIDogMDsKLSAgICBjb25zdCBkb3VibGUgbm9ybSA9IDEuIC8gKEwgPDwgaW50ZWdyYWxTaGlmdCk7CisgICAgY29uc3RleHByIGludCBpbnRlZ3JhbFNoaWZ0ID0gc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUgPyAoc2l6ZW9mKFQpICogQ0hBUl9CSVQgLSAxKSA6IDA7CisgICAgY29uc3QgZG91YmxlIG5vcm0gPSAxLiAvIChpbnQ2NF90e0x9IDw8IGludGVncmFsU2hpZnQpOwogCiAgICAgZmlyTWluID0gZm1pbiAqIG5vcm07CiAgICAgZmlyTWF4ID0gZm1heCAqIG5vcm07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJPcHMuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpck9wcy5oCmluZGV4IDJlNGNlZTMuLmEzZjVmZjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpck9wcy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpck9wcy5oCkBAIC0zNiwxMyArMzYsMjAgQEAKICNpbmNsdWRlIDxhcm1fbmVvbi5oPgogI2VuZGlmCiAKLSNpZiBkZWZpbmVkKF9fU1NTRTNfXykgIC8vIFNob3VsZCBiZSBzdXBwb3J0ZWQgaW4geDg2IEFCSSBmb3IgYm90aCAzMiAmIDY0LWJpdC4KKyNpZiBkZWZpbmVkKF9fQVZYMl9fKSAgLy8gU2hvdWxkIGJlIHN1cHBvcnRlZCBpbiB4ODYgQUJJIGZvciBib3RoIDMyICYgNjQtYml0LgorI2RlZmluZSBVU0VfQVZYMiAodHJ1ZSkgIC8vIEluZmVyZW5jZSBBVlgyL0ZNQSBJbnRyaW5zaWNzCiAjZGVmaW5lIFVTRV9TU0UgKHRydWUpCisjaW5jbHVkZSA8aW1taW50cmluLmg+CisjZWxpZiBkZWZpbmVkKF9fU1NTRTNfXykgIC8vIFNob3VsZCBiZSBzdXBwb3J0ZWQgaW4geDg2IEFCSSBmb3IgYm90aCAzMiAmIDY0LWJpdC4KKyNkZWZpbmUgVVNFX1NTRSAodHJ1ZSkgIC8vIEluZmVyZW5jZSBTU0UgSW50cmluc2ljcworI2RlZmluZSBVU0VfQVZYMiAoZmFsc2UpCiAjaW5jbHVkZSA8dG1taW50cmluLmg+CiAjZWxzZQogI2RlZmluZSBVU0VfU1NFIChmYWxzZSkKKyNkZWZpbmUgVVNFX0FWWDIoZmFsc2UpCiAjZW5kaWYKIAorCiB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgogc3RydWN0IGlzX3NhbWUKIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3MuaAppbmRleCBhNzQxNjc3Li45YjcwYTFjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzLmgKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzcy5oCkBAIC05MCw3ICs5MCw3IEBACiAgICAgICAgIEFjY3VtdWxhdG9yPENIQU5ORUxTLTEsIFRPPjo6YWNjKGNvZWYsIGRhdGEpOwogICAgIH0KICAgICBpbmxpbmUgdm9pZCB2b2x1bWUoVE8qJiBvdXQsIFRPIGdhaW4pIHsKLSAgICAgICAgKm91dCsrID0gdm9sdW1lQWRqdXN0KHZhbHVlLCBnYWluKTsKKyAgICAgICAgKm91dCsrICs9IHZvbHVtZUFkanVzdCh2YWx1ZSwgZ2Fpbik7CiAgICAgICAgIEFjY3VtdWxhdG9yPENIQU5ORUxTLTEsIFRPPjo6dm9sdW1lKG91dCwgZ2Fpbik7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzU1NFLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJGaXJQcm9jZXNzU1NFLmgKaW5kZXggMzAyMzNiNS4uMWMxNmJjNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0F1ZGlvUmVzYW1wbGVyRmlyUHJvY2Vzc1NTRS5oCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlckZpclByb2Nlc3NTU0UuaApAQCAtODAsMTEgKzgwLDE2IEBACiAgICAgICAgICAgICBwb3NDb2VmMSA9IF9tbV9zdWJfcHMocG9zQ29lZjEsIHBvc0NvZWYpOwogICAgICAgICAgICAgbmVnQ29lZiA9IF9tbV9zdWJfcHMobmVnQ29lZiwgbmVnQ29lZjEpOwogCisKKyAgICAgICAgICAgICNpZiBVU0VfQVZYMgorICAgICAgICAgICAgcG9zQ29lZiA9IF9tbV9mbWFkZF9wcyhwb3NDb2VmMSwgaW50ZXJwLCBwb3NDb2VmKTsKKyAgICAgICAgICAgIG5lZ0NvZWYgPSBfbW1fZm1hZGRfcHMobmVnQ29lZiwgaW50ZXJwLCBuZWdDb2VmMSk7CisgICAgICAgICAgICAjZWxzZQogICAgICAgICAgICAgcG9zQ29lZjEgPSBfbW1fbXVsX3BzKHBvc0NvZWYxLCBpbnRlcnApOwogICAgICAgICAgICAgbmVnQ29lZiA9IF9tbV9tdWxfcHMobmVnQ29lZiwgaW50ZXJwKTsKLQogICAgICAgICAgICAgcG9zQ29lZiA9IF9tbV9hZGRfcHMocG9zQ29lZjEsIHBvc0NvZWYpOwogICAgICAgICAgICAgbmVnQ29lZiA9IF9tbV9hZGRfcHMobmVnQ29lZiwgbmVnQ29lZjEpOworICAgICAgICAgICAgI2VuZGlmIC8vVVNFX0FWWDIKICAgICAgICAgfQogICAgICAgICBzd2l0Y2ggKENIQU5ORUxTKSB7CiAgICAgICAgIGNhc2UgMTogewpAQCAtOTQsMTEgKzk5LDE3IEBACiAgICAgICAgICAgICBzTiArPSA0OwogCiAgICAgICAgICAgICBwb3NTYW1wID0gX21tX3NodWZmbGVfcHMocG9zU2FtcCwgcG9zU2FtcCwgMHgxQik7CisKKyAgICAgICAgICAgICNpZiBVU0VfQVZYMgorICAgICAgICAgICAgYWNjTCA9IF9tbV9mbWFkZF9wcyhwb3NTYW1wLCBwb3NDb2VmLCBhY2NMKTsKKyAgICAgICAgICAgIGFjY0wgPSBfbW1fZm1hZGRfcHMobmVnU2FtcCwgbmVnQ29lZiwgYWNjTCk7CisgICAgICAgICAgICAjZWxzZQogICAgICAgICAgICAgcG9zU2FtcCA9IF9tbV9tdWxfcHMocG9zU2FtcCwgcG9zQ29lZik7CiAgICAgICAgICAgICBuZWdTYW1wID0gX21tX211bF9wcyhuZWdTYW1wLCBuZWdDb2VmKTsKLQogICAgICAgICAgICAgYWNjTCA9IF9tbV9hZGRfcHMoYWNjTCwgcG9zU2FtcCk7CiAgICAgICAgICAgICBhY2NMID0gX21tX2FkZF9wcyhhY2NMLCBuZWdTYW1wKTsKKyAgICAgICAgICAgICNlbmRpZgorCiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgMjogewogICAgICAgICAgICAgX19tMTI4IHBvc1NhbXAwID0gX21tX2xvYWR1X3BzKHNQKTsKQEAgLTExNCwxNSArMTI1LDIzIEBACiAgICAgICAgICAgICBfX20xMjggbmVnU2FtcEwgPSBfbW1fc2h1ZmZsZV9wcyhuZWdTYW1wMCwgbmVnU2FtcDEsIDB4ODgpOwogICAgICAgICAgICAgX19tMTI4IG5lZ1NhbXBSID0gX21tX3NodWZmbGVfcHMobmVnU2FtcDAsIG5lZ1NhbXAxLCAweEREKTsKIAotICAgICAgICAgICAgcG9zU2FtcEwgPSBfbW1fbXVsX3BzKHBvc1NhbXBMLCBwb3NDb2VmKTsKLSAgICAgICAgICAgIHBvc1NhbXBSID0gX21tX211bF9wcyhwb3NTYW1wUiwgcG9zQ29lZik7Ci0gICAgICAgICAgICBuZWdTYW1wTCA9IF9tbV9tdWxfcHMobmVnU2FtcEwsIG5lZ0NvZWYpOwotICAgICAgICAgICAgbmVnU2FtcFIgPSBfbW1fbXVsX3BzKG5lZ1NhbXBSLCBuZWdDb2VmKTsKKyAgICAgICAgICAgI2lmIFVTRV9BVlgyCisgICAgICAgICAgIGFjY0wgPSBfbW1fZm1hZGRfcHMocG9zU2FtcEwsIHBvc0NvZWYsIGFjY0wpOworICAgICAgICAgICBhY2NSID0gX21tX2ZtYWRkX3BzKHBvc1NhbXBSLCBwb3NDb2VmLCBhY2NSKTsKKyAgICAgICAgICAgYWNjTCA9IF9tbV9mbWFkZF9wcyhuZWdTYW1wTCwgbmVnQ29lZiwgYWNjTCk7CisgICAgICAgICAgIGFjY1IgPSBfbW1fZm1hZGRfcHMobmVnU2FtcFIsIG5lZ0NvZWYsIGFjY1IpOworICAgICAgICAgICAjZWxzZQorICAgICAgICAgICBwb3NTYW1wTCA9IF9tbV9tdWxfcHMocG9zU2FtcEwsIHBvc0NvZWYpOworICAgICAgICAgICBwb3NTYW1wUiA9IF9tbV9tdWxfcHMocG9zU2FtcFIsIHBvc0NvZWYpOworICAgICAgICAgICBuZWdTYW1wTCA9IF9tbV9tdWxfcHMobmVnU2FtcEwsIG5lZ0NvZWYpOworICAgICAgICAgICBuZWdTYW1wUiA9IF9tbV9tdWxfcHMobmVnU2FtcFIsIG5lZ0NvZWYpOwogCi0gICAgICAgICAgICBhY2NMID0gX21tX2FkZF9wcyhhY2NMLCBwb3NTYW1wTCk7Ci0gICAgICAgICAgICBhY2NSID0gX21tX2FkZF9wcyhhY2NSLCBwb3NTYW1wUik7Ci0gICAgICAgICAgICBhY2NMID0gX21tX2FkZF9wcyhhY2NMLCBuZWdTYW1wTCk7Ci0gICAgICAgICAgICBhY2NSID0gX21tX2FkZF9wcyhhY2NSLCBuZWdTYW1wUik7CisgICAgICAgICAgIGFjY0wgPSBfbW1fYWRkX3BzKGFjY0wsIHBvc1NhbXBMKTsKKyAgICAgICAgICAgYWNjUiA9IF9tbV9hZGRfcHMoYWNjUiwgcG9zU2FtcFIpOworICAgICAgICAgICBhY2NMID0gX21tX2FkZF9wcyhhY2NMLCBuZWdTYW1wTCk7CisgICAgICAgICAgIGFjY1IgPSBfbW1fYWRkX3BzKGFjY1IsIG5lZ1NhbXBSKTsKKyAgICAgICAgICAgI2VuZGlmCisKICAgICAgICAgfSBicmVhazsKICAgICAgICAgfQogICAgIH0gd2hpbGUgKGNvdW50IC09IDQpOwpAQCAtMTQ0LDkgKzE2MywxMyBAQAogICAgICAgICBvdXRBY2N1bSA9IF9tbV9oYWRkX3BzKGFjY0wsIGFjY1IpOwogICAgICAgICBvdXRBY2N1bSA9IF9tbV9oYWRkX3BzKG91dEFjY3VtLCBvdXRBY2N1bSk7CiAgICAgfQotCisgICAgI2lmIFVTRV9BVlgyCisgICAgb3V0U2FtcCA9IF9tbV9mbWFkZF9wcyhvdXRBY2N1bSwgdkxSLG91dFNhbXApOworICAgICNlbHNlCiAgICAgb3V0QWNjdW0gPSBfbW1fbXVsX3BzKG91dEFjY3VtLCB2TFIpOwogICAgIG91dFNhbXAgPSBfbW1fYWRkX3BzKG91dFNhbXAsIG91dEFjY3VtKTsKKyAgICAjZW5kaWYKKwogICAgIF9tbV9zdG9yZWxfcGkocmVpbnRlcnByZXRfY2FzdDxfX202NCo+KG91dCksIG91dFNhbXApOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQXVkaW9SZXNhbXBsZXJTaW5jLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCmluZGV4IDMyMGI4Y2YuLjVhMDNhMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9BdWRpb1Jlc2FtcGxlclNpbmMuY3BwCkBAIC0xOSw2ICsxOSw3IEBACiAKICNkZWZpbmUgX19TVERDX0NPTlNUQU5UX01BQ1JPUwogI2luY2x1ZGUgPG1hbGxvYy5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxkbGZjbi5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL0J1ZmZlclByb3ZpZGVycy5jcHAgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQnVmZmVyUHJvdmlkZXJzLmNwcAppbmRleCBkNjA1NjBiLi42ZDMxYzEyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQnVmZmVyUHJvdmlkZXJzLmNwcAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvQnVmZmVyUHJvdmlkZXJzLmNwcApAQCAtMTcsOCArMTcsMTEgQEAKICNkZWZpbmUgTE9HX1RBRyAiQnVmZmVyUHJvdmlkZXIiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKICNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZm9ybWF0Lmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KICNpbmNsdWRlIDxzb25pYy5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgpAQCAtMzUsMTMgKzM4LDYgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLXN0YXRpYyBpbmxpbmUgVCBtaW4oY29uc3QgVCYgYSwgY29uc3QgVCYgYikKLXsKLSAgICByZXR1cm4gYSA8IGIgPyBhIDogYjsKLX0KLQogQ29weUJ1ZmZlclByb3ZpZGVyOjpDb3B5QnVmZmVyUHJvdmlkZXIoc2l6ZV90IGlucHV0RnJhbWVTaXplLAogICAgICAgICBzaXplX3Qgb3V0cHV0RnJhbWVTaXplLCBzaXplX3QgYnVmZmVyRnJhbWVDb3VudCkgOgogICAgICAgICBtSW5wdXRGcmFtZVNpemUoaW5wdXRGcmFtZVNpemUpLApAQCAtNjMsNyArNTksOCBAQAogCiBDb3B5QnVmZmVyUHJvdmlkZXI6On5Db3B5QnVmZmVyUHJvdmlkZXIoKQogewotICAgIEFMT0dWKCJ+Q29weUJ1ZmZlclByb3ZpZGVyKCVwKSIsIHRoaXMpOworICAgIEFMT0dWKCIlcyglcCkgJXp1ICVwICVwIiwKKyAgICAgICAgICAgX19mdW5jX18sIHRoaXMsIG1CdWZmZXIuZnJhbWVDb3VudCwgbVRyYWNrQnVmZmVyUHJvdmlkZXIsIG1Mb2NhbEJ1ZmZlckRhdGEpOwogICAgIGlmIChtQnVmZmVyLmZyYW1lQ291bnQgIT0gMCkgewogICAgICAgICBtVHJhY2tCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmbUJ1ZmZlcik7CiAgICAgfQpAQCAtOTgsOCArOTUsOCBAQAogICAgICAgICBtQ29uc3VtZWQgPSAwOwogICAgIH0KICAgICBBTE9HX0FTU0VSVChtQ29uc3VtZWQgPCBtQnVmZmVyLmZyYW1lQ291bnQpOwotICAgIHNpemVfdCBjb3VudCA9IG1pbihtTG9jYWxCdWZmZXJGcmFtZUNvdW50LCBtQnVmZmVyLmZyYW1lQ291bnQgLSBtQ29uc3VtZWQpOwotICAgIGNvdW50ID0gbWluKGNvdW50LCBwQnVmZmVyLT5mcmFtZUNvdW50KTsKKyAgICBzaXplX3QgY291bnQgPSBzdGQ6Om1pbihtTG9jYWxCdWZmZXJGcmFtZUNvdW50LCBtQnVmZmVyLmZyYW1lQ291bnQgLSBtQ29uc3VtZWQpOworICAgIGNvdW50ID0gc3RkOjptaW4oY291bnQsIHBCdWZmZXItPmZyYW1lQ291bnQpOwogICAgIHBCdWZmZXItPnJhdyA9IG1Mb2NhbEJ1ZmZlckRhdGE7CiAgICAgcEJ1ZmZlci0+ZnJhbWVDb3VudCA9IGNvdW50OwogICAgIGNvcHlGcmFtZXMocEJ1ZmZlci0+cmF3LCAodWludDhfdCopbUJ1ZmZlci5yYXcgKyBtQ29uc3VtZWQgKiBtSW5wdXRGcmFtZVNpemUsCkBAIC0xMzMsNiArMTMwLDE2IEBACiAgICAgbUNvbnN1bWVkID0gMDsKIH0KIAordm9pZCBDb3B5QnVmZmVyUHJvdmlkZXI6OnNldEJ1ZmZlclByb3ZpZGVyKEF1ZGlvQnVmZmVyUHJvdmlkZXIgKnApIHsKKyAgICBBTE9HVigiJXMoJXApOiBtVHJhY2tCdWZmZXJQcm92aWRlcjolcCAgbUJ1ZmZlci5mcmFtZUNvdW50OiV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgcCwgbVRyYWNrQnVmZmVyUHJvdmlkZXIsIG1CdWZmZXIuZnJhbWVDb3VudCk7CisgICAgaWYgKG1UcmFja0J1ZmZlclByb3ZpZGVyID09IHApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtQnVmZmVyLmZyYW1lQ291bnQgPSAwOworICAgIFBhc3N0aHJ1QnVmZmVyUHJvdmlkZXI6OnNldEJ1ZmZlclByb3ZpZGVyKHApOworfQorCiBEb3dubWl4ZXJCdWZmZXJQcm92aWRlcjo6RG93bm1peGVyQnVmZmVyUHJvdmlkZXIoCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGlucHV0Q2hhbm5lbE1hc2ssCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG91dHB1dENoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCkBAIC0xNTcsNiArMTY0LDcgQEAKICAgICBpZiAobUVmZmVjdHNGYWN0b3J5LT5jcmVhdGVFZmZlY3QoJnNEd25tRnhEZXNjLnV1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0VTU0lPTl9JRF9JTlZBTElEX0FORF9JR05PUkVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX0hBTkRMRV9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbURvd25taXhJbnRlcmZhY2UpICE9IDApIHsKICAgICAgICAgIEFMT0dFKCJEb3dubWl4ZXJCdWZmZXJQcm92aWRlcigpIGVycm9yIGNyZWF0aW5nIGRvd25taXhlciBlZmZlY3QiKTsKICAgICAgICAgIG1Eb3dubWl4SW50ZXJmYWNlLmNsZWFyKCk7CkBAIC00NzksNyArNDg3LDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIHRpbWUtc3RyZXRjaCB0aGUgZGF0YQotICAgICAgICBkc3RBdmFpbGFibGUgPSBtaW4obUxvY2FsQnVmZmVyRnJhbWVDb3VudCAtIG1SZW1haW5pbmcsIG91dHB1dERlc2lyZWQpOworICAgICAgICBkc3RBdmFpbGFibGUgPSBzdGQ6Om1pbihtTG9jYWxCdWZmZXJGcmFtZUNvdW50IC0gbVJlbWFpbmluZywgb3V0cHV0RGVzaXJlZCk7CiAgICAgICAgIHNpemVfdCBzcmNBdmFpbGFibGUgPSBtQnVmZmVyLmZyYW1lQ291bnQ7CiAgICAgICAgIHByb2Nlc3NGcmFtZXMoKHVpbnQ4X3QqKW1Mb2NhbEJ1ZmZlckRhdGEgKyBtUmVtYWluaW5nICogbUZyYW1lU2l6ZSwgJmRzdEF2YWlsYWJsZSwKICAgICAgICAgICAgICAgICBtQnVmZmVyLnJhdywgJnNyY0F2YWlsYWJsZSk7CkBAIC01MjgsNiArNTM2LDE2IEBACiAgICAgbVJlbWFpbmluZyA9IDA7CiB9CiAKK3ZvaWQgVGltZXN0cmV0Y2hCdWZmZXJQcm92aWRlcjo6c2V0QnVmZmVyUHJvdmlkZXIoQXVkaW9CdWZmZXJQcm92aWRlciAqcCkgeworICAgIEFMT0dWKCIlcyglcCk6IG1UcmFja0J1ZmZlclByb3ZpZGVyOiVwICBtQnVmZmVyLmZyYW1lQ291bnQ6JXp1IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBwLCBtVHJhY2tCdWZmZXJQcm92aWRlciwgbUJ1ZmZlci5mcmFtZUNvdW50KTsKKyAgICBpZiAobVRyYWNrQnVmZmVyUHJvdmlkZXIgPT0gcCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1CdWZmZXIuZnJhbWVDb3VudCA9IDA7CisgICAgUGFzc3RocnVCdWZmZXJQcm92aWRlcjo6c2V0QnVmZmVyUHJvdmlkZXIocCk7Cit9CisKIHN0YXR1c190IFRpbWVzdHJldGNoQnVmZmVyUHJvdmlkZXI6OnNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKQogewogICAgIG1QbGF5YmFja1JhdGUgPSBwbGF5YmFja1JhdGU7CkBAIC01NjcsNyArNTg1LDcgQEAKICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgLy8gY3ljbGljYWxseSByZXBlYXQgdGhlIHNvdXJjZS4KICAgICAgICAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBjb3VudCA9IDA7IGNvdW50IDwgKmRzdEZyYW1lczsgY291bnQgKz0gKnNyY0ZyYW1lcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVtYWluaW5nID0gbWluKCpzcmNGcmFtZXMsICpkc3RGcmFtZXMgLSBjb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCByZW1haW5pbmcgPSBzdGQ6Om1pbigqc3JjRnJhbWVzLCAqZHN0RnJhbWVzIC0gY291bnQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHkoKHVpbnQ4X3QqKWRzdEJ1ZmZlciArIG1GcmFtZVNpemUgKiBjb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNCdWZmZXIsIG1GcmFtZVNpemUgKiByZW1haW5pbmcpOwogICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTYwOSw1ICs2MjcsNzIgQEAKICAgICAgICAgfQogICAgIH0KIH0KKworQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcjo6QWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcigKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBzaXplX3QgaW5DaGFubmVsQ291bnQsIHNpemVfdCBvdXRDaGFubmVsQ291bnQsCisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LCBhdWRpb19mb3JtYXRfdCBjb250cmFjdGVkRm9ybWF0LCB2b2lkKiBjb250cmFjdGVkQnVmZmVyKSA6CisgICAgICAgIENvcHlCdWZmZXJQcm92aWRlcigKKyAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfZnJhbWUoaW5DaGFubmVsQ291bnQsIGZvcm1hdCksCisgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKHN0ZDo6bWF4KGluQ2hhbm5lbENvdW50LCBvdXRDaGFubmVsQ291bnQpLCBmb3JtYXQpLAorICAgICAgICAgICAgICAgIGZyYW1lQ291bnQpLAorICAgICAgICBtRm9ybWF0KGZvcm1hdCksCisgICAgICAgIG1JbkNoYW5uZWxDb3VudChpbkNoYW5uZWxDb3VudCksCisgICAgICAgIG1PdXRDaGFubmVsQ291bnQob3V0Q2hhbm5lbENvdW50KSwKKyAgICAgICAgbVNhbXBsZVNpemVJbkJ5dGVzKGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSksCisgICAgICAgIG1GcmFtZUNvdW50KGZyYW1lQ291bnQpLAorICAgICAgICBtQ29udHJhY3RlZENoYW5uZWxDb3VudChpbkNoYW5uZWxDb3VudCAtIG91dENoYW5uZWxDb3VudCksCisgICAgICAgIG1Db250cmFjdGVkRm9ybWF0KGNvbnRyYWN0ZWRGb3JtYXQpLAorICAgICAgICBtQ29udHJhY3RlZEJ1ZmZlcihjb250cmFjdGVkQnVmZmVyKSwKKyAgICAgICAgbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzKDApCit7CisgICAgQUxPR1YoIkFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoJXApKCUjeCwgJXp1LCAlenUsICV6dSwgJSN4LCAlcCkiLCB0aGlzLCBmb3JtYXQsCisgICAgICAgICAgICBpbkNoYW5uZWxDb3VudCwgb3V0Q2hhbm5lbENvdW50LCBmcmFtZUNvdW50LCBjb250cmFjdGVkRm9ybWF0LCBjb250cmFjdGVkQnVmZmVyKTsKKyAgICBpZiAobUNvbnRyYWN0ZWRGb3JtYXQgIT0gQVVESU9fRk9STUFUX0lOVkFMSUQgJiYgbUluQ2hhbm5lbENvdW50ID4gbU91dENoYW5uZWxDb3VudCkgeworICAgICAgICBtQ29udHJhY3RlZEZyYW1lU2l6ZSA9IGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShtQ29udHJhY3RlZENoYW5uZWxDb3VudCwgbUNvbnRyYWN0ZWRGb3JtYXQpOworICAgIH0KK30KKworc3RhdHVzX3QgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcjo6Z2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIHBCdWZmZXIpCit7CisgICAgaWYgKG1Db250cmFjdGVkQnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gUmVzdHJpY3QgZnJhbWUgY291bnQgb25seSB3aGVuIGl0IGlzIG5lZWRlZCB0byBzYXZlIGNvbnRyYWN0ZWQgZnJhbWVzLgorICAgICAgICBjb25zdCBzaXplX3Qgb3V0RnJhbWVzTGVmdCA9IG1GcmFtZUNvdW50IC0gbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzOworICAgICAgICBpZiAob3V0RnJhbWVzTGVmdCA8IHBCdWZmZXItPmZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIC8vIFJlc3RyaWN0IHRoZSBmcmFtZSBjb3VudCBzbyB0aGF0IHdlIGRvbid0IHdyaXRlIG92ZXIgdGhlIHNpemUgb2YgdGhlIG91dHB1dCBidWZmZXIuCisgICAgICAgICAgICBwQnVmZmVyLT5mcmFtZUNvdW50ID0gb3V0RnJhbWVzTGVmdDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQ29weUJ1ZmZlclByb3ZpZGVyOjpnZXROZXh0QnVmZmVyKHBCdWZmZXIpOworfQorCit2b2lkIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXI6OmNvcHlGcmFtZXModm9pZCAqZHN0LCBjb25zdCB2b2lkICpzcmMsIHNpemVfdCBmcmFtZXMpCit7CisgICAgaWYgKG1JbkNoYW5uZWxDb3VudCA+IG1PdXRDaGFubmVsQ291bnQpIHsKKyAgICAgICAgLy8gRm9yIGNhc2UgbXVsdGkgdG8gbW9ubywgYWRqdXN0X2NoYW5uZWxzIGhhcyBzcGVjaWFsIGxvZ2ljIHRoYXQgd2lsbCBtaXggZmlyc3QgdHdvIGlucHV0CisgICAgICAgIC8vIGNoYW5uZWxzIGludG8gYSBzaW5nbGUgb3V0cHV0IGNoYW5uZWwuIEluIHRoYXQgY2FzZSwgdXNlIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUKKyAgICAgICAgLy8gdG8ga2VlcCBvbmx5IG9uZSBjaGFubmVsIGRhdGEgZXZlbiB3aGVuIGNvbnRyYWN0aW5nIHRvIG1vbm8uCisgICAgICAgIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUoc3JjLCBtSW5DaGFubmVsQ291bnQsIGRzdCwgbU91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICBtU2FtcGxlU2l6ZUluQnl0ZXMsIGZyYW1lcyAqIG1JbkNoYW5uZWxDb3VudCAqIG1TYW1wbGVTaXplSW5CeXRlcyk7CisgICAgICAgIGlmIChtQ29udHJhY3RlZEZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRAorICAgICAgICAgICAgJiYgbUNvbnRyYWN0ZWRCdWZmZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGNvbnRyYWN0ZWRJZHggPSBmcmFtZXMgKiBtT3V0Q2hhbm5lbENvdW50ICogbVNhbXBsZVNpemVJbkJ5dGVzOworICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QqKSBtQ29udHJhY3RlZEJ1ZmZlciArIG1Db250cmFjdGVkV3JpdHRlbkZyYW1lcyAqIG1Db250cmFjdGVkRnJhbWVTaXplLAorICAgICAgICAgICAgICAgICAgICBtQ29udHJhY3RlZEZvcm1hdCwgKHVpbnQ4X3QqKSBkc3QgKyBjb250cmFjdGVkSWR4LCBtRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICBtQ29udHJhY3RlZENoYW5uZWxDb3VudCAqIGZyYW1lcyk7CisgICAgICAgICAgICBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXMgKz0gZnJhbWVzOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUHJlZmVyIGV4cGFuZGluZyBkYXRhIGZyb20gdGhlIGVuZCBvZiBlYWNoIGF1ZGlvIGZyYW1lLgorICAgICAgICBhZGp1c3RfY2hhbm5lbHMoc3JjLCBtSW5DaGFubmVsQ291bnQsIGRzdCwgbU91dENoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICBtU2FtcGxlU2l6ZUluQnl0ZXMsIGZyYW1lcyAqIG1JbkNoYW5uZWxDb3VudCAqIG1TYW1wbGVTaXplSW5CeXRlcyk7CisgICAgfQorfQorCit2b2lkIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXI6OnJlc2V0KCkKK3sKKyAgICBtQ29udHJhY3RlZFdyaXR0ZW5GcmFtZXMgPSAwOworICAgIENvcHlCdWZmZXJQcm92aWRlcjo6cmVzZXQoKTsKK30KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9SZWNvcmRCdWZmZXJDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL1JlY29yZEJ1ZmZlckNvbnZlcnRlci5jcHAKaW5kZXggNTQxNTFmNS4uN2Q2ZmU3MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL1JlY29yZEJ1ZmZlckNvbnZlcnRlci5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL1JlY29yZEJ1ZmZlckNvbnZlcnRlci5jcHAKQEAgLTExNyw2ICsxMTcsMTEgQEAKICAgICAgICAgLy8gZm9ybWF0IGNvbnZlcnQgdG8gZGVzdGluYXRpb24gYnVmZmVyCiAgICAgICAgIGNvbnZlcnRSZXNhbXBsZXIoZHN0LCBtQnVmLCBmcmFtZXMpOwogICAgIH0KKyAgICAvLyBSZWxlYXNlIHVudXNlZCBmcmFtZXMgaW4gdGhlIElucHV0Q29udmVydGVyUHJvdmlkZXIgYnVmZmVyIHNvIHRoYXQKKyAgICAvLyB0aGUgUmVjb3JkVGhyZWFkIGlzIGFibGUgdG8gcHJvcGVybHkgYWNjb3VudCBmb3IgY29uc3VtZWQgZnJhbWVzLgorICAgIGlmIChtSW5wdXRDb252ZXJ0ZXJQcm92aWRlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1JbnB1dENvbnZlcnRlclByb3ZpZGVyLT5yZXNldCgpOworICAgIH0KICAgICByZXR1cm4gZnJhbWVzOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb01peGVyQmFzZS5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlckJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDViNmQwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9NaXhlckJhc2UuaApAQCAtMCwwICsxLDM1OSBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBBTkRST0lEX0FVRElPX01JWEVSX0JBU0VfSAorI2RlZmluZSBBTkRST0lEX0FVRElPX01JWEVSX0JBU0VfSAorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0NvbXBhdC5oPgorCisvLyBUaGlzIG11c3QgbWF0Y2ggZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQ29uZmlndXJhdGlvbi5oCisvLyB3aGVuIHVzZWQgd2l0aCB0aGUgQXVkaW8gRnJhbWV3b3JrLgorI2RlZmluZSBGTE9BVF9BVVgKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEF1ZGlvTWl4ZXJCYXNlIGlzIGZ1bmN0aW9uYWwgb24gaXRzIG93biBpZiBvbmx5IG1peGluZyBhbmQgcmVzYW1wbGluZworLy8gaXMgbmVlZGVkLgorCitjbGFzcyBBdWRpb01peGVyQmFzZQoreworcHVibGljOgorICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhlc2UgdW5sZXNzIHVuZGVybHlpbmcgY29kZSBjaGFuZ2VzLgorICAgIC8vIFRoaXMgbWl4ZXIgaGFzIGEgaGFyZC1jb2RlZCB1cHBlciBsaW1pdCBvZiA4IGNoYW5uZWxzIGZvciBvdXRwdXQuCisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBNQVhfTlVNX0NIQU5ORUxTID0gRkNDXzg7CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBNQVhfTlVNX1ZPTFVNRVMgPSBGQ0NfMjsgLy8gc3RlcmVvIHZvbHVtZSBvbmx5CisKKyAgICBzdGF0aWMgY29uc3QgdWludDE2X3QgVU5JVFlfR0FJTl9JTlQgPSAweDEwMDA7CisgICAgc3RhdGljIGNvbnN0IENPTlNURVhQUiBmbG9hdCBVTklUWV9HQUlOX0ZMT0FUID0gMS4wZjsKKworICAgIGVudW0geyAvLyBuYW1lcworICAgICAgICAvLyBzZXRQYXJhbWV0ZXIgdGFyZ2V0cworICAgICAgICBUUkFDSyAgICAgICAgICAgPSAweDMwMDAsCisgICAgICAgIFJFU0FNUExFICAgICAgICA9IDB4MzAwMSwKKyAgICAgICAgUkFNUF9WT0xVTUUgICAgID0gMHgzMDAyLCAvLyByYW1wIHRvIG5ldyB2b2x1bWUKKyAgICAgICAgVk9MVU1FICAgICAgICAgID0gMHgzMDAzLCAvLyBkb24ndCByYW1wCisgICAgICAgIFRJTUVTVFJFVENIICAgICA9IDB4MzAwNCwKKworICAgICAgICAvLyBzZXQgUGFyYW1ldGVyIG5hbWVzCisgICAgICAgIC8vIGZvciB0YXJnZXQgVFJBQ0sKKyAgICAgICAgQ0hBTk5FTF9NQVNLICAgID0gMHg0MDAwLAorICAgICAgICBGT1JNQVQgICAgICAgICAgPSAweDQwMDEsCisgICAgICAgIE1BSU5fQlVGRkVSICAgICA9IDB4NDAwMiwKKyAgICAgICAgQVVYX0JVRkZFUiAgICAgID0gMHg0MDAzLAorICAgICAgICAvLyAweDQwMDQgcmVzZXJ2ZWQKKyAgICAgICAgTUlYRVJfRk9STUFUICAgID0gMHg0MDA1LCAvLyBBVURJT19GT1JNQVRfUENNXyhGTE9BVHwxNl9CSVQpCisgICAgICAgIE1JWEVSX0NIQU5ORUxfTUFTSyA9IDB4NDAwNiwgLy8gQ2hhbm5lbCBtYXNrIGZvciBtaXhlciBvdXRwdXQKKyAgICAgICAgLy8gZm9yIHRhcmdldCBSRVNBTVBMRQorICAgICAgICBTQU1QTEVfUkFURSAgICAgPSAweDQxMDAsIC8vIENvbmZpZ3VyZSBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uIG9uIHRoaXMgdHJhY2sgbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgJ3ZhbHVlJyBpcyB0aGUgbmV3IHNhbXBsZSByYXRlIGluIEh6LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgY3JlYXRlcyBhIHNhbXBsZSByYXRlIGNvbnZlcnRlciB0aGUgZmlyc3QgdGltZSB0aGF0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHRyYWNrIHNhbXBsZSByYXRlIGlzIGRpZmZlcmVudCBmcm9tIHRoZSBtaXggc2FtcGxlIHJhdGUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgdGhlIG5ldyBzYW1wbGUgcmF0ZSBpcyB0aGUgc2FtZSBhcyB0aGUgbWl4IHNhbXBsZSByYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBhIHNhbXBsZSByYXRlIGNvbnZlcnRlciBhbHJlYWR5IGV4aXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVuIHRoZSBzYW1wbGUgcmF0ZSBjb252ZXJ0ZXIgcmVtYWlucyBwcmVzZW50IGJ1dCBpcyBhIG5vLW9wLgorICAgICAgICBSRVNFVCAgICAgICAgICAgPSAweDQxMDEsIC8vIFJlc2V0IHNhbXBsZSByYXRlIGNvbnZlcnRlciB3aXRob3V0IGNoYW5naW5nIHNhbXBsZSByYXRlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgY2xlYXJzIG91dCB0aGUgcmVzYW1wbGVyJ3MgaW5wdXQgYnVmZmVyLgorICAgICAgICBSRU1PVkUgICAgICAgICAgPSAweDQxMDIsIC8vIFJlbW92ZSB0aGUgc2FtcGxlIHJhdGUgY29udmVydGVyIG9uIHRoaXMgdHJhY2sgbmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdHJhY2sgaXMgcmVzdG9yZWQgdG8gdGhlIG1peCBzYW1wbGUgcmF0ZS4KKyAgICAgICAgLy8gZm9yIHRhcmdldCBSQU1QX1ZPTFVNRSBhbmQgVk9MVU1FICg4IGNoYW5uZWxzIG1heCkKKyAgICAgICAgLy8gRklYTUUgdXNlIGZsb2F0IGZvciB0aGVzZSAzIHRvIGltcHJvdmUgdGhlIGR5bmFtaWMgcmFuZ2UKKyAgICAgICAgVk9MVU1FMCAgICAgICAgID0gMHg0MjAwLAorICAgICAgICBWT0xVTUUxICAgICAgICAgPSAweDQyMDEsCisgICAgICAgIEFVWExFVkVMICAgICAgICA9IDB4NDIxMCwKKyAgICB9OworCisgICAgQXVkaW9NaXhlckJhc2Uoc2l6ZV90IGZyYW1lQ291bnQsIHVpbnQzMl90IHNhbXBsZVJhdGUpCisgICAgICAgIDogbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSkKKyAgICAgICAgLCBtRnJhbWVDb3VudChmcmFtZUNvdW50KSB7CisgICAgfQorCisgICAgdmlydHVhbCB+QXVkaW9NaXhlckJhc2UoKSB7fQorCisgICAgdmlydHVhbCBib29sIGlzVmFsaWRGb3JtYXQoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNWYWxpZENoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSBjb25zdDsKKworICAgIC8vIENyZWF0ZSBhIG5ldyB0cmFjayBpbiB0aGUgbWl4ZXIuCisgICAgLy8KKyAgICAvLyBccGFyYW0gbmFtZSAgICAgICAgYSB1bmlxdWUgdXNlci1wcm92aWRlZCBpbnRlZ2VyIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJhY2suCisgICAgLy8gICAgICAgICAgICAgICAgICAgIElmIG5hbWUgYWxyZWFkeSBleGlzdHMsIHRoZSBmdW5jdGlvbiB3aWxsIGFib3J0LgorICAgIC8vIFxwYXJhbSBjaGFubmVsTWFzayBvdXRwdXQgY2hhbm5lbCBtYXNrLgorICAgIC8vIFxwYXJhbSBmb3JtYXQgICAgICBQQ00gZm9ybWF0CisgICAgLy8gXHBhcmFtIHNlc3Npb25JZCAgIFNlc3Npb24gaWQgZm9yIHRoZSB0cmFjay4gVHJhY2tzIHdpdGggdGhlIHNhbWUKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbiBpZCB3aWxsIGJlIHN1Ym1peGVkIHRvZ2V0aGVyLgorICAgIC8vCisgICAgLy8gXHJldHVybiBPSyAgICAgICAgb24gc3VjY2Vzcy4KKyAgICAvLyAgICAgICAgIEJBRF9WQUxVRSBpZiB0aGUgZm9ybWF0IGRvZXMgbm90IHNhdGlzZnkgaXNWYWxpZEZvcm1hdCgpCisgICAgLy8gICAgICAgICAgICAgICAgICAgb3IgdGhlIGNoYW5uZWxNYXNrIGRvZXMgbm90IHNhdGlzZnkgaXNWYWxpZENoYW5uZWxNYXNrKCkuCisgICAgc3RhdHVzX3QgICAgY3JlYXRlKAorICAgICAgICAgICAgaW50IG5hbWUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBzZXNzaW9uSWQpOworCisgICAgYm9vbCAgICAgICAgZXhpc3RzKGludCBuYW1lKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtVHJhY2tzLmNvdW50KG5hbWUpID4gMDsKKyAgICB9CisKKyAgICAvLyBGcmVlIGFuIGFsbG9jYXRlZCB0cmFjayBieSBuYW1lLgorICAgIHZvaWQgICAgICAgIGRlc3Ryb3koaW50IG5hbWUpOworCisgICAgLy8gRW5hYmxlIG9yIGRpc2FibGUgYW4gYWxsb2NhdGVkIHRyYWNrIGJ5IG5hbWUKKyAgICB2b2lkICAgICAgICBlbmFibGUoaW50IG5hbWUpOworICAgIHZvaWQgICAgICAgIGRpc2FibGUoaW50IG5hbWUpOworCisgICAgdmlydHVhbCB2b2lkIHNldFBhcmFtZXRlcihpbnQgbmFtZSwgaW50IHRhcmdldCwgaW50IHBhcmFtLCB2b2lkICp2YWx1ZSk7CisKKyAgICB2b2lkICAgICAgICBwcm9jZXNzKCkgeworICAgICAgICBwcmVQcm9jZXNzKCk7CisgICAgICAgICh0aGlzLT4qbUhvb2spKCk7CisgICAgICAgIHBvc3RQcm9jZXNzKCk7CisgICAgfQorCisgICAgc2l6ZV90ICAgICAgZ2V0VW5yZWxlYXNlZEZyYW1lcyhpbnQgbmFtZSkgY29uc3Q7CisKKyAgICBzdGQ6OnN0cmluZyB0cmFja05hbWVzKCkgY29uc3Q7CisKKyAgcHJvdGVjdGVkOgorICAgIC8vIFNldCBrVXNlTmV3TWl4ZXIgdG8gdHJ1ZSB0byB1c2UgdGhlIG5ldyBtaXhlciBlbmdpbmUgYWx3YXlzLiBPdGhlcndpc2UgdGhlCisgICAgLy8gb3JpZ2luYWwgY29kZSB3aWxsIGJlIHVzZWQgZm9yIHN0ZXJlbyBzaW5rcywgdGhlIG5ldyBtaXhlciBmb3IgZXZlcnl0aGluZyBlbHNlLgorICAgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBrVXNlTmV3TWl4ZXIgPSB0cnVlOworCisgICAgLy8gU2V0IGtVc2VGbG9hdCB0byB0cnVlIHRvIGFsbG93IGZsb2F0aW5nIGlucHV0IGludG8gdGhlIG1peGVyIGVuZ2luZS4KKyAgICAvLyBJZiBrVXNlTmV3TWl4ZXIgaXMgZmFsc2UsIHRoaXMgaXMgaWdub3JlZCBvciBtYXkgYmUgb3ZlcnJpZGRlbiBpbnRlcm5hbGx5CisgICAgc3RhdGljIGNvbnN0ZXhwciBib29sIGtVc2VGbG9hdCA9IHRydWU7CisKKyNpZmRlZiBGTE9BVF9BVVgKKyAgICB1c2luZyBUWVBFX0FVWCA9IGZsb2F0OworICAgIHN0YXRpY19hc3NlcnQoa1VzZU5ld01peGVyICYmIGtVc2VGbG9hdCwKKyAgICAgICAgICAgICJrVXNlTmV3TWl4ZXIgYW5kIGtVc2VGbG9hdCBtdXN0IGJlIHRydWUgZm9yIEZMT0FUX0FVWCBvcHRpb24iKTsKKyNlbHNlCisgICAgdXNpbmcgVFlQRV9BVVggPSBpbnQzMl90OyAvLyBxNC4yNworI2VuZGlmCisKKyAgICAvKiBGb3IgbXVsdGktZm9ybWF0IGZ1bmN0aW9ucyAoY2FsbHMgdGVtcGxhdGUgZnVuY3Rpb25zCisgICAgICogaW4gQXVkaW9NaXhlck9wcy5oKS4gIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSBhcyBmb2xsb3dzOgorICAgICAqCisgICAgICogICBNSVhUWVBFICAgICAoc2VlIEF1ZGlvTWl4ZXJPcHMuaCBNSVhUWVBFXyogZW51bWVyYXRpb24pCisgICAgICogICBVU0VGTE9BVFZPTCAoc2V0IHRvIHRydWUgaWYgZmxvYXQgdm9sdW1lIGlzIHVzZWQpCisgICAgICogICBBREpVU1RWT0wgICAoc2V0IHRvIHRydWUgaWYgdm9sdW1lIHJhbXAgcGFyYW1ldGVycyBuZWVkcyBhZGp1c3RtZW50IGFmdGVyd2FyZHMpCisgICAgICogICBUTzogaW50MzJfdCAoUTQuMjcpIG9yIGZsb2F0CisgICAgICogICBUSTogaW50MzJfdCAoUTQuMjcpIG9yIGludDE2X3QgKFEwLjE1KSBvciBmbG9hdAorICAgICAqICAgVEE6IGludDMyX3QgKFE0LjI3KQorICAgICAqLworCisgICAgZW51bSB7CisgICAgICAgIC8vIEZJWE1FIHRoaXMgcmVwcmVzZW50YXRpb24gcGVybWl0cyB1cCB0byA4IGNoYW5uZWxzCisgICAgICAgIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0sgICA9IDB4MDAwMDAwMDcsCisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBORUVEU19DSEFOTkVMXzEgICAgICAgICAgICAgPSAweDAwMDAwMDAwLCAgIC8vIG1vbm8KKyAgICAgICAgTkVFRFNfQ0hBTk5FTF8yICAgICAgICAgICAgID0gMHgwMDAwMDAwMSwgICAvLyBzdGVyZW8KKworICAgICAgICAvLyBzYW1wbGUgZm9ybWF0IGlzIG5vdCBleHBsaWNpdGx5IHNwZWNpZmllZCwgYW5kIGlzIGFzc3VtZWQgdG8gYmUgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQKKworICAgICAgICBORUVEU19NVVRFICAgICAgICAgICAgICAgICAgPSAweDAwMDAwMTAwLAorICAgICAgICBORUVEU19SRVNBTVBMRSAgICAgICAgICAgICAgPSAweDAwMDAxMDAwLAorICAgICAgICBORUVEU19BVVggICAgICAgICAgICAgICAgICAgPSAweDAwMDEwMDAwLAorICAgIH07CisKKyAgICAvLyBob29rIHR5cGVzCisgICAgZW51bSB7CisgICAgICAgIFBST0NFU1NUWVBFX05PUkVTQU1QTEVPTkVUUkFDSywgLy8gb3RoZXJzIHNldCBlbHNld2hlcmUKKyAgICB9OworCisgICAgZW51bSB7CisgICAgICAgIFRSQUNLVFlQRV9OT1AsCisgICAgICAgIFRSQUNLVFlQRV9SRVNBTVBMRSwKKyAgICAgICAgVFJBQ0tUWVBFX05PUkVTQU1QTEUsCisgICAgICAgIFRSQUNLVFlQRV9OT1JFU0FNUExFTU9OTywKKyAgICB9OworCisgICAgLy8gcHJvY2VzcyBob29rIGZ1bmN0aW9uYWxpdHkKKyAgICB1c2luZyBwcm9jZXNzX2hvb2tfdCA9IHZvaWQoQXVkaW9NaXhlckJhc2U6OiopKCk7CisKKyAgICBzdHJ1Y3QgVHJhY2tCYXNlOworICAgIHVzaW5nIGhvb2tfdCA9IHZvaWQoVHJhY2tCYXNlOjoqKSgKKyAgICAgICAgICAgIGludDMyX3QqIG91dHB1dCwgc2l6ZV90IG51bU91dEZyYW1lcywgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KTsKKworICAgIHN0cnVjdCBUcmFja0Jhc2UgeworICAgICAgICBUcmFja0Jhc2UoKQorICAgICAgICAgICAgOiBidWZmZXJQcm92aWRlcihudWxscHRyKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBUT0RPOiBtb3ZlIGFkZGl0aW9uYWwgaW5pdGlhbGl6YXRpb24gaGVyZS4KKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIH5UcmFja0Jhc2UoKSB7fQorCisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0T3V0cHV0Q2hhbm5lbENvdW50KCkgeyByZXR1cm4gY2hhbm5lbENvdW50OyB9CisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0TWl4ZXJDaGFubmVsQ291bnQoKSB7IHJldHVybiBtTWl4ZXJDaGFubmVsQ291bnQ7IH0KKworICAgICAgICBib29sICAgICAgICBuZWVkc1JhbXAoKSB7IHJldHVybiAodm9sdW1lSW5jWzBdIHwgdm9sdW1lSW5jWzFdIHwgYXV4SW5jKSAhPSAwOyB9CisgICAgICAgIGJvb2wgICAgICAgIHNldFJlc2FtcGxlcih1aW50MzJfdCB0cmFja1NhbXBsZVJhdGUsIHVpbnQzMl90IGRldlNhbXBsZVJhdGUpOworICAgICAgICBib29sICAgICAgICBkb2VzUmVzYW1wbGUoKSBjb25zdCB7IHJldHVybiBtUmVzYW1wbGVyLmdldCgpICE9IG51bGxwdHI7IH0KKyAgICAgICAgdm9pZCAgICAgICAgcmVjcmVhdGVSZXNhbXBsZXIodWludDMyX3QgZGV2U2FtcGxlUmF0ZSk7CisgICAgICAgIHZvaWQgICAgICAgIHJlc2V0UmVzYW1wbGVyKCkgeyBpZiAobVJlc2FtcGxlci5nZXQoKSAhPSBudWxscHRyKSBtUmVzYW1wbGVyLT5yZXNldCgpOyB9CisgICAgICAgIHZvaWQgICAgICAgIGFkanVzdFZvbHVtZVJhbXAoYm9vbCBhdXgsIGJvb2wgdXNlRmxvYXQgPSBmYWxzZSk7CisgICAgICAgIHNpemVfdCAgICAgIGdldFVucmVsZWFzZWRGcmFtZXMoKSBjb25zdCB7IHJldHVybiBtUmVzYW1wbGVyLmdldCgpICE9IG51bGxwdHIgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNhbXBsZXItPmdldFVucmVsZWFzZWRGcmFtZXMoKSA6IDA7IH07CisKKyAgICAgICAgc3RhdGljIGhvb2tfdCBnZXRUcmFja0hvb2soaW50IHRyYWNrVHlwZSwgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1peGVySW5Gb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0KTsKKworICAgICAgICB2b2lkIHRyYWNrX19ub3AoaW50MzJfdCogb3V0LCBzaXplX3QgbnVtRnJhbWVzLCBpbnQzMl90KiB0ZW1wLCBpbnQzMl90KiBhdXgpOworCisgICAgICAgIHRlbXBsYXRlIDxpbnQgTUlYVFlQRSwgYm9vbCBVU0VGTE9BVFZPTCwgYm9vbCBBREpVU1RWT0wsCisgICAgICAgICAgICB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgorICAgICAgICB2b2lkIHZvbHVtZU1peChUTyAqb3V0LCBzaXplX3Qgb3V0RnJhbWVzLCBjb25zdCBUSSAqaW4sIFRBICphdXgsIGJvb2wgcmFtcCk7CisKKyAgICAgICAgdWludDMyX3QgICAgbmVlZHM7CisKKyAgICAgICAgLy8gVE9ETzogRXZlbnR1YWxseSByZW1vdmUgbGVnYWN5IGludGVnZXIgdm9sdW1lIHNldHRpbmdzCisgICAgICAgIHVuaW9uIHsKKyAgICAgICAgaW50MTZfdCAgICAgdm9sdW1lW01BWF9OVU1fVk9MVU1FU107IC8vIFU0LjEyIGZpeGVkIHBvaW50ICh0b3AgYml0IHNob3VsZCBiZSB6ZXJvKQorICAgICAgICBpbnQzMl90ICAgICB2b2x1bWVSTDsKKyAgICAgICAgfTsKKworICAgICAgICBpbnQzMl90ICAgICBwcmV2Vm9sdW1lW01BWF9OVU1fVk9MVU1FU107CisgICAgICAgIGludDMyX3QgICAgIHZvbHVtZUluY1tNQVhfTlVNX1ZPTFVNRVNdOworICAgICAgICBpbnQzMl90ICAgICBhdXhJbmM7CisgICAgICAgIGludDMyX3QgICAgIHByZXZBdXhMZXZlbDsKKyAgICAgICAgaW50MTZfdCAgICAgYXV4TGV2ZWw7ICAgICAgIC8vIDAgPD0gYXV4TGV2ZWwgPD0gTUFYX0dBSU5fSU5ULCBidXQgc2lnbmVkIGZvciBtdWwgcGVyZm9ybWFuY2UKKworICAgICAgICB1aW50MTZfdCAgICBmcmFtZUNvdW50OworCisgICAgICAgIHVpbnQ4X3QgICAgIGNoYW5uZWxDb3VudDsgICAvLyAxIG9yIDIsIHJlZHVuZGFudCB3aXRoIChuZWVkcyAmIE5FRURTX0NIQU5ORUxfQ09VTlRfX01BU0spCisgICAgICAgIHVpbnQ4X3QgICAgIHVudXNlZF9wYWRkaW5nOyAvLyBmb3JtZXJseSBmb3JtYXQsIHdhcyBhbHdheXMgMTYKKyAgICAgICAgdWludDE2X3QgICAgZW5hYmxlZDsgICAgICAgIC8vIGFjdHVhbGx5IGJvb2wKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2s7CisKKyAgICAgICAgLy8gYWN0dWFsIGJ1ZmZlciBwcm92aWRlciB1c2VkIGJ5IHRoZSB0cmFjayBob29rcworICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiAgICAgICAgICAgICAgICBidWZmZXJQcm92aWRlcjsKKworICAgICAgICBtdXRhYmxlIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciBidWZmZXI7IC8vIDggYnl0ZXMKKworICAgICAgICBob29rX3QgICAgICBob29rOworICAgICAgICBjb25zdCB2b2lkICAqbUluOyAgICAgICAgICAgICAvLyBjdXJyZW50IGxvY2F0aW9uIGluIGJ1ZmZlcgorCisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxBdWRpb1Jlc2FtcGxlcj4gbVJlc2FtcGxlcjsKKyAgICAgICAgdWludDMyX3QgICAgc2FtcGxlUmF0ZTsKKyAgICAgICAgaW50MzJfdCogICAgbWFpbkJ1ZmZlcjsKKyAgICAgICAgaW50MzJfdCogICAgYXV4QnVmZmVyOworCisgICAgICAgIGludDMyX3QgICAgIHNlc3Npb25JZDsKKworICAgICAgICBhdWRpb19mb3JtYXRfdCBtTWl4ZXJGb3JtYXQ7ICAgICAvLyBvdXRwdXQgbWl4IGZvcm1hdDogQVVESU9fRk9STUFUX1BDTV8oRkxPQVR8MTZfQklUKQorICAgICAgICBhdWRpb19mb3JtYXRfdCBtRm9ybWF0OyAgICAgICAgICAvLyBpbnB1dCB0cmFjayBmb3JtYXQKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgbU1peGVySW5Gb3JtYXQ7ICAgLy8gbWl4IGludGVybmFsIGZvcm1hdCBBVURJT19GT1JNQVRfUENNXyhGTE9BVHwxNl9CSVQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVhY2ggdHJhY2sgbXVzdCBiZSBjb252ZXJ0ZWQgdG8gdGhpcyBmb3JtYXQuCisKKyAgICAgICAgZmxvYXQgICAgICAgICAgbVZvbHVtZVtNQVhfTlVNX1ZPTFVNRVNdOyAgICAgLy8gZmxvYXRpbmcgcG9pbnQgc2V0IHZvbHVtZQorICAgICAgICBmbG9hdCAgICAgICAgICBtUHJldlZvbHVtZVtNQVhfTlVNX1ZPTFVNRVNdOyAvLyBmbG9hdGluZyBwb2ludCBwcmV2aW91cyB2b2x1bWUKKyAgICAgICAgZmxvYXQgICAgICAgICAgbVZvbHVtZUluY1tNQVhfTlVNX1ZPTFVNRVNdOyAgLy8gZmxvYXRpbmcgcG9pbnQgdm9sdW1lIGluY3JlbWVudAorCisgICAgICAgIGZsb2F0ICAgICAgICAgIG1BdXhMZXZlbDsgICAgICAgICAgICAgICAgICAgICAvLyBmbG9hdGluZyBwb2ludCBzZXQgYXV4IGxldmVsCisgICAgICAgIGZsb2F0ICAgICAgICAgIG1QcmV2QXV4TGV2ZWw7ICAgICAgICAgICAgICAgICAvLyBmbG9hdGluZyBwb2ludCBwcmV2IGF1eCBsZXZlbAorICAgICAgICBmbG9hdCAgICAgICAgICBtQXV4SW5jOyAgICAgICAgICAgICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgYXV4IGluY3JlbWVudAorCisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IG1NaXhlckNoYW5uZWxNYXNrOworICAgICAgICB1aW50MzJfdCAgICAgICAgICAgICBtTWl4ZXJDaGFubmVsQ291bnQ7CisKKyAgICAgIHByb3RlY3RlZDoKKworICAgICAgICAvLyBob29rcworICAgICAgICB2b2lkIHRyYWNrX19nZW5lcmljUmVzYW1wbGUoaW50MzJfdCogb3V0LCBzaXplX3QgbnVtRnJhbWVzLCBpbnQzMl90KiB0ZW1wLCBpbnQzMl90KiBhdXgpOworICAgICAgICB2b2lkIHRyYWNrX18xNkJpdHNTdGVyZW8oaW50MzJfdCogb3V0LCBzaXplX3QgbnVtRnJhbWVzLCBpbnQzMl90KiB0ZW1wLCBpbnQzMl90KiBhdXgpOworICAgICAgICB2b2lkIHRyYWNrX18xNkJpdHNNb25vKGludDMyX3QqIG91dCwgc2l6ZV90IG51bUZyYW1lcywgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KTsKKworICAgICAgICB2b2lkIHZvbHVtZVJhbXBTdGVyZW8oaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KTsKKyAgICAgICAgdm9pZCB2b2x1bWVTdGVyZW8oaW50MzJfdCogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgaW50MzJfdCogdGVtcCwgaW50MzJfdCogYXV4KTsKKworICAgICAgICAvLyBtdWx0aS1mb3JtYXQgdHJhY2sgaG9va3MKKyAgICAgICAgdGVtcGxhdGUgPGludCBNSVhUWVBFLCB0eXBlbmFtZSBUTywgdHlwZW5hbWUgVEksIHR5cGVuYW1lIFRBPgorICAgICAgICB2b2lkIHRyYWNrX19SZXNhbXBsZShUTyogb3V0LCBzaXplX3QgZnJhbWVDb3VudCwgVE8qIHRlbXAgX191bnVzZWQsIFRBKiBhdXgpOworICAgICAgICB0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+CisgICAgICAgIHZvaWQgdHJhY2tfX05vUmVzYW1wbGUoVE8qIG91dCwgc2l6ZV90IGZyYW1lQ291bnQsIFRPKiB0ZW1wIF9fdW51c2VkLCBUQSogYXV4KTsKKyAgICB9OworCisgICAgLy8gcHJlQ3JlYXRlVHJhY2sgbXVzdCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgYSBwcm9wZXIgVHJhY2tCYXNlIGRlc2NlbmRhbnQuCisgICAgLy8gcG9zdENyZWF0ZVRyYWNrIGlzIGNhbGxlZCBhZnRlciBmaWxsaW5nIG91dCBmaWVsZHMgb2YgVHJhY2tCYXNlLiBJdCBjYW4KKyAgICAvLyBhYm9ydCB0cmFjayBjcmVhdGlvbiBieSByZXR1cm5pbmcgbm9uLU9LIHN0YXR1cy4gU2VlIHRoZSBpbXBsZW1lbnRhdGlvbgorICAgIC8vIG9mIGNyZWF0ZSgpIGZvciBkZXRhaWxzLgorICAgIHZpcnR1YWwgc3RkOjpzaGFyZWRfcHRyPFRyYWNrQmFzZT4gcHJlQ3JlYXRlVHJhY2soKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHBvc3RDcmVhdGVUcmFjayhUcmFja0Jhc2UgKnRyYWNrIF9fdW51c2VkKSB7IHJldHVybiBPSzsgfQorCisgICAgLy8gcHJlUHJvY2VzcyBpcyBjYWxsZWQgYmVmb3JlIHRoZSBwcm9jZXNzIGhvb2ssIHBvc3RQcm9jZXNzIGFmdGVyLAorICAgIC8vIHNlZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgcHJvY2VzcygpIG1ldGhvZC4KKyAgICB2aXJ0dWFsIHZvaWQgcHJlUHJvY2VzcygpIHt9CisgICAgdmlydHVhbCB2b2lkIHBvc3RQcm9jZXNzKCkge30KKworICAgIHZpcnR1YWwgYm9vbCBzZXRDaGFubmVsTWFza3MoaW50IG5hbWUsCisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCB0cmFja0NoYW5uZWxNYXNrLCBhdWRpb19jaGFubmVsX21hc2tfdCBtaXhlckNoYW5uZWxNYXNrKTsKKworICAgIC8vIENhbGxlZCB3aGVuIHRyYWNrIGluZm8gY2hhbmdlcyBhbmQgYSBuZXcgcHJvY2VzcyBob29rIHNob3VsZCBiZSBkZXRlcm1pbmVkLgorICAgIHZvaWQgaW52YWxpZGF0ZSgpIHsKKyAgICAgICAgbUhvb2sgPSAmQXVkaW9NaXhlckJhc2U6OnByb2Nlc3NfX3ZhbGlkYXRlOworICAgIH0KKworICAgIHZvaWQgcHJvY2Vzc19fdmFsaWRhdGUoKTsKKyAgICB2b2lkIHByb2Nlc3NfX25vcCgpOworICAgIHZvaWQgcHJvY2Vzc19fZ2VuZXJpY05vUmVzYW1wbGluZygpOworICAgIHZvaWQgcHJvY2Vzc19fZ2VuZXJpY1Jlc2FtcGxpbmcoKTsKKyAgICB2b2lkIHByb2Nlc3NfX29uZVRyYWNrMTZCaXRzU3RlcmVvTm9SZXNhbXBsaW5nKCk7CisKKyAgICB0ZW1wbGF0ZSA8aW50IE1JWFRZUEUsIHR5cGVuYW1lIFRPLCB0eXBlbmFtZSBUSSwgdHlwZW5hbWUgVEE+CisgICAgdm9pZCBwcm9jZXNzX19ub1Jlc2FtcGxlT25lVHJhY2soKTsKKworICAgIHN0YXRpYyBwcm9jZXNzX2hvb2tfdCBnZXRQcm9jZXNzSG9vayhpbnQgcHJvY2Vzc1R5cGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IG1peGVySW5Gb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0KTsKKworICAgIHN0YXRpYyB2b2lkIGNvbnZlcnRNaXhlckZvcm1hdCh2b2lkICpvdXQsIGF1ZGlvX2Zvcm1hdF90IG1peGVyT3V0Rm9ybWF0LAorICAgICAgICAgICAgdm9pZCAqaW4sIGF1ZGlvX2Zvcm1hdF90IG1peGVySW5Gb3JtYXQsIHNpemVfdCBzYW1wbGVDb3VudCk7CisKKyAgICAvLyBpbml0aWFsaXphdGlvbiBjb25zdGFudHMKKyAgICBjb25zdCB1aW50MzJfdCBtU2FtcGxlUmF0ZTsKKyAgICBjb25zdCBzaXplX3QgbUZyYW1lQ291bnQ7CisKKyAgICBwcm9jZXNzX2hvb2tfdCBtSG9vayA9ICZBdWRpb01peGVyQmFzZTo6cHJvY2Vzc19fbm9wOyAgIC8vIG9uZSBvZiBwcm9jZXNzX18qLCBuZXZlciBudWxscHRyCisKKyAgICAvLyB0aGUgc2l6ZSBvZiB0aGUgdHlwZSAoaW50MzJfdCkgc2hvdWxkIGJlIHRoZSBsYXJnZXN0IG9mIGFsbCB0eXBlcyBzdXBwb3J0ZWQKKyAgICAvLyBieSB0aGUgbWl4ZXIuCisgICAgc3RkOjp1bmlxdWVfcHRyPGludDMyX3RbXT4gbU91dHB1dFRlbXA7CisgICAgc3RkOjp1bmlxdWVfcHRyPGludDMyX3RbXT4gbVJlc2FtcGxlVGVtcDsKKworICAgIC8vIHRyYWNrIG5hbWVzIGdyb3VwZWQgYnkgbWFpbiBidWZmZXIsIGluIG5vIHBhcnRpY3VsYXIgb3JkZXIgb2YgbWFpbiBidWZmZXIuCisgICAgLy8gaG93ZXZlciBuYW1lcyBmb3IgYSBwYXJ0aWN1bGFyIG1haW4gYnVmZmVyIGFyZSBpbiBvcmRlciAoYnkgY29uc3RydWN0aW9uKS4KKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dm9pZCAqIC8qIG1haW5CdWZmZXIgKi8sIHN0ZDo6dmVjdG9yPGludCAvKiBuYW1lICovPj4gbUdyb3VwczsKKworICAgIC8vIHRyYWNrIG5hbWVzIHRoYXQgYXJlIGVuYWJsZWQsIGluIGluY3JlYXNpbmcgb3JkZXIgKGJ5IGNvbnN0cnVjdGlvbikuCisgICAgc3RkOjp2ZWN0b3I8aW50IC8qIG5hbWUgKi8+IG1FbmFibGVkOworCisgICAgLy8gdHJhY2sgc21hcnQgcG9pbnRlcnMsIGJ5IG5hbWUsIGluIGluY3JlYXNpbmcgb3JkZXIgb2YgbmFtZS4KKyAgICBzdGQ6Om1hcDxpbnQgLyogbmFtZSAqLywgc3RkOjpzaGFyZWRfcHRyPFRyYWNrQmFzZT4+IG1UcmFja3M7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfQVVESU9fTUlYRVJfQkFTRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaAppbmRleCAwNTVmNzI0Li41MGNhMzNkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oCisrKyBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy9pbmNsdWRlL21lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmgKQEAgLTEwNCw4ICsxMDQsOCBAQAogICAgICAgICBjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcHIyKSB7CiAgICAgcmV0dXJuIGZhYnMocHIxLm1TcGVlZCAtIHByMi5tU3BlZWQpIDwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOX0RFTFRBICYmCiAgICAgICAgICAgIGZhYnMocHIxLm1QaXRjaCAtIHByMi5tUGl0Y2gpIDwgQVVESU9fVElNRVNUUkVUQ0hfUElUQ0hfTUlOX0RFTFRBICYmCi0gICAgICAgICAgIHByMi5tU3RyZXRjaE1vZGUgPT0gcHIyLm1TdHJldGNoTW9kZSAmJgotICAgICAgICAgICBwcjIubUZhbGxiYWNrTW9kZSA9PSBwcjIubUZhbGxiYWNrTW9kZTsKKyAgICAgICAgICAgcHIxLm1TdHJldGNoTW9kZSA9PSBwcjIubVN0cmV0Y2hNb2RlICYmCisgICAgICAgICAgIHByMS5tRmFsbGJhY2tNb2RlID09IHByMi5tRmFsbGJhY2tNb2RlOwogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1BsYXliYWNrUmF0ZVZhbGlkKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZwbGF5YmFja1JhdGUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvUmVjb3JkQnVmZmVyQ29udmVydGVyLmggYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvaW5jbHVkZS9tZWRpYS9SZWNvcmRCdWZmZXJDb252ZXJ0ZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9SZWNvcmRCdWZmZXJDb252ZXJ0ZXIuaApyZW5hbWUgdG8gbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL2luY2x1ZGUvbWVkaWEvUmVjb3JkQnVmZmVyQ29udmVydGVyLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggODExYzE2Yi4uMjBjMmMyYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTMsMTMgKzMsMTkgQEAKIGNjX2RlZmF1bHRzIHsKICAgICBuYW1lOiAibGliYXVkaW9wcm9jZXNzaW5nX3Rlc3RfZGVmYXVsdHMiLAogCi0gICAgaGVhZGVyX2xpYnM6IFsibGliYmFzZV9oZWFkZXJzIl0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYXVkaW9jbGllbnQiLAogICAgICAgICAibGliYXVkaW9wcm9jZXNzaW5nIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ2aWJyYXRvciIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL2Z1enplci9BbmRyb2lkLmJwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkZjQ3YjcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMCBAQAorY2NfZnV6eiB7CisgIG5hbWU6ICJsaWJhdWRpb3Byb2Nlc3NpbmdfcmVzYW1wbGVyX2Z1enplciIsCisgIHNyY3M6IFsKKyAgICAibGliYXVkaW9wcm9jZXNzaW5nX3Jlc2FtcGxlcl9mdXp6ZXIuY3BwIiwKKyAgXSwKKyAgZGVmYXVsdHM6IFsibGliYXVkaW9wcm9jZXNzaW5nX3Rlc3RfZGVmYXVsdHMiXSwKKyAgc3RhdGljX2xpYnM6IFsKKyAgICAibGlic25kZmlsZSIsCisgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvZnV6emVyL2xpYmF1ZGlvcHJvY2Vzc2luZ19yZXNhbXBsZXJfZnV6emVyLmNwcCBiL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9mdXp6ZXIvbGliYXVkaW9wcm9jZXNzaW5nX3Jlc2FtcGxlcl9mdXp6ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzOGM2MTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJhdWRpb3Byb2Nlc3NpbmcvdGVzdHMvZnV6emVyL2xpYmF1ZGlvcHJvY2Vzc2luZ19yZXNhbXBsZXJfZnV6emVyLmNwcApAQCAtMCwwICsxLDE4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3NuZGZpbGUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvbW1hbi5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSA8bWVtb3J5PgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworY29uc3QgaW50IE1BWF9GUkFNRVMgPSAxMDsKK2NvbnN0IGludCBNSU5fRlJFUSA9IDFlMzsKK2NvbnN0IGludCBNQVhfRlJFUSA9IDEwMGUzOworCitjb25zdCBBdWRpb1Jlc2FtcGxlcjo6c3JjX3F1YWxpdHkgcXVhbGl0aWVzW10gPSB7CisgICAgQXVkaW9SZXNhbXBsZXI6OkRFRkFVTFRfUVVBTElUWSwKKyAgICBBdWRpb1Jlc2FtcGxlcjo6TE9XX1FVQUxJVFksCisgICAgQXVkaW9SZXNhbXBsZXI6Ok1FRF9RVUFMSVRZLAorICAgIEF1ZGlvUmVzYW1wbGVyOjpISUdIX1FVQUxJVFksCisgICAgQXVkaW9SZXNhbXBsZXI6OlZFUllfSElHSF9RVUFMSVRZLAorICAgIEF1ZGlvUmVzYW1wbGVyOjpEWU5fTE9XX1FVQUxJVFksCisgICAgQXVkaW9SZXNhbXBsZXI6OkRZTl9NRURfUVVBTElUWSwKKyAgICBBdWRpb1Jlc2FtcGxlcjo6RFlOX0hJR0hfUVVBTElUWSwKK307CisKK2NsYXNzIFByb3ZpZGVyIDogcHVibGljIEF1ZGlvQnVmZmVyUHJvdmlkZXIgeworICBjb25zdCB2b2lkKiBtQWRkcjsgICAgICAgIC8vIGJhc2UgYWRkcmVzcworICBjb25zdCBzaXplX3QgbU51bUZyYW1lczsgIC8vIHRvdGFsIGZyYW1lcworICBjb25zdCBzaXplX3QgbUZyYW1lU2l6ZTsgIC8vIHNpemUgb2YgZWFjaCBmcmFtZSBpbiBieXRlcworICBzaXplX3QgbU5leHRGcmFtZTsgICAgICAgIC8vIGluZGV4IG9mIG5leHQgZnJhbWUgdG8gcHJvdmlkZQorICBzaXplX3QgbVVucmVsOyAgICAgICAgICAgIC8vIG51bWJlciBvZiBmcmFtZXMgbm90IHlldCByZWxlYXNlZAorIHB1YmxpYzoKKyAgUHJvdmlkZXIoY29uc3Qgdm9pZCogYWRkciwgc2l6ZV90IGZyYW1lcywgc2l6ZV90IGZyYW1lU2l6ZSkKKyAgICAgIDogbUFkZHIoYWRkciksCisgICAgICAgIG1OdW1GcmFtZXMoZnJhbWVzKSwKKyAgICAgICAgbUZyYW1lU2l6ZShmcmFtZVNpemUpLAorICAgICAgICBtTmV4dEZyYW1lKDApLAorICAgICAgICBtVW5yZWwoMCkge30KKyAgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihCdWZmZXIqIGJ1ZmZlcikgb3ZlcnJpZGUgeworICAgIGlmIChidWZmZXItPmZyYW1lQ291bnQgPiBtTnVtRnJhbWVzIC0gbU5leHRGcmFtZSkgeworICAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gbU51bUZyYW1lcyAtIG1OZXh0RnJhbWU7CisgICAgfQorICAgIG1VbnJlbCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICBpZiAoYnVmZmVyLT5mcmFtZUNvdW50ID4gMCkgeworICAgICAgYnVmZmVyLT5yYXcgPSAoY2hhciopbUFkZHIgKyBtRnJhbWVTaXplICogbU5leHRGcmFtZTsKKyAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgYnVmZmVyLT5yYXcgPSBudWxscHRyOworICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKKyAgICB9CisgIH0KKyAgdmlydHVhbCB2b2lkIHJlbGVhc2VCdWZmZXIoQnVmZmVyKiBidWZmZXIpIHsKKyAgICBpZiAoYnVmZmVyLT5mcmFtZUNvdW50ID4gbVVucmVsKSB7CisgICAgICBtTmV4dEZyYW1lICs9IG1VbnJlbDsKKyAgICAgIG1VbnJlbCA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgIG1OZXh0RnJhbWUgKz0gYnVmZmVyLT5mcmFtZUNvdW50OworICAgICAgbVVucmVsIC09IGJ1ZmZlci0+ZnJhbWVDb3VudDsKKyAgICB9CisgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gMDsKKyAgICBidWZmZXItPnJhdyA9IG51bGxwdHI7CisgIH0KKyAgdm9pZCByZXNldCgpIHsgbU5leHRGcmFtZSA9IDA7IH0KK307CisKK2F1ZGlvX2Zvcm1hdF90IGNob29zZUZvcm1hdChBdWRpb1Jlc2FtcGxlcjo6c3JjX3F1YWxpdHkgcXVhbGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IGlucHV0X2J5dGUpIHsKKyAgc3dpdGNoIChxdWFsaXR5KSB7CisgICAgY2FzZSBBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZOgorICAgIGNhc2UgQXVkaW9SZXNhbXBsZXI6OkRZTl9NRURfUVVBTElUWToKKyAgICBjYXNlIEF1ZGlvUmVzYW1wbGVyOjpEWU5fSElHSF9RVUFMSVRZOgorICAgICAgaWYgKGlucHV0X2J5dGUgJSAyKSB7CisgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICAgICAgfQorICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgfQorfQorCitpbnQgcGFyc2VWYWx1ZShjb25zdCB1aW50OF90KiBzcmMsIGludCBpbmRleCwgdm9pZCogZHN0LCBzaXplX3Qgc2l6ZSkgeworICBtZW1jcHkoZHN0LCAmc3JjW2luZGV4XSwgc2l6ZSk7CisgIHJldHVybiBzaXplOworfQorCitib29sIHZhbGlkRnJlcShpbnQgZnJlcSkgeyByZXR1cm4gZnJlcSA+IE1JTl9GUkVRICYmIGZyZXEgPCBNQVhfRlJFUTsgfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplKSB7CisgIGludCBpbnB1dF9mcmVxID0gMDsKKyAgaW50IG91dHB1dF9mcmVxID0gMDsKKyAgaW50IGlucHV0X2NoYW5uZWxzID0gMDsKKworICBmbG9hdCBsZWZ0X3ZvbHVtZSA9IDA7CisgIGZsb2F0IHJpZ2h0X3ZvbHVtZSA9IDA7CisKKyAgc2l6ZV90IG1ldGFkYXRhX3NpemUgPSAyICsgMyAqIHNpemVvZihpbnQpICsgMiAqIHNpemVvZihmbG9hdCk7CisgIGlmIChzaXplIDwgbWV0YWRhdGFfc2l6ZSkgeworICAgIC8vIG5vdCBlbm91Z2ggZGF0YSB0byBzZXQgb3B0aW9ucworICAgIHJldHVybiAwOworICB9CisKKyAgQXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IHF1YWxpdHkgPSBxdWFsaXRpZXNbZGF0YVswXSAlIDhdOworICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBjaG9vc2VGb3JtYXQocXVhbGl0eSwgZGF0YVsxXSk7CisKKyAgaW50IGluZGV4ID0gMjsKKworICBpbmRleCArPSBwYXJzZVZhbHVlKGRhdGEsIGluZGV4LCAmaW5wdXRfZnJlcSwgc2l6ZW9mKGludCkpOworICBpbmRleCArPSBwYXJzZVZhbHVlKGRhdGEsIGluZGV4LCAmb3V0cHV0X2ZyZXEsIHNpemVvZihpbnQpKTsKKyAgaW5kZXggKz0gcGFyc2VWYWx1ZShkYXRhLCBpbmRleCwgJmlucHV0X2NoYW5uZWxzLCBzaXplb2YoaW50KSk7CisKKyAgaW5kZXggKz0gcGFyc2VWYWx1ZShkYXRhLCBpbmRleCwgJmxlZnRfdm9sdW1lLCBzaXplb2YoZmxvYXQpKTsKKyAgaW5kZXggKz0gcGFyc2VWYWx1ZShkYXRhLCBpbmRleCwgJnJpZ2h0X3ZvbHVtZSwgc2l6ZW9mKGZsb2F0KSk7CisKKyAgaWYgKCF2YWxpZEZyZXEoaW5wdXRfZnJlcSkgfHwgIXZhbGlkRnJlcShvdXRwdXRfZnJlcSkpIHsKKyAgICAvLyBzYW1wbGluZyBmcmVxdWVuY2llcyBtdXN0IGJlIHJlYXNvbmFibGUKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGlmIChpbnB1dF9jaGFubmVscyA8IDEgfHwKKyAgICAgIGlucHV0X2NoYW5uZWxzID4gKHF1YWxpdHkgPCBBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZID8gMiA6IDgpKSB7CisgICAgLy8gaW52YWxpZCBudW1iZXIgb2YgaW5wdXQgY2hhbm5lbHMKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHNpemVfdCBzaW5nbGVfY2hhbm5lbF9zaXplID0KKyAgICAgIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfUENNX0ZMT0FUID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihpbnQxNl90KTsKKyAgc2l6ZV90IGlucHV0X2ZyYW1lX3NpemUgPSBzaW5nbGVfY2hhbm5lbF9zaXplICogaW5wdXRfY2hhbm5lbHM7CisgIHNpemVfdCBpbnB1dF9zaXplID0gc2l6ZSAtIG1ldGFkYXRhX3NpemU7CisgIHVpbnQ4X3QgaW5wdXRfZGF0YVtpbnB1dF9zaXplXTsKKyAgbWVtY3B5KGlucHV0X2RhdGEsICZkYXRhW21ldGFkYXRhX3NpemVdLCBpbnB1dF9zaXplKTsKKworICBzaXplX3QgaW5wdXRfZnJhbWVzID0gaW5wdXRfc2l6ZSAvIGlucHV0X2ZyYW1lX3NpemU7CisgIGlmIChpbnB1dF9mcmFtZXMgPiBNQVhfRlJBTUVTKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBQcm92aWRlciBwcm92aWRlcihpbnB1dF9kYXRhLCBpbnB1dF9mcmFtZXMsIGlucHV0X2ZyYW1lX3NpemUpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxBdWRpb1Jlc2FtcGxlcj4gcmVzYW1wbGVyKAorICAgICAgQXVkaW9SZXNhbXBsZXI6OmNyZWF0ZShmb3JtYXQsIGlucHV0X2NoYW5uZWxzLCBvdXRwdXRfZnJlcSwgcXVhbGl0eSkpOworCisgIHJlc2FtcGxlci0+c2V0U2FtcGxlUmF0ZShpbnB1dF9mcmVxKTsKKyAgcmVzYW1wbGVyLT5zZXRWb2x1bWUobGVmdF92b2x1bWUsIHJpZ2h0X3ZvbHVtZSk7CisKKyAgLy8gb3V0cHV0IGlzIGF0IGxlYXN0IHN0ZXJlbyBzYW1wbGVzCisgIGludCBvdXRwdXRfY2hhbm5lbHMgPSBpbnB1dF9jaGFubmVscyA+IDIgPyBpbnB1dF9jaGFubmVscyA6IDI7CisgIHNpemVfdCBvdXRwdXRfZnJhbWVfc2l6ZSA9IG91dHB1dF9jaGFubmVscyAqIHNpemVvZihpbnQzMl90KTsKKyAgc2l6ZV90IG91dHB1dF9mcmFtZXMgPSAoaW5wdXRfZnJhbWVzICogb3V0cHV0X2ZyZXEpIC8gaW5wdXRfZnJlcTsKKyAgc2l6ZV90IG91dHB1dF9zaXplID0gb3V0cHV0X2ZyYW1lcyAqIG91dHB1dF9mcmFtZV9zaXplOworCisgIHVpbnQ4X3Qgb3V0cHV0X2RhdGFbb3V0cHV0X3NpemVdOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dF9mcmFtZXM7IGkrKykgeworICAgIG1lbXNldChvdXRwdXRfZGF0YSwgMCwgb3V0cHV0X3NpemUpOworICAgIHJlc2FtcGxlci0+cmVzYW1wbGUoKGludCopb3V0cHV0X2RhdGEsIGksICZwcm92aWRlcik7CisgIH0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmF1ZGlvcHJvY2Vzc2luZy90ZXN0cy9yZXNhbXBsZXJfdGVzdHMuY3BwIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL3Jlc2FtcGxlcl90ZXN0cy5jcHAKaW5kZXggZTE2MjNmNy4uODI5MjI5MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL3Jlc2FtcGxlcl90ZXN0cy5jcHAKKysrIGIvbWVkaWEvbGliYXVkaW9wcm9jZXNzaW5nL3Rlc3RzL3Jlc2FtcGxlcl90ZXN0cy5jcHAKQEAgLTI0Niw3ICsyNDYsOCBAQAogfQogCiB2b2lkIHRlc3RGaWx0ZXJSZXNwb25zZSgKLSAgICAgICAgc2l6ZV90IGNoYW5uZWxzLCB1bnNpZ25lZCBpbnB1dEZyZXEsIHVuc2lnbmVkIG91dHB1dEZyZXEpCisgICAgICAgIHNpemVfdCBjaGFubmVscywgdW5zaWduZWQgaW5wdXRGcmVxLCB1bnNpZ25lZCBvdXRwdXRGcmVxLAorICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6c3JjX3F1YWxpdHkgcXVhbGl0eSA9IGFuZHJvaWQ6OkF1ZGlvUmVzYW1wbGVyOjpEWU5fSElHSF9RVUFMSVRZKQogewogICAgIC8vIGNyZWF0ZSByZXNhbXBsZXIKICAgICB1c2luZyBSZXNhbXBsZXJUeXBlID0gYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXJEeW48ZmxvYXQsIGZsb2F0LCBmbG9hdD47CkBAIC0yNTYsNyArMjU3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNX0ZMT0FULAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZyZXEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OkRZTl9ISUdIX1FVQUxJVFkpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVhbGl0eSkpKTsKICAgICByZHluLT5zZXRTYW1wbGVSYXRlKGlucHV0RnJlcSk7CiAKICAgICAvLyBnZXQgZGVzaWduIHBhcmFtZXRlcnMKQEAgLTI2OCwxNyArMjY5LDIwIEBACiAgICAgY29uc3QgZG91YmxlIGF0dGVudWF0aW9uID0gcmR5bi0+Z2V0RmlsdGVyQXR0ZW51YXRpb24oKTsKICAgICBjb25zdCBkb3VibGUgc3RvcGJhbmREYiA9IHJkeW4tPmdldFN0b3BiYW5kQXR0ZW51YXRpb25EYigpOwogICAgIGNvbnN0IGRvdWJsZSBwYXNzYmFuZERiID0gcmR5bi0+Z2V0UGFzc2JhbmRSaXBwbGVEYigpOwotICAgIGNvbnN0IGRvdWJsZSBmcCA9IGZjciAtIHRidyAvIDI7Ci0gICAgY29uc3QgZG91YmxlIGZzID0gZmNyICsgdGJ3IC8gMjsKKyAgICBjb25zdCBkb3VibGUgZnAgPSBmY3IgLSB0YncgKiAwLjU7CisgICAgY29uc3QgZG91YmxlIGZzID0gZmNyICsgdGJ3ICogMC41OworICAgIGNvbnN0IGRvdWJsZSBpZGVhbGZzID0gaW5wdXRGcmVxIDw9IG91dHB1dEZyZXEKKyAgICAgICAgPyAwLjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXBzYW1wbGUKKyAgICAgICAgOiAwLjUgKiBvdXRwdXRGcmVxICAvIGlucHV0RnJlcTsgLy8gZG93bnNhbXBsZQogCi0gICAgcHJpbnRmKCJpbnB1dEZyZXE6JWQgb3V0cHV0RnJlcTolZCBkZXNpZ24iCisgICAgcHJpbnRmKCJpbnB1dEZyZXE6JWQgb3V0cHV0RnJlcTolZCBkZXNpZ24gcXVhbGl0eSAlZCIKICAgICAgICAgICAgICIgcGhhc2VzOiVkIGhhbGZMZW5ndGg6JWQiCi0gICAgICAgICAgICAiIGZjcjolbGYgZnA6JWxmIGZzOiVsZiB0Ync6JWxmIgorICAgICAgICAgICAgIiBmY3I6JWxmIGZwOiVsZiBmczolbGYgdGJ3OiVsZiBmY3JwOiVsZiIKICAgICAgICAgICAgICIgYXR0ZW51YXRpb246JWxmIHN0b3BSaXBwbGU6JS5sZiBwYXNzUmlwcGxlOiVsZiIKICAgICAgICAgICAgICJcbiIsCi0gICAgICAgICAgICBpbnB1dEZyZXEsIG91dHB1dEZyZXEsCisgICAgICAgICAgICBpbnB1dEZyZXEsIG91dHB1dEZyZXEsIHF1YWxpdHksCiAgICAgICAgICAgICBwaGFzZXMsIGhhbGZMZW5ndGgsCi0gICAgICAgICAgICBmY3IsIGZwLCBmcywgdGJ3LAorICAgICAgICAgICAgZmNyLCBmcCwgZnMsIHRidywgZmNyICogMTAwLiAvIGlkZWFsZnMsCiAgICAgICAgICAgICBhdHRlbnVhdGlvbiwgc3RvcGJhbmREYiwgcGFzc2JhbmREYik7CiAKICAgICAvLyB2ZXJpZnkgZGVzaWduIHBhcmFtZXRlcnMKQEAgLTU0MSw4ICs1NDUsMzYgQEAKICAgICB9CiB9CiAKLVRFU1QoYXVkaW9mbGluZ2VyX3Jlc2FtcGxlciwgZmlsdGVycmVzcG9uc2UpIHsKLSAgICBzdGQ6OnZlY3RvcjxpbnQ+IGluU2FtcGxlUmF0ZXN7CisvLyBTZWxlY3RlZCBkb3duc2FtcGxpbmcgcmVzcG9uc2VzIGZvciB2YXJpb3VzIGZyZXF1ZW5jaWVzIHJlbGF0aW5nIHRvIGhlYXJpbmcgYWlkLgorVEVTVChhdWRpb2ZsaW5nZXJfcmVzYW1wbGVyLCBkb3duc2FtcGxpbmdyZXNwb25zZSkgeworICAgIHN0YXRpYyBjb25zdGV4cHIgYW5kcm9pZDo6QXVkaW9SZXNhbXBsZXI6OnNyY19xdWFsaXR5IHF1YWxpdGllc1tdID0geworICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0xPV19RVUFMSVRZLAorICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX01FRF9RVUFMSVRZLAorICAgICAgICBhbmRyb2lkOjpBdWRpb1Jlc2FtcGxlcjo6RFlOX0hJR0hfUVVBTElUWSwKKyAgICB9OworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGluU2FtcGxlUmF0ZXNbXSA9IHsKKyAgICAgICAgMzIwMDAsCisgICAgICAgIDQ0MTAwLAorICAgICAgICA0ODAwMCwKKyAgICB9OworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IG91dFNhbXBsZVJhdGVzW10gPSB7CisgICAgICAgIDE2MDAwLAorICAgICAgICAyNDAwMCwKKyAgICB9OworCisgICAgZm9yIChhdXRvIHF1YWxpdHkgOiBxdWFsaXRpZXMpIHsKKyAgICAgICAgZm9yIChpbnQgb3V0U2FtcGxlUmF0ZSA6IG91dFNhbXBsZVJhdGVzKSB7CisgICAgICAgICAgICBmb3IgKGludCBpblNhbXBsZVJhdGUgOiBpblNhbXBsZVJhdGVzKSB7CisgICAgICAgICAgICAgICAgdGVzdEZpbHRlclJlc3BvbnNlKDIgLyogY2hhbm5lbHMgKi8sIGluU2FtcGxlUmF0ZSwgb3V0U2FtcGxlUmF0ZSwgcXVhbGl0eSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIEdlbmVyYWwgcmVzcG9uc2VzIGZvciB0eXBpY2FsIG91dHB1dCBkZXZpY2Ugc2NlbmFyaW9zIC0gNDQuMSwgNDgsIDk2IGtIegorLy8gKDQ4LCA5NiBhcmUgcGFydCBvZiB0aGUgc2FtZSByZXNhbXBsZXIgZ2VuZXJhdGlvbiBmYW1pbHkpLgorVEVTVChhdWRpb2ZsaW5nZXJfcmVzYW1wbGVyLCBnZW5lcmFscmVzcG9uc2UpIHsKKyAgICBzdGF0aWMgY29uc3RleHByIGludCBpblNhbXBsZVJhdGVzW10gPSB7CiAgICAgICAgIDgwMDAsCiAgICAgICAgIDExMDI1LAogICAgICAgICAxMjAwMCwKQEAgLTU1Nyw3ICs1ODksOCBAQAogICAgICAgICAxNzY0MDAsCiAgICAgICAgIDE5MjAwMCwKICAgICB9OwotICAgIHN0ZDo6dmVjdG9yPGludD4gb3V0U2FtcGxlUmF0ZXN7CisgICAgc3RhdGljIGNvbnN0ZXhwciBpbnQgb3V0U2FtcGxlUmF0ZXNbXSA9IHsKKyAgICAgICAgNDQxMDAsCiAgICAgICAgIDQ4MDAwLAogICAgICAgICA5NjAwMCwKICAgICB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliY3B1c3RhdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmNwdXN0YXRzL0FuZHJvaWQuYnAKaW5kZXggOGZjZDhhNC4uNmU4Y2ExZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliY3B1c3RhdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJjcHVzdGF0cy9BbmRyb2lkLmJwCkBAIC02LDYgKzYsMTQgQEAKICAgICAgICAgIlRocmVhZENwdVVzYWdlLmNwcCIsCiAgICAgXSwKIAorICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZGF0YXNvdXJjZS9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZGF0YXNvdXJjZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxOTFjMjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJkYXRhc291cmNlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2MyBAQAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmRhdGFzb3VyY2UiLAorCisgICAgc3JjczogWworICAgICAgICAiRGF0YVNvdXJjZUZhY3RvcnkuY3BwIiwKKyAgICAgICAgIkRhdGFVUklTb3VyY2UuY3BwIiwKKyAgICAgICAgIkZpbGVTb3VyY2UuY3BwIiwKKyAgICAgICAgIkhUVFBCYXNlLmNwcCIsCisgICAgICAgICJNZWRpYUhUVFAuY3BwIiwKKyAgICAgICAgIk51Q2FjaGVkU291cmNlMi5jcHAiLAorICAgIF0sCisKKyAgICBhaWRsOiB7CisgICAgICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJhaWRsIl0sCisgICAgICAgIGV4cG9ydF9haWRsX2hlYWRlcnM6IHRydWUsCisgICAgfSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJkbCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJjX21hbGxvY19kZWJ1Z19iYWNrdHJhY2UiLCAgLy8gZm9yIG1lbW9yeSBoZWFwIGFuYWx5c2lzCisgICAgICAgICJsaWJtZWRpYV9taWRpaW93cmFwcGVyIiwKKyAgICBdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZGF0YXNvdXJjZS9EYXRhU291cmNlRmFjdG9yeS5jcHAgYi9tZWRpYS9saWJkYXRhc291cmNlL0RhdGFTb3VyY2VGYWN0b3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjZhMDhjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZGF0YXNvdXJjZS9EYXRhU291cmNlRmFjdG9yeS5jcHAKQEAgLTAsMCArMSwxMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJEYXRhU291cmNlIgorCisKKyNpbmNsdWRlIDxkYXRhc291cmNlL0RhdGFTb3VyY2VGYWN0b3J5Lmg+CisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9EYXRhVVJJU291cmNlLmg+CisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9IVFRQQmFzZS5oPgorI2luY2x1ZGUgPGRhdGFzb3VyY2UvRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPGRhdGFzb3VyY2UvTWVkaWFIVFRQLmg+CisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9OdUNhY2hlZFNvdXJjZTIuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBDb25uZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK3NwPERhdGFTb3VyY2VGYWN0b3J5PiBEYXRhU291cmNlRmFjdG9yeTo6c0luc3RhbmNlOworLy8gc3RhdGljCitNdXRleCBEYXRhU291cmNlRmFjdG9yeTo6c0luc3RhbmNlTG9jazsKKworLy8gc3RhdGljCitzcDxEYXRhU291cmNlRmFjdG9yeT4gRGF0YVNvdXJjZUZhY3Rvcnk6OmdldEluc3RhbmNlKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKHNJbnN0YW5jZUxvY2spOworICAgIGlmICghc0luc3RhbmNlKSB7CisgICAgICAgIHNJbnN0YW5jZSA9IG5ldyBEYXRhU291cmNlRmFjdG9yeSgpOworICAgIH0KKyAgICByZXR1cm4gc0luc3RhbmNlOworfQorCitzcDxEYXRhU291cmNlPiBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlRnJvbVVSSSgKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICBTdHJpbmc4ICpjb250ZW50VHlwZSwKKyAgICAgICAgSFRUUEJhc2UgKmh0dHBTb3VyY2UpIHsKKyAgICBpZiAoY29udGVudFR5cGUgIT0gTlVMTCkgeworICAgICAgICAqY29udGVudFR5cGUgPSAiIjsKKyAgICB9CisKKyAgICBzcDxEYXRhU291cmNlPiBzb3VyY2U7CisgICAgaWYgKCFzdHJuY2FzZWNtcCgiZmlsZTovLyIsIHVyaSwgNykpIHsKKyAgICAgICAgc291cmNlID0gQ3JlYXRlRmlsZVNvdXJjZSh1cmkgKyA3KTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVyaSwgNykgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIHVyaSwgOCkpIHsKKyAgICAgICAgaWYgKGh0dHBTZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIGh0dHAgc2VydmljZSEiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgc3A8SFRUUEJhc2U+IG1lZGlhSFRUUCA9IGh0dHBTb3VyY2U7CisgICAgICAgIGlmIChtZWRpYUhUVFAgPT0gTlVMTCkgeworICAgICAgICAgICAgbWVkaWFIVFRQID0gc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4oQ3JlYXRlTWVkaWFIVFRQKGh0dHBTZXJ2aWNlKS5nZXQoKSk7CisgICAgICAgIH0KKworICAgICAgICBTdHJpbmc4IGNhY2hlQ29uZmlnOworICAgICAgICBib29sIGRpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcmsgPSBmYWxzZTsKKyAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbm9uQ2FjaGVTcGVjaWZpY0hlYWRlcnM7CisgICAgICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKKyAgICAgICAgICAgIG5vbkNhY2hlU3BlY2lmaWNIZWFkZXJzID0gKmhlYWRlcnM7CisgICAgICAgICAgICBOdUNhY2hlZFNvdXJjZTI6OlJlbW92ZUNhY2hlU3BlY2lmaWNIZWFkZXJzKAorICAgICAgICAgICAgICAgICAgICAmbm9uQ2FjaGVTcGVjaWZpY0hlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICZjYWNoZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgJmRpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcmspOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1lZGlhSFRUUC0+Y29ubmVjdCh1cmksICZub25DYWNoZVNwZWNpZmljSGVhZGVycykgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29ubmVjdCBodHRwIHNvdXJjZSEiKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICpjb250ZW50VHlwZSA9IG1lZGlhSFRUUC0+Z2V0TUlNRVR5cGUoKTsKKyAgICAgICAgfQorCisgICAgICAgIHNvdXJjZSA9IE51Q2FjaGVkU291cmNlMjo6Q3JlYXRlKAorICAgICAgICAgICAgICAgIG1lZGlhSFRUUCwKKyAgICAgICAgICAgICAgICBjYWNoZUNvbmZpZy5pc0VtcHR5KCkgPyBOVUxMIDogY2FjaGVDb25maWcuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyayk7CisgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAoImRhdGE6IiwgdXJpLCA1KSkgeworICAgICAgICBzb3VyY2UgPSBEYXRhVVJJU291cmNlOjpDcmVhdGUodXJpKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBBc3N1bWUgaXQncyBhIGZpbGVuYW1lLgorICAgICAgICBzb3VyY2UgPSBDcmVhdGVGaWxlU291cmNlKHVyaSk7CisgICAgfQorCisgICAgaWYgKHNvdXJjZSA9PSBOVUxMIHx8IHNvdXJjZS0+aW5pdENoZWNrKCkgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIHNvdXJjZTsKK30KKworc3A8RGF0YVNvdXJjZT4gRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21GZChpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgeworICAgIHNwPEZpbGVTb3VyY2U+IHNvdXJjZSA9IG5ldyBGaWxlU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCk7CisgICAgcmV0dXJuIHNvdXJjZS0+aW5pdENoZWNrKCkgIT0gT0sgPyBudWxscHRyIDogc291cmNlOworfQorCitzcDxEYXRhU291cmNlPiBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlTWVkaWFIVFRQKGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSkgeworICAgIGlmIChodHRwU2VydmljZSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IGNvbm4gPSBodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCk7CisgICAgaWYgKGNvbm4gPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG1ha2UgaHR0cCBjb25uZWN0aW9uIGZyb20gaHR0cCBzZXJ2aWNlISIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gbmV3IE1lZGlhSFRUUChjb25uKTsKKyAgICB9Cit9CisKK3NwPERhdGFTb3VyY2U+IERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVGaWxlU291cmNlKGNvbnN0IGNoYXIgKnVyaSkgeworICAgIHJldHVybiBuZXcgRmlsZVNvdXJjZSh1cmkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZGF0YXNvdXJjZS9EYXRhVVJJU291cmNlLmNwcCBiL21lZGlhL2xpYmRhdGFzb3VyY2UvRGF0YVVSSVNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE2ZjNkMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmRhdGFzb3VyY2UvRGF0YVVSSVNvdXJjZS5jcHAKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGRhdGFzb3VyY2UvRGF0YVVSSVNvdXJjZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK3NwPERhdGFVUklTb3VyY2U+IERhdGFVUklTb3VyY2U6OkNyZWF0ZShjb25zdCBjaGFyICp1cmkpIHsKKyAgICBpZiAoc3RybmNhc2VjbXAoImRhdGE6IiwgdXJpLCA1KSkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBjb25zdCBjaGFyICpjb21tYVBvcyA9IHN0cnJjaHIodXJpLCAnLCcpOworCisgICAgaWYgKGNvbW1hUG9zID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOworCisgICAgQVN0cmluZyB0bXAoJnVyaVs1XSwgY29tbWFQb3MgLSAmdXJpWzVdKTsKKworICAgIGlmICh0bXAuZW5kc1dpdGgoIjtiYXNlNjQiKSkgeworCisgICAgICAgIC8vIHN0cmlwIGFsbCBDUiBhbmQgTEYgY2hhcmFjdGVycy4KKyAgICAgICAgY29uc3QgY2hhciAqc3JjID0gY29tbWFQb3MrMTsKKyAgICAgICAgaW50IGxlbiA9IHN0cmxlbihzcmMpICsgMTsKKyAgICAgICAgY2hhciAqY2xlYW5zZWQgPSAoY2hhciAqKSBtYWxsb2MobGVuKTsKKyAgICAgICAgaWYgKGNsZWFuc2VkID09IE5VTEwpIHJldHVybiBOVUxMOworICAgICAgICBjaGFyICprZWVwaW5nID0gY2xlYW5zZWQ7CisgICAgICAgIGludCBsZWZ0ID0gbGVuOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbiA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciBjID0gKnNyYysrOworICAgICAgICAgICAgaWYgKGMgPT0gJ1xyJyB8fCBjID09ICdcbicpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICprZWVwaW5nKysgPSBjOworICAgICAgICAgICAgbGVmdC0tOworICAgICAgICB9CisgICAgICAgIG1lbXNldChrZWVwaW5nLCAwLCBsZWZ0KTsKKworICAgICAgICBBU3RyaW5nIGVuY29kZWQoY2xlYW5zZWQpOworICAgICAgICBmcmVlKGNsZWFuc2VkKTsKKworICAgICAgICBidWZmZXIgPSBkZWNvZGVCYXNlNjQoZW5jb2RlZCk7CisKKyAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiTWFsZm9ybWVkIGJhc2U2NCBlbmNvZGVkIGNvbnRlbnQgZm91bmQuIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisjaWYgMAorICAgICAgICBzaXplX3QgZGF0YUxlbiA9IHN0cmxlbih1cmkpIC0gdG1wLnNpemUoKSAtIDY7CisgICAgICAgIGJ1ZmZlciA9IG5ldyBBQnVmZmVyKGRhdGFMZW4pOworICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGNvbW1hUG9zICsgMSwgZGF0YUxlbik7CisKKyAgICAgICAgLy8gdW5lc2NhcGUKKyNlbHNlCisgICAgICAgIC8vIE1lZGlhUGxheWVyIGRvZXNuJ3QgY2FyZSBmb3IgdGhpcyByaWdodCBub3cgYXMgd2UgZG9uJ3QKKyAgICAgICAgLy8gcGxheSBhbnkgdGV4dC1iYXNlZCBtZWRpYS4KKyAgICAgICAgcmV0dXJuIE5VTEw7CisjZW5kaWYKKyAgICB9CisKKyAgICAvLyBXZSBkb24ndCByZWFsbHkgY2FyZSBhYm91dCBjaGFyc2V0IG9yIG1pbWUgdHlwZS4KKworICAgIHJldHVybiBuZXcgRGF0YVVSSVNvdXJjZShidWZmZXIpOworfQorCitEYXRhVVJJU291cmNlOjpEYXRhVVJJU291cmNlKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpCisgICAgOiBtQnVmZmVyKGJ1ZmZlcikgeworfQorCitEYXRhVVJJU291cmNlOjp+RGF0YVVSSVNvdXJjZSgpIHsKK30KKworc3RhdHVzX3QgRGF0YVVSSVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgeworICAgIHJldHVybiBPSzsKK30KKworc3NpemVfdCBEYXRhVVJJU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKChvZmZzZXQgPCAwKSB8fCAob2Zmc2V0ID49IChvZmY2NF90KW1CdWZmZXItPnNpemUoKSkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgc2l6ZV90IGNvcHkgPSBtQnVmZmVyLT5zaXplKCkgLSBvZmZzZXQ7CisgICAgaWYgKGNvcHkgPiBzaXplKSB7CisgICAgICAgIGNvcHkgPSBzaXplOworICAgIH0KKworICAgIG1lbWNweShkYXRhLCBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIGNvcHkpOworCisgICAgcmV0dXJuIGNvcHk7Cit9CisKK3N0YXR1c190IERhdGFVUklTb3VyY2U6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgICpzaXplID0gbUJ1ZmZlci0+c2l6ZSgpOworCisgICAgcmV0dXJuIE9LOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJkYXRhc291cmNlL0ZpbGVTb3VyY2UuY3BwIGIvbWVkaWEvbGliZGF0YXNvdXJjZS9GaWxlU291cmNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmY3ZGRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZGF0YXNvdXJjZS9GaWxlU291cmNlLmNwcApAQCAtMCwwICsxLDE0MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRmlsZVNvdXJjZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGRhdGFzb3VyY2UvRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRm91bmRhdGlvblV0aWxzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmY250bC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0ZpbGVTb3VyY2U6OkZpbGVTb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpCisgICAgOiBtRmQoLTEpLAorICAgICAgbU9mZnNldCgwKSwKKyAgICAgIG1MZW5ndGgoLTEpLAorICAgICAgbU5hbWUoIjxudWxsPiIpIHsKKworICAgIGlmIChmaWxlbmFtZSkgeworICAgICAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgiRmlsZVNvdXJjZSglcykiLCBmaWxlbmFtZSk7CisgICAgfQorICAgIEFMT0dWKCIlcyIsIGZpbGVuYW1lKTsKKyAgICBtRmQgPSBvcGVuKGZpbGVuYW1lLCBPX0xBUkdFRklMRSB8IE9fUkRPTkxZKTsKKworICAgIGlmIChtRmQgPj0gMCkgeworICAgICAgICBtTGVuZ3RoID0gbHNlZWs2NChtRmQsIDAsIFNFRUtfRU5EKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIG9wZW4gZmlsZSAnJXMnLiAoJXMpIiwgZmlsZW5hbWUsIHN0cmVycm9yKGVycm5vKSk7CisgICAgfQorfQorCitGaWxlU291cmNlOjpGaWxlU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQorICAgIDogbUZkKGZkKSwKKyAgICAgIG1PZmZzZXQob2Zmc2V0KSwKKyAgICAgIG1MZW5ndGgobGVuZ3RoKSwKKyAgICAgIG1OYW1lKCI8bnVsbD4iKSB7CisgICAgQUxPR1YoImZkPSVkICglcyksIG9mZnNldD0lbGxkLCBsZW5ndGg9JWxsZCIsCisgICAgICAgICAgICBmZCwgbmFtZUZvckZkKGZkKS5jX3N0cigpLCAobG9uZyBsb25nKSBvZmZzZXQsIChsb25nIGxvbmcpIGxlbmd0aCk7CisKKyAgICBpZiAobU9mZnNldCA8IDApIHsKKyAgICAgICAgbU9mZnNldCA9IDA7CisgICAgfQorICAgIGlmIChtTGVuZ3RoIDwgMCkgeworICAgICAgICBtTGVuZ3RoID0gMDsKKyAgICB9CisgICAgaWYgKG1MZW5ndGggPiBJTlQ2NF9NQVggLSBtT2Zmc2V0KSB7CisgICAgICAgIG1MZW5ndGggPSBJTlQ2NF9NQVggLSBtT2Zmc2V0OworICAgIH0KKyAgICBzdHJ1Y3Qgc3RhdCBzOworICAgIGlmIChmc3RhdChmZCwgJnMpID09IDApIHsKKyAgICAgICAgaWYgKG1PZmZzZXQgPiBzLnN0X3NpemUpIHsKKyAgICAgICAgICAgIG1PZmZzZXQgPSBzLnN0X3NpemU7CisgICAgICAgICAgICBtTGVuZ3RoID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAobU9mZnNldCArIG1MZW5ndGggPiBzLnN0X3NpemUpIHsKKyAgICAgICAgICAgIG1MZW5ndGggPSBzLnN0X3NpemUgLSBtT2Zmc2V0OworICAgICAgICB9CisgICAgfQorICAgIGlmIChtT2Zmc2V0ICE9IG9mZnNldCB8fCBtTGVuZ3RoICE9IGxlbmd0aCkgeworICAgICAgICBBTE9HVygib2Zmc2V0L2xlbmd0aCBhZGp1c3RlZCBmcm9tICVsbGQvJWxsZCB0byAlbGxkLyVsbGQiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG9mZnNldCwgKGxvbmcgbG9uZykgbGVuZ3RoLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIG1PZmZzZXQsIChsb25nIGxvbmcpIG1MZW5ndGgpOworICAgIH0KKworICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KAorICAgICAgICAgICAgIkZpbGVTb3VyY2UoZmQoJXMpLCAlbGxkLCAlbGxkKSIsCisgICAgICAgICAgICBuYW1lRm9yRmQoZmQpLmNfc3RyKCksCisgICAgICAgICAgICAobG9uZyBsb25nKSBtT2Zmc2V0LAorICAgICAgICAgICAgKGxvbmcgbG9uZykgbUxlbmd0aCk7CisKK30KKworRmlsZVNvdXJjZTo6fkZpbGVTb3VyY2UoKSB7CisgICAgaWYgKG1GZCA+PSAwKSB7CisgICAgICAgIDo6Y2xvc2UobUZkKTsKKyAgICAgICAgbUZkID0gLTE7CisgICAgfQorfQorCitzdGF0dXNfdCBGaWxlU291cmNlOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1GZCA+PSAwID8gT0sgOiBOT19JTklUOworfQorCitzc2l6ZV90IEZpbGVTb3VyY2U6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUZkIDwgMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgIGlmIChtTGVuZ3RoID49IDApIHsKKyAgICAgICAgaWYgKG9mZnNldCA+PSBtTGVuZ3RoKSB7CisgICAgICAgICAgICByZXR1cm4gMDsgIC8vIHJlYWQgYmV5b25kIEVPRi4KKyAgICAgICAgfQorICAgICAgICB1aW50NjRfdCBudW1BdmFpbGFibGUgPSBtTGVuZ3RoIC0gb2Zmc2V0OworICAgICAgICBpZiAoKHVpbnQ2NF90KXNpemUgPiBudW1BdmFpbGFibGUpIHsKKyAgICAgICAgICAgIHNpemUgPSBudW1BdmFpbGFibGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlYWRBdF9sKG9mZnNldCwgZGF0YSwgc2l6ZSk7Cit9CisKK3NzaXplX3QgRmlsZVNvdXJjZTo6cmVhZEF0X2wob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgb2ZmNjRfdCByZXN1bHQgPSBsc2VlazY0KG1GZCwgb2Zmc2V0ICsgbU9mZnNldCwgU0VFS19TRVQpOworICAgIGlmIChyZXN1bHQgPT0gLTEpIHsKKyAgICAgICAgQUxPR0UoInNlZWsgdG8gJWxsZCBmYWlsZWQiLCAobG9uZyBsb25nKShvZmZzZXQgKyBtT2Zmc2V0KSk7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiA6OnJlYWQobUZkLCBkYXRhLCBzaXplKTsKK30KKworc3RhdHVzX3QgRmlsZVNvdXJjZTo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChtRmQgPCAwKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgICpzaXplID0gbUxlbmd0aDsKKworICAgIHJldHVybiBPSzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmRhdGFzb3VyY2UvSFRUUEJhc2UuY3BwIGIvbWVkaWEvbGliZGF0YXNvdXJjZS9IVFRQQmFzZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYyOWM0OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmRhdGFzb3VyY2UvSFRUUEJhc2UuY3BwCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJIVFRQQmFzZSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGRhdGFzb3VyY2UvSFRUUEJhc2UuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGN1dGlscy9xdGFndWlkLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworSFRUUEJhc2U6OkhUVFBCYXNlKCkKKyAgICA6IG1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXMoMCksCisgICAgICBtVG90YWxUcmFuc2ZlclRpbWVVcygwKSwKKyAgICAgIG1Ub3RhbFRyYW5zZmVyQnl0ZXMoMCksCisgICAgICBtTWF4QmFuZHdpZHRoSGlzdG9yeUl0ZW1zKDEwMCksCisgICAgICBtUHJldkJhbmR3aWR0aE1lYXN1cmVUaW1lVXMoMCksCisgICAgICBtUHJldkVzdGltYXRlZEJhbmRXaWR0aEticHMoMCksCisgICAgICBtQmFuZFdpZHRoQ29sbGVjdEZyZXFNcyg1MDAwKSB7CisgICAgbU5hbWUgPSBTdHJpbmc4KCJIVFRQQmFzZSg8ZGlzY29ubmVjdGVkPikiKTsKK30KKwordm9pZCBIVFRQQmFzZTo6YWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQoCisgICAgICAgIHNpemVfdCBudW1CeXRlcywgaW50NjRfdCBkZWxheVVzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIEJhbmR3aWR0aEVudHJ5IGVudHJ5OworICAgIGVudHJ5Lm1EZWxheVVzID0gZGVsYXlVczsKKyAgICBlbnRyeS5tTnVtQnl0ZXMgPSBudW1CeXRlczsKKyAgICBtVG90YWxUcmFuc2ZlclRpbWVVcyArPSBkZWxheVVzOworICAgIG1Ub3RhbFRyYW5zZmVyQnl0ZXMgKz0gbnVtQnl0ZXM7CisKKyAgICBtQmFuZHdpZHRoSGlzdG9yeS5wdXNoX2JhY2soZW50cnkpOworICAgIGlmICgrK21OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXMgPiBtTWF4QmFuZHdpZHRoSGlzdG9yeUl0ZW1zKSB7CisgICAgICAgIEJhbmR3aWR0aEVudHJ5ICplbnRyeSA9ICYqbUJhbmR3aWR0aEhpc3RvcnkuYmVnaW4oKTsKKyAgICAgICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMgLT0gZW50cnktPm1EZWxheVVzOworICAgICAgICBtVG90YWxUcmFuc2ZlckJ5dGVzIC09IGVudHJ5LT5tTnVtQnl0ZXM7CisgICAgICAgIG1CYW5kd2lkdGhIaXN0b3J5LmVyYXNlKG1CYW5kd2lkdGhIaXN0b3J5LmJlZ2luKCkpOworICAgICAgICAtLW1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXM7CisKKyAgICAgICAgaW50NjRfdCB0aW1lTm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICBpZiAodGltZU5vd1VzIC0gbVByZXZCYW5kd2lkdGhNZWFzdXJlVGltZVVzID49CisgICAgICAgICAgICAgICAgbUJhbmRXaWR0aENvbGxlY3RGcmVxTXMgKiAxMDAwTEwpIHsKKworICAgICAgICAgICAgaWYgKG1QcmV2QmFuZHdpZHRoTWVhc3VyZVRpbWVVcyAhPSAwKSB7CisgICAgICAgICAgICAgICAgbVByZXZFc3RpbWF0ZWRCYW5kV2lkdGhLYnBzID0KKyAgICAgICAgICAgICAgICAgICAgKG1Ub3RhbFRyYW5zZmVyQnl0ZXMgKiA4RTMgLyBtVG90YWxUcmFuc2ZlclRpbWVVcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUHJldkJhbmR3aWR0aE1lYXN1cmVUaW1lVXMgPSB0aW1lTm93VXM7CisgICAgICAgIH0KKyAgICB9CisKK30KKworYm9vbCBIVFRQQmFzZTo6ZXN0aW1hdGVCYW5kd2lkdGgoaW50MzJfdCAqYmFuZHdpZHRoX2JwcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICAvLyBEbyBub3QgZG8gYmFuZHdpZHRoIGVzdGltYXRpb24gaWYgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggc2FtcGxlcywgb3IKKyAgICAvLyB0b3RhbCBieXRlcyBkb3dubG9hZCBhcmUgdG9vIHNtYWxsICg8NjRLKS4KKyAgICAvLyBCYW5kd2lkdGggZXN0aW1hdGlvbiBmcm9tIHRoZXNlIHNhbXBsZXMgY2FuIG9mdGVuIHNob290IHVwIGFuZCBjYXVzZQorICAgIC8vIHVud2FudGVkIGJ3IGFkYXB0aW9uIGJlaGF2aW9ycy4KKyAgICBpZiAobU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtcyA8IDIgfHwgbVRvdGFsVHJhbnNmZXJCeXRlcyA8IDY1NTM2KSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAqYmFuZHdpZHRoX2JwcyA9ICgoZG91YmxlKW1Ub3RhbFRyYW5zZmVyQnl0ZXMgKiA4RTYgLyBtVG90YWxUcmFuc2ZlclRpbWVVcyk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgSFRUUEJhc2U6OmdldEVzdGltYXRlZEJhbmR3aWR0aEticHMoaW50MzJfdCAqa2JwcykgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgKmticHMgPSBtUHJldkVzdGltYXRlZEJhbmRXaWR0aEticHM7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIVFRQQmFzZTo6c2V0QmFuZHdpZHRoU3RhdENvbGxlY3RGcmVxKGludDMyX3QgZnJlcU1zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIGlmIChmcmVxTXMgPCBrTWluQmFuZHdpZHRoQ29sbGVjdEZyZXFNcworICAgICAgICAgICAgfHwgZnJlcU1zID4ga01heEJhbmR3aWR0aENvbGxlY3RGcmVxTXMpIHsKKworICAgICAgICBBTE9HRSgiZnJlcXVlbmN5ICglZCBtcykgaXMgb3V0IG9mIHJhbmdlIFsxMDAwLCA2MDAwMF0iLCBmcmVxTXMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEFMT0dJKCJmcmVxdWVuY3kgc2V0IHRvICVkIG1zIiwgZnJlcU1zKTsKKyAgICBtQmFuZFdpZHRoQ29sbGVjdEZyZXFNcyA9IGZyZXFNczsKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgSFRUUEJhc2U6OnNldEJhbmR3aWR0aEhpc3RvcnlTaXplKHNpemVfdCBudW1IaXN0b3J5SXRlbXMpIHsKKyAgICBtTWF4QmFuZHdpZHRoSGlzdG9yeUl0ZW1zID0gbnVtSGlzdG9yeUl0ZW1zOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZGF0YXNvdXJjZS9NZWRpYUhUVFAuY3BwIGIvbWVkaWEvbGliZGF0YXNvdXJjZS9NZWRpYUhUVFAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4YzFjZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJkYXRhc291cmNlL01lZGlhSFRUUC5jcHAKQEAgLTAsMCArMSwxODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1lZGlhSFRUUCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGRhdGFzb3VyY2UvTWVkaWFIVFRQLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZvdW5kYXRpb25VdGlscy5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK01lZGlhSFRUUDo6TWVkaWFIVFRQKGNvbnN0IHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKQorICAgIDogbUluaXRDaGVjaygoY29ubiAhPSBOVUxMKSA/IE9LIDogTk9fSU5JVCksCisgICAgICBtSFRUUENvbm5lY3Rpb24oY29ubiksCisgICAgICBtQ2FjaGVkU2l6ZVZhbGlkKGZhbHNlKSwKKyAgICAgIG1DYWNoZWRTaXplKDBsbCkgeworfQorCitNZWRpYUhUVFA6On5NZWRpYUhUVFAoKSB7Cit9CisKK3N0YXR1c190IE1lZGlhSFRUUDo6Y29ubmVjdCgKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKKyAgICAgICAgb2ZmNjRfdCAvKiBvZmZzZXQgKi8pIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBleHRIZWFkZXJzOworICAgIGlmIChoZWFkZXJzICE9IE5VTEwpIHsKKyAgICAgICAgZXh0SGVhZGVycyA9ICpoZWFkZXJzOworICAgIH0KKworICAgIGlmIChleHRIZWFkZXJzLmluZGV4T2ZLZXkoU3RyaW5nOCgiVXNlci1BZ2VudCIpKSA8IDApIHsKKyAgICAgICAgZXh0SGVhZGVycy5hZGQoU3RyaW5nOCgiVXNlci1BZ2VudCIpLCBTdHJpbmc4KE1ha2VVc2VyQWdlbnQoKS5jX3N0cigpKSk7CisgICAgfQorCisgICAgbUxhc3RVUkkgPSB1cmk7CisgICAgLy8gcmVjb25uZWN0KCkgY2FsbHMgd2l0aCB1cmkgPT0gb2xkIG1MYXN0VVJJLmNfc3RyKCksIHdoaWNoIGdldHMgemFwcGVkCisgICAgLy8gYXMgcGFydCBvZiB0aGUgYWJvdmUgYXNzaWdubWVudC4gRW5zdXJlIG5vIGFjY2lkZW50YWwgbGF0ZXIgdXNlLgorICAgIHVyaSA9IE5VTEw7CisKKyAgICBib29sIHN1Y2Nlc3MgPSBtSFRUUENvbm5lY3Rpb24tPmNvbm5lY3QobUxhc3RVUkkuY19zdHIoKSwgJmV4dEhlYWRlcnMpOworCisgICAgbUxhc3RIZWFkZXJzID0gZXh0SGVhZGVyczsKKworICAgIG1DYWNoZWRTaXplVmFsaWQgPSBmYWxzZTsKKworICAgIGlmIChzdWNjZXNzKSB7CisgICAgICAgIEFTdHJpbmcgc2FuaXRpemVkID0gdXJpRGVidWdTdHJpbmcobUxhc3RVUkkpOworICAgICAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgiTWVkaWFIVFRQKCVzKSIsIHNhbml0aXplZC5jX3N0cigpKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3VjY2VzcyA/IE9LIDogVU5LTk9XTl9FUlJPUjsKK30KKwordm9pZCBNZWRpYUhUVFA6OmNsb3NlKCkgeworICAgIGRpc2Nvbm5lY3QoKTsKK30KKwordm9pZCBNZWRpYUhUVFA6OmRpc2Nvbm5lY3QoKSB7CisgICAgbU5hbWUgPSBTdHJpbmc4KCJNZWRpYUhUVFAoPGRpc2Nvbm5lY3RlZD4pIik7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1IVFRQQ29ubmVjdGlvbi0+ZGlzY29ubmVjdCgpOworfQorCitzdGF0dXNfdCBNZWRpYUhUVFA6OmluaXRDaGVjaygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUluaXRDaGVjazsKK30KKworc3NpemVfdCBNZWRpYUhUVFA6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICBpbnQ2NF90IHN0YXJ0VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKworICAgIHNpemVfdCBudW1CeXRlc1JlYWQgPSAwOworICAgIHdoaWxlIChudW1CeXRlc1JlYWQgPCBzaXplKSB7CisgICAgICAgIHNpemVfdCBjb3B5ID0gc2l6ZSAtIG51bUJ5dGVzUmVhZDsKKworICAgICAgICBpZiAoY29weSA+IDY0ICogMTAyNCkgeworICAgICAgICAgICAgLy8gbGltaXQgdGhlIGJ1ZmZlciBzaXplcyB0cmFuc2ZlcnJlZCBhY3Jvc3MgYmluZGVyIGJvdW5kYXJpZXMKKyAgICAgICAgICAgIC8vIHRvIGF2b2lkIHNwdXJpb3VzIHRyYW5zYWN0aW9uIGZhaWx1cmVzLgorICAgICAgICAgICAgY29weSA9IDY0ICogMTAyNDsKKyAgICAgICAgfQorCisgICAgICAgIHNzaXplX3QgbiA9IG1IVFRQQ29ubmVjdGlvbi0+cmVhZEF0KAorICAgICAgICAgICAgICAgIG9mZnNldCArIG51bUJ5dGVzUmVhZCwgKHVpbnQ4X3QgKilkYXRhICsgbnVtQnl0ZXNSZWFkLCBjb3B5KTsKKworICAgICAgICBpZiAobiA8IDApIHsKKyAgICAgICAgICAgIHJldHVybiBuOworICAgICAgICB9IGVsc2UgaWYgKG4gPT0gMCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBudW1CeXRlc1JlYWQgKz0gbjsKKyAgICB9CisKKyAgICBpbnQ2NF90IGRlbGF5VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpIC0gc3RhcnRUaW1lVXM7CisKKyAgICBhZGRCYW5kd2lkdGhNZWFzdXJlbWVudChudW1CeXRlc1JlYWQsIGRlbGF5VXMpOworCisgICAgcmV0dXJuIG51bUJ5dGVzUmVhZDsKK30KKworc3RhdHVzX3QgTWVkaWFIVFRQOjpnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gbUluaXRDaGVjazsKKyAgICB9CisKKyAgICAvLyBDYWNoaW5nIHRoZSByZXR1cm5lZCBzaXplIHNvIHRoYXQgaXQgc3RheXMgdmFsaWQgZXZlbiBhZnRlciBhCisgICAgLy8gZGlzY29ubmVjdC4gTnVDYWNoZWRTb3VyY2UyIHJlbGllcyBvbiB0aGlzLgorCisgICAgaWYgKCFtQ2FjaGVkU2l6ZVZhbGlkKSB7CisgICAgICAgIG1DYWNoZWRTaXplID0gbUhUVFBDb25uZWN0aW9uLT5nZXRTaXplKCk7CisgICAgICAgIG1DYWNoZWRTaXplVmFsaWQgPSB0cnVlOworICAgIH0KKworICAgICpzaXplID0gbUNhY2hlZFNpemU7CisKKyAgICByZXR1cm4gKnNpemUgPCAwID8gKnNpemUgOiBzdGF0aWNfY2FzdDxzdGF0dXNfdD4oT0spOworfQorCit1aW50MzJfdCBNZWRpYUhUVFA6OmZsYWdzKCkgeworICAgIHJldHVybiBrV2FudHNQcmVmZXRjaGluZyB8IGtJc0hUVFBCYXNlZFNvdXJjZTsKK30KKworc3RhdHVzX3QgTWVkaWFIVFRQOjpyZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCkgeworICAgIHJldHVybiBjb25uZWN0KG1MYXN0VVJJLmNfc3RyKCksICZtTGFzdEhlYWRlcnMsIG9mZnNldCk7Cit9CisKKworU3RyaW5nOCBNZWRpYUhUVFA6OmdldFVyaSgpIHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gU3RyaW5nODo6ZW1wdHkoKTsKKyAgICB9CisKKyAgICBTdHJpbmc4IHVyaTsKKyAgICBpZiAoT0sgPT0gbUhUVFBDb25uZWN0aW9uLT5nZXRVcmkoJnVyaSkpIHsKKyAgICAgICAgcmV0dXJuIHVyaTsKKyAgICB9CisgICAgcmV0dXJuIFN0cmluZzgobUxhc3RVUkkuY19zdHIoKSk7Cit9CisKK1N0cmluZzggTWVkaWFIVFRQOjpnZXRNSU1FVHlwZSgpIGNvbnN0IHsKKyAgICBpZiAobUluaXRDaGVjayAhPSBPSykgeworICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7CisgICAgfQorCisgICAgU3RyaW5nOCBtaW1lVHlwZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtSFRUUENvbm5lY3Rpb24tPmdldE1JTUVUeXBlKCZtaW1lVHlwZSk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICB9CisKKyAgICByZXR1cm4gbWltZVR5cGU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJkYXRhc291cmNlL051Q2FjaGVkU291cmNlMi5jcHAgYi9tZWRpYS9saWJkYXRhc291cmNlL051Q2FjaGVkU291cmNlMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ2M2ZmYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmRhdGFzb3VyY2UvTnVDYWNoZWRTb3VyY2UyLmNwcApAQCAtMCwwICsxLDc4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk51Q2FjaGVkU291cmNlMiIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGRhdGFzb3VyY2UvTnVDYWNoZWRTb3VyY2UyLmg+CisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9IVFRQQmFzZS5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBQYWdlQ2FjaGUgeworICAgIGV4cGxpY2l0IFBhZ2VDYWNoZShzaXplX3QgcGFnZVNpemUpOworICAgIH5QYWdlQ2FjaGUoKTsKKworICAgIHN0cnVjdCBQYWdlIHsKKyAgICAgICAgdm9pZCAqbURhdGE7CisgICAgICAgIHNpemVfdCBtU2l6ZTsKKyAgICB9OworCisgICAgUGFnZSAqYWNxdWlyZVBhZ2UoKTsKKyAgICB2b2lkIHJlbGVhc2VQYWdlKFBhZ2UgKnBhZ2UpOworCisgICAgdm9pZCBhcHBlbmRQYWdlKFBhZ2UgKnBhZ2UpOworICAgIHNpemVfdCByZWxlYXNlRnJvbVN0YXJ0KHNpemVfdCBtYXhCeXRlcyk7CisKKyAgICBzaXplX3QgdG90YWxTaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRvdGFsU2l6ZTsKKyAgICB9CisKKyAgICB2b2lkIGNvcHkoc2l6ZV90IGZyb20sIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworcHJpdmF0ZToKKyAgICBzaXplX3QgbVBhZ2VTaXplOworICAgIHNpemVfdCBtVG90YWxTaXplOworCisgICAgTGlzdDxQYWdlICo+IG1BY3RpdmVQYWdlczsKKyAgICBMaXN0PFBhZ2UgKj4gbUZyZWVQYWdlczsKKworICAgIHZvaWQgZnJlZVBhZ2VzKExpc3Q8UGFnZSAqPiAqbGlzdCk7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQYWdlQ2FjaGUpOworfTsKKworUGFnZUNhY2hlOjpQYWdlQ2FjaGUoc2l6ZV90IHBhZ2VTaXplKQorICAgIDogbVBhZ2VTaXplKHBhZ2VTaXplKSwKKyAgICAgIG1Ub3RhbFNpemUoMCkgeworfQorCitQYWdlQ2FjaGU6On5QYWdlQ2FjaGUoKSB7CisgICAgZnJlZVBhZ2VzKCZtQWN0aXZlUGFnZXMpOworICAgIGZyZWVQYWdlcygmbUZyZWVQYWdlcyk7Cit9CisKK3ZvaWQgUGFnZUNhY2hlOjpmcmVlUGFnZXMoTGlzdDxQYWdlICo+ICpsaXN0KSB7CisgICAgTGlzdDxQYWdlICo+OjppdGVyYXRvciBpdCA9IGxpc3QtPmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IGxpc3QtPmVuZCgpKSB7CisgICAgICAgIFBhZ2UgKnBhZ2UgPSAqaXQ7CisKKyAgICAgICAgZnJlZShwYWdlLT5tRGF0YSk7CisgICAgICAgIGRlbGV0ZSBwYWdlOworICAgICAgICBwYWdlID0gTlVMTDsKKworICAgICAgICArK2l0OworICAgIH0KK30KKworUGFnZUNhY2hlOjpQYWdlICpQYWdlQ2FjaGU6OmFjcXVpcmVQYWdlKCkgeworICAgIGlmICghbUZyZWVQYWdlcy5lbXB0eSgpKSB7CisgICAgICAgIExpc3Q8UGFnZSAqPjo6aXRlcmF0b3IgaXQgPSBtRnJlZVBhZ2VzLmJlZ2luKCk7CisgICAgICAgIFBhZ2UgKnBhZ2UgPSAqaXQ7CisgICAgICAgIG1GcmVlUGFnZXMuZXJhc2UoaXQpOworCisgICAgICAgIHJldHVybiBwYWdlOworICAgIH0KKworICAgIFBhZ2UgKnBhZ2UgPSBuZXcgUGFnZTsKKyAgICBwYWdlLT5tRGF0YSA9IG1hbGxvYyhtUGFnZVNpemUpOworICAgIHBhZ2UtPm1TaXplID0gMDsKKworICAgIHJldHVybiBwYWdlOworfQorCit2b2lkIFBhZ2VDYWNoZTo6cmVsZWFzZVBhZ2UoUGFnZSAqcGFnZSkgeworICAgIHBhZ2UtPm1TaXplID0gMDsKKyAgICBtRnJlZVBhZ2VzLnB1c2hfYmFjayhwYWdlKTsKK30KKwordm9pZCBQYWdlQ2FjaGU6OmFwcGVuZFBhZ2UoUGFnZSAqcGFnZSkgeworICAgIG1Ub3RhbFNpemUgKz0gcGFnZS0+bVNpemU7CisgICAgbUFjdGl2ZVBhZ2VzLnB1c2hfYmFjayhwYWdlKTsKK30KKworc2l6ZV90IFBhZ2VDYWNoZTo6cmVsZWFzZUZyb21TdGFydChzaXplX3QgbWF4Qnl0ZXMpIHsKKyAgICBzaXplX3QgYnl0ZXNSZWxlYXNlZCA9IDA7CisKKyAgICB3aGlsZSAobWF4Qnl0ZXMgPiAwICYmICFtQWN0aXZlUGFnZXMuZW1wdHkoKSkgeworICAgICAgICBMaXN0PFBhZ2UgKj46Oml0ZXJhdG9yIGl0ID0gbUFjdGl2ZVBhZ2VzLmJlZ2luKCk7CisKKyAgICAgICAgUGFnZSAqcGFnZSA9ICppdDsKKworICAgICAgICBpZiAobWF4Qnl0ZXMgPCBwYWdlLT5tU2l6ZSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBtQWN0aXZlUGFnZXMuZXJhc2UoaXQpOworCisgICAgICAgIG1heEJ5dGVzIC09IHBhZ2UtPm1TaXplOworICAgICAgICBieXRlc1JlbGVhc2VkICs9IHBhZ2UtPm1TaXplOworCisgICAgICAgIHJlbGVhc2VQYWdlKHBhZ2UpOworICAgIH0KKworICAgIG1Ub3RhbFNpemUgLT0gYnl0ZXNSZWxlYXNlZDsKKyAgICByZXR1cm4gYnl0ZXNSZWxlYXNlZDsKK30KKwordm9pZCBQYWdlQ2FjaGU6OmNvcHkoc2l6ZV90IGZyb20sIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQUxPR1YoImNvcHkgZnJvbSAlenUgc2l6ZSAlenUiLCBmcm9tLCBzaXplKTsKKworICAgIGlmIChzaXplID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIENIRUNLX0xFKGZyb20gKyBzaXplLCBtVG90YWxTaXplKTsKKworICAgIHNpemVfdCBvZmZzZXQgPSAwOworICAgIExpc3Q8UGFnZSAqPjo6aXRlcmF0b3IgaXQgPSBtQWN0aXZlUGFnZXMuYmVnaW4oKTsKKyAgICB3aGlsZSAoZnJvbSA+PSBvZmZzZXQgKyAoKml0KS0+bVNpemUpIHsKKyAgICAgICAgb2Zmc2V0ICs9ICgqaXQpLT5tU2l6ZTsKKyAgICAgICAgKytpdDsKKyAgICB9CisKKyAgICBzaXplX3QgZGVsdGEgPSBmcm9tIC0gb2Zmc2V0OworICAgIHNpemVfdCBhdmFpbCA9ICgqaXQpLT5tU2l6ZSAtIGRlbHRhOworCisgICAgaWYgKGF2YWlsID49IHNpemUpIHsKKyAgICAgICAgbWVtY3B5KGRhdGEsIChjb25zdCB1aW50OF90ICopKCppdCktPm1EYXRhICsgZGVsdGEsIHNpemUpOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbWVtY3B5KGRhdGEsIChjb25zdCB1aW50OF90ICopKCppdCktPm1EYXRhICsgZGVsdGEsIGF2YWlsKTsKKyAgICArK2l0OworICAgIGRhdGEgPSAodWludDhfdCAqKWRhdGEgKyBhdmFpbDsKKyAgICBzaXplIC09IGF2YWlsOworCisgICAgd2hpbGUgKHNpemUgPiAwKSB7CisgICAgICAgIHNpemVfdCBjb3B5ID0gKCppdCktPm1TaXplOworICAgICAgICBpZiAoY29weSA+IHNpemUpIHsKKyAgICAgICAgICAgIGNvcHkgPSBzaXplOworICAgICAgICB9CisgICAgICAgIG1lbWNweShkYXRhLCAoKml0KS0+bURhdGEsIGNvcHkpOworICAgICAgICBkYXRhID0gKHVpbnQ4X3QgKilkYXRhICsgY29weTsKKyAgICAgICAgc2l6ZSAtPSBjb3B5OworICAgICAgICArK2l0OworICAgIH0KK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworTnVDYWNoZWRTb3VyY2UyOjpOdUNhY2hlZFNvdXJjZTIoCisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKmNhY2hlQ29uZmlnLAorICAgICAgICBib29sIGRpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcmspCisgICAgOiBtU291cmNlKHNvdXJjZSksCisgICAgICBtUmVmbGVjdG9yKG5ldyBBSGFuZGxlclJlZmxlY3RvcjxOdUNhY2hlZFNvdXJjZTI+KHRoaXMpKSwKKyAgICAgIG1Mb29wZXIobmV3IEFMb29wZXIpLAorICAgICAgbUNhY2hlKG5ldyBQYWdlQ2FjaGUoa1BhZ2VTaXplKSksCisgICAgICBtQ2FjaGVPZmZzZXQoMCksCisgICAgICBtRmluYWxTdGF0dXMoT0spLAorICAgICAgbUxhc3RBY2Nlc3NQb3MoMCksCisgICAgICBtRmV0Y2hpbmcodHJ1ZSksCisgICAgICBtRGlzY29ubmVjdGluZyhmYWxzZSksCisgICAgICBtTGFzdEZldGNoVGltZVVzKC0xKSwKKyAgICAgIG1OdW1SZXRyaWVzTGVmdChrTWF4TnVtUmV0cmllcyksCisgICAgICBtSGlnaHdhdGVyVGhyZXNob2xkQnl0ZXMoa0RlZmF1bHRIaWdoV2F0ZXJUaHJlc2hvbGQpLAorICAgICAgbUxvd3dhdGVyVGhyZXNob2xkQnl0ZXMoa0RlZmF1bHRMb3dXYXRlclRocmVzaG9sZCksCisgICAgICBtS2VlcEFsaXZlSW50ZXJ2YWxVcyhrRGVmYXVsdEtlZXBBbGl2ZUludGVydmFsVXMpLAorICAgICAgbURpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcmsoZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyaykgeworICAgIC8vIFdlIGFyZSBOT1QgZ29pbmcgdG8gc3VwcG9ydCBkaXNjb25uZWN0LWF0LWhpZ2h3YXRlcm1hcmsgaW5kZWZpbml0ZWx5CisgICAgLy8gYW5kIHdlIGFyZSBub3QgZ3VhcmFudGVlaW5nIHN1cHBvcnQgZm9yIGNsaWVudC1zcGVjaWZpZWQgY2FjaGUKKyAgICAvLyBwYXJhbWV0ZXJzLiBCb3RoIG9mIHRoZXNlIGFyZSB0ZW1wb3JhcnkgbWVhc3VyZXMgdG8gc29sdmUgYSBzcGVjaWZpYworICAgIC8vIHByb2JsZW0gdGhhdCB3aWxsIGJlIHNvbHZlZCBpbiBhIGJldHRlciB3YXkgZ29pbmcgZm9yd2FyZC4KKworICAgIHVwZGF0ZUNhY2hlUGFyYW1zRnJvbVN5c3RlbVByb3BlcnR5KCk7CisKKyAgICBpZiAoY2FjaGVDb25maWcgIT0gTlVMTCkgeworICAgICAgICB1cGRhdGVDYWNoZVBhcmFtc0Zyb21TdHJpbmcoY2FjaGVDb25maWcpOworICAgIH0KKworICAgIGlmIChtRGlzY29ubmVjdEF0SGlnaHdhdGVybWFyaykgeworICAgICAgICAvLyBNYWtlcyBubyBzZW5zZSB0byBkaXNjb25uZWN0IGFuZCBkbyBrZWVwLWFsaXZlcy4uLgorICAgICAgICBtS2VlcEFsaXZlSW50ZXJ2YWxVcyA9IDA7CisgICAgfQorCisgICAgbUxvb3Blci0+c2V0TmFtZSgiTnVDYWNoZWRTb3VyY2UyIik7CisgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3IpOworCisgICAgLy8gU2luY2UgaXQgbWF5IG5vdCBiZSBvYnZpb3VzIHdoeSBvdXIgbG9vcGVyIHRocmVhZCBuZWVkcyB0byBiZQorICAgIC8vIGFibGUgdG8gY2FsbCBpbnRvIGphdmEgc2luY2UgaXQgZG9lc24ndCBhcHBlYXIgdG8gZG8gc28gYXQgYWxsLi4uCisgICAgLy8gSU1lZGlhSFRUUENvbm5lY3Rpb24gbWF5IGJlIChhbmQgbW9zdCBsaWtlbHkgaXMpIGltcGxlbWVudGVkIGluIEpBVkEKKyAgICAvLyBhbmQgYSBsb2NhbCBKQVZBIElCaW5kZXIgd2lsbCBjYWxsIGRpcmVjdGx5IGludG8gSk5JIG1ldGhvZHMuCisgICAgLy8gU28gd2hlbmV2ZXIgd2UgY2FsbCBEYXRhU291cmNlOjpyZWFkQXQgaXQgbWF5IGVuZCB1cCBpbiBhIGNhbGwgdG8KKyAgICAvLyBJTWVkaWFIVFRQQ29ubmVjdGlvbjo6cmVhZEF0IGFuZCB0aGVyZWZvcmUgY2FsbCBiYWNrIGludG8gSkFWQS4KKyAgICBtTG9vcGVyLT5zdGFydChmYWxzZSAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8sIHRydWUgLyogY2FuQ2FsbEphdmEgKi8pOworCisgICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoIk51Q2FjaGVkU291cmNlMiglcykiLCBtU291cmNlLT50b1N0cmluZygpLnN0cmluZygpKTsKK30KKworTnVDYWNoZWRTb3VyY2UyOjp+TnVDYWNoZWRTb3VyY2UyKCkgeworICAgIG1Mb29wZXItPnN0b3AoKTsKKyAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yLT5pZCgpKTsKKworICAgIGRlbGV0ZSBtQ2FjaGU7CisgICAgbUNhY2hlID0gTlVMTDsKK30KKworLy8gc3RhdGljCitzcDxOdUNhY2hlZFNvdXJjZTI+IE51Q2FjaGVkU291cmNlMjo6Q3JlYXRlKAorICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLAorICAgICAgICBjb25zdCBjaGFyICpjYWNoZUNvbmZpZywKKyAgICAgICAgYm9vbCBkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrKSB7CisgICAgc3A8TnVDYWNoZWRTb3VyY2UyPiBpbnN0YW5jZSA9IG5ldyBOdUNhY2hlZFNvdXJjZTIoCisgICAgICAgICAgICBzb3VyY2UsIGNhY2hlQ29uZmlnLCBkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soaW5zdGFuY2UtPm1Mb2NrKTsKKyAgICAobmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hNb3JlLCBpbnN0YW5jZS0+bVJlZmxlY3RvcikpLT5wb3N0KCk7CisgICAgcmV0dXJuIGluc3RhbmNlOworfQorCitzdGF0dXNfdCBOdUNhY2hlZFNvdXJjZTI6OmdldEVzdGltYXRlZEJhbmR3aWR0aEticHMoaW50MzJfdCAqa2JwcykgeworICAgIGlmIChtU291cmNlLT5mbGFncygpICYga0lzSFRUUEJhc2VkU291cmNlKSB7CisgICAgICAgIEhUVFBCYXNlKiBzb3VyY2UgPSBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihtU291cmNlLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIHNvdXJjZS0+Z2V0RXN0aW1hdGVkQmFuZHdpZHRoS2JwcyhrYnBzKTsKKyAgICB9CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCit2b2lkIE51Q2FjaGVkU291cmNlMjo6Y2xvc2UoKSB7CisgICAgZGlzY29ubmVjdCgpOworfQorCit2b2lkIE51Q2FjaGVkU291cmNlMjo6ZGlzY29ubmVjdCgpIHsKKyAgICBpZiAobVNvdXJjZS0+ZmxhZ3MoKSAmIGtJc0hUVFBCYXNlZFNvdXJjZSkgeworICAgICAgICBBTE9HVigiZGlzY29ubmVjdGluZyBIVFRQQmFzZWRTb3VyY2UiKTsKKworICAgICAgICB7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworICAgICAgICAgICAgLy8gc2V0IG1EaXNjb25uZWN0aW5nIHRvIHRydWUsIGlmIGEgZmV0Y2ggcmV0dXJucyBhZnRlcgorICAgICAgICAgICAgLy8gdGhpcywgdGhlIHNvdXJjZSB3aWxsIGJlIG1hcmtlZCBhcyBFT1MuCisgICAgICAgICAgICBtRGlzY29ubmVjdGluZyA9IHRydWU7CisKKyAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgc2lnbmFsIG1Db25kaXRpb24gc28gdGhhdCB0aGUgcGVuZGluZyByZWFkQXQoKQorICAgICAgICAgICAgLy8gd2lsbCBpbW1lZGlhdGVseSByZXR1cm4KKyAgICAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBleHBsaWNpdGx5IGRpc2Nvbm5lY3QgZnJvbSB0aGUgc291cmNlLCB0byBhbGxvdyBhbnkKKyAgICAgICAgLy8gcGVuZGluZyByZWFkcyB0byByZXR1cm4gbW9yZSBwcm9tcHRseQorICAgICAgICBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihtU291cmNlLmdldCgpKS0+ZGlzY29ubmVjdCgpOworICAgIH0KK30KKworc3RhdHVzX3QgTnVDYWNoZWRTb3VyY2UyOjpzZXRDYWNoZVN0YXRDb2xsZWN0RnJlcShpbnQzMl90IGZyZXFNcykgeworICAgIGlmIChtU291cmNlLT5mbGFncygpICYga0lzSFRUUEJhc2VkU291cmNlKSB7CisgICAgICAgIEhUVFBCYXNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihtU291cmNlLmdldCgpKTsKKyAgICAgICAgcmV0dXJuIHNvdXJjZS0+c2V0QmFuZHdpZHRoU3RhdENvbGxlY3RGcmVxKGZyZXFNcyk7CisgICAgfQorICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKK30KKworc3RhdHVzX3QgTnVDYWNoZWRTb3VyY2UyOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Tb3VyY2UtPmluaXRDaGVjaygpOworfQorCitzdGF0dXNfdCBOdUNhY2hlZFNvdXJjZTI6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgIHJldHVybiBtU291cmNlLT5nZXRTaXplKHNpemUpOworfQorCit1aW50MzJfdCBOdUNhY2hlZFNvdXJjZTI6OmZsYWdzKCkgeworICAgIC8vIFJlbW92ZSBIVFRQIHJlbGF0ZWQgZmxhZ3Mgc2luY2UgTnVDYWNoZWRTb3VyY2UyIGlzIG5vdCBIVFRQLWJhc2VkLgorICAgIHVpbnQzMl90IGZsYWdzID0gbVNvdXJjZS0+ZmxhZ3MoKSAmIH4oa1dhbnRzUHJlZmV0Y2hpbmcgfCBrSXNIVFRQQmFzZWRTb3VyY2UpOworICAgIHJldHVybiAoZmxhZ3MgfCBrSXNDYWNoaW5nRGF0YVNvdXJjZSk7Cit9CisKK3ZvaWQgTnVDYWNoZWRTb3VyY2UyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKKyAgICAgICAgY2FzZSBrV2hhdEZldGNoTW9yZToKKyAgICAgICAgeworICAgICAgICAgICAgb25GZXRjaCgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBjYXNlIGtXaGF0UmVhZDoKKyAgICAgICAgeworICAgICAgICAgICAgb25SZWFkKG1zZyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBUUkVTUEFTUygpOworICAgIH0KK30KKwordm9pZCBOdUNhY2hlZFNvdXJjZTI6OmZldGNoSW50ZXJuYWwoKSB7CisgICAgQUxPR1YoImZldGNoSW50ZXJuYWwiKTsKKworICAgIGJvb2wgcmVjb25uZWN0ID0gZmFsc2U7CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgICAgIENIRUNLKG1GaW5hbFN0YXR1cyA9PSBPSyB8fCBtTnVtUmV0cmllc0xlZnQgPiAwKTsKKworICAgICAgICBpZiAobUZpbmFsU3RhdHVzICE9IE9LKSB7CisgICAgICAgICAgICAtLW1OdW1SZXRyaWVzTGVmdDsKKworICAgICAgICAgICAgcmVjb25uZWN0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZWNvbm5lY3QpIHsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0KKyAgICAgICAgICAgIG1Tb3VyY2UtPnJlY29ubmVjdEF0T2Zmc2V0KG1DYWNoZU9mZnNldCArIG1DYWNoZS0+dG90YWxTaXplKCkpOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICAgICAgaWYgKG1EaXNjb25uZWN0aW5nKSB7CisgICAgICAgICAgICBtTnVtUmV0cmllc0xlZnQgPSAwOworICAgICAgICAgICAgbUZpbmFsU3RhdHVzID0gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfVU5TVVBQT1JURUQgfHwgZXJyID09IC1FUElQRSkgeworICAgICAgICAgICAgLy8gVGhlc2UgYXJlIGVycm9ycyB0aGF0IGFyZSBub3QgbGlrZWx5IHRvIGdvIGF3YXkgZXZlbiBpZiB3ZQorICAgICAgICAgICAgLy8gcmV0cnksIGkuZS4gdGhlIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgcmFuZ2UgcmVxdWVzdHMgb3Igc2ltaWxhci4KKyAgICAgICAgICAgIG1OdW1SZXRyaWVzTGVmdCA9IDA7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HSSgiVGhlIGF0dGVtcHQgdG8gcmVjb25uZWN0IGZhaWxlZCwgJWQgcmV0cmllcyByZW1haW5pbmciLAorICAgICAgICAgICAgICAgICBtTnVtUmV0cmllc0xlZnQpOworCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBQYWdlQ2FjaGU6OlBhZ2UgKnBhZ2UgPSBtQ2FjaGUtPmFjcXVpcmVQYWdlKCk7CisKKyAgICBzc2l6ZV90IG4gPSBtU291cmNlLT5yZWFkQXQoCisgICAgICAgICAgICBtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpLCBwYWdlLT5tRGF0YSwga1BhZ2VTaXplKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICBpZiAobiA9PSAwIHx8IG1EaXNjb25uZWN0aW5nKSB7CisgICAgICAgIEFMT0dJKCJjYWNoaW5nIHJlYWNoZWQgZW9zLiIpOworCisgICAgICAgIG1OdW1SZXRyaWVzTGVmdCA9IDA7CisgICAgICAgIG1GaW5hbFN0YXR1cyA9IEVSUk9SX0VORF9PRl9TVFJFQU07CisKKyAgICAgICAgbUNhY2hlLT5yZWxlYXNlUGFnZShwYWdlKTsKKyAgICB9IGVsc2UgaWYgKG4gPCAwKSB7CisgICAgICAgIG1GaW5hbFN0YXR1cyA9IG47CisgICAgICAgIGlmIChuID09IEVSUk9SX1VOU1VQUE9SVEVEIHx8IG4gPT0gLUVQSVBFKSB7CisgICAgICAgICAgICAvLyBUaGVzZSBhcmUgZXJyb3JzIHRoYXQgYXJlIG5vdCBsaWtlbHkgdG8gZ28gYXdheSBldmVuIGlmIHdlCisgICAgICAgICAgICAvLyByZXRyeSwgaS5lLiB0aGUgc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCByYW5nZSByZXF1ZXN0cyBvciBzaW1pbGFyLgorICAgICAgICAgICAgbU51bVJldHJpZXNMZWZ0ID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIEFMT0dFKCJzb3VyY2UgcmV0dXJuZWQgZXJyb3IgJXpkLCAlZCByZXRyaWVzIGxlZnQiLCBuLCBtTnVtUmV0cmllc0xlZnQpOworICAgICAgICBtQ2FjaGUtPnJlbGVhc2VQYWdlKHBhZ2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChtRmluYWxTdGF0dXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dJKCJyZXRyeWluZyBhIHByZXZpb3VzbHkgZmFpbGVkIHJlYWQgc3VjY2VlZGVkLiIpOworICAgICAgICB9CisgICAgICAgIG1OdW1SZXRyaWVzTGVmdCA9IGtNYXhOdW1SZXRyaWVzOworICAgICAgICBtRmluYWxTdGF0dXMgPSBPSzsKKworICAgICAgICBwYWdlLT5tU2l6ZSA9IG47CisgICAgICAgIG1DYWNoZS0+YXBwZW5kUGFnZShwYWdlKTsKKyAgICB9Cit9CisKK3ZvaWQgTnVDYWNoZWRTb3VyY2UyOjpvbkZldGNoKCkgeworICAgIEFMT0dWKCJvbkZldGNoIik7CisKKyAgICBpZiAobUZpbmFsU3RhdHVzICE9IE9LICYmIG1OdW1SZXRyaWVzTGVmdCA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJFT1MgcmVhY2hlZCwgZG9uZSBwcmVmZXRjaGluZyBmb3Igbm93Iik7CisgICAgICAgIG1GZXRjaGluZyA9IGZhbHNlOworICAgIH0KKworICAgIGJvb2wga2VlcEFsaXZlID0KKyAgICAgICAgIW1GZXRjaGluZworICAgICAgICAgICAgJiYgbUZpbmFsU3RhdHVzID09IE9LCisgICAgICAgICAgICAmJiBtS2VlcEFsaXZlSW50ZXJ2YWxVcyA+IDAKKyAgICAgICAgICAgICYmIEFMb29wZXI6OkdldE5vd1VzKCkgPj0gbUxhc3RGZXRjaFRpbWVVcyArIG1LZWVwQWxpdmVJbnRlcnZhbFVzOworCisgICAgaWYgKG1GZXRjaGluZyB8fCBrZWVwQWxpdmUpIHsKKyAgICAgICAgaWYgKGtlZXBBbGl2ZSkgeworICAgICAgICAgICAgQUxPR0koIktlZXAgYWxpdmUiKTsKKyAgICAgICAgfQorCisgICAgICAgIGZldGNoSW50ZXJuYWwoKTsKKworICAgICAgICBtTGFzdEZldGNoVGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKworICAgICAgICBpZiAobUZldGNoaW5nICYmIG1DYWNoZS0+dG90YWxTaXplKCkgPj0gbUhpZ2h3YXRlclRocmVzaG9sZEJ5dGVzKSB7CisgICAgICAgICAgICBBTE9HSSgiQ2FjaGUgZnVsbCwgZG9uZSBwcmVmZXRjaGluZyBmb3Igbm93Iik7CisgICAgICAgICAgICBtRmV0Y2hpbmcgPSBmYWxzZTsKKworICAgICAgICAgICAgaWYgKG1EaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrCisgICAgICAgICAgICAgICAgICAgICYmIChtU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzSFRUUEJhc2VkU291cmNlKSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJEaXNjb25uZWN0aW5nIGF0IGhpZ2ggd2F0ZXJtYXJrIik7CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4obVNvdXJjZS5nZXQoKSktPmRpc2Nvbm5lY3QoKTsKKyAgICAgICAgICAgICAgICBtRmluYWxTdGF0dXMgPSAtRUFHQUlOOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICAgICAgcmVzdGFydFByZWZldGNoZXJJZk5lY2Vzc2FyeV9sKCk7CisgICAgfQorCisgICAgaW50NjRfdCBkZWxheVVzOworICAgIGlmIChtRmV0Y2hpbmcpIHsKKyAgICAgICAgaWYgKG1GaW5hbFN0YXR1cyAhPSBPSyAmJiBtTnVtUmV0cmllc0xlZnQgPiAwKSB7CisgICAgICAgICAgICAvLyBXZSBmYWlsZWQgdGhpcyB0aW1lIGFuZCB3aWxsIHRyeSBhZ2FpbiBpbiAzIHNlY29uZHMuCisgICAgICAgICAgICBkZWxheVVzID0gMzAwMDAwMExMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZGVsYXlVcyA9IDA7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBkZWxheVVzID0gMTAwMDAwTEw7CisgICAgfQorCisgICAgKG5ldyBBTWVzc2FnZShrV2hhdEZldGNoTW9yZSwgbVJlZmxlY3RvcikpLT5wb3N0KGRlbGF5VXMpOworfQorCit2b2lkIE51Q2FjaGVkU291cmNlMjo6b25SZWFkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgQUxPR1YoIm9uUmVhZCIpOworCisgICAgaW50NjRfdCBvZmZzZXQ7CisgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoIm9mZnNldCIsICZvZmZzZXQpKTsKKworICAgIHZvaWQgKmRhdGE7CisgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigiZGF0YSIsICZkYXRhKSk7CisKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJzaXplIiwgJnNpemUpKTsKKworICAgIHNzaXplX3QgcmVzdWx0ID0gcmVhZEludGVybmFsKG9mZnNldCwgZGF0YSwgc2l6ZSk7CisKKyAgICBpZiAocmVzdWx0ID09IC1FQUdBSU4pIHsKKyAgICAgICAgbXNnLT5wb3N0KDUwMDAwKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1EaXNjb25uZWN0aW5nKSB7CisgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBDSEVDSyhtQXN5bmNSZXN1bHQgPT0gTlVMTCk7CisKKyAgICBtQXN5bmNSZXN1bHQgPSBuZXcgQU1lc3NhZ2U7CisgICAgbUFzeW5jUmVzdWx0LT5zZXRJbnQzMigicmVzdWx0IiwgcmVzdWx0KTsKKworICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Cit9CisKK3ZvaWQgTnVDYWNoZWRTb3VyY2UyOjpyZXN0YXJ0UHJlZmV0Y2hlcklmTmVjZXNzYXJ5X2woCisgICAgICAgIGJvb2wgaWdub3JlTG93V2F0ZXJUaHJlc2hvbGQsIGJvb2wgZm9yY2UpIHsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtHcmF5QXJlYSA9IDEwMjQgKiAxMDI0OworCisgICAgaWYgKG1GZXRjaGluZyB8fCAobUZpbmFsU3RhdHVzICE9IE9LICYmIG1OdW1SZXRyaWVzTGVmdCA9PSAwKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCFpZ25vcmVMb3dXYXRlclRocmVzaG9sZCAmJiAhZm9yY2UKKyAgICAgICAgICAgICYmIG1DYWNoZU9mZnNldCArIG1DYWNoZS0+dG90YWxTaXplKCkgLSBtTGFzdEFjY2Vzc1BvcworICAgICAgICAgICAgICAgID49IG1Mb3d3YXRlclRocmVzaG9sZEJ5dGVzKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzaXplX3QgbWF4Qnl0ZXMgPSBtTGFzdEFjY2Vzc1BvcyAtIG1DYWNoZU9mZnNldDsKKworICAgIGlmICghZm9yY2UpIHsKKyAgICAgICAgaWYgKG1heEJ5dGVzIDwga0dyYXlBcmVhKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBtYXhCeXRlcyAtPSBrR3JheUFyZWE7CisgICAgfQorCisgICAgc2l6ZV90IGFjdHVhbEJ5dGVzID0gbUNhY2hlLT5yZWxlYXNlRnJvbVN0YXJ0KG1heEJ5dGVzKTsKKyAgICBtQ2FjaGVPZmZzZXQgKz0gYWN0dWFsQnl0ZXM7CisKKyAgICBBTE9HSSgicmVzdGFydGluZyBwcmVmZXRjaGVyLCB0b3RhbFNpemUgPSAlenUiLCBtQ2FjaGUtPnRvdGFsU2l6ZSgpKTsKKyAgICBtRmV0Y2hpbmcgPSB0cnVlOworfQorCitzc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvU2VyaWFsaXplcihtU2VyaWFsaXplcik7CisKKyAgICBBTE9HVigicmVhZEF0IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgaWYgKG1EaXNjb25uZWN0aW5nKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KKworICAgIC8vIElmIHRoZSByZXF1ZXN0IGNhbiBiZSBjb21wbGV0ZWx5IHNhdGlzZmllZCBmcm9tIHRoZSBjYWNoZSwgZG8gc28uCisKKyAgICBpZiAob2Zmc2V0ID49IG1DYWNoZU9mZnNldAorICAgICAgICAgICAgJiYgb2Zmc2V0ICsgc2l6ZSA8PSBtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpKSB7CisgICAgICAgIHNpemVfdCBkZWx0YSA9IG9mZnNldCAtIG1DYWNoZU9mZnNldDsKKyAgICAgICAgbUNhY2hlLT5jb3B5KGRlbHRhLCBkYXRhLCBzaXplKTsKKworICAgICAgICBtTGFzdEFjY2Vzc1BvcyA9IG9mZnNldCArIHNpemU7CisKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlYWQsIG1SZWZsZWN0b3IpOworICAgIG1zZy0+c2V0SW50NjQoIm9mZnNldCIsIG9mZnNldCk7CisgICAgbXNnLT5zZXRQb2ludGVyKCJkYXRhIiwgZGF0YSk7CisgICAgbXNnLT5zZXRTaXplKCJzaXplIiwgc2l6ZSk7CisKKyAgICBDSEVDSyhtQXN5bmNSZXN1bHQgPT0gTlVMTCk7CisgICAgbXNnLT5wb3N0KCk7CisKKyAgICB3aGlsZSAobUFzeW5jUmVzdWx0ID09IE5VTEwgJiYgIW1EaXNjb25uZWN0aW5nKSB7CisgICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7CisgICAgfQorCisgICAgaWYgKG1EaXNjb25uZWN0aW5nKSB7CisgICAgICAgIG1Bc3luY1Jlc3VsdC5jbGVhcigpOworICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKKyAgICB9CisKKyAgICBpbnQzMl90IHJlc3VsdDsKKyAgICBDSEVDSyhtQXN5bmNSZXN1bHQtPmZpbmRJbnQzMigicmVzdWx0IiwgJnJlc3VsdCkpOworCisgICAgbUFzeW5jUmVzdWx0LmNsZWFyKCk7CisKKyAgICBpZiAocmVzdWx0ID4gMCkgeworICAgICAgICBtTGFzdEFjY2Vzc1BvcyA9IG9mZnNldCArIHJlc3VsdDsKKyAgICB9CisKKyAgICByZXR1cm4gKHNzaXplX3QpcmVzdWx0OworfQorCitzaXplX3QgTnVDYWNoZWRTb3VyY2UyOjpjYWNoZWRTaXplKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1DYWNoZU9mZnNldCArIG1DYWNoZS0+dG90YWxTaXplKCk7Cit9CisKK3N0YXR1c190IE51Q2FjaGVkU291cmNlMjo6Z2V0QXZhaWxhYmxlU2l6ZShvZmY2NF90IG9mZnNldCwgb2ZmNjRfdCAqc2l6ZSkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgc3RhdHVzX3QgZmluYWxTdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICpzaXplID0gYXBwcm94RGF0YVJlbWFpbmluZ19sKG9mZnNldCwgJmZpbmFsU3RhdHVzKTsKKyAgICByZXR1cm4gZmluYWxTdGF0dXM7Cit9CisKK3NpemVfdCBOdUNhY2hlZFNvdXJjZTI6OmFwcHJveERhdGFSZW1haW5pbmcoc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdCB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gYXBwcm94RGF0YVJlbWFpbmluZ19sKG1MYXN0QWNjZXNzUG9zLCBmaW5hbFN0YXR1cyk7Cit9CisKK3NpemVfdCBOdUNhY2hlZFNvdXJjZTI6OmFwcHJveERhdGFSZW1haW5pbmdfbChvZmY2NF90IG9mZnNldCwgc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdCB7CisgICAgKmZpbmFsU3RhdHVzID0gbUZpbmFsU3RhdHVzOworCisgICAgaWYgKG1GaW5hbFN0YXR1cyAhPSBPSyAmJiBtTnVtUmV0cmllc0xlZnQgPiAwKSB7CisgICAgICAgIC8vIFByZXRlbmQgdGhhdCBldmVyeXRoaW5nIGlzIGZpbmUgdW50aWwgd2UncmUgb3V0IG9mIHJldHJpZXMuCisgICAgICAgICpmaW5hbFN0YXR1cyA9IE9LOworICAgIH0KKworICAgIG9mZnNldCA9IG9mZnNldCA+PSAwID8gb2Zmc2V0IDogbUxhc3RBY2Nlc3NQb3M7CisgICAgb2ZmNjRfdCBsYXN0Qnl0ZVBvc0NhY2hlZCA9IG1DYWNoZU9mZnNldCArIG1DYWNoZS0+dG90YWxTaXplKCk7CisgICAgaWYgKG9mZnNldCA8IGxhc3RCeXRlUG9zQ2FjaGVkKSB7CisgICAgICAgIHJldHVybiBsYXN0Qnl0ZVBvc0NhY2hlZCAtIG9mZnNldDsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK3NzaXplX3QgTnVDYWNoZWRTb3VyY2UyOjpyZWFkSW50ZXJuYWwob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgQ0hFQ0tfTEUoc2l6ZSwgKHNpemVfdCltSGlnaHdhdGVyVGhyZXNob2xkQnl0ZXMpOworCisgICAgQUxPR1YoInJlYWRJbnRlcm5hbCBvZmZzZXQgJWxsZCBzaXplICV6dSIsIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisKKyAgICAvLyBJZiB3ZSdyZSBkaXNjb25uZWN0aW5nLCByZXR1cm4gRU9TIGFuZCBkb24ndCBhY2Nlc3MgKmRhdGEgcG9pbnRlci4KKyAgICAvLyBkYXRhIGNvdWxkIGJlIG9uIHRoZSBzdGFjayBvZiB0aGUgY2FsbGVyIHRvIE51Q2FjaGVkU291cmNlMjo6cmVhZEF0KCksCisgICAgLy8gd2hpY2ggbWF5IGhhdmUgZXhpdGVkIGFscmVhZHkuCisgICAgaWYgKG1EaXNjb25uZWN0aW5nKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KKworICAgIGlmICghbUZldGNoaW5nKSB7CisgICAgICAgIG1MYXN0QWNjZXNzUG9zID0gb2Zmc2V0OworICAgICAgICByZXN0YXJ0UHJlZmV0Y2hlcklmTmVjZXNzYXJ5X2woCisgICAgICAgICAgICAgICAgZmFsc2UsIC8vIGlnbm9yZUxvd1dhdGVyVGhyZXNob2xkCisgICAgICAgICAgICAgICAgdHJ1ZSk7IC8vIGZvcmNlCisgICAgfQorCisgICAgaWYgKG9mZnNldCA8IG1DYWNoZU9mZnNldAorICAgICAgICAgICAgfHwgb2Zmc2V0ID49IChvZmY2NF90KShtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpKSkgeworICAgICAgICBzdGF0aWMgY29uc3Qgb2ZmNjRfdCBrUGFkZGluZyA9IDI1NiAqIDEwMjQ7CisKKyAgICAgICAgLy8gSW4gdGhlIHByZXNlbmNlIG9mIG11bHRpcGxlIGRlY29kZWQgc3RyZWFtcywgb25jZSBvZiB0aGVtIHdpbGwKKyAgICAgICAgLy8gdHJpZ2dlciB0aGlzIHNlZWsgcmVxdWVzdCwgdGhlIG90aGVyIG9uZSB3aWxsIHJlcXVlc3QgZGF0YSAibmVhcmJ5IgorICAgICAgICAvLyBzb29uLCBhZGp1c3QgdGhlIHNlZWsgcG9zaXRpb24gc28gdGhhdCB0aGF0IHN1YnNlcXVlbnQgcmVxdWVzdAorICAgICAgICAvLyBkb2VzIG5vdCB0cmlnZ2VyIGFub3RoZXIgc2Vlay4KKyAgICAgICAgb2ZmNjRfdCBzZWVrT2Zmc2V0ID0gKG9mZnNldCA+IGtQYWRkaW5nKSA/IG9mZnNldCAtIGtQYWRkaW5nIDogMDsKKworICAgICAgICBzZWVrSW50ZXJuYWxfbChzZWVrT2Zmc2V0KTsKKyAgICB9CisKKyAgICBzaXplX3QgZGVsdGEgPSBvZmZzZXQgLSBtQ2FjaGVPZmZzZXQ7CisKKyAgICBpZiAobUZpbmFsU3RhdHVzICE9IE9LICYmIG1OdW1SZXRyaWVzTGVmdCA9PSAwKSB7CisgICAgICAgIGlmIChkZWx0YSA+PSBtQ2FjaGUtPnRvdGFsU2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbUZpbmFsU3RhdHVzOworICAgICAgICB9CisKKyAgICAgICAgc2l6ZV90IGF2YWlsID0gbUNhY2hlLT50b3RhbFNpemUoKSAtIGRlbHRhOworCisgICAgICAgIGlmIChhdmFpbCA+IHNpemUpIHsKKyAgICAgICAgICAgIGF2YWlsID0gc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIG1DYWNoZS0+Y29weShkZWx0YSwgZGF0YSwgYXZhaWwpOworCisgICAgICAgIHJldHVybiBhdmFpbDsKKyAgICB9CisKKyAgICBpZiAob2Zmc2V0ICsgc2l6ZSA8PSBtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpKSB7CisgICAgICAgIG1DYWNoZS0+Y29weShkZWx0YSwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgcmV0dXJuIHNpemU7CisgICAgfQorCisgICAgQUxPR1YoImRlZmVycmluZyByZWFkIik7CisKKyAgICByZXR1cm4gLUVBR0FJTjsKK30KKworc3RhdHVzX3QgTnVDYWNoZWRTb3VyY2UyOjpzZWVrSW50ZXJuYWxfbChvZmY2NF90IG9mZnNldCkgeworICAgIG1MYXN0QWNjZXNzUG9zID0gb2Zmc2V0OworCisgICAgaWYgKG9mZnNldCA+PSBtQ2FjaGVPZmZzZXQKKyAgICAgICAgICAgICYmIG9mZnNldCA8PSAob2ZmNjRfdCkobUNhY2hlT2Zmc2V0ICsgbUNhY2hlLT50b3RhbFNpemUoKSkpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIEFMT0dJKCJuZXcgcmFuZ2U6IG9mZnNldD0gJWxsZCIsIChsb25nIGxvbmcpb2Zmc2V0KTsKKworICAgIG1DYWNoZU9mZnNldCA9IG9mZnNldDsKKworICAgIHNpemVfdCB0b3RhbFNpemUgPSBtQ2FjaGUtPnRvdGFsU2l6ZSgpOworICAgIENIRUNLX0VRKG1DYWNoZS0+cmVsZWFzZUZyb21TdGFydCh0b3RhbFNpemUpLCB0b3RhbFNpemUpOworCisgICAgbU51bVJldHJpZXNMZWZ0ID0ga01heE51bVJldHJpZXM7CisgICAgbUZldGNoaW5nID0gdHJ1ZTsKKworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBOdUNhY2hlZFNvdXJjZTI6OnJlc3VtZUZldGNoaW5nSWZOZWNlc3NhcnkoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKworICAgIHJlc3RhcnRQcmVmZXRjaGVySWZOZWNlc3NhcnlfbCh0cnVlIC8qIGlnbm9yZSBsb3cgd2F0ZXIgdGhyZXNob2xkICovKTsKK30KKworU3RyaW5nOCBOdUNhY2hlZFNvdXJjZTI6OmdldFVyaSgpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+Z2V0VXJpKCk7Cit9CisKK1N0cmluZzggTnVDYWNoZWRTb3VyY2UyOjpnZXRNSU1FVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVNvdXJjZS0+Z2V0TUlNRVR5cGUoKTsKK30KKwordm9pZCBOdUNhY2hlZFNvdXJjZTI6OnVwZGF0ZUNhY2hlUGFyYW1zRnJvbVN5c3RlbVByb3BlcnR5KCkgeworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBpZiAoIXByb3BlcnR5X2dldCgibWVkaWEuc3RhZ2VmcmlnaHQuY2FjaGUtcGFyYW1zIiwgdmFsdWUsIE5VTEwpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB1cGRhdGVDYWNoZVBhcmFtc0Zyb21TdHJpbmcodmFsdWUpOworfQorCit2b2lkIE51Q2FjaGVkU291cmNlMjo6dXBkYXRlQ2FjaGVQYXJhbXNGcm9tU3RyaW5nKGNvbnN0IGNoYXIgKnMpIHsKKyAgICBzc2l6ZV90IGxvd3dhdGVyTWFya0tiLCBoaWdod2F0ZXJNYXJrS2I7CisgICAgaW50IGtlZXBBbGl2ZVNlY3M7CisKKyAgICBpZiAoc3NjYW5mKHMsICIlemQvJXpkLyVkIiwKKyAgICAgICAgICAgICAgICZsb3d3YXRlck1hcmtLYiwgJmhpZ2h3YXRlck1hcmtLYiwgJmtlZXBBbGl2ZVNlY3MpICE9IDMpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBwYXJzZSBjYWNoZSBwYXJhbWV0ZXJzIGZyb20gJyVzJy4iLCBzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChsb3d3YXRlck1hcmtLYiA+PSAwKSB7CisgICAgICAgIG1Mb3d3YXRlclRocmVzaG9sZEJ5dGVzID0gbG93d2F0ZXJNYXJrS2IgKiAxMDI0OworICAgIH0gZWxzZSB7CisgICAgICAgIG1Mb3d3YXRlclRocmVzaG9sZEJ5dGVzID0ga0RlZmF1bHRMb3dXYXRlclRocmVzaG9sZDsKKyAgICB9CisKKyAgICBpZiAoaGlnaHdhdGVyTWFya0tiID49IDApIHsKKyAgICAgICAgbUhpZ2h3YXRlclRocmVzaG9sZEJ5dGVzID0gaGlnaHdhdGVyTWFya0tiICogMTAyNDsKKyAgICB9IGVsc2UgeworICAgICAgICBtSGlnaHdhdGVyVGhyZXNob2xkQnl0ZXMgPSBrRGVmYXVsdEhpZ2hXYXRlclRocmVzaG9sZDsKKyAgICB9CisKKyAgICBpZiAobUxvd3dhdGVyVGhyZXNob2xkQnl0ZXMgPj0gbUhpZ2h3YXRlclRocmVzaG9sZEJ5dGVzKSB7CisgICAgICAgIEFMT0dFKCJJbGxlZ2FsIGxvdy9oaWdod2F0ZXIgbWFya3Mgc3BlY2lmaWVkLCByZXZlcnRpbmcgdG8gZGVmYXVsdHMuIik7CisKKyAgICAgICAgbUxvd3dhdGVyVGhyZXNob2xkQnl0ZXMgPSBrRGVmYXVsdExvd1dhdGVyVGhyZXNob2xkOworICAgICAgICBtSGlnaHdhdGVyVGhyZXNob2xkQnl0ZXMgPSBrRGVmYXVsdEhpZ2hXYXRlclRocmVzaG9sZDsKKyAgICB9CisKKyAgICBpZiAoa2VlcEFsaXZlU2VjcyA+PSAwKSB7CisgICAgICAgIG1LZWVwQWxpdmVJbnRlcnZhbFVzID0ga2VlcEFsaXZlU2VjcyAqIDEwMDAwMDBMTDsKKyAgICB9IGVsc2UgeworICAgICAgICBtS2VlcEFsaXZlSW50ZXJ2YWxVcyA9IGtEZWZhdWx0S2VlcEFsaXZlSW50ZXJ2YWxVczsKKyAgICB9CisKKyAgICBBTE9HVigibG93d2F0ZXIgPSAlenUgYnl0ZXMsIGhpZ2h3YXRlciA9ICV6dSBieXRlcywga2VlcGFsaXZlID0gJWxsZCB1cyIsCisgICAgICAgICBtTG93d2F0ZXJUaHJlc2hvbGRCeXRlcywKKyAgICAgICAgIG1IaWdod2F0ZXJUaHJlc2hvbGRCeXRlcywKKyAgICAgICAgIChsb25nIGxvbmcpbUtlZXBBbGl2ZUludGVydmFsVXMpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgTnVDYWNoZWRTb3VyY2UyOjpSZW1vdmVDYWNoZVNwZWNpZmljSGVhZGVycygKKyAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMsCisgICAgICAgIFN0cmluZzggKmNhY2hlQ29uZmlnLAorICAgICAgICBib29sICpkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrKSB7CisgICAgKmNhY2hlQ29uZmlnID0gU3RyaW5nOCgpOworICAgICpkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrID0gZmFsc2U7CisKKyAgICBpZiAoaGVhZGVycyA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzc2l6ZV90IGluZGV4OworICAgIGlmICgoaW5kZXggPSBoZWFkZXJzLT5pbmRleE9mS2V5KFN0cmluZzgoIngtY2FjaGUtY29uZmlnIikpKSA+PSAwKSB7CisgICAgICAgICpjYWNoZUNvbmZpZyA9IGhlYWRlcnMtPnZhbHVlQXQoaW5kZXgpOworCisgICAgICAgIGhlYWRlcnMtPnJlbW92ZUl0ZW1zQXQoaW5kZXgpOworCisgICAgICAgIEFMT0dWKCJVc2luZyBzcGVjaWFsIGNhY2hlIGNvbmZpZyAnJXMnIiwgY2FjaGVDb25maWctPnN0cmluZygpKTsKKyAgICB9CisKKyAgICBpZiAoKGluZGV4ID0gaGVhZGVycy0+aW5kZXhPZktleSgKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgieC1kaXNjb25uZWN0LWF0LWhpZ2h3YXRlcm1hcmsiKSkpID49IDApIHsKKyAgICAgICAgKmRpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcmsgPSB0cnVlOworICAgICAgICBoZWFkZXJzLT5yZW1vdmVJdGVtc0F0KGluZGV4KTsKKworICAgICAgICBBTE9HVigiQ2xpZW50IHJlcXVlc3RlZCBkaXNjb25uZWN0aW9uIGF0IGhpZ2h3YXRlciBtYXJrIik7CisgICAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZGF0YXNvdXJjZS9pbmNsdWRlL2RhdGFzb3VyY2UvRGF0YVNvdXJjZUZhY3RvcnkuaCBiL21lZGlhL2xpYmRhdGFzb3VyY2UvaW5jbHVkZS9kYXRhc291cmNlL0RhdGFTb3VyY2VGYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk0YWJlMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmRhdGFzb3VyY2UvaW5jbHVkZS9kYXRhc291cmNlL0RhdGFTb3VyY2VGYWN0b3J5LmgKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgREFUQV9TT1VSQ0VfRkFDVE9SWV9IXworCisjZGVmaW5lIERBVEFfU09VUkNFX0ZBQ1RPUllfSF8KKworI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTWVkaWFIVFRQU2VydmljZTsKK2NsYXNzIFN0cmluZzg7CitzdHJ1Y3QgSFRUUEJhc2U7CisKK2NsYXNzIERhdGFTb3VyY2VGYWN0b3J5IDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIHN0YXRpYyBzcDxEYXRhU291cmNlRmFjdG9yeT4gZ2V0SW5zdGFuY2UoKTsKKyAgICBzcDxEYXRhU291cmNlPiBDcmVhdGVGcm9tVVJJKAorICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAorICAgICAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMgPSBOVUxMLAorICAgICAgICAgICAgU3RyaW5nOCAqY29udGVudFR5cGUgPSBOVUxMLAorICAgICAgICAgICAgSFRUUEJhc2UgKmh0dHBTb3VyY2UgPSBOVUxMKTsKKworICAgIHZpcnR1YWwgc3A8RGF0YVNvdXJjZT4gQ3JlYXRlTWVkaWFIVFRQKGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSk7CisgICAgc3A8RGF0YVNvdXJjZT4gQ3JlYXRlRnJvbUZkKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgc3A8RGF0YVNvdXJjZT4gQ3JlYXRlRmlsZVNvdXJjZShjb25zdCBjaGFyICp1cmkpOworICAgIERhdGFTb3VyY2VGYWN0b3J5KCkge307CisgICAgdmlydHVhbCB+RGF0YVNvdXJjZUZhY3RvcnkoKSB7fTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgc3A8RGF0YVNvdXJjZUZhY3Rvcnk+IHNJbnN0YW5jZTsKKyAgICBzdGF0aWMgTXV0ZXggc0luc3RhbmNlTG9jazsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gREFUQV9TT1VSQ0VfRkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmggYi9tZWRpYS9saWJkYXRhc291cmNlL2luY2x1ZGUvZGF0YXNvdXJjZS9EYXRhVVJJU291cmNlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVVSSVNvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJkYXRhc291cmNlL2luY2x1ZGUvZGF0YXNvdXJjZS9EYXRhVVJJU291cmNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmRhdGFzb3VyY2UvaW5jbHVkZS9kYXRhc291cmNlL0ZpbGVTb3VyY2UuaCBiL21lZGlhL2xpYmRhdGFzb3VyY2UvaW5jbHVkZS9kYXRhc291cmNlL0ZpbGVTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWUwYzMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZGF0YXNvdXJjZS9pbmNsdWRlL2RhdGFzb3VyY2UvRmlsZVNvdXJjZS5oCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEZJTEVfU09VUkNFX0hfCisKKyNkZWZpbmUgRklMRV9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRmlsZVNvdXJjZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKK3B1YmxpYzoKKyAgICBGaWxlU291cmNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKyAgICAvLyBGaWxlU291cmNlIHRha2VzIG93bmVyc2hpcCBhbmQgd2lsbCBjbG9zZSB0aGUgZmQKKyAgICBGaWxlU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgeworICAgICAgICByZXR1cm4ga0lzTG9jYWxGaWxlU291cmNlOworICAgIH0KKworICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG1OYW1lOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkZpbGVTb3VyY2UoKTsKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0X2wob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIGludCBtRmQ7CisgICAgaW50NjRfdCBtT2Zmc2V0OworICAgIGludDY0X3QgbUxlbmd0aDsKKyAgICBNdXRleCBtTG9jazsKKworcHJpdmF0ZToKKyAgICBTdHJpbmc4IG1OYW1lOworCisgICAgRmlsZVNvdXJjZShjb25zdCBGaWxlU291cmNlICYpOworICAgIEZpbGVTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBGaWxlU291cmNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBGSUxFX1NPVVJDRV9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJkYXRhc291cmNlL2luY2x1ZGUvZGF0YXNvdXJjZS9IVFRQQmFzZS5oIGIvbWVkaWEvbGliZGF0YXNvdXJjZS9pbmNsdWRlL2RhdGFzb3VyY2UvSFRUUEJhc2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjIwMTg3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZGF0YXNvdXJjZS9pbmNsdWRlL2RhdGFzb3VyY2UvSFRUUEJhc2UuaApAQCAtMCwwICsxLDkwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBIVFRQX0JBU0VfSF8KKworI2RlZmluZSBIVFRQX0JBU0VfSF8KKworI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBIVFRQQmFzZSA6IHB1YmxpYyBEYXRhU291cmNlIHsKKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgLy8gRG9uJ3QgbG9nIGFueSBVUkxzLgorICAgICAgICBrRmxhZ0luY29nbml0byA9IDEKKyAgICB9OworCisgICAgSFRUUEJhc2UoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gTlVMTCwKKyAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gMCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKSA9IDA7CisKKyAgICAvLyBSZXR1cm5zIHRydWUgaWYgYmFuZHdpZHRoIGNvdWxkIHN1Y2Nlc3NmdWxseSBiZSBlc3RpbWF0ZWQsCisgICAgLy8gZmFsc2Ugb3RoZXJ3aXNlLgorICAgIHZpcnR1YWwgYm9vbCBlc3RpbWF0ZUJhbmR3aWR0aChpbnQzMl90ICpiYW5kd2lkdGhfYnBzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RXN0aW1hdGVkQmFuZHdpZHRoS2JwcyhpbnQzMl90ICprYnBzKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QmFuZHdpZHRoU3RhdENvbGxlY3RGcmVxKGludDMyX3QgZnJlcU1zKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRCYW5kd2lkdGhIaXN0b3J5U2l6ZShzaXplX3QgbnVtSGlzdG9yeUl0ZW1zKTsKKworICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpIHsKKyAgICAgICAgcmV0dXJuIG1OYW1lOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgdm9pZCBhZGRCYW5kd2lkdGhNZWFzdXJlbWVudChzaXplX3QgbnVtQnl0ZXMsIGludDY0X3QgZGVsYXlVcyk7CisgICAgU3RyaW5nOCBtTmFtZTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgQmFuZHdpZHRoRW50cnkgeworICAgICAgICBpbnQ2NF90IG1EZWxheVVzOworICAgICAgICBzaXplX3QgbU51bUJ5dGVzOworICAgIH07CisKKyAgICBNdXRleCBtTG9jazsKKworICAgIExpc3Q8QmFuZHdpZHRoRW50cnk+IG1CYW5kd2lkdGhIaXN0b3J5OworICAgIHNpemVfdCBtTnVtQmFuZHdpZHRoSGlzdG9yeUl0ZW1zOworICAgIGludDY0X3QgbVRvdGFsVHJhbnNmZXJUaW1lVXM7CisgICAgc2l6ZV90IG1Ub3RhbFRyYW5zZmVyQnl0ZXM7CisgICAgc2l6ZV90IG1NYXhCYW5kd2lkdGhIaXN0b3J5SXRlbXM7CisKKyAgICBlbnVtIHsKKyAgICAgICAga01pbkJhbmR3aWR0aENvbGxlY3RGcmVxTXMgPSAxMDAwLCAgIC8vIDEgc2Vjb25kCisgICAgICAgIGtNYXhCYW5kd2lkdGhDb2xsZWN0RnJlcU1zID0gNjAwMDAsICAvLyBvbmUgbWludXRlCisgICAgfTsKKworICAgIGludDY0X3QgbVByZXZCYW5kd2lkdGhNZWFzdXJlVGltZVVzOworICAgIGludDMyX3QgbVByZXZFc3RpbWF0ZWRCYW5kV2lkdGhLYnBzOworICAgIGludDMyX3QgbUJhbmRXaWR0aENvbGxlY3RGcmVxTXM7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhIVFRQQmFzZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEhUVFBfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZGF0YXNvdXJjZS9pbmNsdWRlL2RhdGFzb3VyY2UvTWVkaWFIVFRQLmggYi9tZWRpYS9saWJkYXRhc291cmNlL2luY2x1ZGUvZGF0YXNvdXJjZS9NZWRpYUhUVFAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOGQyMDNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZGF0YXNvdXJjZS9pbmNsdWRlL2RhdGFzb3VyY2UvTWVkaWFIVFRQLmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfSFRUUF9IXworCisjZGVmaW5lIE1FRElBX0hUVFBfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorCisjaW5jbHVkZSAiSFRUUEJhc2UuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTWVkaWFIVFRQQ29ubmVjdGlvbjsKKworc3RydWN0IE1lZGlhSFRUUCA6IHB1YmxpYyBIVFRQQmFzZSB7CisgICAgTWVkaWFIVFRQKGNvbnN0IHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgY29ubmVjdCgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICAgICAgb2ZmNjRfdCBvZmZzZXQpOworCisgICAgdmlydHVhbCB2b2lkIGNsb3NlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2l6ZShvZmY2NF90ICpzaXplKTsKKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVjb25uZWN0QXRPZmZzZXQob2ZmNjRfdCBvZmZzZXQpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TWVkaWFIVFRQKCk7CisKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCk7CisgICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3Q7CisKKyAgICBBU3RyaW5nIG1MYXN0VVJJOworCitwcml2YXRlOgorICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7CisgICAgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gbUhUVFBDb25uZWN0aW9uOworCisgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUxhc3RIZWFkZXJzOworCisgICAgYm9vbCBtQ2FjaGVkU2l6ZVZhbGlkOworICAgIG9mZjY0X3QgbUNhY2hlZFNpemU7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZWRpYUhUVFApOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9IVFRQX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJkYXRhc291cmNlL2luY2x1ZGUvZGF0YXNvdXJjZS9OdUNhY2hlZFNvdXJjZTIuaCBiL21lZGlhL2xpYmRhdGFzb3VyY2UvaW5jbHVkZS9kYXRhc291cmNlL051Q2FjaGVkU291cmNlMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMjUzYWQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJkYXRhc291cmNlL2luY2x1ZGUvZGF0YXNvdXJjZS9OdUNhY2hlZFNvdXJjZTIuaApAQCAtMCwwICsxLDE1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTlVfQ0FDSEVEX1NPVVJDRV8yX0hfCisKKyNkZWZpbmUgTlVfQ0FDSEVEX1NPVVJDRV8yX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXJSZWZsZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUxvb3BlcjsKK3N0cnVjdCBQYWdlQ2FjaGU7CisKK3N0cnVjdCBOdUNhY2hlZFNvdXJjZTIgOiBwdWJsaWMgRGF0YVNvdXJjZSB7CisgICAgc3RhdGljIHNwPE51Q2FjaGVkU291cmNlMj4gQ3JlYXRlKAorICAgICAgICAgICAgY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSwKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNhY2hlQ29uZmlnID0gTlVMTCwKKyAgICAgICAgICAgIGJvb2wgZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyayA9IGZhbHNlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKworICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7CisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOworCisgICAgdmlydHVhbCBTdHJpbmc4IGdldFVyaSgpOworCisgICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIFN0cmluZzggdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBtTmFtZTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBnZXRBdmFpbGFibGVTaXplKG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90ICpzaXplKTsKKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHNpemVfdCBjYWNoZWRTaXplKCk7CisgICAgc2l6ZV90IGFwcHJveERhdGFSZW1haW5pbmcoc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdDsKKworICAgIHZvaWQgcmVzdW1lRmV0Y2hpbmdJZk5lY2Vzc2FyeSgpOworCisgICAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBzdXBwb3J0ZWQgb25seSBpZiB0aGUKKyAgICAvLyBkYXRhIHNvdXJjZSBpcyBIVFRQLWJhc2VkOyBvdGhlcndpc2UsIEVSUk9SX1VOU1VQUE9SVEVECisgICAgLy8gaXMgcmV0dXJuZWQuCisgICAgc3RhdHVzX3QgZ2V0RXN0aW1hdGVkQmFuZHdpZHRoS2JwcyhpbnQzMl90ICprYnBzKTsKKyAgICBzdGF0dXNfdCBzZXRDYWNoZVN0YXRDb2xsZWN0RnJlcShpbnQzMl90IGZyZXFNcyk7CisKKyAgICBzdGF0aWMgdm9pZCBSZW1vdmVDYWNoZVNwZWNpZmljSGVhZGVycygKKyAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAorICAgICAgICAgICAgU3RyaW5nOCAqY2FjaGVDb25maWcsCisgICAgICAgICAgICBib29sICpkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfk51Q2FjaGVkU291cmNlMigpOworCitwcml2YXRlOgorICAgIGZyaWVuZCBzdHJ1Y3QgQUhhbmRsZXJSZWZsZWN0b3I8TnVDYWNoZWRTb3VyY2UyPjsKKworICAgIE51Q2FjaGVkU291cmNlMigKKyAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICpjYWNoZUNvbmZpZywKKyAgICAgICAgICAgIGJvb2wgZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyayk7CisKKyAgICBlbnVtIHsKKyAgICAgICAga1BhZ2VTaXplICAgICAgICAgICAgICAgICAgICAgICA9IDY1NTM2LAorICAgICAgICBrRGVmYXVsdEhpZ2hXYXRlclRocmVzaG9sZCAgICAgID0gMjAgKiAxMDI0ICogMTAyNCwKKyAgICAgICAga0RlZmF1bHRMb3dXYXRlclRocmVzaG9sZCAgICAgICA9IDQgKiAxMDI0ICogMTAyNCwKKworICAgICAgICAvLyBSZWFkIGRhdGEgYWZ0ZXIgYSAxNSBzZWMgdGltZW91dCB3aGV0aGVyIHdlJ3JlIGFjdGl2ZWx5CisgICAgICAgIC8vIGZldGNoaW5nIG9yIG5vdC4KKyAgICAgICAga0RlZmF1bHRLZWVwQWxpdmVJbnRlcnZhbFVzICAgICA9IDE1MDAwMDAwLAorICAgIH07CisKKyAgICBlbnVtIHsKKyAgICAgICAga1doYXRGZXRjaE1vcmUgID0gJ2ZldGMnLAorICAgICAgICBrV2hhdFJlYWQgICAgICAgPSAncmVhZCcsCisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBrTWF4TnVtUmV0cmllcyA9IDEwLAorICAgIH07CisKKyAgICBzcDxEYXRhU291cmNlPiBtU291cmNlOworICAgIHNwPEFIYW5kbGVyUmVmbGVjdG9yPE51Q2FjaGVkU291cmNlMj4gPiBtUmVmbGVjdG9yOworICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7CisgICAgU3RyaW5nOCBtTmFtZTsKKworICAgIE11dGV4IG1TZXJpYWxpemVyOworICAgIG11dGFibGUgTXV0ZXggbUxvY2s7CisgICAgQ29uZGl0aW9uIG1Db25kaXRpb247CisKKyAgICBQYWdlQ2FjaGUgKm1DYWNoZTsKKyAgICBvZmY2NF90IG1DYWNoZU9mZnNldDsKKyAgICBzdGF0dXNfdCBtRmluYWxTdGF0dXM7CisgICAgb2ZmNjRfdCBtTGFzdEFjY2Vzc1BvczsKKyAgICBzcDxBTWVzc2FnZT4gbUFzeW5jUmVzdWx0OworICAgIGJvb2wgbUZldGNoaW5nOworICAgIGJvb2wgbURpc2Nvbm5lY3Rpbmc7CisgICAgaW50NjRfdCBtTGFzdEZldGNoVGltZVVzOworCisgICAgaW50MzJfdCBtTnVtUmV0cmllc0xlZnQ7CisKKyAgICBzaXplX3QgbUhpZ2h3YXRlclRocmVzaG9sZEJ5dGVzOworICAgIHNpemVfdCBtTG93d2F0ZXJUaHJlc2hvbGRCeXRlczsKKworICAgIC8vIElmIHRoZSBrZWVwLWFsaXZlIGludGVydmFsIGlzIDAsIGtlZXAtYWxpdmVzIGFyZSBkaXNhYmxlZC4KKyAgICBpbnQ2NF90IG1LZWVwQWxpdmVJbnRlcnZhbFVzOworCisgICAgYm9vbCBtRGlzY29ubmVjdEF0SGlnaHdhdGVybWFyazsKKworICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHZvaWQgb25GZXRjaCgpOworICAgIHZvaWQgb25SZWFkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKKworICAgIHZvaWQgZmV0Y2hJbnRlcm5hbCgpOworICAgIHNzaXplX3QgcmVhZEludGVybmFsKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgICAgc3RhdHVzX3Qgc2Vla0ludGVybmFsX2wob2ZmNjRfdCBvZmZzZXQpOworCisgICAgc2l6ZV90IGFwcHJveERhdGFSZW1haW5pbmdfbChvZmY2NF90IG9mZnNldCwgc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdDsKKworICAgIHZvaWQgcmVzdGFydFByZWZldGNoZXJJZk5lY2Vzc2FyeV9sKAorICAgICAgICAgICAgYm9vbCBpZ25vcmVMb3dXYXRlclRocmVzaG9sZCA9IGZhbHNlLCBib29sIGZvcmNlID0gZmFsc2UpOworCisgICAgdm9pZCB1cGRhdGVDYWNoZVBhcmFtc0Zyb21TeXN0ZW1Qcm9wZXJ0eSgpOworICAgIHZvaWQgdXBkYXRlQ2FjaGVQYXJhbXNGcm9tU3RyaW5nKGNvbnN0IGNoYXIgKnMpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTnVDYWNoZWRTb3VyY2UyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTlVfQ0FDSEVEX1NPVVJDRV8yX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvQW5kcm9pZC5icAppbmRleCA1ZmE5ZGE5Li44NDc2ZjgyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL0FuZHJvaWQuYnAKQEAgLTEzLDYgKzEzLDggQEAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnRpbnl4bWwyIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIl0sCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9pbmNsdWRlL21lZGlhL0VmZmVjdHNDb25maWcuaCBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0NvbmZpZy5oCmluZGV4IGZhMDQxNWIuLmVmMTBlMGQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0NvbmZpZy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL2luY2x1ZGUvbWVkaWEvRWZmZWN0c0NvbmZpZy5oCkBAIC03Niw2ICs3NiwxMCBAQAogdXNpbmcgT3V0cHV0U3RyZWFtID0gU3RyZWFtPGF1ZGlvX3N0cmVhbV90eXBlX3Q+OwogdXNpbmcgSW5wdXRTdHJlYW0gPSBTdHJlYW08YXVkaW9fc291cmNlX3Q+OwogCitzdHJ1Y3QgRGV2aWNlRWZmZWN0cyA6IFN0cmVhbTxhdWRpb19kZXZpY2VzX3Q+IHsKKyAgICBzdGQ6OnN0cmluZyBhZGRyZXNzOworfTsKKwogLyoqIFBhcnNlZCBjb25maWd1cmF0aW9uLgogICogSW50ZW5kZWQgdG8gYmUgYSB0cmFuc2llbnQgc3RydWN0dXJlIG9ubHkgdXNlZCBmb3IgZGVzZXJpYWxpemF0aW9uLgogICogTm90ZTogRXZlcnl0aGluZyBpcyBjb3BpZWQgaW4gdGhlIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgeG1sIGRvbS4KQEAgLTg5LDYgKzkzLDcgQEAKICAgICBFZmZlY3RzIGVmZmVjdHM7CiAgICAgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtPiBwb3N0cHJvY2VzczsKICAgICBzdGQ6OnZlY3RvcjxJbnB1dFN0cmVhbT4gcHJlcHJvY2VzczsKKyAgICBzdGQ6OnZlY3RvcjxEZXZpY2VFZmZlY3RzPiBkZXZpY2Vwcm9jZXNzOwogfTsKIAogLyoqIFJlc3VsdCBvZiBgcGFyc2UoY29uc3QgY2hhciopYCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvc3JjL0VmZmVjdHNDb25maWcuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9jb25maWcvc3JjL0VmZmVjdHNDb25maWcuY3BwCmluZGV4IDc2YjRhZGMuLjg1ZmJmMTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvY29uZmlnL3NyYy9FZmZlY3RzQ29uZmlnLmNwcAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2NvbmZpZy9zcmMvRWZmZWN0c0NvbmZpZy5jcHAKQEAgLTI2LDYgKzI2LDcgQEAKICNpbmNsdWRlIDxsb2cvbG9nLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzQ29uZmlnLmg+CisjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgogCiB1c2luZyBuYW1lc3BhY2UgdGlueXhtbDI7CiAKQEAgLTEwMCw2ICsxMDEsNyBAQAogICAgICAgICB7QVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUsICJlbmZvcmNlZF9hdWRpYmxlIn0sCiAgICAgICAgIHtBVURJT19TVFJFQU1fRFRNRiwgImR0bWYifSwKICAgICAgICAge0FVRElPX1NUUkVBTV9UVFMsICJ0dHMifSwKKyAgICAgICAge0FVRElPX1NUUkVBTV9BU1NJU1RBTlQsICJhc3Npc3RhbnQifSwKIH07CiAKIC8qKiBBbGwgaW5wdXQgc3RyZWFtIHR5cGVzIHdoaWNoIHN1cHBvcnQgZWZmZWN0cy4KQEAgLTExNSw2ICsxMTcsOSBAQAogICAgICAgICB7QVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OLCAidm9pY2VfcmVjb2duaXRpb24ifSwKICAgICAgICAge0FVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OLCAidm9pY2VfY29tbXVuaWNhdGlvbiJ9LAogICAgICAgICB7QVVESU9fU09VUkNFX1VOUFJPQ0VTU0VELCAidW5wcm9jZXNzZWQifSwKKyAgICAgICAge0FVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRSwgInZvaWNlX3BlcmZvcm1hbmNlIn0sCisgICAgICAgIHtBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UsICJlY2hvX3JlZmVyZW5jZSJ9LAorICAgICAgICB7QVVESU9fU09VUkNFX0ZNX1RVTkVSLCAiZm1fdHVuZXIifSwKIH07CiAKIC8qKiBGaW5kIHRoZSBzdHJlYW0gdHlwZSBlbnVtIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHN0cmVhbSB0eXBlIG5hbWUgb3IgcmV0dXJuIGZhbHNlICovCkBAIC0xMzAsNiArMTM1LDExIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCit0ZW1wbGF0ZSA8PgorYm9vbCBzdHJpbmdUb1N0cmVhbVR5cGUoY29uc3QgY2hhciAqc3RyZWFtTmFtZSwgYXVkaW9fZGV2aWNlc190KiB0eXBlKSB7CisgICAgcmV0dXJuIGRldmljZUZyb21TdHJpbmcoc3RyZWFtTmFtZSwgKnR5cGUpOworfQorCiAvKiogUGFyc2UgYSBsaWJyYXJ5IHhtbCBub3RlIGFuZCBwdXNoIHRoZSByZXN1bHQgaW4gbGlicmFyaWVzIG9yIHJldHVybiBmYWxzZSBvbiBmYWlsdXJlLiAqLwogYm9vbCBwYXJzZUxpYnJhcnkoY29uc3QgWE1MRWxlbWVudCYgeG1sTGlicmFyeSwgTGlicmFyaWVzKiBsaWJyYXJpZXMpIHsKICAgICBjb25zdCBjaGFyKiBuYW1lID0geG1sTGlicmFyeS5BdHRyaWJ1dGUoIm5hbWUiKTsKQEAgLTIxNyw3ICsyMjcsNyBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi0vKiogUGFyc2UgYW4gc3RyZWFtIGZyb20gYW4geG1sIGVsZW1lbnQgZGVzY3JpYmluZyBpdC4KKy8qKiBQYXJzZSBhbiA8T3V0cHV0fElucHV0PnN0cmVhbSBvciBhIGRldmljZSBmcm9tIGFuIHhtbCBlbGVtZW50IGRlc2NyaWJpbmcgaXQuCiAgKiBAcmV0dXJuIHRydWUgYW5kIHB1c2hlcyB0aGUgc3RyZWFtIGluIHN0cmVhbXMgb24gc3VjY2VzcywKICAqICAgICAgICAgZmFsc2Ugb24gZmFpbHVyZS4gKi8KIHRlbXBsYXRlIDxjbGFzcyBTdHJlYW0+CkBAIC0yMjksMTQgKzIzOSwxNCBAQAogICAgIH0KICAgICBTdHJlYW0gc3RyZWFtOwogICAgIGlmICghc3RyaW5nVG9TdHJlYW1UeXBlKHN0cmVhbVR5cGUsICZzdHJlYW0udHlwZSkpIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgc3RyZWFtIHR5cGUgJXM6ICVzIiwgc3RyZWFtVHlwZSwgZHVtcCh4bWxTdHJlYW0pKTsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgPHN0cmVhbXxkZXZpY2U+IHR5cGUgJXM6ICVzIiwgc3RyZWFtVHlwZSwgZHVtcCh4bWxTdHJlYW0pKTsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAogICAgIGZvciAoYXV0byYgeG1sQXBwbHkgOiBnZXRDaGlsZHJlbih4bWxTdHJlYW0sICJhcHBseSIpKSB7CiAgICAgICAgIGNvbnN0IGNoYXIqIGVmZmVjdE5hbWUgPSB4bWxBcHBseS5nZXQoKS5BdHRyaWJ1dGUoImVmZmVjdCIpOwogICAgICAgICBpZiAoZWZmZWN0TmFtZSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgic3RyZWFtL2FwcGx5IG11c3QgaGF2ZSByZWZlcmVuY2UgYW4gZWZmZWN0OiAlcyIsIGR1bXAoeG1sQXBwbHkpKTsKKyAgICAgICAgICAgIEFMT0dFKCI8c3RyZWFtfGRldmljZT4vYXBwbHkgbXVzdCBoYXZlIHJlZmVyZW5jZSBhbiBlZmZlY3Q6ICVzIiwgZHVtcCh4bWxBcHBseSkpOwogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICAgIGF1dG8qIGVmZmVjdCA9IGZpbmRCeU5hbWUoZWZmZWN0TmFtZSwgZWZmZWN0cyk7CkBAIC0yNTAsNiArMjYwLDIxIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgcGFyc2VEZXZpY2VFZmZlY3RzKAorICAgICAgICBjb25zdCBYTUxFbGVtZW50JiB4bWxEZXZpY2UsIEVmZmVjdHMmIGVmZmVjdHMsIHN0ZDo6dmVjdG9yPERldmljZUVmZmVjdHM+KiBkZXZpY2VFZmZlY3RzKSB7CisKKyAgICBjb25zdCBjaGFyKiBhZGRyZXNzID0geG1sRGV2aWNlLkF0dHJpYnV0ZSgiYWRkcmVzcyIpOworICAgIGlmIChhZGRyZXNzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoImRldmljZSBtdXN0IGhhdmUgYW4gYWRkcmVzczogJXMiLCBkdW1wKHhtbERldmljZSkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghcGFyc2VTdHJlYW0oeG1sRGV2aWNlLCBlZmZlY3RzLCBkZXZpY2VFZmZlY3RzKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGRldmljZUVmZmVjdHMtPmJhY2soKS5hZGRyZXNzID0gYWRkcmVzczsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwogLyoqIEludGVybmFsIHZlcnNpb24gb2YgdGhlIHB1YmxpYyBwYXJzZShjb25zdCBjaGFyKiBwYXRoKSB3aGVyZSBwYXRoIGFsd2F5cyBleGlzdC4gKi8KIFBhcnNpbmdSZXN1bHQgcGFyc2VXaXRoUGF0aChzdGQ6OnN0cmluZyYmIHBhdGgpIHsKICAgICBYTUxEb2N1bWVudCBkb2M7CkBAIC0yOTQsNiArMzE5LDE0IEBACiAgICAgICAgICAgICAgICAgcmVnaXN0ZXJGYWlsdXJlKHBhcnNlU3RyZWFtKHhtbFN0cmVhbSwgY29uZmlnLT5lZmZlY3RzLCAmY29uZmlnLT5wb3N0cHJvY2VzcykpOwogICAgICAgICAgICAgfQogICAgICAgICB9CisKKyAgICAgICAgLy8gUGFyc2UgZGV2aWNlIGVmZmVjdCBjaGFpbnMKKyAgICAgICAgZm9yIChhdXRvJiB4bWxEZXZpY2VFZmZlY3RzIDogZ2V0Q2hpbGRyZW4oeG1sQ29uZmlnLCAiZGV2aWNlRWZmZWN0cyIpKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8mIHhtbERldmljZSA6IGdldENoaWxkcmVuKHhtbERldmljZUVmZmVjdHMsICJkZXZpY2VQb3J0IikpIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlckZhaWx1cmUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VEZXZpY2VFZmZlY3RzKHhtbERldmljZSwgY29uZmlnLT5lZmZlY3RzLCAmY29uZmlnLT5kZXZpY2Vwcm9jZXNzKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHtzdGQ6Om1vdmUoY29uZmlnKSwgbmJTa2lwcGVkRWxlbWVudHMsIHN0ZDo6bW92ZShwYXRoKX07CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2RhdGEvYXVkaW9fZWZmZWN0cy54bWwgYi9tZWRpYS9saWJlZmZlY3RzL2RhdGEvYXVkaW9fZWZmZWN0cy54bWwKaW5kZXggM2Y4NTA1Mi4uMmU1ZjUyOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9kYXRhL2F1ZGlvX2VmZmVjdHMueG1sCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZGF0YS9hdWRpb19lZmZlY3RzLnhtbApAQCAtOTksNCArOTksMzEgQEAKICAgICAgICAgPC9wb3N0cHJvY2Vzcz4KICAgICAtLT4KIAorICAgICA8IS0tIERldmljZSBwcmUvcG9zdCBwcm9jZXNzb3IgY29uZmlndXJhdGlvbnMuCisgICAgICAgICAgVGhlIGRldmljZSBwcmUvcG9zdCBwcm9jZXNzb3IgY29uZmlndXJhdGlvbiBpcyBkZXNjcmliZWQgaW4gYSBkZXZpY2VFZmZlY3RzIGVsZW1lbnQgYW5kCisgICAgICAgICAgY29uc2lzdHMgaW4gYSBsaXN0IG9mIGVsZW1lbnRzIGVhY2ggZGVzY3JpYmluZyBwcmUvcG9zdCBwcm9lY2Vzc29yIHNldHRpbmdzIGZvciBhIGdpdmVuCisgICAgICAgICAgZGV2aWNlIG9yICJkZXZpY2VQb3J0Ii4KKyAgICAgICAgICBFYWNoIGRldmljZVBvcnQgZWxlbWVudCBoYXMgYSAidHlwZSIgYXR0cmlidXRlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRldmljZSB0eXBlIChlLmcuCisgICAgICAgICAgc3BlYWtlciwgYnVzKSwgYW4gImFkZHJlc3MiIGF0dHJpYnV0ZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBkZXZpY2UgYWRkcmVzcyBhbmQgY29udGFpbnMgYQorICAgICAgICAgIGxpc3Qgb2YgImFwcGx5IiBlbGVtZW50cyBpbmRpY2F0aW5nIG9uZSBlZmZlY3QgdG8gYXBwbHkuCisgICAgICAgICAgSWYgdGhlIGRldmljZSBpcyBhIHNvdXJjZSwgb25seSBwcmUgcHJvY2Vzc2luZyBlZmZlY3RzIGFyZSBleHBlY3RlZCwgaWYgdGhlCisgICAgICAgICAgZGV2aWNlIGlzIGEgc2luaywgb25seSBwb3N0IHByb2Nlc3NpbmcgZWZmZWN0cyBhcmUgZXhwZWN0ZWQuCisgICAgICAgICAgVGhlIGVmZmVjdCB0byBhcHBseSBpcyBkZXNpZ25hdGVkIGJ5IGl0cyBuYW1lIGluIHRoZSAiZWZmZWN0cyIgZWxlbWVudHMuCisgICAgICAgICAgVGhlIGVmZmVjdCB3aWxsIGJlIGVuYWJsZWQgYnkgZGVmYXVsdCBhbmQgdGhlIGF1ZGlvIGZyYW1ld29yayB3aWxsIGF1dG9tYXRpY2FsbHkgYWRkCisgICAgICAgICAgYW5kIGFjdGl2YXRlIHRoZSBlZmZlY3QgaWYgdGhlIGdpdmVuIHBvcnQgaXMgaW52b2x2ZWQgaW4gYW4gYXVkaW8gcGF0Y2guCisgICAgICAgICAgSWYgdGhlIHBhdGNoIGlzICJIVyIsIHRoZSBlZmZlY3QgbXVzdCBiZSBIVyBhY2NlbGVyYXRlZC4KKworICAgICAgICA8ZGV2aWNlRWZmZWN0cz4KKyAgICAgICAgICAgIDxkZXZpY2VQb3J0IHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQlVTIiBhZGRyZXNzPSJCVVMwMF9VU0FHRV9NQUlOIj4KKyAgICAgICAgICAgICAgICA8YXBwbHkgZWZmZWN0PSJlcXVhbGl6ZXIiLz4KKyAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgIDxkZXZpY2VQb3J0IHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQlVTIiBhZGRyZXNzPSJCVVMwNF9VU0FHRV9WT0lDRSI+CisgICAgICAgICAgICAgICAgPGFwcGx5IGVmZmVjdD0idm9sdW1lIi8+CisgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0eXBlPSJBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMiIGFkZHJlc3M9ImJvdHRvbSI+CisgICAgICAgICAgICAgICAgPGFwcGx5IGVmZmVjdD0iYWdjIi8+CisgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgIDwvZGV2aWNlRWZmZWN0cz4KKyAgICAtLT4KKwogPC9hdWRpb19lZmZlY3RzX2NvbmY+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLmJwCmluZGV4IDIyN2YyYTEuLjljODJiMWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9BbmRyb2lkLmJwCkBAIC0xMyw3ICsxMyw3IEBACiAgICAgcmVsYXRpdmVfaW5zdGFsbF9wYXRoOiAic291bmRmeCIsCiAKICAgICBjZmxhZ3M6IFsKLSAgICAgICAgLy8iLURCVUlMRF9GTE9BVCIsCisgICAgICAgICItREJVSUxEX0ZMT0FUIiwKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L0VmZmVjdERvd25taXguYwppbmRleCBiNGExZDc3Li45OWFjNGY1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvRWZmZWN0RG93bm1peC5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC9FZmZlY3REb3dubWl4LmMKQEAgLTMxLDEwICszMSwxMiBAQAogLy8gRG8gbm90IHN1Ym1pdCB3aXRoIERPV05NSVhfQUxXQVlTX1VTRV9HRU5FUklDX0RPV05NSVhFUiBkZWZpbmVkLCBzdHJpY3RseSBmb3IgdGVzdGluZwogLy8jZGVmaW5lIERPV05NSVhfQUxXQVlTX1VTRV9HRU5FUklDX0RPV05NSVhFUiAwCiAKLSNkZWZpbmUgTUlOVVNfM19EQl9JTl9RMTlfMTIgMjg5NiAvLyAtM2RCID0gMC43MDcgKiAyXjEyID0gMjg5NgotCiAjaWZkZWYgQlVJTERfRkxPQVQKICNkZWZpbmUgTUlOVVNfM19EQl9JTl9GTE9BVCAwLjcwNzEwNjc4ZiAvLyAtM2RCID0gMC43MDcxMDY3OGYKK2NvbnN0IGF1ZGlvX2Zvcm1hdF90IGdUYXJnZXRGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworI2Vsc2UKKyNkZWZpbmUgTUlOVVNfM19EQl9JTl9RMTlfMTIgMjg5NiAvLyAtM2RCID0gMC43MDcgKiAyXjEyID0gMjg5NgorY29uc3QgYXVkaW9fZm9ybWF0X3QgZ1RhcmdldEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOwogI2VuZGlmCiAKIC8vIHN1YnNldCBvZiBwb3NzaWJsZSBhdWRpb19jaGFubmVsX21hc2tfdCB2YWx1ZXMsIGFuZCBBVURJT19DSEFOTkVMX09VVF8qIHJlbmFtZWQgdG8gQ0hBTk5FTF9NQVNLXyoKQEAgLTcwMyw3ICs3MDUsNyBAQAogICAgIG1lbXNldCgmcER3bU1vZHVsZS0+Y29udGV4dCwgMCwgc2l6ZW9mKGRvd25taXhfb2JqZWN0X3QpKTsKIAogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKLSAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IGdUYXJnZXRGb3JtYXQ7CiAgICAgcER3bU1vZHVsZS0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMTsKICAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwRHdtTW9kdWxlLT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC03MTUsNyArNzE3LDcgQEAKIAogICAgIC8vIHNldCBhIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBhY2Nlc3MgbW9kZSwgYnV0IHNob3VsZCBiZSBvdmVyd3JpdHRlbiBieSBjYWxsZXIKICAgICBwRHdtTW9kdWxlLT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOwotICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBnVGFyZ2V0Rm9ybWF0OwogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgcER3bU1vZHVsZS0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBEd21Nb2R1bGUtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CkBAIC03NjIsOCArNzY0LDggQEAKICAgICAvLyBDaGVjayBjb25maWd1cmF0aW9uIGNvbXBhdGliaWxpdHkgd2l0aCBidWlsZCBvcHRpb25zLCBhbmQgZWZmZWN0IGNhcGFiaWxpdGllcwogICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZQogICAgICAgICB8fCBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMgIT0gRE9XTk1JWF9PVVRQVVRfQ0hBTk5FTFMKLSAgICAgICAgfHwgcENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCi0gICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHsKKyAgICAgICAgfHwgcENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IGdUYXJnZXRGb3JtYXQKKyAgICAgICAgfHwgcENvbmZpZy0+b3V0cHV0Q2ZnLmZvcm1hdCAhPSBnVGFyZ2V0Rm9ybWF0KSB7CiAgICAgICAgIEFMT0dFKCJEb3dubWl4X0NvbmZpZ3VyZSBlcnJvcjogaW52YWxpZCBjb25maWciKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQpAQCAtMTE4NSw4ICsxMTg3LDggQEAKICAgICBpZiAoYWNjdW11bGF0ZSkgewogICAgICAgICB3aGlsZSAobnVtRnJhbWVzKSB7CiAgICAgICAgICAgICAvLyBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IEZDKC0zZEIpICsgTEZFKC0zZEIpCi0gICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9RMTlfMTIpCi0gICAgICAgICAgICAgICAgICAgICsgKHBTcmNbM10gKiBNSU5VU18zX0RCX0lOX1ExOV8xMik7CisgICAgICAgICAgICBjZW50ZXJQbHVzTGZlQ29udHJpYiA9IChwU3JjWzJdICogTUlOVVNfM19EQl9JTl9GTE9BVCkKKyAgICAgICAgICAgICAgICAgICAgKyAocFNyY1szXSAqIE1JTlVTXzNfREJfSU5fRkxPQVQpOwogICAgICAgICAgICAgLy8gRkwgKyBjZW50ZXJQbHVzTGZlQ29udHJpYiArIFNMICsgUkwKICAgICAgICAgICAgIGx0ID0gcFNyY1swXSArIGNlbnRlclBsdXNMZmVDb250cmliICsgcFNyY1s2XSArIHBTcmNbNF07CiAgICAgICAgICAgICAvLyBGUiArIGNlbnRlclBsdXNMZmVDb250cmliICsgU1IgKyBSUgpAQCAtMTQyNyw0ICsxNDI5LDQgQEAKICAgICB9CiAgICAgcmV0dXJuIHRydWU7CiB9Ci0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNhZmM1NAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzAgQEAKKy8vIEJ1aWxkIHRlc3RiZW5jaCBmb3IgZG93bm1peCBtb2R1bGUuCitjY190ZXN0IHsKKyAgICBuYW1lOiJkb3dubWl4dGVzdCIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IGZhbHNlLAorICAgIHByb3ByaWV0YXJ5OiB0cnVlLAorICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9lZmZlY3RzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliZG93bm1peCIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICByZWxhdGl2ZV9pbnN0YWxsX3BhdGg6ICJzb3VuZGZ4IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgImRvd25taXh0ZXN0LmNwcCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2ggYi9tZWRpYS9saWJlZmZlY3RzL2Rvd25taXgvdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kMGZhZWJlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKQEAgLTAsMCArMSw2OSBAQAorIyEvYmluL2Jhc2gKKyMKKyNSdW4gdGVzdHMgaW4gdGhpcyBkaXJlY3RvcnkuCisjCisKK2lmIFsgLXogIiRBTkRST0lEX0JVSUxEX1RPUCIgXTsgdGhlbgorICAgIGVjaG8gIkFuZHJvaWQgYnVpbGQgZW52aXJvbm1lbnQgbm90IHNldCIKKyAgICBleGl0IC0xCitmaQorI2Vuc3VyZSB3ZSBoYXZlIG1tCisuICRBTkRST0lEX0JVSUxEX1RPUC9idWlsZC9lbnZzZXR1cC5zaAorCittbSAtagorCitlY2hvICJ3YWl0aW5nIGZvciBkZXZpY2UiCisKK2FkYiByb290ICYmIGFkYiB3YWl0LWZvci1kZXZpY2UgcmVtb3VudAorCisjbG9jYXRpb24gb2YgdGVzdCBmaWxlcwordGVzdGRpcj0iL2RhdGEvbG9jYWwvdG1wL2Rvd25taXh0ZXN0IgorCitmc19hcnI9KAorICAgIDgwMDAKKyAgICAxMTAyNQorICAgIDEyMDAwCisgICAgMTYwMDAKKyAgICAyMjA1MAorICAgIDI0MDAwCisgICAgMzIwMDAKKyAgICA0NDEwMAorICAgIDQ4MDAwCisgICAgODgyMDAKKyAgICA5NjAwMAorICAgIDE3NjQwMAorICAgIDE5MjAwMAorKQorCitlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IgorZWNobyAidGVzdGluZyBEb3dubWl4IgorYWRiIHNoZWxsIG1rZGlyICR0ZXN0ZGlyCisKK2FkYiBwdXNoICRBTkRST0lEX0JVSUxEX1RPUC9jdHMvdGVzdHMvdGVzdHMvbWVkaWEvcmVzL3Jhdy9zaW5lc3dlZXByYXcucmF3IFwKKyR0ZXN0ZGlyCithZGIgcHVzaCAkT1VUL3Rlc3RjYXNlcy9kb3dubWl4dGVzdC9hcm02NC9kb3dubWl4dGVzdCAkdGVzdGRpcgorCisjcnVuIHRoZSBkb3dubWl4IHRlc3QgYXBwbGljYXRpb24gZm9yIHRlc3QuCitmb3IgZnMgaW4gJHtmc19hcnJbKl19CitkbworICAgIGZvciBmX2NoIGluIHsxLi44fQorICAgIGRvCisgICAgICAgIGZvciBjaF9mbXQgaW4gezAuLjR9CisgICAgICAgIGRvCisgICAgICAgICAgICBhZGIgc2hlbGwgIExEX0xJQlJBUllfUEFUSD0vdmVuZG9yL2xpYjY0L3NvdW5kZnggXAorICAgICAgICAgICAgJHRlc3RkaXIvZG93bm1peHRlc3QgJHRlc3RkaXIvc2luZXN3ZWVwcmF3LnJhdyBcCisgICAgICAgICAgICAkdGVzdGRpci9zaW5lc3dlZXBfZm10XyQoKGNoX2ZtdCkpX2ZjaF8kKChmX2NoKSlfJCgoZnMpKS5yYXcgXAorICAgICAgICAgICAgLWNoX2ZtdDokY2hfZm10IC1mY2g6JGZfY2ggLWZzOiRmcworCisgICAgICAgICAgICAjIEltcGxlbWVudGF0aW9uIGRlcGVuZGVudCB0ZXN0OgorICAgICAgICAgICAgIyBjaGVjayB0aGF0IGhpZ2hlciBmcmVxdWVuY2llcyBtYXRjaCA4IGtIeiByZXN1bHQuCisgICAgICAgICAgICBpZiBbICRmcyAhPSA4MDAwIF0KKyAgICAgICAgICAgIHRoZW4KKyAgICAgICAgICAgICAgICBhZGIgc2hlbGwgY21wIFwKKyAgICAgICAgICAgICAgICAkdGVzdGRpci9zaW5lc3dlZXBfZm10XyQoKGNoX2ZtdCkpX2ZjaF8kKChmX2NoKSlfODAwMC5yYXcgXAorICAgICAgICAgICAgICAgICR0ZXN0ZGlyL3NpbmVzd2VlcF9mbXRfJCgoY2hfZm10KSlfZmNoXyQoKGZfY2gpKV8kKChmcykpLnJhdworICAgICAgICAgICAgZmkKKyAgICAgICAgZG9uZQorICAgIGRvbmUKK2RvbmUKK2FkYiBzaGVsbCBybSAtciAkdGVzdGRpcgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9kb3dubWl4L3Rlc3RzL2Rvd25taXh0ZXN0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9kb3dubWl4dGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFmODNlNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZG93bm1peC90ZXN0cy9kb3dubWl4dGVzdC5jcHAKQEAgLTAsMCArMSwzMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTEgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfZG93bm1peC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworI2luY2x1ZGUgIkVmZmVjdERvd25taXguaCIKKyNkZWZpbmUgRlJBTUVfTEVOR1RIIDI1NgorI2RlZmluZSBNQVhfTlVNX0NIQU5ORUxTIDgKKworc3RydWN0IGRvd25taXhfY250eHRfcyB7CisgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzYzsKKyAgZWZmZWN0X2hhbmRsZV90IGhhbmRsZTsKKyAgZWZmZWN0X2NvbmZpZ190IGNvbmZpZzsKKworICBpbnQgbnVtRmlsZUNoYW5uZWxzOworICBpbnQgbnVtUHJvY2Vzc0NoYW5uZWxzOworfTsKKworZXh0ZXJuIGF1ZGlvX2VmZmVjdF9saWJyYXJ5X3QgQVVESU9fRUZGRUNUX0xJQlJBUllfSU5GT19TWU07CisKK3ZvaWQgcHJpbnRVc2FnZSgpIHsKKyAgcHJpbnRmKCJcblVzYWdlOiIpOworICBwcmludGYoIlxuICAgICBkb3dubWl4dGVzdCA8aW5wdXRfZmlsZT4gPG91dF9maWxlPiBbb3B0aW9uc11cbiIpOworICBwcmludGYoIlxud2hlcmUsIik7CisgIHByaW50ZigiXG4gICAgIDxpbnB1dF9maWxlPiAgaXMgdGhlIGlucHV0IGZpbGUgbmFtZSIpOworICBwcmludGYoIlxuICAgICAgICAgICAgICAgICAgb24gd2hpY2ggTFZNIGVmZmVjdHMgYXJlIGFwcGxpZWQiKTsKKyAgcHJpbnRmKCJcbiAgICAgPG91dHB1dF9maWxlPiBwcm9jZXNzZWQgb3V0cHV0IGZpbGUiKTsKKyAgcHJpbnRmKCJcbiAgICAgYW5kIG9wdGlvbnMgYXJlIG1lbnRpb25lZCBiZWxvdyIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgICAtaCIpOworICBwcmludGYoIlxuICAgICAgICAgICBQcmludHMgdGhpcyB1c2FnZSBpbmZvcm1hdGlvbiIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1jaF9mbXQ6PGZvcm1hdF9vZl9pbnB1dF9hdWRpbz4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDA6QVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMShkZWZhdWx0KSIpOworICBwcmludGYoIlxuICAgICAgICAgMTpBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREUiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDI6QVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLIik7CisgIHByaW50ZigiXG4gICAgICAgICAzOkFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERSIpOworICBwcmludGYoIlxuICAgICAgICAgNDpBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0siKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtZmNoOjxmaWxlX2NoYW5uZWxzPiAoMSB0aHJvdWdoIDgpIik7CisgIHByaW50ZigiXG4iKTsKK30KKworaW50MzJfdCBEb3dubWl4RGVmYXVsdENvbmZpZyhlZmZlY3RfY29uZmlnX3QgKnBDb25maWcpIHsKKyAgcENvbmZpZy0+aW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CisgIHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgIHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMTsKKyAgcENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gbnVsbHB0cjsKKyAgcENvbmZpZy0+aW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IG51bGxwdHI7CisgIHBDb25maWctPmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmNvb2tpZSA9IG51bGxwdHI7CisgIHBDb25maWctPmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKKworICBwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSA0NDEwMDsKKyAgcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZTsKKworICAvLyBzZXQgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGUgYWNjZXNzIG1vZGUsIGJ1dCBzaG91bGQgYmUgb3ZlcndyaXR0ZW4gYnkgY2FsbGVyCisgIHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEU7CisgIHBDb25maWctPm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOworICBwQ29uZmlnLT5vdXRwdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgIHBDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBudWxscHRyOworICBwQ29uZmlnLT5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IG51bGxwdHI7CisgIHBDb25maWctPm91dHB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBudWxscHRyOworICBwQ29uZmlnLT5vdXRwdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworCisgIHJldHVybiAwOworfQorCitpbnQzMl90IERvd25taXhDb25maXVyZUFuZEVuYWJsZShkb3dubWl4X2NudHh0X3MgKnBEZXNjcmlwdG9yKSB7CisgIGVmZmVjdF9oYW5kbGVfdCAqZWZmZWN0SGFuZGxlID0gJnBEZXNjcmlwdG9yLT5oYW5kbGU7CisgIGRvd25taXhfbW9kdWxlX3QgKmRvd25taXhFZmZlY3RIYW5kbGUgPSAoZG93bm1peF9tb2R1bGVfdCAqKSplZmZlY3RIYW5kbGU7CisgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKkRvd25taXhfYXBpID0gZG93bm1peEVmZmVjdEhhbmRsZS0+aXRmZTsKKyAgaW50MzJfdCBlcnIgPSAwOworICB1aW50MzJfdCByZXBseVNpemUgPSAodWludDMyX3Qpc2l6ZW9mKGVycik7CisKKyAgZXJyID0gKERvd25taXhfYXBpLT5jb21tYW5kKSgqZWZmZWN0SGFuZGxlLCBFRkZFQ1RfQ01EX1NFVF9DT05GSUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVmZmVjdF9jb25maWdfdCksICYocERlc2NyaXB0b3ItPmNvbmZpZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJmVycik7CisgIGlmIChlcnIgIT0gMCkgeworICAgIEFMT0dFKCJEb3dubWl4IGNvbW1hbmQgdG8gY29uZmlndXJlIHJldHVybmVkIGFuIGVycm9yICVkIiwgZXJyKTsKKyAgICByZXR1cm4gZXJyOworICB9CisKKyAgZXJyID0gKChEb3dubWl4X2FwaS0+Y29tbWFuZCkpKCplZmZlY3RIYW5kbGUsIEVGRkVDVF9DTURfRU5BQkxFLCAwLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlcGx5U2l6ZSwgJmVycik7CisgIGlmIChlcnIgIT0gMCkgeworICAgIEFMT0dFKCJEb3dubWl4IGNvbW1hbmQgdG8gZW5hYmxlIGVmZmVjdCByZXR1cm5lZCBhbiBlcnJvciAlZCIsIGVycik7CisgICAgcmV0dXJuIGVycjsKKyAgfQorICByZXR1cm4gMDsKK30KKworaW50MzJfdCBEb3dubWl4RXhlY3V0ZShkb3dubWl4X2NudHh0X3MgKnBEZXNjcmlwdG9yLCBGSUxFICpmaW5wLAorICAgICAgICAgICAgICAgICAgICAgICBGSUxFICpmb3V0KSB7CisgIGVmZmVjdF9oYW5kbGVfdCAqZWZmZWN0SGFuZGxlID0gJnBEZXNjcmlwdG9yLT5oYW5kbGU7CisgIGRvd25taXhfbW9kdWxlX3QgKmRvd25taXhFZmZlY3RIYW5kbGUgPSAoZG93bm1peF9tb2R1bGVfdCAqKSplZmZlY3RIYW5kbGU7CisgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKkRvd25taXhfYXBpID0gZG93bm1peEVmZmVjdEhhbmRsZS0+aXRmZTsKKworICBjb25zdCBpbnQgbnVtRmlsZUNoYW5uZWxzID0gcERlc2NyaXB0b3ItPm51bUZpbGVDaGFubmVsczsKKyAgY29uc3QgaW50IG51bVByb2Nlc3NDaGFubmVscyA9IHBEZXNjcmlwdG9yLT5udW1Qcm9jZXNzQ2hhbm5lbHM7CisgIGNvbnN0IGludCBmaWxlRnJhbWVTaXplID0gbnVtRmlsZUNoYW5uZWxzICogc2l6ZW9mKHNob3J0KTsKKyAgY29uc3QgdW5zaWduZWQgaW50IG91dHB1dENoYW5uZWxzID0KKyAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOworCisgIHN0ZDo6dmVjdG9yPGZsb2F0PiBvdXRGbG9hdChGUkFNRV9MRU5HVEggKiBNQVhfTlVNX0NIQU5ORUxTKTsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGluRmxvYXQoRlJBTUVfTEVOR1RIICogTUFYX05VTV9DSEFOTkVMUyk7CisKKyAgYXVkaW9fYnVmZmVyX3QgaW5idWZmZXIsIG91dGJ1ZmZlcjsKKyAgaW5idWZmZXIuZjMyID0gaW5GbG9hdC5kYXRhKCk7CisgIG91dGJ1ZmZlci5mMzIgPSBvdXRGbG9hdC5kYXRhKCk7CisgIGluYnVmZmVyLmZyYW1lQ291bnQgPSBGUkFNRV9MRU5HVEg7CisgIG91dGJ1ZmZlci5mcmFtZUNvdW50ID0gRlJBTUVfTEVOR1RIOworCisgIGF1ZGlvX2J1ZmZlcl90ICpwaW5idWYsICpwb3V0YnVmOworICBwaW5idWYgPSAmaW5idWZmZXI7CisgIHBvdXRidWYgPSAmb3V0YnVmZmVyOworCisgIGludCBmcmFtZUNvdW50ZXIgPSAwOworICBzdGQ6OnZlY3RvcjxzaG9ydD4gaW5TMTYoRlJBTUVfTEVOR1RIICogTUFYX05VTV9DSEFOTkVMUyk7CisgIHN0ZDo6dmVjdG9yPHNob3J0PiBvdXRTMTYoRlJBTUVfTEVOR1RIICogTUFYX05VTV9DSEFOTkVMUyk7CisKKyAgd2hpbGUgKGZyZWFkKGluUzE2LmRhdGEoKSwgZmlsZUZyYW1lU2l6ZSwgRlJBTUVfTEVOR1RILCBmaW5wKSA9PQorICAgICAgICAgRlJBTUVfTEVOR1RIKSB7CisgICAgaWYgKG51bUZpbGVDaGFubmVscyAhPSBudW1Qcm9jZXNzQ2hhbm5lbHMpIHsKKyAgICAgIGFkanVzdF9jaGFubmVscyhpblMxNi5kYXRhKCksIG51bUZpbGVDaGFubmVscywgaW5TMTYuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgIG51bVByb2Nlc3NDaGFubmVscywgc2l6ZW9mKHNob3J0KSwKKyAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5HVEggKiBmaWxlRnJhbWVTaXplKTsKKyAgICB9CisKKyAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoaW5GbG9hdC5kYXRhKCksIGluUzE2LmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlJBTUVfTEVOR1RIICogbnVtUHJvY2Vzc0NoYW5uZWxzKTsKKworICAgIGNvbnN0IGludDMyX3QgZXJyID0gKERvd25taXhfYXBpLT5wcm9jZXNzKSgqZWZmZWN0SGFuZGxlLCBwaW5idWYsIHBvdXRidWYpOworICAgIGlmIChlcnIgIT0gMCkgeworICAgICAgQUxPR0UoIkRvd25taXhQcm9jZXNzIHJldHVybmVkIGFuIGVycm9yICVkIiwgZXJyKTsKKyAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQob3V0UzE2LmRhdGEoKSwgb3V0RmxvYXQuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUkFNRV9MRU5HVEggKiBvdXRwdXRDaGFubmVscyk7CisgICAgZndyaXRlKG91dFMxNi5kYXRhKCksIHNpemVvZihzaG9ydCksIChGUkFNRV9MRU5HVEggKiBvdXRwdXRDaGFubmVscyksCisgICAgICAgICAgIGZvdXQpOworICAgIGZyYW1lQ291bnRlcisrOworICB9CisgIHByaW50ZigiZnJhbWVDb3VudGVyOiBbJWRdXG4iLCBmcmFtZUNvdW50ZXIpOworICByZXR1cm4gMDsKK30KKworaW50MzJfdCBEb3dtaXhNYWluUHJvY2Vzcyhkb3dubWl4X2NudHh0X3MgKnBEZXNjcmlwdG9yLCBGSUxFICpmaW5wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGSUxFICpmb3V0KSB7CisgIGVmZmVjdF9oYW5kbGVfdCAqZWZmZWN0SGFuZGxlID0gJnBEZXNjcmlwdG9yLT5oYW5kbGU7CisgIGludDMyX3Qgc2Vzc2lvbklkID0gMCwgaW9JZCA9IDA7CisgIGNvbnN0IGVmZmVjdF91dWlkX3QgZG93bm1peF91dWlkID0geworICAgICAgMHg5M2YwNDQ1MiwgMHhlNGZlLCAweDQxY2MsIDB4OTFmOSwgezB4ZTQsIDB4NzUsIDB4YjYsIDB4ZDEsIDB4ZDYsIDB4OWZ9fTsKKworICBpbnQzMl90IGVyciA9IEFVRElPX0VGRkVDVF9MSUJSQVJZX0lORk9fU1lNLmNyZWF0ZV9lZmZlY3QoCisgICAgICAmZG93bm1peF91dWlkLCBzZXNzaW9uSWQsIGlvSWQsCisgICAgICBlZmZlY3RIYW5kbGUpOworICBpZiAoZXJyICE9IDApIHsKKyAgICBBTE9HRSgiRG93bm1peExpYl9DcmVhdGUgcmV0dXJuZWQgYW4gZXJyb3IgJWQiLCBlcnIpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vIFBhc3NpbmcgdGhlIGluaXQgY29uZmlnIGZvciB0aW1lIGJlaW5nLgorICBlcnIgPSBEb3dubWl4Q29uZml1cmVBbmRFbmFibGUocERlc2NyaXB0b3IpOworICBpZiAoZXJyICE9IDApIHsKKyAgICBBTE9HRSgiRG93bm1peENvbmZpZ3VyZUFuZEVuYWJsZSByZXR1cm5lZCBhbiBlcnJvciAlZCIsIGVycik7CisgICAgcmV0dXJuIC0xOworICB9CisgIC8vIGV4ZWN1dGUgY2FsbCBmb3IgZG93bm1peC4KKyAgZXJyID0gRG93bm1peEV4ZWN1dGUocERlc2NyaXB0b3IsIGZpbnAsIGZvdXQpOworICBpZiAoZXJyICE9IDApIHsKKyAgICBBTE9HRSgiRG93bm1peEV4ZWN1dGUgcmV0dXJuZWQgYW4gZXJyb3IgJWQiLCBlcnIpOworICAgIHJldHVybiAtMTsKKyAgfQorICAvLyBSZWxlYXNlIHRoZSBsaWJyYXJ5IGZ1bmN0aW9uLgorICBlcnIgPSBBVURJT19FRkZFQ1RfTElCUkFSWV9JTkZPX1NZTS5yZWxlYXNlX2VmZmVjdCgqZWZmZWN0SGFuZGxlKTsKKyAgaWYgKGVyciAhPSAwKSB7CisgICAgQUxPR0UoIkRvd25taXhSZWxlYXNlIHJldHVybmVkIGFuIGVycm9yICVkIiwgZXJyKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgaW50IG51bUZpbGVDaGFubmVscyA9IDEsIG51bVByb2Nlc3NDaGFubmVscyA9IDg7CisgIGRvd25taXhfY250eHRfcyBkZXNjcmlwdG9yID0ge307CisgIERvd25taXhEZWZhdWx0Q29uZmlnKCYoZGVzY3JpcHRvci5jb25maWcpKTsKKworICBjb25zdCBjaGFyICppbmZpbGUgPSBudWxscHRyOworICBjb25zdCBjaGFyICpvdXRmaWxlID0gbnVsbHB0cjsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBwcmludGYoIiVzICIsIGFyZ3ZbaV0pOworICAgIGlmIChhcmd2W2ldWzBdICE9ICctJykgeworICAgICAgaWYgKGluZmlsZSA9PSBudWxscHRyKSB7CisgICAgICAgIGluZmlsZSA9IGFyZ3ZbaV07CisgICAgICB9IGVsc2UgaWYgKG91dGZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICBvdXRmaWxlID0gYXJndltpXTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mczoiLCA0KSkgeworICAgICAgLy8gQWRkIGEgY2hlY2sgZm9yIGFsbCB0aGUgc3VwcG9ydGVkIHN0cmVhbXMuCisgICAgICBjb25zdCBpbnQgc2FtcGxpbmdGcmVxID0gYXRvaShhcmd2W2ldICsgNCk7CisgICAgICBpZiAoc2FtcGxpbmdGcmVxICE9IDgwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDExMDI1ICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDEyMDAwICYmIHNhbXBsaW5nRnJlcSAhPSAxNjAwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAyMjA1MCAmJiBzYW1wbGluZ0ZyZXEgIT0gMjQwMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMzIwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDQ0MTAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDQ4MDAwICYmIHNhbXBsaW5nRnJlcSAhPSA4ODIwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSA5NjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMTc2NDAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDE5MjAwMCkgeworICAgICAgICBwcmludGYoIlVuc3VwcG9ydGVkIFNhbXBsaW5nIEZyZXF1ZW5jeSA6ICVkIiwgc2FtcGxpbmdGcmVxKTsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisKKyAgICAgIGRlc2NyaXB0b3IuY29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nRnJlcTsKKyAgICAgIGRlc2NyaXB0b3IuY29uZmlnLm91dHB1dENmZy5zYW1wbGluZ1JhdGUgPSBzYW1wbGluZ0ZyZXE7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWNoX2ZtdDoiLCA4KSkgeworICAgICAgY29uc3QgaW50IGZvcm1hdCA9IGF0b2koYXJndltpXSArIDgpOworICAgICAgdWludDMyX3QgKmF1ZGlvVHlwZSA9ICZkZXNjcmlwdG9yLmNvbmZpZy5pbnB1dENmZy5jaGFubmVsczsKKyAgICAgIHN3aXRjaCAoZm9ybWF0KSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAqYXVkaW9UeXBlID0gQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICphdWRpb1R5cGUgPSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREU7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAqYXVkaW9UeXBlID0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIDM6CisgICAgICAgICAgKmF1ZGlvVHlwZSA9IEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICphdWRpb1R5cGUgPSBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0s7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgKmF1ZGlvVHlwZSA9IEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDE7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBkZXNjcmlwdG9yLm51bVByb2Nlc3NDaGFubmVscyA9CisgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKCphdWRpb1R5cGUpOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mY2g6IiwgNSkpIHsKKyAgICAgIGNvbnN0IGludCBmQ2hhbm5lbHMgPSBhdG9pKGFyZ3ZbaV0gKyA1KTsKKyAgICAgIGlmIChmQ2hhbm5lbHMgPiA4IHx8IGZDaGFubmVscyA8IDEpIHsKKyAgICAgICAgcHJpbnRmKCJVbnN1cHBvcnRlZCBudW1iZXIgb2YgZmlsZSBjaGFubmVscyA6ICVkIiwgZkNoYW5uZWxzKTsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBkZXNjcmlwdG9yLm51bUZpbGVDaGFubmVscyA9IGZDaGFubmVsczsKKworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1oIiwgMikpIHsKKyAgICAgIHByaW50VXNhZ2UoKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGlmICgvKmluZmlsZSA9PSBudWxscHRyIHx8ICovIG91dGZpbGUgPT0gbnVsbHB0cikgeworICAgIHByaW50VXNhZ2UoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBGSUxFICpmaW5wID0gZm9wZW4oaW5maWxlLCAicmIiKTsKKyAgaWYgKGZpbnAgPT0gbnVsbHB0cikgeworICAgIHByaW50ZigiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlcyIsIGluZmlsZSk7CisgICAgcmV0dXJuIC0xOworICB9CisgIEZJTEUgKmZvdXQgPSBmb3BlbihvdXRmaWxlLCAid2IiKTsKKyAgaWYgKGZvdXQgPT0gbnVsbHB0cikgeworICAgIHByaW50ZigiQ2Fubm90IG9wZW4gb3V0cHV0IGZpbGUgJXMiLCBvdXRmaWxlKTsKKyAgICBmY2xvc2UoZmlucCk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgY29uc3QgaW50IGVyciA9IERvd21peE1haW5Qcm9jZXNzKCZkZXNjcmlwdG9yLCBmaW5wLCBmb3V0KTsKKyAgLy8gY2xvc2UgaW5wdXQgYW5kIG91dHB1dCBmaWxlcy4KKyAgZmNsb3NlKGZpbnApOworICBmY2xvc2UoZm91dCk7CisgIGlmIChlcnIgIT0gMCkgeworICAgIHByaW50ZigiRXJyb3I6ICVkXG4iLCBlcnIpOworICB9CisgIHJldHVybiBlcnI7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuYyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCmluZGV4IGMxY2U1MTMuLmRjZGY2MzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5jCkBAIC0yNTQsNyArMjU0LDggQEAKICAgICByZXR1cm4gcmV0OwogfQogCi1pbnQgRWZmZWN0Q3JlYXRlKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsIGVmZmVjdF9oYW5kbGVfdCAqcEhhbmRsZSkKK2ludCBkb0VmZmVjdENyZWF0ZShjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBpb0lkLCBpbnQzMl90IGRldmljZUlkLAorICAgICAgICBlZmZlY3RfaGFuZGxlX3QgKnBIYW5kbGUpCiB7CiAgICAgbGlzdF9lbGVtX3QgKmUgPSBnTGlicmFyeUxpc3Q7CiAgICAgbGliX2VudHJ5X3QgKmwgPSBOVUxMOwpAQCAtMjY4LDkgKzI2OSw5IEBACiAgICAgfQogCiAgICAgQUxPR1YoIkVmZmVjdENyZWF0ZSgpIFVVSUQ6ICUwOFgtJTA0WC0lMDRYLSUwNFgtJTAyWCUwMlglMDJYJTAyWCUwMlglMDJYXG4iLAotICAgICAgICAgICAgdXVpZC0+dGltZUxvdywgdXVpZC0+dGltZU1pZCwgdXVpZC0+dGltZUhpQW5kVmVyc2lvbiwKLSAgICAgICAgICAgIHV1aWQtPmNsb2NrU2VxLCB1dWlkLT5ub2RlWzBdLCB1dWlkLT5ub2RlWzFdLHV1aWQtPm5vZGVbMl0sCi0gICAgICAgICAgICB1dWlkLT5ub2RlWzNdLHV1aWQtPm5vZGVbNF0sdXVpZC0+bm9kZVs1XSk7CisgICAgICAgICAgdXVpZC0+dGltZUxvdywgdXVpZC0+dGltZU1pZCwgdXVpZC0+dGltZUhpQW5kVmVyc2lvbiwKKyAgICAgICAgICB1dWlkLT5jbG9ja1NlcSwgdXVpZC0+bm9kZVswXSwgdXVpZC0+bm9kZVsxXSwgdXVpZC0+bm9kZVsyXSwKKyAgICAgICAgICB1dWlkLT5ub2RlWzNdLCB1dWlkLT5ub2RlWzRdLCB1dWlkLT5ub2RlWzVdKTsKIAogICAgIHJldCA9IGluaXQoKTsKIApAQCAtMjgyLDE3ICsyODMsMjkgQEAKICAgICBwdGhyZWFkX211dGV4X2xvY2soJmdMaWJMb2NrKTsKIAogICAgIHJldCA9IGZpbmRFZmZlY3QoTlVMTCwgdXVpZCwgJmwsICZkKTsKLSAgICBpZiAocmV0IDwgMCl7CisgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgLy8gU3ViIGVmZmVjdHMgYXJlIG5vdCBhc3NvY2lhdGVkIHdpdGggdGhlIGxpYnJhcnktPmVmZmVjdHMsCiAgICAgICAgIC8vIHNvLCBmaW5kRWZmZWN0IHdpbGwgZmFpbC4gU2VhcmNoIGZvciB0aGUgZWZmZWN0IGluIGdTdWJFZmZlY3RMaXN0LgogICAgICAgICByZXQgPSBmaW5kU3ViRWZmZWN0KHV1aWQsICZsLCAmZCk7Ci0gICAgICAgIGlmIChyZXQgPCAwICkgeworICAgICAgICBpZiAocmV0IDwgMCkgewogICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gY3JlYXRlIGVmZmVjdCBpbiBsaWJyYXJ5Ci0gICAgcmV0ID0gbC0+ZGVzYy0+Y3JlYXRlX2VmZmVjdCh1dWlkLCBzZXNzaW9uSWQsIGlvSWQsICZpdGZlKTsKKyAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fREVWSUNFKSB7CisgICAgICAgIGlmIChsLT5kZXNjLT52ZXJzaW9uID49IEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OXzNfMSkgeworICAgICAgICAgICAgQUxPR0koIkVmZmVjdENyZWF0ZSgpIGNyZWF0ZV9lZmZlY3RfM18xIik7CisgICAgICAgICAgICByZXQgPSBsLT5kZXNjLT5jcmVhdGVfZWZmZWN0XzNfMSh1dWlkLCBzZXNzaW9uSWQsIGlvSWQsIGRldmljZUlkLCAmaXRmZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiRWZmZWN0Q3JlYXRlKCkgY2Fubm90IGNyZWF0ZSBkZXZpY2UgZWZmZWN0IG9uIGxpYnJhcnkgd2l0aCBBUEkgdmVyc2lvbiA8IDMuMSIpOworICAgICAgICAgICAgcmV0ID0gLUVOT1NZUzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dJKCJFZmZlY3RDcmVhdGUoKSBjcmVhdGVfZWZmZWN0Iik7CisgICAgICAgIHJldCA9IGwtPmRlc2MtPmNyZWF0ZV9lZmZlY3QodXVpZCwgc2Vzc2lvbklkLCBpb0lkLCAmaXRmZSk7CisgICAgfQorCiAgICAgaWYgKHJldCAhPSAwKSB7CiAgICAgICAgIEFMT0dXKCJFZmZlY3RDcmVhdGUoKSBsaWJyYXJ5ICVzOiBjb3VsZCBub3QgY3JlYXRlIGZ4ICVzLCBlcnJvciAlZCIsIGwtPm5hbWUsIGQtPm5hbWUsIHJldCk7CiAgICAgICAgIGdvdG8gZXhpdDsKQEAgLTMyNCw2ICszMzcsMTYgQEAKICAgICByZXR1cm4gcmV0OwogfQogCitpbnQgRWZmZWN0Q3JlYXRlKGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGlvSWQsCisgICAgICAgIGVmZmVjdF9oYW5kbGVfdCAqcEhhbmRsZSkgeworICAgIHJldHVybiBkb0VmZmVjdENyZWF0ZSh1dWlkLCBzZXNzaW9uSWQsIGlvSWQsIEFVRElPX1BPUlRfSEFORExFX05PTkUsIHBIYW5kbGUpOworfQorCitpbnQgRWZmZWN0Q3JlYXRlT25EZXZpY2UoY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwgaW50MzJfdCBkZXZpY2VJZCwgaW50MzJfdCBpb0lkLAorICAgICAgICBlZmZlY3RfaGFuZGxlX3QgKnBIYW5kbGUpIHsKKyAgICByZXR1cm4gZG9FZmZlY3RDcmVhdGUodXVpZCwgQVVESU9fU0VTU0lPTl9ERVZJQ0UsIGlvSWQsIGRldmljZUlkLCBwSGFuZGxlKTsKK30KKwogaW50IEVmZmVjdFJlbGVhc2UoZWZmZWN0X2hhbmRsZV90IGhhbmRsZSkKIHsKICAgICBlZmZlY3RfZW50cnlfdCAqZng7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c0ZhY3RvcnkuaCBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5oCmluZGV4IDI5ZGJjOWMuLjE5MzYzNDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzRmFjdG9yeS5oCkBAIC0yNyw2ICsyNyw4IEBACiBleHRlcm4gIkMiIHsKICNlbmRpZgogCisjZGVmaW5lIEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OX0NVUlJFTlQgRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT05fM18xCisKICNkZWZpbmUgUFJPUEVSVFlfSUdOT1JFX0VGRkVDVFMgInJvLmF1ZGlvLmlnbm9yZV9lZmZlY3RzIgogCiB0eXBlZGVmIHN0cnVjdCBsaXN0X2VsZW1fcyB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvRWZmZWN0c1htbENvbmZpZ0xvYWRlci5jcHAKaW5kZXggMDUyYTg4Yi4uNTA1YmU3YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L0VmZmVjdHNYbWxDb25maWdMb2FkZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9FZmZlY3RzWG1sQ29uZmlnTG9hZGVyLmNwcApAQCAtOTQsNyArOTQsNyBAQAogICAgIH0KIAogICAgIHVpbnQzMl90IG1ham9yVmVyc2lvbiA9IEVGRkVDVF9BUElfVkVSU0lPTl9NQUpPUihkZXNjcmlwdGlvbi0+dmVyc2lvbik7Ci0gICAgdWludDMyX3QgZXhwZWN0ZWRNYWpvclZlcnNpb24gPSBFRkZFQ1RfQVBJX1ZFUlNJT05fTUFKT1IoRUZGRUNUX0xJQlJBUllfQVBJX1ZFUlNJT04pOworICAgIHVpbnQzMl90IGV4cGVjdGVkTWFqb3JWZXJzaW9uID0gRUZGRUNUX0FQSV9WRVJTSU9OX01BSk9SKEVGRkVDVF9MSUJSQVJZX0FQSV9WRVJTSU9OX0NVUlJFTlQpOwogICAgIGlmIChtYWpvclZlcnNpb24gIT0gZXhwZWN0ZWRNYWpvclZlcnNpb24pIHsKICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG1ham9yIHZlcnNpb24gJSMwOHgsIGV4cGVjdGVkICUjMDh4IGZvciBsaWJyYXJ5ICVzIiwKICAgICAgICAgICAgICAgbWFqb3JWZXJzaW9uLCBleHBlY3RlZE1ham9yVmVyc2lvbiwgcGF0aCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvaW5jbHVkZS9tZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oIGIvbWVkaWEvbGliZWZmZWN0cy9mYWN0b3J5L2luY2x1ZGUvbWVkaWEvRWZmZWN0c0ZhY3RvcnlBcGkuaAppbmRleCBhNWExMmViLi44ZjcyMzllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2ZhY3RvcnkvaW5jbHVkZS9tZWRpYS9FZmZlY3RzRmFjdG9yeUFwaS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvZmFjdG9yeS9pbmNsdWRlL21lZGlhL0VmZmVjdHNGYWN0b3J5QXBpLmgKQEAgLTExOSw2ICsxMTksMzYgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KIC8vCisvLyAgICBGdW5jdGlvbjogICAgICAgRWZmZWN0Q3JlYXRlT25EZXZpY2UKKy8vCisvLyAgICBEZXNjcmlwdGlvbjogICAgU2FtZSBhcyBFZmZlY3RDcmVhdGUgYnV0IHVlc2VkIHdoZW4gY3JlYXRpbmcgYW4gZWZmZWN0IGF0dGFjaGVkIHRvIGEKKy8vICAgICAgICAgICAgICAgICBwYXJ0aWN1bGFyIGF1ZGlvIGRldmljZSBpbnN0YW5jZQorLy8KKy8vICAgIElucHV0OgorLy8gICAgICAgICAgcEVmZmVjdFV1aWQ6ICAgIHBvaW50ZXIgdG8gdGhlIGVmZmVjdCB1dWlkLgorLy8gICAgICAgICAgZGV2aWNlSWQ6ICBpZGVudGlmaWVzIHRoZSBzaW5rIG9yIHNvdXJjZSBkZXZpY2UgdGhpcyBlZmZlY3QgaXMgZGlyZWN0ZWQgdG8gaW4KKy8vICAgICAgICAgICAgICBhdWRpbyBIQUwuIE11c3QgYmUgc3BlY2lmaWVkIGlmIHNlc3Npb25JZCBpcyBBVURJT19TRVNTSU9OX0RFVklDRS4KKy8vICAgICAgICAgICAgICBkZXZpY2VJZCBpcyB0aGUgYXVkaW9fcG9ydF9oYW5kbGVfdCB1c2VkIGZvciB0aGUgZGV2aWNlIHdoZW4gdGhlIGF1ZGlvCisvLyAgICAgICAgICAgICAgcGF0Y2ggaXMgY3JlYXRlZCBhdCB0aGUgYXVkaW8gSEFMLi8vCisvLyAgICAgICAgICBpb0lkOiAgIGlkZW50aWZpZXMgdGhlIG91dHB1dCBvciBpbnB1dCBzdHJlYW0gdGhpcyBlZmZlY3QgaXMgZGlyZWN0ZWQgdG8gYXQgYXVkaW8gSEFMLgorLy8gICAgICAgICAgICAgIEZvciBmdXR1cmUgdXNlIGVzcGVjaWFsbHkgd2l0aCB0dW5uZWxlZCBIVyBhY2NlbGVyYXRlZCBlZmZlY3RzCisvLyAgICBJbnB1dC9PdXRwdXQ6CisvLyAgICAgICAgICBwSGFuZGxlOiAgICAgICAgYWRkcmVzcyB3aGVyZSB0byByZXR1cm4gdGhlIGVmZmVjdCBoYW5kbGUuCisvLworLy8gICAgT3V0cHV0OgorLy8gICAgICAgIHJldHVybmVkIHZhbHVlOiAgICAwICAgICAgICAgIHN1Y2Nlc3NmdWwgb3BlcmF0aW9uLgorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC1FTk9ERVYgICAgIGZhY3RvcnkgZmFpbGVkIHRvIGluaXRpYWxpemUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRUlOVkFMICAgICBpbnZhbGlkIHBFZmZlY3RVdWlkIG9yIHBIYW5kbGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAtRU5PRU5UICAgICBubyBlZmZlY3Qgd2l0aCB0aGlzIHV1aWQgZm91bmQKKy8vICAgICAgICAqcEhhbmRsZTogICAgICAgICB1cGRhdGVkIHdpdGggdGhlIGVmZmVjdCBoYW5kbGUuCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KK0FORFJPSURfQVBJCitpbnQgRWZmZWN0Q3JlYXRlT25EZXZpY2UoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGludDMyX3QgZGV2aWNlSWQsIGludDMyX3QgaW9JZCwKKyAgICAgICAgZWZmZWN0X2hhbmRsZV90ICpwSGFuZGxlKTsKKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vCiAvLyAgICBGdW5jdGlvbjogICAgICAgRWZmZWN0UmVsZWFzZQogLy8KIC8vICAgIERlc2NyaXB0aW9uOiAgICBSZWxlYXNlcyB0aGUgZWZmZWN0IGVuZ2luZSB3aG9zZSBoYW5kbGUgaXMgZ2l2ZW4gYXMgYXJndW1lbnQuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0VmZmVjdExvdWRuZXNzRW5oYW5jZXIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sb3VkbmVzcy9FZmZlY3RMb3VkbmVzc0VuaGFuY2VyLmNwcAppbmRleCA5ZDI5Y2YxLi5kNjFlZmQzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2xvdWRuZXNzL0VmZmVjdExvdWRuZXNzRW5oYW5jZXIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbG91ZG5lc3MvRWZmZWN0TG91ZG5lc3NFbmhhbmNlci5jcHAKQEAgLTMwLDYgKzMwLDI2IEBACiAjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfbG91ZG5lc3NlbmhhbmNlci5oPgogI2luY2x1ZGUgImRzcC9jb3JlL2R5bmFtaWNfcmFuZ2VfY29tcHJlc3Npb24uaCIKIAorLy8gQlVJTERfRkxPQVQgdGFyZ2V0cyBidWlsZGluZyBhIGZsb2F0IGVmZmVjdCBpbnN0ZWFkIG9mIHRoZSBsZWdhY3kgaW50MTZfdCBlZmZlY3QuCisjZGVmaW5lIEJVSUxEX0ZMT0FUCisKKyNpZmRlZiBCVUlMRF9GTE9BVAorCitzdGF0aWMgY29uc3RleHByIGF1ZGlvX2Zvcm1hdF90IGtQcm9jZXNzRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKworI2Vsc2UKKworc3RhdGljIGNvbnN0ZXhwciBhdWRpb19mb3JtYXRfdCBrUHJvY2Vzc0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworCitzdGF0aWMgaW5saW5lIGludDE2X3QgY2xhbXAxNihpbnQzMl90IHNhbXBsZSkKK3sKKyAgICBpZiAoKHNhbXBsZT4+MTUpIF4gKHNhbXBsZT4+MzEpKQorICAgICAgICBzYW1wbGUgPSAweDdGRkYgXiAoc2FtcGxlPj4zMSk7CisgICAgcmV0dXJuIHNhbXBsZTsKK30KKworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCisKIGV4dGVybiAiQyIgewogCiAvLyBlZmZlY3RfaGFuZGxlX3QgaW50ZXJmYWNlIGltcGxlbWVudGF0aW9uIGZvciBMRSBlZmZlY3QKQEAgLTgwLDEzICsxMDAsNiBAQAogICAgIH0KIH0KIAotc3RhdGljIGlubGluZSBpbnQxNl90IGNsYW1wMTYoaW50MzJfdCBzYW1wbGUpCi17Ci0gICAgaWYgKChzYW1wbGU+PjE1KSBeIChzYW1wbGU+PjMxKSkKLSAgICAgICAgc2FtcGxlID0gMHg3RkZGIF4gKHNhbXBsZT4+MzEpOwotICAgIHJldHVybiBzYW1wbGU7Ci19Ci0KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gTEVfc2V0Q29uZmlnKCkKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTExLDcgKzEyNCw3IEBACiAgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzICE9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTykgcmV0dXJuIC1FSU5WQUw7CiAgICAgaWYgKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlICE9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFICYmCiAgICAgICAgICAgICBwQ29uZmlnLT5vdXRwdXRDZmcuYWNjZXNzTW9kZSAhPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSByZXR1cm4gLUVJTlZBTDsKLSAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSByZXR1cm4gLUVJTlZBTDsKKyAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IGtQcm9jZXNzRm9ybWF0KSByZXR1cm4gLUVJTlZBTDsKIAogICAgIHBDb250ZXh0LT5tQ29uZmlnID0gKnBDb25maWc7CiAKQEAgLTE1OSw3ICsxNzIsNyBAQAogCiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0ga1Byb2Nlc3NGb3JtYXQ7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKQEAgLTE2Nyw3ICsxODAsNyBAQAogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0ga1Byb2Nlc3NGb3JtYXQ7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKQEAgLTI4NCwxOCArMjk3LDQxIEBACiAKICAgICAvL0FMT0dWKCJMRSBhYm91dCB0byBwcm9jZXNzICVkIHNhbXBsZXMiLCBpbkJ1ZmZlci0+ZnJhbWVDb3VudCk7CiAgICAgdWludDE2X3QgaW5JZHg7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICBjb25zdGV4cHIgZmxvYXQgc2NhbGUgPSAxIDw8IDE1OyAvLyBwb3dlciBvZiAyIGlzIGxvc3NsZXNzIGNvbnZlcnNpb24gdG8gaW50MTZfdCByYW5nZQorICAgIGNvbnN0ZXhwciBmbG9hdCBpbnZlcnNlU2NhbGUgPSAxLmYgLyBzY2FsZTsKKyAgICBjb25zdCBmbG9hdCBpbnB1dEFtcCA9IHBvdygxMCwgcENvbnRleHQtPm1UYXJnZXRHYWlubUIvMjAwMC4wZikgKiBzY2FsZTsKKyNlbHNlCiAgICAgZmxvYXQgaW5wdXRBbXAgPSBwb3coMTAsIHBDb250ZXh0LT5tVGFyZ2V0R2Fpbm1CLzIwMDAuMGYpOworI2VuZGlmCiAgICAgZmxvYXQgbGVmdFNhbXBsZSwgcmlnaHRTYW1wbGU7CiAgICAgZm9yIChpbklkeCA9IDAgOyBpbklkeCA8IGluQnVmZmVyLT5mcmFtZUNvdW50IDsgaW5JZHgrKykgewogICAgICAgICAvLyBtYWtldXAgZ2FpbiBpcyBhcHBsaWVkIG9uIHRoZSBpbnB1dCBvZiB0aGUgY29tcHJlc3NvcgorI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGxlZnRTYW1wbGUgID0gaW5wdXRBbXAgKiBpbkJ1ZmZlci0+ZjMyWzIqaW5JZHhdOworICAgICAgICByaWdodFNhbXBsZSA9IGlucHV0QW1wICogaW5CdWZmZXItPmYzMlsyKmluSWR4ICsxXTsKKyAgICAgICAgcENvbnRleHQtPm1Db21wcmVzc29yLT5Db21wcmVzcygmbGVmdFNhbXBsZSwgJnJpZ2h0U2FtcGxlKTsKKyAgICAgICAgaW5CdWZmZXItPmYzMlsyKmluSWR4XSAgICA9IGxlZnRTYW1wbGUgKiBpbnZlcnNlU2NhbGU7CisgICAgICAgIGluQnVmZmVyLT5mMzJbMippbklkeCArMV0gPSByaWdodFNhbXBsZSAqIGludmVyc2VTY2FsZTsKKyNlbHNlCiAgICAgICAgIGxlZnRTYW1wbGUgID0gaW5wdXRBbXAgKiAoZmxvYXQpaW5CdWZmZXItPnMxNlsyKmluSWR4XTsKICAgICAgICAgcmlnaHRTYW1wbGUgPSBpbnB1dEFtcCAqIChmbG9hdClpbkJ1ZmZlci0+czE2WzIqaW5JZHggKzFdOwogICAgICAgICBwQ29udGV4dC0+bUNvbXByZXNzb3ItPkNvbXByZXNzKCZsZWZ0U2FtcGxlLCAmcmlnaHRTYW1wbGUpOwogICAgICAgICBpbkJ1ZmZlci0+czE2WzIqaW5JZHhdICAgID0gKGludDE2X3QpIGxlZnRTYW1wbGU7CiAgICAgICAgIGluQnVmZmVyLT5zMTZbMippbklkeCArMV0gPSAoaW50MTZfdCkgcmlnaHRTYW1wbGU7CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKICAgICB9CiAKICAgICBpZiAoaW5CdWZmZXItPnJhdyAhPSBvdXRCdWZmZXItPnJhdykgeworI2lmZGVmIEJVSUxEX0ZMT0FUCisgICAgICAgIGlmIChwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCoyOyBpKyspIHsKKyAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmYzMltpXSArPSBpbkJ1ZmZlci0+ZjMyW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGZsb2F0KSk7CisgICAgICAgIH0KKyNlbHNlCiAgICAgICAgIGlmIChwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7CiAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCoyOyBpKyspIHsKICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPnMxNltpXSA9IGNsYW1wMTYob3V0QnVmZmVyLT5zMTZbaV0gKyBpbkJ1ZmZlci0+czE2W2ldKTsKQEAgLTMwMyw2ICszMzksNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LCBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyICogc2l6ZW9mKGludDE2X3QpKTsKICAgICAgICAgfQorI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAgICAgfQogICAgIGlmIChwQ29udGV4dC0+bVN0YXRlICE9IExPVURORVNTX0VOSEFOQ0VSX1NUQVRFX0FDVElWRSkgewogICAgICAgICByZXR1cm4gLUVOT0RBVEE7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLmJwCmluZGV4IDVjNTdjNDMuLjFmMmE1ZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9BbmRyb2lkLmJwCkBAIC0xMCwxMDcgKzEwLDEwNyBAQAogCiAgICAgdmVuZG9yOiB0cnVlLAogICAgIHNyY3M6IFsKLSAgICAgICAgIlN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5jIiwKLSAgICAgICAgIlN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0NvbnRyb2wuYyIsCi0gICAgICAgICJTdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuYyIsCi0gICAgICAgICJTdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmMiLAotICAgICAgICAiU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jIiwKLSAgICAgICAgIlN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jIiwKLSAgICAgICAgIlN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmMiLAotICAgICAgICAiU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMiLAotICAgICAgICAiQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jIiwKLSAgICAgICAgIkJhc3Mvc3JjL0xWREJFX0luaXQuYyIsCi0gICAgICAgICJCYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMiLAotICAgICAgICAiQmFzcy9zcmMvTFZEQkVfVGFibGVzLmMiLAotICAgICAgICAiQnVuZGxlL3NyYy9MVk1fQVBJX1NwZWNpYWxzLmMiLAotICAgICAgICAiQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jIiwKLSAgICAgICAgIkJ1bmRsZS9zcmMvTFZNX0luaXQuYyIsCi0gICAgICAgICJCdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMiLAotICAgICAgICAiQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMiLAotICAgICAgICAiQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jIiwKLSAgICAgICAgIlNwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuYyIsCi0gICAgICAgICJTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Jbml0LmMiLAotICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmMiLAotICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJvY2Vzcy5jIiwKLSAgICAgICAgIlNwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Jbml0LmMiLAotICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX1Byb2Nlc3MuYyIsCi0gICAgICAgICJTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYyIsCi0gICAgICAgICJFcS9zcmMvTFZFUU5CX0NhbGNDb2VmLmMiLAotICAgICAgICAiRXEvc3JjL0xWRVFOQl9Db250cm9sLmMiLAotICAgICAgICAiRXEvc3JjL0xWRVFOQl9Jbml0LmMiLAotICAgICAgICAiRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMiLAotICAgICAgICAiRXEvc3JjL0xWRVFOQl9UYWJsZXMuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0luc3RBbGxvYy5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0JQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxLmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMS5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0JRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxLmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0JRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzMwRzExX1RSQ19XUkFfMDEuYyIsCi0gICAgICAgICJDb21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0LmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9JbnQxNkxTaGlmdFRvSW50MzJfMTZ4MzIuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0Zyb20yaVRvTW9ub18xNi5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQ29weV8xNi5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvTW9ub1RvMklfMTYuYyIsCi0gICAgICAgICJDb21tb24vc3JjL01vbm9UbzJJXzMyLmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMTYuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0xvYWRDb25zdF8zMi5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvZEJfdG9fTGluMzIuYyIsCi0gICAgICAgICJDb21tb24vc3JjL1NoaWZ0X1NhdF92MTZ4djE2LmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQWJzXzMyLmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9JbnQzMlJTaGlmdFRvSW50MTZfU2F0XzMyeDE2LmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYyIsCi0gICAgICAgICJDb21tb24vc3JjL211bHQzc18xNngxNi5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvRGVsYXlNaXhfMTZ4MTYuYyIsCi0gICAgICAgICJDb21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0Zyb20yaVRvTVNfMTZ4MTYuYyIsCi0gICAgICAgICJDb21tb24vc3JjL01hYzNzX1NhdF8xNngxNi5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9BZGQyX1NhdF8xNngxNi5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvTFZDX01peGVyX1NldFRpbWVDb25zdGFudC5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0Q3VycmVudC5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9MVk1fVGltZXIuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0xWTV9UaW1lcl9Jbml0LmMiLAorICAgICAgICAiU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmNwcCIsCisgICAgICAgICJTdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Db250cm9sLmNwcCIsCisgICAgICAgICJTdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuY3BwIiwKKyAgICAgICAgIlN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0luaXQuY3BwIiwKKyAgICAgICAgIlN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1Byb2Nlc3MuY3BwIiwKKyAgICAgICAgIlN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jcHAiLAorICAgICAgICAiU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuY3BwIiwKKyAgICAgICAgIlN0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jcHAiLAorICAgICAgICAiQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jcHAiLAorICAgICAgICAiQmFzcy9zcmMvTFZEQkVfSW5pdC5jcHAiLAorICAgICAgICAiQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jcHAiLAorICAgICAgICAiQmFzcy9zcmMvTFZEQkVfVGFibGVzLmNwcCIsCisgICAgICAgICJCdW5kbGUvc3JjL0xWTV9BUElfU3BlY2lhbHMuY3BwIiwKKyAgICAgICAgIkJ1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuY3BwIiwKKyAgICAgICAgIkJ1bmRsZS9zcmMvTFZNX0luaXQuY3BwIiwKKyAgICAgICAgIkJ1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuY3BwIiwKKyAgICAgICAgIkJ1bmRsZS9zcmMvTFZNX1RhYmxlcy5jcHAiLAorICAgICAgICAiQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jcHAiLAorICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfQ29udHJvbC5jcHAiLAorICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jcHAiLAorICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmNwcCIsCisgICAgICAgICJTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmNwcCIsCisgICAgICAgICJTcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jcHAiLAorICAgICAgICAiU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX1Byb2Nlc3MuY3BwIiwKKyAgICAgICAgIlNwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jcHAiLAorICAgICAgICAiRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jcHAiLAorICAgICAgICAiRXEvc3JjL0xWRVFOQl9Db250cm9sLmNwcCIsCisgICAgICAgICJFcS9zcmMvTFZFUU5CX0luaXQuY3BwIiwKKyAgICAgICAgIkVxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jcHAiLAorICAgICAgICAiRXEvc3JjL0xWRVFOQl9UYWJsZXMuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvSW5zdEFsbG9jLmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0JRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxLmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0JRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzMwRzExX1RSQ19XUkFfMDEuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0LmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0ludDE2TFNoaWZ0VG9JbnQzMl8xNngzMi5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMTYuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQ29weV8xNi5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9Nb25vVG8ySV8xNi5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMTYuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL2RCX3RvX0xpbjMyLmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL1NoaWZ0X1NhdF92MTZ4djE2LmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0Fic18zMi5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9JbnQzMlJTaGlmdFRvSW50MTZfU2F0XzMyeDE2LmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0Zyb20yaVRvTW9ub18zMi5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9tdWx0M3NfMTZ4MTYuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvRnJvbTJpVG9NU18xNngxNi5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9NYWMzc19TYXRfMTZ4MTYuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0FkZDJfU2F0XzE2eDE2LmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0FkZDJfU2F0XzMyeDMyLmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTFZDX01peGVyX1NldFRpbWVDb25zdGFudC5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVC5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBLmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0xWQ19NaXhlcl9HZXRDdXJyZW50LmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0xWTV9UaW1lci5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVk1fVGltZXJfSW5pdC5jcHAiLAogICAgIF0sCiAKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKQEAgLTEyOSwxMSArMTI5LDE1IEBACiAgICAgICAgICJDb21tb24vbGliIiwKICAgICAgICAgIkJ1bmRsZS9saWIiLAogICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJoYXJkd2FyZV9oZWFkZXJzIgorICAgIF0sCisgICAgY3BwZmxhZ3M6IFsKICAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAotICAgICAgICAiLURCVUlMRF9GTE9BVCIsCi0gICAgICAgICItREhJR0hFUl9GUyIsCisgICAgICAgICItRFNVUFBPUlRfTUMiLAogCiAgICAgICAgICItV2FsbCIsCiAgICAgICAgICItV2Vycm9yIiwKQEAgLTE1Myw0MiArMTU3LDQyIEBACiAKICAgICB2ZW5kb3I6IHRydWUsCiAgICAgc3JjczogWwotICAgICAgICAiUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmMiLAotICAgICAgICAiUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jIiwKLSAgICAgICAgIlJldmVyYi9zcmMvTFZSRVZfR2V0Q29udHJvbFBhcmFtZXRlcnMuYyIsCi0gICAgICAgICJSZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmMiLAotICAgICAgICAiUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jIiwKLSAgICAgICAgIlJldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jIiwKLSAgICAgICAgIlJldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYyIsCi0gICAgICAgICJSZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQWJzXzMyLmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9JbnN0QWxsb2MuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0xvYWRDb25zdF8xNi5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYyIsCi0gICAgICAgICJDb21tb24vc3JjL011bHQzc18zMngxNi5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0RlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyLmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9Db3B5XzE2LmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0RlbGF5V3JpdGVfMzIuYyIsCi0gICAgICAgICJDb21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuYyIsCi0gICAgICAgICJDb21tb24vc3JjL01vbm9UbzJJXzMyLmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9MVk1fUG9seW5vbWlhbC5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvTFZNX1Bvd2VyMTAuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0xWTV9HZXRPbWVnYS5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0xWTV9NaXhlcl9UaW1lQ29uc3RhbnQuYyIsCi0gICAgICAgICJDb21tb24vc3JjL0NvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVC5jIiwKLSAgICAgICAgIkNvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMiLAotICAgICAgICAiQ29tbW9uL3NyYy9Db3JlX01peEluU29mdF9EMzJDMzFfU0FULmMiLAorICAgICAgICAiUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmNwcCIsCisgICAgICAgICJSZXZlcmIvc3JjL0xWUkVWX0NsZWFyQXVkaW9CdWZmZXJzLmNwcCIsCisgICAgICAgICJSZXZlcmIvc3JjL0xWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzLmNwcCIsCisgICAgICAgICJSZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmNwcCIsCisgICAgICAgICJSZXZlcmIvc3JjL0xWUkVWX0dldE1lbW9yeVRhYmxlLmNwcCIsCisgICAgICAgICJSZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuY3BwIiwKKyAgICAgICAgIlJldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuY3BwIiwKKyAgICAgICAgIlJldmVyYi9zcmMvTFZSRVZfVGFibGVzLmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0Fic18zMi5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9JbnN0QWxsb2MuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0xvYWRDb25zdF8zMi5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0ZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxLmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvRGVsYXlBbGxQYXNzX1NhdF8zMngxNlRvMzIuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQ29weV8xNi5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvRGVsYXlXcml0ZV8zMi5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9Kb2luVG8yaV8zMngzMi5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0xWTV9GT19MUEYuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTFZNX1BvbHlub21pYWwuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTFZNX1Bvd2VyMTAuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTFZNX0dldE9tZWdhLmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL01peFNvZnRfMlN0X0QzMkMzMV9TQVQuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9NaXhJblNvZnRfRDMyQzMxX1NBVC5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9MVk1fTWl4ZXJfVGltZUNvbnN0YW50LmNwcCIsCisgICAgICAgICJDb21tb24vc3JjL0NvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVC5jcHAiLAorICAgICAgICAiQ29tbW9uL3NyYy9Db3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEuY3BwIiwKKyAgICAgICAgIkNvbW1vbi9zcmMvQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVC5jcHAiLAogICAgIF0sCiAKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKQEAgLTIwMCwxMCArMjA0LDggQEAKICAgICAgICAgIkNvbW1vbi9saWIiLAogICAgIF0sCiAKLSAgICBjZmxhZ3M6IFsKKyAgICBjcHBmbGFnczogWwogICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCi0gICAgICAgICItREJVSUxEX0ZMT0FUIiwKLSAgICAgICAgIi1ESElHSEVSX0ZTIiwKIAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIvTFZEQkUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCmluZGV4IDRjMmI5NTQuLjk0OGQ3OWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL2xpYi9MVkRCRS5oCkBAIC01NSwxMSArNTUsNiBAQAogI2lmbmRlZiBfX0xWREJFX0hfXwogI2RlZmluZSBfX0xWREJFX0hfXwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjgsNyArNjMsNiBAQAogCiAjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIERlZmluaXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtODUsNyArNzksNiBAQAogI2RlZmluZSBMVkRCRV9FRkZFQ1RfMTJEQiAgICAgICAgICAgIDEyCiAjZGVmaW5lIExWREJFX0VGRkVDVF8xNURCICAgICAgICAgICAgMTUKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC05NSw3ICs4OCw2IEBACiAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KIHR5cGVkZWYgdm9pZCAgICAqTFZEQkVfSGFuZGxlX3Q7CiAKLQogLyogT3BlcmF0aW5nIG1vZGVzICovCiB0eXBlZGVmIGVudW0KIHsKQEAgLTEwNCw3ICs5Niw2IEBACiAgICAgTFZEQkVfTU9ERV9NQVggPSBMVk1fTUFYSU5UXzMyCiB9IExWREJFX01vZGVfZW47CiAKLQogLyogSGlnaCBwYXNzIGZpbHRlciAqLwogdHlwZWRlZiBlbnVtCiB7CkBAIC0xMTMsNyArMTA0LDYgQEAKICAgICBMVkRCRV9IUEZfTUFYID0gTFZNX01BWElOVF8zMgogfSBMVkRCRV9GaWx0ZXJTZWxlY3RfZW47CiAKLQogLyogVm9sdW1lIGNvbnRyb2wgKi8KIHR5cGVkZWYgZW51bQogewpAQCAtMTIyLDcgKzExMiw2IEBACiAgICAgTFZEQkVfVk9MVU1FX01BWCA9IExWTV9NQVhJTlRfMzIKIH0gTFZEQkVfVm9sdW1lX2VuOwogCi0KIC8qIE1lbW9yeSBUeXBlcyAqLwogdHlwZWRlZiBlbnVtCiB7CkBAIC0xMzQsNyArMTIzLDYgQEAKIAogfSBMVkRCRV9NZW1vcnlUeXBlc19lbjsKIAotCiAvKiBGdW5jdGlvbiByZXR1cm4gc3RhdHVzICovCiB0eXBlZGVmIGVudW0KIHsKQEAgLTE0Niw3ICsxMzQsNiBAQAogICAgIExWREJFX1NUQVRVU19NQVggICAgID0gTFZNX01BWElOVF8zMgogfSBMVkRCRV9SZXR1cm5TdGF0dXNfZW47CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIExpbmtlZCBlbnVtZXJhdGVkIHR5cGUgYW5kIGNhcGFiaWxpdHkgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTg1LDcgKzE3Miw2IEBACiAgICAgTFZEQkVfQ0VOVFJFX01BWCAgPSBMVk1fTUFYSU5UXzMyCiB9IExWREJFX0NlbnRyZUZyZXFfZW47CiAKLQogLyoKICAqIFN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgaW4gc2FtcGxlcyBwZXIgc2Vjb25kCiAgKi8KQEAgLTE5OCwxMCArMTg0LDEwIEBACiAjZGVmaW5lIExWREJFX0NBUF9GU18zMjAwMCAgICAgICAgICAgICAgIDY0CiAjZGVmaW5lIExWREJFX0NBUF9GU180NDEwMCAgICAgICAgICAgICAgIDEyOAogI2RlZmluZSBMVkRCRV9DQVBfRlNfNDgwMDAgICAgICAgICAgICAgICAyNTYKLSNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzk2MDAwICAgICAgICAgICAgICAgNTEyCi0jZGVmaW5lIExWREJFX0NBUF9GU18xOTIwMDAgICAgICAgICAgICAgIDEwMjQKLSNlbmRpZgorI2RlZmluZSBMVkRCRV9DQVBfRlNfODgyMDAgICAgICAgICAgICAgICA1MTIKKyNkZWZpbmUgTFZEQkVfQ0FQX0ZTXzk2MDAwICAgICAgICAgICAgICAgMTAyNAorI2RlZmluZSBMVkRCRV9DQVBfRlNfMTc2NDAwICAgICAgICAgICAgICAyMDQ4CisjZGVmaW5lIExWREJFX0NBUF9GU18xOTIwMDAgICAgICAgICAgICAgIDQwOTYKIAogdHlwZWRlZiBlbnVtCiB7CkBAIC0yMTQsMTQgKzIwMCwxMyBAQAogICAgIExWREJFX0ZTXzMyMDAwID0gNiwKICAgICBMVkRCRV9GU180NDEwMCA9IDcsCiAgICAgTFZEQkVfRlNfNDgwMDAgPSA4LAotI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotICAgIExWREJFX0ZTXzk2MDAwID0gOSwKLSAgICBMVkRCRV9GU18xOTIwMDAgPSAxMCwKLSNlbmRpZgorICAgIExWREJFX0ZTXzg4MjAwID0gOSwKKyAgICBMVkRCRV9GU185NjAwMCA9IDEwLAorICAgIExWREJFX0ZTXzE3NjQwMCA9IDExLAorICAgIExWREJFX0ZTXzE5MjAwMCA9IDEyLAogICAgIExWREJFX0ZTX01BWCAgID0gTFZNX01BWElOVF8zMgogfSBMVkRCRV9Gc19lbjsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgU3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMzcsMTQgKzIyMiwxMiBAQAogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnBCYXNlQWRkcmVzczsgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHJlZ2lvbiBiYXNlIGFkZHJlc3MgKi8KIH0gTFZEQkVfTWVtb3J5UmVnaW9uX3Q7CiAKLQogLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVkRCRV9NZW1vcnlSZWdpb25fdCAgICBSZWdpb25bTFZEQkVfTlJfTUVNT1JZX1JFR0lPTlNdOyAgLyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICovCiB9IExWREJFX01lbVRhYl90OwogCi0KIC8qIFBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7CkBAIC0yNTYsMTAgKzIzOSwxMiBAQAogICAgIExWREJFX1ZvbHVtZV9lbiAgICAgICAgIFZvbHVtZUNvbnRyb2w7CiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVm9sdW1lZEI7CiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSGVhZHJvb21kQjsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVsczsKKyNlbmRpZgogCiB9IExWREJFX1BhcmFtc190OwogCi0KIC8qIENhcGFiaWxpdHkgc3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtMjY4LDcgKzI1Myw2IEBACiAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBNYXhCbG9ja1NpemU7ICAgICAgICAgICAgIC8qIE1heGltdW0gYmxvY2sgc2l6ZSBpbiBzYW1wbGUgcGFpcnMgKi8KIH0gTFZEQkVfQ2FwYWJpbGl0aWVzX3Q7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZ1bmN0aW9uIFByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzEwLDcgKzI5NCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX01lbVRhYl90ICAgICAgICAgICAqcE1lbW9yeVRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICAgKnBDYXBhYmlsaXRpZXMpOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWREJFX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM0OCw3ICszMzEsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9NZW1UYWJfdCAgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgICAgICpwQ2FwYWJpbGl0aWVzKTsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgTFZEQkVfR2V0UGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zNzIsNyArMzU0LDYgQEAKIExWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9HZXRQYXJhbWV0ZXJzKExWREJFX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgKnBQYXJhbXMpOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICBMVkRCRV9HZXRDYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM5Niw3ICszNzcsNiBAQAogTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0dldENhcGFiaWxpdGllcyhMVkRCRV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICAqcENhcGFiaWxpdGllcyk7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkRCRV9Db250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDM3LDcgKzQxNyw2IEBACiBMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfQ29udHJvbChMVkRCRV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgKnBQYXJhbXMpOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWREJFX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQ1OCwyMCArNDM3LDkgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAogTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBOdW1TYW1wbGVzKTsKLSNlbHNlCi1MVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfUHJvY2VzcyhMVkRCRV9IYW5kbGVfdCAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgIE51bVNhbXBsZXMpOwotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCiAKICNlbmRpZiAvKiBfX0xWREJFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvZWZmcy5oCmluZGV4IDRlY2FmMTQuLmIzNjRkYWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29lZmZzLmgKQEAgLTE4LDggKzE4LDYgQEAKICNpZm5kZWYgX19MVkRCRV9DT0VGRlNfSF9fCiAjZGVmaW5lIF9fTFZEQkVfQ09FRkZTX0hfXwogCi0KLSNpZm5kZWYgQlVJTERfRkxPQVQKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogR2VuZXJhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTI4LDUwNCArMjYsNiBAQAogCiAjZGVmaW5lIExWREJFX1NDQUxFU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwogCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSGlnaCBQYXNzIEZpbHRlciBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDU1SHogKi8KLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjk1NTYzMjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1ODg0OSAqLwotI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMjA1OTExMjY1NSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkxNzY5OCAqLwotI2RlZmluZSBIUEZfRnM4MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMTAyOTU1NjMyOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTU4ODQ5ICovCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0yMDgxOTg2Mzc1KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTM5MDAxICovCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAxMDEwMTgzOTE0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NDA4MDcgKi8KLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwMzgyMTA4MzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2NjkwOSAqLwotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICgtMjA3NjQyMTY2MikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkzMzgxOCAqLwotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTAzODIxMDgzMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY2OTA5ICovCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMDk5OTUwNzEwKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTU1NzMyICovCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDI3MjM4NDUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTY2OTAgKi8KLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNDAwNzk5NDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2ODY1MCAqLwotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICgtMjA4MDE1OTg4NSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkzNzMwMCAqLwotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA0MDA3OTk0MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY4NjUwICovCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMTAzODExNzAyKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTU5MzI3ICovCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDMwOTQwNDc3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjAxMzggKi8KLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNDUzODE5ODggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MzU4OCAqLwotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICgtMjA5MDc2Mzk3NikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk0NzE3NiAqLwotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA0NTM4MTk4OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTczNTg4ICovCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMTE0NzI3NzkzKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTY5NDk0ICovCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDQxNDc4MTQ3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Njk5NTIgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNDk3NjY1MjMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NzY3MSAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICgtMjA5OTUzMzA0NikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk1NTM0MyAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA0OTc2NjUyMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc3NjcxICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMTIzNzE0MzgxKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTc3ODYzICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDUwMjMyNzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzgxMDUgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNTA3MTEwNTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3ODU1MSAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICgtMjEwMTQyMjEwMykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk1NzEwMiAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA1MDcxMTA1MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc4NTUxICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMTI1NjQ1NDk4KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTc5NjYyICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDUyMTIzNTI2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzk4NjYgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNTMzODU3NTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MTA0MiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICgtMjEwNjc3MTUxOSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk2MjA4NCAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA1MzM4NTc1OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgxMDQyICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMTMxMTA0Nzk0KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTg0NzQ2ICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDU3NDg2OTQ5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODQ4NjEgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNTU1OTI0OTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MzA5NyAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICgtMjExMTE4NDk5NSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk2NjE5NCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA1NTU5MjQ5OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgzMDk3ICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMTM1NTk4NjU4KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTg4OTMxICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDYxOTIyMjQ5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODg5OTIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNTYwNjcyNzYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MzUzOSAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICgtMjExMjEzNDU1MSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk2NzA3OSAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA1NjA2NzI3NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgzNTM5ICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMTM2NTY0Mjk2KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTg5ODMxICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDYyODc3NzE0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODk4ODIgKi8KLQotIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA2Nkh6ICovCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAxMDIzMjkzMjcxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTMwMTYgKi8KLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTIwNDY1ODY1NDIpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MDYwMzIgKi8KLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjMyOTMyNzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1MzAxNiAqLwotI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMjA2ODg5Njg2MCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkyNjgxMCAqLwotI2RlZmluZSBIUEZfRnM4MDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDk5NzkzMTExMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTI5Mzk2ICovCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDMzNjI0MjI4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjI2MzggKi8KLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAoLTIwNjcyNDg0NTUpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MjUyNzUgKi8KLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMzM2MjQyMjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2MjYzOCAqLwotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICgtMjA5MDQ0ODAwMCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk0Njg4MSAqLwotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTAxODE4MjMwNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTQ4MjU2ICovCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDM1ODU3NjYyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjQ3MTggKi8KLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAoLTIwNzE3MTUzMjUpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45Mjk0MzUgKi8KLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMzU4NTc2NjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2NDcxOCAqLwotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICgtMjA5NTA4MDMzMykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk1MTE5NiAqLwotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTAyMjU4NzE1OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTUyMzU5ICovCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDQyMTk3NTI4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzA2MjIgKi8KLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAoLTIwODQzOTUwNTYpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NDEyNDQgKi8KLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDIxOTc1MjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MDYyMiAqLwotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICgtMjEwODE3NzkxMikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk2MzM5NCAqLwotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTAzNTE0MjY5MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY0MDUyICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ3NDQ1MTQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzU1MDkgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAoLTIwOTQ4OTAyODkpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NTEwMTkgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDc0NDUxNDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NTUwOSAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICgtMjExODk2MTAyNSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk3MzQzNiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA0NTU5MzEwMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTczNzg0ICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDQ4NTc2MTc1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzY1NjMgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAoLTIwOTcxNTIzNDkpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NTMxMjUgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDg1NzYxNzUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NjU2MyAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICgtMjEyMTI3ODI1NSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk3NTU5NCAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA0Nzg1MjM3OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc1ODg5ICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDUxNzgwMTE5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzk1NDcgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAoLTIxMDM1NjAyMzcpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NTkwOTMgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTE3ODAxMTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3OTU0NyAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICgtMjEyNzgyOTE4NykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4MTY5NSAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1NDI2NTYyMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgxODYxICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDU0NDI0NzIyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODIwMTAgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAoLTIxMDg4NDk0NDQpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NjQwMTkgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTQ0MjQ3MjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MjAxMCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICgtMjEzMzIyMTcyMykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4NjcxOCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1OTU3Mzk5MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTg2ODA1ICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAxMDU0OTkzODUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODI1NDAgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAoLTIxMDk5ODc3MDIpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NjUwNzkgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTQ5OTM4NTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MjU0MCAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICgtMjEzNDM4MDQ3NSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4Nzc5NyAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2MDcxODExOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTg3ODcxICovCi0KLSAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNzhIeiAqLwotI2RlZmluZSBIUEZfRnM4MDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgMTAxNjUwNDIwMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTQ2NjkzICovCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0yMDMzMDA4NDA1KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuODkzMzg3ICovCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAxMDE2NTA0MjAzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NDY2OTMgKi8KLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTIwNTQ2MjMzOTApICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MTM1MTcgKi8KLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAgICA5ODQ3MzM4NTMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkxNzEwNSAqLwotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTAyODY0Mzc0MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTU3OTk5ICovCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgKC0yMDU3Mjg3NDgyKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTE1OTk4ICovCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDI4NjQzNzQxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTc5OTkgKi8KLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTIwODAwODM3NjkpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45MzcyMjkgKi8KLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMDgzOTM5MDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkzOTE0MCAqLwotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTAzMTI3MTA2NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTYwNDQ2ICovCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgKC0yMDYyNTQyMTMzKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTIwODkyICovCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDMxMjcxMDY3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjA0NDYgKi8KLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTIwODU1NTcwNDgpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NDIzMjYgKi8KLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMTM1NTE2MjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk0Mzk0NCAqLwotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTAzODczNDYyOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY3Mzk3ICovCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgKC0yMDc3NDY5MjU2KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTM0Nzk0ICovCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDM4NzM0NjI4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjczOTcgKi8KLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTIxMDEwMzMzODApICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NTY3NDAgKi8KLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwMjgyNzUyMjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1NzY1NiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA0NDkxODU4NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTczMTU2ICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgKC0yMDg5ODM3MTY5KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTQ2MzEzICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDQ0OTE4NTg0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzMxNTYgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTIxMTM3NzU4NTQpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45Njg2MDcgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDA1NTUwMDcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2OTA5MiAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA0NjI1MjE2NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc0Mzk4ICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgKC0yMDkyNTA0MzI4KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTQ4Nzk3ICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDQ2MjUyMTY0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzQzOTggKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTIxMTY1MTQyMjkpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NzExNTcgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNDMyMTI3MTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MTU2OCAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA1MDAzMTMwMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc3OTE4ICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgKC0yMTAwMDYyNjAzKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTU1ODM2ICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDUwMDMxMzAxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45Nzc5MTggKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTIxMjQyNTU5MDApICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NzgzNjcgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTA3NjI2MzkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3ODU5OSAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA1MzE1MjI1OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgwODI0ICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgKC0yMTA2MzA0NTE2KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTYxNjQ5ICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDUzMTUyMjU4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODA4MjQgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTIxMzA2Mjg3NDIpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODQzMDMgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTcwMTgxODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4NDQyNSAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgMTA1MzgyNDA4NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgxNDUwICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgKC0yMTA3NjQ4MTczKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTYyOTAwICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAxMDUzODI0MDg3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODE0NTAgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTIxMzE5OTgxNTQpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODU1NzggKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTgzNjcyMDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4NTY4MSAqLwotCi0gLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDkwSHogKi8KLSNkZWZpbmUgSFBGX0ZzODAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDk3NjAwNTMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk0MDQxMiAqLwotI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMjAxOTUyMDEwNSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjg4MDgyNSAqLwotI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgMTAwOTc2MDA1MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTQwNDEyICovCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0yMDQwMzU3MTM5KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTAwMjMxICovCi0jZGVmaW5lIEhQRl9GczgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgOTcxNzExMTI5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45MDQ5NzcgKi8KLSNkZWZpbmUgSFBGX0ZzMTEwMjVfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwMjM2ODcyMTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1MzM4MyAqLwotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMjA0NzM3NDQzNCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkwNjc2NiAqLwotI2RlZmluZSBIUEZfRnMxMTAyNV9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAgMTAyMzY4NzIxNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTUzMzgzICovCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMDY5NzIyMzk3KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTI3NTc5ICovCi0jZGVmaW5lIEhQRl9GczExMDI1X0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgOTk4Njk5NjA0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45MzAxMTEgKi8KLSNkZWZpbmUgSFBGX0ZzMTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwMjY3MDQ3NTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1NjE5MyAqLwotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMjA1MzQwOTUwOCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkxMjM4NyAqLwotI2RlZmluZSBIUEZfRnMxMjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAgMTAyNjcwNDc1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTU2MTkzICovCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMDc2MDM1OTk2KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTMzNDU5ICovCi0jZGVmaW5lIEhQRl9GczEyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDA0NTk1OTE4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45MzU2MDMgKi8KLSNkZWZpbmUgSFBGX0ZzMTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwMzUyODMyMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk2NDE4MyAqLwotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMjA3MDU2NjQ1MSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjkyODM2NSAqLwotI2RlZmluZSBIUEZfRnMxNjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAgMTAzNTI4MzIyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY0MTgzICovCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMDkzODg5ODExKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTUwMDg3ICovCi0jZGVmaW5lIEhQRl9GczE2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDIxNDUzMzI2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NTEzMDMgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNDIzOTgxMTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MDgwOSAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMjA4NDc5NjIzMikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk0MTYxOCAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA0MjM5ODExNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTcwODA5ICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMTA4NTkxMDU3KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTYzNzc4ICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDM1NTQxMTg4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjQ0MjMgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNDM5MzMzMDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MjIzOSAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMjA4Nzg2NjYwNCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk0NDQ3NyAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA0MzkzMzMwMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTcyMjM5ICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMTExNzUwNDk1KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTY2NzIxICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDM4NTkzNjAxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjcyNjYgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNDgyODUzOTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NjI5MiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMjA5NjU3MDc4MykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk1MjU4NCAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA0ODI4NTM5MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc2MjkyICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMTIwNjgyNzM3KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTc1MDQwICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDQ3MjcxMjk1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzUzNDcgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNTE4ODEzMzAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3OTY0MSAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMjEwMzc2MjY2MCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk1OTI4MiAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA1MTg4MTMzMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc5NjQxICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMTI4MDM1ODA5KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTgxODg4ICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDU0NDY4NTMzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODIwNTAgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEwNTI2NTU2MTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MDM2MiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICgtMjEwNTMxMTIzOCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk2MDcyNCAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAgMTA1MjY1NTYxOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgwMzYyICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMTI5NjE1ODcxKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTgzMzU5ICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDU2MDIxNDkyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODM0OTcgKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEJhbmQgUGFzcyBGaWx0ZXIgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA1NUh6ICovCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICA5ODc1MjQ3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDkxOTcgKi8KLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICgtOTg3NTI0NykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwOTE5NyAqLwotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMjEyNTUxOTgzMCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk3OTU0NSAqLwotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMTA1Mzc2MjYyOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgxMzkzICovCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTgzOTUyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDY2OTEgKi8KLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICgtNzE4Mzk1MikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwNjY5MSAqLwotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMjEzMTkwMTY1OCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4NTQ4OCAqLwotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1OTIwNzU0OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTg2NDY0ICovCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NjAzODcxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDYxNTAgKi8KLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICgtNjYwMzg3MSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwNjE1MCAqLwotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMjEzMzIzODA5MikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4NjczMyAqLwotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2MDM4MTE0MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTg3NTU3ICovCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA0OTYwNTkxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDQ2MjAgKi8KLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICgtNDk2MDU5MSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwNDYyMCAqLwotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMjEzNjk0OTA1MikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk5MDE4OSAqLwotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2MzcwNTc2MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkwNjUzICovCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNjA0MTMxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDMzNTcgKi8KLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICgtMzYwNDEzMSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMzM1NyAqLwotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMjEzOTkyOTA4NSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk5Mjk2NCAqLwotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2NjQ1MDA5NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkzMjA5ICovCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMzEyMjA3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDMwODUgKi8KLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICgtMzMxMjIwNykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMzA4NSAqLwotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMjE0MDU2MDYwNikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk5MzU1MiAqLwotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2NzA0MDcwMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkzNzU5ICovCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDg2MDkxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDIzMTUgKi8KLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICgtMjQ4NjA5MSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMjMxNSAqLwotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMjE0MjMyODk2MikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk5NTE5OSAqLwotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2ODcxMjA2NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk1MzE2ICovCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODA1MTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDE2ODEgKi8KLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICgtMTgwNTEyNSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMTY4MSAqLwotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMjE0Mzc2NTc3MikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk5NjUzNyAqLwotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA3MDA4OTc3MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk2NTk5ICovCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjU4Njg3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDE1NDUgKi8KLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICgtMTY1ODY4NykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMTU0NSAqLwotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMjE0NDA3MjI5MikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk5NjgyMyAqLwotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA3MDM4NjAzNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk2ODc1ICovCi0KLSAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgNjZIeiAqLwotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzU4MDE4OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDEyNjQ4ICovCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAgICgtMTM1ODAxODkpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMTI2NDggKi8KLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTIxMTcxNjExNzUpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45NzE3NjAgKi8KLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDEwNDYyNjY5NDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3NDQxMiAqLwotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgOTg4ODU1OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA5MjA5ICovCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAoLTk4ODg1NTkpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDkyMDkgKi8KLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAoLTIxMjU5NzI3MzgpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45Nzk5NjYgKi8KLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTM3MzU2OTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4MTM2OCAqLwotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgOTA5MTk1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA4NDY4ICovCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAoLTkwOTE5NTQpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDg0NjggKi8KLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAoLTIxMjc4MTgwMDQpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODE2ODUgKi8KLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTUzNDczNTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4Mjg2OSAqLwotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNjgzMzUyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA2MzY0ICovCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAoLTY4MzM1MjUpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDYzNjQgKi8KLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAoLTIxMzI5NDE3MzkpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45ODY0NTcgKi8KLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNTk5MTY1MTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk4NzEyNCAqLwotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNDk2NzMwOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA0NjI2ICovCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAoLTQ5NjczMDkpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDQ2MjYgKi8KLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAoLTIxMzcwNTYwMDMpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45OTAyODggKi8KLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjM2OTIxNzAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MDY0MSAqLwotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNDU2NTQ0NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA0MjUyICovCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAoLTQ1NjU0NDUpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDQyNTIgKi8KLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAoLTIxMzc5Mjc4NDIpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45OTExMDAgKi8KLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjQ1MDUyMDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MTM5OCAqLwotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMzQyNzc2MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAzMTkyICovCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAoLTM0Mjc3NjEpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDMxOTIgKi8KLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAoLTIxNDAzNjkwMDcpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45OTMzNzQgKi8KLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjY4MDY5MjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5MzU0MSAqLwotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQ4OTQ2NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAyMzE4ICovCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAoLTI0ODk0NjYpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDIzMTggKi8KLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAoLTIxNDIzNTIzNDIpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45OTUyMjEgKi8KLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjg3MDUyNDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NTMwOSAqLwotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMjI4NzYzMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAyMTMxICovCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAoLTIyODc2MzIpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDIxMzEgKi8KLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAoLTIxNDI3NzU0MzYpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS45OTU2MTUgKi8KLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgIDEwNjkxMTM1ODEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NTY5MCAqLwotCi0gLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDc4SHogKi8KLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTk5NDExODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAxODU3MiAqLwotI2RlZmluZSBCUEZfRnM4MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAoLTE5OTQxMTgwKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDE4NTcyICovCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0yMTAzMTg2NzQ5KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTU4NzQ1ICovCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAxMDMzMzk3NjQ4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjI0MjcgKi8KLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ1NDM5MzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAxMzU0NSAqLwotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAoLTE0NTQzOTM0KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDEzNTQ1ICovCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMTE1OTY2NjM4KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTcwNjQ3ICovCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDQ0MzE3MTM1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzI1OTYgKi8KLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMTMzNzY5OTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAxMjQ1OCAqLwotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAoLTEzMzc2OTk5KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDEyNDU4ICovCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMTE4NjUxNzA4KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTczMTQ4ICovCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDQ2Njc4MDI5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzQ3OTUgKi8KLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMTAwNjQyMjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwOTM3MyAqLwotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAoLTEwMDY0MjIyKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA5MzczICovCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMTI2MTI0MzQyKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTgwMTA4ICovCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDUzMzgwMzA0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODEwMzcgKi8KLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDczMjE3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNjgxOSAqLwotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgKC03MzIxNzgwKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA2ODE5ICovCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMTMyMTQzNzcxKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTg1NzE0ICovCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDU4OTI4NzAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODYyMDQgKi8KLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDY3MzA2NDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNjI2OCAqLwotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgKC02NzMwNjQwKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA2MjY4ICovCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMTMzNDIxNjA3KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTg2OTA0ICovCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDYwMTI0NjY5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODczMTggKi8KLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwNTU5NjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNDcwOSAqLwotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgKC01MDU1OTY1KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA0NzA5ICovCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMTM3MDAzOTc3KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTkwMjQwICovCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDYzNTEyODAyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTA0NzMgKi8KLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2NzM1MTYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMzQyMSAqLwotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgKC0zNjczNTE2KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAzNDIxICovCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMTM5OTE5Mzk0KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTkyOTU1ICovCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDY2MzA5NzE4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTMwNzggKi8KLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzNzU5OTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMzE0NCAqLwotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgKC0zMzc1OTkwKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAzMTQ0ICovCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMTQwNTQxOTA2KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuOTkzNTM1ICovCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgICAxMDY2OTExNjYwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTM2MzkgKi8KLQotIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA5MEh6ICovCi0jZGVmaW5lIEJQRl9GczgwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0NDM4NTQ4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMjI3NjAgKi8KLSNkZWZpbmUgQlBGX0ZzODAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgKC0yNDQzODU0OCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAyMjc2MCAqLwotI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMjA5MjgwMTM0NykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk0OTA3MyAqLwotI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNDI5ODc1NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTUzOTUzICovCi0jZGVmaW5lIEJQRl9GczExMDI1X0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3ODQ0Mzg1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMTY2MTkgKi8KLSNkZWZpbmUgQlBGX0ZzMTEwMjVfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAgKC0xNzg0NDM4NSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAxNjYxOSAqLwotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMjEwODYwNDkyMSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk2Mzc5MSAqLwotI2RlZmluZSBCUEZfRnMxMTAyNV9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAgMTAzNzYzOTc5NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY2Mzc3ICovCi0jZGVmaW5lIEJQRl9GczEyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2NDE2NzA3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMTUyODkgKi8KLSNkZWZpbmUgQlBGX0ZzMTIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAgKC0xNjQxNjcwNykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAxNTI4OSAqLwotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMjExMTkyMjkzNikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk2Njg4MiAqLwotI2RlZmluZSBCUEZfRnMxMjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA0MDUyODIxNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTY5MDY3ICovCi0jZGVmaW5lIEJQRl9GczE2MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMzU5ODgzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMTE1MTEgKi8KLSNkZWZpbmUgQlBGX0ZzMTYwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAgKC0xMjM1OTg4MykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAxMTUxMSAqLwotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMjEyMTE1MjE2MikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk3NTQ3NyAqLwotI2RlZmluZSBCUEZfRnMxNjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA0ODczNTgxNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc2NzExICovCi0jZGVmaW5lIEJQRl9GczIyMDUwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA4OTk3MTczICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDgzNzkgKi8KLSNkZWZpbmUgQlBGX0ZzMjIwNTBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICgtODk5NzE3MykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwODM3OSAqLwotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMjEyODU4MDc2MikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4MjM5NSAqLwotI2RlZmluZSBCUEZfRnMyMjA1MF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1NTUzOTExMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgzMDQ3ICovCi0jZGVmaW5lIEJQRl9GczI0MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MjcxODE4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDc3MDQgKi8KLSNkZWZpbmUgQlBGX0ZzMjQwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICgtODI3MTgxOCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwNzcwNCAqLwotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMjEzMDE1NzAxMykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4Mzg2MyAqLwotI2RlZmluZSBCUEZfRnMyNDAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA1NzAwNjYyMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTg0NDE0ICovCi0jZGVmaW5lIEJQRl9GczMyMDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MjE1OTE4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDU3ODkgKi8KLSNkZWZpbmUgQlBGX0ZzMzIwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICgtNjIxNTkxOCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwNTc4OSAqLwotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMjEzNDU3NDUyMSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk4Nzk3NyAqLwotI2RlZmluZSBCUEZfRnMzMjAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2MTE2NjAzMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTg4Mjg4ICovCi0jZGVmaW5lIEJQRl9GczQ0MTAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NTE3NjUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDQyMDcgKi8KLSNkZWZpbmUgQlBGX0ZzNDQxMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICgtNDUxNzY1MSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwNDIwNyAqLwotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMjEzODE2NzkyNikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk5MTMyNCAqLwotI2RlZmluZSBCUEZfRnM0NDEwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2NDYwMTg5OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkxNDg4ICovCi0jZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MTUyMDI0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDM4NjcgKi8KLSNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICgtNDE1MjAyNCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMzg2NyAqLwotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMjEzODkzNTAwMikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjk5MjAzOCAqLwotI2RlZmluZSBCUEZfRnM0ODAwMF9GYzkwX0IyICAgICAgICAgICAgICAgICAgICAgICAgMTA2NTM0MTYyMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTkyMTc3ICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBBdXRvbWF0aWMgR2FpbiBDb250cm9sIHRpbWUgY29uc3RhbnRzIGFuZCBnYWluIHNldHRpbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEFHQyBUaW1lIGNvbnN0YW50cyAqLwotI2RlZmluZSBBR0NfQVRUQUNLX0ZzODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNzU3MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuODQxMzk1ICovCi0jZGVmaW5lIEFHQ19BVFRBQ0tfRnMxMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4OTA5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC44ODIyMjMgKi8KLSNkZWZpbmUgQUdDX0FUVEFDS19GczEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjkyMDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjg5MTI1MSAqLwotI2RlZmluZSBBR0NfQVRUQUNLX0ZzMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDA1NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTE3Mjc2ICovCi0jZGVmaW5lIEFHQ19BVFRBQ0tfRnMyMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwNzc4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45MzkyNjcgKi8KLSNkZWZpbmUgQUdDX0FUVEFDS19GczI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzA5MzUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk0NDA2MSAqLwotI2RlZmluZSBBR0NfQVRUQUNLX0ZzMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTM4MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTU3NzQ1ICovCi0jZGVmaW5lIEFHQ19BVFRBQ0tfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxNzU3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NjkxNTggKi8KLSNkZWZpbmUgQUdDX0FUVEFDS19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE4MzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MTYyOCAqLwotI2RlZmluZSBERUNBWV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwotI2RlZmluZSBBR0NfREVDQVlfRnM4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDQyICovCi0jZGVmaW5lIEFHQ19ERUNBWV9GczExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMzAgKi8KLSNkZWZpbmUgQUdDX0RFQ0FZX0ZzMTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAyOCAqLwotI2RlZmluZSBBR0NfREVDQVlfRnMxNjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDIxICovCi0jZGVmaW5lIEFHQ19ERUNBWV9GczIyMDUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMTUgKi8KLSNkZWZpbmUgQUdDX0RFQ0FZX0ZzMjQwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAxNCAqLwotI2RlZmluZSBBR0NfREVDQVlfRnMzMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDEwICovCi0jZGVmaW5lIEFHQ19ERUNBWV9GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDggKi8KLSNkZWZpbmUgQUdDX0RFQ0FZX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwNyAqLwotCi0vKiBBR0MgR2FpbiBzZXR0aW5ncyAqLwotI2RlZmluZSBBR0NfR0FJTl9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMSAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwotI2RlZmluZSBBR0NfR0FJTl9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNCAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwotI2RlZmluZSBBR0NfVEFSR0VUTEVWRUwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMzE3MDMzNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjEwMDAwMGRCICovCi0jZGVmaW5lIEFHQ19IUEZHQUlOXzBkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwNzM5NzA0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40MTI1MzggKi8KLSNkZWZpbmUgQUdDX0dBSU5fMGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBBR0NfSFBGR0FJTl8xZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1NzAwNjA3MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTg0ODkzICovCi0jZGVmaW5lIEFHQ19HQUlOXzFkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNzU0MDc5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4xMjIwMTggKi8KLSNkZWZpbmUgQUdDX0hQRkdBSU5fMmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDg5MTc3ODggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjc3ODI3OSAqLwotI2RlZmluZSBBR0NfR0FJTl8yZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2OTUwNDc2MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjU4OTI1ICovCi0jZGVmaW5lIEFHQ19IUEZHQUlOXzNkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjY3MTYzNjkzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTUyNjIgKi8KLSNkZWZpbmUgQUdDX0dBSU5fM2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTA3Mzk3MDQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQxMjUzOCAqLwotI2RlZmluZSBBR0NfSFBGR0FJTl80ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzMjUxNjY3NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMjM4NzIxICovCi0jZGVmaW5lIEFHQ19HQUlOXzRkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTU3MDA2MDcxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41ODQ4OTMgKi8KLSNkZWZpbmUgQUdDX0hQRkdBSU5fNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDU4NDM5MjQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjUxMTg4NiAqLwotI2RlZmluZSBBR0NfR0FJTl81ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwODkxNzc4OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzc4Mjc5ICovCi0jZGVmaW5lIEFHQ19IUEZHQUlOXzZkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDg4MTE4NDUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS44MTgzODMgKi8KLSNkZWZpbmUgQUdDX0dBSU5fNmRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjcxNjM2OTMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NTI2MiAqLwotI2RlZmluZSBBR0NfSFBGR0FJTl83ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4MDQzMTk5MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDIuMTYyMjc4ICovCi0jZGVmaW5lIEFHQ19HQUlOXzdkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzMyNTE2Njc0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4yMzg3MjEgKi8KLSNkZWZpbmUgQUdDX0hQRkdBSU5fOGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2ODQwMDk0ODMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAyLjU0ODEzNCAqLwotI2RlZmluZSBBR0NfR0FJTl84ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwNTg0MzkyNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuNTExODg2ICovCi0jZGVmaW5lIEFHQ19IUEZHQUlOXzlkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODAwMjI1MzQzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMi45ODEwNzIgKi8KLSNkZWZpbmUgQUdDX0dBSU5fOWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODgxMTg0NTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjgxODM4MyAqLwotI2RlZmluZSBBR0NfSFBGR0FJTl8xMGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkzMDYyMTY4MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDMuNDY2ODM2ICovCi0jZGVmaW5lIEFHQ19HQUlOXzEwZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTgwNDMxOTkwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMi4xNjIyNzggKi8KLSNkZWZpbmUgQUdDX0hQRkdBSU5fMTFkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNzY5Mjg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA0LjAxMTg3MiAqLwotI2RlZmluZSBBR0NfR0FJTl8xMWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY4NDAwOTQ4MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDIuNTQ4MTM0ICovCi0jZGVmaW5lIEFHQ19IUEZHQUlOXzEyZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjQxMDg4MDQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNC42MjM0MTMgKi8KLSNkZWZpbmUgQUdDX0dBSU5fMTJkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MDAyMjUzNDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAyLjk4MTA3MiAqLwotI2RlZmluZSBBR0NfSFBGR0FJTl8xM2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQyNTI3Nzc2OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDUuMzA5NTczICovCi0jZGVmaW5lIEFHQ19HQUlOXzEzZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTMwNjIxNjgxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMy40NjY4MzYgKi8KLSNkZWZpbmUgQUdDX0hQRkdBSU5fMTRkQiAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MzE5NDIwMzkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA2LjA3OTQ1OCAqLwotI2RlZmluZSBBR0NfR0FJTl8xNGRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA3NjkyODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDQuMDExODcyICovCi0jZGVmaW5lIEFHQ19IUEZHQUlOXzE1ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAxODYzODIzMTYzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNi45NDMyODIgKi8KLSNkZWZpbmUgQUdDX0dBSU5fMTVkQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNDEwODgwNDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA0LjYyMzQxMyAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVm9sdW1lIGNvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBWb2x1bWUgY29udHJvbCBnYWluICovCi0jZGVmaW5lIFZPTFVNRV9NQVggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogSW4gZEJzICovCi0jZGVmaW5lIFZPTFVNRV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogSW4gZEJzICovCi0KLS8qIFZvbHVtZSBjb250cm9sIHRpbWUgY29uc3RhbnRzICovCi0jZGVmaW5lIFZPTF9UQ19TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCi0jZGVmaW5lIFZPTF9UQ19GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1ODg5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMjQ2OTAgKi8KLSNkZWZpbmUgVk9MX1RDX0ZzMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg4NTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAxNzk3NyAqLwotI2RlZmluZSBWT0xfVENfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzMzMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDE2NTI5ICovCi0jZGVmaW5lIFZPTF9UQ19GczE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMDI2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMTI0MjIgKi8KLSNkZWZpbmUgVk9MX1RDX0ZzMjIwNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk0NjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwOTAyOSAqLwotI2RlZmluZSBWT0xfVENfRnMyNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODcwMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA4Mjk5ICovCi0jZGVmaW5lIFZPTF9UQ19GczMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NTMzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDYyMzEgKi8KLSNkZWZpbmUgVk9MX1RDX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ3NDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwNDUyNSAqLwotI2RlZmluZSBWT0xfVENfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDM2MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDA0MTU4ICovCi0jZGVmaW5lIE1JWF9UQ19GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5MzY1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC44OTYxNTEgKi8KLSNkZWZpbmUgTUlYX1RDX0ZzMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAyMzAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkyMjU0OCAqLwotI2RlZmluZSBNSVhfVENfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDQyMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTI4NDE1ICovCi0jZGVmaW5lIE1JWF9UQ19GczE2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMwOTc4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NDUzODcgKi8KLSNkZWZpbmUgTUlYX1RDX0ZzMjIwNTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE0NTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk1OTgwNCAqLwotI2RlZmluZSBNSVhfVENfRnMyNDAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTU1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTYyOTU2ICovCi0jZGVmaW5lIE1JWF9UQ19GczMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxODUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzE5NzMgKi8KLSNkZWZpbmUgTUlYX1RDX0ZzNDQxMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwOTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3OTUxNSAqLwotI2RlZmluZSBNSVhfVENfRnM0ODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjE1MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTgxMTUwICovCi0KLSNlbHNlIC8qQlVJTERfRkxPQVQqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEdlbmVyYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMVkRCRV9TQ0FMRVNISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEhpZ2ggUGFzcyBGaWx0ZXIgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01NzksMjAgKzc5LDI5IEBACiAjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45ODk4MzFmKQogI2RlZmluZSBIUEZfRnM0ODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk4OTg4MmYKIAotI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM4ODIwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTgxOGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MTYzNmYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1ODE4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk0NDY2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTQ0ODFmCisKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODYwNDBmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzIwODBmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NjA0MGYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NDkxNWYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTk0OTI4ZgogCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg3MTgzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTc0MzY2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODcxODNmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTcyMzNmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NzIzN2YKKwogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NzI5NGYKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3NDU4OGYpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg3Mjk0ZgogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk3NDU4ZikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTc0NjFmCi0jZW5kaWYKLQogCiAgLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDY2SHogKi8KICNkZWZpbmUgSFBGX0ZzODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgICAgMC45NTMwMTZmCkBAIC02NDEsMTkgKzE1MCwyOSBAQAogI2RlZmluZSBIUEZfRnM0ODAwMF9GYzY2X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTg3Nzk3ZikKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODc4NzFmCiAKLSNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODUyNzNmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45NzA1NDZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NTI3M2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MzM1OWYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkzMzgxZgorCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NTM5ZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcxMDc3ZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODU1MzlmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTM4OThmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MzkxN2YKIAorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjkxMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3MzgyMGYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2OTEwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2Njc5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTY2ODVmCisKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODcwNDNmCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzQwODZmKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM2Nl9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NzA0M2YKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5Njk0OWYpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2OTU0ZgotI2VuZGlmCiAKIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA3OEh6ICovCiAjZGVmaW5lIEhQRl9GczgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDAuOTQ2NjkzZgpAQCAtNzAyLDE5ICsyMjEsMjkgQEAKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM3OF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk4NTU3OGYpCiAjZGVmaW5lIEhQRl9GczQ4MDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg1NjgxZgogCi0jaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0Njc4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTY5MzU2ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ2NzhmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMS45OTIxNTFmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgICAwLjk5MjE4MmYKKwogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDk5MmYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2OTk4NGYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0OTkyZgogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkyNzg5ZikKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTI4MTVmCiAKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgICAgMC45ODY2MTJmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAgICgtMS45NzMyMjRmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgICAwLjk4NjYxMmYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5NjA3NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2MDgzZgorCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NzY5ZgogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTczNTM5ZikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjNzhfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODY3NjlmCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTYzOTRmKQogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NjQwMWYKLSNlbmRpZgogCiAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgOTBIeiAqLwogI2RlZmluZSBIUEZfRnM4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuOTQwNDEyZgpAQCAtNzYzLDE5ICsyOTIsMjkgQEAKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTgzMzU5ZikKICNkZWZpbmUgSFBGX0ZzNDgwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk4MzQ5N2YKIAotI2lmZGVmIEhJR0hFUl9GUworI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDA4NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk2ODE2OGYpCisjZGVmaW5lIEhQRl9Gczg4MjAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuOTg0MDg0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuOTkwOTQ0ZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC45OTA5ODVmCisKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0NDZmCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMS45Njg4OTJmKQogI2RlZmluZSBIUEZfRnM5NjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgICAwLjk4NDQ0NmYKICNkZWZpbmUgSFBGX0ZzOTYwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MTY4MGYpCiAjZGVmaW5lIEhQRl9Gczk2MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuOTkxNzE0ZgogCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuOTg2MzE0ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTcyNjI5ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0ZjOTBfQTIgICAgICAgICAgICAgICAgICAgICAgMC45ODYzMTRmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9GYzkwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTU0NzJmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NTQ4MmYKKwogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjk4NjQ5NmYKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQTEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk3Mjk5MmYpCiAjZGVmaW5lIEhQRl9GczE5MjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgIDAuOTg2NDk2ZgogI2RlZmluZSBIUEZfRnMxOTIwMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk1ODQwZikKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTU4NDhmCi0jZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC04MzAsMTkgKzM2OSwyOSBAQAogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMS45OTY4MjNmKQogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgIDAuOTk2ODc1ZgogCi0jaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNTVfQTAgICAgICAgICAgICAgICAgICAgICAgMC4wMDA4MzFmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNTVfQTEgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNTVfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDgzMWYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNTVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5ODMyMWYpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNTVfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTgzMzhmCisKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMDc2MmYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAwNzYyZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk4NDYxZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5ODQ3N2YKIAorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAwNDE2ZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDA0MTZmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTkxNjRmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM1NV9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk5MTY5ZgorCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDAzODFmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDM4MWYpCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0IxICAgICAgICAgICAgICAgICAgICAgKC0xLjk5OTIzNGYpCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzU1X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTkyMzhmCi0jZW5kaWYKIAogLyogQ29lZmZpY2llbnRzIGZvciBjZW50cmUgZnJlcXVlbmN5IDY2SHogKi8KICNkZWZpbmUgQlBGX0ZzODAwMF9GYzY2X0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDEyNjQ4ZgpAQCAtODkxLDE5ICs0NDAsMjkgQEAKICNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTU2MTVmKQogI2RlZmluZSBCUEZfRnM0ODAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTU2OTBmCiAKLSNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxMTQ2ZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxMTQ2ZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTc2ODRmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTc3MDhmCisKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxMDU1ZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNjZfQTIgICAgICAgICAgICAgICAgICAgICAoLTAuMDAxMDU1ZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTc4NjhmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzY2X0IyICAgICAgICAgICAgICAgICAgICAgMC45OTc4OTFmCiAKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwNTczZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAwNTczZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNjZfQjEgICAgICAgICAgICAgICAgICAgICgtMS45OTg4NDdmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM2Nl9CMiAgICAgICAgICAgICAgICAgICAgMC45OTg4NTNmCisKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAwNTI4ZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9BMSAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzY2X0EyICAgICAgICAgICAgICAgICAgICgtMC4wMDA1MjhmKQogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM2Nl9CMSAgICAgICAgICAgICAgICAgICAoLTEuOTk4OTM5ZikKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNjZfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk4OTQ1ZgotI2VuZGlmCiAKIC8qIENvZWZmaWNpZW50cyBmb3IgY2VudHJlIGZyZXF1ZW5jeSA3OEh6ICovCiAjZGVmaW5lIEJQRl9GczgwMDBfRmM3OF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAxODU3MmYKQEAgLTk1MiwxOSArNTExLDI5IEBACiAjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTkzNTM1ZikKICNkZWZpbmUgQlBGX0ZzNDgwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTkzNjM5ZgogCi0jaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNzhfQTAgICAgICAgICAgICAgICAgICAgIDAuMDAxNjkzZgorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0ExICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTY5M2YpCisjZGVmaW5lIEJQRl9Gczg4MjAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgICgtMS45OTY1ODJmKQorI2RlZmluZSBCUEZfRnM4ODIwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAwLjk5NjYxNWYKKwogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDE1NTVmCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTU1NTVmKQogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAoLTEuOTk2ODYwZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM3OF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk2ODkxZgogCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMDg0N2YKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDg0N2YpCisjZGVmaW5lIEJQRl9GczE3NjQwMF9GYzc4X0IxICAgICAgICAgICAgICAgICAgICAoLTEuOTk4Mjk4ZikKKyNkZWZpbmUgQlBGX0ZzMTc2NDAwX0ZjNzhfQjIgICAgICAgICAgICAgICAgICAgIDAuOTk4MzA2ZgorCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0EwICAgICAgICAgICAgICAgICAgICAwLjAwMDc3OGYKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQTEgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM3OF9BMiAgICAgICAgICAgICAgICAgICAoLTAuMDAwNzc4ZikKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjNzhfQjEgICAgICAgICAgICAgICAgICAgKC0xLjk5ODQzN2YpCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzc4X0IyICAgICAgICAgICAgICAgICAgICAwLjk5ODQ0NGYKLSNlbmRpZgogCiAvKiBDb2VmZmljaWVudHMgZm9yIGNlbnRyZSBmcmVxdWVuY3kgOTBIeiAqLwogI2RlZmluZSBCUEZfRnM4MDAwX0ZjOTBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIyNzYwZgpAQCAtMTAxMywxOSArNTgyLDI5IEBACiAjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjk5MjAzOGYpCiAjZGVmaW5lIEJQRl9GczQ4MDAwX0ZjOTBfQjIgICAgICAgICAgICAgICAgICAgICAgMC45OTIxNzdmCiAKLSNpZmRlZiBISUdIRVJfRlMKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgICAwLjAwMjA4M2YKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTAuMDAyMDgzZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuOTk1NzkxZikKKyNkZWZpbmUgQlBGX0ZzODgyMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NTgzNWYKKwogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgIDAuMDAxOTEzZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogI2RlZmluZSBCUEZfRnM5NjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAgKC0wLjAwMTkxM2YpCiAjZGVmaW5lIEJQRl9Gczk2MDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICAoLTEuOTk2MTM0ZikKICNkZWZpbmUgQlBGX0ZzOTYwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgICAwLjk5NjE3NGYKIAorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMDAxMDQyZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9BMiAgICAgICAgICAgICAgICAgICAgICgtMC4wMDEwNDJmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS45OTc5MDRmKQorI2RlZmluZSBCUEZfRnMxNzY0MDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk3OTE1ZgorCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0EwICAgICAgICAgICAgICAgICAgICAgMC4wMDA5NThmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0ExICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEJQRl9GczE5MjAwMF9GYzkwX0EyICAgICAgICAgICAgICAgICAgICAoLTAuMDAwOTU4ZikKICNkZWZpbmUgQlBGX0ZzMTkyMDAwX0ZjOTBfQjEgICAgICAgICAgICAgICAgICAgICgtMS45OTgwNzVmKQogI2RlZmluZSBCUEZfRnMxOTIwMDBfRmM5MF9CMiAgICAgICAgICAgICAgICAgICAgIDAuOTk4MDg1ZgotI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTA0NCwxMCArNjIzLDEwIEBACiAjZGVmaW5lIEFHQ19BVFRBQ0tfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk2OTE1OGYKICNkZWZpbmUgQUdDX0FUVEFDS19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTcxNjI4ZgogCi0jaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnM4ODIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45ODQ0NThmCiAjZGVmaW5lIEFHQ19BVFRBQ0tfRnM5NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45ODU3MTJmCisjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxNzY0MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTIxOTlmCiAjZGVmaW5lIEFHQ19BVFRBQ0tfRnMxOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC45OTI4MzBmCi0jZW5kaWYKIAogI2RlZmluZSBERUNBWV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAKIApAQCAtMTA2MSwxMCArNjQwLDEwIEBACiAjZGVmaW5lIEFHQ19ERUNBWV9GczQ0MTAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwOGYKICNkZWZpbmUgQUdDX0RFQ0FZX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDA3ZgogCi0jaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIEFHQ19ERUNBWV9Gczg4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAzOGYKICNkZWZpbmUgQUdDX0RFQ0FZX0ZTOTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDM1ZgorI2RlZmluZSBBR0NfREVDQVlfRnMxNzY0MDAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAxODhmCiAjZGVmaW5lIEFHQ19ERUNBWV9GUzE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDE3NWYKLSNlbmRpZgogCiAvKiBBR0MgR2FpbiBzZXR0aW5ncyAqLwogI2RlZmluZSBBR0NfR0FJTl9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMSAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwpAQCAtMTEyNCwxMCArNzAzLDEwIEBACiAjZGVmaW5lIFZPTF9UQ19GczMyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA2MjMxZgogI2RlZmluZSBWT0xfVENfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwNDUyNWYKICNkZWZpbmUgVk9MX1RDX0ZzNDgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDQxNThmCi0jaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIFZPTF9UQ19Gczg4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAyMjYzZgogI2RlZmluZSBWT0xfVENfRnM5NjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMjA3OWYKKyNkZWZpbmUgVk9MX1RDX0ZzMTc2NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDExMzFmCiAjZGVmaW5lIFZPTF9UQ19GczE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxMDM5ZgotI2VuZGlmCiAjZGVmaW5lIE1JWF9UQ19GczgwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5MzY1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC44OTYxNTEgKi8KICNkZWZpbmUgTUlYX1RDX0ZzMTEwMjUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAyMzAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkyMjU0OCAqLwogI2RlZmluZSBNSVhfVENfRnMxMjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDQyMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTI4NDE1ICovCkBAIC0xMTM3LDEwICs3MTYsMTEgQEAKICNkZWZpbmUgTUlYX1RDX0ZzMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzE4NTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk3MTk3MyAqLwogI2RlZmluZSBNSVhfVENfRnM0NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjA5NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTc5NTE1ICovCiAjZGVmaW5lIE1JWF9UQ19GczQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMTUwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45ODExNTAgKi8KLSNpZmRlZiBISUdIRVJfRlMKKy8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTg5NzA0ICovCisjZGVmaW5lIE1JWF9UQ19Gczg4MjAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNDMwCiAjZGVmaW5lIE1JWF9UQ19Gczk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNDU2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTA1MzAgKi8KKy8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk0ODM4ICovCisjZGVmaW5lIE1JWF9UQ19GczE3NjQwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNTk4CiAjZGVmaW5lIE1JWF9UQ19GczE5MjAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNjExICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTI1MjQgKi8KLSNlbmRpZgogCi0jZW5kaWYgLypCVUlMRF9GTE9BVCovCi0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDQwMTZiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Db250cm9sLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0NjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIkxWREJFLmgiCi0jaW5jbHVkZSAiTFZEQkVfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKLSNpbmNsdWRlICJMVkRCRV9Db2VmZnMuaCIKLSNpbmNsdWRlICJMVkRCRV9UYWJsZXMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgIExWREJFX0dldFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFJlcXVlc3QgdGhlIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzLiBUaGUgY3VycmVudCBwYXJhbWV0ZXIgc2V0IGlzICAgICAqLwotLyogIHJldHVybmVkIHZpYSB0aGUgcGFyYW1ldGVyIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gICAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9HZXRQYXJhbWV0ZXJzKExWREJFX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICAqcFBhcmFtcykKLXsKLQotICAgIExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotCi0gICAgKnBQYXJhbXMgPSBwSW5zdGFuY2UtPlBhcmFtczsKLQotICAgIHJldHVybihMVkRCRV9TVUNDRVNTKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgIExWREJFX0dldENhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046IER5bmFtaWMgQmFzcyBFbmhuYWNlbWVudCBjYXBhYmlsaXRpZXMuIFRoZSBjdXJyZW50IGNhcGFiaWxpdGllcyBhcmUgKi8KLS8qIHJldHVybmVkIHZpYSB0aGUgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBjYXBhYmlsaXR5IHN0cnVjdHVyZSAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZEQkVfU3VjY2VzcyAgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gICAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9HZXRDYXBhYmlsaXRpZXMoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgICAgKnBDYXBhYmlsaXRpZXMpCi17Ci0KLSAgICBMVkRCRV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLQotICAgICpwQ2FwYWJpbGl0aWVzID0gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXM7Ci0KLSAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICBMVkRCRV9TZXRGaWx0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU2V0cyB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhbmQgY2xlYXJzIHRoZSBkYXRhIGhpc3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcEluc3RhbmNlICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBQYXJhbXMgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkICAgIExWREJFX1NldEZpbHRlcnMoTFZEQkVfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKLXsKLQotI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotICAgIC8qCi0gICAgICogQ2FsY3VsYXRlIHRoZSB0YWJsZSBvZmZzZXRzCi0gICAgICovCi0gICAgTFZNX1VJTlQxNiBPZmZzZXQgPSAoTFZNX1VJTlQxNikoKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZSArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShwUGFyYW1zLT5DZW50cmVGcmVxdWVuY3kgKiAoMStMVkRCRV9GU18xOTIwMDApKSk7Ci0jZWxzZQotICAgIC8qCi0gICAgICogQ2FsY3VsYXRlIHRoZSB0YWJsZSBvZmZzZXRzCi0gICAgICovCi0gICAgTFZNX1VJTlQxNiBPZmZzZXQgPSAoTFZNX1VJTlQxNikoKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZSArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShwUGFyYW1zLT5DZW50cmVGcmVxdWVuY3kgKiAoMStMVkRCRV9GU180ODAwMCkpKTsgICAgCi0jZW5kaWYKLQotICAgIC8qCi0gICAgICogU2V0dXAgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIKLSAgICAgKi8KLSNpZm5kZWYgQlVJTERfRkxPQVQKLSAgICBMb2FkQ29uc3RfMTYoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGhpc3RvcnksIHZhbHVlIDAgKi8KLSAgICAgICAgICAgICAgICAgKHZvaWQgKikmcEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcywgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLwotICAgICAgICAgICAgICAgICBzaXplb2YocEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcykvc2l6ZW9mKExWTV9JTlQxNikpOyAgIC8qIE51bWJlciBvZiB3b3JkcyAqLwotI2Vsc2UKLSAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLwotICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMsICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCi0gICAgICAgICAgICAgICAgICAgIHNpemVvZihwSW5zdGFuY2UtPnBEYXRhLT5IUEZUYXBzKSAvIHNpemVvZihMVk1fRkxPQVQpKTsgLyogTnVtYmVyIG9mIHdvcmRzICovCi0jZW5kaWYKLSNpZm5kZWYgQlVJTERfRkxPQVQKLSAgICBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwgICAgLyogSW5pdGlhbGlzZSB0aGUgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCUV9DMzJfQ29lZnNfdCAqKSZMVkRCRV9IUEZfVGFibGVbT2Zmc2V0XSk7Ci0jZWxzZQotICAgIEJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLCAgICAvKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5IUEZUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJRX0ZMT0FUX0NvZWZzX3QgKikmTFZEQkVfSFBGX1RhYmxlW09mZnNldF0pOwotI2VuZGlmCi0KLQotICAgIC8qCi0gICAgICogU2V0dXAgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKLSAgICAgKi8KLSNpZm5kZWYgQlVJTERfRkxPQVQKLSAgICBMb2FkQ29uc3RfMTYoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGhpc3RvcnksIHZhbHVlIDAgKi8KLSAgICAgICAgICAgICAgICAgKHZvaWQgKikmcEluc3RhbmNlLT5wRGF0YS0+QlBGVGFwcywgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KLSAgICAgICAgICAgICAgICAgc2l6ZW9mKHBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMpL3NpemVvZihMVk1fSU5UMTYpKTsgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KLSNlbHNlCi0gICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCi0gICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMsICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KLSAgICAgICAgICAgICAgICAgc2l6ZW9mKHBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMpIC8gc2l6ZW9mKExWTV9GTE9BVCkpOyAgIC8qIE51bWJlciBvZiB3b3JkcyAqLwotI2VuZGlmCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0gICAgQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdCgmcEluc3RhbmNlLT5wQ29lZi0+QlBGSW5zdGFuY2UsICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRGF0YS0+QlBGVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChCUF9DMzJfQ29lZnNfdCAqKSZMVkRCRV9CUEZfVGFibGVbT2Zmc2V0XSk7Ci0jZWxzZQotICAgIEJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX0luaXQoJnBJbnN0YW5jZS0+cENvZWYtPkJQRkluc3RhbmNlLCAgICAvKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5CUEZUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJQX0ZMT0FUX0NvZWZzX3QgKikmTFZEQkVfQlBGX1RhYmxlW09mZnNldF0pOwotI2VuZGlmCi19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWREJFX1NldEFHQyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTZXRzIHRoZSBBR0MgZ2FpbiBsZXZlbCBhbmQgYXR0YWNrIGFuZCBkZWNheSB0aW1lcyBjb25zdGFudHMuICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFBhcmFtcyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgICAgTFZEQkVfU2V0QUdDKExWREJFX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKLXsKLQotICAgIC8qCi0gICAgICogR2V0IHRoZSBhdHRhY2sgYW5kIGRlY2F5IHRpbWUgY29uc3RhbnRzCi0gICAgICovCi0gICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX0F0dGFjayA9IExWREJFX0FHQ19BVFRBQ0tfVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07ICAvKiBBdHRhY2sgbXVsdGlwbGllciAqLwotICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19EZWNheSAgPSBMVkRCRV9BR0NfREVDQVlfVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07ICAgLyogRGVjYXkgbXVsdGlwbGVyICovCi0KLQotICAgIC8qCi0gICAgICogR2V0IHRoZSBib29zdCBnYWluCi0gICAgICovCi0gICAgaWYgKHBQYXJhbXMtPkhQRlNlbGVjdCA9PSBMVkRCRV9IUEZfT04pCi0gICAgewotICAgICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfTWF4R2FpbiAgID0gTFZEQkVfQUdDX0hQRkdBSU5fVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+RWZmZWN0TGV2ZWxdOyAgLyogSGlnaCBwYXNzIGZpbHRlciBvbiAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfTWF4R2FpbiAgID0gTFZEQkVfQUdDX0dBSU5fVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+RWZmZWN0TGV2ZWxdOyAgICAgLyogSGlnaCBwYXNzIGZpbHRlciBvZmYgKi8KLSAgICB9Ci0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0gICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX0dhaW5TaGlmdCA9IEFHQ19HQUlOX1NISUZUOwotI2VuZGlmCi0gICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX1RhcmdldCA9IEFHQ19UQVJHRVRMRVZFTDsKLQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZEQkVfU2V0Vm9sdW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvbnZlcnRzIHRoZSBpbnB1dCB2b2x1bWUgZGVtYW5kIGZyb20gZEJzIHRvIGxpbmVhci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBJbnN0YW5jZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwUGFyYW1zICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiBUaGUgdm9sdW1lIHNob3VsZCBoYXZlIHRoZSBmb2xsb3dpbmcgc2V0dGluZ3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgREJFICAgICAgICAgVm9sIENvbnRyb2wgICAgICAgICAgIFZvbHVtZSBzZXR0aW5nICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgID09PSAgICAgICAgID09PT09PT09PT09ICAgICAgICAgPT09PT09PT09PT09PT09PT09PSAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICBPZmYgICAgICAgICAgICAgT2ZmICAgICAgICAgICAgICAgICBIZWFkcm9vbWRCICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgT2ZmICAgICAgICAgICAgIE9uICAgICAgICAgICAgICBWb2x1bWVkQitIZWFkcm9vbWRCICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgIE9uICAgICAgICAgICAgICBPZmYgICAgICAgICAgICAgICAgIEhlYWRyb29tZEIgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICBPbiAgICAgICAgICAgICAgT24gICAgICAgICAgICAgIFZvbHVtZWRCK0hlYWRyb29tZEIgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgICAgTFZEQkVfU2V0Vm9sdW1lKExWREJFX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKLXsKLQotICAgIExWTV9VSU5UMTYgICAgICBkQlNoaWZ0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDZkQiBzaGlmdHMgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgZEJPZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUYWJsZSBvZmZzZXQgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgVm9sdW1lID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXF1aXJlZCB2b2x1bWUgaW4gZEJzICovCi0KLSNpZmRlZiBCVUlMRF9GTE9BVAotICAgIExWTV9GTE9BVCAgICAgICAgZEJTaGlmdHNfZmFjOwotI2VuZGlmCi0gICAgLyoKLSAgICAgKiBBcHBseSB0aGUgdm9sdW1lIGlmIGVuYWJsZWQKLSAgICAgKi8KLSAgICBpZiAocFBhcmFtcy0+Vm9sdW1lQ29udHJvbCA9PSBMVkRCRV9WT0xVTUVfT04pCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBMaW1pdCB0aGUgZ2FpbiB0byB0aGUgbWF4aW11bSBhbGxvd2VkCi0gICAgICAgICAqLwotICAgICAgICBpZiAgKHBQYXJhbXMtPlZvbHVtZWRCID4gVk9MVU1FX01BWCkKLSAgICAgICAgewotICAgICAgICAgICAgVm9sdW1lID0gVk9MVU1FX01BWDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFZvbHVtZSA9IHBQYXJhbXMtPlZvbHVtZWRCOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIENhbGN1bGF0ZSB0aGUgcmVxdWlyZWQgZ2FpbiBhbmQgc2hpZnRzCi0gICAgICovCi0gICAgZEJPZmZzZXQgPSAoTFZNX1VJTlQxNikoNiArIFZvbHVtZSAlIDYpOyAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBkQnMgMC01ICovCi0gICAgZEJTaGlmdHMgPSAoTFZNX1VJTlQxNikoVm9sdW1lIC8gLTYpOyAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSA2ZEIgc2hpZnRzICovCi0KLSNpZmRlZiBCVUlMRF9GTE9BVAotICAgIGRCU2hpZnRzX2ZhYyA9IChMVk1fRkxPQVQpKDEgPDwgZEJTaGlmdHMpOwotI2VuZGlmCi0gICAgLyoKLSAgICAgKiBXaGVuIERCRSBpcyBlbmFibGVkIHVzZSBBR0Mgdm9sdW1lCi0gICAgICovCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0gICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID0gKChMVk1fSU5UMzIpTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdIDw8IDE2KTsKLSAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQgPSBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQgPj4gZEJTaGlmdHM7Ci0jZWxzZQotICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlRhcmdldCA9IChMVkRCRV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pOwotICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlRhcmdldCA9IHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlRhcmdldCAvIGRCU2hpZnRzX2ZhYzsKLSNlbmRpZgotICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlZvbHVtZVRDICAgID0gTFZEQkVfVm9sdW1lVENUYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsgICAvKiBWb2x1bWUgdXBkYXRlIHRpbWUgY29uc3RhbnQgKi8KLSNpZm5kZWYgQlVJTERfRkxPQVQKLSAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5Wb2x1bWVTaGlmdCA9IFZPTFVNRV9TSElGVCsxOwotI2VuZGlmCi0KLSAgICAvKgotICAgICAqIFdoZW4gREJFIGlzIGRpc2FibGVkIHVzZSB0aGUgYnlwYXNzIHZvbHVtZSBjb250cm9sCi0gICAgICovCi0gICAgaWYoZEJTaGlmdHMgPiAwKQotICAgIHsKLSNpZm5kZWYgQlVJTERfRkxPQVQKLSAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLCgoKExWTV9JTlQzMilMVkRCRV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pID4+IGRCU2hpZnRzKSk7Ci0jZWxzZQotICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdIC8gZEJTaGlmdHNfZmFjKTsKLSNlbmRpZgotICAgIH0KLSAgICBlbHNlCi0gICAgewotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sKExWTV9JTlQzMilMVkRCRV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pOwotI2Vsc2UKLSAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICBwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSAxOwotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfTUlYRVJfVEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRnNfZW4pcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMik7Ci0jZWxzZQotICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfTUlYRVJfVEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRnNfZW4pcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMik7Ci0jZW5kaWYKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWREJFX0NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNldHMgb3IgY2hhbmdlcyB0aGUgQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzLiBDaGFuZ2luZyB0aGUgcGFyYW1ldGVycyB3aGlsZSB0aGUgICovCi0vKiAgbW9kdWxlIGlzIHByb2Nlc3Npbmcgc2lnbmFscyBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZGUgZWZmZWN0czogICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEdlbmVyYWwgcGFyYW1ldGVyczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgPT09PT09PT09PT09PT09PT09PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBPcGVyYXRpbmdNb2RlOiAgICAgIENoYW5naW5nIHRoZSBtb2RlIG9mIG9wZXJhdGlvbiBtYXkgY2F1c2UgYSBjaGFuZ2UgaW4gdm9sdW1lICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgb3IgY2F1c2UgcG9wcyBhbmQgY2xpY2tzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTYW1wbGVSYXRlOiAgICAgICAgIENoYW5naW5nIHRoZSBzYW1wbGUgcmF0ZSBtYXkgY2F1c2UgcG9wcyBhbmQgY2xpY2tzLiAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRWZmZWN0TGV2ZWw6ICAgICAgICBDaGFuZ2luZyB0aGUgZWZmZWN0IGxldmVsIG1heSBjYXVzZSBwb3BzIGFuZCBjbGlja3MgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENlbnRyZUZyZXF1ZW5jeTogICAgQ2hhbmdpbmcgdGhlIGNlbnRyZSBmcmVxdWVuY3kgbWF5IGNhdXNlIHBvcHMgYW5kIGNsaWNrcyAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBIUEZTZWxlY3Q6ICAgICAgICAgIFNlbGVjdGluZy9kZS1zZWxlY3RpbmcgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgbWF5IGNhdXNlIHBvcHMgYW5kICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgY2xpY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBWb2x1bWVkQiAgICAgICAgICAgIENoYW5naW5nIHRoZSB2b2x1bWUgc2V0dGluZyB3aWxsIGhhdmUgbm8gc2lkZSBlZmZlY3RzICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhIHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Db250cm9sKExWREJFX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAgICpwUGFyYW1zKQotewotCi0gICAgTFZEQkVfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZEQkVfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0gICAgTFZNaXhlcjNfMlN0X3N0ICAgICAqcEJ5cGFzc01peGVyX0luc3RhbmNlID0gJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyOwotI2Vsc2UKLSAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QgICAgICpwQnlwYXNzTWl4ZXJfSW5zdGFuY2UgPSAmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXI7Ci0jZW5kaWYKLQotCi0gICAgLyoKLSAgICAgKiBVcGRhdGUgdGhlIGZpbHRlcnMKLSAgICAgKi8KLSAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKLSAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLkNlbnRyZUZyZXF1ZW5jeSAhPSBwUGFyYW1zLT5DZW50cmVGcmVxdWVuY3kpKQotICAgIHsKLSAgICAgICAgTFZEQkVfU2V0RmlsdGVycyhwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOyAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyAqLwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBVcGRhdGUgdGhlIEFHQyBpcyB0aGUgZWZmZWN0IGxldmVsIGhhcyBjaGFuZ2VkCi0gICAgICovCi0gICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8Ci0gICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5FZmZlY3RMZXZlbCAhPSBwUGFyYW1zLT5FZmZlY3RMZXZlbCkgfHwKLSAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCAhPSBwUGFyYW1zLT5IUEZTZWxlY3QpKQotICAgIHsKLSAgICAgICAgTFZEQkVfU2V0QUdDKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLwotICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyAqLwotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLAotICAgICAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKLQotICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAotICAgICAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKLSNlbHNlCi0gICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sCi0gICAgICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKLQotICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAotICAgICAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7Ci0jZW5kaWYKLQotCi0gICAgfQotCi0KLSAgICAvKgotICAgICAqIFVwZGF0ZSB0aGUgVm9sdW1lIGlmIHRoZSB2b2x1bWUgZGVtYW5kIGhhcyBjaGFuZ2VkCi0gICAgICovCi0gICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5Wb2x1bWVkQiAhPSBwUGFyYW1zLT5Wb2x1bWVkQikgfHwKLSAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKLSAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLkhlYWRyb29tZEIgIT0gcFBhcmFtcy0+SGVhZHJvb21kQikgfHwKLSAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlZvbHVtZUNvbnRyb2wgIT0gcFBhcmFtcy0+Vm9sdW1lQ29udHJvbCkpCi0gICAgewotICAgICAgICBMVkRCRV9TZXRWb2x1bWUocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzICovCi0gICAgfQotCi0gICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGU9PUxWREJFX09OICYmIHBQYXJhbXMtPk9wZXJhdGluZ01vZGU9PUxWREJFX09GRikKLSAgICB7Ci0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLDApOwotICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwweDAwMDA3RkZGKTsKLSNlbHNlCi0gICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLCAwKTsKLSAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDEuMGYpOwotI2VuZGlmCi0gICAgfQotICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlPT1MVkRCRV9PRkYgJiYgcFBhcmFtcy0+T3BlcmF0aW5nTW9kZT09TFZEQkVfT04pCi0gICAgewotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwweDAwMDA3RkZGKTsKLSAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sMCk7Ci0jZWxzZQotICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwgMS4wZik7Ci0gICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLCAwKTsKLSNlbmRpZgotICAgIH0KLQotICAgIC8qCi0gICAgICogVXBkYXRlIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgcEluc3RhbmNlLT5QYXJhbXMgPSAqcFBhcmFtczsKLQotCi0gICAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0NvbnRyb2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzZmVhZTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfQ29udHJvbC5jcHAKQEAgLTAsMCArMSwzNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkRCRS5oIgorI2luY2x1ZGUgIkxWREJFX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiTFZEQkVfQ29lZmZzLmgiCisjaW5jbHVkZSAiTFZEQkVfVGFibGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICBMVkRCRV9HZXRQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBSZXF1ZXN0IHRoZSBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycy4gVGhlIGN1cnJlbnQgcGFyYW1ldGVyIHNldCBpcyAgICAgKi8KKy8qICByZXR1cm5lZCB2aWEgdGhlIHBhcmFtZXRlciBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWREJFX1NVQ0NFU1MgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICAgIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkRCRV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfR2V0UGFyYW1ldGVycyhMVkRCRV9IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAgKnBQYXJhbXMpCit7CisKKyAgICBMVkRCRV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworICAgICpwUGFyYW1zID0gcEluc3RhbmNlLT5QYXJhbXM7CisKKyAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgTFZEQkVfR2V0Q2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogRHluYW1pYyBCYXNzIEVuaG5hY2VtZW50IGNhcGFiaWxpdGllcy4gVGhlIGN1cnJlbnQgY2FwYWJpbGl0aWVzIGFyZSAqLworLyogcmV0dXJuZWQgdmlhIHRoZSBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGNhcGFiaWxpdHkgc3RydWN0dXJlICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9TdWNjZXNzICAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0dldENhcGFiaWxpdGllcyhMVkRCRV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DYXBhYmlsaXRpZXNfdCAgICAqcENhcGFiaWxpdGllcykKK3sKKworICAgIExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisgICAgKnBDYXBhYmlsaXRpZXMgPSBwSW5zdGFuY2UtPkNhcGFiaWxpdGllczsKKworICAgIHJldHVybihMVkRCRV9TVUNDRVNTKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVkRCRV9TZXRGaWx0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhbmQgY2xlYXJzIHRoZSBkYXRhIGhpc3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluc3RhbmNlICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkICAgIExWREJFX1NldEZpbHRlcnMoTFZEQkVfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKK3sKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSB0YWJsZSBvZmZzZXRzCisgICAgICovCisgICAgTFZNX1VJTlQxNiBPZmZzZXQgPSAoTFZNX1VJTlQxNikoKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZSArIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShwUGFyYW1zLT5DZW50cmVGcmVxdWVuY3kgKiAoMStMVkRCRV9GU18xOTIwMDApKSk7CisKKyAgICAvKgorICAgICAqIFNldHVwIHRoZSBoaWdoIHBhc3MgZmlsdGVyCisgICAgICovCisgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGhpc3RvcnksIHZhbHVlIDAgKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopJnBJbnN0YW5jZS0+cERhdGEtPkhQRlRhcHMsICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICBzaXplb2YocEluc3RhbmNlLT5wRGF0YS0+SFBGVGFwcykgLyBzaXplb2YoTFZNX0ZMT0FUKSk7IC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgIEJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLCAgICAvKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5IUEZUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEJRX0ZMT0FUX0NvZWZzX3QgKikmTFZEQkVfSFBGX1RhYmxlW09mZnNldF0pOworCisgICAgLyoKKyAgICAgKiBTZXR1cCB0aGUgYmFuZCBwYXNzIGZpbHRlcgorICAgICAqLworICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLworICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopJnBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMsICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICBzaXplb2YocEluc3RhbmNlLT5wRGF0YS0+QlBGVGFwcykgLyBzaXplb2YoTFZNX0ZMT0FUKSk7ICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdCgmcEluc3RhbmNlLT5wQ29lZi0+QlBGSW5zdGFuY2UsICAgIC8qIEluaXRpYWxpc2UgdGhlIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkJQRlRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQlBfRkxPQVRfQ29lZnNfdCAqKSZMVkRCRV9CUEZfVGFibGVbT2Zmc2V0XSk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZEQkVfU2V0QUdDICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNldHMgdGhlIEFHQyBnYWluIGxldmVsIGFuZCBhdHRhY2sgYW5kIGRlY2F5IHRpbWVzIGNvbnN0YW50cy4gICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAgICBMVkRCRV9TZXRBR0MoTFZEQkVfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQoreworCisgICAgLyoKKyAgICAgKiBHZXQgdGhlIGF0dGFjayBhbmQgZGVjYXkgdGltZSBjb25zdGFudHMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfQXR0YWNrID0gTFZEQkVfQUdDX0FUVEFDS19UYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsgIC8qIEF0dGFjayBtdWx0aXBsaWVyICovCisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX0RlY2F5ICA9IExWREJFX0FHQ19ERUNBWV9UYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsgICAvKiBEZWNheSBtdWx0aXBsZXIgKi8KKworICAgIC8qCisgICAgICogR2V0IHRoZSBib29zdCBnYWluCisgICAgICovCisgICAgaWYgKHBQYXJhbXMtPkhQRlNlbGVjdCA9PSBMVkRCRV9IUEZfT04pCisgICAgeworICAgICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfTWF4R2FpbiAgID0gTFZEQkVfQUdDX0hQRkdBSU5fVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+RWZmZWN0TGV2ZWxdOyAgLyogSGlnaCBwYXNzIGZpbHRlciBvbiAqLworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5BR0NfTWF4R2FpbiAgID0gTFZEQkVfQUdDX0dBSU5fVGFibGVbKExWTV9VSU5UMTYpcFBhcmFtcy0+RWZmZWN0TGV2ZWxdOyAgICAgLyogSGlnaCBwYXNzIGZpbHRlciBvZmYgKi8KKyAgICB9CisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX1RhcmdldCA9IEFHQ19UQVJHRVRMRVZFTDsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWREJFX1NldFZvbHVtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb252ZXJ0cyB0aGUgaW5wdXQgdm9sdW1lIGRlbWFuZCBmcm9tIGRCcyB0byBsaW5lYXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhlIHZvbHVtZSBzaG91bGQgaGF2ZSB0aGUgZm9sbG93aW5nIHNldHRpbmdzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIERCRSAgICAgICAgIFZvbCBDb250cm9sICAgICAgICAgICBWb2x1bWUgc2V0dGluZyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICA9PT0gICAgICAgICA9PT09PT09PT09PSAgICAgICAgID09PT09PT09PT09PT09PT09PT0gICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgT2ZmICAgICAgICAgICAgIE9mZiAgICAgICAgICAgICAgICAgSGVhZHJvb21kQiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIE9mZiAgICAgICAgICAgICBPbiAgICAgICAgICAgICAgVm9sdW1lZEIrSGVhZHJvb21kQiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBPbiAgICAgICAgICAgICAgT2ZmICAgICAgICAgICAgICAgICBIZWFkcm9vbWRCICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgT24gICAgICAgICAgICAgIE9uICAgICAgICAgICAgICBWb2x1bWVkQitIZWFkcm9vbWRCICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkICAgIExWREJFX1NldFZvbHVtZShMVkRCRV9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCit7CisKKyAgICBMVk1fVUlOVDE2ICAgICAgZEJTaGlmdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2ZEIgc2hpZnRzICovCisgICAgTFZNX1VJTlQxNiAgICAgIGRCT2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGFibGUgb2Zmc2V0ICovCisgICAgTFZNX0lOVDE2ICAgICAgIFZvbHVtZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVxdWlyZWQgdm9sdW1lIGluIGRCcyAqLworCisgICAgTFZNX0ZMT0FUICAgICAgICBkQlNoaWZ0c19mYWM7CisgICAgLyoKKyAgICAgKiBBcHBseSB0aGUgdm9sdW1lIGlmIGVuYWJsZWQKKyAgICAgKi8KKyAgICBpZiAocFBhcmFtcy0+Vm9sdW1lQ29udHJvbCA9PSBMVkRCRV9WT0xVTUVfT04pCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBMaW1pdCB0aGUgZ2FpbiB0byB0aGUgbWF4aW11bSBhbGxvd2VkCisgICAgICAgICAqLworICAgICAgICBpZiAgKHBQYXJhbXMtPlZvbHVtZWRCID4gVk9MVU1FX01BWCkKKyAgICAgICAgeworICAgICAgICAgICAgVm9sdW1lID0gVk9MVU1FX01BWDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIFZvbHVtZSA9IHBQYXJhbXMtPlZvbHVtZWRCOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIHJlcXVpcmVkIGdhaW4gYW5kIHNoaWZ0cworICAgICAqLworICAgIGRCT2Zmc2V0ID0gKExWTV9VSU5UMTYpKDYgKyBWb2x1bWUgJSA2KTsgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgZEJzIDAtNSAqLworICAgIGRCU2hpZnRzID0gKExWTV9VSU5UMTYpKFZvbHVtZSAvIC02KTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgNmRCIHNoaWZ0cyAqLworCisgICAgZEJTaGlmdHNfZmFjID0gKExWTV9GTE9BVCkoMSA8PCBkQlNoaWZ0cyk7CisgICAgLyoKKyAgICAgKiBXaGVuIERCRSBpcyBlbmFibGVkIHVzZSBBR0Mgdm9sdW1lCisgICAgICovCisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID0gKExWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk7CisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0ID0gcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0IC8gZEJTaGlmdHNfZmFjOworICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLlZvbHVtZVRDICAgID0gTFZEQkVfVm9sdW1lVENUYWJsZVsoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsgICAvKiBWb2x1bWUgdXBkYXRlIHRpbWUgY29uc3RhbnQgKi8KKworICAgIC8qCisgICAgICogV2hlbiBEQkUgaXMgZGlzYWJsZWQgdXNlIHRoZSBieXBhc3Mgdm9sdW1lIGNvbnRyb2wKKyAgICAgKi8KKyAgICBpZihkQlNoaWZ0cyA+IDApCisgICAgeworICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfVm9sdW1lVGFibGVbZEJPZmZzZXRdIC8gZEJTaGlmdHNfZmFjKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1ZvbHVtZVRhYmxlW2RCT2Zmc2V0XSk7CisgICAgfQorCisgICAgcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMTsKKyAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUuTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX01JWEVSX1RDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZzX2VuKXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWREJFX0NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNldHMgb3IgY2hhbmdlcyB0aGUgQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzLiBDaGFuZ2luZyB0aGUgcGFyYW1ldGVycyB3aGlsZSB0aGUgICovCisvKiAgbW9kdWxlIGlzIHByb2Nlc3Npbmcgc2lnbmFscyBtYXkgaGF2ZSB0aGUgZm9sbG93aW5nIHNpZGUgZWZmZWN0czogICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEdlbmVyYWwgcGFyYW1ldGVyczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgPT09PT09PT09PT09PT09PT09PSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBPcGVyYXRpbmdNb2RlOiAgICAgIENoYW5naW5nIHRoZSBtb2RlIG9mIG9wZXJhdGlvbiBtYXkgY2F1c2UgYSBjaGFuZ2UgaW4gdm9sdW1lICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgb3IgY2F1c2UgcG9wcyBhbmQgY2xpY2tzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTYW1wbGVSYXRlOiAgICAgICAgIENoYW5naW5nIHRoZSBzYW1wbGUgcmF0ZSBtYXkgY2F1c2UgcG9wcyBhbmQgY2xpY2tzLiAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRWZmZWN0TGV2ZWw6ICAgICAgICBDaGFuZ2luZyB0aGUgZWZmZWN0IGxldmVsIG1heSBjYXVzZSBwb3BzIGFuZCBjbGlja3MgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENlbnRyZUZyZXF1ZW5jeTogICAgQ2hhbmdpbmcgdGhlIGNlbnRyZSBmcmVxdWVuY3kgbWF5IGNhdXNlIHBvcHMgYW5kIGNsaWNrcyAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBIUEZTZWxlY3Q6ICAgICAgICAgIFNlbGVjdGluZy9kZS1zZWxlY3RpbmcgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgbWF5IGNhdXNlIHBvcHMgYW5kICAqLworLyogICAgICAgICAgICAgICAgICAgICAgY2xpY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBWb2x1bWVkQiAgICAgICAgICAgIENoYW5naW5nIHRoZSB2b2x1bWUgc2V0dGluZyB3aWxsIGhhdmUgbm8gc2lkZSBlZmZlY3RzICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhIHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Db250cm9sKExWREJFX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAgICpwUGFyYW1zKQoreworCisgICAgTFZEQkVfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZEQkVfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgICAqcEJ5cGFzc01peGVyX0luc3RhbmNlID0gJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyOworCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGZpbHRlcnMKKyAgICAgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLkNlbnRyZUZyZXF1ZW5jeSAhPSBwUGFyYW1zLT5DZW50cmVGcmVxdWVuY3kpKQorICAgIHsKKyAgICAgICAgTFZEQkVfU2V0RmlsdGVycyhwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOyAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyAqLworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBBR0MgaXMgdGhlIGVmZmVjdCBsZXZlbCBoYXMgY2hhbmdlZAorICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuRWZmZWN0TGV2ZWwgIT0gcFBhcmFtcy0+RWZmZWN0TGV2ZWwpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5IUEZTZWxlY3QgIT0gcFBhcmFtcy0+SFBGU2VsZWN0KSkKKyAgICB7CisgICAgICAgIExWREJFX1NldEFHQyhwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgKi8KKyAgICAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworCisgICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBWb2x1bWUgaWYgdGhlIHZvbHVtZSBkZW1hbmQgaGFzIGNoYW5nZWQKKyAgICAgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlZvbHVtZWRCICE9IHBQYXJhbXMtPlZvbHVtZWRCKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuSGVhZHJvb21kQiAhPSBwUGFyYW1zLT5IZWFkcm9vbWRCKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuVm9sdW1lQ29udHJvbCAhPSBwUGFyYW1zLT5Wb2x1bWVDb250cm9sKSkKKyAgICB7CisgICAgICAgIExWREJFX1NldFZvbHVtZShwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgKi8KKyAgICB9CisKKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZT09TFZEQkVfT04gJiYgcFBhcmFtcy0+T3BlcmF0aW5nTW9kZT09TFZEQkVfT0ZGKQorICAgIHsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sIDApOworICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSwgMS4wZik7CisgICAgfQorICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlPT1MVkRCRV9PRkYgJiYgcFBhcmFtcy0+T3BlcmF0aW5nTW9kZT09TFZEQkVfT04pCisgICAgeworICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwgMS4wZik7CisgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLCAwKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycworICAgICAqLworICAgIHBJbnN0YW5jZS0+UGFyYW1zID0gKnBQYXJhbXM7CisKKyAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX0luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmZjJhMi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJMVkRCRS5oIgotI2luY2x1ZGUgIkxWREJFX1ByaXZhdGUuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZEQkVfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAqLwotLyogICAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAqLwotLyogICAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICovCi0vKiAgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICovCi0vKiAgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAqLwotLyogICAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWREJFX1NVQ0NFU1MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgMS4gICAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVkRCRV9SZXR1cm5TdGF0dXNfZW4gTFZEQkVfTWVtb3J5KExWREJFX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9NZW1UYWJfdCAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICAgICAgKnBDYXBhYmlsaXRpZXMpCi17Ci0KLSAgICBMVk1fVUlOVDMyICAgICAgICAgIFNjcmF0Y2hTaXplOwotICAgIExWREJFX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9IChMVkRCRV9JbnN0YW5jZV90ICopaEluc3RhbmNlOwotCi0KLSAgICAvKgotICAgICAqIEZpbGwgaW4gdGhlIG1lbW9yeSB0YWJsZQotICAgICAqLwotICAgIGlmIChoSW5zdGFuY2UgPT0gTFZNX05VTEwpCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBJbnN0YW5jZSBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9JTlNUQU5DRV0uU2l6ZSAgICAgICAgID0gc2l6ZW9mKExWREJFX0luc3RhbmNlX3QpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0VdLkFsaWdubWVudCAgICA9IExWREJFX0lOU1RBTkNFX0FMSUdOOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0VdLlR5cGUgICAgICAgICA9IExWREJFX1BFUlNJU1RFTlQ7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogRGF0YSBtZW1vcnkKLSAgICAgICAgICovCi0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgID0gc2l6ZW9mKExWREJFX0RhdGFfRkxPQVRfdCk7Ci0jZWxzZQotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplICAgICAgICAgPSBzaXplb2YoTFZEQkVfRGF0YV90KTsKLSNlbmRpZgotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5BbGlnbm1lbnQgICAgPSBMVkRCRV9QRVJTSVNURU5UX0RBVEFfQUxJR047Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlR5cGUgICAgICAgICA9IExWREJFX1BFUlNJU1RFTlRfREFUQTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ29lZiBtZW1vcnkKLSAgICAgICAgICovCi0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgID0gc2l6ZW9mKExWREJFX0NvZWZfRkxPQVRfdCk7Ci0jZWxzZQotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgICAgICAgPSBzaXplb2YoTFZEQkVfQ29lZl90KTsgICAKLSNlbmRpZgotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5BbGlnbm1lbnQgICAgPSBMVkRCRV9QRVJTSVNURU5UX0NPRUZfQUxJR047Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlR5cGUgICAgICAgICA9IExWREJFX1BFUlNJU1RFTlRfQ09FRjsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2NyYXRjaCBtZW1vcnkKLSAgICAgICAgICovCi0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICAgICAgU2NyYXRjaFNpemUgPSAoTFZNX1VJTlQzMikoTFZEQkVfU0NSQVRDSEJVRkZFUlNfSU5QTEFDRSpzaXplb2YoTFZNX0ZMT0FUKSAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpOwotI2Vsc2UgLypCVUlMRF9GTE9BVCovCi0gICAgICAgIFNjcmF0Y2hTaXplID0gKExWTV9VSU5UMzIpKExWREJFX1NDUkFUQ0hCVUZGRVJTX0lOUExBQ0Uqc2l6ZW9mKExWTV9JTlQxNikqcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsKLSNlbmRpZgotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0uU2l6ZSAgICAgICAgID0gU2NyYXRjaFNpemU7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5BbGlnbm1lbnQgICAgPSBMVkRCRV9TQ1JBVENIX0FMSUdOOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0uVHlwZSAgICAgICAgID0gTFZEQkVfU0NSQVRDSDsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBSZWFkIGJhY2sgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KLSAgICAgICAgKnBNZW1vcnlUYWJsZSA9IHBJbnN0YW5jZS0+TWVtb3J5VGFibGU7Ci0gICAgfQotCi0gICAgcmV0dXJuKExWREJFX1NVQ0NFU1MpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWREJFX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IG1vZHVsZSAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gYWxnb3JpdGhtIGluc3RhbmNlIGJ5IGNhbGxpbmcgd2l0aCAgICAgICAgICovCi0vKiAgICBoSW5zdGFuY2Ugc2V0IHRvIE5VTEwuIEluIHRoaXMgY2FzZSB0aGUgYWxnb3JpdGhtIHJldHVybnMgdGhlIG5ldyBpbnN0YW5jZSAgICAgICAgKi8KLS8qICAgIGhhbmRsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGEgZnVsbCByZS1pbml0aWFsaXNhdGlvbiBvZiB0aGUgYWxnb3JpdGhtICAgICAgKi8KLS8qICAgIGJ5IGNhbGxpbmcgd2l0aCBoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUuIEluIHRoaXMgY2FzZSB0aGUgbWVtb3J5IHRhYmxlICAgICAgICAqLwotLyogICAgc2hvdWxkIGJlIGNvcnJlY3QgZm9yIHRoZSBpbnN0YW5jZSwgdGhpcyBjYW4gYmUgZW5zdXJlZCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiAgICovCi0vKiAgICBEQkVfTWVtb3J5IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWREJFX1NVQ0NFU1MgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZEQkVfQUxJR05NRU5URVJST1IgICAgSW5zdGFuY2Ugb3Igc2NyYXRjaCBtZW1vcnkgb24gaW5jb3JyZWN0IGFsaWdubWVudCAgICAgICAgICAgKi8KLS8qICAgIExWREJFX05VTExBRERSRVNTICAgICAgICBJbnN0YW5jZSBvciBzY3JhdGNoIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiAgICAgVGhlIGluc3RhbmNlIGhhbmRsZSBpcyB0aGUgcG9pbnRlciB0byB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBtZW1vcnkgICAqLwotLyogICAgICAgIHJlZ2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAyLiAgICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkRCRV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Jbml0KExWREJFX0hhbmRsZV90ICAgICAgICAgKnBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX01lbVRhYl90ICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NhcGFiaWxpdGllc190ICpwQ2FwYWJpbGl0aWVzKQotewotCi0gICAgTFZEQkVfSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2U7Ci0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICBMVk1peGVyM18xU3RfRkxPQVRfc3QgICAgICAgKnBNaXhlcl9JbnN0YW5jZTsKLSAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QgICAgICAgKnBCeXBhc3NNaXhlcl9JbnN0YW5jZTsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgTWl4R2FpbjsKLSNlbHNlCi0gICAgTFZNaXhlcjNfMVN0X3N0ICAgICAgICpwTWl4ZXJfSW5zdGFuY2U7Ci0gICAgTFZNaXhlcjNfMlN0X3N0ICAgICAgICpwQnlwYXNzTWl4ZXJfSW5zdGFuY2U7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICAgIE1peEdhaW47Ci0jZW5kaWYKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgaTsKLQotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIGluc3RhbmNlIGhhbmRsZSBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXNlZAotICAgICAqLwotICAgIGlmICgqcGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgICpwaEluc3RhbmNlID0gKExWREJFX0hhbmRsZV90KXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzOwotICAgIH0KLSAgICBwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICAqKSpwaEluc3RhbmNlOwotCi0KLSAgICAvKgotICAgICAqIENoZWNrIHRoZSBtZW1vcnkgdGFibGUgZm9yIE5VTEwgcG9pbnRlcnMgYW5kIGluY29ycmVjdGx5IGFsaWduZWQgZGF0YQotICAgICAqLwotICAgIGZvciAoaT0wOyBpPExWREJFX05SX01FTU9SWV9SRUdJT05TOyBpKyspCi0gICAgewotICAgICAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25baV0uU2l6ZSE9MCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLnBCYXNlQWRkcmVzcz09TFZNX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKExWREJFX05VTExBRERSRVNTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoKHVpbnRwdHJfdClwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgJSBwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5BbGlnbm1lbnQpIT0wKXsKLSAgICAgICAgICAgICAgICByZXR1cm4oTFZEQkVfQUxJR05NRU5URVJST1IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlCi0gICAgICovCi0gICAgcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMgPSAqcENhcGFiaWxpdGllczsKLQotCi0gICAgLyoKLSAgICAgKiBTYXZlIHRoZSBtZW1vcnkgdGFibGUgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZQotICAgICAqLwotICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUgPSAqcE1lbW9yeVRhYmxlOwotCi0KLSAgICAvKgotICAgICAqIFNldCB0aGUgZGVmYXVsdCBpbnN0YW5jZSBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgcEluc3RhbmNlLT5QYXJhbXMuQ2VudHJlRnJlcXVlbmN5ICAgPSAgICBMVkRCRV9DRU5UUkVfNTVIWjsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5FZmZlY3RMZXZlbCAgICAgICA9ICAgIDA7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuSGVhZHJvb21kQiAgICAgICAgPSAgICAwOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCAgICAgICAgID0gICAgTFZEQkVfSFBGX09GRjsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICAgICA9ICAgIExWREJFX09GRjsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICAgICAgICA9ICAgIExWREJFX0ZTXzgwMDA7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuVm9sdW1lQ29udHJvbCAgICAgPSAgICBMVkRCRV9WT0xVTUVfT0ZGOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZvbHVtZWRCICAgICAgICAgID0gICAgMDsKLQotCi0gICAgLyoKLSAgICAgKiBTZXQgcG9pbnRlciB0byBkYXRhIGFuZCBjb2VmIG1lbW9yeQotICAgICAqLwotICAgIHBJbnN0YW5jZS0+cERhdGEgPSBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3M7Ci0gICAgcEluc3RhbmNlLT5wQ29lZiA9IHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzczsKLQotCi0gICAgLyoKLSAgICAgKiBJbml0aWFsaXNlIHRoZSBmaWx0ZXJzCi0gICAgICovCi0gICAgTFZEQkVfU2V0RmlsdGVycyhwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGZpbHRlciB0YXBzIGFuZCBjb2VmZmljaWVudHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBhcmFtcyk7Ci0KLQotICAgIC8qCi0gICAgICogSW5pdGlhbGlzZSB0aGUgQUdDCi0gICAgICovCi0gICAgTFZEQkVfU2V0QUdDKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBBR0MgZ2FpbiAqLwotICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QYXJhbXMpOwotICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19HYWluID0gcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX01heEdhaW47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWZhdWx0IHRvIHRoZSBiYXNzIGJvb3N0IHNldHRpbmcgKi8KLQotICAgIC8vIGluaXRpYWxpemUgdGhlIG1peGVyIHdpdGggc29tZSBmaXhlcyB2YWx1ZXMgc2luY2Ugb3RoZXJ3aXNlIExWREJFX1NldFZvbHVtZSBlbmRzIHVwCi0gICAgLy8gcmVhZGluZyB1bmluaXRpYWxpemVkIGRhdGEKLSAgICBwTWl4ZXJfSW5zdGFuY2UgPSAmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lOwotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgIExWQ19NaXhlcl9Jbml0KCZwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLDB4MDAwMDdGRkYsMHgwMDAwN0ZGRik7Ci0jZWxzZQotICAgIExWQ19NaXhlcl9Jbml0KCZwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCAxLjAsIDEuMCk7Ci0jZW5kaWYKLQotICAgIC8qCi0gICAgICogSW5pdGlhbGlzZSB0aGUgdm9sdW1lCi0gICAgICovCi0gICAgTFZEQkVfU2V0Vm9sdW1lKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgVm9sdW1lICovCi0gICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBhcmFtcyk7Ci0KLSAgICBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5Wb2x1bWUgPSBwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZS5UYXJnZXQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbml0aWFsaXNlIGFzIHRoZSB0YXJnZXQgKi8KLSNpZm5kZWYgQlVJTERfRkxPQVQKLSAgICBNaXhHYWluID0gTFZDX01peGVyX0dldFRhcmdldCgmcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSk7Ci0gICAgTFZDX01peGVyX0luaXQoJnBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sTWl4R2FpbixNaXhHYWluKTsKLSNlbHNlCi0gICAgTWl4R2FpbiA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pOwotICAgIExWQ19NaXhlcl9Jbml0KCZwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCBNaXhHYWluLCBNaXhHYWluKTsKLSNlbmRpZgotCi0gICAgLyogQ29uZmlndXJlIHRoZSBtaXhlciBwcm9jZXNzIHBhdGggKi8KLSAgICBwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gPSAwOwotICAgIHBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7Ci0gICAgcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKLSAgICBwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMDsKLQotICAgIC8qCi0gICAgICogSW5pdGlhbGlzZSB0aGUgY2xpY2tzIG1pbmltaXNhdGlvbiBCeXBhc3NNaXhlcgotICAgICAqLwotCi0gICAgcEJ5cGFzc01peGVyX0luc3RhbmNlID0gJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyOwotCi0gICAgLyoKLSAgICAgKiBTZXR1cCB0aGUgbWl4ZXIgZ2FpbiBmb3IgdGhlIHByb2Nlc3NlZCBwYXRoCi0gICAgICovCi0gICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtID0gMDsKLSAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOwotICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrID0gTFZNX05VTEw7Ci0gICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldD0wOwotCi0gICAgTFZDX01peGVyX0luaXQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sMCwwKTsKLSAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLAotICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLDIpOwotCi0gICAgLyoKLSAgICAgKiBTZXR1cCB0aGUgbWl4ZXIgZ2FpbiBmb3IgdGhlIHVucHJvY2Vzc2VkIHBhdGgKLSAgICAgKi8KLSAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gPSAwOwotICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7Ci0gICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKLSAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0PTA7Ci0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0gICAgTFZDX01peGVyX0luaXQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sMHgwMDAwN0ZGRiwweDAwMDA3RkZGKTsKLSAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAotICAgICAgICBMVkRCRV9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLDIpOwotI2Vsc2UKLSAgICBMVkNfTWl4ZXJfSW5pdCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwgMS4wLCAxLjApOwotICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCi0gICAgICAgIExWREJFX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsIDIpOwotI2VuZGlmCi0KLSAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfSW5pdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ3NzY5NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Jbml0LmNwcApAQCAtMCwwICsxLDI4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWREJFLmgiCisjaW5jbHVkZSAiTFZEQkVfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkRCRV9NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICovCisvKiAgICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICovCisvKiAgICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgKi8KKy8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgKi8KKy8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICovCisvKiAgICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAxLiAgICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZEQkVfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9NZW1vcnkoTFZEQkVfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX01lbVRhYl90ICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgICAgICAqcENhcGFiaWxpdGllcykKK3sKKworICAgIExWTV9VSU5UMzIgICAgICAgICAgU2NyYXRjaFNpemU7CisgICAgTFZEQkVfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0gKExWREJFX0luc3RhbmNlX3QgKiloSW5zdGFuY2U7CisKKyAgICAvKgorICAgICAqIEZpbGwgaW4gdGhlIG1lbW9yeSB0YWJsZQorICAgICAqLworICAgIGlmIChoSW5zdGFuY2UgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBJbnN0YW5jZSBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9JTlNUQU5DRV0uU2l6ZSAgICAgICAgID0gc2l6ZW9mKExWREJFX0luc3RhbmNlX3QpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0VdLkFsaWdubWVudCAgICA9IExWREJFX0lOU1RBTkNFX0FMSUdOOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0VdLlR5cGUgICAgICAgICA9IExWREJFX1BFUlNJU1RFTlQ7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRGF0YSBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlNpemUgICA9IHNpemVvZihMVkRCRV9EYXRhX0ZMT0FUX3QpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5BbGlnbm1lbnQgICAgPSBMVkRCRV9QRVJTSVNURU5UX0RBVEFfQUxJR047CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlR5cGUgICAgICAgICA9IExWREJFX1BFUlNJU1RFTlRfREFUQTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29lZiBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICA9IHNpemVvZihMVkRCRV9Db2VmX0ZMT0FUX3QpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5BbGlnbm1lbnQgICAgPSBMVkRCRV9QRVJTSVNURU5UX0NPRUZfQUxJR047CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlR5cGUgICAgICAgICA9IExWREJFX1BFUlNJU1RFTlRfQ09FRjsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2NyYXRjaCBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIFNjcmF0Y2hTaXplID0gKExWTV9VSU5UMzIpKExWREJFX1NDUkFUQ0hCVUZGRVJTX0lOUExBQ0Uqc2l6ZW9mKExWTV9GTE9BVCkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmxvY2tTaXplKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLlNpemUgICAgICAgICA9IFNjcmF0Y2hTaXplOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0uQWxpZ25tZW50ICAgID0gTFZEQkVfU0NSQVRDSF9BTElHTjsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICA9IExWREJFX1NDUkFUQ0g7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUmVhZCBiYWNrIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCisgICAgICAgICpwTWVtb3J5VGFibGUgPSBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlOworICAgIH0KKworICAgIHJldHVybihMVkRCRV9TVUNDRVNTKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZEQkVfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIENyZWF0ZSBhbmQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgbW9kdWxlICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBhbGdvcml0aG0gaW5zdGFuY2UgYnkgY2FsbGluZyB3aXRoICAgICAgICAgKi8KKy8qICAgIGhJbnN0YW5jZSBzZXQgdG8gTlVMTC4gSW4gdGhpcyBjYXNlIHRoZSBhbGdvcml0aG0gcmV0dXJucyB0aGUgbmV3IGluc3RhbmNlICAgICAgICAqLworLyogICAgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZm9yY2UgYSBmdWxsIHJlLWluaXRpYWxpc2F0aW9uIG9mIHRoZSBhbGdvcml0aG0gICAgICAqLworLyogICAgYnkgY2FsbGluZyB3aXRoIGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZS4gSW4gdGhpcyBjYXNlIHRoZSBtZW1vcnkgdGFibGUgICAgICAgICovCisvKiAgICBzaG91bGQgYmUgY29ycmVjdCBmb3IgdGhlIGluc3RhbmNlLCB0aGlzIGNhbiBiZSBlbnN1cmVkIGJ5IGNhbGxpbmcgdGhlIGZ1bmN0aW9uICAgKi8KKy8qICAgIERCRV9NZW1vcnkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZEQkVfU1VDQ0VTUyAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9BTElHTk1FTlRFUlJPUiAgICBJbnN0YW5jZSBvciBzY3JhdGNoIG1lbW9yeSBvbiBpbmNvcnJlY3QgYWxpZ25tZW50ICAgICAgICAgICAqLworLyogICAgTFZEQkVfTlVMTEFERFJFU1MgICAgICAgIEluc3RhbmNlIG9yIHNjcmF0Y2ggbWVtb3J5IGhhcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICAgICBUaGUgaW5zdGFuY2UgaGFuZGxlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1lbW9yeSAgICovCisvKiAgICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIDIuICAgIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWREJFX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX0luaXQoTFZEQkVfSGFuZGxlX3QgICAgICAgICAqcGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfTWVtVGFiX3QgICAgICAgKnBNZW1vcnlUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgKnBDYXBhYmlsaXRpZXMpCit7CisKKyAgICBMVkRCRV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZTsKKyAgICBMVk1peGVyM18xU3RfRkxPQVRfc3QgICAgICAgKnBNaXhlcl9JbnN0YW5jZTsKKyAgICBMVk1peGVyM18yU3RfRkxPQVRfc3QgICAgICAgKnBCeXBhc3NNaXhlcl9JbnN0YW5jZTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgTWl4R2FpbjsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgaTsKKworICAgIC8qCisgICAgICogU2V0IHRoZSBpbnN0YW5jZSBoYW5kbGUgaWYgbm90IGFscmVhZHkgaW5pdGlhbGlzZWQKKyAgICAgKi8KKyAgICBpZiAoKnBoSW5zdGFuY2UgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICAqcGhJbnN0YW5jZSA9IChMVkRCRV9IYW5kbGVfdClwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fSU5TVEFOQ0VdLnBCYXNlQWRkcmVzczsKKyAgICB9CisgICAgcEluc3RhbmNlID0oTFZEQkVfSW5zdGFuY2VfdCAgKikqcGhJbnN0YW5jZTsKKworICAgIC8qCisgICAgICogQ2hlY2sgdGhlIG1lbW9yeSB0YWJsZSBmb3IgTlVMTCBwb2ludGVycyBhbmQgaW5jb3JyZWN0bHkgYWxpZ25lZCBkYXRhCisgICAgICovCisgICAgZm9yIChpPTA7IGk8TFZEQkVfTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykKKyAgICB7CisgICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5TaXplIT0wKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzPT1MVk1fTlVMTCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oTFZEQkVfTlVMTEFERFJFU1MpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCgodWludHB0cl90KXBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLnBCYXNlQWRkcmVzcyAlIHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLkFsaWdubWVudCkhPTApeworICAgICAgICAgICAgICAgIHJldHVybihMVkRCRV9BTElHTk1FTlRFUlJPUik7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlCisgICAgICovCisgICAgcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMgPSAqcENhcGFiaWxpdGllczsKKworICAgIC8qCisgICAgICogU2F2ZSB0aGUgbWVtb3J5IHRhYmxlIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlID0gKnBNZW1vcnlUYWJsZTsKKworICAgIC8qCisgICAgICogU2V0IHRoZSBkZWZhdWx0IGluc3RhbmNlIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5DZW50cmVGcmVxdWVuY3kgICA9ICAgIExWREJFX0NFTlRSRV81NUhaOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLkVmZmVjdExldmVsICAgICAgID0gICAgMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5IZWFkcm9vbWRCICAgICAgICA9ICAgIDA7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ICAgICAgICAgPSAgICBMVkRCRV9IUEZfT0ZGOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgICAgID0gICAgTFZEQkVfT0ZGOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgICAgICAgID0gICAgTFZEQkVfRlNfODAwMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5Wb2x1bWVDb250cm9sICAgICA9ICAgIExWREJFX1ZPTFVNRV9PRkY7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuVm9sdW1lZEIgICAgICAgICAgPSAgICAwOworCisgICAgLyoKKyAgICAgKiBTZXQgcG9pbnRlciB0byBkYXRhIGFuZCBjb2VmIG1lbW9yeQorICAgICAqLworICAgIHBJbnN0YW5jZS0+cERhdGEgPQorICAgICAgICAgKExWREJFX0RhdGFfRkxPQVRfdCAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzczsKKyAgICBwSW5zdGFuY2UtPnBDb2VmID0KKyAgICAgICAgIChMVkRCRV9Db2VmX0ZMT0FUX3QgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGZpbHRlcnMKKyAgICAgKi8KKyAgICBMVkRCRV9TZXRGaWx0ZXJzKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgZmlsdGVyIHRhcHMgYW5kIGNvZWZmaWNpZW50cyAqLworICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UGFyYW1zKTsKKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgQUdDCisgICAgICovCisgICAgTFZEQkVfU2V0QUdDKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBBR0MgZ2FpbiAqLworICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QYXJhbXMpOworICAgIHBJbnN0YW5jZS0+cERhdGEtPkFHQ0luc3RhbmNlLkFHQ19HYWluID0gcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuQUdDX01heEdhaW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZWZhdWx0IHRvIHRoZSBiYXNzIGJvb3N0IHNldHRpbmcgKi8KKworICAgIC8vIGluaXRpYWxpemUgdGhlIG1peGVyIHdpdGggc29tZSBmaXhlcyB2YWx1ZXMgc2luY2Ugb3RoZXJ3aXNlIExWREJFX1NldFZvbHVtZSBlbmRzIHVwCisgICAgLy8gcmVhZGluZyB1bmluaXRpYWxpemVkIGRhdGEKKyAgICBwTWl4ZXJfSW5zdGFuY2UgPSAmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lOworICAgIExWQ19NaXhlcl9Jbml0KCZwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCAxLjAsIDEuMCk7CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIHZvbHVtZQorICAgICAqLworICAgIExWREJFX1NldFZvbHVtZShwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIFZvbHVtZSAqLworICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QYXJhbXMpOworCisgICAgcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVm9sdW1lID0gcEluc3RhbmNlLT5wRGF0YS0+QUdDSW5zdGFuY2UuVGFyZ2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSBhcyB0aGUgdGFyZ2V0ICovCisgICAgTWl4R2FpbiA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pOworICAgIExWQ19NaXhlcl9Jbml0KCZwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCBNaXhHYWluLCBNaXhHYWluKTsKKworICAgIC8qIENvbmZpZ3VyZSB0aGUgbWl4ZXIgcHJvY2VzcyBwYXRoICovCisgICAgcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtID0gMDsKKyAgICBwTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOworICAgIHBNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrID0gTFZNX05VTEw7CisgICAgcE1peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IDA7CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGNsaWNrcyBtaW5pbWlzYXRpb24gQnlwYXNzTWl4ZXIKKyAgICAgKi8KKworICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZSA9ICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlcjsKKworICAgIC8qCisgICAgICogU2V0dXAgdGhlIG1peGVyIGdhaW4gZm9yIHRoZSBwcm9jZXNzZWQgcGF0aAorICAgICAqLworICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSA9IDA7CisgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKKyAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayA9IExWTV9OVUxMOworICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQ9MDsKKworICAgIExWQ19NaXhlcl9Jbml0KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLDAsMCk7CisgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwyKTsKKworICAgIC8qCisgICAgICogU2V0dXAgdGhlIG1peGVyIGdhaW4gZm9yIHRoZSB1bnByb2Nlc3NlZCBwYXRoCisgICAgICovCisgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtID0gMDsKKyAgICBwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSA9IExWTV9OVUxMOworICAgIHBCeXBhc3NNaXhlcl9JbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrID0gTFZNX05VTEw7CisgICAgcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldD0wOworICAgIExWQ19NaXhlcl9Jbml0KCZwQnlwYXNzTWl4ZXJfSW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLCAxLjAsIDEuMCk7CisgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEJ5cGFzc01peGVyX0luc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgTFZEQkVfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwgMik7CisKKyAgICByZXR1cm4oTFZEQkVfU1VDQ0VTUyk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1ByaXZhdGUuaAppbmRleCA0ZTUyMDdmLi5mM2ZhYWVkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcml2YXRlLmgKQEAgLTI3LDExICsyNyw2IEBACiAjaWZuZGVmIF9fTFZEQkVfUFJJVkFURV9IX18KICNkZWZpbmUgX19MVkRCRV9QUklWQVRFX0hfXwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDMsNyArMzgsNiBAQAogI2luY2x1ZGUgIkxWQ19NaXhlci5oIgogI2luY2x1ZGUgIkFHQy5oIgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBEZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY0LDEyICs1OCwxNiBAQAogI2RlZmluZSBMVkRCRV9QRVJTSVNURU5UX0NPRUZfQUxJR04gICAgICA0ICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGNvZWYgKi8KICNkZWZpbmUgTFZEQkVfU0NSQVRDSF9BTElHTiAgICAgICAgICAgICAgNCAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBsb25nIGRhdGEgKi8KIAorI2lmZGVmIFNVUFBPUlRfTUMKKy8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KKyNkZWZpbmUgTFZEQkVfU0NSQVRDSEJVRkZFUlNfSU5QTEFDRSAgICAgKExWTV9NQVhfQ0hBTk5FTFMgKiAzKQorI2Vsc2UKICNkZWZpbmUgTFZEQkVfU0NSQVRDSEJVRkZFUlNfSU5QTEFDRSAgICAgNiAgICAgICAvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCisjZW5kaWYKIAogI2RlZmluZSBMVkRCRV9NSVhFUl9UQyAgICAgICAgICAgICAgICAgICA1ICAgICAgIC8qIE1peGVyIHRpbWUgICovCiAjZGVmaW5lIExWREJFX0JZUEFTU19NSVhFUl9UQyAgICAgICAgICAgIDEwMCAgICAgLyogQnlwYXNzIG1peGVyIHRpbWUgKi8KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgU3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC03NywyOSArNzUsNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qIERhdGEgc3RydWN0dXJlICovCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qIEFHQyBwYXJhbWV0ZXJzICovCi0gICAgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfdCAgIEFHQ0luc3RhbmNlOyAgICAgICAgLyogQUdDIGluc3RhbmNlIHBhcmFtZXRlcnMgKi8KLQotICAgIC8qIFByb2Nlc3MgdmFyaWFibGVzICovCi0gICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgICAgIEhQRlRhcHM7ICAgICAgICAgICAgLyogSGlnaCBwYXNzIGZpbHRlciB0YXBzICovCi0gICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgICAgIEJQRlRhcHM7ICAgICAgICAgICAgLyogQmFuZCBwYXNzIGZpbHRlciB0YXBzICovCi0gICAgTFZNaXhlcjNfMVN0X3N0ICAgICAgICAgICAgIEJ5cGFzc1ZvbHVtZTsgICAgICAgLyogQnlwYXNzIHZvbHVtZSBzY2FsZXIgKi8KLSAgICBMVk1peGVyM18yU3Rfc3QgICAgICAgICAgICAgQnlwYXNzTWl4ZXI7ICAgICAgICAvKiBCeXBhc3MgTWl4ZXIgZm9yIENsaWNrIFJlbW92YWwgKi8KLQotfSBMVkRCRV9EYXRhX3Q7Ci0KLS8qIENvZWZzIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKiBQcm9jZXNzIHZhcmlhYmxlcyAqLwotICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgICBIUEZJbnN0YW5jZTsgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgaW5zdGFuY2UgKi8KLSAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICAgQlBGSW5zdGFuY2U7ICAgICAgICAvKiBCYW5kIHBhc3MgZmlsdGVyIGluc3RhbmNlICovCi0KLX0gTFZEQkVfQ29lZl90OwotI2Vsc2UKIC8qIERhdGEgc3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtMTIxLDcgKzk2LDYgQEAKICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICAgSFBGSW5zdGFuY2U7ICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIGluc3RhbmNlICovCiAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAgIEJQRkluc3RhbmNlOyAgICAgICAgLyogQmFuZCBwYXNzIGZpbHRlciBpbnN0YW5jZSAqLwogfSBMVkRCRV9Db2VmX0ZMT0FUX3Q7Ci0jZW5kaWYKIC8qIEluc3RhbmNlIHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKQEAgLTEzMSwxNiArMTA1LDEwIEBACiAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgICAgICAgIENhcGFiaWxpdGllczsgICAgICAgICAvKiBJbnN0YW5jZSBjYXBhYmlsaXRpZXMgKi8KIAogICAgIC8qIERhdGEgYW5kIGNvZWZmaWNpZW50IHBvaW50ZXJzICovCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0gICAgTFZEQkVfRGF0YV90ICAgICAgICAgICAgICAgICpwRGF0YTsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgZGF0YSAqLwotICAgIExWREJFX0NvZWZfdCAgICAgICAgICAgICAgICAqcENvZWY7ICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGNvZWZmaWNpZW50cyAqLwotI2Vsc2UKICAgICBMVkRCRV9EYXRhX0ZMT0FUX3QgICAgICAgICAgICAgICAgKnBEYXRhOyAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBkYXRhICovCiAgICAgTFZEQkVfQ29lZl9GTE9BVF90ICAgICAgICAgICAgICAgICpwQ29lZjsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgY29lZmZpY2llbnRzICovCi0jZW5kaWYKIH0gTFZEQkVfSW5zdGFuY2VfdDsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRnVuY3Rpb24gcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xNTAsMTcgKzExOCwxMCBAQAogdm9pZCAgICBMVkRCRV9TZXRBR0MoTFZEQkVfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAgICAqcFBhcmFtcyk7CiAKLQogdm9pZCAgICBMVkRCRV9TZXRWb2x1bWUoTFZEQkVfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfUGFyYW1zX3QgICAgICAqcFBhcmFtcyk7CiAKLQogdm9pZCAgICBMVkRCRV9TZXRGaWx0ZXJzKExWREJFX0luc3RhbmNlX3QgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX1BhcmFtc190ICAgICAqcFBhcmFtcyk7CiAKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQogI2VuZGlmICAgICAgLyogX19MVkRCRV9QUklWQVRFX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9Qcm9jZXNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwZWE3MDAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuYworKysgL2Rldi9udWxsCkBAIC0xLDMwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTFZEQkUuaCIKLSNpbmNsdWRlICJMVkRCRV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgotI2luY2x1ZGUgIkFHQy5oIgotI2luY2x1ZGUgIkxWREJFX0NvZWZmcy5oIiAgICAgICAgICAgICAgIC8qIEZpbHRlciBjb2VmZmljaWVudHMgKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkRCRV9Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFByb2Nlc3MgZnVuY3Rpb24gZm9yIHRoZSBCYXNzIEVuaGFuY2VtZW50IG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGEgY2FuIGJlIHByb2Nlc3NlZCBpbiB0d28gZm9ybWF0cywgc3RlcmVvIG9yIG1vbm8taW4tc3RlcmVvLiBEYXRhIGluIG1vbm8gICAgICAgICAgICAqLwotLyogIGZvcm1hdCBpcyBub3Qgc3VwcG9ydGVkLCB0aGUgY2FsbGluZyByb3V0aW5lIG11c3QgY29udmVydCB0aGUgbW9ubyBzdHJlYW0gdG8gICAgICAgICAgICAqLwotLyogIG1vbm8taW4tc3RlcmVvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19fX19fICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgICBfX19fX19fXyAgICAgICAgICAqLwotLyogICAgICB8ICAgICAgICB8ICAgIF9fX19fICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+fCAgICAgICAgICAgfCAgIHwgICAgICAgIHwgICAgICAgICAqLwotLyogICAgICB8IDE2LWJpdCB8ICAgfCAgICAgfCAgfCAgICBfX19fX19fXyAgICAgICAgICAgICAgfCAgICAgICAgICAgfCAgIHwgMzItYml0IHwgICAgICAgICAqLwotLyogLSstLT58ICAgdG8gICB8LS0+fCBIUEYgfC0tfCAgIHwgICAgICAgIHwgICAgX19fX18gICAgfCBBR0MgTWl4ZXIgfC0tPnwgICB0byAgIHwtLXwgICAgICAqLwotLyogIHwgICB8IDMyLWJpdCB8ICAgfF9fX19ffCAgfCAgIHwgU3RlcmVvIHwgICB8ICAgICB8ICAgfCAgICAgICAgICAgfCAgIHwgMTYtYml0IHwgIHwgICAgICAqLwotLyogIHwgICB8X19fX19fX198ICAgICAgICAgICAgfC0tPnwgICB0byAgIHwtLT58IEJQRiB8LS0+fCAgICAgICAgICAgfCAgIHxfX19fX19fX3wgIDAgICAgICAqLwotLyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgIE1vbm8gIHwgICB8X19fX198ICAgfF9fX19fX19fX19ffCAgICAgICAgICAgICAgICBcLS0+ICAqLwotLyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX19fX3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19fXyAgICAgICAgICAgICAgICAgIDAgICAgICAqLwotLyogIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgIHwgICAgICAgICAgICAgICAgIHwgICAgICAqLwotLyogIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCBWb2x1bWUgIHwtLS0tLS0tLS0tLS0tLS0tLXwgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBDb250cm9sIHwgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX19fX3wgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBJbkRhdGEgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBPdXREYXRhICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWREJFX1NVQ0NFU1MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgTFZEQkVfVE9PTUFOWVNBTVBMRVMgICAgTnVtU2FtcGxlcyB3YXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gYmxvY2sgc2l6ZSAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGRhdGEgbXVzdCBiZSAzMi1iaXQgZm9ybWF0LiBUaGUgaW5wdXQgaXMgc2NhbGVkIGJ5IGEgc2hpZnQgICAgICAqLwotLyogICAgIHdoZW4gY29udmVydGluZyBmcm9tIDE2LWJpdCBmb3JtYXQsIHRoaXMgc2NhbGluZyBhbGxvd3MgZm9yIGludGVybmFsIGhlYWRyb29tIGluIHRoZSAqLwotLyogICAgIGJhc3MgZW5oYW5jZW1lbnQgYWxnb3JpdGhtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDIuIEZvciBhIDE2LWJpdCBpbXBsZW1lbnRhdGlvbiB0aGUgY29udmVyc3Rpb24gdG8gMzItYml0IGlzIHJlbW92ZWQgYW5kIHJlcGxhY2VkIHdpdGggICAqLwotLyogICAgIHRoZSBoZWFkcm9vbSBsb3NzLiBUaGlzIGhlYWRyb29tIGxvc3MgaXMgY29tcGVuc2F0ZWQgaW4gdGhlIHZvbHVtZSBjb250cm9sIHNvIHRoZSAgICAqLwotLyogICAgIG92ZXJhbGwgZW5kIHRvIGVuZCBnYWluIGlzIG9kQi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBCVUlMRF9GTE9BVAotTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgaEluc3RhbmNlLAotICAgIGNvbnN0IExWTV9JTlQxNiAqcEluRGF0YSwgTFZNX0lOVDE2ICpwT3V0RGF0YSwgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKSB7Ci0KLSAgTFZEQkVfSW5zdGFuY2VfdCAqcEluc3RhbmNlID0gKExWREJFX0luc3RhbmNlX3QgKikgaEluc3RhbmNlOwotICBMVk1fSU5UMzIgKnBTY3JhdGNoID0KLSAgICAgIChMVk1fSU5UMzIgKikgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKLSAgTFZNX0lOVDMyICpwTW9ubzsKLSAgTFZNX0lOVDE2ICpwSW5wdXQgPSAoTFZNX0lOVDE2ICopIHBJbkRhdGE7Ci0KLSAgLyogU2NyYXRjaCBmb3IgVm9sdW1lIENvbnRyb2wgc3RhcnRzIGF0IG9mZnNldCBvZiAyKk51bVNhbXBsZXMgc2hvcnQgdmFsdWVzIGZyb20gcFNjcmF0Y2ggKi8KLSAgTFZNX0lOVDE2ICpwU2NyYXRjaFZvbCA9IChMVk1fSU5UMTYgKikgKCZwU2NyYXRjaFtOdW1TYW1wbGVzXSk7Ci0KLSAgLyogU2NyYXRjaCBmb3IgTW9ubyBwYXRoIHN0YXJ0cyBhdCBvZmZzZXQgb2YgMipOdW1TYW1wbGVzIDMyLWJpdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaCAqLwotICBwTW9ubyA9ICZwU2NyYXRjaFsyICogTnVtU2FtcGxlc107Ci0KLSAgLyoKLSAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKLSAgICovCi0gIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKSB7Ci0gICAgcmV0dXJuIChMVkRCRV9UT09NQU5ZU0FNUExFUyk7Ci0gIH0KLQotICAvKgotICAgKiBDaGVjayBpZiB0aGUgYWxnb3JpdGhtIGlzIGVuYWJsZWQKLSAgICovCi0gIC8qIERCRSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPTiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCi0gIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkRCRV9PTikKLSAgICAgIHx8IChMVkNfTWl4ZXJfR2V0Q3VycmVudCgKLSAgICAgICAgICAmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pCi0gICAgICAgICAgIT0gTFZDX01peGVyX0dldFRhcmdldCgKLSAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSkpIHsKLQotICAgIC8qCi0gICAgICogQ29udmVydCAxNi1iaXQgc2FtcGxlcyB0byAzMi1iaXQgYW5kIHNjYWxlCi0gICAgICogKEZvciBhIDE2LWJpdCBpbXBsZW1lbnRhdGlvbiBhcHBseSBoZWFkcm9vbSBsb3NzIGhlcmUpCi0gICAgICovCi0gICAgSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyKHBJbnB1dCwgLyogU291cmNlIDE2LWJpdCBkYXRhICAgICovCi0gICAgcFNjcmF0Y2gsIC8qIERlc3QuIDMyLWJpdCBkYXRhICAgICAqLwotICAgIChMVk1fSU5UMTYpICgyICogTnVtU2FtcGxlcyksIC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAqLwotICAgIExWREJFX1NDQUxFU0hJRlQpOyAvKiBTaGlmdCBzY2FsZSAgICAgICAgICAgKi8KLQotICAgIC8qCi0gICAgICogQXBwbHkgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgaWYgc2VsZWN0ZWQKLSAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuSFBGU2VsZWN0ID09IExWREJFX0hQRl9PTikgewotICAgICAgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICovCi0gICAgICAoTFZNX0lOVDMyICopIHBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAqLwotICAgICAgKExWTV9JTlQzMiAqKSBwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KLSAgICAgIChMVk1fSU5UMTYpIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAqLwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ3JlYXRlIHRoZSBtb25vIHN0cmVhbQotICAgICAqLwotICAgIEZyb20yaVRvTW9ub18zMihwU2NyYXRjaCwgLyogU3RlcmVvIHNvdXJjZSAgICAgICAgICovCi0gICAgcE1vbm8sIC8qIE1vbm8gZGVzdGluYXRpb24gICAgICAqLwotICAgIChMVk1fSU5UMTYpIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KLQotICAgIC8qCi0gICAgICogQXBwbHkgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKLSAgICAgKi8KLSAgICBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMigmcEluc3RhbmNlLT5wQ29lZi0+QlBGSW5zdGFuY2UsIC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICAqLwotICAgIChMVk1fSU5UMzIgKikgcE1vbm8sIC8qIFNvdXJjZSAgICAgICAgICAgICAgICAqLwotICAgIChMVk1fSU5UMzIgKikgcE1vbm8sIC8qIERlc3RpbmF0aW9uICAgICAgICAgICAqLwotICAgIChMVk1fSU5UMTYpIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KLQotICAgIC8qCi0gICAgICogQXBwbHkgdGhlIEFHQyBhbmQgbWl4Ci0gICAgICovCi0gICAgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCi0gICAgcFNjcmF0Y2gsIC8qIFN0ZXJlbyBzb3VyY2UgICAgICAgICAqLwotICAgIHBNb25vLCAvKiBNb25vIGJhbmQgcGFzcyBzb3VyY2UgKi8KLSAgICBwU2NyYXRjaCwgLyogU3RlcmVvIGRlc3RpbmF0aW9uICAgICovCi0gICAgTnVtU2FtcGxlcyk7IC8qIE51bWJlciBvZiBzYW1wbGVzICAgICAqLwotCi0gICAgLyoKLSAgICAgKiBDb252ZXJ0IDMyLWJpdCBzYW1wbGVzIHRvIDE2LWJpdCBhbmQgc2F0dXJhdGUKLSAgICAgKiAoTm90IHJlcXVpcmVkIGZvciAxNi1iaXQgaW1wbGVtZW5hdGlvbnMpCi0gICAgICovCi0gICAgSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNihwU2NyYXRjaCwgLyogU291cmNlIDMyLWJpdCBkYXRhICAgICovCi0gICAgKExWTV9JTlQxNiAqKSBwU2NyYXRjaCwgLyogRGVzdC4gMTYtYml0IGRhdGEgICAgICovCi0gICAgKExWTV9JTlQxNikgKDIgKiBOdW1TYW1wbGVzKSwgLyogTGVmdCBhbmQgcmlnaHQgICAgICAgICovCi0gICAgTFZEQkVfU0NBTEVTSElGVCk7IC8qIFNoaWZ0IHNjYWxlICAgICAgICAgICAqLwotCi0gIH0KLQotICAvKiBCeXBhc3MgVm9sdW1lIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9GRiBvciBkdXJpbmcgT24vT2ZmIHRyYW5zaXRpb25zICovCi0gIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkRCRV9PRkYpCi0gICAgICB8fCAoTFZDX01peGVyX0dldEN1cnJlbnQoCi0gICAgICAgICAgJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKQotICAgICAgICAgICE9IExWQ19NaXhlcl9HZXRUYXJnZXQoCi0gICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSkpKSB7Ci0KLSAgICAvKgotICAgICAqIFRoZSBhbGdvcml0aG0gaXMgZGlzYWJsZWQgYnV0IHZvbHVtZSBtYW5hZ2VtZW50IGlzIHJlcXVpcmVkIHRvIGNvbXBlbnNhdGUgZm9yCi0gICAgICogaGVhZHJvb20gYW5kIHZvbHVtZSAoaWYgZW5hYmxlZCkKLSAgICAgKi8KLSAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzVm9sdW1lLCBwSW5EYXRhLAotICAgICAgICBwU2NyYXRjaFZvbCwgKExWTV9JTlQxNikgKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAgICovCi0KLSAgfQotCi0gIC8qCi0gICAqIE1peCBEQkUgcHJvY2Vzc2VkIHBhdGggYW5kIGJ5cGFzcyB2b2x1bWUgcGF0aAotICAgKi8KLSAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLAotICAgICAgKExWTV9JTlQxNiAqKSBwU2NyYXRjaCwgcFNjcmF0Y2hWb2wsIHBPdXREYXRhLAotICAgICAgKExWTV9JTlQxNikgKDIgKiBOdW1TYW1wbGVzKSk7Ci0KLSAgcmV0dXJuIChMVkRCRV9TVUNDRVNTKTsKLX0KLSNlbHNlIC8qQlVJTERfRkxPQVQqLwotTFZEQkVfUmV0dXJuU3RhdHVzX2VuIExWREJFX1Byb2Nlc3MoTFZEQkVfSGFuZGxlX3QgaEluc3RhbmNlLAotICAgIGNvbnN0IExWTV9GTE9BVCAqcEluRGF0YSwKLSAgICBMVk1fRkxPQVQgKnBPdXREYXRhLAotICAgIExWTV9VSU5UMTYgTnVtU2FtcGxlcykKLXsKLQotICBMVkRCRV9JbnN0YW5jZV90ICpwSW5zdGFuY2UgPShMVkRCRV9JbnN0YW5jZV90ICopaEluc3RhbmNlOwotICBMVk1fRkxPQVQgKnBTY3JhdGNoX2luID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uCi0gIFtMVkRCRV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOwotICBMVk1fRkxPQVQgKnBTY3JhdGNoID0gcFNjcmF0Y2hfaW4gKyAyICogTnVtU2FtcGxlczsKLSAgTFZNX0ZMT0FUICpwTW9ubzsKLSAgTFZNX0lOVDMyIGlpID0gMDsKLQotICAvKiBTY3JhdGNoIGZvciBWb2x1bWUgQ29udHJvbCBzdGFydHMgYXQgb2Zmc2V0IG9mIDQqTnVtU2FtcGxlcyBmbG9hdCB2YWx1ZXMgZnJvbSBwU2NyYXRjaCAqLwotICBMVk1fRkxPQVQgICAgICAgICAgICpwU2NyYXRjaFZvbCA9IChMVk1fRkxPQVQgKikoJnBTY3JhdGNoX2luWzQgKiBOdW1TYW1wbGVzXSk7Ci0vLyAgTFZNX0lOVDE2ICpwU2NyYXRjaFZvbF9pbnQgPSAoTFZNX0lOVDE2ICopKHBTY3JhdGNoVm9sKTsKLQotICAvKiBTY3JhdGNoIGZvciBNb25vIHBhdGggc3RhcnRzIGF0IG9mZnNldCBvZiA2Kk51bVNhbXBsZXMgMzItYml0IHZhbHVlcyBmcm9tIHBTY3JhdGNoICovCi0gIHBNb25vID0gJnBTY3JhdGNoX2luWzQgKiBOdW1TYW1wbGVzXTsKLQotICAvKgotICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQotICAgKi8KLSAgaWYgKE51bVNhbXBsZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCi0gIHsKLSAgICByZXR1cm4oTFZEQkVfVE9PTUFOWVNBTVBMRVMpOwotICB9Ci0KLSAgLyoKLSAgICogQ29udmVydCAxNi1iaXQgc2FtcGxlcyB0byBGbG9hdAotICAgKi8KLSAgQ29weV9GbG9hdChwSW5EYXRhLCAvKiBTb3VyY2UgMTYtYml0IGRhdGEgICAgKi8KLSAgICAgIHBTY3JhdGNoX2luLCAvKiBEZXN0LiAzMi1iaXQgZGF0YSAgICAgKi8KLSAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIHJpZ2h0ICAgICAgICAqLwotCi0gIGZvciAoaWkgPSAwOyBpaSA8IDIgKiBOdW1TYW1wbGVzOyBpaSsrKSB7Ci0gICAgcFNjcmF0Y2hbaWldID0gcFNjcmF0Y2hfaW5baWldOwotICB9Ci0gIC8qCi0gICAqIENoZWNrIGlmIHRoZSBhbGdvcml0aG0gaXMgZW5hYmxlZAotICAgKi8KLSAgLyogREJFIHBhdGggaXMgcHJvY2Vzc2VkIHdoZW4gREJFIGlzIE9OIG9yIGR1cmluZyBPbi9PZmYgdHJhbnNpdGlvbnMgKi8KLSAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWREJFX09OKXx8Ci0gICAgICAoTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKQotICAgICAgICAgICE9TFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pKSkKLSAgewotCi0gICAgLyoKLSAgICAgKiBBcHBseSB0aGUgaGlnaCBwYXNzIGZpbHRlciBpZiBzZWxlY3RlZAotICAgICAqLwotICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5IUEZTZWxlY3QgPT0gTFZEQkVfSFBGX09OKQotICAgIHsKLSAgICAgIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwvKiBGaWx0ZXIgaW5zdGFuY2UgICAgICAqLwotICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwgLyogU291cmNlICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsIC8qIERlc3RpbmF0aW9uICAgICAgICAgICovCi0gICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgLyogTnVtYmVyIG9mIHNhbXBsZXMgICAgKi8KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENyZWF0ZSB0aGUgbW9ubyBzdHJlYW0KLSAgICAgKi8KLSAgICBGcm9tMmlUb01vbm9fRmxvYXQoKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KLSAgICAgICAgcE1vbm8sIC8qIE1vbm8gZGVzdGluYXRpb24gICAgICAqLwotICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KLQotICAgIC8qCi0gICAgICogQXBwbHkgdGhlIGJhbmQgcGFzcyBmaWx0ZXIKLSAgICAgKi8KLSAgICBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMigmcEluc3RhbmNlLT5wQ29lZi0+QlBGSW5zdGFuY2UsIC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICAqLwotICAgICAgICAoTFZNX0ZMT0FUICopcE1vbm8sIC8qIFNvdXJjZSAgICAgICAgICAgICAgICAqLwotICAgICAgICAoTFZNX0ZMT0FUICopcE1vbm8sIC8qIERlc3RpbmF0aW9uICAgICAgICAgICAqLwotICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KLQotICAgIC8qCi0gICAgICogQXBwbHkgdGhlIEFHQyBhbmQgbWl4Ci0gICAgICovCi0gICAgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCi0gICAgICAgIHBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KLSAgICAgICAgcE1vbm8sIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAqLwotICAgICAgICBwU2NyYXRjaCwgLyogU3RlcmVvIGRlc3RpbmF0aW9uICAgICovCi0gICAgICAgIE51bVNhbXBsZXMpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAgICAgKi8KLQotICAgIGZvciAoaWkgPSAwOyBpaSA8IDIgKiBOdW1TYW1wbGVzOyBpaSsrKSB7Ci0gICAgICAvL1RPRE86IHJlcGxhY2Ugd2l0aCBleGlzdGluZyBjbGFtcGluZyBmdW5jdGlvbgotICAgICAgaWYocFNjcmF0Y2hbaWldIDwgLTEuMCkgewotICAgICAgICBwU2NyYXRjaFtpaV0gPSAtMS4wOwotICAgICAgfSBlbHNlIGlmKHBTY3JhdGNoW2lpXSA+IDEuMCkgewotICAgICAgICBwU2NyYXRjaFtpaV0gPSAxLjA7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogQnlwYXNzIFZvbHVtZSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPRkYgb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLwotICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT0ZGKXx8Ci0gICAgICAoTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKQotICAgICAgICAgICE9TFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0pKSkKLSAgewotCi0gICAgLyoKLSAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIGJ1dCB2b2x1bWUgbWFuYWdlbWVudCBpcyByZXF1aXJlZCB0byBjb21wZW5zYXRlIGZvcgotICAgICAqIGhlYWRyb29tIGFuZCB2b2x1bWUgKGlmIGVuYWJsZWQpCi0gICAgICovCi0gICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwKLSAgICAgICAgcFNjcmF0Y2hfaW4sCi0gICAgICAgIHBTY3JhdGNoVm9sLAotICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCByaWdodCAqLwotICB9Ci0KLSAgLyoKLSAgICogTWl4IERCRSBwcm9jZXNzZWQgcGF0aCBhbmQgYnlwYXNzIHZvbHVtZSBwYXRoCi0gICAqLwotICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIsCi0gICAgICBwU2NyYXRjaCwKLSAgICAgIHBTY3JhdGNoVm9sLAotICAgICAgcE91dERhdGEsCi0gICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOwotCi0gIHJldHVybihMVkRCRV9TVUNDRVNTKTsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1Byb2Nlc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YTcxYzcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfUHJvY2Vzcy5jcHAKQEAgLTAsMCArMSwyNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4gLy8gbWVtc2V0CisjaW5jbHVkZSAiTFZEQkUuaCIKKyNpbmNsdWRlICJMVkRCRV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkFHQy5oIgorI2luY2x1ZGUgIkxWREJFX0NvZWZmcy5oIiAgICAgICAgICAgICAgIC8qIEZpbHRlciBjb2VmZmljaWVudHMgKi8KKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZEQkVfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQcm9jZXNzIGZ1bmN0aW9uIGZvciB0aGUgQmFzcyBFbmhhbmNlbWVudCBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEYXRhIGNhbiBiZSBwcm9jZXNzZWQgaW4gdHdvIGZvcm1hdHMsIHN0ZXJlbyBvciBtb25vLWluLXN0ZXJlby4gRGF0YSBpbiBtb25vICAgICAgICAgICAgKi8KKy8qICBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCwgdGhlIGNhbGxpbmcgcm91dGluZSBtdXN0IGNvbnZlcnQgdGhlIG1vbm8gc3RyZWFtIHRvICAgICAgICAgICAgKi8KKy8qICBtb25vLWluLXN0ZXJlby4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX19fX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIF9fX19fX19fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgX19fX19fX18gICAgICAgICAgKi8KKy8qICAgICAgfCAgICAgICAgfCAgICBfX19fXyAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPnwgICAgICAgICAgIHwgICB8ICAgICAgICB8ICAgICAgICAgKi8KKy8qICAgICAgfCAxNi1iaXQgfCAgIHwgICAgIHwgIHwgICAgX19fX19fX18gICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICB8IDMyLWJpdCB8ICAgICAgICAgKi8KKy8qIC0rLS0+fCAgIHRvICAgfC0tPnwgSFBGIHwtLXwgICB8ICAgICAgICB8ICAgIF9fX19fICAgIHwgQUdDIE1peGVyIHwtLT58ICAgdG8gICB8LS18ICAgICAgKi8KKy8qICB8ICAgfCAzMi1iaXQgfCAgIHxfX19fX3wgIHwgICB8IFN0ZXJlbyB8ICAgfCAgICAgfCAgIHwgICAgICAgICAgIHwgICB8IDE2LWJpdCB8ICB8ICAgICAgKi8KKy8qICB8ICAgfF9fX19fX19ffCAgICAgICAgICAgIHwtLT58ICAgdG8gICB8LS0+fCBCUEYgfC0tPnwgICAgICAgICAgIHwgICB8X19fX19fX198ICAwICAgICAgKi8KKy8qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICBNb25vICB8ICAgfF9fX19ffCAgIHxfX19fX19fX19fX3wgICAgICAgICAgICAgICAgXC0tPiAgKi8KKy8qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX19fX198ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX19fX19fX18gICAgICAgICAgICAgICAgICAwICAgICAgKi8KKy8qICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgICAgICB8ICAgICAgKi8KKy8qICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgVm9sdW1lICB8LS0tLS0tLS0tLS0tLS0tLS18ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQ29udHJvbCB8ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX19fX198ICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5EYXRhICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwT3V0RGF0YSAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1TYW1wbGVzICAgICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkRCRV9TVUNDRVNTICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIExWREJFX1RPT01BTllTQU1QTEVTICAgIE51bVNhbXBsZXMgd2FzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIGJsb2NrIHNpemUgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhIG11c3QgYmUgMzItYml0IGZvcm1hdC4gVGhlIGlucHV0IGlzIHNjYWxlZCBieSBhIHNoaWZ0ICAgICAgKi8KKy8qICAgICB3aGVuIGNvbnZlcnRpbmcgZnJvbSAxNi1iaXQgZm9ybWF0LCB0aGlzIHNjYWxpbmcgYWxsb3dzIGZvciBpbnRlcm5hbCBoZWFkcm9vbSBpbiB0aGUgKi8KKy8qICAgICBiYXNzIGVuaGFuY2VtZW50IGFsZ29yaXRobS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAyLiBGb3IgYSAxNi1iaXQgaW1wbGVtZW50YXRpb24gdGhlIGNvbnZlcnN0aW9uIHRvIDMyLWJpdCBpcyByZW1vdmVkIGFuZCByZXBsYWNlZCB3aXRoICAgKi8KKy8qICAgICB0aGUgaGVhZHJvb20gbG9zcy4gVGhpcyBoZWFkcm9vbSBsb3NzIGlzIGNvbXBlbnNhdGVkIGluIHRoZSB2b2x1bWUgY29udHJvbCBzbyB0aGUgICAgKi8KKy8qICAgICBvdmVyYWxsIGVuZCB0byBlbmQgZ2FpbiBpcyBvZEIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWREJFX1JldHVyblN0YXR1c19lbiBMVkRCRV9Qcm9jZXNzKExWREJFX0hhbmRsZV90IGhJbnN0YW5jZSwKKyAgICBjb25zdCBMVk1fRkxPQVQgKnBJbkRhdGEsCisgICAgTFZNX0ZMT0FUICpwT3V0RGF0YSwKKyAgICBjb25zdCBMVk1fVUlOVDE2IE5yRnJhbWVzKSAvLyB1cGRhdGVkIHRvIHVzZSBzYW1wbGVzID0gZnJhbWVzICogY2hhbm5lbHMuCit7CisgIExWREJFX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9KExWREJFX0luc3RhbmNlX3QgKiloSW5zdGFuY2U7CisKKyAgLypFeHRyYWN0IG51bWJlciBvZiBDaGFubmVscyBpbmZvKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgIC8vIE1vbm8gcGFzc2VkIGluIGFzIHN0ZXJlbworICBjb25zdCBMVk1fSU5UMzIgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMgPT0gMQorICAgICAgPyAyIDogcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKKyNlbHNlCisgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gMjsgLy8gRkNDXzIKKyNlbmRpZgorICBjb25zdCBMVk1fSU5UMzIgTnJTYW1wbGVzID0gTnJDaGFubmVscyAqIE5yRnJhbWVzOworCisgIC8qIFNwYWNlIHRvIHN0b3JlIERCRSBwYXRoIGNvbXB1dGF0aW9uICovCisgIExWTV9GTE9BVCAqIGNvbnN0IHBTY3JhdGNoID0KKyAgICAgICAgICAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKKworICAvKgorICAgKiBTY3JhdGNoIGZvciBNb25vIHBhdGggc3RhcnRzIGF0IG9mZnNldCBvZgorICAgKiBOclNhbXBsZXMgZmxvYXQgdmFsdWVzIGZyb20gcFNjcmF0Y2guCisgICAqLworICBMVk1fRkxPQVQgKiBjb25zdCBwTW9ubyA9IHBTY3JhdGNoICsgTnJTYW1wbGVzOworCisgIC8qCisgICAqIFRSSUNLWTogcE1vbm8gaXMgdXNlZCBhbmQgZGlzY2FyZGVkIGJ5IHRoZSBEQkUgcGF0aC4KKyAgICogICAgICAgICBzbyBpdCBpcyBhdmFpbGFibGUgZm9yIHVzZSBmb3IgdGhlIHBTY3JhdGNoVm9sCisgICAqICAgICAgICAgcGF0aCB3aGljaCBpcyBjb21wdXRlZCBhZnRlcndhcmRzLgorICAgKgorICAgKiBTcGFjZSB0byBzdG9yZSBWb2x1bWUgQ29udHJvbCBwYXRoIGNvbXB1dGF0aW9uLgorICAgKiBUaGlzIGlzIGlkZW50aWNhbCB0byBwTW9ubyAoc2VlIFRSSUNLWSBjb21tZW50KS4KKyAgICovCisgIExWTV9GTE9BVCAqIGNvbnN0IHBTY3JhdGNoVm9sID0gcE1vbm87CisKKyAgLyoKKyAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBmcmFtZXMgaXMgbm90IHRvbyBsYXJnZQorICAgKi8KKyAgaWYgKE5yRnJhbWVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQorICB7CisgICAgcmV0dXJuIExWREJFX1RPT01BTllTQU1QTEVTOworICB9CisKKyAgLyoKKyAgICogQ2hlY2sgaWYgdGhlIGFsZ29yaXRobSBpcyBlbmFibGVkCisgICAqLworICAvKiBEQkUgcGF0aCBpcyBwcm9jZXNzZWQgd2hlbiBEQkUgaXMgT04gb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLworICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT04pfHwKKyAgICAgIChMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pCisgICAgICAgICAgIT1MVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkpKQorICB7CisgICAgLy8gbWFrZSBjb3B5IG9mIGlucHV0IGRhdGEKKyAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsCisgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7CisKKyAgICAvKgorICAgICAqIEFwcGx5IHRoZSBoaWdoIHBhc3MgZmlsdGVyIGlmIHNlbGVjdGVkCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLkhQRlNlbGVjdCA9PSBMVkRCRV9IUEZfT04pCisgICAgeworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgIEJRX01DX0QzMkYzMkMzMF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBDb2VmLT5IUEZJbnN0YW5jZSwgLyogRmlsdGVyIGluc3RhbmNlICAgICAgKi8KKyAgICAgICAgICBwU2NyYXRjaCwgLyogU291cmNlICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICBwU2NyYXRjaCwgLyogRGVzdGluYXRpb24gICAgICAgICAgKi8KKyAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQorICAgICAgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cENvZWYtPkhQRkluc3RhbmNlLC8qIEZpbHRlciBpbnN0YW5jZSAgICAgICovCisgICAgICAgICAgcFNjcmF0Y2gsIC8qIFNvdXJjZSAgICAgICAgICAgICAgICovCisgICAgICAgICAgcFNjcmF0Y2gsIC8qIERlc3RpbmF0aW9uICAgICAgICAgICovCisgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcyk7CisjZW5kaWYKKyAgICB9CisKKyAgICAvKgorICAgICAqIENyZWF0ZSB0aGUgbW9ubyBzdHJlYW0KKyAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgRnJvbU1jVG9Nb25vX0Zsb2F0KHBTY3JhdGNoLCAvKiBTb3VyY2UgKi8KKyAgICAgICAgcE1vbm8sIC8qIE1vbm8gZGVzdGluYXRpb24gKi8KKyAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywgIC8qIE51bWJlciBvZiBmcmFtZXMgKi8KKyAgICAgICAgKExWTV9JTlQxNilOckNoYW5uZWxzKTsKKyNlbHNlCisgICAgRnJvbTJpVG9Nb25vX0Zsb2F0KHBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KKyAgICAgICAgcE1vbm8sIC8qIE1vbm8gZGVzdGluYXRpb24gICAgICAqLworICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzKTsKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBBcHBseSB0aGUgYmFuZCBwYXNzIGZpbHRlcgorICAgICAqLworICAgIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyKCZwSW5zdGFuY2UtPnBDb2VmLT5CUEZJbnN0YW5jZSwgLyogRmlsdGVyIGluc3RhbmNlICAgICAgICovCisgICAgICAgIHBNb25vLCAvKiBTb3VyY2UgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgcE1vbm8sIC8qIERlc3RpbmF0aW9uICAgICAgICAgICAqLworICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzKTsKKworICAgIC8qCisgICAgICogQXBwbHkgdGhlIEFHQyBhbmQgbWl4CisgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCisgICAgICAgIHBTY3JhdGNoLCAvKiBTb3VyY2UgICAgICAgICAqLworICAgICAgICBwTW9ubywgLyogTW9ubyBiYW5kIHBhc3Mgc291cmNlICovCisgICAgICAgIHBTY3JhdGNoLCAvKiBEZXN0aW5hdGlvbiAgICAqLworICAgICAgICBOckZyYW1lcywgLyogTnVtYmVyIG9mIGZyYW1lcyAgICAgKi8KKyAgICAgICAgTnJDaGFubmVscyk7IC8qIE51bWJlciBvZiBjaGFubmVscyAgICAgKi8KKyNlbHNlCisgICAgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKCZwSW5zdGFuY2UtPnBEYXRhLT5BR0NJbnN0YW5jZSwgLyogSW5zdGFuY2UgcG9pbnRlciAgICAgICovCisgICAgICAgIHBTY3JhdGNoLCAvKiBTdGVyZW8gc291cmNlICAgICAgICAgKi8KKyAgICAgICAgcE1vbm8sIC8qIE1vbm8gYmFuZCBwYXNzIHNvdXJjZSAqLworICAgICAgICBwU2NyYXRjaCwgLyogU3RlcmVvIGRlc3RpbmF0aW9uICAgICovCisgICAgICAgIE5yRnJhbWVzKTsKKyNlbmRpZgorCisgICAgZm9yIChMVk1fSU5UMzIgaWkgPSAwOyBpaSA8IE5yU2FtcGxlczsgKytpaSkgeworICAgICAgLy9UT0RPOiByZXBsYWNlIHdpdGggZXhpc3RpbmcgY2xhbXBpbmcgZnVuY3Rpb24KKyAgICAgIGlmIChwU2NyYXRjaFtpaV0gPCAtMS4wKSB7CisgICAgICAgIHBTY3JhdGNoW2lpXSA9IC0xLjA7CisgICAgICB9IGVsc2UgaWYgKHBTY3JhdGNoW2lpXSA+IDEuMCkgeworICAgICAgICBwU2NyYXRjaFtpaV0gPSAxLjA7CisgICAgICB9CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIGNsZWFyIERCRSBwcm9jZXNzZWQgcGF0aAorICAgIG1lbXNldChwU2NyYXRjaCwgMCwgc2l6ZW9mKCpwU2NyYXRjaCkgKiBOclNhbXBsZXMpOworICB9CisKKyAgLyogQnlwYXNzIFZvbHVtZSBwYXRoIGlzIHByb2Nlc3NlZCB3aGVuIERCRSBpcyBPRkYgb3IgZHVyaW5nIE9uL09mZiB0cmFuc2l0aW9ucyAqLworICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZEQkVfT0ZGKXx8CisgICAgICAoTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdKQorICAgICAgICAgICE9TFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5wRGF0YS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0pKSkKKyAgeworCisgICAgLyoKKyAgICAgKiBUaGUgYWxnb3JpdGhtIGlzIGRpc2FibGVkIGJ1dCB2b2x1bWUgbWFuYWdlbWVudCBpcyByZXF1aXJlZCB0byBjb21wZW5zYXRlIGZvcgorICAgICAqIGhlYWRyb29tIGFuZCB2b2x1bWUgKGlmIGVuYWJsZWQpCisgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc1ZvbHVtZSwKKyAgICAgICAgcEluRGF0YSwKKyAgICAgICAgcFNjcmF0Y2hWb2wsCisgICAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQorICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NWb2x1bWUsCisgICAgICAgIHBJbkRhdGEsCisgICAgICAgIHBTY3JhdGNoVm9sLAorICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7IC8qIExlZnQgYW5kIHJpZ2h0LCByZWFsbHkgIyBzYW1wbGVzICovCisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICAvLyBjbGVhciBieXBhc3Mgdm9sdW1lIHBhdGgKKyAgICBtZW1zZXQocFNjcmF0Y2hWb2wsIDAsIHNpemVvZigqcFNjcmF0Y2hWb2wpICogTnJTYW1wbGVzKTsKKyAgfQorCisgIC8qCisgICAqIE1peCBEQkUgcHJvY2Vzc2VkIHBhdGggYW5kIGJ5cGFzcyB2b2x1bWUgcGF0aAorICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgIExWQ19NaXhTb2Z0XzJNY19EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPnBEYXRhLT5CeXBhc3NNaXhlciwKKyAgICAgIHBTY3JhdGNoLAorICAgICAgcFNjcmF0Y2hWb2wsCisgICAgICBwT3V0RGF0YSwKKyAgICAgIChMVk1fSU5UMTYpTnJGcmFtZXMsCisgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworI2Vsc2UKKyAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+cERhdGEtPkJ5cGFzc01peGVyLAorICAgICAgcFNjcmF0Y2gsCisgICAgICBwU2NyYXRjaFZvbCwKKyAgICAgIHBPdXREYXRhLAorICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOworI2VuZGlmCisgIHJldHVybiBMVkRCRV9TVUNDRVNTOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGE5YjE0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDYwOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTFZEQkUuaCIKLSNpbmNsdWRlICJMVkRCRV9Db2VmZnMuaCIgICAgICAgICAgICAgICAvKiBGaWx0ZXIgY29lZmZpY2llbnRzICovCi0jaW5jbHVkZSAiQklRVUFELmgiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDb2VmZmljaWVudHMgY29uc3RhbnQgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBIaWdoIFBhc3MgRmlsdGVyIENvZWZmaWNpZW50IHRhYmxlCi0gKi8KLSNpZm5kZWYgQlVJTERfRkxPQVQKLWNvbnN0IEJRX0MzMl9Db2Vmc190IExWREJFX0hQRl9UYWJsZVtdID0gewotI2Vsc2UgLypCVUlMRF9GTE9BVCovCi1jb25zdCBCUV9GTE9BVF9Db2Vmc190IExWREJFX0hQRl9UYWJsZVtdID0gewotI2VuZGlmIC8qQlVJTERfRkxPQVQqLwotICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNTVIeiBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAge0hQRl9GczgwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczgwMDBfRmM1NV9BMSwKLSAgICAgSFBGX0ZzODAwMF9GYzU1X0EwLAotICAgICAtSFBGX0ZzODAwMF9GYzU1X0IyLAotICAgICAtSFBGX0ZzODAwMF9GYzU1X0IxfSwKLSAgICB7SFBGX0ZzMTEwMjVfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxMTAyNV9GYzU1X0ExLAotICAgICBIUEZfRnMxMTAyNV9GYzU1X0EwLAotICAgICAtSFBGX0ZzMTEwMjVfRmM1NV9CMiwKLSAgICAgLUhQRl9GczExMDI1X0ZjNTVfQjF9LAotICAgIHtIUEZfRnMxMjAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczEyMDAwX0ZjNTVfQTEsCi0gICAgIEhQRl9GczEyMDAwX0ZjNTVfQTAsCi0gICAgIC1IUEZfRnMxMjAwMF9GYzU1X0IyLAotICAgICAtSFBGX0ZzMTIwMDBfRmM1NV9CMX0sCi0gICAge0hQRl9GczE2MDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTYwMDBfRmM1NV9BMSwKLSAgICAgSFBGX0ZzMTYwMDBfRmM1NV9BMCwKLSAgICAgLUhQRl9GczE2MDAwX0ZjNTVfQjIsCi0gICAgIC1IUEZfRnMxNjAwMF9GYzU1X0IxfSwKLSAgICB7SFBGX0ZzMjIwNTBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMyMjA1MF9GYzU1X0ExLAotICAgICBIUEZfRnMyMjA1MF9GYzU1X0EwLAotICAgICAtSFBGX0ZzMjIwNTBfRmM1NV9CMiwKLSAgICAgLUhQRl9GczIyMDUwX0ZjNTVfQjF9LAotICAgIHtIUEZfRnMyNDAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczI0MDAwX0ZjNTVfQTEsCi0gICAgIEhQRl9GczI0MDAwX0ZjNTVfQTAsCi0gICAgIC1IUEZfRnMyNDAwMF9GYzU1X0IyLAotICAgICAtSFBGX0ZzMjQwMDBfRmM1NV9CMX0sCi0gICAge0hQRl9GczMyMDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMzIwMDBfRmM1NV9BMSwKLSAgICAgSFBGX0ZzMzIwMDBfRmM1NV9BMCwKLSAgICAgLUhQRl9GczMyMDAwX0ZjNTVfQjIsCi0gICAgIC1IUEZfRnMzMjAwMF9GYzU1X0IxfSwKLSAgICB7SFBGX0ZzNDQxMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM0NDEwMF9GYzU1X0ExLAotICAgICBIUEZfRnM0NDEwMF9GYzU1X0EwLAotICAgICAtSFBGX0ZzNDQxMDBfRmM1NV9CMiwKLSAgICAgLUhQRl9GczQ0MTAwX0ZjNTVfQjF9LAotICAgIHtIUEZfRnM0ODAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczQ4MDAwX0ZjNTVfQTEsCi0gICAgIEhQRl9GczQ4MDAwX0ZjNTVfQTAsCi0gICAgIC1IUEZfRnM0ODAwMF9GYzU1X0IyLAotICAgICAtSFBGX0ZzNDgwMDBfRmM1NV9CMX0sCi0jaWZkZWYgSElHSEVSX0ZTCi0gICAge0hQRl9Gczk2MDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzOTYwMDBfRmM1NV9BMSwKLSAgICAgSFBGX0ZzOTYwMDBfRmM1NV9BMCwKLSAgICAgLUhQRl9Gczk2MDAwX0ZjNTVfQjIsCi0gICAgIC1IUEZfRnM5NjAwMF9GYzU1X0IxfSwKLSAgICB7SFBGX0ZzMTkyMDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczE5MjAwMF9GYzU1X0ExLAotICAgICBIUEZfRnMxOTIwMDBfRmM1NV9BMCwKLSAgICAgLUhQRl9GczE5MjAwMF9GYzU1X0IyLAotICAgICAtSFBGX0ZzMTkyMDAwX0ZjNTVfQjF9LAotI2VuZGlmCi0KLSAgICAvKiBDb2VmZmljaWVudHMgZm9yIDY2SHogY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgIHtIUEZfRnM4MDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM4MDAwX0ZjNjZfQTEsCi0gICAgIEhQRl9GczgwMDBfRmM2Nl9BMCwKLSAgICAgLUhQRl9GczgwMDBfRmM2Nl9CMiwKLSAgICAgLUhQRl9GczgwMDBfRmM2Nl9CMX0sCi0gICAge0hQRl9GczExMDI1X0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTEwMjVfRmM2Nl9BMSwKLSAgICAgSFBGX0ZzMTEwMjVfRmM2Nl9BMCwKLSAgICAgLUhQRl9GczExMDI1X0ZjNjZfQjIsCi0gICAgIC1IUEZfRnMxMTAyNV9GYzY2X0IxfSwKLSAgICB7SFBGX0ZzMTIwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxMjAwMF9GYzY2X0ExLAotICAgICBIUEZfRnMxMjAwMF9GYzY2X0EwLAotICAgICAtSFBGX0ZzMTIwMDBfRmM2Nl9CMiwKLSAgICAgLUhQRl9GczEyMDAwX0ZjNjZfQjF9LAotICAgIHtIUEZfRnMxNjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczE2MDAwX0ZjNjZfQTEsCi0gICAgIEhQRl9GczE2MDAwX0ZjNjZfQTAsCi0gICAgIC1IUEZfRnMxNjAwMF9GYzY2X0IyLAotICAgICAtSFBGX0ZzMTYwMDBfRmM2Nl9CMX0sCi0gICAge0hQRl9GczIyMDUwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMjIwNTBfRmM2Nl9BMSwKLSAgICAgSFBGX0ZzMjIwNTBfRmM2Nl9BMCwKLSAgICAgLUhQRl9GczIyMDUwX0ZjNjZfQjIsCi0gICAgIC1IUEZfRnMyMjA1MF9GYzY2X0IxfSwKLSAgICB7SFBGX0ZzMjQwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMyNDAwMF9GYzY2X0ExLAotICAgICBIUEZfRnMyNDAwMF9GYzY2X0EwLAotICAgICAtSFBGX0ZzMjQwMDBfRmM2Nl9CMiwKLSAgICAgLUhQRl9GczI0MDAwX0ZjNjZfQjF9LAotICAgIHtIUEZfRnMzMjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczMyMDAwX0ZjNjZfQTEsCi0gICAgIEhQRl9GczMyMDAwX0ZjNjZfQTAsCi0gICAgIC1IUEZfRnMzMjAwMF9GYzY2X0IyLAotICAgICAtSFBGX0ZzMzIwMDBfRmM2Nl9CMX0sCi0gICAge0hQRl9GczQ0MTAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzNDQxMDBfRmM2Nl9BMSwKLSAgICAgSFBGX0ZzNDQxMDBfRmM2Nl9BMCwKLSAgICAgLUhQRl9GczQ0MTAwX0ZjNjZfQjIsCi0gICAgIC1IUEZfRnM0NDEwMF9GYzY2X0IxfSwKLSAgICB7SFBGX0ZzNDgwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM0ODAwMF9GYzY2X0ExLAotICAgICBIUEZfRnM0ODAwMF9GYzY2X0EwLAotICAgICAtSFBGX0ZzNDgwMDBfRmM2Nl9CMiwKLSAgICAgLUhQRl9GczQ4MDAwX0ZjNjZfQjF9LAotI2lmZGVmIEhJR0hFUl9GUwotICAgIHtIUEZfRnM5NjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9Gczk2MDAwX0ZjNjZfQTEsCi0gICAgIEhQRl9Gczk2MDAwX0ZjNjZfQTAsCi0gICAgIC1IUEZfRnM5NjAwMF9GYzY2X0IyLAotICAgICAtSFBGX0ZzOTYwMDBfRmM2Nl9CMX0sCi0gICAge0hQRl9GczE5MjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxOTIwMDBfRmM2Nl9BMSwKLSAgICAgSFBGX0ZzMTkyMDAwX0ZjNjZfQTAsCi0gICAgIC1IUEZfRnMxOTIwMDBfRmM2Nl9CMiwKLSAgICAgLUhQRl9GczE5MjAwMF9GYzY2X0IxfSwKLSNlbmRpZgotCi0KLSAgICAvKiBDb2VmZmljaWVudHMgZm9yIDc4SHogY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgIHtIUEZfRnM4MDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM4MDAwX0ZjNzhfQTEsCi0gICAgIEhQRl9GczgwMDBfRmM3OF9BMCwKLSAgICAgLUhQRl9GczgwMDBfRmM3OF9CMiwKLSAgICAgLUhQRl9GczgwMDBfRmM3OF9CMX0sCi0gICAge0hQRl9GczExMDI1X0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTEwMjVfRmM3OF9BMSwKLSAgICAgSFBGX0ZzMTEwMjVfRmM3OF9BMCwKLSAgICAgLUhQRl9GczExMDI1X0ZjNzhfQjIsCi0gICAgIC1IUEZfRnMxMTAyNV9GYzc4X0IxfSwKLSAgICB7SFBGX0ZzMTIwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxMjAwMF9GYzc4X0ExLAotICAgICBIUEZfRnMxMjAwMF9GYzc4X0EwLAotICAgICAtSFBGX0ZzMTIwMDBfRmM3OF9CMiwKLSAgICAgLUhQRl9GczEyMDAwX0ZjNzhfQjF9LAotICAgIHtIUEZfRnMxNjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczE2MDAwX0ZjNzhfQTEsCi0gICAgIEhQRl9GczE2MDAwX0ZjNzhfQTAsCi0gICAgIC1IUEZfRnMxNjAwMF9GYzc4X0IyLAotICAgICAtSFBGX0ZzMTYwMDBfRmM3OF9CMX0sCi0gICAge0hQRl9GczIyMDUwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMjIwNTBfRmM3OF9BMSwKLSAgICAgSFBGX0ZzMjIwNTBfRmM3OF9BMCwKLSAgICAgLUhQRl9GczIyMDUwX0ZjNzhfQjIsCi0gICAgIC1IUEZfRnMyMjA1MF9GYzc4X0IxfSwKLSAgICB7SFBGX0ZzMjQwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMyNDAwMF9GYzc4X0ExLAotICAgICBIUEZfRnMyNDAwMF9GYzc4X0EwLAotICAgICAtSFBGX0ZzMjQwMDBfRmM3OF9CMiwKLSAgICAgLUhQRl9GczI0MDAwX0ZjNzhfQjF9LAotICAgIHtIUEZfRnMzMjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczMyMDAwX0ZjNzhfQTEsCi0gICAgIEhQRl9GczMyMDAwX0ZjNzhfQTAsCi0gICAgIC1IUEZfRnMzMjAwMF9GYzc4X0IyLAotICAgICAtSFBGX0ZzMzIwMDBfRmM3OF9CMX0sCi0gICAge0hQRl9GczQ0MTAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzNDQxMDBfRmM3OF9BMSwKLSAgICAgSFBGX0ZzNDQxMDBfRmM3OF9BMCwKLSAgICAgLUhQRl9GczQ0MTAwX0ZjNzhfQjIsCi0gICAgIC1IUEZfRnM0NDEwMF9GYzc4X0IxfSwKLSAgICB7SFBGX0ZzNDgwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM0ODAwMF9GYzc4X0ExLAotICAgICBIUEZfRnM0ODAwMF9GYzc4X0EwLAotICAgICAtSFBGX0ZzNDgwMDBfRmM3OF9CMiwKLSAgICAgLUhQRl9GczQ4MDAwX0ZjNzhfQjF9LAotI2lmZGVmIEhJR0hFUl9GUwotICAgIHtIUEZfRnM5NjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9Gczk2MDAwX0ZjNzhfQTEsCi0gICAgIEhQRl9Gczk2MDAwX0ZjNzhfQTAsCi0gICAgIC1IUEZfRnM5NjAwMF9GYzc4X0IyLAotICAgICAtSFBGX0ZzOTYwMDBfRmM3OF9CMX0sCi0gICAge0hQRl9GczE5MjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxOTIwMDBfRmM3OF9BMSwKLSAgICAgSFBGX0ZzMTkyMDAwX0ZjNzhfQTAsCi0gICAgIC1IUEZfRnMxOTIwMDBfRmM3OF9CMiwKLSAgICAgLUhQRl9GczE5MjAwMF9GYzc4X0IxfSwKLSNlbmRpZgotCi0KLSAgICAvKiBDb2VmZmljaWVudHMgZm9yIDkwSHogY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgIHtIUEZfRnM4MDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM4MDAwX0ZjOTBfQTEsCi0gICAgIEhQRl9GczgwMDBfRmM5MF9BMCwKLSAgICAgLUhQRl9GczgwMDBfRmM5MF9CMiwKLSAgICAgLUhQRl9GczgwMDBfRmM5MF9CMX0sCi0gICAge0hQRl9GczExMDI1X0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMTEwMjVfRmM5MF9BMSwKLSAgICAgSFBGX0ZzMTEwMjVfRmM5MF9BMCwKLSAgICAgLUhQRl9GczExMDI1X0ZjOTBfQjIsCi0gICAgIC1IUEZfRnMxMTAyNV9GYzkwX0IxfSwKLSAgICB7SFBGX0ZzMTIwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMxMjAwMF9GYzkwX0ExLAotICAgICBIUEZfRnMxMjAwMF9GYzkwX0EwLAotICAgICAtSFBGX0ZzMTIwMDBfRmM5MF9CMiwKLSAgICAgLUhQRl9GczEyMDAwX0ZjOTBfQjF9LAotICAgIHtIUEZfRnMxNjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczE2MDAwX0ZjOTBfQTEsCi0gICAgIEhQRl9GczE2MDAwX0ZjOTBfQTAsCi0gICAgIC1IUEZfRnMxNjAwMF9GYzkwX0IyLAotICAgICAtSFBGX0ZzMTYwMDBfRmM5MF9CMX0sCi0gICAge0hQRl9GczIyMDUwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzMjIwNTBfRmM5MF9BMSwKLSAgICAgSFBGX0ZzMjIwNTBfRmM5MF9BMCwKLSAgICAgLUhQRl9GczIyMDUwX0ZjOTBfQjIsCi0gICAgIC1IUEZfRnMyMjA1MF9GYzkwX0IxfSwKLSAgICB7SFBGX0ZzMjQwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnMyNDAwMF9GYzkwX0ExLAotICAgICBIUEZfRnMyNDAwMF9GYzkwX0EwLAotICAgICAtSFBGX0ZzMjQwMDBfRmM5MF9CMiwKLSAgICAgLUhQRl9GczI0MDAwX0ZjOTBfQjF9LAotICAgIHtIUEZfRnMzMjAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczMyMDAwX0ZjOTBfQTEsCi0gICAgIEhQRl9GczMyMDAwX0ZjOTBfQTAsCi0gICAgIC1IUEZfRnMzMjAwMF9GYzkwX0IyLAotICAgICAtSFBGX0ZzMzIwMDBfRmM5MF9CMX0sCi0gICAge0hQRl9GczQ0MTAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzNDQxMDBfRmM5MF9BMSwKLSAgICAgSFBGX0ZzNDQxMDBfRmM5MF9BMCwKLSAgICAgLUhQRl9GczQ0MTAwX0ZjOTBfQjIsCi0gICAgIC1IUEZfRnM0NDEwMF9GYzkwX0IxfSwKLSAgICB7SFBGX0ZzNDgwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBIUEZfRnM0ODAwMF9GYzkwX0ExLAotICAgICBIUEZfRnM0ODAwMF9GYzkwX0EwLAotICAgICAtSFBGX0ZzNDgwMDBfRmM5MF9CMiwKLSAgICAgLUhQRl9GczQ4MDAwX0ZjOTBfQjF9Ci0KLSNpZmRlZiBISUdIRVJfRlMKLSAgICAsCi0gICAge0hQRl9Gczk2MDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgSFBGX0ZzOTYwMDBfRmM5MF9BMSwKLSAgICAgSFBGX0ZzOTYwMDBfRmM5MF9BMCwKLSAgICAgLUhQRl9Gczk2MDAwX0ZjOTBfQjIsCi0gICAgIC1IUEZfRnM5NjAwMF9GYzkwX0IxfSwKLSAgICB7SFBGX0ZzMTkyMDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIEhQRl9GczE5MjAwMF9GYzkwX0ExLAotICAgICBIUEZfRnMxOTIwMDBfRmM5MF9BMCwKLSAgICAgLUhQRl9GczE5MjAwMF9GYzkwX0IyLAotICAgICAtSFBGX0ZzMTkyMDAwX0ZjOTBfQjF9Ci0jZW5kaWYKLQotfTsKLQotLyoKLSAqIEJhbmQgUGFzcyBGaWx0ZXIgY29lZmZpY2llbnQgdGFibGUKLSAqLwotI2lmbmRlZiBCVUlMRF9GTE9BVAotY29uc3QgQlBfQzMyX0NvZWZzX3QgTFZEQkVfQlBGX1RhYmxlW10gPSB7Ci0jZWxzZSAvKkJVSUxEX0ZMT0FUKi8KLWNvbnN0IEJQX0ZMT0FUX0NvZWZzX3QgTFZEQkVfQlBGX1RhYmxlW10gPSB7Ci0jZW5kaWYgLypCVUlMRF9GTE9BVCovCi0gICAgLyogQ29lZmZpY2llbnRzIGZvciA1NUh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KLSAgICB7QlBGX0ZzODAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczgwMDBfRmM1NV9CMiwKLSAgICAgLUJQRl9GczgwMDBfRmM1NV9CMX0sCi0gICAge0JQRl9GczExMDI1X0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczExMDI1X0ZjNTVfQjIsCi0gICAgIC1CUEZfRnMxMTAyNV9GYzU1X0IxfSwKLSAgICB7QlBGX0ZzMTIwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTIwMDBfRmM1NV9CMiwKLSAgICAgLUJQRl9GczEyMDAwX0ZjNTVfQjF9LAotICAgIHtCUEZfRnMxNjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxNjAwMF9GYzU1X0IyLAotICAgICAtQlBGX0ZzMTYwMDBfRmM1NV9CMX0sCi0gICAge0JQRl9GczIyMDUwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczIyMDUwX0ZjNTVfQjIsCi0gICAgIC1CUEZfRnMyMjA1MF9GYzU1X0IxfSwKLSAgICB7QlBGX0ZzMjQwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMjQwMDBfRmM1NV9CMiwKLSAgICAgLUJQRl9GczI0MDAwX0ZjNTVfQjF9LAotICAgIHtCUEZfRnMzMjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMzMjAwMF9GYzU1X0IyLAotICAgICAtQlBGX0ZzMzIwMDBfRmM1NV9CMX0sCi0gICAge0JQRl9GczQ0MTAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczQ0MTAwX0ZjNTVfQjIsCi0gICAgIC1CUEZfRnM0NDEwMF9GYzU1X0IxfSwKLSAgICB7QlBGX0ZzNDgwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzNDgwMDBfRmM1NV9CMiwKLSAgICAgLUJQRl9GczQ4MDAwX0ZjNTVfQjF9LAotI2lmZGVmIEhJR0hFUl9GUwotICAgICB7QlBGX0ZzOTYwMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzOTYwMDBfRmM1NV9CMiwKLSAgICAgLUJQRl9Gczk2MDAwX0ZjNTVfQjF9LAotICAgICB7QlBGX0ZzMTkyMDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxOTIwMDBfRmM1NV9CMiwKLSAgICAgLUJQRl9GczE5MjAwMF9GYzU1X0IxfSwKLSNlbmRpZgotCi0gICAgLyogQ29lZmZpY2llbnRzIGZvciA2Nkh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KLSAgICB7QlBGX0ZzODAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczgwMDBfRmM2Nl9CMiwKLSAgICAgLUJQRl9GczgwMDBfRmM2Nl9CMX0sCi0gICAge0JQRl9GczExMDI1X0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczExMDI1X0ZjNjZfQjIsCi0gICAgIC1CUEZfRnMxMTAyNV9GYzY2X0IxfSwKLSAgICB7QlBGX0ZzMTIwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTIwMDBfRmM2Nl9CMiwKLSAgICAgLUJQRl9GczEyMDAwX0ZjNjZfQjF9LAotICAgIHtCUEZfRnMxNjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxNjAwMF9GYzY2X0IyLAotICAgICAtQlBGX0ZzMTYwMDBfRmM2Nl9CMX0sCi0gICAge0JQRl9GczIyMDUwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczIyMDUwX0ZjNjZfQjIsCi0gICAgIC1CUEZfRnMyMjA1MF9GYzY2X0IxfSwKLSAgICB7QlBGX0ZzMjQwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMjQwMDBfRmM2Nl9CMiwKLSAgICAgLUJQRl9GczI0MDAwX0ZjNjZfQjF9LAotICAgIHtCUEZfRnMzMjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMzMjAwMF9GYzY2X0IyLAotICAgICAtQlBGX0ZzMzIwMDBfRmM2Nl9CMX0sCi0gICAge0JQRl9GczQ0MTAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczQ0MTAwX0ZjNjZfQjIsCi0gICAgIC1CUEZfRnM0NDEwMF9GYzY2X0IxfSwKLSAgICB7QlBGX0ZzNDgwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzNDgwMDBfRmM2Nl9CMiwKLSAgICAgLUJQRl9GczQ4MDAwX0ZjNjZfQjF9LAotI2lmZGVmIEhJR0hFUl9GUwotICAgIHtCUEZfRnM5NjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM5NjAwMF9GYzY2X0IyLAotICAgICAtQlBGX0ZzOTYwMDBfRmM2Nl9CMX0sCi0gICAge0JQRl9GczE5MjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTkyMDAwX0ZjNjZfQjIsCi0gICAgIC1CUEZfRnMxOTIwMDBfRmM2Nl9CMX0sCi0jZW5kaWYKLQotICAgIC8qIENvZWZmaWNpZW50cyBmb3IgNzhIeiBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAge0JQRl9GczgwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM4MDAwX0ZjNzhfQjIsCi0gICAgIC1CUEZfRnM4MDAwX0ZjNzhfQjF9LAotICAgIHtCUEZfRnMxMTAyNV9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxMTAyNV9GYzc4X0IyLAotICAgICAtQlBGX0ZzMTEwMjVfRmM3OF9CMX0sCi0gICAge0JQRl9GczEyMDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczEyMDAwX0ZjNzhfQjIsCi0gICAgIC1CUEZfRnMxMjAwMF9GYzc4X0IxfSwKLSAgICB7QlBGX0ZzMTYwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTYwMDBfRmM3OF9CMiwKLSAgICAgLUJQRl9GczE2MDAwX0ZjNzhfQjF9LAotICAgIHtCUEZfRnMyMjA1MF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMyMjA1MF9GYzc4X0IyLAotICAgICAtQlBGX0ZzMjIwNTBfRmM3OF9CMX0sCi0gICAge0JQRl9GczI0MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczI0MDAwX0ZjNzhfQjIsCi0gICAgIC1CUEZfRnMyNDAwMF9GYzc4X0IxfSwKLSAgICB7QlBGX0ZzMzIwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMzIwMDBfRmM3OF9CMiwKLSAgICAgLUJQRl9GczMyMDAwX0ZjNzhfQjF9LAotICAgIHtCUEZfRnM0NDEwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM0NDEwMF9GYzc4X0IyLAotICAgICAtQlBGX0ZzNDQxMDBfRmM3OF9CMX0sCi0gICAge0JQRl9GczQ4MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczQ4MDAwX0ZjNzhfQjIsCi0gICAgIC1CUEZfRnM0ODAwMF9GYzc4X0IxfSwKLSNpZmRlZiBISUdIRVJfRlMKLSAgICB7QlBGX0ZzOTYwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzOTYwMDBfRmM3OF9CMiwKLSAgICAgLUJQRl9Gczk2MDAwX0ZjNzhfQjF9LAotICAgIHtCUEZfRnMxOTIwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczE5MjAwMF9GYzc4X0IyLAotICAgICAtQlBGX0ZzMTkyMDAwX0ZjNzhfQjF9LAotI2VuZGlmCi0KLSAgICAvKiBDb2VmZmljaWVudHMgZm9yIDkwSHogY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgIHtCUEZfRnM4MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzODAwMF9GYzkwX0IyLAotICAgICAtQlBGX0ZzODAwMF9GYzkwX0IxfSwKLSAgICB7QlBGX0ZzMTEwMjVfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMTEwMjVfRmM5MF9CMiwKLSAgICAgLUJQRl9GczExMDI1X0ZjOTBfQjF9LAotICAgIHtCUEZfRnMxMjAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxMjAwMF9GYzkwX0IyLAotICAgICAtQlBGX0ZzMTIwMDBfRmM5MF9CMX0sCi0gICAge0JQRl9GczE2MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczE2MDAwX0ZjOTBfQjIsCi0gICAgIC1CUEZfRnMxNjAwMF9GYzkwX0IxfSwKLSAgICB7QlBGX0ZzMjIwNTBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzMjIwNTBfRmM5MF9CMiwKLSAgICAgLUJQRl9GczIyMDUwX0ZjOTBfQjF9LAotICAgIHtCUEZfRnMyNDAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMyNDAwMF9GYzkwX0IyLAotICAgICAtQlBGX0ZzMjQwMDBfRmM5MF9CMX0sCi0gICAge0JQRl9GczMyMDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9GczMyMDAwX0ZjOTBfQjIsCi0gICAgIC1CUEZfRnMzMjAwMF9GYzkwX0IxfSwKLSAgICB7QlBGX0ZzNDQxMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICAtQlBGX0ZzNDQxMDBfRmM5MF9CMiwKLSAgICAgLUJQRl9GczQ0MTAwX0ZjOTBfQjF9LAotICAgIHtCUEZfRnM0ODAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnM0ODAwMF9GYzkwX0IyLAotICAgICAtQlBGX0ZzNDgwMDBfRmM5MF9CMX0KLSNpZmRlZiBISUdIRVJfRlMKLSAgICAsCi0gICAge0JQRl9Gczk2MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgLUJQRl9Gczk2MDAwX0ZjOTBfQjIsCi0gICAgIC1CUEZfRnM5NjAwMF9GYzkwX0IxfSwKLSAgICB7QlBGX0ZzMTkyMDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIC1CUEZfRnMxOTIwMDBfRmM5MF9CMiwKLSAgICAgLUJQRl9GczE5MjAwMF9GYzkwX0IxfQotI2VuZGlmCi0KLQotfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEFHQyBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQXR0YWNrIHRpbWUgKHNpZ25hbCB0b28gbGFyZ2UpICovCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi1jb25zdCBMVk1fSU5UMTYgTFZEQkVfQUdDX0FUVEFDS19UYWJsZVtdID0gewotI2Vsc2UgLypCVUlMRF9GTE9BVCovCi1jb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0FUVEFDS19UYWJsZVtdID0gewotI2VuZGlmIC8qQlVJTERfRkxPQVQqLwotICAgIEFHQ19BVFRBQ0tfRnM4MDAwLAotICAgIEFHQ19BVFRBQ0tfRnMxMTAyNSwKLSAgICBBR0NfQVRUQUNLX0ZzMTIwMDAsCi0gICAgQUdDX0FUVEFDS19GczE2MDAwLAotICAgIEFHQ19BVFRBQ0tfRnMyMjA1MCwKLSAgICBBR0NfQVRUQUNLX0ZzMjQwMDAsCi0gICAgQUdDX0FUVEFDS19GczMyMDAwLAotICAgIEFHQ19BVFRBQ0tfRnM0NDEwMCwKLSAgICBBR0NfQVRUQUNLX0ZzNDgwMDAKLSNpZmRlZiBISUdIRVJfRlMKLSAgICAsQUdDX0FUVEFDS19Gczk2MDAwCi0gICAgLEFHQ19BVFRBQ0tfRnMxOTIwMDAKLSNlbmRpZgotCi19OwotCi0vKiBEZWNheSB0aW1lIChzaWduYWwgdG9vIHNtYWxsKSAqLwotI2lmbmRlZiBCVUlMRF9GTE9BVAotY29uc3QgTFZNX0lOVDE2IExWREJFX0FHQ19ERUNBWV9UYWJsZVtdID0gewotI2Vsc2UgLypCVUlMRF9GTE9BVCovCi1jb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0RFQ0FZX1RhYmxlW10gPSB7Ci0jZW5kaWYgLypCVUlMRF9GTE9BVCovCi0gICAgQUdDX0RFQ0FZX0ZzODAwMCwKLSAgICBBR0NfREVDQVlfRnMxMTAyNSwKLSAgICBBR0NfREVDQVlfRnMxMjAwMCwKLSAgICBBR0NfREVDQVlfRnMxNjAwMCwKLSAgICBBR0NfREVDQVlfRnMyMjA1MCwKLSAgICBBR0NfREVDQVlfRnMyNDAwMCwKLSAgICBBR0NfREVDQVlfRnMzMjAwMCwKLSAgICBBR0NfREVDQVlfRnM0NDEwMCwKLSAgICBBR0NfREVDQVlfRnM0ODAwMAotI2lmZGVmIEhJR0hFUl9GUwotICAgICxBR0NfREVDQVlfRlM5NjAwMAotICAgICxBR0NfREVDQVlfRlMxOTIwMDAKLSNlbmRpZgotCi19OwotCi0vKiBHYWluIGZvciB1c2Ugd2l0aG91dCB0aGUgaGlnaCBwYXNzIGZpbHRlciAqLwotI2lmbmRlZiBCVUlMRF9GTE9BVAotY29uc3QgTFZNX0lOVDMyIExWREJFX0FHQ19HQUlOX1RhYmxlW10gPSB7Ci0jZWxzZSAvKkJVSUxEX0ZMT0FUKi8KLWNvbnN0IExWTV9GTE9BVCBMVkRCRV9BR0NfR0FJTl9UYWJsZVtdID0gewotI2VuZGlmIC8qQlVJTERfRkxPQVQqLwotICAgIEFHQ19HQUlOXzBkQiwKLSAgICBBR0NfR0FJTl8xZEIsCi0gICAgQUdDX0dBSU5fMmRCLAotICAgIEFHQ19HQUlOXzNkQiwKLSAgICBBR0NfR0FJTl80ZEIsCi0gICAgQUdDX0dBSU5fNWRCLAotICAgIEFHQ19HQUlOXzZkQiwKLSAgICBBR0NfR0FJTl83ZEIsCi0gICAgQUdDX0dBSU5fOGRCLAotICAgIEFHQ19HQUlOXzlkQiwKLSAgICBBR0NfR0FJTl8xMGRCLAotICAgIEFHQ19HQUlOXzExZEIsCi0gICAgQUdDX0dBSU5fMTJkQiwKLSAgICBBR0NfR0FJTl8xM2RCLAotICAgIEFHQ19HQUlOXzE0ZEIsCi0gICAgQUdDX0dBSU5fMTVkQn07Ci0KLS8qIEdhaW4gZm9yIHVzZSB3aXRoIHRoZSBoaWdoIHBhc3MgZmlsdGVyICovCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi1jb25zdCBMVk1fSU5UMzIgTFZEQkVfQUdDX0hQRkdBSU5fVGFibGVbXSA9IHsKLSNlbHNlIC8qQlVJTERfRkxPQVQqLwotY29uc3QgTFZNX0ZMT0FUIExWREJFX0FHQ19IUEZHQUlOX1RhYmxlW10gPSB7Ci0jZW5kaWYgLypCVUlMRF9GTE9BVCovCi0gICAgQUdDX0hQRkdBSU5fMGRCLAotICAgIEFHQ19IUEZHQUlOXzFkQiwKLSAgICBBR0NfSFBGR0FJTl8yZEIsCi0gICAgQUdDX0hQRkdBSU5fM2RCLAotICAgIEFHQ19IUEZHQUlOXzRkQiwKLSAgICBBR0NfSFBGR0FJTl81ZEIsCi0gICAgQUdDX0hQRkdBSU5fNmRCLAotICAgIEFHQ19IUEZHQUlOXzdkQiwKLSAgICBBR0NfSFBGR0FJTl84ZEIsCi0gICAgQUdDX0hQRkdBSU5fOWRCLAotICAgIEFHQ19IUEZHQUlOXzEwZEIsCi0gICAgQUdDX0hQRkdBSU5fMTFkQiwKLSAgICBBR0NfSFBGR0FJTl8xMmRCLAotICAgIEFHQ19IUEZHQUlOXzEzZEIsCi0gICAgQUdDX0hQRkdBSU5fMTRkQiwKLSAgICBBR0NfSFBGR0FJTl8xNWRCfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFZvbHVtZSBjb250cm9sIGdhaW4gYW5kIHRpbWUgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogZEIgdG8gbGluZWFyIGNvbnZlcnNpb24gdGFibGUgKi8KLSNpZm5kZWYgQlVJTERfRkxPQVQKLWNvbnN0IExWTV9JTlQxNiBMVkRCRV9Wb2x1bWVUYWJsZVtdID0gewotICAgIDB4NDAwMCwgICAgICAgICAgICAgLyogLTZkQiAqLwotICAgIDB4NDdGQiwgICAgICAgICAgICAgLyogLTVkQiAqLwotICAgIDB4NTBDMywgICAgICAgICAgICAgLyogLTRkQiAqLwotICAgIDB4NUE5RSwgICAgICAgICAgICAgLyogLTNkQiAqLwotICAgIDB4NjVBRCwgICAgICAgICAgICAgLyogLTJkQiAqLwotICAgIDB4NzIxNSwgICAgICAgICAgICAgLyogLTFkQiAqLwotICAgIDB4N0ZGRn07ICAgICAgICAgICAgLyogIDBkQiAqLwotI2Vsc2UgLypCVUlMRF9GTE9BVCovCi1jb25zdCBMVk1fRkxPQVQgTFZEQkVfVm9sdW1lVGFibGVbXSA9IHsKLSAgICAwLjUwMDAwMGYsICAgICAgICAgLyogLTZkQiAqLwotICAgIDAuNTYyMzQxZiwgICAgICAgICAvKiAtNWRCICovCi0gICAgMC42MzA5NTdmLCAgICAgICAgIC8qIC00ZEIgKi8KLSAgICAwLjcwNzk0NmYsICAgICAgICAgLyogLTNkQiAqLwotICAgIDAuNzk0MzI4ZiwgICAgICAgICAvKiAtMmRCICovCi0gICAgMC44OTEyNTFmLCAgICAgICAgIC8qIC0xZEIgKi8KLSAgICAxLjAwMDAwMGZ9OyAgICAgICAgLyogIDBkQiAqLwotI2VuZGlmIC8qQlVJTERfRkxPQVQqLwotCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi1jb25zdCBMVk1fSU5UMTYgTFZEQkVfVm9sdW1lVENUYWJsZVtdID0gewotI2Vsc2UgLypCVUlMRF9GTE9BVCovCi1jb25zdCBMVk1fRkxPQVQgTFZEQkVfVm9sdW1lVENUYWJsZVtdID0gewotI2VuZGlmIC8qQlVJTERfRkxPQVQqLwotICAgIFZPTF9UQ19GczgwMDAsCi0gICAgVk9MX1RDX0ZzMTEwMjUsCi0gICAgVk9MX1RDX0ZzMTIwMDAsCi0gICAgVk9MX1RDX0ZzMTYwMDAsCi0gICAgVk9MX1RDX0ZzMjIwNTAsCi0gICAgVk9MX1RDX0ZzMjQwMDAsCi0gICAgVk9MX1RDX0ZzMzIwMDAsCi0gICAgVk9MX1RDX0ZzNDQxMDAsCi0gICAgVk9MX1RDX0ZzNDgwMDAKLSNpZmRlZiBISUdIRVJfRlMKLSAgICAsVk9MX1RDX0ZzOTYwMDAKLSAgICAsVk9MX1RDX0ZzMTkyMDAwCi0jZW5kaWYKLX07Ci0KLQotCi1jb25zdCBMVk1fSU5UMTYgTFZEQkVfTWl4ZXJUQ1RhYmxlW10gPSB7Ci0KLSAgICBNSVhfVENfRnM4MDAwLAotICAgIE1JWF9UQ19GczExMDI1LAotICAgIE1JWF9UQ19GczEyMDAwLAotICAgIE1JWF9UQ19GczE2MDAwLAotICAgIE1JWF9UQ19GczIyMDUwLAotICAgIE1JWF9UQ19GczI0MDAwLAotICAgIE1JWF9UQ19GczMyMDAwLAotICAgIE1JWF9UQ19GczQ0MTAwLAotICAgIE1JWF9UQ19GczQ4MDAwCi0jaWZkZWYgSElHSEVSX0ZTCi0gICAgLE1JWF9UQ19Gczk2MDAwCi0gICAgLE1JWF9UQ19GczE5MjAwMAotI2VuZGlmCi0KLX07CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyODU3NWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmNwcApAQCAtMCwwICsxLDYxMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkRCRS5oIgorI2luY2x1ZGUgIkxWREJFX0NvZWZmcy5oIiAgICAgICAgICAgICAgIC8qIEZpbHRlciBjb2VmZmljaWVudHMgKi8KKyNpbmNsdWRlICJMVkRCRV9UYWJsZXMuaCIKKyNpbmNsdWRlICJCSVFVQUQuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBDb2VmZmljaWVudHMgY29uc3RhbnQgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBIaWdoIFBhc3MgRmlsdGVyIENvZWZmaWNpZW50IHRhYmxlCisgKi8KK2NvbnN0IEJRX0ZMT0FUX0NvZWZzX3QgTFZEQkVfSFBGX1RhYmxlW10gPSB7CisgICAgLyogQ29lZmZpY2llbnRzIGZvciA1NUh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICB7SFBGX0ZzODAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzODAwMF9GYzU1X0ExLAorICAgICBIUEZfRnM4MDAwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnM4MDAwX0ZjNTVfQjIsCisgICAgIC1IUEZfRnM4MDAwX0ZjNTVfQjF9LAorICAgIHtIUEZfRnMxMTAyNV9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczExMDI1X0ZjNTVfQTEsCisgICAgIEhQRl9GczExMDI1X0ZjNTVfQTAsCisgICAgIC1IUEZfRnMxMTAyNV9GYzU1X0IyLAorICAgICAtSFBGX0ZzMTEwMjVfRmM1NV9CMX0sCisgICAge0hQRl9GczEyMDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTIwMDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzMTIwMDBfRmM1NV9BMCwKKyAgICAgLUhQRl9GczEyMDAwX0ZjNTVfQjIsCisgICAgIC1IUEZfRnMxMjAwMF9GYzU1X0IxfSwKKyAgICB7SFBGX0ZzMTYwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxNjAwMF9GYzU1X0ExLAorICAgICBIUEZfRnMxNjAwMF9GYzU1X0EwLAorICAgICAtSFBGX0ZzMTYwMDBfRmM1NV9CMiwKKyAgICAgLUhQRl9GczE2MDAwX0ZjNTVfQjF9LAorICAgIHtIUEZfRnMyMjA1MF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczIyMDUwX0ZjNTVfQTEsCisgICAgIEhQRl9GczIyMDUwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnMyMjA1MF9GYzU1X0IyLAorICAgICAtSFBGX0ZzMjIwNTBfRmM1NV9CMX0sCisgICAge0hQRl9GczI0MDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMjQwMDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzMjQwMDBfRmM1NV9BMCwKKyAgICAgLUhQRl9GczI0MDAwX0ZjNTVfQjIsCisgICAgIC1IUEZfRnMyNDAwMF9GYzU1X0IxfSwKKyAgICB7SFBGX0ZzMzIwMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMzMjAwMF9GYzU1X0ExLAorICAgICBIUEZfRnMzMjAwMF9GYzU1X0EwLAorICAgICAtSFBGX0ZzMzIwMDBfRmM1NV9CMiwKKyAgICAgLUhQRl9GczMyMDAwX0ZjNTVfQjF9LAorICAgIHtIUEZfRnM0NDEwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczQ0MTAwX0ZjNTVfQTEsCisgICAgIEhQRl9GczQ0MTAwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnM0NDEwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzNDQxMDBfRmM1NV9CMX0sCisgICAge0hQRl9GczQ4MDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzNDgwMDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzNDgwMDBfRmM1NV9BMCwKKyAgICAgLUhQRl9GczQ4MDAwX0ZjNTVfQjIsCisgICAgIC1IUEZfRnM0ODAwMF9GYzU1X0IxfSwKKyAgICB7SFBGX0ZzODgyMDBfRmM1NV9BMiwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM4ODIwMF9GYzU1X0ExLAorICAgICBIUEZfRnM4ODIwMF9GYzU1X0EwLAorICAgICAtSFBGX0ZzODgyMDBfRmM1NV9CMiwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjNTVfQjF9LAorICAgIHtIUEZfRnM5NjAwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczk2MDAwX0ZjNTVfQTEsCisgICAgIEhQRl9Gczk2MDAwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnM5NjAwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzOTYwMDBfRmM1NV9CMX0sCisgICAge0hQRl9GczE3NjQwMF9GYzU1X0EyLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxNzY0MDBfRmM1NV9BMSwKKyAgICAgSFBGX0ZzMTc2NDAwX0ZjNTVfQTAsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM1NV9CMiwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzU1X0IxfSwKKyAgICB7SFBGX0ZzMTkyMDAwX0ZjNTVfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE5MjAwMF9GYzU1X0ExLAorICAgICBIUEZfRnMxOTIwMDBfRmM1NV9BMCwKKyAgICAgLUhQRl9GczE5MjAwMF9GYzU1X0IyLAorICAgICAtSFBGX0ZzMTkyMDAwX0ZjNTVfQjF9LAorCisgICAgLyogQ29lZmZpY2llbnRzIGZvciA2Nkh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICB7SFBGX0ZzODAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzODAwMF9GYzY2X0ExLAorICAgICBIUEZfRnM4MDAwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnM4MDAwX0ZjNjZfQjIsCisgICAgIC1IUEZfRnM4MDAwX0ZjNjZfQjF9LAorICAgIHtIUEZfRnMxMTAyNV9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczExMDI1X0ZjNjZfQTEsCisgICAgIEhQRl9GczExMDI1X0ZjNjZfQTAsCisgICAgIC1IUEZfRnMxMTAyNV9GYzY2X0IyLAorICAgICAtSFBGX0ZzMTEwMjVfRmM2Nl9CMX0sCisgICAge0hQRl9GczEyMDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTIwMDBfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzMTIwMDBfRmM2Nl9BMCwKKyAgICAgLUhQRl9GczEyMDAwX0ZjNjZfQjIsCisgICAgIC1IUEZfRnMxMjAwMF9GYzY2X0IxfSwKKyAgICB7SFBGX0ZzMTYwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxNjAwMF9GYzY2X0ExLAorICAgICBIUEZfRnMxNjAwMF9GYzY2X0EwLAorICAgICAtSFBGX0ZzMTYwMDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9GczE2MDAwX0ZjNjZfQjF9LAorICAgIHtIUEZfRnMyMjA1MF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczIyMDUwX0ZjNjZfQTEsCisgICAgIEhQRl9GczIyMDUwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnMyMjA1MF9GYzY2X0IyLAorICAgICAtSFBGX0ZzMjIwNTBfRmM2Nl9CMX0sCisgICAge0hQRl9GczI0MDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMjQwMDBfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzMjQwMDBfRmM2Nl9BMCwKKyAgICAgLUhQRl9GczI0MDAwX0ZjNjZfQjIsCisgICAgIC1IUEZfRnMyNDAwMF9GYzY2X0IxfSwKKyAgICB7SFBGX0ZzMzIwMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMzMjAwMF9GYzY2X0ExLAorICAgICBIUEZfRnMzMjAwMF9GYzY2X0EwLAorICAgICAtSFBGX0ZzMzIwMDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9GczMyMDAwX0ZjNjZfQjF9LAorICAgIHtIUEZfRnM0NDEwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczQ0MTAwX0ZjNjZfQTEsCisgICAgIEhQRl9GczQ0MTAwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnM0NDEwMF9GYzY2X0IyLAorICAgICAtSFBGX0ZzNDQxMDBfRmM2Nl9CMX0sCisgICAge0hQRl9GczQ4MDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzNDgwMDBfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzNDgwMDBfRmM2Nl9BMCwKKyAgICAgLUhQRl9GczQ4MDAwX0ZjNjZfQjIsCisgICAgIC1IUEZfRnM0ODAwMF9GYzY2X0IxfSwKKyAgICB7SFBGX0ZzODgyMDBfRmM2Nl9BMiwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM4ODIwMF9GYzY2X0ExLAorICAgICBIUEZfRnM4ODIwMF9GYzY2X0EwLAorICAgICAtSFBGX0ZzODgyMDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjNjZfQjF9LAorICAgIHtIUEZfRnM5NjAwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczk2MDAwX0ZjNjZfQTEsCisgICAgIEhQRl9Gczk2MDAwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnM5NjAwMF9GYzY2X0IyLAorICAgICAtSFBGX0ZzOTYwMDBfRmM2Nl9CMX0sCisgICAge0hQRl9GczE3NjQwMF9GYzY2X0EyLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxNzY0MDBfRmM2Nl9BMSwKKyAgICAgSFBGX0ZzMTc2NDAwX0ZjNjZfQTAsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM2Nl9CMiwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzY2X0IxfSwKKyAgICB7SFBGX0ZzMTkyMDAwX0ZjNjZfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE5MjAwMF9GYzY2X0ExLAorICAgICBIUEZfRnMxOTIwMDBfRmM2Nl9BMCwKKyAgICAgLUhQRl9GczE5MjAwMF9GYzY2X0IyLAorICAgICAtSFBGX0ZzMTkyMDAwX0ZjNjZfQjF9LAorCisgICAgLyogQ29lZmZpY2llbnRzIGZvciA3OEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICB7SFBGX0ZzODAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzODAwMF9GYzc4X0ExLAorICAgICBIUEZfRnM4MDAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnM4MDAwX0ZjNzhfQjIsCisgICAgIC1IUEZfRnM4MDAwX0ZjNzhfQjF9LAorICAgIHtIUEZfRnMxMTAyNV9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczExMDI1X0ZjNzhfQTEsCisgICAgIEhQRl9GczExMDI1X0ZjNzhfQTAsCisgICAgIC1IUEZfRnMxMTAyNV9GYzc4X0IyLAorICAgICAtSFBGX0ZzMTEwMjVfRmM3OF9CMX0sCisgICAge0hQRl9GczEyMDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTIwMDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzMTIwMDBfRmM3OF9BMCwKKyAgICAgLUhQRl9GczEyMDAwX0ZjNzhfQjIsCisgICAgIC1IUEZfRnMxMjAwMF9GYzc4X0IxfSwKKyAgICB7SFBGX0ZzMTYwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxNjAwMF9GYzc4X0ExLAorICAgICBIUEZfRnMxNjAwMF9GYzc4X0EwLAorICAgICAtSFBGX0ZzMTYwMDBfRmM3OF9CMiwKKyAgICAgLUhQRl9GczE2MDAwX0ZjNzhfQjF9LAorICAgIHtIUEZfRnMyMjA1MF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczIyMDUwX0ZjNzhfQTEsCisgICAgIEhQRl9GczIyMDUwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnMyMjA1MF9GYzc4X0IyLAorICAgICAtSFBGX0ZzMjIwNTBfRmM3OF9CMX0sCisgICAge0hQRl9GczI0MDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMjQwMDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzMjQwMDBfRmM3OF9BMCwKKyAgICAgLUhQRl9GczI0MDAwX0ZjNzhfQjIsCisgICAgIC1IUEZfRnMyNDAwMF9GYzc4X0IxfSwKKyAgICB7SFBGX0ZzMzIwMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMzMjAwMF9GYzc4X0ExLAorICAgICBIUEZfRnMzMjAwMF9GYzc4X0EwLAorICAgICAtSFBGX0ZzMzIwMDBfRmM3OF9CMiwKKyAgICAgLUhQRl9GczMyMDAwX0ZjNzhfQjF9LAorICAgIHtIUEZfRnM0NDEwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczQ0MTAwX0ZjNzhfQTEsCisgICAgIEhQRl9GczQ0MTAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnM0NDEwMF9GYzc4X0IyLAorICAgICAtSFBGX0ZzNDQxMDBfRmM3OF9CMX0sCisgICAge0hQRl9GczQ4MDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzNDgwMDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzNDgwMDBfRmM3OF9BMCwKKyAgICAgLUhQRl9GczQ4MDAwX0ZjNzhfQjIsCisgICAgIC1IUEZfRnM0ODAwMF9GYzc4X0IxfSwKKyAgICB7SFBGX0ZzODgyMDBfRmM3OF9BMiwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnM4ODIwMF9GYzc4X0ExLAorICAgICBIUEZfRnM4ODIwMF9GYzc4X0EwLAorICAgICAtSFBGX0ZzODgyMDBfRmM3OF9CMiwKKyAgICAgLUhQRl9Gczg4MjAwX0ZjNzhfQjF9LAorICAgIHtIUEZfRnM5NjAwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczk2MDAwX0ZjNzhfQTEsCisgICAgIEhQRl9Gczk2MDAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnM5NjAwMF9GYzc4X0IyLAorICAgICAtSFBGX0ZzOTYwMDBfRmM3OF9CMX0sCisgICAge0hQRl9GczE3NjQwMF9GYzc4X0EyLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxNzY0MDBfRmM3OF9BMSwKKyAgICAgSFBGX0ZzMTc2NDAwX0ZjNzhfQTAsCisgICAgIC1IUEZfRnMxNzY0MDBfRmM3OF9CMiwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzc4X0IxfSwKKyAgICB7SFBGX0ZzMTkyMDAwX0ZjNzhfQTIsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE5MjAwMF9GYzc4X0ExLAorICAgICBIUEZfRnMxOTIwMDBfRmM3OF9BMCwKKyAgICAgLUhQRl9GczE5MjAwMF9GYzc4X0IyLAorICAgICAtSFBGX0ZzMTkyMDAwX0ZjNzhfQjF9LAorCisgICAgLyogQ29lZmZpY2llbnRzIGZvciA5MEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICB7SFBGX0ZzODAwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzODAwMF9GYzkwX0ExLAorICAgICBIUEZfRnM4MDAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnM4MDAwX0ZjOTBfQjIsCisgICAgIC1IUEZfRnM4MDAwX0ZjOTBfQjF9LAorICAgIHtIUEZfRnMxMTAyNV9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczExMDI1X0ZjOTBfQTEsCisgICAgIEhQRl9GczExMDI1X0ZjOTBfQTAsCisgICAgIC1IUEZfRnMxMTAyNV9GYzkwX0IyLAorICAgICAtSFBGX0ZzMTEwMjVfRmM5MF9CMX0sCisgICAge0hQRl9GczEyMDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTIwMDBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzMTIwMDBfRmM5MF9BMCwKKyAgICAgLUhQRl9GczEyMDAwX0ZjOTBfQjIsCisgICAgIC1IUEZfRnMxMjAwMF9GYzkwX0IxfSwKKyAgICB7SFBGX0ZzMTYwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMxNjAwMF9GYzkwX0ExLAorICAgICBIUEZfRnMxNjAwMF9GYzkwX0EwLAorICAgICAtSFBGX0ZzMTYwMDBfRmM5MF9CMiwKKyAgICAgLUhQRl9GczE2MDAwX0ZjOTBfQjF9LAorICAgIHtIUEZfRnMyMjA1MF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczIyMDUwX0ZjOTBfQTEsCisgICAgIEhQRl9GczIyMDUwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnMyMjA1MF9GYzkwX0IyLAorICAgICAtSFBGX0ZzMjIwNTBfRmM5MF9CMX0sCisgICAge0hQRl9GczI0MDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMjQwMDBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzMjQwMDBfRmM5MF9BMCwKKyAgICAgLUhQRl9GczI0MDAwX0ZjOTBfQjIsCisgICAgIC1IUEZfRnMyNDAwMF9GYzkwX0IxfSwKKyAgICB7SFBGX0ZzMzIwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBIUEZfRnMzMjAwMF9GYzkwX0ExLAorICAgICBIUEZfRnMzMjAwMF9GYzkwX0EwLAorICAgICAtSFBGX0ZzMzIwMDBfRmM5MF9CMiwKKyAgICAgLUhQRl9GczMyMDAwX0ZjOTBfQjF9LAorICAgIHtIUEZfRnM0NDEwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczQ0MTAwX0ZjOTBfQTEsCisgICAgIEhQRl9GczQ0MTAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnM0NDEwMF9GYzkwX0IyLAorICAgICAtSFBGX0ZzNDQxMDBfRmM5MF9CMX0sCisgICAge0hQRl9GczQ4MDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzNDgwMDBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzNDgwMDBfRmM5MF9BMCwKKyAgICAgLUhQRl9GczQ4MDAwX0ZjOTBfQjIsCisgICAgIC1IUEZfRnM0ODAwMF9GYzkwX0IxfQorCisgICAgLAorICAgIHtIUEZfRnM4ODIwMF9GYzkwX0EyLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9Gczg4MjAwX0ZjOTBfQTEsCisgICAgIEhQRl9Gczg4MjAwX0ZjOTBfQTAsCisgICAgIC1IUEZfRnM4ODIwMF9GYzkwX0IyLAorICAgICAtSFBGX0ZzODgyMDBfRmM5MF9CMX0sCisgICAge0hQRl9Gczk2MDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzOTYwMDBfRmM5MF9BMSwKKyAgICAgSFBGX0ZzOTYwMDBfRmM5MF9BMCwKKyAgICAgLUhQRl9Gczk2MDAwX0ZjOTBfQjIsCisgICAgIC1IUEZfRnM5NjAwMF9GYzkwX0IxfSwKKyAgICB7SFBGX0ZzMTc2NDAwX0ZjOTBfQTIsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIEhQRl9GczE3NjQwMF9GYzkwX0ExLAorICAgICBIUEZfRnMxNzY0MDBfRmM5MF9BMCwKKyAgICAgLUhQRl9GczE3NjQwMF9GYzkwX0IyLAorICAgICAtSFBGX0ZzMTc2NDAwX0ZjOTBfQjF9LAorICAgIHtIUEZfRnMxOTIwMDBfRmM5MF9BMiwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgSFBGX0ZzMTkyMDAwX0ZjOTBfQTEsCisgICAgIEhQRl9GczE5MjAwMF9GYzkwX0EwLAorICAgICAtSFBGX0ZzMTkyMDAwX0ZjOTBfQjIsCisgICAgIC1IUEZfRnMxOTIwMDBfRmM5MF9CMX0KKworfTsKKworLyoKKyAqIEJhbmQgUGFzcyBGaWx0ZXIgY29lZmZpY2llbnQgdGFibGUKKyAqLworY29uc3QgQlBfRkxPQVRfQ29lZnNfdCBMVkRCRV9CUEZfVGFibGVbXSA9IHsKKyAgICAvKiBDb2VmZmljaWVudHMgZm9yIDU1SHogY2VudHJlIGZyZXF1ZW5jeSAqLworICAgIHtCUEZfRnM4MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzODAwMF9GYzU1X0IyLAorICAgICAtQlBGX0ZzODAwMF9GYzU1X0IxfSwKKyAgICB7QlBGX0ZzMTEwMjVfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTEwMjVfRmM1NV9CMiwKKyAgICAgLUJQRl9GczExMDI1X0ZjNTVfQjF9LAorICAgIHtCUEZfRnMxMjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxMjAwMF9GYzU1X0IyLAorICAgICAtQlBGX0ZzMTIwMDBfRmM1NV9CMX0sCisgICAge0JQRl9GczE2MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE2MDAwX0ZjNTVfQjIsCisgICAgIC1CUEZfRnMxNjAwMF9GYzU1X0IxfSwKKyAgICB7QlBGX0ZzMjIwNTBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMjIwNTBfRmM1NV9CMiwKKyAgICAgLUJQRl9GczIyMDUwX0ZjNTVfQjF9LAorICAgIHtCUEZfRnMyNDAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMyNDAwMF9GYzU1X0IyLAorICAgICAtQlBGX0ZzMjQwMDBfRmM1NV9CMX0sCisgICAge0JQRl9GczMyMDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczMyMDAwX0ZjNTVfQjIsCisgICAgIC1CUEZfRnMzMjAwMF9GYzU1X0IxfSwKKyAgICB7QlBGX0ZzNDQxMDBfRmM1NV9BMCwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzNDQxMDBfRmM1NV9CMiwKKyAgICAgLUJQRl9GczQ0MTAwX0ZjNTVfQjF9LAorICAgIHtCUEZfRnM0ODAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM0ODAwMF9GYzU1X0IyLAorICAgICAtQlBGX0ZzNDgwMDBfRmM1NV9CMX0sCisgICAgIHtCUEZfRnM4ODIwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgICAtQlBGX0ZzODgyMDBfRmM1NV9CMiwKKyAgICAgIC1CUEZfRnM4ODIwMF9GYzU1X0IxfSwKKyAgICAge0JQRl9Gczk2MDAwX0ZjNTVfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczk2MDAwX0ZjNTVfQjIsCisgICAgIC1CUEZfRnM5NjAwMF9GYzU1X0IxfSwKKyAgICAge0JQRl9GczE3NjQwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAgLUJQRl9GczE3NjQwMF9GYzU1X0IyLAorICAgICAgLUJQRl9GczE3NjQwMF9GYzU1X0IxfSwKKyAgICAge0JQRl9GczE5MjAwMF9GYzU1X0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTkyMDAwX0ZjNTVfQjIsCisgICAgIC1CUEZfRnMxOTIwMDBfRmM1NV9CMX0sCisKKyAgICAvKiBDb2VmZmljaWVudHMgZm9yIDY2SHogY2VudHJlIGZyZXF1ZW5jeSAqLworICAgIHtCUEZfRnM4MDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzODAwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzODAwMF9GYzY2X0IxfSwKKyAgICB7QlBGX0ZzMTEwMjVfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTEwMjVfRmM2Nl9CMiwKKyAgICAgLUJQRl9GczExMDI1X0ZjNjZfQjF9LAorICAgIHtCUEZfRnMxMjAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxMjAwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzMTIwMDBfRmM2Nl9CMX0sCisgICAge0JQRl9GczE2MDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE2MDAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnMxNjAwMF9GYzY2X0IxfSwKKyAgICB7QlBGX0ZzMjIwNTBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMjIwNTBfRmM2Nl9CMiwKKyAgICAgLUJQRl9GczIyMDUwX0ZjNjZfQjF9LAorICAgIHtCUEZfRnMyNDAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMyNDAwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzMjQwMDBfRmM2Nl9CMX0sCisgICAge0JQRl9GczMyMDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczMyMDAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnMzMjAwMF9GYzY2X0IxfSwKKyAgICB7QlBGX0ZzNDQxMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzNDQxMDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9GczQ0MTAwX0ZjNjZfQjF9LAorICAgIHtCUEZfRnM0ODAwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM0ODAwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzNDgwMDBfRmM2Nl9CMX0sCisgICAge0JQRl9Gczg4MjAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczg4MjAwX0ZjNjZfQjIsCisgICAgIC1CUEZfRnM4ODIwMF9GYzY2X0IxfSwKKyAgICB7QlBGX0ZzOTYwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzOTYwMDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9Gczk2MDAwX0ZjNjZfQjF9LAorICAgIHtCUEZfRnMxNzY0MDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTc2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE3NjQwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzMTc2NDAwX0ZjNjZfQjF9LAorICAgIHtCUEZfRnMxOTIwMDBfRmM2Nl9BMCwgICAgICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczE5MjAwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzMTkyMDAwX0ZjNjZfQjF9LAorCisgICAgLyogQ29lZmZpY2llbnRzIGZvciA3OEh6IGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICB7QlBGX0ZzODAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczgwMDBfRmM3OF9CMiwKKyAgICAgLUJQRl9GczgwMDBfRmM3OF9CMX0sCisgICAge0JQRl9GczExMDI1X0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczExMDI1X0ZjNzhfQjIsCisgICAgIC1CUEZfRnMxMTAyNV9GYzc4X0IxfSwKKyAgICB7QlBGX0ZzMTIwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTIwMDBfRmM3OF9CMiwKKyAgICAgLUJQRl9GczEyMDAwX0ZjNzhfQjF9LAorICAgIHtCUEZfRnMxNjAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxNjAwMF9GYzc4X0IyLAorICAgICAtQlBGX0ZzMTYwMDBfRmM3OF9CMX0sCisgICAge0JQRl9GczIyMDUwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczIyMDUwX0ZjNzhfQjIsCisgICAgIC1CUEZfRnMyMjA1MF9GYzc4X0IxfSwKKyAgICB7QlBGX0ZzMjQwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMjQwMDBfRmM3OF9CMiwKKyAgICAgLUJQRl9GczI0MDAwX0ZjNzhfQjF9LAorICAgIHtCUEZfRnMzMjAwMF9GYzc4X0EwLCAgICAgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMzMjAwMF9GYzc4X0IyLAorICAgICAtQlBGX0ZzMzIwMDBfRmM3OF9CMX0sCisgICAge0JQRl9GczQ0MTAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczQ0MTAwX0ZjNzhfQjIsCisgICAgIC1CUEZfRnM0NDEwMF9GYzc4X0IxfSwKKyAgICB7QlBGX0ZzNDgwMDBfRmM3OF9BMCwgICAgICAgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzNDgwMDBfRmM3OF9CMiwKKyAgICAgLUJQRl9GczQ4MDAwX0ZjNzhfQjF9LAorICAgIHtCUEZfRnM4ODIwMF9GYzY2X0EwLCAgICAgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM4ODIwMF9GYzY2X0IyLAorICAgICAtQlBGX0ZzODgyMDBfRmM2Nl9CMX0sCisgICAge0JQRl9Gczk2MDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9Gczk2MDAwX0ZjNzhfQjIsCisgICAgIC1CUEZfRnM5NjAwMF9GYzc4X0IxfSwKKyAgICB7QlBGX0ZzMTc2NDAwX0ZjNjZfQTAsICAgICAgICAgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxNzY0MDBfRmM2Nl9CMiwKKyAgICAgLUJQRl9GczE3NjQwMF9GYzY2X0IxfSwKKyAgICB7QlBGX0ZzMTkyMDAwX0ZjNzhfQTAsICAgICAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxOTIwMDBfRmM3OF9CMiwKKyAgICAgLUJQRl9GczE5MjAwMF9GYzc4X0IxfSwKKworICAgIC8qIENvZWZmaWNpZW50cyBmb3IgOTBIeiBjZW50cmUgZnJlcXVlbmN5ICovCisgICAge0JQRl9GczgwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM4MDAwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnM4MDAwX0ZjOTBfQjF9LAorICAgIHtCUEZfRnMxMTAyNV9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMxMTAyNV9GYzkwX0IyLAorICAgICAtQlBGX0ZzMTEwMjVfRmM5MF9CMX0sCisgICAge0JQRl9GczEyMDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczEyMDAwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnMxMjAwMF9GYzkwX0IxfSwKKyAgICB7QlBGX0ZzMTYwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTYwMDBfRmM5MF9CMiwKKyAgICAgLUJQRl9GczE2MDAwX0ZjOTBfQjF9LAorICAgIHtCUEZfRnMyMjA1MF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnMyMjA1MF9GYzkwX0IyLAorICAgICAtQlBGX0ZzMjIwNTBfRmM5MF9CMX0sCisgICAge0JQRl9GczI0MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczI0MDAwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnMyNDAwMF9GYzkwX0IxfSwKKyAgICB7QlBGX0ZzMzIwMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMzIwMDBfRmM5MF9CMiwKKyAgICAgLUJQRl9GczMyMDAwX0ZjOTBfQjF9LAorICAgIHtCUEZfRnM0NDEwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM0NDEwMF9GYzkwX0IyLAorICAgICAtQlBGX0ZzNDQxMDBfRmM5MF9CMX0sCisgICAge0JQRl9GczQ4MDAwX0ZjOTBfQTAsICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgLUJQRl9GczQ4MDAwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnM0ODAwMF9GYzkwX0IxfQorICAgICwKKyAgICB7QlBGX0ZzODgyMDBfRmM5MF9BMCwgICAgICAgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzODgyMDBfRmM5MF9CMiwKKyAgICAgLUJQRl9Gczg4MjAwX0ZjOTBfQjF9LAorICAgIHtCUEZfRnM5NjAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIC1CUEZfRnM5NjAwMF9GYzkwX0IyLAorICAgICAtQlBGX0ZzOTYwMDBfRmM5MF9CMX0sCisgICAge0JQRl9GczE3NjQwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTc2NDAwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnMxNzY0MDBfRmM5MF9CMX0sCisgICAge0JQRl9GczE5MjAwMF9GYzkwX0EwLCAgICAgICAgICAgICAgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICAtQlBGX0ZzMTkyMDAwX0ZjOTBfQjIsCisgICAgIC1CUEZfRnMxOTIwMDBfRmM5MF9CMX0KKworfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBR0MgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIEF0dGFjayB0aW1lIChzaWduYWwgdG9vIGxhcmdlKSAqLworY29uc3QgTFZNX0ZMT0FUIExWREJFX0FHQ19BVFRBQ0tfVGFibGVbXSA9IHsKKyAgICBBR0NfQVRUQUNLX0ZzODAwMCwKKyAgICBBR0NfQVRUQUNLX0ZzMTEwMjUsCisgICAgQUdDX0FUVEFDS19GczEyMDAwLAorICAgIEFHQ19BVFRBQ0tfRnMxNjAwMCwKKyAgICBBR0NfQVRUQUNLX0ZzMjIwNTAsCisgICAgQUdDX0FUVEFDS19GczI0MDAwLAorICAgIEFHQ19BVFRBQ0tfRnMzMjAwMCwKKyAgICBBR0NfQVRUQUNLX0ZzNDQxMDAsCisgICAgQUdDX0FUVEFDS19GczQ4MDAwCisgICAgLEFHQ19BVFRBQ0tfRnM4ODIwMAorICAgICxBR0NfQVRUQUNLX0ZzOTYwMDAKKyAgICAsQUdDX0FUVEFDS19GczE3NjQwMAorICAgICxBR0NfQVRUQUNLX0ZzMTkyMDAwCisKK307CisKKy8qIERlY2F5IHRpbWUgKHNpZ25hbCB0b28gc21hbGwpICovCitjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0RFQ0FZX1RhYmxlW10gPSB7CisgICAgQUdDX0RFQ0FZX0ZzODAwMCwKKyAgICBBR0NfREVDQVlfRnMxMTAyNSwKKyAgICBBR0NfREVDQVlfRnMxMjAwMCwKKyAgICBBR0NfREVDQVlfRnMxNjAwMCwKKyAgICBBR0NfREVDQVlfRnMyMjA1MCwKKyAgICBBR0NfREVDQVlfRnMyNDAwMCwKKyAgICBBR0NfREVDQVlfRnMzMjAwMCwKKyAgICBBR0NfREVDQVlfRnM0NDEwMCwKKyAgICBBR0NfREVDQVlfRnM0ODAwMAorICAgICxBR0NfREVDQVlfRnM4ODIwMAorICAgICxBR0NfREVDQVlfRlM5NjAwMAorICAgICxBR0NfREVDQVlfRnMxNzY0MDAKKyAgICAsQUdDX0RFQ0FZX0ZTMTkyMDAwCisKK307CisKKy8qIEdhaW4gZm9yIHVzZSB3aXRob3V0IHRoZSBoaWdoIHBhc3MgZmlsdGVyICovCitjb25zdCBMVk1fRkxPQVQgTFZEQkVfQUdDX0dBSU5fVGFibGVbXSA9IHsKKyAgICBBR0NfR0FJTl8wZEIsCisgICAgQUdDX0dBSU5fMWRCLAorICAgIEFHQ19HQUlOXzJkQiwKKyAgICBBR0NfR0FJTl8zZEIsCisgICAgQUdDX0dBSU5fNGRCLAorICAgIEFHQ19HQUlOXzVkQiwKKyAgICBBR0NfR0FJTl82ZEIsCisgICAgQUdDX0dBSU5fN2RCLAorICAgIEFHQ19HQUlOXzhkQiwKKyAgICBBR0NfR0FJTl85ZEIsCisgICAgQUdDX0dBSU5fMTBkQiwKKyAgICBBR0NfR0FJTl8xMWRCLAorICAgIEFHQ19HQUlOXzEyZEIsCisgICAgQUdDX0dBSU5fMTNkQiwKKyAgICBBR0NfR0FJTl8xNGRCLAorICAgIEFHQ19HQUlOXzE1ZEJ9OworCisvKiBHYWluIGZvciB1c2Ugd2l0aCB0aGUgaGlnaCBwYXNzIGZpbHRlciAqLworY29uc3QgTFZNX0ZMT0FUIExWREJFX0FHQ19IUEZHQUlOX1RhYmxlW10gPSB7CisgICAgQUdDX0hQRkdBSU5fMGRCLAorICAgIEFHQ19IUEZHQUlOXzFkQiwKKyAgICBBR0NfSFBGR0FJTl8yZEIsCisgICAgQUdDX0hQRkdBSU5fM2RCLAorICAgIEFHQ19IUEZHQUlOXzRkQiwKKyAgICBBR0NfSFBGR0FJTl81ZEIsCisgICAgQUdDX0hQRkdBSU5fNmRCLAorICAgIEFHQ19IUEZHQUlOXzdkQiwKKyAgICBBR0NfSFBGR0FJTl84ZEIsCisgICAgQUdDX0hQRkdBSU5fOWRCLAorICAgIEFHQ19IUEZHQUlOXzEwZEIsCisgICAgQUdDX0hQRkdBSU5fMTFkQiwKKyAgICBBR0NfSFBGR0FJTl8xMmRCLAorICAgIEFHQ19IUEZHQUlOXzEzZEIsCisgICAgQUdDX0hQRkdBSU5fMTRkQiwKKyAgICBBR0NfSFBGR0FJTl8xNWRCfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBWb2x1bWUgY29udHJvbCBnYWluIGFuZCB0aW1lIGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGRCIHRvIGxpbmVhciBjb252ZXJzaW9uIHRhYmxlICovCitjb25zdCBMVk1fRkxPQVQgTFZEQkVfVm9sdW1lVGFibGVbXSA9IHsKKyAgICAwLjUwMDAwMGYsICAgICAgICAgLyogLTZkQiAqLworICAgIDAuNTYyMzQxZiwgICAgICAgICAvKiAtNWRCICovCisgICAgMC42MzA5NTdmLCAgICAgICAgIC8qIC00ZEIgKi8KKyAgICAwLjcwNzk0NmYsICAgICAgICAgLyogLTNkQiAqLworICAgIDAuNzk0MzI4ZiwgICAgICAgICAvKiAtMmRCICovCisgICAgMC44OTEyNTFmLCAgICAgICAgIC8qIC0xZEIgKi8KKyAgICAxLjAwMDAwMGZ9OyAgICAgICAgLyogIDBkQiAqLworCitjb25zdCBMVk1fRkxPQVQgTFZEQkVfVm9sdW1lVENUYWJsZVtdID0geworICAgIFZPTF9UQ19GczgwMDAsCisgICAgVk9MX1RDX0ZzMTEwMjUsCisgICAgVk9MX1RDX0ZzMTIwMDAsCisgICAgVk9MX1RDX0ZzMTYwMDAsCisgICAgVk9MX1RDX0ZzMjIwNTAsCisgICAgVk9MX1RDX0ZzMjQwMDAsCisgICAgVk9MX1RDX0ZzMzIwMDAsCisgICAgVk9MX1RDX0ZzNDQxMDAsCisgICAgVk9MX1RDX0ZzNDgwMDAKKyAgICAsVk9MX1RDX0ZzODgyMDAKKyAgICAsVk9MX1RDX0ZzOTYwMDAKKyAgICAsVk9MX1RDX0ZzMTc2NDAwCisgICAgLFZPTF9UQ19GczE5MjAwMAorfTsKKworY29uc3QgTFZNX0lOVDE2IExWREJFX01peGVyVENUYWJsZVtdID0geworCisgICAgTUlYX1RDX0ZzODAwMCwKKyAgICBNSVhfVENfRnMxMTAyNSwKKyAgICBNSVhfVENfRnMxMjAwMCwKKyAgICBNSVhfVENfRnMxNjAwMCwKKyAgICBNSVhfVENfRnMyMjA1MCwKKyAgICBNSVhfVENfRnMyNDAwMCwKKyAgICBNSVhfVENfRnMzMjAwMCwKKyAgICBNSVhfVENfRnM0NDEwMCwKKyAgICBNSVhfVENfRnM0ODAwMAorICAgICxNSVhfVENfRnM4ODIwMAorICAgICxNSVhfVENfRnM5NjAwMAorICAgICxNSVhfVENfRnMxNzY0MDAKKyAgICAsTUlYX1RDX0ZzMTkyMDAwCisKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMvTFZEQkVfVGFibGVzLmgKaW5kZXggY2E0NmUzNy4uNmVhYmRkMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0Jhc3Mvc3JjL0xWREJFX1RhYmxlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CYXNzL3NyYy9MVkRCRV9UYWJsZXMuaApAQCAtMTUsNyArMTUsNiBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yNCw2MSArMjMsOSBAQAogI2lmbmRlZiBfX0xWQkRFX1RBQkxFU19IX18KICNkZWZpbmUgX19MVkJERV9UQUJMRVNfSF9fCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQogI2luY2x1ZGUgIkJJUVVBRC5oIgogI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgogCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIENvZWZmaWNpZW50cyBjb25zdGFudCB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIEhpZ2ggUGFzcyBGaWx0ZXIgQ29lZmZpY2llbnQgdGFibGUKLSAqLwotZXh0ZXJuIGNvbnN0IEJRX0MzMl9Db2Vmc190IExWREJFX0hQRl9UYWJsZVtdOwotCi0vKgotICogQmFuZCBQYXNzIEZpbHRlciBjb2VmZmljaWVudCB0YWJsZQotICovCi1leHRlcm4gY29uc3QgQlBfQzMyX0NvZWZzX3QgTFZEQkVfQlBGX1RhYmxlW107Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQUdDIGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBBdHRhY2sgdGltZSAoc2lnbmFsIHRvbyBsYXJnZSkgKi8KLWV4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZEQkVfQUdDX0FUVEFDS19UYWJsZVtdOwotCi0vKiBEZWNheSB0aW1lIChzaWduYWwgdG9vIHNtYWxsKSAqLwotZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVkRCRV9BR0NfREVDQVlfVGFibGVbXTsKLQotLyogR2FpbiBmb3IgdXNlIHdpdGhvdXQgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgKi8KLWV4dGVybiBjb25zdCBMVk1fSU5UMzIgTFZEQkVfQUdDX0dBSU5fVGFibGVbXTsKLQotLyogR2FpbiBmb3IgdXNlIHdpdGggdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgKi8KLWV4dGVybiBjb25zdCBMVk1fSU5UMzIgTFZEQkVfQUdDX0hQRkdBSU5fVGFibGVbXTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBWb2x1bWUgY29udHJvbCBnYWluIGFuZCB0aW1lIGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIGRCIHRvIGxpbmVhciBjb252ZXJzaW9uIHRhYmxlICovCi1leHRlcm4gY29uc3QgTFZNX0lOVDE2IExWREJFX1ZvbHVtZVRhYmxlW107Ci0KLWV4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZEQkVfVm9sdW1lVENUYWJsZVtdOwotCi0jZWxzZSAvKkJVSUxEX0ZMT0FUKi8KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBDb2VmZmljaWVudHMgY29uc3RhbnQgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTIzLDEzICs3MCw2IEBACiBleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWREJFX1ZvbHVtZVRhYmxlW107CiBleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWREJFX1ZvbHVtZVRDVGFibGVbXTsKIAotI2VuZGlmIC8qQlVJTERfRkxPQVQqLwotCiBleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWREJFX01peGVyVENUYWJsZVtdOwogCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KICNlbmRpZiAvKiBfX0xWQkRFX1RBQkxFU19IX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvbGliL0xWTS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmgKaW5kZXggOWI2ZGEzMS4uZTRlODQ1MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9saWIvTFZNLmgKQEAgLTUzLDExICs1Myw2IEBACiAjaWZuZGVmIF9fTFZNX0hfXwogI2RlZmluZSBfX0xWTV9IX18KIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTY2LDcgKzYxLDYgQEAKIAogI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEwOCw3ICsxMDIsNiBAQAogLyogSW5zdGFuY2UgaGFuZGxlICovCiB0eXBlZGVmIHZvaWQgKkxWTV9IYW5kbGVfdDsKIAotCiAvKiBTdGF0dXMgcmV0dXJuIHZhbHVlcyAqLwogdHlwZWRlZiBlbnVtCiB7CkBAIC0xMjMsNyArMTE2LDYgQEAKICAgICBMVk1fUkVUVVJOU1RBVFVTX0RVTU1ZID0gTFZNX01BWEVOVU0KIH0gTFZNX1JldHVyblN0YXR1c19lbjsKIAotCiAvKiBCdWZmZXIgTWFuYWdlbWVudCBtb2RlICovCiB0eXBlZGVmIGVudW0KIHsKQEAgLTIyNyw3ICsyMTksNiBAQAogICAgIExWTV9DSEFSICAgICAgICAgICAgICAgICAgICAqcFBsYXRmb3JtOyAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBsaWJyYXJ5IHBsYXRmb3JtIHR5cGUgKi8KIH0gTFZNX1ZlcnNpb25JbmZvX3N0OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgU3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTI0OCw3ICsyMzksNiBAQAogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBRRmFjdG9yOyAgICAgICAgICAgICAgICAvKiBCYW5kIHF1YWxpdHkgZmFjdG9yICh4MTAwKSAqLwogfSBMVk1fRVFOQl9CYW5kRGVmX3Q7CiAKLQogLyogSGVhZHJvb20gYmFuZCBkZWZpbml0aW9uICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtMjU3LDcgKzI0Nyw2IEBACiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIEhlYWRyb29tX09mZnNldDsgICAgICAgIC8qIEhlYWRyb29tID0gYmlnZ2VzdCBiYW5kIGdhaW4gLSBIZWFkcm9vbV9PZmZzZXQgKi8KIH0gTFZNX0hlYWRyb29tQmFuZERlZl90OwogCi0KIC8qIENvbnRyb2wgUGFyYW1ldGVyIHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKQEAgLTI5NiwxMCArMjg1LDEzIEBACiAgICAgLyogU3BlY3RydW0gQW5hbHl6ZXIgcGFyYW1ldGVycyBDb250cm9sICovCiAgICAgTFZNX1BTQV9Nb2RlX2VuICAgICAgICAgICAgIFBTQV9FbmFibGU7CiAgICAgTFZNX1BTQV9EZWNheVNwZWVkX2VuICAgICAgIFBTQV9QZWFrRGVjYXlSYXRlOyAgICAgIC8qIFBlYWsgdmFsdWUgZGVjYXkgcmF0ZSovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzOworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICBDaE1hc2s7CisjZW5kaWYKIAogfSBMVk1fQ29udHJvbFBhcmFtc190OwogCi0KIC8qIEluc3RhbmNlIFBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7CkBAIC0zMjksNyArMzIxLDYgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0VmVyc2lvbkluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzUwLDcgKzM0MSw2IEBACiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIExWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldFZlcnNpb25JbmZvKExWTV9WZXJzaW9uSW5mb19zdCAgKnBWZXJzaW9uKTsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9HZXRNZW1vcnlUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zODcsNyArMzc3LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NZW1UYWJfdCAgICAgICAgICpwTWVtb3J5VGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSW5zdFBhcmFtc190ICAgICAqcEluc3RQYXJhbXMpOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0dldEluc3RhbmNlSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQxNCw3ICs0MDMsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01lbVRhYl90ICAgICAgICAqcE1lbW9yeVRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0luc3RQYXJhbXNfdCAgICAqcEluc3RQYXJhbXMpOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0NsZWFyQXVkaW9CdWZmZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQzNSw3ICs0MjMsNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9DbGVhckF1ZGlvQnVmZmVycyhMVk1fSGFuZGxlX3QgIGhJbnN0YW5jZSk7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDU5LDcgKzQ0Niw2IEBACiBMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhMVk1fSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQ4Myw3ICs0NjksNiBAQAogTFZNX1JldHVyblN0YXR1c19lbiBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMoTFZNX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKTsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC01MTQsMjAgKzQ5OSwxMSBAQAogLyogICAgICBTVEVSRU8gICAgICAgICAgICAgIHRoZSBudW1iZXIgb2Ygc2FtcGxlIHBhaXJzIGluIHRoZSBibG9jayAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCiBMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9Qcm9jZXNzKExWTV9IYW5kbGVfdCAgICAgICAgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpOwotI2Vsc2UKLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1Byb2Nlc3MoTFZNX0hhbmRsZV90ICAgICAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSk7Ci0jZW5kaWYKLQogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTUxLDcgKzUyNyw2IEBACiBMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRIZWFkcm9vbVBhcmFtcyggIExWTV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgKnBIZWFkcm9vbVBhcmFtcyk7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0SGVhZHJvb21QYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTc0LDcgKzU0OSw2IEBACiBMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRIZWFkcm9vbVBhcmFtcyggIExWTV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgKnBIZWFkcm9vbVBhcmFtcyk7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0U3BlY3RydW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjI4LDEwICs2MDIsNSBAQAogTFZNX1JldHVyblN0YXR1c19lbiBMVk1fU2V0Vm9sdW1lTm9TbW9vdGhpbmcoIExWTV9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpOwogCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KICNlbmRpZiAgICAgIC8qIF9fTFZNX0hfXyAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQVBJX1NwZWNpYWxzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQVBJX1NwZWNpYWxzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YjdmMGUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0FQSV9TcGVjaWFscy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIkxWTV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX1RhYmxlcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9HZXRTcGVjdHJ1bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHJpZXZlIFNwZWN0cmFsIGluZm9ybWF0aW9uIGF0IGEgZ2l2ZW4gQXVkaW8gdGltZSAgICAgICAgICovCi0vKiBmb3IgZGlzcGxheSB1c2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwQ3VycmVudFBlYWtzICAgICAgICAgICBQb2ludGVyIHRvIGxvY2F0aW9uIHdoZXJlIGN1cnJlbnRzIHBlYWtzIGFyZSB0byBiZSBzYXZlZCAgICAqLwotLyogIHBQYXN0UGVha3MgICAgICAgICAgICAgIFBvaW50ZXIgdG8gbG9jYXRpb24gd2hlcmUgcGFzdCBwZWFrcyBhcmUgdG8gYmUgc2F2ZWQgICAgICAgICovCi0vKiAgQXVkaW9UaW1lICAgICAgICAgICAgICAgQXVkaW8gdGltZSBhdCB3aGljaCB0aGUgc3BlY3RyYWwgaW5mb3JtYXRpb24gaXMgbmVlZGVkICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgICBJZiBhbnkgb2YgaW5wdXQgYWRkcmVzc2VzIGFyZSBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWTV9XUk9OR0FVRElPVElNRSAgICAgIEZhaWx1cmUgZHVlIHRvIGF1ZGlvIHRpbWUgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0U3BlY3RydW0oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAqcEN1cnJlbnRQZWFrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICpwUGFzdFBlYWtzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQXVkaW9UaW1lCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCi17Ci0gICAgTFZNX0luc3RhbmNlX3QgICAgICAgICAgICpwSW5zdGFuY2UgICA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0KLSAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICpoUFNBSW5zdGFuY2U7Ci0gICAgTFZQU0FfUkVUVVJOICAgICAgICAgICBMVlBTQV9TdGF0dXM7Ci0KLQotICAgIGlmKHBJbnN0YW5jZSA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7Ci0gICAgfQotCi0gICAgLypJZiBQU0EgaXMgbm90IGluY2x1ZGVkIGF0IHRoZSB0aW1lIG9mIGluc3RhbmNlIGNyZWF0aW9uLCByZXR1cm4gd2l0aG91dCBhbnkgcHJvY2Vzc2luZyovCi0gICAgaWYocEluc3RhbmNlLT5JbnN0UGFyYW1zLlBTQV9JbmNsdWRlZCE9TFZNX1BTQV9PTikKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVk1fU1VDQ0VTUzsKLSAgICB9Ci0KLSAgICBoUFNBSW5zdGFuY2UgPSBwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZTsKLQotICAgIGlmKChwQ3VycmVudFBlYWtzID09IExWTV9OVUxMKSB8fAotICAgICAgICAocFBhc3RQZWFrcyA9PSBMVk1fTlVMTCkpCi0gICAgewotICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBVcGRhdGUgbmV3IHBhcmFtZXRlcnMgaWYgbmVjZXNzYXJ5Ci0gICAgICovCi0gICAgaWYgKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCi0gICAgewotICAgICAgICBMVk1fQXBwbHlOZXdTZXR0aW5ncyhoSW5zdGFuY2UpOwotICAgIH0KLQotICAgIC8qIElmIFBTQSBtb2R1bGUgaXMgZGlzYWJsZWQsIGRvIG5vdGhpbmcgKi8KLSAgICBpZihwSW5zdGFuY2UtPlBhcmFtcy5QU0FfRW5hYmxlPT1MVk1fUFNBX09GRikKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVk1fQUxHT1JJVEhNRElTQUJMRUQ7Ci0gICAgfQotCi0gICAgTFZQU0FfU3RhdHVzID0gTFZQU0FfR2V0U3BlY3RydW0oaFBTQUluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVlBTQV9UaW1lKSAoQXVkaW9UaW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQ4KikgcEN1cnJlbnRQZWFrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQ4KikgcFBhc3RQZWFrcyApOwotCi0gICAgaWYoTFZQU0FfU3RhdHVzICE9IExWUFNBX09LKQotICAgIHsKLSAgICAgICAgaWYoTFZQU0FfU3RhdHVzID09IExWUFNBX0VSUk9SX1dST05HVElNRSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChMVk1fUmV0dXJuU3RhdHVzX2VuKSBMVk1fV1JPTkdBVURJT1RJTUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKExWTV9SZXR1cm5TdGF0dXNfZW4pIExWTV9OVUxMQUREUkVTUzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybihMVk1fU1VDQ0VTUyk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fU2V0Vm9sdW1lTm9TbW9vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzZXQgb3V0cHV0IHZvbHVtZSB3aXRob3V0IGFueSBzbW9vdGhpbmcgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIENvbnRyb2wgUGFyYW1ldGVycywgb25seSB2b2x1bWUgdmFsdWUgaXMgdXNlZCBoZXJlICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWTV9TVUNDRVNTICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZNX05VTExBRERSRVNTICAgICAgICAgSWYgYW55IG9mIGlucHV0IGFkZHJlc3NlcyBhcmUgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVk1fT1VUT0ZSQU5HRSAgICAgICAgICBXaGVuIGFueSBvZiB0aGUgY29udHJvbCBwYXJhbWV0ZXJzIGFyZSBvdXQgb2YgcmFuZ2UgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1NldFZvbHVtZU5vU21vb3RoaW5nKCBMVk1fSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKQotewotICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVk1fUmV0dXJuU3RhdHVzX2VuIEVycm9yOwotCi0gICAgLypBcHBseSBuZXcgY29udHJvbHMqLwotICAgIEVycm9yID0gTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzKGhJbnN0YW5jZSxwUGFyYW1zKTsKLSAgICBwSW5zdGFuY2UtPk5vU21vb3RoVm9sdW1lID0gTFZNX1RSVUU7Ci0gICAgcmV0dXJuIEVycm9yOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQVBJX1NwZWNpYWxzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9BUElfU3BlY2lhbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNDFjZGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQVBJX1NwZWNpYWxzLmNwcApAQCAtMCwwICsxLDE0NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX1RhYmxlcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9HZXRTcGVjdHJ1bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHJldHJpZXZlIFNwZWN0cmFsIGluZm9ybWF0aW9uIGF0IGEgZ2l2ZW4gQXVkaW8gdGltZSAgICAgICAgICovCisvKiBmb3IgZGlzcGxheSB1c2FnZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ3VycmVudFBlYWtzICAgICAgICAgICBQb2ludGVyIHRvIGxvY2F0aW9uIHdoZXJlIGN1cnJlbnRzIHBlYWtzIGFyZSB0byBiZSBzYXZlZCAgICAqLworLyogIHBQYXN0UGVha3MgICAgICAgICAgICAgIFBvaW50ZXIgdG8gbG9jYXRpb24gd2hlcmUgcGFzdCBwZWFrcyBhcmUgdG8gYmUgc2F2ZWQgICAgICAgICovCisvKiAgQXVkaW9UaW1lICAgICAgICAgICAgICAgQXVkaW8gdGltZSBhdCB3aGljaCB0aGUgc3BlY3RyYWwgaW5mb3JtYXRpb24gaXMgbmVlZGVkICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgICBJZiBhbnkgb2YgaW5wdXQgYWRkcmVzc2VzIGFyZSBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9XUk9OR0FVRElPVElNRSAgICAgIEZhaWx1cmUgZHVlIHRvIGF1ZGlvIHRpbWUgZXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0U3BlY3RydW0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAqcEN1cnJlbnRQZWFrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICpwUGFzdFBlYWtzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQXVkaW9UaW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApCit7CisgICAgTFZNX0luc3RhbmNlX3QgICAgICAgICAgICpwSW5zdGFuY2UgICA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKyAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICpoUFNBSW5zdGFuY2U7CisgICAgTFZQU0FfUkVUVVJOICAgICAgICAgICBMVlBTQV9TdGF0dXM7CisKKyAgICBpZihwSW5zdGFuY2UgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOworICAgIH0KKworICAgIC8qSWYgUFNBIGlzIG5vdCBpbmNsdWRlZCBhdCB0aGUgdGltZSBvZiBpbnN0YW5jZSBjcmVhdGlvbiwgcmV0dXJuIHdpdGhvdXQgYW55IHByb2Nlc3NpbmcqLworICAgIGlmKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQhPUxWTV9QU0FfT04pCisgICAgeworICAgICAgICByZXR1cm4gTFZNX1NVQ0NFU1M7CisgICAgfQorCisgICAgaFBTQUluc3RhbmNlID0gKHBMVlBTQV9IYW5kbGVfdCAqKXBJbnN0YW5jZS0+aFBTQUluc3RhbmNlOworCisgICAgaWYoKHBDdXJyZW50UGVha3MgPT0gTFZNX05VTEwpIHx8CisgICAgICAgIChwUGFzdFBlYWtzID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBVcGRhdGUgbmV3IHBhcmFtZXRlcnMgaWYgbmVjZXNzYXJ5CisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCisgICAgeworICAgICAgICBMVk1fQXBwbHlOZXdTZXR0aW5ncyhoSW5zdGFuY2UpOworICAgIH0KKworICAgIC8qIElmIFBTQSBtb2R1bGUgaXMgZGlzYWJsZWQsIGRvIG5vdGhpbmcgKi8KKyAgICBpZihwSW5zdGFuY2UtPlBhcmFtcy5QU0FfRW5hYmxlPT1MVk1fUFNBX09GRikKKyAgICB7CisgICAgICAgIHJldHVybiBMVk1fQUxHT1JJVEhNRElTQUJMRUQ7CisgICAgfQorCisgICAgTFZQU0FfU3RhdHVzID0gTFZQU0FfR2V0U3BlY3RydW0oaFBTQUluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVlBTQV9UaW1lKSAoQXVkaW9UaW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQ4KikgcEN1cnJlbnRQZWFrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQ4KikgcFBhc3RQZWFrcyApOworCisgICAgaWYoTFZQU0FfU3RhdHVzICE9IExWUFNBX09LKQorICAgIHsKKyAgICAgICAgaWYoTFZQU0FfU3RhdHVzID09IExWUFNBX0VSUk9SX1dST05HVElNRSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChMVk1fUmV0dXJuU3RhdHVzX2VuKSBMVk1fV1JPTkdBVURJT1RJTUU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKExWTV9SZXR1cm5TdGF0dXNfZW4pIExWTV9OVUxMQUREUkVTUzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihMVk1fU1VDQ0VTUyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX1NldFZvbHVtZU5vU21vb3RoaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IG91dHB1dCB2b2x1bWUgd2l0aG91dCBhbnkgc21vb3RoaW5nICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBDb250cm9sIFBhcmFtZXRlcnMsIG9ubHkgdm9sdW1lIHZhbHVlIGlzIHVzZWQgaGVyZSAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIElmIGFueSBvZiBpbnB1dCBhZGRyZXNzZXMgYXJlIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX09VVE9GUkFOR0UgICAgICAgICAgV2hlbiBhbnkgb2YgdGhlIGNvbnRyb2wgcGFyYW1ldGVycyBhcmUgb3V0IG9mIHJhbmdlICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRWb2x1bWVOb1Ntb290aGluZyggTFZNX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcykKK3sKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX1JldHVyblN0YXR1c19lbiBFcnJvcjsKKworICAgIC8qQXBwbHkgbmV3IGNvbnRyb2xzKi8KKyAgICBFcnJvciA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhoSW5zdGFuY2UscFBhcmFtcyk7CisgICAgcEluc3RhbmNlLT5Ob1Ntb290aFZvbHVtZSA9IExWTV9UUlVFOworICAgIHJldHVybiBFcnJvcjsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhM2MzMGUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0J1ZmZlcnMuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgotI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRJbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEZ1bGwgYnVmZmVyIG1hbmFnZW1lbnQgYWxsb3dpbmcgdGhlIHVzZXIgdG8gcHJvdmlkZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgb24gICAqLwotLyogIGFueSBhbGlnbm1lbnQgYW5kIHdpdGggYW55IG51bWJlciBvZiBzYW1wbGVzLiBUaGUgYWxpZ25tZW50IGlzIGNvcnJlY3RlZCB3aXRoaW4gICAgICovCi0vKiAgdGhlIGJ1ZmZlciBtYW5hZ2VtZW50IGFuZCB0aGUgc2FtcGxlcyBhcmUgZ3JvdXBlZCBpbiB0byBibG9ja3Mgb2YgdGhlIGNvcnJlY3Qgc2l6ZSAgKi8KLS8qICBiZWZvcmUgcHJvY2Vzc2luZy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGhJbnN0YW5jZSAgICAgICAgLSAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgcEluRGF0YSAgICAgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSBzdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgKnBUb1Byb2Nlc3MgICAgICAgIC0gICAgUG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiBkYXRhIHByb2Nlc3NpbmcgICAgICAgICAgKi8KLS8qICAqcFByb2Nlc3NlZCAgICAgICAgLSAgICBQb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBwcm9jZXNzZWQgZGF0YSAqLwotLyogICAgcE51bVNhbXBsZXMgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVk1fQnVmZmVyTWFuYWdlZEluKExWTV9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAqKnBUb1Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICoqcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgKnBOdW1TYW1wbGVzKQotewotCi0gICAgTFZNX0lOVDE2ICAgICAgICBTYW1wbGVDb3VudDsgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIGJlIHByb2Nlc3NlZCB0aGlzIGNhbGwgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgIE51bVNhbXBsZXM7ICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gc2NyYXRjaCBidWZmZXIgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICpwU3RhcnQ7Ci0gICAgTFZNX0luc3RhbmNlX3QgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVk1fQnVmZmVyX3QgICAgICpwQnVmZmVyOwotICAgIExWTV9GTE9BVCAgICAgICAgKnBEZXN0OwotICAgIExWTV9JTlQxNiAgICAgICAgTnVtQ2hhbm5lbHMgPSAyOwotCi0KLSAgICAvKgotICAgICAqIFNldCB0aGUgcHJvY2Vzc2luZyBhZGRyZXNzIHBvaW50ZXJzCi0gICAgICovCi0gICAgcEJ1ZmZlciAgICAgPSBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50OwotICAgIHBEZXN0ICAgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7Ci0gICAgKnBUb1Byb2Nlc3MgPSBwQnVmZmVyLT5wU2NyYXRjaDsKLSAgICAqcFByb2Nlc3NlZCA9IHBCdWZmZXItPnBTY3JhdGNoOwotCi0gICAgLyoKLSAgICAgKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCBvZiBhIGJsb2NrCi0gICAgICovCi0gICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9PSAwKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogRmlyc3QgY2FsbCBmb3IgYSBuZXcgYmxvY2sgb2Ygc2FtcGxlcwotICAgICAgICAgKi8KLSAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gKExWTV9JTlQxNikoKnBOdW1TYW1wbGVzICsgcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMpOwotICAgICAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgPSAoTFZNX0ZMT0FUICopcEluRGF0YTsKLSAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgICAgICAgID0gTFZNX0ZJUlNUQ0FMTDsKLSAgICB9Ci0gICAgcFN0YXJ0ID0gcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzOyAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgc2FtcGxlcyAqLwotICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCAgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZXMgdG8gb3V0cHV0IGlzIHNhbWUgYXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgcmVhZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCi0KLQotICAgIC8qCi0gICAgICogQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzIHRoaXMgY2FsbCBhbmQgdXBkYXRlIHRoZSBidWZmZXIgc3RhdGUKLSAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID4gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZSkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFByb2Nlc3MgdGhlIG1heGltdW0gYm9jayBzaXplIG9mIHNhbXBsZXMuCi0gICAgICAgICAqLwotICAgICAgICBTYW1wbGVDb3VudCA9IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemU7Ci0gICAgICAgIE51bVNhbXBsZXMgID0gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogTGFzdCBjYWxsIGZvciB0aGUgYmxvY2ssIHNvIGNhbGN1bGF0ZSBob3cgbWFueSBmcmFtZXMgYW5kIHNhbXBsZXMgdG8gcHJvY2VzcwotICAgICAgICAgICovCi0gICAgICAgIExWTV9JTlQxNiAgIE51bUZyYW1lczsKLQotICAgICAgICBOdW1TYW1wbGVzICA9IHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsKLSAgICAgICAgTnVtRnJhbWVzICAgID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyA+PiBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7Ci0gICAgICAgIFNhbXBsZUNvdW50ID0gKExWTV9JTlQxNikoTnVtRnJhbWVzIDw8IE1JTl9JTlRFUk5BTF9CTE9DS1NISUZUKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBVcGRhdGUgdGhlIGJ1ZmZlciBzdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVENBTEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBCdWZmZXItPkJ1ZmZlclN0YXRlID0gTFZNX0ZJUlNUTEFTVENBTEw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9IExWTV9MQVNUQ0FMTDsKLSAgICAgICAgfQotICAgIH0KLSAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilTYW1wbGVDb3VudDsgIC8qIFNldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyB0aGlzIGNhbGwgKi8KLQotCi0gICAgLyoKLSAgICAgKiBDb3B5IHNhbXBsZXMgZnJvbSB0aGUgZGVsYXkgYnVmZmVyIGFzIHJlcXVpcmVkCi0gICAgICovCi0gICAgaWYgKCgocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUQ0FMTCkgfHwKLSAgICAgICAgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVExBU1RDQUxMKSkgJiYKLSAgICAgICAgKHBCdWZmZXItPkluRGVsYXlTYW1wbGVzICE9IDApKQotICAgIHsKLSAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+SW5EZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1DaGFubmVscyAqIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzKSk7ICAgIC8qIE51bWJlciBvZiBkZWxheSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsIGxlZnQgYW5kIHJpZ2h0ICovCi0gICAgICAgIE51bVNhbXBsZXMgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMpOyAvKiBVcGRhdGUgc2FtcGxlIGNvdW50ICovCi0gICAgICAgIHBEZXN0ICs9IE51bUNoYW5uZWxzICogcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXM7ICAgICAgLyogVXBkYXRlIHRoZSBkZXN0aW5hdGlvbiBwb2ludGVyICovCi0gICAgfQotCi0KLSAgICAvKgotICAgICAqIENvcHkgdGhlIHJlc3Qgb2YgdGhlIHNhbXBsZXMgZm9yIHRoaXMgY2FsbCBmcm9tIHRoZSBpbnB1dCBidWZmZXIKLSAgICAgKi8KLSAgICBpZiAoTnVtU2FtcGxlcyA+IDApCi0gICAgewotICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtQ2hhbm5lbHMgKiBOdW1TYW1wbGVzKSk7ICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KLSAgICAgICAgcFN0YXJ0ICs9IE51bUNoYW5uZWxzICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGlucHV0IHBvaW50ZXIgKi8KLQotICAgICAgICAvKgotICAgICAgICAgKiBVcGRhdGUgdGhlIGlucHV0IGRhdGEgcG9pbnRlciBhbmQgc2FtcGxlcyB0byBvdXRwdXQKLSAgICAgICAgICovCi0gICAgICAgIC8qIFVwZGF0ZSBzYW1wbGVzIHRvIG91dHB1dCAqLwotICAgICAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgKyBOdW1TYW1wbGVzKTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICAqIFVwZGF0ZSB0aGUgc2FtcGxlIGNvdW50IGFuZCBpbnB1dCBwb2ludGVyCi0gICAgICovCi0gICAgLyogVXBkYXRlIHRoZSBjb3VudCBvZiBzYW1wbGVzICovCi0gICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzICA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAtIFNhbXBsZUNvdW50KTsKLSAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgID0gcFN0YXJ0OyAvKiBVcGRhdGUgaW5wdXQgc2FtcGxlIHBvaW50ZXIgKi8KLQotCi0gICAgLyoKLSAgICAgKiBTYXZlIHNhbXBsZXMgdG8gdGhlIGRlbGF5IGJ1ZmZlciBpZiBhbnkgbGVmdCB1bnByb2Nlc3NlZAotICAgICAqLwotICAgIGlmICgocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUTEFTVENBTEwpIHx8Ci0gICAgICAgIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fTEFTVENBTEwpKQotICAgIHsKLSAgICAgICAgTnVtU2FtcGxlcyA9IHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsKLSAgICAgICAgcFN0YXJ0ICAgICA9IHBCdWZmZXItPnBTY3JhdGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RhcnQgb2YgdGhlIGJ1ZmZlciAqLwotICAgICAgICBwU3RhcnQgICAgKz0gTnVtQ2hhbm5lbHMgKiBTYW1wbGVDb3VudDsgLyogT2Zmc2V0IGJ5IHRoZSBudW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KLSAgICAgICAgaWYgKE51bVNhbXBsZXMgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPkluRGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtQ2hhbm5lbHMgKiBOdW1TYW1wbGVzKSk7ICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogVXBkYXRlIHRoZSBkZWxheSBzYW1wbGUgY291bnQKLSAgICAgICAgICovCi0gICAgICAgIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzICAgICA9IE51bVNhbXBsZXM7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGUgcGFpcnMgKi8KLSAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxsIFNhbXBsZXMgdXNlZCAqLwotICAgIH0KLX0KLSNlbHNlCi12b2lkIExWTV9CdWZmZXJNYW5hZ2VkSW4oTFZNX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICoqcFRvUHJvY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgKipwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAqcE51bVNhbXBsZXMpCi17Ci0KLSAgICBMVk1fSU5UMTYgICAgICAgIFNhbXBsZUNvdW50OyAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gYmUgcHJvY2Vzc2VkIHRoaXMgY2FsbCAqLwotICAgIExWTV9JTlQxNiAgICAgICAgTnVtU2FtcGxlczsgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiBzY3JhdGNoIGJ1ZmZlciAqLwotICAgIExWTV9JTlQxNiAgICAgICAgKnBTdGFydDsKLSAgICBMVk1fSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9CdWZmZXJfdCAgICAgKnBCdWZmZXI7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAqcERlc3Q7Ci0gICAgTFZNX0lOVDE2ICAgICAgICBOdW1DaGFubmVscyA9MjsKLQotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIHByb2Nlc3NpbmcgYWRkcmVzcyBwb2ludGVycwotICAgICAqLwotICAgIHBCdWZmZXIgICAgID0gcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudDsKLSAgICBwRGVzdCAgICAgICA9IHBCdWZmZXItPnBTY3JhdGNoOwotICAgICpwVG9Qcm9jZXNzID0gcEJ1ZmZlci0+cFNjcmF0Y2g7Ci0gICAgKnBQcm9jZXNzZWQgPSBwQnVmZmVyLT5wU2NyYXRjaDsKLQotICAgIC8qCi0gICAgICogQ2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgb2YgYSBibG9jawotICAgICAqLwotICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPT0gMCkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEZpcnN0IGNhbGwgZm9yIGEgbmV3IGJsb2NrIG9mIHNhbXBsZXMKLSAgICAgICAgICovCi0gICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IChMVk1fSU5UMTYpKCpwTnVtU2FtcGxlcyArIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzKTsKLSAgICAgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgID0gKExWTV9JTlQxNiAqKXBJbkRhdGE7Ci0gICAgICAgIHBCdWZmZXItPkJ1ZmZlclN0YXRlICAgICAgICA9IExWTV9GSVJTVENBTEw7Ci0gICAgfQotICAgIHBTdGFydCA9IHBJbnN0YW5jZS0+cElucHV0U2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IHNhbXBsZXMgKi8KLSAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGVzIHRvIG91dHB1dCBpcyBzYW1lIGFzIG51bWJlciByZWFkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KLQotCi0gICAgLyoKLSAgICAgKiBDYWxjdWxhdGUgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgdGhpcyBjYWxsIGFuZCB1cGRhdGUgdGhlIGJ1ZmZlciBzdGF0ZQotICAgICAqLwotICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPiBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogUHJvY2VzcyB0aGUgbWF4aW11bSBib2NrIHNpemUgb2Ygc2FtcGxlcy4KLSAgICAgICAgICovCi0gICAgICAgIFNhbXBsZUNvdW50ID0gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKLSAgICAgICAgTnVtU2FtcGxlcyAgPSBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBMYXN0IGNhbGwgZm9yIHRoZSBibG9jaywgc28gY2FsY3VsYXRlIGhvdyBtYW55IGZyYW1lcyBhbmQgc2FtcGxlcyB0byBwcm9jZXNzCi0gICAgICAgICAgKi8KLSAgICAgICAgTFZNX0lOVDE2ICAgTnVtRnJhbWVzOwotCi0gICAgICAgIE51bVNhbXBsZXMgID0gcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOwotICAgICAgICBOdW1GcmFtZXMgICAgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzID4+IE1JTl9JTlRFUk5BTF9CTE9DS1NISUZUKTsKLSAgICAgICAgU2FtcGxlQ291bnQgPSAoTFZNX0lOVDE2KShOdW1GcmFtZXMgPDwgTUlOX0lOVEVSTkFMX0JMT0NLU0hJRlQpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFVwZGF0ZSB0aGUgYnVmZmVyIHN0YXRlCi0gICAgICAgICAqLwotICAgICAgICBpZiAocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUQ0FMTCkKLSAgICAgICAgewotICAgICAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgPSBMVk1fRklSU1RMQVNUQ0FMTDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBCdWZmZXItPkJ1ZmZlclN0YXRlID0gTFZNX0xBU1RDQUxMOwotICAgICAgICB9Ci0gICAgfQotICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KVNhbXBsZUNvdW50OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyB0aGlzIGNhbGwgKi8KLQotCi0gICAgLyoKLSAgICAgKiBDb3B5IHNhbXBsZXMgZnJvbSB0aGUgZGVsYXkgYnVmZmVyIGFzIHJlcXVpcmVkCi0gICAgICovCi0gICAgaWYgKCgocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUQ0FMTCkgfHwKLSAgICAgICAgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVExBU1RDQUxMKSkgJiYKLSAgICAgICAgKHBCdWZmZXItPkluRGVsYXlTYW1wbGVzICE9IDApKQotICAgIHsKLSAgICAgICAgQ29weV8xNigmcEJ1ZmZlci0+SW5EZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1DaGFubmVscypwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcykpOyAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzLCBsZWZ0IGFuZCByaWdodCAqLwotICAgICAgICBOdW1TYW1wbGVzID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyAtIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzKTsgLyogVXBkYXRlIHNhbXBsZSBjb3VudCAqLwotICAgICAgICBwRGVzdCArPSBOdW1DaGFubmVscyAqIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzOyAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBkZXN0aW5hdGlvbiBwb2ludGVyICovCi0gICAgfQotCi0KLSAgICAvKgotICAgICAqIENvcHkgdGhlIHJlc3Qgb2YgdGhlIHNhbXBsZXMgZm9yIHRoaXMgY2FsbCBmcm9tIHRoZSBpbnB1dCBidWZmZXIKLSAgICAgKi8KLSAgICBpZiAoTnVtU2FtcGxlcyA+IDApCi0gICAgewotICAgICAgICBDb3B5XzE2KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1DaGFubmVscypOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KLSAgICAgICAgcFN0YXJ0ICs9IE51bUNoYW5uZWxzICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBpbnB1dCBwb2ludGVyICovCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogVXBkYXRlIHRoZSBpbnB1dCBkYXRhIHBvaW50ZXIgYW5kIHNhbXBsZXMgdG8gb3V0cHV0Ci0gICAgICAgICAqLwotICAgICAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgKyBOdW1TYW1wbGVzKTsgLyogVXBkYXRlIHNhbXBsZXMgdG8gb3V0cHV0ICovCi0gICAgfQotCi0KLSAgICAvKgotICAgICAgKiBVcGRhdGUgdGhlIHNhbXBsZSBjb3VudCBhbmQgaW5wdXQgcG9pbnRlcgotICAgICAqLwotICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgLSBTYW1wbGVDb3VudCk7ICAgICAgLyogVXBkYXRlIHRoZSBjb3VudCBvZiBzYW1wbGVzICovCi0gICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgICA9IHBTdGFydDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgaW5wdXQgc2FtcGxlIHBvaW50ZXIgKi8KLQotCi0gICAgLyoKLSAgICAgKiBTYXZlIHNhbXBsZXMgdG8gdGhlIGRlbGF5IGJ1ZmZlciBpZiBhbnkgbGVmdCB1bnByb2Nlc3NlZAotICAgICAqLwotICAgIGlmICgocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUTEFTVENBTEwpIHx8Ci0gICAgICAgIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fTEFTVENBTEwpKQotICAgIHsKLSAgICAgICAgTnVtU2FtcGxlcyA9IHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsKLSAgICAgICAgcFN0YXJ0ICAgICA9IHBCdWZmZXItPnBTY3JhdGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RhcnQgb2YgdGhlIGJ1ZmZlciAqLwotICAgICAgICBwU3RhcnQgICAgKz0gTnVtQ2hhbm5lbHMqU2FtcGxlQ291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAvKiBPZmZzZXQgYnkgdGhlIG51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLwotICAgICAgICBpZiAoTnVtU2FtcGxlcyAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb3B5XzE2KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+SW5EZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1DaGFubmVscypOdW1TYW1wbGVzKSk7ICAgICAgICAgICAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLwotICAgICAgICB9Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBVcGRhdGUgdGhlIGRlbGF5IHNhbXBsZSBjb3VudAotICAgICAgICAgKi8KLSAgICAgICAgcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMgICAgID0gTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZSBwYWlycyAqLwotICAgICAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbGwgU2FtcGxlcyB1c2VkICovCi0gICAgfQotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWTV9CdWZmZXJVbm1hbmFnZWRJbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGlzIG1vZGUgaXMgc2VsZWN0ZWQgYnkgdGhlIHVzZXIgY29kZSBhbmQgZGlzYWJsZXMgdGhlIGJ1ZmZlciBtYW5hZ2VtZW50IHdpdGggdGhlICovCi0vKiAgZXhjZXB0aW9uIG9mIHRoZSBtYXhpbXVtIGJsb2NrIHNpemUgcHJvY2Vzc2luZy4gVGhlIHVzZXIgbXVzdCBlbnN1cmUgdGhhdCB0aGUgICAgICAgKi8KLS8qICBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIDMyLWJpdCBhbGlnbmVkIGFuZCBhbHNvIHRoYXQgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvICAqLwotLyogICAgcHJvY2VzcyBpcyBhIGNvcnJlY3QgbXVsdGlwbGUgb2Ygc2FtcGxlcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgaEluc3RhbmNlICAgICAgICAtICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgKnBUb1Byb2Nlc3MgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgZGF0YSBwcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAqcFByb2Nlc3NlZCAgICAgICAgLSAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcHJvY2Vzc2VkIGRhdGEgICAgICAgICAgICAqLwotLyogICAgcE51bVNhbXBsZXMgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVk1fQnVmZmVyVW5tYW5hZ2VkSW4oTFZNX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICoqcFRvUHJvY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKipwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAqcE51bVNhbXBsZXMpCi17Ci0KLSAgICBMVk1fSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLQotCi0gICAgLyoKLSAgICAgKiBDaGVjayBpZiB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsIG9mIGEgYmxvY2sKLSAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID09IDApCi0gICAgewotICAgICAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAoTFZNX0lOVDE2KSpwTnVtU2FtcGxlczsgICAgLyogR2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uIGZpcnN0IGNhbGwgKi8KLSAgICAgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgID0gKnBUb1Byb2Nlc3M7ICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgSS9PIHBvaW50ZXJzICovCi0gICAgICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgICAgPSAqcFByb2Nlc3NlZDsKLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNldCB0ZSBibG9jayBzaXplIHRvIHByb2Nlc3MKLSAgICAgICAgICovCi0gICAgICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPiBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIHByb2Nlc3MgcG9pbnRlcnMKLSAgICAgKi8KLSAgICAqcFRvUHJvY2VzcyA9IHBJbnN0YW5jZS0+cElucHV0U2FtcGxlczsKLSAgICAqcFByb2Nlc3NlZCA9IHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXM7Ci19Ci0jZWxzZQotdm9pZCBMVk1fQnVmZmVyVW5tYW5hZ2VkSW4oTFZNX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICoqcFRvUHJvY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKipwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAqcE51bVNhbXBsZXMpCi17Ci0KLSAgICBMVk1fSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLQotCi0gICAgLyoKLSAgICAgKiBDaGVjayBpZiB0aGlzIGlzIHRoZSBmaXJzdCBjYWxsIG9mIGEgYmxvY2sKLSAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID09IDApCi0gICAgewotICAgICAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAoTFZNX0lOVDE2KSpwTnVtU2FtcGxlczsgICAgICAgLyogR2V0IHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBvbiBmaXJzdCBjYWxsICovCi0gICAgICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyAgICA9ICpwVG9Qcm9jZXNzOyAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIEkvTyBwb2ludGVycyAqLwotICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzICAgID0gKnBQcm9jZXNzZWQ7Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBTZXQgdGUgYmxvY2sgc2l6ZSB0byBwcm9jZXNzCi0gICAgICAgICAqLwotICAgICAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID4gcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogU2V0IHRoZSBwcm9jZXNzIHBvaW50ZXJzCi0gICAgICovCi0gICAgKnBUb1Byb2Nlc3MgPSBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXM7Ci0gICAgKnBQcm9jZXNzZWQgPSBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzOwotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWTV9CdWZmZXJPcHRpbWlzZWRJbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBPcHRpbWlzZWQgYnVmZmVyIG1hbmFnZW1lbnQgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZSBkYXRhIGlzIG91dHBsYWNlIHByb2Nlc3NpbmcsICAgKi8KLS8qICAgIHRoZSBvdXRwdXQgZGF0YSBpcyAzMi1iaXQgYWxpZ25lZCBhbmQgdGhlcmUgYXJlIHN1ZmZpY2llbnQgc2FtcGxlcyB0byBhbGxvdyBzb21lICAqLwotLyogICAgcHJvY2Vzc2luZyBkaXJlY3RseSBpbiB0aGUgb3V0cHV0IGJ1ZmZlci4gVGhpcyBzYXZlcyBvbmUgZGF0YSBjb3B5IHBlciBzYW1wbGUgICAgICovCi0vKiAgICBjb21wYXJlZCB3aXRoIHRoZSB1bm9wdGltc2VkIHZlcnNpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBoSW5zdGFuY2UgICAgICAgIC0gICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIHBJbkRhdGEgICAgICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICpwVG9Qcm9jZXNzICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIGRhdGEgcHJvY2Vzc2luZyAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgKnBQcm9jZXNzZWQgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgZGVzdGluYXRpb24gb2YgdGhlIHByb2Nlc3NlZCBkYXRhICAgICAgICAgICAgKi8KLS8qICAgIHBOdW1TYW1wbGVzICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZNX0J1ZmZlck9wdGltaXNlZEluKExWTV9IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgKipwVG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgKipwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgKnBOdW1TYW1wbGVzKQotewotCi0gICAgTFZNX0luc3RhbmNlX3QgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVk1fQnVmZmVyX3QgICAgICpwQnVmZmVyICAgID0gcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudDsKLSAgICBMVk1fSU5UMTYgICAgICAgICpwRGVzdDsKLSAgICBMVk1fSU5UMTYgICAgICAgIFNhbXBsZUNvdW50OwotICAgIExWTV9JTlQxNiAgICAgICAgTnVtU2FtcGxlczsKLSAgICBMVk1fSU5UMTYgICAgICAgIE51bUZyYW1lczsKLQotICAgIC8qCi0gICAgICogQ2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgZm9yIHRoaXMgYmxvY2sKLSAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID09IDApCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBGaXJzdCBjYWxsIGZvciBhIG5ldyBibG9jayBvZiBzYW1wbGVzCi0gICAgICAgICAqLwotICAgICAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9IExWTV9GSVJTVENBTEw7Ci0gICAgICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyAgICA9IChMVk1fSU5UMTYgKilwSW5EYXRhOwotICAgICAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAoTFZNX0lOVDE2KSpwTnVtU2FtcGxlczsKLSAgICAgICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ICAgID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7Ci0gICAgICAgIHBEZXN0ID0gKnBQcm9jZXNzZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIHN0YXJ0IG9mIHRoZSBvdXRwdXQgYnVmZmVyICovCi0KLQotICAgICAgICAvKgotICAgICAgICAgKiBDb3B5IHRoZSBhbHJlYWR5IHByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBvdXRwdXQgYnVmZmVyCi0gICAgICAgICAqLwotICAgICAgICBpZiAocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvcHlfMTYoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCi0gICAgICAgICAgICBwRGVzdCArPSAyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzOyAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgb3V0cHV0IHBvaW50ZXIgKi8KLSAgICAgICAgICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCA9IChMVk1fSU5UMTYpKHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCAtIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyk7IC8qIFVwZGF0ZSB0aGUgbnVtYnIgb2Ygc2FtcGxlcyB0byBvdXRwdXQgKi8KLSAgICAgICAgfQotICAgICAgICAqcFRvUHJvY2VzcyA9IHBEZXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgYWRkcmVzcyB0byBzdGFydCBwcm9jZXNzaW5nICovCi0gICAgICAgICpwUHJvY2Vzc2VkID0gcERlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvY2VzcyBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwgbm93IGlucGxhY2UgKi8KLQotICAgICAgICAvKgotICAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKHVucHJvY2Vzc2VkKSBzYW1wbGVzIHRvIHRoZSBvdXRwdXQgYnVmZmVyCi0gICAgICAgICAqLwotICAgICAgICBpZiAocEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgQ29weV8xNigmcEJ1ZmZlci0+SW5EZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcykpOyAgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KLSAgICAgICAgICAgIHBEZXN0ICs9IDIgKiBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlczsgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBvdXRwdXQgcG9pbnRlciAqLwotICAgICAgICB9Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBDYWxjdWxhdGUgaG93IG1hbnkgaW5wdXQgc2FtcGxlcyB0byBwcm9jZXNzIGFuZCBjb3B5Ci0gICAgICAgICAqLwotICAgICAgICBOdW1TYW1wbGVzICAgID0gKExWTV9JTlQxNikoKnBOdW1TYW1wbGVzIC0gcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKTsgIC8qIE51bWJlciB0aGF0IHdpbGwgZml0IGluIHRoZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIGlmIChOdW1TYW1wbGVzID49IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE51bVNhbXBsZXMgPSBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOwotICAgICAgICB9Ci0gICAgICAgIE51bUZyYW1lcyAgICAgID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyA+PiBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7Ci0gICAgICAgIFNhbXBsZUNvdW50ICAgPSAoTFZNX0lOVDE2KShOdW1GcmFtZXMgPDwgTUlOX0lOVEVSTkFMX0JMT0NLU0hJRlQpOwotICAgICAgICAqcE51bVNhbXBsZXMgID0gKExWTV9VSU5UMTYpU2FtcGxlQ291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCi0gICAgICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCA9IChMVk1fSU5UMTYpKHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCAtIFNhbXBsZUNvdW50KTsgLyogVXBkYXRlIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBvdXRwdXQgKi8KLSAgICAgICAgU2FtcGxlQ291bnQgICA9IChMVk1fSU5UMTYpKFNhbXBsZUNvdW50IC0gcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMpOyAgICAgICAgICAgICAvKiBUaGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gY29weSBmcm9tIHRoZSBpbnB1dCAqLwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ29weSBzYW1wbGVzIGZyb20gdGhlIGlucHV0IGJ1ZmZlciBhbmQgdXBkYXRlIGNvdW50cyBhbmQgcG9pbnRlcnMKLSAgICAgICAgICovCi0gICAgICAgIENvcHlfMTYocEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqU2FtcGxlQ291bnQpKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLwotICAgICAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgKz0gMiAqIFNhbXBsZUNvdW50OyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGlucHV0IHBvaW50ZXIgKi8KLSAgICAgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyA9IHBEZXN0ICsgKDIgKiBTYW1wbGVDb3VudCk7ICAgICAgLyogVXBkYXRlIHRoZSBvdXRwdXQgcG9pbnRlciAqLwotICAgICAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgLSBTYW1wbGVDb3VudCk7IC8qIFNhbXBsZXMgbGVmdCBpbiB0aGUgaW5wdXQgYnVmZmVyICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFNlY29uZCBvciBzdWJzZXF1ZW50IGNhbGwgaW4gb3B0aW1pc2VkIG1vZGUKLSAgICAgICAgICovCi0gICAgICAgIGlmIChwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgPj0gTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIE1vcmUgc2FtcGxlcyBjYW4gYmUgcHJvY2Vzc2VkIGRpcmVjdGx5IGluIHRoZSBvdXRwdXQgYnVmZmVyCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICpwVG9Qcm9jZXNzID0gcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlczsgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBhZGRyZXNzIHRvIHN0YXJ0IHByb2Nlc3NpbmcgKi8KLSAgICAgICAgICAgICpwUHJvY2Vzc2VkID0gcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlczsgICAgICAgICAgICAgICAgLyogUHJvY2VzcyBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwgbm93IGlucGxhY2UgKi8KLSAgICAgICAgICAgIE51bVNhbXBsZXMgID0gcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0OyAgICAgICAgICAgICAgICAgLyogTnVtYmVyIHRoYXQgd2lsbCBmaXQgaW4gdGhlIG91dHB1dCBidWZmZXIgKi8KLSAgICAgICAgICAgIGlmIChOdW1TYW1wbGVzID49IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTnVtU2FtcGxlcyA9IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBOdW1GcmFtZXMgICAgICA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPj4gTUlOX0lOVEVSTkFMX0JMT0NLU0hJRlQpOwotICAgICAgICAgICAgU2FtcGxlQ291bnQgICA9IChMVk1fSU5UMTYpKE51bUZyYW1lcyA8PCBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7Ci0gICAgICAgICAgICAqcE51bVNhbXBsZXMgID0gKExWTV9VSU5UMTYpU2FtcGxlQ291bnQ7ICAgICAgICAgICAgLyogVGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KLQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQ29weSBzYW1wbGVzIGZyb20gdGhlIGlucHV0IGJ1ZmZlciBhbmQgdXBkYXRlIGNvdW50cyBhbmQgcG9pbnRlcnMKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ29weV8xNihwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMsICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcywgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipTYW1wbGVDb3VudCkpOyAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KLSAgICAgICAgICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyArPSAyICogU2FtcGxlQ291bnQ7ICAgICAgICAgICAgLyogVXBkYXRlIHRoZSBpbnB1dCBwb2ludGVyICovCi0gICAgICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzICs9IDIgKiBTYW1wbGVDb3VudDsgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgb3V0cHV0IHBvaW50ZXIgKi8KLSAgICAgICAgICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAtIFNhbXBsZUNvdW50KTsgICAvKiBTYW1wbGVzIGxlZnQgaW4gdGhlIGlucHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0ID0gKExWTV9JTlQxNikocEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0IC0gU2FtcGxlQ291bnQpOyAgICAgICAgIC8qIE51bWJlciB0aGF0IHdpbGwgZml0IGluIHRoZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVGhlIHJlbWFpbmluZyBzYW1wbGVzIGNhbiBub3QgYmUgcHJvY2Vzc2VkIGluIHRoZSBvdXRwdXQgYnVmZmVyCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBCdWZmZXItPkJ1ZmZlclN0YXRlID0gTFZNX0xBU1RDQUxMOyAgICAgICAgICAgICAgICAgICAgLyogSW5kaWNhdGUgdGhpcyBpcyB0aGUgbGFzdCBib2NrIHRvIHByb2Nlc3MgKi8KLSAgICAgICAgICAgICpwVG9Qcm9jZXNzICA9IHBCdWZmZXItPnBTY3JhdGNoOyAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBhZGRyZXNzIHRvIHN0YXJ0IHByb2Nlc3NpbmcgKi8KLSAgICAgICAgICAgICpwUHJvY2Vzc2VkICA9IHBCdWZmZXItPnBTY3JhdGNoOyAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvY2VzcyBpbiB0aGUgb3V0cHV0IGJ1ZmZlciwgbm93IGlucGxhY2UgKi8KLSAgICAgICAgICAgIE51bVNhbXBsZXMgICA9IHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzczsgICAgICAgICAgICAgLyogTnVtYmVyIGxlZnQgdG8gYmUgcHJvY2Vzc2VkICovCi0gICAgICAgICAgICBOdW1GcmFtZXMgICAgID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyA+PiBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7Ci0gICAgICAgICAgICBTYW1wbGVDb3VudCAgPSAoTFZNX0lOVDE2KShOdW1GcmFtZXMgPDwgTUlOX0lOVEVSTkFMX0JMT0NLU0hJRlQpOwotICAgICAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpU2FtcGxlQ291bnQ7ICAgICAgICAgICAgICAgIC8qIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCi0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIENvcHkgc2FtcGxlcyBmcm9tIHRoZSBpbnB1dCBidWZmZXIgYW5kIHVwZGF0ZSBjb3VudHMgYW5kIHBvaW50ZXJzCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIENvcHlfMTYocEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzLCAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgIHBCdWZmZXItPnBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqU2FtcGxlQ291bnQpKTsgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCi0gICAgICAgICAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgKz0gMiAqIFNhbXBsZUNvdW50OyAgICAgICAgICAgIC8qIFVwZGF0ZSB0aGUgaW5wdXQgcG9pbnRlciAqLwotICAgICAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gKExWTV9JTlQxNikocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzIC0gU2FtcGxlQ291bnQpOyAvKiBTYW1wbGVzIGxlZnQgaW4gdGhlIGlucHV0IGJ1ZmZlciAqLwotICAgICAgICB9Ci0gICAgfQotfQotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVk1fQnVmZmVySW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhpcyBmdW5jdGlvbiBtYW5hZ2VzIHRoZSBkYXRhIGlucHV0LCBpdCBoYXMgdGhlIGZvbGxvd2luZyBmZWF0dXJlczogICAgICAgICAgICAgICovCi0vKiAgICAgICAgLSBBY2NlcHRzIGRhdGEgaW4gMTYtYml0IGFsaWduZWQgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAtIENvcGllcyB0aGUgZGF0YSB0byAzMi1iaXQgYWxpZ25lZCBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIC0gQ29udmVydHMgTW9ubyBpbnB1dHMgdG8gTW9uby1pbi1TdGVyZW8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgLSBBY2NlcHRzIGFueSBudW1iZXIgb2Ygc2FtcGxlcyBhcyBpbnB1dCwgZXhjZXB0IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAtIEJyZWFrcyB0aGUgaW5wdXQgc2FtcGxlIHN0cmVhbSBpbiB0byBibG9ja3Mgb2YgdGhlIGNvbmZpZ3VyZWQgZnJhbWUgc2l6ZSBvciAqLwotLyogICAgICAgICAgbXVsdGlwbGVzIG9mIHRoZSBmcmFtZSBzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgLSBMaW1pdHMgdGhlIHByb2Nlc3NpbmcgYmxvY2sgc2l6ZSB0byB0aGUgbWF4aW11bSBibG9jayBzaXplLiAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAtIFdvcmtzIHdpdGggaW5wbGFjZSBvciBvdXRwbGFjZSBwcm9jZXNzaW5nIGF1dG9tYXRpY2FsbHkgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVG8gbWFuYWdlIHRoZSBkYXRhIHRoZSBmdW5jdGlvbiBoYXMgYSBudW1iZXIgb2Ygb3BlcmF0aW5nIHN0YXRlczogICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBMVk1fRklSU1RDQUxMICAgICAgICAtIFRoZSBmaXJzdCBjYWxsIGZvciB0aGlzIGJsb2NrIG9mIGlucHV0IHNhbXBsZXMgICAgICAgICAqLwotLyogICAgICAgIExWTV9NQVhCTE9DS0NBTEwgICAgLSBUaGUgY3VycmVudCBibG9jayBpcyB0aGUgbWF4aW11bSBzaXplLiBPbmx5IHVzZWQgZm9yIHRoZSAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQgYW5kIHN1YnNlcXVlbnQgYmxvY2tzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgTFZNX0xBU1RDQUxMICAgICAgICAtIFRoZSBsYXN0IGNhbGwgZm9yIHRoaXMgYmxvY2sgb2YgaW5wdXQgc2FtcGxlcyAgICAgICAgICAgKi8KLS8qICAgICAgICBMVk1fRklSU1RMQVNUQ0FMTCAgICAtIFRoaXMgaXMgdGhlIGZpcnN0IGFuZCBsYXN0IGNhbGwgZm9yIHRoaXMgYmxvY2sgb2YgaW5wdXQqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGVzLCB0aGlzIG9jY3VycyB3aGVuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3MgaXMgbGVzcyB0aGFuIHRoZSBtYXhpbXVtIGJsb2NrIHNpemUuICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIGZ1bmN0aW9uIHVzZXMgYW4gaW50ZXJuYWwgZGVsYXkgYnVmZmVyIHRoZSBzaXplIG9mIHRoZSBtaW5pbXVtIGZyYW1lLCB0aGlzIGlzICovCi0vKiAgdXNlZCB0byB0ZW1wb3JhcmlseSBob2xkIHNhbXBsZXMgd2hlbiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyBpcyBub3QgYSAgICAgKi8KLS8qICBtdWx0aXBsZSBvZiB0aGUgZnJhbWUgc2l6ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUbyBlbnN1cmUgY29ycmVjdCBvcGVyYXRpb24gd2l0aCBpbnBsYWNlIGJ1ZmZlcmluZyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gb3V0cHV0Ki8KLS8qICBwZXIgY2FsbCBpcyBjYWxjdWxhdGVkIGluIHRoaXMgZnVuY3Rpb24gYW5kIGlzIHNldCB0byB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcmVhZCAgICAqLwotLyogIGZyb20gdGhlIGlucHV0IGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRoZSB0b3RhbCBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzIGlzIHN0b3JlZCB3aGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yICAqLwotLyogIHRoZSBmaXJzdCB0aW1lLiBUaGUgdmFsdWUgaXMgb3ZlcndyaXR0ZW4gYnkgdGhlIHNpemUgb2YgdGhlIGJsb2NrIHRvIGJlIHByb2Nlc3NlZCAgICovCi0vKiAgaW4gZWFjaCBjYWxsIHNvIHRoZSBzaXplIG9mIHRoZSBwcm9jZXNzaW5nIGJsb2NrcyBjYW4gYmUgY29udHJvbGxlZC4gVGhlIG51bWJlciBvZiAgKi8KLS8qICAgIHNhbXBsZXMgYWN0dWFsbHkgcHJvY2Vzc2VkIGZvciBlYWNoIGJsb2NrIG9mIGlucHV0IHNhbXBsZXMgaXMgYWx3YXlzIGEgbXVsdGlwbGUgb2YqLwotLyogIHRoZSBmcmFtZSBzaXplIHNvIGZvciBhbnkgcGFydGljdWxhciBibG9jayBvZiBpbnB1dCBzYW1wbGVzIHRoZSBhY3R1YWwgbnVtYmVyIG9mICAgICovCi0vKiAgcHJvY2Vzc2VkIHNhbXBsZXMgbWF5IG5vdCBtYXRjaCB0aGUgbnVtYmVyIG9mIGlucHV0IHNhbXBsZXMsIHNvbWV0aW1lIGl0IHdpbGwgYmUgICAgKi8KLS8qICBzb21ldGltZXMgbGVzcy4gVGhlIGF2ZXJhZ2UgaXMgdGhlIHNhbWUgYW5kIHRoZSBkaWZmZXJlbmNlIGlzIG5ldmVyIG1vcmUgdGhhbiB0aGUgICAqLwotLyogIGZyYW1lIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgaEluc3RhbmNlICAgICAgICAtICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBwSW5EYXRhICAgICAgICAgICAgLSAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhIHN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAqcFRvUHJvY2VzcyAgICAgICAgLSAgICBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBkYXRhIHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAqLwotLyogICpwUHJvY2Vzc2VkICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBwcm9jZXNzZWQgZGF0YSAgICAgICAgICAgICovCi0vKiAgICBwTnVtU2FtcGxlcyAgICAgICAgLSAgICBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWTV9CdWZmZXJJbihMVk1fSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICoqcFRvUHJvY2VzcywKLSAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICoqcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICpwTnVtU2FtcGxlcykKLXsKLQotICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotCi0KLSAgICAvKgotICAgICAqIENoZWNrIHdoaWNoIG1vZGUsIG1hbmFnZWQgb3IgdW5tYW5hZ2VkCi0gICAgICovCi0gICAgaWYgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpCi0gICAgewotICAgICAgICBMVk1fQnVmZmVyTWFuYWdlZEluKGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIExWTV9CdWZmZXJVbm1hbmFnZWRJbihoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1TYW1wbGVzKTsKLSAgICB9Ci19Ci0jZWxzZQotdm9pZCBMVk1fQnVmZmVySW4oTFZNX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAqKnBUb1Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAqKnBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAqcE51bVNhbXBsZXMpCi17Ci0KLSAgICBMVk1fSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLQotCi0gICAgLyoKLSAgICAgKiBDaGVjayB3aGljaCBtb2RlLCBtYW5hZ2VkIG9yIHVubWFuYWdlZAotICAgICAqLwotICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQotICAgIHsKLSAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRJbihoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBMVk1fQnVmZmVyVW5tYW5hZ2VkSW4oaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7Ci0gICAgfQotfQotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVk1fQnVmZmVyTWFuYWdlZE91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEZ1bGwgYnVmZmVyIG1hbmFnZW1lbnQgb3V0cHV0LiBUaGlzIHdvcmtzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIG1hbmFnZWQgaW5wdXQgICAgICovCi0vKiAgcm91dGluZSBhbmQgZW5zdXJlcyB0aGUgY29ycmVjdCBudW1iZXIgb2Ygc2FtcGxlcyBhcmUgYWx3YXlzIG91dHB1dCB0byB0aGUgb3V0cHV0ICAgKi8KLS8qICBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIGhJbnN0YW5jZSAgICAgICAgLSBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgcE91dERhdGEgICAgICAgIC0gUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBwTnVtU2FtcGxlcyAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWTV9CdWZmZXJNYW5hZ2VkT3V0KExWTV9IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICpwTnVtU2FtcGxlcykKLXsKLQotICAgIExWTV9JbnN0YW5jZV90ICAqcEluc3RhbmNlICA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZNX0J1ZmZlcl90ICAgICpwQnVmZmVyICAgID0gcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudDsKLSAgICBMVk1fSU5UMTYgICAgICAgU2FtcGxlQ291bnQgPSAoTFZNX0lOVDE2KSpwTnVtU2FtcGxlczsKLSAgICBMVk1fSU5UMTYgICAgICAgTnVtU2FtcGxlczsKLSAgICBMVk1fRkxPQVQgICAgICAgKnBTdGFydDsKLSAgICBMVk1fRkxPQVQgICAgICAgKnBEZXN0OwotCi0KLSAgICAvKgotICAgICAqIFNldCB0aGUgcG9pbnRlcnMKLSAgICAgKi8KLSAgICBOdW1TYW1wbGVzID0gcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0OwotICAgIHBTdGFydCAgICAgPSBwQnVmZmVyLT5wU2NyYXRjaDsKLQotCi0gICAgLyoKLSAgICAgKiBjaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCBvZiBhIGJsb2NrCi0gICAgICAqLwotICAgIGlmICgocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUQ0FMTCkgfHwKLSAgICAgICAgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVExBU1RDQUxMKSkKLSAgICB7Ci0gICAgICAgIC8qIEZpcnN0IGNhbGwgZm9yIGEgbmV3IGJsb2NrICovCi0gICAgICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgPSBwT3V0RGF0YTsgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGRlc3RpbmF0aW9uICovCi0gICAgfQotICAgIHBEZXN0ID0gcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIG91dHB1dCBhZGRyZXNzICovCi0KLQotICAgIC8qCi0gICAgICogSWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vbi16ZXJvIHRoZW4gdGhlcmUgYXJlIHN0aWxsIHNhbXBsZXMgdG8gc2VuZCB0bwotICAgICAqIHRoZSBvdXRwdXQgYnVmZmVyCi0gICAgICovCi0gICAgaWYgKChOdW1TYW1wbGVzICE9IDApICYmCi0gICAgICAgIChwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgIT0gMCkpCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBDb3B5IHRoZSBkZWxheWVkIG91dHB1dCBidWZmZXIgc2FtcGxlcyB0byB0aGUgb3V0cHV0Ci0gICAgICAgICAqLwotICAgICAgICBpZiAocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzIDw9IE51bVNhbXBsZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDb3B5IGFsbCBvdXRwdXQgZGVsYXkgc2FtcGxlcyB0byB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7IC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCi0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcERlc3QgKz0gMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCi0gICAgICAgICAgICBOdW1TYW1wbGVzID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyAtIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyk7IC8qIFNhbXBsZXMgbGVmdCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIHNlbmQgKi8KLSAgICAgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IDA7IC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQ29weSBvbmx5IHNvbWUgb2YgdGhlIG91cHV0IGRlbGF5IHNhbXBsZXMgdG8gdGhlIG91dHB1dAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVyIGFuZCBzYW1wbGUgY291bnRzCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBEZXN0ICs9IDIgKiBOdW1TYW1wbGVzOyAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgIC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCi0gICAgICAgICAgICBwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgLSBOdW1TYW1wbGVzKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFJlYWxpZ24gdGhlIGRlbGF5IGJ1ZmZlciBkYXRhIHRvIGF2b2lkIHVzaW5nIGNpcmN1bGFyIGJ1ZmZlciBtYW5hZ2VtZW50Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzIgKiBOdW1TYW1wbGVzXSwgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOyAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBtb3ZlICovCi0gICAgICAgICAgICBOdW1TYW1wbGVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZXMgbGVmdCB0byBzZW5kICovCi0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogQ29weSB0aGUgcHJvY2Vzc2VkIHJlc3VsdHMgdG8gdGhlIG91dHB1dAotICAgICAqLwotICAgIGlmICgoTnVtU2FtcGxlcyAhPSAwKSAmJgotICAgICAgICAoU2FtcGxlQ291bnQgIT0gMCkpCi0gICAgewotICAgICAgICBpZiAoU2FtcGxlQ291bnQgPD0gTnVtU2FtcGxlcykKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIENvcHkgYWxsIHByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7IC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cwotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwRGVzdCAgICAgICs9IDIgKiBTYW1wbGVDb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLwotICAgICAgICAgICAgTnVtU2FtcGxlcyAgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gU2FtcGxlQ291bnQpOyAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLwotICAgICAgICAgICAgU2FtcGxlQ291bnQgPSAwOyAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIHByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgIC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLwotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlcnMgYW5kIHNhbXBsZSBjb3VudHMKLSAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwU3RhcnQgICAgICArPSAyICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBQcm9jZXNzZWQgc2FtcGxlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgIHBEZXN0ICAgICAgICs9IDIgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLwotICAgICAgICAgICAgU2FtcGxlQ291bnQgID0gKExWTV9JTlQxNikoU2FtcGxlQ291bnQgLSBOdW1TYW1wbGVzKTsgLyogUHJvY2Vzc2VkIHNhbXBsZXMgbGVmdCAqLwotICAgICAgICAgICAgTnVtU2FtcGxlcyAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIHNhbXBsZSBjb3VudCAqLwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIENvcHkgdGhlIHJlbWFpbmluZyBwcm9jZXNzZWQgZGF0YSB0byB0aGUgb3V0cHV0IGRlbGF5IGJ1ZmZlcgotICAgICAqLwotICAgIGlmIChTYW1wbGVDb3VudCAhPSAwKQotICAgIHsKLSAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclsyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzXSwgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KLSAgICAgICAgLyogVXBkYXRlIHRoZSBidWZmZXIgY291bnQgKi8KLSAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gKExWTV9JTlQxNikocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzICsgU2FtcGxlQ291bnQpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogcG9pbnRlcnMsIGNvdW50cyBhbmQgc2V0IGRlZmF1bHQgYnVmZmVyIHByb2Nlc3NpbmcKLSAgICAgKi8KLSAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgID0gTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KLSAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gcERlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCi0gICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgICAgICA9IExWTV9NQVhCTE9DS0NBTEw7ICAgICAgICAgICAgICAgICAgIC8qIFNldCBmb3IgdGhlIGRlZmF1bHQgY2FsbCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgc2l6ZSAqLwotICAgIC8qIFRoaXMgd2lsbCB0ZXJtaW5hdGUgdGhlIGxvb3Agd2hlbiBhbGwgc2FtcGxlcyBwcm9jZXNzZWQgKi8KLSAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7Ci19Ci0jZWxzZQotdm9pZCBMVk1fQnVmZmVyTWFuYWdlZE91dChMVk1fSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAqcE51bVNhbXBsZXMpCi17Ci0KLSAgICBMVk1fSW5zdGFuY2VfdCAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9CdWZmZXJfdCAgICAqcEJ1ZmZlciAgICA9IHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQ7Ci0gICAgTFZNX0lOVDE2ICAgICAgIFNhbXBsZUNvdW50ID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7Ci0gICAgTFZNX0lOVDE2ICAgICAgIE51bVNhbXBsZXM7Ci0gICAgTFZNX0lOVDE2ICAgICAgICpwU3RhcnQ7Ci0gICAgTFZNX0lOVDE2ICAgICAgICpwRGVzdDsKLQotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIHBvaW50ZXJzCi0gICAgICovCi0gICAgTnVtU2FtcGxlcyA9IHBCdWZmZXItPlNhbXBsZXNUb091dHB1dDsKLSAgICBwU3RhcnQgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7Ci0KLQotICAgIC8qCi0gICAgICogY2hlY2sgaWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgb2YgYSBibG9jawotICAgICAgKi8KLSAgICBpZiAoKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9GSVJTVENBTEwpIHx8Ci0gICAgICAgIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkpCi0gICAgewotICAgICAgICAvKiBGaXJzdCBjYWxsIGZvciBhIG5ldyBibG9jayAqLwotICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gcE91dERhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZGVzdGluYXRpb24gKi8KLSAgICB9Ci0gICAgcERlc3QgPSBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIG91dHB1dCBhZGRyZXNzICovCi0KLQotICAgIC8qCi0gICAgICogSWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vbi16ZXJvIHRoZW4gdGhlcmUgYXJlIHN0aWxsIHNhbXBsZXMgdG8gc2VuZCB0bwotICAgICAqIHRoZSBvdXRwdXQgYnVmZmVyCi0gICAgICovCi0gICAgaWYgKChOdW1TYW1wbGVzICE9IDApICYmCi0gICAgICAgIChwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgIT0gMCkpCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBDb3B5IHRoZSBkZWxheWVkIG91dHB1dCBidWZmZXIgc2FtcGxlcyB0byB0aGUgb3V0cHV0Ci0gICAgICAgICAqLwotICAgICAgICBpZiAocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzIDw9IE51bVNhbXBsZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDb3B5IGFsbCBvdXRwdXQgZGVsYXkgc2FtcGxlcyB0byB0aGUgb3V0cHV0Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIENvcHlfMTYoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERldHNpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCi0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcERlc3QgKz0gMipwQnVmZmVyLT5PdXREZWxheVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgIE51bVNhbXBsZXMgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKTsgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KLSAgICAgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KLQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIG9mIHRoZSBvdXB1dCBkZWxheSBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ29weV8xNigmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGV0c2luYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cwotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwRGVzdCArPSAyKk51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IChMVk1fSU5UMTYpKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyAtIE51bVNhbXBsZXMpOyAgICAgIC8qIE5vIHNhbXBsZXMgbGVmdCBpbiB0aGUgYnVmZmVyICovCi0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFJlYWxpZ24gdGhlIGRlbGF5IGJ1ZmZlciBkYXRhIHRvIGF2b2lkIHVzaW5nIGNpcmN1bGFyIGJ1ZmZlciBtYW5hZ2VtZW50Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIENvcHlfMTYoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzIqTnVtU2FtcGxlc10sICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7ICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIG1vdmUgKi8KLSAgICAgICAgICAgIE51bVNhbXBsZXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBDb3B5IHRoZSBwcm9jZXNzZWQgcmVzdWx0cyB0byB0aGUgb3V0cHV0Ci0gICAgICovCi0gICAgaWYgKChOdW1TYW1wbGVzICE9IDApICYmCi0gICAgICAgIChTYW1wbGVDb3VudCAhPSAwKSkKLSAgICB7Ci0gICAgICAgIGlmIChTYW1wbGVDb3VudCA8PSBOdW1TYW1wbGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQ29weSBhbGwgcHJvY2Vzc2VkIHNhbXBsZXMgdG8gdGhlIG91dHB1dAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBDb3B5XzE2KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXRzaW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKlNhbXBsZUNvdW50KSk7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cwotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwRGVzdCAgICAgICs9IDIgKiBTYW1wbGVDb3VudDsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLwotICAgICAgICAgICAgTnVtU2FtcGxlcyAgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gU2FtcGxlQ291bnQpOyAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLwotICAgICAgICAgICAgU2FtcGxlQ291bnQgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIHByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgQ29weV8xNihwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCi0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlcnMgYW5kIHNhbXBsZSBjb3VudHMKLSAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwU3RhcnQgICAgICArPSAyICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFByb2Nlc3NlZCBzYW1wbGUgcG9pbnRlciAqLwotICAgICAgICAgICAgcERlc3QgICAgICAgICs9IDIgKiBOdW1TYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgIFNhbXBsZUNvdW50ICA9IChMVk1fSU5UMTYpKFNhbXBsZUNvdW50IC0gTnVtU2FtcGxlcyk7ICAgLyogUHJvY2Vzc2VkIHNhbXBsZXMgbGVmdCAqLwotICAgICAgICAgICAgTnVtU2FtcGxlcyAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgc2FtcGxlIGNvdW50ICovCi0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogQ29weSB0aGUgcmVtYWluaW5nIHByb2Nlc3NlZCBkYXRhIHRvIHRoZSBvdXRwdXQgZGVsYXkgYnVmZmVyCi0gICAgICovCi0gICAgaWYgKFNhbXBsZUNvdW50ICE9IDApCi0gICAgewotICAgICAgICBDb3B5XzE2KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzIqcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzXSwgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqU2FtcGxlQ291bnQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCi0gICAgICAgIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyA9IChMVk1fSU5UMTYpKHBCdWZmZXItPk91dERlbGF5U2FtcGxlcyArIFNhbXBsZUNvdW50KTsgLyogVXBkYXRlIHRoZSBidWZmZXIgY291bnQgKi8KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogcG9pbnRlcnMsIGNvdW50cyBhbmQgc2V0IGRlZmF1bHQgYnVmZmVyIHByb2Nlc3NpbmcKLSAgICAgKi8KLSAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgID0gTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KLSAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gcERlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCi0gICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgICAgICA9IExWTV9NQVhCTE9DS0NBTEw7ICAgICAgICAgICAgICAgICAgIC8qIFNldCBmb3IgdGhlIGRlZmF1bHQgY2FsbCBibG9jayBzaXplICovCi0gICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOyAgICAgICAgIC8qIFRoaXMgd2lsbCB0ZXJtaW5hdGUgdGhlIGxvb3Agd2hlbiBhbGwgc2FtcGxlcyBwcm9jZXNzZWQgKi8KLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVk1fQnVmZmVyVW5tYW5hZ2VkT3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgdW5tYW5hZ2VkIGlucHV0IHJvdXRpbmUgYW5kIHVwZGF0ZXMgdGhlIG51bWJlciAgICovCi0vKiAgICBvZiBzYW1wbGVzIGxlZnQgdG8gYmUgcHJvY2Vzc2VkICAgIGFuZCBhZGp1c3RzIHRoZSBidWZmZXIgcG9pbnRlcnMuICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBoSW5zdGFuY2UgICAgICAgIC0gSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIHBOdW1TYW1wbGVzICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgTFZNX0J1ZmZlclVubWFuYWdlZE91dChMVk1fSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICpwTnVtU2FtcGxlcykKLXsKLQotICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMgPTI7Ci0KLQotICAgIC8qCi0gICAgICogVXBkYXRlIHNhbXBsZSBjb3VudHMKLSAgICAgKi8KLSAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgKz0gKExWTV9JTlQxNikoKnBOdW1TYW1wbGVzICogTnVtQ2hhbm5lbHMpOyAvKiBVcGRhdGUgdGhlIEkvTyBwb2ludGVycyAqLwotICAgIHBJbnN0YW5jZS0+cE91dHB1dFNhbXBsZXMgICArPSAoTFZNX0lOVDE2KSgqcE51bVNhbXBsZXMgKiAyKTsKLSAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgID0gKExWTV9JTlQxNikocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzIC0gKnBOdW1TYW1wbGVzKTsgLyogVXBkYXRlIHRoZSBzYW1wbGUgY291bnQgKi8KLQotICAgIC8qCi0gICAgICogU2V0IHRlIGJsb2NrIHNpemUgdG8gcHJvY2VzcwotICAgICAqLwotICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPiBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplKQotICAgIHsKLSAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOwotICAgIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVk1fQnVmZmVyT3B0aW1pc2VkT3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgd29ya3MgaW4gY29uanVuY3Rpb24gd2l0aCB0aGUgb3B0aW1pc2VkIGlucHV0IHJvdXRpbmUgYW5kIGNvcGllcyB0aGUgbGFzdCBmZXcgICovCi0vKiAgcHJvY2Vzc2VkIGFuZCB1bnByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZWlyIHJlc3BlY3RpdmUgYnVmZmVycy4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBoSW5zdGFuY2UgICAgICAgIC0gSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIHBOdW1TYW1wbGVzICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZm5kZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZNX0J1ZmZlck9wdGltaXNlZE91dChMVk1fSGFuZGxlX3QgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICpwTnVtU2FtcGxlcykKLXsKLQotICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZNX0J1ZmZlcl90ICAgICAgICAqcEJ1ZmZlciAgID0gcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudDsKLQotICAgIC8qCi0gICAgICogQ2hlY2sgaWYgaXQgaXMgdGhlIGxhc3QgYmxvY2sgdG8gcHJvY2VzcwotICAgICAqLwotICAgIGlmIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fTEFTVENBTEwpCi0gICAgewotICAgICAgICBMVk1fSU5UMTYgICAgKnBTcmMgPSBwQnVmZmVyLT5wU2NyYXRjaDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDb3B5IHRoZSB1bnByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBpbnB1dCBkZWxheSBidWZmZXIKLSAgICAgICAgICovCi0gICAgICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgQ29weV8xNihwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMsICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPkluRGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MpKTsgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KLSAgICAgICAgICAgIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzID0gcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOwotICAgICAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzID0gMDsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogRmlsbCB0aGUgbGFzdCBlbXB0eSBzcGFjZXMgaW4gdGhlIG91dHB1dCBidWZmZXIKLSAgICAgICAgICovCi0gICAgICAgIGlmIChwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgQ29weV8xNihwU3JjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcywgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQpKTsgICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KLSAgICAgICAgICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KSgqcE51bVNhbXBsZXMgLSBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQpOwotICAgICAgICAgICAgcFNyYyArPSAyICogcEJ1ZmZlci0+U2FtcGxlc1RvT3V0cHV0OyAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBzY3JhdGNoIHBvaW50ZXIgKi8KLSAgICAgICAgICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBtb3JlIHNhbXBsZXMgaW4gdGhpcyBibG9jayAqLwotICAgICAgICB9Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBTYXZlIGFueSByZW1haW5pbmcgcHJvY2Vzc2VkIHNhbXBsZXMgaW4gdGhlIG91dHB1dCBkZWxheSBidWZmZXIKLSAgICAgICAgICovCi0gICAgICAgIGlmICgqcE51bVNhbXBsZXMgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgQ29weV8xNihwU3JjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMioqcE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KLQotICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7Ci0KLSAgICAgICAgICAgICpwTnVtU2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBObyBtb3JlIHNhbXBsZXMgaW4gdGhpcyBibG9jayAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gMDsKLSAgICAgICAgfQotICAgIH0KLX0KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVk1fQnVmZmVyT3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gbWFuYWdlcyB0aGUgZGF0YSBvdXRwdXQsIGl0IGhhcyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOiAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgLSBPdXRwdXQgZGF0YSB0byAxNi1iaXQgYWxpZ25lZCBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAtIFJlYWRzIGRhdGEgZnJvbSAzMi1iaXQgYWxpZ25lZCBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIC0gUmVhZHMgZGF0YSBvbmx5IGluIGJsb2NrcyBvZiBmcmFtZSBzaXplIG9yIG11bHRpcGxlcyBvZiBmcmFtZSBzaXplICAgICAgICAgICovCi0vKiAgICAgICAgLSBXcml0ZXMgdGhlIHNhbWUgbnVtYmVyIG9mIHNhbXBsZXMgYXMgdGhlIExWTV9CdWZmZXJJbiBmdW5jdGlvbiByZWFkcyAgICAgICAgKi8KLS8qICAgICAgICAtIFdvcmtzIHdpdGggaW5wbGFjZSBvciBvdXRwbGFjZSBwcm9jZXNzaW5nIGF1dG9tYXRpY2FsbHkgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVG8gbWFuYWdlIHRoZSBkYXRhIHRoZSBmdW5jdGlvbiBoYXMgYSBudW1iZXIgb2Ygb3BlcmF0aW5nIHN0YXRlczogICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBMVk1fRklSU1RDQUxMICAgICAgICAtIFRoZSBmaXJzdCBjYWxsIGZvciB0aGlzIGJsb2NrIG9mIGlucHV0IHNhbXBsZXMgICAgICAgICAqLwotLyogICAgICAgIExWTV9GSVJTVExBU1RDQUxMICAgIC0gVGhpcyBpcyB0aGUgZmlyc3QgYW5kIGxhc3QgY2FsbCBmb3IgdGhpcyBibG9jayBvZiBpbnB1dCovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsIHRoaXMgb2NjdXJzIHdoZW4gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyBpcyBsZXNzIHRoYW4gdGhlIG1heGltdW0gYmxvY2sgc2l6ZS4gICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgZnVuY3Rpb24gdXNlcyBhbiBpbnRlcm5hbCBkZWxheSBidWZmZXIgdGhlIHNpemUgb2YgdGhlIG1pbmltdW0gZnJhbWUsIHRoaXMgaXMgKi8KLS8qICB1c2VkIHRvIHRlbXBvcmFyaWx5IGhvbGQgc2FtcGxlcyB3aGVuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byB3cml0ZSBpcyBub3QgYSAgICAgICAqLwotLyogIG11bHRpcGxlIG9mIHRoZSBmcmFtZSBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIFRvIGVuc3VyZSBjb3JyZWN0IG9wZXJhdGlvbiB3aXRoIGlucGxhY2UgYnVmZmVyaW5nIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBvdXRwdXQqLwotLyogIHBlciBjYWxsIGlzIGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcmVhZCBmcm9tIHRoZSBpbnB1dCBidWZmZXIuICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgaEluc3RhbmNlICAgICAgICAtIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBwT3V0RGF0YSAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSBzdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIHBOdW1TYW1wbGVzICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZNX0J1ZmZlck91dChMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcykKLXsKLQotICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLQotCi0gICAgLyoKLSAgICAgKiBDaGVjayB3aGljaCBtb2RlLCBtYW5hZ2VkIG9yIHVubWFuYWdlZAotICAgICAqLwotICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQotICAgIHsKLSAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRPdXQoaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBMVk1fQnVmZmVyVW5tYW5hZ2VkT3V0KGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7Ci0gICAgfQotfQotI2Vsc2UKLXZvaWQgTFZNX0J1ZmZlck91dChMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcykKLXsKLQotICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLQotCi0gICAgLyoKLSAgICAgKiBDaGVjayB3aGljaCBtb2RlLCBtYW5hZ2VkIG9yIHVubWFuYWdlZAotICAgICAqLwotICAgIGlmIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQotICAgIHsKLSAgICAgICAgTFZNX0J1ZmZlck1hbmFnZWRPdXQoaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE51bVNhbXBsZXMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBMVk1fQnVmZmVyVW5tYW5hZ2VkT3V0KGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7Ci0gICAgfQotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQnVmZmVycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlZGRiYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9CdWZmZXJzLmNwcApAQCAtMCwwICsxLDcyMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZNX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWTV9CdWZmZXJNYW5hZ2VkSW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBGdWxsIGJ1ZmZlciBtYW5hZ2VtZW50IGFsbG93aW5nIHRoZSB1c2VyIHRvIHByb3ZpZGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG9uICAgKi8KKy8qICBhbnkgYWxpZ25tZW50IGFuZCB3aXRoIGFueSBudW1iZXIgb2Ygc2FtcGxlcy4gVGhlIGFsaWdubWVudCBpcyBjb3JyZWN0ZWQgd2l0aGluICAgICAqLworLyogIHRoZSBidWZmZXIgbWFuYWdlbWVudCBhbmQgdGhlIHNhbXBsZXMgYXJlIGdyb3VwZWQgaW4gdG8gYmxvY2tzIG9mIHRoZSBjb3JyZWN0IHNpemUgICovCisvKiAgYmVmb3JlIHByb2Nlc3NpbmcuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBoSW5zdGFuY2UgICAgICAgIC0gICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBJbkRhdGEgICAgICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICpwVG9Qcm9jZXNzICAgICAgICAtICAgIFBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgZGF0YSBwcm9jZXNzaW5nICAgICAgICAgICovCisvKiAgKnBQcm9jZXNzZWQgICAgICAgIC0gICAgUG9pbnRlciB0byBwb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcHJvY2Vzc2VkIGRhdGEgKi8KKy8qICAgIHBOdW1TYW1wbGVzICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIExWTV9CdWZmZXJNYW5hZ2VkSW4oTFZNX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICoqcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgKipwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAqcE51bVNhbXBsZXMpCit7CisKKyAgICBMVk1fSU5UMTYgICAgICAgIFNhbXBsZUNvdW50OyAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gYmUgcHJvY2Vzc2VkIHRoaXMgY2FsbCAqLworICAgIExWTV9JTlQxNiAgICAgICAgTnVtU2FtcGxlczsgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyBpbiBzY3JhdGNoIGJ1ZmZlciAqLworICAgIExWTV9GTE9BVCAgICAgICAgKnBTdGFydDsKKyAgICBMVk1fSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9CdWZmZXJfdCAgICAgKnBCdWZmZXI7CisgICAgTFZNX0ZMT0FUICAgICAgICAqcERlc3Q7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQxNiAgICAgICAgTnVtQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CisjZWxzZQorICAgIExWTV9JTlQxNiAgICAgICAgTnVtQ2hhbm5lbHMgPSAyOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgcHJvY2Vzc2luZyBhZGRyZXNzIHBvaW50ZXJzCisgICAgICovCisgICAgcEJ1ZmZlciAgICAgPSBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50OworICAgIHBEZXN0ICAgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CisgICAgKnBUb1Byb2Nlc3MgPSBwQnVmZmVyLT5wU2NyYXRjaDsKKyAgICAqcFByb2Nlc3NlZCA9IHBCdWZmZXItPnBTY3JhdGNoOworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCBvZiBhIGJsb2NrCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9PSAwKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogRmlyc3QgY2FsbCBmb3IgYSBuZXcgYmxvY2sgb2Ygc2FtcGxlcworICAgICAgICAgKi8KKyAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gKExWTV9JTlQxNikoKnBOdW1TYW1wbGVzICsgcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMpOworICAgICAgICBwSW5zdGFuY2UtPnBJbnB1dFNhbXBsZXMgICAgPSAoTFZNX0ZMT0FUICopcEluRGF0YTsKKyAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgICAgICAgID0gTFZNX0ZJUlNUQ0FMTDsKKyAgICB9CisgICAgcFN0YXJ0ID0gcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzOyAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgc2FtcGxlcyAqLworICAgIHBCdWZmZXItPlNhbXBsZXNUb091dHB1dCAgPSAwOyAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZXMgdG8gb3V0cHV0IGlzIHNhbWUgYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIgcmVhZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyB0aGlzIGNhbGwgYW5kIHVwZGF0ZSB0aGUgYnVmZmVyIHN0YXRlCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA+IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemUpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBQcm9jZXNzIHRoZSBtYXhpbXVtIGJvY2sgc2l6ZSBvZiBzYW1wbGVzLgorICAgICAgICAgKi8KKyAgICAgICAgU2FtcGxlQ291bnQgPSBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplOworICAgICAgICBOdW1TYW1wbGVzICA9IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemU7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIExhc3QgY2FsbCBmb3IgdGhlIGJsb2NrLCBzbyBjYWxjdWxhdGUgaG93IG1hbnkgZnJhbWVzIGFuZCBzYW1wbGVzIHRvIHByb2Nlc3MKKyAgICAgICAgICAqLworICAgICAgICBMVk1fSU5UMTYgICBOdW1GcmFtZXM7CisKKyAgICAgICAgTnVtU2FtcGxlcyAgPSBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7CisgICAgICAgIE51bUZyYW1lcyAgICA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPj4gTUlOX0lOVEVSTkFMX0JMT0NLU0hJRlQpOworICAgICAgICBTYW1wbGVDb3VudCA9IChMVk1fSU5UMTYpKE51bUZyYW1lcyA8PCBNSU5fSU5URVJOQUxfQkxPQ0tTSElGVCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBidWZmZXIgc3RhdGUKKyAgICAgICAgICovCisgICAgICAgIGlmIChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RDQUxMKQorICAgICAgICB7CisgICAgICAgICAgICBwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9IExWTV9GSVJTVExBU1RDQUxMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgPSBMVk1fTEFTVENBTEw7CisgICAgICAgIH0KKyAgICB9CisgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpU2FtcGxlQ291bnQ7ICAvKiBTZXQgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgdGhpcyBjYWxsICovCisKKyAgICAvKgorICAgICAqIENvcHkgc2FtcGxlcyBmcm9tIHRoZSBkZWxheSBidWZmZXIgYXMgcmVxdWlyZWQKKyAgICAgKi8KKyAgICBpZiAoKChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RDQUxMKSB8fAorICAgICAgICAocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUTEFTVENBTEwpKSAmJgorICAgICAgICAocEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMgIT0gMCkpCisgICAgeworICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5JbkRlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bUNoYW5uZWxzICogcEJ1ZmZlci0+SW5EZWxheVNhbXBsZXMpKTsgICAgLyogTnVtYmVyIG9mIGRlbGF5IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcywgbGVmdCBhbmQgcmlnaHQgKi8KKyAgICAgICAgTnVtU2FtcGxlcyA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgLSBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlcyk7IC8qIFVwZGF0ZSBzYW1wbGUgY291bnQgKi8KKyAgICAgICAgcERlc3QgKz0gTnVtQ2hhbm5lbHMgKiBwQnVmZmVyLT5JbkRlbGF5U2FtcGxlczsgICAgICAvKiBVcGRhdGUgdGhlIGRlc3RpbmF0aW9uIHBvaW50ZXIgKi8KKyAgICB9CisKKyAgICAvKgorICAgICAqIENvcHkgdGhlIHJlc3Qgb2YgdGhlIHNhbXBsZXMgZm9yIHRoaXMgY2FsbCBmcm9tIHRoZSBpbnB1dCBidWZmZXIKKyAgICAgKi8KKyAgICBpZiAoTnVtU2FtcGxlcyA+IDApCisgICAgeworICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtQ2hhbm5lbHMgKiBOdW1TYW1wbGVzKSk7ICAgICAgLyogTnVtYmVyIG9mIGlucHV0IHNhbXBsZXMgKi8KKyAgICAgICAgcFN0YXJ0ICs9IE51bUNoYW5uZWxzICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgdGhlIGlucHV0IHBvaW50ZXIgKi8KKworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIGlucHV0IGRhdGEgcG9pbnRlciBhbmQgc2FtcGxlcyB0byBvdXRwdXQKKyAgICAgICAgICovCisgICAgICAgIC8qIFVwZGF0ZSBzYW1wbGVzIHRvIG91dHB1dCAqLworICAgICAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgPSAoTFZNX0lOVDE2KShwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgKyBOdW1TYW1wbGVzKTsKKyAgICB9CisKKyAgICAvKgorICAgICAgKiBVcGRhdGUgdGhlIHNhbXBsZSBjb3VudCBhbmQgaW5wdXQgcG9pbnRlcgorICAgICAqLworICAgIC8qIFVwZGF0ZSB0aGUgY291bnQgb2Ygc2FtcGxlcyAqLworICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyAgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgLSBTYW1wbGVDb3VudCk7CisgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgICA9IHBTdGFydDsgLyogVXBkYXRlIGlucHV0IHNhbXBsZSBwb2ludGVyICovCisKKyAgICAvKgorICAgICAqIFNhdmUgc2FtcGxlcyB0byB0aGUgZGVsYXkgYnVmZmVyIGlmIGFueSBsZWZ0IHVucHJvY2Vzc2VkCisgICAgICovCisgICAgaWYgKChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RMQVNUQ0FMTCkgfHwKKyAgICAgICAgKHBCdWZmZXItPkJ1ZmZlclN0YXRlID09IExWTV9MQVNUQ0FMTCkpCisgICAgeworICAgICAgICBOdW1TYW1wbGVzID0gcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworICAgICAgICBwU3RhcnQgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdGFydCBvZiB0aGUgYnVmZmVyICovCisgICAgICAgIHBTdGFydCAgICArPSBOdW1DaGFubmVscyAqIFNhbXBsZUNvdW50OyAvKiBPZmZzZXQgYnkgdGhlIG51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworICAgICAgICBpZiAoTnVtU2FtcGxlcyAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+SW5EZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1DaGFubmVscyAqIE51bVNhbXBsZXMpKTsgICAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBkZWxheSBzYW1wbGUgY291bnQKKyAgICAgICAgICovCisgICAgICAgIHBCdWZmZXItPkluRGVsYXlTYW1wbGVzICAgICA9IE51bVNhbXBsZXM7ICAgICAgIC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGUgcGFpcnMgKi8KKyAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWxsIFNhbXBsZXMgdXNlZCAqLworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlclVubWFuYWdlZEluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgbW9kZSBpcyBzZWxlY3RlZCBieSB0aGUgdXNlciBjb2RlIGFuZCBkaXNhYmxlcyB0aGUgYnVmZmVyIG1hbmFnZW1lbnQgd2l0aCB0aGUgKi8KKy8qICBleGNlcHRpb24gb2YgdGhlIG1heGltdW0gYmxvY2sgc2l6ZSBwcm9jZXNzaW5nLiBUaGUgdXNlciBtdXN0IGVuc3VyZSB0aGF0IHRoZSAgICAgICAqLworLyogIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBhcmUgMzItYml0IGFsaWduZWQgYW5kIGFsc28gdGhhdCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gICovCisvKiAgICBwcm9jZXNzIGlzIGEgY29ycmVjdCBtdWx0aXBsZSBvZiBzYW1wbGVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBoSW5zdGFuY2UgICAgICAgIC0gICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqcFRvUHJvY2VzcyAgICAgICAgLSAgICBQb2ludGVyIHRvIHRoZSBzdGFydCBvZiBkYXRhIHByb2Nlc3NpbmcgICAgICAgICAgICAgICAgICAgICAqLworLyogICpwUHJvY2Vzc2VkICAgICAgICAtICAgIFBvaW50ZXIgdG8gdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBwcm9jZXNzZWQgZGF0YSAgICAgICAgICAgICovCisvKiAgICBwTnVtU2FtcGxlcyAgICAgICAgLSAgICBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVk1fQnVmZmVyVW5tYW5hZ2VkSW4oTFZNX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICoqcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKipwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAqcE51bVNhbXBsZXMpCit7CisKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhpcyBpcyB0aGUgZmlyc3QgY2FsbCBvZiBhIGJsb2NrCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9PSAwKQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7ICAgIC8qIEdldCB0aGUgbnVtYmVyIG9mIHNhbXBsZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbiBmaXJzdCBjYWxsICovCisgICAgICAgIHBJbnN0YW5jZS0+cElucHV0U2FtcGxlcyAgICA9ICpwVG9Qcm9jZXNzOyAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIEkvTyBwb2ludGVycyAqLworICAgICAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzICAgID0gKnBQcm9jZXNzZWQ7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0IHRlIGJsb2NrIHNpemUgdG8gcHJvY2VzcworICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA+IHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemUpCisgICAgICAgIHsKKyAgICAgICAgICAgICpwTnVtU2FtcGxlcyA9IChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgcHJvY2VzcyBwb2ludGVycworICAgICAqLworICAgICpwVG9Qcm9jZXNzID0gcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzOworICAgICpwUHJvY2Vzc2VkID0gcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlczsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlck9wdGltaXNlZEluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE9wdGltaXNlZCBidWZmZXIgbWFuYWdlbWVudCBmb3IgdGhlIGNhc2Ugd2hlcmUgdGhlIGRhdGEgaXMgb3V0cGxhY2UgcHJvY2Vzc2luZywgICAqLworLyogICAgdGhlIG91dHB1dCBkYXRhIGlzIDMyLWJpdCBhbGlnbmVkIGFuZCB0aGVyZSBhcmUgc3VmZmljaWVudCBzYW1wbGVzIHRvIGFsbG93IHNvbWUgICovCisvKiAgICBwcm9jZXNzaW5nIGRpcmVjdGx5IGluIHRoZSBvdXRwdXQgYnVmZmVyLiBUaGlzIHNhdmVzIG9uZSBkYXRhIGNvcHkgcGVyIHNhbXBsZSAgICAgKi8KKy8qICAgIGNvbXBhcmVkIHdpdGggdGhlIHVub3B0aW1zZWQgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIGhJbnN0YW5jZSAgICAgICAgLSAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgcEluRGF0YSAgICAgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSBzdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgKnBUb1Byb2Nlc3MgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgZGF0YSBwcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqcFByb2Nlc3NlZCAgICAgICAgLSAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcHJvY2Vzc2VkIGRhdGEgICAgICAgICAgICAqLworLyogICAgcE51bVNhbXBsZXMgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlckluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgZnVuY3Rpb24gbWFuYWdlcyB0aGUgZGF0YSBpbnB1dCwgaXQgaGFzIHRoZSBmb2xsb3dpbmcgZmVhdHVyZXM6ICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gQWNjZXB0cyBkYXRhIGluIDE2LWJpdCBhbGlnbmVkIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgLSBDb3BpZXMgdGhlIGRhdGEgdG8gMzItYml0IGFsaWduZWQgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIENvbnZlcnRzIE1vbm8gaW5wdXRzIHRvIE1vbm8taW4tU3RlcmVvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gQWNjZXB0cyBhbnkgbnVtYmVyIG9mIHNhbXBsZXMgYXMgaW5wdXQsIGV4Y2VwdCAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgLSBCcmVha3MgdGhlIGlucHV0IHNhbXBsZSBzdHJlYW0gaW4gdG8gYmxvY2tzIG9mIHRoZSBjb25maWd1cmVkIGZyYW1lIHNpemUgb3IgKi8KKy8qICAgICAgICAgIG11bHRpcGxlcyBvZiB0aGUgZnJhbWUgc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gTGltaXRzIHRoZSBwcm9jZXNzaW5nIGJsb2NrIHNpemUgdG8gdGhlIG1heGltdW0gYmxvY2sgc2l6ZS4gICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgLSBXb3JrcyB3aXRoIGlucGxhY2Ugb3Igb3V0cGxhY2UgcHJvY2Vzc2luZyBhdXRvbWF0aWNhbGx5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRvIG1hbmFnZSB0aGUgZGF0YSB0aGUgZnVuY3Rpb24gaGFzIGEgbnVtYmVyIG9mIG9wZXJhdGluZyBzdGF0ZXM6ICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgTFZNX0ZJUlNUQ0FMTCAgICAgICAgLSBUaGUgZmlyc3QgY2FsbCBmb3IgdGhpcyBibG9jayBvZiBpbnB1dCBzYW1wbGVzICAgICAgICAgKi8KKy8qICAgICAgICBMVk1fTUFYQkxPQ0tDQUxMICAgIC0gVGhlIGN1cnJlbnQgYmxvY2sgaXMgdGhlIG1heGltdW0gc2l6ZS4gT25seSB1c2VkIGZvciB0aGUgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kIGFuZCBzdWJzZXF1ZW50IGJsb2Nrcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIExWTV9MQVNUQ0FMTCAgICAgICAgLSBUaGUgbGFzdCBjYWxsIGZvciB0aGlzIGJsb2NrIG9mIGlucHV0IHNhbXBsZXMgICAgICAgICAgICovCisvKiAgICAgICAgTFZNX0ZJUlNUTEFTVENBTEwgICAgLSBUaGlzIGlzIHRoZSBmaXJzdCBhbmQgbGFzdCBjYWxsIGZvciB0aGlzIGJsb2NrIG9mIGlucHV0Ki8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcywgdGhpcyBvY2N1cnMgd2hlbiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzIGlzIGxlc3MgdGhhbiB0aGUgbWF4aW11bSBibG9jayBzaXplLiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoZSBmdW5jdGlvbiB1c2VzIGFuIGludGVybmFsIGRlbGF5IGJ1ZmZlciB0aGUgc2l6ZSBvZiB0aGUgbWluaW11bSBmcmFtZSwgdGhpcyBpcyAqLworLyogIHVzZWQgdG8gdGVtcG9yYXJpbHkgaG9sZCBzYW1wbGVzIHdoZW4gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgaXMgbm90IGEgICAgICovCisvKiAgbXVsdGlwbGUgb2YgdGhlIGZyYW1lIHNpemUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVG8gZW5zdXJlIGNvcnJlY3Qgb3BlcmF0aW9uIHdpdGggaW5wbGFjZSBidWZmZXJpbmcgdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIG91dHB1dCovCisvKiAgcGVyIGNhbGwgaXMgY2FsY3VsYXRlZCBpbiB0aGlzIGZ1bmN0aW9uIGFuZCBpcyBzZXQgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHJlYWQgICAgKi8KKy8qICBmcm9tIHRoZSBpbnB1dCBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgdG90YWwgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyBpcyBzdG9yZWQgd2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciAgKi8KKy8qICB0aGUgZmlyc3QgdGltZS4gVGhlIHZhbHVlIGlzIG92ZXJ3cml0dGVuIGJ5IHRoZSBzaXplIG9mIHRoZSBibG9jayB0byBiZSBwcm9jZXNzZWQgICAqLworLyogIGluIGVhY2ggY2FsbCBzbyB0aGUgc2l6ZSBvZiB0aGUgcHJvY2Vzc2luZyBibG9ja3MgY2FuIGJlIGNvbnRyb2xsZWQuIFRoZSBudW1iZXIgb2YgICovCisvKiAgICBzYW1wbGVzIGFjdHVhbGx5IHByb2Nlc3NlZCBmb3IgZWFjaCBibG9jayBvZiBpbnB1dCBzYW1wbGVzIGlzIGFsd2F5cyBhIG11bHRpcGxlIG9mKi8KKy8qICB0aGUgZnJhbWUgc2l6ZSBzbyBmb3IgYW55IHBhcnRpY3VsYXIgYmxvY2sgb2YgaW5wdXQgc2FtcGxlcyB0aGUgYWN0dWFsIG51bWJlciBvZiAgICAqLworLyogIHByb2Nlc3NlZCBzYW1wbGVzIG1heSBub3QgbWF0Y2ggdGhlIG51bWJlciBvZiBpbnB1dCBzYW1wbGVzLCBzb21ldGltZSBpdCB3aWxsIGJlICAgICovCisvKiAgc29tZXRpbWVzIGxlc3MuIFRoZSBhdmVyYWdlIGlzIHRoZSBzYW1lIGFuZCB0aGUgZGlmZmVyZW5jZSBpcyBuZXZlciBtb3JlIHRoYW4gdGhlICAgKi8KKy8qICBmcmFtZSBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIGhJbnN0YW5jZSAgICAgICAgLSAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgcEluRGF0YSAgICAgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSBzdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgKnBUb1Byb2Nlc3MgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgc3RhcnQgb2YgZGF0YSBwcm9jZXNzaW5nICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAqcFByb2Nlc3NlZCAgICAgICAgLSAgICBQb2ludGVyIHRvIHRoZSBkZXN0aW5hdGlvbiBvZiB0aGUgcHJvY2Vzc2VkIGRhdGEgICAgICAgICAgICAqLworLyogICAgcE51bVNhbXBsZXMgICAgICAgIC0gICAgUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZNX0J1ZmZlckluKExWTV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgKipwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgKipwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKQoreworCisgICAgTFZNX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKyAgICAvKgorICAgICAqIENoZWNrIHdoaWNoIG1vZGUsIG1hbmFnZWQgb3IgdW5tYW5hZ2VkCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpCisgICAgeworICAgICAgICBMVk1fQnVmZmVyTWFuYWdlZEluKGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIExWTV9CdWZmZXJVbm1hbmFnZWRJbihoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1TYW1wbGVzKTsKKyAgICB9Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVk1fQnVmZmVyTWFuYWdlZE91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEZ1bGwgYnVmZmVyIG1hbmFnZW1lbnQgb3V0cHV0LiBUaGlzIHdvcmtzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIG1hbmFnZWQgaW5wdXQgICAgICovCisvKiAgcm91dGluZSBhbmQgZW5zdXJlcyB0aGUgY29ycmVjdCBudW1iZXIgb2Ygc2FtcGxlcyBhcmUgYWx3YXlzIG91dHB1dCB0byB0aGUgb3V0cHV0ICAgKi8KKy8qICBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIGhJbnN0YW5jZSAgICAgICAgLSBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgcE91dERhdGEgICAgICAgIC0gUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgc3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBwTnVtU2FtcGxlcyAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVk1fQnVmZmVyTWFuYWdlZE91dChMVk1fSGFuZGxlX3QgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAqcE51bVNhbXBsZXMpCit7CisKKyAgICBMVk1fSW5zdGFuY2VfdCAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9CdWZmZXJfdCAgICAqcEJ1ZmZlciAgICA9IHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQ7CisgICAgTFZNX0lOVDE2ICAgICAgIFNhbXBsZUNvdW50ID0gKExWTV9JTlQxNikqcE51bVNhbXBsZXM7CisgICAgTFZNX0lOVDE2ICAgICAgIE51bVNhbXBsZXM7CisgICAgTFZNX0ZMT0FUICAgICAgICpwU3RhcnQ7CisgICAgTFZNX0ZMT0FUICAgICAgICpwRGVzdDsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDMyICAgICAgIE5yQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CisjZGVmaW5lIE5yRnJhbWVzIE51bVNhbXBsZXMgIC8vIGFsaWFzIGZvciBjbGFyaXR5CisjZGVmaW5lIEZyYW1lQ291bnQgU2FtcGxlQ291bnQKKyNlbmRpZgorCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIHBvaW50ZXJzCisgICAgICovCisgICAgTnVtU2FtcGxlcyA9IHBCdWZmZXItPlNhbXBsZXNUb091dHB1dDsKKyAgICBwU3RhcnQgICAgID0gcEJ1ZmZlci0+cFNjcmF0Y2g7CisKKyAgICAvKgorICAgICAqIGNoZWNrIGlmIGl0IGlzIHRoZSBmaXJzdCBjYWxsIG9mIGEgYmxvY2sKKyAgICAgICovCisgICAgaWYgKChwQnVmZmVyLT5CdWZmZXJTdGF0ZSA9PSBMVk1fRklSU1RDQUxMKSB8fAorICAgICAgICAocEJ1ZmZlci0+QnVmZmVyU3RhdGUgPT0gTFZNX0ZJUlNUTEFTVENBTEwpKQorICAgIHsKKyAgICAgICAgLyogRmlyc3QgY2FsbCBmb3IgYSBuZXcgYmxvY2sgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyA9IHBPdXREYXRhOyAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZGVzdGluYXRpb24gKi8KKyAgICB9CisgICAgcERlc3QgPSBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgb3V0cHV0IGFkZHJlc3MgKi8KKworICAgIC8qCisgICAgICogSWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vbi16ZXJvIHRoZW4gdGhlcmUgYXJlIHN0aWxsIHNhbXBsZXMgdG8gc2VuZCB0bworICAgICAqIHRoZSBvdXRwdXQgYnVmZmVyCisgICAgICovCisgICAgaWYgKChOdW1TYW1wbGVzICE9IDApICYmCisgICAgICAgIChwQnVmZmVyLT5PdXREZWxheVNhbXBsZXMgIT0gMCkpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDb3B5IHRoZSBkZWxheWVkIG91dHB1dCBidWZmZXIgc2FtcGxlcyB0byB0aGUgb3V0cHV0CisgICAgICAgICAqLworICAgICAgICBpZiAocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzIDw9IE51bVNhbXBsZXMpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb3B5IGFsbCBvdXRwdXQgZGVsYXkgc2FtcGxlcyB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlcykpOworI2Vsc2UKKyAgICAgICAgICAgIENvcHlfRmxvYXQoJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7IC8qIE51bWJlciBvZiBkZWxheSBzYW1wbGVzICovCisjZW5kaWYKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgcG9pbnRlciBhbmQgc2FtcGxlIGNvdW50cworICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgcERlc3QgKz0gTnJDaGFubmVscyAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZWxzZQorICAgICAgICAgICAgcERlc3QgKz0gMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZW5kaWYKKyAgICAgICAgICAgIE51bVNhbXBsZXMgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKTsgLyogU2FtcGxlcyBsZWZ0IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2VuZCAqLworICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gMDsgLyogTm8gc2FtcGxlcyBsZWZ0IGluIHRoZSBidWZmZXIgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDb3B5IG9ubHkgc29tZSBvZiB0aGUgb3VwdXQgZGVsYXkgc2FtcGxlcyB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogTnJGcmFtZXMpKTsgICAgICAgLyogTnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKyNlbHNlCisgICAgICAgICAgICBDb3B5X0Zsb2F0KCZwQnVmZmVyLT5PdXREZWxheUJ1ZmZlclswXSwgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwRGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAvKiBOdW1iZXIgb2YgZGVsYXkgc2FtcGxlcyAqLworI2VuZGlmCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIHBvaW50ZXIgYW5kIHNhbXBsZSBjb3VudHMKKyAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIHBEZXN0ICs9IE5yQ2hhbm5lbHMgKiBOckZyYW1lczsgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZWxzZQorICAgICAgICAgICAgcERlc3QgKz0gMiAqIE51bVNhbXBsZXM7IC8qIE91dHB1dCBzYW1wbGUgcG9pbnRlciAqLworI2VuZGlmCisgICAgICAgICAgICAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLworICAgICAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gKExWTV9JTlQxNikocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzIC0gTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSZWFsaWduIHRoZSBkZWxheSBidWZmZXIgZGF0YSB0byBhdm9pZCB1c2luZyBjaXJjdWxhciBidWZmZXIgbWFuYWdlbWVudAorICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbTnJDaGFubmVscyAqIE5yRnJhbWVzXSwgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgJnBCdWZmZXItPk91dERlbGF5QnVmZmVyWzBdLCAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gbW92ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7CisjZWxzZQorICAgICAgICAgICAgQ29weV9GbG9hdCgmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMiAqIE51bVNhbXBsZXNdLCAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMF0sICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzKSk7IC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIG1vdmUgKi8KKyNlbmRpZgorICAgICAgICAgICAgTnVtU2FtcGxlcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSBwcm9jZXNzZWQgcmVzdWx0cyB0byB0aGUgb3V0cHV0CisgICAgICovCisgICAgaWYgKChOdW1TYW1wbGVzICE9IDApICYmCisgICAgICAgIChTYW1wbGVDb3VudCAhPSAwKSkKKyAgICB7CisgICAgICAgIGlmIChTYW1wbGVDb3VudCA8PSBOdW1TYW1wbGVzKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ29weSBhbGwgcHJvY2Vzc2VkIHNhbXBsZXMgdG8gdGhlIG91dHB1dAorICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIEZyYW1lQ291bnQpKTsgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisjZWxzZQorICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7IC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworI2VuZGlmCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVyIGFuZCBzYW1wbGUgY291bnRzCisgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBwRGVzdCAgICAgICs9IE5yQ2hhbm5lbHMgKiBGcmFtZUNvdW50OyAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZWxzZQorICAgICAgICAgICAgcERlc3QgICAgICArPSAyICogU2FtcGxlQ291bnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbmRpZgorICAgICAgICAgICAgTnVtU2FtcGxlcyAgPSAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIC0gU2FtcGxlQ291bnQpOyAgICAvKiBTYW1wbGVzIGxlZnQgdG8gc2VuZCAqLworICAgICAgICAgICAgU2FtcGxlQ291bnQgPSAwOyAvKiBObyBzYW1wbGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvcHkgb25seSBzb21lIHByb2Nlc3NlZCBzYW1wbGVzIHRvIHRoZSBvdXRwdXQKKyAgICAgICAgICAgICAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBEZXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE5yQ2hhbm5lbHMgKiBOckZyYW1lcykpOyAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisjZWxzZQorICAgICAgICAgICAgQ29weV9GbG9hdChwU3RhcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgcERlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgIC8qIE51bWJlciBvZiBwcm9jZXNzZWQgc2FtcGxlcyAqLworI2VuZGlmCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVXBkYXRlIHRoZSBwb2ludGVycyBhbmQgc2FtcGxlIGNvdW50cworICAgICAgICAgICAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBwU3RhcnQgICAgICArPSBOckNoYW5uZWxzICogTnJGcmFtZXM7ICAgICAgICAgICAgICAgLyogUHJvY2Vzc2VkIHNhbXBsZSBwb2ludGVyICovCisgICAgICAgICAgICBwRGVzdCAgICAgICArPSBOckNoYW5uZWxzICogTnJGcmFtZXM7ICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisjZWxzZQorICAgICAgICAgICAgcFN0YXJ0ICAgICAgKz0gMiAqIE51bVNhbXBsZXM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogUHJvY2Vzc2VkIHNhbXBsZSBwb2ludGVyICovCisgICAgICAgICAgICBwRGVzdCAgICAgICArPSAyICogTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KKyNlbmRpZgorICAgICAgICAgICAgU2FtcGxlQ291bnQgID0gKExWTV9JTlQxNikoU2FtcGxlQ291bnQgLSBOdW1TYW1wbGVzKTsgLyogUHJvY2Vzc2VkIHNhbXBsZXMgbGVmdCAqLworICAgICAgICAgICAgTnVtU2FtcGxlcyAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIHNhbXBsZSBjb3VudCAqLworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSByZW1haW5pbmcgcHJvY2Vzc2VkIGRhdGEgdG8gdGhlIG91dHB1dCBkZWxheSBidWZmZXIKKyAgICAgKi8KKyAgICBpZiAoU2FtcGxlQ291bnQgIT0gMCkKKyAgICB7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICBDb3B5X0Zsb2F0KHBTdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbTnJDaGFubmVscyAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnJDaGFubmVscyAqIEZyYW1lQ291bnQpKTsgICAgICAvKiBOdW1iZXIgb2YgcHJvY2Vzc2VkIHNhbXBsZXMgKi8KKyNlbHNlCisgICAgICAgIENvcHlfRmxvYXQocFN0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAmcEJ1ZmZlci0+T3V0RGVsYXlCdWZmZXJbMiAqIHBCdWZmZXItPk91dERlbGF5U2FtcGxlc10sIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7ICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHByb2Nlc3NlZCBzYW1wbGVzICovCisjZW5kaWYKKyAgICAgICAgLyogVXBkYXRlIHRoZSBidWZmZXIgY291bnQgKi8KKyAgICAgICAgcEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzID0gKExWTV9JTlQxNikocEJ1ZmZlci0+T3V0RGVsYXlTYW1wbGVzICsgU2FtcGxlQ291bnQpOworICAgIH0KKworICAgIC8qCisgICAgICogcG9pbnRlcnMsIGNvdW50cyBhbmQgc2V0IGRlZmF1bHQgYnVmZmVyIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBwQnVmZmVyLT5TYW1wbGVzVG9PdXRwdXQgID0gTnVtU2FtcGxlczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2FtcGxlcyBsZWZ0IHRvIHNlbmQgKi8KKyAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzID0gcERlc3Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IHNhbXBsZSBwb2ludGVyICovCisgICAgcEJ1ZmZlci0+QnVmZmVyU3RhdGUgICAgICA9IExWTV9NQVhCTE9DS0NBTEw7ICAgICAgICAgICAgICAgICAgIC8qIFNldCBmb3IgdGhlIGRlZmF1bHQgY2FsbCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxvY2sgc2l6ZSAqLworICAgIC8qIFRoaXMgd2lsbCB0ZXJtaW5hdGUgdGhlIGxvb3Agd2hlbiBhbGwgc2FtcGxlcyBwcm9jZXNzZWQgKi8KKyAgICAqcE51bVNhbXBsZXMgPSAoTFZNX1VJTlQxNilwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3M7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWTV9CdWZmZXJVbm1hbmFnZWRPdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyB3b3JrcyBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSB1bm1hbmFnZWQgaW5wdXQgcm91dGluZSBhbmQgdXBkYXRlcyB0aGUgbnVtYmVyICAgKi8KKy8qICAgIG9mIHNhbXBsZXMgbGVmdCB0byBiZSBwcm9jZXNzZWQgICAgYW5kIGFkanVzdHMgdGhlIGJ1ZmZlciBwb2ludGVycy4gICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIGhJbnN0YW5jZSAgICAgICAgLSBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgcE51bVNhbXBsZXMgICAgICAgIC0gUG9pbnRlciB0byB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBMVk1fQnVmZmVyVW5tYW5hZ2VkT3V0KExWTV9IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgKnBOdW1TYW1wbGVzKQoreworCisgICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlICA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMgPSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHM7CisgICAgaWYgKE51bUNoYW5uZWxzID09IDEpCisgICAgeworICAgICAgICAvKiBNb25vIGlucHV0IGlzIHByb2Nlc3NlZCBhcyBzdGVyZW8gYnkgTFZNIG1vZHVsZSAqLworICAgICAgICBOdW1DaGFubmVscyA9IDI7CisgICAgfQorI3VuZGVmIE5yRnJhbWVzCisjZGVmaW5lIE5yRnJhbWVzICgqcE51bVNhbXBsZXMpIC8vIGFsaWFzIGZvciBjbGFyaXR5CisjZWxzZQorICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMgPSAyOworI2VuZGlmCisKKyAgICAvKgorICAgICAqIFVwZGF0ZSBzYW1wbGUgY291bnRzCisgICAgICovCisgICAgcEluc3RhbmNlLT5wSW5wdXRTYW1wbGVzICAgICs9IChMVk1fSU5UMTYpKCpwTnVtU2FtcGxlcyAqIE51bUNoYW5uZWxzKTsgLyogVXBkYXRlIHRoZSBJL08gcG9pbnRlcnMgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgcEluc3RhbmNlLT5wT3V0cHV0U2FtcGxlcyAgICs9IChMVk1fSU5UMTYpKE5yRnJhbWVzICogTnVtQ2hhbm5lbHMpOworI2Vsc2UKKyAgICBwSW5zdGFuY2UtPnBPdXRwdXRTYW1wbGVzICAgKz0gKExWTV9JTlQxNikoKnBOdW1TYW1wbGVzICogMik7CisjZW5kaWYKKyAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgID0gKExWTV9JTlQxNikocEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzIC0gKnBOdW1TYW1wbGVzKTsgLyogVXBkYXRlIHRoZSBzYW1wbGUgY291bnQgKi8KKworICAgIC8qCisgICAgICogU2V0IHRlIGJsb2NrIHNpemUgdG8gcHJvY2VzcworICAgICAqLworICAgIGlmIChwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPiBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5JbnRlcm5hbEJsb2NrU2l6ZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgKnBOdW1TYW1wbGVzID0gKExWTV9VSU5UMTYpcEluc3RhbmNlLT5TYW1wbGVzVG9Qcm9jZXNzOworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZNX0J1ZmZlck9wdGltaXNlZE91dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIHdvcmtzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIG9wdGltaXNlZCBpbnB1dCByb3V0aW5lIGFuZCBjb3BpZXMgdGhlIGxhc3QgZmV3ICAqLworLyogIHByb2Nlc3NlZCBhbmQgdW5wcm9jZXNzZWQgc2FtcGxlcyB0byB0aGVpciByZXNwZWN0aXZlIGJ1ZmZlcnMuICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgaEluc3RhbmNlICAgICAgICAtIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBwTnVtU2FtcGxlcyAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBOb25lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVk1fQnVmZmVyT3V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gbWFuYWdlcyB0aGUgZGF0YSBvdXRwdXQsIGl0IGhhcyB0aGUgZm9sbG93aW5nIGZlYXR1cmVzOiAgICAgICAgICAgICAgICovCisvKiAgICAgICAgLSBPdXRwdXQgZGF0YSB0byAxNi1iaXQgYWxpZ25lZCBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAtIFJlYWRzIGRhdGEgZnJvbSAzMi1iaXQgYWxpZ25lZCBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIC0gUmVhZHMgZGF0YSBvbmx5IGluIGJsb2NrcyBvZiBmcmFtZSBzaXplIG9yIG11bHRpcGxlcyBvZiBmcmFtZSBzaXplICAgICAgICAgICovCisvKiAgICAgICAgLSBXcml0ZXMgdGhlIHNhbWUgbnVtYmVyIG9mIHNhbXBsZXMgYXMgdGhlIExWTV9CdWZmZXJJbiBmdW5jdGlvbiByZWFkcyAgICAgICAgKi8KKy8qICAgICAgICAtIFdvcmtzIHdpdGggaW5wbGFjZSBvciBvdXRwbGFjZSBwcm9jZXNzaW5nIGF1dG9tYXRpY2FsbHkgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVG8gbWFuYWdlIHRoZSBkYXRhIHRoZSBmdW5jdGlvbiBoYXMgYSBudW1iZXIgb2Ygb3BlcmF0aW5nIHN0YXRlczogICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICBMVk1fRklSU1RDQUxMICAgICAgICAtIFRoZSBmaXJzdCBjYWxsIGZvciB0aGlzIGJsb2NrIG9mIGlucHV0IHNhbXBsZXMgICAgICAgICAqLworLyogICAgICAgIExWTV9GSVJTVExBU1RDQUxMICAgIC0gVGhpcyBpcyB0aGUgZmlyc3QgYW5kIGxhc3QgY2FsbCBmb3IgdGhpcyBibG9jayBvZiBpbnB1dCovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZXMsIHRoaXMgb2NjdXJzIHdoZW4gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyBpcyBsZXNzIHRoYW4gdGhlIG1heGltdW0gYmxvY2sgc2l6ZS4gICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgZnVuY3Rpb24gdXNlcyBhbiBpbnRlcm5hbCBkZWxheSBidWZmZXIgdGhlIHNpemUgb2YgdGhlIG1pbmltdW0gZnJhbWUsIHRoaXMgaXMgKi8KKy8qICB1c2VkIHRvIHRlbXBvcmFyaWx5IGhvbGQgc2FtcGxlcyB3aGVuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byB3cml0ZSBpcyBub3QgYSAgICAgICAqLworLyogIG11bHRpcGxlIG9mIHRoZSBmcmFtZSBzaXplLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRvIGVuc3VyZSBjb3JyZWN0IG9wZXJhdGlvbiB3aXRoIGlucGxhY2UgYnVmZmVyaW5nIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0byBvdXRwdXQqLworLyogIHBlciBjYWxsIGlzIGFsd2F5cyB0aGUgc2FtZSBhcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgcmVhZCBmcm9tIHRoZSBpbnB1dCBidWZmZXIuICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgaEluc3RhbmNlICAgICAgICAtIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBwT3V0RGF0YSAgICAgICAgLSBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSBzdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIHBOdW1TYW1wbGVzICAgICAgICAtIFBvaW50ZXIgdG8gdGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIExWTV9CdWZmZXJPdXQoTFZNX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAqcE51bVNhbXBsZXMpCit7CisKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlICA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKyAgICAvKgorICAgICAqIENoZWNrIHdoaWNoIG1vZGUsIG1hbmFnZWQgb3IgdW5tYW5hZ2VkCisgICAgICovCisgICAgaWYgKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpCisgICAgeworICAgICAgICBMVk1fQnVmZmVyTWFuYWdlZE91dChoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTnVtU2FtcGxlcyk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIExWTV9CdWZmZXJVbm1hbmFnZWRPdXQoaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBOdW1TYW1wbGVzKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29lZmZzLmgKaW5kZXggOGMwNDg0Ny4uODEyZjhlNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db2VmZnMuaApAQCAtMTgsNyArMTgsNiBAQAogI2lmbmRlZiBfX0xWTV9DT0VGRlNfSF9fCiAjZGVmaW5lIF9fTFZNX0NPRUZGU19IX18KIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEhpZ2ggUGFzcyBTaGVsdmluZyBGaWx0ZXIgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yOSw3ICsyOCw2IEBACiAjZGVmaW5lIFRyZWJsZUJvb3N0TWluUmF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQKICNkZWZpbmUgVHJlYmxlQm9vc3RTdGVwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNQogCi0jaWZkZWYgQlVJTERfRkxPQVQKIC8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMjIwNTBIeiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCiAjZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMDM4NDM0CkBAIC00ODYsNyArNDg0LDk3IEBACiAjZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuMjY3OTQ5KQogI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKIAotI2lmZGVmIEhJR0hFUl9GUworLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA4ODIwMCAqLworLyogR2FpbiA9IDEuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjA5NDM3NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC42NDEyNTZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDIuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjIwMDI2NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDcxNDZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4yX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjMxOTA3NGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC44NjU5NTZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW4zX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDQuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjQ1MjM4MGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC45OTkyNjNmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDUuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjYwMTk1M2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4xNDg4MzZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc2OTc3N2YKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS4zMTY2NTlmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDcuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjk1ODA3OGYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS41MDQ5NjBmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDguMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjE2OTM1NWYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS43MTYyMzhmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjQwNjQxMmYKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS45NTMyOTVmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9Gczg4MjAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNTQ2ODgyZikKKyNkZWZpbmUgSFBGX0ZzODgyMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEwLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuNjcyMzk1ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4yMTkyNzdmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDExLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuOTcwODMyZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi41MTc3MTRmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuMzA1Njg0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi44NTI1NjZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEzLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNjgxMzk0ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy4yMjgyNzZmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDE0LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMTAyOTQ3ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMy42NDk4MzBmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNTc1OTM4ZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtNC4xMjI4MjBmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC41NDY4ODJmKQorI2RlZmluZSBIUEZfRnM4ODIwMF9HYWluMTVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgogCiAvKiBDb2VmZmljaWVudHMgZm9yIHNhbXBsZSByYXRlIDk2MDAwSHogKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxLjAwMDAwMCBkQiAqLwpAQCAtNTgwLDYgKzY2OCw5OCBAQAogI2RlZmluZSBIUEZfRnM5NjAwMF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjU3NzM1MCkKICNkZWZpbmUgSFBGX0ZzOTYwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCiAKKy8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMTc2NDAwICovCisvKiBHYWluID0gMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEwNjcxMWYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuODU1ODA3ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjI2NDQzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC45NzU1MzlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjJfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS4zNjA3ODRmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjEwOTg4MGYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjUxMTUxN2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuMjYwNjEzZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNjgwNjQzZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMS40Mjk3MzlmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDYuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMS44NzA0MDVmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xLjYxOTUwMWYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluNl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gNy4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAyLjA4MzMyMWYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEuODMyNDE3ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSA4LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMzIyMjE3ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi4wNzEzMTNmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDkuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMi41OTAyNjNmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yLjMzOTM1OWYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluOV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTAuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuODkxMDE2ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIuNjQwMTEyZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxMS4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgMy4yMjg0NjVmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMi45Nzc1NjFmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjExX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDEyLjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAzLjYwNzA5MGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zLjM1NjE4NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisvKiBHYWluID0gMTMuMDAwMDAwIGRCICovCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDMxOTE0ZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMuNzgxMDEwZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC43NDkwOTZmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjEzX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKy8qIEdhaW4gPSAxNC4wMDAwMDAgZEIgKi8KKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNC41MDg1NzVmCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtNC4yNTc2NzFmKQorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE0X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjc0OTA5NmYpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorLyogR2FpbiA9IDE1LjAwMDAwMCBkQiAqLworI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICA1LjA0MzM5N2YKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC00Ljc5MjQ5M2YpCisjZGVmaW5lIEhQRl9GczE3NjQwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBIUEZfRnMxNzY0MDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzQ5MDk2ZikKKyNkZWZpbmUgSFBGX0ZzMTc2NDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisKIC8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMTkyMDAwSHogKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxLjEwNzgyMwpAQCAtNjczLDU0NyArODUzLDMgQEAKICNkZWZpbmUgSFBGX0ZzMTkyMDAwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogCiAjZW5kaWYKLQotI2Vsc2UKLS8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMjIwNTBIeiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzgzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4xNjQyOTEgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY4NTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUxNDQ5MiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNzAwMzMgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ2ODMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjE0MjkyNSAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzU1OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTM1ODU4ICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM3MDAzMyAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4yX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzg5OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMTE4OTUzICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MzQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NTk4MzAgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjNfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDE2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wOTIwNTUgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyMjYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjU4NjcyOCAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNzAwMzMgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMjggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjA2MTg3NiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDIxNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjE2OTA3ICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM3MDAzMyAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW41X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkxOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDI4MDEzICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxMzI0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC42NTA3NzAgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjZfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluNl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW42X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjZfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDcuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTY0KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA1MDAyICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMzExICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNDUxOTkgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluN19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjdfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtODY0KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDI2MzY4ICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDEyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNjY1NjUgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW44X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjhfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDkuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xNjUwKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDUwMzQwICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNzk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zOTA1MzcgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjlfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluOV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW45X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjlfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEwLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMjUzMSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjA3NzIzOCAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzY3OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDE3NDM1ICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEwX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM3MDAzMyAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAoLTM1MjApICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xMDc0MTcgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ2NjcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQ0NzYxNSAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNzAwMzMgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjExX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTFfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgKC00NjI5KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTQxMjc5ICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1Nzc3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40ODE0NzcgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEyX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEzLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMjk0NCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjA4OTg0OSAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgODUzMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjYwMzUyICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjEzX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIxMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM3MDAzMyAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAoLTM2NDQpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xMTEyMTUgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkyMzEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI4MTcxOCAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMTI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNzAwMzMgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE0X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTRfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTUuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgKC00NDMwKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTM1MTg3ICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMDE3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zMDU2OTAgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyMjA1MF9HYWluMTVfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjEyNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzcwMDMzICovCi0jZGVmaW5lIEhQRl9GczIyMDUwX0dhaW4xNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMjIwNTBfR2FpbjE1X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotCi0KLS8qIENvZWZmaWNpZW50cyBmb3Igc2FtcGxlIHJhdGUgMjQwMDBIeiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNjI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4xMTA2MjggKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY5NjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUxNzU3OCAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4MTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjA4NTgwMCAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzc3NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTQyNDA2ICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjJfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI2Nzk0OSAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4yX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg5OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDU3OTQzICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4Njg2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NzAyNjMgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluM19CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjY3OTQ5ICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4zX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjNfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDQuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMjY2ODcgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTk3MTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjYwMTUxOSAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yNzUpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDgzODMgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA4NjAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjYzNjU4OSAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW41X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE1NjQpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wNDc3MzMgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIxNDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY3NTkzOCAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW42X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluNl9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE1MDkpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wNDYwNTEgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE4MjYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM2MDg5OSAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjdfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluN19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIzMjMpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wNzA4NzggKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI2NDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM4NTcyNyAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW44X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjhfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgOS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTMyMzUpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wOTg3MzYgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM1NTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQxMzU4NCAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW45X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluOV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgKC00MjYwKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTI5OTkyICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NTc3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40NDQ4NDEgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjY3OTQ5ICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEwX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDExLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICgtNTQwOSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE2NTA2MiAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTcyNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDc5OTExICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjExX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI2Nzk0OSAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTFfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMi4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAoLTY2OTgpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMDQ0MTEgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcwMTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUxOTI2MCAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTJfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgKC00MDgyKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTI0NTc2ICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MjUzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yODIzNzQgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgODc4MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjY3OTQ5ICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xM19CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjEzX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE0LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICgtNDg5NikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE0OTQwNCAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDA2NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzA3MjAyICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE0X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3ODAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI2Nzk0OSAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTRfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAoLTU4MDgpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xNzcyNjEgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgMTA5NzkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjMzNTA1OSAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczI0MDAwX0dhaW4xNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NzgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNjc5NDkgKi8KLSNkZWZpbmUgSFBGX0ZzMjQwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMyNDAwMF9HYWluMTVfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0KLQotLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSAzMjAwMEh6ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTcyMjUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUyNTY3NyAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTk5MCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAzMDIyNyAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjFfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MzM3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NTk1OTMgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTIxMDIpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wNjQxNDIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4yX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTU4NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTk3NjQ2ICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0zMzQ5KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTAyMTk2ICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA5ODMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY0MDM0MyAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtNDc0OCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE0NDg5MyAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjRfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyNTUzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC42ODgyNTAgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTYzMTgpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xOTI3OTkgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW41X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDMxNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzQyMDAyICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC04MDc5KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjQ2NTUxICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluNl9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMxNzYgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQwMjEwOSAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtNTA0MCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE1Mzc5NSAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjdfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0Mjg4ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40MzYwMjQgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTYxNTEpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xODc3MTEgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW44X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTUzNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDc0MDc4ICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC03Mzk4KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjI1NzY0ICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluOV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2OTM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41MTY3NzQgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTg3OTcpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjg0NjEgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTg1MDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjU2NDY4MSAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC0xMDM2NykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjMxNjM2OCAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjExX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDI2NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjE4NDMzICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTEyMTI4KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzcwMTIwICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTJfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMTQ3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zNDAxNzggKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTcwNjkpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTU3MjYgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTIyNTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM3NDA5MyAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtODE4MCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI0OTY0MiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE0X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzUwNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDEyMTQ3ICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC05NDI3KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjg3Njk1ICovCi0jZGVmaW5lIEhQRl9GczMyMDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzMzIwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnMzMjAwMF9HYWluMTVfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0KLQotLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA0NDEwMEh6ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc0NDIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUzMjI5NCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtNDc2MSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE0NTI5NCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC03MTczKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE4ODk0ICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjFfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4Nzk3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NzM2MzMgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTYxMTYpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xODY2MzQgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtNzE3MykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIxODg5NCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4yX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDMxNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjIwMDE2ICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC03NjM1KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjMzMDE3ICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTcxNzMpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTg4OTQgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwMjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY3MjA1OSAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtOTM0MSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI4NTA2MCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC03MTczKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE4ODk0ICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjRfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzOTM1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC43MzA0NTIgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTEyNTQpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zNDM0NTMgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtNzE3MykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIxODg5NCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW41X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjA4MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzk1OTcwICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEzNDAxKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDA4OTcxICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTcxNzMpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTg4OTQgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluNl9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQyNzkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQzNTc3NCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtNzkyNCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI0MTgxNSAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC03MTczKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE4ODk0ICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjdfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1NjM0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40NzcxMTMgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTkyNzgpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yODMxNTQgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtNzE3MykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIxODg5NCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW44X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzE1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTIzNDk2ICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEwNzk4KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzI5NTM3ICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTcxNzMpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTg4OTQgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluOV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4ODU5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NzU1MzkgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICgtMTI1MDQpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zODE1ODAgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtNzE3MykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIxODg5NCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA3NzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjYzMzkzMiAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC0xNDQxNykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjQzOTk3MyAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC03MTczKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE4ODk0ICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjExX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjkyMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjk5NDUwICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTE2NTY0KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNTA1NDkxICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTcxNzMpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTg4OTQgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTJfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNjk0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zODczOTkgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTk1MDkpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yOTAxODkgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtNzE3MykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIxODg5NCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQwNDkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQyODczOCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC0xMDg2NCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjMzMTUyOCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC03MTczKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE4ODk0ICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE0X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTU2OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDc1MTIxICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTEyMzgzKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzc3OTEyICovCi0jZGVmaW5lIEhQRl9GczQ0MTAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTcxNzMpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTg4OTQgKi8KLSNkZWZpbmUgSFBGX0ZzNDQxMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnM0NDEwMF9HYWluMTVfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0KLQotLyogQ29lZmZpY2llbnRzIGZvciBzYW1wbGUgcmF0ZSA0ODAwMEh6ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc0OTEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjUzMzc3NyAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtNTYwNikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE3MTA4MiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC04NzgwKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY3OTQ5ICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjFfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDIuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4OTAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NzY3NzkgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTcwMTUpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMTQwODUgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjJfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtODc4MCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2Nzk0OSAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMl9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4yX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAzLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjI1MDI5ICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgKC04NTk2KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjYyMzM1ICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4zX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTg3ODApICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjc5NDkgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIyNTUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY3OTE2NyAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC0xMDM3MCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjMxNjQ3MiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC04NzgwKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY3OTQ5ICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW40X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjRfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDUuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MjQ1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC43Mzk5MTAgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMTIzNjEpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zNzcyMTUgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjVfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtODc4MCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2Nzk0OSAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW41X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA2LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjQ3OSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuODA4MDY1ICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE0NTk0KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDQ1MzcwICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW42X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTg3ODApICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjc5NDkgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjZfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluNl9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgNy4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ1MjcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQ0MzMxOCAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtODU3MCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2MTU0MCAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluN19BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAgKC04NzgwKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY3OTQ5ICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW43X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjdfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDguMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1OTM2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40ODYzMjEgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTk5NzkpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zMDQ1NDMgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjhfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgICgtODc4MCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2Nzk0OSAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW44X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICA5LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzUxNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTM0NTcxICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0ExICAgICAgICAgICAgICAgICAgICAgICAgICAoLTExNTYwKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzUyNzkzICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW45X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTg3ODApICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjc5NDkgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjlfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluOV9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTAuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjkxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41ODg3MDggKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICgtMTMzMzQpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC40MDY5MzAgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtODc4MCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2Nzk0OSAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMF9TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAyICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxMS4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEyODEgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY0OTQ1MiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC0xNTMyNSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjQ2NzY3NCAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTFfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC04NzgwKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY3OTQ5ICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjExX1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDEyLjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzUxNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzE3NjA3ICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTE3NTU4KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNTM1ODI5ICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xMl9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTg3ODApICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjc5NDkgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEyX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTJfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdhaW4gPSAgMTMuMDAwMDAwIGRCICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDEzMDQxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zOTc5ODIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0ExICAgICAgICAgICAgICAgICAgICAgICAgICgtMTAwNTYpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zMDY4NzcgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjEzX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQjEgICAgICAgICAgICAgICAgICAgICAgICAgICgtODc4MCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI2Nzk0OSAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTNfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xM19TaGlmdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgLyogU2hpZnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2FpbiA9ICAxNC4wMDAwMDAgZEIgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0NTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQ0MDk4NCAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC0xMTQ2NSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjM0OTg4MCAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTRfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAgKC04NzgwKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY3OTQ5ICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE0X1NoaWZ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgICAgICAgICAvKiBTaGlmdCB2YWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluID0gIDE1LjAwMDAwMCBkQiAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAzMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDg5MjM0ICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTEzMDQ2KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzk4MTMwICovCi0jZGVmaW5lIEhQRl9GczQ4MDAwX0dhaW4xNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IxICAgICAgICAgICAgICAgICAgICAgICAgICAoLTg3ODApICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjc5NDkgKi8KLSNkZWZpbmUgSFBGX0ZzNDgwMDBfR2FpbjE1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBIUEZfRnM0ODAwMF9HYWluMTVfU2hpZnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAgICAgICAgIC8qIFNoaWZ0IHZhbHVlICovCi0KLQotI2VuZGlmCi0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlNTNiOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fQ29udHJvbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTE0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCi0jaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgotI2luY2x1ZGUgIkxWTV9Db2VmZnMuaCIKLSNpbmNsdWRlICJMVk1fVGFibGVzLmgiCi0jaW5jbHVkZSAiTFZNX1ByaXZhdGUuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgTFZNX1NldENvbnRyb2xQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTZXRzIG9yIGNoYW5nZXMgdGhlIExpZmVWaWJlcyBtb2R1bGUgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBQYXJhbXMgICAgICAgICAgICBQb2ludGVyIHRvIGEgcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWTV9TVUNDRVNTICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZNX05VTExBRERSRVNTICAgIFdoZW4gaEluc3RhbmNlLCBwUGFyYW1zIG9yIGFueSBjb250cm9sIHBvaW50ZXJzIGFyZSBOVUxMICAgICAgICAgKi8KLS8qICBMVk1fT1VUT0ZSQU5HRSAgICAgV2hlbiBhbnkgb2YgdGhlIGNvbnRyb2wgcGFyYW1ldGVycyBhcmUgb3V0IG9mIHJhbmdlICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMoTFZNX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKQotewotICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0KLQotICAgIGlmICgocFBhcmFtcyA9PSBMVk1fTlVMTCkgfHwgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkpCi0gICAgewotICAgICAgICByZXR1cm4gKExWTV9OVUxMQUREUkVTUyk7Ci0gICAgfQotCi0gICAgcEluc3RhbmNlLT5OZXdQYXJhbXMgPSAqcFBhcmFtczsKLQotICAgIGlmKAotICAgICAgICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KLSAgICAgICAgKChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09GRikgJiYgKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT04pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSAgICAoKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgotICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAgICAgICYmCi0gICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApICAgICAgJiYKLSAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKSkgICAgICB8fAotI2Vsc2UKLSAgICAgICAgKChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTEwMjUpICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgICAgICAgJiYKLSAgICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE2MDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjIwNTApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yNDAwMCkgICAgICAgJiYKLSAgICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkpICAgICAgfHwKLSNlbmRpZgotICAgICAgICAoKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJiAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pKSB8fAotICAgICAgICAocFBhcmFtcy0+U3BlYWtlclR5cGUgPiBMVk1fRVhfSEVBRFBIT05FUykpCi0gICAgewotICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENpbmVtYSBTb3VuZCBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgaWYoKHBQYXJhbXMtPlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PRkYpICYmIChwUGFyYW1zLT5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT04pKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7Ci0gICAgfQotCi0gICAgaWYocFBhcmFtcy0+VmlydHVhbGl6ZXJUeXBlICE9IExWTV9DT05DRVJUU09VTkQpCi0gICAgewotICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKLSAgICB9Ci0KLSAgICBpZihwUGFyYW1zLT5WaXJ0dWFsaXplclJldmVyYkxldmVsID4gTFZNX1ZJUlRVQUxJWkVSX01BWF9SRVZFUkJfTEVWRUwpCi0gICAgewotICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKLSAgICB9Ci0KLSAgICBpZihwUGFyYW1zLT5DU19FZmZlY3RMZXZlbCA8IExWTV9DU19NSU5fRUZGRUNUX0xFVkVMKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBOLUJhbmQgRXF1YWxpemVyCi0gICAgICovCi0gICAgaWYocFBhcmFtcy0+RVFOQl9OQmFuZHMgPiBwSW5zdGFuY2UtPkluc3RQYXJhbXMuRVFOQl9OdW1CYW5kcykKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwotICAgIH0KLQotICAgIC8qIERlZmluaXRpb24gcG9pbnRlciAqLwotICAgIGlmICgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb24gPT0gTFZNX05VTEwpICYmCi0gICAgICAgIChwUGFyYW1zLT5FUU5CX05CYW5kcyAhPSAwKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENvcHkgdGhlIGZpbHRlciBkZWZpbml0aW9ucyBmb3IgdGhlIEVxdWFsaXNlcgotICAgICAqLwotICAgIHsKLSAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBpOwotCi0gICAgICAgIGlmIChwUGFyYW1zLT5FUU5CX05CYW5kcyAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaTxwUGFyYW1zLT5FUU5CX05CYW5kczsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cEVRTkJfQmFuZERlZnNbaV0gPSBwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBJbnN0YW5jZS0+TmV3UGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uID0gcEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmczsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiggLyogTi1CYW5kIEVxdWFsaXNlciBwYXJhbWV0ZXJzICovCi0gICAgICAgICgocFBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlICE9IExWTV9FUU5CX09GRikgJiYgKHBQYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSAhPSBMVk1fRVFOQl9PTikpIHx8Ci0gICAgICAgIChwUGFyYW1zLT5FUU5CX05CYW5kcyA+IHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5FUU5CX051bUJhbmRzKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwotICAgIH0KLSAgICAvKiBCYW5kIHBhcmFtZXRlcnMqLwotICAgIHsKLSAgICAgICAgTFZNX0lOVDE2IGk7Ci0gICAgICAgIGZvcihpID0gMDsgaSA8IHBQYXJhbXMtPkVRTkJfTkJhbmRzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKCgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5IDwgTFZNX0VRTkJfTUlOX0JBTkRfRlJFUSkgIHx8Ci0gICAgICAgICAgICAgICAgKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeSA+IExWTV9FUU5CX01BWF9CQU5EX0ZSRVEpKSB8fAotICAgICAgICAgICAgICAgICgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uR2FpbiAgICAgPCBMVk1fRVFOQl9NSU5fQkFORF9HQUlOKSAgfHwKLSAgICAgICAgICAgICAgICAocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uR2FpbiAgICAgID4gTFZNX0VRTkJfTUFYX0JBTkRfR0FJTikpIHx8Ci0gICAgICAgICAgICAgICAgKChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXS5RRmFjdG9yICA8IExWTV9FUU5CX01JTl9RRkFDVE9SKSAgICAgfHwKLSAgICAgICAgICAgICAgICAocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uUUZhY3RvciAgID4gTFZNX0VRTkJfTUFYX1FGQUNUT1IpKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQmFzcyBFbmhhbmNlbWVudCBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgaWYoKChwUGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlICE9IExWTV9CRV9PRkYpICYmIChwUGFyYW1zLT5CRV9PcGVyYXRpbmdNb2RlICE9IExWTV9CRV9PTikpICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICgocFBhcmFtcy0+QkVfRWZmZWN0TGV2ZWwgPCBMVk1fQkVfTUlOX0VGRkVDVExFVkVMICkgfHwgKHBQYXJhbXMtPkJFX0VmZmVjdExldmVsID4gTFZNX0JFX01BWF9FRkZFQ1RMRVZFTCApKXx8Ci0gICAgICAgICgocFBhcmFtcy0+QkVfQ2VudHJlRnJlcSAhPSBMVk1fQkVfQ0VOVFJFXzU1SHopICYmIChwUGFyYW1zLT5CRV9DZW50cmVGcmVxICE9IExWTV9CRV9DRU5UUkVfNjZIeikgICAgICAgICAgICYmCi0gICAgICAgIChwUGFyYW1zLT5CRV9DZW50cmVGcmVxICE9IExWTV9CRV9DRU5UUkVfNzhIeikgJiYgKHBQYXJhbXMtPkJFX0NlbnRyZUZyZXEgIT0gTFZNX0JFX0NFTlRSRV85MEh6KSkgICAgICAgICAgIHx8Ci0gICAgICAgICgocFBhcmFtcy0+QkVfSFBGICE9IExWTV9CRV9IUEZfT0ZGKSAmJiAocFBhcmFtcy0+QkVfSFBGICE9IExWTV9CRV9IUEZfT04pKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVm9sdW1lIENvbnRyb2wgcGFyYW1ldGVycwotICAgICAqLwotICAgIGlmKChwUGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA8IExWTV9WQ19NSU5fRUZGRUNUTEVWRUwgKSB8fCAocFBhcmFtcy0+VkNfRWZmZWN0TGV2ZWwgPiBMVk1fVkNfTUFYX0VGRkVDVExFVkVMICkpCi0gICAgewotICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKLSAgICB9Ci0gICAgaWYoKHBQYXJhbXMtPlZDX0JhbGFuY2UgPCBMVk1fVkNfQkFMQU5DRV9NSU4gKSB8fCAocFBhcmFtcy0+VkNfQmFsYW5jZSA+IExWTV9WQ19CQUxBTkNFX01BWCApKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBQU0EgcGFyYW1ldGVycwotICAgICAqLwotICAgIGlmKCAocFBhcmFtcy0+UFNBX1BlYWtEZWNheVJhdGUgPiBMVlBTQV9TUEVFRF9ISUdIKSB8fAotICAgICAgICAocFBhcmFtcy0+UFNBX0VuYWJsZSA+IExWTV9QU0FfT04pKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICogU2V0IHRoZSBmbGFnIHRvIGluZGljYXRlIHRoZXJlIGFyZSBuZXcgcGFyYW1ldGVycyB0byB1c2UKLSAgICAqCi0gICAgKiBQcm90ZWN0IHRoZSBjb3B5IG9mIHRoZSBuZXcgcGFyYW1ldGVycyBmcm9tIGludGVycnVwdHMgdG8gYXZvaWQgcG9zc2libGUgcHJvYmxlbXMKLSAgICAqIHdpdGggbG9zcyBjb250cm9sIHBhcmFtZXRlcnMuIFRoaXMgcHJvYmxlbSBjYW4gb2NjdXIgaWYgdGhpcyBjb250cm9sIGZ1bmN0aW9uIGlzIGNhbGxlZCBtb3JlCi0gICAgKiB0aGFuIG9uY2UgYmVmb3JlIGEgY2FsbCB0byB0aGUgcHJvY2VzcyBmdW5jdGlvbi4gSWYgdGhlIHByb2Nlc3MgZnVuY3Rpb24gaW50ZXJydXB0cwotICAgICogdGhlIGNvcHkgdG8gTmV3UGFyYW1zIHRoZW4gb25lIGZyYW1lIG1heSBoYXZlIG1peGVkIHBhcmFtZXRlcnMsIHNvbWUgb2xkIGFuZCBzb21lIG5ldy4KLSAgICAqLwotICAgIHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPSBMVk1fVFJVRTsKLQotICAgIHJldHVybihMVk1fU1VDQ0VTUyk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBSZXF1ZXN0IHRoZSBMaWZlVmliZXMgbW9kdWxlIHBhcmFtZXRlcnMuIFRoZSBjdXJyZW50IHBhcmFtZXRlciBzZXQgaXMgcmV0dXJuZWQgICAgICAqLwotLyogIHZpYSB0aGUgcGFyYW1ldGVyIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFBhcmFtcyAgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVk1fTlVMTEFERFJFU1MgICAgICB3aGVuIGFueSBvZiBoSW5zdGFuY2Ugb3IgcFBhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMoTFZNX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKQotewotICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0KLQotICAgIC8qCi0gICAgICogQ2hlY2sgcG9pbnRlcgotICAgICAqLwotICAgIGlmICgocFBhcmFtcyA9PSBMVk1fTlVMTCkgfHwgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkpCi0gICAgewotICAgICAgICByZXR1cm4gKExWTV9OVUxMQUREUkVTUyk7Ci0gICAgfQotICAgICpwUGFyYW1zID0gcEluc3RhbmNlLT5OZXdQYXJhbXM7Ci0KLSAgICAvKgotICAgICAqIENvcHkgdGhlIGZpbHRlciBkZWZpbml0aW9ucyBmb3IgdGhlIEVxdWFsaXNlcgotICAgICAqLwotICAgIHsKLSAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBpOwotCi0gICAgICAgIGlmIChwSW5zdGFuY2UtPk5ld1BhcmFtcy5FUU5CX05CYW5kcyAhPSAwKQotICAgICAgICBmb3IgKGk9MDsgaTxwSW5zdGFuY2UtPk5ld1BhcmFtcy5FUU5CX05CYW5kczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPnBFUU5CX1VzZXJEZWZzW2ldID0gcEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmc1tpXTsKLSAgICAgICAgfQotICAgICAgICBwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9IHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnM7Ci0gICAgfQotCi0gICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9TZXRUcmVibGVCb29zdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEVuYWJsZSB0aGUgdHJlYmxlIGJvb3N0IHdoZW4gdGhlIHNldHRpbmdzIGFyZSBhcHByb3ByaWF0ZSwgaS5lLiBub24temVybyBnYWluICAgICAgICovCi0vKiAgYW5kIHRoZSBzYW1wbGUgcmF0ZSBpcyBoaWdoIGVub3VnaCBmb3IgdGhlIGVmZmVjdCB0byBiZSBoZWFyZC4gICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcEluc3RhbmNlICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBwYXJhbWV0ZXJzIHRvIHVzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZNX1NldFRyZWJsZUJvb3N0KExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpCi17Ci0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICBleHRlcm4gRk9fRkxPQVRfTFNoeF9Db2Vmc190ICBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdOwotI2Vsc2UKLSAgICBleHRlcm4gRk9fQzE2X0xTaHhfQ29lZnNfdCAgTFZNX1RyZWJsZUJvb3N0Q29lZnNbXTsKLSNlbmRpZgotCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgT2Zmc2V0OwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEVmZmVjdExldmVsID0gMDsKLQotICAgIC8qCi0gICAgICogTG9hZCB0aGUgY29lZmZpY2llbnRzCi0gICAgICovCi0gICAgaWYgKChwUGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID09IExWTV9URV9PTikgJiYKLSAgICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgPj0gVHJlYmxlQm9vc3RNaW5SYXRlKSAmJgotICAgICAgICAocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikgJiYKLSAgICAgICAgKHBQYXJhbXMtPlRFX0VmZmVjdExldmVsID4gMCkpCi0gICAgewotICAgICAgICBpZigocFBhcmFtcy0+VEVfRWZmZWN0TGV2ZWwgPT0gTFZNX1RFX0xPV19NSVBTKSAmJgotICAgICAgICAgICAgKChwUGFyYW1zLT5TcGVha2VyVHlwZSA9PSBMVk1fSEVBRFBIT05FUyl8fAotICAgICAgICAgICAgKHBQYXJhbXMtPlNwZWFrZXJUeXBlID09IExWTV9FWF9IRUFEUEhPTkVTKSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+VEVfQWN0aXZlID0gTFZNX0ZBTFNFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRWZmZWN0TGV2ZWwgPSBwUGFyYW1zLT5URV9FZmZlY3RMZXZlbDsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+VEVfQWN0aXZlID0gTFZNX1RSVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihwSW5zdGFuY2UtPlRFX0FjdGl2ZSA9PSBMVk1fVFJVRSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIExvYWQgdGhlIGNvZWZmaWNpZW50cyBhbmQgZW5hYmxlZCB0aGUgdHJlYmxlIGJvb3N0Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIE9mZnNldCA9IChMVk1fSU5UMTYpKEVmZmVjdExldmVsIC0gMSArIFRyZWJsZUJvb3N0U3RlcHMgKiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAtIFRyZWJsZUJvb3N0TWluUmF0ZSkpOwotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgICAgICBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+cFRFX1N0YXRlLT5UcmVibGVCb29zdF9TdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cFRFX1RhcHMtPlRyZWJsZUJvb3N0X1RhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZMVk1fVHJlYmxlQm9vc3RDb2Vmc1tPZmZzZXRdKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIENsZWFyIHRoZSB0YXBzCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIExvYWRDb25zdF9GbG9hdCgoTFZNX0ZMT0FUKTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcEluc3RhbmNlLT5wVEVfVGFwcy0+VHJlYmxlQm9vc3RfVGFwcywgIC8qIERlc3RpbmF0aW9uLlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzdCB0byB2b2lkOiBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzKSAvIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsgLyogTnVtYmVyIG9mIHdvcmRzICovCi0jZWxzZQotICAgICAgICAgICAgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBURV9TdGF0ZS0+VHJlYmxlQm9vc3RfU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTFZNX1RyZWJsZUJvb3N0Q29lZnNbT2Zmc2V0XSk7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDbGVhciB0aGUgdGFwcwotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBMb2FkQ29uc3RfMTYoKExWTV9JTlQxNikwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBJbnN0YW5jZS0+cFRFX1RhcHMtPlRyZWJsZUJvb3N0X1RhcHMsICAvKiBEZXN0aW5hdGlvbi5cCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocEluc3RhbmNlLT5wVEVfVGFwcy0+VHJlYmxlQm9vc3RfVGFwcykvc2l6ZW9mKExWTV9JTlQxNikpKTsgLyogTnVtYmVyIG9mIHdvcmRzICovCi0jZW5kaWYKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBEaXNhYmxlIHRoZSB0cmVibGUgYm9vc3QKLSAgICAgICAgICovCi0gICAgICAgIHBJbnN0YW5jZS0+VEVfQWN0aXZlID0gTFZNX0ZBTFNFOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWTV9TZXRWb2x1bWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb252ZXJ0cyB0aGUgaW5wdXQgdm9sdW1lIGRlbWFuZCBmcm9tIGRCcyB0byBsaW5lYXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFBhcmFtcyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICAgIExWTV9TZXRWb2x1bWUoTFZNX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpCi17Ci0KLSAgICBMVk1fVUlOVDE2ICAgICAgZEJTaGlmdHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA2ZEIgc2hpZnRzICovCi0gICAgTFZNX1VJTlQxNiAgICAgIGRCT2Zmc2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGFibGUgb2Zmc2V0ICovCi0gICAgTFZNX0lOVDE2ICAgICAgIFZvbHVtZSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmVxdWlyZWQgdm9sdW1lIGluIGRCcyAqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgTFZNX0ZMT0FUICAgICAgICBUZW1wOwotI2VuZGlmCi0KLSAgICAvKgotICAgICAqIExpbWl0IHRoZSBnYWluIHRvIHRoZSBtYXhpbXVtIGFsbG93ZWQKLSAgICAgKi8KLSAgICAgaWYgIChwUGFyYW1zLT5WQ19FZmZlY3RMZXZlbCA+IDApCi0gICAgIHsKLSAgICAgICAgIFZvbHVtZSA9IDA7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgICBWb2x1bWUgPSBwUGFyYW1zLT5WQ19FZmZlY3RMZXZlbDsKLSAgICAgfQotCi0gICAgIC8qIENvbXBlbnNhdGUgdGhpcyB2b2x1bWUgaW4gUFNBIHBsb3QgKi8KLSAgICAgaWYoVm9sdW1lID4gLTYwKSAgLyogTGltaXQgdm9sdW1lIGxvc3MgdG8gUFNBIExpbWl0cyovCi0gICAgICAgICBwSW5zdGFuY2UtPlBTQV9HYWluT2Zmc2V0PShMVk1fSU5UMTYpKC1Wb2x1bWUpOy8qIExvc3MgaXMgY29tcGVuc2F0ZWQgYnkgR2FpbiovCi0gICAgIGVsc2UKLSAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0dhaW5PZmZzZXQ9KExWTV9JTlQxNik2MDsvKiBMb3NzIGlzIGNvbXBlbnNhdGVkIGJ5IEdhaW4qLwotCi0gICAgcEluc3RhbmNlLT5WQ19BVkxGaXhlZFZvbHVtZSA9IDA7Ci0KLSAgICAvKgotICAgICAqIFNldCB2b2x1bWUgY29udHJvbCBhbmQgQVZMIHZvbHVtZXMgYWNjb3JkaW5nIHRvIGhlYWRyb29tIGFuZCB2b2x1bWUgdXNlciBzZXR0aW5nCi0gICAgICovCi0gICAgaWYocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikKLSAgICB7Ci0gICAgICAgIC8qIERlZmF1bHQgU2l0dWF0aW9uIHdpdGggbm8gQVZMIGFuZCBubyBSUyAqLwotICAgICAgICBpZihwUGFyYW1zLT5FUU5CX09wZXJhdGluZ01vZGUgPT0gTFZNX0VRTkJfT04pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKFZvbHVtZSA+IC1wSW5zdGFuY2UtPkhlYWRyb29tKQotICAgICAgICAgICAgICAgIFZvbHVtZSA9IChMVk1fSU5UMTYpLXBJbnN0YW5jZS0+SGVhZHJvb207Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEFjdGl2YXRlIHZvbHVtZSBjb250cm9sIGlmIG5lY2Vzc2FyeQotICAgICAqLwotICAgIHBJbnN0YW5jZS0+VkNfQWN0aXZlICAgPSBMVk1fVFJVRTsKLSAgICBpZiAoVm9sdW1lICE9IDApCi0gICAgewotICAgICAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZWRCID0gVm9sdW1lOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZWRCID0gMDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENhbGN1bGF0ZSB0aGUgcmVxdWlyZWQgZ2FpbiBhbmQgc2hpZnRzCi0gICAgICovCi0gICAgZEJPZmZzZXQgPSAoTFZNX1VJTlQxNikoKC1Wb2x1bWUpICUgNik7ICAgICAgICAgICAgIC8qIEdldCB0aGUgZEJzIDAtNSAqLwotICAgIGRCU2hpZnRzID0gKExWTV9VSU5UMTYpKFZvbHVtZSAvIC02KTsgICAgICAgICAgICAgICAvKiBHZXQgdGhlIDZkQiBzaGlmdHMgKi8KLQotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIHBhcmFtZXRlcnMKLSAgICAgKi8KLSAgICBpZihkQlNoaWZ0cyA9PSAwKQotICAgIHsKLSNpZmRlZiBCVUlMRF9GTE9BVAotICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVClMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKLSNlbHNlCi0gICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKUxWTV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICBlbHNlCi0gICAgewotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgIFRlbXAgPSBMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdOwotICAgICAgICB3aGlsZShkQlNoaWZ0cykgewotICAgICAgICAgICAgVGVtcCA9IFRlbXAgLyAyLjBmOwotICAgICAgICAgICAgZEJTaGlmdHMtLTsKLSAgICAgICAgfQotICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwgVGVtcCk7Ci0jZWxzZQotICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCgoTFZNX0lOVDMyKUxWTV9Wb2x1bWVUYWJsZVtkQk9mZnNldF0pPj5kQlNoaWZ0cykpOwotI2VuZGlmCi0gICAgfQotICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMTsKLSAgICBpZihwSW5zdGFuY2UtPk5vU21vb3RoVm9sdW1lID09IExWTV9UUlVFKQotICAgIHsKLSNpZmRlZiBCVUlMRF9GTE9BVAotICAgICAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLCAyKTsKLSNlbHNlCi0gICAgICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLDAscEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwyKTsKLSNlbmRpZgotICAgIH0KLSAgICBlbHNlCi0gICAgewotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLCBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLCAyKTsKLSNlbHNlCi0gICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLExWTV9WQ19NSVhFUl9USU1FLHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsMik7Ci0jZW5kaWYKLSAgICB9Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICBMVk1fU2V0SGVhZHJvb20gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRmluZCBzdWl0YWJsZSBoZWFkcm9vbSBiYXNlZCBvbiBFUSBzZXR0aW5ncy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcEluc3RhbmNlICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBQYXJhbXMgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHZvaWQgICAgICAgICAgICAgICAgTm90aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkICAgIExWTV9TZXRIZWFkcm9vbShMVk1fSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKQotewotICAgIExWTV9JTlQxNiAgIGlpLCBqajsKLSAgICBMVk1fSU5UMTYgICBIZWFkcm9vbSA9IDA7Ci0gICAgTFZNX0lOVDE2ICAgTWF4R2FpbiA9IDA7Ci0KLQotICAgIGlmICgocFBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikgJiYgKHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMuSGVhZHJvb21fT3BlcmF0aW5nTW9kZSA9PSBMVk1fSEVBRFJPT01fT04pKQotICAgIHsKLSAgICAgICAgLyogRmluZCB0eXBpY2FsIGhlYWRyb29tIHZhbHVlICovCi0gICAgICAgIGZvcihqaiA9IDA7IGpqIDwgcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kczsgamorKykKLSAgICAgICAgewotICAgICAgICAgICAgTWF4R2FpbiA9IDA7Ci0gICAgICAgICAgICBmb3IoIGlpID0gMDsgaWkgPCBwUGFyYW1zLT5FUU5CX05CYW5kczsgaWkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZigocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baWldLkZyZXF1ZW5jeSA+PSBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bampdLkxpbWl0X0xvdykgJiYKLSAgICAgICAgICAgICAgICAgICAocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baWldLkZyZXF1ZW5jeSA8PSBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bampdLkxpbWl0X0hpZ2gpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baWldLkdhaW4gPiBNYXhHYWluKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNYXhHYWluID0gcFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baWldLkdhaW47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKChNYXhHYWluIC0gcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uW2pqXS5IZWFkcm9vbV9PZmZzZXQpID4gSGVhZHJvb20pewotICAgICAgICAgICAgICAgIEhlYWRyb29tID0gKExWTV9JTlQxNikoTWF4R2FpbiAtIHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbltqal0uSGVhZHJvb21fT2Zmc2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIFNhdHVyYXRlICovCi0gICAgICAgIGlmKEhlYWRyb29tIDwgMCkKLSAgICAgICAgICAgIEhlYWRyb29tID0gMDsKLSAgICB9Ci0gICAgcEluc3RhbmNlLT5IZWFkcm9vbSA9IChMVk1fVUlOVDE2KUhlYWRyb29tIDsKLQotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0FwcGx5TmV3U2V0dGluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQXBwbGllcyBjaGFuZ2VzIHRvIHBhcmFtZXRyZXMuIFRoaXMgZnVuY3Rpb24gbWFrZXMgbm8gYXNzdW1wdGlvbnMgYWJvdXQgd2hhdCAgICAgICAgKi8KLS8qICBlYWNoIG1vZHVsZSBuZWVkcyBmb3IgaW5pdGlhbGlzYXRpb24gYW5kIGhlbmNlIHBhc3NlcyBhbGwgcGFyYW1ldGVycyB0byBhbGwgdGhlICAgICAqLwotLyogIHRoZSBtb2R1bGVzIGluIHR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZNX1N1Y2Nlc3MgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0FwcGx5TmV3U2V0dGluZ3MoTFZNX0hhbmRsZV90ICAgaEluc3RhbmNlKQotewotICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICopaEluc3RhbmNlOwotICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgTG9jYWxQYXJhbXM7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICBDb3VudCA9IDU7Ci0KLQotICAgIC8qCi0gICAgICogQ29weSB0aGUgbmV3IHBhcmFtZXRlcnMgYnV0IG1ha2Ugc3VyZSB0aGV5IGRpZG4ndCBjaGFuZ2Ugd2hpbGUgY29weWluZwotICAgICAqLwotICAgIGRvCi0gICAgewotICAgICAgICBwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID0gTFZNX0ZBTFNFOwotICAgICAgICBMb2NhbFBhcmFtcyA9IHBJbnN0YW5jZS0+TmV3UGFyYW1zOwotICAgICAgICBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zID0gcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtczsKLSAgICAgICAgQ291bnQtLTsKLSAgICB9IHdoaWxlICgocEluc3RhbmNlLT5Db250cm9sUGVuZGluZyAhPSBMVk1fRkFMU0UpICYmCi0gICAgICAgICAgICAgKENvdW50ID4gMCkpOwotCi0gICAgLyogQ2xlYXIgYWxsIGludGVybmFsIGRhdGEgaWYgZm9ybWF0IGNoYW5nZSovCi0gICAgaWYoTG9jYWxQYXJhbXMuU291cmNlRm9ybWF0ICE9IHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCkKLSAgICB7Ci0gICAgICAgIExWTV9DbGVhckF1ZGlvQnVmZmVycyhwSW5zdGFuY2UpOwotICAgICAgICBwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID0gTFZNX0ZBTFNFOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVXBkYXRlIHRoZSB0cmVibGUgYm9vc3QgaWYgcmVxdWlyZWQKLSAgICAgKi8KLSAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKLSAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlRFX0VmZmVjdExldmVsICE9IExvY2FsUGFyYW1zLlRFX0VmZmVjdExldmVsKSB8fAotICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSAhPSBMb2NhbFBhcmFtcy5URV9PcGVyYXRpbmdNb2RlKSB8fAotICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAhPSBMb2NhbFBhcmFtcy5PcGVyYXRpbmdNb2RlKSB8fAotICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gTG9jYWxQYXJhbXMuU3BlYWtlclR5cGUpKQotICAgIHsKLSAgICAgICAgTFZNX1NldFRyZWJsZUJvb3N0KHBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZMb2NhbFBhcmFtcyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBVcGRhdGUgdGhlIGhlYWRyb29tIGlmIHJlcXVpcmVkCi0gICAgICovCi0gICAgICAgIExWTV9TZXRIZWFkcm9vbShwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICZMb2NhbFBhcmFtcyk7ICAgICAgICAgICAgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgKi8KLQotICAgIC8qCi0gICAgICogVXBkYXRlIHRoZSB2b2x1bWUgaWYgcmVxdWlyZWQKLSAgICAgKi8KLSAgICB7Ci0gICAgICAgIExWTV9TZXRWb2x1bWUocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgJkxvY2FsUGFyYW1zKTsgICAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyAqLwotICAgIH0KLSAgICAvKiBBcHBseSBiYWxhbmNlIGNoYW5nZXMqLwotICAgIGlmKHBJbnN0YW5jZS0+UGFyYW1zLlZDX0JhbGFuY2UgIT0gTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSkKLSAgICB7Ci0gICAgICAgIC8qIENvbmZpZ3VyZSBNaXhlciBtb2R1bGUgZm9yIGdyYWR1YWwgY2hhbmdlcyB0byB2b2x1bWUqLwotICAgICAgICBpZihMb2NhbFBhcmFtcy5WQ19CYWxhbmNlIDwgMCkKLSAgICAgICAgewotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgICAgICBMVk1fRkxPQVQgVGFyZ2V0X0Zsb2F0OwotI2Vsc2UKLSAgICAgICAgICAgIExWTV9JTlQzMiBUYXJnZXQ7Ci0jZW5kaWYKLSAgICAgICAgICAgIC8qIERyb3AgaW4gcmlnaHQgY2hhbm5lbCB2b2x1bWUqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgICAgICBUYXJnZXRfRmxvYXQgPSBMVk1fTUFYRkxPQVQ7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sIFRhcmdldF9GbG9hdCk7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLCBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLCAxKTsKLQotICAgICAgICAgICAgVGFyZ2V0X0Zsb2F0ID0gZEJfdG9fTGluRmxvYXQoKExWTV9JTlQxNikoTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSA8PCA0KSk7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sIFRhcmdldF9GbG9hdCk7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLCBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLCAxKTsKLSNlbHNlCi0gICAgICAgICAgICBUYXJnZXQgPSBMVk1fTUFYSU5UXzE2OwotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLFRhcmdldCk7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sTFZNX1ZDX01JWEVSX1RJTUUsTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwxKTsKLQotICAgICAgICAgICAgVGFyZ2V0ID0gZEJfdG9fTGluMzIoKExWTV9JTlQxNikoTG9jYWxQYXJhbXMuVkNfQmFsYW5jZTw8NCkpOwotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLFRhcmdldCk7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sTFZNX1ZDX01JWEVSX1RJTUUsTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwxKTsKLSNlbmRpZgotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYoTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSA+MCkKLSAgICAgICAgewotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgICAgICBMVk1fRkxPQVQgVGFyZ2V0X0Zsb2F0OwotI2Vsc2UKLSAgICAgICAgICAgIExWTV9JTlQzMiBUYXJnZXQ7Ci0jZW5kaWYKLSAgICAgICAgICAgIC8qIERyb3AgaW4gbGVmdCBjaGFubmVsIHZvbHVtZSovCi0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICAgICAgICAgIFRhcmdldF9GbG9hdCA9IGRCX3RvX0xpbkZsb2F0KChMVk1fSU5UMTYpKCgtTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSkgPDwgNCkpOwotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLCBUYXJnZXRfRmxvYXQpOwotICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSwgTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7Ci0KLSAgICAgICAgICAgIFRhcmdldF9GbG9hdCA9IExWTV9NQVhGTE9BVDsKLSAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwgVGFyZ2V0X0Zsb2F0KTsKLSAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsIExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOwotI2Vsc2UKLSAgICAgICAgICAgIFRhcmdldCA9IGRCX3RvX0xpbjMyKChMVk1fSU5UMTYpKCgtTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSk8PDQpKTsKLSAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxUYXJnZXQpOwotICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsMSk7Ci0KLSAgICAgICAgICAgIFRhcmdldCA9IExWTV9NQVhJTlRfMTY7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sVGFyZ2V0KTsKLSAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLDEpOwotI2VuZGlmCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICAgICAgICAgIExWTV9GTE9BVCBUYXJnZXRfRmxvYXQ7Ci0jZWxzZQotICAgICAgICAgICAgTFZNX0lOVDMyIFRhcmdldDsKLSNlbmRpZgotICAgICAgICAgICAgLyogTm8gZHJvcCovCi0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICAgICAgICAgIFRhcmdldF9GbG9hdCA9IExWTV9NQVhGTE9BVDsKLSNlbHNlCi0gICAgICAgICAgICBUYXJnZXQgPSBMVk1fTUFYSU5UXzE2OwotI2VuZGlmCi0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxUYXJnZXRfRmxvYXQpOwotICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSxMb2NhbFBhcmFtcy5TYW1wbGVSYXRlLCAxKTsKLQotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLFRhcmdldF9GbG9hdCk7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOwotI2Vsc2UKLSAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxUYXJnZXQpOwotICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsMSk7Ci0KLSAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxUYXJnZXQpOwotICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsMSk7Ci0jZW5kaWYKLSAgICAgICAgfQotICAgIH0KLSAgICAvKgotICAgICAqIFVwZGF0ZSB0aGUgYmFzcyBlbmhhbmNlbWVudAotICAgICAqLwotICAgIHsKLSAgICAgICAgTFZEQkVfUmV0dXJuU3RhdHVzX2VuICAgICAgIERCRV9TdGF0dXM7Ci0gICAgICAgIExWREJFX1BhcmFtc190ICAgICAgICAgICAgICBEQkVfUGFyYW1zOwotICAgICAgICBMVkRCRV9IYW5kbGVfdCAgICAgICAgICAgICAgKmhEQkVJbnN0YW5jZSA9IHBJbnN0YW5jZS0+aERCRUluc3RhbmNlOwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2V0IHRoZSBuZXcgcGFyYW1ldGVycwotICAgICAgICAgKi8KLSAgICAgICAgaWYoTG9jYWxQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PRkYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERCRV9QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWREJFX09GRjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIERCRV9QYXJhbXMuT3BlcmF0aW5nTW9kZSAgICA9IChMVkRCRV9Nb2RlX2VuKUxvY2FsUGFyYW1zLkJFX09wZXJhdGluZ01vZGU7Ci0gICAgICAgIH0KLSAgICAgICAgREJFX1BhcmFtcy5TYW1wbGVSYXRlICAgICAgID0gKExWREJFX0ZzX2VuKUxvY2FsUGFyYW1zLlNhbXBsZVJhdGU7Ci0gICAgICAgIERCRV9QYXJhbXMuRWZmZWN0TGV2ZWwgICAgICA9IExvY2FsUGFyYW1zLkJFX0VmZmVjdExldmVsOwotICAgICAgICBEQkVfUGFyYW1zLkNlbnRyZUZyZXF1ZW5jeSAgPSAoTFZEQkVfQ2VudHJlRnJlcV9lbilMb2NhbFBhcmFtcy5CRV9DZW50cmVGcmVxOwotICAgICAgICBEQkVfUGFyYW1zLkhQRlNlbGVjdCAgICAgICAgPSAoTFZEQkVfRmlsdGVyU2VsZWN0X2VuKUxvY2FsUGFyYW1zLkJFX0hQRjsKLSAgICAgICAgREJFX1BhcmFtcy5IZWFkcm9vbWRCICAgICAgID0gMDsKLSAgICAgICAgREJFX1BhcmFtcy5Wb2x1bWVDb250cm9sICAgID0gTFZEQkVfVk9MVU1FX09GRjsKLSAgICAgICAgREJFX1BhcmFtcy5Wb2x1bWVkQiAgICAgICAgID0gMDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBNYWtlIHRoZSBjaGFuZ2VzCi0gICAgICAgICAqLwotICAgICAgICBEQkVfU3RhdHVzID0gTFZEQkVfQ29udHJvbChoREJFSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEQkVfUGFyYW1zKTsKLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFF1aXQgaWYgdGhlIGNoYW5nZXMgd2VyZSBub3QgYWNjZXB0ZWQKLSAgICAgICAgICovCi0gICAgICAgIGlmIChEQkVfU3RhdHVzICE9IExWREJFX1NVQ0NFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbilEQkVfU3RhdHVzKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2V0IHRoZSBjb250cm9sIGZsYWcKLSAgICAgICAgICovCi0gICAgICAgIHBJbnN0YW5jZS0+REJFX0FjdGl2ZSA9IExWTV9UUlVFOwotICAgIH0KLQotICAgIC8qCi0gICAgICogVXBkYXRlIHRoZSBOLUJhbmQgRXF1YWxpc2VyCi0gICAgICovCi0gICAgewotICAgICAgICBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuICAgICAgRVFOQl9TdGF0dXM7Ci0gICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgICAgICAgICBFUU5CX1BhcmFtczsKLSAgICAgICAgTFZFUU5CX0hhbmRsZV90ICAgICAgICAgICAgICpoRVFOQkluc3RhbmNlID0gcEluc3RhbmNlLT5oRVFOQkluc3RhbmNlOwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2V0IHRoZSBuZXcgcGFyYW1ldGVycwotICAgICAgICAgKi8KLQotICAgICAgICBpZihMb2NhbFBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09GRikKLSAgICAgICAgewotICAgICAgICAgICAgRVFOQl9QYXJhbXMuT3BlcmF0aW5nTW9kZSAgICA9IExWRVFOQl9CWVBBU1M7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBFUU5CX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gKExWRVFOQl9Nb2RlX2VuKUxvY2FsUGFyYW1zLkVRTkJfT3BlcmF0aW5nTW9kZTsKLSAgICAgICAgfQotCi0gICAgICAgIEVRTkJfUGFyYW1zLlNhbXBsZVJhdGUgICAgICAgPSAoTFZFUU5CX0ZzX2VuKUxvY2FsUGFyYW1zLlNhbXBsZVJhdGU7Ci0gICAgICAgIEVRTkJfUGFyYW1zLk5CYW5kcyAgICAgICAgICAgPSBMb2NhbFBhcmFtcy5FUU5CX05CYW5kczsKLSAgICAgICAgRVFOQl9QYXJhbXMucEJhbmREZWZpbml0aW9uICA9IChMVkVRTkJfQmFuZERlZl90ICopTG9jYWxQYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb247Ci0gICAgICAgIGlmIChMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX1NURVJFTykgICAgLyogTW9ubyBmb3JtYXQgbm90IHN1cHBvcnRlZCAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBFUU5CX1BhcmFtcy5Tb3VyY2VGb3JtYXQgPSBMVkVRTkJfU1RFUkVPOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgRVFOQl9QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZFUU5CX01PTk9JTlNURVJFTzsgICAgIC8qIEZvcmNlIHRvIE1vbm8taW4tU3RlcmVvIG1vZGUgKi8KLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2V0IHRoZSBjb250cm9sIGZsYWcKLSAgICAgICAgICovCi0gICAgICAgIGlmICgoTG9jYWxQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikgJiYKLSAgICAgICAgICAgIChMb2NhbFBhcmFtcy5FUU5CX09wZXJhdGluZ01vZGUgPT0gTFZNX0VRTkJfT04pKQotICAgICAgICB7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPkVRTkJfQWN0aXZlID0gTFZNX1RSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBFUU5CX1BhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZFUU5CX0JZUEFTUzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIE1ha2UgdGhlIGNoYW5nZXMKLSAgICAgICAgICovCi0gICAgICAgIEVRTkJfU3RhdHVzID0gTFZFUU5CX0NvbnRyb2woaEVRTkJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9QYXJhbXMpOwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogUXVpdCBpZiB0aGUgY2hhbmdlcyB3ZXJlIG5vdCBhY2NlcHRlZAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKEVRTkJfU3RhdHVzICE9IExWRVFOQl9TVUNDRVNTKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pRVFOQl9TdGF0dXMpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogVXBkYXRlIGNvbmNlcnQgc291bmQKLSAgICAgKi8KLSAgICB7Ci0gICAgICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuICAgICAgICBDU19TdGF0dXM7Ci0gICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgICAgICAgICBDU19QYXJhbXM7Ci0gICAgICAgIExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgICAqaENTSW5zdGFuY2UgPSBwSW5zdGFuY2UtPmhDU0luc3RhbmNlOwotICAgICAgICBMVk1fTW9kZV9lbiAgICAgICAgICAgICAgICAgQ29tcHJlc3Nvck1vZGU9TFZNX01PREVfT047Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2V0IHRoZSBuZXcgcGFyYW1ldGVycwotICAgICAgICAgKi8KLSAgICAgICAgaWYoTG9jYWxQYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKQotICAgICAgICB7Ci0gICAgICAgICAgICBDU19QYXJhbXMuT3BlcmF0aW5nTW9kZSAgICA9IExWQ1NfT047Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBDU19QYXJhbXMuT3BlcmF0aW5nTW9kZSAgICA9IExWQ1NfT0ZGOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoKExvY2FsUGFyYW1zLlRFX09wZXJhdGluZ01vZGUgPT0gTFZNX1RFX09OKSAmJiAoTG9jYWxQYXJhbXMuVEVfRWZmZWN0TGV2ZWwgPT0gTFZNX1RFX0xPV19NSVBTKSkKLSAgICAgICAgewotICAgICAgICAgICAgQ1NfUGFyYW1zLlNwZWFrZXJUeXBlICA9IExWQ1NfRVhfSEVBRFBIT05FUzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIENTX1BhcmFtcy5TcGVha2VyVHlwZSAgPSBMVkNTX0hFQURQSE9ORVM7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoTG9jYWxQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9TVEVSRU8pICAgIC8qIE1vbm8gZm9ybWF0IG5vdCBzdXBwb3J0ZWQgKi8KLSAgICAgICAgewotICAgICAgICAgICAgQ1NfUGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWQ1NfU1RFUkVPOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgQ1NfUGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWQ1NfTU9OT0lOU1RFUkVPOyAgICAgICAgICAvKiBGb3JjZSB0byBNb25vLWluLVN0ZXJlbyBtb2RlICovCi0gICAgICAgIH0KLSAgICAgICAgQ1NfUGFyYW1zLlNhbXBsZVJhdGUgID0gTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZTsKLSAgICAgICAgQ1NfUGFyYW1zLlJldmVyYkxldmVsID0gTG9jYWxQYXJhbXMuVmlydHVhbGl6ZXJSZXZlcmJMZXZlbDsKLSAgICAgICAgQ1NfUGFyYW1zLkVmZmVjdExldmVsID0gTG9jYWxQYXJhbXMuQ1NfRWZmZWN0TGV2ZWw7Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBTZXQgdGhlIGNvbnRyb2wgZmxhZwotICAgICAgICAgKi8KLSAgICAgICAgaWYgKChMb2NhbFBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09OKSAmJgotICAgICAgICAgICAgKExvY2FsUGFyYW1zLlZpcnR1YWxpemVyT3BlcmF0aW5nTW9kZSAhPSBMVkNTX09GRikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+Q1NfQWN0aXZlID0gTFZNX1RSVUU7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBDU19QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWQ1NfT0ZGOwotICAgICAgICB9Ci0KLSAgICAgICAgQ1NfUGFyYW1zLkNvbXByZXNzb3JNb2RlPUNvbXByZXNzb3JNb2RlOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIE1ha2UgdGhlIGNoYW5nZXMKLSAgICAgICAgICovCi0gICAgICAgIENTX1N0YXR1cyA9IExWQ1NfQ29udHJvbChoQ1NJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19QYXJhbXMpOwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogUXVpdCBpZiB0aGUgY2hhbmdlcyB3ZXJlIG5vdCBhY2NlcHRlZAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKENTX1N0YXR1cyAhPSBMVkNTX1NVQ0NFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbilDU19TdGF0dXMpOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFVwZGF0ZSB0aGUgUG93ZXIgU3BlY3RydW0gQW5hbHlzZXIKLSAgICAgKi8KLSAgICB7Ci0gICAgICAgIExWUFNBX1JFVFVSTiAgICAgICAgICAgICAgICBQU0FfU3RhdHVzOwotICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAgUFNBX1BhcmFtczsKLSAgICAgICAgcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgICpoUFNBSW5zdGFuY2UgPSBwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZTsKLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNldCB0aGUgbmV3IHBhcmFtZXRlcnMKLSAgICAgICAgICovCi0gICAgICAgIFBTQV9QYXJhbXMuRnMgPSBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlOwotICAgICAgICBQU0FfUGFyYW1zLkxldmVsRGV0ZWN0aW9uU3BlZWQgPSAoTFZQU0FfTGV2ZWxEZXRlY3RTcGVlZF9lbilMb2NhbFBhcmFtcy5QU0FfUGVha0RlY2F5UmF0ZTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBNYWtlIHRoZSBjaGFuZ2VzCi0gICAgICAgICAqLwotICAgICAgICBpZihwSW5zdGFuY2UtPkluc3RQYXJhbXMuUFNBX0luY2x1ZGVkPT1MVk1fUFNBX09OKQotICAgICAgICB7Ci0gICAgICAgICAgICBQU0FfU3RhdHVzID0gTFZQU0FfQ29udHJvbChoUFNBSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgJlBTQV9QYXJhbXMpOwotCi0gICAgICAgICAgICBpZiAoUFNBX1N0YXR1cyAhPSBMVlBTQV9PSykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pUFNBX1N0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBBcHBseSBuZXcgc2V0dGluZ3MKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgUFNBX1N0YXR1cyA9IExWUFNBX0FwcGx5TmV3U2V0dGluZ3MgKChMVlBTQV9JbnN0YW5jZVByX3QqKWhQU0FJbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZihQU0FfU3RhdHVzICE9IExWUFNBX09LKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbilQU0FfU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogVXBkYXRlIHRoZSBwYXJhbWV0ZXJzIGFuZCBjbGVhciB0aGUgZmxhZwotICAgICAqLwotICAgIHBJbnN0YW5jZS0+Tm9TbW9vdGhWb2x1bWUgPSBMVk1fRkFMU0U7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMgPSAgTG9jYWxQYXJhbXM7Ci0KLQotICAgIHJldHVybihMVk1fU1VDQ0VTUyk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fU2V0SGVhZHJvb21QYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBhdXRvbWF0aXVjIGhlYWRyb29tIG1hbmFnZW1lbnQgcGFyYW1ldGVycy4gICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBIZWFkcm9vbVBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gaGVhZHJvb20gcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWTV9TdWNjZXNzICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRIZWFkcm9vbVBhcmFtcyhMVk1fSGFuZGxlX3QgICAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9IZWFkcm9vbVBhcmFtc190ICAgICAgKnBIZWFkcm9vbVBhcmFtcykKLXsKLSAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICBpaSwgTkJhbmRzOwotCi0gICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KLSAgICBpZiAoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBIZWFkcm9vbVBhcmFtcyA9PSBMVk1fTlVMTCkpCi0gICAgewotICAgICAgICByZXR1cm4gKExWTV9OVUxMQUREUkVTUyk7Ci0gICAgfQotICAgIGlmICgocEhlYWRyb29tUGFyYW1zLT5OSGVhZHJvb21CYW5kcyAhPSAwKSAmJiAocEhlYWRyb29tUGFyYW1zLT5wSGVhZHJvb21EZWZpbml0aW9uID09IExWTV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKLSAgICB9Ci0KLSAgICAvKiBDb25zaWRlciBvbmx5IHRoZSBMVk1fSEVBRFJPT01fTUFYX05CQU5EUyBmaXJzdCBiYW5kcyovCi0gICAgaWYgKHBIZWFkcm9vbVBhcmFtcy0+TkhlYWRyb29tQmFuZHMgPiBMVk1fSEVBRFJPT01fTUFYX05CQU5EUykKLSAgICB7Ci0gICAgICAgIE5CYW5kcyA9IExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBOQmFuZHMgPSBwSGVhZHJvb21QYXJhbXMtPk5IZWFkcm9vbUJhbmRzOwotICAgIH0KLSAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzID0gTkJhbmRzOwotCi0gICAgLyogQ29weSBzZXR0aW5ncyBpbiBtZW1vcnkgKi8KLSAgICBmb3IoaWkgPSAwOyBpaSA8IE5CYW5kczsgaWkrKykKLSAgICB7Ci0gICAgICAgIHBJbnN0YW5jZS0+cEhlYWRyb29tX0JhbmREZWZzW2lpXSA9IHBIZWFkcm9vbVBhcmFtcy0+cEhlYWRyb29tRGVmaW5pdGlvbltpaV07Ci0gICAgfQotCi0gICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uID0gcEluc3RhbmNlLT5wSGVhZHJvb21fQmFuZERlZnM7Ci0gICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlID0gcEhlYWRyb29tUGFyYW1zLT5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlOwotICAgIHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPSBMVk1fVFJVRTsKLQotICAgIHJldHVybihMVk1fU1VDQ0VTUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0dldEhlYWRyb29tUGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCB0aGUgYXV0b21hdGljIGhlYWRyb29tIG1hbmFnZW1lbnQgcGFyYW1ldGVycy4gICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwSGVhZHJvb21QYXJhbXMgICAgICAgICBQb2ludGVyIHRvIGhlYWRyb29tIHBhcmFtZXRlciBzdHJ1Y3R1cmUgKG91dHB1dCkgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIFdoZW4gaEluc3RhbmNlIG9yIHBIZWFkcm9vbVBhcmFtcyBhcmUgTlVMTCAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRIZWFkcm9vbVBhcmFtcyhMVk1fSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICpwSGVhZHJvb21QYXJhbXMpCi17Ci0gICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlID0oTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9VSU5UMTYgICAgICAgICAgaWk7Ci0KLSAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLwotICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEhlYWRyb29tUGFyYW1zID09IExWTV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKLSAgICB9Ci0KLSAgICBwSGVhZHJvb21QYXJhbXMtPk5IZWFkcm9vbUJhbmRzID0gcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kczsKLQotCi0gICAgLyogQ29weSBzZXR0aW5ncyBpbiBtZW1vcnkgKi8KLSAgICBmb3IoaWkgPSAwOyBpaSA8IHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHM7IGlpKyspCi0gICAgewotICAgICAgICBwSW5zdGFuY2UtPnBIZWFkcm9vbV9Vc2VyRGVmc1tpaV0gPSBwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmc1tpaV07Ci0gICAgfQotCi0KLSAgICBwSGVhZHJvb21QYXJhbXMtPnBIZWFkcm9vbURlZmluaXRpb24gPSBwSW5zdGFuY2UtPnBIZWFkcm9vbV9Vc2VyRGVmczsKLSAgICBwSGVhZHJvb21QYXJhbXMtPkhlYWRyb29tX09wZXJhdGluZ01vZGUgPSBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGU7Ci0gICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fQWxnb0NhbGxCYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGlzIHRoZSBjYWxsYmFjayBmdW5jdGlvbiBvZiB0aGUgYWxnb3JpdGhtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwQnVuZGxlSGFuZGxlICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBEYXRhICAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgY2FsbGJhY2tJZCAgICAgICAgICAgICAgSUQgb2YgdGhlIGNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fSU5UMzIgTFZNX0FsZ29DYWxsQmFjayggdm9pZCAgICAgICAgICAqcEJ1bmRsZUhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIGNhbGxiYWNrSWQpCi17Ci0gICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlID0oTFZNX0luc3RhbmNlX3QgICopcEJ1bmRsZUhhbmRsZTsKLQotICAgICh2b2lkKSBwRGF0YTsKLQotICAgIHN3aXRjaChjYWxsYmFja0lkICYgMHhGRjAwKXsKLSAgICAgICAgY2FzZSBBTEdPUklUSE1fQ1NfSUQ6Ci0gICAgICAgICAgICBzd2l0Y2goY2FsbGJhY2tJZCAmIDB4MDBGRikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIExWQ1NfRVZFTlRfQUxHT0ZGOgotICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkNTX0FjdGl2ZSA9IExWTV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBBTEdPUklUSE1fRVFOQl9JRDoKLSAgICAgICAgICAgIHN3aXRjaChjYWxsYmFja0lkICYgMHgwMEZGKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgTFZFUU5CX0VWRU5UX0FMR09GRjoKLSAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5FUU5CX0FjdGl2ZSA9IExWTV9GQUxTRTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9WQ0NhbGxCYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIHRoZSBWb2x1bWUgY29udHJvbC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBCdW5kbGVIYW5kbGUgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcEdlbmVyYWxQdXJwb3NlICAgICAgICAgUG9pbnRlciB0byB0aGUgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDYWxsQmFja1BhcmFtICAgICAgICAgICBJRCBvZiB0aGUgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWTV9JTlQzMiAgICBMVk1fVkNDYWxsQmFjayh2b2lkKiAgIHBCdW5kbGVIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogICBwR2VuZXJhbFB1cnBvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnQgICBDYWxsQmFja1BhcmFtKQotewotICAgIExWTV9JbnN0YW5jZV90ICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKilwQnVuZGxlSGFuZGxlOwotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgTFZNX0ZMT0FUICAgIFRhcmdldDsKLSNlbHNlCi0gICAgTFZNX0lOVDMyICAgIFRhcmdldDsKLSNlbmRpZgotCi0gICAgKHZvaWQpIHBHZW5lcmFsUHVycG9zZTsKLSAgICAodm9pZCkgQ2FsbEJhY2tQYXJhbTsKLQotICAgIC8qIFdoZW4gdm9sdW1lIG1peGVyIGhhcyByZWFjaGVkIDAgZEIgdGFyZ2V0IHRoZW4gc3RvcCBpdCB0byBhdm9pZAotICAgICAgIHVubmVjZXNzYXJ5IHByb2Nlc3NpbmcuICovCi0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICBUYXJnZXQgPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSk7Ci0gICAgaWYoVGFyZ2V0ID09IDEuMGYpCi0gICAgewotICAgICAgICBwSW5zdGFuY2UtPlZDX0FjdGl2ZSA9IExWTV9GQUxTRTsKLSAgICB9Ci0jZWxzZQotICAgIFRhcmdldCA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdKTsKLQotICAgIGlmKFRhcmdldCA9PSAweDdGRkYpCi0gICAgewotICAgICAgICBwSW5zdGFuY2UtPlZDX0FjdGl2ZSA9IExWTV9GQUxTRTsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gMTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Db250cm9sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjJjOTBhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0NvbnRyb2wuY3BwCkBAIC0wLDAgKzEsMTA2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiTFZNX0NvZWZmcy5oIgorI2luY2x1ZGUgIkxWTV9UYWJsZXMuaCIKKyNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNldHMgb3IgY2hhbmdlcyB0aGUgTGlmZVZpYmVzIG1vZHVsZSBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fTlVMTEFERFJFU1MgICAgV2hlbiBoSW5zdGFuY2UsIHBQYXJhbXMgb3IgYW55IGNvbnRyb2wgcG9pbnRlcnMgYXJlIE5VTEwgICAgICAgICAqLworLyogIExWTV9PVVRPRlJBTkdFICAgICBXaGVuIGFueSBvZiB0aGUgY29udHJvbCBwYXJhbWV0ZXJzIGFyZSBvdXQgb2YgcmFuZ2UgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhMVk1fSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgKnBQYXJhbXMpCit7CisgICAgTFZNX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworICAgIGlmICgocFBhcmFtcyA9PSBMVk1fTlVMTCkgfHwgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9OVUxMQUREUkVTUyk7CisgICAgfQorCisgICAgcEluc3RhbmNlLT5OZXdQYXJhbXMgPSAqcFBhcmFtczsKKworICAgIGlmKAorICAgICAgICAvKiBHZW5lcmFsIHBhcmFtZXRlcnMgKi8KKyAgICAgICAgKChwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09GRikgJiYgKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT04pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAoKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzgwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMTAyNSkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzEyMDAwKSAgICAgICAmJgorICAgICAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTYwMDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yMjA1MCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzI0MDAwKSAgICAgICYmCisgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApICAgICAgJiYKKyAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzg4MjAwKSAmJiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfOTYwMDApICYmCisgICAgIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNzY0MDApICYmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xOTIwMDApKSAgICAgIHx8CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAoKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJgorICAgICAgICAgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJgorICAgICAgICAgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykgJiYKKyAgICAgICAgIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01VTFRJQ0hBTk5FTCkpIHx8CisjZWxzZQorICAgICAgICAoKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJiAocFBhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmIChwUGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pKSB8fAorI2VuZGlmCisgICAgICAgIChwUGFyYW1zLT5TcGVha2VyVHlwZSA+IExWTV9FWF9IRUFEUEhPTkVTKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5OckNoYW5uZWxzID0gcFBhcmFtcy0+TnJDaGFubmVsczsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5DaE1hc2sgICAgID0gcFBhcmFtcy0+Q2hNYXNrOworI2VuZGlmCisgICAgLyoKKyAgICAgKiBDaW5lbWEgU291bmQgcGFyYW1ldGVycworICAgICAqLworICAgIGlmKChwUGFyYW1zLT5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT0ZGKSAmJiAocFBhcmFtcy0+VmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09OKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKworICAgIGlmKHBQYXJhbXMtPlZpcnR1YWxpemVyVHlwZSAhPSBMVk1fQ09OQ0VSVFNPVU5EKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgfQorCisgICAgaWYocFBhcmFtcy0+VmlydHVhbGl6ZXJSZXZlcmJMZXZlbCA+IExWTV9WSVJUVUFMSVpFUl9NQVhfUkVWRVJCX0xFVkVMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgfQorCisgICAgaWYocFBhcmFtcy0+Q1NfRWZmZWN0TGV2ZWwgPCBMVk1fQ1NfTUlOX0VGRkVDVF9MRVZFTCkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKworICAgIC8qCisgICAgICogTi1CYW5kIEVxdWFsaXplcgorICAgICAqLworICAgIGlmKHBQYXJhbXMtPkVRTkJfTkJhbmRzID4gcEluc3RhbmNlLT5JbnN0UGFyYW1zLkVRTkJfTnVtQmFuZHMpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisKKyAgICAvKiBEZWZpbml0aW9uIHBvaW50ZXIgKi8KKyAgICBpZiAoKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uID09IExWTV9OVUxMKSAmJgorICAgICAgICAocFBhcmFtcy0+RVFOQl9OQmFuZHMgIT0gMCkpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9OVUxMQUREUkVTUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBFcXVhbGlzZXIKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKKworICAgICAgICBpZiAocFBhcmFtcy0+RVFOQl9OQmFuZHMgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpPTA7IGk8cFBhcmFtcy0+RVFOQl9OQmFuZHM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBFUU5CX0JhbmREZWZzW2ldID0gcFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwSW5zdGFuY2UtPk5ld1BhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9IHBJbnN0YW5jZS0+cEVRTkJfQmFuZERlZnM7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYoIC8qIE4tQmFuZCBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLworICAgICAgICAoKHBQYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSAhPSBMVk1fRVFOQl9PRkYpICYmIChwUGFyYW1zLT5FUU5CX09wZXJhdGluZ01vZGUgIT0gTFZNX0VRTkJfT04pKSB8fAorICAgICAgICAocFBhcmFtcy0+RVFOQl9OQmFuZHMgPiBwSW5zdGFuY2UtPkluc3RQYXJhbXMuRVFOQl9OdW1CYW5kcykpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisgICAgLyogQmFuZCBwYXJhbWV0ZXJzKi8KKyAgICB7CisgICAgICAgIExWTV9JTlQxNiBpOworICAgICAgICBmb3IoaSA9IDA7IGkgPCBwUGFyYW1zLT5FUU5CX05CYW5kczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZigoKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeSA8IExWTV9FUU5CX01JTl9CQU5EX0ZSRVEpICB8fAorICAgICAgICAgICAgICAgIChwUGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXS5GcmVxdWVuY3kgPiBMVk1fRVFOQl9NQVhfQkFORF9GUkVRKSkgfHwKKyAgICAgICAgICAgICAgICAoKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkdhaW4gICAgIDwgTFZNX0VRTkJfTUlOX0JBTkRfR0FJTikgIHx8CisgICAgICAgICAgICAgICAgKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkdhaW4gICAgICA+IExWTV9FUU5CX01BWF9CQU5EX0dBSU4pKSB8fAorICAgICAgICAgICAgICAgICgocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baV0uUUZhY3RvciAgPCBMVk1fRVFOQl9NSU5fUUZBQ1RPUikgICAgIHx8CisgICAgICAgICAgICAgICAgKHBQYXJhbXMtPnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLlFGYWN0b3IgICA+IExWTV9FUU5CX01BWF9RRkFDVE9SKSkpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycworICAgICAqLworICAgIGlmKCgocFBhcmFtcy0+QkVfT3BlcmF0aW5nTW9kZSAhPSBMVk1fQkVfT0ZGKSAmJiAocFBhcmFtcy0+QkVfT3BlcmF0aW5nTW9kZSAhPSBMVk1fQkVfT04pKSAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAoKHBQYXJhbXMtPkJFX0VmZmVjdExldmVsIDwgTFZNX0JFX01JTl9FRkZFQ1RMRVZFTCApIHx8IChwUGFyYW1zLT5CRV9FZmZlY3RMZXZlbCA+IExWTV9CRV9NQVhfRUZGRUNUTEVWRUwgKSl8fAorICAgICAgICAoKHBQYXJhbXMtPkJFX0NlbnRyZUZyZXEgIT0gTFZNX0JFX0NFTlRSRV81NUh6KSAmJiAocFBhcmFtcy0+QkVfQ2VudHJlRnJlcSAhPSBMVk1fQkVfQ0VOVFJFXzY2SHopICAgICAgICAgICAmJgorICAgICAgICAocFBhcmFtcy0+QkVfQ2VudHJlRnJlcSAhPSBMVk1fQkVfQ0VOVFJFXzc4SHopICYmIChwUGFyYW1zLT5CRV9DZW50cmVGcmVxICE9IExWTV9CRV9DRU5UUkVfOTBIeikpICAgICAgICAgICB8fAorICAgICAgICAoKHBQYXJhbXMtPkJFX0hQRiAhPSBMVk1fQkVfSFBGX09GRikgJiYgKHBQYXJhbXMtPkJFX0hQRiAhPSBMVk1fQkVfSFBGX09OKSkpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFZvbHVtZSBDb250cm9sIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBpZigocFBhcmFtcy0+VkNfRWZmZWN0TGV2ZWwgPCBMVk1fVkNfTUlOX0VGRkVDVExFVkVMICkgfHwgKHBQYXJhbXMtPlZDX0VmZmVjdExldmVsID4gTFZNX1ZDX01BWF9FRkZFQ1RMRVZFTCApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgfQorICAgIGlmKChwUGFyYW1zLT5WQ19CYWxhbmNlIDwgTFZNX1ZDX0JBTEFOQ0VfTUlOICkgfHwgKHBQYXJhbXMtPlZDX0JhbGFuY2UgPiBMVk1fVkNfQkFMQU5DRV9NQVggKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKworICAgIC8qCisgICAgICogUFNBIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBpZiAoKChMVlBTQV9MZXZlbERldGVjdFNwZWVkX2VuKXBQYXJhbXMtPlBTQV9QZWFrRGVjYXlSYXRlID4gTFZQU0FfU1BFRURfSElHSCkgfHwKKyAgICAgICAgKHBQYXJhbXMtPlBTQV9FbmFibGUgPiBMVk1fUFNBX09OKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKworICAgIC8qCisgICAgKiBTZXQgdGhlIGZsYWcgdG8gaW5kaWNhdGUgdGhlcmUgYXJlIG5ldyBwYXJhbWV0ZXJzIHRvIHVzZQorICAgICoKKyAgICAqIFByb3RlY3QgdGhlIGNvcHkgb2YgdGhlIG5ldyBwYXJhbWV0ZXJzIGZyb20gaW50ZXJydXB0cyB0byBhdm9pZCBwb3NzaWJsZSBwcm9ibGVtcworICAgICogd2l0aCBsb3NzIGNvbnRyb2wgcGFyYW1ldGVycy4gVGhpcyBwcm9ibGVtIGNhbiBvY2N1ciBpZiB0aGlzIGNvbnRyb2wgZnVuY3Rpb24gaXMgY2FsbGVkIG1vcmUKKyAgICAqIHRoYW4gb25jZSBiZWZvcmUgYSBjYWxsIHRvIHRoZSBwcm9jZXNzIGZ1bmN0aW9uLiBJZiB0aGUgcHJvY2VzcyBmdW5jdGlvbiBpbnRlcnJ1cHRzCisgICAgKiB0aGUgY29weSB0byBOZXdQYXJhbXMgdGhlbiBvbmUgZnJhbWUgbWF5IGhhdmUgbWl4ZWQgcGFyYW1ldGVycywgc29tZSBvbGQgYW5kIHNvbWUgbmV3LgorICAgICovCisgICAgcEluc3RhbmNlLT5Db250cm9sUGVuZGluZyA9IExWTV9UUlVFOworCisgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXF1ZXN0IHRoZSBMaWZlVmliZXMgbW9kdWxlIHBhcmFtZXRlcnMuIFRoZSBjdXJyZW50IHBhcmFtZXRlciBzZXQgaXMgcmV0dXJuZWQgICAgICAqLworLyogIHZpYSB0aGUgcGFyYW1ldGVyIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fTlVMTEFERFJFU1MgICAgICB3aGVuIGFueSBvZiBoSW5zdGFuY2Ugb3IgcFBhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0Q29udHJvbFBhcmFtZXRlcnMoTFZNX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKQoreworICAgIExWTV9JbnN0YW5jZV90ICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKyAgICAvKgorICAgICAqIENoZWNrIHBvaW50ZXIKKyAgICAgKi8KKyAgICBpZiAoKHBQYXJhbXMgPT0gTFZNX05VTEwpIHx8IChoSW5zdGFuY2UgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fTlVMTEFERFJFU1MpOworICAgIH0KKyAgICAqcFBhcmFtcyA9IHBJbnN0YW5jZS0+TmV3UGFyYW1zOworCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBFcXVhbGlzZXIKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKKworICAgICAgICBpZiAocEluc3RhbmNlLT5OZXdQYXJhbXMuRVFOQl9OQmFuZHMgIT0gMCkKKyAgICAgICAgZm9yIChpPTA7IGk8cEluc3RhbmNlLT5OZXdQYXJhbXMuRVFOQl9OQmFuZHM7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlLT5wRVFOQl9Vc2VyRGVmc1tpXSA9IHBJbnN0YW5jZS0+cEVRTkJfQmFuZERlZnNbaV07CisgICAgICAgIH0KKyAgICAgICAgcFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb24gPSBwSW5zdGFuY2UtPnBFUU5CX1VzZXJEZWZzOworICAgIH0KKworICAgIHJldHVybihMVk1fU1VDQ0VTUyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX1NldFRyZWJsZUJvb3N0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRW5hYmxlIHRoZSB0cmVibGUgYm9vc3Qgd2hlbiB0aGUgc2V0dGluZ3MgYXJlIGFwcHJvcHJpYXRlLCBpLmUuIG5vbi16ZXJvIGdhaW4gICAgICAgKi8KKy8qICBhbmQgdGhlIHNhbXBsZSByYXRlIGlzIGhpZ2ggZW5vdWdoIGZvciB0aGUgZWZmZWN0IHRvIGJlIGhlYXJkLiAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdGFuY2UgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIHBhcmFtZXRlcnMgdG8gdXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVk1fU2V0VHJlYmxlQm9vc3QoTFZNX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcykKK3sKKyAgICBleHRlcm4gRk9fRkxPQVRfTFNoeF9Db2Vmc190ICBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdOworCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgT2Zmc2V0OworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEVmZmVjdExldmVsID0gMDsKKworICAgIC8qCisgICAgICogTG9hZCB0aGUgY29lZmZpY2llbnRzCisgICAgICovCisgICAgaWYgKChwUGFyYW1zLT5URV9PcGVyYXRpbmdNb2RlID09IExWTV9URV9PTikgJiYKKyAgICAgICAgKHBQYXJhbXMtPlNhbXBsZVJhdGUgPj0gVHJlYmxlQm9vc3RNaW5SYXRlKSAmJgorICAgICAgICAocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikgJiYKKyAgICAgICAgKHBQYXJhbXMtPlRFX0VmZmVjdExldmVsID4gMCkpCisgICAgeworICAgICAgICBpZigocFBhcmFtcy0+VEVfRWZmZWN0TGV2ZWwgPT0gTFZNX1RFX0xPV19NSVBTKSAmJgorICAgICAgICAgICAgKChwUGFyYW1zLT5TcGVha2VyVHlwZSA9PSBMVk1fSEVBRFBIT05FUyl8fAorICAgICAgICAgICAgKHBQYXJhbXMtPlNwZWFrZXJUeXBlID09IExWTV9FWF9IRUFEUEhPTkVTKSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+VEVfQWN0aXZlID0gTFZNX0ZBTFNFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRWZmZWN0TGV2ZWwgPSBwUGFyYW1zLT5URV9FZmZlY3RMZXZlbDsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+VEVfQWN0aXZlID0gTFZNX1RSVUU7CisgICAgICAgIH0KKworICAgICAgICBpZihwSW5zdGFuY2UtPlRFX0FjdGl2ZSA9PSBMVk1fVFJVRSkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIExvYWQgdGhlIGNvZWZmaWNpZW50cyBhbmQgZW5hYmxlZCB0aGUgdHJlYmxlIGJvb3N0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIE9mZnNldCA9IChMVk1fSU5UMTYpKEVmZmVjdExldmVsIC0gMSArIFRyZWJsZUJvb3N0U3RlcHMgKiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAtIFRyZWJsZUJvb3N0TWluUmF0ZSkpOworICAgICAgICAgICAgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBURV9TdGF0ZS0+VHJlYmxlQm9vc3RfU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTFZNX1RyZWJsZUJvb3N0Q29lZnNbT2Zmc2V0XSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDbGVhciB0aGUgdGFwcworICAgICAgICAgICAgICovCisgICAgICAgICAgICBMb2FkQ29uc3RfRmxvYXQoKExWTV9GTE9BVCkwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcEluc3RhbmNlLT5wVEVfVGFwcy0+VHJlYmxlQm9vc3RfVGFwcywgIC8qIERlc3RpbmF0aW9uLlwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzdCB0byB2b2lkOiBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwSW5zdGFuY2UtPnBURV9UYXBzLT5UcmVibGVCb29zdF9UYXBzKSAvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogRGlzYWJsZSB0aGUgdHJlYmxlIGJvb3N0CisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPlRFX0FjdGl2ZSA9IExWTV9GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZNX1NldFZvbHVtZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvbnZlcnRzIHRoZSBpbnB1dCB2b2x1bWUgZGVtYW5kIGZyb20gZEJzIHRvIGxpbmVhci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgICAgTFZNX1NldFZvbHVtZShMVk1fSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcykKK3sKKworICAgIExWTV9VSU5UMTYgICAgICBkQlNoaWZ0czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDZkQiBzaGlmdHMgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgZEJPZmZzZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUYWJsZSBvZmZzZXQgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgVm9sdW1lID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXF1aXJlZCB2b2x1bWUgaW4gZEJzICovCisgICAgTFZNX0ZMT0FUICAgICAgICBUZW1wOworCisgICAgLyoKKyAgICAgKiBMaW1pdCB0aGUgZ2FpbiB0byB0aGUgbWF4aW11bSBhbGxvd2VkCisgICAgICovCisgICAgIGlmICAocFBhcmFtcy0+VkNfRWZmZWN0TGV2ZWwgPiAwKQorICAgICB7CisgICAgICAgICBWb2x1bWUgPSAwOworICAgICB9CisgICAgIGVsc2UKKyAgICAgeworICAgICAgICAgVm9sdW1lID0gcFBhcmFtcy0+VkNfRWZmZWN0TGV2ZWw7CisgICAgIH0KKworICAgICAvKiBDb21wZW5zYXRlIHRoaXMgdm9sdW1lIGluIFBTQSBwbG90ICovCisgICAgIGlmKFZvbHVtZSA+IC02MCkgIC8qIExpbWl0IHZvbHVtZSBsb3NzIHRvIFBTQSBMaW1pdHMqLworICAgICAgICAgcEluc3RhbmNlLT5QU0FfR2Fpbk9mZnNldD0oTFZNX0lOVDE2KSgtVm9sdW1lKTsvKiBMb3NzIGlzIGNvbXBlbnNhdGVkIGJ5IEdhaW4qLworICAgICBlbHNlCisgICAgICAgICBwSW5zdGFuY2UtPlBTQV9HYWluT2Zmc2V0PShMVk1fSU5UMTYpNjA7LyogTG9zcyBpcyBjb21wZW5zYXRlZCBieSBHYWluKi8KKworICAgIHBJbnN0YW5jZS0+VkNfQVZMRml4ZWRWb2x1bWUgPSAwOworCisgICAgLyoKKyAgICAgKiBTZXQgdm9sdW1lIGNvbnRyb2wgYW5kIEFWTCB2b2x1bWVzIGFjY29yZGluZyB0byBoZWFkcm9vbSBhbmQgdm9sdW1lIHVzZXIgc2V0dGluZworICAgICAqLworICAgIGlmKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pCisgICAgeworICAgICAgICAvKiBEZWZhdWx0IFNpdHVhdGlvbiB3aXRoIG5vIEFWTCBhbmQgbm8gUlMgKi8KKyAgICAgICAgaWYocFBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlID09IExWTV9FUU5CX09OKQorICAgICAgICB7CisgICAgICAgICAgICBpZihWb2x1bWUgPiAtcEluc3RhbmNlLT5IZWFkcm9vbSkKKyAgICAgICAgICAgICAgICBWb2x1bWUgPSAoTFZNX0lOVDE2KS1wSW5zdGFuY2UtPkhlYWRyb29tOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBBY3RpdmF0ZSB2b2x1bWUgY29udHJvbCBpZiBuZWNlc3NhcnkKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPlZDX0FjdGl2ZSAgID0gTFZNX1RSVUU7CisgICAgaWYgKFZvbHVtZSAhPSAwKQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWVkQiA9IFZvbHVtZTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWVkQiA9IDA7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIHJlcXVpcmVkIGdhaW4gYW5kIHNoaWZ0cworICAgICAqLworICAgIGRCT2Zmc2V0ID0gKExWTV9VSU5UMTYpKCgtVm9sdW1lKSAlIDYpOyAgICAgICAgICAgICAvKiBHZXQgdGhlIGRCcyAwLTUgKi8KKyAgICBkQlNoaWZ0cyA9IChMVk1fVUlOVDE2KShWb2x1bWUgLyAtNik7ICAgICAgICAgICAgICAgLyogR2V0IHRoZSA2ZEIgc2hpZnRzICovCisKKyAgICAvKgorICAgICAqIFNldCB0aGUgcGFyYW1ldGVycworICAgICAqLworICAgIGlmKGRCU2hpZnRzID09IDApCisgICAgeworICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVClMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdKTsKKyAgICAgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFRlbXAgPSBMVk1fVm9sdW1lVGFibGVbZEJPZmZzZXRdOworICAgICAgICB3aGlsZShkQlNoaWZ0cykgeworICAgICAgICAgICAgVGVtcCA9IFRlbXAgLyAyLjBmOworICAgICAgICAgICAgZEJTaGlmdHMtLTsKKyAgICAgICAgfQorICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwgVGVtcCk7CisgICAgfQorICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gMTsKKyAgICBpZihwSW5zdGFuY2UtPk5vU21vb3RoVm9sdW1lID09IExWTV9UUlVFKQorICAgIHsKKyAgICAgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwgMik7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLCBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLCAyKTsKKyAgICB9Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZNX1NldEhlYWRyb29tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEZpbmQgc3VpdGFibGUgaGVhZHJvb20gYmFzZWQgb24gRVEgc2V0dGluZ3MuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB2b2lkICAgICAgICAgICAgICAgIE5vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAgICBMVk1fU2V0SGVhZHJvb20oTFZNX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgICAqcFBhcmFtcykKK3sKKyAgICBMVk1fSU5UMTYgICBpaSwgamo7CisgICAgTFZNX0lOVDE2ICAgSGVhZHJvb20gPSAwOworICAgIExWTV9JTlQxNiAgIE1heEdhaW4gPSAwOworCisgICAgaWYgKCgoTFZFUU5CX01vZGVfZW4pcFBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikKKyAgICAgICAgICAgJiYgKHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMuSGVhZHJvb21fT3BlcmF0aW5nTW9kZSA9PSBMVk1fSEVBRFJPT01fT04pKQorICAgIHsKKyAgICAgICAgLyogRmluZCB0eXBpY2FsIGhlYWRyb29tIHZhbHVlICovCisgICAgICAgIGZvcihqaiA9IDA7IGpqIDwgcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kczsgamorKykKKyAgICAgICAgeworICAgICAgICAgICAgTWF4R2FpbiA9IDA7CisgICAgICAgICAgICBmb3IoIGlpID0gMDsgaWkgPCBwUGFyYW1zLT5FUU5CX05CYW5kczsgaWkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZigocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baWldLkZyZXF1ZW5jeSA+PSBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bampdLkxpbWl0X0xvdykgJiYKKyAgICAgICAgICAgICAgICAgICAocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baWldLkZyZXF1ZW5jeSA8PSBwSW5zdGFuY2UtPkhlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bampdLkxpbWl0X0hpZ2gpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYocFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baWldLkdhaW4gPiBNYXhHYWluKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBNYXhHYWluID0gcFBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb25baWldLkdhaW47CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmKChNYXhHYWluIC0gcEluc3RhbmNlLT5IZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uW2pqXS5IZWFkcm9vbV9PZmZzZXQpID4gSGVhZHJvb20peworICAgICAgICAgICAgICAgIEhlYWRyb29tID0gKExWTV9JTlQxNikoTWF4R2FpbiAtIHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbltqal0uSGVhZHJvb21fT2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIFNhdHVyYXRlICovCisgICAgICAgIGlmKEhlYWRyb29tIDwgMCkKKyAgICAgICAgICAgIEhlYWRyb29tID0gMDsKKyAgICB9CisgICAgcEluc3RhbmNlLT5IZWFkcm9vbSA9IChMVk1fVUlOVDE2KUhlYWRyb29tIDsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9BcHBseU5ld1NldHRpbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFwcGxpZXMgY2hhbmdlcyB0byBwYXJhbWV0cmVzLiBUaGlzIGZ1bmN0aW9uIG1ha2VzIG5vIGFzc3VtcHRpb25zIGFib3V0IHdoYXQgICAgICAgICovCisvKiAgZWFjaCBtb2R1bGUgbmVlZHMgZm9yIGluaXRpYWxpc2F0aW9uIGFuZCBoZW5jZSBwYXNzZXMgYWxsIHBhcmFtZXRlcnMgdG8gYWxsIHRoZSAgICAgKi8KKy8qICB0aGUgbW9kdWxlcyBpbiB0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TdWNjZXNzICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9BcHBseU5ld1NldHRpbmdzKExWTV9IYW5kbGVfdCAgIGhJbnN0YW5jZSkKK3sKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgIExvY2FsUGFyYW1zOworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgQ291bnQgPSA1OworCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSBuZXcgcGFyYW1ldGVycyBidXQgbWFrZSBzdXJlIHRoZXkgZGlkbid0IGNoYW5nZSB3aGlsZSBjb3B5aW5nCisgICAgICovCisgICAgZG8KKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPSBMVk1fRkFMU0U7CisgICAgICAgIExvY2FsUGFyYW1zID0gcEluc3RhbmNlLT5OZXdQYXJhbXM7CisgICAgICAgIHBJbnN0YW5jZS0+SGVhZHJvb21QYXJhbXMgPSBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zOworICAgICAgICBDb3VudC0tOworICAgIH0gd2hpbGUgKChwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nICE9IExWTV9GQUxTRSkgJiYKKyAgICAgICAgICAgICAoQ291bnQgPiAwKSk7CisKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgcEluc3RhbmNlLT5OckNoYW5uZWxzID0gTG9jYWxQYXJhbXMuTnJDaGFubmVsczsKKyAgICBwSW5zdGFuY2UtPkNoTWFzayA9IExvY2FsUGFyYW1zLkNoTWFzazsKKyNlbmRpZgorCisgICAgLyogQ2xlYXIgYWxsIGludGVybmFsIGRhdGEgaWYgZm9ybWF0IGNoYW5nZSovCisgICAgaWYoTG9jYWxQYXJhbXMuU291cmNlRm9ybWF0ICE9IHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCkKKyAgICB7CisgICAgICAgIExWTV9DbGVhckF1ZGlvQnVmZmVycyhwSW5zdGFuY2UpOworICAgICAgICBwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID0gTFZNX0ZBTFNFOworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSB0cmVibGUgYm9vc3QgaWYgcmVxdWlyZWQKKyAgICAgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlRFX0VmZmVjdExldmVsICE9IExvY2FsUGFyYW1zLlRFX0VmZmVjdExldmVsKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSAhPSBMb2NhbFBhcmFtcy5URV9PcGVyYXRpbmdNb2RlKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAhPSBMb2NhbFBhcmFtcy5PcGVyYXRpbmdNb2RlKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gTG9jYWxQYXJhbXMuU3BlYWtlclR5cGUpKQorICAgIHsKKyAgICAgICAgTFZNX1NldFRyZWJsZUJvb3N0KHBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZMb2NhbFBhcmFtcyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGhlYWRyb29tIGlmIHJlcXVpcmVkCisgICAgICovCisgICAgICAgIExWTV9TZXRIZWFkcm9vbShwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICZMb2NhbFBhcmFtcyk7ICAgICAgICAgICAgICAgICAgLyogTmV3IHBhcmFtZXRlcnMgKi8KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSB2b2x1bWUgaWYgcmVxdWlyZWQKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWTV9TZXRWb2x1bWUocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgJkxvY2FsUGFyYW1zKTsgICAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyAqLworICAgIH0KKyAgICAvKiBBcHBseSBiYWxhbmNlIGNoYW5nZXMqLworICAgIGlmKHBJbnN0YW5jZS0+UGFyYW1zLlZDX0JhbGFuY2UgIT0gTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSkKKyAgICB7CisgICAgICAgIC8qIENvbmZpZ3VyZSBNaXhlciBtb2R1bGUgZm9yIGdyYWR1YWwgY2hhbmdlcyB0byB2b2x1bWUqLworICAgICAgICBpZihMb2NhbFBhcmFtcy5WQ19CYWxhbmNlIDwgMCkKKyAgICAgICAgeworICAgICAgICAgICAgTFZNX0ZMT0FUIFRhcmdldF9GbG9hdDsKKyAgICAgICAgICAgIC8qIERyb3AgaW4gcmlnaHQgY2hhbm5lbCB2b2x1bWUqLworICAgICAgICAgICAgVGFyZ2V0X0Zsb2F0ID0gTFZNX01BWEZMT0FUOworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLCBUYXJnZXRfRmxvYXQpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSwgTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7CisKKyAgICAgICAgICAgIFRhcmdldF9GbG9hdCA9IGRCX3RvX0xpbkZsb2F0KChMVk1fSU5UMTYpKExvY2FsUGFyYW1zLlZDX0JhbGFuY2UgPDwgNCkpOworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLCBUYXJnZXRfRmxvYXQpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSwgTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZihMb2NhbFBhcmFtcy5WQ19CYWxhbmNlID4wKQorICAgICAgICB7CisgICAgICAgICAgICBMVk1fRkxPQVQgVGFyZ2V0X0Zsb2F0OworICAgICAgICAgICAgLyogRHJvcCBpbiBsZWZ0IGNoYW5uZWwgdm9sdW1lKi8KKyAgICAgICAgICAgIFRhcmdldF9GbG9hdCA9IGRCX3RvX0xpbkZsb2F0KChMVk1fSU5UMTYpKCgtTG9jYWxQYXJhbXMuVkNfQmFsYW5jZSkgPDwgNCkpOworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLCBUYXJnZXRfRmxvYXQpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVkNfTUlYRVJfVElNRSwgTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7CisKKyAgICAgICAgICAgIFRhcmdldF9GbG9hdCA9IExWTV9NQVhGTE9BVDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwgVGFyZ2V0X0Zsb2F0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsIExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTFZNX0ZMT0FUIFRhcmdldF9GbG9hdDsKKyAgICAgICAgICAgIC8qIE5vIGRyb3AqLworICAgICAgICAgICAgVGFyZ2V0X0Zsb2F0ID0gTFZNX01BWEZMT0FUOworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLFRhcmdldF9GbG9hdCk7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9WQ19NSVhFUl9USU1FLExvY2FsUGFyYW1zLlNhbXBsZVJhdGUsIDEpOworCisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sVGFyZ2V0X0Zsb2F0KTsKKyAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1ZDX01JWEVSX1RJTUUsTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZSwgMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGJhc3MgZW5oYW5jZW1lbnQKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWREJFX1JldHVyblN0YXR1c19lbiAgICAgICBEQkVfU3RhdHVzOworICAgICAgICBMVkRCRV9QYXJhbXNfdCAgICAgICAgICAgICAgREJFX1BhcmFtczsKKyAgICAgICAgTFZEQkVfSGFuZGxlX3QgICAgICAgICAgICAgICpoREJFSW5zdGFuY2UgPSAoTFZEQkVfSGFuZGxlX3QgKilwSW5zdGFuY2UtPmhEQkVJbnN0YW5jZTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIG5ldyBwYXJhbWV0ZXJzCisgICAgICAgICAqLworICAgICAgICBpZihMb2NhbFBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09GRikKKyAgICAgICAgeworICAgICAgICAgICAgREJFX1BhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZEQkVfT0ZGOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgREJFX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gKExWREJFX01vZGVfZW4pTG9jYWxQYXJhbXMuQkVfT3BlcmF0aW5nTW9kZTsKKyAgICAgICAgfQorICAgICAgICBEQkVfUGFyYW1zLlNhbXBsZVJhdGUgICAgICAgPSAoTFZEQkVfRnNfZW4pTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZTsKKyAgICAgICAgREJFX1BhcmFtcy5FZmZlY3RMZXZlbCAgICAgID0gTG9jYWxQYXJhbXMuQkVfRWZmZWN0TGV2ZWw7CisgICAgICAgIERCRV9QYXJhbXMuQ2VudHJlRnJlcXVlbmN5ICA9IChMVkRCRV9DZW50cmVGcmVxX2VuKUxvY2FsUGFyYW1zLkJFX0NlbnRyZUZyZXE7CisgICAgICAgIERCRV9QYXJhbXMuSFBGU2VsZWN0ICAgICAgICA9IChMVkRCRV9GaWx0ZXJTZWxlY3RfZW4pTG9jYWxQYXJhbXMuQkVfSFBGOworICAgICAgICBEQkVfUGFyYW1zLkhlYWRyb29tZEIgICAgICAgPSAwOworICAgICAgICBEQkVfUGFyYW1zLlZvbHVtZUNvbnRyb2wgICAgPSBMVkRCRV9WT0xVTUVfT0ZGOworICAgICAgICBEQkVfUGFyYW1zLlZvbHVtZWRCICAgICAgICAgPSAwOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgREJFX1BhcmFtcy5OckNoYW5uZWxzICAgICAgICAgPSBMb2NhbFBhcmFtcy5OckNoYW5uZWxzOworI2VuZGlmCisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFrZSB0aGUgY2hhbmdlcworICAgICAgICAgKi8KKyAgICAgICAgREJFX1N0YXR1cyA9IExWREJFX0NvbnRyb2woaERCRUluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmREJFX1BhcmFtcyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUXVpdCBpZiB0aGUgY2hhbmdlcyB3ZXJlIG5vdCBhY2NlcHRlZAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKERCRV9TdGF0dXMgIT0gTFZEQkVfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKURCRV9TdGF0dXMpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0IHRoZSBjb250cm9sIGZsYWcKKyAgICAgICAgICovCisgICAgICAgIHBJbnN0YW5jZS0+REJFX0FjdGl2ZSA9IExWTV9UUlVFOworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBOLUJhbmQgRXF1YWxpc2VyCisgICAgICovCisgICAgeworICAgICAgICBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuICAgICAgRVFOQl9TdGF0dXM7CisgICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgICAgICAgICBFUU5CX1BhcmFtczsKKyAgICAgICAgTFZFUU5CX0hhbmRsZV90ICAgICAgICAgICAgICpoRVFOQkluc3RhbmNlID0gKExWRVFOQl9IYW5kbGVfdCAqKXBJbnN0YW5jZS0+aEVRTkJJbnN0YW5jZTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIG5ldyBwYXJhbWV0ZXJzCisgICAgICAgICAqLworCisgICAgICAgIGlmKExvY2FsUGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT0ZGKQorICAgICAgICB7CisgICAgICAgICAgICBFUU5CX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZFUU5CX0JZUEFTUzsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEVRTkJfUGFyYW1zLk9wZXJhdGluZ01vZGUgICAgPSAoTFZFUU5CX01vZGVfZW4pTG9jYWxQYXJhbXMuRVFOQl9PcGVyYXRpbmdNb2RlOworICAgICAgICB9CisKKyAgICAgICAgRVFOQl9QYXJhbXMuU2FtcGxlUmF0ZSAgICAgICA9IChMVkVRTkJfRnNfZW4pTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZTsKKyAgICAgICAgRVFOQl9QYXJhbXMuTkJhbmRzICAgICAgICAgICA9IExvY2FsUGFyYW1zLkVRTkJfTkJhbmRzOworICAgICAgICBFUU5CX1BhcmFtcy5wQmFuZERlZmluaXRpb24gID0gKExWRVFOQl9CYW5kRGVmX3QgKilMb2NhbFBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbjsKKyAgICAgICAgaWYgKExvY2FsUGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fU1RFUkVPKSAgICAvKiBNb25vIGZvcm1hdCBub3Qgc3VwcG9ydGVkICovCisgICAgICAgIHsKKyAgICAgICAgICAgIEVRTkJfUGFyYW1zLlNvdXJjZUZvcm1hdCA9IExWRVFOQl9TVEVSRU87CisgICAgICAgIH0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIC8qIE5vdGU6IEN1cnJlbnRseSBTb3VyY2VGb3JtYXQgZmllbGQgb2YgRVFOQiBpcyBub3QgYmVlbgorICAgICAgICAgKiAgICAgICB1c2VkIGJ5IHRoZSBtb2R1bGUuCisgICAgICAgICAqLworICAgICAgICBlbHNlIGlmIChMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX01VTFRJQ0hBTk5FTCkKKyAgICAgICAgeworICAgICAgICAgICAgRVFOQl9QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZFUU5CX01VTFRJQ0hBTk5FTDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRVFOQl9QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZFUU5CX01PTk9JTlNURVJFTzsgICAgIC8qIEZvcmNlIHRvIE1vbm8taW4tU3RlcmVvIG1vZGUgKi8KKyAgICAgICAgfQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgRVFOQl9QYXJhbXMuTnJDaGFubmVscyAgICAgICAgID0gTG9jYWxQYXJhbXMuTnJDaGFubmVsczsKKyNlbmRpZgorCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgY29udHJvbCBmbGFnCisgICAgICAgICAqLworICAgICAgICBpZiAoKExvY2FsUGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pICYmCisgICAgICAgICAgICAoTG9jYWxQYXJhbXMuRVFOQl9PcGVyYXRpbmdNb2RlID09IExWTV9FUU5CX09OKSkKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlLT5FUU5CX0FjdGl2ZSA9IExWTV9UUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgRVFOQl9QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWRVFOQl9CWVBBU1M7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBNYWtlIHRoZSBjaGFuZ2VzCisgICAgICAgICAqLworICAgICAgICBFUU5CX1N0YXR1cyA9IExWRVFOQl9Db250cm9sKGhFUU5CSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkVRTkJfUGFyYW1zKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBRdWl0IGlmIHRoZSBjaGFuZ2VzIHdlcmUgbm90IGFjY2VwdGVkCisgICAgICAgICAqLworICAgICAgICBpZiAoRVFOQl9TdGF0dXMgIT0gTFZFUU5CX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbilFUU5CX1N0YXR1cyk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIGNvbmNlcnQgc291bmQKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuICAgICAgICBDU19TdGF0dXM7CisgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgICAgICAgICBDU19QYXJhbXM7CisgICAgICAgIExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgICAqaENTSW5zdGFuY2UgPSAoTFZDU19IYW5kbGVfdCAqKXBJbnN0YW5jZS0+aENTSW5zdGFuY2U7CisgICAgICAgIExWTV9Nb2RlX2VuICAgICAgICAgICAgICAgICBDb21wcmVzc29yTW9kZT1MVk1fTU9ERV9PTjsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIG5ldyBwYXJhbWV0ZXJzCisgICAgICAgICAqLworICAgICAgICBpZihMb2NhbFBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pCisgICAgICAgIHsKKyAgICAgICAgICAgIENTX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZDU19PTjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIENTX1BhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZDU19PRkY7CisgICAgICAgIH0KKworICAgICAgICBpZigoTG9jYWxQYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSA9PSBMVk1fVEVfT04pICYmIChMb2NhbFBhcmFtcy5URV9FZmZlY3RMZXZlbCA9PSBMVk1fVEVfTE9XX01JUFMpKQorICAgICAgICB7CisgICAgICAgICAgICBDU19QYXJhbXMuU3BlYWtlclR5cGUgID0gTFZDU19FWF9IRUFEUEhPTkVTOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ1NfUGFyYW1zLlNwZWFrZXJUeXBlICA9IExWQ1NfSEVBRFBIT05FUzsKKyAgICAgICAgfQorCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAvKiBDb25jZXJ0IHNvdW5kIG1vZHVsZSBwcm9jZXNzZXMgb25seSB0aGUgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbHMKKyAgICAgICAgICogZGF0YS4gU28gdGhlIFNvdXJjZSBGb3JtYXQgaXMgc2V0IHRvIExWQ1NfU1RFUkVPIGZvciBtdWx0aWNoYW5uZWwKKyAgICAgICAgICogaW5wdXQgYWxzby4KKyAgICAgICAgICovCisgICAgICAgIGlmIChMb2NhbFBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZNX1NURVJFTyB8fAorICAgICAgICAgICAgTG9jYWxQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NVUxUSUNIQU5ORUwpCisjZWxzZQorICAgICAgICBpZiAoTG9jYWxQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9TVEVSRU8pICAgIC8qIE1vbm8gZm9ybWF0IG5vdCBzdXBwb3J0ZWQgKi8KKyNlbmRpZgorICAgICAgICB7CisgICAgICAgICAgICBDU19QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZDU19TVEVSRU87CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDU19QYXJhbXMuU291cmNlRm9ybWF0ID0gTFZDU19NT05PSU5TVEVSRU87ICAgICAgICAgIC8qIEZvcmNlIHRvIE1vbm8taW4tU3RlcmVvIG1vZGUgKi8KKyAgICAgICAgfQorICAgICAgICBDU19QYXJhbXMuU2FtcGxlUmF0ZSAgPSBMb2NhbFBhcmFtcy5TYW1wbGVSYXRlOworICAgICAgICBDU19QYXJhbXMuUmV2ZXJiTGV2ZWwgPSBMb2NhbFBhcmFtcy5WaXJ0dWFsaXplclJldmVyYkxldmVsOworICAgICAgICBDU19QYXJhbXMuRWZmZWN0TGV2ZWwgPSBMb2NhbFBhcmFtcy5DU19FZmZlY3RMZXZlbDsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgIENTX1BhcmFtcy5OckNoYW5uZWxzICA9IExvY2FsUGFyYW1zLk5yQ2hhbm5lbHM7CisjZW5kaWYKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGNvbnRyb2wgZmxhZworICAgICAgICAgKi8KKyAgICAgICAgaWYgKCgoTFZNX01vZGVfZW4pTG9jYWxQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikgJiYKKyAgICAgICAgICAgICgoTFZDU19Nb2Rlc19lbilMb2NhbFBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgIT0gTFZDU19PRkYpKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkNTX0FjdGl2ZSA9IExWTV9UUlVFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ1NfUGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkNTX09GRjsKKyAgICAgICAgfQorCisgICAgICAgIENTX1BhcmFtcy5Db21wcmVzc29yTW9kZT1Db21wcmVzc29yTW9kZTsKKworICAgICAgICAvKgorICAgICAgICAgKiBNYWtlIHRoZSBjaGFuZ2VzCisgICAgICAgICAqLworICAgICAgICBDU19TdGF0dXMgPSBMVkNTX0NvbnRyb2woaENTSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ1NfUGFyYW1zKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBRdWl0IGlmIHRoZSBjaGFuZ2VzIHdlcmUgbm90IGFjY2VwdGVkCisgICAgICAgICAqLworICAgICAgICBpZiAoQ1NfU3RhdHVzICE9IExWQ1NfU1VDQ0VTUykKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKUNTX1N0YXR1cyk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBQb3dlciBTcGVjdHJ1bSBBbmFseXNlcgorICAgICAqLworICAgIHsKKyAgICAgICAgTFZQU0FfUkVUVVJOICAgICAgICAgICAgICAgIFBTQV9TdGF0dXM7CisgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICBQU0FfUGFyYW1zOworICAgICAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICAgKmhQU0FJbnN0YW5jZSA9IChwTFZQU0FfSGFuZGxlX3QgKilwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIG5ldyBwYXJhbWV0ZXJzCisgICAgICAgICAqLworICAgICAgICBQU0FfUGFyYW1zLkZzID0gTG9jYWxQYXJhbXMuU2FtcGxlUmF0ZTsKKyAgICAgICAgUFNBX1BhcmFtcy5MZXZlbERldGVjdGlvblNwZWVkID0gKExWUFNBX0xldmVsRGV0ZWN0U3BlZWRfZW4pTG9jYWxQYXJhbXMuUFNBX1BlYWtEZWNheVJhdGU7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogTWFrZSB0aGUgY2hhbmdlcworICAgICAgICAgKi8KKyAgICAgICAgaWYocEluc3RhbmNlLT5JbnN0UGFyYW1zLlBTQV9JbmNsdWRlZD09TFZNX1BTQV9PTikKKyAgICAgICAgeworICAgICAgICAgICAgUFNBX1N0YXR1cyA9IExWUFNBX0NvbnRyb2woaFBTQUluc3RhbmNlLAorICAgICAgICAgICAgICAgICZQU0FfUGFyYW1zKTsKKworICAgICAgICAgICAgaWYgKFBTQV9TdGF0dXMgIT0gTFZQU0FfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKVBTQV9TdGF0dXMpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgbmV3IHNldHRpbmdzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9BcHBseU5ld1NldHRpbmdzICgoTFZQU0FfSW5zdGFuY2VQcl90KiloUFNBSW5zdGFuY2UpOworICAgICAgICAgICAgaWYoUFNBX1N0YXR1cyAhPSBMVlBTQV9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pUFNBX1N0YXR1cyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgcGFyYW1ldGVycyBhbmQgY2xlYXIgdGhlIGZsYWcKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPk5vU21vb3RoVm9sdW1lID0gTFZNX0ZBTFNFOworICAgIHBJbnN0YW5jZS0+UGFyYW1zID0gIExvY2FsUGFyYW1zOworCisgICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fU2V0SGVhZHJvb21QYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gc2V0IHRoZSBhdXRvbWF0aXVjIGhlYWRyb29tIG1hbmFnZW1lbnQgcGFyYW1ldGVycy4gICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBIZWFkcm9vbVBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gaGVhZHJvb20gcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TdWNjZXNzICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9TZXRIZWFkcm9vbVBhcmFtcyhMVk1fSGFuZGxlX3QgICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9IZWFkcm9vbVBhcmFtc190ICAgICAgKnBIZWFkcm9vbVBhcmFtcykKK3sKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX1VJTlQxNiAgICAgICAgICBpaSwgTkJhbmRzOworCisgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KKyAgICBpZiAoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBIZWFkcm9vbVBhcmFtcyA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9OVUxMQUREUkVTUyk7CisgICAgfQorICAgIGlmICgocEhlYWRyb29tUGFyYW1zLT5OSGVhZHJvb21CYW5kcyAhPSAwKSAmJiAocEhlYWRyb29tUGFyYW1zLT5wSGVhZHJvb21EZWZpbml0aW9uID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKKyAgICB9CisKKyAgICAvKiBDb25zaWRlciBvbmx5IHRoZSBMVk1fSEVBRFJPT01fTUFYX05CQU5EUyBmaXJzdCBiYW5kcyovCisgICAgaWYgKHBIZWFkcm9vbVBhcmFtcy0+TkhlYWRyb29tQmFuZHMgPiBMVk1fSEVBRFJPT01fTUFYX05CQU5EUykKKyAgICB7CisgICAgICAgIE5CYW5kcyA9IExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBOQmFuZHMgPSBwSGVhZHJvb21QYXJhbXMtPk5IZWFkcm9vbUJhbmRzOworICAgIH0KKyAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzID0gTkJhbmRzOworCisgICAgLyogQ29weSBzZXR0aW5ncyBpbiBtZW1vcnkgKi8KKyAgICBmb3IoaWkgPSAwOyBpaSA8IE5CYW5kczsgaWkrKykKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+cEhlYWRyb29tX0JhbmREZWZzW2lpXSA9IHBIZWFkcm9vbVBhcmFtcy0+cEhlYWRyb29tRGVmaW5pdGlvbltpaV07CisgICAgfQorCisgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uID0gcEluc3RhbmNlLT5wSGVhZHJvb21fQmFuZERlZnM7CisgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlID0gcEhlYWRyb29tUGFyYW1zLT5IZWFkcm9vbV9PcGVyYXRpbmdNb2RlOworICAgIHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPSBMVk1fVFJVRTsKKworICAgIHJldHVybihMVk1fU1VDQ0VTUyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0dldEhlYWRyb29tUGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCB0aGUgYXV0b21hdGljIGhlYWRyb29tIG1hbmFnZW1lbnQgcGFyYW1ldGVycy4gICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSGVhZHJvb21QYXJhbXMgICAgICAgICBQb2ludGVyIHRvIGhlYWRyb29tIHBhcmFtZXRlciBzdHJ1Y3R1cmUgKG91dHB1dCkgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIFdoZW4gaEluc3RhbmNlIG9yIHBIZWFkcm9vbVBhcmFtcyBhcmUgTlVMTCAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRIZWFkcm9vbVBhcmFtcyhMVk1fSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICpwSGVhZHJvb21QYXJhbXMpCit7CisgICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlID0oTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9VSU5UMTYgICAgICAgICAgaWk7CisKKyAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLworICAgIGlmICgoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEhlYWRyb29tUGFyYW1zID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX05VTExBRERSRVNTKTsKKyAgICB9CisKKyAgICBwSGVhZHJvb21QYXJhbXMtPk5IZWFkcm9vbUJhbmRzID0gcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kczsKKworICAgIC8qIENvcHkgc2V0dGluZ3MgaW4gbWVtb3J5ICovCisgICAgZm9yKGlpID0gMDsgaWkgPCBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLk5IZWFkcm9vbUJhbmRzOyBpaSsrKQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5wSGVhZHJvb21fVXNlckRlZnNbaWldID0gcEluc3RhbmNlLT5wSGVhZHJvb21fQmFuZERlZnNbaWldOworICAgIH0KKworICAgIHBIZWFkcm9vbVBhcmFtcy0+cEhlYWRyb29tRGVmaW5pdGlvbiA9IHBJbnN0YW5jZS0+cEhlYWRyb29tX1VzZXJEZWZzOworICAgIHBIZWFkcm9vbVBhcmFtcy0+SGVhZHJvb21fT3BlcmF0aW5nTW9kZSA9IHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuSGVhZHJvb21fT3BlcmF0aW5nTW9kZTsKKyAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9BbGdvQ2FsbEJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgaXMgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uIG9mIHRoZSBhbGdvcml0aG0uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBCdW5kbGVIYW5kbGUgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcERhdGEgICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBjYWxsYmFja0lkICAgICAgICAgICAgICBJRCBvZiB0aGUgY2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWTV9JTlQzMiBMVk1fQWxnb0NhbGxCYWNrKCB2b2lkICAgICAgICAgICpwQnVuZGxlSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgY2FsbGJhY2tJZCkKK3sKKyAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgPShMVk1fSW5zdGFuY2VfdCAgKilwQnVuZGxlSGFuZGxlOworCisgICAgKHZvaWQpIHBEYXRhOworCisgICAgc3dpdGNoKGNhbGxiYWNrSWQgJiAweEZGMDApeworICAgICAgICBjYXNlIEFMR09SSVRITV9DU19JRDoKKyAgICAgICAgICAgIHN3aXRjaChjYWxsYmFja0lkICYgMHgwMEZGKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNhc2UgTFZDU19FVkVOVF9BTEdPRkY6CisgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q1NfQWN0aXZlID0gTFZNX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFMR09SSVRITV9FUU5CX0lEOgorICAgICAgICAgICAgc3dpdGNoKGNhbGxiYWNrSWQgJiAweDAwRkYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2FzZSBMVkVRTkJfRVZFTlRfQUxHT0ZGOgorICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkVRTkJfQWN0aXZlID0gTFZNX0ZBTFNFOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIDA7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX1ZDQ2FsbEJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBpcyB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gb2YgdGhlIFZvbHVtZSBjb250cm9sLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEJ1bmRsZUhhbmRsZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwR2VuZXJhbFB1cnBvc2UgICAgICAgICBQb2ludGVyIHRvIHRoZSBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENhbGxCYWNrUGFyYW0gICAgICAgICAgIElEIG9mIHRoZSBjYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZNX0lOVDMyICAgIExWTV9WQ0NhbGxCYWNrKHZvaWQqICAgcEJ1bmRsZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiAgIHBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaG9ydCAgIENhbGxCYWNrUGFyYW0pCit7CisgICAgTFZNX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKXBCdW5kbGVIYW5kbGU7CisgICAgTFZNX0ZMT0FUICAgIFRhcmdldDsKKworICAgICh2b2lkKSBwR2VuZXJhbFB1cnBvc2U7CisgICAgKHZvaWQpIENhbGxCYWNrUGFyYW07CisKKyAgICAvKiBXaGVuIHZvbHVtZSBtaXhlciBoYXMgcmVhY2hlZCAwIGRCIHRhcmdldCB0aGVuIHN0b3AgaXQgdG8gYXZvaWQKKyAgICAgICB1bm5lY2Vzc2FyeSBwcm9jZXNzaW5nLiAqLworICAgIFRhcmdldCA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdKTsKKyAgICBpZihUYXJnZXQgPT0gMS4wZikKKyAgICB7CisgICAgICAgIHBJbnN0YW5jZS0+VkNfQWN0aXZlID0gTFZNX0ZBTFNFOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmMxYzRmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Jbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTFZNX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJMVk1fVGFibGVzLmgiCi0jaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgotI2luY2x1ZGUgIkluc3RBbGxvYy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9HZXRNZW1vcnlUYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCi0vKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICAgKi8KLS8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICAgKi8KLS8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICovCi0vKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZGVmYXVsdCBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgICBXaGVuIG9uZSBvZiBwTWVtb3J5VGFibGUgb3IgcEluc3RQYXJhbXMgaXMgTlVMTCAgICAgICAgICAgICAqLwotLyogIExWTV9PVVRPRlJBTkdFICAgICAgICAgIFdoZW4gYW55IG9mIHRoZSBJbnN0YW5jZSBwYXJhbWV0ZXJzIGFyZSBvdXQgb2YgcmFuZ2UgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICovCi0vKiAgMi4gIFRoZSBzY3JhdGNoIG1lbW9yeSBpcyB0aGUgbGFyZ2VzdCByZXF1aXJlZCBieSBhbnkgb2YgdGhlIHN1Yi1tb2R1bGVzIHBsdXMgYW55ICAgKi8KLS8qICAgICAgYWRkaXRpb25hbCBzY3JhdGNoIHJlcXVpcmVtZW50cyBvZiB0aGUgYnVuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fR2V0TWVtb3J5VGFibGUoTFZNX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01lbVRhYl90ICAgICAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JbnN0UGFyYW1zX3QgICAgICpwSW5zdFBhcmFtcykKLXsKLQotICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSA9IChMVk1fSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKLSAgICBMVk1fVUlOVDMyICAgICAgICAgIEFsZ1NjcmF0Y2hTaXplOwotICAgIExWTV9VSU5UMzIgICAgICAgICAgQnVuZGxlU2NyYXRjaFNpemU7Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICBJbnRlcm5hbEJsb2NrU2l6ZTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgIEFsbG9jTWVtW0xWTV9OUl9NRU1PUllfUkVHSU9OU107Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICBpOwotCi0KLSAgICAvKgotICAgICAqIENoZWNrIHBhcmFtZXRlcnMKLSAgICAgKi8KLSAgICBpZihwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBSZXR1cm4gbWVtb3J5IHRhYmxlIGlmIHRoZSBpbnN0YW5jZSBoYXMgYWxyZWFkeSBiZWVuIGNyZWF0ZWQKLSAgICAgKi8KLSAgICBpZiAoaEluc3RhbmNlICE9IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAvKiBSZWFkIGJhY2sgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KLSAgICAgICAgKnBNZW1vcnlUYWJsZSA9IHBJbnN0YW5jZS0+TWVtb3J5VGFibGU7Ci0gICAgICAgIHJldHVybihMVk1fU1VDQ0VTUyk7Ci0gICAgfQotCi0gICAgaWYocEluc3RQYXJhbXMgPT0gTFZNX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIFBvd2VyIFNwZWN0cnVtIEFuYWx5c2VyCi0gICAgICovCi0gICAgaWYocEluc3RQYXJhbXMtPlBTQV9JbmNsdWRlZCA+IExWTV9QU0FfT04pCi0gICAgewotICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENoZWNrIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgaWYoIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSAhPSBMVk1fTUFOQUdFRF9CVUZGRVJTKSAmJiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgIT0gTFZNX1VOTUFOQUdFRF9CVUZGRVJTKSApCi0gICAgewotICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKLSAgICB9Ci0KLSAgICAvKiBOLUJhbmQgRXF1YWxpemVyICovCi0gICAgaWYoIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzID4gMzIgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7Ci0gICAgfQotCi0gICAgaWYocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKLSAgICB7Ci0gICAgICAgIGlmKCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA8IExWTV9NSU5fTUFYQkxPQ0tTSVpFICkgfHwgKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPiBMVk1fTUFOQUdFRF9NQVhfTUFYQkxPQ0tTSVpFICkgKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiggKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPCBMVk1fTUlOX01BWEJMT0NLU0laRSApIHx8IChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplID4gTFZNX1VOTUFOQUdFRF9NQVhfTUFYQkxPQ0tTSVpFKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAqIEluaXRpYWxpc2UgdGhlIEFsbG9jTWVtIHN0cnVjdHVyZXMKLSAgICAqLwotICAgIGZvciAoaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKQotICAgIHsKLSAgICAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtW2ldLCBMVk1fTlVMTCk7Ci0gICAgfQotICAgIEludGVybmFsQmxvY2tTaXplID0gKExWTV9VSU5UMTYpKChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplKSAmIE1JTl9JTlRFUk5BTF9CTE9DS01BU0spOyAvKiBGb3JjZSB0byBhIG11bHRpcGxlIG9mIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKi8KLQotICAgIGlmIChJbnRlcm5hbEJsb2NrU2l6ZSA8IE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUpCi0gICAgewotICAgICAgICBJbnRlcm5hbEJsb2NrU2l6ZSA9IE1JTl9JTlRFUk5BTF9CTE9DS1NJWkU7Ci0gICAgfQotCi0gICAgLyogTWF4aW11bSBJbnRlcm5hbCBCbGFjayBTaXplIHNob3VsZCBub3QgYmUgbW9yZSB0aGFuIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUqLwotICAgIGlmKEludGVybmFsQmxvY2tTaXplID4gTUFYX0lOVEVSTkFMX0JMT0NLU0laRSkKLSAgICB7Ci0gICAgICAgIEludGVybmFsQmxvY2tTaXplID0gTUFYX0lOVEVSTkFMX0JMT0NLU0laRTsKLSAgICB9Ci0KLSAgICAvKgotICAgICogQnVuZGxlIHJlcXVpcmVtZW50cwotICAgICovCi0gICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0sCi0gICAgICAgIHNpemVvZihMVk1fSW5zdGFuY2VfdCkpOwotCi0KLSAgICAvKgotICAgICAqIFNldCB0aGUgYWxnb3JpdGhtIGFuZCBidW5kbGUgc2NyYXRjaCByZXF1aXJlbWVudHMKLSAgICAgKi8KLSAgICBBbGdTY3JhdGNoU2l6ZSAgICA9IDA7Ci0gICAgaWYgKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpCi0gICAgewotICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSA9IDYgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSAqIHNpemVvZihMVk1fSU5UMTYpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwgICAgICAgIC8qIFNjcmF0Y2ggYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVuZGxlU2NyYXRjaFNpemUpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0J1ZmZlcl90KSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBUcmVibGUgRW5oYW5jZW1lbnQgcmVxdWlyZW1lbnRzCi0gICAgICovCi0gICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX1RFX0RhdGFfdCkpOwotICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9URV9Db2Vmc190KSk7Ci0KLSAgICAvKgotICAgICAqIE4tQmFuZCBFcXVhbGl6ZXIgcmVxdWlyZW1lbnRzCi0gICAgICovCi0gICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sICAgICAgLyogTG9jYWwgc3RvcmFnZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWTV9FUU5CX0JhbmREZWZfdCkpKTsKLSAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwgICAgICAvKiBVc2VyIHN0b3JhZ2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcyAqIHNpemVvZihMVk1fRVFOQl9CYW5kRGVmX3QpKSk7Ci0KLSAgICAvKgotICAgICAqIENvbmNlcnQgU291bmQgcmVxdWlyZW1lbnRzCi0gICAgICovCi0gICAgewotICAgICAgICBMVkNTX01lbVRhYl90ICAgICAgICAgICBDU19NZW1UYWI7Ci0gICAgICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgICAgIENTX0NhcGFiaWxpdGllczsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTZXQgdGhlIGNhcGFiaWxpdGllcwotICAgICAgICAgKi8KLSAgICAgICAgQ1NfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICAgPSBJbnRlcm5hbEJsb2NrU2l6ZTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMKLSAgICAgICAgICovCi0gICAgICAgIExWQ1NfTWVtb3J5KExWTV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAmQ1NfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAmQ1NfQ2FwYWJpbGl0aWVzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBVcGRhdGUgdGhlIG1lbW9yeSBhbGxvY2F0aW9uIHN0cnVjdHVyZXMKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSk7Ci0gICAgICAgIGlmIChDU19NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgPiBBbGdTY3JhdGNoU2l6ZSkgQWxnU2NyYXRjaFNpemUgPSBDU19NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemU7Ci0KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IHJlcXVpcmVtZW50cwotICAgICAqLwotICAgIHsKLSAgICAgICAgTFZEQkVfTWVtVGFiX3QgICAgICAgICAgREJFX01lbVRhYjsKLSAgICAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgICAgREJFX0NhcGFiaWxpdGllczsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTZXQgdGhlIGNhcGFiaWxpdGllcwotICAgICAgICAgKi8KLSNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU185NjAwMCB8IExWREJFX0NBUF9GU18xOTIwMDA7Ci0jZWxzZQotICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwOwotI2VuZGlmCi0gICAgICAgIERCRV9DYXBhYmlsaXRpZXMuQ2VudHJlRnJlcXVlbmN5ID0gTFZEQkVfQ0FQX0NFTlRSRV81NUh6IHwgTFZEQkVfQ0FQX0NFTlRSRV81NUh6IHwgTFZEQkVfQ0FQX0NFTlRSRV82Nkh6IHwgTFZEQkVfQ0FQX0NFTlRSRV83OEh6IHwgTFZEQkVfQ0FQX0NFTlRSRV85MEh6OwotICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICA9IEludGVybmFsQmxvY2tTaXplOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cwotICAgICAgICAgKi8KLSAgICAgICAgTFZEQkVfTWVtb3J5KExWTV9OVUxMLAotICAgICAgICAgICAgICAgICAgICAmREJFX01lbVRhYiwKLQotICAgICAgICAgICAgICAgICAgICAmREJFX0NhcGFiaWxpdGllcyk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFVwZGF0ZSB0aGUgYnVuZGxlIHRhYmxlCi0gICAgICAgICAqLwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplKTsKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSk7Ci0gICAgICAgIGlmIChEQkVfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplID4gQWxnU2NyYXRjaFNpemUpIEFsZ1NjcmF0Y2hTaXplID0gREJFX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZTsKLQotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBOLUJhbmQgZXF1YWxpc2VyIHJlcXVpcmVtZW50cwotICAgICAqLwotICAgIHsKLSAgICAgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgRVFOQl9NZW1UYWI7ICAgICAgICAgICAgLyogRm9yIE4tQmFuZCBFcXVhbGlzZXIgKi8KLSAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgRVFOQl9DYXBhYmlsaXRpZXM7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2V0IHRoZSBjYXBhYmlsaXRpZXMKLSAgICAgICAgICovCi0jaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCi0gICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICA9IExWRVFOQl9DQVBfRlNfODAwMCB8IExWRVFOQl9DQVBfRlNfMTEwMjUgfCBMVkVRTkJfQ0FQX0ZTXzEyMDAwIHwgTFZFUU5CX0NBUF9GU18xNjAwMCB8IExWRVFOQl9DQVBfRlNfMjIwNTAgfCBMVkVRTkJfQ0FQX0ZTXzI0MDAwIHwgTFZFUU5CX0NBUF9GU18zMjAwMCB8IExWRVFOQl9DQVBfRlNfNDQxMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ4MDAwIHwgTFZFUU5CX0NBUF9GU185NjAwMCB8IExWRVFOQl9DQVBfRlNfMTkyMDAwOwotI2Vsc2UKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDA7Ci0jZW5kaWYKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU291cmNlRm9ybWF0ID0gTFZFUU5CX0NBUF9TVEVSRU8gfCBMVkVRTkJfQ0FQX01PTk9JTlNURVJFTzsKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplID0gSW50ZXJuYWxCbG9ja1NpemU7Ci0gICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLk1heEJhbmRzICAgICA9IHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cwotICAgICAgICAgKi8KLSAgICAgICAgTFZFUU5CX01lbW9yeShMVk1fTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9NZW1UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgJkVRTkJfQ2FwYWJpbGl0aWVzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBVcGRhdGUgdGhlIGJ1bmRsZSB0YWJsZQotICAgICAgICAgKi8KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSk7Ci0gICAgICAgIGlmIChFUU5CX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSA+IEFsZ1NjcmF0Y2hTaXplKSBBbGdTY3JhdGNoU2l6ZSA9IEVRTkJfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplOwotCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBIZWFkcm9vbSBtYW5hZ2VtZW50IG1lbW9yeSBhbGxvY2F0aW9uCi0gICAgICovCi0gICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpKSk7Ci0gICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpKSk7Ci0KLQotICAgIC8qCi0gICAgICogU3BlY3RydW0gQW5hbHl6ZXIgbWVtb3J5IHJlcXVpcmVtZW50cwotICAgICAqLwotICAgIHsKLSAgICAgICAgcExWUFNBX0hhbmRsZV90ICAgICBoUFNBSW5zdCA9IExWTV9OVUxMOwotICAgICAgICBMVlBTQV9NZW1UYWJfdCAgICAgIFBTQV9NZW1UYWI7Ci0gICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgUFNBX0luaXRQYXJhbXM7Ci0gICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgRmlsdGVyc1BhcmFtc1s5XTsKLSAgICAgICAgTFZQU0FfUkVUVVJOICAgICAgICBQU0FfU3RhdHVzOwotCi0gICAgICAgIGlmKHBJbnN0UGFyYW1zLT5QU0FfSW5jbHVkZWQgPT0gTFZNX1BTQV9PTikKLSAgICAgICAgewotICAgICAgICAgICAgUFNBX0luaXRQYXJhbXMuU3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gICA9IChMVk1fVUlOVDE2KSA1MDA7Ci0gICAgICAgICAgICBQU0FfSW5pdFBhcmFtcy5NYXhJbnB1dEJsb2NrU2l6ZSAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDEwMDA7Ci0gICAgICAgICAgICBQU0FfSW5pdFBhcmFtcy5uQmFuZHMgICAgICAgICAgICAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDk7Ci0KLSAgICAgICAgICAgIFBTQV9Jbml0UGFyYW1zLnBGaWx0ZXJzUGFyYW1zID0gJkZpbHRlcnNQYXJhbXNbMF07Ci0gICAgICAgICAgICBmb3IoaSA9IDA7IGkgPCBQU0FfSW5pdFBhcmFtcy5uQmFuZHM7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBGaWx0ZXJzUGFyYW1zW2ldLkNlbnRlckZyZXF1ZW5jeSAgICA9IChMVk1fVUlOVDE2KSAxMDAwOwotICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uUUZhY3RvciAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDI1OwotICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uUG9zdEdhaW4gICAgICAgICAgID0gKExWTV9JTlQxNikgIDA7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cwotICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9NZW1vcnkgKGhQU0FJbnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfSW5pdFBhcmFtcyk7Ci0KLSAgICAgICAgICAgIGlmIChQU0FfU3RhdHVzICE9IExWUFNBX09LKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbikgTFZNX0FMR09SSVRITVBTQSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAqIFVwZGF0ZSB0aGUgYnVuZGxlIHRhYmxlCi0gICAgICAgICAgICAqLwotICAgICAgICAgICAgLyogU2xvdyBEYXRhICovCi0gICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpOwotCi0gICAgICAgICAgICAvKiBGYXN0IERhdGEgKi8KLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7Ci0KLSAgICAgICAgICAgIC8qIEZhc3QgQ29lZiAqLwotICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCi0gICAgICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKLQotICAgICAgICAgICAgLyogRmFzdCBUZW1wb3JhcnkgKi8KLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9URU1QT1JBUllfRkFTVF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgKiBzaXplb2YoTFZNX0lOVDE2KSk7Ci0KLSAgICAgICAgICAgIGlmIChQU0FfTWVtVGFiLlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlNpemUgPiBBbGdTY3JhdGNoU2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBbGdTY3JhdGNoU2l6ZSA9IFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogUmV0dXJuIHRoZSBtZW1vcnkgdGFibGUKLSAgICAgKi8KLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdKTsKLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEE7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdKTsKLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEE7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0gICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUgPCA0KQotICAgIHsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSA9IDA7Ci0gICAgfQotCi0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSk7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGOwotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplIDwgNCkKLSAgICB7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUgPSAwOwotICAgIH0KLQotICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLAotICAgICAgICAgICAgICAgICAgICAgICAgQWxnU2NyYXRjaFNpemUpOwotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgICAgICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdKTsKLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5UeXBlICAgICAgICAgICAgID0gTFZNX1RFTVBPUkFSWV9GQVNUOwotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgPSBMVk1fTlVMTDsKLSAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSA8IDQpCi0gICAgewotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplID0gMDsKLSAgICB9Ci0KLSAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOwotCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0SW5zdGFuY2VIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgYnVuZGxlIGluc3RhbmNlLiBJdCByZXR1cm5zIHRoZSBjcmVhdGVkIGluc3RhbmNlICAqLwotLyogIGhhbmRsZSB0aHJvdWdoIHBoSW5zdGFuY2UuIEFsbCBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCwgaW5hY3RpdmUgc3RhdGUuICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwSW5zdFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWTV9PVVRPRlJBTkdFICAgICAgICAgIFdoZW4gYW55IG9mIHRoZSBJbnN0YW5jZSBwYXJhbWV0ZXJzIGFyZSBvdXQgb2YgcmFuZ2UgICAgICAgICovCi0vKiAgTFZNX05VTExBRERSRVNTICAgICAgICAgV2hlbiBvbmUgb2YgcGhJbnN0YW5jZSwgcE1lbW9yeVRhYmxlIG9yIHBJbnN0UGFyYW1zIGFyZSBOVUxMKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldEluc3RhbmNlSGFuZGxlKExWTV9IYW5kbGVfdCAgICAgICAgICAgKnBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtVGFiX3QgICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSW5zdFBhcmFtc190ICAgICAgICpwSW5zdFBhcmFtcykKLXsKLQotICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIFN0YXR1cyA9IExWTV9TVUNDRVNTOwotICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgICpwSW5zdGFuY2U7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICAgICAgQWxsb2NNZW1bTFZNX05SX01FTU9SWV9SRUdJT05TXTsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBpOwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIEludGVybmFsQmxvY2tTaXplOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplOwotCi0KLSAgICAvKgotICAgICAqIENoZWNrIHZhbGlkIHBvaW50cyBoYXZlIGJlZW4gZ2l2ZW4KLSAgICAgKi8KLSAgICBpZiAoKHBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpIHx8IChwSW5zdFBhcmFtcyA9PSBMVk1fTlVMTCkpCi0gICAgewotICAgICAgICByZXR1cm4gKExWTV9OVUxMQUREUkVTUyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDaGVjayB0aGUgbWVtb3J5IHRhYmxlIGZvciBOVUxMIHBvaW50ZXJzCi0gICAgICovCi0gICAgZm9yIChpPTA7IGk8TFZNX05SX01FTU9SWV9SRUdJT05TOyBpKyspCi0gICAgewotICAgICAgICBpZiAoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLlNpemUgIT0gMCkgJiYKLSAgICAgICAgICAgIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3M9PUxWTV9OVUxMKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuKExWTV9OVUxMQUREUkVTUyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENoZWNrIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgaWYoIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSAhPSBMVk1fTUFOQUdFRF9CVUZGRVJTKSAmJiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgIT0gTFZNX1VOTUFOQUdFRF9CVUZGRVJTKSApCi0gICAgewotICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKLSAgICB9Ci0KLSAgICBpZiggcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgPiAzMiApCi0gICAgewotICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKLSAgICB9Ci0KLSAgICBpZihwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQotICAgIHsKLSAgICAgICAgaWYoIChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplIDwgTFZNX01JTl9NQVhCTE9DS1NJWkUgKSB8fCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA+IExWTV9NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUgKSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA8IExWTV9NSU5fTUFYQkxPQ0tTSVpFICkgfHwgKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPiBMVk1fVU5NQU5BR0VEX01BWF9NQVhCTE9DS1NJWkUpICkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwSW5zdFBhcmFtcy0+UFNBX0luY2x1ZGVkID4gTFZNX1BTQV9PTikKLSAgICB7Ci0gICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSW5pdGlhbGlzZSB0aGUgQWxsb2NNZW0gc3RydWN0dXJlcwotICAgICAqLwotICAgIGZvciAoaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKQotICAgIHsKLSAgICAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtW2ldLAotICAgICAgICAgICAgICAgICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIGluc3RhbmNlIGhhbmRsZQotICAgICAqLwotICAgICpwaEluc3RhbmNlICA9IChMVk1fSGFuZGxlX3QpSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fSW5zdGFuY2VfdCkpOwotICAgIHBJbnN0YW5jZSA9KExWTV9JbnN0YW5jZV90ICAqKSpwaEluc3RhbmNlOwotCi0KLSAgICAvKgotICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSwgcGFyYW1ldGVycyBhbmQgY2FwYWJpbGl0aWVzCi0gICAgICovCi0gICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZSAgICA9ICpwTWVtb3J5VGFibGU7Ci0gICAgcEluc3RhbmNlLT5JbnN0UGFyYW1zICAgICA9ICpwSW5zdFBhcmFtczsKLQotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIGJ1bmRsZSBzY3JhdGNoIG1lbW9yeSBhbmQgaW5pdGlhbHNlIHRoZSBidWZmZXIgbWFuYWdlbWVudAotICAgICAqLwotICAgIEludGVybmFsQmxvY2tTaXplID0gKExWTV9VSU5UMTYpKChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplKSAmIE1JTl9JTlRFUk5BTF9CTE9DS01BU0spOyAvKiBGb3JjZSB0byBhIG11bHRpcGxlIG9mIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKi8KLSAgICBpZiAoSW50ZXJuYWxCbG9ja1NpemUgPCBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKQotICAgIHsKLSAgICAgICAgSW50ZXJuYWxCbG9ja1NpemUgPSBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFOwotICAgIH0KLQotICAgIC8qIE1heGltdW0gSW50ZXJuYWwgQmxhY2sgU2l6ZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFKi8KLSAgICBpZihJbnRlcm5hbEJsb2NrU2l6ZSA+IE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUpCi0gICAgewotICAgICAgICBJbnRlcm5hbEJsb2NrU2l6ZSA9IE1BWF9JTlRFUk5BTF9CTE9DS1NJWkU7Ci0gICAgfQotICAgIHBJbnN0YW5jZS0+SW50ZXJuYWxCbG9ja1NpemUgPSAoTFZNX0lOVDE2KUludGVybmFsQmxvY2tTaXplOwotCi0KLSAgICAvKgotICAgICAqIENvbW1vbiBzZXR0aW5ncyBmb3IgbWFuYWdlZCBhbmQgdW5tYW5hZ2VkIGJ1ZmZlcnMKLSAgICAgKi8KLSAgICBwSW5zdGFuY2UtPlNhbXBsZXNUb1Byb2Nlc3MgPSAwOyAgICAgICAgICAgICAgICAvKiBObyBzYW1wbGVzIGxlZnQgdG8gcHJvY2VzcyAqLwotICAgIGlmIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogTWFuYWdlZCBidWZmZXJzIHJlcXVpcmVkCi0gICAgICAgICAqLwotICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50ID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fQnVmZmVyX3QpKTsKLSAgICAgICAgQnVuZGxlU2NyYXRjaFNpemUgPSAoTFZNX0lOVDMyKSg2ICogKE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKyBJbnRlcm5hbEJsb2NrU2l6ZSkgKiBzaXplb2YoTFZNX0lOVDE2KSk7Ci0gICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPnBTY3JhdGNoID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sICAgLyogU2NyYXRjaCAxIGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMzIpQnVuZGxlU2NyYXRjaFNpemUpOwotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGlucHV0IGRlbGF5IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKSZwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5JbkRlbGF5QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUpKTsKLSNlbHNlCi0gICAgICAgIExvYWRDb25zdF8xNigwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGlucHV0IGRlbGF5IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKSZwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5JbkRlbGF5QnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUpKTsKLSNlbmRpZgotICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5JbkRlbGF5U2FtcGxlcyA9IE1JTl9JTlRFUk5BTF9CTE9DS1NJWkU7IC8qIFNldCB0aGUgbnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KLSAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+T3V0RGVsYXlTYW1wbGVzID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBObyBzYW1wbGVzIGluIHRoZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkJ1ZmZlclN0YXRlID0gTFZNX0ZJUlNUQ0FMTDsgICAgICAgICAgICAgLyogU2V0IHRoZSBzdGF0ZSByZWFkeSBmb3IgdGhlIGZpcnN0IGNhbGwgKi8KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogU2V0IGRlZmF1bHQgcGFyYW1ldGVycwotICAgICAqLwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgICAgPSBMVk1fTU9ERV9PRkY7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAgICAgICA9IExWTV9GU184MDAwOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCAgICAgPSBMVk1fTU9OTzsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAgICAgID0gTFZNX0hFQURQSE9ORVM7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuVkNfRWZmZWN0TGV2ZWwgICA9IDA7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuVkNfQmFsYW5jZSAgICAgICA9IDA7Ci0KLSAgICAvKgotICAgICAqIFNldCBjYWxsYmFjawotICAgICAqLwotICAgIHBJbnN0YW5jZS0+Q2FsbEJhY2sgPSBMVk1fQWxnb0NhbGxCYWNrOwotCi0KLSAgICAvKgotICAgICAqIERDIHJlbW92YWwgZmlsdGVyCi0gICAgICovCi0gICAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOwotCi0KLSAgICAvKgotICAgICAqIFRyZWJsZSBFbmhhbmNlbWVudAotICAgICAqLwotICAgIHBJbnN0YW5jZS0+cFRFX1RhcHMgID0gKExWTV9URV9EYXRhX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX1RFX0RhdGFfdCkpOwotCi0gICAgcEluc3RhbmNlLT5wVEVfU3RhdGUgPSAoTFZNX1RFX0NvZWZzX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9URV9Db2Vmc190KSk7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSA9IExWTV9URV9PRkY7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuVEVfRWZmZWN0TGV2ZWwgICA9IDA7Ci0gICAgcEluc3RhbmNlLT5URV9BY3RpdmUgICAgICAgICAgICAgICA9IExWTV9GQUxTRTsKLQotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIHZvbHVtZSBjb250cm9sIGFuZCBpbml0aWFsaXNlIEN1cnJlbnQgdG8gVGFyZ2V0Ci0gICAgICovCi0gICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKLSAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAwOwotICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSAgICA9IHBJbnN0YW5jZTsKLSAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fVkNDYWxsQmFjazsKLQotICAgIC8qIEluIG1hbmFnZWQgYnVmZmVyaW5nLCBzdGFydCB3aXRoIGxvdyBzaWduYWwgbGV2ZWwgYXMgZGVsYXkgaW4gYnVmZmVyIG1hbmFnZW1lbnQgY2F1c2VzIGEgY2xpY2sqLwotICAgIGlmIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQotICAgIHsKLSNpZmRlZiBCVUlMRF9GTE9BVAotICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sIDAsIDApOwotI2Vsc2UKLSAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLDAsMCk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSNpZmRlZiBCVUlMRF9GTE9BVAotICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sIExWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FUKTsKLSNlbHNlCi0gICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSxMVk1fTUFYSU5UXzE2LExWTV9NQVhJTlRfMTYpOwotI2VuZGlmCi0gICAgfQotCi0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwwLExWTV9GU184MDAwLDIpOwotI2Vsc2UKLSAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXSwgMCwgTFZNX0ZTXzgwMDAsIDIpOwotI2VuZGlmCi0KLSAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZWRCICAgICAgICAgICAgICAgICAgPSAwOwotICAgIHBJbnN0YW5jZS0+VkNfQVZMRml4ZWRWb2x1bWUgICAgICAgICAgICA9IDA7Ci0gICAgcEluc3RhbmNlLT5WQ19BY3RpdmUgICAgICAgICAgICAgICAgICAgID0gTFZNX0ZBTFNFOwotCi0gICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7Ci0gICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ICAgICAgICA9IDA7Ci0gICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSAgICA9IHBJbnN0YW5jZTsKLSAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICAgICAgICAgID0gTFZNX1ZDQ2FsbEJhY2s7Ci0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLCBMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVCk7Ci0jZWxzZQotICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0sTFZNX01BWElOVF8xNixMVk1fTUFYSU5UXzE2KTsKLSNlbmRpZgotICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXSxMVk1fVkNfTUlYRVJfVElNRSxMVk1fRlNfODAwMCwyKTsKLQotICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtICAgICAgPSAwOwotICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCAgICAgICAgPSAwOwotICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSBwSW5zdGFuY2U7Ci0gICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9WQ0NhbGxCYWNrOwotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwgTFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVQpOwotI2Vsc2UKLSAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLExWTV9NQVhJTlRfMTYsTFZNX01BWElOVF8xNik7Ci0jZW5kaWYKLSAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0sTFZNX1ZDX01JWEVSX1RJTUUsTFZNX0ZTXzgwMDAsMik7Ci0KLSAgICAvKgotICAgICAqIFNldCB0aGUgZGVmYXVsdCBFUU5CIHByZS1nYWluIGFuZCBwb2ludGVyIHRvIHRoZSBiYW5kIGRlZmluaXRpb25zCi0gICAgICovCi0gICAgcEluc3RhbmNlLT5wRVFOQl9CYW5kRGVmcyA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcyAqIHNpemVvZihMVk1fRVFOQl9CYW5kRGVmX3QpKSk7Ci0gICAgcEluc3RhbmNlLT5wRVFOQl9Vc2VyRGVmcyA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWTV9FUU5CX0JhbmREZWZfdCkpKTsKLQotCi0gICAgLyoKLSAgICAgKiBJbml0aWFsaXNlIHRoZSBDb25jZXJ0IFNvdW5kIG1vZHVsZQotICAgICAqLwotICAgIHsKLSAgICAgICAgTFZDU19IYW5kbGVfdCAgICAgICAgICAgaENTSW5zdGFuY2U7ICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwotICAgICAgICBMVkNTX01lbVRhYl90ICAgICAgICAgICBDU19NZW1UYWI7ICAgICAgICAgICAgICAgICAgLyogTWVtb3J5IHRhYmxlICovCi0gICAgICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgICAgIENTX0NhcGFiaWxpdGllczsgICAgICAgICAgICAvKiBJbml0aWFsIGNhcGFiaWxpdGllcyAqLwotICAgICAgICBMVkNTX1JldHVyblN0YXR1c19lbiAgICBMVkNTX1N0YXR1czsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KLQotICAgICAgICAvKgotICAgICAgICAgKiBTZXQgZGVmYXVsdCBwYXJhbWV0ZXJzCi0gICAgICAgICAqLwotICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5WaXJ0dWFsaXplclJldmVyYkxldmVsICAgID0gMTAwOwotICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5WaXJ0dWFsaXplclR5cGUgICAgICAgICAgID0gTFZNX0NPTkNFUlRTT1VORDsKLSAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuVmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlICA9IExWTV9NT0RFX09GRjsKLSAgICAgICAgcEluc3RhbmNlLT5DU19BY3RpdmUgICAgICAgICAgICAgICAgICAgICAgICA9IExWTV9GQUxTRTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcwotICAgICAgICAgKi8KLSAgICAgICAgQ1NfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICA9IChMVk1fVUlOVDE2KUludGVybmFsQmxvY2tTaXplOwotICAgICAgICBDU19DYXBhYmlsaXRpZXMuQ2FsbEJhY2sgPSBwSW5zdGFuY2UtPkNhbGxCYWNrOwotICAgICAgICBDU19DYXBhYmlsaXRpZXMucEJ1bmRsZUluc3RhbmNlID0gKHZvaWQqKXBJbnN0YW5jZTsKLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgdGhlbiBzZXQgdGhlIGFkZHJlc3MgcG9pbnRlcnMsIGZvcmNpbmcgYWxpZ25tZW50Ci0gICAgICAgICAqLwotICAgICAgICBMVkNTX1N0YXR1cyA9IExWQ1NfTWVtb3J5KExWTV9OVUxMLCAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ1NfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19DYXBhYmlsaXRpZXMpOwotICAgICAgICBDU19NZW1UYWIuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MgPSAmcEluc3RhbmNlLT5DU19JbnN0YW5jZTsKLSAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpOwotICAgICAgICBDU19NZW1UYWIuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSk7Ci0gICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBJbml0aWFsaXNlIHRoZSBDb25jZXJ0IFNvdW5kIGluc3RhbmNlIGFuZCBzYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUKLSAgICAgICAgICovCi0gICAgICAgIGhDU0luc3RhbmNlID0gTFZNX05VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0byBOVUxMIHRvIHJldHVybiBoYW5kbGUgKi8KLSAgICAgICAgTFZDU19TdGF0dXMgPSBMVkNTX0luaXQoJmhDU0luc3RhbmNlLCAgICAgICAgICAgICAgLyogSW5pdGlhaWxzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ1NfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ1NfQ2FwYWJpbGl0aWVzKTsKLSAgICAgICAgaWYgKExWQ1NfU3RhdHVzICE9IExWQ1NfU1VDQ0VTUykgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWQ1NfU3RhdHVzKTsKLSAgICAgICAgcEluc3RhbmNlLT5oQ1NJbnN0YW5jZSA9IGhDU0luc3RhbmNlOyAgICAgICAgICAgICAgLyogU2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlICovCi0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEluaXRpYWxpc2UgdGhlIEJhc3MgRW5oYW5jZW1lbnQgbW9kdWxlCi0gICAgICovCi0gICAgewotICAgICAgICBMVkRCRV9IYW5kbGVfdCAgICAgICAgICBoREJFSW5zdGFuY2U7ICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgIExWREJFX01lbVRhYl90ICAgICAgICAgIERCRV9NZW1UYWI7ICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KLSAgICAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgICAgREJFX0NhcGFiaWxpdGllczsgICAgICAgICAgIC8qIEluaXRpYWwgY2FwYWJpbGl0aWVzICovCi0gICAgICAgIExWREJFX1JldHVyblN0YXR1c19lbiAgIExWREJFX1N0YXR1czsgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2V0IHRoZSBpbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzCi0gICAgICAgICAqLwotICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5CRV9PcGVyYXRpbmdNb2RlID0gTFZNX0JFX09GRjsKLSAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuQkVfQ2VudHJlRnJlcSAgICA9IExWTV9CRV9DRU5UUkVfNTVIejsKLSAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuQkVfRWZmZWN0TGV2ZWwgICA9IDA7Ci0gICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkJFX0hQRiAgICAgICAgICAgPSBMVk1fQkVfSFBGX09GRjsKLQotICAgICAgICBwSW5zdGFuY2UtPkRCRV9BY3RpdmUgICAgICAgICAgICAgID0gTFZNX0ZBTFNFOwotCi0KLQotICAgICAgICAvKgotICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcwotICAgICAgICAgKi8KLSNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8IExWREJFX0NBUF9GU18xMjAwMCB8IExWREJFX0NBUF9GU18xNjAwMCB8IExWREJFX0NBUF9GU18yMjA1MCB8IExWREJFX0NBUF9GU18yNDAwMCB8IExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8IExWREJFX0NBUF9GU180ODAwMCB8IExWREJFX0NBUF9GU185NjAwMCB8IExWREJFX0NBUF9GU18xOTIwMDA7Ci0jZWxzZQotICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLlNhbXBsZVJhdGUgICAgICA9IExWREJFX0NBUF9GU184MDAwIHwgTFZEQkVfQ0FQX0ZTXzExMDI1IHwgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwgTFZEQkVfQ0FQX0ZTXzIyMDUwIHwgTFZEQkVfQ0FQX0ZTXzI0MDAwIHwgTFZEQkVfQ0FQX0ZTXzMyMDAwIHwgTFZEQkVfQ0FQX0ZTXzQ0MTAwIHwgTFZEQkVfQ0FQX0ZTXzQ4MDAwOwotI2VuZGlmCi0gICAgICAgIERCRV9DYXBhYmlsaXRpZXMuQ2VudHJlRnJlcXVlbmN5ID0gTFZEQkVfQ0FQX0NFTlRSRV81NUh6IHwgTFZEQkVfQ0FQX0NFTlRSRV81NUh6IHwgTFZEQkVfQ0FQX0NFTlRSRV82Nkh6IHwgTFZEQkVfQ0FQX0NFTlRSRV83OEh6IHwgTFZEQkVfQ0FQX0NFTlRSRV85MEh6OwotICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICA9IChMVk1fVUlOVDE2KUludGVybmFsQmxvY2tTaXplOwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCB0aGVuIHNldCB0aGUgYWRkcmVzcyBwb2ludGVycwotICAgICAgICAgKi8KLSAgICAgICAgTFZEQkVfU3RhdHVzID0gTFZEQkVfTWVtb3J5KExWTV9OVUxMLCAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkRCRV9NZW1UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmREJFX0NhcGFiaWxpdGllcyk7Ci0gICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzICAgICAgICA9ICZwSW5zdGFuY2UtPkRCRV9JbnN0YW5jZTsKLSAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlNpemUpOwotICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSk7Ci0gICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgICAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEluaXRpYWxpc2UgdGhlIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCBpbnN0YW5jZSBhbmQgc2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlCi0gICAgICAgICAqLwotICAgICAgICBoREJFSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRvIE5VTEwgdG8gcmV0dXJuIGhhbmRsZSAqLwotICAgICAgICBMVkRCRV9TdGF0dXMgPSBMVkRCRV9Jbml0KCZoREJFSW5zdGFuY2UsICAgICAgICAgICAgLyogSW5pdGlhaWxzZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEQkVfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEQkVfQ2FwYWJpbGl0aWVzKTsKLSAgICAgICAgaWYgKExWREJFX1N0YXR1cyAhPSBMVkRCRV9TVUNDRVNTKSByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pTFZEQkVfU3RhdHVzKTsKLSAgICAgICAgcEluc3RhbmNlLT5oREJFSW5zdGFuY2UgPSBoREJFSW5zdGFuY2U7ICAgICAgICAgICAgIC8qIFNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZSAqLwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBJbml0aWFsaXNlIHRoZSBOLUJhbmQgRXF1YWxpc2VyIG1vZHVsZQotICAgICAqLwotICAgIHsKLSAgICAgICAgTFZFUU5CX0hhbmRsZV90ICAgICAgICAgIGhFUU5CSW5zdGFuY2U7ICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwotICAgICAgICBMVkVRTkJfTWVtVGFiX3QgICAgICAgICAgRVFOQl9NZW1UYWI7ICAgICAgICAgICAgICAgLyogTWVtb3J5IHRhYmxlICovCi0gICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICBFUU5CX0NhcGFiaWxpdGllczsgICAgICAgICAvKiBJbml0aWFsIGNhcGFiaWxpdGllcyAqLwotICAgICAgICBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuICAgTFZFUU5CX1N0YXR1czsgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycwotICAgICAgICAgKi8KLSAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuRVFOQl9PcGVyYXRpbmdNb2RlICAgPSBMVk1fRVFOQl9PRkY7Ci0gICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkVRTkJfTkJhbmRzICAgICAgICAgID0gMDsKLSAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMucEVRTkJfQmFuZERlZmluaXRpb24gPSBMVk1fTlVMTDsKLSAgICAgICAgcEluc3RhbmNlLT5FUU5CX0FjdGl2ZSAgICAgICAgICAgICAgICAgPSBMVk1fRkFMU0U7Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcwotICAgICAgICAgKi8KLSNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8IExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfCBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8IExWRVFOQl9DQVBfRlNfNDgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzk2MDAwIHwgTFZFUU5CX0NBUF9GU18xOTIwMDA7Ci0jZWxzZQotICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkVRTkJfQ0FQX0ZTXzgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzExMDI1IHwgTFZFUU5CX0NBUF9GU18xMjAwMCB8IExWRVFOQl9DQVBfRlNfMTYwMDAgfCBMVkVRTkJfQ0FQX0ZTXzIyMDUwIHwgTFZFUU5CX0NBUF9GU18yNDAwMCB8IExWRVFOQl9DQVBfRlNfMzIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzQ0MTAwIHwgTFZFUU5CX0NBUF9GU180ODAwMDsKLSNlbmRpZgotICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgICAgPSAoTFZNX1VJTlQxNilJbnRlcm5hbEJsb2NrU2l6ZTsKLSAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuTWF4QmFuZHMgICAgICAgID0gcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHM7Ci0gICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNvdXJjZUZvcm1hdCAgICA9IExWRVFOQl9DQVBfU1RFUkVPIHwgTFZFUU5CX0NBUF9NT05PSU5TVEVSRU87Ci0gICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLkNhbGxCYWNrICAgICAgICA9IHBJbnN0YW5jZS0+Q2FsbEJhY2s7Ci0gICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLnBCdW5kbGVJbnN0YW5jZSAgPSAodm9pZCopcEluc3RhbmNlOwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCB0aGVuIHNldCB0aGUgYWRkcmVzcyBwb2ludGVycywgZm9yY2luZyBhbGlnbm1lbnQKLSAgICAgICAgICovCi0gICAgICAgIExWRVFOQl9TdGF0dXMgPSBMVkVRTkJfTWVtb3J5KExWTV9OVUxMLCAgICAgICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkVRTkJfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9DYXBhYmlsaXRpZXMpOwotICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzICAgICAgICA9ICZwSW5zdGFuY2UtPkVRTkJfSW5zdGFuY2U7Ci0gICAgICAgIEVRTkJfTWVtVGFiLlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplKTsKLSAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUpOwotICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgICAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogSW5pdGlhbGlzZSB0aGUgRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IGluc3RhbmNlIGFuZCBzYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUKLSAgICAgICAgICovCi0gICAgICAgIGhFUU5CSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdG8gTlVMTCB0byByZXR1cm4gaGFuZGxlICovCi0gICAgICAgIExWRVFOQl9TdGF0dXMgPSBMVkVRTkJfSW5pdCgmaEVRTkJJbnN0YW5jZSwgICAgICAgICAvKiBJbml0aWFpbHNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9NZW1UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9DYXBhYmlsaXRpZXMpOwotICAgICAgICBpZiAoTFZFUU5CX1N0YXR1cyAhPSBMVkVRTkJfU1VDQ0VTUykgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWRVFOQl9TdGF0dXMpOwotICAgICAgICBwSW5zdGFuY2UtPmhFUU5CSW5zdGFuY2UgPSBoRVFOQkluc3RhbmNlOyAgICAgICAgICAgLyogU2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlICovCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBIZWFkcm9vbSBtYW5hZ2VtZW50IG1lbW9yeSBhbGxvY2F0aW9uCi0gICAgICovCi0gICAgewotICAgICAgICBwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmcyA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0hFQURST09NX01BWF9OQkFORFMgKiBzaXplb2YoTFZNX0hlYWRyb29tQmFuZERlZl90KSkpOwotICAgICAgICBwSW5zdGFuY2UtPnBIZWFkcm9vbV9Vc2VyRGVmcyA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpKSk7Ci0KLSAgICAgICAgLyogSGVhZHJvb20gbWFuYWdlbWVudCBwYXJhbWV0ZXJzIGluaXRpYWxpc2F0aW9uICovCi0gICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHMgPSAyOwotICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb24gPSBwSW5zdGFuY2UtPnBIZWFkcm9vbV9CYW5kRGVmczsKLSAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uWzBdLkxpbWl0X0xvdyAgICAgICAgICA9IDIwOwotICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMF0uTGltaXRfSGlnaCAgICAgICAgID0gNDk5OTsKLSAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uWzBdLkhlYWRyb29tX09mZnNldCAgICA9IDM7Ci0gICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblsxXS5MaW1pdF9Mb3cgICAgICAgICAgPSA1MDAwOwotICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMV0uTGltaXRfSGlnaCAgICAgICAgID0gMjQwMDA7Ci0gICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblsxXS5IZWFkcm9vbV9PZmZzZXQgICAgPSA0OwotICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLkhlYWRyb29tX09wZXJhdGluZ01vZGUgPSBMVk1fSEVBRFJPT01fT047Ci0KLSAgICAgICAgcEluc3RhbmNlLT5IZWFkcm9vbSA9MDsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogSW5pdGlhbGlzZSB0aGUgUFNBIG1vZHVsZQotICAgICAqLwotICAgIHsKLSAgICAgICAgcExWUFNBX0hhbmRsZV90ICAgICBoUFNBSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgTFZQU0FfTWVtVGFiX3QgICAgICBQU0FfTWVtVGFiOwotICAgICAgICBMVlBTQV9SRVRVUk4gICAgICAgIFBTQV9TdGF0dXM7ICAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwotICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90IEZpbHRlcnNQYXJhbXNbOV07Ci0KLSAgICAgICAgaWYocEluc3RQYXJhbXMtPlBTQV9JbmNsdWRlZD09TFZNX1BTQV9PTikKLSAgICAgICAgewotICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcy5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiAgID0gKExWTV9VSU5UMTYpIDUwMDsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMuTWF4SW5wdXRCbG9ja1NpemUgICAgICAgICAgICA9IChMVk1fVUlOVDE2KSAyMDQ4OwotICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcy5uQmFuZHMgICAgICAgICAgICAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDk7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Jbml0UGFyYW1zLnBGaWx0ZXJzUGFyYW1zICAgICAgICAgICAgICAgPSAmRmlsdGVyc1BhcmFtc1swXTsKLSAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IHBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMubkJhbmRzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmlsdGVyc1BhcmFtc1tpXS5DZW50ZXJGcmVxdWVuY3kgICAgPSAoTFZNX1VJTlQxNikgMTAwMDsKLSAgICAgICAgICAgICAgICBGaWx0ZXJzUGFyYW1zW2ldLlFGYWN0b3IgICAgICAgICAgICA9IChMVk1fVUlOVDE2KSAxMDA7Ci0gICAgICAgICAgICAgICAgRmlsdGVyc1BhcmFtc1tpXS5Qb3N0R2FpbiAgICAgICAgICAgPSAoTFZNX0lOVDE2KSAgMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLypHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kIHRoZW4gc2V0IHRoZSBhZGRyZXNzIHBvaW50ZXJzKi8KLSAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9NZW1vcnkgKGhQU0FJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfTWVtVGFiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMpOwotCi0gICAgICAgICAgICBpZiAoUFNBX1N0YXR1cyAhPSBMVlBTQV9PSykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pIExWTV9BTEdPUklUSE1QU0EpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBTbG93IERhdGEgKi8KLSAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKLSAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpOwotCi0KLSAgICAgICAgICAgIC8qIEZhc3QgRGF0YSAqLwotICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAotICAgICAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7Ci0KLQotICAgICAgICAgICAgLyogRmFzdCBDb2VmICovCi0gICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzcyA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCi0gICAgICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKLQotICAgICAgICAgICAgLyogRmFzdCBUZW1wb3JhcnkgKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fVEVNUE9SQVJZX0ZBU1RdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKLSNlbHNlCi0gICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9URU1QT1JBUllfRkFTVF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMzIpIE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUgKiBzaXplb2YoTFZNX0lOVDE2KSk7Ci0jZW5kaWYKLSAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzICAgICAgID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwwKTsKLQotCi0gICAgICAgICAgICAvKkluaXRpYWxpc2UgUFNBIGluc3RhbmNlIGFuZCBzYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUqLwotICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfQ29udHJvbFBhcmFtcy5GcyA9IExWTV9GU180ODAwMDsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0NvbnRyb2xQYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZCAgPSBMVlBTQV9TUEVFRF9NRURJVU07Ci0gICAgICAgICAgICBQU0FfU3RhdHVzID0gTFZQU0FfSW5pdCAoJmhQU0FJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBTQV9Jbml0UGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UFNBX0NvbnRyb2xQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUFNBX01lbVRhYik7Ci0KLSAgICAgICAgICAgIGlmIChQU0FfU3RhdHVzICE9IExWUFNBX09LKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbikgTFZNX0FMR09SSVRITVBTQSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlID0gaFBTQUluc3RhbmNlOyAgICAgICAvKiBTYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0dhaW5PZmZzZXQgPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcEluc3RhbmNlLT5oUFNBSW5zdGFuY2UgPSBMVk1fTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycy4KLSAgICAgICAgICovCi0gICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlBTQV9QZWFrRGVjYXlSYXRlICAgPSBMVk1fUFNBX1NQRUVEX01FRElVTTsKLSAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuUFNBX0VuYWJsZSAgICAgICAgICA9IExWTV9QU0FfT0ZGOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ29weSB0aGUgaW5pdGlhbCBwYXJhbWV0ZXJzIHRvIHRoZSBuZXcgcGFyYW1ldGVycyBmb3IgY29ycmVjdCByZWFkYmFjayBvZgotICAgICAqIHRoZSBzZXR0aW5ncy4KLSAgICAgKi8KLSAgICBwSW5zdGFuY2UtPk5ld1BhcmFtcyA9IHBJbnN0YW5jZS0+UGFyYW1zOwotCi0KLSAgICAvKgotICAgICAqIENyZWF0ZSBjb25maWd1cmF0aW9uIG51bWJlcgotICAgICAqLwotICAgIHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciA9IDB4MDAwMDAwMDA7Ci0gICAgcEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICs9IExWTV9DU19NQVNLOwotICAgIHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciArPSBMVk1fRVFOQl9NQVNLOwotICAgIHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciArPSBMVk1fREJFX01BU0s7Ci0gICAgcEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICs9IExWTV9WQ19NQVNLOwotICAgIHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciArPSBMVk1fUFNBX01BU0s7Ci0KLSAgICBpZigoKHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciAgJiBMVk1fQ1NfTUFTSykhPTApICB8fAotICAgICAgICAoKHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciAmIExWTV9EQkVfTUFTSykhPTApIHx8Ci0gICAgICAgICgocEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICYgTFZNX0VRTkJfTUFTSykhPTApfHwKLSAgICAgICAgKChwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgJiBMVk1fVEVfTUFTSykhPTApICB8fAotICAgICAgICAoKHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciAmIExWTV9WQ19NQVNLKSE9MCkpCi0gICAgewotICAgICAgICBwSW5zdGFuY2UtPkJsaWNrU2l6ZU11bHRpcGxlICAgID0gNDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcEluc3RhbmNlLT5CbGlja1NpemVNdWx0aXBsZSAgICA9IDE7Ci0gICAgfQotCi0gICAgcmV0dXJuKFN0YXR1cyk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fQ2xlYXJBdWRpb0J1ZmZlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2xlYXIgdGhlIGludGVybmFsIGF1ZGlvIGJ1ZmZlcnMgb2YgdGhlIGJ1bmRsZS4gICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgIEluc3RhbmNlIG9yIHNjcmF0Y2ggbWVtb3J5IGhhcyBhIE5VTEwgcG9pbnRlciAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9DbGVhckF1ZGlvQnVmZmVycyhMVk1fSGFuZGxlX3QgIGhJbnN0YW5jZSkKLXsKLSAgICBMVk1fTWVtVGFiX3QgICAgICAgICAgICBNZW1UYWI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1lbW9yeSB0YWJsZSAqLwotICAgIExWTV9JbnN0UGFyYW1zX3QgICAgICAgIEluc3RQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcGFyYW1ldGVycyAqLwotICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIFBhcmFtczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ29udHJvbCBQYXJhbWV0ZXJzICovCi0gICAgTFZNX0luc3RhbmNlX3QgICAgICAgICAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOyAvKiBQb2ludGVyIHRvIEluc3RhbmNlICovCi0gICAgTFZNX0hlYWRyb29tUGFyYW1zX3QgICAgSGVhZHJvb21QYXJhbXM7Ci0KLQotICAgIGlmKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCl7Ci0gICAgICAgIHJldHVybiBMVk1fTlVMTEFERFJFU1M7Ci0gICAgfQotCi0gICAgLyogU2F2ZSB0aGUgY29udHJvbCBwYXJhbWV0ZXJzICovIC8qIGNvdmVyaXR5W3VuY2hlY2tlZF92YWx1ZV0gKi8gLyogRG8gbm90IGNoZWNrIHJldHVybiB2YWx1ZSBpbnRlcm5hbCBmdW5jdGlvbiBjYWxscyAqLwotICAgIExWTV9HZXRDb250cm9sUGFyYW1ldGVycyhoSW5zdGFuY2UsICZQYXJhbXMpOwotCi0gICAgLypTYXZlIHRoZSBoZWFkcm9vbSBwYXJhbWV0ZXJzKi8KLSAgICBMVk1fR2V0SGVhZHJvb21QYXJhbXMoaEluc3RhbmNlLCAmSGVhZHJvb21QYXJhbXMpOwotCi0gICAgLyogIFJldHJpZXZlIGFsbG9jYXRlZCBidWZmZXJzIGluIG1lbXRhYiAqLwotICAgIExWTV9HZXRNZW1vcnlUYWJsZShoSW5zdGFuY2UsICZNZW1UYWIsICBMVk1fTlVMTCk7Ci0KLSAgICAvKiAgU2F2ZSB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycyAqLwotICAgIEluc3RQYXJhbXMgPSBwSW5zdGFuY2UtPkluc3RQYXJhbXM7Ci0KLSAgICAvKiAgQ2FsbCAgTFZNX0dldEluc3RhbmNlSGFuZGxlIHRvIHJlLWluaXRpYWxpc2UgdGhlIGJ1bmRsZSAqLwotICAgIExWTV9HZXRJbnN0YW5jZUhhbmRsZSggJmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZNZW1UYWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmSW5zdFBhcmFtcyk7Ci0KLSAgICAvKiBSZXN0b3JlIGNvbnRyb2wgcGFyYW1ldGVycyAqLyAvKiBjb3Zlcml0eVt1bmNoZWNrZWRfdmFsdWVdICovIC8qIERvIG5vdCBjaGVjayByZXR1cm4gdmFsdWUgaW50ZXJuYWwgZnVuY3Rpb24gY2FsbHMgKi8KLSAgICBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMoaEluc3RhbmNlLCAmUGFyYW1zKTsKLQotICAgIC8qUmVzdG9yZSB0aGUgaGVhZHJvb20gcGFyYW1ldGVycyovCi0gICAgTFZNX1NldEhlYWRyb29tUGFyYW1zKGhJbnN0YW5jZSwgJkhlYWRyb29tUGFyYW1zKTsKLQotICAgIC8qIERDIHJlbW92YWwgZmlsdGVyICovCi0gICAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOwotCi0gICAgcmV0dXJuIExWTV9TVUNDRVNTOwotfQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX0luaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2MjA1MjkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fSW5pdC5jcHAKQEAgLTAsMCArMSwxMDc0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX1RhYmxlcy5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJJbnN0QWxsb2MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0TWVtb3J5VGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAqLworLyogIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAqLworLyogICAgICBoSW5zdGFuY2UgPSBJbnN0YW5jZSBoYW5kbGUgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJhc2UgYWRkcmVzc2VzIGZvciB0aGUgaW5zdGFuY2UgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgdGhlIG1lbW9yeSAgICAgICovCisvKiAgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZnJlZSAoaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlKSB0aGUgbWVtb3J5ICAgICAgICovCisvKiAgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGRlZmF1bHQgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9TVUNDRVNTICAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX05VTExBRERSRVNTICAgICAgICAgV2hlbiBvbmUgb2YgcE1lbW9yeVRhYmxlIG9yIHBJbnN0UGFyYW1zIGlzIE5VTEwgICAgICAgICAgICAgKi8KKy8qICBMVk1fT1VUT0ZSQU5HRSAgICAgICAgICBXaGVuIGFueSBvZiB0aGUgSW5zdGFuY2UgcGFyYW1ldGVycyBhcmUgb3V0IG9mIHJhbmdlICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAqLworLyogIDIuICBUaGUgc2NyYXRjaCBtZW1vcnkgaXMgdGhlIGxhcmdlc3QgcmVxdWlyZWQgYnkgYW55IG9mIHRoZSBzdWItbW9kdWxlcyBwbHVzIGFueSAgICovCisvKiAgICAgIGFkZGl0aW9uYWwgc2NyYXRjaCByZXF1aXJlbWVudHMgb2YgdGhlIGJ1bmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiA0IFR5cGVzIG9mIE1lbW9yeSBSZWdpb25zIG9mIExWTQorICogVE9ETzogQWxsb2NhdGUgb24gdGhlIGZseS4KKyAqIGkpICAgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQSAtIEZvciBJbnN0YW5jZSBIYW5kbGVzCisgKiBpaSkgIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEEgLSBQZXJzaXN0ZW50IEJ1ZmZlcnMKKyAqIGlpaSkgTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRiAtIEZvciBIb2xkaW5nIFN0cnVjdHVyZSB2YWx1ZXMKKyAqIGl2KSAgTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVCAgICAgICAtIEZvciBIb2xkaW5nIFN0cnVjdHVyZSB2YWx1ZXMKKyAqCisgKiBMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBOgorICogICBUb3RhbCBNZW1vcnkgc2l6ZToKKyAqICAgICBzaXplb2YoTFZNX0luc3RhbmNlX3QpICsgXAorICogICAgIHNpemVvZihMVk1fQnVmZmVyX3QpICsgXAorICogICAgIHNpemVvZihMVlBTQV9JbnN0YW5jZVByX3QpICsgXAorICogICAgIHNpemVvZihMVk1fQnVmZmVyX3QpIC0gbmVlZGVkIGlmIGJ1ZmZlciBtb2RlIGlzIExWTV9NQU5BR0VEX0JVRkZFUgorICoKKyAqIExWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEE6CisgKiAgIFRvdGFsIE1lbW9yeSBzaXplOgorICogICAgIHNpemVvZihMVk1fVEVfRGF0YV90KSArIFwKKyAqICAgICAyICogcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZNX0VRTkJfQmFuZERlZl90KSArIFwKKyAqICAgICBzaXplb2YoTFZDU19EYXRhX3QpICsgXAorICogICAgIHNpemVvZihMVkRCRV9EYXRhX0ZMT0FUX3QpICsgXAorICogICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkgKyBcCisgKiAgICAgc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSArIFwKKyAqICAgICBwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkgKyBcCisgKiAgICAgcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZFUU5CX0JhbmREZWZfdCkgKyBcCisgKiAgICAgcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZFUU5CX0JpcXVhZFR5cGVfZW4pICsgXAorICogICAgIDIgKiBMVk1fSEVBRFJPT01fTUFYX05CQU5EUyAqIHNpemVvZihMVk1fSGVhZHJvb21CYW5kRGVmX3QpICsgXAorICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCkgKyBcCisgKiAgICAgUFNBX0luaXRQYXJhbXMubkJhbmRzICogc2l6ZW9mKFFQRF9UYXBzX3QpCisgKgorICogTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRjoKKyAqICAgVG90YWwgTWVtb3J5IHNpemU6CisgKiAgICAgc2l6ZW9mKExWTV9URV9Db2Vmc190KSArIFwKKyAqICAgICBzaXplb2YoTFZDU19Db2VmZmljaWVudF90KSArIFwKKyAqICAgICBzaXplb2YoTFZEQkVfQ29lZl9GTE9BVF90KSArIFwKKyAqICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpICsgXAorICogICAgIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkgKyBcCisgKiAgICAgcEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpICsgXAorICogICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAqIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkgKyBcCisgKiAgICAgUFNBX0luaXRQYXJhbXMubkJhbmRzICogc2l6ZW9mKFFQRF9TdGF0ZV90KQorICoKKyAqIExWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1QgKFNjcmF0Y2gpOgorICogICBUb3RhbCBNZW1vcnkgU2l6ZToKKyAqICAgICBCdW5kbGVTY3JhdGNoU2l6ZSArIFwKKyAqICAgICBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFICogc2l6ZW9mKExWTV9GTE9BVCkgKyBcCisgKiAgICAgTWF4U2NyYXRjaE9mIChDUywgRVFOQiwgREJFLCBQU0EpCisgKgorICogICAgIGEpQnVuZGxlU2NyYXRjaFNpemU6CisgKiAgICAgICAgIDMgKiBMVk1fTUFYX0NIQU5ORUxTIFwKKyAqICAgICAgICAgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSAqIHNpemVvZihMVk1fRkxPQVQpCisgKiAgICAgICBUaGlzIE1lbW9yeSBpcyBhbGxvY2F0ZWQgb25seSB3aGVuIEJ1ZmZlciBtb2RlIGlzIExWTV9NQU5BR0VEX0JVRkZFUi4KKyAqICAgICBiKU1heFNjcmF0Y2hPZiAoQ1MsIEVRTkIsIERCRSwgUFNBKQorICogICAgICAgVGhpcyBNZW1vcnkgaXMgbmVlZGVkIGZvciBzY3JhdGNoIHVzYWdlIGZvciBDUywgRVFOQiwgREJFLCBQU0EuCisgKiAgICAgICBDUyAgID0gKExWQ1NfU0NSQVRDSEJVRkZFUlMgKiBzaXplb2YoTFZNX0ZMT0FUKQorICogICAgICAgICAgICAgICAqIHBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSkKKyAqICAgICAgIEVRTkIgPSAoTFZFUU5CX1NDUkFUQ0hCVUZGRVJTICogc2l6ZW9mKExWTV9GTE9BVCkKKyAqICAgICAgICAgICAgICAgKiBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpCisgKiAgICAgICBEQkUgID0gKExWREJFX1NDUkFUQ0hCVUZGRVJTX0lOUExBQ0Uqc2l6ZW9mKExWTV9GTE9BVCkKKyAqICAgICAgICAgICAgICAgKiBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpCisgKiAgICAgICBQU0EgID0gKDIgKiBwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgKiBzaXplb2YoTFZNX0ZMT0FUKSkKKyAqICAgICAgICAgICAgICBvbmUgTWF4SW5wdXRCbG9ja1NpemUgZm9yIGlucHV0IGFuZCBhbm90aGVyIGZvciBmaWx0ZXIgb3V0cHV0CisgKiAgICAgYylNQVhfSU5URVJOQUxfQkxPQ0tTSVpFCisgKiAgICAgICBUaGlzIE1lbW9yeSBpcyBuZWVkZWQgZm9yIFBTQUlucHV0IC0gVGVtcCBtZW1vcnkgdG8gc3RvcmUgb3V0cHV0CisgKiAgICAgICBmcm9tIE1jVG9Nb25vIGJsb2NrIGFuZCBnaXZlbiBhcyBpbnB1dCB0byBQU0EgYmxvY2sKKyAqLworCitMVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9HZXRNZW1vcnlUYWJsZShMVk1fSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtVGFiX3QgICAgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0luc3RQYXJhbXNfdCAgICAgKnBJbnN0UGFyYW1zKQoreworCisgICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlID0gKExWTV9JbnN0YW5jZV90ICopaEluc3RhbmNlOworICAgIExWTV9VSU5UMzIgICAgICAgICAgQWxnU2NyYXRjaFNpemU7CisgICAgTFZNX1VJTlQzMiAgICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZTsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIEludGVybmFsQmxvY2tTaXplOworICAgIElOU1RfQUxMT0MgICAgICAgICAgQWxsb2NNZW1bTFZNX05SX01FTU9SWV9SRUdJT05TXTsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIGk7CisKKyAgICAvKgorICAgICAqIENoZWNrIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBpZihwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICByZXR1cm4gTFZNX05VTExBRERSRVNTOworICAgIH0KKworICAgIC8qCisgICAgICogUmV0dXJuIG1lbW9yeSB0YWJsZSBpZiB0aGUgaW5zdGFuY2UgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkCisgICAgICovCisgICAgaWYgKGhJbnN0YW5jZSAhPSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgLyogUmVhZCBiYWNrIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCisgICAgICAgICpwTWVtb3J5VGFibGUgPSBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlOworICAgICAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOworICAgIH0KKworICAgIGlmKHBJbnN0UGFyYW1zID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICAvKgorICAgICAqICBQb3dlciBTcGVjdHJ1bSBBbmFseXNlcgorICAgICAqLworICAgIGlmKHBJbnN0UGFyYW1zLT5QU0FfSW5jbHVkZWQgPiBMVk1fUFNBX09OKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycworICAgICAqLworICAgIGlmKCAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgIT0gTFZNX01BTkFHRURfQlVGRkVSUykgJiYgKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlICE9IExWTV9VTk1BTkFHRURfQlVGRkVSUykgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgfQorCisgICAgLyogTi1CYW5kIEVxdWFsaXplciAqLworICAgIGlmKCBwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcyA+IDMyICkKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgIH0KKworICAgIGlmKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpCisgICAgeworICAgICAgICBpZiggKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPCBMVk1fTUlOX01BWEJMT0NLU0laRSApIHx8IChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplID4gTFZNX01BTkFHRURfTUFYX01BWEJMT0NLU0laRSApICkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoIChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplIDwgTFZNX01JTl9NQVhCTE9DS1NJWkUgKSB8fCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA+IExWTV9VTk1BTkFHRURfTUFYX01BWEJMT0NLU0laRSkgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgKiBJbml0aWFsaXNlIHRoZSBBbGxvY01lbSBzdHJ1Y3R1cmVzCisgICAgKi8KKyAgICBmb3IgKGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykKKyAgICB7CisgICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbVtpXSwgTFZNX05VTEwpOworICAgIH0KKyAgICBJbnRlcm5hbEJsb2NrU2l6ZSA9IChMVk1fVUlOVDE2KSgocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSkgJiBNSU5fSU5URVJOQUxfQkxPQ0tNQVNLKTsgLyogRm9yY2UgdG8gYSBtdWx0aXBsZSBvZiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICovCisKKyAgICBpZiAoSW50ZXJuYWxCbG9ja1NpemUgPCBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFKQorICAgIHsKKyAgICAgICAgSW50ZXJuYWxCbG9ja1NpemUgPSBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFOworICAgIH0KKworICAgIC8qIE1heGltdW0gSW50ZXJuYWwgQmxhY2sgU2l6ZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFKi8KKyAgICBpZihJbnRlcm5hbEJsb2NrU2l6ZSA+IE1BWF9JTlRFUk5BTF9CTE9DS1NJWkUpCisgICAgeworICAgICAgICBJbnRlcm5hbEJsb2NrU2l6ZSA9IE1BWF9JTlRFUk5BTF9CTE9DS1NJWkU7CisgICAgfQorCisgICAgLyoKKyAgICAqIEJ1bmRsZSByZXF1aXJlbWVudHMKKyAgICAqLworICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLAorICAgICAgICBzaXplb2YoTFZNX0luc3RhbmNlX3QpKTsKKworICAgIC8qCisgICAgICogU2V0IHRoZSBhbGdvcml0aG0gYW5kIGJ1bmRsZSBzY3JhdGNoIHJlcXVpcmVtZW50cworICAgICAqLworICAgIEFsZ1NjcmF0Y2hTaXplICAgID0gMDsKKyAgICBpZiAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKKyAgICB7CisgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplID0gMyAqIExWTV9NQVhfQ0hBTk5FTFMgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogKE1JTl9JTlRFUk5BTF9CTE9DS1NJWkUgKyBJbnRlcm5hbEJsb2NrU2l6ZSkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKExWTV9GTE9BVCk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLCAgICAgICAgLyogU2NyYXRjaCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fQnVmZmVyX3QpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFRyZWJsZSBFbmhhbmNlbWVudCByZXF1aXJlbWVudHMKKyAgICAgKi8KKyAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fVEVfRGF0YV90KSk7CisgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX1RFX0NvZWZzX3QpKTsKKworICAgIC8qCisgICAgICogTi1CYW5kIEVxdWFsaXplciByZXF1aXJlbWVudHMKKyAgICAgKi8KKyAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwgICAgICAvKiBMb2NhbCBzdG9yYWdlICovCisgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZNX0VRTkJfQmFuZERlZl90KSkpOworICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLCAgICAgIC8qIFVzZXIgc3RvcmFnZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzICogc2l6ZW9mKExWTV9FUU5CX0JhbmREZWZfdCkpKTsKKworICAgIC8qCisgICAgICogQ29uY2VydCBTb3VuZCByZXF1aXJlbWVudHMKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWQ1NfTWVtVGFiX3QgICAgICAgICAgIENTX01lbVRhYjsKKyAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAgQ1NfQ2FwYWJpbGl0aWVzOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgY2FwYWJpbGl0aWVzCisgICAgICAgICAqLworICAgICAgICBDU19DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplICAgICA9IEludGVybmFsQmxvY2tTaXplOworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cworICAgICAgICAgKi8KKyAgICAgICAgTFZDU19NZW1vcnkoTFZNX05VTEwsCisgICAgICAgICAgICAgICAgICAgICZDU19NZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICZDU19DYXBhYmlsaXRpZXMpOworCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgbWVtb3J5IGFsbG9jYXRpb24gc3RydWN0dXJlcworICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKTsKKyAgICAgICAgaWYgKENTX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSA+IEFsZ1NjcmF0Y2hTaXplKSBBbGdTY3JhdGNoU2l6ZSA9IENTX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZTsKKworICAgIH0KKworICAgIC8qCisgICAgICogRHluYW1pYyBCYXNzIEVuaGFuY2VtZW50IHJlcXVpcmVtZW50cworICAgICAqLworICAgIHsKKyAgICAgICAgTFZEQkVfTWVtVGFiX3QgICAgICAgICAgREJFX01lbVRhYjsKKyAgICAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgICAgREJFX0NhcGFiaWxpdGllczsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGNhcGFiaWxpdGllcworICAgICAgICAgKi8KKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzg4MjAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfOTYwMDAgfCBMVkRCRV9DQVBfRlNfMTc2NDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMTkyMDAwOworICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLkNlbnRyZUZyZXF1ZW5jeSA9IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNjZIeiB8IExWREJFX0NBUF9DRU5UUkVfNzhIeiB8IExWREJFX0NBUF9DRU5UUkVfOTBIejsKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgICAgPSBJbnRlcm5hbEJsb2NrU2l6ZTsKKworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMKKyAgICAgICAgICovCisgICAgICAgIExWREJFX01lbW9yeShMVk1fTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgJkRCRV9NZW1UYWIsCisKKyAgICAgICAgICAgICAgICAgICAgJkRCRV9DYXBhYmlsaXRpZXMpOworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIGJ1bmRsZSB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpOworICAgICAgICBpZiAoREJFX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSA+IEFsZ1NjcmF0Y2hTaXplKSBBbGdTY3JhdGNoU2l6ZSA9IERCRV9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemU7CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIE4tQmFuZCBlcXVhbGlzZXIgcmVxdWlyZW1lbnRzCisgICAgICovCisgICAgeworICAgICAgICBMVkVRTkJfTWVtVGFiX3QgICAgICAgICBFUU5CX01lbVRhYjsgICAgICAgICAgICAvKiBGb3IgTi1CYW5kIEVxdWFsaXNlciAqLworICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICBFUU5CX0NhcGFiaWxpdGllczsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGNhcGFiaWxpdGllcworICAgICAgICAgKi8KKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfNDgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzg4MjAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU185NjAwMCB8IExWRVFOQl9DQVBfRlNfMTc2NDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18xOTIwMDA7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLlNvdXJjZUZvcm1hdCA9IExWRVFOQl9DQVBfU1RFUkVPIHwgTFZFUU5CX0NBUF9NT05PSU5TVEVSRU87CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSA9IEludGVybmFsQmxvY2tTaXplOworICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCYW5kcyAgICAgPSBwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kczsKKworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMKKyAgICAgICAgICovCisgICAgICAgIExWRVFOQl9NZW1vcnkoTFZNX05VTEwsCisgICAgICAgICAgICAgICAgICAgICAgJkVRTkJfTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICZFUU5CX0NhcGFiaWxpdGllcyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBidW5kbGUgdGFibGUKKyAgICAgICAgICovCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVRTkJfTWVtVGFiLlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpOworICAgICAgICBpZiAoRVFOQl9NZW1UYWIuUmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgPiBBbGdTY3JhdGNoU2l6ZSkgQWxnU2NyYXRjaFNpemUgPSBFUU5CX01lbVRhYi5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZTsKKworICAgIH0KKworICAgIC8qCisgICAgICogSGVhZHJvb20gbWFuYWdlbWVudCBtZW1vcnkgYWxsb2NhdGlvbgorICAgICAqLworICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0hFQURST09NX01BWF9OQkFORFMgKiBzaXplb2YoTFZNX0hlYWRyb29tQmFuZERlZl90KSkpOworICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0hFQURST09NX01BWF9OQkFORFMgKiBzaXplb2YoTFZNX0hlYWRyb29tQmFuZERlZl90KSkpOworCisgICAgLyoKKyAgICAgKiBTcGVjdHJ1bSBBbmFseXplciBtZW1vcnkgcmVxdWlyZW1lbnRzCisgICAgICovCisgICAgeworICAgICAgICBwTFZQU0FfSGFuZGxlX3QgICAgIGhQU0FJbnN0ID0gTFZNX05VTEw7CisgICAgICAgIExWUFNBX01lbVRhYl90ICAgICAgUFNBX01lbVRhYjsKKyAgICAgICAgTFZQU0FfSW5pdFBhcmFtc190ICBQU0FfSW5pdFBhcmFtczsKKyAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCBGaWx0ZXJzUGFyYW1zWzldOworICAgICAgICBMVlBTQV9SRVRVUk4gICAgICAgIFBTQV9TdGF0dXM7CisKKyAgICAgICAgaWYocEluc3RQYXJhbXMtPlBTQV9JbmNsdWRlZCA9PSBMVk1fUFNBX09OKQorICAgICAgICB7CisgICAgICAgICAgICBQU0FfSW5pdFBhcmFtcy5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiAgID0gKExWTV9VSU5UMTYpIDUwMDsKKyAgICAgICAgICAgIFBTQV9Jbml0UGFyYW1zLk1heElucHV0QmxvY2tTaXplICAgICAgICAgICAgPSAoTFZNX1VJTlQxNikgMTAwMDsKKyAgICAgICAgICAgIFBTQV9Jbml0UGFyYW1zLm5CYW5kcyAgICAgICAgICAgICAgICAgICAgICAgPSAoTFZNX1VJTlQxNikgOTsKKworICAgICAgICAgICAgUFNBX0luaXRQYXJhbXMucEZpbHRlcnNQYXJhbXMgPSAmRmlsdGVyc1BhcmFtc1swXTsKKyAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IFBTQV9Jbml0UGFyYW1zLm5CYW5kczsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEZpbHRlcnNQYXJhbXNbaV0uQ2VudGVyRnJlcXVlbmN5ICAgID0gKExWTV9VSU5UMTYpIDEwMDA7CisgICAgICAgICAgICAgICAgRmlsdGVyc1BhcmFtc1tpXS5RRmFjdG9yICAgICAgICAgICAgPSAoTFZNX1VJTlQxNikgMjU7CisgICAgICAgICAgICAgICAgRmlsdGVyc1BhcmFtc1tpXS5Qb3N0R2FpbiAgICAgICAgICAgPSAoTFZNX0lOVDE2KSAgMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzCisgICAgICAgICAgICAqLworICAgICAgICAgICAgUFNBX1N0YXR1cyA9IExWUFNBX01lbW9yeSAoaFBTQUluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlBTQV9NZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlBTQV9Jbml0UGFyYW1zKTsKKworICAgICAgICAgICAgaWYgKFBTQV9TdGF0dXMgIT0gTFZQU0FfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKSBMVk1fQUxHT1JJVEhNUFNBKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICogVXBkYXRlIHRoZSBidW5kbGUgdGFibGUKKyAgICAgICAgICAgICovCisgICAgICAgICAgICAvKiBTbG93IERhdGEgKi8KKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLAorICAgICAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSk7CisKKyAgICAgICAgICAgIC8qIEZhc3QgRGF0YSAqLworICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgUFNBX01lbVRhYi5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplKTsKKworICAgICAgICAgICAgLyogRmFzdCBDb2VmICovCisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKKyAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpOworCisgICAgICAgICAgICAvKiBGYXN0IFRlbXBvcmFyeSAqLworICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX1RFTVBPUkFSWV9GQVNUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSAqIHNpemVvZihMVk1fRkxPQVQpKTsKKworICAgICAgICAgICAgaWYgKFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZSA+IEFsZ1NjcmF0Y2hTaXplKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEFsZ1NjcmF0Y2hTaXplID0gUFNBX01lbVRhYi5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5TaXplOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXR1cm4gdGhlIG1lbW9yeSB0YWJsZQorICAgICAqLworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0pOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlR5cGUgICAgICAgICA9IExWTV9QRVJTSVNURU5UX1NMT1dfREFUQTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0pOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlR5cGUgICAgICAgICA9IExWTV9QRVJTSVNURU5UX0ZBU1RfREFUQTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKyAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSA8IDQpCisgICAgeworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplID0gMDsKKyAgICB9CisKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdKTsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUY7CisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUgPCA0KQorICAgIHsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSA9IDA7CisgICAgfQorCisgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sCisgICAgICAgICAgICAgICAgICAgICAgICBBbGdTY3JhdGNoU2l6ZSk7CisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSAgICAgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0pOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlR5cGUgICAgICAgICAgICAgPSBMVk1fVEVNUE9SQVJZX0ZBU1Q7CisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzICAgICA9IExWTV9OVUxMOworICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5TaXplIDwgNCkKKyAgICB7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLlNpemUgPSAwOworICAgIH0KKworICAgIHJldHVybihMVk1fU1VDQ0VTUyk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVk1fR2V0SW5zdGFuY2VIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgYnVuZGxlIGluc3RhbmNlLiBJdCByZXR1cm5zIHRoZSBjcmVhdGVkIGluc3RhbmNlICAqLworLyogIGhhbmRsZSB0aHJvdWdoIHBoSW5zdGFuY2UuIEFsbCBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCwgaW5hY3RpdmUgc3RhdGUuICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBoSW5zdGFuY2UgICAgICAgICAgICAgIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdFBhcmFtcyAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbml0aWFsaXNhdGlvbiBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9PVVRPRlJBTkdFICAgICAgICAgIFdoZW4gYW55IG9mIHRoZSBJbnN0YW5jZSBwYXJhbWV0ZXJzIGFyZSBvdXQgb2YgcmFuZ2UgICAgICAgICovCisvKiAgTFZNX05VTExBRERSRVNTICAgICAgICAgV2hlbiBvbmUgb2YgcGhJbnN0YW5jZSwgcE1lbW9yeVRhYmxlIG9yIHBJbnN0UGFyYW1zIGFyZSBOVUxMKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX0dldEluc3RhbmNlSGFuZGxlKExWTV9IYW5kbGVfdCAgICAgICAgICAgKnBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtVGFiX3QgICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSW5zdFBhcmFtc190ICAgICAgICpwSW5zdFBhcmFtcykKK3sKKworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIFN0YXR1cyA9IExWTV9TVUNDRVNTOworICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgICpwSW5zdGFuY2U7CisgICAgSU5TVF9BTExPQyAgICAgICAgICAgICAgQWxsb2NNZW1bTFZNX05SX01FTU9SWV9SRUdJT05TXTsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBpOworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIEludGVybmFsQmxvY2tTaXplOworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEJ1bmRsZVNjcmF0Y2hTaXplOworCisgICAgLyoKKyAgICAgKiBDaGVjayB2YWxpZCBwb2ludHMgaGF2ZSBiZWVuIGdpdmVuCisgICAgICovCisgICAgaWYgKChwaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKSB8fCAocEluc3RQYXJhbXMgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fTlVMTEFERFJFU1MpOworICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2sgdGhlIG1lbW9yeSB0YWJsZSBmb3IgTlVMTCBwb2ludGVycworICAgICAqLworICAgIGZvciAoaT0wOyBpPExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5TaXplICE9IDApICYmCisgICAgICAgICAgICAocE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzPT1MVk1fTlVMTCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybihMVk1fTlVMTEFERFJFU1MpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycworICAgICAqLworICAgIGlmKCAocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgIT0gTFZNX01BTkFHRURfQlVGRkVSUykgJiYgKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlICE9IExWTV9VTk1BTkFHRURfQlVGRkVSUykgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgfQorCisgICAgaWYoIHBJbnN0UGFyYW1zLT5FUU5CX051bUJhbmRzID4gMzIgKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fT1VUT0ZSQU5HRSk7CisgICAgfQorCisgICAgaWYocEluc3RQYXJhbXMtPkJ1ZmZlck1vZGUgPT0gTFZNX01BTkFHRURfQlVGRkVSUykKKyAgICB7CisgICAgICAgIGlmKCAocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSA8IExWTV9NSU5fTUFYQkxPQ0tTSVpFICkgfHwgKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPiBMVk1fTUFOQUdFRF9NQVhfTUFYQkxPQ0tTSVpFICkgKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiggKHBJbnN0UGFyYW1zLT5NYXhCbG9ja1NpemUgPCBMVk1fTUlOX01BWEJMT0NLU0laRSApIHx8IChwSW5zdFBhcmFtcy0+TWF4QmxvY2tTaXplID4gTFZNX1VOTUFOQUdFRF9NQVhfTUFYQkxPQ0tTSVpFKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoTFZNX09VVE9GUkFOR0UpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYocEluc3RQYXJhbXMtPlBTQV9JbmNsdWRlZCA+IExWTV9QU0FfT04pCisgICAgeworICAgICAgICByZXR1cm4gKExWTV9PVVRPRlJBTkdFKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIEFsbG9jTWVtIHN0cnVjdHVyZXMKKyAgICAgKi8KKyAgICBmb3IgKGk9MDsgaTxMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykKKyAgICB7CisgICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbVtpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgaW5zdGFuY2UgaGFuZGxlCisgICAgICovCisgICAgKnBoSW5zdGFuY2UgID0gKExWTV9IYW5kbGVfdClJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9JbnN0YW5jZV90KSk7CisgICAgcEluc3RhbmNlID0oTFZNX0luc3RhbmNlX3QgICopKnBoSW5zdGFuY2U7CisKKyAgICAvKgorICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSwgcGFyYW1ldGVycyBhbmQgY2FwYWJpbGl0aWVzCisgICAgICovCisgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZSAgICA9ICpwTWVtb3J5VGFibGU7CisgICAgcEluc3RhbmNlLT5JbnN0UGFyYW1zICAgICA9ICpwSW5zdFBhcmFtczsKKworICAgIC8qCisgICAgICogU2V0IHRoZSBidW5kbGUgc2NyYXRjaCBtZW1vcnkgYW5kIGluaXRpYWxzZSB0aGUgYnVmZmVyIG1hbmFnZW1lbnQKKyAgICAgKi8KKyAgICBJbnRlcm5hbEJsb2NrU2l6ZSA9IChMVk1fVUlOVDE2KSgocEluc3RQYXJhbXMtPk1heEJsb2NrU2l6ZSkgJiBNSU5fSU5URVJOQUxfQkxPQ0tNQVNLKTsgLyogRm9yY2UgdG8gYSBtdWx0aXBsZSBvZiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFICovCisgICAgaWYgKEludGVybmFsQmxvY2tTaXplIDwgTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkKKyAgICB7CisgICAgICAgIEludGVybmFsQmxvY2tTaXplID0gTUlOX0lOVEVSTkFMX0JMT0NLU0laRTsKKyAgICB9CisKKyAgICAvKiBNYXhpbXVtIEludGVybmFsIEJsYWNrIFNpemUgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYW4gTUFYX0lOVEVSTkFMX0JMT0NLU0laRSovCisgICAgaWYoSW50ZXJuYWxCbG9ja1NpemUgPiBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFKQorICAgIHsKKyAgICAgICAgSW50ZXJuYWxCbG9ja1NpemUgPSBNQVhfSU5URVJOQUxfQkxPQ0tTSVpFOworICAgIH0KKyAgICBwSW5zdGFuY2UtPkludGVybmFsQmxvY2tTaXplID0gKExWTV9JTlQxNilJbnRlcm5hbEJsb2NrU2l6ZTsKKworICAgIC8qCisgICAgICogQ29tbW9uIHNldHRpbmdzIGZvciBtYW5hZ2VkIGFuZCB1bm1hbmFnZWQgYnVmZmVycworICAgICAqLworICAgIHBJbnN0YW5jZS0+U2FtcGxlc1RvUHJvY2VzcyA9IDA7ICAgICAgICAgICAgICAgIC8qIE5vIHNhbXBsZXMgbGVmdCB0byBwcm9jZXNzICovCisgICAgaWYgKHBJbnN0UGFyYW1zLT5CdWZmZXJNb2RlID09IExWTV9NQU5BR0VEX0JVRkZFUlMpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBNYW5hZ2VkIGJ1ZmZlcnMgcmVxdWlyZWQKKyAgICAgICAgICovCisgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQgPSAoTFZNX0J1ZmZlcl90ICopCisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9CdWZmZXJfdCkpOworICAgICAgICBCdW5kbGVTY3JhdGNoU2l6ZSA9IChMVk1fSU5UMzIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDMgKiBMVk1fTUFYX0NIQU5ORUxTIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAoTUlOX0lOVEVSTkFMX0JMT0NLU0laRSArIEludGVybmFsQmxvY2tTaXplKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5wU2NyYXRjaCA9IChMVk1fRkxPQVQgKikKKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLCAvKiBTY3JhdGNoIDEgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKUJ1bmRsZVNjcmF0Y2hTaXplKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaW5wdXQgZGVsYXkgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopJnBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkluRGVsYXlCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShMVk1fTUFYX0NIQU5ORUxTICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRSkpOworICAgICAgICBwSW5zdGFuY2UtPnBCdWZmZXJNYW5hZ2VtZW50LT5JbkRlbGF5U2FtcGxlcyA9IE1JTl9JTlRFUk5BTF9CTE9DS1NJWkU7IC8qIFNldCB0aGUgbnVtYmVyIG9mIGRlbGF5IHNhbXBsZXMgKi8KKyAgICAgICAgcEluc3RhbmNlLT5wQnVmZmVyTWFuYWdlbWVudC0+T3V0RGVsYXlTYW1wbGVzID0gMDsgICAgICAgICAgICAgICAgICAgICAvKiBObyBzYW1wbGVzIGluIHRoZSBvdXRwdXQgYnVmZmVyICovCisgICAgICAgIHBJbnN0YW5jZS0+cEJ1ZmZlck1hbmFnZW1lbnQtPkJ1ZmZlclN0YXRlID0gTFZNX0ZJUlNUQ0FMTDsgICAgICAgICAgICAgLyogU2V0IHRoZSBzdGF0ZSByZWFkeSBmb3IgdGhlIGZpcnN0IGNhbGwgKi8KKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldCBkZWZhdWx0IHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICAgID0gTFZNX01PREVfT0ZGOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgICAgICAgPSBMVk1fRlNfODAwMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgICAgID0gTFZNX01PTk87CisgICAgcEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgICAgICA9IExWTV9IRUFEUEhPTkVTOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZDX0VmZmVjdExldmVsICAgPSAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZDX0JhbGFuY2UgICAgICAgPSAwOworCisgICAgLyoKKyAgICAgKiBTZXQgY2FsbGJhY2sKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPkNhbGxCYWNrID0gTFZNX0FsZ29DYWxsQmFjazsKKworICAgIC8qCisgICAgICogREMgcmVtb3ZhbCBmaWx0ZXIKKyAgICAgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgRENfTWNfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOworI2Vsc2UKKyAgICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSk7CisjZW5kaWYKKworICAgIC8qCisgICAgICogVHJlYmxlIEVuaGFuY2VtZW50CisgICAgICovCisgICAgcEluc3RhbmNlLT5wVEVfVGFwcyAgPSAoTFZNX1RFX0RhdGFfdCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fVEVfRGF0YV90KSk7CisKKyAgICBwSW5zdGFuY2UtPnBURV9TdGF0ZSA9IChMVk1fVEVfQ29lZnNfdCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX1RFX0NvZWZzX3QpKTsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5URV9PcGVyYXRpbmdNb2RlID0gTFZNX1RFX09GRjsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5URV9FZmZlY3RMZXZlbCAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlRFX0FjdGl2ZSAgICAgICAgICAgICAgID0gTFZNX0ZBTFNFOworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIHZvbHVtZSBjb250cm9sIGFuZCBpbml0aWFsaXNlIEN1cnJlbnQgdG8gVGFyZ2V0CisgICAgICovCisgICAgcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAwOworICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSAgICA9IHBJbnN0YW5jZTsKKyAgICBwSW5zdGFuY2UtPlZDX1ZvbHVtZS5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fVkNDYWxsQmFjazsKKworICAgIC8qIEluIG1hbmFnZWQgYnVmZmVyaW5nLCBzdGFydCB3aXRoIGxvdyBzaWduYWwgbGV2ZWwgYXMgZGVsYXkgaW4gYnVmZmVyIG1hbmFnZW1lbnQgY2F1c2VzIGEgY2xpY2sqLworICAgIGlmIChwSW5zdFBhcmFtcy0+QnVmZmVyTW9kZSA9PSBMVk1fTUFOQUdFRF9CVUZGRVJTKQorICAgIHsKKyAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLCAwLCAwKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLk1peGVyU3RyZWFtWzBdLCBMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVCk7CisgICAgfQorCisgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19Wb2x1bWUuTWl4ZXJTdHJlYW1bMF0sMCxMVk1fRlNfODAwMCwyKTsKKworICAgIHBJbnN0YW5jZS0+VkNfVm9sdW1lZEIgICAgICAgICAgICAgICAgICA9IDA7CisgICAgcEluc3RhbmNlLT5WQ19BVkxGaXhlZFZvbHVtZSAgICAgICAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX0FjdGl2ZSAgICAgICAgICAgICAgICAgICAgPSBMVk1fRkFMU0U7CisKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlICAgID0gcEluc3RhbmNlOworICAgIHBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fVkNDYWxsQmFjazsKKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLCBMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVCk7CisgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzBdLExWTV9WQ19NSVhFUl9USU1FLExWTV9GU184MDAwLDIpOworCisgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7CisgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ICAgICAgICA9IDA7CisgICAgcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4Lk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSAgICA9IHBJbnN0YW5jZTsKKyAgICBwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXguTWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrICAgICAgICAgID0gTFZNX1ZDQ2FsbEJhY2s7CisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSwgTFZNX01BWEZMT0FULCBMVk1fTUFYRkxPQVQpOworICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peC5NaXhlclN0cmVhbVsxXSxMVk1fVkNfTUlYRVJfVElNRSxMVk1fRlNfODAwMCwyKTsKKworICAgIC8qCisgICAgICogU2V0IHRoZSBkZWZhdWx0IEVRTkIgcHJlLWdhaW4gYW5kIHBvaW50ZXIgdG8gdGhlIGJhbmQgZGVmaW5pdGlvbnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPnBFUU5CX0JhbmREZWZzID0KKyAgICAgICAgKExWTV9FUU5CX0JhbmREZWZfdCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RQYXJhbXMtPkVRTkJfTnVtQmFuZHMgKiBzaXplb2YoTFZNX0VRTkJfQmFuZERlZl90KSkpOworICAgIHBJbnN0YW5jZS0+cEVRTkJfVXNlckRlZnMgPQorICAgICAgICAoTFZNX0VRTkJfQmFuZERlZl90ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kcyAqIHNpemVvZihMVk1fRVFOQl9CYW5kRGVmX3QpKSk7CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIENvbmNlcnQgU291bmQgbW9kdWxlCisgICAgICovCisgICAgeworICAgICAgICBMVkNTX0hhbmRsZV90ICAgICAgICAgICBoQ1NJbnN0YW5jZTsgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgIExWQ1NfTWVtVGFiX3QgICAgICAgICAgIENTX01lbVRhYjsgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KKyAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAgQ1NfQ2FwYWJpbGl0aWVzOyAgICAgICAgICAgIC8qIEluaXRpYWwgY2FwYWJpbGl0aWVzICovCisgICAgICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuICAgIExWQ1NfU3RhdHVzOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCBkZWZhdWx0IHBhcmFtZXRlcnMKKyAgICAgICAgICovCisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZpcnR1YWxpemVyUmV2ZXJiTGV2ZWwgICAgPSAxMDA7CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLlZpcnR1YWxpemVyVHlwZSAgICAgICAgICAgPSBMVk1fQ09OQ0VSVFNPVU5EOworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgID0gTFZNX01PREVfT0ZGOworICAgICAgICBwSW5zdGFuY2UtPkNTX0FjdGl2ZSAgICAgICAgICAgICAgICAgICAgICAgID0gTFZNX0ZBTFNFOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gY2FwYWJpbGl0aWVzCisgICAgICAgICAqLworICAgICAgICBDU19DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplICAgID0gKExWTV9VSU5UMTYpSW50ZXJuYWxCbG9ja1NpemU7CisgICAgICAgIENTX0NhcGFiaWxpdGllcy5DYWxsQmFjayA9IHBJbnN0YW5jZS0+Q2FsbEJhY2s7CisgICAgICAgIENTX0NhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UgPSAodm9pZCopcEluc3RhbmNlOworCisgICAgICAgIC8qCisgICAgICAgICAqIEdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgdGhlbiBzZXQgdGhlIGFkZHJlc3MgcG9pbnRlcnMsIGZvcmNpbmcgYWxpZ25tZW50CisgICAgICAgICAqLworICAgICAgICBMVkNTX1N0YXR1cyA9IExWQ1NfTWVtb3J5KExWTV9OVUxMLCAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ1NfTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDU19DYXBhYmlsaXRpZXMpOworICAgICAgICBDU19NZW1UYWIuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MgPSAmcEluc3RhbmNlLT5DU19JbnN0YW5jZTsKKyAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpOworICAgICAgICBDU19NZW1UYWIuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ1NfTWVtVGFiLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSk7CisgICAgICAgIENTX01lbVRhYi5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBJbml0aWFsaXNlIHRoZSBDb25jZXJ0IFNvdW5kIGluc3RhbmNlIGFuZCBzYXZlIHRoZSBpbnN0YW5jZSBoYW5kbGUKKyAgICAgICAgICovCisgICAgICAgIGhDU0luc3RhbmNlID0gTFZNX05VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNldCB0byBOVUxMIHRvIHJldHVybiBoYW5kbGUgKi8KKyAgICAgICAgTFZDU19TdGF0dXMgPSBMVkNTX0luaXQoJmhDU0luc3RhbmNlLCAgICAgICAgICAgICAgLyogSW5pdGlhaWxzZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ1NfTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ1NfQ2FwYWJpbGl0aWVzKTsKKyAgICAgICAgaWYgKExWQ1NfU3RhdHVzICE9IExWQ1NfU1VDQ0VTUykgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKUxWQ1NfU3RhdHVzKTsKKyAgICAgICAgcEluc3RhbmNlLT5oQ1NJbnN0YW5jZSA9IGhDU0luc3RhbmNlOyAgICAgICAgICAgICAgLyogU2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlICovCisKKyAgICB9CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIEJhc3MgRW5oYW5jZW1lbnQgbW9kdWxlCisgICAgICovCisgICAgeworICAgICAgICBMVkRCRV9IYW5kbGVfdCAgICAgICAgICBoREJFSW5zdGFuY2U7ICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgIExWREJFX01lbVRhYl90ICAgICAgICAgIERCRV9NZW1UYWI7ICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KKyAgICAgICAgTFZEQkVfQ2FwYWJpbGl0aWVzX3QgICAgREJFX0NhcGFiaWxpdGllczsgICAgICAgICAgIC8qIEluaXRpYWwgY2FwYWJpbGl0aWVzICovCisgICAgICAgIExWREJFX1JldHVyblN0YXR1c19lbiAgIExWREJFX1N0YXR1czsgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworCisgICAgICAgIC8qCisgICAgICAgICAqIFNldCB0aGUgaW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycworICAgICAgICAgKi8KKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuQkVfT3BlcmF0aW5nTW9kZSA9IExWTV9CRV9PRkY7CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkJFX0NlbnRyZUZyZXEgICAgPSBMVk1fQkVfQ0VOVFJFXzU1SHo7CisgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLkJFX0VmZmVjdExldmVsICAgPSAwOworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5CRV9IUEYgICAgICAgICAgID0gTFZNX0JFX0hQRl9PRkY7CisKKyAgICAgICAgcEluc3RhbmNlLT5EQkVfQWN0aXZlICAgICAgICAgICAgICA9IExWTV9GQUxTRTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcworICAgICAgICAgKi8KKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5TYW1wbGVSYXRlICAgICAgPSBMVkRCRV9DQVBfRlNfODAwMCB8IExWREJFX0NBUF9GU18xMTAyNSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzEyMDAwIHwgTFZEQkVfQ0FQX0ZTXzE2MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMjIwNTAgfCBMVkRCRV9DQVBfRlNfMjQwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWREJFX0NBUF9GU18zMjAwMCB8IExWREJFX0NBUF9GU180NDEwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZEQkVfQ0FQX0ZTXzQ4MDAwIHwgTFZEQkVfQ0FQX0ZTXzg4MjAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfOTYwMDAgfCBMVkRCRV9DQVBfRlNfMTc2NDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkRCRV9DQVBfRlNfMTkyMDAwOworICAgICAgICBEQkVfQ2FwYWJpbGl0aWVzLkNlbnRyZUZyZXF1ZW5jeSA9IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNTVIeiB8IExWREJFX0NBUF9DRU5UUkVfNjZIeiB8IExWREJFX0NBUF9DRU5UUkVfNzhIeiB8IExWREJFX0NBUF9DRU5UUkVfOTBIejsKKyAgICAgICAgREJFX0NhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUgICAgPSAoTFZNX1VJTlQxNilJbnRlcm5hbEJsb2NrU2l6ZTsKKworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kIHRoZW4gc2V0IHRoZSBhZGRyZXNzIHBvaW50ZXJzCisgICAgICAgICAqLworICAgICAgICBMVkRCRV9TdGF0dXMgPSBMVkRCRV9NZW1vcnkoTFZNX05VTEwsICAgICAgICAgICAgICAgLyogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmREJFX01lbVRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEQkVfQ2FwYWJpbGl0aWVzKTsKKyAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MgICAgICAgID0gJnBJbnN0YW5jZS0+REJFX0luc3RhbmNlOworICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSk7CisgICAgICAgIERCRV9NZW1UYWIuUmVnaW9uW0xWREJFX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEQkVfTWVtVGFiLlJlZ2lvbltMVkRCRV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplKTsKKyAgICAgICAgREJFX01lbVRhYi5SZWdpb25bTFZEQkVfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzcyAgICAgICAgID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisgICAgICAgIC8qCisgICAgICAgICAqIEluaXRpYWxpc2UgdGhlIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCBpbnN0YW5jZSBhbmQgc2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlCisgICAgICAgICAqLworICAgICAgICBoREJFSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRvIE5VTEwgdG8gcmV0dXJuIGhhbmRsZSAqLworICAgICAgICBMVkRCRV9TdGF0dXMgPSBMVkRCRV9Jbml0KCZoREJFSW5zdGFuY2UsICAgICAgICAgICAgLyogSW5pdGlhaWxzZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEQkVfTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZEQkVfQ2FwYWJpbGl0aWVzKTsKKyAgICAgICAgaWYgKExWREJFX1N0YXR1cyAhPSBMVkRCRV9TVUNDRVNTKSByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pTFZEQkVfU3RhdHVzKTsKKyAgICAgICAgcEluc3RhbmNlLT5oREJFSW5zdGFuY2UgPSBoREJFSW5zdGFuY2U7ICAgICAgICAgICAgIC8qIFNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZSAqLworICAgIH0KKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgTi1CYW5kIEVxdWFsaXNlciBtb2R1bGUKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWRVFOQl9IYW5kbGVfdCAgICAgICAgICBoRVFOQkluc3RhbmNlOyAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgIEVRTkJfTWVtVGFiOyAgICAgICAgICAgICAgIC8qIE1lbW9yeSB0YWJsZSAqLworICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgRVFOQl9DYXBhYmlsaXRpZXM7ICAgICAgICAgLyogSW5pdGlhbCBjYXBhYmlsaXRpZXMgKi8KKyAgICAgICAgTFZFUU5CX1JldHVyblN0YXR1c19lbiAgIExWRVFOQl9TdGF0dXM7ICAgICAgICAgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0IHRoZSBpbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgICAqLworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5FUU5CX09wZXJhdGluZ01vZGUgICA9IExWTV9FUU5CX09GRjsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuRVFOQl9OQmFuZHMgICAgICAgICAgPSAwOworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9IExWTV9OVUxMOworICAgICAgICBwSW5zdGFuY2UtPkVRTkJfQWN0aXZlICAgICAgICAgICAgICAgICA9IExWTV9GQUxTRTsKKworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGluaXRpYWxpc2F0aW9uIGNhcGFiaWxpdGllcworICAgICAgICAgKi8KKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU2FtcGxlUmF0ZSAgICAgID0gTFZFUU5CX0NBUF9GU184MDAwIHwgTFZFUU5CX0NBUF9GU18xMTAyNSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfMTIwMDAgfCBMVkVRTkJfQ0FQX0ZTXzE2MDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18yMjA1MCB8IExWRVFOQl9DQVBfRlNfMjQwMDAgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ0FQX0ZTXzMyMDAwIHwgTFZFUU5CX0NBUF9GU180NDEwMCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DQVBfRlNfNDgwMDAgfCBMVkVRTkJfQ0FQX0ZTXzg4MjAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU185NjAwMCB8IExWRVFOQl9DQVBfRlNfMTc2NDAwIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NBUF9GU18xOTIwMDA7CisgICAgICAgIEVRTkJfQ2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSAgICA9IChMVk1fVUlOVDE2KUludGVybmFsQmxvY2tTaXplOworICAgICAgICBFUU5CX0NhcGFiaWxpdGllcy5NYXhCYW5kcyAgICAgICAgPSBwSW5zdFBhcmFtcy0+RVFOQl9OdW1CYW5kczsKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuU291cmNlRm9ybWF0ICAgID0gTFZFUU5CX0NBUF9TVEVSRU8gfCBMVkVRTkJfQ0FQX01PTk9JTlNURVJFTzsKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMuQ2FsbEJhY2sgICAgICAgID0gcEluc3RhbmNlLT5DYWxsQmFjazsKKyAgICAgICAgRVFOQl9DYXBhYmlsaXRpZXMucEJ1bmRsZUluc3RhbmNlICA9ICh2b2lkKilwSW5zdGFuY2U7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCB0aGVuIHNldCB0aGUgYWRkcmVzcyBwb2ludGVycywgZm9yY2luZyBhbGlnbm1lbnQKKyAgICAgICAgICovCisgICAgICAgIExWRVFOQl9TdGF0dXMgPSBMVkVRTkJfTWVtb3J5KExWTV9OVUxMLCAgICAgICAgICAgICAvKiBHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkVRTkJfTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRVFOQl9DYXBhYmlsaXRpZXMpOworICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzICAgICAgICA9ICZwSW5zdGFuY2UtPkVRTkJfSW5zdGFuY2U7CisgICAgICAgIEVRTkJfTWVtVGFiLlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplKTsKKyAgICAgICAgRVFOQl9NZW1UYWIuUmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSAodm9pZCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUpOworICAgICAgICBFUU5CX01lbVRhYi5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgICAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOworCisgICAgICAgIC8qCisgICAgICAgICAqIEluaXRpYWxpc2UgdGhlIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCBpbnN0YW5jZSBhbmQgc2F2ZSB0aGUgaW5zdGFuY2UgaGFuZGxlCisgICAgICAgICAqLworICAgICAgICBoRVFOQkluc3RhbmNlID0gTFZNX05VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRvIE5VTEwgdG8gcmV0dXJuIGhhbmRsZSAqLworICAgICAgICBMVkVRTkJfU3RhdHVzID0gTFZFUU5CX0luaXQoJmhFUU5CSW5zdGFuY2UsICAgICAgICAgLyogSW5pdGlhaWxzZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkVRTkJfTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkVRTkJfQ2FwYWJpbGl0aWVzKTsKKyAgICAgICAgaWYgKExWRVFOQl9TdGF0dXMgIT0gTFZFUU5CX1NVQ0NFU1MpIHJldHVybigoTFZNX1JldHVyblN0YXR1c19lbilMVkVRTkJfU3RhdHVzKTsKKyAgICAgICAgcEluc3RhbmNlLT5oRVFOQkluc3RhbmNlID0gaEVRTkJJbnN0YW5jZTsgICAgICAgICAgIC8qIFNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZSAqLworICAgIH0KKworICAgIC8qCisgICAgICogSGVhZHJvb20gbWFuYWdlbWVudCBtZW1vcnkgYWxsb2NhdGlvbgorICAgICAqLworICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5wSGVhZHJvb21fQmFuZERlZnMgPSAoTFZNX0hlYWRyb29tQmFuZERlZl90ICopCisgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTICogc2l6ZW9mKExWTV9IZWFkcm9vbUJhbmREZWZfdCkpKTsKKyAgICAgICAgcEluc3RhbmNlLT5wSGVhZHJvb21fVXNlckRlZnMgPSAoTFZNX0hlYWRyb29tQmFuZERlZl90ICopCisgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtW0xWTV9NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9IRUFEUk9PTV9NQVhfTkJBTkRTICogc2l6ZW9mKExWTV9IZWFkcm9vbUJhbmREZWZfdCkpKTsKKworICAgICAgICAvKiBIZWFkcm9vbSBtYW5hZ2VtZW50IHBhcmFtZXRlcnMgaW5pdGlhbGlzYXRpb24gKi8KKyAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5OSGVhZHJvb21CYW5kcyA9IDI7CisgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvbiA9IHBJbnN0YW5jZS0+cEhlYWRyb29tX0JhbmREZWZzOworICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMF0uTGltaXRfTG93ICAgICAgICAgID0gMjA7CisgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblswXS5MaW1pdF9IaWdoICAgICAgICAgPSA0OTk5OworICAgICAgICBwSW5zdGFuY2UtPk5ld0hlYWRyb29tUGFyYW1zLnBIZWFkcm9vbURlZmluaXRpb25bMF0uSGVhZHJvb21fT2Zmc2V0ICAgID0gMzsKKyAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uWzFdLkxpbWl0X0xvdyAgICAgICAgICA9IDUwMDA7CisgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMucEhlYWRyb29tRGVmaW5pdGlvblsxXS5MaW1pdF9IaWdoICAgICAgICAgPSAyNDAwMDsKKyAgICAgICAgcEluc3RhbmNlLT5OZXdIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uWzFdLkhlYWRyb29tX09mZnNldCAgICA9IDQ7CisgICAgICAgIHBJbnN0YW5jZS0+TmV3SGVhZHJvb21QYXJhbXMuSGVhZHJvb21fT3BlcmF0aW5nTW9kZSA9IExWTV9IRUFEUk9PTV9PTjsKKworICAgICAgICBwSW5zdGFuY2UtPkhlYWRyb29tID0wOworICAgIH0KKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgUFNBIG1vZHVsZQorICAgICAqLworICAgIHsKKyAgICAgICAgcExWUFNBX0hhbmRsZV90ICAgICBoUFNBSW5zdGFuY2UgPSBMVk1fTlVMTDsgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgTFZQU0FfTWVtVGFiX3QgICAgICBQU0FfTWVtVGFiOworICAgICAgICBMVlBTQV9SRVRVUk4gICAgICAgIFBTQV9TdGF0dXM7ICAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLworICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90IEZpbHRlcnNQYXJhbXNbOV07CisKKyAgICAgICAgaWYocEluc3RQYXJhbXMtPlBTQV9JbmNsdWRlZD09TFZNX1BTQV9PTikKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcy5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiAgID0gKExWTV9VSU5UMTYpIDUwMDsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMuTWF4SW5wdXRCbG9ja1NpemUgICAgICAgICAgICA9IChMVk1fVUlOVDE2KSAyMDQ4OworICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfSW5pdFBhcmFtcy5uQmFuZHMgICAgICAgICAgICAgICAgICAgICAgID0gKExWTV9VSU5UMTYpIDk7CisgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Jbml0UGFyYW1zLnBGaWx0ZXJzUGFyYW1zICAgICAgICAgICAgICAgPSAmRmlsdGVyc1BhcmFtc1swXTsKKyAgICAgICAgICAgIGZvcihpID0gMDsgaSA8IHBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMubkJhbmRzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgRmlsdGVyc1BhcmFtc1tpXS5DZW50ZXJGcmVxdWVuY3kgICAgPSAoTFZNX1VJTlQxNikgMTAwMDsKKyAgICAgICAgICAgICAgICBGaWx0ZXJzUGFyYW1zW2ldLlFGYWN0b3IgICAgICAgICAgICA9IChMVk1fVUlOVDE2KSAxMDA7CisgICAgICAgICAgICAgICAgRmlsdGVyc1BhcmFtc1tpXS5Qb3N0R2FpbiAgICAgICAgICAgPSAoTFZNX0lOVDE2KSAgMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLypHZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kIHRoZW4gc2V0IHRoZSBhZGRyZXNzIHBvaW50ZXJzKi8KKyAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9NZW1vcnkgKGhQU0FJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfTWVtVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMpOworCisgICAgICAgICAgICBpZiAoUFNBX1N0YXR1cyAhPSBMVlBTQV9PSykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oKExWTV9SZXR1cm5TdGF0dXNfZW4pIExWTV9BTEdPUklUSE1QU0EpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBTbG93IERhdGEgKi8KKyAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwKKyAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpOworCisgICAgICAgICAgICAvKiBGYXN0IERhdGEgKi8KKyAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwKKyAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUpOworCisgICAgICAgICAgICAvKiBGYXN0IENvZWYgKi8KKyAgICAgICAgICAgIFBTQV9NZW1UYWIuUmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzID0gKHZvaWQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbVtMVk1fTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwKKyAgICAgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpOworCisgICAgICAgICAgICAvKiBGYXN0IFRlbXBvcmFyeSAqLworICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQgPSAoTFZNX0ZMT0FUICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX1RFTVBPUkFSWV9GQVNUXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQzMikgTUFYX0lOVEVSTkFMX0JMT0NLU0laRSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgICAgICBQU0FfTWVtVGFiLlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgICA9ICh2b2lkICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW1bTFZNX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0sMCk7CisKKyAgICAgICAgICAgIC8qSW5pdGlhbGlzZSBQU0EgaW5zdGFuY2UgYW5kIHNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZSovCisgICAgICAgICAgICBwSW5zdGFuY2UtPlBTQV9Db250cm9sUGFyYW1zLkZzID0gTFZNX0ZTXzQ4MDAwOworICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfQ29udHJvbFBhcmFtcy5MZXZlbERldGVjdGlvblNwZWVkICA9IExWUFNBX1NQRUVEX01FRElVTTsKKyAgICAgICAgICAgIFBTQV9TdGF0dXMgPSBMVlBTQV9Jbml0ICgmaFBTQUluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+UFNBX0luaXRQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QU0FfQ29udHJvbFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQU0FfTWVtVGFiKTsKKworICAgICAgICAgICAgaWYgKFBTQV9TdGF0dXMgIT0gTFZQU0FfT0spCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuKChMVk1fUmV0dXJuU3RhdHVzX2VuKSBMVk1fQUxHT1JJVEhNUFNBKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgcEluc3RhbmNlLT5oUFNBSW5zdGFuY2UgPSBoUFNBSW5zdGFuY2U7ICAgICAgIC8qIFNhdmUgdGhlIGluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgcEluc3RhbmNlLT5QU0FfR2Fpbk9mZnNldCA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSA9IExWTV9OVUxMOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0IHRoZSBpbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzLgorICAgICAgICAgKi8KKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuUFNBX1BlYWtEZWNheVJhdGUgICA9IExWTV9QU0FfU1BFRURfTUVESVVNOworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5QU0FfRW5hYmxlICAgICAgICAgID0gTFZNX1BTQV9PRkY7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSBpbml0aWFsIHBhcmFtZXRlcnMgdG8gdGhlIG5ldyBwYXJhbWV0ZXJzIGZvciBjb3JyZWN0IHJlYWRiYWNrIG9mCisgICAgICogdGhlIHNldHRpbmdzLgorICAgICAqLworICAgIHBJbnN0YW5jZS0+TmV3UGFyYW1zID0gcEluc3RhbmNlLT5QYXJhbXM7CisKKyAgICAvKgorICAgICAqIENyZWF0ZSBjb25maWd1cmF0aW9uIG51bWJlcgorICAgICAqLworICAgIHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciA9IDB4MDAwMDAwMDA7CisgICAgcEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICs9IExWTV9DU19NQVNLOworICAgIHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciArPSBMVk1fRVFOQl9NQVNLOworICAgIHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciArPSBMVk1fREJFX01BU0s7CisgICAgcEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICs9IExWTV9WQ19NQVNLOworICAgIHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciArPSBMVk1fUFNBX01BU0s7CisKKyAgICBpZigoKHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciAgJiBMVk1fQ1NfTUFTSykhPTApICB8fAorICAgICAgICAoKHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciAmIExWTV9EQkVfTUFTSykhPTApIHx8CisgICAgICAgICgocEluc3RhbmNlLT5Db25maWd1cmF0aW9uTnVtYmVyICYgTFZNX0VRTkJfTUFTSykhPTApfHwKKyAgICAgICAgKChwSW5zdGFuY2UtPkNvbmZpZ3VyYXRpb25OdW1iZXIgJiBMVk1fVEVfTUFTSykhPTApICB8fAorICAgICAgICAoKHBJbnN0YW5jZS0+Q29uZmlndXJhdGlvbk51bWJlciAmIExWTV9WQ19NQVNLKSE9MCkpCisgICAgeworICAgICAgICBwSW5zdGFuY2UtPkJsaWNrU2l6ZU11bHRpcGxlICAgID0gNDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5CbGlja1NpemVNdWx0aXBsZSAgICA9IDE7CisgICAgfQorCisgICAgcmV0dXJuKFN0YXR1cyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX0NsZWFyQXVkaW9CdWZmZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGNsZWFyIHRoZSBpbnRlcm5hbCBhdWRpbyBidWZmZXJzIG9mIHRoZSBidW5kbGUuICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fTlVMTEFERFJFU1MgICAgICAgICBJbnN0YW5jZSBvciBzY3JhdGNoIG1lbW9yeSBoYXMgYSBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVk1fUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX1JldHVyblN0YXR1c19lbiBMVk1fQ2xlYXJBdWRpb0J1ZmZlcnMoTFZNX0hhbmRsZV90ICBoSW5zdGFuY2UpCit7CisgICAgTFZNX01lbVRhYl90ICAgICAgICAgICAgTWVtVGFiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KKyAgICBMVk1fSW5zdFBhcmFtc190ICAgICAgICBJbnN0UGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICBQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbnRyb2wgUGFyYW1ldGVycyAqLworICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsgLyogUG9pbnRlciB0byBJbnN0YW5jZSAqLworICAgIExWTV9IZWFkcm9vbVBhcmFtc190ICAgIEhlYWRyb29tUGFyYW1zOworCisgICAgaWYoaEluc3RhbmNlID09IExWTV9OVUxMKXsKKyAgICAgICAgcmV0dXJuIExWTV9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICAvKiBTYXZlIHRoZSBjb250cm9sIHBhcmFtZXRlcnMgKi8gLyogY292ZXJpdHlbdW5jaGVja2VkX3ZhbHVlXSAqLyAvKiBEbyBub3QgY2hlY2sgcmV0dXJuIHZhbHVlIGludGVybmFsIGZ1bmN0aW9uIGNhbGxzICovCisgICAgTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzKGhJbnN0YW5jZSwgJlBhcmFtcyk7CisKKyAgICAvKlNhdmUgdGhlIGhlYWRyb29tIHBhcmFtZXRlcnMqLworICAgIExWTV9HZXRIZWFkcm9vbVBhcmFtcyhoSW5zdGFuY2UsICZIZWFkcm9vbVBhcmFtcyk7CisKKyAgICAvKiAgUmV0cmlldmUgYWxsb2NhdGVkIGJ1ZmZlcnMgaW4gbWVtdGFiICovCisgICAgTFZNX0dldE1lbW9yeVRhYmxlKGhJbnN0YW5jZSwgJk1lbVRhYiwgIExWTV9OVUxMKTsKKworICAgIC8qICBTYXZlIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzICovCisgICAgSW5zdFBhcmFtcyA9IHBJbnN0YW5jZS0+SW5zdFBhcmFtczsKKworICAgIC8qICBDYWxsICBMVk1fR2V0SW5zdGFuY2VIYW5kbGUgdG8gcmUtaW5pdGlhbGlzZSB0aGUgYnVuZGxlICovCisgICAgTFZNX0dldEluc3RhbmNlSGFuZGxlKCAmaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lbVRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZJbnN0UGFyYW1zKTsKKworICAgIC8qIFJlc3RvcmUgY29udHJvbCBwYXJhbWV0ZXJzICovIC8qIGNvdmVyaXR5W3VuY2hlY2tlZF92YWx1ZV0gKi8gLyogRG8gbm90IGNoZWNrIHJldHVybiB2YWx1ZSBpbnRlcm5hbCBmdW5jdGlvbiBjYWxscyAqLworICAgIExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhoSW5zdGFuY2UsICZQYXJhbXMpOworCisgICAgLypSZXN0b3JlIHRoZSBoZWFkcm9vbSBwYXJhbWV0ZXJzKi8KKyAgICBMVk1fU2V0SGVhZHJvb21QYXJhbXMoaEluc3RhbmNlLCAmSGVhZHJvb21QYXJhbXMpOworCisgICAgLyogREMgcmVtb3ZhbCBmaWx0ZXIgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgRENfTWNfRDE2X1RSQ19XUkFfMDFfSW5pdCgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UpOworI2Vsc2UKKyAgICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSk7CisjZW5kaWYKKworICAgIHJldHVybiBMVk1fU1VDQ0VTUzsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcml2YXRlLmgKaW5kZXggYjQ1MzIyMi4uZGRhYWM5OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fUHJpdmF0ZS5oCkBAIC0yNywxMSArMjcsNiBAQAogI2lmbmRlZiBfX0xWTV9QUklWQVRFX0hfXwogI2RlZmluZSBfX0xWTV9QUklWQVRFX0hfXwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDcsNyArNDIsNiBAQAogI2luY2x1ZGUgIkxWRVFOQl9Qcml2YXRlLmgiICAgICAgICAgICAgICAgICAgICAgLyogTi1CYW5kIGVxdWFsaXNlciAqLwogI2luY2x1ZGUgIkxWUFNBX1ByaXZhdGUuaCIgICAgICAgICAgICAgICAgICAgICAgLyogUGFyYW1ldHJpYyBTcGVjdHJ1bSBBbmFseXplciAqLwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERlZmluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTExMyw3ICsxMDcsNiBAQAogI2RlZmluZSBMVk1fVEVfTUFTSyAgICAgICAgICAgICAgICAgICAgIDMyCiAjZGVmaW5lIExWTV9QU0FfTUFTSyAgICAgICAgICAgICAgICAgICAgMjA0OAogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEyOSw2NCArMTIyLDQ2IEBACiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnBCYXNlQWRkcmVzczsgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZWdpb24gYmFzZSBhZGRyZXNzICovCiB9IExWTV9JbnRNZW1vcnlSZWdpb25fdDsKIAotCiAvKiBNZW1vcnkgdGFibGUgY29udGFpbmluZyB0aGUgcmVnaW9uIGRlZmluaXRpb25zICovCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9JbnRNZW1vcnlSZWdpb25fdCAgIFJlZ2lvbltMVk1fTlJfTUVNT1JZX1JFR0lPTlNdOyAgLyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICovCiB9IExWTV9JbnRNZW1UYWJfdDsKIAotCiAvKiBCdWZmZXIgTWFuYWdlbWVudCAqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwU2NyYXRjaDsgICAgICAgICAgLyogQnVuZGxlIHNjcmF0Y2ggYnVmZmVyICovCiAKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBCdWZmZXJTdGF0ZTsgICAgICAgIC8qIEJ1ZmZlciBzdGF0dXMgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgSW5EZWxheUJ1ZmZlclszICogTFZNX01BWF9DSEFOTkVMUyAqIE1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOworI2Vsc2UKICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBJbkRlbGF5QnVmZmVyWzYgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsgLyogSW5wdXQgYnVmZmVyIGRlbGF5IGxpbmUsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgYW5kIHJpZ2h0ICovCisjZW5kaWYKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBJbkRlbGF5U2FtcGxlczsgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKi8KLQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBPdXREZWxheUJ1ZmZlcltMVk1fTUFYX0NIQU5ORUxTICogTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07CisjZWxzZQogICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIE91dERlbGF5QnVmZmVyWzIgKiBNSU5fSU5URVJOQUxfQkxPQ0tTSVpFXTsgLyogT3V0cHV0IGJ1ZmZlciBkZWxheSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgKi8KKyNlbmRpZgogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE91dERlbGF5U2FtcGxlczsgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIG91dHB1dCBkZWxheSBidWZmZXIsIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCBhbmQgcmlnaHQgKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBTYW1wbGVzVG9PdXRwdXQ7ICAgIC8qIFNhbXBsZXMgdG8gd3JpdGUgdG8gdGhlIG91dHB1dCAqLwogfSBMVk1fQnVmZmVyX3Q7Ci0jZWxzZQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcFNjcmF0Y2g7ICAgICAgICAgIC8qIEJ1bmRsZSBzY3JhdGNoIGJ1ZmZlciAqLwotCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQnVmZmVyU3RhdGU7ICAgICAgICAvKiBCdWZmZXIgc3RhdHVzICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSW5EZWxheUJ1ZmZlcls2Kk1JTl9JTlRFUk5BTF9CTE9DS1NJWkVdOyAvKiBJbnB1dCBidWZmZXIgZGVsYXkgbGluZSwgbGVmdCBhbmQgcmlnaHQgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBJbkRlbGF5U2FtcGxlczsgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBkZWxheSBidWZmZXIgKi8KLQotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE91dERlbGF5QnVmZmVyWzIqTUlOX0lOVEVSTkFMX0JMT0NLU0laRV07IC8qIE91dHB1dCBidWZmZXIgZGVsYXkgbGluZSAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE91dERlbGF5U2FtcGxlczsgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIG91dHB1dCBkZWxheSBidWZmZXIsIGxlZnQgYW5kIHJpZ2h0ICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgU2FtcGxlc1RvT3V0cHV0OyAgICAvKiBTYW1wbGVzIHRvIHdyaXRlIHRvIHRoZSBvdXRwdXQgKi8KLX0gTFZNX0J1ZmZlcl90OwotI2VuZGlmCiAKIC8qIEZpbHRlciB0YXBzICovCiB0eXBlZGVmIHN0cnVjdAogewotI2lmZGVmIEJVSUxEX0ZMT0FUCiAgICAgQmlxdWFkXzJJX09yZGVyMV9GTE9BVF9UYXBzX3QgVHJlYmxlQm9vc3RfVGFwczsgICAvKiBUcmVibGUgYm9vc3QgVGFwcyAqLwotI2Vsc2UKLSAgICBCaXF1YWRfMklfT3JkZXIxX1RhcHNfdCBUcmVibGVCb29zdF9UYXBzOyAgIC8qIFRyZWJsZSBib29zdCBUYXBzICovCi0jZW5kaWYKIH0gTFZNX1RFX0RhdGFfdDsKIAogLyogQ29lZmZpY2llbnRzICovCiB0eXBlZGVmIHN0cnVjdAogewotI2lmZGVmIEJVSUxEX0ZMT0FUCiAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgVHJlYmxlQm9vc3RfU3RhdGU7ICAvKiBTdGF0ZSBmb3IgdGhlIHRyZWJsZSBib29zdCBmaWx0ZXIgKi8KLSNlbHNlCi0gICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgVHJlYmxlQm9vc3RfU3RhdGU7ICAvKiBTdGF0ZSBmb3IgdGhlIHRyZWJsZSBib29zdCBmaWx0ZXIgKi8KLSNlbmRpZgogfSBMVk1fVEVfQ29lZnNfdDsKIAogdHlwZWRlZiBzdHJ1Y3QKQEAgLTIwNCwyNCArMTc5LDE1IEBACiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgSW50ZXJuYWxCbG9ja1NpemU7ICAvKiBNYXhpbXVtIGludGVybmFsIGJsb2NrIHNpemUgKi8KICAgICBMVk1fQnVmZmVyX3QgICAgICAgICAgICAqcEJ1ZmZlck1hbmFnZW1lbnQ7IC8qIEJ1ZmZlciBtYW5hZ2VtZW50IHZhcmlhYmxlcyAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFNhbXBsZXNUb1Byb2Nlc3M7ICAgLyogSW5wdXQgc2FtcGxlcyBsZWZ0IHRvIHByb2Nlc3MgKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAogICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwSW5wdXRTYW1wbGVzOyAgICAgLyogRXh0ZXJuYWwgaW5wdXQgc2FtcGxlIHBvaW50ZXIgKi8KICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcE91dHB1dFNhbXBsZXM7ICAgIC8qIEV4dGVybmFsIG91dHB1dCBzYW1wbGUgcG9pbnRlciAqLwotI2Vsc2UKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcElucHV0U2FtcGxlczsgICAgIC8qIEV4dGVybmFsIGlucHV0IHNhbXBsZSBwb2ludGVyICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBPdXRwdXRTYW1wbGVzOyAgICAvKiBFeHRlcm5hbCBvdXRwdXQgc2FtcGxlIHBvaW50ZXIgKi8KLSNlbmRpZgogCiAgICAgLyogQ29uZmlndXJhdGlvbiBudW1iZXIgKi8KICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBDb25maWd1cmF0aW9uTnVtYmVyOwogICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEJsaWNrU2l6ZU11bHRpcGxlOwogCiAgICAgLyogREMgcmVtb3ZhbCAqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCiAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgRENfUmVtb3ZhbEluc3RhbmNlOyAvKiBEQyByZW1vdmFsIGZpbHRlciBpbnN0YW5jZSAqLwotI2Vsc2UKLSAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBEQ19SZW1vdmFsSW5zdGFuY2U7IC8qIERDIHJlbW92YWwgZmlsdGVyIGluc3RhbmNlICovCi0jZW5kaWYKIAogICAgIC8qIENvbmNlcnQgU291bmQgKi8KICAgICBMVkNTX0hhbmRsZV90ICAgICAgICAgICBoQ1NJbnN0YW5jZTsgICAgICAgIC8qIENvbmNlcnQgU291bmQgaW5zdGFuY2UgaGFuZGxlICovCkBAIC0yNDEsMTYgKzIwNyw4IEBACiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgREJFX0FjdGl2ZTsgICAgICAgICAvKiBDb250cm9sIGZsYWcgKi8KIAogICAgIC8qIFZvbHVtZSBDb250cm9sICovCi0jaWZkZWYgQlVJTERfRkxPQVQKICAgICBMVk1peGVyM18xU3RfRkxPQVRfc3QgICBWQ19Wb2x1bWU7ICAgICAgICAgIC8qIFZvbHVtZSBzY2FsZXIgKi8KLSNlbHNlCi0gICAgTFZNaXhlcjNfMVN0X3N0ICAgICAgICAgVkNfVm9sdW1lOyAgICAgICAgICAvKiBWb2x1bWUgc2NhbGVyICovCi0jZW5kaWYKLSNpZmRlZiBCVUlMRF9GTE9BVAogICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgICAgIFZDX0JhbGFuY2VNaXg7ICAgICAgLyogVkMgYmFsYW5jZSBtaXhlciAqLwotI2Vsc2UKLSAgICBMVk1peGVyM18yU3Rfc3QgICAgICAgICBWQ19CYWxhbmNlTWl4OyAgICAgIC8qIFZDIGJhbGFuY2UgbWl4ZXIgKi8KLSNlbmRpZgogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFZDX1ZvbHVtZWRCOyAgICAgICAgLyogR2FpbiBpbiBkQiAqLwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIFZDX0FjdGl2ZTsgICAgICAgICAgLyogQ29udHJvbCBmbGFnICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVkNfQVZMRml4ZWRWb2x1bWU7ICAvKiBBVkwgZml4ZWQgdm9sdW1lICovCkBAIC0yNzQsMTYgKzIzMiwxNiBAQAogICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgIFBTQV9Db250cm9sUGFyYW1zOyAgLyogU3BlY3RydW0gQW5hbHl6ZXIgY29udHJvbCBwYXJhbWV0ZXJzICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgUFNBX0dhaW5PZmZzZXQ7ICAgICAvKiBUb25lIGNvbnRyb2wgZmxhZyAqLwogICAgIExWTV9DYWxsYmFjayAgICAgICAgICAgIENhbGxCYWNrOwotI2lmZGVmIEJVSUxEX0ZMT0FUCiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBQU0FJbnB1dDsgICAgICAgICAvKiBQU0EgaW5wdXQgcG9pbnRlciAqLwotI2Vsc2UKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcFBTQUlucHV0OyAgICAgICAgIC8qIFBTQSBpbnB1dCBwb2ludGVyICovCi0jZW5kaWYKIAogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgTm9TbW9vdGhWb2x1bWU7ICAgICAgLyogRW5hYmxlIG9yIGRpc2FibGUgc21vb3RoIHZvbHVtZSBjaGFuZ2VzKi8KIAotfSBMVk1fSW5zdGFuY2VfdDsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICBOckNoYW5uZWxzOworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgQ2hNYXNrOworI2VuZGlmCiAKK30gTFZNX0luc3RhbmNlX3Q7CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzA1LDM2ICsyNjMsMTggQEAKIAogdm9pZCAgICBMVk1fU2V0SGVhZHJvb20oICAgIExWTV9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fQ29udHJvbFBhcmFtc190ICAgICpwUGFyYW1zKTsKLSNpZmRlZiBCVUlMRF9GTE9BVAogdm9pZCAgICBMVk1fQnVmZmVySW4oICAgTFZNX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAqKnBUb1Byb2Nlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAqKnBQcm9jZXNzZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAqcE51bVNhbXBsZXMpOwotI2Vsc2UKLXZvaWQgICAgTFZNX0J1ZmZlckluKCAgIExWTV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgKipwVG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgKipwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgKnBOdW1TYW1wbGVzKTsKLSNlbmRpZgotI2lmZGVmIEJVSUxEX0ZMT0FUCiB2b2lkICAgIExWTV9CdWZmZXJPdXQoICBMVk1fSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKnBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAqcE51bVNhbXBsZXMpOwotI2Vsc2UKLXZvaWQgICAgTFZNX0J1ZmZlck91dCggIExWTV9IYW5kbGVfdCAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICpwTnVtU2FtcGxlcyk7Ci0jZW5kaWYKIAogTFZNX0lOVDMyIExWTV9BbGdvQ2FsbEJhY2soICAgICB2b2lkICAgICAgICAgICpwQnVuZGxlSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICpwRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBjYWxsYmFja0lkKTsKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQogI2VuZGlmICAgICAgLyogX19MVk1fUFJJVkFURV9IX18gKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMTlhMTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuYworKysgL2Rldi9udWxsCkBAIC0xLDUwMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJMVk1fUHJpdmF0ZS5oIgotI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKLSNpbmNsdWRlICJMVk1fQ29lZmZzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZNX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHJvY2VzcyBmdW5jdGlvbiBmb3IgdGhlIExpZmVWaWJlcyBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwSW5EYXRhICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBPdXREYXRhICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBBdWRpb1RpbWUgICAgICAgICAgICAgICBBdWRpbyBUaW1lIG9mIHRoZSBjdXJyZW50IGlucHV0IGJ1ZmZlciBpbiBtcyAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVk1fU1VDQ0VTUyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWTV9JTlZBTElETlVNU0FNUExFUyAgV2hlbiB0aGUgTnVtU2FtcGxlcyBpcyBub3QgYSB2YWxpZWQgbXVsdGlwbGUgaW4gdW5tYW5hZ2VkICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVk1fQUxJR05NRU5URVJST1IgICAgIFdoZW4gZWl0aGVyIHRoZSBpbnB1dCBvdXIgb3V0cHV0IGJ1ZmZlcnMgYXJlIG5vdCAzMi1iaXQgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgYWxpZ25lZCBpbiB1bm1hbmFnZWQgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZNX05VTExBRERSRVNTICAgICAgICBXaGVuIG9uZSBvZiBoSW5zdGFuY2UsIHBJbkRhdGEgb3IgcE91dERhdGEgaXMgTlVMTCAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi1MVk1fUmV0dXJuU3RhdHVzX2VuIExWTV9Qcm9jZXNzKExWTV9IYW5kbGVfdCAgICAgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpCi17Ci0KLSAgICBMVk1fSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UgID0gKExWTV9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgIFNhbXBsZUNvdW50ID0gTnVtU2FtcGxlczsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICpwSW5wdXQgICAgID0gKExWTV9GTE9BVCAqKXBJbkRhdGE7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFRvUHJvY2VzcyA9IChMVk1fRkxPQVQgKilwSW5EYXRhOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBQcm9jZXNzZWQgPSBwT3V0RGF0YTsKLSAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICBTdGF0dXM7Ci0KLSAgICAvKgotICAgICAqIENoZWNrIGlmIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyB6ZXJvCi0gICAgICovCi0gICAgaWYgKE51bVNhbXBsZXMgPT0gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVk1fU1VDQ0VTUyk7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIENoZWNrIHZhbGlkIHBvaW50cyBoYXZlIGJlZW4gZ2l2ZW4KLSAgICAgKi8KLSAgICBpZiAoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBJbkRhdGEgPT0gTFZNX05VTEwpIHx8IChwT3V0RGF0YSA9PSBMVk1fTlVMTCkpCi0gICAgewotICAgICAgICByZXR1cm4gKExWTV9OVUxMQUREUkVTUyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBGb3IgdW5tYW5hZ2VkIG1vZGUgb25seQotICAgICAqLwotICAgIGlmKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5CdWZmZXJNb2RlID09IExWTV9VTk1BTkFHRURfQlVGRkVSUykKLSAgICB7Ci0gICAgICAgICAvKgotICAgICAgICAgKiBDaGVjayBpZiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgYSBnb29kIG11bHRpcGxlICh1bm1hbmFnZWQgbW9kZSBvbmx5KQotICAgICAgICAgKi8KLSAgICAgICAgaWYoKE51bVNhbXBsZXMgJSBwSW5zdGFuY2UtPkJsaWNrU2l6ZU11bHRpcGxlKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4oTFZNX0lOVkFMSUROVU1TQU1QTEVTKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENoZWNrIHRoZSBidWZmZXIgYWxpZ25tZW50Ci0gICAgICAgICAqLwotICAgICAgICBpZigoKCh1aW50cHRyX3QpcEluRGF0YSAlIDQpICE9IDApIHx8ICgoKHVpbnRwdHJfdClwT3V0RGF0YSAlIDQpICE9IDApKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4oTFZNX0FMSUdOTUVOVEVSUk9SKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBVcGRhdGUgbmV3IHBhcmFtZXRlcnMgaWYgbmVjZXNzYXJ5Ci0gICAgICovCi0gICAgaWYgKHBJbnN0YW5jZS0+Q29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCi0gICAgewotICAgICAgICBTdGF0dXMgPSBMVk1fQXBwbHlOZXdTZXR0aW5ncyhoSW5zdGFuY2UpOwotCi0gICAgICAgIGlmKFN0YXR1cyAhPSBMVk1fU1VDQ0VTUykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFN0YXR1czsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBDb252ZXJ0IGZyb20gTW9ubyBpZiBuZWNlc3NhcnkKLSAgICAgKi8KLSAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKQotICAgIHsKLSAgICAgICAgTW9ub1RvMklfRmxvYXQocEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCi0gICAgICAgIHBJbnB1dCAgICAgPSBwT3V0RGF0YTsKLSAgICAgICAgcFRvUHJvY2VzcyA9IHBPdXREYXRhOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBQcm9jZXNzIHRoZSBkYXRhIHdpdGggbWFuYWdlZCBidWZmZXJzCi0gICAgICovCi0gICAgd2hpbGUgKFNhbXBsZUNvdW50ICE9IDApCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBNYW5hZ2UgdGhlIGlucHV0IGJ1ZmZlciBhbmQgZnJhbWUgcHJvY2Vzc2luZwotICAgICAgICAgKi8KLSAgICAgICAgTFZNX0J1ZmZlckluKGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgIHBJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICZwVG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgJnBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAmU2FtcGxlQ291bnQpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIE9ubHkgcHJvY2VzcyBkYXRhIHdoZW4gU2FtcGxlQ291bnQgaXMgbm9uZSB6ZXJvLCBhIHplcm8gY291bnQgY2FuIG9jY3VyIHdoZW4KLSAgICAgICAgICogdGhlIEJ1ZmZlckluIHJvdXRpbmUgaXMgd29ya2luZyBpbiBtYW5hZ2VkIG1vZGUuCi0gICAgICAgICAqLwotICAgICAgICBpZiAoU2FtcGxlQ291bnQgIT0gMCkKLSAgICAgICAgewotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQXBwbHkgQ29uY2VydFNvdW5kIGlmIHJlcXVpcmVkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPkNTX0FjdGl2ZSA9PSBMVk1fVFJVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAodm9pZClMVkNTX1Byb2Nlc3MocEluc3RhbmNlLT5oQ1NJbnN0YW5jZSwgICAgIC8qIENvbmNlcnQgU291bmQgaW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKLSAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEFwcGx5IHZvbHVtZSBpZiByZXF1aXJlZAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocEluc3RhbmNlLT5WQ19BY3RpdmUhPTApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgICAgIC8qIExlZnQgYW5kIHJpZ2h0Ki8KLSAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIENhbGwgTi1CYW5kIGVxdWFsaXNlciBpZiBlbmFibGVkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPkVRTkJfQWN0aXZlID09IExWTV9UUlVFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExWRVFOQl9Qcm9jZXNzKHBJbnN0YW5jZS0+aEVRTkJJbnN0YW5jZSwgICAgLyogTi1CYW5kIGVxdWFsaXNlciBpbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOwotICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQ2FsbCBiYXNzIGVuaGFuY2VtZW50IGlmIGVuYWJsZWQKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+REJFX0FjdGl2ZSA9PSBMVk1fVFJVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMVkRCRV9Qcm9jZXNzKHBJbnN0YW5jZS0+aERCRUluc3RhbmNlLCAgICAgICAvKiBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7Ci0gICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBCeXBhc3MgbW9kZSBvciBldmVyeXRoaW5nIG9mZiwgc28gY29weSB0aGUgaW5wdXQgdG8gdGhlIG91dHB1dAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocFRvUHJvY2VzcyAhPSBwUHJvY2Vzc2VkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvcHlfRmxvYXQocFRvUHJvY2VzcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEFwcGx5IHRyZWJsZSBib29zdCBpZiByZXF1aXJlZAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocEluc3RhbmNlLT5URV9BY3RpdmUgPT0gTFZNX1RSVUUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgZmlsdGVyCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5wVEVfU3RhdGUtPlRyZWJsZUJvb3N0X1N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KVNhbXBsZUNvdW50KTsKLQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVm9sdW1lIGJhbGFuY2UKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfQmFsYW5jZU1peCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogUGVyZm9ybSBQYXJhbWV0cmljIFNwZWN0dW0gQW5hbHlzaXMKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5QU0FfRW5hYmxlID09IExWTV9QU0FfT04pICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkluc3RQYXJhbXMuUFNBX0luY2x1ZGVkID09IExWTV9QU0FfT04pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcm9tMmlUb01vbm9fRmxvYXQocFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoU2FtcGxlQ291bnQpKTsKLQotICAgICAgICAgICAgICAgICAgICBMVlBTQV9Qcm9jZXNzKHBJbnN0YW5jZS0+aFBTQUluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShTYW1wbGVDb3VudCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lKTsKLSAgICAgICAgICAgIH0KLQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogREMgcmVtb3ZhbAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBEQ18ySV9EMTZfVFJDX1dSQV8wMSgmcEluc3RhbmNlLT5EQ19SZW1vdmFsSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpU2FtcGxlQ291bnQpOwotCi0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIE1hbmFnZSB0aGUgb3V0cHV0IGJ1ZmZlcgotICAgICAgICAgKi8KLSAgICAgICAgTFZNX0J1ZmZlck91dChoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgJlNhbXBsZUNvdW50KTsKLQotICAgIH0KLQotICAgIHJldHVybihMVk1fU1VDQ0VTUyk7Ci19Ci0jZWxzZQotTFZNX1JldHVyblN0YXR1c19lbiBMVk1fUHJvY2VzcyhMVk1fSGFuZGxlX3QgICAgICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lKQotewotCi0gICAgTFZNX0luc3RhbmNlX3QgICAgICAqcEluc3RhbmNlICA9IChMVk1fSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICBTYW1wbGVDb3VudCA9IE51bVNhbXBsZXM7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAqcElucHV0ICAgICA9IChMVk1fSU5UMTYgKilwSW5EYXRhOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBUb1Byb2Nlc3MgPSAoTFZNX0lOVDE2ICopcEluRGF0YTsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICpwUHJvY2Vzc2VkID0gcE91dERhdGE7Ci0gICAgTFZNX1JldHVyblN0YXR1c19lbiAgU3RhdHVzOwotCi0gICAgLyoKLSAgICAgKiBDaGVjayBpZiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgemVybwotICAgICAqLwotICAgIGlmIChOdW1TYW1wbGVzID09IDApCi0gICAgewotICAgICAgICByZXR1cm4oTFZNX1NVQ0NFU1MpOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBDaGVjayB2YWxpZCBwb2ludHMgaGF2ZSBiZWVuIGdpdmVuCi0gICAgICovCi0gICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5EYXRhID09IExWTV9OVUxMKSB8fCAocE91dERhdGEgPT0gTFZNX05VTEwpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChMVk1fTlVMTEFERFJFU1MpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogRm9yIHVubWFuYWdlZCBtb2RlIG9ubHkKLSAgICAgKi8KLSAgICBpZihwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fVU5NQU5BR0VEX0JVRkZFUlMpCi0gICAgewotICAgICAgICAgLyoKLSAgICAgICAgICogQ2hlY2sgaWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIGEgZ29vZCBtdWx0aXBsZSAodW5tYW5hZ2VkIG1vZGUgb25seSkKLSAgICAgICAgICovCi0gICAgICAgIGlmKChOdW1TYW1wbGVzICUgcEluc3RhbmNlLT5CbGlja1NpemVNdWx0aXBsZSkgIT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuKExWTV9JTlZBTElETlVNU0FNUExFUyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBDaGVjayB0aGUgYnVmZmVyIGFsaWdubWVudAotICAgICAgICAgKi8KLSAgICAgICAgaWYoKCgodWludHB0cl90KXBJbkRhdGEgJSA0KSAhPSAwKSB8fCAoKCh1aW50cHRyX3QpcE91dERhdGEgJSA0KSAhPSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuKExWTV9BTElHTk1FTlRFUlJPUik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogVXBkYXRlIG5ldyBwYXJhbWV0ZXJzIGlmIG5lY2Vzc2FyeQotICAgICAqLwotICAgIGlmIChwSW5zdGFuY2UtPkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKQotICAgIHsKLSAgICAgICAgU3RhdHVzID0gTFZNX0FwcGx5TmV3U2V0dGluZ3MoaEluc3RhbmNlKTsKLQotICAgICAgICBpZihTdGF0dXMgIT0gTFZNX1NVQ0NFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBTdGF0dXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogQ29udmVydCBmcm9tIE1vbm8gaWYgbmVjZXNzYXJ5Ci0gICAgICovCi0gICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTU9OTykKLSAgICB7Ci0gICAgICAgIE1vbm9UbzJJXzE2KHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgaW5wdXQgc2FtcGxlcyAqLwotICAgICAgICBwSW5wdXQgICAgID0gcE91dERhdGE7Ci0gICAgICAgIHBUb1Byb2Nlc3MgPSBwT3V0RGF0YTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogUHJvY2VzcyB0aGUgZGF0YSB3aXRoIG1hbmFnZWQgYnVmZmVycwotICAgICAqLwotICAgIHdoaWxlIChTYW1wbGVDb3VudCAhPSAwKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogTWFuYWdlIHRoZSBpbnB1dCBidWZmZXIgYW5kIGZyYW1lIHByb2Nlc3NpbmcKLSAgICAgICAgICovCi0gICAgICAgIExWTV9CdWZmZXJJbihoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICBwSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAmcFRvUHJvY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICZwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgJlNhbXBsZUNvdW50KTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBPbmx5IHByb2Nlc3MgZGF0YSB3aGVuIFNhbXBsZUNvdW50IGlzIG5vbmUgemVybywgYSB6ZXJvIGNvdW50IGNhbiBvY2N1ciB3aGVuCi0gICAgICAgICAqIHRoZSBCdWZmZXJJbiByb3V0aW5lIGlzIHdvcmtpbmcgaW4gbWFuYWdlZCBtb2RlLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKFNhbXBsZUNvdW50ICE9IDApCi0gICAgICAgIHsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEFwcGx5IENvbmNlcnRTb3VuZCBpZiByZXF1aXJlZAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocEluc3RhbmNlLT5DU19BY3RpdmUgPT0gTFZNX1RSVUUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpTFZDU19Qcm9jZXNzKHBJbnN0YW5jZS0+aENTSW5zdGFuY2UsICAgICAgICAgIC8qIENvbmNlcnQgU291bmQgaW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKLSAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEFwcGx5IHZvbHVtZSBpZiByZXF1aXJlZAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocEluc3RhbmNlLT5WQ19BY3RpdmUhPTApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKlNhbXBsZUNvdW50KSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCovCi0gICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDYWxsIE4tQmFuZCBlcXVhbGlzZXIgaWYgZW5hYmxlZAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocEluc3RhbmNlLT5FUU5CX0FjdGl2ZSA9PSBMVk1fVFJVRSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMVkVRTkJfUHJvY2VzcyhwSW5zdGFuY2UtPmhFUU5CSW5zdGFuY2UsICAgICAgICAvKiBOLUJhbmQgZXF1YWxpc2VyIGluc3RhbmNlIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7Ci0gICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDYWxsIGJhc3MgZW5oYW5jZW1lbnQgaWYgZW5hYmxlZAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAocEluc3RhbmNlLT5EQkVfQWN0aXZlID09IExWTV9UUlVFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExWREJFX1Byb2Nlc3MocEluc3RhbmNlLT5oREJFSW5zdGFuY2UsICAgICAgICAgIC8qIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCBpbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQpOwotICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQnlwYXNzIG1vZGUgb3IgZXZlcnl0aGluZyBvZmYsIHNvIGNvcHkgdGhlIGlucHV0IHRvIHRoZSBvdXRwdXQKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHBUb1Byb2Nlc3MgIT0gcFByb2Nlc3NlZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb3B5XzE2KHBUb1Byb2Nlc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipTYW1wbGVDb3VudCkpOyAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCi0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBBcHBseSB0cmVibGUgYm9vc3QgaWYgcmVxdWlyZWQKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+VEVfQWN0aXZlID09IExWTV9UUlVFKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogQXBwbHkgdGhlIGZpbHRlcgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cFRFX1N0YXRlLT5UcmVibGVCb29zdF9TdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilTYW1wbGVDb3VudCk7Ci0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFZvbHVtZSBiYWxhbmNlCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPlZDX0JhbGFuY2VNaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFBlcmZvcm0gUGFyYW1ldHJpYyBTcGVjdHVtIEFuYWx5c2lzCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuUFNBX0VuYWJsZSA9PSBMVk1fUFNBX09OKSYmKHBJbnN0YW5jZS0+SW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQ9PUxWTV9QU0FfT04pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBGcm9tMmlUb01vbm9fMTYocFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikgKFNhbXBsZUNvdW50KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTFZQU0FfUHJvY2VzcyhwSW5zdGFuY2UtPmhQU0FJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikgKFNhbXBsZUNvdW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpOwotICAgICAgICAgICAgfQotCi0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBEQyByZW1vdmFsCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIERDXzJJX0QxNl9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPkRDX1JlbW92YWxJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilTYW1wbGVDb3VudCk7Ci0KLQotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogTWFuYWdlIHRoZSBvdXRwdXQgYnVmZmVyCi0gICAgICAgICAqLwotICAgICAgICBMVk1fQnVmZmVyT3V0KGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAmU2FtcGxlQ291bnQpOwotCi0gICAgfQotCi0gICAgcmV0dXJuKExWTV9TVUNDRVNTKTsKLX0KLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9Qcm9jZXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzg2Y2ZkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1Byb2Nlc3MuY3BwCkBAIC0wLDAgKzEsMzI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisjaW5jbHVkZSAiTFZNX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiTFZNX0NvZWZmcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWTV9Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFByb2Nlc3MgZnVuY3Rpb24gZm9yIHRoZSBMaWZlVmliZXMgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluRGF0YSAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwT3V0RGF0YSAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQXVkaW9UaW1lICAgICAgICAgICAgICAgQXVkaW8gVGltZSBvZiB0aGUgY3VycmVudCBpbnB1dCBidWZmZXIgaW4gbXMgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1NVQ0NFU1MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fSU5WQUxJRE5VTVNBTVBMRVMgIFdoZW4gdGhlIE51bVNhbXBsZXMgaXMgbm90IGEgdmFsaWVkIG11bHRpcGxlIGluIHVubWFuYWdlZCAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX0FMSUdOTUVOVEVSUk9SICAgICBXaGVuIGVpdGhlciB0aGUgaW5wdXQgb3VyIG91dHB1dCBidWZmZXJzIGFyZSBub3QgMzItYml0ICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduZWQgaW4gdW5tYW5hZ2VkIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWTV9OVUxMQUREUkVTUyAgICAgICAgV2hlbiBvbmUgb2YgaEluc3RhbmNlLCBwSW5EYXRhIG9yIHBPdXREYXRhIGlzIE5VTEwgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWTV9SZXR1cm5TdGF0dXNfZW4gTFZNX1Byb2Nlc3MoTFZNX0hhbmRsZV90ICAgICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEF1ZGlvVGltZSkKK3sKKworICAgIExWTV9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSAgPSAoTFZNX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWTV9VSU5UMTYgICAgICAgICAgU2FtcGxlQ291bnQgPSBOdW1TYW1wbGVzOworICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBJbnB1dCAgICAgPSAoTFZNX0ZMT0FUICopcEluRGF0YTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICpwVG9Qcm9jZXNzID0gKExWTV9GTE9BVCAqKXBJbkRhdGE7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFByb2Nlc3NlZCA9IHBPdXREYXRhOworICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gIFN0YXR1czsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX0lOVDMyICAgICAgICAgICBOckNoYW5uZWxzICA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIENoTWFzayAgICAgID0gcEluc3RhbmNlLT5DaE1hc2s7CisjZGVmaW5lIE5yRnJhbWVzIFNhbXBsZUNvdW50ICAvLyBhbGlhcyBmb3IgY2xhcml0eQorI2VuZGlmCisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyB6ZXJvCisgICAgICovCisgICAgaWYgKE51bVNhbXBsZXMgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybihMVk1fU1VDQ0VTUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayB2YWxpZCBwb2ludHMgaGF2ZSBiZWVuIGdpdmVuCisgICAgICovCisgICAgaWYgKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5EYXRhID09IExWTV9OVUxMKSB8fCAocE91dERhdGEgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIChMVk1fTlVMTEFERFJFU1MpOworICAgIH0KKworICAgIC8qCisgICAgICogRm9yIHVubWFuYWdlZCBtb2RlIG9ubHkKKyAgICAgKi8KKyAgICBpZihwSW5zdGFuY2UtPkluc3RQYXJhbXMuQnVmZmVyTW9kZSA9PSBMVk1fVU5NQU5BR0VEX0JVRkZFUlMpCisgICAgeworICAgICAgICAgLyoKKyAgICAgICAgICogQ2hlY2sgaWYgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIGEgZ29vZCBtdWx0aXBsZSAodW5tYW5hZ2VkIG1vZGUgb25seSkKKyAgICAgICAgICovCisgICAgICAgIGlmKChOdW1TYW1wbGVzICUgcEluc3RhbmNlLT5CbGlja1NpemVNdWx0aXBsZSkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKExWTV9JTlZBTElETlVNU0FNUExFUyk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBDaGVjayB0aGUgYnVmZmVyIGFsaWdubWVudAorICAgICAgICAgKi8KKyAgICAgICAgaWYoKCgodWludHB0cl90KXBJbkRhdGEgJSA0KSAhPSAwKSB8fCAoKCh1aW50cHRyX3QpcE91dERhdGEgJSA0KSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuKExWTV9BTElHTk1FTlRFUlJPUik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSBuZXcgcGFyYW1ldGVycyBpZiBuZWNlc3NhcnkKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5Db250cm9sUGVuZGluZyA9PSBMVk1fVFJVRSkKKyAgICB7CisgICAgICAgIFN0YXR1cyA9IExWTV9BcHBseU5ld1NldHRpbmdzKGhJbnN0YW5jZSk7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAvKiBVcGRhdGUgdGhlIGxvY2FsIHZhcmlhYmxlIE5yQ2hhbm5lbHMgZnJvbSBwSW5zdGFuY2UtPk5yQ2hhbm5lbHMgdmFsdWUgKi8KKyAgICAgICAgTnJDaGFubmVscyA9IHBJbnN0YW5jZS0+TnJDaGFubmVsczsKKyAgICAgICAgQ2hNYXNrICAgICA9IHBJbnN0YW5jZS0+Q2hNYXNrOworI2VuZGlmCisKKyAgICAgICAgaWYoU3RhdHVzICE9IExWTV9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gU3RhdHVzOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDb252ZXJ0IGZyb20gTW9ubyBpZiBuZWNlc3NhcnkKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKQorICAgIHsKKyAgICAgICAgTW9ub1RvMklfRmxvYXQocEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBpbnB1dCBzYW1wbGVzICovCisgICAgICAgIHBJbnB1dCAgICAgPSBwT3V0RGF0YTsKKyAgICAgICAgcFRvUHJvY2VzcyA9IHBPdXREYXRhOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgTnJDaGFubmVscyA9IDI7CisgICAgICAgIENoTWFzayAgICAgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisjZW5kaWYKKyAgICB9CisKKyAgICAvKgorICAgICAqIFByb2Nlc3MgdGhlIGRhdGEgd2l0aCBtYW5hZ2VkIGJ1ZmZlcnMKKyAgICAgKi8KKyAgICB3aGlsZSAoU2FtcGxlQ291bnQgIT0gMCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIE1hbmFnZSB0aGUgaW5wdXQgYnVmZmVyIGFuZCBmcmFtZSBwcm9jZXNzaW5nCisgICAgICAgICAqLworICAgICAgICBMVk1fQnVmZmVySW4oaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgcElucHV0LAorICAgICAgICAgICAgICAgICAgICAgJnBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAmcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICZTYW1wbGVDb3VudCk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogT25seSBwcm9jZXNzIGRhdGEgd2hlbiBTYW1wbGVDb3VudCBpcyBub25lIHplcm8sIGEgemVybyBjb3VudCBjYW4gb2NjdXIgd2hlbgorICAgICAgICAgKiB0aGUgQnVmZmVySW4gcm91dGluZSBpcyB3b3JraW5nIGluIG1hbmFnZWQgbW9kZS4KKyAgICAgICAgICovCisgICAgICAgIGlmIChTYW1wbGVDb3VudCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgQ29uY2VydFNvdW5kIGlmIHJlcXVpcmVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPkNTX0FjdGl2ZSA9PSBMVk1fVFJVRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAodm9pZClMVkNTX1Byb2Nlc3MocEluc3RhbmNlLT5oQ1NJbnN0YW5jZSwgICAgIC8qIENvbmNlcnQgU291bmQgaW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IHZvbHVtZSBpZiByZXF1aXJlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5WQ19BY3RpdmUhPTApCisgICAgICAgICAgICB7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckZyYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+VkNfVm9sdW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRvUHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogU2FtcGxlQ291bnQpKTsgICAgIC8qIExlZnQgYW5kIHJpZ2h0Ki8KKyNlbmRpZgorICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MgPSBwUHJvY2Vzc2VkOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQ2FsbCBOLUJhbmQgZXF1YWxpc2VyIGlmIGVuYWJsZWQKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+RVFOQl9BY3RpdmUgPT0gTFZNX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTFZFUU5CX1Byb2Nlc3MocEluc3RhbmNlLT5oRVFOQkluc3RhbmNlLCAgICAvKiBOLUJhbmQgZXF1YWxpc2VyIGluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUb1Byb2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisgICAgICAgICAgICAgICAgcFRvUHJvY2VzcyA9IHBQcm9jZXNzZWQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBDYWxsIGJhc3MgZW5oYW5jZW1lbnQgaWYgZW5hYmxlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5EQkVfQWN0aXZlID09IExWTV9UUlVFKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExWREJFX1Byb2Nlc3MocEluc3RhbmNlLT5oREJFSW5zdGFuY2UsICAgICAgIC8qIER5bmFtaWMgQmFzcyBFbmhhbmNlbWVudCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZUNvdW50KTsKKyAgICAgICAgICAgICAgICBwVG9Qcm9jZXNzID0gcFByb2Nlc3NlZDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEJ5cGFzcyBtb2RlIG9yIGV2ZXJ5dGhpbmcgb2ZmLCBzbyBjb3B5IHRoZSBpbnB1dCB0byB0aGUgb3V0cHV0CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmIChwVG9Qcm9jZXNzICE9IHBQcm9jZXNzZWQpCisgICAgICAgICAgICB7CisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgICAgIENvcHlfRmxvYXQocFRvUHJvY2VzcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckNoYW5uZWxzICogTnJGcmFtZXMpKTsgICAgLyogQ29weSBhbGwgc2FtcGxlcyAqLworI2Vsc2UKKyAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBUb1Byb2Nlc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIFNhbXBsZUNvdW50KSk7ICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisjZW5kaWYKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIEFwcGx5IHRyZWJsZSBib29zdCBpZiByZXF1aXJlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5URV9BY3RpdmUgPT0gTFZNX1RSVUUpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBBcHBseSB0aGUgZmlsdGVyCisgICAgICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgICAgIEZPX01jX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+cFRFX1N0YXRlLT5UcmVibGVCb29zdF9TdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yQ2hhbm5lbHMpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKCZwSW5zdGFuY2UtPnBURV9TdGF0ZS0+VHJlYmxlQm9vc3RfU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpU2FtcGxlQ291bnQpOworI2VuZGlmCisKKyAgICAgICAgICAgIH0KKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVm9sdW1lIGJhbGFuY2UKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgTFZDX01peFNvZnRfMVN0X01DX2Zsb2F0X1NBVCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaE1hc2spOworI2Vsc2UKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBWb2x1bWUgYmFsYW5jZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5WQ19CYWxhbmNlTWl4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVDb3VudCk7CisjZW5kaWYKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFBlcmZvcm0gUGFyYW1ldHJpYyBTcGVjdHVtIEFuYWx5c2lzCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuUFNBX0VuYWJsZSA9PSBMVk1fUFNBX09OKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5JbnN0UGFyYW1zLlBTQV9JbmNsdWRlZCA9PSBMVk1fUFNBX09OKSkKKyAgICAgICAgICAgIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAgICAgRnJvbU1jVG9Nb25vX0Zsb2F0KHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cFBTQUlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOckZyYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2Vsc2UKKyAgICAgICAgICAgICAgICBGcm9tMmlUb01vbm9fRmxvYXQocFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wUFNBSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKFNhbXBsZUNvdW50KSk7CisjZW5kaWYKKworICAgICAgICAgICAgICAgIExWUFNBX1Byb2Nlc3MocEluc3RhbmNlLT5oUFNBSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBQU0FJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShTYW1wbGVDb3VudCksCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1RpbWUpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogREMgcmVtb3ZhbAorICAgICAgICAgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICAgICAgRENfTWNfRDE2X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisjZWxzZQorICAgICAgICAgICAgRENfMklfRDE2X1RSQ19XUkFfMDEoJnBJbnN0YW5jZS0+RENfUmVtb3ZhbEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KVNhbXBsZUNvdW50KTsKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIC8qCisgICAgICAgICAqIE1hbmFnZSB0aGUgb3V0cHV0IGJ1ZmZlcgorICAgICAgICAgKi8KKyAgICAgICAgTFZNX0J1ZmZlck91dChoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgJlNhbXBsZUNvdW50KTsKKworICAgIH0KKworICAgIHJldHVybihMVk1fU1VDQ0VTUyk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5OWRkZGUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNzM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTFZNX1RhYmxlcy5oIgotI2luY2x1ZGUgIkxWTV9Db2VmZnMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUcmVibGUgQm9vc3QgRmlsdGVyIENvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKLQotRk9fRkxPQVRfTFNoeF9Db2Vmc190ICAgIExWTV9UcmVibGVCb29zdENvZWZzW10gPSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgLyogMjJrSHogc2FtcGxpbmcgcmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4yX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4yX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjNfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW41X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW41X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjZfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjZfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluN19BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluN19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW44X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW44X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjlfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjlfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTBfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTFfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xM19BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xNF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTRfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTVfQjF9LAotCi0gICAgICAgICAgICAgICAgICAgIC8qIDI0a0h6IHNhbXBsaW5nIHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjFfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4zX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4zX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjRfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluNV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW42X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW42X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjdfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjdfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluOF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluOF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW45X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW45X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTBfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjEwX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjExX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTJfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjEyX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTNfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjEzX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjE0X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMTVfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjE1X0IxfSwKLQotICAgICAgICAgICAgICAgICAgICAvKiAzMmtIeiBzYW1wbGluZyByYXRlICovCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjJfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluM19BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluM19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW40X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW40X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjVfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjVfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluNl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW43X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW43X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjhfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjhfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluOV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluOV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjEwX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xMF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjExX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjEyX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjEzX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xM19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjE0X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjE1X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xNV9CMX0sCi0KLSAgICAgICAgICAgICAgICAgICAgLyogNDRrSHogc2FtcGxpbmcgcmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMV9CMSx9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4zX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4zX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjRfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluNV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW42X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW42X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjdfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjdfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluOF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluOF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW45X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW45X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTBfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjEwX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjExX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTJfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjEyX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTNfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjEzX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjE0X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTVfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjE1X0IxfSwKLQotICAgICAgICAgICAgICAgICAgICAvKiA0OGtIeiBzYW1wbGluZyByYXRlICovCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjJfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjJfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluM19BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluM19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW40X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW40X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjVfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjVfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluNl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW43X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW43X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjhfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjhfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluOV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluOV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjEwX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xMF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjExX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjEyX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjEzX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xM19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjE0X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjE1X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xNV9CMX0KLSNpZmRlZiBISUdIRVJfRlMKLSAgICAgICAgICAgICAgICAgICAgLAotICAgICAgICAgICAgICAgICAgICAvKiA5NmtIeiBzYW1wbGluZyByYXRlICovCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjFfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjJfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjNfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluM19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjRfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluNF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjVfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluNV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjZfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluNl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjdfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluN19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjhfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluOF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjlfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluOV9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTBfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTBfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjExX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjExX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xMl9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTNfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTNfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjE0X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjE0X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xNV9CMX0sCi0KLSAgICAgICAgICAgICAgICAgICAgLyogMTkya0h6IHNhbXBsaW5nIHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4yX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4yX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4zX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4zX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW40X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW40X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW41X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW41X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW42X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW42X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW43X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW43X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW44X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW44X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW45X0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW45X0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjEwX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xMF9CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTFfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTJfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjEyX0IxfSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLwotICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjEzX0EwLAotICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xM19CMX0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xNF9BMCwKLSAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTRfQjF9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTVfQTAsCi0gICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjE1X0IxfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgIH07Ci0jZWxzZQotRk9fQzE2X0xTaHhfQ29lZnNfdCAgICBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdID0gewotCi0gICAgICAgICAgICAgICAgICAgIC8qIDIya0h6IHNhbXBsaW5nIHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjFfQjEsCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xX1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjJfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjJfQjEsCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4yX1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjNfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjNfQjEsCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4zX1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjRfQjEsCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW40X1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjVfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjVfQjEsCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW41X1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjZfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjZfQjEsCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW42X1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjdfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjdfQjEsCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW43X1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjhfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjhfQjEsCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW44X1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjlfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjlfQjEsCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW45X1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTBfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjEwX0IxLAotICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTBfU2hpZnR9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTFfQjEsCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xMV9TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjEyX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xMl9CMSwKLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjEyX1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTNfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjEzX0IxLAotICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluMTNfU2hpZnR9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xNF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluMTRfQjEsCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xNF9TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjE1X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xNV9CMSwKLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjE1X1NoaWZ0fSwKLQotICAgICAgICAgICAgICAgICAgICAvKiAyNGtIeiBzYW1wbGluZyByYXRlICovCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4xX0IxLAotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjFfU2hpZnR9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMl9CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4yX1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjNfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjNfQjEsCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluM19TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW40X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW40X0IxLAotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjRfU2hpZnR9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluNV9CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW41X1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjZfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjZfQjEsCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNl9TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW43X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW43X0IxLAotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjdfU2hpZnR9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluOF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluOF9CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW44X1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjlfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjlfQjEsCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluOV9TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjEwX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4xMF9CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMF9TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjExX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4xMV9CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMV9TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjEyX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4xMl9CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMl9TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjEzX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4xM19CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xM19TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjE0X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4xNF9CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xNF9TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjE1X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4xNV9CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xNV9TaGlmdH0sCi0KLSAgICAgICAgICAgICAgICAgICAgLyogMzJrSHogc2FtcGxpbmcgcmF0ZSAqLwotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMV9CMSwKLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjFfU2hpZnR9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMl9CMSwKLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjJfU2hpZnR9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluM19BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluM19CMSwKLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjNfU2hpZnR9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluNF9CMSwKLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjRfU2hpZnR9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluNV9CMSwKLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjVfU2hpZnR9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluNl9CMSwKLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjZfU2hpZnR9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluN19BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluN19CMSwKLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjdfU2hpZnR9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluOF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluOF9CMSwKLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjhfU2hpZnR9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluOV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluOV9CMSwKLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjlfU2hpZnR9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xMF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMTBfQjEsCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xMF9TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjExX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xMV9CMSwKLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjExX1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTJfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjEyX0IxLAotICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTJfU2hpZnR9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xM19BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMTNfQjEsCi0gICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4xM19TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjE0X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4xNF9CMSwKLSAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjE0X1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTVfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjE1X0IxLAotICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTVfU2hpZnR9LAotCi0gICAgICAgICAgICAgICAgICAgIC8qIDQ0a0h6IHNhbXBsaW5nIHJhdGUgKi8KLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjFfQjEsCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMV9TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4yX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4yX0IxLAotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjJfU2hpZnR9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluM19BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluM19CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4zX1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjRfQjEsCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNF9TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW41X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW41X0IxLAotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjVfU2hpZnR9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluNl9CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW42X1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjdfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjdfQjEsCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluN19TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW44X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW44X0IxLAotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjhfU2hpZnR9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluOV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluOV9CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW45X1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTBfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjEwX0IxLAotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjEwX1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTFfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjExX0IxLAotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjExX1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTJfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjEyX0IxLAotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjEyX1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTNfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjEzX0IxLAotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjEzX1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTRfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjE0X0IxLAotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjE0X1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluMTVfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjE1X0IxLAotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjE1X1NoaWZ0fSwKLQotICAgICAgICAgICAgICAgICAgICAvKiA0OGtIeiBzYW1wbGluZyByYXRlICovCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xX0IxLAotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjFfU2hpZnR9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMl9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMl9CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4yX1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjNfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjNfQjEsCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluM19TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW40X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW40X0IxLAotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjRfU2hpZnR9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNV9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluNV9CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW41X1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjZfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjZfQjEsCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNl9TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW43X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW43X0IxLAotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjdfU2hpZnR9LAotICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluOF9BMCwKLSAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluOF9CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW44X1NoaWZ0fSwKLSAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjlfQTAsCi0gICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjlfQjEsCi0gICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluOV9TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjEwX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xMF9CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xMF9TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjExX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xMV9CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xMV9TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjEyX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xMl9CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xMl9TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjEzX0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xM19CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xM19TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjE0X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xNF9CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xNF9TaGlmdH0sCi0gICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLwotICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjE1X0EwLAotICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4xNV9CMSwKLSAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4xNV9TaGlmdH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVm9sdW1lIGNvbnRyb2wgZ2FpbiBhbmQgdGltZSBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogZEIgdG8gbGluZWFyIGNvbnZlcnNpb24gdGFibGUgKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotY29uc3QgTFZNX0ZMT0FUIExWTV9Wb2x1bWVUYWJsZVtdID0gewotICAgIDEuMDAwZiwgICAgICAgICAgICAgLyogIDBkQiAqLwotICAgIDAuODkxZiwgICAgICAgICAgICAgLyogLTFkQiAqLwotICAgIDAuNzk0ZiwgICAgICAgICAgICAgLyogLTJkQiAqLwotICAgIDAuNzA4ZiwgICAgICAgICAgICAgLyogLTNkQiAqLwotICAgIDAuNjMxZiwgICAgICAgICAgICAgLyogLTRkQiAqLwotICAgIDAuNTYyZiwgICAgICAgICAgICAgLyogLTVkQiAqLwotICAgIDAuNTAxZn07ICAgICAgICAgICAgLyogLTZkQiAqLwotI2Vsc2UKLWNvbnN0IExWTV9JTlQxNiBMVk1fVm9sdW1lVGFibGVbXSA9IHsKLSAgICAweDdGRkYsICAgICAgICAgICAgIC8qICAwZEIgKi8KLSAgICAweDcyMTUsICAgICAgICAgICAgIC8qIC0xZEIgKi8KLSAgICAweDY1QUQsICAgICAgICAgICAgIC8qIC0yZEIgKi8KLSAgICAweDVBOUUsICAgICAgICAgICAgIC8qIC0zZEIgKi8KLSAgICAweDUwQzMsICAgICAgICAgICAgIC8qIC00ZEIgKi8KLSAgICAweDQ3RkIsICAgICAgICAgICAgIC8qIC01ZEIgKi8KLSAgICAweDQwMDB9OyAgICAgICAgICAgIC8qIC02ZEIgKi8KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBWb2x1bWUgbWl4ZXIgdGltZSBjb25zdGFudHMgKDEwMG1zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMVk1fTUlYX1RDX0ZzODAwMCAgICAgIDMyNTgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTQyNjI2OTUgKi8KLSNkZWZpbmUgTFZNX01JWF9UQ19GczExMDI1ICAgICAzMjYzMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk1ODQ5NjA5ICovCi0jZGVmaW5lIExWTV9NSVhfVENfRnMxMjAwMCAgICAgMzI2NDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NjE4NTMwMyAqLwotI2RlZmluZSBMVk1fTUlYX1RDX0ZzMTYwMDAgICAgIDMyNjc0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTcxMzEzNDggKi8KLSNkZWZpbmUgTFZNX01JWF9UQ19GczIyMDUwICAgICAzMjcwMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk3OTI0ODA1ICovCi0jZGVmaW5lIExWTV9NSVhfVENfRnMyNDAwMCAgICAgMzI3MDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODA3NzM5MyAqLwotI2RlZmluZSBMVk1fTUlYX1RDX0ZzMzIwMDAgICAgIDMyNzIxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg1NjU2NzQgKi8KLSNkZWZpbmUgTFZNX01JWF9UQ19GczQ0MTAwICAgICAzMjczNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4OTYyNDAyICovCi0jZGVmaW5lIExWTV9NSVhfVENfRnM0ODAwMCAgICAgMzI3MzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTA1Mzk1NSAqLwotCi0KLWNvbnN0IExWTV9JTlQxNiBMVk1fTWl4ZXJUQ1RhYmxlW10gPSB7Ci0gICAgTFZNX01JWF9UQ19GczgwMDAsCi0gICAgTFZNX01JWF9UQ19GczExMDI1LAotICAgIExWTV9NSVhfVENfRnMxMjAwMCwKLSAgICBMVk1fTUlYX1RDX0ZzMTYwMDAsCi0gICAgTFZNX01JWF9UQ19GczIyMDUwLAotICAgIExWTV9NSVhfVENfRnMyNDAwMCwKLSAgICBMVk1fTUlYX1RDX0ZzMzIwMDAsCi0gICAgTFZNX01JWF9UQ19GczQ0MTAwLAotICAgIExWTV9NSVhfVENfRnM0ODAwMH07Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYzOTJlMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuY3BwCkBAIC0wLDAgKzEsNTAxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWTV9UYWJsZXMuaCIKKyNpbmNsdWRlICJMVk1fQ29lZmZzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVHJlYmxlIEJvb3N0IEZpbHRlciBDb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitGT19GTE9BVF9MU2h4X0NvZWZzX3QgICAgTFZNX1RyZWJsZUJvb3N0Q29lZnNbXSA9IHsKKworICAgICAgICAgICAgICAgICAgICAvKiAyMmtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW40X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW40X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA2ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluNl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczIyMDUwX0dhaW43X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW43X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczIyMDUwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjIwNTBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjIwNTBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA5ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyMjA1MF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyMjA1MF9HYWluOV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjEwX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xMF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjEzX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyMjA1MF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjIwNTBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczIyMDUwX0dhaW4xNV9CMX0sCisKKyAgICAgICAgICAgICAgICAgICAgLyogMjRrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW4yX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW41X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMyNDAwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMyNDAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczI0MDAwX0dhaW44X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczI0MDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMjQwMDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMjQwMDBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMjQwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczI0MDAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMyNDAwMF9HYWluMTVfQjF9LAorCisgICAgICAgICAgICAgICAgICAgIC8qIDMya0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMzIwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMzIwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMzMjAwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMzMjAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczMyMDAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczMyMDAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczMyMDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnMzMjAwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMzIwMDBfR2FpbjE1X0IxfSwKKworICAgICAgICAgICAgICAgICAgICAvKiA0NGtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4xX0IxLH0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW4yX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW41X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjdfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA3ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0NDEwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0NDEwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ0MTAwX0dhaW44X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ0MTAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDQxMDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDQxMDBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEwX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjEzX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDQxMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ0MTAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0NDEwMF9HYWluMTVfQjF9LAorCisgICAgICAgICAgICAgICAgICAgIC8qIDQ4a0h6IHNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICAgSFBGX0ZzNDgwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzNDgwMDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyA4ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluOF9BMCwKKyAgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM0ODAwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM0ODAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgIEhQRl9GczQ4MDAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAgLUhQRl9GczQ4MDAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDExICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTFfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE0ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTRfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczQ4MDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgICBIUEZfRnM0ODAwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzNDgwMDBfR2FpbjE1X0IxfQorICAgICAgICAgICAgICAgICAgICAsCisgICAgICAgICAgICAgICAgICAgIC8qIDg4a0h6IFNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAyICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4yX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluM19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA1ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW41X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjZfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluNl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA4ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW44X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjlfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgOSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluOV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDExICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjEyX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczg4MjAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM4ODIwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM4ODIwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzODgyMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDE0ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczg4MjAwX0dhaW4xNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczg4MjAwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM4ODIwMF9HYWluMTVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzODgyMDBfR2FpbjE1X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzODgyMDBfR2FpbjE1X0IxfSwKKworICAgICAgICAgICAgICAgICAgICAvKiA5NmtIeiBzYW1wbGluZyByYXRlICovCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluM19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluNV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluNl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluNl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDcgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluOF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDggKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluOF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluOV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluOV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjExX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTEgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjExX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xMl9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEyICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xMl9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnM5NjAwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnM5NjAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnM5NjAwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzOTYwMDBfR2FpbjE0X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTQgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzOTYwMDBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzOTYwMDBfR2FpbjE0X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9Gczk2MDAwX0dhaW4xNV9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDE1ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9Gczk2MDAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9Gczk2MDAwX0dhaW4xNV9CMX0sCisKKyAgICAgICAgICAgICAgICAgICAgLyogMTc2a0h6IFNhbXBsaW5nIHJhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjJfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDMgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4zX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4zX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA0ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluNF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjVfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgNSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDYgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW42X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW42X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluN19BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICA3ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluN19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluN19CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjhfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgOCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDkgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW45X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW45X0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTBfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTAgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xMF9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTBfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xMV9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDEyICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjEyX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE3NjQwMF9HYWluMTNfQTEsICAgICAgICAgICAgIC8qIEdhaW4gU2V0dGluZyAgMTMgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTc2NDAwX0dhaW4xM19BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE3NjQwMF9HYWluMTNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTc2NDAwX0dhaW4xNF9BMSwgICAgICAgICAgICAgLyogR2FpbiBTZXR0aW5nICAxNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxNzY0MDBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTc2NDAwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxNzY0MDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIFNldHRpbmcgIDE1ICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE3NjQwMF9HYWluMTVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxNzY0MDBfR2FpbjE1X0IxfSwKKworICAgICAgICAgICAgICAgICAgICAvKiAxOTJrSHogc2FtcGxpbmcgcmF0ZSAqLworICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjFfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjFfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4yX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjJfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4zX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjNfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW40X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjRfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjRfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW41X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjVfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjVfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW42X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNiAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjZfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjZfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW43X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgNyAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjdfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjdfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW44X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjhfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjhfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW45X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgOSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjlfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjlfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xMF9BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEwICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTBfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjEwX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTFfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxMSAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjExX0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xMV9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjEyX0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTIgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xMl9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTJfQjF9LAorICAgICAgICAgICAgICAgICAgICB7SFBGX0ZzMTkyMDAwX0dhaW4xM19BMSwgICAgICAgICAgICAgLyogR2FpbiBzZXR0aW5nIDEzICovCisgICAgICAgICAgICAgICAgICAgIEhQRl9GczE5MjAwMF9HYWluMTNfQTAsCisgICAgICAgICAgICAgICAgICAgIC1IUEZfRnMxOTIwMDBfR2FpbjEzX0IxfSwKKyAgICAgICAgICAgICAgICAgICAge0hQRl9GczE5MjAwMF9HYWluMTRfQTEsICAgICAgICAgICAgIC8qIEdhaW4gc2V0dGluZyAxNCAqLworICAgICAgICAgICAgICAgICAgICBIUEZfRnMxOTIwMDBfR2FpbjE0X0EwLAorICAgICAgICAgICAgICAgICAgICAtSFBGX0ZzMTkyMDAwX0dhaW4xNF9CMX0sCisgICAgICAgICAgICAgICAgICAgIHtIUEZfRnMxOTIwMDBfR2FpbjE1X0ExLCAgICAgICAgICAgICAvKiBHYWluIHNldHRpbmcgMTUgKi8KKyAgICAgICAgICAgICAgICAgICAgSFBGX0ZzMTkyMDAwX0dhaW4xNV9BMCwKKyAgICAgICAgICAgICAgICAgICAgLUhQRl9GczE5MjAwMF9HYWluMTVfQjF9CisgICAgICAgICAgICAgICAgICAgIH07CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBWb2x1bWUgY29udHJvbCBnYWluIGFuZCB0aW1lIGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBkQiB0byBsaW5lYXIgY29udmVyc2lvbiB0YWJsZSAqLworY29uc3QgTFZNX0ZMT0FUIExWTV9Wb2x1bWVUYWJsZVtdID0geworICAgIDEuMDAwZiwgICAgICAgICAgICAgLyogIDBkQiAqLworICAgIDAuODkxZiwgICAgICAgICAgICAgLyogLTFkQiAqLworICAgIDAuNzk0ZiwgICAgICAgICAgICAgLyogLTJkQiAqLworICAgIDAuNzA4ZiwgICAgICAgICAgICAgLyogLTNkQiAqLworICAgIDAuNjMxZiwgICAgICAgICAgICAgLyogLTRkQiAqLworICAgIDAuNTYyZiwgICAgICAgICAgICAgLyogLTVkQiAqLworICAgIDAuNTAxZn07ICAgICAgICAgICAgLyogLTZkQiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBWb2x1bWUgbWl4ZXIgdGltZSBjb25zdGFudHMgKDEwMG1zKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMVk1fTUlYX1RDX0ZzODAwMCAgICAgIDMyNTgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTQyNjI2OTUgKi8KKyNkZWZpbmUgTFZNX01JWF9UQ19GczExMDI1ICAgICAzMjYzMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk1ODQ5NjA5ICovCisjZGVmaW5lIExWTV9NSVhfVENfRnMxMjAwMCAgICAgMzI2NDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NjE4NTMwMyAqLworI2RlZmluZSBMVk1fTUlYX1RDX0ZzMTYwMDAgICAgIDMyNjc0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTcxMzEzNDggKi8KKyNkZWZpbmUgTFZNX01JWF9UQ19GczIyMDUwICAgICAzMjcwMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk3OTI0ODA1ICovCisjZGVmaW5lIExWTV9NSVhfVENfRnMyNDAwMCAgICAgMzI3MDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODA3NzM5MyAqLworI2RlZmluZSBMVk1fTUlYX1RDX0ZzMzIwMDAgICAgIDMyNzIxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg1NjU2NzQgKi8KKyNkZWZpbmUgTFZNX01JWF9UQ19GczQ0MTAwICAgICAzMjczNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4OTYyNDAyICovCisjZGVmaW5lIExWTV9NSVhfVENfRnM0ODAwMCAgICAgMzI3MzcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTA1Mzk1NSAqLworCitjb25zdCBMVk1fSU5UMTYgTFZNX01peGVyVENUYWJsZVtdID0geworICAgIExWTV9NSVhfVENfRnM4MDAwLAorICAgIExWTV9NSVhfVENfRnMxMTAyNSwKKyAgICBMVk1fTUlYX1RDX0ZzMTIwMDAsCisgICAgTFZNX01JWF9UQ19GczE2MDAwLAorICAgIExWTV9NSVhfVENfRnMyMjA1MCwKKyAgICBMVk1fTUlYX1RDX0ZzMjQwMDAsCisgICAgTFZNX01JWF9UQ19GczMyMDAwLAorICAgIExWTV9NSVhfVENfRnM0NDEwMCwKKyAgICBMVk1fTUlYX1RDX0ZzNDgwMDB9OworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYy9MVk1fVGFibGVzLmgKaW5kZXggNGNmNzExOS4uZmM4MjE5NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0J1bmRsZS9zcmMvTFZNX1RhYmxlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9CdW5kbGUvc3JjL0xWTV9UYWJsZXMuaApAQCAtMTgsMTAgKzE4LDYgQEAKICNpZm5kZWYgX19MVk1fVEFCTEVTX0hfXwogI2RlZmluZSBfX0xWTV9UQUJMRVNfSF9fCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzcsMzAgKzMzLDE2IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotI2lmZGVmIEJVSUxEX0ZMT0FUCiBleHRlcm4gRk9fRkxPQVRfTFNoeF9Db2Vmc190ICAgICBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdOwotI2Vsc2UKLWV4dGVybiBGT19DMTZfTFNoeF9Db2Vmc190ICAgICBMVk1fVHJlYmxlQm9vc3RDb2Vmc1tdOwotI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgVm9sdW1lIGNvbnRyb2wgZ2FpbiBhbmQgdGltZSBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCiBleHRlcm4gY29uc3QgTFZNX0ZMT0FUIExWTV9Wb2x1bWVUYWJsZVtdOwotI2Vsc2UKLWV4dGVybiBjb25zdCBMVk1fSU5UMTYgTFZNX1ZvbHVtZVRhYmxlW107Ci0jZW5kaWYKIAogZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiBMVk1fTWl4ZXJUQ1RhYmxlW107CiAKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQogI2VuZGlmIC8qIF9fTFZNX1RBQkxFU19IX18gKi8KIAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9BR0MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCmluZGV4IDlhM2QzNWQuLmJlZjdmYTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0FHQy5oCkBAIC0xOCwxMSArMTgsNiBAQAogI2lmbmRlZiBfX0FHQ19IX18KICNkZWZpbmUgX19BR0NfSF9fCiAKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zMSwyOCArMjYsMTEgQEAKIAogI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9JTlQzMiAgQUdDX0dhaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KLSAgICBMVk1fSU5UMzIgIEFHQ19NYXhHYWluOyAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBtYXhpbXVtIEFHQyBnYWluICovCi0gICAgTFZNX0lOVDMyICBWb2x1bWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGUgY3VycmVudCB2b2x1bWUgc2V0dGluZyAqLwotICAgIExWTV9JTlQzMiAgVGFyZ2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIHRhcmdldCB2b2x1bWUgc2V0dGluZyAqLwotICAgIExWTV9JTlQzMiAgQUdDX1RhcmdldDsgICAgICAgICAgICAgICAgICAgICAgLyogQUdDIHRhcmdldCBsZXZlbCAqLwotICAgIExWTV9JTlQxNiAgQUdDX0F0dGFjazsgICAgICAgICAgICAgICAgICAgICAgLyogQUdDIGF0dGFjayBzY2FsZXIgKi8KLSAgICBMVk1fSU5UMTYgIEFHQ19EZWNheTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEFHQyBkZWNheSBzY2FsZXIgKi8KLSAgICBMVk1fSU5UMTYgIEFHQ19HYWluU2hpZnQ7ICAgICAgICAgICAgICAgICAgIC8qIFRoZSBnYWluIHNoaWZ0ICovCi0gICAgTFZNX0lOVDE2ICBWb2x1bWVTaGlmdDsgICAgICAgICAgICAgICAgICAgICAvKiBWb2x1bWUgc2hpZnQgc2NhbGluZyAqLwotICAgIExWTV9JTlQxNiAgVm9sdW1lVEM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVm9sdW1lIHVwZGF0ZSB0aW1lIGNvbnN0YW50ICovCi0KLX0gQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfdDsKLSNlbHNlCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9GTE9BVCAgQUdDX0dhaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KQEAgLTY1LDM5ICs0MywyNSBAQAogICAgIExWTV9GTE9BVCAgVm9sdW1lVEM7ICAgICAgICAgICAgICAgICAgICAgICAgLyogVm9sdW1lIHVwZGF0ZSB0aW1lIGNvbnN0YW50ICovCiAKIH0gQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90OwotI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAogdm9pZCBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90ICAqcEluc3RhbmNlLCAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBTdFNyYywgICAgICAgIC8qIFN0ZXJlbyBzb3VyY2UgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTW9ub1NyYywgICAgICAvKiBNb25vIHNvdXJjZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBEc3QsICAgICAgICAgIC8qIFN0ZXJlbyBkZXN0aW5hdGlvbiAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgbik7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCi0jZWxzZQotdm9pZCBBR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfdCAgKnBJbnN0YW5jZSwgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgICAgICAgICpwU3RTcmMsICAgICAgICAvKiBTdGVyZW8gc291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgICAqcE1vbm9TcmMsICAgICAgLyogTW9ubyBzb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICpwRHN0LCAgICAgICAgICAvKiBTdGVyZW8gZGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIG4pOyAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgQUdDX01JWF9WT0xfTWMxTW9uX0QzMl9XUkEoQUdDX01JWF9WT0xfMlN0MU1vbl9GTE9BVF90ICAqcEluc3RhbmNlLCAgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBTdFNyYywgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTW9ub1NyYywgICAgLyogTW9ubyBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICpwRHN0LCAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE5yRnJhbWVzLCAgICAgLyogTnVtYmVyIG9mIGZyYW1lcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7ICAvKiBOdW1iZXIgb2YgY2hhbm5lbHMgKi8KICNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQogCiAjZW5kaWYgIC8qIF9fQUdDX0hfXyAqLwogCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9CSVFVQUQuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCmluZGV4IDNlZTdmNjMuLmMwNTBjZDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0JJUVVBRC5oCkBAIC0xOCwzNCArMTgsMjkgQEAKICNpZm5kZWYgX0JJUVVBRF9IXwogI2RlZmluZSBfQklRVUFEX0hfCiAKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCiAjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgSU5TVEFOQ0UgTUVNT1JZIFRZUEUgREVGSU5JVElPTgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgTFZNX0ZMT0FUIFN0b3JhZ2VbNl07Ci0KLX0gQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3Q7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIC8qIFRoZSBtZW1vcnkgcmVnaW9uIGNyZWF0ZWQgYnkgdGhpcyBzdHJ1Y3R1cmUgaW5zdGFuY2UgaXMgdHlwZWNhc3QKKyAgICAgKiBpbnRvIGFub3RoZXIgc3RydWN0dXJlIGNvbnRhaW5pbmcgYSBwb2ludGVyIGFuZCBhbiBhcnJheSBvZiBmaWx0ZXIKKyAgICAgKiBjb2VmZmljaWVudHMuIEluIG9uZSBjYXNlIHRoaXMgbWVtb3J5IHJlZ2lvbiBpcyB1c2VkIGZvciBzdG9yaW5nCisgICAgICogREMgY29tcG9uZW50IG9mIGNoYW5uZWxzCisgICAgICovCisgICAgTFZNX0ZMT0FUICpwU3RvcmFnZTsKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVtMVk1fTUFYX0NIQU5ORUxTXTsKICNlbHNlCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9JTlQzMiBTdG9yYWdlWzZdOwotCi19IEJpcXVhZF9JbnN0YW5jZV90OworICAgIExWTV9GTE9BVCBTdG9yYWdlWzZdOwogI2VuZGlmCit9IEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90OwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIENPRUZGSUNJRU5UIFRZUEUgREVGSU5JVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqIEJpcXVhZCBjb2VmZmljaWVudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fRkxPQVQgIEEyOyAgIC8qICBhMiAgKi8KQEAgLTU0LDkzICs0OSwzMSBAQAogICAgIExWTV9GTE9BVCAgQjI7ICAgLyogLWIyISAqLwogICAgIExWTV9GTE9BVCAgQjE7ICAgLyogLWIxISAqLwogfSBCUV9GTE9BVF9Db2Vmc190OwotI2Vsc2UKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0lOVDE2IEEyOyAgIC8qICBhMiAgKi8KLSAgICBMVk1fSU5UMTYgQTE7ICAgLyogIGExICAqLwotICAgIExWTV9JTlQxNiBBMDsgICAvKiAgYTAgICovCi0gICAgTFZNX0lOVDE2IEIyOyAgIC8qIC1iMiEgKi8KLSAgICBMVk1fSU5UMTYgQjE7ICAgLyogLWIxISAqLwotfSBCUV9DMTZfQ29lZnNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fSU5UMzIgIEEyOyAgIC8qICBhMiAgKi8KLSAgICBMVk1fSU5UMzIgIEExOyAgIC8qICBhMSAgKi8KLSAgICBMVk1fSU5UMzIgIEEwOyAgIC8qICBhMCAgKi8KLSAgICBMVk1fSU5UMzIgIEIyOyAgIC8qIC1iMiEgKi8KLSAgICBMVk1fSU5UMzIgIEIxOyAgIC8qIC1iMSEgKi8KLX0gQlFfQzMyX0NvZWZzX3Q7Ci0jZW5kaWYKIAogLyoqKiBGaXJzdCBvcmRlciBjb2VmZmljaWVudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0ZMT0FUIEExOyAgIC8qICBhMSAgKi8KICAgICBMVk1fRkxPQVQgQTA7ICAgLyogIGEwICAqLwogICAgIExWTV9GTE9BVCBCMTsgICAvKiAtYjEhICovCiB9IEZPX0ZMT0FUX0NvZWZzX3Q7Ci0jZWxzZQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fSU5UMTYgQTE7ICAgLyogIGExICAqLwotICAgIExWTV9JTlQxNiBBMDsgICAvKiAgYTAgICovCi0gICAgTFZNX0lOVDE2IEIxOyAgIC8qIC1iMSEgKi8KLX0gRk9fQzE2X0NvZWZzX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0lOVDMyICBBMTsgICAvKiAgYTEgICovCi0gICAgTFZNX0lOVDMyICBBMDsgICAvKiAgYTAgICovCi0gICAgTFZNX0lOVDMyICBCMTsgICAvKiAtYjEhICovCi19IEZPX0MzMl9Db2Vmc190OwotI2VuZGlmCiAKIC8qKiogRmlyc3Qgb3JkZXIgY29lZmZpY2llbnRzIHdpdGggU2hpZnQqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fRkxPQVQgQTE7ICAgIC8qICBhMSAgKi8KICAgICBMVk1fRkxPQVQgQTA7ICAgIC8qICBhMCAgKi8KICAgICBMVk1fRkxPQVQgQjE7ICAgIC8qIC1iMSEgKi8KIH0gRk9fRkxPQVRfTFNoeF9Db2Vmc190OwotI2Vsc2UKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0lOVDE2IEExOyAgICAvKiAgYTEgICovCi0gICAgTFZNX0lOVDE2IEEwOyAgICAvKiAgYTAgICovCi0gICAgTFZNX0lOVDE2IEIxOyAgICAvKiAtYjEhICovCi0gICAgTFZNX0lOVDE2IFNoaWZ0OyAvKiBTaGlmdCAqLwotfSBGT19DMTZfTFNoeF9Db2Vmc190OwotI2VuZGlmCiAvKioqIEJhbmQgcGFzcyBjb2VmZmljaWVudHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fRkxPQVQgIEEwOyAgIC8qICBhMCAgKi8KICAgICBMVk1fRkxPQVQgIEIyOyAgIC8qIC1iMiEgKi8KICAgICBMVk1fRkxPQVQgIEIxOyAgIC8qIC1iMSEgKi8KIH0gQlBfRkxPQVRfQ29lZnNfdDsKLSNlbHNlCi10eXBlZGVmIHN0cnVjdAotewotICAgIExWTV9JTlQxNiBBMDsgICAvKiAgYTAgICovCi0gICAgTFZNX0lOVDE2IEIyOyAgIC8qIC1iMiEgKi8KLSAgICBMVk1fSU5UMTYgQjE7ICAgLyogLWIxISAqLwotfSBCUF9DMTZfQ29lZnNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fSU5UMzIgIEEwOyAgIC8qICBhMCAgKi8KLSAgICBMVk1fSU5UMzIgIEIyOyAgIC8qIC1iMiEgKi8KLSAgICBMVk1fSU5UMzIgIEIxOyAgIC8qIC1iMSEgKi8KLX0gQlBfQzMyX0NvZWZzX3Q7Ci0jZW5kaWYKIAogLyoqKiBQZWFraW5nIGNvZWZmaWNpZW50cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0ZMT0FUIEEwOyAgIC8qICBhMCAgKi8KQEAgLTE0OCwzMCArODEsMTIgQEAKICAgICBMVk1fRkxPQVQgQjE7ICAgLyogLWIxISAqLwogICAgIExWTV9GTE9BVCAgRzsgICAvKiBHYWluICovCiB9IFBLX0ZMT0FUX0NvZWZzX3Q7Ci0jZWxzZQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fSU5UMTYgQTA7ICAgLyogIGEwICAqLwotICAgIExWTV9JTlQxNiBCMjsgICAvKiAtYjIhICovCi0gICAgTFZNX0lOVDE2IEIxOyAgIC8qIC1iMSEgKi8KLSAgICBMVk1fSU5UMTYgIEc7ICAgLyogR2FpbiAqLwotfSBQS19DMTZfQ29lZnNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fSU5UMzIgIEEwOyAgIC8qICBhMCAgKi8KLSAgICBMVk1fSU5UMzIgIEIyOyAgIC8qIC1iMiEgKi8KLSAgICBMVk1fSU5UMzIgIEIxOyAgIC8qIC1iMSEgKi8KLSAgICBMVk1fSU5UMTYgIEc7ICAgLyogR2FpbiAqLwotfSBQS19DMzJfQ29lZnNfdDsKLSNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgVEFQUyBUWVBFIERFRklOSVRJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKiBUeXBlcyB1c2VkIGZvciBmaXJzdCBvcmRlciBhbmQgc2hlbHZpbmcgZmlsdGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgxICogMikgXTsgIC8qIE9uZSBjaGFubmVsLCB0d28gdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLwpAQCAtMTc5LDQyICs5NCwyOSBAQAogCiB0eXBlZGVmIHN0cnVjdAogewotICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoMiAqIDIpIF07ICAvKiBUd28gY2hhbm5lbHMsIHR3byB0YXBzIG9mIHNpemUgTFZNX0lOVDMyICovCi19IEJpcXVhZF8ySV9PcmRlcjFfRkxPQVRfVGFwc190OworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAvKiBMVk1fTUFYX0NIQU5ORUxTIGNoYW5uZWxzLCB0d28gdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLworICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoTFZNX01BWF9DSEFOTkVMUyAqIDIpIF07CiAjZWxzZQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fSU5UMzIgU3RvcmFnZVsgKDEqMikgXTsgIC8qIE9uZSBjaGFubmVsLCB0d28gdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLwotfSBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fSU5UMzIgU3RvcmFnZVsgKDIqMikgXTsgIC8qIFR3byBjaGFubmVscywgdHdvIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KLX0gQmlxdWFkXzJJX09yZGVyMV9UYXBzX3Q7CisgICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgyICogMikgXTsgIC8qIFR3byBjaGFubmVscywgdHdvIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KICNlbmRpZgorfSBCaXF1YWRfMklfT3JkZXIxX0ZMT0FUX1RhcHNfdDsKIAogLyoqKiBUeXBlcyB1c2VkIGZvciBiaXF1YWQsIGJhbmQgcGFzcyBhbmQgcGVha2luZyBmaWx0ZXIgKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0CiB7Ci0gICAgTFZNX0ZMT0FUIFN0b3JhZ2VbICgxICogNCkgXTsgIC8qIE9uZSBjaGFubmVsLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDEgKiA0KSBdOyAgLyogT25lIGNoYW5uZWwsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLwogfSBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdDsKIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiA0KSBdOyAgLyogVHdvIGNoYW5uZWxzLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KLX0gQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3Q7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIC8qIExWTV9NQVhfQ0hBTk5FTFMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9GTE9BVCAqLworICAgIExWTV9GTE9BVCBTdG9yYWdlWyAoTFZNX01BWF9DSEFOTkVMUyAqIDQpIF07CiAjZWxzZQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fSU5UMzIgU3RvcmFnZVsgKDEqNCkgXTsgIC8qIE9uZSBjaGFubmVsLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fSU5UMzIgKi8KLX0gQmlxdWFkXzFJX09yZGVyMl9UYXBzX3Q7Ci0KLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0lOVDMyIFN0b3JhZ2VbICgyKjQpIF07ICAvKiBUd28gY2hhbm5lbHMsIGZvdXIgdGFwcyBvZiBzaXplIExWTV9JTlQzMiAqLwotfSBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdDsKKyAgICBMVk1fRkxPQVQgU3RvcmFnZVsgKDIgKiA0KSBdOyAgLyogVHdvIGNoYW5uZWxzLCBmb3VyIHRhcHMgb2Ygc2l6ZSBMVk1fRkxPQVQgKi8KICNlbmRpZgorfSBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdDsKIC8qIFRoZSBuYW1lcyBvZiB0aGUgZnVuY3Rpb25zIGFyZSBjaGFuZ2VkIHRvIHNhdGlzZnkgUUFDIHJ1bGVzOiBOYW1lIHNob3VsZCBiZSBVbmlxdWUgd2l0aGluZyAxNiBjaGFyYWN0ZXJzKi8KICNkZWZpbmUgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAgSW5pdF9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMQogI2RlZmluZSBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMiAgICAgICBUV09fQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIKQEAgLTIyNSwxNDAgKzEyNyw1NyBAQAogCiAvKioqIDE2IGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCi0jaWZkZWYgQlVJTERfRkxPQVQKIHZvaWQgQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZik7Ci0jZWxzZQotdm9pZCBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Ci0jZW5kaWYKIAotI2lmZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIEJRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0jZWxzZQotdm9pZCBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotI2VuZGlmCiAKLSNpZmRlZiBCVUlMRF9GTE9BVAogdm9pZCBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotI2Vsc2UKLXZvaWQgQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKIAotI2VuZGlmCi0KLSNpZmRlZiBCVUlMRF9GTE9BVAogdm9pZCBCUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotI2Vsc2UKLXZvaWQgQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKIAotI2VuZGlmCi0KLSNpZmRlZiBCVUlMRF9GTE9BVAogdm9pZCBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKTsKLSNlbHNlCi12b2lkIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKIAotI2VuZGlmCi0KLSNpZmRlZiBCVUlMRF9GTE9BVAogdm9pZCBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLSNlbHNlCi12b2lkIEJRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCAgICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CiAKLSNlbmRpZgotCi0jaWZkZWYgQlVJTERfRkxPQVQKIHZvaWQgQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0jZWxzZQotdm9pZCBCUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMSggICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotI2VuZGlmCiAKLSNpZmRlZiBCVUlMRF9GTE9BVAogdm9pZCBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKTsKLSNlbHNlCi12b2lkIEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKIAotI2VuZGlmCi0KLSNpZmRlZiBCVUlMRF9GTE9BVAogdm9pZCBCUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0jZWxzZQotdm9pZCBCUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSggICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwogCi0jZW5kaWYKLQotI2lmZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpOwotI2Vsc2UKLXZvaWQgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwogCi0jZW5kaWYKLQotI2lmZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIEJRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotI2Vsc2UKLXZvaWQgQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLQotI2VuZGlmCiAvKioqIDMyIGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAogdm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKQEAgLTM2NiwxNSArMTg1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0jZWxzZQotdm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MzMl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Ci0KLXZvaWQgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIEJRX01DX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTM4Miw1MSArMTk4LDI0IEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKiAxNiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKIHZvaWQgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCggICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZik7Ci0jZWxzZQotdm9pZCBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Ci0jZW5kaWYKIAotI2lmZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotI2Vsc2UKLXZvaWQgRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEoICAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLSNlbmRpZgogCi0jaWZkZWYgQlVJTERfRkxPQVQKIHZvaWQgRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIxX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9MU2h4X0NvZWZzX3QgICAgICpwQ29lZik7Ci0jZWxzZQotdm9pZCBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjFfVGFwc190ICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MxNl9MU2h4X0NvZWZzX3QgICAgICpwQ29lZik7Ci0jZW5kaWYKIAotI2lmZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLSNlbHNlCi12b2lkIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLSNlbmRpZgogLyoqKiAzMiBiaXQgZGF0YSBwYXRoICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKIHZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgICpwQ29lZik7CkBAIC00MzQsMjIgKzIyMywxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotI2Vsc2UKLXZvaWQgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwotCi12b2lkIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCAgICAgICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBGT19NY19EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CiAjZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBQUk9UT1RZUEVTOiBCQU5EIFBBU1MgRklMVEVSUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKIC8qKiogMTYgYml0IGRhdGEgcGF0aCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICAgKnBDb2VmKTsKQEAgLTQ2NCwyNyArMjQ5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLSNlbHNlCi12b2lkIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzE2X0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKLQotdm9pZCBCUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotCi12b2lkIEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKCAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfQzMyX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKLQotdm9pZCBCUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotI2VuZGlmCiAvKioqIDMyIGJpdCBkYXRhIHBhdGggKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAogdm9pZCBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0ICggICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgKnBDb2VmKTsKQEAgLTQ5Miw0NiArMjU3LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0jZWxzZQotdm9pZCBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0ICggICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MzMl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Ci0KLXZvaWQgQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIoICAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLSNlbmRpZgogCiAvKioqIDMyIGJpdCBkYXRhIHBhdGggU1RFUkVPICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQlVJTERfRkxPQVQKLXZvaWQgUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMzJfQ29lZnNfdCAgICAgICAgICAqcENvZWYpOwotdm9pZCBQS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMSAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpOwotI2VuZGlmCi0jaWZkZWYgQlVJTERfRkxPQVQKIHZvaWQgUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgKnBUYXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19GTE9BVF9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Ci0jZWxzZQotdm9pZCBQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0MxNl9Db2Vmc190ICAgICAgICAgICpwQ29lZik7Ci0jZW5kaWYKLSNpZmRlZiBCVUlMRF9GTE9BVAogdm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKTsKLSNlbHNlCi12b2lkIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxICggICAgICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBQS19NY19EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTUzOSwyNSArMjc5LDIyIEBACiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogLyoqKiAxNiBiaXQgZGF0YSBwYXRoIFNURVJFTyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIERDX01jX0QxNl9UUkNfV1JBXzAxX0luaXQgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UpOworCit2b2lkIERDX01jX0QxNl9UUkNfV1JBXzAxICAgICAgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyNlbHNlCiB2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UpOwogCiB2b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxICAgICAgICAgICggICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcyk7Ci0jZWxzZQotdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0ICAgICAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlKTsKLQotdm9pZCBEQ18ySV9EMTZfVFJDX1dSQV8wMSAgICAgICAgICAoICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpOwogI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9Db21wTGltLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9Db21wTGltLmgKaW5kZXggNDk4ZmFhMy4uNWI3Y2IxYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvQ29tcExpbS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0NvbXBMaW0uaApAQCAtMTgsMTEgKzE4LDYgQEAKICNpZm5kZWYgX0NPTVBfTElNX0gKICNkZWZpbmUgX0NPTVBfTElNX0gKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTMxLDcgKzI2LDYgQEAKIAogI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTU3LDMxICs1MSwxNyBAQAogICAgIExWTV9JTlQzMiAgIENvbXBJbnRTbG93OyAgICAgICAgLyogQ29tcHJlc3NvciBzbG93IGludGVncmF0b3IgY3VycmVudCB2YWx1ZSAqLwogICAgIExWTV9JTlQzMiAgIENvbXBJbnRGYXN0OyAgICAgICAgLyogQ29tcHJlc3NvciBmYXN0IGludGVncmF0b3IgY3VycmVudCB2YWx1ZSAqLwogCi0KIH0gQ29tcExpbV9JbnN0YW5jZV90OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIEZ1bmN0aW9uIFByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIE5vbkxpbkNvbXBfRmxvYXQoTFZNX0ZMT0FUICAgICAgICBHYWluLAogICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKnBEYXRhSW4sCiAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAqcERhdGFPdXQsCiAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICBCbG9ja0xlbmd0aCk7Ci0jZWxzZQotdm9pZCBOb25MaW5Db21wX0QxNihMVk1fSU5UMTYgICAgICAgIEdhaW4sCi0gICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBTdGVyQmZJbiwKLSAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcFN0ZXJCZk91dCwKLSAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICBCbG9ja0xlbmd0aCk7Ci0jZW5kaWYKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCiAKICNlbmRpZiAvKiAjaWZuZGVmIF9DT01QX0xJTV9IICovCiAKLQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9GaWx0ZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0ZpbHRlci5oCmluZGV4IDBjODk1NWQuLjFlZWIzMjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0ZpbHRlci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0ZpbHRlci5oCkBAIC0xOCwzOSArMTgsMjcgQEAKICNpZm5kZWYgX0ZJTFRFUl9IXwogI2RlZmluZSBfRklMVEVSX0hfCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIElOQ0xVREVTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KICNpbmNsdWRlICJMVk1fVHlwZXMuaCIKICNpbmNsdWRlICJCSVFVQUQuaCIKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgREVGSU5FUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjZGVmaW5lIEZJTFRFUl9MT1NTICAgICAzMjczMCAgICAgICAvKiAtMC4wMWRCIGxvc3MgdG8gYXZvaWQgd3JhcHBpbmcgZHVlIHRvIGJhbmQgcmlwcGxlICovCi0jaWZkZWYgQlVJTERfRkxPQVQKICNkZWZpbmUgRklMVEVSX0xPU1NfRkxPQVQgICAgMC45OTg4NDlmCi0jZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBQUk9UT1RZUEVTCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAogCiBMVk1fRkxPQVQgTFZNX1Bvd2VyMTAoICAgTFZNX0ZMT0FUICBYKTsKIAogTFZNX0ZMT0FUIExWTV9Qb2x5bm9taWFsKExWTV9VSU5UMTYgTiwKICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpwQ29lZmZpY2llbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgWCk7Ci0jaWZkZWYgSElHSEVSX0ZTCiBMVk1fRkxPQVQgICBMVk1fR2V0T21lZ2EoTFZNX1VJTlQzMiAgRmMsCi0jZWxzZQotTFZNX0ZMT0FUICAgTFZNX0dldE9tZWdhKExWTV9VSU5UMTYgIEZjLAotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgU2FtcGxlUmF0ZSk7CiAKIExWTV9GTE9BVCBMVk1fRk9fTFBGKCAgICBMVk1fRkxPQVQgIHcsCkBAIC01OCwyNiArNDYsNyBAQAogCiBMVk1fRkxPQVQgTFZNX0ZPX0hQRiggICAgTFZNX0ZMT0FUICB3LAogICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgICpwQ29lZmZzKTsKLSNlbHNlCi1MVk1fSU5UMzIgTFZNX1BvbHlub21pYWwoTFZNX1VJTlQxNiBOLAotICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKnBDb2VmZmljaWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICBYKTsKLQotTFZNX0lOVDMyIExWTV9Qb3dlcjEwKCAgIExWTV9JTlQzMiAgWCk7Ci0KLUxWTV9JTlQzMiBMVk1fRk9fTFBGKCAgICBMVk1fSU5UMzIgIHcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzMyX0NvZWZzX3QgICpwQ29lZmZzKTsKLQotTFZNX0lOVDMyIExWTV9GT19IUEYoICAgIExWTV9JTlQzMiAgdywKLSAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgKnBDb2VmZnMpOwotCi1MVk1fSU5UMzIgICBMVk1fR2V0T21lZ2EoTFZNX1VJTlQxNiAgRmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgU2FtcGxlUmF0ZSk7Ci0jZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KIAogI2VuZGlmICAvKiogX0ZJTFRFUl9IXyAqKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvSW5zdEFsbG9jLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9JbnN0QWxsb2MuaAppbmRleCA3ZjcyNWY0Li5iYWU4NGU3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9JbnN0QWxsb2MuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9JbnN0QWxsb2MuaApAQCAtMTgsMTAgKzE4LDYgQEAKICNpZm5kZWYgX19JTlNUQUxMT0NfSF9fCiAjZGVmaW5lIF9fSU5TVEFMTE9DX0hfXwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KICNpbmNsdWRlICJMVk1fVHlwZXMuaCIKIC8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwogLyogIFR5cGUgZGVjbGFyYXRpb25zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zMiw3ICsyOCw2IEBACiAgICAgdWludHB0cl90ICAgICAgICAgICAgICAgcE5leHRNZW1iZXI7ICAgIC8qICBQb2ludGVyIHRvIHRoZSBuZXh0IGluc3RhbmNlIG1lbWJlciB0byBiZSBhbGxvY2F0ZWQgKi8KIH0gICBJTlNUX0FMTE9DOwogCi0KIC8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwogLyogIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLwpAQCAtNDgsNyArNDMsNiBAQAogCiB2b2lkICAgSW5zdEFsbG9jX0luaXQoIElOU1RfQUxMT0MgKnBtcywgdm9pZCAqU3RhcnRBZGRyICk7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICBOYW1lICAgICAgICA6IEluc3RBbGxvY19BZGRNZW1iZXIoKQogICogIElucHV0ICAgICAgIDogcG1zICAtIFBvaW50ZXIgdG8gdGhlIElOU1RfQUxMT0MgaW5zdGFuY2UKQEAgLTg1LDggKzc5LDQgQEAKIAogdm9pZCAgICBJbnN0QWxsb2NfSW5pdEFsbF9OVUxMKCBJTlNUX0FMTE9DICAgICAgICAgICAgICAqcG1zKTsKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQogI2VuZGlmIC8qIF9fSkJTX0lOU1RBTExPQ19IX18gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9Db21tb24uaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9Db21tb24uaAppbmRleCBjZWNjZDdiLi40OWYxNmFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fQ29tbW9uLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX0NvbW1vbi5oCkBAIC0yMywxNSArMjMsOSBAQAogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCiAjaWZuZGVmIF9fTFZNX0NPTU1PTl9IX18KICNkZWZpbmUgX19MVk1fQ09NTU9OX0hfXwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzksNyArMzMsNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTMsOSArNDYsNSBAQAogI2RlZmluZSBBTEdPUklUSE1fVkNfSUQgICAgICAgIDB4MDUwMAogI2RlZmluZSBBTEdPUklUSE1fVEVfSUQgICAgICAgIDB4MDYwMAogCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCiAjZW5kaWYgICAgICAvKiBfX0xWTV9DT01NT05fSF9fICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9NYWNyb3MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9NYWNyb3MuaAppbmRleCA5N2QxM2E1Li4xYTE1MTI1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fTWFjcm9zLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX01hY3Jvcy5oCkBAIC0xOCwxMCArMTgsNiBAQAogI2lmbmRlZiBfTFZNX01BQ1JPU19IXwogI2RlZmluZSBfTFZNX01BQ1JPU19IXwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBNVUwzMngzMklOVE8zMihBLEIsQyxTaGlmdFIpCiAgICAgICAgIEMgPSAoQSAqIEIpID4+IFNoaWZ0UgpAQCAtMzIsNyArMjgsNiBAQAogICAgICAgICBvZiBvdmVyZmxvdyBpcyB1bmRlZmluZWQuCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBNVUwzMngzMklOVE8zMgogI2RlZmluZSBNVUwzMngzMklOVE8zMihBLEIsQyxTaGlmdFIpICAgXAogICAgICAgICB7TFZNX0lOVDMyIE1VTDMyeDMySU5UTzMyX3RlbXAsTVVMMzJ4MzJJTlRPMzJfdGVtcDIsTVVMMzJ4MzJJTlRPMzJfbWFzayxNVUwzMngzMklOVE8zMl9ISCxNVUwzMngzMklOVE8zMl9ITCxNVUwzMngzMklOVE8zMl9MSCxNVUwzMngzMklOVE8zMl9MTDtcCiAgICAgICAgICBMVk1fSU5UMzIgIHNoaWZ0VmFsdWU7XApAQCAtNTgsNyArNTMsNiBAQAogICAgICAgIH1cCiAgICAgICAgKEMpID0gTVVMMzJ4MzJJTlRPMzJfdGVtcDI7XAogICAgICAgIH0KLSNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgTVVMMzJ4MTZJTlRPMzIoQSxCLEMsU2hpZnRSKQpAQCAtNzEsNyArNjUsNiBAQAogICAgICAgICBvZiBvdmVyZmxvdyBpcyB1bmRlZmluZWQuCiAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBNVUwzMngxNklOVE8zMgogI2RlZmluZSBNVUwzMngxNklOVE8zMihBLEIsQyxTaGlmdFIpICAgXAogICAgICAgICB7TFZNX0lOVDMyIE1VTDMyeDE2SU5UTzMyX21hc2ssTVVMMzJ4MTZJTlRPMzJfSEgsTVVMMzJ4MTZJTlRPMzJfTEw7XAogICAgICAgICAgTFZNX0lOVDMyICBzaGlmdFZhbHVlO1wKQEAgLTkxLDcgKzg0LDYgQEAKICAgICAgICAgZWxzZSB7XAogICAgICAgICAoQyk9TVVMMzJ4MTZJTlRPMzJfSEg+PihzaGlmdFZhbHVlLTE2KTt9XAogICAgICAgICB9Ci0jZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIEFERDJfU0FUXzMyeDMyKEEsQixDKQpAQCAtOTksNyArOTEsNiBAQAogCiAgICAgICAgIEEsQiBhbmQgQyBhcmUgMzIgYml0IFNJR05FRCBudW1iZXJzLgogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEFERDJfU0FUXzMyeDMyCiAjZGVmaW5lIEFERDJfU0FUXzMyeDMyKEEsQixDKSAgIFwKICAgICAgICAgeyhDKT0oQSkrKEIpO1wKICAgICAgICAgIGlmICgoKChDKSBeIChBKSkgJiAoKEMpIF4gKEIpKSkgPj4gMzEpXApAQCAtMTEwLDEyICsxMDEsNiBAQAogICAgICAgICAgICAgICAgICAgICAoQyk9MHg3RkZGRkZGRmw7XAogICAgICAgICAgICAgfVwKICAgICAgICAgfQotI2VuZGlmCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KIAogI2VuZGlmIC8qIF9MVk1fTUFDUk9TX0hfICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL0xWTV9UaW1lci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmgKaW5kZXggODFlMjg4Yy4uZGJmOWU2YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1RpbWVyLmgKQEAgLTMzLDE4ICszMywyMSBAQAogLyogIFRoZSB0aW1lciBjdXJyZW50bHkgZG9lcyBub3Qgc3Vwb3J0IGNoYW5nZXMgaW4gc2FtcGxpbmcgcmF0ZSB3aGlsZSB0aW1pbmcuICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogIFRZUEUgREVGSU5JVElPTlMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAogdHlwZWRlZiBzdHJ1Y3QKIHsKLSAgICBMVk1fSU5UMzIgU3RvcmFnZVs2XTsKKyAgICAvKgorICAgICAqIFRoZSBtZW1vcnkgYXJlYSBjcmVhdGVkIHVzaW5nIHRoaXMgc3RydWN0dXJlIGlzIGludGVybmFsbHkKKyAgICAgKiB0eXBlY2FzdCB0byBMVk1fVGltZXJfSW5zdGFuY2VfUHJpdmF0ZV90IGFuZCB1c2VkLgorICAgICAqIFRoZSBMVk1fVGltZXJfSW5zdGFuY2VfUHJpdmF0ZV90IHN0cnVjdHVyZSBoYXMgMyBwb2ludGVyIHR5cGUgZWxlbWVudHMKKyAgICAgKiAyIGVsZW1lbnRzIG9mIHR5cGUgTFZNX0lOVDMyIGFuZCBvbmUgZWxlbWVudCBvZiB0eXBlIExWTV9JTlQxNi4KKyAgICAgKiBJbm9yZGVyIHRvIGNhdGVyIGJvdGggMzIgYW5kIDY0IGJpdCBidWlsZHMsIFN0b3JhZ2UgYXJyYXkgc2hvdWxkCisgICAgICogaGF2ZSBhIG1pbmltdW0gb2YgOSBlbGVtZW50cyBvZiB0eXBlIExWTV9JTlQzMi4KKyAgICAgKi8KKyAgICBMVk1fSU5UMzIgU3RvcmFnZVs5XTsKIAogfSBMVk1fVGltZXJfSW5zdGFuY2VfdDsKIApAQCAtNjYsMTcgKzY5LDExIEBACiB2b2lkIExWTV9UaW1lcl9Jbml0ICggICBMVk1fVGltZXJfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1RpbWVyX1BhcmFtc190ICAgICAgICAgKnBQYXJhbXMgICAgICk7CiAKLQogdm9pZCBMVk1fVGltZXIgICAgICAoICAgTFZNX1RpbWVyX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tTaXplICk7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgRU5EIE9GIEhFQURFUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCiAjZW5kaWYgIC8qIF9fTFZNX1RJTUVSX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTFZNX1R5cGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAppbmRleCBlYTE2MDcyLi44YjY4N2Y2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9MVk1fVHlwZXMuaApAQCAtMjUsMTAgKzI1LDYgQEAKICNpZm5kZWYgTFZNX1RZUEVTX0gKICNkZWZpbmUgTFZNX1RZUEVTX0gKIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTQsMzMgKzkwLDIzIEBACiAKIHR5cGVkZWYgICAgIGludDMyX3QgICAgICAgICAgICAgTFZNX0lOVDMyOyAgICAgICAgICAvKiBTaWduZWQgMzItYml0IHdvcmQgKi8KIHR5cGVkZWYgICAgIHVpbnQzMl90ICAgICAgICAgICAgTFZNX1VJTlQzMjsgICAgICAgICAvKiBVbnNpZ25lZCAzMi1iaXQgd29yZCAqLwotCi0jaWZkZWYgQlVJTERfRkxPQVQKK3R5cGVkZWYgICAgIGludDY0X3QgICAgICAgICAgICAgTFZNX0lOVDY0OyAgICAgICAgICAvKiBTaWduZWQgNjQtYml0IHdvcmQgKi8KIAogI2RlZmluZSBMVk1fTUFYRkxPQVQgICAgICAgICAgICAxLmYKIAogdHlwZWRlZiAgICAgZmxvYXQgICAgICAgICAgICAgICBMVk1fRkxPQVQ7ICAgICAgICAgIC8qIHNpbmdsZSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQgKi8KIAotLy8gSWYgTkFUSVZFX0ZMT0FUX0JVRkZFUiBpcyBkZWZpbmVkLCB3ZSBleHBvc2UgZWZmZWN0cyBhcyBmbG9hdGluZyBwb2ludCBmb3JtYXQ7Ci0vLyBvdGhlcndpc2Ugd2UgZXhwb3NlIGFzIGludGVnZXIgMTYgYml0IGFuZCB0cmFuc2xhdGUgdG8gZmxvYXQgZm9yIHRoZSBlZmZlY3QgbGlicmFyaWVzLgotLy8gSGVuY2UsIE5BVElWRV9GTE9BVF9CVUZGRVIgc2hvdWxkIG9ubHkgYmUgZW5hYmxlZCB1bmRlciBCVUlMRF9GTE9BVCBjb21waWxhdGlvbi4KLQotI2RlZmluZSBOQVRJVkVfRkxPQVRfQlVGRkVSCi0KLSNlbmRpZiAvLyBCVUlMRF9GTE9BVAotCiAvLyBTZWxlY3Qgd2hldGhlciB3ZSBleHBvc2UgaW50MTZfdCBvciBmbG9hdCBidWZmZXJzLgotI2lmZGVmIE5BVElWRV9GTE9BVF9CVUZGRVIKIAogI2RlZmluZSAgICBFRkZFQ1RfQlVGRkVSX0ZPUk1BVCBBVURJT19GT1JNQVRfUENNX0ZMT0FUCiB0eXBlZGVmICAgICBmbG9hdCAgICAgICAgICAgICAgIGVmZmVjdF9idWZmZXJfdDsKIAotI2Vsc2UgLy8gTkFUSVZFX0ZMT0FUX0JVRkZFUgogCi0jZGVmaW5lICAgIEVGRkVDVF9CVUZGRVJfRk9STUFUIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCi10eXBlZGVmICAgICBpbnQxNl90ICAgICAgICAgICAgIGVmZmVjdF9idWZmZXJfdDsKLQotI2VuZGlmIC8vIE5BVElWRV9GTE9BVF9CVUZGRVIKKyNpZmRlZiBTVVBQT1JUX01DCisjZGVmaW5lIExWTV9NQVhfQ0hBTk5FTFMgOCAvLyBGQ0NfOAorI2Vsc2UKKyNkZWZpbmUgTFZNX01BWF9DSEFOTkVMUyAyIC8vIEZDQ18yCisjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEzNiwxNyArMTIyLDE4IEBACiAgICAgTFZNX01PREVfRFVNTVkgID0gTFZNX01BWEVOVU0KIH0gTFZNX01vZGVfZW47CiAKLQogLyogRm9ybWF0ICovCiB0eXBlZGVmIGVudW0KIHsKICAgICBMVk1fU1RFUkVPICAgICAgICAgID0gMCwKICAgICBMVk1fTU9OT0lOU1RFUkVPICAgID0gMSwKICAgICBMVk1fTU9OTyAgICAgICAgICAgID0gMiwKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgTFZNX01VTFRJQ0hBTk5FTCAgICA9IDMsCisjZW5kaWYKICAgICBMVk1fU09VUkNFX0RVTU1ZICAgID0gTFZNX01BWEVOVU0KIH0gTFZNX0Zvcm1hdF9lbjsKIAotCiAvKiBMVk0gc2FtcGxpbmcgcmF0ZXMgKi8KIHR5cGVkZWYgZW51bQogewpAQCAtMTU5LDE1ICsxNDYsMTQgQEAKICAgICBMVk1fRlNfMzIwMDAgPSA2LAogICAgIExWTV9GU180NDEwMCA9IDcsCiAgICAgTFZNX0ZTXzQ4MDAwID0gOCwKLSNpZmRlZiBISUdIRVJfRlMKLSAgICBMVk1fRlNfOTYwMDAgPSA5LAotICAgIExWTV9GU18xOTIwMDAgPSAxMCwKLSNlbmRpZgorICAgIExWTV9GU184ODIwMCA9IDksCisgICAgTFZNX0ZTXzk2MDAwID0gMTAsCisgICAgTFZNX0ZTXzE3NjQwMCA9IDExLAorICAgIExWTV9GU18xOTIwMDAgPSAxMiwKICAgICBMVk1fRlNfSU5WQUxJRCA9IExWTV9NQVhFTlVNLTEsCiAgICAgTFZNX0ZTX0RVTU1ZID0gTFZNX01BWEVOVU0KIH0gTFZNX0ZzX2VuOwogCi0KIC8qIE1lbW9yeSBUeXBlcyAqLwogdHlwZWRlZiBlbnVtCiB7CkBAIC0xNzgsNyArMTY0LDYgQEAKICAgICBMVk1fTUVNT1JZVFlQRV9EVU1NWSAgICAgICAgPSBMVk1fTUFYRU5VTQogfSBMVk1fTWVtb3J5VHlwZXNfZW47CiAKLQogLyogTWVtb3J5IHJlZ2lvbiBkZWZpbml0aW9uICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtMTg3LDE0ICsxNzIsMTIgQEAKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgKnBCYXNlQWRkcmVzczsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgcmVnaW9uIGJhc2UgYWRkcmVzcyAqLwogfSBMVk1fTWVtb3J5UmVnaW9uX3N0OwogCi0KIC8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX01lbW9yeVJlZ2lvbl9zdCAgICAgICAgIFJlZ2lvbltMVk1fTlJfTUVNT1JZX1JFR0lPTlNdOyAgLyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICovCiB9IExWTV9NZW1vcnlUYWJsZV9zdDsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFN0YW5kYXJkIEZ1bmN0aW9uIFByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yMDQsMTUgKzE4NywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgKnBHZW5lcmFsUHVycG9zZSwgICAvKiBHZW5lcmFsIHB1cnBvc2UgcG9pbnRlciAoZS5nLiB0byBhIGRhdGEgc3RydWN0dXJlIG5lZWRlZCBpbiB0aGUgY2FsbGJhY2spICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBHZW5lcmFsUHVycG9zZSApOyAgIC8qIEdlbmVyYWwgcHVycG9zZSB2YXJpYWJsZSAoZS5nLiB0byBiZSB1c2VkIGFzIGNhbGxiYWNrIElEKSAqLwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRW5kIG9mIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KICNlbmRpZiAgLyogTFZNX1RZUEVTX0ggKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL01peGVyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9NaXhlci5oCmluZGV4IDA3YzUzY2QuLmIyZTAxOTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL01peGVyLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvTWl4ZXIuaApAQCAtMTgsMTkgKzE4LDEyIEBACiAjaWZuZGVmIF9fTUlYRVJfSF9fCiAjZGVmaW5lIF9fTUlYRVJfSF9fCiAKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KICNpbmNsdWRlICJMVk1fVHlwZXMuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIElOU1RBTkNFIE1FTU9SWSBUWVBFIERFRklOSVRJT04KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0jaWZkZWYgQlVJTERfRkxPQVQgLyogQlVJTERfRkxPQVQqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fRkxPQVQgICBBbHBoYTsgICAgICAgICAgICAgICAgICAgLyogVGltZSBjb25zdGFudC4gU2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24uIFwKQEAgLTY2LDUyICs1OSwxMSBAQAogICAgIHZvaWQgICAgICAgICpwR2VuZXJhbFB1cnBvc2UyOwogICAgIExWTV9DYWxsYmFjayBwQ2FsbEJhY2syOwogfSBNaXhfMlN0X0NsbF9GTE9BVF90OwotI2Vsc2UKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNX0lOVDMyICAgQWxwaGE7ICAgICAgICAgICAgICAgICAgICAvKiBUaW1lIGNvbnN0YW50LiBTZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbi4gIENhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lICovCi0gICAgTFZNX0lOVDMyICAgVGFyZ2V0OyAgICAgICAgICAgICAgICAgICAvKiBUYXJnZXQgdmFsdWUuICBTZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbi4gIENhbiBiZSBjaGFuZ2VkIGF0IGFueSB0aW1lICovCi0gICAgTFZNX0lOVDMyICAgQ3VycmVudDsgICAgICAgICAgICAgICAgICAvKiBDdXJyZW50IHZhbHVlLiAgU2V0IGJ5IHRoZSBtaXhlciBmdW5jdGlvbi4gKi8KLSAgICBMVk1fSU5UMTYgICBDYWxsYmFja1NldDsgICAgICAgICAgICAgIC8qIEJvb2xlYW4uICBTaG91bGQgYmUgc2V0IGJ5IGNhbGxpbmcgYXBwbGljYXRpb24gZWFjaCB0aW1lIHRoZSB0YXJnZXQgdmFsdWUgaXMgdXBkYXRlZCAqLwotICAgIExWTV9JTlQxNiAgIENhbGxiYWNrUGFyYW07ICAgICAgICAgICAgLyogUGFyYW1ldGVyIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBjYWxiYWNrIGZ1bmN0aW9uICovCi0gICAgdm9pZCAgICAgICAgKnBDYWxsYmFja0hhbmRsZTsgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBvZiB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLSAgICB2b2lkICAgICAgICAqcEdlbmVyYWxQdXJwb3NlOyAgICAgICAgIC8qIFBvaW50ZXIgZm9yIGdlbmVyYWwgcHVycG9zZSB1c2FnZSAqLwotICAgIExWTV9DYWxsYmFjayBwQ2FsbEJhY2s7ICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLX0gTWl4XzFTdF9DbGxfdDsKLQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fSU5UMzIgICBBbHBoYTE7Ci0gICAgTFZNX0lOVDMyICAgVGFyZ2V0MTsKLSAgICBMVk1fSU5UMzIgICBDdXJyZW50MTsKLSAgICBMVk1fSU5UMTYgICBDYWxsYmFja1NldDE7Ci0gICAgTFZNX0lOVDE2ICAgQ2FsbGJhY2tQYXJhbTE7Ci0gICAgdm9pZCAgICAgICAgKnBDYWxsYmFja0hhbmRsZTE7Ci0gICAgdm9pZCAgICAgICAgKnBHZW5lcmFsUHVycG9zZTE7Ci0gICAgTFZNX0NhbGxiYWNrIHBDYWxsQmFjazE7Ci0KLSAgICBMVk1fSU5UMzIgICBBbHBoYTI7ICAgICAgICAgICAgICAgICAgIC8qIFdhcm5pbmcgdGhlIGFkZHJlc3Mgb2YgdGhpcyBsb2NhdGlvbiBpcyBwYXNzZWQgYXMgYSBwb2ludGVyIHRvIE1peF8xU3RfQ2xsX3QgaW4gc29tZSBmdW5jdGlvbnMgKi8KLSAgICBMVk1fSU5UMzIgICBUYXJnZXQyOwotICAgIExWTV9JTlQzMiAgIEN1cnJlbnQyOwotICAgIExWTV9JTlQxNiAgIENhbGxiYWNrU2V0MjsKLSAgICBMVk1fSU5UMTYgICBDYWxsYmFja1BhcmFtMjsKLSAgICB2b2lkICAgICAgICAqcENhbGxiYWNrSGFuZGxlMjsKLSAgICB2b2lkICAgICAgICAqcEdlbmVyYWxQdXJwb3NlMjsKLSAgICBMVk1fQ2FsbGJhY2sgcENhbGxCYWNrMjsKLQotfSBNaXhfMlN0X0NsbF90OwotCi0jZW5kaWYKIAogLyoqKiBHZW5lcmFsIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKIAogTFZNX0ZMT0FUIExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZNX1VJTlQzMiAgIHRjLAotI2lmZGVmIEhJR0hFUl9GUwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgIEZzLAotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBGcywKLSNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIE51bUNoYW5uZWxzKTsKIAogdm9pZCBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCkBAIC0xMjksMzQgKzgxLDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwotI2Vsc2UKLUxWTV9VSU5UMzIgTFZNX01peGVyX1RpbWVDb25zdGFudChMVk1fVUlOVDMyICAgdGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIEZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICBOdW1DaGFubmVscyk7Ci0KLQotdm9pZCBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAgICBNaXhfMVN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwotCi12b2lkIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoICAgIE1peF8yU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwotCi12b2lkIE1peEluU29mdF9EMzJDMzFfU0FUKCAgICAgIE1peF8xU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Ci0KLSNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT04gUFJPVE9UWVBFUyAoTE9XIExFVkVMIFNVQkZVTkNUSU9OUykKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCkBAIC0xNzAsMjcgKzk4LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbik7Ci0jZWxzZQotdm9pZCBDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgTWl4XzFTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKLQotdm9pZCBDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQoICAgTWl4XzJTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwotCi12b2lkIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoICAgICBNaXhfMVN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwotI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9TY2FsYXJBcml0aG1ldGljLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9TY2FsYXJBcml0aG1ldGljLmgKaW5kZXggY2RiMzgzNy4uYWU1NDQxOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvU2NhbGFyQXJpdGhtZXRpYy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1NjYWxhckFyaXRobWV0aWMuaApAQCAtMTgsMTEgKzE4LDYgQEAKICNpZm5kZWYgX19TQ0FMQVJBUklUSE1FVElDX0hfXwogI2RlZmluZSBfX1NDQUxBUkFSSVRITUVUSUNfSF9fCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCiAvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KIC8qICBJbmNsdWRlIGZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCkBAIC0zNSwxMSArMzAsNyBAQAogCiAvKiBBYnNvbHV0ZSB2YWx1ZSBpbmNsdWRpbmcgdGhlIGNvcm5lciBjYXNlIGZvciB0aGUgZXh0cmVtZSBuZWdhdGl2ZSB2YWx1ZSAqLwogCi0jaWZkZWYgQlVJTERfRkxPQVQKIExWTV9GTE9BVCAgIEFic19GbG9hdChMVk1fRkxPQVQgICAgIGlucHV0KTsKLSNlbHNlCi1MVk1fSU5UMzIgICBBYnNfMzIoTFZNX0lOVDMyICAgICBpbnB1dCk7Ci0jZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICBOYW1lICAgICAgICA6IGRCX3RvX0xpbjMyKCkKQEAgLTUzLDE2ICs0NCw3IEBACiAgKiAgICAgICAgICAgICAgICAgICgxNS0+MDEpID0gZGVjaW1hbCBwYXJ0CiAgKiAgUmV0dXJucyAgICAgOiBMaW4gdmFsdWUgZm9ybWF0IDEuMTYuMTUKICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCiBMVk1fRkxPQVQgZEJfdG9fTGluRmxvYXQoTFZNX0lOVDE2ICAgIGRiX2ZpeCk7Ci0jZWxzZQotTFZNX0lOVDMyIGRCX3RvX0xpbjMyKExWTV9JTlQxNiAgZGJfZml4KTsKLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwogCiAjZW5kaWYgIC8qIF9fU0NBTEFSQVJJVEhNRVRJQ19IX18gKi8KIAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL2xpYi9WZWN0b3JBcml0aG1ldGljLmgKaW5kZXggMGJhMjBhMy4uMmFmMWVlYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9saWIvVmVjdG9yQXJpdGhtZXRpYy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vbGliL1ZlY3RvckFyaXRobWV0aWMuaApAQCAtMTgsMzkgKzE4LDI4IEBACiAjaWZuZGVmIF9WRUNUT1JfQVJJVEhNRVRJQ19IXwogI2RlZmluZSBfVkVDVE9SX0FSSVRITUVUSUNfSF8KIAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KICNpbmNsdWRlICJMVk1fVHlwZXMuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBWQVJJT1VTIEZVTkNUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBCVUlMRF9GTE9BVAogdm9pZCBMb2FkQ29uc3RfRmxvYXQoICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLSNlbHNlCi12b2lkIExvYWRDb25zdF8xNiggICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOwogCi12b2lkIExvYWRDb25zdF8zMiggICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOwotI2VuZGlmCi0KLSNpZmRlZiBCVUlMRF9GTE9BVAogdm9pZCBDb3B5X0Zsb2F0KCAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7Ci0jZWxzZQotdm9pZCBDb3B5XzE2KCAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBDb3B5X0Zsb2F0X01jX1N0ZXJlbyggICAgICAgY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBOckNoYW5uZWxzKTsKK3ZvaWQgQ29weV9GbG9hdF9TdGVyZW9fTWMoICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgTnJDaGFubmVscyk7CiAjZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAQCAtNjEsMTcgKzUwLDEwIEBACiAgKiAgICAgICBUaGlzIGlzIHRoZSBvbmx5IGNhc2Ugd2hpY2ggd2lsbCBnaXZlIHdyb25nIHJlc3VsdC4gICAgICAgICAgICAgICAgICAgICAqCiAgKiAgICAgICBGb3IgbW9yZSBpbmZvcm1hdGlvbiByZWZlciB0byBWZWN0b3JfQXJpdGhtZXRpYy5kb2MgaW4gL2RvYyBmb2xkZXIgICAgICAqCiAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIE11bHQzc19GbG9hdCggICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLSNlbHNlCi12b2lkIE11bHQzc18xNngxNiggICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLSNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgKiBub3RlOiBJbiBNdWx0M3NfMzJ4MTYoKSBzYXR1cmF0aW9uIG9mIHJlc3VsdCBpcyBub3QgdGFrZW4gY2FyZSB3aGVuICAgICAgICAgICAqCkBAIC04NSw1NSArNjcsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Ci0jaWZkZWYgQlVJTERfRkxPQVQKIHZvaWQgRGVsYXlNaXhfRmxvYXQoY29uc3QgTFZNX0ZMT0FUICpzcmMsICAgICAgICAgICAvKiBTb3VyY2UgMSwgdG8gYmUgZGVsYXllZCAqLwogICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRlbGF5LCAgICAgICAgIC8qIERlbGF5IGJ1ZmZlciAqLwogICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgc2l6ZSwgICAgICAgICAgIC8qIERlbGF5IHNpemUgKi8KICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsICAgICAgICAgICAvKiBTb3VyY2UvZGVzdGluYXRpb24gKi8KICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpwT2Zmc2V0LCAgICAgICAvKiBEZWxheSBvZmZzZXQgKi8KICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pICA7ICAgICAgICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCi0jZWxzZQotdm9pZCBEZWxheU1peF8xNngxNiggICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRlbGF5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqcE9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLSNlbmRpZgogdm9pZCBEZWxheVdyaXRlXzMyKCAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLCAgICAgICAgICAgICAgIC8qIFNvdXJjZSAxLCB0byBiZSBkZWxheWVkICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkZWxheSwgICAgICAgICAgICAgLyogRGVsYXkgYnVmZmVyICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IHNpemUsICAgICAgICAgICAgICAgLyogRGVsYXkgc2l6ZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAqcE9mZnNldCwgICAgICAgICAgIC8qIERlbGF5IG9mZnNldCAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotI2lmZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIEFkZDJfU2F0X0Zsb2F0KCAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLSNlbHNlCi12b2lkIEFkZDJfU2F0XzE2eDE2KCAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLQotdm9pZCBBZGQyX1NhdF8zMngzMiggICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLSNlbmRpZgotI2lmZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIE1hYzNzX1NhdF9GbG9hdCggICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCB2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLSNlbHNlCi12b2lkIE1hYzNzX1NhdF8xNngxNiggICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLQotdm9pZCBNYWMzc19TYXRfMzJ4MTYoICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLSNlbmRpZgogdm9pZCBEZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMiggICAgTFZNX0lOVDMyICAqZGVsYXksICAgICAgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgc2l6ZSwgICAgICAgICAgICAgICAgLyogRGVsYXkgc2l6ZSAqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IGNvZWZmLCAgICAgICAgICAgICAgICAvKiBBbGwgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnQgKi8KQEAgLTE0NSw4MyArOTYsMzcgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICAgU0hJRlQgRlVOQ1RJT05TCiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAogdm9pZCBTaGlmdF9TYXRfRmxvYXQgKGNvbnN0ICAgTFZNX0lOVDE2ICAgdmFsLAogICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0ZMT0FUICAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIG4pOwotI2Vsc2UKLXZvaWQgU2hpZnRfU2F0X3YxNnh2MTYgKCAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotCi12b2lkIFNoaWZ0X1NhdF92MzJ4djMyICggICAgICBjb25zdCBMVk1fSU5UMTYgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLSNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBBVURJTyBGT1JNQVQgQ09OVkVSU0lPTiBGVU5DVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIE1vbm9UbzJJX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Ci0jZWxzZQotdm9pZCBNb25vVG8ySV8xNiggICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLQotdm9pZCBNb25vVG8ySV8zMiggICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pOwotI2VuZGlmCi0jaWZkZWYgQlVJTERfRkxPQVQKIHZvaWQgRnJvbTJpVG9Nb25vX0Zsb2F0KCAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgKnNyYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKTsKLSNlbHNlCi12b2lkIEZyb20yaVRvTW9ub18zMiggICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBGcm9tTWNUb01vbm9fRmxvYXQoY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckNoYW5uZWxzKTsKICNlbmRpZgotI2lmZGVmIEJVSUxEX0ZMT0FUCiB2b2lkIE1TVG8yaV9TYXRfRmxvYXQoICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyY00sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgKnNyY1MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7Ci0jZWxzZQotdm9pZCBNU1RvMmlfU2F0XzE2eDE2KCAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmNNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICpzcmNTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOwotI2VuZGlmCi0jaWZkZWYgQlVJTERfRkxPQVQKIHZvaWQgRnJvbTJpVG9NU19GbG9hdCggICAgICAgIGNvbnN0IExWTV9GTE9BVCAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3RNLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3RTLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKTsKLSNlbHNlCi12b2lkIEZyb20yaVRvTVNfMTZ4MTYoICAgICAgICBjb25zdCBMVk1fSU5UMTYgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0TSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0UywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7Ci0jZW5kaWYKLSNpZmRlZiBCVUlMRF9GTE9BVAogdm9pZCBKb2luVG8yaV9GbG9hdCggICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAqc3JjTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgKnNyY1IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApOwotI2Vsc2UKLXZvaWQgRnJvbTJpVG9Nb25vXzE2KCAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbik7Ci12b2lkIEpvaW5UbzJpXzMyeDMyKCAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICpzcmNMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAqc3JjUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICk7Ci0jZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICBEQVRBIFRZUEUgQ09OVkVSU0lPTiBGVU5DVElPTlMKQEAgLTIzNywxMSArMTQyLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNoaWZ0ICk7CiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNlbmRpZiAgLyogX1ZFQ1RPUl9BUklUSE1FVElDX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BR0NfTUlYX1ZPTF8yU3QxTW9uX0QzMl9XUkEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTlmMDFmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jCisrKyAvZGV2L251bGwKQEAgLTEsMzA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJBR0MuaCIKLSNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIERlZmluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBWT0xfVENfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEgICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCi0jZGVmaW5lIERFQ0FZX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwICAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotI2RlZmluZSBWT0xfVENfRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMGYgICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCi0jZGVmaW5lIERFQ0FZX0ZBQ19GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NC4wZiAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQXBwbHkgQUdDIGFuZCBtaXggc2lnbmFscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFN0U3JjICAgLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICBfX19fX18gICAgICAgX3xfICAgICAgICBfX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgfCAgICAgIHwgICAgIHwgICB8ICAgICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTW9ub1NyYyAtLT58IEFHQyAgfC0tLS0+fCArIHwtLS0tLT58IFZvbHVtZSB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLT4gICAgKi8KLS8qICAgICAgICAgICAgIHwgR2FpbiB8ICAgICB8X19ffCAgICAgIHwgR2FpbiAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAqLwotLyogICAgICAgICAgICAgfF9fX19fX3wgICAgICAgICAgICAgICAgfF9fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAvfFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX19fXyAgICAgX19fX19fX18gICAgfCAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgIHwgICAgICAgIHwgICB8ICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCBBR0MgR2FpbiB8PC0tfCBQZWFrICAgfDwtLXwgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVwZGF0ZSAgIHwgICB8IERldGVjdCB8ICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX19fX19ffCAgIHxfX19fX19fX3wgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFN0ZXJlb0luICAgICAgICAgICAgICAgU3RlcmVvIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTW9ub0luICAgICAgICAgICAgICAgICBNb25vIGJhbmQgcGFzcyBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBTdGVyZW9PdXQgICAgICAgICAgICAgIFN0ZXJlbyBkZXN0aW5hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQlVJTERfRkxPQVQKLXZvaWQgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX3QgICpwSW5zdGFuY2UsICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgICAqcFN0U3JjLCAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAgICAgICAgKnBNb25vU3JjLCAgICAgIC8qIE1vbm8gc291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAqcERzdCwgICAgICAgICAgLyogU3RlcmVvIGRlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKSAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KLXsKLQotICAgIC8qCi0gICAgICogR2VuZXJhbCB2YXJpYWJsZXMKLSAgICAgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgaW5kZXggKi8KLSAgICBMVk1fSU5UMzIgICAgICAgTGVmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IHNhbXBsZSAqLwotICAgIExWTV9JTlQzMiAgICAgICBSaWdodDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJpZ2h0IHNhbXBsZSAqLwotICAgIExWTV9JTlQzMiAgICAgICBNb25vOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vbm8gc2FtcGxlICovCi0gICAgTFZNX0lOVDMyICAgICAgIEFic1BlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWJzb2x1dGUgcGVhayBzaWduYWwgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgSGlnaFdvcmQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHdvcmQgaW4gaW50ZXJtZWRpYXRlIGNhbGN1bGF0aW9ucyAqLwotICAgIExWTV9JTlQzMiAgICAgICBMb3dXb3JkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyB3b3JkIGluIGludGVybWVkaWF0ZSBjYWxjdWxhdGlvbnMgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgQUdDX011bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBBR0MgZ2FpbiAqLwotICAgIExWTV9JTlQxNiAgICAgICBWb2xfTXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IHZvbHVtZSAqLwotCi0KLSAgICAvKgotICAgICAqIEluc3RhbmNlIGNvbnRyb2wgdmFyaWFibGVzCi0gICAgICovCi0gICAgTFZNX0lOVDMyICAgICAgQUdDX0dhaW4gICAgICA9IHBJbnN0YW5jZS0+QUdDX0dhaW47ICAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IEFHQyBnYWluICovCi0gICAgTFZNX0lOVDMyICAgICAgQUdDX01heEdhaW4gICA9IHBJbnN0YW5jZS0+QUdDX01heEdhaW47ICAgICAgLyogR2V0IG1heGltdW0gQUdDIGdhaW4gKi8KLSAgICBMVk1fSU5UMTYgICAgICBBR0NfR2FpblNoaWZ0ID0gcEluc3RhbmNlLT5BR0NfR2FpblNoaWZ0OyAgICAvKiBHZXQgdGhlIEFHQyBzaGlmdCAqLwotICAgIExWTV9JTlQxNiAgICAgIEFHQ19BdHRhY2sgICAgPSBwSW5zdGFuY2UtPkFHQ19BdHRhY2s7ICAgICAgIC8qIEF0dGFjayBzY2FsZXIgKi8KLSAgICBMVk1fSU5UMTYgICAgICBBR0NfRGVjYXkgICAgID0gcEluc3RhbmNlLT5BR0NfRGVjYXk7ICAgICAgICAvKiBEZWNheSBzY2FsZXIgKi8KLSAgICBMVk1fSU5UMzIgICAgICBBR0NfVGFyZ2V0ICAgID0gcEluc3RhbmNlLT5BR0NfVGFyZ2V0OyAgICAgICAvKiBHZXQgdGhlIHRhcmdldCBsZXZlbCAqLwotICAgIExWTV9JTlQzMiAgICAgIFZvbF9DdXJyZW50ICAgPSBwSW5zdGFuY2UtPlZvbHVtZTsgICAgICAgICAgIC8qIEFjdHVhbCB2b2x1bWUgc2V0dGluZyAqLwotICAgIExWTV9JTlQzMiAgICAgIFZvbF9UYXJnZXQgICAgPSBwSW5zdGFuY2UtPlRhcmdldDsgICAgICAgICAgIC8qIFRhcmdldCB2b2x1bWUgc2V0dGluZyAqLwotICAgIExWTV9JTlQxNiAgICAgIFZvbF9TaGlmdCAgICAgPSBwSW5zdGFuY2UtPlZvbHVtZVNoaWZ0OyAgICAgIC8qIFZvbHVtZSBzaGlmdCBzY2FsaW5nICovCi0gICAgTFZNX0lOVDE2ICAgICAgVm9sX1RDICAgICAgICA9IHBJbnN0YW5jZS0+Vm9sdW1lVEM7ICAgICAgICAgLyogVGltZSBjb25zdGFudCAqLwotCi0KLSAgICAvKgotICAgICAqIFByb2Nlc3Mgb24gYSBzYW1wbGUgYnkgc2FtcGxlIGJhc2lzCi0gICAgICovCi0gICAgZm9yIChpPTA7aTxOdW1TYW1wbGVzO2krKykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yIGVhY2ggc2FtcGxlICovCi0gICAgewotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0aGUgc2hvcnQgc2NhbGVycwotICAgICAgICAgKi8KLSAgICAgICAgQUdDX011bHQgICAgPSAoTFZNX0lOVDE2KShBR0NfR2FpbiA+PiAxNik7ICAgICAgICAgICAgICAvKiBHZXQgdGhlIHNob3J0IEFHQyBnYWluICovCi0gICAgICAgIFZvbF9NdWx0ICAgID0gKExWTV9JTlQxNikoVm9sX0N1cnJlbnQgPj4gMTYpOyAgICAgICAgICAgLyogR2V0IHRoZSBzaG9ydCB2b2x1bWUgZ2FpbiAqLwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRoZSBpbnB1dCBzYW1wbGVzCi0gICAgICAgICAqLwotICAgICAgICBMZWZ0ICA9ICpwU3RTcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbGVmdCBzYW1wbGUgKi8KLSAgICAgICAgUmlnaHQgPSAqcFN0U3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHJpZ2h0IHNhbXBsZSAqLwotICAgICAgICBNb25vICA9ICpwTW9ub1NyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbW9ubyBzYW1wbGUgKi8KLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEFwcGx5IHRoZSBBR0MgZ2FpbiB0byB0aGUgbW9ubyBpbnB1dCBhbmQgbWl4IHdpdGggdGhlIHN0ZXJlbyBzaWduYWwKLSAgICAgICAgICovCi0gICAgICAgIEhpZ2hXb3JkID0gKEFHQ19NdWx0ICogKE1vbm8gPj4gMTYpKTsgICAgICAgICAgICAgICAgICAgLyogc2lnbmVkIGxvbmcgKE1vbm8pIGJ5IHVuc2lnbmVkIHNob3J0IChBR0NfTXVsdCkgbXVsdGlwbHkgKi8KLSAgICAgICAgTG93V29yZCA9IChBR0NfTXVsdCAqIChNb25vICYgMHhmZmZmKSk7Ci0gICAgICAgIE1vbm8gPSAoSGlnaFdvcmQgKyAoTG93V29yZCA+PiAxNikpIDw8IChBR0NfR2FpblNoaWZ0KTsKLSAgICAgICAgTGVmdCAgKz0gTW9ubzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNaXggaW4gdGhlIG1vbm8gc2lnbmFsICovCi0gICAgICAgIFJpZ2h0ICs9IE1vbm87Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSB0aGUgdm9sdW1lIGFuZCB3cml0ZSB0byB0aGUgb3V0cHV0IHN0cmVhbQotICAgICAgICAgKi8KLSAgICAgICAgSGlnaFdvcmQgPSAoVm9sX011bHQgKiAoTGVmdCA+PiAxNikpOyAgICAgICAgICAgICAgICAgICAvKiBzaWduZWQgbG9uZyAoTGVmdCkgYnkgdW5zaWduZWQgc2hvcnQgKFZvbF9NdWx0KSBtdWx0aXBseSAqLwotICAgICAgICBMb3dXb3JkID0gKFZvbF9NdWx0ICogKExlZnQgJiAweGZmZmYpKTsKLSAgICAgICAgTGVmdCA9IChIaWdoV29yZCArIChMb3dXb3JkID4+IDE2KSkgPDwgKFZvbF9TaGlmdCk7Ci0gICAgICAgIEhpZ2hXb3JkID0gKFZvbF9NdWx0ICogKFJpZ2h0ID4+IDE2KSk7ICAgICAgICAgICAgICAgICAgLyogc2lnbmVkIGxvbmcgKFJpZ2h0KSBieSB1bnNpZ25lZCBzaG9ydCAoVm9sX011bHQpIG11bHRpcGx5ICovCi0gICAgICAgIExvd1dvcmQgPSAoVm9sX011bHQgKiAoUmlnaHQgJiAweGZmZmYpKTsKLSAgICAgICAgUmlnaHQgPSAoSGlnaFdvcmQgKyAoTG93V29yZCA+PiAxNikpIDw8IChWb2xfU2hpZnQpOwotICAgICAgICAqcERzdCsrID0gTGVmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgdGhlIHJlc3VsdHMgKi8KLSAgICAgICAgKnBEc3QrKyA9IFJpZ2h0OwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogVXBkYXRlIHRoZSBBR0MgZ2FpbgotICAgICAgICAgKi8KLSAgICAgICAgQWJzUGVhayA9IChBYnNfMzIoTGVmdCk+QWJzXzMyKFJpZ2h0KSkgPyBBYnNfMzIoTGVmdCkgOiBBYnNfMzIoUmlnaHQpOyAgLyogR2V0IHRoZSBhYnNvbHV0ZSBwZWFrICovCi0gICAgICAgIGlmIChBYnNQZWFrID4gQUdDX1RhcmdldCkKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRoZSBzaWduYWwgaXMgdG9vIGxhcmdlIHNvIGRlY3JlYXNlIHRoZSBnYWluCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEhpZ2hXb3JkID0gKEFHQ19BdHRhY2sgKiAoQUdDX0dhaW4gPj4gMTYpKTsgICAgICAgICAvKiBzaWduZWQgbG9uZyAoQUdDX0dhaW4pIGJ5IHVuc2lnbmVkIHNob3J0IChBR0NfQXR0YWNrKSBtdWx0aXBseSAqLwotICAgICAgICAgICAgTG93V29yZCA9IChBR0NfQXR0YWNrICogKEFHQ19HYWluICYgMHhmZmZmKSk7Ci0gICAgICAgICAgICBBR0NfR2FpbiA9IChIaWdoV29yZCArIChMb3dXb3JkID4+IDE2KSkgPDwgMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUaGUgc2lnbmFsIGlzIHRvbyBzbWFsbCBzbyBpbmNyZWFzZSB0aGUgZ2FpbgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoQUdDX0dhaW4gPiBBR0NfTWF4R2FpbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBR0NfR2FpbiAtPSAoQUdDX0RlY2F5IDw8IERFQ0FZX1NISUZUKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBR0NfR2FpbiArPSAoQUdDX0RlY2F5IDw8IERFQ0FZX1NISUZUKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFVwZGF0ZSB0aGUgZ2FpbgotICAgICAgICAgKi8KLSAgICAgICAgVm9sX0N1cnJlbnQgKz0gVm9sX1RDICogKChWb2xfVGFyZ2V0IC0gVm9sX0N1cnJlbnQpID4+IFZPTF9UQ19TSElGVCk7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIFVwZGF0ZSB0aGUgcGFyYW1ldGVycwotICAgICAqLwotICAgIHBJbnN0YW5jZS0+Vm9sdW1lID0gVm9sX0N1cnJlbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFjdHVhbCB2b2x1bWUgc2V0dGluZyAqLwotICAgIHBJbnN0YW5jZS0+QUdDX0dhaW4gPSBBR0NfR2FpbjsKLQotICAgIHJldHVybjsKLX0KLSNlbHNlCi12b2lkIEFHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQShBR0NfTUlYX1ZPTF8yU3QxTW9uX0ZMT0FUX3QgICpwSW5zdGFuY2UsICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcFN0U3JjLCAgICAgICAgLyogU3RlcmVvIHNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBNb25vU3JjLCAgICAgIC8qIE1vbm8gc291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcERzdCwgICAgICAgICAgLyogU3RlcmVvIGRlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKSAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgKi8KLXsKLQotICAgIC8qCi0gICAgICogR2VuZXJhbCB2YXJpYWJsZXMKLSAgICAgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgaW5kZXggKi8KLSAgICBMVk1fRkxPQVQgICAgICAgTGVmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IHNhbXBsZSAqLwotICAgIExWTV9GTE9BVCAgICAgICBSaWdodDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFJpZ2h0IHNhbXBsZSAqLwotICAgIExWTV9GTE9BVCAgICAgICBNb25vOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1vbm8gc2FtcGxlICovCi0gICAgTFZNX0ZMT0FUICAgICAgIEFic1BlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWJzb2x1dGUgcGVhayBzaWduYWwgKi8KLSAgICBMVk1fRkxPQVQgICAgICAgQUdDX011bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCBBR0MgZ2FpbiAqLwotICAgIExWTV9GTE9BVCAgICAgICBWb2xfTXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IHZvbHVtZSAqLwotCi0KLSAgICAvKgotICAgICAqIEluc3RhbmNlIGNvbnRyb2wgdmFyaWFibGVzCi0gICAgICovCi0gICAgTFZNX0ZMT0FUICAgICAgQUdDX0dhaW4gICAgICA9IHBJbnN0YW5jZS0+QUdDX0dhaW47ICAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IEFHQyBnYWluICovCi0gICAgTFZNX0ZMT0FUICAgICAgQUdDX01heEdhaW4gICA9IHBJbnN0YW5jZS0+QUdDX01heEdhaW47ICAgICAgLyogR2V0IG1heGltdW0gQUdDIGdhaW4gKi8KLSAgICBMVk1fRkxPQVQgICAgICBBR0NfQXR0YWNrICAgID0gcEluc3RhbmNlLT5BR0NfQXR0YWNrOyAgICAgICAvKiBBdHRhY2sgc2NhbGVyICovCi0gICAgTFZNX0ZMT0FUICAgICAgQUdDX0RlY2F5ICAgICA9IChwSW5zdGFuY2UtPkFHQ19EZWNheSAqICgxIDw8IChERUNBWV9TSElGVCkpKTsvKiBEZWNheSBzY2FsZXIgKi8KLSAgICBMVk1fRkxPQVQgICAgICBBR0NfVGFyZ2V0ICAgID0gcEluc3RhbmNlLT5BR0NfVGFyZ2V0OyAgICAgICAvKiBHZXQgdGhlIHRhcmdldCBsZXZlbCAqLwotICAgIExWTV9GTE9BVCAgICAgIFZvbF9DdXJyZW50ICAgPSBwSW5zdGFuY2UtPlZvbHVtZTsgICAgICAgICAgIC8qIEFjdHVhbCB2b2x1bWUgc2V0dGluZyAqLwotICAgIExWTV9GTE9BVCAgICAgIFZvbF9UYXJnZXQgICAgPSBwSW5zdGFuY2UtPlRhcmdldDsgICAgICAgICAgIC8qIFRhcmdldCB2b2x1bWUgc2V0dGluZyAqLwotICAgIExWTV9GTE9BVCAgICAgIFZvbF9UQyAgICAgICAgPSBwSW5zdGFuY2UtPlZvbHVtZVRDOyAgICAgICAgIC8qIFRpbWUgY29uc3RhbnQgKi8KLQotCi0gICAgLyoKLSAgICAgKiBQcm9jZXNzIG9uIGEgc2FtcGxlIGJ5IHNhbXBsZSBiYXNpcwotICAgICAqLwotICAgIGZvciAoaSA9IDA7IGkgPCBOdW1TYW1wbGVzOyBpKyspICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciBlYWNoIHNhbXBsZSAqLwotICAgIHsKLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdGhlIHNob3J0IHNjYWxlcnMKLSAgICAgICAgICovCi0gICAgICAgIEFHQ19NdWx0ICAgID0gKExWTV9GTE9BVCkoQUdDX0dhaW4pOyAgICAgICAgICAgICAgLyogR2V0IHRoZSBzaG9ydCBBR0MgZ2FpbiAqLwotICAgICAgICBWb2xfTXVsdCAgICA9IChMVk1fRkxPQVQpKFZvbF9DdXJyZW50KTsgICAgICAgICAgIC8qIEdldCB0aGUgc2hvcnQgdm9sdW1lIGdhaW4gKi8KLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0aGUgaW5wdXQgc2FtcGxlcwotICAgICAgICAgKi8KLSAgICAgICAgTGVmdCAgPSAqcFN0U3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIGxlZnQgc2FtcGxlICovCi0gICAgICAgIFJpZ2h0ID0gKnBTdFNyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSByaWdodCBzYW1wbGUgKi8KLSAgICAgICAgTW9ubyAgPSAqcE1vbm9TcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG1vbm8gc2FtcGxlICovCi0KLQotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSB0aGUgQUdDIGdhaW4gdG8gdGhlIG1vbm8gaW5wdXQgYW5kIG1peCB3aXRoIHRoZSBzdGVyZW8gc2lnbmFsCi0gICAgICAgICAqLwotICAgICAgICBMZWZ0ICArPSAoTW9ubyAqIEFHQ19NdWx0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWl4IGluIHRoZSBtb25vIHNpZ25hbCAqLwotICAgICAgICBSaWdodCArPSAoTW9ubyAqIEFHQ19NdWx0KTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSB0aGUgdm9sdW1lIGFuZCB3cml0ZSB0byB0aGUgb3V0cHV0IHN0cmVhbQotICAgICAgICAgKi8KLSAgICAgICAgTGVmdCAgPSBMZWZ0ICAqIFZvbF9NdWx0OwotICAgICAgICBSaWdodCA9IFJpZ2h0ICogVm9sX011bHQ7Ci0gICAgICAgICpwRHN0KysgPSBMZWZ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB0aGUgcmVzdWx0cyAqLwotICAgICAgICAqcERzdCsrID0gUmlnaHQ7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVXBkYXRlIHRoZSBBR0MgZ2FpbgotICAgICAgICAgKi8KLSAgICAgICAgQWJzUGVhayA9IEFic19GbG9hdChMZWZ0KSA+IEFic19GbG9hdChSaWdodCkgPyBBYnNfRmxvYXQoTGVmdCkgOiBBYnNfRmxvYXQoUmlnaHQpOwotICAgICAgICBpZiAoQWJzUGVhayA+IEFHQ19UYXJnZXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUaGUgc2lnbmFsIGlzIHRvbyBsYXJnZSBzbyBkZWNyZWFzZSB0aGUgZ2FpbgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBBR0NfR2FpbiA9IEFHQ19HYWluICogQUdDX0F0dGFjazsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBUaGUgc2lnbmFsIGlzIHRvbyBzbWFsbCBzbyBpbmNyZWFzZSB0aGUgZ2FpbgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBpZiAoQUdDX0dhaW4gPiBBR0NfTWF4R2FpbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBR0NfR2FpbiAtPSAoQUdDX0RlY2F5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBR0NfR2FpbiArPSAoQUdDX0RlY2F5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFVwZGF0ZSB0aGUgZ2FpbgotICAgICAgICAgKi8KLSAgICAgICAgVm9sX0N1cnJlbnQgKz0gIChWb2xfVGFyZ2V0IC0gVm9sX0N1cnJlbnQpICogKChMVk1fRkxPQVQpVm9sX1RDIC8gVk9MX1RDX0ZMT0FUKTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogVXBkYXRlIHRoZSBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgcEluc3RhbmNlLT5Wb2x1bWUgPSBWb2xfQ3VycmVudDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCi0gICAgcEluc3RhbmNlLT5BR0NfR2FpbiA9IEFHQ19HYWluOwotCi0gICAgcmV0dXJuOwotfQotI2VuZGlmIC8qQlVJTERfRkxPQVQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTE4YWE3OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FHQ19NSVhfVk9MXzJTdDFNb25fRDMyX1dSQS5jcHAKQEAgLTAsMCArMSwzMTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJBR0MuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBEZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVk9MX1RDX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIxICAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworI2RlZmluZSBERUNBWV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCAgICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCisjZGVmaW5lIFZPTF9UQ19GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wZiAgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KKyNkZWZpbmUgREVDQVlfRkFDX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0LjBmICAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQXBwbHkgQUdDIGFuZCBtaXggc2lnbmFscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFN0U3JjICAgLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICBfX19fX18gICAgICAgX3xfICAgICAgICBfX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgfCAgICAgIHwgICAgIHwgICB8ICAgICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9ub1NyYyAtLT58IEFHQyAgfC0tLS0+fCArIHwtLS0tLT58IFZvbHVtZSB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLT4gICAgKi8KKy8qICAgICAgICAgICAgIHwgR2FpbiB8ICAgICB8X19ffCAgICAgIHwgR2FpbiAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAqLworLyogICAgICAgICAgICAgfF9fX19fX3wgICAgICAgICAgICAgICAgfF9fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAvfFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX19fXyAgICAgX19fX19fX18gICAgfCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgIHwgICAgICAgIHwgICB8ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCBBR0MgR2FpbiB8PC0tfCBQZWFrICAgfDwtLXwgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVwZGF0ZSAgIHwgICB8IERldGVjdCB8ICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX19fX19ffCAgIHxfX19fX19fX3wgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFN0ZXJlb0luICAgICAgICAgICAgICAgU3RlcmVvIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTW9ub0luICAgICAgICAgICAgICAgICBNb25vIGJhbmQgcGFzcyBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBTdGVyZW9PdXQgICAgICAgICAgICAgIFN0ZXJlbyBkZXN0aW5hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQUdDX01JWF9WT0xfMlN0MU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCAgKnBJbnN0YW5jZSwgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwU3RTcmMsICAgICAgICAvKiBTdGVyZW8gc291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1vbm9TcmMsICAgICAgLyogTW9ubyBzb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICpwRHN0LCAgICAgICAgICAvKiBTdGVyZW8gZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLworeworCisgICAgLyoKKyAgICAgKiBHZW5lcmFsIHZhcmlhYmxlcworICAgICAqLworICAgIExWTV9VSU5UMTYgICAgICBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZSBpbmRleCAqLworICAgIExWTV9GTE9BVCAgICAgICBMZWZ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgc2FtcGxlICovCisgICAgTFZNX0ZMT0FUICAgICAgIFJpZ2h0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUmlnaHQgc2FtcGxlICovCisgICAgTFZNX0ZMT0FUICAgICAgIE1vbm87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTW9ubyBzYW1wbGUgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgQWJzUGVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBYnNvbHV0ZSBwZWFrIHNpZ25hbCAqLworICAgIExWTV9GTE9BVCAgICAgICBBR0NfTXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3J0IEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgIFZvbF9NdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvcnQgdm9sdW1lICovCisKKyAgICAvKgorICAgICAqIEluc3RhbmNlIGNvbnRyb2wgdmFyaWFibGVzCisgICAgICovCisgICAgTFZNX0ZMT0FUICAgICAgQUdDX0dhaW4gICAgICA9IHBJbnN0YW5jZS0+QUdDX0dhaW47ICAgICAgICAgLyogR2V0IHRoZSBjdXJyZW50IEFHQyBnYWluICovCisgICAgTFZNX0ZMT0FUICAgICAgQUdDX01heEdhaW4gICA9IHBJbnN0YW5jZS0+QUdDX01heEdhaW47ICAgICAgLyogR2V0IG1heGltdW0gQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfQXR0YWNrICAgID0gcEluc3RhbmNlLT5BR0NfQXR0YWNrOyAgICAgICAvKiBBdHRhY2sgc2NhbGVyICovCisgICAgTFZNX0ZMT0FUICAgICAgQUdDX0RlY2F5ICAgICA9IChwSW5zdGFuY2UtPkFHQ19EZWNheSAqICgxIDw8IChERUNBWV9TSElGVCkpKTsvKiBEZWNheSBzY2FsZXIgKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfVGFyZ2V0ICAgID0gcEluc3RhbmNlLT5BR0NfVGFyZ2V0OyAgICAgICAvKiBHZXQgdGhlIHRhcmdldCBsZXZlbCAqLworICAgIExWTV9GTE9BVCAgICAgIFZvbF9DdXJyZW50ICAgPSBwSW5zdGFuY2UtPlZvbHVtZTsgICAgICAgICAgIC8qIEFjdHVhbCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9GTE9BVCAgICAgIFZvbF9UYXJnZXQgICAgPSBwSW5zdGFuY2UtPlRhcmdldDsgICAgICAgICAgIC8qIFRhcmdldCB2b2x1bWUgc2V0dGluZyAqLworICAgIExWTV9GTE9BVCAgICAgIFZvbF9UQyAgICAgICAgPSBwSW5zdGFuY2UtPlZvbHVtZVRDOyAgICAgICAgIC8qIFRpbWUgY29uc3RhbnQgKi8KKworICAgIC8qCisgICAgICogUHJvY2VzcyBvbiBhIHNhbXBsZSBieSBzYW1wbGUgYmFzaXMKKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTnVtU2FtcGxlczsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgZWFjaCBzYW1wbGUgKi8KKyAgICB7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBzaG9ydCBzY2FsZXJzCisgICAgICAgICAqLworICAgICAgICBBR0NfTXVsdCAgICA9IChMVk1fRkxPQVQpKEFHQ19HYWluKTsgICAgICAgICAgICAgIC8qIEdldCB0aGUgc2hvcnQgQUdDIGdhaW4gKi8KKyAgICAgICAgVm9sX011bHQgICAgPSAoTFZNX0ZMT0FUKShWb2xfQ3VycmVudCk7ICAgICAgICAgICAvKiBHZXQgdGhlIHNob3J0IHZvbHVtZSBnYWluICovCisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBpbnB1dCBzYW1wbGVzCisgICAgICAgICAqLworICAgICAgICBMZWZ0ICA9ICpwU3RTcmMrKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbGVmdCBzYW1wbGUgKi8KKyAgICAgICAgUmlnaHQgPSAqcFN0U3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIHJpZ2h0IHNhbXBsZSAqLworICAgICAgICBNb25vICA9ICpwTW9ub1NyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbW9ubyBzYW1wbGUgKi8KKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgQUdDIGdhaW4gdG8gdGhlIG1vbm8gaW5wdXQgYW5kIG1peCB3aXRoIHRoZSBzdGVyZW8gc2lnbmFsCisgICAgICAgICAqLworICAgICAgICBMZWZ0ICArPSAoTW9ubyAqIEFHQ19NdWx0KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTWl4IGluIHRoZSBtb25vIHNpZ25hbCAqLworICAgICAgICBSaWdodCArPSAoTW9ubyAqIEFHQ19NdWx0KTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgdm9sdW1lIGFuZCB3cml0ZSB0byB0aGUgb3V0cHV0IHN0cmVhbQorICAgICAgICAgKi8KKyAgICAgICAgTGVmdCAgPSBMZWZ0ICAqIFZvbF9NdWx0OworICAgICAgICBSaWdodCA9IFJpZ2h0ICogVm9sX011bHQ7CisgICAgICAgICpwRHN0KysgPSBMZWZ0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2F2ZSB0aGUgcmVzdWx0cyAqLworICAgICAgICAqcERzdCsrID0gUmlnaHQ7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogVXBkYXRlIHRoZSBBR0MgZ2FpbgorICAgICAgICAgKi8KKyAgICAgICAgQWJzUGVhayA9IEFic19GbG9hdChMZWZ0KSA+IEFic19GbG9hdChSaWdodCkgPyBBYnNfRmxvYXQoTGVmdCkgOiBBYnNfRmxvYXQoUmlnaHQpOworICAgICAgICBpZiAoQWJzUGVhayA+IEFHQ19UYXJnZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgc2lnbmFsIGlzIHRvbyBsYXJnZSBzbyBkZWNyZWFzZSB0aGUgZ2FpbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBBR0NfR2FpbiA9IEFHQ19HYWluICogQUdDX0F0dGFjazsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgc2lnbmFsIGlzIHRvbyBzbWFsbCBzbyBpbmNyZWFzZSB0aGUgZ2FpbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoQUdDX0dhaW4gPiBBR0NfTWF4R2FpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBR0NfR2FpbiAtPSAoQUdDX0RlY2F5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBR0NfR2FpbiArPSAoQUdDX0RlY2F5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgZ2FpbgorICAgICAgICAgKi8KKyAgICAgICAgVm9sX0N1cnJlbnQgKz0gIChWb2xfVGFyZ2V0IC0gVm9sX0N1cnJlbnQpICogKChMVk1fRkxPQVQpVm9sX1RDIC8gVk9MX1RDX0ZMT0FUKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgcGFyYW1ldGVycworICAgICAqLworICAgIHBJbnN0YW5jZS0+Vm9sdW1lID0gVm9sX0N1cnJlbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFjdHVhbCB2b2x1bWUgc2V0dGluZyAqLworICAgIHBJbnN0YW5jZS0+QUdDX0dhaW4gPSBBR0NfR2FpbjsKKworICAgIHJldHVybjsKK30KKyNpZmRlZiBTVVBQT1JUX01DCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgQUdDX01JWF9WT0xfTWMxTW9uX0QzMl9XUkEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQXBwbHkgQUdDIGFuZCBtaXggc2lnbmFscyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE1jU3JjICAgLS0tLS0tLS0tLS0tLS0tLS0tfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICBfX19fX18gICAgICAgX3xfICAgICAgICBfX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgfCAgICAgIHwgICAgIHwgICB8ICAgICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTW9ub1NyYyAtLT58IEFHQyAgfC0tLS0+fCArIHwtLS0tLT58IFZvbHVtZSB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKy0tLT4gICAgKi8KKy8qICAgICAgICAgICAgIHwgR2FpbiB8ICAgICB8X19ffCAgICAgIHwgR2FpbiAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAqLworLyogICAgICAgICAgICAgfF9fX19fX3wgICAgICAgICAgICAgICAgfF9fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAvfFwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX19fXyAgICAgX19fX19fX18gICAgfCAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgIHwgICAgICAgIHwgICB8ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfCBBR0MgR2FpbiB8PC0tfCBQZWFrICAgfDwtLXwgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IFVwZGF0ZSAgIHwgICB8IERldGVjdCB8ICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX19fX19ffCAgIHxfX19fX19fX3wgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1jU3JjICAgICAgICAgICAgICAgICAgTXVsdGljaGFubmVsIHNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTW9ub1NyYyAgICAgICAgICAgICAgICBNb25vIGJhbmQgcGFzcyBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBEc3QgICAgICAgICAgICAgICAgICAgIE11bHRpY2hhbm5lbCBkZXN0aW5hdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnJGcmFtZXMgICAgICAgICAgICAgICAgTnVtYmVyIG9mIGZyYW1lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOckNoYW5uZWxzICAgICAgICAgICAgICBOdW1iZXIgb2YgY2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBWb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEFHQ19NSVhfVk9MX01jMU1vbl9EMzJfV1JBKEFHQ19NSVhfVk9MXzJTdDFNb25fRkxPQVRfdCAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICpwTWNTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcE1vbm9TcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcERzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnJDaGFubmVscykKK3sKKworICAgIC8qCisgICAgICogR2VuZXJhbCB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBMVk1fVUlOVDE2ICAgICAgaSwgamo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgaW5kZXggKi8KKyAgICBMVk1fRkxPQVQgICAgICAgU2FtcGxlVmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgdmFsdWUgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgTW9ubzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBNb25vIHNhbXBsZSAqLworICAgIExWTV9GTE9BVCAgICAgICBBYnNQZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEFic29sdXRlIHBlYWsgc2lnbmFsICovCisgICAgTFZNX0ZMT0FUICAgICAgIEFHQ19NdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hvcnQgQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgICAgICAgVm9sX011bHQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaG9ydCB2b2x1bWUgKi8KKworICAgIC8qCisgICAgICogSW5zdGFuY2UgY29udHJvbCB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfR2FpbiAgICAgID0gcEluc3RhbmNlLT5BR0NfR2FpbjsgICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgQUdDIGdhaW4gKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfTWF4R2FpbiAgID0gcEluc3RhbmNlLT5BR0NfTWF4R2FpbjsgICAgICAvKiBHZXQgbWF4aW11bSBBR0MgZ2FpbiAqLworICAgIExWTV9GTE9BVCAgICAgIEFHQ19BdHRhY2sgICAgPSBwSW5zdGFuY2UtPkFHQ19BdHRhY2s7ICAgICAgIC8qIEF0dGFjayBzY2FsZXIgKi8KKyAgICAvKiBEZWNheSBzY2FsZXIgKi8KKyAgICBMVk1fRkxPQVQgICAgICBBR0NfRGVjYXkgICAgID0gKHBJbnN0YW5jZS0+QUdDX0RlY2F5ICogKDEgPDwgKERFQ0FZX1NISUZUKSkpOworICAgIExWTV9GTE9BVCAgICAgIEFHQ19UYXJnZXQgICAgPSBwSW5zdGFuY2UtPkFHQ19UYXJnZXQ7ICAgICAgIC8qIEdldCB0aGUgdGFyZ2V0IGxldmVsICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX0N1cnJlbnQgICA9IHBJbnN0YW5jZS0+Vm9sdW1lOyAgICAgICAgICAgLyogQWN0dWFsIHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX1RhcmdldCAgICA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAgICAgICAgICAgLyogVGFyZ2V0IHZvbHVtZSBzZXR0aW5nICovCisgICAgTFZNX0ZMT0FUICAgICAgVm9sX1RDICAgICAgICA9IHBJbnN0YW5jZS0+Vm9sdW1lVEM7ICAgICAgICAgLyogVGltZSBjb25zdGFudCAqLworCisgICAgLyoKKyAgICAgKiBQcm9jZXNzIG9uIGEgc2FtcGxlIGJ5IHNhbXBsZSBiYXNpcworICAgICAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOckZyYW1lczsgaSsrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3IgZWFjaCBmcmFtZSAqLworICAgIHsKKworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIHNjYWxlcnMKKyAgICAgICAgICovCisgICAgICAgIEFHQ19NdWx0ICAgID0gKExWTV9GTE9BVCkoQUdDX0dhaW4pOyAgICAgICAgICAgICAgLyogR2V0IHRoZSBBR0MgZ2FpbiAqLworICAgICAgICBWb2xfTXVsdCAgICA9IChMVk1fRkxPQVQpKFZvbF9DdXJyZW50KTsgICAgICAgICAgIC8qIEdldCB0aGUgdm9sdW1lIGdhaW4gKi8KKworICAgICAgICBBYnNQZWFrID0gMC4wZjsKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBpbnB1dCBzYW1wbGVzCisgICAgICAgICAqLworICAgICAgICBmb3IgKGpqID0gMDsgamogPCBOckNoYW5uZWxzOyBqaisrKQorICAgICAgICB7CisgICAgICAgICAgICBTYW1wbGVWYWwgID0gKnBNY1NyYysrOyAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBzYW1wbGUgdmFsdWUgb2YgamogQ2hhbm5lbCovCisgICAgICAgICAgICBNb25vICAgICAgID0gKnBNb25vU3JjOyAgICAgICAgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBtb25vIHNhbXBsZSAqLworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgdGhlIEFHQyBnYWluIHRvIHRoZSBtb25vIGlucHV0IGFuZCBtaXggd2l0aCB0aGUgaW5wdXQgc2lnbmFsCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIFNhbXBsZVZhbCAgKz0gKE1vbm8gKiBBR0NfTXVsdCk7ICAgICAgICAgICAgICAgICAgICAgICAgLyogTWl4IGluIHRoZSBtb25vIHNpZ25hbCAqLworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgdGhlIHZvbHVtZSBhbmQgd3JpdGUgdG8gdGhlIG91dHB1dCBzdHJlYW0KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgU2FtcGxlVmFsICA9IFNhbXBsZVZhbCAgKiBWb2xfTXVsdDsKKworICAgICAgICAgICAgKnBEc3QrKyA9IFNhbXBsZVZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhdmUgdGhlIHJlc3VsdHMgKi8KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFVwZGF0ZSB0aGUgQUdDIGdhaW4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQWJzUGVhayA9IEFic19GbG9hdChTYW1wbGVWYWwpID4gQWJzUGVhayA/IEFic19GbG9hdChTYW1wbGVWYWwpIDogQWJzUGVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoQWJzUGVhayA+IEFHQ19UYXJnZXQpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgc2lnbmFsIGlzIHRvbyBsYXJnZSBzbyBkZWNyZWFzZSB0aGUgZ2FpbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBBR0NfR2FpbiA9IEFHQ19HYWluICogQUdDX0F0dGFjazsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBUaGUgc2lnbmFsIGlzIHRvbyBzbWFsbCBzbyBpbmNyZWFzZSB0aGUgZ2FpbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAoQUdDX0dhaW4gPiBBR0NfTWF4R2FpbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBR0NfR2FpbiAtPSAoQUdDX0RlY2F5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBR0NfR2FpbiArPSAoQUdDX0RlY2F5KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwTW9ub1NyYysrOworICAgICAgICAvKgorICAgICAgICAgKiBVcGRhdGUgdGhlIGdhaW4KKyAgICAgICAgICovCisgICAgICAgIFZvbF9DdXJyZW50ICs9ICAoVm9sX1RhcmdldCAtIFZvbF9DdXJyZW50KSAqICgoTFZNX0ZMT0FUKVZvbF9UQyAvIFZPTF9UQ19GTE9BVCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPlZvbHVtZSA9IFZvbF9DdXJyZW50OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBY3R1YWwgdm9sdW1lIHNldHRpbmcgKi8KKyAgICBwSW5zdGFuY2UtPkFHQ19HYWluID0gQUdDX0dhaW47CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLypTVVBQT1JUX01DKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Fic18zMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWJzXzMyLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0ZmFiZDguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWJzXzMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KLS8qICBJbmNsdWRlIGZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCi0KLSNpbmNsdWRlICAgICJTY2FsYXJBcml0aG1ldGljLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gKiAgTmFtZSAgICAgICAgOiBBYnNfMzIoKQotICogIElucHV0ICAgICAgIDogU2lnbmVkIDMyLWJpdCBpbnRlZ2VyCi0gKiAgT3V0cHV0ICAgICAgOgotICogIFJldHVybnMgICAgIDogQWJzb2x1dGUgdmFsdWUKLSAqICBEZXNjcmlwdGlvbiA6IEFic29sdXRlIHZhbHVlIHdpdGggbWF4aW11bSBuZWdhdGl2ZSB2YWx1ZSBjb3JuZXIgY2FzZQotICogIFJlbWFya3MgICAgIDoKLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVk1fSU5UMzIgICAgQWJzXzMyKExWTV9JTlQzMiAgICBpbnB1dCkKLXsKLSAgICBpZihpbnB1dCA8ICAwKQotICAgIHsKLSAgICAgICAgaWYgKGlucHV0ID09IChMVk1fSU5UMzIpKDB4ODAwMDAwMDBVKSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogVGhlIGNvcm5lciBjYXNlLCBzbyBzZXQgdG8gdGhlIG1heGltdW0gcG9zaXRpdmUgdmFsdWUgKi8KLSAgICAgICAgICAgIGlucHV0PShMVk1fSU5UMzIpIDB4N2ZmZmZmZmY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBOZWdhdGl2ZSBpbnB1dCwgc28gaW52ZXJ0ICovCi0gICAgICAgICAgICBpbnB1dCA9IChMVk1fSU5UMzIpKC1pbnB1dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGlucHV0OwotfQotI2lmZGVmIEJVSUxEX0ZMT0FUCi1MVk1fRkxPQVQgICAgQWJzX0Zsb2F0KExWTV9GTE9BVCAgICBpbnB1dCkKLXsKLSAgICBpZihpbnB1dCA8ICAwKQotICAgIHsKLSAgICAgICAgLyogTmVnYXRpdmUgaW5wdXQsIHNvIGludmVydCAqLwotICAgICAgICBpbnB1dCA9IChMVk1fRkxPQVQpKC1pbnB1dCk7Ci0gICAgfQotICAgIHJldHVybiBpbnB1dDsKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWJzXzMyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Fic18zMi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAxMzgwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Fic18zMi5jcHAKQEAgLTAsMCArMSw1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisvKiAgSW5jbHVkZSBmaWxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMqLworCisjaW5jbHVkZSAgICAiU2NhbGFyQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5hbWUgICAgICAgIDogQWJzXzMyKCkKKyAqICBJbnB1dCAgICAgICA6IFNpZ25lZCAzMi1iaXQgaW50ZWdlcgorICogIE91dHB1dCAgICAgIDoKKyAqICBSZXR1cm5zICAgICA6IEFic29sdXRlIHZhbHVlCisgKiAgRGVzY3JpcHRpb24gOiBBYnNvbHV0ZSB2YWx1ZSB3aXRoIG1heGltdW0gbmVnYXRpdmUgdmFsdWUgY29ybmVyIGNhc2UKKyAqICBSZW1hcmtzICAgICA6CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZNX0lOVDMyICAgIEFic18zMihMVk1fSU5UMzIgICAgaW5wdXQpCit7CisgICAgaWYoaW5wdXQgPCAgMCkKKyAgICB7CisgICAgICAgIGlmIChpbnB1dCA9PSAoTFZNX0lOVDMyKSgweDgwMDAwMDAwVSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFRoZSBjb3JuZXIgY2FzZSwgc28gc2V0IHRvIHRoZSBtYXhpbXVtIHBvc2l0aXZlIHZhbHVlICovCisgICAgICAgICAgICBpbnB1dD0oTFZNX0lOVDMyKSAweDdmZmZmZmZmOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogTmVnYXRpdmUgaW5wdXQsIHNvIGludmVydCAqLworICAgICAgICAgICAgaW5wdXQgPSAoTFZNX0lOVDMyKSgtaW5wdXQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBpbnB1dDsKK30KK0xWTV9GTE9BVCAgICBBYnNfRmxvYXQoTFZNX0ZMT0FUICAgIGlucHV0KQoreworICAgIGlmKGlucHV0IDwgIDApCisgICAgeworICAgICAgICAvKiBOZWdhdGl2ZSBpbnB1dCwgc28gaW52ZXJ0ICovCisgICAgICAgIGlucHV0ID0gKExWTV9GTE9BVCkoLWlucHV0KTsKKyAgICB9CisgICAgcmV0dXJuIGlucHV0OworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMTZ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0FkZDJfU2F0XzE2eDE2LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMTZ4MTYuYwpyZW5hbWUgdG8gbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMTZ4MTYuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjZkNmFkYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREUgRklMRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBBREQyX1NBVF8zMlgzMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgQWRkMl9TYXRfMzJ4MzIoIGNvbnN0IExWTV9JTlQzMiAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCi17Ci0gICAgTFZNX0lOVDMyIGEsYixjOwotICAgIExWTV9JTlQxNiBpaTsKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIGE9KnNyYzsKLSAgICAgICAgc3JjKys7Ci0KLSAgICAgICAgYj0qZHN0OwotICAgICAgICBjPWErYjsKLSAgICAgICAgaWYgKCgoKGMgXiBhKSAmIChjIF4gYikpID4+IDMxKSE9MCkgICAgIC8qIG92ZXJmbG93IC8gdW5kZXJmbG93ICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGE8MCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjPTB4ODAwMDAwMDBMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGM9MHg3RkZGRkZGRkw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAqZHN0ID0gYzsKLSAgICAgICAgZHN0Kys7Ci0gICAgfQotICAgIHJldHVybjsKLX0KLQotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIEFkZDJfU2F0X0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQotewotICAgIExWTV9GTE9BVCBUZW1wOwotICAgIExWTV9JTlQxNiBpaTsKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkgKnNyYykgKyAoKExWTV9GTE9BVCkgKmRzdCk7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgIGlmIChUZW1wID4gMS4wMDAwMDBmKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gMS4wMDAwMDBmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wMDAwMDBmKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gLTEuMDAwMDAwZjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSBUZW1wOwotICAgICAgICB9Ci0gICAgICAgIGRzdCsrOwotICAgIH0KLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQWRkMl9TYXRfMzJ4MzIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OGU2NjgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9BZGQyX1NhdF8zMngzMi5jcHAKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gQUREMl9TQVRfMzJYMzIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEFkZDJfU2F0XzMyeDMyKCBjb25zdCBMVk1fSU5UMzIgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQoreworICAgIExWTV9JTlQzMiBhLGIsYzsKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBhPSpzcmM7CisgICAgICAgIHNyYysrOworCisgICAgICAgIGI9KmRzdDsKKyAgICAgICAgYz1hK2I7CisgICAgICAgIGlmICgoKChjIF4gYSkgJiAoYyBeIGIpKSA+PiAzMSkhPTApICAgICAvKiBvdmVyZmxvdyAvIHVuZGVyZmxvdyAqLworICAgICAgICB7CisgICAgICAgICAgICBpZihhPDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgYz0weDgwMDAwMDAwTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjPTB4N0ZGRkZGRkZMOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgKmRzdCA9IGM7CisgICAgICAgIGRzdCsrOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQgQWRkMl9TYXRfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0ZMT0FUIFRlbXA7CisgICAgTFZNX0lOVDE2IGlpOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSAqc3JjKSArICgoTFZNX0ZMT0FUKSAqZHN0KTsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgaWYgKFRlbXAgPiAxLjAwMDAwMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAxLjAwMDAwMGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjAwMDAwMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAtMS4wMDAwMDBmOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IFRlbXA7CisgICAgICAgIH0KKyAgICAgICAgZHN0Kys7CisgICAgfQorICAgIHJldHVybjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4Zjk5ODYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYworKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBBU1NVTVBUSU9OUzoKLSBDT0VGUy0KLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEwLAotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgLUIyLAotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE0IGZvcm1hdAotCi0gREVMQVlTLQotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIEJQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotCi0KLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCB5bkw7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotCi0gICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgewotCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8geW5MPSAoQTAgICogKHgobilMICAtIHgobi0yKUwgICkgKQotICAgICAgICAgICAgeW5MID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqICgoKnBEYXRhSW4pLXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSk7Ci0KLSAgICAgICAgICAgIC8vIHluTCs9ICgoLUIyICAqIHkobi0yKUwgICkgKQotICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107Ci0KLSAgICAgICAgICAgIC8vIHluTCs9ICgoLUIxICAqIHkobi0xKUwgICkgKQotICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0geW5MOyAvLyBVcGRhdGUgeShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTAotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dCsrPXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQKLQotICAgICAgICB9Ci0KLSAgICB9Ci0jZWxzZQotdm9pZCBCUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLQotCi0gICAgewotICAgICAgICBMVk1fSU5UMzIgeW5MOwotICAgICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKLQotICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgIHsKLQotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8vIHluTD0gKEEwIChRMTQpICogKHgobilMIChRMCkgLSB4KG4tMilMIChRMCkgKSApICBpbiBRMTQKLSAgICAgICAgICAgIHluTD0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0qICgoKnBEYXRhSW4pLXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSk7Ci0KLSAgICAgICAgICAgIC8vIHluTCs9ICgoLUIyIChRMTQpICogeShuLTIpTCAoUTApICkgKSBpbiBRMTQKLSAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKLQotICAgICAgICAgICAgLy8geW5MKz0gKCgtQjEgKFEzMCkgKiB5KG4tMSlMIChRMCkgKSApIGluIFExNAotICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOwotCi0gICAgICAgICAgICB5bkw9KExWTV9JTlQxNikoeW5MPj4xNCk7IC8vIHluTCBpbiBRMAotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvLyB4KG4tMilMPXgobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT15bkw7IC8vIFVwZGF0ZSB5KG4tMSlMIGluIFEwCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF09KCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTCBpbiBRMAotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dCsrPShMVk1fSU5UMTYpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAotCi0gICAgICAgIH0KLQotICAgIH0KLSNlbmRpZgotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWE1ZTA3ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmNwcApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMCwKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIC1CMiwKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExNCBmb3JtYXQKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCB5bkw7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluTD0gKEEwICAqICh4KG4pTCAgLSB4KG4tMilMICApICkKKyAgICAgICAgICAgIHluTCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiAoKCpwRGF0YUluKS1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0pOworCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMiAgKiB5KG4tMilMICApICkKKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvLyB5bkwrPSAoKC1CMSAgKiB5KG4tMSlMICApICkKKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07IC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKz15bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0CisKKyAgICAgICAgfQorCisgICAgfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3YWI1N2EuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLwotLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCi0vKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCi0vKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIEJQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICAgICAgICpwQ29lZikKLXsKLSAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0gICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzOwotCi0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHBDb2VmLT5BMDsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gcENvZWYtPkIyOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSBwQ29lZi0+QjE7Ci19Ci0jZWxzZQotdm9pZCBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKLXsKLSAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOwotICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9KExWTV9JTlQzMiAqKSBwVGFwczsKLQotICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdPXBDb2VmLT5BMDsKLSAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXT1wQ29lZi0+QjI7Ci0gIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09cENvZWYtPkIxOwotICB9Ci0jZW5kaWYKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBFbmQgT2YgRmlsZTogQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGI2YzE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBCUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KKy8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLworLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLworLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgICAgICAgKnBDb2VmKQoreworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHM7CisKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSBwQ29lZi0+QjI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHBDb2VmLT5CMTsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IGUxOTRmOTIuLjhhMDAwYjYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTI3LDcgKzI3LDYgQEAKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKIAotI2lmZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCiB7CiAKQEAgLTM1LDUgKzM0LDQgQEAKICAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwogfUZpbHRlcl9TdGF0ZV9GTE9BVDsKIHR5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7Ci0jZW5kaWYKICNlbmRpZiAvKl9CUF8xSV9EMTZGMTZDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYWJkZDQzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQVNTVU1QVElPTlM6Ci0gQ09FRlMtCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMCwKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIC1CMiwKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFEzMCBmb3JtYXQKLQotIERFTEFZUy0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeShuLTEpTCBpbiBRMTYgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0yKUwgaW4gUTE2IGZvcm1hdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIEJQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotewotICAgIExWTV9GTE9BVCB5bkwsdGVtcGw7Ci0gICAgTFZNX0lOVDE2IGlpOwotICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpcEluc3RhbmNlOwotCi0gICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAvLyB5bkw9IChBMCAqICh4KG4pTCAtIHgobi0yKUwgKSkKLSAgICAgICAgdGVtcGwgPSAoTFZNX0ZMT0FUKSAqcERhdGFJbiAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKLSAgICAgICAgeW5MID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHRlbXBsOwotCi0gICAgICAgIC8vIHluTCs9ICgoLUIyICAqIHkobi0yKUwgICkgKQotICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107Ci0gICAgICAgIHluTCArPSB0ZW1wbDsKLQotICAgICAgICAvLyB5bkwrPSAoKC1CMSAgKiB5KG4tMSlMICApKQotICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07Ci0gICAgICAgIHluTCArPSB0ZW1wbDsKLQotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07IC8vIHkobi0yKUw9eShuLTEpTAotICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAotICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMIGluIFExNgotICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMIGluIFEwCi0KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAqcERhdGFPdXQrKyA9ICh5bkwpOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAotICAgICAgICB9Ci19Ci0jZWxzZQotdm9pZCBCUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLQotCi0gICAgewotICAgICAgICBMVk1fSU5UMzIgeW5MLHRlbXBsOwotICAgICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKLQotICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgIHsKLQotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8vIHluTD0gKEEwIChRMzApICogKHgobilMIChRMCkgLSB4KG4tMilMIChRMCkgKSA+PjE0KSAgaW4gUTE2Ci0gICAgICAgICAgICB0ZW1wbD0gKExWTV9JTlQzMikgKnBEYXRhSW4tcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1swXSx0ZW1wbCx5bkwsMTQpCi0KLSAgICAgICAgICAgIC8vIHluTCs9ICgoLUIyIChRMzApICogeShuLTIpTCAoUTE2KSApID4+MzApIGluIFExNgotICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSxwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10sdGVtcGwsMzApCi0gICAgICAgICAgICB5bkwrPXRlbXBsOwotCi0gICAgICAgICAgICAvLyB5bkwrPSAoKC1CMSAoUTMwKSAqIHkobi0xKUwgKFExNikgKSA+PjMwKSBpbiBRMTYKLSAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0scEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdLHRlbXBsLDMwKQotICAgICAgICAgICAgeW5MKz10ZW1wbDsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvLyB4KG4tMilMPXgobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT15bkw7IC8vIFVwZGF0ZSB5KG4tMSlMIGluIFExNgotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdPSgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwgaW4gUTAKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAqcERhdGFPdXQrKz0oTFZNX0lOVDE2KSh5bkw+PjE2KTsgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKLQotICAgICAgICB9Ci0KLSAgICB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jODQ0ZDAzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQzMwX1RSQ19XUkFfMDEuY3BwCkBAIC0wLDAgKzEsNzQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEwLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgLUIyLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTMwIGZvcm1hdAorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFExNiBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEJQXzFJX0QxNkYzMkMzMF9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQoreworICAgIExWTV9GTE9BVCB5bkwsdGVtcGw7CisgICAgTFZNX0lOVDE2IGlpOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpcEluc3RhbmNlOworCisgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAvLyB5bkw9IChBMCAqICh4KG4pTCAtIHgobi0yKUwgKSkKKyAgICAgICAgdGVtcGwgPSAoTFZNX0ZMT0FUKSAqcERhdGFJbiAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKyAgICAgICAgeW5MID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHRlbXBsOworCisgICAgICAgIC8vIHluTCs9ICgoLUIyICAqIHkobi0yKUwgICkgKQorICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAvLyB5bkwrPSAoKC1CMSAgKiB5KG4tMSlMICApKQorICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07IC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMIGluIFExNgorICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMIGluIFEwCisKKyAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAqcERhdGFPdXQrKyA9ICh5bkwpOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAorICAgICAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZTA0N2EuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJhbmQgcGFzcyBmaWx0ZXIgKEJJUVVBRCkgICAgICAgICAgICAgICAqLwotLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCi0vKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCi0vKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBUaGUgY29lZmZpY2llbnRzIGFyZSBtb2RpZmllZCBpbiB0aGUgaW5pdCgpIGZ1bmN0aW9uIHN1Y2ggdGhhdCBsb3dlciAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgaGFsZiB3b3JkIGlzIHJpZ2h0IHNoaWZ0ZWQgYnkgb25lIGFuZCBtb3N0IHNpZ25pZmljYW50IGJpdCBvZiB0aGUgbG93ZXIgICAgICAgICAgICAqLwotLyogICAgICAgIHdvcmQgaXMgbWFkZSB0byBiZSB6ZXJvLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICBSZWFzb246IEZvciBNSVBTIGVmZmNpZW5jeSx3ZSBhcmUgdXNpbmcgRFNQIDMyKjE2IG11bHRpcGxpY2F0aW9uICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgaW5zdHJ1Y3Rpb24uIEJ1dCB3ZSBoYXZlIDMyKjMyIG11bHRpcGxpY2F0aW9uLiBUaGlzIGNhbiBiZSByZWFsaXplZCBieSB0d28gMzIqMTYgICAgKi8KLS8qICAgICAgIG11bHRpcGxpY2F0aW9uLiBCdXQgMTZ0aCBiaXQgaW4gdGhlIDMyIGJpdCB3b3JkIGlzIG5vdCBhIHNpZ24gYml0LiBTbyB0aGlzIGlzIGRvbmUgICovCi0vKiAgICAgICBieSBwdXR0aW5nIDE2dGggYml0IHRvIHplcm8gYW5kIGxvc3Npbmcgb25lIGJpdCBwcmVjaXNpb24gYnkgZGl2aXNpb24gb2YgbG93ZXIgICAgICAqLwotLyogICAgICAgaGFsZiB3b3JkIGJ5IDIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgICAgICpwQ29lZikKLXsKLSAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0gICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgID0oTFZNX0ZMT0FUICopIHBUYXBzOwotCi0KLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gIHBDb2VmLT5BMDsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gIHBDb2VmLT5CMjsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gIHBDb2VmLT5CMTsKLX0KLSNlbHNlCi12b2lkIEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MzMl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQotewotICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7Ci0gIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgICA9KExWTV9JTlQzMiAqKSBwVGFwczsKLQotICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gIHBDb2VmLT5BMDsKLSAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9ICBwQ29lZi0+QjI7Ci0gIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSAgcENvZWYtPkIxOwotfQotI2VuZGlmCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRW5kIE9mIEZpbGU6IEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWIxNTAzMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuY3BwCkBAIC0wLDAgKzEsNjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhlc2UgZnVuY3Rpb25zIGluaXRpYWxpemVzIGEgQmFuZCBwYXNzIGZpbHRlciAoQklRVUFEKSAgICAgICAgICAgICAgICovCisvKiAgIGJpcXVhZHJhdGljIEZpbHRlciBTZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBJbnN0YW5jZSAgICAtIG91dHB1dCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgU3RhdGUgVmFyaWFibGUgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgVGhpcyBzdGF0ZSBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIGFueSBzdWJzZXF1ZW50ICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIGNhbGwgdG8gIkJpcXVhZCIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBUYXBzICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgdGFwcyBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwQ29lZiAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHN0cnVjdHVyZSAgICAgICAgICAgKi8KKy8qICAgTiAgICAgICAgICAgICAtIE0gY29lZmZpY2llbnQgZmFjdG9yIG9mIFFNLk4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIFRoZSBjb2VmZmljaWVudHMgYXJlIG1vZGlmaWVkIGluIHRoZSBpbml0KCkgZnVuY3Rpb24gc3VjaCB0aGF0IGxvd2VyICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICBoYWxmIHdvcmQgaXMgcmlnaHQgc2hpZnRlZCBieSBvbmUgYW5kIG1vc3Qgc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBsb3dlciAgICAgICAgICAgICovCisvKiAgICAgICAgd29yZCBpcyBtYWRlIHRvIGJlIHplcm8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIFJlYXNvbjogRm9yIE1JUFMgZWZmY2llbmN5LHdlIGFyZSB1c2luZyBEU1AgMzIqMTYgbXVsdGlwbGljYXRpb24gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICBpbnN0cnVjdGlvbi4gQnV0IHdlIGhhdmUgMzIqMzIgbXVsdGlwbGljYXRpb24uIFRoaXMgY2FuIGJlIHJlYWxpemVkIGJ5IHR3byAzMioxNiAgICAqLworLyogICAgICAgbXVsdGlwbGljYXRpb24uIEJ1dCAxNnRoIGJpdCBpbiB0aGUgMzIgYml0IHdvcmQgaXMgbm90IGEgc2lnbiBiaXQuIFNvIHRoaXMgaXMgZG9uZSAgKi8KKy8qICAgICAgIGJ5IHB1dHRpbmcgMTZ0aCBiaXQgdG8gemVybyBhbmQgbG9zc2luZyBvbmUgYml0IHByZWNpc2lvbiBieSBkaXZpc2lvbiBvZiBsb3dlciAgICAgICovCisvKiAgICAgICBoYWxmIHdvcmQgYnkgMi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgID0oTFZNX0ZMT0FUICopIHBUYXBzOworCisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9ICBwQ29lZi0+QTA7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9ICBwQ29lZi0+QjI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9ICBwQ29lZi0+QjE7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRW5kIE9mIEZpbGU6IEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCBhYTllNjY5Li42ZDc1NGUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDE2RjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yNiwxMiArMjYsMTAgQEAKIH1GaWx0ZXJfU3RhdGU7CiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7Ci0jaWZkZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKIHsKICAgICBMVk1fRkxPQVQgKiAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KICAgICBMVk1fRkxPQVQgICAgICAgICBjb2Vmc1szXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwogfUZpbHRlcl9TdGF0ZV9GbG9hdDsKIHR5cGVkZWYgRmlsdGVyX1N0YXRlX0Zsb2F0ICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7Ci0jZW5kaWYKICNlbmRpZiAvKl9CUF8xSV9EMTZGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmRiMmY3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQVNTVU1QVElPTlM6Ci0gQ09FRlMtCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMCwKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIC1CMiwKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFEzMCBmb3JtYXQKLQotIERFTEFZUy0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMiAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCB5bkwsdGVtcGw7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotCi0gICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgIHsKLQotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8vIHluTD0gKEEwICAqICh4KG4pTCAgLSB4KG4tMilMICApICkKLSAgICAgICAgICAgIHRlbXBsID0gKCpwRGF0YUluKSAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKLSAgICAgICAgICAgIHluTCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiB0ZW1wbDsKLQotICAgICAgICAgICAgLy8geW5MKz0gKCgtQjIgICogeShuLTIpTCAgKSApCi0gICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107Ci0gICAgICAgICAgICB5bkwgKz0gdGVtcGw7Ci0KLSAgICAgICAgICAgIC8vIHluTCs9ICgoLUIxICAqIHkobi0xKUwgICkgKQotICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOwotICAgICAgICAgICAgeW5MICs9IHRlbXBsOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07IC8vIHkobi0yKUw9eShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvLyB4KG4tMilMPXgobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAqcERhdGFPdXQrKyA9IHluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKLQotICAgICAgICB9Ci0KLSAgICB9Ci0jZWxzZQotdm9pZCBCUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMiAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9JTlQzMiB5bkwsdGVtcGw7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOwotCi0gICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgIHsKLQotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8vIHluTD0gKEEwIChRMzApICogKHgobilMIChRMCkgLSB4KG4tMilMIChRMCkgKSA+PjMwKSAgaW4gUTAKLSAgICAgICAgICAgIHRlbXBsPSgqcERhdGFJbiktcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1swXSx0ZW1wbCx5bkwsMzApCi0KLSAgICAgICAgICAgIC8vIHluTCs9ICgoLUIyIChRMzApICogeShuLTIpTCAoUTApICkgPj4zMCkgaW4gUTAKLSAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0scEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdLHRlbXBsLDMwKQotICAgICAgICAgICAgeW5MKz10ZW1wbDsKLQotICAgICAgICAgICAgLy8geW5MKz0gKCgtQjEgKFEzMCkgKiB5KG4tMSlMIChRMCkgKSA+PjMwKSBpbiBRMAotICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1syXSxwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0sdGVtcGwsMzApCi0gICAgICAgICAgICB5bkwrPXRlbXBsOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOyAvLyB5KG4tMilMPXkobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdPXluTDsgLy8gVXBkYXRlIHkobi0xKUwgaW4gUTAKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMIGluIFEwCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0Kys9eW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAotCi0gICAgICAgIH0KLQotICAgIH0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQzMwX1RSQ19XUkFfMDIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQwYmEyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDMzBfVFJDX1dSQV8wMi5jcHAKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEFTU1VNUFRJT05TOgorIENPRUZTLQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTAsCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyAtQjIsCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMzAgZm9ybWF0CisKKyBERUxBWVMtCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEJQXzFJX0QzMkYzMkMzMF9UUkNfV1JBXzAyICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUIHluTCx0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisKKyAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluTD0gKEEwICAqICh4KG4pTCAgLSB4KG4tMilMICApICkKKyAgICAgICAgICAgIHRlbXBsID0gKCpwRGF0YUluKSAtIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKyAgICAgICAgICAgIHluTCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiB0ZW1wbDsKKworICAgICAgICAgICAgLy8geW5MKz0gKCgtQjIgICogeShuLTIpTCAgKSApCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICgoLUIxICAqIHkobi0xKUwgICkgKQorICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworICAgICAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07IC8vIHkobi0yKUw9eShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IHluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKKworICAgICAgICB9CisKKyAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1OTBjMzIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Qcml2YXRlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KLS8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLwotLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLwotLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQotewotICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKLSAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPShMVk1fRkxPQVQgKikgcFRhcHM7Ci0KLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gcENvZWYtPkEwOwotCi0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHBDb2VmLT5CMjsKLQotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSBwQ29lZi0+QjE7Ci19Ci0jZWxzZQotdm9pZCBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKLXsKLSAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOwotICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPShMVk1fSU5UMzIgKikgcFRhcHM7Ci0KLSAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXT1wQ29lZi0+QTA7Ci0KLSAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXT1wQ29lZi0+QjI7Ci0KLSAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT1wQ29lZi0+QjE7Ci19Ci0jZW5kaWYKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBFbmQgT2YgRmlsZTogQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjdkMGI1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdC5jcHAKQEAgLTAsMCArMSw1NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Qcml2YXRlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KKy8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLworLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLworLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgID0oTFZNX0ZMT0FUICopIHBUYXBzOworCisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHBDb2VmLT5BMDsKKworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSBwQ29lZi0+QjI7CisKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gcENvZWYtPkIxOworfQorLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEVuZCBPZiBGaWxlOiBCUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUF8xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMl9Qcml2YXRlLmgKaW5kZXggODBjMzkyMC4uOWYxYzY2YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlBfMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDJfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JQXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAyX1ByaXZhdGUuaApAQCAtMjYsMTMgKzI2LDExIEBACiB9RmlsdGVyX1N0YXRlOwogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwotI2lmZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCiB7CiAgICAgTFZNX0ZMT0FUICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCiAgICAgTFZNX0ZMT0FUICAgICAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KIH1GaWx0ZXJfU3RhdGVfRmxvYXQ7CiB0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GbG9hdCogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7Ci0jZW5kaWYKIAogI2VuZGlmIC8qX0JQXzFJX0QzMkYzMkNMTF9UUkNfV1JBXzAyX1BSSVZBVEVfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlOWJmN2EuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQVNTVU1QVElPTlM6Ci0gQ09FRlMtCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTUgZm9ybWF0Ci0KLSBERUxBWVMtCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgIHluTDsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgICB7Ci0KLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvLyB5bkw9QTIgICogeChuLTIpTAotICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotCi0gICAgICAgICAgICAvLyB5bkwrPUExICogeChuLTEpTAotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKLQotICAgICAgICAgICAgLy8geW5MKz1BMCAqIHgobilMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKLQotICAgICAgICAgICAgLy8geW5MKz0gICgtQjIgICogeShuLTIpTCApCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOwotCi0gICAgICAgICAgICAvLyB5bkwrPSAoLUIxICAqIHkobi0xKUwgICkKLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0geW5MOyAvLyBVcGRhdGUgeShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTAotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCi0KLQotICAgICAgICB9Ci0KLSAgICB9Ci0jZWxzZQotdm9pZCBCUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSAoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9JTlQzMiAgeW5MOwotICAgICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKLQotICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgIHsKLQotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8vIHluTD1BMiAoUTE1KSAqIHgobi0yKUwgKFEwKSBpbiBRMTUKLSAgICAgICAgICAgIHluTD0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0qIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKLQotICAgICAgICAgICAgLy8geW5MKz1BMSAoUTE1KSAqIHgobi0xKUwgKFEwKSBpbiBRMTUKLSAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07Ci0KLSAgICAgICAgICAgIC8vIHluTCs9QTAgKFExNSkgKiB4KG4pTCAoUTApIGluIFExNQotICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qICgqcERhdGFJbik7Ci0KLSAgICAgICAgICAgIC8vIHluTCs9ICAoLUIyIChRMTUpICogeShuLTIpTCAoUTApICkgaW4gUTE1Ci0gICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107Ci0KLSAgICAgICAgICAgIC8vIHluTCs9ICgtQjEgKFExNSkgKiB5KG4tMSlMIChRMCkgKSBpbiBRMTUKLSAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzRdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKLQotICAgICAgICAgICAgeW5MPXluTD4+MTU7IC8vIHluTCBpbiBRMCBmb3JtYXQKLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07IC8vIHkobi0yKUw9eShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLy8geChuLTIpTD14KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl09eW5MOyAvLyBVcGRhdGUgeShuLTEpTCBpbiBRMAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdPSgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwgaW4gUTAKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAqcERhdGFPdXQrKz0oTFZNX0lOVDE2KXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKLQotCi0gICAgICAgIH0KLQotICAgIH0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhZWNjNDAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jcHAKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEFTU1VNUFRJT05TOgorIENPRUZTLQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTIsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTEKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIEEwLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIC1CMgorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE1IGZvcm1hdAorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBCUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgeW5MOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTIgICogeChuLTIpTAorICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvLyB5bkwrPUExICogeChuLTEpTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMCAqIHgobilMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLy8geW5MKz0gICgtQjIgICogeShuLTIpTCApCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvLyB5bkwrPSAoLUIxICAqIHkobi0xKUwgICkKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0geW5MOyAvLyBVcGRhdGUgeShuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCisKKyAgICAgICAgfQorCisgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDViZWZhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgVGhlc2UgZnVuY3Rpb25zIGluaXRpYWxpemVzIGEgQklRVUFEIGZpbHRlciBkZWZpbmVkIGFzIGEgY2FzY2FkZSBvZiAgICovCi0vKiAgIGJpcXVhZHJhdGljIEZpbHRlciBTZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBJbnN0YW5jZSAgICAtIG91dHB1dCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgU3RhdGUgVmFyaWFibGUgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgVGhpcyBzdGF0ZSBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIGFueSBzdWJzZXF1ZW50ICAgKi8KLS8qICAgICAgICAgICAgICAgICAgIGNhbGwgdG8gIkJpcXVhZCIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBUYXBzICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgdGFwcyBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwQ29lZiAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHN0cnVjdHVyZSAgICAgICAgICAgKi8KLS8qICAgTiAgICAgICAgICAgICAtIE0gY29lZmZpY2llbnQgZmFjdG9yIG9mIFFNLk4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKLXsKLSAgICBMVk1fRkxPQVQgdGVtcDsKLSAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0gICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzIDsKLSAgICB0ZW1wID0gcENvZWYtPkEyOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QTE7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5BMDsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkIyOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QjE7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSA9IHRlbXA7Ci19Ci0jZWxzZQotdm9pZCBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKLXsKLSAgTFZNX0lOVDE2IHRlbXA7Ci0gIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKLSAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPShMVk1fSU5UMzIgKikgcFRhcHMgICAgICAgICAgICA7Ci0KLSAgdGVtcD1wQ29lZi0+QTI7Ci0gIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF09dGVtcDsKLSAgdGVtcD1wQ29lZi0+QTE7Ci0gIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV09dGVtcDsKLSAgdGVtcD1wQ29lZi0+QTA7Ci0gIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09dGVtcDsKLSAgdGVtcD1wQ29lZi0+QjI7Ci0gIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM109dGVtcDsKLSAgdGVtcD1wQ29lZi0+QjE7Ci0gIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF09dGVtcDsKLX0KLSNlbmRpZgotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEVuZCBPZiBGaWxlOiBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwYjVkMDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmNwcApAQCAtMCwwICsxLDYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLworLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCisvKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCisvKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKyAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHMgOworICAgIHRlbXAgPSBwQ29lZi0+QTI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdID0gdGVtcDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDgxMWRhOGIuLmZhZDM0NWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTI3LDcgKzI3LDYgQEAKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKIAotI2lmZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCiB7CiAgICAgTFZNX0ZMT0FUICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCkBAIC0zNSw1ICszNCw0IEBACiAKIH1GaWx0ZXJfU3RhdGVfRkxPQVQ7CiB0eXBlZGVmIEZpbHRlcl9TdGF0ZV9GTE9BVCAqIFBGaWx0ZXJfU3RhdGVfRkxPQVQgOwotI2VuZGlmCiAjZW5kaWYgLypfQlFfMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NGExMzcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYworKysgL2Rldi9udWxsCkBAIC0xLDEzMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQVNTVU1QVElPTlM6Ci0gQ09FRlMtCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTQgZm9ybWF0Ci0KLSBERUxBWVMtCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTE2IGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBCUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgeW5MOwotICAgICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKLQotICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgIHsKLQotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8vIHluTD1BMiAgKiB4KG4tMilMCi0gICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07Ci0KLSAgICAgICAgICAgIC8vIHluTCs9QTEgICogeChuLTEpTAotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKLQotICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7Ci0KLSAgICAgICAgICAgIC8vIHluTCs9ICggKC1CMiAgKiB5KG4tMilMICkKLSAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOwotCi0gICAgICAgICAgICAvLyB5bkwrPSAtQjEgICogeShuLTEpTAotICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsgIC8vIHkobi0yKUw9eShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLy8geChuLTIpTD14KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSB5bkw7ICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKUwKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpKHluTCk7IC8vIFdyaXRlIExlZnQgb3V0cHV0Ci0KLSAgICAgICAgfQotICAgIH0KLSNlbHNlCi12b2lkIEJRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotICAgIHsKLSAgICAgICAgTFZNX0lOVDMyICB5bkwsdGVtcGw7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOwotCi0gICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgewotCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8geW5MPUEyIChRMTQpICogeChuLTIpTCAoUTApIGluIFExNAotICAgICAgICAgICAgeW5MPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotCi0gICAgICAgICAgICAvLyB5bkwrPUExIChRMTQpICogeChuLTEpTCAoUTApIGluIFExNAotICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0qIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKLQotICAgICAgICAgICAgLy8geW5MKz1BMCAoUTE0KSAqIHgobilMIChRMCkgaW4gUTE0Ci0gICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSogKCpwRGF0YUluKTsKLQotICAgICAgICAgICAgLy8geW5MKz0gKCAoLUIyIChRMTQpICogeShuLTIpTCAoUTE2KSApPj4xNikgaW4gUTE0Ci0gICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10scEJpcXVhZFN0YXRlLT5jb2Vmc1szXSx0ZW1wbCwxNikKLSAgICAgICAgICAgIHluTCs9dGVtcGw7Ci0KLSAgICAgICAgICAgIC8vIHluTCs9ICggKC1CMSAoUTE0KSAqIHkobi0xKUwgKFExNikgKT4+MTYpIGluIFExNAotICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0sdGVtcGwsMTYpCi0gICAgICAgICAgICB5bkwrPXRlbXBsOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOyAgLy8geShuLTIpTD15KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLy8geChuLTIpTD14KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl09eW5MPDwyOyAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKUwgaW4gUTE2Ci0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF09KCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKUwgaW4gUTAKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAqcERhdGFPdXQrKz0oTFZNX0lOVDE2KSh5bkw+PjE0KTsgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKLQotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQzYmM1ZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmNwcApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTQgZm9ybWF0CisKKyBERUxBWVMtCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHkobi0xKUwgaW4gUTE2IGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUEyICAqIHgobi0yKUwKKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMSAgKiB4KG4tMSlMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLy8geW5MKz0gKCAoLUIyICAqIHkobi0yKUwgKQorICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKyAgICAgICAgICAgIC8vIHluTCs9IC1CMSAgKiB5KG4tMSlMCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOyAgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvLyB4KG4tMilMPXgobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHluTDsgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpTAorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCkoeW5MKTsgLy8gV3JpdGUgTGVmdCBvdXRwdXQKKworICAgICAgICB9CisgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDk4MTIyNzQuLjZhNjFkOWEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTI3LDcgKzI3LDYgQEAKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKIAotI2lmZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCiB7CiAgICAgTFZNX0ZMT0FUICogICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KQEAgLTM1LDUgKzM0LDQgQEAKIAogfUZpbHRlcl9TdGF0ZV9GTE9BVDsKIHR5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7Ci0jZW5kaWYKICNlbmRpZiAvKl9CUV8xSV9EMTZGMzJDU1NfVFJDX1dSQV8wMV9QUklWQVRFX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmVhZTIwZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgVGhlc2UgZnVuY3Rpb25zIGluaXRpYWxpemVzIGEgQklRVUFEIGZpbHRlciBkZWZpbmVkIGFzIGEgY2FzY2FkZSBvZiAgICovCi0vKiAgIGJpcXVhZHJhdGljIEZpbHRlciBTZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBJbnN0YW5jZSAgICAtIG91dHB1dCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgU3RhdGUgVmFyaWFibGUgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgVGhpcyBzdGF0ZSBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIGFueSBzdWJzZXF1ZW50ICAgKi8KLS8qICAgICAgICAgICAgICAgICAgIGNhbGwgdG8gIkJpcXVhZCIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBUYXBzICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgdGFwcyBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwQ29lZiAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHN0cnVjdHVyZSAgICAgICAgICAgKi8KLS8qICAgTiAgICAgICAgICAgICAtIE0gY29lZmZpY2llbnQgZmFjdG9yIG9mIFFNLk4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKLXsKLSAgICBMVk1fRkxPQVQgdGVtcDsKLSAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0gICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopcFRhcHM7Ci0KLSAgICB0ZW1wID0gcENvZWYtPkEyOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QTE7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5BMDsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkIyOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QjE7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSA9IHRlbXA7Ci19Ci0jZWxzZQotdm9pZCBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9DMTZfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKLXsKLSAgTFZNX0lOVDE2IHRlbXA7Ci0gIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKLSAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPShMVk1fSU5UMzIgKikgcFRhcHMgICAgICAgICAgICA7Ci0KLSAgdGVtcD1wQ29lZi0+QTI7Ci0gIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF09dGVtcDsKLSAgdGVtcD1wQ29lZi0+QTE7Ci0gIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV09dGVtcDsKLSAgdGVtcD1wQ29lZi0+QTA7Ci0gIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09dGVtcDsKLSAgdGVtcD1wQ29lZi0+QjI7Ci0gIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM109dGVtcDsKLSAgdGVtcD1wQ29lZi0+QjE7Ci0gIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF09dGVtcDsKLX0KLSNlbmRpZgotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEVuZCBPZiBGaWxlOiBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYjgwNjkxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jcHAKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KKy8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLworLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLworLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBMVk1fRkxPQVQgdGVtcDsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopcFRhcHM7CisKKyAgICB0ZW1wID0gcENvZWYtPkEyOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QTE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMDsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkIyOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSA9IHRlbXA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRW5kIE9mIEZpbGU6IEJRXzFJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIwZmRlMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEFTU1VNUFRJT05TOgotIENPRUZTLQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTIsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTEKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIEEwLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIC1CMgotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE0IGZvcm1hdAotCi0gREVMQVlTLQotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMSlSIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB4KG4tMilSIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSBpcyB5KG4tMSlSIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFEwIGZvcm1hdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIEJRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotICAgIHsKLSAgICAgICAgTFZNX0ZMT0FUICB5bkwseW5SOwotICAgICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKLQotICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgIHsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvLyB5bkw9QTIgICogeChuLTIpTAotICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOwotCi0gICAgICAgICAgICAvLyB5bkwrPUExICAqIHgobi0xKUwKLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07Ci0KLSAgICAgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOwotCi0gICAgICAgICAgICAvLyB5bkwrPSAoIC1CMiAgKiB5KG4tMilMICApCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdOwotCi0gICAgICAgICAgICAvLyB5bkwrPSggLUIxICAqIHkobi0xKUwgKQotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsKLQotCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8vIHluUj1BMiAgKiB4KG4tMilSCi0gICAgICAgICAgICB5blIgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107Ci0KLSAgICAgICAgICAgIC8vIHluUis9QTEgICogeChuLTEpUgotICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKLQotICAgICAgICAgICAgLy8geW5SKz1BMCAgKiB4KG4pUgotICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqKHBEYXRhSW4rMSkpOwotCi0gICAgICAgICAgICAvLyB5blIrPSAoIC1CMiAgKiB5KG4tMilSICApCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddOwotCi0gICAgICAgICAgICAvLyB5blIrPSggLUIxICAqIHkobi0xKVIgICkKLSAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07Ci0KLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLy8geShuLTIpUj15KG4tMSlSCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvLyB5KG4tMilMPXkobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgIC8vIHgobi0yKVI9eChuLTEpUgotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLy8geChuLTIpTD14KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpUgotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpUgotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0Ci0gICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5SOyAvLyBXcml0ZSBSaWdodCBvdXB1dAotCi0KLSAgICAgICAgfQotCi0gICAgfQotI2Vsc2UKLXZvaWQgQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0gICAgewotICAgICAgICBMVk1fSU5UMzIgIHluTCx5blI7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOwotCi0gICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgewotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8vIHluTD1BMiAoUTE0KSAqIHgobi0yKUwgKFEwKSBpbiBRMTQKLSAgICAgICAgICAgIHluTD0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0qIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKLQotICAgICAgICAgICAgLy8geW5MKz1BMSAoUTE0KSAqIHgobi0xKUwgKFEwKSBpbiBRMTQKLSAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07Ci0KLSAgICAgICAgICAgIC8vIHluTCs9QTAgKFExNCkgKiB4KG4pTCAoUTApIGluIFExNAotICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qICgqcERhdGFJbik7Ci0KLSAgICAgICAgICAgIC8vIHluTCs9ICggLUIyIChRMTQpICogeShuLTIpTCAoUTApICkgaW4gUTE0Ci0gICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl07Ci0KLSAgICAgICAgICAgIC8vIHluTCs9KCAtQjEgKFExNCkgKiB5KG4tMSlMIChRMCkgKSBpbiBRMTQKLSAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzRdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsKLQotICAgICAgICAgICAgeW5MPXluTD4+MTQ7IC8vIHluTCBpbiBRMCBmb3JtYXQKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8geW5SPUEyIChRMTQpICogeChuLTIpUiAoUTApIGluIFExNAotICAgICAgICAgICAgeW5SPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107Ci0KLSAgICAgICAgICAgIC8vIHluUis9QTEgKFExNCkgKiB4KG4tMSlSIChRMCkgaW4gUTE0Ci0gICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07Ci0KLSAgICAgICAgICAgIC8vIHluUis9QTAgKFExNCkgKiB4KG4pUiAoUTApIGluIFExNAotICAgICAgICAgICAgeW5SKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qKCoocERhdGFJbisxKSk7Ci0KLSAgICAgICAgICAgIC8vIHluUis9ICggLUIyIChRMTQpICogeShuLTIpUiAoUTApICkgaW4gUTE0Ci0gICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbN107Ci0KLSAgICAgICAgICAgIC8vIHluUis9KCAtQjEgKFExNCkgKiB5KG4tMSlSIChRMCkgKSBpbiBRMTQKLSAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzRdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsKLQotICAgICAgICAgICAgeW5SPXluUj4+MTQ7IC8vIHluTCBpbiBRMCBmb3JtYXQKLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07ICAvLyB5KG4tMilSPXkobi0xKVIKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvLyB5KG4tMilMPXkobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvLyB4KG4tMilSPXgobi0xKVIKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvLyB4KG4tMilMPXgobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XT15blI7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpUiBpbiBRMAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdPXluTDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlMIGluIFEwCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF09KCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKUwgaW4gUTAKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT0oKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpUiBpbiBRMAotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dCsrPShMVk1fSU5UMTYpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAotICAgICAgICAgICAgKnBEYXRhT3V0Kys9KExWTV9JTlQxNil5blI7IC8vIFdyaXRlIFJpZ2h0IG91cHV0IGluIFEwCi0KLQotICAgICAgICB9Ci0KLSAgICB9Ci0KLSNlbmRpZgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWNkOTE4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDEuY3BwCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTQgZm9ybWF0CisKKyBERUxBWVMtCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0xKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHgobi0yKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEJRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICB5bkwseW5SOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTIgICogeChuLTIpTAorICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvLyB5bkwrPUExICAqIHgobi0xKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvLyB5bkwrPSAoIC1CMiAgKiB5KG4tMilMICApCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdOworCisgICAgICAgICAgICAvLyB5bkwrPSggLUIxICAqIHkobi0xKUwgKQorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5SPUEyICAqIHgobi0yKVIKKyAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKworICAgICAgICAgICAgLy8geW5SKz1BMSAgKiB4KG4tMSlSCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvLyB5blIrPUEwICAqIHgobilSCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7CisKKyAgICAgICAgICAgIC8vIHluUis9ICggLUIyICAqIHkobi0yKVIgICkKKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN107CisKKyAgICAgICAgICAgIC8vIHluUis9KCAtQjEgICogeShuLTEpUiAgKQorICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLy8geShuLTIpUj15KG4tMSlSCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvLyB5KG4tMilMPXkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgIC8vIHgobi0yKVI9eChuLTEpUgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLy8geChuLTIpTD14KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpUgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpUgorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0CisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5SOyAvLyBXcml0ZSBSaWdodCBvdXB1dAorCisgICAgICAgIH0KKworICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjRkYjhmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQVNTVU1QVElPTlM6Ci0gQ09FRlMtCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTUgZm9ybWF0Ci0KLSBERUxBWVMtCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0xKVIgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHgobi0yKVIgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgIHluTCx5blI7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotCi0gICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgewotCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8geW5MPUEyICAqIHgobi0yKUwKLSAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKLQotICAgICAgICAgICAgLy8geW5MKz1BMSAgKiB4KG4tMSlMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOwotCi0gICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKLQotICAgICAgICAgICAgLy8geW5MKz0gKCAtQjIgICogeShuLTIpTAotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XTsKLQotICAgICAgICAgICAgLy8geW5MKz0oIC1CMSAgKiB5KG4tMSlMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOwotCi0KLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8geW5SPUEyICAqIHgobi0yKVIKLSAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKLQotICAgICAgICAgICAgLy8geW5SKz1BMSAgKiB4KG4tMSlSCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotCi0gICAgICAgICAgICAvLyB5blIrPUEwICAqIHgobilSCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7Ci0KLSAgICAgICAgICAgIC8vIHluUis9ICggLUIyICAqIHkobi0yKVIgICkKLSAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN107Ci0KLSAgICAgICAgICAgIC8vIHluUis9KCAtQjEgICogeShuLTEpUiAgKQotICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsKLQotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07ICAvLyB5KG4tMilSPXkobi0xKVIKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgIC8vIHkobi0yKUw9eShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAgLy8geChuLTIpUj14KG4tMSlSCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvLyB4KG4tMilMPXgobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IHluUjsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlSCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSB5bkw7ICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgeShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlSCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQKLSAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5blI7IC8vIFdyaXRlIFJpZ2h0IG91cHV0Ci0KLSAgICAgICAgfQotCi0gICAgfQotI2Vsc2UKLXZvaWQgQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEgKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0gICAgewotICAgICAgICBMVk1fSU5UMzIgIHluTCx5blI7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOwotCi0gICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgewotCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8geW5MPUEyIChRMTUpICogeChuLTIpTCAoUTApIGluIFExNQotICAgICAgICAgICAgeW5MPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOwotCi0gICAgICAgICAgICAvLyB5bkwrPUExIChRMTUpICogeChuLTEpTCAoUTApIGluIFExNQotICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0qIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKLQotICAgICAgICAgICAgLy8geW5MKz1BMCAoUTE1KSAqIHgobilMIChRMCkgaW4gUTE1Ci0gICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSogKCpwRGF0YUluKTsKLQotICAgICAgICAgICAgLy8geW5MKz0gKCAtQjIgKFExNSkgKiB5KG4tMilMIChRMCkgKSBpbiBRMTUKLSAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzNdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XTsKLQotICAgICAgICAgICAgLy8geW5MKz0oIC1CMSAoUTE1KSAqIHkobi0xKUwgKFEwKSApIGluIFExNQotICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOwotCi0gICAgICAgICAgICB5bkw9eW5MPj4xNTsgLy8geW5MIGluIFEwIGZvcm1hdAotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvLyB5blI9QTIgKFExNSkgKiB4KG4tMilSIChRMCkgaW4gUTE1Ci0gICAgICAgICAgICB5blI9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzBdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKLQotICAgICAgICAgICAgLy8geW5SKz1BMSAoUTE1KSAqIHgobi0xKVIgKFEwKSBpbiBRMTUKLSAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKLQotICAgICAgICAgICAgLy8geW5SKz1BMCAoUTE1KSAqIHgobilSIChRMCkgaW4gUTE1Ci0gICAgICAgICAgICB5blIrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSooKihwRGF0YUluKzEpKTsKLQotICAgICAgICAgICAgLy8geW5SKz0gKCAtQjIgKFExNSkgKiB5KG4tMilSIChRMCkgKSBpbiBRMTUKLSAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzNdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XTsKLQotICAgICAgICAgICAgLy8geW5SKz0oIC1CMSAoUTE1KSAqIHkobi0xKVIgKFEwKSApIGluIFExNQotICAgICAgICAgICAgeW5SKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOwotCi0gICAgICAgICAgICB5blI9eW5SPj4xNTsgLy8geW5MIGluIFEwIGZvcm1hdAotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8vIHkobi0yKVI9eShuLTEpUgotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgIC8vIHkobi0yKUw9eShuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgIC8vIHgobi0yKVI9eChuLTEpUgotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8vIHgobi0yKUw9eChuLTEpTAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdPXluUjsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlSIGluIFEwCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF09eW5MOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKUwgaW4gUTAKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpTCBpbiBRMAotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPSgqcERhdGFJbisrKTsgICAgICAgICAgICAgIC8vIFVwZGF0ZSB4KG4tMSlSIGluIFEwCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0Kys9KExWTV9JTlQxNil5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCi0gICAgICAgICAgICAqcERhdGFPdXQrKz0oTFZNX0lOVDE2KXluUjsgLy8gV3JpdGUgUmlnaHQgb3VwdXQgaW4gUTAKLQotICAgICAgICB9Ci0KLSAgICB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Zjc0NzQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDEuY3BwCkBAIC0wLDAgKzEsMTA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTUgZm9ybWF0CisKKyBERUxBWVMtCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0xKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHgobi0yKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEJRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxICggQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICB5bkwseW5SOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgIHsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTIgICogeChuLTIpTAorICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvLyB5bkwrPUExICAqIHgobi0xKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisKKyAgICAgICAgICAgIC8vIHluTCs9QTAgICogeChuKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvLyB5bkwrPSAoIC1CMiAgKiB5KG4tMilMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdOworCisgICAgICAgICAgICAvLyB5bkwrPSggLUIxICAqIHkobi0xKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8vIHluUj1BMiAgKiB4KG4tMilSCisgICAgICAgICAgICB5blIgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8vIHluUis9QTEgICogeChuLTEpUgorICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKKworICAgICAgICAgICAgLy8geW5SKz1BMCAgKiB4KG4pUgorICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqKHBEYXRhSW4rMSkpOworCisgICAgICAgICAgICAvLyB5blIrPSAoIC1CMiAgKiB5KG4tMilSICApCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddOworCisgICAgICAgICAgICAvLyB5blIrPSggLUIxICAqIHkobi0xKVIgICkKKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8vIHkobi0yKVI9eShuLTEpUgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAgLy8geShuLTIpTD15KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvLyB4KG4tMilSPXgobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8vIHgobi0yKUw9eChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIHkobi0xKVIKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7ICAgICAgICAgICAgICAvLyBVcGRhdGUgeChuLTEpTAorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKyspOyAgICAgICAgICAgICAgLy8gVXBkYXRlIHgobi0xKVIKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAorICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluUjsgLy8gV3JpdGUgUmlnaHQgb3VwdXQKKworICAgICAgICB9CisKKyAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5ZTFiZGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLwotLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCi0vKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCi0vKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCi17Ci0gICAgTFZNX0ZMT0FUIHRlbXA7Ci0gICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOwotICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwcyAgICAgICAgICAgIDsKLQotICAgIHRlbXAgPSBwQ29lZi0+QTI7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5BMTsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkEwOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QjI7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5CMTsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdID0gdGVtcDsKLX0KLSNlbHNlCi12b2lkIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQotewotICBMVk1fSU5UMTYgdGVtcDsKLSAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOwotICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9KExWTV9JTlQzMiAqKSBwVGFwcyAgICAgICAgICAgIDsKLQotICB0ZW1wPXBDb2VmLT5BMjsKLSAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXT10ZW1wOwotICB0ZW1wPXBDb2VmLT5BMTsKLSAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXT10ZW1wOwotICB0ZW1wPXBDb2VmLT5BMDsKLSAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT10ZW1wOwotICB0ZW1wPXBDb2VmLT5CMjsKLSAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXT10ZW1wOwotICB0ZW1wPXBDb2VmLT5CMTsKLSAgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XT10ZW1wOwotfQotI2VuZGlmCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRW5kIE9mIEZpbGU6IEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTg3Y2JjZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhlc2UgZnVuY3Rpb25zIGluaXRpYWxpemVzIGEgQklRVUFEIGZpbHRlciBkZWZpbmVkIGFzIGEgY2FzY2FkZSBvZiAgICovCisvKiAgIGJpcXVhZHJhdGljIEZpbHRlciBTZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBJbnN0YW5jZSAgICAtIG91dHB1dCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgU3RhdGUgVmFyaWFibGUgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgVGhpcyBzdGF0ZSBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIGFueSBzdWJzZXF1ZW50ICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIGNhbGwgdG8gIkJpcXVhZCIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBUYXBzICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgdGFwcyBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwQ29lZiAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHN0cnVjdHVyZSAgICAgICAgICAgKi8KKy8qICAgTiAgICAgICAgICAgICAtIE0gY29lZmZpY2llbnQgZmFjdG9yIG9mIFFNLk4gICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit2b2lkIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgKCAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCit7CisgICAgTFZNX0ZMT0FUIHRlbXA7CisgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwcyAgICAgICAgICAgIDsKKworICAgIHRlbXAgPSBwQ29lZi0+QTI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdID0gdGVtcDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IDA2OTFiOGMuLjVhOWEwZTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTI4LDcgKzI4LDYgQEAKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKIAotI2lmZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUCiB7CiAgICAgTFZNX0ZMT0FUICogICBwRGVsYXlzOyAgICAgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAqLwpAQCAtMzYsNiArMzUsNSBAQAogCiB9RmlsdGVyX1N0YXRlX0ZMT0FUOwogdHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKLSNlbmRpZgogCiAjZW5kaWYgLyogX0JRXzJJX0QxNkYxNkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MWMwN2M3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gQVNTVU1QVElPTlM6Ci0gQ09FRlMtCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTMgZm9ybWF0Ci0KLSBERUxBWVMtCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0xKVIgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHgobi0yKVIgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdIGlzIHkobi0xKUwgaW4gUTE2IGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSBpcyB5KG4tMSlSIGluIFExNiBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTE2IGZvcm1hdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIEJRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgeW5MLHluUjsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgewotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIHluTD1BMiAqIHgobi0yKUwgKi8KLSAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKLQotICAgICAgICAgICAgLyogeW5MKz1BMSogeChuLTEpTCAqLwotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKLQotICAgICAgICAgICAgLyogeW5MKz1BMCogeChuKUwgICAqLwotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7Ci0KLSAgICAgICAgICAgIC8qIHluTCs9LUIyKnkobi0yKUwgKi8KLSAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOwotCi0gICAgICAgICAgICAvKiB5bkwrPS1CMSp5KG4tMSlMICovCi0gICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5SPUEyICogeChuLTIpUiAqLwotICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOwotCi0gICAgICAgICAgICAvKiB5blIrPUExKiB4KG4tMSlSICovCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotCi0gICAgICAgICAgICAvKiB5blIrPUEwKiB4KG4pUiAgICovCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7Ci0KLSAgICAgICAgICAgIC8qIHluUis9LUIyICogeShuLTIpUiAqLwotICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107Ci0KLSAgICAgICAgICAgIC8qIHluUis9LUIxICogeShuLTEpUiAqLwotICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8qIHkobi0yKVI9eShuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvKiB5KG4tMilMPXkobi0xKUwqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAgLyogeChuLTIpUj14KG4tMSlSKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8qIHgobi0yKUw9eChuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7ICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpUiAqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKUwgKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlMICovCi0gICAgICAgICAgICBwRGF0YUluKys7Ci0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4pOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpUiAqLwotICAgICAgICAgICAgcERhdGFJbisrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluTCk7IC8qIFdyaXRlIExlZnQgb3V0cHV0ICovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5SKTsgLyogV3JpdGUgUmlnaHQgb3VwdXQgKi8KLSAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgIH0KLSAgICB9Ci0jZWxzZQotdm9pZCBCUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0gICAgewotICAgICAgICBMVk1fSU5UMzIgIHluTCx5blIsdGVtcGw7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOwotCi0gICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgewotCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5MPUEyIChRMTMpICogeChuLTIpTCAoUTApIGluIFExMyovCi0gICAgICAgICAgICB5bkw9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzBdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07Ci0KLSAgICAgICAgICAgIC8qIHluTCs9QTEgKFExMykgKiB4KG4tMSlMIChRMCkgaW4gUTEzKi8KLSAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07Ci0KLSAgICAgICAgICAgIC8qIHluTCs9QTAgKFExMykgKiB4KG4pTCAoUTApIGluIFExMyovCi0gICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSogKCpwRGF0YUluKTsKLQotICAgICAgICAgICAgLyogeW5MKz0gKCAoLUIyIChRMTMpICogeShuLTIpTCAoUTE2KSApPj4xNikgaW4gUTEzICovCi0gICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0scEJpcXVhZFN0YXRlLT5jb2Vmc1szXSx0ZW1wbCwxNikKLSAgICAgICAgICAgIHluTCs9dGVtcGw7Ci0KLSAgICAgICAgICAgIC8qIHluTCs9KCAoLUIxIChRMTMpICogeShuLTEpTCAoUTE2KSApPj4xNikgaW4gUTEzICovCi0gICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0scEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSx0ZW1wbCwxNikKLSAgICAgICAgICAgIHluTCs9dGVtcGw7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIHluUj1BMiAoUTEzKSAqIHgobi0yKVIgKFEwKSBpbiBRMTMqLwotICAgICAgICAgICAgeW5SPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107Ci0KLSAgICAgICAgICAgIC8qIHluUis9QTEgKFExMykgKiB4KG4tMSlSIChRMCkgaW4gUTEzKi8KLSAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKLQotICAgICAgICAgICAgLyogeW5SKz1BMCAoUTEzKSAqIHgobilSIChRMCkgaW4gUTEzKi8KLSAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzJdKigqKHBEYXRhSW4rMSkpOwotCi0gICAgICAgICAgICAvKiB5blIrPSAoICgtQjIgKFExMykgKiB5KG4tMilSIChRMTYpICk+PjE2KSBpbiBRMTMqLwotICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddLHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10sdGVtcGwsMTYpCi0gICAgICAgICAgICB5blIrPXRlbXBsOwotCi0gICAgICAgICAgICAvKiB5blIrPSggKC1CMSAoUTEzKSAqIHkobi0xKVIgKFExNikgKT4+MTYpIGluIFExMyAqLwotICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0sdGVtcGwsMTYpCi0gICAgICAgICAgICB5blIrPXRlbXBsOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLyogeShuLTIpUj15KG4tMSlSKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvKiB5KG4tMilMPXkobi0xKUwqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgIC8qIHgobi0yKVI9eChuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLyogeChuLTIpTD14KG4tMSlMKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XT15blI8PDM7ICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpUiBpbiBRMTYqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdPXluTDw8MzsgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB5KG4tMSlMIGluIFExNiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF09KCpwRGF0YUluKTsgICAgICAgICAgICAgICAgLyogVXBkYXRlIHgobi0xKUwgaW4gUTAqLwotICAgICAgICAgICAgcERhdGFJbisrOwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPSgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlSIGluIFEwKi8KLSAgICAgICAgICAgIHBEYXRhSW4rKzsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAqcERhdGFPdXQ9KExWTV9JTlQxNikoeW5MPj4xMyk7IC8qIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwKi8KLSAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgICAgICAqcERhdGFPdXQ9KExWTV9JTlQxNikoeW5SPj4xMyk7IC8qIFdyaXRlIFJpZ2h0IG91cHV0IGluIFEwKi8KLSAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgIH0KLQotICAgIH0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMWM5N2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMS5jcHAKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExMyBmb3JtYXQKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMTYgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTE2IGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMTYgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEJRXzJJX0QxNkYzMkMxM19UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgeW5MLHluUjsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisKKyAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluTD1BMiAqIHgobi0yKUwgKi8KKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworICAgICAgICAgICAgLyogeW5MKz1BMSogeChuLTEpTCAqLworICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLyogeW5MKz1BMCogeChuKUwgICAqLworICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8qIHluTCs9LUIyKnkobi0yKUwgKi8KKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisgICAgICAgICAgICAvKiB5bkwrPS1CMSp5KG4tMSlMICovCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5SPUEyICogeChuLTIpUiAqLworICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvKiB5blIrPUExKiB4KG4tMSlSICovCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvKiB5blIrPUEwKiB4KG4pUiAgICovCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7CisKKyAgICAgICAgICAgIC8qIHluUis9LUIyICogeShuLTIpUiAqLworICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKyAgICAgICAgICAgIC8qIHluUis9LUIxICogeShuLTEpUiAqLworICAgICAgICAgICAgeW5SICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgIC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07ICAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAgLyogeChuLTIpUj14KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgIC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7ICAgICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpUiAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAgICAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKUwgKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlMICovCisgICAgICAgICAgICBwRGF0YUluKys7CisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4pOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpUiAqLworICAgICAgICAgICAgcERhdGFJbisrOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluTCk7IC8qIFdyaXRlIExlZnQgb3V0cHV0ICovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5SKTsgLyogV3JpdGUgUmlnaHQgb3VwdXQgKi8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgIH0KKyAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2YxOWUwNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBBU1NVTVBUSU9OUzoKLSBDT0VGUy0KLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExNCBmb3JtYXQKLQotIERFTEFZUy0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMTYgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTE2IGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMTYgZm9ybWF0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotICAgIHsKLSAgICAgICAgTFZNX0ZMT0FUICB5bkwseW5SOwotICAgICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKLQotICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7Ci0KLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKiB5bkw9QTIgICogeChuLTIpTCAqLwotICAgICAgICAgICAgeW5MID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOwotCi0gICAgICAgICAgICAvKiB5bkwrPUExICAqIHgobi0xKUwgKi8KLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07Ci0KLSAgICAgICAgICAgIC8qIHluTCs9QTAgICogeChuKUwgKi8KLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOwotCi0gICAgICAgICAgICAvKiB5bkwrPSAoICgtQjIgICogeShuLTIpTCAgKSkqLwotICAgICAgICAgICAgeW5MICs9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107Ci0KLQotICAgICAgICAgICAgLyogeW5MKz0oICgtQjEgICogeShuLTEpTCAgKSkgICovCi0gICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5SPUEyICAqIHgobi0yKVIgKi8KLSAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKLQotICAgICAgICAgICAgLyogeW5SKz1BMSAgKiB4KG4tMSlSICovCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotCi0gICAgICAgICAgICAvKiB5blIrPUEwICAqIHgobilSICovCi0gICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7Ci0KLSAgICAgICAgICAgIC8qIHluUis9ICggKC1CMiAgKiB5KG4tMilSICApKSovCi0gICAgICAgICAgICB5blIgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKLQotICAgICAgICAgICAgLyogeW5SKz0oICgtQjEgICogeShuLTEpUiAgKSkgICovCi0gICAgICAgICAgICB5blIgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAgLyogeShuLTIpUj15KG4tMSlSKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgIC8qIHkobi0yKUw9eShuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07ICAvKiB4KG4tMilSPXgobi0xKVIqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAgLyogeChuLTIpTD14KG4tMSlMKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IHluUjsgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB5KG4tMSlSICovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gPSB5bkw7ICAgICAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeShuLTEpTCAqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgICAgICAgICAgICAgICAgLyogVXBkYXRlIHgobi0xKUwgKi8KLSAgICAgICAgICAgIHBEYXRhSW4rKzsKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7ICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB4KG4tMSlSICovCi0gICAgICAgICAgICBwRGF0YUluKys7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCkoeW5MKTsgLyogV3JpdGUgTGVmdCBvdXRwdXQgKi8KLSAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5blIpOyAvKiBXcml0ZSBSaWdodCBvdXB1dCAqLwotICAgICAgICAgICAgcERhdGFPdXQrKzsKLSAgICAgICAgfQotCi0gICAgfQotI2Vsc2UKLXZvaWQgQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotICAgIHsKLSAgICAgICAgTFZNX0lOVDMyICB5bkwseW5SLHRlbXBsOwotICAgICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKLQotICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7Ci0KLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKiB5bkw9QTIgKFExNCkgKiB4KG4tMilMIChRMCkgaW4gUTE0Ki8KLSAgICAgICAgICAgIHluTD0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0qIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKLQotICAgICAgICAgICAgLyogeW5MKz1BMSAoUTE0KSAqIHgobi0xKUwgKFEwKSBpbiBRMTQqLwotICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0qIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKLQotICAgICAgICAgICAgLyogeW5MKz1BMCAoUTE0KSAqIHgobilMIChRMCkgaW4gUTE0Ki8KLSAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzJdKiAoKnBEYXRhSW4pOwotCi0gICAgICAgICAgICAvKiB5bkwrPSAoICgtQjIgKFExNCkgKiB5KG4tMilMIChRMTYpICk+PjE2KSBpbiBRMTQgKi8KLSAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSxwQmlxdWFkU3RhdGUtPmNvZWZzWzNdLHRlbXBsLDE2KQotICAgICAgICAgICAgeW5MKz10ZW1wbDsKLQotICAgICAgICAgICAgLyogeW5MKz0oICgtQjEgKFExNCkgKiB5KG4tMSlMIChRMTYpICk+PjE2KSBpbiBRMTQgKi8KLSAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSxwQmlxdWFkU3RhdGUtPmNvZWZzWzRdLHRlbXBsLDE2KQotICAgICAgICAgICAgeW5MKz10ZW1wbDsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5SPUEyIChRMTQpICogeChuLTIpUiAoUTApIGluIFExNCovCi0gICAgICAgICAgICB5blI9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzBdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKLQotICAgICAgICAgICAgLyogeW5SKz1BMSAoUTE0KSAqIHgobi0xKVIgKFEwKSBpbiBRMTQqLwotICAgICAgICAgICAgeW5SKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotCi0gICAgICAgICAgICAvKiB5blIrPUEwIChRMTQpICogeChuKVIgKFEwKSBpbiBRMTQqLwotICAgICAgICAgICAgeW5SKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qKCoocERhdGFJbisxKSk7Ci0KLSAgICAgICAgICAgIC8qIHluUis9ICggKC1CMiAoUTE0KSAqIHkobi0yKVIgKFExNikgKT4+MTYpIGluIFExNCovCi0gICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10scEJpcXVhZFN0YXRlLT5jb2Vmc1szXSx0ZW1wbCwxNikKLSAgICAgICAgICAgIHluUis9dGVtcGw7Ci0KLSAgICAgICAgICAgIC8qIHluUis9KCAoLUIxIChRMTQpICogeShuLTEpUiAoUTE2KSApPj4xNikgaW4gUTE0ICovCi0gICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0scEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSx0ZW1wbCwxNikKLSAgICAgICAgICAgIHluUis9dGVtcGw7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07ICAvKiB5KG4tMilSPXkobi0xKVIqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgIC8qIHkobi0yKUw9eShuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAgLyogeChuLTIpUj14KG4tMSlSKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvKiB4KG4tMilMPXgobi0xKUwqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdPXluUjw8MjsgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB5KG4tMSlSIGluIFExNiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF09eW5MPDwyOyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKUwgaW4gUTE2Ki8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4pOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpTCBpbiBRMCovCi0gICAgICAgICAgICBwRGF0YUluKys7Ci0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV09KCpwRGF0YUluKTsgICAgICAgICAgICAgICAgLyogVXBkYXRlIHgobi0xKVIgaW4gUTAqLwotICAgICAgICAgICAgcERhdGFJbisrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dD0oTFZNX0lOVDE2KSh5bkw+PjE0KTsgLyogV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAqLwotICAgICAgICAgICAgcERhdGFPdXQrKzsKLSAgICAgICAgICAgICpwRGF0YU91dD0oTFZNX0lOVDE2KSh5blI+PjE0KTsgLyogV3JpdGUgUmlnaHQgb3VwdXQgaW4gUTAqLwotICAgICAgICAgICAgcERhdGFPdXQrKzsKLSAgICAgICAgfQotCi0gICAgfQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EzOTZkZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxLmNwcApAQCAtMCwwICsxLDExMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEFTU1VNUFRJT05TOgorIENPRUZTLQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTIsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTEKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIEEwLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIC1CMgorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE0IGZvcm1hdAorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMSlSIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB4KG4tMilSIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSBpcyB5KG4tMSlMIGluIFExNiBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gaXMgeShuLTEpUiBpbiBRMTYgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTE2IGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFExNiBmb3JtYXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQlFfMklfRDE2RjMyQzE0X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICB5bkwseW5SOworICAgICAgICBMVk1fSU5UMTYgaWk7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKKworICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPUEyICAqIHgobi0yKUwgKi8KKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKKworICAgICAgICAgICAgLyogeW5MKz1BMSAgKiB4KG4tMSlMICovCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOworCisgICAgICAgICAgICAvKiB5bkwrPUEwICAqIHgobilMICovCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKKworICAgICAgICAgICAgLyogeW5MKz0gKCAoLUIyICAqIHkobi0yKUwgICkpKi8KKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisgICAgICAgICAgICAvKiB5bkwrPSggKC1CMSAgKiB5KG4tMSlMICApKSAgKi8KKyAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5blI9QTIgICogeChuLTIpUiAqLworICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOworCisgICAgICAgICAgICAvKiB5blIrPUExICAqIHgobi0xKVIgKi8KKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8qIHluUis9QTAgICogeChuKVIgKi8KKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLyogeW5SKz0gKCAoLUIyICAqIHkobi0yKVIgICkpKi8KKyAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisgICAgICAgICAgICAvKiB5blIrPSggKC1CMSAgKiB5KG4tMSlSICApKSAgKi8KKyAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07ICAvKiB5KG4tMilSPXkobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAgLyogeShuLTIpTD15KG4tMSlMKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgIC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07ICAvKiB4KG4tMilMPXgobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAgICAgICAgICAgICAgICAgICAgLyogVXBkYXRlIHkobi0xKVIgKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgICAgICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSB5KG4tMSlMICovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4pOyAgICAgICAgICAgICAgICAvKiBVcGRhdGUgeChuLTEpTCAqLworICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKTsgICAgICAgICAgICAgICAgLyogVXBkYXRlIHgobi0xKVIgKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5bkwpOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCAqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluUik7IC8qIFdyaXRlIFJpZ2h0IG91cHV0ICovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICB9CisKKyAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYxMWIxOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTk0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBBU1NVTVBUSU9OUzoKLSBDT0VGUy0KLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExNSBmb3JtYXQKLQotIERFTEFZUy0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMTYgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTE2IGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFExNiBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMTYgZm9ybWF0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotICAgIHsKLSAgICAgICAgTFZNX0ZMT0FUICB5bkwseW5SOwotICAgICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKLQotICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgIHsKLQotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIHluTD1BMiAgKiB4KG4tMilMICovCi0gICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07Ci0KLSAgICAgICAgICAgIC8qIHluTCs9QTEgICogeChuLTEpTCAqLwotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKLQotICAgICAgICAgICAgLyogeW5MKz1BMCAgKiB4KG4pTCAqLwotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7Ci0KLSAgICAgICAgICAgIC8qIHluTCs9ICggKC1CMiAgKiB5KG4tMilMICkgICovCi0gICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKLQotCi0gICAgICAgICAgICAvKiB5bkwrPSggKC1CMSAgKiB5KG4tMSlMICApKSAgKi8KLSAgICAgICAgICAgIHluTCArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOwotCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIHluUj1BMiAgKiB4KG4tMilSICovCi0gICAgICAgICAgICB5blIgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107Ci0KLSAgICAgICAgICAgIC8qIHluUis9QTEgICogeChuLTEpUiAqLwotICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKLQotICAgICAgICAgICAgLyogeW5SKz1BMCAgKiB4KG4pUiAqLwotICAgICAgICAgICAgeW5SICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqKHBEYXRhSW4rMSkpOwotCi0gICAgICAgICAgICAvKiB5blIrPSAoICgtQjIgICogeShuLTIpUiApICovCi0gICAgICAgICAgICB5blIgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKLQotCi0gICAgICAgICAgICAvKiB5blIrPSggKC1CMSAgKiB5KG4tMSlSICApKSBpbiBRMTUgKi8KLSAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7IC8qIFVwZGF0ZSB5KG4tMSlSKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgLyogVXBkYXRlIHkobi0xKUwqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKUwqLwotICAgICAgICAgICAgcERhdGFJbisrOwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKVIqLwotICAgICAgICAgICAgcERhdGFJbisrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluTCk7IC8qIFdyaXRlIExlZnQgb3V0cHV0Ki8KLSAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5blIpOyAvKiBXcml0ZSBSaWdodCBvdXB1dCovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICB9Ci0KLSAgICB9Ci0jZWxzZQotdm9pZCBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0gICAgewotICAgICAgICBMVk1fSU5UMzIgIHluTCx5blIsdGVtcGw7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOwotCi0gICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgewotCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5MPUEyIChRMTUpICogeChuLTIpTCAoUTApIGluIFExNSovCi0gICAgICAgICAgICB5bkw9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzBdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07Ci0KLSAgICAgICAgICAgIC8qIHluTCs9QTEgKFExNSkgKiB4KG4tMSlMIChRMCkgaW4gUTE1Ki8KLSAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07Ci0KLSAgICAgICAgICAgIC8qIHluTCs9QTAgKFExNSkgKiB4KG4pTCAoUTApIGluIFExNSovCi0gICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSogKCpwRGF0YUluKTsKLQotICAgICAgICAgICAgLyogeW5MKz0gKCAoLUIyIChRMTUpICogeShuLTIpTCAoUTE2KSApPj4xNikgaW4gUTE1ICovCi0gICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0scEJpcXVhZFN0YXRlLT5jb2Vmc1szXSx0ZW1wbCwxNikKLSAgICAgICAgICAgIHluTCs9dGVtcGw7Ci0KLSAgICAgICAgICAgIC8qIHluTCs9KCAoLUIxIChRMTUpICogeShuLTEpTCAoUTE2KSApPj4xNikgaW4gUTE1ICovCi0gICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0scEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSx0ZW1wbCwxNikKLSAgICAgICAgICAgIHluTCs9dGVtcGw7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIFJJR0hUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIHluUj1BMiAoUTE1KSAqIHgobi0yKVIgKFEwKSBpbiBRMTUqLwotICAgICAgICAgICAgeW5SPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSpwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107Ci0KLSAgICAgICAgICAgIC8qIHluUis9QTEgKFExNSkgKiB4KG4tMSlSIChRMCkgaW4gUTE1Ki8KLSAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKnBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsKLQotICAgICAgICAgICAgLyogeW5SKz1BMCAoUTE1KSAqIHgobilSIChRMCkgaW4gUTE1Ki8KLSAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzJdKigqKHBEYXRhSW4rMSkpOwotCi0gICAgICAgICAgICAvKiB5blIrPSAoICgtQjIgKFExNSkgKiB5KG4tMilSIChRMTYpICk+PjE2KSBpbiBRMTUgKi8KLSAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSxwQmlxdWFkU3RhdGUtPmNvZWZzWzNdLHRlbXBsLDE2KQotICAgICAgICAgICAgeW5SKz10ZW1wbDsKLQotICAgICAgICAgICAgLyogeW5SKz0oICgtQjEgKFExNSkgKiB5KG4tMSlSIChRMTYpICk+PjE2KSBpbiBRMTUgKi8KLSAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSxwQmlxdWFkU3RhdGUtPmNvZWZzWzRdLHRlbXBsLDE2KQotICAgICAgICAgICAgeW5SKz10ZW1wbDsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgLyogeShuLTIpUj15KG4tMSlSKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAvKiB4KG4tMilSPXgobi0xKVIqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLyogeChuLTIpTD14KG4tMSlMKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XT15blI8PDE7IC8qIFVwZGF0ZSB5KG4tMSlSIGluIFExNiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF09eW5MPDwxOyAvKiBVcGRhdGUgeShuLTEpTCBpbiBRMTYqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdPSgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlMIGluIFEwKi8KLSAgICAgICAgICAgIHBEYXRhSW4rKzsKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT0oKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpUiBpbiBRMCovCi0gICAgICAgICAgICBwRGF0YUluKys7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0PShMVk1fSU5UMTYpKHluTD4+MTUpOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMCovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICAgICAgKnBEYXRhT3V0PShMVk1fSU5UMTYpKHluUj4+MTUpOyAvKiBXcml0ZSBSaWdodCBvdXB1dCBpbiBRMCovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICB9Ci0KLSAgICB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2JmZjFhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDEuY3BwCkBAIC0wLDAgKzEsMTEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMiwgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgQTAsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgLUIyCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTUgZm9ybWF0CisKKyBERUxBWVMtCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0xKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHgobi0yKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdIGlzIHkobi0xKUwgaW4gUTE2IGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSBpcyB5KG4tMSlSIGluIFExNiBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMTYgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTE2IGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBCUV8ySV9EMTZGMzJDMTVfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTCx5blI7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluTD1BMiAgKiB4KG4tMilMICovCisgICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8qIHluTCs9QTEgICogeChuLTEpTCAqLworICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLyogeW5MKz1BMCAgKiB4KG4pTCAqLworICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICggKC1CMiAgKiB5KG4tMilMICkgICovCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1szXTsKKworICAgICAgICAgICAgLyogeW5MKz0oICgtQjEgICogeShuLTEpTCAgKSkgICovCisgICAgICAgICAgICB5bkwgKz0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5SPUEyICAqIHgobi0yKVIgKi8KKyAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKKworICAgICAgICAgICAgLyogeW5SKz1BMSAgKiB4KG4tMSlSICovCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworCisgICAgICAgICAgICAvKiB5blIrPUEwICAqIHgobilSICovCisgICAgICAgICAgICB5blIgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCoocERhdGFJbisxKSk7CisKKyAgICAgICAgICAgIC8qIHluUis9ICggKC1CMiAgKiB5KG4tMilSICkgKi8KKyAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOworCisgICAgICAgICAgICAvKiB5blIrPSggKC1CMSAgKiB5KG4tMSlSICApKSBpbiBRMTUgKi8KKyAgICAgICAgICAgIHluUiArPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSB5blI7IC8qIFVwZGF0ZSB5KG4tMSlSKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgLyogVXBkYXRlIHkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKUwqLworICAgICAgICAgICAgcERhdGFJbisrOworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKVIqLworICAgICAgICAgICAgcERhdGFJbisrOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICpwRGF0YU91dCA9IChMVk1fRkxPQVQpKHluTCk7IC8qIFdyaXRlIExlZnQgb3V0cHV0Ki8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKSh5blIpOyAvKiBXcml0ZSBSaWdodCBvdXB1dCovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICB9CisKKyAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKaW5kZXggYzAzMTljOS4uMzE0Mzg4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjgsNyArMjgsNiBAQAogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwogCi0jaWZkZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKIHsKICAgICBMVk1fRkxPQVQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyBcCkBAIC0zNiw2ICszNSw1IEBACiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgY29lZnNbNV07ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCiB9RmlsdGVyX1N0YXRlX0ZMT0FUOwogdHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKLSNlbmRpZgogCiAjZW5kaWYgLyogX0JRXzJJX0QxNkYzMkNTU19UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ5YmJmZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9pbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KLS8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLwotLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLwotLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQotewotICAgIExWTV9GTE9BVCB0ZW1wOwotICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKLSAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHM7Ci0gICAgdGVtcCA9IHBDb2VmLT5BMjsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkExOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QTA7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5CMjsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkIxOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gPSB0ZW1wOwotfQotI2Vsc2UKLXZvaWQgQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCi17Ci0gIExWTV9JTlQxNiB0ZW1wOwotICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7Ci0gIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0oTFZNX0lOVDMyICopIHBUYXBzICAgICAgICAgICAgOwotCi0gIHRlbXA9cENvZWYtPkEyOwotICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdPXRlbXA7Ci0gIHRlbXA9cENvZWYtPkExOwotICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdPXRlbXA7Ci0gIHRlbXA9cENvZWYtPkEwOwotICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXRlbXA7Ci0gIHRlbXA9cENvZWYtPkIyOwotICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdPXRlbXA7Ci0gIHRlbXA9cENvZWYtPkIxOwotICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdPXRlbXA7Ci19Ci0jZW5kaWYKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBFbmQgT2YgRmlsZTogQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfaW5pdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4NTQxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX2luaXQuY3BwCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBCUV8ySV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KKy8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLworLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLworLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBMVk1fRkxPQVQgdGVtcDsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzOworICAgIHRlbXAgPSBwQ29lZi0+QTI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdID0gdGVtcDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjBkZTc5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkJRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEFTU1VNUFRJT05TOgotIENPRUZTLQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTIsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTEKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIEEwLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIC1CMgotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTMwIGZvcm1hdAotCi0gREVMQVlTLQotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB4KG4tMSlSIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSBpcyB4KG4tMilMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSBpcyB4KG4tMilSIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSBpcyB5KG4tMSlSIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSBpcyB5KG4tMilMIGluIFEwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSBpcyB5KG4tMilSIGluIFEwIGZvcm1hdAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIEJRXzJJX0QzMkYzMkMzMF9UUkNfV1JBXzAxICggICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLQotCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgeW5MLHluUix0ZW1wbCx0ZW1wZDsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgICB7Ci0KLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKiB5bkw9ICggQTIgICogeChuLTIpTCAgKSAqLwotICAgICAgICAgICAgeW5MID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKLQotICAgICAgICAgICAgLyogeW5MKz0gKCBBMSAgKiB4KG4tMSlMICApKi8KLSAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKLSAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKLQotICAgICAgICAgICAgLyogeW5MKz0gKCBBMCAgKiB4KG4pTCAgKSAqLwotICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogKCpwRGF0YUluKTsKLSAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKLQotICAgICAgICAgICAgIC8qIHluTCs9ICgtQjIgICogeShuLTIpTCAgKSAqLwotICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdOwotICAgICAgICAgICAgeW5MICs9IHRlbXBsOwotCi0gICAgICAgICAgICAvKiB5bkwrPSAoLUIxICAqIHkobi0xKUwgICkqLwotICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOwotICAgICAgICAgICAgeW5MICs9IHRlbXBsOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKiB5blI9ICggQTIgICogeChuLTIpUiAgKSAqLwotICAgICAgICAgICAgeW5SID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXTsKLQotICAgICAgICAgICAgLyogeW5SKz0gKCBBMSAgKiB4KG4tMSlSICApICovCi0gICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07Ci0gICAgICAgICAgICB5blIgKz0gdGVtcGw7Ci0KLSAgICAgICAgICAgIC8qIHluUis9ICggQTAgICogeChuKVIgICkgKi8KLSAgICAgICAgICAgIHRlbXBkID0qIChwRGF0YUluKzEpOwotICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogdGVtcGQ7Ci0gICAgICAgICAgICB5blIgKz0gdGVtcGw7Ci0KLSAgICAgICAgICAgIC8qIHluUis9ICgtQjIgICogeShuLTIpUiAgKSAqLwotICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddOwotICAgICAgICAgICAgeW5SICs9IHRlbXBsOwotCi0gICAgICAgICAgICAvKiB5blIrPSAoLUIxICAqIHkobi0xKVIgICkgICovCi0gICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07Ci0gICAgICAgICAgICB5blIgKz0gdGVtcGw7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgLyogeShuLTIpUj15KG4tMSlSKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgLyogeShuLTIpTD15KG4tMSlMKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgLyogeChuLTIpUj14KG4tMSlSKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLyogeChuLTIpTD14KG4tMSlMKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IChMVk1fRkxPQVQpeW5SOyAvKiBVcGRhdGUgeShuLTEpUiAqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0gKExWTV9GTE9BVCl5bkw7IC8qIFVwZGF0ZSB5KG4tMSlMICovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpTCAqLwotICAgICAgICAgICAgcERhdGFJbisrOwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKVIgKi8KLSAgICAgICAgICAgIHBEYXRhSW4rKzsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKXluTDsgLyogV3JpdGUgTGVmdCBvdXRwdXQgKi8KLSAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKXluUjsgLyogV3JpdGUgUmlnaHQgb3VwdXQgKi8KLSAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0KLQotICAgICAgICB9Ci0KLSAgICB9Ci0jZWxzZQotdm9pZCBCUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0KLQotICAgIHsKLSAgICAgICAgTFZNX0lOVDMyIHluTCx5blIsdGVtcGwsdGVtcGQ7Ci0gICAgICAgIExWTV9JTlQxNiBpaTsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOwotCi0gICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICAgewotCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5MPSAoIEEyIChRMzApICogeChuLTIpTCAoUTApICkgPj4zMCBpbiBRMCovCi0gICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzBdLHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSx5bkwsMzApCi0KLSAgICAgICAgICAgIC8qIHluTCs9ICggQTEgKFEzMCkgKiB4KG4tMSlMIChRMCkgKSA+PiAzMCBpbiBRMCovCi0gICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzFdLHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSx0ZW1wbCwzMCkKLSAgICAgICAgICAgIHluTCs9dGVtcGw7Ci0KLSAgICAgICAgICAgIC8qIHluTCs9ICggQTAgKFEzMCkgKiB4KG4pTCAoUTApICkgPj4gMzAgaW4gUTAqLwotICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1syXSwqcERhdGFJbix0ZW1wbCwzMCkKLSAgICAgICAgICAgIHluTCs9dGVtcGw7Ci0KLSAgICAgICAgICAgICAvKiB5bkwrPSAoLUIyIChRMzApICogeShuLTIpTCAoUTApICkgPj4gMzAgaW4gUTAqLwotICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1szXSxwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0sdGVtcGwsMzApCi0gICAgICAgICAgICB5bkwrPXRlbXBsOwotCi0gICAgICAgICAgICAvKiB5bkwrPSAoLUIxIChRMzApICogeShuLTEpTCAoUTApICkgPj4gMzAgaW4gUTAgKi8KLSAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0scEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdLHRlbXBsLDMwKQotICAgICAgICAgICAgeW5MKz10ZW1wbDsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5SPSAoIEEyIChRMzApICogeChuLTIpUiAoUTApICkgPj4gMzAgaW4gUTAqLwotICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIocEJpcXVhZFN0YXRlLT5jb2Vmc1swXSxwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10seW5SLDMwKQotCi0gICAgICAgICAgICAvKiB5blIrPSAoIEExIChRMzApICogeChuLTEpUiAoUTApICkgPj4gMzAgIGluIFEwKi8KLSAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0scEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdLHRlbXBsLDMwKQotICAgICAgICAgICAgeW5SKz10ZW1wbDsKLQotICAgICAgICAgICAgLyogeW5SKz0gKCBBMCAoUTMwKSAqIHgobilSIChRMCkgKSA+PiAzMCBpbiBRMCovCi0gICAgICAgICAgICB0ZW1wZD0qKHBEYXRhSW4rMSk7Ci0gICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzJdLHRlbXBkLHRlbXBsLDMwKQotICAgICAgICAgICAgeW5SKz10ZW1wbDsKLQotICAgICAgICAgICAgLyogeW5SKz0gKC1CMiAoUTMwKSAqIHkobi0yKVIgKFEwKSApID4+IDMwIGluIFEwKi8KLSAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10scEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddLHRlbXBsLDMwKQotICAgICAgICAgICAgeW5SKz10ZW1wbDsKLQotICAgICAgICAgICAgLyogeW5SKz0gKC1CMSAoUTMwKSAqIHkobi0xKVIgKFEwKSApID4+IDMwIGluIFEwICovCi0gICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzRdLHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSx0ZW1wbCwzMCkKLSAgICAgICAgICAgIHluUis9dGVtcGw7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAvKiB5KG4tMilMPXkobi0xKUwqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgLyogeChuLTIpUj14KG4tMSlSKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV09KExWTV9JTlQzMil5blI7IC8qIFVwZGF0ZSB5KG4tMSlSIGluIFEwKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XT0oTFZNX0lOVDMyKXluTDsgLyogVXBkYXRlIHkobi0xKUwgaW4gUTAqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdPSgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlMIGluIFEwKi8KLSAgICAgICAgICAgIHBEYXRhSW4rKzsKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT0oKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpUiBpbiBRMCovCi0gICAgICAgICAgICBwRGF0YUluKys7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0PShMVk1fSU5UMzIpeW5MOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMCovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICAgICAgKnBEYXRhT3V0PShMVk1fSU5UMzIpeW5SOyAvKiBXcml0ZSBSaWdodCBvdXB1dCBpbiBRMCovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotCi0KLSAgICAgICAgfQotCi0gICAgfQotI2VuZGlmIC8qQlVJTERfRkxPQVQqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4ZDFiYTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDMzBfVFJDX1dSQV8wMS5jcHAKQEAgLTAsMCArMSwyMDEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEyLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEExCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyBBMCwgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyAtQjIKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFEzMCBmb3JtYXQKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gaXMgeShuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgQlFfMklfRDMyRjMyQzMwX1RSQ19XUkFfMDEgKCAgICAgICAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgTnJTYW1wbGVzKQorCisgICAgeworICAgICAgICBMVk1fRkxPQVQgeW5MLHluUix0ZW1wbCx0ZW1wZDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5MPSAoIEEyICAqIHgobi0yKUwgICkgKi8KKyAgICAgICAgICAgIHluTCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisKKyAgICAgICAgICAgIC8qIHluTCs9ICggQTEgICogeChuLTEpTCAgKSovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICggQTAgICogeChuKUwgICkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqICgqcERhdGFJbik7CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgICAvKiB5bkwrPSAoLUIyICAqIHkobi0yKUwgICkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5MKz0gKC1CMSAgKiB5KG4tMSlMICApKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1s0XSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLyogeW5SPSAoIEEyICAqIHgobi0yKVIgICkgKi8KKyAgICAgICAgICAgIHluUiA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisKKyAgICAgICAgICAgIC8qIHluUis9ICggQTEgICogeChuLTEpUiAgKSAqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworICAgICAgICAgICAgeW5SICs9IHRlbXBsOworCisgICAgICAgICAgICAvKiB5blIrPSAoIEEwICAqIHgobilSICApICovCisgICAgICAgICAgICB0ZW1wZCA9KiAocERhdGFJbisxKTsKKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSAqIHRlbXBkOworICAgICAgICAgICAgeW5SICs9IHRlbXBsOworCisgICAgICAgICAgICAvKiB5blIrPSAoLUIyICAqIHkobi0yKVIgICkgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XTsKKyAgICAgICAgICAgIHluUiArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5SKz0gKC1CMSAgKiB5KG4tMSlSICApICAqLworICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOworICAgICAgICAgICAgeW5SICs9IHRlbXBsOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV07IC8qIHkobi0yKVI9eShuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07IC8qIHgobi0yKUw9eChuLTEpTCovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gPSAoTFZNX0ZMT0FUKXluUjsgLyogVXBkYXRlIHkobi0xKVIgKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IChMVk1fRkxPQVQpeW5MOyAvKiBVcGRhdGUgeShuLTEpTCAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKUwgKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlSICovCisgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCl5bkw7IC8qIFdyaXRlIExlZnQgb3V0cHV0ICovCisgICAgICAgICAgICBwRGF0YU91dCsrOworICAgICAgICAgICAgKnBEYXRhT3V0ID0gKExWTV9GTE9BVCl5blI7IC8qIFdyaXRlIFJpZ2h0IG91cHV0ICovCisgICAgICAgICAgICBwRGF0YU91dCsrOworCisgICAgICAgIH0KKworICAgIH0KKworI2lmZGVmIFNVUFBPUlRfTUMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEFTU1VNUFRJT05TOgorIENPRUZTLQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTIsIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTEKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIEEwLCBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIC1CMgorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gaXMgLUIxCisKKyBERUxBWVMtCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIHRvCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgLSAxXSBpcyB4KG4tMSkgZm9yIGFsbCBOckNoYW5uZWxzCisKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVsc10gdG8KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMipOckNoYW5uZWxzIC0gMV0gaXMgeChuLTIpIGZvciBhbGwgTnJDaGFubmVscworCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzIqTnJDaGFubmVsc10gdG8KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMypOckNoYW5uZWxzIC0gMV0gaXMgeShuLTEpIGZvciBhbGwgTnJDaGFubmVscworCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzMqTnJDaGFubmVsc10gdG8KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNCpOckNoYW5uZWxzIC0gMV0gaXMgeShuLTIpIGZvciBhbGwgTnJDaGFubmVscworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBCUV9NQ19EMzJGMzJDMzBfVFJDX1dSQV8wMSAoICAgICAgICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIE5yQ2hhbm5lbHMpCisKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCB5biwgdGVtcDsKKyAgICAgICAgTFZNX0lOVDE2IGlpLCBqajsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIENIQU5ORUwtV0lTRQorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgZm9yIChqaiA9IDA7IGpqIDwgTnJDaGFubmVsczsgamorKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiB5bj0gKEEyICAqIHgobi0yKSkgKi8KKyAgICAgICAgICAgICAgICB5biA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyArIGpqXTsKKworICAgICAgICAgICAgICAgIC8qIHluKz0gKEExICAqIHgobi0xKSkgKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal07CisgICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKKworICAgICAgICAgICAgICAgIC8qIHluKz0gKEEwICAqIHgobikpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiAoKnBEYXRhSW4pOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAgLyogeW4rPSAoLUIyICAqIHkobi0yKSkgKi8KKyAgICAgICAgICAgICAgICB0ZW1wID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzKjMgKyBqal07CisgICAgICAgICAgICAgICAgeW4gKz0gdGVtcDsKKworICAgICAgICAgICAgICAgIC8qIHluKz0gKC1CMSAgKiB5KG4tMSkpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyoyICsgampdOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDMgKyBqal0gPQorICAgICAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyAqIDIgKyBqal07IC8qIHkobi0yKT15KG4tMSkqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMSArIGpqXSA9CisgICAgICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal07IC8qIHgobi0yKT14KG4tMSkqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMiArIGpqXSA9IChMVk1fRkxPQVQpeW47IC8qIFVwZGF0ZSB5KG4tMSkqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tqal0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpKi8KKyAgICAgICAgICAgICAgICBwRGF0YUluKys7CisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAqcERhdGFPdXQgPSAoTFZNX0ZMT0FUKXluOyAvKiBXcml0ZSBqaiBDaGFubmVsIG91dHB1dCAqLworICAgICAgICAgICAgICAgIHBEYXRhT3V0Kys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgIH0KKyNlbmRpZiAvKlNVUFBPUlRfTUMqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZjA1ZWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsODIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KLS8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLwotLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLwotLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQotewotICAgIExWTV9GTE9BVCB0ZW1wOwotICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpIHBJbnN0YW5jZTsKLSAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKikgcFRhcHM7Ci0gICAgdGVtcCA9IHBDb2VmLT5BMjsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkExOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QTA7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5CMjsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkIxOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbNF0gPSB0ZW1wOwotfQotI2Vsc2UKLXZvaWQgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfQzMyX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCi17Ci0gIExWTV9JTlQzMiB0ZW1wOwotICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7Ci0gIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0oTFZNX0lOVDMyICopIHBUYXBzICAgICAgICAgICAgOwotCi0gIHRlbXA9cENvZWYtPkEyOwotICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdPXRlbXA7Ci0gIHRlbXA9cENvZWYtPkExOwotICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdPXRlbXA7Ci0gIHRlbXA9cENvZWYtPkEwOwotICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXRlbXA7Ci0gIHRlbXA9cENvZWYtPkIyOwotICBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdPXRlbXA7Ci0gIHRlbXA9cENvZWYtPkIxOwotICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdPXRlbXA7Ci19Ci0jZW5kaWYKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBFbmQgT2YgRmlsZTogQlFfMklfRDMyRjMyQzMyX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OTJhOWUwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jcHAKQEAgLTAsMCArMSw2MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBCUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KKy8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLworLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLworLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK3ZvaWQgQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCAoICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBMVk1fRkxPQVQgdGVtcDsKKyAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzOworICAgIHRlbXAgPSBwQ29lZi0+QTI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjI7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHRlbXA7CisgICAgdGVtcCA9IHBDb2VmLT5CMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzRdID0gdGVtcDsKK30KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogQlFfMklfRDMyRjMyQzMyX1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQlFfMklfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IGMwZjBkY2MuLjdlYjY0NzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0JRXzJJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9CUV8ySV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTE4LDcgKzE4LDYgQEAKICNpZm5kZWYgX0JRXzJJX0QzMkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KICNkZWZpbmUgX0JRXzJJX0QzMkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8KIAotCiAvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCiAvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCiB0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlXwpAQCAtMjksNyArMjgsNiBAQAogCiB0eXBlZGVmIEZpbHRlcl9TdGF0ZSAqIFBGaWx0ZXJfU3RhdGUgOwogCi0jaWZkZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfRkxPQVQKIHsKICAgICBMVk1fRkxPQVQgKiAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyBcCkBAIC0zNyw2ICszNSw1IEBACiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZWZzWzVdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCiB9RmlsdGVyX1N0YXRlX0ZMT0FUOwogdHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKLSNlbmRpZgogCiAjZW5kaWYgLyogX0JRXzJJX0QzMkYzMkNMTF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDg5MDMxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcHlfMTYuYworKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBJTkNMVURFIEZJTEVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIENPUFlfMTYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIENvcHlfMTYoIGNvbnN0IExWTV9JTlQxNiAqc3JjLAotICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuICkKLXsKLSAgICBMVk1fSU5UMTYgaWk7Ci0KLSAgICBpZiAoc3JjID4gZHN0KQotICAgIHsKLSAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAqc3JjOwotICAgICAgICAgICAgZHN0Kys7Ci0gICAgICAgICAgICBzcmMrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBzcmMgKz0gbiAtIDE7Ci0gICAgICAgIGRzdCArPSBuIC0gMTsKLSAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAqc3JjOwotICAgICAgICAgICAgZHN0LS07Ci0gICAgICAgICAgICBzcmMtLTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybjsKLX0KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBDb3B5X0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCi0gICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCi17Ci0gICAgTFZNX0lOVDE2IGlpOwotCi0gICAgaWYgKHNyYyA+IGRzdCkKLSAgICB7Ci0gICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gKnNyYzsKLSAgICAgICAgICAgIGRzdCsrOwotICAgICAgICAgICAgc3JjKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgc3JjICs9IG4gLSAxOwotICAgICAgICBkc3QgKz0gbiAtIDE7Ci0gICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gKnNyYzsKLSAgICAgICAgICAgIGRzdC0tOwotICAgICAgICAgICAgc3JjLS07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3B5XzE2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2I2NDJmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29weV8xNi5jcHAKQEAgLTAsMCArMSwxNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIENPUFlfMTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIENvcHlfMTYoIGNvbnN0IExWTV9JTlQxNiAqc3JjLAorICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuICkKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisKKyAgICBpZiAoc3JjID4gZHN0KQorICAgIHsKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAqc3JjOworICAgICAgICAgICAgZHN0Kys7CisgICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBzcmMgKz0gbiAtIDE7CisgICAgICAgIGRzdCArPSBuIC0gMTsKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAqc3JjOworICAgICAgICAgICAgZHN0LS07CisgICAgICAgICAgICBzcmMtLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybjsKK30KK3ZvaWQgQ29weV9GbG9hdCggY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQoreworICAgIExWTV9JTlQxNiBpaTsKKworICAgIGlmIChzcmMgPiBkc3QpCisgICAgeworICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9ICpzcmM7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHNyYyArPSBuIC0gMTsKKyAgICAgICAgZHN0ICs9IG4gLSAxOworICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9ICpzcmM7CisgICAgICAgICAgICBkc3QtLTsKKyAgICAgICAgICAgIHNyYy0tOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuOworfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8vIEV4dHJhY3Qgb3V0IHRoZSBzdGVyZW8gY2hhbm5lbCBwYWlyIGZyb20gbXVsdGljaGFubmVsIHNvdXJjZS4KK3ZvaWQgQ29weV9GbG9hdF9NY19TdGVyZW8oY29uc3QgTFZNX0ZMT0FUICpzcmMsCisgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LAorICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsIC8qIE51bWJlciBvZiBmcmFtZXMgKi8KKyAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIE5yQ2hhbm5lbHMpCit7CisgICAgTFZNX0lOVDE2IGlpOworCisgICAgaWYgKE5yQ2hhbm5lbHMgPj0gMikKKyAgICB7CisgICAgICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworICAgICAgICAgICAgZHN0WzBdID0gc3JjWzBdOworICAgICAgICAgICAgZHN0WzFdID0gc3JjWzFdOworICAgICAgICAgICAgZHN0ICs9IDI7CisgICAgICAgICAgICBzcmMgKz0gTnJDaGFubmVsczsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmIChOckNoYW5uZWxzID09IDEpCisgICAgeyAgIC8vIG5vdCBleHBlY3RlZCB0byBvY2N1ciwgcHJvdmlkZWQgZm9yIGNvbXBsZXRlbmVzcy4KKyAgICAgICAgc3JjICs9IChOckZyYW1lcyAtIDEpOworICAgICAgICBkc3QgKz0gMiAqIChOckZyYW1lcyAtIDEpOworICAgICAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdFswXSA9IHNyY1swXTsKKyAgICAgICAgICAgIGRzdFsxXSA9IHNyY1swXTsKKyAgICAgICAgICAgIGRzdCAtPSAyOworICAgICAgICAgICAgc3JjIC0tOworICAgICAgICB9CisgICAgfQorfQorCisvLyBNZXJnZSBhIG11bHRpY2hhbm5lbCBzb3VyY2Ugd2l0aCBzdGVyZW8gY29udGFpbmVkIGluIGRzdCwgdG8gZHN0Lgordm9pZCBDb3B5X0Zsb2F0X1N0ZXJlb19NYyhjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBOckZyYW1lcywgLyogTnVtYmVyIG9mIGZyYW1lcyovCisgICAgICAgICAgICAgICAgIExWTV9JTlQzMiBOckNoYW5uZWxzKQoreworICAgIExWTV9JTlQxNiBpaSwgamo7CisgICAgTFZNX0ZMT0FUICpzcmNfc3QgPSBkc3QgKyAyICogKE5yRnJhbWVzIC0gMSk7CisKKyAgICAvLyByZXBhY2sgZHN0IHdoaWNoIGNhcnJpZXMgc3RlcmVvIGluZm9ybWF0aW9uCisgICAgLy8gdG9nZXRoZXIgd2l0aCB0aGUgdXBwZXIgY2hhbm5lbHMgb2Ygc3JjLgorICAgIGRzdCArPSBOckNoYW5uZWxzICogKE5yRnJhbWVzIC0gMSk7CisgICAgc3JjICs9IE5yQ2hhbm5lbHMgKiAoTnJGcmFtZXMgLSAxKTsKKyAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBkc3RbMV0gPSBzcmNfc3RbMV07CisgICAgICAgIGRzdFswXSA9IHNyY19zdFswXTsgLy8gY29weSAxIGJlZm9yZSAwIGlzIHJlcXVpcmVkIGZvciBOckNoYW5uZWxzID09IDMuCisgICAgICAgIGZvciAoamogPSAyOyBqaiA8IE5yQ2hhbm5lbHM7IGpqKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGRzdFtqal0gPSBzcmNbampdOworICAgICAgICB9CisgICAgICAgIGRzdCAgICAtPSBOckNoYW5uZWxzOworICAgICAgICBzcmMgICAgLT0gTnJDaGFubmVsczsKKyAgICAgICAgc3JjX3N0IC09IDI7CisgICAgfQorfQorI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhOTgwNDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgSU5DTFVERSBGSUxFUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJNaXhlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gQ09SRV9NSVhIQVJEXzJTVF9EMzJDMzFfU0FUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBDb3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQoICAgTWl4XzJTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCi17Ci0gICAgTFZNX0ZMT0FUICBUZW1wMSxUZW1wMixUZW1wMzsKLSAgICBMVk1fSU5UMTYgaWk7Ci0gICAgTFZNX0ZMT0FUIEN1cnJlbnQxU2hvcnQ7Ci0gICAgTFZNX0ZMT0FUIEN1cnJlbnQyU2hvcnQ7Ci0KLSAgICBDdXJyZW50MVNob3J0ID0gKHBJbnN0YW5jZS0+Q3VycmVudDEpOwotICAgIEN1cnJlbnQyU2hvcnQgPSAocEluc3RhbmNlLT5DdXJyZW50Mik7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSl7Ci0gICAgICAgIFRlbXAxID0gKnNyYzErKzsKLSAgICAgICAgVGVtcDMgPSBUZW1wMSAqIEN1cnJlbnQxU2hvcnQ7Ci0gICAgICAgIFRlbXAyID0gKnNyYzIrKzsKLSAgICAgICAgVGVtcDEgPSBUZW1wMiAqIEN1cnJlbnQyU2hvcnQ7Ci0gICAgICAgIFRlbXAyID0gKFRlbXAxIC8gMi4wZikgKyAoVGVtcDMgLyAyLjBmKTsKLSAgICAgICAgaWYgKFRlbXAyID4gMC41ZikKLSAgICAgICAgICAgIFRlbXAyID0gMS4wZjsKLSAgICAgICAgZWxzZSBpZiAoVGVtcDIgPCAtMC41ZiApCi0gICAgICAgICAgICBUZW1wMiA9IC0xLjBmOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBUZW1wMiA9IChUZW1wMiAqIDIpOwotICAgICAgICAgICAgKmRzdCsrID0gVGVtcDI7Ci0gICAgfQotfQotI2Vsc2UKLXZvaWQgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKCAgIE1peF8yU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQotewotICAgIExWTV9JTlQzMiAgVGVtcDEsVGVtcDIsVGVtcDM7Ci0gICAgTFZNX0lOVDE2IGlpOwotICAgIExWTV9JTlQxNiBDdXJyZW50MVNob3J0OwotICAgIExWTV9JTlQxNiBDdXJyZW50MlNob3J0OwotCi0gICAgQ3VycmVudDFTaG9ydCA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+Q3VycmVudDEgPj4gMTYpOwotICAgIEN1cnJlbnQyU2hvcnQgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPkN1cnJlbnQyID4+IDE2KTsKLQotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKXsKLSAgICAgICAgVGVtcDE9KnNyYzErKzsKLSAgICAgICAgTVVMMzJ4MTZJTlRPMzIoVGVtcDEsQ3VycmVudDFTaG9ydCxUZW1wMywxNSkKLSAgICAgICAgVGVtcDI9KnNyYzIrKzsKLSAgICAgICAgTVVMMzJ4MTZJTlRPMzIoVGVtcDIsQ3VycmVudDJTaG9ydCxUZW1wMSwxNSkKLSAgICAgICAgVGVtcDI9KFRlbXAxPj4xKSsoVGVtcDM+PjEpOwotICAgICAgICBpZiAoVGVtcDIgPiAweDNGRkZGRkZGKQotICAgICAgICAgICAgVGVtcDIgPSAweDdGRkZGRkZGOwotICAgICAgICBlbHNlIGlmIChUZW1wMiA8IC0gMHg0MDAwMDAwMCkKLSAgICAgICAgICAgIFRlbXAyID0gIDB4ODAwMDAwMDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIFRlbXAyPShUZW1wMjw8MSk7Ci0gICAgICAgICAgICAqZHN0KysgPSBUZW1wMjsKLSAgICB9Ci19Ci0jZW5kaWYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FULmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU3NzMzNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVC5jcHAKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIENPUkVfTUlYSEFSRF8yU1RfRDMyQzMxX1NBVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIENvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVCggICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBMVk1fRkxPQVQgIFRlbXAxLFRlbXAyLFRlbXAzOworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fRkxPQVQgQ3VycmVudDFTaG9ydDsKKyAgICBMVk1fRkxPQVQgQ3VycmVudDJTaG9ydDsKKworICAgIEN1cnJlbnQxU2hvcnQgPSAocEluc3RhbmNlLT5DdXJyZW50MSk7CisgICAgQ3VycmVudDJTaG9ydCA9IChwSW5zdGFuY2UtPkN1cnJlbnQyKTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgVGVtcDEgPSAqc3JjMSsrOworICAgICAgICBUZW1wMyA9IFRlbXAxICogQ3VycmVudDFTaG9ydDsKKyAgICAgICAgVGVtcDIgPSAqc3JjMisrOworICAgICAgICBUZW1wMSA9IFRlbXAyICogQ3VycmVudDJTaG9ydDsKKyAgICAgICAgVGVtcDIgPSAoVGVtcDEgLyAyLjBmKSArIChUZW1wMyAvIDIuMGYpOworICAgICAgICBpZiAoVGVtcDIgPiAwLjVmKQorICAgICAgICAgICAgVGVtcDIgPSAxLjBmOworICAgICAgICBlbHNlIGlmIChUZW1wMiA8IC0wLjVmICkKKyAgICAgICAgICAgIFRlbXAyID0gLTEuMGY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIFRlbXAyID0gKFRlbXAyICogMik7CisgICAgICAgICAgICAqZHN0KysgPSBUZW1wMjsKKyAgICB9Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjgxNGYxOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peEluU29mdF9EMzJDMzFfU0FULmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREUgRklMRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIENPUkVfTUlYU09GVF8xU1RfRDMyQzMxX1dSQQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBCVUlMRF9GTE9BVCAvKiBCVUlMRF9GTE9BVCAqLwotdm9pZCBDb3JlX01peEluU29mdF9EMzJDMzFfU0FUKCAgICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQotewotICAgIExWTV9GTE9BVCAgICBUZW1wMSxUZW1wMixUZW1wMzsKLSAgICBMVk1fSU5UMTYgICAgIE91dExvb3A7Ci0gICAgTFZNX0lOVDE2ICAgICBJbkxvb3A7Ci0gICAgTFZNX0ZMT0FUICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGE7Ci0gICAgTFZNX0ZMT0FUICAgIEN1cnJlbnRUaW1lc0FscGhhOwotICAgIExWTV9JTlQxNiAgICAgaWksamo7Ci0KLQotICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLwotICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7Ci0KLSAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhID0gKCgxLjBmIC1wSW5zdGFuY2UtPkFscGhhKSAqIHBJbnN0YW5jZS0+VGFyZ2V0KTsKLSAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPj0gcEluc3RhbmNlLT5DdXJyZW50KXsKLSAgICAgICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArPShMVk1fRkxPQVQpKDIuMGYgLyAyMTQ3NDgzNjQ3LjBmKTsgLyogQ2VpbCovCi0gICAgfQotCi0gICAgaWYgKE91dExvb3ApewotCi0gICAgICAgIEN1cnJlbnRUaW1lc0FscGhhID0gcEluc3RhbmNlLT5DdXJyZW50ICogcEluc3RhbmNlLT5BbHBoYTsKLSAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOwotCi0gICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKXsKLSAgICAgICAgVGVtcDEgPSAqc3JjKys7Ci0gICAgICAgIFRlbXAyID0gKmRzdDsKLQotICAgICAgICBUZW1wMyA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7Ci0gICAgICAgIFRlbXAxID0gVGVtcDIgKyBUZW1wMzsKLQotICAgICAgICBpZiAoVGVtcDEgPiAxLjBmKQotICAgICAgICAgICAgVGVtcDEgPSAxLjBmOwotICAgICAgICBlbHNlIGlmIChUZW1wMSA8IC0xLjBmKQotICAgICAgICAgICAgVGVtcDEgPSAtMS4wZjsKLQotICAgICAgICAqZHN0KysgPSBUZW1wMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pewotCi0gICAgICAgIEN1cnJlbnRUaW1lc0FscGhhID0gcEluc3RhbmNlLT5DdXJyZW50ICogcEluc3RhbmNlLT5BbHBoYTsKLSAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOwotCi0gICAgICAgIGZvciAoamogPSA0OyBqaiE9MCA7IGpqLS0pewotICAgICAgICAgICAgVGVtcDEgPSAqc3JjKys7Ci0gICAgICAgICAgICBUZW1wMiA9ICpkc3Q7Ci0KLSAgICAgICAgICAgIFRlbXAzID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKLSAgICAgICAgICAgIFRlbXAxID0gVGVtcDIgKyBUZW1wMzsKLQotICAgICAgICAgICAgaWYgKFRlbXAxID4gMS4wZikKLSAgICAgICAgICAgICAgICBUZW1wMSA9IDEuMGY7Ci0gICAgICAgICAgICBlbHNlIGlmIChUZW1wMSA8IC0xLjBmKQotICAgICAgICAgICAgICAgIFRlbXAxID0gLTEuMGY7Ci0gICAgICAgICAgICAqZHN0KysgPSBUZW1wMTsKLSAgICAgICAgfQotICAgIH0KLX0KLSNlbHNlCi12b2lkIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoICAgICBNaXhfMVN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCi17Ci0gICAgTFZNX0lOVDMyICAgIFRlbXAxLFRlbXAyLFRlbXAzOwotICAgIExWTV9JTlQxNiAgICAgT3V0TG9vcDsKLSAgICBMVk1fSU5UMTYgICAgIEluTG9vcDsKLSAgICBMVk1fSU5UMzIgICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYTsKLSAgICBMVk1fSU5UMzIgICAgQ3VycmVudFRpbWVzQWxwaGE7Ci0gICAgTFZNX0lOVDE2ICAgICBpaSxqajsKLSAgICBMVk1fSU5UMTYgICBDdXJyZW50U2hvcnQ7Ci0KLSAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShuID4+IDIpOyAvKiBQcm9jZXNzIHBlciA0IHNhbXBsZXMgKi8KLSAgICBPdXRMb29wID0gKExWTV9JTlQxNikobiAtIChJbkxvb3AgPDwgMikpOwotCi0gICAgTVVMMzJ4MzJJTlRPMzIoKDB4N0ZGRkZGRkYtcEluc3RhbmNlLT5BbHBoYSkscEluc3RhbmNlLT5UYXJnZXQsVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSwzMSk7IC8qIFEzMSAqIFEwIGluIFEwICovCi0gICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ID49IHBJbnN0YW5jZS0+Q3VycmVudCl7Ci0gICAgICAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhICs9MjsgLyogQ2VpbCovCi0gICAgfQotCi0gICAgaWYgKE91dExvb3ApewotICAgICAgICBNVUwzMngzMklOVE8zMihwSW5zdGFuY2UtPkN1cnJlbnQscEluc3RhbmNlLT5BbHBoYSxDdXJyZW50VGltZXNBbHBoYSwzMSk7ICAgICAgIC8qIFEwICogUTMxIGluIFEwICovCi0gICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IFRhcmdldFRpbWVzT25lTWluQWxwaGEgKyBDdXJyZW50VGltZXNBbHBoYTsgICAgICAgICAgICAgICAgLyogUTAgKyBRMCBpbnRvIFEwKi8KLSAgICAgICAgQ3VycmVudFNob3J0ID0gKExWTV9JTlQxNikocEluc3RhbmNlLT5DdXJyZW50Pj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLwotCi0gICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKXsKLSAgICAgICAgVGVtcDE9KnNyYysrOwotICAgICAgICBUZW1wMj0qZHN0OwotICAgICAgICBNVUwzMngxNklOVE8zMihUZW1wMSxDdXJyZW50U2hvcnQsVGVtcDMsMTUpCi0gICAgICAgIFRlbXAxPShUZW1wMj4+MSkrKFRlbXAzPj4xKTsKLQotICAgICAgICBpZiAoVGVtcDEgPiAweDNGRkZGRkZGKQotICAgICAgICAgICAgVGVtcDEgPSAweDdGRkZGRkZGOwotICAgICAgICBlbHNlIGlmIChUZW1wMSA8IC0gMHg0MDAwMDAwMCkKLSAgICAgICAgICAgIFRlbXAxID0gIDB4ODAwMDAwMDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIFRlbXAxPShUZW1wMTw8MSk7Ci0gICAgICAgICAgICAqZHN0KysgPSBUZW1wMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pewotICAgICAgICBNVUwzMngzMklOVE8zMihwSW5zdGFuY2UtPkN1cnJlbnQscEluc3RhbmNlLT5BbHBoYSxDdXJyZW50VGltZXNBbHBoYSwzMSk7ICAgICAgIC8qIFEwICogUTMxIGluIFEwICovCi0gICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IFRhcmdldFRpbWVzT25lTWluQWxwaGEgKyBDdXJyZW50VGltZXNBbHBoYTsgICAgICAgICAgICAgICAgLyogUTAgKyBRMCBpbnRvIFEwKi8KLSAgICAgICAgQ3VycmVudFNob3J0ID0gKExWTV9JTlQxNikocEluc3RhbmNlLT5DdXJyZW50Pj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLwotCi0gICAgICAgIGZvciAoamogPSA0OyBqaiE9MCA7IGpqLS0pewotICAgICAgICBUZW1wMT0qc3JjKys7Ci0gICAgICAgIFRlbXAyPSpkc3Q7Ci0gICAgICAgIE1VTDMyeDE2SU5UTzMyKFRlbXAxLEN1cnJlbnRTaG9ydCxUZW1wMywxNSkKLSAgICAgICAgVGVtcDE9KFRlbXAyPj4xKSsoVGVtcDM+PjEpOwotCi0gICAgICAgIGlmIChUZW1wMSA+IDB4M0ZGRkZGRkYpCi0gICAgICAgICAgICBUZW1wMSA9IDB4N0ZGRkZGRkY7Ci0gICAgICAgIGVsc2UgaWYgKFRlbXAxIDwgLSAweDQwMDAwMDAwKQotICAgICAgICAgICAgVGVtcDEgPSAgMHg4MDAwMDAwMDsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgVGVtcDE9KFRlbXAxPDwxKTsKLSAgICAgICAgICAgICpkc3QrKyA9IFRlbXAxOwotICAgICAgICB9Ci0gICAgfQotfQotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY1YzBhZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuY3BwCkBAIC0wLDAgKzEsOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIk1peGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBDT1JFX01JWFNPRlRfMVNUX0QzMkMzMV9XUkEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoICAgICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit7CisgICAgTFZNX0ZMT0FUICAgIFRlbXAxLFRlbXAyLFRlbXAzOworICAgIExWTV9JTlQxNiAgICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICAgIEluTG9vcDsKKyAgICBMVk1fRkxPQVQgICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYTsKKyAgICBMVk1fRkxPQVQgICAgQ3VycmVudFRpbWVzQWxwaGE7CisgICAgTFZNX0lOVDE2ICAgICBpaSxqajsKKworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7CisKKyAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhID0gKCgxLjBmIC1wSW5zdGFuY2UtPkFscGhhKSAqIHBJbnN0YW5jZS0+VGFyZ2V0KTsKKyAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPj0gcEluc3RhbmNlLT5DdXJyZW50KXsKKyAgICAgICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArPShMVk1fRkxPQVQpKDIuMGYgLyAyMTQ3NDgzNjQ3LjBmKTsgLyogQ2VpbCovCisgICAgfQorCisgICAgaWYgKE91dExvb3ApeworCisgICAgICAgIEN1cnJlbnRUaW1lc0FscGhhID0gcEluc3RhbmNlLT5DdXJyZW50ICogcEluc3RhbmNlLT5BbHBoYTsKKyAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOworCisgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgVGVtcDEgPSAqc3JjKys7CisgICAgICAgIFRlbXAyID0gKmRzdDsKKworICAgICAgICBUZW1wMyA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgIFRlbXAxID0gVGVtcDIgKyBUZW1wMzsKKworICAgICAgICBpZiAoVGVtcDEgPiAxLjBmKQorICAgICAgICAgICAgVGVtcDEgPSAxLjBmOworICAgICAgICBlbHNlIGlmIChUZW1wMSA8IC0xLjBmKQorICAgICAgICAgICAgVGVtcDEgPSAtMS4wZjsKKworICAgICAgICAqZHN0KysgPSBUZW1wMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworCisgICAgICAgIEN1cnJlbnRUaW1lc0FscGhhID0gcEluc3RhbmNlLT5DdXJyZW50ICogcEluc3RhbmNlLT5BbHBoYTsKKyAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOworCisgICAgICAgIGZvciAoamogPSA0OyBqaiE9MCA7IGpqLS0peworICAgICAgICAgICAgVGVtcDEgPSAqc3JjKys7CisgICAgICAgICAgICBUZW1wMiA9ICpkc3Q7CisKKyAgICAgICAgICAgIFRlbXAzID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgICAgIFRlbXAxID0gVGVtcDIgKyBUZW1wMzsKKworICAgICAgICAgICAgaWYgKFRlbXAxID4gMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wMSA9IDEuMGY7CisgICAgICAgICAgICBlbHNlIGlmIChUZW1wMSA8IC0xLjBmKQorICAgICAgICAgICAgICAgIFRlbXAxID0gLTEuMGY7CisgICAgICAgICAgICAqZHN0KysgPSBUZW1wMTsKKyAgICAgICAgfQorICAgIH0KK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE0Y2NlZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Db3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgSU5DTFVERSBGSUxFUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJNaXhlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gQ09SRV9NSVhTT0ZUXzFTVF9EMzJDMzFfV1JBCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQotewotICAgIExWTV9GTE9BVCBUZW1wMSxUZW1wMjsKLSAgICBMVk1fSU5UMTYgT3V0TG9vcDsKLSAgICBMVk1fSU5UMTYgSW5Mb29wOwotICAgIExWTV9GTE9BVCBUYXJnZXRUaW1lc09uZU1pbkFscGhhOwotICAgIExWTV9GTE9BVCBDdXJyZW50VGltZXNBbHBoYTsKLQotICAgIExWTV9JTlQxNiBpaTsKLQotICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLwotICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7Ci0KLSAgICBUYXJnZXRUaW1lc09uZU1pbkFscGhhID0gKDEuMGYgLSBwSW5zdGFuY2UtPkFscGhhKSAqIHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBmbG9hdCAqIGZsb2F0IGluIGZsb2F0ICovCi0gICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ID49IHBJbnN0YW5jZS0+Q3VycmVudCkKLSAgICB7Ci0gICAgICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgKz0gKExWTV9GTE9BVCkoMi4wZiAvIDIxNDc0ODM2NDcuMGYpOyAvKiBDZWlsKi8KLSAgICB9Ci0KLSAgICBpZiAoT3V0TG9vcCAhPSAwKQotICAgIHsKLSAgICAgICAgQ3VycmVudFRpbWVzQWxwaGEgPSAocEluc3RhbmNlLT5DdXJyZW50ICogcEluc3RhbmNlLT5BbHBoYSk7Ci0gICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IFRhcmdldFRpbWVzT25lTWluQWxwaGEgKyBDdXJyZW50VGltZXNBbHBoYTsKLQotICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgewotICAgICAgICAgICAgVGVtcDEgPSAqc3JjOwotICAgICAgICAgICAgc3JjKys7Ci0KLSAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKLSAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKLSAgICAgICAgICAgIGRzdCsrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIEN1cnJlbnRUaW1lc0FscGhhID0gcEluc3RhbmNlLT5DdXJyZW50ICogcEluc3RhbmNlLT5BbHBoYTsKLSAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOwotCi0gICAgICAgICAgICBUZW1wMSA9ICpzcmM7Ci0gICAgICAgICAgICBzcmMrKzsKLQotICAgICAgICAgICAgVGVtcDIgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOwotICAgICAgICAgICAgKmRzdCA9IFRlbXAyOwotICAgICAgICAgICAgZHN0Kys7Ci0KLSAgICAgICAgICAgIFRlbXAxID0gKnNyYzsKLSAgICAgICAgICAgIHNyYysrOwotCi0gICAgICAgICAgICBUZW1wMiA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7Ci0gICAgICAgICAgICAqZHN0ID0gVGVtcDI7Ci0gICAgICAgICAgICBkc3QrKzsKLQotICAgICAgICAgICAgVGVtcDEgPSAqc3JjOwotICAgICAgICAgICAgc3JjKys7Ci0KLSAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKLSAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKLSAgICAgICAgICAgIGRzdCsrOwotCi0gICAgICAgICAgICBUZW1wMSA9ICpzcmM7Ci0gICAgICAgICAgICBzcmMrKzsKLSAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKLSAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKLSAgICAgICAgICAgIGRzdCsrOwotICAgIH0KLX0KLSNlbHNlCi12b2lkIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICBNaXhfMVN0X0NsbF90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCi17Ci0gICAgTFZNX0lOVDMyICBUZW1wMSxUZW1wMjsKLSAgICBMVk1fSU5UMTYgT3V0TG9vcDsKLSAgICBMVk1fSU5UMTYgSW5Mb29wOwotICAgIExWTV9JTlQzMiAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYTsKLSAgICBMVk1fSU5UMzIgIEN1cnJlbnRUaW1lc0FscGhhOwotICAgIExWTV9JTlQxNiBDdXJyZW50U2hvcnQ7Ci0gICAgTFZNX0lOVDE2IGlpOwotCi0gICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCi0gICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKLQotICAgIE1VTDMyeDMySU5UTzMyKCgweDdGRkZGRkZGLXBJbnN0YW5jZS0+QWxwaGEpLHBJbnN0YW5jZS0+VGFyZ2V0LFRhcmdldFRpbWVzT25lTWluQWxwaGEsMzEpIC8qIFEzMSAqIFEzMSBpbiBRMzEgKi8KLSAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPj0gcEluc3RhbmNlLT5DdXJyZW50KQotICAgIHsKLSAgICAgICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgKz0yOyAvKiBDZWlsKi8KLSAgICB9Ci0KLSAgICBpZiAoT3V0TG9vcCE9MCkKLSAgICB7Ci0gICAgICAgIE1VTDMyeDMySU5UTzMyKHBJbnN0YW5jZS0+Q3VycmVudCxwSW5zdGFuY2UtPkFscGhhLEN1cnJlbnRUaW1lc0FscGhhLDMxKSAgLyogUTMxICogUTMxIGluIFEzMSAqLwotICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBUYXJnZXRUaW1lc09uZU1pbkFscGhhICsgQ3VycmVudFRpbWVzQWxwaGE7ICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCi0gICAgICAgIEN1cnJlbnRTaG9ydCA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+Q3VycmVudD4+MTYpOyAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KLQotICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgewotICAgICAgICAgICAgVGVtcDE9KnNyYzsKLSAgICAgICAgICAgIHNyYysrOwotCi0gICAgICAgICAgICBNVUwzMngxNklOVE8zMihUZW1wMSxDdXJyZW50U2hvcnQsVGVtcDIsMTUpCi0gICAgICAgICAgICAqZHN0ID0gVGVtcDI7Ci0gICAgICAgICAgICBkc3QrKzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pCi0gICAgewotICAgICAgICBNVUwzMngzMklOVE8zMihwSW5zdGFuY2UtPkN1cnJlbnQscEluc3RhbmNlLT5BbHBoYSxDdXJyZW50VGltZXNBbHBoYSwzMSkgIC8qIFEzMSAqIFEzMSBpbiBRMzEgKi8KLSAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOyAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLwotICAgICAgICBDdXJyZW50U2hvcnQgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UtPkN1cnJlbnQ+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb20gUTMxIHRvIFExNSovCi0gICAgICAgICAgICBUZW1wMT0qc3JjOwotICAgICAgICAgICAgc3JjKys7Ci0KLSAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKFRlbXAxLEN1cnJlbnRTaG9ydCxUZW1wMiwxNSkKLSAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKLSAgICAgICAgICAgIGRzdCsrOwotCi0gICAgICAgICAgICBUZW1wMT0qc3JjOwotICAgICAgICAgICAgc3JjKys7Ci0KLSAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKFRlbXAxLEN1cnJlbnRTaG9ydCxUZW1wMiwxNSkKLSAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKLSAgICAgICAgICAgIGRzdCsrOwotCi0gICAgICAgICAgICBUZW1wMT0qc3JjOwotICAgICAgICAgICAgc3JjKys7Ci0KLSAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKFRlbXAxLEN1cnJlbnRTaG9ydCxUZW1wMiwxNSkKLSAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKLSAgICAgICAgICAgIGRzdCsrOwotCi0gICAgICAgICAgICBUZW1wMT0qc3JjOwotICAgICAgICAgICAgc3JjKys7Ci0gICAgICAgICAgICBNVUwzMngxNklOVE8zMihUZW1wMSxDdXJyZW50U2hvcnQsVGVtcDIsMTUpCi0gICAgICAgICAgICAqZHN0ID0gVGVtcDI7Ci0gICAgICAgICAgICBkc3QrKzsKLSAgICB9Ci19Ci0jZW5kaWYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmNzg1MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0NvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jcHAKQEAgLTAsMCArMSw5OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIENPUkVfTUlYU09GVF8xU1RfRDMyQzMxX1dSQQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCit7CisgICAgTFZNX0ZMT0FUIFRlbXAxLFRlbXAyOworICAgIExWTV9JTlQxNiBPdXRMb29wOworICAgIExWTV9JTlQxNiBJbkxvb3A7CisgICAgTFZNX0ZMT0FUIFRhcmdldFRpbWVzT25lTWluQWxwaGE7CisgICAgTFZNX0ZMT0FUIEN1cnJlbnRUaW1lc0FscGhhOworCisgICAgTFZNX0lOVDE2IGlpOworCisgICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCisgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKKworICAgIFRhcmdldFRpbWVzT25lTWluQWxwaGEgPSAoMS4wZiAtIHBJbnN0YW5jZS0+QWxwaGEpICogcEluc3RhbmNlLT5UYXJnZXQ7IC8qIGZsb2F0ICogZmxvYXQgaW4gZmxvYXQgKi8KKyAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPj0gcEluc3RhbmNlLT5DdXJyZW50KQorICAgIHsKKyAgICAgICAgVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArPSAoTFZNX0ZMT0FUKSgyLjBmIC8gMjE0NzQ4MzY0Ny4wZik7IC8qIENlaWwqLworICAgIH0KKworICAgIGlmIChPdXRMb29wICE9IDApCisgICAgeworICAgICAgICBDdXJyZW50VGltZXNBbHBoYSA9IChwSW5zdGFuY2UtPkN1cnJlbnQgKiBwSW5zdGFuY2UtPkFscGhhKTsKKyAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gVGFyZ2V0VGltZXNPbmVNaW5BbHBoYSArIEN1cnJlbnRUaW1lc0FscGhhOworCisgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisgICAgICAgICAgICBUZW1wMSA9ICpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKworICAgICAgICAgICAgVGVtcDIgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOworICAgICAgICAgICAgKmRzdCA9IFRlbXAyOworICAgICAgICAgICAgZHN0Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgQ3VycmVudFRpbWVzQWxwaGEgPSBwSW5zdGFuY2UtPkN1cnJlbnQgKiBwSW5zdGFuY2UtPkFscGhhOworICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBUYXJnZXRUaW1lc09uZU1pbkFscGhhICsgQ3VycmVudFRpbWVzQWxwaGE7CisKKyAgICAgICAgICAgIFRlbXAxID0gKnNyYzsKKyAgICAgICAgICAgIHNyYysrOworCisgICAgICAgICAgICBUZW1wMiA9IFRlbXAxICogKHBJbnN0YW5jZS0+Q3VycmVudCk7CisgICAgICAgICAgICAqZHN0ID0gVGVtcDI7CisgICAgICAgICAgICBkc3QrKzsKKworICAgICAgICAgICAgVGVtcDEgPSAqc3JjOworICAgICAgICAgICAgc3JjKys7CisKKyAgICAgICAgICAgIFRlbXAyID0gVGVtcDEgKiAocEluc3RhbmNlLT5DdXJyZW50KTsKKyAgICAgICAgICAgICpkc3QgPSBUZW1wMjsKKyAgICAgICAgICAgIGRzdCsrOworCisgICAgICAgICAgICBUZW1wMSA9ICpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKworICAgICAgICAgICAgVGVtcDIgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOworICAgICAgICAgICAgKmRzdCA9IFRlbXAyOworICAgICAgICAgICAgZHN0Kys7CisKKyAgICAgICAgICAgIFRlbXAxID0gKnNyYzsKKyAgICAgICAgICAgIHNyYysrOworICAgICAgICAgICAgVGVtcDIgPSBUZW1wMSAqIChwSW5zdGFuY2UtPkN1cnJlbnQpOworICAgICAgICAgICAgKmRzdCA9IFRlbXAyOworICAgICAgICAgICAgZHN0Kys7CisgICAgfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2MWM5ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJEQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgTGVmdERDLFJpZ2h0REM7Ci0gICAgICAgIExWTV9GTE9BVCBEaWZmOwotICAgICAgICBMVk1fSU5UMzIgajsKLSAgICAgICAgUEZpbHRlcl9GTE9BVF9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZSkgcEluc3RhbmNlOwotCi0gICAgICAgIExlZnREQyA9IHBCaXF1YWRTdGF0ZS0+TGVmdERDOwotICAgICAgICBSaWdodERDID0gcEJpcXVhZFN0YXRlLT5SaWdodERDOwotICAgICAgICBmb3IoaiA9IE5yU2FtcGxlcy0xOyBqID49IDA7IGotLSkKLSAgICAgICAgewotICAgICAgICAgICAgLyogU3VidHJhY3QgREMgYW4gc2F0dXJhdGUgKi8KLSAgICAgICAgICAgIERpZmYgPSogKHBEYXRhSW4rKykgLSAoTGVmdERDKTsKLSAgICAgICAgICAgIGlmIChEaWZmID4gMS4wZikgewotICAgICAgICAgICAgICAgIERpZmYgPSAxLjBmOyB9Ci0gICAgICAgICAgICBlbHNlIGlmIChEaWZmIDwgLTEuMGYpIHsKLSAgICAgICAgICAgICAgICBEaWZmID0gLTEuMGY7IH0KLSAgICAgICAgICAgICoocERhdGFPdXQrKykgPSAoTFZNX0ZMT0FUKURpZmY7Ci0gICAgICAgICAgICBpZiAoRGlmZiA8IDApIHsKLSAgICAgICAgICAgICAgICBMZWZ0REMgLT0gRENfRkxPQVRfU1RFUDsgfQotICAgICAgICAgICAgZWxzZSB7Ci0gICAgICAgICAgICAgICAgTGVmdERDICs9IERDX0ZMT0FUX1NURVA7IH0KLQotCi0gICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbiBzYXR1cmF0ZSAqLwotICAgICAgICAgICAgRGlmZiA9KiAocERhdGFJbisrKSAtIChSaWdodERDKTsKLSAgICAgICAgICAgIGlmIChEaWZmID4gMS4wZikgewotICAgICAgICAgICAgICAgIERpZmYgPSAxLjBmOyB9Ci0gICAgICAgICAgICBlbHNlIGlmIChEaWZmIDwgLTEuMGYpIHsKLSAgICAgICAgICAgICAgICBEaWZmID0gLTEuMGY7IH0KLSAgICAgICAgICAgICoocERhdGFPdXQrKykgPSAoTFZNX0ZMT0FUKURpZmY7Ci0gICAgICAgICAgICBpZiAoRGlmZiA8IDApIHsKLSAgICAgICAgICAgICAgICBSaWdodERDIC09IERDX0ZMT0FUX1NURVA7IH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFJpZ2h0REMgKz0gRENfRkxPQVRfU1RFUDsgfQotCi0gICAgICAgIH0KLSAgICAgICAgcEJpcXVhZFN0YXRlLT5MZWZ0REMgPSBMZWZ0REM7Ci0gICAgICAgIHBCaXF1YWRTdGF0ZS0+UmlnaHREQyA9IFJpZ2h0REM7Ci0KLQotICAgIH0KLSNlbHNlCi12b2lkIERDXzJJX0QxNl9UUkNfV1JBXzAxKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0gICAgewotICAgICAgICBMVk1fSU5UMzIgTGVmdERDLFJpZ2h0REM7Ci0gICAgICAgIExWTV9JTlQzMiBEaWZmOwotICAgICAgICBMVk1fSU5UMzIgajsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOwotCi0gICAgICAgIExlZnREQyAgPSAgIHBCaXF1YWRTdGF0ZS0+TGVmdERDOwotICAgICAgICBSaWdodERDID0gICBwQmlxdWFkU3RhdGUtPlJpZ2h0REM7Ci0gICAgICAgIGZvcihqPU5yU2FtcGxlcy0xO2o+PTA7ai0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbiBzYXR1cmF0ZSAqLwotICAgICAgICAgICAgRGlmZj0qKHBEYXRhSW4rKyktKExlZnREQz4+MTYpOwotICAgICAgICAgICAgaWYgKERpZmYgPiAzMjc2NykgewotICAgICAgICAgICAgICAgIERpZmYgPSAzMjc2NzsgfQotICAgICAgICAgICAgZWxzZSBpZiAoRGlmZiA8IC0zMjc2OCkgewotICAgICAgICAgICAgICAgIERpZmYgPSAtMzI3Njg7IH0KLSAgICAgICAgICAgICoocERhdGFPdXQrKyk9KExWTV9JTlQxNilEaWZmOwotICAgICAgICAgICAgaWYgKERpZmYgPCAwKSB7Ci0gICAgICAgICAgICAgICAgTGVmdERDIC09IERDX0QxNl9TVEVQOyB9Ci0gICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICBMZWZ0REMgKz0gRENfRDE2X1NURVA7IH0KLQotCi0gICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbiBzYXR1cmF0ZSAqLwotICAgICAgICAgICAgRGlmZj0qKHBEYXRhSW4rKyktKFJpZ2h0REM+PjE2KTsKLSAgICAgICAgICAgIGlmIChEaWZmID4gMzI3NjcpIHsKLSAgICAgICAgICAgICAgICBEaWZmID0gMzI3Njc7IH0KLSAgICAgICAgICAgIGVsc2UgaWYgKERpZmYgPCAtMzI3NjgpIHsKLSAgICAgICAgICAgICAgICBEaWZmID0gLTMyNzY4OyB9Ci0gICAgICAgICAgICAqKHBEYXRhT3V0KyspPShMVk1fSU5UMTYpRGlmZjsKLSAgICAgICAgICAgIGlmIChEaWZmIDwgMCkgewotICAgICAgICAgICAgICAgIFJpZ2h0REMgLT0gRENfRDE2X1NURVA7IH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIFJpZ2h0REMgKz0gRENfRDE2X1NURVA7IH0KLQotICAgICAgICB9Ci0gICAgICAgIHBCaXF1YWRTdGF0ZS0+TGVmdERDICAgID0gICBMZWZ0REM7Ci0gICAgICAgIHBCaXF1YWRTdGF0ZS0+UmlnaHREQyAgID0gICBSaWdodERDOwotCi0KLSAgICB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2NlNGQzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDEuY3BwCkBAIC0wLDAgKzEsMTE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKK3ZvaWQgRENfMklfRDE2X1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCBMZWZ0REMsUmlnaHREQzsKKyAgICAgICAgTFZNX0ZMT0FUIERpZmY7CisgICAgICAgIExWTV9JTlQzMiBqOworICAgICAgICBQRmlsdGVyX0ZMT0FUX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0ZMT0FUX1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgTGVmdERDID0gcEJpcXVhZFN0YXRlLT5MZWZ0REM7CisgICAgICAgIFJpZ2h0REMgPSBwQmlxdWFkU3RhdGUtPlJpZ2h0REM7CisgICAgICAgIGZvcihqID0gTnJTYW1wbGVzLTE7IGogPj0gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbmQgc2F0dXJhdGUgKi8KKyAgICAgICAgICAgIERpZmYgPSogKHBEYXRhSW4rKykgLSAoTGVmdERDKTsKKyAgICAgICAgICAgIGlmIChEaWZmID4gMS4wZikgeworICAgICAgICAgICAgICAgIERpZmYgPSAxLjBmOyB9CisgICAgICAgICAgICBlbHNlIGlmIChEaWZmIDwgLTEuMGYpIHsKKyAgICAgICAgICAgICAgICBEaWZmID0gLTEuMGY7IH0KKyAgICAgICAgICAgICoocERhdGFPdXQrKykgPSAoTFZNX0ZMT0FUKURpZmY7CisgICAgICAgICAgICBpZiAoRGlmZiA8IDApIHsKKyAgICAgICAgICAgICAgICBMZWZ0REMgLT0gRENfRkxPQVRfU1RFUDsgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgTGVmdERDICs9IERDX0ZMT0FUX1NURVA7IH0KKworICAgICAgICAgICAgLyogU3VidHJhY3QgREMgYW4gc2F0dXJhdGUgKi8KKyAgICAgICAgICAgIERpZmYgPSogKHBEYXRhSW4rKykgLSAoUmlnaHREQyk7CisgICAgICAgICAgICBpZiAoRGlmZiA+IDEuMGYpIHsKKyAgICAgICAgICAgICAgICBEaWZmID0gMS4wZjsgfQorICAgICAgICAgICAgZWxzZSBpZiAoRGlmZiA8IC0xLjBmKSB7CisgICAgICAgICAgICAgICAgRGlmZiA9IC0xLjBmOyB9CisgICAgICAgICAgICAqKHBEYXRhT3V0KyspID0gKExWTV9GTE9BVClEaWZmOworICAgICAgICAgICAgaWYgKERpZmYgPCAwKSB7CisgICAgICAgICAgICAgICAgUmlnaHREQyAtPSBEQ19GTE9BVF9TVEVQOyB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBSaWdodERDICs9IERDX0ZMT0FUX1NURVA7IH0KKworICAgICAgICB9CisgICAgICAgIHBCaXF1YWRTdGF0ZS0+TGVmdERDID0gTGVmdERDOworICAgICAgICBwQmlxdWFkU3RhdGUtPlJpZ2h0REMgPSBSaWdodERDOworCisgICAgfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBGVU5DVElPTjogICAgICAgRENfTWNfRDE2X1RSQ19XUkFfMDEKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBEQyByZW1vdmFsIGZyb20gYWxsIGNoYW5uZWxzIG9mIGEgbXVsdGljaGFubmVsIGlucHV0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBwSW5zdGFuY2UgICAgICBJbnN0YW5jZSBwb2ludGVyCisgKiAgcERhdGFJbiAgICAgICAgSW5wdXQvU291cmNlCisgKiAgcERhdGFPdXQgICAgICAgT3V0cHV0L0Rlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBEQ19NY19EMTZfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJDaGFubmVscykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAqQ2hEQzsKKyAgICAgICAgTFZNX0ZMT0FUIERpZmY7CisgICAgICAgIExWTV9JTlQzMiBqOworICAgICAgICBMVk1fSU5UMzIgaTsKKyAgICAgICAgUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYyBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYykgcEluc3RhbmNlOworCisgICAgICAgIENoREMgPSAmcEJpcXVhZFN0YXRlLT5DaERDWzBdOworICAgICAgICBmb3IgKGogPSBOckZyYW1lcyAtIDE7IGogPj0gMDsgai0tKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBTdWJ0cmFjdCBEQyBhbmQgc2F0dXJhdGUgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IE5yQ2hhbm5lbHMgLSAxOyBpID49IDA7IGktLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBEaWZmID0gKihwRGF0YUluKyspIC0gKENoRENbaV0pOworICAgICAgICAgICAgICAgIGlmIChEaWZmID4gMS4wZikgeworICAgICAgICAgICAgICAgICAgICBEaWZmID0gMS4wZjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERpZmYgPCAtMS4wZikgeworICAgICAgICAgICAgICAgICAgICBEaWZmID0gLTEuMGY7IH0KKyAgICAgICAgICAgICAgICAqKHBEYXRhT3V0KyspID0gKExWTV9GTE9BVClEaWZmOworICAgICAgICAgICAgICAgIGlmIChEaWZmIDwgMCkgeworICAgICAgICAgICAgICAgICAgICBDaERDW2ldIC09IERDX0ZMT0FUX1NURVA7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQ2hEQ1tpXSArPSBEQ19GTE9BVF9TVEVQOyB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgfQorCisgICAgfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmNGZjZDguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkRDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UpCi17Ci0gICAgUEZpbHRlcl9GTE9BVF9TdGF0ZSBwQmlxdWFkU3RhdGUgID0gKFBGaWx0ZXJfRkxPQVRfU3RhdGUpIHBJbnN0YW5jZTsKLSAgICBwQmlxdWFkU3RhdGUtPkxlZnREQyAgICAgICAgPSAwLjBmOwotICAgIHBCaXF1YWRTdGF0ZS0+UmlnaHREQyAgICAgICA9IDAuMGY7Ci19Ci0jZWxzZQotdm9pZCAgRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UpCi17Ci0gICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKLSAgICBwQmlxdWFkU3RhdGUtPkxlZnREQyAgICAgICAgPSAwOwotICAgIHBCaXF1YWRTdGF0ZS0+UmlnaHREQyAgICAgICA9IDA7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfSW5pdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVlZTExMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX0luaXQuY3BwCkBAIC0wLDAgKzEsMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJEQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCit2b2lkICBEQ18ySV9EMTZfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSkKK3sKKyAgICBQRmlsdGVyX0ZMT0FUX1N0YXRlIHBCaXF1YWRTdGF0ZSAgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZSkgcEluc3RhbmNlOworICAgIHBCaXF1YWRTdGF0ZS0+TGVmdERDICAgICAgICA9IDAuMGY7CisgICAgcEJpcXVhZFN0YXRlLT5SaWdodERDICAgICAgID0gMC4wZjsKK30KKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkICBEQ19NY19EMTZfVFJDX1dSQV8wMV9Jbml0KEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSkKK3sKKyAgICBQRmlsdGVyX0ZMT0FUX1N0YXRlX01jIHBCaXF1YWRTdGF0ZSAgPSAoUEZpbHRlcl9GTE9BVF9TdGF0ZV9NYykgcEluc3RhbmNlOworICAgIExWTV9JTlQzMiBpOworICAgIGZvciAoaSA9IDA7IGkgPCBMVk1fTUFYX0NIQU5ORUxTOyBpKyspCisgICAgeworICAgICAgICBwQmlxdWFkU3RhdGUtPkNoRENbaV0gPSAwLjBmOworICAgIH0KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRENfMklfRDE2X1RSQ19XUkFfMDFfUHJpdmF0ZS5oCmluZGV4IGZhNmI3MjkuLjQxNzBiM2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RDXzJJX0QxNl9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EQ18ySV9EMTZfVFJDX1dSQV8wMV9Qcml2YXRlLmgKQEAgLTE4LDI5ICsxOCwyMSBAQAogI2lmbmRlZiBfRENfMklfRDE2X1RSQ19XUkFfMDFfUFJJVkFURV9IXwogI2RlZmluZSBfRENfMklfRDE2X1RSQ19XUkFfMDFfUFJJVkFURV9IXwogCi0jaWZkZWYgQlVJTERfRkxPQVQKLSNkZWZpbmUgRENfRkxPQVRfU1RFUCAgIDAuMDAwMDAwMjM4NGY7Ci0jZWxzZQotI2RlZmluZSBEQ19EMTZfU1RFUCAgICAgMHgyMDA7Ci0jZW5kaWYKLQorI2RlZmluZSBEQ19GTE9BVF9TVEVQICAgMC4wMDAwMDAyMzg0ZgogCiAvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCiAvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4qLwotI2lmZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX0ZMT0FUX1N0YXRlXwogewogICAgIExWTV9GTE9BVCAgTGVmdERDOyAgICAgLyogTGVmdERDICAqLwogICAgIExWTV9GTE9BVCAgUmlnaHREQzsgICAgLyogUmlnaHREQyAgKi8KIH1GaWx0ZXJfRkxPQVRfU3RhdGU7CiB0eXBlZGVmIEZpbHRlcl9GTE9BVF9TdGF0ZSAqIFBGaWx0ZXJfRkxPQVRfU3RhdGUgOwotI2Vsc2UKLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCisjaWZkZWYgU1VQUE9SVF9NQwordHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9GTE9BVF9TdGF0ZV9NY18KIHsKLSAgTFZNX0lOVDMyICBMZWZ0REM7ICAgICAvKiBMZWZ0REMgICovCi0gIExWTV9JTlQzMiAgUmlnaHREQzsgICAgLyogUmlnaHREQyAgKi8KLX1GaWx0ZXJfU3RhdGU7Ci0KLXR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CisgICAgTFZNX0ZMT0FUICBDaERDW0xWTV9NQVhfQ0hBTk5FTFNdOyAgICAgLyogQ2hhbm5lbERDICAqLworfSBGaWx0ZXJfRkxPQVRfU3RhdGVfTWM7Cit0eXBlZGVmIEZpbHRlcl9GTE9BVF9TdGF0ZV9NYyAqIFBGaWx0ZXJfRkxPQVRfU3RhdGVfTWMgOwogI2VuZGlmCiAjZW5kaWYgLyogX0RDXzJJX0QxNl9UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDRlOThlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREUgRklMRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTFZNX1R5cGVzLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIERlbGF5QWxsUGFzc18zMngzMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgRGVsYXlBbGxQYXNzX1NhdF8zMngxNlRvMzIoICBMVk1fSU5UMzIgICpkZWxheSwgICAgICAgICAgICAgICAgICAgIC8qIERlbGF5IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgc2l6ZSwgICAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgc2l6ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBjb2VmZiwgICAgICAgICAgICAgICAgICAgICAgLyogQWxsIHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBEZWxheU9mZnNldCwgICAgICAgICAgICAgICAvKiBTaW1wbGUgZGVsYXkgb2Zmc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAqcEFsbFBhc3NPZmZzZXQsICAgICAgICAgICAvKiBBbGwgcGFzcyBmaWx0ZXIgZGVsYXkgb2Zmc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAqZHN0LCAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UvZGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiAgc2FtcGxlcyAqLwotewotICAgIExWTV9JTlQxNiAgIGk7Ci0gICAgTFZNX1VJTlQxNiAgIEFsbFBhc3NPZmZzZXQgPSAqcEFsbFBhc3NPZmZzZXQ7Ci0gICAgTFZNX0lOVDMyICAgIHRlbXA7Ci0gICAgTFZNX0lOVDMyICAgIGEsYixjOwotCi0gICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKLSAgICB7Ci0KLSAgICAgICAgTVVMMzJ4MTZJTlRPMzIoZGVsYXlbQWxsUGFzc09mZnNldF0sIGNvZWZmLCB0ZW1wLCAxNSkKLSAgICAgICAgYSA9IHRlbXA7Ci0gICAgICAgIGIgPSBkZWxheVtEZWxheU9mZnNldF07Ci0gICAgICAgIERlbGF5T2Zmc2V0Kys7Ci0KLSAgICAgICAgYyA9IGEgKyBiOwotICAgICAgICBpZiAoKCgoYyBeIGEpICYgKGMgXiBiKSkgPj4gMzEpICE9IDApICAvKiBvdmVyZmxvdyAvIHVuZGVyZmxvdyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBpZihhIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjID0gMHg4MDAwMDAwMEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYyA9IDB4N0ZGRkZGRkZMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICpkc3QgPSBjOwotICAgICAgICBkc3QrKzsKLQotCi0gICAgICAgIE1VTDMyeDE2SU5UTzMyKGMsIC1jb2VmZiwgdGVtcCwgMTUpCi0gICAgICAgIGEgPSB0ZW1wOwotICAgICAgICBiID0gZGVsYXlbQWxsUGFzc09mZnNldF07Ci0gICAgICAgIGMgPSBhICsgYjsKLSAgICAgICAgaWYgKCgoKGMgXiBhKSAmIChjIF4gYikpID4+IDMxKSE9MCkgIC8qIG92ZXJmbG93IC8gdW5kZXJmbG93ICovCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKGEgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGMgPSAweDgwMDAwMDAwTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjID0gMHg3RkZGRkZGRkw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZGVsYXlbQWxsUGFzc09mZnNldF0gPSBjOwotICAgICAgICBBbGxQYXNzT2Zmc2V0Kys7Ci0KLSAgICAgICAgLyogTWFrZSB0aGUgZGVsYXkgYnVmZmVyIGEgY2lyY3VsYXIgYnVmZmVyICovCi0gICAgICAgIGlmIChEZWxheU9mZnNldCA+PSBzaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICBEZWxheU9mZnNldCA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoQWxsUGFzc09mZnNldCA+PSBzaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICBBbGxQYXNzT2Zmc2V0ID0gMDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qIFVwZGF0ZSB0aGUgb2Zmc2V0ICovCi0gICAgKnBBbGxQYXNzT2Zmc2V0ID0gQWxsUGFzc09mZnNldDsKLQotICAgIHJldHVybjsKLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5QWxsUGFzc19TYXRfMzJ4MTZUbzMyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzFmYWUyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlBbGxQYXNzX1NhdF8zMngxNlRvMzIuY3BwCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gRGVsYXlBbGxQYXNzXzMyeDMyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBEZWxheUFsbFBhc3NfU2F0XzMyeDE2VG8zMiggIExWTV9JTlQzMiAgKmRlbGF5LCAgICAgICAgICAgICAgICAgICAgLyogRGVsYXkgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiBzaXplLCAgICAgICAgICAgICAgICAgICAgICAvKiBEZWxheSBzaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IGNvZWZmLCAgICAgICAgICAgICAgICAgICAgICAvKiBBbGwgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2IERlbGF5T2Zmc2V0LCAgICAgICAgICAgICAgIC8qIFNpbXBsZSBkZWxheSBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICpwQWxsUGFzc09mZnNldCwgICAgICAgICAgIC8qIEFsbCBwYXNzIGZpbHRlciBkZWxheSBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZS9kZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mICBzYW1wbGVzICovCit7CisgICAgTFZNX0lOVDE2ICAgaTsKKyAgICBMVk1fVUlOVDE2ICAgQWxsUGFzc09mZnNldCA9ICpwQWxsUGFzc09mZnNldDsKKyAgICBMVk1fSU5UMzIgICAgdGVtcDsKKyAgICBMVk1fSU5UMzIgICAgYSxiLGM7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgIHsKKworICAgICAgICBNVUwzMngxNklOVE8zMihkZWxheVtBbGxQYXNzT2Zmc2V0XSwgY29lZmYsIHRlbXAsIDE1KQorICAgICAgICBhID0gdGVtcDsKKyAgICAgICAgYiA9IGRlbGF5W0RlbGF5T2Zmc2V0XTsKKyAgICAgICAgRGVsYXlPZmZzZXQrKzsKKworICAgICAgICBjID0gYSArIGI7CisgICAgICAgIGlmICgoKChjIF4gYSkgJiAoYyBeIGIpKSA+PiAzMSkgIT0gMCkgIC8qIG92ZXJmbG93IC8gdW5kZXJmbG93ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGEgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGMgPSAweDgwMDAwMDAwTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjID0gMHg3RkZGRkZGRkw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgKmRzdCA9IGM7CisgICAgICAgIGRzdCsrOworCisgICAgICAgIE1VTDMyeDE2SU5UTzMyKGMsIC1jb2VmZiwgdGVtcCwgMTUpCisgICAgICAgIGEgPSB0ZW1wOworICAgICAgICBiID0gZGVsYXlbQWxsUGFzc09mZnNldF07CisgICAgICAgIGMgPSBhICsgYjsKKyAgICAgICAgaWYgKCgoKGMgXiBhKSAmIChjIF4gYikpID4+IDMxKSE9MCkgIC8qIG92ZXJmbG93IC8gdW5kZXJmbG93ICovCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKGEgPCAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGMgPSAweDgwMDAwMDAwTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjID0gMHg3RkZGRkZGRkw7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGVsYXlbQWxsUGFzc09mZnNldF0gPSBjOworICAgICAgICBBbGxQYXNzT2Zmc2V0Kys7CisKKyAgICAgICAgLyogTWFrZSB0aGUgZGVsYXkgYnVmZmVyIGEgY2lyY3VsYXIgYnVmZmVyICovCisgICAgICAgIGlmIChEZWxheU9mZnNldCA+PSBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICBEZWxheU9mZnNldCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoQWxsUGFzc09mZnNldCA+PSBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICBBbGxQYXNzT2Zmc2V0ID0gMDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFVwZGF0ZSB0aGUgb2Zmc2V0ICovCisgICAgKnBBbGxQYXNzT2Zmc2V0ID0gQWxsUGFzc09mZnNldDsKKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTAyNzE2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREUgRklMRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gRGVsYXlNaXhfMTZ4MTYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIERlbGF5TWl4XzE2eDE2KGNvbnN0IExWTV9JTlQxNiAqc3JjLCAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkZWxheSwgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNpemUsICAgICAgICAgICAvKiBEZWxheSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LCAgICAgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqcE9mZnNldCwgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCi17Ci0gICAgTFZNX0lOVDE2ICAgaTsKLSAgICBMVk1fSU5UMTYgICBPZmZzZXQgID0gKnBPZmZzZXQ7Ci0gICAgTFZNX0lOVDE2ICAgdGVtcDsKLQotICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCi0gICAgewotICAgICAgICAvKiBMZWZ0IGNoYW5uZWwgKi8KLSAgICAgICAgdGVtcCA9IChMVk1fSU5UMTYpKChMVk1fVUlOVDMyKSgoTFZNX0lOVDMyKSgqZHN0KSArIChMVk1fSU5UMzIpZGVsYXlbT2Zmc2V0XSkgPj4gMSk7Ci0gICAgICAgICpkc3QgPSB0ZW1wOwotICAgICAgICBkc3QrKzsKLQotICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKLSAgICAgICAgT2Zmc2V0Kys7Ci0gICAgICAgIHNyYysrOwotCi0KLSAgICAgICAgLyogUmlnaHQgY2hhbm5lbCAqLwotICAgICAgICB0ZW1wID0gKExWTV9JTlQxNikoKExWTV9VSU5UMzIpKChMVk1fSU5UMzIpKCpkc3QpIC0gKExWTV9JTlQzMilkZWxheVtPZmZzZXRdKSA+PiAxKTsKLSAgICAgICAgKmRzdCA9IHRlbXA7Ci0gICAgICAgIGRzdCsrOwotCi0gICAgICAgIGRlbGF5W09mZnNldF0gPSAqc3JjOwotICAgICAgICBPZmZzZXQrKzsKLSAgICAgICAgc3JjKys7Ci0KLSAgICAgICAgLyogTWFrZSB0aGUgcmV2ZXJiIGRlbGF5IGJ1ZmZlciBhIGNpcmN1bGFyIGJ1ZmZlciAqLwotICAgICAgICBpZiAoT2Zmc2V0ID49IHNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9mZnNldCA9IDA7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiBVcGRhdGUgdGhlIG9mZnNldCAqLwotICAgICpwT2Zmc2V0ID0gT2Zmc2V0OwotCi0gICAgcmV0dXJuOwotfQotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIERlbGF5TWl4X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAqc3JjLCAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkZWxheSwgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNpemUsICAgICAgICAgICAvKiBEZWxheSBzaXplICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAqZHN0LCAgICAgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqcE9mZnNldCwgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCi17Ci0gICAgTFZNX0lOVDE2ICAgaTsKLSAgICBMVk1fSU5UMTYgICBPZmZzZXQgID0gKnBPZmZzZXQ7Ci0gICAgTFZNX0ZMT0FUICAgdGVtcDsKLQotICAgIGZvciAoaT0wOyBpPG47IGkrKykKLSAgICB7Ci0gICAgICAgIC8qIExlZnQgY2hhbm5lbCAqLwotICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0ZMT0FUKSgoTFZNX0ZMT0FUKSgqZHN0ICsgKExWTV9GTE9BVClkZWxheVtPZmZzZXRdKSAvIDIuMGYpOwotICAgICAgICAqZHN0ICAgICAgICAgICAgPSB0ZW1wOwotICAgICAgICBkc3QrKzsKLQotICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKLSAgICAgICAgT2Zmc2V0Kys7Ci0gICAgICAgIHNyYysrOwotCi0KLSAgICAgICAgLyogUmlnaHQgY2hhbm5lbCAqLwotICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0ZMT0FUKSgoTFZNX0ZMT0FUKSgqZHN0IC0gKExWTV9GTE9BVClkZWxheVtPZmZzZXRdKSAvIDIuMGYpOwotICAgICAgICAqZHN0ICAgICAgICAgICAgPSB0ZW1wOwotICAgICAgICBkc3QrKzsKLQotICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKLSAgICAgICAgT2Zmc2V0Kys7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgIC8qIE1ha2UgdGhlIHJldmVyYiBkZWxheSBidWZmZXIgYSBjaXJjdWxhciBidWZmZXIgKi8KLSAgICAgICAgaWYgKE9mZnNldCA+PSBzaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICBPZmZzZXQgPSAwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogVXBkYXRlIHRoZSBvZmZzZXQgKi8KLSAgICAqcE9mZnNldCA9IE9mZnNldDsKLQotICAgIHJldHVybjsKLX0KLSNlbmRpZgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9EZWxheU1peF8xNngxNi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTJkMjYzZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5TWl4XzE2eDE2LmNwcApAQCAtMCwwICsxLDExNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gRGVsYXlNaXhfMTZ4MTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIERlbGF5TWl4XzE2eDE2KGNvbnN0IExWTV9JTlQxNiAqc3JjLCAgICAgICAgICAgLyogU291cmNlIDEsIHRvIGJlIGRlbGF5ZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpkZWxheSwgICAgICAgICAvKiBEZWxheSBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IHNpemUsICAgICAgICAgICAvKiBEZWxheSBzaXplICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LCAgICAgICAgICAgLyogU291cmNlL2Rlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqcE9mZnNldCwgICAgICAgLyogRGVsYXkgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKSAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCit7CisgICAgTFZNX0lOVDE2ICAgaTsKKyAgICBMVk1fSU5UMTYgICBPZmZzZXQgID0gKnBPZmZzZXQ7CisgICAgTFZNX0lOVDE2ICAgdGVtcDsKKworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgeworICAgICAgICAvKiBMZWZ0IGNoYW5uZWwgKi8KKyAgICAgICAgdGVtcCA9IChMVk1fSU5UMTYpKChMVk1fVUlOVDMyKSgoTFZNX0lOVDMyKSgqZHN0KSArIChMVk1fSU5UMzIpZGVsYXlbT2Zmc2V0XSkgPj4gMSk7CisgICAgICAgICpkc3QgPSB0ZW1wOworICAgICAgICBkc3QrKzsKKworICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKKyAgICAgICAgT2Zmc2V0Kys7CisgICAgICAgIHNyYysrOworCisgICAgICAgIC8qIFJpZ2h0IGNoYW5uZWwgKi8KKyAgICAgICAgdGVtcCA9IChMVk1fSU5UMTYpKChMVk1fVUlOVDMyKSgoTFZNX0lOVDMyKSgqZHN0KSAtIChMVk1fSU5UMzIpZGVsYXlbT2Zmc2V0XSkgPj4gMSk7CisgICAgICAgICpkc3QgPSB0ZW1wOworICAgICAgICBkc3QrKzsKKworICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKKyAgICAgICAgT2Zmc2V0Kys7CisgICAgICAgIHNyYysrOworCisgICAgICAgIC8qIE1ha2UgdGhlIHJldmVyYiBkZWxheSBidWZmZXIgYSBjaXJjdWxhciBidWZmZXIgKi8KKyAgICAgICAgaWYgKE9mZnNldCA+PSBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICBPZmZzZXQgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVXBkYXRlIHRoZSBvZmZzZXQgKi8KKyAgICAqcE9mZnNldCA9IE9mZnNldDsKKworICAgIHJldHVybjsKK30KK3ZvaWQgRGVsYXlNaXhfRmxvYXQoY29uc3QgTFZNX0ZMT0FUICpzcmMsICAgICAgICAgICAvKiBTb3VyY2UgMSwgdG8gYmUgZGVsYXllZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRlbGF5LCAgICAgICAgIC8qIERlbGF5IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgc2l6ZSwgICAgICAgICAgIC8qIERlbGF5IHNpemUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsICAgICAgICAgICAvKiBTb3VyY2UvZGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICpwT2Zmc2V0LCAgICAgICAvKiBEZWxheSBvZmZzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KK3sKKyAgICBMVk1fSU5UMTYgICBpOworICAgIExWTV9JTlQxNiAgIE9mZnNldCAgPSAqcE9mZnNldDsKKyAgICBMVk1fRkxPQVQgICB0ZW1wOworCisgICAgZm9yIChpPTA7IGk8bjsgaSsrKQorICAgIHsKKyAgICAgICAgLyogTGVmdCBjaGFubmVsICovCisgICAgICAgIHRlbXAgICAgICAgICAgICA9IChMVk1fRkxPQVQpKChMVk1fRkxPQVQpKCpkc3QgKyAoTFZNX0ZMT0FUKWRlbGF5W09mZnNldF0pIC8gMi4wZik7CisgICAgICAgICpkc3QgICAgICAgICAgICA9IHRlbXA7CisgICAgICAgIGRzdCsrOworCisgICAgICAgIGRlbGF5W09mZnNldF0gPSAqc3JjOworICAgICAgICBPZmZzZXQrKzsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgLyogUmlnaHQgY2hhbm5lbCAqLworICAgICAgICB0ZW1wICAgICAgICAgICAgPSAoTFZNX0ZMT0FUKSgoTFZNX0ZMT0FUKSgqZHN0IC0gKExWTV9GTE9BVClkZWxheVtPZmZzZXRdKSAvIDIuMGYpOworICAgICAgICAqZHN0ICAgICAgICAgICAgPSB0ZW1wOworICAgICAgICBkc3QrKzsKKworICAgICAgICBkZWxheVtPZmZzZXRdID0gKnNyYzsKKyAgICAgICAgT2Zmc2V0Kys7CisgICAgICAgIHNyYysrOworCisgICAgICAgIC8qIE1ha2UgdGhlIHJldmVyYiBkZWxheSBidWZmZXIgYSBjaXJjdWxhciBidWZmZXIgKi8KKyAgICAgICAgaWYgKE9mZnNldCA+PSBzaXplKQorICAgICAgICB7CisgICAgICAgICAgICBPZmZzZXQgPSAwOworICAgICAgICB9CisgICAgfQorCisgICAgLyogVXBkYXRlIHRoZSBvZmZzZXQgKi8KKyAgICAqcE9mZnNldCA9IE9mZnNldDsKKworICAgIHJldHVybjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlXcml0ZV8zMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlXcml0ZV8zMi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0RlbGF5V3JpdGVfMzIuYwpyZW5hbWUgdG8gbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRGVsYXlXcml0ZV8zMi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMzljODhjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEFTU1VNUFRJT05TOgotIENPRUZTLQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTEsCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMCwKLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExNSBmb3JtYXQKLQotIERFTEFZUy0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgIHluTDsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8geW5MPUExICAqIHgobi0xKUwKLSAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKLQotICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAotICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqICgqcERhdGFJbik7Ci0KLSAgICAgICAgICAgIC8vIHluTCs9ICAoLUIxICAqIHkobi0xKUwKLSAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAotCi0gICAgICAgIH0KLQotICAgIH0KLSNlbHNlCi12b2lkIEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0gICAgewotICAgICAgICBMVk1fSU5UMzIgIHluTDsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8geW5MPUExIChRMTUpICogeChuLTEpTCAoUTApIGluIFExNQotICAgICAgICAgICAgeW5MPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOwotCi0gICAgICAgICAgICAvLyB5bkwrPUEwIChRMTUpICogeChuKUwgKFEwKSBpbiBRMTUKLSAgICAgICAgICAgIHluTCs9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKiAoKnBEYXRhSW4pOwotCi0gICAgICAgICAgICAvLyB5bkwrPSAgKC1CMSAoUTE1KSAqIHkobi0xKUwgKFEwKSApIGluIFExNQotICAgICAgICAgICAgeW5MKz0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0qcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOwotCi0KLSAgICAgICAgICAgIHluTD0oTFZNX0lOVDE2KSh5bkw+PjE1KTsgLy8geW5MIGluIFEwIGZvcm1hdAotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPXluTDsgLy8gVXBkYXRlIHkobi0xKUwgaW4gUTAKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMIGluIFEwCi0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0Kys9KExWTV9JTlQxNil5bkw7IC8vIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwCi0KLSAgICAgICAgfQotCi0gICAgfQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVmMGQ2MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxLmNwcApAQCAtMCwwICsxLDcxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMSwKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEEwLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE1IGZvcm1hdAorCisgREVMQVlTLQorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSBpcyB4KG4tMSlMIGluIFEwIGZvcm1hdAorIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSBpcyB5KG4tMSlMIGluIFEwIGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTDsKKyAgICAgICAgTFZNX0lOVDE2IGlpOworICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7CisKKyAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgLy8geW5MPUExICAqIHgobi0xKUwKKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAorICAgICAgICAgICAgeW5MICs9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgIC8vIHluTCs9ICAoLUIxICAqIHkobi0xKUwKKyAgICAgICAgICAgIHluTCArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dAorCisgICAgICAgIH0KKworICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjIxYjhhNC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLQotCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgVGhlc2UgZnVuY3Rpb25zIGluaXRpYWxpemVzIGEgQklRVUFEIGZpbHRlciBkZWZpbmVkIGFzIGEgY2FzY2FkZSBvZiAgICovCi0vKiAgIGJpcXVhZHJhdGljIEZpbHRlciBTZWN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBJbnN0YW5jZSAgICAtIG91dHB1dCwgcmV0dXJucyB0aGUgcG9pbnRlciB0byB0aGUgU3RhdGUgVmFyaWFibGUgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgVGhpcyBzdGF0ZSBwb2ludGVyIG11c3QgYmUgcGFzc2VkIHRvIGFueSBzdWJzZXF1ZW50ICAgKi8KLS8qICAgICAgICAgICAgICAgICAgIGNhbGwgdG8gIkJpcXVhZCIgZnVuY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBUYXBzICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgdGFwcyBtZW1vcnkgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwQ29lZiAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50IHN0cnVjdHVyZSAgICAgICAgICAgKi8KLS8qICAgTiAgICAgICAgICAgICAtIE0gY29lZmZpY2llbnQgZmFjdG9yIG9mIFFNLk4gICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICB2b2lkIHJldHVybiBjb2RlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCggICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKLXsKLSAgICBMVk1fRkxPQVQgdGVtcDsKLSAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSAgcEluc3RhbmNlOwotICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0gKExWTV9GTE9BVCAqKXBUYXBzOwotICAgIHRlbXAgPSBwQ29lZi0+QTE7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5BMDsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkIxOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gPSB0ZW1wOwotfQotI2Vsc2UKLXZvaWQgRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCggICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCi17Ci0gIExWTV9JTlQxNiB0ZW1wOwotICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSAgcEluc3RhbmNlOwotICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9KExWTV9JTlQzMiAqKSAgICAgcFRhcHM7Ci0KLSAgdGVtcD1wQ29lZi0+QTE7Ci0gIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF09dGVtcDsKLSAgdGVtcD1wQ29lZi0+QTA7Ci0gIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV09dGVtcDsKLSAgdGVtcD1wQ29lZi0+QjE7Ci0gIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09dGVtcDsKLX0KLSNlbmRpZgotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRW5kIE9mIEZpbGU6IEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuYyAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MTIyNWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0LmNwcApAQCAtMCwwICsxLDU2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLworLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCisvKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCisvKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpICBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopcFRhcHM7CisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdC5jICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCA2ZmRiMDM5Li4zNGYzZGY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0yOCw3ICsyOCw2IEBACiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlICogUEZpbHRlcl9TdGF0ZSA7CiAKLSNpZmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV9GTE9BVAogewogICAgIExWTV9GTE9BVCAqICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlzOyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIFwKQEAgLTM3LDUgKzM2LDQgQEAKIH1GaWx0ZXJfU3RhdGVfRkxPQVQ7CiAKIHR5cGVkZWYgRmlsdGVyX1N0YXRlX0ZMT0FUICogUEZpbHRlcl9TdGF0ZV9GTE9BVCA7Ci0jZW5kaWYKICNlbmRpZiAvKiBfRk9fMUlfRDE2RjE2Q1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxNmU4ZWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEuYworKysgL2Rldi9udWxsCkBAIC0xLDExNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBBU1NVTVBUSU9OUzoKLSBDT0VGUy0KLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEExLAotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTAsCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMzEgZm9ybWF0Ci0KLSBERUxBWVMtCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgeW5MLHRlbXBsOwotICAgICAgICBMVk1fSU5UMTYgIGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0ZMT0FUIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0ZMT0FUKSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgewotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8vIHluTD1BMSAgKiB4KG4tMSlMCi0gICAgICAgICAgICB5bkwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOwotCi0gICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCi0gICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiAoKnBEYXRhSW4pOwotICAgICAgICAgICAgeW5MICs9IHRlbXBsOwotCi0gICAgICAgICAgICAvLyB5bkwrPSAgKC1CMSAgKiB5KG4tMSlMCi0gICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07Ci0gICAgICAgICAgICB5bkwgKz0gdGVtcGw7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAotICAgICAgICB9Ci0KLSAgICB9Ci0jZWxzZQotdm9pZCBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotICAgIHsKLSAgICAgICAgTFZNX0lOVDMyICB5bkwsdGVtcGw7Ci0gICAgICAgIExWTV9JTlQxNiAgaWk7Ci0gICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKLQotICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLy8geW5MPUExIChRMzEpICogeChuLTEpTCAoUTApID4+MzEgaW4gUTAKLSAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0scEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdLHluTCwzMSkKLQotICAgICAgICAgICAgLy8geW5MKz1BMCAoUTMxKSAqIHgobilMIChRMCkgPj4gMzEgaW4gUTAKLSAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0sKnBEYXRhSW4sdGVtcGwsMzEpCi0gICAgICAgICAgICB5bkwrPXRlbXBsOwotCi0gICAgICAgICAgICAvLyB5bkwrPSAgKC1CMSAoUTMxKSAqIHkobi0xKUwgKFEwKSApID4+IDMxIGluIFEwCi0gICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPmNvZWZzWzJdLHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSx0ZW1wbCwzMSkKLSAgICAgICAgICAgIHluTCs9dGVtcGw7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT15bkw7IC8vIFVwZGF0ZSB5KG4tMSlMIGluIFEwCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF09KCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTCBpbiBRMAotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dCsrPShMVk1fSU5UMzIpeW5MOyAvLyBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMAotICAgICAgICB9Ci0KLSAgICB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2VmYWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEuY3BwCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyBBU1NVTVBUSU9OUzoKKyBDT0VGUy0KKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEExLAorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgQTAsCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMzEgZm9ybWF0CisKKyBERUxBWVMtCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERhdGFPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgIHluTCx0ZW1wbDsKKyAgICAgICAgTFZNX0lOVDE2ICBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgcEluc3RhbmNlOworCisgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvLyB5bkw9QTEgICogeChuLTEpTAorICAgICAgICAgICAgeW5MID0gcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKworICAgICAgICAgICAgLy8geW5MKz1BMCAgKiB4KG4pTAorICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogKCpwRGF0YUluKTsKKyAgICAgICAgICAgIHluTCArPSB0ZW1wbDsKKworICAgICAgICAgICAgLy8geW5MKz0gICgtQjEgICogeShuLTEpTAorICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOworICAgICAgICAgICAgeW5MICs9IHRlbXBsOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMCisgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMCisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluTDsgLy8gV3JpdGUgTGVmdCBvdXRwdXQgaW4gUTAKKyAgICAgICAgfQorCisgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzNkMjRkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLwotLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCi0vKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCi0vKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCi17Ci0gICAgTFZNX0ZMT0FUIHRlbXA7Ci0gICAgUEZpbHRlcl9TdGF0ZV9GTE9BVCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GTE9BVCkgIHBJbnN0YW5jZTsKLSAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICA9IChMVk1fRkxPQVQgKikgICAgcFRhcHM7Ci0KLSAgICB0ZW1wID0gcENvZWYtPkExOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QTA7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSA9IHRlbXA7Ci0gICAgdGVtcCA9IHBDb2VmLT5CMTsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gdGVtcDsKLX0KLSNlbHNlCi12b2lkIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZPX0MzMl9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQotewotICBMVk1fSU5UMzIgdGVtcDsKLSAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgIHBJbnN0YW5jZTsKLSAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0lOVDMyICopICAgIHBUYXBzOwotCi0gIHRlbXA9cENvZWYtPkExOwotICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdPXRlbXA7Ci0gIHRlbXA9cENvZWYtPkEwOwotICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdPXRlbXA7Ci0gIHRlbXA9cENvZWYtPkIxOwotICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXRlbXA7Ci19Ci0jZW5kaWYKLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEVuZCBPZiBGaWxlOiBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmMgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjUyOTVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jcHAKQEAgLTAsMCArMSw1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLworLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCisvKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCisvKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190ICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQoreworICAgIExWTV9GTE9BVCB0ZW1wOworICAgIFBGaWx0ZXJfU3RhdGVfRkxPQVQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRkxPQVQpICBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopICAgIHBUYXBzOworCisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisvKiBFbmQgT2YgRmlsZTogRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdC5jICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCBmZGI1MjhiLi42N2QxMzg0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0xOCw3ICsxOCw2IEBACiAjaWZuZGVmIF9GT18xSV9EMzJGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfCiAjZGVmaW5lIF9GT18xSV9EMzJGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfCiAKLQogLyogVGhlIGludGVybmFsIHN0YXRlIHZhcmlhYmxlcyBhcmUgaW1wbGVtZW50ZWQgaW4gYSAoZm9yIHRoZSB1c2VyKSAgaGlkZGVuIHN0cnVjdHVyZSAqLwogLyogSW4gdGhpcyAocHJpdmF0ZSkgZmlsZSwgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWNsYXJlZCBmcm8gcHJpdmF0ZSB1c2UuICAgICAgICAqLwogdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KQEAgLTI5LDcgKzI4LDYgQEAKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKIAotI2lmZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0ZMT0FUXwogewogICAgIExWTV9GTE9BVCAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwpAQCAtMzcsNSArMzUsNCBAQAogfUZpbHRlcl9TdGF0ZV9GTE9BVDsKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGVfRkxPQVQgKiBQRmlsdGVyX1N0YXRlX0ZMT0FUIDsKLSNlbmRpZgogI2VuZGlmIC8qIF9GT18xSV9EMzJGMzJDTExfVFJDX1dSQV8wMV9QUklWQVRFX0hfICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MjkyN2MuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotQVNTVU1QVElPTlM6Ci1DT0VGUy0KLXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTEsCi1wQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEEwLAotcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTUgZm9ybWF0Ci1wQmlxdWFkU3RhdGUtPlNoaWZ0ICAgIGlzIFNoaWZ0IHZhbHVlCi1ERUxBWVMtCi1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMTUgZm9ybWF0Ci1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeShuLTEpTCBpbiBRMzAgZm9ybWF0Ci1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTEpUiBpbiBRMTUgZm9ybWF0Ci1wQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeShuLTEpUiBpbiBRMzAgZm9ybWF0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCi0gICAgewotICAgICAgICBMVk1fRkxPQVQgICB5bkwseW5SOwotICAgICAgICBMVk1fRkxPQVQgICBUZW1wOwotICAgICAgICBMVk1fRkxPQVQgICBOZWdTYXRWYWx1ZTsKLSAgICAgICAgTFZNX0lOVDE2ICAgaWk7Ci0KLSAgICAgICAgUEZpbHRlcl9GbG9hdF9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GbG9hdF9TdGF0ZSkgcEluc3RhbmNlOwotCi0gICAgICAgIE5lZ1NhdFZhbHVlID0gLTEuMGY7Ci0KLSAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgewotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICAgICAgICAgLy8geW5MID1BMSAgKiB4KG4tMSlMCi0gICAgICAgICAgICB5bkwgPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07Ci0gICAgICAgICAgICAvLyB5blIgPUExICAqIHgobi0xKVIKLSAgICAgICAgICAgIHluUiA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKLQotCi0gICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCi0gICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogKCpwRGF0YUluKTsKLSAgICAgICAgICAgIC8vIHluUis9QTAgICogeChuKUwKLSAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiAoKihwRGF0YUluKzEpKTsKLQotCi0gICAgICAgICAgICAvLyB5bkwgKz0gICgtQjEgICogeShuLTEpTCAgKQotICAgICAgICAgICAgVGVtcCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl07Ci0gICAgICAgICAgICB5bkwgKz0gVGVtcDsKLSAgICAgICAgICAgIC8vIHluUiArPSAgKC1CMSAgKiB5KG4tMSlSICkgKQotICAgICAgICAgICAgVGVtcCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl07Ci0gICAgICAgICAgICB5blIgKz0gVGVtcDsKLQotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSB5bkw7IC8vIFVwZGF0ZSB5KG4tMSlMCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gPSAoKnBEYXRhSW4rKyk7IC8vIFVwZGF0ZSB4KG4tMSlMCi0KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHluUjsgLy8gVXBkYXRlIHkobi0xKVIKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKVIKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICAgICAgICAgIC8qU2F0dXJhdGUgcmVzdWx0cyovCi0gICAgICAgICAgICBpZih5bkwgPiAxLjBmKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHluTCA9IDEuMGY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYoeW5MIDwgTmVnU2F0VmFsdWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB5bkwgPSBOZWdTYXRWYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmKHluUiA+IDEuMGYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeW5SID0gMS4wZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZih5blIgPCBOZWdTYXRWYWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHluUiA9IE5lZ1NhdFZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluTDsKLSAgICAgICAgICAgICpwRGF0YU91dCsrID0gKExWTV9GTE9BVCl5blI7Ci0gICAgICAgIH0KLQotICAgIH0KLSNlbHNlCi12b2lkIEZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotICAgIHsKLSAgICAgICAgTFZNX0lOVDMyICAgeW5MLHluUjsKLSAgICAgICAgTFZNX0lOVDMyICAgVGVtcDsKLSAgICAgICAgTFZNX0lOVDMyICAgTmVnU2F0VmFsdWU7Ci0gICAgICAgIExWTV9JTlQxNiAgIGlpOwotICAgICAgICBMVk1fSU5UMTYgICBTaGlmdDsKLSAgICAgICAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOwotCi0gICAgICAgIE5lZ1NhdFZhbHVlID0gTFZNX01BWElOVF8xNiArMTsKLSAgICAgICAgTmVnU2F0VmFsdWUgPSAtTmVnU2F0VmFsdWU7Ci0KLSAgICAgICAgU2hpZnQgPSBwQmlxdWFkU3RhdGUtPlNoaWZ0OwotCi0KLSAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgewotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICAgICAgICAgLy8geW5MID1BMSAoUTE1KSAqIHgobi0xKUwgKFExNSkgaW4gUTMwCi0gICAgICAgICAgICB5bkw9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzBdKiBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF07Ci0gICAgICAgICAgICAvLyB5blIgPUExIChRMTUpICogeChuLTEpUiAoUTE1KSBpbiBRMzAKLSAgICAgICAgICAgIHluUj0oTFZNX0lOVDMyKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0qIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXTsKLQotCi0gICAgICAgICAgICAvLyB5bkwrPUEwIChRMTUpICogeChuKUwgKFExNSkgaW4gUTMwCi0gICAgICAgICAgICB5bkwrPShMVk1fSU5UMzIpcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSogKCpwRGF0YUluKTsKLSAgICAgICAgICAgIC8vIHluUis9QTAgKFExNSkgKiB4KG4pTCAoUTE1KSBpbiBRMzAKLSAgICAgICAgICAgIHluUis9KExWTV9JTlQzMilwQmlxdWFkU3RhdGUtPmNvZWZzWzFdKiAoKihwRGF0YUluKzEpKTsKLQotCi0gICAgICAgICAgICAvLyB5bkwgKz0gICgtQjEgKFExNSkgKiB5KG4tMSlMIChRMzApICkgaW4gUTMwCi0gICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0scEJpcXVhZFN0YXRlLT5jb2Vmc1syXSxUZW1wLDE1KTsKLSAgICAgICAgICAgIHluTCArPVRlbXA7Ci0gICAgICAgICAgICAvLyB5blIgKz0gICgtQjEgKFExNSkgKiB5KG4tMSlSIChRMzApICkgaW4gUTMwCi0gICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10scEJpcXVhZFN0YXRlLT5jb2Vmc1syXSxUZW1wLDE1KTsKLSAgICAgICAgICAgIHluUiArPVRlbXA7Ci0KLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdPXluTDsgLy8gVXBkYXRlIHkobi0xKUwgaW4gUTMwCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF09KCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpTCBpbiBRMTUKLQotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdPXluUjsgLy8gVXBkYXRlIHkobi0xKVIgaW4gUTMwCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl09KCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpUiBpbiBRMTUKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgV1JJVElORyBUSEUgT1VUUFVUCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKkFwcGx5IHNoaWZ0OiBJbnN0ZWFkIG9mIGxlZnQgc2hpZnQgb24gMTYtYml0IHJlc3VsdCwgcmlnaHQgc2hpZnQgb2YgKDE1LXNoaWZ0KSBpcyBhcHBsaWVkCi0gICAgICAgICAgICAgIGZvciBiZXR0ZXIgU05SKi8KLSAgICAgICAgICAgIHluTCA9IHluTD4+KDE1LVNoaWZ0KTsKLSAgICAgICAgICAgIHluUiA9IHluUj4+KDE1LVNoaWZ0KTsKLQotICAgICAgICAgICAgLypTYXR1cmF0ZSByZXN1bHRzKi8KLSAgICAgICAgICAgIGlmKHluTCA+IExWTV9NQVhJTlRfMTYpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeW5MID0gTFZNX01BWElOVF8xNjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZih5bkwgPCBOZWdTYXRWYWx1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHluTCA9IE5lZ1NhdFZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYoeW5SID4gTFZNX01BWElOVF8xNikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB5blIgPSBMVk1fTUFYSU5UXzE2OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKHluUiA8IE5lZ1NhdFZhbHVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgeW5SID0gTmVnU2F0VmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAqcERhdGFPdXQrKz0oTFZNX0lOVDE2KXluTDsKLSAgICAgICAgICAgICpwRGF0YU91dCsrPShMVk1fSU5UMTYpeW5SOwotICAgICAgICB9Ci0KLSAgICB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNhODE5YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkMxNV9MU2h4X1RSQ19XUkFfMDEuY3BwCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKK0FTU1VNUFRJT05TOgorQ09FRlMtCitwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEExLAorcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyBBMCwKK3BCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTE1IGZvcm1hdAorcEJpcXVhZFN0YXRlLT5TaGlmdCAgICBpcyBTaGlmdCB2YWx1ZQorREVMQVlTLQorcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTE1IGZvcm1hdAorcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHkobi0xKUwgaW4gUTMwIGZvcm1hdAorcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0xKVIgaW4gUTE1IGZvcm1hdAorcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHkobi0xKVIgaW4gUTMwIGZvcm1hdAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBGT18ySV9EMTZGMzJDMTVfTFNoeF9UUkNfV1JBXzAxKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgIHluTCx5blI7CisgICAgICAgIExWTV9GTE9BVCAgIFRlbXA7CisgICAgICAgIExWTV9GTE9BVCAgIE5lZ1NhdFZhbHVlOworICAgICAgICBMVk1fSU5UMTYgICBpaTsKKworICAgICAgICBQRmlsdGVyX0Zsb2F0X1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0Zsb2F0X1N0YXRlKSBwSW5zdGFuY2U7CisKKyAgICAgICAgTmVnU2F0VmFsdWUgPSAtMS4wZjsKKworICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICB7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBST0NFU1NJTkcgT0YgVEhFIExFRlQgQ0hBTk5FTAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgICAgICAgICAvLyB5bkwgPUExICAqIHgobi0xKUwKKyAgICAgICAgICAgIHluTCA9IChMVk1fRkxPQVQpcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSAqIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsKKyAgICAgICAgICAgIC8vIHluUiA9QTEgICogeChuLTEpUgorICAgICAgICAgICAgeW5SID0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzBdICogcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOworCisgICAgICAgICAgICAvLyB5bkwrPUEwICAqIHgobilMCisgICAgICAgICAgICB5bkwgKz0gKExWTV9GTE9BVClwQmlxdWFkU3RhdGUtPmNvZWZzWzFdICogKCpwRGF0YUluKTsKKyAgICAgICAgICAgIC8vIHluUis9QTAgICogeChuKUwKKyAgICAgICAgICAgIHluUiArPSAoTFZNX0ZMT0FUKXBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gKiAoKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLy8geW5MICs9ICAoLUIxICAqIHkobi0xKUwgICkKKyAgICAgICAgICAgIFRlbXAgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOworICAgICAgICAgICAgeW5MICs9IFRlbXA7CisgICAgICAgICAgICAvLyB5blIgKz0gICgtQjEgICogeShuLTEpUiApICkKKyAgICAgICAgICAgIFRlbXAgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOworICAgICAgICAgICAgeW5SICs9IFRlbXA7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9IHluTDsgLy8gVXBkYXRlIHkobi0xKUwKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKUwKKworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0geW5SOyAvLyBVcGRhdGUgeShuLTEpUgorICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gKCpwRGF0YUluKyspOyAvLyBVcGRhdGUgeChuLTEpUgorCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgLypTYXR1cmF0ZSByZXN1bHRzKi8KKyAgICAgICAgICAgIGlmKHluTCA+IDEuMGYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgeW5MID0gMS4wZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZih5bkwgPCBOZWdTYXRWYWx1ZSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHluTCA9IE5lZ1NhdFZhbHVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYoeW5SID4gMS4wZikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB5blIgPSAxLjBmOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmKHluUiA8IE5lZ1NhdFZhbHVlKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgeW5SID0gTmVnU2F0VmFsdWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW5MOworICAgICAgICAgICAgKnBEYXRhT3V0KysgPSAoTFZNX0ZMT0FUKXluUjsKKyAgICAgICAgfQorCisgICAgfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorQVNTVU1QVElPTlM6CitDT0VGUy0KK3BCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTEsCitwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIEEwLAorcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyAtQjEsCitERUxBWVMtCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMipjaCArIDBdIGlzIHgobi0xKSBvZiB0aGUgJ2NoJyAtIGNoYW5uZWwKK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1syKmNoICsgMV0gaXMgeShuLTEpIG9mIHRoZSAnY2gnIC0gY2hhbm5lbAorVGhlIGluZGV4ICdjaCcgcnVucyBmcm9tIDAgdG8gKE5yQ2hhbm5lbHMgLSAxKQorCitQQVJBTUVURVJTOgorIHBJbnN0YW5jZSAgICAgICAgUG9pbnRlciBJbnN0YW5jZQorIHBEYXRhSW4gICAgICAgICAgSW5wdXQvU291cmNlCisgcERhdGFPdXQgICAgICAgICBPdXRwdXQvRGVzdGluYXRpb24KKyBOckZyYW1lcyAgICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyBOckNoYW5uZWxzICAgICAgIE51bWJlciBvZiBjaGFubmVscworCitSRVRVUk5TOgorIHZvaWQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgRk9fTWNfRDE2RjMyQzE1X0xTaHhfVFJDX1dSQV8wMShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICAgeW47CisgICAgICAgIExWTV9GTE9BVCAgIFRlbXA7CisgICAgICAgIExWTV9JTlQxNiAgIGlpOworICAgICAgICBMVk1fSU5UMTYgICBjaDsKKyAgICAgICAgUEZpbHRlcl9GbG9hdF9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9GbG9hdF9TdGF0ZSkgcEluc3RhbmNlOworCisgICAgICAgIExWTV9GTE9BVCAgICpwRGVsYXlzID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzOworICAgICAgICBMVk1fRkxPQVQgICAqcENvZWZzICA9ICZwQmlxdWFkU3RhdGUtPmNvZWZzWzBdOworICAgICAgICBMVk1fRkxPQVQgICBBMCA9IHBDb2Vmc1sxXTsKKyAgICAgICAgTFZNX0ZMT0FUICAgQTEgPSBwQ29lZnNbMF07CisgICAgICAgIExWTV9GTE9BVCAgIEIxID0gcENvZWZzWzJdOworCisgICAgICAgIGZvciAoaWkgPSBOckZyYW1lczsgaWkgIT0gMDsgaWktLSkKKyAgICAgICAgeworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBDSEFOTkVMUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgZm9yIChjaCA9IDA7IGNoIDwgTnJDaGFubmVsczsgY2grKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyB5biA9QTEgICogeChuLTEpCisgICAgICAgICAgICAgICAgeW4gPSAoTFZNX0ZMT0FUKUExICogcERlbGF5c1swXTsKKworICAgICAgICAgICAgICAgIC8vIHluKz1BMCAgKiB4KG4pCisgICAgICAgICAgICAgICAgeW4gKz0gKExWTV9GTE9BVClBMCAqICgqcERhdGFJbik7CisKKyAgICAgICAgICAgICAgICAvLyB5biArPSAgKC1CMSAgKiB5KG4tMSkpCisgICAgICAgICAgICAgICAgVGVtcCA9IEIxICogcERlbGF5c1sxXTsKKyAgICAgICAgICAgICAgICB5biArPSBUZW1wOworCisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKKyAgICAgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAgICAgcERlbGF5c1sxXSA9IHluOyAvLyBVcGRhdGUgeShuLTEpCisgICAgICAgICAgICAgICAgcERlbGF5c1swXSA9ICgqcERhdGFJbisrKTsgLy8gVXBkYXRlIHgobi0xKQorCisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAgICAgICAgIC8qU2F0dXJhdGUgcmVzdWx0cyovCisgICAgICAgICAgICAgICAgaWYgKHluID4gMS4wZikKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHluID0gMS4wZjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHluIDwgLTEuMGYpIHsKKyAgICAgICAgICAgICAgICAgICAgeW4gPSAtMS4wZjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAqcERhdGFPdXQrKyA9IChMVk1fRkxPQVQpeW47CisgICAgICAgICAgICAgICAgcERlbGF5cyArPSAyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcERlbGF5cyAtPSBOckNoYW5uZWxzICogMjsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNjYTZjZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaW5jbHVkZSAiQklRVUFELmgiCi0jaW5jbHVkZSAiRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBUaGVzZSBmdW5jdGlvbnMgaW5pdGlhbGl6ZXMgYSBCSVFVQUQgZmlsdGVyIGRlZmluZWQgYXMgYSBjYXNjYWRlIG9mICAgKi8KLS8qICAgYmlxdWFkcmF0aWMgRmlsdGVyIFNlY3Rpb25zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcEluc3RhbmNlICAgIC0gb3V0cHV0LCByZXR1cm5zIHRoZSBwb2ludGVyIHRvIHRoZSBTdGF0ZSBWYXJpYWJsZSAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICBUaGlzIHN0YXRlIHBvaW50ZXIgbXVzdCBiZSBwYXNzZWQgdG8gYW55IHN1YnNlcXVlbnQgICAqLwotLyogICAgICAgICAgICAgICAgICAgY2FsbCB0byAiQmlxdWFkIiBmdW5jdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcFRhcHMgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSB0YXBzIG1lbW9yeSAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBDb2VmICAgICAgICAgLSBpbnB1dCwgcG9pbnRlciB0byB0aGUgY29lZmZpY2llbnQgc3RydWN0dXJlICAgICAgICAgICAqLwotLyogICBOICAgICAgICAgICAgIC0gTSBjb2VmZmljaWVudCBmYWN0b3Igb2YgUU0uTiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHZvaWQgcmV0dXJuIGNvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMV9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9MU2h4X0NvZWZzX3QgICAgICAgICpwQ29lZikKLXsKLSAgICBMVk1fRkxPQVQgdGVtcDsKLSAgICBQRmlsdGVyX0Zsb2F0X1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0Zsb2F0X1N0YXRlKSBwSW5zdGFuY2U7Ci0gICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzICAgICAgICAgICAgOwotCi0gICAgdGVtcCA9IHBDb2VmLT5BMTsKLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKLSAgICB0ZW1wID0gcENvZWYtPkEwOwotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOwotICAgIHRlbXAgPSBwQ29lZi0+QjE7Ci0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7Ci19Ci0jZWxzZQotdm9pZCBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMV9UYXBzX3QgICAqcFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19DMTZfTFNoeF9Db2Vmc190ICAgICAgICAqcENvZWYpCi17Ci0gIExWTV9JTlQxNiB0ZW1wOwotICBQRmlsdGVyX1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlKSBwSW5zdGFuY2U7Ci0gIHBCaXF1YWRTdGF0ZS0+cERlbGF5cyAgICAgID0oTFZNX0lOVDMyICopIHBUYXBzICAgICAgICAgICAgOwotCi0gIHRlbXA9cENvZWYtPkExOwotICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdPXRlbXA7Ci0gIHRlbXA9cENvZWYtPkEwOwotICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdPXRlbXA7Ci0gIHRlbXA9cENvZWYtPkIxOwotICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdPXRlbXA7Ci0KLSAgdGVtcD1wQ29lZi0+U2hpZnQ7Ci0gIHBCaXF1YWRTdGF0ZS0+U2hpZnQgPSB0ZW1wOwotfQotI2VuZGlmCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRW5kIE9mIEZpbGU6IEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgxYjk3NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jcHAKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZXNlIGZ1bmN0aW9ucyBpbml0aWFsaXplcyBhIEJJUVVBRCBmaWx0ZXIgZGVmaW5lZCBhcyBhIGNhc2NhZGUgb2YgICAqLworLyogICBiaXF1YWRyYXRpYyBGaWx0ZXIgU2VjdGlvbnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwSW5zdGFuY2UgICAgLSBvdXRwdXQsIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIFN0YXRlIFZhcmlhYmxlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgIFRoaXMgc3RhdGUgcG9pbnRlciBtdXN0IGJlIHBhc3NlZCB0byBhbnkgc3Vic2VxdWVudCAgICovCisvKiAgICAgICAgICAgICAgICAgICBjYWxsIHRvICJCaXF1YWQiIGZ1bmN0aW9ucy4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgIC0gaW5wdXQsIHBvaW50ZXIgdG8gdGhlIHRhcHMgbWVtb3J5ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAtIGlucHV0LCBwb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudCBzdHJ1Y3R1cmUgICAgICAgICAgICovCisvKiAgIE4gICAgICAgICAgICAgLSBNIGNvZWZmaWNpZW50IGZhY3RvciBvZiBRTS5OICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCByZXR1cm4gY29kZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordm9pZCBGT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmlxdWFkXzJJX09yZGVyMV9GTE9BVF9UYXBzX3QgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9MU2h4X0NvZWZzX3QgICAgICAgICpwQ29lZikKK3sKKyAgICBMVk1fRkxPQVQgdGVtcDsKKyAgICBQRmlsdGVyX0Zsb2F0X1N0YXRlIHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX0Zsb2F0X1N0YXRlKSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzICAgICAgICAgICAgOworCisgICAgdGVtcCA9IHBDb2VmLT5BMTsKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdID0gdGVtcDsKKyAgICB0ZW1wID0gcENvZWYtPkEwOworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSB0ZW1wOworICAgIHRlbXAgPSBwQ29lZi0+QjE7CisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHRlbXA7Cit9CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRW5kIE9mIEZpbGU6IEZPXzJJX0QxNkYzMkNzc19MU2h4X1RSQ19XUkFfMDFfSW5pdC5jICAgICAgICAgICAgICAgICAgICAgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRk9fMklfRDE2RjMyQ3NzX0xTaHhfVFJDX1dSQV8wMV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCAzNjhiZmNlLi41MDIyNTAwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GT18ySV9EMTZGMzJDc3NfTFNoeF9UUkNfV1JBXzAxX1ByaXZhdGUuaApAQCAtMjAsNyArMjAsNiBAQAogCiAvKiBUaGUgaW50ZXJuYWwgc3RhdGUgdmFyaWFibGVzIGFyZSBpbXBsZW1lbnRlZCBpbiBhIChmb3IgdGhlIHVzZXIpICBoaWRkZW4gc3RydWN0dXJlICovCiAvKiBJbiB0aGlzIChwcml2YXRlKSBmaWxlLCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlY2xhcmVkIGZybyBwcml2YXRlIHVzZS4gICAgICAgICovCi0jaWZkZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCiB7CiAgICAgTFZNX0ZMT0FUICAgICAqcERlbGF5czsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KQEAgLTI4LDE0ICsyNyw0IEBACiB9RmlsdGVyX0Zsb2F0X1N0YXRlOwogCiB0eXBlZGVmIEZpbHRlcl9GbG9hdF9TdGF0ZSAqIFBGaWx0ZXJfRmxvYXRfU3RhdGUgOwotI2Vsc2UKLXR5cGVkZWYgc3RydWN0IF9GaWx0ZXJfU3RhdGVfCi17Ci0gIExWTV9JTlQzMiAgICAgKnBEZWxheXM7ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCi0gIExWTV9JTlQxNiAgICAgY29lZnNbM107ICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLSAgTFZNX0lOVDE2ICAgICBTaGlmdDsgICAgICAgICAgLyogU2hpZnQgdmFsdWUqLwotfUZpbHRlcl9TdGF0ZTsKLQotdHlwZWRlZiBGaWx0ZXJfU3RhdGUgKiBQRmlsdGVyX1N0YXRlIDsKLSNlbmRpZgogI2VuZGlmIC8qIF9GT18ySV9EMTZGMzJDU1NfTFNIWF9UUkNfV1JBXzAxX1BSSVZBVEVfSF8gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZpbHRlcnMuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ZpbHRlcnMuaAppbmRleCBiMWZkZTBjLi5iNWRiOGY0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9GaWx0ZXJzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRmlsdGVycy5oCkBAIC0xOCwxMCArMTgsNiBAQAogI2lmbmRlZiBGSUxURVJTX0gKICNkZWZpbmUgRklMVEVSU19ICiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQogI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtMzQsMTcgKzMwLDYgQEAKICAqIEJpcXVhZCB3aXRoIGNvZWZmaWNpZW50cyBBMCwgQTEsIEEyLCBCMSBhbmQgQjIgY29lZmZpY2llbnRzCiAgKi8KIC8qIFNpbmdsZSBwcmVjaXNpb24gKDE2LWJpdCkgQmlxdWFkIHNlY3Rpb24gY29lZmZpY2llbnRzICovCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi10eXBlZGVmIHN0cnVjdAotewotICAgICAgICBMVk1fSU5UMTYgICBBMDsKLSAgICAgICAgTFZNX0lOVDE2ICAgQTE7Ci0gICAgICAgIExWTV9JTlQxNiAgIEEyOwotICAgICAgICBMVk1fSU5UMTYgICBCMTsKLSAgICAgICAgTFZNX0lOVDE2ICAgQjI7Ci0gICAgICAgIExWTV9VSU5UMTYgIFNjYWxlOwotfSBCaXF1YWRBMDEyQjEyQ29lZnNTUF90OwotI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0ZMT0FUICAgQTA7CkBAIC01NCwyMCArMzksMTAgQEAKICAgICBMVk1fRkxPQVQgICBCMjsKICAgICBMVk1fVUlOVDE2ICBTY2FsZTsKIH0gQmlxdWFkQTAxMkIxMkNvZWZzU1BfdDsKLSNlbmRpZgogLyoKICAqIEJpcXVhZCB3aXRoIGNvZWZmaWNpZW50cyBBMCwgQTEgYW5kIEIxIGNvZWZmaWNpZW50cwogICovCiAvKiBTaW5nbGUgcHJlY2lzaW9uICgxNi1iaXQpIEJpcXVhZCBzZWN0aW9uIGNvZWZmaWNpZW50cyAqLwotI2lmbmRlZiBCVUlMRF9GTE9BVAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAgICAgTFZNX0lOVDE2ICAgQTA7Ci0gICAgICAgIExWTV9JTlQxNiAgIEExOwotICAgICAgICBMVk1fSU5UMTYgICBCMTsKLSAgICAgICAgTFZNX1VJTlQxNiAgU2NhbGU7Ci19IEJpcXVhZEEwMUIxQ29lZnNTUF90OwotI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZNX0ZMT0FUICAgQTA7CkBAIC03NSwxMCArNTAsNiBAQAogICAgIExWTV9GTE9BVCAgIEIxOwogICAgIExWTV9VSU5UMTYgIFNjYWxlOwogfSBCaXF1YWRBMDFCMUNvZWZzU1BfdDsKLSNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KIAogI2VuZGlmICAgICAgLyogRklMVEVSU19IICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTVNfMTZ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0Zyb20yaVRvTVNfMTZ4MTYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmM2ZTZjMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgSU5DTFVERSBGSUxFUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiAgRnJvbTJpVG9NU18xNngxNgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgRnJvbTJpVG9NU18xNngxNiggY29uc3QgTFZNX0lOVDE2ICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICpkc3RNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICpkc3RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQotewotICAgIExWTV9JTlQzMiB0ZW1wMSxsZWZ0LHJpZ2h0OwotICAgIExWTV9JTlQxNiBpaTsKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIGxlZnQgPSAoTFZNX0lOVDMyKSpzcmM7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgIHJpZ2h0ID0gKExWTV9JTlQzMikqc3JjOwotICAgICAgICBzcmMrKzsKLQotICAgICAgICAvKiBDb21wdXRlIE0gc2lnbmFsKi8KLSAgICAgICAgdGVtcDEgPSAgKGxlZnQrcmlnaHQpPj4xOwotICAgICAgICAqZHN0TSA9IChMVk1fSU5UMTYpdGVtcDE7Ci0gICAgICAgIGRzdE0rKzsKLQotICAgICAgICAvKiBDb21wdXRlIFMgc2lnbmFsKi8KLSAgICAgICAgdGVtcDEgPSAgKGxlZnQtcmlnaHQpPj4xOwotICAgICAgICAqZHN0UyA9IChMVk1fSU5UMTYpdGVtcDE7Ci0gICAgICAgIGRzdFMrKzsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0jaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgRnJvbTJpVG9NU19GbG9hdCggY29uc3QgTFZNX0ZMT0FUICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3RNLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICpkc3RTLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQotewotICAgIExWTV9GTE9BVCB0ZW1wMSxsZWZ0LHJpZ2h0OwotICAgIExWTV9JTlQxNiBpaTsKLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIGxlZnQgPSAoTFZNX0ZMT0FUKSpzcmM7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgIHJpZ2h0ID0gKExWTV9GTE9BVCkqc3JjOwotICAgICAgICBzcmMrKzsKLQotICAgICAgICAvKiBDb21wdXRlIE0gc2lnbmFsKi8KLSAgICAgICAgdGVtcDEgPSAgKGxlZnQgKyByaWdodCkgLyAyLjBmOwotICAgICAgICAqZHN0TSA9IChMVk1fRkxPQVQpdGVtcDE7Ci0gICAgICAgIGRzdE0rKzsKLQotICAgICAgICAvKiBDb21wdXRlIFMgc2lnbmFsKi8KLSAgICAgICAgdGVtcDEgPSAgKGxlZnQgLSByaWdodCkgLyAyLjBmOwotICAgICAgICAqZHN0UyA9IChMVk1fRkxPQVQpdGVtcDE7Ci0gICAgICAgIGRzdFMrKzsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9NU18xNngxNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01TXzE2eDE2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2Y2NjQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9NU18xNngxNi5jcHAKQEAgLTAsMCArMSw4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gIEZyb20yaVRvTVNfMTZ4MTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEZyb20yaVRvTVNfMTZ4MTYoIGNvbnN0IExWTV9JTlQxNiAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAqZHN0TSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAqZHN0UywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBuICkKK3sKKyAgICBMVk1fSU5UMzIgdGVtcDEsbGVmdCxyaWdodDsKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBsZWZ0ID0gKExWTV9JTlQzMikqc3JjOworICAgICAgICBzcmMrKzsKKworICAgICAgICByaWdodCA9IChMVk1fSU5UMzIpKnNyYzsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgLyogQ29tcHV0ZSBNIHNpZ25hbCovCisgICAgICAgIHRlbXAxID0gIChsZWZ0K3JpZ2h0KT4+MTsKKyAgICAgICAgKmRzdE0gPSAoTFZNX0lOVDE2KXRlbXAxOworICAgICAgICBkc3RNKys7CisKKyAgICAgICAgLyogQ29tcHV0ZSBTIHNpZ25hbCovCisgICAgICAgIHRlbXAxID0gIChsZWZ0LXJpZ2h0KT4+MTsKKyAgICAgICAgKmRzdFMgPSAoTFZNX0lOVDE2KXRlbXAxOworICAgICAgICBkc3RTKys7CisgICAgfQorCisgICAgcmV0dXJuOworfQordm9pZCBGcm9tMmlUb01TX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0ZMT0FUIHRlbXAxLGxlZnQscmlnaHQ7CisgICAgTFZNX0lOVDE2IGlpOworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgbGVmdCA9IChMVk1fRkxPQVQpKnNyYzsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgcmlnaHQgPSAoTFZNX0ZMT0FUKSpzcmM7CisgICAgICAgIHNyYysrOworCisgICAgICAgIC8qIENvbXB1dGUgTSBzaWduYWwqLworICAgICAgICB0ZW1wMSA9ICAobGVmdCArIHJpZ2h0KSAvIDIuMGY7CisgICAgICAgICpkc3RNID0gKExWTV9GTE9BVCl0ZW1wMTsKKyAgICAgICAgZHN0TSsrOworCisgICAgICAgIC8qIENvbXB1dGUgUyBzaWduYWwqLworICAgICAgICB0ZW1wMSA9ICAobGVmdCAtIHJpZ2h0KSAvIDIuMGY7CisgICAgICAgICpkc3RTID0gKExWTV9GTE9BVCl0ZW1wMTsKKyAgICAgICAgZHN0UysrOworICAgIH0KKworICAgIHJldHVybjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMTYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMTYuYwpyZW5hbWUgdG8gbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzE2LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMxZWVhOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBJTkNMVURFIEZJTEVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIEZyb20yaVRvTW9ub18zMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgRnJvbTJpVG9Nb25vXzMyKCBjb25zdCBMVk1fSU5UMzIgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKLXsKLSAgICBMVk1fSU5UMTYgaWk7Ci0gICAgTFZNX0lOVDMyIFRlbXA7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIFRlbXAgPSAoKnNyYz4+MSk7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgIFRlbXAgKz0oKnNyYz4+MSk7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgICpkc3QgPSBUZW1wOwotICAgICAgICBkc3QrKzsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0jaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgRnJvbTJpVG9Nb25vX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKLXsKLSAgICBMVk1fSU5UMTYgaWk7Ci0gICAgTFZNX0ZMT0FUIFRlbXA7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIFRlbXAgPSAoKnNyYyk7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgIFRlbXAgKz0gKCpzcmMpOwotICAgICAgICBzcmMrKzsKLQotICAgICAgICAqZHN0ID0gVGVtcCAvIDIuMGY7Ci0gICAgICAgIGRzdCsrOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLSNlbmRpZgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Gcm9tMmlUb01vbm9fMzIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODY4OGI0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvRnJvbTJpVG9Nb25vXzMyLmNwcApAQCAtMCwwICsxLDExMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gRnJvbTJpVG9Nb25vXzMyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBGcm9tMmlUb01vbm9fMzIoIGNvbnN0IExWTV9JTlQzMiAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQoreworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fSU5UMzIgVGVtcDsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgVGVtcCA9ICgqc3JjPj4xKTsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgVGVtcCArPSgqc3JjPj4xKTsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgKmRzdCA9IFRlbXA7CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KK3ZvaWQgRnJvbTJpVG9Nb25vX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisgICAgTFZNX0ZMT0FUIFRlbXA7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIFRlbXAgPSAoKnNyYyk7CisgICAgICAgIHNyYysrOworCisgICAgICAgIFRlbXAgKz0gKCpzcmMpOworICAgICAgICBzcmMrKzsKKworICAgICAgICAqZHN0ID0gVGVtcCAvIDIuMGY7CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIEZyb21NY1RvTW9ub19GbG9hdAorICoKKyAqIERFU0NSSVBUSU9OOgorICogIENyZWF0ZXMgYSBtb25vIHN0cmVhbSBmcm9tIGEgbXVsdGljaGFubmVsIGlucHV0IHRha2luZyB0aGUgYXZlcmdhZSBvZgorICogIHNhbXBsZSB2YWx1ZXMgb2YgYWxsIGNoYW5uZWxzCisgKgorICogUEFSQU1FVEVSUzoKKyAqICBzcmMgICAgICAgICAgICBTb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgRnJvbU1jVG9Nb25vX0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgTnJDaGFubmVscykKK3sKKyAgICBMVk1fSU5UMTYgaWksIGpqOworICAgIExWTV9GTE9BVCBUZW1wOworCisgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgVGVtcCA9IDAuMGY7CisgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPTA7IGpqLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlbXAgKz0gKCpzcmMpOworICAgICAgICAgICAgc3JjKys7CisgICAgICAgIH0KKyAgICAgICAgKmRzdCA9IFRlbXAgLyBOckNoYW5uZWxzOworICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnN0QWxsb2MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0luc3RBbGxvYy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODlhNWMzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0luc3RBbGxvYy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJJbnN0QWxsb2MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBOYW1lICAgICAgICA6IEluc3RBbGxvY19Jbml0KCkKLSAqICBJbnB1dCAgICAgICA6IHBtcyAgLSBQb2ludGVyIHRvIHRoZSBJTlNUX0FMTE9DIGluc3RhbmNlCi0gICAgICAgICAgICAgICAgICBTdGFydEFkZHIgLSBCYXNlIGFkZHJlc3Mgb2YgdGhlIGluc3RhbmNlIG1lbW9yeQotICogIFJldHVybnMgICAgIDogRXJyb3IgY29kZQotICogIERlc2NyaXB0aW9uIDogSW5pdGlhbGl6ZXMgdGhlIGluc3RhbmNlIGRpc3RyaWJ1dGlvbiBhbmQgbWVtb3J5IHNpemUgY2FsY3VsYXRpb24gZnVuY3Rpb24KLSAqICBSZW1hcmtzICAgICA6Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCAgICBJbnN0QWxsb2NfSW5pdCggSU5TVF9BTExPQyAgICAgICpwbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKlN0YXJ0QWRkciApCi17Ci0gICAgcG1zLT5Ub3RhbFNpemUgPSAzOwotICAgIHBtcy0+cE5leHRNZW1iZXIgPSAoKCh1aW50cHRyX3QpU3RhcnRBZGRyICsgMykgJiAodWludHB0cl90KX4zKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIE5hbWUgICAgICAgIDogSW5zdEFsbG9jX0FkZE1lbWJlcigpCi0gKiAgSW5wdXQgICAgICAgOiBwbXMgIC0gUG9pbnRlciB0byB0aGUgSU5TVF9BTExPQyBpbnN0YW5jZQotICAgICAgICAgICAgICAgICAgU2l6ZSAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBuZXcgYWRkZWQgbWVtYmVyCi0gKiAgUmV0dXJucyAgICAgOiBBIHBvaW50ZXIgdG8gdGhlIG5ldyBhZGRlZCBtZW1iZXIKLSAqICBEZXNjcmlwdGlvbiA6IEFsbG9jYXRlcyBzcGFjZSBmb3IgYSBuZXcgbWVtYmVyIGluIHRoZSBpbnN0YW5jZSBtZW1vcnkgYW5kIHJldHVybnMKLSAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciB0byB0aGlzIG5ldyBtZW1iZXIuICBUaGUgc3RhcnQgYWRkcmVzcyBvZiBhbGwgbWVtYmVycyB3aWxsCi0gICAgICAgICAgICAgICAgICBiZSAzMiBiaXQgYWxsaWduZWQuCi0gKiAgUmVtYXJrcyAgICAgOgotICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQqICAgSW5zdEFsbG9jX0FkZE1lbWJlciggSU5TVF9BTExPQyAgICAgICAgICpwbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgIFNpemUgKQotewotICAgIHZvaWQgKk5ld01lbWJlckFkZHJlc3M7IC8qIFZhcmlhYmxlIHRvIHRlbXBvcmFyaWx5IHN0b3JlIHRoZSByZXR1cm4gdmFsdWUgKi8KLSAgICBOZXdNZW1iZXJBZGRyZXNzID0gKHZvaWQqKXBtcy0+cE5leHRNZW1iZXI7Ci0KLSAgICBTaXplID0gKChTaXplICsgMykgJiAoTFZNX1VJTlQzMil+Myk7IC8qIENlaWwgdGhlIHNpemUgdG8gYSBtdWx0aXBsZSBvZiBmb3VyICovCi0KLSAgICBwbXMtPlRvdGFsU2l6ZSArPSBTaXplOwotICAgIHBtcy0+cE5leHRNZW1iZXIgKz0gU2l6ZTsKLQotICAgIHJldHVybihOZXdNZW1iZXJBZGRyZXNzKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIE5hbWUgICAgICAgIDogSW5zdEFsbG9jX0dldFRvdGFsKCkKLSAqICBJbnB1dCAgICAgICA6IHBtcyAgLSBQb2ludGVyIHRvIHRoZSBJTlNUX0FMTE9DIGluc3RhbmNlCi0gKiAgUmV0dXJucyAgICAgOiBUaGUgaW5zdGFuY2UgbWVtb3J5IHNpemUKLSAqICBEZXNjcmlwdGlvbiA6IFRoaXMgZnVuY3Rpb25zIHJldHVybnMgdGhlIGNhbGN1bGF0ZWQgaW5zdGFuY2UgbWVtb3J5IHNpemUKLSAqICBSZW1hcmtzICAgICA6Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotTFZNX1VJTlQzMiBJbnN0QWxsb2NfR2V0VG90YWwoIElOU1RfQUxMT0MgKnBtcykKLXsKLSAgICBpZiAocG1zLT5Ub3RhbFNpemUgPiAzKQotICAgIHsKLSAgICAgICAgcmV0dXJuKHBtcy0+VG90YWxTaXplKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgcmV0dXJuIDA7ICAgICAgICAgICAvKiBObyBtZW1vcnkgYWRkZWQgKi8KLSAgICB9Ci19Ci0KLQotdm9pZCAgICBJbnN0QWxsb2NfSW5pdEFsbCggSU5TVF9BTExPQyAgICAgICAgICAgICAgICAgICAgICAqcG1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX01lbW9yeVRhYmxlX3N0ICAgICAgICAgICAgICpwTWVtb3J5VGFibGUpCi17Ci0gICAgdWludHB0cl90IFN0YXJ0QWRkcjsKLQotICAgIFN0YXJ0QWRkciA9ICh1aW50cHRyX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3M7Ci0KLSAgICBwbXNbMF0uVG90YWxTaXplID0gMzsKLSAgICBwbXNbMF0ucE5leHRNZW1iZXIgPSAoKFN0YXJ0QWRkciArIDMpICYgKHVpbnRwdHJfdCl+Myk7Ci0KLQotICAgIFN0YXJ0QWRkciA9ICh1aW50cHRyX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7Ci0KLSAgICBwbXNbMV0uVG90YWxTaXplID0gMzsKLSAgICBwbXNbMV0ucE5leHRNZW1iZXIgPSAoKFN0YXJ0QWRkciArIDMpICYgKHVpbnRwdHJfdCl+Myk7Ci0KLQotICAgIFN0YXJ0QWRkciA9ICh1aW50cHRyX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7Ci0KLSAgICBwbXNbMl0uVG90YWxTaXplID0gMzsKLSAgICBwbXNbMl0ucE5leHRNZW1iZXIgPSAoKFN0YXJ0QWRkciArIDMpICYgKHVpbnRwdHJfdCl+Myk7Ci0KLQotICAgIFN0YXJ0QWRkciA9ICh1aW50cHRyX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7Ci0KLSAgICBwbXNbM10uVG90YWxTaXplID0gMzsKLSAgICBwbXNbM10ucE5leHRNZW1iZXIgPSAoKFN0YXJ0QWRkciArIDMpICYgKHVpbnRwdHJfdCl+Myk7Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAqICBOYW1lICAgICAgICA6IEluc3RBbGxvY19Jbml0QWxsX05VTEwoKQotICogIElucHV0ICAgICAgIDogcG1zICAtIFBvaW50ZXIgdG8gYXJyYXkgb2YgZm91ciBJTlNUX0FMTE9DIGluc3RhbmNlcwotICogIFJldHVybnMgICAgIDogTm90aGluZwotICogIERlc2NyaXB0aW9uIDogVGhpcyBmdW5jdGlvbiByZXNlcnZlcyBTaXplIG9mIDMgYnl0ZXMgZm9yIGFsbCBtZW1vcnkgcmVnaW9ucyBhbmQKLSAqICAgICAgICAgICAgICAgIGludGlhbGl6ZXMgcE5leHRNZW1iZXIgZm9yIGFsbCByZWdpb25zIHRvIDAKLSAqICBSZW1hcmtzICAgICA6Ci0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCAgICBJbnN0QWxsb2NfSW5pdEFsbF9OVUxMKCBJTlNUX0FMTE9DICAqcG1zKQotewotICAgIHBtc1swXS5Ub3RhbFNpemUgPSAzOwotICAgIHBtc1swXS5wTmV4dE1lbWJlciA9IDA7Ci0KLQotICAgIHBtc1sxXS5Ub3RhbFNpemUgPSAzOwotICAgIHBtc1sxXS5wTmV4dE1lbWJlciA9IDA7Ci0KLSAgICBwbXNbMl0uVG90YWxTaXplID0gMzsKLSAgICBwbXNbMl0ucE5leHRNZW1iZXIgPSAwOwotCi0gICAgcG1zWzNdLlRvdGFsU2l6ZSA9IDM7Ci0gICAgcG1zWzNdLnBOZXh0TWVtYmVyID0gMDsKLQotfQotCi0KLXZvaWQqICAgSW5zdEFsbG9jX0FkZE1lbWJlckFsbCggSU5TVF9BTExPQyAgICAgICAgICAgICAgICAgICAgICpwbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgIFNpemVbXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9NZW1vcnlUYWJsZV9zdCAgICAgICAgICAgKnBNZW1vcnlUYWJsZSkKLXsKLSAgICB2b2lkICpOZXdNZW1iZXJBZGRyZXNzOyAvKiBWYXJpYWJsZSB0byB0ZW1wb3JhcmlseSBzdG9yZSB0aGUgcmV0dXJuIHZhbHVlICovCi0KLSAgICAvKiBjb3Zlcml0eVtyZXR1cm5lZF9wb2ludGVyXSBJZ25vcmUgY292ZXJpdHkgd2FybmluZyB0aGF0IHB0ciBpcyBub3QgdXNlZCAqLwotICAgIE5ld01lbWJlckFkZHJlc3MgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwgU2l6ZVtMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdKTsKLQotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZwbXNbTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXSk7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEE7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgIE5ld01lbWJlckFkZHJlc3MgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwgU2l6ZVtMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdKTsKLQotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSk7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEE7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgIE5ld01lbWJlckFkZHJlc3MgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwgU2l6ZVtMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdKTsKLQotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSk7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUY7Ci0gICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgIE5ld01lbWJlckFkZHJlc3MgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1RFTVBPUkFSWV9GQVNUXSwgU2l6ZVtMVk1fVEVNUE9SQVJZX0ZBU1RdKTsKLQotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZSAgICAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJnBtc1tMVk1fVEVNUE9SQVJZX0ZBU1RdKTsKLSAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlR5cGUgICAgICAgICAgICAgICAgID0gTFZNX1RFTVBPUkFSWV9GQVNUOwotICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzICAgICAgICAgPSBMVk1fTlVMTDsKLQotICAgIHJldHVybihOZXdNZW1iZXJBZGRyZXNzKTsKLX0KLQotCi12b2lkKiAgIEluc3RBbGxvY19BZGRNZW1iZXJBbGxSZXQoICAgICBJTlNUX0FMTE9DICAgICAgICAgICAgICAgICAqcG1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICBTaXplW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKipwdHIpCi17Ci0gICAgcHRyWzBdID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmcG1zW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0sIFNpemVbTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXSk7Ci0gICAgcHRyWzFdID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmcG1zW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0sIFNpemVbTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSk7Ci0gICAgcHRyWzJdID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmcG1zW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sIFNpemVbTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSk7Ci0gICAgcHRyWzNdID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmcG1zW0xWTV9URU1QT1JBUllfRkFTVF0sIFNpemVbTFZNX1RFTVBPUkFSWV9GQVNUXSk7Ci0KLSAgICByZXR1cm4gKHB0clswXSk7Ci19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnN0QWxsb2MuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW5zdEFsbG9jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDM5YmY1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW5zdEFsbG9jLmNwcApAQCAtMCwwICsxLDE3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkluc3RBbGxvYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5hbWUgICAgICAgIDogSW5zdEFsbG9jX0luaXQoKQorICogIElucHV0ICAgICAgIDogcG1zICAtIFBvaW50ZXIgdG8gdGhlIElOU1RfQUxMT0MgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgIFN0YXJ0QWRkciAtIEJhc2UgYWRkcmVzcyBvZiB0aGUgaW5zdGFuY2UgbWVtb3J5CisgKiAgUmV0dXJucyAgICAgOiBFcnJvciBjb2RlCisgKiAgRGVzY3JpcHRpb24gOiBJbml0aWFsaXplcyB0aGUgaW5zdGFuY2UgZGlzdHJpYnV0aW9uIGFuZCBtZW1vcnkgc2l6ZSBjYWxjdWxhdGlvbiBmdW5jdGlvbgorICogIFJlbWFya3MgICAgIDoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkICAgIEluc3RBbGxvY19Jbml0KCBJTlNUX0FMTE9DICAgICAgKnBtcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqU3RhcnRBZGRyICkKK3sKKyAgICBwbXMtPlRvdGFsU2l6ZSA9IDM7CisgICAgcG1zLT5wTmV4dE1lbWJlciA9ICgoKHVpbnRwdHJfdClTdGFydEFkZHIgKyAzKSAmICh1aW50cHRyX3QpfjMpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5hbWUgICAgICAgIDogSW5zdEFsbG9jX0FkZE1lbWJlcigpCisgKiAgSW5wdXQgICAgICAgOiBwbXMgIC0gUG9pbnRlciB0byB0aGUgSU5TVF9BTExPQyBpbnN0YW5jZQorICAgICAgICAgICAgICAgICAgU2l6ZSAtIFRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBuZXcgYWRkZWQgbWVtYmVyCisgKiAgUmV0dXJucyAgICAgOiBBIHBvaW50ZXIgdG8gdGhlIG5ldyBhZGRlZCBtZW1iZXIKKyAqICBEZXNjcmlwdGlvbiA6IEFsbG9jYXRlcyBzcGFjZSBmb3IgYSBuZXcgbWVtYmVyIGluIHRoZSBpbnN0YW5jZSBtZW1vcnkgYW5kIHJldHVybnMKKyAgICAgICAgICAgICAgICAgIGEgcG9pbnRlciB0byB0aGlzIG5ldyBtZW1iZXIuICBUaGUgc3RhcnQgYWRkcmVzcyBvZiBhbGwgbWVtYmVycyB3aWxsCisgICAgICAgICAgICAgICAgICBiZSAzMiBiaXQgYWxsaWduZWQuCisgKiAgUmVtYXJrcyAgICAgOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQqICAgSW5zdEFsbG9jX0FkZE1lbWJlciggSU5TVF9BTExPQyAgICAgICAgICpwbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICAgICAgICAgIFNpemUgKQoreworICAgIHZvaWQgKk5ld01lbWJlckFkZHJlc3M7IC8qIFZhcmlhYmxlIHRvIHRlbXBvcmFyaWx5IHN0b3JlIHRoZSByZXR1cm4gdmFsdWUgKi8KKyAgICBOZXdNZW1iZXJBZGRyZXNzID0gKHZvaWQqKXBtcy0+cE5leHRNZW1iZXI7CisKKyAgICBTaXplID0gKChTaXplICsgMykgJiAoTFZNX1VJTlQzMil+Myk7IC8qIENlaWwgdGhlIHNpemUgdG8gYSBtdWx0aXBsZSBvZiBmb3VyICovCisKKyAgICBwbXMtPlRvdGFsU2l6ZSArPSBTaXplOworICAgIHBtcy0+cE5leHRNZW1iZXIgKz0gU2l6ZTsKKworICAgIHJldHVybihOZXdNZW1iZXJBZGRyZXNzKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqICBOYW1lICAgICAgICA6IEluc3RBbGxvY19HZXRUb3RhbCgpCisgKiAgSW5wdXQgICAgICAgOiBwbXMgIC0gUG9pbnRlciB0byB0aGUgSU5TVF9BTExPQyBpbnN0YW5jZQorICogIFJldHVybnMgICAgIDogVGhlIGluc3RhbmNlIG1lbW9yeSBzaXplCisgKiAgRGVzY3JpcHRpb24gOiBUaGlzIGZ1bmN0aW9ucyByZXR1cm5zIHRoZSBjYWxjdWxhdGVkIGluc3RhbmNlIG1lbW9yeSBzaXplCisgKiAgUmVtYXJrcyAgICAgOgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWTV9VSU5UMzIgSW5zdEFsbG9jX0dldFRvdGFsKCBJTlNUX0FMTE9DICpwbXMpCit7CisgICAgaWYgKHBtcy0+VG90YWxTaXplID4gMykKKyAgICB7CisgICAgICAgIHJldHVybihwbXMtPlRvdGFsU2l6ZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHJldHVybiAwOyAgICAgICAgICAgLyogTm8gbWVtb3J5IGFkZGVkICovCisgICAgfQorfQorCit2b2lkICAgIEluc3RBbGxvY19Jbml0QWxsKCBJTlNUX0FMTE9DICAgICAgICAgICAgICAgICAgICAgICpwbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtb3J5VGFibGVfc3QgICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSkKK3sKKyAgICB1aW50cHRyX3QgU3RhcnRBZGRyOworCisgICAgU3RhcnRBZGRyID0gKHVpbnRwdHJfdClwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzczsKKworICAgIHBtc1swXS5Ub3RhbFNpemUgPSAzOworICAgIHBtc1swXS5wTmV4dE1lbWJlciA9ICgoU3RhcnRBZGRyICsgMykgJiAodWludHB0cl90KX4zKTsKKworICAgIFN0YXJ0QWRkciA9ICh1aW50cHRyX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7CisKKyAgICBwbXNbMV0uVG90YWxTaXplID0gMzsKKyAgICBwbXNbMV0ucE5leHRNZW1iZXIgPSAoKFN0YXJ0QWRkciArIDMpICYgKHVpbnRwdHJfdCl+Myk7CisKKyAgICBTdGFydEFkZHIgPSAodWludHB0cl90KXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworCisgICAgcG1zWzJdLlRvdGFsU2l6ZSA9IDM7CisgICAgcG1zWzJdLnBOZXh0TWVtYmVyID0gKChTdGFydEFkZHIgKyAzKSAmICh1aW50cHRyX3QpfjMpOworCisgICAgU3RhcnRBZGRyID0gKHVpbnRwdHJfdClwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKKworICAgIHBtc1szXS5Ub3RhbFNpemUgPSAzOworICAgIHBtc1szXS5wTmV4dE1lbWJlciA9ICgoU3RhcnRBZGRyICsgMykgJiAodWludHB0cl90KX4zKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5hbWUgICAgICAgIDogSW5zdEFsbG9jX0luaXRBbGxfTlVMTCgpCisgKiAgSW5wdXQgICAgICAgOiBwbXMgIC0gUG9pbnRlciB0byBhcnJheSBvZiBmb3VyIElOU1RfQUxMT0MgaW5zdGFuY2VzCisgKiAgUmV0dXJucyAgICAgOiBOb3RoaW5nCisgKiAgRGVzY3JpcHRpb24gOiBUaGlzIGZ1bmN0aW9uIHJlc2VydmVzIFNpemUgb2YgMyBieXRlcyBmb3IgYWxsIG1lbW9yeSByZWdpb25zIGFuZAorICogICAgICAgICAgICAgICAgaW50aWFsaXplcyBwTmV4dE1lbWJlciBmb3IgYWxsIHJlZ2lvbnMgdG8gMAorICogIFJlbWFya3MgICAgIDoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkICAgIEluc3RBbGxvY19Jbml0QWxsX05VTEwoIElOU1RfQUxMT0MgICpwbXMpCit7CisgICAgcG1zWzBdLlRvdGFsU2l6ZSA9IDM7CisgICAgcG1zWzBdLnBOZXh0TWVtYmVyID0gMDsKKworICAgIHBtc1sxXS5Ub3RhbFNpemUgPSAzOworICAgIHBtc1sxXS5wTmV4dE1lbWJlciA9IDA7CisKKyAgICBwbXNbMl0uVG90YWxTaXplID0gMzsKKyAgICBwbXNbMl0ucE5leHRNZW1iZXIgPSAwOworCisgICAgcG1zWzNdLlRvdGFsU2l6ZSA9IDM7CisgICAgcG1zWzNdLnBOZXh0TWVtYmVyID0gMDsKKworfQorCit2b2lkKiAgIEluc3RBbGxvY19BZGRNZW1iZXJBbGwoIElOU1RfQUxMT0MgICAgICAgICAgICAgICAgICAgICAqcG1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgICBTaXplW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTWVtb3J5VGFibGVfc3QgICAgICAgICAgICpwTWVtb3J5VGFibGUpCit7CisgICAgdm9pZCAqTmV3TWVtYmVyQWRkcmVzczsgLyogVmFyaWFibGUgdG8gdGVtcG9yYXJpbHkgc3RvcmUgdGhlIHJldHVybiB2YWx1ZSAqLworCisgICAgLyogY292ZXJpdHlbcmV0dXJuZWRfcG9pbnRlcl0gSWdub3JlIGNvdmVyaXR5IHdhcm5pbmcgdGhhdCBwdHIgaXMgbm90IHVzZWQgKi8KKyAgICBOZXdNZW1iZXJBZGRyZXNzID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmcG1zW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0sIFNpemVbTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXSk7CisKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmcG1zW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0pOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICBOZXdNZW1iZXJBZGRyZXNzID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmcG1zW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0sIFNpemVbTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSk7CisKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmcG1zW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0pOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICBOZXdNZW1iZXJBZGRyZXNzID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmcG1zW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0sIFNpemVbTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSk7CisKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmcG1zW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0pOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGOworICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICBOZXdNZW1iZXJBZGRyZXNzID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmcG1zW0xWTV9URU1QT1JBUllfRkFTVF0sIFNpemVbTFZNX1RFTVBPUkFSWV9GQVNUXSk7CisKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlNpemUgICAgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZwbXNbTFZNX1RFTVBPUkFSWV9GQVNUXSk7CisgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5UeXBlICAgICAgICAgICAgICAgICA9IExWTV9URU1QT1JBUllfRkFTVDsKKyAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyAgICAgICAgID0gTFZNX05VTEw7CisKKyAgICByZXR1cm4oTmV3TWVtYmVyQWRkcmVzcyk7Cit9CisKK3ZvaWQqICAgSW5zdEFsbG9jX0FkZE1lbWJlckFsbFJldCggICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgICAgICpwbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgIFNpemVbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqKnB0cikKK3sKKyAgICBwdHJbMF0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXSwgU2l6ZVtMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdKTsKKyAgICBwdHJbMV0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXSwgU2l6ZVtMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdKTsKKyAgICBwdHJbMl0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXSwgU2l6ZVtMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdKTsKKyAgICBwdHJbM10gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZwbXNbTFZNX1RFTVBPUkFSWV9GQVNUXSwgU2l6ZVtMVk1fVEVNUE9SQVJZX0ZBU1RdKTsKKworICAgIHJldHVybiAocHRyWzBdKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ludDE2TFNoaWZ0VG9JbnQzMl8xNngzMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSW50MTZMU2hpZnRUb0ludDMyXzE2eDMyLmMKcmVuYW1lIHRvIG1lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ludDE2TFNoaWZ0VG9JbnQzMl8xNngzMi5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9JbnQzMlJTaGlmdFRvSW50MTZfU2F0XzMyeDE2LmMKcmVuYW1lIHRvIG1lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0ludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Kb2luVG8yaV8zMngzMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJjNDc3ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Kb2luVG8yaV8zMngzMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREUgRklMRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gSm9pblRvMmlfMzJ4MzIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIEpvaW5UbzJpXzMyeDMyKCBjb25zdCBMVk1fSU5UMzIgICAgKnNyY0wsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgKnNyY1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICBuICkKLXsKLSAgICBMVk1fSU5UMTYgaWk7Ci0KLSAgICBzcmNMICs9IG4tMTsKLSAgICBzcmNSICs9IG4tMTsKLSAgICBkc3QgICs9ICgoMipuKS0xKTsKLQotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKLSAgICAgICAgKmRzdCA9ICpzcmNSOwotICAgICAgICBkc3QtLTsKLSAgICAgICAgc3JjUi0tOwotCi0gICAgICAgICpkc3QgPSAqc3JjTDsKLSAgICAgICAgZHN0LS07Ci0gICAgICAgIHNyY0wtLTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0jaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgSm9pblRvMmlfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAgICAqc3JjTCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAqc3JjUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgIG4gKQotewotICAgIExWTV9JTlQxNiBpaTsKLQotICAgIHNyY0wgKz0gbiAtIDE7Ci0gICAgc3JjUiArPSBuIC0gMTsKLSAgICBkc3QgICs9ICgoMiAqIG4pIC0gMSk7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgICpkc3QgPSAqc3JjUjsKLSAgICAgICAgZHN0LS07Ci0gICAgICAgIHNyY1ItLTsKLQotICAgICAgICAqZHN0ID0gKnNyY0w7Ci0gICAgICAgIGRzdC0tOwotICAgICAgICBzcmNMLS07Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvSm9pblRvMmlfMzJ4MzIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZGY2NTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Kb2luVG8yaV8zMngzMi5jcHAKQEAgLTAsMCArMSw3NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gSm9pblRvMmlfMzJ4MzIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIEpvaW5UbzJpXzMyeDMyKCBjb25zdCBMVk1fSU5UMzIgICAgKnNyY0wsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgKnNyY1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICBuICkKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisKKyAgICBzcmNMICs9IG4tMTsKKyAgICBzcmNSICs9IG4tMTsKKyAgICBkc3QgICs9ICgoMipuKS0xKTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgKmRzdCA9ICpzcmNSOworICAgICAgICBkc3QtLTsKKyAgICAgICAgc3JjUi0tOworCisgICAgICAgICpkc3QgPSAqc3JjTDsKKyAgICAgICAgZHN0LS07CisgICAgICAgIHNyY0wtLTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9Cit2b2lkIEpvaW5UbzJpX0Zsb2F0KCBjb25zdCBMVk1fRkxPQVQgICAgKnNyY0wsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyY1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICBuICkKK3sKKyAgICBMVk1fSU5UMTYgaWk7CisKKyAgICBzcmNMICs9IG4gLSAxOworICAgIHNyY1IgKz0gbiAtIDE7CisgICAgZHN0ICArPSAoKDIgKiBuKSAtIDEpOworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICAqZHN0ID0gKnNyY1I7CisgICAgICAgIGRzdC0tOworICAgICAgICBzcmNSLS07CisKKyAgICAgICAgKmRzdCA9ICpzcmNMOworICAgICAgICBkc3QtLTsKKyAgICAgICAgc3JjTC0tOworICAgIH0KKworICAgIHJldHVybjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FULmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNTc1NWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBJTkNMVURFIEZJTEVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIkxWQ19NaXhlcl9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKQotewotICAgIExWTV9GTE9BVCAgVGVtcDsKLSAgICBMVk1fSU5UMTYgaWk7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMS0+UHJpdmF0ZVBhcmFtcyk7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UyID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMi0+UHJpdmF0ZVBhcmFtcyk7Ci0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgewotICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKXBJbnN0YW5jZTEtPkN1cnJlbnQpOwotICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAqZHN0KysgPSAxLjBmOwotICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCi0gICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgKmRzdCsrID0gKExWTV9GTE9BVClUZW1wOwotCi0gICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpcEluc3RhbmNlMi0+Q3VycmVudCk7Ci0gICAgICAgIGlmIChUZW1wID4gMS4wZikKLSAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7Ci0gICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKLSAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7Ci0gICAgfQotCi0KLX0KLSNlbHNlCi12b2lkIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbikKLXsKLSAgICBMVk1fSU5UMzIgIFRlbXA7Ci0gICAgTFZNX0lOVDE2IGlpOwotICAgIExWTV9JTlQxNiBDdXJyZW50MVNob3J0OwotICAgIExWTV9JTlQxNiBDdXJyZW50MlNob3J0OwotICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlMT0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UxLT5Qcml2YXRlUGFyYW1zKTsKLSAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZTI9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlMi0+UHJpdmF0ZVBhcmFtcyk7Ci0KLQotICAgIEN1cnJlbnQxU2hvcnQgPSAoTFZNX0lOVDE2KShwSW5zdGFuY2UxLT5DdXJyZW50ID4+IDE2KTsKLSAgICBDdXJyZW50MlNob3J0ID0gKExWTV9JTlQxNikocEluc3RhbmNlMi0+Q3VycmVudCA+PiAxNik7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIFRlbXAgPSAoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudDFTaG9ydCk+PjE1OwotICAgICAgICBpZiAoVGVtcCA+IDB4MDAwMDdGRkYpCi0gICAgICAgICAgICAqZHN0KysgPSAweDdGRkY7Ci0gICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMHgwMDAwODAwMCkKLSAgICAgICAgICAgICpkc3QrKyA9IC0gMHg4MDAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAqZHN0KysgPSAoTFZNX0lOVDE2KVRlbXA7Ci0KLSAgICAgICAgVGVtcCA9ICgoTFZNX0lOVDMyKSooc3JjKyspICogKExWTV9JTlQzMilDdXJyZW50MlNob3J0KT4+MTU7Ci0gICAgICAgIGlmIChUZW1wID4gMHgwMDAwN0ZGRikKLSAgICAgICAgICAgICpkc3QrKyA9IDB4N0ZGRjsKLSAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQotICAgICAgICAgICAgKmRzdCsrID0gLSAweDgwMDA7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgICpkc3QrKyA9IChMVk1fSU5UMTYpVGVtcDsKLSAgICB9Ci0KLQotfQotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTRkNjFiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQuY3BwCkBAIC0wLDAgKzEsODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWQ19NaXhlcl9Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgIG4pCit7CisgICAgTFZNX0ZMT0FUICBUZW1wOworICAgIExWTV9JTlQxNiBpaTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTEgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UxLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UyLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpcEluc3RhbmNlMS0+Q3VycmVudCk7CisgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICBlbHNlCisgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7CisKKyAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClwSW5zdGFuY2UyLT5DdXJyZW50KTsKKyAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKKyAgICB9CisKK30KKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19Db3JlX01peEhhcmRfMVN0X01DX2Zsb2F0X1NBVCAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKipwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgIE5yQ2hhbm5lbHMpCit7CisgICAgTFZNX0ZMT0FUICBUZW1wOworICAgIExWTV9JTlQxNiBpaSwgamo7CisgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgZm9yIChqaiA9IDA7IGpqIDwgTnJDaGFubmVsczsgamorKykKKyAgICAgICAgeworICAgICAgICAgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlW2pqXSk7CisgICAgICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKXBJbnN0YW5jZTEtPkN1cnJlbnQpOworICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgKmRzdCsrID0gKExWTV9GTE9BVClUZW1wOworICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWMwYmFhZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FULmMKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgSU5DTFVERSBGSUxFUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gTFZDb3JlX01JWEhBUkRfMlNUX0QxNkMzMV9TQVQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgICpwdHJJbnN0YW5jZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKLXsKLSAgICBMVk1fRkxPQVQgIFRlbXA7Ci0gICAgTFZNX0lOVDE2IGlpOwotICAgIExWTV9GTE9BVCBDdXJyZW50MTsKLSAgICBMVk1fRkxPQVQgQ3VycmVudDI7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMS0+UHJpdmF0ZVBhcmFtcyk7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UyID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMi0+UHJpdmF0ZVBhcmFtcyk7Ci0KLQotICAgIEN1cnJlbnQxID0gKHBJbnN0YW5jZTEtPkN1cnJlbnQpOwotICAgIEN1cnJlbnQyID0gKHBJbnN0YW5jZTItPkN1cnJlbnQpOwotCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pewotICAgICAgICBUZW1wID0gKCgoTFZNX0ZMT0FUKSooc3JjMSsrKSAqIChMVk1fRkxPQVQpQ3VycmVudDEpKSArCi0gICAgICAgICAgICAgICAoKChMVk1fRkxPQVQpKihzcmMyKyspICogKExWTV9GTE9BVClDdXJyZW50MikpOwotICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAqZHN0KysgPSAxLjBmOwotICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCi0gICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKLSAgICB9Ci19Ci0jZWxzZQotdm9pZCBMVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAqcHRySW5zdGFuY2UxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICAqcHRySW5zdGFuY2UyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCi17Ci0gICAgTFZNX0lOVDMyICBUZW1wOwotICAgIExWTV9JTlQxNiBpaTsKLSAgICBMVk1fSU5UMTYgQ3VycmVudDFTaG9ydDsKLSAgICBMVk1fSU5UMTYgQ3VycmVudDJTaG9ydDsKLSAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZTE9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlMS0+UHJpdmF0ZVBhcmFtcyk7Ci0gICAgTWl4X1ByaXZhdGVfc3QgICpwSW5zdGFuY2UyPShNaXhfUHJpdmF0ZV9zdCAqKShwdHJJbnN0YW5jZTItPlByaXZhdGVQYXJhbXMpOwotCi0KLSAgICBDdXJyZW50MVNob3J0ID0gKExWTV9JTlQxNikocEluc3RhbmNlMS0+Q3VycmVudCA+PiAxNik7Ci0gICAgQ3VycmVudDJTaG9ydCA9IChMVk1fSU5UMTYpKHBJbnN0YW5jZTItPkN1cnJlbnQgPj4gMTYpOwotCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pewotICAgICAgICBUZW1wID0gKCgoTFZNX0lOVDMyKSooc3JjMSsrKSAqIChMVk1fSU5UMzIpQ3VycmVudDFTaG9ydCk+PjE1KSArCi0gICAgICAgICAgICAgICAoKChMVk1fSU5UMzIpKihzcmMyKyspICogKExWTV9JTlQzMilDdXJyZW50MlNob3J0KT4+MTUpOwotICAgICAgICBpZiAoVGVtcCA+IDB4MDAwMDdGRkYpCi0gICAgICAgICAgICAqZHN0KysgPSAweDdGRkY7Ci0gICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMHgwMDAwODAwMCkKLSAgICAgICAgICAgICpkc3QrKyA9IC0gMHg4MDAwOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICAqZHN0KysgPSAoTFZNX0lOVDE2KVRlbXA7Ci0gICAgfQotfQotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODQxZmExZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQuY3BwCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWQ19NaXhlcl9Qcml2YXRlLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBMVkNvcmVfTUlYSEFSRF8yU1RfRDE2QzMxX1NBVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgICpwdHJJbnN0YW5jZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBMVk1fRkxPQVQgIFRlbXA7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9GTE9BVCBDdXJyZW50MTsKKyAgICBMVk1fRkxPQVQgQ3VycmVudDI7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMS0+UHJpdmF0ZVBhcmFtcyk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UyID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMi0+UHJpdmF0ZVBhcmFtcyk7CisKKyAgICBDdXJyZW50MSA9IChwSW5zdGFuY2UxLT5DdXJyZW50KTsKKyAgICBDdXJyZW50MiA9IChwSW5zdGFuY2UyLT5DdXJyZW50KTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgVGVtcCA9ICgoKExWTV9GTE9BVCkqKHNyYzErKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnQxKSkgKworICAgICAgICAgICAgICAgKCgoTFZNX0ZMT0FUKSooc3JjMisrKSAqIChMVk1fRkxPQVQpQ3VycmVudDIpKTsKKyAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisgICAgfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI2OTRjYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBJTkNMVURFIEZJTEVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIkxWQ19NaXhlcl9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gTFZDb3JlX01JWFNPRlRfMVNUX0QxNkMzMV9XUkEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pCi17Ci0KLSAgICBMVk1fSU5UMTYgICBPdXRMb29wOwotICAgIExWTV9JTlQxNiAgIEluTG9vcDsKLSAgICBMVk1fSU5UMzIgICBpaSxqajsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+UHJpdmF0ZVBhcmFtcyk7Ci0gICAgTFZNX0ZMT0FUICAgRGVsdGEgPSBwSW5zdGFuY2UtPkRlbHRhOwotICAgIExWTV9GTE9BVCAgIEN1cnJlbnQgPSBwSW5zdGFuY2UtPkN1cnJlbnQ7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0ID0gcEluc3RhbmNlLT5UYXJnZXQ7Ci0gICAgTFZNX0ZMT0FUICAgVGVtcDsKLQotICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLwotICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7Ci0KLSAgICBpZihDdXJyZW50IDwgVGFyZ2V0KXsKLSAgICAgICAgaWYgKE91dExvb3ApewotICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKLSAgICAgICAgICAgIEN1cnJlbnQgPSBUZW1wOwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKLQotICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7Ci0gICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSpkc3QpICsgKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOwotICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gKExWTV9GTE9BVClUZW1wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSl7Ci0gICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOwotICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OwotCi0gICAgICAgICAgICBmb3IgKGpqID0gNDsgamogIT0gMCA7IGpqLS0pewotICAgICAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqZHN0KSArICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKLSAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlewotICAgICAgICBpZiAoT3V0TG9vcCl7Ci0gICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKLQotICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pewotICAgICAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqZHN0KSArICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKLSAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7Ci0gICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pewotICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKLSAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQotICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7Ci0KLSAgICAgICAgICAgIGZvciAoamogPSA0OyBqaiAhPSAwIDsgamotLSl7Ci0gICAgICAgICAgICAgICAgVGVtcCA9ICgoTFZNX0ZMT0FUKSpkc3QpICsgKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOwotICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gKExWTV9GTE9BVClUZW1wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IEN1cnJlbnQ7Ci19Ci0jZWxzZQotdm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQotewotCi0gICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKLSAgICBMVk1fSU5UMTYgICBJbkxvb3A7Ci0gICAgTFZNX0lOVDE2ICAgQ3VycmVudFNob3J0OwotICAgIExWTV9JTlQzMiAgIGlpLGpqOwotICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9zdCAqKShwdHJJbnN0YW5jZS0+UHJpdmF0ZVBhcmFtcyk7Ci0gICAgTFZNX0lOVDMyICAgRGVsdGE9cEluc3RhbmNlLT5EZWx0YTsKLSAgICBMVk1fSU5UMzIgICBDdXJyZW50PXBJbnN0YW5jZS0+Q3VycmVudDsKLSAgICBMVk1fSU5UMzIgICBUYXJnZXQ9cEluc3RhbmNlLT5UYXJnZXQ7Ci0gICAgTFZNX0lOVDMyICAgVGVtcDsKLQotICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLwotICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7Ci0KLSAgICBpZihDdXJyZW50PFRhcmdldCl7Ci0gICAgICAgIGlmIChPdXRMb29wKXsKLSAgICAgICAgICAgIEFERDJfU0FUXzMyeDMyKEN1cnJlbnQsRGVsdGEsVGVtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLwotICAgICAgICAgICAgQ3VycmVudD1UZW1wOwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKLQotICAgICAgICAgICAgQ3VycmVudFNob3J0ID0gKExWTV9JTlQxNikoQ3VycmVudD4+MTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb20gUTMxIHRvIFExNSovCi0KLSAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKXsKLSAgICAgICAgICAgICAgICBUZW1wID0gKChMVk1fSU5UMzIpKmRzdCkgKyAoKChMVk1fSU5UMzIpKihzcmMrKykgKiBDdXJyZW50U2hvcnQpPj4xNSk7ICAgICAgLyogUTE1ICsgUTE1KlExNT4+MTUgaW50byBRMTUgKi8KLSAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDB4MDAwMDdGRkYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDB4N0ZGRjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTB4MDAwMDgwMDApCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0gMHg4MDAwOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gKExWTV9JTlQxNilUZW1wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSl7Ci0gICAgICAgICAgICBBREQyX1NBVF8zMngzMihDdXJyZW50LERlbHRhLFRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KLSAgICAgICAgICAgIEN1cnJlbnQ9VGVtcDsKLSAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQotICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7Ci0KLSAgICAgICAgICAgIEN1cnJlbnRTaG9ydCA9IChMVk1fSU5UMTYpKEN1cnJlbnQ+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLwotCi0gICAgICAgICAgICBmb3IgKGpqID0gNDsgamohPTAgOyBqai0tKXsKLSAgICAgICAgICAgICAgICBUZW1wID0gKChMVk1fSU5UMzIpKmRzdCkgKyAoKChMVk1fSU5UMzIpKihzcmMrKykgKiBDdXJyZW50U2hvcnQpPj4xNSk7ICAgICAgLyogUTE1ICsgUTE1KlExNT4+MTUgaW50byBRMTUgKi8KLSAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDB4MDAwMDdGRkYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDB4N0ZGRjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTB4MDAwMDgwMDApCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0gMHg4MDAwOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gKExWTV9JTlQxNilUZW1wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2V7Ci0gICAgICAgIGlmIChPdXRMb29wKXsKLSAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKLQotICAgICAgICAgICAgQ3VycmVudFNob3J0ID0gKExWTV9JTlQxNikoQ3VycmVudD4+MTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb20gUTMxIHRvIFExNSovCi0KLSAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKXsKLSAgICAgICAgICAgICAgICBUZW1wID0gKChMVk1fSU5UMzIpKmRzdCkgKyAoKChMVk1fSU5UMzIpKihzcmMrKykgKiBDdXJyZW50U2hvcnQpPj4xNSk7ICAgICAgLyogUTE1ICsgUTE1KlExNT4+MTUgaW50byBRMTUgKi8KLSAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDB4MDAwMDdGRkYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDB4N0ZGRjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTB4MDAwMDgwMDApCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0gMHg4MDAwOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gKExWTV9JTlQxNilUZW1wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSl7Ci0gICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KLSAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQotICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7Ci0KLSAgICAgICAgICAgIEN1cnJlbnRTaG9ydCA9IChMVk1fSU5UMTYpKEN1cnJlbnQ+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLwotCi0gICAgICAgICAgICBmb3IgKGpqID0gNDsgamohPTAgOyBqai0tKXsKLSAgICAgICAgICAgICAgICBUZW1wID0gKChMVk1fSU5UMzIpKmRzdCkgKyAoKChMVk1fSU5UMzIpKihzcmMrKykgKiBDdXJyZW50U2hvcnQpPj4xNSk7ICAgICAgLyogUTE1ICsgUTE1KlExNT4+MTUgaW50byBRMTUgKi8KLSAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDB4MDAwMDdGRkYpCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDB4N0ZGRjsKLSAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTB4MDAwMDgwMDApCi0gICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0gMHg4MDAwOwotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gKExWTV9JTlQxNilUZW1wOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHBJbnN0YW5jZS0+Q3VycmVudD1DdXJyZW50OwotfQotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FULmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTgxMzhkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuY3BwCkBAIC0wLDAgKzEsMjQ5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIExWQ29yZV9NSVhTT0ZUXzFTVF9EMTZDMzFfV1JBCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBuKQoreworCisgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICBJbkxvb3A7CisgICAgTFZNX0lOVDMyICAgaWksamo7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOworICAgIExWTV9GTE9BVCAgIERlbHRhID0gcEluc3RhbmNlLT5EZWx0YTsKKyAgICBMVk1fRkxPQVQgICBDdXJyZW50ID0gcEluc3RhbmNlLT5DdXJyZW50OworICAgIExWTV9GTE9BVCAgIFRhcmdldCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgIExWTV9GTE9BVCAgIFRlbXA7CisKKyAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShuID4+IDIpOyAvKiBQcm9jZXNzIHBlciA0IHNhbXBsZXMgKi8KKyAgICBPdXRMb29wID0gKExWTV9JTlQxNikobiAtIChJbkxvb3AgPDwgMikpOworCisgICAgaWYoQ3VycmVudCA8IFRhcmdldCl7CisgICAgICAgIGlmIChPdXRMb29wKXsKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisgICAgICAgICAgICBDdXJyZW50ID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqZHN0KSArICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKKyAgICAgICAgICAgIEN1cnJlbnQgPSBUZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChqaiA9IDQ7IGpqICE9IDAgOyBqai0tKXsKKyAgICAgICAgICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKmRzdCkgKyAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZXsKKyAgICAgICAgaWYgKE91dExvb3ApeworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgICAgICBUZW1wID0gKChMVk1fRkxPQVQpKmRzdCkgKyAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAoTFZNX0ZMT0FUKVRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGpqID0gNDsgamogIT0gMCA7IGpqLS0peworICAgICAgICAgICAgICAgIFRlbXAgPSAoKExWTV9GTE9BVCkqZHN0KSArICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IChMVk1fRkxPQVQpVGVtcDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OworfQorI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBGVU5DVElPTjogICAgICAgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBNaXhlciBmdW5jdGlvbiB3aXRoIHN1cHBvcnQgZm9yIHByb2Nlc3NpbmcgbXVsdGljaGFubmVsIGlucHV0LgorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcHRySW5zdGFuY2UgICAgSW5zdGFuY2UgcG9pbnRlcgorICogIHNyYyAgICAgICAgICAgIFNvdXJjZQorICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM19GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBOckNoYW5uZWxzKQoreworCisgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICBJbkxvb3A7CisgICAgTFZNX0lOVDMyICAgaWksIGpqOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKKyAgICBMVk1fRkxPQVQgICBEZWx0YSA9IHBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudCA9IHBJbnN0YW5jZS0+Q3VycmVudDsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fRkxPQVQgICBUZW1wOworCisgICAgLyoKKyAgICAgKiBTYW1lIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgb24gY29uc2VjdXRpdmUgZnJhbWVzLgorICAgICAqIFNvIHR3byBmcmFtZXMgYXJlIHByb2Nlc3NlZCBpbiBvbmUgaXRlcmF0aW9uIGFuZAorICAgICAqIHRoZSBsb29wIHdpbGwgcnVuIG9ubHkgZm9yIGhhbGYgdGhlIE5yRnJhbWVzIHZhbHVlIHRpbWVzLgorICAgICAqLworICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKE5yRnJhbWVzID4+IDEpOworICAgIC8qIE91dExvb3AgaXMgY2FsY3VsYXRlZCB0byBoYW5kbGUgY2FzZXMgd2hlcmUgTnJGcmFtZXMgdmFsdWUgY2FuIGJlIG9kZC4qLworICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShOckZyYW1lcyAtIChJbkxvb3AgPDwgMSkpOworCisgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpIHsKKyAgICAgICAgaWYgKE91dExvb3ApIHsKKyAgICAgICAgICAgIFRlbXAgPSBDdXJyZW50ICsgRGVsdGE7CisgICAgICAgICAgICBDdXJyZW50ID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3AqTnJDaGFubmVsczsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0gMCA7IGpqLS0pIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gKCpkc3QpICsgKCooc3JjKyspICogQ3VycmVudCk7CisgICAgICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAxLjBmOworICAgICAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gLTEuMGY7CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSBUZW1wOworCisgICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKKworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIGlmIChPdXRMb29wKSB7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3AqTnJDaGFubmVsczsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9IDAgOyBqai0tKSB7CisgICAgICAgICAgICAgICAgVGVtcCA9ICgqZHN0KSArICgqKHNyYysrKSAqIEN1cnJlbnQpOworICAgICAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IC0xLjBmOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgKmRzdCsrID0gVGVtcDsKKworICAgICAgICAgICAgICAgIFRlbXAgPSAoKmRzdCkgKyAoKihzcmMrKykgKiBDdXJyZW50KTsKKyAgICAgICAgICAgICAgICBpZiAoVGVtcCA+IDEuMGYpCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IDEuMGY7CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgICAgICAqZHN0KysgPSAtMS4wZjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpkc3QrKyA9IFRlbXA7CisKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50OworfQorCisjZW5kaWYKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTZhMTE3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuYworKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgSU5DTFVERSBGSUxFUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotc3RhdGljIExWTV9GTE9BVCBBREQyX1NBVF9GTE9BVChMVk1fRkxPQVQgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUIGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCBjKQotewotICAgIExWTV9GTE9BVCB0ZW1wOwotICAgIHRlbXAgPSBhICsgYiA7Ci0gICAgaWYgKHRlbXAgPCAtMS4wZikKLSAgICAgICAgYyA9IC0xLjBmOwotICAgIGVsc2UgaWYgKHRlbXAgPiAxLjBmKQotICAgICAgICBjID0gMS4wZjsKLSAgICBlbHNlCi0gICAgICAgIGMgPSB0ZW1wOwotICAgIHJldHVybiBjOwotfQotdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgIG4pCi17Ci0gICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKLSAgICBMVk1fSU5UMTYgICBJbkxvb3A7Ci0gICAgTFZNX0lOVDMyICAgaWk7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2VMID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMS0+UHJpdmF0ZVBhcmFtcyk7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2VSID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlMi0+UHJpdmF0ZVBhcmFtcyk7Ci0KLSAgICBMVk1fRkxPQVQgICBEZWx0YUwgPSBwSW5zdGFuY2VMLT5EZWx0YTsKLSAgICBMVk1fRkxPQVQgICBDdXJyZW50TCA9IHBJbnN0YW5jZUwtPkN1cnJlbnQ7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0TCA9IHBJbnN0YW5jZUwtPlRhcmdldDsKLQotICAgIExWTV9GTE9BVCAgIERlbHRhUiA9IHBJbnN0YW5jZVItPkRlbHRhOwotICAgIExWTV9GTE9BVCAgIEN1cnJlbnRSID0gcEluc3RhbmNlUi0+Q3VycmVudDsKLSAgICBMVk1fRkxPQVQgICBUYXJnZXRSID0gcEluc3RhbmNlUi0+VGFyZ2V0OwotCi0gICAgTFZNX0ZMT0FUICAgVGVtcCA9IDA7Ci0KLSAgICBJbkxvb3AgPSAoTFZNX0lOVDE2KShuID4+IDIpOyAvKiBQcm9jZXNzIHBlciA0IHNhbXBsZXMgKi8KLSAgICBPdXRMb29wID0gKExWTV9JTlQxNikobiAtIChJbkxvb3AgPDwgMikpOwotCi0gICAgaWYgKE91dExvb3ApCi0gICAgewotICAgICAgICBpZihDdXJyZW50TCA8IFRhcmdldEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFERDJfU0FUX0ZMT0FUKEN1cnJlbnRMLCBEZWx0YUwsIFRlbXApOwotICAgICAgICAgICAgQ3VycmVudEwgPSBUZW1wOwotICAgICAgICAgICAgaWYgKEN1cnJlbnRMID4gVGFyZ2V0TCkKLSAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBDdXJyZW50TCAtPSBEZWx0YUw7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudEwgPCBUYXJnZXRMKQotICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKEN1cnJlbnRSIDwgVGFyZ2V0UikKLSAgICAgICAgewotICAgICAgICAgICAgQUREMl9TQVRfRkxPQVQoQ3VycmVudFIsIERlbHRhUiwgVGVtcCk7Ci0gICAgICAgICAgICBDdXJyZW50UiA9IFRlbXA7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudFIgPiBUYXJnZXRSKQotICAgICAgICAgICAgICAgIEN1cnJlbnRSID0gVGFyZ2V0UjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEN1cnJlbnRSIC09IERlbHRhUjsKLSAgICAgICAgICAgIGlmIChDdXJyZW50UiA8IFRhcmdldFIpCi0gICAgICAgICAgICAgICAgQ3VycmVudFIgPSBUYXJnZXRSOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yIChpaSA9IE91dExvb3AgKiAyOyBpaSAhPSAwOyBpaSAtPSAyKQotICAgICAgICB7Ci0gICAgICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50TCkpOwotICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGZvciAoaWkgPSBJbkxvb3AgKiAyOyBpaSAhPSAwOyBpaS09MikKLSAgICB7Ci0gICAgICAgIGlmKEN1cnJlbnRMIDwgVGFyZ2V0TCkKLSAgICAgICAgewotICAgICAgICAgICAgQUREMl9TQVRfRkxPQVQoQ3VycmVudEwsIERlbHRhTCwgVGVtcCk7Ci0gICAgICAgICAgICBDdXJyZW50TCA9IFRlbXA7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudEwgPiBUYXJnZXRMKQotICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEN1cnJlbnRMIC09IERlbHRhTDsKLSAgICAgICAgICAgIGlmIChDdXJyZW50TCA8IFRhcmdldEwpCi0gICAgICAgICAgICAgICAgQ3VycmVudEwgPSBUYXJnZXRMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoQ3VycmVudFIgPCBUYXJnZXRSKQotICAgICAgICB7Ci0gICAgICAgICAgICBBREQyX1NBVF9GTE9BVChDdXJyZW50UiwgRGVsdGFSLCBUZW1wKTsKLSAgICAgICAgICAgIEN1cnJlbnRSID0gVGVtcDsKLSAgICAgICAgICAgIGlmIChDdXJyZW50UiA+IFRhcmdldFIpCi0gICAgICAgICAgICAgICAgQ3VycmVudFIgPSBUYXJnZXRSOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgQ3VycmVudFIgLT0gRGVsdGFSOwotICAgICAgICAgICAgaWYgKEN1cnJlbnRSIDwgVGFyZ2V0UikKLSAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7Ci0gICAgICAgIH0KLQotICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50TCkpOwotICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50UikpOwotICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50TCkpOwotICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50UikpOwotICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50TCkpOwotICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50UikpOwotICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50TCkpOwotICAgICAgICAqKGRzdCsrKSA9IChMVk1fRkxPQVQpKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50UikpOwotICAgIH0KLSAgICBwSW5zdGFuY2VMLT5DdXJyZW50ID0gQ3VycmVudEw7Ci0gICAgcEluc3RhbmNlUi0+Q3VycmVudCA9IEN1cnJlbnRSOwotCi19Ci0jZWxzZQotdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgIG4pCi17Ci0gICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKLSAgICBMVk1fSU5UMTYgICBJbkxvb3A7Ci0gICAgTFZNX0lOVDE2ICAgQ3VycmVudFNob3J0TDsKLSAgICBMVk1fSU5UMTYgICBDdXJyZW50U2hvcnRSOwotICAgIExWTV9JTlQzMiAgIGlpOwotICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlTD0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UxLT5Qcml2YXRlUGFyYW1zKTsKLSAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZVI9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlMi0+UHJpdmF0ZVBhcmFtcyk7Ci0KLSAgICBMVk1fSU5UMzIgICBEZWx0YUw9cEluc3RhbmNlTC0+RGVsdGE7Ci0gICAgTFZNX0lOVDMyICAgQ3VycmVudEw9cEluc3RhbmNlTC0+Q3VycmVudDsKLSAgICBMVk1fSU5UMzIgICBUYXJnZXRMPXBJbnN0YW5jZUwtPlRhcmdldDsKLQotICAgIExWTV9JTlQzMiAgIERlbHRhUj1wSW5zdGFuY2VSLT5EZWx0YTsKLSAgICBMVk1fSU5UMzIgICBDdXJyZW50Uj1wSW5zdGFuY2VSLT5DdXJyZW50OwotICAgIExWTV9JTlQzMiAgIFRhcmdldFI9cEluc3RhbmNlUi0+VGFyZ2V0OwotCi0gICAgTFZNX0lOVDMyICAgVGVtcDsKLQotICAgIEluTG9vcCA9IChMVk1fSU5UMTYpKG4gPj4gMik7IC8qIFByb2Nlc3MgcGVyIDQgc2FtcGxlcyAqLwotICAgIE91dExvb3AgPSAoTFZNX0lOVDE2KShuIC0gKEluTG9vcCA8PCAyKSk7Ci0KLSAgICBpZiAoT3V0TG9vcCkKLSAgICB7Ci0gICAgICAgIGlmKEN1cnJlbnRMPFRhcmdldEwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFERDJfU0FUXzMyeDMyKEN1cnJlbnRMLERlbHRhTCxUZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCi0gICAgICAgICAgICBDdXJyZW50TD1UZW1wOwotICAgICAgICAgICAgaWYgKEN1cnJlbnRMID4gVGFyZ2V0TCkKLSAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBDdXJyZW50TCAtPSBEZWx0YUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLwotICAgICAgICAgICAgaWYgKEN1cnJlbnRMIDwgVGFyZ2V0TCkKLSAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZihDdXJyZW50UjxUYXJnZXRSKQotICAgICAgICB7Ci0gICAgICAgICAgICBBREQyX1NBVF8zMngzMihDdXJyZW50UixEZWx0YVIsVGVtcCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLwotICAgICAgICAgICAgQ3VycmVudFI9VGVtcDsKLSAgICAgICAgICAgIGlmIChDdXJyZW50UiA+IFRhcmdldFIpCi0gICAgICAgICAgICAgICAgQ3VycmVudFIgPSBUYXJnZXRSOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgQ3VycmVudFIgLT0gRGVsdGFSOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KLSAgICAgICAgICAgIGlmIChDdXJyZW50UiA8IFRhcmdldFIpCi0gICAgICAgICAgICAgICAgQ3VycmVudFIgPSBUYXJnZXRSOwotICAgICAgICB9Ci0KLSAgICAgICAgQ3VycmVudFNob3J0TCA9IChMVk1fSU5UMTYpKEN1cnJlbnRMPj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KLSAgICAgICAgQ3VycmVudFNob3J0UiA9IChMVk1fSU5UMTYpKEN1cnJlbnRSPj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KLQotICAgICAgICBmb3IgKGlpID0gT3V0TG9vcCoyOyBpaSAhPSAwOyBpaS09MikKLSAgICAgICAgewotICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0TCk+PjE1KTsgICAgLyogUTE1KlExNT4+MTUgaW50byBRMTUgKi8KLSAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydFIpPj4xNSk7ICAgIC8qIFExNSpRMTU+PjE1IGludG8gUTE1ICovCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGlpID0gSW5Mb29wKjI7IGlpICE9IDA7IGlpLT0yKQotICAgIHsKLSAgICAgICAgaWYoQ3VycmVudEw8VGFyZ2V0TCkKLSAgICAgICAgewotICAgICAgICAgICAgQUREMl9TQVRfMzJ4MzIoQ3VycmVudEwsRGVsdGFMLFRlbXApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogUTMxICsgUTMxIGludG8gUTMxKi8KLSAgICAgICAgICAgIEN1cnJlbnRMPVRlbXA7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudEwgPiBUYXJnZXRMKQotICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIEN1cnJlbnRMIC09IERlbHRhTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCi0gICAgICAgICAgICBpZiAoQ3VycmVudEwgPCBUYXJnZXRMKQotICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKEN1cnJlbnRSPFRhcmdldFIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFERDJfU0FUXzMyeDMyKEN1cnJlbnRSLERlbHRhUixUZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCi0gICAgICAgICAgICBDdXJyZW50Uj1UZW1wOwotICAgICAgICAgICAgaWYgKEN1cnJlbnRSID4gVGFyZ2V0UikKLSAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBDdXJyZW50UiAtPSBEZWx0YVI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLwotICAgICAgICAgICAgaWYgKEN1cnJlbnRSIDwgVGFyZ2V0UikKLSAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7Ci0gICAgICAgIH0KLQotICAgICAgICBDdXJyZW50U2hvcnRMID0gKExWTV9JTlQxNikoQ3VycmVudEw+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLwotICAgICAgICBDdXJyZW50U2hvcnRSID0gKExWTV9JTlQxNikoQ3VycmVudFI+PjE2KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGcm9tIFEzMSB0byBRMTUqLwotCi0gICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydEwpPj4xNSk7ICAgIC8qIFExNSpRMTU+PjE1IGludG8gUTE1ICovCi0gICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydFIpPj4xNSk7ICAgIC8qIFExNSpRMTU+PjE1IGludG8gUTE1ICovCi0gICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydEwpPj4xNSk7Ci0gICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydFIpPj4xNSk7Ci0gICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydEwpPj4xNSk7Ci0gICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydFIpPj4xNSk7Ci0gICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydEwpPj4xNSk7Ci0gICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydFIpPj4xNSk7Ci0gICAgfQotICAgIHBJbnN0YW5jZUwtPkN1cnJlbnQ9Q3VycmVudEw7Ci0gICAgcEluc3RhbmNlUi0+Q3VycmVudD1DdXJyZW50UjsKLQotfQotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWY0YjA4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEuY3BwCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3N0YXRpYyBMVk1fRkxPQVQgQUREMl9TQVRfRkxPQVQoTFZNX0ZMT0FUIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgYykKK3sKKyAgICBMVk1fRkxPQVQgdGVtcDsKKyAgICB0ZW1wID0gYSArIGIgOworICAgIGlmICh0ZW1wIDwgLTEuMGYpCisgICAgICAgIGMgPSAtMS4wZjsKKyAgICBlbHNlIGlmICh0ZW1wID4gMS4wZikKKyAgICAgICAgYyA9IDEuMGY7CisgICAgZWxzZQorICAgICAgICBjID0gdGVtcDsKKyAgICByZXR1cm4gYzsKK30KK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQSggTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKQoreworICAgIExWTV9JTlQxNiAgIE91dExvb3A7CisgICAgTFZNX0lOVDE2ICAgSW5Mb29wOworICAgIExWTV9JTlQzMiAgIGlpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlTCA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZTEtPlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlUiA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZTItPlByaXZhdGVQYXJhbXMpOworCisgICAgTFZNX0ZMT0FUICAgRGVsdGFMID0gcEluc3RhbmNlTC0+RGVsdGE7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudEwgPSBwSW5zdGFuY2VMLT5DdXJyZW50OworICAgIExWTV9GTE9BVCAgIFRhcmdldEwgPSBwSW5zdGFuY2VMLT5UYXJnZXQ7CisKKyAgICBMVk1fRkxPQVQgICBEZWx0YVIgPSBwSW5zdGFuY2VSLT5EZWx0YTsKKyAgICBMVk1fRkxPQVQgICBDdXJyZW50UiA9IHBJbnN0YW5jZVItPkN1cnJlbnQ7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0UiA9IHBJbnN0YW5jZVItPlRhcmdldDsKKworICAgIExWTV9GTE9BVCAgIFRlbXAgPSAwOworCisgICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCisgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKKworICAgIGlmIChPdXRMb29wKQorICAgIHsKKyAgICAgICAgaWYoQ3VycmVudEwgPCBUYXJnZXRMKQorICAgICAgICB7CisgICAgICAgICAgICBBREQyX1NBVF9GTE9BVChDdXJyZW50TCwgRGVsdGFMLCBUZW1wKTsKKyAgICAgICAgICAgIEN1cnJlbnRMID0gVGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50TCA+IFRhcmdldEwpCisgICAgICAgICAgICAgICAgQ3VycmVudEwgPSBUYXJnZXRMOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgQ3VycmVudEwgLT0gRGVsdGFMOworICAgICAgICAgICAgaWYgKEN1cnJlbnRMIDwgVGFyZ2V0TCkKKyAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7CisgICAgICAgIH0KKworICAgICAgICBpZihDdXJyZW50UiA8IFRhcmdldFIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFERDJfU0FUX0ZMT0FUKEN1cnJlbnRSLCBEZWx0YVIsIFRlbXApOworICAgICAgICAgICAgQ3VycmVudFIgPSBUZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnRSID4gVGFyZ2V0UikKKyAgICAgICAgICAgICAgICBDdXJyZW50UiA9IFRhcmdldFI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdXJyZW50UiAtPSBEZWx0YVI7CisgICAgICAgICAgICBpZiAoQ3VycmVudFIgPCBUYXJnZXRSKQorICAgICAgICAgICAgICAgIEN1cnJlbnRSID0gVGFyZ2V0UjsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBPdXRMb29wICogMjsgaWkgIT0gMDsgaWkgLT0gMikKKyAgICAgICAgeworICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKExWTV9GTE9BVCkoKChMVk1fRkxPQVQpKihzcmMrKykgKiAoTFZNX0ZMT0FUKUN1cnJlbnRSKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGlpID0gSW5Mb29wICogMjsgaWkgIT0gMDsgaWktPTIpCisgICAgeworICAgICAgICBpZihDdXJyZW50TCA8IFRhcmdldEwpCisgICAgICAgIHsKKyAgICAgICAgICAgIEFERDJfU0FUX0ZMT0FUKEN1cnJlbnRMLCBEZWx0YUwsIFRlbXApOworICAgICAgICAgICAgQ3VycmVudEwgPSBUZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnRMID4gVGFyZ2V0TCkKKyAgICAgICAgICAgICAgICBDdXJyZW50TCA9IFRhcmdldEw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBDdXJyZW50TCAtPSBEZWx0YUw7CisgICAgICAgICAgICBpZiAoQ3VycmVudEwgPCBUYXJnZXRMKQorICAgICAgICAgICAgICAgIEN1cnJlbnRMID0gVGFyZ2V0TDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKEN1cnJlbnRSIDwgVGFyZ2V0UikKKyAgICAgICAgeworICAgICAgICAgICAgQUREMl9TQVRfRkxPQVQoQ3VycmVudFIsIERlbHRhUiwgVGVtcCk7CisgICAgICAgICAgICBDdXJyZW50UiA9IFRlbXA7CisgICAgICAgICAgICBpZiAoQ3VycmVudFIgPiBUYXJnZXRSKQorICAgICAgICAgICAgICAgIEN1cnJlbnRSID0gVGFyZ2V0UjsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIEN1cnJlbnRSIC09IERlbHRhUjsKKyAgICAgICAgICAgIGlmIChDdXJyZW50UiA8IFRhcmdldFIpCisgICAgICAgICAgICAgICAgQ3VycmVudFIgPSBUYXJnZXRSOworICAgICAgICB9CisKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudEwpKTsKKyAgICAgICAgKihkc3QrKykgPSAoTFZNX0ZMT0FUKSgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudFIpKTsKKyAgICB9CisgICAgcEluc3RhbmNlTC0+Q3VycmVudCA9IEN1cnJlbnRMOworICAgIHBJbnN0YW5jZVItPkN1cnJlbnQgPSBDdXJyZW50UjsKKworfQorI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfTUNfZmxvYXRfV1JBIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJDaGFubmVscykKK3sKKyAgICBMVk1fSU5UMzIgICBpaSwgY2g7CisgICAgTFZNX0ZMT0FUICAgVGVtcCA9MC4wZjsKKyAgICBMVk1fRkxPQVQgICB0ZW1wQ3VycmVudFtOckNoYW5uZWxzXTsKKyAgICBmb3IgKGNoID0gMDsgY2ggPCBOckNoYW5uZWxzOyBjaCsrKQorICAgIHsKKyAgICAgICAgdGVtcEN1cnJlbnRbY2hdID0gcHRySW5zdGFuY2VbY2hdLT5DdXJyZW50OworICAgIH0KKyAgICBmb3IgKGlpID0gTnJGcmFtZXM7IGlpID4gMDsgaWktLSkKKyAgICB7CisgICAgICAgIGZvciAoY2ggPSAwOyBjaCA8IE5yQ2hhbm5lbHM7IGNoKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICpwSW5zdGFuY2UgPSBwdHJJbnN0YW5jZVtjaF07CisgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICBEZWx0YSA9IHBJbnN0YW5jZS0+RGVsdGE7CisgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICBDdXJyZW50ID0gdGVtcEN1cnJlbnRbY2hdOworICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgVGFyZ2V0ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBREQyX1NBVF9GTE9BVChDdXJyZW50LCBEZWx0YSwgVGVtcCk7CisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRlbXA7CisgICAgICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKKyAgICAgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkc3QrKyA9ICpzcmMrKyAqIEN1cnJlbnQ7CisgICAgICAgICAgICB0ZW1wQ3VycmVudFtjaF0gPSBDdXJyZW50OworICAgICAgICB9CisgICAgfQorICAgIGZvciAoY2ggPSAwOyBjaCA8IE5yQ2hhbm5lbHM7IGNoKyspCisgICAgeworICAgICAgICBwdHJJbnN0YW5jZVtjaF0tPkN1cnJlbnQgPSB0ZW1wQ3VycmVudFtjaF07CisgICAgfQorfQorI2VuZGlmCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVlN2Y1Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREUgRklMRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0jaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gTFZDb3JlX01JWFNPRlRfMVNUX0QxNkMzMV9XUkEKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKLXsKLSAgICBMVk1fSU5UMTYgICBPdXRMb29wOwotICAgIExWTV9JTlQxNiAgIEluTG9vcDsKLSAgICBMVk1fSU5UMzIgICBpaTsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZT0oTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOwotICAgIExWTV9GTE9BVCAgIERlbHRhPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+RGVsdGE7Ci0gICAgTFZNX0ZMT0FUICAgQ3VycmVudCA9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5DdXJyZW50OwotICAgIExWTV9GTE9BVCAgIFRhcmdldD0gKExWTV9GTE9BVClwSW5zdGFuY2UtPlRhcmdldDsKLSAgICBMVk1fRkxPQVQgICBUZW1wOwotCi0gICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCi0gICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKLQotICAgIGlmKEN1cnJlbnQ8VGFyZ2V0KXsKLSAgICAgICAgaWYgKE91dExvb3ApewotCi0gICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOwotICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQotICAgICAgICAgICAgICAgIFRlbXAgPSAxLjBmOwotICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgICAgIFRlbXAgPSAtMS4wZjsKLQotICAgICAgICAgICAgQ3VycmVudD1UZW1wOwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKLQotICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pewotICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKLQotICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKLQotICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQotICAgICAgICAgICAgICAgIFRlbXAgPSAxLjBmOwotICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQotICAgICAgICAgICAgICAgIFRlbXAgPSAtMS4wZjsKLQotICAgICAgICAgICAgQ3VycmVudD1UZW1wOwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKLQotICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSApOwotICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSApOwotICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSApOwotICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSApOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2V7Ci0gICAgICAgIGlmIChPdXRMb29wKXsKLSAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OwotCi0gICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7Ci0gICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKLSAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OwotCi0gICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKLSAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOwotICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7Ci0gICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKLX0KLSNlbHNlCi12b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKLXsKLSAgICBMVk1fSU5UMTYgICBPdXRMb29wOwotICAgIExWTV9JTlQxNiAgIEluTG9vcDsKLSAgICBMVk1fSU5UMTYgICBDdXJyZW50U2hvcnQ7Ci0gICAgTFZNX0lOVDMyICAgaWk7Ci0gICAgTWl4X1ByaXZhdGVfc3QgICpwSW5zdGFuY2U9KE1peF9Qcml2YXRlX3N0ICopKHB0ckluc3RhbmNlLT5Qcml2YXRlUGFyYW1zKTsKLSAgICBMVk1fSU5UMzIgICBEZWx0YT1wSW5zdGFuY2UtPkRlbHRhOwotICAgIExWTV9JTlQzMiAgIEN1cnJlbnQ9cEluc3RhbmNlLT5DdXJyZW50OwotICAgIExWTV9JTlQzMiAgIFRhcmdldD1wSW5zdGFuY2UtPlRhcmdldDsKLSAgICBMVk1fSU5UMzIgICBUZW1wOwotCi0gICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCi0gICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKLQotICAgIGlmKEN1cnJlbnQ8VGFyZ2V0KXsKLSAgICAgICAgaWYgKE91dExvb3ApewotICAgICAgICAgICAgQUREMl9TQVRfMzJ4MzIoQ3VycmVudCxEZWx0YSxUZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCi0gICAgICAgICAgICBDdXJyZW50PVRlbXA7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OwotCi0gICAgICAgICAgICBDdXJyZW50U2hvcnQgPSAoTFZNX0lOVDE2KShDdXJyZW50Pj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KLQotICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pewotICAgICAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydCk+PjE1KTsgICAgLyogUTE1KlExNT4+MTUgaW50byBRMTUgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pewotICAgICAgICAgICAgQUREMl9TQVRfMzJ4MzIoQ3VycmVudCxEZWx0YSxUZW1wKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFEzMSArIFEzMSBpbnRvIFEzMSovCi0gICAgICAgICAgICBDdXJyZW50PVRlbXA7Ci0gICAgICAgICAgICBpZiAoQ3VycmVudCA+IFRhcmdldCkKLSAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OwotCi0gICAgICAgICAgICBDdXJyZW50U2hvcnQgPSAoTFZNX0lOVDE2KShDdXJyZW50Pj4xNik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRnJvbSBRMzEgdG8gUTE1Ki8KLQotICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0KT4+MTUpOyAgICAvKiBRMTUqUTE1Pj4xNSBpbnRvIFExNSAqLwotICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0KT4+MTUpOwotICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0KT4+MTUpOwotICAgICAgICAgICAgKihkc3QrKykgPSAoTFZNX0lOVDE2KSgoKExWTV9JTlQzMikqKHNyYysrKSAqIChMVk1fSU5UMzIpQ3VycmVudFNob3J0KT4+MTUpOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2V7Ci0gICAgICAgIGlmIChPdXRMb29wKXsKLSAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKLQotICAgICAgICAgICAgQ3VycmVudFNob3J0ID0gKExWTV9JTlQxNikoQ3VycmVudD4+MTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb20gUTMxIHRvIFExNSovCi0KLSAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKXsKLSAgICAgICAgICAgICAgICAqKGRzdCsrKSA9IChMVk1fSU5UMTYpKCgoTFZNX0lOVDMyKSooc3JjKyspICogKExWTV9JTlQzMilDdXJyZW50U2hvcnQpPj4xNSk7ICAgIC8qIFExNSpRMTU+PjE1IGludG8gUTE1ICovCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKLSAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBRMzEgKyBRMzEgaW50byBRMzEqLwotICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCi0gICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKLQotICAgICAgICAgICAgQ3VycmVudFNob3J0ID0gKExWTV9JTlQxNikoQ3VycmVudD4+MTYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZyb20gUTMxIHRvIFExNSovCi0KLSAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydCk+PjE1KTsgICAgLyogUTE1KlExNT4+MTUgaW50byBRMTUgKi8KLSAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydCk+PjE1KTsKLSAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydCk+PjE1KTsKLSAgICAgICAgICAgICooZHN0KyspID0gKExWTV9JTlQxNikoKChMVk1fSU5UMzIpKihzcmMrKykgKiAoTFZNX0lOVDMyKUN1cnJlbnRTaG9ydCk+PjE1KTsKLSAgICAgICAgfQotICAgIH0KLSAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKLX0KLSNlbmRpZgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkOGFhZGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBLmNwcApAQCAtMCwwICsxLDIxOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisjaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTFZDb3JlX01JWFNPRlRfMVNUX0QxNkMzMV9XUkEKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbikKK3sKKyAgICBMVk1fSU5UMTYgICBPdXRMb29wOworICAgIExWTV9JTlQxNiAgIEluTG9vcDsKKyAgICBMVk1fSU5UMzIgICBpaTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZT0oTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPlByaXZhdGVQYXJhbXMpOworICAgIExWTV9GTE9BVCAgIERlbHRhPSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+RGVsdGE7CisgICAgTFZNX0ZMT0FUICAgQ3VycmVudCA9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5DdXJyZW50OworICAgIExWTV9GTE9BVCAgIFRhcmdldD0gKExWTV9GTE9BVClwSW5zdGFuY2UtPlRhcmdldDsKKyAgICBMVk1fRkxPQVQgICBUZW1wOworCisgICAgSW5Mb29wID0gKExWTV9JTlQxNikobiA+PiAyKTsgLyogUHJvY2VzcyBwZXIgNCBzYW1wbGVzICovCisgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKG4gLSAoSW5Mb29wIDw8IDIpKTsKKworICAgIGlmKEN1cnJlbnQ8VGFyZ2V0KXsKKyAgICAgICAgaWYgKE91dExvb3ApeworCisgICAgICAgICAgICBUZW1wID0gQ3VycmVudCArIERlbHRhOworICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAxLjBmOworICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAtMS4wZjsKKworICAgICAgICAgICAgQ3VycmVudD1UZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0peworICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKworICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKKworICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAxLjBmOworICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAtMS4wZjsKKworICAgICAgICAgICAgQ3VycmVudD1UZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSApOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSApOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSApOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIGlmIChPdXRMb29wKXsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICBmb3IgKGlpID0gT3V0TG9vcDsgaWkgIT0gMDsgaWktLSl7CisgICAgICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGlpID0gSW5Mb29wOyBpaSAhPSAwOyBpaS0tKXsKKyAgICAgICAgICAgIEN1cnJlbnQgLT0gRGVsdGE7CisgICAgICAgICAgICBpZiAoQ3VycmVudCA8IFRhcmdldCkKKyAgICAgICAgICAgICAgICBDdXJyZW50ID0gVGFyZ2V0OworCisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgKihkc3QrKykgPSAoKChMVk1fRkxPQVQpKihzcmMrKykgKiBDdXJyZW50KSk7CisgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKK30KKworI2lmZGVmIFNVUFBPUlRfTUMKKy8qCisgKiBGVU5DVElPTjogICAgICAgTFZDX0NvcmVfTWl4U29mdF9NY19EMTZDMzFfV1JBCisgKgorICogREVTQ1JJUFRJT046CisgKiAgTWl4ZXIgZnVuY3Rpb24gd2l0aCBzdXBwb3J0IGZvciBwcm9jZXNzaW5nIG11bHRpY2hhbm5lbCBpbnB1dAorICoKKyAqIFBBUkFNRVRFUlM6CisgKiAgcHRySW5zdGFuY2UgICAgSW5zdGFuY2UgcG9pbnRlcgorICogIHNyYyAgICAgICAgICAgIFNvdXJjZQorICogIGRzdCAgICAgICAgICAgIERlc3RpbmF0aW9uCisgKiAgTnJGcmFtZXMgICAgICAgTnVtYmVyIG9mIGZyYW1lcworICogIE5yQ2hhbm5lbHMgICAgIE51bWJlciBvZiBjaGFubmVscworICoKKyAqIFJFVFVSTlM6CisgKiAgdm9pZAorICoKKyAqLwordm9pZCBMVkNfQ29yZV9NaXhTb2Z0X01jX0QxNkMzMV9XUkEoTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIE5yQ2hhbm5lbHMpCit7CisgICAgTFZNX0lOVDE2ICAgT3V0TG9vcDsKKyAgICBMVk1fSU5UMTYgICBJbkxvb3A7CisgICAgTFZNX0lOVDMyICAgaWksIGpqOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+UHJpdmF0ZVBhcmFtcyk7CisgICAgTFZNX0ZMT0FUICAgRGVsdGE9IChMVk1fRkxPQVQpcEluc3RhbmNlLT5EZWx0YTsKKyAgICBMVk1fRkxPQVQgICBDdXJyZW50ID0gKExWTV9GTE9BVClwSW5zdGFuY2UtPkN1cnJlbnQ7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0PSAoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+VGFyZ2V0OworICAgIExWTV9GTE9BVCAgIFRlbXA7CisKKyAgICAvKgorICAgICAqIFNhbWUgb3BlcmF0aW9uIGlzIHBlcmZvcm1lZCBvbiBjb25zZWN1dGl2ZSBmcmFtZXMuCisgICAgICogU28gdHdvIGZyYW1lcyBhcmUgcHJvY2Vzc2VkIGluIG9uZSBpdGVyYXRpb24gYW5kCisgICAgICogdGhlIGxvb3Agd2lsbCBydW4gb25seSBmb3IgaGFsZiB0aGUgTnJGcmFtZXMgdmFsdWUgdGltZXMuCisgICAgICovCisgICAgSW5Mb29wID0gKExWTV9JTlQxNikoTnJGcmFtZXMgPj4gMSk7CisgICAgLyogT3V0TG9vcCBpcyBjYWxjdWxhdGVkIHRvIGhhbmRsZSBjYXNlcyB3aGVyZSBOckZyYW1lcyB2YWx1ZSBjYW4gYmUgb2RkLiovCisgICAgT3V0TG9vcCA9IChMVk1fSU5UMTYpKE5yRnJhbWVzIC0gKEluTG9vcCA8PCAxKSk7CisKKyAgICBpZiAoQ3VycmVudDxUYXJnZXQpIHsKKyAgICAgICAgaWYgKE91dExvb3ApIHsKKworICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKKyAgICAgICAgICAgIGlmIChUZW1wID4gMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wID0gMS4wZjsKKyAgICAgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMS4wZikKKyAgICAgICAgICAgICAgICBUZW1wID0gLTEuMGY7CisKKyAgICAgICAgICAgIEN1cnJlbnQ9VGVtcDsKKyAgICAgICAgICAgIGlmIChDdXJyZW50ID4gVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoaWkgPSBPdXRMb29wOyBpaSAhPSAwOyBpaS0tKSB7CisgICAgICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9MDsgamotLSkgeworICAgICAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIChMVk1fRkxPQVQpQ3VycmVudCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaWkgPSBJbkxvb3A7IGlpICE9IDA7IGlpLS0pIHsKKworICAgICAgICAgICAgVGVtcCA9IEN1cnJlbnQgKyBEZWx0YTsKKworICAgICAgICAgICAgaWYgKFRlbXAgPiAxLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAxLjBmOworICAgICAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjBmKQorICAgICAgICAgICAgICAgIFRlbXAgPSAtMS4wZjsKKworICAgICAgICAgICAgQ3VycmVudD1UZW1wOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPiBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChqaiA9IE5yQ2hhbm5lbHM7IGpqICE9IDAgOyBqai0tKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogQ3VycmVudCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2V7CisgICAgICAgIGlmIChPdXRMb29wKSB7CisgICAgICAgICAgICBDdXJyZW50IC09IERlbHRhOworICAgICAgICAgICAgaWYgKEN1cnJlbnQgPCBUYXJnZXQpCisgICAgICAgICAgICAgICAgQ3VycmVudCA9IFRhcmdldDsKKworICAgICAgICAgICAgZm9yIChpaSA9IE91dExvb3A7IGlpICE9IDA7IGlpLS0pIHsKKyAgICAgICAgICAgICAgICBmb3IgKGpqID0gTnJDaGFubmVsczsgamogIT0wOyBqai0tKSB7CisgICAgICAgICAgICAgICAgICAgICooZHN0KyspID0gKCgoTFZNX0ZMT0FUKSooc3JjKyspICogKExWTV9GTE9BVClDdXJyZW50KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChpaSA9IEluTG9vcDsgaWkgIT0gMDsgaWktLSkgeworICAgICAgICAgICAgQ3VycmVudCAtPSBEZWx0YTsKKyAgICAgICAgICAgIGlmIChDdXJyZW50IDwgVGFyZ2V0KQorICAgICAgICAgICAgICAgIEN1cnJlbnQgPSBUYXJnZXQ7CisKKyAgICAgICAgICAgIGZvciAoamogPSBOckNoYW5uZWxzOyBqaiAhPSAwIDsgamotLSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgICAgICAqKGRzdCsrKSA9ICgoKExWTV9GTE9BVCkqKHNyYysrKSAqIEN1cnJlbnQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQ9Q3VycmVudDsKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5MmYxMjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peEluU29mdF9EMTZDMzFfU0FULmMKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREUgRklMRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCi0jaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgREVGSU5JVElPTlMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFRSVUUgICAgICAgICAgMQotI2RlZmluZSBGQUxTRSAgICAgICAgIDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIE1JWElOU09GVF9EMTZDMzFfU0FUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pCi17Ci0gICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKLQotICAgIGlmKG4gPD0gMCkgICAgcmV0dXJuOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgIFNPRlQgTUlYSU5HCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQotICAgIHsKLSAgICAgICAgaWYocEluc3RhbmNlLT5EZWx0YSA9PSAxLjBmKXsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OwotICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OwotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOwotICAgICAgICB9ZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpewotICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCi0gICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KLSAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKLSAgICAgICAgICAgIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgc3JjLCBkc3QsIG4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgIEhBUkQgTUlYSU5HCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGlmIChIYXJkTWl4aW5nKXsKLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ICE9IDApeyAvKiBOb3RoaW5nIHRvIGRvIGluIGNhc2UgVGFyZ2V0ID0gMCAqLwotICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgPT0gMS4wZil7Ci0gICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQoc3JjLCBkc3QsIG4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQoc3JjLCAocEluc3RhbmNlLT5UYXJnZXQpLCBkc3QsIG4pOwotICAgICAgICAgICAgICAgIC8qIEluIGNhc2UgdGhlIExWQ29yZSBmdW5jdGlvbiB3b3VsZCBoYXZlIGNoYW5nZWQgdGhlIEN1cnJlbnQgdmFsdWUgKi8KLSAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgIENBTEwgQkFDSwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KXsKLSAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKXsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLwotICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OwotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW0sIFRhcmdldEdhaW4pOwotICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7Ci0gICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKXsKLSAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spICggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi19Ci0jZWxzZQotdm9pZCBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pCi17Ci0gICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7Ci0gICAgTFZNX0lOVDMyICAgVGFyZ2V0R2FpbjsKLSAgICBNaXhfUHJpdmF0ZV9zdCAgKnBJbnN0YW5jZT0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOwotCi0gICAgaWYobjw9MCkgICAgcmV0dXJuOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgIFNPRlQgTUlYSU5HCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQotICAgIHsKLSAgICAgICAgaWYocEluc3RhbmNlLT5EZWx0YSA9PSAweDdGRkZGRkZGKXsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OwotICAgICAgICAgICAgVGFyZ2V0R2Fpbj1wSW5zdGFuY2UtPlRhcmdldD4+KDE2LXBJbnN0YW5jZS0+U2hpZnQpOyAgLy8gVGFyZ2V0R2FpbiBpbiBRMTYuMTUgZm9ybWF0Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSxUYXJnZXRHYWluKTsKLSAgICAgICAgfWVsc2UgaWYgKEFic18zMihwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gIE1ha2UgdGhlbSBlcXVhbC4gKi8KLSAgICAgICAgICAgIFRhcmdldEdhaW49cEluc3RhbmNlLT5UYXJnZXQ+PigxNi1wSW5zdGFuY2UtPlNoaWZ0KTsgIC8vIFRhcmdldEdhaW4gaW4gUTE2LjE1IGZvcm1hdAotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksVGFyZ2V0R2Fpbik7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KLSAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKLSAgICAgICAgICAgIGlmKHBJbnN0YW5jZS0+U2hpZnQhPTApewotICAgICAgICAgICAgICAgIFNoaWZ0X1NhdF92MTZ4djE2ICgoTFZNX0lOVDE2KXBJbnN0YW5jZS0+U2hpZnQsc3JjLHNyYyxuKTsKLSAgICAgICAgICAgICAgICBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBzcmMsIGRzdCwgbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoICYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgc3JjLCBkc3QsIG4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgIEhBUkQgTUlYSU5HCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGlmIChIYXJkTWl4aW5nKXsKLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ICE9IDApeyAvKiBOb3RoaW5nIHRvIGRvIGluIGNhc2UgVGFyZ2V0ID0gMCAqLwotICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldD4+MTYpID09IDB4N0ZGRil7Ci0gICAgICAgICAgICAgICAgaWYocEluc3RhbmNlLT5TaGlmdCE9MCkKLSAgICAgICAgICAgICAgICAgICAgU2hpZnRfU2F0X3YxNnh2MTYgKChMVk1fSU5UMTYpcEluc3RhbmNlLT5TaGlmdCxzcmMsc3JjLG4pOwotICAgICAgICAgICAgICAgIEFkZDJfU2F0XzE2eDE2KCBzcmMsIGRzdCwgbiApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZXsKLSAgICAgICAgICAgICAgICBpZihwSW5zdGFuY2UtPlNoaWZ0IT0wKQotICAgICAgICAgICAgICAgICAgICBTaGlmdF9TYXRfdjE2eHYxNiAoKExWTV9JTlQxNilwSW5zdGFuY2UtPlNoaWZ0LHNyYyxzcmMsbik7Ci0gICAgICAgICAgICAgICAgTWFjM3NfU2F0XzE2eDE2KHNyYywoTFZNX0lOVDE2KShwSW5zdGFuY2UtPlRhcmdldD4+MTYpLGRzdCxuKTsKLSAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogSW4gY2FzZSB0aGUgTFZDb3JlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgY2hhbmdlZCB0aGUgQ3VycmVudCB2YWx1ZSAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgQ0FMTCBCQUNLCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpewotICAgICAgICBpZiAoQWJzXzMyKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKXsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiAgTWFrZSB0aGVtIGVxdWFsLiAqLwotICAgICAgICAgICAgVGFyZ2V0R2Fpbj1wSW5zdGFuY2UtPlRhcmdldD4+KDE2LXBJbnN0YW5jZS0+U2hpZnQpOyAgLy8gVGFyZ2V0R2FpbiBpbiBRMTYuMTUgZm9ybWF0Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSxUYXJnZXRHYWluKTsKLSAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCl7Ci0gICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSAoIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UscHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotfQotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhJblNvZnRfRDE2QzMxX1NBVC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZWMzYmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQuY3BwCkBAIC0wLDAgKzEsMjA3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBERUZJTklUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVFJVRSAgICAgICAgICAxCisjZGVmaW5lIEZBTFNFICAgICAgICAgMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTUlYSU5TT0ZUX0QxNkMzMV9TQVQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgbikKK3sKKyAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworCisgICAgaWYobiA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UtPkRlbHRhID09IDEuMGYpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgIT0gMCl7IC8qIE5vdGhpbmcgdG8gZG8gaW4gY2FzZSBUYXJnZXQgPSAwICovCisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSA9PSAxLjBmKXsKKyAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChzcmMsIGRzdCwgbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChzcmMsIChwSW5zdGFuY2UtPlRhcmdldCksIGRzdCwgbik7CisgICAgICAgICAgICAgICAgLyogSW4gY2FzZSB0aGUgTFZDb3JlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgY2hhbmdlZCB0aGUgQ3VycmVudCB2YWx1ZSAqLworICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KXsKKyAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKXsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW0sIFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKXsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spICggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCit9CisKKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIExWQ19NaXhJblNvZnRfTWNfRDE2QzMxX1NBVAorICoKKyAqIERFU0NSSVBUSU9OOgorICogIE1peGVyIGZ1bmN0aW9uIHdpdGggc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBtdWx0aWNoYW5uZWwgaW5wdXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMgICAgICAgICAgICBTb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX01peEluU29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yQ2hhbm5lbHMpCit7CisgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKworICAgIGlmIChOckZyYW1lcyA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZiAocEluc3RhbmNlLT5EZWx0YSA9PSAxLjBmKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKSB7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgTFZDX0NvcmVfTWl4SW5Tb2Z0X01jX0QxNkMzMV9TQVQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZykgeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgIT0gMCkgeyAvKiBOb3RoaW5nIHRvIGRvIGluIGNhc2UgVGFyZ2V0ID0gMCAqLworICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgPT0gMS4wZikgeworICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHNyYywgZHN0LCBOckZyYW1lcypOckNoYW5uZWxzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+VGFyZ2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcyAqIE5yQ2hhbm5lbHMpOworICAgICAgICAgICAgICAgIC8qIEluIGNhc2UgdGhlIExWQ29yZSBmdW5jdGlvbiB3b3VsZCBoYXZlIGNoYW5nZWQgdGhlIEN1cnJlbnQgdmFsdWUgKi8KKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCkgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW0sIFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKSB7CisgICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSAoXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKK30KKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDVhOTI1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FULmMKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREUgRklMRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCi0jaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgREVGSU5JVElPTlMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFRSVUUgICAgICAgICAgMQotI2RlZmluZSBGQUxTRSAgICAgICAgIDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbikKLXsKLSAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKLSAgICBMVk1fRkxPQVQgICBUYXJnZXRHYWluOwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UyID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5Qcml2YXRlUGFyYW1zKTsKLQotICAgIGlmKG4gPD0gMCkgICAgcmV0dXJuOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgIFNPRlQgTUlYSU5HCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgIT0gcEluc3RhbmNlMS0+VGFyZ2V0KSB8fCAocEluc3RhbmNlMi0+Q3VycmVudCAhPSBwSW5zdGFuY2UyLT5UYXJnZXQpKQotICAgIHsKLSAgICAgICAgaWYocEluc3RhbmNlMS0+RGVsdGEgPT0gMS4wZikKLSAgICAgICAgewotICAgICAgICAgICAgcEluc3RhbmNlMS0+Q3VycmVudCA9IHBJbnN0YW5jZTEtPlRhcmdldDsKLSAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UxLT5UYXJnZXQ7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTEtPkN1cnJlbnQgLSBwSW5zdGFuY2UxLT5UYXJnZXQpIDwgcEluc3RhbmNlMS0+RGVsdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KLSAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UxLT5UYXJnZXQ7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLwotICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoSGFyZE1peGluZyA9PSBUUlVFKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwSW5zdGFuY2UyLT5EZWx0YSA9PSAxLjBmKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBJbnN0YW5jZTItPkN1cnJlbnQgPSBwSW5zdGFuY2UyLT5UYXJnZXQ7Ci0gICAgICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTItPlRhcmdldDsKLSAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlMi0+Q3VycmVudCAtIHBJbnN0YW5jZTItPlRhcmdldCkgPCBwSW5zdGFuY2UyLT5EZWx0YSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwSW5zdGFuY2UyLT5DdXJyZW50ID0gcEluc3RhbmNlMi0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLwotICAgICAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UyLT5UYXJnZXQ7Ci0gICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIFRhcmdldEdhaW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCi0gICAgICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoSGFyZE1peGluZyA9PSBGQUxTRSkKLSAgICAgICAgewotICAgICAgICAgICAgIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoICYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBkc3QsIG4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgIEhBUkQgTUlYSU5HCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGlmIChIYXJkTWl4aW5nKQotICAgIHsKLSAgICAgICAgaWYgKChwSW5zdGFuY2UxLT5UYXJnZXQgPT0gMS4wZikgJiYgKHBJbnN0YW5jZTItPlRhcmdldCA9PSAxLjBmKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoc3JjICE9IGRzdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHNyYywgZHN0LCBuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIExWQ19Db3JlX01peEhhcmRfMVN0XzJpX0QxNkMzMV9TQVQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywgZHN0LCBuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICBDQUxMIEJBQ0sKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCkKLSAgICB7Ci0gICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlMS0+Q3VycmVudCAtIHBJbnN0YW5jZTEtPlRhcmdldCkgPCBwSW5zdGFuY2UxLT5EZWx0YSkKLSAgICAgICAgewotICAgICAgICAgICAgcEluc3RhbmNlMS0+Q3VycmVudCA9IHBJbnN0YW5jZTEtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLwotICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTEtPlRhcmdldDsKLSAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKLSAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSAoIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0KQotICAgIHsKLSAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UyLT5DdXJyZW50IC0gcEluc3RhbmNlMi0+VGFyZ2V0KSA8IHBJbnN0YW5jZTItPkRlbHRhKQotICAgICAgICB7Ci0gICAgICAgICAgICBwSW5zdGFuY2UyLT5DdXJyZW50ID0gcEluc3RhbmNlMi0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLwotICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTItPlRhcmdldDsKLSAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKLSAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrKSAoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0jZWxzZQotdm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbikKLXsKLSAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKLSAgICBMVk1fSU5UMzIgICBUYXJnZXRHYWluOwotICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlMT0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOwotICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlMj0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLlByaXZhdGVQYXJhbXMpOwotCi0gICAgaWYobjw9MCkgICAgcmV0dXJuOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgIFNPRlQgTUlYSU5HCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgIT0gcEluc3RhbmNlMS0+VGFyZ2V0KXx8KHBJbnN0YW5jZTItPkN1cnJlbnQgIT0gcEluc3RhbmNlMi0+VGFyZ2V0KSkKLSAgICB7Ci0gICAgICAgIGlmKHBJbnN0YW5jZTEtPkRlbHRhID09IDB4N0ZGRkZGRkYpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7Ci0gICAgICAgICAgICBUYXJnZXRHYWluPXBJbnN0YW5jZTEtPlRhcmdldD4+MTY7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQsIG5vIGludGVnZXIgcGFydAotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksVGFyZ2V0R2Fpbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoQWJzXzMyKHBJbnN0YW5jZTEtPkN1cnJlbnQtcEluc3RhbmNlMS0+VGFyZ2V0KSA8IHBJbnN0YW5jZTEtPkRlbHRhKQotICAgICAgICB7Ci0gICAgICAgICAgICBwSW5zdGFuY2UxLT5DdXJyZW50ID0gcEluc3RhbmNlMS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiAgTWFrZSB0aGVtIGVxdWFsLiAqLwotICAgICAgICAgICAgVGFyZ2V0R2Fpbj1wSW5zdGFuY2UxLT5UYXJnZXQ+PjE2OyAgLy8gVGFyZ2V0R2FpbiBpbiBRMTYuMTUgZm9ybWF0LCBubyBpbnRlZ2VyIHBhcnQKLSAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLFRhcmdldEdhaW4pOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KLSAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKEhhcmRNaXhpbmcgPT0gVFJVRSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocEluc3RhbmNlMi0+RGVsdGEgPT0gMHg3RkZGRkZGRikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwSW5zdGFuY2UyLT5DdXJyZW50ID0gcEluc3RhbmNlMi0+VGFyZ2V0OwotICAgICAgICAgICAgICAgIFRhcmdldEdhaW49cEluc3RhbmNlMi0+VGFyZ2V0Pj4xNjsgIC8vIFRhcmdldEdhaW4gaW4gUTE2LjE1IGZvcm1hdCwgbm8gaW50ZWdlciBwYXJ0Ci0gICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksVGFyZ2V0R2Fpbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChBYnNfMzIocEluc3RhbmNlMi0+Q3VycmVudC1wSW5zdGFuY2UyLT5UYXJnZXQpIDwgcEluc3RhbmNlMi0+RGVsdGEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcEluc3RhbmNlMi0+Q3VycmVudCA9IHBJbnN0YW5jZTItPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gIE1ha2UgdGhlbSBlcXVhbC4gKi8KLSAgICAgICAgICAgICAgICBUYXJnZXRHYWluPXBJbnN0YW5jZTItPlRhcmdldD4+MTY7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQsIG5vIGludGVnZXIgcGFydAotICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLFRhcmdldEdhaW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCi0gICAgICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYoSGFyZE1peGluZyA9PSBGQUxTRSkKLSAgICAgICAgewotICAgICAgICAgICAgIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoICYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIHNyYywgZHN0LCBuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICBIQVJEIE1JWElORwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBpZiAoSGFyZE1peGluZykKLSAgICB7Ci0gICAgICAgIGlmICgoKHBJbnN0YW5jZTEtPlRhcmdldD4+MTYpID09IDB4N0ZGRikmJigocEluc3RhbmNlMi0+VGFyZ2V0Pj4xNikgPT0gMHg3RkZGKSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYoc3JjIT1kc3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29weV8xNihzcmMsIGRzdCwgbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIHNyYywgZHN0LCBuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICBDQUxMIEJBQ0sKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCkKLSAgICB7Ci0gICAgICAgIGlmIChBYnNfMzIocEluc3RhbmNlMS0+Q3VycmVudC1wSW5zdGFuY2UxLT5UYXJnZXQpIDwgcEluc3RhbmNlMS0+RGVsdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBJbnN0YW5jZTEtPkN1cnJlbnQgPSBwSW5zdGFuY2UxLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuICBNYWtlIHRoZW0gZXF1YWwuICovCi0gICAgICAgICAgICBUYXJnZXRHYWluPXBJbnN0YW5jZTEtPlRhcmdldD4+KDE2LXBJbnN0YW5jZTEtPlNoaWZ0KTsgIC8vIFRhcmdldEdhaW4gaW4gUTE2LjE1IGZvcm1hdAotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLFRhcmdldEdhaW4pOwotICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7Ci0gICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKCBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLCBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCkKLSAgICB7Ci0gICAgICAgIGlmIChBYnNfMzIocEluc3RhbmNlMi0+Q3VycmVudC1wSW5zdGFuY2UyLT5UYXJnZXQpIDwgcEluc3RhbmNlMi0+RGVsdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBJbnN0YW5jZTItPkN1cnJlbnQgPSBwSW5zdGFuY2UyLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuICBNYWtlIHRoZW0gZXF1YWwuICovCi0gICAgICAgICAgICBUYXJnZXRHYWluPXBJbnN0YW5jZTItPlRhcmdldD4+KDE2LXBJbnN0YW5jZTItPlNoaWZ0KTsgIC8vIFRhcmdldEdhaW4gaW4gUTE2LjE1IGZvcm1hdAotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLFRhcmdldEdhaW4pOwotICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID0gRkFMU0U7Ci0gICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjaykgKCBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucENhbGxiYWNrSGFuZGxlLCBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucEdlbmVyYWxQdXJwb3NlLHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1BhcmFtICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0jZW5kaWYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMxNTNhZGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVC5jcHAKQEAgLTAsMCArMSwzNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgREVGSU5JVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFRSVUUgICAgICAgICAgMQorI2RlZmluZSBGQUxTRSAgICAgICAgIDAKKworI2RlZmluZSBBUlJBWV9TSVpFKGEpICgoc2l6ZW9mKGEpKSAvIChzaXplb2YoKihhKSkpKQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTFZDX01peFNvZnRfMVN0XzJpX0QxNkMzMV9TQVQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmZGVmIFNVUFBPUlRfTUMKKy8qIFRoaXMgdGhyZXNob2xkIGlzIHVzZWQgdG8gZGVjaWRlIG9uIHRoZSBwcm9jZXNzaW5nIHRvIGJlIGFwcGxpZWQgb24KKyAqIGZyb250IGNlbnRlciBhbmQgYmFjayBjZW50ZXIgY2hhbm5lbHMKKyAqLworI2RlZmluZSBMVk1fVk9MX0JBTF9USFIgKDAuMDAwMDE2ZikKK3ZvaWQgTFZDX01peFNvZnRfMVN0X01DX2Zsb2F0X1NBVCAoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgTnJDaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICBDaE1hc2spCit7CisgICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7CisgICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgVGFyZ2V0X2xmZSA9IHtMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FUfTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgVGFyZ2V0X2N0ciA9IHtMVk1fTUFYRkxPQVQsIExWTV9NQVhGTE9BVCwgTFZNX01BWEZMT0FUfTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTEgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMiA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uUHJpdmF0ZVBhcmFtcyk7CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwTWl4UHJpdkluc3RbNF0gPSB7cEluc3RhbmNlMSwgcEluc3RhbmNlMiwgJlRhcmdldF9jdHIsICZUYXJnZXRfbGZlfTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZVtOckNoYW5uZWxzXTsKKworICAgIGlmIChhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKENoTWFzaykKKyAgICAgICAgICAgID09IEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fSU5ERVgpCisgICAgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlW2ldID0gcE1peFByaXZJbnN0W2ldOworICAgICAgICB9CisgICAgICAgIGZvciAoaW50IGkgPSAyOyBpIDwgTnJDaGFubmVsczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2VbaV0gPSBwTWl4UHJpdkluc3RbMl07CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLy8gVE9ETzogQ29tYmluZSB3aXRoIHN5c3RlbS9tZWRpYS9hdWRpb191dGlscy9CYWxhbmNlLmNwcAorICAgICAgICAvLyBDb25zdGFudHMgaW4gc3lzdGVtL21lZGlhL2F1ZGlvL2luY2x1ZGUvc3lzdGVtL2F1ZGlvLWJhc2UuaAorICAgICAgICAvLyAnbWl4SW5zdElkeCcgaXMgdXNlZCB0byBtYXAgdGhlIGFwcHJvcHJpYXRlIG1peGVyIGluc3RhbmNlIGZvciBlYWNoIGNoYW5uZWwuCisgICAgICAgIGNvbnN0IGludCBtaXhJbnN0SWR4W10gPSB7CisgICAgICAgICAgICAwLCAvLyBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUICAgICAgICAgICAgPSAweDF1LAorICAgICAgICAgICAgMSwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFQgICAgICAgICAgID0gMHgydSwKKyAgICAgICAgICAgIDIsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0NFTlRFUiAgICAgICAgICA9IDB4NHUsCisgICAgICAgICAgICAzLCAvLyBBVURJT19DSEFOTkVMX09VVF9MT1dfRlJFUVVFTkNZICAgICAgICAgPSAweDh1LAorICAgICAgICAgICAgMCwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfQkFDS19MRUZUICAgICAgICAgICAgID0gMHgxMHUsCisgICAgICAgICAgICAxLCAvLyBBVURJT19DSEFOTkVMX09VVF9CQUNLX1JJR0hUICAgICAgICAgICAgPSAweDIwdSwKKyAgICAgICAgICAgIDAsIC8vIEFVRElPX0NIQU5ORUxfT1VUX0ZST05UX0xFRlRfT0ZfQ0VOVEVSICA9IDB4NDB1LAorICAgICAgICAgICAgMSwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfRlJPTlRfUklHSFRfT0ZfQ0VOVEVSID0gMHg4MHUsCisgICAgICAgICAgICAyLCAvLyBBVURJT19DSEFOTkVMX09VVF9CQUNLX0NFTlRFUiAgICAgICAgICAgPSAweDEwMHUsCisgICAgICAgICAgICAwLCAvLyBBVURJT19DSEFOTkVMX09VVF9TSURFX0xFRlQgICAgICAgICAgICAgPSAweDIwMHUsCisgICAgICAgICAgICAxLCAvLyBBVURJT19DSEFOTkVMX09VVF9TSURFX1JJR0hUICAgICAgICAgICAgPSAweDQwMHUsCisgICAgICAgICAgICAyLCAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfQ0VOVEVSICAgICAgICAgICAgPSAweDgwMHUsCisgICAgICAgICAgICAwLCAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfRlJPTlRfTEVGVCAgICAgICAgPSAweDEwMDB1LAorICAgICAgICAgICAgMiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0ZST05UX0NFTlRFUiAgICAgID0gMHgyMDAwdSwKKyAgICAgICAgICAgIDEsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9GUk9OVF9SSUdIVCAgICAgICA9IDB4NDAwMHUsCisgICAgICAgICAgICAwLCAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19MRUZUICAgICAgICAgPSAweDgwMDB1LAorICAgICAgICAgICAgMiwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfQ0VOVEVSICAgICAgID0gMHgxMDAwMHUsCisgICAgICAgICAgICAxLCAvLyBBVURJT19DSEFOTkVMX09VVF9UT1BfQkFDS19SSUdIVCAgICAgICAgPSAweDIwMDAwdSwKKyAgICAgICAgICAgIDAsIC8vIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9TSURFX0xFRlQgICAgICAgICA9IDB4NDAwMDB1LAorICAgICAgICAgICAgMSwgLy8gQVVESU9fQ0hBTk5FTF9PVVRfVE9QX1NJREVfUklHSFQgICAgICAgID0gMHg4MDAwMHUKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKHBJbnN0YW5jZTEtPlRhcmdldCA8PSBMVk1fVk9MX0JBTF9USFIgfHwKKyAgICAgICAgICAgIHBJbnN0YW5jZTItPlRhcmdldCA8PSBMVk1fVk9MX0JBTF9USFIpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRhcmdldF9jdHIuVGFyZ2V0ICA9IDAuMGY7CisgICAgICAgICAgICBUYXJnZXRfY3RyLkN1cnJlbnQgPSAwLjBmOworICAgICAgICAgICAgVGFyZ2V0X2N0ci5EZWx0YSAgID0gMC4wZjsKKyAgICAgICAgfQorICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgaWR4QXJyU2l6ZSA9IEFSUkFZX1NJWkUobWl4SW5zdElkeCk7CisgICAgICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBjaGFubmVsID0gQ2hNYXNrOyBjaGFubmVsICE9MCA7ICsraSkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgaW50IGlkeCA9IF9fYnVpbHRpbl9jdHooY2hhbm5lbCk7CisgICAgICAgICAgICBpZiAoaWR4IDwgaWR4QXJyU2l6ZSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2VbaV0gPSBwTWl4UHJpdkluc3RbbWl4SW5zdElkeFtpZHhdXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2VbaV0gPSBwTWl4UHJpdkluc3RbMl07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFubmVsICY9IH4oMSA8PCBpZHgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKE5yRnJhbWVzIDw9IDApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgIT0gcEluc3RhbmNlMS0+VGFyZ2V0KSB8fAorICAgICAgICAocEluc3RhbmNlMi0+Q3VycmVudCAhPSBwSW5zdGFuY2UyLT5UYXJnZXQpKQorICAgIHsKKyAgICAgICAgLy8gVE9ETzogY29tYmluZSBzaW1pbGFyIGNoZWNrcyBiZWxvdy4KKyAgICAgICAgaWYgKHBJbnN0YW5jZTEtPkRlbHRhID09IExWTV9NQVhGTE9BVAorICAgICAgICAgICAgICAgIHx8IEFic19GbG9hdChwSW5zdGFuY2UxLT5DdXJyZW50IC0gcEluc3RhbmNlMS0+VGFyZ2V0KSA8IHBJbnN0YW5jZTEtPkRlbHRhKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBwSW5zdGFuY2UxLT5DdXJyZW50ID0gcEluc3RhbmNlMS0+VGFyZ2V0OworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTEtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCisgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoSGFyZE1peGluZyA9PSBUUlVFKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocEluc3RhbmNlMi0+RGVsdGEgPT0gTFZNX01BWEZMT0FUCisgICAgICAgICAgICAgICAgICAgIHx8IEFic19GbG9hdChwSW5zdGFuY2UyLT5DdXJyZW50IC0gcEluc3RhbmNlMi0+VGFyZ2V0KSA8IHBJbnN0YW5jZTItPkRlbHRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UyLT5DdXJyZW50ID0gcEluc3RhbmNlMi0+VGFyZ2V0OworICAgICAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UyLT5UYXJnZXQ7CisgICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksIFRhcmdldEdhaW4pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCisgICAgICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKEhhcmRNaXhpbmcgPT0gRkFMU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgICBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9NQ19mbG9hdF9XUkEgKCZwSW5zdGFuY2VbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZyA9PSBUUlVFKQorICAgIHsKKyAgICAgICAgaWYgKChwSW5zdGFuY2UxLT5UYXJnZXQgPT0gTFZNX01BWEZMT0FUKSAmJiAocEluc3RhbmNlMi0+VGFyZ2V0ID09IExWTV9NQVhGTE9BVCkpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChzcmMgIT0gZHN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvcHlfRmxvYXQoc3JjLCBkc3QsIE5yRnJhbWVzKk5yQ2hhbm5lbHMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8xU3RfTUNfZmxvYXRfU0FUKCYocEluc3RhbmNlWzBdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCkKKyAgICB7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlMS0+Q3VycmVudCAtIHBJbnN0YW5jZTEtPlRhcmdldCkgPCBwSW5zdGFuY2UxLT5EZWx0YSkKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlMS0+Q3VycmVudCA9IHBJbnN0YW5jZTEtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTEtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSAoXAorICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCkKKyAgICB7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlMi0+Q3VycmVudCAtIHBJbnN0YW5jZTItPlRhcmdldCkgPCBwSW5zdGFuY2UyLT5EZWx0YSkKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlMi0+Q3VycmVudCA9IHBJbnN0YW5jZTItPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UyLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sIFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjaykgKFwKKyAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorI2VuZGlmCit2b2lkIExWQ19NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKQoreworICAgIGNoYXIgICAgICAgIEhhcmRNaXhpbmcgPSBUUlVFOworICAgIExWTV9GTE9BVCAgIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UxID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLlByaXZhdGVQYXJhbXMpOworCisgICAgaWYobiA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCAhPSBwSW5zdGFuY2UxLT5UYXJnZXQpIHx8IChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UxLT5EZWx0YSA9PSAxLjBmKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UxLT5DdXJyZW50ID0gcEluc3RhbmNlMS0+VGFyZ2V0OworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTEtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlMS0+Q3VycmVudCAtIHBJbnN0YW5jZTEtPlRhcmdldCkgPCBwSW5zdGFuY2UxLT5EZWx0YSkKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlMS0+Q3VycmVudCA9IHBJbnN0YW5jZTEtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTEtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCisgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgIH0KKworICAgICAgICBpZihIYXJkTWl4aW5nID09IFRSVUUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBJbnN0YW5jZTItPkRlbHRhID09IDEuMGYpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlMi0+Q3VycmVudCA9IHBJbnN0YW5jZTItPlRhcmdldDsKKyAgICAgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMi0+VGFyZ2V0OworICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKEFic19GbG9hdChwSW5zdGFuY2UyLT5DdXJyZW50IC0gcEluc3RhbmNlMi0+VGFyZ2V0KSA8IHBJbnN0YW5jZTItPkRlbHRhKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBJbnN0YW5jZTItPkN1cnJlbnQgPSBwSW5zdGFuY2UyLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZTItPlRhcmdldDsKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihIYXJkTWl4aW5nID09IEZBTFNFKQorICAgICAgICB7CisgICAgICAgICAgICAgTFZDX0NvcmVfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1dSQSggJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpCisgICAgeworICAgICAgICBpZiAoKHBJbnN0YW5jZTEtPlRhcmdldCA9PSAxLjBmKSAmJiAocEluc3RhbmNlMi0+VGFyZ2V0ID09IDEuMGYpKQorICAgICAgICB7CisgICAgICAgICAgICBpZihzcmMgIT0gZHN0KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvcHlfRmxvYXQoc3JjLCBkc3QsIG4pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjLCBkc3QsIG4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0KQorICAgIHsKKyAgICAgICAgaWYgKEFic19GbG9hdChwSW5zdGFuY2UxLT5DdXJyZW50IC0gcEluc3RhbmNlMS0+VGFyZ2V0KSA8IHBJbnN0YW5jZTEtPkRlbHRhKQorICAgICAgICB7CisgICAgICAgICAgICBwSW5zdGFuY2UxLT5DdXJyZW50ID0gcEluc3RhbmNlMS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2spICggXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQpCisgICAgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZTItPkN1cnJlbnQgLSBwSW5zdGFuY2UyLT5UYXJnZXQpIDwgcEluc3RhbmNlMi0+RGVsdGEpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZTItPkN1cnJlbnQgPSBwSW5zdGFuY2UyLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlMi0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2sgIT0gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAoKnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbEJhY2spICgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwMTdkZTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQuYworKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgSU5DTFVERSBGSUxFUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKLSNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBERUZJTklUSU9OUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgVFJVRSAgICAgICAgICAxCi0jZGVmaW5lIEZBTFNFICAgICAgICAgMAotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gTFZNaXhlcjNfTUlYU09GVF8xU1RfRDE2QzMxX1NBVAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcHRySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIG4pCi17Ci0gICAgY2hhciAgICAgICAgSGFyZE1peGluZyA9IFRSVUU7Ci0gICAgTFZNX0ZMT0FUICAgVGFyZ2V0R2FpbjsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKLQotICAgIGlmKG4gPD0gMCkgICAgcmV0dXJuOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgIFNPRlQgTUlYSU5HCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQotICAgIHsKLSAgICAgICAgaWYocEluc3RhbmNlLT5EZWx0YSA9PSAxLjBmKXsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OwotICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OwotICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOwotICAgICAgICB9ZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpewotICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCi0gICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KLSAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKLSAgICAgICAgICAgIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBzcmMsIGRzdCwgbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgSEFSRCBNSVhJTkcKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgaWYgKEhhcmRNaXhpbmcpewotICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPT0gMCkKLSAgICAgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLjAsIGRzdCwgbik7Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgIT0gMS4wZikKLSAgICAgICAgICAgICAgICBNdWx0M3NfRmxvYXQoc3JjLCAocEluc3RhbmNlLT5UYXJnZXQpLCBkc3QsIG4pOwotICAgICAgICAgICAgZWxzZSBpZihzcmMgIT0gZHN0KQotICAgICAgICAgICAgICAgIENvcHlfRmxvYXQoc3JjLCBkc3QsIG4pOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgQ0FMTCBCQUNLCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpewotICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpewotICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCi0gICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSwgVGFyZ2V0R2Fpbik7Ci0gICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgPSBGQUxTRTsKLSAgICAgICAgICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrICE9IDApewotICAgICAgICAgICAgICAgICgqcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjaykgKCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0jZWxzZQotdm9pZCBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbikKLXsKLSAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKLSAgICBMVk1fSU5UMzIgICBUYXJnZXRHYWluOwotICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7Ci0KLSAgICBpZihuPD0wKSAgICByZXR1cm47Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgU09GVCBNSVhJTkcKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCi0gICAgewotICAgICAgICBpZihwSW5zdGFuY2UtPkRlbHRhID09IDB4N0ZGRkZGRkYpewotICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7Ci0gICAgICAgICAgICBUYXJnZXRHYWluPXBJbnN0YW5jZS0+VGFyZ2V0Pj4oMTYtcEluc3RhbmNlLT5TaGlmdCk7ICAvLyBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQKLSAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLFRhcmdldEdhaW4pOwotICAgICAgICB9ZWxzZSBpZiAoQWJzXzMyKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKXsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiAgTWFrZSB0aGVtIGVxdWFsLiAqLwotICAgICAgICAgICAgVGFyZ2V0R2Fpbj1wSW5zdGFuY2UtPlRhcmdldD4+KDE2LXBJbnN0YW5jZS0+U2hpZnQpOyAgLy8gVGFyZ2V0R2FpbiBpbiBRMTYuMTUgZm9ybWF0Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSxUYXJnZXRHYWluKTsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLwotICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOwotICAgICAgICAgICAgaWYocEluc3RhbmNlLT5TaGlmdCE9MCl7Ci0gICAgICAgICAgICAgICAgU2hpZnRfU2F0X3YxNnh2MTYgKChMVk1fSU5UMTYpcEluc3RhbmNlLT5TaGlmdCxzcmMsZHN0LG4pOwotICAgICAgICAgICAgICAgIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoICYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgZHN0LCBkc3QsIG4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoICYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgc3JjLCBkc3QsIG4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgIEhBUkQgTUlYSU5HCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGlmIChIYXJkTWl4aW5nKXsKLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ID09IDApCi0gICAgICAgICAgICBMb2FkQ29uc3RfMTYoMCwgZHN0LCBuKTsKLSAgICAgICAgZWxzZSBpZihwSW5zdGFuY2UtPlNoaWZ0IT0wKXsKLSAgICAgICAgICAgIFNoaWZ0X1NhdF92MTZ4djE2ICgoTFZNX0lOVDE2KXBJbnN0YW5jZS0+U2hpZnQsc3JjLGRzdCxuKTsKLSAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQ+PjE2KSAhPSAweDdGRkYpCi0gICAgICAgICAgICAgICAgTXVsdDNzXzE2eDE2KCBkc3QsIChMVk1fSU5UMTYpKHBJbnN0YW5jZS0+VGFyZ2V0Pj4xNiksIGRzdCwgbiApOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgewotICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldD4+MTYpICE9IDB4N0ZGRikKLSAgICAgICAgICAgICAgICBNdWx0M3NfMTZ4MTYoIHNyYywgKExWTV9JTlQxNikocEluc3RhbmNlLT5UYXJnZXQ+PjE2KSwgZHN0LCBuICk7Ci0gICAgICAgICAgICBlbHNlIGlmKHNyYyE9ZHN0KQotICAgICAgICAgICAgICAgIENvcHlfMTYoc3JjLCBkc3QsIG4pOwotICAgICAgICB9Ci0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgQ0FMTCBCQUNLCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGlmIChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQpewotICAgICAgICBpZiAoQWJzXzMyKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCkgPCBwSW5zdGFuY2UtPkRlbHRhKXsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiAgTWFrZSB0aGVtIGVxdWFsLiAqLwotICAgICAgICAgICAgVGFyZ2V0R2Fpbj1wSW5zdGFuY2UtPlRhcmdldD4+KDE2LXBJbnN0YW5jZS0+U2hpZnQpOyAgLy8gVGFyZ2V0R2FpbiBpbiBRMTYuMTUgZm9ybWF0Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbSxUYXJnZXRHYWluKTsKLSAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCl7Ci0gICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSAoIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UscHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLSNlbmRpZi8qQlVJTERfRkxPQVQqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQyMjlkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FULmNwcApAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgREVGSU5JVElPTlMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFRSVUUgICAgICAgICAgMQorI2RlZmluZSBGQUxTRSAgICAgICAgIDAKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIExWTWl4ZXIzX01JWFNPRlRfMVNUX0QxNkMzMV9TQVQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbikKK3sKKyAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworCisgICAgaWYobiA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UtPkRlbHRhID09IDEuMGYpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBUYXJnZXRHYWluID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCYocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgVGFyZ2V0R2Fpbik7CisgICAgICAgIH1lbHNlIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLCBUYXJnZXRHYWluKTsKKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAoSGFyZE1peGluZyl7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCA9PSAwKQorICAgICAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAuMCwgZHN0LCBuKTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSAhPSAxLjBmKQorICAgICAgICAgICAgICAgIE11bHQzc19GbG9hdChzcmMsIChwSW5zdGFuY2UtPlRhcmdldCksIGRzdCwgbik7CisgICAgICAgICAgICBlbHNlIGlmKHNyYyAhPSBkc3QpCisgICAgICAgICAgICAgICAgQ29weV9GbG9hdChzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCl7CisgICAgICAgIGlmIChBYnNfRmxvYXQocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQpIDwgcEluc3RhbmNlLT5EZWx0YSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtLCBUYXJnZXRHYWluKTsKKyAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCA9IEZBTFNFOworICAgICAgICAgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgIT0gMCl7CisgICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSAoIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrUGFyYW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogRlVOQ1RJT046ICAgICAgIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQKKyAqCisgKiBERVNDUklQVElPTjoKKyAqICBNaXhlciBmdW5jdGlvbiB3aXRoIHN1cHBvcnQgZm9yIHByb2Nlc3NpbmcgbXVsdGljaGFubmVsIGlucHV0CisgKgorICogUEFSQU1FVEVSUzoKKyAqICBwdHJJbnN0YW5jZSAgICBJbnN0YW5jZSBwb2ludGVyCisgKiAgc3JjICAgICAgICAgICAgU291cmNlCisgKiAgZHN0ICAgICAgICAgICAgRGVzdGluYXRpb24KKyAqICBOckZyYW1lcyAgICAgICBOdW1iZXIgb2YgRnJhbWVzCisgKiAgTnJDaGFubmVscyAgICAgTnVtYmVyIG9mIGNoYW5uZWxzCisgKgorICogUkVUVVJOUzoKKyAqICB2b2lkCisgKgorICovCit2b2lkIExWQ19NaXhTb2Z0X01jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgTnJDaGFubmVscykKK3sKKyAgICBjaGFyICAgICAgICBIYXJkTWl4aW5nID0gVFJVRTsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXRHYWluOworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlID0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOworCisgICAgaWYgKE5yRnJhbWVzIDw9IDApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkKKyAgICB7CisgICAgICAgIGlmIChwSW5zdGFuY2UtPkRlbHRhID09IDEuMGYpIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOworICAgICAgICB9ZWxzZSBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksIFRhcmdldEdhaW4pOworICAgICAgICB9ZWxzZXsKKyAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCisgICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7CisgICAgICAgICAgICBMVkNfQ29yZV9NaXhTb2Z0X01jX0QxNkMzMV9XUkEoJihwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJDaGFubmVscyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpIHsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ID09IDApCisgICAgICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMC4wLCBkc3QsIE5yRnJhbWVzICogTnJDaGFubmVscyk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgIT0gMS4wZikKKyAgICAgICAgICAgICAgICBNdWx0M3NfRmxvYXQoc3JjLCAocEluc3RhbmNlLT5UYXJnZXQpLCBkc3QsIE5yRnJhbWVzICogTnJDaGFubmVscyk7CisgICAgICAgICAgICBlbHNlIGlmIChzcmMgIT0gZHN0KQorICAgICAgICAgICAgICAgIENvcHlfRmxvYXQoc3JjLCBkc3QsIE5yRnJhbWVzICogTnJDaGFubmVscyk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDQUxMIEJBQ0sKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCkgeworICAgICAgICBpZiAoQWJzX0Zsb2F0KHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0KSA8IHBJbnN0YW5jZS0+RGVsdGEpIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLworICAgICAgICAgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OworICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldChwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW0sIFRhcmdldEdhaW4pOworICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAhPSAwKSB7CisgICAgICAgICAgICAgICAgKCpwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrKSAoXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5wR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKyNlbmRpZgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzkwMDcxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREUgRklMRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBGVU5DVElPTiBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVC5jCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0ZMT0FUICAgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpzcmMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgbikKLXsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTEgPSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0uUHJpdmF0ZVBhcmFtcyk7Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UyID0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLlByaXZhdGVQYXJhbXMpOwotCi0gICAgaWYobiA8PSAwKSAgICByZXR1cm47Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgU09GVCBNSVhJTkcKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCA9PSBwSW5zdGFuY2UxLT5UYXJnZXQpICYmIChwSW5zdGFuY2UxLT5DdXJyZW50ID09IDApKXsKLSAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgbik7Ci0gICAgfQotICAgIGVsc2UgaWYgKChwSW5zdGFuY2UyLT5DdXJyZW50ID09IHBJbnN0YW5jZTItPlRhcmdldCkgJiYgKHBJbnN0YW5jZTItPkN1cnJlbnQgPT0gMCkpewotICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgZHN0LCBuKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgIT0gcEluc3RhbmNlMS0+VGFyZ2V0KSB8fCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlMi0+Q3VycmVudCAhPSBwSW5zdGFuY2UyLT5UYXJnZXQpKQotICAgIHsKLSAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMSwgZHN0LCBuKTsKLSAgICAgICAgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBuKTsKLSAgICB9Ci0gICAgZWxzZXsKLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICBIQVJEIE1JWElORwotICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICBMVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FUKCAmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBzcmMyLCBkc3QsIG4pOwotICAgIH0KLX0KLSNlbHNlCi12b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3Rfc3QgKnB0ckluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fSU5UMTYgICAgICAgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAqc3JjMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKQotewotICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlMT0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLlByaXZhdGVQYXJhbXMpOwotICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlMj0oTWl4X1ByaXZhdGVfc3QgKikocHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLlByaXZhdGVQYXJhbXMpOwotCi0gICAgaWYobjw9MCkgICAgcmV0dXJuOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgIFNPRlQgTUlYSU5HCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgPT0gcEluc3RhbmNlMS0+VGFyZ2V0KSYmKHBJbnN0YW5jZTEtPkN1cnJlbnQgPT0gMCkpewotICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCggKExWTWl4ZXIzXzFTdF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwgc3JjMiwgZHN0LCBuKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKHBJbnN0YW5jZTItPkN1cnJlbnQgPT0gcEluc3RhbmNlMi0+VGFyZ2V0KSYmKHBJbnN0YW5jZTItPkN1cnJlbnQgPT0gMCkpewotICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCggKExWTWl4ZXIzXzFTdF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgc3JjMSwgZHN0LCBuKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgIT0gcEluc3RhbmNlMS0+VGFyZ2V0KSB8fCAocEluc3RhbmNlMi0+Q3VycmVudCAhPSBwSW5zdGFuY2UyLT5UYXJnZXQpKQotICAgIHsKLSAgICAgICAgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdKSwgc3JjMSwgZHN0LCBuKTsKLSAgICAgICAgTFZDX01peEluU29mdF9EMTZDMzFfU0FUKCAoTFZNaXhlcjNfMVN0X3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLCBzcmMyLCBkc3QsIG4pOwotICAgIH0KLSAgICBlbHNlewotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgIEhBUkQgTUlYSU5HCi0gICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIGlmKHBJbnN0YW5jZTItPlNoaWZ0IT0wKQotICAgICAgICAgICAgU2hpZnRfU2F0X3YxNnh2MTYgKChMVk1fSU5UMTYpcEluc3RhbmNlMi0+U2hpZnQsc3JjMixzcmMyLG4pOwotICAgICAgICBpZihwSW5zdGFuY2UxLT5TaGlmdCE9MCkKLSAgICAgICAgewotICAgICAgICAgICAgU2hpZnRfU2F0X3YxNnh2MTYgKChMVk1fSU5UMTYpcEluc3RhbmNlMS0+U2hpZnQsc3JjMSxkc3Qsbik7Ci0gICAgICAgICAgICBMVkNfQ29yZV9NaXhIYXJkXzJTdF9EMTZDMzFfU0FUKCAmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzBdLCAmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLCBkc3QsIHNyYzIsIGRzdCwgbik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICAgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwgJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSwgc3JjMSwgc3JjMiwgZHN0LCBuKTsKLSAgICB9Ci19Ci0jZW5kaWYgLypCVUlMRF9GTE9BVCovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGFiNzlkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQuY3BwCkBAIC0wLDAgKzEsMTMzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FULmMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBuKQoreworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uUHJpdmF0ZVBhcmFtcyk7CisKKyAgICBpZihuIDw9IDApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKChwSW5zdGFuY2UxLT5DdXJyZW50ID09IHBJbnN0YW5jZTEtPlRhcmdldCkgJiYgKHBJbnN0YW5jZTEtPkN1cnJlbnQgPT0gMCkpeworICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBuKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHBJbnN0YW5jZTItPkN1cnJlbnQgPT0gcEluc3RhbmNlMi0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMi0+Q3VycmVudCA9PSAwKSl7CisgICAgICAgIExWQ19NaXhTb2Z0XzFTdF9EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIG4pOworICAgIH0KKyAgICBlbHNlIGlmICgocEluc3RhbmNlMS0+Q3VycmVudCAhPSBwSW5zdGFuY2UxLT5UYXJnZXQpIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UyLT5DdXJyZW50ICE9IHBJbnN0YW5jZTItPlRhcmdldCkpCisgICAgeworICAgICAgICBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIG4pOworICAgICAgICBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqKSgmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIG4pOworICAgIH0KKyAgICBlbHNleworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgIEhBUkQgTUlYSU5HCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIHNyYzIsIGRzdCwgbik7CisgICAgfQorfQorCisjaWZkZWYgU1VQUE9SVF9NQworLyoKKyAqIEZVTkNUSU9OOiAgICAgICBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVAorICoKKyAqIERFU0NSSVBUSU9OOgorICogIDIgc3RyZWFtIE1peGVyIGZ1bmN0aW9uIHdpdGggc3VwcG9ydCBmb3IgcHJvY2Vzc2luZyBtdWx0aWNoYW5uZWwgaW5wdXQKKyAqCisgKiBQQVJBTUVURVJTOgorICogIHB0ckluc3RhbmNlICAgIEluc3RhbmNlIHBvaW50ZXIKKyAqICBzcmMxICAgICAgICAgICBGaXJzdCBtdWx0aWNoYW5uZWwgc291cmNlCisgKiAgc3JjMiAgICAgICAgICAgU2Vjb25kIG11bHRpY2hhbm5lbCBzb3VyY2UKKyAqICBkc3QgICAgICAgICAgICBEZXN0aW5hdGlvbgorICogIE5yRnJhbWVzICAgICAgIE51bWJlciBvZiBmcmFtZXMKKyAqICBOckNoYW5uZWxzICAgICBOdW1iZXIgb2YgY2hhbm5lbHMKKyAqCisgKiBSRVRVUk5TOgorICogIHZvaWQKKyAqCisgKi8KK3ZvaWQgTFZDX01peFNvZnRfMk1jX0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckNoYW5uZWxzKQoreworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICAqcEluc3RhbmNlMSA9IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopKHB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXS5Qcml2YXRlUGFyYW1zKTsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZTIgPSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKShwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMV0uUHJpdmF0ZVBhcmFtcyk7CisKKyAgICBpZiAoTnJGcmFtZXMgPD0gMCkgICAgcmV0dXJuOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFNPRlQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgPT0gcEluc3RhbmNlMS0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMS0+Q3VycmVudCA9PSAwKSkgeworICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHBJbnN0YW5jZTItPkN1cnJlbnQgPT0gcEluc3RhbmNlMi0+VGFyZ2V0KSAmJiAocEluc3RhbmNlMi0+Q3VycmVudCA9PSAwKSkgeworICAgICAgICBMVkNfTWl4U29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKHBJbnN0YW5jZTEtPkN1cnJlbnQgIT0gcEluc3RhbmNlMS0+VGFyZ2V0KSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlMi0+Q3VycmVudCAhPSBwSW5zdGFuY2UyLT5UYXJnZXQpKQorICAgIHsKKyAgICAgICAgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVCgoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICopKCZwdHJJbnN0YW5jZS0+TWl4ZXJTdHJlYW1bMF0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMxLCBkc3QsIE5yRnJhbWVzLCBOckNoYW5uZWxzKTsKKyAgICAgICAgTFZDX01peEluU29mdF9NY19EMTZDMzFfU0FUKChMVk1peGVyM18xU3RfRkxPQVRfc3QgKikoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVsxXSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgTnJGcmFtZXMsIE5yQ2hhbm5lbHMpOworICAgIH0KKyAgICBlbHNleworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgIEhBUkQgTUlYSU5HCisgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoJnB0ckluc3RhbmNlLT5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRySW5zdGFuY2UtPk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzEsIHNyYzIsIGRzdCwgTnJGcmFtZXMgKiBOckNoYW5uZWxzKTsKKyAgICB9Cit9CisjZW5kaWYKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXIuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oCmluZGV4IGY5MDQ5MTUuLmNlNDJkMmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlci5oCkBAIC0xOCwxMiArMTgsNiBAQAogI2lmbmRlZiBfX0xWQ19NSVhFUl9IX18KICNkZWZpbmUgX19MVkNfTUlYRVJfSF9fCiAKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KICNpbmNsdWRlICJMVk1fVHlwZXMuaCIKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQEAgLTMxLDcgKzI1LDYgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKiBMVk1peGVyM19zdCBzdHJ1Y3R1cmUgc3RvcmVzIEluc3RhbmNlIHBhcmFtZXRlcnMgZm9yIG9uZSBhdWRpbyBzdHJlYW0gKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fRkxPQVQgICAgICAgUHJpdmF0ZVBhcmFtc1szXTsgICAvKiBQcml2YXRlIEluc3RhbmNlIHBhcmFtcyBmb3IgXApAQCAtNDMsNDUgKzM2LDE0IEBACiAgICAgdm9pZCAgICAgICAgICAgICpwR2VuZXJhbFB1cnBvc2U7ICAgLyogUG9pbnRlciBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzYWdlICovCiAgICAgTFZNX0NhbGxiYWNrICAgIHBDYWxsQmFjazsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KIH0gTFZNaXhlcjNfRkxPQVRfc3Q7Ci0jZWxzZQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1fSU5UMzIgICAgICAgUHJpdmF0ZVBhcmFtc1s0XTsgICAvKiBQcml2YXRlIEluc3RhbmNlIHBhcmFtcyBmb3IgQXVkaW8gU3RyZWFtICovCi0gICAgTFZNX0lOVDE2ICAgICAgIENhbGxiYWNrU2V0OyAgICAgICAgLyogQm9vbGVhbi4gIFNob3VsZCBiZSBzZXQgYnkgY2FsbGluZyBhcHBsaWNhdGlvbiBlYWNoIHRpbWUgdGhlIHRhcmdldCB2YWx1ZSBpcyB1cGRhdGVkICovCi0gICAgTFZNX0lOVDE2ICAgICAgIENhbGxiYWNrUGFyYW07ICAgICAgLyogUGFyYW1ldGVyIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZSBjYWxiYWNrIGZ1bmN0aW9uICovCi0gICAgdm9pZCAgICAgICAgICAgICpwQ2FsbGJhY2tIYW5kbGU7ICAgLyogUG9pbnRlciB0byB0aGUgaW5zdGFuY2Ugb2YgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCi0gICAgdm9pZCAgICAgICAgICAgICpwR2VuZXJhbFB1cnBvc2U7ICAgLyogUG9pbnRlciBmb3IgZ2VuZXJhbCBwdXJwb3NlIHVzYWdlICovCi0gICAgTFZNX0NhbGxiYWNrICAgIHBDYWxsQmFjazsgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24gKi8KLX0gTFZNaXhlcjNfc3Q7Ci0jZW5kaWYKLSNpZmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgTWl4ZXJTdHJlYW1bMV07ICAgIC8qIEluc3RhbmNlIFBhcmFtcyBmb3Igb25lIEF1ZGlvIFN0cmVhbSAqLwogfSBMVk1peGVyM18xU3RfRkxPQVRfc3Q7Ci0jZWxzZQotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1peGVyM19zdCAgICAgTWl4ZXJTdHJlYW1bMV07ICAgIC8qIEluc3RhbmNlIFBhcmFtcyBmb3Igb25lIEF1ZGlvIFN0cmVhbSAqLwotfSBMVk1peGVyM18xU3Rfc3Q7Ci0jZW5kaWYKLSNpZmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgTWl4ZXJTdHJlYW1bMl07ICAgIC8qIEluc3RhbmNlIFBhcmFtcyBmb3IgdHdvIEF1ZGlvIFN0cmVhbXMgKi8KIH0gTFZNaXhlcjNfMlN0X0ZMT0FUX3N0OwotI2Vsc2UKLXR5cGVkZWYgc3RydWN0Ci17Ci0gICAgTFZNaXhlcjNfc3QgICAgIE1peGVyU3RyZWFtWzJdOyAgICAvKiBJbnN0YW5jZSBQYXJhbXMgZm9yIHR3byBBdWRpbyBTdHJlYW1zICovCi19IExWTWl4ZXIzXzJTdF9zdDsKLSNlbmRpZgotI2lmbmRlZiBCVUlMRF9GTE9BVAotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICBMVk1peGVyM19zdCAgICAgTWl4ZXJTdHJlYW1bM107ICAgIC8qIEluc3RhbmNlIFBhcmFtcyBmb3IgdGhyZWUgQXVkaW8gU3RyZWFtcyAqLwotfSBMVk1peGVyM18zU3Rfc3Q7Ci0jZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBGVU5DVElPTiBQUk9UT1RZUEVTIChISUdIIExFVkVMIEZVTkNUSU9OUykKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTIsNyArNTQsNiBAQAogI2RlZmluZSAgICBMVk1peGVyM19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUICAgTFZNaXhlcjNfMlN0X0QxNkMzMV9TQVRfTWl4U29mdAogI2RlZmluZSAgICBMVk1peGVyM19NaXhTb2Z0XzNTdF9EMTZDMzFfU0FUICAgTFZNaXhlcjNfM1N0X0QxNkMzMV9TQVRfTWl4U29mdAogCi0KIC8qKiogR2VuZXJhbCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTEwMSw5NyArNjIsNjQgQEAKIC8qIHRoZW4gdGhlIGNhbGN1bGF0aW9uIHdpbGwgZ2l2ZSBhbiBpbmNvcnJlY3QgdmFsdWUgZm9yIGFscGhhLCBzZWUgdGhlIG1peGVyICAgICAqLwogLyogZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAogdm9pZCBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICBUYXJnZXRHYWluKTsKLSNlbHNlCi12b2lkIExWQ19NaXhlcl9TZXRUYXJnZXQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRhcmdldEdhaW4pOwotI2VuZGlmCi0jaWZkZWYgQlVJTERfRkxPQVQKIExWTV9GTE9BVCBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSk7Ci0jZWxzZQotTFZNX0lOVDMyIExWQ19NaXhlcl9HZXRUYXJnZXQoIExWTWl4ZXIzX3N0ICpwU3RyZWFtKTsKLSNlbmRpZgogCi0jaWZkZWYgQlVJTERfRkxPQVQKIExWTV9GTE9BVCBMVkNfTWl4ZXJfR2V0Q3VycmVudCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0pOwotI2Vsc2UKLUxWTV9JTlQzMiBMVkNfTWl4ZXJfR2V0Q3VycmVudCggTFZNaXhlcjNfc3QgKnBTdHJlYW0pOwotI2VuZGlmCiAKLSNpZmRlZiBCVUlMRF9GTE9BVAogdm9pZCBMVkNfTWl4ZXJfSW5pdCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIFRhcmdldEdhaW4sCiAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIEN1cnJlbnRHYWluKTsKLSNlbHNlCi12b2lkIExWQ19NaXhlcl9Jbml0KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUYXJnZXRHYWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIEN1cnJlbnRHYWluKTsKLSNlbmRpZgogCi0jaWZkZWYgQlVJTERfRkxPQVQKIHZvaWQgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpOwotI2Vsc2UKLXZvaWQgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCggTFZNaXhlcjNfc3QgKnBTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpOwotI2VuZGlmCiAKLSNpZmRlZiBCVUlMRF9GTE9BVAogdm9pZCBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyk7Ci0jZWxzZQotdm9pZCBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscyk7Ci0jZW5kaWYKIAogLyoqKiAxNiBiaXQgZnVuY3Rpb25zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVkNfTWl4U29mdF8xU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIG4pOwotI2Vsc2UKLXZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsKK3ZvaWQgTFZDX01peFNvZnRfMVN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIG4pOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgTFZDX01peFNvZnRfTWNfRDE2QzMxX1NBVChMVk1peGVyM18xU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIE5yQ2hhbm5lbHMpOwogI2VuZGlmCiAKLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsKLSNlbHNlCi12b2lkIExWQ19NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfMVN0X3N0ICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIG4pOwordm9pZCBMVkNfTWl4SW5Tb2Z0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMVN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIG4pOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgTFZDX01peEluU29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzXzFTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICBOckNoYW5uZWxzKTsKICNlbmRpZgogCi0jaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpzcmMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpkc3QsICAvKiBkc3QgY2Fubm90IGJlIGVxdWFsIHRvIHNyYzIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsKLSNlbHNlCi12b2lkIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCBMVk1peGVyM18yU3Rfc3QgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnNyYzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqZHN0LCAgLyogZHN0IGNhbm5vdCBiZSBlcXVhbCB0byBzcmMyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsKK3ZvaWQgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqc3JjMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKmRzdCwgIC8qIGRzdCBjYW5ub3QgYmUgZXF1YWwgdG8gc3JjMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgbik7CisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpzcmMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgLyogZHN0IGNhbm5vdCBiZSBlcXVhbCB0byBzcmMyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgIE5yQ2hhbm5lbHMpOwogI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEZvciBhcHBseWluZyBkaWZmZXJlbnQgZ2FpbnMgdG8gTGVmdCBhbmQgcmlnaHQgY2hlbm5hbHMgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTk5LDIwICsxMjcsMTggQEAKIC8qIE1peGVyU3RyZWFtWzFdIGFwcGxpZXMgdG8gUmlnaHQgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogR2FpbiB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYXQgMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X0ZMT0FUX3N0ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0ZMT0FUICAgICAgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqZHN0LCAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIG4pOyAgICAgLyogTnVtYmVyIG9mIHN0ZXJlbyBzYW1wbGVzICovCi0jZWxzZQotdm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfMlN0X3N0ICAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fSU5UMTYgICAgICAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqZHN0LCAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgTFZDX01peFNvZnRfMVN0X01DX2Zsb2F0X1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICAgIE5yQ2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICBDaE1hc2spOwogI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwordm9pZCBMVkNfTWl4U29mdF8xU3RfMmlfRDE2QzMxX1NBVChMVk1peGVyM18yU3RfRkxPQVRfc3QgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqZHN0LCAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICBuKTsgICAgIC8qIE51bWJlciBvZiBzdGVyZW8gc2FtcGxlcyAqLwogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldEN1cnJlbnQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRDdXJyZW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5OTA0MTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldEN1cnJlbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJMVk1fVHlwZXMuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0jaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgTFZNaXhlcjNfR2V0Q3VycmVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIEN1cnJlbnRHYWluIGluIFExNi4xNSBmb3JtYXQgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDdXJyZW50R2FpbiAgICAgIC0gQ3VycmVudEdhaW4gdmFsdWUgaW4gUSAxNi4xNSBmb3JtYXQgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotTFZNX0ZMT0FUIExWQ19NaXhlcl9HZXRDdXJyZW50KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSkKLXsKLSAgICBMVk1fRkxPQVQgICAgICAgQ3VycmVudEdhaW47Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOwotICAgIEN1cnJlbnRHYWluID0gcEluc3RhbmNlLT5DdXJyZW50OyAgLy8gQ3VycmVudEdhaW4KLSAgICByZXR1cm4gQ3VycmVudEdhaW47Ci19Ci0jZWxzZQotTFZNX0lOVDMyIExWQ19NaXhlcl9HZXRDdXJyZW50KCBMVk1peGVyM19zdCAqcFN0cmVhbSkKLXsKLSAgICBMVk1fSU5UMzIgICAgICAgQ3VycmVudEdhaW47Ci0gICAgTWl4X1ByaXZhdGVfc3QgICpwSW5zdGFuY2U9KE1peF9Qcml2YXRlX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKLSAgICBDdXJyZW50R2Fpbj1wSW5zdGFuY2UtPkN1cnJlbnQ+PigxNi1wSW5zdGFuY2UtPlNoaWZ0KTsgIC8vIEN1cnJlbnRHYWluIGluIFExNi4xNSBmb3JtYXQKLSAgICByZXR1cm4gQ3VycmVudEdhaW47Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRDdXJyZW50LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRDdXJyZW50LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGI1MGU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldEN1cnJlbnQuY3BwCkBAIC0wLDAgKzEsMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIExWTWl4ZXIzX0dldEN1cnJlbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBDdXJyZW50R2FpbiBpbiBRMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ3VycmVudEdhaW4gICAgICAtIEN1cnJlbnRHYWluIHZhbHVlIGluIFEgMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fRkxPQVQgTFZDX01peGVyX0dldEN1cnJlbnQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtKQoreworICAgIExWTV9GTE9BVCAgICAgICBDdXJyZW50R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7CisgICAgQ3VycmVudEdhaW4gPSBwSW5zdGFuY2UtPkN1cnJlbnQ7ICAvLyBDdXJyZW50R2FpbgorICAgIHJldHVybiBDdXJyZW50R2FpbjsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY3NDU1YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfR2V0VGFyZ2V0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiTFZNX1R5cGVzLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotI2luY2x1ZGUgIkxWQ19NaXhlcl9Qcml2YXRlLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBMVk1peGVyM19HZXRUYXJnZXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgVGFyZ2V0R2FpbiBpbiBRMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRhcmdldEdhaW4gICAgICAtIFRhcmdldEdhaW4gdmFsdWUgaW4gUSAxNi4xNSBmb3JtYXQgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi1MVk1fRkxPQVQgTFZDX01peGVyX0dldFRhcmdldCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0pCi17Ci0gICAgTFZNX0ZMT0FUICAgICAgIFRhcmdldEdhaW47Ci0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOwotICAgIAotICAgIFRhcmdldEdhaW4gPSBwSW5zdGFuY2UtPlRhcmdldDsgIC8vIFRhcmdldEdhaW4KLSAgICByZXR1cm4gVGFyZ2V0R2FpbjsKLX0KLSNlbHNlCi1MVk1fSU5UMzIgTFZDX01peGVyX0dldFRhcmdldCggTFZNaXhlcjNfc3QgKnBTdHJlYW0pCi17Ci0gICAgTFZNX0lOVDMyICAgICAgIFRhcmdldEdhaW47Ci0gICAgTWl4X1ByaXZhdGVfc3QgICpwSW5zdGFuY2U9KE1peF9Qcml2YXRlX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKLQotICAgIFRhcmdldEdhaW49cEluc3RhbmNlLT5UYXJnZXQ+PigxNi1wSW5zdGFuY2UtPlNoaWZ0KTsgIC8vIFRhcmdldEdhaW4gaW4gUTE2LjE1IGZvcm1hdAotCi0gICAgcmV0dXJuIFRhcmdldEdhaW47Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0dldFRhcmdldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FlNWJhNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9HZXRUYXJnZXQuY3BwCkBAIC0wLDAgKzEsNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisjaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIExWTWl4ZXIzX0dldFRhcmdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBUYXJnZXRHYWluIGluIFExNi4xNSBmb3JtYXQgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGFyZ2V0R2FpbiAgICAgIC0gVGFyZ2V0R2FpbiB2YWx1ZSBpbiBRIDE2LjE1IGZvcm1hdCAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fRkxPQVQgTFZDX01peGVyX0dldFRhcmdldCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0pCit7CisgICAgTFZNX0ZMT0FUICAgICAgIFRhcmdldEdhaW47CisgICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworCisgICAgVGFyZ2V0R2FpbiA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAgLy8gVGFyZ2V0R2FpbgorICAgIHJldHVybiBUYXJnZXRHYWluOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Jbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczN2UyNmIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJMVk1fVHlwZXMuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0jaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIExWTWl4ZXIzX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBpbnRpYWxpemF0aW9uIGZ1bmN0aW9uIGludGlhbGl6ZXMgdGhlIHByaXZhdGUgaW5zdGFuY2UgICAgICAgICAqLwotLyogIHBhcmFtdGVycyBmb3IgYSBnaXZlbiBBdWRpbyBTdHJlYW0gYmFzZWQgb24gVGFyZ2V0R2FpbiBhbmQgICAgICAgICAgKi8KLS8qICBDdXJyZW50R2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBjYWNsdWxhdGVzIHRoZSAiU2hpZnQiIHJlcXVpcmVkIHRvIHByb3ZpZGUgdGhlICAgICAgICAqLwotLyogIGludGVnZXIgcGFydCBvZiBUYXJnZXRHYWluIGFuZCBmcmFjdGlvbmFsIGdhaW4gdmFsdWVzICJUYXJnZXQiIGFuZCAgKi8KLS8qICAiQ3VycmVudCIgYmFzZWQgb24gbWF4aW11bShUYXJnZXRHYWluLEN1cnJlbnRHYWluKSAgICAgICAgICAgICAgICAgICovCi0vKiAgRS5nLiBDdXJyZW50R2Fpbj0xLjkgYW5kIFRhcmdldEdhaW49Mi41IHRoZW4gYmFzZWQgb24gICAgICAgICAgICAgICAqLwotLyogIE1heEdhaW4gb2YgMi41LCBTaGlmdCA9IDIsIEN1cnJlbnQ9MS45LzQ9MC40NzUsIFRhcmdldD0yLjUvND0wLjYyNSAgKi8KLS8qICBUaGVyZWZvcmUgaW50ZWdlciBnYWluIG9mIDQgaXMgcHJvdmlkZWQgYnkgTGVmdCBTaGlmdCBvZiAyIGFuZCAgICAgICovCi0vKiAgZnJhY3Rpb24gZ2FpbiBpcyBwcm92aWRlZCB0aHJvdWdoIEN1cnJlbnQ9MC40NzUgYW5kIFRhcmdldD0wLjYyNSAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU3RyZWFtICAgICAtIHB0ciB0byBJbnN0YW5jZSBQYXJhbWV0ZXIgU3RydWN0dXJlIExWTWl4ZXIzX3N0IGZvciBhbiovCi0vKiAgICAgICAgICAgICAgICBBdWRpbyBTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRhcmdldEdhaW4gIC0gVGFyZ2V0R2FpbiB2YWx1ZSBpbiBRIDE2LjE1IGZvcm1hdCAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDdXJyZW50R2FpbiAtIEN1cnJlbnRHYWluIHZhbHVlIGluIFEgMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVkNfTWl4ZXJfSW5pdCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIFRhcmdldEdhaW4sCi0gICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIEN1cnJlbnRHYWluKQotewotICAgIExWTV9GTE9BVCBNYXhHYWluID0gVGFyZ2V0R2FpbjsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKLSAgICBpZihDdXJyZW50R2FpbiA+IE1heEdhaW4pCi0gICAgICAgIE1heEdhaW4gPSBDdXJyZW50R2FpbjsKLSAgICBwSW5zdGFuY2UtPlRhcmdldCA9IFRhcmdldEdhaW47ICAgLy8gVXBkYXRlIGZyYWN0aW9uYWwgZ2FpbiBUYXJnZXQKLSAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50R2FpbjsgLy8gVXBkYXRlIGZyYWN0aW9uYWwgZ2FpbiBDdXJyZW50Ci19Ci0jZWxzZQotdm9pZCBMVkNfTWl4ZXJfSW5pdCggTFZNaXhlcjNfc3QgKnBTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGFyZ2V0R2FpbiwKLSAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBDdXJyZW50R2FpbikKLXsKLSAgICBMVk1fSU5UMTYgICAgICAgU2hpZnQ9MDsKLSAgICBMVk1fSU5UMzIgICAgICAgTWF4R2Fpbj1UYXJnZXRHYWluOyAgICAgICAgIC8vIE1heEdhaW4gaXMgaW4gUTE2LjE1IGZvcm1hdAotICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7Ci0gICAgaWYoQ3VycmVudEdhaW4+TWF4R2FpbikKLSAgICAgICAgTWF4R2Fpbj1DdXJyZW50R2FpbjsgICAgICAgICAgICAgICAgICAgIC8vIE1heEdhaW49bWF4KEN1cnJlbnRHYWluLFRhcmdldEdhaW4pCi0KLSAgICBNYXhHYWluPU1heEdhaW4+PjE1OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1heEdhaW4gaW4gUTMxLjAgZm9ybWF0IGkuZSBJbnRlZ2VyIHBhcnQgb25seQotICAgIHdoaWxlKE1heEdhaW4+MCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIFNoaWZ0IHJlcXVpcmVkIHRvIHByb3ZpZGUgaW50ZWdlciBnYWluCi0gICAgICAgIFNoaWZ0Kys7Ci0gICAgICAgIE1heEdhaW49TWF4R2Fpbj4+MTsKLSAgICB9Ci0gICAgcEluc3RhbmNlLT5UYXJnZXQ9VGFyZ2V0R2Fpbjw8KDE2LVNoaWZ0KTsgICAvLyBVcGRhdGUgZnJhY3Rpb25hbCBnYWluIFRhcmdldAotICAgIHBJbnN0YW5jZS0+Q3VycmVudD1DdXJyZW50R2Fpbjw8KDE2LVNoaWZ0KTsgLy8gVXBkYXRlIGZyYWN0aW9uYWwgZ2FpbiBDdXJyZW50Ci0gICAgcEluc3RhbmNlLT5TaGlmdD1TaGlmdDsgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgU2hpZnQKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX0luaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZmQzNDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfSW5pdC5jcHAKQEAgLTAsMCArMSw1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTFZNaXhlcjNfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGludGlhbGl6YXRpb24gZnVuY3Rpb24gaW50aWFsaXplcyB0aGUgcHJpdmF0ZSBpbnN0YW5jZSAgICAgICAgICovCisvKiAgcGFyYW10ZXJzIGZvciBhIGdpdmVuIEF1ZGlvIFN0cmVhbSBiYXNlZCBvbiBUYXJnZXRHYWluIGFuZCAgICAgICAgICAqLworLyogIEN1cnJlbnRHYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhY2x1bGF0ZXMgdGhlICJTaGlmdCIgcmVxdWlyZWQgdG8gcHJvdmlkZSB0aGUgICAgICAgICovCisvKiAgaW50ZWdlciBwYXJ0IG9mIFRhcmdldEdhaW4gYW5kIGZyYWN0aW9uYWwgZ2FpbiB2YWx1ZXMgIlRhcmdldCIgYW5kICAqLworLyogICJDdXJyZW50IiBiYXNlZCBvbiBtYXhpbXVtKFRhcmdldEdhaW4sQ3VycmVudEdhaW4pICAgICAgICAgICAgICAgICAgKi8KKy8qICBFLmcuIEN1cnJlbnRHYWluPTEuOSBhbmQgVGFyZ2V0R2Fpbj0yLjUgdGhlbiBiYXNlZCBvbiAgICAgICAgICAgICAgICovCisvKiAgTWF4R2FpbiBvZiAyLjUsIFNoaWZ0ID0gMiwgQ3VycmVudD0xLjkvND0wLjQ3NSwgVGFyZ2V0PTIuNS80PTAuNjI1ICAqLworLyogIFRoZXJlZm9yZSBpbnRlZ2VyIGdhaW4gb2YgNCBpcyBwcm92aWRlZCBieSBMZWZ0IFNoaWZ0IG9mIDIgYW5kICAgICAgKi8KKy8qICBmcmFjdGlvbiBnYWluIGlzIHByb3ZpZGVkIHRocm91Z2ggQ3VycmVudD0wLjQ3NSBhbmQgVGFyZ2V0PTAuNjI1ICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBTdHJlYW0gICAgIC0gcHRyIHRvIEluc3RhbmNlIFBhcmFtZXRlciBTdHJ1Y3R1cmUgTFZNaXhlcjNfc3QgZm9yIGFuKi8KKy8qICAgICAgICAgICAgICAgIEF1ZGlvIFN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGFyZ2V0R2FpbiAgLSBUYXJnZXRHYWluIHZhbHVlIGluIFEgMTYuMTUgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAqLworLyogIEN1cnJlbnRHYWluIC0gQ3VycmVudEdhaW4gdmFsdWUgaW4gUSAxNi4xNSBmb3JtYXQgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkNfTWl4ZXJfSW5pdCggTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIFRhcmdldEdhaW4sCisgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgIEN1cnJlbnRHYWluKQoreworICAgIExWTV9GTE9BVCBNYXhHYWluID0gVGFyZ2V0R2FpbjsKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBpZihDdXJyZW50R2FpbiA+IE1heEdhaW4pCisgICAgICAgIE1heEdhaW4gPSBDdXJyZW50R2FpbjsKKyAgICBwSW5zdGFuY2UtPlRhcmdldCA9IFRhcmdldEdhaW47ICAgLy8gVXBkYXRlIGZyYWN0aW9uYWwgZ2FpbiBUYXJnZXQKKyAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBDdXJyZW50R2FpbjsgLy8gVXBkYXRlIGZyYWN0aW9uYWwgZ2FpbiBDdXJyZW50Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ByaXZhdGUuaAppbmRleCBkMGQwZTFmLi4xMjNkMjJiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9Qcml2YXRlLmgKQEAgLTI2LDcgKzI2LDYgQEAKICNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCiAKIC8qIEluc3RhbmNlIHBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICAvKiBHZW5lcmFsICovCkBAIC0zNCwxNiArMzMsNiBAQAogICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgQ3VycmVudDsgICAgICAgICAgLypudW1iZXIgc3BlY2lmeWluZyB2YWx1ZSBvZiBDdXJyZW50IEdhaW4gKi8KICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgIERlbHRhOyAgICAgICAgICAgIC8qbnVtYmVyIHNwZWNpZnlpbmcgdmFsdWUgb2YgRGVsdGEgR2FpbiAqLwogfSBNaXhfUHJpdmF0ZV9GTE9BVF9zdDsKLSNlbHNlCi10eXBlZGVmIHN0cnVjdAotewotICAgIC8qIEdlbmVyYWwgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldDsgICAgICAgICAgICAgICAgIC8qIDMyIGJpdCBudW1iZXIgc3BlY2lmeWluZyBmcmFjdGlvbmFsIHZhbHVlIG9mIFRhcmdldCBHYWluICovCi0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICBDdXJyZW50OyAgICAgICAgICAgICAgICAvKiAzMiBiaXQgbnVtYmVyIHNwZWNpZnlpbmcgZnJhY3Rpb25hbCB2YWx1ZGUgb2YgQ3VycmVudCBHYWluICovCi0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICBTaGlmdDsgICAgICAgICAgICAgICAgICAvKiBMZWZ0IFNoaWZ0IGZvciBJbnRlZ2VyIHBhcnQgb2YgR2FpbiAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgRGVsdGE7ICAgICAgICAgICAgICAgICAgLyogMzIgYml0IG51bWJlciBzcGVjaWZ5aW5nIHRoZSBmcmFjdGlvbmFsIHZhbHVlIG9mIERlbHRhIEdhaW4gKi8KLX0gTWl4X1ByaXZhdGVfc3Q7Ci0jZW5kaWYKIAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgIERFRklOSVRJT05TCkBAIC01Nyw0MyArNDYsMzQgQEAKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiAvKioqIDE2IGJpdCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAogdm9pZCBMVkNfQ29yZV9NaXhJblNvZnRfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKLSNlbHNlCi12b2lkIExWQ19Db3JlX01peEluU29mdF9EMTZDMzFfU0FUKCBMVk1peGVyM19zdCAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKKyNpZmRlZiBTVVBQT1JUX01DCit2b2lkIExWQ19Db3JlX01peEluU29mdF9NY19EMTZDMzFfU0FUKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIE5yQ2hhbm5lbHMpOwogI2VuZGlmCi0jaWZkZWYgQlVJTERfRkxPQVQKIHZvaWQgTFZDX0NvcmVfTWl4U29mdF8xU3RfRDE2QzMxX1dSQSggTFZNaXhlcjNfRkxPQVRfc3QgKnB0ckluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKLSNlbHNlCi12b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QxNkMzMV9XUkEoIExWTWl4ZXIzX3N0ICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOworI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgTFZDX0NvcmVfTWl4U29mdF9NY19EMTZDMzFfV1JBKExWTWl4ZXIzX0ZMT0FUX3N0ICpwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIE5yQ2hhbm5lbHMpOwogI2VuZGlmCi0jaWZkZWYgQlVJTERfRkxPQVQKIHZvaWQgTFZDX0NvcmVfTWl4SGFyZF8yU3RfRDE2QzMxX1NBVCggTFZNaXhlcjNfRkxPQVRfc3QgKnBJbnN0YW5jZTEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAgKnBJbnN0YW5jZTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKLSNlbHNlCi12b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QxNkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwSW5zdGFuY2UxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICAqcEluc3RhbmNlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICpzcmMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKLSNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEZvciBhcHBseWluZyBkaWZmZXJlbnQgZ2FpbnMgdG8gTGVmdCBhbmQgcmlnaHQgY2hlbm5hbHMgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTAxLDE5ICs4MSwxOCBAQAogLyogcHRySW5zdGFuY2UyIGFwcGxpZXMgdG8gUmlnaHQgY2hhbm5lbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBHYWluIHZhbHVlcyBzaG91bGQgbm90IGJlIG1vcmUgdGhhdCAxLjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCisjaWZkZWYgU1VQUE9SVF9NQwordm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF9NQ19mbG9hdF9XUkEoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKipwdHJJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgIE5yQ2hhbm5lbHMpOworI2VuZGlmCiB2b2lkIExWQ19Db3JlX01peFNvZnRfMVN0XzJpX0QxNkMzMV9XUkEoIExWTWl4ZXIzX0ZMT0FUX3N0ICAgICAgICAqcHRySW5zdGFuY2UxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICpzcmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAqZHN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbik7Ci0jZWxzZQotdm9pZCBMVkNfQ29yZV9NaXhTb2Z0XzFTdF8yaV9EMTZDMzFfV1JBKCBMVk1peGVyM19zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgKmRzdCwgICAvKiBkc3QgY2FuIGJlIGVxdWFsIHRvIHNyYyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgbik7ICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KLSNlbmRpZgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qIEZvciBhcHBseWluZyBkaWZmZXJlbnQgZ2FpbnMgdG8gTGVmdCBhbmQgcmlnaHQgY2hlbm5hbHMgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTIxLDQ5ICsxMDAsMjEgQEAKIC8qIHB0ckluc3RhbmNlMiBhcHBsaWVzIHRvIFJpZ2h0IGNoYW5uZWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogR2FpbiB2YWx1ZXMgc2hvdWxkIG5vdCBiZSBtb3JlIHRoYXQgMS4wICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAorI2lmZGVmIFNVUFBPUlRfTUMKK3ZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfTUNfZmxvYXRfU0FUKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICoqcHRySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICpzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICBOckNoYW5uZWxzKTsKKyNlbmRpZgogdm9pZCBMVkNfQ29yZV9NaXhIYXJkXzFTdF8yaV9EMTZDMzFfU0FUKCBMVk1peGVyM19GTE9BVF9zdCAgICAgICAgKnB0ckluc3RhbmNlMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfRkxPQVRfc3QgICAgICAgICpwdHJJbnN0YW5jZTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAqc3JjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgKmRzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgIG4pOwotI2Vsc2UKLXZvaWQgTFZDX0NvcmVfTWl4SGFyZF8xU3RfMmlfRDE2QzMxX1NBVCggTFZNaXhlcjNfc3QgICAgICAgICpwdHJJbnN0YW5jZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTWl4ZXIzX3N0ICAgICAgICAqcHRySW5zdGFuY2UyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICpkc3QsICAgIC8qIGRzdCBjYW4gYmUgZXF1YWwgdG8gc3JjICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICBuKTsgICAgICAvKiBOdW1iZXIgb2Ygc3RlcmVvIHNhbXBsZXMgKi8KLSNlbmRpZgogCiAvKioqIDMyIGJpdCBmdW5jdGlvbnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQlVJTERfRkxPQVQKLXZvaWQgTFZDX0NvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwotCi12b2lkIExWQ19Db3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEoIExWTWl4ZXIzX3N0ICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgIG4pOwotCi12b2lkIExWQ19Db3JlX01peEhhcmRfMlN0X0QzMkMzMV9TQVQoIExWTWl4ZXIzX3N0ICpwSW5zdGFuY2UxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNaXhlcjNfc3QgICAgICAgICAqcEluc3RhbmNlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnNyYzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKTsKLSNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKICNlbmRpZiAvLyNpZm5kZWYgX19MVkNfTUlYRVJfUFJJVkFURV9IX18KIAotCi0KLQotCi0KLQotCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzcxNzlkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUYXJnZXQuYworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJMVk1fVHlwZXMuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0jaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIExWTWl4ZXIzX1NldFRhcmdldCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiB1cGRhdGVzIHRoZSBwcml2YXRlIGluc3RhbmNlIHBhcmFtZXRlcnM6IFNoaWZ0LFRhcmdldCwqLwotLyogIEN1cnJlbnQgZm9yIGEgZ2l2ZW4gQXVkaW8gU3RyZWFtIGJhc2VkIG9uIG5ldyB2YWx1ZSBvZiBUYXJnZXRHYWluICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBjYWNsdWxhdGVzIHRoZSAiU2hpZnQiIHJlcXVpcmVkIHRvIHByb3ZpZGUgdGhlICAgICAgICAqLwotLyogIGludGVnZXIgcGFydCBvZiBUYXJnZXRHYWluIGFuZCBmcmFjdGlvbmFsIGdhaW4gdmFsdWVzICJUYXJnZXQiIGFuZCAgKi8KLS8qICAiQ3VycmVudCIgYmFzZWQgb24gbWF4aW11bShUYXJnZXRHYWluLEN1cnJlbnRHYWluKSAgICAgICAgICAgICAgICAgICovCi0vKiAgRS5nLiBDdXJyZW50R2Fpbj0xLjkgYW5kIFRhcmdldEdhaW49Mi41IHRoZW4gYmFzZWQgb24gICAgICAgICAgICAgICAqLwotLyogIE1heEdhaW4gb2YgMi41LCBTaGlmdCA9IDIsIEN1cnJlbnQ9MS45LzQ9MC40NzUsIFRhcmdldD0yLjUvND0wLjYyNSAgKi8KLS8qICBUaGVyZWZvcmUgaW50ZWdlciBnYWluIG9mIDQgaXMgcHJvdmlkZWQgYnkgTGVmdCBTaGlmdCBvZiAyIGFuZCAgICAgICovCi0vKiAgZnJhY3Rpb24gZ2FpbiBpcyBwcm92aWRlZCB0aHJvdWdoIEN1cnJlbnQ9MC40NzUgYW5kIFRhcmdldD0wLjYyNSAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU3RyZWFtICAgICAgICAgLSBwdHIgdG8gSW5zdGFuY2UgUGFyYW1ldGVyIFN0cnVjdHVyZSBMVk1peGVyM19zdCAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgZm9yIGFuIEF1ZGlvIFN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRhcmdldEdhaW4gICAgICAtIFRhcmdldEdhaW4gdmFsdWUgaW4gUSAxNi4xNSBmb3JtYXQgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19NaXhlcl9TZXRUYXJnZXQoTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgVGFyZ2V0R2FpbikKLXsKLSAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKLSAgICBwSW5zdGFuY2UtPlRhcmdldCA9IFRhcmdldEdhaW47ICAgICAgICAgICAgICAgLy8gVXBkYXRlIGdhaW4gVGFyZ2V0Ci19Ci0jZWxzZQotdm9pZCBMVkNfTWl4ZXJfU2V0VGFyZ2V0KExWTWl4ZXIzX3N0ICpwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUYXJnZXRHYWluKQotewotICAgIExWTV9JTlQzMiAgICAgICBTaGlmdD0wOwotICAgIExWTV9JTlQzMiAgICAgICBDdXJyZW50R2FpbjsKLSAgICBMVk1fSU5UMzIgICAgICAgTWF4R2Fpbj1UYXJnZXRHYWluOyAgICAgICAgICAgICAgICAgICAgIC8vIE1heEdhaW4gaXMgaW4gUTE2LjE1IGZvcm1hdAotICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7Ci0gICAgQ3VycmVudEdhaW49cEluc3RhbmNlLT5DdXJyZW50Pj4oMTYtcEluc3RhbmNlLT5TaGlmdCk7ICAvLyBDdXJyZW50R2FpbiBpbiBRMTYuMTUgZm9ybWF0Ci0gICAgaWYoQ3VycmVudEdhaW4+TWF4R2FpbikKLSAgICAgICAgTWF4R2Fpbj1DdXJyZW50R2FpbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1heEdhaW49bWF4KEN1cnJlbnRHYWluLFRhcmdldEdhaW4pCi0KLSAgICBNYXhHYWluPU1heEdhaW4+PjE1OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE1heEdhaW4gaW4gUTMxLjAgZm9ybWF0IGkuZSBJbnRlZ2VyIHBhcnQgb25seQotICAgIHdoaWxlKE1heEdhaW4+MCl7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIFNoaWZ0IHJlcXVpcmVkIHRvIHByb3ZpZGUgaW50ZWdlciBnYWluCi0gICAgICAgIFNoaWZ0Kys7Ci0gICAgICAgIE1heEdhaW49TWF4R2Fpbj4+MTsKLSAgICB9Ci0gICAgcEluc3RhbmNlLT5UYXJnZXQ9VGFyZ2V0R2Fpbjw8KDE2LVNoaWZ0KTsgICAgICAgICAgICAgICAvLyBVcGRhdGUgZnJhY3Rpb25hbCBnYWluIFRhcmdldAotICAgIHBJbnN0YW5jZS0+Q3VycmVudD1DdXJyZW50R2Fpbjw8KDE2LVNoaWZ0KTsgICAgICAgICAgICAgLy8gVXBkYXRlIGZyYWN0aW9uYWwgZ2FpbiBDdXJyZW50Ci0gICAgcEluc3RhbmNlLT5TaGlmdD1TaGlmdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgU2hpZnQKLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGFyZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2IwY2VjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRhcmdldC5jcHAKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTFZNaXhlcjNfU2V0VGFyZ2V0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIHVwZGF0ZXMgdGhlIHByaXZhdGUgaW5zdGFuY2UgcGFyYW1ldGVyczogU2hpZnQsVGFyZ2V0LCovCisvKiAgQ3VycmVudCBmb3IgYSBnaXZlbiBBdWRpbyBTdHJlYW0gYmFzZWQgb24gbmV3IHZhbHVlIG9mIFRhcmdldEdhaW4gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhY2x1bGF0ZXMgdGhlICJTaGlmdCIgcmVxdWlyZWQgdG8gcHJvdmlkZSB0aGUgICAgICAgICovCisvKiAgaW50ZWdlciBwYXJ0IG9mIFRhcmdldEdhaW4gYW5kIGZyYWN0aW9uYWwgZ2FpbiB2YWx1ZXMgIlRhcmdldCIgYW5kICAqLworLyogICJDdXJyZW50IiBiYXNlZCBvbiBtYXhpbXVtKFRhcmdldEdhaW4sQ3VycmVudEdhaW4pICAgICAgICAgICAgICAgICAgKi8KKy8qICBFLmcuIEN1cnJlbnRHYWluPTEuOSBhbmQgVGFyZ2V0R2Fpbj0yLjUgdGhlbiBiYXNlZCBvbiAgICAgICAgICAgICAgICovCisvKiAgTWF4R2FpbiBvZiAyLjUsIFNoaWZ0ID0gMiwgQ3VycmVudD0xLjkvND0wLjQ3NSwgVGFyZ2V0PTIuNS80PTAuNjI1ICAqLworLyogIFRoZXJlZm9yZSBpbnRlZ2VyIGdhaW4gb2YgNCBpcyBwcm92aWRlZCBieSBMZWZ0IFNoaWZ0IG9mIDIgYW5kICAgICAgKi8KKy8qICBmcmFjdGlvbiBnYWluIGlzIHByb3ZpZGVkIHRocm91Z2ggQ3VycmVudD0wLjQ3NSBhbmQgVGFyZ2V0PTAuNjI1ICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBTdHJlYW0gICAgICAgICAtIHB0ciB0byBJbnN0YW5jZSBQYXJhbWV0ZXIgU3RydWN0dXJlIExWTWl4ZXIzX3N0ICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICBmb3IgYW4gQXVkaW8gU3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGFyZ2V0R2FpbiAgICAgIC0gVGFyZ2V0R2FpbiB2YWx1ZSBpbiBRIDE2LjE1IGZvcm1hdCAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIExWQ19NaXhlcl9TZXRUYXJnZXQoTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgVGFyZ2V0R2FpbikKK3sKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBwSW5zdGFuY2UtPlRhcmdldCA9IFRhcmdldEdhaW47ICAgICAgICAgICAgICAgLy8gVXBkYXRlIGdhaW4gVGFyZ2V0Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ZjVkNTQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1NldFRpbWVDb25zdGFudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJMVk1fVHlwZXMuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0jaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIExWTWl4ZXIzX1NldFRpbWVDb25zdGFudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBzdGVwIGNoYW5nZSBmb3IgZnJhY3Rpb25hbCBnYWluIGZvciBhICAqLwotLyogIGdpdmVuIHRpbWUgY29uc3RhbnQsIHNhbXBsZSByYXRlIGFuZCBudW0gY2hhbm5lbHMgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEZWx0YT0oMjE0NzQ4MzY0Nyo0KjEwMDApLyhOdW1DaGFubmVscypTYW1wbGVSYXRlKlRjX21pbGxpc2VjKSAgICAgICovCi0vKiAgaW4gUSAwLjMxIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFN0cmVhbSAgICAgLSBwdHIgdG8gSW5zdGFuY2UgUGFyYW1ldGVyIFN0cnVjdHVyZSBMVk1peGVyM19zdCBmb3IgYW4qLwotLyogICAgICAgICAgICAgICAgQXVkaW8gU3RyZWFtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUY19taWxsaXNlYyAtIFRpbWVDb25zdGFudCBpLmUgdGltZSByZXF1aXJlZCBpbiBtaWxsaSBzZWNvbmQgdG8gICAgICovCi0vKiAgICAgICAgICAgICAgICBnbyBmcm9tIGxpbmVhciBmcmFjdGlvbmFsIGdhaW4gb2YgMCB0byAwLjk5OTk5OTk5ICAgICAqLwotLyogIEZzICAgICAgICAgIC0gTFZNX0ZzX2VuIGVudW1lcmF0b3IgZm9yIFNhbXBsaW5nIEZyZXF1ZW5jeSAgICAgICAgICAgKi8KLS8qICBOdW1DaGFubmVscyAtIE51bWJlciBvZiBjaGFubmVscyBpbiBBdWRpbyBTdHJlYW0gMT1Nb25vLCAyPVN0ZXJlbyAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogVVBEQVRFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBEZWx0YSAgICAgICAtIHRoZSBzdGVwIGNoYW5nZSBmb3IgZnJhY3Rpb25hbCBnYWluIHBlciA0IHNhbXBsZXMgICAgICovCi0vKiAgICAgICAgICAgICAgICBpbiBRMC4zMSBmb3JtYXQgZm9yIGEgZ2l2ZW4gVGltZSBDb25zdGFudCwgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgU2FtcGxlIFJhdGUgYW5kIE51bUNoYW5uZWxzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgVGNfbWlsbGlzZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzKQotewotI2lmZGVmIEhJR0hFUl9GUwotICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbMTFdID0gezAuNTAwMDAwZiwvKjgwMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzYyODEyZiwvKjExMDI1Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMzMzM2YsLyoxMjAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLC8qMTYwMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTgxNDA2ZiwvKjIyMDUwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE2NjY2NmYsLyoyNDAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLC8qMzIwMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwvKjQ0MTAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2YsLyo0ODAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDE2NjdmLC8qOTYwMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIwODMzZn07LyoxOTIwMDAqLwotI2Vsc2UKLSAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzldID0gezAuNTAwMDAwZiwvKjgwMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjI4MTJmLC8qMTEwMjUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMzMzMzNmLC8qMTIwMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yNTAwMDBmLC8qMTYwMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODE0MDZmLC8qMjIwNTAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNjY2NjZmLC8qMjQwMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDBmLC8qMzIwMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wOTA3MDNmLC8qNDQxMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODMzMzNmfTsvKjQ4MDAwKi8KLSNlbmRpZgotCi0gICAgTWl4X1ByaXZhdGVfRkxPQVRfc3QgKnBJbnN0YW5jZSA9IChNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7Ci0gICAgTFZNX0ZMT0FUIERlbHRhID0gRGVsdGFUYWJsZVtGc107Ci0gICAgRGVsdGEgPSBEZWx0YSAvIChOdW1DaGFubmVscyk7Ci0KLSAgICBpZihUY19taWxsaXNlYyA9PSAwKQotICAgICAgICBEZWx0YSA9IDEuMDAwMDAwZjsKLSAgICBlbHNlCi0gICAgICAgIERlbHRhID0gRGVsdGEgLyBUY19taWxsaXNlYzsKLQotICAgIGlmKERlbHRhID09IDApCi0gICAgICAgIERlbHRhID0gMC4wMDAwMDAwMDA1ZjsgIC8qIElmIFRpbWUgQ29uc3RhbnQgaXMgc28gbGFyZ2UgdGhhdCBEZWx0YSBpcyAwLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXNzaWduIG1pbmltdW0gdmFsdWUgdG8gRGVsdGEgKi8KLSAgICBwSW5zdGFuY2UtPkRlbHRhID0gRGVsdGE7ICAvLyBEZWx0YT0oMjE0NzQ4MzY0Nyo0KjEwMDApLyhOdW1DaGFubmVscypTYW1wbGVSYXRlKlRjX21pbGxpc2VjKQotfQotI2Vsc2UKLXZvaWQgTFZDX01peGVyX1NldFRpbWVDb25zdGFudChMVk1peGVyM19zdCAqcFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscykKLXsKLSAgICBMVk1fSU5UMzIgICBEZWx0YVRhYmxlWzldPXsxMDczNzQxODI0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc3OTEzMjM4OSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTU4Mjc4ODIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM2ODcwOTEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4OTU2NjE5NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNTc5MTM5NDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjY4NDM1NDU2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5NDc4MzA5NywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzg5NTY5NzF9OwotICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7Ci0gICAgTFZNX0lOVDMyICAgRGVsdGE9RGVsdGFUYWJsZVtGc107Ci0gICAgRGVsdGE9RGVsdGE+PihOdW1DaGFubmVscy0xKTsKLQotICAgIGlmKFRjX21pbGxpc2VjPT0wKQotICAgICAgICBEZWx0YT0weDdGRkZGRkZGOwotICAgIGVsc2UKLSAgICAgICAgRGVsdGE9RGVsdGEvVGNfbWlsbGlzZWM7Ci0KLSAgICBpZihEZWx0YT09MCkKLSAgICAgICAgRGVsdGE9MTsgICAgICAgICAgICAgICAgLy8gSWYgVGltZSBDb25zdGFudCBpcyBzbyBsYXJnZSB0aGF0IERlbHRhIGlzIDAsIGFzc2lnbiBtaW5pbXVtIHZhbHVlIHRvIERlbHRhCi0KLSAgICBwSW5zdGFuY2UtPkRlbHRhPURlbHRhOyAgICAgLy8gRGVsdGE9KDIxNDc0ODM2NDcqNCoxMDAwKS8oTnVtQ2hhbm5lbHMqU2FtcGxlUmF0ZSpUY19taWxsaXNlYykgaW4gUSAwLjMxIGZvcm1hdAotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhOGRhN2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50LmNwcApAQCAtMCwwICsxLDc5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorI2luY2x1ZGUgIkxWQ19NaXhlcl9Qcml2YXRlLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBMVk1peGVyM19TZXRUaW1lQ29uc3RhbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgc3RlcCBjaGFuZ2UgZm9yIGZyYWN0aW9uYWwgZ2FpbiBmb3IgYSAgKi8KKy8qICBnaXZlbiB0aW1lIGNvbnN0YW50LCBzYW1wbGUgcmF0ZSBhbmQgbnVtIGNoYW5uZWxzICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVsdGE9KDIxNDc0ODM2NDcqNCoxMDAwKS8oTnVtQ2hhbm5lbHMqU2FtcGxlUmF0ZSpUY19taWxsaXNlYykgICAgICAqLworLyogIGluIFEgMC4zMSBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBTdHJlYW0gICAgIC0gcHRyIHRvIEluc3RhbmNlIFBhcmFtZXRlciBTdHJ1Y3R1cmUgTFZNaXhlcjNfc3QgZm9yIGFuKi8KKy8qICAgICAgICAgICAgICAgIEF1ZGlvIFN0cmVhbSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGNfbWlsbGlzZWMgLSBUaW1lQ29uc3RhbnQgaS5lIHRpbWUgcmVxdWlyZWQgaW4gbWlsbGkgc2Vjb25kIHRvICAgICAqLworLyogICAgICAgICAgICAgICAgZ28gZnJvbSBsaW5lYXIgZnJhY3Rpb25hbCBnYWluIG9mIDAgdG8gMC45OTk5OTk5OSAgICAgKi8KKy8qICBGcyAgICAgICAgICAtIExWTV9Gc19lbiBlbnVtZXJhdG9yIGZvciBTYW1wbGluZyBGcmVxdWVuY3kgICAgICAgICAgICovCisvKiAgTnVtQ2hhbm5lbHMgLSBOdW1iZXIgb2YgY2hhbm5lbHMgaW4gQXVkaW8gU3RyZWFtIDE9TW9ubywgMj1TdGVyZW8gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFVQREFURVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRGVsdGEgICAgICAgLSB0aGUgc3RlcCBjaGFuZ2UgZm9yIGZyYWN0aW9uYWwgZ2FpbiBwZXIgNCBzYW1wbGVzICAgICAqLworLyogICAgICAgICAgICAgICAgaW4gUTAuMzEgZm9ybWF0IGZvciBhIGdpdmVuIFRpbWUgQ29uc3RhbnQsICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgIFNhbXBsZSBSYXRlIGFuZCBOdW1DaGFubmVscyAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoTFZNaXhlcjNfRkxPQVRfc3QgKnBTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgTnVtQ2hhbm5lbHMpCit7CisgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVsxM10gPSB7MC41MDAwMDBmLC8qODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjI4MTJmLC8qMTEwMjUqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzMzMzMzZiwvKjEyMDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDAwMGYsLyoxNjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODE0MDZmLC8qMjIwNTAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTY2NjY2ZiwvKjI0MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMGYsLyozMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wOTA3MDNmLC8qNDQxMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDgzMzMzZiwvKjQ4MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA0NTM1MmYsLyo4ODIwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wNDE2NjdmLC8qOTYwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDIyNjc2ZiwvKjE3NjQwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjA4MzNmfTsvKjE5MjAwMCovCisKKyAgICBNaXhfUHJpdmF0ZV9GTE9BVF9zdCAqcEluc3RhbmNlID0gKE1peF9Qcml2YXRlX0ZMT0FUX3N0ICopcFN0cmVhbS0+UHJpdmF0ZVBhcmFtczsKKyAgICBMVk1fRkxPQVQgRGVsdGEgPSBEZWx0YVRhYmxlW0ZzXTsKKyAgICBEZWx0YSA9IERlbHRhIC8gKE51bUNoYW5uZWxzKTsKKworICAgIGlmKFRjX21pbGxpc2VjID09IDApCisgICAgICAgIERlbHRhID0gMS4wMDAwMDBmOworICAgIGVsc2UKKyAgICAgICAgRGVsdGEgPSBEZWx0YSAvIFRjX21pbGxpc2VjOworCisgICAgaWYoRGVsdGEgPT0gMCkKKyAgICAgICAgRGVsdGEgPSAwLjAwMDAwMDAwMDVmOyAgLyogSWYgVGltZSBDb25zdGFudCBpcyBzbyBsYXJnZSB0aGF0IERlbHRhIGlzIDAsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc3NpZ24gbWluaW11bSB2YWx1ZSB0byBEZWx0YSAqLworICAgIHBJbnN0YW5jZS0+RGVsdGEgPSBEZWx0YTsgIC8vIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkYzdkMjEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudC5jCisrKyAvZGV2L251bGwKQEAgLTEsMTYxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJMVk1fVHlwZXMuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0jaW5jbHVkZSAiTFZDX01peGVyX1ByaXZhdGUuaCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgTFZNaXhlcjNfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHN0ZXAgY2hhbmdlIGZvciBmcmFjdGlvbmFsIGdhaW4gZm9yIGEgICovCi0vKiAgZ2l2ZW4gdGltZSBjb25zdGFudCwgc2FtcGxlIHJhdGUgYW5kIG51bSBjaGFubmVscyAgICAgICAgICAgICAgICAgICAqLwotLyogIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpICAgICAgKi8KLS8qICBpbiBRIDAuMzEgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwU3RyZWFtICAgICAtIHB0ciB0byBJbnN0YW5jZSBQYXJhbWV0ZXIgU3RydWN0dXJlIExWTWl4ZXIzX3N0IGZvciBhbiovCi0vKiAgICAgICAgICAgICAgICBBdWRpbyBTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRjX21pbGxpc2VjIC0gVGltZUNvbnN0YW50IGkuZSB0aW1lIHJlcXVpcmVkIGluIG1pbGxpIHNlY29uZCB0byAgICAgKi8KLS8qICAgICAgICAgICAgICAgIGdvIGZyb20gbGluZWFyIGZyYWN0aW9uYWwgZ2FpbiBvZiAwIHRvIDAuOTk5OTk5OTkgICAgICovCi0vKiAgRnMgICAgICAgICAgLSBMVk1fRnNfZW4gZW51bWVyYXRvciBmb3IgU2FtcGxpbmcgRnJlcXVlbmN5ICAgICAgICAgICAqLwotLyogIE51bUNoYW5uZWxzIC0gTnVtYmVyIG9mIGNoYW5uZWxzIGluIEF1ZGlvIFN0cmVhbSAxPU1vbm8sIDI9U3RlcmVvICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBVUERBVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERlbHRhICAgICAgIC0gdGhlIHN0ZXAgY2hhbmdlIGZvciBmcmFjdGlvbmFsIGdhaW4gcGVyIDQgc2FtcGxlcyAgICAgKi8KLS8qICAgICAgICAgICAgICAgIGluIFEwLjMxIGZvcm1hdCBmb3IgYSBnaXZlbiBUaW1lIENvbnN0YW50LCAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICBTYW1wbGUgUmF0ZSBhbmQgTnVtQ2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoIExWTWl4ZXIzX0ZMT0FUX3N0ICpwU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgIEZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgIE51bUNoYW5uZWxzKQotewotI2lmZGVmIEhJR0hFUl9GUwotICAgICBMVk1fRkxPQVQgICBEZWx0YVRhYmxlWzExXSA9IHswLjUwMDAwMGYsLyo4MDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zNjI4MTJmLC8qMTEwMjUqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMzMzM2YsLyoxMjAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjUwMDAwZiwvKjE2MDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xODE0MDZmLC8qMjIwNTAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE2NjY2NmYsLyoyNDAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTI1MDAwZiwvKjMyMDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wOTA3MDNmLC8qNDQxMDAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2YsLyo0ODAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQxNjY2ZiwvKjk2MDAwKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjA4MzNmfTsvKjE5MjAwMCovCi0jZWxzZQotICAgIExWTV9GTE9BVCAgIERlbHRhVGFibGVbOV0gPSB7MC41MDAwMDBmLC8qODAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM2MjgxMmYsLyoxMTAyNSovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMzMzMzM2YsLyoxMjAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDAwMGYsLyoxNjAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE4MTQwNmYsLyoyMjA1MCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjE2NjY2NmYsLyoyNDAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMGYsLyozMjAwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA5MDcwM2YsLyo0NDEwMCovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA4MzMzM2Z9Oy8qNDgwMDAqLwotI2VuZGlmCi0gICAgTFZNX0ZMT0FUIFRjX21pbGxpc2VjX2Zsb2F0OwotICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOwotICAgIExWTV9GTE9BVCBEZWx0YSA9IERlbHRhVGFibGVbRnNdOwotCi0gICAgTFZNX0ZMT0FUICAgQ3VycmVudDsKLSAgICBMVk1fRkxPQVQgICBUYXJnZXQ7Ci0KLSAgICBEZWx0YT1EZWx0YSAvIChOdW1DaGFubmVscyk7Ci0KLSAgICAvKiAgR2V0IGdhaW4gdmFsdWVzICAqLwotICAgIEN1cnJlbnQgPSBwSW5zdGFuY2UtPkN1cnJlbnQ7Ci0gICAgVGFyZ2V0ID0gcEluc3RhbmNlLT5UYXJnZXQ7Ci0KLSAgICBpZiAoQ3VycmVudCAhPSBUYXJnZXQpCi0gICAgewotICAgICAgICBUY19taWxsaXNlY19mbG9hdCA9IChMVk1fRkxPQVQpKFRjX21pbGxpc2VjKSAvIChDdXJyZW50IC0gVGFyZ2V0KTsKLSAgICAgICAgaWYgKFRjX21pbGxpc2VjX2Zsb2F0IDwgMCkKLSAgICAgICAgICAgIFRjX21pbGxpc2VjX2Zsb2F0ID0gLVRjX21pbGxpc2VjX2Zsb2F0OwotCi0gICAgICAgIGlmKFRjX21pbGxpc2VjID09IDApCi0gICAgICAgICAgICBEZWx0YSA9IDEuMDAwMDAwZjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgRGVsdGEgPSBEZWx0YSAvIFRjX21pbGxpc2VjX2Zsb2F0OwotCi0gICAgICAgIGlmKERlbHRhID09IDApCi0gICAgICAgICAgICBEZWx0YSA9IDAuMDAwMDAwMDAwNWY7IC8qIElmIFRpbWUgQ29uc3RhbnQgaXMgc28gbGFyZ2UgdGhhdCBEZWx0YSBpcyAwLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbiBtaW5pbXVtIHZhbHVlIHRvIERlbHRhICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIERlbHRhID0gMC4wMDAwMDAwMDA1ZjsgIC8qIE1pbmltdW0gdmFsdWUgZm9yIHByb3BlciBjYWxsLWJhY2tzIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldHRpbmcgaXQgdG8gemVybyBoYXMgc29tZSBwcm9ibGVtcywgdG8gYmUgY29ycmVjdGVkKSAqLwotICAgIH0KLQotICAgIHBJbnN0YW5jZS0+RGVsdGEgPSBEZWx0YTsgICAgIC8vIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpCi19Ci0jZWxzZQotdm9pZCBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19zdCAqcFN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgIFRjX21pbGxpc2VjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscykKLXsKLSAgICBMVk1fSU5UMzIgICBEZWx0YVRhYmxlWzldPXsxMDczNzQxODI0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc3OTEzMjM4OSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTU4Mjc4ODIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM2ODcwOTEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM4OTU2NjE5NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNTc5MTM5NDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjY4NDM1NDU2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5NDc4MzA5NywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzg5NTY5NzF9OwotICAgIE1peF9Qcml2YXRlX3N0ICAqcEluc3RhbmNlPShNaXhfUHJpdmF0ZV9zdCAqKXBTdHJlYW0tPlByaXZhdGVQYXJhbXM7Ci0gICAgTFZNX0lOVDMyICAgRGVsdGE9RGVsdGFUYWJsZVtGc107Ci0KLSAgICBMVk1fSU5UMzIgICBDdXJyZW50OwotICAgIExWTV9JTlQzMiAgIFRhcmdldDsKLQotICAgIERlbHRhPURlbHRhPj4oTnVtQ2hhbm5lbHMtMSk7Ci0KLSAgICAvKiAgR2V0IGdhaW4gdmFsdWVzICAqLwotICAgIEN1cnJlbnQgPSBMVkNfTWl4ZXJfR2V0Q3VycmVudCggcFN0cmVhbSApOwotICAgIFRhcmdldCA9IExWQ19NaXhlcl9HZXRUYXJnZXQoIHBTdHJlYW0gKTsKLQotICAgIGlmIChDdXJyZW50ICE9IFRhcmdldCkKLSAgICB7Ci0gICAgICAgIFRjX21pbGxpc2VjID0gVGNfbWlsbGlzZWMgKiAzMjc2NyAvIChDdXJyZW50IC0gVGFyZ2V0KTsKLSAgICAgICAgaWYgKFRjX21pbGxpc2VjPDApIFRjX21pbGxpc2VjID0gLVRjX21pbGxpc2VjOwotCi0gICAgICAgIGlmKFRjX21pbGxpc2VjPT0wKQotICAgICAgICAgICAgRGVsdGE9MHg3RkZGRkZGRjsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgRGVsdGE9RGVsdGEvVGNfbWlsbGlzZWM7Ci0KLSAgICAgICAgaWYoRGVsdGE9PTApCi0gICAgICAgICAgICBEZWx0YT0xOyAgICAgICAgICAgIC8vIElmIFRpbWUgQ29uc3RhbnQgaXMgc28gbGFyZ2UgdGhhdCBEZWx0YSBpcyAwLCBhc3NpZ24gbWluaW11bSB2YWx1ZSB0byBEZWx0YQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBEZWx0YSA9MTsgICAgICAgICAgICAgICAvLyBNaW5pbXVtIHZhbHVlIGZvciBwcm9wZXIgY2FsbC1iYWNrcyAoc2V0dGluZyBpdCB0byB6ZXJvIGhhcyBzb21lIHByb2JsZW1zLCB0byBiZSBjb3JyZWN0ZWQpCi0gICAgfQotCi0KLSAgICBwSW5zdGFuY2UtPkRlbHRhPURlbHRhOyAgICAgLy8gRGVsdGE9KDIxNDc0ODM2NDcqNCoxMDAwKS8oTnVtQ2hhbm5lbHMqU2FtcGxlUmF0ZSpUY19taWxsaXNlYykgaW4gUSAwLjMxIGZvcm1hdAotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMzVhMWUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50LmNwcApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJMVkNfTWl4ZXJfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTFZNaXhlcjNfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIHN0ZXAgY2hhbmdlIGZvciBmcmFjdGlvbmFsIGdhaW4gZm9yIGEgICovCisvKiAgZ2l2ZW4gdGltZSBjb25zdGFudCwgc2FtcGxlIHJhdGUgYW5kIG51bSBjaGFubmVscyAgICAgICAgICAgICAgICAgICAqLworLyogIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpICAgICAgKi8KKy8qICBpbiBRIDAuMzEgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwU3RyZWFtICAgICAtIHB0ciB0byBJbnN0YW5jZSBQYXJhbWV0ZXIgU3RydWN0dXJlIExWTWl4ZXIzX3N0IGZvciBhbiovCisvKiAgICAgICAgICAgICAgICBBdWRpbyBTdHJlYW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRjX21pbGxpc2VjIC0gVGltZUNvbnN0YW50IGkuZSB0aW1lIHJlcXVpcmVkIGluIG1pbGxpIHNlY29uZCB0byAgICAgKi8KKy8qICAgICAgICAgICAgICAgIGdvIGZyb20gbGluZWFyIGZyYWN0aW9uYWwgZ2FpbiBvZiAwIHRvIDAuOTk5OTk5OTkgICAgICovCisvKiAgRnMgICAgICAgICAgLSBMVk1fRnNfZW4gZW51bWVyYXRvciBmb3IgU2FtcGxpbmcgRnJlcXVlbmN5ICAgICAgICAgICAqLworLyogIE51bUNoYW5uZWxzIC0gTnVtYmVyIG9mIGNoYW5uZWxzIGluIEF1ZGlvIFN0cmVhbSAxPU1vbm8sIDI9U3RlcmVvICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBVUERBVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERlbHRhICAgICAgIC0gdGhlIHN0ZXAgY2hhbmdlIGZvciBmcmFjdGlvbmFsIGdhaW4gcGVyIDQgc2FtcGxlcyAgICAgKi8KKy8qICAgICAgICAgICAgICAgIGluIFEwLjMxIGZvcm1hdCBmb3IgYSBnaXZlbiBUaW1lIENvbnN0YW50LCAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICBTYW1wbGUgUmF0ZSBhbmQgTnVtQ2hhbm5lbHMgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCBMVk1peGVyM19GTE9BVF9zdCAqcFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBUY19taWxsaXNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBOdW1DaGFubmVscykKK3sKKyAgICAgTFZNX0ZMT0FUICAgRGVsdGFUYWJsZVsxM10gPSB7MC41MDAwMDBmLC8qODAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzYyODEyZiwvKjExMDI1Ki8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMzMzMzNmLC8qMTIwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDAwMGYsLyoxNjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTgxNDA2ZiwvKjIyMDUwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xNjY2NjZmLC8qMjQwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEyNTAwMGYsLyozMjAwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDkwNzAzZiwvKjQ0MTAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODMzMzNmLC8qNDgwMDAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjA0NTM1MmYsLyo4ODIwMCovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDQxNjY2ZiwvKjk2MDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjI2NzZmLC8qMTc2NDAwKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMjA4MzNmfTsvKjE5MjAwMCovCisgICAgTFZNX0ZMT0FUIFRjX21pbGxpc2VjX2Zsb2F0OworICAgIE1peF9Qcml2YXRlX0ZMT0FUX3N0ICpwSW5zdGFuY2UgPSAoTWl4X1ByaXZhdGVfRkxPQVRfc3QgKilwU3RyZWFtLT5Qcml2YXRlUGFyYW1zOworICAgIExWTV9GTE9BVCBEZWx0YSA9IERlbHRhVGFibGVbRnNdOworCisgICAgTFZNX0ZMT0FUICAgQ3VycmVudDsKKyAgICBMVk1fRkxPQVQgICBUYXJnZXQ7CisKKyAgICBEZWx0YT1EZWx0YSAvIChOdW1DaGFubmVscyk7CisKKyAgICAvKiAgR2V0IGdhaW4gdmFsdWVzICAqLworICAgIEN1cnJlbnQgPSBwSW5zdGFuY2UtPkN1cnJlbnQ7CisgICAgVGFyZ2V0ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisKKyAgICBpZiAoQ3VycmVudCAhPSBUYXJnZXQpCisgICAgeworICAgICAgICBUY19taWxsaXNlY19mbG9hdCA9IChMVk1fRkxPQVQpKFRjX21pbGxpc2VjKSAvIChDdXJyZW50IC0gVGFyZ2V0KTsKKyAgICAgICAgaWYgKFRjX21pbGxpc2VjX2Zsb2F0IDwgMCkKKyAgICAgICAgICAgIFRjX21pbGxpc2VjX2Zsb2F0ID0gLVRjX21pbGxpc2VjX2Zsb2F0OworCisgICAgICAgIGlmKFRjX21pbGxpc2VjID09IDApCisgICAgICAgICAgICBEZWx0YSA9IDEuMDAwMDAwZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgRGVsdGEgPSBEZWx0YSAvIFRjX21pbGxpc2VjX2Zsb2F0OworCisgICAgICAgIGlmKERlbHRhID09IDApCisgICAgICAgICAgICBEZWx0YSA9IDAuMDAwMDAwMDAwNWY7IC8qIElmIFRpbWUgQ29uc3RhbnQgaXMgc28gbGFyZ2UgdGhhdCBEZWx0YSBpcyAwLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2lnbiBtaW5pbXVtIHZhbHVlIHRvIERlbHRhICovCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIERlbHRhID0gMC4wMDAwMDAwMDA1ZjsgIC8qIE1pbmltdW0gdmFsdWUgZm9yIHByb3BlciBjYWxsLWJhY2tzIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNldHRpbmcgaXQgdG8gemVybyBoYXMgc29tZSBwcm9ibGVtcywgdG8gYmUgY29ycmVjdGVkKSAqLworICAgIH0KKworICAgIHBJbnN0YW5jZS0+RGVsdGEgPSBEZWx0YTsgICAgIC8vIERlbHRhPSgyMTQ3NDgzNjQ3KjQqMTAwMCkvKE51bUNoYW5uZWxzKlNhbXBsZVJhdGUqVGNfbWlsbGlzZWMpCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fSFBGLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwOTQ2MjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0hQRi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJMVk1fVHlwZXMuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0jaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkZpbHRlci5oIgotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICB2b2lkIExWTV9GT19MUEYoICAgTFZNX0lOVDMyICAgICAgIHcgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgIEZPX0MzMl9Db2Vmc190ICAqcENvZWZmcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGNvZWZmaWNpZW50IG9mIGZpcnN0IG9yZGVyIGxvdyBwYXNzICAgICAqLwotLyogICAgZmlsdGVyLiBJdCB1c2VzIHRoZSBlcXVhdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBCMSAgICA9ICh0YW4ody8yKSAtIDEgKSAgLyAgKHRhbih3LzIpICsgMSApICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQTAgICAgPSAoMSAtIEIxKSAvIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEExICAgID0gQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIHZhbHVlIG9mIEIxIGlzIHRoZW4gY2FsY3VsYXRlZCBkaXJlY3RseSBmcm9tIHRoZSB2YWx1ZSB3IGJ5IGEgICAgKi8KLS8qICAgIHBvbHlub21pYWwgZXhwYW5zaW9uIHVzaW5nIGEgOXRoIG9yZGVyIHBvbHlub21pYWwuIEl0IHVzZXMgdGhlICAgICAgICovCi0vKiAgICBmb2xsb3dpbmcgdGFibGUgb2YgMzItYml0IGludGVnZXIgcG9seW5vbWlhbCBjb2VmZmljaWVudHM6ICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQ29lZmZpY2llbnQgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEEwICAgICAgICAgICAgIC04Mzg4NTcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBBMSAgICAgICAgICAgICAzMzU0Nzc0NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQTIgICAgICAgICAgICAgLTY2ODE2NzkxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEEzICAgICAgICAgICAgIDE3MzM3NTMwOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBBNCAgICAgICAgICAgICAtMzg4NDM3NTczICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQTUgICAgICAgICAgICAgNzUyOTc1MzgzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEE2ICAgICAgICAgICAgIC0xMTAzMDE2NjYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBBNyAgICAgICAgICAgICAxMTIxODQ4NTY3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQTggICAgICAgICAgICAgLTY4ODA3ODE1OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEE5ICAgICAgICAgICAgIDE5NDY2OTU3NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBBMTAgICAgICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsg77+9Li4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHcgICAgICAgICAgICAgICBTYW1wbGUgcmF0ZSBpbiByYWRpYW5zLCAgd2hlcmU6ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgdyA9IDIgKiBQaSAqIEZjIC8gRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgIEZjICAgaXMgdGhlIGNvcm5lciBmcmVxdWVuY3kgaW4gSHogICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICBGcyAgIGlzIHRoZSBzYW1wbGUgcmF0ZSBpbiBIeiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgdyBpcyBpbiBRMi4yOSBmb3JtYXQgYW5kIGRhdGEgcmFuZ2UgaXMgWzAgUGldICAgICAgICAgICovCi0vKiAgcENvZWZmcyAgICAgICAgIFBvaW50cyB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBjYWxjdWxhdGVkIGhlcmUgICAgICAqLwotLyogICAgICAgICAgICAgICAgICBpbiBRMS4zMCBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotTFZNX0ZMT0FUIExWTV9GT19IUEYoICAgTFZNX0ZMT0FUICAgICAgIHcsCi0gICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAqcENvZWZmcykKLXsKLSAgICBMVk1fRkxPQVQgWSxDb2VmZmljaWVudHNbMTNdID0gey0wLjk5OTk5NmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTgwMWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40OTc4MjRmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMjI5MzdmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTgwODgwZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDg3NjU4ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAzMjEwMmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwODE2M2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDEyNTJmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwODlmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwfTsKLSAgICBZPUxWTV9Qb2x5bm9taWFsKChMVk1fVUlOVDE2KTksIENvZWZmaWNpZW50cywgdyk7Ci0KLSAgICBwQ29lZmZzLT5CMSA9IC1ZOyAgICAgICAgIC8qIFN0b3JlIC1CMSBpbiBmaWx0ZXIgc3RydWN0dXJlIGluc3RlYWQgb2YgQjEhKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBMD0oMS1CMSkvMj0gQjEvMiAtIDAuNSovCi0gICAgWSA9IFkgLyAyLjBmOyAgICAgICAgICAgICAgICAgLyogQTA9WT1CMS8yKi8KLSAgICBZID0gWSAtIDAuNWY7ICAgICAgICAgLyogQTA9WT0oQjEvMiAtIDAuNSkqLwotCi0gICAgcENvZWZmcy0+QTAgPSBZICogRklMVEVSX0xPU1NfRkxPQVQ7ICAgICAgICAgICAgICAgICAgLyogQXBwbHkgbG9zcyB0byBhdm9pZCBvdmVyZmxvdyovCi0gICAgcENvZWZmcy0+QTEgPSAtcENvZWZmcy0+QTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU3RvcmUgQTE9LUEwKi8KLQotICAgIHJldHVybiAxOwotfQotI2Vsc2UKLUxWTV9JTlQzMiBMVk1fRk9fSFBGKCAgIExWTV9JTlQzMiAgICAgICB3LAotICAgICAgICAgICAgICAgICAgICAgICAgRk9fQzMyX0NvZWZzX3QgICpwQ29lZmZzKQotewotICAgIExWTV9JTlQzMiBZLENvZWZmaWNpZW50c1sxM109eyAgLTgzODg1NzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMzU0Nzc0NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02NjgxNjc5MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3MzM3NTMwOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zODg0Mzc1NzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NTI5NzUzODMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTEwMzAxNjY2MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMjE4NDg1NjcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNjg4MDc4MTU5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTk0NjY5NTc3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwfTsKLSAgICBZPUxWTV9Qb2x5bm9taWFsKCAgICAgICAgICAgKExWTV9VSU5UMTYpOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZWZmaWNpZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcpOwotICAgIHBDb2VmZnMtPkIxPS1ZOyAgICAgICAgIC8qIFN0b3JlIC1CMSBpbiBmaWx0ZXIgc3RydWN0dXJlIGluc3RlYWQgb2YgQjEhKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBMD0oMS1CMSkvMj0gQjEvMiAtIDAuNSovCi0gICAgWT1ZPj4xOyAgICAgICAgICAgICAgICAgLyogQTA9WT1CMS8yKi8KLSAgICBZPVktMHg0MDAwMDAwMDsgICAgICAgICAvKiBBMD1ZPShCMS8yIC0gMC41KSovCi0gICAgTVVMMzJ4MTZJTlRPMzIoWSwgRklMVEVSX0xPU1MgLHBDb2VmZnMtPkEwICwxNSkgICAgIC8qIEFwcGx5IGxvc3MgdG8gYXZvaWQgb3ZlcmZsb3cqLwotICAgIHBDb2VmZnMtPkExPS1wQ29lZmZzLT5BMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdG9yZSBBMT0tQTAqLwotCi0gICAgcmV0dXJuIDE7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0hQRi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQ5N2QyOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19IUEYuY3BwCkBAIC0wLDAgKzEsOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisjaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIkZpbHRlci5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgdm9pZCBMVk1fRk9fTFBGKCAgIExWTV9JTlQzMiAgICAgICB3ICwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgKnBDb2VmZnMpOyAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBjb2VmZmljaWVudCBvZiBmaXJzdCBvcmRlciBsb3cgcGFzcyAgICAgKi8KKy8qICAgIGZpbHRlci4gSXQgdXNlcyB0aGUgZXF1YXRpb25zOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQjEgICAgPSAodGFuKHcvMikgLSAxICkgIC8gICh0YW4ody8yKSArIDEgKSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEEwICAgID0gKDEgLSBCMSkgLyAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBMSAgICA9IEEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoZSB2YWx1ZSBvZiBCMSBpcyB0aGVuIGNhbGN1bGF0ZWQgZGlyZWN0bHkgZnJvbSB0aGUgdmFsdWUgdyBieSBhICAgICovCisvKiAgICBwb2x5bm9taWFsIGV4cGFuc2lvbiB1c2luZyBhIDl0aCBvcmRlciBwb2x5bm9taWFsLiBJdCB1c2VzIHRoZSAgICAgICAqLworLyogICAgZm9sbG93aW5nIHRhYmxlIG9mIDMyLWJpdCBpbnRlZ2VyIHBvbHlub21pYWwgY29lZmZpY2llbnRzOiAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIENvZWZmaWNpZW50ICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBMCAgICAgICAgICAgICAtODM4ODU3MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTEgICAgICAgICAgICAgMzM1NDc3NDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEEyICAgICAgICAgICAgIC02NjgxNjc5MSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBMyAgICAgICAgICAgICAxNzMzNzUzMDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTQgICAgICAgICAgICAgLTM4ODQzNzU3MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE1ICAgICAgICAgICAgIDc1Mjk3NTM4MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBNiAgICAgICAgICAgICAtMTEwMzAxNjY2MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTcgICAgICAgICAgICAgMTEyMTg0ODU2NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE4ICAgICAgICAgICAgIC02ODgwNzgxNTkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBOSAgICAgICAgICAgICAxOTQ2Njk1NzcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTEwICAgICAgICAgICAgOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFkgPSAoQTAgKyBBMSpYICsgQTIqWDIgKyBBMypYMyArIO+/vS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB3ICAgICAgICAgICAgICAgU2FtcGxlIHJhdGUgaW4gcmFkaWFucywgIHdoZXJlOiAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIHcgPSAyICogUGkgKiBGYyAvIEZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICBGYyAgIGlzIHRoZSBjb3JuZXIgZnJlcXVlbmN5IGluIEh6ICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgRnMgICBpcyB0aGUgc2FtcGxlIHJhdGUgaW4gSHogICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIHcgaXMgaW4gUTIuMjkgZm9ybWF0IGFuZCBkYXRhIHJhbmdlIGlzIFswIFBpXSAgICAgICAgICAqLworLyogIHBDb2VmZnMgICAgICAgICBQb2ludHMgdG8gdGhlIGZpbHRlciBjb2VmZmljaWVudHMgY2FsY3VsYXRlZCBoZXJlICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgaW4gUTEuMzAgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitMVk1fRkxPQVQgTFZNX0ZPX0hQRiggICBMVk1fRkxPQVQgICAgICAgdywKKyAgICAgICAgICAgICAgICAgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgICpwQ29lZmZzKQoreworICAgIExWTV9GTE9BVCBZLENvZWZmaWNpZW50c1sxM10gPSB7LTAuOTk5OTk2ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5ODAxZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjQ5NzgyNGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjMyMjkzN2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4xODA4ODBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wODc2NThmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDMyMTAyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDA4MTYzZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMTI1MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA4OWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB9OworICAgIFk9TFZNX1BvbHlub21pYWwoKExWTV9VSU5UMTYpOSwgQ29lZmZpY2llbnRzLCB3KTsKKworICAgIHBDb2VmZnMtPkIxID0gLVk7ICAgICAgICAgLyogU3RvcmUgLUIxIGluIGZpbHRlciBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBCMSEqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEwPSgxLUIxKS8yPSBCMS8yIC0gMC41Ki8KKyAgICBZID0gWSAvIDIuMGY7ICAgICAgICAgICAgICAgICAvKiBBMD1ZPUIxLzIqLworICAgIFkgPSBZIC0gMC41ZjsgICAgICAgICAvKiBBMD1ZPShCMS8yIC0gMC41KSovCisKKyAgICBwQ29lZmZzLT5BMCA9IFkgKiBGSUxURVJfTE9TU19GTE9BVDsgICAgICAgICAgICAgICAgICAvKiBBcHBseSBsb3NzIHRvIGF2b2lkIG92ZXJmbG93Ki8KKyAgICBwQ29lZmZzLT5BMSA9IC1wQ29lZmZzLT5BMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTdG9yZSBBMT0tQTAqLworCisgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmZTY3ZjguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX0ZPX0xQRi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJMVk1fVHlwZXMuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0jaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIkZpbHRlci5oIgotCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICB2b2lkIExWTV9GT19MUEYoICAgTFZNX0lOVDMyICAgICAgIHcgLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgIEZPX0MzMl9Db2Vmc190ICAqcENvZWZmcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGlzIGZ1bmN0aW9uIGNhbGN1bGF0ZXMgdGhlIGNvZWZmaWNpZW50IG9mIGZpcnN0IG9yZGVyIGxvdyBwYXNzICAgICAqLwotLyogICAgZmlsdGVyLiBJdCB1c2VzIHRoZSBlcXVhdGlvbnM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBCMSAgICA9ICh0YW4ody8yKSAtIDEgKSAgLyAgKHRhbih3LzIpICsgMSApICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQTAgICAgPSAoMSArIEIxKSAvIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEExICAgID0gQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgVGhlIHZhbHVlIG9mIEIxIGlzIHRoZW4gY2FsY3VsYXRlZCBkaXJlY3RseSBmcm9tIHRoZSB2YWx1ZSB3IGJ5IGEgICAgKi8KLS8qICAgIHBvbHlub21pYWwgZXhwYW5zaW9uIHVzaW5nIGEgOXRoIG9yZGVyIHBvbHlub21pYWwuIEl0IHVzZXMgdGhlICAgICAgICovCi0vKiAgICBmb2xsb3dpbmcgdGFibGUgb2YgMzItYml0IGludGVnZXIgcG9seW5vbWlhbCBjb2VmZmljaWVudHM6ICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQ29lZmZpY2llbnQgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEEwICAgICAgICAgICAgIC04Mzg4NTcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBBMSAgICAgICAgICAgICAzMzU0Nzc0NCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQTIgICAgICAgICAgICAgLTY2ODE2NzkxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEEzICAgICAgICAgICAgIDE3MzM3NTMwOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBBNCAgICAgICAgICAgICAtMzg4NDM3NTczICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQTUgICAgICAgICAgICAgNzUyOTc1MzgzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEE2ICAgICAgICAgICAgIC0xMTAzMDE2NjYzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBBNyAgICAgICAgICAgICAxMTIxODQ4NTY3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQTggICAgICAgICAgICAgLTY4ODA3ODE1OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEE5ICAgICAgICAgICAgIDE5NDY2OTU3NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBBMTAgICAgICAgICAgICA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsg77+9Li4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHcgICAgICAgICAgICAgICBTYW1wbGUgcmF0ZSBpbiByYWRpYW5zLCAgd2hlcmU6ICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgdyA9IDIgKiBQaSAqIEZjIC8gRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgIEZjICAgaXMgdGhlIGNvcm5lciBmcmVxdWVuY3kgaW4gSHogICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICBGcyAgIGlzIHRoZSBzYW1wbGUgcmF0ZSBpbiBIeiAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgdyBpcyBpbiBRMi4yOSBmb3JtYXQgYW5kIGRhdGEgcmFuZ2UgaXMgWzAgUGldICAgICAgICAgICovCi0vKiAgcENvZWZmcyAgICAgICAgIFBvaW50cyB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBjYWxjdWxhdGVkIGhlcmUgICAgICAqLwotLyogICAgICAgICAgICAgICAgICBpbiBRMS4zMCBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotTFZNX0ZMT0FUIExWTV9GT19MUEYoICAgTFZNX0ZMT0FUICAgICAgIHcsCi0gICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAqcENvZWZmcykKLXsKLSAgICBMVk1fRkxPQVQgWSxDb2VmZmljaWVudHNbMTNdID0gey0wLjk5OTk5NmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTgwMWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40OTc4MjRmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMjI5MzdmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTgwODgwZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDg3NjU4ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAzMjEwMmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwODE2M2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDEyNTJmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwODlmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMH07Ci0gICAgWT1MVk1fUG9seW5vbWlhbCgoTFZNX1VJTlQxNik5LCBDb2VmZmljaWVudHMsIHcpOwotICAgIHBDb2VmZnMtPkIxID0gLVk7ICAgICAvLyBTdG9yZSAtQjEgaW4gZmlsdGVyIHN0cnVjdHVyZSBpbnN0ZWFkIG9mIEIxIQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQTA9KDErQjEpLzI9IEIxLzIgKyAwLjUKLSAgICBZID0gWSAvIDIuMGY7ICAgICAgICAgICAgIC8vIEEwPVk9QjEvMgotICAgIFkgPSBZICsgMC41ZjsgICAgIC8vIEEwPVk9KEIxLzIgKyAwLjUpCi0KLSAgICBwQ29lZmZzLT5BMCA9IFkgKiBGSUxURVJfTE9TU19GTE9BVDsKLSAgICBwQ29lZmZzLT5BMSA9IHBDb2VmZnMtPkEwOwotCi0gICAgcmV0dXJuIDE7Ci19Ci0jZWxzZQotTFZNX0lOVDMyIExWTV9GT19MUEYoICAgTFZNX0lOVDMyICAgICAgIHcsCi0gICAgICAgICAgICAgICAgICAgICAgICBGT19DMzJfQ29lZnNfdCAgKnBDb2VmZnMpCi17Ci0gICAgTFZNX0lOVDMyIFksQ29lZmZpY2llbnRzWzEzXT17ICAtODM4ODU3MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMzNTQ3NzQ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTY2ODE2NzkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTczMzc1MzA4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTM4ODQzNzU3MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc1Mjk3NTM4MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xMTAzMDE2NjYzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEyMTg0ODU2NywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02ODgwNzgxNTksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTQ2Njk1NzcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4fTsKLSAgICBZPUxWTV9Qb2x5bm9taWFsKCAgICAgICAgICAgKExWTV9VSU5UMTYpOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZWZmaWNpZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHcpOwotICAgIHBDb2VmZnMtPkIxPS1ZOyAgICAgLy8gU3RvcmUgLUIxIGluIGZpbHRlciBzdHJ1Y3R1cmUgaW5zdGVhZCBvZiBCMSEKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEEwPSgxK0IxKS8yPSBCMS8yICsgMC41Ci0gICAgWT1ZPj4xOyAgICAgICAgICAgICAvLyBBMD1ZPUIxLzIKLSAgICBZPVkrMHg0MDAwMDAwMDsgICAgIC8vIEEwPVk9KEIxLzIgKyAwLjUpCi0gICAgTVVMMzJ4MTZJTlRPMzIoWSwgRklMVEVSX0xPU1MgLHBDb2VmZnMtPkEwICwxNSkgICAgLy8gQXBwbHkgbG9zcyB0byBhdm9pZCBvdmVyZmxvdwotICAgIHBDb2VmZnMtPkExPXBDb2VmZnMtPkEwOwotICAgIHJldHVybiAxOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9GT19MUEYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYzYwNDYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fRk9fTFBGLmNwcApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJGaWx0ZXIuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHZvaWQgTFZNX0ZPX0xQRiggICBMVk1fSU5UMzIgICAgICAgdyAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgRk9fQzMyX0NvZWZzX3QgICpwQ29lZmZzKTsgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgY29lZmZpY2llbnQgb2YgZmlyc3Qgb3JkZXIgbG93IHBhc3MgICAgICovCisvKiAgICBmaWx0ZXIuIEl0IHVzZXMgdGhlIGVxdWF0aW9uczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEIxICAgID0gKHRhbih3LzIpIC0gMSApICAvICAodGFuKHcvMikgKyAxICkgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBBMCAgICA9ICgxICsgQjEpIC8gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgQTEgICAgPSBBMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBUaGUgdmFsdWUgb2YgQjEgaXMgdGhlbiBjYWxjdWxhdGVkIGRpcmVjdGx5IGZyb20gdGhlIHZhbHVlIHcgYnkgYSAgICAqLworLyogICAgcG9seW5vbWlhbCBleHBhbnNpb24gdXNpbmcgYSA5dGggb3JkZXIgcG9seW5vbWlhbC4gSXQgdXNlcyB0aGUgICAgICAgKi8KKy8qICAgIGZvbGxvd2luZyB0YWJsZSBvZiAzMi1iaXQgaW50ZWdlciBwb2x5bm9taWFsIGNvZWZmaWNpZW50czogICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBDb2VmZmljaWVudCAgICBWYWx1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTAgICAgICAgICAgICAgLTgzODg1NzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEExICAgICAgICAgICAgIDMzNTQ3NzQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBMiAgICAgICAgICAgICAtNjY4MTY3OTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTMgICAgICAgICAgICAgMTczMzc1MzA4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE0ICAgICAgICAgICAgIC0zODg0Mzc1NzMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBNSAgICAgICAgICAgICA3NTI5NzUzODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTYgICAgICAgICAgICAgLTExMDMwMTY2NjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE3ICAgICAgICAgICAgIDExMjE4NDg1NjcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBOCAgICAgICAgICAgICAtNjg4MDc4MTU5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTkgICAgICAgICAgICAgMTk0NjY5NTc3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEExMCAgICAgICAgICAgIDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyDvv70uLiArIEFOKnhOKSA8PCBBTisxICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgdyAgICAgICAgICAgICAgIFNhbXBsZSByYXRlIGluIHJhZGlhbnMsICB3aGVyZTogICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICB3ID0gMiAqIFBpICogRmMgLyBGcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgRmMgICBpcyB0aGUgY29ybmVyIGZyZXF1ZW5jeSBpbiBIeiAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIEZzICAgaXMgdGhlIHNhbXBsZSByYXRlIGluIEh6ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICB3IGlzIGluIFEyLjI5IGZvcm1hdCBhbmQgZGF0YSByYW5nZSBpcyBbMCBQaV0gICAgICAgICAgKi8KKy8qICBwQ29lZmZzICAgICAgICAgUG9pbnRzIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGNhbGN1bGF0ZWQgaGVyZSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgIGluIFExLjMwIGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworTFZNX0ZMT0FUIExWTV9GT19MUEYoICAgTFZNX0ZMT0FUICAgICAgIHcsCisgICAgICAgICAgICAgICAgICAgICAgICBGT19GTE9BVF9Db2Vmc190ICAqcENvZWZmcykKK3sKKyAgICBMVk1fRkxPQVQgWSxDb2VmZmljaWVudHNbMTNdID0gey0wLjk5OTk5NmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTgwMWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC40OTc4MjRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMjI5MzdmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMTgwODgwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDg3NjU4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAzMjEwMmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwODE2M2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDEyNTJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwODlmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMH07CisgICAgWT1MVk1fUG9seW5vbWlhbCgoTFZNX1VJTlQxNik5LCBDb2VmZmljaWVudHMsIHcpOworICAgIHBDb2VmZnMtPkIxID0gLVk7ICAgICAvLyBTdG9yZSAtQjEgaW4gZmlsdGVyIHN0cnVjdHVyZSBpbnN0ZWFkIG9mIEIxIQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gQTA9KDErQjEpLzI9IEIxLzIgKyAwLjUKKyAgICBZID0gWSAvIDIuMGY7ICAgICAgICAgICAgIC8vIEEwPVk9QjEvMgorICAgIFkgPSBZICsgMC41ZjsgICAgIC8vIEEwPVk9KEIxLzIgKyAwLjUpCisKKyAgICBwQ29lZmZzLT5BMCA9IFkgKiBGSUxURVJfTE9TU19GTE9BVDsKKyAgICBwQ29lZmZzLT5BMSA9IHBDb2VmZnMtPkEwOworCisgICAgcmV0dXJuIDE7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODQ2Y2EwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTEyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJMVk1fVHlwZXMuaCIKLSNpbmNsdWRlICJGaWx0ZXIuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRGVmaW5lcyBhbmQgVGFibGVzIGZvciAyKlBpL0ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExWVkRMXzJQaUJ5XzgwMDAgICAgICAgIDE3MjcxMDg4MjYgIC8qIEluIFE0MSBmb3JtYXQgKi8KLSNkZWZpbmUgTFZWRExfMlBpQnlfMTEwMjUgICAgICAgMTI1MzIzMDg5NCAgLyogSW4gUTQxIGZvcm1hdCAqLwotI2RlZmluZSBMVlZETF8yUGlCeV8xMjAwMCAgICAgICAxMTUxNDA1ODg0ICAvKiBJbiBRNDEgZm9ybWF0ICovCi0KLSNkZWZpbmUgTFZWRExfMlBpQnlGc19TSElGVDEgICAgMTIgICAgICAgICAgLyogUWZvcm1hdCBzaGlmdCBmb3IgOGtIeiwgMTEuMDI1a0h6IGFuZCAxMmtIeiBpLmUuIDEyPTQxLTI5ICovCi0jZGVmaW5lIExWVkRMXzJQaUJ5RnNfU0hJRlQyICAgIDEzICAgICAgICAgIC8qIFFmb3JtYXQgc2hpZnQgZm9yIDE2a0h6LCAyMi4wNTBrSHogYW5kIDI0a0h6IGkuZS4gMTM9NDItMjkgKi8KLSNkZWZpbmUgTFZWRExfMlBpQnlGc19TSElGVDMgICAgMTQgICAgICAgICAgLyogUWZvcm1hdCBzaGlmdCBmb3IgMzJrSHosIDQ0LjFrSHogYW5kIDQ4a0h6IGkuZS4gMTQ9NDMtMjkgKi8KLSNpZm5kZWYgQlVJTERfRkxPQVQKLWNvbnN0IExWTV9JTlQzMiAgICAgTFZWRExfMlBpT25Gc1RhYmxlW10gPSAge0xWVkRMXzJQaUJ5XzgwMDAgLCAvKiA4a0h6IGluIFE0MSwgMTZrSHogaW4gUTQyLCAzMmtIeiBpbiBRNDMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMTEwMjUsICAvKiAxMTAyNSBIeiBpbiBRNDEsIDIyMDUwSHogaW4gUTQyLCA0NDEwMCBIeiBpbiBRNDMqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8xMjAwMH07IC8qIDEya0h6IGluIFE0MSwgMjRrSHogaW4gUTQyLCA0OGtIeiBpbiBRNDMgKi8KLSNlbmRpZgotCi1jb25zdCBMVk1fSU5UMzIgICAgIExWVkRMXzJQaU9uRnNTaGlmdFRhYmxlW109e0xWVkRMXzJQaUJ5RnNfU0hJRlQxICwgICAgICAgICAvKiA4a0h6LCAxMTAyNUh6LCAxMmtIeiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeUZzX1NISUZUMiwgICAgICAgICAgLyogMTZrSHosIDIyMDUwSHosIDI0a0h6Ki8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlGc19TSElGVDN9OyAgICAgICAgIC8qIDMya0h6LCA0NDEwMEh6LCA0OGtIeiAqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi0jZGVmaW5lIExWVkRMXzJQaUJ5XzgwMDBfZiAgICAgICAgMC4wMDA3ODUzOThmCi0jZGVmaW5lIExWVkRMXzJQaUJ5XzExMDI1X2YgICAgICAgMC4wMDA1Njk5MDNmCi0jZGVmaW5lIExWVkRMXzJQaUJ5XzEyMDAwX2YgICAgICAgMC4wMDA1MjM1OTlmCi0jZGVmaW5lIExWVkRMXzJQaUJ5XzE2MDAwX2YgICAgICAgMC4wMDAzOTI3MDBmCi0jZGVmaW5lIExWVkRMXzJQaUJ5XzIyMDUwX2YgICAgICAgMC4wMDAyODQ5NTJmCi0jZGVmaW5lIExWVkRMXzJQaUJ5XzI0MDAwX2YgICAgICAgMC4wMDAyNjE4MDBmCi0jZGVmaW5lIExWVkRMXzJQaUJ5XzMyMDAwX2YgICAgICAgMC4wMDAxOTYzNTBmCi0jZGVmaW5lIExWVkRMXzJQaUJ5XzQ0MTAwX2YgICAgICAgMC4wMDAxNDI0NzZmCi0jZGVmaW5lIExWVkRMXzJQaUJ5XzQ4MDAwX2YgICAgICAgMC4wMDAxMzA5MDBmCi0KLSNpZmRlZiBISUdIRVJfRlMKLSNkZWZpbmUgTFZWRExfMlBpQnlfOTYwMDBfZiAgICAgICAwLjAwMDA2NTQ1MGYKLSNkZWZpbmUgTFZWRExfMlBpQnlfMTkyMDAwX2YgICAgICAwLjAwMDAzMjcyNWYKLSNlbmRpZgotY29uc3QgTFZNX0ZMT0FUICAgICBMVlZETF8yUGlPbkZzVGFibGVbXSA9ICB7TFZWRExfMlBpQnlfODAwMF9mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMTEwMjVfZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzEyMDAwX2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8xNjAwMF9mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMjIwNTBfZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzI0MDAwX2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8zMjAwMF9mLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfNDQxMDBfZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzQ4MDAwX2YKLSNpZmRlZiBISUdIRVJfRlMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5Xzk2MDAwX2YKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5XzE5MjAwMF9mCi0jZW5kaWYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotI2VuZGlmCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgTFZNX0dldE9tZWdhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTFZNX0lOVDMyIExWTV9HZXRPbWVnYShMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRmMsICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgICAgIEZzKSAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSB2YWx1ZSBvZiB3IHVzaW5nIEZjIGFuZCBGcyAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZNX1VJTlQxNiAgICAgICAgICBGYyAgICAgVGhlIGNvcm5lciBmcmVxdWVuY3kgaW4gSHogUTE2LjAgZm9ybWF0ICAgICAqLwotLyogIExWTV9Gc19lbiAgICAgICAgICAgRnMgICAgIFRoZSBTYW1wbGVSYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHc9MipwaSpGYy9GcyBpbiBRMi4yOSBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotI2lmZGVmIEhJR0hFUl9GUwotTFZNX0ZMT0FUIExWTV9HZXRPbWVnYShMVk1fVUlOVDMyICAgICAgICAgICAgICAgICAgRmMsCi0gICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICBGcykKLSNlbHNlCi1MVk1fRkxPQVQgTFZNX0dldE9tZWdhKExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBGYywKLSAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgICAgIEZzKQotI2VuZGlmCi17Ci0gICAgTFZNX0ZMT0FUICAgdzsKLSAgICB3ID0gKExWTV9GTE9BVClGYyAqIExWVkRMXzJQaU9uRnNUYWJsZVtGc107Ci0gICAgcmV0dXJuIHc7Ci19Ci0jZWxzZQotTFZNX0lOVDMyIExWTV9HZXRPbWVnYShMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRmMsCi0gICAgICAgICAgICAgICAgICAgICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICBGcykKLXsKLSAgICBMVk1fSU5UMzIgICB3OwotICAgIE1VTDMyeDMySU5UTzMyKChMVk1fSU5UMzIpRmMsTFZWRExfMlBpT25Gc1RhYmxlW0ZzJTNdLHcsTFZWRExfMlBpT25Gc1NoaWZ0VGFibGVbRnMvM10pCi0gICAgcmV0dXJuIHc7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9HZXRPbWVnYS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhN2NjYTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fR2V0T21lZ2EuY3BwCkBAIC0wLDAgKzEsODYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKyNpbmNsdWRlICJGaWx0ZXIuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRGVmaW5lcyBhbmQgVGFibGVzIGZvciAyKlBpL0ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIExWVkRMXzJQaUJ5XzgwMDAgICAgICAgIDE3MjcxMDg4MjYgIC8qIEluIFE0MSBmb3JtYXQgKi8KKyNkZWZpbmUgTFZWRExfMlBpQnlfMTEwMjUgICAgICAgMTI1MzIzMDg5NCAgLyogSW4gUTQxIGZvcm1hdCAqLworI2RlZmluZSBMVlZETF8yUGlCeV8xMjAwMCAgICAgICAxMTUxNDA1ODg0ICAvKiBJbiBRNDEgZm9ybWF0ICovCisKKyNkZWZpbmUgTFZWRExfMlBpQnlGc19TSElGVDEgICAgMTIgICAgICAgICAgLyogUWZvcm1hdCBzaGlmdCBmb3IgOGtIeiwgMTEuMDI1a0h6IGFuZCAxMmtIeiBpLmUuIDEyPTQxLTI5ICovCisjZGVmaW5lIExWVkRMXzJQaUJ5RnNfU0hJRlQyICAgIDEzICAgICAgICAgIC8qIFFmb3JtYXQgc2hpZnQgZm9yIDE2a0h6LCAyMi4wNTBrSHogYW5kIDI0a0h6IGkuZS4gMTM9NDItMjkgKi8KKyNkZWZpbmUgTFZWRExfMlBpQnlGc19TSElGVDMgICAgMTQgICAgICAgICAgLyogUWZvcm1hdCBzaGlmdCBmb3IgMzJrSHosIDQ0LjFrSHogYW5kIDQ4a0h6IGkuZS4gMTQ9NDMtMjkgKi8KKyNkZWZpbmUgTFZWRExfMlBpQnlfODAwMF9mICAgICAgICAwLjAwMDc4NTM5OGYKKyNkZWZpbmUgTFZWRExfMlBpQnlfMTEwMjVfZiAgICAgICAwLjAwMDU2OTkwM2YKKyNkZWZpbmUgTFZWRExfMlBpQnlfMTIwMDBfZiAgICAgICAwLjAwMDUyMzU5OWYKKyNkZWZpbmUgTFZWRExfMlBpQnlfMTYwMDBfZiAgICAgICAwLjAwMDM5MjcwMGYKKyNkZWZpbmUgTFZWRExfMlBpQnlfMjIwNTBfZiAgICAgICAwLjAwMDI4NDk1MmYKKyNkZWZpbmUgTFZWRExfMlBpQnlfMjQwMDBfZiAgICAgICAwLjAwMDI2MTgwMGYKKyNkZWZpbmUgTFZWRExfMlBpQnlfMzIwMDBfZiAgICAgICAwLjAwMDE5NjM1MGYKKyNkZWZpbmUgTFZWRExfMlBpQnlfNDQxMDBfZiAgICAgICAwLjAwMDE0MjQ3NmYKKyNkZWZpbmUgTFZWRExfMlBpQnlfNDgwMDBfZiAgICAgICAwLjAwMDEzMDkwMGYKKworI2RlZmluZSBMVlZETF8yUGlCeV84ODIwMF9mICAgICAgIDAuMDAwMDcxMjM4ZgorI2RlZmluZSBMVlZETF8yUGlCeV85NjAwMF9mICAgICAgIDAuMDAwMDY1NDUwZgorI2RlZmluZSBMVlZETF8yUGlCeV8xNzY0MDBfZiAgICAgIDAuMDAwMDM1NjE5ZgorI2RlZmluZSBMVlZETF8yUGlCeV8xOTIwMDBfZiAgICAgIDAuMDAwMDMyNzI1ZgorY29uc3QgTFZNX0ZMT0FUICAgICBMVlZETF8yUGlPbkZzVGFibGVbXSA9ICB7TFZWRExfMlBpQnlfODAwMF9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMTEwMjVfZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzEyMDAwX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8xNjAwMF9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfMjIwNTBfZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzI0MDAwX2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlZETF8yUGlCeV8zMjAwMF9mLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZWRExfMlBpQnlfNDQxMDBfZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWVkRMXzJQaUJ5XzQ4MDAwX2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5Xzg4MjAwX2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5Xzk2MDAwX2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWVkRMXzJQaUJ5XzE3NjQwMF9mCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVlZETF8yUGlCeV8xOTIwMDBfZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTFZNX0dldE9tZWdhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTFZNX0lOVDMyIExWTV9HZXRPbWVnYShMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgRmMsICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZzX2VuICAgICAgICAgICAgICAgICAgIEZzKSAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSB2YWx1ZSBvZiB3IHVzaW5nIEZjIGFuZCBGcyAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1VJTlQxNiAgICAgICAgICBGYyAgICAgVGhlIGNvcm5lciBmcmVxdWVuY3kgaW4gSHogUTE2LjAgZm9ybWF0ICAgICAqLworLyogIExWTV9Gc19lbiAgICAgICAgICAgRnMgICAgIFRoZSBTYW1wbGVSYXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIHc9MipwaSpGYy9GcyBpbiBRMi4yOSBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0xWTV9GTE9BVCBMVk1fR2V0T21lZ2EoTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEZjLAorICAgICAgICAgICAgICAgICAgICAgICBMVk1fRnNfZW4gICAgICAgICAgICAgICAgICAgRnMpCit7CisgICAgTFZNX0ZMT0FUICAgdzsKKyAgICB3ID0gKExWTV9GTE9BVClGYyAqIExWVkRMXzJQaU9uRnNUYWJsZVtGc107CisgICAgcmV0dXJuIHc7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfRmlsdGVyQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfRmlsdGVyQ29lZmZzLmgKaW5kZXggZjFlNDVmYS4uMjQ0ZjA5ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX0ZpbHRlckNvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9GaWx0ZXJDb2VmZnMuaApAQCAtMjcsNyArMjcsNiBAQAogI2lmbmRlZiBfX0xWTV9NSVhFUl9GSUxURVJfQ09FRkZTX0hfXwogI2RlZmluZSBfX0xWTV9NSVhFUl9GSUxURVJfQ09FRkZTX0hfXwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogQWxwaGEgVGltZSBDb25zdGFudCB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTg3LDcgKzg2LDYgQEAKICNkZWZpbmUgQUxQSEFfNDkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAvKiBGbG9hdGluZyBwb2ludCBBbHBoYSA9IDAuMDAwMDAwICovCiAjZGVmaW5lIEFMUEhBXzUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgLyogRmxvYXRpbmcgcG9pbnQgQWxwaGEgPSAwLjAwMDAwMCAqLwogCi0jaWZkZWYgQlVJTERfRkxPQVQgLyogQlVJTERfRkxPQVQgKi8KICNkZWZpbmUgQUxQSEFfRmxvYXRfMCAgICAgICAgICAgICAgICAgICAgICAgIDAuOTk5OTk5ZgogI2RlZmluZSBBTFBIQV9GbG9hdF8xICAgICAgICAgICAgICAgICAgICAgICAgMC45OTk5OThmCiAjZGVmaW5lIEFMUEhBX0Zsb2F0XzIgICAgICAgICAgICAgICAgICAgICAgICAwLjk5OTk5N2YKQEAgLTEzOSw2ICsxMzcsNSBAQAogI2RlZmluZSBBTFBIQV9GbG9hdF80OCAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCiAjZGVmaW5lIEFMUEhBX0Zsb2F0XzQ5ICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKICNkZWZpbmUgQUxQSEFfRmxvYXRfNTAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgotI2VuZGlmCiAKICNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX01peGVyX1RpbWVDb25zdGFudC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOGIyNzgyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9UaW1lQ29uc3RhbnQuYworKysgL2Rldi9udWxsCkBAIC0xLDI2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiTFZNX1R5cGVzLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotI2luY2x1ZGUgIk1peGVyLmgiCi0jaW5jbHVkZSAiTFZNX01peGVyX0ZpbHRlckNvZWZmcy5oIgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBMVk1fTWl4X0dldFRpbWVDb25zdGFudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyB0aGUgZmlsdGVyIGNvZWZmaWNpZW50IHVzaW5nIHRoZSBmb2xsb3dpbmcgKi8KLS8qICBlcXVhdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICBBbHBoYSA9IGV4cChsbigwLjEpLyAodGMgKiBVcGRhdGUgKyAxLjApKSAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGlzIHRvIGJlIHVzZWQgd2l0aCB0aGUgZm9sbG93IGZpcnN0IG9yZGVyIGZpbHRlciwgY2FsbGVkIGF0IGEgICovCi0vKiAgcmF0ZSBvZiBVcGRhdGUgdGltZXMgYSBzZWNvbmQuIHRjIGlzIHRoZSByZXF1aXJlZCB0aW1lIGNvbnN0YW50IGluICAqLwotLyogIHVuaXRzIG9mIDEwMHVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICBPdXRwdXQobikgPSBBbHBoYSAqIE91dHB1dChuLTEpICsgKDEgLSBBbHBoYSkgKiBUYXJnZXQobikgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGUgZnVuY3Rpb24gYXNzdW1lcyB0aGUgYmxvY2sgc2l6ZSBpcyBsYXJnZSwgaS5lLiB0aGUgdXBkYXRlIHJhdGUgICovCi0vKiAgaXMgYXBwcm94aW1hdGVseSBhIGZpeGVkLCBhbmQgY29ycmVjdCBmYWN0b3Igb2YgdGhlIHZhbHVlIG9mIEZzICAgICAqLwotLyogIGdpdmVuIGluIHRoZSBjYWxsLiBUaGlzIGlzIGVzcGVjaWFsbHkgbm90IHRydWUgd2hlbiB0aGUgYmxvY2sgc2l6ZSAgKi8KLS8qICBpcyB2ZXJ5IHNtYWxsLCBzZWUgdGhlIG1peGVyIGRvY3VtZW50YXRpb24gZm9yIGZ1cnRoZXIgZGV0YWlscy4gICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoZSBmdW5jdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGFsbCBwb3NzaWJsZSBjb21iaW5hdGlvbnMgb2YgaW5wdXQgICAgKi8KLS8qICB2YWx1ZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuIE51bUNoYW5uZWxzIGlzIGxpbWl0ZWQgdG8gdGhlIHZhbHVlcyAxIChNb25vKSBhbmQgMiAoU3RlcmVvKSAgICAgKi8KLS8qICAyLiBUaGUgcHJvZHVjdCB0YyAqIEZzIGlzIGxpbWl0ZWQgYXBwcm94aW1hdGVseSB0byB0aGUgcmFuZ2UgICAgICAgICovCi0vKiAgICAgIDggPCAodGMgKiBGcykgPCAyXjM1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgdGMgICAgICAgICAgICAgIC0gdGhlIHRpbWUgY29uc3RhbnQgaW4gMTAwdXMgc3RlcHMsIGkuZS4gMTAgPSAxbXMgICAqLwotLyogIEZzICAgICAgICAgICAgICAtIHRoZSBmaWx0ZXIgdXBkYXRlIHJhdGUgaW4gSHogICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBOdW1DaGFubmVscyAgICAgLSBOdW1iZXIgb2YgY2hhbm5lbHMgMT1Nb25vLCAyPVN0ZXJlbyAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBBbHBoYSAgIC0gdGhlIGZpbHRlciBjb2VmZmljaWVudCBRMzEgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotTFZNX0ZMT0FUIExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZNX1VJTlQzMiAgIHRjLAotI2lmZGVmIEhJR0hFUl9GUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICBGcywKLSNlbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIEZzLAotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIE51bUNoYW5uZWxzKQotewotCi0gICAgTFZNX1VJTlQzMiAgUHJvZHVjdDsKLSAgICBMVk1fRkxPQVQgIFByb2R1Y3RGbG9hdDsKLSAgICBMVk1fSU5UMTYgICBJbnRlcnBvbGF0ZVNob3J0OwotICAgIExWTV9GTE9BVCAgIEludGVycG9sYXRlOwotICAgIExWTV9VSU5UMTYgIFNoaWZ0OwotICAgIExWTV9GTE9BVCAgIERpZmY7Ci0gICAgTFZNX0ZMT0FUICBUYWJsZVtdID0ge0FMUEhBX0Zsb2F0XzAsICAgICAgICAgICAgIC8qIExvZyBzcGFjZWQgbG9vay11cCB0YWJsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF81LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF82LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF83LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF84LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF85LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE1LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzIxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI3LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzMwLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzMzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM2LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM5LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ1LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80NiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ4LAotICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80OSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNTB9OwotCi0gICAgLyogQ2FsY3VsYXRlIHRoZSBwcm9kdWN0IG9mIHRoZSB0aW1lIGNvbnN0YW50IGFuZCB0aGUgc2FtcGxlIHJhdGUgKi8KLSAgICBQcm9kdWN0ID0gKCh0YyA+PiAxNikgKiAoTFZNX1VJTlQzMilGcykgPDwgMTM7ICAvKiBTdGVyZW8gdmFsdWUgKi8KLSAgICBQcm9kdWN0ID0gUHJvZHVjdCArICgoKHRjICYgMHgwMDAwRkZGRikgKiAoTFZNX1VJTlQzMilGcykgPj4gMyk7Ci0KLSAgICBpZiAoTnVtQ2hhbm5lbHMgPT0gMSkKLSAgICB7Ci0gICAgICAgIFByb2R1Y3QgPSBQcm9kdWN0ID4+IDE7ICAgLyogTW9ubyB2YWx1ZSAqLwotICAgIH0KLQotICAgIC8qIE5vcm1hbGl6ZSB0byBnZXQgdGhlIHRhYmxlIGluZGV4IGFuZCBpbnRlcnBvbGF0aW9uIGZhY3RvciAqLwotICAgIGZvciAoU2hpZnQgPSAwOyBTaGlmdCA8ICgoQWxwaGFfVGFibGVTaXplIC0gMSkgLyAyKTsgU2hpZnQrKykKLSAgICB7Ci0gICAgICAgIGlmICgoUHJvZHVjdCAmIDB4ODAwMDAwMDApICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgUHJvZHVjdCA9IFByb2R1Y3QgPDwgMTsKLSAgICB9Ci0gICAgU2hpZnQgPSAoTFZNX1VJTlQxNikoKFNoaWZ0IDw8IDEpKTsKLQotICAgIGlmICgoUHJvZHVjdCAmIDB4NDAwMDAwMDApPT0wKQotICAgIHsKLSAgICAgICAgU2hpZnQrKzsKLSAgICB9Ci0KLSAgICBJbnRlcnBvbGF0ZVNob3J0ID0gKExWTV9JTlQxNikoKFByb2R1Y3QgPj4gMTUpICYgMHgwMDAwN0ZGRik7Ci0gICAgSW50ZXJwb2xhdGUgPSAoTFZNX0ZMT0FUKUludGVycG9sYXRlU2hvcnQgLyAzMjc2OC4wZjsKLQotICAgIERpZmYgPSAoVGFibGVbU2hpZnRdIC0gVGFibGVbU2hpZnQgKyAxXSk7Ci0gICAgRGlmZiA9IERpZmYgKiBJbnRlcnBvbGF0ZTsKLSAgICBQcm9kdWN0RmxvYXQgPSBUYWJsZVtTaGlmdCArIDFdICsgRGlmZjsKLQotICAgIHJldHVybiBQcm9kdWN0RmxvYXQ7Ci19Ci0jZWxzZQotTFZNX1VJTlQzMiBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWTV9VSU5UMzIgICB0YywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgIE51bUNoYW5uZWxzKQotewotCi0gICAgTFZNX1VJTlQzMiAgUHJvZHVjdDsKLSAgICBMVk1fSU5UMTYgICBJbnRlcnBvbGF0ZTsKLSAgICBMVk1fVUlOVDE2ICBTaGlmdDsKLSAgICBMVk1fSU5UMzIgICBEaWZmOwotICAgIExWTV9VSU5UMzIgIFRhYmxlW10gPSB7QUxQSEFfMCwgICAgICAgICAgICAgLyogTG9nIHNwYWNlZCBsb29rLXVwIHRhYmxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8xLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV80LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV83LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8xMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzExLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8xMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzE0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8xNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzE3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMTgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8xOSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzIwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMjEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8yMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzIzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8yNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzI2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMjcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8yOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzI5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8zMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8zNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzM1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMzYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV8zNywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzM4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfMzksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV80MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfNDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV80MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzQ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfNDUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV80NiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzQ3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfNDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV80OSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBXzUwfTsKLQotCi0gICAgLyogQ2FsY3VsYXRlIHRoZSBwcm9kdWN0IG9mIHRoZSB0aW1lIGNvbnN0YW50IGFuZCB0aGUgc2FtcGxlIHJhdGUgKi8KLSAgICBQcm9kdWN0ID0gKCh0YyA+PiAxNikgKiAoTFZNX1VJTlQzMilGcykgPDwgMTM7ICAvKiBTdGVyZW8gdmFsdWUgKi8KLSAgICBQcm9kdWN0ID0gUHJvZHVjdCArICgoKHRjICYgMHgwMDAwRkZGRikgKiAoTFZNX1VJTlQzMilGcykgPj4gMyk7Ci0KLSAgICBpZiAoTnVtQ2hhbm5lbHMgPT0gMSkKLSAgICB7Ci0gICAgICAgIFByb2R1Y3QgPSBQcm9kdWN0ID4+IDE7ICAgLyogTW9ubyB2YWx1ZSAqLwotICAgIH0KLQotICAgIC8qIE5vcm1hbGl6ZSB0byBnZXQgdGhlIHRhYmxlIGluZGV4IGFuZCBpbnRlcnBvbGF0aW9uIGZhY3RvciAqLwotICAgIGZvciAoU2hpZnQ9MDsgU2hpZnQ8KChBbHBoYV9UYWJsZVNpemUtMSkvMik7IFNoaWZ0KyspCi0gICAgewotICAgICAgICBpZiAoKFByb2R1Y3QgJiAweDgwMDAwMDAwKSE9MCkKLSAgICAgICAgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBQcm9kdWN0ID0gUHJvZHVjdCA8PCAxOwotICAgIH0KLSAgICBTaGlmdCA9IChMVk1fVUlOVDE2KSgoU2hpZnQgPDwgMSkpOwotCi0gICAgaWYgKChQcm9kdWN0ICYgMHg0MDAwMDAwMCk9PTApCi0gICAgewotICAgICAgICBTaGlmdCsrOwotICAgIH0KLQotICAgIEludGVycG9sYXRlID0gKExWTV9JTlQxNikoKFByb2R1Y3QgPj4gMTUpICYgMHgwMDAwN0ZGRik7Ci0KLSAgICBEaWZmID0gKExWTV9JTlQzMikoVGFibGVbU2hpZnRdIC0gVGFibGVbU2hpZnQrMV0pOwotICAgIE1VTDMyeDE2SU5UTzMyKERpZmYsSW50ZXJwb2xhdGUsRGlmZiwxNSkKLSAgICAgICAgUHJvZHVjdCA9IFRhYmxlW1NoaWZ0KzFdICsgKExWTV9VSU5UMzIpRGlmZjsKLQotICAgIHJldHVybiBQcm9kdWN0OwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfVGltZUNvbnN0YW50LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9NaXhlcl9UaW1lQ29uc3RhbnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZGEyY2YKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fTWl4ZXJfVGltZUNvbnN0YW50LmNwcApAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKyNpbmNsdWRlICJNaXhlci5oIgorI2luY2x1ZGUgIkxWTV9NaXhlcl9GaWx0ZXJDb2VmZnMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIExWTV9NaXhfR2V0VGltZUNvbnN0YW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIHRoZSBmaWx0ZXIgY29lZmZpY2llbnQgdXNpbmcgdGhlIGZvbGxvd2luZyAqLworLyogIGVxdWF0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIEFscGhhID0gZXhwKGxuKDAuMSkvICh0YyAqIFVwZGF0ZSArIDEuMCkpICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgaXMgdG8gYmUgdXNlZCB3aXRoIHRoZSBmb2xsb3cgZmlyc3Qgb3JkZXIgZmlsdGVyLCBjYWxsZWQgYXQgYSAgKi8KKy8qICByYXRlIG9mIFVwZGF0ZSB0aW1lcyBhIHNlY29uZC4gdGMgaXMgdGhlIHJlcXVpcmVkIHRpbWUgY29uc3RhbnQgaW4gICovCisvKiAgdW5pdHMgb2YgMTAwdXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgIE91dHB1dChuKSA9IEFscGhhICogT3V0cHV0KG4tMSkgKyAoMSAtIEFscGhhKSAqIFRhcmdldChuKSAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBmdW5jdGlvbiBhc3N1bWVzIHRoZSBibG9jayBzaXplIGlzIGxhcmdlLCBpLmUuIHRoZSB1cGRhdGUgcmF0ZSAgKi8KKy8qICBpcyBhcHByb3hpbWF0ZWx5IGEgZml4ZWQsIGFuZCBjb3JyZWN0IGZhY3RvciBvZiB0aGUgdmFsdWUgb2YgRnMgICAgICovCisvKiAgZ2l2ZW4gaW4gdGhlIGNhbGwuIFRoaXMgaXMgZXNwZWNpYWxseSBub3QgdHJ1ZSB3aGVuIHRoZSBibG9jayBzaXplICAqLworLyogIGlzIHZlcnkgc21hbGwsIHNlZSB0aGUgbWl4ZXIgZG9jdW1lbnRhdGlvbiBmb3IgZnVydGhlciBkZXRhaWxzLiAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIGZ1bmN0aW9uIGRvZXMgbm90IHN1cHBvcnQgYWxsIHBvc3NpYmxlIGNvbWJpbmF0aW9ucyBvZiBpbnB1dCAgICAqLworLyogIHZhbHVlczogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gTnVtQ2hhbm5lbHMgaXMgbGltaXRlZCB0byB0aGUgdmFsdWVzIDEgKE1vbm8pIGFuZCAyIChTdGVyZW8pICAgICAqLworLyogIDIuIFRoZSBwcm9kdWN0IHRjICogRnMgaXMgbGltaXRlZCBhcHByb3hpbWF0ZWx5IHRvIHRoZSByYW5nZSAgICAgICAgKi8KKy8qICAgICAgOCA8ICh0YyAqIEZzKSA8IDJeMzUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB0YyAgICAgICAgICAgICAgLSB0aGUgdGltZSBjb25zdGFudCBpbiAxMDB1cyBzdGVwcywgaS5lLiAxMCA9IDFtcyAgICovCisvKiAgRnMgICAgICAgICAgICAgIC0gdGhlIGZpbHRlciB1cGRhdGUgcmF0ZSBpbiBIeiAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bUNoYW5uZWxzICAgICAtIE51bWJlciBvZiBjaGFubmVscyAxPU1vbm8sIDI9U3RlcmVvICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFscGhhICAgLSB0aGUgZmlsdGVyIGNvZWZmaWNpZW50IFEzMSBmb3JtYXQgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZNX0ZMT0FUIExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZNX1VJTlQzMiAgIHRjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMzIgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgTnVtQ2hhbm5lbHMpCit7CisKKyAgICBMVk1fVUlOVDMyICBQcm9kdWN0OworICAgIExWTV9GTE9BVCAgUHJvZHVjdEZsb2F0OworICAgIExWTV9JTlQxNiAgIEludGVycG9sYXRlU2hvcnQ7CisgICAgTFZNX0ZMT0FUICAgSW50ZXJwb2xhdGU7CisgICAgTFZNX1VJTlQxNiAgU2hpZnQ7CisgICAgTFZNX0ZMT0FUICAgRGlmZjsKKyAgICBMVk1fRkxPQVQgIFRhYmxlW10gPSB7QUxQSEFfRmxvYXRfMCwgICAgICAgICAgICAgLyogTG9nIHNwYWNlZCBsb29rLXVwIHRhYmxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzEzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8xNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMTgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzE5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzIyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMjcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8yOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzM3LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF8zOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfMzksCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ2LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF80NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQUxQSEFfRmxvYXRfNDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFMUEhBX0Zsb2F0XzQ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBBTFBIQV9GbG9hdF81MH07CisKKyAgICAvKiBDYWxjdWxhdGUgdGhlIHByb2R1Y3Qgb2YgdGhlIHRpbWUgY29uc3RhbnQgYW5kIHRoZSBzYW1wbGUgcmF0ZSAqLworICAgIFByb2R1Y3QgPSAoKHRjID4+IDE2KSAqIChMVk1fVUlOVDMyKUZzKSA8PCAxMzsgIC8qIFN0ZXJlbyB2YWx1ZSAqLworICAgIFByb2R1Y3QgPSBQcm9kdWN0ICsgKCgodGMgJiAweDAwMDBGRkZGKSAqIChMVk1fVUlOVDMyKUZzKSA+PiAzKTsKKworICAgIGlmIChOdW1DaGFubmVscyA9PSAxKQorICAgIHsKKyAgICAgICAgUHJvZHVjdCA9IFByb2R1Y3QgPj4gMTsgICAvKiBNb25vIHZhbHVlICovCisgICAgfQorCisgICAgLyogTm9ybWFsaXplIHRvIGdldCB0aGUgdGFibGUgaW5kZXggYW5kIGludGVycG9sYXRpb24gZmFjdG9yICovCisgICAgZm9yIChTaGlmdCA9IDA7IFNoaWZ0IDwgKChBbHBoYV9UYWJsZVNpemUgLSAxKSAvIDIpOyBTaGlmdCsrKQorICAgIHsKKyAgICAgICAgaWYgKChQcm9kdWN0ICYgMHg4MDAwMDAwMCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBQcm9kdWN0ID0gUHJvZHVjdCA8PCAxOworICAgIH0KKyAgICBTaGlmdCA9IChMVk1fVUlOVDE2KSgoU2hpZnQgPDwgMSkpOworCisgICAgaWYgKChQcm9kdWN0ICYgMHg0MDAwMDAwMCk9PTApCisgICAgeworICAgICAgICBTaGlmdCsrOworICAgIH0KKworICAgIEludGVycG9sYXRlU2hvcnQgPSAoTFZNX0lOVDE2KSgoUHJvZHVjdCA+PiAxNSkgJiAweDAwMDA3RkZGKTsKKyAgICBJbnRlcnBvbGF0ZSA9IChMVk1fRkxPQVQpSW50ZXJwb2xhdGVTaG9ydCAvIDMyNzY4LjBmOworCisgICAgRGlmZiA9IChUYWJsZVtTaGlmdF0gLSBUYWJsZVtTaGlmdCArIDFdKTsKKyAgICBEaWZmID0gRGlmZiAqIEludGVycG9sYXRlOworICAgIFByb2R1Y3RGbG9hdCA9IFRhYmxlW1NoaWZ0ICsgMV0gKyBEaWZmOworCisgICAgcmV0dXJuIFByb2R1Y3RGbG9hdDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb2x5bm9taWFsLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG9seW5vbWlhbC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDU3NzY3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb2x5bm9taWFsLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgotI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLSNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCi0KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBMVk1fUG9seW5vbWlhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBUaGlzIGZ1bmN0aW9uIHBlcmZvcm1zIHBvbHlub21pYWwgZXhwYW5zaW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyDvv70uLiArIEFOKnhOKSA8PCBBTisxICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZNX0lOVDMyIExWTV9Qb2x5bm9taWFsKExWTV9VSU5UMTYgICAgTiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgKnBDb2VmZmljaWVudHMsICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgIFgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTiAgICAgICAgICAgICAgICBpcyB0aGUgcG9seW5vbWlhbCBvcmRlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBDb2VmZmljaWVudHMgICAgaXMgdGhlIHB0ciB0byBwb2x5bm9taWFsIGNvZWZmaWNpZW50cyBBMCxBMS4uIGluIFEuMzEgKi8KLS8qICBYICAgICAgICAgICAgICAgIGlzIHRoZSBpbnB1dCB2YXJpYWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgVGhlIHJlc3VsdCBvZiB0aGUgcG9seW5vbWlhbCBleHBhbnNpb24gaW4gUTEuMzEgZm9ybWF0ICAgICAgICAgICAgICAgICovCi0vKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi1MVk1fRkxPQVQgTFZNX1BvbHlub21pYWwoTFZNX1VJTlQxNiAgICBOLAotICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAqcENvZWZmaWNpZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgWCkKLXsKLSAgICBMVk1fSU5UMzIgaTsKLSAgICBMVk1fRkxPQVQgWSxBLFhUZW1wLFRlbXAsc2lnbjsKLQotICAgIFkgPSAqcENvZWZmaWNpZW50czsgLyogWT1BMCovCi0gICAgcENvZWZmaWNpZW50cysrOwotCi0gICAgaWYoWCA9PSAtMS4wZikKLSAgICB7Ci0gICAgICAgIFRlbXAgPSAtMTsKLSAgICAgICAgc2lnbiA9IFRlbXA7Ci0gICAgICAgIGZvcihpID0gMTsgaSA8PSBOOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFkgKz0gKCgqcENvZWZmaWNpZW50cykgKiBzaWduKTsKLSAgICAgICAgICAgIHBDb2VmZmljaWVudHMrKzsKLSAgICAgICAgICAgIHNpZ24gKj0gVGVtcDsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgWFRlbXAgPSBYOwotICAgICAgICBmb3IoaSA9IE4tMTsgaSA+PSAwOyBpLS0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIEEgPSAqcENvZWZmaWNpZW50czsKLSAgICAgICAgICAgIHBDb2VmZmljaWVudHMrKzsKLQotICAgICAgICAgICAgVGVtcCA9IEEgKiBYVGVtcDsKLSAgICAgICAgICAgIFkgKz0gVGVtcDsKLQotICAgICAgICAgICAgVGVtcCA9IFhUZW1wICogWDsKLSAgICAgICAgICAgIFhUZW1wID0gVGVtcDsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gWTsKLX0KLSNlbHNlCi1MVk1fSU5UMzIgTFZNX1BvbHlub21pYWwoTFZNX1VJTlQxNiAgICBOLAotICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAqcENvZWZmaWNpZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgWCkKLXsKLSAgICBMVk1fSU5UMzIgaTsKLSAgICBMVk1fSU5UMzIgWSxBLFhUZW1wLFRlbXAsc2lnbjsKLQotICAgIFk9KnBDb2VmZmljaWVudHM7IC8qIFk9QTAqLwotICAgIHBDb2VmZmljaWVudHMrKzsKLQotICAgIGlmKChMVk1fVUlOVDMyKVg9PTB4ODAwMDAwMDApCi0gICAgewotICAgICAgICBUZW1wPS0xOwotICAgICAgICBzaWduPVRlbXA7Ci0gICAgICAgIGZvcihpPTE7aTw9TjtpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIFkrPSgoKnBDb2VmZmljaWVudHMpKnNpZ24pOwotICAgICAgICAgICAgcENvZWZmaWNpZW50cysrOwotICAgICAgICAgICAgc2lnbio9VGVtcDsKLSAgICAgICAgfQotCi0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgWFRlbXA9WDsKLSAgICAgICAgZm9yKGk9Ti0xO2k+PTA7aS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBBPSpwQ29lZmZpY2llbnRzOwotICAgICAgICAgICAgcENvZWZmaWNpZW50cysrOwotCi0gICAgICAgICAgICBNVUwzMngzMklOVE8zMihBLFhUZW1wLFRlbXAsMzEpCi0gICAgICAgICAgICBZKz1UZW1wOwotCi0gICAgICAgICAgICBNVUwzMngzMklOVE8zMihYVGVtcCxYLFRlbXAsMzEpCi0gICAgICAgICAgICBYVGVtcD1UZW1wOwotICAgICAgICB9Ci0gICAgfQotICAgIEE9KnBDb2VmZmljaWVudHM7Ci0gICAgcENvZWZmaWNpZW50cysrOwotCi0gICAgaWYoQTwwKQotICAgIHsKLSAgICAgICAgQT1BYnNfMzIoQSk7Ci0gICAgICAgIFk9WT4+QTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgWSA9IFk8PEE7Ci0gICAgfQotICAgIHJldHVybiBZOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG9seW5vbWlhbC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG9seW5vbWlhbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMzZTllYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb2x5bm9taWFsLmNwcApAQCAtMCwwICsxLDgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorI2luY2x1ZGUgIlNjYWxhckFyaXRobWV0aWMuaCIKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIExWTV9Qb2x5bm9taWFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgcG9seW5vbWlhbCBleHBhbnNpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFkgPSAoQTAgKyBBMSpYICsgQTIqWDIgKyBBMypYMyArIO+/vS4uICsgQU4qeE4pIDw8IEFOKzEgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVk1fSU5UMzIgTFZNX1BvbHlub21pYWwoTFZNX1VJTlQxNiAgICBOLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAqcENvZWZmaWNpZW50cywgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgWCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOICAgICAgICAgICAgICAgIGlzIHRoZSBwb2x5bm9taWFsIG9yZGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENvZWZmaWNpZW50cyAgICBpcyB0aGUgcHRyIHRvIHBvbHlub21pYWwgY29lZmZpY2llbnRzIEEwLEExLi4gaW4gUS4zMSAqLworLyogIFggICAgICAgICAgICAgICAgaXMgdGhlIGlucHV0IHZhcmlhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBUaGUgcmVzdWx0IG9mIHRoZSBwb2x5bm9taWFsIGV4cGFuc2lvbiBpbiBRMS4zMSBmb3JtYXQgICAgICAgICAgICAgICAgKi8KKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCitMVk1fRkxPQVQgTFZNX1BvbHlub21pYWwoTFZNX1VJTlQxNiAgICBOLAorICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAqcENvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgWCkKK3sKKyAgICBMVk1fSU5UMzIgaTsKKyAgICBMVk1fRkxPQVQgWSxBLFhUZW1wLFRlbXAsc2lnbjsKKworICAgIFkgPSAqcENvZWZmaWNpZW50czsgLyogWT1BMCovCisgICAgcENvZWZmaWNpZW50cysrOworCisgICAgaWYoWCA9PSAtMS4wZikKKyAgICB7CisgICAgICAgIFRlbXAgPSAtMTsKKyAgICAgICAgc2lnbiA9IFRlbXA7CisgICAgICAgIGZvcihpID0gMTsgaSA8PSBOOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIFkgKz0gKCgqcENvZWZmaWNpZW50cykgKiBzaWduKTsKKyAgICAgICAgICAgIHBDb2VmZmljaWVudHMrKzsKKyAgICAgICAgICAgIHNpZ24gKj0gVGVtcDsKKyAgICAgICAgfQorCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIFhUZW1wID0gWDsKKyAgICAgICAgZm9yKGkgPSBOLTE7IGkgPj0gMDsgaS0tKQorICAgICAgICB7CisgICAgICAgICAgICBBID0gKnBDb2VmZmljaWVudHM7CisgICAgICAgICAgICBwQ29lZmZpY2llbnRzKys7CisKKyAgICAgICAgICAgIFRlbXAgPSBBICogWFRlbXA7CisgICAgICAgICAgICBZICs9IFRlbXA7CisKKyAgICAgICAgICAgIFRlbXAgPSBYVGVtcCAqIFg7CisgICAgICAgICAgICBYVGVtcCA9IFRlbXA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG93ZXIxMC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1Bvd2VyMTAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc4NTU5NC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fUG93ZXIxMC5jCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgotI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLSNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCi0jaW5jbHVkZSAiRmlsdGVyLmgiCi0KLQotLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIExWTV9Qb3dlcjEwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIFRoaXMgZnVuY3Rpb24gY2FsY3VsYXRlcyAxMFggdXNpbmcgYW4gMTF0aCBvcmRlciBwb2x5bm9taWFsLiBJdCB1c2VzICAqLwotLyogICB0aGUgZm9sbG93aW5nIHRhYmxlIG9mIDMyLWJpdCBpbnRlZ2VyIHBvbHlub21pYWwgY29lZmZpY2llbnRzOiAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIENvZWZmaWNpZW50ICAgIFZhbHVlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBBMCAgICAgICAgICAgICA2NzEwMjU0MyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQTEgICAgICAgICAgICAgMzA5MDMyOTk1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEEyICAgICAgICAgICAgIDcxMjA5NjEyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBBMyAgICAgICAgICAgICAxMDkyNzk3MzMxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQTQgICAgICAgICAgICAgMTI1MTYyNTEzNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEE1ICAgICAgICAgICAgIDExNTQ2NDk0NjAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBBNiAgICAgICAgICAgICA5MTU2NTQ4MDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQTcgICAgICAgICAgICAgNTk3ODgzNjgzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEE4ICAgICAgICAgICAgIDI4NDM3ODIzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBBOSAgICAgICAgICAgICAxNTAyNjIwOTcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgQTEwICAgICAgICAgICAgMTI0ODk0NDcxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIEExMSAgICAgICAgICAgIDUwNDc3MjQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBBMTIgICAgICAgICAgICAtMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgWSA9IChBMCArIEExKlggKyBBMipYMiArIEEzKlgzICsg77+9Li4gKyBBTip4TikgPDwgQU4rMSAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFggICAgICAgICAgICAgICBpcyB0aGUgaW5wdXQgdmFyaWFibGUgaW4gUTIuMzAgZm9ybWF0ICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICBUaGUgcmVzdWx0IG9mIHRoZSAxMHggZXhwYW5zaW9uIGluIFE4LjI0IGZvcm1hdCAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0jaWZkZWYgQlVJTERfRkxPQVQKLUxWTV9GTE9BVCBMVk1fUG93ZXIxMChMVk1fRkxPQVQgICAgIFgpCi17Ci0gICAgTFZNX0ZMT0FUIFksQ29lZmZpY2llbnRzWzEzXT17MC45OTk5MDZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMzAyNDc1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjY1Mjc2NWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wMzU0OTRmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTY1NjY3ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUzNzY3NmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMTMxOTJmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDY5NjAzZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAxNjU1M2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDQzNzNmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxODE3ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDM2N2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMH07Ci0gICAgWT1MVk1fUG9seW5vbWlhbCgoTFZNX1VJTlQxNikxMSwKLSAgICAgICAgICAgICAgICAgICAgIENvZWZmaWNpZW50cywKLSAgICAgICAgICAgICAgICAgICAgIFgpOwotICAgIHJldHVybiBZOwotfQotI2Vsc2UKLUxWTV9JTlQzMiBMVk1fUG93ZXIxMChMVk1fSU5UMzIgICAgIFgpCi17Ci0gICAgTFZNX0lOVDMyIFksQ29lZmZpY2llbnRzWzEzXT17ICAxNjc3NTYzNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NzI1ODI0OSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3ODAyNDAzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI3MzE5OTMzMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMxMjkwNjI4NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4ODY2MjM2NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyODkxMzcwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE0OTQ3MDkyMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTA5NDU1OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNzU2NTUyNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMTIyMzYxOCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjYxOTMxMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwfTsKLSAgICBZPUxWTV9Qb2x5bm9taWFsKChMVk1fVUlOVDE2KTExLAotICAgICAgICAgICAgICAgICAgICAgICAgQ29lZmZpY2llbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgWCk7Ci0gICAgcmV0dXJuIFk7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb3dlcjEwLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9Qb3dlcjEwLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZThlOWQxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1Bvd2VyMTAuY3BwCkBAIC0wLDAgKzEsNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJMVk1fVHlwZXMuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisjaW5jbHVkZSAiU2NhbGFyQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkZpbHRlci5oIgorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgTFZNX1Bvd2VyMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgVGhpcyBmdW5jdGlvbiBjYWxjdWxhdGVzIDEwWCB1c2luZyBhbiAxMXRoIG9yZGVyIHBvbHlub21pYWwuIEl0IHVzZXMgICovCisvKiAgIHRoZSBmb2xsb3dpbmcgdGFibGUgb2YgMzItYml0IGludGVnZXIgcG9seW5vbWlhbCBjb2VmZmljaWVudHM6ICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQ29lZmZpY2llbnQgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEEwICAgICAgICAgICAgIDY3MTAyNTQzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBMSAgICAgICAgICAgICAzMDkwMzI5OTUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTIgICAgICAgICAgICAgNzEyMDk2MTI3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEEzICAgICAgICAgICAgIDEwOTI3OTczMzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBNCAgICAgICAgICAgICAxMjUxNjI1MTM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTUgICAgICAgICAgICAgMTE1NDY0OTQ2MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE2ICAgICAgICAgICAgIDkxNTY1NDgwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBNyAgICAgICAgICAgICA1OTc4ODM2ODMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTggICAgICAgICAgICAgMjg0Mzc4MjMwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEE5ICAgICAgICAgICAgIDE1MDI2MjA5NyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBBMTAgICAgICAgICAgICAxMjQ4OTQ0NzEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgQTExICAgICAgICAgICAgNTA0NzcyNDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIEExMiAgICAgICAgICAgIC0yICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBZID0gKEEwICsgQTEqWCArIEEyKlgyICsgQTMqWDMgKyDvv70uLiArIEFOKnhOKSA8PCBBTisxICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgWCAgICAgICAgICAgICAgIGlzIHRoZSBpbnB1dCB2YXJpYWJsZSBpbiBRMi4zMCBmb3JtYXQgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgIFRoZSByZXN1bHQgb2YgdGhlIDEweCBleHBhbnNpb24gaW4gUTguMjQgZm9ybWF0ICAgICAgICAgICAgICAgICAgICAgICAqLworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KK0xWTV9GTE9BVCBMVk1fUG93ZXIxMChMVk1fRkxPQVQgICAgIFgpCit7CisgICAgTFZNX0ZMT0FUIFksQ29lZmZpY2llbnRzWzEzXT17MC45OTk5MDZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMzAyNDc1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjY1Mjc2NWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4wMzU0OTRmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTY1NjY3ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUzNzY3NmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMTMxOTJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDY5NjAzZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAxNjU1M2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDQzNzNmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAxODE3ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDM2N2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMH07CisgICAgWT1MVk1fUG9seW5vbWlhbCgoTFZNX1VJTlQxNikxMSwKKyAgICAgICAgICAgICAgICAgICAgIENvZWZmaWNpZW50cywKKyAgICAgICAgICAgICAgICAgICAgIFgpOworICAgIHJldHVybiBZOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXIuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXIuYwpyZW5hbWUgdG8gbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9UaW1lcl9Jbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MzVjZmUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyX0luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogIElOQ0xVREUgRklMRVMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIkxWTV9UaW1lci5oIgotI2luY2x1ZGUgIkxWTV9UaW1lcl9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICBERUZJTklUSU9OUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgT25lT3ZlclRob3VzYW5kSW5RMjQgMTY3NzcKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgSU5JVCBGVU5DVElPTiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIExWTV9UaW1lcl9Jbml0ICggICBMVk1fVGltZXJfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1RpbWVyX1BhcmFtc190ICAgICAgICAgKnBQYXJhbXMgICAgICl7Ci0KLSAgICBMVk1fVGltZXJfSW5zdGFuY2VfUHJpdmF0ZV90ICpwSW5zdGFuY2VQcjsKLSAgICBwSW5zdGFuY2VQciA9IChMVk1fVGltZXJfSW5zdGFuY2VfUHJpdmF0ZV90ICopcEluc3RhbmNlOwotCi0gICAgcEluc3RhbmNlUHItPkNhbGxCYWNrUGFyYW0gICAgID0gcFBhcmFtcy0+Q2FsbEJhY2tQYXJhbTsKLSAgICBwSW5zdGFuY2VQci0+cENhbGxCYWNrUGFyYW1zICAgPSBwUGFyYW1zLT5wQ2FsbEJhY2tQYXJhbXM7Ci0gICAgcEluc3RhbmNlUHItPnBDYWxsYmFja0luc3RhbmNlID0gcFBhcmFtcy0+cENhbGxiYWNrSW5zdGFuY2U7Ci0gICAgcEluc3RhbmNlUHItPnBDYWxsQmFjayAgICAgICAgID0gcFBhcmFtcy0+cENhbGxCYWNrOwotICAgIHBJbnN0YW5jZVByLT5UaW1lckFybWVkICAgICAgICA9IDE7Ci0KLSAgICBNVUwzMngxNklOVE8zMihwUGFyYW1zLT5TYW1wbGluZ1JhdGUsT25lT3ZlclRob3VzYW5kSW5RMjQscEluc3RhbmNlUHItPlJlbWFpbmluZ1RpbWVJblNhbXBsZXMsMTYpOyAgLyogKFEwICogUTI0KSA+PjE2IGludG8gUTgqLwotICAgIE1VTDMyeDE2SU5UTzMyKHBJbnN0YW5jZVByLT5SZW1haW5pbmdUaW1lSW5TYW1wbGVzLHBQYXJhbXMtPlRpbWVJbk1zLHBJbnN0YW5jZVByLT5SZW1haW5pbmdUaW1lSW5TYW1wbGVzLDgpOyAgLyogKFE4ICogUTApID4+OCBpbnRvIFEwKi8KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgRU5EIE9GIEZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyX0luaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMTUwNTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXJfSW5pdC5jcHAKQEAgLTAsMCArMSw1NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgSU5DTFVERSBGSUxFUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZNX1RpbWVyLmgiCisjaW5jbHVkZSAiTFZNX1RpbWVyX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBPbmVPdmVyVGhvdXNhbmRJblEyNCAxNjc3NworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICBJTklUIEZVTkNUSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTFZNX1RpbWVyX0luaXQgKCAgIExWTV9UaW1lcl9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVGltZXJfUGFyYW1zX3QgICAgICAgICAqcFBhcmFtcyAgICAgKXsKKworICAgIExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QgKnBJbnN0YW5jZVByOworICAgIHBJbnN0YW5jZVByID0gKExWTV9UaW1lcl9JbnN0YW5jZV9Qcml2YXRlX3QgKilwSW5zdGFuY2U7CisKKyAgICBwSW5zdGFuY2VQci0+Q2FsbEJhY2tQYXJhbSAgICAgPSBwUGFyYW1zLT5DYWxsQmFja1BhcmFtOworICAgIHBJbnN0YW5jZVByLT5wQ2FsbEJhY2tQYXJhbXMgICA9IChMVk1fSU5UMzIgKilwUGFyYW1zLT5wQ2FsbEJhY2tQYXJhbXM7CisgICAgcEluc3RhbmNlUHItPnBDYWxsYmFja0luc3RhbmNlID0gcFBhcmFtcy0+cENhbGxiYWNrSW5zdGFuY2U7CisgICAgcEluc3RhbmNlUHItPnBDYWxsQmFjayAgICAgICAgID0gcFBhcmFtcy0+cENhbGxCYWNrOworICAgIHBJbnN0YW5jZVByLT5UaW1lckFybWVkICAgICAgICA9IDE7CisKKyAgICBNVUwzMngxNklOVE8zMihwUGFyYW1zLT5TYW1wbGluZ1JhdGUsT25lT3ZlclRob3VzYW5kSW5RMjQscEluc3RhbmNlUHItPlJlbWFpbmluZ1RpbWVJblNhbXBsZXMsMTYpOyAgLyogKFEwICogUTI0KSA+PjE2IGludG8gUTgqLworICAgIE1VTDMyeDE2SU5UTzMyKHBJbnN0YW5jZVByLT5SZW1haW5pbmdUaW1lSW5TYW1wbGVzLHBQYXJhbXMtPlRpbWVJbk1zLHBJbnN0YW5jZVByLT5SZW1haW5pbmdUaW1lSW5TYW1wbGVzLDgpOyAgLyogKFE4ICogUTApID4+OCBpbnRvIFEwKi8KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgRU5EIE9GIEZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL0xWTV9UaW1lcl9Qcml2YXRlLmgKaW5kZXggNDgwOTQ0Zi4uYTM3MmI4MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTFZNX1RpbWVyX1ByaXZhdGUuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9MVk1fVGltZXJfUHJpdmF0ZS5oCkBAIC0xOCwxMiArMTgsNiBAQAogI2lmbmRlZiBMVk1fVElNRVJfUFJJVkFURV9ICiAjZGVmaW5lIExWTV9USU1FUl9QUklWQVRFX0gKIAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQogI2luY2x1ZGUgIkxWTV9UeXBlcy5oIgogCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQ1LDggKzM5LDQgQEAKIC8qICBFTkQgT0YgSEVBREVSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KICNlbmRpZiAgLyogTFZNX1RJTUVSX1BSSVZBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMTYuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMTYuYwpyZW5hbWUgdG8gbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzE2LmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUxNGMzYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuYworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICBJTkNMVURFIEZJTEVTCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIExvYWRDb25zdF8zMgotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTG9hZENvbnN0X0Zsb2F0KGNvbnN0IExWTV9GTE9BVCAgIHZhbCwKLSAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuICkKLXsKLSAgICBMVk1fSU5UMTYgaWk7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgICpkc3QgPSB2YWw7Ci0gICAgICAgIGRzdCsrOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLSNlbHNlCi12b2lkIExvYWRDb25zdF8zMihjb25zdCBMVk1fSU5UMzIgICB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbiApCi17Ci0gICAgTFZNX0lOVDE2IGlpOwotCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgewotICAgICAgICAqZHN0ID0gdmFsOwotICAgICAgICBkc3QrKzsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Mb2FkQ29uc3RfMzIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzg5NzU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTG9hZENvbnN0XzMyLmNwcApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBMb2FkQ29uc3RfMzIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMb2FkQ29uc3RfRmxvYXQoY29uc3QgTFZNX0ZMT0FUICAgdmFsLAorICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4gKQoreworICAgIExWTV9JTlQxNiBpaTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgKmRzdCA9IHZhbDsKKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDJjOTA2YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREUgRklMRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gIE1TVE8ySV9TQVRfMTZYMTYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIE1TVG8yaV9TYXRfMTZ4MTYoY29uc3QgTFZNX0lOVDE2ICAqc3JjTSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICpzcmNTLAotICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQotewotICAgIExWTV9JTlQzMiB0ZW1wLG1WYWwsc1ZhbDsKLSAgICBMVk1fSU5UMTYgaWk7Ci0KLQotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKLSAgICAgICAgbVZhbD0oTFZNX0lOVDMyKSpzcmNNOwotICAgICAgICBzcmNNKys7Ci0KLSAgICAgICAgc1ZhbD0oTFZNX0lOVDMyKSpzcmNTOwotICAgICAgICBzcmNTKys7Ci0KLSAgICAgICAgdGVtcCA9IG1WYWwgKyBzVmFsOwotCi0gICAgICAgIGlmICh0ZW1wID4gMHgwMDAwN0ZGRikKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IDB4N0ZGRjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0ZW1wIDwgLTB4MDAwMDgwMDApCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAtIDB4ODAwMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KXRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgZHN0Kys7Ci0KLSAgICAgICAgdGVtcCA9IG1WYWwgLSBzVmFsOwotCi0gICAgICAgIGlmICh0ZW1wID4gMHgwMDAwN0ZGRikKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IDB4N0ZGRjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0ZW1wIDwgLTB4MDAwMDgwMDApCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAtIDB4ODAwMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KXRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgZHN0Kys7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIE1TVG8yaV9TYXRfRmxvYXQoY29uc3QgTFZNX0ZMT0FUICAqc3JjTSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICpzcmNTLAotICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQotewotICAgIExWTV9GTE9BVCB0ZW1wLG1WYWwsc1ZhbDsKLSAgICBMVk1fSU5UMTYgaWk7Ci0KLQotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKLSAgICAgICAgbVZhbCA9IChMVk1fRkxPQVQpKnNyY007Ci0gICAgICAgIHNyY00rKzsKLQotICAgICAgICBzVmFsID0gKExWTV9GTE9BVCkqc3JjUzsKLSAgICAgICAgc3JjUysrOwotCi0gICAgICAgIHRlbXAgPSBtVmFsICsgc1ZhbDsKLQotICAgICAgICBpZiAodGVtcCA+IDEuMGYpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAxLjBmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHRlbXAgPCAtMS4wZikKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IC0xLjBmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IChMVk1fRkxPQVQpdGVtcDsKLSAgICAgICAgfQotICAgICAgICBkc3QrKzsKLQotICAgICAgICB0ZW1wID0gbVZhbCAtIHNWYWw7Ci0KLSAgICAgICAgaWYgKHRlbXAgPiAxLjBmKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gMS4wZjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICh0ZW1wIDwgLTEuMGYpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAtIDEuMGY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gKExWTV9GTE9BVCl0ZW1wOwotICAgICAgICB9Ci0gICAgICAgIGRzdCsrOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLSNlbmRpZgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01TVG8yaV9TYXRfMTZ4MTYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlYTc2NWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NU1RvMmlfU2F0XzE2eDE2LmNwcApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gIE1TVE8ySV9TQVRfMTZYMTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIE1TVG8yaV9TYXRfMTZ4MTYoY29uc3QgTFZNX0lOVDE2ICAqc3JjTSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICpzcmNTLAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIG4gKQoreworICAgIExWTV9JTlQzMiB0ZW1wLG1WYWwsc1ZhbDsKKyAgICBMVk1fSU5UMTYgaWk7CisKKyAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKKyAgICB7CisgICAgICAgIG1WYWw9KExWTV9JTlQzMikqc3JjTTsKKyAgICAgICAgc3JjTSsrOworCisgICAgICAgIHNWYWw9KExWTV9JTlQzMikqc3JjUzsKKyAgICAgICAgc3JjUysrOworCisgICAgICAgIHRlbXAgPSBtVmFsICsgc1ZhbDsKKworICAgICAgICBpZiAodGVtcCA+IDB4MDAwMDdGRkYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAweDdGRkY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gLSAweDgwMDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKExWTV9JTlQxNil0ZW1wOworICAgICAgICB9CisgICAgICAgIGRzdCsrOworCisgICAgICAgIHRlbXAgPSBtVmFsIC0gc1ZhbDsKKworICAgICAgICBpZiAodGVtcCA+IDB4MDAwMDdGRkYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAweDdGRkY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAodGVtcCA8IC0weDAwMDA4MDAwKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gLSAweDgwMDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKExWTV9JTlQxNil0ZW1wOworICAgICAgICB9CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KK3ZvaWQgTVNUbzJpX1NhdF9GbG9hdChjb25zdCBMVk1fRkxPQVQgICpzcmNNLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgKnNyY1MsCisgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgbiApCit7CisgICAgTFZNX0ZMT0FUIHRlbXAsbVZhbCxzVmFsOworICAgIExWTV9JTlQxNiBpaTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgbVZhbCA9IChMVk1fRkxPQVQpKnNyY007CisgICAgICAgIHNyY00rKzsKKworICAgICAgICBzVmFsID0gKExWTV9GTE9BVCkqc3JjUzsKKyAgICAgICAgc3JjUysrOworCisgICAgICAgIHRlbXAgPSBtVmFsICsgc1ZhbDsKKworICAgICAgICBpZiAodGVtcCA+IDEuMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAxLjBmOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHRlbXAgPCAtMS4wZikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IC0xLjBmOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IChMVk1fRkxPQVQpdGVtcDsKKyAgICAgICAgfQorICAgICAgICBkc3QrKzsKKworICAgICAgICB0ZW1wID0gbVZhbCAtIHNWYWw7CisKKyAgICAgICAgaWYgKHRlbXAgPiAxLjBmKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gMS4wZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0ZW1wIDwgLTEuMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgICpkc3QgPSAtIDEuMGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gKExWTV9GTE9BVCl0ZW1wOworICAgICAgICB9CisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzE2eDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMTZ4MTYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWYwNGFlOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMTZ4MTYuYworKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0KLSAgICAgJWNyZWF0ZWRfYnk6ICAgIHNyYSAlIChDTS9TKQotICAgICAlbmFtZTogICAgICAgICAgTWFjM3NfU2F0XzE2eDE2LmMgJSAoQ00vUykKLSAgICAgJXZlcnNpb246ICAgICAgIDEgJSAoQ00vUykKLSAgICAgJWRhdGVfY3JlYXRlZDogIEZyaSBOb3YgMTMgMTI6MDc6MTMgMjAwOSAlIChDTS9TKQotCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREUgRklMRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgotI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIE1hYzNTXzE2WDE2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBNYWMzc19TYXRfMTZ4MTYoIGNvbnN0IExWTV9JTlQxNiAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKLSAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCi17Ci0gICAgTFZNX0lOVDE2IGlpOwotICAgIExWTV9JTlQxNiBzcmN2YWw7Ci0gICAgTFZNX0lOVDMyIFRlbXAsZEluVmFsOwotCi0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIHNyY3ZhbD0qc3JjOwotICAgICAgICBzcmMrKzsKLQotICAgICAgICBUZW1wID0gKHNyY3ZhbCAqdmFsKT4+MTU7Ci0KLSAgICAgICAgZEluVmFsICA9IChMVk1fSU5UMzIpKmRzdDsKLQotICAgICAgICBUZW1wID0gVGVtcCArIGRJblZhbDsKLQotICAgICAgICBpZiAoVGVtcCA+IDB4MDAwMDdGRkYpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAweDdGRkY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0weDAwMDA4MDAwKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gLSAweDgwMDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gKExWTV9JTlQxNilUZW1wOwotICAgICAgICB9Ci0KLSAgICAgICAgZHN0Kys7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8xNngxNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMTZ4MTYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ODQyNTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMTZ4MTYuY3BwCkBAIC0wLDAgKzEsNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgJWNyZWF0ZWRfYnk6ICAgIHNyYSAlIChDTS9TKQorICAgICAlbmFtZTogICAgICAgICAgTWFjM3NfU2F0XzE2eDE2LmMgJSAoQ00vUykKKyAgICAgJXZlcnNpb246ICAgICAgIDEgJSAoQ00vUykKKyAgICAgJWRhdGVfY3JlYXRlZDogIEZyaSBOb3YgMTMgMTI6MDc6MTMgMjAwOSAlIChDTS9TKQorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIE1hYzNTXzE2WDE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBNYWMzc19TYXRfMTZ4MTYoIGNvbnN0IExWTV9JTlQxNiAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCit7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9JTlQxNiBzcmN2YWw7CisgICAgTFZNX0lOVDMyIFRlbXAsZEluVmFsOworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBzcmN2YWw9KnNyYzsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgVGVtcCA9IChzcmN2YWwgKnZhbCk+PjE1OworCisgICAgICAgIGRJblZhbCAgPSAoTFZNX0lOVDMyKSpkc3Q7CisKKyAgICAgICAgVGVtcCA9IFRlbXAgKyBkSW5WYWw7CisKKyAgICAgICAgaWYgKFRlbXAgPiAweDAwMDA3RkZGKQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gMHg3RkZGOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKFRlbXAgPCAtMHgwMDAwODAwMCkKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IC0gMHg4MDAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IChMVk1fSU5UMTYpVGVtcDsKKyAgICAgICAgfQorCisgICAgICAgIGRzdCsrOworICAgIH0KKworICAgIHJldHVybjsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE3ZmQ4MzMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWFjM3NfU2F0XzMyeDE2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREUgRklMRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgotI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIE1BQzNTXzE2WDE2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBNYWMzc19TYXRfMzJ4MTYoICBjb25zdCBMVk1fSU5UMzIgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiB2YWwsCi0gICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQotewotICAgIExWTV9JTlQxNiBpaTsKLSAgICBMVk1fSU5UMzIgc3JjdmFsLHRlbXAsIGRJblZhbCwgZE91dFZhbDsKLQotCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgewotICAgICAgICBzcmN2YWw9KnNyYzsKLSAgICAgICAgc3JjKys7Ci0KLSAgICAgICAgTVVMMzJ4MTZJTlRPMzIoc3JjdmFsLHZhbCx0ZW1wLDE1KQotCi0gICAgICAgICAgICBkSW5WYWwgID0gKmRzdDsKLSAgICAgICAgZE91dFZhbCA9IHRlbXAgKyBkSW5WYWw7Ci0KLQotICAgICAgICBpZiAoKCgoZE91dFZhbCBeIHRlbXApICYgKGRPdXRWYWwgXiBkSW5WYWwpKSA+PiAzMSkhPTApICAgICAvKiBvdmVyZmxvdyAvIHVuZGVyZmxvdyAqLwotICAgICAgICB7Ci0gICAgICAgICAgICBpZih0ZW1wPDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZE91dFZhbD0weDgwMDAwMDAwTDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkT3V0VmFsPTB4N0ZGRkZGRkZMOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgKmRzdCA9IGRPdXRWYWw7Ci0gICAgICAgIGRzdCsrOwotICAgIH0KLQotICAgIHJldHVybjsKLX0KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBNYWMzc19TYXRfRmxvYXQoY29uc3QgTFZNX0ZMT0FUICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgdmFsLAotICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKLXsKLSAgICBMVk1fSU5UMTYgaWk7Ci0gICAgTFZNX0ZMT0FUIHNyY3ZhbDsKLSAgICBMVk1fRkxPQVQgVGVtcCxkSW5WYWw7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIHNyY3ZhbCA9ICpzcmM7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgIFRlbXAgPSBzcmN2YWwgKiB2YWw7Ci0KLSAgICAgICAgZEluVmFsICA9IChMVk1fRkxPQVQpKmRzdDsKLSAgICAgICAgVGVtcCA9IFRlbXAgKyBkSW5WYWw7Ci0KLSAgICAgICAgaWYgKFRlbXAgPiAxLjAwMDAwMGYpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAxLjAwMDAwMGY7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoVGVtcCA8IC0xLjAwMDAwMGYpCi0gICAgICAgIHsKLSAgICAgICAgICAgICpkc3QgPSAtMS4wMDAwMDBmOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgKmRzdCA9IFRlbXA7Ci0gICAgICAgIH0KLSAgICAgICAgZHN0Kys7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01hYzNzX1NhdF8zMngxNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNTU2NGYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NYWMzc19TYXRfMzJ4MTYuY3BwCkBAIC0wLDAgKzEsMTAyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTUFDM1NfMTZYMTYKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCit2b2lkIE1hYzNzX1NhdF8zMngxNiggIGNvbnN0IExWTV9JTlQzMiAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCit7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9JTlQzMiBzcmN2YWwsdGVtcCwgZEluVmFsLCBkT3V0VmFsOworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICBzcmN2YWw9KnNyYzsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgTVVMMzJ4MTZJTlRPMzIoc3JjdmFsLHZhbCx0ZW1wLDE1KQorCisgICAgICAgICAgICBkSW5WYWwgID0gKmRzdDsKKyAgICAgICAgZE91dFZhbCA9IHRlbXAgKyBkSW5WYWw7CisKKyAgICAgICAgaWYgKCgoKGRPdXRWYWwgXiB0ZW1wKSAmIChkT3V0VmFsIF4gZEluVmFsKSkgPj4gMzEpIT0wKSAgICAgLyogb3ZlcmZsb3cgLyB1bmRlcmZsb3cgKi8KKyAgICAgICAgeworICAgICAgICAgICAgaWYodGVtcDwwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGRPdXRWYWw9MHg4MDAwMDAwMEw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZE91dFZhbD0weDdGRkZGRkZGTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgICpkc3QgPSBkT3V0VmFsOworICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9Cit2b2lkIE1hYzNzX1NhdF9GbG9hdChjb25zdCBMVk1fRkxPQVQgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCB2YWwsCisgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQoreworICAgIExWTV9JTlQxNiBpaTsKKyAgICBMVk1fRkxPQVQgc3JjdmFsOworICAgIExWTV9GTE9BVCBUZW1wLGRJblZhbDsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgc3JjdmFsID0gKnNyYzsKKyAgICAgICAgc3JjKys7CisKKyAgICAgICAgVGVtcCA9IHNyY3ZhbCAqIHZhbDsKKworICAgICAgICBkSW5WYWwgID0gKExWTV9GTE9BVCkqZHN0OworICAgICAgICBUZW1wID0gVGVtcCArIGRJblZhbDsKKworICAgICAgICBpZiAoVGVtcCA+IDEuMDAwMDAwZikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IDEuMDAwMDAwZjsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChUZW1wIDwgLTEuMDAwMDAwZikKKyAgICAgICAgeworICAgICAgICAgICAgKmRzdCA9IC0xLjAwMDAwMGY7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICAqZHN0ID0gVGVtcDsKKyAgICAgICAgfQorICAgICAgICBkc3QrKzsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peEluU29mdF9EMzJDMzFfU0FULmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZTM2N2IuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuYworKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgSU5DTFVERSBGSUxFUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJNaXhlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgREVGSU5JVElPTlMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFRSVUUgICAgICAgICAgMQotI2RlZmluZSBGQUxTRSAgICAgICAgIDAKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIEZVTkNUSU9OIE1JWElOU09GVF9EMzJDMzFfU0FUCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBNaXhJblNvZnRfRDMyQzMxX1NBVCggTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgbikKLXsKLSAgICBjaGFyIEhhcmRNaXhpbmcgPSBUUlVFOwotCi0gICAgaWYobiA8PSAwKSAgICByZXR1cm47Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgU09GVCBNSVhJTkcKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCi0gICAgewotICAgICAgICBpZihwSW5zdGFuY2UtPkFscGhhID09IDApewotICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7Ci0gICAgICAgIH1lbHNlIGlmICgocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0IDwgUE9JTlRfWkVST19PTkVfREJfRkxPQVQpICYmCi0gICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKXsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCi0gICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7Ci0gICAgICAgICAgICBDb3JlX01peEluU29mdF9EMzJDMzFfU0FUKHBJbnN0YW5jZSwgc3JjLCBkc3QsIG4pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgIEhBUkQgTUlYSU5HCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGlmIChIYXJkTWl4aW5nKXsKLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ICE9IDApeyAvKiBOb3RoaW5nIHRvIGRvIGluIGNhc2UgVGFyZ2V0ID0gMCAqLwotICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPlRhcmdldCkgPT0gMS4wZikKLSAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChzcmMsIGRzdCwgbik7Ci0gICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQocEluc3RhbmNlLCBzcmMsIGRzdCwgbik7Ci0gICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIEluIGNhc2UgdGhlIGNvcmUgZnVuY3Rpb24gd291bGQgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXZlIGNoYW5nZWQgdGhlIEN1cnJlbnQgdmFsdWUgKi8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICBDQUxMIEJBQ0sKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIENhbGwgYmFjayBiZWZvcmUgdGhlIGhhcmQgbWl4aW5nLCBiZWNhdXNlIGluIHRoaXMgY2FzZSwgaGFyZCBtaXhpbmcgbWFrZXMKLSAgICAgICB1c2Ugb2YgdGhlIGNvcmUgc29mdCBtaXggZnVuY3Rpb24gd2hpY2ggY2FuIGNoYW5nZSB0aGUgQ3VycmVudCB2YWx1ZSEgICAgICAqLwotCi0gICAgaWYgKHBJbnN0YW5jZS0+Q2FsbGJhY2tTZXQpewotICAgICAgICBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0IDwgUE9JTlRfWkVST19PTkVfREJfRkxPQVQpICYmCi0gICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKXsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLwotICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1NldCA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cENhbGxCYWNrICE9IDApewotICAgICAgICAgICAgICAgICgqcEluc3RhbmNlLT5wQ2FsbEJhY2spICggcEluc3RhbmNlLT5wQ2FsbGJhY2tIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPnBHZW5lcmFsUHVycG9zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q2FsbGJhY2tQYXJhbSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotI2Vsc2UKLXZvaWQgTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoIE1peF8xU3RfQ2xsX3QgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgIG4pCi17Ci0gICAgY2hhciBIYXJkTWl4aW5nID0gVFJVRTsKLQotICAgIGlmKG48PTApICAgIHJldHVybjsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICBTT0ZUIE1JWElORwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkKLSAgICB7Ci0gICAgICAgIGlmKHBJbnN0YW5jZS0+QWxwaGEgPT0gMCl7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKLSAgICAgICAgfWVsc2UgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQgPFBPSU5UX1pFUk9fT05FX0RCKSYmCi0gICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREIpKXsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiAgTWFrZSB0aGVtIGVxdWFsLiAqLwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCi0gICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7Ci0gICAgICAgICAgICBDb3JlX01peEluU29mdF9EMzJDMzFfU0FUKCBwSW5zdGFuY2UsIHNyYywgZHN0LCBuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICBIQVJEIE1JWElORwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBpZiAoSGFyZE1peGluZyl7Ci0gICAgICAgIGlmIChwSW5zdGFuY2UtPlRhcmdldCAhPSAwKXsgLyogTm90aGluZyB0byBkbyBpbiBjYXNlIFRhcmdldCA9IDAgKi8KLSAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5UYXJnZXQ+PjE2KSA9PSAweDdGRkYpCi0gICAgICAgICAgICAgICAgQWRkMl9TYXRfMzJ4MzIoIHNyYywgZHN0LCBuICk7Ci0gICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQoIHBJbnN0YW5jZSwgc3JjLCBkc3QsIG4pOwotICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBJbiBjYXNlIHRoZSBjb3JlIGZ1bmN0aW9uIHdvdWxkIGhhdmUgY2hhbmdlZCB0aGUgQ3VycmVudCB2YWx1ZSAqLwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgIENBTEwgQkFDSwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogQ2FsbCBiYWNrIGJlZm9yZSB0aGUgaGFyZCBtaXhpbmcsIGJlY2F1c2UgaW4gdGhpcyBjYXNlLCBoYXJkIG1peGluZyBtYWtlcwotICAgICAgIHVzZSBvZiB0aGUgY29yZSBzb2Z0IG1peCBmdW5jdGlvbiB3aGljaCBjYW4gY2hhbmdlIHRoZSBDdXJyZW50IHZhbHVlISAgICAgICovCi0KLSAgICBpZiAocEluc3RhbmNlLT5DYWxsYmFja1NldCl7Ci0gICAgICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50LXBJbnN0YW5jZS0+VGFyZ2V0IDxQT0lOVF9aRVJPX09ORV9EQikmJgotICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQikpewotICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuICBNYWtlIHRoZW0gZXF1YWwuICovCi0gICAgICAgICAgICBwSW5zdGFuY2UtPkNhbGxiYWNrU2V0ID0gRkFMU0U7Ci0gICAgICAgICAgICBpZiAocEluc3RhbmNlLT5wQ2FsbEJhY2sgIT0gMCl7Ci0gICAgICAgICAgICAgICAgKCpwSW5zdGFuY2UtPnBDYWxsQmFjaykgKCBwSW5zdGFuY2UtPnBDYWxsYmFja0hhbmRsZSwgcEluc3RhbmNlLT5wR2VuZXJhbFB1cnBvc2UscEluc3RhbmNlLT5DYWxsYmFja1BhcmFtICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0jZW5kaWYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4SW5Tb2Z0X0QzMkMzMV9TQVQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjN2IzNmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhJblNvZnRfRDMyQzMxX1NBVC5jcHAKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIERFRklOSVRJT05TCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBUUlVFICAgICAgICAgIDEKKyNkZWZpbmUgRkFMU0UgICAgICAgICAwCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBNSVhJTlNPRlRfRDMyQzMxX1NBVAorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIE1peEluU29mdF9EMzJDMzFfU0FUKCBNaXhfMVN0X0NsbF9GTE9BVF90ICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICBuKQoreworICAgIGNoYXIgSGFyZE1peGluZyA9IFRSVUU7CisKKyAgICBpZihuIDw9IDApICAgIHJldHVybjsKKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBTT0ZUIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkKKyAgICB7CisgICAgICAgIGlmKHBJbnN0YW5jZS0+QWxwaGEgPT0gMCl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKKyAgICAgICAgfWVsc2UgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQgPCBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkgJiYKKyAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgIH1lbHNleworICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KKyAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKKyAgICAgICAgICAgIENvcmVfTWl4SW5Tb2Z0X0QzMkMzMV9TQVQocEluc3RhbmNlLCBzcmMsIGRzdCwgbik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSEFSRCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYgKEhhcmRNaXhpbmcpeworICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgIT0gMCl7IC8qIE5vdGhpbmcgdG8gZG8gaW4gY2FzZSBUYXJnZXQgPSAwICovCisgICAgICAgICAgICBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSA9PSAxLjBmKQorICAgICAgICAgICAgICAgIEFkZDJfU2F0X0Zsb2F0KHNyYywgZHN0LCBuKTsKKyAgICAgICAgICAgIGVsc2V7CisgICAgICAgICAgICAgICAgQ29yZV9NaXhJblNvZnRfRDMyQzMxX1NBVChwSW5zdGFuY2UsIHNyYywgZHN0LCBuKTsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogSW4gY2FzZSB0aGUgY29yZSBmdW5jdGlvbiB3b3VsZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhdmUgY2hhbmdlZCB0aGUgQ3VycmVudCB2YWx1ZSAqLworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgLyogQ2FsbCBiYWNrIGJlZm9yZSB0aGUgaGFyZCBtaXhpbmcsIGJlY2F1c2UgaW4gdGhpcyBjYXNlLCBoYXJkIG1peGluZyBtYWtlcworICAgICAgIHVzZSBvZiB0aGUgY29yZSBzb2Z0IG1peCBmdW5jdGlvbiB3aGljaCBjYW4gY2hhbmdlIHRoZSBDdXJyZW50IHZhbHVlISAgICAgICovCisKKyAgICBpZiAocEluc3RhbmNlLT5DYWxsYmFja1NldCl7CisgICAgICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPCBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkgJiYKKyAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5wQ2FsbEJhY2sgIT0gMCl7CisgICAgICAgICAgICAgICAgKCpwSW5zdGFuY2UtPnBDYWxsQmFjaykgKCBwSW5zdGFuY2UtPnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMVN0X0QzMkMzMV9XUkEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODY5MjkzYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREUgRklMRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIERFRklOSVRJT05TCi0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBUUlVFICAgICAgICAgIDEKLSNkZWZpbmUgRkFMU0UgICAgICAgICAwCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gTUlYU09GVF8xU1RfRDMyQzMxX1dSQQotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggICAgTWl4XzFTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQotewotICAgIGNoYXIgSGFyZE1peGluZyA9IFRSVUU7Ci0KLSAgICBpZihuIDw9IDApICAgIHJldHVybjsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICBTT0ZUIE1JWElORwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudCAhPSBwSW5zdGFuY2UtPlRhcmdldCkKLSAgICB7Ci0gICAgICAgIGlmKHBJbnN0YW5jZS0+QWxwaGEgPT0gMCl7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsKLSAgICAgICAgfWVsc2UgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA8IFBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSAmJgotICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREJfRkxPQVQpKXsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFrZSB0aGVtIGVxdWFsLiAqLwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIC8qIFNvZnQgbWl4aW5nIGhhcyB0byBiZSBhcHBsaWVkICovCi0gICAgICAgICAgICBIYXJkTWl4aW5nID0gRkFMU0U7Ci0gICAgICAgICAgICBDb3JlX01peFNvZnRfMVN0X0QzMkMzMV9XUkEocEluc3RhbmNlLCBzcmMsIGRzdCwgbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgSEFSRCBNSVhJTkcKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgaWYgKEhhcmRNaXhpbmcpewotICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPT0gMCkKLSAgICAgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBkc3QsIG4pOwotICAgICAgICBlbHNlIGlmICgocEluc3RhbmNlLT5UYXJnZXQpID09IDEuMGYpewotICAgICAgICAgICAgaWYgKHNyYyAhPSBkc3QpCi0gICAgICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUKilzcmMsIChMVk1fRkxPQVQqKWRzdCwgKExWTV9JTlQxNikobikpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIE11bHQzc19GbG9hdChzcmMsIHBJbnN0YW5jZS0+Q3VycmVudCwgZHN0LCBuKTsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgQ0FMTCBCQUNLCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGlmIChwSW5zdGFuY2UtPkNhbGxiYWNrU2V0KXsKLSAgICAgICAgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA8IFBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSAmJgotICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0ID4gLVBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSl7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KLSAgICAgICAgICAgIHBJbnN0YW5jZS0+Q2FsbGJhY2tTZXQgPSBGQUxTRTsKLSAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPnBDYWxsQmFjayAhPSAwKXsKLSAgICAgICAgICAgICAgICAoKnBJbnN0YW5jZS0+cENhbGxCYWNrKSAoIHBJbnN0YW5jZS0+cENhbGxiYWNrSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5wR2VuZXJhbFB1cnBvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkNhbGxiYWNrUGFyYW0gKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLSNlbHNlCi12b2lkIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgIE1peF8xU3RfQ2xsX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKLXsKLSAgICBjaGFyIEhhcmRNaXhpbmcgPSBUUlVFOwotCi0gICAgaWYobjw9MCkgICAgcmV0dXJuOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgIFNPRlQgTUlYSU5HCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50ICE9IHBJbnN0YW5jZS0+VGFyZ2V0KQotICAgIHsKLSAgICAgICAgaWYocEluc3RhbmNlLT5BbHBoYSA9PSAwKXsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OwotICAgICAgICB9ZWxzZSBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCA8UE9JTlRfWkVST19PTkVfREIpJiYKLSAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQikpewotICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuICBNYWtlIHRoZW0gZXF1YWwuICovCi0gICAgICAgIH1lbHNlewotICAgICAgICAgICAgLyogU29mdCBtaXhpbmcgaGFzIHRvIGJlIGFwcGxpZWQgKi8KLSAgICAgICAgICAgIEhhcmRNaXhpbmcgPSBGQUxTRTsKLSAgICAgICAgICAgIENvcmVfTWl4U29mdF8xU3RfRDMyQzMxX1dSQSggcEluc3RhbmNlLCBzcmMsIGRzdCwgbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgSEFSRCBNSVhJTkcKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgaWYgKEhhcmRNaXhpbmcpewotICAgICAgICBpZiAocEluc3RhbmNlLT5UYXJnZXQgPT0gMCkKLSAgICAgICAgICAgIExvYWRDb25zdF8zMigwLCBkc3QsIG4pOwotICAgICAgICBlbHNlIGlmICgocEluc3RhbmNlLT5UYXJnZXQ+PjE2KSA9PSAweDdGRkYpewotICAgICAgICAgICAgaWYgKHNyYyAhPSBkc3QpCi0gICAgICAgICAgICAgICAgQ29weV8xNigoTFZNX0lOVDE2KilzcmMsIChMVk1fSU5UMTYqKWRzdCwgKExWTV9JTlQxNikobiAqIDIpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgICBNdWx0M3NfMzJ4MTYoIHNyYywgKExWTV9JTlQxNikocEluc3RhbmNlLT5DdXJyZW50Pj4xNiksIGRzdCwgbiApOwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICBDQUxMIEJBQ0sKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgaWYgKHBJbnN0YW5jZS0+Q2FsbGJhY2tTZXQpewotICAgICAgICBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudC1wSW5zdGFuY2UtPlRhcmdldCA8UE9JTlRfWkVST19PTkVfREIpJiYKLSAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQtcEluc3RhbmNlLT5UYXJnZXQgPiAtUE9JTlRfWkVST19PTkVfREIpKXsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+Q3VycmVudCA9IHBJbnN0YW5jZS0+VGFyZ2V0OyAvKiBEaWZmZXJlbmNlIGlzIG5vdCBzaWduaWZpY2FudCBhbnltb3JlLiAgTWFrZSB0aGVtIGVxdWFsLiAqLwotICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1NldCA9IEZBTFNFOwotICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cENhbGxCYWNrICE9IDApewotICAgICAgICAgICAgICAgICgqcEluc3RhbmNlLT5wQ2FsbEJhY2spICggcEluc3RhbmNlLT5wQ2FsbGJhY2tIYW5kbGUsIHBJbnN0YW5jZS0+cEdlbmVyYWxQdXJwb3NlLHBJbnN0YW5jZS0+Q2FsbGJhY2tQYXJhbSApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMVN0X0QzMkMzMV9XUkEuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8xU3RfRDMyQzMxX1dSQS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDMzMjVlYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMVN0X0QzMkMzMV9XUkEuY3BwCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIk1peGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBERUZJTklUSU9OUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgVFJVRSAgICAgICAgICAxCisjZGVmaW5lIEZBTFNFICAgICAgICAgMAorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gTUlYU09GVF8xU1RfRDMyQzMxX1dSQQorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKK3sKKyAgICBjaGFyIEhhcmRNaXhpbmcgPSBUUlVFOworCisgICAgaWYobiA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQgIT0gcEluc3RhbmNlLT5UYXJnZXQpCisgICAgeworICAgICAgICBpZihwSW5zdGFuY2UtPkFscGhhID09IDApeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7CisgICAgICAgIH1lbHNlIGlmICgocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPCBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkgJiYKKyAgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+Q3VycmVudCAtIHBJbnN0YW5jZS0+VGFyZ2V0ID4gLVBPSU5UX1pFUk9fT05FX0RCX0ZMT0FUKSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPkN1cnJlbnQgPSBwSW5zdGFuY2UtPlRhcmdldDsgLyogRGlmZmVyZW5jZSBpcyBub3Qgc2lnbmlmaWNhbnQgYW55bW9yZS4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ha2UgdGhlbSBlcXVhbC4gKi8KKyAgICAgICAgfWVsc2V7CisgICAgICAgICAgICAvKiBTb2Z0IG1peGluZyBoYXMgdG8gYmUgYXBwbGllZCAqLworICAgICAgICAgICAgSGFyZE1peGluZyA9IEZBTFNFOworICAgICAgICAgICAgQ29yZV9NaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKHBJbnN0YW5jZSwgc3JjLCBkc3QsIG4pOworICAgICAgICB9CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEhBUkQgTUlYSU5HCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmIChIYXJkTWl4aW5nKXsKKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+VGFyZ2V0ID09IDApCisgICAgICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgZHN0LCBuKTsKKyAgICAgICAgZWxzZSBpZiAoKHBJbnN0YW5jZS0+VGFyZ2V0KSA9PSAxLjBmKXsKKyAgICAgICAgICAgIGlmIChzcmMgIT0gZHN0KQorICAgICAgICAgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCopc3JjLCAoTFZNX0ZMT0FUKilkc3QsIChMVk1fSU5UMTYpKG4pKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgICBNdWx0M3NfRmxvYXQoc3JjLCBwSW5zdGFuY2UtPkN1cnJlbnQsIGRzdCwgbik7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIENBTEwgQkFDSworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBpZiAocEluc3RhbmNlLT5DYWxsYmFja1NldCl7CisgICAgICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50IC0gcEluc3RhbmNlLT5UYXJnZXQgPCBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkgJiYKKyAgICAgICAgICAgIChwSW5zdGFuY2UtPkN1cnJlbnQgLSBwSW5zdGFuY2UtPlRhcmdldCA+IC1QT0lOVF9aRVJPX09ORV9EQl9GTE9BVCkpeworICAgICAgICAgICAgcEluc3RhbmNlLT5DdXJyZW50ID0gcEluc3RhbmNlLT5UYXJnZXQ7IC8qIERpZmZlcmVuY2UgaXMgbm90IHNpZ25pZmljYW50IGFueW1vcmUuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWtlIHRoZW0gZXF1YWwuICovCisgICAgICAgICAgICBwSW5zdGFuY2UtPkNhbGxiYWNrU2V0ID0gRkFMU0U7CisgICAgICAgICAgICBpZiAocEluc3RhbmNlLT5wQ2FsbEJhY2sgIT0gMCl7CisgICAgICAgICAgICAgICAgKCpwSW5zdGFuY2UtPnBDYWxsQmFjaykgKCBwSW5zdGFuY2UtPnBDYWxsYmFja0hhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+cEdlbmVyYWxQdXJwb3NlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5DYWxsYmFja1BhcmFtICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMlN0X0QzMkMzMV9TQVQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peFNvZnRfMlN0X0QzMkMzMV9TQVQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZjMWI5Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzJTdF9EMzJDMzFfU0FULmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREUgRklMRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gTUlYU09GVF8yU1RfRDMyQzMxX1NBVAotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTWl4U29mdF8yU3RfRDMyQzMxX1NBVCggICAgTWl4XzJTdF9DbGxfRkxPQVRfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpzcmMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKLXsKLQotICAgIGlmKG4gPD0gMCkgICAgcmV0dXJuOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgIFNPRlQgTUlYSU5HCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZiAoKHBJbnN0YW5jZS0+Q3VycmVudDEgIT0gcEluc3RhbmNlLT5UYXJnZXQxKSB8fCAocEluc3RhbmNlLT5DdXJyZW50MiAhPSBwSW5zdGFuY2UtPlRhcmdldDIpKQotICAgIHsKLSAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgoTWl4XzFTdF9DbGxfRkxPQVRfdCopcEluc3RhbmNlLCBzcmMxLCBkc3QsIG4pOwotICAgICAgICBNaXhJblNvZnRfRDMyQzMxX1NBVCgodm9pZCAqKSZwSW5zdGFuY2UtPkFscGhhMiwgLyogQ2FzdCB0byB2b2lkOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjMiwgZHN0LCBuKTsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgSEFSRCBNSVhJTkcKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+Q3VycmVudDEgPT0gMCkKLSAgICAgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoKHZvaWQgKikgJnBJbnN0YW5jZS0+QWxwaGEyLCAvKiBDYXN0IHRvIHZvaWQ6IG5vIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgbik7Ci0gICAgICAgIGVsc2UgaWYgKHBJbnN0YW5jZS0+Q3VycmVudDIgPT0gMCkKLSAgICAgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoKE1peF8xU3RfQ2xsX0ZMT0FUX3QqKSBwSW5zdGFuY2UsIHNyYzEsIGRzdCwgbik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgIENvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVChwSW5zdGFuY2UsIHNyYzEsIHNyYzIsIGRzdCwgbik7Ci0gICAgfQotfQotI2Vsc2UKLXZvaWQgTWl4U29mdF8yU3RfRDMyQzMxX1NBVCggICAgTWl4XzJTdF9DbGxfdCAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMzIgICAgICpzcmMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgbikKLXsKLQotICAgIGlmKG48PTApICAgIHJldHVybjsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICBTT0ZUIE1JWElORwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYgKChwSW5zdGFuY2UtPkN1cnJlbnQxICE9IHBJbnN0YW5jZS0+VGFyZ2V0MSkgfHwgKHBJbnN0YW5jZS0+Q3VycmVudDIgIT0gcEluc3RhbmNlLT5UYXJnZXQyKSkKLSAgICB7Ci0gICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoIChNaXhfMVN0X0NsbF90KikgcEluc3RhbmNlLCBzcmMxLCBkc3QsIG4pOwotICAgICAgICBNaXhJblNvZnRfRDMyQzMxX1NBVCggKHZvaWQgKikgJnBJbnN0YW5jZS0+QWxwaGEyLCAgICAgLyogQ2FzdCB0byB2b2lkOiBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KLSAgICAgICAgICAgIHNyYzIsIGRzdCwgbik7Ci0gICAgfQotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgIEhBUkQgTUlYSU5HCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQxID09IDApCi0gICAgICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAodm9pZCAqKSAmcEluc3RhbmNlLT5BbHBoYTIsIC8qIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCi0gICAgICAgICAgICBzcmMyLCBkc3QsIG4pOwotICAgICAgICBlbHNlIGlmIChwSW5zdGFuY2UtPkN1cnJlbnQyID09IDApCi0gICAgICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCAoTWl4XzFTdF9DbGxfdCopIHBJbnN0YW5jZSwgc3JjMSwgZHN0LCBuKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgICAgQ29yZV9NaXhIYXJkXzJTdF9EMzJDMzFfU0FUKCBwSW5zdGFuY2UsIHNyYzEsIHNyYzIsIGRzdCwgbik7Ci0gICAgfQotfQotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhTb2Z0XzJTdF9EMzJDMzFfU0FULmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMDAyNzM4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4U29mdF8yU3RfRDMyQzMxX1NBVC5jcHAKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTWl4ZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIE1JWFNPRlRfMlNUX0QzMkMzMV9TQVQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCAgICBNaXhfMlN0X0NsbF9GTE9BVF90ICAgICAgICpwSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnNyYzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgKmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICBuKQoreworCisgICAgaWYobiA8PSAwKSAgICByZXR1cm47CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgU09GVCBNSVhJTkcKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmICgocEluc3RhbmNlLT5DdXJyZW50MSAhPSBwSW5zdGFuY2UtPlRhcmdldDEpIHx8IChwSW5zdGFuY2UtPkN1cnJlbnQyICE9IHBJbnN0YW5jZS0+VGFyZ2V0MikpCisgICAgeworICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKChNaXhfMVN0X0NsbF9GTE9BVF90KilwSW5zdGFuY2UsIHNyYzEsIGRzdCwgbik7CisgICAgICAgIE1peEluU29mdF9EMzJDMzFfU0FUKChNaXhfMVN0X0NsbF9GTE9BVF90ICopJnBJbnN0YW5jZS0+QWxwaGEyLCAvKiBDYXN0IHRvIHZvaWQ6IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmMyLCBkc3QsIG4pOworICAgIH0KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBIQVJEIE1JWElORworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyAgICBlbHNlCisgICAgeworICAgICAgICBpZiAocEluc3RhbmNlLT5DdXJyZW50MSA9PSAwKQorICAgICAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgKKyAgICAgICAgICAgICAgICAgICAgKE1peF8xU3RfQ2xsX0ZMT0FUX3QgKikgJnBJbnN0YW5jZS0+QWxwaGEyLCAvKiBDYXN0IHRvIHZvaWQ6IG5vIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyYzIsIGRzdCwgbik7CisgICAgICAgIGVsc2UgaWYgKHBJbnN0YW5jZS0+Q3VycmVudDIgPT0gMCkKKyAgICAgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoKE1peF8xU3RfQ2xsX0ZMT0FUX3QqKSBwSW5zdGFuY2UsIHNyYzEsIGRzdCwgbik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIENvcmVfTWl4SGFyZF8yU3RfRDMyQzMxX1NBVChwSW5zdGFuY2UsIHNyYzEsIHNyYzIsIGRzdCwgbik7CisgICAgfQorfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peGVyX3ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01peGVyX3ByaXZhdGUuaAppbmRleCAwMGQ1NWVkLi4xZDY1M2JiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NaXhlcl9wcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTWl4ZXJfcHJpdmF0ZS5oCkBAIC0yNiwxMCArMjYsOCBAQAogCiAjZGVmaW5lIFBPSU5UX1pFUk9fT05FX0RCIDI0NzM4MDUgLyogMC4wMSBkQiBvbiBhIGZ1bGwgc2NhbGUgc2lnbmFsID0gKDEwXigwLjAxLzIwKSAtMSkgKiAyXjMxICovCiAKLSNpZmRlZiBCVUlMRF9GTE9BVAogI2RlZmluZSBQT0lOVF9aRVJPX09ORV9EQl9GTE9BVCAwLjAwMTE1MiAvKiAwLjAxIGRCIG9uIGEgZnVsbCBzY2FsZSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25hbCA9ICgxMF4oMC4wMS8yMCkgLTEpICogMl4zMSAqLwotI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgREVGSU5JVElPTlMKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzE2LmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMTYuYwpyZW5hbWUgdG8gbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMTYuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMzIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzk2YTE1Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Nb25vVG8ySV8zMi5jCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREUgRklMRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gTW9ub1RvMklfMzIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIE1vbm9UbzJJXzMyKCBjb25zdCBMVk1fSU5UMzIgICpzcmMsCi0gICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgKmRzdCwKLSAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCi17Ci0gICAgTFZNX0lOVDE2IGlpOwotICAgIHNyYyArPSAobi0xKTsKLSAgICBkc3QgKz0gKChuKjIpLTEpOwotCi0gICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCi0gICAgewotICAgICAgICAqZHN0ID0gKnNyYzsKLSAgICAgICAgZHN0LS07Ci0KLSAgICAgICAgKmRzdCA9ICpzcmM7Ci0gICAgICAgIGRzdC0tOwotICAgICAgICBzcmMtLTsKLSAgICB9Ci0KLSAgICByZXR1cm47Ci19Ci0jaWZkZWYgQlVJTERfRkxPQVQKLXZvaWQgTW9ub1RvMklfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKmRzdCwKLSAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQotewotICAgIExWTV9JTlQxNiBpaTsKLSAgICBzcmMgKz0gKG4gLSAxKTsKLSAgICBkc3QgKz0gKChuICogMikgLSAxKTsKLQotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKLSAgICAgICAgKmRzdCA9ICpzcmM7Ci0gICAgICAgIGRzdC0tOwotCi0gICAgICAgICpkc3QgPSAqc3JjOwotICAgICAgICBkc3QtLTsKLSAgICAgICAgc3JjLS07Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzMyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL01vbm9UbzJJXzMyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDNkMWZjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTW9ub1RvMklfMzIuY3BwCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBJTkNMVURFIEZJTEVTCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIEZVTkNUSU9OIE1vbm9UbzJJXzMyCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBNb25vVG8ySV8zMiggY29uc3QgTFZNX0lOVDMyICAqc3JjLAorICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICpkc3QsCisgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBuKQoreworICAgIExWTV9JTlQxNiBpaTsKKyAgICBzcmMgKz0gKG4tMSk7CisgICAgZHN0ICs9ICgobioyKS0xKTsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgKmRzdCA9ICpzcmM7CisgICAgICAgIGRzdC0tOworCisgICAgICAgICpkc3QgPSAqc3JjOworICAgICAgICBkc3QtLTsKKyAgICAgICAgc3JjLS07CisgICAgfQorCisgICAgcmV0dXJuOworfQordm9pZCBNb25vVG8ySV9GbG9hdCggY29uc3QgTFZNX0ZMT0FUICAqc3JjLAorICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCit7CisgICAgTFZNX0lOVDE2IGlpOworICAgIHNyYyArPSAobiAtIDEpOworICAgIGRzdCArPSAoKG4gKiAyKSAtIDEpOworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICAqZHN0ID0gKnNyYzsKKyAgICAgICAgZHN0LS07CisKKyAgICAgICAgKmRzdCA9ICpzcmM7CisgICAgICAgIGRzdC0tOworICAgICAgICBzcmMtLTsKKyAgICB9CisKKyAgICByZXR1cm47Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL011bHQzc18zMngxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NTg1NjAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgSU5DTFVERSBGSUxFUwotKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotRlVOQ1RJT04gTVVMVDNTXzE2WDE2Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBNdWx0M3NfMzJ4MTYoIGNvbnN0IExWTV9JTlQzMiAqc3JjLAotICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKLSAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAqZHN0LAotICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCi17Ci0gICAgTFZNX0lOVDE2IGlpOwotICAgIExWTV9JTlQzMiBzcmN2YWwsdGVtcDsKLQotICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgIHsKLSAgICAgICAgc3JjdmFsPSpzcmM7Ci0gICAgICAgIHNyYysrOwotCi0gICAgICAgIE1VTDMyeDE2SU5UTzMyKHNyY3ZhbCx2YWwsdGVtcCwxNSkKLQotICAgICAgICAqZHN0ID0gdGVtcDsKLSAgICAgICAgZHN0Kys7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotfQotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIE11bHQzc19GbG9hdCggY29uc3QgTFZNX0ZMT0FUICpzcmMsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUIHZhbCwKLSAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgKmRzdCwKLSAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgbikKLXsKLSAgICBMVk1fSU5UMTYgaWk7Ci0gICAgTFZNX0ZMT0FUIHRlbXA7Ci0KLSAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICB7Ci0gICAgICAgIHRlbXAgPSAoKnNyYykgKiB2YWw7Ci0gICAgICAgIHNyYysrOwotICAgICAgICAqZHN0ID0gdGVtcDsKLSAgICAgICAgZHN0Kys7Ci0gICAgfQotICAgIHJldHVybjsKLX0KLSNlbmRpZgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9NdWx0M3NfMzJ4MTYuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzBjMzlhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTXVsdDNzXzMyeDE2LmNwcApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorRlVOQ1RJT04gTVVMVDNTXzE2WDE2CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBNdWx0M3NfMzJ4MTYoIGNvbnN0IExWTV9JTlQzMiAqc3JjLAorICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2IHZhbCwKKyAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAqZHN0LAorICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCit7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9JTlQzMiBzcmN2YWwsdGVtcDsKKworICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQorICAgIHsKKyAgICAgICAgc3JjdmFsPSpzcmM7CisgICAgICAgIHNyYysrOworCisgICAgICAgIE1VTDMyeDE2SU5UTzMyKHNyY3ZhbCx2YWwsdGVtcCwxNSkKKworICAgICAgICAqZHN0ID0gdGVtcDsKKyAgICAgICAgZHN0Kys7CisgICAgfQorCisgICAgcmV0dXJuOworfQordm9pZCBNdWx0M3NfRmxvYXQoIGNvbnN0IExWTV9GTE9BVCAqc3JjLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCB2YWwsCisgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICpkc3QsCisgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IG4pCit7CisgICAgTFZNX0lOVDE2IGlpOworICAgIExWTV9GTE9BVCB0ZW1wOworCisgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgeworICAgICAgICB0ZW1wID0gKCpzcmMpICogdmFsOworICAgICAgICBzcmMrKzsKKyAgICAgICAgKmRzdCA9IHRlbXA7CisgICAgICAgIGRzdCsrOworICAgIH0KKyAgICByZXR1cm47Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTU2ZWRjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL05vbkxpbkNvbXBfRDE2LmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIkNvbXBMaW1fcHJpdmF0ZS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBOb25MaW5Db21wX0QxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE5vbi1saW5lYXIgY29tcHJlc3Npb24gYnkgY29tcGFuZGluZy4gVGhlIGZ1bmN0aW9uIHdvcmtzIG9uIGEgc2FtcGxlIGJ5IHNhbXBsZSAgICAgICovCi0vKiAgYmFzaXMgYnkgaW5jcmVhc2luZyB0aGUgbGV2ZWwgbmVhciB0aGUgemVybyBjcm9zc2luZy4gVGhpcyBnaXZlcyBhIHR0cmFkZS1vZmYgICAgICAgKi8KLS8qICBiZXR3ZWVuIFRIRCBhbmQgY29tcHJlc3Npb24uIEl0IHVzZXMgdGhlIGVxdWF0aW9uOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgT3V0cHV0ID0gSW5wdXQgKyBLICogKElucHV0IC0gSW5wdXReMikgICAgICAgIGlmIElucHV0ID4gIDAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgPSBJbnB1dCArIEsgKiAoSW5wdXQgKyBJbnB1dF4yKSAgICAgIGlmIElucHV0IDw9IDAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBUaGUgdmFsdWUgb2YgSyBjb250cm9scyB0aGUgYW1vdW50IG9mIGNvbXByZXNzaW9uIGFuZCBhcyBhIHNpZGUgZWZmZWN0IHRoZSBhbW91bnQgKi8KLS8qICBkaXN0b3J0aW9uIGludHJvZHVjZWQuIFRoZSBhbW91bnQgb2YgY29tcHJlc3Npb24gaXMgc2lnbmFsIGRlcGVuZGVudCBhbmQgdGhlIHZhbHVlcyAqLwotLyogIGdpdmVuIGJlbG93IGFyZSBhcHByb3hpbWF0ZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICBHYWluIChmcmFjdGlvbmFsKSAgR2FpbiAoaW50ZWdlcikgICAgQ29tcHJlc3Npb24gICAgICAgICAgUGstUGsgVEhEICAgICAgICAgICAqLwotLyogICAgICAgICAgICAxLjAgICAgICAgICAgICAgICAgIDMyNzY3ICAgICAgICAgICAgKzZkQiAgICAgICAgICAgIDE2ZEIgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgIDAuNzggICAgICAgICAgICAgICAgMjU1NTkgICAgICAgICAgICArNWRCICAgICAgICAgICAgMTlkQiAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgMC42ICAgICAgICAgICAgICAgICAxOTY2MSAgICAgICAgICAgICs0ZEIgICAgICAgICAgICAyMWRCICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAwLjQxICAgICAgICAgICAgICAgIDEzNDM1ICAgICAgICAgICAgKzNkQiAgICAgICAgICAgIDI0ZEIgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgIDAuMjYgICAgICAgICAgICAgICAgIDg1MjAgICAgICAgICAgICArMmRCICAgICAgICAgICAgMjhkQiAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgMC4xMiAgICAgICAgICAgICAgICAgMzkzMiAgICAgICAgICAgICsxZEIgICAgICAgICAgICAzNGRCICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAwLjAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgICAgKzBkQiAgICAgICAgICAgIDk4ZEIgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgR2FpbiAgICAgICAgICAgIC0gICAgY29tcHJlc3Npb24gY29udHJvbCBwYXJhbWV0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBwRGF0YUluICAgICAgICAgLSAgICBwb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIHBEYXRhT3V0ICAgICAgICAtICAgIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgQmxvY2tMZW5ndGggICAgIC0gICAgbnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgTm9uZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCBOb25MaW5Db21wX0QxNihMVk1fSU5UMTYgICAgICAgIEdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgQmxvY2tMZW5ndGgpCi17Ci0KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICBTYW1wbGU7ICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBzYW1wbGVzICovCi0gICAgTFZNX0lOVDMyICAgICAgICAgICAgU2FtcGxlTm87ICAgICAgICAgICAgICAgIC8qIFNhbXBsZSBpbmRleCAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgIFRlbXA7Ci0KLQotICAgIC8qCi0gICAgICogUHJvY2VzcyBhIGJsb2NrIG9mIHNhbXBsZXMKLSAgICAgKi8KLSAgICBmb3IoU2FtcGxlTm8gPSAwOyBTYW1wbGVObzxCbG9ja0xlbmd0aDsgU2FtcGxlTm8rKykKLSAgICB7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogUmVhZCB0aGUgaW5wdXQKLSAgICAgICAgICovCi0gICAgICAgIFNhbXBsZSA9ICpwRGF0YUluOwotICAgICAgICBwRGF0YUluKys7Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSB0aGUgY29tcGFuZGVyLCB0aGlzIGNvbXByZXNzZXMgdGhlIHNpZ25hbCBhdCB0aGUgZXhwZW5zZSBvZgotICAgICAgICAgKiBoYXJtb25pYyBkaXN0b3J0aW9uLiBUaGUgYW1vdW50IG9mIGNvbXByZXNzaW9uIGlzIGNvbnRyb2wgYnkgdGhlCi0gICAgICAgICAqIGdhaW4gZmFjdG9yCi0gICAgICAgICAqLwotICAgICAgICBpZiAoKExWTV9JTlQzMilTYW1wbGUgIT0gLTMyNzY4KQotICAgICAgICB7Ci0gICAgICAgICAgICBUZW1wID0gKExWTV9JTlQxNikoKFNhbXBsZSAqIFNhbXBsZSkgPj4gMTUpOwotICAgICAgICAgICAgaWYoU2FtcGxlID4wKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNhbXBsZSA9IChMVk1fSU5UMTYpKFNhbXBsZSArICgoR2FpbiAqIChTYW1wbGUgLSBUZW1wKSkgPj4gMTUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTYW1wbGUgPSAoTFZNX0lOVDE2KShTYW1wbGUgKyAoKEdhaW4gKiAoU2FtcGxlICsgVGVtcCkpID4+IDE1KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNhdmUgdGhlIG91dHB1dAotICAgICAgICAgKi8KLSAgICAgICAgKnBEYXRhT3V0ID0gU2FtcGxlOwotICAgICAgICBwRGF0YU91dCsrOwotCi0KLSAgICB9Ci0KLX0KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBOb25MaW5Db21wX0Zsb2F0KExWTV9GTE9BVCAgICAgICAgR2FpbiwKLSAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICpwRGF0YUluLAotICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgQmxvY2tMZW5ndGgpCi17Ci0KLSAgICBMVk1fRkxPQVQgICAgICAgICAgICBTYW1wbGU7ICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBzYW1wbGVzICovCi0gICAgTFZNX0lOVDMyICAgICAgICAgICAgU2FtcGxlTm87ICAgICAgICAgICAgICAgIC8qIFNhbXBsZSBpbmRleCAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgIFRlbXA7Ci0KLQotICAgIC8qCi0gICAgICogUHJvY2VzcyBhIGJsb2NrIG9mIHNhbXBsZXMKLSAgICAgKi8KLSAgICBmb3IoU2FtcGxlTm8gPSAwOyBTYW1wbGVObyA8IEJsb2NrTGVuZ3RoOyBTYW1wbGVObysrKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogUmVhZCB0aGUgaW5wdXQKLSAgICAgICAgICovCi0gICAgICAgIFNhbXBsZSA9ICpwRGF0YUluOwotICAgICAgICBwRGF0YUluKys7Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSB0aGUgY29tcGFuZGVyLCB0aGlzIGNvbXByZXNzZXMgdGhlIHNpZ25hbCBhdCB0aGUgZXhwZW5zZSBvZgotICAgICAgICAgKiBoYXJtb25pYyBkaXN0b3J0aW9uLiBUaGUgYW1vdW50IG9mIGNvbXByZXNzaW9uIGlzIGNvbnRyb2wgYnkgdGhlCi0gICAgICAgICAqIGdhaW4gZmFjdG9yCi0gICAgICAgICAqLwotICAgICAgICBpZiAoU2FtcGxlICE9IC0xLjBmKQotICAgICAgICB7Ci0gICAgICAgICAgICBUZW1wID0gKChTYW1wbGUgKiBTYW1wbGUpKTsKLSAgICAgICAgICAgIGlmKFNhbXBsZSA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2FtcGxlID0gKFNhbXBsZSArICgoR2FpbiAqIChTYW1wbGUgLSBUZW1wKSkgKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2FtcGxlID0gKFNhbXBsZSArICgoR2FpbiAqIChTYW1wbGUgKyBUZW1wKSkgKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNhdmUgdGhlIG91dHB1dAotICAgICAgICAgKi8KLSAgICAgICAgKnBEYXRhT3V0ID0gU2FtcGxlOwotICAgICAgICBwRGF0YU91dCsrOwotICAgIH0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTm9uTGluQ29tcF9EMTYuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvTm9uTGluQ29tcF9EMTYuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2ZDExNDkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9Ob25MaW5Db21wX0QxNi5jcHAKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJDb21wTGltX3ByaXZhdGUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTm9uTGluQ29tcF9EMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOb24tbGluZWFyIGNvbXByZXNzaW9uIGJ5IGNvbXBhbmRpbmcuIFRoZSBmdW5jdGlvbiB3b3JrcyBvbiBhIHNhbXBsZSBieSBzYW1wbGUgICAgICAqLworLyogIGJhc2lzIGJ5IGluY3JlYXNpbmcgdGhlIGxldmVsIG5lYXIgdGhlIHplcm8gY3Jvc3NpbmcuIFRoaXMgZ2l2ZXMgYSB0dHJhZGUtb2ZmICAgICAgICovCisvKiAgYmV0d2VlbiBUSEQgYW5kIGNvbXByZXNzaW9uLiBJdCB1c2VzIHRoZSBlcXVhdGlvbjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIE91dHB1dCA9IElucHV0ICsgSyAqIChJbnB1dCAtIElucHV0XjIpICAgICAgICBpZiBJbnB1dCA+ICAwICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgID0gSW5wdXQgKyBLICogKElucHV0ICsgSW5wdXReMikgICAgICBpZiBJbnB1dCA8PSAwICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgVGhlIHZhbHVlIG9mIEsgY29udHJvbHMgdGhlIGFtb3VudCBvZiBjb21wcmVzc2lvbiBhbmQgYXMgYSBzaWRlIGVmZmVjdCB0aGUgYW1vdW50ICovCisvKiAgZGlzdG9ydGlvbiBpbnRyb2R1Y2VkLiBUaGUgYW1vdW50IG9mIGNvbXByZXNzaW9uIGlzIHNpZ25hbCBkZXBlbmRlbnQgYW5kIHRoZSB2YWx1ZXMgKi8KKy8qICBnaXZlbiBiZWxvdyBhcmUgYXBwcm94aW1hdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgR2FpbiAoZnJhY3Rpb25hbCkgIEdhaW4gKGludGVnZXIpICAgIENvbXByZXNzaW9uICAgICAgICAgIFBrLVBrIFRIRCAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgMS4wICAgICAgICAgICAgICAgICAzMjc2NyAgICAgICAgICAgICs2ZEIgICAgICAgICAgICAxNmRCICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAwLjc4ICAgICAgICAgICAgICAgIDI1NTU5ICAgICAgICAgICAgKzVkQiAgICAgICAgICAgIDE5ZEIgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgIDAuNiAgICAgICAgICAgICAgICAgMTk2NjEgICAgICAgICAgICArNGRCICAgICAgICAgICAgMjFkQiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgMC40MSAgICAgICAgICAgICAgICAxMzQzNSAgICAgICAgICAgICszZEIgICAgICAgICAgICAyNGRCICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAwLjI2ICAgICAgICAgICAgICAgICA4NTIwICAgICAgICAgICAgKzJkQiAgICAgICAgICAgIDI4ZEIgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgIDAuMTIgICAgICAgICAgICAgICAgIDM5MzIgICAgICAgICAgICArMWRCICAgICAgICAgICAgMzRkQiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgMC4wICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICswZEIgICAgICAgICAgICA5OGRCICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEdhaW4gICAgICAgICAgICAtICAgIGNvbXByZXNzaW9uIGNvbnRyb2wgcGFyYW1ldGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgcERhdGFJbiAgICAgICAgIC0gICAgcG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBwRGF0YU91dCAgICAgICAgLSAgICBwb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEJsb2NrTGVuZ3RoICAgICAtICAgIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgTm9uTGluQ29tcF9EMTYoTFZNX0lOVDE2ICAgICAgICBHYWluLAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBEYXRhSW4sCisgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgIEJsb2NrTGVuZ3RoKQoreworCisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgU2FtcGxlOyAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgc2FtcGxlcyAqLworICAgIExWTV9JTlQzMiAgICAgICAgICAgIFNhbXBsZU5vOyAgICAgICAgICAgICAgICAvKiBTYW1wbGUgaW5kZXggKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgICBUZW1wOworCisgICAgLyoKKyAgICAgKiBQcm9jZXNzIGEgYmxvY2sgb2Ygc2FtcGxlcworICAgICAqLworICAgIGZvcihTYW1wbGVObyA9IDA7IFNhbXBsZU5vPEJsb2NrTGVuZ3RoOyBTYW1wbGVObysrKQorICAgIHsKKworICAgICAgICAvKgorICAgICAgICAgKiBSZWFkIHRoZSBpbnB1dAorICAgICAgICAgKi8KKyAgICAgICAgU2FtcGxlID0gKnBEYXRhSW47CisgICAgICAgIHBEYXRhSW4rKzsKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgY29tcGFuZGVyLCB0aGlzIGNvbXByZXNzZXMgdGhlIHNpZ25hbCBhdCB0aGUgZXhwZW5zZSBvZgorICAgICAgICAgKiBoYXJtb25pYyBkaXN0b3J0aW9uLiBUaGUgYW1vdW50IG9mIGNvbXByZXNzaW9uIGlzIGNvbnRyb2wgYnkgdGhlCisgICAgICAgICAqIGdhaW4gZmFjdG9yCisgICAgICAgICAqLworICAgICAgICBpZiAoKExWTV9JTlQzMilTYW1wbGUgIT0gLTMyNzY4KQorICAgICAgICB7CisgICAgICAgICAgICBUZW1wID0gKExWTV9JTlQxNikoKFNhbXBsZSAqIFNhbXBsZSkgPj4gMTUpOworICAgICAgICAgICAgaWYoU2FtcGxlID4wKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIFNhbXBsZSA9IChMVk1fSU5UMTYpKFNhbXBsZSArICgoR2FpbiAqIChTYW1wbGUgLSBUZW1wKSkgPj4gMTUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTYW1wbGUgPSAoTFZNX0lOVDE2KShTYW1wbGUgKyAoKEdhaW4gKiAoU2FtcGxlICsgVGVtcCkpID4+IDE1KSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBTYXZlIHRoZSBvdXRwdXQKKyAgICAgICAgICovCisgICAgICAgICpwRGF0YU91dCA9IFNhbXBsZTsKKyAgICAgICAgcERhdGFPdXQrKzsKKworICAgIH0KKworfQordm9pZCBOb25MaW5Db21wX0Zsb2F0KExWTV9GTE9BVCAgICAgICAgR2FpbiwKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgQmxvY2tMZW5ndGgpCit7CisKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICBTYW1wbGU7ICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBzYW1wbGVzICovCisgICAgTFZNX0lOVDMyICAgICAgICAgICAgU2FtcGxlTm87ICAgICAgICAgICAgICAgIC8qIFNhbXBsZSBpbmRleCAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgIFRlbXA7CisKKyAgICAvKgorICAgICAqIFByb2Nlc3MgYSBibG9jayBvZiBzYW1wbGVzCisgICAgICovCisgICAgZm9yKFNhbXBsZU5vID0gMDsgU2FtcGxlTm8gPCBCbG9ja0xlbmd0aDsgU2FtcGxlTm8rKykKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFJlYWQgdGhlIGlucHV0CisgICAgICAgICAqLworICAgICAgICBTYW1wbGUgPSAqcERhdGFJbjsKKyAgICAgICAgcERhdGFJbisrOworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBjb21wYW5kZXIsIHRoaXMgY29tcHJlc3NlcyB0aGUgc2lnbmFsIGF0IHRoZSBleHBlbnNlIG9mCisgICAgICAgICAqIGhhcm1vbmljIGRpc3RvcnRpb24uIFRoZSBhbW91bnQgb2YgY29tcHJlc3Npb24gaXMgY29udHJvbCBieSB0aGUKKyAgICAgICAgICogZ2FpbiBmYWN0b3IKKyAgICAgICAgICovCisgICAgICAgIGlmIChTYW1wbGUgIT0gLTEuMGYpCisgICAgICAgIHsKKyAgICAgICAgICAgIFRlbXAgPSAoKFNhbXBsZSAqIFNhbXBsZSkpOworICAgICAgICAgICAgaWYoU2FtcGxlID4gMCkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTYW1wbGUgPSAoU2FtcGxlICsgKChHYWluICogKFNhbXBsZSAtIFRlbXApKSApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBTYW1wbGUgPSAoU2FtcGxlICsgKChHYWluICogKFNhbXBsZSArIFRlbXApKSApKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFNhdmUgdGhlIG91dHB1dAorICAgICAgICAgKi8KKyAgICAgICAgKnBEYXRhT3V0ID0gU2FtcGxlOworICAgICAgICBwRGF0YU91dCsrOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzE3YTA1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIlBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotIEFTU1VNUFRJT05TOgotIENPRUZTLQotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTAsCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyAtQjIsCi0gcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMTQgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyBHYWluLCBpbiBRMTEgZm9ybWF0Ci0KLQotIERFTEFZUy0KLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gaXMgeShuLTEpUiBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhSW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIE5yU2FtcGxlcykKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCB5bkwseW5SLHluTE8seW5STyx0ZW1wbDsKLSAgICAgICAgTFZNX0lOVDE2IGlpOwotICAgICAgICBQRmlsdGVyX1N0YXRlX0Zsb2F0IHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0Zsb2F0KSBwSW5zdGFuY2U7Ci0KLSAgICAgICAgIGZvciAoaWkgPSBOclNhbXBsZXM7IGlpICE9IDA7IGlpLS0pCi0gICAgICAgICB7Ci0KLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgTEVGVCBDSEFOTkVMCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKiB5bkw9IChBMCAgKiAoeChuKUwgLSB4KG4tMilMICApICkqLwotICAgICAgICAgICAgdGVtcGwgPSAoKnBEYXRhSW4pIC0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdOwotICAgICAgICAgICAgeW5MID0gdGVtcGwgKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdOwotCi0gICAgICAgICAgICAvKiB5bkwrPSAoKC1CMiAgKiB5KG4tMilMICApKSAqLwotICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdOwotICAgICAgICAgICAgeW5MICs9IHRlbXBsOwotCi0gICAgICAgICAgICAvKiB5bkwrPSAoKC1CMSAqIHkobi0xKUwgICkgKSAqLwotICAgICAgICAgICAgdGVtcGwgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOwotICAgICAgICAgICAgeW5MICs9IHRlbXBsOwotCi0gICAgICAgICAgICAvKiB5bkxPPSAoKEdhaW4gKiB5bkwgKSkgKi8KLSAgICAgICAgICAgIHluTE8gPSB5bkwgKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOwotCi0gICAgICAgICAgICAvKiB5bkxPPSggeW5MTyArIHgobilMICApKi8KLSAgICAgICAgICAgIHluTE8gKz0gKCpwRGF0YUluKTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5SPSAoQTAgICogKHgobilSICAtIHgobi0yKVIgICkgKSAqLwotICAgICAgICAgICAgdGVtcGwgPSAoKihwRGF0YUluICsgMSkpIC0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOwotICAgICAgICAgICAgeW5SID0gdGVtcGwgKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdOwotCi0gICAgICAgICAgICAvKiB5blIrPSAoKC1CMiAgKiB5KG4tMilSICApICkgICovCi0gICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV07Ci0gICAgICAgICAgICB5blIgKz0gdGVtcGw7Ci0KLSAgICAgICAgICAgIC8qIHluUis9ICgoLUIxICAqIHkobi0xKVIgICkgKSAgICovCi0gICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl07Ci0gICAgICAgICAgICB5blIgKz0gdGVtcGw7Ci0KLSAgICAgICAgICAgIC8qIHluUk89ICgoR2FpbiAgKiB5blIgKSkgKi8KLSAgICAgICAgICAgIHluUk8gPSB5blIgKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdOwotCi0gICAgICAgICAgICAvKiB5blJPPSggeW5STyArIHgobilSICApKi8KLSAgICAgICAgICAgIHluUk8gKz0gKCoocERhdGFJbisxKSk7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQREFUSU5HIFRIRSBERUxBWVMKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgLyogeShuLTIpUj15KG4tMSlSKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgLyogeShuLTIpTD15KG4tMSlMKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXTsgLyogeChuLTIpUj14KG4tMSlSKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1syXSA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLyogeChuLTIpTD14KG4tMSlMKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSA9IHluUjsgLyogVXBkYXRlIHkobi0xKVIgKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSA9IHluTDsgLyogVXBkYXRlIHkobi0xKUwgKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlMICovCi0gICAgICAgICAgICBwRGF0YUluKys7Ci0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gPSAoKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpUiAqLwotICAgICAgICAgICAgcERhdGFJbisrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dCA9IHluTE87IC8qIFdyaXRlIExlZnQgb3V0cHV0Ki8KLSAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgICAgICAqcERhdGFPdXQgPSB5blJPOyAvKiBXcml0ZSBSaWdodCBvdXB1dCovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotCi0gICAgICAgIH0KLQotICAgIH0KLSNlbHNlCi12b2lkIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotICAgIHsKLSAgICAgICAgTFZNX0lOVDMyIHluTCx5blIseW5MTyx5blJPLHRlbXBsOwotICAgICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKLQotICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgIHsKLQotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIHluTD0gKEEwIChRMTQpICogKHgobilMIChRMCkgLSB4KG4tMilMIChRMCkgKSA+PjE0KSAgaW4gUTAqLwotICAgICAgICAgICAgdGVtcGw9KCpwRGF0YUluKS1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07Ci0gICAgICAgICAgICBNVUwzMngxNklOVE8zMih0ZW1wbCxwQmlxdWFkU3RhdGUtPmNvZWZzWzBdLHluTCwxNCkKLQotICAgICAgICAgICAgLyogeW5MKz0gKCgtQjIgKFExNCkgKiB5KG4tMilMIChRMCkgKSA+PjE0KSBpbiBRMCovCi0gICAgICAgICAgICBNVUwzMngxNklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0scEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSx0ZW1wbCwxNCkKLSAgICAgICAgICAgIHluTCs9dGVtcGw7Ci0KLSAgICAgICAgICAgIC8qIHluTCs9ICgoLUIxIChRMTQpICogeShuLTEpTCAoUTApICkgPj4xNCkgaW4gUTAgKi8KLSAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSxwQmlxdWFkU3RhdGUtPmNvZWZzWzJdLHRlbXBsLDE0KQotICAgICAgICAgICAgeW5MKz10ZW1wbDsKLQotICAgICAgICAgICAgLyogeW5MTz0gKChHYWluIChRMTEpICogeW5MIChRMCkpPj4xMSkgaW4gUTAqLwotICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIoeW5MLHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10seW5MTywxMSkKLQotICAgICAgICAgICAgLyogeW5MTz0oIHluTE8oUTApICsgeChuKUwgKFEwKSApIGluIFEwKi8KLSAgICAgICAgICAgIHluTE8rPSAoKnBEYXRhSW4pOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICAvKiB5blI9IChBMCAoUTE0KSAqICh4KG4pUiAoUTApIC0geChuLTIpUiAoUTApICkgPj4xNCkgICBpbiBRMCovCi0gICAgICAgICAgICB0ZW1wbD0oKihwRGF0YUluKzEpKS1wQmlxdWFkU3RhdGUtPnBEZWxheXNbM107Ci0gICAgICAgICAgICBNVUwzMngxNklOVE8zMih0ZW1wbCxwQmlxdWFkU3RhdGUtPmNvZWZzWzBdLHluUiwxNCkKLQotICAgICAgICAgICAgLyogeW5SKz0gKCgtQjIgKFExNCkgKiB5KG4tMilSIChRMCkgKSA+PjE0KSAgaW4gUTAqLwotICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddLHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0sdGVtcGwsMTQpCi0gICAgICAgICAgICB5blIrPXRlbXBsOwotCi0gICAgICAgICAgICAvKiB5blIrPSAoKC1CMSAoUTE0KSAqIHkobi0xKVIgKFEwKSApID4+MTQpICBpbiBRMCAqLwotICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIocEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdLHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0sdGVtcGwsMTQpCi0gICAgICAgICAgICB5blIrPXRlbXBsOwotCi0gICAgICAgICAgICAvKiB5blJPPSAoKEdhaW4gKFExMSkgKiB5blIgKFEwKSk+PjExKSBpbiBRMCovCi0gICAgICAgICAgICBNVUwzMngxNklOVE8zMih5blIscEJpcXVhZFN0YXRlLT5jb2Vmc1szXSx5blJPLDExKQotCi0gICAgICAgICAgICAvKiB5blJPPSggeW5STyhRMCkgKyB4KG4pUiAoUTApICkgaW4gUTAqLwotICAgICAgICAgICAgeW5STys9ICgqKHBEYXRhSW4rMSkpOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCi0gICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAvKiB5KG4tMilSPXkobi0xKVIqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XTsgLyogeShuLTIpTD15KG4tMSlMKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1szXT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMV07IC8qIHgobi0yKVI9eChuLTEpUiovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl09cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvKiB4KG4tMilMPXgobi0xKUwqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdPXluUjsgLyogVXBkYXRlIHkobi0xKVIgaW4gUTAqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdPXluTDsgLyogVXBkYXRlIHkobi0xKUwgaW4gUTAqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdPSgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlMIGluIFEwKi8KLSAgICAgICAgICAgIHBEYXRhSW4rKzsKLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXT0oKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpUiBpbiBRMCovCi0gICAgICAgICAgICBwRGF0YUluKys7Ci0KLSAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgKnBEYXRhT3V0PXluTE87IC8qIFdyaXRlIExlZnQgb3V0cHV0IGluIFEwKi8KLSAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgICAgICAqcERhdGFPdXQ9eW5STzsgLyogV3JpdGUgUmlnaHQgb3VwdXQgaW4gUTAqLwotICAgICAgICAgICAgcERhdGFPdXQrKzsKLQotICAgICAgICB9Ci0KLSAgICB9Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjYyZjk5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEuY3BwCkBAIC0wLDAgKzEsMTkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgQVNTVU1QVElPTlM6CisgQ09FRlMtCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSBpcyBBMCwKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdIGlzIC1CMiwKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdIGlzIC1CMSwgdGhlc2UgYXJlIGluIFExNCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPmNvZWZzWzNdIGlzIEdhaW4sIGluIFExMSBmb3JtYXQKKworIERFTEFZUy0KKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gaXMgeChuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV0gaXMgeChuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl0gaXMgeChuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM10gaXMgeChuLTIpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNF0gaXMgeShuLTEpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNV0gaXMgeShuLTEpUiBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0gaXMgeShuLTIpTCBpbiBRMCBmb3JtYXQKKyBwQmlxdWFkU3RhdGUtPnBEZWxheXNbN10gaXMgeShuLTIpUiBpbiBRMCBmb3JtYXQKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK3ZvaWQgUEtfMklfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEgKCBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YU91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOclNhbXBsZXMpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgeW5MLHluUix5bkxPLHluUk8sdGVtcGw7CisgICAgICAgIExWTV9JTlQxNiBpaTsKKyAgICAgICAgUEZpbHRlcl9TdGF0ZV9GbG9hdCBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZV9GbG9hdCkgcEluc3RhbmNlOworCisgICAgICAgICBmb3IgKGlpID0gTnJTYW1wbGVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKKyAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgIC8qIHluTD0gKEEwICAqICh4KG4pTCAtIHgobi0yKUwgICkgKSovCisgICAgICAgICAgICB0ZW1wbCA9ICgqcERhdGFJbikgLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07CisgICAgICAgICAgICB5bkwgPSB0ZW1wbCAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF07CisKKyAgICAgICAgICAgIC8qIHluTCs9ICgoLUIyICAqIHkobi0yKUwgICkpICovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV07CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTCs9ICgoLUIxICogeShuLTEpTCAgKSApICovCisgICAgICAgICAgICB0ZW1wbCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl07CisgICAgICAgICAgICB5bkwgKz0gdGVtcGw7CisKKyAgICAgICAgICAgIC8qIHluTE89ICgoR2FpbiAqIHluTCApKSAqLworICAgICAgICAgICAgeW5MTyA9IHluTCAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKyAgICAgICAgICAgIC8qIHluTE89KCB5bkxPICsgeChuKUwgICkqLworICAgICAgICAgICAgeW5MTyArPSAoKnBEYXRhSW4pOworCisgICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBSSUdIVCBDSEFOTkVMCisgICAgICAgICAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgICAgICAvKiB5blI9IChBMCAgKiAoeChuKVIgIC0geChuLTIpUiAgKSApICovCisgICAgICAgICAgICB0ZW1wbCA9ICgqKHBEYXRhSW4gKyAxKSkgLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM107CisgICAgICAgICAgICB5blIgPSB0ZW1wbCAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF07CisKKyAgICAgICAgICAgIC8qIHluUis9ICgoLUIyICAqIHkobi0yKVIgICkgKSAgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddICogcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXTsKKyAgICAgICAgICAgIHluUiArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5SKz0gKCgtQjEgICogeShuLTEpUiAgKSApICAgKi8KKyAgICAgICAgICAgIHRlbXBsID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1syXTsKKyAgICAgICAgICAgIHluUiArPSB0ZW1wbDsKKworICAgICAgICAgICAgLyogeW5STz0gKChHYWluICAqIHluUiApKSAqLworICAgICAgICAgICAgeW5STyA9IHluUiAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKyAgICAgICAgICAgIC8qIHluUk89KCB5blJPICsgeChuKVIgICkqLworICAgICAgICAgICAgeW5STyArPSAoKihwRGF0YUluKzEpKTsKKworICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUworICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdOyAvKiB5KG4tMilSPXkobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdOyAvKiB5KG4tMilMPXkobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAvKiB4KG4tMilSPXgobi0xKVIqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdID0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdOyAvKiB4KG4tMilMPXgobi0xKUwqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdID0geW5SOyAvKiBVcGRhdGUgeShuLTEpUiAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdID0geW5MOyAvKiBVcGRhdGUgeShuLTEpTCAqLworICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKUwgKi8KKyAgICAgICAgICAgIHBEYXRhSW4rKzsKKyAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1sxXSA9ICgqcERhdGFJbik7IC8qIFVwZGF0ZSB4KG4tMSlSICovCisgICAgICAgICAgICBwRGF0YUluKys7CisKKyAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgKnBEYXRhT3V0ID0geW5MTzsgLyogV3JpdGUgTGVmdCBvdXRwdXQqLworICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgICpwRGF0YU91dCA9IHluUk87IC8qIFdyaXRlIFJpZ2h0IG91cHV0Ki8KKyAgICAgICAgICAgIHBEYXRhT3V0Kys7CisKKyAgICAgICAgfQorCisgICAgfQorCisjaWZkZWYgU1VQUE9SVF9NQworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCitERUxBWVMtCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMF0gdG8KK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzIC0gMV0gaXMgeChuLTEpIGZvciBhbGwgTnJDaGFubmVscworCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVsc10gdG8KK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1syKk5yQ2hhbm5lbHMgLSAxXSBpcyB4KG4tMikgZm9yIGFsbCBOckNoYW5uZWxzCisKK3BCaXF1YWRTdGF0ZS0+cERlbGF5c1syKk5yQ2hhbm5lbHNdIHRvCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMypOckNoYW5uZWxzIC0gMV0gaXMgeShuLTEpIGZvciBhbGwgTnJDaGFubmVscworCitwQmlxdWFkU3RhdGUtPnBEZWxheXNbMypOckNoYW5uZWxzXSB0bworcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzQqTnJDaGFubmVscyAtIDFdIGlzIHkobi0yKSBmb3IgYWxsIE5yQ2hhbm5lbHMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBQS19NY19EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMSAoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwRGF0YUluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgKnBEYXRhT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBOckNoYW5uZWxzKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUIHluLCB5bk8sIHRlbXA7CisgICAgICAgIExWTV9JTlQxNiBpaSwgamo7CisgICAgICAgIFBGaWx0ZXJfU3RhdGVfRmxvYXQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRmxvYXQpIHBJbnN0YW5jZTsKKworICAgICAgICAgZm9yIChpaSA9IE5yRnJhbWVzOyBpaSAhPSAwOyBpaS0tKQorICAgICAgICAgeworCisgICAgICAgICAgICBmb3IgKGpqID0gMDsgamogPCBOckNoYW5uZWxzOyBqaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBqaiBDSEFOTkVMCisgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIC8qIHluPSAoQTAgICogKHgobikgLSB4KG4tMikpKSovCisgICAgICAgICAgICAgICAgdGVtcCA9ICgqcERhdGFJbikgLSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyArIGpqXTsKKyAgICAgICAgICAgICAgICB5biA9IHRlbXAgKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdOworCisgICAgICAgICAgICAgICAgLyogeW4rPSAoKC1CMiAgKiB5KG4tMikpKSAqLworICAgICAgICAgICAgICAgIHRlbXAgPSBwQmlxdWFkU3RhdGUtPnBEZWxheXNbTnJDaGFubmVscyozICsgampdICogcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXTsKKyAgICAgICAgICAgICAgICB5biArPSB0ZW1wOworCisgICAgICAgICAgICAgICAgLyogeW4rPSAoKC1CMSAqIHkobi0xKSkpICovCisgICAgICAgICAgICAgICAgdGVtcCA9IHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzKjIgKyBqal0gKiBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdOworICAgICAgICAgICAgICAgIHluICs9IHRlbXA7CisKKyAgICAgICAgICAgICAgICAvKiB5bk89ICgoR2FpbiAqIHluKSkgKi8KKyAgICAgICAgICAgICAgICB5bk8gPSB5biAqIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM107CisKKyAgICAgICAgICAgICAgICAvKiB5bk89KHluTyArIHgobikpKi8KKyAgICAgICAgICAgICAgICB5bk8gKz0gKCpwRGF0YUluKTsKKworICAgICAgICAgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUERBVElORyBUSEUgREVMQVlTCisgICAgICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMyArIGpqXSA9CisgICAgICAgICAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1tOckNoYW5uZWxzICogMiArIGpqXTsgLyogeShuLTIpPXkobi0xKSovCisgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAxICsgampdID0KKyAgICAgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW2pqXTsgLyogeChuLTIpPXgobi0xKSovCisgICAgICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzW05yQ2hhbm5lbHMgKiAyICsgampdID0geW47IC8qIFVwZGF0ZSB5KG4tMSkgKi8KKyAgICAgICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbampdID0gKCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKSovCisgICAgICAgICAgICAgICAgcERhdGFJbisrOworCisgICAgICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdSSVRJTkcgVEhFIE9VVFBVVAorICAgICAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAgICAgICAgICAgICAqcERhdGFPdXQgPSB5bk87IC8qIFdyaXRlIG91dHB1dCovCisgICAgICAgICAgICAgICAgcERhdGFPdXQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfQorI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzMwRzExX1RSQ19XUkFfMDEuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjcwNWNiZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJQS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZNX01hY3Jvcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSBBU1NVTVBUSU9OUzoKLSBDT0VGUy0KLSBwQmlxdWFkU3RhdGUtPmNvZWZzWzBdIGlzIEEwLAotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gaXMgLUIyLAotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl0gaXMgLUIxLCB0aGVzZSBhcmUgaW4gUTMwIGZvcm1hdAotIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gaXMgR2FpbiwgaW4gUTExIGZvcm1hdAotCi0KLSBERUxBWVMtCi0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0xKVIgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHgobi0yKVIgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0Ci0gcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0Ci0qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi12b2lkIFBLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxICggQmlxdWFkX0luc3RhbmNlX3QgICAgICAgKnBJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFJbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcERhdGFPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgTnJTYW1wbGVzKQotICAgIHsKLSAgICAgICAgTFZNX0lOVDMyIHluTCx5blIseW5MTyx5blJPLHRlbXBsOwotICAgICAgICBMVk1fSU5UMTYgaWk7Ci0gICAgICAgIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKLQotICAgICAgICAgZm9yIChpaSA9IE5yU2FtcGxlczsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgIHsKLQotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9DRVNTSU5HIE9GIFRIRSBMRUZUIENIQU5ORUwKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgIC8qIHluTD0gKEEwIChRMzApICogKHgobilMIChRMCkgLSB4KG4tMilMIChRMCkgKSA+PjMwKSAgaW4gUTAqLwotICAgICAgICAgICAgdGVtcGw9KCpwRGF0YUluKS1wQmlxdWFkU3RhdGUtPnBEZWxheXNbMl07Ci0gICAgICAgICAgICBNVUwzMngzMklOVE8zMih0ZW1wbCxwQmlxdWFkU3RhdGUtPmNvZWZzWzBdLHluTCwzMCkKLQotICAgICAgICAgICAgLyogeW5MKz0gKCgtQjIgKFEzMCkgKiB5KG4tMilMIChRMCkgKSA+PjMwKSBpbiBRMCovCi0gICAgICAgICAgICBNVUwzMngzMklOVE8zMihwQmlxdWFkU3RhdGUtPnBEZWxheXNbNl0scEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSx0ZW1wbCwzMCkKLSAgICAgICAgICAgIHluTCs9dGVtcGw7Ci0KLSAgICAgICAgICAgIC8qIHluTCs9ICgoLUIxIChRMzApICogeShuLTEpTCAoUTApICkgPj4zMCkgaW4gUTAgKi8KLSAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XSxwQmlxdWFkU3RhdGUtPmNvZWZzWzJdLHRlbXBsLDMwKQotICAgICAgICAgICAgeW5MKz10ZW1wbDsKLQotICAgICAgICAgICAgLyogeW5MTz0gKChHYWluIChRMTEpICogeW5MIChRMCkpPj4xMSkgaW4gUTAqLwotICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIoeW5MLHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10seW5MTywxMSkKLSAgICAgICAgICAgIC8qIHluTE89KCB5bkxPKFEwKSArIHgobilMIChRMCkgKSBpbiBRMCovCi0gICAgICAgICAgICB5bkxPKz0gKCpwRGF0YUluKTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUFJPQ0VTU0lORyBPRiBUSEUgUklHSFQgQ0hBTk5FTAotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgLyogeW5SPSAoQTAgKFEzMCkgKiAoeChuKVIgKFEwKSAtIHgobi0yKVIgKFEwKSApID4+MzApICAgaW4gUTAqLwotICAgICAgICAgICAgdGVtcGw9KCoocERhdGFJbisxKSktcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdOwotICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIodGVtcGwscEJpcXVhZFN0YXRlLT5jb2Vmc1swXSx5blIsMzApCi0KLSAgICAgICAgICAgIC8qIHluUis9ICgoLUIyIChRMzApICogeShuLTIpUiAoUTApICkgPj4zMCkgIGluIFEwKi8KLSAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s3XSxwQmlxdWFkU3RhdGUtPmNvZWZzWzFdLHRlbXBsLDMwKQotICAgICAgICAgICAgeW5SKz10ZW1wbDsKLQotICAgICAgICAgICAgLyogeW5SKz0gKCgtQjEgKFEzMCkgKiB5KG4tMSlSIChRMCkgKSA+PjMwKSAgaW4gUTAgKi8KLSAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XSxwQmlxdWFkU3RhdGUtPmNvZWZzWzJdLHRlbXBsLDMwKQotICAgICAgICAgICAgeW5SKz10ZW1wbDsKLQotICAgICAgICAgICAgLyogeW5STz0gKChHYWluIChRMTEpICogeW5SIChRMCkpPj4xMSkgaW4gUTAqLwotICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIoeW5SLHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10seW5STywxMSkKLQotICAgICAgICAgICAgLyogeW5STz0oIHluUk8oUTApICsgeChuKVIgKFEwKSApIGluIFEwKi8KLSAgICAgICAgICAgIHluUk8rPSAoKihwRGF0YUluKzEpKTsKLQotICAgICAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVVBEQVRJTkcgVEhFIERFTEFZUwotICAgICAgICAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XTsgLyogeShuLTIpUj15KG4tMSlSKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s2XT1wQmlxdWFkU3RhdGUtPnBEZWxheXNbNF07IC8qIHkobi0yKUw9eShuLTEpTCovCi0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbM109cEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdOyAvKiB4KG4tMilSPXgobi0xKVIqLwotICAgICAgICAgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdPXBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXTsgLyogeChuLTIpTD14KG4tMSlMKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s1XT15blI7IC8qIFVwZGF0ZSB5KG4tMSlSIGluIFEwKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1s0XT15bkw7IC8qIFVwZGF0ZSB5KG4tMSlMIGluIFEwKi8KLSAgICAgICAgICAgIHBCaXF1YWRTdGF0ZS0+cERlbGF5c1swXT0oKnBEYXRhSW4pOyAvKiBVcGRhdGUgeChuLTEpTCBpbiBRMCovCi0gICAgICAgICAgICBwRGF0YUluKys7Ci0gICAgICAgICAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXNbMV09KCpwRGF0YUluKTsgLyogVXBkYXRlIHgobi0xKVIgaW4gUTAqLwotICAgICAgICAgICAgcERhdGFJbisrOwotCi0gICAgICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXUklUSU5HIFRIRSBPVVRQVVQKLSAgICAgICAgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgICAgICpwRGF0YU91dD15bkxPOyAvKiBXcml0ZSBMZWZ0IG91dHB1dCBpbiBRMCovCi0gICAgICAgICAgICBwRGF0YU91dCsrOwotICAgICAgICAgICAgKnBEYXRhT3V0PXluUk87IC8qIFdyaXRlIFJpZ2h0IG91cHV0IGluIFEwKi8KLSAgICAgICAgICAgIHBEYXRhT3V0Kys7Ci0gICAgICAgIH0KLQotICAgIH0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzMwRzExX1RSQ19XUkFfMDEuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQzMwRzExX1RSQ19XUkFfMDEuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxZGUxZGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDMzBHMTFfVFJDX1dSQV8wMS5jcHAKQEAgLTAsMCArMSwzOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIlBLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorIEFTU1VNUFRJT05TOgorIENPRUZTLQorIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gaXMgQTAsCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXSBpcyAtQjIsCisgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSBpcyAtQjEsIHRoZXNlIGFyZSBpbiBRMzAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSBpcyBHYWluLCBpbiBRMTEgZm9ybWF0CisKKyBERUxBWVMtCisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzBdIGlzIHgobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzFdIGlzIHgobi0xKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzJdIGlzIHgobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzNdIGlzIHgobi0yKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzRdIGlzIHkobi0xKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzVdIGlzIHkobi0xKVIgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzZdIGlzIHkobi0yKUwgaW4gUTAgZm9ybWF0CisgcEJpcXVhZFN0YXRlLT5wRGVsYXlzWzddIGlzIHkobi0yKVIgaW4gUTAgZm9ybWF0CisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NDc1YTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIlBLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLQotI2lmbmRlZiBCVUlMRF9GTE9BVAotdm9pZCAgUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMzJfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKLXsKLSAgUEZpbHRlcl9TdGF0ZSBwQmlxdWFkU3RhdGUgPSAoUEZpbHRlcl9TdGF0ZSkgcEluc3RhbmNlOwotICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPShMVk1fSU5UMzIgKikgcFRhcHM7Ci0KLSAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXT1wQ29lZi0+QTA7Ci0KLSAgcEJpcXVhZFN0YXRlLT5jb2Vmc1sxXT1wQ29lZi0+QjI7Ci0KLSAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXT1wQ29lZi0+QjE7Ci0KLSAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXT1wQ29lZi0+RzsKLQotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxNGFhNTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDbGxHc3NfVFJDX1dSQV8wMV9Jbml0LmNwcApAQCAtMCwwICsxLDIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQklRVUFELmgiCisjaW5jbHVkZSAiUEtfMklfRDMyRjMyQ2xsR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oIgorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNjMzMGUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdC5jCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIkJJUVVBRC5oIgotI2luY2x1ZGUgIlBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCAgUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19GTE9BVF9Db2Vmc190ICAgICAgICAgICAgKnBDb2VmKQotewotICAgIFBGaWx0ZXJfU3RhdGVfRmxvYXQgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGVfRmxvYXQpIHBJbnN0YW5jZTsKLSAgICBwQmlxdWFkU3RhdGUtPnBEZWxheXMgICAgICAgPSAoTFZNX0ZMT0FUICopIHBUYXBzOwotCi0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1swXSA9IHBDb2VmLT5BMDsKLQotICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV0gPSBwQ29lZi0+QjI7Ci0KLSAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzJdID0gcENvZWYtPkIxOwotCi0gICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1szXSA9IHBDb2VmLT5HOwotfQotI2Vsc2UKLXZvaWQgIFBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAgICpwVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzE2X0NvZWZzX3QgICAgICAgICAgICAqcENvZWYpCi17Ci0gIFBGaWx0ZXJfU3RhdGUgcEJpcXVhZFN0YXRlID0gKFBGaWx0ZXJfU3RhdGUpIHBJbnN0YW5jZTsKLSAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgID0oTFZNX0lOVDMyICopIHBUYXBzOwotCi0gIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF09cENvZWYtPkEwOwotCi0gIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMV09cENvZWYtPkIyOwotCi0gIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMl09cENvZWYtPkIxOwotCi0gIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM109cENvZWYtPkc7Ci0KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmMwNWRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfSW5pdC5jcHAKQEAgLTAsMCArMSwzNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgIkJJUVVBRC5oIgorI2luY2x1ZGUgIlBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCIKK3ZvaWQgIFBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCAgICpwVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCAgICAgICAgICAgICpwQ29lZikKK3sKKyAgICBQRmlsdGVyX1N0YXRlX0Zsb2F0IHBCaXF1YWRTdGF0ZSA9IChQRmlsdGVyX1N0YXRlX0Zsb2F0KSBwSW5zdGFuY2U7CisgICAgcEJpcXVhZFN0YXRlLT5wRGVsYXlzICAgICAgID0gKExWTV9GTE9BVCAqKSBwVGFwczsKKworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbMF0gPSBwQ29lZi0+QTA7CisKKyAgICBwQmlxdWFkU3RhdGUtPmNvZWZzWzFdID0gcENvZWYtPkIyOworCisgICAgcEJpcXVhZFN0YXRlLT5jb2Vmc1syXSA9IHBDb2VmLT5CMTsKKworICAgIHBCaXF1YWRTdGF0ZS0+Y29lZnNbM10gPSBwQ29lZi0+RzsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1BLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX1ByaXZhdGUuaAppbmRleCAxZTMyMDYyLi5jYzkyNGM0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9QS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvUEtfMklfRDMyRjMyQ3NzR3NzX1RSQ19XUkFfMDFfUHJpdmF0ZS5oCkBAIC0xOCwxMSArMTgsOSBAQAogI2lmbmRlZiBfUEtfMklfRDMyRjMyQ1NTR1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwogI2RlZmluZSBfUEtfMklfRDMyRjMyQ1NTR1NTX1RSQ19XUkFfMDFfUFJJVkFURV9IXwogCi0KIC8qIFRoZSBpbnRlcm5hbCBzdGF0ZSB2YXJpYWJsZXMgYXJlIGltcGxlbWVudGVkIGluIGEgKGZvciB0aGUgdXNlcikgIGhpZGRlbiBzdHJ1Y3R1cmUgKi8KIC8qIEluIHRoaXMgKHByaXZhdGUpIGZpbGUsIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVjbGFyZWQgZnJvIHByaXZhdGUgdXNlLiAgICAgICAgKi8KIAotI2lmZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdCBfRmlsdGVyX1N0YXRlX0Zsb2F0XwogewogICAgIExWTV9GTE9BVCAqICAgICAgIHBEZWxheXM7ICAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwpAQCAtMzAsNyArMjgsNiBAQAogfUZpbHRlcl9TdGF0ZV9GbG9hdDsKIAogdHlwZWRlZiBGaWx0ZXJfU3RhdGVfRmxvYXQgKiBQRmlsdGVyX1N0YXRlX0Zsb2F0IDsKLSNlbmRpZgogdHlwZWRlZiBzdHJ1Y3QgX0ZpbHRlcl9TdGF0ZV8KIHsKICAgTFZNX0lOVDMyICogICAgICAgcERlbGF5czsgICAgICAgIC8qIHBvaW50ZXIgdG8gdGhlIGRlbGF5ZWQgc2FtcGxlcyAoZGF0YSBvZiAzMiBiaXRzKSAgICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjE2eHYxNi5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YxNnh2MTYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhmZWE2NS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjE2eHYxNi5jCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREUgRklMRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gU2hpZnRfU2F0X3YxNnh2MTYKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBCVUlMRF9GTE9BVAotdm9pZCBTaGlmdF9TYXRfdjE2eHYxNiAoY29uc3QgICBMVk1fSU5UMTYgICB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIExWTV9JTlQxNiAgICpzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAqZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbikKLXsKLSAgICBMVk1fSU5UMzIgICB0ZW1wOwotICAgIExWTV9JTlQzMiAgIGlpOwotICAgIExWTV9JTlQxNiAgIFJTaGlmdDsKLSAgICBpZih2YWw+MCkKLSAgICB7Ci0gICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICB0ZW1wID0gKExWTV9JTlQzMikqc3JjOwotICAgICAgICAgICAgc3JjKys7Ci0KLSAgICAgICAgICAgIHRlbXAgPSB0ZW1wIDw8IHZhbDsKLQotICAgICAgICAgICAgaWYgKHRlbXAgPiAweDAwMDA3RkZGKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpkc3QgPSAweDdGRkY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0ZW1wIDwgLTB4MDAwMDgwMDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgKmRzdCA9IC0gMHg4MDAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICpkc3QgPSAoTFZNX0lOVDE2KXRlbXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBkc3QrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlIGlmKHZhbDwwKQotICAgIHsKLSAgICAgICAgUlNoaWZ0PShMVk1fSU5UMTYpKC12YWwpOwotCi0gICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gKExWTV9JTlQxNikoKnNyYyA+PiBSU2hpZnQpOwotICAgICAgICAgICAgZHN0Kys7Ci0gICAgICAgICAgICBzcmMrKzsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZihzcmMhPWRzdCkKLSAgICAgICAgewotICAgICAgICAgICAgQ29weV8xNihzcmMsZHN0LG4pOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybjsKLX0KLSNlbmRpZgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjE2eHYxNi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjE2eHYxNi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjY4YTRiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MTZ4djE2LmNwcApAQCAtMCwwICsxLDI3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgSU5DTFVERSBGSUxFUworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICBGVU5DVElPTiBTaGlmdF9TYXRfdjE2eHYxNgorKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWM5ZGU3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL1NoaWZ0X1NhdF92MzJ4djMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgIElOQ0xVREUgRklMRVMKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgRlVOQ1RJT04gU2hpZnRfU2F0X3YzMnh2MzIKLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIFNoaWZ0X1NhdF9GbG9hdCAoY29uc3QgICBMVk1fSU5UMTYgICB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBMVk1fRkxPQVQgICAqc3JjLAotICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgbikKLXsKLSAgICBMVk1fRkxPQVQgICB0ZW1wOwotICAgIExWTV9JTlQzMiAgIGlpLGlqOwotICAgIExWTV9JTlQxNiAgIFJTaGlmdDsKLQotICAgIGlmKHZhbCA+IDApCi0gICAgewotICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcCA9IChMVk1fRkxPQVQpKnNyYzsKLSAgICAgICAgICAgIHNyYysrOwotICAgICAgICAgICAgZm9yKGlqID0gMDsgaWogPCB2YWw7IGlqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAgKiAyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZih0ZW1wID4gMS4wKQotICAgICAgICAgICAgICAgIHRlbXAgPSAxLjA7Ci0gICAgICAgICAgICBpZih0ZW1wIDwgLTEuMCkKLSAgICAgICAgICAgICAgICB0ZW1wID0gLTEuMDsKLQotICAgICAgICAgICAgKmRzdCA9IChMVk1fRkxPQVQpdGVtcDsKLSAgICAgICAgICAgIGRzdCsrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYodmFsIDwgMCkKLSAgICB7Ci0gICAgICAgIFJTaGlmdD0oTFZNX0lOVDE2KSgtdmFsKTsKLQotICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgewotICAgICAgICAgICAgdGVtcCA9IChMVk1fRkxPQVQpKnNyYzsKLSAgICAgICAgICAgIHNyYysrOwotICAgICAgICAgICAgZm9yKGlqID0gMDsgaWogPCBSU2hpZnQ7IGlqKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCA9IHRlbXAgLyAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKmRzdCA9IChMVk1fRkxPQVQpdGVtcDsKLSAgICAgICAgICAgIGRzdCsrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKHNyYyAhPSBkc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvcHlfRmxvYXQoc3JjLCBkc3QsIG4pOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybjsKLX0KLSNlbHNlCi12b2lkIFNoaWZ0X1NhdF92MzJ4djMyIChjb25zdCAgIExWTV9JTlQxNiAgIHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0lOVDMyICAgKnNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICpkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICBuKQotewotICAgIExWTV9JTlQzMiAgIGlpOwotICAgIExWTV9JTlQxNiAgIFJTaGlmdDsKLQotICAgIGlmKHZhbD4wKQotICAgIHsKLSAgICAgICAgTFZNX0lOVDMyIGEsYjsKLQotICAgICAgICBmb3IgKGlpID0gbjsgaWkgIT0gMDsgaWktLSkKLSAgICAgICAgewotICAgICAgICAgICAgYT0qc3JjOwotICAgICAgICAgICAgc3JjKys7Ci0KLSAgICAgICAgICAgIGI9KGE8PHZhbCk7Ci0KLSAgICAgICAgICAgIGlmKCAoYj4+dmFsKSAhPSBhICkgLyogaWYgb3ZlcmZsb3cgb2NjdXJlZCwgcmlnaHQgc2hpZnQgd2lsbCBzaG93IGRpZmZlcmVuY2UqLwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmKGE8MCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGI9MHg4MDAwMDAwMGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGI9MHg3RkZGRkZGRmw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAqZHN0ID0gYjsKLSAgICAgICAgICAgIGRzdCsrOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYodmFsPDApCi0gICAgewotICAgICAgICBSU2hpZnQ9KExWTV9JTlQxNikoLXZhbCk7Ci0gICAgICAgIGZvciAoaWkgPSBuOyBpaSAhPSAwOyBpaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICAqZHN0ID0gKCpzcmMgPj4gUlNoaWZ0KTsKLSAgICAgICAgICAgIGRzdCsrOwotICAgICAgICAgICAgc3JjKys7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgaWYoc3JjIT1kc3QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvcHlfMTYoKExWTV9JTlQxNiAqKXNyYywoTFZNX0lOVDE2ICopZHN0LChMVk1fSU5UMTYpKG48PDEpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm47Ci19Ci0jZW5kaWYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YzMnh2MzIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvU2hpZnRfU2F0X3YzMnh2MzIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YTA0YzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9TaGlmdF9TYXRfdjMyeHYzMi5jcHAKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgIElOQ0xVREUgRklMRVMKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgRlVOQ1RJT04gU2hpZnRfU2F0X3YzMnh2MzIKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBTaGlmdF9TYXRfRmxvYXQgKGNvbnN0ICAgTFZNX0lOVDE2ICAgdmFsLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0ICAgTFZNX0ZMT0FUICAgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAqZHN0LAorICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgIG4pCit7CisgICAgTFZNX0ZMT0FUICAgdGVtcDsKKyAgICBMVk1fSU5UMzIgICBpaSxpajsKKyAgICBMVk1fSU5UMTYgICBSU2hpZnQ7CisKKyAgICBpZih2YWwgPiAwKQorICAgIHsKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSAoTFZNX0ZMT0FUKSpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgICAgIGZvcihpaiA9IDA7IGlqIDwgdmFsOyBpaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wICogMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYodGVtcCA+IDEuMCkKKyAgICAgICAgICAgICAgICB0ZW1wID0gMS4wOworICAgICAgICAgICAgaWYodGVtcCA8IC0xLjApCisgICAgICAgICAgICAgICAgdGVtcCA9IC0xLjA7CisKKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0ZMT0FUKXRlbXA7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmKHZhbCA8IDApCisgICAgeworICAgICAgICBSU2hpZnQ9KExWTV9JTlQxNikoLXZhbCk7CisKKyAgICAgICAgZm9yIChpaSA9IG47IGlpICE9IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHRlbXAgPSAoTFZNX0ZMT0FUKSpzcmM7CisgICAgICAgICAgICBzcmMrKzsKKyAgICAgICAgICAgIGZvcihpaiA9IDA7IGlqIDwgUlNoaWZ0OyBpaisrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgPSB0ZW1wIC8gMjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpkc3QgPSAoTFZNX0ZMT0FUKXRlbXA7CisgICAgICAgICAgICBkc3QrKzsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBpZihzcmMgIT0gZHN0KQorICAgICAgICB7CisgICAgICAgICAgICBDb3B5X0Zsb2F0KHNyYywgZHN0LCBuKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL2RCX3RvX0xpbjMyLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTcyNmYyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL2RCX3RvX0xpbjMyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgJWNyZWF0ZWRfYnk6ICAgIHNyYSAlIChDTS9TKSovCi0vKiAgICAgJW5hbWU6ICAgICAgICAgIGRCX3RvX0xpbjMyLmMgJSAoQ00vUykqLwotLyogICAgICV2ZXJzaW9uOiAgICAgICAyICUgKENNL1MpKi8KLS8qICAgICAlZGF0ZV9jcmVhdGVkOiAgV2VkIEp1biAxOCAxMToyNzo0NiAyMDA4ICUgKENNL1MpKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KLS8qICBJbmNsdWRlIGZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCi0KLSNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCi0jaWZkZWYgQlVJTERfRkxPQVQKLSNpbmNsdWRlIDxtYXRoLmg+Ci0jZW5kaWYKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICogIE5hbWUgICAgICAgIDogZEJfdG9fTGluMzIoKQotICogIElucHV0ICAgICAgIDogU2lnbmVkIDE2LWJpdCBpbnRlZ2VyCi0gKiAgICAgICAgICAgICAgICAgIE1TQiAoMTYpID0gc2lnbiBiaXQKLSAqICAgICAgICAgICAgICAgICAgKDE1LT4wNSkgPSBpbnRlZ2VyIHBhcnQKLSAqICAgICAgICAgICAgICAgICAgKDA0LT4wMSkgPSBkZWNpbWFsIHBhcnQKLSAqICBPdXRwdXQgICAgICA6IFNpZ25lZCAzMi1iaXQgaW50ZWdlcgotICogICAgICAgICAgICAgICAgICBNU0IgKDMyKSA9IHNpZ24gYml0Ci0gKiAgICAgICAgICAgICAgICAgICgzMS0+MTYpID0gaW50ZWdlciBwYXJ0Ci0gKiAgICAgICAgICAgICAgICAgICgxNS0+MDEpID0gZGVjaW1hbCBwYXJ0Ci0gKiAgUmV0dXJucyAgICAgOiBMaW4gdmFsdWUgZm9ybWF0IDEuMTYuMTUKLSAqICBEZXNjcmlwdGlvbiA6Ci0gKiAgUmVtYXJrcyAgICAgOiAgTWFrZXMgYW4gYXBwcm94aW1hdGlvbiB0byB0aGUgY29udmVyc2lvbiBieSBjb3VudGluZyB0aGUgbnVtYmVyCi0gKiAgICAgICAgICAgICAgICAgb2YgNmRCIHN0ZXBzIGZvciB1c2UgYXMgc2hpZnRzIGFuZCB0aGVuIGludGVycG9sYXRlcyB3aXRoIGEgcmVtYWluZGVyCi0gKiAgICAgICAgICAgICAgICAgd2l0aCB0aGUgZXF1YXRpb246Ci0gKgotICogICAgICAgICAgICAgICAgIENvcnJlY3Rpb24gPSAoUmVtYWluZGVyIC8gMS41MDI5KSAtIChSZW1haW5kZXJeMiAvIDYpCi0gKgotICogICAgICAgICAgICAgICAgIFRoZSB0d28gY29lZmZpY2llbnRzIGFyZSBzY2FsZWQgZnJvbSAweDQwMDAwMDAwIGluIDk2IHN0ZXBzIGFuZCBjYWxjdWxhdGVkCi0gKiAgICAgICAgICAgICAgICAgYXMgZm9sbG93czoKLSAqCi0gKiAgICAgICAgICAgICAgICAgRklSU1RfQ09FRiAgPSAweDgwMDAwMDAwIC8gKDk2ICogMS41MDI5KQotICogICAgICAgICAgICAgICAgIFNFQ09ORF9DT0VGID0gMHg4MDAwMDAwMCAvICg5Nl4yICogNikKLSAqCi0gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBGT1VSX09WRVJfU0lYICAgIDIxODQ2ICAgICAgICAgICAgICAgICAgLyogKDQgLyA2KSAqIDJeMTUgKi8KLSNkZWZpbmUgU0lYX0RCICAgICAgICAgICA5NiAgICAgICAgICAgICAgICAgICAgIC8qIDYgKiAxNiBvciA2ZEIgaW4gUTExLjQgZm9ybWF0ICovCi0jZGVmaW5lIEZJUlNUX0NPRUZfTkVHICAgMTQ4ODQzMDUKLSNkZWZpbmUgRklSU1RfQ09FRl9QT1MgICA3NDQyMTUyICAgICAgICAgICAgICAgIC8qIEZJUlNUX0NPRUZfTkVHIC8gMiAqLwotI2RlZmluZSBTRUNPTkRfQ09FRiAgICAgIDM4ODM2Ci0jZGVmaW5lIE1BWF9WQUxVRSAgICAgICAgMTUzNiAgICAgICAgICAgICAgICAgICAvKiA5NiAqIDE2ICovCi0KLSNpZmRlZiBCVUlMRF9GTE9BVAotTFZNX0ZMT0FUICAgZEJfdG9fTGluRmxvYXQoTFZNX0lOVDE2ICAgIGRiX2ZpeCkKLXsKLSAgICBMVk1fRkxPQVQgICAgZEJfRmxvYXQ7Ci0gICAgTFZNX0ZMT0FUICAgIExpbkZsb2F0OwotCi0gICAgZEJfRmxvYXQgPSAoTFZNX0ZMT0FUKSgoTFZNX0ZMT0FUKWRiX2ZpeCAvIDE2LjBmKTsKLSAgICBMaW5GbG9hdCA9IHBvdygxMCwgZEJfRmxvYXQgLyAyMC4wKTsKLQotICAgIHJldHVybiBMaW5GbG9hdDsKLX0KLSNlbHNlCi1MVk1fSU5UMzIgICBkQl90b19MaW4zMihMVk1fSU5UMTYgICAgZGJfZml4KQotewotICAgIExWTV9JTlQzMiBMaW5fdmFsXzMyOwotICAgIExWTV9JTlQxNiBTaGlmdDsKLSAgICBMVk1fSU5UMzIgUmVtYWluOwotCi0KLSAgICAvKgotICAgICAqIENoZWNrIHNpZ24gb2YgdGhlIGlucHV0Ci0gICAgICovCi0gICAgaWYgKGRiX2ZpeDwwKQotICAgIHsKLSAgICAgICAgaWYgKGRiX2ZpeCA+IC1NQVhfVkFMVUUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNoaWZ0ICA9IChMVk1fSU5UMTYpKCgoKExWTV9VSU5UMzIpKC1kYl9maXgpID4+IDQpICogRk9VUl9PVkVSX1NJWCkgPj4gMTcpOyAgICAgICAgLyogTnVtYmVyIG9mIDZkQiBzdGVwcyBpbiBRMTEuNCBmb3JtYXQgKi8KLSAgICAgICAgICAgIFJlbWFpbiA9IC1kYl9maXggLSAoU2hpZnQgKiBTSVhfREIpOwotICAgICAgICAgICAgUmVtYWluID0gKDB4N0ZGRkZGRkYgLSAoUmVtYWluICogRklSU1RfQ09FRl9ORUcpKSArIChSZW1haW4gKiBSZW1haW4gKiBTRUNPTkRfQ09FRik7Ci0gICAgICAgICAgICBMaW5fdmFsXzMyID0gKExWTV9JTlQzMikoKExWTV9VSU5UMzIpUmVtYWluID4+ICgxNiArIFNoaWZ0KSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBMaW5fdmFsXzMyID0gMDsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAoZGJfZml4IDwgTUFYX1ZBTFVFKQotICAgICAgICB7Ci0gICAgICAgICAgICBTaGlmdCAgPSAoTFZNX0lOVDE2KSgoKChMVk1fVUlOVDMyKWRiX2ZpeCA+PiA0KSAqIEZPVVJfT1ZFUl9TSVgpID4+IDE3KTsgICAgICAgIC8qIE51bWJlciBvZiA2ZEIgc3RlcHMgaW4gUTExLjQgZm9ybWF0ICovCi0gICAgICAgICAgICBSZW1haW4gPSBkYl9maXggLSAoU2hpZnQgKiBTSVhfREIpOwotICAgICAgICAgICAgUmVtYWluID0gMHgzRkZGRkZGRiArIChSZW1haW4gKiBGSVJTVF9DT0VGX1BPUykgKyAoUmVtYWluICogUmVtYWluICogU0VDT05EX0NPRUYpOwotICAgICAgICAgICAgTGluX3ZhbF8zMiA9IChMVk1fSU5UMzIpKChMVk1fVUlOVDMyKVJlbWFpbiA+PiAoMTUgLSBTaGlmdCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgTGluX3ZhbF8zMiA9IDB4N0ZGRkZGRkY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHJldHVybiBMaW5fdmFsXzMyOyAgLyogZm9ybWF0IDEuMTYuMTUgKi8KLX0KLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvZEJfdG9fTGluMzIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0NvbW1vbi9zcmMvZEJfdG9fTGluMzIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYTIwMTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9kQl90b19MaW4zMi5jcHAKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgJWNyZWF0ZWRfYnk6ICAgIHNyYSAlIChDTS9TKSovCisvKiAgICAgJW5hbWU6ICAgICAgICAgIGRCX3RvX0xpbjMyLmMgJSAoQ00vUykqLworLyogICAgICV2ZXJzaW9uOiAgICAgICAyICUgKENNL1MpKi8KKy8qICAgICAlZGF0ZV9jcmVhdGVkOiAgV2VkIEp1biAxOCAxMToyNzo0NiAyMDA4ICUgKENNL1MpKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjKi8KKy8qICBJbmNsdWRlIGZpbGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyovCisKKyNpbmNsdWRlICJTY2FsYXJBcml0aG1ldGljLmgiCisjaW5jbHVkZSA8bWF0aC5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogIE5hbWUgICAgICAgIDogZEJfdG9fTGluMzIoKQorICogIElucHV0ICAgICAgIDogU2lnbmVkIDE2LWJpdCBpbnRlZ2VyCisgKiAgICAgICAgICAgICAgICAgIE1TQiAoMTYpID0gc2lnbiBiaXQKKyAqICAgICAgICAgICAgICAgICAgKDE1LT4wNSkgPSBpbnRlZ2VyIHBhcnQKKyAqICAgICAgICAgICAgICAgICAgKDA0LT4wMSkgPSBkZWNpbWFsIHBhcnQKKyAqICBPdXRwdXQgICAgICA6IFNpZ25lZCAzMi1iaXQgaW50ZWdlcgorICogICAgICAgICAgICAgICAgICBNU0IgKDMyKSA9IHNpZ24gYml0CisgKiAgICAgICAgICAgICAgICAgICgzMS0+MTYpID0gaW50ZWdlciBwYXJ0CisgKiAgICAgICAgICAgICAgICAgICgxNS0+MDEpID0gZGVjaW1hbCBwYXJ0CisgKiAgUmV0dXJucyAgICAgOiBMaW4gdmFsdWUgZm9ybWF0IDEuMTYuMTUKKyAqICBEZXNjcmlwdGlvbiA6CisgKiAgUmVtYXJrcyAgICAgOiAgTWFrZXMgYW4gYXBwcm94aW1hdGlvbiB0byB0aGUgY29udmVyc2lvbiBieSBjb3VudGluZyB0aGUgbnVtYmVyCisgKiAgICAgICAgICAgICAgICAgb2YgNmRCIHN0ZXBzIGZvciB1c2UgYXMgc2hpZnRzIGFuZCB0aGVuIGludGVycG9sYXRlcyB3aXRoIGEgcmVtYWluZGVyCisgKiAgICAgICAgICAgICAgICAgd2l0aCB0aGUgZXF1YXRpb246CisgKgorICogICAgICAgICAgICAgICAgIENvcnJlY3Rpb24gPSAoUmVtYWluZGVyIC8gMS41MDI5KSAtIChSZW1haW5kZXJeMiAvIDYpCisgKgorICogICAgICAgICAgICAgICAgIFRoZSB0d28gY29lZmZpY2llbnRzIGFyZSBzY2FsZWQgZnJvbSAweDQwMDAwMDAwIGluIDk2IHN0ZXBzIGFuZCBjYWxjdWxhdGVkCisgKiAgICAgICAgICAgICAgICAgYXMgZm9sbG93czoKKyAqCisgKiAgICAgICAgICAgICAgICAgRklSU1RfQ09FRiAgPSAweDgwMDAwMDAwIC8gKDk2ICogMS41MDI5KQorICogICAgICAgICAgICAgICAgIFNFQ09ORF9DT0VGID0gMHg4MDAwMDAwMCAvICg5Nl4yICogNikKKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBGT1VSX09WRVJfU0lYICAgIDIxODQ2ICAgICAgICAgICAgICAgICAgLyogKDQgLyA2KSAqIDJeMTUgKi8KKyNkZWZpbmUgU0lYX0RCICAgICAgICAgICA5NiAgICAgICAgICAgICAgICAgICAgIC8qIDYgKiAxNiBvciA2ZEIgaW4gUTExLjQgZm9ybWF0ICovCisjZGVmaW5lIEZJUlNUX0NPRUZfTkVHICAgMTQ4ODQzMDUKKyNkZWZpbmUgRklSU1RfQ09FRl9QT1MgICA3NDQyMTUyICAgICAgICAgICAgICAgIC8qIEZJUlNUX0NPRUZfTkVHIC8gMiAqLworI2RlZmluZSBTRUNPTkRfQ09FRiAgICAgIDM4ODM2CisjZGVmaW5lIE1BWF9WQUxVRSAgICAgICAgMTUzNiAgICAgICAgICAgICAgICAgICAvKiA5NiAqIDE2ICovCisKK0xWTV9GTE9BVCAgIGRCX3RvX0xpbkZsb2F0KExWTV9JTlQxNiAgICBkYl9maXgpCit7CisgICAgTFZNX0ZMT0FUICAgIGRCX0Zsb2F0OworICAgIExWTV9GTE9BVCAgICBMaW5GbG9hdDsKKworICAgIGRCX0Zsb2F0ID0gKExWTV9GTE9BVCkoKExWTV9GTE9BVClkYl9maXggLyAxNi4wZik7CisgICAgTGluRmxvYXQgPSBwb3coMTAsIGRCX0Zsb2F0IC8gMjAuMCk7CisKKyAgICByZXR1cm4gTGluRmxvYXQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9tdWx0M3NfMTZ4MTYuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL211bHQzc18xNngxNi5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjL211bHQzc18xNngxNi5jCnJlbmFtZSB0byBtZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQ29tbW9uL3NyYy9tdWx0M3NfMTZ4MTYuY3BwCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYi9MVkVRTkIuaAppbmRleCA4ZTBiNzM4Li5jNWRkZjc3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvbGliL0xWRVFOQi5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9saWIvTFZFUU5CLmgKQEAgLTY4LDE1ICs2OCw5IEBACiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi0KICNpZm5kZWYgX19MVkVRTkJfSF9fCiAjZGVmaW5lIF9fTFZFUU5CX0hfXwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTEyLDcgKzEwNiw2IEBACiAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KIHR5cGVkZWYgdm9pZCAqTFZFUU5CX0hhbmRsZV90OwogCi0KIC8qIE9wZXJhdGluZyBtb2RlcyAqLwogdHlwZWRlZiBlbnVtCiB7CkBAIC0xMjEsNyArMTE0LDYgQEAKICAgICBMVkVRTkJfTU9ERV9NQVggPSBMVk1fTUFYSU5UXzMyCiB9IExWRVFOQl9Nb2RlX2VuOwogCi0KIC8qIEZpbHRlciBtb2RlIGNvbnRyb2wgKi8KIHR5cGVkZWYgZW51bQogewpAQCAtMTMwLDcgKzEyMiw2IEBACiAgICAgTFZFUU5CX0ZJTFRFUl9EVU1NWSA9IExWTV9NQVhJTlRfMzIKIH0gTFZFUU5CX0ZpbHRlck1vZGVfZW47CiAKLQogLyogTWVtb3J5IFR5cGVzICovCiB0eXBlZGVmIGVudW0KIHsKQEAgLTE0MSw3ICsxMzIsNiBAQAogICAgIExWRVFOQl9NRU1PUllfTUFYICAgICAgPSBMVk1fTUFYSU5UXzMyCiB9IExWRVFOQl9NZW1vcnlUeXBlc19lbjsKIAotCiAvKiBGdW5jdGlvbiByZXR1cm4gc3RhdHVzICovCiB0eXBlZGVmIGVudW0KIHsKQEAgLTE1Miw3ICsxNDIsNiBAQAogICAgIExWRVFOQl9TVEFUVVNfTUFYICAgICA9IExWTV9NQVhJTlRfMzIKIH0gTFZFUU5CX1JldHVyblN0YXR1c19lbjsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIExpbmtlZCBlbnVtZXJhdGVkIHR5cGUgYW5kIGNhcGFiaWxpdHkgZGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xODQsMTAgKzE3MywxMiBAQAogewogICAgIExWRVFOQl9TVEVSRU8gICAgICAgPSAwLAogICAgIExWRVFOQl9NT05PSU5TVEVSRU8gPSAxLAorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVkVRTkJfTVVMVElDSEFOTkVMID0gMiwKKyNlbmRpZgogICAgIExWRVFOQl9TT1VSQ0VfTUFYICAgPSBMVk1fTUFYSU5UXzMyCiB9IExWRVFOQl9Tb3VyY2VGb3JtYXRfZW47CiAKLQogLyoKICAqIFN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgaW4gc2FtcGxlcyBwZXIgc2Vjb25kCiAgKi8KQEAgLTIwMCwxMCArMTkxLDEwIEBACiAjZGVmaW5lIExWRVFOQl9DQVBfRlNfMzIwMDAgICAgICAgICAgICAgICAgNjQKICNkZWZpbmUgTFZFUU5CX0NBUF9GU180NDEwMCAgICAgICAgICAgICAgICAxMjgKICNkZWZpbmUgTFZFUU5CX0NBUF9GU180ODAwMCAgICAgICAgICAgICAgICAyNTYKLSNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiBkZWZpbmVkKEhJR0hFUl9GUykKLSNkZWZpbmUgTFZFUU5CX0NBUF9GU185NjAwMCAgICAgICAgICAgICAgICA1MTIKLSNkZWZpbmUgTFZFUU5CX0NBUF9GU18xOTIwMDAgICAgICAgICAgICAgICAxMDI0Ci0jZW5kaWYKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU184ODIwMCAgICAgICAgICAgICAgICA1MTIKKyNkZWZpbmUgTFZFUU5CX0NBUF9GU185NjAwMCAgICAgICAgICAgICAgICAxMDI0CisjZGVmaW5lIExWRVFOQl9DQVBfRlNfMTc2NDAwICAgICAgICAgICAgICAgMjA0OAorI2RlZmluZSBMVkVRTkJfQ0FQX0ZTXzE5MjAwMCAgICAgICAgICAgICAgIDQwOTYKIAogdHlwZWRlZiBlbnVtCiB7CkBAIC0yMTYsMTQgKzIwNywxMyBAQAogICAgIExWRVFOQl9GU18zMjAwMCA9IDYsCiAgICAgTFZFUU5CX0ZTXzQ0MTAwID0gNywKICAgICBMVkVRTkJfRlNfNDgwMDAgPSA4LAotI2lmZGVmIEhJR0hFUl9GUwotICAgIExWRVFOQl9GU185NjAwMCA9IDksCi0gICAgTFZFUU5CX0ZTXzE5MjAwMCA9IDEwLAotI2VuZGlmCisgICAgTFZFUU5CX0ZTXzg4MjAwID0gOSwKKyAgICBMVkVRTkJfRlNfOTYwMDAgPSAxMCwKKyAgICBMVkVRTkJfRlNfMTc2NDAwID0gMTEsCisgICAgTFZFUU5CX0ZTXzE5MjAwMCA9IDEyLAogICAgIExWRVFOQl9GU19NQVggICA9IExWTV9NQVhJTlRfMzIKIH0gTFZFUU5CX0ZzX2VuOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgU3RydWN0dXJlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIzOSwxNCArMjI5LDEyIEBACiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICpwQmFzZUFkZHJlc3M7ICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHJlZ2lvbiBiYXNlIGFkZHJlc3MgKi8KIH0gTFZFUU5CX01lbW9yeVJlZ2lvbl90OwogCi0KIC8qIE1lbW9yeSB0YWJsZSBjb250YWluaW5nIHRoZSByZWdpb24gZGVmaW5pdGlvbnMgKi8KIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgTFZFUU5CX01lbW9yeVJlZ2lvbl90ICAgICAgIFJlZ2lvbltMVkVRTkJfTlJfTUVNT1JZX1JFR0lPTlNdOyAgLyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICovCiB9IExWRVFOQl9NZW1UYWJfdDsKIAotCiAvKiBFcXVhbGlzZXIgYmFuZCBkZWZpbml0aW9uICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtMjU1LDcgKzI0Myw2IEBACiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIFFGYWN0b3I7ICAgICAgICAgICAgICAgIC8qIEJhbmQgcXVhbGl0eSBmYWN0b3IgKi8KIH0gTFZFUU5CX0JhbmREZWZfdDsKIAotCiAvKiBQYXJhbWV0ZXIgc3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtMjY3LDEwICsyNTQsMTEgQEAKICAgICAvKiBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBOQmFuZHM7ICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmFuZHMgKi8KICAgICBMVkVRTkJfQmFuZERlZl90ICAgICAgICAgICAgKnBCYW5kRGVmaW5pdGlvbjsgICAgICAgLyogUG9pbnRlciB0byBlcXVhbGlzZXIgZGVmaW5pdGlvbnMgKi8KLQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgTnJDaGFubmVsczsKKyNlbmRpZgogfSBMVkVRTkJfUGFyYW1zX3Q7CiAKLQogLyogQ2FwYWJpbGl0eSBzdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7CkBAIC0yODcsNyArMjc1LDYgQEAKIAogfSBMVkVRTkJfQ2FwYWJpbGl0aWVzX3Q7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzMwLDcgKzMxNyw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgICAqcENhcGFiaWxpdGllcyk7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzcwLDcgKzM1Niw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9NZW1UYWJfdCAgICAgICAgICAqcE1lbW9yeVRhYmxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgKnBDYXBhYmlsaXRpZXMpOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWRVFOQl9HZXRQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM5NSw3ICszODAsNiBAQAogTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfR2V0UGFyYW1ldGVycyhMVkVRTkJfSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX1BhcmFtc190ICAgICAqcFBhcmFtcyk7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZFUU5CX0dldENhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDIwLDcgKzQwNCw2IEBACiBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9HZXRDYXBhYmlsaXRpZXMoTFZFUU5CX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgICAqcENhcGFiaWxpdGllcyk7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfQ29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDQ2LDcgKzQyOSw2IEBACiBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Db250cm9sKExWRVFOQl9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgICAqcFBhcmFtcyk7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDY5LDIzICs0NTEsMTAgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAogTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfUHJvY2VzcyhMVkVRTkJfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKTsKLSNlbHNlCi1MVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Qcm9jZXNzKExWRVFOQl9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOwotI2VuZGlmCi0KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwogCiAjZW5kaWYgICAgICAvKiBfX0xWRVFOQl9fICovCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NhbGNDb2VmLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZjUyYjdmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NhbGNDb2VmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIkxWRVFOQl9Qcml2YXRlLmgiCi0jaWZkZWYgQlVJTERfRkxPQVQKLSNpbmNsdWRlIDxtYXRoLmg+Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIERlZmluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBQSSAzLjE0MTU5MjY1MzU4OTc5Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICBMVkVRTkJfRG91YmxlUHJlY0NvZWZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBDYWxjdWxhdGUgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMgICAgZm9yIGEgcGVha2luZyBmaWx0ZXIgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRnMgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGluZyBmcmVxdWVuY3kgaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwRmlsdGVyRGVmaW5pdGlvbiAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXIgZGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBDb2VmZmljaWVudHMgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWRVFOQl9TVUNDRVNTICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuIFRoZSBlcXVhdGlvbnMgdXNlZCBhcmUgYXMgZm9sbG93czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgRyAgPSAxMF4oR2FpbmRCLzIwKSAtIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICB0MCA9IDIgKiBQaSAqIEZjIC8gRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIEQgID0gMSAgICAgICAgICAgICAgICAgIGlmIEdhaW5kQiA+PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgRCAgPSAxIC8gKDEgKyBHKSAgICAgICAgaWYgR2FpbmRCIDwgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGIyID0gLTAuNSAqICgyUSAtIEQgKiB0MCkgLyAoMlEgKyBEICogdDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgYjEgPSAoMC41IC0gYjIpICogKDEgLSBjb3NlcnIodDApKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBhMCA9ICgwLjUgKyBiMikgLyAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVyZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBHYWluZEIgICAgICBpcyB0aGUgZ2FpbiBpbiBkQnMsIHJhbmdlIC0xNWRCIHRvICsxNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIEZjICAgICAgICAgIGlzIHRoZSBjZW50cmUgZnJlcXVlbmN5LCBEQyB0byBGcy81MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgRnMgICAgICAgICAgaXMgdGhlIHNhbXBsZSBmcmVxdWVuY3ksIDgwMDAgdG8gNDgwMDAgaW4gZGVzY3JldGUgc3RlcHMgICAgICAgICAgICAqLwotLyogICAgICBRICAgICAgICAgICBpcyB0aGUgUSBmYWN0b3IsIDAuMjUgdG8gMTIgKHJlcHJlc2VudGVkIGJ5IDI1IHRvIDEyMDApICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAyLiBUaGUgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMgYXJlIG9ubHkgdXNlZCB3aGVuIGZjIGlzIGxlc3MgdGhhbiBmcy84NSwgc28gICAqLwotLyogICAgIHRoZSBjb3NpbmUgb2YgdDAgaXMgYWx3YXlzIGNsb3NlIHRvIDEuMC4gSW5zdGVhZCBvZiBjYWxjdWxhdGluZyB0aGUgY29zaW5lICAgICAgICovCi0vKiAgICAgaXRzZWxmIHRoZSBkaWZmZXJlbmNlIGZyb20gdGhlIHZhbHVlIDEuMCBpcyBjYWxjdWxhdGVkLCB0aGlzIGNhbiBiZSBkb25lIHdpdGggICAgKi8KLS8qICAgICBsb3dlciBwcmVjaXNpb24gbWF0aHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMy4gVGhlIHZhbHVlIG9mIHRoZSBCMiBjb2VmZmljaWVudCBpcyBvbmx5IGNhbGN1bGF0ZWQgYXMgYSBzaW5nbGUgcHJlY2lzaW9uIHZhbHVlLCAgKi8KLS8qICAgICBzbWFsbCBlcnJvcnMgaW4gdGhpcyB2YWx1ZSBoYXZlIGEgY29tYmluZWQgZWZmZWN0IG9uIHRoZSBRIGFuZCBHYWluIGJ1dCBub3QgdGhlICAqLwotLyogICAgIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGZpbHRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0KLSNpZm5kZWYgQlVJTERfRkxPQVQKLUxWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0RvdWJsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzMyX0NvZWZzX3QgICAgKnBDb2VmZmljaWVudHMpCi17Ci0KLSAgICBleHRlcm4gTFZNX0lOVDE2ICAgIExWRVFOQl9HYWluVGFibGVbXTsKLSAgICBleHRlcm4gTFZNX0lOVDE2ICAgIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtdOwotICAgIGV4dGVybiBMVk1fSU5UMTYgICAgTFZFUU5CX0RUYWJsZVtdOwotICAgIGV4dGVybiBMVk1fSU5UMTYgICAgTFZFUU5CX0RQQ29zQ29lZltdOwotCi0gICAgLyoKLSAgICAgKiBHZXQgdGhlIGZpbHRlciBkZWZpbml0aW9uCi0gICAgICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICBHYWluICAgICAgICA9IHBGaWx0ZXJEZWZpbml0aW9uLT5HYWluOwotICAgIExWTV9VSU5UMTYgICAgICAgICAgRnJlcXVlbmN5ICAgPSBwRmlsdGVyRGVmaW5pdGlvbi0+RnJlcXVlbmN5OwotICAgIExWTV9VSU5UMTYgICAgICAgICAgUUZhY3RvciAgICAgPSBwRmlsdGVyRGVmaW5pdGlvbi0+UUZhY3RvcjsKLQotICAgIC8qCi0gICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcwotICAgICAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgVDA7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICBEOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgQTA7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICBCMTsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgIEIyOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgRHQwOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgQjJfRGVuOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgQjJfTnVtOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgQ29zRXJyOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgY29lZjsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgIGZhY3RvcjsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgIHQwOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKLQotICAgIC8qCi0gICAgICogQ2FsY3VsYXRpbmcgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMKLSAgICAgKi8KLSAgICBUMCA9IChMVk1fSU5UMzIpRnJlcXVlbmN5ICogTFZFUU5CX1R3b1BpT25Gc1RhYmxlW0ZzXTsgICAgICAgIC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLwotICAgIGlmIChHYWluID49IDApCi0gICAgewotICAgICAgICBEID0gTFZFUU5CX0RUYWJsZVsxNV07ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEQgPSAxICAgICAgICAgICAgaWYgR2FpbmRCID49IDAgKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgRCA9IExWRVFOQl9EVGFibGVbR2FpbisxNV07ICAgICAgICAgICAgICAgICAgICAvKiBEID0gMSAvICgxICsgRykgIGlmIEdhaW5kQiA8ICAwICovCi0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDYWxjdWxhdGUgdGhlIEIyIGNvZWZmaWNpZW50Ci0gICAgICovCi0gICAgRHQwID0gRCAqIChUMCA+PiAxMCk7Ci0gICAgQjJfRGVuID0gKChMVk1fSU5UMzIpUUZhY3RvciA8PCAxOSkgKyAoRHQwID4+IDIpOwotICAgIEIyX051bSA9IChEdDAgPj4gMykgLSAoKExWTV9JTlQzMilRRmFjdG9yIDw8IDE4KTsKLSAgICBCMiA9IChCMl9OdW0gLyAoQjJfRGVuID4+IDE2KSkgPDwgMTU7Ci0KLSAgICAvKgotICAgICAqIENhbGN1bGF0ZSB0aGUgY29zaW5lIGVycm9yIGJ5IGEgcG9seW5vbWlhbCBleHBhbnNpb24gdXNpbmcgdGhlIGVxdWF0aW9uOgotICAgICAqCi0gICAgICogIENvc0VyciArPSBjb2VmKG4pICogdDBebiAgICAgICAgICAgICAgICBGb3IgbiA9IDAgdG8gNAotICAgICAqLwotICAgIFQwID0gKFQwID4+IDYpICogMHg3ZjUzOyAgICAgICAgICAgICAgICAgICAgLyogU2NhbGUgdG8gMS4wIGluIDE2LWJpdCBmb3IgcmFuZ2UgMCB0byBmcy81MCAqLwotICAgIHQwID0gKExWTV9JTlQxNikoVDAgPj4gMTYpOwotICAgIGZhY3RvciA9IDB4N2ZmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0byAxLjAgZm9yIHRoZSBhMCBjb2VmZmljaWVudCAqLwotICAgIENvc0VyciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgdG8gemVybyAqLwotICAgIGZvciAoaT0xOyBpPDU7IGkrKykKLSAgICB7Ci0gICAgICAgIGNvZWYgPSBMVkVRTkJfRFBDb3NDb2VmW2ldOyAgICAgICAgICAgICAvKiBHZXQgdGhlIG50aCBjb2VmZmljaWVudCAqLwotICAgICAgICBDb3NFcnIgKz0gKGZhY3RvciAqIGNvZWYpID4+IDU7ICAgICAgICAgLyogVGhlIG50aCBwYXJ0aWFsIHN1bSAqLwotICAgICAgICBmYWN0b3IgPSAoZmFjdG9yICogdDApID4+IDE1OyAgICAgICAgICAgLyogQ2FsY3VsYXRlIHQwXm4gKi8KLSAgICB9Ci0gICAgQ29zRXJyID0gQ29zRXJyIDw8IChMVkVRTkJfRFBDb3NDb2VmWzBdKTsgICAvKiBDb3JyZWN0IHRoZSBzY2FsaW5nICovCi0KLSAgICAvKgotICAgICAqIENhbGN1bGF0ZSB0aGUgQjEgYW5kIEEwIGNvZWZmaWNpZW50cwotICAgICAqLwotICAgIEIxID0gKDB4NDAwMDAwMDAgLSBCMik7ICAgICAgICAgICAgICAgICAgICAgLyogQjEgPSAoMC41IC0gYjIvMikgKi8KLSAgICBBMCA9ICgoQjEgPj4gMTYpICogKENvc0VyciA+PiAxMCkpID4+IDY7ICAgIC8qIFRlbXBvcmFyeSBzdG9yYWdlIGZvciAoMC41IC0gYjIvMikgKiBjb3NlcnIodDApICovCi0gICAgQjEgLT0gQTA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBCMSA9ICgwLjUgLSBiMi8yKSAqICgxIC0gY29zZXJyKHQwKSkgICovCi0gICAgQTAgPSAoMHg0MDAwMDAwMCArIEIyKSA+PiAxOyAgICAgICAgICAgICAgICAvKiBBMCA9ICgwLjUgKyBiMikgKi8KLQotICAgIC8qCi0gICAgICogV3JpdGUgY29lZmYgaW50byB0aGUgZGF0YSBzdHJ1Y3R1cmUKLSAgICAgKi8KLSAgICBwQ29lZmZpY2llbnRzLT5BMCA9IEEwOwotICAgIHBDb2VmZmljaWVudHMtPkIxID0gQjE7Ci0gICAgcENvZWZmaWNpZW50cy0+QjIgPSBCMjsKLSAgICBwQ29lZmZpY2llbnRzLT5HICA9IExWRVFOQl9HYWluVGFibGVbR2FpbisxNV07Ci0KLSAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOwotCi19Ci0jZW5kaWYKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIENhbGN1bGF0ZSBzaW5nbGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cyAgICBmb3IgYSBwZWFraW5nIGZpbHRlciAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBGcyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsaW5nIGZyZXF1ZW5jeSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBGaWx0ZXJEZWZpbml0aW9uICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGZpbHRlciBkZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcENvZWZmaWNpZW50cyAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gVGhlIGVxdWF0aW9ucyB1c2VkIGFyZSBhcyBmb2xsb3dzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBHICA9IDEwXihHYWluZEIvMjApIC0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIHQwID0gMiAqIFBpICogRmMgLyBGcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgRCAgPSAxICAgICAgICAgICAgICAgICAgaWYgR2FpbmRCID49IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBEICA9IDEgLyAoMSArIEcpICAgICAgICBpZiBHYWluZEIgPCAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgYjIgPSAtMC41ICogKDJRIC0gRCAqIHQwKSAvICgyUSArIEQgKiB0MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBiMSA9ICgwLjUgLSBiMikgKiBjb3ModDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGEwID0gKDAuNSArIGIyKSAvIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIEdhaW5kQiAgICAgIGlzIHRoZSBnYWluIGluIGRCcywgcmFuZ2UgLTE1ZEIgdG8gKzE1ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgRmMgICAgICAgICAgaXMgdGhlIGNlbnRyZSBmcmVxdWVuY3ksIERDIHRvIE55cXVpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBGcyAgICAgICAgICBpcyB0aGUgc2FtcGxlIGZyZXF1ZW5jeSwgODAwMCB0byA0ODAwMCBpbiBkZXNjcmV0ZSBzdGVwcyAgICAgICAgICAgICovCi0vKiAgICAgIFEgICAgICAgICAgIGlzIHRoZSBRIGZhY3RvciwgMC4yNSB0byAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBCVUlMRF9GTE9BVAotTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKExWTV9VSU5UMTYgICAgICAgIEZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CYW5kRGVmX3QgICpwRmlsdGVyRGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19GTE9BVF9Db2Vmc190ICAqcENvZWZmaWNpZW50cykKLXsKLQotICAgIGV4dGVybiBMVk1fRkxPQVQgICAgTFZFUU5CX0dhaW5UYWJsZVtdOwotICAgIGV4dGVybiBMVk1fRkxPQVQgICAgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW107Ci0gICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVkVRTkJfRFRhYmxlW107Ci0KLQotICAgIC8qCi0gICAgICogR2V0IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbgotICAgICAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgR2FpbiAgICAgICAgPSBwRmlsdGVyRGVmaW5pdGlvbi0+R2FpbjsKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgIEZyZXF1ZW5jeSAgID0gcEZpbHRlckRlZmluaXRpb24tPkZyZXF1ZW5jeTsKLSAgICAvKiBBcyBtZW50aW9uZWQgaW4gZWZmZWN0YnVuZGxlLmggKi8KLSAgICBMVk1fRkxPQVQgICAgICAgICAgIFFGYWN0b3IgICAgID0gKExWTV9GTE9BVClwRmlsdGVyRGVmaW5pdGlvbi0+UUZhY3RvciAvIDEwMC4wZjsKLQotCi0gICAgLyoKLSAgICAgKiBJbnRlcm1lZGlhdGUgdmFyaWFibGVzIGFuZCB0ZW1wb3JhcnkgdmFsdWVzCi0gICAgICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICBUMDsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEQ7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBBMDsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEIxOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQjI7Ci0KLSAgICAvKgotICAgICAqIENhbGN1bGF0aW5nIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzCi0gICAgICovCi0gICAgVDAgPSBGcmVxdWVuY3kgKiBMVkVRTkJfVHdvUGlPbkZzVGFibGVbRnNdOyAgICAgICAgLyogVDAgPSAyICogUGkgKiBGYyAvIEZzICovCi0gICAgaWYgKEdhaW4gPj0gMCkKLSAgICB7Ci0gICAgICAgIEQgPSBMVkVRTkJfRFRhYmxlWzE1XTsgICAgICAgICAgICAgICAgICAgICAgICAgLyogRCA9IDEgICAgICAgICAgICBpZiBHYWluZEIgPj0gMCAqLwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBEID0gTFZFUU5CX0RUYWJsZVtHYWluICsgMTVdOyAgICAgICAgICAgICAgICAgICAgLyogRCA9IDEgLyAoMSArIEcpICBpZiBHYWluZEIgPCAgMCAqLwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ2FsY3VsYXRlIHRoZSBCMixCMSxBMCBjb2VmZmljaWVudHMKLSAgICAgKi8KLSAgICBCMiA9IC0wLjUgKiAoMiAqIFFGYWN0b3IgLSBEICogVDApIC8gKDIgKiBRRmFjdG9yICsgRCAqIFQwKTsKLSAgICBCMSA9ICgwLjUgLSBCMikgKiBjb3MoVDApOwotICAgIEEwID0gKDAuNSArIEIyKSAvIDIuMDsKLQotICAgIC8qCi0gICAgICogV3JpdGUgY29lZmYgaW50byB0aGUgZGF0YSBzdHJ1Y3R1cmUKLSAgICAgKi8KLSAgICAvKiBhbGwgdGhlIGNvZWZmaWNpZW50cyBhcmUgbXVsdGlwbGllZCB3aXRoIDIgdG8gbWFrZSB0aGVtIGFsaWduIHdpdGggZml4ZWQgcG9pbnQgdmFsdWVzKi8KLSAgICBwQ29lZmZpY2llbnRzLT5BMCA9IDIgKiBBMDsKLSAgICBwQ29lZmZpY2llbnRzLT5CMSA9IDIgKiBCMTsKLSAgICBwQ29lZmZpY2llbnRzLT5CMiA9IDIgKiBCMjsKLSAgICBwQ29lZmZpY2llbnRzLT5HICA9IExWRVFOQl9HYWluVGFibGVbR2FpbiArIDE1XTsKLQotICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7Ci19Ci0jZWxzZQotTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKExWTV9VSU5UMTYgICAgICAgIEZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9CYW5kRGVmX3QgICpwRmlsdGVyRGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS19DMTZfQ29lZnNfdCAgICAqcENvZWZmaWNpZW50cykKLXsKLQotICAgIGV4dGVybiBMVk1fSU5UMTYgICAgTFZFUU5CX0dhaW5UYWJsZVtdOwotICAgIGV4dGVybiBMVk1fSU5UMTYgICAgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW107Ci0gICAgZXh0ZXJuIExWTV9JTlQxNiAgICBMVkVRTkJfRFRhYmxlW107Ci0gICAgZXh0ZXJuIExWTV9JTlQxNiAgICBMVkVRTkJfQ29zQ29lZltdOwotCi0KLSAgICAvKgotICAgICAqIEdldCB0aGUgZmlsdGVyIGRlZmluaXRpb24KLSAgICAgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgIEdhaW4gICAgICAgID0gcEZpbHRlckRlZmluaXRpb24tPkdhaW47Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICBGcmVxdWVuY3kgICA9IHBGaWx0ZXJEZWZpbml0aW9uLT5GcmVxdWVuY3k7Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICBRRmFjdG9yICAgICA9IHBGaWx0ZXJEZWZpbml0aW9uLT5RRmFjdG9yOwotCi0KLSAgICAvKgotICAgICAqIEludGVybWVkaWF0ZSB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyeSB2YWx1ZXMKLSAgICAgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgIFQwOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgRDsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgIEEwOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgQjE7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICBCMjsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgIER0MDsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgIEIyX0RlbjsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgIEIyX051bTsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgIENPU19UMDsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgIGNvZWY7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICBmYWN0b3I7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICB0MDsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgIGk7Ci0KLSAgICAvKgotICAgICAqIENhbGN1bGF0aW5nIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzCi0gICAgICovCi0gICAgVDAgPSAoTFZNX0lOVDMyKUZyZXF1ZW5jeSAqIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtGc107ICAgICAgICAvKiBUMCA9IDIgKiBQaSAqIEZjIC8gRnMgKi8KLSAgICBpZiAoR2FpbiA+PSAwKQotICAgIHsKLSAgICAgICAgRCA9IExWRVFOQl9EVGFibGVbMTVdOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEID0gMSAgICAgICAgICAgIGlmIEdhaW5kQiA+PSAwICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIEQgPSBMVkVRTkJfRFRhYmxlW0dhaW4rMTVdOyAgICAgICAgICAgICAgICAgICAgLyogRCA9IDEgLyAoMSArIEcpICBpZiBHYWluZEIgPCAgMCAqLwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ2FsY3VsYXRlIHRoZSBCMiBjb2VmZmljaWVudAotICAgICAqLwotICAgIER0MCA9IEQgKiAoVDAgPj4gMTApOwotICAgIEIyX0RlbiA9ICgoTFZNX0lOVDMyKVFGYWN0b3IgPDwgMTkpICsgKER0MCA+PiAyKTsKLSAgICBCMl9OdW0gPSAoRHQwID4+IDMpIC0gKChMVk1fSU5UMzIpUUZhY3RvciA8PCAxOCk7Ci0gICAgQjIgPSAoQjJfTnVtIC8gKEIyX0RlbiA+PiAxNikpIDw8IDE1OwotCi0gICAgLyoKLSAgICAgKiBDYWxjdWxhdGUgdGhlIGNvc2luZSBieSBhIHBvbHlub21pYWwgZXhwYW5zaW9uIHVzaW5nIHRoZSBlcXVhdGlvbjoKLSAgICAgKgotICAgICAqICBDb3MgKz0gY29lZihuKSAqIHQwXm4gICAgICAgICAgICAgICAgICAgRm9yIG4gPSAwIHRvIDYKLSAgICAgKi8KLSAgICBUMCA9IChUMCA+PiAxMCkgKiAyMDg1OTsgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxlIHRvIDEuMCBpbiAxNi1iaXQgZm9yIHJhbmdlIDAgdG8gZnMvMiAqLwotICAgIHQwID0gKExWTV9JTlQxNikoVDAgPj4gMTYpOwotICAgIGZhY3RvciA9IDB4N2ZmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0byAxLjAgZm9yIHRoZSBhMCBjb2VmZmljaWVudCAqLwotICAgIENPU19UMCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgdG8gemVybyAqLwotICAgIGZvciAoaT0xOyBpPDc7IGkrKykKLSAgICB7Ci0gICAgICAgIGNvZWYgPSBMVkVRTkJfQ29zQ29lZltpXTsgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG50aCBjb2VmZmljaWVudCAqLwotICAgICAgICBDT1NfVDAgKz0gKGZhY3RvciAqIGNvZWYpID4+IDU7ICAgICAgICAgLyogVGhlIG50aCBwYXJ0aWFsIHN1bSAqLwotICAgICAgICBmYWN0b3IgPSAoZmFjdG9yICogdDApID4+IDE1OyAgICAgICAgICAgLyogQ2FsY3VsYXRlIHQwXm4gKi8KLSAgICB9Ci0gICAgQ09TX1QwID0gQ09TX1QwIDw8IChMVkVRTkJfQ29zQ29lZlswXSs2KTsgICAgICAgICAgLyogQ29ycmVjdCB0aGUgc2NhbGluZyAqLwotCi0KLSAgICBCMSA9ICgoMHg0MDAwMDAwMCAtIEIyKSA+PiAxNikgKiAoQ09TX1QwID4+IDE2KTsgICAgLyogQjEgPSAoMC41IC0gYjIvMikgKiBjb3ModDApICovCi0gICAgQTAgPSAoMHg0MDAwMDAwMCArIEIyKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEwID0gKDAuNSArIGIyLzIpICovCi0KLSAgICAvKgotICAgICAqIFdyaXRlIGNvZWZmIGludG8gdGhlIGRhdGEgc3RydWN0dXJlCi0gICAgICovCi0gICAgcENvZWZmaWNpZW50cy0+QTAgPSAoTFZNX0lOVDE2KShBMD4+MTYpOwotICAgIHBDb2VmZmljaWVudHMtPkIxID0gKExWTV9JTlQxNikoQjE+PjE1KTsKLSAgICBwQ29lZmZpY2llbnRzLT5CMiA9IChMVk1fSU5UMTYpKEIyPj4xNik7Ci0gICAgcENvZWZmaWNpZW50cy0+RyAgPSBMVkVRTkJfR2FpblRhYmxlW0dhaW4rMTVdOwotCi0KLSAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOwotCi19Ci0jZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9DYWxjQ29lZi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNjMGZhZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NhbGNDb2VmLmNwcApAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWRVFOQl9Qcml2YXRlLmgiCisjaW5jbHVkZSA8bWF0aC5oPgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgRGVmaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIFBJIDMuMTQxNTkyNjUzNTg5NzkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgIExWRVFOQl9Eb3VibGVQcmVjQ29lZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIENhbGN1bGF0ZSBkb3VibGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cyAgICBmb3IgYSBwZWFraW5nIGZpbHRlciAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGcyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsaW5nIGZyZXF1ZW5jeSBpbmRleCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBGaWx0ZXJEZWZpbml0aW9uICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGZpbHRlciBkZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENvZWZmaWNpZW50cyAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhlIGVxdWF0aW9ucyB1c2VkIGFyZSBhcyBmb2xsb3dzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBHICA9IDEwXihHYWluZEIvMjApIC0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHQwID0gMiAqIFBpICogRmMgLyBGcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRCAgPSAxICAgICAgICAgICAgICAgICAgaWYgR2FpbmRCID49IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBEICA9IDEgLyAoMSArIEcpICAgICAgICBpZiBHYWluZEIgPCAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYjIgPSAtMC41ICogKDJRIC0gRCAqIHQwKSAvICgyUSArIEQgKiB0MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBiMSA9ICgwLjUgLSBiMikgKiAoMSAtIGNvc2Vycih0MCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGEwID0gKDAuNSArIGIyKSAvIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEdhaW5kQiAgICAgIGlzIHRoZSBnYWluIGluIGRCcywgcmFuZ2UgLTE1ZEIgdG8gKzE1ZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRmMgICAgICAgICAgaXMgdGhlIGNlbnRyZSBmcmVxdWVuY3ksIERDIHRvIEZzLzUwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBGcyAgICAgICAgICBpcyB0aGUgc2FtcGxlIGZyZXF1ZW5jeSwgODAwMCB0byA0ODAwMCBpbiBkZXNjcmV0ZSBzdGVwcyAgICAgICAgICAgICovCisvKiAgICAgIFEgICAgICAgICAgIGlzIHRoZSBRIGZhY3RvciwgMC4yNSB0byAxMiAocmVwcmVzZW50ZWQgYnkgMjUgdG8gMTIwMCkgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDIuIFRoZSBkb3VibGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cyBhcmUgb25seSB1c2VkIHdoZW4gZmMgaXMgbGVzcyB0aGFuIGZzLzg1LCBzbyAgICovCisvKiAgICAgdGhlIGNvc2luZSBvZiB0MCBpcyBhbHdheXMgY2xvc2UgdG8gMS4wLiBJbnN0ZWFkIG9mIGNhbGN1bGF0aW5nIHRoZSBjb3NpbmUgICAgICAgKi8KKy8qICAgICBpdHNlbGYgdGhlIGRpZmZlcmVuY2UgZnJvbSB0aGUgdmFsdWUgMS4wIGlzIGNhbGN1bGF0ZWQsIHRoaXMgY2FuIGJlIGRvbmUgd2l0aCAgICAqLworLyogICAgIGxvd2VyIHByZWNpc2lvbiBtYXRocy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAzLiBUaGUgdmFsdWUgb2YgdGhlIEIyIGNvZWZmaWNpZW50IGlzIG9ubHkgY2FsY3VsYXRlZCBhcyBhIHNpbmdsZSBwcmVjaXNpb24gdmFsdWUsICAqLworLyogICAgIHNtYWxsIGVycm9ycyBpbiB0aGlzIHZhbHVlIGhhdmUgYSBjb21iaW5lZCBlZmZlY3Qgb24gdGhlIFEgYW5kIEdhaW4gYnV0IG5vdCB0aGUgICovCisvKiAgICAgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgZmlsdGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgICBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBDYWxjdWxhdGUgc2luZ2xlIHByZWNpc2lvbiBjb2VmZmljaWVudHMgICAgZm9yIGEgcGVha2luZyBmaWx0ZXIgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgRnMgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGluZyBmcmVxdWVuY3kgaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwRmlsdGVyRGVmaW5pdGlvbiAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXIgZGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDb2VmZmljaWVudHMgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TVUNDRVNTICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRoZSBlcXVhdGlvbnMgdXNlZCBhcmUgYXMgZm9sbG93czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRyAgPSAxMF4oR2FpbmRCLzIwKSAtIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0MCA9IDIgKiBQaSAqIEZjIC8gRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEQgID0gMSAgICAgICAgICAgICAgICAgIGlmIEdhaW5kQiA+PSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRCAgPSAxIC8gKDEgKyBHKSAgICAgICAgaWYgR2FpbmRCIDwgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGIyID0gLTAuNSAqICgyUSAtIEQgKiB0MCkgLyAoMlEgKyBEICogdDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYjEgPSAoMC41IC0gYjIpICogY29zKHQwKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBhMCA9ICgwLjUgKyBiMikgLyAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVyZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBHYWluZEIgICAgICBpcyB0aGUgZ2FpbiBpbiBkQnMsIHJhbmdlIC0xNWRCIHRvICsxNWRCICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEZjICAgICAgICAgIGlzIHRoZSBjZW50cmUgZnJlcXVlbmN5LCBEQyB0byBOeXF1aXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRnMgICAgICAgICAgaXMgdGhlIHNhbXBsZSBmcmVxdWVuY3ksIDgwMDAgdG8gNDgwMDAgaW4gZGVzY3JldGUgc3RlcHMgICAgICAgICAgICAqLworLyogICAgICBRICAgICAgICAgICBpcyB0aGUgUSBmYWN0b3IsIDAuMjUgdG8gMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMoTFZNX1VJTlQxNiAgICAgICAgRnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JhbmREZWZfdCAgKnBGaWx0ZXJEZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QgICpwQ29lZmZpY2llbnRzKQoreworCisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVkVRTkJfR2FpblRhYmxlW107CisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVkVRTkJfVHdvUGlPbkZzVGFibGVbXTsKKyAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWRVFOQl9EVGFibGVbXTsKKworICAgIC8qCisgICAgICogR2V0IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbgorICAgICAqLworICAgIExWTV9JTlQxNiAgICAgICAgICAgR2FpbiAgICAgICAgPSBwRmlsdGVyRGVmaW5pdGlvbi0+R2FpbjsKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIEZyZXF1ZW5jeSAgID0gcEZpbHRlckRlZmluaXRpb24tPkZyZXF1ZW5jeTsKKyAgICAvKiBBcyBtZW50aW9uZWQgaW4gZWZmZWN0YnVuZGxlLmggKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgIFFGYWN0b3IgICAgID0gKExWTV9GTE9BVClwRmlsdGVyRGVmaW5pdGlvbi0+UUZhY3RvciAvIDEwMC4wZjsKKworICAgIC8qCisgICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcworICAgICAqLworICAgIExWTV9GTE9BVCAgICAgICAgICAgVDA7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBEOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQTA7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBCMTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyOworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcworICAgICAqLworICAgIFQwID0gRnJlcXVlbmN5ICogTFZFUU5CX1R3b1BpT25Gc1RhYmxlW0ZzXTsgICAgICAgIC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLworICAgIGlmIChHYWluID49IDApCisgICAgeworICAgICAgICBEID0gTFZFUU5CX0RUYWJsZVsxNV07ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEQgPSAxICAgICAgICAgICAgaWYgR2FpbmRCID49IDAgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgRCA9IExWRVFOQl9EVGFibGVbR2FpbiArIDE1XTsgICAgICAgICAgICAgICAgICAgIC8qIEQgPSAxIC8gKDEgKyBHKSAgaWYgR2FpbmRCIDwgIDAgKi8KKyAgICB9CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgQjIsQjEsQTAgY29lZmZpY2llbnRzCisgICAgICovCisgICAgQjIgPSAtMC41ICogKDIgKiBRRmFjdG9yIC0gRCAqIFQwKSAvICgyICogUUZhY3RvciArIEQgKiBUMCk7CisgICAgQjEgPSAoMC41IC0gQjIpICogY29zKFQwKTsKKyAgICBBMCA9ICgwLjUgKyBCMikgLyAyLjA7CisKKyAgICAvKgorICAgICAqIFdyaXRlIGNvZWZmIGludG8gdGhlIGRhdGEgc3RydWN0dXJlCisgICAgICovCisgICAgLyogYWxsIHRoZSBjb2VmZmljaWVudHMgYXJlIG11bHRpcGxpZWQgd2l0aCAyIHRvIG1ha2UgdGhlbSBhbGlnbiB3aXRoIGZpeGVkIHBvaW50IHZhbHVlcyovCisgICAgcENvZWZmaWNpZW50cy0+QTAgPSAyICogQTA7CisgICAgcENvZWZmaWNpZW50cy0+QjEgPSAyICogQjE7CisgICAgcENvZWZmaWNpZW50cy0+QjIgPSAyICogQjI7CisgICAgcENvZWZmaWNpZW50cy0+RyAgPSBMVkVRTkJfR2FpblRhYmxlW0dhaW4gKyAxNV07CisKKyAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29lZmZzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaAppbmRleCA0MmVhNDZmLi42MzI5MTgxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db2VmZnMuaApAQCAtMTUsMTcgKzE1LDE0IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0KICNpZm5kZWYgX19MVkVRTkJfQ09FRkZTX0hfXwogI2RlZmluZSBfX0xWRVFOQl9DT0VGRlNfSF9fCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBHYWluIHRhYmxlIGZvciAoMTBeKEdhaW4vMjApIC0gMSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKICNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC44MjIxNzJmKQogI2RlZmluZSBMVkVRTkJfR2Fpbl9OZWcxNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0wLjgwMDQ3NGYpCiAjZGVmaW5lIExWRVFOQl9HYWluX05lZzEzX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTAuNzc2MTI4ZikKQEAgLTU3LDQ3ICs1NCwxMiBAQAogI2RlZmluZSBMVkVRTkJfR2Fpbl8xM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuNDY2ODM2ZgogI2RlZmluZSBMVkVRTkJfR2Fpbl8xNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuMDExODcyZgogI2RlZmluZSBMVkVRTkJfR2Fpbl8xNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQuNjIzNDEzZgotI2Vsc2UKLSNkZWZpbmUgTFZFUU5CX0dBSU5TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEgICAgICAgICAvKiBBcyBhIHBvd2VyIG9mIDIgKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE2ODQpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC44MjIxNzIgKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE2MzkpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC44MDA0NzQgKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE1OTApICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC43NzYxMjggKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE1MzQpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC43NDg4MTEgKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE0NzEpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC43MTgxNjIgKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMTBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTE0MDApICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC42ODM3NzIgKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnOV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEzMjEpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC42NDUxODcgKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnOF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEyMzMpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC42MDE4OTMgKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnN19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTExMzMpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC41NTMzMTYgKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnNl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTEwMjIpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC40OTg4MTMgKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC04OTYpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC40Mzc2NTkgKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnNF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC03NTYpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zNjkwNDMgKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC01OTgpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yOTIwNTQgKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC00MjEpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMDU2NzIgKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fTmVnMV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKC0yMjMpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xMDg3NDkgKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBMVkVRTkJfR2Fpbl8xX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMTIyMDE4ICovCi0jZGVmaW5lIExWRVFOQl9HYWluXzJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTMwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNTg5MjUgKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4NDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQxMjUzOCAqLwotI2RlZmluZSBMVkVRTkJfR2Fpbl80X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE5OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTg0ODkzICovCi0jZGVmaW5lIExWRVFOQl9HYWluXzVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTk0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC43NzgyNzkgKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fNl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwMzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NTI2MiAqLwotI2RlZmluZSBMVkVRTkJfR2Fpbl83X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjUzNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMjM4NzIxICovCi0jZGVmaW5lIExWRVFOQl9HYWluXzhfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMDk2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS41MTE4ODYgKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fOV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM3MjQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjgxODM4MyAqLwotI2RlZmluZSBMVkVRTkJfR2Fpbl8xMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQyOCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDIuMTYyMjc4ICovCi0jZGVmaW5lIExWRVFOQl9HYWluXzExX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjE5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMi41NDgxMzQgKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fMTJfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYxMDUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAyLjk4MTA3MiAqLwotI2RlZmluZSBMVkVRTkJfR2Fpbl8xM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzEwMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDMuNDY2ODM2ICovCi0jZGVmaW5lIExWRVFOQl9HYWluXzE0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MjE2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNC4wMTE4NzIgKi8KLSNkZWZpbmUgTFZFUU5CX0dhaW5fMTVfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk0NjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA0LjYyMzQxMyAqLwotI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRnJlcXVlbmN5IHRhYmxlIGZvciAyKlBpL0ZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCiAjZGVmaW5lIExWRVFOQl8yUGlPbl84MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDc4NWYKICNkZWZpbmUgTFZFUU5CXzJQaU9uXzExMDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwNTcwZgogI2RlZmluZSBMVkVRTkJfMlBpT25fMTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDA1MjRmCkBAIC0xMDgsMzAgKzcwLDE2IEBACiAjZGVmaW5lIExWRVFOQl8yUGlPbl80NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDE0MmYKICNkZWZpbmUgTFZFUU5CXzJQaU9uXzQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMTMxZgogCi0jaWZkZWYgSElHSEVSX0ZTCisjZGVmaW5lIExWRVFOQl8yUGlPbl84ODIwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDA3MWYKICNkZWZpbmUgTFZFUU5CXzJQaU9uXzk2MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDY1ZgorI2RlZmluZSBMVkVRTkJfMlBpT25fMTc2NDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMzZmCiAjZGVmaW5lIExWRVFOQl8yUGlPbl8xOTIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjAwMDAzM2YKLSNlbmRpZgotCi0jZWxzZQotI2RlZmluZSBMVkVRTkJfRlJFUVNISUZUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNSAgICAgICAgIC8qIEFzIGEgcG93ZXIgb2YgMiAqLwotI2RlZmluZSBMVkVRTkJfMlBpT25fODAwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNjM1NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwNzg1ICovCi0jZGVmaW5lIExWRVFOQl8yUGlPbl8xMTAyNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MTIzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDA1NzAgKi8KLSNkZWZpbmUgTFZFUU5CXzJQaU9uXzEyMDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc1NjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDUyNCAqLwotI2RlZmluZSBMVkVRTkJfMlBpT25fMTYwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzE3NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMzkzICovCi0jZGVmaW5lIExWRVFOQl8yUGlPbl8yMjA1MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NTYxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAyODUgKi8KLSNkZWZpbmUgTFZFUU5CXzJQaU9uXzI0MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3ODUgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDI2MiAqLwotI2RlZmluZSBMVkVRTkJfMlBpT25fMzIwMDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU4OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMTk2ICovCi0jZGVmaW5lIExWRVFOQl8yUGlPbl80NDEwMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NzgxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAxNDIgKi8KLSNkZWZpbmUgTFZFUU5CXzJQaU9uXzQ4MDAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzOTIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDEzMSAqLwotI2VuZGlmCiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogNTBEIHRhYmxlIGZvciA1MCAvICggMSArIEdhaW4gKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCiAjZGVmaW5lIExWRVFOQl8xMDBEX05lZzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjYyMzQxM2YKICNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuMDExODcyZgogI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC40NjY4MzZmCkBAIC0xNDgsMjQgKzk2LDUgQEAKICNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMjU4OTI1ZgogI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMjIwMThmCiAjZGVmaW5lIExWRVFOQl8xMDBEXzBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAwMDAwMGYKLSNlbHNlCi0jZGVmaW5lIExWRVFOQl8xMDBEU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ICAgICAgICAgLyogQXMgYSBwb3dlciBvZiAyICovCi0jZGVmaW5lIExWRVFOQl8xMDBEX05lZzE1X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3OTk1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgNS42MjM0MTMgKi8KLSNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTRfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSA1LjAxMTg3MiAqLwotI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxM19kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDI5NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDQuNDY2ODM2ICovCi0jZGVmaW5lIExWRVFOQl8xMDBEX05lZzEyX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNzM5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMy45ODEwNzIgKi8KLSNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMTFfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEzNTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAzLjU0ODEzNCAqLwotI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxMF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDExOSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDMuMTYyMjc4ICovCi0jZGVmaW5lIExWRVFOQl8xMDBEX05lZzlfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MDE5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMi44MTgzODMgKi8KLSNkZWZpbmUgTFZFUU5CXzEwMERfTmVnOF9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgwMzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAyLjUxMTg4NiAqLwotI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc3X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzE2NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDIuMjM4NzIxICovCi0jZGVmaW5lIExWRVFOQl8xMDBEX05lZzZfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2Mzg1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS45OTUyNjIgKi8KLSNkZWZpbmUgTFZFUU5CXzEwMERfTmVnNV9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2OTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjc3ODI3OSAqLwotI2RlZmluZSBMVkVRTkJfMTAwRF9OZWc0X2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA3MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuNTg0ODkzICovCi0jZGVmaW5lIExWRVFOQl8xMDBEX05lZzNfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NTIwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS40MTI1MzggKi8KLSNkZWZpbmUgTFZFUU5CXzEwMERfTmVnMl9kQiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwMjkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjI1ODkyNSAqLwotI2RlZmluZSBMVkVRTkJfMTAwRF9OZWcxX2RCICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzU5MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMTIyMDE4ICovCi0jZGVmaW5lIExWRVFOQl8xMDBEXzBfZEIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDAwMDAgKi8KLSNlbmRpZgogCiAjZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0NvbnRyb2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IwZjM0MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db250cm9sLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIkxWRVFOQi5oIgotI2luY2x1ZGUgIkxWRVFOQl9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgotI2luY2x1ZGUgIkJJUVVBRC5oIgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRGVmaW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNkZWZpbmUgICAgIExPV19GUkVRICAgICAgICAgICAgMjk4ICAgICAgICAgICAgIC8qIDMyNzY4LzExMCBmb3IgbG93IHRlc3QgZnJlcXVlbmN5ICovCi0jZGVmaW5lICAgICBISUdIX0ZSRVEgICAgICAgICAgIDM4NiAgICAgICAgICAgICAvKiAzMjc2OC84NSBmb3IgaGlnaCB0ZXN0IGZyZXF1ZW5jeSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkVRTkJfR2V0UGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJlcXVlc3QgdGhlIE4tQmFuZCBlcXVhbGlzZXIgcGFyYW1ldGVycy4gVGhlIGN1cnJlbnQgcGFyYW1ldGVyIHNldCBpcyByZXR1cm5lZCB2aWEgICovCi0vKiAgdGhlIHBhcmFtZXRlciBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwUGFyYW1zICAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkVRTkJfU1VDQ0VTUyAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgIEluc3RhbmNlIG9yIHBQYXJhbXMgIGlzIE5VTEwgcG9pbnRlciAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZFUU5CX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9HZXRQYXJhbWV0ZXJzKExWRVFOQl9IYW5kbGVfdCAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfUGFyYW1zX3QgICAgICpwUGFyYW1zKQotewotCi0gICAgTFZFUU5CX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWRVFOQl9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLQotICAgLyoKLSAgICAgKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucwotICAgICAqLwotICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwUGFyYW1zID09IExWTV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7Ci0gICAgfQotCi0gICAgKnBQYXJhbXMgPSBwSW5zdGFuY2UtPlBhcmFtczsKLQotICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWRVFOQl9HZXRDYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgR2V0IHRoZSBOLUJhbmQgZXF1YWxpc2VyIGNhcGFiaWxpdGllcy4gVGhlIGN1cnJlbnQgY2FwYWJpbGl0aWVzIGFyZSByZXR1cm5lZCAgICAqLwotLyogIHZpYSB0aGUgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBjYXBhYmlsaXR5IHN0cnVjdHVyZSAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkVRTkJfU3VjY2VzcyAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgIGhJbnN0YW5jZSBvciBwQ2FwYWJpbGl0aWVzIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0dldENhcGFiaWxpdGllcyhMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgICpwQ2FwYWJpbGl0aWVzKQotewotCi0gICAgTFZFUU5CX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWRVFOQl9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLQotICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwQ2FwYWJpbGl0aWVzID09IExWTV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7Ci0gICAgfQotCi0gICAgKnBDYXBhYmlsaXRpZXMgPSBwSW5zdGFuY2UtPkNhcGFiaWxpdGllczsKLQotICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICBMVkVRTkJfU2V0RmlsdGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU2V0cyB0aGUgZmlsdGVyIHR5cGUgYmFzZWQgb24gdGhlIGRlZmluaXRpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcEluc3RhbmNlICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBQYXJhbXMgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHZvaWQgICAgICAgICAgICAgICAgTm90aGluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuIFRvIHNlbGVjdCB0aGUgYmlxdWFkIHR5cGUgdGhlIGZvbGxvdyBydWxlcyBhcmUgYXBwbGllZDogICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgIERvdWJsZSBwcmVjaXNpb24gICAgaWYgKGZjIDw9IGZzLzExMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICBEb3VibGUgcHJlY2lzaW9uICAgIGlmIChmcy8xMTAgPCBmYyA8IGZzLzg1KSAmIChRPjMpICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgU2luZ2xlIHByZWNpc2lvbiAgICBvdGhlcndpc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkICAgIExWRVFOQl9TZXRGaWx0ZXJzKExWRVFOQl9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCi17Ci0jaWZkZWYgSElHSEVSX0ZTCi0gICAgZXh0ZXJuIGNvbnN0IExWTV9VSU5UMzIgICBMVkVRTkJfU2FtcGxlUmF0ZVRhYltdOyAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgdGFibGUgKi8KLSNlbHNlCi0gICAgZXh0ZXJuIGNvbnN0IExWTV9VSU5UMTYgICBMVkVRTkJfU2FtcGxlUmF0ZVRhYltdOyAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgdGFibGUgKi8KLSNlbmRpZgotCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGJhbmQgaW5kZXggKi8KLSAgICBMVk1fVUlOVDMyICAgICAgICAgIGZzID0gKExWTV9VSU5UMzIpTFZFUU5CX1NhbXBsZVJhdGVUYWJbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07ICAvKiBTYW1wbGUgcmF0ZSAqLwotICAgIExWTV9VSU5UMzIgICAgICAgICAgZmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICBRRmFjdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIFEgZmFjdG9yICovCi0KLQotICAgIHBJbnN0YW5jZS0+TkJhbmRzID0gcFBhcmFtcy0+TkJhbmRzOwotCi0gICAgZm9yIChpPTA7IGk8cFBhcmFtcy0+TkJhbmRzOyBpKyspCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdGhlIGZpbHRlciBzZXR0aW5ncwotICAgICAgICAgKi8KLSAgICAgICAgZmMgPSAoTFZNX1VJTlQzMilwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5OyAgICAgLyogR2V0IHRoZSBiYW5kIGNlbnRyZSBmcmVxdWVuY3kgKi8KLSAgICAgICAgUUZhY3RvciA9IChMVk1fSU5UMTYpcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLlFGYWN0b3I7ICAgLyogR2V0IHRoZSBiYW5kIFEgZmFjdG9yICovCi0KLSNpZmRlZiBCVUlMRF9GTE9BVAotICAgICAgICBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldID0gTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdDsgLyogRGVmYXVsdCB0byBzaW5nbGUgcHJlY2lzaW9uICovCi0jZWxzZQotICAgICAgICAvKgotICAgICAgICAgKiBGb3IgZWFjaCBmaWx0ZXIgc2V0IHRoZSB0eXBlIG9mIGJpcXVhZCByZXF1aXJlZAotICAgICAgICAgKi8KLSAgICAgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXSA9IExWRVFOQl9TaW5nbGVQcmVjaXNpb247ICAgICAgICAgLyogRGVmYXVsdCB0byBzaW5nbGUgcHJlY2lzaW9uICovCi0jZW5kaWYKLSNpZm5kZWYgQlVJTERfRkxPQVQKLSAgICAgICAgaWYgKChmYyA8PCAxNSkgPD0gKExPV19GUkVRICogZnMpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogZmMgPD0gZnMvMTEwCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0gPSBMVkVRTkJfRG91YmxlUHJlY2lzaW9uOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCgoZmMgPDwgMTUpIDw9IChISUdIX0ZSRVEgKiBmcykpICYmIChRRmFjdG9yID4gMzAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIChmcy8xMTAgPCBmYyA8IGZzLzg1KSAmIChRPjMpCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0gPSBMVkVRTkJfRG91YmxlUHJlY2lzaW9uOwotICAgICAgICB9Ci0jZW5kaWYKLQotICAgICAgICAvKgotICAgICAgICAgKiBDaGVjayBmb3Igb3V0IG9mIHJhbmdlIGZyZXF1ZW5jaWVzCi0gICAgICAgICAqLwotICAgICAgICBpZiAoZmMgPiAoZnMgPj4gMSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0gPSBMVkVRTkJfT3V0T2ZSYW5nZTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogQ29weSB0aGUgZmlsdGVyIGRlZmluaXRpb24gdG8gcGVyc2lzdGFudCBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXSA9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXTsKLQotICAgIH0KLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWRVFOQl9TZXRDb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTZXRzIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzLiBUaGlzIHVzZXMgdGhlIHR5cGUgdG8gc2VsZWN0IHNpbmdsZSBvciBkb3VibGUgICAgICovCi0vKiAgcHJlY2lzaW9uIGNvZWZmaWNpZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcEluc3RhbmNlICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBQYXJhbXMgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkICAgIExWRVFOQl9TZXRDb2VmZmljaWVudHMoTFZFUU5CX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UpCi17Ci0KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGJhbmQgaW5kZXggKi8KLSAgICBMVkVRTkJfQmlxdWFkVHlwZV9lbiAgICBCaXF1YWRUeXBlOyAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGJpcXVhZCB0eXBlICovCi0KLQotICAgIC8qCi0gICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMgZm9yIGVhY2ggYmFuZCBieSB0aGUgaW5pdCBmdW5jdGlvbgotICAgICAqLwotICAgIGZvciAoaT0wOyBpPHBJbnN0YW5jZS0+UGFyYW1zLk5CYW5kczsgaSsrKQotICAgIHsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDaGVjayBiYW5kIHR5cGUgZm9yIGNvcnJlY3QgaW5pdGlhbGlzYXRpb24gbWV0aG9kIGFuZCByZWNhbGN1bGF0ZSB0aGUgY29lZmZpY2llbnRzCi0gICAgICAgICAqLwotICAgICAgICBCaXF1YWRUeXBlID0gcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXTsKLSAgICAgICAgc3dpdGNoICAoQmlxdWFkVHlwZSkKLSAgICAgICAgewotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgICAgICBjYXNlICAgIExWRVFOQl9TaW5nbGVQcmVjaXNpb25fRmxvYXQ6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIENhbGN1bGF0ZSB0aGUgc2luZ2xlIHByZWNpc2lvbiBjb2VmZmljaWVudHMKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGNvZWZmaWNpZW50cwotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXRbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRVFOQl9UYXBzX0Zsb2F0W2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgICAgY2FzZSAgICBMVkVRTkJfRG91YmxlUHJlY2lzaW9uOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFBLX0MzMl9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOwotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGRvdWJsZSBwcmVjaXNpb24gY29lZmZpY2llbnRzCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgTFZFUU5CX0RvdWJsZVByZWNDb2VmcygoTFZNX1VJTlQxNilwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOwotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGNvZWZmaWNpZW50cwotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIFBLXzJJX0QzMkYzMkNsbEdzc19UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRVFOQl9UYXBzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgICAgTFZFUU5CX1NpbmdsZVByZWNpc2lvbjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQS19DMTZfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBzaW5nbGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cwotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZpY2llbnRzKTsKLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBQS18ySV9EMzJGMzJDc3NHc3NfVFJDX1dSQV8wMV9Jbml0KCZwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+cEVRTkJfVGFwc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ2xlYXJzIHRoZSBmaWx0ZXIgZGF0YSBoaXN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcEluc3RhbmNlICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi12b2lkICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkoTFZFUU5CX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UpCi17Ci0gICAgTFZNX0lOVDE2ICAgICAgICpwVGFwQWRkcmVzczsKLSAgICBMVk1fSU5UMTYgICAgICAgTnVtVGFwczsKLQotCi0gICAgcFRhcEFkZHJlc3MgPSAoTFZNX0lOVDE2ICopcEluc3RhbmNlLT5wRVFOQl9UYXBzOwotICAgIE51bVRhcHMgICAgID0gKExWTV9JTlQxNikoKHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfVGFwc190KSkvc2l6ZW9mKExWTV9JTlQxNikpOwotCi0gICAgaWYgKE51bVRhcHMgIT0gMCkKLSAgICB7Ci0gICAgICAgIExvYWRDb25zdF8xNigwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCi0gICAgICAgICAgICAgICAgICAgICBwVGFwQWRkcmVzcywgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICBOdW1UYXBzKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLwotICAgIH0KLX0KLSNlbHNlCi12b2lkICAgIExWRVFOQl9DbGVhckZpbHRlckhpc3RvcnkoTFZFUU5CX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UpCi17Ci0gICAgTFZNX0ZMT0FUICAgICAgICpwVGFwQWRkcmVzczsKLSAgICBMVk1fSU5UMTYgICAgICAgTnVtVGFwczsKLQotICAgIHBUYXBBZGRyZXNzID0gKExWTV9GTE9BVCAqKXBJbnN0YW5jZS0+cEVRTkJfVGFwc19GbG9hdDsKLSAgICBOdW1UYXBzICAgICA9IChMVk1fSU5UMTYpKChwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCYW5kcyAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpIC8gc2l6ZW9mKExWTV9GTE9BVCkpOwotCi0gICAgaWYgKE51bVRhcHMgIT0gMCkKLSAgICB7Ci0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBoaXN0b3J5LCB2YWx1ZSAwICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwVGFwQWRkcmVzcywgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICBOdW1UYXBzKTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLwotICAgIH0KLX0KLSNlbmRpZgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfQ29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTZXRzIG9yIGNoYW5nZXMgdGhlIExpZmVWaWJlcyBtb2R1bGUgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWRVFOQl9TdWNjZXNzICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgSW5zdGFuY2Ugb3IgcFBhcmFtcyAgaXMgTlVMTCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICBOVUxMIGFkZHJlc3MgZm9yIHRoZSBlcXVhbGlzZXIgZmlsdGVyIGRlZmluaXRpb25zIGFuZCB0aGUgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciBvZiBiYW5kcyBpcyBub24temVybyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZFUU5CX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Db250cm9sKExWRVFOQl9IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfUGFyYW1zX3QgICAgICAgICpwUGFyYW1zKQotewotCi0gICAgTFZFUU5CX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgYkNoYW5nZSAgICA9IExWTV9GQUxTRTsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICBpID0gMDsKLSAgICBMVkVRTkJfTW9kZV9lbiAgICAgICBPcGVyYXRpbmdNb2RlU2F2ZSA7Ci0KLSAgICAvKgotICAgICAqIENoZWNrIGZvciBlcnJvciBjb25kaXRpb25zCi0gICAgICovCi0gICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBQYXJhbXMgPT0gTFZNX05VTEwpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKLSAgICB9Ci0KLSAgICBpZigocFBhcmFtcy0+TkJhbmRzICE9MCkgJiYgKHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbj09TFZNX05VTEwpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKLSAgICB9Ci0KLSAgICBPcGVyYXRpbmdNb2RlU2F2ZSA9IHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGU7Ci0KLSAgICAvKiBTZXQgdGhlIGFscGhhIGZhY3RvciBvZiB0aGUgbWl4ZXIgKi8KLSAgICBpZiAocFBhcmFtcy0+U2FtcGxlUmF0ZSAhPSBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlKQotICAgIHsKLSAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSxMVkVRTkJfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKLSAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSxMVkVRTkJfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKLSAgICB9Ci0KLQotICAgIGlmKCAocEluc3RhbmNlLT5QYXJhbXMuTkJhbmRzICAgICAgICAgICAgIT0gIHBQYXJhbXMtPk5CYW5kcyAgICAgICAgICApIHx8Ci0gICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICAgICAhPSAgcFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAgICkgfHwKLSAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLnBCYW5kRGVmaW5pdGlvbiAgICE9ICBwUGFyYW1zLT5wQmFuZERlZmluaXRpb24gKSB8fAotICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAgICAgICAgIT0gIHBQYXJhbXMtPlNhbXBsZVJhdGUgICAgICApIHx8Ci0gICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgICAgICAhPSAgcFBhcmFtcy0+U291cmNlRm9ybWF0ICAgICkpCi0gICAgewotCi0gICAgICAgIGJDaGFuZ2UgPSBMVk1fVFJVRTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgcFBhcmFtcy0+TkJhbmRzOyBpKyspCi0gICAgICAgIHsKLQotICAgICAgICAgICAgaWYoKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5GcmVxdWVuY3kgICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5GcmVxdWVuY3kgKXx8Ci0gICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5HYWluICAgICAgICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5HYWluICAgICAgKXx8Ci0gICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5RRmFjdG9yICAgICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5RRmFjdG9yICAgKSkKLSAgICAgICAgICAgIHsKLQotICAgICAgICAgICAgICAgIGJDaGFuZ2UgPSBMVk1fVFJVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLy8gRHVyaW5nIG9wZXJhdGluZyBtb2RlIHRyYW5zaXRpb24sIHRoZXJlIGlzIGEgcmFjZSBjb25kaXRpb24gd2hlcmUgdGhlIG1vZGUKLSAgICAvLyBpcyBzdGlsbCBMVkVRTkJfT04sIGJ1dCB0aGUgZWZmZWN0IGlzIGNvbnNpZGVyZWQgZGlzYWJsZWQgaW4gdGhlIHVwcGVyIGxheWVycy4KLSAgICAvLyBtb2RlQ2hhbmdlIGhhbmRsZXMgdGhpcyBzcGVjaWFsIHJhY2UgY29uZGl0aW9uLgotICAgIGNvbnN0IGludCAvKiBib29sICovIG1vZGVDaGFuZ2UgPSBwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IE9wZXJhdGluZ01vZGVTYXZlCi0gICAgICAgICAgICB8fCAoT3BlcmF0aW5nTW9kZVNhdmUgPT0gTFZFUU5CX09OCi0gICAgICAgICAgICAgICAgICAgICYmIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24KLSAgICAgICAgICAgICAgICAgICAgJiYgTFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkgPT0gMCk7Ci0KLSAgICBpZiAoYkNoYW5nZSB8fCBtb2RlQ2hhbmdlKSB7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogSWYgdGhlIHNhbXBsZSByYXRlIGhhcyBjaGFuZ2VkIGNsZWFyIHRoZSBoaXN0b3J5Ci0gICAgICAgICAqLwotICAgICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKQotICAgICAgICB7Ci0gICAgICAgICAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KHBJbnN0YW5jZSk7ICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogVXBkYXRlIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzCi0gICAgICAgICAqLwotICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcyA9ICpwUGFyYW1zOwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogUmVzZXQgdGhlIGZpbHRlcnMgZXhjZXB0IGlmIHRoZSBhbGdvIGlzIHN3aXRjaGVkIG9mZgotICAgICAgICAgKi8KLSAgICAgICAgaWYocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVkVRTkJfQllQQVNTKXsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBSZXNldCB0aGUgZmlsdGVycyBhcyBhbGwgcGFyYW1ldGVycyBjb3VsZCBoYXZlIGNoYW5nZWQKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgTFZFUU5CX1NldEZpbHRlcnMocEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOZXcgcGFyYW1ldGVycyAqLwotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogVXBkYXRlIHRoZSBmaWx0ZXJzCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIExWRVFOQl9TZXRDb2VmZmljaWVudHMocEluc3RhbmNlKTsgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBwb2ludGVyICovCi0gICAgICAgIH0KLQotICAgICAgICBpZiAobW9kZUNoYW5nZSkgewotICAgICAgICAgICAgaWYocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9PSBMVkVRTkJfT04pCi0gICAgICAgICAgICB7Ci0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLCAxLjBmKTsKLSAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLCAwLjBmKTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSxMVk1fTUFYSU5UXzE2KTsKLSAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLDApOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAxOwotICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvKiBTdGF5IG9uIHRoZSBPTiBvcGVyYXRpbmcgbW9kZSB1bnRpbCB0aGUgdHJhbnNpdGlvbiBpcyBkb25lICovCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBtYXkgaW50cm9kdWNlIGEgc3RhdGUgcmFjZSBjb25kaXRpb24gaWYgdGhlIGVmZmVjdCBpcyBlbmFibGVkIGFnYWluCi0gICAgICAgICAgICAgICAgLy8gd2hpbGUgaW4gdHJhbnNpdGlvbi4gIFRoaXMgaXMgZml4ZWQgaW4gdGhlIG1vZGVDaGFuZ2UgbG9naWMuCi0gICAgICAgICAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWRVFOQl9PTjsKLSNpZmRlZiBCVUlMRF9GTE9BVAotICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sIDAuMGYpOwotICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDEuMGYpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLDApOwotICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sTFZNX01BWElOVF8xNik7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7Ci0gICAgICAgICAgICAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCAgICAgICAgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSxMVkVRTkJfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKLSAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sTFZFUU5CX0JZUEFTU19NSVhFUl9UQywoTFZNX0ZzX2VuKXBQYXJhbXMtPlNhbXBsZVJhdGUsMik7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID0gTFZNX1RSVUU7Ci0gICAgICAgIH0KLQotICAgIH0KLSAgICByZXR1cm4oTFZFUU5CX1NVQ0NFU1MpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ2FsbEJhY2sgZnVuY3Rpb24gb2YgdGhlIG1peGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICB0cmFuc2l0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWTV9JTlQzMiBMVkVRTkJfQnlwYXNzTWl4ZXJDYWxsQmFjayAodm9pZCogaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwR2VuZXJhbFB1cnBvc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBDYWxsYmFja1BhcmFtKQotewotICAgIExWRVFOQl9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSA9KExWRVFOQl9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVk1fQ2FsbGJhY2sgICAgICAgICAgICBDYWxsQmFjayAgPSBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5DYWxsQmFjazsKLQotICAgICh2b2lkKSBwR2VuZXJhbFB1cnBvc2U7Ci0KLSAgICAgLyoKLSAgICAgICogU2VuZCBhbiBBTEdPRkYgZXZlbnQgaWYgdGhlIE9OLT5PRkYgc3dpdGNoIHRyYW5zaXRpb24gaXMgZmluaXNoZWQKLSAgICAgICovCi0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICBpZigoTFZDX01peGVyX0dldFRhcmdldCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSkgPT0gMCkgJiYKLSAgICAgICAoQ2FsbGJhY2tQYXJhbSA9PSAwKSl7Ci0jZWxzZQotICAgIGlmKChMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdKSA9PSAweDAwMDAwMDAwKSAmJgotICAgICAgIChDYWxsYmFja1BhcmFtID09IDApKXsKLSNlbmRpZgotICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZFUU5CX0JZUEFTUzsKLSAgICAgICAgaWYgKENhbGxCYWNrICE9IExWTV9OVUxMKXsKLSAgICAgICAgICAgIENhbGxCYWNrKHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLnBCdW5kbGVJbnN0YW5jZSwgTFZNX05VTEwsIEFMR09SSVRITV9FUU5CX0lEfExWRVFOQl9FVkVOVF9BTEdPRkYpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiAgRXhpdCB0cmFuc2l0aW9uIHN0YXRlCi0gICAgICovCi0gICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9GQUxTRTsKLQotICAgIHJldHVybiAxOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Db250cm9sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmI0YTdlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfQ29udHJvbC5jcHAKQEAgLTAsMCArMSw0MzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkVRTkIuaCIKKyNpbmNsdWRlICJMVkVRTkJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJCSVFVQUQuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSAgICAgTE9XX0ZSRVEgICAgICAgICAgICAyOTggICAgICAgICAgICAgLyogMzI3NjgvMTEwIGZvciBsb3cgdGVzdCBmcmVxdWVuY3kgKi8KKyNkZWZpbmUgICAgIEhJR0hfRlJFUSAgICAgICAgICAgMzg2ICAgICAgICAgICAgIC8qIDMyNzY4Lzg1IGZvciBoaWdoIHRlc3QgZnJlcXVlbmN5ICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWRVFOQl9HZXRQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmVxdWVzdCB0aGUgTi1CYW5kIGVxdWFsaXNlciBwYXJhbWV0ZXJzLiBUaGUgY3VycmVudCBwYXJhbWV0ZXIgc2V0IGlzIHJldHVybmVkIHZpYSAgKi8KKy8qICB0aGUgcGFyYW1ldGVyIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TVUNDRVNTICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgSW5zdGFuY2Ugb3IgcFBhcmFtcyAgaXMgTlVMTCBwb2ludGVyICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0dldFBhcmFtZXRlcnMoTFZFUU5CX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgKnBQYXJhbXMpCit7CisKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0oTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisgICAvKgorICAgICAqIENoZWNrIGZvciBlcnJvciBjb25kaXRpb25zCisgICAgICovCisgICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBQYXJhbXMgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICAqcFBhcmFtcyA9IHBJbnN0YW5jZS0+UGFyYW1zOworCisgICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWRVFOQl9HZXRDYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgR2V0IHRoZSBOLUJhbmQgZXF1YWxpc2VyIGNhcGFiaWxpdGllcy4gVGhlIGN1cnJlbnQgY2FwYWJpbGl0aWVzIGFyZSByZXR1cm5lZCAgICAqLworLyogIHZpYSB0aGUgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBjYXBhYmlsaXR5IHN0cnVjdHVyZSAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfU3VjY2VzcyAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgIGhJbnN0YW5jZSBvciBwQ2FwYWJpbGl0aWVzIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0dldENhcGFiaWxpdGllcyhMVkVRTkJfSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQ2FwYWJpbGl0aWVzX3QgICAgICpwQ2FwYWJpbGl0aWVzKQoreworCisgICAgTFZFUU5CX0luc3RhbmNlX3QgICAgKnBJbnN0YW5jZSA9KExWRVFOQl9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwQ2FwYWJpbGl0aWVzID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7CisgICAgfQorCisgICAgKnBDYXBhYmlsaXRpZXMgPSBwSW5zdGFuY2UtPkNhcGFiaWxpdGllczsKKworICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZFUU5CX1NldEZpbHRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNldHMgdGhlIGZpbHRlciB0eXBlIGJhc2VkIG9uIHRoZSBkZWZpbml0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB2b2lkICAgICAgICAgICAgICAgIE5vdGhpbmcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUbyBzZWxlY3QgdGhlIGJpcXVhZCB0eXBlIHRoZSBmb2xsb3cgcnVsZXMgYXJlIGFwcGxpZWQ6ICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBEb3VibGUgcHJlY2lzaW9uICAgIGlmIChmYyA8PSBmcy8xMTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgRG91YmxlIHByZWNpc2lvbiAgICBpZiAoZnMvMTEwIDwgZmMgPCBmcy84NSkgJiAoUT4zKSAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIFNpbmdsZSBwcmVjaXNpb24gICAgb3RoZXJ3aXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAgICBMVkVRTkJfU2V0RmlsdGVycyhMVkVRTkJfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQoreworICAgIGV4dGVybiBjb25zdCBMVk1fVUlOVDMyICAgTFZFUU5CX1NhbXBsZVJhdGVUYWJbXTsgICAgICAgICAgIC8qIFNhbXBsZSByYXRlIHRhYmxlICovCisKKyAgICBMVk1fVUlOVDE2ICAgICAgICAgIGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgYmFuZCBpbmRleCAqLworICAgIExWTV9VSU5UMzIgICAgICAgICAgZnMgPSAoTFZNX1VJTlQzMilMVkVRTkJfU2FtcGxlUmF0ZVRhYlsoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsgIC8qIFNhbXBsZSByYXRlICovCisgICAgTFZNX1VJTlQzMiAgICAgICAgICBmYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICBMVk1fSU5UMTYgICAgICAgICAgIFFGYWN0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgUSBmYWN0b3IgKi8KKworICAgIHBJbnN0YW5jZS0+TkJhbmRzID0gcFBhcmFtcy0+TkJhbmRzOworCisgICAgZm9yIChpPTA7IGk8cFBhcmFtcy0+TkJhbmRzOyBpKyspCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIGZpbHRlciBzZXR0aW5ncworICAgICAgICAgKi8KKyAgICAgICAgZmMgPSAoTFZNX1VJTlQzMilwUGFyYW1zLT5wQmFuZERlZmluaXRpb25baV0uRnJlcXVlbmN5OyAgICAgLyogR2V0IHRoZSBiYW5kIGNlbnRyZSBmcmVxdWVuY3kgKi8KKyAgICAgICAgUUZhY3RvciA9IChMVk1fSU5UMTYpcFBhcmFtcy0+cEJhbmREZWZpbml0aW9uW2ldLlFGYWN0b3I7ICAgLyogR2V0IHRoZSBiYW5kIFEgZmFjdG9yICovCisKKyAgICAgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXSA9IExWRVFOQl9TaW5nbGVQcmVjaXNpb25fRmxvYXQ7IC8qIERlZmF1bHQgdG8gc2luZ2xlIHByZWNpc2lvbiAqLworCisgICAgICAgIC8qCisgICAgICAgICAqIENoZWNrIGZvciBvdXQgb2YgcmFuZ2UgZnJlcXVlbmNpZXMKKyAgICAgICAgICovCisgICAgICAgIGlmIChmYyA+IChmcyA+PiAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3RhbmNlLT5wQmlxdWFkVHlwZVtpXSA9IExWRVFOQl9PdXRPZlJhbmdlOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29weSB0aGUgZmlsdGVyIGRlZmluaXRpb24gdG8gcGVyc2lzdGFudCBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXSA9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXTsKKworICAgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVkVRTkJfU2V0Q29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cy4gVGhpcyB1c2VzIHRoZSB0eXBlIHRvIHNlbGVjdCBzaW5nbGUgb3IgZG91YmxlICAgICAqLworLyogIHByZWNpc2lvbiBjb2VmZmljaWVudHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCAgICBMVkVRTkJfU2V0Q29lZmZpY2llbnRzKExWRVFOQl9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlKQoreworCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgaTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBiYW5kIGluZGV4ICovCisgICAgTFZFUU5CX0JpcXVhZFR5cGVfZW4gICAgQmlxdWFkVHlwZTsgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBiaXF1YWQgdHlwZSAqLworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIGNvZWZmaWNpZW50cyBmb3IgZWFjaCBiYW5kIGJ5IHRoZSBpbml0IGZ1bmN0aW9uCisgICAgICovCisgICAgZm9yIChpPTA7IGk8cEluc3RhbmNlLT5QYXJhbXMuTkJhbmRzOyBpKyspCisgICAgeworCisgICAgICAgIC8qCisgICAgICAgICAqIENoZWNrIGJhbmQgdHlwZSBmb3IgY29ycmVjdCBpbml0aWFsaXNhdGlvbiBtZXRob2QgYW5kIHJlY2FsY3VsYXRlIHRoZSBjb2VmZmljaWVudHMKKyAgICAgICAgICovCisgICAgICAgIEJpcXVhZFR5cGUgPSBwSW5zdGFuY2UtPnBCaXF1YWRUeXBlW2ldOworICAgICAgICBzd2l0Y2ggIChCaXF1YWRUeXBlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlICAgIExWRVFOQl9TaW5nbGVQcmVjaXNpb25fRmxvYXQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgUEtfRkxPQVRfQ29lZnNfdCAgICAgIENvZWZmaWNpZW50czsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIENhbGN1bGF0ZSB0aGUgc2luZ2xlIHByZWNpc2lvbiBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wQmFuZERlZmluaXRpb25zW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIFBLXzJJX0QzMkYzMkNzc0dzc19UUkNfV1JBXzAxX0luaXQoJnBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXRbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5wRVFOQl9UYXBzX0Zsb2F0W2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENsZWFycyB0aGUgZmlsdGVyIGRhdGEgaGlzdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KExWRVFOQl9JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlKQoreworICAgIExWTV9GTE9BVCAgICAgICAqcFRhcEFkZHJlc3M7CisgICAgTFZNX0lOVDE2ICAgICAgIE51bVRhcHM7CisKKyAgICBwVGFwQWRkcmVzcyA9IChMVk1fRkxPQVQgKilwSW5zdGFuY2UtPnBFUU5CX1RhcHNfRmxvYXQ7CisgICAgTnVtVGFwcyAgICAgPSAoTFZNX0lOVDE2KSgocEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmFuZHMgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpKSAvIHNpemVvZihMVk1fRkxPQVQpKTsKKworICAgIGlmIChOdW1UYXBzICE9IDApCisgICAgeworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDbGVhciB0aGUgaGlzdG9yeSwgdmFsdWUgMCAqLworICAgICAgICAgICAgICAgICAgICAgICAgcFRhcEFkZHJlc3MsICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgTnVtVGFwcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyAgICB9Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9Db250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNldHMgb3IgY2hhbmdlcyB0aGUgTGlmZVZpYmVzIG1vZHVsZSBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgUG9pbnRlciB0byBhIHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX1N1Y2Nlc3MgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICBJbnN0YW5jZSBvciBwUGFyYW1zICBpcyBOVUxMIHBvaW50ZXIgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgIE5VTEwgYWRkcmVzcyBmb3IgdGhlIGVxdWFsaXNlciBmaWx0ZXIgZGVmaW5pdGlvbnMgYW5kIHRoZSAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGJhbmRzIGlzIG5vbi16ZXJvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0NvbnRyb2woTFZFUU5CX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9QYXJhbXNfdCAgICAgICAgKnBQYXJhbXMpCit7CisKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlID0gKExWRVFOQl9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICBiQ2hhbmdlICAgID0gTFZNX0ZBTFNFOworICAgIExWTV9JTlQxNiAgICAgICAgICAgIGkgPSAwOworICAgIExWRVFOQl9Nb2RlX2VuICAgICAgIE9wZXJhdGluZ01vZGVTYXZlIDsKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKKyAgICAgKi8KKyAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocFBhcmFtcyA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gTFZFUU5CX05VTExBRERSRVNTOworICAgIH0KKworICAgIGlmKChwUGFyYW1zLT5OQmFuZHMgIT0wKSAmJiAocFBhcmFtcy0+cEJhbmREZWZpbml0aW9uPT1MVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gTFZFUU5CX05VTExBRERSRVNTOworICAgIH0KKworICAgIE9wZXJhdGluZ01vZGVTYXZlID0gcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZTsKKworICAgIC8qIFNldCB0aGUgYWxwaGEgZmFjdG9yIG9mIHRoZSBtaXhlciAqLworICAgIGlmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUpCisgICAgeworICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLExWRVFOQl9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLExWRVFOQl9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworICAgIH0KKworICAgIGlmKCAocEluc3RhbmNlLT5QYXJhbXMuTkJhbmRzICAgICAgICAgICAgIT0gIHBQYXJhbXMtPk5CYW5kcyAgICAgICAgICApIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICAgICAhPSAgcFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAgICkgfHwKKyAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLnBCYW5kRGVmaW5pdGlvbiAgICE9ICBwUGFyYW1zLT5wQmFuZERlZmluaXRpb24gKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAgICAgICAgIT0gIHBQYXJhbXMtPlNhbXBsZVJhdGUgICAgICApIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgICAgICAhPSAgcFBhcmFtcy0+U291cmNlRm9ybWF0ICAgICkpCisgICAgeworCisgICAgICAgIGJDaGFuZ2UgPSBMVk1fVFJVRTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yKGkgPSAwOyBpIDwgcFBhcmFtcy0+TkJhbmRzOyBpKyspCisgICAgICAgIHsKKworICAgICAgICAgICAgaWYoKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5GcmVxdWVuY3kgICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5GcmVxdWVuY3kgKXx8CisgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5HYWluICAgICAgICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5HYWluICAgICAgKXx8CisgICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5RRmFjdG9yICAgICE9IHBQYXJhbXMtPnBCYW5kRGVmaW5pdGlvbltpXS5RRmFjdG9yICAgKSkKKyAgICAgICAgICAgIHsKKworICAgICAgICAgICAgICAgIGJDaGFuZ2UgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIER1cmluZyBvcGVyYXRpbmcgbW9kZSB0cmFuc2l0aW9uLCB0aGVyZSBpcyBhIHJhY2UgY29uZGl0aW9uIHdoZXJlIHRoZSBtb2RlCisgICAgLy8gaXMgc3RpbGwgTFZFUU5CX09OLCBidXQgdGhlIGVmZmVjdCBpcyBjb25zaWRlcmVkIGRpc2FibGVkIGluIHRoZSB1cHBlciBsYXllcnMuCisgICAgLy8gbW9kZUNoYW5nZSBoYW5kbGVzIHRoaXMgc3BlY2lhbCByYWNlIGNvbmRpdGlvbi4KKyAgICBjb25zdCBpbnQgLyogYm9vbCAqLyBtb2RlQ2hhbmdlID0gcFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBPcGVyYXRpbmdNb2RlU2F2ZQorICAgICAgICAgICAgfHwgKE9wZXJhdGluZ01vZGVTYXZlID09IExWRVFOQl9PTgorICAgICAgICAgICAgICAgICAgICAmJiBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uCisgICAgICAgICAgICAgICAgICAgICYmIExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pID09IDApOworCisgICAgaWYgKGJDaGFuZ2UgfHwgbW9kZUNoYW5nZSkgeworCisgICAgICAgIC8qCisgICAgICAgICAqIElmIHRoZSBzYW1wbGUgcmF0ZSBoYXMgY2hhbmdlZCBjbGVhciB0aGUgaGlzdG9yeQorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkKKyAgICAgICAgeworICAgICAgICAgICAgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeShwSW5zdGFuY2UpOyAgICAgICAgICAgLyogQ2xlYXIgdGhlIGhpc3RvcnkgKi8KKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFVwZGF0ZSB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycworICAgICAgICAgKi8KKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMgPSAqcFBhcmFtczsKKworICAgICAgICAvKgorICAgICAgICAgKiBSZXNldCB0aGUgZmlsdGVycyBleGNlcHQgaWYgdGhlIGFsZ28gaXMgc3dpdGNoZWQgb2ZmCisgICAgICAgICAqLworICAgICAgICBpZihwUGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWRVFOQl9CWVBBU1MpeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFJlc2V0IHRoZSBmaWx0ZXJzIGFzIGFsbCBwYXJhbWV0ZXJzIGNvdWxkIGhhdmUgY2hhbmdlZAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBMVkVRTkJfU2V0RmlsdGVycyhwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgcG9pbnRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzICovCisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBVcGRhdGUgdGhlIGZpbHRlcnMKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgTFZFUU5CX1NldENvZWZmaWNpZW50cyhwSW5zdGFuY2UpOyAgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBvaW50ZXIgKi8KKyAgICAgICAgfQorCisgICAgICAgIGlmIChtb2RlQ2hhbmdlKSB7CisgICAgICAgICAgICBpZihwUGFyYW1zLT5PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLCAxLjBmKTsKKyAgICAgICAgICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLCAwLjBmKTsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7CisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCAgICAgICAgPSAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFN0YXkgb24gdGhlIE9OIG9wZXJhdGluZyBtb2RlIHVudGlsIHRoZSB0cmFuc2l0aW9uIGlzIGRvbmUgKi8KKyAgICAgICAgICAgICAgICAvLyBUaGlzIG1heSBpbnRyb2R1Y2UgYSBzdGF0ZSByYWNlIGNvbmRpdGlvbiBpZiB0aGUgZWZmZWN0IGlzIGVuYWJsZWQgYWdhaW4KKyAgICAgICAgICAgICAgICAvLyB3aGlsZSBpbiB0cmFuc2l0aW9uLiAgVGhpcyBpcyBmaXhlZCBpbiB0aGUgbW9kZUNoYW5nZSBsb2dpYy4KKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZFUU5CX09OOworICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sIDAuMGYpOworICAgICAgICAgICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDEuMGYpOworICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ICAgICAgICA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLExWRVFOQl9CWVBBU1NfTUlYRVJfVEMsKExWTV9Gc19lbilwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXSxMVkVRTkJfQllQQVNTX01JWEVSX1RDLChMVk1fRnNfZW4pcFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPSBMVk1fVFJVRTsKKyAgICAgICAgfQorCisgICAgfQorICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ2FsbEJhY2sgZnVuY3Rpb24gb2YgdGhlIG1peGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICB0cmFuc2l0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWTV9JTlQzMiBMVkVRTkJfQnlwYXNzTWl4ZXJDYWxsQmFjayAodm9pZCogaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpwR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiBDYWxsYmFja1BhcmFtKQoreworICAgIExWRVFOQl9JbnN0YW5jZV90ICAgICAgKnBJbnN0YW5jZSA9KExWRVFOQl9JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVk1fQ2FsbGJhY2sgICAgICAgICAgICBDYWxsQmFjayAgPSBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5DYWxsQmFjazsKKworICAgICh2b2lkKSBwR2VuZXJhbFB1cnBvc2U7CisKKyAgICAgLyoKKyAgICAgICogU2VuZCBhbiBBTEdPRkYgZXZlbnQgaWYgdGhlIE9OLT5PRkYgc3dpdGNoIHRyYW5zaXRpb24gaXMgZmluaXNoZWQKKyAgICAgICovCisgICAgaWYoKExWQ19NaXhlcl9HZXRUYXJnZXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0pID09IDApICYmCisgICAgICAgKENhbGxiYWNrUGFyYW0gPT0gMCkpeworICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZFUU5CX0JZUEFTUzsKKyAgICAgICAgaWYgKENhbGxCYWNrICE9IExWTV9OVUxMKXsKKyAgICAgICAgICAgIENhbGxCYWNrKHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLnBCdW5kbGVJbnN0YW5jZSwgTFZNX05VTEwsIEFMR09SSVRITV9FUU5CX0lEfExWRVFOQl9FVkVOVF9BTEdPRkYpOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgRXhpdCB0cmFuc2l0aW9uIHN0YXRlCisgICAgICovCisgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9GQUxTRTsKKworICAgIHJldHVybiAxOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTFiYmI3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDM4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJMVkVRTkIuaCIKLSNpbmNsdWRlICJMVkVRTkJfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkluc3RBbGxvYy5oIgotI2luY2x1ZGUgPHN0cmluZy5oPiAvKiBGb3IgbWVtc2V0ICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KLS8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLwotLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLwotLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KLS8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkVRTkJfU1VDQ0VTUyAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgIFdoZW4gYW55IG9mIHBNZW1vcnlUYWJsZSBhbmQgcENhcGFiaWxpdGllcyBpcyBOVUxMIGFkZHJlc3MgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZFUU5CX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9NZW1vcnkoTFZFUU5CX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9NZW1UYWJfdCAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgICAgKnBDYXBhYmlsaXRpZXMpCi17Ci0KLSAgICBJTlNUX0FMTE9DICAgICAgICAgIEFsbG9jTWVtOwotICAgIExWRVFOQl9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKLQotCi0gICAgaWYoKHBNZW1vcnlUYWJsZSA9PSBMVk1fTlVMTCl8fCAocENhcGFiaWxpdGllcyA9PSBMVk1fTlVMTCkpCi0gICAgewotICAgICAgICByZXR1cm4gTFZFUU5CX05VTExBRERSRVNTOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBGaWxsIGluIHRoZSBtZW1vcnkgdGFibGUKLSAgICAgKi8KLSAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogSW5zdGFuY2UgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWRVFOQl9JbnN0YW5jZV90KSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fSU5TVEFOQ0VdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW0pOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX0lOU1RBTkNFXS5BbGlnbm1lbnQgICAgPSBMVkVRTkJfSU5TVEFOQ0VfQUxJR047Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fSU5TVEFOQ0VdLlR5cGUgICAgICAgICA9IExWRVFOQl9QRVJTSVNURU5UOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFBlcnNpc3RhbnQgZGF0YSBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOwotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSk7Ci0gICAgICAgIC8qIEVxdWFsaXNlciBCaXF1YWQgVGFwcyAqLwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpKSk7Ci0gICAgICAgIC8qIEZpbHRlciBkZWZpbml0aW9ucyAqLwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAocENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoTFZFUU5CX0JhbmREZWZfdCkpKTsKLSAgICAgICAgLyogQmlxdWFkIHR5cGVzICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmlxdWFkVHlwZV9lbikpKTsKLSNlbHNlCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCkpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfVGFwc190KSk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCkpKTsgLyogRXF1YWxpc2VyIEJpcXVhZCBUYXBzICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmFuZERlZl90KSkpOyAgICAgICAgLyogRmlsdGVyIGRlZmluaXRpb25zICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmlxdWFkVHlwZV9lbikpKTsgICAgLyogQmlxdWFkIHR5cGVzICovCi0jZW5kaWYKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW0pOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uQWxpZ25tZW50ICAgID0gTFZFUU5CX0RBVEFfQUxJR047Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVkVRTkJfUEVSU0lTVEVOVF9EQVRBOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogUGVyc2lzdGFudCBjb2VmZmljaWVudCBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOwotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSk7Ci0gICAgICAgIC8qIEVxdWFsaXNlciBCaXF1YWQgSW5zdGFuY2UgKi8KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpKTsKLSNlbHNlCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkpOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9JbnN0YW5jZV90KSk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF9JbnN0YW5jZV90KSk7IC8qIEVxdWFsaXNlciBCaXF1YWQgSW5zdGFuY2UgKi8KLSNlbmRpZgotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5BbGlnbm1lbnQgICAgPSBMVkVRTkJfQ09FRl9BTElHTjsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlR5cGUgICAgICAgICA9IExWRVFOQl9QRVJTSVNURU5UX0NPRUY7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTY3JhdGNoIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7Ci0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX1NDUkFUQ0hCVUZGRVJTICogc2l6ZW9mKExWTV9GTE9BVCkgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpOwotI2Vsc2UKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX1NDUkFUQ0hCVUZGRVJTKnNpemVvZihMVk1fSU5UMTYpKnBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7Ci0jZW5kaWYKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5TaXplICAgICAgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW0pOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLkFsaWdubWVudCAgICAgICAgID0gTFZFUU5CX1NDUkFUQ0hfQUxJR047Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0uVHlwZSAgICAgICAgICAgICAgPSBMVkVRTkJfU0NSQVRDSDsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MgICAgICA9IExWTV9OVUxMOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBSZWFkIGJhY2sgbWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KLSAgICAgICAgKnBNZW1vcnlUYWJsZSA9IHBJbnN0YW5jZS0+TWVtb3J5VGFibGU7Ci0gICAgfQotCi0gICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKLX0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9Jbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENyZWF0ZSBhbmQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBOLUJhbmQgZXF1YWxpc2VyIG1vZHVsZSAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBhbiBhbGdvcml0aG0gaW5zdGFuY2UgYnkgY2FsbGluZyB3aXRoICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSBzZXQgdG8gTlVMTC4gSW4gdGhpcyBjYXNlIHRoZSBhbGdvcml0aG0gcmV0dXJucyB0aGUgbmV3IGluc3RhbmNlICAgICAgICAgICovCi0vKiAgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZm9yY2UgYSBmdWxsIHJlLWluaXRpYWxpc2F0aW9uIG9mIHRoZSBhbGdvcml0aG0gICAgICAgICovCi0vKiAgYnkgY2FsbGluZyB3aXRoIGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZS4gSW4gdGhpcyBjYXNlIHRoZSBtZW1vcnkgdGFibGUgICAgICAgICAgKi8KLS8qICBzaG91bGQgYmUgY29ycmVjdCBmb3IgdGhlIGluc3RhbmNlLCB0aGlzIGNhbiBiZSBlbnN1cmVkIGJ5IGNhbGxpbmcgdGhlIGZ1bmN0aW9uICAgICAqLwotLyogIERCRV9NZW1vcnkgYmVmb3JlIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBjYXBhYmlsaXRpZXMgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkVRTkJfU1VDQ0VTUyAgICAgICAgICBJbml0aWFsaXNhdGlvbiBzdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgICAgV2hlbiBwQ2FwYWJpbGl0aWVzIG9yIHBNZW1vcnlUYWJsZWlzIG9yIHBoSW5zdGFuY2UgYXJlIE5VTEwgKi8KLS8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICAgIE9uZSBvciBtb3JlIG9mIHRoZSBtZW1vcnkgcmVnaW9ucyBoYXMgYSBOVUxMIGJhc2UgYWRkcmVzcyAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlciBmb3IgYSBtZW1vcnkgcmVnaW9uIHdpdGggYSBub24temVybyBzaXplLiAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoZSBpbnN0YW5jZSBoYW5kbGUgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWVtb3J5ICAgICAgKi8KLS8qICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDIuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkVRTkJfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Jbml0KExWRVFOQl9IYW5kbGVfdCAgICAgICAgICAqcGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX01lbVRhYl90ICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAqcENhcGFiaWxpdGllcykKLXsKLQotICAgIExWRVFOQl9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZTsKLSAgICBMVk1fVUlOVDMyICAgICAgICAgIE1lbVNpemU7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICBBbGxvY01lbTsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgIGk7Ci0KLSAgICAvKgotICAgICAqIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzCi0gICAgICovCi0gICAgaWYoKHBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpIHx8IChwQ2FwYWJpbGl0aWVzID09IExWTV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDaGVjayB0aGUgbWVtb3J5IHRhYmxlIGZvciBOVUxMIHBvaW50ZXJzCi0gICAgICovCi0gICAgZm9yIChpID0gMDsgaSA8IExWRVFOQl9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLlNpemUhPTApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3M9PUxWTV9OVUxMKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybihMVkVRTkJfTlVMTEFERFJFU1MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIGluc3RhbmNlIGhhbmRsZSBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXNlZAotICAgICAqLwotCi0gICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLCAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzKTsKLQotICAgIGlmICgqcGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgICpwaEluc3RhbmNlID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sIHNpemVvZihMVkVRTkJfSW5zdGFuY2VfdCkpOwotICAgIH0KLSAgICBwSW5zdGFuY2UgPShMVkVRTkJfSW5zdGFuY2VfdCAgKikqcGhJbnN0YW5jZTsKLQotCi0KLSAgICAvKgotICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlCi0gICAgICovCi0gICAgcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMgPSAqcENhcGFiaWxpdGllczsKLQotCi0gICAgLyoKLSAgICAgKiBTYXZlIHRoZSBtZW1vcnkgdGFibGUgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZSBhbmQKLSAgICAgKiBzZXQgdGhlIHN0cnVjdHVyZSBwb2ludGVycwotICAgICAqLwotICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUgICAgICAgPSAqcE1lbW9yeVRhYmxlOwotCi0gICAgLyoKLSAgICAgKiBBbGxvY2F0ZSBjb2VmZmljaWVudCBtZW1vcnkKLSAgICAgKi8KLSAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyk7Ci0KLSNpZmRlZiBCVUlMRF9GTE9BVAotICAgIC8qIEVxdWFsaXNlciBCaXF1YWQgSW5zdGFuY2UgKi8KLSAgICBwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0ID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSk7Ci0jZWxzZQotICAgIHBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGUgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkpOyAvKiBFcXVhbGlzZXIgQmlxdWFkIEluc3RhbmNlICovCi0jZW5kaWYKLQotCi0KLSAgICAvKgotICAgICAqIEFsbG9jYXRlIGRhdGEgbWVtb3J5Ci0gICAgICovCi0gICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MpOwotCi0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICBNZW1TaXplID0gKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSk7Ci0gICAgcEluc3RhbmNlLT5wRVFOQl9UYXBzX0Zsb2F0ID0gKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1TaXplKTsKLSNlbHNlCi0gICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCkpOwotICAgIHBJbnN0YW5jZS0+cEVRTkJfVGFwcyA9IChCaXF1YWRfMklfT3JkZXIyX1RhcHNfdCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtU2l6ZSk7Ci0jZW5kaWYKLSAgICBNZW1TaXplID0gKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpKTsKLSAgICBwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnMgID0gKExWRVFOQl9CYW5kRGVmX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVNpemUpOwotICAgIC8vIGNsZWFyIGFsbCB0aGUgYmFuZHMsIHNldHRpbmcgdGhlaXIgZ2FpbiB0byAwLCBvdGhlcndpc2Ugd2hlbiBhcHBseWluZyBuZXcgcGFyYW1zLAotICAgIC8vIGl0IHdpbGwgY29tcGFyZSBhZ2FpbnN0IHVuaW5pdGlhbGl6ZWQgdmFsdWVzCi0gICAgbWVtc2V0KHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9ucywgMCwgTWVtU2l6ZSk7Ci0gICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmlxdWFkVHlwZV9lbikpOwotICAgIHBJbnN0YW5jZS0+cEJpcXVhZFR5cGUgPSAoTFZFUU5CX0JpcXVhZFR5cGVfZW4gKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1TaXplKTsKLQotCi0gICAgLyoKLSAgICAgKiBJbnRlcm5hbGx5IG1hcCwgc3RydWN0dXJlIGFuZCBhbGxpZ24gc2NyYXRjaCBtZW1vcnkKLSAgICAgKi8KLSAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5wQmFzZUFkZHJlc3MpOwotCi0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICBwSW5zdGFuY2UtPnBGYXN0VGVtcG9yYXJ5ID0gKExWTV9GTE9BVCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0jZWxzZQotICAgIHBJbnN0YW5jZS0+cEZhc3RUZW1wb3JhcnkgPSAoTFZNX0lOVDE2ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fSU5UMTYpKTsKLSNlbmRpZgotCi0gICAgLyoKLSAgICAgKiBVcGRhdGUgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMKLSAgICAgKi8KLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5OQmFuZHMgICAgICAgICAgPSAwOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgICA9IExWRVFOQl9CWVBBU1M7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMucEJhbmREZWZpbml0aW9uID0gTFZNX05VTEw7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAgICAgID0gTFZFUU5CX0ZTXzgwMDA7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ICAgID0gTFZFUU5CX1NURVJFTzsKLQotICAgIC8qCi0gICAgICogSW5pdGlhbGlzZSB0aGUgZmlsdGVycwotICAgICAqLwotICAgIExWRVFOQl9TZXRGaWx0ZXJzKHBJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZXQgdGhlIGZpbHRlciB0eXBlcyAqLwotICAgICAgICAgICAgICAgICAgICAgICZwSW5zdGFuY2UtPlBhcmFtcyk7Ci0KLSAgICBMVkVRTkJfU2V0Q29lZmZpY2llbnRzKHBJbnN0YW5jZSk7ICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCi0KLSAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KHBJbnN0YW5jZSk7ICAgICAgICAgICAgICAgLyogQ2xlYXIgdGhlIGZpbHRlciBoaXN0b3J5ICovCi0KLSAgICAvKgotICAgICAqIEluaXRpYWxpc2UgdGhlIGJ5cGFzcyB2YXJpYWJsZXMKLSAgICAgKi8KLSAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLkNhbGxiYWNrU2V0ICAgICAgICA9IDA7Ci0gICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtICAgICAgPSAwOwotICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlICAgID0gKHZvaWQqKXBJbnN0YW5jZTsKLSAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLnBDYWxsQmFjayAgICAgICAgICA9IExWRVFOQl9CeXBhc3NNaXhlckNhbGxCYWNrOwotCi0gICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0sMCwwKTsKLSAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLDAsTFZNX0ZTXzgwMDAsMik7Ci0KLQotICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tTZXQgICAgICAgID0gMTsKLSAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gICAgICA9IDA7Ci0gICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5wQ2FsbGJhY2tIYW5kbGUgICAgPSBMVk1fTlVMTDsKLSAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9OVUxMOwotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDAsIDEuMGYpOwotICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDAsIExWTV9GU184MDAwLCAyKTsKLSNlbHNlCi0gICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sMCxMVk1fTUFYSU5UXzE2KTsKLSAgICBMVkNfTWl4ZXJfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLDAsTFZNX0ZTXzgwMDAsMik7Ci0jZW5kaWYKLQotICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gICAgICA9IExWTV9GQUxTRTsKLQotICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfSW5pdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcxYTkxNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX0luaXQuY3BwCkBAIC0wLDAgKzEsMzIyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZFUU5CLmgiCisjaW5jbHVkZSAiTFZFUU5CX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJJbnN0QWxsb2MuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4gLyogRm9yIG1lbXNldCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9NZW1vcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCisvKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICAgKi8KKy8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICAgKi8KKy8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICovCisvKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgY2FwYWJpbGl0aWVzICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICBXaGVuIGFueSBvZiBwTWVtb3J5VGFibGUgYW5kIHBDYXBhYmlsaXRpZXMgaXMgTlVMTCBhZGRyZXNzICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZFUU5CX1JldHVyblN0YXR1c19lbiBMVkVRTkJfTWVtb3J5KExWRVFOQl9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfTWVtVGFiX3QgICAgICAgICAgICAqcE1lbW9yeVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAgICpwQ2FwYWJpbGl0aWVzKQoreworCisgICAgSU5TVF9BTExPQyAgICAgICAgICBBbGxvY01lbTsKKyAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QgKiloSW5zdGFuY2U7CisKKyAgICBpZigocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKXx8IChwQ2FwYWJpbGl0aWVzID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBGaWxsIGluIHRoZSBtZW1vcnkgdGFibGUKKyAgICAgKi8KKyAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogSW5zdGFuY2UgbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWRVFOQl9JbnN0YW5jZV90KSk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fSU5TVEFOQ0VdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW0pOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX0lOU1RBTkNFXS5BbGlnbm1lbnQgICAgPSBMVkVRTkJfSU5TVEFOQ0VfQUxJR047CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fSU5TVEFOQ0VdLlR5cGUgICAgICAgICA9IExWRVFOQl9QRVJTSVNURU5UOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBQZXJzaXN0YW50IGRhdGEgbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QpKTsKKyAgICAgICAgLyogRXF1YWxpc2VyIEJpcXVhZCBUYXBzICovCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpKTsKKyAgICAgICAgLyogRmlsdGVyIGRlZmluaXRpb25zICovCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmFuZERlZl90KSkpOworICAgICAgICAvKiBCaXF1YWQgdHlwZXMgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CaXF1YWRUeXBlX2VuKSkpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZBbGxvY01lbSk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5BbGlnbm1lbnQgICAgPSBMVkVRTkJfREFUQV9BTElHTjsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlR5cGUgICAgICAgICA9IExWRVFOQl9QRVJTSVNURU5UX0RBVEE7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBQZXJzaXN0YW50IGNvZWZmaWNpZW50IG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkpOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSk7CisgICAgICAgIC8qIEVxdWFsaXNlciBCaXF1YWQgSW5zdGFuY2UgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENhcGFiaWxpdGllcy0+TWF4QmFuZHMgKiBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmQWxsb2NNZW0pOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uQWxpZ25tZW50ICAgID0gTFZFUU5CX0NPRUZfQUxJR047CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVkVRTkJfUEVSU0lTVEVOVF9DT0VGOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2NyYXRjaCBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgTFZNX05VTEwpOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfU0NSQVRDSEJVRkZFUlMgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0uU2l6ZSAgICAgICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkFsbG9jTWVtKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9TQ1JBVENIXS5BbGlnbm1lbnQgICAgICAgICA9IExWRVFOQl9TQ1JBVENIX0FMSUdOOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1NDUkFUQ0hdLlR5cGUgICAgICAgICAgICAgID0gTFZFUU5CX1NDUkFUQ0g7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzICAgICAgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUmVhZCBiYWNrIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCisgICAgICAgICpwTWVtb3J5VGFibGUgPSBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlOworICAgIH0KKworICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ3JlYXRlIGFuZCBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIE4tQmFuZCBlcXVhbGlzZXIgbW9kdWxlICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFsZ29yaXRobSBpbnN0YW5jZSBieSBjYWxsaW5nIHdpdGggICAgICAgICAgICovCisvKiAgaEluc3RhbmNlIHNldCB0byBOVUxMLiBJbiB0aGlzIGNhc2UgdGhlIGFsZ29yaXRobSByZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgICAgICAgICAgKi8KKy8qICBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBmb3JjZSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24gb2YgdGhlIGFsZ29yaXRobSAgICAgICAgKi8KKy8qICBieSBjYWxsaW5nIHdpdGggaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlLiBJbiB0aGlzIGNhc2UgdGhlIG1lbW9yeSB0YWJsZSAgICAgICAgICAqLworLyogIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIGVuc3VyZWQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gICAgICovCisvKiAgREJFX01lbW9yeSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGNhcGFiaWxpdGllcyAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TVUNDRVNTICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgICBXaGVuIHBDYXBhYmlsaXRpZXMgb3IgcE1lbW9yeVRhYmxlaXMgb3IgcGhJbnN0YW5jZSBhcmUgTlVMTCAqLworLyogIExWRVFOQl9OVUxMQUREUkVTUyAgICAgICAgT25lIG9yIG1vcmUgb2YgdGhlIG1lbW9yeSByZWdpb25zIGhhcyBhIE5VTEwgYmFzZSBhZGRyZXNzICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICBwb2ludGVyIGZvciBhIG1lbW9yeSByZWdpb24gd2l0aCBhIG5vbi16ZXJvIHNpemUuICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhlIGluc3RhbmNlIGhhbmRsZSBpcyB0aGUgcG9pbnRlciB0byB0aGUgYmFzZSBhZGRyZXNzIG9mIHRoZSBmaXJzdCBtZW1vcnkgICAgICAqLworLyogICAgICByZWdpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMi4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWRVFOQl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX0luaXQoTFZFUU5CX0hhbmRsZV90ICAgICAgICAgICpwaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfTWVtVGFiX3QgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0NhcGFiaWxpdGllc190ICAgICpwQ2FwYWJpbGl0aWVzKQoreworCisgICAgTFZFUU5CX0luc3RhbmNlX3QgICAqcEluc3RhbmNlOworICAgIExWTV9VSU5UMzIgICAgICAgICAgTWVtU2l6ZTsKKyAgICBJTlNUX0FMTE9DICAgICAgICAgIEFsbG9jTWVtOworICAgIExWTV9JTlQzMiAgICAgICAgICAgaTsKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMKKyAgICAgKi8KKyAgICBpZigocGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBNZW1vcnlUYWJsZSA9PSBMVk1fTlVMTCkgfHwgKHBDYXBhYmlsaXRpZXMgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIHRoZSBtZW1vcnkgdGFibGUgZm9yIE5VTEwgcG9pbnRlcnMKKyAgICAgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgTFZFUU5CX05SX01FTU9SWV9SRUdJT05TOyBpKyspCisgICAgeworICAgICAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25baV0uU2l6ZSE9MCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLnBCYXNlQWRkcmVzcz09TFZNX05VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuKExWRVFOQl9OVUxMQUREUkVTUyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFNldCB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkCisgICAgICovCisKKyAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX0lOU1RBTkNFXS5wQmFzZUFkZHJlc3MpOworCisgICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgKnBoSW5zdGFuY2UgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwgc2l6ZW9mKExWRVFOQl9JbnN0YW5jZV90KSk7CisgICAgfQorICAgIHBJbnN0YW5jZSA9KExWRVFOQl9JbnN0YW5jZV90ICAqKSpwaEluc3RhbmNlOworCisgICAgLyoKKyAgICAgKiBTYXZlIHRoZSBtZW1vcnkgdGFibGUgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZQorICAgICAqLworICAgIHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzID0gKnBDYXBhYmlsaXRpZXM7CisKKyAgICAvKgorICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlIGFuZAorICAgICAqIHNldCB0aGUgc3RydWN0dXJlIHBvaW50ZXJzCisgICAgICovCisgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZSAgICAgICA9ICpwTWVtb3J5VGFibGU7CisKKyAgICAvKgorICAgICAqIEFsbG9jYXRlIGNvZWZmaWNpZW50IG1lbW9yeQorICAgICAqLworICAgIEluc3RBbGxvY19Jbml0KCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkVRTkJfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0ucEJhc2VBZGRyZXNzKTsKKworICAgIC8qIEVxdWFsaXNlciBCaXF1YWQgSW5zdGFuY2UgKi8KKyAgICBwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0ID0gKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICopCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkFsbG9jTWVtLCBwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpKTsKKworICAgIC8qCisgICAgICogQWxsb2NhdGUgZGF0YSBtZW1vcnkKKyAgICAgKi8KKyAgICBJbnN0QWxsb2NfSW5pdCgmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZFUU5CX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyk7CisKKyAgICBNZW1TaXplID0gKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190KSk7CisgICAgcEluc3RhbmNlLT5wRVFOQl9UYXBzX0Zsb2F0ID0gKEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190ICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1TaXplKTsKKyAgICBNZW1TaXplID0gKHBDYXBhYmlsaXRpZXMtPk1heEJhbmRzICogc2l6ZW9mKExWRVFOQl9CYW5kRGVmX3QpKTsKKyAgICBwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnMgID0gKExWRVFOQl9CYW5kRGVmX3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbVNpemUpOworICAgIC8vIGNsZWFyIGFsbCB0aGUgYmFuZHMsIHNldHRpbmcgdGhlaXIgZ2FpbiB0byAwLCBvdGhlcndpc2Ugd2hlbiBhcHBseWluZyBuZXcgcGFyYW1zLAorICAgIC8vIGl0IHdpbGwgY29tcGFyZSBhZ2FpbnN0IHVuaW5pdGlhbGl6ZWQgdmFsdWVzCisgICAgbWVtc2V0KHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9ucywgMCwgTWVtU2l6ZSk7CisgICAgTWVtU2l6ZSA9IChwQ2FwYWJpbGl0aWVzLT5NYXhCYW5kcyAqIHNpemVvZihMVkVRTkJfQmlxdWFkVHlwZV9lbikpOworICAgIHBJbnN0YW5jZS0+cEJpcXVhZFR5cGUgPSAoTFZFUU5CX0JpcXVhZFR5cGVfZW4gKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZBbGxvY01lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1TaXplKTsKKworICAgIC8qCisgICAgICogSW50ZXJuYWxseSBtYXAsIHN0cnVjdHVyZSBhbmQgYWxsaWduIHNjcmF0Y2ggbWVtb3J5CisgICAgICovCisgICAgSW5zdEFsbG9jX0luaXQoJkFsbG9jTWVtLAorICAgICAgICAgICAgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWRVFOQl9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzKTsKKworICAgIHBJbnN0YW5jZS0+cEZhc3RUZW1wb3JhcnkgPSAoTFZNX0ZMT0FUICopSW5zdEFsbG9jX0FkZE1lbWJlcigmQWxsb2NNZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcEluc3RhbmNlLT5QYXJhbXMuTkJhbmRzICAgICAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICAgPSBMVkVRTkJfQllQQVNTOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLnBCYW5kRGVmaW5pdGlvbiA9IExWTV9OVUxMOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgICAgICA9IExWRVFOQl9GU184MDAwOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCAgICA9IExWRVFOQl9TVEVSRU87CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGZpbHRlcnMKKyAgICAgKi8KKyAgICBMVkVRTkJfU2V0RmlsdGVycyhwSW5zdGFuY2UsICAgICAgICAgICAgICAgICAgICAgICAgLyogU2V0IHRoZSBmaWx0ZXIgdHlwZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QYXJhbXMpOworCisgICAgTFZFUU5CX1NldENvZWZmaWNpZW50cyhwSW5zdGFuY2UpOyAgICAgICAgICAgICAgICAgIC8qIFNldCB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworCisgICAgTFZFUU5CX0NsZWFyRmlsdGVySGlzdG9yeShwSW5zdGFuY2UpOyAgICAgICAgICAgICAgIC8qIENsZWFyIHRoZSBmaWx0ZXIgaGlzdG9yeSAqLworCisgICAgLyoKKyAgICAgKiBJbml0aWFsaXNlIHRoZSBieXBhc3MgdmFyaWFibGVzCisgICAgICovCisgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldCAgICAgICAgPSAwOworICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLnBDYWxsYmFja0hhbmRsZSAgICA9ICh2b2lkKilwSW5zdGFuY2U7CisgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgICAgICAgICAgPSBMVkVRTkJfQnlwYXNzTWl4ZXJDYWxsQmFjazsKKworICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzBdLDAsMCk7CisgICAgTFZDX01peGVyX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVswXSwwLExWTV9GU184MDAwLDIpOworCisgICAgcEluc3RhbmNlLT5CeXBhc3NNaXhlci5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCAgICAgICAgPSAxOworICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0uQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPkJ5cGFzc01peGVyLk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSAgICA9IExWTV9OVUxMOworICAgIHBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0ucENhbGxCYWNrICAgICAgICAgID0gTFZNX05VTEw7CisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDAsIDEuMGYpOworICAgIExWQ19NaXhlcl9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIuTWl4ZXJTdHJlYW1bMV0sIDAsIExWTV9GU184MDAwLCAyKTsKKworICAgIHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gICAgICA9IExWTV9GQUxTRTsKKworICAgIHJldHVybihMVkVRTkJfU1VDQ0VTUyk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1ByaXZhdGUuaAppbmRleCA1NmIwMmUwLi40MGZhY2ZiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJpdmF0ZS5oCkBAIC0xOCwxMSArMTgsNiBAQAogI2lmbmRlZiBfX0xWRVFOQl9QUklWQVRFX0hfXwogI2RlZmluZSBfX0xWRVFOQl9QUklWQVRFX0hfXwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDYsNyArNDEsMTIgQEAKICNkZWZpbmUgTFZFUU5CX0lOU1RBTkNFX0FMSUdOICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgaW5zdGFuY2Ugc3RydWN0dXJlcyAqLwogI2RlZmluZSBMVkVRTkJfREFUQV9BTElHTiAgICAgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiAzMi1iaXQgYWxpZ25tZW50IGZvciBzdHJ1Y3R1cmVzICovCiAjZGVmaW5lIExWRVFOQl9DT0VGX0FMSUdOICAgICAgICAgICA0ICAgICAgICAgICAgICAgICAgIC8qIDMyLWJpdCBhbGlnbm1lbnQgZm9yIGxvbmcgd29yZHMgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCisjZGVmaW5lIExWRVFOQl9TQ1JBVENIQlVGRkVSUyAgICAgICAoTFZNX01BWF9DSEFOTkVMUyAqIDIpCisjZWxzZQogI2RlZmluZSBMVkVRTkJfU0NSQVRDSEJVRkZFUlMgICAgICAgNCAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYnVmZmVycyByZXF1aXJlZCBmb3IgaW5wbGFjZSBwcm9jZXNzaW5nICovCisjZW5kaWYKICNkZWZpbmUgTFZFUU5CX1NDUkFUQ0hfQUxJR04gICAgICAgIDQgICAgICAgICAgICAgICAgICAgLyogMzItYml0IGFsaWdubWVudCBmb3IgbG9uZyBkYXRhICovCiAKICNkZWZpbmUgTFZFUU5CX0JZUEFTU19NSVhFUl9UQyAgICAgIDEwMCAgICAgICAgICAgICAgICAgLyogQnlwYXNzIE1peGVyIFRDICovCkBAIC02MCwyNCArNjAsMTkgQEAKIC8qIEZpbHRlciBiaXF1YWQgdHlwZXMgKi8KIHR5cGVkZWYgZW51bQogewotI2lmZGVmIEJVSUxEX0ZMT0FUCiAgICAgTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdCA9IC0xLAotI2VuZGlmCiAgICAgTFZFUU5CX1NpbmdsZVByZWNpc2lvbiA9IDAsCiAgICAgTFZFUU5CX0RvdWJsZVByZWNpc2lvbiA9IDEsCiAgICAgTFZFUU5CX091dE9mUmFuZ2UgICAgICA9IDIsCiAgICAgTFZFUU5CX0JJUVVBRFRZUEVfTUFYICA9IExWTV9NQVhJTlRfMzIKIH0gTFZFUU5CX0JpcXVhZFR5cGVfZW47CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIAotCi0KIC8qIEluc3RhbmNlIHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKQEAgLTg3LDIwICs4MiwxMCBAQAogICAgIExWRVFOQl9DYXBhYmlsaXRpZXNfdCAgICAgICAgICAgQ2FwYWJpbGl0aWVzOyAgICAgICAvKiBJbnN0YW5jZSBjYXBhYmlsaXRpZXMgKi8KIAogICAgIC8qIEFsaWduZWQgbWVtb3J5IHBvaW50ZXJzICovCi0jaWZkZWYgQlVJTERfRkxPQVQKICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgKnBGYXN0VGVtcG9yYXJ5OyAgICAgICAgLyogRmFzdCB0ZW1wb3JhcnkgZGF0YSBiYXNlIGFkZHJlc3MgKi8KLSNlbHNlCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICpwRmFzdFRlbXBvcmFyeTsgICAgICAgIC8qIEZhc3QgdGVtcG9yYXJ5IGRhdGEgYmFzZSBhZGRyZXNzICovCi0jZW5kaWYKIAotI2lmZGVmIEJVSUxEX0ZMT0FUCiAgICAgQmlxdWFkXzJJX09yZGVyMl9GTE9BVF9UYXBzX3QgICAqcEVRTkJfVGFwc19GbG9hdDsgICAgICAgIC8qIEVxdWFsaXNlciBUYXBzICovCiAgICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAgICAgICAqcEVRTkJfRmlsdGVyU3RhdGVfRmxvYXQ7IC8qIFN0YXRlIGZvciBlYWNoIGZpbHRlciBiYW5kICovCi0jZWxzZQotICAgIC8qIFByb2Nlc3MgdmFyaWFibGVzICovCi0gICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgICAgICAgICAqcEVRTkJfVGFwczsgICAgICAgIC8qIEVxdWFsaXNlciBUYXBzICovCi0gICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAgICAgICAqcEVRTkJfRmlsdGVyU3RhdGU7IC8qIFN0YXRlIGZvciBlYWNoIGZpbHRlciBiYW5kICovCi0jZW5kaWYKIAogICAgIC8qIEZpbHRlciBkZWZpbml0aW9ucyBhbmQgY2FsbCBiYWNrICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgICAgICBOQmFuZHM7ICAgICAgICAgICAgIC8qIE51bWJlciBvZiBiYW5kcyAqLwpAQCAtMTA4LDE3ICs5MywxMiBAQAogICAgIExWRVFOQl9CaXF1YWRUeXBlX2VuICAgICAgICAgICAgKnBCaXF1YWRUeXBlOyAgICAgICAvKiBGaWx0ZXIgYmlxdWFkIHR5cGVzICovCiAKICAgICAvKiBCeXBhc3MgdmFyaWFibGUgKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAogICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgICAgQnlwYXNzTWl4ZXI7Ci0jZWxzZQotICAgIExWTWl4ZXIzXzJTdF9zdCAgICAgICAgICAgQnlwYXNzTWl4ZXI7ICAgICAgICAgICAgICAvKiBCeXBhc3MgbWl4ZXIgdXNlZCBpbiB0cmFuc2l0aW9ucyAqLwotI2VuZGlmCiAKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBiSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbjsgLyogT3BlcmF0aW5nIG1vZGUgdHJhbnNpdGlvbiBmbGFnICovCiAKIH0gTFZFUU5CX0luc3RhbmNlX3Q7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTMxLDI1ICsxMTEsMTEgQEAKIHZvaWQgICAgTFZFUU5CX1NldENvZWZmaWNpZW50cyhMVkVRTkJfSW5zdGFuY2VfdCAgICAqcEluc3RhbmNlKTsKIAogdm9pZCAgICBMVkVRTkJfQ2xlYXJGaWx0ZXJIaXN0b3J5KExWRVFOQl9JbnN0YW5jZV90ICpwSW5zdGFuY2UpOwotI2lmZGVmIEJVSUxEX0ZMT0FUCiBMVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMoTFZNX1VJTlQxNiAgICAgICAgRnMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JhbmREZWZfdCAgKnBGaWx0ZXJEZWZpbml0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0ZMT0FUX0NvZWZzX3QgICAgKnBDb2VmZmljaWVudHMpOwotI2Vsc2UKLUxWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1NpbmdsZVByZWNDb2VmcyhMVk1fVUlOVDE2ICAgICAgICBGcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfQmFuZERlZl90ICAqcEZpbHRlckRlZmluaXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfQzE2X0NvZWZzX3QgICAgKnBDb2VmZmljaWVudHMpOwotCi1MVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Eb3VibGVQcmVjQ29lZnMoTFZNX1VJTlQxNiAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0JhbmREZWZfdCAgKnBGaWx0ZXJEZWZpbml0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLX0MzMl9Db2Vmc190ICAgICpwQ29lZmZpY2llbnRzKTsKLSNlbmRpZgogCiBMVk1fSU5UMzIgTFZFUU5CX0J5cGFzc01peGVyQ2FsbEJhY2sgKHZvaWQqIGhJbnN0YW5jZSwgdm9pZCAqcEdlbmVyYWxQdXJwb3NlLCBMVk1fSU5UMTYgQ2FsbGJhY2tQYXJhbSk7CiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KICNlbmRpZiAvKiBfX0xWRVFOQl9QUklWQVRFX0hfXyAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMjgxODEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJMVkVRTkIuaCIKLSNpbmNsdWRlICJMVkVRTkJfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKLSNpbmNsdWRlICJCSVFVQUQuaCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERlZmluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFNISUZUICAgICAgIDEzCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHJvY2VzcyBmdW5jdGlvbiBmb3IgdGhlIE4tQmFuZCBFcXVhbGlzZXIgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwSW5EYXRhICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBPdXREYXRhICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZFUU5CX1NVQ0NFU1MgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkVRTkJfTlVMTEFERFJFU1MgICAgICBXaGVuIGhJbnN0YW5jZSwgcEluRGF0YSBvciBwT3V0RGF0YSBhcmUgTlVMTCAgICAgICAgICAgICAgICAqLwotLyogIExWRVFOQl9BTElHTk1FTlRFUlJPUiAgIFdoZW4gcEluRGF0YSBvciBwT3V0RGF0YSBhcmUgbm90IDMyLWJpdCBhbGlnbmVkICAgICAgICAgICAgICovCi0vKiAgTFZFUU5CX1RPT01BTllTQU1QTEVTICAgTnVtU2FtcGxlcyB3YXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gYmxvY2sgc2l6ZSAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi1MVkVRTkJfUmV0dXJuU3RhdHVzX2VuIExWRVFOQl9Qcm9jZXNzKExWRVFOQl9IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpCi17Ci0KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgIGk7Ci0gICAgQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgICAqcEJpcXVhZDsKLSAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTY3JhdGNoOwotCi0KLSAgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KLSAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgaWYgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBidWZmZXJzIGFyZSAzMi1iaXQgYWxpZ25lZCAqLwotICAgIGlmICgoKCh1aW50cHRyX3QpcEluRGF0YSAlIDQpICE9IDApIHx8ICgoKHVpbnRwdHJfdClwT3V0RGF0YSAlIDQpICE9IDApKQotICAgIHsKLSAgICAgICAgcmV0dXJuIExWRVFOQl9BTElHTk1FTlRFUlJPUjsKLSAgICB9Ci0KLSAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopcEluc3RhbmNlLT5wRmFzdFRlbXBvcmFyeTsKLQotICAgIC8qCi0gICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQotICAgICovCi0gICAgaWYgKE51bVNhbXBsZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCi0gICAgewotICAgICAgICByZXR1cm4oTFZFUU5CX1RPT01BTllTQU1QTEVTKTsKLSAgICB9Ci0KLSAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkVRTkJfT04pCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBDb3B5IGlucHV0IGRhdGEgaW4gdG8gc2NyYXRjaCBidWZmZXIKLSAgICAgICAgICovCi0KLSAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7IC8qIExlZnQgYW5kIFJpZ2h0ICovCi0gICAgICAgIC8qCi0gICAgICAgICAqIEZvciBlYWNoIHNlY3Rpb24gZXhlY3RlIHRoZSBmaWx0ZXIgdW5sZXNzIHRoZSBnYWluIGlzIDBkQgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+TkJhbmRzICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBwSW5zdGFuY2UtPk5CYW5kczsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgYmFuZCBpcyBub24temVybyBkQiBnYWluCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5HYWluICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGJpcXVhZCBpbnN0YW5jZQotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcEJpcXVhZCA9ICZwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlX0Zsb2F0W2ldOwotCi0KLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogU2VsZWN0IHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uIGFzIHJlcXVpcmVkCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShwQmlxdWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGlmKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPT0gTFZNX1RSVUUpewotICAgICAgICAgICAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7Ci0gICAgICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQqKXBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgYW5kIFJpZ2h0IHNhbXBsZXMgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlewotICAgICAgICAgICAgQ29weV9GbG9hdChwU2NyYXRjaCwgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKSgyICogTnVtU2FtcGxlcykpOyAvKiBMZWZ0IGFuZCBSaWdodCAqLwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIE1vZGUgaXMgT0ZGIHNvIGNvcHkgdGhlIGRhdGEgaWYgbmVjZXNzYXJ5Ci0gICAgICAgICAqLwotICAgICAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkKLSAgICAgICAgewotICAgICAgICAgICAgQ29weV9GbG9hdChwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCBSaWdodCBzYW1wbGVzICovCi0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKLQotfQotI2Vsc2UKLUxWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1Byb2Nlc3MoTFZFUU5CX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcykKLXsKLQotICAgIExWTV9VSU5UMTYgICAgICAgICAgaTsKLSAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICpwQmlxdWFkOwotICAgIExWRVFOQl9JbnN0YW5jZV90ICAgKnBJbnN0YW5jZSA9IChMVkVRTkJfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICAqcFNjcmF0Y2g7Ci0KLQotICAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLwotICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwSW5EYXRhID09IExWTV9OVUxMKSB8fCAocE91dERhdGEgPT0gTFZNX05VTEwpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIExWRVFOQl9OVUxMQUREUkVTUzsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayBpZiB0aGUgaW5wdXQgYW5kIG91dHB1dCBkYXRhIGJ1ZmZlcnMgYXJlIDMyLWJpdCBhbGlnbmVkICovCi0gICAgaWYgKCgoKHVpbnRwdHJfdClwSW5EYXRhICUgNCkgIT0gMCkgfHwgKCgodWludHB0cl90KXBPdXREYXRhICUgNCkgIT0gMCkpCi0gICAgewotICAgICAgICByZXR1cm4gTFZFUU5CX0FMSUdOTUVOVEVSUk9SOwotICAgIH0KLQotICAgIHBTY3JhdGNoICA9IChMVk1fSU5UMzIgKilwSW5zdGFuY2UtPnBGYXN0VGVtcG9yYXJ5OwotCi0gICAgLyoKLSAgICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCi0gICAgKi8KLSAgICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVkVRTkJfVE9PTUFOWVNBTVBMRVMpOwotICAgIH0KLQotICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWRVFOQl9PTikKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENvbnZlcnQgZnJvbSAxNi1iaXQgdG8gMzItYml0Ci0gICAgICAgICAqLwotICAgICAgICBJbnQxNkxTaGlmdFRvSW50MzJfMTZ4MzIoKExWTV9JTlQxNiAqKXBJbkRhdGEsICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSwgLyogTGVmdCBhbmQgUmlnaHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNISUZUKTsgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxpbmcgc2hpZnQgKi8KLQotICAgICAgICAvKgotICAgICAgICAgKiBGb3IgZWFjaCBzZWN0aW9uIGV4ZWN0ZSB0aGUgZmlsdGVyIHVubGVzcyB0aGUgZ2FpbiBpcyAwZEIKLSAgICAgICAgICovCi0gICAgICAgIGlmIChwSW5zdGFuY2UtPk5CYW5kcyAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGk9MDsgaTxwSW5zdGFuY2UtPk5CYW5kczsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogQ2hlY2sgaWYgYmFuZCBpcyBub24temVybyBkQiBnYWluCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgaWYgKHBJbnN0YW5jZS0+cEJhbmREZWZpbml0aW9uc1tpXS5HYWluICE9IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGJpcXVhZCBpbnN0YW5jZQotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgcEJpcXVhZCA9ICZwSW5zdGFuY2UtPnBFUU5CX0ZpbHRlclN0YXRlW2ldOwotCi0KLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogU2VsZWN0IHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uIGFzIHJlcXVpcmVkCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0pCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFZFUU5CX1NpbmdsZVByZWNpc2lvbjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQS18ySV9EMzJGMzJDMTRHMTFfVFJDX1dSQV8wMShwQmlxdWFkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBMVkVRTkJfRG91YmxlUHJlY2lzaW9uOgotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLXzJJX0QzMkYzMkMzMEcxMV9UUkNfV1JBXzAxKHBCaXF1YWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMiAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSl7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBDb252ZXJ0IGZyb20gMzItYml0IHRvIDE2LSBiaXQgYW5kIHNhdHVyYXRlCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgSW50MzJSU2hpZnRUb0ludDE2X1NhdF8zMngxNihwU2NyYXRjaCwgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcFNjcmF0Y2gsICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcyksICAgICAvKiBMZWZ0IGFuZCBSaWdodCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hJRlQpOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxpbmcgc2hpZnQgKi8KLQotICAgICAgICAgICAgICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwSW5zdGFuY2UtPkJ5cGFzc01peGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpKTsKLQotICAgICAgICAgICAgICAgIENvcHlfMTYoKExWTV9JTlQxNiopcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgUmlnaHQgc2FtcGxlcyAqLwotICAgICAgICB9Ci0gICAgICAgIGVsc2V7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBDb252ZXJ0IGZyb20gMzItYml0IHRvIDE2LSBiaXQgYW5kIHNhdHVyYXRlCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIEludDMyUlNoaWZ0VG9JbnQxNl9TYXRfMzJ4MTYocFNjcmF0Y2gsICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICkoMipOdW1TYW1wbGVzKSwgLyogTGVmdCBhbmQgUmlnaHQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0hJRlQpOyAgICAgICAgICAgICAgICAvKiBTY2FsaW5nIHNoaWZ0ICovCi0gICAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogTW9kZSBpcyBPRkYgc28gY29weSB0aGUgZGF0YSBpZiBuZWNlc3NhcnkKLSAgICAgICAgICovCi0gICAgICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb3B5XzE2KHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCBSaWdodCBzYW1wbGVzICovCi0gICAgICAgIH0KLSAgICB9Ci0KLQotCi0gICAgcmV0dXJuKExWRVFOQl9TVUNDRVNTKTsKLQotfQotI2VuZGlmClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9Qcm9jZXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWVmZjUzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfUHJvY2Vzcy5jcHAKQEAgLTAsMCArMSwxOTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkVRTkIuaCIKKyNpbmNsdWRlICJMVkVRTkJfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJCSVFVQUQuaCIKKworI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBTSElGVCAgICAgICAxMworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWRVFOQl9Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFByb2Nlc3MgZnVuY3Rpb24gZm9yIHRoZSBOLUJhbmQgRXF1YWxpc2VyIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluRGF0YSAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwT3V0RGF0YSAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWRVFOQl9TVUNDRVNTICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZFUU5CX05VTExBRERSRVNTICAgICAgV2hlbiBoSW5zdGFuY2UsIHBJbkRhdGEgb3IgcE91dERhdGEgYXJlIE5VTEwgICAgICAgICAgICAgICAgKi8KKy8qICBMVkVRTkJfQUxJR05NRU5URVJST1IgICBXaGVuIHBJbkRhdGEgb3IgcE91dERhdGEgYXJlIG5vdCAzMi1iaXQgYWxpZ25lZCAgICAgICAgICAgICAqLworLyogIExWRVFOQl9UT09NQU5ZU0FNUExFUyAgIE51bVNhbXBsZXMgd2FzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIGJsb2NrIHNpemUgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWRVFOQl9SZXR1cm5TdGF0dXNfZW4gTFZFUU5CX1Byb2Nlc3MoTFZFUU5CX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fVUlOVDE2ICAgICAgTnJGcmFtZXMpCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZWQgdG8gdXNlIHNhbXBsZXMgPSBmcmFtZXMgKiBjaGFubmVscy4KKyAgICBMVkVRTkJfSW5zdGFuY2VfdCAgICpwSW5zdGFuY2UgPSAoTFZFUU5CX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisjaWZkZWYgU1VQUE9SVF9NQworICAgIC8vIE1vbm8gcGFzc2VkIGluIGFzIHN0ZXJlbworICAgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVscyA9PSAxCisgICAgICAgID8gMiA6IHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHM7CisjZWxzZQorICAgIGNvbnN0IExWTV9JTlQzMiBOckNoYW5uZWxzID0gMjsgLy8gRkNDXzIKKyNlbmRpZgorICAgIGNvbnN0IExWTV9JTlQzMiBOclNhbXBsZXMgPSBOckNoYW5uZWxzICogTnJGcmFtZXM7CisKKyAgICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KKyAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiBMVkVRTkJfTlVMTEFERFJFU1M7CisgICAgfQorCisgICAgLyogQ2hlY2sgaWYgdGhlIGlucHV0IGFuZCBvdXRwdXQgZGF0YSBidWZmZXJzIGFyZSAzMi1iaXQgYWxpZ25lZCAqLworICAgIGlmICgoKCh1aW50cHRyX3QpcEluRGF0YSAlIDQpICE9IDApIHx8ICgoKHVpbnRwdHJfdClwT3V0RGF0YSAlIDQpICE9IDApKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWRVFOQl9BTElHTk1FTlRFUlJPUjsKKyAgICB9CisKKyAgICBMVk1fRkxPQVQgKiBjb25zdCBwU2NyYXRjaCA9IChMVk1fRkxPQVQgKilwSW5zdGFuY2UtPnBGYXN0VGVtcG9yYXJ5OworCisgICAgLyoKKyAgICAqIENoZWNrIHRoZSBudW1iZXIgb2YgZnJhbWVzIGlzIG5vdCB0b28gbGFyZ2UKKyAgICAqLworICAgIGlmIChOckZyYW1lcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKKyAgICB7CisgICAgICAgIHJldHVybiBMVkVRTkJfVE9PTUFOWVNBTVBMRVM7CisgICAgfQorCisgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZFUU5CX09OKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ29weSBpbnB1dCBkYXRhIGluIHRvIHNjcmF0Y2ggYnVmZmVyCisgICAgICAgICAqLworICAgICAgICBDb3B5X0Zsb2F0KHBJbkRhdGEsICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRm9yIGVhY2ggc2VjdGlvbiBleGVjdGUgdGhlIGZpbHRlciB1bmxlc3MgdGhlIGdhaW4gaXMgMGRCCisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlLT5OQmFuZHMgIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChMVk1fVUlOVDE2IGkgPSAwOyBpIDwgcEluc3RhbmNlLT5OQmFuZHM7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIENoZWNrIGlmIGJhbmQgaXMgbm9uLXplcm8gZEIgZ2FpbgorICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIGlmIChwSW5zdGFuY2UtPnBCYW5kRGVmaW5pdGlvbnNbaV0uR2FpbiAhPSAwKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBiaXF1YWQgaW5zdGFuY2UKKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICpwQmlxdWFkID0gJnBJbnN0YW5jZS0+cEVRTkJfRmlsdGVyU3RhdGVfRmxvYXRbaV07CisKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogU2VsZWN0IHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uIGFzIHJlcXVpcmVkCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHBJbnN0YW5jZS0+cEJpcXVhZFR5cGVbaV0pCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTFZFUU5CX1NpbmdsZVByZWNpc2lvbl9GbG9hdDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEtfTWNfRDMyRjMyQzE0RzExX1RSQ19XUkFfMDEocEJpcXVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBLXzJJX0QzMkYzMkMxNEcxMV9UUkNfV1JBXzAxKHBCaXF1YWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcyk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID09IExWTV9UUlVFKXsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICBMVkNfTWl4U29mdF8yTWNfRDE2QzMxX1NBVCgmcEluc3RhbmNlLT5CeXBhc3NNaXhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJDaGFubmVscyk7CisjZWxzZQorICAgICAgICAgICAgTFZDX01peFNvZnRfMlN0X0QxNkMzMV9TQVQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsKKyNlbmRpZgorICAgICAgICAgICAgLy8gZHVwbGljYXRlIHdpdGggZWxzZSBjbGF1c2UocykKKyAgICAgICAgICAgIENvcHlfRmxvYXQocFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOclNhbXBsZXMpOyAgICAgICAgICAgIC8qIEFsbCBjaGFubmVsIHNhbXBsZXMgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNleworICAgICAgICAgICAgQ29weV9GbG9hdChwU2NyYXRjaCwgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnJTYW1wbGVzKTsgLyogQWxsIGNoYW5uZWwgc2FtcGxlcyAqLworICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIE1vZGUgaXMgT0ZGIHNvIGNvcHkgdGhlIGRhdGEgaWYgbmVjZXNzYXJ5CisgICAgICAgICAqLworICAgICAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkKKyAgICAgICAgeworICAgICAgICAgICAgQ29weV9GbG9hdChwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU5yU2FtcGxlcyk7ICAgICAgICAgICAgLyogQWxsIGNoYW5uZWwgc2FtcGxlcyAqLworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBMVkVRTkJfU1VDQ0VTUzsKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYzMTgxYy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuYworKysgL2Rldi9udWxsCkBAIC0xLDI3OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTFZFUU5CLmgiCi0jaW5jbHVkZSAiTFZFUU5CX0NvZWZmcy5oIgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgU2FtcGxlIHJhdGUgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogU2FtcGxlIHJhdGUgdGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgYWN0dWFsCi0gKiBmcmVxdWVuY3kKLSAqLwotI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotY29uc3QgTFZNX1VJTlQzMiAgICBMVkVRTkJfU2FtcGxlUmF0ZVRhYltdID0gezgwMDAsICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjA1MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTIwMDAKLX07Ci0jZWxzZQotY29uc3QgTFZNX1VJTlQxNiAgICBMVkVRTkJfU2FtcGxlUmF0ZVRhYltdID0gezgwMDAsICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjA1MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMAotfTsKLSNlbmRpZgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgIENvZWZmaWNpZW50IGNhbGN1bGF0aW9uIHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFRhYmxlIGZvciAyICogUGkgLyBGcwotICovCi0jaWZkZWYgQlVJTERfRkxPQVQKLWNvbnN0IExWTV9GTE9BVCAgICAgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW10gPSB7TFZFUU5CXzJQaU9uXzgwMDAsICAgICAgLyogOGtTL3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzExMDI1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMTIwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8xNjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzIyMDUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMjQwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8zMjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ0MTAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fNDgwMDAKLSNpZmRlZiBISUdIRVJfRlMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZFUU5CXzJQaU9uXzk2MDAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWRVFOQl8yUGlPbl8xOTIwMDAKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotI2Vsc2UKLWNvbnN0IExWTV9JTlQxNiAgICAgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW10gPSB7TFZFUU5CXzJQaU9uXzgwMDAsICAgICAgLyogOGtTL3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzExMDI1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMTIwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8xNjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzIyMDUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMjQwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8zMjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ0MTAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fNDgwMDB9OyAgICAvKiA0OGtTL3MgKi8KLSNlbmRpZgotCi0vKgotICogR2FpbiB0YWJsZQotICovCi0jaWZkZWYgQlVJTERfRkxPQVQKLWNvbnN0IExWTV9GTE9BVCAgICAgTFZFUU5CX0dhaW5UYWJsZVtdID0ge0xWRVFOQl9HYWluX05lZzE1X2RCLCAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTRfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxM19kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzEyX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTFfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxMF9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzlfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc4X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnN19kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzZfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc1X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnNF9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzNfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcyX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMV9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzBfZEIsICAgICAgICAgICAgLyogMGRCIGdhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzFfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8yX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fM19kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzRfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl81X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fNl9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzdfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl84X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fOV9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzEwX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTFfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xMl9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzEzX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTRfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xNV9kQn07ICAgICAgICAgIC8qICsxNWRCIGdhaW4gKi8KLSNlbHNlCi1jb25zdCBMVk1fSU5UMTYgICAgIExWRVFOQl9HYWluVGFibGVbXSA9IHtMVkVRTkJfR2Fpbl9OZWcxNV9kQiwgICAgICAgIC8qIC0xNWRCIGdhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzE0X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTNfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxMl9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzExX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTBfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc5X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnOF9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzdfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc2X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnNV9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzRfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWczX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMl9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzFfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8wX2RCLCAgICAgICAgICAgIC8qIDBkQiBnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMl9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzNfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl80X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fNV9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzZfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl83X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fOF9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzlfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xMF9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzExX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTJfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xM19kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzE0X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTVfZEJ9OyAgICAgICAgICAvKiArMTVkQiBnYWluICovCi0KLSNlbmRpZgotLyoKLSAqIEQgdGFibGUgZm9yIDEwMCAvIChHYWluICsgMSkKLSAqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi1jb25zdCBMVk1fRkxPQVQgICAgTFZFUU5CX0RUYWJsZVtdID0ge0xWRVFOQl8xMDBEX05lZzE1X2RCLCAgICAgICAgICAgIC8qIC0xNWRCIGdhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTRfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEzX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxMl9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTFfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEwX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc5X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc4X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc3X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc2X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc1X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWc0X2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWczX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcyX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF8wX2RCfTsgICAgICAgICAgICAgICAvKiAwZEIgZ2FpbiAqLwotI2Vsc2UKLWNvbnN0IExWTV9JTlQxNiAgICBMVkVRTkJfRFRhYmxlW10gPSB7TFZFUU5CXzEwMERfTmVnMTVfZEIsICAgICAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxNF9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTNfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEyX2RCLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxMV9kQiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTBfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzlfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzhfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzdfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzZfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzVfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzRfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzNfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzJfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzFfZEIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEXzBfZEJ9OyAgICAgICAgICAgICAgIC8qIDBkQiBnYWluICovCi0KLSNlbmRpZgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICBGaWx0ZXIgcG9seW5vbWlhbCBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qCi0gKiBDb2VmZmljaWVudHMgZm9yIGNhbGN1bGF0aW5nIHRoZSBjb3NpbmUgd2l0aCB0aGUgZXF1YXRpb246Ci0gKgotICogIENvcyh4KSA9ICgyXlNoaWZ0cykqKGEwICsgYTEqeCArIGEyKnheMiArIGEzKnheMyArIGE0KnheNCArIGE1KnheNSkKLSAqCi0gKiBUaGVzZSBjb2VmZmljaWVudHMgZXhwZWN0IHRoZSBpbnB1dCwgeCwgdG8gYmUgaW4gdGhlIHJhbmdlIDAgdG8gMzI3NjggcmVzcHJlc2VudGluZwotICogYSByYW5nZSBvZiAwIHRvIFBpLiBUaGUgb3V0cHV0IGlzIGluIHRoZSByYW5nZSAzMjc2NyB0byAtMzI3NjggcmVwcmVzZW50aW5nIHRoZSByYW5nZQotICogKzEuMCB0byAtMS4wCi0gKi8KLWNvbnN0IExWTV9JTlQxNiAgICAgTFZFUU5CX0Nvc0NvZWZbXSA9IHszLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hpZnRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDA5NiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTM2LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGExICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE5NzI1LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTI2NzEsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjM3MzAsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGE0ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTk0OTB9OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGE1ICovCi0KLS8qCi0gKiBDb2VmZmljaWVudHMgZm9yIGNhbGN1bGF0aW5nIHRoZSBjb3NpbmUgZXJyb3Igd2l0aCB0aGUgZXF1YXRpb246Ci0gKgotICogIENvc0Vycih4KSA9ICgyXlNoaWZ0cykqKGEwICsgYTEqeCArIGEyKnheMiArIGEzKnheMykKLSAqCi0gKiBUaGVzZSBjb2VmZmljaWVudHMgZXhwZWN0IHRoZSBpbnB1dCwgeCwgdG8gYmUgaW4gdGhlIHJhbmdlIDAgdG8gMzI3NjggcmVzcHJlc2VudGluZwotICogYSByYW5nZSBvZiAwIHRvIFBpLzI1LiBUaGUgb3V0cHV0IGlzIGluIHRoZSByYW5nZSAwIHRvIDMyNzY3IHJlcHJlc2VudGluZyB0aGUgcmFuZ2UKLSAqIDAuMCB0byAwLjAwNzg4NTI5ODYKLSAqCi0gKiBUaGlzIGlzIHVzZWQgdG8gZ2l2ZSBhIGRvdWJsZSBwcmVjaXNpb24gY29zaW5lIG92ZXIgdGhlIHJhbmdlIDAgdG8gUGkvMjUgdXNpbmcgdGhlCi0gKiB0aGUgZXF1YXRpb246Ci0gKgotICogQ29zKHgpID0gMS4wIC0gQ29zRXJyKHgpCi0gKi8KLWNvbnN0IExWTV9JTlQxNiAgICAgTFZFUU5CX0RQQ29zQ29lZltdID0gezEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hpZnRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEwICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGExICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjU4NiwgICAgICAgICAgICAgICAgICAgICAgIC8qIGEyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtNDR9OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEzICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5cGFzcyBtaXhlciB0aW1lIGNvbnN0YW50cyAoMTAwbXMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnM4MDAwICAgIDMyNTgwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTQyNjI2OTUgKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczExMDI1ICAgMzI2MzIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NTg0OTYwOSAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMTIwMDAgICAzMjY0MyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk2MTg1MzAzICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnMxNjAwMCAgIDMyNjc0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTcxMzEzNDggKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczIyMDUwICAgMzI3MDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzkyNDgwNSAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzMjQwMDAgICAzMjcwNSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk4MDc3MzkzICovCi0jZGVmaW5lIExWRVFOQl9NSVhfVENfRnMzMjAwMCAgIDMyNzIxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45OTg1NjU2NzQgKi8KLSNkZWZpbmUgTFZFUU5CX01JWF9UQ19GczQ0MTAwICAgMzI3MzQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODk2MjQwMiAqLwotI2RlZmluZSBMVkVRTkJfTUlYX1RDX0ZzNDgwMDAgICAzMjczNyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTk5MDUzOTU1ICovCi0KLQotY29uc3QgTFZNX0lOVDE2IExWRVFOQl9NaXhlclRDVGFibGVbXSA9IHsKLSAgICBMVkVRTkJfTUlYX1RDX0ZzODAwMCwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzMTEwMjUsCi0gICAgTFZFUU5CX01JWF9UQ19GczEyMDAwLAotICAgIExWRVFOQl9NSVhfVENfRnMxNjAwMCwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzMjIwNTAsCi0gICAgTFZFUU5CX01JWF9UQ19GczI0MDAwLAotICAgIExWRVFOQl9NSVhfVENfRnMzMjAwMCwKLSAgICBMVkVRTkJfTUlYX1RDX0ZzNDQxMDAsCi0gICAgTFZFUU5CX01JWF9UQ19GczQ4MDAwfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMvTFZFUU5CX1RhYmxlcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MjgxMTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuY3BwCkBAIC0wLDAgKzEsMTcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWRVFOQi5oIgorI2luY2x1ZGUgIkxWRVFOQl9Db2VmZnMuaCIKKyNpbmNsdWRlICJMVkVRTkJfVGFibGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgU2FtcGxlIHJhdGUgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogU2FtcGxlIHJhdGUgdGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgYWN0dWFsCisgKiBmcmVxdWVuY3kKKyAqLworY29uc3QgTFZNX1VJTlQzMiAgICBMVkVRTkJfU2FtcGxlUmF0ZVRhYltdID0gezgwMDAsICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4ODIwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzY0MDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyMDAwCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIENvZWZmaWNpZW50IGNhbGN1bGF0aW9uIHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRhYmxlIGZvciAyICogUGkgLyBGcworICovCitjb25zdCBMVk1fRkxPQVQgICAgIExWRVFOQl9Ud29QaU9uRnNUYWJsZVtdID0ge0xWRVFOQl8yUGlPbl84MDAwLCAgICAgIC8qIDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8xMTAyNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzEyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl8yMjA1MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMlBpT25fMzIwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8yUGlPbl80NDEwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzJQaU9uXzQ4MDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLExWRVFOQl8yUGlPbl84ODIwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVkVRTkJfMlBpT25fOTYwMDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsTFZFUU5CXzJQaU9uXzE3NjQwMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICxMVkVRTkJfMlBpT25fMTkyMDAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKy8qCisgKiBHYWluIHRhYmxlCisgKi8KK2NvbnN0IExWTV9GTE9BVCAgICAgTFZFUU5CX0dhaW5UYWJsZVtdID0ge0xWRVFOQl9HYWluX05lZzE1X2RCLCAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxM19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzEyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMTFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcxMF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzlfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc4X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnN19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzZfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWc1X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnNF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluX05lZzNfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl9OZWcyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fTmVnMV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzBfZEIsICAgICAgICAgICAgLyogMGRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8yX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fM19kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl81X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fNl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzdfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl84X2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fOV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzEwX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xMl9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl9HYWluXzEzX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CX0dhaW5fMTRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfR2Fpbl8xNV9kQn07ICAgICAgICAgIC8qICsxNWRCIGdhaW4gKi8KKy8qCisgKiBEIHRhYmxlIGZvciAxMDAgLyAoR2FpbiArIDEpCisgKi8KK2NvbnN0IExWTV9GTE9BVCAgICBMVkVRTkJfRFRhYmxlW10gPSB7TFZFUU5CXzEwMERfTmVnMTVfZEIsICAgICAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxNF9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTNfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzEyX2RCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkVRTkJfMTAwRF9OZWcxMV9kQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZFUU5CXzEwMERfTmVnMTBfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzlfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzhfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzdfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzZfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzVfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzRfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzNfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzJfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEX05lZzFfZEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWRVFOQl8xMDBEXzBfZEJ9OyAgICAgICAgICAgICAgIC8qIDBkQiBnYWluICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZpbHRlciBwb2x5bm9taWFsIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvZWZmaWNpZW50cyBmb3IgY2FsY3VsYXRpbmcgdGhlIGNvc2luZSB3aXRoIHRoZSBlcXVhdGlvbjoKKyAqCisgKiAgQ29zKHgpID0gKDJeU2hpZnRzKSooYTAgKyBhMSp4ICsgYTIqeF4yICsgYTMqeF4zICsgYTQqeF40ICsgYTUqeF41KQorICoKKyAqIFRoZXNlIGNvZWZmaWNpZW50cyBleHBlY3QgdGhlIGlucHV0LCB4LCB0byBiZSBpbiB0aGUgcmFuZ2UgMCB0byAzMjc2OCByZXNwcmVzZW50aW5nCisgKiBhIHJhbmdlIG9mIDAgdG8gUGkuIFRoZSBvdXRwdXQgaXMgaW4gdGhlIHJhbmdlIDMyNzY3IHRvIC0zMjc2OCByZXByZXNlbnRpbmcgdGhlIHJhbmdlCisgKiArMS4wIHRvIC0xLjAKKyAqLworY29uc3QgTFZNX0lOVDE2ICAgICBMVkVRTkJfQ29zQ29lZltdID0gezMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDk2LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMzYsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTk3MjUsICAgICAgICAgICAgICAgICAgICAgICAgLyogYTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjY3MSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzczMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTQ5MH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTUgKi8KKworLyoKKyAqIENvZWZmaWNpZW50cyBmb3IgY2FsY3VsYXRpbmcgdGhlIGNvc2luZSBlcnJvciB3aXRoIHRoZSBlcXVhdGlvbjoKKyAqCisgKiAgQ29zRXJyKHgpID0gKDJeU2hpZnRzKSooYTAgKyBhMSp4ICsgYTIqeF4yICsgYTMqeF4zKQorICoKKyAqIFRoZXNlIGNvZWZmaWNpZW50cyBleHBlY3QgdGhlIGlucHV0LCB4LCB0byBiZSBpbiB0aGUgcmFuZ2UgMCB0byAzMjc2OCByZXNwcmVzZW50aW5nCisgKiBhIHJhbmdlIG9mIDAgdG8gUGkvMjUuIFRoZSBvdXRwdXQgaXMgaW4gdGhlIHJhbmdlIDAgdG8gMzI3NjcgcmVwcmVzZW50aW5nIHRoZSByYW5nZQorICogMC4wIHRvIDAuMDA3ODg1Mjk4NgorICoKKyAqIFRoaXMgaXMgdXNlZCB0byBnaXZlIGEgZG91YmxlIHByZWNpc2lvbiBjb3NpbmUgb3ZlciB0aGUgcmFuZ2UgMCB0byBQaS8yNSB1c2luZyB0aGUKKyAqIHRoZSBlcXVhdGlvbjoKKyAqCisgKiBDb3MoeCkgPSAxLjAgLSBDb3NFcnIoeCkKKyAqLworY29uc3QgTFZNX0lOVDE2ICAgICBMVkVRTkJfRFBDb3NDb2VmW10gPSB7MSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC02LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2NTg2LCAgICAgICAgICAgICAgICAgICAgICAgLyogYTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvRXEvc3JjL0xWRVFOQl9UYWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzFlZWI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL3NyYy9MVkVRTkJfVGFibGVzLmgKQEAgLTAsMCArMSw4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19MVkVRTkJfVEFCTEVTX0hfXworI2RlZmluZSBfX0xWRVFOQl9UQUJMRVNfSF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgU2FtcGxlIHJhdGUgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogU2FtcGxlIHJhdGUgdGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgYWN0dWFsCisgKiBmcmVxdWVuY3kKKyAqLworZXh0ZXJuIGNvbnN0IExWTV9VSU5UMzIgICAgTFZFUU5CX1NhbXBsZVJhdGVUYWJbXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICBDb2VmZmljaWVudCBjYWxjdWxhdGlvbiB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUYWJsZSBmb3IgMiAqIFBpIC8gRnMKKyAqLworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCAgICAgTFZFUU5CX1R3b1BpT25Gc1RhYmxlW107CisKKy8qCisgKiBHYWluIHRhYmxlCisgKi8KK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgICAgIExWRVFOQl9HYWluVGFibGVbXTsKKworLyoKKyAqIEQgdGFibGUgZm9yIDEwMCAvIChHYWluICsgMSkKKyAqLworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCAgICAgTFZFUU5CX0RUYWJsZVtdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgIEZpbHRlciBwb2x5bm9taWFsIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvZWZmaWNpZW50cyBmb3IgY2FsY3VsYXRpbmcgdGhlIGNvc2luZSB3aXRoIHRoZSBlcXVhdGlvbjoKKyAqCisgKiAgQ29zKHgpID0gKDJeU2hpZnRzKSooYTAgKyBhMSp4ICsgYTIqeF4yICsgYTMqeF4zICsgYTQqeF40ICsgYTUqeF41KQorICoKKyAqIFRoZXNlIGNvZWZmaWNpZW50cyBleHBlY3QgdGhlIGlucHV0LCB4LCB0byBiZSBpbiB0aGUgcmFuZ2UgMCB0byAzMjc2OCByZXNwcmVzZW50aW5nCisgKiBhIHJhbmdlIG9mIDAgdG8gUGkuIFRoZSBvdXRwdXQgaXMgaW4gdGhlIHJhbmdlIDMyNzY3IHRvIC0zMjc2OCByZXByZXNlbnRpbmcgdGhlIHJhbmdlCisgKiArMS4wIHRvIC0xLjAKKyAqLworZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiAgICAgTFZFUU5CX0Nvc0NvZWZbXTsKKworLyoKKyAqIENvZWZmaWNpZW50cyBmb3IgY2FsY3VsYXRpbmcgdGhlIGNvc2luZSBlcnJvciB3aXRoIHRoZSBlcXVhdGlvbjoKKyAqCisgKiAgQ29zRXJyKHgpID0gKDJeU2hpZnRzKSooYTAgKyBhMSp4ICsgYTIqeF4yICsgYTMqeF4zKQorICoKKyAqIFRoZXNlIGNvZWZmaWNpZW50cyBleHBlY3QgdGhlIGlucHV0LCB4LCB0byBiZSBpbiB0aGUgcmFuZ2UgMCB0byAzMjc2OCByZXNwcmVzZW50aW5nCisgKiBhIHJhbmdlIG9mIDAgdG8gUGkvMjUuIFRoZSBvdXRwdXQgaXMgaW4gdGhlIHJhbmdlIDAgdG8gMzI3NjcgcmVwcmVzZW50aW5nIHRoZSByYW5nZQorICogMC4wIHRvIDAuMDA3ODg1Mjk4NgorICoKKyAqIFRoaXMgaXMgdXNlZCB0byBnaXZlIGEgZG91YmxlIHByZWNpc2lvbiBjb3NpbmUgb3ZlciB0aGUgcmFuZ2UgMCB0byBQaS8yNSB1c2luZyB0aGUKKyAqIHRoZSBlcXVhdGlvbjoKKyAqCisgKiBDb3MoeCkgPSAxLjAgLSBDb3NFcnIoeCkKKyAqLworZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiAgICAgTFZFUU5CX0RQQ29zQ29lZltdOworCisjZW5kaWYgLyogX19MVkVRTkJfVEFCTEVTX0hfXyAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9saWIvTFZSRVYuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvbGliL0xWUkVWLmgKaW5kZXggOWMyZTI5Ny4uOGM5MWVhOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9saWIvTFZSRVYuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL2xpYi9MVlJFVi5oCkBAIC0yOCwxMSArMjgsNiBAQAogI2lmbmRlZiBfX0xWUkVWX0hfXwogI2RlZmluZSBfX0xWUkVWX0hfXwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDAsNyArMzUsNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEZWZpbml0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNTMsNyArNDcsNiBAQAogLyogTWVtb3J5IHRhYmxlKi8KICNkZWZpbmUgTFZSRVZfTlJfTUVNT1JZX1JFR0lPTlMgICAgICAgICAgICAgICAgIDQgICAgICAgLyogTnVtYmVyIG9mIG1lbW9yeSByZWdpb25zICovCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBUeXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNjIsNyArNTUsNiBAQAogLyogSW5zdGFuY2UgaGFuZGxlICovCiB0eXBlZGVmIHZvaWQgKkxWUkVWX0hhbmRsZV90OwogCi0KIC8qIFN0YXR1cyByZXR1cm4gdmFsdWVzICovCiB0eXBlZGVmIGVudW0KIHsKQEAgLTczLDcgKzY1LDYgQEAKICAgICBMVlJFVl9SRVRVUk5TVEFUVVNfRFVNTVkgPSBMVk1fTUFYRU5VTQogfSBMVlJFVl9SZXR1cm5TdGF0dXNfZW47CiAKLQogLyogUmV2ZXJiIGRlbGF5IGxpbmVzICovCiB0eXBlZGVmIGVudW0KIHsKQEAgLTgzLDcgKzc0LDYgQEAKICAgICBMVlJFVl9ERUxBWUxJTkVTX0RVTU1ZID0gTFZNX01BWEVOVU0KIH0gTFZSRVZfTnVtRGVsYXlMaW5lc19lbjsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC05Niw3ICs4Niw2IEBACiAgICAgTFZNX01lbW9yeVJlZ2lvbl9zdCAgICAgICAgUmVnaW9uW0xWUkVWX05SX01FTU9SWV9SRUdJT05TXTsgIC8qIE9uZSBkZWZpbml0aW9uIGZvciBlYWNoIHJlZ2lvbiAqLwogfSBMVlJFVl9NZW1vcnlUYWJsZV9zdDsKIAotCiAvKiBDb250cm9sIFBhcmFtZXRlciBzdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7CkBAIC0xMDcsMTMgKzk2LDggQEAKIAogICAgIC8qIFBhcmFtZXRlcnMgZm9yIFJFViAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBMZXZlbDsgICAgICAgICAgICAgICAgICAvKiBMZXZlbCwgMCB0byAxMDAgcmVwcmVzZW50aW5nIHBlcmNlbnRhZ2Ugb2YgcmV2ZXJiICovCi0jaWZuZGVmIEhJR0hFUl9GUwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBMUEY7ICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIsIGluIEh6ICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIEhQRjsgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIsIGluIEh6ICovCi0jZWxzZQogICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBMUEY7ICAgICAgICAgICAgICAgICAgICAvKiBMb3cgcGFzcyBmaWx0ZXIsIGluIEh6ICovCiAgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEhQRjsgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIsIGluIEh6ICovCi0jZW5kaWYKIAogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBUNjA7ICAgICAgICAgICAgICAgICAgICAvKiBEZWNheSB0aW1lIGNvbnN0YW50LCBpbiBtcyAqLwogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgICBEZW5zaXR5OyAgICAgICAgICAgICAgICAvKiBFY2hvIGRlbnNpdHksIDAgdG8gMTAwIGZvciBtaW5pbXVtIHRvIG1heGltdW0gZGVuc2l0eSAqLwpAQCAtMTIyLDcgKzEwNiw2IEBACiAKIH0gTFZSRVZfQ29udHJvbFBhcmFtc19zdDsKIAotCiAvKiBJbnN0YW5jZSBQYXJhbWV0ZXIgc3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtMTM1LDcgKzExOCw2IEBACiAKIH0gTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3Q7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTgyLDcgKzE2NCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTWVtb3J5VGFibGVfc3QgICAgICpwTWVtb3J5VGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3QgICpwSW5zdGFuY2VQYXJhbXMpOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIxMyw3ICsxOTQsNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX01lbW9yeVRhYmxlX3N0ICAgICAgKnBNZW1vcnlUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9JbnN0YW5jZVBhcmFtc19zdCAgICpwSW5zdGFuY2VQYXJhbXMpOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZYWF9HZXRDb250cm9sUGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTIzNyw3ICsyMTcsNiBAQAogTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKExWUkVWX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICpwQ29udHJvbFBhcmFtcyk7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjYwLDcgKzIzOSw2IEBACiBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMoTFZSRVZfSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgKnBOZXdQYXJhbXMpOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTI4MSw3ICsyNTksNiBAQAogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMoTFZSRVZfSGFuZGxlX3QgIGhJbnN0YW5jZSk7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlJFVl9Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzAzLDIxICsyODAsMTAgQEAKIC8qICAxLiBUaGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG11c3QgYmUgMzItYml0IGFsaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAogTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX1Byb2Nlc3MoTFZSRVZfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICpwSW5EYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fVUlOVDE2ICAgICAgICAgIE51bVNhbXBsZXMpOwotI2Vsc2UKLUxWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9Qcm9jZXNzKExWUkVWX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDMyICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKTsKLSNlbmRpZgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwogCiAjZW5kaWYgICAgICAvKiBfX0xWUkVWX0hfXyAqLwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3MTA4NDQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQXBwbHlOZXdTZXR0aW5ncy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTIyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgIkxWUkVWX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJGaWx0ZXIuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlJFVl9BcHBseU5ld1NldHRpbmdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBBcHBsaWVzIHRoZSBuZXcgY29udHJvbCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwUHJpdmF0ZSAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwcml2YXRlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlJFVl9TdWNjZXNzICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUkVWX05VTExBRERSRVNTICAgICAgIFdoZW4gcFByaXZhdGUgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmbmRlZiBCVUlMRF9GTE9BVAotTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0FwcGx5TmV3U2V0dGluZ3MgKExWUkVWX0luc3RhbmNlX3N0ICAgICAqcFByaXZhdGUpCi17Ci0KLSAgICBMVk1fTW9kZV9lbiAgT3BlcmF0aW5nTW9kZTsKLSAgICBMVk1fSU5UMzIgICAgTnVtYmVyT2ZEZWxheUxpbmVzOwotCi0KLSAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVyICovCi0gICAgaWYocFByaXZhdGUgPT0gTFZNX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gTFZSRVZfTlVMTEFERFJFU1M7Ci0gICAgfQotCi0gICAgT3BlcmF0aW5nTW9kZSA9IHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZTsKLQotICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQotICAgIHsKLSAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gNDsKLSAgICB9Ci0gICAgZWxzZSBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKLSAgICB7Ci0gICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDE7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBVcGRhdGUgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzCi0gICAgICovCi0gICAgaWYoKHBQcml2YXRlLT5OZXdQYXJhbXMuSFBGICAgICAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5IUEYpICAgICAgICB8fAotICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKLSAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKLSAgICB7Ci0gICAgICAgIExWTV9JTlQzMiAgICAgICBPbWVnYTsKLSAgICAgICAgRk9fQzMyX0NvZWZzX3QgIENvZWZmczsKLQotICAgICAgICBPbWVnYSA9IExWTV9HZXRPbWVnYShwUHJpdmF0ZS0+TmV3UGFyYW1zLkhQRiwgcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKTsKLSAgICAgICAgTFZNX0ZPX0hQRihPbWVnYSwgJkNvZWZmcyk7Ci0gICAgICAgIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoICZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5IUENvZWZzLCAmcFByaXZhdGUtPnBGYXN0RGF0YS0+SFBUYXBzLCAmQ29lZmZzKTsKLSAgICAgICAgTG9hZENvbnN0XzMyKDAsCi0gICAgICAgICAgICAodm9pZCAqKSZwUHJpdmF0ZS0+cEZhc3REYXRhLT5IUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCi0gICAgICAgICAgICBzaXplb2YoQmlxdWFkXzFJX09yZGVyMV9UYXBzX3QpL3NpemVvZihMVk1fSU5UMzIpKTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogVXBkYXRlIHRoZSBsb3cgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzCi0gICAgICovCi0gICAgaWYoKHBQcml2YXRlLT5OZXdQYXJhbXMuTFBGICAgICAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MUEYpICAgICAgICB8fAotICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKLSAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKLSAgICB7Ci0gICAgICAgIExWTV9JTlQzMiAgICAgICBPbWVnYTsKLSAgICAgICAgRk9fQzMyX0NvZWZzX3QgIENvZWZmczsKLQotCi0gICAgICAgIENvZWZmcy5BMCA9IDB4N0ZGRkZGRkY7Ci0gICAgICAgIENvZWZmcy5BMSA9IDA7Ci0gICAgICAgIENvZWZmcy5CMSA9IDA7Ci0gICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuTFBGIDw9IChMVk1fRnNUYWJsZVtwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGVdID4+IDEpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPbWVnYSA9IExWTV9HZXRPbWVnYShwUHJpdmF0ZS0+TmV3UGFyYW1zLkxQRiwgcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIERvIG5vdCBhcHBseSBmaWx0ZXIgaWYgdyA9MipwaSpmYy9mcyA+PSAyLjkKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYoT21lZ2E8PUxWUkVWXzJfOV9JTlEyOSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMVk1fRk9fTFBGKE9tZWdhLCAmQ29lZmZzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCAmcFByaXZhdGUtPnBGYXN0Q29lZi0+TFBDb2VmcywgJnBQcml2YXRlLT5wRmFzdERhdGEtPkxQVGFwcywgJkNvZWZmcyk7Ci0gICAgICAgIExvYWRDb25zdF8zMigwLAotICAgICAgICAgICAgKHZvaWQgKikmcFByaXZhdGUtPnBGYXN0RGF0YS0+TFBUYXBzLCAgICAgICAgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KLSAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCkvc2l6ZW9mKExWTV9JTlQzMikpOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBDYWxjdWxhdGUgdGhlIHJvb20gc2l6ZSBwYXJhbWV0ZXIKLSAgICAgKi8KLSAgICBpZiggcFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkKLSAgICB7Ci0gICAgICAgIC8qIFJvb20gc2l6ZSByYW5nZSBpcyAxMG1zIHRvIDIwMG1zCi0gICAgICAgICAqIDAlICAgLS0gMTBtcwotICAgICAgICAgKiA1MCUgIC0tIDY1bXMKLSAgICAgICAgICogMTAwJSAtLSAxMjBtcwotICAgICAgICAgKi8KLSAgICAgICAgcFByaXZhdGUtPlJvb21TaXplSW5tcyA9IDEwICsgKCgocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSoxMSkgKyA1KS8xMCk7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIFVwZGF0ZSB0aGUgVCBkZWxheSBudW1iZXIgb2Ygc2FtcGxlcyBhbmQgdGhlIGFsbCBwYXNzIGRlbGF5IG51bWJlciBvZiBzYW1wbGVzCi0gICAgICovCi0gICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpICAgfHwKLSAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAotICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKLSAgICB7Ci0KLSAgICAgICAgTFZNX1VJTlQzMiAgVGVtcDsKLSAgICAgICAgTFZNX0lOVDMyICAgQVBEZWxheVNpemU7Ci0gICAgICAgIExWTV9JTlQzMiAgIEZzID0gTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7Ci0gICAgICAgIExWTV9VSU5UMzIgIERlbGF5TGVuZ3RoU2FtcGxlcyA9IChMVk1fVUlOVDMyKShGcyAqIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMpOwotICAgICAgICBMVk1fSU5UMTYgICBpOwotICAgICAgICBMVk1fSU5UMTYgICBTY2FsZVRhYmxlW10gID0ge0xWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80LCBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNH07Ci0gICAgICAgIExWTV9JTlQxNiAgIE1heFRfRGVsYXlbXSAgPSB7TFZSRVZfTUFYX1QwX0RFTEFZLCBMVlJFVl9NQVhfVDFfREVMQVksIExWUkVWX01BWF9UMl9ERUxBWSwgTFZSRVZfTUFYX1QzX0RFTEFZfTsKLSAgICAgICAgTFZNX0lOVDE2ICAgTWF4QVBfRGVsYXlbXSA9IHtMVlJFVl9NQVhfQVAwX0RFTEFZLCBMVlJFVl9NQVhfQVAxX0RFTEFZLCBMVlJFVl9NQVhfQVAyX0RFTEFZLCBMVlJFVl9NQVhfQVAzX0RFTEFZfTsKLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEZvciBlYWNoIGRlbGF5IGxpbmUKLSAgICAgICAgICovCi0gICAgICAgIGZvciAoaT0wOyBpPE51bWJlck9mRGVsYXlMaW5lczsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaSAhPSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExWTV9JTlQzMiBUZW1wMTsgIC8qIHRvIGF2b2lkIFFBQyB3YXJuaW5nIG9uIHR5cGUgY29udmVyc2lvbiAqLwotICAgICAgICAgICAgICAgIExWTV9JTlQzMiBUZW1wMjsgIC8qIHRvIGF2b2lkIFFBQyB3YXJuaW5nIG9uIHR5cGUgY29udmVyc2lvbiAqLwotCi0gICAgICAgICAgICAgICAgVGVtcDI9KExWTV9JTlQzMilEZWxheUxlbmd0aFNhbXBsZXM7Ci0gICAgICAgICAgICAgICAgTVVMMzJ4MTZJTlRPMzIoVGVtcDIsIFNjYWxlVGFibGVbaV0sIFRlbXAxLCAxNSkKLSAgICAgICAgICAgICAgICBUZW1wPShMVk1fVUlOVDMyKVRlbXAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgVGVtcCA9IERlbGF5TGVuZ3RoU2FtcGxlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFQRGVsYXlTaXplID0gVGVtcCAgLyAxNTAwOwotCi0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBTZXQgdGhlIGZpeGVkIGRlbGF5Ci0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIFRlbXAgICAgICAgICAgICAgICAgICA9IChNYXhUX0RlbGF5W2ldIC0gTWF4QVBfRGVsYXlbaV0pICogRnMgLyA0ODAwMDsKLSAgICAgICAgICAgIHBQcml2YXRlLT5EZWxheV9BUFtpXSA9IHBQcml2YXRlLT5UW2ldIC0gVGVtcDsKLQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogU2V0IHRoZSB0YXAgc2VsZWN0aW9uCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFNtb290aCBmcm9tIHRhcCBBIHRvIHRhcCBCICovCi0gICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRCW2ldICAgICAgICAgICAgID0gJnBQcml2YXRlLT5wRGVsYXlfVFtpXVtwUHJpdmF0ZS0+VFtpXSAtIFRlbXAgLSBBUERlbGF5U2l6ZV07Ci0gICAgICAgICAgICAgICAgcFByaXZhdGUtPkJfRGVsYXlTaXplW2ldICAgICAgICAgID0gQVBEZWxheVNpemU7Ci0gICAgICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQxID0gMDsKLSAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDIgPSAweDdmZmZmZmZmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8qIFNtb290aCBmcm9tIHRhcCBCIHRvIHRhcCBBICovCi0gICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRBW2ldICAgICAgICAgICAgID0gJnBQcml2YXRlLT5wRGVsYXlfVFtpXVtwUHJpdmF0ZS0+VFtpXSAtIFRlbXAgLSBBUERlbGF5U2l6ZV07Ci0gICAgICAgICAgICAgICAgcFByaXZhdGUtPkFfRGVsYXlTaXplW2ldICAgICAgICAgID0gQVBEZWxheVNpemU7Ci0gICAgICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQyID0gMDsKLSAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDEgPSAweDdmZmZmZmZmOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogU2V0IHRoZSBtYXhpbXVtIGJsb2NrIHNpemUgdG8gdGhlIHNtYWxsZXN0IGRlbGF5IHNpemUKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiAgID0gVGVtcDsKLSAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+TWF4QmxrTGVuID4gcFByaXZhdGUtPkFfRGVsYXlTaXplW2ldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NYXhCbGtMZW4gPSBwUHJpdmF0ZS0+QV9EZWxheVNpemVbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocFByaXZhdGUtPk1heEJsa0xlbiA+IHBQcml2YXRlLT5CX0RlbGF5U2l6ZVtpXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gcFByaXZhdGUtPkJfRGVsYXlTaXplW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBQcml2YXRlLT5BQl9TZWxlY3Rpb24gPSAxOwotICAgICAgICB9Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBMaW1pdCB0aGUgbWF4aW11bSBibG9jayBsZW5ndGgKLSAgICAgICAgICovCi0gICAgICAgIHBQcml2YXRlLT5NYXhCbGtMZW49cFByaXZhdGUtPk1heEJsa0xlbi0yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBKdXN0IGFzIGEgcHJlY2F1c2lvbiwgYnV0IG5vIHByb2JsZW0gaWYgd2UgcmVtb3ZlIHRoaXMgbGluZSAgICAgICovCi0gICAgICAgIGlmKHBQcml2YXRlLT5NYXhCbGtMZW4gPiBwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTWF4QmxvY2tTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gKExWTV9JTlQzMilwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTWF4QmxvY2tTaXplOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIFVwZGF0ZSB0aGUgbG93IHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50Ci0gICAgICovCi0gICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRhbXBpbmcgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuRGFtcGluZykgICAgfHwKLSAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAotICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKLSAgICB7Ci0KLSAgICAgICAgTFZNX0lOVDMyICAgICAgIFRlbXA7Ci0gICAgICAgIExWTV9JTlQzMiAgICAgICBPbWVnYTsKLSAgICAgICAgRk9fQzMyX0NvZWZzX3QgIENvZWZmczsKLSAgICAgICAgTFZNX0lOVDE2ICAgICAgIGk7Ci0gICAgICAgIExWTV9JTlQxNiAgICAgICBEYW1waW5nICAgICAgPSAoTFZNX0lOVDE2KSgocFByaXZhdGUtPk5ld1BhcmFtcy5EYW1waW5nICogMTAwKSArIDEwMDApOwotICAgICAgICBMVk1fSU5UMzIgICAgICAgU2NhbGVUYWJsZVtdID0ge0xWUkVWX1RfM19Qb3dlcl8wX29uXzQsIExWUkVWX1RfM19Qb3dlcl8xX29uXzQsIExWUkVWX1RfM19Qb3dlcl8yX29uXzQsIExWUkVWX1RfM19Qb3dlcl8zX29uXzR9OwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogRm9yIGVhY2ggZmlsdGVyCi0gICAgICAgICAqLwotICAgICAgICBmb3IgKGk9MDsgaTxOdW1iZXJPZkRlbGF5TGluZXM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNVUwzMngxNklOVE8zMihTY2FsZVRhYmxlW2ldLCBEYW1waW5nLCBUZW1wLCAxNSkKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUZW1wID0gRGFtcGluZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKFRlbXAgPD0gKExWTV9Gc1RhYmxlW3BQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZV0gPj4gMSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgT21lZ2EgPSBMVk1fR2V0T21lZ2EoKExWTV9VSU5UMTYpVGVtcCwgcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICAgICBMVk1fRk9fTFBGKE9tZWdhLCAmQ29lZmZzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb2VmZnMuQTAgPSAweDdGRjAwMDAwOwotICAgICAgICAgICAgICAgIENvZWZmcy5BMSA9IDA7Ci0gICAgICAgICAgICAgICAgQ29lZmZzLkIxID0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoJnBQcml2YXRlLT5wRmFzdENvZWYtPlJldkxQQ29lZnNbaV0sICZwUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbaV0sICZDb2VmZnMpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIFVwZGF0ZSBBbGwtcGFzcyBmaWx0ZXIgbWl4ZXIgdGltZSBjb25zdGFudHMKLSAgICAgKi8KLSAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgICB8fAotICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8Ci0gICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuRGVuc2l0eSkpCi0gICAgewotICAgICAgICBMVk1fSU5UMTYgICBpOwotICAgICAgICBMVk1fSU5UMzIgICBBbHBoYSAgICA9IChMVk1fSU5UMzIpTFZNX01peGVyX1RpbWVDb25zdGFudChMVlJFVl9BTExQQVNTX1RDLCBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwgMSk7Ci0gICAgICAgIExWTV9JTlQzMiAgIEFscGhhVGFwID0gKExWTV9JTlQzMilMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0FMTFBBU1NfVEFQX1RDLCBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwgMSk7Ci0KLSAgICAgICAgZm9yIChpPTA7IGk8NDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkFscGhhMSAgICAgICA9IEFscGhhVGFwOwotICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5BbHBoYTIgICAgICAgPSBBbHBoYVRhcDsKLSAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLkFscGhhICAgID0gQWxwaGE7Ci0gICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5BbHBoYSA9IEFscGhhOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIFVwZGF0ZSB0aGUgZmVlZCBiYWNrIGdhaW4KLSAgICAgKi8KLSAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgICB8fAotICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8Ci0gICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCAgICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuVDYwKSAgICAgICAgfHwKLSAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCi0gICAgewotCi0gICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIEdbNF07ICAgICAgICAgICAgICAgICAgICAgICAvKiBGZWVkYmFjayBnYWluIChRNy4yNCkgKi8KLQotICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBHWzNdID0gMDsKLSAgICAgICAgICAgIEdbMl0gPSAwOwotICAgICAgICAgICAgR1sxXSA9IDA7Ci0gICAgICAgICAgICBHWzBdID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIExWTV9JTlQzMiAgIFRlbXAxOwotICAgICAgICAgICAgTFZNX0lOVDMyICAgVGVtcDI7Ci0gICAgICAgICAgICBMVk1fSU5UMTYgICBpOwotICAgICAgICAgICAgTFZNX0lOVDE2ICAgU2NhbGVUYWJsZVtdID0ge0xWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80LCBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNH07Ci0KLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEZvciBlYWNoIGRlbGF5IGxpbmUKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgZm9yIChpPTA7IGk8TnVtYmVyT2ZEZWxheUxpbmVzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGVtcDEgPSAoMyAqIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMgKiBTY2FsZVRhYmxlW2ldKSAvIHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwOwotICAgICAgICAgICAgICAgIGlmKFRlbXAxID49ICg0IDw8IDE1KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEdbaV0gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKChUZW1wMSA+PSAoMiA8PCAxNSkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVGVtcDIgPSBMVk1fUG93ZXIxMCgtKFRlbXAxIDw8IDE0KSk7Ci0gICAgICAgICAgICAgICAgICAgIFRlbXAxID0gTFZNX1Bvd2VyMTAoLShUZW1wMSA8PCAxNCkpOwotICAgICAgICAgICAgICAgICAgICBNVUwzMngzMklOVE8zMihUZW1wMSxUZW1wMixUZW1wMSwyNCkKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVGVtcDEgPSBMVk1fUG93ZXIxMCgtKFRlbXAxIDw8IDE1KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChOdW1iZXJPZkRlbGF5TGluZXMgPT0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEdbaV0gPSBUZW1wMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyICAgVGVtcEc7Ci0gICAgICAgICAgICAgICAgICAgIE1VTDMyeDE2SU5UTzMyKFRlbXAxLE9ORV9PVkVSX1NRUlRfVFdPLFRlbXBHLDE1KQotICAgICAgICAgICAgICAgICAgICBHW2ldPVRlbXBHOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qIFNldCB1cCB0aGUgZmVlZGJhY2sgbWl4ZXJzIGZvciBmb3VyIGRlbGF5IGxpbmVzICovCi0gICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzBdLlRhcmdldD1HWzBdPDw3OwotICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclsxXS5UYXJnZXQ9R1sxXTw8NzsKLSAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMl0uVGFyZ2V0PUdbMl08PDc7Ci0gICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzNdLlRhcmdldD1HWzNdPDw3OwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBDYWxjdWxhdGUgdGhlIGdhaW4gY29ycmVjdGlvbgotICAgICAqLwotICAgIGlmKChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSB8fAotICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkxldmVsKSAgICB8fAotICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCAgICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlQ2MCkgKQotICAgIHsKLSAgICAgICAgTFZNX0lOVDMyIEluZGV4PTA7Ci0gICAgICAgIExWTV9JTlQzMiBpPTA7Ci0gICAgICAgIExWTV9JTlQzMiBHYWluPTA7Ci0gICAgICAgIExWTV9JTlQzMiBSb29tU2l6ZT0wOwotICAgICAgICBMVk1fSU5UMzIgVDYwOwotICAgICAgICBMVk1fSU5UMzIgQ29lZnNbNV07Ci0KLSAgICAgICAgaWYocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZT09MCkKLSAgICAgICAgewotICAgICAgICAgICAgUm9vbVNpemU9MTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJvb21TaXplPShMVk1fSU5UMzIpcFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwPDEwMCkKLSAgICAgICAgewotICAgICAgICAgICAgVDYwID0gMTAwICogTFZSRVZfVDYwX1NDQUxFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgVDYwID0gcFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgKiBMVlJFVl9UNjBfU0NBTEU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaW5kIHRoZSBuZWFyZXN0IHJvb20gc2l6ZSBpbiB0YWJsZSAqLwotICAgICAgICBmb3IoaT0wO2k8MjQ7aSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihSb29tU2l6ZTw9IExWUkVWX0dhaW5Qb2x5VGFibGVbaV1bMF0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSW5kZXg9aTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYoUm9vbVNpemU9PUxWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdWzBdKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBUYWtlIHRhYmxlIHZhbHVlcyBpZiB0aGUgcm9vbSBzaXplIGlzIGluIHRhYmxlICovCi0gICAgICAgICAgICBmb3IoaT0xO2k8NTtpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29lZnNbaS0xXT1MVlJFVl9HYWluUG9seVRhYmxlW0luZGV4XVtpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvZWZzWzRdPTA7Ci0gICAgICAgICAgICBHYWluPUxWTV9Qb2x5bm9taWFsKDMsQ29lZnMsVDYwKTsgICAgICAgLyogUS4yNCByZXN1bHQgKi8KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIEludGVycG9sYXRlIHRoZSBnYWluIGJldHdlZW4gbmVhcmVzdCByb29tIHNpemVzICovCi0KLSAgICAgICAgICAgIExWTV9JTlQzMiBHYWluMSxHYWluMjsKLSAgICAgICAgICAgIExWTV9JTlQzMiBUb3RfRGlzdCxEaXN0OwotCi0gICAgICAgICAgICBUb3RfRGlzdD1MVlJFVl9HYWluUG9seVRhYmxlW0luZGV4XVswXS1MVlJFVl9HYWluUG9seVRhYmxlW0luZGV4LTFdWzBdOwotICAgICAgICAgICAgRGlzdD1Sb29tU2l6ZS1MVlJFVl9HYWluUG9seVRhYmxlW0luZGV4LTFdWzBdOwotCi0KLSAgICAgICAgICAgIC8qIEdldCBnYWluIGZvciBmaXJzdCAqLwotICAgICAgICAgICAgZm9yKGk9MTtpPDU7aSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvZWZzW2ktMV09TFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleC0xXVtpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvZWZzWzRdPTA7Ci0KLSAgICAgICAgICAgIEdhaW4xPUxWTV9Qb2x5bm9taWFsKDMsQ29lZnMsVDYwKTsgICAgICAvKiBRLjI0IHJlc3VsdCAqLwotCi0gICAgICAgICAgICAvKiBHZXQgZ2FpbiBmb3Igc2Vjb25kICovCi0gICAgICAgICAgICBmb3IoaT0xO2k8NTtpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29lZnNbaS0xXT1MVlJFVl9HYWluUG9seVRhYmxlW0luZGV4XVtpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvZWZzWzRdPTA7Ci0KLSAgICAgICAgICAgIEdhaW4yPUxWTV9Qb2x5bm9taWFsKDMsQ29lZnMsVDYwKTsgICAgICAvKiBRLjI0IHJlc3VsdCAqLwotCi0gICAgICAgICAgICAvKiBMaW5lYXIgSW50ZXJwb2xhdGUgdGhlIGdhaW4gKi8KLSAgICAgICAgICAgIEdhaW4gPSBHYWluMSsgKCgoR2FpbjItR2FpbjEpKkRpc3QpLyhUb3RfRGlzdCkpOwotICAgICAgICB9Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdGhlIGludmVyc2Ugb2YgZ2FpbjogUS4xNQotICAgICAgICAgKiBHYWluIGlzIG1vc3RseSBhYm92ZSBvbmUgZXhjZXB0IGZldyBjYXNlcywgdGFrZSBvbmx5IGdhaW5zIGFib3ZlIDEKLSAgICAgICAgICovCi0gICAgICAgIGlmKEdhaW4gPCAxNjc3NzIxNkwpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBQcml2YXRlLT5HYWluPSAzMjc2NzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBQcml2YXRlLT5HYWluPShMVk1fSU5UMTYpKExWTV9NQVhJTlRfMzIvKEdhaW4+PjgpKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgSW5kZXg9KCgzMjc2NyoxMDApLygxMDArcFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCkpOwotICAgICAgICBwUHJpdmF0ZS0+R2Fpbj0oTFZNX0lOVDE2KSgocFByaXZhdGUtPkdhaW4qSW5kZXgpPj4xNSk7Ci0gICAgICAgIHBQcml2YXRlLT5HYWluTWl4ZXIuVGFyZ2V0ID0gcFByaXZhdGUtPkdhaW4qSW5kZXg7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIFVwZGF0ZSB0aGUgYWxsIHBhc3MgY29tYiBmaWx0ZXIgY29lZmZpY2llbnQKLSAgICAgKi8KLSAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuRGVuc2l0eSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5EZW5zaXR5KSB8fAotICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgID09IExWTV9UUlVFKSkKLSAgICB7Ci0gICAgICAgIExWTV9JTlQxNiAgIGk7Ci0gICAgICAgIExWTV9JTlQzMiAgIGIgPSBwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgKiBMVlJFVl9CXzhfb25fMTAwMDsKLQotICAgICAgICBmb3IgKGk9MDtpPDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0uVGFyZ2V0ICAgID0gYjsKLSAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLlRhcmdldCA9IGI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogVXBkYXRlIHRoZSBieXBhc3MgbWl4ZXIgdGltZSBjb25zdGFudAotICAgICAqLwotICAgIGlmKChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSAgIHx8Ci0gICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICAgID09IExWTV9UUlVFKSkKLSAgICB7Ci0gICAgICAgIExWTV9VSU5UMTYgICBOdW1DaGFubmVscyA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAvKiBBc3N1bWUgTU9OTyBmb3JtYXQgKi8KLSAgICAgICAgTFZNX0lOVDMyICAgIEFscGhhOwotCi0gICAgICAgIEFscGhhID0gKExWTV9JTlQzMilMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0ZFRURCQUNLTUlYRVJfVEMsIExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpLCBOdW1DaGFubmVscyk7Ci0gICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzBdLkFscGhhPUFscGhhOwotICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclsxXS5BbHBoYT1BbHBoYTsKLSAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMl0uQWxwaGE9QWxwaGE7Ci0gICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzNdLkFscGhhPUFscGhhOwotCi0gICAgICAgIE51bUNoYW5uZWxzID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbHdheXMgc3RlcmVvIG91dHB1dCAqLwotICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQWxwaGExID0gKExWTV9JTlQzMilMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0JZUEFTU01JWEVSX1RDLCBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwgTnVtQ2hhbm5lbHMpOwotICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQWxwaGEyID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLkFscGhhMTsKLSAgICAgICAgcFByaXZhdGUtPkdhaW5NaXhlci5BbHBoYSAgICA9IHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTE7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIFVwZGF0ZSB0aGUgYnlwYXNzIG1peGVyIHRhcmdldHMKLSAgICAgKi8KLSAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuTGV2ZWwpICYmCi0gICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZNX01PREVfT04pKQotICAgIHsKLSAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgPSAoKExWTV9JTlQzMikocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAqIDMyNzY3KS8xMDApPDwxNjsKLSAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDEgPSAweDAwMDAwMDAwOwotICAgICAgICBpZiAoKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgPT0gMCkgJiYgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9GQUxTRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUHJpdmF0ZS0+YkRpc2FibGVSZXZlcmIgPSBMVk1fRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuT3BlcmF0aW5nTW9kZSkKLSAgICB7Ci0gICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikKLSAgICAgICAgewotICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgPSAoKExWTV9JTlQzMikocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAqIDMyNzY3KS8xMDApPDwxNjsKLSAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQxID0gMHgwMDAwMDAwMDsKLQotICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkNhbGxiYWNrU2V0MiA9IExWTV9GQUxTRTsKLSAgICAgICAgICAgIE9wZXJhdGluZ01vZGUgICAgICAgICAgICAgICAgICAgICAgPSBMVk1fTU9ERV9PTjsKLSAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFByaXZhdGUtPmJEaXNhYmxlUmV2ZXJiID0gTFZNX1RSVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFByaXZhdGUtPmJEaXNhYmxlUmV2ZXJiID0gTFZNX0ZBTFNFOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9GQUxTRSkKLSAgICAgICAgewotICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgPSAweDAwMDAwMDAwOwotICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDEgPSAweDAwMDAwMDAwOwotICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkNhbGxiYWNrU2V0MiA9IExWTV9UUlVFOwotICAgICAgICAgICAgcFByaXZhdGUtPkdhaW5NaXhlci5UYXJnZXQgICAgPSAweDAzRkZGRkZGOwotICAgICAgICAgICAgT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09OOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgT3BlcmF0aW5nTW9kZSA9IExWTV9NT0RFX09GRjsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBJZiBpdCBpcyB0aGUgZmlyc3QgY2FsbCB0byBBcHBseU5ldyBzZXR0aW5ncyBmb3JjZSB0aGUgY3VycmVudCB0byB0aGUgdGFyZ2V0IHRvIGJlZ2luIGltbWVkaWF0ZSBwbGF5YmFjayBvZiB0aGUgZWZmZWN0Ci0gICAgICovCi0gICAgaWYocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpCi0gICAgewotICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ3VycmVudDEgPSBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MTsKLSAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkN1cnJlbnQyID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDI7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIENvcHkgdGhlIG5ldyBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMgPSBwUHJpdmF0ZS0+TmV3UGFyYW1zOwotICAgIHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBPcGVyYXRpbmdNb2RlOwotCi0KLSAgICAvKgotICAgICAqIFVwZGF0ZSBmbGFnCi0gICAgICovCi0gICAgaWYocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpCi0gICAgewotICAgICAgICBwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9IExWTV9GQUxTRTsKLSAgICB9Ci0KLQotICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOwotfQotI2Vsc2UgLyogQlVJTERfRkxPQVQqLwotTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0FwcGx5TmV3U2V0dGluZ3MgKExWUkVWX0luc3RhbmNlX3N0ICAgICAqcFByaXZhdGUpCi17Ci0KLSAgICBMVk1fTW9kZV9lbiAgT3BlcmF0aW5nTW9kZTsKLSAgICBMVk1fSU5UMzIgICAgTnVtYmVyT2ZEZWxheUxpbmVzOwotCi0KLSAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVyICovCi0gICAgaWYocFByaXZhdGUgPT0gTFZNX05VTEwpCi0gICAgewotICAgICAgICByZXR1cm4gTFZSRVZfTlVMTEFERFJFU1M7Ci0gICAgfQotCi0gICAgT3BlcmF0aW5nTW9kZSA9IHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZTsKLQotICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQotICAgIHsKLSAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gNDsKLSAgICB9Ci0gICAgZWxzZSBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKLSAgICB7Ci0gICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDE7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBVcGRhdGUgdGhlIGhpZ2ggcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzCi0gICAgICovCi0gICAgaWYoKHBQcml2YXRlLT5OZXdQYXJhbXMuSFBGICAgICAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5IUEYpICAgICAgICB8fAotICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKLSAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgICAgICBPbWVnYTsKLSAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgQ29lZmZzOwotCi0gICAgICAgIE9tZWdhID0gTFZNX0dldE9tZWdhKHBQcml2YXRlLT5OZXdQYXJhbXMuSFBGLCBwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpOwotICAgICAgICBMVk1fRk9fSFBGKE9tZWdhLCAmQ29lZmZzKTsKLSAgICAgICAgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggJnBQcml2YXRlLT5wRmFzdENvZWYtPkhQQ29lZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cEZhc3REYXRhLT5IUFRhcHMsICZDb2VmZnMpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBQcml2YXRlLT5wRmFzdERhdGEtPkhQVGFwcywgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190KSAvIHNpemVvZihMVk1fRkxPQVQpKTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogVXBkYXRlIHRoZSBsb3cgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzCi0gICAgICovCi0gICAgaWYoKHBQcml2YXRlLT5OZXdQYXJhbXMuTFBGICAgICAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MUEYpICAgICAgICB8fAotICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKLSAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKLSAgICB7Ci0gICAgICAgIExWTV9GTE9BVCAgICAgICBPbWVnYTsKLSAgICAgICAgRk9fRkxPQVRfQ29lZnNfdCAgQ29lZmZzOwotCi0gICAgICAgIENvZWZmcy5BMCA9IDE7Ci0gICAgICAgIENvZWZmcy5BMSA9IDA7Ci0gICAgICAgIENvZWZmcy5CMSA9IDA7Ci0gICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuTFBGIDw9IChMVk1fRnNUYWJsZVtwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGVdID4+IDEpKQotICAgICAgICB7Ci0gICAgICAgICAgICBPbWVnYSA9IExWTV9HZXRPbWVnYShwUHJpdmF0ZS0+TmV3UGFyYW1zLkxQRiwgcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIERvIG5vdCBhcHBseSBmaWx0ZXIgaWYgdyA9MipwaSpmYy9mcyA+PSAyLjkKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYoT21lZ2EgPD0gKExWTV9GTE9BVClMVlJFVl8yXzlfSU5RMjkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTFZNX0ZPX0xQRihPbWVnYSwgJkNvZWZmcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCggJnBQcml2YXRlLT5wRmFzdENvZWYtPkxQQ29lZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cEZhc3REYXRhLT5MUFRhcHMsICZDb2VmZnMpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBQcml2YXRlLT5wRmFzdERhdGEtPkxQVGFwcywgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLwotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190KSAvIHNpemVvZihMVk1fRkxPQVQpKTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogQ2FsY3VsYXRlIHRoZSByb29tIHNpemUgcGFyYW1ldGVyCi0gICAgICovCi0gICAgaWYoIHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpCi0gICAgewotICAgICAgICAvKiBSb29tIHNpemUgcmFuZ2UgaXMgMTBtcyB0byAyMDBtcwotICAgICAgICAgKiAwJSAgIC0tIDEwbXMKLSAgICAgICAgICogNTAlICAtLSA2NW1zCi0gICAgICAgICAqIDEwMCUgLS0gMTIwbXMKLSAgICAgICAgICovCi0gICAgICAgIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMgPSAxMCArICgoKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUqMTEpICsgNSkgLyAxMCk7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIFVwZGF0ZSB0aGUgVCBkZWxheSBudW1iZXIgb2Ygc2FtcGxlcyBhbmQgdGhlIGFsbCBwYXNzIGRlbGF5IG51bWJlciBvZiBzYW1wbGVzCi0gICAgICovCi0gICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpICAgfHwKLSAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAotICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKLSAgICB7Ci0KLSAgICAgICAgTFZNX1VJTlQzMiAgVGVtcDsKLSAgICAgICAgTFZNX0lOVDMyICAgQVBEZWxheVNpemU7Ci0gICAgICAgIExWTV9JTlQzMiAgIEZzID0gTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7Ci0gICAgICAgIExWTV9VSU5UMzIgIERlbGF5TGVuZ3RoU2FtcGxlcyA9IChMVk1fVUlOVDMyKShGcyAqIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMpOwotICAgICAgICBMVk1fSU5UMTYgICBpOwotICAgICAgICBMVk1fRkxPQVQgICBTY2FsZVRhYmxlW10gID0ge0xWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80LCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80LCBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzR9OwotICAgICAgICBMVk1fSU5UMTYgICBNYXhUX0RlbGF5W10gID0ge0xWUkVWX01BWF9UMF9ERUxBWSwgTFZSRVZfTUFYX1QxX0RFTEFZLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTUFYX1QyX0RFTEFZLCBMVlJFVl9NQVhfVDNfREVMQVl9OwotICAgICAgICBMVk1fSU5UMTYgICBNYXhBUF9EZWxheVtdID0ge0xWUkVWX01BWF9BUDBfREVMQVksIExWUkVWX01BWF9BUDFfREVMQVksIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NQVhfQVAyX0RFTEFZLCBMVlJFVl9NQVhfQVAzX0RFTEFZfTsKLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEZvciBlYWNoIGRlbGF5IGxpbmUKLSAgICAgICAgICovCi0gICAgICAgIGZvciAoaSA9IDA7IGkgPCBOdW1iZXJPZkRlbGF5TGluZXM7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGkgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBMVk1fRkxPQVQgVGVtcDE7ICAvKiB0byBhdm9pZCBRQUMgd2FybmluZyBvbiB0eXBlIGNvbnZlcnNpb24gKi8KLQotICAgICAgICAgICAgICAgIFRlbXAxPShMVk1fRkxPQVQpRGVsYXlMZW5ndGhTYW1wbGVzOwotICAgICAgICAgICAgICAgIFRlbXAgPSAoTFZNX1VJTlQzMikoVGVtcDEgKiBTY2FsZVRhYmxlW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIFRlbXAgPSBEZWxheUxlbmd0aFNhbXBsZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBUERlbGF5U2l6ZSA9IFRlbXAgIC8gMTUwMDsKLQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogU2V0IHRoZSBmaXhlZCBkZWxheQotICAgICAgICAgICAgICovCi0KLSNpZmRlZiBISUdIRVJfRlMKLSAgICAgICAgICAgIFRlbXAgID0gKE1heFRfRGVsYXlbaV0gLSBNYXhBUF9EZWxheVtpXSkgKiBGcyAvIDE5MjAwMDsKLSNlbHNlCi0gICAgICAgICAgICBUZW1wICA9IChNYXhUX0RlbGF5W2ldIC0gTWF4QVBfRGVsYXlbaV0pICogRnMgLyA0ODAwMDsKLSNlbmRpZgotICAgICAgICAgICAgcFByaXZhdGUtPkRlbGF5X0FQW2ldID0gcFByaXZhdGUtPlRbaV0gLSBUZW1wOwotCi0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBTZXQgdGhlIHRhcCBzZWxlY3Rpb24KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5BQl9TZWxlY3Rpb24pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogU21vb3RoIGZyb20gdGFwIEEgdG8gdGFwIEIgKi8KLSAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cE9mZnNldEJbaV0gICAgICAgICAgICAgPSAmcFByaXZhdGUtPnBEZWxheV9UW2ldW3BQcml2YXRlLT5UW2ldIC0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcCAtIEFQRGVsYXlTaXplXTsKLSAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+Ql9EZWxheVNpemVbaV0gICAgICAgICAgPSBBUERlbGF5U2l6ZTsKLSAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDEgPSAwOwotICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MiA9IDEuMGY7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyogU21vb3RoIGZyb20gdGFwIEIgdG8gdGFwIEEgKi8KLSAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cE9mZnNldEFbaV0gICAgICAgICAgICAgPSAmcFByaXZhdGUtPnBEZWxheV9UW2ldW3BQcml2YXRlLT5UW2ldIC0gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVtcCAtIEFQRGVsYXlTaXplXTsKLSAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+QV9EZWxheVNpemVbaV0gICAgICAgICAgPSBBUERlbGF5U2l6ZTsKLSAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLlRhcmdldDIgPSAwOwotICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MSA9IDEuMGY7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBTZXQgdGhlIG1heGltdW0gYmxvY2sgc2l6ZSB0byB0aGUgc21hbGxlc3QgZGVsYXkgc2l6ZQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuICAgPSBUZW1wOwotICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5NYXhCbGtMZW4gPiBwUHJpdmF0ZS0+QV9EZWxheVNpemVbaV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiA9IHBQcml2YXRlLT5BX0RlbGF5U2l6ZVtpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwUHJpdmF0ZS0+TWF4QmxrTGVuID4gcFByaXZhdGUtPkJfRGVsYXlTaXplW2ldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NYXhCbGtMZW4gPSBwUHJpdmF0ZS0+Ql9EZWxheVNpemVbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBQcml2YXRlLT5BQl9TZWxlY3Rpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBQcml2YXRlLT5BQl9TZWxlY3Rpb24gPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgcFByaXZhdGUtPkFCX1NlbGVjdGlvbiA9IDE7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIExpbWl0IHRoZSBtYXhpbXVtIGJsb2NrIGxlbmd0aAotICAgICAgICAgKi8KLSAgICAgICAgLyogSnVzdCBhcyBhIHByZWNhdXNpb24sIGJ1dCBubyBwcm9ibGVtIGlmIHdlIHJlbW92ZSB0aGlzIGxpbmUgICAgICAqLwotICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gcFByaXZhdGUtPk1heEJsa0xlbiAtIDI7Ci0gICAgICAgIGlmKHBQcml2YXRlLT5NYXhCbGtMZW4gPiBwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTWF4QmxvY2tTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gKExWTV9JTlQzMilwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTWF4QmxvY2tTaXplOwotICAgICAgICB9Ci0gICAgfQotCi0KLQotICAgIC8qCi0gICAgICogVXBkYXRlIHRoZSBsb3cgcGFzcyBmaWx0ZXIgY29lZmZpY2llbnQKLSAgICAgKi8KLSAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuRGFtcGluZyAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5EYW1waW5nKSAgICB8fAotICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8Ci0gICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgPT0gTFZNX1RSVUUpKQotICAgIHsKLQotICAgICAgICBMVk1fSU5UMzIgICAgICAgVGVtcDsKLSAgICAgICAgTFZNX0ZMT0FUICAgICAgIE9tZWdhOwotICAgICAgICBGT19GTE9BVF9Db2Vmc190ICBDb2VmZnM7Ci0gICAgICAgIExWTV9JTlQxNiAgICAgICBpOwotICAgICAgICBMVk1fSU5UMTYgICAgICAgRGFtcGluZyAgICAgID0gKExWTV9JTlQxNikoKHBQcml2YXRlLT5OZXdQYXJhbXMuRGFtcGluZyAqIDEwMCkgKyAxMDAwKTsKLSAgICAgICAgTFZNX0ZMT0FUICAgICAgIFNjYWxlVGFibGVbXSA9IHtMVlJFVl9UXzNfUG93ZXJfMF9vbl80LCBMVlJFVl9UXzNfUG93ZXJfMV9vbl80LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX1RfM19Qb3dlcl8yX29uXzQsIExWUkVWX1RfM19Qb3dlcl8zX29uXzR9OwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogRm9yIGVhY2ggZmlsdGVyCi0gICAgICAgICAqLwotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGVtcCA9IChMVk1fSU5UMzIpKFNjYWxlVGFibGVbaV0gKiBEYW1waW5nKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUZW1wID0gRGFtcGluZzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmKFRlbXAgPD0gKExWTV9JTlQzMikoTFZNX0ZzVGFibGVbcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlXSA+PiAxKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPbWVnYSA9IExWTV9HZXRPbWVnYShUZW1wLCBwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpOwotICAgICAgICAgICAgICAgIExWTV9GT19MUEYoT21lZ2EsICZDb2VmZnMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvZWZmcy5BMCA9IDE7Ci0gICAgICAgICAgICAgICAgQ29lZmZzLkExID0gMDsKLSAgICAgICAgICAgICAgICBDb2VmZnMuQjEgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCgmcFByaXZhdGUtPnBGYXN0Q29lZi0+UmV2TFBDb2Vmc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1tpXSwgJkNvZWZmcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogVXBkYXRlIEFsbC1wYXNzIGZpbHRlciBtaXhlciB0aW1lIGNvbnN0YW50cwotICAgICAqLwotICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSAgIHx8Ci0gICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKLSAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuRGVuc2l0eSAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5EZW5zaXR5KSkKLSAgICB7Ci0gICAgICAgIExWTV9JTlQxNiAgIGk7Ci0gICAgICAgIExWTV9GTE9BVCAgIEFscGhhOwotICAgICAgICBMVk1fRkxPQVQgICBBbHBoYVRhcDsKLQotICAgICAgICBBbHBoYSA9IExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZSRVZfQUxMUEFTU19UQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7Ci0KLSAgICAgICAgQWxwaGFUYXAgPSBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0FMTFBBU1NfVEFQX1RDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxKTsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkFscGhhMSAgICAgICA9IEFscGhhVGFwOwotICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5BbHBoYTIgICAgICAgPSBBbHBoYVRhcDsKLSAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLkFscGhhICAgID0gQWxwaGE7Ci0gICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5BbHBoYSA9IEFscGhhOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIFVwZGF0ZSB0aGUgZmVlZCBiYWNrIGdhaW4KLSAgICAgKi8KLSAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgICB8fAotICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8Ci0gICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCAgICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuVDYwKSAgICAgICAgfHwKLSAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCi0gICAgewotCi0gICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIEdbNF07ICAgICAgICAgICAgICAgICAgICAgICAvKiBGZWVkYmFjayBnYWluIChRNy4yNCkgKi8KLQotICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCA9PSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBHWzNdID0gMDsKLSAgICAgICAgICAgIEdbMl0gPSAwOwotICAgICAgICAgICAgR1sxXSA9IDA7Ci0gICAgICAgICAgICBHWzBdID0gMDsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIExWTV9GTE9BVCAgIFRlbXAxOwotICAgICAgICAgICAgTFZNX0ZMT0FUICAgVGVtcDI7Ci0gICAgICAgICAgICBMVk1fSU5UMTYgICBpOwotICAgICAgICAgICAgTFZNX0ZMT0FUICAgU2NhbGVUYWJsZVtdID0ge0xWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMV9vbl80LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80fTsKLQotCi0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogRm9yIGVhY2ggZGVsYXkgbGluZQotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVGVtcDEgPSAoMyAqIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMgKiBTY2FsZVRhYmxlW2ldKSAvIHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwOwotICAgICAgICAgICAgICAgIGlmKFRlbXAxID49ICg0KSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEdbaV0gPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmKChUZW1wMSA+PSAoMikpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVGVtcDIgPSBMVk1fUG93ZXIxMCgtKFRlbXAxIC8gMi4wZikpOwotICAgICAgICAgICAgICAgICAgICBUZW1wMSA9IExWTV9Qb3dlcjEwKC0oVGVtcDEgLyAyLjBmKSk7Ci0gICAgICAgICAgICAgICAgICAgIFRlbXAxID0gVGVtcDEgKiBUZW1wMjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVGVtcDEgPSBMVk1fUG93ZXIxMCgtKFRlbXAxKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChOdW1iZXJPZkRlbGF5TGluZXMgPT0gMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEdbaV0gPSBUZW1wMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgVGVtcEc7Ci0gICAgICAgICAgICAgICAgICAgIFRlbXBHID0gVGVtcDEgKiBPTkVfT1ZFUl9TUVJUX1RXTzsKLSAgICAgICAgICAgICAgICAgICAgR1tpXT1UZW1wRzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBTZXQgdXAgdGhlIGZlZWRiYWNrIG1peGVycyBmb3IgZm91ciBkZWxheSBsaW5lcyAqLwotICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclswXS5UYXJnZXQ9R1swXTsKLSAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMV0uVGFyZ2V0PUdbMV07Ci0gICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzJdLlRhcmdldD1HWzJdOwotICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclszXS5UYXJnZXQ9R1szXTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogQ2FsY3VsYXRlIHRoZSBnYWluIGNvcnJlY3Rpb24KLSAgICAgKi8KLSAgICBpZigocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgfHwKLSAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MZXZlbCkgICAgfHwKLSAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgICAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5UNjApICkKLSAgICB7Ci0gICAgICAgIExWTV9JTlQzMiBJbmRleD0wOwotICAgICAgICBMVk1fRkxPQVQgSW5kZXhfRkxPQVQ7Ci0gICAgICAgIExWTV9JTlQzMiBpPTA7Ci0gICAgICAgIExWTV9GTE9BVCBHYWluPTA7Ci0gICAgICAgIExWTV9JTlQzMiBSb29tU2l6ZT0wOwotICAgICAgICBMVk1fRkxPQVQgVDYwOwotICAgICAgICBMVk1fRkxPQVQgQ29lZnNbNV07Ci0KLQotICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJvb21TaXplID0gMTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJvb21TaXplID0gKExWTV9JTlQzMilwUHJpdmF0ZS0+TmV3UGFyYW1zLlJvb21TaXplOwotICAgICAgICB9Ci0KLQotICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCA8IDEwMCkKLSAgICAgICAgewotICAgICAgICAgICAgVDYwID0gMTAwICogTFZSRVZfVDYwX1NDQUxFOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgVDYwID0gcFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgKiBMVlJFVl9UNjBfU0NBTEU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBGaW5kIHRoZSBuZWFyZXN0IHJvb20gc2l6ZSBpbiB0YWJsZSAqLwotICAgICAgICBmb3IoaSA9IDA7IGkgPCAyNDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihSb29tU2l6ZSA8PSBMVlJFVl9HYWluUG9seVRhYmxlW2ldWzBdKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYoUm9vbVNpemUgPT0gTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1bMF0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFRha2UgdGFibGUgdmFsdWVzIGlmIHRoZSByb29tIHNpemUgaXMgaW4gdGFibGUgKi8KLSAgICAgICAgICAgIGZvcihpID0gMTsgaSA8IDU7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb2Vmc1tpLTFdID0gTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1baV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb2Vmc1s0XSA9IDA7Ci0gICAgICAgICAgICBHYWluID0gTFZNX1BvbHlub21pYWwoMywgQ29lZnMsIFQ2MCk7ICAgICAgIC8qIFEuMjQgcmVzdWx0ICovCi0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBJbnRlcnBvbGF0ZSB0aGUgZ2FpbiBiZXR3ZWVuIG5lYXJlc3Qgcm9vbSBzaXplcyAqLwotCi0gICAgICAgICAgICBMVk1fRkxPQVQgR2FpbjEsR2FpbjI7Ci0gICAgICAgICAgICBMVk1fSU5UMzIgVG90X0Rpc3QsRGlzdDsKLQotICAgICAgICAgICAgVG90X0Rpc3QgPSAoTFZNX1VJTlQzMilMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4XVswXSAtIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMzIpTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleC0xXVswXTsKLSAgICAgICAgICAgIERpc3QgPSBSb29tU2l6ZSAtIChMVk1fVUlOVDMyKUxWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXggLSAxXVswXTsKLQotCi0gICAgICAgICAgICAvKiBHZXQgZ2FpbiBmb3IgZmlyc3QgKi8KLSAgICAgICAgICAgIGZvcihpID0gMTsgaSA8IDU7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb2Vmc1tpLTFdID0gTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleC0xXVtpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvZWZzWzRdID0gMDsKLQotICAgICAgICAgICAgR2FpbjEgPSBMVk1fUG9seW5vbWlhbCgzLCBDb2VmcywgVDYwKTsgICAgICAvKiBRLjI0IHJlc3VsdCAqLwotCi0gICAgICAgICAgICAvKiBHZXQgZ2FpbiBmb3Igc2Vjb25kICovCi0gICAgICAgICAgICBmb3IoaSA9IDE7IGkgPCA1OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29lZnNbaS0xXSA9IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29lZnNbNF0gPSAwOwotCi0gICAgICAgICAgICBHYWluMiA9IExWTV9Qb2x5bm9taWFsKDMsIENvZWZzLCBUNjApOyAgICAgIC8qIFEuMjQgcmVzdWx0ICovCi0KLSAgICAgICAgICAgIC8qIExpbmVhciBJbnRlcnBvbGF0ZSB0aGUgZ2FpbiAqLwotICAgICAgICAgICAgR2FpbiA9IEdhaW4xICsgKCgoR2FpbjIgLSBHYWluMSkgKiBEaXN0KSAvIChUb3RfRGlzdCkpOwotICAgICAgICB9Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBHZXQgdGhlIGludmVyc2Ugb2YgZ2FpbjogUS4xNQotICAgICAgICAgKiBHYWluIGlzIG1vc3RseSBhYm92ZSBvbmUgZXhjZXB0IGZldyBjYXNlcywgdGFrZSBvbmx5IGdhaW5zIGFib3ZlIDEKLSAgICAgICAgICovCi0gICAgICAgIGlmKEdhaW4gPCAxKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUHJpdmF0ZS0+R2FpbiA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwUHJpdmF0ZS0+R2FpbiA9IDEgLyBHYWluOwotICAgICAgICB9Ci0KLSAgICAgICAgSW5kZXhfRkxPQVQgPSAxMDAuMGYgLyAoTFZNX0ZMT0FUKSgxMDAgKyBwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsKTsKLSAgICAgICAgcFByaXZhdGUtPkdhaW4gPSBwUHJpdmF0ZS0+R2FpbiAqIEluZGV4X0ZMT0FUOwotICAgICAgICBwUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCA9IChwUHJpdmF0ZS0+R2FpbipJbmRleF9GTE9BVCkgLyAyOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBVcGRhdGUgdGhlIGFsbCBwYXNzIGNvbWIgZmlsdGVyIGNvZWZmaWNpZW50Ci0gICAgICovCi0gICAgaWYoIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuRGVuc2l0eSkgfHwKLSAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICA9PSBMVk1fVFJVRSkpCi0gICAgewotICAgICAgICBMVk1fSU5UMTYgICBpOwotICAgICAgICBMVk1fRkxPQVQgICBiID0gKExWTV9GTE9BVClwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgKiBMVlJFVl9CXzhfb25fMTAwMDsKLQotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5UYXJnZXQgICAgPSBiOwotICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uVGFyZ2V0ID0gYjsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBVcGRhdGUgdGhlIGJ5cGFzcyBtaXhlciB0aW1lIGNvbnN0YW50Ci0gICAgICovCi0gICAgaWYoKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpICAgfHwKLSAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgICAgPT0gTFZNX1RSVUUpKQotICAgIHsKLSAgICAgICAgTFZNX1VJTlQxNiAgIE51bUNoYW5uZWxzID0gMTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEFzc3VtZSBNT05PIGZvcm1hdCAqLwotICAgICAgICBMVk1fRkxPQVQgICAgQWxwaGE7Ci0KLSAgICAgICAgQWxwaGEgPSBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0ZFRURCQUNLTUlYRVJfVEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bUNoYW5uZWxzKTsKLSAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMF0uQWxwaGEgPSBBbHBoYTsKLSAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMV0uQWxwaGEgPSBBbHBoYTsKLSAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMl0uQWxwaGEgPSBBbHBoYTsKLSAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbM10uQWxwaGEgPSBBbHBoYTsKLQotICAgICAgICBOdW1DaGFubmVscyA9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQWx3YXlzIHN0ZXJlbyBvdXRwdXQgKi8KLSAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkFscGhhMSA9IExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZSRVZfQllQQVNTTUlYRVJfVEMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpLCBOdW1DaGFubmVscyk7Ci0gICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTIgPSBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQWxwaGExOwotICAgICAgICBwUHJpdmF0ZS0+R2Fpbk1peGVyLkFscGhhICAgID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLkFscGhhMTsKLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogVXBkYXRlIHRoZSBieXBhc3MgbWl4ZXIgdGFyZ2V0cwotICAgICAqLwotICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MZXZlbCkgJiYKLSAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikpCi0gICAgewotICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MiA9IChMVk1fRkxPQVQpKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgKSAvIDEwMC4wZjsKLSAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDEgPSAweDAwMDAwMDAwOwotICAgICAgICBpZiAoKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgPT0gMCkgJiYgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9GQUxTRSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fVFJVRTsKLSAgICAgICAgfQotICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBwUHJpdmF0ZS0+YkRpc2FibGVSZXZlcmIgPSBMVk1fRkFMU0U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuT3BlcmF0aW5nTW9kZSkKLSAgICB7Ci0gICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikKLSAgICAgICAgewotICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgPSAoTFZNX0ZMT0FUKShwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsICkgLyAxMDAuMGY7Ci0gICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MSA9IDB4MDAwMDAwMDA7Ci0KLSAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fRkFMU0U7Ci0gICAgICAgICAgICBPcGVyYXRpbmdNb2RlICAgICAgICAgICAgICAgICAgICAgID0gTFZNX01PREVfT047Ci0gICAgICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQcml2YXRlLT5iRGlzYWJsZVJldmVyYiA9IExWTV9UUlVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBQcml2YXRlLT5iRGlzYWJsZVJldmVyYiA9IExWTV9GQUxTRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fRkFMU0UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gMHgwMDAwMDAwMDsKLSAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQxID0gMHgwMDAwMDAwMDsKLSAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fVFJVRTsKLSAgICAgICAgICAgIHBQcml2YXRlLT5HYWluTWl4ZXIuVGFyZ2V0ICAgID0gMC4wMzEyNWY7Ci0gICAgICAgICAgICBPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT047Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT0ZGOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICAvKiAgSWYgaXQgaXMgdGhlIGZpcnN0IGNhbGwgdG8gQXBwbHlOZXcgc2V0dGluZ3MgZm9yY2UgdGhlIGN1cnJlbnQgdG8gdGhlIHRhcmdldCBcCi0gICAgICAgIHRvIGJlZ2luIGltbWVkaWF0ZSBwbGF5YmFjayBvZiB0aGUgZWZmZWN0ICovCi0gICAgaWYocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpCi0gICAgewotICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ3VycmVudDEgPSBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MTsKLSAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkN1cnJlbnQyID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDI7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqIENvcHkgdGhlIG5ldyBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMgPSBwUHJpdmF0ZS0+TmV3UGFyYW1zOwotICAgIHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBPcGVyYXRpbmdNb2RlOwotCi0KLSAgICAvKgotICAgICAqIFVwZGF0ZSBmbGFnCi0gICAgICovCi0gICAgaWYocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpCi0gICAgewotICAgICAgICBwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9IExWTV9GQUxTRTsKLSAgICB9Ci0KLQotICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOwotfQotI2VuZGlmIC8qQlVJTERfRkxPQVQqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBCeXBhc3NNaXhlcl9DYWxsYmFjayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb250cm9scyB0aGUgT24gdG8gT2ZmIG9wZXJhdGluZyBtb2RlIHRyYW5zaXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwUHJpdmF0ZSAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBwcml2YXRlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlJFVl9TdWNjZXNzICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUkVWX05VTExBRERSRVNTICAgICAgIFdoZW4gcFByaXZhdGUgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWTV9JTlQzMiBCeXBhc3NNaXhlcl9DYWxsYmFjayAodm9pZCAqcENhbGxiYWNrRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcEdlbmVyYWxQdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgR2VuZXJhbFB1cnBvc2UgKQotewotCi0gICAgTFZSRVZfSW5zdGFuY2Vfc3QgICAgICpwTFZSRVZfUHJpdmF0ZSA9IChMVlJFVl9JbnN0YW5jZV9zdCAqKXBDYWxsYmFja0RhdGE7Ci0KLQotICAgIC8qCi0gICAgICogQXZvaWQgYnVpbGQgd2FybmluZ3MKLSAgICAgKi8KLSAgICAodm9pZClwR2VuZXJhbFB1cnBvc2U7Ci0gICAgKHZvaWQpR2VuZXJhbFB1cnBvc2U7Ci0KLQotICAgIC8qCi0gICAgICogVHVybiBvZmYKLSAgICAgKi8KLSAgICBwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT0ZGOwotICAgIHBMVlJFVl9Qcml2YXRlLT5iRGlzYWJsZVJldmVyYiAgICAgICAgICAgICAgPSBMVk1fVFJVRTsKLSAgICBMVlJFVl9DbGVhckF1ZGlvQnVmZmVycygoTFZSRVZfSGFuZGxlX3QpcENhbGxiYWNrRGF0YSk7Ci0KLQotICAgIHJldHVybiAwOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0FwcGx5TmV3U2V0dGluZ3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmMGQzOWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9BcHBseU5ld1NldHRpbmdzLmNwcApAQCAtMCwwICsxLDYzMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJMVlJFVl9Qcml2YXRlLmgiCisjaW5jbHVkZSAiRmlsdGVyLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZSRVZfQXBwbHlOZXdTZXR0aW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQXBwbGllcyB0aGUgbmV3IGNvbnRyb2wgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFByaXZhdGUgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgcHJpdmF0ZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfU3VjY2VzcyAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIHBQcml2YXRlIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9BcHBseU5ld1NldHRpbmdzIChMVlJFVl9JbnN0YW5jZV9zdCAgICAgKnBQcml2YXRlKQoreworCisgICAgTFZNX01vZGVfZW4gIE9wZXJhdGluZ01vZGU7CisgICAgTFZNX0lOVDMyICAgIE51bWJlck9mRGVsYXlMaW5lczsKKworICAgIC8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXIgKi8KKyAgICBpZihwUHJpdmF0ZSA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICBPcGVyYXRpbmdNb2RlID0gcFByaXZhdGUtPk5ld1BhcmFtcy5PcGVyYXRpbmdNb2RlOworCisgICAgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCisgICAgeworICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSA0OworICAgIH0KKyAgICBlbHNlIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKQorICAgIHsKKyAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gMjsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gMTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgaGlnaCBwYXNzIGZpbHRlciBjb2VmZmljaWVudHMKKyAgICAgKi8KKyAgICBpZigocFByaXZhdGUtPk5ld1BhcmFtcy5IUEYgICAgICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkhQRikgICAgICAgIHx8CisgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5TYW1wbGVSYXRlKSB8fAorICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgPT0gTFZNX1RSVUUpKQorICAgIHsKKyAgICAgICAgTFZNX0ZMT0FUICAgICAgIE9tZWdhOworICAgICAgICBGT19GTE9BVF9Db2Vmc190ICBDb2VmZnM7CisKKyAgICAgICAgT21lZ2EgPSBMVk1fR2V0T21lZ2EocFByaXZhdGUtPk5ld1BhcmFtcy5IUEYsIHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7CisgICAgICAgIExWTV9GT19IUEYoT21lZ2EsICZDb2VmZnMpOworICAgICAgICBGT18xSV9EMzJGMzJDbGxfVFJDX1dSQV8wMV9Jbml0KCAmcFByaXZhdGUtPnBGYXN0Q29lZi0+SFBDb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRmFzdERhdGEtPkhQVGFwcywgJkNvZWZmcyk7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLAorICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcFByaXZhdGUtPnBGYXN0RGF0YS0+SFBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjFfRkxPQVRfVGFwc190KSAvIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgbG93IHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cworICAgICAqLworICAgIGlmKChwUHJpdmF0ZS0+TmV3UGFyYW1zLkxQRiAgICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuTFBGKSAgICAgICAgfHwKKyAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworICAgICAgICBMVk1fRkxPQVQgICAgICAgT21lZ2E7CisgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgIENvZWZmczsKKworICAgICAgICBDb2VmZnMuQTAgPSAxOworICAgICAgICBDb2VmZnMuQTEgPSAwOworICAgICAgICBDb2VmZnMuQjEgPSAwOworICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLkxQRiA8PSAoTFZNX0ZzVGFibGVbcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlXSA+PiAxKSkKKyAgICAgICAgeworICAgICAgICAgICAgT21lZ2EgPSBMVk1fR2V0T21lZ2EocFByaXZhdGUtPk5ld1BhcmFtcy5MUEYsIHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSk7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBEbyBub3QgYXBwbHkgZmlsdGVyIGlmIHcgPTIqcGkqZmMvZnMgPj0gMi45CisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmKE9tZWdhIDw9IChMVk1fRkxPQVQpTFZSRVZfMl85X0lOUTI5KQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExWTV9GT19MUEYoT21lZ2EsICZDb2VmZnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZPXzFJX0QzMkYzMkNsbF9UUkNfV1JBXzAxX0luaXQoICZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5MUENvZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBGYXN0RGF0YS0+TFBUYXBzLCAmQ29lZmZzKTsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsCisgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKSZwUHJpdmF0ZS0+cEZhc3REYXRhLT5MUFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QpIC8gc2l6ZW9mKExWTV9GTE9BVCkpOworICAgIH0KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSByb29tIHNpemUgcGFyYW1ldGVyCisgICAgICovCisgICAgaWYoIHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpCisgICAgeworICAgICAgICAvKiBSb29tIHNpemUgcmFuZ2UgaXMgMTBtcyB0byAyMDBtcworICAgICAgICAgKiAwJSAgIC0tIDEwbXMKKyAgICAgICAgICogNTAlICAtLSA2NW1zCisgICAgICAgICAqIDEwMCUgLS0gMTIwbXMKKyAgICAgICAgICovCisgICAgICAgIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMgPSAxMCArICgoKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUqMTEpICsgNSkgLyAxMCk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIFQgZGVsYXkgbnVtYmVyIG9mIHNhbXBsZXMgYW5kIHRoZSBhbGwgcGFzcyBkZWxheSBudW1iZXIgb2Ygc2FtcGxlcworICAgICAqLworICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSAgIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworCisgICAgICAgIExWTV9VSU5UMzIgIFRlbXA7CisgICAgICAgIExWTV9JTlQzMiAgIEFQRGVsYXlTaXplOworICAgICAgICBMVk1fSU5UMzIgICBGcyA9IExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpOworICAgICAgICBMVk1fVUlOVDMyICBEZWxheUxlbmd0aFNhbXBsZXMgPSAoTFZNX1VJTlQzMikoRnMgKiBwUHJpdmF0ZS0+Um9vbVNpemVJbm1zKTsKKyAgICAgICAgTFZNX0lOVDE2ICAgaTsKKyAgICAgICAgTFZNX0ZMT0FUICAgU2NhbGVUYWJsZVtdICA9IHtMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQsIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCwgTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80fTsKKyAgICAgICAgTFZNX0lOVDE2ICAgTWF4VF9EZWxheVtdICA9IHtMVlJFVl9NQVhfVDBfREVMQVksIExWUkVWX01BWF9UMV9ERUxBWSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX01BWF9UMl9ERUxBWSwgTFZSRVZfTUFYX1QzX0RFTEFZfTsKKyAgICAgICAgTFZNX0lOVDE2ICAgTWF4QVBfRGVsYXlbXSA9IHtMVlJFVl9NQVhfQVAwX0RFTEFZLCBMVlJFVl9NQVhfQVAxX0RFTEFZLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTUFYX0FQMl9ERUxBWSwgTFZSRVZfTUFYX0FQM19ERUxBWX07CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRm9yIGVhY2ggZGVsYXkgbGluZQorICAgICAgICAgKi8KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IE51bWJlck9mRGVsYXlMaW5lczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoaSAhPSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIExWTV9GTE9BVCBUZW1wMTsgIC8qIHRvIGF2b2lkIFFBQyB3YXJuaW5nIG9uIHR5cGUgY29udmVyc2lvbiAqLworCisgICAgICAgICAgICAgICAgVGVtcDE9KExWTV9GTE9BVClEZWxheUxlbmd0aFNhbXBsZXM7CisgICAgICAgICAgICAgICAgVGVtcCA9IChMVk1fVUlOVDMyKShUZW1wMSAqIFNjYWxlVGFibGVbaV0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgVGVtcCA9IERlbGF5TGVuZ3RoU2FtcGxlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFQRGVsYXlTaXplID0gVGVtcCAgLyAxNTAwOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogU2V0IHRoZSBmaXhlZCBkZWxheQorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIFRlbXAgID0gKE1heFRfRGVsYXlbaV0gLSBNYXhBUF9EZWxheVtpXSkgKiBGcyAvIDE5MjAwMDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5EZWxheV9BUFtpXSA9IHBQcml2YXRlLT5UW2ldIC0gVGVtcDsKKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFNldCB0aGUgdGFwIHNlbGVjdGlvbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpZiAocFByaXZhdGUtPkFCX1NlbGVjdGlvbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTbW9vdGggZnJvbSB0YXAgQSB0byB0YXAgQiAqLworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QltpXSAgICAgICAgICAgICA9ICZwUHJpdmF0ZS0+cERlbGF5X1RbaV1bcFByaXZhdGUtPlRbaV0gLSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wIC0gQVBEZWxheVNpemVdOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5CX0RlbGF5U2l6ZVtpXSAgICAgICAgICA9IEFQRGVsYXlTaXplOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MSA9IDA7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQyID0gMS4wZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBTbW9vdGggZnJvbSB0YXAgQiB0byB0YXAgQSAqLworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QVtpXSAgICAgICAgICAgICA9ICZwUHJpdmF0ZS0+cERlbGF5X1RbaV1bcFByaXZhdGUtPlRbaV0gLSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZW1wIC0gQVBEZWxheVNpemVdOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5BX0RlbGF5U2l6ZVtpXSAgICAgICAgICA9IEFQRGVsYXlTaXplOworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MiA9IDA7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQxID0gMS4wZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIFNldCB0aGUgbWF4aW11bSBibG9jayBzaXplIHRvIHRoZSBzbWFsbGVzdCBkZWxheSBzaXplCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIHBQcml2YXRlLT5NYXhCbGtMZW4gICA9IFRlbXA7CisgICAgICAgICAgICBpZiAocFByaXZhdGUtPk1heEJsa0xlbiA+IHBQcml2YXRlLT5BX0RlbGF5U2l6ZVtpXSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gcFByaXZhdGUtPkFfRGVsYXlTaXplW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBQcml2YXRlLT5NYXhCbGtMZW4gPiBwUHJpdmF0ZS0+Ql9EZWxheVNpemVbaV0pCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcFByaXZhdGUtPk1heEJsa0xlbiA9IHBQcml2YXRlLT5CX0RlbGF5U2l6ZVtpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocFByaXZhdGUtPkFCX1NlbGVjdGlvbikKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPkFCX1NlbGVjdGlvbiA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QUJfU2VsZWN0aW9uID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIExpbWl0IHRoZSBtYXhpbXVtIGJsb2NrIGxlbmd0aAorICAgICAgICAgKi8KKyAgICAgICAgLyogSnVzdCBhcyBhIHByZWNhdXNpb24sIGJ1dCBubyBwcm9ibGVtIGlmIHdlIHJlbW92ZSB0aGlzIGxpbmUgICAgICAqLworICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gcFByaXZhdGUtPk1heEJsa0xlbiAtIDI7CisgICAgICAgIGlmKHBQcml2YXRlLT5NYXhCbGtMZW4gPiBwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTWF4QmxvY2tTaXplKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWF4QmxrTGVuID0gKExWTV9JTlQzMilwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTWF4QmxvY2tTaXplOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBVcGRhdGUgdGhlIGxvdyBwYXNzIGZpbHRlciBjb2VmZmljaWVudAorICAgICAqLworICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5EYW1waW5nICAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkRhbXBpbmcpICAgIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworCisgICAgICAgIExWTV9JTlQzMiAgICAgICBUZW1wOworICAgICAgICBMVk1fRkxPQVQgICAgICAgT21lZ2E7CisgICAgICAgIEZPX0ZMT0FUX0NvZWZzX3QgIENvZWZmczsKKyAgICAgICAgTFZNX0lOVDE2ICAgICAgIGk7CisgICAgICAgIExWTV9JTlQxNiAgICAgICBEYW1waW5nICAgICAgPSAoTFZNX0lOVDE2KSgocFByaXZhdGUtPk5ld1BhcmFtcy5EYW1waW5nICogMTAwKSArIDEwMDApOworICAgICAgICBMVk1fRkxPQVQgICAgICAgU2NhbGVUYWJsZVtdID0ge0xWUkVWX1RfM19Qb3dlcl8wX29uXzQsIExWUkVWX1RfM19Qb3dlcl8xX29uXzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfVF8zX1Bvd2VyXzJfb25fNCwgTFZSRVZfVF8zX1Bvd2VyXzNfb25fNH07CisKKyAgICAgICAgLyoKKyAgICAgICAgICogRm9yIGVhY2ggZmlsdGVyCisgICAgICAgICAqLworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChpICE9IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVtcCA9IChMVk1fSU5UMzIpKFNjYWxlVGFibGVbaV0gKiBEYW1waW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBUZW1wID0gRGFtcGluZzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKFRlbXAgPD0gKExWTV9JTlQzMikoTFZNX0ZzVGFibGVbcFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlXSA+PiAxKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBPbWVnYSA9IExWTV9HZXRPbWVnYShUZW1wLCBwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgIExWTV9GT19MUEYoT21lZ2EsICZDb2VmZnMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvZWZmcy5BMCA9IDE7CisgICAgICAgICAgICAgICAgQ29lZmZzLkExID0gMDsKKyAgICAgICAgICAgICAgICBDb2VmZnMuQjEgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgRk9fMUlfRDMyRjMyQ2xsX1RSQ19XUkFfMDFfSW5pdCgmcFByaXZhdGUtPnBGYXN0Q29lZi0+UmV2TFBDb2Vmc1tpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1tpXSwgJkNvZWZmcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSBBbGwtcGFzcyBmaWx0ZXIgbWl4ZXIgdGltZSBjb25zdGFudHMKKyAgICAgKi8KKyAgICBpZiggKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5Sb29tU2l6ZSkgICB8fAorICAgICAgICAocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLkRlbnNpdHkgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuRGVuc2l0eSkpCisgICAgeworICAgICAgICBMVk1fSU5UMTYgICBpOworICAgICAgICBMVk1fRkxPQVQgICBBbHBoYTsKKyAgICAgICAgTFZNX0ZMT0FUICAgQWxwaGFUYXA7CisKKyAgICAgICAgQWxwaGEgPSBMVk1fTWl4ZXJfVGltZUNvbnN0YW50KExWUkVWX0FMTFBBU1NfVEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fR2V0RnNGcm9tVGFibGUocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEpOworCisgICAgICAgIEFscGhhVGFwID0gTFZNX01peGVyX1RpbWVDb25zdGFudChMVlJFVl9BTExQQVNTX1RBUF9UQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSk7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5BbHBoYTEgICAgICAgPSBBbHBoYVRhcDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQWxwaGEyICAgICAgID0gQWxwaGFUYXA7CisgICAgICAgICAgICBwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5BbHBoYSAgICA9IEFscGhhOworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQWxwaGEgPSBBbHBoYTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBmZWVkIGJhY2sgZ2FpbgorICAgICAqLworICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5Sb29tU2l6ZSAgICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlJvb21TaXplKSAgIHx8CisgICAgICAgIChwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgfHwKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwICAgICAgICAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5UNjApICAgICAgICB8fAorICAgICAgICAocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgICAgICAgID09IExWTV9UUlVFKSkKKyAgICB7CisKKyAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgR1s0XTsgICAgICAgICAgICAgICAgICAgICAgIC8qIEZlZWRiYWNrIGdhaW4gKFE3LjI0KSAqLworCisgICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwID09IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIEdbM10gPSAwOworICAgICAgICAgICAgR1syXSA9IDA7CisgICAgICAgICAgICBHWzFdID0gMDsKKyAgICAgICAgICAgIEdbMF0gPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTFZNX0ZMT0FUICAgVGVtcDE7CisgICAgICAgICAgICBMVk1fRkxPQVQgICBUZW1wMjsKKyAgICAgICAgICAgIExWTV9JTlQxNiAgIGk7CisgICAgICAgICAgICBMVk1fRkxPQVQgICBTY2FsZVRhYmxlW10gPSB7TFZSRVZfVF8zX1Bvd2VyX21pbnVzMF9vbl80LCBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80LCBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzR9OworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogRm9yIGVhY2ggZGVsYXkgbGluZQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgVGVtcDEgPSAoMyAqIHBQcml2YXRlLT5Sb29tU2l6ZUlubXMgKiBTY2FsZVRhYmxlW2ldKSAvIHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwOworICAgICAgICAgICAgICAgIGlmKFRlbXAxID49ICg0KSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdbaV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKChUZW1wMSA+PSAoMikpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVGVtcDIgPSBMVk1fUG93ZXIxMCgtKFRlbXAxIC8gMi4wZikpOworICAgICAgICAgICAgICAgICAgICBUZW1wMSA9IExWTV9Qb3dlcjEwKC0oVGVtcDEgLyAyLjBmKSk7CisgICAgICAgICAgICAgICAgICAgIFRlbXAxID0gVGVtcDEgKiBUZW1wMjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgVGVtcDEgPSBMVk1fUG93ZXIxMCgtKFRlbXAxKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChOdW1iZXJPZkRlbGF5TGluZXMgPT0gMSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdbaV0gPSBUZW1wMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgVGVtcEc7CisgICAgICAgICAgICAgICAgICAgIFRlbXBHID0gVGVtcDEgKiBPTkVfT1ZFUl9TUVJUX1RXTzsKKyAgICAgICAgICAgICAgICAgICAgR1tpXT1UZW1wRzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBTZXQgdXAgdGhlIGZlZWRiYWNrIG1peGVycyBmb3IgZm91ciBkZWxheSBsaW5lcyAqLworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclswXS5UYXJnZXQ9R1swXTsKKyAgICAgICAgcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbMV0uVGFyZ2V0PUdbMV07CisgICAgICAgIHBQcml2YXRlLT5GZWVkYmFja01peGVyWzJdLlRhcmdldD1HWzJdOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclszXS5UYXJnZXQ9R1szXTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0ZSB0aGUgZ2FpbiBjb3JyZWN0aW9uCisgICAgICovCisgICAgaWYoKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuUm9vbVNpemUpIHx8CisgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuTGV2ZWwpICAgIHx8CisgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuVDYwICAgICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuVDYwKSApCisgICAgeworICAgICAgICBMVk1fSU5UMzIgSW5kZXg9MDsKKyAgICAgICAgTFZNX0ZMT0FUIEluZGV4X0ZMT0FUOworICAgICAgICBMVk1fSU5UMzIgaT0wOworICAgICAgICBMVk1fRkxPQVQgR2Fpbj0wOworICAgICAgICBMVk1fSU5UMzIgUm9vbVNpemU9MDsKKyAgICAgICAgTFZNX0ZMT0FUIFQ2MDsKKyAgICAgICAgTFZNX0ZMT0FUIENvZWZzWzVdOworCisgICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemUgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgUm9vbVNpemUgPSAxOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgUm9vbVNpemUgPSAoTFZNX0lOVDMyKXBQcml2YXRlLT5OZXdQYXJhbXMuUm9vbVNpemU7CisgICAgICAgIH0KKworICAgICAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLlQ2MCA8IDEwMCkKKyAgICAgICAgeworICAgICAgICAgICAgVDYwID0gMTAwICogTFZSRVZfVDYwX1NDQUxFOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgVDYwID0gcFByaXZhdGUtPk5ld1BhcmFtcy5UNjAgKiBMVlJFVl9UNjBfU0NBTEU7CisgICAgICAgIH0KKworICAgICAgICAvKiBGaW5kIHRoZSBuZWFyZXN0IHJvb20gc2l6ZSBpbiB0YWJsZSAqLworICAgICAgICBmb3IoaSA9IDA7IGkgPCAyNDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBpZihSb29tU2l6ZSA8PSBMVlJFVl9HYWluUG9seVRhYmxlW2ldWzBdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEluZGV4ID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKFJvb21TaXplID09IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdWzBdKQorICAgICAgICB7CisgICAgICAgICAgICAvKiBUYWtlIHRhYmxlIHZhbHVlcyBpZiB0aGUgcm9vbSBzaXplIGlzIGluIHRhYmxlICovCisgICAgICAgICAgICBmb3IoaSA9IDE7IGkgPCA1OyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQ29lZnNbaS0xXSA9IExWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXhdW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29lZnNbNF0gPSAwOworICAgICAgICAgICAgR2FpbiA9IExWTV9Qb2x5bm9taWFsKDMsIENvZWZzLCBUNjApOyAgICAgICAvKiBRLjI0IHJlc3VsdCAqLworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgLyogSW50ZXJwb2xhdGUgdGhlIGdhaW4gYmV0d2VlbiBuZWFyZXN0IHJvb20gc2l6ZXMgKi8KKworICAgICAgICAgICAgTFZNX0ZMT0FUIEdhaW4xLEdhaW4yOworICAgICAgICAgICAgTFZNX0lOVDMyIFRvdF9EaXN0LERpc3Q7CisKKyAgICAgICAgICAgIFRvdF9EaXN0ID0gKExWTV9VSU5UMzIpTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1bMF0gLSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDMyKUxWUkVWX0dhaW5Qb2x5VGFibGVbSW5kZXgtMV1bMF07CisgICAgICAgICAgICBEaXN0ID0gUm9vbVNpemUgLSAoTFZNX1VJTlQzMilMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4IC0gMV1bMF07CisKKyAgICAgICAgICAgIC8qIEdldCBnYWluIGZvciBmaXJzdCAqLworICAgICAgICAgICAgZm9yKGkgPSAxOyBpIDwgNTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIENvZWZzW2ktMV0gPSBMVlJFVl9HYWluUG9seVRhYmxlW0luZGV4LTFdW2ldOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQ29lZnNbNF0gPSAwOworCisgICAgICAgICAgICBHYWluMSA9IExWTV9Qb2x5bm9taWFsKDMsIENvZWZzLCBUNjApOyAgICAgIC8qIFEuMjQgcmVzdWx0ICovCisKKyAgICAgICAgICAgIC8qIEdldCBnYWluIGZvciBzZWNvbmQgKi8KKyAgICAgICAgICAgIGZvcihpID0gMTsgaSA8IDU7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBDb2Vmc1tpLTFdID0gTFZSRVZfR2FpblBvbHlUYWJsZVtJbmRleF1baV07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBDb2Vmc1s0XSA9IDA7CisKKyAgICAgICAgICAgIEdhaW4yID0gTFZNX1BvbHlub21pYWwoMywgQ29lZnMsIFQ2MCk7ICAgICAgLyogUS4yNCByZXN1bHQgKi8KKworICAgICAgICAgICAgLyogTGluZWFyIEludGVycG9sYXRlIHRoZSBnYWluICovCisgICAgICAgICAgICBHYWluID0gR2FpbjEgKyAoKChHYWluMiAtIEdhaW4xKSAqIERpc3QpIC8gKFRvdF9EaXN0KSk7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIGludmVyc2Ugb2YgZ2FpbjogUS4xNQorICAgICAgICAgKiBHYWluIGlzIG1vc3RseSBhYm92ZSBvbmUgZXhjZXB0IGZldyBjYXNlcywgdGFrZSBvbmx5IGdhaW5zIGFib3ZlIDEKKyAgICAgICAgICovCisgICAgICAgIGlmKEdhaW4gPCAxKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+R2FpbiA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+R2FpbiA9IDEgLyBHYWluOworICAgICAgICB9CisKKyAgICAgICAgSW5kZXhfRkxPQVQgPSAxMDAuMGYgLyAoTFZNX0ZMT0FUKSgxMDAgKyBwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsKTsKKyAgICAgICAgcFByaXZhdGUtPkdhaW4gPSBwUHJpdmF0ZS0+R2FpbiAqIEluZGV4X0ZMT0FUOworICAgICAgICBwUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCA9IChwUHJpdmF0ZS0+R2FpbipJbmRleF9GTE9BVCkgLyAyOworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBhbGwgcGFzcyBjb21iIGZpbHRlciBjb2VmZmljaWVudAorICAgICAqLworICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5EZW5zaXR5ICE9IHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLkRlbnNpdHkpIHx8CisgICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgPT0gTFZNX1RSVUUpKQorICAgIHsKKyAgICAgICAgTFZNX0lOVDE2ICAgaTsKKyAgICAgICAgTFZNX0ZMT0FUICAgYiA9IChMVk1fRkxPQVQpcFByaXZhdGUtPk5ld1BhcmFtcy5EZW5zaXR5ICogTFZSRVZfQl84X29uXzEwMDA7CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0uVGFyZ2V0ICAgID0gYjsKKyAgICAgICAgICAgIHBQcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLlRhcmdldCA9IGI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgYnlwYXNzIG1peGVyIHRpbWUgY29uc3RhbnQKKyAgICAgKi8KKyAgICBpZigocFByaXZhdGUtPk5ld1BhcmFtcy5TYW1wbGVSYXRlICAgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU2FtcGxlUmF0ZSkgICB8fAorICAgICAgIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCAgICAgICAgICA9PSBMVk1fVFJVRSkpCisgICAgeworICAgICAgICBMVk1fVUlOVDE2ICAgTnVtQ2hhbm5lbHMgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgLyogQXNzdW1lIE1PTk8gZm9ybWF0ICovCisgICAgICAgIExWTV9GTE9BVCAgICBBbHBoYTsKKworICAgICAgICBBbHBoYSA9IExWTV9NaXhlcl9UaW1lQ29uc3RhbnQoTFZSRVZfRkVFREJBQ0tNSVhFUl9UQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9HZXRGc0Zyb21UYWJsZShwUHJpdmF0ZS0+TmV3UGFyYW1zLlNhbXBsZVJhdGUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtQ2hhbm5lbHMpOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclswXS5BbHBoYSA9IEFscGhhOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclsxXS5BbHBoYSA9IEFscGhhOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclsyXS5BbHBoYSA9IEFscGhhOworICAgICAgICBwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlclszXS5BbHBoYSA9IEFscGhhOworCisgICAgICAgIE51bUNoYW5uZWxzID0gMjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBbHdheXMgc3RlcmVvIG91dHB1dCAqLworICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQWxwaGExID0gTFZNX01peGVyX1RpbWVDb25zdGFudChMVlJFVl9CWVBBU1NNSVhFUl9UQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0dldEZzRnJvbVRhYmxlKHBQcml2YXRlLT5OZXdQYXJhbXMuU2FtcGxlUmF0ZSksIE51bUNoYW5uZWxzKTsKKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkFscGhhMiA9IHBQcml2YXRlLT5CeXBhc3NNaXhlci5BbHBoYTE7CisgICAgICAgIHBQcml2YXRlLT5HYWluTWl4ZXIuQWxwaGEgICAgPSBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQWxwaGExOworICAgIH0KKworICAgIC8qCisgICAgICogVXBkYXRlIHRoZSBieXBhc3MgbWl4ZXIgdGFyZ2V0cworICAgICAqLworICAgIGlmKCAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAhPSBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5MZXZlbCkgJiYKKyAgICAgICAgKHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikpCisgICAgeworICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MiA9IChMVk1fRkxPQVQpKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgKSAvIDEwMC4wZjsKKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDEgPSAweDAwMDAwMDAwOworICAgICAgICBpZiAoKHBQcml2YXRlLT5OZXdQYXJhbXMuTGV2ZWwgPT0gMCkgJiYgKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9GQUxTRSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fVFJVRTsKKyAgICAgICAgfQorICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCAhPSAwKQorICAgICAgICB7CisgICAgICAgICAgICBwUHJpdmF0ZS0+YkRpc2FibGVSZXZlcmIgPSBMVk1fRkFMU0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZihwUHJpdmF0ZS0+TmV3UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuT3BlcmF0aW5nTW9kZSkKKyAgICB7CisgICAgICAgIGlmKHBQcml2YXRlLT5OZXdQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PTikKKyAgICAgICAgeworICAgICAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgPSAoTFZNX0ZMT0FUKShwUHJpdmF0ZS0+TmV3UGFyYW1zLkxldmVsICkgLyAxMDAuMGY7CisgICAgICAgICAgICBwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MSA9IDB4MDAwMDAwMDA7CisKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fRkFMU0U7CisgICAgICAgICAgICBPcGVyYXRpbmdNb2RlICAgICAgICAgICAgICAgICAgICAgID0gTFZNX01PREVfT047CisgICAgICAgICAgICBpZiAocFByaXZhdGUtPk5ld1BhcmFtcy5MZXZlbCA9PSAwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5iRGlzYWJsZVJldmVyYiA9IExWTV9UUlVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBQcml2YXRlLT5iRGlzYWJsZVJldmVyYiA9IExWTV9GQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9PSBMVk1fRkFMU0UpCisgICAgICAgIHsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyID0gMHgwMDAwMDAwMDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQxID0gMHgwMDAwMDAwMDsKKyAgICAgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgPSBMVk1fVFJVRTsKKyAgICAgICAgICAgIHBQcml2YXRlLT5HYWluTWl4ZXIuVGFyZ2V0ICAgID0gMC4wMzEyNWY7CisgICAgICAgICAgICBPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT047CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBPcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT0ZGOworICAgICAgICB9CisgICAgfQorCisgICAgLyogIElmIGl0IGlzIHRoZSBmaXJzdCBjYWxsIHRvIEFwcGx5TmV3IHNldHRpbmdzIGZvcmNlIHRoZSBjdXJyZW50IHRvIHRoZSB0YXJnZXQgXAorICAgICAgICB0byBiZWdpbiBpbW1lZGlhdGUgcGxheWJhY2sgb2YgdGhlIGVmZmVjdCAqLworICAgIGlmKHBQcml2YXRlLT5iRmlyc3RDb250cm9sID09IExWTV9UUlVFKQorICAgIHsKKyAgICAgICAgcFByaXZhdGUtPkJ5cGFzc01peGVyLkN1cnJlbnQxID0gcFByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDE7CisgICAgICAgIHBQcml2YXRlLT5CeXBhc3NNaXhlci5DdXJyZW50MiA9IHBQcml2YXRlLT5CeXBhc3NNaXhlci5UYXJnZXQyOworICAgIH0KKworICAgIC8qCisgICAgICogQ29weSB0aGUgbmV3IHBhcmFtZXRlcnMKKyAgICAgKi8KKyAgICBwUHJpdmF0ZS0+Q3VycmVudFBhcmFtcyA9IHBQcml2YXRlLT5OZXdQYXJhbXM7CisgICAgcFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuT3BlcmF0aW5nTW9kZSA9IE9wZXJhdGluZ01vZGU7CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSBmbGFnCisgICAgICovCisgICAgaWYocFByaXZhdGUtPmJGaXJzdENvbnRyb2wgPT0gTFZNX1RSVUUpCisgICAgeworICAgICAgICBwUHJpdmF0ZS0+YkZpcnN0Q29udHJvbCA9IExWTV9GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgQnlwYXNzTWl4ZXJfQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29udHJvbHMgdGhlIE9uIHRvIE9mZiBvcGVyYXRpbmcgbW9kZSB0cmFuc2l0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFByaXZhdGUgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgcHJpdmF0ZSBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfU3VjY2VzcyAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIHBQcml2YXRlIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVk1fSU5UMzIgQnlwYXNzTWl4ZXJfQ2FsbGJhY2sgKHZvaWQgKnBDYWxsYmFja0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2IEdlbmVyYWxQdXJwb3NlICkKK3sKKworICAgIExWUkVWX0luc3RhbmNlX3N0ICAgICAqcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QgKilwQ2FsbGJhY2tEYXRhOworCisgICAgLyoKKyAgICAgKiBBdm9pZCBidWlsZCB3YXJuaW5ncworICAgICAqLworICAgICh2b2lkKXBHZW5lcmFsUHVycG9zZTsKKyAgICAodm9pZClHZW5lcmFsUHVycG9zZTsKKworICAgIC8qCisgICAgICogVHVybiBvZmYKKyAgICAgKi8KKyAgICBwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZNX01PREVfT0ZGOworICAgIHBMVlJFVl9Qcml2YXRlLT5iRGlzYWJsZVJldmVyYiAgICAgICAgICAgICAgPSBMVk1fVFJVRTsKKyAgICBMVlJFVl9DbGVhckF1ZGlvQnVmZmVycygoTFZSRVZfSGFuZGxlX3QpcENhbGxiYWNrRGF0YSk7CisKKyAgICByZXR1cm4gMDsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0NsZWFyQXVkaW9CdWZmZXJzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0OTEwMTYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMuYworKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgIkxWUkVWX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlJFVl9DbGVhckF1ZGlvQnVmZmVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY2xlYXIgdGhlIGludGVybmFsIGF1ZGlvIGJ1ZmZlcnMgb2YgdGhlIG1vZHVsZS4gICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlJFVl9TVUNDRVNTICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUkVWX05VTExBRERSRVNTICAgICAgSW5zdGFuY2UgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWTV9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0NsZWFyQXVkaW9CdWZmZXJzKExWUkVWX0hhbmRsZV90ICBoSW5zdGFuY2UpCi17Ci0KLSAgIExWUkVWX0luc3RhbmNlX3N0ICAgICAqcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QgKiloSW5zdGFuY2U7Ci0KLQotICAgIC8qCi0gICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKLSAgICAgKi8KLSAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLwotICAgIGlmKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENsZWFyIGFsbCBmaWx0ZXIgdGFwIGRhdGEsIGRlbGF5LWxpbmVzIGFuZCBvdGhlciBzaWduYWwgcmVsYXRlZCBkYXRhCi0gICAgICovCi0KLSNpZmRlZiBCVUlMRF9GTE9BVAotICAgIExvYWRDb25zdF9GbG9hdCgwLAotICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5IUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIGRlcmVmZXJlbmNpbmcgaW4gZnVuY3Rpb24qLwotICAgICAgICAgICAgICAgICAgICAyKTsKLSAgICBMb2FkQ29uc3RfRmxvYXQoMCwKLSAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+TFBUYXBzLCAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KLSAgICAgICAgICAgICAgICAgICAgMik7Ci0jZWxzZQotICAgIExvYWRDb25zdF8zMigwLAotICAgICAgICAodm9pZCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5IUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCi0gICAgICAgIDIpOwotICAgIExvYWRDb25zdF8zMigwLAotICAgICAgICAodm9pZCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5MUFRhcHMsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCi0gICAgICAgIDIpOwotI2VuZGlmCi0gICAgaWYoKExWTV9VSU5UMTYpcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCi0gICAgewotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbM10sIDIpOwotICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMl0sIDIpOwotICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMV0sIDIpOwotICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOwotCi0gICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFszXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDNfREVMQVkpOwotICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMl0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QyX0RFTEFZKTsKLSAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMV9ERUxBWSk7Ci0gICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOwotI2Vsc2UKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzNdLCAyKTsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzJdLCAyKTsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzFdLCAyKTsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIChMVk1fRkxPQVQgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzBdLCAyKTsKLQotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdLCBMVlJFVl9NQVhfVDNfREVMQVkpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzJdLCBMVlJFVl9NQVhfVDJfREVMQVkpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdLCBMVlJFVl9NQVhfVDFfREVMQVkpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCBMVlJFVl9NQVhfVDBfREVMQVkpOwotI2VuZGlmCi0gICAgfQotCi0gICAgaWYoKExWTV9VSU5UMTYpcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA+PSBMVlJFVl9ERUxBWUxJTkVTXzIpCi0gICAgewotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMV0sIDIpOwotICAgICAgICBMb2FkQ29uc3RfMzIoMCwgKExWTV9JTlQzMiAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOwotCi0gICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDFfREVMQVkpOwotICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QwX0RFTEFZKTsKLSNlbHNlCi0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1sxXSwgMik7Ci0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAoTFZNX0ZMT0FUICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPlJldkxQVGFwc1swXSwgMik7Ci0KLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSwgTFZSRVZfTUFYX1QxX0RFTEFZKTsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgTFZSRVZfTUFYX1QwX0RFTEFZKTsKLSNlbmRpZgotICAgIH0KLQotICAgIGlmKChMVk1fVUlOVDE2KXBMVlJFVl9Qcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPj0gTFZSRVZfREVMQVlMSU5FU18xKQotICAgIHsKLSNpZm5kZWYgQlVJTERfRkxPQVQKLSAgICAgICAgTG9hZENvbnN0XzMyKDAsIChMVk1fSU5UMzIgKikmcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YS0+UmV2TFBUYXBzWzBdLCAyKTsKLSAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7Ci0jZWxzZQotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCBMVlJFVl9NQVhfVDBfREVMQVkpOwotI2VuZGlmCi0gICAgfQotICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4NjUzOWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9DbGVhckF1ZGlvQnVmZmVycy5jcHAKQEAgLTAsMCArMSw5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNpbmNsdWRlICJMVlJFVl9Qcml2YXRlLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWUkVWX0NsZWFyQXVkaW9CdWZmZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBjbGVhciB0aGUgaW50ZXJuYWwgYXVkaW8gYnVmZmVycyBvZiB0aGUgbW9kdWxlLiAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX1NVQ0NFU1MgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICBJbnN0YW5jZSBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZNX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMoTFZSRVZfSGFuZGxlX3QgIGhJbnN0YW5jZSkKK3sKKworICAgTFZSRVZfSW5zdGFuY2Vfc3QgICAgICpwTFZSRVZfUHJpdmF0ZSA9IChMVlJFVl9JbnN0YW5jZV9zdCAqKWhJbnN0YW5jZTsKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKKyAgICAgKi8KKyAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLworICAgIGlmKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIENsZWFyIGFsbCBmaWx0ZXIgdGFwIGRhdGEsIGRlbGF5LWxpbmVzIGFuZCBvdGhlciBzaWduYWwgcmVsYXRlZCBkYXRhCisgICAgICovCisKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5IUFRhcHMsCisgICAgICAgIDIpOworICAgIExvYWRDb25zdF9GbG9hdCgwLAorICAgICAgICAoTFZNX0ZMT0FUICopJnBMVlJFVl9Qcml2YXRlLT5wRmFzdERhdGEtPkxQVGFwcywKKyAgICAgICAgMik7CisgICAgaWYoKExWTV9VSU5UMTYpcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCisgICAgeworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbM10sIDIpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMl0sIDIpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMV0sIDIpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOworCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbM10sIExWUkVWX01BWF9UM19ERUxBWSk7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMl0sIExWUkVWX01BWF9UMl9ERUxBWSk7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0sIExWUkVWX01BWF9UMV9ERUxBWSk7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIExWUkVWX01BWF9UMF9ERUxBWSk7CisgICAgfQorCisgICAgaWYoKExWTV9VSU5UMTYpcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA+PSBMVlJFVl9ERUxBWUxJTkVTXzIpCisgICAgeworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMV0sIDIpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOworCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0sIExWUkVWX01BWF9UMV9ERUxBWSk7CisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0sIExWUkVWX01BWF9UMF9ERUxBWSk7CisgICAgfQorCisgICAgaWYoKExWTV9VSU5UMTYpcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA+PSBMVlJFVl9ERUxBWUxJTkVTXzEpCisgICAgeworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgKExWTV9GTE9BVCAqKSZwTFZSRVZfUHJpdmF0ZS0+cEZhc3REYXRhLT5SZXZMUFRhcHNbMF0sIDIpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCBMVlJFVl9NQVhfVDBfREVMQVkpOworICAgIH0KKyAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2VlMjZkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2luY2x1ZGUgIkxWUkVWX1ByaXZhdGUuaCIKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJlcXVlc3QgdGhlIExWUkVWIG1vZHVsZSBjb250cm9sIHBhcmFtZXRlcnMuIFRoZSBjdXJyZW50IHBhcmFtZXRlciBzZXQgaXMgcmV0dXJuZWQgICovCi0vKiAgdmlhIHRoZSBwYXJhbWV0ZXIgcG9pbnRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwQ29udHJvbFBhcmFtcyAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlJFVl9TdWNjZXNzICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUkVWX05VTExBRERSRVNTICAgICAgIFdoZW4gaEluc3RhbmNlIG9yIHBDb250cm9sUGFyYW1zIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZSRVZfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzKExWUkVWX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICpwQ29udHJvbFBhcmFtcykKLXsKLQotICAgIExWUkVWX0luc3RhbmNlX3N0ICAqcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QgKiloSW5zdGFuY2U7Ci0KLQotICAgIC8qCi0gICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKLSAgICAgKi8KLSAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocENvbnRyb2xQYXJhbXMgPT0gTFZNX05VTEwpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIExWUkVWX05VTExBRERSRVNTOwotICAgIH0KLQotICAgIC8qCi0gICAgICogUmV0dXJuIHRoZSBjdXJyZW50IHBhcmFtZXRlcnMKLSAgICAgKi8KLSAgICAqcENvbnRyb2xQYXJhbXMgPSBwTFZSRVZfUHJpdmF0ZS0+TmV3UGFyYW1zOwotCi0gICAgcmV0dXJuIExWUkVWX1NVQ0NFU1M7Ci19Ci0KLS8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTBiMDE0MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldENvbnRyb2xQYXJhbWV0ZXJzLmNwcApAQCAtMCwwICsxLDY3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIkxWUkVWX1ByaXZhdGUuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXF1ZXN0IHRoZSBMVlJFViBtb2R1bGUgY29udHJvbCBwYXJhbWV0ZXJzLiBUaGUgY3VycmVudCBwYXJhbWV0ZXIgc2V0IGlzIHJldHVybmVkICAqLworLyogIHZpYSB0aGUgcGFyYW1ldGVyIHBvaW50ZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENvbnRyb2xQYXJhbXMgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfU3VjY2VzcyAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIGhJbnN0YW5jZSBvciBwQ29udHJvbFBhcmFtcyBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWUkVWX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUkVWX1JldHVyblN0YXR1c19lbiBMVlJFVl9HZXRDb250cm9sUGFyYW1ldGVycyhMVlJFVl9IYW5kbGVfdCAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUkVWX0NvbnRyb2xQYXJhbXNfc3QgICAqcENvbnRyb2xQYXJhbXMpCit7CisKKyAgICBMVlJFVl9JbnN0YW5jZV9zdCAgKnBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0ICopaEluc3RhbmNlOworCisgICAgLyoKKyAgICAgKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucworICAgICAqLworICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwQ29udHJvbFBhcmFtcyA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gTFZSRVZfTlVMTEFERFJFU1M7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBSZXR1cm4gdGhlIGN1cnJlbnQgcGFyYW1ldGVycworICAgICAqLworICAgICpwQ29udHJvbFBhcmFtcyA9IHBMVlJFVl9Qcml2YXRlLT5OZXdQYXJhbXM7CisKKyAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRJbnN0YW5jZUhhbmRsZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzY2YmNiLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmMKKysrIC9kZXYvbnVsbApAQCAtMSw0MTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJMVlJFVl9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiSW5zdEFsbG9jLmgiCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlJFVl9HZXRJbnN0YW5jZUhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgTFZSRVYgbW9kdWxlIGluc3RhbmNlLiBJdCByZXR1cm5zIHRoZSBjcmVhdGVkICAgICAqLwotLyogIGluc3RhbmNlIGhhbmRsZSB0aHJvdWdoIHBoSW5zdGFuY2UuIEFsbCBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCwgICAgICAgICovCi0vKiAgaW5hY3RpdmUgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBJbnN0YW5jZVBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUkVWX1NVQ0NFU1MgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICAgV2hlbiBwaEluc3RhbmNlIG9yIHBNZW1vcnlUYWJsZSBvciBwSW5zdGFuY2VQYXJhbXMgaXMgTlVMTCAgKi8KLS8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIG9uZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbnMgaGFzIGEgTlVMTCBwb2ludGVyICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUoTFZSRVZfSGFuZGxlX3QgICAgICAgICAgICAqcGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NZW1vcnlUYWJsZV9zdCAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3QgICAqcEluc3RhbmNlUGFyYW1zKQotewotCi0gICAgSU5TVF9BTExPQyAgICAgICAgICAgICAgU2xvd0RhdGE7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICAgICAgRmFzdERhdGE7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICAgICAgRmFzdENvZWY7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICAgICAgVGVtcG9yYXJ5OwotICAgIExWUkVWX0luc3RhbmNlX3N0ICAgICAgICpwTFZSRVZfUHJpdmF0ZTsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBpOwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZTsKLQotCi0gICAgLyoKLSAgICAgKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucwotICAgICAqLwotICAgIC8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzICovCi0gICAgaWYoKHBoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpIHx8IChwSW5zdGFuY2VQYXJhbXMgPT0gTFZNX05VTEwpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIExWUkVWX05VTExBRERSRVNTOwotICAgIH0KLSAgICAvKiBDaGVjayB0aGUgbWVtb3J5IHRhYmxlIGZvciBOVUxMIHBvaW50ZXJzICovCi0gICAgZm9yIChpID0gMDsgaSA8IExWUkVWX05SX01FTU9SWV9SRUdJT05TOyBpKyspCi0gICAgewotICAgICAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25baV0uU2l6ZSE9MCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLnBCYXNlQWRkcmVzcz09TFZNX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKExWUkVWX05VTExBRERSRVNTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQ2hlY2sgYWxsIGluc3RhbmNlIHBhcmFtZXRlcnMgYXJlIGluIHJhbmdlCi0gICAgICovCi0gICAgLyogQ2hlY2sgZm9yIGEgbm9uLXplcm8gYmxvY2sgc2l6ZSAqLwotICAgIGlmIChwSW5zdGFuY2VQYXJhbXMtPk1heEJsb2NrU2l6ZSA9PSAwKQotICAgIHsKLSAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7Ci0gICAgfQotCi0gICAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgbnVtYmVyIG9mIGRlbGF5IGxpbmVzICovCi0gICAgaWYgKChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyAhPSBMVlJFVl9ERUxBWUxJTkVTXzEpJiYKLSAgICAgICAgKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzICE9IExWUkVWX0RFTEFZTElORVNfMikmJgotICAgICAgICAocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgIT0gTFZSRVZfREVMQVlMSU5FU180KSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSW5pdGlhbGlzZSB0aGUgSW5zdEFsbG9jIGluc3RhbmNlcwotICAgICAqLwotICAgIEluc3RBbGxvY19Jbml0KCZTbG93RGF0YSwgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzKTsKLSAgICBJbnN0QWxsb2NfSW5pdCgmRmFzdERhdGEsICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzcyk7Ci0gICAgSW5zdEFsbG9jX0luaXQoJkZhc3RDb2VmLCAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MpOwotICAgIEluc3RBbGxvY19Jbml0KCZUZW1wb3JhcnksIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzKTsKLQotICAgIC8qCi0gICAgICogWmVybyBhbGwgbWVtb3J5IHJlZ2lvbnMKLSAgICAgKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotICAgIExvYWRDb25zdF9GbG9hdCgwLAotICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpIC8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKSk7Ci0gICAgTG9hZENvbnN0X0Zsb2F0KDAsCi0gICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSkgLyBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsKLSAgICBMb2FkQ29uc3RfRmxvYXQoMCwKLSAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKSAvIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSkpOwotICAgIExvYWRDb25zdF9GbG9hdCgwLAotICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlNpemUpIC8gXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKSk7Ci0jZWxzZQotICAgIExvYWRDb25zdF8xNigwLCAoTFZNX0lOVDE2ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MsIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLlNpemUpL3NpemVvZihMVk1fSU5UMTYpKSk7Ci0gICAgTG9hZENvbnN0XzE2KDAsIChMVk1fSU5UMTYgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzcywgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSkvc2l6ZW9mKExWTV9JTlQxNikpKTsKLSAgICBMb2FkQ29uc3RfMTYoMCwgKExWTV9JTlQxNiAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzLCAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplKS9zaXplb2YoTFZNX0lOVDE2KSkpOwotICAgIExvYWRDb25zdF8xNigwLCAoTFZNX0lOVDE2ICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3MsIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLlNpemUpL3NpemVvZihMVk1fSU5UMTYpKSk7Ci0jZW5kaWYKLSAgICAvKgotICAgICAqIFNldCB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkCi0gICAgICovCi0gICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgKnBoSW5zdGFuY2UgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZTbG93RGF0YSwgc2l6ZW9mKExWUkVWX0luc3RhbmNlX3N0KSk7Ci0gICAgfQotICAgIHBMVlJFVl9Qcml2YXRlICAgICAgICAgICAgICA9KExWUkVWX0luc3RhbmNlX3N0ICopKnBoSW5zdGFuY2U7Ci0gICAgcExWUkVWX1ByaXZhdGUtPk1lbW9yeVRhYmxlID0gKnBNZW1vcnlUYWJsZTsKLQotICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09TFZSRVZfREVMQVlMSU5FU180KQotICAgIHsKLSAgICAgICAgTWF4QmxvY2tTaXplID0gTFZSRVZfTUFYX0FQM19ERUxBWTsKLSAgICB9Ci0gICAgZWxzZSBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PUxWUkVWX0RFTEFZTElORVNfMikKLSAgICB7Ci0gICAgICAgIE1heEJsb2NrU2l6ZSA9IExWUkVWX01BWF9BUDFfREVMQVk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE1heEJsb2NrU2l6ZSA9IExWUkVWX01BWF9BUDBfREVMQVk7Ci0gICAgfQotCi0gICAgaWYoTWF4QmxvY2tTaXplPnBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplKQotICAgIHsKLSAgICAgICAgTWF4QmxvY2tTaXplPXBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIGRhdGEsIGNvZWZmaWNpZW50IGFuZCB0ZW1wb3JhcnkgbWVtb3J5IHBvaW50ZXJzCi0gICAgICovCi0gICAgcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBzaXplb2YoTFZSRVZfRmFzdERhdGFfc3QpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGYXN0IGRhdGEgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLwotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfNCkKLSAgICB7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFszXSAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QzX0RFTEFZICAqIHNpemVvZihMVk1fSU5UMzIpKTsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzJdICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDJfREVMQVkgICogc2l6ZW9mKExWTV9JTlQzMikpOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0gICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMV9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0lOVDMyKSk7Ci0KLSAgICAgICAgZm9yKCBpID0gMDsgaSA8IDQ7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lW2ldID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgIC8qIFNjcmF0Y2ggZm9yIGVhY2ggZGVsYXkgbGluZSBvdXRwdXQgKi8KLSAgICAgICAgfQotCi0gICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFszXSAgLChMVk1fSU5UMTYpTFZSRVZfTUFYX1QzX0RFTEFZKTsKLSAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzJdICAsKExWTV9JTlQxNilMVlJFVl9NQVhfVDJfREVMQVkpOwotICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0gICwoTFZNX0lOVDE2KUxWUkVWX01BWF9UMV9ERUxBWSk7Ci0gICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSAgLChMVk1fSU5UMTYpTFZSRVZfTUFYX1QwX0RFTEFZKTsKLSAgICB9Ci0KLSAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpCi0gICAgewotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMV0gID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMV9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0lOVDMyKSk7Ci0KLSAgICAgICAgZm9yKCBpID0gMDsgaSA8IDI7IGkrKykKLSAgICAgICAgewotICAgICAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lW2ldID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgIC8qIFNjcmF0Y2ggZm9yIGVhY2ggZGVsYXkgbGluZSBvdXRwdXQgKi8KLSAgICAgICAgfQotCi0gICAgICAgIExvYWRDb25zdF8zMigwLHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSAsIChMVk1fSU5UMTYpTFZSRVZfTUFYX1QxX0RFTEFZKTsKLSAgICAgICAgTG9hZENvbnN0XzMyKDAscExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOwotICAgIH0KLQotICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMSkKLSAgICB7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9JTlQzMikpOwotCi0gICAgICAgIGZvciggaSA9IDA7IGkgPCAxOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtpXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgICAvKiBTY3JhdGNoIGZvciBlYWNoIGRlbGF5IGxpbmUgb3V0cHV0ICovCi0gICAgICAgIH0KLQotICAgICAgICBMb2FkQ29uc3RfMzIoMCxwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0gICwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOwotICAgIH0KLSNlbHNlCi0gICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQotICAgIHsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDNfREVMQVkgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzJdICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDJfREVMQVkgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDFfREVMQVkgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKLQotICAgICAgICBmb3IoaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIFNjcmF0Y2ggZm9yIGVhY2ggZGVsYXkgbGluZSBvdXRwdXQgKi8KLSAgICAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtpXSA9IEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdLCBMVlJFVl9NQVhfVDNfREVMQVkpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzJdLCBMVlJFVl9NQVhfVDJfREVMQVkpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdLCBMVlJFVl9NQVhfVDFfREVMQVkpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCBMVlJFVl9NQVhfVDBfREVMQVkpOwotICAgIH0KLQotICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKLSAgICB7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0KLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgMjsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTY3JhdGNoIGZvciBlYWNoIGRlbGF5IGxpbmUgb3V0cHV0ICovCi0gICAgICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbaV0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDFfREVMQVkpOwotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7Ci0gICAgfQotCi0gICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18xKQotICAgIHsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0KLSAgICAgICAgZm9yKGkgPSAwOyBpIDwgMTsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKiBTY3JhdGNoIGZvciBlYWNoIGRlbGF5IGxpbmUgb3V0cHV0ICovCi0gICAgICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbaV0gPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFswXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDBfREVMQVkpOwotICAgIH0KLSNlbmRpZgotICAgIC8qIEFsbC1wYXNzIGRlbGF5IGJ1ZmZlciBhZGRyZXNzZXMgYW5kIHNpemVzICovCi0gICAgcExWUkVWX1ByaXZhdGUtPlRbMF0gICAgICAgICA9IExWUkVWX01BWF9UMF9ERUxBWTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+VFsxXSAgICAgICAgID0gTFZSRVZfTUFYX1QxX0RFTEFZOwotICAgIHBMVlJFVl9Qcml2YXRlLT5UWzJdICAgICAgICAgPSBMVlJFVl9NQVhfVDJfREVMQVk7Ci0gICAgcExWUkVWX1ByaXZhdGUtPlRbM10gICAgICAgICA9IExWUkVWX01BWF9UM19ERUxBWTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QUJfU2VsZWN0aW9uID0gMTsgICAgICAgLyogU2VsZWN0IHNtb290aGluZyBBIHRvIEIgKi8KLQotCi0gICAgcExWUkVWX1ByaXZhdGUtPnBGYXN0Q29lZiAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3RDb2VmLCBzaXplb2YoTFZSRVZfRmFzdENvZWZfc3QpKTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBGYXN0IGNvZWZmaWNpZW50IG1lbW9yeSBiYXNlIGFkZHJlc3MgKi8KLSNpZm5kZWYgQlVJTERfRkxPQVQKLSAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2ggICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgICAgICAgICAgIC8qIEdlbmVyYWwgcHVycG9zZSBzY3JhdGNoICovCi0gICAgcExWUkVWX1ByaXZhdGUtPnBJbnB1dFNhdmUgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgMiAqIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAgICAgICAvKiBNb25vLT5zdGVyZW8gaW5wdXQgc2F2ZSBmb3IgZW5kIG1peCAqLwotICAgIExvYWRDb25zdF8zMigwLCBwTFZSRVZfUHJpdmF0ZS0+cElucHV0U2F2ZSwgKExWTV9JTlQxNikoTWF4QmxvY2tTaXplKjIpKTsKLSNlbHNlCi0gICAgLyogR2VuZXJhbCBwdXJwb3NlIHNjcmF0Y2ggKi8KLSAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2ggICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOwotICAgIC8qIE1vbm8tPnN0ZXJlbyBpbnB1dCBzYXZlIGZvciBlbmQgbWl4ICovCi0gICAgcExWUkVWX1ByaXZhdGUtPnBJbnB1dFNhdmUgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgMiAqIHNpemVvZihMVk1fRkxPQVQpICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZSk7Ci0gICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wSW5wdXRTYXZlLCAoTFZNX0lOVDE2KShNYXhCbG9ja1NpemUgKiAyKSk7Ci0jZW5kaWYKLQotICAgIC8qCi0gICAgICogU2F2ZSB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycyBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlCi0gICAgICovCi0gICAgcExWUkVWX1ByaXZhdGUtPkluc3RhbmNlUGFyYW1zID0gKnBJbnN0YW5jZVBhcmFtczsKLQotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIHBhcmFtZXRlcnMgdG8gaW52YWxpZAotICAgICAqLwotICAgIHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUgICAgPSBMVk1fRlNfSU5WQUxJRDsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZNX01PREVfRFVNTVk7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ICA9IExWTV9TT1VSQ0VfRFVNTVk7Ci0KLSAgICBwTFZSRVZfUHJpdmF0ZS0+YkNvbnRyb2xQZW5kaW5nICAgICAgICAgICAgID0gTFZNX0ZBTFNFOwotICAgIHBMVlJFVl9Qcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICAgICAgICAgPSBMVk1fVFJVRTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+YkRpc2FibGVSZXZlcmIgICAgICAgICAgICAgID0gTFZNX0ZBTFNFOwotCi0KLSAgICAvKgotICAgICAqIFNldCBtaXhlciBwYXJhbWV0ZXJzCi0gICAgICovCi0gICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLkNhbGxiYWNrUGFyYW0yICAgICAgPSAwOwotICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5wQ2FsbGJhY2tIYW5kbGUyICAgID0gcExWUkVWX1ByaXZhdGU7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLnBHZW5lcmFsUHVycG9zZTIgICAgPSBMVk1fTlVMTDsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIucENhbGxCYWNrMiAgICAgICAgICA9IEJ5cGFzc01peGVyX0NhbGxiYWNrOwotICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDIgICAgICAgID0gTFZNX0ZBTFNFOwotICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DdXJyZW50MiAgICAgICAgICAgID0gMDsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MiAgICAgICAgICAgICA9IDA7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLkNhbGxiYWNrUGFyYW0xICAgICAgPSAwOwotICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5wQ2FsbGJhY2tIYW5kbGUxICAgID0gTFZNX05VTEw7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLnBHZW5lcmFsUHVycG9zZTEgICAgPSBMVk1fTlVMTDsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIucENhbGxCYWNrMSAgICAgICAgICA9IExWTV9OVUxMOwotICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1NldDEgICAgICAgID0gTFZNX0ZBTFNFOwotICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DdXJyZW50MSAgICAgICAgICAgID0gMHgwMDAwMDAwMDsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuVGFyZ2V0MSAgICAgICAgICAgICA9IDB4MDAwMDAwMDA7Ci0KLSAgICBwTFZSRVZfUHJpdmF0ZS0+Um9vbVNpemVJbm1zICAgICAgICAgICAgICAgICAgICA9IDEwMDsgIC8vIDEwMCBtc2VjCi0KLQotICAgIC8qCi0gICAgICogIFNldCB0aGUgb3V0cHV0IGdhaW4gbWl4ZXIgcGFyYW1ldGVycwotICAgICAqLwotICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIuQ2FsbGJhY2tQYXJhbSAgICAgID0gMDsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLnBDYWxsYmFja0hhbmRsZSAgICA9IExWTV9OVUxMOwotICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIucEdlbmVyYWxQdXJwb3NlICAgID0gTFZNX05VTEw7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5wQ2FsbEJhY2sgICAgICAgICAgPSBMVk1fTlVMTDsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLkNhbGxiYWNrU2V0ICAgICAgICA9IExWTV9GQUxTRTsKLSNpZm5kZWYgQlVJTERfRkxPQVQKLSAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLkN1cnJlbnQgICAgICAgICAgICA9IDB4MDNmZmZmZmY7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5UYXJnZXQgICAgICAgICAgICAgPSAweDAzZmZmZmZmOwotI2Vsc2UKLSAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLkN1cnJlbnQgICAgICAgICAgICA9IDAuMDMxMjVmOy8vMHgwM2ZmZmZmZjsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLlRhcmdldCAgICAgICAgICAgICA9IDAuMDMxMjVmOy8vMHgwM2ZmZmZmZjsKLSNlbmRpZgotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIEFsbC1QYXNzIEZpbHRlciBtaXhlcnMKLSAgICAgKi8KLSAgICBmb3IgKGk9MDsgaTw0OyBpKyspCi0gICAgewotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cE9mZnNldEFbaV0gPSBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbaV07Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wT2Zmc2V0QltpXSA9IHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFtpXTsKLSAgICAgICAgLyogRGVsYXkgdGFwIHNlbGVjdGlvbiBtaXhlciAqLwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrUGFyYW0yICAgPSAwOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLnBDYWxsYmFja0hhbmRsZTIgPSBMVk1fTlVMTDsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5wR2VuZXJhbFB1cnBvc2UyID0gTFZNX05VTEw7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0ucENhbGxCYWNrMiAgICAgICA9IExWTV9OVUxMOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrU2V0MiAgICAgPSBMVk1fRkFMU0U7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ3VycmVudDIgICAgICAgICA9IDA7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MiAgICAgICAgICA9IDA7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ2FsbGJhY2tQYXJhbTEgICA9IDA7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0ucENhbGxiYWNrSGFuZGxlMSA9IExWTV9OVUxMOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLnBHZW5lcmFsUHVycG9zZTEgPSBMVk1fTlVMTDsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5wQ2FsbEJhY2sxICAgICAgID0gTFZNX05VTEw7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ2FsbGJhY2tTZXQxICAgICA9IExWTV9GQUxTRTsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5DdXJyZW50MSAgICAgICAgID0gMDsKLSNpZm5kZWYgQlVJTERfRkxPQVQKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQxICAgICAgICAgID0gMHg3ZmZmZmZmZjsKLSNlbHNlCi0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MSAgICAgICAgICA9IDE7Ci0jZW5kaWYKLSAgICAgICAgLyogRmVlZGZvcndhcmQgbWl4ZXIgKi8KLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQ2FsbGJhY2tQYXJhbSAgID0gMDsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLnBHZW5lcmFsUHVycG9zZSA9IExWTV9OVUxMOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5wQ2FsbEJhY2sgICAgICAgPSBMVk1fTlVMTDsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQ2FsbGJhY2tTZXQgICAgID0gTFZNX0ZBTFNFOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5DdXJyZW50ICAgICAgICAgPSAwOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5UYXJnZXQgICAgICAgICAgPSAwOwotICAgICAgICAvKiBGZWVkYmFjayBtaXhlciAqLwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5DYWxsYmFja1BhcmFtICAgPSAwOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0ucEdlbmVyYWxQdXJwb3NlID0gTFZNX05VTEw7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLnBDYWxsQmFjayAgICAgICA9IExWTV9OVUxMOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5DYWxsYmFja1NldCAgICAgPSBMVk1fRkFMU0U7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLkN1cnJlbnQgICAgICAgICA9IDA7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLlRhcmdldCAgICAgICAgICA9IDA7Ci0gICAgICAgIC8qIEZlZWRiYWNrIGdhaW4gbWl4ZXIgKi8KLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbaV0uQ2FsbGJhY2tQYXJhbSAgICA9IDA7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLnBDYWxsYmFja0hhbmRsZSAgPSBMVk1fTlVMTDsKLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbaV0ucEdlbmVyYWxQdXJwb3NlICA9IExWTV9OVUxMOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5wQ2FsbEJhY2sgICAgICAgID0gTFZNX05VTEw7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLkNhbGxiYWNrU2V0ICAgICAgPSBMVk1fRkFMU0U7Ci0gICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLkN1cnJlbnQgICAgICAgICAgPSAwOwotICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5UYXJnZXQgICAgICAgICAgID0gMDsKLSAgICB9Ci0gICAgLyogRGVsYXkgdGFwIGluZGV4ICovCi0gICAgcExWUkVWX1ByaXZhdGUtPkFfRGVsYXlTaXplWzBdID0gTFZSRVZfTUFYX0FQMF9ERUxBWTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+Ql9EZWxheVNpemVbMF0gPSBMVlJFVl9NQVhfQVAwX0RFTEFZOwotICAgIHBMVlJFVl9Qcml2YXRlLT5BX0RlbGF5U2l6ZVsxXSA9IExWUkVWX01BWF9BUDFfREVMQVk7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkJfRGVsYXlTaXplWzFdID0gTFZSRVZfTUFYX0FQMV9ERUxBWTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+QV9EZWxheVNpemVbMl0gPSBMVlJFVl9NQVhfQVAyX0RFTEFZOwotICAgIHBMVlJFVl9Qcml2YXRlLT5CX0RlbGF5U2l6ZVsyXSA9IExWUkVWX01BWF9BUDJfREVMQVk7Ci0gICAgcExWUkVWX1ByaXZhdGUtPkFfRGVsYXlTaXplWzNdID0gTFZSRVZfTUFYX0FQM19ERUxBWTsKLSAgICBwTFZSRVZfUHJpdmF0ZS0+Ql9EZWxheVNpemVbM10gPSBMVlJFVl9NQVhfQVAzX0RFTEFZOwotCi0KLSAgICBMVlJFVl9DbGVhckF1ZGlvQnVmZmVycygqcGhJbnN0YW5jZSk7Ci0KLSAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKLX0KLQotLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX0dldEluc3RhbmNlSGFuZGxlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGY4ODNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUuY3BwCkBAIC0wLDAgKzEsMzUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2luY2x1ZGUgIkxWUkVWX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJJbnN0QWxsb2MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlJFVl9HZXRJbnN0YW5jZUhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gY3JlYXRlIGEgTFZSRVYgbW9kdWxlIGluc3RhbmNlLiBJdCByZXR1cm5zIHRoZSBjcmVhdGVkICAgICAqLworLyogIGluc3RhbmNlIGhhbmRsZSB0aHJvdWdoIHBoSW5zdGFuY2UuIEFsbCBwYXJhbWV0ZXJzIGFyZSBzZXQgdG8gdGhlaXIgZGVmYXVsdCwgICAgICAgICovCisvKiAgaW5hY3RpdmUgc3RhdGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICAgICAgcG9pbnRlciB0byB0aGUgaW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0YW5jZVBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX1NVQ0NFU1MgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICAgV2hlbiBwaEluc3RhbmNlIG9yIHBNZW1vcnlUYWJsZSBvciBwSW5zdGFuY2VQYXJhbXMgaXMgTlVMTCAgKi8KKy8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIG9uZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbnMgaGFzIGEgTlVMTCBwb2ludGVyICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfR2V0SW5zdGFuY2VIYW5kbGUoTFZSRVZfSGFuZGxlX3QgICAgICAgICAgICAqcGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NZW1vcnlUYWJsZV9zdCAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3QgICAqcEluc3RhbmNlUGFyYW1zKQoreworCisgICAgSU5TVF9BTExPQyAgICAgICAgICAgICAgU2xvd0RhdGE7CisgICAgSU5TVF9BTExPQyAgICAgICAgICAgICAgRmFzdERhdGE7CisgICAgSU5TVF9BTExPQyAgICAgICAgICAgICAgRmFzdENvZWY7CisgICAgSU5TVF9BTExPQyAgICAgICAgICAgICAgVGVtcG9yYXJ5OworICAgIExWUkVWX0luc3RhbmNlX3N0ICAgICAgICpwTFZSRVZfUHJpdmF0ZTsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBpOworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZTsKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKKyAgICAgKi8KKyAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVycyAqLworICAgIGlmKChwaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKSB8fCAocEluc3RhbmNlUGFyYW1zID09IExWTV9OVUxMKSkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKKyAgICB9CisgICAgLyogQ2hlY2sgdGhlIG1lbW9yeSB0YWJsZSBmb3IgTlVMTCBwb2ludGVycyAqLworICAgIGZvciAoaSA9IDA7IGkgPCBMVlJFVl9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2ldLlNpemUhPTApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChwTWVtb3J5VGFibGUtPlJlZ2lvbltpXS5wQmFzZUFkZHJlc3M9PUxWTV9OVUxMKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHJldHVybihMVlJFVl9OVUxMQUREUkVTUyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIGFsbCBpbnN0YW5jZSBwYXJhbWV0ZXJzIGFyZSBpbiByYW5nZQorICAgICAqLworICAgIC8qIENoZWNrIGZvciBhIG5vbi16ZXJvIGJsb2NrIHNpemUgKi8KKyAgICBpZiAocEluc3RhbmNlUGFyYW1zLT5NYXhCbG9ja1NpemUgPT0gMCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOworICAgIH0KKworICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIG51bWJlciBvZiBkZWxheSBsaW5lcyAqLworICAgIGlmICgocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgIT0gTFZSRVZfREVMQVlMSU5FU18xKSYmCisgICAgICAgIChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyAhPSBMVlJFVl9ERUxBWUxJTkVTXzIpJiYKKyAgICAgICAgKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzICE9IExWUkVWX0RFTEFZTElORVNfNCkpCisgICAgeworICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIEluc3RBbGxvYyBpbnN0YW5jZXMKKyAgICAgKi8KKyAgICBJbnN0QWxsb2NfSW5pdCgmU2xvd0RhdGEsICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcyk7CisgICAgSW5zdEFsbG9jX0luaXQoJkZhc3REYXRhLCAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MpOworICAgIEluc3RBbGxvY19Jbml0KCZGYXN0Q29lZiwgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzKTsKKyAgICBJbnN0QWxsb2NfSW5pdCgmVGVtcG9yYXJ5LCBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyk7CisKKyAgICAvKgorICAgICAqIFplcm8gYWxsIG1lbW9yeSByZWdpb25zCisgICAgICovCisgICAgTG9hZENvbnN0X0Zsb2F0KDAsCisgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSkgLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsKKyAgICBMb2FkQ29uc3RfRmxvYXQoMCwKKyAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgocE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplKSAvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSkpOworICAgIExvYWRDb25zdF9GbG9hdCgwLAorICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKChwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUpIC8gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKSk7CisgICAgTG9hZENvbnN0X0Zsb2F0KDAsCisgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoKHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uU2l6ZSkgLyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpKTsKKyAgICAvKgorICAgICAqIFNldCB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkCisgICAgICovCisgICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgKnBoSW5zdGFuY2UgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCZTbG93RGF0YSwgc2l6ZW9mKExWUkVWX0luc3RhbmNlX3N0KSk7CisgICAgfQorICAgIHBMVlJFVl9Qcml2YXRlICAgICAgICAgICAgICA9KExWUkVWX0luc3RhbmNlX3N0ICopKnBoSW5zdGFuY2U7CisgICAgcExWUkVWX1ByaXZhdGUtPk1lbW9yeVRhYmxlID0gKnBNZW1vcnlUYWJsZTsKKworICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09TFZSRVZfREVMQVlMSU5FU180KQorICAgIHsKKyAgICAgICAgTWF4QmxvY2tTaXplID0gTFZSRVZfTUFYX0FQM19ERUxBWTsKKyAgICB9CisgICAgZWxzZSBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PUxWUkVWX0RFTEFZTElORVNfMikKKyAgICB7CisgICAgICAgIE1heEJsb2NrU2l6ZSA9IExWUkVWX01BWF9BUDFfREVMQVk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE1heEJsb2NrU2l6ZSA9IExWUkVWX01BWF9BUDBfREVMQVk7CisgICAgfQorCisgICAgaWYoTWF4QmxvY2tTaXplPnBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplKQorICAgIHsKKyAgICAgICAgTWF4QmxvY2tTaXplPXBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplOworICAgIH0KKworICAgIC8qCisgICAgICogU2V0IHRoZSBkYXRhLCBjb2VmZmljaWVudCBhbmQgdGVtcG9yYXJ5IG1lbW9yeSBwb2ludGVycworICAgICAqLworICAgIC8qIEZhc3QgZGF0YSBtZW1vcnkgYmFzZSBhZGRyZXNzICovCisgICAgcExWUkVWX1ByaXZhdGUtPnBGYXN0RGF0YSA9IChMVlJFVl9GYXN0RGF0YV9zdCAqKQorICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgc2l6ZW9mKExWUkVWX0Zhc3REYXRhX3N0KSk7CisgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgIHsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdICAgICA9CisgICAgICAgICAgICAoTFZNX0ZMT0FUICopSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UM19ERUxBWSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMl0gICAgID0KKyAgICAgICAgICAgIChMVk1fRkxPQVQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QyX0RFTEFZICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSAgICAgPQorICAgICAgICAgICAgKExWTV9GTE9BVCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDFfREVMQVkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICAgICA9CisgICAgICAgICAgICAoTFZNX0ZMT0FUICopSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IDQ7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2NyYXRjaCBmb3IgZWFjaCBkZWxheSBsaW5lIG91dHB1dCAqLworICAgICAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lW2ldID0gKExWTV9GTE9BVCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzNdLCBMVlJFVl9NQVhfVDNfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzJdLCBMVlJFVl9NQVhfVDJfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzFdLCBMVlJFVl9NQVhfVDFfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCBMVlJFVl9NQVhfVDBfREVMQVkpOworICAgIH0KKworICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKKyAgICB7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSAgPSAoTFZNX0ZMT0FUICopCisgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMV9ERUxBWSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbMF0gID0gKExWTV9GTE9BVCAqKQorICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpKTsKKworICAgICAgICBmb3IoaSA9IDA7IGkgPCAyOyBpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIFNjcmF0Y2ggZm9yIGVhY2ggZGVsYXkgbGluZSBvdXRwdXQgKi8KKyAgICAgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtpXSA9IChMVk1fRkxPQVQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihMVk1fRkxPQVQpICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOworICAgICAgICB9CisKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsIHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFsxXSwgKExWTV9JTlQxNilMVlJFVl9NQVhfVDFfREVMQVkpOworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7CisgICAgfQorCisgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18xKQorICAgIHsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdICA9IChMVk1fRkxPQVQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOworCisgICAgICAgIGZvcihpID0gMDsgaSA8IDE7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgLyogU2NyYXRjaCBmb3IgZWFjaCBkZWxheSBsaW5lIG91dHB1dCAqLworICAgICAgICAgICAgcExWUkVWX1ByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lW2ldID0gKExWTV9GTE9BVCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgcExWUkVWX1ByaXZhdGUtPnBEZWxheV9UWzBdLCAoTFZNX0lOVDE2KUxWUkVWX01BWF9UMF9ERUxBWSk7CisgICAgfQorICAgIC8qIEFsbC1wYXNzIGRlbGF5IGJ1ZmZlciBhZGRyZXNzZXMgYW5kIHNpemVzICovCisgICAgcExWUkVWX1ByaXZhdGUtPlRbMF0gICAgICAgICA9IExWUkVWX01BWF9UMF9ERUxBWTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+VFsxXSAgICAgICAgID0gTFZSRVZfTUFYX1QxX0RFTEFZOworICAgIHBMVlJFVl9Qcml2YXRlLT5UWzJdICAgICAgICAgPSBMVlJFVl9NQVhfVDJfREVMQVk7CisgICAgcExWUkVWX1ByaXZhdGUtPlRbM10gICAgICAgICA9IExWUkVWX01BWF9UM19ERUxBWTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QUJfU2VsZWN0aW9uID0gMTsgICAgICAgLyogU2VsZWN0IHNtb290aGluZyBBIHRvIEIgKi8KKworICAgIC8qIEZhc3QgY29lZmZpY2llbnQgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLworICAgIHBMVlJFVl9Qcml2YXRlLT5wRmFzdENvZWYgICAgICAgPQorICAgICAgICAoTFZSRVZfRmFzdENvZWZfc3QgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0Q29lZiwgc2l6ZW9mKExWUkVWX0Zhc3RDb2VmX3N0KSk7CisgICAgLyogR2VuZXJhbCBwdXJwb3NlIHNjcmF0Y2ggKi8KKyAgICBwTFZSRVZfUHJpdmF0ZS0+cFNjcmF0Y2ggICAgICAgID0KKyAgICAgICAgICAgIChMVk1fRkxPQVQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fRkxPQVQpICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZSk7CisgICAgLyogTW9uby0+c3RlcmVvIGlucHV0IHNhdmUgZm9yIGVuZCBtaXggKi8KKyAgICBwTFZSRVZfUHJpdmF0ZS0+cElucHV0U2F2ZSAgICAgID0KKyAgICAgICAgICAgIChMVk1fRkxPQVQgKilJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIDIgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhCbG9ja1NpemUpOworICAgIExvYWRDb25zdF9GbG9hdCgwLCBwTFZSRVZfUHJpdmF0ZS0+cElucHV0U2F2ZSwgKExWTV9JTlQxNikoTWF4QmxvY2tTaXplICogMikpOworCisgICAgLyoKKyAgICAgKiBTYXZlIHRoZSBpbnN0YW5jZSBwYXJhbWV0ZXJzIGluIHRoZSBpbnN0YW5jZSBzdHJ1Y3R1cmUKKyAgICAgKi8KKyAgICBwTFZSRVZfUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMgPSAqcEluc3RhbmNlUGFyYW1zOworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIHBhcmFtZXRlcnMgdG8gaW52YWxpZAorICAgICAqLworICAgIHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLlNhbXBsZVJhdGUgICAgPSBMVk1fRlNfSU5WQUxJRDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5PcGVyYXRpbmdNb2RlID0gTFZNX01PREVfRFVNTVk7CisgICAgcExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ICA9IExWTV9TT1VSQ0VfRFVNTVk7CisKKyAgICBwTFZSRVZfUHJpdmF0ZS0+YkNvbnRyb2xQZW5kaW5nICAgICAgICAgICAgID0gTFZNX0ZBTFNFOworICAgIHBMVlJFVl9Qcml2YXRlLT5iRmlyc3RDb250cm9sICAgICAgICAgICAgICAgPSBMVk1fVFJVRTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+YkRpc2FibGVSZXZlcmIgICAgICAgICAgICAgID0gTFZNX0ZBTFNFOworCisgICAgLyoKKyAgICAgKiBTZXQgbWl4ZXIgcGFyYW1ldGVycworICAgICAqLworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1BhcmFtMiAgICAgID0gMDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIucENhbGxiYWNrSGFuZGxlMiAgICA9IHBMVlJFVl9Qcml2YXRlOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5wR2VuZXJhbFB1cnBvc2UyICAgID0gTFZNX05VTEw7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLnBDYWxsQmFjazIgICAgICAgICAgPSBCeXBhc3NNaXhlcl9DYWxsYmFjazsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQyICAgICAgICA9IExWTV9GQUxTRTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ3VycmVudDIgICAgICAgICAgICA9IDA7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDIgICAgICAgICAgICAgPSAwOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5DYWxsYmFja1BhcmFtMSAgICAgID0gMDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIucENhbGxiYWNrSGFuZGxlMSAgICA9IExWTV9OVUxMOworICAgIHBMVlJFVl9Qcml2YXRlLT5CeXBhc3NNaXhlci5wR2VuZXJhbFB1cnBvc2UxICAgID0gTFZNX05VTEw7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLnBDYWxsQmFjazEgICAgICAgICAgPSBMVk1fTlVMTDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ2FsbGJhY2tTZXQxICAgICAgICA9IExWTV9GQUxTRTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QnlwYXNzTWl4ZXIuQ3VycmVudDEgICAgICAgICAgICA9IDB4MDAwMDAwMDA7CisgICAgcExWUkVWX1ByaXZhdGUtPkJ5cGFzc01peGVyLlRhcmdldDEgICAgICAgICAgICAgPSAweDAwMDAwMDAwOworCisgICAgcExWUkVWX1ByaXZhdGUtPlJvb21TaXplSW5tcyAgICAgICAgICAgICAgICAgICAgPSAxMDA7ICAvLyAxMDAgbXNlYworCisgICAgLyoKKyAgICAgKiAgU2V0IHRoZSBvdXRwdXQgZ2FpbiBtaXhlciBwYXJhbWV0ZXJzCisgICAgICovCisgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5DYWxsYmFja1BhcmFtICAgICAgPSAwOworICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIucENhbGxiYWNrSGFuZGxlICAgID0gTFZNX05VTEw7CisgICAgcExWUkVWX1ByaXZhdGUtPkdhaW5NaXhlci5wR2VuZXJhbFB1cnBvc2UgICAgPSBMVk1fTlVMTDsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+R2Fpbk1peGVyLnBDYWxsQmFjayAgICAgICAgICA9IExWTV9OVUxMOworICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIuQ2FsbGJhY2tTZXQgICAgICAgID0gTFZNX0ZBTFNFOworICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIuQ3VycmVudCAgICAgICAgICAgID0gMC4wMzEyNWY7Ly8weDAzZmZmZmZmOworICAgIHBMVlJFVl9Qcml2YXRlLT5HYWluTWl4ZXIuVGFyZ2V0ICAgICAgICAgICAgID0gMC4wMzEyNWY7Ly8weDAzZmZmZmZmOworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIEFsbC1QYXNzIEZpbHRlciBtaXhlcnMKKyAgICAgKi8KKyAgICBmb3IgKGk9MDsgaTw0OyBpKyspCisgICAgeworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+cE9mZnNldEFbaV0gPSBwTFZSRVZfUHJpdmF0ZS0+cERlbGF5X1RbaV07CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5wT2Zmc2V0QltpXSA9IHBMVlJFVl9Qcml2YXRlLT5wRGVsYXlfVFtpXTsKKyAgICAgICAgLyogRGVsYXkgdGFwIHNlbGVjdGlvbiBtaXhlciAqLworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrUGFyYW0yICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLnBDYWxsYmFja0hhbmRsZTIgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5wR2VuZXJhbFB1cnBvc2UyID0gTFZNX05VTEw7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0ucENhbGxCYWNrMiAgICAgICA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLkNhbGxiYWNrU2V0MiAgICAgPSBMVk1fRkFMU0U7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ3VycmVudDIgICAgICAgICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uVGFyZ2V0MiAgICAgICAgICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ2FsbGJhY2tQYXJhbTEgICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0ucENhbGxiYWNrSGFuZGxlMSA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2ldLnBHZW5lcmFsUHVycG9zZTEgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5wQ2FsbEJhY2sxICAgICAgID0gTFZNX05VTEw7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9BUFRhcHNbaV0uQ2FsbGJhY2tTZXQxICAgICA9IExWTV9GQUxTRTsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5DdXJyZW50MSAgICAgICAgID0gMDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX0FQVGFwc1tpXS5UYXJnZXQxICAgICAgICAgID0gMTsKKyAgICAgICAgLyogRmVlZGZvcndhcmQgbWl4ZXIgKi8KKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQ2FsbGJhY2tQYXJhbSAgID0gMDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2ldLnBHZW5lcmFsUHVycG9zZSA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5wQ2FsbEJhY2sgICAgICAgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGZvcndhcmRbaV0uQ2FsbGJhY2tTZXQgICAgID0gTFZNX0ZBTFNFOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5DdXJyZW50ICAgICAgICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtpXS5UYXJnZXQgICAgICAgICAgPSAwOworICAgICAgICAvKiBGZWVkYmFjayBtaXhlciAqLworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5DYWxsYmFja1BhcmFtICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbaV0ucEdlbmVyYWxQdXJwb3NlID0gTFZNX05VTEw7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLnBDYWxsQmFjayAgICAgICA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkYmFja1tpXS5DYWxsYmFja1NldCAgICAgPSBMVk1fRkFMU0U7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLkN1cnJlbnQgICAgICAgICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2ldLlRhcmdldCAgICAgICAgICA9IDA7CisgICAgICAgIC8qIEZlZWRiYWNrIGdhaW4gbWl4ZXIgKi8KKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbaV0uQ2FsbGJhY2tQYXJhbSAgICA9IDA7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLnBDYWxsYmFja0hhbmRsZSAgPSBMVk1fTlVMTDsKKyAgICAgICAgcExWUkVWX1ByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbaV0ucEdlbmVyYWxQdXJwb3NlICA9IExWTV9OVUxMOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5wQ2FsbEJhY2sgICAgICAgID0gTFZNX05VTEw7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLkNhbGxiYWNrU2V0ICAgICAgPSBMVk1fRkFMU0U7CisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5GZWVkYmFja01peGVyW2ldLkN1cnJlbnQgICAgICAgICAgPSAwOworICAgICAgICBwTFZSRVZfUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltpXS5UYXJnZXQgICAgICAgICAgID0gMDsKKyAgICB9CisgICAgLyogRGVsYXkgdGFwIGluZGV4ICovCisgICAgcExWUkVWX1ByaXZhdGUtPkFfRGVsYXlTaXplWzBdID0gTFZSRVZfTUFYX0FQMF9ERUxBWTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+Ql9EZWxheVNpemVbMF0gPSBMVlJFVl9NQVhfQVAwX0RFTEFZOworICAgIHBMVlJFVl9Qcml2YXRlLT5BX0RlbGF5U2l6ZVsxXSA9IExWUkVWX01BWF9BUDFfREVMQVk7CisgICAgcExWUkVWX1ByaXZhdGUtPkJfRGVsYXlTaXplWzFdID0gTFZSRVZfTUFYX0FQMV9ERUxBWTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+QV9EZWxheVNpemVbMl0gPSBMVlJFVl9NQVhfQVAyX0RFTEFZOworICAgIHBMVlJFVl9Qcml2YXRlLT5CX0RlbGF5U2l6ZVsyXSA9IExWUkVWX01BWF9BUDJfREVMQVk7CisgICAgcExWUkVWX1ByaXZhdGUtPkFfRGVsYXlTaXplWzNdID0gTFZSRVZfTUFYX0FQM19ERUxBWTsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+Ql9EZWxheVNpemVbM10gPSBMVlJFVl9NQVhfQVAzX0RFTEFZOworCisgICAgTFZSRVZfQ2xlYXJBdWRpb0J1ZmZlcnMoKnBoSW5zdGFuY2UpOworCisgICAgcmV0dXJuIExWUkVWX1NVQ0NFU1M7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0TWVtb3J5VGFibGUuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZkNDQ2Yi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jCisrKyAvZGV2L251bGwKQEAgLTEsMjgyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAiTFZSRVZfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkluc3RBbGxvYy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWUkVWX0dldE1lbW9yeVRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCi0vKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCBhbGxvY2F0ZWQgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgYWRkcmVzc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICAgKi8KLS8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICAgKi8KLS8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcEluc3RhbmNlUGFyYW1zICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZSRVZfU3VjY2VzcyAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIHBNZW1vcnlUYWJsZSBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUkVWX05VTExBRERSRVNTICAgICAgIFdoZW4gcmVxdWVzdGluZyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCBwSW5zdGFuY2VQYXJhbXMgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVlJFVl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfR2V0TWVtb3J5VGFibGUoTFZSRVZfSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NZW1vcnlUYWJsZV9zdCAgICAgKnBNZW1vcnlUYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9JbnN0YW5jZVBhcmFtc19zdCAgKnBJbnN0YW5jZVBhcmFtcykKLXsKLQotICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIFNsb3dEYXRhOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIEZhc3REYXRhOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIEZhc3RDb2VmOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIFRlbXBvcmFyeTsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBpOwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZTsKLQotCi0gICAgLyoKLSAgICAgKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucwotICAgICAqLwotICAgIC8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXIgKi8KLSAgICBpZiAocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuKExWUkVWX05VTExBRERSRVNTKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENoZWNrIGFsbCBpbnN0YW5jZSBwYXJhbWV0ZXJzIGFyZSBpbiByYW5nZQotICAgICAqLwotICAgIGlmIChwSW5zdGFuY2VQYXJhbXMgIT0gTFZNX05VTEwpCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBDYWxsIGZvciBtZW1vcnkgYWxsb2NhdGlvbiwgc28gY2hlY2sgdGhlIHBhcmFtZXRlcnMKLSAgICAgICAgICovCi0gICAgICAgIC8qIENoZWNrIGZvciBhIG5vbi16ZXJvIGJsb2NrIHNpemUgKi8KLSAgICAgICAgaWYgKHBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplID09IDApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ2hlY2sgZm9yIGEgdmFsaWQgbnVtYmVyIG9mIGRlbGF5IGxpbmVzICovCi0gICAgICAgIGlmICgocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgIT0gTFZSRVZfREVMQVlMSU5FU18xKSAmJgotICAgICAgICAgICAgKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzICE9IExWUkVWX0RFTEFZTElORVNfMikgJiYKLSAgICAgICAgICAgIChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyAhPSBMVlJFVl9ERUxBWUxJTkVTXzQpKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogSW5pdGlhbGlzZSB0aGUgSW5zdEFsbG9jIGluc3RhbmNlcwotICAgICAqLwotICAgIEluc3RBbGxvY19Jbml0KCZTbG93RGF0YSwgICh2b2lkICopTFZNX05VTEwpOwotICAgIEluc3RBbGxvY19Jbml0KCZGYXN0RGF0YSwgICh2b2lkICopTFZNX05VTEwpOwotICAgIEluc3RBbGxvY19Jbml0KCZGYXN0Q29lZiwgICh2b2lkICopTFZNX05VTEwpOwotICAgIEluc3RBbGxvY19Jbml0KCZUZW1wb3JhcnksICh2b2lkICopTFZNX05VTEwpOwotCi0KLSAgICAvKgotICAgICAqIEZpbGwgaW4gdGhlIG1lbW9yeSB0YWJsZQotICAgICAqLwotICAgIGlmIChoSW5zdGFuY2UgPT0gTFZNX05VTEwpCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBDaGVjayBmb3IgbnVsbCBwb2ludGVycwotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBJbnN0YW5jZVBhcmFtcyA9PSBMVk1fTlVMTCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuKExWUkVWX05VTExBRERSRVNTKTsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2VsZWN0IHRoZSBtYXhpbXVtIGludGVybmFsIGJsb2NrIHNpemUKLSAgICAgICAgICovCi0gICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09TFZSRVZfREVMQVlMSU5FU180KQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXhCbG9ja1NpemUgPSBMVlJFVl9NQVhfQVAzX0RFTEFZOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT1MVlJFVl9ERUxBWUxJTkVTXzIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1heEJsb2NrU2l6ZSA9IExWUkVWX01BWF9BUDFfREVMQVk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXhCbG9ja1NpemUgPSBMVlJFVl9NQVhfQVAwX0RFTEFZOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYoTWF4QmxvY2tTaXplPnBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICBNYXhCbG9ja1NpemU9cEluc3RhbmNlUGFyYW1zLT5NYXhCbG9ja1NpemU7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNsb3cgZGF0YSBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlNsb3dEYXRhLCBzaXplb2YoTFZSRVZfSW5zdGFuY2Vfc3QpKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJlNsb3dEYXRhKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEE7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBQZXJzaXN0ZW50IGZhc3QgZGF0YSBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBzaXplb2YoTFZSRVZfRmFzdERhdGFfc3QpKTsKLSAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQotICAgICAgICB7Ci0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QzX0RFTEFZICAqIHNpemVvZihMVk1fSU5UMzIpKTsKLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDJfREVMQVkgICogc2l6ZW9mKExWTV9JTlQzMikpOwotICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMV9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0lOVDMyKSk7Ci0jZWxzZQotICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UM19ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDJfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0gICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOwotICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKLSNlbmRpZgotICAgICAgICB9Ci0KLSAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKQotICAgICAgICB7Ci0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9JTlQzMikpOwotICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fSU5UMzIpKTsKLSNlbHNlCi0gICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QxX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOwotICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMF9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKLSNlbmRpZgotICAgICAgICB9Ci0KLSAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18xKQotICAgICAgICB7Ci0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9JTlQzMikpOwotI2Vsc2UKLSAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7Ci0jZW5kaWYKLSAgICAgICAgfQotCi0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZGYXN0RGF0YSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogUGVyc2lzdGVudCBmYXN0IGNvZWZmaWNpZW50IG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdENvZWYsIHNpemVvZihMVlJFVl9GYXN0Q29lZl9zdCkpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmRmFzdENvZWYpOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlR5cGUgICAgICAgICA9IExWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRjsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFRlbXBvcmFyeSBmYXN0IG1lbW9yeQotICAgICAgICAgKi8KLSNpZm5kZWYgQlVJTERfRkxPQVQKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgICAgIC8qIEdlbmVyYWwgcHVycG9zZSBzY3JhdGNoIG1lbW9yeSAqLwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIDIqc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgICAgLyogTW9uby0+c3RlcmVvIGlucHV0IHNhdmVkIGZvciBlbmQgbWl4ICovCi0jZWxzZQotICAgICAgICAvKiBHZW5lcmFsIHB1cnBvc2Ugc2NyYXRjaCBtZW1vcnkgKi8KLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7Ci0gICAgICAgIC8qIE1vbm8tPnN0ZXJlbyBpbnB1dCBzYXZlZCBmb3IgZW5kIG1peCAqLwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIDIgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7Ci0jZW5kaWYKLSAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoaT0wOyBpPDQ7IGkrKykKLSAgICAgICAgICAgIHsKLSNpZm5kZWYgQlVJTERfRkxPQVQKLSAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fSU5UMzIpICogTWF4QmxvY2tTaXplKTsgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KLSNlbHNlCi0gICAgICAgICAgICAgICAgLyogQSBTY3JhdGNoIGJ1ZmZlciBmb3IgZWFjaCBkZWxheSBsaW5lICovCi0gICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7Ci0jZW5kaWYKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKLSAgICAgICAgewotICAgICAgICAgICAgZm9yKGk9MDsgaTwyOyBpKyspCi0gICAgICAgICAgICB7Ci0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0lOVDMyKSAqIE1heEJsb2NrU2l6ZSk7ICAgICAgLyogQSBTY3JhdGNoIGJ1ZmZlciBmb3IgZWFjaCBkZWxheSBsaW5lICovCi0jZWxzZQotICAgICAgICAgICAgICAgIC8qIEEgU2NyYXRjaCBidWZmZXIgZm9yIGVhY2ggZGVsYXkgbGluZSAqLwotICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9GTE9BVCkgKiBNYXhCbG9ja1NpemUpOwotI2VuZGlmCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcihpPTA7IGk8MTsgaSsrKQotICAgICAgICAgICAgewotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9JTlQzMikgKiBNYXhCbG9ja1NpemUpOyAgICAgIC8qIEEgU2NyYXRjaCBidWZmZXIgZm9yIGVhY2ggZGVsYXkgbGluZSAqLwotI2Vsc2UKLSAgICAgICAgICAgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KLSAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fRkxPQVQpICogTWF4QmxvY2tTaXplKTsKLSNlbmRpZgotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJlRlbXBvcmFyeSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uVHlwZSAgICAgICAgID0gTFZNX1RFTVBPUkFSWV9GQVNUOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIExWUkVWX0luc3RhbmNlX3N0ICAgKnBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0ICopaEluc3RhbmNlOwotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogUmVhZCBiYWNrIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlCi0gICAgICAgICAqLwotICAgICAgICAqcE1lbW9yeVRhYmxlID0gcExWUkVWX1ByaXZhdGUtPk1lbW9yeVRhYmxlOwotICAgIH0KLQotCi0gICAgcmV0dXJuKExWUkVWX1NVQ0NFU1MpOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0TWVtb3J5VGFibGUuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfR2V0TWVtb3J5VGFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1OTkzM2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9HZXRNZW1vcnlUYWJsZS5jcHAKQEAgLTAsMCArMSwyNDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiTFZSRVZfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkluc3RBbGxvYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWUkVWX0dldE1lbW9yeVRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCisvKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICAgICAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCBhbGxvY2F0ZWQgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgYWRkcmVzc2VzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSB0aGUgbWVtb3J5ICAgICAgKi8KKy8qICBiYXNlIGFkZHJlc3MgcG9pbnRlcnMgYXJlIE5VTEwgb24gcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSBtZW1vcnkgICAgICAgKi8KKy8qICB0YWJsZSByZXR1cm5zIHRoZSBhbGxvY2F0ZWQgbWVtb3J5IGFuZCBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluc3RhbmNlUGFyYW1zICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZSRVZfU3VjY2VzcyAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIHBNZW1vcnlUYWJsZSBpcyBOVUxMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX05VTExBRERSRVNTICAgICAgIFdoZW4gcmVxdWVzdGluZyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCBwSW5zdGFuY2VQYXJhbXMgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgTlVMTCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVlJFVl9Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfR2V0TWVtb3J5VGFibGUoTFZSRVZfSGFuZGxlX3QgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9NZW1vcnlUYWJsZV9zdCAgICAgKnBNZW1vcnlUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9JbnN0YW5jZVBhcmFtc19zdCAgKnBJbnN0YW5jZVBhcmFtcykKK3sKKworICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIFNsb3dEYXRhOworICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIEZhc3REYXRhOworICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIEZhc3RDb2VmOworICAgIElOU1RfQUxMT0MgICAgICAgICAgICAgIFRlbXBvcmFyeTsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBpOworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE1heEJsb2NrU2l6ZTsKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKKyAgICAgKi8KKyAgICAvKiBDaGVjayBmb3IgTlVMTCBwb2ludGVyICovCisgICAgaWYgKHBNZW1vcnlUYWJsZSA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybihMVlJFVl9OVUxMQUREUkVTUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayBhbGwgaW5zdGFuY2UgcGFyYW1ldGVycyBhcmUgaW4gcmFuZ2UKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlUGFyYW1zICE9IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQ2FsbCBmb3IgbWVtb3J5IGFsbG9jYXRpb24sIHNvIGNoZWNrIHRoZSBwYXJhbWV0ZXJzCisgICAgICAgICAqLworICAgICAgICAvKiBDaGVjayBmb3IgYSBub24temVybyBibG9jayBzaXplICovCisgICAgICAgIGlmIChwSW5zdGFuY2VQYXJhbXMtPk1heEJsb2NrU2l6ZSA9PSAwKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENoZWNrIGZvciBhIHZhbGlkIG51bWJlciBvZiBkZWxheSBsaW5lcyAqLworICAgICAgICBpZiAoKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzICE9IExWUkVWX0RFTEFZTElORVNfMSkgJiYKKyAgICAgICAgICAgIChwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyAhPSBMVlJFVl9ERUxBWUxJTkVTXzIpICYmCisgICAgICAgICAgICAocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgIT0gTFZSRVZfREVMQVlMSU5FU180KSkKKyAgICAgICAgeworICAgICAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIEluc3RBbGxvYyBpbnN0YW5jZXMKKyAgICAgKi8KKyAgICBJbnN0QWxsb2NfSW5pdCgmU2xvd0RhdGEsICAodm9pZCAqKUxWTV9OVUxMKTsKKyAgICBJbnN0QWxsb2NfSW5pdCgmRmFzdERhdGEsICAodm9pZCAqKUxWTV9OVUxMKTsKKyAgICBJbnN0QWxsb2NfSW5pdCgmRmFzdENvZWYsICAodm9pZCAqKUxWTV9OVUxMKTsKKyAgICBJbnN0QWxsb2NfSW5pdCgmVGVtcG9yYXJ5LCAodm9pZCAqKUxWTV9OVUxMKTsKKworICAgIC8qCisgICAgICogRmlsbCBpbiB0aGUgbWVtb3J5IHRhYmxlCisgICAgICovCisgICAgaWYgKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIENoZWNrIGZvciBudWxsIHBvaW50ZXJzCisgICAgICAgICAqLworICAgICAgICBpZiAocEluc3RhbmNlUGFyYW1zID09IExWTV9OVUxMKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4oTFZSRVZfTlVMTEFERFJFU1MpOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2VsZWN0IHRoZSBtYXhpbXVtIGludGVybmFsIGJsb2NrIHNpemUKKyAgICAgICAgICovCisgICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09TFZSRVZfREVMQVlMSU5FU180KQorICAgICAgICB7CisgICAgICAgICAgICBNYXhCbG9ja1NpemUgPSBMVlJFVl9NQVhfQVAzX0RFTEFZOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT1MVlJFVl9ERUxBWUxJTkVTXzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIE1heEJsb2NrU2l6ZSA9IExWUkVWX01BWF9BUDFfREVMQVk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBNYXhCbG9ja1NpemUgPSBMVlJFVl9NQVhfQVAwX0RFTEFZOworICAgICAgICB9CisKKyAgICAgICAgaWYoTWF4QmxvY2tTaXplPnBJbnN0YW5jZVBhcmFtcy0+TWF4QmxvY2tTaXplKQorICAgICAgICB7CisgICAgICAgICAgICBNYXhCbG9ja1NpemU9cEluc3RhbmNlUGFyYW1zLT5NYXhCbG9ja1NpemU7CisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBTbG93IGRhdGEgbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZTbG93RGF0YSwgc2l6ZW9mKExWUkVWX0luc3RhbmNlX3N0KSk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZTbG93RGF0YSk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX1NMT1dfREFUQV0uVHlwZSAgICAgICAgID0gTFZNX1BFUlNJU1RFTlRfU0xPV19EQVRBOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgICAgIC8qCisgICAgICAgICAqIFBlcnNpc3RlbnQgZmFzdCBkYXRhIG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIHNpemVvZihMVlJFVl9GYXN0RGF0YV9zdCkpOworICAgICAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCisgICAgICAgIHsKKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDNfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QyX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdERhdGEsIExWUkVWX01BWF9UMV9ERUxBWSAqIHNpemVvZihMVk1fRkxPQVQpKTsKKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDBfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgIH0KKworICAgICAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpCisgICAgICAgIHsKKyAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkZhc3REYXRhLCBMVlJFVl9NQVhfVDFfREVMQVkgKiBzaXplb2YoTFZNX0ZMT0FUKSk7CisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICB9CisKKyAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18xKQorICAgICAgICB7CisgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZGYXN0RGF0YSwgTFZSRVZfTUFYX1QwX0RFTEFZICogc2l6ZW9mKExWTV9GTE9BVCkpOworICAgICAgICB9CisKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkZhc3REYXRhKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVk1fUEVSU0lTVEVOVF9GQVNUX0RBVEE7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogUGVyc2lzdGVudCBmYXN0IGNvZWZmaWNpZW50IG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmRmFzdENvZWYsIHNpemVvZihMVlJFVl9GYXN0Q29lZl9zdCkpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmRmFzdENvZWYpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlR5cGUgICAgICAgICA9IExWTV9QRVJTSVNURU5UX0ZBU1RfQ09FRjsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBUZW1wb3JhcnkgZmFzdCBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIC8qIEdlbmVyYWwgcHVycG9zZSBzY3JhdGNoIG1lbW9yeSAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fRkxPQVQpICogTWF4QmxvY2tTaXplKTsKKyAgICAgICAgLyogTW9uby0+c3RlcmVvIGlucHV0IHNhdmVkIGZvciBlbmQgbWl4ICovCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgMiAqIHNpemVvZihMVk1fRkxPQVQpICogTWF4QmxvY2tTaXplKTsKKyAgICAgICAgaWYocEluc3RhbmNlUGFyYW1zLT5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgICAgICB7CisgICAgICAgICAgICBmb3IoaT0wOyBpPDQ7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvKiBBIFNjcmF0Y2ggYnVmZmVyIGZvciBlYWNoIGRlbGF5IGxpbmUgKi8KKyAgICAgICAgICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZUZW1wb3JhcnksIHNpemVvZihMVk1fRkxPQVQpICogTWF4QmxvY2tTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmKHBJbnN0YW5jZVBhcmFtcy0+TnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKKyAgICAgICAgeworICAgICAgICAgICAgZm9yKGk9MDsgaTwyOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLyogQSBTY3JhdGNoIGJ1ZmZlciBmb3IgZWFjaCBkZWxheSBsaW5lICovCisgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmVGVtcG9yYXJ5LCBzaXplb2YoTFZNX0ZMT0FUKSAqIE1heEJsb2NrU2l6ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZihwSW5zdGFuY2VQYXJhbXMtPk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzEpCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvcihpPTA7IGk8MTsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIEEgU2NyYXRjaCBidWZmZXIgZm9yIGVhY2ggZGVsYXkgbGluZSAqLworICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJlRlbXBvcmFyeSwgc2l6ZW9mKExWTV9GTE9BVCkgKiBNYXhCbG9ja1NpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZNX1RFTVBPUkFSWV9GQVNUXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJlRlbXBvcmFyeSk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWTV9URU1QT1JBUllfRkFTVF0uVHlwZSAgICAgICAgID0gTFZNX1RFTVBPUkFSWV9GQVNUOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVk1fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIExWUkVWX0luc3RhbmNlX3N0ICAgKnBMVlJFVl9Qcml2YXRlID0gKExWUkVWX0luc3RhbmNlX3N0ICopaEluc3RhbmNlOworCisgICAgICAgIC8qCisgICAgICAgICAqIFJlYWQgYmFjayBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZQorICAgICAgICAgKi8KKyAgICAgICAgKnBNZW1vcnlUYWJsZSA9IHBMVlJFVl9Qcml2YXRlLT5NZW1vcnlUYWJsZTsKKyAgICB9CisKKyAgICByZXR1cm4oTFZSRVZfU1VDQ0VTUyk7Cit9CisKKy8qIEVuZCBvZiBmaWxlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcml2YXRlLmgKaW5kZXggZmY3NDc1ZS4uMmMyN2M2ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1ByaXZhdGUuaApAQCAtMTgsMTEgKzE4LDYgQEAKICNpZm5kZWYgX19MVlJFVl9QUklWQVRFX0hfXwogI2RlZmluZSBfX0xWUkVWX1BSSVZBVEVfSF9fCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zNiw0MyArMzEsMjIgQEAKICNpbmNsdWRlICJNaXhlci5oIgogI2luY2x1ZGUgIkxWTV9NYWNyb3MuaCIKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIERlZmluZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBCVUlMRF9GTE9BVAotLyogR2VuZXJhbCAqLwotI2RlZmluZSBPTkVfT1ZFUl9TUVJUX1RXTyAgICAgICAgICAgICAgIDIzMTcwICAgICAgICAgICAvKiAxL3NxcnQoMikgKiAyXjE1ICovCi0jZGVmaW5lIExWUkVWX0JfOF9vbl8xMDAwICAgICAgICAgICAgMTcxNzk4NjkgICAgICAgICAgIC8qIDAuOCAqIDJeMzEgKi8KLSNkZWZpbmUgTFZSRVZfSEVBRFJPT00gICAgICAgICAgICAgICAgICAgODE5MiAgICAgICAgICAgLyogLTEyZEIgKiAyXjE1ICovCi0jZGVmaW5lIExWUkVWXzJfOV9JTlEyOSAgICAgICAgICAgMTU4Mzc2OTE5MEwgICAgICAgICAgIC8qIDIuOSBpbiBRMjkgZm9ybWF0ICovCi0jZGVmaW5lIExWUkVWX01JTjNEQiAgICAgICAgICAgICAgICAgICAweDVBODIgICAgICAgICAgIC8qIC0zZEIgaW4gUTE1IGZvcm1hdCAqLwotI2Vsc2UKIC8qIEdlbmVyYWwgKi8KICNkZWZpbmUgT05FX09WRVJfU1FSVF9UV08gICAgICAgICAgICAwLjcwNzEwN2YgICAgICAgICAgIC8qIDEvc3FydCgyKSAqIDJeMTUgKi8KICNkZWZpbmUgTFZSRVZfQl84X29uXzEwMDAgICAgICAgICAgICAgICAwLjAwOGYgICAgICAgICAgIC8qIDAuOCAqIDJeMzEgKi8KICNkZWZpbmUgTFZSRVZfSEVBRFJPT00gICAgICAgICAgICAgICAgICAgMC4yNWYgICAgICAgICAgIC8qIC0xMmRCICogMl4xNSAqLwogI2RlZmluZSBMVlJFVl8yXzlfSU5RMjkgICAgICAgICAgICAgICAgICAgMi45ZiAgICAgICAgICAgLyogMi45IGluIFEyOSBmb3JtYXQgKi8KICNkZWZpbmUgTFZSRVZfTUlOM0RCICAgICAgICAgICAgICAgIDAuNzA3OTQ1N2YgICAgICAgICAgIC8qIC0zZEIgaW4gUTE1IGZvcm1hdCAqLwotI2VuZGlmCiAKIC8qIEludGVuYWwgY29uc3RhbnRzICovCiAjZGVmaW5lIExWUkVWX0xQX1BvbHlfT3JkZXIgICAgICAgICAgICAgICAgIDQKICNkZWZpbmUgTFZSRVZfTFBfUG9seV9TaGlmdCAgICAgICAgICAgICAgICAgNQogCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0jZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8wX29uXzQgICAgICAgICAgMzI3NjgKLSNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyXzFfb25fNCAgICAgICAgICA0MzEyNQotI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfMl9vbl80ICAgICAgICAgIDU2NzU1Ci0jZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8zX29uXzQgICAgICAgICAgNzQ2OTQKLSNkZWZpbmUgTFZSRVZfVDYwX1NDQUxFICAgICAgICAgICAgICAgIDMwNjc3NCAgICAgICAgICAgLyooMzI3NjcvNzAwMCk8PDE2ICovCi0jZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCAgICAgMzI3NjcgICAgICAgICAgIC8qIDNeKC0wLzQpICogMl4xNSAqLwotI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQgICAgIDI0ODk4ICAgICAgICAgICAvKiAzXigtMS80KSAqIDJeMTUgKi8KLSNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzMl9vbl80ICAgICAxODkxOSAgICAgICAgICAgLyogM14oLTIvNCkgKiAyXjE1ICovCi0jZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czNfb25fNCAgICAgMTQzNzUgICAgICAgICAgIC8qIDNeKC0zLzQpICogMl4xNSAqLwotI2Vsc2UvKkJVSUxEX0ZMT0FUKi8KICNkZWZpbmUgTFZSRVZfVDYwX1NDQUxFICAgICAgICAgICAgICAgIDAuMDAwMTQyZiAgICAgICAgICAgLyooMS83MDAwKSAqLwogCiAjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl8wX29uXzQgICAgICAgICAgICAgIDEuMGYKQEAgLTgzLDE4ICs1Nyw3IEBACiAjZGVmaW5lIExWUkVWX1RfM19Qb3dlcl9taW51czFfb25fNCAgICAwLjc1OTgzNmYgICAgICAgIC8qIDNeKC0xLzQpICogMl4xNSAqLwogI2RlZmluZSBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQgICAgMC41NzczNTBmICAgICAgICAvKiAzXigtMi80KSAqIDJeMTUgKi8KICNkZWZpbmUgTFZSRVZfVF8zX1Bvd2VyX21pbnVzM19vbl80ICAgIDAuNDM4NjkxZiAgICAgICAgLyogM14oLTMvNCkgKiAyXjE1ICovCi0jZW5kaWYKIAotI2lmbmRlZiBISUdIRVJfRlMKLSNkZWZpbmUgTFZSRVZfTUFYX1QzX0RFTEFZICAgICAgICAgICAgICAgIDI1MjcgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX1QyX0RFTEFZICAgICAgICAgICAgICAgIDMzMjYgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX1QxX0RFTEFZICAgICAgICAgICAgICAgIDQzNzcgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX1QwX0RFTEFZICAgICAgICAgICAgICAgIDU3NjAgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX0FQM19ERUxBWSAgICAgICAgICAgICAgIDE2ODUgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX0FQMl9ERUxBWSAgICAgICAgICAgICAgIDIyMTggICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMyX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX0FQMV9ERUxBWSAgICAgICAgICAgICAgIDI5MTggICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMxX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KLSNkZWZpbmUgTFZSRVZfTUFYX0FQMF9ERUxBWSAgICAgICAgICAgICAgIDM4NDAgICAgICAgICAgIC8qICgoNDgwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMwX29uXzQpID4+IDE1KSAvIDE1MDAgKi8KLSNlbHNlCiAgICAgLyogKCgxOTIwMDAgKiAxMjAgKiBMVlJFVl9UXzNfUG93ZXJfbWludXMzX29uXzQpID4+IDE1KSAvIDEwMDAgKi8KICNkZWZpbmUgTFZSRVZfTUFYX1QzX0RFTEFZICAgICAgICAgICAgICAgMTAxMDgKICAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czJfb25fNCkgPj4gMTUpIC8gMTAwMCAqLwpAQCAtMTExLDcgKzc0LDYgQEAKICNkZWZpbmUgTFZSRVZfTUFYX0FQMV9ERUxBWSAgICAgICAgICAgICAgMTE2NzIKICAgICAvKiAoKDE5MjAwMCAqIDEyMCAqIExWUkVWX1RfM19Qb3dlcl9taW51czBfb25fNCkgPj4gMTUpIC8gMTUwMCAqLwogI2RlZmluZSBMVlJFVl9NQVhfQVAwX0RFTEFZICAgICAgICAgICAgICAxNTM2MAotI2VuZGlmCiAKICNkZWZpbmUgTFZSRVZfQllQQVNTTUlYRVJfVEMgICAgICAgICAgICAgMTAwMCAgICAgICAgICAgLyogQnlwYXNzIG1peGVyIHRpbWUgY29uc3RhbnQqLwogI2RlZmluZSBMVlJFVl9BTExQQVNTX1RDICAgICAgICAgICAgICAgICAxMDAwICAgICAgICAgICAvKiBBbGwtcGFzcyBmaWx0ZXIgdGltZSBjb25zdGFudCAqLwpAQCAtMTIwLDExICs4Miw3IEBACiAjZGVmaW5lIExWUkVWX09VVFBVVEdBSU5fU0hJRlQgICAgICAgICAgICAgIDUgICAgICAgICAgIC8qIEJpdHMgc2hpZnQgZm9yIG91dHB1dCBnYWluIGNvcnJlY3Rpb24gKi8KIAogLyogUGFyYW1ldGVyIGxpbWl0cyAqLwotI2lmbmRlZiBISUdIRVJfRlMKLSNkZWZpbmUgTFZSRVZfTlVNX0ZTICAgICAgICAgICAgICAgICAgICAgICAgOSAgICAgICAgICAgLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgKi8KLSNlbHNlCi0jZGVmaW5lIExWUkVWX05VTV9GUyAgICAgICAgICAgICAgICAgICAgICAgMTEgICAgICAgICAgIC8qIE51bWJlciBvZiBzdXBwb3J0ZWQgc2FtcGxlIHJhdGVzICovCi0jZW5kaWYKKyNkZWZpbmUgTFZSRVZfTlVNX0ZTICAgICAgICAgICAgICAgICAgICAgICAxMyAgICAgICAgICAgLyogTnVtYmVyIG9mIHN1cHBvcnRlZCBzYW1wbGUgcmF0ZXMgKi8KIAogI2RlZmluZSBMVlJFVl9NQVhCTEtTSVpFX0xJTUlUICAgICAgICAgICAgIDY0ICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgbG93IGxpbWl0ICovCiAjZGVmaW5lIExWUkVWX01BWF9MRVZFTCAgICAgICAgICAgICAgICAgICAxMDAgICAgICAgICAgIC8qIE1heGltdW0gbGV2ZWwsIDEwMCUgKi8KQEAgLTEzNyw4MSArOTUsMTEgQEAKICNkZWZpbmUgTFZSRVZfTUFYX0RBTVBJTkcgICAgICAgICAgICAgICAgIDEwMCAgICAgICAgICAgLyogTWF4aW11bSBkYW1waW5nLCAxMDAlICovCiAjZGVmaW5lIExWUkVWX01BWF9ST09NU0laRSAgICAgICAgICAgICAgICAxMDAgICAgICAgICAgIC8qIE1heGltdW0gcm9vbSBzaXplLCAxMDAlICovCiAKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmbmRlZiBCVUlMRF9GTE9BVAotLyogRmFzdCBkYXRhIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLQotICAgIEJpcXVhZF8xSV9PcmRlcjFfVGFwc190IEhQVGFwczsgICAgICAgICAgICAgICAgICAgICAvKiBIaWdoIHBhc3MgZmlsdGVyIHRhcHMgKi8KLSAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCBMUFRhcHM7ICAgICAgICAgICAgICAgICAgICAgLyogTG93IHBhc3MgZmlsdGVyIHRhcHMgKi8KLSAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCBSZXZMUFRhcHNbNF07ICAgICAgICAgICAgICAgLyogUmV2ZXJiIGxvdyBwYXNzIGZpbHRlcnMgdGFwcyAqLwotCi19IExWUkVWX0Zhc3REYXRhX3N0OwotCi0KLS8qIEZhc3QgY29lZmZpY2llbnQgc3RydWN0dXJlICovCi10eXBlZGVmIHN0cnVjdAotewotCi0gICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgSFBDb2VmczsgICAgICAgICAgICAgICAgICAgIC8qIEhpZ2ggcGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCi0gICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgTFBDb2VmczsgICAgICAgICAgICAgICAgICAgIC8qIExvdyBwYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLSAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBSZXZMUENvZWZzWzRdOyAgICAgICAgICAgICAgLyogUmV2ZXJiIGxvdyBwYXNzIGZpbHRlcnMgY29lZmZpY2llbnRzICovCi0KLX0gTFZSRVZfRmFzdENvZWZfc3Q7Ci0KLQotLyogSW5zdGFuY2UgcGFyYW1ldGVyIHN0cnVjdHVyZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKiBHZW5lcmFsICovCi0gICAgTFZSRVZfSW5zdGFuY2VQYXJhbXNfc3QgSW5zdGFuY2VQYXJhbXM7ICAgICAgICAgICAgIC8qIEluaXRpYWxpc2F0aW9uIHRpbWUgaW5zdGFuY2UgcGFyYW1ldGVycyAqLwotICAgIExWUkVWX01lbW9yeVRhYmxlX3N0ICAgIE1lbW9yeVRhYmxlOyAgICAgICAgICAgICAgICAvKiBNZW1vcnkgdGFibGUgKi8KLSAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICBDdXJyZW50UGFyYW1zOyAgICAgICAgICAgICAgLyogUGFyYW1ldGVycyBiZWluZyB1c2VkICovCi0gICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgTmV3UGFyYW1zOyAgICAgICAgICAgICAgICAgIC8qIE5ldyBwYXJhbWV0ZXJzIGZyb20gdGhlIGNhbGxpbmcgYXBwbGljYXRpb24gKi8KLSAgICBMVk1fQ0hBUiAgICAgICAgICAgICAgICBiQ29udHJvbFBlbmRpbmc7ICAgICAgICAgICAgLyogRmxhZyB0byBpbmRpY2F0ZSBuZXcgcGFyYW1ldGVycyBhcmUgYXZhaWxhYmxlICovCi0gICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgYkZpcnN0Q29udHJvbDsgICAgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgY29udHJvbCBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIHRoZSBmaXJzdCB0aW1lICovCi0gICAgTFZNX0NIQVIgICAgICAgICAgICAgICAgYkRpc2FibGVSZXZlcmI7ICAgICAgICAgICAgIC8qIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbWl4IGxldmVsIGlzIDAlIGFuZCB0aGUgcmV2ZXJiIGNhbiBiZSBkaXNhYmxlZCAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIFJvb21TaXplSW5tczsgICAgICAgICAgICAgICAvKiBSb29tIHNpemUgaW4gbXNlYyAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIE1heEJsa0xlbjsgICAgICAgICAgICAgICAgICAvKiBNYXhpbXVtIGJsb2NrIHNpemUgZm9yIGludGVybmFsIHByb2Nlc3NpbmcgKi8KLQotICAgIC8qIEFsaWduZWQgbWVtb3J5IHBvaW50ZXJzICovCi0gICAgTFZSRVZfRmFzdERhdGFfc3QgICAgICAgKnBGYXN0RGF0YTsgICAgICAgICAgICAgICAgIC8qIEZhc3QgZGF0YSBtZW1vcnkgYmFzZSBhZGRyZXNzICovCi0gICAgTFZSRVZfRmFzdENvZWZfc3QgICAgICAgKnBGYXN0Q29lZjsgICAgICAgICAgICAgICAgIC8qIEZhc3QgY29lZmZpY2llbnQgbWVtb3J5IGJhc2UgYWRkcmVzcyAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwU2NyYXRjaERlbGF5TGluZVs0XTsgICAgICAvKiBEZWxheSBsaW5lIHNjcmF0Y2ggbWVtb3J5ICovCi0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgKnBTY3JhdGNoOyAgICAgICAgICAgICAgICAgIC8qIE11bHRpIHVzc2dlIHNjcmF0Y2ggKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAqcElucHV0U2F2ZTsgICAgICAgICAgICAgICAgLyogUmV2ZXJiIGJsb2NrIGlucHV0IHNhdmUgZm9yIGRyeS93ZXQgbWl4aW5nKi8KLQotICAgIC8qIEZlZWRiYWNrIG1hdHJpeCAqLwotICAgIE1peF8xU3RfQ2xsX3QgICAgICAgICAgIEZlZWRiYWNrTWl4ZXJbNF07ICAgICAgICAgICAvKiBNaXhlciBmb3IgUG9wIGFuZCBDbGljayBTdXByZXNzaW9uIGNhdXNlZCBieSBmZWVkYmFjayBHYWluICovCi0KLSAgICAvKiBBbGwtUGFzcyBGaWx0ZXIgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBUWzRdOyAgICAgICAgICAgICAgICAgICAgICAgLyogTWF4aW11bSBkZWxheSBzaXplIG9mIGJ1ZmZlciAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwRGVsYXlfVFs0XTsgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIGRlbGF5IGJ1ZmZlcnMgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBEZWxheV9BUFs0XTsgICAgICAgICAgICAgICAgLyogT2Zmc2V0IHRvIEFQIGRlbGF5IGJ1ZmZlciBzdGFydCAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEFCX1NlbGVjdGlvbjsgICAgICAgICAgICAgICAvKiBTbW9vdGggZnJvbSB0YXAgQSB0byBCIHdoZW4gMSBvdGhlcndpc2UgQiB0byBBICovCi0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQV9EZWxheVNpemVbNF07ICAgICAgICAgICAgIC8qIEEgZGVsYXkgbGVuZ3RoIGluIHNhbXBsZXMgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBCX0RlbGF5U2l6ZVs0XTsgICAgICAgICAgICAgLyogQiBkZWxheSBsZW5ndGggaW4gc2FtcGxlcyAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwT2Zmc2V0QVs0XTsgICAgICAgICAgICAgICAvKiBPZmZzZXQgZm9yIHRoZSBBIGRlbGF5IHRhcCAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICpwT2Zmc2V0Qls0XTsgICAgICAgICAgICAgICAvKiBPZmZzZXQgZm9yIHRoZSBCIGRlbGF5IHRhcCAqLwotICAgIE1peF8yU3RfQ2xsX3QgICAgICAgICAgIE1peGVyX0FQVGFwc1s0XTsgICAgICAgICAgICAvKiBTbW9vdGhlZCBBUCBkZWxheSBtaXhlciAqLwotICAgIE1peF8xU3RfQ2xsX3QgICAgICAgICAgIE1peGVyX1NHRmVlZGJhY2tbNF07ICAgICAgICAvKiBTbW9vdGhlZCBTQWZlZWRiYWNrIGdhaW4gKi8KLSAgICBNaXhfMVN0X0NsbF90ICAgICAgICAgICBNaXhlcl9TR0ZlZWRmb3J3YXJkWzRdOyAgICAgLyogU21vb3RoZWQgQVAgZmVlZGZvcndhcmQgZ2FpbiAqLwotCi0gICAgLyogT3V0cHV0IGdhaW4gKi8KLSAgICBNaXhfMlN0X0NsbF90ICAgICAgICAgICBCeXBhc3NNaXhlcjsgICAgICAgICAgICAgICAgLyogRHJ5L3dldCBtaXhlciAqLwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEdhaW47ICAgICAgICAgICAgICAgICAgICAgICAvKiBHYWluIGFwcGxpZWQgdG8gb3V0cHV0IHRvIG1haW50YWluIGF2ZXJhZ2Ugc2lnbmFsIHBvd2VyICovCi0gICAgTWl4XzFTdF9DbGxfdCAgICAgICAgICAgR2Fpbk1peGVyOyAgICAgICAgICAgICAgICAgIC8qIEdhaW4gc21vb3RoaW5nICovCi0KLX0gTFZSRVZfSW5zdGFuY2Vfc3Q7Ci0KLSNlbHNlIC8qIEJVSUxEX0ZMT0FUICovCiAKIC8qIEZhc3QgZGF0YSBzdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CkBAIC0yMjIsNyArMTEwLDYgQEAKIAogfSBMVlJFVl9GYXN0RGF0YV9zdDsKIAotCiAvKiBGYXN0IGNvZWZmaWNpZW50IHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKQEAgLTI2Miw3ICsxNDksNiBAQAogICAgIE1peF8xU3RfQ2xsX0ZMT0FUX3QgICAgIEZlZWRiYWNrTWl4ZXJbNF07ICAgICAgICAgLyogTWl4ZXIgZm9yIFBvcCBhbmQgQ2xpY2sgU3VwcmVzc2lvbiBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXVzZWQgYnkgZmVlZGJhY2sgR2FpbiAqLwogCi0KICAgICAvKiBBbGwtUGFzcyBGaWx0ZXIgKi8KICAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBUWzRdOyAgICAgICAgICAgICAgICAgICAgIC8qIE1heGltdW0gZGVsYXkgc2l6ZSBvZiBidWZmZXIgKi8KICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcERlbGF5X1RbNF07ICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gZGVsYXkgYnVmZmVycyAqLwpAQCAtMjg1LDcgKzE3MSw2IEBACiAKIH0gTFZSRVZfSW5zdGFuY2Vfc3Q7CiAKLSNlbmRpZgogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBGdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjkzLDI2ICsxNzgsMTQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCiBMVlJFVl9SZXR1cm5TdGF0dXNfZW4gICBMVlJFVl9BcHBseU5ld1NldHRpbmdzKExWUkVWX0luc3RhbmNlX3N0ICAgICAqcFByaXZhdGUpOwotI2lmZGVmIEJVSUxEX0ZMT0FUCiB2b2lkICAgICAgICAgICAgICAgICAgICBSZXZlcmJCbG9jayhMVk1fRkxPQVQgICAgICAgICAgICpwSW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwT3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfSW5zdGFuY2Vfc3QgICAqcFByaXZhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgIE51bVNhbXBsZXMpOwotI2Vsc2UKLXZvaWQgICAgICAgICAgICAgICAgICAgIFJldmVyYkJsb2NrKExWTV9JTlQzMiAgICAgICAgICAgKnBJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQzMiAgICAgICAgICAgKnBPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlJFVl9JbnN0YW5jZV9zdCAgICpwUHJpdmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0jZW5kaWYKIExWTV9JTlQzMiAgICAgICAgICAgICAgIEJ5cGFzc01peGVyX0NhbGxiYWNrKHZvaWQgICAgICAgKnBDYWxsYmFja0RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICpwR2VuZXJhbFB1cnBvc2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIEdlbmVyYWxQdXJwb3NlICk7CiAKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKLQogI2VuZGlmICAvKiogX19MVlJFVl9QUklWQVRFX0hfXyAqKi8KIAogLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1Byb2Nlc3MuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY2ZDg0Zi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw4MjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJMVlJFVl9Qcml2YXRlLmgiCi0jaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZSRVZfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUHJvY2VzcyBmdW5jdGlvbiBmb3IgdGhlIExWUkVWIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwSW5EYXRhICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBPdXREYXRhICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIGlucHV0IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZSRVZfU3VjY2VzcyAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlJFVl9JTlZBTElETlVNU0FNUExFUyBOdW1TYW1wbGVzIHdhcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBibG9jayBzaXplICAgICAgICAgICAqLwotLyogIExWUkVWX05VTExBRERSRVNTICAgICAgIFdoZW4gb25lIG9mIGhJbnN0YW5jZSwgcEluRGF0YSBvciBwT3V0RGF0YSBpcyBOVUxMICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuIFRoZSBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgbXVzdCBiZSAzMi1iaXQgYWxpZ25lZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi1MVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfUHJvY2VzcyhMVlJFVl9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9VSU5UMTYgICAgTnVtU2FtcGxlcykKLSNlbHNlCi1MVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfUHJvY2VzcyhMVlJFVl9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQzMiAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMzIgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9VSU5UMTYgICAgTnVtU2FtcGxlcykKLSNlbmRpZgotewotICAgTFZSRVZfSW5zdGFuY2Vfc3QgICAgICpwTFZSRVZfUHJpdmF0ZSA9IChMVlJFVl9JbnN0YW5jZV9zdCAqKWhJbnN0YW5jZTsKLSNpZmRlZiBCVUlMRF9GTE9BVAotICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwSW5wdXQgID0gKExWTV9GTE9BVCAqKXBJbkRhdGE7Ci0gICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXRwdXQgPSBwT3V0RGF0YTsKLSNlbHNlCi0gICBMVk1fSU5UMzIgICAgICAgICAgICAgKnBJbnB1dCAgPSAoTFZNX0lOVDMyICopcEluRGF0YTsKLSAgIExWTV9JTlQzMiAgICAgICAgICAgICAqcE91dHB1dCA9IHBPdXREYXRhOwotI2VuZGlmCi0gICBMVk1fSU5UMzIgICAgICAgICAgICAgU2FtcGxlc1RvUHJvY2VzcywgUmVtYWluaW5nU2FtcGxlczsKLSAgIExWTV9JTlQzMiAgICAgICAgICAgICBmb3JtYXQgPSAxOwotCi0gICAgLyoKLSAgICAgKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucwotICAgICAqLwotCi0gICAgLyogQ2hlY2sgZm9yIE5VTEwgcG9pbnRlcnMgKi8KLSAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluRGF0YSA9PSBMVk1fTlVMTCkgfHwgKHBPdXREYXRhID09IExWTV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIEFwcGx5IHRoZSBuZXcgY29udHJvbHMgc2V0dGluZ3MgaWYgcmVxdWlyZWQKLSAgICAgKi8KLSAgICBpZihwTFZSRVZfUHJpdmF0ZS0+YkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKQotICAgIHsKLSAgICAgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgZXJyb3JDb2RlOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENsZWFyIHRoZSBwZW5kaW5nIGZsYWcgYW5kIHVwZGF0ZSB0aGUgY29udHJvbCBzZXR0aW5ncwotICAgICAgICAgKi8KLSAgICAgICAgcExWUkVWX1ByaXZhdGUtPmJDb250cm9sUGVuZGluZyA9IExWTV9GQUxTRTsKLQotICAgICAgICBlcnJvckNvZGUgPSBMVlJFVl9BcHBseU5ld1NldHRpbmdzIChwTFZSRVZfUHJpdmF0ZSk7Ci0KLSAgICAgICAgaWYoZXJyb3JDb2RlICE9IExWUkVWX1NVQ0NFU1MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBlcnJvckNvZGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRyYXAgdGhlIGNhc2Ugd2hlcmUgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIHplcm8uCi0gICAgICovCi0gICAgaWYgKE51bVNhbXBsZXMgPT0gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOwotICAgIH0KLQotICAgIC8qCi0gICAgICogSWYgT0ZGIGNvcHkgYW5kIHJlZm9ybWF0IHRoZSBkYXRhIGFzIG5lY2Vzc2FyeQotICAgICAqLwotICAgIGlmIChwTFZSRVZfUHJpdmF0ZS0+Q3VycmVudFBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWTV9NT0RFX09GRikKLSAgICB7Ci0gICAgICAgIGlmKHBJbnB1dCAhPSBwT3V0cHV0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogQ29weSB0aGUgZGF0YSB0byB0aGUgb3V0cHV0IGJ1ZmZlciwgY29udmVydCB0byBzdGVyZW8gaXMgcmVxdWlyZWQKLSAgICAgICAgICAgICAqLwotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgICAgICAgICAgaWYocExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKXsKLSAgICAgICAgICAgICAgICBNb25vVG8ySV8zMihwSW5wdXQsIHBPdXRwdXQsIE51bVNhbXBsZXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDb3B5XzE2KChMVk1fSU5UMTYgKilwSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPDwgMikpOyAvLyAzMiBiaXQgZGF0YSwgc3RlcmVvCi0gICAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgICAgaWYocExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKXsKLSAgICAgICAgICAgICAgICBNb25vVG8ySV9GbG9hdChwSW5wdXQsIHBPdXRwdXQsIE51bVNhbXBsZXMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIDw8IDEpKTsgLy8gMzIgYml0IGRhdGEsIHN0ZXJlbwotICAgICAgICAgICAgfQotI2VuZGlmCi0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKLSAgICB9Ci0KLSAgICBSZW1haW5pbmdTYW1wbGVzID0gKExWTV9JTlQzMilOdW1TYW1wbGVzOwotCi0gICAgaWYgKHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykKLSAgICB7Ci0gICAgICAgIGZvcm1hdCA9IDI7Ci0gICAgfQotCi0gICAgd2hpbGUgKFJlbWFpbmluZ1NhbXBsZXMhPTApCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBQcm9jZXNzIHRoZSBkYXRhCi0gICAgICAgICAqLwotCi0gICAgICAgIGlmKFJlbWFpbmluZ1NhbXBsZXMgPiAgcExWUkVWX1ByaXZhdGUtPk1heEJsa0xlbikKLSAgICAgICAgewotICAgICAgICAgICAgU2FtcGxlc1RvUHJvY2VzcyA9ICBwTFZSRVZfUHJpdmF0ZS0+TWF4QmxrTGVuOwotICAgICAgICAgICAgUmVtYWluaW5nU2FtcGxlcyA9IChMVk1fSU5UMTYpKFJlbWFpbmluZ1NhbXBsZXMgLSBTYW1wbGVzVG9Qcm9jZXNzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNhbXBsZXNUb1Byb2Nlc3MgPSBSZW1haW5pbmdTYW1wbGVzOwotICAgICAgICAgICAgUmVtYWluaW5nU2FtcGxlcyA9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBSZXZlcmJCbG9jayhwSW5wdXQsIHBPdXRwdXQsIHBMVlJFVl9Qcml2YXRlLCAoTFZNX1VJTlQxNilTYW1wbGVzVG9Qcm9jZXNzKTsKLSNpZmRlZiBCVUlMRF9GTE9BVAotICAgICAgICBwSW5wdXQgID0gKExWTV9GTE9BVCAqKShwSW5wdXQgKyAoU2FtcGxlc1RvUHJvY2VzcyAqIGZvcm1hdCkpOwotICAgICAgICBwT3V0cHV0ID0gKExWTV9GTE9BVCAqKShwT3V0cHV0ICsgKFNhbXBsZXNUb1Byb2Nlc3MgKiAyKSk7ICAgICAgLy8gQWx3YXlzIHN0ZXJlbyBvdXRwdXQKLSNlbHNlCi0gICAgICAgIHBJbnB1dCAgPSAoTFZNX0lOVDMyICopKHBJbnB1dCArKFNhbXBsZXNUb1Byb2Nlc3MqZm9ybWF0KSk7Ci0gICAgICAgIHBPdXRwdXQgPSAoTFZNX0lOVDMyICopKHBPdXRwdXQrKFNhbXBsZXNUb1Byb2Nlc3MqMikpOwotI2VuZGlmCi0gICAgfQotCi0gICAgcmV0dXJuIExWUkVWX1NVQ0NFU1M7Ci19Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIFJldmVyYkJsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFByb2Nlc3MgZnVuY3Rpb24gZm9yIHRoZSBMVlJFViBtb2R1bGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcEluRGF0YSAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwT3V0RGF0YSAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUkVWX1N1Y2Nlc3MgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZSRVZfSU5WQUxJRE5VTVNBTVBMRVMgTnVtU2FtcGxlcyB3YXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gYmxvY2sgc2l6ZSAgICAgICAgICAgKi8KLS8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIG9uZSBvZiBoSW5zdGFuY2UsIHBJbkRhdGEgb3IgcE91dERhdGEgaXMgTlVMTCAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiBUaGUgaW5wdXQgYW5kIG91dHB1dCBidWZmZXJzIG11c3QgYmUgMzItYml0IGFsaWduZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZm5kZWYgQlVJTERfRkxPQVQKLXZvaWQgUmV2ZXJiQmxvY2soTFZNX0lOVDMyICpwSW5wdXQsIExWTV9JTlQzMiAqcE91dHB1dCwgTFZSRVZfSW5zdGFuY2Vfc3QgKnBQcml2YXRlLCBMVk1fVUlOVDE2IE51bVNhbXBsZXMpCi17Ci0gICAgTFZNX0lOVDE2ICAgaiwgc2l6ZTsKLSAgICBMVk1fSU5UMzIgICAqcERlbGF5TGluZTsKLSAgICBMVk1fSU5UMzIgICAqcERlbGF5TGluZUlucHV0ID0gcFByaXZhdGUtPnBTY3JhdGNoOwotICAgIExWTV9JTlQzMiAgICpwU2NyYXRjaCA9IHBQcml2YXRlLT5wU2NyYXRjaDsKLSAgICBMVk1fSU5UMzIgICAqcEluOwotICAgIExWTV9JTlQzMiAgICpwVGVtcCA9IHBQcml2YXRlLT5wSW5wdXRTYXZlOwotICAgIExWTV9JTlQzMiAgIE51bWJlck9mRGVsYXlMaW5lczsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgKiBBbGwgY2FsY3VsYXRpb25zIHdpbGwgZ28gaW50byB0aGUgYnVmZmVyIHBvaW50ZWQgdG8gYnkgcFRlbXAsIHRoaXMgd2lsbCAgICAqCi0gICAgICogdGhlbiBiZSBtaXhlZCB3aXRoIHRoZSBvcmlnaW5hbCBpbnB1dCB0byBjcmVhdGUgdGhlIGZpbmFsIG91dHB1dC4gICAgICAgICAgKgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiBXaGVuIElOUExBQ0UgcHJvY2Vzc2luZyBpcyBzZWxlY3RlZCB0aGlzIG11c3QgYmUgYSB0ZW1wb3JhcnkgYnVmZmVyIGFuZCAgICAqCi0gICAgICogaGVuY2UgdGhpcyBpcyB0aGUgd29yc3QgY2FzZSwgc28gZm9yIHNpbXBsaWNpdHkgdGhpcyB3aWxsIEFMV0FZUyBiZSBzbyAgICAgKgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiBUaGUgaW5wdXQgYnVmZmVyIHdpbGwgcmVtYWluIHVudG91Y2hlZCB1bnRpbCB0aGUgb3V0cHV0IG9mIHRoZSBtaXhlciBpZiAgICAqCi0gICAgICogSU5QTEFDRSBwcm9jZXNzaW5nIGlzIHNlbGVjdGVkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiBUaGUgdGVtcCBidWZmZXIgd2lsbCBhbHdheXMgYmUgTnVtU2FtcGxlcyBpbiBzaXplIHJlZ2FyZGxlc3Mgb2YgTU9OTyBvciAgICAqCi0gICAgICogU1RFUkVPIGlucHV0LiBJbiB0aGUgY2FzZSBvZiBzdGVyZW8gaW5wdXQgYWxsIHByb2Nlc3NpbmcgaXMgZG9uZSBpbiBNT05PICAgKgotICAgICAqIGFuZCB0aGUgZmluYWwgb3V0cHV0IGlzIGNvbnZlcnRlZCB0byBTVEVSRU8gYWZ0ZXIgdGhlIG1peGVyICAgICAgICAgICAgICAgICoKLSAgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQgKQotICAgIHsKLSAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gNDsKLSAgICB9Ci0gICAgZWxzZSBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMiApCi0gICAgewotICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSAyOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBOdW1iZXJPZkRlbGF5TGluZXMgPSAxOwotICAgIH0KLQotICAgIGlmKHBQcml2YXRlLT5DdXJyZW50UGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTU9OTykKLSAgICB7Ci0gICAgICAgIHBJbiA9IHBJbnB1dDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogIFN0ZXJlbyB0byBtb25vIGNvbnZlcnNpb24KLSAgICAgICAgICovCi0KLSAgICAgICAgRnJvbTJpVG9Nb25vXzMyKCBwSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLQotICAgICAgICBwSW4gPSBwVGVtcDsKLSAgICB9Ci0KLSAgICBNdWx0M3NfMzJ4MTYocEluLAotICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KUxWUkVWX0hFQURST09NLAotICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLQotICAgIC8qCi0gICAgICogIEhpZ2ggcGFzcyBmaWx0ZXIKLSAgICAgKi8KLSAgICBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSggJnBQcml2YXRlLT5wRmFzdENvZWYtPkhQQ29lZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAvKgotICAgICAqICBMb3cgcGFzcyBmaWx0ZXIKLSAgICAgKi8KLSAgICBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSggJnBQcml2YXRlLT5wRmFzdENvZWYtPkxQQ29lZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLQotICAgIC8qCi0gICAgICogIFByb2Nlc3MgYWxsIGRlbGF5IGxpbmVzCi0gICAgICovCi0KLSAgICBmb3IoaiA9IDA7IGogPCBOdW1iZXJPZkRlbGF5TGluZXM7IGorKykKLSAgICB7Ci0gICAgICAgIHBEZWxheUxpbmUgPSBwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbal07Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQWxsLXBhc3MgZmlsdGVyIHdpdGggcG9wIGFuZCBjbGljayBzdXBwcmVzc2lvbgotICAgICAgICAgKi8KLSAgICAgICAgLyogR2V0IHRoZSBzbW9vdGhlZCwgZGVsYXllZCBvdXRwdXQuIFB1dCBpdCBpbiB0aGUgb3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCZwUHJpdmF0ZS0+TWl4ZXJfQVBUYXBzW2pdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QVtqXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cE9mZnNldEJbal0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgICAgICAvKiBSZS1hbGlnbiB0aGUgYWxsIHBhc3MgZmlsdGVyIGRlbGF5IGJ1ZmZlciBhbmQgY29weWluZyB0aGUgZml4ZWQgZGVsYXkgZGF0YSB0byB0aGUgQVAgZGVsYXkgaW4gdGhlIHByb2Nlc3MgKi8KLSAgICAgICAgQ29weV8xNigoTFZNX0lOVDE2ICopJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtOdW1TYW1wbGVzXSwKLSAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcFByaXZhdGUtPnBEZWxheV9UW2pdLAotICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKChwUHJpdmF0ZS0+VFtqXS1OdW1TYW1wbGVzKSA8PCAxKSk7ICAgICAgICAgLyogMzItYml0IGRhdGEgKi8KLSAgICAgICAgLyogQXBwbHkgdGhlIHNtb290aGVkIGZlZWRiYWNrIGFuZCBzYXZlIHRvIGZpeGVkIGRlbGF5IGlucHV0IChjdXJyZW50bHkgZW1wdHkpICovCi0gICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoJnBQcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2pdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXS1OdW1TYW1wbGVzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgICAgICAvKiBTdW0gaW50byB0aGUgQVAgZGVsYXkgbGluZSAqLwotICAgICAgICBNYWMzc19TYXRfMzJ4MTYoJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXS1OdW1TYW1wbGVzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIC0weDdmZmYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEludmVydCBzaW5jZSB0aGUgZmVlZGJhY2sgY29lZmZpY2llbnQgaXMgbmVnYXRpdmUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPkRlbGF5X0FQW2pdLU51bVNhbXBsZXNdLAotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgLyogQXBwbHkgc21vb3RoZWQgZmVlZGZvcndhcmQgc2FuZCBzYXZlIHRvIGZpeGVkIGRlbGF5IGlucHV0IChjdXJyZW50bHkgZW1wdHkpICovCi0gICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoJnBQcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2pdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPkRlbGF5X0FQW2pdLU51bVNhbXBsZXNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPlRbal0tTnVtU2FtcGxlc10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgLyogU3VtIGludG8gdGhlIEFQIG91dHB1dCAqLwotICAgICAgICBNYWMzc19TYXRfMzJ4MTYoJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXS1OdW1TYW1wbGVzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIDB4N2ZmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqICBGZWVkYmFjayBnYWluCi0gICAgICAgICAqLwotICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCZwUHJpdmF0ZS0+RmVlZGJhY2tNaXhlcltqXSwgcERlbGF5TGluZSwgcERlbGF5TGluZSwgTnVtU2FtcGxlcyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogIExvdyBwYXNzIGZpbHRlcgotICAgICAgICAgKi8KLSAgICAgICAgRk9fMUlfRDMyRjMyQzMxX1RSQ19XUkFfMDEoICZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5SZXZMUENvZWZzW2pdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogIEFwcGx5IHJvdGF0aW9uIG1hdHJpeCBhbmQgZGVsYXkgc2FtcGxlcwotICAgICAqLwotICAgIGZvcihqID0gMDsgaiA8IE51bWJlck9mRGVsYXlMaW5lczsgaisrKQotICAgIHsKLQotICAgICAgICBDb3B5XzE2KCAoTFZNX0lOVDE2KikocFRlbXApLAotICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KikocERlbGF5TGluZUlucHV0KSwKLSAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcyA8PCAxKSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogIFJvdGF0aW9uIG1hdHJpeCBtaXgKLSAgICAgICAgICovCi0gICAgICAgIHN3aXRjaChqKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMSBhbmQgMiBjb250cmlidXRpb24KLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgTWFjM3NfU2F0XzMyeDE2KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgLTB4ODAwMCwgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgICAgICAgICAgICAgICBNYWMzc19TYXRfMzJ4MTYocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzJdLCAtMHg4MDAwLCBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjoKLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgYW5kIDMgY29udHJpYnV0aW9uCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgIE1hYzNzX1NhdF8zMngxNihwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIC0weDgwMDAsIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgTWFjM3NfU2F0XzMyeDE2KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVszXSwgLTB4ODAwMCwgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBhbmQgMyBjb250cmlidXRpb24KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF8zMngxNihwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIC0weDgwMDAsIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfMzJ4MzIocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzNdLCBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgYW5kIDEgY29udHJpYnV0aW9uCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0XzMyeDE2KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgLTB4ODAwMCwgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0XzMyeDE2KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgLTB4ODAwMCwgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDEgYW5kIDIgY29udHJpYnV0aW9uCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfMzJ4MTYocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMHg4MDAwLCBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgICAgIEFkZDJfU2F0XzMyeDMyKHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsyXSwgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzIpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBhbmQgMSBjb250cmlidXRpb24KLSAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgICAgIEFkZDJfU2F0XzMyeDMyKHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfMzJ4MTYocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMHg4MDAwLCBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgY29udHJpYnV0aW9uCi0gICAgICAgICAgICAgICAgICAgICAqLwotCi0gICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgIFNPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgREVTVElOQVRJT04qLwotICAgICAgICAgICAgICAgICAgICBBZGQyX1NhdF8zMngzMihwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogIERlbGF5IHNhbXBsZXMKLSAgICAgICAgICovCi0gICAgICAgIENvcHlfMTYoKExWTV9JTlQxNiAqKXBEZWxheUxpbmVJbnB1dCwKLSAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXS1OdW1TYW1wbGVzXSwKLSAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1TYW1wbGVzIDw8IDEpKTsgICAgICAgICAgICAgIC8qIDMyLWJpdCBkYXRhICovCi0KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogIENyZWF0ZSBzdGVyZW8gb3V0cHV0Ci0gICAgICovCi0gICAgc3dpdGNoKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMpCi0gICAgewotICAgICAgICBjYXNlIExWUkVWX0RFTEFZTElORVNfNDoKLSAgICAgICAgICAgICBBZGQyX1NhdF8zMngzMihwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICAgQWRkMl9TYXRfMzJ4MzIocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotCi0KLSAgICAgICAgICAgIEpvaW5UbzJpXzMyeDMyKHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVlJFVl9ERUxBWUxJTkVTXzI6Ci0KLSAgICAgICAgICAgICBDb3B5XzE2KCAoTFZNX0lOVDE2KilwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sCi0gICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcyA8PCAxKSk7Ci0KLSAgICAgICAgICAgIE1hYzNzX1NhdF8zMngxNihwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLTB4ODAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotCi0gICAgICAgICAgICAgQWRkMl9TYXRfMzJ4MzIocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotCi0KLSAgICAgICAgICAgICBKb2luVG8yaV8zMngzMihwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWUkVWX0RFTEFZTElORVNfMToKLSAgICAgICAgICAgIE1vbm9UbzJJXzMyKHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqICBEcnkvd2V0IG1peGVyCi0gICAgICovCi0KLSAgICBzaXplID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyA8PCAxKTsKLSAgICBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCZwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCi0gICAgLyogQXBwbHkgR2FpbiovCi0KLSAgICBTaGlmdF9TYXRfdjMyeHYzMiAoTFZSRVZfT1VUUFVUR0FJTl9TSElGVCwKLSAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Ci0KLSAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCZwUHJpdmF0ZS0+R2Fpbk1peGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKLQotICAgIHJldHVybjsKLX0KLSNlbHNlCi12b2lkIFJldmVyYkJsb2NrKExWTV9GTE9BVCAqcElucHV0LCBMVk1fRkxPQVQgKnBPdXRwdXQsCi0gICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlX3N0ICpwUHJpdmF0ZSwgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKQotewotICAgIExWTV9JTlQxNiAgIGosIHNpemU7Ci0gICAgTFZNX0ZMT0FUICAgKnBEZWxheUxpbmU7Ci0gICAgTFZNX0ZMT0FUICAgKnBEZWxheUxpbmVJbnB1dCA9IHBQcml2YXRlLT5wU2NyYXRjaDsKLSAgICBMVk1fRkxPQVQgICAqcFNjcmF0Y2ggPSBwUHJpdmF0ZS0+cFNjcmF0Y2g7Ci0gICAgTFZNX0ZMT0FUICAgKnBJbjsKLSAgICBMVk1fRkxPQVQgICAqcFRlbXAgPSBwUHJpdmF0ZS0+cElucHV0U2F2ZTsKLSAgICBMVk1fSU5UMzIgICBOdW1iZXJPZkRlbGF5TGluZXM7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICogQWxsIGNhbGN1bGF0aW9ucyB3aWxsIGdvIGludG8gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHBUZW1wLCB0aGlzIHdpbGwgICAgKgotICAgICAqIHRoZW4gYmUgbWl4ZWQgd2l0aCB0aGUgb3JpZ2luYWwgaW5wdXQgdG8gY3JlYXRlIHRoZSBmaW5hbCBvdXRwdXQuICAgICAgICAgICoKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogV2hlbiBJTlBMQUNFIHByb2Nlc3NpbmcgaXMgc2VsZWN0ZWQgdGhpcyBtdXN0IGJlIGEgdGVtcG9yYXJ5IGJ1ZmZlciBhbmQgICAgKgotICAgICAqIGhlbmNlIHRoaXMgaXMgdGhlIHdvcnN0IGNhc2UsIHNvIGZvciBzaW1wbGljaXR5IHRoaXMgd2lsbCBBTFdBWVMgYmUgc28gICAgICoKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogVGhlIGlucHV0IGJ1ZmZlciB3aWxsIHJlbWFpbiB1bnRvdWNoZWQgdW50aWwgdGhlIG91dHB1dCBvZiB0aGUgbWl4ZXIgaWYgICAgKgotICAgICAqIElOUExBQ0UgcHJvY2Vzc2luZyBpcyBzZWxlY3RlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCi0gICAgICogVGhlIHRlbXAgYnVmZmVyIHdpbGwgYWx3YXlzIGJlIE51bVNhbXBsZXMgaW4gc2l6ZSByZWdhcmRsZXNzIG9mIE1PTk8gb3IgICAgKgotICAgICAqIFNURVJFTyBpbnB1dC4gSW4gdGhlIGNhc2Ugb2Ygc3RlcmVvIGlucHV0IGFsbCBwcm9jZXNzaW5nIGlzIGRvbmUgaW4gTU9OTyAgICoKLSAgICAgKiBhbmQgdGhlIGZpbmFsIG91dHB1dCBpcyBjb252ZXJ0ZWQgdG8gU1RFUkVPIGFmdGVyIHRoZSBtaXhlciAgICAgICAgICAgICAgICAqCi0gICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQotICAgIHsKLSAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gNDsKLSAgICB9Ci0gICAgZWxzZSBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKLSAgICB7Ci0gICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDE7Ci0gICAgfQotCi0gICAgaWYocFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKQotICAgIHsKLSAgICAgICAgcEluID0gcElucHV0OwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiAgU3RlcmVvIHRvIG1vbm8gY29udmVyc2lvbgotICAgICAgICAgKi8KLQotICAgICAgICBGcm9tMmlUb01vbm9fRmxvYXQocElucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgICAgICBwSW4gPSBwVGVtcDsKLSAgICB9Ci0KLSAgICBNdWx0M3NfRmxvYXQocEluLAotICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKUxWUkVWX0hFQURST09NLAotICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLQotICAgIC8qCi0gICAgICogIEhpZ2ggcGFzcyBmaWx0ZXIKLSAgICAgKi8KLSAgICBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSgmcFByaXZhdGUtPnBGYXN0Q29lZi0+SFBDb2VmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgIC8qCi0gICAgICogIExvdyBwYXNzIGZpbHRlcgotICAgICAqLwotICAgIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5MUENvZWZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0gICAgCi0gICAgLyoKLSAgICAgKiAgUHJvY2VzcyBhbGwgZGVsYXkgbGluZXMKLSAgICAgKi8KLQotICAgIGZvcihqID0gMDsgaiA8IE51bWJlck9mRGVsYXlMaW5lczsgaisrKQotICAgIHsKLSAgICAgICAgcERlbGF5TGluZSA9IHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVtqXTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBBbGwtcGFzcyBmaWx0ZXIgd2l0aCBwb3AgYW5kIGNsaWNrIHN1cHByZXNzaW9uCi0gICAgICAgICAqLwotICAgICAgICAvKiBHZXQgdGhlIHNtb290aGVkLCBkZWxheWVkIG91dHB1dC4gUHV0IGl0IGluIHRoZSBvdXRwdXQgYnVmZmVyICovCi0gICAgICAgIE1peFNvZnRfMlN0X0QzMkMzMV9TQVQoJnBQcml2YXRlLT5NaXhlcl9BUFRhcHNbal0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRBW2pdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wT2Zmc2V0QltqXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0gICAgICAgIC8qIFJlLWFsaWduIHRoZSBhbGwgcGFzcyBmaWx0ZXIgZGVsYXkgYnVmZmVyIGFuZCBjb3B5aW5nIHRoZSBmaXhlZCBkZWxheSBkYXRhIFwKLSAgICAgICAgICAgdG8gdGhlIEFQIGRlbGF5IGluIHRoZSBwcm9jZXNzICovCi0gICAgICAgIENvcHlfRmxvYXQoJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtOdW1TYW1wbGVzXSwKLSAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cERlbGF5X1Rbal0sCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikocFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzKSk7ICAgICAgICAgLyogMzItYml0IGRhdGEgKi8KLSAgICAgICAgLyogQXBwbHkgdGhlIHNtb290aGVkIGZlZWRiYWNrIGFuZCBzYXZlIHRvIGZpeGVkIGRlbGF5IGlucHV0IChjdXJyZW50bHkgZW1wdHkpICovCi0gICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoJnBQcml2YXRlLT5NaXhlcl9TR0ZlZWRiYWNrW2pdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0gICAgICAgIC8qIFN1bSBpbnRvIHRoZSBBUCBkZWxheSBsaW5lICovCi0gICAgICAgIE1hYzNzX1NhdF9GbG9hdCgmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sCi0gICAgICAgICAgICAgICAgICAgICAgICAtMS4wZiwgICAgLyogSW52ZXJ0IHNpbmNlIHRoZSBmZWVkYmFjayBjb2VmZmljaWVudCBpcyBuZWdhdGl2ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+RGVsYXlfQVBbal0gLSBOdW1TYW1wbGVzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0gICAgICAgIC8qIEFwcGx5IHNtb290aGVkIGZlZWRmb3J3YXJkIHNhbmQgc2F2ZSB0byBmaXhlZCBkZWxheSBpbnB1dCAoY3VycmVudGx5IGVtcHR5KSAqLwotICAgICAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCZwUHJpdmF0ZS0+TWl4ZXJfU0dGZWVkZm9yd2FyZFtqXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5EZWxheV9BUFtqXSAtIE51bVNhbXBsZXNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgICAgICAvKiBTdW0gaW50byB0aGUgQVAgb3V0cHV0ICovCi0gICAgICAgIE1hYzNzX1NhdF9GbG9hdCgmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sCi0gICAgICAgICAgICAgICAgICAgICAgICAxLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogIEZlZWRiYWNrIGdhaW4KLSAgICAgICAgICovCi0gICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoJnBQcml2YXRlLT5GZWVkYmFja01peGVyW2pdLCBwRGVsYXlMaW5lLCBwRGVsYXlMaW5lLCBOdW1TYW1wbGVzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiAgTG93IHBhc3MgZmlsdGVyCi0gICAgICAgICAqLwotICAgICAgICBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSgmcFByaXZhdGUtPnBGYXN0Q29lZi0+UmV2TFBDb2Vmc1tqXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqICBBcHBseSByb3RhdGlvbiBtYXRyaXggYW5kIGRlbGF5IHNhbXBsZXMKLSAgICAgKi8KLSAgICBmb3IoaiA9IDA7IGogPCBOdW1iZXJPZkRlbGF5TGluZXM7IGorKykKLSAgICB7Ci0KLSAgICAgICAgQ29weV9GbG9hdChwVGVtcCwKLSAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcykpOwotICAgICAgICAvKgotICAgICAgICAgKiAgUm90YXRpb24gbWF0cml4IG1peAotICAgICAgICAgKi8KLSAgICAgICAgc3dpdGNoKGopCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMzoKLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAxIGFuZCAyIGNvbnRyaWJ1dGlvbgotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsyXSwgLTEuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjoKLQotICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgYW5kIDMgY29udHJpYnV0aW9uCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIC0xLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzNdLCAtMS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgYW5kIDMgY29udHJpYnV0aW9uCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCAtMS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzNdLCBwRGVsYXlMaW5lSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgYW5kIDEgY29udHJpYnV0aW9uCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgLTEuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgLTEuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDEgYW5kIDIgY29udHJpYnV0aW9uCi0gICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzJdLCBwRGVsYXlMaW5lSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZSBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGFuZCAxIGNvbnRyaWJ1dGlvbgotICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCBwRGVsYXlMaW5lSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0xLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgICAgICAgICAqICBBZGQgZGVsYXkgbGluZSAwIGNvbnRyaWJ1dGlvbgotICAgICAgICAgICAgICAgICAgICAgKi8KLQotICAgICAgICAgICAgICAgICAgICAvKiAgICAgICAgICAgICBTT1VSQ0UgICAgICAgICAgICAgICAgICAgICAgICAgIERFU1RJTkFUSU9OKi8KLSAgICAgICAgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCBwRGVsYXlMaW5lSW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqICBEZWxheSBzYW1wbGVzCi0gICAgICAgICAqLwotICAgICAgICBDb3B5X0Zsb2F0KHBEZWxheUxpbmVJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgLyogMzItYml0IGRhdGEgKi8KLSAgICB9Ci0KLQotICAgIC8qCi0gICAgICogIENyZWF0ZSBzdGVyZW8gb3V0cHV0Ci0gICAgICovCi0gICAgc3dpdGNoKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMpCi0gICAgewotICAgICAgICBjYXNlIExWUkVWX0RFTEFZTElORVNfNDoKLSAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbM10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0gICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotCi0KLSAgICAgICAgICAgIEpvaW5UbzJpX0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBMVlJFVl9ERUxBWUxJTkVTXzI6Ci0KLSAgICAgICAgICAgICBDb3B5X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcykpOwotCi0gICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMS4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotCi0gICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotCi0KLSAgICAgICAgICAgICBKb2luVG8yaV9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExWUkVWX0RFTEFZTElORVNfMToKLSAgICAgICAgICAgIE1vbm9UbzJJX0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0KLSAgICAvKgotICAgICAqICBEcnkvd2V0IG1peGVyCi0gICAgICovCi0KLSAgICBzaXplID0gKExWTV9JTlQxNikoTnVtU2FtcGxlcyA8PCAxKTsKLSAgICBNaXhTb2Z0XzJTdF9EMzJDMzFfU0FUKCZwUHJpdmF0ZS0+QnlwYXNzTWl4ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpOwotCi0gICAgLyogQXBwbHkgR2FpbiovCi0KLSAgICBTaGlmdF9TYXRfRmxvYXQoTFZSRVZfT1VUUFVUR0FJTl9TSElGVCwKLSAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZSk7Ci0KLSAgICBNaXhTb2Z0XzFTdF9EMzJDMzFfV1JBKCZwUHJpdmF0ZS0+R2Fpbk1peGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKLQotICAgIHJldHVybjsKLX0KLSNlbmRpZgotLyogRW5kIG9mIGZpbGUgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9Qcm9jZXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWY5YWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfUHJvY2Vzcy5jcHAKQEAgLTAsMCArMSw0ODQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiTFZSRVZfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVlJFVl9Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQcm9jZXNzIGZ1bmN0aW9uIGZvciB0aGUgTFZSRVYgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbkRhdGEgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1TYW1wbGVzICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9TdWNjZXNzICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX0lOVkFMSUROVU1TQU1QTEVTIE51bVNhbXBsZXMgd2FzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIGJsb2NrIHNpemUgICAgICAgICAgICovCisvKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICAgV2hlbiBvbmUgb2YgaEluc3RhbmNlLCBwSW5EYXRhIG9yIHBPdXREYXRhIGlzIE5VTEwgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBtdXN0IGJlIDMyLWJpdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlJFVl9SZXR1cm5TdGF0dXNfZW4gTFZSRVZfUHJvY2VzcyhMVlJFVl9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9VSU5UMTYgICAgTnVtU2FtcGxlcykKK3sKKyAgIExWUkVWX0luc3RhbmNlX3N0ICAgICAqcExWUkVWX1ByaXZhdGUgPSAoTFZSRVZfSW5zdGFuY2Vfc3QgKiloSW5zdGFuY2U7CisgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBJbnB1dCAgPSAoTFZNX0ZMT0FUICopcEluRGF0YTsKKyAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dHB1dCA9IHBPdXREYXRhOworICAgTFZNX0lOVDMyICAgICAgICAgICAgIFNhbXBsZXNUb1Byb2Nlc3MsIFJlbWFpbmluZ1NhbXBsZXM7CisgICBMVk1fSU5UMzIgICAgICAgICAgICAgZm9ybWF0ID0gMTsKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKKyAgICAgKi8KKworICAgIC8qIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzICovCisgICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBJbkRhdGEgPT0gTFZNX05VTEwpIHx8IChwT3V0RGF0YSA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gTFZSRVZfTlVMTEFERFJFU1M7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBBcHBseSB0aGUgbmV3IGNvbnRyb2xzIHNldHRpbmdzIGlmIHJlcXVpcmVkCisgICAgICovCisgICAgaWYocExWUkVWX1ByaXZhdGUtPmJDb250cm9sUGVuZGluZyA9PSBMVk1fVFJVRSkKKyAgICB7CisgICAgICAgIExWUkVWX1JldHVyblN0YXR1c19lbiAgIGVycm9yQ29kZTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDbGVhciB0aGUgcGVuZGluZyBmbGFnIGFuZCB1cGRhdGUgdGhlIGNvbnRyb2wgc2V0dGluZ3MKKyAgICAgICAgICovCisgICAgICAgIHBMVlJFVl9Qcml2YXRlLT5iQ29udHJvbFBlbmRpbmcgPSBMVk1fRkFMU0U7CisKKyAgICAgICAgZXJyb3JDb2RlID0gTFZSRVZfQXBwbHlOZXdTZXR0aW5ncyAocExWUkVWX1ByaXZhdGUpOworCisgICAgICAgIGlmKGVycm9yQ29kZSAhPSBMVlJFVl9TVUNDRVNTKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gZXJyb3JDb2RlOworICAgICAgICB9CisgICAgfQorCisgICAgLyoKKyAgICAgKiBUcmFwIHRoZSBjYXNlIHdoZXJlIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyB6ZXJvLgorICAgICAqLworICAgIGlmIChOdW1TYW1wbGVzID09IDApCisgICAgeworICAgICAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKKyAgICB9CisKKyAgICAvKgorICAgICAqIElmIE9GRiBjb3B5IGFuZCByZWZvcm1hdCB0aGUgZGF0YSBhcyBuZWNlc3NhcnkKKyAgICAgKi8KKyAgICBpZiAocExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVk1fTU9ERV9PRkYpCisgICAgeworICAgICAgICBpZihwSW5wdXQgIT0gcE91dHB1dCkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIENvcHkgdGhlIGRhdGEgdG8gdGhlIG91dHB1dCBidWZmZXIsIGNvbnZlcnQgdG8gc3RlcmVvIGlzIHJlcXVpcmVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmKHBMVlJFVl9Qcml2YXRlLT5DdXJyZW50UGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVk1fTU9OTyl7CisgICAgICAgICAgICAgICAgTW9ub1RvMklfRmxvYXQocElucHV0LCBwT3V0cHV0LCBOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQ29weV9GbG9hdChwSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoTnVtU2FtcGxlcyA8PCAxKSk7IC8vIDMyIGJpdCBkYXRhLCBzdGVyZW8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOworICAgIH0KKworICAgIFJlbWFpbmluZ1NhbXBsZXMgPSAoTFZNX0lOVDMyKU51bVNhbXBsZXM7CisKKyAgICBpZiAocExWUkVWX1ByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ICE9IExWTV9NT05PKQorICAgIHsKKyAgICAgICAgZm9ybWF0ID0gMjsKKyAgICB9CisKKyAgICB3aGlsZSAoUmVtYWluaW5nU2FtcGxlcyE9MCkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFByb2Nlc3MgdGhlIGRhdGEKKyAgICAgICAgICovCisKKyAgICAgICAgaWYoUmVtYWluaW5nU2FtcGxlcyA+ICBwTFZSRVZfUHJpdmF0ZS0+TWF4QmxrTGVuKQorICAgICAgICB7CisgICAgICAgICAgICBTYW1wbGVzVG9Qcm9jZXNzID0gIHBMVlJFVl9Qcml2YXRlLT5NYXhCbGtMZW47CisgICAgICAgICAgICBSZW1haW5pbmdTYW1wbGVzID0gKExWTV9JTlQxNikoUmVtYWluaW5nU2FtcGxlcyAtIFNhbXBsZXNUb1Byb2Nlc3MpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgU2FtcGxlc1RvUHJvY2VzcyA9IFJlbWFpbmluZ1NhbXBsZXM7CisgICAgICAgICAgICBSZW1haW5pbmdTYW1wbGVzID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIFJldmVyYkJsb2NrKHBJbnB1dCwgcE91dHB1dCwgcExWUkVWX1ByaXZhdGUsIChMVk1fVUlOVDE2KVNhbXBsZXNUb1Byb2Nlc3MpOworICAgICAgICBwSW5wdXQgID0gKExWTV9GTE9BVCAqKShwSW5wdXQgKyAoU2FtcGxlc1RvUHJvY2VzcyAqIGZvcm1hdCkpOworICAgICAgICBwT3V0cHV0ID0gKExWTV9GTE9BVCAqKShwT3V0cHV0ICsgKFNhbXBsZXNUb1Byb2Nlc3MgKiAyKSk7ICAgICAgLy8gQWx3YXlzIHN0ZXJlbyBvdXRwdXQKKyAgICB9CisKKyAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBSZXZlcmJCbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQcm9jZXNzIGZ1bmN0aW9uIGZvciB0aGUgTFZSRVYgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbkRhdGEgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1TYW1wbGVzICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9TdWNjZXNzICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX0lOVkFMSUROVU1TQU1QTEVTIE51bVNhbXBsZXMgd2FzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIGJsb2NrIHNpemUgICAgICAgICAgICovCisvKiAgTFZSRVZfTlVMTEFERFJFU1MgICAgICAgV2hlbiBvbmUgb2YgaEluc3RhbmNlLCBwSW5EYXRhIG9yIHBPdXREYXRhIGlzIE5VTEwgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhlIGlucHV0IGFuZCBvdXRwdXQgYnVmZmVycyBtdXN0IGJlIDMyLWJpdCBhbGlnbmVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIFJldmVyYkJsb2NrKExWTV9GTE9BVCAqcElucHV0LCBMVk1fRkxPQVQgKnBPdXRwdXQsCisgICAgICAgICAgICAgICAgIExWUkVWX0luc3RhbmNlX3N0ICpwUHJpdmF0ZSwgTFZNX1VJTlQxNiBOdW1TYW1wbGVzKQoreworICAgIExWTV9JTlQxNiAgIGosIHNpemU7CisgICAgTFZNX0ZMT0FUICAgKnBEZWxheUxpbmU7CisgICAgTFZNX0ZMT0FUICAgKnBEZWxheUxpbmVJbnB1dCA9IHBQcml2YXRlLT5wU2NyYXRjaDsKKyAgICBMVk1fRkxPQVQgICAqcFNjcmF0Y2ggPSBwUHJpdmF0ZS0+cFNjcmF0Y2g7CisgICAgTFZNX0ZMT0FUICAgKnBJbjsKKyAgICBMVk1fRkxPQVQgICAqcFRlbXAgPSBwUHJpdmF0ZS0+cElucHV0U2F2ZTsKKyAgICBMVk1fSU5UMzIgICBOdW1iZXJPZkRlbGF5TGluZXM7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICogQWxsIGNhbGN1bGF0aW9ucyB3aWxsIGdvIGludG8gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHBUZW1wLCB0aGlzIHdpbGwgICAgKgorICAgICAqIHRoZW4gYmUgbWl4ZWQgd2l0aCB0aGUgb3JpZ2luYWwgaW5wdXQgdG8gY3JlYXRlIHRoZSBmaW5hbCBvdXRwdXQuICAgICAgICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogV2hlbiBJTlBMQUNFIHByb2Nlc3NpbmcgaXMgc2VsZWN0ZWQgdGhpcyBtdXN0IGJlIGEgdGVtcG9yYXJ5IGJ1ZmZlciBhbmQgICAgKgorICAgICAqIGhlbmNlIHRoaXMgaXMgdGhlIHdvcnN0IGNhc2UsIHNvIGZvciBzaW1wbGljaXR5IHRoaXMgd2lsbCBBTFdBWVMgYmUgc28gICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogVGhlIGlucHV0IGJ1ZmZlciB3aWxsIHJlbWFpbiB1bnRvdWNoZWQgdW50aWwgdGhlIG91dHB1dCBvZiB0aGUgbWl4ZXIgaWYgICAgKgorICAgICAqIElOUExBQ0UgcHJvY2Vzc2luZyBpcyBzZWxlY3RlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqCisgICAgICogVGhlIHRlbXAgYnVmZmVyIHdpbGwgYWx3YXlzIGJlIE51bVNhbXBsZXMgaW4gc2l6ZSByZWdhcmRsZXNzIG9mIE1PTk8gb3IgICAgKgorICAgICAqIFNURVJFTyBpbnB1dC4gSW4gdGhlIGNhc2Ugb2Ygc3RlcmVvIGlucHV0IGFsbCBwcm9jZXNzaW5nIGlzIGRvbmUgaW4gTU9OTyAgICoKKyAgICAgKiBhbmQgdGhlIGZpbmFsIG91dHB1dCBpcyBjb252ZXJ0ZWQgdG8gU1RFUkVPIGFmdGVyIHRoZSBtaXhlciAgICAgICAgICAgICAgICAqCisgICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU180KQorICAgIHsKKyAgICAgICAgTnVtYmVyT2ZEZWxheUxpbmVzID0gNDsKKyAgICB9CisgICAgZWxzZSBpZihwUHJpdmF0ZS0+SW5zdGFuY2VQYXJhbXMuTnVtRGVsYXlzID09IExWUkVWX0RFTEFZTElORVNfMikKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDI7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIE51bWJlck9mRGVsYXlMaW5lcyA9IDE7CisgICAgfQorCisgICAgaWYocFByaXZhdGUtPkN1cnJlbnRQYXJhbXMuU291cmNlRm9ybWF0ID09IExWTV9NT05PKQorICAgIHsKKyAgICAgICAgcEluID0gcElucHV0OworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiAgU3RlcmVvIHRvIG1vbm8gY29udmVyc2lvbgorICAgICAgICAgKi8KKworICAgICAgICBGcm9tMmlUb01vbm9fRmxvYXQocElucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICBwSW4gPSBwVGVtcDsKKyAgICB9CisKKyAgICBNdWx0M3NfRmxvYXQocEluLAorICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKUxWUkVWX0hFQURST09NLAorICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgIC8qCisgICAgICogIEhpZ2ggcGFzcyBmaWx0ZXIKKyAgICAgKi8KKyAgICBGT18xSV9EMzJGMzJDMzFfVFJDX1dSQV8wMSgmcFByaXZhdGUtPnBGYXN0Q29lZi0+SFBDb2VmcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgIC8qCisgICAgICogIExvdyBwYXNzIGZpbHRlcgorICAgICAqLworICAgIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5MUENvZWZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAvKgorICAgICAqICBQcm9jZXNzIGFsbCBkZWxheSBsaW5lcworICAgICAqLworCisgICAgZm9yKGogPSAwOyBqIDwgTnVtYmVyT2ZEZWxheUxpbmVzOyBqKyspCisgICAgeworICAgICAgICBwRGVsYXlMaW5lID0gcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lW2pdOworCisgICAgICAgIC8qCisgICAgICAgICAqIEFsbC1wYXNzIGZpbHRlciB3aXRoIHBvcCBhbmQgY2xpY2sgc3VwcHJlc3Npb24KKyAgICAgICAgICovCisgICAgICAgIC8qIEdldCB0aGUgc21vb3RoZWQsIGRlbGF5ZWQgb3V0cHV0LiBQdXQgaXQgaW4gdGhlIG91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgTWl4U29mdF8yU3RfRDMyQzMxX1NBVCgmcFByaXZhdGUtPk1peGVyX0FQVGFwc1tqXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cE9mZnNldEFbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBPZmZzZXRCW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgLyogUmUtYWxpZ24gdGhlIGFsbCBwYXNzIGZpbHRlciBkZWxheSBidWZmZXIgYW5kIGNvcHlpbmcgdGhlIGZpeGVkIGRlbGF5IGRhdGEgXAorICAgICAgICAgICB0byB0aGUgQVAgZGVsYXkgaW4gdGhlIHByb2Nlc3MgKi8KKyAgICAgICAgQ29weV9GbG9hdCgmcFByaXZhdGUtPnBEZWxheV9UW2pdW051bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wRGVsYXlfVFtqXSwKKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXMpKTsgICAgICAgICAvKiAzMi1iaXQgZGF0YSAqLworICAgICAgICAvKiBBcHBseSB0aGUgc21vb3RoZWQgZmVlZGJhY2sgYW5kIHNhdmUgdG8gZml4ZWQgZGVsYXkgaW5wdXQgKGN1cnJlbnRseSBlbXB0eSkgKi8KKyAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgmcFByaXZhdGUtPk1peGVyX1NHRmVlZGJhY2tbal0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5UW2pdIC0gTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgLyogU3VtIGludG8gdGhlIEFQIGRlbGF5IGxpbmUgKi8KKyAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KCZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC0xLjBmLCAgICAvKiBJbnZlcnQgc2luY2UgdGhlIGZlZWRiYWNrIGNvZWZmaWNpZW50IGlzIG5lZ2F0aXZlICovCisgICAgICAgICAgICAgICAgICAgICAgICAmcFByaXZhdGUtPnBEZWxheV9UW2pdW3BQcml2YXRlLT5EZWxheV9BUFtqXSAtIE51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgLyogQXBwbHkgc21vb3RoZWQgZmVlZGZvcndhcmQgc2FuZCBzYXZlIHRvIGZpeGVkIGRlbGF5IGlucHV0IChjdXJyZW50bHkgZW1wdHkpICovCisgICAgICAgIE1peFNvZnRfMVN0X0QzMkMzMV9XUkEoJnBQcml2YXRlLT5NaXhlcl9TR0ZlZWRmb3J3YXJkW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPkRlbGF5X0FQW2pdIC0gTnVtU2FtcGxlc10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBQcml2YXRlLT5wRGVsYXlfVFtqXVtwUHJpdmF0ZS0+VFtqXSAtIE51bVNhbXBsZXNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgIC8qIFN1bSBpbnRvIHRoZSBBUCBvdXRwdXQgKi8KKyAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KCZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiAgRmVlZGJhY2sgZ2FpbgorICAgICAgICAgKi8KKyAgICAgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgmcFByaXZhdGUtPkZlZWRiYWNrTWl4ZXJbal0sIHBEZWxheUxpbmUsIHBEZWxheUxpbmUsIE51bVNhbXBsZXMpOworCisgICAgICAgIC8qCisgICAgICAgICAqICBMb3cgcGFzcyBmaWx0ZXIKKyAgICAgICAgICovCisgICAgICAgIEZPXzFJX0QzMkYzMkMzMV9UUkNfV1JBXzAxKCZwUHJpdmF0ZS0+cEZhc3RDb2VmLT5SZXZMUENvZWZzW2pdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgIH0KKworICAgIC8qCisgICAgICogIEFwcGx5IHJvdGF0aW9uIG1hdHJpeCBhbmQgZGVsYXkgc2FtcGxlcworICAgICAqLworICAgIGZvcihqID0gMDsgaiA8IE51bWJlck9mRGVsYXlMaW5lczsgaisrKQorICAgIHsKKworICAgICAgICBDb3B5X0Zsb2F0KHBUZW1wLAorICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1TYW1wbGVzKSk7CisgICAgICAgIC8qCisgICAgICAgICAqICBSb3RhdGlvbiBtYXRyaXggbWl4CisgICAgICAgICAqLworICAgICAgICBzd2l0Y2goaikKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDEgYW5kIDIgY29udHJpYnV0aW9uCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzJdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBEZWxheUxpbmVJbnB1dCwgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBhbmQgMyBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbM10sIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBhbmQgMyBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbM10sIHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMCBhbmQgMSBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLCAtMS4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgaWYocFByaXZhdGUtPkluc3RhbmNlUGFyYW1zLk51bURlbGF5cyA9PSBMVlJFVl9ERUxBWUxJTkVTXzQpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAgICAgKiAgQWRkIGRlbGF5IGxpbmUgMSBhbmQgMiBjb250cmlidXRpb24KKyAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIE1hYzNzX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcERlbGF5TGluZUlucHV0LCAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMl0sIHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMgPT0gTFZSRVZfREVMQVlMSU5FU18yKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgYW5kIDEgY29udHJpYnV0aW9uCisgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICAgICAgTWFjM3NfU2F0X0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwgLTEuMGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwRGVsYXlMaW5lSW5wdXQsIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICogIEFkZCBkZWxheSBsaW5lIDAgY29udHJpYnV0aW9uCisgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgICAgIC8qICAgICAgICAgICAgIFNPVVJDRSAgICAgICAgICAgICAgICAgICAgICAgICAgREVTVElOQVRJT04qLworICAgICAgICAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sIHBEZWxheUxpbmVJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogIERlbGF5IHNhbXBsZXMKKyAgICAgICAgICovCisgICAgICAgIENvcHlfRmxvYXQocERlbGF5TGluZUlucHV0LAorICAgICAgICAgICAgICAgICAgICZwUHJpdmF0ZS0+cERlbGF5X1Rbal1bcFByaXZhdGUtPlRbal0gLSBOdW1TYW1wbGVzXSwKKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgICAvKiAzMi1iaXQgZGF0YSAqLworICAgIH0KKworICAgIC8qCisgICAgICogIENyZWF0ZSBzdGVyZW8gb3V0cHV0CisgICAgICovCisgICAgc3dpdGNoKHBQcml2YXRlLT5JbnN0YW5jZVBhcmFtcy5OdW1EZWxheXMpCisgICAgeworICAgICAgICBjYXNlIExWUkVWX0RFTEFZTElORVNfNDoKKyAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbM10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisgICAgICAgICAgICAgQWRkMl9TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgICAgICBKb2luVG8yaV9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExWUkVWX0RFTEFZTElORVNfMjoKKworICAgICAgICAgICAgIENvcHlfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KShOdW1TYW1wbGVzKSk7CisKKyAgICAgICAgICAgICBNYWMzc19TYXRfRmxvYXQocFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICBBZGQyX1NhdF9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByaXZhdGUtPnBTY3JhdGNoRGVsYXlMaW5lWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICAgICAgICAgICBKb2luVG8yaV9GbG9hdChwUHJpdmF0ZS0+cFNjcmF0Y2hEZWxheUxpbmVbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIExWUkVWX0RFTEFZTElORVNfMToKKyAgICAgICAgICAgIE1vbm9UbzJJX0Zsb2F0KHBQcml2YXRlLT5wU2NyYXRjaERlbGF5TGluZVswXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBUZW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgLyoKKyAgICAgKiAgRHJ5L3dldCBtaXhlcgorICAgICAqLworCisgICAgc2l6ZSA9IChMVk1fSU5UMTYpKE51bVNhbXBsZXMgPDwgMSk7CisgICAgTWl4U29mdF8yU3RfRDMyQzMxX1NBVCgmcFByaXZhdGUtPkJ5cGFzc01peGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFRlbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwVGVtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKworICAgIC8qIEFwcGx5IEdhaW4qLworCisgICAgU2hpZnRfU2F0X0Zsb2F0KExWUkVWX09VVFBVVEdBSU5fU0hJRlQsCisgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgIHNpemUpOworCisgICAgTWl4U29mdF8xU3RfRDMyQzMxX1dSQSgmcFByaXZhdGUtPkdhaW5NaXhlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSk7CisKKyAgICByZXR1cm47Cit9CisvKiBFbmQgb2YgZmlsZSAqLworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTcxOTA1My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaW5jbHVkZSAiTFZSRVZfUHJpdmF0ZS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNldHMgb3IgY2hhbmdlcyB0aGUgTFZSRVYgbW9kdWxlIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE5ld1BhcmFtcyAgICAgICAgICAgICAgUG9pbnRlciB0byBhIHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZNX1N1Y2Nlc3MgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIGhJbnN0YW5jZSBvciBwTmV3UGFyYW1zIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUkVWX09VVE9GUkFOR0UgICAgICAgIFdoZW4gYW55IG9mIHRoZSBuZXcgcGFyYW1ldGVycyBpcyBvdXQgb2YgcmFuZ2UgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZSRVZfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzKExWUkVWX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICpwTmV3UGFyYW1zKQotewotCi0gICAgTFZSRVZfSW5zdGFuY2Vfc3QgICAgICpwTFZSRVZfUHJpdmF0ZSA9IChMVlJFVl9JbnN0YW5jZV9zdCAqKWhJbnN0YW5jZTsKLQotCi0gICAgLyoKLSAgICAgKiBDaGVjayBmb3IgZXJyb3IgY29uZGl0aW9ucwotICAgICAqLwotICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwTmV3UGFyYW1zID09IExWTV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVlJFVl9OVUxMQUREUkVTUzsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENoZWNrIGFsbCBuZXcgY29udHJvbCBwYXJhbWV0ZXJzIGFyZSBpbiByYW5nZQotICAgICAqLwotICAgIGlmKCAgICAoKHBOZXdQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT0ZGKSAmJiAocE5ld1BhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVk1fTU9ERV9PTikpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAoCi0gICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTEwMjUpICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xMjAwMCkgICAgICAgJiYKLSAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzE2MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjIwNTApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18yNDAwMCkgICAgICAgJiYKLSAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzMyMDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDQxMDApICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU180ODAwMCkgICAgICAKLSNpZmRlZiBISUdIRVJfRlMKLSAgICAgICAgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKQotI2VuZGlmCi0gICAgICAgICkKLSAgICAgICAgfHwgKChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX1NURVJFTykgJiYgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJiAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PKSkgKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChMVlJFVl9PVVRPRlJBTkdFKTsKLSAgICB9Ci0KLQotICAgIGlmIChwTmV3UGFyYW1zLT5MZXZlbCA+IExWUkVWX01BWF9MRVZFTCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOwotICAgIH0KLQotICAgIGlmICgocE5ld1BhcmFtcy0+TFBGIDwgTFZSRVZfTUlOX0xQRl9DT1JORVIpIHx8IChwTmV3UGFyYW1zLT5MUEYgPiBMVlJFVl9NQVhfTFBGX0NPUk5FUikpCi0gICAgewotICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKLSAgICB9Ci0KLSAgICBpZiAoKHBOZXdQYXJhbXMtPkhQRiA8IExWUkVWX01JTl9IUEZfQ09STkVSKSB8fCAocE5ld1BhcmFtcy0+SFBGID4gTFZSRVZfTUFYX0hQRl9DT1JORVIpKQotICAgIHsKLSAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7Ci0gICAgfQotCi0gICAgaWYgKHBOZXdQYXJhbXMtPlQ2MCA+IExWUkVWX01BWF9UNjApCi0gICAgewotICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKLSAgICB9Ci0KLSAgICBpZiAocE5ld1BhcmFtcy0+RGVuc2l0eSA+IExWUkVWX01BWF9ERU5TSVRZKQotICAgIHsKLSAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7Ci0gICAgfQotCi0gICAgaWYgKHBOZXdQYXJhbXMtPkRhbXBpbmcgPiBMVlJFVl9NQVhfREFNUElORykKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOwotICAgIH0KLQotICAgIGlmIChwTmV3UGFyYW1zLT5Sb29tU2l6ZSA+IExWUkVWX01BWF9ST09NU0laRSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOwotICAgIH0KLQotCi0KLSAgICAvKgotICAgICAqIENvcHkgdGhlIG5ldyBwYXJhbWV0ZXJzIGFuZCBzZXQgdGhlIGZsYWcgdG8gaW5kaWNhdGUgdGhleSBhcmUgYXZhaWxhYmxlCi0gICAgICovCi0gICAgcExWUkVWX1ByaXZhdGUtPk5ld1BhcmFtcyAgICAgICA9ICpwTmV3UGFyYW1zOwotICAgIHBMVlJFVl9Qcml2YXRlLT5iQ29udHJvbFBlbmRpbmcgPSBMVk1fVFJVRTsKLQotICAgIHJldHVybiBMVlJFVl9TVUNDRVNTOwotfQotCi0vKiBFbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfU2V0Q29udHJvbFBhcmFtZXRlcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhNzU1NTkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvUmV2ZXJiL3NyYy9MVlJFVl9TZXRDb250cm9sUGFyYW1ldGVycy5jcHAKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiTFZSRVZfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNldHMgb3IgY2hhbmdlcyB0aGUgTFZSRVYgbW9kdWxlIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE5ld1BhcmFtcyAgICAgICAgICAgICAgUG9pbnRlciB0byBhIHBhcmFtZXRlciBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZNX1N1Y2Nlc3MgICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlJFVl9OVUxMQUREUkVTUyAgICAgICBXaGVuIGhJbnN0YW5jZSBvciBwTmV3UGFyYW1zIGlzIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUkVWX09VVE9GUkFOR0UgICAgICAgIFdoZW4gYW55IG9mIHRoZSBuZXcgcGFyYW1ldGVycyBpcyBvdXQgb2YgcmFuZ2UgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGlzIGZ1bmN0aW9uIG1heSBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZSRVZfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZSRVZfUmV0dXJuU3RhdHVzX2VuIExWUkVWX1NldENvbnRyb2xQYXJhbWV0ZXJzKExWUkVWX0hhbmRsZV90ICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZSRVZfQ29udHJvbFBhcmFtc19zdCAgICpwTmV3UGFyYW1zKQoreworCisgICAgTFZSRVZfSW5zdGFuY2Vfc3QgICAgICpwTFZSRVZfUHJpdmF0ZSA9IChMVlJFVl9JbnN0YW5jZV9zdCAqKWhJbnN0YW5jZTsKKworICAgIC8qCisgICAgICogQ2hlY2sgZm9yIGVycm9yIGNvbmRpdGlvbnMKKyAgICAgKi8KKyAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE5ld1BhcmFtcyA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4gTFZSRVZfTlVMTEFERFJFU1M7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayBhbGwgbmV3IGNvbnRyb2wgcGFyYW1ldGVycyBhcmUgaW4gcmFuZ2UKKyAgICAgKi8KKyAgICBpZiggICAgKChwTmV3UGFyYW1zLT5PcGVyYXRpbmdNb2RlICE9IExWTV9NT0RFX09GRikgJiYgKHBOZXdQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZNX01PREVfT04pKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgKAorICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfODAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzExMDI1KSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTIwMDApICAgICAgICYmCisgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18xNjAwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzIyMDUwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMjQwMDApICAgICAgICYmCisgICAgICAgIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU18zMjAwMCkgJiYKKyAgICAgICAgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzQ0MTAwKSAmJgorICAgICAgICAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfNDgwMDApCisgICAgICAgICYmIChwTmV3UGFyYW1zLT5TYW1wbGVSYXRlICE9IExWTV9GU184ODIwMCkgJiYgKHBOZXdQYXJhbXMtPlNhbXBsZVJhdGUgIT0gTFZNX0ZTXzk2MDAwKQorICAgICAgICAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTc2NDAwKSAmJiAocE5ld1BhcmFtcy0+U2FtcGxlUmF0ZSAhPSBMVk1fRlNfMTkyMDAwKQorICAgICAgICApCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICB8fCAoKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAgICAgICAmJgorICAgICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OT0lOU1RFUkVPKSAmJgorICAgICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTU9OTykgICAgICAgICAmJgorICAgICAgICAgICAgKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fTVVMVElDSEFOTkVMKSkpCisjZWxzZQorICAgICAgICB8fCAoKHBOZXdQYXJhbXMtPlNvdXJjZUZvcm1hdCAhPSBMVk1fU1RFUkVPKSAmJiAocE5ld1BhcmFtcy0+U291cmNlRm9ybWF0ICE9IExWTV9NT05PSU5TVEVSRU8pICYmIChwTmV3UGFyYW1zLT5Tb3VyY2VGb3JtYXQgIT0gTFZNX01PTk8pKSApCisjZW5kaWYKKyAgICB7CisgICAgICAgIHJldHVybiAoTFZSRVZfT1VUT0ZSQU5HRSk7CisgICAgfQorCisgICAgaWYgKHBOZXdQYXJhbXMtPkxldmVsID4gTFZSRVZfTUFYX0xFVkVMKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7CisgICAgfQorCisgICAgaWYgKChwTmV3UGFyYW1zLT5MUEYgPCBMVlJFVl9NSU5fTFBGX0NPUk5FUikgfHwgKHBOZXdQYXJhbXMtPkxQRiA+IExWUkVWX01BWF9MUEZfQ09STkVSKSkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOworICAgIH0KKworICAgIGlmICgocE5ld1BhcmFtcy0+SFBGIDwgTFZSRVZfTUlOX0hQRl9DT1JORVIpIHx8IChwTmV3UGFyYW1zLT5IUEYgPiBMVlJFVl9NQVhfSFBGX0NPUk5FUikpCisgICAgeworICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKKyAgICB9CisKKyAgICBpZiAocE5ld1BhcmFtcy0+VDYwID4gTFZSRVZfTUFYX1Q2MCkKKyAgICB7CisgICAgICAgIHJldHVybiBMVlJFVl9PVVRPRlJBTkdFOworICAgIH0KKworICAgIGlmIChwTmV3UGFyYW1zLT5EZW5zaXR5ID4gTFZSRVZfTUFYX0RFTlNJVFkpCisgICAgeworICAgICAgICByZXR1cm4gTFZSRVZfT1VUT0ZSQU5HRTsKKyAgICB9CisKKyAgICBpZiAocE5ld1BhcmFtcy0+RGFtcGluZyA+IExWUkVWX01BWF9EQU1QSU5HKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7CisgICAgfQorCisgICAgaWYgKHBOZXdQYXJhbXMtPlJvb21TaXplID4gTFZSRVZfTUFYX1JPT01TSVpFKQorICAgIHsKKyAgICAgICAgcmV0dXJuIExWUkVWX09VVE9GUkFOR0U7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDb3B5IHRoZSBuZXcgcGFyYW1ldGVycyBhbmQgc2V0IHRoZSBmbGFnIHRvIGluZGljYXRlIHRoZXkgYXJlIGF2YWlsYWJsZQorICAgICAqLworICAgIHBMVlJFVl9Qcml2YXRlLT5OZXdQYXJhbXMgICAgICAgPSAqcE5ld1BhcmFtczsKKyAgICBwTFZSRVZfUHJpdmF0ZS0+YkNvbnRyb2xQZW5kaW5nID0gTFZNX1RSVUU7CisKKyAgICByZXR1cm4gTFZSRVZfU1VDQ0VTUzsKK30KKworLyogRW5kIG9mIGZpbGUgKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZWRjNjAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpbmNsdWRlICJMVlJFVi5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUYWJsZSB3aXRoIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcy4gIFRoZSB0YWJsZSBjYW4gYmUgaW5kZXhlZCB1c2luZyBMVk1fRnNfZW4gICAgICAgKi8KLSNpZm5kZWYgSElHSEVSX0ZTCi1jb25zdCBMVk1fVUlOVDE2IExWTV9Gc1RhYmxlW10gPSB7Ci0gICAgODAwMCAsCi0gICAgMTEwMjUsCi0gICAgMTIwMDAsCi0gICAgMTYwMDAsCi0gICAgMjIwNTAsCi0gICAgMjQwMDAsCi0gICAgMzIwMDAsCi0gICAgNDQxMDAsCi0gICAgNDgwMDAKLX07Ci0jZWxzZQotY29uc3QgTFZNX1VJTlQzMiBMVk1fRnNUYWJsZVtdID0gewotICAgIDgwMDAgLAotICAgIDExMDI1LAotICAgIDEyMDAwLAotICAgIDE2MDAwLAotICAgIDIyMDUwLAotICAgIDI0MDAwLAotICAgIDMyMDAwLAotICAgIDQ0MTAwLAotICAgIDQ4MDAwLAotICAgIDk2MDAwLAotICAgIDE5MjAwMAotfTsKLSNlbmRpZgotLyogVGFibGUgd2l0aCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMuICBUaGUgdGFibGUgY2FuIGJlIGluZGV4ZWQgdXNpbmcgTFZNX0ZzX2VuICAgICAgICovCi0jaWZuZGVmIEhJR0hFUl9GUwotTFZNX1VJTlQxNiBMVk1fR2V0RnNGcm9tVGFibGUoTFZNX0ZzX2VuIEZzSW5kZXgpewotICAgIGlmIChGc0luZGV4ID4gTFZNX0ZTXzQ4MDAwKQotICAgICAgICByZXR1cm4gMDsKLQotICAgIHJldHVybiAoTFZNX0ZzVGFibGVbRnNJbmRleF0pOwotfQotI2Vsc2UKLUxWTV9VSU5UMzIgTFZNX0dldEZzRnJvbVRhYmxlKExWTV9Gc19lbiBGc0luZGV4KXsKLSAgICBpZiAoRnNJbmRleCA+IExWTV9GU18xOTIwMDApCi0gICAgICAgIHJldHVybiAwOwotCi0gICAgcmV0dXJuIChMVk1fRnNUYWJsZVtGc0luZGV4XSk7Ci19Ci0jZW5kaWYKLQotLyogSW4gb3JkZXIgdG8gbWFpbnRhaW4gY29uc2lzdGFudCBpbnB1dCBhbmQgb3V0IHB1dCBzaWduYWwgc3RyZW5ndGhzCi0gICBvdXRwdXQgZ2Fpbi9hdHRlbnVhdGlvbiBpcyBhcHBsaWVkLiBUaGlzIGdhaW4gZGVwZW5kcyBvbiBUNjAgYW5kIFJvb21zCi0gICBzaXplIHBhcmFtZXRlcnMuIFRoZXNlIHBvbHlub21pYWwgY29lZmZpY2llbnRzIGFyZSBjYWxjdWxhdGVkIGV4cGVyaW1lbnRhbGx5LgotICAgRmlyc3QgdmFsdWUgaW4gdGhlIHRhYmxlIGlzIHJvb20gc2l6ZQotICAgc2Vjb25kIHZhbHVlIGlzICBBMAotICAgdGhpcmQgdmFsdWUgaXMgICBBMQotICAgZm91cnRoIHZhbHVlIGlzICBBMgotICAgZmlmdGggdmFsdWUgaXMgICBBMwotICAgc2l4dGggdmFsdWUgaXMgICBBNAotCi0gICAgIHNoaWZ0IHZhbHVlICBpcyB0byBiZSBhZGRlZCBhcnJheSAodG8gdXNlIExWTV9Qb2x5bm9taWFsIGZ1bmN0aW9uKQotCi0gIFRoZSBnYWluIGlzIGNhbGN1bGF0ZWQgdXNpbmcgdmFyaWFibGUgeD0oVDYwKjMyNzY3LzcwMDApKjMyNzY4OwotCi0gICBmaXJzdCB2YWx1ZXMgaXMgdXNlZCB0byBnZXQgcG9seW5vbWlhbCBzZXQgZm9yIGdpdmVuIHJvb20gc2l6ZSwKLSAgIEZvciByb29tIHNpemVzIHdoaWNoIGFyZSBub3QgaW4gdGhlIHRhYmxlLCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBjYW4gYmUgdXNlZC4KLQotICAqLwotCi0vKiBOb3JtYWxpemluZyBvdXRwdXQgaW5jbHVkaW5nIFJldmVyYiBMZXZlbCBwYXJ0IChvbmx5IHNoaWZ0IHVwKSovCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi1jb25zdCBMVk1fSU5UMzIgTFZSRVZfR2FpblBvbHlUYWJsZVsyNF1bNV09e3sxLDE3NTQ3NDM0LDEyODg2NzQzNCwtMTIwOTg4ODk2LDUwNzYxMjI4LH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyLDE4MjU2ODY5LDE3MjY2NjkwMiwtMTkzMTY5MjkyLDg4MzQ1NzQ0LH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszLDE2NTkxMzExLDEzOTI1MDE1MSwtMTQ5NjY3MjM0LDY2NzcwMDU5LH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs0LDE3Mzc5OTc3LDE3MDgzNTEzMSwtMTczNTc5MzIxLDc2Mjc4MTYzLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs1LDE4OTYzNTEyLDIxMDM2NDkzNCwtMjI4NjIzNTE5LDEwMzQzNTAyMix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NiwxNzc5NjMxOCwxMzU3NTY0MTcsLTE0NDA4NDA1Myw2NDMyNzY5OCx9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NywxNzQ1NDY5NSwxNzQ1OTMyMTQsLTE4NzUxMzA2NCw4NTE0NjU4Mix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7OCwxNzIyOTI1NywxNDA3MTU1NzAsLTE0NTc5MDU4OCw2NTM2MTc0MCx9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7OSwxNzAwMDU0NywxNjMxOTU5NDYsLTE3NjczMzk2OSw3OTU2MjEzMCx9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTAsMTY3MTE2OTksMTQyNDc2MzA0LC0xMzMzMzk4ODcsNTgzNjY1NDcsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEzLDE4MTA4NDE5LDE0OTIyMzY5NywtMTYxNzYyMDIwLDc0Mzk3NTg5LH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxNSwxNjY4MjA0MywxMjQ4NDQ4ODQsLTEzNDI4NDQ4Nyw2MDA4MjE4MCx9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTcsMTY2MjczNDYsMTIwOTM2NDMwLC0xMjE3NjY2NzQsNTMxNDY0MjEsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezIwLDE3MzM4MzI1LDEyNTQzMjY5NCwtMTI2NjE2OTgzLDU2NTM0MjM3LH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyNSwxNjQ4OTE0Niw5OTIxODIxNywtOTQ1OTc0NjcsNDA2MTY1MDYsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezMwLDE1NTgyMzczLDg0NDc5MDQzLC03NTM2NTAwNiwzMDk1MjM0OCx9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NDAsMTYwMDA2NjksODQ4OTY2MTEsLTc1MDMxMTI3LDMwNjk2MzA2LH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs1MCwxNTA4NzA1NCw3MTY5NTAzMSwtNTkzNDkyNjgsMjMyNzk2NjksfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezYwLDE1ODMwNzE0LDY4NjcyOTcxLC01ODIxMTIwMSwyMzY3MTE1OCx9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NzAsMTU1MzYwNjEsNjY2NTc5NzIsLTU1OTAxNDM3LDIyNTYwMTUzLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs3NSwxNTAxMzE0NSw0ODE3OTkxNywtMjQxMzgzNTQsNTIzMjA3NCx9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ODAsMTU2ODg3MzgsNTAxOTUwMzYsLTM0MjA2NzYwLDExNTE1NzkyLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs5MCwxNjAwMzMyMiw0ODMyMzY2MSwtMzU2MDczNzgsMTMxNTM4NzIsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezEwMCwxNTk1NTIyMyw0ODU1ODIwMSwtMzM3MDY4NjUsMTE3MTU3OTIsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSNlbHNlCi1jb25zdCBMVk1fRkxPQVQgTFZSRVZfR2FpblBvbHlUYWJsZVsyNF1bNV09e3sxLDEuMDQ1OTA5Ziw3LjY4MTA5OGYsLTcuMjExNTAwZiwzLjAyNTYwNWYsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezIsMS4wODgxOTRmLDEwLjI5MTc0OWYsLTExLjUxMzc4N2YsNS4yNjU4MTdmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszLDAuOTg4OTE5Ziw4LjI5OTk1NmYsLTguOTIwODYyZiwzLjk3OTgwNmYsfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezQsMS4wMzU5MjdmLDEwLjE4MjU2N2YsLTEwLjM0NjEzNGYsNC41NDY1MzNmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs1LDEuMTMwMzEzZiwxMi41Mzg3MjdmLC0xMy42MjcwMjNmLDYuMTY1MjA4Zix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NiwxLjA2MDc0M2YsOC4wOTE3MTNmLC04LjU4ODA3OWYsMy44MzQyMzBmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs3LDEuMDQwMzgxZiwxMC40MDY1NjZmLC0xMS4xNzY2NTBmLDUuMDc1MTMyZix9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7OCwxLjAyNjk0NGYsOC4zODczMDJmLC04LjY4OTc5NmYsMy44OTU4NjNmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs5LDEuMDEzMzEyZiw5LjcyNzIzNmYsLTEwLjUzNDE2NWYsNC43NDIyNzJmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMCwwLjk5NjA5NWYsOC40OTIyNDlmLC03Ljk0NzY3N2YsMy40Nzg5MTdmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMywxLjA3OTM0NmYsOC44OTQ0MjVmLC05LjY0MTc2OGYsNC40MzQ0NDJmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxNSwwLjk5NDMyN2YsNy40NDEzMzVmLC04LjAwMzk3OWYsMy41ODExNzdmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxNywwLjk5MTA2N2YsNy4yMDgzNzNmLC03LjI1Nzg1OWYsMy4xNjc3NzRmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyMCwxLjAzMzQ0NWYsNy40NzYzNzFmLC03LjU0Njk2MGYsMy4zNjk3MDNmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyNSwwLjk4MjgzMGYsNS45MTM4NjdmLC01LjYzODQ0OGYsMi40MjA5MzJmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszMCwwLjkyODc4MmYsNS4wMzUzNDNmLC00LjQ5MjEwNGYsMS44NDQ5MDRmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs0MCwwLjk1MzcxNGYsNS4wNjAyMzJmLC00LjQ3MjIwNGYsMS44Mjk2NDJmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs1MCwwLjg5OTI1OGYsNC4yNzMzNTdmLC0zLjUzNzQ5MmYsMS4zODc1NzZmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs2MCwwLjk0MzU4NGYsNC4wOTMyMjhmLC0zLjQ2OTY1OGYsMS40MTA5MTFmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs3MCwwLjkyNjAyMWYsMy45NzMxMjVmLC0zLjMzMTk4NWYsMS4zNDQ2OTBmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs3NSwwLjg5NDg1M2YsMi44NzE3NDdmLC0xLjQzODc1OGYsMC4zMTE4NTZmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs4MCwwLjkzNTEyMmYsMi45OTE4NTdmLC0yLjAzODg4MmYsMC42ODYzOTVmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs5MCwwLjk1Mzg3MmYsMi44ODAzMTVmLC0yLjEyMjM2NWYsMC43ODQwMzJmLH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMDAsMC45NTEwMDVmLDIuODk0Mjk0ZiwtMi4wMDkwODZmLDAuNjk4MzE2Zix9LAotfTsKLSNlbmRpZgotLyogRW5kIG9mIGZpbGUgKi8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkNjIzZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5jcHAKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjaW5jbHVkZSAiTFZSRVYuaCIKKyNpbmNsdWRlICJMVlJFVl9UYWJsZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUYWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogVGFibGUgd2l0aCBzdXBwb3J0ZWQgc2FtcGxpbmcgcmF0ZXMuICBUaGUgdGFibGUgY2FuIGJlIGluZGV4ZWQgdXNpbmcgTFZNX0ZzX2VuICAgICAgICovCitjb25zdCBMVk1fVUlOVDMyIExWTV9Gc1RhYmxlW10gPSB7CisgICAgODAwMCAsCisgICAgMTEwMjUsCisgICAgMTIwMDAsCisgICAgMTYwMDAsCisgICAgMjIwNTAsCisgICAgMjQwMDAsCisgICAgMzIwMDAsCisgICAgNDQxMDAsCisgICAgNDgwMDAsCisgICAgODgyMDAsCisgICAgOTYwMDAsCisgICAgMTc2NDAwLAorICAgIDE5MjAwMAorfTsKKy8qIFRhYmxlIHdpdGggc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGVzLiAgVGhlIHRhYmxlIGNhbiBiZSBpbmRleGVkIHVzaW5nIExWTV9Gc19lbiAgICAgICAqLworTFZNX1VJTlQzMiBMVk1fR2V0RnNGcm9tVGFibGUoTFZNX0ZzX2VuIEZzSW5kZXgpeworICAgIGlmIChGc0luZGV4ID4gTFZNX0ZTXzE5MjAwMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICByZXR1cm4gKExWTV9Gc1RhYmxlW0ZzSW5kZXhdKTsKK30KKworLyogSW4gb3JkZXIgdG8gbWFpbnRhaW4gY29uc2lzdGFudCBpbnB1dCBhbmQgb3V0IHB1dCBzaWduYWwgc3RyZW5ndGhzCisgICBvdXRwdXQgZ2Fpbi9hdHRlbnVhdGlvbiBpcyBhcHBsaWVkLiBUaGlzIGdhaW4gZGVwZW5kcyBvbiBUNjAgYW5kIFJvb21zCisgICBzaXplIHBhcmFtZXRlcnMuIFRoZXNlIHBvbHlub21pYWwgY29lZmZpY2llbnRzIGFyZSBjYWxjdWxhdGVkIGV4cGVyaW1lbnRhbGx5LgorICAgRmlyc3QgdmFsdWUgaW4gdGhlIHRhYmxlIGlzIHJvb20gc2l6ZQorICAgc2Vjb25kIHZhbHVlIGlzICBBMAorICAgdGhpcmQgdmFsdWUgaXMgICBBMQorICAgZm91cnRoIHZhbHVlIGlzICBBMgorICAgZmlmdGggdmFsdWUgaXMgICBBMworICAgc2l4dGggdmFsdWUgaXMgICBBNAorCisgICAgIHNoaWZ0IHZhbHVlICBpcyB0byBiZSBhZGRlZCBhcnJheSAodG8gdXNlIExWTV9Qb2x5bm9taWFsIGZ1bmN0aW9uKQorCisgIFRoZSBnYWluIGlzIGNhbGN1bGF0ZWQgdXNpbmcgdmFyaWFibGUgeD0oVDYwKjMyNzY3LzcwMDApKjMyNzY4OworCisgICBmaXJzdCB2YWx1ZXMgaXMgdXNlZCB0byBnZXQgcG9seW5vbWlhbCBzZXQgZm9yIGdpdmVuIHJvb20gc2l6ZSwKKyAgIEZvciByb29tIHNpemVzIHdoaWNoIGFyZSBub3QgaW4gdGhlIHRhYmxlLCBsaW5lYXIgaW50ZXJwb2xhdGlvbiBjYW4gYmUgdXNlZC4KKworICAqLworCisvKiBOb3JtYWxpemluZyBvdXRwdXQgaW5jbHVkaW5nIFJldmVyYiBMZXZlbCBwYXJ0IChvbmx5IHNoaWZ0IHVwKSovCitjb25zdCBMVk1fRkxPQVQgTFZSRVZfR2FpblBvbHlUYWJsZVsyNF1bNV09e3sxLDEuMDQ1OTA5Ziw3LjY4MTA5OGYsLTcuMjExNTAwZiwzLjAyNTYwNWYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezIsMS4wODgxOTRmLDEwLjI5MTc0OWYsLTExLjUxMzc4N2YsNS4yNjU4MTdmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszLDAuOTg4OTE5Ziw4LjI5OTk1NmYsLTguOTIwODYyZiwzLjk3OTgwNmYsfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezQsMS4wMzU5MjdmLDEwLjE4MjU2N2YsLTEwLjM0NjEzNGYsNC41NDY1MzNmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs1LDEuMTMwMzEzZiwxMi41Mzg3MjdmLC0xMy42MjcwMjNmLDYuMTY1MjA4Zix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7NiwxLjA2MDc0M2YsOC4wOTE3MTNmLC04LjU4ODA3OWYsMy44MzQyMzBmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs3LDEuMDQwMzgxZiwxMC40MDY1NjZmLC0xMS4xNzY2NTBmLDUuMDc1MTMyZix9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7OCwxLjAyNjk0NGYsOC4zODczMDJmLC04LjY4OTc5NmYsMy44OTU4NjNmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs5LDEuMDEzMzEyZiw5LjcyNzIzNmYsLTEwLjUzNDE2NWYsNC43NDIyNzJmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMCwwLjk5NjA5NWYsOC40OTIyNDlmLC03Ljk0NzY3N2YsMy40Nzg5MTdmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMywxLjA3OTM0NmYsOC44OTQ0MjVmLC05LjY0MTc2OGYsNC40MzQ0NDJmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxNSwwLjk5NDMyN2YsNy40NDEzMzVmLC04LjAwMzk3OWYsMy41ODExNzdmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxNywwLjk5MTA2N2YsNy4yMDgzNzNmLC03LjI1Nzg1OWYsMy4xNjc3NzRmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyMCwxLjAzMzQ0NWYsNy40NzYzNzFmLC03LjU0Njk2MGYsMy4zNjk3MDNmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsyNSwwLjk4MjgzMGYsNS45MTM4NjdmLC01LjYzODQ0OGYsMi40MjA5MzJmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHszMCwwLjkyODc4MmYsNS4wMzUzNDNmLC00LjQ5MjEwNGYsMS44NDQ5MDRmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs0MCwwLjk1MzcxNGYsNS4wNjAyMzJmLC00LjQ3MjIwNGYsMS44Mjk2NDJmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs1MCwwLjg5OTI1OGYsNC4yNzMzNTdmLC0zLjUzNzQ5MmYsMS4zODc1NzZmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs2MCwwLjk0MzU4NGYsNC4wOTMyMjhmLC0zLjQ2OTY1OGYsMS40MTA5MTFmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs3MCwwLjkyNjAyMWYsMy45NzMxMjVmLC0zLjMzMTk4NWYsMS4zNDQ2OTBmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs3NSwwLjg5NDg1M2YsMi44NzE3NDdmLC0xLjQzODc1OGYsMC4zMTE4NTZmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs4MCwwLjkzNTEyMmYsMi45OTE4NTdmLC0yLjAzODg4MmYsMC42ODYzOTVmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHs5MCwwLjk1Mzg3MmYsMi44ODAzMTVmLC0yLjEyMjM2NWYsMC43ODQwMzJmLH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsxMDAsMC45NTEwMDVmLDIuODk0Mjk0ZiwtMi4wMDkwODZmLDAuNjk4MzE2Zix9LAorfTsKKy8qIEVuZCBvZiBmaWxlICovCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9SZXZlcmIvc3JjL0xWUkVWX1RhYmxlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmgKaW5kZXggMDY1ODE4Ni4uZTEwMGQ4YSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1JldmVyYi9zcmMvTFZSRVZfVGFibGVzLmgKQEAgLTE1LDE1ICsxNSw5IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0KICNpZm5kZWYgX0xWUkVWX1RBQkxFU19IXwogI2RlZmluZSBfTFZSRVZfVEFCTEVTX0hfCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zNywyMiArMzEsMTAgQEAKIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLSNpZm5kZWYgSElHSEVSX0ZTCi1leHRlcm4gY29uc3QgICAgTFZNX1VJTlQxNiAgTFZNX0ZzVGFibGVbXTsKLWV4dGVybiAgICAgICAgICBMVk1fVUlOVDE2ICBMVk1fR2V0RnNGcm9tVGFibGUoTFZNX0ZzX2VuIEZzSW5kZXgpOwotI2Vsc2UKIGV4dGVybiBjb25zdCAgICBMVk1fVUlOVDMyICBMVk1fRnNUYWJsZVtdOwogZXh0ZXJuICAgICAgICAgIExWTV9VSU5UMzIgIExWTV9HZXRGc0Zyb21UYWJsZShMVk1fRnNfZW4gRnNJbmRleCk7Ci0jZW5kaWYKIAotI2lmbmRlZiBCVUlMRF9GTE9BVAotZXh0ZXJuICAgICAgICAgIExWTV9JTlQzMiAgIExWUkVWX0dhaW5Qb2x5VGFibGVbMjRdWzVdOwotI2Vsc2UKLWV4dGVybiAgICAgICAgICBMVk1fRkxPQVQgICBMVlJFVl9HYWluUG9seVRhYmxlWzI0XVs1XTsKLSNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYKK2V4dGVybiBjb25zdCAgICBMVk1fRkxPQVQgICBMVlJFVl9HYWluUG9seVRhYmxlWzI0XVs1XTsKIAogI2VuZGlmICAvKiogX0xWUkVWX1RBQkxFU19IXyAqKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvbGliL0xWUFNBLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIvTFZQU0EuaAppbmRleCAyMDM4ZmJiLi5jOWZhN2FkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIvTFZQU0EuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIvTFZQU0EuaApAQCAtMTgsMTQgKzE4LDggQEAKICNpZm5kZWYgX0xWUFNBX0hfCiAjZGVmaW5lIF9MVlBTQV9IXwogCi0KICNpbmNsdWRlICJMVk1fVHlwZXMuaCIKIAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgQ09OU1RBTlRTIERFRklOSVRJT05TICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTExNiw4ICsxMTAsNiBAQAogICAgIExWUFNBX1JFVFVSTl9EVU1NWSA9IExWTV9NQVhJTlRfMzIgICAgICAgICAgICAgICAgICAgICAgLyogRm9yY2UgMzIgYml0cyBlbnVtLCBkb24ndCB1c2UgaXQhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIH0gTFZQU0FfUkVUVVJOOwogCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT05TIFBST1RPVFlQRQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTIxNiwxNyArMjA4LDEwIEBACiAvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKIExWUFNBX1JFVFVSTiBMVlBTQV9Qcm9jZXNzICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBMVlBTQV9JbnB1dFNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBJbnB1dEJsb2NrU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX1RpbWUgICAgICAgICAgIEF1ZGlvVGltZSAgICAgICAgICAgICApOwotI2Vsc2UKLUxWUFNBX1JFVFVSTiBMVlBTQV9Qcm9jZXNzICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBMVlBTQV9JbnB1dFNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBJbnB1dEJsb2NrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX1RpbWUgICAgICAgICAgIEF1ZGlvVGltZSAgICAgICAgICAgICApOwotI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0dldFNwZWN0cnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0yODgsOSArMjczLDQgQEAKIExWUFNBX1JFVFVSTiBMVlBTQV9HZXRJbml0UGFyYW1zICAgICAoICAgIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgICAgICAgKnBQYXJhbXMgICAgICApOwogCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KICNlbmRpZiAvKiBfTFZQU0FfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2YzRlYTcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuYworKysgL2Rldi9udWxsCkBAIC0xLDk0MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAgICAiTFZQU0EuaCIKLSNpbmNsdWRlICAgICJMVlBTQV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAgICAiVmVjdG9yQXJpdGhtZXRpYy5oIgotCi0jZGVmaW5lICAgICBMT1dfRlJFUSAgICAgICAgICAgIDI5OCAgICAgICAgICAgICAvKiAzMjc2OC8xMTAgZm9yIGxvdyB0ZXN0IGZyZXF1ZW5jeSAqLwotI2RlZmluZSAgICAgSElHSF9GUkVRICAgICAgICAgICAzODYgICAgICAgICAgICAgLyogMzI3NjgvODUgZm9yIGhpZ2ggdGVzdCBmcmVxdWVuY3kgKi8KLQotTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRmlsdGVyc1R5cGUgKCAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcyAgKTsKLQotTFZQU0FfUkVUVVJOIExWUFNBX1NldFFQRkNvZWZmaWNpZW50cyggTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcyAgKTsKLQotI2lmZGVmIEJVSUxEX0ZMT0FUCi1MVlBTQV9SRVRVUk4gTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoICBMVk1fVUlOVDE2ICAgICAgICAgICAgIEZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgICpwRmlsdGVyUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgKnBDb2VmZmljaWVudHMpOwotCi1MVlBTQV9SRVRVUk4gTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoICBMVk1fVUlOVDE2ICAgICAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAqcEZpbHRlclBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgKnBDb2VmZmljaWVudHMpOwotI2Vsc2UKLUxWUFNBX1JFVFVSTiBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcyggIExWTV9VSU5UMTYgICAgICAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgKnBGaWx0ZXJQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9DMTZfQ29lZnNfdCAgICAgICAgKnBDb2VmZmljaWVudHMpOwotCi1MVlBTQV9SRVRVUk4gTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoICBMVk1fVUlOVDE2ICAgICAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAqcEZpbHRlclBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MzMl9Db2Vmc190ICAgICAgICpwQ29lZmZpY2llbnRzKTsKLQotTFZQU0FfUkVUVVJOIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKCAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgICAqcEZpbHRlclBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MzMl9Db2Vmc190ICAgICAgICAgICpwQ29lZmZpY2llbnRzKTsKLSNlbmRpZgotTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRkNvZWZmaWNpZW50cyggTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcyAgKTsKLQotTFZQU0FfUkVUVVJOIExWUFNBX0NsZWFyRmlsdGVySGlzdG9yeSggTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QpOwotCi0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0NvbnRyb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBHaXZlIHNvbWUgbmV3IGNvbnRyb2wgcGFyYW1ldGVycyB0byB0aGUgbW9kdWxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTmV3UGFyYW1zICAgICAgICAgICBTdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgbmV3IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0NvbnRyb2wgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwTmV3UGFyYW1zICAgICApCi17Ci0KLSAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwTFZQU0FfSW5zdCAgICA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKLQotICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwTmV3UGFyYW1zID09IExWTV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7Ci0gICAgfQotICAgIGlmKHBOZXdQYXJhbXMtPkZzID49IExWUFNBX05SX1NVUFBPUlRFRF9SQVRFKQotICAgIHsKLSAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7Ci0gICAgfQotICAgIGlmKHBOZXdQYXJhbXMtPkxldmVsRGV0ZWN0aW9uU3BlZWQgPj0gTFZQU0FfTlJfU1VQUE9SVEVEX1NQRUVEKQotICAgIHsKLSAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7Ci0gICAgfQotCi0gICAgcExWUFNBX0luc3QtPk5ld1BhcmFtcyA9ICpwTmV3UGFyYW1zOwotICAgIHBMVlBTQV9JbnN0LT5iQ29udHJvbFBlbmRpbmcgPSBMVk1fVFJVRTsKLQotICAgIHJldHVybihMVlBTQV9PSyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfR2V0Q29udHJvbFBhcmFtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEdldCB0aGUgY3VycmVudCBjb250cm9sIHBhcmFtZXRlcnMgb2YgdGhlIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwUGFyYW1zICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBjb250cm9sIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9HZXRDb250cm9sUGFyYW1zICAgICAgICAgKCAgICBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAqcFBhcmFtcyApCi17Ci0gICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcExWUFNBX0luc3QgICAgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7Ci0KLSAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocFBhcmFtcyA9PSBMVk1fTlVMTCkpCi0gICAgewotICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOwotICAgIH0KLQotICAgIHBQYXJhbXMtPkZzICAgICAgICAgICAgICAgICAgICAgPSBwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5GczsKLSAgICBwUGFyYW1zLT5MZXZlbERldGVjdGlvblNwZWVkICAgID0gcExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZDsKLQotICAgIHJldHVybihMVlBTQV9PSyk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9HZXRJbml0UGFyYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgR2V0IHRoZSBpbml0aWFsaXphdGlvbiBwYXJhbWV0ZXJzIG9mIHRoZSBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBQYXJhbXMgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IGNvbnRyb2wgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0dldEluaXRQYXJhbXMgICAgICAgICAoICAgIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICAgICpwUGFyYW1zICkKLXsKLSAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwTFZQU0FfSW5zdCAgICA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKLQotICAgIGlmKChoSW5zdGFuY2UgPT0gTFZNX05VTEwpIHx8IChwUGFyYW1zID09IExWTV9OVUxMKSkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7Ci0gICAgfQotCi0gICAgcFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gICA9IHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbjsKLSAgICBwUGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSAgICAgICAgICAgID0gcExWUFNBX0luc3QtPk1heElucHV0QmxvY2tTaXplOwotICAgIHBQYXJhbXMtPm5CYW5kcyAgICAgICAgICAgICAgICAgICAgICAgPSBwTFZQU0FfSW5zdC0+bkJhbmRzOwotICAgIHBQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zICAgICAgICAgICAgICAgPSBwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXM7Ci0KLSAgICByZXR1cm4oTFZQU0FfT0spOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJlaW5pdGlhbGl6ZSBzb21lIHBhcmFtZXRlcnMgYW5kIGNoYW5nZXMgZmlsdGVycycgY29lZmZpY2llbnRzIGlmICAgICAgICAgICAgICAgKi8KLS8qICBzb21lIGNvbnRyb2wgcGFyYW1ldGVycyBoYXZlIGNoYW5nZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwSW5zdCAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9BcHBseU5ld1NldHRpbmdzIChMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwSW5zdCkKLXsKLSAgICBMVk1fVUlOVDE2IGlpOwotICAgIExWTV9VSU5UMTYgRnJlcTsKLSAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICBQYXJhbXM7Ci0gICAgZXh0ZXJuIExWTV9JTlQxNiAgICAgICAgTFZQU0FfblNhbXBsZXNCdWZmZXJVcGRhdGVbXTsKLSNpZm5kZWYgSElHSEVSX0ZTCi0gICAgZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOwotI2Vsc2UKLSAgICBleHRlcm4gTFZNX1VJTlQzMiAgICAgICBMVlBTQV9TYW1wbGVSYXRlVGFiW107Ci0jZW5kaWYKLSAgICBleHRlcm4gTFZNX1VJTlQxNiAgICAgICBMVlBTQV9Eb3duU2FtcGxpbmdGYWN0b3JbXTsKLQotCi0gICAgaWYocEluc3QgPT0gMCkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7Ci0gICAgfQotCi0gICAgUGFyYW1zID0gcEluc3QtPk5ld1BhcmFtczsKLQotICAgIC8qIE1vZGlmaWVzIGZpbHRlcnMgdHlwZXMgYW5kIGNvZWZmaWNpZW50cywgY2xlYXIgdGhlIHRhcHMgYW5kCi0gICAgICAgcmUtaW5pdGlhbGl6ZXMgcGFyYW1ldGVycyBpZiBzYW1wbGUgZnJlcXVlbmN5IGhhcyBjaGFuZ2VkICAgICovCi0gICAgaWYoUGFyYW1zLkZzICE9IHBJbnN0LT5DdXJyZW50UGFyYW1zLkZzKQotICAgIHsKLSAgICAgICAgcEluc3QtPkN1cnJlbnRQYXJhbXMuRnMgPSBQYXJhbXMuRnM7Ci0KLSAgICAgICAgLyogSW5pdGlhbGl6ZSB0aGUgY2VudGVyIGZyZXFldW5jaWVzIGFzIGEgZnVuY3Rpb24gb2YgdGhlIHNhbXBsZSByYXRlICovCi0gICAgICAgIEZyZXEgPSAoTFZNX1VJTlQxNikgKChMVlBTQV9TYW1wbGVSYXRlVGFiW3BJbnN0LT5DdXJyZW50UGFyYW1zLkZzXT4+MSkgLyAocEluc3QtPm5CYW5kcyArIDEpKTsKLSAgICAgICAgZm9yKGlpID0gcEluc3QtPm5CYW5kczsgaWkgPiAwOyBpaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWktMV0uQ2VudGVyRnJlcXVlbmN5ID0gKExWTV9VSU5UMTYpIChGcmVxICogaWkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogQ291bnQgdGhlIG51bWJlciBvZiByZWxldmFudCBmaWx0ZXJzLiBJZiB0aGUgY2VudGVyIGZyZXF1ZW5jeSBvZiB0aGUgZmlsdGVyIGlzCi0gICAgICAgICAgIGJpZ2dlciB0aGFuIHRoZSBueXF1aXN0IGZyZXF1ZW5jeSwgdGhlbiB0aGUgZmlsdGVyIGlzIG5vdCByZWxldmFudCBhbmQgZG9lc24ndAotICAgICAgICAgICBuZWVkIHRvIGJlIHVzZWQgKi8KLSAgICAgICAgZm9yKGlpID0gcEluc3QtPm5CYW5kczsgaWkgPiAwOyBpaS0tKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZihwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWktMV0uQ2VudGVyRnJlcXVlbmN5IDwgKExWUFNBX1NhbXBsZVJhdGVUYWJbcEluc3QtPkN1cnJlbnRQYXJhbXMuRnNdPj4xKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwSW5zdC0+blJlbGV2YW50RmlsdGVycyA9IGlpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIExWUFNBX1NldEJQRmlsdGVyc1R5cGUocEluc3QsICZQYXJhbXMpOwotICAgICAgICBMVlBTQV9TZXRCUEZDb2VmZmljaWVudHMocEluc3QsICZQYXJhbXMpOwotICAgICAgICBMVlBTQV9TZXRRUEZDb2VmZmljaWVudHMocEluc3QsICZQYXJhbXMpOwotICAgICAgICBMVlBTQV9DbGVhckZpbHRlckhpc3RvcnkocEluc3QpOwotICAgICAgICBwSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgPSAoTFZNX1VJTlQxNilMVlBTQV9uU2FtcGxlc0J1ZmZlclVwZGF0ZVtQYXJhbXMuRnNdOwotICAgICAgICBwSW5zdC0+QnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50ID0gMDsKLSAgICAgICAgcEluc3QtPkRvd25TYW1wbGluZ0ZhY3RvciA9IExWUFNBX0Rvd25TYW1wbGluZ0ZhY3RvcltQYXJhbXMuRnNdOwotICAgICAgICBwSW5zdC0+RG93blNhbXBsaW5nQ291bnQgPSAwOwotICAgICAgICBmb3IoaWkgPSAwOyBpaSA8IChwSW5zdC0+bkJhbmRzICogcEluc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCk7IGlpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBJbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnRbaWldID0gMDsKLSAgICAgICAgfQotICAgICAgICBmb3IoaWkgPSAwOyBpaSA8IHBJbnN0LT5uQmFuZHM7IGlpKyspCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBJbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0gPSAwOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmKFBhcmFtcy5MZXZlbERldGVjdGlvblNwZWVkICE9IHBJbnN0LT5DdXJyZW50UGFyYW1zLkxldmVsRGV0ZWN0aW9uU3BlZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExWUFNBX1NldFFQRkNvZWZmaWNpZW50cyhwSW5zdCwgJlBhcmFtcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwSW5zdC0+Q3VycmVudFBhcmFtcyA9IHBJbnN0LT5OZXdQYXJhbXM7Ci0KLSAgICByZXR1cm4gKExWUFNBX09LKTsKLX0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfU2V0QlBGaWx0ZXJzVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNldHMgdGhlIGZpbHRlciB0eXBlIGJhc2VkIG9uIHRoZSBCUEZpbHRlclR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBJbnN0ICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwUGFyYW1zICAgICAgICAgICAgIFBvbml0ZXIgdG8gY29ucm9sIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlBTQV9PSyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiBUbyBzZWxlY3QgdGhlIGJpcXVhZCB0eXBlIHRoZSBmb2xsb3cgcnVsZXMgYXJlIGFwcGxpZWQ6ICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICBEb3VibGUgcHJlY2lzaW9uICAgIGlmIChmYyA8PSBmcy8xMTApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgRG91YmxlIHByZWNpc2lvbiAgICBpZiAoZnMvMTEwIDwgZmMgPCBmcy84NSkgJiAoUT4zKSAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgIFNpbmdsZSBwcmVjaXNpb24gICAgb3RoZXJ3aXNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9TZXRCUEZpbHRlcnNUeXBlICggICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICpwSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcyAgKQotewotI2lmbmRlZiBISUdIRVJfRlMKLSAgICBleHRlcm4gTFZNX1VJTlQxNiAgIExWUFNBX1NhbXBsZVJhdGVUYWJbXTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNhbXBsZSByYXRlIHRhYmxlICovCi0jZWxzZQotICAgIGV4dGVybiBMVk1fVUlOVDMyICAgTFZQU0FfU2FtcGxlUmF0ZVRhYltdOyAgICAgICAgICAgICAgICAgLyogU2FtcGxlIHJhdGUgdGFibGUgKi8KLSNlbmRpZgotICAgIExWTV9VSU5UMTYgICAgICAgICAgaWk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGJhbmQgaW5kZXggKi8KLSAgICBMVk1fVUlOVDMyICAgICAgICAgIGZzID0gKExWTV9VSU5UMzIpTFZQU0FfU2FtcGxlUmF0ZVRhYlsoTFZNX1VJTlQxNilwUGFyYW1zLT5Gc107ICAgICAgLyogU2FtcGxlIHJhdGUgKi8KLSAgICBMVk1fVUlOVDMyICAgICAgICAgIGZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBjZW50cmUgZnJlcXVlbmN5ICovCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICBRRmFjdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgUSBmYWN0b3IgKi8KLQotICAgIGZvciAoaWkgPSAwOyBpaSA8IHBJbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogR2V0IHRoZSBmaWx0ZXIgc2V0dGluZ3MKLSAgICAgICAgICovCi0gICAgICAgIGZjID0gKExWTV9VSU5UMzIpcEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpXS5DZW50ZXJGcmVxdWVuY3k7ICAgICAvKiBHZXQgdGhlIGJhbmQgY2VudHJlIGZyZXF1ZW5jeSAqLwotICAgICAgICBRRmFjdG9yID0oTFZNX0lOVDE2KSBwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLlFGYWN0b3I7ICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIGJhbmQgUSBmYWN0b3IgKi8KLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEZvciBlYWNoIGZpbHRlciBzZXQgdGhlIHR5cGUgb2YgYmlxdWFkIHJlcXVpcmVkCi0gICAgICAgICAqLwotICAgICAgICBwSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbltpaV0gPSBMVlBTQV9TaW1wbGVQcmVjaXNpb25GaWx0ZXI7ICAgICAvKiBEZWZhdWx0IHRvIHNpbmdsZSBwcmVjaXNpb24gKi8KLSAgICAgICAgaWYgKChMT1dfRlJFUSAqIGZzKSA+PSAoZmMgPDwgMTUpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvKgotICAgICAgICAgICAgICogZmMgPD0gZnMvMTEwCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHBJbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uW2lpXSA9IExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgoKExPV19GUkVRICogZnMpIDwgKGZjIDw8IDE1KSkgJiYgKChmYyA8PCAxNSkgPCAoSElHSF9GUkVRICogZnMpKSAmJiAoUUZhY3RvciA+IDMwMCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAqIChmcy8xMTAgPCBmYyA8IGZzLzg1KSAmIChRPjMpCi0gICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBwSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbltpaV0gPSBMVlBTQV9Eb3VibGVQcmVjaXNpb25GaWx0ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oTFZQU0FfT0spOwotfQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1NldEJQRkNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTZXRzIHRoZSBiYW5kIHBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cy4gVGhpcyB1c2VzIHRoZSB0eXBlIHRvIHNlbGVjdCAgICAgICAgICAgICovCi0vKiAgc2luZ2xlIG9yIGRvdWJsZSBwcmVjaXNpb24gY29lZmZpY2llbnRzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcEluc3QgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFBhcmFtcyAgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWUFNBX09LICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVlBTQV9SRVRVUk4gTFZQU0FfU2V0QlBGQ29lZmZpY2llbnRzKCAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMpCi17Ci0KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgICAgICAgIGlpOwotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIGNvZWZmaWNpZW50cyBmb3IgZWFjaCBiYW5kIGJ5IHRoZSBpbml0IGZ1bmN0aW9uCi0gICAgICovCi0gICAgZm9yIChpaSA9IDA7IGlpIDwgcEluc3QtPm5SZWxldmFudEZpbHRlcnM7IGlpKyspCi0gICAgewotICAgICAgICBzd2l0Y2ggIChwSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbltpaV0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgICAgTFZQU0FfRG91YmxlUHJlY2lzaW9uRmlsdGVyOgotICAgICAgICAgICAgewotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgICAgICAgICAgICAgIEJQX0MzMl9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOwotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGRvdWJsZSBwcmVjaXNpb24gY29lZmZpY2llbnRzCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcFBhcmFtcy0+RnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGNvZWZmaWNpZW50cwotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKCAmcEluc3QtPnBCUF9JbnN0YW5jZXNbaWldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBCUF9UYXBzW2lpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7Ci0jZWxzZQotICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICBDb2VmZmljaWVudHM7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGRvdWJsZSBwcmVjaXNpb24gY29lZmZpY2llbnRzCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcFBhcmFtcy0+RnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7Ci0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBTZXQgdGhlIGNvZWZmaWNpZW50cwotICAgICAgICAgICAgICAgICAqLwotICAgICAgICAgICAgICAgIEJQXzFJX0QxNkYzMkNsbF9UUkNfV1JBXzAxX0luaXQgKCAmcEluc3QtPnBCUF9JbnN0YW5jZXNbaWldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBCUF9UYXBzW2lpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7Ci0jZW5kaWYKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSAgICBMVlBTQV9TaW1wbGVQcmVjaXNpb25GaWx0ZXI6Ci0gICAgICAgICAgICB7Ci0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgICAgICAgICAgQlBfQzE2X0NvZWZzX3QgICAgICBDb2VmZmljaWVudHM7Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIENhbGN1bGF0ZSB0aGUgc2luZ2xlIHByZWNpc2lvbiBjb2VmZmljaWVudHMKLSAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgICAgICAgICBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcygoTFZNX1VJTlQxNilwUGFyYW1zLT5GcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wQlBfVGFwc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOwotCi0gICAgICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIHNpbmdsZSBwcmVjaXNpb24gY29lZmZpY2llbnRzCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcFBhcmFtcy0+RnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7Ci0KLSAgICAgICAgICAgICAgICAvKgotICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCi0gICAgICAgICAgICAgICAgICovCi0gICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wQlBfVGFwc1tpaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOwotI2VuZGlmCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4oTFZQU0FfT0spOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfU2V0UVBGQ29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNldHMgdGhlIHF1YXNpIHBlYWsgZmlsdGVycyBjb2VmZmljaWVudHMuIFRoaXMgdXNlcyB0aGUgY2hvc2VuICAgICAgICAgICAgICAgICAgKi8KLS8qICBMZXZlbERldGVjdGlvblNwZWVkIGZyb20gdGhlIGNvbnRyb2wgcGFyYW1ldGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwSW5zdCAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUGFyYW1zICAgICAgICAgICAgICBDb250cm9sIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZQU0FfT0sgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLUxWUFNBX1JFVFVSTiBMVlBTQV9TZXRRUEZDb2VmZmljaWVudHMoICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwUGFyYW1zICApCi17Ci0gICAgTFZNX1VJTlQxNiAgICAgaWk7Ci0gICAgTFZNX0ZzX2VuICAgICAgRnMgPSBwUGFyYW1zLT5GczsKLSNpZm5kZWYgQlVJTERfRkxPQVQKLSAgICBRUERfQzMyX0NvZWZzICAqcENvZWZmaWNpZW50czsKLSAgICBleHRlcm4gICAgICAgICBRUERfQzMyX0NvZWZzICAgICBMVlBTQV9RUERfQ29lZnNbXTsKLQotICAgIHBDb2VmZmljaWVudHMgPSAmTFZQU0FfUVBEX0NvZWZzWyhwUGFyYW1zLT5MZXZlbERldGVjdGlvblNwZWVkICogTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUpICsgRnNdOwotI2Vsc2UKLSAgICBRUERfRkxPQVRfQ29lZnMgICpwQ29lZmZpY2llbnRzOwotICAgIGV4dGVybiAgICAgICAgIFFQRF9GTE9BVF9Db2VmcyAgICAgTFZQU0FfUVBEX0Zsb2F0X0NvZWZzW107Ci0KLSAgICBwQ29lZmZpY2llbnRzID0gJkxWUFNBX1FQRF9GbG9hdF9Db2Vmc1socFBhcmFtcy0+TGV2ZWxEZXRlY3Rpb25TcGVlZCAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX05SX1NVUFBPUlRFRF9SQVRFKSArIEZzXTsKLSNlbmRpZgotCi0KLSAgICBmb3IgKGlpID0gMDsgaWkgPCBwSW5zdC0+blJlbGV2YW50RmlsdGVyczsgaWkrKykKLSAgICB7Ci0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgIExWUFNBX1FQRF9Jbml0ICgmcEluc3QtPnBRUERfU3RhdGVzW2lpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cFFQRF9UYXBzW2lpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHBDb2VmZmljaWVudHMgKTsKLSNlbHNlCi0gICAgICAgIExWUFNBX1FQRF9Jbml0X0Zsb2F0ICgmcEluc3QtPnBRUERfU3RhdGVzW2lpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cFFQRF9UYXBzW2lpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb2VmZmljaWVudHMgKTsKLSNlbmRpZgotICAgIH0KLQotICAgIHJldHVybihMVlBTQV9PSyk7Ci0KLX0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDYWxjdWxhdGUgc2luZ2xlIHByZWNpc2lvbiBjb2VmZmljaWVudHMgZm9yIGEgYmFuZCBwYXNzIGZpbHRlciAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBGcyAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmcgZnJlcXVlbmN5IGluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBGaWx0ZXJQYXJhbXMgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXIgZGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcENvZWZmaWNpZW50cyAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZQU0FfT0sgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gVGhlIGVxdWF0aW9ucyB1c2VkIGFyZSBhcyBmb2xsb3dzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICB0MCA9IDIgKiBQaSAqIEZjIC8gRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgYjIgPSAtMC41ICogKDJRIC0gdDApIC8gKDJRICsgdDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBiMSA9ICgwLjUgLSBiMikgKiBjb3ModDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGEwID0gKDAuNSArIGIyKSAvIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIEZjICAgICAgICAgIGlzIHRoZSBjZW50cmUgZnJlcXVlbmN5LCBEQyB0byBOeXF1aXN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgRnMgICAgICAgICAgaXMgdGhlIHNhbXBsZSBmcmVxdWVuY3ksIDgwMDAgdG8gNDgwMDAgaW4gZGVzY3JldGUgc3RlcHMgICAgICAgICAgICAqLwotLyogICAgICBRICAgICAgICAgICBpcyB0aGUgUSBmYWN0b3IsIDAuMjUgdG8gMTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAyLiBUaGlzIGZ1bmN0aW9uIGlzIGVudGlyZWx5IGJhc2VkIG9uIHRoZSBMVkVRTkJfU2luZ2xlUHJlY0NvZWZzIGZ1bmN0aW9uICAgICAgICAgICAqLwotLyogICAgIG9mIHRoZSBuIGJhbmRzIGVxdWFsaXplciAoTFZFUU5CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi1MVlBTQV9SRVRVUk4gTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIEZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgICAqcEZpbHRlclBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgKnBDb2VmZmljaWVudHMpCi17Ci0KLSAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW107Ci0gICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9Db3NDb2VmW107Ci0KLQotICAgIC8qCi0gICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcwotICAgICAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgVDA7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBEOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQTA7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBCMTsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgRHQwOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQjJfRGVuOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQjJfTnVtOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQ09TX1QwOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgY29lZjsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIGZhY3RvcjsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIHQwOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKLQotCi0gICAgLyoKLSAgICAgKiBHZXQgdGhlIGZpbHRlciBkZWZpbml0aW9uCi0gICAgICovCi0gICAgTFZNX0ZMT0FUICAgICAgICAgIEZyZXF1ZW5jeSAgID0gKExWTV9GTE9BVCkocEZpbHRlclBhcmFtcy0+Q2VudGVyRnJlcXVlbmN5KTsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgUUZhY3RvciAgICAgPSAoKExWTV9GTE9BVCkocEZpbHRlclBhcmFtcy0+UUZhY3RvcikpIC8gMTAwOwotCi0gICAgLyoKLSAgICAgKiBDYWxjdWxhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcwotICAgICAqLwotICAgIFQwID0gRnJlcXVlbmN5ICogTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbRnNdOyAgIC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLwotICAgIEQgPSAzMjAwOyAgICAgICAgICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMDAwMDAgKDEqMTAwKjJeNSkgKi8KLSAgICAgICAgICAgICAgICAgICAgLyogRm9yY2UgRCA9IDEgOiB0aGUgZnVuY3Rpb24gd2FzIG9yaWdpbmFsbHkgdXNlZCBmb3IgYSBwZWFraW5nIGZpbHRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgVGhlIEQgcGFyYW1ldGVyIGRvIG5vdCBleGlzdCBmb3IgYSBCYW5kUGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCi0KLSAgICAvKgotICAgICAqIENhbGN1bGF0ZSB0aGUgQjIgY29lZmZpY2llbnQKLSAgICAgKi8KLSAgICBEdDAgPSAgVDAgLyAyMDQ4IDsKLSAgICBCMl9EZW4gPSBRRmFjdG9yICsgRHQwOwotICAgIEIyX051bSA9IER0MCAtIFFGYWN0b3I7Ci0gICAgQjIgPSBCMl9OdW0gLyAoMiAqIEIyX0Rlbik7Ci0KLSAgICAvKgotICAgICAqIENhbGN1bGF0ZSB0aGUgY29zaW5lIGJ5IGEgcG9seW5vbWlhbCBleHBhbnNpb24gdXNpbmcgdGhlIGVxdWF0aW9uOgotICAgICAqCi0gICAgICogIENvcyArPSBjb2VmKG4pICogdDBebiAgICAgICAgICAgICAgICAgICBGb3IgbiA9IDAgdG8gNgotICAgICAqLwotICAgIFQwID0gKFQwIC8gMjA0OCkgKiAwLjYzNjU4NTU4ZjsgICAgICAgICAgICAgIC8qIFNjYWxlIHRvIDEuMCBpbiAxNi1iaXQgZm9yIHJhbmdlIDAgdG8gZnMvMiAqLwotICAgIHQwID0gVDAgOwotICAgIGZhY3RvciA9IDEuMGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdG8gMS4wIGZvciB0aGUgYTAgY29lZmZpY2llbnQgKi8KLSAgICBDT1NfVDAgPSAwLjBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGVycm9yIHRvIHplcm8gKi8KLSAgICBmb3IgKGkgPSAxOyBpIDwgNzsgaSsrKQotICAgIHsKLSAgICAgICAgY29lZiAgICA9IExWUFNBX0Zsb2F0X0Nvc0NvZWZbaV07ICAgICAgICAgICAgICAgIC8qIEdldCB0aGUgbnRoIGNvZWZmaWNpZW50ICovCi0gICAgICAgIENPU19UMCArPSAoZmFjdG9yICogY29lZik7ICAgICAgICAgLyogVGhlIG50aCBwYXJ0aWFsIHN1bSAqLwotICAgICAgICBmYWN0b3IgID0gKGZhY3RvciAqIHQwKSA7ICAgICAgICAgICAvKiBDYWxjdWxhdGUgdDBebiAqLwotICAgIH0KLSAgICBDT1NfVDAgPSBDT1NfVDAgKiA4OyAgICAvKkxWUFNBX0Nvc0NvZWZfZmxvYXRbMF0qLyAgICAgIC8qIENvcnJlY3QgdGhlIHNjYWxpbmcgKi8KLQotCi0gICAgQjEgPSAoKExWTV9GTE9BVCkwLjUgLSBCMikgKiAoQ09TX1QwKTsgICAgLyogQjEgPSAoMC41IC0gYjIpICogY29zKHQwKSAqLwotICAgIEEwID0gKChMVk1fRkxPQVQpMC41ICsgQjIpIC8gMjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBBMCA9ICgwLjUgKyBiMikgLyAyICovCi0KLSAgICAvKgotICAgICAqIFdyaXRlIGNvZWZmIGludG8gdGhlIGRhdGEgc3RydWN0dXJlCi0gICAgICovCi0gICAgcENvZWZmaWNpZW50cy0+QTAgPSBBMCAqIDI7Ci0gICAgcENvZWZmaWNpZW50cy0+QjEgPSBCMSAqIDI7Ci0gICAgcENvZWZmaWNpZW50cy0+QjIgPSBCMiAqIDI7Ci0KLSAgICByZXR1cm4oTFZQU0FfT0spOwotfQotI2Vsc2UKLUxWUFNBX1JFVFVSTiBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcyggICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgRnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAgKnBGaWx0ZXJQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MxNl9Db2Vmc190ICAgICAgICAgKnBDb2VmZmljaWVudHMpCi17Ci0KLSAgICBleHRlcm4gTFZNX0lOVDE2ICAgIExWUFNBX1R3b1BpT25Gc1RhYmxlW107Ci0gICAgZXh0ZXJuIExWTV9JTlQxNiAgICBMVlBTQV9Db3NDb2VmW107Ci0KLQotICAgIC8qCi0gICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcwotICAgICAqLwotICAgIExWTV9JTlQzMiAgICAgICAgICAgVDA7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICBEOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgQTA7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICBCMTsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgIEIyOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgRHQwOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgQjJfRGVuOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgQjJfTnVtOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgQ09TX1QwOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgY29lZjsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgIGZhY3RvcjsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgIHQwOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKLQotCi0gICAgLyoKLSAgICAgKiBHZXQgdGhlIGZpbHRlciBkZWZpbml0aW9uCi0gICAgICovCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICBGcmVxdWVuY3kgICA9IHBGaWx0ZXJQYXJhbXMtPkNlbnRlckZyZXF1ZW5jeTsKLSAgICBMVk1fVUlOVDE2ICAgICAgICAgIFFGYWN0b3IgICAgID0gcEZpbHRlclBhcmFtcy0+UUZhY3RvcjsKLQotCi0gICAgLyoKLSAgICAgKiBDYWxjdWxhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcwotICAgICAqLwotICAgIFQwID0gKExWTV9JTlQzMilGcmVxdWVuY3kgKiBMVlBTQV9Ud29QaU9uRnNUYWJsZVtGc107ICAgLyogVDAgPSAyICogUGkgKiBGYyAvIEZzICovCi0gICAgRCA9IDMyMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAwMDAwMCAoMSoxMDAqMl41KSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRm9yY2UgRCA9IDEgOiB0aGUgZnVuY3Rpb24gd2FzIG9yaWdpbmFsbHkgdXNlZCBmb3IgYSBwZWFraW5nIGZpbHRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBEIHBhcmFtZXRlciBkbyBub3QgZXhpc3QgZm9yIGEgQmFuZFBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwotCi0gICAgLyoKLSAgICAgKiBDYWxjdWxhdGUgdGhlIEIyIGNvZWZmaWNpZW50Ci0gICAgICovCi0gICAgRHQwID0gRCAqIChUMCA+PiAxMCk7Ci0gICAgQjJfRGVuID0gKExWTV9JTlQzMikoKChMVk1fVUlOVDMyKVFGYWN0b3IgPDwgMTkpICsgKExWTV9VSU5UMzIpKER0MCA+PiAyKSk7Ci0gICAgQjJfTnVtID0gKExWTV9JTlQzMikoKExWTV9VSU5UMzIpKER0MCA+PiAzKSAtICgoTFZNX1VJTlQzMilRRmFjdG9yIDw8IDE4KSk7Ci0gICAgQjIgPSAoQjJfTnVtIC8gKEIyX0RlbiA+PiAxNikpIDw8IDE1OwotCi0gICAgLyoKLSAgICAgKiBDYWxjdWxhdGUgdGhlIGNvc2luZSBieSBhIHBvbHlub21pYWwgZXhwYW5zaW9uIHVzaW5nIHRoZSBlcXVhdGlvbjoKLSAgICAgKgotICAgICAqICBDb3MgKz0gY29lZihuKSAqIHQwXm4gICAgICAgICAgICAgICAgICAgRm9yIG4gPSAwIHRvIDYKLSAgICAgKi8KLSAgICBUMCA9IChUMCA+PiAxMCkgKiAyMDg1OTsgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxlIHRvIDEuMCBpbiAxNi1iaXQgZm9yIHJhbmdlIDAgdG8gZnMvMiAqLwotICAgIHQwID0gKExWTV9JTlQxNikoVDAgPj4gMTYpOwotICAgIGZhY3RvciA9IDB4N2ZmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0byAxLjAgZm9yIHRoZSBhMCBjb2VmZmljaWVudCAqLwotICAgIENPU19UMCA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgdG8gemVybyAqLwotICAgIGZvciAoaT0xOyBpPDc7IGkrKykKLSAgICB7Ci0gICAgICAgIGNvZWYgPSBMVlBTQV9Db3NDb2VmW2ldOyAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIG50aCBjb2VmZmljaWVudCAqLwotICAgICAgICBDT1NfVDAgKz0gKGZhY3RvciAqIGNvZWYpID4+IDU7ICAgICAgICAgLyogVGhlIG50aCBwYXJ0aWFsIHN1bSAqLwotICAgICAgICBmYWN0b3IgPSAoZmFjdG9yICogdDApID4+IDE1OyAgICAgICAgICAgLyogQ2FsY3VsYXRlIHQwXm4gKi8KLSAgICB9Ci0gICAgQ09TX1QwID0gQ09TX1QwIDw8IChMVlBTQV9Db3NDb2VmWzBdKzYpOyAgICAgICAgICAvKiBDb3JyZWN0IHRoZSBzY2FsaW5nICovCi0KLQotICAgIEIxID0gKCgweDQwMDAwMDAwIC0gQjIpID4+IDE2KSAqIChDT1NfVDAgPj4gMTYpOyAgICAvKiBCMSA9ICgwLjUgLSBiMikgKiBjb3ModDApICovCi0gICAgQTAgPSAoMHg0MDAwMDAwMCArIEIyKSA+PiAxOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIEEwID0gKDAuNSArIGIyKSAvIDIgKi8KLQotICAgIC8qCi0gICAgICogV3JpdGUgY29lZmYgaW50byB0aGUgZGF0YSBzdHJ1Y3R1cmUKLSAgICAgKi8KLSAgICBwQ29lZmZpY2llbnRzLT5BMCA9IChMVk1fSU5UMTYpKEEwPj4xNik7Ci0gICAgcENvZWZmaWNpZW50cy0+QjEgPSAoTFZNX0lOVDE2KShCMT4+MTUpOwotICAgIHBDb2VmZmljaWVudHMtPkIyID0gKExWTV9JTlQxNikoQjI+PjE2KTsKLQotCi0gICAgcmV0dXJuKExWUFNBX09LKTsKLX0KLSNlbmRpZgotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDYWxjdWxhdGUgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMgZm9yIGEgYmFuZCBwYXNzIGZpbHRlciAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBGcyAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmcgZnJlcXVlbmN5IGluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBGaWx0ZXJQYXJhbXMgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXIgZGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcENvZWZmaWNpZW50cyAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZQU0FfT0sgICAgICAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gVGhlIGVxdWF0aW9ucyB1c2VkIGFyZSBhcyBmb2xsb3dzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICB0MCA9IDIgKiBQaSAqIEZjIC8gRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgYjIgPSAtMC41ICogKDJRIC0gdDApIC8gKDJRICsgdDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBiMSA9ICgwLjUgLSBiMikgKiAoMSAtIGNvc2Vycih0MCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGEwID0gKDAuNSArIGIyKSAvIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIEZjICAgICAgICAgIGlzIHRoZSBjZW50cmUgZnJlcXVlbmN5LCBEQyB0byBGcy81MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgRnMgICAgICAgICAgaXMgdGhlIHNhbXBsZSBmcmVxdWVuY3ksIDgwMDAgdG8gNDgwMDAgaW4gZGVzY3JldGUgc3RlcHMgICAgICAgICAgICAqLwotLyogICAgICBRICAgICAgICAgICBpcyB0aGUgUSBmYWN0b3IsIDAuMjUgdG8gMTIgKHJlcHJlc2VudGVkIGJ5IDI1IHRvIDEyMDApICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAyLiBUaGUgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMgYXJlIG9ubHkgdXNlZCB3aGVuIGZjIGlzIGxlc3MgdGhhbiBmcy84NSwgc28gICAqLwotLyogICAgIHRoZSBjb3NpbmUgb2YgdDAgaXMgYWx3YXlzIGNsb3NlIHRvIDEuMC4gSW5zdGVhZCBvZiBjYWxjdWxhdGluZyB0aGUgY29zaW5lICAgICAgICovCi0vKiAgICAgaXRzZWxmIHRoZSBkaWZmZXJlbmNlIGZyb20gdGhlIHZhbHVlIDEuMCBpcyBjYWxjdWxhdGVkLCB0aGlzIGNhbiBiZSBkb25lIHdpdGggICAgKi8KLS8qICAgICBsb3dlciBwcmVjaXNpb24gbWF0aHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMy4gVGhlIHZhbHVlIG9mIHRoZSBCMiBjb2VmZmljaWVudCBpcyBvbmx5IGNhbGN1bGF0ZWQgYXMgYSBzaW5nbGUgcHJlY2lzaW9uIHZhbHVlLCAgKi8KLS8qICAgICBzbWFsbCBlcnJvcnMgaW4gdGhpcyB2YWx1ZSBoYXZlIGEgY29tYmluZWQgZWZmZWN0IG9uIHRoZSBRIGFuZCBHYWluIGJ1dCBub3QgdGhlICAqLwotLyogICAgIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGZpbHRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICA0LiBUaGlzIGZ1bmN0aW9uIGlzIGVudGlyZWx5IGJhc2VkIG9uIHRoZSBMVkVRTkJfRG91YmxlUHJlY0NvZWZzIGZ1bmN0aW9uICAgICAgICAgICAqLwotLyogICAgIG9mIHRoZSBuIGJhbmRzIGVxdWFsaXplciAoTFZFUU5CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi1MVlBTQV9SRVRVUk4gTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoICAgTFZNX1VJTlQxNiAgICAgICAgICAgIEZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAqcEZpbHRlclBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgKnBDb2VmZmljaWVudHMpCi17Ci0KLSAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW107Ci0gICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9EUENvc0NvZWZbXTsKLQotICAgIC8qCi0gICAgICogSW50ZXJtZWRpYXRlIHZhcmlhYmxlcyBhbmQgdGVtcG9yYXJ5IHZhbHVlcwotICAgICAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICAgVDA7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBEOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQTA7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgICBCMTsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgRHQwOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQjJfRGVuOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQjJfTnVtOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQ29zRXJyOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgY29lZjsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIGZhY3RvcjsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgIHQwOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgaTsKLQotICAgIC8qCi0gICAgICogR2V0IHRoZSBmaWx0ZXIgZGVmaW5pdGlvbgotICAgICAqLwotICAgIExWTV9GTE9BVCAgICAgICAgICBGcmVxdWVuY3kgICA9IChMVk1fRkxPQVQpKHBGaWx0ZXJQYXJhbXMtPkNlbnRlckZyZXF1ZW5jeSk7Ci0gICAgTFZNX0ZMT0FUICAgICAgICAgIFFGYWN0b3IgICAgID0gKChMVk1fRkxPQVQpKHBGaWx0ZXJQYXJhbXMtPlFGYWN0b3IpKSAvIDEwMDsKLQotCi0gICAgLyoKLSAgICAgKiBDYWxjdWxhdGluZyB0aGUgaW50ZXJtZWRpYXRlIHZhbHVlcwotICAgICAqLwotICAgIFQwID0gRnJlcXVlbmN5ICogTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbRnNdOyAgIC8qIFQwID0gMiAqIFBpICogRmMgLyBGcyAqLwotICAgIEQgPSAzMjAwOyAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAwMDAwMCAoMSoxMDAqMl41KSAqLwotICAgICAgICAgICAgICAgICAvKiBGb3JjZSBEID0gMSA6IHRoZSBmdW5jdGlvbiB3YXMgb3JpZ2luYWxseSB1c2VkIGZvciBhIHBlYWtpbmcgZmlsdGVyLgotICAgICAgICAgICAgICAgICAgICBUaGUgRCBwYXJhbWV0ZXIgZG8gbm90IGV4aXN0IGZvciBhIEJhbmRQYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KLQotICAgIC8qCi0gICAgICogQ2FsY3VsYXRlIHRoZSBCMiBjb2VmZmljaWVudAotICAgICAqLwotICAgIER0MCA9ICBUMCAvIDIwNDggOwotICAgIEIyX0RlbiA9IFFGYWN0b3IgKyBEdDA7Ci0gICAgQjJfTnVtID0gRHQwIC0gUUZhY3RvcjsKLSAgICBCMiA9IEIyX051bSAvICgyICogQjJfRGVuKTsKLQotICAgIC8qCi0gICAgICogQ2FsY3VsYXRlIHRoZSBjb3NpbmUgZXJyb3IgYnkgYSBwb2x5bm9taWFsIGV4cGFuc2lvbiB1c2luZyB0aGUgZXF1YXRpb246Ci0gICAgICoKLSAgICAgKiAgQ29zRXJyICs9IGNvZWYobikgKiB0MF5uICAgICAgICAgICAgICAgIEZvciBuID0gMCB0byA0Ci0gICAgICovCi0gICAgVDAgPSBUMCAqIDAuOTk0NzUwZjsgICAgICAgICAgICAgICAgICAgIC8qIFNjYWxlIHRvIDEuMCBpbiAxNi1iaXQgZm9yIHJhbmdlIDAgdG8gZnMvNTAgKi8KLSAgICB0MCA9IFQwOwotICAgIGZhY3RvciA9IDEuMGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdG8gMS4wIGZvciB0aGUgYTAgY29lZmZpY2llbnQgKi8KLSAgICBDb3NFcnIgPSAwLjBmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEluaXRpYWxpc2UgdGhlIGVycm9yIHRvIHplcm8gKi8KLSAgICBmb3IgKGkgPSAxOyBpIDwgNTsgaSsrKQotICAgIHsKLSAgICAgICAgY29lZiA9IExWUFNBX0Zsb2F0X0RQQ29zQ29lZltpXTsgICAgICAgICAgICAgIC8qIEdldCB0aGUgbnRoIGNvZWZmaWNpZW50ICovCi0gICAgICAgIENvc0VyciArPSBmYWN0b3IgKiBjb2VmOyAgICAgICAgIC8qIFRoZSBudGggcGFydGlhbCBzdW0gKi8KLSAgICAgICAgZmFjdG9yID0gZmFjdG9yICogdDA7ICAgICAgICAgICAvKiBDYWxjdWxhdGUgdDBebiAqLwotICAgIH0KLSAgICBDb3NFcnIgPSBDb3NFcnIgKiAyOyAgICAgICAgICAvKiBDb3JyZWN0IHRoZSBzY2FsaW5nICovCi0KLSAgICAvKgotICAgICAqIENhbGN1bGF0ZSB0aGUgQjEgYW5kIEEwIGNvZWZmaWNpZW50cwotICAgICAqLwotICAgIEIxID0gKChMVk1fRkxPQVQpMC41IC0gQjIpOyAgICAgICAgICAgICAgICAgICAgIC8qIEIxID0gKDAuNSAtIGIyKSAqLwotICAgIEEwID0gQjEgKiBDb3NFcnIgOyAgICAvKiBUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgKDAuNSAtIGIyKSAqIGNvc2Vycih0MCkgKi8KLSAgICBCMSAtPSBBMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEIxID0gKDAuNSAtIGIyKSAqICgxIC0gY29zZXJyKHQwKSkgICovCi0gICAgQTAgPSAoKExWTV9GTE9BVCkwLjUgICsgQjIpIC8gMjsgICAgICAgICAgICAgICAgLyogQTAgPSAoMC41ICsgYjIpIC8gMiAqLwotCi0gICAgLyoKLSAgICAgKiBXcml0ZSBjb2VmZiBpbnRvIHRoZSBkYXRhIHN0cnVjdHVyZQotICAgICAqLwotICAgIHBDb2VmZmljaWVudHMtPkEwID0gQTA7Ci0gICAgcENvZWZmaWNpZW50cy0+QjEgPSBCMTsKLSAgICBwQ29lZmZpY2llbnRzLT5CMiA9IEIyOwotCi0gICAgcmV0dXJuKExWUFNBX09LKTsKLX0KLSNlbHNlCi1MVlBTQV9SRVRVUk4gTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMoICAgTFZNX1VJTlQxNiAgICAgICAgICAgIEZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICpwRmlsdGVyUGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0MzMl9Db2Vmc190ICAgICAgICpwQ29lZmZpY2llbnRzKQotewotCi0gICAgZXh0ZXJuIExWTV9JTlQxNiAgICBMVlBTQV9Ud29QaU9uRnNUYWJsZVtdOwotICAgIGV4dGVybiBMVk1fSU5UMTYgICAgTFZQU0FfRFBDb3NDb2VmW107Ci0KLSAgICAvKgotICAgICAqIEludGVybWVkaWF0ZSB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyeSB2YWx1ZXMKLSAgICAgKi8KLSAgICBMVk1fSU5UMzIgICAgICAgICAgIFQwOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgRDsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgIEEwOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgQjE7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICBCMjsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgIER0MDsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgIEIyX0RlbjsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgIEIyX051bTsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgIENvc0VycjsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgIGNvZWY7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICBmYWN0b3I7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICB0MDsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgIGk7Ci0KLSAgICAvKgotICAgICAqIEdldCB0aGUgZmlsdGVyIGRlZmluaXRpb24KLSAgICAgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgIEZyZXF1ZW5jeSAgID0gcEZpbHRlclBhcmFtcy0+Q2VudGVyRnJlcXVlbmN5OwotICAgIExWTV9VSU5UMTYgICAgICAgICAgUUZhY3RvciAgICAgPSBwRmlsdGVyUGFyYW1zLT5RRmFjdG9yOwotCi0KLSAgICAvKgotICAgICAqIENhbGN1bGF0aW5nIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzCi0gICAgICovCi0gICAgVDAgPSAoTFZNX0lOVDMyKUZyZXF1ZW5jeSAqIExWUFNBX1R3b1BpT25Gc1RhYmxlW0ZzXTsgICAvKiBUMCA9IDIgKiBQaSAqIEZjIC8gRnMgKi8KLSAgICBEID0gMzIwMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMDAwMDAwICgxKjEwMCoyXjUpICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGb3JjZSBEID0gMSA6IHRoZSBmdW5jdGlvbiB3YXMgb3JpZ2luYWxseSB1c2VkIGZvciBhIHBlYWtpbmcgZmlsdGVyLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIEQgcGFyYW1ldGVyIGRvIG5vdCBleGlzdCBmb3IgYSBCYW5kUGFzcyBmaWx0ZXIgY29lZmZpY2llbnRzICovCi0KLSAgICAvKgotICAgICAqIENhbGN1bGF0ZSB0aGUgQjIgY29lZmZpY2llbnQKLSAgICAgKi8KLSAgICBEdDAgPSBEICogKFQwID4+IDEwKTsKLSAgICBCMl9EZW4gPSAoTFZNX0lOVDMyKSgoKExWTV9VSU5UMzIpUUZhY3RvciA8PCAxOSkgKyAoTFZNX1VJTlQzMikoRHQwID4+IDIpKTsKLSAgICBCMl9OdW0gPSAoTFZNX0lOVDMyKSgoTFZNX1VJTlQzMikoRHQwID4+IDMpIC0gKChMVk1fVUlOVDMyKVFGYWN0b3IgPDwgMTgpKTsKLSAgICBCMiA9IChCMl9OdW0gLyAoQjJfRGVuID4+IDE2KSkgPDwgMTU7Ci0KLSAgICAvKgotICAgICAqIENhbGN1bGF0ZSB0aGUgY29zaW5lIGVycm9yIGJ5IGEgcG9seW5vbWlhbCBleHBhbnNpb24gdXNpbmcgdGhlIGVxdWF0aW9uOgotICAgICAqCi0gICAgICogIENvc0VyciArPSBjb2VmKG4pICogdDBebiAgICAgICAgICAgICAgICBGb3IgbiA9IDAgdG8gNAotICAgICAqLwotICAgIFQwID0gKFQwID4+IDYpICogMHg3ZjUzOyAgICAgICAgICAgICAgICAgICAgLyogU2NhbGUgdG8gMS4wIGluIDE2LWJpdCBmb3IgcmFuZ2UgMCB0byBmcy81MCAqLwotICAgIHQwID0gKExWTV9JTlQxNikoVDAgPj4gMTYpOwotICAgIGZhY3RvciA9IDB4N2ZmZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0byAxLjAgZm9yIHRoZSBhMCBjb2VmZmljaWVudCAqLwotICAgIENvc0VyciA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgdG8gemVybyAqLwotICAgIGZvciAoaT0xOyBpPDU7IGkrKykKLSAgICB7Ci0gICAgICAgIGNvZWYgPSBMVlBTQV9EUENvc0NvZWZbaV07ICAgICAgICAgICAgICAvKiBHZXQgdGhlIG50aCBjb2VmZmljaWVudCAqLwotICAgICAgICBDb3NFcnIgKz0gKGZhY3RvciAqIGNvZWYpID4+IDU7ICAgICAgICAgLyogVGhlIG50aCBwYXJ0aWFsIHN1bSAqLwotICAgICAgICBmYWN0b3IgPSAoZmFjdG9yICogdDApID4+IDE1OyAgICAgICAgICAgLyogQ2FsY3VsYXRlIHQwXm4gKi8KLSAgICB9Ci0gICAgQ29zRXJyID0gQ29zRXJyIDw8IChMVlBTQV9EUENvc0NvZWZbMF0pOyAgICAgICAgICAvKiBDb3JyZWN0IHRoZSBzY2FsaW5nICovCi0KLSAgICAvKgotICAgICAqIENhbGN1bGF0ZSB0aGUgQjEgYW5kIEEwIGNvZWZmaWNpZW50cwotICAgICAqLwotICAgIEIxID0gKDB4NDAwMDAwMDAgLSBCMik7ICAgICAgICAgICAgICAgICAgICAgLyogQjEgPSAoMC41IC0gYjIpICovCi0gICAgQTAgPSAoKEIxID4+IDE2KSAqIChDb3NFcnIgPj4gMTApKSA+PiA2OyAgICAvKiBUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgKDAuNSAtIGIyKSAqIGNvc2Vycih0MCkgKi8KLSAgICBCMSAtPSBBMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEIxID0gKDAuNSAtIGIyKSAqICgxIC0gY29zZXJyKHQwKSkgICovCi0gICAgQTAgPSAoMHg0MDAwMDAwMCArIEIyKSA+PiAxOyAgICAgICAgICAgICAgICAvKiBBMCA9ICgwLjUgKyBiMikgLyAyICovCi0KLSAgICAvKgotICAgICAqIFdyaXRlIGNvZWZmIGludG8gdGhlIGRhdGEgc3RydWN0dXJlCi0gICAgICovCi0gICAgcENvZWZmaWNpZW50cy0+QTAgPSBBMDsKLSAgICBwQ29lZmZpY2llbnRzLT5CMSA9IEIxOwotICAgIHBDb2VmZmljaWVudHMtPkIyID0gQjI7Ci0KLSAgICByZXR1cm4oTFZQU0FfT0spOwotfQotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0NsZWFyRmlsdGVySGlzdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDbGVhcnMgdGhlIGZpbHRlcnMnIGRhdGEgaGlzdG9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwSW5zdCAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlBTQV9PSyAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0NsZWFyRmlsdGVySGlzdG9yeShMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICpwSW5zdCkKLXsKLSAgICBMVk1fSU5UOCAgICAgICAqcFRhcEFkZHJlc3M7Ci0gICAgTFZNX1VJTlQzMiAgICAgICBpOwotCi0gICAgLyogQmFuZCBQYXNzIGZpbHRlcnMgdGFwcyAqLwotICAgIHBUYXBBZGRyZXNzID0gKExWTV9JTlQ4ICopcEluc3QtPnBCUF9UYXBzOwotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgZm9yKGkgPSAwOyBpIDwgcEluc3QtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCk7IGkrKykKLSAgICB7Ci0gICAgICAgIHBUYXBBZGRyZXNzW2ldID0gMDsKLSAgICB9Ci0jZWxzZQotICAgIGZvcihpID0gMDsgaSA8IHBJbnN0LT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QpOyBpKyspCi0gICAgewotICAgICAgICBwVGFwQWRkcmVzc1tpXSA9IDA7Ci0gICAgfQotI2VuZGlmCi0gICAgLyogUXVhc2ktcGVhayBmaWx0ZXJzIHRhcHMgKi8KLSAgICBwVGFwQWRkcmVzcyA9IChMVk1fSU5UOCAqKXBJbnN0LT5wUVBEX1RhcHM7Ci0gICAgZm9yKGkgPSAwOyBpIDwgcEluc3QtPm5CYW5kcyAqIHNpemVvZihRUERfVGFwc190KTsgaSsrKQotICAgIHsKLSAgICAgICAgcFRhcEFkZHJlc3NbaV0gPSAwOwotICAgIH0KLQotICAgIHJldHVybihMVlBTQV9PSyk7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Db250cm9sLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWFmYWE3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0NvbnRyb2wuY3BwCkBAIC0wLDAgKzEsNjgxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAgICAiTFZQU0EuaCIKKyNpbmNsdWRlICAgICJMVlBTQV9Qcml2YXRlLmgiCisjaW5jbHVkZSAgICAiVmVjdG9yQXJpdGhtZXRpYy5oIgorCisjZGVmaW5lICAgICBMT1dfRlJFUSAgICAgICAgICAgIDI5OCAgICAgICAgICAgICAvKiAzMjc2OC8xMTAgZm9yIGxvdyB0ZXN0IGZyZXF1ZW5jeSAqLworI2RlZmluZSAgICAgSElHSF9GUkVRICAgICAgICAgICAzODYgICAgICAgICAgICAgLyogMzI3NjgvODUgZm9yIGhpZ2ggdGVzdCBmcmVxdWVuY3kgKi8KKworTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRmlsdGVyc1R5cGUgKCAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcyAgKTsKKworTFZQU0FfUkVUVVJOIExWUFNBX1NldFFQRkNvZWZmaWNpZW50cyggTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcFBhcmFtcyAgKTsKKworTFZQU0FfUkVUVVJOIExWUFNBX0JQU2luZ2xlUHJlY0NvZWZzKCAgTFZNX1VJTlQxNiAgICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0ZpbHRlclBhcmFtX3QgICAqcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJQX0ZMT0FUX0NvZWZzX3QgICAgICAgICpwQ29lZmZpY2llbnRzKTsKKworTFZQU0FfUkVUVVJOIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKCAgTFZNX1VJTlQxNiAgICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRmlsdGVyUGFyYW1fdCAgKnBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgICpwQ29lZmZpY2llbnRzKTsKK0xWUFNBX1JFVFVSTiBMVlBTQV9TZXRCUEZDb2VmZmljaWVudHMoIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICk7CisKK0xWUFNBX1JFVFVSTiBMVlBTQV9DbGVhckZpbHRlckhpc3RvcnkoIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0KTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9Db250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgR2l2ZSBzb21lIG5ldyBjb250cm9sIHBhcmFtZXRlcnMgdG8gdGhlIG1vZHVsZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE5ld1BhcmFtcyAgICAgICAgICAgU3RydWN0dXJlIHRoYXQgY29udGFpbnMgdGhlIG5ldyBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9Db250cm9sICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAqcE5ld1BhcmFtcyAgICAgKQoreworCisgICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcExWUFNBX0luc3QgICAgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7CisKKyAgICBpZigoaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocE5ld1BhcmFtcyA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIH0KKyAgICBpZihwTmV3UGFyYW1zLT5GcyA+PSBMVlBTQV9OUl9TVVBQT1JURURfUkFURSkKKyAgICB7CisgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOworICAgIH0KKyAgICBpZihwTmV3UGFyYW1zLT5MZXZlbERldGVjdGlvblNwZWVkID49IExWUFNBX05SX1NVUFBPUlRFRF9TUEVFRCkKKyAgICB7CisgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOworICAgIH0KKworICAgIHBMVlBTQV9JbnN0LT5OZXdQYXJhbXMgPSAqcE5ld1BhcmFtczsKKyAgICBwTFZQU0FfSW5zdC0+YkNvbnRyb2xQZW5kaW5nID0gTFZNX1RSVUU7CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0dldENvbnRyb2xQYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBHZXQgdGhlIGN1cnJlbnQgY29udHJvbCBwYXJhbWV0ZXJzIG9mIHRoZSBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgY29udHJvbCBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfR2V0Q29udHJvbFBhcmFtcyAgICAgICAgICggICAgcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgKnBQYXJhbXMgKQoreworICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgKnBMVlBTQV9JbnN0ICAgID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOworCisgICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBQYXJhbXMgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKKyAgICB9CisKKyAgICBwUGFyYW1zLT5GcyAgICAgICAgICAgICAgICAgICAgID0gcExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuRnM7CisgICAgcFBhcmFtcy0+TGV2ZWxEZXRlY3Rpb25TcGVlZCAgICA9IHBMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkxldmVsRGV0ZWN0aW9uU3BlZWQ7CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0dldEluaXRQYXJhbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBHZXQgdGhlIGluaXRpYWxpemF0aW9uIHBhcmFtZXRlcnMgb2YgdGhlIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgY29udHJvbCBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfR2V0SW5pdFBhcmFtcyAgICAgICAgICggICAgcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgICAgICAgKnBQYXJhbXMgKQoreworICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgKnBMVlBTQV9JbnN0ICAgID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOworCisgICAgaWYoKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkgfHwgKHBQYXJhbXMgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKKyAgICB9CisKKyAgICBwUGFyYW1zLT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiAgID0gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOworICAgIHBQYXJhbXMtPk1heElucHV0QmxvY2tTaXplICAgICAgICAgICAgPSBwTFZQU0FfSW5zdC0+TWF4SW5wdXRCbG9ja1NpemU7CisgICAgcFBhcmFtcy0+bkJhbmRzICAgICAgICAgICAgICAgICAgICAgICA9IHBMVlBTQV9JbnN0LT5uQmFuZHM7CisgICAgcFBhcmFtcy0+cEZpbHRlcnNQYXJhbXMgICAgICAgICAgICAgICA9IHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtczsKKworICAgIHJldHVybihMVlBTQV9PSyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJlaW5pdGlhbGl6ZSBzb21lIHBhcmFtZXRlcnMgYW5kIGNoYW5nZXMgZmlsdGVycycgY29lZmZpY2llbnRzIGlmICAgICAgICAgICAgICAgKi8KKy8qICBzb21lIGNvbnRyb2wgcGFyYW1ldGVycyBoYXZlIGNoYW5nZWQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdCAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9BcHBseU5ld1NldHRpbmdzIChMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwSW5zdCkKK3sKKyAgICBMVk1fVUlOVDE2IGlpOworICAgIExWTV9VSU5UMTYgRnJlcTsKKyAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICBQYXJhbXM7CisgICAgZXh0ZXJuIExWTV9JTlQxNiAgICAgICAgTFZQU0FfblNhbXBsZXNCdWZmZXJVcGRhdGVbXTsKKyAgICBleHRlcm4gTFZNX1VJTlQzMiAgICAgICBMVlBTQV9TYW1wbGVSYXRlVGFiW107CisgICAgZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgTFZQU0FfRG93blNhbXBsaW5nRmFjdG9yW107CisKKyAgICBpZihwSW5zdCA9PSAwKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKKyAgICB9CisKKyAgICBQYXJhbXMgPSBwSW5zdC0+TmV3UGFyYW1zOworCisgICAgLyogTW9kaWZpZXMgZmlsdGVycyB0eXBlcyBhbmQgY29lZmZpY2llbnRzLCBjbGVhciB0aGUgdGFwcyBhbmQKKyAgICAgICByZS1pbml0aWFsaXplcyBwYXJhbWV0ZXJzIGlmIHNhbXBsZSBmcmVxdWVuY3kgaGFzIGNoYW5nZWQgICAgKi8KKyAgICBpZihQYXJhbXMuRnMgIT0gcEluc3QtPkN1cnJlbnRQYXJhbXMuRnMpCisgICAgeworICAgICAgICBwSW5zdC0+Q3VycmVudFBhcmFtcy5GcyA9IFBhcmFtcy5GczsKKworICAgICAgICAvKiBJbml0aWFsaXplIHRoZSBjZW50ZXIgZnJlcWV1bmNpZXMgYXMgYSBmdW5jdGlvbiBvZiB0aGUgc2FtcGxlIHJhdGUgKi8KKyAgICAgICAgRnJlcSA9IChMVk1fVUlOVDE2KSAoKExWUFNBX1NhbXBsZVJhdGVUYWJbcEluc3QtPkN1cnJlbnRQYXJhbXMuRnNdPj4xKSAvIChwSW5zdC0+bkJhbmRzICsgMSkpOworICAgICAgICBmb3IoaWkgPSBwSW5zdC0+bkJhbmRzOyBpaSA+IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaS0xXS5DZW50ZXJGcmVxdWVuY3kgPSAoTFZNX1VJTlQxNikgKEZyZXEgKiBpaSk7CisgICAgICAgIH0KKworICAgICAgICAvKiBDb3VudCB0aGUgbnVtYmVyIG9mIHJlbGV2YW50IGZpbHRlcnMuIElmIHRoZSBjZW50ZXIgZnJlcXVlbmN5IG9mIHRoZSBmaWx0ZXIgaXMKKyAgICAgICAgICAgYmlnZ2VyIHRoYW4gdGhlIG55cXVpc3QgZnJlcXVlbmN5LCB0aGVuIHRoZSBmaWx0ZXIgaXMgbm90IHJlbGV2YW50IGFuZCBkb2Vzbid0CisgICAgICAgICAgIG5lZWQgdG8gYmUgdXNlZCAqLworICAgICAgICBmb3IoaWkgPSBwSW5zdC0+bkJhbmRzOyBpaSA+IDA7IGlpLS0pCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKHBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaS0xXS5DZW50ZXJGcmVxdWVuY3kgPCAoTFZQU0FfU2FtcGxlUmF0ZVRhYltwSW5zdC0+Q3VycmVudFBhcmFtcy5Gc10+PjEpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBJbnN0LT5uUmVsZXZhbnRGaWx0ZXJzID0gaWk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgTFZQU0FfU2V0QlBGaWx0ZXJzVHlwZShwSW5zdCwgJlBhcmFtcyk7CisgICAgICAgIExWUFNBX1NldEJQRkNvZWZmaWNpZW50cyhwSW5zdCwgJlBhcmFtcyk7CisgICAgICAgIExWUFNBX1NldFFQRkNvZWZmaWNpZW50cyhwSW5zdCwgJlBhcmFtcyk7CisgICAgICAgIExWUFNBX0NsZWFyRmlsdGVySGlzdG9yeShwSW5zdCk7CisgICAgICAgIHBJbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSA9IChMVk1fVUlOVDE2KUxWUFNBX25TYW1wbGVzQnVmZmVyVXBkYXRlW1BhcmFtcy5Gc107CisgICAgICAgIHBJbnN0LT5CdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQgPSAwOworICAgICAgICBwSW5zdC0+RG93blNhbXBsaW5nRmFjdG9yID0gTFZQU0FfRG93blNhbXBsaW5nRmFjdG9yW1BhcmFtcy5Gc107CisgICAgICAgIHBJbnN0LT5Eb3duU2FtcGxpbmdDb3VudCA9IDA7CisgICAgICAgIGZvcihpaSA9IDA7IGlpIDwgKHBJbnN0LT5uQmFuZHMgKiBwSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoKTsgaWkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydFtpaV0gPSAwOworICAgICAgICB9CisgICAgICAgIGZvcihpaSA9IDA7IGlpIDwgcEluc3QtPm5CYW5kczsgaWkrKykKKyAgICAgICAgeworICAgICAgICAgICAgcEluc3QtPnBQcmV2aW91c1BlYWtzW2lpXSA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYoUGFyYW1zLkxldmVsRGV0ZWN0aW9uU3BlZWQgIT0gcEluc3QtPkN1cnJlbnRQYXJhbXMuTGV2ZWxEZXRlY3Rpb25TcGVlZCkKKyAgICAgICAgeworICAgICAgICAgICAgTFZQU0FfU2V0UVBGQ29lZmZpY2llbnRzKHBJbnN0LCAmUGFyYW1zKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHBJbnN0LT5DdXJyZW50UGFyYW1zID0gcEluc3QtPk5ld1BhcmFtczsKKworICAgIHJldHVybiAoTFZQU0FfT0spOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9TZXRCUEZpbHRlcnNUeXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyB0aGUgZmlsdGVyIHR5cGUgYmFzZWQgb24gdGhlIEJQRmlsdGVyVHlwZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluc3QgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgUG9uaXRlciB0byBjb25yb2wgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUFNBX09LICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuIFRvIHNlbGVjdCB0aGUgYmlxdWFkIHR5cGUgdGhlIGZvbGxvdyBydWxlcyBhcmUgYXBwbGllZDogICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIERvdWJsZSBwcmVjaXNpb24gICAgaWYgKGZjIDw9IGZzLzExMCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBEb3VibGUgcHJlY2lzaW9uICAgIGlmIChmcy8xMTAgPCBmYyA8IGZzLzg1KSAmIChRPjMpICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgU2luZ2xlIHByZWNpc2lvbiAgICBvdGhlcndpc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRmlsdGVyc1R5cGUgKCAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwUGFyYW1zICApCit7CisgICAgZXh0ZXJuIExWTV9VSU5UMzIgICBMVlBTQV9TYW1wbGVSYXRlVGFiW107ICAgICAgICAgICAgICAgICAvKiBTYW1wbGUgcmF0ZSB0YWJsZSAqLworICAgIExWTV9VSU5UMTYgICAgICAgICAgaWk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRmlsdGVyIGJhbmQgaW5kZXggKi8KKyAgICBMVk1fVUlOVDMyICAgICAgICAgIGZzID0gKExWTV9VSU5UMzIpTFZQU0FfU2FtcGxlUmF0ZVRhYlsoTFZNX1VJTlQxNilwUGFyYW1zLT5Gc107ICAgICAgLyogU2FtcGxlIHJhdGUgKi8KKyAgICBMVk1fVUlOVDMyICAgICAgICAgIGZjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBjZW50cmUgZnJlcXVlbmN5ICovCisgICAgTFZNX0lOVDE2ICAgICAgICAgICBRRmFjdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaWx0ZXIgUSBmYWN0b3IgKi8KKworICAgIGZvciAoaWkgPSAwOyBpaSA8IHBJbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSBmaWx0ZXIgc2V0dGluZ3MKKyAgICAgICAgICovCisgICAgICAgIGZjID0gKExWTV9VSU5UMzIpcEluc3QtPnBGaWx0ZXJzUGFyYW1zW2lpXS5DZW50ZXJGcmVxdWVuY3k7ICAgICAvKiBHZXQgdGhlIGJhbmQgY2VudHJlIGZyZXF1ZW5jeSAqLworICAgICAgICBRRmFjdG9yID0oTFZNX0lOVDE2KSBwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLlFGYWN0b3I7ICAgICAgICAgICAgICAgICAgICAvKiBHZXQgdGhlIGJhbmQgUSBmYWN0b3IgKi8KKworICAgICAgICAvKgorICAgICAgICAgKiBGb3IgZWFjaCBmaWx0ZXIgc2V0IHRoZSB0eXBlIG9mIGJpcXVhZCByZXF1aXJlZAorICAgICAgICAgKi8KKyAgICAgICAgcEluc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldID0gTFZQU0FfU2ltcGxlUHJlY2lzaW9uRmlsdGVyOyAgICAgLyogRGVmYXVsdCB0byBzaW5nbGUgcHJlY2lzaW9uICovCisgICAgICAgIGlmICgoTE9XX0ZSRVEgKiBmcykgPj0gKGZjIDw8IDE1KSkKKyAgICAgICAgeworICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAqIGZjIDw9IGZzLzExMAorICAgICAgICAgICAgICovCisgICAgICAgICAgICBwSW5zdC0+cEJQRmlsdGVyc1ByZWNpc2lvbltpaV0gPSBMVlBTQV9Eb3VibGVQcmVjaXNpb25GaWx0ZXI7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoKChMT1dfRlJFUSAqIGZzKSA8IChmYyA8PCAxNSkpICYmICgoZmMgPDwgMTUpIDwgKEhJR0hfRlJFUSAqIGZzKSkgJiYgKFFGYWN0b3IgPiAzMDApKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgKiAoZnMvMTEwIDwgZmMgPCBmcy84NSkgJiAoUT4zKQorICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgcEluc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldID0gTFZQU0FfRG91YmxlUHJlY2lzaW9uRmlsdGVyOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9TZXRCUEZDb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyB0aGUgYmFuZCBwYXNzIGZpbHRlciBjb2VmZmljaWVudHMuIFRoaXMgdXNlcyB0aGUgdHlwZSB0byBzZWxlY3QgICAgICAgICAgICAqLworLyogIHNpbmdsZSBvciBkb3VibGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0ICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQYXJhbXMgICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX1NldEJQRkNvZWZmaWNpZW50cyggIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgKnBJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICpwUGFyYW1zKQoreworCisgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgICAgICBpaTsKKworICAgIC8qCisgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMgZm9yIGVhY2ggYmFuZCBieSB0aGUgaW5pdCBmdW5jdGlvbgorICAgICAqLworICAgIGZvciAoaWkgPSAwOyBpaSA8IHBJbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKQorICAgIHsKKyAgICAgICAgc3dpdGNoICAocEluc3QtPnBCUEZpbHRlcnNQcmVjaXNpb25baWldKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlICAgIExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogQ2FsY3VsYXRlIHRoZSBkb3VibGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cworICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKChMVk1fVUlOVDE2KXBQYXJhbXMtPkZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICogU2V0IHRoZSBjb2VmZmljaWVudHMKKyAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMzJDbGxfVFJDX1dSQV8wMV9Jbml0ICggJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wQlBfVGFwc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlICAgIExWUFNBX1NpbXBsZVByZWNpc2lvbkZpbHRlcjoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBCUF9GTE9BVF9Db2Vmc190ICAgICAgQ29lZmZpY2llbnRzOworCisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIHNpbmdsZSBwcmVjaXNpb24gY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoKExWTV9VSU5UMTYpcFBhcmFtcy0+RnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wRmlsdGVyc1BhcmFtc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmaWNpZW50cyk7CisKKyAgICAgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgICAqIFNldCB0aGUgY29lZmZpY2llbnRzCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCAoJnBJbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0LT5wQlBfVGFwc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZmljaWVudHMpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9TZXRRUEZDb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2V0cyB0aGUgcXVhc2kgcGVhayBmaWx0ZXJzIGNvZWZmaWNpZW50cy4gVGhpcyB1c2VzIHRoZSBjaG9zZW4gICAgICAgICAgICAgICAgICAqLworLyogIExldmVsRGV0ZWN0aW9uU3BlZWQgZnJvbSB0aGUgY29udHJvbCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbnN0ICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBQYXJhbXMgICAgICAgICAgICAgIENvbnRyb2wgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX1NldFFQRkNvZWZmaWNpZW50cyggICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgICpwSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfQ29udHJvbFBhcmFtc190ICAgICAgKnBQYXJhbXMgICkKK3sKKyAgICBMVk1fVUlOVDE2ICAgICBpaTsKKyAgICBMVk1fRnNfZW4gICAgICBGcyA9IHBQYXJhbXMtPkZzOworICAgIFFQRF9GTE9BVF9Db2VmcyAgKnBDb2VmZmljaWVudHM7CisgICAgZXh0ZXJuICAgICAgICAgUVBEX0ZMT0FUX0NvZWZzICAgICBMVlBTQV9RUERfRmxvYXRfQ29lZnNbXTsKKworICAgIHBDb2VmZmljaWVudHMgPSAmTFZQU0FfUVBEX0Zsb2F0X0NvZWZzWyhwUGFyYW1zLT5MZXZlbERldGVjdGlvblNwZWVkICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUpICsgRnNdOworCisgICAgZm9yIChpaSA9IDA7IGlpIDwgcEluc3QtPm5SZWxldmFudEZpbHRlcnM7IGlpKyspCisgICAgeworICAgICAgICBMVlBTQV9RUERfSW5pdF9GbG9hdCAoJnBJbnN0LT5wUVBEX1N0YXRlc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3QtPnBRUERfVGFwc1tpaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwQ29lZmZpY2llbnRzICk7CisgICAgfQorCisgICAgcmV0dXJuKExWUFNBX09LKTsKKworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVlBTQV9CUFNpbmdsZVByZWNDb2VmcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENhbGN1bGF0ZSBzaW5nbGUgcHJlY2lzaW9uIGNvZWZmaWNpZW50cyBmb3IgYSBiYW5kIHBhc3MgZmlsdGVyICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEZzICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGluZyBmcmVxdWVuY3kgaW5kZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEZpbHRlclBhcmFtcyAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGZpbHRlciBkZWZpbml0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ29lZmZpY2llbnRzICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiBUaGUgZXF1YXRpb25zIHVzZWQgYXJlIGFzIGZvbGxvd3M6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIHQwID0gMiAqIFBpICogRmMgLyBGcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBiMiA9IC0wLjUgKiAoMlEgLSB0MCkgLyAoMlEgKyB0MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGIxID0gKDAuNSAtIGIyKSAqIGNvcyh0MCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYTAgPSAoMC41ICsgYjIpIC8gMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlcmU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRmMgICAgICAgICAgaXMgdGhlIGNlbnRyZSBmcmVxdWVuY3ksIERDIHRvIE55cXVpc3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBGcyAgICAgICAgICBpcyB0aGUgc2FtcGxlIGZyZXF1ZW5jeSwgODAwMCB0byA0ODAwMCBpbiBkZXNjcmV0ZSBzdGVwcyAgICAgICAgICAgICovCisvKiAgICAgIFEgICAgICAgICAgIGlzIHRoZSBRIGZhY3RvciwgMC4yNSB0byAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDIuIFRoaXMgZnVuY3Rpb24gaXMgZW50aXJlbHkgYmFzZWQgb24gdGhlIExWRVFOQl9TaW5nbGVQcmVjQ29lZnMgZnVuY3Rpb24gICAgICAgICAgICovCisvKiAgICAgb2YgdGhlIG4gYmFuZHMgZXF1YWxpemVyIChMVkVRTkIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfQlBTaW5nbGVQcmVjQ29lZnMoICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIEZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgICAqcEZpbHRlclBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICAgKnBDb2VmZmljaWVudHMpCit7CisKKyAgICBleHRlcm4gTFZNX0ZMT0FUICAgIExWUFNBX0Zsb2F0X1R3b1BpT25Gc1RhYmxlW107CisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9Db3NDb2VmW107CisKKyAgICAvKgorICAgICAqIEludGVybWVkaWF0ZSB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyeSB2YWx1ZXMKKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgIFQwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgRDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEEwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjE7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBCMjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIER0MDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyX0RlbjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyX051bTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIENPU19UMDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIGNvZWY7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBmYWN0b3I7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICB0MDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIGk7CisKKyAgICAvKgorICAgICAqIEdldCB0aGUgZmlsdGVyIGRlZmluaXRpb24KKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgRnJlcXVlbmN5ICAgPSAoTFZNX0ZMT0FUKShwRmlsdGVyUGFyYW1zLT5DZW50ZXJGcmVxdWVuY3kpOworICAgIExWTV9GTE9BVCAgICAgICAgICBRRmFjdG9yICAgICA9ICgoTFZNX0ZMT0FUKShwRmlsdGVyUGFyYW1zLT5RRmFjdG9yKSkgLyAxMDA7CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0aW5nIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzCisgICAgICovCisgICAgVDAgPSBGcmVxdWVuY3kgKiBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtGc107ICAgLyogVDAgPSAyICogUGkgKiBGYyAvIEZzICovCisgICAgRCA9IDMyMDA7ICAgICAgICAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjAwMDAwMCAoMSoxMDAqMl41KSAqLworICAgICAgICAgICAgICAgICAgICAvKiBGb3JjZSBEID0gMSA6IHRoZSBmdW5jdGlvbiB3YXMgb3JpZ2luYWxseSB1c2VkIGZvciBhIHBlYWtpbmcgZmlsdGVyLgorICAgICAgICAgICAgICAgICAgICAgICBUaGUgRCBwYXJhbWV0ZXIgZG8gbm90IGV4aXN0IGZvciBhIEJhbmRQYXNzIGZpbHRlciBjb2VmZmljaWVudHMgKi8KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBCMiBjb2VmZmljaWVudAorICAgICAqLworICAgIER0MCA9ICBUMCAvIDIwNDggOworICAgIEIyX0RlbiA9IFFGYWN0b3IgKyBEdDA7CisgICAgQjJfTnVtID0gRHQwIC0gUUZhY3RvcjsKKyAgICBCMiA9IEIyX051bSAvICgyICogQjJfRGVuKTsKKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBjb3NpbmUgYnkgYSBwb2x5bm9taWFsIGV4cGFuc2lvbiB1c2luZyB0aGUgZXF1YXRpb246CisgICAgICoKKyAgICAgKiAgQ29zICs9IGNvZWYobikgKiB0MF5uICAgICAgICAgICAgICAgICAgIEZvciBuID0gMCB0byA2CisgICAgICovCisgICAgVDAgPSAoVDAgLyAyMDQ4KSAqIDAuNjM2NTg1NThmOyAgICAgICAgICAgICAgLyogU2NhbGUgdG8gMS4wIGluIDE2LWJpdCBmb3IgcmFuZ2UgMCB0byBmcy8yICovCisgICAgdDAgPSBUMCA7CisgICAgZmFjdG9yID0gMS4wZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0byAxLjAgZm9yIHRoZSBhMCBjb2VmZmljaWVudCAqLworICAgIENPU19UMCA9IDAuMGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgdG8gemVybyAqLworICAgIGZvciAoaSA9IDE7IGkgPCA3OyBpKyspCisgICAgeworICAgICAgICBjb2VmICAgID0gTFZQU0FfRmxvYXRfQ29zQ29lZltpXTsgICAgICAgICAgICAgICAgLyogR2V0IHRoZSBudGggY29lZmZpY2llbnQgKi8KKyAgICAgICAgQ09TX1QwICs9IChmYWN0b3IgKiBjb2VmKTsgICAgICAgICAvKiBUaGUgbnRoIHBhcnRpYWwgc3VtICovCisgICAgICAgIGZhY3RvciAgPSAoZmFjdG9yICogdDApIDsgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0MF5uICovCisgICAgfQorICAgIENPU19UMCA9IENPU19UMCAqIDg7ICAgIC8qTFZQU0FfQ29zQ29lZl9mbG9hdFswXSovICAgICAgLyogQ29ycmVjdCB0aGUgc2NhbGluZyAqLworCisgICAgQjEgPSAoKExWTV9GTE9BVCkwLjUgLSBCMikgKiAoQ09TX1QwKTsgICAgLyogQjEgPSAoMC41IC0gYjIpICogY29zKHQwKSAqLworICAgIEEwID0gKChMVk1fRkxPQVQpMC41ICsgQjIpIC8gMjsgICAgICAgICAgICAgICAgICAgICAgICAvKiBBMCA9ICgwLjUgKyBiMikgLyAyICovCisKKyAgICAvKgorICAgICAqIFdyaXRlIGNvZWZmIGludG8gdGhlIGRhdGEgc3RydWN0dXJlCisgICAgICovCisgICAgcENvZWZmaWNpZW50cy0+QTAgPSBBMCAqIDI7CisgICAgcENvZWZmaWNpZW50cy0+QjEgPSBCMSAqIDI7CisgICAgcENvZWZmaWNpZW50cy0+QjIgPSBCMiAqIDI7CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICAgTFZQU0FfQlBEb3VibGVQcmVjQ29lZnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDYWxjdWxhdGUgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMgZm9yIGEgYmFuZCBwYXNzIGZpbHRlciAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBGcyAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxpbmcgZnJlcXVlbmN5IGluZGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBGaWx0ZXJQYXJhbXMgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXIgZGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcENvZWZmaWNpZW50cyAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gVGhlIGVxdWF0aW9ucyB1c2VkIGFyZSBhcyBmb2xsb3dzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICB0MCA9IDIgKiBQaSAqIEZjIC8gRnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgYjIgPSAtMC41ICogKDJRIC0gdDApIC8gKDJRICsgdDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBiMSA9ICgwLjUgLSBiMikgKiAoMSAtIGNvc2Vycih0MCkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGEwID0gKDAuNSArIGIyKSAvIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZXJlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIEZjICAgICAgICAgIGlzIHRoZSBjZW50cmUgZnJlcXVlbmN5LCBEQyB0byBGcy81MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgRnMgICAgICAgICAgaXMgdGhlIHNhbXBsZSBmcmVxdWVuY3ksIDgwMDAgdG8gNDgwMDAgaW4gZGVzY3JldGUgc3RlcHMgICAgICAgICAgICAqLworLyogICAgICBRICAgICAgICAgICBpcyB0aGUgUSBmYWN0b3IsIDAuMjUgdG8gMTIgKHJlcHJlc2VudGVkIGJ5IDI1IHRvIDEyMDApICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAyLiBUaGUgZG91YmxlIHByZWNpc2lvbiBjb2VmZmljaWVudHMgYXJlIG9ubHkgdXNlZCB3aGVuIGZjIGlzIGxlc3MgdGhhbiBmcy84NSwgc28gICAqLworLyogICAgIHRoZSBjb3NpbmUgb2YgdDAgaXMgYWx3YXlzIGNsb3NlIHRvIDEuMC4gSW5zdGVhZCBvZiBjYWxjdWxhdGluZyB0aGUgY29zaW5lICAgICAgICovCisvKiAgICAgaXRzZWxmIHRoZSBkaWZmZXJlbmNlIGZyb20gdGhlIHZhbHVlIDEuMCBpcyBjYWxjdWxhdGVkLCB0aGlzIGNhbiBiZSBkb25lIHdpdGggICAgKi8KKy8qICAgICBsb3dlciBwcmVjaXNpb24gbWF0aHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMy4gVGhlIHZhbHVlIG9mIHRoZSBCMiBjb2VmZmljaWVudCBpcyBvbmx5IGNhbGN1bGF0ZWQgYXMgYSBzaW5nbGUgcHJlY2lzaW9uIHZhbHVlLCAgKi8KKy8qICAgICBzbWFsbCBlcnJvcnMgaW4gdGhpcyB2YWx1ZSBoYXZlIGEgY29tYmluZWQgZWZmZWN0IG9uIHRoZSBRIGFuZCBHYWluIGJ1dCBub3QgdGhlICAqLworLyogICAgIHRoZSBmcmVxdWVuY3kgb2YgdGhlIGZpbHRlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICA0LiBUaGlzIGZ1bmN0aW9uIGlzIGVudGlyZWx5IGJhc2VkIG9uIHRoZSBMVkVRTkJfRG91YmxlUHJlY0NvZWZzIGZ1bmN0aW9uICAgICAgICAgICAqLworLyogICAgIG9mIHRoZSBuIGJhbmRzIGVxdWFsaXplciAoTFZFUU5CICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZQU0FfUkVUVVJOIExWUFNBX0JQRG91YmxlUHJlY0NvZWZzKCAgIExWTV9VSU5UMTYgICAgICAgICAgICBGcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgKnBGaWx0ZXJQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQlBfRkxPQVRfQ29lZnNfdCAgICAgICpwQ29lZmZpY2llbnRzKQoreworCisgICAgZXh0ZXJuIExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtdOworICAgIGV4dGVybiBMVk1fRkxPQVQgICAgTFZQU0FfRmxvYXRfRFBDb3NDb2VmW107CisKKyAgICAvKgorICAgICAqIEludGVybWVkaWF0ZSB2YXJpYWJsZXMgYW5kIHRlbXBvcmFyeSB2YWx1ZXMKKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgIFQwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgRDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEEwOworICAgIExWTV9GTE9BVCAgICAgICAgICAgQjE7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBCMjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIER0MDsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyX0RlbjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEIyX051bTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIENvc0VycjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIGNvZWY7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICBmYWN0b3I7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICB0MDsKKyAgICBMVk1fSU5UMTYgICAgICAgICAgIGk7CisKKyAgICAvKgorICAgICAqIEdldCB0aGUgZmlsdGVyIGRlZmluaXRpb24KKyAgICAgKi8KKyAgICBMVk1fRkxPQVQgICAgICAgICAgRnJlcXVlbmN5ICAgPSAoTFZNX0ZMT0FUKShwRmlsdGVyUGFyYW1zLT5DZW50ZXJGcmVxdWVuY3kpOworICAgIExWTV9GTE9BVCAgICAgICAgICBRRmFjdG9yICAgICA9ICgoTFZNX0ZMT0FUKShwRmlsdGVyUGFyYW1zLT5RRmFjdG9yKSkgLyAxMDA7CisKKyAgICAvKgorICAgICAqIENhbGN1bGF0aW5nIHRoZSBpbnRlcm1lZGlhdGUgdmFsdWVzCisgICAgICovCisgICAgVDAgPSBGcmVxdWVuY3kgKiBMVlBTQV9GbG9hdF9Ud29QaU9uRnNUYWJsZVtGc107ICAgLyogVDAgPSAyICogUGkgKiBGYyAvIEZzICovCisgICAgRCA9IDMyMDA7ICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMDAwMDAwICgxKjEwMCoyXjUpICovCisgICAgICAgICAgICAgICAgIC8qIEZvcmNlIEQgPSAxIDogdGhlIGZ1bmN0aW9uIHdhcyBvcmlnaW5hbGx5IHVzZWQgZm9yIGEgcGVha2luZyBmaWx0ZXIuCisgICAgICAgICAgICAgICAgICAgIFRoZSBEIHBhcmFtZXRlciBkbyBub3QgZXhpc3QgZm9yIGEgQmFuZFBhc3MgZmlsdGVyIGNvZWZmaWNpZW50cyAqLworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIEIyIGNvZWZmaWNpZW50CisgICAgICovCisgICAgRHQwID0gIFQwIC8gMjA0OCA7CisgICAgQjJfRGVuID0gUUZhY3RvciArIER0MDsKKyAgICBCMl9OdW0gPSBEdDAgLSBRRmFjdG9yOworICAgIEIyID0gQjJfTnVtIC8gKDIgKiBCMl9EZW4pOworCisgICAgLyoKKyAgICAgKiBDYWxjdWxhdGUgdGhlIGNvc2luZSBlcnJvciBieSBhIHBvbHlub21pYWwgZXhwYW5zaW9uIHVzaW5nIHRoZSBlcXVhdGlvbjoKKyAgICAgKgorICAgICAqICBDb3NFcnIgKz0gY29lZihuKSAqIHQwXm4gICAgICAgICAgICAgICAgRm9yIG4gPSAwIHRvIDQKKyAgICAgKi8KKyAgICBUMCA9IFQwICogMC45OTQ3NTBmOyAgICAgICAgICAgICAgICAgICAgLyogU2NhbGUgdG8gMS4wIGluIDE2LWJpdCBmb3IgcmFuZ2UgMCB0byBmcy81MCAqLworICAgIHQwID0gVDA7CisgICAgZmFjdG9yID0gMS4wZjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0byAxLjAgZm9yIHRoZSBhMCBjb2VmZmljaWVudCAqLworICAgIENvc0VyciA9IDAuMGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5pdGlhbGlzZSB0aGUgZXJyb3IgdG8gemVybyAqLworICAgIGZvciAoaSA9IDE7IGkgPCA1OyBpKyspCisgICAgeworICAgICAgICBjb2VmID0gTFZQU0FfRmxvYXRfRFBDb3NDb2VmW2ldOyAgICAgICAgICAgICAgLyogR2V0IHRoZSBudGggY29lZmZpY2llbnQgKi8KKyAgICAgICAgQ29zRXJyICs9IGZhY3RvciAqIGNvZWY7ICAgICAgICAgLyogVGhlIG50aCBwYXJ0aWFsIHN1bSAqLworICAgICAgICBmYWN0b3IgPSBmYWN0b3IgKiB0MDsgICAgICAgICAgIC8qIENhbGN1bGF0ZSB0MF5uICovCisgICAgfQorICAgIENvc0VyciA9IENvc0VyciAqIDI7ICAgICAgICAgIC8qIENvcnJlY3QgdGhlIHNjYWxpbmcgKi8KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBCMSBhbmQgQTAgY29lZmZpY2llbnRzCisgICAgICovCisgICAgQjEgPSAoKExWTV9GTE9BVCkwLjUgLSBCMik7ICAgICAgICAgICAgICAgICAgICAgLyogQjEgPSAoMC41IC0gYjIpICovCisgICAgQTAgPSBCMSAqIENvc0VyciA7ICAgIC8qIFRlbXBvcmFyeSBzdG9yYWdlIGZvciAoMC41IC0gYjIpICogY29zZXJyKHQwKSAqLworICAgIEIxIC09IEEwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQjEgPSAoMC41IC0gYjIpICogKDEgLSBjb3NlcnIodDApKSAgKi8KKyAgICBBMCA9ICgoTFZNX0ZMT0FUKTAuNSAgKyBCMikgLyAyOyAgICAgICAgICAgICAgICAvKiBBMCA9ICgwLjUgKyBiMikgLyAyICovCisKKyAgICAvKgorICAgICAqIFdyaXRlIGNvZWZmIGludG8gdGhlIGRhdGEgc3RydWN0dXJlCisgICAgICovCisgICAgcENvZWZmaWNpZW50cy0+QTAgPSBBMDsKKyAgICBwQ29lZmZpY2llbnRzLT5CMSA9IEIxOworICAgIHBDb2VmZmljaWVudHMtPkIyID0gQjI7CisKKyAgICByZXR1cm4oTFZQU0FfT0spOworfQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9DbGVhckZpbHRlckhpc3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ2xlYXJzIHRoZSBmaWx0ZXJzJyBkYXRhIGhpc3RvcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluc3QgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZQU0FfT0sgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9DbGVhckZpbHRlckhpc3RvcnkoTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAqcEluc3QpCit7CisgICAgTFZNX0lOVDggICAgICAgKnBUYXBBZGRyZXNzOworICAgIExWTV9VSU5UMzIgICAgICAgaTsKKworICAgIC8qIEJhbmQgUGFzcyBmaWx0ZXJzIHRhcHMgKi8KKyAgICBwVGFwQWRkcmVzcyA9IChMVk1fSU5UOCAqKXBJbnN0LT5wQlBfVGFwczsKKyAgICBmb3IoaSA9IDA7IGkgPCBwSW5zdC0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190KTsgaSsrKQorICAgIHsKKyAgICAgICAgcFRhcEFkZHJlc3NbaV0gPSAwOworICAgIH0KKyAgICAvKiBRdWFzaS1wZWFrIGZpbHRlcnMgdGFwcyAqLworICAgIHBUYXBBZGRyZXNzID0gKExWTV9JTlQ4ICopcEluc3QtPnBRUERfVGFwczsKKyAgICBmb3IoaSA9IDA7IGkgPCBwSW5zdC0+bkJhbmRzICogc2l6ZW9mKFFQRF9UYXBzX3QpOyBpKyspCisgICAgeworICAgICAgICBwVGFwQWRkcmVzc1tpXSA9IDA7CisgICAgfQorCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0luaXQuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Jbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjMjY4NjAuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX0luaXQuYworKysgL2Rldi9udWxsCkBAIC0xLDIxNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAgICAiTFZQU0EuaCIKLSNpbmNsdWRlICAgICJMVlBTQV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAgICAiSW5zdEFsbG9jLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluaXRpYWxpemUgdGhlIExWUFNBIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwaEluc3RhbmNlICAgICAgICAgIFBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW5pdFBhcmFtcyAgICAgICAgICBJbml0IHBhcmFtZXRlcnMgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvbnRyb2xQYXJhbXMgICAgICAgQ29udHJvbCBwYXJhbWV0ZXJzIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgIE1lbW9yeSB0YWJsZSB0aGF0IGNvbnRhaW5zIG1lbW9yeSBhcmVhcyBkZWZpbml0aW9uICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0luaXQgICAgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgICpwaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfSW5pdFBhcmFtc190ICAgICAgICAgICpwSW5pdFBhcmFtcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0NvbnRyb2xQYXJhbXNfdCAgICAgICAqcENvbnRyb2xQYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9NZW1UYWJfdCAgICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSApCi17Ci0gICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgICAgICpwTFZQU0FfSW5zdDsKLSAgICBMVlBTQV9SRVRVUk4gICAgICAgICAgICAgICAgZXJyb3JDb2RlICAgICAgID0gTFZQU0FfT0s7Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIGlpOwotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgIGV4dGVybiBMVk1fSU5UMTYgICAgICAgICAgICBMVlBTQV9HYWluVGFibGVbXTsKLSNlbHNlCi0gICAgZXh0ZXJuIExWTV9GTE9BVCAgICAgICAgICAgIExWUFNBX0Zsb2F0X0dhaW5UYWJsZVtdOwotI2VuZGlmCi0gICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEJ1ZmZlckxlbmd0aCA9IDA7Ci0KLSAgICAvKiBJbnRzX0FsbG9jIGluc3RhbmNlcywgbmVlZGVkIGZvciBtZW1vcnkgYWxpZ25tZW50IG1hbmFnZW1lbnQgKi8KLSAgICBJTlNUX0FMTE9DICAgICAgICAgIEluc3RhbmNlOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgU2NyYXRjaDsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgIERhdGE7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICBDb2VmOwotCi0gICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLwotICAgIGlmKChwaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluaXRQYXJhbXMgPT0gTFZNX05VTEwpIHx8IChwQ29udHJvbFBhcmFtcyA9PSBMVk1fTlVMTCkgfHwgKHBNZW1vcnlUYWJsZSA9PSBMVk1fTlVMTCkpCi0gICAgewotICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOwotICAgIH0KLSAgICBpZiggKHBJbml0UGFyYW1zLT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiA+IExWUFNBX01BWEJVRkZFUkRVUkFUSU9OKSAgIHx8Ci0gICAgICAgIChwSW5pdFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAocEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplID4gTFZQU0FfTUFYSU5QVVRCTE9DS1NJWkUpICAgICAgfHwKLSAgICAgICAgKHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgIChwSW5pdFBhcmFtcy0+bkJhbmRzIDwgTFZQU0FfTkJBTkRTTUlOKSAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAocEluaXRQYXJhbXMtPm5CYW5kcyA+IExWUFNBX05CQU5EU01BWCkgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtcyA9PSAwKSkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOwotICAgIH0KLSAgICBmb3IoaWkgPSAwOyBpaSA8IHBJbml0UGFyYW1zLT5uQmFuZHM7IGlpKyspCi0gICAgewotICAgICAgICBpZigocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5DZW50ZXJGcmVxdWVuY3kgPiBMVlBTQV9NQVhDRU5URVJGUkVRKSB8fAotICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2FpbiAgICAgICAgPiBMVlBTQV9NQVhQT1NUR0FJTikgICB8fAotICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2FpbiAgICAgICAgPCBMVlBTQV9NSU5QT1NUR0FJTikgICB8fAotICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yIDwgTFZQU0FfTUlOUUZBQ1RPUikgICAgICAgICAgICB8fAotICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yID4gTFZQU0FfTUFYUUZBQ1RPUikpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKLSAgICAgICAgICAgfQotICAgIH0KLQotCi0gICAgLypJbnN0X0FsbG9jIGluc3RhbmNlcyBpbml0aWFsaXphdGlvbiAqLwotICAgIEluc3RBbGxvY19Jbml0KCAmSW5zdGFuY2UgICAsIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9JTlNUQU5DRV0ucEJhc2VBZGRyZXNzKTsKLSAgICBJbnN0QWxsb2NfSW5pdCggJlNjcmF0Y2ggICAgLCBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzKTsKLSAgICBJbnN0QWxsb2NfSW5pdCggJkRhdGEgICAgICAgLCBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5wQmFzZUFkZHJlc3MpOwotICAgIEluc3RBbGxvY19Jbml0KCAmQ29lZiAgICAgICAsIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyk7Ci0KLQotICAgIC8qIFNldCB0aGUgaW5zdGFuY2UgaGFuZGxlIGlmIG5vdCBhbHJlYWR5IGluaXRpYWxpc2VkICovCi0gICAgaWYgKCpwaEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgKnBoSW5zdGFuY2UgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHNpemVvZihMVlBTQV9JbnN0YW5jZVByX3QpICk7Ci0gICAgfQotICAgIHBMVlBTQV9JbnN0ID0oTFZQU0FfSW5zdGFuY2VQcl90KikqcGhJbnN0YW5jZTsKLQotCi0gICAgLyogQ2hlY2sgdGhlIG1lbW9yeSB0YWJsZSBmb3IgTlVMTCBwb2ludGVycyAqLwotICAgIGZvciAoaWkgPSAwOyBpaSA8IExWUFNBX05SX01FTU9SWV9SRUdJT05TOyBpaSsrKQotICAgIHsKLSAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2lpXS5TaXplIT0wKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25baWldLnBCYXNlQWRkcmVzcz09TFZNX05VTEwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5NZW1vcnlUYWJsZS5SZWdpb25baWldID0gcE1lbW9yeVRhYmxlLT5SZWdpb25baWldOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogSW5pdGlhbGl6ZSBtb2R1bGUncyBpbnRlcm5hbCBwYXJhbWV0ZXJzICovCi0gICAgcExWUFNBX0luc3QtPmJDb250cm9sUGVuZGluZyA9IExWTV9GQUxTRTsKLSAgICBwTFZQU0FfSW5zdC0+bkJhbmRzID0gcEluaXRQYXJhbXMtPm5CYW5kczsKLSAgICBwTFZQU0FfSW5zdC0+TWF4SW5wdXRCbG9ja1NpemUgPSBwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemU7Ci0gICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uID0gcEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOwotICAgIHBMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkZzID0gTFZNX0ZTX0RVTU1ZOwotICAgIHBMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkxldmVsRGV0ZWN0aW9uU3BlZWQgPSBMVlBTQV9TUEVFRF9EVU1NWTsKLQotICAgIHsgICAvKiBmb3IgYXZvaWRpbmcgUUFDIHdhcm5pbmdzICovCi0gICAgICAgIExWTV9JTlQzMiBTREJEPShMVk1fSU5UMzIpcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOwotICAgICAgICBMVk1fSU5UMzIgSVJUST0oTFZNX0lOVDMyKUxWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVJbnY7Ci0gICAgICAgIExWTV9JTlQzMiBCTDsKLQotICAgICAgICBNVUwzMngzMklOVE8zMihTREJELElSVEksQkwsTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0KQotCi0gICAgICAgIEJ1ZmZlckxlbmd0aD0oTFZNX1VJTlQzMilCTDsKLSAgICB9Ci0KLSAgICBpZigoQnVmZmVyTGVuZ3RoICogTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZSkgIT0gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uKQotICAgIHsKLSAgICAgICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCA9IEJ1ZmZlckxlbmd0aCArIDE7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGggPSBCdWZmZXJMZW5ndGg7Ci0gICAgfQotCi0KLSAgICAvKiBBc3NpZ24gdGhlIHBvaW50ZXJzICovCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0gICAgcExWUFNBX0luc3QtPnBQb3N0R2FpbnMgICAgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWTV9VSU5UMTYpICk7Ci0jZWxzZQotICAgIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWTV9GTE9BVCkgKTsKLSNlbmRpZgotICAgIHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtcyAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVlBTQV9GaWx0ZXJQYXJhbV90KSApOwotICAgIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGggKiBzaXplb2YoTFZNX1VJTlQ4KSApOwotICAgIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrcyAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fVUlOVDgpICk7Ci0gICAgcExWUFNBX0luc3QtPnBCUEZpbHRlcnNQcmVjaXNpb24gICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWUFNBX0JQRmlsdGVyUHJlY2lzaW9uX2VuKSApOwotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgIHBMVlBTQV9JbnN0LT5wQlBfSW5zdGFuY2VzICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkX0luc3RhbmNlX3QpICk7Ci0gICAgcExWUFNBX0luc3QtPnBRUERfU3RhdGVzICAgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfU3RhdGVfdCkgKTsKLSNlbHNlCi0gICAgcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXMgICAgICAgICAgPSBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkgKTsKLSAgICBwTFZQU0FfSW5zdC0+cFFQRF9TdGF0ZXMgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFFQRF9GTE9BVF9TdGF0ZV90KSApOwotI2VuZGlmCi0KLSNpZm5kZWYgQlVJTERfRkxPQVQKLSAgICBwTFZQU0FfSW5zdC0+cEJQX1RhcHMgICAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfVGFwc190KSApOwotICAgIHBMVlBTQV9JbnN0LT5wUVBEX1RhcHMgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX1RhcHNfdCkgKTsKLQotI2Vsc2UKLSAgICBwTFZQU0FfSW5zdC0+cEJQX1RhcHMgICAgICAgICAgICAgICA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZEYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluaXRQYXJhbXMtPm5CYW5kcyAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCkpOwotICAgIHBMVlBTQV9JbnN0LT5wUVBEX1RhcHMgICAgICAgICAgICAgID0gSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoUVBEX0ZMT0FUX1RhcHNfdCkgKTsKLSNlbmRpZgotCi0gICAgLyogQ29weSBmaWx0ZXJzIHBhcmFtZXRlcnMgaW4gdGhlIHByaXZhdGUgaW5zdGFuY2UgKi8KLSAgICBmb3IoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uQmFuZHM7IGlpKyspCi0gICAgewotICAgICAgICBwTFZQU0FfSW5zdC0+cEZpbHRlcnNQYXJhbXNbaWldID0gcEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXTsKLSAgICB9Ci0KLSAgICAvKiBTZXQgUG9zdCBmaWx0ZXJzIGdhaW5zKi8KLSAgICBmb3IoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uQmFuZHM7IGlpKyspCi0gICAgewotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgICAgICBwTFZQU0FfSW5zdC0+cFBvc3RHYWluc1tpaV0gPShMVk1fVUlOVDE2KSBMVlBTQV9HYWluVGFibGVbcEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2FpbiArIDE1XTsKLSNlbHNlCi0gICAgICAgIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zW2lpXSA9IExWUFNBX0Zsb2F0X0dhaW5UYWJsZVsxNSArIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2Fpbl07Ci0jZW5kaWYKLSAgICB9Ci0gICAgcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0OwotCi0KLSAgICAvKiBJbml0aWFsaXplIGNvbnRyb2wgZGVwZW5kYW50IGludGVybmFsIHBhcmFtZXRlcnMgKi8KLSAgICBlcnJvckNvZGUgPSBMVlBTQV9Db250cm9sICgqcGhJbnN0YW5jZSwgcENvbnRyb2xQYXJhbXMpOwotCi0gICAgaWYoZXJyb3JDb2RlIT0wKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGVycm9yQ29kZTsKLSAgICB9Ci0KLSAgICBlcnJvckNvZGUgPSBMVlBTQV9BcHBseU5ld1NldHRpbmdzIChwTFZQU0FfSW5zdCk7Ci0KLSAgICBpZihlcnJvckNvZGUhPTApCi0gICAgewotICAgICAgICByZXR1cm4gZXJyb3JDb2RlOwotICAgIH0KLQotICAgIHJldHVybihlcnJvckNvZGUpOwotfQotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfSW5pdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZjZDgyZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Jbml0LmNwcApAQCAtMCwwICsxLDE5NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgICAgIkxWUFNBLmgiCisjaW5jbHVkZSAgICAiTFZQU0FfUHJpdmF0ZS5oIgorI2luY2x1ZGUgICAgIkluc3RBbGxvYy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbml0aWFsaXplIHRoZSBMVlBTQSBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcGhJbnN0YW5jZSAgICAgICAgICBQb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluaXRQYXJhbXMgICAgICAgICAgSW5pdCBwYXJhbWV0ZXJzIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb250cm9sUGFyYW1zICAgICAgIENvbnRyb2wgcGFyYW1ldGVycyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICBNZW1vcnkgdGFibGUgdGhhdCBjb250YWlucyBtZW1vcnkgYXJlYXMgZGVmaW5pdGlvbiAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBvdGhlcndpc2UgICAgICAgICAgIEVycm9yIGR1ZSB0byBiYWQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWUFNBX1JFVFVSTiBMVlBTQV9Jbml0ICAgICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgICAgICAgICAqcGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgICAgICAgICAqcEluaXRQYXJhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Db250cm9sUGFyYW1zX3QgICAgICAgKnBDb250cm9sUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfTWVtVGFiX3QgICAgICAgICAgICAgICpwTWVtb3J5VGFibGUgKQoreworICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICAgICAqcExWUFNBX0luc3Q7CisgICAgTFZQU0FfUkVUVVJOICAgICAgICAgICAgICAgIGVycm9yQ29kZSAgICAgICA9IExWUFNBX09LOworICAgIExWTV9VSU5UMzIgICAgICAgICAgICAgICAgICBpaTsKKyAgICBleHRlcm4gTFZNX0ZMT0FUICAgICAgICAgICAgTFZQU0FfRmxvYXRfR2FpblRhYmxlW107CisgICAgTFZNX1VJTlQzMiAgICAgICAgICAgICAgICAgIEJ1ZmZlckxlbmd0aCA9IDA7CisKKyAgICAvKiBJbnRzX0FsbG9jIGluc3RhbmNlcywgbmVlZGVkIGZvciBtZW1vcnkgYWxpZ25tZW50IG1hbmFnZW1lbnQgKi8KKyAgICBJTlNUX0FMTE9DICAgICAgICAgIEluc3RhbmNlOworICAgIElOU1RfQUxMT0MgICAgICAgICAgU2NyYXRjaDsKKyAgICBJTlNUX0FMTE9DICAgICAgICAgIERhdGE7CisgICAgSU5TVF9BTExPQyAgICAgICAgICBDb2VmOworCisgICAgLyogQ2hlY2sgcGFyYW1ldGVycyAqLworICAgIGlmKChwaEluc3RhbmNlID09IExWTV9OVUxMKSB8fCAocEluaXRQYXJhbXMgPT0gTFZNX05VTEwpIHx8IChwQ29udHJvbFBhcmFtcyA9PSBMVk1fTlVMTCkgfHwgKHBNZW1vcnlUYWJsZSA9PSBMVk1fTlVMTCkpCisgICAgeworICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIH0KKyAgICBpZiggKHBJbml0UGFyYW1zLT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiA+IExWUFNBX01BWEJVRkZFUkRVUkFUSU9OKSAgIHx8CisgICAgICAgIChwSW5pdFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAocEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplID4gTFZQU0FfTUFYSU5QVVRCTE9DS1NJWkUpICAgICAgfHwKKyAgICAgICAgKHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgIChwSW5pdFBhcmFtcy0+bkJhbmRzIDwgTFZQU0FfTkJBTkRTTUlOKSAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAocEluaXRQYXJhbXMtPm5CYW5kcyA+IExWUFNBX05CQU5EU01BWCkgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtcyA9PSAwKSkKKyAgICB7CisgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOworICAgIH0KKyAgICBmb3IoaWkgPSAwOyBpaSA8IHBJbml0UGFyYW1zLT5uQmFuZHM7IGlpKyspCisgICAgeworICAgICAgICBpZigocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5DZW50ZXJGcmVxdWVuY3kgPiBMVlBTQV9NQVhDRU5URVJGUkVRKSB8fAorICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2FpbiAgICAgICAgPiBMVlBTQV9NQVhQT1NUR0FJTikgICB8fAorICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2FpbiAgICAgICAgPCBMVlBTQV9NSU5QT1NUR0FJTikgICB8fAorICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yIDwgTFZQU0FfTUlOUUZBQ1RPUikgICAgICAgICAgICB8fAorICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yID4gTFZQU0FfTUFYUUZBQ1RPUikpCisgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKKyAgICAgICAgICAgfQorICAgIH0KKworICAgIC8qSW5zdF9BbGxvYyBpbnN0YW5jZXMgaW5pdGlhbGl6YXRpb24gKi8KKyAgICBJbnN0QWxsb2NfSW5pdCggJkluc3RhbmNlICAgLCBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fSU5TVEFOQ0VdLnBCYXNlQWRkcmVzcyk7CisgICAgSW5zdEFsbG9jX0luaXQoICZTY3JhdGNoICAgICwgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzcyk7CisgICAgSW5zdEFsbG9jX0luaXQoICZEYXRhICAgICAgICwgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzKTsKKyAgICBJbnN0QWxsb2NfSW5pdCggJkNvZWYgICAgICAgLCBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MpOworCisgICAgLyogU2V0IHRoZSBpbnN0YW5jZSBoYW5kbGUgaWYgbm90IGFscmVhZHkgaW5pdGlhbGlzZWQgKi8KKyAgICBpZiAoKnBoSW5zdGFuY2UgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICAqcGhJbnN0YW5jZSA9IEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgc2l6ZW9mKExWUFNBX0luc3RhbmNlUHJfdCkgKTsKKyAgICB9CisgICAgcExWUFNBX0luc3QgPShMVlBTQV9JbnN0YW5jZVByX3QqKSpwaEluc3RhbmNlOworCisgICAgLyogQ2hlY2sgdGhlIG1lbW9yeSB0YWJsZSBmb3IgTlVMTCBwb2ludGVycyAqLworICAgIGZvciAoaWkgPSAwOyBpaSA8IExWUFNBX05SX01FTU9SWV9SRUdJT05TOyBpaSsrKQorICAgIHsKKyAgICAgICAgaWYgKHBNZW1vcnlUYWJsZS0+UmVnaW9uW2lpXS5TaXplIT0wKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAocE1lbW9yeVRhYmxlLT5SZWdpb25baWldLnBCYXNlQWRkcmVzcz09TFZNX05VTEwpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5NZW1vcnlUYWJsZS5SZWdpb25baWldID0gcE1lbW9yeVRhYmxlLT5SZWdpb25baWldOworICAgICAgICB9CisgICAgfQorCisgICAgLyogSW5pdGlhbGl6ZSBtb2R1bGUncyBpbnRlcm5hbCBwYXJhbWV0ZXJzICovCisgICAgcExWUFNBX0luc3QtPmJDb250cm9sUGVuZGluZyA9IExWTV9GQUxTRTsKKyAgICBwTFZQU0FfSW5zdC0+bkJhbmRzID0gcEluaXRQYXJhbXMtPm5CYW5kczsKKyAgICBwTFZQU0FfSW5zdC0+TWF4SW5wdXRCbG9ja1NpemUgPSBwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemU7CisgICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uID0gcEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOworICAgIHBMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkZzID0gTFZNX0ZTX0RVTU1ZOworICAgIHBMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkxldmVsRGV0ZWN0aW9uU3BlZWQgPSBMVlBTQV9TUEVFRF9EVU1NWTsKKworICAgIHsgICAvKiBmb3IgYXZvaWRpbmcgUUFDIHdhcm5pbmdzICovCisgICAgICAgIExWTV9JTlQzMiBTREJEPShMVk1fSU5UMzIpcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uOworICAgICAgICBMVk1fSU5UMzIgSVJUST0oTFZNX0lOVDMyKUxWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVJbnY7CisgICAgICAgIExWTV9JTlQzMiBCTDsKKworICAgICAgICBNVUwzMngzMklOVE8zMihTREJELElSVEksQkwsTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0KQorCisgICAgICAgIEJ1ZmZlckxlbmd0aD0oTFZNX1VJTlQzMilCTDsKKyAgICB9CisKKyAgICBpZigoQnVmZmVyTGVuZ3RoICogTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZSkgIT0gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uKQorICAgIHsKKyAgICAgICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCA9IEJ1ZmZlckxlbmd0aCArIDE7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGggPSBCdWZmZXJMZW5ndGg7CisgICAgfQorCisgICAgLyogQXNzaWduIHRoZSBwb2ludGVycyAqLworICAgIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zICAgICAgICAgICAgID0KKyAgICAgICAgKExWTV9GTE9BVCAqKUluc3RBbGxvY19BZGRNZW1iZXIoJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWTV9GTE9BVCkpOworICAgIHBMVlBTQV9JbnN0LT5wRmlsdGVyc1BhcmFtcyAgICAgICAgICAgICA9IChMVlBTQV9GaWx0ZXJQYXJhbV90ICopCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWUFNBX0ZpbHRlclBhcmFtX3QpKTsKKyAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ICAgPSAoTFZNX1VJTlQ4ICopCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoICogc2l6ZW9mKExWTV9VSU5UOCkpOworICAgIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrcyAgICAgICAgICAgICA9IChMVk1fVUlOVDggKikKKyAgICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWTV9VSU5UOCkpOworICAgIHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uICAgICAgICA9IChMVlBTQV9CUEZpbHRlclByZWNpc2lvbl9lbiAqKQorICAgICAgICAgICAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlcigmSW5zdGFuY2UsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKExWUFNBX0JQRmlsdGVyUHJlY2lzaW9uX2VuKSk7CisgICAgcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXMgICAgICAgICAgPSAoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QgKikKKyAgICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KSk7CisgICAgcExWUFNBX0luc3QtPnBRUERfU3RhdGVzICAgICAgICAgICAgPSAoUVBEX0ZMT0FUX1N0YXRlX3QgKikKKyAgICAgICAgICAgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFFQRF9GTE9BVF9TdGF0ZV90KSk7CisKKyAgICBwTFZQU0FfSW5zdC0+cEJQX1RhcHMgICAgICAgICAgICAgICA9IChCaXF1YWRfMUlfT3JkZXIyX0ZMT0FUX1RhcHNfdCAqKQorICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoQmlxdWFkXzFJX09yZGVyMl9GTE9BVF9UYXBzX3QpKTsKKyAgICBwTFZQU0FfSW5zdC0+cFFQRF9UYXBzICAgICAgICAgICAgICA9IChRUERfRkxPQVRfVGFwc190ICopCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFFQRF9GTE9BVF9UYXBzX3QpKTsKKworICAgIC8qIENvcHkgZmlsdGVycyBwYXJhbWV0ZXJzIGluIHRoZSBwcml2YXRlIGluc3RhbmNlICovCisgICAgZm9yKGlpID0gMDsgaWkgPCBwTFZQU0FfSW5zdC0+bkJhbmRzOyBpaSsrKQorICAgIHsKKyAgICAgICAgcExWUFNBX0luc3QtPnBGaWx0ZXJzUGFyYW1zW2lpXSA9IHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV07CisgICAgfQorCisgICAgLyogU2V0IFBvc3QgZmlsdGVycyBnYWlucyovCisgICAgZm9yKGlpID0gMDsgaWkgPCBwTFZQU0FfSW5zdC0+bkJhbmRzOyBpaSsrKQorICAgIHsKKyAgICAgICAgcExWUFNBX0luc3QtPnBQb3N0R2FpbnNbaWldID0gTFZQU0FfRmxvYXRfR2FpblRhYmxlWzE1ICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlBvc3RHYWluXTsKKyAgICB9CisgICAgcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0OworCisgICAgLyogSW5pdGlhbGl6ZSBjb250cm9sIGRlcGVuZGFudCBpbnRlcm5hbCBwYXJhbWV0ZXJzICovCisgICAgZXJyb3JDb2RlID0gTFZQU0FfQ29udHJvbCAoKnBoSW5zdGFuY2UsIHBDb250cm9sUGFyYW1zKTsKKworICAgIGlmKGVycm9yQ29kZSE9MCkKKyAgICB7CisgICAgICAgIHJldHVybiBlcnJvckNvZGU7CisgICAgfQorCisgICAgZXJyb3JDb2RlID0gTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyAocExWUFNBX0luc3QpOworCisgICAgaWYoZXJyb3JDb2RlIT0wKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycm9yQ29kZTsKKyAgICB9CisKKyAgICByZXR1cm4oZXJyb3JDb2RlKTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNmE4ZjlkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9NZW1vcnkuYworKysgL2Rldi9udWxsCkBAIC0xLDE4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAgICAiTFZQU0EuaCIKLSNpbmNsdWRlICAgICJMVlBTQV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAgICAiSW5zdEFsbG9jLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZFUU5CX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZnJlZS4gSXQgY2FuIGJlIGNhbGxlZCBpbiAgICAgICAgICAgKi8KLS8qICB0d28gd2F5czogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIGhJbnN0YW5jZSA9IE5VTEwgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gSW5zdGFuY2UgaGFuZGxlICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBiYXNlIGFkZHJlc3NlcyBmb3IgdGhlIGluc3RhbmNlICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiAoaEluc3RhbmNlPU5VTEwpIHRoZSBtZW1vcnkgICAgICAqLwotLyogIGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBXaGVuIHRoZSBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIGZyZWUgKGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZSkgdGhlIG1lbW9yeSAgICAgICAqLwotLyogIHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KLS8qICBJbml0UGFyYW1zICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSBpbml0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX01lbW9yeSAgICAgICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX01lbVRhYl90ICAgICAgICAgICAgICpwTWVtb3J5VGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9Jbml0UGFyYW1zX3QgICAgICAgICAqcEluaXRQYXJhbXMgICAgKQotewotICAgIExWTV9VSU5UMzIgICAgICAgICAgaWk7Ci0gICAgTFZNX1VJTlQzMiAgICAgICAgICBCdWZmZXJMZW5ndGg7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICBJbnN0YW5jZTsKLSAgICBJTlNUX0FMTE9DICAgICAgICAgIFNjcmF0Y2g7Ci0gICAgSU5TVF9BTExPQyAgICAgICAgICBEYXRhOwotICAgIElOU1RfQUxMT0MgICAgICAgICAgQ29lZjsKLSAgICBMVlBTQV9JbnN0YW5jZVByX3QgKnBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOwotCi0KLSAgICBJbnN0QWxsb2NfSW5pdCggJkluc3RhbmNlICAgLCBMVk1fTlVMTCk7Ci0gICAgSW5zdEFsbG9jX0luaXQoICZTY3JhdGNoICAgICwgTFZNX05VTEwpOwotICAgIEluc3RBbGxvY19Jbml0KCAmRGF0YSAgICAgICAsIExWTV9OVUxMKTsKLSAgICBJbnN0QWxsb2NfSW5pdCggJkNvZWYgICAgICAgLCBMVk1fTlVMTCk7Ci0KLQotICAgIGlmKChwTWVtb3J5VGFibGUgPT0gTFZNX05VTEwpIHx8IChwSW5pdFBhcmFtcyA9PSBMVk1fTlVMTCkpCi0gICAgewotICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOwotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBGaWxsIGluIHRoZSBtZW1vcnkgdGFibGUKLSAgICAgKi8KLSAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKLQotICAgICAgICAvKiBDaGVjayBpbml0IHBhcmFtZXRlciAqLwotICAgICAgICBpZiggKHBJbml0UGFyYW1zLT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbiA+IExWUFNBX01BWEJVRkZFUkRVUkFUSU9OKSAgIHx8Ci0gICAgICAgICAgICAocEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uID09IDApICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+TWF4SW5wdXRCbG9ja1NpemUgPiBMVlBTQV9NQVhJTlBVVEJMT0NLU0laRSkgICAgICB8fAotICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSA9PSAwKSAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8Ci0gICAgICAgICAgICAocEluaXRQYXJhbXMtPm5CYW5kcyA8IExWUFNBX05CQU5EU01JTikgICAgICAgICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+bkJhbmRzID4gTFZQU0FfTkJBTkRTTUFYKSAgICAgICAgICAgICAgICAgICAgICAgICB8fAotICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtcyA9PSAwKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX0lOVkFMSURQQVJBTSk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yKGlpID0gMDsgaWkgPCBwSW5pdFBhcmFtcy0+bkJhbmRzOyBpaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZigocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5DZW50ZXJGcmVxdWVuY3kgPiBMVlBTQV9NQVhDRU5URVJGUkVRKSB8fAotICAgICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUG9zdEdhaW4gICAgICAgID4gTFZQU0FfTUFYUE9TVEdBSU4pICAgfHwKLSAgICAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlBvc3RHYWluICAgICAgICA8IExWUFNBX01JTlBPU1RHQUlOKSAgIHx8Ci0gICAgICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yIDwgTFZQU0FfTUlOUUZBQ1RPUikgICAgICAgICAgICB8fAotICAgICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUUZhY3RvciA+IExWUFNBX01BWFFGQUNUT1IpKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEluc3RhbmNlIG1lbW9yeQotICAgICAgICAgKi8KLQotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmSW5zdGFuY2UsIHNpemVvZihMVlBTQV9JbnN0YW5jZVByX3QpICk7Ci0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWTV9GTE9BVCkgKTsKLSNlbHNlCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fVUlOVDE2KSApOwotI2VuZGlmCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVlBTQV9GaWx0ZXJQYXJhbV90KSApOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8qIGZvciBhdm9pZGluZyBRQUMgd2FybmluZ3MgYXMgTVVMMzJ4MzJJTlRPMzIgd29ya3Mgb24gTFZNX0lOVDMyIG9ubHkqLwotICAgICAgICAgICAgTFZNX0lOVDMyIFNEQkQ9KExWTV9JTlQzMilwSW5pdFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb247Ci0gICAgICAgICAgICBMVk1fSU5UMzIgSVJUST0oTFZNX0lOVDMyKUxWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVJbnY7Ci0gICAgICAgICAgICBMVk1fSU5UMzIgQkw7Ci0KLSAgICAgICAgICAgIE1VTDMyeDMySU5UTzMyKFNEQkQsSVJUSSxCTCxMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lU2hpZnQpCi0gICAgICAgICAgICBCdWZmZXJMZW5ndGg9KExWTV9VSU5UMzIpQkw7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGlmKChCdWZmZXJMZW5ndGggKiBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lKSAhPSBwSW5pdFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJ1ZmZlckxlbmd0aCsrOwotICAgICAgICB9Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIEJ1ZmZlckxlbmd0aCAqIHNpemVvZihMVk1fVUlOVDgpICk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fVUlOVDgpICk7Ci0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVlBTQV9CUEZpbHRlclByZWNpc2lvbl9lbikgKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX0lOU1RBTkNFXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkluc3RhbmNlKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX0lOU1RBTkNFXS5UeXBlICAgICAgICAgPSBMVlBTQV9QRVJTSVNURU5UOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fSU5TVEFOQ0VdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNjcmF0Y2ggbWVtb3J5Ci0gICAgICAgICAqLwotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmU2NyYXRjaCwgMiAqIHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSAqIHNpemVvZihMVk1fSU5UMTYpICk7Ci0jZWxzZQotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmU2NyYXRjaCwgMiAqIHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSAqIHNpemVvZihMVk1fRkxPQVQpICk7Ci0jZW5kaWYKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmU2NyYXRjaCk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9TQ1JBVENIXS5UeXBlICAgICAgICAgPSBMVlBTQV9TQ1JBVENIOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogUGVyc2lzdGVudCBjb2VmZmljaWVudHMgbWVtb3J5Ci0gICAgICAgICAqLwotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfSW5zdGFuY2VfdCkgKTsKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX1N0YXRlX3QpICk7Ci0jZWxzZQotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmQ29lZiwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCkgKTsKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX0ZMT0FUX1N0YXRlX3QpICk7Ci0jZW5kaWYKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uU2l6ZSAgICAgICAgID0gSW5zdEFsbG9jX0dldFRvdGFsKCZDb2VmKTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfQ09FRl0uVHlwZSAgICAgICAgID0gTFZQU0FfUEVSU0lTVEVOVF9DT0VGOwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBQZXJzaXN0ZW50IGRhdGEgbWVtb3J5Ci0gICAgICAgICAqLwotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihCaXF1YWRfMUlfT3JkZXIyX1RhcHNfdCkgKTsKLSAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkRhdGEsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoUVBEX1RhcHNfdCkgKTsKLSNlbHNlCi0gICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190KSApOwotICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfRkxPQVRfVGFwc190KSApOwotI2VuZGlmCi0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlNpemUgICAgICAgICA9IEluc3RBbGxvY19HZXRUb3RhbCgmRGF0YSk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLlR5cGUgICAgICAgICA9IExWUFNBX1BFUlNJU1RFTlRfREFUQTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1BFUlNJU1RFTlRfREFUQV0ucEJhc2VBZGRyZXNzID0gTFZNX05VTEw7Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogUmVhZCBiYWNrIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCi0gICAgICAgICpwTWVtb3J5VGFibGUgPSBwTFZQU0FfSW5zdC0+TWVtb3J5VGFibGU7Ci0gICAgfQotCi0gICAgcmV0dXJuKExWUFNBX09LKTsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfTWVtb3J5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWZjYmU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX01lbW9yeS5jcHAKQEAgLTAsMCArMSwxNjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICAgICJMVlBTQS5oIgorI2luY2x1ZGUgICAgIkxWUFNBX1ByaXZhdGUuaCIKKyNpbmNsdWRlICAgICJJbnN0QWxsb2MuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkVRTkJfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAqLworLyogIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBoSW5zdGFuY2UgPSBJbnN0YW5jZSBoYW5kbGUgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJhc2UgYWRkcmVzc2VzIGZvciB0aGUgaW5zdGFuY2UgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgdGhlIG1lbW9yeSAgICAgICovCisvKiAgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uIHJldHVybi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZnJlZSAoaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlKSB0aGUgbWVtb3J5ICAgICAgICovCisvKiAgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgYmFzZSBhZGRyZXNzZXMgdXNlZCBkdXJpbmcgaW5pdGlhbGlzYXRpb24uICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIGFuIGVtcHR5IG1lbW9yeSBkZWZpbml0aW9uIHRhYmxlICAgICAgICAgICAgICAgICAqLworLyogIEluaXRQYXJhbXMgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlIGluaXQgcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWUFNBX09LICAgICAgICAgICAgU3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfTWVtb3J5ICAgICAgICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfTWVtVGFiX3QgICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX0luaXRQYXJhbXNfdCAgICAgICAgICpwSW5pdFBhcmFtcyAgICApCit7CisgICAgTFZNX1VJTlQzMiAgICAgICAgICBpaTsKKyAgICBMVk1fVUlOVDMyICAgICAgICAgIEJ1ZmZlckxlbmd0aDsKKyAgICBJTlNUX0FMTE9DICAgICAgICAgIEluc3RhbmNlOworICAgIElOU1RfQUxMT0MgICAgICAgICAgU2NyYXRjaDsKKyAgICBJTlNUX0FMTE9DICAgICAgICAgIERhdGE7CisgICAgSU5TVF9BTExPQyAgICAgICAgICBDb2VmOworICAgIExWUFNBX0luc3RhbmNlUHJfdCAqcExWUFNBX0luc3QgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7CisKKyAgICBJbnN0QWxsb2NfSW5pdCggJkluc3RhbmNlICAgLCBMVk1fTlVMTCk7CisgICAgSW5zdEFsbG9jX0luaXQoICZTY3JhdGNoICAgICwgTFZNX05VTEwpOworICAgIEluc3RBbGxvY19Jbml0KCAmRGF0YSAgICAgICAsIExWTV9OVUxMKTsKKyAgICBJbnN0QWxsb2NfSW5pdCggJkNvZWYgICAgICAgLCBMVk1fTlVMTCk7CisKKyAgICBpZigocE1lbW9yeVRhYmxlID09IExWTV9OVUxMKSB8fCAocEluaXRQYXJhbXMgPT0gTFZNX05VTEwpKQorICAgIHsKKyAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKKyAgICB9CisKKyAgICAvKgorICAgICAqIEZpbGwgaW4gdGhlIG1lbW9yeSB0YWJsZQorICAgICAqLworICAgIGlmIChoSW5zdGFuY2UgPT0gTFZNX05VTEwpCisgICAgeworCisgICAgICAgIC8qIENoZWNrIGluaXQgcGFyYW1ldGVyICovCisgICAgICAgIGlmKCAocEluaXRQYXJhbXMtPlNwZWN0cmFsRGF0YUJ1ZmZlckR1cmF0aW9uID4gTFZQU0FfTUFYQlVGRkVSRFVSQVRJT04pICAgfHwKKyAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24gPT0gMCkgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSA+IExWUFNBX01BWElOUFVUQkxPQ0tTSVpFKSAgICAgIHx8CisgICAgICAgICAgICAocEluaXRQYXJhbXMtPk1heElucHV0QmxvY2tTaXplID09IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+bkJhbmRzIDwgTFZQU0FfTkJBTkRTTUlOKSAgICAgICAgICAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5uQmFuZHMgPiBMVlBTQV9OQkFORFNNQVgpICAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zID09IDApKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKKyAgICAgICAgfQorICAgICAgICBmb3IoaWkgPSAwOyBpaSA8IHBJbml0UGFyYW1zLT5uQmFuZHM7IGlpKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLkNlbnRlckZyZXF1ZW5jeSA+IExWUFNBX01BWENFTlRFUkZSRVEpIHx8CisgICAgICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5Qb3N0R2FpbiAgICAgICAgPiBMVlBTQV9NQVhQT1NUR0FJTikgICB8fAorICAgICAgICAgICAgICAgKHBJbml0UGFyYW1zLT5wRmlsdGVyc1BhcmFtc1tpaV0uUG9zdEdhaW4gICAgICAgIDwgTFZQU0FfTUlOUE9TVEdBSU4pICAgfHwKKyAgICAgICAgICAgICAgIChwSW5pdFBhcmFtcy0+cEZpbHRlcnNQYXJhbXNbaWldLlFGYWN0b3IgPCBMVlBTQV9NSU5RRkFDVE9SKSAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAocEluaXRQYXJhbXMtPnBGaWx0ZXJzUGFyYW1zW2lpXS5RRmFjdG9yID4gTFZQU0FfTUFYUUZBQ1RPUikpCisgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOworICAgICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogSW5zdGFuY2UgbWVtb3J5CisgICAgICAgICAqLworCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgc2l6ZW9mKExWUFNBX0luc3RhbmNlUHJfdCkgKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWTV9GTE9BVCkgKTsKKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkluc3RhbmNlLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKExWUFNBX0ZpbHRlclBhcmFtX3QpICk7CisKKyAgICAgICAgeworICAgICAgICAgICAgLyogZm9yIGF2b2lkaW5nIFFBQyB3YXJuaW5ncyBhcyBNVUwzMngzMklOVE8zMiB3b3JrcyBvbiBMVk1fSU5UMzIgb25seSovCisgICAgICAgICAgICBMVk1fSU5UMzIgU0RCRD0oTFZNX0lOVDMyKXBJbml0UGFyYW1zLT5TcGVjdHJhbERhdGFCdWZmZXJEdXJhdGlvbjsKKyAgICAgICAgICAgIExWTV9JTlQzMiBJUlRJPShMVk1fSU5UMzIpTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZUludjsKKyAgICAgICAgICAgIExWTV9JTlQzMiBCTDsKKworICAgICAgICAgICAgTVVMMzJ4MzJJTlRPMzIoU0RCRCxJUlRJLEJMLExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVTaGlmdCkKKyAgICAgICAgICAgIEJ1ZmZlckxlbmd0aD0oTFZNX1VJTlQzMilCTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmKChCdWZmZXJMZW5ndGggKiBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lKSAhPSBwSW5pdFBhcmFtcy0+U3BlY3RyYWxEYXRhQnVmZmVyRHVyYXRpb24pCisgICAgICAgIHsKKyAgICAgICAgICAgIEJ1ZmZlckxlbmd0aCsrOworICAgICAgICB9CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIEJ1ZmZlckxlbmd0aCAqIHNpemVvZihMVk1fVUlOVDgpICk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVk1fVUlOVDgpICk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZJbnN0YW5jZSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihMVlBTQV9CUEZpbHRlclByZWNpc2lvbl9lbikgKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX0lOU1RBTkNFXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkluc3RhbmNlKTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX0lOU1RBTkNFXS5UeXBlICAgICAgICAgPSBMVlBTQV9QRVJTSVNURU5UOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fSU5TVEFOQ0VdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgICAgIC8qCisgICAgICAgICAqIFNjcmF0Y2ggbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmU2NyYXRjaCwgMiAqIHBJbml0UGFyYW1zLT5NYXhJbnB1dEJsb2NrU2l6ZSAqIHNpemVvZihMVk1fRkxPQVQpICk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9TQ1JBVENIXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJlNjcmF0Y2gpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0uVHlwZSAgICAgICAgID0gTFZQU0FfU0NSQVRDSDsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgICAgIC8qCisgICAgICAgICAqIFBlcnNpc3RlbnQgY29lZmZpY2llbnRzIG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgSW5zdEFsbG9jX0FkZE1lbWJlciggJkNvZWYsIHBJbml0UGFyYW1zLT5uQmFuZHMgKiBzaXplb2YoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QpICk7CisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZDb2VmLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKFFQRF9GTE9BVF9TdGF0ZV90KSApOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkNvZWYpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGXS5UeXBlICAgICAgICAgPSBMVlBTQV9QRVJTSVNURU5UX0NPRUY7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0NPRUZdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgICAgIC8qCisgICAgICAgICAqIFBlcnNpc3RlbnQgZGF0YSBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIEluc3RBbGxvY19BZGRNZW1iZXIoICZEYXRhLCBwSW5pdFBhcmFtcy0+bkJhbmRzICogc2l6ZW9mKEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190KSApOworICAgICAgICBJbnN0QWxsb2NfQWRkTWVtYmVyKCAmRGF0YSwgcEluaXRQYXJhbXMtPm5CYW5kcyAqIHNpemVvZihRUERfRkxPQVRfVGFwc190KSApOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5TaXplICAgICAgICAgPSBJbnN0QWxsb2NfR2V0VG90YWwoJkRhdGEpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVlBTQV9QRVJTSVNURU5UX0RBVEE7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWUFNBX01FTVJFR0lPTl9QRVJTSVNURU5UX0RBVEFdLnBCYXNlQWRkcmVzcyA9IExWTV9OVUxMOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qIFJlYWQgYmFjayBtZW1vcnkgYWxsb2NhdGlvbiB0YWJsZSAqLworICAgICAgICAqcE1lbW9yeVRhYmxlID0gcExWUFNBX0luc3QtPk1lbW9yeVRhYmxlOworICAgIH0KKworICAgIHJldHVybihMVlBTQV9PSyk7Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUHJpdmF0ZS5oCmluZGV4IGE3NTBiYjAuLjYxOTg3YjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcml2YXRlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1ByaXZhdGUuaApAQCAtMjMsMTIgKzIzLDYgQEAKICNpbmNsdWRlICJMVlBTQV9RUEQuaCIKICNpbmNsdWRlICJMVk1fTWFjcm9zLmgiCiAKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBDT05TVEFOVCBERUZJTklUSU9OUwogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC00MywxMSArMzcsNyBAQAogI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9DT0VGICAxICAgICAgLyogT2Zmc2V0IHRvIHBlcnNpc3RlbnQgY29lZmZpY2llbnRzICBtZW1vcnkgcmVnaW9uIGluIG1lbW9yeSB0YWJsZSAqLwogI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fUEVSU0lTVEVOVF9EQVRBICAyICAgICAgLyogT2Zmc2V0IHRvIHBlcnNpc3RlbnQgdGFwcyAgbWVtb3J5IHJlZ2lvbiBpbiBtZW1vcnkgdGFibGUgICAgICAgICAqLwogI2RlZmluZSBMVlBTQV9NRU1SRUdJT05fU0NSQVRDSCAgICAgICAgICAzICAgICAgLyogT2Zmc2V0IHRvIHNjcmF0Y2ggIG1lbW9yeSByZWdpb24gaW4gbWVtb3J5IHRhYmxlICAgICAgICAgICAgICAgICAqLwotI2lmbmRlZiBISUdIRVJfRlMKLSNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUgICAgICAgICAgOSAgICAgIC8qIEZyb20gODAwMEh6IHRvIDQ4MDAwSHoqLwotI2Vsc2UKLSNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUgICAgICAgICAgMTEgICAgICAvKiBGcm9tIDgwMDBIeiB0byAxOTIwMDBIeiovCi0jZW5kaWYKKyNkZWZpbmUgTFZQU0FfTlJfU1VQUE9SVEVEX1JBVEUgICAgICAgICAgMTMgICAgICAvKiBGcm9tIDgwMDBIeiB0byAxOTIwMDBIeiovCiAjZGVmaW5lIExWUFNBX05SX1NVUFBPUlRFRF9TUEVFRCAgICAgICAgIDMgICAgICAvKiBMT1csIE1FRElVTSwgSElHSCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAKICNkZWZpbmUgTFZQU0FfTUFYQlVGRkVSRFVSQVRJT04gICAgICAgICAgNDAwMCAgIC8qIE1heGltdW0gbGVuZ3RoIGluIG1zIG9mIHRoZSBsZXZlbHMgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTc3LDcgKzY3LDYgQEAKICNkZWZpbmUgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZUludiAgICAweDA2NjYgICAgLyogMS8yMG1zIGxlZnQgc2hpZnRlZCBieSAxNSAgKi8KICNkZWZpbmUgTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0ICAxNQogCi0KIC8qIFByZWNpc2lvbiBvZiB0aGUgZmlsdGVyICovCiB0eXBlZGVmIGVudW0KIHsKQEAgLTk2LDEyICs4NSw2IEBACiAgICAgTFZQU0FfTWVtVGFiX3QgICAgICAgICAgICAgIE1lbW9yeVRhYmxlOwogCiAgICAgTFZQU0FfQlBGaWx0ZXJQcmVjaXNpb25fZW4gKnBCUEZpbHRlcnNQcmVjaXNpb247ICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBmaWx0ZXIgcHJlY2lzaW9uIGZvciBlYWNoIGJhbmQgICAgICAgICAgICAgICovCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0gICAgQmlxdWFkX0luc3RhbmNlX3QgICAgICAgICAgKnBCUF9JbnN0YW5jZXM7ICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBiYW5kIHBhc3MgZmlsdGVyIGluc3RhbmNlIGZvciBlYWNoIGJhbmQgICAgICovCi0gICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgICAgKnBCUF9UYXBzOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBiYW5kIHBhc3MgZmlsdGVyIHRhcHMgZm9yIGVhY2ggYmFuZCAgICAgICAgICovCi0gICAgUVBEX1N0YXRlX3QgICAgICAgICAgICAgICAgKnBRUERfU3RhdGVzOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBRUEQgZmlsdGVyIGluc3RhbmNlIGZvciBlYWNoIGJhbmQgICAgICAgICAgICovCi0gICAgUVBEX1RhcHNfdCAgICAgICAgICAgICAgICAgKnBRUERfVGFwczsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBRUEQgZmlsdGVyIHRhcHMgZm9yIGVhY2ggYmFuZCAgICAgICAgICAgICAgICovCi0jZWxzZQogICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgICAgICpwQlBfSW5zdGFuY2VzOwogICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBiYW5kIHBhc3MgZmlsdGVyIHRhcHMgZm9yIGVhY2ggYmFuZCAqLwogICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190ICAgICpwQlBfVGFwczsKQEAgLTEwOSwxNyArOTIsMTEgQEAKICAgICBRUERfRkxPQVRfU3RhdGVfdCAgICAgICAgICAgICAgICAqcFFQRF9TdGF0ZXM7CiAgICAgLyogUG9pbnRzIGEgbkJhbmRzIGVsZW1lbnRzIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIFFQRCBmaWx0ZXIgdGFwcyBmb3IgZWFjaCBiYW5kICovCiAgICAgUVBEX0ZMT0FUX1RhcHNfdCAgICAgICAgICAgICAgICAgKnBRUERfVGFwczsKLSNlbmRpZgogCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgKnBQb3N0R2FpbnM7ICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBwb3N0LWZpbHRlciBnYWlucyBmb3IgZWFjaCBiYW5kICAgICAgICAgICAgICovCi0jZWxzZQogICAgIC8qIFBvaW50cyBhIG5CYW5kcyBlbGVtZW50cyBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBwb3N0LWZpbHRlciBnYWlucyBmb3IgZWFjaCBiYW5kICovCiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBQb3N0R2FpbnM7Ci0jZW5kaWYKICAgICBMVlBTQV9GaWx0ZXJQYXJhbV90ICAgICAgICAqcEZpbHRlcnNQYXJhbXM7ICAgICAgICAgICAgICAgICAgICAgLyogQ29weSBvZiB0aGUgZmlsdGVycyBwYXJhbWV0ZXJzIGZyb20gdGhlIGlucHV0IHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIAotCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIG5TYW1wbGVzQnVmZmVyVXBkYXRlOyAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIG1ha2UgMjBtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudDsgICAgICAgICAgIC8qIENvdW50ZXIgdXNlZCB0byBrbm93IHdoZW4gdG8gcHV0IGEgbmV3IHZhbHVlIGluIHRoZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgIG5SZWxldmFudEZpbHRlcnM7ICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiByZWxldmVudCBmaWx0ZXJzIGRlcGVuZGluZyBvbiBzYW1wbGluZyBmcmVxdWVuY3kgYW5kIGJhbmRzIGNlbnRlciBmcmVxdWVuY3kgICAgICAgICovCkBAIC0xNDAsOCArMTE3LDYgQEAKIAogfUxWUFNBX0luc3RhbmNlUHJfdCwgKnBMVlBTQV9JbnN0YW5jZVByX3Q7CiAKLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgRlVOQ1RJT05TIFBST1RPVFlQRQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCkBAIC0xNjIsOCArMTM3LDQgQEAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiBMVlBTQV9SRVRVUk4gTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyAoTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcEluc3QpOwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCiAjZW5kaWYgLyogX0xWUFNBX1BSSVZBVEVfSCAqLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhNWY3NGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuYworKysgL2Rldi9udWxsCkBAIC0xLDM0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAgICAiTFZQU0EuaCIKLSNpbmNsdWRlICAgICJMVlBTQV9Qcml2YXRlLmgiCi0jaW5jbHVkZSAgICAiTFZNX01hY3Jvcy5oIgotI2luY2x1ZGUgICAgIlZlY3RvckFyaXRobWV0aWMuaCIKLQotI2RlZmluZSBMVk1fTUlOSU5UXzMyICAgMHg4MDAwMDAwMAotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoZSBwcm9jZXNzIGFwcGxpZXMgYmFuZCBwYXNzIGZpbHRlcnMgdG8gdGhlIHNpZ25hbC4gRWFjaCBvdXRwdXQgICAgICAgICAgICAgICAgKi8KLS8qICBmZWVkcyBhIHF1YXNpIHBlYWsgZmlsdGVyIGZvciBsZXZlbCBkZXRlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcExWUFNBX0lucHV0U2FtcGxlcyBQb2ludGVyIHRvIHRoZSBpbnB1dCBzYW1wbGVzIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIElucHV0QmxvY2tTaXplICAgICAgTnVtYmVyIG9mIG1vbm8gc2FtcGxlcyB0byBwcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBBdWRpb1RpbWUgICAgICAgICAgIFBsYXliYWNrIHRpbWUgb2YgdGhlIGlucHV0IHNhbXBsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi1MVlBTQV9SRVRVUk4gTFZQU0FfUHJvY2VzcyAgICAgICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwTFZQU0FfSW5wdXRTYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgSW5wdXRCbG9ja1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9UaW1lICAgICAgICAgICBBdWRpb1RpbWUgICAgICAgICAgICApCi0KLXsKLSAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgaWk7Ci0gICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQXVkaW9UaW1lSW5jOwotICAgIGV4dGVybiBMVk1fVUlOVDMyICAgICAgIExWUFNBX1NhbXBsZVJhdGVJbnZUYWJbXTsKLSAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAqcFdyaXRlX1NhdmU7ICAgICAgICAgLyogUG9zaXRpb24gb2YgdGhlIHdyaXRlIHBvaW50ZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJvY2VzcyAgKi8KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICBDSEVDSyBQQVJBTUVURVJTCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBpZihoSW5zdGFuY2UgPT0gTFZNX05VTEwgfHwgcExWUFNBX0lucHV0U2FtcGxlcyA9PSBMVk1fTlVMTCkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7Ci0gICAgfQotICAgIGlmKElucHV0QmxvY2tTaXplID09IDAgfHwgSW5wdXRCbG9ja1NpemUgPiBwTFZQU0FfSW5zdC0+TWF4SW5wdXRCbG9ja1NpemUpCi0gICAgewotICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKLSAgICB9Ci0KLSAgICBwU2NyYXRjaCA9IChMVk1fRkxPQVQqKXBMVlBTQV9JbnN0LT5NZW1vcnlUYWJsZS5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKLSAgICBwV3JpdGVfU2F2ZSA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyOwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgIEFQUExZIE5FVyBTRVRUSU5HUyBJRiBORUVERUQKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmIChwTFZQU0FfSW5zdC0+YkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKQotICAgIHsKLSAgICAgICAgcExWUFNBX0luc3QtPmJDb250cm9sUGVuZGluZyA9IDA7Ci0gICAgICAgIExWUFNBX0FwcGx5TmV3U2V0dGluZ3MoIHBMVlBTQV9JbnN0KTsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgUFJPQ0VTUyBTQU1QTEVTCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAvKiBQdXQgc2FtcGxlcyBpbiByYW5nZSBbLTAuNTswLjVbIGZvciBCUCBmaWx0ZXJzIChzZWUgQmlxdWFkcyBkb2N1bWVudGF0aW9uKSAqLwotICAgIENvcHlfRmxvYXQocExWUFNBX0lucHV0U2FtcGxlcywgcFNjcmF0Y2gsIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUpOwotICAgIFNoaWZ0X1NhdF9GbG9hdCgtMSwgcFNjcmF0Y2gsIHBTY3JhdGNoLCAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKLQotICAgIGZvciAoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKQotICAgIHsKLSAgICAgICAgc3dpdGNoKHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uW2lpXSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBMVlBTQV9TaW1wbGVQcmVjaXNpb25GaWx0ZXI6Ci0gICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEgICggJnBMVlBTQV9JbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIElucHV0QmxvY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjoKLSAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMSAgKCAmcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXNbaWldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgSW5wdXRCbG9ja1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLQotICAgICAgICBMVlBTQV9RUERfUHJvY2Vzc19GbG9hdCAgICggcExWUFNBX0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIElucHV0QmxvY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpKTsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgVVBEQVRFIFNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZQotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBpZihwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAhPSBwV3JpdGVfU2F2ZSkKLSAgICB7Ci0gICAgICAgIE1VTDMyeDMySU5UTzMyKChBdWRpb1RpbWUgKyAoTFZNX0lOVDMyKSgoTFZNX0lOVDMyKXBMVlBTQV9JbnN0LT5Mb2NhbFNhbXBsZXNDb3VudCoxMDAwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKUxWUFNBX1NhbXBsZVJhdGVJbnZUYWJbcExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuRnNdLAotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lSW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRnNJbnZlcnRTaGlmdCkKLSAgICAgICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSA9IEF1ZGlvVGltZSArIEF1ZGlvVGltZUluYzsKLSAgICB9Ci0KLSAgICByZXR1cm4oTFZQU0FfT0spOwotfQotI2Vsc2UKLUxWUFNBX1JFVFVSTiBMVlBTQV9Qcm9jZXNzICAgICAgICAgICAoIHBMVlBTQV9IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgKnBMVlBTQV9JbnB1dFNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICBJbnB1dEJsb2NrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWUFNBX1RpbWUgICAgICAgICAgIEF1ZGlvVGltZSAgICAgICAgICAgICkKLQotewotICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgKnBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwU2NyYXRjaDsKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBpaTsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBBdWRpb1RpbWVJbmM7Ci0gICAgZXh0ZXJuIExWTV9VSU5UMzIgICAgICAgTFZQU0FfU2FtcGxlUmF0ZUludlRhYltdOwotICAgIExWTV9VSU5UOCAgICAgICAgICAgICAgICpwV3JpdGVfU2F2ZTsgICAgICAgICAvKiBQb3NpdGlvbiBvZiB0aGUgd3JpdGUgcG9pbnRlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm9jZXNzICAqLwotCi0gICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgotICAgICAgIENIRUNLIFBBUkFNRVRFUlMKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIGlmKGhJbnN0YW5jZSA9PSBMVk1fTlVMTCB8fCBwTFZQU0FfSW5wdXRTYW1wbGVzID09IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKLSAgICB9Ci0gICAgaWYoSW5wdXRCbG9ja1NpemUgPT0gMCB8fCBJbnB1dEJsb2NrU2l6ZSA+IHBMVlBTQV9JbnN0LT5NYXhJbnB1dEJsb2NrU2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9JTlZBTElEUEFSQU0pOwotICAgIH0KLQotICAgIHBTY3JhdGNoID0gKExWTV9JTlQxNiopcExWUFNBX0luc3QtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVlBTQV9NRU1SRUdJT05fU0NSQVRDSF0ucEJhc2VBZGRyZXNzOwotICAgIHBXcml0ZV9TYXZlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXI7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgQVBQTFkgTkVXIFNFVFRJTkdTIElGIE5FRURFRAotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgaWYgKHBMVlBTQV9JbnN0LT5iQ29udHJvbFBlbmRpbmcgPT0gTFZNX1RSVUUpCi0gICAgewotICAgICAgICBwTFZQU0FfSW5zdC0+YkNvbnRyb2xQZW5kaW5nID0gMDsKLSAgICAgICAgTFZQU0FfQXBwbHlOZXdTZXR0aW5ncyggcExWUFNBX0luc3QpOwotICAgIH0KLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICBQUk9DRVNTIFNBTVBMRVMKLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIFB1dCBzYW1wbGVzIGluIHJhbmdlIFstMC41OzAuNVsgZm9yIEJQIGZpbHRlcnMgKHNlZSBCaXF1YWRzIGRvY3VtZW50YXRpb24pICovCi0gICAgQ29weV8xNiggcExWUFNBX0lucHV0U2FtcGxlcyxwU2NyYXRjaCwoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKLSAgICBTaGlmdF9TYXRfdjE2eHYxNigtMSxwU2NyYXRjaCxwU2NyYXRjaCwoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKLQotICAgIGZvciAoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKQotICAgIHsKLSAgICAgICAgc3dpdGNoKHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uW2lpXSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSBMVlBTQV9TaW1wbGVQcmVjaXNpb25GaWx0ZXI6Ci0gICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEgICggJnBMVlBTQV9JbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIElucHV0QmxvY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICBjYXNlIExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjoKLSAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMSAgKCAmcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXNbaWldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgSW5wdXRCbG9ja1NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLQotICAgICAgICBMVlBTQV9RUERfUHJvY2VzcyAgICggcExWUFNBX0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIElucHV0QmxvY2tTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlpKTsKLSAgICB9Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgVVBEQVRFIFNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZQotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSAgICBpZihwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAhPSBwV3JpdGVfU2F2ZSkKLSAgICB7Ci0gICAgICAgIE1VTDMyeDMySU5UTzMyKChBdWRpb1RpbWUgKyAoTFZNX0lOVDMyKSgoTFZNX0lOVDMyKXBMVlBTQV9JbnN0LT5Mb2NhbFNhbXBsZXNDb3VudCoxMDAwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKUxWUFNBX1NhbXBsZVJhdGVJbnZUYWJbcExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuRnNdLAotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UaW1lSW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfRnNJbnZlcnRTaGlmdCkKLSAgICAgICAgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSA9IEF1ZGlvVGltZSArIEF1ZGlvVGltZUluYzsKLSAgICB9Ci0KLSAgICByZXR1cm4oTFZQU0FfT0spOwotfQotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfR2V0U3BlY3RydW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEdldHMgdGhlIGxldmVscyB2YWx1ZXMgYXQgYSBjZXJ0YWluIHBvaW50IGluIHRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnN0YW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgR2V0U3BlY3RydW1BdWRpb1RpbWUgUmV0cmlldmUgdGhlIHZhbHVlcyBhdCB0aGlzIHRpbWUgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBDdXJyZW50VmFsdWVzICAgICAgIFBvaW50ZXIgdG8gYSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gbGV2ZWxzJyB2YWx1ZXMgICAgICAgKi8KLS8qICBwTWF4VmFsdWVzICAgICAgICAgICBQb2ludGVyIHRvIGEgYnVmZmVyIHRoYXQgd2lsbCBjb250YWluIG1heCBsZXZlbHMnIHZhbHVlcyAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZQU0FfT0sgICAgICAgICAgICBTdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIG90aGVyd2lzZSAgICAgICAgICAgRXJyb3IgZHVlIHRvIGJhZCBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotTFZQU0FfUkVUVVJOIExWUFNBX0dldFNwZWN0cnVtICAgICAgICggcExWUFNBX0hhbmRsZV90ICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZQU0FfVGltZSAgICAgICAgICAgR2V0U3BlY3RydW1BdWRpb1RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICpwQ3VycmVudFZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgKnBQZWFrVmFsdWVzICAgICAgICAgICApCi0KLXsKLQotICAgIExWUFNBX0luc3RhbmNlUHJfdCAgICAgICpwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKLSAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBTdGF0dXNEZWx0YSwgaWk7Ci0gICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgKnBSZWFkOwotCi0gICAgaWYoaEluc3RhbmNlID09IExWTV9OVUxMIHx8IHBDdXJyZW50VmFsdWVzID09IExWTV9OVUxMIHx8IHBQZWFrVmFsdWVzID09IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgcmV0dXJuKExWUFNBX0VSUk9SX05VTExBRERSRVNTKTsKLSAgICB9Ci0KLQotICAgIC8qIEZpcnN0IGZpbmQgdGhlIHBsYWNlIHdoZXJlIHRvIGxvb2sgaW4gdGhlIHN0YXR1cyBidWZmZXIgKi8KLSAgICBpZihHZXRTcGVjdHJ1bUF1ZGlvVGltZSA8PSBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lKQotICAgIHsKLSAgICAgICAgTVVMMzJ4MzJJTlRPMzIoKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSksTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZUludixTdGF0dXNEZWx0YSxMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lU2hpZnQpOwotICAgICAgICBpZigoU3RhdHVzRGVsdGEgKiBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lKSAhPSAocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSAtIEdldFNwZWN0cnVtQXVkaW9UaW1lKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RhdHVzRGVsdGEgKz0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKiBUaGlzIHBhcnQgaGFuZGxlcyB0aGUgd3JhcCBhcm91bmQgKi8KLSAgICAgICAgTVVMMzJ4MzJJTlRPMzIoKChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIC0gKExWTV9JTlQzMilMVk1fTUlOSU5UXzMyKSArICgoTFZNX0lOVDMyKUxWTV9NQVhJTlRfMzIgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSkpLExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVJbnYsU3RhdHVzRGVsdGEsTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0KQotICAgICAgICBpZigoKExWTV9JTlQzMikoU3RhdHVzRGVsdGEgKiBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lKSkgIT0gKChMVk1fSU5UMzIpKChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIC0gKExWTV9JTlQzMilMVk1fTUlOSU5UXzMyKSArICgoTFZNX0lOVDMyKUxWTV9NQVhJTlRfMzIgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSkpKSkKLSAgICAgICAgewotICAgICAgICAgICAgU3RhdHVzRGVsdGEgKz0gMTsKLSAgICAgICAgfQotICAgIH0KLSAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBkZXNpcmVkIGxldmVsIGlzIG5vdCB0b28gIm9sZCIgKHNlZSAyLjEwIGluIExWUFNBX0Rlc2lnbk5vdGVzLmRvYykqLwotICAgIGlmKAotICAgICAgICAoKEdldFNwZWN0cnVtQXVkaW9UaW1lIDwgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkmJgotICAgICAgICAgKChHZXRTcGVjdHJ1bUF1ZGlvVGltZTwwKSYmKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWU+MCkpJiYKLSAgICAgICAgICgoKExWTV9JTlQzMikoLUdldFNwZWN0cnVtQXVkaW9UaW1lICsgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkpPkxWTV9NQVhJTlRfMzIpKXx8Ci0KLSAgICAgICAgICgoR2V0U3BlY3RydW1BdWRpb1RpbWUgPiBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lKSYmCi0gICAgICAgICAoKChHZXRTcGVjdHJ1bUF1ZGlvVGltZT49MCkmJihwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lPj0wKSl8fAotICAgICAgICAgICgoR2V0U3BlY3RydW1BdWRpb1RpbWU8PTApJiYocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZTw9MCkpfHwKLSAgICAgICAgICgoKEdldFNwZWN0cnVtQXVkaW9UaW1lPj0wKSYmKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWU8PTApKSYmCi0gICAgICAgICAoKChMVk1fSU5UMzIpKEdldFNwZWN0cnVtQXVkaW9UaW1lIC0gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkpPExWTV9NQVhJTlRfMzIpKSkpfHwKLQotICAgICAgICAoU3RhdHVzRGVsdGEgPiAoTFZNX0lOVDMyKXBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGgpIHx8Ci0gICAgICAgICghU3RhdHVzRGVsdGEpKQotICAgIHsKLSAgICAgICAgZm9yKGlpID0gMDsgaWkgPCBwTFZQU0FfSW5zdC0+bkJhbmRzOyBpaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ3VycmVudFZhbHVlc1tpaV0gID0gMDsKLSAgICAgICAgICAgIHBQZWFrVmFsdWVzW2lpXSAgICAgID0gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4oTFZQU0FfT0spOwotICAgIH0KLSAgICAvKiBTZXQgdGhlIHJlYWRpbmcgcG9pbnRlciAqLwotICAgIGlmKChMVk1fSU5UMzIpKFN0YXR1c0RlbHRhICogcExWUFNBX0luc3QtPm5CYW5kcykgPiAocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgLSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0KSkKLSAgICB7Ci0gICAgICAgIHBSZWFkID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgKyAocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCAtIChMVk1fVUlOVDMyKVN0YXR1c0RlbHRhKSAqIHBMVlBTQV9JbnN0LT5uQmFuZHM7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBSZWFkID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgIC0gU3RhdHVzRGVsdGEgKiBwTFZQU0FfSW5zdC0+bkJhbmRzOwotICAgIH0KLQotCi0gICAgLyogUmVhZCB0aGUgc3RhdHVzIGJ1ZmZlciBhbmQgZmlsbCB0aGUgb3V0cHV0IGJ1ZmZlcnMgKi8KLSAgICBmb3IoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uQmFuZHM7IGlpKyspCi0gICAgewotICAgICAgICBwQ3VycmVudFZhbHVlc1tpaV0gPSBwUmVhZFtpaV07Ci0gICAgICAgIGlmKHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0gPD0gcFJlYWRbaWldKQotICAgICAgICB7Ci0gICAgICAgICAgICBwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3NbaWldID0gcFJlYWRbaWldOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYocExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgICAgICBMVk1fSU5UMzIgdGVtcDsKLSAgICAgICAgICAgIC8qUmUtY29tcHV0ZSBtYXggdmFsdWVzIGZvciBkZWNheSAqLwotICAgICAgICAgICAgdGVtcCA9IChMVk1fSU5UMzIpKExWUFNBX01BWFVOU0lHTkVEQ0hBUiAtIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0pOwotICAgICAgICAgICAgdGVtcCA9ICgodGVtcCAqIExWUFNBX01BWExFVkVMREVDQVlGQUNUT1IpPj5MVlBTQV9NQVhMRVZFTERFQ0FZU0hJRlQpOwotICAgICAgICAgICAgLyogSWYgdGhlIGdhaW4gaGFzIG5vIGVmZmVjdCwgImhlbHAiIHRoZSB2YWx1ZSB0byBpbmNyZWFzZSAqLwotICAgICAgICAgICAgaWYodGVtcCA9PSAoTFZQU0FfTUFYVU5TSUdORURDSEFSIC0gcExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGVtcCArPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLyogU2F0dXJhdGUgKi8KLSAgICAgICAgICAgIHRlbXAgPSAodGVtcCA+IExWUFNBX01BWFVOU0lHTkVEQ0hBUikgPyBMVlBTQV9NQVhVTlNJR05FRENIQVIgOiB0ZW1wOwotICAgICAgICAgICAgLyogU3RvcmUgbmV3IG1heCBsZXZlbCAqLwotICAgICAgICAgICAgcExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXSA9ICAoTFZNX1VJTlQ4KShMVlBTQV9NQVhVTlNJR05FRENIQVIgLSB0ZW1wKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBQZWFrVmFsdWVzW2lpXSA9IHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV07Ci0gICAgfQotCi0gICAgcmV0dXJuKExWUFNBX09LKTsKLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9Qcm9jZXNzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWE4OGM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1Byb2Nlc3MuY3BwCkBAIC0wLDAgKzEsMjYwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAgICAiTFZQU0EuaCIKKyNpbmNsdWRlICAgICJMVlBTQV9Qcml2YXRlLmgiCisjaW5jbHVkZSAgICAiTFZNX01hY3Jvcy5oIgorI2luY2x1ZGUgICAgIlZlY3RvckFyaXRobWV0aWMuaCIKKworI2RlZmluZSBMVk1fTUlOSU5UXzMyICAgMHg4MDAwMDAwMAorCitzdGF0aWMgTFZNX0lOVDMyIG11bHQzMngzMmluMzJfc2hpZnRyKExWTV9JTlQzMiBhLCBMVk1fSU5UMzIgYiwgTFZNX0lOVDMyIGMpIHsKKyAgTFZNX0lOVDY0IHJlc3VsdCA9ICgoTFZNX0lOVDY0KWEgKiBiKSA+PiBjOworCisgIGlmIChyZXN1bHQgPj0gSU5UMzJfTUFYKSB7CisgICAgcmV0dXJuIElOVDMyX01BWDsKKyAgfSBlbHNlIGlmIChyZXN1bHQgPD0gSU5UMzJfTUlOKSB7CisgICAgcmV0dXJuIElOVDMyX01JTjsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gKExWTV9JTlQzMilyZXN1bHQ7CisgIH0KK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIHByb2Nlc3MgYXBwbGllcyBiYW5kIHBhc3MgZmlsdGVycyB0byB0aGUgc2lnbmFsLiBFYWNoIG91dHB1dCAgICAgICAgICAgICAgICAqLworLyogIGZlZWRzIGEgcXVhc2kgcGVhayBmaWx0ZXIgZm9yIGxldmVsIGRldGVjdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwTFZQU0FfSW5wdXRTYW1wbGVzIFBvaW50ZXIgdG8gdGhlIGlucHV0IHNhbXBsZXMgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5wdXRCbG9ja1NpemUgICAgICBOdW1iZXIgb2YgbW9ubyBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEF1ZGlvVGltZSAgICAgICAgICAgUGxheWJhY2sgdGltZSBvZiB0aGUgaW5wdXQgc2FtcGxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfUHJvY2VzcyAgICAgICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICpwTFZQU0FfSW5wdXRTYW1wbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9UaW1lICAgICAgICAgICBBdWRpb1RpbWUgICAgICAgICAgICApCisKK3sKKyAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7CisgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgaWk7CisgICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgQXVkaW9UaW1lSW5jOworICAgIGV4dGVybiBMVk1fVUlOVDMyICAgICAgIExWUFNBX1NhbXBsZVJhdGVJbnZUYWJbXTsKKyAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAqcFdyaXRlX1NhdmU7ICAgICAgICAgLyogUG9zaXRpb24gb2YgdGhlIHdyaXRlIHBvaW50ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgcHJvY2VzcyAgKi8KKworICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICBDSEVDSyBQQVJBTUVURVJTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICBpZihoSW5zdGFuY2UgPT0gTFZNX05VTEwgfHwgcExWUFNBX0lucHV0U2FtcGxlcyA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgIHJldHVybihMVlBTQV9FUlJPUl9OVUxMQUREUkVTUyk7CisgICAgfQorICAgIGlmKElucHV0QmxvY2tTaXplID09IDAgfHwgSW5wdXRCbG9ja1NpemUgPiBwTFZQU0FfSW5zdC0+TWF4SW5wdXRCbG9ja1NpemUpCisgICAgeworICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfSU5WQUxJRFBBUkFNKTsKKyAgICB9CisKKyAgICBwU2NyYXRjaCA9IChMVk1fRkxPQVQqKXBMVlBTQV9JbnN0LT5NZW1vcnlUYWJsZS5SZWdpb25bTFZQU0FfTUVNUkVHSU9OX1NDUkFUQ0hdLnBCYXNlQWRkcmVzczsKKyAgICBwV3JpdGVfU2F2ZSA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyOworCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIEFQUExZIE5FVyBTRVRUSU5HUyBJRiBORUVERUQKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIGlmIChwTFZQU0FfSW5zdC0+YkNvbnRyb2xQZW5kaW5nID09IExWTV9UUlVFKQorICAgIHsKKyAgICAgICAgcExWUFNBX0luc3QtPmJDb250cm9sUGVuZGluZyA9IDA7CisgICAgICAgIExWUFNBX0FwcGx5TmV3U2V0dGluZ3MoIHBMVlBTQV9JbnN0KTsKKyAgICB9CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgUFJPQ0VTUyBTQU1QTEVTCisgICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgICAvKiBQdXQgc2FtcGxlcyBpbiByYW5nZSBbLTAuNTswLjVbIGZvciBCUCBmaWx0ZXJzIChzZWUgQmlxdWFkcyBkb2N1bWVudGF0aW9uKSAqLworICAgIENvcHlfRmxvYXQocExWUFNBX0lucHV0U2FtcGxlcywgcFNjcmF0Y2gsIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUpOworICAgIFNoaWZ0X1NhdF9GbG9hdCgtMSwgcFNjcmF0Y2gsIHBTY3JhdGNoLCAoTFZNX0lOVDE2KUlucHV0QmxvY2tTaXplKTsKKworICAgIGZvciAoaWkgPSAwOyBpaSA8IHBMVlBTQV9JbnN0LT5uUmVsZXZhbnRGaWx0ZXJzOyBpaSsrKQorICAgIHsKKyAgICAgICAgc3dpdGNoKHBMVlBTQV9JbnN0LT5wQlBGaWx0ZXJzUHJlY2lzaW9uW2lpXSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSBMVlBTQV9TaW1wbGVQcmVjaXNpb25GaWx0ZXI6CisgICAgICAgICAgICAgICAgQlBfMUlfRDE2RjE2QzE0X1RSQ19XUkFfMDEgICggJnBMVlBTQV9JbnN0LT5wQlBfSW5zdGFuY2VzW2lpXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIElucHV0QmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIExWUFNBX0RvdWJsZVByZWNpc2lvbkZpbHRlcjoKKyAgICAgICAgICAgICAgICBCUF8xSV9EMTZGMzJDMzBfVFJDX1dSQV8wMSAgKCAmcExWUFNBX0luc3QtPnBCUF9JbnN0YW5jZXNbaWldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilJbnB1dEJsb2NrU2l6ZSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgTFZQU0FfUVBEX1Byb2Nlc3NfRmxvYXQgICAoIHBMVlBTQV9JbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2ggKyBJbnB1dEJsb2NrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpSW5wdXRCbG9ja1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpaSk7CisgICAgfQorCisgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgICAgIFVQREFURSBTcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUKKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgICAgaWYocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgIT0gcFdyaXRlX1NhdmUpCisgICAgeworICAgICAgICBBdWRpb1RpbWVJbmMgPSBtdWx0MzJ4MzJpbjMyX3NoaWZ0cigKKyAgICAgICAgICAgICAgICAoQXVkaW9UaW1lICsgKChMVk1fSU5UMzIpcExWUFNBX0luc3QtPkxvY2FsU2FtcGxlc0NvdW50ICogMTAwMCkpLAorICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpTFZQU0FfU2FtcGxlUmF0ZUludlRhYltwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5Gc10sCisgICAgICAgICAgICAgICAgTFZQU0FfRnNJbnZlcnRTaGlmdCk7CisgICAgICAgIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUgPSBBdWRpb1RpbWUgKyBBdWRpb1RpbWVJbmM7CisgICAgfQorCisgICAgcmV0dXJuKExWUFNBX09LKTsKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9HZXRTcGVjdHJ1bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgR2V0cyB0aGUgbGV2ZWxzIHZhbHVlcyBhdCBhIGNlcnRhaW4gcG9pbnQgaW4gdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBHZXRTcGVjdHJ1bUF1ZGlvVGltZSBSZXRyaWV2ZSB0aGUgdmFsdWVzIGF0IHRoaXMgdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEN1cnJlbnRWYWx1ZXMgICAgICAgUG9pbnRlciB0byBhIGJ1ZmZlciB0aGF0IHdpbGwgY29udGFpbiBsZXZlbHMnIHZhbHVlcyAgICAgICAqLworLyogIHBNYXhWYWx1ZXMgICAgICAgICAgIFBvaW50ZXIgdG8gYSBidWZmZXIgdGhhdCB3aWxsIGNvbnRhaW4gbWF4IGxldmVscycgdmFsdWVzICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVlBTQV9PSyAgICAgICAgICAgIFN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgb3RoZXJ3aXNlICAgICAgICAgICBFcnJvciBkdWUgdG8gYmFkIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVlBTQV9SRVRVUk4gTFZQU0FfR2V0U3BlY3RydW0gICAgICAgKCBwTFZQU0FfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVlBTQV9UaW1lICAgICAgICAgICBHZXRTcGVjdHJ1bUF1ZGlvVGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgKnBDdXJyZW50VmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAqcFBlYWtWYWx1ZXMgICAgICAgICAgICkKKworeworCisgICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgKnBMVlBTQV9JbnN0ID0gKExWUFNBX0luc3RhbmNlUHJfdCopaEluc3RhbmNlOworICAgIExWTV9JTlQzMiAgICAgICAgICAgICAgIFN0YXR1c0RlbHRhLCBpaTsKKyAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAqcFJlYWQ7CisKKyAgICBpZihoSW5zdGFuY2UgPT0gTFZNX05VTEwgfHwgcEN1cnJlbnRWYWx1ZXMgPT0gTFZNX05VTEwgfHwgcFBlYWtWYWx1ZXMgPT0gTFZNX05VTEwpCisgICAgeworICAgICAgICByZXR1cm4oTFZQU0FfRVJST1JfTlVMTEFERFJFU1MpOworICAgIH0KKworICAgIC8qIEZpcnN0IGZpbmQgdGhlIHBsYWNlIHdoZXJlIHRvIGxvb2sgaW4gdGhlIHN0YXR1cyBidWZmZXIgKi8KKyAgICBpZihHZXRTcGVjdHJ1bUF1ZGlvVGltZSA8PSBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lKQorICAgIHsKKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIoKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWUgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSksTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZUludixTdGF0dXNEZWx0YSxMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lU2hpZnQpOworICAgICAgICBpZigoU3RhdHVzRGVsdGEgKiBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lKSAhPSAocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSAtIEdldFNwZWN0cnVtQXVkaW9UaW1lKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RhdHVzRGVsdGEgKz0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBUaGlzIHBhcnQgaGFuZGxlcyB0aGUgd3JhcCBhcm91bmQgKi8KKyAgICAgICAgTVVMMzJ4MzJJTlRPMzIoKChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIC0gKExWTV9JTlQzMilMVk1fTUlOSU5UXzMyKSArICgoTFZNX0lOVDMyKUxWTV9NQVhJTlRfMzIgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSkpLExWUFNBX0ludGVybmFsUmVmcmVzaFRpbWVJbnYsU3RhdHVzRGVsdGEsTFZQU0FfSW50ZXJuYWxSZWZyZXNoVGltZVNoaWZ0KQorICAgICAgICBpZigoKExWTV9JTlQzMikoU3RhdHVzRGVsdGEgKiBMVlBTQV9JbnRlcm5hbFJlZnJlc2hUaW1lKSkgIT0gKChMVk1fSU5UMzIpKChwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lIC0gKExWTV9JTlQzMilMVk1fTUlOSU5UXzMyKSArICgoTFZNX0lOVDMyKUxWTV9NQVhJTlRfMzIgLSBHZXRTcGVjdHJ1bUF1ZGlvVGltZSkpKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RhdHVzRGVsdGEgKz0gMTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvKiBDaGVjayB3aGV0aGVyIHRoZSBkZXNpcmVkIGxldmVsIGlzIG5vdCB0b28gIm9sZCIgKHNlZSAyLjEwIGluIExWUFNBX0Rlc2lnbk5vdGVzLmRvYykqLworICAgIGlmKAorICAgICAgICAoKEdldFNwZWN0cnVtQXVkaW9UaW1lIDwgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkmJgorICAgICAgICAgKChHZXRTcGVjdHJ1bUF1ZGlvVGltZTwwKSYmKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWU+MCkpJiYKKyAgICAgICAgICgoKExWTV9JTlQzMikoLUdldFNwZWN0cnVtQXVkaW9UaW1lICsgcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkpPkxWTV9NQVhJTlRfMzIpKXx8CisKKyAgICAgICAgICgoR2V0U3BlY3RydW1BdWRpb1RpbWUgPiBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lKSYmCisgICAgICAgICAoKChHZXRTcGVjdHJ1bUF1ZGlvVGltZT49MCkmJihwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyQXVkaW9UaW1lPj0wKSl8fAorICAgICAgICAgICgoR2V0U3BlY3RydW1BdWRpb1RpbWU8PTApJiYocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZTw9MCkpfHwKKyAgICAgICAgICgoKEdldFNwZWN0cnVtQXVkaW9UaW1lPj0wKSYmKHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJBdWRpb1RpbWU8PTApKSYmCisgICAgICAgICAoKChMVk1fSU5UMzIpKEdldFNwZWN0cnVtQXVkaW9UaW1lIC0gcExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckF1ZGlvVGltZSkpPExWTV9NQVhJTlRfMzIpKSkpfHwKKworICAgICAgICAoU3RhdHVzRGVsdGEgPiAoTFZNX0lOVDMyKXBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGgpIHx8CisgICAgICAgICghU3RhdHVzRGVsdGEpKQorICAgIHsKKyAgICAgICAgZm9yKGlpID0gMDsgaWkgPCBwTFZQU0FfSW5zdC0+bkJhbmRzOyBpaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBwQ3VycmVudFZhbHVlc1tpaV0gID0gMDsKKyAgICAgICAgICAgIHBQZWFrVmFsdWVzW2lpXSAgICAgID0gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4oTFZQU0FfT0spOworICAgIH0KKyAgICAvKiBTZXQgdGhlIHJlYWRpbmcgcG9pbnRlciAqLworICAgIGlmKChMVk1fSU5UMzIpKFN0YXR1c0RlbHRhICogcExWUFNBX0luc3QtPm5CYW5kcykgPiAocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgLSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0KSkKKyAgICB7CisgICAgICAgIHBSZWFkID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgKyAocExWUFNBX0luc3QtPlNwZWN0cmFsRGF0YUJ1ZmZlckxlbmd0aCAtIChMVk1fVUlOVDMyKVN0YXR1c0RlbHRhKSAqIHBMVlBTQV9JbnN0LT5uQmFuZHM7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIHBSZWFkID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgIC0gU3RhdHVzRGVsdGEgKiBwTFZQU0FfSW5zdC0+bkJhbmRzOworICAgIH0KKworICAgIC8qIFJlYWQgdGhlIHN0YXR1cyBidWZmZXIgYW5kIGZpbGwgdGhlIG91dHB1dCBidWZmZXJzICovCisgICAgZm9yKGlpID0gMDsgaWkgPCBwTFZQU0FfSW5zdC0+bkJhbmRzOyBpaSsrKQorICAgIHsKKyAgICAgICAgcEN1cnJlbnRWYWx1ZXNbaWldID0gcFJlYWRbaWldOworICAgICAgICBpZihwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3NbaWldIDw9IHBSZWFkW2lpXSkKKyAgICAgICAgeworICAgICAgICAgICAgcExWUFNBX0luc3QtPnBQcmV2aW91c1BlYWtzW2lpXSA9IHBSZWFkW2lpXTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0gIT0gMCkKKyAgICAgICAgeworICAgICAgICAgICAgTFZNX0lOVDMyIHRlbXA7CisgICAgICAgICAgICAvKlJlLWNvbXB1dGUgbWF4IHZhbHVlcyBmb3IgZGVjYXkgKi8KKyAgICAgICAgICAgIHRlbXAgPSAoTFZNX0lOVDMyKShMVlBTQV9NQVhVTlNJR05FRENIQVIgLSBwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3NbaWldKTsKKyAgICAgICAgICAgIHRlbXAgPSAoKHRlbXAgKiBMVlBTQV9NQVhMRVZFTERFQ0FZRkFDVE9SKT4+TFZQU0FfTUFYTEVWRUxERUNBWVNISUZUKTsKKyAgICAgICAgICAgIC8qIElmIHRoZSBnYWluIGhhcyBubyBlZmZlY3QsICJoZWxwIiB0aGUgdmFsdWUgdG8gaW5jcmVhc2UgKi8KKyAgICAgICAgICAgIGlmKHRlbXAgPT0gKExWUFNBX01BWFVOU0lHTkVEQ0hBUiAtIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0pKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHRlbXAgKz0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8qIFNhdHVyYXRlICovCisgICAgICAgICAgICB0ZW1wID0gKHRlbXAgPiBMVlBTQV9NQVhVTlNJR05FRENIQVIpID8gTFZQU0FfTUFYVU5TSUdORURDSEFSIDogdGVtcDsKKyAgICAgICAgICAgIC8qIFN0b3JlIG5ldyBtYXggbGV2ZWwgKi8KKyAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5wUHJldmlvdXNQZWFrc1tpaV0gPSAgKExWTV9VSU5UOCkoTFZQU0FfTUFYVU5TSUdORURDSEFSIC0gdGVtcCk7CisgICAgICAgIH0KKworICAgICAgICBwUGVha1ZhbHVlc1tpaV0gPSBwTFZQU0FfSW5zdC0+cFByZXZpb3VzUGVha3NbaWldOworICAgIH0KKworICAgIHJldHVybihMVlBTQV9PSyk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBELmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBELmgKaW5kZXggOTlkODQ0Yi4uNjA5YTQ4NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRC5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUEQuaApAQCAtMjAsMjUgKzIwLDE4IEBACiAKICNpbmNsdWRlICJMVk1fVHlwZXMuaCIKIAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KIHR5cGVkZWYgc3RydWN0CiB7CiAgIExWTV9JTlQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERlbGF5OyAgICAgICAgLyogcG9pbnRlciB0byB0aGUgZGVsYXllZCBzYW1wbGVzIChkYXRhIG9mIDMyIGJpdHMpICAgKi8KICAgTFZNX0lOVDMyICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZWZzWzJdOyAgICAgICAvKiBwb2ludGVyIHRvIHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzICovCiB9UVBEX1N0YXRlX3QsICpwUVBEX1N0YXRlX3Q7CiAKLSNpZmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICAvKiBwb2ludGVyIHRvIHRoZSBkZWxheWVkIHNhbXBsZXMgKGRhdGEgb2YgMzIgYml0cykgICAqLwogICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcERlbGF5OwogICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2Vmc1syXTsgICAgICAgLyogcG9pbnRlciB0byB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyAqLwogfVFQRF9GTE9BVF9TdGF0ZV90LCAqcFFQRF9GTE9BVF9TdGF0ZV90OwotI2VuZGlmCiAKIHR5cGVkZWYgc3RydWN0CiB7CkBAIC00NywxNSArNDAsMTIgQEAKIAogfSBRUERfQzMyX0NvZWZzLCAqUFFQRF9DMzJfQ29lZnM7CiAKLSNpZmRlZiBCVUlMRF9GTE9BVAogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVk1fRkxPQVQgS1A7ICAgIC8qc2hvdWxkIHN0b3JlIGEwKi8KICAgICBMVk1fRkxPQVQgS007ICAgIC8qc2hvdWxkIHN0b3JlIGIyKi8KIAogfSBRUERfRkxPQVRfQ29lZnMsICpQUVBEX0ZMT0FUX0NvZWZzOwotI2VuZGlmCi0KIAogdHlwZWRlZiBzdHJ1Y3QKIHsKQEAgLTYzLDE0ICs1MywxMiBAQAogCiB9IFFQRF9UYXBzX3QsICpwUVBEX1RhcHNfdDsKIAotI2lmZGVmIEJVSUxEX0ZMT0FUCiB0eXBlZGVmIHN0cnVjdAogewogICAgIExWTV9GTE9BVCBTdG9yYWdlWzFdOwogCiB9IFFQRF9GTE9BVF9UYXBzX3QsICpwUVBEX0ZMT0FUX1RhcHNfdDsKIAotI2VuZGlmCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1FQRF9Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC04OSwxMiArNzcsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBCYW5kSW5kZXgpOwogCi0jaWZkZWYgQlVJTERfRkxPQVQKIHZvaWQgTFZQU0FfUVBEX1Byb2Nlc3NfRmxvYXQgKCAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJblNhbXBzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCk7Ci0jZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTExMywxNSArOTksMTAgQEAKIHZvaWQgTFZQU0FfUVBEX0luaXQgKCAgIFFQRF9TdGF0ZV90ICAgICAgICpwSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICBRUERfVGFwc190ICAgICAgICAqcFRhcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICBRUERfQzMyX0NvZWZzICAgICAqcENvZWYgICAgICk7Ci0jaWZkZWYgQlVJTERfRkxPQVQKIAogdm9pZCBMVlBTQV9RUERfSW5pdF9GbG9hdCAoICAgUVBEX0ZMT0FUX1N0YXRlX3QgICAgICAgKnBJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9GTE9BVF9UYXBzX3QgICAgICAgICpwVGFwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFFQRF9GTE9BVF9Db2VmcyAgICAgICAgICpwQ29lZiAgICAgKTsKLSNlbmRpZgotI2lmZGVmIF9fY3BsdXNwbHVzCi19Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KIAogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Jbml0LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYzMyYWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1FQRF9Jbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiTFZQU0FfUVBELmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluaXRpYWxpemUgYSBxdWFzaSBwZWFrIGZpbHRlciBpbnN0YW5jZS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBRUERfU3RhdGUgICAgICAgICAgUG9pbnRlciB0byB0aGUgZmlsdGVyIHN0YXRlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgcFRhcHMgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXIncyB0YXBzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgIHBDb2VmICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZmlsdGVyJ3MgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLXZvaWQgTFZQU0FfUVBEX0luaXQgKCAgIHBRUERfU3RhdGVfdCAgICAgICBwUVBEX1N0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgUVBEX1RhcHNfdCAgICAgICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgUVBEX0MzMl9Db2VmcyAgICAgKnBDb2VmICAgICApCi17Ci0gICAgcFFQRF9TdGF0ZS0+cERlbGF5ICA9IHBUYXBzLT5TdG9yYWdlOwotICAgIHBRUERfU3RhdGUtPkNvZWZzWzBdICA9IHBDb2VmLT5LUDsKLSAgICBwUVBEX1N0YXRlLT5Db2Vmc1sxXSAgPSBwQ29lZi0+S007Ci19Ci0KLSNpZmRlZiBCVUlMRF9GTE9BVAotdm9pZCBMVlBTQV9RUERfSW5pdF9GbG9hdCAoICAgcFFQRF9GTE9BVF9TdGF0ZV90ICAgICAgIHBRUERfU3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUERfRkxPQVRfVGFwc190ICAgICAgICAgKnBUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVBEX0ZMT0FUX0NvZWZzICAgICAgICAgICpwQ29lZiAgICAgKQotewotICAgIHBRUERfU3RhdGUtPnBEZWxheSAgPSBwVGFwcy0+U3RvcmFnZTsKLSAgICBwUVBEX1N0YXRlLT5Db2Vmc1swXSAgPSAoKExWTV9GTE9BVClwQ29lZi0+S1ApOwotICAgIHBRUERfU3RhdGUtPkNvZWZzWzFdICA9ICgoTFZNX0ZMT0FUKXBDb2VmLT5LTSk7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfSW5pdC5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX0luaXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYmY2OTQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX0luaXQuY3BwCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJMVlBTQV9RUEQuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICBMVlBTQV9RUERfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5pdGlhbGl6ZSBhIHF1YXNpIHBlYWsgZmlsdGVyIGluc3RhbmNlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFFQRF9TdGF0ZSAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXIgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICBwVGFwcyAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGZpbHRlcidzIHRhcHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgcENvZWYgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBmaWx0ZXIncyBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVlBTQV9RUERfSW5pdCAoICAgcFFQRF9TdGF0ZV90ICAgICAgIHBRUERfU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICBRUERfVGFwc190ICAgICAgICAqcFRhcHMsCisgICAgICAgICAgICAgICAgICAgICAgICBRUERfQzMyX0NvZWZzICAgICAqcENvZWYgICAgICkKK3sKKyAgICBwUVBEX1N0YXRlLT5wRGVsYXkgID0gcFRhcHMtPlN0b3JhZ2U7CisgICAgcFFQRF9TdGF0ZS0+Q29lZnNbMF0gID0gcENvZWYtPktQOworICAgIHBRUERfU3RhdGUtPkNvZWZzWzFdICA9IHBDb2VmLT5LTTsKK30KKwordm9pZCBMVlBTQV9RUERfSW5pdF9GbG9hdCAoICAgcFFQRF9GTE9BVF9TdGF0ZV90ICAgICAgIHBRUERfU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBRUERfRkxPQVRfVGFwc190ICAgICAgICAgKnBUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUVBEX0ZMT0FUX0NvZWZzICAgICAgICAgICpwQ29lZiAgICAgKQoreworICAgIHBRUERfU3RhdGUtPnBEZWxheSAgPSBwVGFwcy0+U3RvcmFnZTsKKyAgICBwUVBEX1N0YXRlLT5Db2Vmc1swXSAgPSAoKExWTV9GTE9BVClwQ29lZi0+S1ApOworICAgIHBRUERfU3RhdGUtPkNvZWZzWzFdICA9ICgoTFZNX0ZMT0FUKXBDb2VmLT5LTSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX1Byb2Nlc3MuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjMzMTcyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJMVlBTQV9RUEQuaCIKLSNpbmNsdWRlICJMVlBTQV9Qcml2YXRlLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX1dyaXRlUGVhayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdyaXRlIGEgbGV2ZWwgdmFsdWUgaW4gdGhlIGJ1ZmZlciBpbiB0aGUgY29ycmVzcG9uZGluZyBiYW5kLiAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBJbnN0ICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgTFZQU0EgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwcFdyaXRlICAgICAgICAgICAgIFBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ2FsbE51bWJlciAgICAgICAgICBOdW1iZXIgb2YgdGhlIGJhbmQgdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuIGluICAgICAgICAgICAqLwotLyogIFZhbHVlICAgICAgICAgICAgICAgVmFsdWUgdG8gd3JpdGUgaW4gdGhlIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWUFNBX1FQRF9Xcml0ZVBlYWsoICAgcExWUFNBX0luc3RhbmNlUHJfdCAgICAgICBwTFZQU0FfSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAgICoqcHBXcml0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgIEJhbmRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgIFZhbHVlICAgKTsKLQotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWUFNBX1FQRF9Xcml0ZVBlYWtfRmxvYXQoICAgcExWUFNBX0luc3RhbmNlUHJfdCAgICAgICBwTFZQU0FfSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgKipwcFdyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJhbmRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBWYWx1ZSAgICk7Ci0jZW5kaWYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEFwcGx5IGRvd25zYW1wbGluZywgcG9zdCBnYWluLCBxdWFzaSBwZWFrIGZpbHRlcmluZyBhbmQgd3JpdGUgdGhlIGxldmVscyB2YWx1ZXMgKi8KLS8qICBpbiB0aGUgYnVmZmVyIGV2ZXJ5IDIwIG1zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWUFNBX1FQRF9Qcm9jZXNzICggICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW5TYW1wcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBCYW5kSW5kZXgpCi17Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgUEFSQU1FVEVSUwotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcExWUFNBX0luc3QgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7Ci0gICAgUVBEX1N0YXRlX3QgKnBRUERTdGF0ZSA9ICAoUVBEX1N0YXRlX3QqKSZwTFZQU0FfSW5zdC0+cFFQRF9TdGF0ZXNbQmFuZEluZGV4XTsKLQotICAgIC8qIFBvaW50ZXIgdG8gdGFwcyAqLwotICAgIExWTV9JTlQzMiogcERlbGF5ICA9IHBRUERTdGF0ZS0+cERlbGF5OwotCi0gICAgLyogUGFyYW1ldGVycyBuZWVkZWQgZHVyaW5nIHF1YXNpIHBlYWsgY2FsY3VsYXRpb25zICovCi0gICAgTFZNX0lOVDMyICAgWDA7Ci0gICAgTFZNX0lOVDMyICAgdGVtcCx0ZW1wMjsKLSAgICBMVk1fSU5UMzIgICBhY2N1OwotICAgIExWTV9JTlQxNiAgIFhnMDsKLSAgICBMVk1fSU5UMTYgICBEMDsKLSAgICBMVk1fSU5UMTYgICBWMCA9IChMVk1fSU5UMTYpKCpwRGVsYXkpOwotCi0gICAgLyogRmlsdGVyJ3MgY29lZiAqLwotICAgIExWTV9JTlQzMiAgIEtwID0gcFFQRFN0YXRlLT5Db2Vmc1swXTsKLSAgICBMVk1fSU5UMzIgICBLbSA9IHBRUERTdGF0ZS0+Q29lZnNbMV07Ci0KLSAgICBMVk1fSU5UMTYgICBpaSA9IG51bVNhbXBsZXM7Ci0KLSAgICBMVk1fVUlOVDggICpwV3JpdGUgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlcjsKLSAgICBMVk1fSU5UMzIgICBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQgPSBwTFZQU0FfSW5zdC0+QnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50OwotICAgIExWTV9VSU5UMTYgIERvd25TYW1wbGluZ0ZhY3RvciA9IHBMVlBTQV9JbnN0LT5Eb3duU2FtcGxpbmdGYWN0b3I7Ci0KLSAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCi0gICAgICAgSU5JVElBTElaQVRJT04KLSAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotICAgIC8qIENvcnJlY3QgdGhlIHBvaW50ZXIgdG8gdGFrZSB0aGUgZmlyc3QgZG93biBzYW1wbGVkIHNpZ25hbCBzYW1wbGUgKi8KLSAgICBwSW5TYW1wcyArPSBwTFZQU0FfSW5zdC0+RG93blNhbXBsaW5nQ291bnQ7Ci0gICAgLyogQ29ycmVjdCBhbHNvIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyAqLwotICAgIGlpID0gKExWTV9JTlQxNikoaWkgLSAoTFZNX0lOVDE2KXBMVlBTQV9JbnN0LT5Eb3duU2FtcGxpbmdDb3VudCk7Ci0KLSAgICB3aGlsZSAoaWkgPiAwKQotICAgIHsKLSAgICAgICAgLyogQXBwbHkgcG9zdCBnYWluICovCi0gICAgICAgIFgwID0gKCgqcEluU2FtcHMpICogcExWUFNBX0luc3QtPnBQb3N0R2FpbnNbQmFuZEluZGV4XSkgPj4gKExWUFNBX0dBSU5TSElGVC0xKTsgLyogLSAxIHRvIGNvbXBlbnNhdGUgc2NhbGluZyBpbiBwcm9jZXNzIGZ1bmN0aW9uKi8KLSAgICAgICAgcEluU2FtcHMgPSBwSW5TYW1wcyArIERvd25TYW1wbGluZ0ZhY3RvcjsKLQotICAgICAgICAvKiBTYXR1cmF0ZSBhbmQgdGFrZSBhYnNvbHV0ZSB2YWx1ZSAqLwotICAgICAgICBpZihYMCA8IDApCi0gICAgICAgICAgICBYMCA9IC1YMDsKLSAgICAgICAgaWYgKFgwID4gMHg3RkZGKQotICAgICAgICAgICAgWGcwID0gMHg3RkZGOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBYZzAgPSAoTFZNX0lOVDE2KShYMCk7Ci0KLQotICAgICAgICAvKiBRdWFzaSBwZWFrIGZpbHRlciBjYWxjdWxhdGlvbiAqLwotICAgICAgICBEMCAgPSAoTFZNX0lOVDE2KShYZzAgLSBWMCk7Ci0KLSAgICAgICAgdGVtcDIgPSAoTFZNX0lOVDMyKUQwOwotICAgICAgICBNVUwzMngzMklOVE8zMih0ZW1wMixLcCxhY2N1LDMxKTsKLQotICAgICAgICBEMCAgICA9IChMVk1fSU5UMTYpKEQwPj4xKTsKLSAgICAgICAgaWYgKEQwIDwgMCl7Ci0gICAgICAgICAgICBEMCA9IChMVk1fSU5UMTYpKC1EMCk7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZW1wMiA9IChMVk1fSU5UMzIpRDA7Ci0gICAgICAgIE1VTDMyeDMySU5UTzMyKChMVk1fSU5UMzIpRDAsS20sdGVtcCwzMSk7Ci0gICAgICAgIGFjY3UgKz10ZW1wICsgWGcwOwotCi0gICAgICAgIGlmIChhY2N1ID4gMHg3RkZGKQotICAgICAgICAgICAgYWNjdSA9IDB4N0ZGRjsKLSAgICAgICAgZWxzZSBpZihhY2N1IDwgMCkKLSAgICAgICAgICAgIGFjY3UgPSAweDAwMDA7Ci0KLSAgICAgICAgVjAgPSAoTFZNX0lOVDE2KWFjY3U7Ci0KLSAgICAgICAgaWYoKChwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgLSBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQpIDwgRG93blNhbXBsaW5nRmFjdG9yKSkKLSAgICAgICAgewotICAgICAgICAgICAgTFZQU0FfUVBEX1dyaXRlUGVhayggcExWUFNBX0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwV3JpdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYW5kSW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMCk7Ci0gICAgICAgICAgICBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQgLT0gcExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlOwotICAgICAgICAgICAgcExWUFNBX0luc3QtPkxvY2FsU2FtcGxlc0NvdW50ID0gKExWTV9VSU5UMTYpKG51bVNhbXBsZXMgLSBpaSk7Ci0gICAgICAgIH0KLSAgICAgICAgQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50Kz1Eb3duU2FtcGxpbmdGYWN0b3I7Ci0KLSAgICAgICAgaWkgPSAoTFZNX0lOVDE2KShpaS1Eb3duU2FtcGxpbmdGYWN0b3IpOwotCi0gICAgfQotCi0gICAgLyogU3RvcmUgbGFzdCB0YXBzIGluIG1lbW9yeSAqLwotICAgICpwRGVsYXkgPSAoTFZNX0lOVDMyKShWMCk7Ci0KLSAgICAvKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGNhbGwgdG8gdGhlIGZ1bmN0aW9uIGFmdGVyIGxhc3QgYmFuZCBwcm9jZXNzaW5nLAotICAgICAgIHVwZGF0ZSB0aGUgcGFyYW1ldGVycy4gKi8KLSAgICBpZihCYW5kSW5kZXggPT0gKHBMVlBTQV9JbnN0LT5uUmVsZXZhbnRGaWx0ZXJzLTEpKQotICAgIHsKLSAgICAgICAgcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgPSBwV3JpdGU7Ci0gICAgICAgIC8qIEFkanVzdG1lbnQgZm9yIDExMDI1SHogaW5wdXQsIDIyMCw1IGlzIG5vcm1hbGx5Ci0gICAgICAgICAgIHRoZSBleGFjdCBudW1iZXIgb2Ygc2FtcGxlcyBmb3IgMjBtcy4qLwotICAgICAgICBpZigocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgIT0gcFdyaXRlKSYmKHBMVlBTQV9JbnN0LT5DdXJyZW50UGFyYW1zLkZzID09IExWTV9GU18xMTAyNSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmKHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSA9PSAyMjApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID0gMjIxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSA9IDIyMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciA9IHBXcml0ZTsKLSAgICAgICAgcExWUFNBX0luc3QtPkJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCA9IEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudDsKLSAgICAgICAgcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0NvdW50ID0gKExWTV9VSU5UMTYpKC1paSk7Ci0gICAgfQotfQotI2Vsc2UKLXZvaWQgTFZQU0FfUVBEX1Byb2Nlc3NfRmxvYXQgKCAgICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgICAgKnBJblNhbXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhbmRJbmRleCkKLXsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICBQQVJBTUVURVJTCi0gICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICBMVlBTQV9JbnN0YW5jZVByX3QgICAgICpwTFZQU0FfSW5zdCA9IChMVlBTQV9JbnN0YW5jZVByX3QqKWhJbnN0YW5jZTsKLSAgICBRUERfRkxPQVRfU3RhdGVfdCAqcFFQRFN0YXRlID0gIChRUERfRkxPQVRfU3RhdGVfdCopJnBMVlBTQV9JbnN0LT5wUVBEX1N0YXRlc1tCYW5kSW5kZXhdOwotCi0gICAgLyogUG9pbnRlciB0byB0YXBzICovCi0gICAgTFZNX0ZMT0FUKiBwRGVsYXkgID0gcFFQRFN0YXRlLT5wRGVsYXk7Ci0KLSAgICAvKiBQYXJhbWV0ZXJzIG5lZWRlZCBkdXJpbmcgcXVhc2kgcGVhayBjYWxjdWxhdGlvbnMgKi8KLSAgICBMVk1fRkxPQVQgICBYMDsKLSAgICBMVk1fRkxPQVQgICB0ZW1wLHRlbXAyOwotICAgIExWTV9GTE9BVCAgIGFjY3U7Ci0gICAgTFZNX0ZMT0FUICAgWGcwOwotICAgIExWTV9GTE9BVCAgIEQwOwotICAgIExWTV9GTE9BVCAgIFYwID0gKExWTV9GTE9BVCkoKnBEZWxheSk7Ci0KLSAgICAvKiBGaWx0ZXIncyBjb2VmICovCi0gICAgTFZNX0ZMT0FUICAgS3AgPSAoKExWTV9GTE9BVCkocFFQRFN0YXRlLT5Db2Vmc1swXSkpOwotICAgIExWTV9GTE9BVCAgIEttID0gKChMVk1fRkxPQVQpKHBRUERTdGF0ZS0+Q29lZnNbMV0pKTsKLQotICAgIExWTV9JTlQxNiAgIGlpID0gbnVtU2FtcGxlczsKLQotICAgIExWTV9VSU5UOCAgKnBXcml0ZSA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyOwotICAgIExWTV9JTlQzMiAgIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCA9IHBMVlBTQV9JbnN0LT5CdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQ7Ci0gICAgTFZNX1VJTlQxNiAgRG93blNhbXBsaW5nRmFjdG9yID0gcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0ZhY3RvcjsKLQotICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICAgICBJTklUSUFMSVpBVElPTgotICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgLyogQ29ycmVjdCB0aGUgcG9pbnRlciB0byB0YWtlIHRoZSBmaXJzdCBkb3duIHNhbXBsZWQgc2lnbmFsIHNhbXBsZSAqLwotICAgIHBJblNhbXBzICs9IHBMVlBTQV9JbnN0LT5Eb3duU2FtcGxpbmdDb3VudDsKLSAgICAvKiBDb3JyZWN0IGFsc28gdGhlIG51bWJlciBvZiBzYW1wbGVzICovCi0gICAgaWkgPSAoTFZNX0lOVDE2KShpaSAtIChMVk1fSU5UMTYpcExWUFNBX0luc3QtPkRvd25TYW1wbGluZ0NvdW50KTsKLQotICAgIHdoaWxlIChpaSA+IDApCi0gICAgewotICAgICAgICAvKiBBcHBseSBwb3N0IGdhaW4gKi8KLSAgICAgICAgLyogLSAxIHRvIGNvbXBlbnNhdGUgc2NhbGluZyBpbiBwcm9jZXNzIGZ1bmN0aW9uKi8KLSAgICAgICAgWDAgPSAoKnBJblNhbXBzKSAqIHBMVlBTQV9JbnN0LT5wUG9zdEdhaW5zW0JhbmRJbmRleF07Ci0gICAgICAgIHBJblNhbXBzID0gcEluU2FtcHMgKyBEb3duU2FtcGxpbmdGYWN0b3I7Ci0KLSAgICAgICAgLyogU2F0dXJhdGUgYW5kIHRha2UgYWJzb2x1dGUgdmFsdWUgKi8KLSAgICAgICAgaWYoWDAgPCAwLjBmKQotICAgICAgICAgICAgWDAgPSAtWDA7Ci0gICAgICAgIGlmIChYMCA+IDEuMGYpCi0gICAgICAgICAgICBYZzAgPSAxLjBmOwotICAgICAgICBlbHNlCi0gICAgICAgICAgICBYZzAgPVgwOwotCi0KLSAgICAgICAgLyogUXVhc2kgcGVhayBmaWx0ZXIgY2FsY3VsYXRpb24gKi8KLSAgICAgICAgRDAgID0gWGcwIC0gVjA7Ci0KLSAgICAgICAgdGVtcDIgPSBEMDsKLQotICAgICAgICBhY2N1ID0gdGVtcDIgKiBLcDsKLSAgICAgICAgRDAgICAgPSBEMCAvIDIuMGY7Ci0gICAgICAgIGlmIChEMCA8IDAuMGYpewotICAgICAgICAgICAgRDAgPSAtRDA7Ci0gICAgICAgIH0KLQotICAgICAgICB0ZW1wMiA9IEQwOwotCi0gICAgICAgIHRlbXAgPSBEMCAqIEttOwotICAgICAgICBhY2N1ICs9IHRlbXAgKyBYZzA7Ci0KLSAgICAgICAgaWYgKGFjY3UgPiAxLjBmKQotICAgICAgICAgICAgYWNjdSA9IDEuMGY7Ci0gICAgICAgIGVsc2UgaWYoYWNjdSA8IDAuMGYpCi0gICAgICAgICAgICBhY2N1ID0gMC4wZjsKLQotICAgICAgICBWMCA9IGFjY3U7Ci0KLSAgICAgICAgaWYoKChwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgLSBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQpIDwgRG93blNhbXBsaW5nRmFjdG9yKSkKLSAgICAgICAgewotICAgICAgICAgICAgTFZQU0FfUVBEX1dyaXRlUGVha19GbG9hdCggcExWUFNBX0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcFdyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFuZEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVjApOwotCi0gICAgICAgICAgICBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQgLT0gcExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlOwotICAgICAgICAgICAgcExWUFNBX0luc3QtPkxvY2FsU2FtcGxlc0NvdW50ID0gKExWTV9VSU5UMTYpKG51bVNhbXBsZXMgLSBpaSk7Ci0gICAgICAgIH0KLSAgICAgICAgQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50ICs9IERvd25TYW1wbGluZ0ZhY3RvcjsKLQotICAgICAgICBpaSA9IChMVk1fSU5UMTYpKGlpIC0gRG93blNhbXBsaW5nRmFjdG9yKTsKLQotICAgIH0KLQotICAgIC8qIFN0b3JlIGxhc3QgdGFwcyBpbiBtZW1vcnkgKi8KLSAgICAqcERlbGF5ID0gVjA7Ci0KLSAgICAvKiBJZiB0aGlzIGlzIHRoZSBsYXN0IGNhbGwgdG8gdGhlIGZ1bmN0aW9uIGFmdGVyIGxhc3QgYmFuZCBwcm9jZXNzaW5nLAotICAgICAgIHVwZGF0ZSB0aGUgcGFyYW1ldGVycy4gKi8KLSAgICBpZihCYW5kSW5kZXggPT0gKHBMVlBTQV9JbnN0LT5uUmVsZXZhbnRGaWx0ZXJzIC0gMSkpCi0gICAgewotICAgICAgICBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciA9IHBXcml0ZTsKLSAgICAgICAgLyogQWRqdXN0bWVudCBmb3IgMTEwMjVIeiBpbnB1dCwgMjIwLDUgaXMgbm9ybWFsbHkKLSAgICAgICAgICAgdGhlIGV4YWN0IG51bWJlciBvZiBzYW1wbGVzIGZvciAyMG1zLiovCi0gICAgICAgIGlmKChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlciAhPSBwV3JpdGUpJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocExWUFNBX0luc3QtPkN1cnJlbnRQYXJhbXMuRnMgPT0gTFZNX0ZTXzExMDI1KSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYocExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID09IDIyMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgPSAyMjE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcExWUFNBX0luc3QtPm5TYW1wbGVzQnVmZmVyVXBkYXRlID0gMjIwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyID0gcFdyaXRlOwotICAgICAgICBwTFZQU0FfSW5zdC0+QnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50ID0gQnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50OwotICAgICAgICBwTFZQU0FfSW5zdC0+RG93blNhbXBsaW5nQ291bnQgPSAoTFZNX1VJTlQxNikoLWlpKTsKLSAgICB9Ci19Ci0jZW5kaWYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX1dyaXRlUGVhayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdyaXRlIGEgbGV2ZWwgdmFsdWUgaW4gdGhlIHNwZWN0cnVtIGRhdGEgYnVmZmVyIGluIHRoZSBjb3JyZXNwb25kaW5nIGJhbmQuICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBMVlBTQV9JbnN0ICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgTFZQU0EgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwcFdyaXRlICAgICAgICAgICAgIFBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ2FsbE51bWJlciAgICAgICAgICBOdW1iZXIgb2YgdGhlIGJhbmQgdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuIGluICAgICAgICAgICAqLwotLyogIFZhbHVlICAgICAgICAgICAgICAgVmFsdWUgdG8gd3JpdGUgaW4gdGhlIHNwZWN0cnVtIGRhdGEgYnVmZmVyICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWUFNBX1FQRF9Xcml0ZVBlYWsoICAgcExWUFNBX0luc3RhbmNlUHJfdCAgICAgICBwTFZQU0FfSW5zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgKipwcFdyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJhbmRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBWYWx1ZSAgICkKLXsKLSAgICBMVk1fVUlOVDggKnBXcml0ZSA9ICpwcFdyaXRlOwotCi0KLSAgICAvKiBXcml0ZSB0aGUgdmFsdWUgYW5kIHVwZGF0ZSB0aGUgd3JpdGUgcG9pbnRlciAqLwotICAgICoocFdyaXRlICsgQmFuZEluZGV4KSA9IChMVk1fVUlOVDgpKFZhbHVlPj43KTsKLSAgICBwV3JpdGUgKz0gcExWUFNBX0luc3QtPm5CYW5kczsKLSAgICBpZiAocFdyaXRlID09IChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ICsgcExWUFNBX0luc3QtPm5CYW5kcyAqIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGgpKQotICAgIHsKLSAgICAgICAgcFdyaXRlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydDsKLSAgICB9Ci0KLSAgICAqcHBXcml0ZSA9IHBXcml0ZTsKLQotfQotI2lmZGVmIEJVSUxEX0ZMT0FUCi12b2lkIExWUFNBX1FQRF9Xcml0ZVBlYWtfRmxvYXQoICAgcExWUFNBX0luc3RhbmNlUHJfdCAgICAgcExWUFNBX0luc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgKipwcFdyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJhbmRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBWYWx1ZSAgICkKLXsKLSAgICBMVk1fVUlOVDggKnBXcml0ZSA9ICpwcFdyaXRlOwotCi0gICAgLyogV3JpdGUgdGhlIHZhbHVlIGFuZCB1cGRhdGUgdGhlIHdyaXRlIHBvaW50ZXIgKi8KLSAgICAqKHBXcml0ZSArIEJhbmRJbmRleCkgPSAoTFZNX1VJTlQ4KShWYWx1ZSAqIDI1Nik7Ci0gICAgcFdyaXRlICs9IHBMVlBTQV9JbnN0LT5uQmFuZHM7Ci0gICAgaWYgKHBXcml0ZSA9PSAocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydCArIHBMVlBTQV9JbnN0LT5uQmFuZHMgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoKSkKLSAgICB7Ci0gICAgICAgIHBXcml0ZSA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQ7Ci0gICAgfQotCi0gICAgKnBwV3JpdGUgPSBwV3JpdGU7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9RUERfUHJvY2Vzcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX1Byb2Nlc3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MDU0MjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfUVBEX1Byb2Nlc3MuY3BwCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiTFZQU0FfUVBELmgiCisjaW5jbHVkZSAiTFZQU0FfUHJpdmF0ZS5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgIExWUFNBX1FQRF9Xcml0ZVBlYWsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXcml0ZSBhIGxldmVsIHZhbHVlIGluIHRoZSBidWZmZXIgaW4gdGhlIGNvcnJlc3BvbmRpbmcgYmFuZC4gICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5zdCAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIExWUFNBIGluc3RhbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcHBXcml0ZSAgICAgICAgICAgICBQb2ludGVyIHRvIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENhbGxOdW1iZXIgICAgICAgICAgTnVtYmVyIG9mIHRoZSBiYW5kIHRoZSB2YWx1ZSBzaG91bGQgYmUgd3JpdHRlbiBpbiAgICAgICAgICAgKi8KKy8qICBWYWx1ZSAgICAgICAgICAgICAgIFZhbHVlIHRvIHdyaXRlIGluIHRoZSBidWZmZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwordm9pZCBMVlBTQV9RUERfV3JpdGVQZWFrKCAgIHBMVlBTQV9JbnN0YW5jZVByX3QgICAgICAgcExWUFNBX0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQ4ICAgICAgICAgICAgICAgICAqKnBwV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICBCYW5kSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICBWYWx1ZSAgICk7CisKK3ZvaWQgTFZQU0FfUVBEX1dyaXRlUGVha19GbG9hdCggICBwTFZQU0FfSW5zdGFuY2VQcl90ICAgICAgIHBMVlBTQV9JbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UOCAgICAgICAgICAgICAqKnBwV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQmFuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIFZhbHVlICAgKTsKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX1Byb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFwcGx5IGRvd25zYW1wbGluZywgcG9zdCBnYWluLCBxdWFzaSBwZWFrIGZpbHRlcmluZyBhbmQgd3JpdGUgdGhlIGxldmVscyB2YWx1ZXMgKi8KKy8qICBpbiB0aGUgYnVmZmVyIGV2ZXJ5IDIwIG1zLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIExWUFNBX1FQRF9Qcm9jZXNzX0Zsb2F0ICggICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgICpwSW5TYW1wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bVNhbXBsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgICAgICAgICBCYW5kSW5kZXgpCit7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgUEFSQU1FVEVSUworICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgTFZQU0FfSW5zdGFuY2VQcl90ICAgICAqcExWUFNBX0luc3QgPSAoTFZQU0FfSW5zdGFuY2VQcl90KiloSW5zdGFuY2U7CisgICAgUVBEX0ZMT0FUX1N0YXRlX3QgKnBRUERTdGF0ZSA9ICAoUVBEX0ZMT0FUX1N0YXRlX3QqKSZwTFZQU0FfSW5zdC0+cFFQRF9TdGF0ZXNbQmFuZEluZGV4XTsKKworICAgIC8qIFBvaW50ZXIgdG8gdGFwcyAqLworICAgIExWTV9GTE9BVCogcERlbGF5ICA9IHBRUERTdGF0ZS0+cERlbGF5OworCisgICAgLyogUGFyYW1ldGVycyBuZWVkZWQgZHVyaW5nIHF1YXNpIHBlYWsgY2FsY3VsYXRpb25zICovCisgICAgTFZNX0ZMT0FUICAgWDA7CisgICAgTFZNX0ZMT0FUICAgdGVtcCx0ZW1wMjsKKyAgICBMVk1fRkxPQVQgICBhY2N1OworICAgIExWTV9GTE9BVCAgIFhnMDsKKyAgICBMVk1fRkxPQVQgICBEMDsKKyAgICBMVk1fRkxPQVQgICBWMCA9IChMVk1fRkxPQVQpKCpwRGVsYXkpOworCisgICAgLyogRmlsdGVyJ3MgY29lZiAqLworICAgIExWTV9GTE9BVCAgIEtwID0gKChMVk1fRkxPQVQpKHBRUERTdGF0ZS0+Q29lZnNbMF0pKTsKKyAgICBMVk1fRkxPQVQgICBLbSA9ICgoTFZNX0ZMT0FUKShwUVBEU3RhdGUtPkNvZWZzWzFdKSk7CisKKyAgICBMVk1fSU5UMTYgICBpaSA9IG51bVNhbXBsZXM7CisKKyAgICBMVk1fVUlOVDggICpwV3JpdGUgPSBwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlcldyaXRlUG9pbnRlcjsKKyAgICBMVk1fSU5UMzIgICBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQgPSBwTFZQU0FfSW5zdC0+QnVmZmVyVXBkYXRlU2FtcGxlc0NvdW50OworICAgIExWTV9VSU5UMTYgIERvd25TYW1wbGluZ0ZhY3RvciA9IHBMVlBTQV9JbnN0LT5Eb3duU2FtcGxpbmdGYWN0b3I7CisKKyAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICAgSU5JVElBTElaQVRJT04KKyAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAgIC8qIENvcnJlY3QgdGhlIHBvaW50ZXIgdG8gdGFrZSB0aGUgZmlyc3QgZG93biBzYW1wbGVkIHNpZ25hbCBzYW1wbGUgKi8KKyAgICBwSW5TYW1wcyArPSBwTFZQU0FfSW5zdC0+RG93blNhbXBsaW5nQ291bnQ7CisgICAgLyogQ29ycmVjdCBhbHNvIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyAqLworICAgIGlpID0gKExWTV9JTlQxNikoaWkgLSAoTFZNX0lOVDE2KXBMVlBTQV9JbnN0LT5Eb3duU2FtcGxpbmdDb3VudCk7CisKKyAgICB3aGlsZSAoaWkgPiAwKQorICAgIHsKKyAgICAgICAgLyogQXBwbHkgcG9zdCBnYWluICovCisgICAgICAgIC8qIC0gMSB0byBjb21wZW5zYXRlIHNjYWxpbmcgaW4gcHJvY2VzcyBmdW5jdGlvbiovCisgICAgICAgIFgwID0gKCpwSW5TYW1wcykgKiBwTFZQU0FfSW5zdC0+cFBvc3RHYWluc1tCYW5kSW5kZXhdOworICAgICAgICBwSW5TYW1wcyA9IHBJblNhbXBzICsgRG93blNhbXBsaW5nRmFjdG9yOworCisgICAgICAgIC8qIFNhdHVyYXRlIGFuZCB0YWtlIGFic29sdXRlIHZhbHVlICovCisgICAgICAgIGlmKFgwIDwgMC4wZikKKyAgICAgICAgICAgIFgwID0gLVgwOworICAgICAgICBpZiAoWDAgPiAxLjBmKQorICAgICAgICAgICAgWGcwID0gMS4wZjsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgWGcwID1YMDsKKworICAgICAgICAvKiBRdWFzaSBwZWFrIGZpbHRlciBjYWxjdWxhdGlvbiAqLworICAgICAgICBEMCAgPSBYZzAgLSBWMDsKKworICAgICAgICB0ZW1wMiA9IEQwOworCisgICAgICAgIGFjY3UgPSB0ZW1wMiAqIEtwOworICAgICAgICBEMCAgICA9IEQwIC8gMi4wZjsKKyAgICAgICAgaWYgKEQwIDwgMC4wZil7CisgICAgICAgICAgICBEMCA9IC1EMDsKKyAgICAgICAgfQorCisgICAgICAgIHRlbXAyID0gRDA7CisKKyAgICAgICAgdGVtcCA9IEQwICogS207CisgICAgICAgIGFjY3UgKz0gdGVtcCArIFhnMDsKKworICAgICAgICBpZiAoYWNjdSA+IDEuMGYpCisgICAgICAgICAgICBhY2N1ID0gMS4wZjsKKyAgICAgICAgZWxzZSBpZihhY2N1IDwgMC4wZikKKyAgICAgICAgICAgIGFjY3UgPSAwLjBmOworCisgICAgICAgIFYwID0gYWNjdTsKKworICAgICAgICBpZigoKHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSAtIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCkgPCBEb3duU2FtcGxpbmdGYWN0b3IpKQorICAgICAgICB7CisgICAgICAgICAgICBMVlBTQV9RUERfV3JpdGVQZWFrX0Zsb2F0KCBwTFZQU0FfSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYW5kSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWMCk7CisKKyAgICAgICAgICAgIEJ1ZmZlclVwZGF0ZVNhbXBsZXNDb3VudCAtPSBwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGU7CisgICAgICAgICAgICBwTFZQU0FfSW5zdC0+TG9jYWxTYW1wbGVzQ291bnQgPSAoTFZNX1VJTlQxNikobnVtU2FtcGxlcyAtIGlpKTsKKyAgICAgICAgfQorICAgICAgICBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQgKz0gRG93blNhbXBsaW5nRmFjdG9yOworCisgICAgICAgIGlpID0gKExWTV9JTlQxNikoaWkgLSBEb3duU2FtcGxpbmdGYWN0b3IpOworCisgICAgfQorCisgICAgLyogU3RvcmUgbGFzdCB0YXBzIGluIG1lbW9yeSAqLworICAgICpwRGVsYXkgPSBWMDsKKworICAgIC8qIElmIHRoaXMgaXMgdGhlIGxhc3QgY2FsbCB0byB0aGUgZnVuY3Rpb24gYWZ0ZXIgbGFzdCBiYW5kIHByb2Nlc3NpbmcsCisgICAgICAgdXBkYXRlIHRoZSBwYXJhbWV0ZXJzLiAqLworICAgIGlmKEJhbmRJbmRleCA9PSAocExWUFNBX0luc3QtPm5SZWxldmFudEZpbHRlcnMgLSAxKSkKKyAgICB7CisgICAgICAgIHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyID0gcFdyaXRlOworICAgICAgICAvKiBBZGp1c3RtZW50IGZvciAxMTAyNUh6IGlucHV0LCAyMjAsNSBpcyBub3JtYWxseQorICAgICAgICAgICB0aGUgZXhhY3QgbnVtYmVyIG9mIHNhbXBsZXMgZm9yIDIwbXMuKi8KKyAgICAgICAgaWYoKHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyV3JpdGVQb2ludGVyICE9IHBXcml0ZSkmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwTFZQU0FfSW5zdC0+Q3VycmVudFBhcmFtcy5GcyA9PSBMVk1fRlNfMTEwMjUpKQorICAgICAgICB7CisgICAgICAgICAgICBpZihwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgPT0gMjIwKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5uU2FtcGxlc0J1ZmZlclVwZGF0ZSA9IDIyMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBwTFZQU0FfSW5zdC0+blNhbXBsZXNCdWZmZXJVcGRhdGUgPSAyMjA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJXcml0ZVBvaW50ZXIgPSBwV3JpdGU7CisgICAgICAgIHBMVlBTQV9JbnN0LT5CdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQgPSBCdWZmZXJVcGRhdGVTYW1wbGVzQ291bnQ7CisgICAgICAgIHBMVlBTQV9JbnN0LT5Eb3duU2FtcGxpbmdDb3VudCA9IChMVk1fVUlOVDE2KSgtaWkpOworICAgIH0KK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgTFZQU0FfUVBEX1dyaXRlUGVhayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFdyaXRlIGEgbGV2ZWwgdmFsdWUgaW4gdGhlIHNwZWN0cnVtIGRhdGEgYnVmZmVyIGluIHRoZSBjb3JyZXNwb25kaW5nIGJhbmQuICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBMVlBTQV9JbnN0ICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgTFZQU0EgaW5zdGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwcFdyaXRlICAgICAgICAgICAgIFBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ2FsbE51bWJlciAgICAgICAgICBOdW1iZXIgb2YgdGhlIGJhbmQgdGhlIHZhbHVlIHNob3VsZCBiZSB3cml0dGVuIGluICAgICAgICAgICAqLworLyogIFZhbHVlICAgICAgICAgICAgICAgVmFsdWUgdG8gd3JpdGUgaW4gdGhlIHNwZWN0cnVtIGRhdGEgYnVmZmVyICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIExWUFNBX1FQRF9Xcml0ZVBlYWsoICAgcExWUFNBX0luc3RhbmNlUHJfdCAgICAgICBwTFZQU0FfSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgKipwcFdyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgIEJhbmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBWYWx1ZSAgICkKK3sKKyAgICBMVk1fVUlOVDggKnBXcml0ZSA9ICpwcFdyaXRlOworCisgICAgLyogV3JpdGUgdGhlIHZhbHVlIGFuZCB1cGRhdGUgdGhlIHdyaXRlIHBvaW50ZXIgKi8KKyAgICAqKHBXcml0ZSArIEJhbmRJbmRleCkgPSAoTFZNX1VJTlQ4KShWYWx1ZT4+Nyk7CisgICAgcFdyaXRlICs9IHBMVlBTQV9JbnN0LT5uQmFuZHM7CisgICAgaWYgKHBXcml0ZSA9PSAocExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydCArIHBMVlBTQV9JbnN0LT5uQmFuZHMgKiBwTFZQU0FfSW5zdC0+U3BlY3RyYWxEYXRhQnVmZmVyTGVuZ3RoKSkKKyAgICB7CisgICAgICAgIHBXcml0ZSA9IHBMVlBTQV9JbnN0LT5wU3BlY3RyYWxEYXRhQnVmZmVyU3RhcnQ7CisgICAgfQorCisgICAgKnBwV3JpdGUgPSBwV3JpdGU7CisKK30KK3ZvaWQgTFZQU0FfUVBEX1dyaXRlUGVha19GbG9hdCggICBwTFZQU0FfSW5zdGFuY2VQcl90ICAgICBwTFZQU0FfSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDggICAgICAgICAgICAgICAqKnBwV3JpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQmFuZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIFZhbHVlICAgKQoreworICAgIExWTV9VSU5UOCAqcFdyaXRlID0gKnBwV3JpdGU7CisKKyAgICAvKiBXcml0ZSB0aGUgdmFsdWUgYW5kIHVwZGF0ZSB0aGUgd3JpdGUgcG9pbnRlciAqLworICAgICoocFdyaXRlICsgQmFuZEluZGV4KSA9IChMVk1fVUlOVDgpKFZhbHVlICogMjU2KTsKKyAgICBwV3JpdGUgKz0gcExWUFNBX0luc3QtPm5CYW5kczsKKyAgICBpZiAocFdyaXRlID09IChwTFZQU0FfSW5zdC0+cFNwZWN0cmFsRGF0YUJ1ZmZlclN0YXJ0ICsgcExWUFNBX0luc3QtPm5CYW5kcyAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBMVlBTQV9JbnN0LT5TcGVjdHJhbERhdGFCdWZmZXJMZW5ndGgpKQorICAgIHsKKyAgICAgICAgcFdyaXRlID0gcExWUFNBX0luc3QtPnBTcGVjdHJhbERhdGFCdWZmZXJTdGFydDsKKyAgICB9CisKKyAgICAqcHBXcml0ZSA9IHBXcml0ZTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TcGVjdHJ1bUFuYWx5emVyL3NyYy9MVlBTQV9UYWJsZXMuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI4NzUwMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIkxWUFNBLmgiCi0jaW5jbHVkZSAiTFZQU0FfUVBELmgiCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBTYW1wbGUgcmF0ZSB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFNhbXBsZSByYXRlIHRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIGFjdHVhbAotICogZnJlcXVlbmN5Ci0gKi8KLSNpZm5kZWYgSElHSEVSX0ZTCi1jb25zdCBMVk1fVUlOVDE2ICAgIExWUFNBX1NhbXBsZVJhdGVUYWJbXSA9IHsgICA4MDAwLCAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjA1MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwfTsgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KLSNlbHNlCi1jb25zdCBMVk1fVUlOVDMyICAgIExWUFNBX1NhbXBsZVJhdGVUYWJbXSA9IHsgICA4MDAwLCAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTAyNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjA1MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MjAwMH07ICAgICAgICAgICAgICAgICAgLyogMTkya1MvcyAqLwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNhbXBsZSByYXRlIGludmVyc2UgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogU2FtcGxlIHJhdGUgdGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgYWN0dWFsCi0gKiBmcmVxdWVuY3kKLSAqLwotY29uc3QgTFZNX1VJTlQzMiAgICBMVlBTQV9TYW1wbGVSYXRlSW52VGFiW10gPSB7ICAgIDI2ODQzNSwgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5NDc4MywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzg5NTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM0MjE4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk3MzkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg5NDc4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY3MTA5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4Njk2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0NzM5Ci0jaWZkZWYgSElHSEVSX0ZTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDIyMzY5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDExMTg1ICAgICAgICAgICAgICAgICAgLyogMTkya1MvcyAqLwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07Ci0KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiAyMG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyoKLSAqIFRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIG51bWJlciBvZiBzYW1wbGVzCi0gKiBkdXJpbmcgMjBtcwotICovCi1jb25zdCBMVk1fVUlOVDE2ICAgIExWUFNBX25TYW1wbGVzQnVmZmVyVXBkYXRlW10gID0geyAgIDE2MCwgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwCi0jaWZkZWYgSElHSEVSX0ZTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxOTIwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwzODQwICAgICAgICAgICAgICAgICAgLyogMTkya1MvcyAqLwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERvd24gc2FtcGxpbmcgZmFjdG9ycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogVGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgZG93biBzYW1wbGluZyBmYWN0b3IKLSAqLwotY29uc3QgTFZNX1VJTlQxNiAgICBMVlBTQV9Eb3duU2FtcGxpbmdGYWN0b3JbXSAgPSB7ICAgICA1LCAgICAgICAgICAgICAgICAgICAgLyogODAwMCAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3LCAgICAgICAgICAgICAgICAgICAgLyogMTEwMjUgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4LCAgICAgICAgICAgICAgICAgICAgLyogMTIwMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMCwgICAgICAgICAgICAgICAgICAgLyogMTYwMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNSwgICAgICAgICAgICAgICAgICAgLyogMjIwNTAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNiwgICAgICAgICAgICAgICAgICAgLyogMjQwMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMSwgICAgICAgICAgICAgICAgICAgLyogMzIwMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMCwgICAgICAgICAgICAgICAgICAgLyogNDQxMDAgUy9zICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMiAgICAgICAgICAgICAgICAgICAgLyogNDgwMDAgUy9zICAqLwotI2lmZGVmIEhJR0hFUl9GUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICw2NCAgICAgICAgICAgICAgICAgICAvKiA5NjAwMCBTL3MgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEyOCAgICAgICAgICAgICAgICAgIC8qMTkyMDAwIFMvcyAgKi8KLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvZWZmaWNpZW50IGNhbGN1bGF0aW9uIHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogVGFibGUgZm9yIDIgKiBQaSAvIEZzCi0gKi8KLWNvbnN0IExWTV9JTlQxNiAgICAgTFZQU0FfVHdvUGlPbkZzVGFibGVbXSA9IHsgIDI2MzU0LCAgICAgIC8qIDhrUy9zICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTEyMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3NTY5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTMxNzcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTU2MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4Nzg1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY1ODgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDc4MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MzkyCi0jaWZkZWYgSElHSEVSX0ZTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMjE5NgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEwOTggICAgLyogMTkya1MvcyAqLwotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwotCi0jaWZkZWYgQlVJTERfRkxPQVQKLWNvbnN0IExWTV9GTE9BVCAgICAgTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbXSA9IHsgIDAuODA0Mjg0N2YsICAgICAgLyogOGtTL3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTgzNjA1NGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUzNjE3OTZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MDIxNDIzZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjkxNzg3NGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2ODEwNTFmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMDEwNTU5ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTQ1OTA4OWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEzNDAzNzJmCi0jaWZkZWYgSElHSEVSX0ZTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwLjA2NzAxODZmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwLjAzMzUwOTNmICAgIC8qIDE5MmtTL3MgKi8KLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotI2VuZGlmCi0vKgotICogR2FpbiB0YWJsZQotICovCi1jb25zdCBMVk1fSU5UMTYgICAgIExWUFNBX0dhaW5UYWJsZVtdID0geyAgIDM2NCwgICAgICAgICAgLyogLTE1ZEIgZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1OCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0NywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzI2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkxNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAyNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE1MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI5MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTQ0OSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYyNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTgyNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA0OCwgICAgICAgICAvKiAwZEIgZ2FpbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMjk3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNTc4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyODkyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjQ1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzNjQxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDk2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NTg0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTQ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NDc2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjY2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MTUzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5MTQ4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI2NCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTE1NzZ9OyAgICAgICAgLyogKzE1ZEIgZ2FpbiAqLwotCi0jaWZkZWYgQlVJTERfRkxPQVQKLWNvbnN0IExWTV9GTE9BVCAgTFZQU0FfRmxvYXRfR2FpblRhYmxlW109eyAgMC4xNzc3MzQzNzVmLCAgICAgICAgICAvKiAtMTVkQiBnYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTk5MjE4NzUwZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjM2MzI4MTJmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDk3NjU2MmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjgxNzM4MjgxZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMTU5MTc5NjhmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM1NDQ5MjE4N2YsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzk3OTQ5MjE4ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40NDYyODkwNjJmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUwMDk3NjU2MmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTYyMDExNzE4ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC42MzA4NTkzNzVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcwNzUxOTUzMWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzkzOTQ1MzEyZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC44OTExMTMyODFmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAwMDAwMDAwMGYsICAgICAgICAgLyogMGRCIGdhaW4gKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMjE1ODIwMzFmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI1ODc4OTA2MmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDEyMTA5Mzc1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41ODQ0NzI2NTZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc3NzgzMjAzMWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDAwMDAwMDAwZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4yMzgyODEyNTBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjUxMTcxODc1MGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuODE4MzU5Mzc1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4xNjIxMDkzNzVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjU0Nzg1MTU2MmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuOTgwOTU3MDMxZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC40NjY3OTY4NzVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjAxMTcxODc1MGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuNjUyMzQzNzUwZn07ICAgICAgICAvKiArMTVkQiBnYWluICovCi0jZW5kaWYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENvc29uZSBwb2x5bm9taWFsIGNvZWZmaWNpZW50cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKgotICogQ29lZmZpY2llbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgY29zaW5lIHdpdGggdGhlIGVxdWF0aW9uOgotICoKLSAqICBDb3MoeCkgPSAoMl5TaGlmdHMpKihhMCArIGExKnggKyBhMip4XjIgKyBhMyp4XjMgKyBhNCp4XjQgKyBhNSp4XjUpCi0gKgotICogVGhlc2UgY29lZmZpY2llbnRzIGV4cGVjdCB0aGUgaW5wdXQsIHgsIHRvIGJlIGluIHRoZSByYW5nZSAwIHRvIDMyNzY4IHJlc3ByZXNlbnRpbmcKLSAqIGEgcmFuZ2Ugb2YgMCB0byBQaS4gVGhlIG91dHB1dCBpcyBpbiB0aGUgcmFuZ2UgMzI3NjcgdG8gLTMyNzY4IHJlcHJlc2VudGluZyB0aGUgcmFuZ2UKLSAqICsxLjAgdG8gLTEuMAotICovCi1jb25zdCBMVk1fSU5UMTYgICAgIExWUFNBX0Nvc0NvZWZbXSA9IHsgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0zNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xOTcyNSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0yNjcxLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIzNzMwLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC05NDkwfTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNSAqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi1jb25zdCBMVk1fRkxPQVQgICAgIExWUFNBX0Zsb2F0X0Nvc0NvZWZbXSA9IHsgMywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTI1MDAzOGYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMTA5ODZmLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGExICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuNjAxOTc3NWYsICAgICAgICAgICAgICAgICAgICAgICAgLyogYTIgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wODE1MTQ5ZiwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcyNDIwNDJmLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjI4OTYyMDZmfTsgICAgICAgICAgICAgICAgICAgICAgICAvKiBhNSAqLwotI2VuZGlmCi0vKgotICogQ29lZmZpY2llbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgY29zaW5lIGVycm9yIHdpdGggdGhlIGVxdWF0aW9uOgotICoKLSAqICBDb3NFcnIoeCkgPSAoMl5TaGlmdHMpKihhMCArIGExKnggKyBhMip4XjIgKyBhMyp4XjMpCi0gKgotICogVGhlc2UgY29lZmZpY2llbnRzIGV4cGVjdCB0aGUgaW5wdXQsIHgsIHRvIGJlIGluIHRoZSByYW5nZSAwIHRvIDMyNzY4IHJlc3ByZXNlbnRpbmcKLSAqIGEgcmFuZ2Ugb2YgMCB0byBQaS8yNS4gVGhlIG91dHB1dCBpcyBpbiB0aGUgcmFuZ2UgMCB0byAzMjc2NyByZXByZXNlbnRpbmcgdGhlIHJhbmdlCi0gKiAwLjAgdG8gMC4wMDc4ODUyOTg2Ci0gKgotICogVGhpcyBpcyB1c2VkIHRvIGdpdmUgYSBkb3VibGUgcHJlY2lzaW9uIGNvc2luZSBvdmVyIHRoZSByYW5nZSAwIHRvIFBpLzI1IHVzaW5nIHRoZQotICogdGhlIGVxdWF0aW9uOgotICoKLSAqIENvcyh4KSA9IDEuMCAtIENvc0Vycih4KQotICovCi1jb25zdCBMVk1fSU5UMTYgICAgIExWUFNBX0RQQ29zQ29lZltdID0geyAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hpZnRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjU4NiwgICAgICAgICAgICAgICAgICAgICAgIC8qIGEyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotY29uc3QgTFZNX0ZMT0FUICAgIExWUFNBX0Zsb2F0X0RQQ29zQ29lZltdID0gezEuMGYsICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hpZnRzICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wZiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMDA4MzExZiwgICAgICAgICAgICAgICAgIC8qIGExICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC41MDYxNzk5OWYsICAgICAgICAgICAgICAgICAvKiBhMiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjAwMTM0MjgxZn07ICAgICAgICAgICAgICAgIC8qIGEzICovCi0jZW5kaWYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFF1YXNpIHBlYWsgZmlsdGVyIGNvZWZmaWNpZW50cyB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotY29uc3QgUVBEX0MzMl9Db2VmcyAgICAgTFZQU0FfUVBEX0NvZWZzW10gPSB7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODBDRUZEMkIsMHgwMENCOUIxN30sICAvKiA4a1MvcyAgKi8gICAgLyogTFZQU0FfU1BFRURfTE9XICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODBEMjQyRTcsMHgwMENFRDExRH0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDgwRENCQUY1LDB4MDBEOTE2Nzl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4MENFRkQyQiwweDAwQ0I5QjE3fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODBFMTM3MzksMHgwMEREN0NEM30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDgwRENCQUY1LDB4MDBEOTE2Nzl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4MEQ5NEJBRiwweDAwRDVCN0U3fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODBFMTM3MzksMHgwMEREN0NEM30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDgwRENCQUY1LDB4MDBEOTE2Nzl9LCAgLyogNDhrUy9zICovCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODU4NzUxM0QsMHgwNTVDMjJDRn0sICAvKiA4a1MvcyAgKi8gICAgLyogTFZQU0FfU1BFRURfTUVESVVNICAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODU5RDI5NjcsMHgwNTcwRjAwN30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDg1RTJFRkFDLDB4MDVCMzRENzl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4NTg3NTEzRCwweDA1NUMyMkNGfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODYwMEM3QjksMHgwNUNGQTZDRn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweDg1RTJFRkFDLDB4MDVCMzRENzl9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHg4NUNDMTAxOCwweDA1OUQ4RjY5fSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODYwMEM3QjksMHgwNUNGQTZDRn0sLy97MHg4NjAwQzdCOSwweDA1Q0ZBNkNGfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4ODVFMkVGQUMsMHgwNUIzNEQ3OX0sICAvKiA0OGtTL3MgKi8KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHhBMTE1RUE3QSwweDFDREIzRjVDfSwgIC8qIDhrUy9zICAqLyAgIC8qIExWUFNBX1NQRUVEX0hJR0ggICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHhBMTg0NzVGMCwweDFEMkM4M0EyfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4QTJFMUU5NTAsMHgxRTJBNTMyRX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweEExMTVFQTdBLDB4MUNEQjNGNUN9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHhBMzc1QjJDNiwweDFFOTQzQkJDfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4QTJFMUU5NTAsMHgxRTJBNTMyRX0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsweEEyNkZGNkJELDB4MUREODE1MzB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MHhBMzc1QjJDNiwweDFFOTQzQkJDfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezB4QTJFMUU5NTAsMHgxRTJBNTMyRX19OyAvKiA0OGtTL3MgKi8KLQotI2lmZGVmIEJVSUxEX0ZMT0FUCi1jb25zdCBRUERfRkxPQVRfQ29lZnMgICAgIExWUFNBX1FQRF9GbG9hdF9Db2Vmc1tdID0gewotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLyAgICAvKiBMVlBTQV9TUEVFRF9MT1cgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzNjgzMTk4OTMyNTU4M2YsMC4wMDYyMTM1NTY1MDk0NjUwZn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTM1ODMzMzMyMTI4ODIzZiwwLjAwNjMxMTU0OTMzOTQ0MzRmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzNjgzMTk4OTMyNTU4M2YsMC4wMDYyMTM1NTY1MDk0NjUwZn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMxMjY5NjE4NjgyNTYzZiwwLjAwNjc1OTI2NDk3MjA2MDlmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMzY4NjYzMzU5NDMzNGYsMC4wMDY1MjIxNjcwMDgzNzAyZn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMxMjY5NjE4NjgyNTYzZiwwLjAwNjc1OTI2NDk3MjA2MDlmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCi0jaWZkZWYgSElHSEVSX0ZTCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLyAgICAvKiBMVlBTQV9TUEVFRF9NRURJVU0gICAgICAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU2ODA3OTQyNTk1MzMyOWYsMC4wNDE4NzQyNjY2OTUyMzEyZn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTYxNDEzMDQ2OTAzOTA4ZiwwLjA0MjUwOTA4MjIzOTEyMTJmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU2ODA3OTQyNTk1MzMyOWYsMC4wNDE4NzQyNjY2OTUyMzEyZn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTMxMDExOTEyMDQwNDEyZiwwLjA0NTM5OTUyMzgwNTgyNjlmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0NzA5OTk1NTM3OTk2M2YsMC4wNDM4NzA4NTU1ODg0NjU5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3sweDg2MDBDN0I5LDB4MDVDRkE2Q0Z9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsMC4wNDUzOTk1MjM4MDU4MjY5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAotI2lmZGVmIEhJR0hFUl9GUwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovICAgLyogTFZQU0FfU1BFRURfSElHSCAgICAgICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43NDE1MTg2NzkwNzQ5NDMxZiwwLjIyNTQ0MDkwMjYzNTQ1NTFmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjczODE0NTEyMDQ0MTkxMzZmLDAuMjI3OTIwOTY1MjkxNTU5N2Z9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43NDE1MTg2NzkwNzQ5NDMxZiwwLjIyNTQ0MDkwMjYzNTQ1NTFmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjcyMjk3MDYzMTkwNDkwMDFmLDAuMjM4ODk4NzIyNDU0OTA1NWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43MzA5NTgxMzUzMzI5MTIyZiwwLjIzMzE1NjgyMjYyMTgyMjRmfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjcyMjk3MDYzMTkwNDkwMDFmLDAuMjM4ODk4NzIyNDU0OTA1NWZ9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDQ4a1MvcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0KLSNpZmRlZiBISUdIRVJfRlMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfQotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjBhYTAyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5jcHAKQEAgLTAsMCArMSwzNjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZQU0EuaCIKKyNpbmNsdWRlICJMVlBTQV9RUEQuaCIKKyNpbmNsdWRlICJMVlBTQV9UYWJsZXMuaCIKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNhbXBsZSByYXRlIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogU2FtcGxlIHJhdGUgdGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgYWN0dWFsCisgKiBmcmVxdWVuY3kKKyAqLworY29uc3QgTFZNX1VJTlQzMiAgICBMVlBTQV9TYW1wbGVSYXRlVGFiW10gPSB7ICAgODAwMCwgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjIwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3NjQwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTkyMDAwfTsgICAgICAgICAgICAgICAgICAvKiAxOTJrUy9zICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNhbXBsZSByYXRlIGludmVyc2UgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogU2FtcGxlIHJhdGUgdGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgYWN0dWFsCisgKiBmcmVxdWVuY3kKKyAqLworY29uc3QgTFZNX1VJTlQzMiAgICBMVlBTQV9TYW1wbGVSYXRlSW52VGFiW10gPSB7ICAgIDI2ODQzNSwgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5NDc4MywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNzg5NTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTM0MjE4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk3MzkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg5NDc4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY3MTA5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4Njk2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0NzM5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDI0MzQ4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDIyMzY5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEyMTc0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDExMTg1ICAgICAgICAgICAgICAgICAgLyogMTkya1MvcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiAyMG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIG51bWJlciBvZiBzYW1wbGVzCisgKiBkdXJpbmcgMjBtcworICovCitjb25zdCBMVk1fVUlOVDE2ICAgIExWUFNBX25TYW1wbGVzQnVmZmVyVXBkYXRlW10gID0geyAgIDE2MCwgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjQwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2NDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTYwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxNzY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxOTIwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwzNTI4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwzODQwICAgICAgICAgICAgICAgICAgLyogMTkya1MvcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEb3duIHNhbXBsaW5nIGZhY3RvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIGRvd24gc2FtcGxpbmcgZmFjdG9yCisgKi8KK2NvbnN0IExWTV9VSU5UMTYgICAgTFZQU0FfRG93blNhbXBsaW5nRmFjdG9yW10gID0geyAgICAgNSwgICAgICAgICAgICAgICAgICAgIC8qIDgwMDAgIFMvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNywgICAgICAgICAgICAgICAgICAgIC8qIDExMDI1IFMvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOCwgICAgICAgICAgICAgICAgICAgIC8qIDEyMDAwIFMvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsICAgICAgICAgICAgICAgICAgIC8qIDE2MDAwIFMvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUsICAgICAgICAgICAgICAgICAgIC8qIDIyMDUwIFMvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsICAgICAgICAgICAgICAgICAgIC8qIDI0MDAwIFMvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEsICAgICAgICAgICAgICAgICAgIC8qIDMyMDAwIFMvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzAsICAgICAgICAgICAgICAgICAgIC8qIDQ0MTAwIFMvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIgICAgICAgICAgICAgICAgICAgIC8qIDQ4MDAwIFMvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsNjAgICAgICAgICAgICAgICAgICAgLyogODgyMDAgUy9zICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICw2NCAgICAgICAgICAgICAgICAgICAvKiA5NjAwMCBTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEyMCAgICAgICAgICAgICAgICAgIC8qIDE3NjQwMCBTL3MgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDEyOCAgICAgICAgICAgICAgICAgIC8qMTkyMDAwIFMvcyAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29lZmZpY2llbnQgY2FsY3VsYXRpb24gdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBUYWJsZSBmb3IgMiAqIFBpIC8gRnMKKyAqLworY29uc3QgTFZNX0lOVDE2ICAgICBMVlBTQV9Ud29QaU9uRnNUYWJsZVtdID0geyAgMjYzNTQsICAgICAgLyogOGtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE5MTIzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTc1NjksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzE3NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA5NTYxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg3ODUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjU4OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NzgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQzOTIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwyMzkwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsMjE5NgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLDExOTUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwxMDk4ICAgIC8qIDE5MmtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKK2NvbnN0IExWTV9GTE9BVCAgICAgTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbXSA9IHsgIDAuODA0Mjg0N2YsICAgICAgLyogOGtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTgzNjA1NGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUzNjE3OTZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40MDIxNDIzZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjkxNzg3NGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI2ODEwNTFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMDEwNTU5ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTQ1OTA4OWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjEzNDAzNzJmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwLjA3Mjk0NzZmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwLjA2NzAxODZmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwLjAzNjQ3MzhmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwwLjAzMzUwOTNmICAgIC8qIDE5MmtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisKKy8qCisgKiBHYWluIHRhYmxlCisgKi8KK2NvbnN0IExWTV9JTlQxNiAgICAgTFZQU0FfR2FpblRhYmxlW10gPSB7ICAgMzY0LCAgICAgICAgICAvKiAtMTVkQiBnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNDU4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3NywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNjQ3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgxNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOTE0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDI2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjkyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjI2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxODI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDQ4LCAgICAgICAgIC8qIDBkQiBnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyOTcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI1NzgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI4OTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyNDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDM2NDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQwOTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ1ODQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxNDQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3NzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0NzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyNjYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgxNTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDkxNDgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMjY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMTU3Nn07ICAgICAgICAvKiArMTVkQiBnYWluICovCisKK2NvbnN0IExWTV9GTE9BVCAgTFZQU0FfRmxvYXRfR2FpblRhYmxlW109eyAgMC4xNzc3MzQzNzVmLCAgICAgICAgICAvKiAtMTVkQiBnYWluICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMTk5MjE4NzUwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjM2MzI4MTJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjI1MDk3NjU2MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMjgxNzM4MjgxZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4zMTU5MTc5NjhmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjM1NDQ5MjE4N2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMzk3OTQ5MjE4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC40NDYyODkwNjJmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjUwMDk3NjU2MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTYyMDExNzE4ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC42MzA4NTkzNzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjcwNzUxOTUzMWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzkzOTQ1MzEyZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC44OTExMTMyODFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjAwMDAwMDAwMGYsICAgICAgICAgLyogMGRCIGdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS4xMjE1ODIwMzFmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjI1ODc4OTA2MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuNDEyMTA5Mzc1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMS41ODQ0NzI2NTZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLjc3NzgzMjAzMWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMDAwMDAwMDAwZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMi4yMzgyODEyNTBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyLjUxMTcxODc1MGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuODE4MzU5Mzc1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4xNjIxMDkzNzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzLjU0Nzg1MTU2MmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMuOTgwOTU3MDMxZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNC40NjY3OTY4NzVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1LjAxMTcxODc1MGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUuNjUyMzQzNzUwZn07ICAgICAgICAvKiArMTVkQiBnYWluICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb3NvbmUgcG9seW5vbWlhbCBjb2VmZmljaWVudHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIENvZWZmaWNpZW50cyBmb3IgY2FsY3VsYXRpbmcgdGhlIGNvc2luZSB3aXRoIHRoZSBlcXVhdGlvbjoKKyAqCisgKiAgQ29zKHgpID0gKDJeU2hpZnRzKSooYTAgKyBhMSp4ICsgYTIqeF4yICsgYTMqeF4zICsgYTQqeF40ICsgYTUqeF41KQorICoKKyAqIFRoZXNlIGNvZWZmaWNpZW50cyBleHBlY3QgdGhlIGlucHV0LCB4LCB0byBiZSBpbiB0aGUgcmFuZ2UgMCB0byAzMjc2OCByZXNwcmVzZW50aW5nCisgKiBhIHJhbmdlIG9mIDAgdG8gUGkuIFRoZSBvdXRwdXQgaXMgaW4gdGhlIHJhbmdlIDMyNzY3IHRvIC0zMjc2OCByZXByZXNlbnRpbmcgdGhlIHJhbmdlCisgKiArMS4wIHRvIC0xLjAKKyAqLworY29uc3QgTFZNX0lOVDE2ICAgICBMVlBTQV9Db3NDb2VmW10gPSB7IDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTaGlmdHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0MDk2LCAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMzYsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMTk3MjUsICAgICAgICAgICAgICAgICAgICAgICAgLyogYTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMjY3MSwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMzczMCwgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtOTQ5MH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTUgKi8KK2NvbnN0IExWTV9GTE9BVCAgICAgTFZQU0FfRmxvYXRfQ29zQ29lZltdID0geyAzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hpZnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4xMjUwMDM4ZiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGEwICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMDAxMDk4NmYsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC42MDE5Nzc1ZiwgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0wLjA4MTUxNDlmLCAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNzI0MjA0MmYsICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGE0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTAuMjg5NjIwNmZ9OyAgICAgICAgICAgICAgICAgICAgICAgIC8qIGE1ICovCisvKgorICogQ29lZmZpY2llbnRzIGZvciBjYWxjdWxhdGluZyB0aGUgY29zaW5lIGVycm9yIHdpdGggdGhlIGVxdWF0aW9uOgorICoKKyAqICBDb3NFcnIoeCkgPSAoMl5TaGlmdHMpKihhMCArIGExKnggKyBhMip4XjIgKyBhMyp4XjMpCisgKgorICogVGhlc2UgY29lZmZpY2llbnRzIGV4cGVjdCB0aGUgaW5wdXQsIHgsIHRvIGJlIGluIHRoZSByYW5nZSAwIHRvIDMyNzY4IHJlc3ByZXNlbnRpbmcKKyAqIGEgcmFuZ2Ugb2YgMCB0byBQaS8yNS4gVGhlIG91dHB1dCBpcyBpbiB0aGUgcmFuZ2UgMCB0byAzMjc2NyByZXByZXNlbnRpbmcgdGhlIHJhbmdlCisgKiAwLjAgdG8gMC4wMDc4ODUyOTg2CisgKgorICogVGhpcyBpcyB1c2VkIHRvIGdpdmUgYSBkb3VibGUgcHJlY2lzaW9uIGNvc2luZSBvdmVyIHRoZSByYW5nZSAwIHRvIFBpLzI1IHVzaW5nIHRoZQorICogdGhlIGVxdWF0aW9uOgorICoKKyAqIENvcyh4KSA9IDEuMCAtIENvc0Vycih4KQorICovCitjb25zdCBMVk1fSU5UMTYgICAgIExWUFNBX0RQQ29zQ29lZltdID0geyAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2hpZnRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYTAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNjU4NiwgICAgICAgICAgICAgICAgICAgICAgIC8qIGEyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC00NH07ICAgICAgICAgICAgICAgICAgICAgICAgLyogYTMgKi8KK2NvbnN0IExWTV9GTE9BVCAgICBMVlBTQV9GbG9hdF9EUENvc0NvZWZbXSA9IHsxLjBmLCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNoaWZ0cyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMGYsICAgICAgICAgICAgICAgICAgICAgICAgLyogYTAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDAwODMxMWYsICAgICAgICAgICAgICAgICAvKiBhMSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuNTA2MTc5OTlmLCAgICAgICAgICAgICAgICAgLyogYTIgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtMC4wMDEzNDI4MWZ9OyAgICAgICAgICAgICAgICAvKiBhMyAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUXVhc2kgcGVhayBmaWx0ZXIgY29lZmZpY2llbnRzIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitjb25zdCBRUERfQzMyX0NvZWZzICAgICBMVlBTQV9RUERfQ29lZnNbXSA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogOGtTL3MgICovICAgIC8qIExWUFNBX1NQRUVEX0xPVyAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4ODBDRUZEMkIsMHgwMENCOUIxN30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4ODBEMjQyRTcsMHgwMENFRDExRH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4ODBEQ0JBRjUsMHgwMEQ5MTY3OX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4ODBDRUZEMkIsMHgwMENCOUIxN30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4ODBFMTM3MzksMHgwMEREN0NEM30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4ODBEQ0JBRjUsMHgwMEQ5MTY3OX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4ODBEOTRCQUYsMHgwMEQ1QjdFN30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4ODBFMTM3MzksMHgwMEREN0NEM30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4ODBEQ0JBRjUsMHgwMEQ5MTY3OX0sICAvKiA0OGtTL3MgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8gICAgLyogTFZQU0FfU1BFRURfTUVESVVNICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4ODU4NzUxM0QsMHgwNTVDMjJDRn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4ODU5RDI5NjcsMHgwNTcwRjAwN30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4ODVFMkVGQUMsMHgwNUIzNEQ3OX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4ODU4NzUxM0QsMHgwNTVDMjJDRn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4ODYwMEM3QjksMHgwNUNGQTZDRn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4ODVFMkVGQUMsMHgwNUIzNEQ3OX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4ODVDQzEwMTgsMHgwNTlEOEY2OX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4ODYwMEM3QjksMHgwNUNGQTZDRn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4ODVFMkVGQUMsMHgwNUIzNEQ3OX0sICAvKiA0OGtTL3MgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8gICAvKiBMVlBTQV9TUEVFRF9ISUdIICAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4QTExNUVBN0EsMHgxQ0RCM0Y1Q30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4QTE4NDc1RjAsMHgxRDJDODNBMn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4QTJFMUU5NTAsMHgxRTJBNTMyRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4QTExNUVBN0EsMHgxQ0RCM0Y1Q30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4QTM3NUIyQzYsMHgxRTk0M0JCQ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4QTJFMUU5NTAsMHgxRTJBNTMyRX0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4QTI2RkY2QkQsMHgxREQ4MTUzMH0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4QTM3NUIyQzYsMHgxRTk0M0JCQ30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsoTFZNX0lOVDMyKTB4QTJFMUU5NTAsMHgxRTJBNTMyRX19OyAvKiA0OGtTL3MgKi8KKworY29uc3QgUVBEX0ZMT0FUX0NvZWZzICAgICBMVlBTQV9RUERfRmxvYXRfQ29lZnNbXSA9IHsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8gICAgLyogTFZQU0FfU1BFRURfTE9XICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzY4MzE5ODkzMjU1ODNmLDAuMDA2MjEzNTU2NTA5NDY1MGZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzNTgzMzMzMjEyODgyM2YsMC4wMDYzMTE1NDkzMzk0NDM0Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzY4MzE5ODkzMjU1ODNmLDAuMDA2MjEzNTU2NTA5NDY1MGZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMTI2OTYxODY4MjU2M2YsMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzM2ODY2MzM1OTQzMzRmLDAuMDA2NTIyMTY3MDA4MzcwMmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMTI2OTYxODY4MjU2M2YsMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzI2Mzg0NTc5NzYyODJmLDAuMDA2NjI0OTkzNDAyNTEwOWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMTI2OTYxODY4MjU2M2YsMC4wMDY3NTkyNjQ5NzIwNjA5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45OTMyNjM4NDU3OTc2MjgyZiwwLjAwNjYyNDk5MzQwMjUxMDlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk5MzEyNjk2MTg2ODI1NjNmLDAuMDA2NzU5MjY0OTcyMDYwOWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTkzMjYzODQ1Nzk3NjI4MmYsMC4wMDY2MjQ5OTM0MDI1MTA5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIDhrUy9zICAqLyAgICAvKiBMVlBTQV9TUEVFRF9NRURJVU0gICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU2ODA3OTQyNTk1MzMyOWYsMC4wNDE4NzQyNjY2OTUyMzEyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTYxNDEzMDQ2OTAzOTA4ZiwwLjA0MjUwOTA4MjIzOTEyMTJmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU2ODA3OTQyNTk1MzMyOWYsMC4wNDE4NzQyNjY2OTUyMzEyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTMxMDExOTEyMDQwNDEyZiwwLjA0NTM5OTUyMzgwNTgyNjlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0NzA5OTk1NTM3OTk2M2YsMC4wNDM4NzA4NTU1ODg0NjU5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvL3sweDg2MDBDN0I5LDB4MDVDRkE2Q0Z9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsMC4wNDUzOTk1MjM4MDU4MjY5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA0OGtTL3MgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1NDAxMTk1NjIyOTgwNTlmLDAuMDQ0NTM0MzgxOTQ0Njg2MmZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTUzMTAxMTkxMjA0MDQxMmYsMC4wNDUzOTk1MjM4MDU4MjY5Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC45NTQwMTE5NTYyMjk4MDU5ZiwwLjA0NDUzNDM4MTk0NDY4NjJmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjk1MzEwMTE5MTIwNDA0MTJmLDAuMDQ1Mzk5NTIzODA1ODI2OWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuOTU0MDExOTU2MjI5ODA1OWYsMC4wNDQ1MzQzODE5NDQ2ODYyZn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiA4a1MvcyAgKi8gICAvKiBMVlBTQV9TUEVFRF9ISUdIICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjc0MTUxODY3OTA3NDk0MzFmLDAuMjI1NDQwOTAyNjM1NDU1MWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzM4MTQ1MTIwNDQxOTEzNmYsMC4yMjc5MjA5NjUyOTE1NTk3Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjc0MTUxODY3OTA3NDk0MzFmLDAuMjI1NDQwOTAyNjM1NDU1MWZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzIyOTcwNjMxOTA0OTAwMWYsMC4yMzg4OTg3MjI0NTQ5MDU1Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgey0wLjczMDk1ODEzNTMzMjkxMjJmLDAuMjMzMTU2ODIyNjIxODIyNGZ9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7LTAuNzIyOTcwNjMxOTA0OTAwMWYsMC4yMzg4OTg3MjI0NTQ5MDU1Zn0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogNDhrUy9zICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHstMC43Mjc0ODA3MzE5MDQ1MDY3ZiwwLjIzNTY2NjY1NDA3MjcwMTlmfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx7LTAuNzIyOTcwNjMxOTA0OTAwMWYsMC4yMzg4OTg3MjI0NTQ5MDU1Zn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsey0wLjcyNzQ4MDczMTkwNDUwNjdmLDAuMjM1NjY2NjU0MDcyNzAxOWZ9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLHstMC43MjI5NzA2MzE5MDQ5MDAxZiwwLjIzODg5ODcyMjQ1NDkwNTVmfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICx7LTAuNzI3NDgwNzMxOTA0NTA2N2YsMC4yMzU2NjY2NTQwNzI3MDE5Zn0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1NwZWN0cnVtQW5hbHl6ZXIvc3JjL0xWUFNBX1RhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY1ODcyZmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMvTFZQU0FfVGFibGVzLmgKQEAgLTAsMCArMSwxMjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fTFZQU0FfVEFCTEVTX0hfXworI2RlZmluZSBfX0xWUFNBX1RBQkxFU19IX18KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgU2FtcGxlIHJhdGUgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBTYW1wbGUgcmF0ZSB0YWJsZSBmb3IgY29udmVydGluZyBiZXR3ZWVuIHRoZSBlbnVtZXJhdGVkIHR5cGUgYW5kIHRoZSBhY3R1YWwKKyAqIGZyZXF1ZW5jeQorICovCitleHRlcm4gY29uc3QgTFZNX1VJTlQzMiAgICBMVlBTQV9TYW1wbGVSYXRlVGFiW107CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNhbXBsZSByYXRlIGludmVyc2UgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKgorICogU2FtcGxlIHJhdGUgdGFibGUgZm9yIGNvbnZlcnRpbmcgYmV0d2VlbiB0aGUgZW51bWVyYXRlZCB0eXBlIGFuZCB0aGUgYWN0dWFsCisgKiBmcmVxdWVuY3kKKyAqLworZXh0ZXJuIGNvbnN0IExWTV9VSU5UMzIgICAgTFZQU0FfU2FtcGxlUmF0ZUludlRhYltdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiAyMG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIG51bWJlciBvZiBzYW1wbGVzCisgKiBkdXJpbmcgMjBtcworICovCitleHRlcm4gY29uc3QgTFZNX1VJTlQxNiAgICBMVlBTQV9uU2FtcGxlc0J1ZmZlclVwZGF0ZVtdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBEb3duIHNhbXBsaW5nIGZhY3RvcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRhYmxlIGZvciBjb252ZXJ0aW5nIGJldHdlZW4gdGhlIGVudW1lcmF0ZWQgdHlwZSBhbmQgdGhlIGRvd24gc2FtcGxpbmcgZmFjdG9yCisgKi8KK2V4dGVybiBjb25zdCBMVk1fVUlOVDE2ICAgIExWUFNBX0Rvd25TYW1wbGluZ0ZhY3RvcltdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDb2VmZmljaWVudCBjYWxjdWxhdGlvbiB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyoKKyAqIFRhYmxlIGZvciAyICogUGkgLyBGcworICovCitleHRlcm4gY29uc3QgTFZNX0lOVDE2ICAgICBMVlBTQV9Ud29QaU9uRnNUYWJsZVtdOworZXh0ZXJuIGNvbnN0IExWTV9GTE9BVCAgICAgTFZQU0FfRmxvYXRfVHdvUGlPbkZzVGFibGVbXTsKKworLyoKKyAqIEdhaW4gdGFibGUKKyAqLworZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiAgICAgTFZQU0FfR2FpblRhYmxlW107CitleHRlcm4gY29uc3QgTFZNX0ZMT0FUICAgICBMVlBTQV9GbG9hdF9HYWluVGFibGVbXTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ29zb25lIHBvbHlub21pYWwgY29lZmZpY2llbnRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qCisgKiBDb2VmZmljaWVudHMgZm9yIGNhbGN1bGF0aW5nIHRoZSBjb3NpbmUgd2l0aCB0aGUgZXF1YXRpb246CisgKgorICogIENvcyh4KSA9ICgyXlNoaWZ0cykqKGEwICsgYTEqeCArIGEyKnheMiArIGEzKnheMyArIGE0KnheNCArIGE1KnheNSkKKyAqCisgKiBUaGVzZSBjb2VmZmljaWVudHMgZXhwZWN0IHRoZSBpbnB1dCwgeCwgdG8gYmUgaW4gdGhlIHJhbmdlIDAgdG8gMzI3NjggcmVzcHJlc2VudGluZworICogYSByYW5nZSBvZiAwIHRvIFBpLiBUaGUgb3V0cHV0IGlzIGluIHRoZSByYW5nZSAzMjc2NyB0byAtMzI3NjggcmVwcmVzZW50aW5nIHRoZSByYW5nZQorICogKzEuMCB0byAtMS4wCisgKi8KK2V4dGVybiBjb25zdCBMVk1fSU5UMTYgICAgIExWUFNBX0Nvc0NvZWZbXTsKK2V4dGVybiBjb25zdCBMVk1fRkxPQVQgICAgIExWUFNBX0Zsb2F0X0Nvc0NvZWZbXTsKKworLyoKKyAqIENvZWZmaWNpZW50cyBmb3IgY2FsY3VsYXRpbmcgdGhlIGNvc2luZSBlcnJvciB3aXRoIHRoZSBlcXVhdGlvbjoKKyAqCisgKiAgQ29zRXJyKHgpID0gKDJeU2hpZnRzKSooYTAgKyBhMSp4ICsgYTIqeF4yICsgYTMqeF4zKQorICoKKyAqIFRoZXNlIGNvZWZmaWNpZW50cyBleHBlY3QgdGhlIGlucHV0LCB4LCB0byBiZSBpbiB0aGUgcmFuZ2UgMCB0byAzMjc2OCByZXNwcmVzZW50aW5nCisgKiBhIHJhbmdlIG9mIDAgdG8gUGkvMjUuIFRoZSBvdXRwdXQgaXMgaW4gdGhlIHJhbmdlIDAgdG8gMzI3NjcgcmVwcmVzZW50aW5nIHRoZSByYW5nZQorICogMC4wIHRvIDAuMDA3ODg1Mjk4NgorICoKKyAqIFRoaXMgaXMgdXNlZCB0byBnaXZlIGEgZG91YmxlIHByZWNpc2lvbiBjb3NpbmUgb3ZlciB0aGUgcmFuZ2UgMCB0byBQaS8yNSB1c2luZyB0aGUKKyAqIHRoZSBlcXVhdGlvbjoKKyAqCisgKiBDb3MoeCkgPSAxLjAgLSBDb3NFcnIoeCkKKyAqLworZXh0ZXJuIGNvbnN0IExWTV9JTlQxNiAgICAgTFZQU0FfRFBDb3NDb2VmW107CitleHRlcm4gY29uc3QgTFZNX0ZMT0FUICAgIExWUFNBX0Zsb2F0X0RQQ29zQ29lZltdOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBRdWFzaSBwZWFrIGZpbHRlciBjb2VmZmljaWVudHMgdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2V4dGVybiBjb25zdCBRUERfQzMyX0NvZWZzICAgICBMVlBTQV9RUERfQ29lZnNbXTsKK2V4dGVybiBjb25zdCBRUERfRkxPQVRfQ29lZnMgICAgIExWUFNBX1FQRF9GbG9hdF9Db2Vmc1tdOworCisjZW5kaWYgLyogX19MVlBTQV9UQUJMRVNfSF9fICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliL0xWQ1MuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oCmluZGV4IGU3NTY5NWUuLjBhZGZkMWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9saWIvTFZDUy5oCkBAIC01NiwxMSArNTYsNiBAQAogI2lmbmRlZiBMVkNTX0gKICNkZWZpbmUgTFZDU19ICiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC03MCw3ICs2NSw2IEBACiAjaW5jbHVkZSAiTFZNX1R5cGVzLmgiCiAjaW5jbHVkZSAiTFZNX0NvbW1vbi5oIgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgRGVmaW5pdGlvbnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTkzLDcgKzg3LDYgQEAKICNkZWZpbmUgTFZDU19FVkVOVF9OT05FICAgICAgICAgICAgICAgICAgIDB4MDAwMCAgICAvKiBOb3QgYSB2YWxpZCBldmVudCAqLwogI2RlZmluZSBMVkNTX0VWRU5UX0FMR09GRiAgICAgICAgICAgICAgICAgMHgwMDAxICAgIC8qIENTIGhhcyBjb21wbGV0ZWQgc3dpdGNoIG9mZiAqLwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgVHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTEwMyw3ICs5Niw2IEBACiAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KIHR5cGVkZWYgdm9pZCAqTFZDU19IYW5kbGVfdDsKIAotCiAvKiBPcGVyYXRpbmcgbW9kZXMgKi8KIHR5cGVkZWYgZW51bQogewpAQCAtMTEyLDcgKzEwNCw2IEBACiAgICAgTFZDU19NQVggPSBMVk1fTUFYRU5VTQogfSBMVkNTX01vZGVzX2VuOwogCi0KIC8qIE1lbW9yeSBUeXBlcyAqLwogdHlwZWRlZiBlbnVtCiB7CkBAIC0xMjMsNyArMTE0LDYgQEAKICAgICBMVkNTX01FTU9SWVRZUEVfTUFYID0gTFZNX01BWEVOVU0KIH0gTFZDU19NZW1vcnlUeXBlc19lbjsKIAotCiAvKiBGdW5jdGlvbiByZXR1cm4gc3RhdHVzICovCiB0eXBlZGVmIGVudW0KIHsKQEAgLTEzNSw3ICsxMjUsNiBAQAogICAgIExWQ1NfU1RBVFVTTUFYICAgICAgPSBMVk1fTUFYRU5VTQogfSBMVkNTX1JldHVyblN0YXR1c19lbjsKIAotCiAvKgogICogU291cmNlIGRhdGEgZm9ybWF0cwogICovCkBAIC0xNDYsNyArMTM1LDYgQEAKICAgICBMVkNTX1NPVVJDRU1BWCAgICA9IExWTV9NQVhFTlVNCiB9IExWQ1NfU291cmNlRm9ybWF0X2VuOwogCi0KIC8qCiAgKiBTdXBwb3J0ZWQgb3V0cHV0IGRldmljZXMKICAqLwpAQCAtMTcyLDcgKzE2MCw2IEBACiAgICAgdm9pZCAgICAqcFRhYmxlODsKIH0gTFZDU19DU01TX0NvZWZfVGFibGVzX3Q7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTg3LDE0ICsxNzQsMTIgQEAKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqcEJhc2VBZGRyZXNzOyAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSByZWdpb24gYmFzZSBhZGRyZXNzICovCiB9IExWQ1NfTWVtb3J5UmVnaW9uX3Q7CiAKLQogLyogTWVtb3J5IHRhYmxlIGNvbnRhaW5pbmcgdGhlIHJlZ2lvbiBkZWZpbml0aW9ucyAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKICAgICBMVkNTX01lbW9yeVJlZ2lvbl90IFJlZ2lvbltMVkNTX05SX01FTU9SWV9SRUdJT05TXTsgLyogT25lIGRlZmluaXRpb24gZm9yIGVhY2ggcmVnaW9uICovCiB9IExWQ1NfTWVtVGFiX3Q7CiAKLQogLyogQ29uY2VydCBTb3VuZCBwYXJhbWV0ZXIgc3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtMjA1LDkgKzE5MCwxMSBAQAogICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgIFNhbXBsZVJhdGU7ICAgICAgICAgICAgIC8qIFNhbXBsaW5nIHJhdGUgKi8KICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBFZmZlY3RMZXZlbDsgICAgICAgICAgICAvKiBFZmZlY3QgbGV2ZWwgKi8KICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBSZXZlcmJMZXZlbDsgICAgICAgICAgICAvKiBSZXZlcmIgbGV2ZWwgaW4gJSAqLworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICBOckNoYW5uZWxzOworI2VuZGlmCiB9IExWQ1NfUGFyYW1zX3Q7CiAKLQogLyogQ29uY2VydCBTb3VuZCBDYXBhYmlsaXR5IHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKQEAgLTIyMCw3ICsyMDcsNiBAQAogCiB9IExWQ1NfQ2FwYWJpbGl0aWVzX3Q7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBGdW5jdGlvbiBQcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMjY3LDcgKzI1Myw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX01lbVRhYl90ICAgICAgICAgICpwTWVtb3J5VGFibGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0NhcGFiaWxpdGllc190ICAgICpwQ2FwYWJpbGl0aWVzKTsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zMDUsNyArMjkwLDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX01lbVRhYl90ICAgICAgICAgICAgKnBNZW1vcnlUYWJsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0NhcGFiaWxpdGllc190ICAgICAgKnBDYXBhYmlsaXRpZXMpOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgIExWQ1NfR2V0UGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTMyOSw3ICszMTMsNiBAQAogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19HZXRQYXJhbWV0ZXJzKExWQ1NfSGFuZGxlX3QgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICpwUGFyYW1zKTsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfQ29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zNTIsNyArMzM1LDYgQEAKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQ29udHJvbChMVkNTX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgKnBQYXJhbXMpOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19Qcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTM3NCwyMCArMzU2LDkgQEAKIC8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgKnBJbkRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAqcE91dERhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKLSNlbHNlCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1Byb2Nlc3MoTFZDU19IYW5kbGVfdCAgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOwotI2VuZGlmCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCiAKICNlbmRpZiAgLyogTFZDU19IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZTNjOWUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5jCisrKyAvZGV2L251bGwKQEAgLTEsMzg0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTFZDUy5oIgotI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkxWQ1NfQnlwYXNzTWl4LmgiCi0jaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgotI2luY2x1ZGUgIkxWQ1NfVGFibGVzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgRnVuY3Rpb24gUHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fSU5UMzIgTFZDU19NaXhlckNhbGxiYWNrKCAgIExWQ1NfSGFuZGxlX3QgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgICAgICAqcEdlbmVyYWxQdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgQ2FsbGJhY2tQYXJhbSk7Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfQnlwYXNzTWl4SW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluaXRpYWxpc2VzIHRoZSBieXBhc3MgbWl4ZXIgbW9kdWxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhlIG92ZXJhbGwgZ2FpbiBvZiB0aGUgcHJvY2Vzc2VkIHBhdGggaXMgc2V0IGJ5IHRoZSBnYWlucyBpbiB0aGUgaW5kaXZpZHVhbCAgICAqLwotLyogIHByb2Nlc3NpbmcgYmxvY2tzIGFuZCBieSB0aGUgZWZmZWN0IGxldmVsIGdhaW4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhlIHVucHJvY2Vzc2VkIHBhdGggbXVzdCBoYXZlIG1hdGNoaW5nIGdhaW4gZm9yIHRoZSBwcm9jZXNzZWQgcGF0aCB0byBlbnN1cmUgICAqLwotLyogIGFzIHRoZXkgYXJlIG1peGVkIHRvZ2V0aGVyIHRoZSBjb3JyZWN0IGVmZmVjdCBpcyBhY2hpZXZlZCwgdGhpcyBpcyB0aGUgdmFsdWUgICAgKi8KLS8qICBVbnByb2NMb3NzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoZSBvdmVyYWxsIGdhaW4gaXMgY29ycmVjdGVkIGJ5IGEgY29tYmluYXRpb24gb2YgYSBzaGlmdCB3aXRoIHNhdHVyYXRpb24gYW5kIGEgKi8KLS8qICBsaW5lYXIgc2NhbGVyLCBsb3NzLiBUaGUgbG9zcyBlbnN1cmVzIHRoZSBzdW0gaW4gdGhlIG1peGVyIGRvZXMgbm90IHNhdHVyYXRlICAgICovCi0vKiAgYW5kIGFsc28gY29ycmVjdHMgZm9yIGFueSBleGNlc3MgZ2FpbiBpbiB0aGUgc2hpZnQuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4SW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQotewotCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICBPZmZzZXQ7Ci0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0gICAgTFZNX1VJTlQzMiAgICAgICAgICBHYWluOwotICAgIExWTV9JTlQzMiAgICAgICAgICAgQ3VycmVudDsKLSNlbHNlCi0gICAgTFZNX0ZMT0FUICAgICAgICAgICBHYWluOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgQ3VycmVudDsKLSNlbmRpZgotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWQ1NfQnlwYXNzTWl4X3QgICAgKnBDb25maWcgICA9IChMVkNTX0J5cGFzc01peF90ICopJnBJbnN0YW5jZS0+QnlwYXNzTWl4OwotICAgIGNvbnN0IEdhaW5fdCAgICAgICAgKnBPdXRwdXRHYWluVGFibGU7Ci0KLQotCi0gICAgLyoKLSAgICAgKiBTZXQgdGhlIHRyYW5zaXRpb24gZ2FpbgotICAgICAqLwotICAgIGlmICgocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSA9PSBMVkNTX09OKSAmJgotICAgICAgICAocEluc3RhbmNlLT5iVGltZXJEb25lID09IExWTV9UUlVFKQotICAgICAgICAmJiAocEluc3RhbmNlLT5NU1RhcmdldDEgIT0gMHg3RkZGKSAvKiB0aGlzIGluZGljYXRlcyBhbiBvZmYtPm9uIHRyYW5zdGlvbiAqLwotICAgICAgICApCi0gICAgewotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgICAgICBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluID0gcFBhcmFtcy0+RWZmZWN0TGV2ZWw7Ci0jZWxzZQotICAgICAgICBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluID0gKChMVk1fRkxPQVQpcFBhcmFtcy0+RWZmZWN0TGV2ZWwgLyAzMjc2Nyk7Ci0jZW5kaWYKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogU2VsZWN0IG5vIGVmZmVjdCBsZXZlbCAqLwotICAgICAgICBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluID0gMDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENhbGN1bGF0ZSB0aGUgb3V0cHV0IGdhaW4gdGFibGUgb2Zmc2V0Ci0gICAgICovCi0gICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKHBQYXJhbXMtPlNwZWFrZXJUeXBlICsgKHBQYXJhbXMtPlNvdXJjZUZvcm1hdCooMStMVkNTX0VYX0hFQURQSE9ORVMpKSk7Ci0gICAgcE91dHB1dEdhaW5UYWJsZSA9IChHYWluX3QqKSZMVkNTX091dHB1dEdhaW5UYWJsZVswXTsKLQotICAgIC8qCi0gICAgICogU2V0dXAgdGhlIG1peGVyIGdhaW4gZm9yIHRoZSBwcm9jZXNzZWQgcGF0aAotICAgICAqLwotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgIEdhaW4gPSAoTFZNX1VJTlQzMikocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MgKiBwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKTsKLSNlbHNlCi0gICAgR2FpbiA9ICAoTFZNX0ZMT0FUKShwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uTG9zcyAqIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pOwotI2VuZGlmCi0KLSAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1BhcmFtID0gMDsKLSAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5wQ2FsbGJhY2tIYW5kbGUgPSBMVk1fTlVMTDsKLSAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5wQ2FsbEJhY2sgPSBMVk1fTlVMTDsKLSAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXS5DYWxsYmFja1NldD0xOwotCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0gICAgQ3VycmVudCA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSk7Ci0gICAgTFZDX01peGVyX0luaXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLChMVk1fSU5UMzIpKEdhaW4gPj4gMTUpLEN1cnJlbnQpOwotICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLExWQ1NfQllQQVNTX01JWEVSX1RDLHBQYXJhbXMtPlNhbXBsZVJhdGUsMik7Ci0jZWxzZQotICAgIEN1cnJlbnQgPSBMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0pOwotICAgIExWQ19NaXhlcl9Jbml0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwgKExWTV9GTE9BVCkoR2FpbiksIEN1cnJlbnQpOwotICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOwotI2VuZGlmCi0KLSAgICAvKgotICAgICAqIFNldHVwIHRoZSBtaXhlciBnYWluIGZvciB0aGUgdW5wcm9jZXNzZWQgcGF0aAotICAgICAqLwotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgIEdhaW4gPSAoTFZNX1VJTlQzMikocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MgKiAoMHg3RkZGIC0gcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbikpOwotICAgIEdhaW4gPSAoTFZNX1VJTlQzMilwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uVW5wcm9jTG9zcyAqIChHYWluID4+IDE1KTsKLSAgICBDdXJyZW50ID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdKTsKLSAgICBMVkNfTWl4ZXJfSW5pdCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sKExWTV9JTlQzMikoR2FpbiA+PiAxNSksQ3VycmVudCk7Ci0gICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sTFZDU19CWVBBU1NfTUlYRVJfVEMscFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKLSNlbHNlCi0gICAgR2FpbiA9IChMVk1fRkxPQVQpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzICogKDEuMCAtIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQpcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbikpOwotICAgIEdhaW4gPSAoTFZNX0ZMT0FUKXBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5VbnByb2NMb3NzICogR2FpbjsKLSAgICBDdXJyZW50ID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdKTsKLSAgICBMVkNfTWl4ZXJfSW5pdCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sIChMVk1fRkxPQVQpKEdhaW4pLCBDdXJyZW50KTsKLSAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKLSNlbmRpZgotICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gPSAwOwotICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSA9IGhJbnN0YW5jZTsKLSAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldD0xOwotICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayA9IExWQ1NfTWl4ZXJDYWxsYmFjazsKLQotICAgIC8qCi0gICAgICogU2V0dXAgdGhlIG91dHB1dCBnYWluIHNoaWZ0Ci0gICAgICovCi0gICAgcENvbmZpZy0+T3V0cHV0X1NoaWZ0ID0gcE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLlNoaWZ0OwotCi0KLSAgICAvKgotICAgICAqIENvcnJlY3QgZ2FpbiBmb3IgdGhlIGVmZmVjdCBsZXZlbAotICAgICAqLwotICAgIHsKLSNpZm5kZWYgQlVJTERfRkxPQVQKLSAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBHYWluQ29ycmVjdDsKLSAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBHYWluMTsKLSAgICAgICAgTFZNX0lOVDMyICAgICAgICAgICBHYWluMjsKLQotICAgICAgICBHYWluMSA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdKTsKLSAgICAgICAgR2FpbjIgPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENhbGN1bGF0ZSB0aGUgZ2FpbiBjb3JyZWN0aW9uCi0gICAgICAgICAqLwotICAgICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuQ29tcHJlc3Nvck1vZGUgPT0gTFZNX01PREVfT04pCi0gICAgICAgIHsKLSAgICAgICAgR2FpbkNvcnJlY3QgPSAoTFZNX0lOVDE2KSggIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5HYWluTWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICgoKExWTV9JTlQzMilwSW5zdGFuY2UtPlZvbENvcnJlY3QuR2Fpbk1pbiAqIChMVk1fSU5UMzIpcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbikgPj4gMTUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoKExWTV9JTlQzMilwSW5zdGFuY2UtPlZvbENvcnJlY3QuR2FpbkZ1bGwgKiAoTFZNX0lOVDMyKXBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pID4+IDE1KSApOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEFwcGx5IHRoZSBnYWluIGNvcnJlY3Rpb24gYW5kIHNoaWZ0LCBub3RlIHRoZSByZXN1bHQgaXMgaW4gUTMuMTMgZm9ybWF0Ci0gICAgICAgICAqLwotICAgICAgICBHYWluMSA9IChHYWluMSAqIEdhaW5Db3JyZWN0KSA8PCA0OwotICAgICAgICBHYWluMiA9IChHYWluMiAqIEdhaW5Db3JyZWN0KSA8PCA0OwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgR2FpbjEgPSBHYWluMSA8PCAxNjsKLSAgICAgICAgICAgIEdhaW4yID0gR2FpbjIgPDwgMTY7Ci0gICAgICAgIH0KLQotCi0KLSAgICAgICAgLyoKLSAgICAgICAgICogU2V0IHRoZSBnYWluIHZhbHVlcwotICAgICAgICAgKi8KLSAgICAgICAgcENvbmZpZy0+T3V0cHV0X1NoaWZ0ID0gcENvbmZpZy0+T3V0cHV0X1NoaWZ0OwotICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSxHYWluMT4+MTYpOwotICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSxMVkNTX0JZUEFTU19NSVhFUl9UQyxwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOwotICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSxHYWluMj4+MTYpOwotICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSxMVkNTX0JZUEFTU19NSVhFUl9UQyxwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOwotI2Vsc2UKLSAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBHYWluQ29ycmVjdDsKLSAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBHYWluMTsKLSAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICBHYWluMjsKLQotICAgICAgICBHYWluMSA9IExWQ19NaXhlcl9HZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdKTsKLSAgICAgICAgR2FpbjIgPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSk7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENhbGN1bGF0ZSB0aGUgZ2FpbiBjb3JyZWN0aW9uCi0gICAgICAgICAqLwotICAgICAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuQ29tcHJlc3Nvck1vZGUgPT0gTFZNX01PREVfT04pCi0gICAgICAgIHsKLSAgICAgICAgR2FpbkNvcnJlY3QgPSAoTFZNX0ZMT0FUKSggIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5HYWluTWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtICgoKExWTV9GTE9BVClwSW5zdGFuY2UtPlZvbENvcnJlY3QuR2Fpbk1pbiAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5HYWluRnVsbCAqIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChMVk1fRkxPQVQpcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbikpKSk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQXBwbHkgdGhlIGdhaW4gY29ycmVjdGlvbgotICAgICAgICAgKi8KLSAgICAgICAgR2FpbjEgPSAoR2FpbjEgKiBHYWluQ29ycmVjdCk7Ci0gICAgICAgIEdhaW4yID0gKEdhaW4yICogR2FpbkNvcnJlY3QpOwotCi0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBTZXQgdGhlIGdhaW4gdmFsdWVzCi0gICAgICAgICAqLwotICAgICAgICBwQ29uZmlnLT5PdXRwdXRfU2hpZnQgPSBwQ29uZmlnLT5PdXRwdXRfU2hpZnQ7Ci0gICAgICAgIExWQ19NaXhlcl9TZXRUYXJnZXQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLEdhaW4xKTsKLSAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOwotICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSxHYWluMik7Ci0gICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKLSNlbmRpZgotICAgIH0KLQotICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwotCi19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfQnlwYXNzTWl4ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEFwcGx5IEJ5cGFzcyBNaXguICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBtaXhlcyB0aGUgcHJvY2Vzc2VkIGFuZCB1bnByb2Nlc3NlZCBkYXRhIHN0cmVhbXMgdG9nZXRoZXIgdG8gY29ycmVjdCB0aGUgICAqLwotLyogIG92ZXJhbGwgc3lzdGVtIGdhaW4gYW5kIGFsbG93IHByb2dyZXNzaXZlIGNvbnRyb2wgb2YgdGhlIENvbmNlcnQgU291bmQgZWZmZWN0LiAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgV2hlbiB0aGUgYnlwYXNzIG1peGVyIGlzIGVuYWJsZWQgdGhlIG91dHB1dCBpcyB0aGUgcHJvY2Vzc2VkIHNpZ25hbCBvbmx5IGFuZCAgICAqLwotLyogIHdpdGhvdXQgZ2FpbiBjb3JyZWN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwUHJvY2Vzc2VkICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBwcm9jZXNzZWQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFVucHJvY2Vzc2VkICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgdW5wcm9jZXNzZWQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBPdXREYXRhICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBOdW1TYW1wbGVzICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0J5cGFzc01peGVyKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICpwVW5wcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqcE91dERhdGEsCi0jZWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcFVucHJvY2Vzc2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXREYXRhLAotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICBOdW1TYW1wbGVzKQotewotCi0gICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlICAgICAgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVkNTX0J5cGFzc01peF90ICAgICpwQ29uZmlnICAgICAgICA9IChMVkNTX0J5cGFzc01peF90ICopJnBJbnN0YW5jZS0+QnlwYXNzTWl4OwotCi0gICAgLyoKLSAgICAgKiBDaGVjayBpZiB0aGUgYnlwYXNzIG1peGVyIGlzIGVuYWJsZWQKLSAgICAgKi8KLSAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgJiBMVkNTX0JZUEFTU01JWFNXSVRDSCkgIT0gMCkKLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIEFwcGx5IHRoZSBieXBhc3MgbWl4Ci0gICAgICAgICAqLwotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgICAgICBMVkNfTWl4U29mdF8yU3RfRDE2QzMxX1NBVCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopIHBVbnByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSBvdXRwdXQgZ2FpbiBjb3JyZWN0aW9uIHNoaWZ0Ci0gICAgICAgICAqLwotICAgICAgICBTaGlmdF9TYXRfdjE2eHYxNiAoKExWTV9JTlQxNilwQ29uZmlnLT5PdXRwdXRfU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYqKXBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KilwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0Ki8KLSNlbHNlCi0gICAgICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKSBwVW5wcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOwotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSBvdXRwdXQgZ2FpbiBjb3JyZWN0aW9uIHNoaWZ0Ci0gICAgICAgICAqLwotICAgICAgICBTaGlmdF9TYXRfRmxvYXQoKExWTV9JTlQxNilwQ29uZmlnLT5PdXRwdXRfU2hpZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKilwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQqKXBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQqLwotI2VuZGlmCi0gICAgfQotCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19NaXhlckNhbGxiYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1MVk1fSU5UMzIgTFZDU19NaXhlckNhbGxiYWNrKExWQ1NfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICAqcEdlbmVyYWxQdXJwb3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgQ2FsbGJhY2tQYXJhbSkKLXsKLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLQotICAgKHZvaWQpcEdlbmVyYWxQdXJwb3NlOwotCi0gICAgLyoKLSAgICAgKiBPZmYgdHJhbnNpdGlvbiBoYXMgY29tcGxldGVkIGluIEhlYWRwaG9uZSBtb2RlCi0gICAgICovCi0gICAgaWYgKChwSW5zdGFuY2UtPk91dHB1dERldmljZSA9PSBMVkNTX0hFQURQSE9ORSkgJiYKLSAgICAgICAgKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24pICAgICAmJgotICAgICAgICAocEluc3RhbmNlLT5NU1RhcmdldDAgPT0gMHgwMDAwKSYmICAvKiB0aGlzIGluZGljYXRlcyBhbiBvbi0+b2ZmIHRyYW5zaXRpb24gKi8KLSAgICAgICAgKENhbGxiYWNrUGFyYW0gPT0gMCkpCi0gICAgewotICAgICAgICAvKiBTZXQgb3BlcmF0aW5nIG1vZGUgdG8gT0ZGICovCi0gICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBMVkNTX09GRjsKLQotICAgICAgICAvKiBFeGl0IHRyYW5zaXRpb24gc3RhdGUgKi8KLSAgICAgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9GQUxTRTsKLQotICAgICAgICAvKiBTaWduYWwgdG8gdGhlIGJ1bmRsZSAqLwotICAgICAgICBpZigoKnBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLkNhbGxCYWNrKSAhPSBMVk1fTlVMTCl7Ci0gICAgICAgICAgICAoKnBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLkNhbGxCYWNrKShwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5wQnVuZGxlSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBTEdPUklUSE1fQ1NfSUQgfCBMVkNTX0VWRU5UX0FMR09GRikpOwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICBpZiAoKHBJbnN0YW5jZS0+T3V0cHV0RGV2aWNlID09IExWQ1NfSEVBRFBIT05FKSAgJiYKLSAgICAgICAgKHBJbnN0YW5jZS0+TVNUYXJnZXQwID09IDEpICYmCi0gICAgICAgIChwSW5zdGFuY2UtPmJUaW1lckRvbmUgPT0gTFZNX1RSVUUpKXsKLQotICAgICAgICAvKiBFeGl0IHRyYW5zaXRpb24gc3RhdGUgKi8KLSAgICAgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9GQUxTRTsKLSAgICB9Ci0KLSAgICByZXR1cm4gMTsKLX0KLQotCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmExNTJjMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguY3BwCkBAIC0wLDAgKzEsMjg4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWQ1MuaCIKKyNpbmNsdWRlICJMVkNTX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVkNTX0J5cGFzc01peC5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJMVkNTX1RhYmxlcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEZ1bmN0aW9uIFByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZNX0lOVDMyIExWQ1NfTWl4ZXJDYWxsYmFjayggICBMVkNTX0hhbmRsZV90ICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgKnBHZW5lcmFsUHVycG9zZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgIENhbGxiYWNrUGFyYW0pOworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX0J5cGFzc01peEluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbml0aWFsaXNlcyB0aGUgYnlwYXNzIG1peGVyIG1vZHVsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBvdmVyYWxsIGdhaW4gb2YgdGhlIHByb2Nlc3NlZCBwYXRoIGlzIHNldCBieSB0aGUgZ2FpbnMgaW4gdGhlIGluZGl2aWR1YWwgICAgKi8KKy8qICBwcm9jZXNzaW5nIGJsb2NrcyBhbmQgYnkgdGhlIGVmZmVjdCBsZXZlbCBnYWluLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSB1bnByb2Nlc3NlZCBwYXRoIG11c3QgaGF2ZSBtYXRjaGluZyBnYWluIGZvciB0aGUgcHJvY2Vzc2VkIHBhdGggdG8gZW5zdXJlICAgKi8KKy8qICBhcyB0aGV5IGFyZSBtaXhlZCB0b2dldGhlciB0aGUgY29ycmVjdCBlZmZlY3QgaXMgYWNoaWV2ZWQsIHRoaXMgaXMgdGhlIHZhbHVlICAgICovCisvKiAgVW5wcm9jTG9zcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgb3ZlcmFsbCBnYWluIGlzIGNvcnJlY3RlZCBieSBhIGNvbWJpbmF0aW9uIG9mIGEgc2hpZnQgd2l0aCBzYXR1cmF0aW9uIGFuZCBhICovCisvKiAgbGluZWFyIHNjYWxlciwgbG9zcy4gVGhlIGxvc3MgZW5zdXJlcyB0aGUgc3VtIGluIHRoZSBtaXhlciBkb2VzIG5vdCBzYXR1cmF0ZSAgICAqLworLyogIGFuZCBhbHNvIGNvcnJlY3RzIGZvciBhbnkgZXhjZXNzIGdhaW4gaW4gdGhlIHNoaWZ0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBJbml0aWFsaXNhdGlvbiBwYXJhbWV0ZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0J5cGFzc01peEluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKK3sKKworICAgIExWTV9VSU5UMTYgICAgICAgICAgT2Zmc2V0OworICAgIExWTV9GTE9BVCAgICAgICAgICAgR2FpbjsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgIEN1cnJlbnQ7CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19CeXBhc3NNaXhfdCAgICAqcENvbmZpZyAgID0gKExWQ1NfQnlwYXNzTWl4X3QgKikmcEluc3RhbmNlLT5CeXBhc3NNaXg7CisgICAgY29uc3QgR2Fpbl90ICAgICAgICAqcE91dHB1dEdhaW5UYWJsZTsKKworICAgIC8qCisgICAgICogU2V0IHRoZSB0cmFuc2l0aW9uIGdhaW4KKyAgICAgKi8KKyAgICBpZiAoKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgPT0gTFZDU19PTikgJiYKKyAgICAgICAgKHBJbnN0YW5jZS0+YlRpbWVyRG9uZSA9PSBMVk1fVFJVRSkKKyAgICAgICAgJiYgKHBJbnN0YW5jZS0+TVNUYXJnZXQxICE9IDB4N0ZGRikgLyogdGhpcyBpbmRpY2F0ZXMgYW4gb2ZmLT5vbiB0cmFuc3Rpb24gKi8KKyAgICAgICAgKQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbiA9ICgoTFZNX0ZMT0FUKXBQYXJhbXMtPkVmZmVjdExldmVsIC8gMzI3NjcpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICAvKiBTZWxlY3Qgbm8gZWZmZWN0IGxldmVsICovCisgICAgICAgIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4gPSAwOworICAgIH0KKworICAgIC8qCisgICAgICogQ2FsY3VsYXRlIHRoZSBvdXRwdXQgZ2FpbiB0YWJsZSBvZmZzZXQKKyAgICAgKi8KKyAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNikocFBhcmFtcy0+U3BlYWtlclR5cGUgKyAocFBhcmFtcy0+U291cmNlRm9ybWF0KigxK0xWQ1NfRVhfSEVBRFBIT05FUykpKTsKKyAgICBwT3V0cHV0R2FpblRhYmxlID0gKEdhaW5fdCopJkxWQ1NfT3V0cHV0R2FpblRhYmxlWzBdOworCisgICAgLyoKKyAgICAgKiBTZXR1cCB0aGUgbWl4ZXIgZ2FpbiBmb3IgdGhlIHByb2Nlc3NlZCBwYXRoCisgICAgICovCisgICAgR2FpbiA9ICAoTFZNX0ZMT0FUKShwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uTG9zcyAqIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pOworCisgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tQYXJhbSA9IDA7CisgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0ucENhbGxiYWNrSGFuZGxlID0gTFZNX05VTEw7CisgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0ucENhbGxCYWNrID0gTFZNX05VTEw7CisgICAgcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0uQ2FsbGJhY2tTZXQ9MTsKKworICAgIEN1cnJlbnQgPSBMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0pOworICAgIExWQ19NaXhlcl9Jbml0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwgKExWTV9GTE9BVCkoR2FpbiksIEN1cnJlbnQpOworICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworCisgICAgLyoKKyAgICAgKiBTZXR1cCB0aGUgbWl4ZXIgZ2FpbiBmb3IgdGhlIHVucHJvY2Vzc2VkIHBhdGgKKyAgICAgKi8KKyAgICBHYWluID0gKExWTV9GTE9BVCkocE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLkxvc3MgKiAoMS4wIC0gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVClwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKSk7CisgICAgR2FpbiA9IChMVk1fRkxPQVQpcE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLlVucHJvY0xvc3MgKiBHYWluOworICAgIEN1cnJlbnQgPSBMVkNfTWl4ZXJfR2V0Q3VycmVudCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0pOworICAgIExWQ19NaXhlcl9Jbml0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwgKExWTV9GTE9BVCkoR2FpbiksIEN1cnJlbnQpOworICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrUGFyYW0gPSAwOworICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLnBDYWxsYmFja0hhbmRsZSA9IGhJbnN0YW5jZTsKKyAgICBwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldD0xOworICAgIHBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLnBDYWxsQmFjayA9IExWQ1NfTWl4ZXJDYWxsYmFjazsKKworICAgIC8qCisgICAgICogU2V0dXAgdGhlIG91dHB1dCBnYWluIHNoaWZ0CisgICAgICovCisgICAgcENvbmZpZy0+T3V0cHV0X1NoaWZ0ID0gcE91dHB1dEdhaW5UYWJsZVtPZmZzZXRdLlNoaWZ0OworCisgICAgLyoKKyAgICAgKiBDb3JyZWN0IGdhaW4gZm9yIHRoZSBlZmZlY3QgbGV2ZWwKKyAgICAgKi8KKyAgICB7CisgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgR2FpbkNvcnJlY3Q7CisgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgR2FpbjE7CisgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgR2FpbjI7CisKKyAgICAgICAgR2FpbjEgPSBMVkNfTWl4ZXJfR2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSk7CisgICAgICAgIEdhaW4yID0gTFZDX01peGVyX0dldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0pOworICAgICAgICAvKgorICAgICAgICAgKiBDYWxjdWxhdGUgdGhlIGdhaW4gY29ycmVjdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLkNvbXByZXNzb3JNb2RlID09IExWTV9NT0RFX09OKQorICAgICAgICB7CisgICAgICAgIEdhaW5Db3JyZWN0ID0gKExWTV9GTE9BVCkoICBwSW5zdGFuY2UtPlZvbENvcnJlY3QuR2Fpbk1pbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5NaW4gKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKExWTV9GTE9BVClwSW5zdGFuY2UtPlRyYW5zaXRpb25HYWluKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICgoKExWTV9GTE9BVClwSW5zdGFuY2UtPlZvbENvcnJlY3QuR2FpbkZ1bGwgKiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4pKSkpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IHRoZSBnYWluIGNvcnJlY3Rpb24KKyAgICAgICAgICovCisgICAgICAgIEdhaW4xID0gKEdhaW4xICogR2FpbkNvcnJlY3QpOworICAgICAgICBHYWluMiA9IChHYWluMiAqIEdhaW5Db3JyZWN0KTsKKworICAgICAgICB9CisKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0IHRoZSBnYWluIHZhbHVlcworICAgICAgICAgKi8KKyAgICAgICAgcENvbmZpZy0+T3V0cHV0X1NoaWZ0ID0gcENvbmZpZy0+T3V0cHV0X1NoaWZ0OworICAgICAgICBMVkNfTWl4ZXJfU2V0VGFyZ2V0KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSxHYWluMSk7CisgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBDb25maWctPk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyAgICAgICAgTFZDX01peGVyX1NldFRhcmdldCgmcENvbmZpZy0+TWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sR2FpbjIpOworICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQywgcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7CisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7CisKK30KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19CeXBhc3NNaXhlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQXBwbHkgQnlwYXNzIE1peC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIG1peGVzIHRoZSBwcm9jZXNzZWQgYW5kIHVucHJvY2Vzc2VkIGRhdGEgc3RyZWFtcyB0b2dldGhlciB0byBjb3JyZWN0IHRoZSAgICovCisvKiAgb3ZlcmFsbCBzeXN0ZW0gZ2FpbiBhbmQgYWxsb3cgcHJvZ3Jlc3NpdmUgY29udHJvbCBvZiB0aGUgQ29uY2VydCBTb3VuZCBlZmZlY3QuICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBXaGVuIHRoZSBieXBhc3MgbWl4ZXIgaXMgZW5hYmxlZCB0aGUgb3V0cHV0IGlzIHRoZSBwcm9jZXNzZWQgc2lnbmFsIG9ubHkgYW5kICAgICovCisvKiAgd2l0aG91dCBnYWluIGNvcnJlY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQcm9jZXNzZWQgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIHByb2Nlc3NlZCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwVW5wcm9jZXNzZWQgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSB1bnByb2Nlc3NlZCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4ZXIoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwUHJvY2Vzc2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBVbnByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICpwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CisKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgICAgICA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfQnlwYXNzTWl4X3QgICAgKnBDb25maWcgICAgICAgID0gKExWQ1NfQnlwYXNzTWl4X3QgKikmcEluc3RhbmNlLT5CeXBhc3NNaXg7CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBieXBhc3MgbWl4ZXIgaXMgZW5hYmxlZAorICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfQllQQVNTTUlYU1dJVENIKSAhPSAwKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogQXBwbHkgdGhlIGJ5cGFzcyBtaXgKKyAgICAgICAgICovCisgICAgICAgIExWQ19NaXhTb2Z0XzJTdF9EMTZDMzFfU0FUKCZwQ29uZmlnLT5NaXhlcl9JbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcFByb2Nlc3NlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKSBwVW5wcm9jZXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSBvdXRwdXQgZ2FpbiBjb3JyZWN0aW9uIHNoaWZ0CisgICAgICAgICAqLworICAgICAgICBTaGlmdF9TYXRfRmxvYXQoKExWTV9JTlQxNilwQ29uZmlnLT5PdXRwdXRfU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUKilwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQqKXBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQqLworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX01peGVyQ2FsbGJhY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWTV9JTlQzMiBMVkNTX01peGVyQ2FsbGJhY2soTFZDU19IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgICpwR2VuZXJhbFB1cnBvc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICBDYWxsYmFja1BhcmFtKQoreworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworCisgICAodm9pZClwR2VuZXJhbFB1cnBvc2U7CisKKyAgICAvKgorICAgICAqIE9mZiB0cmFuc2l0aW9uIGhhcyBjb21wbGV0ZWQgaW4gSGVhZHBob25lIG1vZGUKKyAgICAgKi8KKyAgICBpZiAoKHBJbnN0YW5jZS0+T3V0cHV0RGV2aWNlID09IExWQ1NfSEVBRFBIT05FKSAmJgorICAgICAgICAocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbikgICAgICYmCisgICAgICAgIChwSW5zdGFuY2UtPk1TVGFyZ2V0MCA9PSAweDAwMDApJiYgIC8qIHRoaXMgaW5kaWNhdGVzIGFuIG9uLT5vZmYgdHJhbnNpdGlvbiAqLworICAgICAgICAoQ2FsbGJhY2tQYXJhbSA9PSAwKSkKKyAgICB7CisgICAgICAgIC8qIFNldCBvcGVyYXRpbmcgbW9kZSB0byBPRkYgKi8KKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9IExWQ1NfT0ZGOworCisgICAgICAgIC8qIEV4aXQgdHJhbnNpdGlvbiBzdGF0ZSAqLworICAgICAgICBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID0gTFZNX0ZBTFNFOworCisgICAgICAgIC8qIFNpZ25hbCB0byB0aGUgYnVuZGxlICovCisgICAgICAgIGlmKCgqcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuQ2FsbEJhY2spICE9IExWTV9OVUxMKXsKKyAgICAgICAgICAgICgqcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuQ2FsbEJhY2spKHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLnBCdW5kbGVJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9OVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFMR09SSVRITV9DU19JRCB8IExWQ1NfRVZFTlRfQUxHT0ZGKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoKHBJbnN0YW5jZS0+T3V0cHV0RGV2aWNlID09IExWQ1NfSEVBRFBIT05FKSAgJiYKKyAgICAgICAgKHBJbnN0YW5jZS0+TVNUYXJnZXQwID09IDEpICYmCisgICAgICAgIChwSW5zdGFuY2UtPmJUaW1lckRvbmUgPT0gTFZNX1RSVUUpKXsKKworICAgICAgICAvKiBFeGl0IHRyYW5zaXRpb24gc3RhdGUgKi8KKyAgICAgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9IExWTV9GQUxTRTsKKyAgICB9CisKKyAgICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0J5cGFzc01peC5oCmluZGV4IGY2OWJhMzguLmZjZDhlZTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19CeXBhc3NNaXguaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQnlwYXNzTWl4LmgKQEAgLTE4LDExICsxOCw2IEBACiAjaWZuZGVmIF9fTFZDU19CWVBBU1NNSVhfSF9fCiAjZGVmaW5lIF9fTFZDU19CWVBBU1NNSVhfSF9fCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zMSw3ICsyNiw2IEBACiAKICNpbmNsdWRlICJMVkNfTWl4ZXIuaCIKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00MiwyNSArMzYsMTEgQEAKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgLyogTWl4ZXIgc2V0dGluZ3MgKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAogICAgIExWTWl4ZXIzXzJTdF9GTE9BVF9zdCAgIE1peGVyX0luc3RhbmNlOyAgICAgICAgICAgICAvKiBNaXhlciBpbnN0YW5jZSAqLwotI2Vsc2UKLSAgICBMVk1peGVyM18yU3Rfc3QgICAgICAgICBNaXhlcl9JbnN0YW5jZTsgICAgICAgICAgICAgLyogTWl4ZXIgaW5zdGFuY2UgKi8KLSNlbmRpZgogICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE91dHB1dF9TaGlmdDsgICAgICAgICAgICAgICAvKiBDb3JyZWN0aW5nIGdhaW4gb3V0cHV0IHNoaWZ0ICovCiAKIH0gTFZDU19CeXBhc3NNaXhfdDsKIAotI2lmbmRlZiBCVUlMRF9GTE9BVAotLyogT3V0cHV0IGdhaW4gdHlwZSAqLwotdHlwZWRlZiBzdHJ1Y3QKLXsKLSAgICAvKiBPdXRwdXQgZ2FpbiBzZXR0aW5ncywgR2FpbiA9IChMb3NzLzMyNzY4KSAqIDJeU2hpZnQgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBTaGlmdDsgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBzaGlmdHMgcmVxdWlyZWQgKi8KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBMb3NzOyAgICAgICAgICAgICAgICAgICAgICAgLyogTG9zcyByZXF1aXJlZCAqLwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIFVucHJvY0xvc3M7ICAgICAgICAgICAgICAgICAvKiBVbnByb2Nlc3NlZCBwYXRoIGxvc3MgKi8KLX0gR2Fpbl90OwotI2Vsc2UKIHR5cGVkZWYgc3RydWN0CiB7CiAgICAgLyogT3V0cHV0IGdhaW4gc2V0dGluZ3MsIEdhaW4gPSAoTG9zcy8zMjc2OCkgKiAyXlNoaWZ0ICovCkBAIC02OCw3ICs0OCw2IEBACiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICBMb3NzOyAgICAgICAgICAgICAgICAgICAgICAgLyogTG9zcyByZXF1aXJlZCAqLwogICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgVW5wcm9jTG9zczsgICAgICAgICAgICAgICAgIC8qIFVucHJvY2Vzc2VkIHBhdGggbG9zcyAqLwogfSBHYWluX3Q7Ci0jZW5kaWYKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC03OCwyMSArNTcsMTAgQEAKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfQnlwYXNzTWl4SW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICpwUGFyYW1zKTsKIAotI2lmbmRlZiBCVUlMRF9GTE9BVAotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19CeXBhc3NNaXhlcihMVkNTX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgKnBQcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqdW5Qcm9jZXNzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICBOdW1TYW1wbGVzKTsKLSNlbHNlCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0J5cGFzc01peGVyKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcFByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICp1blByb2Nlc3NlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICpwT3V0RGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgIE51bVNhbXBsZXMpOwotI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwogCiAjZW5kaWYgIC8qIEJZUEFTU01JWF9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQ29udHJvbC5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0NvbnRyb2wuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JmNmVjNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQ29udHJvbC5jCisrKyAvZGV2L251bGwKQEAgLTEsMjc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTFZDUy5oIgotI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkxWQ1NfVGFibGVzLmgiCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkNTX0dldFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFJlcXVlc3QgdGhlIENvbmNlcnQgU291bmQgcGFyYW1ldGVycy4gVGhlIGN1cnJlbnQgcGFyYW1ldGVyIHNldCBpcyByZXR1cm5lZCAgICAgKi8KLS8qICB2aWEgdGhlIHBhcmFtZXRlciBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkNTX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfR2V0UGFyYW1ldGVycyhMVkNTX0hhbmRsZV90ICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAqcFBhcmFtcykKLXsKLQotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9KExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0KLSAgICAqcFBhcmFtcyA9IHBJbnN0YW5jZS0+UGFyYW1zOwotCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Ci19Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19Db250cm9sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU2V0cyBvciBjaGFuZ2VzIHRoZSBDb25jZXJ0IFNvdW5kIHBhcmFtZXRlcnMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYSBwYXJhbWV0ZXIgc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGlzIGZ1bmN0aW9uIG11c3Qgbm90IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkNTX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0NvbnRyb2woTFZDU19IYW5kbGVfdCAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgKnBQYXJhbXMpCi17Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIE9mZnNldDsKLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAgICAgKnBJbnN0YW5jZSA9KExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gICAgICAgIGVycjsKLSAgICBMVkNTX01vZGVzX2VuICAgICAgICAgICAgICAgT3BlcmF0aW5nTW9kZVNhdmUgPSBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlOwotCi0gICAgaWYgKHBQYXJhbXMtPlNhbXBsZVJhdGUgIT0gcEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSkKLSAgICB7Ci0gICAgICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMuU2FtcGxpbmdSYXRlID0gTFZDU19TYW1wbGVSYXRlVGFibGVbcFBhcmFtcy0+U2FtcGxlUmF0ZV07Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBJZiB0aGUgcmV2ZXJiIGxldmVsIGhhcyBjaGFuZ2VkCi0gICAgICovCi0gICAgaWYocEluc3RhbmNlLT5QYXJhbXMuUmV2ZXJiTGV2ZWwgIT0gcFBhcmFtcy0+UmV2ZXJiTGV2ZWwpCi0gICAgewotICAgICAgICBlcnI9TFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KGhJbnN0YW5jZSxwUGFyYW1zKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIElmIHRoZSBzYW1wbGUgcmF0ZSBvciBzcGVha2VyIGhhcyBjaGFuZ2VkIHRoZW4gcGVyZm9ybSBhIGZ1bGwgcmUtaW5pdGlhbGlzYXRpb24KLSAgICAgKi8KLSAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSkgfHwKLSAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gcFBhcmFtcy0+U3BlYWtlclR5cGUpKQotICAgIHsKLSAgICAgICAgY29uc3QgTFZDU19Wb2xDb3JyZWN0X3QgKnBMVkNTX1ZvbENvcnJlY3RUYWJsZTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBPdXRwdXQgZGV2aWNlCi0gICAgICAgICAqLwotICAgICAgICBwSW5zdGFuY2UtPk91dHB1dERldmljZSA9IExWQ1NfSEVBRFBIT05FOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0aGUgdm9sdW1lIGNvcnJlY3Rpb24gcGFyYW1ldGVycwotICAgICAgICAgKi8KLSAgICAgICAgLyogVXNlIGludGVybmFsIGNvZWZmaWNpZW50IHRhYmxlICovCi0gICAgICAgIHBMVkNTX1ZvbENvcnJlY3RUYWJsZSA9IChMVkNTX1ZvbENvcnJlY3RfdCopJkxWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOwotICAgICAgICBPZmZzZXQgPSAoTFZNX0lOVDE2KShwUGFyYW1zLT5TcGVha2VyVHlwZSArIHBQYXJhbXMtPlNvdXJjZUZvcm1hdCooMStMVkNTX0VYX0hFQURQSE9ORVMpKTsKLQotICAgICAgICBwSW5zdGFuY2UtPlZvbENvcnJlY3QgPSBwTFZDU19Wb2xDb3JyZWN0VGFibGVbT2Zmc2V0XTsKLQotICAgICAgICBwSW5zdGFuY2UtPkNvbXByZXNzR2FpbiA9IHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluOwotI2lmZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwgMCwgMCk7Ci0jZWxzZQotICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sMCwwKTsKLSNlbmRpZgotICAgICAgICB7Ci0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0gICAgICAgICAgICBMVk1fVUlOVDMyICAgICAgICAgIEdhaW47Ci0gICAgICAgICAgICBjb25zdCBHYWluX3QgICAgICAgICpwT3V0cHV0R2FpblRhYmxlID0gKEdhaW5fdCopJkxWQ1NfT3V0cHV0R2FpblRhYmxlWzBdOwotICAgICAgICAgICAgR2FpbiA9IChMVk1fVUlOVDMyKShwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uTG9zcyAqIExWTV9NQVhJTlRfMTYpOwotICAgICAgICAgICAgR2FpbiA9IChMVk1fVUlOVDMyKXBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5VbnByb2NMb3NzICogKEdhaW4gPj4gMTUpOwotICAgICAgICAgICAgR2Fpbj1HYWluPj4xNTsKLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBBcHBseSB0aGUgZ2FpbiBjb3JyZWN0aW9uIGFuZCBzaGlmdCwgbm90ZSB0aGUgcmVzdWx0IGlzIGluIFEzLjEzIGZvcm1hdAotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBHYWluID0gKEdhaW4gKiBwSW5zdGFuY2UtPlZvbENvcnJlY3QuR2Fpbk1pbikgPj4xMjsKLQotICAgICAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLDAsR2Fpbik7Ci0gICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwKLSAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMscFBhcmFtcy0+U2FtcGxlUmF0ZSwyKTsKLSAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLAotICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQyxwUGFyYW1zLT5TYW1wbGVSYXRlLDIpOwotI2Vsc2UKLSAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICBHYWluOwotICAgICAgICAgICAgY29uc3QgR2Fpbl90ICAgICAgICAqcE91dHB1dEdhaW5UYWJsZSA9IChHYWluX3QqKSZMVkNTX091dHB1dEdhaW5UYWJsZVswXTsKLSAgICAgICAgICAgIEdhaW4gPSAoTFZNX0ZMT0FUKShwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uTG9zcyk7Ci0gICAgICAgICAgICBHYWluID0gKExWTV9GTE9BVClwT3V0cHV0R2FpblRhYmxlW09mZnNldF0uVW5wcm9jTG9zcyAqIChHYWluKTsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIEFwcGx5IHRoZSBnYWluIGNvcnJlY3Rpb24KLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgR2FpbiA9IChHYWluICogcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkdhaW5NaW4pOwotCi0gICAgICAgICAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sIDAsIEdhaW4pOwotICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sCi0gICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKLSAgICAgICAgICAgIExWQ19NaXhlcl9WYXJTbG9wZV9TZXRUaW1lQ29uc3RhbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLAotICAgICAgICAgICAgICAgICAgICBMVkNTX0JZUEFTU19NSVhFUl9UQywgcFBhcmFtcy0+U2FtcGxlUmF0ZSwgMik7Ci0jZW5kaWYKLSAgICAgICAgfQotCi0KLSAgICAgICAgZXJyPUxWQ1NfU0VuaGFuY2VySW5pdChoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsKLQotICAgICAgICBlcnI9TFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOwotCi0gICAgICAgIGVycj1MVkNTX0VxdWFsaXNlckluaXQoaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7Ci0KLSAgICAgICAgZXJyPUxWQ1NfQnlwYXNzTWl4SW5pdChoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsKLQotICAgIH0KLQotCi0gICAgLyoKLSAgICAgKiBDaGVjayBpZiB0aGUgZWZmZWN0IGxldmVsIG9yIHNvdXJjZSBmb3JtYXQgaGFzIGNoYW5nZWQKLSAgICAgKi8KLSAgICBlbHNlIGlmICgocEluc3RhbmNlLT5QYXJhbXMuRWZmZWN0TGV2ZWwgIT0gcFBhcmFtcy0+RWZmZWN0TGV2ZWwpIHx8Ci0gICAgICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ICE9IHBQYXJhbXMtPlNvdXJjZUZvcm1hdCkpCi0gICAgewotICAgICAgICBjb25zdCBMVkNTX1ZvbENvcnJlY3RfdCAqcExWQ1NfVm9sQ29ycmVjdFRhYmxlOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEdldCB0aGUgdm9sdW1lIGNvcnJlY3Rpb24gcGFyYW1ldGVycwotICAgICAgICAgKi8KLSAgICAgICAgLyogVXNlIGludGVybmFsIGNvZWZmaWNpZW50IHRhYmxlICovCi0gICAgICAgIHBMVkNTX1ZvbENvcnJlY3RUYWJsZSA9IChMVkNTX1ZvbENvcnJlY3RfdCopJkxWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOwotICAgICAgICBPZmZzZXQgPSAoTFZNX0lOVDE2KShwUGFyYW1zLT5TcGVha2VyVHlwZSArIHBQYXJhbXMtPlNvdXJjZUZvcm1hdCooMStMVkNTX0VYX0hFQURQSE9ORVMpKTsKLQotICAgICAgICBwSW5zdGFuY2UtPlZvbENvcnJlY3QgPSBwTFZDU19Wb2xDb3JyZWN0VGFibGVbT2Zmc2V0XTsKLQotICAgICAgICAvKiBVcGRhdGUgdGhlIGVmZmVjdCBsZXZlbCBhbmQgYWxwaGEtbWl4ZXIgZ2FpbnMgKi8KLSAgICAgICAgZXJyPUxWQ1NfQnlwYXNzTWl4SW5pdChoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsKLQotICAgICAgICBpZihlcnIgIT0gTFZDU19TVUNDRVNTKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zID0gKnBQYXJhbXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBVcGRhdGUgdGhlIGluc3RhbmNlIHBhcmFtZXRlcnMKLSAgICAgKi8KLSAgICBwSW5zdGFuY2UtPlBhcmFtcyA9ICpwUGFyYW1zOwotCi0gICAgLyogU3RheSBvbiB0aGUgY3VycmVudCBvcGVyYXRpbmcgbW9kZSB1bnRpbCB0aGUgdHJhbnNpdGlvbiBpcyBkb25lICovCi0gICAgaWYoKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gT3BlcmF0aW5nTW9kZVNhdmUpIHx8Ci0gICAgICAgKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gPT0gTFZNX1RSVUUpKXsKLQotICAgICAgICAvKiBTZXQgdGhlIHJldmVyYiBkZWxheSB0aW1lb3V0ICovCi0gICAgICAgIGlmKHBJbnN0YW5jZS0+YkluT3BlcmF0aW5nTW9kZVRyYW5zaXRpb24gIT0gTFZNX1RSVUUpewotICAgICAgICAgICAgcEluc3RhbmNlLT5iVGltZXJEb25lID0gTFZNX0ZBTFNFOwotICAgICAgICAgICAgcEluc3RhbmNlLT5UaW1lclBhcmFtcy5UaW1lSW5NcyA9Ci0gICAgICAgICAgICAoTFZNX0lOVDE2KSgoKHBJbnN0YW5jZS0+UmV2ZXJiZXJhdGlvbi5EZWxheVNpemUgPDwgMikKLSAgICAgICAgICAgIC9wSW5zdGFuY2UtPlRpbWVyUGFyYW1zLlNhbXBsaW5nUmF0ZSkgKyAxKTsKLSAgICAgICAgICAgIExWTV9UaW1lcl9Jbml0ICggJnBJbnN0YW5jZS0+VGltZXJJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBJbnN0YW5jZS0+VGltZXJQYXJhbXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyogVXBkYXRlIHRoZSBlZmZlY3QgbGV2ZWwgYW5kIGFscGhhLW1peGVyIGdhaW5zICovCi0gICAgICAgIGVycj1MVkNTX0J5cGFzc01peEluaXQoaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7Ci0KLSAgICAgICAgLyogQ2hhbmdlIHRyYW5zaXRpb24gYnlwYXNzIG1peGVyIHNldHRpbmdzIGlmIG5lZWRlZCBkZXBlbmRpbmcgb24gdHJhbnNpdGlvbiB0eXBlICovCi0gICAgICAgIGlmKHBQYXJhbXMtPk9wZXJhdGluZ01vZGUgIT0gTFZDU19PRkYpewotICAgICAgICAgICAgcEluc3RhbmNlLT5NU1RhcmdldDA9TFZNX01BWElOVF8xNjsKLSAgICAgICAgICAgIHBJbnN0YW5jZS0+TVNUYXJnZXQxPTA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID0gT3BlcmF0aW5nTW9kZVNhdmU7Ci0gICAgICAgICAgICBwSW5zdGFuY2UtPk1TVGFyZ2V0MT1MVk1fTUFYSU5UXzE2OwotICAgICAgICAgICAgcEluc3RhbmNlLT5NU1RhcmdldDA9MDsKLSAgICAgICAgfQotCi0KLSAgICAgICAgLyogU2V0IHRyYW5zaXRpb24gZmxhZyAqLwotICAgICAgICBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID0gTFZNX1RSVUU7Ci0gICAgfQotCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Ci19Ci0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19UaW1lckNhbGxCYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgQ2FsbEJhY2sgZnVuY3Rpb24gb2YgdGhlIFRpbWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi12b2lkIExWQ1NfVGltZXJDYWxsQmFjayAodm9pZCogaEluc3RhbmNlLCB2b2lkKiBwQ2FsbEJhY2tQYXJhbXMsIExWTV9JTlQzMiBDYWxsYmFja1BhcmFtKQotewotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSAgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLQotICAgIC8qIEF2b2lkIHdhcm5pbmdzIGJlY2F1c2UgcENhbGxCYWNrUGFyYW1zIGFuZCBDYWxsYmFja1BhcmFtIGFyZSBub3QgdXNlZCovCi0gICAgaWYoKHBDYWxsQmFja1BhcmFtcyAhPSBMVk1fTlVMTCkgfHwgKENhbGxiYWNrUGFyYW0gIT0gMCkpewotICAgICAgICBwQ2FsbEJhY2tQYXJhbXMgPSBoSW5zdGFuY2U7Ci0gICAgICAgIENhbGxiYWNrUGFyYW0gPSAwOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcEluc3RhbmNlLT5iVGltZXJEb25lID0gTFZNX1RSVUU7Ci0KLQotICAgIHJldHVybjsKLX0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0NvbnRyb2wuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0NvbnRyb2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwZGIwM2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfQ29udHJvbC5jcHAKQEAgLTAsMCArMSwyNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDUy5oIgorI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIgorI2luY2x1ZGUgIkxWQ1NfVGFibGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgICBMVkNTX0dldFBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFJlcXVlc3QgdGhlIENvbmNlcnQgU291bmQgcGFyYW1ldGVycy4gVGhlIGN1cnJlbnQgcGFyYW1ldGVyIHNldCBpcyByZXR1cm5lZCAgICAgKi8KKy8qICB2aWEgdGhlIHBhcmFtZXRlciBwb2ludGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICAgSW5zdGFuY2UgaGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkNTX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfR2V0UGFyYW1ldGVycyhMVkNTX0hhbmRsZV90ICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAqcFBhcmFtcykKK3sKKworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9KExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisKKyAgICAqcFBhcmFtcyA9IHBJbnN0YW5jZS0+UGFyYW1zOworCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfQ29udHJvbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFNldHMgb3IgY2hhbmdlcyB0aGUgQ29uY2VydCBTb3VuZCBwYXJhbWV0ZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIGEgcGFyYW1ldGVyIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZDU19Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Db250cm9sKExWQ1NfSGFuZGxlX3QgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICpwUGFyYW1zKQoreworICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBPZmZzZXQ7CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgICAgICpwSW5zdGFuY2UgPShMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuICAgICAgICBlcnI7CisgICAgTFZDU19Nb2Rlc19lbiAgICAgICAgICAgICAgIE9wZXJhdGluZ01vZGVTYXZlID0gcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZTsKKworICAgIGlmIChwUGFyYW1zLT5TYW1wbGVSYXRlICE9IHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUpCisgICAgeworICAgICAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLlNhbXBsaW5nUmF0ZSA9IExWQ1NfU2FtcGxlUmF0ZVRhYmxlW3BQYXJhbXMtPlNhbXBsZVJhdGVdOworICAgIH0KKworICAgIC8qCisgICAgICogSWYgdGhlIHJldmVyYiBsZXZlbCBoYXMgY2hhbmdlZAorICAgICAqLworICAgIGlmKHBJbnN0YW5jZS0+UGFyYW1zLlJldmVyYkxldmVsICE9IHBQYXJhbXMtPlJldmVyYkxldmVsKQorICAgIHsKKyAgICAgICAgZXJyPUxWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdChoSW5zdGFuY2UscFBhcmFtcyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBJZiB0aGUgc2FtcGxlIHJhdGUgb3Igc3BlYWtlciBoYXMgY2hhbmdlZCB0aGVuIHBlcmZvcm0gYSBmdWxsIHJlLWluaXRpYWxpc2F0aW9uCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8CisgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlICE9IHBQYXJhbXMtPlNwZWFrZXJUeXBlKSkKKyAgICB7CisgICAgICAgIGNvbnN0IExWQ1NfVm9sQ29ycmVjdF90ICpwTFZDU19Wb2xDb3JyZWN0VGFibGU7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogT3V0cHV0IGRldmljZQorICAgICAgICAgKi8KKyAgICAgICAgcEluc3RhbmNlLT5PdXRwdXREZXZpY2UgPSBMVkNTX0hFQURQSE9ORTsKKworICAgICAgICAvKgorICAgICAgICAgKiBHZXQgdGhlIHZvbHVtZSBjb3JyZWN0aW9uIHBhcmFtZXRlcnMKKyAgICAgICAgICovCisgICAgICAgIC8qIFVzZSBpbnRlcm5hbCBjb2VmZmljaWVudCB0YWJsZSAqLworICAgICAgICBwTFZDU19Wb2xDb3JyZWN0VGFibGUgPSAoTFZDU19Wb2xDb3JyZWN0X3QqKSZMVkNTX1ZvbENvcnJlY3RUYWJsZVswXTsKKyAgICAgICAgT2Zmc2V0ID0gKExWTV9JTlQxNikocFBhcmFtcy0+U3BlYWtlclR5cGUgKyBwUGFyYW1zLT5Tb3VyY2VGb3JtYXQqKDErTFZDU19FWF9IRUFEUEhPTkVTKSk7CisKKyAgICAgICAgcEluc3RhbmNlLT5Wb2xDb3JyZWN0ID0gcExWQ1NfVm9sQ29ycmVjdFRhYmxlW09mZnNldF07CisKKyAgICAgICAgcEluc3RhbmNlLT5Db21wcmVzc0dhaW4gPSBwSW5zdGFuY2UtPlZvbENvcnJlY3QuQ29tcE1pbjsKKyAgICAgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdLCAwLCAwKTsKKyAgICAgICAgeworICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgIEdhaW47CisgICAgICAgICAgICBjb25zdCBHYWluX3QgICAgICAgICpwT3V0cHV0R2FpblRhYmxlID0gKEdhaW5fdCopJkxWQ1NfT3V0cHV0R2FpblRhYmxlWzBdOworICAgICAgICAgICAgR2FpbiA9IChMVk1fRkxPQVQpKHBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5Mb3NzKTsKKyAgICAgICAgICAgIEdhaW4gPSAoTFZNX0ZMT0FUKXBPdXRwdXRHYWluVGFibGVbT2Zmc2V0XS5VbnByb2NMb3NzICogKEdhaW4pOworCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogQXBwbHkgdGhlIGdhaW4gY29ycmVjdGlvbgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBHYWluID0gKEdhaW4gKiBwSW5zdGFuY2UtPlZvbENvcnJlY3QuR2Fpbk1pbik7CisKKyAgICAgICAgICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXSwgMCwgR2Fpbik7CisgICAgICAgICAgICBMVkNfTWl4ZXJfVmFyU2xvcGVfU2V0VGltZUNvbnN0YW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwKKyAgICAgICAgICAgICAgICAgICAgTFZDU19CWVBBU1NfTUlYRVJfVEMsIHBQYXJhbXMtPlNhbXBsZVJhdGUsIDIpOworICAgICAgICAgICAgTFZDX01peGVyX1ZhclNsb3BlX1NldFRpbWVDb25zdGFudCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sCisgICAgICAgICAgICAgICAgICAgIExWQ1NfQllQQVNTX01JWEVSX1RDLCBwUGFyYW1zLT5TYW1wbGVSYXRlLCAyKTsKKyAgICAgICAgfQorCisgICAgICAgIGVycj1MVkNTX1NFbmhhbmNlckluaXQoaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7CisKKyAgICAgICAgZXJyPUxWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdChoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsKKworICAgICAgICBlcnI9TFZDU19FcXVhbGlzZXJJbml0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOworCisgICAgICAgIGVycj1MVkNTX0J5cGFzc01peEluaXQoaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcFBhcmFtcyk7CisKKyAgICB9CisKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBlZmZlY3QgbGV2ZWwgb3Igc291cmNlIGZvcm1hdCBoYXMgY2hhbmdlZAorICAgICAqLworICAgIGVsc2UgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5FZmZlY3RMZXZlbCAhPSBwUGFyYW1zLT5FZmZlY3RMZXZlbCkgfHwKKyAgICAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgIT0gcFBhcmFtcy0+U291cmNlRm9ybWF0KSkKKyAgICB7CisgICAgICAgIGNvbnN0IExWQ1NfVm9sQ29ycmVjdF90ICpwTFZDU19Wb2xDb3JyZWN0VGFibGU7CisKKyAgICAgICAgLyoKKyAgICAgICAgICogR2V0IHRoZSB2b2x1bWUgY29ycmVjdGlvbiBwYXJhbWV0ZXJzCisgICAgICAgICAqLworICAgICAgICAvKiBVc2UgaW50ZXJuYWwgY29lZmZpY2llbnQgdGFibGUgKi8KKyAgICAgICAgcExWQ1NfVm9sQ29ycmVjdFRhYmxlID0gKExWQ1NfVm9sQ29ycmVjdF90KikmTFZDU19Wb2xDb3JyZWN0VGFibGVbMF07CisgICAgICAgIE9mZnNldCA9IChMVk1fSU5UMTYpKHBQYXJhbXMtPlNwZWFrZXJUeXBlICsgcFBhcmFtcy0+U291cmNlRm9ybWF0KigxK0xWQ1NfRVhfSEVBRFBIT05FUykpOworCisgICAgICAgIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdCA9IHBMVkNTX1ZvbENvcnJlY3RUYWJsZVtPZmZzZXRdOworCisgICAgICAgIC8qIFVwZGF0ZSB0aGUgZWZmZWN0IGxldmVsIGFuZCBhbHBoYS1taXhlciBnYWlucyAqLworICAgICAgICBlcnI9TFZDU19CeXBhc3NNaXhJbml0KGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHBQYXJhbXMpOworCisgICAgICAgIGlmKGVyciAhPSBMVkNTX1NVQ0NFU1MpCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcEluc3RhbmNlLT5QYXJhbXMgPSAqcFBhcmFtczsKKyAgICB9CisKKyAgICAvKgorICAgICAqIFVwZGF0ZSB0aGUgaW5zdGFuY2UgcGFyYW1ldGVycworICAgICAqLworICAgIHBJbnN0YW5jZS0+UGFyYW1zID0gKnBQYXJhbXM7CisKKyAgICAvKiBTdGF5IG9uIHRoZSBjdXJyZW50IG9wZXJhdGluZyBtb2RlIHVudGlsIHRoZSB0cmFuc2l0aW9uIGlzIGRvbmUgKi8KKyAgICBpZigocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBPcGVyYXRpbmdNb2RlU2F2ZSkgfHwKKyAgICAgICAocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSkpeworCisgICAgICAgIC8qIFNldCB0aGUgcmV2ZXJiIGRlbGF5IHRpbWVvdXQgKi8KKyAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiAhPSBMVk1fVFJVRSl7CisgICAgICAgICAgICBwSW5zdGFuY2UtPmJUaW1lckRvbmUgPSBMVk1fRkFMU0U7CisgICAgICAgICAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLlRpbWVJbk1zID0KKyAgICAgICAgICAgIChMVk1fSU5UMTYpKCgocEluc3RhbmNlLT5SZXZlcmJlcmF0aW9uLkRlbGF5U2l6ZSA8PCAyKQorICAgICAgICAgICAgL3BJbnN0YW5jZS0+VGltZXJQYXJhbXMuU2FtcGxpbmdSYXRlKSArIDEpOworICAgICAgICAgICAgTFZNX1RpbWVyX0luaXQgKCAmcEluc3RhbmNlLT5UaW1lckluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5UaW1lclBhcmFtcyk7CisgICAgICAgIH0KKworICAgICAgICAvKiBVcGRhdGUgdGhlIGVmZmVjdCBsZXZlbCBhbmQgYWxwaGEtbWl4ZXIgZ2FpbnMgKi8KKyAgICAgICAgZXJyPUxWQ1NfQnlwYXNzTWl4SW5pdChoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwUGFyYW1zKTsKKworICAgICAgICAvKiBDaGFuZ2UgdHJhbnNpdGlvbiBieXBhc3MgbWl4ZXIgc2V0dGluZ3MgaWYgbmVlZGVkIGRlcGVuZGluZyBvbiB0cmFuc2l0aW9uIHR5cGUgKi8KKyAgICAgICAgaWYocFBhcmFtcy0+T3BlcmF0aW5nTW9kZSAhPSBMVkNTX09GRil7CisgICAgICAgICAgICBwSW5zdGFuY2UtPk1TVGFyZ2V0MD1MVk1fTUFYSU5UXzE2OworICAgICAgICAgICAgcEluc3RhbmNlLT5NU1RhcmdldDE9MDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPSBPcGVyYXRpbmdNb2RlU2F2ZTsKKyAgICAgICAgICAgIHBJbnN0YW5jZS0+TVNUYXJnZXQxPUxWTV9NQVhJTlRfMTY7CisgICAgICAgICAgICBwSW5zdGFuY2UtPk1TVGFyZ2V0MD0wOworICAgICAgICB9CisKKyAgICAgICAgLyogU2V0IHRyYW5zaXRpb24gZmxhZyAqLworICAgICAgICBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID0gTFZNX1RSVUU7CisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19UaW1lckNhbGxCYWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgQ2FsbEJhY2sgZnVuY3Rpb24gb2YgdGhlIFRpbWVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCit2b2lkIExWQ1NfVGltZXJDYWxsQmFjayAodm9pZCogaEluc3RhbmNlLCB2b2lkKiBwQ2FsbEJhY2tQYXJhbXMsIExWTV9JTlQzMiBDYWxsYmFja1BhcmFtKQoreworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSAgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKworICAgIC8qIEF2b2lkIHdhcm5pbmdzIGJlY2F1c2UgcENhbGxCYWNrUGFyYW1zIGFuZCBDYWxsYmFja1BhcmFtIGFyZSBub3QgdXNlZCovCisgICAgaWYoKHBDYWxsQmFja1BhcmFtcyAhPSBMVk1fTlVMTCkgfHwgKENhbGxiYWNrUGFyYW0gIT0gMCkpeworICAgICAgICBwQ2FsbEJhY2tQYXJhbXMgPSBoSW5zdGFuY2U7CisgICAgICAgIENhbGxiYWNrUGFyYW0gPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgcEluc3RhbmNlLT5iVGltZXJEb25lID0gTFZNX1RSVUU7CisKKyAgICByZXR1cm47Cit9CisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM1MzEyZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmMKKysrIC9kZXYvbnVsbApAQCAtMSwyNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJMVkNTLmgiCi0jaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZDU19FcXVhbGlzZXIuaCIKLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCi0jaW5jbHVkZSAiTFZDU19UYWJsZXMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19FcXVhbGlzZXJJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW5pdGlhbGlzZXMgdGhlIGVxdWFsaXNlciBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGUgZnVuY3Rpb24gc2VsZWN0cyB0aGUgY29lZmZpY2llbnRzIGZvciB0aGUgZmlsdGVycyBhbmQgY2xlYXJzIHRoZSBkYXRhICAgICAgICovCi0vKiAgaGlzdG9yeS4gSXQgaXMgYWxzbyB1c2VkIGZvciByZS1pbml0aWFsaXNhdGlvbiB3aGVuIG9uZSBvZiB0aGUgc3lzdGVtIGNvbnRyb2wgICAqLwotLyogIHBhcmFtZXRlcnMgY2hhbmdlcyBidXQgd2lsbCBvbmx5IGNoYW5nZSB0aGUgY29lZmZpY2llbnRzIGFuZCBjbGVhciB0aGUgaGlzdG9yeSAgKi8KLS8qICBpZiB0aGUgc2FtcGxlIHJhdGUgb3Igc3BlYWtlciB0eXBlIGhhcyBjaGFuZ2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRvIGF2b2lkIGV4Y2Vzc2l2ZSB0ZXN0aW5nIGR1cmluZyB0aGUgc2FtcGxlIHByb2Nlc3NpbmcgdGhlIGJpcXVhZCB0eXBlIGlzICAgICAgKi8KLS8qICBzZXQgYXMgYSBjYWxsYmFjayBmdW5jdGlvbiBpbiB0aGUgaW5pdCByb3V0aW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCi17Ci0KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgIE9mZnNldDsKLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVkNTX0VxdWFsaXNlcl90ICAgICpwQ29uZmlnICAgPSAoTFZDU19FcXVhbGlzZXJfdCAqKSZwSW5zdGFuY2UtPkVxdWFsaXNlcjsKLSAgICBMVkNTX0RhdGFfdCAgICAgICAgICpwRGF0YTsKLSAgICBMVkNTX0NvZWZmaWNpZW50X3QgICpwQ29lZmZpY2llbnRzOwotICAgIEJRX0ZMT0FUX0NvZWZzX3QgICAgICBDb2VmZnM7Ci0gICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAqcEVxdWFsaXNlckNvZWZUYWJsZTsKLQotICAgIHBEYXRhID0gKExWQ1NfRGF0YV90ICopIFwKLSAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzOwotCi0gICAgcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAotICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7Ci0gICAgLyoKLSAgICAgKiBJZiB0aGUgc2FtcGxlIHJhdGUgY2hhbmdlcyByZS1pbml0aWFsaXNlIHRoZSBmaWx0ZXJzCi0gICAgICovCi0gICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8Ci0gICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAhPSBwUGFyYW1zLT5TcGVha2VyVHlwZSkpCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBTZXR1cCB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhbmQgY2xlYXIgdGhlIGhpc3RvcnkKLSAgICAgICAgICovCi0gICAgICAgIE9mZnNldCA9IChMVk1fVUlOVDE2KShwUGFyYW1zLT5TYW1wbGVSYXRlICsgKHBQYXJhbXMtPlNwZWFrZXJUeXBlICogKDEgKyBMVk1fRlNfNDgwMDApKSk7Ci0gICAgICAgIHBFcXVhbGlzZXJDb2VmVGFibGUgPSAoQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCopJkxWQ1NfRXF1YWxpc2VyQ29lZlRhYmxlWzBdOwotCi0gICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0IGZpbHRlcnMgKi8KLSAgICAgICAgLyogQ29udmVydCBpbmNvbWluZyBjb2VmZmljaWVudHMgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC9vcmRlcmluZyAqLwotICAgICAgICBDb2VmZnMuQTAgPSAoTFZNX0ZMT0FUKSBwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQTA7Ci0gICAgICAgIENvZWZmcy5BMSA9IChMVk1fRkxPQVQpIHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5BMTsKLSAgICAgICAgQ29lZmZzLkEyID0gKExWTV9GTE9BVCkgcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkEyOwotICAgICAgICBDb2VmZnMuQjEgPSAoTFZNX0ZMT0FUKS1wRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQjE7Ci0gICAgICAgIENvZWZmcy5CMiA9IChMVk1fRkxPQVQpLXBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5CMjsKLQotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoKExWTV9JTlQxNikwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBEYXRhLT5FcXVhbGlzZXJCaXF1YWRUYXBzLCAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwRGF0YS0+RXF1YWxpc2VyQmlxdWFkVGFwcykgLyBzaXplb2YoTFZNX0ZMT0FUKSkpOwotCi0gICAgICAgIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudHMtPkVxdWFsaXNlckJpcXVhZEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+RXF1YWxpc2VyQmlxdWFkVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzKTsKLQotICAgICAgICAvKiBDYWxsYmFja3MgKi8KLSAgICAgICAgc3dpdGNoKHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Ci19Ci0jZWxzZQotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCi17Ci0KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgIE9mZnNldDsKLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVkNTX0VxdWFsaXNlcl90ICAgICpwQ29uZmlnICAgPSAoTFZDU19FcXVhbGlzZXJfdCAqKSZwSW5zdGFuY2UtPkVxdWFsaXNlcjsKLSAgICBMVkNTX0RhdGFfdCAgICAgICAgICpwRGF0YSAgICAgPSAoTFZDU19EYXRhX3QgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfREFUQV0ucEJhc2VBZGRyZXNzOwotICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgKnBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKLSAgICBCUV9DMTZfQ29lZnNfdCAgICAgIENvZWZmczsKLSAgICBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICpwRXF1YWxpc2VyQ29lZlRhYmxlOwotCi0gICAgLyoKLSAgICAgKiBJZiB0aGUgc2FtcGxlIHJhdGUgY2hhbmdlcyByZS1pbml0aWFsaXNlIHRoZSBmaWx0ZXJzCi0gICAgICovCi0gICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8Ci0gICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAhPSBwUGFyYW1zLT5TcGVha2VyVHlwZSkpCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBTZXR1cCB0aGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhbmQgY2xlYXIgdGhlIGhpc3RvcnkKLSAgICAgICAgICovCi0gICAgICAgIE9mZnNldCA9IChMVk1fVUlOVDE2KShwUGFyYW1zLT5TYW1wbGVSYXRlICsgKHBQYXJhbXMtPlNwZWFrZXJUeXBlICogKDErTFZNX0ZTXzQ4MDAwKSkpOwotICAgICAgICBwRXF1YWxpc2VyQ29lZlRhYmxlID0gKEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QqKSZMVkNTX0VxdWFsaXNlckNvZWZUYWJsZVswXTsKLQotICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCBmaWx0ZXJzICovCi0gICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KLSAgICAgICAgQ29lZmZzLkEwID0gKExWTV9JTlQxNikgcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkEwOwotICAgICAgICBDb2VmZnMuQTEgPSAoTFZNX0lOVDE2KSBwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQTE7Ci0gICAgICAgIENvZWZmcy5BMiA9IChMVk1fSU5UMTYpIHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5BMjsKLSAgICAgICAgQ29lZmZzLkIxID0gKExWTV9JTlQxNiktcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkIxOwotICAgICAgICBDb2VmZnMuQjIgPSAoTFZNX0lOVDE2KS1wRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQjI7Ci0KLSAgICAgICAgTG9hZENvbnN0XzE2KChMVk1fSU5UMTYpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KLSAgICAgICAgICAgICAgICAgICAgICh2b2lkICopJnBEYXRhLT5FcXVhbGlzZXJCaXF1YWRUYXBzLCAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KLSAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPkVxdWFsaXNlckJpcXVhZFRhcHMpL3NpemVvZihMVk1fSU5UMTYpKSk7ICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLwotCi0gICAgICAgIEJRXzJJX0QxNkYzMkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudHMtPkVxdWFsaXNlckJpcXVhZEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+RXF1YWxpc2VyQmlxdWFkVGFwcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzKTsKLQotICAgICAgICAvKiBDYWxsYmFja3MgKi8KLSAgICAgICAgc3dpdGNoKHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjMyQzEzX1RSQ19XUkFfMDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMzJDMTRfVFJDX1dSQV8wMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYzMkMxNV9UUkNfV1JBXzAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Ci19Ci0jZW5kaWYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfRXF1YWxpc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEFwcGx5IHRoZSBlcXVhbGlzZXIgZmlsdGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwSW5wdXRPdXRwdXQgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dC9vdXRwdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgVGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIEFsd2F5cyBwcm9jZXNzZXMgaW4gcGxhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VyKExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcElucHV0T3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKQotewotCi0gICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZDU19FcXVhbGlzZXJfdCAgICAqcENvbmZpZyAgID0gKExWQ1NfRXF1YWxpc2VyX3QgICopJnBJbnN0YW5jZS0+RXF1YWxpc2VyOwotICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgKnBDb2VmZmljaWVudHM7Ci0KLQotICAgIHBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopIFwKLSAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7Ci0KLQotICAgIC8qCi0gICAgICogQ2hlY2sgaWYgdGhlIGVxdWFsaXNlciBpcyByZXF1aXJlZAotICAgICAqLwotICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfRVFVQUxJU0VSU1dJVENIKSAhPSAwKQotICAgIHsKLSAgICAgICAgLyogQXBwbHkgZmlsdGVyIHRvIHRoZSBsZWZ0IGFuZCByaWdodCBjaGFubmVscyAqLwotICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrKSgoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqKSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDb2VmZmljaWVudHMtPkVxdWFsaXNlckJpcXVhZEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5wdXRPdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbnB1dE91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgIH0KLQotICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwotfQotI2Vsc2UKLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VyKExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAqcElucHV0T3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICBOdW1TYW1wbGVzKQotewotCi0gICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZDU19FcXVhbGlzZXJfdCAgICAqcENvbmZpZyAgID0gKExWQ1NfRXF1YWxpc2VyX3QgICopJnBJbnN0YW5jZS0+RXF1YWxpc2VyOwotICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgKnBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKLQotCi0gICAgLyoKLSAgICAgKiBDaGVjayBpZiB0aGUgZXF1YWxpc2VyIGlzIHJlcXVpcmVkCi0gICAgICovCi0gICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19FUVVBTElTRVJTV0lUQ0gpICE9IDApCi0gICAgewotICAgICAgICAvKiBBcHBseSBmaWx0ZXIgdG8gdGhlIGxlZnQgYW5kIHJpZ2h0IGNoYW5uZWxzICovCi0gICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2spKChCaXF1YWRfSW5zdGFuY2VfdCopJnBDb2VmZmljaWVudHMtPkVxdWFsaXNlckJpcXVhZEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcElucHV0T3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcElucHV0T3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotICAgIH0KLQotICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMWI3ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmNwcApAQCAtMCwwICsxLDE2NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNTLmgiCisjaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZDU19FcXVhbGlzZXIuaCIKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCisjaW5jbHVkZSAiTFZDU19UYWJsZXMuaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19FcXVhbGlzZXJJbml0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5pdGlhbGlzZXMgdGhlIGVxdWFsaXNlciBtb2R1bGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgZnVuY3Rpb24gc2VsZWN0cyB0aGUgY29lZmZpY2llbnRzIGZvciB0aGUgZmlsdGVycyBhbmQgY2xlYXJzIHRoZSBkYXRhICAgICAgICovCisvKiAgaGlzdG9yeS4gSXQgaXMgYWxzbyB1c2VkIGZvciByZS1pbml0aWFsaXNhdGlvbiB3aGVuIG9uZSBvZiB0aGUgc3lzdGVtIGNvbnRyb2wgICAqLworLyogIHBhcmFtZXRlcnMgY2hhbmdlcyBidXQgd2lsbCBvbmx5IGNoYW5nZSB0aGUgY29lZmZpY2llbnRzIGFuZCBjbGVhciB0aGUgaGlzdG9yeSAgKi8KKy8qICBpZiB0aGUgc2FtcGxlIHJhdGUgb3Igc3BlYWtlciB0eXBlIGhhcyBjaGFuZ2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRvIGF2b2lkIGV4Y2Vzc2l2ZSB0ZXN0aW5nIGR1cmluZyB0aGUgc2FtcGxlIHByb2Nlc3NpbmcgdGhlIGJpcXVhZCB0eXBlIGlzICAgICAgKi8KKy8qICBzZXQgYXMgYSBjYWxsYmFjayBmdW5jdGlvbiBpbiB0aGUgaW5pdCByb3V0aW5lLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfRXF1YWxpc2VySW5pdChMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAgICpwUGFyYW1zKQoreworCisgICAgTFZNX1VJTlQxNiAgICAgICAgICBPZmZzZXQ7CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19FcXVhbGlzZXJfdCAgICAqcENvbmZpZyAgID0gKExWQ1NfRXF1YWxpc2VyX3QgKikmcEluc3RhbmNlLT5FcXVhbGlzZXI7CisgICAgTFZDU19EYXRhX3QgICAgICAgICAqcERhdGE7CisgICAgTFZDU19Db2VmZmljaWVudF90ICAqcENvZWZmaWNpZW50czsKKyAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgQ29lZmZzOworICAgIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgKnBFcXVhbGlzZXJDb2VmVGFibGU7CisKKyAgICBwRGF0YSA9IChMVkNTX0RhdGFfdCAqKSBcCisgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzczsKKworICAgIHBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopIFwKKyAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworICAgIC8qCisgICAgICogSWYgdGhlIHNhbXBsZSByYXRlIGNoYW5nZXMgcmUtaW5pdGlhbGlzZSB0aGUgZmlsdGVycworICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSB8fAorICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gcFBhcmFtcy0+U3BlYWtlclR5cGUpKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0dXAgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgYW5kIGNsZWFyIHRoZSBoaXN0b3J5CisgICAgICAgICAqLworICAgICAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNikocFBhcmFtcy0+U2FtcGxlUmF0ZSArIChwUGFyYW1zLT5TcGVha2VyVHlwZSAqICgxICsgTFZNX0ZTXzQ4MDAwKSkpOworICAgICAgICBwRXF1YWxpc2VyQ29lZlRhYmxlID0gKEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QqKSZMVkNTX0VxdWFsaXNlckNvZWZUYWJsZVswXTsKKworICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCBmaWx0ZXJzICovCisgICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KKyAgICAgICAgQ29lZmZzLkEwID0gKExWTV9GTE9BVCkgcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkEwOworICAgICAgICBDb2VmZnMuQTEgPSAoTFZNX0ZMT0FUKSBwRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQTE7CisgICAgICAgIENvZWZmcy5BMiA9IChMVk1fRkxPQVQpIHBFcXVhbGlzZXJDb2VmVGFibGVbT2Zmc2V0XS5BMjsKKyAgICAgICAgQ29lZmZzLkIxID0gKExWTV9GTE9BVCktcEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLkIxOworICAgICAgICBDb2VmZnMuQjIgPSAoTFZNX0ZMT0FUKS1wRXF1YWxpc2VyQ29lZlRhYmxlW09mZnNldF0uQjI7CisKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KChMVk1fSU5UMTYpMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopJnBEYXRhLT5FcXVhbGlzZXJCaXF1YWRUYXBzLCAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5FcXVhbGlzZXJCaXF1YWRUYXBzKSAvIHNpemVvZihMVk1fRkxPQVQpKSk7CisKKyAgICAgICAgQlFfMklfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50cy0+RXF1YWxpc2VyQmlxdWFkSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5FcXVhbGlzZXJCaXF1YWRUYXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnMpOworCisgICAgICAgIC8qIENhbGxiYWNrcyAqLworICAgICAgICBzd2l0Y2gocEVxdWFsaXNlckNvZWZUYWJsZVtPZmZzZXRdLlNjYWxlKQorICAgICAgICB7CisgICAgICAgICAgICBjYXNlIDEzOgorICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMzJDMTNfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgMTQ6CisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYzMkMxNF9UUkNfV1JBXzAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAxNToKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjMyQzE1X1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfRXF1YWxpc2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEFwcGx5IHRoZSBlcXVhbGlzZXIgZmlsdGVyLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5wdXRPdXRwdXQgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dC9vdXRwdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgVGhlIG51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIEFsd2F5cyBwcm9jZXNzZXMgaW4gcGxhY2UuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlcihMVkNTX0hhbmRsZV90ICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBJbnB1dE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgTnVtU2FtcGxlcykKK3sKKworICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOworICAgIExWQ1NfRXF1YWxpc2VyX3QgICAgKnBDb25maWcgICA9IChMVkNTX0VxdWFsaXNlcl90ICAqKSZwSW5zdGFuY2UtPkVxdWFsaXNlcjsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QgICpwQ29lZmZpY2llbnRzOworCisgICAgcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAorICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIGVxdWFsaXNlciBpcyByZXF1aXJlZAorICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfRVFVQUxJU0VSU1dJVENIKSAhPSAwKQorICAgIHsKKyAgICAgICAgLyogQXBwbHkgZmlsdGVyIHRvIHRoZSBsZWZ0IGFuZCByaWdodCBjaGFubmVscyAqLworICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrKSgoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBDb2VmZmljaWVudHMtPkVxdWFsaXNlckJpcXVhZEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5wdXRPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbnB1dE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0VxdWFsaXNlci5oCmluZGV4IDBlNzU2ZTcuLjkxOGQ5MzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19FcXVhbGlzZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfRXF1YWxpc2VyLmgKQEAgLTE4LDExICsxOCw2IEBACiAjaWZuZGVmIF9fTFZDU19FUVVBTElTRVJfSF9fCiAjZGVmaW5lIF9fTFZDU19FUVVBTElTRVJfSF9fCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zMiwxNCArMjcsOSBAQAogLyogRXF1YWxpc2VyIHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLSNpZm5kZWYgQlVJTERfRkxPQVQKLSAgICB2b2lkICgqcEJpcXVhZENhbGxCYWNrKSAoQmlxdWFkX0luc3RhbmNlX3QqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYpOwotI2Vsc2UKICAgICB2b2lkICgqcEJpcXVhZENhbGxCYWNrKSAoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqLCBMVk1fRkxPQVQqLCBMVk1fRkxPQVQqLCBMVk1fSU5UMTYpOwotI2VuZGlmCiB9IExWQ1NfRXF1YWxpc2VyX3Q7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBGdW5jdGlvbiBwcm90b3R5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDgsMTcgKzM4LDggQEAKIAogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpOwotI2lmbmRlZiBCVUlMRF9GTE9BVAotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19FcXVhbGlzZXIoTFZDU19IYW5kbGVfdCAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAqcElucHV0T3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKLSNlbHNlCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0VxdWFsaXNlcihMVkNTX0hhbmRsZV90ICAgICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICpwSW5wdXRPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOwotI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwogCiAjZW5kaWYgIC8qIEVRVUFMSVNFUl9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0hlYWRwaG9uZV9Db2VmZnMuaAppbmRleCAwYzJmZTUzLi5jN2VlMjMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSGVhZHBob25lX0NvZWZmcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgKQEAgLTE4LDEzICsxOCwxMSBAQAogI2lmbmRlZiBfX0xWQ1NfSEVBRFBIT05FX0NPRUZGU19IX18KICNkZWZpbmUgX19MVkNTX0hFQURQSE9ORV9DT0VGRlNfSF9fCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiBUaGUgU3RlcmVvIEVuaGFuY2VyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDgwMDAgSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYxMjU4ICovCiAjZGVmaW5lIENTX01JRERMRV84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4yMjc3MjAKICNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICgtMC4yMTUxMjUpCkBAIC0xNTEsNyArMTQ5LDI0IEBACiAjZGVmaW5lIENTX1NJREVfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjYzMDQwNQogI2RlZmluZSBDU19TSURFXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAogCi0jaWZkZWYgSElHSEVSX0ZTCisvKiBDb2VmZmljaWVudHMgZm9yIDg4MjAwSHogc2FtcGxlIHJhdGUuCisgKiBUaGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhcmUgb2J0YWluZWQgYnkgY2Fycnlpbmcgb3V0CisgKiBzdGF0ZS1zcGFjZSBhbmFseXNpcyB1c2luZyB0aGUgY29lZmZpY2llbnRzIGF2YWlsYWJsZQorICogZm9yIDQ0MTAwSHouCisgKi8KKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMzM4NDZmCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9BMSAgICAgICAgICAgICAgICAgICAgICgtMC4yMzI2NTdmKQorI2RlZmluZSBDU19NSURETEVfODgyMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfTUlERExFXzg4MjAwX0IxICAgICAgICAgICAgICAgICAgICAgKC0wLjk5Mjc0N2YpCisjZGVmaW5lIENTX01JRERMRV84ODIwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBDU19NSURETEVfODgyMDBfU0NBTEUgICAgICAgICAgICAgICAgICAxNQorI2RlZmluZSBDU19TSURFXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjIzMTU0MWYKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC0wLjI4OTU4NmYpCisjZGVmaW5lIENTX1NJREVfODgyMDBfQTIgICAgICAgICAgICAgICAgICAgICAgIDAuMDU4MDQ1ZgorI2RlZmluZSBDU19TSURFXzg4MjAwX0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuNzY1MzAwZikKKyNkZWZpbmUgQ1NfU0lERV84ODIwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC43Njk4MTZmCisjZGVmaW5lIENTX1NJREVfODgyMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgIDE0CisKIC8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDk2MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoICAwLjE2NSovCiAvKiBoaWdoIHBhc3MgZmlsdGVyIHdpdGggY3V0b2ZmIGZyZXF1ZW5jeSAxMDIuMTggSHoqLwogI2RlZmluZSBDU19NSURETEVfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjIzNTUzMgpAQCAtMTYwLDEzICsxNzUsMzMgQEAKICNkZWZpbmUgQ1NfTUlERExFXzk2MDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTAuOTkzMzM0KQogI2RlZmluZSBDU19NSURETEVfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBDU19NSURETEVfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQotLyogYmFuZHBhc3MgZmlsdGVyIHdpdGggZmMxIDI3MCBhbmQgZmMyIDM3MDMsIGRlc2lnbmVkIHVzaW5nIDJuZCBvcmRlciBidXR0ZXJ3b3J0aCAqLwotI2RlZmluZSBDU19TSURFXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4wMTY3MjcKLSNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMSAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwCi0jZGVmaW5lIENTX1NJREVfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMTY3MjcpCi0jZGVmaW5lIENTX1NJREVfOTYwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMS43OTMzNzIpCi0jZGVmaW5lIENTX1NJREVfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjc5NzIzNgotI2RlZmluZSBDU19TSURFXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTQKKy8qIENvZWZmaWNpZW50cyBjYWxjdWxhdGVkIHVzaW5nIHRmMnNzIGFuZCBzczJ0ZiBmdW5jdGlvbnMgYmFzZWQgb24KKyAqIGNvZWZmaWNpZW50cyBhdmFpbGFibGUgZm9yIDQ4MDAwSHogc2FtcGxpbmcgZnJlcXVlbmN5CisgKi8KKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9BMCAgICAgICAgICAgICAgICAgICAgIDAuMjI0MzI2ZgorI2RlZmluZSBDU19TSURFXzk2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgKC0wLjI5NDkzN2YpCisjZGVmaW5lIENTX1NJREVfOTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAwLjA3MDYxMWYKKyNkZWZpbmUgQ1NfU0lERV85NjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICgtMS43OTIxNjZmKQorI2RlZmluZSBDU19TSURFXzk2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgMC43OTU4MzBmCisjZGVmaW5lIENTX1NJREVfOTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAxNAorCisvKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxNzY0MDBIeiBzYW1wbGUgcmF0ZS4KKyAqIFRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFyZSBvYnRhaW5lZCBieSBjYXJyeWluZyBvdXQKKyAqIHN0YXRlLXNwYWNlIGFuYWx5c2lzIHVzaW5nIHRoZSBjb2VmZmljaWVudHMgYXZhaWxhYmxlCisgKiBmb3IgNDQxMDBIei4KKyAqLworI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yMzM5NzNmCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAgICAoLTAuMjMzMzc4ZikKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9BMiAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBDU19NSURETEVfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgICAgKC0wLjk5NjM2N2YpCisjZGVmaW5lIENTX01JRERMRV8xNzY0MDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMGYKKyNkZWZpbmUgQ1NfTUlERExFXzE3NjQwMF9TQ0FMRSAgICAgICAgICAgICAgICAgIDE1CisjZGVmaW5lIENTX1NJREVfMTc2NDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjE5OTgzNmYKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAgICAgICgtMC4zMDc1NDRmKQorI2RlZmluZSBDU19TSURFXzE3NjQwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgMC4xMDc3MDhmCisjZGVmaW5lIENTX1NJREVfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAoLTEuODc2NTcyZikKKyNkZWZpbmUgQ1NfU0lERV8xNzY0MDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuODc3NzcxZgorI2RlZmluZSBDU19TSURFXzE3NjQwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgMTQKIAogLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTkyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoICAwLjE2ODkqLwogI2RlZmluZSBDU19NSURETEVfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgMC4yNDEyMTkKQEAgLTE3NSwxNCArMjEwLDE1IEBACiAjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICgtMC45OTY2NjEpCiAjZGVmaW5lIENTX01JRERMRV8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAwLjAwMDAwMAogI2RlZmluZSBDU19NSURETEVfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKLS8qIGJhbmRwYXNzIGZpbHRlciB3aXRoIGZjMSAyNzAgYW5kIGZjMiAzNzAzLCBkZXNpZ25lZCB1c2luZyAybmQgb3JkZXIgYnV0dGVyd29ydGggKi8KLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAwLjAwODk5MQotI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMSAgICAgICAgICAgICAgICAgICAgKC0wLjAwMDAwMCkKLSNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICgtMC4wMDg5OTEpCi0jZGVmaW5lIENTX1NJREVfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTEuODkyNTA5KQotI2RlZmluZSBDU19TSURFXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgIDAuODkzNTI0Ci0jZGVmaW5lIENTX1NJREVfMTkyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAxNAotI2VuZGlmCisvKiBDb2VmZmljaWVudHMgY2FsY3VsYXRlZCB1c2luZyB0ZjJzcyBhbmQgc3MydGYgZnVuY3Rpb25zIGJhc2VkIG9uCisgKiBjb2VmZmljaWVudHMgYXZhaWxhYmxlIGZvciA0ODAwMEh6IHNhbXBsaW5nIGZyZXF1ZW5jeQorICovCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAwLjE5NjAzOWYKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICgtMC4zMTEwMjdmKQorI2RlZmluZSBDU19TSURFXzE5MjAwMF9BMiAgICAgICAgICAgICAgICAgICAgMC4xMTQ5ODhmCisjZGVmaW5lIENTX1NJREVfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTEuODkxMzgwZikKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfQjIgICAgICAgICAgICAgICAgICAgIDAuODkyMzQ2MGYKKyNkZWZpbmUgQ1NfU0lERV8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgIDE0CiAKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMTk5LDcgKzIzNSwxMiBAQAogI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzI0S0haICAgICAgICAgICAgICAgICAgIDI3OSAgICAgICAgIC8qIFNhbXBsZSByYXRlIDI0a1MvcyAqLwogI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzMyS0haICAgICAgICAgICAgICAgICAgIDM3MiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDMya1MvcyAqLwogI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzQ0S0haICAgICAgICAgICAgICAgICAgIDUxMiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDQ0a1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haICAgICAgICAgICAgICAgICAgIDUxMiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDQ4a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haICAgICAgICAgICAgICAgICAgIDU1NyAgICAgICAgIC8qIFNhbXBsZSByYXRlIDQ4a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzg4S0haICAgICAgICAgICAgICAgICAgIDEwMjQgICAgICAgIC8qIFNhbXBsZSByYXRlIDg4LjJrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfOTZLSFogICAgICAgICAgICAgICAgICAgMTExNSAgICAgICAgLyogU2FtcGxlIHJhdGUgOTZrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTc2S0haICAgICAgICAgICAgICAgICAgMjA0OCAgICAgICAgLyogU2FtcGxlIHJhdGUgMTc2LjRrUy9zICovCisjZGVmaW5lIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTkyS0haICAgICAgICAgICAgICAgICAgMjIyOSAgICAgICAgLyogU2FtcGxlIHJhdGUgMTk2a1MvcyAqLworI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTX01BWF9WQUwgICAgICAgICAgICAgICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTkyS0haCiAKIC8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDgwMDAgSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCiAjZGVmaW5lIENTX1JFVkVSQl84MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAwLjY2NzI3MQpAQCAtMjQxLDcgKzI4Miw2IEBACiAjZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAgKC0wLjI5MDk5MCkKICNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKIAotCiAvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAyNDAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwogI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuNDc5NTY1CiAjZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDAKQEAgLTI3NCw3ICszMTQsMTQgQEAKICNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAwLjMwMzM0NwogI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAogCi0jaWZkZWYgSElHSEVSX0ZTCisvKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA4ODIwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjggKi8KKy8qIEJhbmQgcGFzcyBmaWx0ZXIgd2l0aCBmYzE9NTAwIGFuZCBmYzI9ODAwMCAqLworI2RlZmluZSBDU19SRVZFUkJfODgyMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMTcxOTAxZgorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfQTEgICAgICAgICAgICAgICAgICAgICAgIDAuMDAwMDAwZgorI2RlZmluZSBDU19SRVZFUkJfODgyMDBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjE3MTkwMWYpCisjZGVmaW5lIENTX1JFVkVSQl84ODIwMF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTEuNTUzOTQ4ZikKKyNkZWZpbmUgQ1NfUkVWRVJCXzg4MjAwX0IyICAgICAgICAgICAgICAgICAgICAgICgwLjU3MDI0OGYpCisjZGVmaW5lIENTX1JFVkVSQl84ODIwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAxNAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgOTYwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC44ICovCiAvKiBCYW5kIHBhc3MgZmlsdGVyIHdpdGggZmMxPTUwMCBhbmQgZmMyPTgwMDAqLwogI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgIDAuMTYwMjQ4OApAQCAtMjg0LDYgKzMzMSwxNCBAQAogI2RlZmluZSBDU19SRVZFUkJfOTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgIDAuNTk5Mzc3CiAjZGVmaW5lIENTX1JFVkVSQl85NjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0CiAKKy8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDE3NjQwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjggKi8KKy8qIEJhbmQgcGFzcyBmaWx0ZXIgd2l0aCBmYzE9NTAwIGFuZCBmYzI9ODAwMCAqLworI2RlZmluZSBDU19SRVZFUkJfMTc2NDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAwLjA5NDc2M2YKKyNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgMC4wMDAwMDBmCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0wLjA5NDc2M2YpCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xLjc1ODU5M2YpCisjZGVmaW5lIENTX1JFVkVSQl8xNzY0MDBfQjIgICAgICAgICAgICAgICAgICAgICAgKDAuNzYzMDkxZikKKyNkZWZpbmUgQ1NfUkVWRVJCXzE3NjQwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAxNAogLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMTkyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuOCAqLwogLyogQmFuZCBwYXNzIGZpbHRlciB3aXRoIGZjMT01MDAgYW5kIGZjMj04MDAwKi8KICNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgMC4wODc4MzY5CkBAIC0yOTMsOSArMzQ4LDYgQEAKICNkZWZpbmUgQ1NfUkVWRVJCXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgMC43ODA0MDc2CiAjZGVmaW5lIENTX1JFVkVSQl8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNAogCi0jZW5kaWYKLQotCiAvKiBSZXZlcmIgR2FpbiBTZXR0aW5ncyAqLwogI2RlZmluZSBMVkNTX0hFQURQSE9ORV9ERUxBWUdBSU4gICAgICAgICAgICAgICAwLjgwMDAwMCAgICAgICAgIC8qIEFsZ29yaXRobSBkZWxheSBwYXRoIGdhaW4gKi8KICNkZWZpbmUgTFZDU19IRUFEUEhPTkVfT1VUUFVUR0FJTiAgICAgICAgICAgICAgMS4wMDAwMDAgICAgICAgICAvKiBBbGdvcml0aG0gb3V0cHV0IGdhaW4gKi8KQEAgLTQ0NCw4ICs0OTYsMjQgQEAKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjIgICAgICAgICAgICAgICAgICgtMC4zNDczMzIpCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCiAKKy8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDg4MjAwSHogc2FtcGxlIHJhdGUuCisgKiBUaGUgZmlsdGVyIGNvZWZmaWNpZW50cyBhcmUgb2J0YWluZWQgYnkgY2Fycnlpbmcgb3V0CisgKiBzdGF0ZS1zcGFjZSBhbmFseXNpcyB1c2luZyB0aGUgY29lZmZpY2llbnRzIGF2YWlsYWJsZQorICogZm9yIDQ0MTAwSHouCisgKi8KKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0EwICAgICAgICAgICAgICAgICAgIDEuNzcxODk5ZgorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQTEgICAgICAgICAgICAgICAgICAgKC0yLjkzMDc2MmYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9BMiAgICAgICAgICAgICAgICAgICAxLjE3MjE3NWYKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzg4MjAwX0IxICAgICAgICAgICAgICAgICAgICgtMS40MzgzNDlmKQorI2RlZmluZSBDU19FUVVBTElTRVJfODgyMDBfQjIgICAgICAgICAgICAgICAgICAgMC40NDI1MjBmCisjZGVmaW5lIENTX0VRVUFMSVNFUl84ODIwMF9TQ0FMRSAgICAgICAgICAgICAgICAxMworI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9BMCAgICAgICAgICAgICAgICAgMi42NzUyNDFmCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0ExICAgICAgICAgICAgICAgICAoLTQuNDY2MTU0ZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTIgICAgICAgICAgICAgICAgIDEuODEwMzA1ZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjkyNTM1MGYpCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzg4MjAwX0IyICAgICAgICAgICAgICAgICAoLTAuMDY2NjE2ZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfODgyMDBfU0NBTEUgICAgICAgICAgICAgIDEzCiAKLSNpZmRlZiBISUdIRVJfRlMKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjc4NDQ5NwogI2RlZmluZSBDU19FUVVBTElTRVJfOTYwMDBfQTEgICAgICAgICAgICAgICAgICAgKC0zLjAwMTQzNSkKICNkZWZpbmUgQ1NfRVFVQUxJU0VSXzk2MDAwX0EyICAgICAgICAgICAgICAgICAgICAxLjIyODQyMgpAQCAtNDU4LDYgKzUyNiwyMyBAQAogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMSAgICAgICAgICAgICAgICAgKC0wLjk3MTcxOCkKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQjIgICAgICAgICAgICAgICAgICgtMC4wMjEyMTYpCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCisvKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAxNzY0MDBIeiBzYW1wbGUgcmF0ZS4KKyAqIFRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGFyZSBvYnRhaW5lZCBieSBjYXJyeWluZyBvdXQKKyAqIHN0YXRlLXNwYWNlIGFuYWx5c2lzIHVzaW5nIHRoZSBjb2VmZmljaWVudHMgYXZhaWxhYmxlCisgKiBmb3IgNDQxMDBIei4KKyAqLworI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0EwICAgICAgICAgICAgICAgICAgMS44ODM0NDBmCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQTEgICAgICAgICAgICAgICAgICAoLTMuNDE0MjcyZikKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9BMiAgICAgICAgICAgICAgICAgIDEuNTM0NzAyZgorI2RlZmluZSBDU19FUVVBTElTRVJfMTc2NDAwX0IxICAgICAgICAgICAgICAgICAgKC0xLjY3NDYxNGYpCisjZGVmaW5lIENTX0VRVUFMSVNFUl8xNzY0MDBfQjIgICAgICAgICAgICAgICAgICAwLjY3NTgyN2YKKyNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE3NjQwMF9TQ0FMRSAgICAgICAgICAgICAgIDEzCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMCAgICAgICAgICAgICAgICAzLjM1NTA2OGYKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0ExICAgICAgICAgICAgICAgICgtNi4xMTI1NzhmKQorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQTIgICAgICAgICAgICAgICAgMi43NjQxMzVmCisjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMSAgICAgICAgICAgICAgICAoLTEuMjY4NTMzZikKKyNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0IyICAgICAgICAgICAgICAgIDAuMjcxMjc3ZgorI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEUgICAgICAgICAgICAgMTMKIAogI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0EwICAgICAgICAgICAgICAgICAgICAxLjg4OTU4MgogI2RlZmluZSBDU19FUVVBTElTRVJfMTkyMDAwX0ExICAgICAgICAgICAgICAgICAgICgtMy40NTYxNDApCkBAIC00NzEsOCArNTU2LDYgQEAKICNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IxICAgICAgICAgICAgICAgICAoLTEuMzEwNzQpCiAjZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9CMiAgICAgICAgICAgICAgICAgMC4zMTMxMgogI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTMKLSNlbmRpZgotCiAKICNkZWZpbmUgTFZDU19IRUFEUEhPTkVfU0hJRlQgICAgICAgICAgICAgICAgICAgICAgICAgIDIgICAgICAgICAgICAgIC8qIE91dHB1dCBTaGlmdCAqLwogI2RlZmluZSBMVkNTX0hFQURQSE9ORV9TSElGVExPU1MgICAgICAgICAgICAgICAgICAwLjg0Nzc3MzUgICAgICAgICAgLyogT3V0cHV0IFNoaWZ0IGxvc3MgKi8KQEAgLTQ4MCwzNzYgKzU2Myw1IEBACiAjZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgICAgICAvKiBFWCBPdXRwdXQgU2hpZnQgKi8KICNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfU0hJRlRMT1NTICAgICAgICAgICAgICAgMC41NjkyMjUgICAgICAgICAgIC8qIEVYIE91dHB1dCBTaGlmdCBsb3NzICovCiAjZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX0dBSU4gICAgICAgICAgICAgICAgICAgIDAuMDc3OTQ0MjUgICAgICAgICAvKiBFWCBVbnByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KLSNlbHNlCi0vKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MTI1OCAqLwotI2RlZmluZSBDU19NSURETEVfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgNzQ2MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjI3NzIwICovCi0jZGVmaW5lIENTX01JRERMRV84MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgKC03MDQ5KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjE1MTI1ICovCi0jZGVmaW5lIENTX01JRERMRV84MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMzAyMDkpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC45MjE4OTkgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBDU19NSURETEVfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAxNQotI2RlZmluZSBDU19TSURFXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAzNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjExNDQxICovCi0jZGVmaW5lIENTX1NJREVfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTEyNDYzKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzgwMzQ0ICovCi0jZGVmaW5lIENTX1NJREVfODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgKC03NTczKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjMxMDk3ICovCi0jZGVmaW5lIENTX1NJREVfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTIwMzk3KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNjIyNDcwICovCi0jZGVmaW5lIENTX1NJREVfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgKC00Mjg1KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTMwNzU5ICovCi0jZGVmaW5lIENTX1NJREVfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0KLS8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDExMDI1SHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYyOTQzICovCi0jZGVmaW5lIENTX01JRERMRV8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgICAgICA3NTY0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yMzA4MzggKi8KLSNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAgICAoLTcyNjApICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMjE1NTkgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzExMDI1X0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBDU19NSURETEVfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgICAgKC0zMDkwMikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjk0MzA1NiAqLwotI2RlZmluZSBDU19NSURETEVfMTEwMjVfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIENTX01JRERMRV8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0jZGVmaW5lIENTX1NJREVfMTEwMjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAgIDE4MjY0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC41NTczNzIgKi8KLSNkZWZpbmUgQ1NfU0lERV8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAgICAgICgtMTI4MjgpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zOTE0OTAgKi8KLSNkZWZpbmUgQ1NfU0lERV8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAoLTU0MzYpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xNjU4ODEgKi8KLSNkZWZpbmUgQ1NfU0lERV8xMTAyNV9CMSAgICAgICAgICAgICAgICAgICAgICAgICgtMjg4NTYpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC44ODA2MDggKi8KLSNkZWZpbmUgQ1NfU0lERV8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNjIgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAzMjM5NyAqLwotI2RlZmluZSBDU19TSURFXzExMDI1X1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNQotCi0vKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAxMjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MjE5MSAqLwotI2RlZmluZSBDU19NSURETEVfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgNzUzNCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjI5OTMyICovCi0jZGVmaW5lIENTX01JRERMRV8xMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC03MjU2KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjIxNDM2ICovCi0jZGVmaW5lIENTX01JRERMRV8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMzEwNTEpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC45NDc2MTYgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzEyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBDU19NSURETEVfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQotI2RlZmluZSBDU19TSURFXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAxODI5OCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTU4Mzk4ICovCi0jZGVmaW5lIENTX1NJREVfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAoLTEyODUyKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMzkyMjExICovCi0jZGVmaW5lIENTX1NJREVfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgKC01NDQ2KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTY2MTg3ICovCi0jZGVmaW5lIENTX1NJREVfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAoLTI5MjQ3KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuODkyNTUwICovCi0jZGVmaW5lIENTX1NJREVfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAxMDc3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMzI4NTYgKi8KLSNkZWZpbmUgQ1NfU0lERV8xMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTUKLQotLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMTYwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjIzNzEgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDc1NTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjIzMDYzOCAqLwotI2RlZmluZSBDU19NSURETEVfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICgtNzM0OCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIyNDIzMiAqLwotI2RlZmluZSBDU19NSURETEVfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIENTX01JRERMRV8xNjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTMxNDc1KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuOTYwNTUwICovCi0jZGVmaW5lIENTX01JRERMRV8xNjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzE2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgQ1NfU0lERV8xNjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDgxODcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQ5OTY5NSAqLwotI2RlZmluZSBDU19TSURFXzE2MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICgtNTgyNSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjM1NTU0MyAqLwotI2RlZmluZSBDU19TSURFXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICgtMjM2MikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE0NDE1MiAqLwotI2RlZmluZSBDU19TSURFXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgKC0xNzIxNikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjA1MDc4OCAqLwotI2RlZmluZSBDU19TSURFXzE2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgMjM2MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMTQ0MTA0ICovCi0jZGVmaW5lIENTX1NJREVfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0Ci0KLS8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDIyMDUwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYwNzgxICovCi0jZGVmaW5lIENTX01JRERMRV8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAgICAgICA3NDk2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yMjg3NDkgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTczNDQpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMjQxMjggKi8KLSNkZWZpbmUgQ1NfTUlERExFXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBDU19NSURETEVfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0zMTgyNikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjk3MTI2MiAqLwotI2RlZmluZSBDU19NSURETEVfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIENTX01JRERMRV8yMjA1MF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0jZGVmaW5lIENTX1NJREVfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjExICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC40NDAxMTIgKi8KLSNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTQyNzgpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNjEwOTYgKi8KLSNkZWZpbmUgQ1NfU0lERV8yMjA1MF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAoLTI5MzMpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xNzkwMTYgKi8KLSNkZWZpbmUgQ1NfU0lERV8yMjA1MF9CMSAgICAgICAgICAgICAgICAgICAgICAgICgtMTgyOTcpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS4xMTY3ODYgKi8KLSNkZWZpbmUgQ1NfU0lERV8yMjA1MF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDI5OTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjE4MjUwNyAqLwotI2RlZmluZSBDU19TSURFXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAotCi0vKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciAyNDAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2MTg4MiAqLwotI2RlZmluZSBDU19NSURETEVfMjQwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgNzU1MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjMwMzk1ICovCi0jZGVmaW5lIENTX01JRERMRV8yNDAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC03NDA5KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjI2MTE3ICovCi0jZGVmaW5lIENTX01JRERMRV8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMzE5MDIpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC45NzM1NzMgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzI0MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBDU19NSURETEVfMjQwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQotI2RlZmluZSBDU19TSURFXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNjc5NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNDE0NzcwICovCi0jZGVmaW5lIENTX1NJREVfMjQwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC00NzA1KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjg3MTgyICovCi0jZGVmaW5lIENTX1NJREVfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgKC0yMDkwKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTI3NTg4ICovCi0jZGVmaW5lIENTX1NJREVfMjQwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAoLTIwMTQ3KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuMjI5NjQ4ICovCi0jZGVmaW5lIENTX1NJREVfMjQwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICA0NjIzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yODIxNzcgKi8KLSNkZWZpbmUgQ1NfU0lERV8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKLQotLyogU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50cyBmb3IgMzIwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMC4xNjAzMjIgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgIDc0ODQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjIyODQwMCAqLwotI2RlZmluZSBDU19NSURETEVfMzIwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICgtNzM4MCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIyNTIxNCAqLwotI2RlZmluZSBDU19NSURETEVfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIENTX01JRERMRV8zMjAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTMyMTE3KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuOTgwMTI2ICovCi0jZGVmaW5lIENTX01JRERMRV8zMjAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKLSNkZWZpbmUgQ1NfU0lERV8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5NzMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjM2NDU3OSAqLwotI2RlZmluZSBDU19TSURFXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICgtMzM5NykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIwNzM1NSAqLwotI2RlZmluZSBDU19TSURFXzMyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICgtMjU3NikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjE1NzIyNCAqLwotI2RlZmluZSBDU19TSURFXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICAgKC0yMDg3NykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjI3NDIzMSAqLwotI2RlZmluZSBDU19TSURFXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEyMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzEyNDk1ICovCi0jZGVmaW5lIENTX1NJREVfMzIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAgIDE0Ci0KLS8qIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudHMgZm9yIDQ0MTAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDAuMTYzODM0ICovCi0jZGVmaW5lIENTX01JRERMRV80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICA3NjU0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yMzM1OTMgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTc1NzcpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yMzEyMjUgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBDU19NSURETEVfNDQxMDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0zMjI5NCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjk4NTU0NSAqLwotI2RlZmluZSBDU19NSURETEVfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIENTX01JRERMRV80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0jZGVmaW5lIENTX1NJREVfNDQxMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgICA0NjYyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yODQ1NzMgKi8KLSNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAoLTQyNDIpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yNTg5MTAgKi8KLSNkZWZpbmUgQ1NfU0lERV80NDEwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgKC00MjApICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wMjU2NjIgKi8KLSNkZWZpbmUgQ1NfU0lERV80NDEwMF9CMSAgICAgICAgICAgICAgICAgICAgICAgICgtMjU3NjApICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS41NzIyNDggKi8KLSNkZWZpbmUgQ1NfU0lERV80NDEwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2NDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjU4ODM5OSAqLwotI2RlZmluZSBDU19TSURFXzQ0MTAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgICAxNAotCi0vKiBTdGVyZW8gRW5oYW5jZXIgY29lZmZpY2llbnRzIGZvciA0ODAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAwLjE2NDQwMiAqLwotI2RlZmluZSBDU19NSURETEVfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAgNzY4MiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjM0NDQ1ICovCi0jZGVmaW5lIENTX01JRERMRV80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAgKC03NjExKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjMyMjYxICovCi0jZGVmaW5lIENTX01JRERMRV80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMzIzMzMpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC45ODY3MTMgKi8KLSNkZWZpbmUgQ1NfTUlERExFXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBDU19NSURETEVfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQotI2RlZmluZSBDU19TSURFXzQ4MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgICAgNDQ2NiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjcyNjA2ICovCi0jZGVmaW5lIENTX1NJREVfNDgwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgKC00Mzc0KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjY2OTUyICovCi0jZGVmaW5lIENTX1NJREVfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICAgICAoLTkzKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDA1NjU0ICovCi0jZGVmaW5lIENTX1NJREVfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICAoLTI2NDk1KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuNjE3MTQxICovCi0jZGVmaW5lIENTX1NJREVfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgIDEwMzI5ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC42MzA0MDUgKi8KLSNkZWZpbmUgQ1NfU0lERV80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAgMTQKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSBSZXZlcmIgVW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogUmV2ZXJiIGRlbGF5IHNldHRpbmdzIGluIHNhbXBsZXMgKi8KLSNkZWZpbmUgTFZDU19TVEVSRU9ERUxBWV9DU184S0haICAgICAgICAgICAgICAgICAgICAgOTMgICAgICAgICAvKiBTYW1wbGUgcmF0ZSA4a1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzExS0haICAgICAgICAgICAgICAgICAgIDEyOCAgICAgICAgIC8qIFNhbXBsZSByYXRlIDExa1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzEyS0haICAgICAgICAgICAgICAgICAgIDEzOSAgICAgICAgIC8qIFNhbXBsZSByYXRlIDEya1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzE2S0haICAgICAgICAgICAgICAgICAgIDE4NiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDE2a1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzIyS0haICAgICAgICAgICAgICAgICAgIDI1NiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDIya1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzI0S0haICAgICAgICAgICAgICAgICAgIDI3OSAgICAgICAgIC8qIFNhbXBsZSByYXRlIDI0a1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzMyS0haICAgICAgICAgICAgICAgICAgIDM3MiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDMya1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzQ0S0haICAgICAgICAgICAgICAgICAgIDUxMiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDQ0a1MvcyAqLwotI2RlZmluZSBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haICAgICAgICAgICAgICAgICAgIDUxMiAgICAgICAgIC8qIFNhbXBsZSByYXRlIDQ4a1MvcyAqLwotCi0vKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciA4MDAwIEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwotI2RlZmluZSBDU19SRVZFUkJfODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICAyMTg2NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjY3MjcxICovCi0jZGVmaW5lIENTX1JFVkVSQl84MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAoLTIxODY1KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNjY3MjcxICovCi0jZGVmaW5lIENTX1JFVkVSQl84MDAwX0EyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgICgtMjE4OTUpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC42NjgxNzkgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBDU19SRVZFUkJfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgICAxNQotCi0vKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxMTAyNUh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwotI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfQTAgICAgICAgICAgICAgICAgICAgICAgICAyMjkyNiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNjk5NjM4ICovCi0jZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9BMSAgICAgICAgICAgICAgICAgICAgICAoLTIyOTI2KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNjk5NjM4ICovCi0jZGVmaW5lIENTX1JFVkVSQl8xMTAyNV9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0IxICAgICAgICAgICAgICAgICAgICAgICgtMjQ1NDYpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC43NDkwOTYgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzExMDI1X0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBDU19SRVZFUkJfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQotCi0vKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxMjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwotI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAyMzE2NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzA2OTMxICovCi0jZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTIzMTY1KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNzA2OTMxICovCi0jZGVmaW5lIENTX1JFVkVSQl8xMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMjUxNDQpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC43NjczMjcgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzEyMDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBDU19SRVZFUkJfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQotCi0vKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAxNjAwMEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwotI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgICAyMzg2NCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNzI4MjcyICovCi0jZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9BMSAgICAgICAgICAgICAgICAgICAgICAoLTIzODY0KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNzI4MjcyICovCi0jZGVmaW5lIENTX1JFVkVSQl8xNjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMjY4OTIpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC44MjA2NzkgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzE2MDAwX0IyICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBDU19SRVZFUkJfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAgICAxNQotCi0vKiBSZXZlcmIgY29lZmZpY2llbnRzIGZvciAyMjA1MEh6IHNhbXBsZSByYXRlLCBzY2FsZWQgd2l0aCAxLjAzODAzMCAqLwotI2RlZmluZSBDU19SRVZFUkJfMjIwNTBfQTAgICAgICAgICAgICAgICAgICAgICAgICAxNjkyMSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTE2Mzk2ICovCi0jZGVmaW5lIENTX1JFVkVSQl8yMjA1MF9BMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAwICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMDAwMDAgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAgICgtMTY5MjEpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC41MTYzOTYgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0IxICAgICAgICAgICAgICAgICAgICAgICgtMTY5OTEpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC41MTg1MTIgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX0IyICAgICAgICAgICAgICAgICAgICAgICAoLTk1MzUpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4yOTA5OTAgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzIyMDUwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgICAgMTUKLQotLyogUmV2ZXJiIGNvZWZmaWNpZW50cyBmb3IgMjQwMDBIeiBzYW1wbGUgcmF0ZSwgc2NhbGVkIHdpdGggMS4wMzgwMzAgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAgICAgMTU3MTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjQ3OTU2NSAqLwotI2RlZmluZSBDU19SRVZFUkJfMjQwMDBfQTEgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDAwMDAwICovCi0jZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9BMiAgICAgICAgICAgICAgICAgICAgICAoLTE1NzE0KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDc5NTY1ICovCi0jZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAgICAoLTIwODk4KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNjM3NzQ1ICovCi0jZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAgICAgKC02NTE4KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTk4OTEyICovCi0jZGVmaW5lIENTX1JFVkVSQl8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0KLS8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDMyMDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCi0jZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgIDEyNDYzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zODAzNDkgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzMyMDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgKC0xMjQ2MykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjM4MDM0OSAqLwotI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0zMTE1OCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjk1MDg3MyAqLwotI2RlZmluZSBDU19SRVZFUkJfMzIwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgMTYxMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDQ5MTI3ICovCi0jZGVmaW5lIENTX1JFVkVSQl8zMjAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE1Ci0KLS8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDQ0MTAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCi0jZGVmaW5lIENTX1JFVkVSQl80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICA0ODcyICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yOTczODkgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICgtNDg3MikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI5NzM4OSAqLwotI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0xOTY2OCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjIwMDQyMyAqLwotI2RlZmluZSBDU19SRVZFUkJfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgNDIwMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMjU2NTI5ICovCi0jZGVmaW5lIENTX1JFVkVSQl80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0Ci0KLS8qIFJldmVyYiBjb2VmZmljaWVudHMgZm9yIDQ4MDAwSHogc2FtcGxlIHJhdGUsIHNjYWxlZCB3aXRoIDEuMDM4MDMwICovCi0jZGVmaW5lIENTX1JFVkVSQl80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAgICAgICA0NTY2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4yNzg2NjEgKi8KLSNkZWZpbmUgQ1NfUkVWRVJCXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAwMDAwMCAqLwotI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgICgtNDU2NikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI3ODY2MSAqLwotI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAgICAgKC0yMDU2MikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjI1NDk5MyAqLwotI2RlZmluZSBDU19SRVZFUkJfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAgICAgICAgNDk3MCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMzAzMzQ3ICovCi0jZGVmaW5lIENTX1JFVkVSQl80ODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAgIDE0Ci0KLS8qIFJldmVyYiBHYWluIFNldHRpbmdzICovCi0jZGVmaW5lIExWQ1NfSEVBRFBIT05FX0RFTEFZR0FJTiAgICAgICAgICAgICAgIDAuODAwMDAwICAgICAgICAgLyogQWxnb3JpdGhtIGRlbGF5IHBhdGggZ2FpbiAqLwotI2RlZmluZSBMVkNTX0hFQURQSE9ORV9PVVRQVVRHQUlOICAgICAgICAgICAgICAxLjAwMDAwMCAgICAgICAgIC8qIEFsZ29yaXRobSBvdXRwdXQgZ2FpbiAqLwotI2RlZmluZSBMVkNTX0hFQURQSE9ORV9QUk9DR0FJTiAgICAgICAgICAgICAgICAgICAxODQwMyAgICAgICAgIC8qIFByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KLSNkZWZpbmUgTFZDU19IRUFEUEhPTkVfVU5QUk9DR0FJTiAgICAgICAgICAgICAgICAgMTg0MDMgICAgICAgICAvKiBVbnByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KLSNkZWZpbmUgTFZDU19IRUFEUEhPTkVfR0FJTkNPUlJFQ1QgICAgICAgICAgICAgMS4wMDkzNDMgICAgICAgICAvKiBEZWxheSBtaXhlciBnYWluIGNvcnJlY3Rpb24gKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSBFcXVhbGlzZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgODAwMCBIeiBzYW1wbGUgcmF0ZSwgQ1Mgc2NhbGVkIHdpdGggMS4wMzg0OTcgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NzU0ODAgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAgMjA2OTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjI2MzMxMiAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9BMSAgICAgICAgICAgICAgICAgICAgICgtOTg1OSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjYwMTc0OCAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICgtNDU5OSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI4MDY4MSAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9CMSAgICAgICAgICAgICAgICAgICAgICgtNzc5NykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjQ3NTg2NSAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9CMiAgICAgICAgICAgICAgICAgICAgICgtNjY4NykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjQwODE1NCAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfODAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl84MDAwX0EwICAgICAgICAgICAgICAgICAgICAzMDkxMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuOTQzMzU3ICovCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTEgICAgICAgICAgICAgICAgICAoLTE0NzI0KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDQ5MzQ1ICovCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQTIgICAgICAgICAgICAgICAgICAgKC02ODY4KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMjA5NTk0ICovCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQjEgICAgICAgICAgICAgICAgICAoLTE1NTkzKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDc1ODY1ICovCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfQjIgICAgICAgICAgICAgICAgICAoLTEzMzc0KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDA4MTU0ICovCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgIDE1Ci0KLS8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDExMDI1SHogc2FtcGxlIHJhdGUsIENTIHNjYWxlZCB3aXRoIDEuMDI3NzYxIGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzY3NDYzICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9BMCAgICAgICAgICAgICAgICAgICAgIDE4MDQxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4xMDExNDUgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzExMDI1X0ExICAgICAgICAgICAgICAgICAgICAgIDIyNzggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjEzOTAyMCAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAgKC0xNDE2MykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjg2NDQyMyAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMTEwMjVfQjEgICAgICAgICAgICAgICAgICAgICAgIDQwMiAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMDI0NTQxICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9CMiAgICAgICAgICAgICAgICAgICAoLTE0ODkyKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuOTA4OTMwICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzExMDI1X0EwICAgICAgICAgICAgICAgICAgIDMxOTgzICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC45NzYwNTggKi8KLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTEgICAgICAgICAgICAgICAgICgtMjI3ODQpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC42OTUzMjYgKi8KLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTIgICAgICAgICAgICAgICAgICAoLTI5NzYpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wOTA4MDkgKi8KLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjEgICAgICAgICAgICAgICAgICgtMjAwMDgpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC42MTA1OTQgKi8KLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjIgICAgICAgICAgICAgICAgICgtMTAxOTYpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zMTExNDkgKi8KLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTEwMjVfU0NBTEUgICAgICAgICAgICAgICAgICAgMTUKLQotLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMTIwMDBIeiBzYW1wbGUgcmF0ZSwgQ1Mgc2NhbGVkIHdpdGggMS4wMzI1MjEgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NzEwMTcgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzEyMDAwX0EwICAgICAgICAgICAgICAgICAgICAgMjA5MTcgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjI3NjY2MSAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQTEgICAgICAgICAgICAgICAgICAgKC0xNjY3MSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjAxNzUxOSAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQTIgICAgICAgICAgICAgICAgICAgICAoLTcyMykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjA0NDEyOCAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQjEgICAgICAgICAgICAgICAgICAgKC0xMTk1NCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjcyOTYxNiAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAgICgtMzM1MSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIwNDUzMiAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMCAgICAgICAgICAgICAgICAgICAxNjUwMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMDA3MDk1ICovCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0ExICAgICAgICAgICAgICAgICAoLTE0Mjg1KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuODcxOTEyICovCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzEyMDAwX0EyICAgICAgICAgICAgICAgICAgICAgMzgxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4wMjMyMzIgKi8KLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjEgICAgICAgICAgICAgICAgICgtMTIyMjApICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC43NDU4NTcgKi8KLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjIgICAgICAgICAgICAgICAgICAoLTMwOTkpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4xODkxNzEgKi8KLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMTIwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTQKLQotLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMTYwMDBIeiBzYW1wbGUgcmF0ZSwgQ1Mgc2NhbGVkIHdpdGggMS4wMzEzNzggYW5kIENTRVggc2NhbGVkIHdpdGggMC43NzAxNjQgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzE2MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMjA5OTggICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjI4MTYyOSAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTEgICAgICAgICAgICAgICAgICAgKC0xNzYyNykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjA3NTg3MiAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQTIgICAgICAgICAgICAgICAgICAgICAoLTY3OCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjA0MTM2NSAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQjEgICAgICAgICAgICAgICAgICAgKC0xMTg4MikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjcyNTIzOSAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfQjIgICAgICAgICAgICAgICAgICAgICgtMzY3NikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjIyNDM1OCAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMTYwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMCAgICAgICAgICAgICAgICAgICAxNzcxMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMDgxMDkxICovCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0ExICAgICAgICAgICAgICAgICAoLTE0MjA4KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuODY3MTgzICovCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0EyICAgICAgICAgICAgICAgICAgKC0xMTUxKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMDcwMjQ3ICovCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IxICAgICAgICAgICAgICAgICAgKC04NDQwKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNTE1MTIxICovCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IyICAgICAgICAgICAgICAgICAgKC02OTc4KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDI1ODkzICovCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzE2MDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDE0Ci0KLS8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDIyMDUwSHogc2FtcGxlIHJhdGUsIENTIHNjYWxlZCB3aXRoIDEuMDQxNTc2IGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzc3Nzc5ICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAgIDIyNzUxICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4zODg2MDUgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0ExICAgICAgICAgICAgICAgICAgICgtMjEzOTQpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS4zMDU3OTkgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAgICA2NTQgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjAzOTkyMiAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQjEgICAgICAgICAgICAgICAgICAgKC0xMTc4OCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjcxOTQ5NCAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAgICgtMzk4NSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI0MzI0NSAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxNAotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMCAgICAgICAgICAgICAgICAgICAyMDg1NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuMjcyOTEwICovCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0ExICAgICAgICAgICAgICAgICAoLTIxOTcxKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuMzQxMDE0ICovCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzIyMDUwX0EyICAgICAgICAgICAgICAgICAgICAyNzQ0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4xNjc0NjIgKi8KLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQjEgICAgICAgICAgICAgICAgICgtMTAwNjMpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC42MTQyMTkgKi8KLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQjIgICAgICAgICAgICAgICAgICAoLTU2NTkpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zNDUzODQgKi8KLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjIwNTBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTQKLQotLyogRXF1YWxpc2VyIGNvZWZmaWNpZW50cyBmb3IgMjQwMDBIeiBzYW1wbGUgcmF0ZSwgQ1Mgc2NhbGVkIHdpdGggMS4wMzQ0OTUgYW5kIENTRVggc2NhbGVkIHdpdGggMC43NzI0OTEgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgICAgMjMwOTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjQwOTgzMiAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQTEgICAgICAgICAgICAgICAgICAgKC0yMzg2MykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjQ1NjUwNiAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgICAgMjQ4MSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMTUxNDEwICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgICAoLTEzMTc2KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuODA0MjAxICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICAgKC0yNjgzKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuMTYzNzgzICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDE0Ci0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzI0MDAwX0EwICAgICAgICAgICAgICAgICAgIDIxMjg2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4yOTkxOTggKi8KLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTEgICAgICAgICAgICAgICAgICgtMjM3OTcpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS40NTI0NDcgKi8KLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTIgICAgICAgICAgICAgICAgICAgIDM5NDAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjI0MDQ4OSAqLwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9CMSAgICAgICAgICAgICAgICAgKC0xMDk2NikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjY2OTMwMyAqLwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9CMiAgICAgICAgICAgICAgICAgICgtNDgzMykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjI5NDk4NCAqLwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8yNDAwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxNAotCi0vKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciAzMjAwMEh6IHNhbXBsZSByYXRlLCBDUyBzY2FsZWQgd2l0aCAxLjA0NDU1OSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc4MDAwNiAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAgICAyNTU3NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuNTYwOTg4ICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMSAgICAgICAgICAgICAgICAgICAoLTMwNzY1KSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTEuODc3NzI0ICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgICA2Mzg2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC4zODk3NDEgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgICgtMTQ4NjcpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC45MDc0MTAgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgICAoLTExNTUpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4wNzA0ODkgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgICAgMTQKLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTAgICAgICAgICAgICAgICAgICAgMTQ2MjMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAxLjc4NTA0OSAqLwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMSAgICAgICAgICAgICAgICAgKC0xODI5NykgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0yLjIzMzQ5NyAqLwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMiAgICAgICAgICAgICAgICAgICAgNDMxMyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuNTI2NDMxICovCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0IxICAgICAgICAgICAgICAgICAgKC0zNjUzKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNDQ1OTM5ICovCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX0IyICAgICAgICAgICAgICAgICAgKC00MjgwKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTAuNTIyNDQ2ICovCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzMyMDAwX1NDQUxFICAgICAgICAgICAgICAgICAgIDEzCi0KLS8qIEVxdWFsaXNlciBjb2VmZmljaWVudHMgZm9yIDQ0MTAwSHogc2FtcGxlIHJhdGUsIENTIHNjYWxlZCB3aXRoIDEuMDIyMTcwIGFuZCBDU0VYIHNjYWxlZCB3aXRoIDAuNzYzMjg4ICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9BMCAgICAgICAgICAgICAgICAgICAgIDEzMzA0ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS42MjM5OTMgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0ExICAgICAgICAgICAgICAgICAgICgtMTg2MDIpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMi4yNzA3NDMgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ0MTAwX0EyICAgICAgICAgICAgICAgICAgICAgIDU2NDMgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjY4ODgyOSAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQjEgICAgICAgICAgICAgICAgICAgICgtOTE1MikgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0xLjExNzE5MCAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfNDQxMDBfQjIgICAgICAgICAgICAgICAgICAgICAgMTA2NyAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDAuMTMwMjA4ICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAgIDEzCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0EwICAgICAgICAgICAgICAgICAgIDE2NjE2ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMi4wMjgzMTUgKi8KLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTEgICAgICAgICAgICAgICAgICgtMjM2MTMpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMi44ODI0NTkgKi8KLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTIgICAgICAgICAgICAgICAgICAgIDc0MTAgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjkwNDUzNSAqLwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9CMSAgICAgICAgICAgICAgICAgICgtNDg2MCkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjU5MzMwOCAqLwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9CMiAgICAgICAgICAgICAgICAgICgtMzE2MSkgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIC0wLjM4NTgxNiAqLwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80NDEwMF9TQ0FMRSAgICAgICAgICAgICAgICAgICAxMwotCi0vKiBFcXVhbGlzZXIgY29lZmZpY2llbnRzIGZvciA0ODAwMEh6IHNhbXBsZSByYXRlLCBDUyBzY2FsZWQgd2l0aCAxLjAxODYzNSBhbmQgQ1NFWCBzY2FsZWQgd2l0aCAwLjc2MDY0OCAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfQTAgICAgICAgICAgICAgICAgICAgICAxMzQ0NSAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDEuNjQxMTc3ICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9BMSAgICAgICAgICAgICAgICAgICAoLTE5MzcyKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTIuMzY0Njg3ICovCi0jZGVmaW5lIENTX0VRVUFMSVNFUl80ODAwMF9BMiAgICAgICAgICAgICAgICAgICAgICA2MjI1ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMC43NTk5MTAgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IxICAgICAgICAgICAgICAgICAgICAoLTk1NTgpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMS4xNjY3NzQgKi8KLSNkZWZpbmUgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IyICAgICAgICAgICAgICAgICAgICAgIDE0NTkgICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjE3ODA3NCAqLwotI2RlZmluZSBDU19FUVVBTElTRVJfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgICAxMwotI2RlZmluZSBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMCAgICAgICAgICAgICAgICAgICAxNzIwMCAgICAgICAgIC8qIEZsb2F0aW5nIHBvaW50IHZhbHVlIDIuMDk5NjU1ICovCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0ExICAgICAgICAgICAgICAgICAoLTI1MTEwKSAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgLTMuMDY1MjIwICovCi0jZGVmaW5lIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0EyICAgICAgICAgICAgICAgICAgICA4Mjc3ICAgICAgICAgLyogRmxvYXRpbmcgcG9pbnQgdmFsdWUgMS4wMTA0MTcgKi8KLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjEgICAgICAgICAgICAgICAgICAoLTUxOTQpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC42MzQwMjEgKi8KLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjIgICAgICAgICAgICAgICAgICAoLTI4NDUpICAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAtMC4zNDczMzIgKi8KLSNkZWZpbmUgQ1NFWF9FUVVBTElTRVJfNDgwMDBfU0NBTEUgICAgICAgICAgICAgICAgICAgMTMKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFRoZSBPdXRwdXQgR2FpbiBDb3JyZWN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMVkNTX0hFQURQSE9ORV9TSElGVCAgICAgICAgICAgICAgICAgICAgICAgICAgMiAgICAgICAgICAgICAgLyogT3V0cHV0IFNoaWZ0ICovCi0jZGVmaW5lIExWQ1NfSEVBRFBIT05FX1NISUZUTE9TUyAgICAgICAgICAgICAgICAgIDI3Nzc5ICAgICAgICAgICAgICAvKiBPdXRwdXQgU2hpZnQgbG9zcyAqLwotI2RlZmluZSBMVkNTX0hFQURQSE9ORV9HQUlOICAgICAgICAgICAgICAgICAgICAgICAgNjg0MCAgICAgICAgICAgICAgLyogVW5wcm9jZXNzZWQgcGF0aCBnYWluICovCi0jZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUICAgICAgICAgICAgICAgICAgICAgICAzICAgICAgICAgICAgICAvKiBFWCBPdXRwdXQgU2hpZnQgKi8KLSNkZWZpbmUgTFZDU19FWF9IRUFEUEhPTkVfU0hJRlRMT1NTICAgICAgICAgICAgICAgMTg2MDAgICAgICAgICAgICAgIC8qIEVYIE91dHB1dCBTaGlmdCBsb3NzICovCi0jZGVmaW5lIExWQ1NfRVhfSEVBRFBIT05FX0dBSU4gICAgICAgICAgICAgICAgICAgICA1MTA4ICAgICAgICAgICAgICAvKiBFWCBVbnByb2Nlc3NlZCBwYXRoIGdhaW4gKi8KLSNlbmRpZgogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfSW5pdC5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGM3NjI3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmMKKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJMVkNTLmgiCi0jaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiCi0jaW5jbHVkZSAiTFZDU19UYWJsZXMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX01lbW9yeSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBmcmVlLiBJdCBjYW4gYmUgY2FsbGVkIGluICAgICAgICAgICAqLwotLyogIHR3byB3YXlzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgaEluc3RhbmNlID0gTlVMTCAgICAgICAgICAgICAgICBSZXR1cm5zIHRoZSBtZW1vcnkgcmVxdWlyZW1lbnRzICAgICAgICAgICAgICAgICAqLwotLyogICAgICBoSW5zdGFuY2UgPSBJbnN0YW5jZSBoYW5kbGUgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgYW5kICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGVkIGJhc2UgYWRkcmVzc2VzIGZvciB0aGUgaW5zdGFuY2UgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIChoSW5zdGFuY2U9TlVMTCkgaXQgaXMgICAgICAgICAgICovCi0vKiAgcGFzc2VkIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGllcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gY2FsbGVkIGZvciBtZW1vcnkgYWxsb2NhdGlvbiB0aGUgbWVtb3J5IGJhc2UgYWRkcmVzcyBwb2ludGVycyBhcmUgTlVMTCBvbiAgICAgICovCi0vKiAgcmV0dXJuLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFdoZW4gdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgZnJlZSAoaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlKSB0aGUgICAgICAgICAgICAgICovCi0vKiAgY2FwYWJpbGl0aWVzIGFyZSBpZ25vcmVkIGFuZCB0aGUgbWVtb3J5IHRhYmxlIHJldHVybnMgdGhlIGFsbG9jYXRlZCBtZW1vcnkgYW5kICAgICAgKi8KLS8qICBiYXNlIGFkZHJlc3NlcyB1c2VkIGR1cmluZyBpbml0aWFsaXNhdGlvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBNZW1vcnlUYWJsZSAgICAgICAgICAgIFBvaW50ZXIgdG8gYW4gZW1wdHkgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICovCi0vKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgZGVmYXVsdCBjYXBhYmlsaXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgU3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoaXMgZnVuY3Rpb24gbWF5IGJlIGludGVycnVwdGVkIGJ5IHRoZSBMVkNTX1Byb2Nlc3MgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfTWVtb3J5KExWQ1NfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19NZW1UYWJfdCAgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19DYXBhYmlsaXRpZXNfdCAgICAqcENhcGFiaWxpdGllcykKLXsKLQotICAgIExWTV9VSU5UMzIgICAgICAgICAgU2NyYXRjaFNpemU7Ci0gICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAqKWhJbnN0YW5jZTsKLQotCi0gICAgLyoKLSAgICAgKiBGaWxsIGluIHRoZSBtZW1vcnkgdGFibGUKLSAgICAgKi8KLSAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogSW5zdGFuY2UgbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSAgICAgICAgID0gKExWTV9VSU5UMzIpc2l6ZW9mKExWQ1NfSW5zdGFuY2VfdCk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5UeXBlICAgICAgICAgPSBMVkNTX1BFUlNJU1RFTlQ7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBEYXRhIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUgICAgICAgICA9IChMVk1fVUlOVDMyKXNpemVvZihMVkNTX0RhdGFfdCk7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVkNTX0RBVEE7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBDb2VmZmljaWVudCBtZW1vcnkKLSAgICAgICAgICovCi0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplICAgICAgICAgPSAoTFZNX1VJTlQzMilzaXplb2YoTFZDU19Db2VmZmljaWVudF90KTsKLSAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlR5cGUgICAgICAgICA9IExWQ1NfQ09FRkZJQ0lFTlQ7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLQotICAgICAgICAvKgotICAgICAgICAgKiBTY3JhdGNoIG1lbW9yeQotICAgICAgICAgKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotICAgICAgICAvKiBJbnBsYWNlIHByb2Nlc3NpbmcgKi8KLSAgICAgICAgU2NyYXRjaFNpemUgPSAoTFZNX1VJTlQzMikgXAotICAgICAgICAgICAgICAgICAgICAgICAgKExWQ1NfU0NSQVRDSEJVRkZFUlMgKiBzaXplb2YoTFZNX0ZMT0FUKSAqIHBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7Ci0jZWxzZQotICAgICAgICBTY3JhdGNoU2l6ZSA9IChMVk1fVUlOVDMyKShMVkNTX1NDUkFUQ0hCVUZGRVJTKnNpemVvZihMVk1fSU5UMTYpKnBDYXBhYmlsaXRpZXMtPk1heEJsb2NrU2l6ZSk7ICAgICAvKiBJbnBsYWNlIHByb2Nlc3NpbmcgKi8KLSNlbmRpZgotICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSAgICAgICAgID0gU2NyYXRjaFNpemU7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5UeXBlICAgICAgICAgPSBMVkNTX1NDUkFUQ0g7Ci0gICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogUmVhZCBiYWNrIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCi0gICAgICAgICpwTWVtb3J5VGFibGUgPSBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlOwotICAgIH0KLQotICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwotfQotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIENyZWF0ZSBhbmQgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBDb25jZXJ0IFNvdW5kIG1vZHVsZSAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byBjcmVhdGUgYW4gYWxnb3JpdGhtIGluc3RhbmNlIGJ5IGNhbGxpbmcgd2l0aCAgICAgICAqLwotLyogIGhJbnN0YW5jZSBzZXQgdG8gTFZNX05VTEwuIEluIHRoaXMgY2FzZSB0aGUgYWxnb3JpdGhtIHJldHVybnMgdGhlIG5ldyBpbnN0YW5jZSAgKi8KLS8qICBoYW5kbGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gZm9yY2UgYSBmdWxsIHJlLWluaXRpYWxpc2F0aW9uIG9mIHRoZSBhbGdvcml0aG0gICAgKi8KLS8qICBieSBjYWxsaW5nIHdpdGggaEluc3RhbmNlID0gSW5zdGFuY2UgSGFuZGxlLiBJbiB0aGlzIGNhc2UgdGhlIG1lbW9yeSB0YWJsZSAgICAgICovCi0vKiAgc2hvdWxkIGJlIGNvcnJlY3QgZm9yIHRoZSBpbnN0YW5jZSwgdGhpcyBjYW4gYmUgZW5zdXJlZCBieSBjYWxsaW5nIHRoZSBmdW5jdGlvbiAqLwotLyogIExWQ1NfTWVtb3J5IGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwTWVtb3J5VGFibGUgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICovCi0vKiAgcENhcGFiaWxpdGllcyAgICAgICAgICAgUG9pbnRlciB0byB0aGUgY2FwYWJpbGl0aWVzIHN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gc3VjY2VlZGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFRoZSBpbnN0YW5jZSBoYW5kbGUgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGJhc2UgYWRkcmVzcyBvZiB0aGUgZmlyc3QgbWVtb3J5ICAqLwotLyogICAgICByZWdpb24uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAyLiAgVGhpcyBmdW5jdGlvbiBtdXN0IG5vdCBiZSBpbnRlcnJ1cHRlZCBieSB0aGUgTFZDU19Qcm9jZXNzIGZ1bmN0aW9uICAgICAgICAgICovCi0vKiAgMy4gIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBjYWxsZWQgd2l0aCB0aGUgc2FtZSBjYXBhYmlsaXRpZXMgYXMgdXNlZCBmb3IgdGhlICAgICAqLwotLyogICAgICBjYWxsIHRvIHRoZSBtZW1vcnkgZnVuY3Rpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX0luaXQoTFZDU19IYW5kbGVfdCAgICAgICAgICpwaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfTWVtVGFiX3QgICAgICAgICAqcE1lbW9yeVRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQ2FwYWJpbGl0aWVzX3QgICAqcENhcGFiaWxpdGllcykKLXsKLQotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgICAgICAgICAgKnBJbnN0YW5jZTsKLSAgICBMVkNTX1ZvbENvcnJlY3RfdCAgICAgICAgICAgICAgICpwTFZDU19Wb2xDb3JyZWN0VGFibGU7Ci0KLQotICAgIC8qCi0gICAgICogU2V0IHRoZSBpbnN0YW5jZSBoYW5kbGUgaWYgbm90IGFscmVhZHkgaW5pdGlhbGlzZWQKLSAgICAgKi8KLSAgICBpZiAoKnBoSW5zdGFuY2UgPT0gTFZNX05VTEwpCi0gICAgewotICAgICAgICAqcGhJbnN0YW5jZSA9IChMVkNTX0hhbmRsZV90KXBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3M7Ci0gICAgfQotICAgIHBJbnN0YW5jZSA9KExWQ1NfSW5zdGFuY2VfdCAgKikqcGhJbnN0YW5jZTsKLQotCi0gICAgLyoKLSAgICAgKiBTYXZlIHRoZSBjYXBhYmlsaXRpZXMgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZQotICAgICAqLwotICAgIHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzID0gKnBDYXBhYmlsaXRpZXM7Ci0KLSAgICAvKgotICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlCi0gICAgICovCi0gICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZSA9ICpwTWVtb3J5VGFibGU7Ci0KLQotICAgIC8qCi0gICAgICogU2V0IGFsbCBpbml0aWFsIHBhcmFtZXRlcnMgdG8gaW52YWxpZCB0byBmb3JjZSBhIGZ1bGwgaW5pdGlhbGlzYXRpb24KLSAgICAgKi8KLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICA9IExWQ1NfT0ZGOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlICAgID0gTFZDU19TUEVBS0VSVFlQRV9NQVg7Ci0gICAgcEluc3RhbmNlLT5PdXRwdXREZXZpY2UgICAgICAgICAgPSBMVkNTX0hFQURQSE9ORTsKLSAgICBwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgICA9IExWQ1NfU09VUkNFTUFYOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLkNvbXByZXNzb3JNb2RlID0gTFZNX01PREVfT0ZGOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgICAgID0gTFZNX0ZTX0lOVkFMSUQ7Ci0gICAgcEluc3RhbmNlLT5QYXJhbXMuRWZmZWN0TGV2ZWwgICAgPSAwOwotICAgIHBJbnN0YW5jZS0+UGFyYW1zLlJldmVyYkxldmVsICAgID0gKExWTV9VSU5UMTYpMHg4MDAwOwotICAgIHBMVkNTX1ZvbENvcnJlY3RUYWJsZSAgICAgICAgICAgID0gKExWQ1NfVm9sQ29ycmVjdF90KikmTFZDU19Wb2xDb3JyZWN0VGFibGVbMF07Ci0gICAgcEluc3RhbmNlLT5Wb2xDb3JyZWN0ICAgICAgICAgICAgPSBwTFZDU19Wb2xDb3JyZWN0VGFibGVbMF07Ci0gICAgcEluc3RhbmNlLT5UcmFuc2l0aW9uR2FpbiAgICAgICAgPSAwOwotCi0gICAgLyogVGhlc2UgY3VycmVudCBhbmQgdGFyZ2V0IHZhbHVlcyBhcmUgaW50aWFsaXplZCBhZ2FpbiBpbiBMVkNTX0NvbnRyb2wuYyAqLwotICAgIExWQ19NaXhlcl9Jbml0KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSwwLDApOwotICAgIC8qIFRoZXNlIGN1cnJlbnQgYW5kIHRhcmdldCB2YWx1ZXMgYXJlIGludGlhbGl6ZWQgYWdhaW4gaW4gTFZDU19Db250cm9sLmMgKi8KLSAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMV0sMCwwKTsKLQotICAgIC8qCi0gICAgICogSW5pdGlhbGlzZSB0aGUgYnlwYXNzIHZhcmlhYmxlcwotICAgICAqLwotICAgIHBJbnN0YW5jZS0+TVNUYXJnZXQwPTA7Ci0gICAgcEluc3RhbmNlLT5NU1RhcmdldDE9MDsKLSAgICBwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uICAgICAgICAgID0gTFZNX0ZBTFNFOwotICAgIHBJbnN0YW5jZS0+YlRpbWVyRG9uZSAgICAgICAgICAgICAgICAgICAgICAgID0gTFZNX0ZBTFNFOwotICAgIHBJbnN0YW5jZS0+VGltZXJQYXJhbXMuQ2FsbEJhY2tQYXJhbSAgICAgICAgID0gMDsKLSAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLnBDYWxsQmFjayAgICAgICAgICAgICA9IExWQ1NfVGltZXJDYWxsQmFjazsKLSAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLnBDYWxsYmFja0luc3RhbmNlICAgICA9IHBJbnN0YW5jZTsKLSAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLnBDYWxsQmFja1BhcmFtcyAgICAgICA9IExWTV9OVUxMOwotCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Ci19Ci0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Jbml0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzBlY2Y3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX0luaXQuY3BwCkBAIC0wLDAgKzEsMjEwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWQ1MuaCIKKyNpbmNsdWRlICJMVkNTX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVkNTX1RhYmxlcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfTWVtb3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gYW5kIGZyZWUuIEl0IGNhbiBiZSBjYWxsZWQgaW4gICAgICAgICAgICovCisvKiAgdHdvIHdheXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBoSW5zdGFuY2UgPSBOVUxMICAgICAgICAgICAgICAgIFJldHVybnMgdGhlIG1lbW9yeSByZXF1aXJlbWVudHMgICAgICAgICAgICAgICAgICovCisvKiAgICAgIGhJbnN0YW5jZSA9IEluc3RhbmNlIGhhbmRsZSAgICAgUmV0dXJucyB0aGUgbWVtb3J5IHJlcXVpcmVtZW50cyBhbmQgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY2F0ZWQgYmFzZSBhZGRyZXNzZXMgZm9yIHRoZSBpbnN0YW5jZSAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgbWVtb3J5IGFsbG9jYXRpb24gKGhJbnN0YW5jZT1OVUxMKSBpdCBpcyAgICAgICAgICAgKi8KKy8qICBwYXNzZWQgdGhlIGRlZmF1bHQgY2FwYWJpbGl0aWVzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiBjYWxsZWQgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIHRoZSBtZW1vcnkgYmFzZSBhZGRyZXNzIHBvaW50ZXJzIGFyZSBOVUxMIG9uICAgICAgKi8KKy8qICByZXR1cm4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgV2hlbiB0aGUgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBmcmVlIChoSW5zdGFuY2UgPSBJbnN0YW5jZSBIYW5kbGUpIHRoZSAgICAgICAgICAgICAgKi8KKy8qICBjYXBhYmlsaXRpZXMgYXJlIGlnbm9yZWQgYW5kIHRoZSBtZW1vcnkgdGFibGUgcmV0dXJucyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBhbmQgICAgICAqLworLyogIGJhc2UgYWRkcmVzc2VzIHVzZWQgZHVyaW5nIGluaXRpYWxpc2F0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byBhbiBlbXB0eSBtZW1vcnkgZGVmaW5pdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgKi8KKy8qICBwQ2FwYWJpbGl0aWVzICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBkZWZhdWx0IGNhcGFiaWxpdGVzICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhpcyBmdW5jdGlvbiBtYXkgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19NZW1vcnkoTFZDU19IYW5kbGVfdCAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX01lbVRhYl90ICAgICAgICAgICpwTWVtb3J5VGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0NhcGFiaWxpdGllc190ICAgICpwQ2FwYWJpbGl0aWVzKQoreworCisgICAgTFZNX1VJTlQzMiAgICAgICAgICBTY3JhdGNoU2l6ZTsKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICopaEluc3RhbmNlOworCisgICAgLyoKKyAgICAgKiBGaWxsIGluIHRoZSBtZW1vcnkgdGFibGUKKyAgICAgKi8KKyAgICBpZiAoaEluc3RhbmNlID09IExWTV9OVUxMKQorICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogSW5zdGFuY2UgbWVtb3J5CisgICAgICAgICAqLworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX1NMT1dfREFUQV0uU2l6ZSAgICAgICAgID0gKExWTV9VSU5UMzIpc2l6ZW9mKExWQ1NfSW5zdGFuY2VfdCk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5UeXBlICAgICAgICAgPSBMVkNTX1BFUlNJU1RFTlQ7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfU0xPV19EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBEYXRhIG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLlNpemUgICAgICAgICA9IChMVk1fVUlOVDMyKXNpemVvZihMVkNTX0RhdGFfdCk7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5UeXBlICAgICAgICAgPSBMVkNTX0RBVEE7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBDb2VmZmljaWVudCBtZW1vcnkKKyAgICAgICAgICovCisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5TaXplICAgICAgICAgPSAoTFZNX1VJTlQzMilzaXplb2YoTFZDU19Db2VmZmljaWVudF90KTsKKyAgICAgICAgcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLlR5cGUgICAgICAgICA9IExWQ1NfQ09FRkZJQ0lFTlQ7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKworICAgICAgICAvKgorICAgICAgICAgKiBTY3JhdGNoIG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgLyogSW5wbGFjZSBwcm9jZXNzaW5nICovCisgICAgICAgIFNjcmF0Y2hTaXplID0gKExWTV9VSU5UMzIpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMVkNTX1NDUkFUQ0hCVUZGRVJTICogc2l6ZW9mKExWTV9GTE9BVCkgKiBwQ2FwYWJpbGl0aWVzLT5NYXhCbG9ja1NpemUpOworICAgICAgICBwTWVtb3J5VGFibGUtPlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0uU2l6ZSAgICAgICAgID0gU2NyYXRjaFNpemU7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5UeXBlICAgICAgICAgPSBMVkNTX1NDUkFUQ0g7CisgICAgICAgIHBNZW1vcnlUYWJsZS0+UmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3MgPSBMVk1fTlVMTDsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUmVhZCBiYWNrIG1lbW9yeSBhbGxvY2F0aW9uIHRhYmxlICovCisgICAgICAgICpwTWVtb3J5VGFibGUgPSBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlOworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX0luaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDcmVhdGUgYW5kIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9uIGZvciB0aGUgQ29uY2VydCBTb3VuZCBtb2R1bGUgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGFuIGFsZ29yaXRobSBpbnN0YW5jZSBieSBjYWxsaW5nIHdpdGggICAgICAgKi8KKy8qICBoSW5zdGFuY2Ugc2V0IHRvIExWTV9OVUxMLiBJbiB0aGlzIGNhc2UgdGhlIGFsZ29yaXRobSByZXR1cm5zIHRoZSBuZXcgaW5zdGFuY2UgICovCisvKiAgaGFuZGxlLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIGZvcmNlIGEgZnVsbCByZS1pbml0aWFsaXNhdGlvbiBvZiB0aGUgYWxnb3JpdGhtICAgICovCisvKiAgYnkgY2FsbGluZyB3aXRoIGhJbnN0YW5jZSA9IEluc3RhbmNlIEhhbmRsZS4gSW4gdGhpcyBjYXNlIHRoZSBtZW1vcnkgdGFibGUgICAgICAqLworLyogIHNob3VsZCBiZSBjb3JyZWN0IGZvciB0aGUgaW5zdGFuY2UsIHRoaXMgY2FuIGJlIGVuc3VyZWQgYnkgY2FsbGluZyB0aGUgZnVuY3Rpb24gKi8KKy8qICBMVkNTX01lbW9yeSBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE1lbW9yeVRhYmxlICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgbWVtb3J5IGRlZmluaXRpb24gdGFibGUgICAgICAgICAgICAgICAgICAqLworLyogIHBDYXBhYmlsaXRpZXMgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGNhcGFiaWxpdGllcyBzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDEuICBUaGUgaW5zdGFuY2UgaGFuZGxlIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIGZpcnN0IG1lbW9yeSAgKi8KKy8qICAgICAgcmVnaW9uLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMi4gIFRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgaW50ZXJydXB0ZWQgYnkgdGhlIExWQ1NfUHJvY2VzcyBmdW5jdGlvbiAgICAgICAgICAqLworLyogIDMuICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIHdpdGggdGhlIHNhbWUgY2FwYWJpbGl0aWVzIGFzIHVzZWQgZm9yIHRoZSAgICAgKi8KKy8qICAgICAgY2FsbCB0byB0aGUgbWVtb3J5IGZ1bmN0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Jbml0KExWQ1NfSGFuZGxlX3QgICAgICAgICAqcGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX01lbVRhYl90ICAgICAgICAgKnBNZW1vcnlUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0NhcGFiaWxpdGllc190ICAgKnBDYXBhYmlsaXRpZXMpCit7CisKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAgICAgICAgICpwSW5zdGFuY2U7CisgICAgTFZDU19Wb2xDb3JyZWN0X3QgICAgICAgICAgICAgICAqcExWQ1NfVm9sQ29ycmVjdFRhYmxlOworCisgICAgLyoKKyAgICAgKiBTZXQgdGhlIGluc3RhbmNlIGhhbmRsZSBpZiBub3QgYWxyZWFkeSBpbml0aWFsaXNlZAorICAgICAqLworICAgIGlmICgqcGhJbnN0YW5jZSA9PSBMVk1fTlVMTCkKKyAgICB7CisgICAgICAgICpwaEluc3RhbmNlID0gKExWQ1NfSGFuZGxlX3QpcE1lbW9yeVRhYmxlLT5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9TTE9XX0RBVEFdLnBCYXNlQWRkcmVzczsKKyAgICB9CisgICAgcEluc3RhbmNlID0oTFZDU19JbnN0YW5jZV90ICAqKSpwaEluc3RhbmNlOworCisgICAgLyoKKyAgICAgKiBTYXZlIHRoZSBjYXBhYmlsaXRpZXMgaW4gdGhlIGluc3RhbmNlIHN0cnVjdHVyZQorICAgICAqLworICAgIHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzID0gKnBDYXBhYmlsaXRpZXM7CisKKyAgICAvKgorICAgICAqIFNhdmUgdGhlIG1lbW9yeSB0YWJsZSBpbiB0aGUgaW5zdGFuY2Ugc3RydWN0dXJlCisgICAgICovCisgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZSA9ICpwTWVtb3J5VGFibGU7CisKKyAgICAvKgorICAgICAqIFNldCBhbGwgaW5pdGlhbCBwYXJhbWV0ZXJzIHRvIGludmFsaWQgdG8gZm9yY2UgYSBmdWxsIGluaXRpYWxpc2F0aW9uCisgICAgICovCisgICAgcEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAgPSBMVkNTX09GRjsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAgICA9IExWQ1NfU1BFQUtFUlRZUEVfTUFYOworICAgIHBJbnN0YW5jZS0+T3V0cHV0RGV2aWNlICAgICAgICAgID0gTFZDU19IRUFEUEhPTkU7CisgICAgcEluc3RhbmNlLT5QYXJhbXMuU291cmNlRm9ybWF0ICAgPSBMVkNTX1NPVVJDRU1BWDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5Db21wcmVzc29yTW9kZSA9IExWTV9NT0RFX09GRjsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICAgICA9IExWTV9GU19JTlZBTElEOworICAgIHBJbnN0YW5jZS0+UGFyYW1zLkVmZmVjdExldmVsICAgID0gMDsKKyAgICBwSW5zdGFuY2UtPlBhcmFtcy5SZXZlcmJMZXZlbCAgICA9IChMVk1fVUlOVDE2KTB4ODAwMDsKKyAgICBwTFZDU19Wb2xDb3JyZWN0VGFibGUgICAgICAgICAgICA9IChMVkNTX1ZvbENvcnJlY3RfdCopJkxWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOworICAgIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdCAgICAgICAgICAgID0gcExWQ1NfVm9sQ29ycmVjdFRhYmxlWzBdOworICAgIHBJbnN0YW5jZS0+VHJhbnNpdGlvbkdhaW4gICAgICAgID0gMDsKKworICAgIC8qIFRoZXNlIGN1cnJlbnQgYW5kIHRhcmdldCB2YWx1ZXMgYXJlIGludGlhbGl6ZWQgYWdhaW4gaW4gTFZDU19Db250cm9sLmMgKi8KKyAgICBMVkNfTWl4ZXJfSW5pdCgmcEluc3RhbmNlLT5CeXBhc3NNaXguTWl4ZXJfSW5zdGFuY2UuTWl4ZXJTdHJlYW1bMF0sMCwwKTsKKyAgICAvKiBUaGVzZSBjdXJyZW50IGFuZCB0YXJnZXQgdmFsdWVzIGFyZSBpbnRpYWxpemVkIGFnYWluIGluIExWQ1NfQ29udHJvbC5jICovCisgICAgTFZDX01peGVyX0luaXQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLDAsMCk7CisKKyAgICAvKgorICAgICAqIEluaXRpYWxpc2UgdGhlIGJ5cGFzcyB2YXJpYWJsZXMKKyAgICAgKi8KKyAgICBwSW5zdGFuY2UtPk1TVGFyZ2V0MD0wOworICAgIHBJbnN0YW5jZS0+TVNUYXJnZXQxPTA7CisgICAgcEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiAgICAgICAgICA9IExWTV9GQUxTRTsKKyAgICBwSW5zdGFuY2UtPmJUaW1lckRvbmUgICAgICAgICAgICAgICAgICAgICAgICA9IExWTV9GQUxTRTsKKyAgICBwSW5zdGFuY2UtPlRpbWVyUGFyYW1zLkNhbGxCYWNrUGFyYW0gICAgICAgICA9IDA7CisgICAgcEluc3RhbmNlLT5UaW1lclBhcmFtcy5wQ2FsbEJhY2sgICAgICAgICAgICAgPSBMVkNTX1RpbWVyQ2FsbEJhY2s7CisgICAgcEluc3RhbmNlLT5UaW1lclBhcmFtcy5wQ2FsbGJhY2tJbnN0YW5jZSAgICAgPSBwSW5zdGFuY2U7CisgICAgcEluc3RhbmNlLT5UaW1lclBhcmFtcy5wQ2FsbEJhY2tQYXJhbXMgICAgICAgPSBMVk1fTlVMTDsKKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQorCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1ByaXZhdGUuaAppbmRleCBhOTdlNGYwLi42MjBiMzQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJpdmF0ZS5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcml2YXRlLmgKQEAgLTI3LDExICsyNyw2IEBACiAjaWZuZGVmIF9fTFZDU19QUklWQVRFX0hfXwogI2RlZmluZSBfX0xWQ1NfUFJJVkFURV9IX18KIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTQ1LDcgKzQwLDYgQEAKICNpbmNsdWRlICJMVkNTX0J5cGFzc01peC5oIiAgICAgICAgICAgICAgICAgICAgIC8qIEJ5cGFzcyBNaXhlciBtb2R1bGUgZGVmaW5pdGlvbnMgKi8KICNpbmNsdWRlICJMVk1fVGltZXIuaCIKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBEZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC02MSw2ICs1NSwxNSBAQAogCiAvKiBNZW1vcnkgKi8KICNkZWZpbmUgTFZDU19TQ1JBVENIQlVGRkVSUyAgICAgICAgICAgICAgNiAgICAgIC8qIE51bWJlciBvZiBidWZmZXJzIHJlcXVpcmVkIGZvciBpbnBsYWNlIHByb2Nlc3NpbmcgKi8KKyNpZmRlZiBTVVBQT1JUX01DCisvKgorICogVGhlIENvbmNlcnQgU3Vycm91bmQgbW9kdWxlIGFwcGxpZXMgcHJvY2Vzc2luZyBvbmx5IG9uIHRoZSBmaXJzdCB0d28KKyAqIGNoYW5uZWxzIG9mIGEgbXVsdGljaGFubmVsIGlucHV0LiBUaGUgZGF0YSBvZiBmaXJzdCB0d28gY2hhbm5lbHMgaXMgY29waWVkCisgKiBmcm9tIHRoZSBtdWx0aWNoYW5uZWwgaW5wdXQgaW50byBzY3JhdGNoIGJ1ZmZlci4gVGhlIGJ1ZmZlcnMgYWRkZWQgaGVyZQorICogYXJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZQorICovCisjZGVmaW5lIExWQ1NfTUNfU0NSQVRDSEJVRkZFUlMgICAgICAgICAgIDIKKyNlbmRpZgogCiAvKiBHZW5lcmFsICovCiAjZGVmaW5lIExWQ1NfSU5WQUxJRCAgICAgICAgICAgICAgICAweEZGRkYgICAgICAvKiBJbnZhbGlkIGluaXQgcGFyYW1ldGVyICovCkBAIC03MCw3ICs3Myw2IEBACiAjZGVmaW5lIExWQ1NfTlJfT0ZfRlMgICAgICAgICAgICAgICAgICAgIDkKICNkZWZpbmUgTFZDU19OUl9PRl9DSEFOX0NGRyAgICAgICAgICAgICAgMgogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFR5cGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTg1LDcgKzg3LDYgQEAKICAgICBMVkNTX0RFVklDRV9NQVggPSBMVk1fTUFYRU5VTQogfSBMVkNTX091dHB1dERldmljZV9lbjsKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC05NSwxNyArOTYsMTAgQEAKIC8qIFZvbHVtZSBjb3JyZWN0aW9uIHN0cnVjdHVyZSAqLwogdHlwZWRlZiBzdHJ1Y3QKIHsKLSNpZmRlZiBCVUlMRF9GTE9BVAogICAgIExWTV9GTE9BVCAgIENvbXBGdWxsOyAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAxMDAlIGVmZmVjdCAqLwogICAgIExWTV9GTE9BVCAgIENvbXBNaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9zdCBDUyBjb21wcmVzc2lvbiAwJSBlZmZlY3QgKi8KICAgICBMVk1fRkxPQVQgICBHYWluRnVsbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIENTIGdhaW4gY29ycmVjdCAxMDAlIGVmZmVjdCAqLwogICAgIExWTV9GTE9BVCAgIEdhaW5NaW47ICAgICAgICAgICAgICAgICAgICAgICAgLyogQ1MgZ2FpbiBjb3JyZWN0IDAlIGVmZmVjdCAqLwotI2Vsc2UKLSAgICBMVk1fSU5UMTYgICBDb21wRnVsbDsgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvc3QgQ1MgY29tcHJlc3Npb24gMTAwJSBlZmZlY3QgKi8KLSAgICBMVk1fSU5UMTYgICBDb21wTWluOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvc3QgQ1MgY29tcHJlc3Npb24gMCUgZWZmZWN0ICovCi0gICAgTFZNX0lOVDE2ICAgR2FpbkZ1bGw7ICAgICAgICAgICAgICAgICAgICAgICAvKiBDUyBnYWluIGNvcnJlY3QgMTAwJSBlZmZlY3QgKi8KLSAgICBMVk1fSU5UMTYgICBHYWluTWluOyAgICAgICAgICAgICAgICAgICAgICAgIC8qIENTIGdhaW4gY29ycmVjdCAwJSBlZmZlY3QgKi8KLSNlbmRpZgogfSBMVkNTX1ZvbENvcnJlY3RfdDsKIAogLyogSW5zdGFuY2Ugc3RydWN0dXJlICovCkBAIC0xMTksMTMgKzExMyw4IEBACiAgICAgLyogUHJpdmF0ZSBwYXJhbWV0ZXJzICovCiAgICAgTFZDU19PdXRwdXREZXZpY2VfZW4gICAgT3V0cHV0RGV2aWNlOyAgICAgICAvKiBTZWxlY3RlZCBvdXRwdXQgZGV2aWNlIHR5cGUgKi8KICAgICBMVkNTX1ZvbENvcnJlY3RfdCAgICAgICBWb2xDb3JyZWN0OyAgICAgICAgIC8qIFZvbHVtZSBjb3JyZWN0aW9uIHNldHRpbmdzICovCi0jaWZuZGVmIEJVSUxEX0ZMT0FUCi0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgVHJhbnNpdGlvbkdhaW47ICAgICAvKiBUcmFuc2l0aW9uIGdhaW4gKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICBDb21wcmVzc0dhaW47ICAgICAgIC8qIExhc3QgdXNlZCBjb21wcmVzc29yIGdhaW4qLwotI2Vsc2UKICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICBUcmFuc2l0aW9uR2FpbjsgICAgIC8qIFRyYW5zaXRpb24gZ2FpbiAqLwogICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgIENvbXByZXNzR2FpbjsgICAgICAgLyogTGFzdCB1c2VkIGNvbXByZXNzb3IgZ2FpbiovCi0jZW5kaWYKIAogICAgIC8qIFN1Yi1ibG9jayBjb25maWd1cmF0aW9ucyAqLwogICAgIExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAgIFN0ZXJlb0VuaGFuY2VyOyAgICAgLyogU3RlcmVvIGVuaGFuY2VyIGNvbmZpZ3VyYXRpb24gKi8KQEAgLTE0Niw0NCArMTM1LDI0IEBACiAvKiBDb2VmZmljaWVudCBTdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0jaWZkZWYgQlVJTERfRkxPQVQKICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBFcXVhbGlzZXJCaXF1YWRJbnN0YW5jZTsKICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBSZXZlcmJCaXF1YWRJbnN0YW5jZTsKICAgICBCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCAgICAgICBTRUJpcXVhZEluc3RhbmNlTWlkOwogICAgIEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90ICAgICAgIFNFQmlxdWFkSW5zdGFuY2VTaWRlOwotI2Vsc2UKLSAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBFcXVhbGlzZXJCaXF1YWRJbnN0YW5jZTsKLSAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBSZXZlcmJCaXF1YWRJbnN0YW5jZTsKLSAgICBCaXF1YWRfSW5zdGFuY2VfdCAgICAgICBTRUJpcXVhZEluc3RhbmNlTWlkOwotICAgIEJpcXVhZF9JbnN0YW5jZV90ICAgICAgIFNFQmlxdWFkSW5zdGFuY2VTaWRlOwotI2VuZGlmCiB9IExWQ1NfQ29lZmZpY2llbnRfdDsKIAogLyogRGF0YSBTdHJ1Y3R1cmUgKi8KIHR5cGVkZWYgc3RydWN0CiB7Ci0jaWZkZWYgQlVJTERfRkxPQVQKICAgICBCaXF1YWRfMklfT3JkZXIyX0ZMT0FUX1RhcHNfdCBFcXVhbGlzZXJCaXF1YWRUYXBzOwogICAgIEJpcXVhZF8ySV9PcmRlcjJfRkxPQVRfVGFwc190IFJldmVyYkJpcXVhZFRhcHM7CiAgICAgQmlxdWFkXzFJX09yZGVyMV9GTE9BVF9UYXBzX3QgU0VCaXF1YWRUYXBzTWlkOwogICAgIEJpcXVhZF8xSV9PcmRlcjJfRkxPQVRfVGFwc190IFNFQmlxdWFkVGFwc1NpZGU7Ci0jZWxzZQotICAgIEJpcXVhZF8ySV9PcmRlcjJfVGFwc190IEVxdWFsaXNlckJpcXVhZFRhcHM7Ci0gICAgQmlxdWFkXzJJX09yZGVyMl9UYXBzX3QgUmV2ZXJiQmlxdWFkVGFwczsKLSAgICBCaXF1YWRfMUlfT3JkZXIxX1RhcHNfdCBTRUJpcXVhZFRhcHNNaWQ7Ci0gICAgQmlxdWFkXzFJX09yZGVyMl9UYXBzX3QgU0VCaXF1YWRUYXBzU2lkZTsKLSNlbmRpZgogfSBMVkNTX0RhdGFfdDsKIAogdm9pZCBMVkNTX1RpbWVyQ2FsbEJhY2sgKCAgIHZvaWQqIGhJbnN0YW5jZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBwQ2FsbEJhY2tQYXJhbXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDMyIENhbGxiYWNrUGFyYW0pOwogCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KICNlbmRpZiAgICAgIC8qIFBSSVZBVEVfSCAqLwogCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTU2ZDRkLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmMKKysrIC9kZXYvbnVsbApAQCAtMSw1NTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIkxWQ1MuaCIKLSNpbmNsdWRlICJMVkNTX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCi0jaW5jbHVkZSAiQ29tcExpbS5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1Byb2Nlc3NfQ1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBQcm9jZXNzIGZ1bmN0aW9uIGZvciB0aGUgQ29uY2VydCBTb3VuZCBtb2R1bGUgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBibG9jayAgICAgICovCi0vKiAgZGlhZ3JhbTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICBfX19fX19fX18gICAgX19fX19fX18gICAgX19fX18gICAgX19fX19fXyAgICAgX19fICAgX19fX19fICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICB8ICAgICAgICAgfCAgfCAgICAgICAgfCAgfCAgICAgfCAgfCAgICAgICB8ICAgfCAgIHwgfCAgICAgIHwgICAgICAgICAgICovCi0vKiAgICAgLS0tLS0+fCBTdGVyZW8gIHwtPnwgUmV2ZXJiIHwtPnwgRXF1IHwtPnwgQWxwaGEgfC0tPnwgKyB8LXwgR2FpbiB8LS0tLT4gICAgICAqLwotLyogICAgICAgIHwgIHwgRW5oYW5jZSB8ICB8X19fX19fX198ICB8X19fX198ICB8X19fX19fX3wgICB8X19ffCB8X19fX19ffCAgICAgICAgICAgKi8KLS8qICAgICAgICB8ICB8X19fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19fX19fICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgIHwgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT58IDEgLSBBbHBoYSB8LS0tLS18ICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGUgU3RlcmVvIEVuaGFuY2VyLCBSZXZlcmIgYW5kIEVxdWFsaXNlciBibG9ja3MgYXJlIGVhY2ggY29uZmlndXJlZCB0byBoYXZlICAgICovCi0vKiAgdGhlaXIgZ2FpbiB0byBnaXZlIGEgbmVhciBwZWFrIHRvIHBlYWsgb3V0cHV0ICgtMC4xZEJGUykgd2l0aCBhIHdvcnN0IGNhc2UgICAgICAqLwotLyogIGlucHV0IHNpZ25hbC4gVGhlIGdhaW5zIG9mIHRoZXNlIGJsb2NrcyBhcmUgcmUtY29tYmluZWQgaW4gdGhlIEFscGhhIG1peGVyIGFuZCAgKi8KLS8qICB0aGUgZ2FpbiBibG9jayBmb2xsb2luZyB0aGUgc3VtLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFRoZSBwcm9jZXNzaW5nIHVzZXMgdGhlIG91dHB1dCBidWZmZXIgZm9yIGRhdGEgc3RvcmFnZSBhZnRlciBlYWNoIHByb2Nlc3NpbmcgICAgKi8KLS8qICBibG9jay4gV2hlbiBwcm9jZXNzaW5nIGlzIGlucGxhY2UgYSBjb3B5IG9mIHRoZSBpbnB1dCBzaWduYWwgaXMgbWFkZSBpbiBzY3JhdGNoICovCi0vKiAgbWVtb3J5IGZvciB0aGUgMS1BbHBoYSBwYXRoLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwSW5EYXRhICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBidWZmZXIgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0jaWZkZWYgQlVJTERfRkxPQVQKLUxWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUHJvY2Vzc19DUyhMVkNTX0hhbmRsZV90ICAgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAgKnBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpCi17Ci0gICAgY29uc3QgTFZNX0ZMT0FUICAgICAqcElucHV0OwotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgKnBTY3JhdGNoOwotICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuIGVycjsKLQotICAgIHBTY3JhdGNoICA9IChMVk1fRkxPQVQgKikgXAotICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKLQotICAgIC8qCi0gICAgICogQ2hlY2sgaWYgdGhlIHByb2Nlc3NpbmcgaXMgaW5wbGFjZQotICAgICAqLwotICAgIGlmIChwSW5EYXRhID09IHBPdXREYXRhKQotICAgIHsKLSAgICAgICAgLyogUHJvY2Vzc2luZyBpbnBsYWNlICovCi0gICAgICAgIHBJbnB1dCA9IHBTY3JhdGNoICsgKDIgKiBOdW1TYW1wbGVzKTsKLSAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5wdXQsICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyogUHJvY2Vzc2luZyBvdXRwbGFjZSAqLwotICAgICAgICBwSW5wdXQgPSBwSW5EYXRhOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ2FsbCB0aGUgc3RlcmVvIGVuaGFuY2VyCi0gICAgICovCi0gICAgZXJyID0gTFZDU19TdGVyZW9FbmhhbmNlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCi0KLSAgICAvKgotICAgICAqIENhbGwgdGhlIHJldmVyYiBnZW5lcmF0b3IKLSAgICAgKi8KLSAgICBlcnIgPSBMVkNTX1JldmVyYkdlbmVyYXRvcihoSW5zdGFuY2UsICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KLSAgICAKLSAgICAvKgotICAgICAqIENhbGwgdGhlIGVxdWFsaXNlcgotICAgICAqLwotICAgIGVyciA9IExWQ1NfRXF1YWxpc2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KLQotICAgIC8qCi0gICAgICogQ2FsbCB0aGUgYnlwYXNzIG1peGVyCi0gICAgICovCi0gICAgZXJyID0gTFZDU19CeXBhc3NNaXhlcihoSW5zdGFuY2UsICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBwcm9jZXNzZWQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcElucHV0LCAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0ICh1bnByb2Nlc3NlZCkgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLwotCi0gICAgaWYoZXJyICE9IExWQ1NfU1VDQ0VTUykKLSAgICB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Ci19Ci0jZWxzZQotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzX0NTKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcykKLXsKLSAgICBjb25zdCBMVk1fSU5UMTYgICAgICpwSW5wdXQ7Ci0gICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAqcFNjcmF0Y2ggID0gKExWTV9JTlQxNiAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7Ci0gICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gZXJyOwotCi0gICAgLyoKLSAgICAgKiBDaGVjayBpZiB0aGUgcHJvY2Vzc2luZyBpcyBpbnBsYWNlCi0gICAgICovCi0gICAgaWYgKHBJbkRhdGEgPT0gcE91dERhdGEpCi0gICAgewotICAgICAgICAvKiBQcm9jZXNzaW5nIGlucGxhY2UgKi8KLSAgICAgICAgcElucHV0ID0gcFNjcmF0Y2ggKyAoMipOdW1TYW1wbGVzKTsKLSAgICAgICAgQ29weV8xNigoTFZNX0lOVDE2ICopcEluRGF0YSwgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwSW5wdXQsICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpKTsgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIC8qIFByb2Nlc3Npbmcgb3V0cGxhY2UgKi8KLSAgICAgICAgcElucHV0ID0gcEluRGF0YTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENhbGwgdGhlIHN0ZXJlbyBlbmhhbmNlcgotICAgICAqLwotICAgIGVycj1MVkNTX1N0ZXJlb0VuaGFuY2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KLQotICAgIC8qCi0gICAgICogQ2FsbCB0aGUgcmV2ZXJiIGdlbmVyYXRvcgotICAgICAqLwotICAgIGVycj1MVkNTX1JldmVyYkdlbmVyYXRvcihoSW5zdGFuY2UsICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KLQotICAgIC8qCi0gICAgICogQ2FsbCB0aGUgZXF1YWxpc2VyCi0gICAgICovCi0gICAgZXJyPUxWQ1NfRXF1YWxpc2VyKGhJbnN0YW5jZSwgICAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KLQotICAgIC8qCi0gICAgICogQ2FsbCB0aGUgYnlwYXNzIG1peGVyCi0gICAgICovCi0gICAgZXJyPUxWQ1NfQnlwYXNzTWl4ZXIoaEluc3RhbmNlLCAgICAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCi0gICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgcHJvY2Vzc2VkIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgIHBJbnB1dCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCAodW5wcm9jZXNzZWQpIGRhdGEgKi8KLSAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLwotICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KLQotICAgIGlmKGVyciAhPUxWQ1NfU1VDQ0VTUykKLSAgICB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Ci19Ci0jZW5kaWYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFByb2Nlc3MgZnVuY3Rpb24gZm9yIHRoZSBDb25jZXJ0IFNvdW5kIG1vZHVsZS4gVGhlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHR3byAgKi8KLS8qICB2YXJpYW50cyBvZiB0aGUgYWxnb3JpdGhtLCBvbmUgZm9yIGhlYWRwaG9uZXMgYW5kIG9uZSBmb3IgbW9iaWxlIHNwZWFrZXJzLiAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIERhdGEgY2FuIGJlIHByb2Nlc3NlZCBpbiB0d28gZm9ybWF0cywgc3RlcmVvIG9yIG1vbm8taW4tc3RlcmVvLiBEYXRhIGluIG1vbm8gICAgKi8KLS8qICBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCwgdGhlIGNhbGxpbmcgcm91dGluZSBtdXN0IGNvbnZlcnQgdGhlIG1vbm8gc3RyZWFtIHRvICAgICovCi0vKiAgbW9uby1pbi1zdGVyZW8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwSW5EYXRhICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBidWZmZXIgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkNTX1Rvb01hbnlTYW1wbGVzICAgICBOdW1TYW1wbGVzIHdhcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBibG9jayBzaXplICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1Byb2Nlc3MoTFZDU19IYW5kbGVfdCAgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpCi17Ci0KLSAgICBMVkNTX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWQ1NfUmV0dXJuU3RhdHVzX2VuIGVycjsKLQotICAgIC8qCi0gICAgICogQ2hlY2sgdGhlIG51bWJlciBvZiBzYW1wbGVzIGlzIG5vdCB0b28gbGFyZ2UKLSAgICAgKi8KLSAgICBpZiAoTnVtU2FtcGxlcyA+IHBJbnN0YW5jZS0+Q2FwYWJpbGl0aWVzLk1heEJsb2NrU2l6ZSkKLSAgICB7Ci0gICAgICAgIHJldHVybihMVkNTX1RPT01BTllTQU1QTEVTKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIENoZWNrIGlmIHRoZSBhbGdvcml0aG0gaXMgZW5hYmxlZAotICAgICAqLwotICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICE9IExWQ1NfT0ZGKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogQ2FsbCBDUyBwcm9jZXNzIGZ1bmN0aW9uCi0gICAgICAgICAqLwotICAgICAgICAgICAgZXJyID0gTFZDU19Qcm9jZXNzX0NTKGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAKLSAgICAgICAgLyoKLSAgICAgICAgICogQ29tcHJlc3MgdG8gcmVkdWNlIGV4cGFuc2lvbiBlZmZlY3Qgb2YgQ29uY2VydCBTb3VuZCBhbmQgY29ycmVjdCB2b2x1bWUKLSAgICAgICAgICogZGlmZmVyZW5jZXMgZm9yIGRpZmZlcmVuY2Ugc2V0dGluZ3MuIE5vdCBhcHBsaWVkIGluIHRlc3QgbW9kZXMKLSAgICAgICAgICovCi0gICAgICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSA9PSBMVkNTX09OKSYmIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuQ29tcHJlc3Nvck1vZGUgPT0gTFZNX01PREVfT04pKQotICAgICAgICB7Ci0gICAgICAgICAgICBMVk1fRkxPQVQgR2FpbiA9IHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluOwotICAgICAgICAgICAgTFZNX0ZMT0FUIEN1cnJlbnQxOwotCi0gICAgICAgICAgICBDdXJyZW50MSA9IExWQ19NaXhlcl9HZXRDdXJyZW50KCZwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVswXSk7Ci0gICAgICAgICAgICBHYWluID0gKExWTV9GTE9BVCkoICBwSW5zdGFuY2UtPlZvbENvcnJlY3QuQ29tcE1pbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gKCgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluICAqIChDdXJyZW50MSkpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKCgoTFZNX0ZMT0FUKXBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wRnVsbCAqIChDdXJyZW50MSkpKSk7Ci0KLSAgICAgICAgICAgIGlmKE51bVNhbXBsZXMgPCBMVkNTX0NPTVBHQUlORlJBTUUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTm9uTGluQ29tcF9GbG9hdChHYWluLCAgICAgICAgICAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKSgyICogTnVtU2FtcGxlcykpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgR2FpblN0ZXA7Ci0gICAgICAgICAgICAgICAgTFZNX0ZMT0FUICBGaW5hbEdhaW47Ci0gICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBTYW1wbGVUb1Byb2Nlc3MgPSBOdW1TYW1wbGVzOwotICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgKnBPdXRQdHI7Ci0KLSAgICAgICAgICAgICAgICAvKiBMYXJnZSBjaGFuZ2VzIGluIEdhaW4gY2FuIGNhdXNlIGNsaWNrcyBpbiBvdXRwdXQKLSAgICAgICAgICAgICAgICAgICBTcGxpdCBkYXRhIGludG8gc21hbGwgYmxvY2tzIGFuZCB1c2UgaW50ZXJwb2xhdGVkIGdhaW4gdmFsdWVzICovCi0KLSAgICAgICAgICAgICAgICBHYWluU3RlcCA9IChMVk1fRkxPQVQpKCgoR2Fpbi1wSW5zdGFuY2UtPkNvbXByZXNzR2FpbikgKiBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX0NPTVBHQUlORlJBTUUpIC8gTnVtU2FtcGxlcyk7Ci0KLSAgICAgICAgICAgICAgICBpZigoR2FpblN0ZXAgPT0gMCkgJiYgKHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluIDwgR2FpbikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBHYWluU3RlcCA9IDE7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmKChHYWluU3RlcCA9PSAwKSAmJiAocEluc3RhbmNlLT5Db21wcmVzc0dhaW4gPiBHYWluKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgR2FpblN0ZXAgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEZpbmFsR2FpbiA9IEdhaW47Ci0gICAgICAgICAgICAgICAgR2FpbiA9IHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluOwotICAgICAgICAgICAgICAgIHBPdXRQdHIgPSBwT3V0RGF0YTsKLQotICAgICAgICAgICAgICAgIHdoaWxlKFNhbXBsZVRvUHJvY2VzcyA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBHYWluID0gKExWTV9GTE9BVCkoR2FpbiArIEdhaW5TdGVwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwID4gMCkgJiYgKEZpbmFsR2FpbiA8PSBHYWluKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgR2FpbiA9IEZpbmFsR2FpbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKChHYWluU3RlcCA8IDApICYmIChGaW5hbEdhaW4gPiBHYWluKSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgR2FpbiA9IEZpbmFsR2FpbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKFNhbXBsZVRvUHJvY2VzcyA+IExWQ1NfQ09NUEdBSU5GUkFNRSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTm9uTGluQ29tcF9GbG9hdChHYWluLCAgICAgICAgICAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoMiAqIExWQ1NfQ09NUEdBSU5GUkFNRSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciArPSAoMiAqIExWQ1NfQ09NUEdBSU5GUkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVUb1Byb2Nlc3MgPSAoTFZNX0lOVDE2KShTYW1wbGVUb1Byb2Nlc3MgLSBMVkNTX0NPTVBHQUlORlJBTUUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgTm9uTGluQ29tcF9GbG9hdChHYWluLCAgICAgICAgICAgICAgICAgICAgLyogQ29tcHJlc3NvciBnYWluIHNldHRpbmcgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoMiAqIFNhbXBsZVRvUHJvY2VzcykpOwotICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlVG9Qcm9jZXNzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvKiBTdG9yZSBnYWluIHZhbHVlKi8KLSAgICAgICAgICAgIHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluID0gR2FpbjsKLSAgICAgICAgfQotCi0KLSAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSl7Ci0KLSAgICAgICAgICAgIC8qCi0gICAgICAgICAgICAgKiBSZS1pbml0IGJ5cGFzcyBtaXggd2hlbiB0aW1lciBoYXMgY29tcGxldGVkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5iVGltZXJEb25lID09IExWTV9UUlVFKSAmJgotICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCA9PSAwKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBMVkNTX0J5cGFzc01peEluaXQoaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QYXJhbXMpOwotCi0gICAgICAgICAgICAgICAgaWYoZXJyICE9IExWQ1NfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgIExWTV9UaW1lciAoICZwSW5zdGFuY2UtPlRpbWVySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRoZSBhbGdvcml0aG0gaXMgZGlzYWJsZWQgc28ganVzdCBjb3B5IHRoZSBkYXRhCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLwotICAgICAgICB9Ci0gICAgfQotCi0KLSAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKLX0KLSNlbHNlCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1Byb2Nlc3MoTFZDU19IYW5kbGVfdCAgICAgICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0lOVDE2ICAgICAgICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpCi17Ci0KLSAgICBMVkNTX0luc3RhbmNlX3QgKnBJbnN0YW5jZSA9KExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gZXJyOwotCi0gICAgLyoKLSAgICAgKiBDaGVjayB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgaXMgbm90IHRvbyBsYXJnZQotICAgICAqLwotICAgIGlmIChOdW1TYW1wbGVzID4gcEluc3RhbmNlLT5DYXBhYmlsaXRpZXMuTWF4QmxvY2tTaXplKQotICAgIHsKLSAgICAgICAgcmV0dXJuKExWQ1NfVE9PTUFOWVNBTVBMRVMpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogQ2hlY2sgaWYgdGhlIGFsZ29yaXRobSBpcyBlbmFibGVkCi0gICAgICovCi0gICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgIT0gTFZDU19PRkYpCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBDYWxsIENTIHByb2Nlc3MgZnVuY3Rpb24KLSAgICAgICAgICovCi0gICAgICAgICAgICBlcnI9TFZDU19Qcm9jZXNzX0NTKGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENvbXByZXNzIHRvIHJlZHVjZSBleHBhbnNpb24gZWZmZWN0IG9mIENvbmNlcnQgU291bmQgYW5kIGNvcnJlY3Qgdm9sdW1lCi0gICAgICAgICAqIGRpZmZlcmVuY2VzIGZvciBkaWZmZXJlbmNlIHNldHRpbmdzLiBOb3QgYXBwbGllZCBpbiB0ZXN0IG1vZGVzCi0gICAgICAgICAqLwotICAgICAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgPT0gTFZDU19PTikmJihwSW5zdGFuY2UtPlBhcmFtcy5Db21wcmVzc29yTW9kZSA9PSBMVk1fTU9ERV9PTikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExWTV9JTlQxNiBHYWluID0gcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBNaW47Ci0gICAgICAgICAgICBMVk1fSU5UMzIgQ3VycmVudDE7Ci0KLSAgICAgICAgICAgIEN1cnJlbnQxID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdKTsKLSAgICAgICAgICAgIEdhaW4gPSAoTFZNX0lOVDE2KSggIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoKChMVk1fSU5UMzIpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBNaW4gICogKEN1cnJlbnQxKSkgPj4gMTUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKChMVk1fSU5UMzIpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBGdWxsICogKEN1cnJlbnQxKSkgPj4gMTUpICk7Ci0KLSAgICAgICAgICAgIGlmKE51bVNhbXBsZXMgPCBMVkNTX0NPTVBHQUlORlJBTUUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTm9uTGluQ29tcF9EMTYoR2FpbiwgICAgICAgICAgICAgICAgICAgIC8qIENvbXByZXNzb3IgZ2FpbiBzZXR0aW5nICovCi0gICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikoMipOdW1TYW1wbGVzKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTFZNX0lOVDE2ICBHYWluU3RlcDsKLSAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIEZpbmFsR2FpbjsKLSAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIFNhbXBsZVRvUHJvY2VzcyA9IE51bVNhbXBsZXM7Ci0gICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAqcE91dFB0cjsKLQotICAgICAgICAgICAgICAgIC8qIExhcmdlIGNoYW5nZXMgaW4gR2FpbiBjYW4gY2F1c2UgY2xpY2tzIGluIG91dHB1dAotICAgICAgICAgICAgICAgICAgIFNwbGl0IGRhdGEgaW50byBzbWFsbCBibG9ja3MgYW5kIHVzZSBpbnRlcnBvbGF0ZWQgZ2FpbiB2YWx1ZXMgKi8KLQotICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gKExWTV9JTlQxNikoKChHYWluLXBJbnN0YW5jZS0+Q29tcHJlc3NHYWluKSAqIExWQ1NfQ09NUEdBSU5GUkFNRSkvTnVtU2FtcGxlcyk7Ci0KLSAgICAgICAgICAgICAgICBpZigoR2FpblN0ZXAgPT0wKSYmKHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluIDwgR2FpbikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBHYWluU3RlcD0xOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZigoR2FpblN0ZXAgPT0wKSYmKHBJbnN0YW5jZS0+Q29tcHJlc3NHYWluID4gR2FpbikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5TdGVwPS0xOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgRmluYWxHYWluID0gR2FpbjsKLSAgICAgICAgICAgICAgICBHYWluID0gcEluc3RhbmNlLT5Db21wcmVzc0dhaW47Ci0gICAgICAgICAgICAgICAgcE91dFB0ciA9IHBPdXREYXRhOwotCi0gICAgICAgICAgICAgICAgd2hpbGUoU2FtcGxlVG9Qcm9jZXNzID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEdhaW4gPSAoTFZNX0lOVDE2KShHYWluICsgR2FpblN0ZXApOwotICAgICAgICAgICAgICAgICAgICBpZigoR2FpblN0ZXAgPiAwKSYmIChGaW5hbEdhaW4gPD0gR2FpbikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEdhaW4gPSBGaW5hbEdhaW47Ci0gICAgICAgICAgICAgICAgICAgICAgICBHYWluU3RlcCA9MDsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmKChHYWluU3RlcCA8IDApJiYgKEZpbmFsR2FpbiA+IEdhaW4pKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBHYWluID0gRmluYWxHYWluOwotICAgICAgICAgICAgICAgICAgICAgICAgR2FpblN0ZXAgPTA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZihTYW1wbGVUb1Byb2Nlc3MgPiBMVkNTX0NPTVBHQUlORlJBTUUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5vbkxpbkNvbXBfRDE2KEdhaW4sICAgICAgICAgICAgICAgICAgICAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKSgyKkxWQ1NfQ09NUEdBSU5GUkFNRSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciArPSgyKkxWQ1NfQ09NUEdBSU5GUkFNRSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVUb1Byb2Nlc3MgPSAoTFZNX0lOVDE2KShTYW1wbGVUb1Byb2Nlc3MtTFZDU19DT01QR0FJTkZSQU1FKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE5vbkxpbkNvbXBfRDE2KEdhaW4sICAgICAgICAgICAgICAgICAgICAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRQdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dFB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKSgyKlNhbXBsZVRvUHJvY2VzcykpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVUb1Byb2Nlc3MgPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8qIFN0b3JlIGdhaW4gdmFsdWUqLwotICAgICAgICAgICAgcEluc3RhbmNlLT5Db21wcmVzc0dhaW4gPSBHYWluOwotICAgICAgICB9Ci0KLQotICAgICAgICBpZihwSW5zdGFuY2UtPmJJbk9wZXJhdGluZ01vZGVUcmFuc2l0aW9uID09IExWTV9UUlVFKXsKLQotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFJlLWluaXQgYnlwYXNzIG1peCB3aGVuIHRpbWVyIGhhcyBjb21wbGV0ZWQKLSAgICAgICAgICAgICAqLwotICAgICAgICAgICAgaWYgKChwSW5zdGFuY2UtPmJUaW1lckRvbmUgPT0gTFZNX1RSVUUpICYmCi0gICAgICAgICAgICAgICAgKHBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzFdLkNhbGxiYWNrU2V0ID09IDApKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGVycj1MVkNTX0J5cGFzc01peEluaXQoaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QYXJhbXMpOwotCi0gICAgICAgICAgICAgICAgaWYoZXJyICE9IExWQ1NfU1VDQ0VTUykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlewotICAgICAgICAgICAgICAgIExWTV9UaW1lciAoICZwSW5zdGFuY2UtPlRpbWVySW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkKLSAgICAgICAgewotICAgICAgICAgICAgLyoKLSAgICAgICAgICAgICAqIFRoZSBhbGdvcml0aG0gaXMgZGlzYWJsZWQgc28ganVzdCBjb3B5IHRoZSBkYXRhCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIENvcHlfMTYoKExWTV9JTlQxNiAqKXBJbkRhdGEsICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCi0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwotfQotI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUHJvY2Vzcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVkM2JmYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19Qcm9jZXNzLmNwcApAQCAtMCwwICsxLDM4NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNC0yMDEwIE5YUCBTb2Z0d2FyZQorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlICJMVkNTLmgiCisjaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkNvbXBMaW0uaCIKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19Qcm9jZXNzX0NTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUHJvY2VzcyBmdW5jdGlvbiBmb3IgdGhlIENvbmNlcnQgU291bmQgbW9kdWxlIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgYmxvY2sgICAgICAqLworLyogIGRpYWdyYW06ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgX19fX19fX19fICAgIF9fX19fX19fICAgIF9fX19fICAgIF9fX19fX18gICAgIF9fXyAgIF9fX19fXyAgICAgICAgICAgICovCisvKiAgICAgICAgICAgfCAgICAgICAgIHwgIHwgICAgICAgIHwgIHwgICAgIHwgIHwgICAgICAgfCAgIHwgICB8IHwgICAgICB8ICAgICAgICAgICAqLworLyogICAgIC0tLS0tPnwgU3RlcmVvICB8LT58IFJldmVyYiB8LT58IEVxdSB8LT58IEFscGhhIHwtLT58ICsgfC18IEdhaW4gfC0tLS0+ICAgICAgKi8KKy8qICAgICAgICB8ICB8IEVuaGFuY2UgfCAgfF9fX19fX19ffCAgfF9fX19ffCAgfF9fX19fX198ICAgfF9fX3wgfF9fX19fX3wgICAgICAgICAgICovCisvKiAgICAgICAgfCAgfF9fX19fX19fX3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX19fX19fX19fXyAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICB8ICAgICB8ICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0+fCAxIC0gQWxwaGEgfC0tLS0tfCAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHxfX19fX19fX19fX3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIFN0ZXJlbyBFbmhhbmNlciwgUmV2ZXJiIGFuZCBFcXVhbGlzZXIgYmxvY2tzIGFyZSBlYWNoIGNvbmZpZ3VyZWQgdG8gaGF2ZSAgICAqLworLyogIHRoZWlyIGdhaW4gdG8gZ2l2ZSBhIG5lYXIgcGVhayB0byBwZWFrIG91dHB1dCAoLTAuMWRCRlMpIHdpdGggYSB3b3JzdCBjYXNlICAgICAgKi8KKy8qICBpbnB1dCBzaWduYWwuIFRoZSBnYWlucyBvZiB0aGVzZSBibG9ja3MgYXJlIHJlLWNvbWJpbmVkIGluIHRoZSBBbHBoYSBtaXhlciBhbmQgICovCisvKiAgdGhlIGdhaW4gYmxvY2sgZm9sbG9pbmcgdGhlIHN1bS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgcHJvY2Vzc2luZyB1c2VzIHRoZSBvdXRwdXQgYnVmZmVyIGZvciBkYXRhIHN0b3JhZ2UgYWZ0ZXIgZWFjaCBwcm9jZXNzaW5nICAgICovCisvKiAgYmxvY2suIFdoZW4gcHJvY2Vzc2luZyBpcyBpbnBsYWNlIGEgY29weSBvZiB0aGUgaW5wdXQgc2lnbmFsIGlzIG1hZGUgaW4gc2NyYXRjaCAqLworLyogIG1lbW9yeSBmb3IgdGhlIDEtQWxwaGEgcGF0aC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBoYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluRGF0YSAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBPdXREYXRhICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1TYW1wbGVzICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyBpbiB0aGUgaW5wdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBTdWNjZWVkZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzX0NTKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICAgICAqcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcykKK3sKKyAgICBjb25zdCBMVk1fRkxPQVQgICAgICpwSW5wdXQ7CisgICAgTFZDU19JbnN0YW5jZV90ICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAqcFNjcmF0Y2g7CisgICAgTFZDU19SZXR1cm5TdGF0dXNfZW4gZXJyOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICpwU3RJbjsKKyAgICBMVk1fSU5UMzIgICAgICAgICAgIGNoYW5uZWxzID0gcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKKyNkZWZpbmUgTnJGcmFtZXMgTnVtU2FtcGxlcyAgLy8gYWxpYXMgZm9yIGNsYXJpdHkKKworICAgIC8qSW4gY2FzZSBvZiBtb25vIHByb2Nlc3NpbmcsIHN0ZXJlbyBpbnB1dCBpcyBjcmVhdGVkIGZyb20gbW9ubworICAgICAqYW5kIHN0b3JlZCBpbiBwSW5EYXRhIGJlZm9yZSBhcHBseWluZyBhbnkgb2YgdGhlIGVmZmVjdHMuCisgICAgICpIb3dldmVyIHdlIGRvIG5vdCB1cGRhdGUgdGhlIHZhbHVlIHBJbnN0YW5jZS0+UGFyYW1zLk5yQ2hhbm5lbHMKKyAgICAgKmF0IHRoaXMgcG9pbnQuCisgICAgICpTbyB0byB0cmVhdCB0aGUgcEluRGF0YSBhcyBzdGVyZW8gd2UgYXJlIHNldHRpbmcgY2hhbm5lbHMgdG8gMgorICAgICAqLworICAgIGlmIChjaGFubmVscyA9PSAxKQorICAgIHsKKyAgICAgICAgY2hhbm5lbHMgPSAyOworICAgIH0KKyNlbmRpZgorCisgICAgcFNjcmF0Y2ggID0gKExWTV9GTE9BVCAqKSBcCisgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOworCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgcHJvY2Vzc2luZyBpcyBpbnBsYWNlCisgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIC8qCisgICAgICogVGhlIHBJbnB1dCBidWZmZXIgaG9sZHMgdGhlIGZpcnN0IDIgKExlZnQsIFJpZ2h0KSBjaGFubmVscyBpbmZvcm1hdGlvbi4KKyAgICAgKiBIZW5jZSB0aGUgbWVtb3J5IHJlcXVpcmVkIGJ5IHRoaXMgYnVmZmVyIGlzIDIgKiBOdW1GcmFtZXMuCisgICAgICogVGhlIENvbmNlcnQgU3Vycm91bmQgbW9kdWxlIGNhcnJpZXMgb3V0IHByb2Nlc3Npbmcgb25seSBvbiBMLCBSLgorICAgICAqLworICAgIHBJbnB1dCA9IHBTY3JhdGNoICsgKDIgKiBOckZyYW1lcyk7CisgICAgcFN0SW4gID0gcFNjcmF0Y2ggKyAoTFZDU19TQ1JBVENIQlVGRkVSUyAqIE5yRnJhbWVzKTsKKyAgICAvKiBUaGUgZmlyc3QgdHdvIGNoYW5uZWwgZGF0YSBpcyBleHRyYWN0ZWQgZnJvbSB0aGUgaW5wdXQgZGF0YSBhbmQKKyAgICAgKiBjb3BpZWQgaW50byBwSW5wdXQgYnVmZmVyCisgICAgICovCisgICAgQ29weV9GbG9hdF9NY19TdGVyZW8oKExWTV9GTE9BVCAqKXBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBOckZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyk7CisgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcElucHV0LAorICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTdEluLAorICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE5yRnJhbWVzKSk7CisjZWxzZQorICAgIGlmIChwSW5EYXRhID09IHBPdXREYXRhKQorICAgIHsKKyAgICAgICAgLyogUHJvY2Vzc2luZyBpbnBsYWNlICovCisgICAgICAgIHBJbnB1dCA9IHBTY3JhdGNoICsgKDIgKiBOdW1TYW1wbGVzKTsKKyAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwSW5wdXQsICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgLyogUHJvY2Vzc2luZyBvdXRwbGFjZSAqLworICAgICAgICBwSW5wdXQgPSBwSW5EYXRhOworICAgIH0KKyNlbmRpZgorICAgIC8qCisgICAgICogQ2FsbCB0aGUgc3RlcmVvIGVuaGFuY2VyCisgICAgICovCisjaWZkZWYgU1VQUE9SVF9NQworICAgIGVyciA9IExWQ1NfU3RlcmVvRW5oYW5jZXIoaEluc3RhbmNlLCAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwU3RJbiwgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnJGcmFtZXMpOyAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIGZyYW1lcyB0byBwcm9jZXNzICovCisjZWxzZQorICAgIGVyciA9IExWQ1NfU3RlcmVvRW5oYW5jZXIoaEluc3RhbmNlLCAgICAgICAgICAgICAgLyogSW5zdGFuY2UgaGFuZGxlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLworI2VuZGlmCisKKyAgICAvKgorICAgICAqIENhbGwgdGhlIHJldmVyYiBnZW5lcmF0b3IKKyAgICAgKi8KKyAgICBlcnIgPSBMVkNTX1JldmVyYkdlbmVyYXRvcihoSW5zdGFuY2UsICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBvdXRwdXQgZGF0YSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgKi8KKworICAgIC8qCisgICAgICogQ2FsbCB0aGUgZXF1YWxpc2VyCisgICAgICovCisgICAgZXJyID0gTFZDU19FcXVhbGlzZXIoaEluc3RhbmNlLCAgICAgICAgICAgICAgICAgICAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAvKiBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgTnVtU2FtcGxlcyk7ICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAqLworCisgICAgLyoKKyAgICAgKiBDYWxsIHRoZSBieXBhc3MgbWl4ZXIKKyAgICAgKi8KKyAgICBlcnIgPSBMVkNTX0J5cGFzc01peGVyKGhJbnN0YW5jZSwgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIGhhbmRsZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgIC8qIFBvaW50ZXIgdG8gdGhlIHByb2Nlc3NlZCBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW5wdXQsICAgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgaW5wdXQgKHVucHJvY2Vzc2VkKSBkYXRhICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgLyogUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVNhbXBsZXMpOyAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICovCisKKyAgICBpZihlcnIgIT0gTFZDU19TVUNDRVNTKQorICAgIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfUHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFByb2Nlc3MgZnVuY3Rpb24gZm9yIHRoZSBDb25jZXJ0IFNvdW5kIG1vZHVsZS4gVGhlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzIHR3byAgKi8KKy8qICB2YXJpYW50cyBvZiB0aGUgYWxnb3JpdGhtLCBvbmUgZm9yIGhlYWRwaG9uZXMgYW5kIG9uZSBmb3IgbW9iaWxlIHNwZWFrZXJzLiAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIERhdGEgY2FuIGJlIHByb2Nlc3NlZCBpbiB0d28gZm9ybWF0cywgc3RlcmVvIG9yIG1vbm8taW4tc3RlcmVvLiBEYXRhIGluIG1vbm8gICAgKi8KKy8qICBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZCwgdGhlIGNhbGxpbmcgcm91dGluZSBtdXN0IGNvbnZlcnQgdGhlIG1vbm8gc3RyZWFtIHRvICAgICovCisvKiAgbW9uby1pbi1zdGVyZW8uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIGhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwSW5EYXRhICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGluIHRoZSBpbnB1dCBidWZmZXIgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIFN1Y2NlZWRlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1Rvb01hbnlTYW1wbGVzICAgICBOdW1TYW1wbGVzIHdhcyBsYXJnZXIgdGhhbiB0aGUgbWF4aW11bSBibG9jayBzaXplICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19Qcm9jZXNzKExWQ1NfSGFuZGxlX3QgICAgICAgICAgICAgaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAqcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKQoreworCisgICAgTFZDU19JbnN0YW5jZV90ICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKKyAgICBMVkNTX1JldHVyblN0YXR1c19lbiBlcnI7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIC8qRXh0cmFjdCBudW1iZXIgb2YgQ2hhbm5lbHMgaW5mbyovCisgICAgTFZNX0lOVDMyIGNoYW5uZWxzID0gcEluc3RhbmNlLT5QYXJhbXMuTnJDaGFubmVsczsKKyNkZWZpbmUgTnJGcmFtZXMgTnVtU2FtcGxlcyAgLy8gYWxpYXMgZm9yIGNsYXJpdHkKKyAgICBpZiAoY2hhbm5lbHMgPT0gMSkKKyAgICB7CisgICAgICAgIGNoYW5uZWxzID0gMjsKKyAgICB9CisjZW5kaWYKKyAgICAvKgorICAgICAqIENoZWNrIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBpcyBub3QgdG9vIGxhcmdlCisgICAgICovCisgICAgaWYgKE51bVNhbXBsZXMgPiBwSW5zdGFuY2UtPkNhcGFiaWxpdGllcy5NYXhCbG9ja1NpemUpCisgICAgeworICAgICAgICByZXR1cm4oTFZDU19UT09NQU5ZU0FNUExFUyk7CisgICAgfQorCisgICAgLyoKKyAgICAgKiBDaGVjayBpZiB0aGUgYWxnb3JpdGhtIGlzIGVuYWJsZWQKKyAgICAgKi8KKyAgICBpZiAocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAhPSBMVkNTX09GRikKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIENhbGwgQ1MgcHJvY2VzcyBmdW5jdGlvbgorICAgICAgICAgKi8KKyAgICAgICAgICAgIGVyciA9IExWQ1NfUHJvY2Vzc19DUyhoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1TYW1wbGVzKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBDb21wcmVzcyB0byByZWR1Y2UgZXhwYW5zaW9uIGVmZmVjdCBvZiBDb25jZXJ0IFNvdW5kIGFuZCBjb3JyZWN0IHZvbHVtZQorICAgICAgICAgKiBkaWZmZXJlbmNlcyBmb3IgZGlmZmVyZW5jZSBzZXR0aW5ncy4gTm90IGFwcGxpZWQgaW4gdGVzdCBtb2RlcworICAgICAgICAgKi8KKyAgICAgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlID09IExWQ1NfT04pJiYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Db21wcmVzc29yTW9kZSA9PSBMVk1fTU9ERV9PTikpCisgICAgICAgIHsKKyAgICAgICAgICAgIExWTV9GTE9BVCBHYWluID0gcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBNaW47CisgICAgICAgICAgICBMVk1fRkxPQVQgQ3VycmVudDE7CisKKyAgICAgICAgICAgIEN1cnJlbnQxID0gTFZDX01peGVyX0dldEN1cnJlbnQoJnBJbnN0YW5jZS0+QnlwYXNzTWl4Lk1peGVyX0luc3RhbmNlLk1peGVyU3RyZWFtWzBdKTsKKyAgICAgICAgICAgIEdhaW4gPSAoTFZNX0ZMT0FUKSggIHBJbnN0YW5jZS0+Vm9sQ29ycmVjdC5Db21wTWluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBNaW4gICogKEN1cnJlbnQxKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAoKChMVk1fRkxPQVQpcEluc3RhbmNlLT5Wb2xDb3JyZWN0LkNvbXBGdWxsICogKEN1cnJlbnQxKSkpKTsKKworICAgICAgICAgICAgaWYoTnVtU2FtcGxlcyA8IExWQ1NfQ09NUEdBSU5GUkFNRSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBOb25MaW5Db21wX0Zsb2F0KEdhaW4sICAgICAgICAgICAgICAgICAgICAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMzIpKDIgKiBOdW1TYW1wbGVzKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICBHYWluU3RlcDsKKyAgICAgICAgICAgICAgICBMVk1fRkxPQVQgIEZpbmFsR2FpbjsKKyAgICAgICAgICAgICAgICBMVk1fSU5UMTYgIFNhbXBsZVRvUHJvY2VzcyA9IE51bVNhbXBsZXM7CisgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAqcE91dFB0cjsKKworICAgICAgICAgICAgICAgIC8qIExhcmdlIGNoYW5nZXMgaW4gR2FpbiBjYW4gY2F1c2UgY2xpY2tzIGluIG91dHB1dAorICAgICAgICAgICAgICAgICAgIFNwbGl0IGRhdGEgaW50byBzbWFsbCBibG9ja3MgYW5kIHVzZSBpbnRlcnBvbGF0ZWQgZ2FpbiB2YWx1ZXMgKi8KKworICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gKExWTV9GTE9BVCkoKChHYWluLXBJbnN0YW5jZS0+Q29tcHJlc3NHYWluKSAqIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfQ09NUEdBSU5GUkFNRSkgLyBOdW1TYW1wbGVzKTsKKworICAgICAgICAgICAgICAgIGlmKChHYWluU3RlcCA9PSAwKSAmJiAocEluc3RhbmNlLT5Db21wcmVzc0dhaW4gPCBHYWluKSkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdhaW5TdGVwID0gMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwID09IDApICYmIChwSW5zdGFuY2UtPkNvbXByZXNzR2FpbiA+IEdhaW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHYWluU3RlcCA9IC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgRmluYWxHYWluID0gR2FpbjsKKyAgICAgICAgICAgICAgICBHYWluID0gcEluc3RhbmNlLT5Db21wcmVzc0dhaW47CisgICAgICAgICAgICAgICAgcE91dFB0ciA9IHBPdXREYXRhOworCisgICAgICAgICAgICAgICAgd2hpbGUoU2FtcGxlVG9Qcm9jZXNzID4gMCkKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEdhaW4gPSAoTFZNX0ZMT0FUKShHYWluICsgR2FpblN0ZXApOworICAgICAgICAgICAgICAgICAgICBpZigoR2FpblN0ZXAgPiAwKSAmJiAoRmluYWxHYWluIDw9IEdhaW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHYWluID0gRmluYWxHYWluOworICAgICAgICAgICAgICAgICAgICAgICAgR2FpblN0ZXAgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYoKEdhaW5TdGVwIDwgMCkgJiYgKEZpbmFsR2FpbiA+IEdhaW4pKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBHYWluID0gRmluYWxHYWluOworICAgICAgICAgICAgICAgICAgICAgICAgR2FpblN0ZXAgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYoU2FtcGxlVG9Qcm9jZXNzID4gTFZDU19DT01QR0FJTkZSQU1FKQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb25MaW5Db21wX0Zsb2F0KEdhaW4sICAgICAgICAgICAgICAgICAgICAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKSgyICogTFZDU19DT01QR0FJTkZSQU1FKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyICs9ICgyICogTFZDU19DT01QR0FJTkZSQU1FKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZVRvUHJvY2VzcyA9IChMVk1fSU5UMTYpKFNhbXBsZVRvUHJvY2VzcyAtIExWQ1NfQ09NUEdBSU5GUkFNRSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBOb25MaW5Db21wX0Zsb2F0KEdhaW4sICAgICAgICAgICAgICAgICAgICAvKiBDb21wcmVzc29yIGdhaW4gc2V0dGluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKSgyICogU2FtcGxlVG9Qcm9jZXNzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVUb1Byb2Nlc3MgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIFN0b3JlIGdhaW4gdmFsdWUqLworICAgICAgICAgICAgcEluc3RhbmNlLT5Db21wcmVzc0dhaW4gPSBHYWluOworICAgICAgICB9CisKKyAgICAgICAgaWYocEluc3RhbmNlLT5iSW5PcGVyYXRpbmdNb2RlVHJhbnNpdGlvbiA9PSBMVk1fVFJVRSl7CisKKyAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgKiBSZS1pbml0IGJ5cGFzcyBtaXggd2hlbiB0aW1lciBoYXMgY29tcGxldGVkCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICgocEluc3RhbmNlLT5iVGltZXJEb25lID09IExWTV9UUlVFKSAmJgorICAgICAgICAgICAgICAgIChwSW5zdGFuY2UtPkJ5cGFzc01peC5NaXhlcl9JbnN0YW5jZS5NaXhlclN0cmVhbVsxXS5DYWxsYmFja1NldCA9PSAwKSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBMVkNTX0J5cGFzc01peEluaXQoaEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcEluc3RhbmNlLT5QYXJhbXMpOworCisgICAgICAgICAgICAgICAgaWYoZXJyICE9IExWQ1NfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNleworICAgICAgICAgICAgICAgIExWTV9UaW1lciAoICZwSW5zdGFuY2UtPlRpbWVySW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgQ29weV9GbG9hdF9TdGVyZW9fTWMocEluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5yRnJhbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscyk7CisjZW5kaWYKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCisgICAgICAgIHsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKGNoYW5uZWxzICogTnJGcmFtZXMpKTsgICAgLyogQWxsIENoYW5uZWxzKi8KKyNlbHNlCisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICogVGhlIGFsZ29yaXRobSBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDg1MTAxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuYworKysgL2Rldi9udWxsCkBAIC0xLDQzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2luY2x1ZGUgIkxWQ1MuaCIKLSNpbmNsdWRlICJMVkNTX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJMVkNTX1JldmVyYkdlbmVyYXRvci5oIgotI2luY2x1ZGUgIkxWQ19NaXhlci5oIgotI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKLSNpbmNsdWRlICJCSVFVQUQuaCIKLSNpbmNsdWRlICJMVkNTX1RhYmxlcy5oIgotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1JldmVyYkdlbmVyYXRvckluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBJbml0aWFsaXNlcyB0aGUgcmV2ZXJiIG1vZHVsZS4gVGhlIGRlbGF5IGJ1ZmZlciBzaXplIGlzIGNvbmZpZ3VyZWQgZm9yIHRoZSAgICAgICovCi0vKiAgc2FtcGxlIHJhdGUgYW5kIHRoZSBzcGVha2VyIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGUgcm91dGluZSBtYXkgYWxzbyBiZSBjYWxsZWQgZm9yIHJlLWluaXRpYWxpc2F0aW9uLCBpLmUuIHdoZW4gb25lIG9mIHRoZSAgICAgICovCi0vKiAgY29udHJvbCBwYXJhbWV0ZXJzIGhhcyBjaGFuZ2VkLiBJbiB0aGlzIGNhc2UgdGhlIGRlbGF5IGFuZCBmaWx0ZXJzIGFyZSBvbmx5ICAgICAqLwotLyogIHJlLWluaXRpYWxpc2VkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBjb25kaXRpb25zIGlzIG1ldDogICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgLSAgIHRoZSBzYW1wbGUgcmF0ZSBoYXMgY2hhbmdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIC0gICB0aGUgc3BlYWtlciB0eXBlIGNoYW5nZXMgdG8vZnJvbSB0aGUgbW9iaWxlIHNwZWFrZXIgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbmlhbGlzYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAxLiAgSW4gdGhlIGRlbGF5IHNldHRpbmdzICdTYW1wbGVzJyBpcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gdGhlIGVuZCBvZiB0aGUgICovCi0vKiAgICAgIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDIuICBUaGUgbnVtZXJhdG9yIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlsdGVyIGFyZSBuZWdhdGVkIHRvIGNhdXNlIGFuIGludmVyc2lvbi4gKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvckluaXQoTFZDU19IYW5kbGVfdCAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICpwUGFyYW1zKQotewotCi0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgRGVsYXk7Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgT2Zmc2V0OwotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVkNTX1JldmVyYkdlbmVyYXRvcl90ICAqcENvbmZpZyAgID0gKExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QgKikmcEluc3RhbmNlLT5SZXZlcmJlcmF0aW9uOwotICAgIExWQ1NfRGF0YV90ICAgICAgICAgICAgICpwRGF0YTsKLSAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50czsKLSAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgQ29lZmZzOwotICAgIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgICpwUmV2ZXJiQ29lZlRhYmxlOwotCi0KLSAgICBwRGF0YSA9IChMVkNTX0RhdGFfdCAqKSBcCi0gICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7Ci0KLSAgICBwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKSBcCi0gICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7Ci0KLSAgICAvKgotICAgICAqIEluaXRpYWxpc2UgdGhlIGRlbGF5IGFuZCBmaWx0ZXJzIGlmOgotICAgICAqICAtIHRoZSBzYW1wbGUgcmF0ZSBoYXMgY2hhbmdlZAotICAgICAqICAtIHRoZSBzcGVha2VyIHR5cGUgaGFzIGNoYW5nZWQgdG8gb3IgZnJvbSB0aGUgbW9iaWxlIHNwZWFrZXIKLSAgICAgKi8KLSAgICBpZihwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUgKSAgICAgIC8qIFNhbXBsZSByYXRlIGNoYW5nZSB0ZXN0ICovCi0KLSAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIFNldHVwIHRoZSBkZWxheQotICAgICAgICAgKi8KLSAgICAgICAgRGVsYXkgPSAoTFZNX1VJTlQxNilMVkNTX1N0ZXJlb0RlbGF5Q1NbKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZV07Ci0KLQotICAgICAgICBwQ29uZmlnLT5EZWxheVNpemUgICAgICA9IChMVk1fSU5UMTYpKDIgKiBEZWxheSk7Ci0gICAgICAgIHBDb25maWctPkRlbGF5T2Zmc2V0ICAgID0gMDsKLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKSZwQ29uZmlnLT5TdGVyZW9TYW1wbGVzWzBdLCAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocENvbmZpZy0+U3RlcmVvU2FtcGxlcykgLyBzaXplb2YoTFZNX0ZMT0FUKSkpOwotICAgICAgICAvKgotICAgICAgICAgKiBTZXR1cCB0aGUgZmlsdGVycwotICAgICAgICAgKi8KLSAgICAgICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZTsKLSAgICAgICAgcFJldmVyYkNvZWZUYWJsZSA9IChCaXF1YWRBMDEyQjEyQ29lZnNTUF90KikmTFZDU19SZXZlcmJDb2VmVGFibGVbMF07Ci0KLSAgICAgICAgLyogQ29udmVydCBpbmNvbWluZyBjb2VmZmljaWVudHMgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC9vcmRlcmluZyAqLwotICAgICAgICBDb2VmZnMuQTAgPSAoTFZNX0ZMT0FUKXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5BMDsKLSAgICAgICAgQ29lZmZzLkExID0gKExWTV9GTE9BVClwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQTE7Ci0gICAgICAgIENvZWZmcy5BMiA9IChMVk1fRkxPQVQpcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkEyOwotICAgICAgICBDb2VmZnMuQjEgPSAoTFZNX0ZMT0FUKS1wUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQjE7Ci0gICAgICAgIENvZWZmcy5CMiA9IChMVk1fRkxPQVQpLXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5CMjsKLQotICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcERhdGEtPlJldmVyYkJpcXVhZFRhcHMsICAvKiBEZXN0aW5hdGlvbiBDYXN0IHRvIHZvaWQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPlJldmVyYkJpcXVhZFRhcHMpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKLQotICAgICAgICBCUV8ySV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnRzLT5SZXZlcmJCaXF1YWRJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPlJldmVyYkJpcXVhZFRhcHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmcyk7Ci0KLSAgICAgICAgLyogQ2FsbGJhY2tzICovCi0gICAgICAgIHN3aXRjaChwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uU2NhbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYxNkMxNF9UUkNfV1JBXzAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjE2QzE1X1RSQ19XUkFfMDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFNldHVwIHRoZSBtaXhlcgotICAgICAgICAgKi8KLSAgICAgICAgcENvbmZpZy0+UHJvY0dhaW4gPSAoTFZNX1VJTlQxNikoSEVBRFBIT05FR0FJTlBST0MpOwotICAgICAgICBwQ29uZmlnLT5VbnByb2NHYWluICA9IChMVk1fVUlOVDE2KShIRUFEUEhPTkVHQUlOVU5QUk9DKTsKLSAgICB9Ci0KLSAgICBpZihwSW5zdGFuY2UtPlBhcmFtcy5SZXZlcmJMZXZlbCAhPSBwUGFyYW1zLT5SZXZlcmJMZXZlbCkKLSAgICB7Ci0gICAgICAgIExWTV9JTlQzMiAgIFJldmVyYlBlcmNlbnRhZ2UgPSA4Mzg4NjsgICAgICAvLyAxIFBlcmNlbnQgUmV2ZXJiIGkuZSAxLzEwMCBpbiBRIDIzIGZvcm1hdAotICAgICAgICBSZXZlcmJQZXJjZW50YWdlICo9IHBQYXJhbXMtPlJldmVyYkxldmVsOyAgLy8gQWN0dWFsIFJldmVyYiBMZXZlbCBpbiBRIDIzIGZvcm1hdAotICAgICAgICBwQ29uZmlnLT5SZXZlcmJMZXZlbCA9ICgoTFZNX0ZMT0FUKShSZXZlcmJQZXJjZW50YWdlPj44KSkgLyAzMjc2Ny4wZjsKLSAgICB9Ci0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Ci19Ci0jZWxzZQotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KExWQ1NfSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAqcFBhcmFtcykKLXsKLQotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIERlbGF5OwotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE9mZnNldDsKLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAgKnBDb25maWcgICA9IChMVkNTX1JldmVyYkdlbmVyYXRvcl90ICopJnBJbnN0YW5jZS0+UmV2ZXJiZXJhdGlvbjsKLSAgICBMVkNTX0RhdGFfdCAgICAgICAgICAgICAqcERhdGEgICAgID0gKExWQ1NfRGF0YV90ICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzczsKLSAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50cyA9IChMVkNTX0NvZWZmaWNpZW50X3QgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOwotICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgIENvZWZmczsKLSAgICBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAqcFJldmVyYkNvZWZUYWJsZTsKLQotICAgIC8qCi0gICAgICogSW5pdGlhbGlzZSB0aGUgZGVsYXkgYW5kIGZpbHRlcnMgaWY6Ci0gICAgICogIC0gdGhlIHNhbXBsZSByYXRlIGhhcyBjaGFuZ2VkCi0gICAgICogIC0gdGhlIHNwZWFrZXIgdHlwZSBoYXMgY2hhbmdlZCB0byBvciBmcm9tIHRoZSBtb2JpbGUgc3BlYWtlcgotICAgICAqLwotICAgIGlmKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSApICAgICAgLyogU2FtcGxlIHJhdGUgY2hhbmdlIHRlc3QgKi8KLQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogU2V0dXAgdGhlIGRlbGF5Ci0gICAgICAgICAqLwotICAgICAgICBEZWxheSA9IChMVk1fVUlOVDE2KUxWQ1NfU3RlcmVvRGVsYXlDU1soTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsKLQotCi0gICAgICAgIHBDb25maWctPkRlbGF5U2l6ZSAgICAgID0gKExWTV9JTlQxNikoMiAqIERlbGF5KTsKLSAgICAgICAgcENvbmZpZy0+RGVsYXlPZmZzZXQgICAgPSAwOwotICAgICAgICBMb2FkQ29uc3RfMTYoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopJnBDb25maWctPlN0ZXJlb1NhbXBsZXNbMF0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocENvbmZpZy0+U3RlcmVvU2FtcGxlcykvc2l6ZW9mKExWTV9JTlQxNikpKTsgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KLQotICAgICAgICAvKgotICAgICAgICAgKiBTZXR1cCB0aGUgZmlsdGVycwotICAgICAgICAgKi8KLSAgICAgICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZTsKLSAgICAgICAgcFJldmVyYkNvZWZUYWJsZSA9IChCaXF1YWRBMDEyQjEyQ29lZnNTUF90KikmTFZDU19SZXZlcmJDb2VmVGFibGVbMF07Ci0KLSAgICAgICAgLyogQ29udmVydCBpbmNvbWluZyBjb2VmZmljaWVudHMgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC9vcmRlcmluZyAqLwotICAgICAgICBDb2VmZnMuQTAgPSAoTFZNX0lOVDE2KXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5BMDsKLSAgICAgICAgQ29lZmZzLkExID0gKExWTV9JTlQxNilwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQTE7Ci0gICAgICAgIENvZWZmcy5BMiA9IChMVk1fSU5UMTYpcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkEyOwotICAgICAgICBDb2VmZnMuQjEgPSAoTFZNX0lOVDE2KS1wUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQjE7Ci0gICAgICAgIENvZWZmcy5CMiA9IChMVk1fSU5UMTYpLXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5CMjsKLQotICAgICAgICBMb2FkQ29uc3RfMTYoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwRGF0YS0+UmV2ZXJiQmlxdWFkVGFwcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDogbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCi0gICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5SZXZlcmJCaXF1YWRUYXBzKS9zaXplb2YoTFZNX0lOVDE2KSkpOyAgLyogTnVtYmVyIG9mIHdvcmRzICovCi0KLSAgICAgICAgQlFfMklfRDE2RjE2Q3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50cy0+UmV2ZXJiQmlxdWFkSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5SZXZlcmJCaXF1YWRUYXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnMpOwotCi0gICAgICAgIC8qIENhbGxiYWNrcyAqLwotICAgICAgICBzd2l0Y2gocFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLlNjYWxlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjYXNlIDE0OgotICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMTZDMTRfVFJDX1dSQV8wMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTU6Ci0gICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrICA9IEJRXzJJX0QxNkYxNkMxNV9UUkNfV1JBXzAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLQotICAgICAgICAvKgotICAgICAgICAgKiBTZXR1cCB0aGUgbWl4ZXIKLSAgICAgICAgICovCi0gICAgICAgIHBDb25maWctPlByb2NHYWluID0gKExWTV9VSU5UMTYpKEhFQURQSE9ORUdBSU5QUk9DKTsKLSAgICAgICAgcENvbmZpZy0+VW5wcm9jR2FpbiAgPSAoTFZNX1VJTlQxNikoSEVBRFBIT05FR0FJTlVOUFJPQyk7Ci0gICAgfQotCi0gICAgaWYocEluc3RhbmNlLT5QYXJhbXMuUmV2ZXJiTGV2ZWwgIT0gcFBhcmFtcy0+UmV2ZXJiTGV2ZWwpCi0gICAgewotICAgICAgICBMVk1fSU5UMzIgICBSZXZlcmJQZXJjZW50YWdlPTgzODg2OyAgICAgICAgICAgICAgICAgICAgIC8vIDEgUGVyY2VudCBSZXZlcmIgaS5lIDEvMTAwIGluIFEgMjMgZm9ybWF0Ci0gICAgICAgIFJldmVyYlBlcmNlbnRhZ2UqPXBQYXJhbXMtPlJldmVyYkxldmVsOyAgICAgICAgICAgICAgICAgLy8gQWN0dWFsIFJldmVyYiBMZXZlbCBpbiBRIDIzIGZvcm1hdAotICAgICAgICBwQ29uZmlnLT5SZXZlcmJMZXZlbD0oTFZNX0lOVDE2KShSZXZlcmJQZXJjZW50YWdlPj44KTsgIC8vIFJldmVyYiBMZXZlbCBpbiBRIDE1IGZvcm1hdAotICAgIH0KLQotICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOwotfQotI2VuZGlmCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1JldmVyYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDcmVhdGUgcmV2ZXJiIHVzaW5nIHRoZSBibG9jayBvZiBpbnB1dCBzYW1wbGVzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgYmxvY2sgICAgICovCi0vKiAgZGlhZ3JhbTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICBfX19fX19fXyAgICAgICAgICAgICAgX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgX19fX18gICAgIF9fX19fX18gICAgfCAgICAgICAgfC0tLS0tLS0tLS0tPnwgICAgICAgIHwgICAgX19fX19fICAgICBfX18gICAgICAqLwotLyogICAgfCAgICAgfCAgIHwgICAgICAgfCAgIHwgU3RlcmVvIHwgICAgICAgICAgICB8IEwgJiBSICB8ICAgfCAgICAgIHwgICB8ICAgfCAgICAgKi8KLS8qIC0tPnwgTFBGIHwtLT58IERlbGF5IHwtLT58ICAgdG8gICB8ICAgIF9fX18gICAgfCAgIHRvICAgfC0tPnwgR2FpbiB8LS0+fCArIHwtLT4gICovCi0vKiAgfCB8X19fX198ICAgfF9fX19fX198ICAgfCBMICYgUiAgfCAgIHwgICAgfCAgIHwgU3RlcmVvIHwgICB8X19fX19ffCAgIHxfX198ICAgICAqLwotLyogIHwgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIHwtLT58IC0xIHwtLT58ICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgKi8KLS8qICB8ICAgICAgICAgICAgICAgICAgICAgICB8X19fX19fX198ICAgfF9fX198ICAgfF9fX19fX19ffCAgICAgICAgICAgICAgICB8ICAgICAgICovCi0vKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAqLwotLyogIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhlIGlucHV0IGJ1ZmZlciBpcyBicm9rZW4gaW4gdG8gc3ViLWJsb2NrcyBvZiB0aGUgc2l6ZSBvZiB0aGUgZGVsYXkgb3IgbGVzcy4gICAqLwotLyogIFRoaXMgYWxsb3dzIHRoZSBkZWxheSBidWZmZXIgdG8gYmUgdHJlYXRlZCBhcyBhIGNpcmN1bGFyIGJ1ZmZlciBidXQgcHJvY2Vzc2VkICAgKi8KLS8qICBhcyBhIGxpbmVhciBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIHBJbkRhdGEgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwT3V0RGF0YSAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgMS4gIFByb2Nlc3MgaW4gYmxvY2tzIG9mIHNhbXBsZXMgdGhlIHNpemUgb2YgdGhlIGRlbGF5IHdoZXJlIHBvc3NpYmxlLCBpZiBub3QgICAqLwotLyogICAgICB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgbGVmdCBvdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAyLiAgVGhlIEdhaW4gaXMgY29tYmluZWQgd2l0aCB0aGUgTFBGIGFuZCBpbmNvcnBvcmF0ZWQgaW4gdG8gdGhlIGNvZWZmaWNpZW50cyAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3IoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcykKLXsKLQotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVkNTX1JldmVyYkdlbmVyYXRvcl90ICAqcENvbmZpZyAgID0gKExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QgKikmcEluc3RhbmNlLT5SZXZlcmJlcmF0aW9uOwotICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgICAgICpwQ29lZmZpY2llbnRzOwotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwU2NyYXRjaDsKLQotICAgIHBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopXAotICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7Ci0KLSAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopXAotICAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOwotCi0gICAgLyoKLSAgICAgKiBDb3B5IHRoZSBkYXRhIHRvIHRoZSBvdXRwdXQgaW4gb3V0cGxhY2UgcHJvY2Vzc2luZwotICAgICAqLwotICAgIGlmIChwSW5EYXRhICE9IHBPdXREYXRhKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogUmV2ZXJiIG5vdCByZXF1aXJlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKLSAgICAgICAgICovCi0gICAgICAgIENvcHlfRmxvYXQoKExWTV9GTE9BVCAqKXBJbkRhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCi0gICAgfQotCi0KLSAgICAvKgotICAgICAqIENoZWNrIGlmIHRoZSByZXZlcmIgaXMgcmVxdWlyZWQKLSAgICAgKi8KLSAgICAvKiBEaXNhYmxlIHdoZW4gQ1M0TVMgaW4gc3RlcmVvIG1vZGUgKi8KLSAgICBpZiAoKChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSA9PSBMVkNTX0hFQURQSE9ORSkgfHwgXAotICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlID09IExWQ1NfRVhfSEVBRFBIT05FUykgfHwKLSAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgIT0gTFZDU19TVEVSRU8pKSAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciB2YWxpZGF0aW9uIHRlc3RpbmcgKi8KLSAgICAgICAgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19SRVZFUkJTV0lUQ0gpICE9MCkpCi0gICAgewotICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyogQ29weSB0aGUgaW5wdXQgZGF0YSB0byBzY3JhdGNoIG1lbW9yeSBhbmQgZmlsdGVyIGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAgICAgICAvKgotICAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBkYXRhIHRvIHRoZSBzY3JhdGNoIG1lbW9yeQotICAgICAgICAgKi8KLSAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KLQotICAgICAgICAvKgotICAgICAgICAgKiBGaWx0ZXIgdGhlIGRhdGEKLSAgICAgICAgICovCi0gICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2spKChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCopJnBDb2VmZmljaWVudHMtPlJldmVyYkJpcXVhZEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLQotICAgICAgICBNdWx0M3NfRmxvYXQoIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5SZXZlcmJMZXZlbCwKLSAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsKLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEFwcGx5IHRoZSBkZWxheSBtaXgKLSAgICAgICAgICovCi0gICAgICAgIERlbGF5TWl4X0Zsb2F0KChMVk1fRkxPQVQgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgJnBDb25maWctPlN0ZXJlb1NhbXBsZXNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgIHBDb25maWctPkRlbGF5U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICZwQ29uZmlnLT5EZWxheU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLQotCi0gICAgfQotCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Ci19Ci0jZWxzZQotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3IoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgICAgICAqcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcykKLXsKLQotICAgIExWQ1NfSW5zdGFuY2VfdCAgICAgICAgICpwSW5zdGFuY2UgPSAoTFZDU19JbnN0YW5jZV90ICAqKWhJbnN0YW5jZTsKLSAgICBMVkNTX1JldmVyYkdlbmVyYXRvcl90ICAqcENvbmZpZyAgID0gKExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3QgKikmcEluc3RhbmNlLT5SZXZlcmJlcmF0aW9uOwotICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgICAgICpwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7Ci0gICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgKnBTY3JhdGNoICA9IChMVk1fSU5UMTYgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9URU1QT1JBUllfRkFTVF0ucEJhc2VBZGRyZXNzOwotCi0KLSAgICAvKgotICAgICAqIENvcHkgdGhlIGRhdGEgdG8gdGhlIG91dHB1dCBpbiBvdXRwbGFjZSBwcm9jZXNzaW5nCi0gICAgICovCi0gICAgaWYgKHBJbkRhdGEgIT0gcE91dERhdGEpCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBSZXZlcmIgbm90IHJlcXVpcmVkIHNvIGp1c3QgY29weSB0aGUgZGF0YQotICAgICAgICAgKi8KLSAgICAgICAgQ29weV8xNigoTFZNX0lOVDE2ICopcEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcE91dERhdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIqTnVtU2FtcGxlcykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExlZnQgYW5kIHJpZ2h0ICovCi0gICAgfQotCi0KLSAgICAvKgotICAgICAqIENoZWNrIGlmIHRoZSByZXZlcmIgaXMgcmVxdWlyZWQKLSAgICAgKi8KLSAgICBpZiAoKChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSA9PSBMVkNTX0hFQURQSE9ORSkgfHwgICAgICAgICAgIC8qIERpc2FibGUgd2hlbiBDUzRNUyBpbiBzdGVyZW8gbW9kZSAqLwotICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlID09IExWQ1NfRVhfSEVBRFBIT05FUykgfHwKLSAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgIT0gTFZDU19TVEVSRU8pKSAgJiYKLSAgICAgICAgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19SRVZFUkJTV0lUQ0gpICE9MCkpICAgIC8qIEZvciB2YWxpZGF0aW9uIHRlc3RpbmcgKi8KLSAgICB7Ci0gICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSAgICAgICAgLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotICAgICAgICAvKiBDb3B5IHRoZSBpbnB1dCBkYXRhIHRvIHNjcmF0Y2ggbWVtb3J5IGFuZCBmaWx0ZXIgaXQgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0gICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLSAgICAgICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIENvcHkgdGhlIGlucHV0IGRhdGEgdG8gdGhlIHNjcmF0Y2ggbWVtb3J5Ci0gICAgICAgICAqLwotICAgICAgICBDb3B5XzE2KChMVk1fSU5UMTYgKilwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcFNjcmF0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEZpbHRlciB0aGUgZGF0YQotICAgICAgICAgKi8KLSAgICAgICAgKHBDb25maWctPnBCaXF1YWRDYWxsQmFjaykoKEJpcXVhZF9JbnN0YW5jZV90KikmcENvZWZmaWNpZW50cy0+UmV2ZXJiQmlxdWFkSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotCi0gICAgICAgIE11bHQzc18xNngxNiggKExWTV9JTlQxNiAqKXBTY3JhdGNoLAotICAgICAgICAgICAgICAgICAgICAgIHBDb25maWctPlJldmVyYkxldmVsLAotICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyKk51bVNhbXBsZXMpKTsKLQotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEFwcGx5IHRoZSBkZWxheSBtaXgKLSAgICAgICAgICovCi0gICAgICAgIERlbGF5TWl4XzE2eDE2KChMVk1fSU5UMTYgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgJnBDb25maWctPlN0ZXJlb1NhbXBsZXNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgIHBDb25maWctPkRlbGF5U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICZwQ29uZmlnLT5EZWxheU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLQotCi0gICAgfQotCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBlNmUwOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuY3BwCkBAIC0wLDAgKzEsMjYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWQ1MuaCIKKyNpbmNsdWRlICJMVkNTX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVkNTX1JldmVyYkdlbmVyYXRvci5oIgorI2luY2x1ZGUgIkxWQ19NaXhlci5oIgorI2luY2x1ZGUgIlZlY3RvckFyaXRobWV0aWMuaCIKKyNpbmNsdWRlICJCSVFVQUQuaCIKKyNpbmNsdWRlICJMVkNTX1RhYmxlcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1JldmVyYkdlbmVyYXRvckluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbml0aWFsaXNlcyB0aGUgcmV2ZXJiIG1vZHVsZS4gVGhlIGRlbGF5IGJ1ZmZlciBzaXplIGlzIGNvbmZpZ3VyZWQgZm9yIHRoZSAgICAgICovCisvKiAgc2FtcGxlIHJhdGUgYW5kIHRoZSBzcGVha2VyIHR5cGUuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgcm91dGluZSBtYXkgYWxzbyBiZSBjYWxsZWQgZm9yIHJlLWluaXRpYWxpc2F0aW9uLCBpLmUuIHdoZW4gb25lIG9mIHRoZSAgICAgICovCisvKiAgY29udHJvbCBwYXJhbWV0ZXJzIGhhcyBjaGFuZ2VkLiBJbiB0aGlzIGNhc2UgdGhlIGRlbGF5IGFuZCBmaWx0ZXJzIGFyZSBvbmx5ICAgICAqLworLyogIHJlLWluaXRpYWxpc2VkIGlmIG9uZSBvZiB0aGUgZm9sbG93aW5nIHR3byBjb25kaXRpb25zIGlzIG1ldDogICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgLSAgIHRoZSBzYW1wbGUgcmF0ZSBoYXMgY2hhbmdlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIC0gICB0aGUgc3BlYWtlciB0eXBlIGNoYW5nZXMgdG8vZnJvbSB0aGUgbW9iaWxlIHNwZWFrZXIgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwUGFyYW1zICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbmlhbGlzYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgSW4gdGhlIGRlbGF5IHNldHRpbmdzICdTYW1wbGVzJyBpcyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgdG8gdGhlIGVuZCBvZiB0aGUgICovCisvKiAgICAgIGJ1ZmZlci4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIDIuICBUaGUgbnVtZXJhdG9yIGNvZWZmaWNpZW50cyBvZiB0aGUgZmlsdGVyIGFyZSBuZWdhdGVkIHRvIGNhdXNlIGFuIGludmVyc2lvbi4gKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3JJbml0KExWQ1NfSGFuZGxlX3QgICAgIGhJbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1BhcmFtc190ICAgICAqcFBhcmFtcykKK3sKKworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIERlbGF5OworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE9mZnNldDsKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAgKnBDb25maWcgICA9IChMVkNTX1JldmVyYkdlbmVyYXRvcl90ICopJnBJbnN0YW5jZS0+UmV2ZXJiZXJhdGlvbjsKKyAgICBMVkNTX0RhdGFfdCAgICAgICAgICAgICAqcERhdGE7CisgICAgTFZDU19Db2VmZmljaWVudF90ICAgICAgKnBDb2VmZmljaWVudHM7CisgICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgIENvZWZmczsKKyAgICBjb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90ICAqcFJldmVyYkNvZWZUYWJsZTsKKworICAgIHBEYXRhID0gKExWQ1NfRGF0YV90ICopIFwKKyAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzczsKKworICAgIHBDb2VmZmljaWVudHMgPSAoTFZDU19Db2VmZmljaWVudF90ICopIFwKKyAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0NPRUZdLnBCYXNlQWRkcmVzczsKKworICAgIC8qCisgICAgICogSW5pdGlhbGlzZSB0aGUgZGVsYXkgYW5kIGZpbHRlcnMgaWY6CisgICAgICogIC0gdGhlIHNhbXBsZSByYXRlIGhhcyBjaGFuZ2VkCisgICAgICogIC0gdGhlIHNwZWFrZXIgdHlwZSBoYXMgY2hhbmdlZCB0byBvciBmcm9tIHRoZSBtb2JpbGUgc3BlYWtlcgorICAgICAqLworICAgIGlmKHBJbnN0YW5jZS0+UGFyYW1zLlNhbXBsZVJhdGUgIT0gcFBhcmFtcy0+U2FtcGxlUmF0ZSApICAgICAgLyogU2FtcGxlIHJhdGUgY2hhbmdlIHRlc3QgKi8KKworICAgIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2V0dXAgdGhlIGRlbGF5CisgICAgICAgICAqLworICAgICAgICBEZWxheSA9IChMVk1fVUlOVDE2KUxWQ1NfU3RlcmVvRGVsYXlDU1soTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlXTsKKworICAgICAgICBwQ29uZmlnLT5EZWxheVNpemUgICAgICA9IChMVk1fSU5UMTYpKDIgKiBEZWxheSk7CisgICAgICAgIHBDb25maWctPkRlbGF5T2Zmc2V0ICAgID0gMDsKKyAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKSZwQ29uZmlnLT5TdGVyZW9TYW1wbGVzWzBdLCAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocENvbmZpZy0+U3RlcmVvU2FtcGxlcykgLyBzaXplb2YoTFZNX0ZMT0FUKSkpOworICAgICAgICAvKgorICAgICAgICAgKiBTZXR1cCB0aGUgZmlsdGVycworICAgICAgICAgKi8KKyAgICAgICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpcFBhcmFtcy0+U2FtcGxlUmF0ZTsKKyAgICAgICAgcFJldmVyYkNvZWZUYWJsZSA9IChCaXF1YWRBMDEyQjEyQ29lZnNTUF90KikmTFZDU19SZXZlcmJDb2VmVGFibGVbMF07CisKKyAgICAgICAgLyogQ29udmVydCBpbmNvbWluZyBjb2VmZmljaWVudHMgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC9vcmRlcmluZyAqLworICAgICAgICBDb2VmZnMuQTAgPSAoTFZNX0ZMT0FUKXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5BMDsKKyAgICAgICAgQ29lZmZzLkExID0gKExWTV9GTE9BVClwUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQTE7CisgICAgICAgIENvZWZmcy5BMiA9IChMVk1fRkxPQVQpcFJldmVyYkNvZWZUYWJsZVtPZmZzZXRdLkEyOworICAgICAgICBDb2VmZnMuQjEgPSAoTFZNX0ZMT0FUKS1wUmV2ZXJiQ29lZlRhYmxlW09mZnNldF0uQjE7CisgICAgICAgIENvZWZmcy5CMiA9IChMVk1fRkxPQVQpLXBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5CMjsKKworICAgICAgICBMb2FkQ29uc3RfRmxvYXQoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKSZwRGF0YS0+UmV2ZXJiQmlxdWFkVGFwcywgLyogRGVzdGluYXRpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiB3b3JkcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpKHNpemVvZihwRGF0YS0+UmV2ZXJiQmlxdWFkVGFwcykgLyBzaXplb2YoTFZNX0ZMT0FUKSkpOworCisgICAgICAgIEJRXzJJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudHMtPlJldmVyYkJpcXVhZEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+UmV2ZXJiQmlxdWFkVGFwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzKTsKKworICAgICAgICAvKiBDYWxsYmFja3MgKi8KKyAgICAgICAgc3dpdGNoKHBSZXZlcmJDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2sgID0gQlFfMklfRDE2RjE2QzE0X1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFjayAgPSBCUV8ySV9EMTZGMTZDMTVfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIFNldHVwIHRoZSBtaXhlcgorICAgICAgICAgKi8KKyAgICAgICAgcENvbmZpZy0+UHJvY0dhaW4gPSAoTFZNX1VJTlQxNikoSEVBRFBIT05FR0FJTlBST0MpOworICAgICAgICBwQ29uZmlnLT5VbnByb2NHYWluICA9IChMVk1fVUlOVDE2KShIRUFEUEhPTkVHQUlOVU5QUk9DKTsKKyAgICB9CisKKyAgICBpZihwSW5zdGFuY2UtPlBhcmFtcy5SZXZlcmJMZXZlbCAhPSBwUGFyYW1zLT5SZXZlcmJMZXZlbCkKKyAgICB7CisgICAgICAgIExWTV9JTlQzMiAgIFJldmVyYlBlcmNlbnRhZ2UgPSA4Mzg4NjsgICAgICAvLyAxIFBlcmNlbnQgUmV2ZXJiIGkuZSAxLzEwMCBpbiBRIDIzIGZvcm1hdAorICAgICAgICBSZXZlcmJQZXJjZW50YWdlICo9IHBQYXJhbXMtPlJldmVyYkxldmVsOyAgLy8gQWN0dWFsIFJldmVyYiBMZXZlbCBpbiBRIDIzIGZvcm1hdAorICAgICAgICBwQ29uZmlnLT5SZXZlcmJMZXZlbCA9ICgoTFZNX0ZMT0FUKShSZXZlcmJQZXJjZW50YWdlPj44KSkgLyAzMjc2Ny4wZjsKKyAgICB9CisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1JldmVyYiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBDcmVhdGUgcmV2ZXJiIHVzaW5nIHRoZSBibG9jayBvZiBpbnB1dCBzYW1wbGVzIGJhc2VkIG9uIHRoZSBmb2xsb3dpbmcgYmxvY2sgICAgICovCisvKiAgZGlhZ3JhbTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICBfX19fX19fXyAgICAgICAgICAgICAgX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgX19fX18gICAgIF9fX19fX18gICAgfCAgICAgICAgfC0tLS0tLS0tLS0tPnwgICAgICAgIHwgICAgX19fX19fICAgICBfX18gICAgICAqLworLyogICAgfCAgICAgfCAgIHwgICAgICAgfCAgIHwgU3RlcmVvIHwgICAgICAgICAgICB8IEwgJiBSICB8ICAgfCAgICAgIHwgICB8ICAgfCAgICAgKi8KKy8qIC0tPnwgTFBGIHwtLT58IERlbGF5IHwtLT58ICAgdG8gICB8ICAgIF9fX18gICAgfCAgIHRvICAgfC0tPnwgR2FpbiB8LS0+fCArIHwtLT4gICovCisvKiAgfCB8X19fX198ICAgfF9fX19fX198ICAgfCBMICYgUiAgfCAgIHwgICAgfCAgIHwgU3RlcmVvIHwgICB8X19fX19ffCAgIHxfX198ICAgICAqLworLyogIHwgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgIHwtLT58IC0xIHwtLT58ICAgICAgICB8ICAgICAgICAgICAgICAgIHwgICAgICAgKi8KKy8qICB8ICAgICAgICAgICAgICAgICAgICAgICB8X19fX19fX198ICAgfF9fX198ICAgfF9fX19fX19ffCAgICAgICAgICAgICAgICB8ICAgICAgICovCisvKiAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAqLworLyogIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIGlucHV0IGJ1ZmZlciBpcyBicm9rZW4gaW4gdG8gc3ViLWJsb2NrcyBvZiB0aGUgc2l6ZSBvZiB0aGUgZGVsYXkgb3IgbGVzcy4gICAqLworLyogIFRoaXMgYWxsb3dzIHRoZSBkZWxheSBidWZmZXIgdG8gYmUgdHJlYXRlZCBhcyBhIGNpcmN1bGFyIGJ1ZmZlciBidXQgcHJvY2Vzc2VkICAgKi8KKy8qICBhcyBhIGxpbmVhciBidWZmZXIuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBJbkRhdGEgICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIGlucHV0IGJ1ZmZlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBwT3V0RGF0YSAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBvdXRwdXQgYnVmZmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTnVtU2FtcGxlcyAgICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgdG8gcHJvY2VzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgMS4gIFByb2Nlc3MgaW4gYmxvY2tzIG9mIHNhbXBsZXMgdGhlIHNpemUgb2YgdGhlIGRlbGF5IHdoZXJlIHBvc3NpYmxlLCBpZiBub3QgICAqLworLyogICAgICB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgbGVmdCBvdmVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAyLiAgVGhlIEdhaW4gaXMgY29tYmluZWQgd2l0aCB0aGUgTFBGIGFuZCBpbmNvcnBvcmF0ZWQgaW4gdG8gdGhlIGNvZWZmaWNpZW50cyAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9yKExWQ1NfSGFuZGxlX3QgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CisKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19SZXZlcmJHZW5lcmF0b3JfdCAgKnBDb25maWcgICA9IChMVkNTX1JldmVyYkdlbmVyYXRvcl90ICopJnBJbnN0YW5jZS0+UmV2ZXJiZXJhdGlvbjsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50czsKKyAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7CisKKyAgICBwQ29lZmZpY2llbnRzID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKVwKKyAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOworCisgICAgcFNjcmF0Y2ggID0gKExWTV9GTE9BVCAqKVwKKyAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKKworICAgIC8qCisgICAgICogQ29weSB0aGUgZGF0YSB0byB0aGUgb3V0cHV0IGluIG91dHBsYWNlIHByb2Nlc3NpbmcKKyAgICAgKi8KKyAgICBpZiAocEluRGF0YSAhPSBwT3V0RGF0YSkKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFJldmVyYiBub3QgcmVxdWlyZWQgc28ganVzdCBjb3B5IHRoZSBkYXRhCisgICAgICAgICAqLworICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLworICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwT3V0RGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgIH0KKworICAgIC8qCisgICAgICogQ2hlY2sgaWYgdGhlIHJldmVyYiBpcyByZXF1aXJlZAorICAgICAqLworICAgIC8qIERpc2FibGUgd2hlbiBDUzRNUyBpbiBzdGVyZW8gbW9kZSAqLworICAgIGlmICgoKChMVkNTX091dHB1dERldmljZV9lbilwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSA9PSBMVkNTX0hFQURQSE9ORSkgfHwgXAorICAgICAgICAgKHBJbnN0YW5jZS0+UGFyYW1zLlNwZWFrZXJUeXBlID09IExWQ1NfRVhfSEVBRFBIT05FUykgfHwKKyAgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgIT0gTFZDU19TVEVSRU8pKSAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZvciB2YWxpZGF0aW9uIHRlc3RpbmcgKi8KKyAgICAgICAgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19SRVZFUkJTV0lUQ0gpICE9MCkpCisgICAgeworICAgICAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgICAgICAgIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyogQ29weSB0aGUgaW5wdXQgZGF0YSB0byBzY3JhdGNoIG1lbW9yeSBhbmQgZmlsdGVyIGl0ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAgICAgICAvKgorICAgICAgICAgKiBDb3B5IHRoZSBpbnB1dCBkYXRhIHRvIHRoZSBzY3JhdGNoIG1lbW9yeQorICAgICAgICAgKi8KKyAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KKworICAgICAgICAvKgorICAgICAgICAgKiBGaWx0ZXIgdGhlIGRhdGEKKyAgICAgICAgICovCisgICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2spKChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCopJnBDb2VmZmljaWVudHMtPlJldmVyYkJpcXVhZEluc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKworICAgICAgICBNdWx0M3NfRmxvYXQoIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5SZXZlcmJMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMiAqIE51bVNhbXBsZXMpKTsKKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgZGVsYXkgbWl4CisgICAgICAgICAqLworICAgICAgICBEZWxheU1peF9GbG9hdCgoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICZwQ29uZmlnLT5TdGVyZW9TYW1wbGVzWzBdLAorICAgICAgICAgICAgICAgICAgICAgICBwQ29uZmlnLT5EZWxheVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAmcENvbmZpZy0+RGVsYXlPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7CisKKyAgICB9CisKKyAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19SZXZlcmJHZW5lcmF0b3IuaAppbmRleCA2OTg5MmI2Li4xYmM0MzM4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfUmV2ZXJiR2VuZXJhdG9yLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1JldmVyYkdlbmVyYXRvci5oCkBAIC0xOCwxMSArMTgsNiBAQAogI2lmbmRlZiBfX0xWQ1NfUkVWRVJCR0VORVJBVE9SX0hfXwogI2RlZmluZSBfX0xWQ1NfUkVWRVJCR0VORVJBVE9SX0hfXwogCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCi0KLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtMzEsNyArMjYsNiBAQAogCiAjaW5jbHVkZSAiTFZDX01peGVyLmgiCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBEZWZpbmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwpAQCAtNDEsMTQgKzM1LDEyIEBACiAjZGVmaW5lICAgICBIRUFEUEhPTkVHQUlOUFJPQyAgICAgICAgICAgTFZDU19IRUFEUEhPTkVfUFJPQ0dBSU4KICNkZWZpbmUgICAgIEhFQURQSE9ORUdBSU5VTlBST0MgICAgICAgICBMVkNTX0hFQURQSE9ORV9VTlBST0NHQUlOCiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgICBTdHJ1Y3R1cmVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAKLQogLyogUmV2ZXJiZXJhdGlvbiBtb2R1bGUgc3RydWN0dXJlICovCiB0eXBlZGVmIHN0cnVjdAogewpAQCAtNTgsMjMgKzUwLDE0IEBACiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgICAgIERlbGF5T2Zmc2V0OwogICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICAgICBQcm9jR2FpbjsKICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgVW5wcm9jR2FpbjsKLSNpZm5kZWYgQlVJTERfRkxPQVQKLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgIFN0ZXJlb1NhbXBsZXNbMipMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0haXTsKLSAgICAvKiBSZXZlcmIgTGV2ZWwgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAgICAgUmV2ZXJiTGV2ZWw7Ci0gICAgLyogRmlsdGVyICovCi0gICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrKSAoQmlxdWFkX0luc3RhbmNlX3QqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYpOwotI2Vsc2UKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgU3RlcmVvU2FtcGxlc1syICogTFZDU19TVEVSRU9ERUxBWV9DU180OEtIWl07CisgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgIFN0ZXJlb1NhbXBsZXNbMiAqIExWQ1NfU1RFUkVPREVMQVlfQ1NfTUFYX1ZBTF07CiAgICAgLyogUmV2ZXJiIExldmVsICovCiAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgICAgICAgIFJldmVyYkxldmVsOwogICAgIC8qIEZpbHRlciAqLwogICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFjaykgKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqLCBMVk1fRkxPQVQqLCBMVk1fSU5UMTYpOwotI2VuZGlmCiB9IExWQ1NfUmV2ZXJiR2VuZXJhdG9yX3Q7CiAKLQogLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEZ1bmN0aW9uIHByb3RvdHlwZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTgzLDE5ICs2Niw5IEBACiAKIExWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfUmV2ZXJiR2VuZXJhdG9ySW5pdChMVkNTX0hhbmRsZV90ICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgKnBQYXJhbXMpOwotI2lmZGVmIEJVSUxEX0ZMT0FUCiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1JldmVyYkdlbmVyYXRvcihMVkNTX0hhbmRsZV90ICAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTFZNX0ZMT0FUICAgICAgICpwSW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgKnBPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0jZWxzZQotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19SZXZlcmJHZW5lcmF0b3IoTFZDU19IYW5kbGVfdCAgICAgICAgIGhJbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAgICAqcElucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICpwT3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgIE51bVNhbXBsZXMpOwotI2VuZGlmCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwogCiAjZW5kaWYgIC8qIFJFVkVSQl9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuYyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOTkyYzM1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5jCisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaW5jbHVkZSAiTFZDUy5oIgotI2luY2x1ZGUgIkxWQ1NfUHJpdmF0ZS5oIgotI2luY2x1ZGUgIkxWQ1NfU3RlcmVvRW5oYW5jZXIuaCIKLSNpbmNsdWRlICJWZWN0b3JBcml0aG1ldGljLmgiCi0jaW5jbHVkZSAiTFZDU19UYWJsZXMuaCIKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBGVU5DVElPTjogICAgICAgICAgICAgICAgTFZDU19TdGVyZW9FbmhhbmNlSW5pdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIERFU0NSSVBUSU9OOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW5pdGlhbGlzZXMgdGhlIHN0ZXJlbyBlbmhhbmNlbWVudCBtb2R1bGUgYmFzZWQgb24gdGhlIHNhbXBsZSByYXRlLiAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGUgZnVuY3Rpb24gc2VsZWN0cyB0aGUgY29lZmZpY2llbnRzIGZvciB0aGUgZmlsdGVycyBhbmQgY2xlYXJzIHRoZSBkYXRhICAgICAgICovCi0vKiAgaGlzdG9yeS4gSXQgaXMgYWxzbyB1c2VkIGZvciByZS1pbml0aWFsaXNhdGlvbiB3aGVuIG9uZSBvZiB0aGUgc3lzdGVtIGNvbnRyb2wgICAqLwotLyogIHBhcmFtZXRlcnMgY2hhbmdlcyBidXQgd2lsbCBvbmx5IGNoYW5nZSB0aGUgY29lZmZpY2llbnRzIGFuZCBjbGVhciB0aGUgaGlzdG9yeSAgKi8KLS8qICBpZiB0aGUgc2FtcGxlIHJhdGUgb3Igc3BlYWtlciB0eXBlIGhhcyBjaGFuZ2VkLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcFBhcmFtcyAgICAgICAgICAgICAgICAgSW5pdGlhbGlzYXRpb24gcGFyYW1ldGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIFJFVFVSTlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgTFZDU19TdWNjZXNzICAgICAgICAgICAgQWx3YXlzIHN1Y2NlZWRzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qIE5PVEVTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLSNpZmRlZiBCVUlMRF9GTE9BVAotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TRW5oYW5jZXJJbml0KExWQ1NfSGFuZGxlX3QgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgKnBQYXJhbXMpCi17Ci0KLSAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgICBPZmZzZXQ7Ci0gICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAgICpwQ29uZmlnICAgPSAoTFZDU19TdGVyZW9FbmhhbmNlcl90ICopJnBJbnN0YW5jZS0+U3RlcmVvRW5oYW5jZXI7Ci0gICAgTFZDU19EYXRhX3QgICAgICAgICAgICAgKnBEYXRhOwotICAgIExWQ1NfQ29lZmZpY2llbnRfdCAgICAgICpwQ29lZmZpY2llbnQ7Ci0gICAgRk9fRkxPQVRfQ29lZnNfdCAgICAgICAgICBDb2VmZnNNaWQ7Ci0gICAgQlFfRkxPQVRfQ29lZnNfdCAgICAgICAgICBDb2VmZnNTaWRlOwotICAgIGNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgKnBTRVNpZGVDb2VmczsKLQotCi0gICAgcERhdGEgICAgID0gKExWQ1NfRGF0YV90ICopIFwKLSAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7Ci0KLSAgICBwQ29lZmZpY2llbnQgPSAoTFZDU19Db2VmZmljaWVudF90ICopIFwKLSAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7Ci0KLSAgICAvKgotICAgICAqIElmIHRoZSBzYW1wbGUgcmF0ZSBvciBzcGVha2VyIHR5cGUgaGFzIGNoYW5nZWQgdXBkYXRlIHRoZSBmaWx0ZXJzCi0gICAgICovCi0gICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8Ci0gICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAhPSBwUGFyYW1zLT5TcGVha2VyVHlwZSkpCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBTZXQgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgYmFzZWQgb24gdGhlIHNhbXBsZSByYXRlCi0gICAgICAgICAqLwotICAgICAgICAvKiBNaWQgZmlsdGVyICovCi0gICAgICAgIE9mZnNldCA9IChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGU7Ci0KLSAgICAgICAgLyogQ29udmVydCBpbmNvbWluZyBjb2VmZmljaWVudHMgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC9vcmRlcmluZyAqLwotICAgICAgICBDb2VmZnNNaWQuQTAgPSAoTFZNX0ZMT0FUKSBMVkNTX1NFTWlkQ29lZlRhYmxlW09mZnNldF0uQTA7Ci0gICAgICAgIENvZWZmc01pZC5BMSA9IChMVk1fRkxPQVQpIExWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5BMTsKLSAgICAgICAgQ29lZmZzTWlkLkIxID0gKExWTV9GTE9BVCktTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLkIxOwotCi0gICAgICAgIC8qIENsZWFyIHRoZSB0YXBzICovCi0gICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcERhdGEtPlNFQmlxdWFkVGFwc01pZCwgICAgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPlNFQmlxdWFkVGFwc01pZCkgLyBzaXplb2YoTFZNX0ZMT0FUKSkpOwotCi0gICAgICAgIEZPXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZU1pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPlNFQmlxdWFkVGFwc01pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzTWlkKTsKLQotICAgICAgICAvKiBDYWxsYmFja3MgKi8KLSAgICAgICAgaWYoTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLlNjYWxlID09IDE1KQotICAgICAgICB7Ci0gICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfTWlkICA9IEZPXzFJX0QxNkYxNkMxNV9UUkNfV1JBXzAxOwotICAgICAgICB9Ci0KLSAgICAgICAgT2Zmc2V0ID0gKExWTV9VSU5UMTYpKHBQYXJhbXMtPlNhbXBsZVJhdGUpOwotICAgICAgICBwU0VTaWRlQ29lZnMgPSAoQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCopJkxWQ1NfU0VTaWRlQ29lZlRhYmxlWzBdOwotCi0gICAgICAgIC8qIFNpZGUgZmlsdGVyICovCi0gICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KLSAgICAgICAgQ29lZmZzU2lkZS5BMCA9IChMVk1fRkxPQVQpIHBTRVNpZGVDb2Vmc1tPZmZzZXRdLkEwOwotICAgICAgICBDb2VmZnNTaWRlLkExID0gKExWTV9GTE9BVCkgcFNFU2lkZUNvZWZzW09mZnNldF0uQTE7Ci0gICAgICAgIENvZWZmc1NpZGUuQTIgPSAoTFZNX0ZMT0FUKSBwU0VTaWRlQ29lZnNbT2Zmc2V0XS5BMjsKLSAgICAgICAgQ29lZmZzU2lkZS5CMSA9IChMVk1fRkxPQVQpLXBTRVNpZGVDb2Vmc1tPZmZzZXRdLkIxOwotICAgICAgICBDb2VmZnNTaWRlLkIyID0gKExWTV9GTE9BVCktcFNFU2lkZUNvZWZzW09mZnNldF0uQjI7Ci0KLSAgICAgICAgLyogQ2xlYXIgdGhlIHRhcHMgKi8KLSAgICAgICAgTG9hZENvbnN0X0Zsb2F0KDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikmcERhdGEtPlNFQmlxdWFkVGFwc1NpZGUsIC8qIERlc3RpbmF0aW9uIENhc3QgdG8gdm9pZDpcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8gZGVyZWZlcmVuY2luZyBpbiBmdW5jdGlvbiovCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPlNFQmlxdWFkVGFwc1NpZGUpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKLSAgICAgICAgLyogQ2FsbGJhY2tzICovCi0gICAgICAgIHN3aXRjaChwU0VTaWRlQ29lZnNbT2Zmc2V0XS5TY2FsZSkKLSAgICAgICAgewotICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgICBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VTaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmc1NpZGUpOwotCi0gICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX1NpZGUgID0gQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICAgIEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZVNpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPlNFQmlxdWFkVGFwc1NpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzU2lkZSk7Ci0KLSAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfU2lkZSAgPSBCUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgfQotCi0KLSAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKLX0KLSNlbHNlCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1NFbmhhbmNlckluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKLXsKLQotICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE9mZnNldDsKLSAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7Ci0gICAgTFZDU19TdGVyZW9FbmhhbmNlcl90ICAgKnBDb25maWcgICA9IChMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgKikmcEluc3RhbmNlLT5TdGVyZW9FbmhhbmNlcjsKLSAgICBMVkNTX0RhdGFfdCAgICAgICAgICAgICAqcERhdGEgICAgID0gKExWQ1NfRGF0YV90ICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fUEVSU0lTVEVOVF9GQVNUX0RBVEFdLnBCYXNlQWRkcmVzczsKLSAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50ID0gKExWQ1NfQ29lZmZpY2llbnRfdCAqKXBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7Ci0gICAgRk9fQzE2X0NvZWZzX3QgICAgICAgICAgQ29lZmZzTWlkOwotICAgIEJRX0MxNl9Db2Vmc190ICAgICAgICAgIENvZWZmc1NpZGU7Ci0gICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAqcFNFU2lkZUNvZWZzOwotCi0gICAgLyoKLSAgICAgKiBJZiB0aGUgc2FtcGxlIHJhdGUgb3Igc3BlYWtlciB0eXBlIGhhcyBjaGFuZ2VkIHVwZGF0ZSB0aGUgZmlsdGVycwotICAgICAqLwotICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuU2FtcGxlUmF0ZSAhPSBwUGFyYW1zLT5TYW1wbGVSYXRlKSB8fAotICAgICAgICAocEluc3RhbmNlLT5QYXJhbXMuU3BlYWtlclR5cGUgIT0gcFBhcmFtcy0+U3BlYWtlclR5cGUpKQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogU2V0IHRoZSBmaWx0ZXIgY29lZmZpY2llbnRzIGJhc2VkIG9uIHRoZSBzYW1wbGUgcmF0ZQotICAgICAgICAgKi8KLSAgICAgICAgLyogTWlkIGZpbHRlciAqLwotICAgICAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNilwUGFyYW1zLT5TYW1wbGVSYXRlOwotCi0gICAgICAgIC8qIENvbnZlcnQgaW5jb21pbmcgY29lZmZpY2llbnRzIHRvIHRoZSByZXF1aXJlZCBmb3JtYXQvb3JkZXJpbmcgKi8KLSAgICAgICAgQ29lZmZzTWlkLkEwID0gKExWTV9JTlQxNikgTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLkEwOwotICAgICAgICBDb2VmZnNNaWQuQTEgPSAoTFZNX0lOVDE2KSBMVkNTX1NFTWlkQ29lZlRhYmxlW09mZnNldF0uQTE7Ci0gICAgICAgIENvZWZmc01pZC5CMSA9IChMVk1fSU5UMTYpLUxWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5CMTsKLQotICAgICAgICAvKiBDbGVhciB0aGUgdGFwcyAqLwotICAgICAgICBMb2FkQ29uc3RfMTYoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwRGF0YS0+U0VCaXF1YWRUYXBzTWlkLCAgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KLSAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPlNFQmlxdWFkVGFwc01pZCkvc2l6ZW9mKExWTV9VSU5UMTYpKSk7ICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KLQotICAgICAgICBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VNaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5TRUJpcXVhZFRhcHNNaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmc01pZCk7Ci0KLSAgICAgICAgLyogQ2FsbGJhY2tzICovCi0gICAgICAgIGlmKExWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZT09MTUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFja19NaWQgID0gRk9fMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDE7Ci0gICAgICAgIH0KLQotICAgICAgICBPZmZzZXQgPSAoTFZNX1VJTlQxNikocFBhcmFtcy0+U2FtcGxlUmF0ZSk7Ci0gICAgICAgIHBTRVNpZGVDb2VmcyA9IChCaXF1YWRBMDEyQjEyQ29lZnNTUF90KikmTFZDU19TRVNpZGVDb2VmVGFibGVbMF07Ci0KLSAgICAgICAgLyogU2lkZSBmaWx0ZXIgKi8KLSAgICAgICAgLyogQ29udmVydCBpbmNvbWluZyBjb2VmZmljaWVudHMgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC9vcmRlcmluZyAqLwotICAgICAgICBDb2VmZnNTaWRlLkEwID0gKExWTV9JTlQxNikgcFNFU2lkZUNvZWZzW09mZnNldF0uQTA7Ci0gICAgICAgIENvZWZmc1NpZGUuQTEgPSAoTFZNX0lOVDE2KSBwU0VTaWRlQ29lZnNbT2Zmc2V0XS5BMTsKLSAgICAgICAgQ29lZmZzU2lkZS5BMiA9IChMVk1fSU5UMTYpIHBTRVNpZGVDb2Vmc1tPZmZzZXRdLkEyOwotICAgICAgICBDb2VmZnNTaWRlLkIxID0gKExWTV9JTlQxNiktcFNFU2lkZUNvZWZzW09mZnNldF0uQjE7Ci0gICAgICAgIENvZWZmc1NpZGUuQjIgPSAoTFZNX0lOVDE2KS1wU0VTaWRlQ29lZnNbT2Zmc2V0XS5CMjsKLQotICAgICAgICAvKiBDbGVhciB0aGUgdGFwcyAqLwotICAgICAgICBMb2FkQ29uc3RfMTYoMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFZhbHVlICovCi0gICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSZwRGF0YS0+U0VCaXF1YWRUYXBzU2lkZSwgICAgICAgICAgICAgLyogRGVzdGluYXRpb24gQ2FzdCB0byB2b2lkOlwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubyBkZXJlZmVyZW5jaW5nIGluIGZ1bmN0aW9uKi8KLSAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPlNFQmlxdWFkVGFwc1NpZGUpL3NpemVvZihMVk1fVUlOVDE2KSkpOyAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KLQotCi0gICAgICAgIC8qIENhbGxiYWNrcyAqLwotICAgICAgICBzd2l0Y2gocFNFU2lkZUNvZWZzW09mZnNldF0uU2NhbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgICAgQlFfMUlfRDE2RjMyQ3NzX1RSQ19XUkFfMDFfSW5pdCgmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlU2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwRGF0YS0+U0VCaXF1YWRUYXBzU2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDb2VmZnNTaWRlKTsKLQotICAgICAgICAgICAgICAgIHBDb25maWctPnBCaXF1YWRDYWxsQmFja19TaWRlICA9IEJRXzFJX0QxNkYzMkMxNF9UUkNfV1JBXzAxOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNToKLSAgICAgICAgICAgICAgICBCUV8xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VTaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmc1NpZGUpOwotCi0gICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX1NpZGUgID0gQlFfMUlfRDE2RjE2QzE1X1RSQ19XUkFfMDE7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgIH0KLQotCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Ci19Ci0jZW5kaWYKLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfU3RlcmVvRW5oYW5jZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEVuaGFuY2UgdGhlIHN0ZXJlbyBpbWFnZSBpbiB0aGUgaW5wdXQgc2FtcGxlcyBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIGJsb2NrICAgICAgKi8KLS8qICBkaWFncmFtOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgIF9fX19fX19fICAgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICBfX19fX19fXyAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgIHwgICAgICAgIHwgIE1pZGRsZSAgIHwgVHJlYmxlIHwgICAgICAgICB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICB8ICAgICAgICB8LS0tLS0tLS0tLT58IEJvb3N0ICB8LS0tLS0tLS0+fCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgfCBTdGVyZW8gfCAgICAgICAgICAgfF9fX19fX19ffCAgICAgICAgIHwgTSAmIFMgIHwgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIC0tPnwgICB0byAgIHwgICAgICAgICAgICBfX19fX19fXyAgICAgICAgICB8ICAgdG8gICB8LS0+ICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICB8IE0gJiBTICB8ICBTaWRlICAgICB8ICAgICAgICB8ICAgICAgICAgfCBTdGVyZW8gfCAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgfCAgICAgICAgfC0tLS0tLS0tLS0+fCBTaWRlICAgfC0tLS0tLS0tPnwgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgIHxfX19fX19fX3wgICAgICAgICAgIHwgQm9vc3QgIHwgICAgICAgICB8X19fX19fX198ICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8X19fX19fX198ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIElmIHRoZSBpbnB1dCBzaWduYWwgaXMgYSBtb25vIHNpZ25hbCB0aGVyZSB3aWxsIGJlIG5vIHNpZGUgc2lnbmFsIGFuZCBoZW5jZSAgICAgKi8KLS8qICB0aGUgc2lkZSBmaWx0ZXIgd2lsbCBub3QgYmUgcnVuLiBJbiBtb2JpbGUgc3BlYWtlciBtb2RlIHRoZSBtaWRkbGUgZmlsdGVyIGlzICAgICovCi0vKiAgbm90IHJlcXVpcmVkIGFuZCB0aGUgVHJlYmJsZSBib29zdCBmaWx0ZXIgaXMgcmVwbGFjZWQgYnkgYSBzaW1wbGUgZ2FpbiBibG9jay4gICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBQQVJBTUVURVJTOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIGhJbnN0YW5jZSAgICAgICAgICAgICAgIEluc3RhbmNlIEhhbmRsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBwSW5EYXRhICAgICAgICAgICAgICAgICBQb2ludGVyIHRvIHRoZSBpbnB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgcE91dERhdGEgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgb3V0cHV0IGRhdGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIE51bVNhbXBsZXMgICAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIHRvIHByb2Nlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIDEuICBUaGUgc2lkZSBmaWx0ZXIgaXMgbm90IHVzZWQgaW4gTW9iaWxlIFNwZWFrZXIgbW9kZSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmZGVmIEJVSUxEX0ZMT0FUCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1N0ZXJlb0VuaGFuY2VyKExWQ1NfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fRkxPQVQgICAgICAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICBOdW1TYW1wbGVzKQotewotCi0gICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAgICpwQ29uZmlnICAgPSAoTFZDU19TdGVyZW9FbmhhbmNlcl90ICopJnBJbnN0YW5jZS0+U3RlcmVvRW5oYW5jZXI7Ci0gICAgTFZDU19Db2VmZmljaWVudF90ICAgICAgKnBDb2VmZmljaWVudDsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAqcFNjcmF0Y2g7Ci0KLSAgICBwQ29lZmZpY2llbnQgPSAoTFZDU19Db2VmZmljaWVudF90ICopIFwKLSAgICAgICAgICAgICAgICAgICBwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOwotCi0gICAgcFNjcmF0Y2ggID0gKExWTV9GTE9BVCAqKSBcCi0gICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1RFTVBPUkFSWV9GQVNUXS5wQmFzZUFkZHJlc3M7Ci0gICAgLyoKLSAgICAgKiBDaGVjayBpZiB0aGUgU3RlcmVvIEVuaGFuY2VyIGlzIGVuYWJsZWQKLSAgICAgKi8KLSAgICBpZiAoKHBJbnN0YW5jZS0+UGFyYW1zLk9wZXJhdGluZ01vZGUgJiBMVkNTX1NURVJFT0VOSEFOQ0VTV0lUQ0gpICE9IDApCi0gICAgICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogQ29udmVydCBmcm9tIHN0ZXJlbyB0byBtaWRkbGUgYW5kIHNpZGUKLSAgICAgICAgICovCi0gICAgICAgIEZyb20yaVRvTVNfRmxvYXQocEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIE51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLQotICAgICAgICAvKgotICAgICAgICAgKiBBcHBseSBmaWx0ZXIgdG8gdGhlIG1pZGRsZSBzaWduYWwKLSAgICAgICAgICovCi0gICAgICAgIGlmIChwSW5zdGFuY2UtPk91dHB1dERldmljZSA9PSBMVkNTX0hFQURQSE9ORSkKLSAgICAgICAgewotICAgICAgICAgICAgKHBDb25maWctPnBCaXF1YWRDYWxsQmFja19NaWQpKChCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCopXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlTWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE11bHQzc19GbG9hdChwU2NyYXRjaCwgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQpcENvbmZpZy0+TWlkR2FpbiwgICAgICAvKiBHYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQXBwbHkgdGhlIGZpbHRlciB0aGUgc2lkZSBzaWduYWwgb25seSBpbiBzdGVyZW8gbW9kZSBmb3IgaGVhZHBob25lcwotICAgICAgICAgKiBhbmQgaW4gYWxsIG1vZGVzIGZvciBtb2JpbGUgc3BlYWtlcnMKLSAgICAgICAgICovCi0gICAgICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZDU19TVEVSRU8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfU2lkZSkoKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KikgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlU2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKShwU2NyYXRjaCArIE51bVNhbXBsZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopKHBTY3JhdGNoICsgTnVtU2FtcGxlcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBDb252ZXJ0IGZyb20gbWlkZGxlIGFuZCBzaWRlIHRvIHN0ZXJlbwotICAgICAgICAgKi8KLSAgICAgICAgTVNUbzJpX1NhdF9GbG9hdChwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCArIE51bVNhbXBsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcE91dERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICAvKgotICAgICAgICAgKiBUaGUgc3RlcmVvIGVuaGFuY2VyIGlzIGRpc2FibGVkIHNvIGp1c3QgY29weSB0aGUgZGF0YQotICAgICAgICAgKi8KLSAgICAgICAgQ29weV9GbG9hdCgoTFZNX0ZMT0FUICopcEluRGF0YSwgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwT3V0RGF0YSwgICAgICAgICAgLyogRGVzdGluYXRpb24gKi8KLSAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KSgyICogTnVtU2FtcGxlcykpOyAgICAgLyogTGVmdCBhbmQgcmlnaHQgKi8KLSAgICB9Ci0KLSAgICByZXR1cm4oTFZDU19TVUNDRVNTKTsKLX0KLSNlbHNlCi1MVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1N0ZXJlb0VuaGFuY2VyKExWQ1NfSGFuZGxlX3QgICAgICAgICAgaEluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMVk1fSU5UMTYgICAgICAgICpwSW5EYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICpwT3V0RGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX1VJTlQxNiAgICAgICAgICAgICBOdW1TYW1wbGVzKQotewotCi0gICAgTFZDU19JbnN0YW5jZV90ICAgICAgICAgKnBJbnN0YW5jZSA9IChMVkNTX0luc3RhbmNlX3QgICopaEluc3RhbmNlOwotICAgIExWQ1NfU3RlcmVvRW5oYW5jZXJfdCAgICpwQ29uZmlnICAgPSAoTFZDU19TdGVyZW9FbmhhbmNlcl90ICopJnBJbnN0YW5jZS0+U3RlcmVvRW5oYW5jZXI7Ci0gICAgTFZDU19Db2VmZmljaWVudF90ICAgICAgKnBDb2VmZmljaWVudCA9IChMVkNTX0NvZWZmaWNpZW50X3QgKilwSW5zdGFuY2UtPk1lbW9yeVRhYmxlLlJlZ2lvbltMVkNTX01FTVJFR0lPTl9QRVJTSVNURU5UX0ZBU1RfQ09FRl0ucEJhc2VBZGRyZXNzOwotICAgIExWTV9JTlQxNiAgICAgICAgICAgICAgICpwU2NyYXRjaCAgPSAoTFZNX0lOVDE2ICopcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKLQotICAgIC8qCi0gICAgICogQ2hlY2sgaWYgdGhlIFN0ZXJlbyBFbmhhbmNlciBpcyBlbmFibGVkCi0gICAgICovCi0gICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5PcGVyYXRpbmdNb2RlICYgTFZDU19TVEVSRU9FTkhBTkNFU1dJVENIKSAhPSAwKQotICAgICAgICB7Ci0gICAgICAgIC8qCi0gICAgICAgICAqIENvbnZlcnQgZnJvbSBzdGVyZW8gdG8gbWlkZGxlIGFuZCBzaWRlCi0gICAgICAgICAqLwotICAgICAgICBGcm9tMmlUb01TXzE2eDE2KHBJbkRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2grTnVtU2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIEFwcGx5IGZpbHRlciB0byB0aGUgbWlkZGxlIHNpZ25hbAotICAgICAgICAgKi8KLSAgICAgICAgaWYgKHBJbnN0YW5jZS0+T3V0cHV0RGV2aWNlID09IExWQ1NfSEVBRFBIT05FKQotICAgICAgICB7Ci0gICAgICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX01pZCkoKEJpcXVhZF9JbnN0YW5jZV90KikmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlTWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYgKilwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcFNjcmF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAgIE11bHQzc18xNngxNihwU2NyYXRjaCwgICAgICAgICAgICAgIC8qIFNvdXJjZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpcENvbmZpZy0+TWlkR2FpbiwgICAgICAvKiBHYWluICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgcFNjcmF0Y2gsICAgICAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7ICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyAqLwotICAgICAgICB9Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogQXBwbHkgdGhlIGZpbHRlciB0aGUgc2lkZSBzaWduYWwgb25seSBpbiBzdGVyZW8gbW9kZSBmb3IgaGVhZHBob25lcwotICAgICAgICAgKiBhbmQgaW4gYWxsIG1vZGVzIGZvciBtb2JpbGUgc3BlYWtlcnMKLSAgICAgICAgICovCi0gICAgICAgIGlmIChwSW5zdGFuY2UtPlBhcmFtcy5Tb3VyY2VGb3JtYXQgPT0gTFZDU19TVEVSRU8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIChwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfU2lkZSkoKEJpcXVhZF9JbnN0YW5jZV90KikmcENvZWZmaWNpZW50LT5TRUJpcXVhZEluc3RhbmNlU2lkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNiAqKShwU2NyYXRjaCArIE51bVNhbXBsZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopKHBTY3JhdGNoICsgTnVtU2FtcGxlcyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKgotICAgICAgICAgKiBDb252ZXJ0IGZyb20gbWlkZGxlIGFuZCBzaWRlIHRvIHN0ZXJlbwotICAgICAgICAgKi8KLSAgICAgICAgTVNUbzJpX1NhdF8xNngxNihwU2NyYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCtOdW1TYW1wbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpTnVtU2FtcGxlcyk7Ci0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgICAgLyoKLSAgICAgICAgICogVGhlIHN0ZXJlbyBlbmhhbmNlciBpcyBkaXNhYmxlZCBzbyBqdXN0IGNvcHkgdGhlIGRhdGEKLSAgICAgICAgICovCi0gICAgICAgIENvcHlfMTYoKExWTV9JTlQxNiAqKXBJbkRhdGEsICAgICAgICAgICAvKiBTb3VyY2UgKi8KLSAgICAgICAgICAgICAgICAoTFZNX0lOVDE2ICopcE91dERhdGEsICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCi0gICAgICAgICAgICAgICAgKExWTV9JTlQxNikoMipOdW1TYW1wbGVzKSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLwotCi0gICAgfQotCi0gICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Ci19Ci0jZW5kaWYKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19TdGVyZW9FbmhhbmNlci5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmZDg0NDQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuY3BwCkBAIC0wLDAgKzEsMjYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA0LTIwMTAgTlhQIFNvZnR3YXJlCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2luY2x1ZGUgIkxWQ1MuaCIKKyNpbmNsdWRlICJMVkNTX1ByaXZhdGUuaCIKKyNpbmNsdWRlICJMVkNTX1N0ZXJlb0VuaGFuY2VyLmgiCisjaW5jbHVkZSAiVmVjdG9yQXJpdGhtZXRpYy5oIgorI2luY2x1ZGUgIkxWQ1NfVGFibGVzLmgiCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogRlVOQ1RJT046ICAgICAgICAgICAgICAgIExWQ1NfU3RlcmVvRW5oYW5jZUluaXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBERVNDUklQVElPTjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluaXRpYWxpc2VzIHRoZSBzdGVyZW8gZW5oYW5jZW1lbnQgbW9kdWxlIGJhc2VkIG9uIHRoZSBzYW1wbGUgcmF0ZS4gICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgVGhlIGZ1bmN0aW9uIHNlbGVjdHMgdGhlIGNvZWZmaWNpZW50cyBmb3IgdGhlIGZpbHRlcnMgYW5kIGNsZWFycyB0aGUgZGF0YSAgICAgICAqLworLyogIGhpc3RvcnkuIEl0IGlzIGFsc28gdXNlZCBmb3IgcmUtaW5pdGlhbGlzYXRpb24gd2hlbiBvbmUgb2YgdGhlIHN5c3RlbSBjb250cm9sICAgKi8KKy8qICBwYXJhbWV0ZXJzIGNoYW5nZXMgYnV0IHdpbGwgb25seSBjaGFuZ2UgdGhlIGNvZWZmaWNpZW50cyBhbmQgY2xlYXIgdGhlIGhpc3RvcnkgICovCisvKiAgaWYgdGhlIHNhbXBsZSByYXRlIG9yIHNwZWFrZXIgdHlwZSBoYXMgY2hhbmdlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIFBBUkFNRVRFUlM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgaEluc3RhbmNlICAgICAgICAgICAgICAgSW5zdGFuY2UgSGFuZGxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBQYXJhbXMgICAgICAgICAgICAgICAgIEluaXRpYWxpc2F0aW9uIHBhcmFtZXRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBSRVRVUk5TOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIExWQ1NfU3VjY2VzcyAgICAgICAgICAgIEFsd2F5cyBzdWNjZWVkcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBOT1RFUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCitMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1NFbmhhbmNlckluaXQoTFZDU19IYW5kbGVfdCAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19QYXJhbXNfdCAgICAgICAqcFBhcmFtcykKK3sKKworICAgIExWTV9VSU5UMTYgICAgICAgICAgICAgIE9mZnNldDsKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19TdGVyZW9FbmhhbmNlcl90ICAgKnBDb25maWcgICA9IChMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgKikmcEluc3RhbmNlLT5TdGVyZW9FbmhhbmNlcjsKKyAgICBMVkNTX0RhdGFfdCAgICAgICAgICAgICAqcERhdGE7CisgICAgTFZDU19Db2VmZmljaWVudF90ICAgICAgKnBDb2VmZmljaWVudDsKKyAgICBGT19GTE9BVF9Db2Vmc190ICAgICAgICAgIENvZWZmc01pZDsKKyAgICBCUV9GTE9BVF9Db2Vmc190ICAgICAgICAgIENvZWZmc1NpZGU7CisgICAgY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCAqcFNFU2lkZUNvZWZzOworCisgICAgcERhdGEgICAgID0gKExWQ1NfRGF0YV90ICopIFwKKyAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9EQVRBXS5wQmFzZUFkZHJlc3M7CisKKyAgICBwQ29lZmZpY2llbnQgPSAoTFZDU19Db2VmZmljaWVudF90ICopIFwKKyAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisKKyAgICAvKgorICAgICAqIElmIHRoZSBzYW1wbGUgcmF0ZSBvciBzcGVha2VyIHR5cGUgaGFzIGNoYW5nZWQgdXBkYXRlIHRoZSBmaWx0ZXJzCisgICAgICovCisgICAgaWYgKChwSW5zdGFuY2UtPlBhcmFtcy5TYW1wbGVSYXRlICE9IHBQYXJhbXMtPlNhbXBsZVJhdGUpIHx8CisgICAgICAgIChwSW5zdGFuY2UtPlBhcmFtcy5TcGVha2VyVHlwZSAhPSBwUGFyYW1zLT5TcGVha2VyVHlwZSkpCisgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBTZXQgdGhlIGZpbHRlciBjb2VmZmljaWVudHMgYmFzZWQgb24gdGhlIHNhbXBsZSByYXRlCisgICAgICAgICAqLworICAgICAgICAvKiBNaWQgZmlsdGVyICovCisgICAgICAgIE9mZnNldCA9IChMVk1fVUlOVDE2KXBQYXJhbXMtPlNhbXBsZVJhdGU7CisKKyAgICAgICAgLyogQ29udmVydCBpbmNvbWluZyBjb2VmZmljaWVudHMgdG8gdGhlIHJlcXVpcmVkIGZvcm1hdC9vcmRlcmluZyAqLworICAgICAgICBDb2VmZnNNaWQuQTAgPSAoTFZNX0ZMT0FUKSBMVkNTX1NFTWlkQ29lZlRhYmxlW09mZnNldF0uQTA7CisgICAgICAgIENvZWZmc01pZC5BMSA9IChMVk1fRkxPQVQpIExWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5BMTsKKyAgICAgICAgQ29lZmZzTWlkLkIxID0gKExWTV9GTE9BVCktTFZDU19TRU1pZENvZWZUYWJsZVtPZmZzZXRdLkIxOworCisgICAgICAgIC8qIENsZWFyIHRoZSB0YXBzICovCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBWYWx1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKSZwRGF0YS0+U0VCaXF1YWRUYXBzTWlkLCAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHdvcmRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNikoc2l6ZW9mKHBEYXRhLT5TRUJpcXVhZFRhcHNNaWQpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKKworICAgICAgICBGT18xSV9EMTZGMTZDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VNaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5TRUJpcXVhZFRhcHNNaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmc01pZCk7CisKKyAgICAgICAgLyogQ2FsbGJhY2tzICovCisgICAgICAgIGlmKExWQ1NfU0VNaWRDb2VmVGFibGVbT2Zmc2V0XS5TY2FsZSA9PSAxNSkKKyAgICAgICAgeworICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX01pZCAgPSBGT18xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMTsKKyAgICAgICAgfQorCisgICAgICAgIE9mZnNldCA9IChMVk1fVUlOVDE2KShwUGFyYW1zLT5TYW1wbGVSYXRlKTsKKyAgICAgICAgcFNFU2lkZUNvZWZzID0gKEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QqKSZMVkNTX1NFU2lkZUNvZWZUYWJsZVswXTsKKworICAgICAgICAvKiBTaWRlIGZpbHRlciAqLworICAgICAgICAvKiBDb252ZXJ0IGluY29taW5nIGNvZWZmaWNpZW50cyB0byB0aGUgcmVxdWlyZWQgZm9ybWF0L29yZGVyaW5nICovCisgICAgICAgIENvZWZmc1NpZGUuQTAgPSAoTFZNX0ZMT0FUKSBwU0VTaWRlQ29lZnNbT2Zmc2V0XS5BMDsKKyAgICAgICAgQ29lZmZzU2lkZS5BMSA9IChMVk1fRkxPQVQpIHBTRVNpZGVDb2Vmc1tPZmZzZXRdLkExOworICAgICAgICBDb2VmZnNTaWRlLkEyID0gKExWTV9GTE9BVCkgcFNFU2lkZUNvZWZzW09mZnNldF0uQTI7CisgICAgICAgIENvZWZmc1NpZGUuQjEgPSAoTFZNX0ZMT0FUKS1wU0VTaWRlQ29lZnNbT2Zmc2V0XS5CMTsKKyAgICAgICAgQ29lZmZzU2lkZS5CMiA9IChMVk1fRkxPQVQpLXBTRVNpZGVDb2Vmc1tPZmZzZXRdLkIyOworCisgICAgICAgIC8qIENsZWFyIHRoZSB0YXBzICovCisgICAgICAgIExvYWRDb25zdF9GbG9hdCgwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVmFsdWUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikmcERhdGEtPlNFQmlxdWFkVGFwc1NpZGUsIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygd29yZHMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KShzaXplb2YocERhdGEtPlNFQmlxdWFkVGFwc1NpZGUpIC8gc2l6ZW9mKExWTV9GTE9BVCkpKTsKKyAgICAgICAgLyogQ2FsbGJhY2tzICovCisgICAgICAgIHN3aXRjaChwU0VTaWRlQ29lZnNbT2Zmc2V0XS5TY2FsZSkKKyAgICAgICAgeworICAgICAgICAgICAgY2FzZSAxNDoKKyAgICAgICAgICAgICAgICBCUV8xSV9EMTZGMzJDc3NfVFJDX1dSQV8wMV9Jbml0KCZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VTaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBEYXRhLT5TRUJpcXVhZFRhcHNTaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNvZWZmc1NpZGUpOworCisgICAgICAgICAgICAgICAgcENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX1NpZGUgID0gQlFfMUlfRDE2RjMyQzE0X1RSQ19XUkFfMDE7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIDE1OgorICAgICAgICAgICAgICAgIEJRXzFJX0QxNkYxNkNzc19UUkNfV1JBXzAxX0luaXQoJnBDb2VmZmljaWVudC0+U0VCaXF1YWRJbnN0YW5jZVNpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcERhdGEtPlNFQmlxdWFkVGFwc1NpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29lZmZzU2lkZSk7CisKKyAgICAgICAgICAgICAgICBwQ29uZmlnLT5wQmlxdWFkQ2FsbEJhY2tfU2lkZSAgPSBCUV8xSV9EMTZGMTZDMTVfVFJDX1dSQV8wMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgfQorCisgICAgcmV0dXJuKExWQ1NfU1VDQ0VTUyk7Cit9CisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIEZVTkNUSU9OOiAgICAgICAgICAgICAgICBMVkNTX1N0ZXJlb0VuaGFuY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogREVTQ1JJUFRJT046ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBFbmhhbmNlIHRoZSBzdGVyZW8gaW1hZ2UgaW4gdGhlIGlucHV0IHNhbXBsZXMgYmFzZWQgb24gdGhlIGZvbGxvd2luZyBibG9jayAgICAgICovCisvKiAgZGlhZ3JhbTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fX19fX19fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICBfX19fX19fXyAgICAgICAgICAgIHwgICAgICAgIHwgICAgICAgICAgX19fX19fX18gICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICB8ICAgICAgICB8ICBNaWRkbGUgICB8IFRyZWJsZSB8ICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgfCAgICAgICAgfC0tLS0tLS0tLS0+fCBCb29zdCAgfC0tLS0tLS0tPnwgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIHwgU3RlcmVvIHwgICAgICAgICAgIHxfX19fX19fX3wgICAgICAgICB8IE0gJiBTICB8ICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAtLT58ICAgdG8gICB8ICAgICAgICAgICAgX19fX19fX18gICAgICAgICAgfCAgIHRvICAgfC0tPiAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgfCBNICYgUyAgfCAgU2lkZSAgICAgfCAgICAgICAgfCAgICAgICAgIHwgU3RlcmVvIHwgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgIHwgICAgICAgIHwtLS0tLS0tLS0tPnwgU2lkZSAgIHwtLS0tLS0tLT58ICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICB8X19fX19fX198ICAgICAgICAgICB8IEJvb3N0ICB8ICAgICAgICAgfF9fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfF9fX19fX19ffCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBJZiB0aGUgaW5wdXQgc2lnbmFsIGlzIGEgbW9ubyBzaWduYWwgdGhlcmUgd2lsbCBiZSBubyBzaWRlIHNpZ25hbCBhbmQgaGVuY2UgICAgICovCisvKiAgdGhlIHNpZGUgZmlsdGVyIHdpbGwgbm90IGJlIHJ1bi4gSW4gbW9iaWxlIHNwZWFrZXIgbW9kZSB0aGUgbWlkZGxlIGZpbHRlciBpcyAgICAqLworLyogIG5vdCByZXF1aXJlZCBhbmQgdGhlIFRyZWJibGUgYm9vc3QgZmlsdGVyIGlzIHJlcGxhY2VkIGJ5IGEgc2ltcGxlIGdhaW4gYmxvY2suICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUEFSQU1FVEVSUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBoSW5zdGFuY2UgICAgICAgICAgICAgICBJbnN0YW5jZSBIYW5kbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgcEluRGF0YSAgICAgICAgICAgICAgICAgUG9pbnRlciB0byB0aGUgaW5wdXQgZGF0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIHBPdXREYXRhICAgICAgICAgICAgICAgIFBvaW50ZXIgdG8gdGhlIG91dHB1dCBkYXRhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBOdW1TYW1wbGVzICAgICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyB0byBwcm9jZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogUkVUVVJOUzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBMVkNTX1N1Y2Nlc3MgICAgICAgICAgICBBbHdheXMgc3VjY2VlZHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogTk9URVM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAxLiAgVGhlIHNpZGUgZmlsdGVyIGlzIG5vdCB1c2VkIGluIE1vYmlsZSBTcGVha2VyIG1vZGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK0xWQ1NfUmV0dXJuU3RhdHVzX2VuIExWQ1NfU3RlcmVvRW5oYW5jZXIoTFZDU19IYW5kbGVfdCAgICAgICAgICBoSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAgICAgKnBJbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgKnBPdXREYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgIE51bVNhbXBsZXMpCit7CisKKyAgICBMVkNTX0luc3RhbmNlX3QgICAgICAgICAqcEluc3RhbmNlID0gKExWQ1NfSW5zdGFuY2VfdCAgKiloSW5zdGFuY2U7CisgICAgTFZDU19TdGVyZW9FbmhhbmNlcl90ICAgKnBDb25maWcgICA9IChMVkNTX1N0ZXJlb0VuaGFuY2VyX3QgKikmcEluc3RhbmNlLT5TdGVyZW9FbmhhbmNlcjsKKyAgICBMVkNTX0NvZWZmaWNpZW50X3QgICAgICAqcENvZWZmaWNpZW50OworICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICpwU2NyYXRjaDsKKworICAgIHBDb2VmZmljaWVudCA9IChMVkNTX0NvZWZmaWNpZW50X3QgKikgXAorICAgICAgICAgICAgICAgICAgIHBJbnN0YW5jZS0+TWVtb3J5VGFibGUuUmVnaW9uW0xWQ1NfTUVNUkVHSU9OX1BFUlNJU1RFTlRfRkFTVF9DT0VGXS5wQmFzZUFkZHJlc3M7CisKKyAgICBwU2NyYXRjaCAgPSAoTFZNX0ZMT0FUICopIFwKKyAgICAgICAgICAgICAgICAgICAgcEluc3RhbmNlLT5NZW1vcnlUYWJsZS5SZWdpb25bTFZDU19NRU1SRUdJT05fVEVNUE9SQVJZX0ZBU1RdLnBCYXNlQWRkcmVzczsKKyAgICAvKgorICAgICAqIENoZWNrIGlmIHRoZSBTdGVyZW8gRW5oYW5jZXIgaXMgZW5hYmxlZAorICAgICAqLworICAgIGlmICgocEluc3RhbmNlLT5QYXJhbXMuT3BlcmF0aW5nTW9kZSAmIExWQ1NfU1RFUkVPRU5IQU5DRVNXSVRDSCkgIT0gMCkKKyAgICAgICAgeworICAgICAgICAvKgorICAgICAgICAgKiBDb252ZXJ0IGZyb20gc3RlcmVvIHRvIG1pZGRsZSBhbmQgc2lkZQorICAgICAgICAgKi8KKyAgICAgICAgRnJvbTJpVG9NU19GbG9hdChwSW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgTnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgICAgIC8qCisgICAgICAgICAqIEFwcGx5IGZpbHRlciB0byB0aGUgbWlkZGxlIHNpZ25hbAorICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+T3V0cHV0RGV2aWNlID09IExWQ1NfSEVBRFBIT05FKQorICAgICAgICB7CisgICAgICAgICAgICAocENvbmZpZy0+cEJpcXVhZENhbGxCYWNrX01pZCkoKEJpcXVhZF9GTE9BVF9JbnN0YW5jZV90KilcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VNaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKilwU2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeworICAgICAgICAgICAgTXVsdDNzX0Zsb2F0KHBTY3JhdGNoLCAgICAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVClwQ29uZmlnLT5NaWRHYWluLCAgICAgIC8qIEdhaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICBwU2NyYXRjaCwgICAgICAgICAgICAgIC8qIERlc3RpbmF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzICovCisgICAgICAgIH0KKworICAgICAgICAvKgorICAgICAgICAgKiBBcHBseSB0aGUgZmlsdGVyIHRoZSBzaWRlIHNpZ25hbCBvbmx5IGluIHN0ZXJlbyBtb2RlIGZvciBoZWFkcGhvbmVzCisgICAgICAgICAqIGFuZCBpbiBhbGwgbW9kZXMgZm9yIG1vYmlsZSBzcGVha2VycworICAgICAgICAgKi8KKyAgICAgICAgaWYgKHBJbnN0YW5jZS0+UGFyYW1zLlNvdXJjZUZvcm1hdCA9PSBMVkNTX1NURVJFTykKKyAgICAgICAgeworICAgICAgICAgICAgKHBDb25maWctPnBCaXF1YWRDYWxsQmFja19TaWRlKSgoQmlxdWFkX0ZMT0FUX0luc3RhbmNlX3QqKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwQ29lZmZpY2llbnQtPlNFQmlxdWFkSW5zdGFuY2VTaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopKHBTY3JhdGNoICsgTnVtU2FtcGxlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fRkxPQVQgKikocFNjcmF0Y2ggKyBOdW1TYW1wbGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQxNilOdW1TYW1wbGVzKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qCisgICAgICAgICAqIENvbnZlcnQgZnJvbSBtaWRkbGUgYW5kIHNpZGUgdG8gc3RlcmVvCisgICAgICAgICAqLworICAgICAgICBNU1RvMmlfU2F0X0Zsb2F0KHBTY3JhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgIHBTY3JhdGNoICsgTnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0RGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDE2KU51bVNhbXBsZXMpOworCisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIC8qCisgICAgICAgICAqIFRoZSBzdGVyZW8gZW5oYW5jZXIgaXMgZGlzYWJsZWQgc28ganVzdCBjb3B5IHRoZSBkYXRhCisgICAgICAgICAqLworICAgICAgICBDb3B5X0Zsb2F0KChMVk1fRkxPQVQgKilwSW5EYXRhLCAgICAgICAgICAgLyogU291cmNlICovCisgICAgICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKXBPdXREYXRhLCAgICAgICAgICAvKiBEZXN0aW5hdGlvbiAqLworICAgICAgICAgICAgICAgICAgIChMVk1fSU5UMTYpKDIgKiBOdW1TYW1wbGVzKSk7ICAgICAvKiBMZWZ0IGFuZCByaWdodCAqLworICAgIH0KKworICAgIHJldHVybihMVkNTX1NVQ0NFU1MpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1N0ZXJlb0VuaGFuY2VyLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuaAppbmRleCA0MTI1ZjI0Li4xMmE1OTgyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfU3RlcmVvRW5oYW5jZXIuaApAQCAtMTgsMTEgKzE4LDYgQEAKICNpZm5kZWYgX19MVkNTX1NURVJFT0VOSEFOQ0VSX0hfXwogI2RlZmluZSBfX0xWQ1NfU1RFUkVPRU5IQU5DRVJfSF9fCiAKLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KLQotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0zMyw3ICsyOCw2IEBACiAjaW5jbHVkZSAiTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgiICAgICAgICAgIC8qIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KICNpbmNsdWRlICJCSVFVQUQuaCIKIAotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgIFN0cnVjdHVyZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC00NCwxNyArMzgsNiBAQAogdHlwZWRlZiBzdHJ1Y3QKIHsKIAotI2lmbmRlZiBCVUlMRF9GTE9BVAotICAgIC8qCi0gICAgICogTWlkZGxlIGZpbHRlcgotICAgICAqLwotICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICgqcEJpcXVhZENhbGxCYWNrX01pZCkoQmlxdWFkX0luc3RhbmNlX3QqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYqLCBMVk1fSU5UMTYpOwotICAgIC8qCi0gICAgICogU2lkZSBmaWx0ZXIKLSAgICAgKi8KLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFja19TaWRlKShCaXF1YWRfSW5zdGFuY2VfdCosIExWTV9JTlQxNiosIExWTV9JTlQxNiosIExWTV9JTlQxNik7Ci0gICAgTFZNX1VJTlQxNiAgICAgICAgICAgICAgTWlkR2FpbjsgICAgICAgICAgICAvKiBNaWRkbGUgZ2FpbiBpbiBtb2JpbGUgc3BlYWtlciBtb2RlICovCi0jZWxzZQogICAgIC8qCiAgICAgICogTWlkZGxlIGZpbHRlcgogICAgICAqLwpAQCAtNjcsMTAgKzUwLDggQEAKICAgICB2b2lkICAgICAgICAgICAgICAgICAgICAoKnBCaXF1YWRDYWxsQmFja19TaWRlKShCaXF1YWRfRkxPQVRfSW5zdGFuY2VfdCosCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fRkxPQVQqLCBMVk1fRkxPQVQqLCBMVk1fSU5UMTYpOwogICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgTWlkR2FpbjsgICAgICAgICAgICAvKiBNaWRkbGUgZ2FpbiBpbiBtb2JpbGUgc3BlYWtlciBtb2RlICovCi0jZW5kaWYKIH0gTFZDU19TdGVyZW9FbmhhbmNlcl90OwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogICAgRnVuY3Rpb24gcHJvdG90eXBlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KQEAgLTgwLDE5ICs2MSw5IEBACiBMVkNTX1JldHVyblN0YXR1c19lbiBMVkNTX1NFbmhhbmNlckluaXQoTFZDU19IYW5kbGVfdCAgICAgICAgaEluc3RhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfUGFyYW1zX3QgICAgICAgICpwUGFyYW1zKTsKIAotI2lmbmRlZiBCVUlMRF9GTE9BVAotTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TdGVyZW9FbmhhbmNlcihMVkNTX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9JTlQxNiAgICAqcEluRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgKnBPdXREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0jZWxzZQogTFZDU19SZXR1cm5TdGF0dXNfZW4gTFZDU19TdGVyZW9FbmhhbmNlcihMVkNTX0hhbmRsZV90ICAgICAgICBoSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExWTV9GTE9BVCAgICAqcEluRGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZNX0ZMT0FUICAgICAgICAgICAgKnBPdXREYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fVUlOVDE2ICAgICAgICAgICAgTnVtU2FtcGxlcyk7Ci0jZW5kaWYKLSNpZmRlZiBfX2NwbHVzcGx1cwotfQotI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCiAKICNlbmRpZiAgLyogU1RFUkVPRU5IQU5DRV9IICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxNTRlMjkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jCisrKyAvZGV2L251bGwKQEAgLTEsNTcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgSW5jbHVkZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpbmNsdWRlICJMVkNTX1ByaXZhdGUuaCIKLSNpbmNsdWRlICJGaWx0ZXJzLmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBkZWZpbml0aW9ucyAqLwotI2luY2x1ZGUgIkJJUVVBRC5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQmlxdWFkIGRlZmluaXRpb25zICovCi0jaW5jbHVkZSAiTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgiICAgICAgICAgICAgICAvKiBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCi0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgU3RlcmVvIEVuaGFuY2VyIGNvZWZmaWNpZW50IGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIENvZWZmaWNpZW50IHRhYmxlIGZvciB0aGUgbWlkZGxlIGZpbHRlciAqLwotY29uc3QgQmlxdWFkQTAxQjFDb2Vmc1NQX3QgTFZDU19TRU1pZENvZWZUYWJsZVtdID0gewotICAgIHtDU19NSURETEVfODAwMF9BMCwgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfTUlERExFXzgwMDBfQTEsCi0gICAgIENTX01JRERMRV84MDAwX0IxLAotICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzgwMDBfU0NBTEV9LAotICAgIHtDU19NSURETEVfMTEwMjVfQTAsICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX01JRERMRV8xMTAyNV9BMSwKLSAgICAgQ1NfTUlERExFXzExMDI1X0IxLAotICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzExMDI1X1NDQUxFfSwKLSAgICB7Q1NfTUlERExFXzEyMDAwX0EwLCAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19NSURETEVfMTIwMDBfQTEsCi0gICAgIENTX01JRERMRV8xMjAwMF9CMSwKLSAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV8xMjAwMF9TQ0FMRX0sCi0gICAge0NTX01JRERMRV8xNjAwMF9BMCwgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfTUlERExFXzE2MDAwX0ExLAotICAgICBDU19NSURETEVfMTYwMDBfQjEsCi0gICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfMTYwMDBfU0NBTEV9LAotICAgIHtDU19NSURETEVfMjIwNTBfQTAsICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX01JRERMRV8yMjA1MF9BMSwKLSAgICAgQ1NfTUlERExFXzIyMDUwX0IxLAotICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzIyMDUwX1NDQUxFfSwKLSAgICB7Q1NfTUlERExFXzI0MDAwX0EwLCAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19NSURETEVfMjQwMDBfQTEsCi0gICAgIENTX01JRERMRV8yNDAwMF9CMSwKLSAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV8yNDAwMF9TQ0FMRX0sCi0gICAge0NTX01JRERMRV8zMjAwMF9BMCwgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfTUlERExFXzMyMDAwX0ExLAotICAgICBDU19NSURETEVfMzIwMDBfQjEsCi0gICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfMzIwMDBfU0NBTEV9LAotICAgIHtDU19NSURETEVfNDQxMDBfQTAsICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX01JRERMRV80NDEwMF9BMSwKLSAgICAgQ1NfTUlERExFXzQ0MTAwX0IxLAotICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzQ0MTAwX1NDQUxFfSwKLSAgICB7Q1NfTUlERExFXzQ4MDAwX0EwLCAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19NSURETEVfNDgwMDBfQTEsCi0gICAgIENTX01JRERMRV80ODAwMF9CMSwKLSAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV80ODAwMF9TQ0FMRX0KLSNpZmRlZiBISUdIRVJfRlMKLSAgICAsCi0gICAge0NTX01JRERMRV85NjAwMF9BMCwgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfTUlERExFXzk2MDAwX0ExLAotICAgICBDU19NSURETEVfOTYwMDBfQjEsCi0gICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfOTYwMDBfU0NBTEV9LAotICAgIHtDU19NSURETEVfMTkyMDAwX0EwLCAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfTUlERExFXzE5MjAwMF9BMSwKLSAgICAgQ1NfTUlERExFXzE5MjAwMF9CMSwKLSAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV8xOTIwMDBfU0NBTEV9Ci0jZW5kaWYKLSAgICB9OwotCi0vKiBDb2VmZmljaWVudCB0YWJsZSBmb3IgdGhlIHNpZGUgZmlsdGVyICovCi1jb25zdCBCaXF1YWRBMDEyQjEyQ29lZnNTUF90IExWQ1NfU0VTaWRlQ29lZlRhYmxlW10gPSB7Ci0gICAgLyogSGVhZHBob25lIFNpZGUgY29lZmZpY2llbnRzICovCi0gICAge0NTX1NJREVfODAwMF9BMCwgICAgICAgICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19TSURFXzgwMDBfQTEsCi0gICAgIENTX1NJREVfODAwMF9BMiwKLSAgICAgQ1NfU0lERV84MDAwX0IxLAotICAgICBDU19TSURFXzgwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19TSURFXzgwMDBfU0NBTEV9LAotICAgIHtDU19TSURFXzExMDI1X0EwLCAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1NJREVfMTEwMjVfQTEsCi0gICAgIENTX1NJREVfMTEwMjVfQTIsCi0gICAgIENTX1NJREVfMTEwMjVfQjEsCi0gICAgIENTX1NJREVfMTEwMjVfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19TSURFXzExMDI1X1NDQUxFfSwKLSAgICB7Q1NfU0lERV8xMjAwMF9BMCwgICAgICAgICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19TSURFXzEyMDAwX0ExLAotICAgICBDU19TSURFXzEyMDAwX0EyLAotICAgICBDU19TSURFXzEyMDAwX0IxLAotICAgICBDU19TSURFXzEyMDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV8xMjAwMF9TQ0FMRX0sCi0gICAge0NTX1NJREVfMTYwMDBfQTAsICAgICAgICAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfU0lERV8xNjAwMF9BMSwKLSAgICAgQ1NfU0lERV8xNjAwMF9BMiwKLSAgICAgQ1NfU0lERV8xNjAwMF9CMSwKLSAgICAgQ1NfU0lERV8xNjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfMTYwMDBfU0NBTEV9LAotICAgIHtDU19TSURFXzIyMDUwX0EwLCAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1NJREVfMjIwNTBfQTEsCi0gICAgIENTX1NJREVfMjIwNTBfQTIsCi0gICAgIENTX1NJREVfMjIwNTBfQjEsCi0gICAgIENTX1NJREVfMjIwNTBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19TSURFXzIyMDUwX1NDQUxFfSwKLSAgICB7Q1NfU0lERV8yNDAwMF9BMCwgICAgICAgICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19TSURFXzI0MDAwX0ExLAotICAgICBDU19TSURFXzI0MDAwX0EyLAotICAgICBDU19TSURFXzI0MDAwX0IxLAotICAgICBDU19TSURFXzI0MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV8yNDAwMF9TQ0FMRX0sCi0gICAge0NTX1NJREVfMzIwMDBfQTAsICAgICAgICAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfU0lERV8zMjAwMF9BMSwKLSAgICAgQ1NfU0lERV8zMjAwMF9BMiwKLSAgICAgQ1NfU0lERV8zMjAwMF9CMSwKLSAgICAgQ1NfU0lERV8zMjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfMzIwMDBfU0NBTEV9LAotICAgIHtDU19TSURFXzQ0MTAwX0EwLCAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1NJREVfNDQxMDBfQTEsCi0gICAgIENTX1NJREVfNDQxMDBfQTIsCi0gICAgIENTX1NJREVfNDQxMDBfQjEsCi0gICAgIENTX1NJREVfNDQxMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19TSURFXzQ0MTAwX1NDQUxFfSwKLSAgICB7Q1NfU0lERV80ODAwMF9BMCwgICAgICAgICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19TSURFXzQ4MDAwX0ExLAotICAgICBDU19TSURFXzQ4MDAwX0EyLAotICAgICBDU19TSURFXzQ4MDAwX0IxLAotICAgICBDU19TSURFXzQ4MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV80ODAwMF9TQ0FMRX0KLSNpZmRlZiBISUdIRVJfRlMKLSAgICAgLAotICAgICB7Q1NfU0lERV85NjAwMF9BMCwgICAgICAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19TSURFXzk2MDAwX0ExLAotICAgICBDU19TSURFXzk2MDAwX0EyLAotICAgICBDU19TSURFXzk2MDAwX0IxLAotICAgICBDU19TSURFXzk2MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV85NjAwMF9TQ0FMRX0sCi0gICAgIHtDU19TSURFXzE5MjAwMF9BMCwgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfU0lERV8xOTIwMDBfQTEsCi0gICAgIENTX1NJREVfMTkyMDAwX0EyLAotICAgICBDU19TSURFXzE5MjAwMF9CMSwKLSAgICAgQ1NfU0lERV8xOTIwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19TSURFXzE5MjAwMF9TQ0FMRX0KLSNlbmRpZgotfTsKLQotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBFcXVhbGlzZXIgY29lZmZpY2llbnQgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX0VxdWFsaXNlckNvZWZUYWJsZVtdID0gewotICAgIC8qIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KLSAgICB7Q1NfRVFVQUxJU0VSXzgwMDBfQTAsICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX0VRVUFMSVNFUl84MDAwX0ExLAotICAgICBDU19FUVVBTElTRVJfODAwMF9BMiwKLSAgICAgQ1NfRVFVQUxJU0VSXzgwMDBfQjEsCi0gICAgIENTX0VRVUFMSVNFUl84MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzgwMDBfU0NBTEV9LAotICAgIHtDU19FUVVBTElTRVJfMTEwMjVfQTAsICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX0VRVUFMSVNFUl8xMTAyNV9BMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzExMDI1X0EyLAotICAgICBDU19FUVVBTElTRVJfMTEwMjVfQjEsCi0gICAgIENTX0VRVUFMSVNFUl8xMTAyNV9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRX0sCi0gICAge0NTX0VRVUFMSVNFUl8xMjAwMF9BMCwgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfRVFVQUxJU0VSXzEyMDAwX0ExLAotICAgICBDU19FUVVBTElTRVJfMTIwMDBfQTIsCi0gICAgIENTX0VRVUFMSVNFUl8xMjAwMF9CMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzEyMDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzEyMDAwX1NDQUxFfSwKLSAgICB7Q1NfRVFVQUxJU0VSXzE2MDAwX0EwLCAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19FUVVBTElTRVJfMTYwMDBfQTEsCi0gICAgIENTX0VRVUFMSVNFUl8xNjAwMF9BMiwKLSAgICAgQ1NfRVFVQUxJU0VSXzE2MDAwX0IxLAotICAgICBDU19FUVVBTElTRVJfMTYwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfMTYwMDBfU0NBTEV9LAotICAgIHtDU19FUVVBTElTRVJfMjIwNTBfQTAsICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX0VRVUFMSVNFUl8yMjA1MF9BMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzIyMDUwX0EyLAotICAgICBDU19FUVVBTElTRVJfMjIwNTBfQjEsCi0gICAgIENTX0VRVUFMSVNFUl8yMjA1MF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRX0sCi0gICAge0NTX0VRVUFMSVNFUl8yNDAwMF9BMCwgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfRVFVQUxJU0VSXzI0MDAwX0ExLAotICAgICBDU19FUVVBTElTRVJfMjQwMDBfQTIsCi0gICAgIENTX0VRVUFMSVNFUl8yNDAwMF9CMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzI0MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzI0MDAwX1NDQUxFfSwKLSAgICB7Q1NfRVFVQUxJU0VSXzMyMDAwX0EwLCAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19FUVVBTElTRVJfMzIwMDBfQTEsCi0gICAgIENTX0VRVUFMSVNFUl8zMjAwMF9BMiwKLSAgICAgQ1NfRVFVQUxJU0VSXzMyMDAwX0IxLAotICAgICBDU19FUVVBTElTRVJfMzIwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfMzIwMDBfU0NBTEV9LAotICAgIHtDU19FUVVBTElTRVJfNDQxMDBfQTAsICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX0VRVUFMSVNFUl80NDEwMF9BMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzQ0MTAwX0EyLAotICAgICBDU19FUVVBTElTRVJfNDQxMDBfQjEsCi0gICAgIENTX0VRVUFMSVNFUl80NDEwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl80NDEwMF9TQ0FMRX0sCi0gICAge0NTX0VRVUFMSVNFUl80ODAwMF9BMCwgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0ExLAotICAgICBDU19FUVVBTElTRVJfNDgwMDBfQTIsCi0gICAgIENTX0VRVUFMSVNFUl80ODAwMF9CMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IyLAotICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfSwKLSNpZmRlZiBISUdIRVJfRlMKLSAgICB7Q1NfRVFVQUxJU0VSXzk2MDAwX0EwLCAgICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU19FUVVBTElTRVJfOTYwMDBfQTEsCi0gICAgIENTX0VRVUFMSVNFUl85NjAwMF9BMiwKLSAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0IxLAotICAgICBDU19FUVVBTElTRVJfOTYwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfOTYwMDBfU0NBTEV9LAotICAgIHtDU19FUVVBTElTRVJfMTkyMDAwX0EwLCAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMiwKLSAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMSwKLSAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEV9LAotI2VuZGlmCi0KLSAgICAvKiBDb25jZXJ0IFNvdW5kIEVYIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KLSAgICB7Q1NFWF9FUVVBTElTRVJfODAwMF9BMCwgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTRVhfRVFVQUxJU0VSXzgwMDBfQTEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzgwMDBfQTIsCi0gICAgIENTRVhfRVFVQUxJU0VSXzgwMDBfQjEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzgwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl84MDAwX1NDQUxFfSwKLSAgICB7Q1NFWF9FUVVBTElTRVJfMTEwMjVfQTAsICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU0VYX0VRVUFMSVNFUl8xMTAyNV9BMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTIsCi0gICAgIENTRVhfRVFVQUxJU0VSXzExMDI1X0IxLAotICAgICBDU0VYX0VRVUFMSVNFUl8xMTAyNV9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzExMDI1X1NDQUxFfSwKLSAgICB7Q1NFWF9FUVVBTElTRVJfMTIwMDBfQTAsICAgLyogMTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU0VYX0VRVUFMSVNFUl8xMjAwMF9BMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTIsCi0gICAgIENTRVhfRVFVQUxJU0VSXzEyMDAwX0IxLAotICAgICBDU0VYX0VRVUFMSVNFUl8xMjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzEyMDAwX1NDQUxFfSwKLSAgICB7Q1NFWF9FUVVBTElTRVJfMTYwMDBfQTAsICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU0VYX0VRVUFMSVNFUl8xNjAwMF9BMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTIsCi0gICAgIENTRVhfRVFVQUxJU0VSXzE2MDAwX0IxLAotICAgICBDU0VYX0VRVUFMSVNFUl8xNjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzE2MDAwX1NDQUxFfSwKLSAgICB7Q1NFWF9FUVVBTElTRVJfMjIwNTBfQTAsICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU0VYX0VRVUFMSVNFUl8yMjA1MF9BMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTIsCi0gICAgIENTRVhfRVFVQUxJU0VSXzIyMDUwX0IxLAotICAgICBDU0VYX0VRVUFMSVNFUl8yMjA1MF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzIyMDUwX1NDQUxFfSwKLSAgICB7Q1NFWF9FUVVBTElTRVJfMjQwMDBfQTAsICAgLyogMjRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU0VYX0VRVUFMSVNFUl8yNDAwMF9BMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTIsCi0gICAgIENTRVhfRVFVQUxJU0VSXzI0MDAwX0IxLAotICAgICBDU0VYX0VRVUFMSVNFUl8yNDAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzI0MDAwX1NDQUxFfSwKLSAgICB7Q1NFWF9FUVVBTElTRVJfMzIwMDBfQTAsICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU0VYX0VRVUFMSVNFUl8zMjAwMF9BMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTIsCi0gICAgIENTRVhfRVFVQUxJU0VSXzMyMDAwX0IxLAotICAgICBDU0VYX0VRVUFMSVNFUl8zMjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzMyMDAwX1NDQUxFfSwKLSAgICB7Q1NFWF9FUVVBTElTRVJfNDQxMDBfQTAsICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU0VYX0VRVUFMSVNFUl80NDEwMF9BMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTIsCi0gICAgIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0IxLAotICAgICBDU0VYX0VRVUFMSVNFUl80NDEwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzQ0MTAwX1NDQUxFfSwKLSAgICB7Q1NFWF9FUVVBTElTRVJfNDgwMDBfQTAsICAgLyogNDhrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU0VYX0VRVUFMSVNFUl80ODAwMF9BMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTIsCi0gICAgIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0IxLAotICAgICBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfQotI2lmZGVmIEhJR0hFUl9GUwotICAgICwKLSAgICB7Q1NFWF9FUVVBTElTRVJfOTYwMDBfQTAsICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMSwKLSAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTIsCi0gICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IxLAotICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFfSwKLSAgICAge0NTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMCwgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLwotICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTEsCi0gICAgIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMiwKLSAgICAgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IxLAotICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEV9Ci0jZW5kaWYKLX07Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV2ZXJiIGRlbGF5IGNvbnN0YW50IHRhYmxlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFN0ZXJlbyBkZWxheSB0YWJsZSBmb3IgQ29uY2VydCBTb3VuZCAqLwotY29uc3QgTFZNX1VJTlQxNiAgICBMVkNTX1N0ZXJlb0RlbGF5Q1NbXSA9IHsKLSAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzhLSFosCi0gICAgTFZDU19TVEVSRU9ERUxBWV9DU18xMUtIWiwKLSAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzEyS0haLAotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTZLSFosCi0gICAgTFZDU19TVEVSRU9ERUxBWV9DU18yMktIWiwKLSAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzI0S0haLAotICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMzJLSFosCi0gICAgTFZDU19TVEVSRU9ERUxBWV9DU180NEtIWiwKLSAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzQ4S0hafTsKLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgUmV2ZXJiIGNvZWZmaWNpZW50cyBjb25zdGFudCB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWNvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19SZXZlcmJDb2VmVGFibGVbXSA9IHsKLSAgICAvKiBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCi0gICAge0NTX1JFVkVSQl84MDAwX0EwLCAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KLSAgICAgQ1NfUkVWRVJCXzgwMDBfQTEsCi0gICAgIENTX1JFVkVSQl84MDAwX0EyLAotICAgICBDU19SRVZFUkJfODAwMF9CMSwKLSAgICAgQ1NfUkVWRVJCXzgwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfODAwMF9TQ0FMRX0sCi0gICAge0NTX1JFVkVSQl8xMTAyNV9BMCwgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1JFVkVSQl8xMTAyNV9BMSwKLSAgICAgQ1NfUkVWRVJCXzExMDI1X0EyLAotICAgICBDU19SRVZFUkJfMTEwMjVfQjEsCi0gICAgIENTX1JFVkVSQl8xMTAyNV9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl8xMTAyNV9TQ0FMRX0sCi0gICAge0NTX1JFVkVSQl8xMjAwMF9BMCwgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1JFVkVSQl8xMjAwMF9BMSwKLSAgICAgQ1NfUkVWRVJCXzEyMDAwX0EyLAotICAgICBDU19SRVZFUkJfMTIwMDBfQjEsCi0gICAgIENTX1JFVkVSQl8xMjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl8xMjAwMF9TQ0FMRX0sCi0gICAge0NTX1JFVkVSQl8xNjAwMF9BMCwgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1JFVkVSQl8xNjAwMF9BMSwKLSAgICAgQ1NfUkVWRVJCXzE2MDAwX0EyLAotICAgICBDU19SRVZFUkJfMTYwMDBfQjEsCi0gICAgIENTX1JFVkVSQl8xNjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl8xNjAwMF9TQ0FMRX0sCi0gICAge0NTX1JFVkVSQl8yMjA1MF9BMCwgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1JFVkVSQl8yMjA1MF9BMSwKLSAgICAgQ1NfUkVWRVJCXzIyMDUwX0EyLAotICAgICBDU19SRVZFUkJfMjIwNTBfQjEsCi0gICAgIENTX1JFVkVSQl8yMjA1MF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl8yMjA1MF9TQ0FMRX0sCi0gICAge0NTX1JFVkVSQl8yNDAwMF9BMCwgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1JFVkVSQl8yNDAwMF9BMSwKLSAgICAgQ1NfUkVWRVJCXzI0MDAwX0EyLAotICAgICBDU19SRVZFUkJfMjQwMDBfQjEsCi0gICAgIENTX1JFVkVSQl8yNDAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl8yNDAwMF9TQ0FMRX0sCi0gICAge0NTX1JFVkVSQl8zMjAwMF9BMCwgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1JFVkVSQl8zMjAwMF9BMSwKLSAgICAgQ1NfUkVWRVJCXzMyMDAwX0EyLAotICAgICBDU19SRVZFUkJfMzIwMDBfQjEsCi0gICAgIENTX1JFVkVSQl8zMjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl8zMjAwMF9TQ0FMRX0sCi0gICAge0NTX1JFVkVSQl80NDEwMF9BMCwgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1JFVkVSQl80NDEwMF9BMSwKLSAgICAgQ1NfUkVWRVJCXzQ0MTAwX0EyLAotICAgICBDU19SRVZFUkJfNDQxMDBfQjEsCi0gICAgIENTX1JFVkVSQl80NDEwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl80NDEwMF9TQ0FMRX0sCi0gICAge0NTX1JFVkVSQl80ODAwMF9BMCwgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1JFVkVSQl80ODAwMF9BMSwKLSAgICAgQ1NfUkVWRVJCXzQ4MDAwX0EyLAotICAgICBDU19SRVZFUkJfNDgwMDBfQjEsCi0gICAgIENTX1JFVkVSQl80ODAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl80ODAwMF9TQ0FMRX0KLSNpZmRlZiBISUdIRVJfRlMKLSAgICAsCi0gICAge0NTX1JFVkVSQl85NjAwMF9BMCwgICAgICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1JFVkVSQl85NjAwMF9BMSwKLSAgICAgQ1NfUkVWRVJCXzk2MDAwX0EyLAotICAgICBDU19SRVZFUkJfOTYwMDBfQjEsCi0gICAgIENTX1JFVkVSQl85NjAwMF9CMiwKLSAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl85NjAwMF9TQ0FMRX0sCi0gICAgIHtDU19SRVZFUkJfMTkyMDAwX0EwLCAgICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCi0gICAgIENTX1JFVkVSQl8xOTIwMDBfQTEsCi0gICAgIENTX1JFVkVSQl8xOTIwMDBfQTIsCi0gICAgIENTX1JFVkVSQl8xOTIwMDBfQjEsCi0gICAgIENTX1JFVkVSQl8xOTIwMDBfQjIsCi0gICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfMTkyMDAwX1NDQUxFfQotI2VuZGlmCi19OwotCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIEJ5cGFzcyBtaXhlciBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1jb25zdCBHYWluX3QgTFZDU19PdXRwdXRHYWluVGFibGVbXSA9IHsKLSAgICB7TFZDU19IRUFEUEhPTkVfU0hJRlQsICAgICAgICAgLyogSGVhZHBob25lLCBzdGVyZW8gbW9kZSAqLwotICAgICBMVkNTX0hFQURQSE9ORV9TSElGVExPU1MsCi0gICAgIExWQ1NfSEVBRFBIT05FX0dBSU59LAotICAgIHtMVkNTX0VYX0hFQURQSE9ORV9TSElGVCwgICAgICAvKiBFWCBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCi0gICAgIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUTE9TUywKLSAgICAgTFZDU19FWF9IRUFEUEhPTkVfR0FJTn0sCi0gICAge0xWQ1NfSEVBRFBIT05FX1NISUZULCAgICAgICAgIC8qIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCi0gICAgIExWQ1NfSEVBRFBIT05FX1NISUZUTE9TUywKLSAgICAgTFZDU19IRUFEUEhPTkVfR0FJTn0sCi0gICAge0xWQ1NfRVhfSEVBRFBIT05FX1NISUZULCAgICAgIC8qIEVYIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCi0gICAgIExWQ1NfRVhfSEVBRFBIT05FX1NISUZUTE9TUywKLSAgICAgTFZDU19FWF9IRUFEUEhPTkVfR0FJTn0KLX07Ci0KLQotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVm9sdW1lIGNvcnJlY3Rpb24gdGFibGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBDb2VmZmljaWVudCBvcmRlcjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIENvbXByZXNzaW9uIDEwMCUgZWZmZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICBDb21wcmVzc2lvbiAwJSBlZmZlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgR2FpbiAxMDAlIGVmZmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgIEdhaW4gMCUgZWZmZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBUaGUgQ29tcHJlc3Npb24gZ2FpbiBpcyByZXByZXNlbnRlZCBieSBhIFExLjE1IG51bWJlciB0byBnaXZlIGEgcmFuZ2Ugb2YgMGRCICAgICovCi0vKiAgdG8gKzZkQiwgRS5nLjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgMCAgICAgICBpcyAwZEIgY29tcHJlc3Npb24gKG5vIGVmZmVjdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgIDU0NjEgICAgaXMgMWRCIGNvbXByZXNzaW9uIGdhaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAxMDkyMyAgIGlzIDJkQiBjb21wcmVzc2lvbiBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgMzI3NjcgICBpcyA2ZEIgY29tcHJlc3Npb24gZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgVGhlIEdhaW4gaXMgcmVwcmVzZW50ZWQgYXMgYSBRMy4xMyBudW1iZXIgdG8gZ2l2ZSBhIHJhbmdlIG9mICs4IHRvIC1pbmZpbml0eSAgICAqLwotLyogIEUuZy46ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgIDAgICAgICAgaXMgLWluZmluaXR5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAzMjc2NyAgIGlzICsxOGRCICh4OCkgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogICAgICAgICAgNDA5NiAgICBpcyAwZEIgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgIDEwMjQgICAgaXMgLTEyZEIgZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLWNvbnN0IExWQ1NfVm9sQ29ycmVjdF90IExWQ1NfVm9sQ29ycmVjdFRhYmxlW10gPSB7Ci0jaWZkZWYgQlVJTERfRkxPQVQKLSAgICB7MC40MzMzNjJmLCAgICAgICAgICAvKiBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCi0gICAgIDAuMDAwMDAwZiwKLSAgICAgMS4wMDAwMjRmLAotICAgICAxLjQxMjY0MGZ9LAotICAgIHswLjQzMzM2MmYsICAgICAgICAgIC8qIEVYIEhlYWRwaG9uZSwgc3RlcmVvIG1vZGUgKi8KLSAgICAgMC4wMDAwMDBmLAotICAgICAxLjAwMDAyNGYsCi0gICAgIDEuNDEyNjQwZn0sCi0gICAgezEuMDAwMDAwZiwgICAgICAgICAvKiBIZWFkcGhvbmUsIG1vbm8gbW9kZSAqLwotICAgICAwLjAwMDAwMGYsCi0gICAgIDEuMDAwMDI0ZiwKLSAgICAgMS40MTI2NDBmfSwKLSAgICB7MS4wMDAwMDBmLCAgICAgICAgIC8qIEVYIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCi0gICAgIDAuMDAwMDAwZiwKLSAgICAgMS4wMDAwMjRmLAotICAgICAxLjQxMjY0MGZ9Ci0jZWxzZQotICAgIHsxNDIwMCwgICAgICAgICAgLyogSGVhZHBob25lLCBzdGVyZW8gbW9kZSAqLwotICAgICAwLAotICAgICA0MDk2LAotICAgICA1Nzg2fSwKLSAgICB7MTQyMDAsICAgICAgICAgIC8qIEVYIEhlYWRwaG9uZSwgc3RlcmVvIG1vZGUgKi8KLSAgICAgMCwKLSAgICAgNDA5NiwKLSAgICAgNTc4Nn0sCi0gICAgezMyNzY3LCAgICAgICAgIC8qIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCi0gICAgIDAsCi0gICAgIDQwOTYsCi0gICAgIDU3ODZ9LAotICAgIHszMjc2NywgICAgICAgICAvKiBFWCBIZWFkcGhvbmUsIG1vbm8gbW9kZSAqLwotICAgICAwLAotICAgICA0MDk2LAotICAgICA1Nzg2fQotI2VuZGlmCi19OwotCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICBNaXhlciB0aW1lIGNvbnN0YW50cywgMTAwbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBMVkNTX1ZPTF9UQ19GczgwMDAgICAgICAzMjU4MCAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NDI2MjY5NSAqLwotI2RlZmluZSBMVkNTX1ZPTF9UQ19GczExMDI1ICAgICAzMjYzMiAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NTg0OTYwOSAqLwotI2RlZmluZSBMVkNTX1ZPTF9UQ19GczEyMDAwICAgICAzMjY0MyAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NjE4NTMwMyAqLwotI2RlZmluZSBMVkNTX1ZPTF9UQ19GczE2MDAwICAgICAzMjY3NCAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzEzMTM0OCAqLwotI2RlZmluZSBMVkNTX1ZPTF9UQ19GczIyMDUwICAgICAzMjcwMCAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzkyNDgwNSAqLwotI2RlZmluZSBMVkNTX1ZPTF9UQ19GczI0MDAwICAgICAzMjcwNSAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODA3NzM5MyAqLwotI2RlZmluZSBMVkNTX1ZPTF9UQ19GczMyMDAwICAgICAzMjcyMSAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODU2NTY3NCAqLwotI2RlZmluZSBMVkNTX1ZPTF9UQ19GczQ0MTAwICAgICAzMjczNCAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODk2MjQwMiAqLwotI2RlZmluZSBMVkNTX1ZPTF9UQ19GczQ4MDAwICAgICAzMjczNyAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTA1Mzk1NSAqLwotI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotI2RlZmluZSBMVkNTX1ZPTF9UQ19Gczk2MDAwICAgICAzMjc1MSAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTUxMTcwMyAqLyAgIC8qIFRvZG8gQCBuZWVkIHRvIHJlIGNoZWNrIHRoaXMgdmFsdWUqLwotI2RlZmluZSBMVkNTX1ZPTF9UQ19GczE5MjAwMCAgICAzMjc2MyAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTg3NzkyNSAqLyAgLyogVG9kbyBAIG5lZWQgdG8gcmUgY2hlY2sgdGhpcyB2YWx1ZSovCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVsxMV0gPSB7TFZDU19WT0xfVENfRnM4MDAwLAotCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMTAyNSwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMTIwMDAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczE2MDAwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMyMjA1MCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzMjQwMDAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19GczMyMDAwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnM0NDEwMCwKLQkJCQkJCQkJCQkgIExWQ1NfVk9MX1RDX0ZzNDgwMDAsCi0JCQkJCQkJCQkJICBMVkNTX1ZPTF9UQ19Gczk2MDAwLAotCQkJCQkJCQkJCSAgTFZDU19WT0xfVENfRnMxOTIwMDAKLX07Ci0jZWxzZQotY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVs5XSA9IHtMVkNTX1ZPTF9UQ19GczgwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxMTAyNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczEyMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTYwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMyMjA1MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczI0MDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMzIwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM0NDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczQ4MDAwCi19OwotI2VuZGlmCi0KLS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogIFNhbXBsZSByYXRlIHRhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KLS8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCi0vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoSElHSEVSX0ZTKQotY29uc3QgTFZNX0lOVDMyICAgTFZDU19TYW1wbGVSYXRlVGFibGVbMTFdID0gezgwMDAsCi0JCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTEwMjUsCi0JCQkJCQkJCQkJCSAgMTIwMDAsCi0JCQkJCQkJCQkJCSAgMTYwMDAsCi0JCQkJCQkJCQkJCSAgMjIwNTAsCi0JCQkJCQkJCQkJCSAgMjQwMDAsCi0JCQkJCQkJCQkJCSAgMzIwMDAsCi0JCQkJCQkJCQkJCSAgNDQxMDAsCi0JCQkJCQkJCQkJCSAgNDgwMDAsCi0JCQkJCQkJCQkJCSAgOTYwMDAsCi0JCQkJCQkJCQkJCSAgMTkyMDAwCi19OwotI2Vsc2UKLWNvbnN0IExWTV9JTlQxNiAgIExWQ1NfU2FtcGxlUmF0ZVRhYmxlWzldID0gezgwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDUwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDAwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMzIwMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA0ODAwMAotfTsKLSNlbmRpZgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jcHAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzlkYjYxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5jcHAKQEAgLTAsMCArMSw1NzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDQtMjAxMCBOWFAgU29mdHdhcmUKKyAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIEluY2x1ZGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAiTFZDU19Qcml2YXRlLmgiCisjaW5jbHVkZSAiTFZDU19UYWJsZXMuaCIKKyNpbmNsdWRlICJGaWx0ZXJzLmgiICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbHRlciBkZWZpbml0aW9ucyAqLworI2luY2x1ZGUgIkJJUVVBRC5oIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQmlxdWFkIGRlZmluaXRpb25zICovCisjaW5jbHVkZSAiTFZDU19IZWFkcGhvbmVfQ29lZmZzLmgiICAgICAgICAgICAgICAvKiBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFN0ZXJlbyBFbmhhbmNlciBjb2VmZmljaWVudCBjb25zdGFudCB0YWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBDb2VmZmljaWVudCB0YWJsZSBmb3IgdGhlIG1pZGRsZSBmaWx0ZXIgKi8KK2NvbnN0IEJpcXVhZEEwMUIxQ29lZnNTUF90IExWQ1NfU0VNaWRDb2VmVGFibGVbXSA9IHsKKyAgICB7Q1NfTUlERExFXzgwMDBfQTAsICAgICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV84MDAwX0ExLAorICAgICBDU19NSURETEVfODAwMF9CMSwKKyAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV84MDAwX1NDQUxFfSwKKyAgICB7Q1NfTUlERExFXzExMDI1X0EwLCAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfMTEwMjVfQTEsCisgICAgIENTX01JRERMRV8xMTAyNV9CMSwKKyAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV8xMTAyNV9TQ0FMRX0sCisgICAge0NTX01JRERMRV8xMjAwMF9BMCwgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfTUlERExFXzEyMDAwX0ExLAorICAgICBDU19NSURETEVfMTIwMDBfQjEsCisgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfMTIwMDBfU0NBTEV9LAorICAgIHtDU19NSURETEVfMTYwMDBfQTAsICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV8xNjAwMF9BMSwKKyAgICAgQ1NfTUlERExFXzE2MDAwX0IxLAorICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzE2MDAwX1NDQUxFfSwKKyAgICB7Q1NfTUlERExFXzIyMDUwX0EwLCAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfMjIwNTBfQTEsCisgICAgIENTX01JRERMRV8yMjA1MF9CMSwKKyAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV8yMjA1MF9TQ0FMRX0sCisgICAge0NTX01JRERMRV8yNDAwMF9BMCwgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfTUlERExFXzI0MDAwX0ExLAorICAgICBDU19NSURETEVfMjQwMDBfQjEsCisgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfMjQwMDBfU0NBTEV9LAorICAgIHtDU19NSURETEVfMzIwMDBfQTAsICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV8zMjAwMF9BMSwKKyAgICAgQ1NfTUlERExFXzMyMDAwX0IxLAorICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzMyMDAwX1NDQUxFfSwKKyAgICB7Q1NfTUlERExFXzQ0MTAwX0EwLCAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19NSURETEVfNDQxMDBfQTEsCisgICAgIENTX01JRERMRV80NDEwMF9CMSwKKyAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV80NDEwMF9TQ0FMRX0sCisgICAge0NTX01JRERMRV80ODAwMF9BMCwgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfTUlERExFXzQ4MDAwX0ExLAorICAgICBDU19NSURETEVfNDgwMDBfQjEsCisgICAgIChMVk1fVUlOVDE2IClDU19NSURETEVfNDgwMDBfU0NBTEV9CisgICAgLAorICAgIHtDU19NSURETEVfODgyMDBfQTAsICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV84ODIwMF9BMSwKKyAgICAgQ1NfTUlERExFXzg4MjAwX0IxLAorICAgICAoTFZNX1VJTlQxNilDU19NSURETEVfODgyMDBfU0NBTEV9LAorICAgIHtDU19NSURETEVfOTYwMDBfQTAsICAgICAgICAvKiA5NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV85NjAwMF9BMSwKKyAgICAgQ1NfTUlERExFXzk2MDAwX0IxLAorICAgICAoTFZNX1VJTlQxNiApQ1NfTUlERExFXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfTUlERExFXzE3NjQwMF9BMCwgICAgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX01JRERMRV8xNzY0MDBfQTEsCisgICAgIENTX01JRERMRV8xNzY0MDBfQjEsCisgICAgIChMVk1fVUlOVDE2KUNTX01JRERMRV8xNzY0MDBfU0NBTEV9LAorICAgIHtDU19NSURETEVfMTkyMDAwX0EwLCAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfTUlERExFXzE5MjAwMF9BMSwKKyAgICAgQ1NfTUlERExFXzE5MjAwMF9CMSwKKyAgICAgKExWTV9VSU5UMTYgKUNTX01JRERMRV8xOTIwMDBfU0NBTEV9CisgICAgfTsKKworLyogQ29lZmZpY2llbnQgdGFibGUgZm9yIHRoZSBzaWRlIGZpbHRlciAqLworY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX1NFU2lkZUNvZWZUYWJsZVtdID0geworICAgIC8qIEhlYWRwaG9uZSBTaWRlIGNvZWZmaWNpZW50cyAqLworICAgIHtDU19TSURFXzgwMDBfQTAsICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV84MDAwX0ExLAorICAgICBDU19TSURFXzgwMDBfQTIsCisgICAgIENTX1NJREVfODAwMF9CMSwKKyAgICAgQ1NfU0lERV84MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV84MDAwX1NDQUxFfSwKKyAgICB7Q1NfU0lERV8xMTAyNV9BMCwgICAgICAgICAgLyogMTFrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19TSURFXzExMDI1X0ExLAorICAgICBDU19TSURFXzExMDI1X0EyLAorICAgICBDU19TSURFXzExMDI1X0IxLAorICAgICBDU19TSURFXzExMDI1X0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV8xMTAyNV9TQ0FMRX0sCisgICAge0NTX1NJREVfMTIwMDBfQTAsICAgICAgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV8xMjAwMF9BMSwKKyAgICAgQ1NfU0lERV8xMjAwMF9BMiwKKyAgICAgQ1NfU0lERV8xMjAwMF9CMSwKKyAgICAgQ1NfU0lERV8xMjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfMTIwMDBfU0NBTEV9LAorICAgIHtDU19TSURFXzE2MDAwX0EwLCAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfMTYwMDBfQTEsCisgICAgIENTX1NJREVfMTYwMDBfQTIsCisgICAgIENTX1NJREVfMTYwMDBfQjEsCisgICAgIENTX1NJREVfMTYwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzE2MDAwX1NDQUxFfSwKKyAgICB7Q1NfU0lERV8yMjA1MF9BMCwgICAgICAgICAgLyogMjJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19TSURFXzIyMDUwX0ExLAorICAgICBDU19TSURFXzIyMDUwX0EyLAorICAgICBDU19TSURFXzIyMDUwX0IxLAorICAgICBDU19TSURFXzIyMDUwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV8yMjA1MF9TQ0FMRX0sCisgICAge0NTX1NJREVfMjQwMDBfQTAsICAgICAgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV8yNDAwMF9BMSwKKyAgICAgQ1NfU0lERV8yNDAwMF9BMiwKKyAgICAgQ1NfU0lERV8yNDAwMF9CMSwKKyAgICAgQ1NfU0lERV8yNDAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfMjQwMDBfU0NBTEV9LAorICAgIHtDU19TSURFXzMyMDAwX0EwLCAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfMzIwMDBfQTEsCisgICAgIENTX1NJREVfMzIwMDBfQTIsCisgICAgIENTX1NJREVfMzIwMDBfQjEsCisgICAgIENTX1NJREVfMzIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19TSURFXzMyMDAwX1NDQUxFfSwKKyAgICB7Q1NfU0lERV80NDEwMF9BMCwgICAgICAgICAgLyogNDRrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19TSURFXzQ0MTAwX0ExLAorICAgICBDU19TSURFXzQ0MTAwX0EyLAorICAgICBDU19TSURFXzQ0MTAwX0IxLAorICAgICBDU19TSURFXzQ0MTAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV80NDEwMF9TQ0FMRX0sCisgICAge0NTX1NJREVfNDgwMDBfQTAsICAgICAgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV80ODAwMF9BMSwKKyAgICAgQ1NfU0lERV80ODAwMF9BMiwKKyAgICAgQ1NfU0lERV80ODAwMF9CMSwKKyAgICAgQ1NfU0lERV80ODAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfNDgwMDBfU0NBTEV9CisgICAgICwKKyAgICB7Q1NfU0lERV84ODIwMF9BMCwgICAgICAgICAgLyogODhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19TSURFXzg4MjAwX0ExLAorICAgICBDU19TSURFXzg4MjAwX0EyLAorICAgICBDU19TSURFXzg4MjAwX0IxLAorICAgICBDU19TSURFXzg4MjAwX0IyLAorICAgICAoTFZNX1VJTlQxNilDU19TSURFXzg4MjAwX1NDQUxFfSwKKyAgICAge0NTX1NJREVfOTYwMDBfQTAsICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfU0lERV85NjAwMF9BMSwKKyAgICAgQ1NfU0lERV85NjAwMF9BMiwKKyAgICAgQ1NfU0lERV85NjAwMF9CMSwKKyAgICAgQ1NfU0lERV85NjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1NJREVfOTYwMDBfU0NBTEV9LAorICAgIHtDU19TSURFXzE3NjQwMF9BMCwgICAgICAgICAgLyoxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19TSURFXzE3NjQwMF9BMSwKKyAgICAgQ1NfU0lERV8xNzY0MDBfQTIsCisgICAgIENTX1NJREVfMTc2NDAwX0IxLAorICAgICBDU19TSURFXzE3NjQwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NfU0lERV8xNzY0MDBfU0NBTEV9LAorICAgICB7Q1NfU0lERV8xOTIwMDBfQTAsICAgICAgICAgIC8qIDE5MmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1NJREVfMTkyMDAwX0ExLAorICAgICBDU19TSURFXzE5MjAwMF9BMiwKKyAgICAgQ1NfU0lERV8xOTIwMDBfQjEsCisgICAgIENTX1NJREVfMTkyMDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfU0lERV8xOTIwMDBfU0NBTEV9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBFcXVhbGlzZXIgY29lZmZpY2llbnQgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworY29uc3QgQmlxdWFkQTAxMkIxMkNvZWZzU1BfdCBMVkNTX0VxdWFsaXNlckNvZWZUYWJsZVtdID0geworICAgIC8qIEhlYWRwaG9uZSBjb2VmZmljaWVudHMgKi8KKyAgICB7Q1NfRVFVQUxJU0VSXzgwMDBfQTAsICAgICAgLyogOGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl84MDAwX0ExLAorICAgICBDU19FUVVBTElTRVJfODAwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzgwMDBfQjEsCisgICAgIENTX0VRVUFMSVNFUl84MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzgwMDBfU0NBTEV9LAorICAgIHtDU19FUVVBTElTRVJfMTEwMjVfQTAsICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl8xMTAyNV9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzExMDI1X0EyLAorICAgICBDU19FUVVBTElTRVJfMTEwMjVfQjEsCisgICAgIENTX0VRVUFMSVNFUl8xMTAyNV9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRX0sCisgICAge0NTX0VRVUFMSVNFUl8xMjAwMF9BMCwgICAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzEyMDAwX0ExLAorICAgICBDU19FUVVBTElTRVJfMTIwMDBfQTIsCisgICAgIENTX0VRVUFMSVNFUl8xMjAwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzEyMDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzEyMDAwX1NDQUxFfSwKKyAgICB7Q1NfRVFVQUxJU0VSXzE2MDAwX0EwLCAgICAgLyogMTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19FUVVBTElTRVJfMTYwMDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl8xNjAwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzE2MDAwX0IxLAorICAgICBDU19FUVVBTElTRVJfMTYwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfMTYwMDBfU0NBTEV9LAorICAgIHtDU19FUVVBTElTRVJfMjIwNTBfQTAsICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl8yMjA1MF9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzIyMDUwX0EyLAorICAgICBDU19FUVVBTElTRVJfMjIwNTBfQjEsCisgICAgIENTX0VRVUFMSVNFUl8yMjA1MF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRX0sCisgICAge0NTX0VRVUFMSVNFUl8yNDAwMF9BMCwgICAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzI0MDAwX0ExLAorICAgICBDU19FUVVBTElTRVJfMjQwMDBfQTIsCisgICAgIENTX0VRVUFMSVNFUl8yNDAwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzI0MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzI0MDAwX1NDQUxFfSwKKyAgICB7Q1NfRVFVQUxJU0VSXzMyMDAwX0EwLCAgICAgLyogMzJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19FUVVBTElTRVJfMzIwMDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl8zMjAwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzMyMDAwX0IxLAorICAgICBDU19FUVVBTElTRVJfMzIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19FUVVBTElTRVJfMzIwMDBfU0NBTEV9LAorICAgIHtDU19FUVVBTElTRVJfNDQxMDBfQTAsICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl80NDEwMF9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzQ0MTAwX0EyLAorICAgICBDU19FUVVBTElTRVJfNDQxMDBfQjEsCisgICAgIENTX0VRVUFMSVNFUl80NDEwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl80NDEwMF9TQ0FMRX0sCisgICAge0NTX0VRVUFMSVNFUl80ODAwMF9BMCwgICAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0ExLAorICAgICBDU19FUVVBTElTRVJfNDgwMDBfQTIsCisgICAgIENTX0VRVUFMSVNFUl80ODAwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzQ4MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzQ4MDAwX1NDQUxFfSwKKyAgICB7Q1NfRVFVQUxJU0VSXzg4MjAwX0EwLCAgICAgLyogODhrUy9zIGNvZWZmaWVpZW50cyAqLworICAgICBDU19FUVVBTElTRVJfODgyMDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl84ODIwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzg4MjAwX0IxLAorICAgICBDU19FUVVBTElTRVJfODgyMDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl84ODIwMF9TQ0FMRX0sCisgICAge0NTX0VRVUFMSVNFUl85NjAwMF9BMCwgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0ExLAorICAgICBDU19FUVVBTElTRVJfOTYwMDBfQTIsCisgICAgIENTX0VRVUFMSVNFUl85NjAwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzk2MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfRVFVQUxJU0VSXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfRVFVQUxJU0VSXzE3NjQwMF9BMCwgICAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQTEsCisgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQTIsCisgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQjEsCisgICAgIENTX0VRVUFMSVNFUl8xNzY0MDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTX0VRVUFMSVNFUl8xNzY0MDBfU0NBTEV9LAorICAgIHtDU19FUVVBTElTRVJfMTkyMDAwX0EwLCAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9BMiwKKyAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMSwKKyAgICAgQ1NfRVFVQUxJU0VSXzE5MjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEV9LAorCisgICAgLyogQ29uY2VydCBTb3VuZCBFWCBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCisgICAge0NTRVhfRVFVQUxJU0VSXzgwMDBfQTAsICAgIC8qIDhrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU0VYX0VRVUFMSVNFUl84MDAwX0ExLAorICAgICBDU0VYX0VRVUFMSVNFUl84MDAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl84MDAwX0IxLAorICAgICBDU0VYX0VRVUFMSVNFUl84MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NFWF9FUVVBTElTRVJfODAwMF9TQ0FMRX0sCisgICAge0NTRVhfRVFVQUxJU0VSXzExMDI1X0EwLCAgIC8qIDExa1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzExMDI1X0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl8xMTAyNV9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTEwMjVfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8xMTAyNV9TQ0FMRX0sCisgICAge0NTRVhfRVFVQUxJU0VSXzEyMDAwX0EwLCAgIC8qIDEya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzEyMDAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl8xMjAwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8xMjAwMF9TQ0FMRX0sCisgICAge0NTRVhfRVFVQUxJU0VSXzE2MDAwX0EwLCAgIC8qIDE2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzE2MDAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl8xNjAwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTYwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8xNjAwMF9TQ0FMRX0sCisgICAge0NTRVhfRVFVQUxJU0VSXzIyMDUwX0EwLCAgIC8qIDIya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzIyMDUwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl8yMjA1MF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMjIwNTBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8yMjA1MF9TQ0FMRX0sCisgICAge0NTRVhfRVFVQUxJU0VSXzI0MDAwX0EwLCAgIC8qIDI0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzI0MDAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl8yNDAwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMjQwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8yNDAwMF9TQ0FMRX0sCisgICAge0NTRVhfRVFVQUxJU0VSXzMyMDAwX0EwLCAgIC8qIDMya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzMyMDAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl8zMjAwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMzIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8zMjAwMF9TQ0FMRX0sCisgICAge0NTRVhfRVFVQUxJU0VSXzQ0MTAwX0EwLCAgIC8qIDQ0a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzQ0MTAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl80NDEwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfNDQxMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl80NDEwMF9TQ0FMRX0sCisgICAge0NTRVhfRVFVQUxJU0VSXzQ4MDAwX0EwLCAgIC8qIDQ4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzQ4MDAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl80ODAwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfNDgwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl80ODAwMF9TQ0FMRX0KKyAgICAsCisgICAge0NTRVhfRVFVQUxJU0VSXzg4MjAwX0EwLCAgIC8qIDg4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NFWF9FUVVBTElTRVJfODgyMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzg4MjAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl84ODIwMF9CMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfODgyMDBfQjIsCisgICAgIChMVk1fVUlOVDE2KUNTRVhfRVFVQUxJU0VSXzg4MjAwX1NDQUxFfSwKKyAgICB7Q1NFWF9FUVVBTElTRVJfOTYwMDBfQTAsICAgLyogOTZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9BMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfOTYwMDBfQTIsCisgICAgIENTRVhfRVFVQUxJU0VSXzk2MDAwX0IxLAorICAgICBDU0VYX0VRVUFMSVNFUl85NjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTRVhfRVFVQUxJU0VSXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NFWF9FUVVBTElTRVJfMTc2NDAwX0EwLCAgIC8qIDE3NmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9BMSwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTc2NDAwX0EyLAorICAgICBDU0VYX0VRVUFMSVNFUl8xNzY0MDBfQjEsCisgICAgIENTRVhfRVFVQUxJU0VSXzE3NjQwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NFWF9FUVVBTElTRVJfMTc2NDAwX1NDQUxFfSwKKyAgICAge0NTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMCwgICAvKiAxOTJrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQTEsCisgICAgIENTRVhfRVFVQUxJU0VSXzE5MjAwMF9BMiwKKyAgICAgQ1NFWF9FUVVBTElTRVJfMTkyMDAwX0IxLAorICAgICBDU0VYX0VRVUFMSVNFUl8xOTIwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU0VYX0VRVUFMSVNFUl8xOTIwMDBfU0NBTEV9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBSZXZlcmIgZGVsYXkgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogU3RlcmVvIGRlbGF5IHRhYmxlIGZvciBDb25jZXJ0IFNvdW5kICovCitjb25zdCBMVk1fVUlOVDE2ICAgIExWQ1NfU3RlcmVvRGVsYXlDU1tdID0geworICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfOEtIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzExS0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTJLSFosCisgICAgTFZDU19TVEVSRU9ERUxBWV9DU18xNktIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzIyS0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMjRLSFosCisgICAgTFZDU19TVEVSRU9ERUxBWV9DU18zMktIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzQ0S0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfNDhLSFosCisgICAgTFZDU19TVEVSRU9ERUxBWV9DU184OEtIWiwKKyAgICBMVkNTX1NURVJFT0RFTEFZX0NTXzk2S0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTc2S0haLAorICAgIExWQ1NfU1RFUkVPREVMQVlfQ1NfMTkyS0haLAorfTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgUmV2ZXJiIGNvZWZmaWNpZW50cyBjb25zdGFudCB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2NvbnN0IEJpcXVhZEEwMTJCMTJDb2Vmc1NQX3QgTFZDU19SZXZlcmJDb2VmVGFibGVbXSA9IHsKKyAgICAvKiBIZWFkcGhvbmUgY29lZmZpY2llbnRzICovCisgICAge0NTX1JFVkVSQl84MDAwX0EwLCAgICAgICAgICAgICAvKiA4a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfUkVWRVJCXzgwMDBfQTEsCisgICAgIENTX1JFVkVSQl84MDAwX0EyLAorICAgICBDU19SRVZFUkJfODAwMF9CMSwKKyAgICAgQ1NfUkVWRVJCXzgwMDBfQjIsCisgICAgIChMVk1fVUlOVDE2IClDU19SRVZFUkJfODAwMF9TQ0FMRX0sCisgICAge0NTX1JFVkVSQl8xMTAyNV9BMCwgICAgICAgICAgICAvKiAxMWtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl8xMTAyNV9BMSwKKyAgICAgQ1NfUkVWRVJCXzExMDI1X0EyLAorICAgICBDU19SRVZFUkJfMTEwMjVfQjEsCisgICAgIENTX1JFVkVSQl8xMTAyNV9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl8xMTAyNV9TQ0FMRX0sCisgICAge0NTX1JFVkVSQl8xMjAwMF9BMCwgICAgICAgICAgICAvKiAxMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl8xMjAwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzEyMDAwX0EyLAorICAgICBDU19SRVZFUkJfMTIwMDBfQjEsCisgICAgIENTX1JFVkVSQl8xMjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl8xMjAwMF9TQ0FMRX0sCisgICAge0NTX1JFVkVSQl8xNjAwMF9BMCwgICAgICAgICAgICAvKiAxNmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl8xNjAwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzE2MDAwX0EyLAorICAgICBDU19SRVZFUkJfMTYwMDBfQjEsCisgICAgIENTX1JFVkVSQl8xNjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl8xNjAwMF9TQ0FMRX0sCisgICAge0NTX1JFVkVSQl8yMjA1MF9BMCwgICAgICAgICAgICAvKiAyMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl8yMjA1MF9BMSwKKyAgICAgQ1NfUkVWRVJCXzIyMDUwX0EyLAorICAgICBDU19SRVZFUkJfMjIwNTBfQjEsCisgICAgIENTX1JFVkVSQl8yMjA1MF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl8yMjA1MF9TQ0FMRX0sCisgICAge0NTX1JFVkVSQl8yNDAwMF9BMCwgICAgICAgICAgICAvKiAyNGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl8yNDAwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzI0MDAwX0EyLAorICAgICBDU19SRVZFUkJfMjQwMDBfQjEsCisgICAgIENTX1JFVkVSQl8yNDAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl8yNDAwMF9TQ0FMRX0sCisgICAge0NTX1JFVkVSQl8zMjAwMF9BMCwgICAgICAgICAgICAvKiAzMmtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl8zMjAwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzMyMDAwX0EyLAorICAgICBDU19SRVZFUkJfMzIwMDBfQjEsCisgICAgIENTX1JFVkVSQl8zMjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl8zMjAwMF9TQ0FMRX0sCisgICAge0NTX1JFVkVSQl80NDEwMF9BMCwgICAgICAgICAgICAvKiA0NGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl80NDEwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzQ0MTAwX0EyLAorICAgICBDU19SRVZFUkJfNDQxMDBfQjEsCisgICAgIENTX1JFVkVSQl80NDEwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl80NDEwMF9TQ0FMRX0sCisgICAge0NTX1JFVkVSQl80ODAwMF9BMCwgICAgICAgICAgICAvKiA0OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl80ODAwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzQ4MDAwX0EyLAorICAgICBDU19SRVZFUkJfNDgwMDBfQjEsCisgICAgIENTX1JFVkVSQl80ODAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl80ODAwMF9TQ0FMRX0KKyAgICAsCisgICAge0NTX1JFVkVSQl84ODIwMF9BMCwgICAgICAgICAgICAvKiA4OGtTL3MgY29lZmZpY2llbnRzICovCisgICAgIENTX1JFVkVSQl84ODIwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzg4MjAwX0EyLAorICAgICBDU19SRVZFUkJfODgyMDBfQjEsCisgICAgIENTX1JFVkVSQl84ODIwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYpQ1NfUkVWRVJCXzg4MjAwX1NDQUxFfSwKKyAgICB7Q1NfUkVWRVJCXzk2MDAwX0EwLCAgICAgICAgICAgIC8qIDk2a1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfUkVWRVJCXzk2MDAwX0ExLAorICAgICBDU19SRVZFUkJfOTYwMDBfQTIsCisgICAgIENTX1JFVkVSQl85NjAwMF9CMSwKKyAgICAgQ1NfUkVWRVJCXzk2MDAwX0IyLAorICAgICAoTFZNX1VJTlQxNiApQ1NfUkVWRVJCXzk2MDAwX1NDQUxFfSwKKyAgICB7Q1NfUkVWRVJCXzE3NjQwMF9BMCwgICAgICAgICAgICAvKiAxNzZrUy9zIGNvZWZmaWNpZW50cyAqLworICAgICBDU19SRVZFUkJfMTc2NDAwX0ExLAorICAgICBDU19SRVZFUkJfMTc2NDAwX0EyLAorICAgICBDU19SRVZFUkJfMTc2NDAwX0IxLAorICAgICBDU19SRVZFUkJfMTc2NDAwX0IyLAorICAgICAoTFZNX1VJTlQxNilDU19SRVZFUkJfMTc2NDAwX1NDQUxFfSwKKyAgICAge0NTX1JFVkVSQl8xOTIwMDBfQTAsICAgICAgICAgICAgLyogMTkya1MvcyBjb2VmZmljaWVudHMgKi8KKyAgICAgQ1NfUkVWRVJCXzE5MjAwMF9BMSwKKyAgICAgQ1NfUkVWRVJCXzE5MjAwMF9BMiwKKyAgICAgQ1NfUkVWRVJCXzE5MjAwMF9CMSwKKyAgICAgQ1NfUkVWRVJCXzE5MjAwMF9CMiwKKyAgICAgKExWTV9VSU5UMTYgKUNTX1JFVkVSQl8xOTIwMDBfU0NBTEV9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBCeXBhc3MgbWl4ZXIgY29uc3RhbnQgdGFibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworY29uc3QgR2Fpbl90IExWQ1NfT3V0cHV0R2FpblRhYmxlW10gPSB7CisgICAge0xWQ1NfSEVBRFBIT05FX1NISUZULCAgICAgICAgIC8qIEhlYWRwaG9uZSwgc3RlcmVvIG1vZGUgKi8KKyAgICAgTFZDU19IRUFEUEhPTkVfU0hJRlRMT1NTLAorICAgICBMVkNTX0hFQURQSE9ORV9HQUlOfSwKKyAgICB7TFZDU19FWF9IRUFEUEhPTkVfU0hJRlQsICAgICAgLyogRVggSGVhZHBob25lLCBzdGVyZW8gbW9kZSAqLworICAgICBMVkNTX0VYX0hFQURQSE9ORV9TSElGVExPU1MsCisgICAgIExWQ1NfRVhfSEVBRFBIT05FX0dBSU59LAorICAgIHtMVkNTX0hFQURQSE9ORV9TSElGVCwgICAgICAgICAvKiBIZWFkcGhvbmUsIG1vbm8gbW9kZSAqLworICAgICBMVkNTX0hFQURQSE9ORV9TSElGVExPU1MsCisgICAgIExWQ1NfSEVBRFBIT05FX0dBSU59LAorICAgIHtMVkNTX0VYX0hFQURQSE9ORV9TSElGVCwgICAgICAvKiBFWCBIZWFkcGhvbmUsIG1vbm8gbW9kZSAqLworICAgICBMVkNTX0VYX0hFQURQSE9ORV9TSElGVExPU1MsCisgICAgIExWQ1NfRVhfSEVBRFBIT05FX0dBSU59Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBWb2x1bWUgY29ycmVjdGlvbiB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIENvZWZmaWNpZW50IG9yZGVyOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgQ29tcHJlc3Npb24gMTAwJSBlZmZlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgIENvbXByZXNzaW9uIDAlIGVmZmVjdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICBHYWluIDEwMCUgZWZmZWN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgR2FpbiAwJSBlZmZlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIFRoZSBDb21wcmVzc2lvbiBnYWluIGlzIHJlcHJlc2VudGVkIGJ5IGEgUTEuMTUgbnVtYmVyIHRvIGdpdmUgYSByYW5nZSBvZiAwZEIgICAgKi8KKy8qICB0byArNmRCLCBFLmcuOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAwICAgICAgIGlzIDBkQiBjb21wcmVzc2lvbiAobm8gZWZmZWN0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgNTQ2MSAgICBpcyAxZEIgY29tcHJlc3Npb24gZ2FpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIDEwOTIzICAgaXMgMmRCIGNvbXByZXNzaW9uIGdhaW4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAzMjc2NyAgIGlzIDZkQiBjb21wcmVzc2lvbiBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBUaGUgR2FpbiBpcyByZXByZXNlbnRlZCBhcyBhIFEzLjEzIG51bWJlciB0byBnaXZlIGEgcmFuZ2Ugb2YgKzggdG8gLWluZmluaXR5ICAgICovCisvKiAgRS5nLjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgMCAgICAgICBpcyAtaW5maW5pdHkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgIDMyNzY3ICAgaXMgKzE4ZEIgKHg4KSBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICA0MDk2ICAgIGlzIDBkQiBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgMTAyNCAgICBpcyAtMTJkQiBnYWluICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworY29uc3QgTFZDU19Wb2xDb3JyZWN0X3QgTFZDU19Wb2xDb3JyZWN0VGFibGVbXSA9IHsKKyAgICB7MC40MzMzNjJmLCAgICAgICAgICAvKiBIZWFkcGhvbmUsIHN0ZXJlbyBtb2RlICovCisgICAgIDAuMDAwMDAwZiwKKyAgICAgMS4wMDAwMjRmLAorICAgICAxLjQxMjY0MGZ9LAorICAgIHswLjQzMzM2MmYsICAgICAgICAgIC8qIEVYIEhlYWRwaG9uZSwgc3RlcmVvIG1vZGUgKi8KKyAgICAgMC4wMDAwMDBmLAorICAgICAxLjAwMDAyNGYsCisgICAgIDEuNDEyNjQwZn0sCisgICAgezEuMDAwMDAwZiwgICAgICAgICAvKiBIZWFkcGhvbmUsIG1vbm8gbW9kZSAqLworICAgICAwLjAwMDAwMGYsCisgICAgIDEuMDAwMDI0ZiwKKyAgICAgMS40MTI2NDBmfSwKKyAgICB7MS4wMDAwMDBmLCAgICAgICAgIC8qIEVYIEhlYWRwaG9uZSwgbW9ubyBtb2RlICovCisgICAgIDAuMDAwMDAwZiwKKyAgICAgMS4wMDAwMjRmLAorICAgICAxLjQxMjY0MGZ9Cit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBNaXhlciB0aW1lIGNvbnN0YW50cywgMTAwbXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczgwMDAgICAgICAzMjU4MCAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NDI2MjY5NSAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczExMDI1ICAgICAzMjYzMiAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NTg0OTYwOSAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczEyMDAwICAgICAzMjY0MyAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NjE4NTMwMyAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczE2MDAwICAgICAzMjY3NCAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzEzMTM0OCAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczIyMDUwICAgICAzMjcwMCAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5NzkyNDgwNSAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczI0MDAwICAgICAzMjcwNSAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODA3NzM5MyAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczMyMDAwICAgICAzMjcyMSAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODU2NTY3NCAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczQ0MTAwICAgICAzMjczNCAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5ODk2MjQwMiAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczQ4MDAwICAgICAzMjczNyAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTA1Mzk1NSAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19Gczg4MjAwICAgICAzMjc1MSAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTQ4MTA2NiAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19Gczk2MDAwICAgICAzMjc1MSAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTUxMTcwMyAqLyAgIC8qIFRvZG8gQCBuZWVkIHRvIHJlIGNoZWNrIHRoaXMgdmFsdWUqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczE3NjQwMCAgICAzMjc1OSAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTc0MDQ5OSAqLworI2RlZmluZSBMVkNTX1ZPTF9UQ19GczE5MjAwMCAgICAzMjc2MyAgICAgICAvKiBGbG9hdGluZyBwb2ludCB2YWx1ZSAwLjk5OTg3NzkyNSAqLyAgLyogVG9kbyBAIG5lZWQgdG8gcmUgY2hlY2sgdGhpcyB2YWx1ZSovCisKK2NvbnN0IExWTV9JTlQxNiBMVkNTX1ZvbHVtZVRDVGFibGVbMTNdID0ge0xWQ1NfVk9MX1RDX0ZzODAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTEwMjUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczEyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMxNjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMjIwNTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnMzMjAwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzNDQxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFZDU19WT0xfVENfRnM4ODIwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzOTYwMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVkNTX1ZPTF9UQ19GczE3NjQwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExWQ1NfVk9MX1RDX0ZzMTkyMDAwCit9OworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICBTYW1wbGUgcmF0ZSB0YWJsZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KK2NvbnN0IExWTV9JTlQzMiAgIExWQ1NfU2FtcGxlUmF0ZVRhYmxlWzEzXSA9IHs4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMDI1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIyMDUwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDI0MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMyMDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ0MTAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDQ4MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDg4MjAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDk2MDAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDE3NjQwMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxOTIwMDAKK307CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvc3JjL0xWQ1NfVGFibGVzLmgKaW5kZXggM2Y2YzRjOC4uNTQ5MDY5OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYy9MVkNTX1RhYmxlcy5oCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9TdGVyZW9XaWRlbmluZy9zcmMvTFZDU19UYWJsZXMuaApAQCAtMTgsMTAgKzE4LDYgQEAKICNpZm5kZWYgX19MVkNTX1RBQkxFU19IX18KICNkZWZpbmUgX19MVkNTX1RBQkxFU19IX18KIAotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBJbmNsdWRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCkBAIC0xMDQsMTUgKzEwMCwxMyBAQAogZXh0ZXJuIGNvbnN0IExWQ1NfVm9sQ29ycmVjdF90IExWQ1NfVm9sQ29ycmVjdFRhYmxlW107CiBleHRlcm4gY29uc3QgTFZNX0lOVDE2IExWQ1NfVm9sdW1lVENUYWJsZVtdOwogCi0KIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCiAvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogLyogIFNhbXBsZSByYXRlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogCi1leHRlcm4gTFZNX0lOVDMyICAgICAgICAgICAgICAgIExWQ1NfU2FtcGxlUmF0ZVRhYmxlW107Ci0KK2V4dGVybiBjb25zdCBMVk1fSU5UMzIgICAgICAgICAgTFZDU19TYW1wbGVSYXRlVGFibGVbXTsKIAogLypTcGVha2VyIGNvZWZmaWVudCB0YWJsZXMqLwogZXh0ZXJuIExWTV9VSU5UMTYgICAgICAgICAgICAgICBMVkNTX01TX1NtYWxsX1NFTWlkZGxlR2FpblRhYmxlW107CkBAIC0xNDIsMTEgKzEzNiw1IEBACiBleHRlcm4gTFZDU19Wb2xDb3JyZWN0X3QgICAgICAgIExWQ1NfTVNfTGFyZ2VfVm9sQ29ycmVjdFRhYmxlW107CiBleHRlcm4gTFZNX1VJTlQxNiAgICAgICAgICAgICAgIExWQ1NfTVNfTGFyZ2VfUmV2ZXJiR2FpblRhYmxlW107CiAKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0KLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCiAjZW5kaWYgLyogX19MVkNTX1RBQkxFU19IX18gKi8KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc0YzI0NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1NyBAQAorLy8gQnVpbGQgdGhlIHVuaXQgdGVzdHMgZm9yIGVmZmVjdHMKKworY2NfdGVzdCB7CisgICAgbmFtZTogImx2bXRlc3QiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiBmYWxzZSwKKyAgICBwcm9wcmlldGFyeTogdHJ1ZSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9saWIiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQmFzcy9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvQnVuZGxlL3NyYyIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9Db21tb24vc3JjIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL0VxL2xpYiIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL2xpYi9FcS9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9saWIiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3BlY3RydW1BbmFseXplci9zcmMiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJlZmZlY3RzL2x2bS9saWIvU3RlcmVvV2lkZW5pbmcvbGliIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGliZWZmZWN0cy9sdm0vbGliL1N0ZXJlb1dpZGVuaW5nL3NyYyIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZWZmZWN0cyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtdXNpY2J1bmRsZSIsCisgICAgXSwKKworICAgIHNyY3M6IFsibHZtdGVzdC5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURTVVBQT1JUX01DIiwKKworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAic25yIiwKKyAgICBob3N0X3N1cHBvcnRlZDogZmFsc2UsCisKKyAgICBzcmNzOiBbInNuci5jcHAiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvYnVpbGRfYW5kX3J1bl9hbGxfdW5pdF90ZXN0cy5zaCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTk3YWNjOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2J1aWxkX2FuZF9ydW5fYWxsX3VuaXRfdGVzdHMuc2gKQEAgLTAsMCArMSwxMzIgQEAKKyMhL2Jpbi9iYXNoCisjCisjIFJ1biB0ZXN0cyBpbiB0aGlzIGRpcmVjdG9yeS4KKyMKKworaWYgWyAteiAiJEFORFJPSURfQlVJTERfVE9QIiBdOyB0aGVuCisgICAgZWNobyAiQW5kcm9pZCBidWlsZCBlbnZpcm9ubWVudCBub3Qgc2V0IgorICAgIGV4aXQgLTEKK2ZpCisKKyMgZW5zdXJlIHdlIGhhdmUgbW0KKy4gJEFORFJPSURfQlVJTERfVE9QL2J1aWxkL2VudnNldHVwLnNoCisKK21tIC1qCisKK2VjaG8gIndhaXRpbmcgZm9yIGRldmljZSIKKworYWRiIHJvb3QgJiYgYWRiIHdhaXQtZm9yLWRldmljZSByZW1vdW50CisKKyMgbG9jYXRpb24gb2YgdGVzdCBmaWxlcwordGVzdGRpcj0iL2RhdGEvbG9jYWwvdG1wL2x2bVRlc3QiCisKK2VjaG8gIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCitlY2hvICJ0ZXN0aW5nIGx2bSIKK2FkYiBzaGVsbCBta2RpciAtcCAkdGVzdGRpcgorYWRiIHB1c2ggJEFORFJPSURfQlVJTERfVE9QL2N0cy90ZXN0cy90ZXN0cy9tZWRpYS9yZXMvcmF3L3NpbmVzd2VlcHJhdy5yYXcgJHRlc3RkaXIKK2FkYiBwdXNoICRPVVQvdGVzdGNhc2VzL3Nuci9hcm02NC9zbnIgJHRlc3RkaXIKKworRV9WQUw9MQoraWYgWyAteiAiJDEiIF0KK3RoZW4KKyAgICBjbWRzPSgiYWRiIHB1c2ggJE9VVC90ZXN0Y2FzZXMvbHZtdGVzdC9hcm02NC9sdm10ZXN0ICR0ZXN0ZGlyIgorICAgICAgICAgICJhZGIgcHVzaCAkT1VUL3Rlc3RjYXNlcy9sdm10ZXN0L2FybS9sdm10ZXN0ICR0ZXN0ZGlyIgorICAgICAgICAgKQorZWxpZiBbICIkMSIgPT0gIjMyIiBdCit0aGVuCisgICAgY21kcz0iYWRiIHB1c2ggJE9VVC90ZXN0Y2FzZXMvbHZtdGVzdC9hcm0vbHZtdGVzdCAkdGVzdGRpciIKK2VsaWYgWyAiJDEiID09ICI2NCIgXQordGhlbgorICAgIGNtZHM9ImFkYiBwdXNoICRPVVQvdGVzdGNhc2VzL2x2bXRlc3QvYXJtNjQvbHZtdGVzdCAkdGVzdGRpciIKK2Vsc2UKKyAgICBlY2hvICIiCisgICAgZWNobyAiSW52YWxpZCBcInZhbFwiIgorICAgIGVjaG8gIlVzYWdlOiIKKyAgICBlY2hvICIgICAgICAiJDAiIFt2YWxdIgorICAgIGVjaG8gIiAgICAgIHdoZXJlLCB2YWwgY2FuIGJlIGVpdGhlciAzMiBvciA2NC4iCisgICAgZWNobyAiIgorICAgIGVjaG8gIiAgICAgIElmIHZhbCBpcyBub3Qgc3BlY2lmaWVkIHRoZW4gYm90aCAzMiBiaXQgYW5kIDY0IGJpdCBiaW5hcmllcyIKKyAgICBlY2hvICIgICAgICBhcmUgdGVzdGVkLiIKKyAgICBleGl0ICRFX1ZBTAorZmkKKworZmxhZ3NfYXJyPSgKKyAgICAiLWNzRSIKKyAgICAiLWVxRSIKKyAgICAiLXRFIgorICAgICItY3NFIC10RSAtZXFFIgorICAgICItYkUgLU0iCisgICAgIi1jc0UgLXRFIgorICAgICItY3NFIC1lcUUiICItdEUgLWVxRSIKKyAgICAiLWNzRSAtdEUgLWJFIC1NIC1lcUUiCisgICAgIi10RSAtZXFFIC12Y0JhbDo5NiAtTSIKKyAgICAiLXRFIC1lcUUgLXZjQmFsOi05NiAtTSIKKyAgICAiLXRFIC1lcUUgLXZjQmFsOjAgLU0iCisgICAgIi10RSAtZXFFIC1iRSAtdmNCYWw6MzAgLU0iCispCisKK2ZzX2Fycj0oCisgICAgODAwMAorICAgIDExMDI1CisgICAgMTIwMDAKKyAgICAxNjAwMAorICAgIDIyMDUwCisgICAgMjQwMDAKKyAgICAzMjAwMAorICAgIDQ0MTAwCisgICAgNDgwMDAKKyAgICA4ODIwMAorICAgIDk2MDAwCisgICAgMTc2NDAwCisgICAgMTkyMDAwCispCisKKyMgcnVuIG11bHRpY2hhbm5lbCBlZmZlY3RzIGF0IGRpZmZlcmVudCBjb25maWdzLCBzYXZpbmcgb25seSB0aGUgc3RlcmVvIGNoYW5uZWwKKyMgcGFpci4KK2Vycm9yX2NvdW50PTAKK2ZvciBjbWQgaW4gIiR7Y21kc1tAXX0iCitkbworICAgICRjbWQKKyAgICBmb3IgZmxhZ3MgaW4gIiR7ZmxhZ3NfYXJyW0BdfSIKKyAgICBkbworICAgICAgICBmb3IgZnMgaW4gJHtmc19hcnJbKl19CisgICAgICAgIGRvCisgICAgICAgICAgICBmb3IgY2hNYXNrIGluIHswLi4yMn0KKyAgICAgICAgICAgIGRvCisgICAgICAgICAgICAgICAgYWRiIHNoZWxsICR0ZXN0ZGlyL2x2bXRlc3QgLWk6JHRlc3RkaXIvc2luZXN3ZWVwcmF3LnJhdyBcCisgICAgICAgICAgICAgICAgICAgIC1vOiR0ZXN0ZGlyL3NpbmVzd2VlcF8kKChjaE1hc2spKV8kKChmcykpLnJhdyAtY2hNYXNrOiRjaE1hc2sgLWZzOiRmcyAkZmxhZ3MKKworICAgICAgICAgICAgICAgIHNoZWxsX3JldD0kPworICAgICAgICAgICAgICAgIGlmIFsgJHNoZWxsX3JldCAtbmUgMCBdOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGVjaG8gImVycm9yOiAkc2hlbGxfcmV0IgorICAgICAgICAgICAgICAgICAgICAoKCsrZXJyb3JfY291bnQpKQorICAgICAgICAgICAgICAgIGZpCisKKworICAgICAgICAgICAgICAgICMgdHdvIGNoYW5uZWwgZmlsZXMgc2hvdWxkIGJlIGlkZW50aWNhbCB0byBoaWdoZXIgY2hhbm5lbAorICAgICAgICAgICAgICAgICMgY29tcHV0YXRpb24gKGZpcnN0IDIgY2hhbm5lbHMpLgorICAgICAgICAgICAgICAgICMgRG8gbm90IGNvbXBhcmUgY2FzZXMgd2hlcmUgLWJFIGlzIGluIGZsYWdzIChkdWUgdG8gbW9ubyBjb21wdXRhdGlvbikKKyAgICAgICAgICAgICAgICBpZiBbWyAkZmxhZ3MgIT0gKiItYkUiKiBdXSAmJiBbWyAiJGNoTWFzayIgLWd0IDEgXV0KKyAgICAgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgICAgIGFkYiBzaGVsbCBjbXAgJHRlc3RkaXIvc2luZXN3ZWVwXzFfJCgoZnMpKS5yYXcgXAorICAgICAgICAgICAgICAgICAgICAgICAgJHRlc3RkaXIvc2luZXN3ZWVwXyQoKGNoTWFzaykpXyQoKGZzKSkucmF3CisgICAgICAgICAgICAgICAgZWxpZiBbWyAkZmxhZ3MgPT0gKiItYkUiKiBdXSAmJiBbWyAiJGNoTWFzayIgLWd0IDEgXV0KKyAgICAgICAgICAgICAgICB0aGVuCisgICAgICAgICAgICAgICAgICAgIGFkYiBzaGVsbCAkdGVzdGRpci9zbnIgJHRlc3RkaXIvc2luZXN3ZWVwXzFfJCgoZnMpKS5yYXcgXAorICAgICAgICAgICAgICAgICAgICAgICAgJHRlc3RkaXIvc2luZXN3ZWVwXyQoKGNoTWFzaykpXyQoKGZzKSkucmF3IC10aHI6OTAuMzA4OTk4CisgICAgICAgICAgICAgICAgZmkKKworICAgICAgICAgICAgICAgICMgYm90aCBjbXAgYW5kIHNuciByZXR1cm4gRVhJVF9GQUlMVVJFIG9uIG1pc21hdGNoLgorICAgICAgICAgICAgICAgIHNoZWxsX3JldD0kPworICAgICAgICAgICAgICAgIGlmIFsgJHNoZWxsX3JldCAtbmUgMCBdOyB0aGVuCisgICAgICAgICAgICAgICAgICAgIGVjaG8gImVycm9yOiAkc2hlbGxfcmV0IgorICAgICAgICAgICAgICAgICAgICAoKCsrZXJyb3JfY291bnQpKQorICAgICAgICAgICAgICAgIGZpCisgICAgICAgICAgICBkb25lCisgICAgICAgIGRvbmUKKyAgICBkb25lCitkb25lCisKK2FkYiBzaGVsbCBybSAtciAkdGVzdGRpcgorZWNobyAiJGVycm9yX2NvdW50IGVycm9ycyIKK2V4aXQgJGVycm9yX2NvdW50CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9sdm10ZXN0LmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3Rlc3RzL2x2bXRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YWNlNmMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9sdm10ZXN0LmNwcApAQCAtMCwwICsxLDgyNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvY2hhbm5lbHMuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisjaW5jbHVkZSA8bG9nL2xvZy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorCisjaW5jbHVkZSAiRWZmZWN0QnVuZGxlLmgiCisjaW5jbHVkZSAiTFZNX1ByaXZhdGUuaCIKKworI2lmZGVmIFZFUllfVkVSWV9WRVJCT1NFX0xPR0dJTkcKKyNkZWZpbmUgQUxPR1ZWIEFMT0dWCisjZWxzZQorI2RlZmluZSBBTE9HVlYoYS4uLikgXAorICBkbyB7ICAgICAgICAgICAgICAgXAorICB9IHdoaWxlIChmYWxzZSkKKyNlbmRpZgorCisjZGVmaW5lIENIRUNLX0FSRyhjb25kKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIShjb25kKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBTE9HRSgiXHRMVk1fRVJST1IgOiBJbnZhbGlkIGFyZ3VtZW50OiAiICNjb25kKTsgXAorICAgICAgcmV0dXJuIC1FSU5WQUw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFwKK30KKworI2RlZmluZSBMVk1fRVJST1JfQ0hFQ0soTHZtU3RhdHVzLCBjYWxsaW5nRnVuYywgY2FsbGVkRnVuYykgICAgIFwKKyAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9OVUxMQUREUkVTUykgeyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIm51bGwgcG9pbnRlciByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgICAgICAgICAgXAorICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9BTElHTk1FTlRFUlJPUikgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgImJhZCBhbGlnbm1lbnQgcmV0dXJuZWQgYnkgJXMgaW4gJXNcblxuXG5cbiIsICAgICAgICAgXAorICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9JTlZBTElETlVNU0FNUExFUykgeyAgICAgICAgICAgICAgICAgXAorICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgImJhZCBudW1iZXIgb2Ygc2FtcGxlcyByZXR1cm5lZCBieSAlcyBpbiAlc1xuXG5cblxuIiwgXAorICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKChMdm1TdGF0dXMpID09IExWTV9PVVRPRlJBTkdFKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgQUxPR0UoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAiXHRMVk1fRVJST1IgOiBQYXJhbWV0ZXIgZXJyb3IgLSAiICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgIm91dCBvZiByYW5nZSByZXR1cm5lZCBieSAlcyBpbiAlc1xuIiwgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNhbGxpbmdGdW5jLCBjYWxsZWRGdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworc3RydWN0IGx2bUNvbmZpZ1BhcmFtc190IHsKKyAgaW50ICAgICAgICAgICAgICBzYW1wbGluZ0ZyZXEgICAgPSA0NDEwMDsKKyAgaW50ICAgICAgICAgICAgICBuckNoYW5uZWxzICAgICAgPSAyOworICBpbnQgICAgICAgICAgICAgIGNoTWFzayAgICAgICAgICA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgaW50ICAgICAgICAgICAgICB2Y0JhbCAgICAgICAgICAgPSAwOworICBpbnQgICAgICAgICAgICAgIGZDaGFubmVscyAgICAgICA9IDI7CisgIGJvb2wgICAgICAgICAgICAgbW9ub01vZGUgICAgICAgID0gZmFsc2U7CisgIGludCAgICAgICAgICAgICAgYmFzc0VmZmVjdExldmVsID0gMDsKKyAgaW50ICAgICAgICAgICAgICBlcVByZXNldExldmVsICAgPSAwOworICBpbnQgICAgICAgICAgICAgIGZyYW1lTGVuZ3RoICAgICA9IDI1NjsKKyAgTFZNX0JFX01vZGVfZW4gICBiYXNzRW5hYmxlICAgICAgPSBMVk1fQkVfT0ZGOworICBMVk1fVEVfTW9kZV9lbiAgIHRyZWJsZUVuYWJsZSAgICA9IExWTV9URV9PRkY7CisgIExWTV9FUU5CX01vZGVfZW4gZXFFbmFibGUgICAgICAgID0gTFZNX0VRTkJfT0ZGOworICBMVk1fTW9kZV9lbiAgICAgIGNzRW5hYmxlICAgICAgICA9IExWTV9NT0RFX09GRjsKK307CisKK2NvbnN0ZXhwciBhdWRpb19jaGFubmVsX21hc2tfdCBsdm1Db25maWdDaE1hc2tbXSA9IHsKKyAgICBBVURJT19DSEFOTkVMX09VVF9NT05PLAorICAgIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywKKyAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDBQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCwKKyAgICBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0ssCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFLAorICAgIEFVRElPX0NIQU5ORUxfT1VUX1NVUlJPVU5ELAorICAgICgxIDw8IDQpIC0gMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDBQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEsCisgICAgKDEgPDwgNSkgLSAxLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDFQT0lOVDIsCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0ssCisgICAgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFLAorICAgICgxIDw8IDYpIC0gMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF82UE9JTlQxLAorICAgICgxIDw8IDcpIC0gMSwKKyAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyLAorICAgIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEsCisgICAgKDEgPDwgOCkgLSAxLAorfTsKKworCit2b2lkIHByaW50VXNhZ2UoKSB7CisgIHByaW50ZigiXG5Vc2FnZTogIik7CisgIHByaW50ZigiXG4gICAgIDxleGVjdXRhYmxlPiAtaTo8aW5wdXRfZmlsZT4gLW86PG91dF9maWxlPiBbb3B0aW9uc11cbiIpOworICBwcmludGYoIlxud2hlcmUsIFxuICAgICA8aW5wdXRmaWxlPiAgaXMgdGhlIGlucHV0IGZpbGUgbmFtZSIpOworICBwcmludGYoIlxuICAgICAgICAgICAgICAgICAgb24gd2hpY2ggTFZNIGVmZmVjdHMgYXJlIGFwcGxpZWQiKTsKKyAgcHJpbnRmKCJcbiAgICAgPG91dHB1dGZpbGU+IHByb2Nlc3NlZCBvdXRwdXQgZmlsZSIpOworICBwcmludGYoIlxuICAgICBhbmQgb3B0aW9ucyBhcmUgbWVudGlvbmVkIGJlbG93Iik7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgLWhlbHAgKG9yKSAtaCIpOworICBwcmludGYoIlxuICAgICAgICAgICBQcmludHMgdGhpcyB1c2FnZSBpbmZvcm1hdGlvbiIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1jaE1hc2s6PGNoYW5uZWxfbWFzaz5cbiIpOworICBwcmludGYoIlxuICAgICAgICAgMCAgLSBBVURJT19DSEFOTkVMX09VVF9NT05PIik7CisgIHByaW50ZigiXG4gICAgICAgICAxICAtIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIpOworICBwcmludGYoIlxuICAgICAgICAgMiAgLSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxIik7CisgIHByaW50ZigiXG4gICAgICAgICAzICAtIEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDBQT0lOVDIiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDQgIC0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCIpOworICBwcmludGYoIlxuICAgICAgICAgNSAgLSBBVURJT19DSEFOTkVMX09VVF9RVUFEX0JBQ0siKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDYgIC0gQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFIik7CisgIHByaW50ZigiXG4gICAgICAgICA3ICAtIEFVRElPX0NIQU5ORUxfT1VUX1NVUlJPVU5EIik7CisgIHByaW50ZigiXG4gICAgICAgICA4ICAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDQgY2g6ICgxIDw8IDQpIC0gMSIpOworICBwcmludGYoIlxuICAgICAgICAgOSAgLSBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyIik7CisgIHByaW50ZigiXG4gICAgICAgICAxMCAtIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDBQT0lOVDIiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDExIC0gQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDEyIC0gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggbWFzayBmb3IgNSBjaDogKDEgPDwgNSkgLSAxIik7CisgIHByaW50ZigiXG4gICAgICAgICAxMyAtIEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDFQT0lOVDIiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDE0IC0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSIpOworICBwcmludGYoIlxuICAgICAgICAgMTUgLSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0siKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDE2IC0gQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFIik7CisgIHByaW50ZigiXG4gICAgICAgICAxNyAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDYgY2g6ICgxIDw8IDYpIC0gMSIpOworICBwcmludGYoIlxuICAgICAgICAgMTggLSBBVURJT19DSEFOTkVMX09VVF82UE9JTlQxIik7CisgIHByaW50ZigiXG4gICAgICAgICAxOSAtIGNhbm9uaWNhbCBjaGFubmVsIGluZGV4IG1hc2sgZm9yIDcgY2g6ICgxIDw8IDcpIC0gMSIpOworICBwcmludGYoIlxuICAgICAgICAgMjAgLSBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyIik7CisgIHByaW50ZigiXG4gICAgICAgICAyMSAtIEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgIDIyIC0gY2Fub25pY2FsIGNoYW5uZWwgaW5kZXggbWFzayBmb3IgOCBjaDogKDEgPDwgOCkgLSAxIik7CisgIHByaW50ZigiXG4gICAgICAgICBkZWZhdWx0IDAiKTsKKyAgcHJpbnRmKCJcbiAgICAgLXZjQmFsOjxMZWZ0IFJpZ2h0IEJhbGFuY2UgY29udHJvbCBpbiBkQiBbLTk2IHRvIDk2IGRCXT4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgIC12ZSB2YWx1ZXMgcmVkdWNlIFJpZ2h0IGNoYW5uZWwgd2hpbGUgK3ZlIHZhbHVlIHJlZHVjZXMgTGVmdCBjaGFubmVsIik7CisgIHByaW50ZigiXG4gICAgICAgICAgICAgICAgIGRlZmF1bHQgMCIpOworICBwcmludGYoIlxuICAgICAtZmNoOjxmaWxlX2NoYW5uZWxzPiAoMSB0aHJvdWdoIDgpXG5cbiIpOworICBwcmludGYoIlxuICAgICAtTSIpOworICBwcmludGYoIlxuICAgICAgICAgICBNb25vIG1vZGUgKGZvcmNlIGFsbCBpbnB1dCBhdWRpbyBjaGFubmVscyB0byBiZSBpZGVudGljYWwpIik7CisgIHByaW50ZigiXG4gICAgIC1iYXNzbHZsOjxlZmZlY3RfbGV2ZWw+Iik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEEgdmFsdWUgdGhhdCByYW5nZXMgYmV0d2VlbiAlZCAtICVkIGRlZmF1bHQgMCIsIExWTV9CRV9NSU5fRUZGRUNUTEVWRUwsCisgICAgTFZNX0JFX01BWF9FRkZFQ1RMRVZFTCk7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgLWVxUHJlc2V0OjxwcmVzZXQgVmFsdWU+Iik7CisgIGNvbnN0IHNpemVfdCBudW1QcmVzZXRMdmxzICA9IHN0ZDo6c2l6ZShnRXF1YWxpemVyUHJlc2V0cyk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtUHJlc2V0THZsczsgKytpKSB7CisgICAgcHJpbnRmKCJcbiAgICAgICAgICAgJXp1IC0gJXMiLCBpLCBnRXF1YWxpemVyUHJlc2V0c1tpXS5uYW1lKTsKKyAgfQorICBwcmludGYoIlxuICAgICAgICAgICBkZWZhdWx0IC0gMCIpOworICBwcmludGYoIlxuICAgICAtYkUgIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBEeW5hbWljIEJhc3MgRW5oYW5jZW1lbnQiKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtdEUgIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBUcmVibGUgQm9vc3QiKTsKKyAgcHJpbnRmKCJcbiIpOworICBwcmludGYoIlxuICAgICAtY3NFICIpOworICBwcmludGYoIlxuICAgICAgICAgICBFbmFibGUgQ29uY2VydCBTdXJyb3VuZCIpOworICBwcmludGYoIlxuIik7CisgIHByaW50ZigiXG4gICAgIC1lcUUgIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIEVuYWJsZSBFcXVhbGl6ZXIiKTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMdm1FZmZlY3RfZnJlZSgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IEZyZWUgYWxsIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIEJ1bmRsZS4KKy8vCisvLyBJbnB1dHM6CisvLyAgcENvbnRleHQ6ICAgZWZmZWN0IGVuZ2luZSBjb250ZXh0CisvLworLy8gT3V0cHV0czoKKy8vCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZCBMdm1FZmZlY3RfZnJlZShzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQpIHsKKyAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKyAgTFZNX01lbVRhYl90IE1lbVRhYjsKKworICAvKiBGcmVlIHRoZSBhbGdvcml0aG0gbWVtb3J5ICovCisgIEx2bVN0YXR1cyA9IExWTV9HZXRNZW1vcnlUYWJsZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZNZW1UYWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMVk1fTlVMTCk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRNZW1vcnlUYWJsZSIsICJMdm1FZmZlY3RfZnJlZSIpCisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykgeworICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCkgeworICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzICE9IE5VTEwpIHsKKyAgICAgICAgQUxPR1YoIlx0THZtRWZmZWN0X2ZyZWUgLSBTVEFSVCBmcmVlaW5nICUiIFBSSXUzMgorICAgICAgICAgICAgICAiIGJ5dGVzIGZvciByZWdpb24gJXUgYXQgJXBcbiIsCisgICAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworCisgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworCisgICAgICAgIEFMT0dWKCJcdEx2bUVmZmVjdF9mcmVlIC0gRU5EICAgZnJlZWluZyAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKAorICAgICAgICAgICAgIlx0TFZNX0VSUk9SIDogTHZtRWZmZWN0X2ZyZWUgLSB0cnlpbmcgdG8gZnJlZSB3aXRoIE5VTEwgcG9pbnRlciAiCisgICAgICAgICAgICAiJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBhdCAlcCBFUlJPUlxuIiwKKyAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSwgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgfQorfSAvKiBlbmQgTHZtRWZmZWN0X2ZyZWUgKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMdm1CdW5kbGVfaW5pdCgpCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFB1cnBvc2U6IEluaXRpYWxpemUgZW5naW5lIHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9uLCBjcmVhdGVzIGluc3RhbmNlCisvLyB3aXRoIGFsbCBlZmZlY3RzIGRpc2FibGVkLgorLy8KKy8vIElucHV0czoKKy8vICBwQ29udGV4dDogICBlZmZlY3QgZW5naW5lIGNvbnRleHQKKy8vCisvLyBPdXRwdXRzOgorLy8KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitpbnQgTHZtQnVuZGxlX2luaXQoc3RydWN0IEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBMVk1fQ29udHJvbFBhcmFtc190ICpwYXJhbXMpIHsKKyAgQUxPR1YoIlx0THZtQnVuZGxlX2luaXQgc3RhcnQiKTsKKworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19SRUFEOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmZvcm1hdCA9IEVGRkVDVF9CVUZGRVJfRk9STUFUOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICBwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmJ1ZmZlclByb3ZpZGVyLmdldEJ1ZmZlciA9IE5VTEw7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CisgIHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5jaGFubmVscyA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7CisgIHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOworICBwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIuY29va2llID0gTlVMTDsKKyAgcENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOworCisgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgIT0gTlVMTCkgeworICAgIEFMT0dWKAorICAgICAgICAiXHRMdm1CdW5kbGVfaW5pdCBwQ29udGV4dC0+cEJhc3NCb29zdCAhPSBOVUxMICIKKyAgICAgICAgIi0+IENhbGxpbmcgcENvbnRleHQtPnBCYXNzQm9vc3QtPmZyZWUoKSIpOworCisgICAgTHZtRWZmZWN0X2ZyZWUocENvbnRleHQpOworCisgICAgQUxPR1YoCisgICAgICAgICJcdEx2bUJ1bmRsZV9pbml0IHBDb250ZXh0LT5wQmFzc0Jvb3N0ICE9IE5VTEwgIgorICAgICAgICAiLT4gQ2FsbGVkIHBDb250ZXh0LT5wQmFzc0Jvb3N0LT5mcmVlKCkiKTsKKyAgfQorCisgIExWTV9SZXR1cm5TdGF0dXNfZW4gTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7IC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCisgIExWTV9JbnN0UGFyYW1zX3QgSW5zdFBhcmFtczsgICAgICAgICAgICAgICAgIC8qIEluc3RhbmNlIHBhcmFtZXRlcnMgKi8KKyAgTFZNX0VRTkJfQmFuZERlZl90IEJhbmREZWZzW01BWF9OVU1fQkFORFNdOyAgLyogRXF1YWxpc2VyIGJhbmQgZGVmaW5pdGlvbnMgKi8KKyAgTFZNX0hlYWRyb29tUGFyYW1zX3QgSGVhZHJvb21QYXJhbXM7ICAgICAgICAgLyogSGVhZHJvb20gcGFyYW1ldGVycyAqLworICBMVk1fSGVhZHJvb21CYW5kRGVmX3QgSGVhZHJvb21CYW5kRGVmW0xWTV9IRUFEUk9PTV9NQVhfTkJBTkRTXTsKKyAgTFZNX01lbVRhYl90IE1lbVRhYjsgLyogTWVtb3J5IGFsbG9jYXRpb24gdGFibGUgKi8KKyAgYm9vbCBiTWFsbG9jRmFpbHVyZSA9IExWTV9GQUxTRTsKKworICAvKiBTZXQgdGhlIGNhcGFiaWxpdGllcyAqLworICBJbnN0UGFyYW1zLkJ1ZmZlck1vZGUgPSBMVk1fVU5NQU5BR0VEX0JVRkZFUlM7CisgIEluc3RQYXJhbXMuTWF4QmxvY2tTaXplID0gTUFYX0NBTExfU0laRTsKKyAgSW5zdFBhcmFtcy5FUU5CX051bUJhbmRzID0gTUFYX05VTV9CQU5EUzsKKyAgSW5zdFBhcmFtcy5QU0FfSW5jbHVkZWQgPSBMVk1fUFNBX09OOworCisgIC8qIEFsbG9jYXRlIG1lbW9yeSwgZm9yY2luZyBhbGlnbm1lbnQgKi8KKyAgTHZtU3RhdHVzID0gTFZNX0dldE1lbW9yeVRhYmxlKExWTV9OVUxMLCAmTWVtVGFiLCAmSW5zdFBhcmFtcyk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRNZW1vcnlUYWJsZSIsICJMdm1CdW5kbGVfaW5pdCIpOworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICBBTE9HVigiXHRDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgTFZNX0dldE1lbW9yeVRhYmxlXG4iKTsKKworICAvKiBBbGxvY2F0ZSBtZW1vcnkgKi8KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBMVk1fTlJfTUVNT1JZX1JFR0lPTlM7IGkrKykgeworICAgIGlmIChNZW1UYWIuUmVnaW9uW2ldLlNpemUgIT0gMCkgeworICAgICAgTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPSBtYWxsb2MoTWVtVGFiLlJlZ2lvbltpXS5TaXplKTsKKworICAgICAgaWYgKE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzID09IExWTV9OVUxMKSB7CisgICAgICAgIEFMT0dFKAorICAgICAgICAgICAgIlx0TFZNX0VSUk9SIDpMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBGYWlsZWQgdG8gYWxsb2NhdGUgIgorICAgICAgICAgICAgIiUiIFBSSXUzMiAiIGJ5dGVzIGZvciByZWdpb24gJXVcbiIsCisgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGkpOworICAgICAgICBiTWFsbG9jRmFpbHVyZSA9IExWTV9UUlVFOworICAgICAgICBicmVhazsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIGFsbG9jYXRlZCAlIiBQUkl1MzIKKyAgICAgICAgICAgICAgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwXG4iLAorICAgICAgICAgICAgICBNZW1UYWIuUmVnaW9uW2ldLlNpemUsIGksIE1lbVRhYi5SZWdpb25baV0ucEJhc2VBZGRyZXNzKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvKiBJZiBvbmUgb3IgbW9yZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbnMgZmFpbGVkIHRvIGFsbG9jYXRlLCBmcmVlIHRoZSByZWdpb25zCisgICAqIHRoYXQgd2VyZQorICAgKiBzdWNjZXNmdWxseSBhbGxvY2F0ZWQgYW5kIHJldHVybiB3aXRoIGFuIGVycm9yCisgICAqLworICBpZiAoYk1hbGxvY0ZhaWx1cmUgPT0gTFZNX1RSVUUpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IExWTV9OUl9NRU1PUllfUkVHSU9OUzsgaSsrKSB7CisgICAgICBpZiAoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MgPT0gTFZNX05VTEwpIHsKKyAgICAgICAgQUxPR0UoCisgICAgICAgICAgICAiXHRMVk1fRVJST1IgOkx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIEZhaWxlZCB0byBhbGxvY2F0ZSAiCisgICAgICAgICAgICAiJSIgUFJJdTMyICIgYnl0ZXMgZm9yIHJlZ2lvbiAldSBOb3QgZnJlZWluZ1xuIiwKKyAgICAgICAgICAgIE1lbVRhYi5SZWdpb25baV0uU2l6ZSwgaSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgKKyAgICAgICAgICAgICJcdExWTV9FUlJPUiA6THZtQnVuZGxlX2luaXQgQ3JlYXRlSW5zdGFuY2UgRmFpbGVkOiBidXQgYWxsb2NhdGVkICIKKyAgICAgICAgICAgICIlIiBQUkl1MzIgIiBieXRlcyBmb3IgcmVnaW9uICV1IGF0ICVwLSBmcmVlXG4iLAorICAgICAgICAgICAgTWVtVGFiLlJlZ2lvbltpXS5TaXplLCBpLCBNZW1UYWIuUmVnaW9uW2ldLnBCYXNlQWRkcmVzcyk7CisgICAgICAgIGZyZWUoTWVtVGFiLlJlZ2lvbltpXS5wQmFzZUFkZHJlc3MpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gLUVJTlZBTDsKKyAgfQorICBBTE9HVigiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBtYWxsb2MnZCBtZW1vcnlcbiIpOworCisgIC8qIEluaXRpYWxpc2UgKi8KKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlID0gTFZNX05VTEw7CisKKyAgLyogSW5pdCBzZXRzIHRoZSBpbnN0YW5jZSBoYW5kbGUgKi8KKyAgTHZtU3RhdHVzID0gTFZNX0dldEluc3RhbmNlSGFuZGxlKCZwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVtVGFiLCAmSW5zdFBhcmFtcyk7CisKKyAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9HZXRJbnN0YW5jZUhhbmRsZSIsICJMdm1CdW5kbGVfaW5pdCIpOworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICBBTE9HVigKKyAgICAgICJcdEx2bUJ1bmRsZV9pbml0IENyZWF0ZUluc3RhbmNlIFN1Y2Nlc2Z1bGx5IGNhbGxlZCAiCisgICAgICAiTFZNX0dldEluc3RhbmNlSGFuZGxlXG4iKTsKKworICAvKiBTZXQgdGhlIGluaXRpYWwgcHJvY2VzcyBwYXJhbWV0ZXJzICovCisgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPk9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PTjsKKyAgcGFyYW1zLT5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworICBwYXJhbXMtPlNvdXJjZUZvcm1hdCA9IExWTV9TVEVSRU87CisgIHBhcmFtcy0+Q2hNYXNrICAgICAgID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICBwYXJhbXMtPlNwZWFrZXJUeXBlID0gTFZNX0hFQURQSE9ORVM7CisKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKKworICAvKiBDb25jZXJ0IFNvdW5kIHBhcmFtZXRlcnMgKi8KKyAgcGFyYW1zLT5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PRkY7CisgIHBhcmFtcy0+VmlydHVhbGl6ZXJUeXBlID0gTFZNX0NPTkNFUlRTT1VORDsKKyAgcGFyYW1zLT5WaXJ0dWFsaXplclJldmVyYkxldmVsID0gMTAwOworICBwYXJhbXMtPkNTX0VmZmVjdExldmVsID0gTFZNX0NTX0VGRkVDVF9OT05FOworCisgIC8qIE4tQmFuZCBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPkVRTkJfT3BlcmF0aW5nTW9kZSA9IExWTV9FUU5CX09OOworICBwYXJhbXMtPkVRTkJfTkJhbmRzID0gRklWRUJBTkRfTlVNQkFORFM7CisgIHBhcmFtcy0+cEVRTkJfQmFuZERlZmluaXRpb24gPSAmQmFuZERlZnNbMF07CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7CisgICAgQmFuZERlZnNbaV0uRnJlcXVlbmN5ID0gRVFOQl81QmFuZFByZXNldHNGcmVxdWVuY2llc1tpXTsKKyAgICBCYW5kRGVmc1tpXS5RRmFjdG9yID0gRVFOQl81QmFuZFByZXNldHNRRmFjdG9yc1tpXTsKKyAgICBCYW5kRGVmc1tpXS5HYWluID0gRVFOQl81QmFuZFNvZnRQcmVzZXRzW2ldOworICB9CisKKyAgLyogVm9sdW1lIENvbnRyb2wgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlZDX0VmZmVjdExldmVsID0gMDsKKyAgcGFyYW1zLT5WQ19CYWxhbmNlID0gMDsKKworICAvKiBUcmVibGUgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlRFX09wZXJhdGluZ01vZGUgPSBMVk1fVEVfT0ZGOworICBwYXJhbXMtPlRFX0VmZmVjdExldmVsID0gMDsKKworICAvKiBQU0EgQ29udHJvbCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+UFNBX0VuYWJsZSA9IExWTV9QU0FfT0ZGOworICBwYXJhbXMtPlBTQV9QZWFrRGVjYXlSYXRlID0gKExWTV9QU0FfRGVjYXlTcGVlZF9lbikwOworCisgIC8qIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPkJFX09wZXJhdGluZ01vZGUgPSBMVk1fQkVfT047CisgIHBhcmFtcy0+QkVfRWZmZWN0TGV2ZWwgPSAwOworICBwYXJhbXMtPkJFX0NlbnRyZUZyZXEgPSBMVk1fQkVfQ0VOVFJFXzkwSHo7CisgIHBhcmFtcy0+QkVfSFBGID0gTFZNX0JFX0hQRl9PTjsKKworICAvKiBQU0EgQ29udHJvbCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+UFNBX0VuYWJsZSA9IExWTV9QU0FfT0ZGOworICBwYXJhbXMtPlBTQV9QZWFrRGVjYXlSYXRlID0gTFZNX1BTQV9TUEVFRF9NRURJVU07CisKKyAgLyogVEUgQ29udHJvbCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+VEVfT3BlcmF0aW5nTW9kZSA9IExWTV9URV9PRkY7CisgIHBhcmFtcy0+VEVfRWZmZWN0TGV2ZWwgPSAwOworCisgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCisgIEx2bVN0YXR1cyA9CisgICAgICBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCBwYXJhbXMpOworCisgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtQnVuZGxlX2luaXQiKTsKKyAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgQUxPR1YoCisgICAgICAiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgIgorICAgICAgIkxWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CisKKyAgLyogU2V0IHRoZSBoZWFkcm9vbSBwYXJhbWV0ZXJzICovCisgIEhlYWRyb29tQmFuZERlZlswXS5MaW1pdF9Mb3cgPSAyMDsKKyAgSGVhZHJvb21CYW5kRGVmWzBdLkxpbWl0X0hpZ2ggPSA0OTk5OworICBIZWFkcm9vbUJhbmREZWZbMF0uSGVhZHJvb21fT2Zmc2V0ID0gMDsKKyAgSGVhZHJvb21CYW5kRGVmWzFdLkxpbWl0X0xvdyA9IDUwMDA7CisgIEhlYWRyb29tQmFuZERlZlsxXS5MaW1pdF9IaWdoID0gMjQwMDA7CisgIEhlYWRyb29tQmFuZERlZlsxXS5IZWFkcm9vbV9PZmZzZXQgPSAwOworICBIZWFkcm9vbVBhcmFtcy5wSGVhZHJvb21EZWZpbml0aW9uID0gJkhlYWRyb29tQmFuZERlZlswXTsKKyAgSGVhZHJvb21QYXJhbXMuSGVhZHJvb21fT3BlcmF0aW5nTW9kZSA9IExWTV9IRUFEUk9PTV9PTjsKKyAgSGVhZHJvb21QYXJhbXMuTkhlYWRyb29tQmFuZHMgPSAyOworCisgIEx2bVN0YXR1cyA9IExWTV9TZXRIZWFkcm9vbVBhcmFtcyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmSGVhZHJvb21QYXJhbXMpOworCisgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0SGVhZHJvb21QYXJhbXMiLCAiTHZtQnVuZGxlX2luaXQiKTsKKyAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgQUxPR1YoCisgICAgICAiXHRMdm1CdW5kbGVfaW5pdCBDcmVhdGVJbnN0YW5jZSBTdWNjZXNmdWxseSBjYWxsZWQgIgorICAgICAgIkxWTV9TZXRIZWFkcm9vbVBhcmFtc1xuIik7CisgIEFMT0dWKCJcdEx2bUJ1bmRsZV9pbml0IEVuZCIpOworICByZXR1cm4gMDsKK30gLyogZW5kIEx2bUJ1bmRsZV9pbml0ICovCisKK2ludCBsdm1DcmVhdGUoc3RydWN0IEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAorICAgICAgICAgICAgICBsdm1Db25maWdQYXJhbXNfdCAgICAqcGx2bUNvbmZpZ1BhcmFtcywKKyAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAgKnBhcmFtcykgeworICBpbnQgcmV0ID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCA9IE5VTEw7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQgPSAoQnVuZGxlZEVmZmVjdENvbnRleHQgKiltYWxsb2Moc2l6ZW9mKHN0cnVjdCBCdW5kbGVkRWZmZWN0Q29udGV4dCkpOworICBpZiAoTlVMTCA9PSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0KSB7CisgICAgcmV0dXJuIC1FSU5WQUw7CisgIH0KKworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uTm8gPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TZXNzaW9uSWQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UgPSBOVUxMOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVm9sdW1lRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkVxdWFsaXplckVuYWJsZWQgPSBMVk1fRkFMU0U7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkJhc3NUZW1wRGlzYWJsZWQgPSBMVk1fRkFMU0U7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPSBMVk1fRkFMU0U7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplclRlbXBEaXNhYmxlZCA9IExWTV9GQUxTRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+bk91dHB1dERldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5uVmlydHVhbGl6ZXJGb3JjZWREZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Zmlyc3RWb2x1bWUgPSBMVk1fVFJVRTsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+dm9sdW1lID0gMDsKKworICAvKiBTYXZlZCBzdHJlbmd0aCBpcyB1c2VkIHRvIHJldHVybiB0aGUgZXhhY3Qgc3RyZW5ndGggdGhhdCB3YXMgdXNlZCBpbiB0aGUKKyAgICogc2V0IHRvIHRoZSBnZXQKKyAgICogYmVjYXVzZSB3ZSBtYXAgdGhlIG9yaWdpbmFsIHN0cmVuZ3RoIHJhbmdlIG9mIDA6MTAwMCB0byAxOjE1LCBhbmQgdGhpcyB3aWxsCisgICAqIGF2b2lkCisgICAqIHF1YW50aXNhdGlvbiBsaWtlIGVmZmVjdCB3aGVuIHJldHVybmluZworICAgKi8KKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+QmFzc1N0cmVuZ3RoU2F2ZWQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5WaXJ0U3RyZW5ndGhTYXZlZCA9IDA7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPkN1clByZXNldCA9IFBSRVNFVF9DVVNUT007CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmxldmVsU2F2ZWQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iTXV0ZUVuYWJsZWQgPSBMVk1fRkFMU0U7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJTdGVyZW9Qb3NpdGlvbkVuYWJsZWQgPSBMVk1fRkFMU0U7CisgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBvc2l0aW9uU2F2ZWQgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyID0gTlVMTDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCA9IC0xOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ID0gMDsKKyAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPSAwOworICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgeworICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJhbmRHYWluZEJbaV0gPSBFUU5CXzVCYW5kU29mdFByZXNldHNbaV07CisgIH0KKyAgcENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IHBsdm1Db25maWdQYXJhbXMtPm5yQ2hhbm5lbHM7CisgIEFMT0dWKCJcdEVmZmVjdENyZWF0ZSAtIENhbGxpbmcgTHZtQnVuZGxlX2luaXQiKTsKKyAgcmV0ID0gTHZtQnVuZGxlX2luaXQocENvbnRleHQsIHBhcmFtcyk7CisKKyAgaWYgKHJldCA8IDApIHsKKyAgICBBTE9HRSgiXHRMVk1fRVJST1IgOiBsdm1DcmVhdGUoKSBCdW5kbGUgaW5pdCBmYWlsZWQiKTsKKyAgICByZXR1cm4gcmV0OworICB9CisgIHJldHVybiAwOworfQorCitpbnQgbHZtQ29udHJvbChzdHJ1Y3QgRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICBsdm1Db25maWdQYXJhbXNfdCAgICAqcGx2bUNvbmZpZ1BhcmFtcywKKyAgICAgICAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICpwYXJhbXMpIHsKKyAgTFZNX1JldHVyblN0YXR1c19lbiBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KKworICAvKiBTZXQgdGhlIGluaXRpYWwgcHJvY2VzcyBwYXJhbWV0ZXJzICovCisgIC8qIEdlbmVyYWwgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPk9wZXJhdGluZ01vZGUgPSBMVk1fTU9ERV9PTjsKKyAgcGFyYW1zLT5TcGVha2VyVHlwZSA9IExWTV9IRUFEUEhPTkVTOworCisgIHBhcmFtcy0+Q2hNYXNrICAgICA9IHBsdm1Db25maWdQYXJhbXMtPmNoTWFzazsKKyAgcGFyYW1zLT5OckNoYW5uZWxzID0gcGx2bUNvbmZpZ1BhcmFtcy0+bnJDaGFubmVsczsKKyAgaWYgKHBhcmFtcy0+TnJDaGFubmVscyA9PSAxKSB7CisgICAgcGFyYW1zLT5Tb3VyY2VGb3JtYXQgPSBMVk1fTU9OTzsKKyAgfSBlbHNlIGlmIChwYXJhbXMtPk5yQ2hhbm5lbHMgPT0gMikgeworICAgIHBhcmFtcy0+U291cmNlRm9ybWF0ID0gTFZNX1NURVJFTzsKKyAgfSBlbHNlIGlmIChwYXJhbXMtPk5yQ2hhbm5lbHMgPiAyICYmIHBhcmFtcy0+TnJDaGFubmVscyA8PSA4KSB7IC8vIEZDQ18yIEZDQ184CisgICAgcGFyYW1zLT5Tb3VyY2VGb3JtYXQgPSBMVk1fTVVMVElDSEFOTkVMOworICB9IGVsc2UgeworICAgICAgcmV0dXJuIC1FSU5WQUw7CisgIH0KKworICBMVk1fRnNfZW4gc2FtcGxlUmF0ZTsKKyAgc3dpdGNoIChwbHZtQ29uZmlnUGFyYW1zLT5zYW1wbGluZ0ZyZXEpIHsKKyAgICBjYXNlIDgwMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzgwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDExMDI1OgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18xMTAyNTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTIwMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzEyMDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAxNjAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMTYwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDIyMDUwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18yMjA1MDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjQwMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzI0MDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSAzMjAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMzIwMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDQ0MTAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgNDgwMDA6CisgICAgICBzYW1wbGVSYXRlID0gTFZNX0ZTXzQ4MDAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSA4ODIwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfODgyMDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDk2MDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU185NjAwMDsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTc2NDAwOgorICAgICAgc2FtcGxlUmF0ZSA9IExWTV9GU18xNzY0MDA7CisgICAgICBicmVhazsKKyAgICBjYXNlIDE5MjAwMDoKKyAgICAgIHNhbXBsZVJhdGUgPSBMVk1fRlNfMTkyMDAwOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiAtRUlOVkFMOworICB9CisgIHBhcmFtcy0+U2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisKKyAgLyogQ29uY2VydCBTb3VuZCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+VmlydHVhbGl6ZXJPcGVyYXRpbmdNb2RlID0gcGx2bUNvbmZpZ1BhcmFtcy0+Y3NFbmFibGU7CisgIHBhcmFtcy0+VmlydHVhbGl6ZXJUeXBlID0gTFZNX0NPTkNFUlRTT1VORDsKKyAgcGFyYW1zLT5WaXJ0dWFsaXplclJldmVyYkxldmVsID0gMTAwOworICBwYXJhbXMtPkNTX0VmZmVjdExldmVsID0gTFZNX0NTX0VGRkVDVF9OT05FOworCisgIC8qIE4tQmFuZCBFcXVhbGlzZXIgcGFyYW1ldGVycyAqLworICBjb25zdCBpbnQgZXFQcmVzZXRMZXZlbCA9IHBsdm1Db25maWdQYXJhbXMtPmVxUHJlc2V0TGV2ZWw7CisgIExWTV9FUU5CX0JhbmREZWZfdCBCYW5kRGVmc1tNQVhfTlVNX0JBTkRTXTsgIC8qIEVxdWFsaXNlciBiYW5kIGRlZmluaXRpb25zICovCisgIGZvciAoaW50IGkgPSAwOyBpIDwgRklWRUJBTkRfTlVNQkFORFM7IGkrKykgeworICAgIEJhbmREZWZzW2ldLkZyZXF1ZW5jeSA9IEVRTkJfNUJhbmRQcmVzZXRzRnJlcXVlbmNpZXNbaV07CisgICAgQmFuZERlZnNbaV0uUUZhY3RvciA9IEVRTkJfNUJhbmRQcmVzZXRzUUZhY3RvcnNbaV07CisgICAgQmFuZERlZnNbaV0uR2FpbiA9CisgICAgICAgIEVRTkJfNUJhbmRTb2Z0UHJlc2V0c1soRklWRUJBTkRfTlVNQkFORFMgKiBlcVByZXNldExldmVsKSArIGldOworICB9CisgIHBhcmFtcy0+RVFOQl9PcGVyYXRpbmdNb2RlID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZXFFbmFibGU7CisgLy8gQ2F1dGlvbjogcmF3IHBvaW50ZXIgdG8gc3RhY2sgZGF0YSwgc3RvcmVkIGluIGluc3RhbmNlIGJ5IExWTV9TZXRDb250cm9sUGFyYW1ldGVycy4KKyAgcGFyYW1zLT5wRVFOQl9CYW5kRGVmaW5pdGlvbiA9ICZCYW5kRGVmc1swXTsKKworICAvKiBWb2x1bWUgQ29udHJvbCBwYXJhbWV0ZXJzICovCisgIHBhcmFtcy0+VkNfRWZmZWN0TGV2ZWwgPSAwOworICBwYXJhbXMtPlZDX0JhbGFuY2UgPSBwbHZtQ29uZmlnUGFyYW1zLT52Y0JhbDsKKworICAvKiBUcmVibGUgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlRFX09wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT50cmVibGVFbmFibGU7CisKKyAgLyogUFNBIENvbnRyb2wgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPlBTQV9FbmFibGUgPSBMVk1fUFNBX09OOworCisgIC8qIEJhc3MgRW5oYW5jZW1lbnQgcGFyYW1ldGVycyAqLworICBwYXJhbXMtPkJFX09wZXJhdGluZ01vZGUgPSBwbHZtQ29uZmlnUGFyYW1zLT5iYXNzRW5hYmxlOworCisgIC8qIEFjdGl2YXRlIHRoZSBpbml0aWFsIHNldHRpbmdzICovCisgIEx2bVN0YXR1cyA9CisgICAgICBMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCBwYXJhbXMpOworCisgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiTHZtQnVuZGxlX2luaXQiKTsKKyAgaWYgKEx2bVN0YXR1cyAhPSBMVk1fU1VDQ0VTUykgcmV0dXJuIC1FSU5WQUw7CisKKyAgTHZtU3RhdHVzID0gTFZNX0FwcGx5TmV3U2V0dGluZ3MocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlKTsKKworICBpZiAoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKKworICByZXR1cm4gMDsKK30KKworaW50IGx2bUV4ZWN1dGUoZmxvYXQgKmZsb2F0SW4sIGZsb2F0ICpmbG9hdE91dCwgc3RydWN0IEVmZmVjdENvbnRleHQgKnBDb250ZXh0LAorICAgICAgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zX3QgKnBsdm1Db25maWdQYXJhbXMpIHsKKyAgY29uc3QgaW50IGZyYW1lTGVuZ3RoID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZnJhbWVMZW5ndGg7CisgIHJldHVybgorICAgICAgTFZNX1Byb2Nlc3MocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KKyAgICAgICAgICAgICAgICAgIGZsb2F0SW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgYnVmZmVyICovCisgICAgICAgICAgICAgICAgICBmbG9hdE91dCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KWZyYW1lTGVuZ3RoLCAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkICovCisgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAgLyogQXVkaW8gVGltZSAqLworfQorCitpbnQgbHZtTWFpblByb2Nlc3MoRWZmZWN0Q29udGV4dCAqcENvbnRleHQsCisgICAgICAgICAgICAgICAgICAgTFZNX0NvbnRyb2xQYXJhbXNfdCAqcFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBsdm1Db25maWdQYXJhbXNfdCAqcGx2bUNvbmZpZ1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICBGSUxFICpmaW5wLAorICAgICAgICAgICAgICAgICAgIEZJTEUgKmZvdXQpIHsKKyAgaW50IGVyckNvZGUgPSBsdm1Db250cm9sKHBDb250ZXh0LCBwbHZtQ29uZmlnUGFyYW1zLCBwUGFyYW1zKTsKKyAgaWYgKGVyckNvZGUpIHsKKyAgICBBTE9HRSgiRXJyb3I6IGx2bUNvbnRyb2wgcmV0dXJuZWQgd2l0aCAlZFxuIiwgZXJyQ29kZSk7CisgICAgcmV0dXJuIGVyckNvZGU7CisgIH0KKworICBjb25zdCBpbnQgY2hhbm5lbENvdW50ID0gcGx2bUNvbmZpZ1BhcmFtcy0+bnJDaGFubmVsczsKKyAgY29uc3QgaW50IGZyYW1lTGVuZ3RoID0gcGx2bUNvbmZpZ1BhcmFtcy0+ZnJhbWVMZW5ndGg7CisgIGNvbnN0IGludCBmcmFtZVNpemUgPSBjaGFubmVsQ291bnQgKiBzaXplb2YoZmxvYXQpOyAgLy8gcHJvY2Vzc2luZyBzaXplCisgIGNvbnN0IGludCBpb0NoYW5uZWxDb3VudCA9IHBsdm1Db25maWdQYXJhbXMtPmZDaGFubmVsczsKKyAgY29uc3QgaW50IGlvRnJhbWVTaXplID0gaW9DaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpOyAvLyBmaWxlIGxvYWQgc2l6ZQorICBjb25zdCBpbnQgbWF4Q2hhbm5lbENvdW50ID0gc3RkOjptYXgoY2hhbm5lbENvdW50LCBpb0NoYW5uZWxDb3VudCk7CisgIC8qCisgICAqIE1vbm8gaW5wdXQgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gMiBjaGFubmVscyBpbnRlcm5hbGx5IGluIHRoZSBwcm9jZXNzIGNhbGwKKyAgICogYnkgY29weWluZyB0aGUgc2FtZSBkYXRhIGludG8gdGhlIHNlY29uZCBjaGFubmVsLgorICAgKiBIZW5jZSB3aGVuIGNoYW5uZWxDb3VudCBpcyAxLCBvdXRwdXQgYnVmZmVyIHNob3VsZCBiZSBhbGxvY2F0ZWQgZm9yCisgICAqIDIgY2hhbm5lbHMuIFRoZSBtZW1BbGxvY0NoQ291bnQgdGFrZXMgY2FyZSBvZiBhbGxvY2F0aW9uIG9mIHN1ZmZpY2llbnQKKyAgICogbWVtb3J5IGZvciB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgICovCisgIGNvbnN0IGludCBtZW1BbGxvY0NoQ291bnQgPSAoY2hhbm5lbENvdW50ID09IDEgPyAyIDogY2hhbm5lbENvdW50KTsKKworICBzdGQ6OnZlY3RvcjxzaG9ydD4gaW4oZnJhbWVMZW5ndGggKiBtYXhDaGFubmVsQ291bnQpOworICBzdGQ6OnZlY3RvcjxzaG9ydD4gb3V0KGZyYW1lTGVuZ3RoICogbWF4Q2hhbm5lbENvdW50KTsKKyAgc3RkOjp2ZWN0b3I8ZmxvYXQ+IGZsb2F0SW4oZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworICBzdGQ6OnZlY3RvcjxmbG9hdD4gZmxvYXRPdXQoZnJhbWVMZW5ndGggKiBtZW1BbGxvY0NoQ291bnQpOworCisgIGludCBmcmFtZUNvdW50ZXIgPSAwOworICB3aGlsZSAoZnJlYWQoaW4uZGF0YSgpLCBpb0ZyYW1lU2l6ZSwgZnJhbWVMZW5ndGgsIGZpbnApID09IChzaXplX3QpZnJhbWVMZW5ndGgpIHsKKyAgICBpZiAoaW9DaGFubmVsQ291bnQgIT0gY2hhbm5lbENvdW50KSB7CisgICAgICAgIGFkanVzdF9jaGFubmVscyhpbi5kYXRhKCksIGlvQ2hhbm5lbENvdW50LCBpbi5kYXRhKCksIGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgIHNpemVvZihzaG9ydCksIGZyYW1lTGVuZ3RoICogaW9GcmFtZVNpemUpOworICAgIH0KKyAgICBtZW1jcHlfdG9fZmxvYXRfZnJvbV9pMTYoZmxvYXRJbi5kYXRhKCksIGluLmRhdGEoKSwgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQpOworCisgICAgLy8gTW9ubyBtb2RlIHdpbGwgcmVwbGljYXRlIHRoZSBmaXJzdCBjaGFubmVsIHRvIGFsbCBvdGhlciBjaGFubmVscy4KKyAgICAvLyBUaGlzIGVuc3VyZXMgYWxsIGF1ZGlvIGNoYW5uZWxzIGFyZSBpZGVudGljYWwuIFRoaXMgaXMgdXNlZnVsIGZvciB0ZXN0aW5nCisgICAgLy8gQmFzcyBCb29zdCwgd2hpY2ggZXh0cmFjdHMgYSBtb25vIHNpZ25hbCBmb3IgcHJvY2Vzc2luZy4KKyAgICBpZiAocGx2bUNvbmZpZ1BhcmFtcy0+bW9ub01vZGUgJiYgY2hhbm5lbENvdW50ID4gMSkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lTGVuZ3RoOyArK2kpIHsKKyAgICAgICAgICAgIGF1dG8gKmZwID0gJmZsb2F0SW5baSAqIGNoYW5uZWxDb3VudF07CisgICAgICAgICAgICBzdGQ6OmZpbGwoZnAgKyAxLCBmcCArIGNoYW5uZWxDb3VudCwgKmZwKTsgLy8gcmVwbGljYXRlIGNoIDAKKyAgICAgICAgfQorICAgIH0KKyNpZm5kZWYgQllQQVNTX0VYRUMKKyAgICBlcnJDb2RlID0gbHZtRXhlY3V0ZShmbG9hdEluLmRhdGEoKSwgZmxvYXRPdXQuZGF0YSgpLCBwQ29udGV4dCwgcGx2bUNvbmZpZ1BhcmFtcyk7CisgICAgaWYgKGVyckNvZGUpIHsKKyAgICAgIHByaW50ZigiXG5FcnJvcjogbHZtRXhlY3V0ZSByZXR1cm5lZCB3aXRoICVkXG4iLCBlcnJDb2RlKTsKKyAgICAgIHJldHVybiBlcnJDb2RlOworICAgIH0KKworICAgICh2b2lkKWZyYW1lU2l6ZTsgLy8gZWxpbWluYXRlIHdhcm5pbmcKKyNlbHNlCisgICAgbWVtY3B5KGZsb2F0T3V0LmRhdGEoKSwgZmxvYXRJbi5kYXRhKCksIGZyYW1lTGVuZ3RoICogZnJhbWVTaXplKTsKKyNlbmRpZgorICAgIG1lbWNweV90b19pMTZfZnJvbV9mbG9hdChvdXQuZGF0YSgpLCBmbG9hdE91dC5kYXRhKCksIGZyYW1lTGVuZ3RoICogY2hhbm5lbENvdW50KTsKKyAgICBpZiAoaW9DaGFubmVsQ291bnQgIT0gY2hhbm5lbENvdW50KSB7CisgICAgICAgIGFkanVzdF9jaGFubmVscyhvdXQuZGF0YSgpLCBjaGFubmVsQ291bnQsIG91dC5kYXRhKCksIGlvQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgc2l6ZW9mKHNob3J0KSwgZnJhbWVMZW5ndGggKiBjaGFubmVsQ291bnQgKiBzaXplb2Yoc2hvcnQpKTsKKyAgICB9CisgICAgKHZvaWQpIGZ3cml0ZShvdXQuZGF0YSgpLCBpb0ZyYW1lU2l6ZSwgZnJhbWVMZW5ndGgsIGZvdXQpOworICAgIGZyYW1lQ291bnRlciArPSBmcmFtZUxlbmd0aDsKKyAgfQorICBwcmludGYoImZyYW1lQ291bnRlcjogWyVkXVxuIiwgZnJhbWVDb3VudGVyKTsKKyAgcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyICphcmd2W10pIHsKKyAgaWYgKGFyZ2MgPT0gMSkgeworICAgIHByaW50VXNhZ2UoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBsdm1Db25maWdQYXJhbXNfdCBsdm1Db25maWdQYXJhbXN7fTsgLy8gZGVmYXVsdCBpbml0aWFsaXplCisgIGNvbnN0IGNoYXIgKmluZmlsZSA9IG51bGxwdHI7CisgIGNvbnN0IGNoYXIgKm91dGZpbGUgPSBudWxscHRyOworCisgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgaSsrKSB7CisgICAgcHJpbnRmKCIlcyAiLCBhcmd2W2ldKTsKKyAgICBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1pOiIsIDMpKSB7CisgICAgICBpbmZpbGUgPSBhcmd2W2ldICsgMzsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItbzoiLCAzKSkgeworICAgICAgb3V0ZmlsZSA9IGFyZ3ZbaV0gKyAzOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mczoiLCA0KSkgeworICAgICAgY29uc3QgaW50IHNhbXBsaW5nRnJlcSA9IGF0b2koYXJndltpXSArIDQpOworICAgICAgaWYgKHNhbXBsaW5nRnJlcSAhPSA4MDAwICYmIHNhbXBsaW5nRnJlcSAhPSAxMTAyNSAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAxMjAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gMTYwMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gMjIwNTAgJiYgc2FtcGxpbmdGcmVxICE9IDI0MDAwICYmCisgICAgICAgICAgc2FtcGxpbmdGcmVxICE9IDMyMDAwICYmIHNhbXBsaW5nRnJlcSAhPSA0NDEwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSA0ODAwMCAmJiBzYW1wbGluZ0ZyZXEgIT0gODgyMDAgJiYKKyAgICAgICAgICBzYW1wbGluZ0ZyZXEgIT0gOTYwMDAgJiYgc2FtcGxpbmdGcmVxICE9IDE3NjQwMCAmJgorICAgICAgICAgIHNhbXBsaW5nRnJlcSAhPSAxOTIwMDApIHsKKyAgICAgICAgcHJpbnRmKCJFcnJvcjogVW5zdXBwb3J0ZWQgU2FtcGxpbmcgRnJlcXVlbmN5IDogJWRcbiIsIHNhbXBsaW5nRnJlcSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy5zYW1wbGluZ0ZyZXEgPSBzYW1wbGluZ0ZyZXE7CisgICAgfSBlbHNlIGlmICghc3RybmNtcChhcmd2W2ldLCAiLWNoTWFzazoiLCA4KSkgeworICAgICAgY29uc3QgaW50IGNoTWFza0NvbmZpZ0lkeCA9IGF0b2koYXJndltpXSArIDgpOworICAgICAgaWYgKGNoTWFza0NvbmZpZ0lkeCA8IDAgfHwgKHNpemVfdCljaE1hc2tDb25maWdJZHggPj0gc3RkOjpzaXplKGx2bUNvbmZpZ0NoTWFzaykpIHsKKyAgICAgICAgQUxPR0UoIlxuRXJyb3I6IFVuc3VwcG9ydGVkIENoYW5uZWwgTWFzayA6ICVkXG4iLCBjaE1hc2tDb25maWdJZHgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBjb25zdCBhdWRpb19jaGFubmVsX21hc2tfdCBjaE1hc2sgPSBsdm1Db25maWdDaE1hc2tbY2hNYXNrQ29uZmlnSWR4XTsKKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy5jaE1hc2sgPSBjaE1hc2s7CisgICAgICBsdm1Db25maWdQYXJhbXMubnJDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaE1hc2spOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi12Y0JhbDoiLCA3KSkgeworICAgICAgY29uc3QgaW50IHZjQmFsYW5jZSA9IGF0b2koYXJndltpXSArIDcpOworICAgICAgaWYgKHZjQmFsYW5jZSA+IDk2IHx8IHZjQmFsYW5jZSA8IC05NikgeworICAgICAgICBBTE9HRSgiXG5FcnJvcjogVW5zdXBwb3J0ZWQgdm9sdW1lIGJhbGFuY2UgdmFsdWU6ICVkXG4iLCB2Y0JhbGFuY2UpOworICAgICAgfQorICAgICAgbHZtQ29uZmlnUGFyYW1zLnZjQmFsID0gdmNCYWxhbmNlOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1mY2g6IiwgNSkpIHsKKyAgICAgIGNvbnN0IGludCBmQ2hhbm5lbHMgPSBhdG9pKGFyZ3ZbaV0gKyA1KTsKKyAgICAgIGlmIChmQ2hhbm5lbHMgPiA4IHx8IGZDaGFubmVscyA8IDEpIHsKKyAgICAgICAgICAgICBwcmludGYoIkVycm9yOiBVbnN1cHBvcnRlZCBudW1iZXIgb2YgZmlsZSBjaGFubmVscyA6ICVkXG4iLCBmQ2hhbm5lbHMpOworICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgfQorICAgICAgICAgICBsdm1Db25maWdQYXJhbXMuZkNoYW5uZWxzID0gZkNoYW5uZWxzOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChhcmd2W2ldLCItTSIpKSB7CisgICAgICAgICAgbHZtQ29uZmlnUGFyYW1zLm1vbm9Nb2RlID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItYmFzc2x2bDoiLCA5KSkgeworICAgICAgY29uc3QgaW50IGJhc3NFZmZlY3RMZXZlbCA9IGF0b2koYXJndltpXSArIDkpOworICAgICAgaWYgKGJhc3NFZmZlY3RMZXZlbCA+IExWTV9CRV9NQVhfRUZGRUNUTEVWRUwgfHwgYmFzc0VmZmVjdExldmVsIDwgTFZNX0JFX01JTl9FRkZFQ1RMRVZFTCkgeworICAgICAgICBwcmludGYoIkVycm9yOiBVbnN1cHBvcnRlZCBCYXNzIEVmZmVjdCBMZXZlbCA6ICVkXG4iLAorICAgICAgICAgICAgICAgYmFzc0VmZmVjdExldmVsKTsKKyAgICAgICAgcHJpbnRVc2FnZSgpOworICAgICAgICByZXR1cm4gLTE7CisgICAgICB9CisgICAgICBsdm1Db25maWdQYXJhbXMuYmFzc0VmZmVjdExldmVsID0gYmFzc0VmZmVjdExldmVsOworICAgIH0gZWxzZSBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1lcVByZXNldDoiLCAxMCkpIHsKKyAgICAgIGNvbnN0IGludCBlcVByZXNldExldmVsID0gYXRvaShhcmd2W2ldICsgMTApOworICAgICAgY29uc3QgaW50IG51bVByZXNldEx2bHMgPSBzdGQ6OnNpemUoZ0VxdWFsaXplclByZXNldHMpOworICAgICAgaWYgKGVxUHJlc2V0TGV2ZWwgPj0gbnVtUHJlc2V0THZscyB8fCBlcVByZXNldExldmVsIDwgMCkgeworICAgICAgICBwcmludGYoIkVycm9yOiBVbnN1cHBvcnRlZCBFcXVhbGl6ZXIgUHJlc2V0IDogJWRcbiIsIGVxUHJlc2V0TGV2ZWwpOworICAgICAgICBwcmludFVzYWdlKCk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICAgIH0KKyAgICAgIGx2bUNvbmZpZ1BhcmFtcy5lcVByZXNldExldmVsID0gZXFQcmVzZXRMZXZlbDsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1iRSIpKSB7CisgICAgICBsdm1Db25maWdQYXJhbXMuYmFzc0VuYWJsZSA9IExWTV9CRV9PTjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1lcUUiKSkgeworICAgICAgbHZtQ29uZmlnUGFyYW1zLmVxRW5hYmxlID0gTFZNX0VRTkJfT047CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItdEUiKSkgeworICAgICAgbHZtQ29uZmlnUGFyYW1zLnRyZWJsZUVuYWJsZSA9IExWTV9URV9PTjsKKyAgICB9IGVsc2UgaWYgKCFzdHJjbXAoYXJndltpXSwgIi1jc0UiKSkgeworICAgICAgbHZtQ29uZmlnUGFyYW1zLmNzRW5hYmxlID0gTFZNX01PREVfT047CisgICAgfSBlbHNlIGlmICghc3RyY21wKGFyZ3ZbaV0sICItaCIpKSB7CisgICAgICBwcmludFVzYWdlKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBpZiAoaW5maWxlID09IG51bGxwdHIgfHwgb3V0ZmlsZSA9PSBudWxscHRyKSB7CisgICAgcHJpbnRmKCJFcnJvcjogbWlzc2luZyBpbnB1dC9vdXRwdXQgZmlsZXNcbiIpOworICAgIHByaW50VXNhZ2UoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBGSUxFICpmaW5wID0gZm9wZW4oaW5maWxlLCAicmIiKTsKKyAgaWYgKGZpbnAgPT0gbnVsbHB0cikgeworICAgIHByaW50ZigiQ2Fubm90IG9wZW4gaW5wdXQgZmlsZSAlcyIsIGluZmlsZSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgRklMRSAqZm91dCA9IGZvcGVuKG91dGZpbGUsICJ3YiIpOworICBpZiAoZm91dCA9PSBudWxscHRyKSB7CisgICAgcHJpbnRmKCJDYW5ub3Qgb3BlbiBvdXRwdXQgZmlsZSAlcyIsIG91dGZpbGUpOworICAgIGZjbG9zZShmaW5wKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKworICBFZmZlY3RDb250ZXh0IGNvbnRleHQ7CisgIExWTV9Db250cm9sUGFyYW1zX3QgcGFyYW1zOworICBpbnQgZXJyQ29kZSA9IGx2bUNyZWF0ZSgmY29udGV4dCwgJmx2bUNvbmZpZ1BhcmFtcywgJnBhcmFtcyk7CisgIGlmIChlcnJDb2RlID09IDApIHsKKyAgICBlcnJDb2RlID0gbHZtTWFpblByb2Nlc3MoJmNvbnRleHQsICZwYXJhbXMsICZsdm1Db25maWdQYXJhbXMsIGZpbnAsIGZvdXQpOworICAgIGlmIChlcnJDb2RlICE9IDApIHsKKyAgICAgIHByaW50ZigiRXJyb3I6IGx2bU1haW5Qcm9jZXNzIHJldHVybmVkIHdpdGggdGhlIGVycm9yOiAlZCIsZXJyQ29kZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIHByaW50ZigiRXJyb3I6IGx2bUNyZWF0ZSByZXR1cm5lZCB3aXRoIHRoZSBlcnJvcjogJWQiLCBlcnJDb2RlKTsKKyAgfQorICBmY2xvc2UoZmlucCk7CisgIGZjbG9zZShmb3V0KTsKKyAgLyogRnJlZSB0aGUgYWxsb2NhdGVkIGJ1ZmZlcnMgKi8KKyAgaWYgKGNvbnRleHQucEJ1bmRsZWRDb250ZXh0ICE9IG51bGxwdHIpIHsKKyAgICBpZiAoY29udGV4dC5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSAhPSBudWxscHRyKSB7CisgICAgICBMdm1FZmZlY3RfZnJlZSgmY29udGV4dCk7CisgICAgfQorICAgIGZyZWUoY29udGV4dC5wQnVuZGxlZENvbnRleHQpOworICB9CisKKyAgaWYgKGVyckNvZGUpIHsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS90ZXN0cy9zbnIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvc25yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODU5OTRjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vdGVzdHMvc25yLmNwcApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBID0gZmxvYXQ+CitzdGQ6OnBhaXI8QSwgQT4gZ2V0U2lnbmFsTm9pc2UoRklMRSAqZmlucCwgRklMRSAqZnJlZikgeworICBjb25zdGV4cHIgc2l6ZV90IGZyYW1lc2l6ZSA9IDI1NjsKKyAgc3RkOjp2ZWN0b3I8VD4gaW4oZnJhbWVzaXplKTsKKyAgc3RkOjp2ZWN0b3I8VD4gcmVmKGZyYW1lc2l6ZSk7CisgIEEgc2lnbmFse307CisgIEEgbm9pc2V7fTsKKworICBmb3IgKDs7KSB7CisgICAgc2l6ZV90IHJlYWRfc2FtcGxlc19pbiA9IGZyZWFkKCZpblswXSwgc2l6ZW9mKFQpLCBmcmFtZXNpemUsIGZpbnApOworICAgIGNvbnN0IHNpemVfdCByZWFkX3NhbXBsZXNfcmVmID0gZnJlYWQoJnJlZlswXSwgc2l6ZW9mKFQpLCBmcmFtZXNpemUsIGZyZWYpOworICAgIGlmIChyZWFkX3NhbXBsZXNfaW4gIT0gcmVhZF9zYW1wbGVzX3JlZikgeworICAgICAgcHJpbnRmKCJmaWxlIHNpemVzIGRvIG5vdCBtYXRjaCAobGFzdCAlenUgJXp1KSIsIHJlYWRfc2FtcGxlc19pbiwgcmVhZF9zYW1wbGVzX3JlZik7CisgICAgICByZWFkX3NhbXBsZXNfaW4gPSBzdGQ6Om1pbihyZWFkX3NhbXBsZXNfaW4sIHJlYWRfc2FtcGxlc19yZWYpOworICAgIH0KKyAgICBpZiAocmVhZF9zYW1wbGVzX2luID09IDApIHsKKyAgICAgICAgcmV0dXJuIHsgc2lnbmFsLCBub2lzZSB9OworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlYWRfc2FtcGxlc19pbjsgKytpKSB7CisgICAgICAgY29uc3QgQSB2YWx1ZShyZWZbaV0pOworICAgICAgIGNvbnN0IEEgZGlmZihBKGluW2ldKSAtIHZhbHVlKTsKKyAgICAgICBzaWduYWwgKz0gdmFsdWUgKiB2YWx1ZTsKKyAgICAgICBub2lzZSArPSBkaWZmICogZGlmZjsKKyAgICB9CisgIH0KK30KKwordm9pZCBwcmludFVzYWdlKCkgeworICBwcmludGYoIlxuVXNhZ2U6ICIpOworICBwcmludGYoIlxuICAgICBzbnIgPHJlZl9maWxlPiA8dGVzdF9maWxlPiBbb3B0aW9uc11cbiIpOworICBwcmludGYoIlxud2hlcmUsIFxuICAgICA8cmVmX2ZpbGU+ICBpcyB0aGUgcmVmZXJlbmNlIGZpbGUgbmFtZSIpOworICBwcmludGYoIlxuICAgICAgICAgICAgICAgICAgb24gd2hpY2ggd2lsbCBiZSB0YWtlbiBhcyBwdXJlIHNpZ25hbCIpOworICBwcmludGYoIlxuICAgICA8dGVzdF9maWxlPiBpcyB0ZXN0IGZpbGUgZm9yIHNuciBjYWxjdWxhdGlvbiIpOworICBwcmludGYoIlxuICAgICBhbmQgb3B0aW9ucyBhcmUgbWVudGlvbmVkIGJlbG93Iik7CisgIHByaW50ZigiXG4iKTsKKyAgcHJpbnRmKCJcbiAgICAgLXBjbV9mb3JtYXQ6PHBjbSBmb3JtYXQgb2YgaW5wdXQgZmlsZXM+Iik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDAgLSAxNiBiaXQgcGNtIik7CisgIHByaW50ZigiXG4gICAgICAgICAgIDEgLSAzMiBiaXQgZmxvYXQiKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgZGVmYXVsdCAwIik7CisgIHByaW50ZigiXG4gICAgIC10aHI6PHRocmVzaG9sZCB2YWx1ZT4iKTsKKyAgcHJpbnRmKCJcbiAgICAgICAgICAgZGVmYXVsdCAtIG5lZ2F0aXZlIGluZmluaXR5XG5cbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKSB7CisgIGlmIChhcmdjIDwgMykgeworICAgIHByaW50VXNhZ2UoKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaW50IHBjbV9mb3JtYXQgPSAwOworICBmbG9hdCB0aHIgPSAtIHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOworICBGSUxFICpmcmVmID0gZm9wZW4oYXJndlsxXSwgInJiIik7CisgIEZJTEUgKmZpbnAgPSBmb3Blbihhcmd2WzJdLCAicmIiKTsKKyAgZm9yIChpbnQgaSA9IDM7IGkgPCBhcmdjOyBpKyspIHsKKyAgICBpZiAoIXN0cm5jbXAoYXJndltpXSwgIi1wY21fZm9ybWF0OiIsIDEyKSkgeworICAgICAgcGNtX2Zvcm1hdCA9IGF0b2koYXJndltpXSArIDEyKTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY21wKGFyZ3ZbaV0sICItdGhyOiIsIDUpKSB7CisgICAgICB0aHIgPSBhdG9mKGFyZ3ZbaV0gKyA1KTsKKyAgICB9CisgIH0KKyAgaWYgKGZpbnAgPT0gbnVsbHB0ciB8fCBmcmVmID09IG51bGxwdHIpIHsKKyAgICBwcmludGYoIlxuRXJyb3I6IG1pc3NpbmcgaW5wdXQvcmVmZXJlbmNlIGZpbGVzXG4iKTsKKyAgICByZXR1cm4gLTE7CisgIH0KKyAgaW50IHJldCA9IEVYSVRfU1VDQ0VTUzsKKyAgYXV0byBzbiA9IHBjbV9mb3JtYXQgPT0gMAorICAgICAgPyBnZXRTaWduYWxOb2lzZTxzaG9ydD4oZmlucCwgZnJlZikKKyAgICAgIDogZ2V0U2lnbmFsTm9pc2U8ZmxvYXQ+KGZpbnAsIGZyZWYpOworICBpZiAoc24uZmlyc3QgPiAwLmYgJiYgc24uc2Vjb25kID4gMC5mKSB7CisgICAgZmxvYXQgc25yID0gMTAuZiAqIGxvZyhzbi5maXJzdCAvIHNuLnNlY29uZCk7CisgICAgLy8gY29tcGFyZSB0aGUgbWVhc3VyZWQgc25yIHZhbHVlIHdpdGggdGhyZXNob2xkCisgICAgaWYgKHNuciA8IHRocikgeworICAgICAgcHJpbnRmKCIlLjZmIGxlc3MgdGhhbiB0aHJlc2hvbGQgJS42ZlxuIiwgc25yLCB0aHIpOworICAgICAgcmV0ID0gRVhJVF9GQUlMVVJFOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGYoIiUuNmZcbiIsIHNucik7CisgICAgfQorICB9CisgIGZjbG9zZShmaW5wKTsKKyAgZmNsb3NlKGZyZWYpOworCisgIHJldHVybiByZXQ7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0FuZHJvaWQuYnAKaW5kZXggMTBmZDk3MC4uYWZjNDIyMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQW5kcm9pZC5icApAQCAtMSw2ICsxLDMgQEAKLS8vIFRoZSB3cmFwcGVyIC1EQlVJTERfRkxPQVQgbmVlZHMgdG8gbWF0Y2gKLS8vIHRoZSBsdm0gbGlicmFyeSAtREJVSUxEX0ZMT0FULgotCiAvLyBtdXNpYyBidW5kbGUgd3JhcHBlcgogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJidW5kbGV3cmFwcGVyIiwKQEAgLTE0LDEwICsxMSw5IEBACiAgICAgdmVuZG9yOiB0cnVlLAogICAgIHNyY3M6IFsiQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAiXSwKIAotICAgIGNmbGFnczogWworICAgIGNwcGZsYWdzOiBbCiAgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKLSAgICAgICAgIi1EQlVJTERfRkxPQVQiLAotICAgICAgICAiLURISUdIRVJfRlMiLAorICAgICAgICAiLURTVVBQT1JUX01DIiwKIAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCkBAIC01NSwxMCArNTEsOCBAQAogICAgIHZlbmRvcjogdHJ1ZSwKICAgICBzcmNzOiBbIlJldmVyYi9FZmZlY3RSZXZlcmIuY3BwIl0sCiAKLSAgICBjZmxhZ3M6IFsKKyAgICBjcHBmbGFnczogWwogICAgICAgICAiLWZ2aXNpYmlsaXR5PWhpZGRlbiIsCi0gICAgICAgICItREJVSUxEX0ZMT0FUIiwKLSAgICAgICAgIi1ESElHSEVSX0ZTIiwKIAogICAgICAgICAiLVdhbGwiLAogICAgICAgICAiLVdlcnJvciIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmNwcAppbmRleCA1M2QyNjZhLi5kNTY5YzZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL0J1bmRsZS9FZmZlY3RCdW5kbGUuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5jcHAKQEAgLTgxLDcgKzgxLDYgQEAKICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiB9CiAKLQogLy8gTlhQIFNXIEJhc3NCb29zdCBVVUlECiBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IGdCYXNzQm9vc3REZXNjcmlwdG9yID0gewogICAgICAgICB7MHgwNjM0ZjIyMCwgMHhkZGQ0LCAweDExZGIsIDB4YTBmYywgeyAweDAwLCAweDAyLCAweGE1LCAweGQ1LCAweGM1LCAweDFiIH19LApAQCAtMjU4LDI2ICsyNTcsNiBAQAogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5maXJzdFZvbHVtZSAgICAgICAgICAgICAgPSBMVk1fVFJVRTsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+dm9sdW1lICAgICAgICAgICAgICAgICAgID0gMDsKIAotICAgICAgICAjaWZkZWYgTFZNX1BDTQotICAgICAgICBjaGFyIGZpbGVOYW1lWzI1Nl07Ci0gICAgICAgIHNucHJpbnRmKGZpbGVOYW1lLCAyNTYsICIvZGF0YS90bXAvYnVuZGxlXyVwX3BjbV9pbi5wY20iLCBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0KTsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIgPSBmb3BlbihmaWxlTmFtZSwgInciKTsKLSAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dWKCJjYW5ub3Qgb3BlbiAlcyIsIGZpbGVOYW1lKTsKLSAgICAgICAgICAgIHJldCA9IC1FSU5WQUw7Ci0gICAgICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBzbnByaW50ZihmaWxlTmFtZSwgMjU2LCAiL2RhdGEvdG1wL2J1bmRsZV8lcF9wY21fb3V0LnBjbSIsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQpOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21PdXRQdHIgPSBmb3BlbihmaWxlTmFtZSwgInciKTsKLSAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbU91dFB0ciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HVigiY2Fubm90IG9wZW4gJXMiLCBmaWxlTmFtZSk7Ci0gICAgICAgICAgICBmY2xvc2UocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOwotICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21JblB0ciA9IE5VTEw7Ci0gICAgICAgICAgIHJldCA9IC1FSU5WQUw7Ci0gICAgICAgICAgIGdvdG8gZXhpdDsKLSAgICAgICAgfQotICAgICAgICAjZW5kaWYKIAogICAgICAgICAvKiBTYXZlZCBzdHJlbmd0aCBpcyB1c2VkIHRvIHJldHVybiB0aGUgZXhhY3Qgc3RyZW5ndGggdGhhdCB3YXMgdXNlZCBpbiB0aGUgc2V0IHRvIHRoZSBnZXQKICAgICAgICAgICogYmVjYXVzZSB3ZSBtYXAgdGhlIG9yaWdpbmFsIHN0cmVuZ3RoIHJhbmdlIG9mIDA6MTAwMCB0byAxOjE1LCBhbmQgdGhpcyB3aWxsIGF2b2lkCkBAIC0yOTUsMTMgKzI3NCwxMSBAQAogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0ICAgPSAwOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiAgICAgPSAwOwogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSAgICAgPSAwOwotI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmICFkZWZpbmVkKE5BVElWRV9GTE9BVF9CVUZGRVIpCi0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciAgICAgICAgICAgICA9IE5VTEw7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIgICAgICAgICAgICA9IE5VTEw7Ci0jZW5kaWYKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBGSVZFQkFORF9OVU1CQU5EUzsgaSsrKSB7CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iYW5kR2FpbmRCW2ldID0gRVFOQl81QmFuZFNvZnRQcmVzZXRzW2ldOwogICAgICAgICB9CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmVmZmVjdFByb2Nlc3NDYWxsZWQgICAgICA9IDA7CisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmVmZmVjdEluRHJhaW4gICAgICAgICAgICA9IDA7CiAKICAgICAgICAgQUxPR1YoIlx0RWZmZWN0Q3JlYXRlIC0gQ2FsbGluZyBMdm1CdW5kbGVfaW5pdCIpOwogICAgICAgICByZXQgPSBMdm1CdW5kbGVfaW5pdChwQ29udGV4dCk7CkBAIC0zOTQsNiArMzcxLDggQEAKIAogICAgIC8vIENsZWFyIHRoZSBpbnN0YW50aWF0ZWQgZmxhZyBmb3IgdGhlIGVmZmVjdAogICAgIC8vIHByb3RlY3QgYWdhaW5zIHRoZSBjYXNlIHdoZXJlIGFuIGVmZmVjdCBpcyB1bi1pbnN0YW50aWF0ZWQgd2l0aG91dCBiZWluZyBkaXNhYmxlZAorCisgICAgaW50ICZlZmZlY3RJbkRyYWluID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZWZmZWN0SW5EcmFpbjsKICAgICBpZihwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkgewogICAgICAgICBBTE9HVigiXHRFZmZlY3RSZWxlYXNlIExWTV9CQVNTX0JPT1NUIENsZWFyaW5nIGdsb2JhbCBpbnRzdGFudGlhdGVkIGZsYWciKTsKICAgICAgICAgcFNlc3Npb25Db250ZXh0LT5iQmFzc0luc3RhbnRpYXRlZCA9IExWTV9GQUxTRTsKQEAgLTQxOCwxMiArMzk3LDE2IEBACiAgICAgfSBlbHNlIGlmKHBDb250ZXh0LT5FZmZlY3RUeXBlID09IExWTV9WT0xVTUUpIHsKICAgICAgICAgQUxPR1YoIlx0RWZmZWN0UmVsZWFzZSBMVk1fVk9MVU1FIENsZWFyaW5nIGdsb2JhbCBpbnRzdGFudGlhdGVkIGZsYWciKTsKICAgICAgICAgcFNlc3Npb25Db250ZXh0LT5iVm9sdW1lSW5zdGFudGlhdGVkID0gTFZNX0ZBTFNFOwotICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZvbHVtZUVuYWJsZWQgPT0gTFZNX1RSVUUpeworICAgICAgICAvLyBUaGVyZSBpcyBubyBzYW1wbGVzVG9FeGl0Q291bnQgZm9yIHZvbHVtZSBzbyB3ZSBhbHNvIHVzZSB0aGUgZHJhaW4gZmxhZyB0byBjaGVjaworICAgICAgICAvLyBpZiB3ZSBzaG91bGQgZGVjcmVtZW50IHRoZSBlZmZlY3RzIGVuYWJsZWQuCisgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVm9sdW1lRW5hYmxlZCA9PSBMVk1fVFJVRQorICAgICAgICAgICAgICAgIHx8IChlZmZlY3RJbkRyYWluICYgMSA8PCBMVk1fVk9MVU1FKSAhPSAwKSB7CiAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZC0tOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0UmVsZWFzZSA6IFVuc3VwcG9ydGVkIGVmZmVjdFxuXG5cblxuXG5cblxuIik7CiAgICAgfQorICAgIGVmZmVjdEluRHJhaW4gJj0gfigxIDw8IHBDb250ZXh0LT5FZmZlY3RUeXBlKTsgLy8gbm8gbmVlZCB0byBkcmFpbiBpZiByZWxlYXNlZAogCiAgICAgLy8gRGlzYWJsZSBlZmZlY3QsIGluIHRoaXMgY2FzZSBpZ25vcmUgZXJyb3JzIChyZXR1cm4gY29kZXMpCiAgICAgLy8gaWYgYW4gZWZmZWN0IGhhcyBhbHJlYWR5IGJlZW4gZGlzYWJsZWQKQEAgLTQzNSwxNyArNDE4LDYgQEAKICAgICAgICAgICAgIChwU2Vzc2lvbkNvbnRleHQtPmJFcXVhbGl6ZXJJbnN0YW50aWF0ZWQgPT1MVk1fRkFMU0UpICYmCiAgICAgICAgICAgICAocFNlc3Npb25Db250ZXh0LT5iVmlydHVhbGl6ZXJJbnN0YW50aWF0ZWQ9PUxWTV9GQUxTRSkpCiAgICAgewotICAgICAgICAjaWZkZWYgTFZNX1BDTQotICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIgIT0gTlVMTCkgewotICAgICAgICAgICAgZmNsb3NlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKLSAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGZjbG9zZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5QY21PdXRQdHIpOwotICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyID0gTlVMTDsKLSAgICAgICAgfQotICAgICAgICAjZW5kaWYKLQogCiAgICAgICAgIC8vIENsZWFyIHRoZSBTZXNzaW9uSW5kZXgKICAgICAgICAgZm9yKGludCBpPTA7IGk8TFZNX01BWF9TRVNTSU9OUzsgaSsrKXsKQEAgLTQ2NiwxMCArNDM4LDYgQEAKICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyKTsKICAgICAgICAgfQotI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmICFkZWZpbmVkKE5BVElWRV9GTE9BVF9CVUZGRVIpCi0gICAgICAgIGZyZWUocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cElucHV0QnVmZmVyKTsKLSAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyKTsKLSNlbmRpZgogICAgICAgICBkZWxldGUgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dDsKICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dCA9IExWTV9OVUxMOwogICAgIH0KQEAgLTY1MCw2ICs2MTgsOSBAQAogICAgIHBhcmFtcy5TcGVha2VyVHlwZSAgICAgICAgICAgID0gTFZNX0hFQURQSE9ORVM7CiAKICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVSYXRlID0gTFZNX0ZTXzQ0MTAwOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DaE1hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisjZW5kaWYKIAogICAgIC8qIENvbmNlcnQgU291bmQgcGFyYW1ldGVycyAqLwogICAgIHBhcmFtcy5WaXJ0dWFsaXplck9wZXJhdGluZ01vZGUgICA9IExWTV9NT0RFX09GRjsKQEAgLTY5NSw2ICs2NjYsMTEgQEAKICAgICBwYXJhbXMuVEVfT3BlcmF0aW5nTW9kZSAgICAgICA9IExWTV9URV9PRkY7CiAgICAgcGFyYW1zLlRFX0VmZmVjdExldmVsICAgICAgICAgPSAwOwogCisjaWZkZWYgU1VQUE9SVF9NQworICAgIHBhcmFtcy5OckNoYW5uZWxzICAgICAgICAgICAgID0KKyAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyk7CisgICAgcGFyYW1zLkNoTWFzayAgICAgICAgICAgICAgICAgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisjZW5kaWYKICAgICAvKiBBY3RpdmF0ZSB0aGUgaW5pdGlhbCBzZXR0aW5ncyAqLwogICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMpOwpAQCAtNzQzLDcgKzcxOSw2IEBACiAvLyAgcE91dDogICAgICAgcG9pbnRlciB0byB1cGRhdGVkIHN0ZXJlbyAxNiBiaXQgb3V0cHV0IGRhdGEKIC8vCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSNpZmRlZiBCVUlMRF9GTE9BVAogaW50IEx2bUJ1bmRsZV9wcm9jZXNzKGVmZmVjdF9idWZmZXJfdCAgKnBJbiwKICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfYnVmZmVyX3QgICpwT3V0LAogICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICAgICAgZnJhbWVDb3VudCwKQEAgLTc1MSwzMCArNzI2LDggQEAKIAogICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cyA9IExWTV9TVUNDRVNTOyAgICAgICAgICAgICAgICAvKiBGdW5jdGlvbiBjYWxsIHN0YXR1cyAqLwogICAgIGVmZmVjdF9idWZmZXJfdCAgICAgICAgICpwT3V0VG1wOwotI2lmbmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCi0gICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciA9PSBudWxscHRyIHx8Ci0gICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50IDwgZnJhbWVDb3VudCkgewotICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlcik7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBJbnB1dEJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgKExWTV9GTE9BVCAqKWNhbGxvYyhmcmFtZUNvdW50LCBzaXplb2YoTFZNX0ZMT0FUKSAqIEZDQ18yKTsKLSAgICB9Ci0KLSAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciA9PSBudWxscHRyIHx8Ci0gICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5mcmFtZUNvdW50IDwgZnJhbWVDb3VudCkgewotICAgICAgICBmcmVlKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPnBPdXRwdXRCdWZmZXIpOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyID0KLSAgICAgICAgICAgICAgICAoTFZNX0ZMT0FUICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihMVk1fRkxPQVQpICogRkNDXzIpOwotICAgIH0KLQotICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXIgPT0gbnVsbHB0ciB8fAotICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cE91dHB1dEJ1ZmZlciA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJMVk1fRVJST1IgOiBMdm1CdW5kbGVfcHJvY2VzcyBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgZmxvYXQgYnVmZmVyJ3MgZmFpbGVkIik7Ci0gICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgIH0KLQotICAgIExWTV9GTE9BVCAqIGNvbnN0IHBJbnB1dEJ1ZmYgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wSW5wdXRCdWZmZXI7Ci0gICAgTFZNX0ZMT0FUICogY29uc3QgcE91dHB1dEJ1ZmYgPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5wT3V0cHV0QnVmZmVyOwotI2VuZGlmCisgICAgY29uc3QgTFZNX0lOVDMyIE5yQ2hhbm5lbHMgPQorICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2socENvbnRleHQtPmNvbmZpZy5pbnB1dENmZy5jaGFubmVscyk7CiAKICAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURSl7CiAgICAgICAgIHBPdXRUbXAgPSBwT3V0OwpAQCAtNzg0LDcgKzczNyw3IEBACiAgICAgICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPQotICAgICAgICAgICAgICAgICAgICAoZWZmZWN0X2J1ZmZlcl90ICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogRkNDXzIpOworICAgICAgICAgICAgICAgICAgICAoZWZmZWN0X2J1ZmZlcl90ICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogTnJDaGFubmVscyk7CiAgICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FTk9NRU07CiAgICAgICAgICAgICB9CkBAIC03OTYsMTE5ICs3NDksMjUgQEAKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQogCi0jaWZkZWYgTFZNX1BDTQotICAgIGZ3cml0ZShwSW4sCi0gICAgICAgICAgICBmcmFtZUNvdW50KnNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogRkNDXzIsIDEsIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKLSAgICBmZmx1c2gocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOwotI2VuZGlmCiAKLSNpZm5kZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgotICAgIC8qIENvbnZlcnRpbmcgaW5wdXQgZGF0YSBmcm9tIGZpeGVkIHBvaW50IHRvIGZsb2F0IHBvaW50ICovCi0gICAgbWVtY3B5X3RvX2Zsb2F0X2Zyb21faTE2KHBJbnB1dEJ1ZmYsIHBJbiwgZnJhbWVDb3VudCAqIEZDQ18yKTsKLQotICAgIC8qIFByb2Nlc3MgdGhlIHNhbXBsZXMgKi8KLSAgICBMdm1TdGF0dXMgPSBMVk1fUHJvY2VzcyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsIC8qIEluc3RhbmNlIGhhbmRsZSAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBJbnB1dEJ1ZmYsICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogSW5wdXQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcE91dHB1dEJ1ZmYsICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBPdXRwdXQgYnVmZmVyICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKExWTV9VSU5UMTYpZnJhbWVDb3VudCwgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2Ygc2FtcGxlcyB0byByZWFkICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBBdWRpbyBUaW1lICovCi0KLSAgICAvKiBDb252ZXJ0aW5nIG91dHB1dCBkYXRhIGZyb20gZmxvYXQgcG9pbnQgdG8gZml4ZWQgcG9pbnQgKi8KLSAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQocE91dFRtcCwgcE91dHB1dEJ1ZmYsIGZyYW1lQ291bnQgKiBGQ0NfMik7Ci0KLSNlbHNlCiAgICAgLyogUHJvY2VzcyB0aGUgc2FtcGxlcyAqLwogICAgIEx2bVN0YXR1cyA9IExWTV9Qcm9jZXNzKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmhJbnN0YW5jZSwgLyogSW5zdGFuY2UgaGFuZGxlICovCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcEluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJbnB1dCBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwT3V0VG1wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE91dHB1dCBidWZmZXIgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFZNX1VJTlQxNilmcmFtZUNvdW50LCAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBzYW1wbGVzIHRvIHJlYWQgKi8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEF1ZGlvIFRpbWUgKi8KLSNlbmRpZgogICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fUHJvY2VzcyIsICJMdm1CdW5kbGVfcHJvY2VzcyIpCiAgICAgaWYoTHZtU3RhdHVzICE9IExWTV9TVUNDRVNTKSByZXR1cm4gLUVJTlZBTDsKIAotI2lmZGVmIExWTV9QQ00KLSAgICBmd3JpdGUocE91dFRtcCwKLSAgICAgICAgICAgIGZyYW1lQ291bnQqc2l6ZW9mKGVmZmVjdF9idWZmZXJfdCkgKiBGQ0NfMiwgMSwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKLSAgICBmZmx1c2gocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKLSNlbmRpZgogCiAgICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSl7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIEZDQ18yOyBpKyspIHsKLSNpZm5kZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgotICAgICAgICAgICAgcE91dFtpXSA9IGNsYW1wMTYoKExWTV9JTlQzMilwT3V0W2ldICsgKExWTV9JTlQzMilwT3V0VG1wW2ldKTsKLSNlbHNlCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHM7IGkrKykgewogICAgICAgICAgICAgcE91dFtpXSA9IHBPdXRbaV0gKyBwT3V0VG1wW2ldOwotI2VuZGlmCiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIDA7CiB9ICAgIC8qIGVuZCBMdm1CdW5kbGVfcHJvY2VzcyAqLwogCi0jZWxzZSAvLyBCVUlMRF9GTE9BVAotCi1pbnQgTHZtQnVuZGxlX3Byb2Nlc3MoTFZNX0lOVDE2ICAgICAgICAqcEluLAotICAgICAgICAgICAgICAgICAgICAgIExWTV9JTlQxNiAgICAgICAgKnBPdXQsCi0gICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgICAgICBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgIEVmZmVjdENvbnRleHQgICAgKnBDb250ZXh0KSB7Ci0KLSAgICBMVk1fUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXMgPSBMVk1fU1VDQ0VTUzsgICAgICAgICAgICAgICAgLyogRnVuY3Rpb24gY2FsbCBzdGF0dXMgKi8KLSAgICBMVk1fSU5UMTYgICAgICAgICAgICAgICAqcE91dFRtcDsKLQotICAgIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFKXsKLSAgICAgICAgcE91dFRtcCA9IHBPdXQ7Ci0gICAgfSBlbHNlIGlmIChwQ29udGV4dC0+Y29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpewotICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCAhPSBmcmFtZUNvdW50KSB7Ci0gICAgICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+d29ya0J1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZnJlZShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT53b3JrQnVmZmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPQotICAgICAgICAgICAgICAgICAgICAoZWZmZWN0X2J1ZmZlcl90ICopY2FsbG9jKGZyYW1lQ291bnQsIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpICogRkNDXzIpOwotICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJldHVybiAtRU5PTUVNOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7Ci0gICAgICAgIH0KLSAgICAgICAgcE91dFRtcCA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPndvcmtCdWZmZXI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoIkxWTV9FUlJPUiA6IEx2bUJ1bmRsZV9wcm9jZXNzIGludmFsaWQgYWNjZXNzIG1vZGUiKTsKLSAgICAgICAgcmV0dXJuIC1FSU5WQUw7Ci0gICAgfQotCi0jaWZkZWYgTFZNX1BDTQotICAgIGZ3cml0ZShwSW4sIGZyYW1lQ291bnQgKiBzaXplb2YoKnBJbikgKiBGQ0NfMiwKLSAgICAgICAgICAgIDEgLyogbm1lbWIgKi8sIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlBjbUluUHRyKTsKLSAgICBmZmx1c2gocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtSW5QdHIpOwotI2VuZGlmCi0KLSAgICAvL0FMT0dWKCJDYWxsaW5nIExWTV9Qcm9jZXNzIik7Ci0KLSAgICAvKiBQcm9jZXNzIHRoZSBzYW1wbGVzICovCi0gICAgTHZtU3RhdHVzID0gTFZNX1Byb2Nlc3MocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+aEluc3RhbmNlLCAvKiBJbnN0YW5jZSBoYW5kbGUgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwSW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElucHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBPdXRUbXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogT3V0cHV0IGJ1ZmZlciAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChMVk1fVUlOVDE2KWZyYW1lQ291bnQsICAgICAgICAgICAgICAgLyogTnVtYmVyIG9mIHNhbXBsZXMgdG8gcmVhZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQXVkaW8gVGltZSAqLwotCi0gICAgTFZNX0VSUk9SX0NIRUNLKEx2bVN0YXR1cywgIkxWTV9Qcm9jZXNzIiwgIkx2bUJ1bmRsZV9wcm9jZXNzIikKLSAgICBpZihMdm1TdGF0dXMgIT0gTFZNX1NVQ0NFU1MpIHJldHVybiAtRUlOVkFMOwotCi0jaWZkZWYgTFZNX1BDTQotICAgIGZ3cml0ZShwT3V0VG1wLCBmcmFtZUNvdW50ICogc2l6ZW9mKCpwT3V0VG1wKSAqIEZDQ18yLAotICAgICAgICAgICAgMSAvKiBubWVtYiAqLywgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKLSAgICBmZmx1c2gocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+UGNtT3V0UHRyKTsKLSNlbmRpZgotCi0gICAgaWYgKHBDb250ZXh0LT5jb25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSl7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaTxmcmFtZUNvdW50KjI7IGkrKyl7Ci0gICAgICAgICAgICBwT3V0W2ldID0gY2xhbXAxNigoTFZNX0lOVDMyKXBPdXRbaV0gKyAoTFZNX0lOVDMyKXBPdXRUbXBbaV0pOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiAwOwotfSAgICAvKiBlbmQgTHZtQnVuZGxlX3Byb2Nlc3MgKi8KLQotI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCi0KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gRXF1YWxpemVyVXBkYXRlQWN0aXZlUGFyYW1zKCkKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtOTMxLDcgKzc5MCw2IEBACiAgICAgLy9BTE9HVigiXHRFcXVhbGl6ZXJVcGRhdGVBY3RpdmVQYXJhbXMganVzdCBHb3QgLT4gJWRcbiIsCiAgICAgLy8gICAgICAgICAgQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uW2JhbmRdLkdhaW4pOwogCi0KICAgICBmb3IgKGludCBpID0gMDsgaSA8IEZJVkVCQU5EX05VTUJBTkRTOyBpKyspIHsKICAgICAgICAgICAgQWN0aXZlUGFyYW1zLnBFUU5CX0JhbmREZWZpbml0aW9uW2ldLkZyZXF1ZW5jeSA9IEVRTkJfNUJhbmRQcmVzZXRzRnJlcXVlbmNpZXNbaV07CiAgICAgICAgICAgIEFjdGl2ZVBhcmFtcy5wRVFOQl9CYW5kRGVmaW5pdGlvbltpXS5RRmFjdG9yICAgPSBFUU5CXzVCYW5kUHJlc2V0c1FGYWN0b3JzW2ldOwpAQCAtMTIzMiw1MyArMTA5MCw2OSBAQAogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPT0gcENvbmZpZy0+b3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmNoYW5uZWxzID09IHBDb25maWctPm91dHB1dENmZy5jaGFubmVscyk7CiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPmlucHV0Q2ZnLmZvcm1hdCA9PSBwQ29uZmlnLT5vdXRwdXRDZmcuZm9ybWF0KTsKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgQ0hFQ0tfQVJHKGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscykgPD0gTFZNX01BWF9DSEFOTkVMUyk7CisjZWxzZQogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyA9PSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pOworI2VuZGlmCiAgICAgQ0hFQ0tfQVJHKHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1dSSVRFCiAgICAgICAgICAgICAgIHx8IHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpOwogICAgIENIRUNLX0FSRyhwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgPT0gRUZGRUNUX0JVRkZFUl9GT1JNQVQpOwogICAgIHBDb250ZXh0LT5jb25maWcgPSAqcENvbmZpZzsKKyAgICBjb25zdCBMVk1fSU5UMTYgTnJDaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7CiAKICAgICBzd2l0Y2ggKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSkgewogICAgIGNhc2UgODAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184MDAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gODAwMCoyOyAvLyAyIHNlY3MgU3RlcmVvCisgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNQZXJTZWNvbmQgPSA4MDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAxNjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xNjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE2MDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE2MDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAyMjA1MDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18yMjA1MDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDIyMDUwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDIyMDUwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAzMjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18zMjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDMyMDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDMyMDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA0NDEwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180NDEwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ0MTAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ0MTAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA0ODAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ4MDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDQ4MDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7Ci0jaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgY2FzZSA4ODIwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184ODIwMDsKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDg4MjAwICogTnJDaGFubmVsczsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA5NjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU185NjAwMDsKLSAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDk2MDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDk2MDAwICogTnJDaGFubmVsczsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNzY0MDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOworICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gMTc2NDAwICogTnJDaGFubmVsczsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSAxOTIwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTkyMDAwOwotICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kID0gMTkyMDAwKjI7IC8vIDIgc2VjcyBTdGVyZW8KKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCA9IDE5MjAwMCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgIGJyZWFrOwotI2VuZGlmCiAgICAgZGVmYXVsdDoKICAgICAgICAgQUxPR1YoIlx0RWZmZWN0X3NldENvbmZpZyBpbnZhbGlkIHNhbXBsaW5nIHJhdGUgJWQiLCBwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKKyNpZmRlZiBTVVBQT1JUX01DCisgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZVJhdGUgIT0gU2FtcGxlUmF0ZSB8fAorICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5DaE1hc2sgIT0gcENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMpIHsKKyNlbHNlCiAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlUmF0ZSAhPSBTYW1wbGVSYXRlKXsKKyNlbmRpZgogCiAgICAgICAgIExWTV9Db250cm9sUGFyYW1zX3QgICAgIEFjdGl2ZVBhcmFtczsKICAgICAgICAgTFZNX1JldHVyblN0YXR1c19lbiAgICAgTHZtU3RhdHVzID0gTFZNX1NVQ0NFU1M7CkBAIC0xMjk0LDExICsxMTY4LDE5IEBACiAKICAgICAgICAgQWN0aXZlUGFyYW1zLlNhbXBsZVJhdGUgPSBTYW1wbGVSYXRlOwogCisjaWZkZWYgU1VQUE9SVF9NQworICAgICAgICBBY3RpdmVQYXJhbXMuTnJDaGFubmVscyA9IE5yQ2hhbm5lbHM7CisgICAgICAgIEFjdGl2ZVBhcmFtcy5DaE1hc2sgPSBwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVsczsKKyNlbmRpZgorCiAgICAgICAgIEx2bVN0YXR1cyA9IExWTV9TZXRDb250cm9sUGFyYW1ldGVycyhwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5oSW5zdGFuY2UsICZBY3RpdmVQYXJhbXMpOwogCiAgICAgICAgIExWTV9FUlJPUl9DSEVDSyhMdm1TdGF0dXMsICJMVk1fU2V0Q29udHJvbFBhcmFtZXRlcnMiLCAiRWZmZWN0X3NldENvbmZpZyIpCiAgICAgICAgIEFMT0dWKCJcdEVmZmVjdF9zZXRDb25maWcgU3VjY2VzZnVsbHkgY2FsbGVkIExWTV9TZXRDb250cm9sUGFyYW1ldGVyc1xuIik7CiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZVJhdGUgPSBTYW1wbGVSYXRlOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+Q2hNYXNrID0gcENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHM7CisjZW5kaWYKIAogICAgICAgICBMdm1FZmZlY3RfbGltaXRMZXZlbChwQ29udGV4dCk7CiAKQEAgLTE0OTgsNiArMTM4MCw3IEBACiAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORToKICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUzoKICAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQ6CisgICAgLy8gY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U6ICAvLyBGb3IgVVNCIHRlc3Rpbmcgb2YgdGhlIHZpcnR1YWxpemVyIG9ubHkuCiAgICAgICAgIHJldHVybiAwOwogICAgIGRlZmF1bHQgOgogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTE1MjAsMTAgKzE0MDMsOSBAQAogaW50IFZpcnR1YWxpemVySXNDb25maWd1cmF0aW9uU3VwcG9ydGVkKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSkgewogICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7Ci0gICAgaWYgKChjaGFubmVsQ291bnQgPT0gMCkgfHwgKGNoYW5uZWxDb3VudCA+IDIpKSB7CisgICAgaWYgKGNoYW5uZWxDb3VudCA8IDEgfHwgY2hhbm5lbENvdW50ID4gRkNDXzIpIHsgLy8gVE9ETzogdXBkYXRlIHRvIDggY2hhbm5lbHMgd2hlbiBzdXBwb3J0ZWQuCiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KLQogICAgIHJldHVybiBWaXJ0dWFsaXplcklzRGV2aWNlU3VwcG9ydGVkKGRldmljZVR5cGUpOwogfQogCkBAIC0yMDAzLDggKzE4ODUsNiBAQAogICAgIExWTV9SZXR1cm5TdGF0dXNfZW4gICAgIEx2bVN0YXR1cz1MVk1fU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAgICAgTFZNX0lOVDE2ICAgICAgICAgICAgICAgQmFsYW5jZSA9IDA7CiAKLQotCiAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCA9IHBvc2l0aW9uOwogICAgIEJhbGFuY2UgPSBWb2x1bWVDb252ZXJ0U3RlcmVvUG9zaXRpb24ocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+cG9zaXRpb25TYXZlZCk7CiAKQEAgLTIwNDksNyArMTkyOSw2IEBACiAgICAgcmV0dXJuIDA7CiB9ICAgIC8qIGVuZCBWb2x1bWVTZXRTdGVyZW9Qb3NpdGlvbiAqLwogCi0KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gVm9sdW1lR2V0U3RlcmVvUG9zaXRpb24oKQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0yOTIyLDcgKzI4MDEsNiBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9IC8qIGVuZCBWb2x1bWVfZ2V0UGFyYW1ldGVyICovCiAKLQogLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBWb2x1bWVfc2V0UGFyYW1ldGVyKCkKIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzA4NCw4ICsyOTYyLDkgQEAKIAogaW50IEVmZmVjdF9zZXRFbmFibGVkKEVmZmVjdENvbnRleHQgKnBDb250ZXh0LCBib29sIGVuYWJsZWQpCiB7Ci0gICAgQUxPR1YoIlx0RWZmZWN0X3NldEVuYWJsZWQoKSB0eXBlICVkLCBlbmFibGVkICVkIiwgcENvbnRleHQtPkVmZmVjdFR5cGUsIGVuYWJsZWQpOwotCisgICAgQUxPR1YoIiVzIGVmZmVjdFR5cGUgJWQsIGVuYWJsZWQgJWQsIGN1cnJlbnRseSBlbmFibGVkICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICBwQ29udGV4dC0+RWZmZWN0VHlwZSwgZW5hYmxlZCwgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQpOworICAgIGludCAmZWZmZWN0SW5EcmFpbiA9IHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmVmZmVjdEluRHJhaW47CiAgICAgaWYgKGVuYWJsZWQpIHsKICAgICAgICAgLy8gQmFzcyBib29zdCBvciBWaXJ0dWFsaXplciBjYW4gYmUgdGVtcG9yYXJpbHkgZGlzYWJsZWQgaWYgcGxheWluZyBvdmVyIGRldmljZSBzcGVha2VyIGR1ZQogICAgICAgICAvLyB0byB0aGVpciBuYXR1cmUuCkBAIC0zMDk5LDYgKzI5NzgsNyBAQAogICAgICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiIDw9IDApewogICAgICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCsrOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlZmZlY3RJbkRyYWluICY9IH4oMSA8PCBMVk1fQkFTU19CT09TVCk7CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPQogICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCowLjEpOwogICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzRW5hYmxlZCA9IExWTV9UUlVFOwpAQCAtMzExMiw2ICsyOTkyLDcgQEAKICAgICAgICAgICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA8PSAwKXsKICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQrKzsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWZmZWN0SW5EcmFpbiAmPSB+KDEgPDwgTFZNX0VRVUFMSVpFUik7CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPQogICAgICAgICAgICAgICAgICAgICAgKExWTV9JTlQzMikocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1BlclNlY29uZCowLjEpOwogICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID0gTFZNX1RSVUU7CkBAIC0zMTI0LDYgKzMwMDUsNyBAQAogICAgICAgICAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPD0gMCl7CiAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkKys7CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVmZmVjdEluRHJhaW4gJj0gfigxIDw8IExWTV9WSVJUVUFMSVpFUik7CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50VmlydCA9CiAgICAgICAgICAgICAgICAgICAgICAoTFZNX0lOVDMyKShwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzUGVyU2Vjb25kKjAuMSk7CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9IExWTV9UUlVFOwpAQCAtMzEzNCw3ICszMDE2LDEwIEBACiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdEVmZmVjdF9zZXRFbmFibGVkKCkgTFZNX1ZPTFVNRSBpcyBhbHJlYWR5IGVuYWJsZWQiKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkKys7CisgICAgICAgICAgICAgICAgaWYgKChlZmZlY3RJbkRyYWluICYgMSA8PCBMVk1fVk9MVU1FKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVmZmVjdEluRHJhaW4gJj0gfigxIDw8IExWTV9WT0xVTUUpOwogICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWb2x1bWVFbmFibGVkID0gTFZNX1RSVUU7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBkZWZhdWx0OgpAQCAtMzE1Miw2ICszMDM3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJCYXNzRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgICAgICAgICBlZmZlY3RJbkRyYWluIHw9IDEgPDwgTFZNX0JBU1NfQk9PU1Q7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICBjYXNlIExWTV9FUVVBTElaRVI6CiAgICAgICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID09IExWTV9GQUxTRSkgewpAQCAtMzE1OSw2ICszMDQ1LDcgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJFcXVhbGl6ZXJFbmFibGVkID0gTFZNX0ZBTFNFOworICAgICAgICAgICAgICAgIGVmZmVjdEluRHJhaW4gfD0gMSA8PCBMVk1fRVFVQUxJWkVSOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBMVk1fVklSVFVBTElaRVI6CiAgICAgICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPmJWaXJ0dWFsaXplckVuYWJsZWQgPT0gTFZNX0ZBTFNFKSB7CkBAIC0zMTY2LDYgKzMwNTMsNyBAQAogICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YlZpcnR1YWxpemVyRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgICAgICAgICBlZmZlY3RJbkRyYWluIHw9IDEgPDwgTFZNX1ZJUlRVQUxJWkVSOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgY2FzZSBMVk1fVk9MVU1FOgogICAgICAgICAgICAgICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVm9sdW1lRW5hYmxlZCA9PSBMVk1fRkFMU0UpIHsKQEAgLTMxNzMsNiArMzA2MSw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iVm9sdW1lRW5hYmxlZCA9IExWTV9GQUxTRTsKKyAgICAgICAgICAgICAgICBlZmZlY3RJbkRyYWluIHw9IDEgPDwgTFZNX1ZPTFVNRTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0X3NldEVuYWJsZWQoKSBpbnZhbGlkIGVmZmVjdCB0eXBlIik7CkBAIC0zMjE2LDYgKzMxMDUsNyBAQAogICAgIEVmZmVjdENvbnRleHQgKiBwQ29udGV4dCA9IChFZmZlY3RDb250ZXh0ICopIHNlbGY7CiAgICAgaW50ICAgIHN0YXR1cyA9IDA7CiAgICAgaW50ICAgIHByb2Nlc3NTdGF0dXMgPSAwOworICAgIGNvbnN0IGludCBOckNoYW5uZWxzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKHBDb250ZXh0LT5jb25maWcuaW5wdXRDZmcuY2hhbm5lbHMpOwogCiAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzIFN0YXJ0IDogRW5hYmxlZCA9ICVkICAgICBDYWxsZWQgPSAlZCAoJThkICU4ZCAlOGQpIiwKIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQscENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwKQEAgLTMyNDIsMTcgKzMxMzIsNTIgQEAKICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogRWZmZWN0X3Byb2Nlc3MoKSBFUlJPUiBOVUxMIElOUFVUIFBPSU5URVIgT1IgRlJBTUUgQ09VTlQgSVMgV1JPTkciKTsKICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgfQorCisgICAgaW50ICZlZmZlY3RQcm9jZXNzQ2FsbGVkID0gcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+ZWZmZWN0UHJvY2Vzc0NhbGxlZDsKKyAgICBpbnQgJmVmZmVjdEluRHJhaW4gPSBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5lZmZlY3RJbkRyYWluOworICAgIGlmICgoZWZmZWN0UHJvY2Vzc0NhbGxlZCAmIDEgPDwgcENvbnRleHQtPkVmZmVjdFR5cGUpICE9IDApIHsKKyAgICAgICAgQUxPR1coIkVmZmVjdCAlZCBhbHJlYWR5IGNhbGxlZCIsIHBDb250ZXh0LT5FZmZlY3RUeXBlKTsKKyAgICAgICAgY29uc3QgaW50IHVuZHJhaW5lZEVmZmVjdHMgPSBlZmZlY3RJbkRyYWluICYgfmVmZmVjdFByb2Nlc3NDYWxsZWQ7CisgICAgICAgIGlmICgodW5kcmFpbmVkRWZmZWN0cyAmIDEgPDwgTFZNX0JBU1NfQk9PU1QpICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJEcmFpbmluZyBCQVNTX0JPT1NUIik7CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiA9IDA7CisgICAgICAgICAgICAtLXBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkOworICAgICAgICAgICAgZWZmZWN0SW5EcmFpbiAmPSB+KDEgPDwgTFZNX0JBU1NfQk9PU1QpOworICAgICAgICB9CisgICAgICAgIGlmICgodW5kcmFpbmVkRWZmZWN0cyAmIDEgPDwgTFZNX0VRVUFMSVpFUikgIT0gMCkgeworICAgICAgICAgICAgQUxPR1coIkRyYWluaW5nIEVRVUFMSVpFUiIpOworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPSAwOworICAgICAgICAgICAgLS1wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZDsKKyAgICAgICAgICAgIGVmZmVjdEluRHJhaW4gJj0gfigxIDw8IExWTV9FUVVBTElaRVIpOworICAgICAgICB9CisgICAgICAgIGlmICgodW5kcmFpbmVkRWZmZWN0cyAmIDEgPDwgTFZNX1ZJUlRVQUxJWkVSKSAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVygiRHJhaW5pbmcgVklSVFVBTElaRVIiKTsKKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPSAwOworICAgICAgICAgICAgLS1wQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZDsKKyAgICAgICAgICAgIGVmZmVjdEluRHJhaW4gJj0gfigxIDw8IExWTV9WSVJUVUFMSVpFUik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCh1bmRyYWluZWRFZmZlY3RzICYgMSA8PCBMVk1fVk9MVU1FKSAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVygiRHJhaW5pbmcgVk9MVU1FIik7CisgICAgICAgICAgICAtLXBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkOworICAgICAgICAgICAgZWZmZWN0SW5EcmFpbiAmPSB+KDEgPDwgTFZNX1ZPTFVNRSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWZmZWN0UHJvY2Vzc0NhbGxlZCB8PSAxIDw8IHBDb250ZXh0LT5FZmZlY3RUeXBlOworCiAgICAgaWYgKChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5iQmFzc0VuYWJsZWQgPT0gTFZNX0ZBTFNFKSYmCiAgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fQkFTU19CT09TVCkpewogICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgTFZNX0JBU1NfQk9PU1QgRWZmZWN0IGlzIG5vdCBlbmFibGVkIik7CiAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiID4gMCl7Ci0gICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYiAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiAyOyAvLyBTVEVSRU8KKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudEJiIC09IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIE5yQ2hhbm5lbHM7CiAgICAgICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzOiBXYWl0aW5nIHRvIHR1cm4gb2ZmIEJBU1NfQk9PU1QsICVkIHNhbXBsZXMgbGVmdCIsCiAgICAgICAgICAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRCYik7CiAgICAgICAgIH0KLSAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPD0gMCkgeworICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50QmIgPD0gMCkgewogICAgICAgICAgICAgc3RhdHVzID0gLUVOT0RBVEE7Ci0gICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZC0tOworICAgICAgICAgICAgaWYgKChlZmZlY3RJbkRyYWluICYgMSA8PCBMVk1fQkFTU19CT09TVCkgIT0gMCkgeworICAgICAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLS07CisgICAgICAgICAgICAgICAgZWZmZWN0SW5EcmFpbiAmPSB+KDEgPDwgTFZNX0JBU1NfQk9PU1QpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSB0aGlzIGlzIHRoZSBsYXN0IGZyYW1lIGZvciBMVk1fQkFTU19CT09TVCIpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzI2MCwxOSArMzE4NSwyNSBAQAogICAgICAgICAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZPTFVNRSkpewogICAgICAgICAvL0FMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgTFZNX1ZPTFVNRSBFZmZlY3QgaXMgbm90IGVuYWJsZWQiKTsKICAgICAgICAgc3RhdHVzID0gLUVOT0RBVEE7Ci0gICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNFbmFibGVkLS07CisgICAgICAgIGlmICgoZWZmZWN0SW5EcmFpbiAmIDEgPDwgTFZNX1ZPTFVNRSkgIT0gMCkgeworICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQtLTsKKyAgICAgICAgICAgIGVmZmVjdEluRHJhaW4gJj0gfigxIDw8IExWTV9WT0xVTUUpOworICAgICAgICB9CiAgICAgfQogICAgIGlmICgocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+YkVxdWFsaXplckVuYWJsZWQgPT0gTFZNX0ZBTFNFKSYmCiAgICAgICAgIChwQ29udGV4dC0+RWZmZWN0VHlwZSA9PSBMVk1fRVFVQUxJWkVSKSl7CiAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBMVk1fRVFVQUxJWkVSIEVmZmVjdCBpcyBub3QgZW5hYmxlZCIpOwogICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSA+IDApewotICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMjsgLy8gU1RFUkVPCisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSAtPSBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBOckNoYW5uZWxzOwogICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzczogV2FpdGluZyB0byB0dXJuIG9mZiBFUVVBTElaRVIsICVkIHNhbXBsZXMgbGVmdCIsCiAgICAgICAgICAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRFcSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPD0gMCkgeworICAgICAgICBpZiAocENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50RXEgPD0gMCkgewogICAgICAgICAgICAgc3RhdHVzID0gLUVOT0RBVEE7Ci0gICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZC0tOworICAgICAgICAgICAgaWYgKChlZmZlY3RJbkRyYWluICYgMSA8PCBMVk1fRVFVQUxJWkVSKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQtLTsKKyAgICAgICAgICAgICAgICBlZmZlY3RJbkRyYWluICY9IH4oMSA8PCBMVk1fRVFVQUxJWkVSKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCJcdEVmZmVjdF9wcm9jZXNzKCkgdGhpcyBpcyB0aGUgbGFzdCBmcmFtZSBmb3IgTFZNX0VRVUFMSVpFUiIpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzI4MCwxMyArMzIxMSwxNyBAQAogICAgICAgICAocENvbnRleHQtPkVmZmVjdFR5cGUgPT0gTFZNX1ZJUlRVQUxJWkVSKSl7CiAgICAgICAgIC8vQUxPR1YoIlx0RWZmZWN0X3Byb2Nlc3MoKSBMVk1fVklSVFVBTElaRVIgRWZmZWN0IGlzIG5vdCBlbmFibGVkIik7CiAgICAgICAgIGlmKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPiAwKXsKLSAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgLT0gb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogMjsvLyBTVEVSRU8KKyAgICAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgLT0KKyAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQgKiBOckNoYW5uZWxzOwogICAgICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzczogV2FpdGluZyBmb3IgdG8gdHVybiBvZmYgVklSVFVBTElaRVIsICVkIHNhbXBsZXMgbGVmdCIsCiAgICAgICAgICAgICAvLyAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0KTsKICAgICAgICAgfQotICAgICAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5TYW1wbGVzVG9FeGl0Q291bnRWaXJ0IDw9IDApIHsKKyAgICAgICAgaWYgKHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPlNhbXBsZXNUb0V4aXRDb3VudFZpcnQgPD0gMCkgewogICAgICAgICAgICAgc3RhdHVzID0gLUVOT0RBVEE7Ci0gICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZC0tOworICAgICAgICAgICAgaWYgKChlZmZlY3RJbkRyYWluICYgMSA8PCBMVk1fVklSVFVBTElaRVIpICE9IDApIHsKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZC0tOworICAgICAgICAgICAgICAgIGVmZmVjdEluRHJhaW4gJj0gfigxIDw8IExWTV9WSVJUVUFMSVpFUik7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigiXHRFZmZlY3RfcHJvY2VzcygpIHRoaXMgaXMgdGhlIGxhc3QgZnJhbWUgZm9yIExWTV9WSVJUVUFMSVpFUiIpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzI5NSw4ICszMjMwLDE4IEBACiAgICAgICAgIHBDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQrKzsKICAgICB9CiAKLSAgICBpZihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkID09Ci0gICAgICAgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQpeworICAgIGlmIChwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkID49CisgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCkgeworCisgICAgICAgIC8vIFdlIGV4cGVjdCB0aGUgIyBlZmZlY3RzIGNhbGxlZCB0byBiZSBlcXVhbCB0byAjIGVmZmVjdHMgZW5hYmxlZCBpbiBzZXF1ZW5jZSAoaW5jbHVkaW5nCisgICAgICAgIC8vIGRyYWluaW5nIGVmZmVjdHMpLiAgV2FybiBpZiB0aGlzIGlzIG5vdCB0aGUgY2FzZSBkdWUgdG8gaW5jb25zaXN0ZW50IGNhbGxzLgorICAgICAgICBBTE9HV19JRihwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkID4KKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCwKKyAgICAgICAgICAgICAgICAiJXMgTnVtYmVyIG9mIGVmZmVjdHMgY2FsbGVkICVkIGlzIGdyZWF0ZXIgdGhhbiBudW1iZXIgb2YgZWZmZWN0cyBlbmFibGVkICVkIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwKKyAgICAgICAgICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzRW5hYmxlZCk7CisgICAgICAgIGVmZmVjdFByb2Nlc3NDYWxsZWQgPSAwOyAvLyByZXNldCBvdXIgY29uc2lzdGVuY3kgY2hlY2suCisKICAgICAgICAgLy9BTE9HVigiXHRFZmZlY3RfcHJvY2VzcyAgICAgQ2FsbGluZyBwcm9jZXNzIHdpdGggJWQgZWZmZWN0cyBlbmFibGVkLCAlZCBjYWxsZWQ6IEVmZmVjdCAlZCIsCiAgICAgICAgIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0VuYWJsZWQsCiAgICAgICAgIC8vcENvbnRleHQtPnBCdW5kbGVkQ29udGV4dC0+TnVtYmVyRWZmZWN0c0NhbGxlZCwgcENvbnRleHQtPkVmZmVjdFR5cGUpOwpAQCAtMzMwNywxNyArMzI1MiwxMCBAQAogICAgICAgICBwQ29udGV4dC0+cEJ1bmRsZWRDb250ZXh0LT5OdW1iZXJFZmZlY3RzQ2FsbGVkID0gMDsKICAgICAgICAgLyogUHJvY2VzcyBhbGwgdGhlIGF2YWlsYWJsZSBmcmFtZXMsIGJsb2NrIHByb2Nlc3NpbmcgaXMKICAgICAgICAgICAgaGFuZGxlZCBpbnRlcm5hbExZIGJ5IHRoZSBMVk0gYnVuZGxlICovCi0jaWZkZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgogICAgICAgICBwcm9jZXNzU3RhdHVzID0gYW5kcm9pZDo6THZtQnVuZGxlX3Byb2Nlc3MoaW5CdWZmZXItPmYzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZjMyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQpOwotI2Vsc2UKLSAgICAgICAgcHJvY2Vzc1N0YXR1cyA9IGFuZHJvaWQ6Okx2bUJ1bmRsZV9wcm9jZXNzKGluQnVmZmVyLT5zMTYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPnMxNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBDb250ZXh0KTsKLSNlbmRpZgogICAgICAgICBpZiAocHJvY2Vzc1N0YXR1cyAhPSAwKXsKICAgICAgICAgICAgIEFMT0dWKCJcdExWTV9FUlJPUiA6IEx2bUJ1bmRsZV9wcm9jZXNzIHJldHVybmVkIGVycm9yICVkIiwgcHJvY2Vzc1N0YXR1cyk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzID09IDApIHsKQEAgLTMzMzEsMTIgKzMyNjksOCBAQAogICAgICAgICAvL3BDb250ZXh0LT5wQnVuZGxlZENvbnRleHQtPk51bWJlckVmZmVjdHNDYWxsZWQsIHBDb250ZXh0LT5FZmZlY3RUeXBlKTsKIAogICAgICAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIEZDQ18yOyArK2kpewotI2lmZGVmIE5BVElWRV9GTE9BVF9CVUZGRVIKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0QnVmZmVyLT5mcmFtZUNvdW50ICogTnJDaGFubmVsczsgKytpKSB7CiAgICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5mMzJbaV0gKz0gaW5CdWZmZXItPmYzMltpXTsKLSNlbHNlCi0gICAgICAgICAgICAgICAgb3V0QnVmZmVyLT5zMTZbaV0gPSBjbGFtcDE2KChMVk1fSU5UMzIpb3V0QnVmZmVyLT5zMTZbaV0gKyBpbkJ1ZmZlci0+czE2W2ldKTsKLSNlbmRpZgogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKG91dEJ1ZmZlci0+cmF3ICE9IGluQnVmZmVyLT5yYXcpIHsKICAgICAgICAgICAgIG1lbWNweShvdXRCdWZmZXItPnJhdywKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvQnVuZGxlL0VmZmVjdEJ1bmRsZS5oIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKaW5kZXggNmJmMDQ1ZC4uNTI0ZTEwMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9CdW5kbGUvRWZmZWN0QnVuZGxlLmgKQEAgLTIzLDEwICsyMyw2IEBACiAjaW5jbHVkZSA8TFZNLmg+CiAjaW5jbHVkZSA8bGltaXRzLmg+CiAKLSNpZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQogI2RlZmluZSBGSVZFQkFORF9OVU1CQU5EUyAgICAgICAgICA1CiAjZGVmaW5lIE1BWF9OVU1fQkFORFMgICAgICAgICAgICAgIDUKICNkZWZpbmUgTUFYX0NBTExfU0laRSAgICAgICAgICAgICAgMjU2CkBAIC0zNyw3ICszMyw2IEBACiAjZGVmaW5lIEVRVUFMSVpFUl9DVVBfTE9BRF9BUk05RSAgIDIyMCAgICAvLyBFeHByZXNzZWQgaW4gMC4xIE1JUFMKICNkZWZpbmUgVk9MVU1FX0NVUF9MT0FEX0FSTTlFICAgICAgMCAgICAgIC8vIEV4cHJlc3NlZCBpbiAwLjEgTUlQUwogI2RlZmluZSBCVU5ETEVfTUVNX1VTQUdFICAgICAgICAgICAyNSAgICAgLy8gRXhwcmVzc2VkIGluIGtCCi0vLyNkZWZpbmUgTFZNX1BDTQogCiAjaWZuZGVmIE9QRU5TTF9FU19IXwogc3RhdGljIGNvbnN0IGVmZmVjdF91dWlkX3QgU0xfSUlEX1ZPTFVNRV8gPSB7IDB4MDllOGVkZTAsIDB4ZGRkZSwgMHgxMWRiLCAweGI0ZjYsCkBAIC05OSwxNCArOTQsMTcgQEAKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQ7CiAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICAgICAgICBiYW5kR2FpbmRCW0ZJVkVCQU5EX05VTUJBTkRTXTsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZTsKLSAgICAjaWZkZWYgTFZNX1BDTQotICAgIEZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBjbUluUHRyOwotICAgIEZJTEUgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlBjbU91dFB0cjsKLSAgICAjZW5kaWYKLSNpZiBkZWZpbmVkKEJVSUxEX0ZMT0FUKSAmJiAhZGVmaW5lZChOQVRJVkVfRkxPQVRfQlVGRkVSKQotICAgIExWTV9GTE9BVCAgICAgICAgICAgICAgICAgICAgICAgKnBJbnB1dEJ1ZmZlcjsKLSAgICBMVk1fRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICpwT3V0cHV0QnVmZmVyOworI2lmZGVmIFNVUFBPUlRfTUMKKyAgICBMVk1fSU5UMzIgICAgICAgICAgICAgICAgICAgICAgIENoTWFzazsKICNlbmRpZgorCisgICAgLyogQml0bWFzayB3aGV0aGVyIGRyYWluIGlzIGluIHByb2dyZXNzIGR1ZSB0byBkaXNhYmxpbmcgdGhlIGVmZmVjdC4KKyAgICAgICBUaGUgY29ycmVzcG9uZGluZyBiaXQgdG8gYW4gZWZmZWN0IGlzIHNldCBieSAxIDw8IGx2bV9lZmZlY3RfZW4uICovCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RJbkRyYWluOworCisgICAgLyogQml0bWFzayB3aGV0aGVyIHByb2Nlc3MoKSB3YXMgY2FsbGVkIGZvciBhIHBhcnRpY3VsYXIgZWZmZWN0LgorICAgICAgIFRoZSBjb3JyZXNwb25kaW5nIGJpdCB0byBhbiBlZmZlY3QgaXMgc2V0IGJ5IDEgPDwgbHZtX2VmZmVjdF9lbi4gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdFByb2Nlc3NDYWxsZWQ7CiB9OwogCiAvKiBTZXNzaW9uQ29udGV4dCA6IE9uZSBzZXNzaW9uICovCkBAIC0xMjYsNyArMTI0LDYgQEAKICAgICBCdW5kbGVkRWZmZWN0Q29udGV4dCAgICAgICAgICAgICpwQnVuZGxlZENvbnRleHQ7CiB9OwogCi0KIC8qIGVudW1lcmF0ZWQgcGFyYW1ldGVyIHNldHRpbmdzIGZvciBWb2x1bWUgZWZmZWN0ICovCiB0eXBlZGVmIGVudW0KIHsKQEAgLTIxNyw5ICsyMTQsNCBAQAogCiBzdGF0aWMgY29uc3QgZmxvYXQgTGltaXRMZXZlbF92aXJ0dWFsaXplckNvbnRyaWJ1dGlvbiA9IDEuOTsKIAotI2lmIF9fY3BsdXNwbHVzCi19ICAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotCiAjZW5kaWYgLypBTkRST0lEX0VGRkVDVEJVTkRMRV9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwIGIvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmNwcAppbmRleCBkNTU4MTY5Li4zOWY1YmI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuY3BwCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvbHZtL3dyYXBwZXIvUmV2ZXJiL0VmZmVjdFJldmVyYi5jcHAKQEAgLTc5LDcgKzc5LDYgQEAKICAgICAgICAgey00MDAsIC0yMDAsIDEzMDAsIDkwMCwgMCwgMiwgMCwgMTAsIDEwMDAsIDc1MH0sCiB9OwogCi0KIC8vIE5YUCBTVyBhdXhpbGlhcnkgZW52aXJvbm1lbnRhbCByZXZlcmIKIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgZ0F1eEVudlJldmVyYkRlc2NyaXB0b3IgPSB7CiAgICAgICAgIHsgMHhjMmU1ZDVmMCwgMHg5NGJkLCAweDQ3NjMsIDB4OWNhYywgeyAweDRlLCAweDIzLCAweDRkLCAweDA2LCAweDgzLCAweDllIH0gfSwKQEAgLTEzNiwxMSArMTM1LDcgQEAKICAgICAgICAgJmdJbnNlcnRQcmVzZXRSZXZlcmJEZXNjcmlwdG9yCiB9OwogCi0jaWZkZWYgQlVJTERfRkxPQVQKIHR5cGVkZWYgICAgIGZsb2F0ICAgICAgICAgICAgICAgcHJvY2Vzc19idWZmZXJfdDsgLy8gcHJvY2VzcyBpbiBmbG9hdAotI2Vsc2UKLXR5cGVkZWYgICAgIGludDMyX3QgICAgICAgICAgICAgcHJvY2Vzc19idWZmZXJfdDsgLy8gcHJvY2VzcyBpbiBRNF8yNwotI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAKIHN0cnVjdCBSZXZlcmJDb250ZXh0ewogICAgIGNvbnN0IHN0cnVjdCBlZmZlY3RfaW50ZXJmYWNlX3MgKml0ZmU7CkBAIC0xNTQsMTAgKzE0OSw2IEBACiAgICAgaW50MTZfdCAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlZERpZmZ1c2lvbjsKICAgICBpbnQxNl90ICAgICAgICAgICAgICAgICAgICAgICAgIFNhdmVkRGVuc2l0eTsKICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJFbmFibGVkOwotICAgICNpZmRlZiBMVk1fUENNCi0gICAgRklMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUGNtSW5QdHI7Ci0gICAgRklMRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAqUGNtT3V0UHRyOwotICAgICNlbmRpZgogICAgIExWTV9Gc19lbiAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlUmF0ZTsKICAgICBwcm9jZXNzX2J1ZmZlcl90ICAgICAgICAgICAgICAgICpJbkZyYW1lczsKICAgICBwcm9jZXNzX2J1ZmZlcl90ICAgICAgICAgICAgICAgICpPdXRGcmFtZXM7CkBAIC0xODMsMTEgKzE3NCw3IEBACiAKICNkZWZpbmUgUkVWRVJCX0RFRkFVTFRfUFJFU0VUIFJFVkVSQl9QUkVTRVRfTk9ORQogCi0jaWZkZWYgQlVJTERfRkxPQVQKICNkZWZpbmUgUkVWRVJCX1NFTkRfTEVWRUwgICAwLjc1ZiAvLyAwLjc1IGluIDQuMTIgZm9ybWF0Ci0jZWxzZQotI2RlZmluZSBSRVZFUkJfU0VORF9MRVZFTCAgICgweDBDMDApIC8vIDAuNzUgaW4gNC4xMiBmb3JtYXQKLSNlbmRpZgogI2RlZmluZSBSRVZFUkJfVU5JVF9WT0xVTUUgICgweDEwMDApIC8vIDEuMCBpbiA0LjEyIGZvcm1hdAogCiAvLy0tLSBsb2NhbCBmdW5jdGlvbiBwcm90b3R5cGVzCkBAIC0yNjksMTggKzI1Niw2IEBACiAKICAgICAqcEhhbmRsZSA9IChlZmZlY3RfaGFuZGxlX3QpcENvbnRleHQ7CiAKLSNpZmRlZiBMVk1fUENNCi0gICAgcENvbnRleHQtPlBjbUluUHRyID0gTlVMTDsKLSAgICBwQ29udGV4dC0+UGNtT3V0UHRyID0gTlVMTDsKLQotICAgIHBDb250ZXh0LT5QY21JblB0ciAgPSBmb3BlbigiL2RhdGEvdG1wL3JldmVyYl9wY21faW4ucGNtIiwgInciKTsKLSAgICBwQ29udGV4dC0+UGNtT3V0UHRyID0gZm9wZW4oIi9kYXRhL3RtcC9yZXZlcmJfcGNtX291dC5wY20iLCAidyIpOwotCi0gICAgaWYoKHBDb250ZXh0LT5QY21JblB0ciAgPT0gTlVMTCl8fAotICAgICAgIChwQ29udGV4dC0+UGNtT3V0UHRyID09IE5VTEwpKXsKLSAgICAgICByZXR1cm4gLUVJTlZBTDsKLSAgICB9Ci0jZW5kaWYKIAogICAgIGludCBjaGFubmVscyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29udGV4dC0+Y29uZmlnLmlucHV0Q2ZnLmNoYW5uZWxzKTsKIApAQCAtMzA0LDEwICsyNzksNiBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSAgICAjaWZkZWYgTFZNX1BDTQotICAgIGZjbG9zZShwQ29udGV4dC0+UGNtSW5QdHIpOwotICAgIGZjbG9zZShwQ29udGV4dC0+UGNtT3V0UHRyKTsKLSAgICAjZW5kaWYKICAgICBmcmVlKHBDb250ZXh0LT5JbkZyYW1lcyk7CiAgICAgZnJlZShwQ29udGV4dC0+T3V0RnJhbWVzKTsKICAgICBwQ29udGV4dC0+YnVmZmVyU2l6ZUluID0gMDsKQEAgLTM3OCw3ICszNDksNiBAQAogICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICB9CiAKLSNpZmRlZiBCVUlMRF9GTE9BVAogICAgIHNpemVfdCBpblNpemUgPSBmcmFtZUNvdW50ICogc2l6ZW9mKHByb2Nlc3NfYnVmZmVyX3QpICogY2hhbm5lbHM7CiAgICAgc2l6ZV90IG91dFNpemUgPSBmcmFtZUNvdW50ICogc2l6ZW9mKHByb2Nlc3NfYnVmZmVyX3QpICogRkNDXzI7CiAgICAgaWYgKHBDb250ZXh0LT5JbkZyYW1lcyA9PSBOVUxMIHx8CkBAIC0zOTQsMTAgKzM2NCw2IEBACiAgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXMgPSAocHJvY2Vzc19idWZmZXJfdCAqKWNhbGxvYygxLCBwQ29udGV4dC0+YnVmZmVyU2l6ZU91dCk7CiAgICAgfQogCi0jaWZuZGVmIE5BVElWRV9GTE9BVF9CVUZGRVIKLSAgICBlZmZlY3RfYnVmZmVyX3QgKiBjb25zdCBPdXRGcmFtZXMxNiA9IChlZmZlY3RfYnVmZmVyX3QgKilwQ29udGV4dC0+T3V0RnJhbWVzOwotI2VuZGlmCi0jZW5kaWYKIAogICAgIC8vIENoZWNrIGZvciBOVUxMIHBvaW50ZXJzCiAgICAgaWYgKChwQ29udGV4dC0+SW5GcmFtZXMgPT0gTlVMTCkgfHwgKHBDb250ZXh0LT5PdXRGcmFtZXMgPT0gTlVMTCkpIHsKQEAgLTQwNSw0NyArMzcxLDIwIEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAotI2lmZGVmIExWTV9QQ00KLSAgICBmd3JpdGUocEluLCBmcmFtZUNvdW50ICogc2l6ZW9mKCpwSW4pICogY2hhbm5lbHMsIDEgLyogbm1lbWIgKi8sIHBDb250ZXh0LT5QY21JblB0cik7Ci0gICAgZmZsdXNoKHBDb250ZXh0LT5QY21JblB0cik7Ci0jZW5kaWYKIAogICAgIGlmIChwQ29udGV4dC0+cHJlc2V0ICYmIHBDb250ZXh0LT5uZXh0UHJlc2V0ICE9IHBDb250ZXh0LT5jdXJQcmVzZXQpIHsKICAgICAgICAgUmV2ZXJiX0xvYWRQcmVzZXQocENvbnRleHQpOwogICAgIH0KIAogICAgIGlmIChwQ29udGV4dC0+YXV4aWxpYXJ5KSB7Ci0jaWZkZWYgQlVJTERfRkxPQVQKLSNpZmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCiAgICAgICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zYW1lPGRlY2x0eXBlKCpwSW4pLCBkZWNsdHlwZSgqcENvbnRleHQtPkluRnJhbWVzKT46OnZhbHVlLAogICAgICAgICAgICAgICAgICJwSW4gYW5kIEluRnJhbWVzIG11c3QgYmUgc2FtZSB0eXBlIik7CiAgICAgICAgIG1lbWNweShwQ29udGV4dC0+SW5GcmFtZXMsIHBJbiwgZnJhbWVDb3VudCAqIGNoYW5uZWxzICogc2l6ZW9mKCpwSW4pKTsKLSNlbHNlCi0gICAgICAgIG1lbWNweV90b19mbG9hdF9mcm9tX2kxNigKLSAgICAgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXMsIHBJbiwgZnJhbWVDb3VudCAqIGNoYW5uZWxzKTsKLSNlbmRpZgotI2Vsc2UgLy9ubyBCVUlMRF9GTE9BVAotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQgKiBjaGFubmVsczsgaSsrKSB7Ci0gICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXNbaV0gPSAocHJvY2Vzc19idWZmZXJfdClwSW5baV08PDg7Ci0gICAgICAgIH0KLSNlbmRpZgogICAgICAgICB9IGVsc2UgewogICAgICAgICAvLyBpbnNlcnQgcmV2ZXJiIGlucHV0IGlzIGFsd2F5cyBzdGVyZW8KICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50OyBpKyspIHsKLSNpZmRlZiBCVUlMRF9GTE9BVAotI2lmZGVmIE5BVElWRV9GTE9BVF9CVUZGRVIKICAgICAgICAgICAgIHBDb250ZXh0LT5JbkZyYW1lc1syICogaV0gPSAocHJvY2Vzc19idWZmZXJfdClwSW5bMiAqIGldICogUkVWRVJCX1NFTkRfTEVWRUw7CiAgICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXNbMiAqIGkgKyAxXSA9IChwcm9jZXNzX2J1ZmZlcl90KXBJblsyICogaSArIDFdICogUkVWRVJCX1NFTkRfTEVWRUw7Ci0jZWxzZQotICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzWzIgKiBpXSA9Ci0gICAgICAgICAgICAgICAgICAgIChwcm9jZXNzX2J1ZmZlcl90KXBJblsyICogaV0gKiBSRVZFUkJfU0VORF9MRVZFTCAvIDMyNzY4LjBmOwotICAgICAgICAgICAgcENvbnRleHQtPkluRnJhbWVzWzIgKiBpICsgMV0gPQotICAgICAgICAgICAgICAgICAgICAocHJvY2Vzc19idWZmZXJfdClwSW5bMiAqIGkgKyAxXSAqIFJFVkVSQl9TRU5EX0xFVkVMIC8gMzI3NjguMGY7Ci0jZW5kaWYKLSNlbHNlCi0gICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXNbMippXSA9IChwSW5bMippXSAqIFJFVkVSQl9TRU5EX0xFVkVMKSA+PiA0OyAvLyA8PDggKyA+PjEyCi0gICAgICAgICAgICBwQ29udGV4dC0+SW5GcmFtZXNbMippKzFdID0gKHBJblsyKmkrMV0gKiBSRVZFUkJfU0VORF9MRVZFTCkgPj4gNDsgLy8gPDw4ICsgPj4xMgotI2VuZGlmCiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ3MSw0MyArNDEwLDE2IEBACiAKICAgICAvLyBDb252ZXJ0IHRvIDE2IGJpdHMKICAgICBpZiAocENvbnRleHQtPmF1eGlsaWFyeSkgewotI2lmZGVmIEJVSUxEX0ZMT0FUCiAgICAgICAgIC8vIG5vdGhpbmcgdG8gZG8gaGVyZQotI2lmbmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCi0gICAgICAgIC8vIHBDb250ZXh0LT5PdXRGcmFtZXMgYW5kIE91dEZyYW1lczE2IHBvaW50IHRvIHRoZSBzYW1lIGJ1ZmZlcgotICAgICAgICAvLyBtYWtlIHN1cmUgdGhlIGZsb2F0IHRvIGludCBjb252ZXJzaW9uIGhhcHBlbnMgaW4gdGhlIHJpZ2h0IG9yZGVyLgotICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fZmxvYXQoT3V0RnJhbWVzMTYsIHBDb250ZXh0LT5PdXRGcmFtZXMsCi0gICAgICAgICAgICAgICAgKHNpemVfdClmcmFtZUNvdW50ICogRkNDXzIpOwotI2VuZGlmCi0jZWxzZQotICAgICAgICBtZW1jcHlfdG9faTE2X2Zyb21fcTRfMjcoT3V0RnJhbWVzMTYsIHBDb250ZXh0LT5PdXRGcmFtZXMsIChzaXplX3QpZnJhbWVDb3VudCAqIEZDQ18yKTsKLSNlbmRpZgogICAgIH0gZWxzZSB7Ci0jaWZkZWYgQlVJTERfRkxPQVQKLSNpZmRlZiBOQVRJVkVfRkxPQVRfQlVGRkVSCiAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudCAqIEZDQ18yOyBpKyspIHsgLy8gYWx3YXlzIHN0ZXJlbyBoZXJlCiAgICAgICAgICAgICAvLyBNaXggd2l0aCBkcnkgaW5wdXQKICAgICAgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXNbaV0gKz0gcEluW2ldOwogICAgICAgICB9Ci0jZWxzZQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQgKiBGQ0NfMjsgaSsrKSB7IC8vIGFsd2F5cyBzdGVyZW8gaGVyZQotICAgICAgICAgICAgLy8gcE91dHB1dEJ1ZmYgYW5kIE91dEZyYW1lczE2IHBvaW50IHRvIHRoZSBzYW1lIGJ1ZmZlcgotICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoZSBmbG9hdCB0byBpbnQgY29udmVyc2lvbiBoYXBwZW5zIGluIHRoZSByaWdodCBvcmRlci4KLSAgICAgICAgICAgIHBDb250ZXh0LT5PdXRGcmFtZXNbaV0gKz0gKHByb2Nlc3NfYnVmZmVyX3QpcEluW2ldIC8gMzI3NjguMGY7Ci0gICAgICAgIH0KLSAgICAgICAgbWVtY3B5X3RvX2kxNl9mcm9tX2Zsb2F0KE91dEZyYW1lczE2LCBwQ29udGV4dC0+T3V0RnJhbWVzLAotICAgICAgICAgICAgICAgIChzaXplX3QpZnJhbWVDb3VudCAqIEZDQ18yKTsKLSNlbmRpZgotI2Vsc2UKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgZnJhbWVDb3VudCAqIEZDQ18yOyBpKyspIHsgLy8gYWx3YXlzIHN0ZXJlbyBoZXJlCi0gICAgICAgICAgICBPdXRGcmFtZXMxNltpXSA9IGNsYW1wMTYoKHBDb250ZXh0LT5PdXRGcmFtZXNbaV0+PjgpICsgKHByb2Nlc3NfYnVmZmVyX3QpcEluW2ldKTsKLSAgICAgICAgfQotI2VuZGlmCiAgICAgICAgIC8vIGFwcGx5IHZvbHVtZSB3aXRoIHJhbXAgaWYgbmVlZGVkCiAgICAgICAgIGlmICgocENvbnRleHQtPmxlZnRWb2x1bWUgIT0gcENvbnRleHQtPnByZXZMZWZ0Vm9sdW1lIHx8CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPnJpZ2h0Vm9sdW1lICE9IHBDb250ZXh0LT5wcmV2UmlnaHRWb2x1bWUpICYmCiAgICAgICAgICAgICAgICAgcENvbnRleHQtPnZvbHVtZU1vZGUgPT0gUkVWRVJCX1ZPTFVNRV9SQU1QKSB7Ci0jaWYgZGVmaW5lZCAoQlVJTERfRkxPQVQpICYmIGRlZmluZWQgKE5BVElWRV9GTE9BVF9CVUZGRVIpCiAgICAgICAgICAgICAvLyBGSVhNRTogc3RpbGwgdXNpbmcgaW50MTYgdm9sdW1lcy4KICAgICAgICAgICAgIC8vIEZvciByZWZlcmVuY2U6IFJFVkVSQl9VTklUX1ZPTFVNRSAgKDB4MTAwMCkgLy8gMS4wIGluIDQuMTIgZm9ybWF0CiAgICAgICAgICAgICBmbG9hdCB2bCA9IChmbG9hdClwQ29udGV4dC0+cHJldkxlZnRWb2x1bWUgLyA0MDk2OwpAQCAtNTIyLDM3ICs0MzQsMTQgQEAKICAgICAgICAgICAgICAgICB2bCArPSBpbmNsOwogICAgICAgICAgICAgICAgIHZyICs9IGluY3I7CiAgICAgICAgICAgICB9Ci0jZWxzZQotICAgICAgICAgICAgTFZNX0lOVDMyIHZsID0gKExWTV9JTlQzMilwQ29udGV4dC0+cHJldkxlZnRWb2x1bWUgPDwgMTY7Ci0gICAgICAgICAgICBMVk1fSU5UMzIgaW5jbCA9ICgoKExWTV9JTlQzMilwQ29udGV4dC0+bGVmdFZvbHVtZSA8PCAxNikgLSB2bCkgLyBmcmFtZUNvdW50OwotICAgICAgICAgICAgTFZNX0lOVDMyIHZyID0gKExWTV9JTlQzMilwQ29udGV4dC0+cHJldlJpZ2h0Vm9sdW1lIDw8IDE2OwotICAgICAgICAgICAgTFZNX0lOVDMyIGluY3IgPSAoKChMVk1fSU5UMzIpcENvbnRleHQtPnJpZ2h0Vm9sdW1lIDw8IDE2KSAtIHZyKSAvIGZyYW1lQ291bnQ7Ci0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZnJhbWVDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgT3V0RnJhbWVzMTZbRkNDXzIgKiBpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjbGFtcDE2KChMVk1fSU5UMzIpKCh2bCA+PiAxNikgKiBPdXRGcmFtZXMxNlsyKmldKSA+PiAxMik7Ci0gICAgICAgICAgICAgICAgT3V0RnJhbWVzMTZbRkNDXzIgKiBpICsgMV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgY2xhbXAxNigoTFZNX0lOVDMyKSgodnIgPj4gMTYpICogT3V0RnJhbWVzMTZbMippKzFdKSA+PiAxMik7Ci0KLSAgICAgICAgICAgICAgICB2bCArPSBpbmNsOwotICAgICAgICAgICAgICAgIHZyICs9IGluY3I7Ci0gICAgICAgICAgICB9Ci0jZW5kaWYKICAgICAgICAgICAgIHBDb250ZXh0LT5wcmV2TGVmdFZvbHVtZSA9IHBDb250ZXh0LT5sZWZ0Vm9sdW1lOwogICAgICAgICAgICAgcENvbnRleHQtPnByZXZSaWdodFZvbHVtZSA9IHBDb250ZXh0LT5yaWdodFZvbHVtZTsKICAgICAgICAgfSBlbHNlIGlmIChwQ29udGV4dC0+dm9sdW1lTW9kZSAhPSBSRVZFUkJfVk9MVU1FX09GRikgewogICAgICAgICAgICAgaWYgKHBDb250ZXh0LT5sZWZ0Vm9sdW1lICE9IFJFVkVSQl9VTklUX1ZPTFVNRSB8fAogICAgICAgICAgICAgICAgIHBDb250ZXh0LT5yaWdodFZvbHVtZSAhPSBSRVZFUkJfVU5JVF9WT0xVTUUpIHsKICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZyYW1lQ291bnQ7IGkrKykgewotI2lmIGRlZmluZWQoQlVJTERfRkxPQVQpICYmIGRlZmluZWQoTkFUSVZFX0ZMT0FUX0JVRkZFUikKICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPk91dEZyYW1lc1tGQ0NfMiAqIGldICo9ICgoZmxvYXQpcENvbnRleHQtPmxlZnRWb2x1bWUgLyA0MDk2KTsKICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQtPk91dEZyYW1lc1tGQ0NfMiAqIGkgKyAxXSAqPSAoKGZsb2F0KXBDb250ZXh0LT5yaWdodFZvbHVtZSAvIDQwOTYpOwotI2Vsc2UKLSAgICAgICAgICAgICAgICAgICAgT3V0RnJhbWVzMTZbRkNDXzIgKiBpXSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xhbXAxNigoTFZNX0lOVDMyKShwQ29udGV4dC0+bGVmdFZvbHVtZSAqIE91dEZyYW1lczE2WzIqaV0pID4+IDEyKTsKLSAgICAgICAgICAgICAgICAgICAgT3V0RnJhbWVzMTZbRkNDXzIgKiBpICsgMV0gPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYW1wMTYoKExWTV9JTlQzMikocENvbnRleHQtPnJpZ2h0Vm9sdW1lICogT3V0RnJhbWVzMTZbMippKzFdKSA+PiAxMik7Ci0jZW5kaWYKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBwQ29udGV4dC0+cHJldkxlZnRWb2x1bWUgPSBwQ29udGV4dC0+bGVmdFZvbHVtZTsKQEAgLTU2MSwyMSArNDUwLDEyIEBACiAgICAgICAgIH0KICAgICB9CiAKLSNpZmRlZiBMVk1fUENNCi0gICAgZndyaXRlKHBDb250ZXh0LT5PdXRGcmFtZXMsIGZyYW1lQ291bnQgKiBzaXplb2YoKnBDb250ZXh0LT5PdXRGcmFtZXMpICogRkNDXzIsCi0gICAgICAgICAgICAxIC8qIG5tZW1iICovLCBwQ29udGV4dC0+UGNtT3V0UHRyKTsKLSAgICBmZmx1c2gocENvbnRleHQtPlBjbU91dFB0cik7Ci0jZW5kaWYKIAogICAgIC8vIEFjY3VtdWxhdGUgaWYgcmVxdWlyZWQKICAgICBpZiAocENvbnRleHQtPmNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9PSBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19BQ0NVTVVMQVRFKXsKICAgICAgICAgLy9BTE9HVigiXHRCdWZmZXIgYWNjZXNzIGlzIEFDQ1VNVUxBVEUiKTsKICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmcmFtZUNvdW50ICogRkNDXzI7IGkrKykgeyAvLyBhbHdheXMgc3RlcmVvIGhlcmUKLSNpZm5kZWYgTkFUSVZFX0ZMT0FUX0JVRkZFUgotICAgICAgICAgICAgcE91dFtpXSA9IGNsYW1wMTYoKGludDMyX3QpcE91dFtpXSArIChpbnQzMl90KU91dEZyYW1lczE2W2ldKTsKLSNlbHNlCiAgICAgICAgICAgICBwT3V0W2ldICs9IHBDb250ZXh0LT5PdXRGcmFtZXNbaV07Ci0jZW5kaWYKICAgICAgICAgfQogICAgIH1lbHNlewogICAgICAgICAvL0FMT0dWKCJcdEJ1ZmZlciBhY2Nlc3MgaXMgV1JJVEUiKTsKQEAgLTY1NCw3ICs1MzQsNiBAQAogICAgIC8vQUxPR1YoIlx0UmV2ZXJiX3NldENvbmZpZyBjYWxsaW5nIG1lbWNweSIpOwogICAgIHBDb250ZXh0LT5jb25maWcgPSAqcENvbmZpZzsKIAotCiAgICAgc3dpdGNoIChwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpIHsKICAgICBjYXNlIDgwMDA6CiAgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfODAwMDsKQEAgLTY3NCwxNCArNTUzLDE4IEBACiAgICAgY2FzZSA0ODAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU180ODAwMDsKICAgICAgICAgYnJlYWs7Ci0jaWYgZGVmaW5lZChCVUlMRF9GTE9BVCkgJiYgZGVmaW5lZChISUdIRVJfRlMpCisgICAgY2FzZSA4ODIwMDoKKyAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU184ODIwMDsKKyAgICAgICAgYnJlYWs7CiAgICAgY2FzZSA5NjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU185NjAwMDsKICAgICAgICAgYnJlYWs7CisgICAgY2FzZSAxNzY0MDA6CisgICAgICAgIFNhbXBsZVJhdGUgPSBMVk1fRlNfMTc2NDAwOworICAgICAgICBicmVhazsKICAgICBjYXNlIDE5MjAwMDoKICAgICAgICAgU2FtcGxlUmF0ZSA9IExWTV9GU18xOTIwMDA7CiAgICAgICAgIGJyZWFrOwotI2VuZGlmCiAgICAgZGVmYXVsdDoKICAgICAgICAgQUxPR1YoIlxyUmV2ZXJiX3NldENvbmZpZyBpbnZhbGlkIHNhbXBsaW5nIHJhdGUgJWQiLCBwQ29uZmlnLT5pbnB1dENmZy5zYW1wbGluZ1JhdGUpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTE1MDMsNyArMTM4Niw2IEBACiAgICAgLy9BTE9HVigiXHRSZXZlcmJHZXREZW5zaXR5IFN1Y2Nlc2Z1bGx5IHJldHVybmVkIGZyb20gTFZNX0dldENvbnRyb2xQYXJhbWV0ZXJzXG4iKTsKICAgICAvL0FMT0dWKCJcdFJldmVyYkdldERlbnNpdHkoKSBqdXN0IEdvdCAtPiAlZFxuIiwgQWN0aXZlUGFyYW1zLlJvb21TaXplKTsKIAotCiAgICAgVGVtcCA9IChMVk1fSU5UMTYpKCgocENvbnRleHQtPlNhdmVkRGVuc2l0eSAqIDk5KSAvIDEwMDApICsgMSk7CiAKICAgICBpZihUZW1wICE9IEFjdGl2ZVBhcmFtcy5Sb29tU2l6ZSl7CkBAIC0xNTUxLDcgKzE0MzMsNiBAQAogICAgIHJldHVybiAwOwogfQogCi0KIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gUmV2ZXJiX2dldFBhcmFtZXRlcigpCiAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE4OTcsNyArMTc3OCw2IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0gLyogZW5kIFJldmVyYl9zZXRQYXJhbWV0ZXIgKi8KIAotCiAvKioKICAqIHJldHVybnMgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIHZhbHVlIG9mIGVhY2ggZW52aXJvbm1lbnRhbCByZXZlcmIgcGFyYW1ldGVyCiAgKi8KQEAgLTE5NDUsMTcgKzE4MjUsMTAgQEAKICAgICB9CiAgICAgLy9BTE9HVigiXHRSZXZlcmJfcHJvY2VzcygpIENhbGxpbmcgcHJvY2VzcyB3aXRoICVkIGZyYW1lcyIsIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCk7CiAgICAgLyogUHJvY2VzcyBhbGwgdGhlIGF2YWlsYWJsZSBmcmFtZXMsIGJsb2NrIHByb2Nlc3NpbmcgaXMgaGFuZGxlZCBpbnRlcm5hbExZIGJ5IHRoZSBMVk0gYnVuZGxlICovCi0jaWYgZGVmaW5lZCAoQlVJTERfRkxPQVQpICYmIGRlZmluZWQgKE5BVElWRV9GTE9BVF9CVUZGRVIpCiAgICAgc3RhdHVzID0gcHJvY2VzcyggICAgaW5CdWZmZXItPmYzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmYzMiwKICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgcENvbnRleHQpOwotI2Vsc2UKLSAgICBzdGF0dXMgPSBwcm9jZXNzKCAgICBpbkJ1ZmZlci0+czE2LAotICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+czE2LAotICAgICAgICAgICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwQ29udGV4dCk7Ci0jZW5kaWYKIAogICAgIGlmIChwQ29udGV4dC0+YkVuYWJsZWQgPT0gTFZNX0ZBTFNFKSB7CiAgICAgICAgIGlmIChwQ29udGV4dC0+U2FtcGxlc1RvRXhpdENvdW50ID4gMCkgewpAQCAtMTk4MCw3ICsxODUzLDYgQEAKICAgICBMVlJFVl9Db250cm9sUGFyYW1zX3N0ICAgIEFjdGl2ZVBhcmFtczsgICAgICAgICAgICAgIC8qIEN1cnJlbnQgY29udHJvbCBQYXJhbWV0ZXJzICovCiAgICAgTFZSRVZfUmV0dXJuU3RhdHVzX2VuICAgICBMdm1TdGF0dXM9TFZSRVZfU1VDQ0VTUzsgICAgIC8qIEZ1bmN0aW9uIGNhbGwgc3RhdHVzICovCiAKLQogICAgIGlmIChwQ29udGV4dCA9PSBOVUxMKXsKICAgICAgICAgQUxPR1YoIlx0TFZNX0VSUk9SIDogUmV2ZXJiX2NvbW1hbmQgRVJST1IgcENvbnRleHQgPT0gTlVMTCIpOwogICAgICAgICByZXR1cm4gLUVJTlZBTDsKQEAgLTIwMzQsMTEgKzE5MDYsMTUgQEAKICAgICAgICAgICAgIC8vQUxPR1YoIlx0UmV2ZXJiX2NvbW1hbmQgY21kQ29kZSBDYXNlOiAiCiAgICAgICAgICAgICAvLyAgICAgICAgIkVGRkVDVF9DTURfR0VUX1BBUkFNIHN0YXJ0Iik7CiAgICAgICAgICAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKXBDbWREYXRhOworICAgICAgICAgICAgaWYgKHBDbWREYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiXHRMVk1fRVJST1IgOiBwQ21kRGF0YSBpcyBOVUxMIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAoU0laRV9NQVggLSBzaXplb2YoZWZmZWN0X3BhcmFtX3QpIDwgKHNpemVfdClwLT5wc2l6ZSkgewogICAgICAgICAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMjYzNDc1MDkiKTsKICAgICAgICAgICAgICAgICByZXR1cm4gLUVJTlZBTDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChwQ21kRGF0YSA9PSBOVUxMIHx8IGNtZFNpemUgPCBzaXplb2YoZWZmZWN0X3BhcmFtX3QpIHx8CisgICAgICAgICAgICBpZiAoY21kU2l6ZSA8IHNpemVvZihlZmZlY3RfcGFyYW1fdCkgfHwKICAgICAgICAgICAgICAgICAgICAgY21kU2l6ZSA8IChzaXplb2YoZWZmZWN0X3BhcmFtX3QpICsgcC0+cHNpemUpIHx8CiAgICAgICAgICAgICAgICAgICAgIHBSZXBseURhdGEgPT0gTlVMTCB8fCByZXBseVNpemUgPT0gTlVMTCB8fAogICAgICAgICAgICAgICAgICAgICAqcmVwbHlTaXplIDwgKHNpemVvZihlZmZlY3RfcGFyYW1fdCkgKyBwLT5wc2l6ZSkpIHsKQEAgLTIxNTUsNyArMjAzMSw2IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIC1FSU5WQUw7CiAgICAgICAgICAgICB9CiAKLQogICAgICAgICAgICAgaWYgKHBSZXBseURhdGEgIT0gTlVMTCkgeyAvLyB3ZSBoYXZlIHZvbHVtZSBjb250cm9sCiAgICAgICAgICAgICAgICAgcENvbnRleHQtPmxlZnRWb2x1bWUgPSAoTFZNX0lOVDE2KSgoKih1aW50MzJfdCAqKXBDbWREYXRhICsgKDEgPDwgMTEpKSA+PiAxMik7CiAgICAgICAgICAgICAgICAgcENvbnRleHQtPnJpZ2h0Vm9sdW1lID0gKExWTV9JTlQxNikoKCooKHVpbnQzMl90ICopcENtZERhdGEgKyAxKSArICgxIDw8IDExKSkgPj4gMTIpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliZWZmZWN0cy9sdm0vd3JhcHBlci9SZXZlcmIvRWZmZWN0UmV2ZXJiLmggYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuaAppbmRleCA4MTY1ZjVhLi45NjIyM2E4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuaAorKysgYi9tZWRpYS9saWJlZmZlY3RzL2x2bS93cmFwcGVyL1JldmVyYi9FZmZlY3RSZXZlcmIuaApAQCAtMjAsMTAgKzIwLDYgQEAKICNpbmNsdWRlIDxhdWRpb19lZmZlY3RzL2VmZmVjdF9lbnZpcm9ubWVudGFscmV2ZXJiLmg+CiAjaW5jbHVkZSA8YXVkaW9fZWZmZWN0cy9lZmZlY3RfcHJlc2V0cmV2ZXJiLmg+CiAKLSNpZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQogI2RlZmluZSBNQVhfTlVNX0JBTkRTICAgICAgICAgICA1CiAjZGVmaW5lIE1BWF9DQUxMX1NJWkUgICAgICAgICAgIDI1NgogI2RlZmluZSBMVlJFVl9NQVhfVDYwICAgICAgICAgICA3MDAwCkBAIC0zMSwxNiArMjcsMTEgQEAKICNkZWZpbmUgTFZSRVZfTUFYX0ZSQU1FX1NJWkUgICAgMjU2MAogI2RlZmluZSBMVlJFVl9DVVBfTE9BRF9BUk05RSAgICA0NzAgICAgLy8gRXhwcmVzc2VkIGluIDAuMSBNSVBTCiAjZGVmaW5lIExWUkVWX01FTV9VU0FHRSAgICAgICAgICg3MSsoTFZSRVZfTUFYX0ZSQU1FX1NJWkU+PjcpKSAgICAgLy8gRXhwcmVzc2VkIGluIGtCCi0vLyNkZWZpbmUgTFZNX1BDTQogCiB0eXBlZGVmIHN0cnVjdCBfTFBGUGFpcl90CiB7CiAgICAgaW50MTZfdCBSb29tX0hGOwogICAgIGludDE2X3QgTFBGOwogfSBMUEZQYWlyX3Q7Ci0jaWYgX19jcGx1c3BsdXMKLX0gIC8vIGV4dGVybiAiQyIKLSNlbmRpZgotCiAKICNlbmRpZiAvKkFORFJPSURfRUZGRUNUUkVWRVJCX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvcHJlcHJvY2Vzc2luZy9QcmVQcm9jZXNzaW5nLmNwcAppbmRleCA1MGMzM2M2Li41ZmFiNWJlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3ByZXByb2Nlc3NpbmcvUHJlUHJvY2Vzc2luZy5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy9wcmVwcm9jZXNzaW5nL1ByZVByb2Nlc3NpbmcuY3BwCkBAIC05MjYsNyArOTI2LDcgQEAKICAgICAgICAgZGVsZXRlIHNlc3Npb24tPnJldkJ1ZjsKICAgICAgICAgc2Vzc2lvbi0+cmV2QnVmID0gTlVMTDsKIAotICAgICAgICBzZXNzaW9uLT5pbyA9IDA7CisgICAgICAgIHNlc3Npb24tPmlkID0gMDsKICAgICB9CiAKICAgICByZXR1cm4gMDsKQEAgLTExNTUsNyArMTE1NSw3IEBACiB7CiAgICAgc2l6ZV90IGk7CiAgICAgZm9yIChpID0gMDsgaSA8IFBSRVBST0NfTlVNX1NFU1NJT05TOyBpKyspIHsKLSAgICAgICAgaWYgKHNTZXNzaW9uc1tpXS5pbyA9PSBpb0lkKSB7CisgICAgICAgIGlmIChzU2Vzc2lvbnNbaV0uaWQgPT0gc2Vzc2lvbklkKSB7CiAgICAgICAgICAgICBpZiAoc1Nlc3Npb25zW2ldLmNyZWF0ZWRNc2sgJiAoMSA8PCBwcm9jSWQpKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgICAgICAgICB9CkBAIC0xMTYzLDcgKzExNjMsNyBAQAogICAgICAgICB9CiAgICAgfQogICAgIGZvciAoaSA9IDA7IGkgPCBQUkVQUk9DX05VTV9TRVNTSU9OUzsgaSsrKSB7Ci0gICAgICAgIGlmIChzU2Vzc2lvbnNbaV0uaW8gPT0gMCkgeworICAgICAgICBpZiAoc1Nlc3Npb25zW2ldLmlkID09IDApIHsKICAgICAgICAgICAgIHNTZXNzaW9uc1tpXS5pZCA9IHNlc3Npb25JZDsKICAgICAgICAgICAgIHNTZXNzaW9uc1tpXS5pbyA9IGlvSWQ7CiAgICAgICAgICAgICByZXR1cm4gJnNTZXNzaW9uc1tpXTsKQEAgLTE5MTUsNyArMTkxNSw3IEBACiAgICAgc3RhdHVzID0gU2Vzc2lvbl9DcmVhdGVFZmZlY3Qoc2Vzc2lvbiwgcHJvY0lkLCBwSW50ZXJmYWNlKTsKIAogICAgIGlmIChzdGF0dXMgPCAwICYmIHNlc3Npb24tPmNyZWF0ZWRNc2sgPT0gMCkgewotICAgICAgICBzZXNzaW9uLT5pbyA9IDA7CisgICAgICAgIHNlc3Npb24tPmlkID0gMDsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE5MjksNyArMTkyOSw3IEBACiAKICAgICBwcmVwcm9jX2VmZmVjdF90ICpmeCA9IChwcmVwcm9jX2VmZmVjdF90ICopaW50ZXJmYWNlOwogCi0gICAgaWYgKGZ4LT5zZXNzaW9uLT5pbyA9PSAwKSB7CisgICAgaWYgKGZ4LT5zZXNzaW9uLT5pZCA9PSAwKSB7CiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KICAgICByZXR1cm4gU2Vzc2lvbl9SZWxlYXNlRWZmZWN0KGZ4LT5zZXNzaW9uLCBmeCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvQW5kcm9pZC5tayBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rCmluZGV4IDcwNDA5ZGUuLjM1ZTJmM2QgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rCisrKyBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9BbmRyb2lkLm1rCkBAIC05LDYgKzksNyBAQAogCiBMT0NBTF9DRkxBR1MrPSAtTzIgLWZ2aXNpYmlsaXR5PWhpZGRlbgogTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKK0xPQ0FMX0NGTEFHUyArPSAtREJVSUxEX0ZMT0FUIC1EU1VQUE9SVF9NQwogCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKIAlsaWJjdXRpbHMgXApAQCAtMTksNyArMjAsOCBAQAogTE9DQUxfTU9EVUxFOj0gbGlidmlzdWFsaXplcgogCiBMT0NBTF9DX0lOQ0xVREVTIDo9IFwKLQkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykKKwkkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tZWZmZWN0cykgXAorCSQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKIAogCiBMT0NBTF9IRUFERVJfTElCUkFSSUVTICs9IGxpYmhhcmR3YXJlX2hlYWRlcnMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcCBiL21lZGlhL2xpYmVmZmVjdHMvdmlzdWFsaXplci9FZmZlY3RWaXN1YWxpemVyLmNwcAppbmRleCA4MDdmMjRkLi5mODM4ODkyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJlZmZlY3RzL3Zpc3VhbGl6ZXIvRWZmZWN0VmlzdWFsaXplci5jcHAKKysrIGIvbWVkaWEvbGliZWZmZWN0cy92aXN1YWxpemVyL0VmZmVjdFZpc3VhbGl6ZXIuY3BwCkBAIC0yNCwxMSArMjQsMjMgQEAKICNpbmNsdWRlIDxzdHJpbmcuaD4KICNpbmNsdWRlIDx0aW1lLmg+CiAKKyNpbmNsdWRlIDxhbGdvcml0aG0+IC8vIG1heAogI2luY2x1ZGUgPG5ldz4KIAogI2luY2x1ZGUgPGxvZy9sb2cuaD4KIAogI2luY2x1ZGUgPGF1ZGlvX2VmZmVjdHMvZWZmZWN0X3Zpc3VhbGl6ZXIuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisKKyNpZmRlZiBCVUlMRF9GTE9BVAorCitzdGF0aWMgY29uc3RleHByIGF1ZGlvX2Zvcm1hdF90IGtQcm9jZXNzRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKworI2Vsc2UKKworc3RhdGljIGNvbnN0ZXhwciBhdWRpb19mb3JtYXRfdCBrUHJvY2Vzc0Zvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworCisjZW5kaWYgLy8gQlVJTERfRkxPQVQKIAogZXh0ZXJuICJDIiB7CiAKQEAgLTE0MywxMCArMTU1LDE1IEBACiAgICAgaWYgKHBDb25maWctPmlucHV0Q2ZnLnNhbXBsaW5nUmF0ZSAhPSBwQ29uZmlnLT5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlKSByZXR1cm4gLUVJTlZBTDsKICAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuY2hhbm5lbHMgIT0gcENvbmZpZy0+b3V0cHV0Q2ZnLmNoYW5uZWxzKSByZXR1cm4gLUVJTlZBTDsKICAgICBpZiAocENvbmZpZy0+aW5wdXRDZmcuZm9ybWF0ICE9IHBDb25maWctPm91dHB1dENmZy5mb3JtYXQpIHJldHVybiAtRUlOVkFMOwotICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8pIHJldHVybiAtRUlOVkFMOworICAgIGNvbnN0IHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhwQ29uZmlnLT5pbnB1dENmZy5jaGFubmVscyk7CisjaWZkZWYgU1VQUE9SVF9NQworICAgIGlmIChjaGFubmVsQ291bnQgPCAxIHx8IGNoYW5uZWxDb3VudCA+IEZDQ184KSByZXR1cm4gLUVJTlZBTDsKKyNlbHNlCisgICAgaWYgKGNoYW5uZWxDb3VudCAhPSBGQ0NfMikgcmV0dXJuIC1FSU5WQUw7CisjZW5kaWYKICAgICBpZiAocENvbmZpZy0+b3V0cHV0Q2ZnLmFjY2Vzc01vZGUgIT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfV1JJVEUgJiYKICAgICAgICAgICAgIHBDb25maWctPm91dHB1dENmZy5hY2Nlc3NNb2RlICE9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHJldHVybiAtRUlOVkFMOwotICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpIHJldHVybiAtRUlOVkFMOworICAgIGlmIChwQ29uZmlnLT5pbnB1dENmZy5mb3JtYXQgIT0ga1Byb2Nlc3NGb3JtYXQpIHJldHVybiAtRUlOVkFMOwogCiAgICAgcENvbnRleHQtPm1Db25maWcgPSAqcENvbmZpZzsKIApAQCAtMTkyLDcgKzIwOSw3IEBACiB7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX1JFQUQ7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuY2hhbm5lbHMgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuZm9ybWF0ID0ga1Byb2Nlc3NGb3JtYXQ7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuc2FtcGxpbmdSYXRlID0gNDQxMDA7CiAgICAgcENvbnRleHQtPm1Db25maWcuaW5wdXRDZmcuYnVmZmVyUHJvdmlkZXIuZ2V0QnVmZmVyID0gTlVMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKQEAgLTIwMCw3ICsyMTcsNyBAQAogICAgIHBDb250ZXh0LT5tQ29uZmlnLmlucHV0Q2ZnLm1hc2sgPSBFRkZFQ1RfQ09ORklHX0FMTDsKICAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuYWNjZXNzTW9kZSA9IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEU7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOwotICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBwQ29udGV4dC0+bUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0ga1Byb2Nlc3NGb3JtYXQ7CiAgICAgcENvbnRleHQtPm1Db25maWcub3V0cHV0Q2ZnLnNhbXBsaW5nUmF0ZSA9IDQ0MTAwOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5nZXRCdWZmZXIgPSBOVUxMOwogICAgIHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5idWZmZXJQcm92aWRlci5yZWxlYXNlQnVmZmVyID0gTlVMTDsKQEAgLTMwMSwxNSArMzE4LDggQEAKIC8vLS0tIEVmZmVjdCBDb250cm9sIEludGVyZmFjZSBJbXBsZW1lbnRhdGlvbgogLy8KIAotc3RhdGljIGlubGluZSBpbnQxNl90IGNsYW1wMTYoaW50MzJfdCBzYW1wbGUpCi17Ci0gICAgaWYgKChzYW1wbGU+PjE1KSBeIChzYW1wbGU+PjMxKSkKLSAgICAgICAgc2FtcGxlID0gMHg3RkZGIF4gKHNhbXBsZT4+MzEpOwotICAgIHJldHVybiBzYW1wbGU7Ci19Ci0KIGludCBWaXN1YWxpemVyX3Byb2Nlc3MoCi0gICAgICAgIGVmZmVjdF9oYW5kbGVfdCBzZWxmLGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcikKKyAgICAgICAgZWZmZWN0X2hhbmRsZV90IHNlbGYsIGF1ZGlvX2J1ZmZlcl90ICppbkJ1ZmZlciwgYXVkaW9fYnVmZmVyX3QgKm91dEJ1ZmZlcikKIHsKICAgICBWaXN1YWxpemVyQ29udGV4dCAqIHBDb250ZXh0ID0gKFZpc3VhbGl6ZXJDb250ZXh0ICopc2VsZjsKIApAQCAtMzI0LDcxICszMzQsMTE4IEBACiAgICAgICAgIHJldHVybiAtRUlOVkFMOwogICAgIH0KIAorICAgIGNvbnN0IHNpemVfdCBzYW1wbGVMZW4gPSBpbkJ1ZmZlci0+ZnJhbWVDb3VudCAqIHBDb250ZXh0LT5tQ2hhbm5lbENvdW50OworCiAgICAgLy8gcGVyZm9ybSBtZWFzdXJlbWVudHMgaWYgbmVlZGVkCiAgICAgaWYgKHBDb250ZXh0LT5tTWVhc3VyZW1lbnRNb2RlICYgTUVBU1VSRU1FTlRfTU9ERV9QRUFLX1JNUykgewogICAgICAgICAvLyBmaW5kIHRoZSBwZWFrIGFuZCBSTVMgc3F1YXJlZCBmb3IgdGhlIG5ldyBidWZmZXIKLSAgICAgICAgdWludDMyX3QgaW5JZHg7Ci0gICAgICAgIGludDE2X3QgbWF4U2FtcGxlID0gMDsKICAgICAgICAgZmxvYXQgcm1zU3FBY2MgPSAwOwotICAgICAgICBmb3IgKGluSWR4ID0gMCA7IGluSWR4IDwgaW5CdWZmZXItPmZyYW1lQ291bnQgKiBwQ29udGV4dC0+bUNoYW5uZWxDb3VudCA7IGluSWR4KyspIHsKLSAgICAgICAgICAgIGlmIChpbkJ1ZmZlci0+czE2W2luSWR4XSA+IG1heFNhbXBsZSkgewotICAgICAgICAgICAgICAgIG1heFNhbXBsZSA9IGluQnVmZmVyLT5zMTZbaW5JZHhdOwotICAgICAgICAgICAgfSBlbHNlIGlmICgtaW5CdWZmZXItPnMxNltpbklkeF0gPiBtYXhTYW1wbGUpIHsKLSAgICAgICAgICAgICAgICBtYXhTYW1wbGUgPSAtaW5CdWZmZXItPnMxNltpbklkeF07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBybXNTcUFjYyArPSAoaW5CdWZmZXItPnMxNltpbklkeF0gKiBpbkJ1ZmZlci0+czE2W2luSWR4XSk7CisKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBmbG9hdCBtYXhTYW1wbGUgPSAwLmY7CisgICAgICAgIGZvciAoc2l6ZV90IGluSWR4ID0gMDsgaW5JZHggPCBzYW1wbGVMZW47ICsraW5JZHgpIHsKKyAgICAgICAgICAgIG1heFNhbXBsZSA9IGZtYXgobWF4U2FtcGxlLCBmYWJzKGluQnVmZmVyLT5mMzJbaW5JZHhdKSk7CisgICAgICAgICAgICBybXNTcUFjYyArPSBpbkJ1ZmZlci0+ZjMyW2luSWR4XSAqIGluQnVmZmVyLT5mMzJbaW5JZHhdOwogICAgICAgICB9CisgICAgICAgIG1heFNhbXBsZSAqPSAxIDw8IDE1OyAvLyBzY2FsZSB0byBpbnQxNl90LCB3aXRoIGV4YWN0bHkgMSA8PCAxNSByZXByZXNlbnRpbmcgcG9zaXRpdmUgbnVtLgorICAgICAgICBybXNTcUFjYyAqPSAxIDw8IDMwOyAvLyBzY2FsZSB0byBpbnQxNl90ICogMgorI2Vsc2UKKyAgICAgICAgaW50IG1heFNhbXBsZSA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGluSWR4ID0gMDsgaW5JZHggPCBzYW1wbGVMZW47ICsraW5JZHgpIHsKKyAgICAgICAgICAgIG1heFNhbXBsZSA9IHN0ZDo6bWF4KG1heFNhbXBsZSwgc3RkOjphYnMoaW50MzJfdChpbkJ1ZmZlci0+czE2W2luSWR4XSkpKTsKKyAgICAgICAgICAgIHJtc1NxQWNjICs9IGluQnVmZmVyLT5zMTZbaW5JZHhdICogaW5CdWZmZXItPnMxNltpbklkeF07CisgICAgICAgIH0KKyNlbmRpZgogICAgICAgICAvLyBzdG9yZSB0aGUgbWVhc3VyZW1lbnQKICAgICAgICAgcENvbnRleHQtPm1QYXN0TWVhc3VyZW1lbnRzW3BDb250ZXh0LT5tTWVhc3VyZW1lbnRCdWZmZXJJZHhdLm1QZWFrVTE2ID0gKHVpbnQxNl90KW1heFNhbXBsZTsKICAgICAgICAgcENvbnRleHQtPm1QYXN0TWVhc3VyZW1lbnRzW3BDb250ZXh0LT5tTWVhc3VyZW1lbnRCdWZmZXJJZHhdLm1SbXNTcXVhcmVkID0KLSAgICAgICAgICAgICAgICBybXNTcUFjYyAvIChpbkJ1ZmZlci0+ZnJhbWVDb3VudCAqIHBDb250ZXh0LT5tQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICBybXNTcUFjYyAvIHNhbXBsZUxlbjsKICAgICAgICAgcENvbnRleHQtPm1QYXN0TWVhc3VyZW1lbnRzW3BDb250ZXh0LT5tTWVhc3VyZW1lbnRCdWZmZXJJZHhdLm1Jc1ZhbGlkID0gdHJ1ZTsKICAgICAgICAgaWYgKCsrcENvbnRleHQtPm1NZWFzdXJlbWVudEJ1ZmZlcklkeCA+PSBwQ29udGV4dC0+bU1lYXN1cmVtZW50V2luZG93U2l6ZUluQnVmZmVycykgewogICAgICAgICAgICAgcENvbnRleHQtPm1NZWFzdXJlbWVudEJ1ZmZlcklkeCA9IDA7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBhbGwgY29kZSBiZWxvdyBhc3N1bWVzIHN0ZXJlbyAxNiBiaXQgUENNIG91dHB1dCBhbmQgaW5wdXQKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgIGZsb2F0IGZzY2FsZTsgLy8gbXVsdGlwbGljYXRpdmUgc2NhbGUKKyNlbHNlCiAgICAgaW50MzJfdCBzaGlmdDsKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogCiAgICAgaWYgKHBDb250ZXh0LT5tU2NhbGluZ01vZGUgPT0gVklTVUFMSVpFUl9TQ0FMSU5HX01PREVfTk9STUFMSVpFRCkgewogICAgICAgICAvLyBkZXJpdmUgY2FwdHVyZSBzY2FsaW5nIGZhY3RvciBmcm9tIHBlYWsgdmFsdWUgaW4gY3VycmVudCBidWZmZXIKICAgICAgICAgLy8gdGhpcyBnaXZlcyBtb3JlIGludGVyZXN0aW5nIGNhcHR1cmVzIGZvciBkaXNwbGF5LgotICAgICAgICBzaGlmdCA9IDMyOwotICAgICAgICBpbnQgbGVuID0gaW5CdWZmZXItPmZyYW1lQ291bnQgKiAyOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7CisKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBmbG9hdCBtYXhTYW1wbGUgPSAwLmY7CisgICAgICAgIGZvciAoc2l6ZV90IGluSWR4ID0gMDsgaW5JZHggPCBzYW1wbGVMZW47ICkgeworICAgICAgICAgICAgLy8gd2UgcmVjb25zdHJ1Y3QgdGhlIGFjdHVhbCBzdW1tZWQgdmFsdWUgdG8gZW5zdXJlIHByb3BlciBub3JtYWxpemF0aW9uCisgICAgICAgICAgICAvLyBmb3IgbXVsdGljaGFubmVsIG91dHB1dHMgKGNoYW5uZWxzID4gMiBtYXkgb2Z0ZW4gYmUgMCkuCisgICAgICAgICAgICBmbG9hdCBzbXAgPSAwLmY7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBDb250ZXh0LT5tQ2hhbm5lbENvdW50OyArK2kpIHsKKyAgICAgICAgICAgICAgICBzbXAgKz0gaW5CdWZmZXItPmYzMltpbklkeCsrXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1heFNhbXBsZSA9IGZtYXgobWF4U2FtcGxlLCBmYWJzKHNtcCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtYXhTYW1wbGUgPiAwLmYpIHsKKyAgICAgICAgICAgIGZzY2FsZSA9IDAuOTlmIC8gbWF4U2FtcGxlOworICAgICAgICAgICAgaW50IGV4cDsgLy8gdW51c2VkCisgICAgICAgICAgICBjb25zdCBmbG9hdCBzaWduaWZpY2FuZCA9IGZyZXhwKGZzY2FsZSwgJmV4cCk7CisgICAgICAgICAgICBpZiAoc2lnbmlmaWNhbmQgPT0gMC41ZikgeworICAgICAgICAgICAgICAgIGZzY2FsZSAqPSAyNTUuZiAvIDI1Ni5mOyAvLyBhdm9pZCByZXR1cm5pbmcgdW5hbHRlcmVkIFBDTSBzaWduYWwKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIHNjYWxlIGRvZXNuJ3QgbWF0dGVyLCB0aGUgdmFsdWVzIGFyZSBhbGwgMC4KKyAgICAgICAgICAgIGZzY2FsZSA9IDEuZjsKKyAgICAgICAgfQorI2Vsc2UKKyAgICAgICAgaW50MzJfdCBvckFjY3VtID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzYW1wbGVMZW47ICsraSkgewogICAgICAgICAgICAgaW50MzJfdCBzbXAgPSBpbkJ1ZmZlci0+czE2W2ldOwogICAgICAgICAgICAgaWYgKHNtcCA8IDApIHNtcCA9IC1zbXAgLSAxOyAvLyB0YWtlIGNhcmUgdG8ga2VlcCB0aGUgbWF4IG5lZ2F0aXZlIGluIHJhbmdlCi0gICAgICAgICAgICBpbnQzMl90IGNseiA9IF9fYnVpbHRpbl9jbHooc21wKTsKLSAgICAgICAgICAgIGlmIChzaGlmdCA+IGNseikgc2hpZnQgPSBjbHo7CisgICAgICAgICAgICBvckFjY3VtIHw9IHNtcDsKICAgICAgICAgfQorCiAgICAgICAgIC8vIEEgbWF4aW11bSBhbXBsaXR1ZGUgc2lnbmFsIHdpbGwgaGF2ZSAxNyBsZWFkaW5nIHplcm9zLCB3aGljaCB3ZSB3YW50IHRvCiAgICAgICAgIC8vIHRyYW5zbGF0ZSB0byBhIHNoaWZ0IG9mIDggKGZvciBjb252ZXJ0aW5nIDE2IGJpdCB0byA4IGJpdCkKLSAgICAgICAgc2hpZnQgPSAyNSAtIHNoaWZ0OworICAgICAgICBzaGlmdCA9IDI1IC0gX19idWlsdGluX2NseihvckFjY3VtKTsKKwogICAgICAgICAvLyBOZXZlciBzY2FsZSBieSBsZXNzIHRoYW4gOCB0byBhdm9pZCByZXR1cm5pbmcgdW5hbHRlcmVkIFBDTSBzaWduYWwuCiAgICAgICAgIGlmIChzaGlmdCA8IDMpIHsKICAgICAgICAgICAgIHNoaWZ0ID0gMzsKICAgICAgICAgfQogICAgICAgICAvLyBhZGQgb25lIHRvIGNvbWJpbmUgdGhlIGRpdmlzaW9uIGJ5IDIgbmVlZGVkIGFmdGVyIHN1bW1pbmcgbGVmdCBhbmQgcmlnaHQgY2hhbm5lbHMgYmVsb3cKICAgICAgICAgc2hpZnQrKzsKKyNlbmRpZiAvLyBCVUlMRF9GTE9BVAogICAgIH0gZWxzZSB7CiAgICAgICAgIGFzc2VydChwQ29udGV4dC0+bVNjYWxpbmdNb2RlID09IFZJU1VBTElaRVJfU0NBTElOR19NT0RFX0FTX1BMQVlFRCk7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgLy8gTm90ZTogaWYgY2hhbm5lbHMgYXJlIHVuY29ycmVsYXRlZCwgMS9zcXJ0KE4pIGNvdWxkIGJlIHVzZWQgYXQgdGhlIHJpc2sgb2YgY2xpcHBpbmcuCisgICAgICAgIGZzY2FsZSA9IDEuZiAvIHBDb250ZXh0LT5tQ2hhbm5lbENvdW50OyAgLy8gYWNjb3VudCBmb3Igc3VtbWluZyBhbGwgdGhlIGNoYW5uZWxzIHRvZ2V0aGVyLgorI2Vsc2UKICAgICAgICAgc2hpZnQgPSA5OworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAgICAgfQogCiAgICAgdWludDMyX3QgY2FwdElkeDsKICAgICB1aW50MzJfdCBpbklkeDsKICAgICB1aW50OF90ICpidWYgPSBwQ29udGV4dC0+bUNhcHR1cmVCdWY7CiAgICAgZm9yIChpbklkeCA9IDAsIGNhcHRJZHggPSBwQ29udGV4dC0+bUNhcHR1cmVJZHg7Ci0gICAgICAgICBpbklkeCA8IGluQnVmZmVyLT5mcmFtZUNvdW50OwotICAgICAgICAgaW5JZHgrKywgY2FwdElkeCsrKSB7Ci0gICAgICAgIGlmIChjYXB0SWR4ID49IENBUFRVUkVfQlVGX1NJWkUpIHsKLSAgICAgICAgICAgIC8vIHdyYXAgYXJvdW5kCi0gICAgICAgICAgICBjYXB0SWR4ID0gMDsKKyAgICAgICAgIGluSWR4IDwgc2FtcGxlTGVuOworICAgICAgICAgY2FwdElkeCsrKSB7CisgICAgICAgIGlmIChjYXB0SWR4ID49IENBUFRVUkVfQlVGX1NJWkUpIGNhcHRJZHggPSAwOyAvLyB3cmFwCisKKyNpZmRlZiBCVUlMRF9GTE9BVAorICAgICAgICBmbG9hdCBzbXAgPSAwLmY7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwQ29udGV4dC0+bUNoYW5uZWxDb3VudDsgKytpKSB7CisgICAgICAgICAgICBzbXAgKz0gaW5CdWZmZXItPmYzMltpbklkeCsrXTsKICAgICAgICAgfQotICAgICAgICBpbnQzMl90IHNtcCA9IGluQnVmZmVyLT5zMTZbMiAqIGluSWR4XSArIGluQnVmZmVyLT5zMTZbMiAqIGluSWR4ICsgMV07Ci0gICAgICAgIHNtcCA9IHNtcCA+PiBzaGlmdDsKKyAgICAgICAgYnVmW2NhcHRJZHhdID0gY2xhbXA4X2Zyb21fZmxvYXQoc21wICogZnNjYWxlKTsKKyNlbHNlCisgICAgICAgIGNvbnN0IGludDMyX3Qgc21wID0gKGluQnVmZmVyLT5zMTZbaW5JZHhdICsgaW5CdWZmZXItPnMxNltpbklkeCArIDFdKSA+PiBzaGlmdDsKKyAgICAgICAgaW5JZHggKz0gRkNDXzI7ICAvLyBpbnRlZ2VyIHN1cHBvcnRzIHN0ZXJlbyBvbmx5LgogICAgICAgICBidWZbY2FwdElkeF0gPSAoKHVpbnQ4X3Qpc21wKV4weDgwOworI2VuZGlmIC8vIEJVSUxEX0ZMT0FUCiAgICAgfQogCiAgICAgLy8gWFhYIHRoZSBmb2xsb3dpbmcgdHdvIHNob3VsZCByZWFsbHkgYmUgYXRvbWljLCB0aG91Z2ggaXQgcHJvYmFibHkgZG9lc24ndApAQCAtNDAwLDYgKzQ1NywxNSBAQAogICAgIH0KIAogICAgIGlmIChpbkJ1ZmZlci0+cmF3ICE9IG91dEJ1ZmZlci0+cmF3KSB7CisjaWZkZWYgQlVJTERfRkxPQVQKKyAgICAgICAgaWYgKHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2FtcGxlTGVuOyArK2kpIHsKKyAgICAgICAgICAgICAgICBvdXRCdWZmZXItPmYzMltpXSArPSBpbkJ1ZmZlci0+ZjMyW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVtY3B5KG91dEJ1ZmZlci0+cmF3LCBpbkJ1ZmZlci0+cmF3LCBzYW1wbGVMZW4gKiBzaXplb2YoZmxvYXQpKTsKKyAgICAgICAgfQorI2Vsc2UKICAgICAgICAgaWYgKHBDb250ZXh0LT5tQ29uZmlnLm91dHB1dENmZy5hY2Nlc3NNb2RlID09IEVGRkVDVF9CVUZGRVJfQUNDRVNTX0FDQ1VNVUxBVEUpIHsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0QnVmZmVyLT5mcmFtZUNvdW50KjI7IGkrKykgewogICAgICAgICAgICAgICAgIG91dEJ1ZmZlci0+czE2W2ldID0gY2xhbXAxNihvdXRCdWZmZXItPnMxNltpXSArIGluQnVmZmVyLT5zMTZbaV0pOwpAQCAtNDA3LDYgKzQ3Myw3IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtZW1jcHkob3V0QnVmZmVyLT5yYXcsIGluQnVmZmVyLT5yYXcsIG91dEJ1ZmZlci0+ZnJhbWVDb3VudCAqIDIgKiBzaXplb2YoaW50MTZfdCkpOwogICAgICAgICB9CisjZW5kaWYgLy8gQlVJTERfRkxPQVQKICAgICB9CiAgICAgaWYgKHBDb250ZXh0LT5tU3RhdGUgIT0gVklTVUFMSVpFUl9TVEFURV9BQ1RJVkUpIHsKICAgICAgICAgcmV0dXJuIC1FTk9EQVRBOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuY3BwIGIvbWVkaWEvbGliaGVpZi9IZWlmRGVjb2RlckltcGwuY3BwCmluZGV4IDAxZjAxNGYuLmJiYzE0YTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYmhlaWYvSGVpZkRlY29kZXJJbXBsLmNwcAorKysgYi9tZWRpYS9saWJoZWlmL0hlaWZEZWNvZGVySW1wbC5jcHAKQEAgLTY2LDkgKzY2LDYgQEAKICAgICB2b2lkIGNsb3NlKCkge30KICAgICB1aW50MzJfdCBnZXRGbGFncygpIG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KICAgICBTdHJpbmc4IHRvU3RyaW5nKCkgb3ZlcnJpZGUgeyByZXR1cm4gU3RyaW5nOCgiSGVpZkRhdGFTb3VyY2UiKTsgfQotICAgIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIqKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KIAogcHJpdmF0ZToKICAgICBlbnVtIHsKQEAgLTg2LDcgKzgzLDcgQEAKICAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OwogICAgIHN0ZDo6dW5pcXVlX3B0cjxIZWlmU3RyZWFtPiBtU3RyZWFtOwogICAgIGJvb2wgbUVPUzsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdD4gbUNhY2hlOworICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IG1DYWNoZTsKICAgICBvZmY2NF90IG1DYWNoZWRPZmZzZXQ7CiAgICAgc2l6ZV90IG1DYWNoZWRTaXplOwogICAgIHNpemVfdCBtQ2FjaGVCdWZmZXJTaXplOwpAQCAtMTY1LDcgKzE2Miw3IEBACiAgICAgICAgIC8vIGl0J3MgcmVhY2hpbmcgbWF4IGNhY2hlIGJ1ZmZlciBzaXplLCBuZWVkIHRvIHJvbGwgd2luZG93LCBhbmQgcG9zc2libHkKICAgICAgICAgLy8gZXhwYW5kIHRoZSBjYWNoZSBidWZmZXIuCiAgICAgICAgIHNpemVfdCBuZXdDYWNoZUJ1ZmZlclNpemUgPSBtQ2FjaGVCdWZmZXJTaXplOwotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdD4gbmV3Q2FjaGU7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IG5ld0NhY2hlOwogICAgICAgICB1aW50OF90KiBkc3QgPSBtQ2FjaGUuZ2V0KCk7CiAgICAgICAgIGlmIChuZXdDYWNoZUJ1ZmZlclNpemUgPCBrTWF4Q2FjaGVCdWZmZXJTaXplKSB7CiAgICAgICAgICAgICBuZXdDYWNoZUJ1ZmZlclNpemUgPSBrTWF4Q2FjaGVCdWZmZXJTaXplOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGliaGVpZi9pbmNsdWRlL0hlaWZEZWNvZGVyQVBJLmggYi9tZWRpYS9saWJoZWlmL2luY2x1ZGUvSGVpZkRlY29kZXJBUEkuaAppbmRleCA1MTgzYzM5Li5hYTEwZjMzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJoZWlmL2luY2x1ZGUvSGVpZkRlY29kZXJBUEkuaAorKysgYi9tZWRpYS9saWJoZWlmL2luY2x1ZGUvSGVpZkRlY29kZXJBUEkuaApAQCAtNzQsNyArNzQsNyBAQAogICAgIGludDMyX3QgIG1Sb3RhdGlvbkFuZ2xlOyAgICAgICAgICAgLy8gUm90YXRpb24gYW5nbGUsIGNsb2Nrd2lzZSwgc2hvdWxkIGJlIG11bHRpcGxlIG9mIDkwCiAgICAgdWludDMyX3QgbUJ5dGVzUGVyUGl4ZWw7ICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgZm9yIG9uZSBwaXhlbAogICAgIHVpbnQzMl90IG1JY2NTaXplOyAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIG1JY2NEYXRhCi0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3Q+IG1JY2NEYXRhOyAvLyBBY3R1YWwgSUNDIGRhdGEsIG1lbW9yeSBpcyBvd25lZCBieSB0aGlzIHN0cnVjdHVyZQorICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IG1JY2NEYXRhOyAvLyBBY3R1YWwgSUNDIGRhdGEsIG1lbW9yeSBpcyBvd25lZCBieSB0aGlzIHN0cnVjdHVyZQogfTsKIAogLyoKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYS9BbmRyb2lkLmJwCmluZGV4IGU1YjU0ODEuLjc3OGVlNDQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWEvQW5kcm9pZC5icApAQCAtMSwxMCArMSwzIEBACi1jY19kZWZhdWx0cyB7Ci0gICAgbmFtZTogImxpYm1lZGlhX2RlZmF1bHRzIiwKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImJpb25pYy9saWJjL3ByaXZhdGUiLAotICAgIF0sCi19Ci0KIGNjX2xpYnJhcnlfaGVhZGVycyB7CiAgICAgbmFtZTogImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCkBAIC0yMiwyOCArMTUsNiBAQAogICAgIF0sCiB9CiAKLWNjX2xpYnJhcnkgewotICAgIG5hbWU6ICJsaWJtZWRpYV9oZWxwZXIiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCi0gICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAotICAgIHNyY3M6IFsiQXVkaW9QYXJhbWV0ZXIuY3BwIiwgIlR5cGVDb252ZXJ0ZXIuY3BwIiwgIlRpbWVDaGVjay5jcHAiXSwKLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCi0gICAgICAgICItV2FsbCIsCi0gICAgXSwKLSAgICBzaGFyZWRfbGliczogWyJsaWJ1dGlscyIsICJsaWJsb2ciXSwKLSAgICBoZWFkZXJfbGliczogWwotICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCi0gICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKLSAgICAgICAgImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIiwKLSAgICBdLAotICAgIGNsYW5nOiB0cnVlLAotfQotCiBmaWxlZ3JvdXAgewogICAgIG5hbWU6ICJsaWJtZWRpYV9vbXhfYWlkbCIsCiAgICAgc3JjczogWwpAQCAtNjQsMTMgKzM1LDEwIEBACiAgICAgc3JjczogWwogICAgICAgICAiOmxpYm1lZGlhX29teF9haWRsIiwKIAotICAgICAgICAiSU1lZGlhQ29kZWNMaXN0LmNwcCIsCiAgICAgICAgICJJT01YLmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjQnVmZmVyLmNwcCIsCi0gICAgICAgICJNZWRpYUNvZGVjSW5mby5jcHAiLAogICAgICAgICAiT01YQnVmZmVyLmNwcCIsCiAgICAgICAgICJvbXgvMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmNwcCIsCi0gICAgICAgICJvbXgvMS4wL1dPbXguY3BwIiwKICAgICAgICAgIm9teC8xLjAvV09teEJ1ZmZlclNvdXJjZS5jcHAiLAogICAgICAgICAib214LzEuMC9XT214Tm9kZS5jcHAiLAogICAgICAgICAib214LzEuMC9XT214T2JzZXJ2ZXIuY3BwIiwKQEAgLTgxLDE0ICs0OSwxNiBAQAogICAgICAgICBleHBvcnRfYWlkbF9oZWFkZXJzOiB0cnVlLAogICAgIH0sCiAKKyAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJndWkiLAogICAgICAgICAibGliaGlkbGJhc2UiLAotICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCiAgICAgICAgICJsaWJ1aSIsCkBAIC0xMDMsMTUgKzczLDc4IEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJhaWRsIiwKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KKworCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYm1lZGlhX29teF9jbGllbnQiLAorCisgICAgc3JjczogWworICAgICAgICAib214LzEuMC9XT214LmNwcCIsCisgICAgXSwKKworICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidWkiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKKworICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKICAgICBdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC0xMzgsNiArMTcxLDExIEBACiAgICAgICAgICJsaWJzb25pdm94IiwKICAgICBdLAogCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCkBAIC0xNTMsMjEgKzE5MSw1MyBAQAogICAgIH0sCiB9CiAKLWZpbGVncm91cCB7Ci0gICAgbmFtZTogIm1lZGlhdXBkYXRlc2VydmljZV9haWRsIiwKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlibWVkaWFfY29kZWNsaXN0IiwKKwogICAgIHNyY3M6IFsKLSAgICAgICAgImFpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmFpZGwiLAorICAgICAgICAiSU1lZGlhQ29kZWNMaXN0LmNwcCIsCisgICAgICAgICJNZWRpYUNvZGVjSW5mby5jcHAiLAogICAgIF0sCi0gICAgcGF0aDogImFpZGwiLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgInN5c3RlbS9saWJoaWRsL3RyYW5zcG9ydC90b2tlbi8xLjAvdXRpbHMvaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKIH0KIAogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm1lZGlhIiwKIAotICAgIGRlZmF1bHRzOiBbICJsaWJtZWRpYV9kZWZhdWx0cyIgXSwKLQogICAgIHNyY3M6IFsKLSAgICAgICAgIjptZWRpYXVwZGF0ZXNlcnZpY2VfYWlkbCIsCiAgICAgICAgICJJRGF0YVNvdXJjZS5jcHAiLAogICAgICAgICAiQnVmZmVyaW5nU2V0dGluZ3MuY3BwIiwKICAgICAgICAgIm1lZGlhcGxheWVyLmNwcCIsCkBAIC0xOTEsOCArMjYxLDYgQEAKICAgICAgICAgIm1lZGlhcmVjb3JkZXIuY3BwIiwKICAgICAgICAgIklNZWRpYU1ldGFkYXRhUmV0cmlldmVyLmNwcCIsCiAgICAgICAgICJtZWRpYW1ldGFkYXRhcmV0cmlldmVyLmNwcCIsCi0gICAgICAgICJNaWRpRGV2aWNlSW5mby5jcHAiLAotICAgICAgICAiSmV0UGxheWVyLmNwcCIsCiAgICAgICAgICJNZWRpYVNjYW5uZXIuY3BwIiwKICAgICAgICAgIk1lZGlhU2Nhbm5lckNsaWVudC5jcHAiLAogICAgICAgICAiQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3Rvci5jcHAiLApAQCAtMjAwLDggKzI2OCw5IEBACiAgICAgICAgICJNZWRpYVByb2ZpbGVzLmNwcCIsCiAgICAgICAgICJNZWRpYVJlc291cmNlLmNwcCIsCiAgICAgICAgICJNZWRpYVJlc291cmNlUG9saWN5LmNwcCIsCi0gICAgICAgICJWaXN1YWxpemVyLmNwcCIsCiAgICAgICAgICJTdHJpbmdBcnJheS5jcHAiLAorICAgICAgICAiTmRrTWVkaWFGb3JtYXRQcml2LmNwcCIsCisgICAgICAgICJOZGtNZWRpYUVycm9yUHJpdi5jcHAiLAogICAgIF0sCiAKICAgICBhaWRsOiB7CkBAIC0yMTAsMTEgKzI3OSwxNCBAQAogICAgIH0sCiAKICAgICBoZWFkZXJfbGliczogWworICAgICAgICAiYmlvbmljX2xpYmNfcGxhdGZvcm1faGVhZGVycyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKICAgICBdLAogCiAgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWwogICAgICAgICAibGlic3RhZ2VmcmlnaHRfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCkBAIC0yMjksMTEgKzMwMSwxMCBAQAogICAgICAgICAibGliZXhwYXQiLAogICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJkbCIsCi0gICAgICAgICJsaWJhdWRpb3V0aWxzIiwKICAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKKyAgICAgICAgImxpYm1lZGlhX2NvZGVjbGlzdCIsCiAgICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgIF0sCiAKQEAgLTI0Nyw3ICszMTgsNiBAQAogCiAgICAgc3RhdGljX2xpYnM6IFsKICAgICAgICAgImxpYmNfbWFsbG9jX2RlYnVnX2JhY2t0cmFjZSIsICAvLyBmb3IgbWVtb3J5IGhlYXAgYW5hbHlzaXMKLSAgICAgICAgImxpYm1lZGlhX21pZGlpb3dyYXBwZXIiLAogICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCkBAIC0yNzAsNjcgKzM0MCwzIEBACiAgICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAogfQotCi1jY19saWJyYXJ5IHsKLSAgICBuYW1lOiAibGlibWVkaWFfcGxheWVyMl91dGlsIiwKLQotICAgIGRlZmF1bHRzOiBbICJsaWJtZWRpYV9kZWZhdWx0cyIgXSwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgIkJ1ZmZlcmluZ1NldHRpbmdzLmNwcCIsCi0gICAgICAgICJEYXRhU291cmNlRGVzYy5jcHAiLAotICAgICAgICAiSURhdGFTb3VyY2UuY3BwIiwKLSAgICAgICAgIklNZWRpYUV4dHJhY3Rvci5jcHAiLAotICAgICAgICAiSU1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAiLAotICAgICAgICAiSU1lZGlhU291cmNlLmNwcCIsCi0gICAgICAgICJNZWRpYUNvZGVjQnVmZmVyLmNwcCIsCi0gICAgICAgICJNZWRpYVV0aWxzLmNwcCIsCi0gICAgICAgICJNZXRhZGF0YS5jcHAiLAotICAgICAgICAiTmRrV3JhcHBlci5jcHAiLAotICAgIF0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAotICAgICAgICAibGlibWVkaWFuZGsiLAotICAgICAgICAibGlibmF0aXZld2luZG93IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidWkiLAotICAgICAgICAibGlidXRpbHMiLAotICAgIF0sCi0KLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGlibWVkaWFuZGsiLAotICAgIF0sCi0KLSAgICBoZWFkZXJfbGliczogWwotICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAotICAgIF0sCi0KLSAgICBzdGF0aWNfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLAotICAgIF0sCi0KLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2Vycm9yIiwKLSAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAotICAgICAgICAiLVdhbGwiLAotICAgIF0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgXSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9BdWRpb1BhcmFtZXRlci5jcHAgYi9tZWRpYS9saWJtZWRpYS9BdWRpb1BhcmFtZXRlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNGY3YzIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvQXVkaW9QYXJhbWV0ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjE3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDYtMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQXVkaW9QYXJhbWV0ZXIiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RhdGljCi1jb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcgPSBBVURJT19QQVJBTUVURVJfU1RSRUFNX1JPVVRJTkc7Ci1jb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVNhbXBsaW5nUmF0ZSA9IEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU0FNUExJTkdfUkFURTsKLWNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5Rm9ybWF0ID0gQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9GT1JNQVQ7Ci1jb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleUNoYW5uZWxzID0gQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9DSEFOTkVMUzsKLWNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5RnJhbWVDb3VudCA9IEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fRlJBTUVfQ09VTlQ7Ci1jb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleUlucHV0U291cmNlID0gQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9JTlBVVF9TT1VSQ0U7Ci1jb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVNjcmVlblN0YXRlID0gQVVESU9fUEFSQU1FVEVSX0tFWV9TQ1JFRU5fU1RBVEU7Ci1jb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleUJ0TnJlYyA9IEFVRElPX1BBUkFNRVRFUl9LRVlfQlRfTlJFQzsKLWNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5SHdBdlN5bmMgPSBBVURJT19QQVJBTUVURVJfSFdfQVZfU1lOQzsKLWNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5UHJlc2VudGF0aW9uSWQgPSBBVURJT19QQVJBTUVURVJfU1RSRUFNX1BSRVNFTlRBVElPTl9JRDsKLWNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5UHJvZ3JhbUlkID0gQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9QUk9HUkFNX0lEOwotY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlNb25vT3V0cHV0ID0gQVVESU9fUEFSQU1FVEVSX01PTk9fT1VUUFVUOwotY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1Id0F2U3luYyA9IEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fSFdfQVZfU1lOQzsKLWNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtQ29ubmVjdCA9IEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfQ09OTkVDVDsKLWNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtRGlzY29ubmVjdCA9IEFVRElPX1BBUkFNRVRFUl9ERVZJQ0VfRElTQ09OTkVDVDsKLWNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkRm9ybWF0cyA9IEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0ZPUk1BVFM7Ci1jb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzID0gQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfQ0hBTk5FTFM7Ci1jb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMgPQotICAgICAgICBBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9TQU1QTElOR19SQVRFUzsKLWNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6dmFsdWVPbiA9IEFVRElPX1BBUkFNRVRFUl9WQUxVRV9PTjsKLWNvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6dmFsdWVPZmYgPSBBVURJT19QQVJBTUVURVJfVkFMVUVfT0ZGOwotY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IgPSBBVURJT19QQVJBTUVURVJfVkFMVUVfTElTVF9TRVBBUkFUT1I7Ci1jb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVJlY29uZmlnQTJkcCA9IEFVRElPX1BBUkFNRVRFUl9SRUNPTkZJR19BMkRQOwotY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQgPSBBVURJT19QQVJBTUVURVJfQTJEUF9SRUNPTkZJR19TVVBQT1JURUQ7Ci0KLUF1ZGlvUGFyYW1ldGVyOjpBdWRpb1BhcmFtZXRlcihjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzKQotewotICAgIGNoYXIgKnN0ciA9IG5ldyBjaGFyW2tleVZhbHVlUGFpcnMubGVuZ3RoKCkrMV07Ci0gICAgbUtleVZhbHVlUGFpcnMgPSBrZXlWYWx1ZVBhaXJzOwotICAgIGNoYXIgKmxhc3Q7Ci0KLSAgICBzdHJjcHkoc3RyLCBrZXlWYWx1ZVBhaXJzLnN0cmluZygpKTsKLSAgICBjaGFyICpwYWlyID0gc3RydG9rX3Ioc3RyLCAiOyIsICZsYXN0KTsKLSAgICB3aGlsZSAocGFpciAhPSBOVUxMKSB7Ci0gICAgICAgIGlmIChzdHJsZW4ocGFpcikgIT0gMCkgewotICAgICAgICAgICAgc2l6ZV90IGVxSWR4ID0gc3RyY3NwbihwYWlyLCAiPSIpOwotICAgICAgICAgICAgU3RyaW5nOCBrZXkgPSBTdHJpbmc4KHBhaXIsIGVxSWR4KTsKLSAgICAgICAgICAgIFN0cmluZzggdmFsdWU7Ci0gICAgICAgICAgICBpZiAoZXFJZHggPT0gc3RybGVuKHBhaXIpKSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBTdHJpbmc4KCIiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBTdHJpbmc4KHBhaXIgKyBlcUlkeCArIDEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1QYXJhbWV0ZXJzLmluZGV4T2ZLZXkoa2V5KSA8IDApIHsKLSAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5hZGQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1QYXJhbWV0ZXJzLnJlcGxhY2VWYWx1ZUZvcihrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJBdWRpb1BhcmFtZXRlcigpIGNzdG9yIGVtcHR5IGtleSB2YWx1ZSBwYWlyIik7Ci0gICAgICAgIH0KLSAgICAgICAgcGFpciA9IHN0cnRva19yKE5VTEwsICI7IiwgJmxhc3QpOwotICAgIH0KLQotICAgIGRlbGV0ZVtdIHN0cjsKLX0KLQotQXVkaW9QYXJhbWV0ZXI6On5BdWRpb1BhcmFtZXRlcigpCi17Ci0gICAgbVBhcmFtZXRlcnMuY2xlYXIoKTsKLX0KLQotU3RyaW5nOCBBdWRpb1BhcmFtZXRlcjo6dG9TdHJpbmdJbXBsKGJvb2wgdXNlVmFsdWVzKSBjb25zdAotewotICAgIFN0cmluZzggc3RyID0gU3RyaW5nOCgiIik7Ci0KLSAgICBzaXplX3Qgc2l6ZSA9IG1QYXJhbWV0ZXJzLnNpemUoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICBzdHIgKz0gbVBhcmFtZXRlcnMua2V5QXQoaSk7Ci0gICAgICAgIGlmICh1c2VWYWx1ZXMpIHsKLSAgICAgICAgICAgIHN0ciArPSAiPSI7Ci0gICAgICAgICAgICBzdHIgKz0gbVBhcmFtZXRlcnMudmFsdWVBdChpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaSA8IChzaXplIC0gMSkpIHN0ciArPSAiOyI7Ci0gICAgfQotICAgIHJldHVybiBzdHI7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUGFyYW1ldGVyOjphZGQoY29uc3QgU3RyaW5nOCYga2V5LCBjb25zdCBTdHJpbmc4JiB2YWx1ZSkKLXsKLSAgICBpZiAobVBhcmFtZXRlcnMuaW5kZXhPZktleShrZXkpIDwgMCkgewotICAgICAgICBtUGFyYW1ldGVycy5hZGQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9IGVsc2UgewotICAgICAgICBtUGFyYW1ldGVycy5yZXBsYWNlVmFsdWVGb3Ioa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvUGFyYW1ldGVyOjphZGRLZXkoY29uc3QgU3RyaW5nOCYga2V5KQotewotICAgIHJldHVybiBhZGQoa2V5LCBTdHJpbmc4KCkpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BhcmFtZXRlcjo6YWRkSW50KGNvbnN0IFN0cmluZzgmIGtleSwgY29uc3QgaW50IHZhbHVlKQotewotICAgIGNoYXIgc3RyWzEyXTsKLSAgICBpZiAoc25wcmludGYoc3RyLCAxMiwgIiVkIiwgdmFsdWUpID4gMCkgewotICAgICAgICBTdHJpbmc4IHN0cjggPSBTdHJpbmc4KHN0cik7Ci0gICAgICAgIHJldHVybiBhZGQoa2V5LCBzdHI4KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9QYXJhbWV0ZXI6OmFkZEZsb2F0KGNvbnN0IFN0cmluZzgmIGtleSwgY29uc3QgZmxvYXQgdmFsdWUpCi17Ci0gICAgY2hhciBzdHJbMjNdOwotICAgIGlmIChzbnByaW50ZihzdHIsIDIzLCAiJS4xMGYiLCB2YWx1ZSkgPiAwKSB7Ci0gICAgICAgIFN0cmluZzggc3RyOCA9IFN0cmluZzgoc3RyKTsKLSAgICAgICAgcmV0dXJuIGFkZChrZXksIHN0cjgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BhcmFtZXRlcjo6cmVtb3ZlKGNvbnN0IFN0cmluZzgmIGtleSkKLXsKLSAgICBpZiAobVBhcmFtZXRlcnMuaW5kZXhPZktleShrZXkpID49IDApIHsKLSAgICAgICAgbVBhcmFtZXRlcnMucmVtb3ZlSXRlbShrZXkpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvUGFyYW1ldGVyOjpnZXQoY29uc3QgU3RyaW5nOCYga2V5LCBTdHJpbmc4JiB2YWx1ZSkgY29uc3QKLXsKLSAgICBpZiAobVBhcmFtZXRlcnMuaW5kZXhPZktleShrZXkpID49IDApIHsKLSAgICAgICAgdmFsdWUgPSBtUGFyYW1ldGVycy52YWx1ZUZvcihrZXkpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvUGFyYW1ldGVyOjpnZXRJbnQoY29uc3QgU3RyaW5nOCYga2V5LCBpbnQmIHZhbHVlKSBjb25zdAotewotICAgIFN0cmluZzggc3RyODsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXQoa2V5LCBzdHI4KTsKLSAgICB2YWx1ZSA9IDA7Ci0gICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewotICAgICAgICBpbnQgdmFsOwotICAgICAgICBpZiAoc3NjYW5mKHN0cjguc3RyaW5nKCksICIlZCIsICZ2YWwpID09IDEpIHsKLSAgICAgICAgICAgIHZhbHVlID0gdmFsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0ID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdHVzX3QgQXVkaW9QYXJhbWV0ZXI6OmdldEZsb2F0KGNvbnN0IFN0cmluZzgmIGtleSwgZmxvYXQmIHZhbHVlKSBjb25zdAotewotICAgIFN0cmluZzggc3RyODsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBnZXQoa2V5LCBzdHI4KTsKLSAgICB2YWx1ZSA9IDA7Ci0gICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgewotICAgICAgICBmbG9hdCB2YWw7Ci0gICAgICAgIGlmIChzc2NhbmYoc3RyOC5zdHJpbmcoKSwgIiVmIiwgJnZhbCkgPT0gMSkgewotICAgICAgICAgICAgdmFsdWUgPSB2YWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0dXNfdCBBdWRpb1BhcmFtZXRlcjo6Z2V0QXQoc2l6ZV90IGluZGV4LCBTdHJpbmc4JiBrZXkpIGNvbnN0Ci17Ci0gICAgaWYgKG1QYXJhbWV0ZXJzLnNpemUoKSA+IGluZGV4KSB7Ci0gICAgICAgIGtleSA9IG1QYXJhbWV0ZXJzLmtleUF0KGluZGV4KTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BhcmFtZXRlcjo6Z2V0QXQoc2l6ZV90IGluZGV4LCBTdHJpbmc4JiBrZXksIFN0cmluZzgmIHZhbHVlKSBjb25zdAotewotICAgIGlmIChtUGFyYW1ldGVycy5zaXplKCkgPiBpbmRleCkgewotICAgICAgICBrZXkgPSBtUGFyYW1ldGVycy5rZXlBdChpbmRleCk7Ci0gICAgICAgIHZhbHVlID0gbVBhcmFtZXRlcnMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuY3BwIGIvbWVkaWEvbGlibWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuY3BwCmluZGV4IDI3MWEyMzguLjFjYzMwYzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5jcHAKQEAgLTI3LDI2ICsyNyw2IEBACiAgICAgICAgIDogbUluaXRpYWxNYXJrTXMoa05vTWFyayksCiAgICAgICAgICAgbVJlc3VtZVBsYXliYWNrTWFya01zKGtOb01hcmspIHsgfQogCi1zdGF0dXNfdCBCdWZmZXJpbmdTZXR0aW5nczo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIHsKLSAgICBpZiAocGFyY2VsID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgbUluaXRpYWxNYXJrTXMgPSBwYXJjZWwtPnJlYWRJbnQzMigpOwotICAgIG1SZXN1bWVQbGF5YmFja01hcmtNcyA9IHBhcmNlbC0+cmVhZEludDMyKCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEJ1ZmZlcmluZ1NldHRpbmdzOjp3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCB7Ci0gICAgaWYgKHBhcmNlbCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtSW5pdGlhbE1hcmtNcyk7Ci0gICAgcGFyY2VsLT53cml0ZUludDMyKG1SZXN1bWVQbGF5YmFja01hcmtNcyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KIFN0cmluZzggQnVmZmVyaW5nU2V0dGluZ3M6OnRvU3RyaW5nKCkgY29uc3QgewogICAgIFN0cmluZzggczsKICAgICBzLmFwcGVuZEZvcm1hdCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0RhdGFTb3VyY2VEZXNjLmNwcCBiL21lZGlhL2xpYm1lZGlhL0RhdGFTb3VyY2VEZXNjLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjdjY2JjZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9EYXRhU291cmNlRGVzYy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkRhdGFTb3VyY2VEZXNjIgotCi0jaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VEZXNjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXRpYyBjb25zdCBpbnQ2NF90IGtMb25nTWF4ID0gMHg3ZmZmZmZmZmZmZmZmZmZMOwotCi1EYXRhU291cmNlRGVzYzo6RGF0YVNvdXJjZURlc2MoKQotICAgIDogbVR5cGUoVFlQRV9OT05FKSwKLSAgICAgIG1GRE9mZnNldCgwKSwKLSAgICAgIG1GRExlbmd0aChrTG9uZ01heCksCi0gICAgICBtSWQoMCksCi0gICAgICBtU3RhcnRQb3NpdGlvbk1zKDApLAotICAgICAgbUVuZFBvc2l0aW9uTXMoMCkgewotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSURhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSURhdGFTb3VyY2UuY3BwCmluZGV4IDMxYzg1YWYuLjYxZjBhNjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lEYXRhU291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JRGF0YVNvdXJjZS5jcHAKQEAgLTIzLDcgKzIzLDYgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGRybS9kcm1fZnJhbWV3b3JrX2NvbW1vbi5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTM1LDcgKzM0LDYgQEAKICAgICBDTE9TRSwKICAgICBHRVRfRkxBR1MsCiAgICAgVE9fU1RSSU5HLAotICAgIERSTV9JTklUSUFMSVpBVElPTiwKIH07CiAKIHN0cnVjdCBCcERhdGFTb3VyY2UgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SURhdGFTb3VyY2U+IHsKQEAgLTk1LDQ3ICs5Myw2IEBACiAgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChUT19TVFJJTkcsIGRhdGEsICZyZXBseSk7CiAgICAgICAgIHJldHVybiByZXBseS5yZWFkU3RyaW5nOCgpOwogICAgIH0KLQotICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqbWltZSkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJRGF0YVNvdXJjZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgaWYgKG1pbWUgPT0gTlVMTCkgewotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGF0YS53cml0ZUludDMyKDEpOwotICAgICAgICAgICAgZGF0YS53cml0ZUNTdHJpbmcobWltZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KERSTV9JTklUSUFMSVpBVElPTiwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgc3A8RGVjcnlwdEhhbmRsZT4gaGFuZGxlOwotICAgICAgICBpZiAocmVwbHkuZGF0YUF2YWlsKCkgIT0gMCkgewotICAgICAgICAgICAgaGFuZGxlID0gbmV3IERlY3J5cHRIYW5kbGUoKTsKLSAgICAgICAgICAgIGhhbmRsZS0+ZGVjcnlwdElkID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBoYW5kbGUtPm1pbWVUeXBlID0gcmVwbHkucmVhZFN0cmluZzgoKTsKLSAgICAgICAgICAgIGhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGhhbmRsZS0+c3RhdHVzID0gcmVwbHkucmVhZEludDMyKCk7Ci0KLSAgICAgICAgICAgIGNvbnN0IGludCBidWZmZXJMZW5ndGggPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKGJ1ZmZlckxlbmd0aCAhPSAtMSkgewotICAgICAgICAgICAgICAgIGhhbmRsZS0+ZGVjcnlwdEluZm8gPSBuZXcgRGVjcnlwdEluZm8oKTsKLSAgICAgICAgICAgICAgICBoYW5kbGUtPmRlY3J5cHRJbmZvLT5kZWNyeXB0QnVmZmVyTGVuZ3RoID0gYnVmZmVyTGVuZ3RoOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzaXplX3Qgc2l6ZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICAgICAgICAgIERybUNvcHlDb250cm9sIGtleSA9IChEcm1Db3B5Q29udHJvbClkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgIGludCB2YWx1ZSA9IGRhdGEucmVhZEludDMyKCk7Ci0gICAgICAgICAgICAgICAgaGFuZGxlLT5jb3B5Q29udHJvbFZlY3Rvci5hZGQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNpemUgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmc4IGtleSA9IGRhdGEucmVhZFN0cmluZzgoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmc4IHZhbHVlID0gZGF0YS5yZWFkU3RyaW5nOCgpOwotICAgICAgICAgICAgICAgIGhhbmRsZS0+ZXh0ZW5kZWREYXRhLmFkZChrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaGFuZGxlOwotICAgIH0KIH07CiAKIElNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShEYXRhU291cmNlLCAiYW5kcm9pZC5tZWRpYS5JRGF0YVNvdXJjZSIpOwpAQCAtMTc4LDQyICsxMzUsNiBAQAogICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOCh0b1N0cmluZygpKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKLSAgICAgICAgY2FzZSBEUk1fSU5JVElBTElaQVRJT046IHsKLSAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJRGF0YVNvdXJjZSwgZGF0YSwgcmVwbHkpOwotICAgICAgICAgICAgY29uc3QgY2hhciAqbWltZSA9IE5VTEw7Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IGZsYWcgPSBkYXRhLnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaWYgKGZsYWcgIT0gMCkgewotICAgICAgICAgICAgICAgIG1pbWUgPSBkYXRhLnJlYWRDU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxEZWNyeXB0SGFuZGxlPiBoYW5kbGUgPSBEcm1Jbml0aWFsaXphdGlvbihtaW1lKTsKLSAgICAgICAgICAgIGlmIChoYW5kbGUgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGhhbmRsZS0+ZGVjcnlwdElkKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KGhhbmRsZS0+bWltZVR5cGUpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGhhbmRsZS0+c3RhdHVzKTsKLQotICAgICAgICAgICAgICAgIGlmIChoYW5kbGUtPmRlY3J5cHRJbmZvICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaGFuZGxlLT5kZWNyeXB0SW5mby0+ZGVjcnlwdEJ1ZmZlckxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoLTEpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHNpemVfdCBzaXplID0gaGFuZGxlLT5jb3B5Q29udHJvbFZlY3Rvci5zaXplKCk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2l6ZSk7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaGFuZGxlLT5jb3B5Q29udHJvbFZlY3Rvci5rZXlBdChpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGhhbmRsZS0+Y29weUNvbnRyb2xWZWN0b3IudmFsdWVBdChpKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc2l6ZSA9IGhhbmRsZS0+ZXh0ZW5kZWREYXRhLnNpemUoKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzaXplKTsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7ICsraSkgewotICAgICAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVTdHJpbmc4KGhhbmRsZS0+ZXh0ZW5kZWREYXRhLmtleUF0KGkpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOChoYW5kbGUtPmV4dGVuZGVkRGF0YS52YWx1ZUF0KGkpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0gYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yLmNwcAppbmRleCBlOWE2MjMwLi5mYjZkM2EyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgpAQCAtMjE5LDEwICsyMjAsMTYgQEAKICAgICBWZWN0b3I8d3A8SU1lZGlhU291cmNlPj4gdHJhY2tzOwogICAgIFZlY3RvcjxTdHJpbmc4PiB0cmFja0Rlc2NyaXB0aW9uczsKICAgICBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3Q7CisgICAgdGltZV90IHdoZW47CiB9IEV4dHJhY3Rvckluc3RhbmNlOwogCiBTdHJpbmc4IEV4dHJhY3Rvckluc3RhbmNlOjp0b1N0cmluZygpIGNvbnN0IHsKLSAgICBTdHJpbmc4IHN0ciA9IG5hbWU7CisgICAgU3RyaW5nOCBzdHI7CisgICAgY2hhciB0aW1lU3RyaW5nWzMyXTsKKyAgICBzdHJmdGltZSh0aW1lU3RyaW5nLCBzaXplb2YodGltZVN0cmluZyksICIlbS0lZCAlVCIsIGxvY2FsdGltZSgmd2hlbikpOworICAgIHN0ci5hcHBlbmQodGltZVN0cmluZyk7CisgICAgc3RyLmFwcGVuZCgiOiAiKTsKKyAgICBzdHIuYXBwZW5kKG5hbWUpOwogICAgIHN0ci5hcHBlbmQoIiBmb3IgbWltZSAiKTsKICAgICBzdHIuYXBwZW5kKG1pbWUpOwogICAgIHN0ci5hcHBlbmQoIiwgc291cmNlICIpOwpAQCAtMjg3LDYgKzI5NCw3IEBACiAgICAgZXguc291cmNlRGVzY3JpcHRpb24gPSBzb3VyY2UtPnRvU3RyaW5nKCk7CiAgICAgZXgub3duZXIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgZXguZXh0cmFjdG9yID0gZXh0cmFjdG9yOworICAgIGV4LndoZW4gPSB0aW1lKE5VTEwpOwogCiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhzRXh0cmFjdG9yc0xvY2spOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAppbmRleCBkNzUzM2NhLi4yNDNiMDlkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcApAQCAtMjMsMTMgKzIzLDEzIEBACiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CiAjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGVudW0gewogICAgIE1BS0VfRVhUUkFDVE9SID0gSUJpbmRlcjo6RklSU1RfQ0FMTF9UUkFOU0FDVElPTiwKICAgICBNQUtFX0lEQVRBX1NPVVJDRV9GRCwKKyAgICBHRVRfU1VQUE9SVEVEX1RZUEVTLAogfTsKIAogY2xhc3MgQnBNZWRpYUV4dHJhY3RvclNlcnZpY2UgOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU1lZGlhRXh0cmFjdG9yU2VydmljZT4KQEAgLTY5LDYgKzY5LDI0IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIG51bGxwdHI7CiAgICAgfQorCisgICAgdmlydHVhbCBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGdldFN1cHBvcnRlZFR5cGVzKCkgeworICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IHN1cHBvcnRlZFR5cGVzOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOworICAgICAgICBzdGF0dXNfdCByZXQgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX1NVUFBPUlRFRF9UWVBFUywgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgLy8gcHJvY2VzcyByZXBseQorICAgICAgICAgICAgd2hpbGUodHJ1ZSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmV4dCA9IHJlcGx5LnJlYWRDU3RyaW5nKCk7CisgICAgICAgICAgICAgICAgaWYgKCFleHQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHN1cHBvcnRlZFR5cGVzLmluc2VydChzdGQ6OnN0cmluZyhleHQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc3VwcG9ydGVkVHlwZXM7CisgICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE1lZGlhRXh0cmFjdG9yU2VydmljZSwgImFuZHJvaWQubWVkaWEuSU1lZGlhRXh0cmFjdG9yU2VydmljZSIpOwpAQCAtMTE0LDYgKzEzMiwxNSBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBHRVRfU1VQUE9SVEVEX1RZUEVTOgorICAgICAgICB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhRXh0cmFjdG9yU2VydmljZSwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBzdXBwb3J0ZWRUeXBlcyA9IGdldFN1cHBvcnRlZFR5cGVzKCk7CisgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBzdXBwb3J0ZWRUeXBlcy5iZWdpbigpOyBpdCAhPSBzdXBwb3J0ZWRUeXBlcy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUNTdHJpbmcoKCppdCkuY19zdHIoKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBCQmluZGVyOjpvblRyYW5zYWN0KGNvZGUsIGRhdGEsIHJlcGx5LCBmbGFncyk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllci5jcHAKaW5kZXggZTJlY2NkZC4uZWEwNjY2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFQbGF5ZXIuY3BwCkBAIC0xNzksNyArMTc5LDggQEAKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElNZWRpYVBsYXllcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgYnVmZmVyaW5nLndyaXRlVG9QYXJjZWwoJmRhdGEpOworICAgICAgICBkYXRhLndyaXRlSW50MzIoYnVmZmVyaW5nLm1Jbml0aWFsTWFya01zKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKGJ1ZmZlcmluZy5tUmVzdW1lUGxheWJhY2tNYXJrTXMpOwogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX0JVRkZFUklOR19TRVRUSU5HUywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgcmV0dXJuIHJlcGx5LnJlYWRJbnQzMigpOwogICAgIH0KQEAgLTE5NCw3ICsxOTUsOCBAQAogICAgICAgICByZW1vdGUoKS0+dHJhbnNhY3QoR0VUX0JVRkZFUklOR19TRVRUSU5HUywgZGF0YSwgJnJlcGx5KTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgIGVyciA9IGJ1ZmZlcmluZy0+cmVhZEZyb21QYXJjZWwoJnJlcGx5KTsKKyAgICAgICAgICAgIGJ1ZmZlcmluZy0+bUluaXRpYWxNYXJrTXMgPSByZXBseS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGJ1ZmZlcmluZy0+bVJlc3VtZVBsYXliYWNrTWFya01zID0gcmVwbHkucmVhZEludDMyKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGVycjsKICAgICB9CkBAIC02OTYsNyArNjk4LDggQEAKICAgICAgICAgY2FzZSBTRVRfQlVGRkVSSU5HX1NFVFRJTkdTOiB7CiAgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSU1lZGlhUGxheWVyLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyBidWZmZXJpbmc7Ci0gICAgICAgICAgICBidWZmZXJpbmcucmVhZEZyb21QYXJjZWwoJmRhdGEpOworICAgICAgICAgICAgYnVmZmVyaW5nLm1Jbml0aWFsTWFya01zID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGJ1ZmZlcmluZy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgPSBkYXRhLnJlYWRJbnQzMigpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKSk7CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0gYnJlYWs7CkBAIC03MDYsNyArNzA5LDggQEAKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGdldEJ1ZmZlcmluZ1NldHRpbmdzKCZidWZmZXJpbmcpOwogICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoZXJyKTsKICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBidWZmZXJpbmcud3JpdGVUb1BhcmNlbChyZXBseSk7CisgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoYnVmZmVyaW5nLm1Jbml0aWFsTWFya01zKTsKKyAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihidWZmZXJpbmcubVJlc3VtZVBsYXliYWNrTWFya01zKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggYWNhN2FkOS4uYmQxOGE0MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFSZWNvcmRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KICNpbmNsdWRlIDxtZWRpYS9JUmVtb3RlRGlzcGxheS5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhUmVjb3JkZXIuY3BwCmluZGV4IGIyYzkxYzQuLmEzNTRjZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFSZWNvcmRlci5jcHAKQEAgLTY1LDcgKzY1LDkgQEAKICAgICBHRVRfUk9VVEVEX0RFVklDRV9JRCwKICAgICBFTkFCTEVfQVVESU9fREVWSUNFX0NBTExCQUNLLAogICAgIEdFVF9BQ1RJVkVfTUlDUk9QSE9ORVMsCi0KKyAgICBHRVRfUE9SVF9JRCwKKyAgICBTRVRfUFJFRkVSUkVEX01JQ1JPUEhPTkVfRElSRUNUSU9OLAorICAgIFNFVF9QUkVGRVJSRURfTUlDUk9QSE9ORV9GSUVMRF9ESU1FTlNJT04KIH07CiAKIGNsYXNzIEJwTWVkaWFSZWNvcmRlcjogcHVibGljIEJwSW50ZXJmYWNlPElNZWRpYVJlY29yZGVyPgpAQCAtNDA3LDYgKzQwOSw0MSBAQAogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAorICAgIHN0YXR1c190IHNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICAgICAgQUxPR1YoInNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oJWQpIiwgZGlyZWN0aW9uKTsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUmVjb3JkZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVJbnQzMihkaXJlY3Rpb24pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1BSRUZFUlJFRF9NSUNST1BIT05FX0RJUkVDVElPTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSBOT19FUlJPUiA/IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSA6IHN0YXR1czsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgeworICAgICAgICBBTE9HVigic2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKCVmKSIsIHpvb20pOworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJTWVkaWFSZWNvcmRlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUZsb2F0KHpvb20pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSByZW1vdGUoKS0+dHJhbnNhY3QoU0VUX1BSRUZFUlJFRF9NSUNST1BIT05FX0ZJRUxEX0RJTUVOU0lPTiwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgcmV0dXJuIHN0YXR1cyA9PSBOT19FUlJPUiA/IChzdGF0dXNfdClyZXBseS5yZWFkSW50MzIoKSA6IHN0YXR1czsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQorICAgIHsKKyAgICAgICAgQUxPR1YoImdldFBvcnRJZCIpOworICAgICAgICBpZiAocG9ydElkID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU1lZGlhUmVjb3JkZXI6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChHRVRfUE9SVF9JRCwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBPSworICAgICAgICAgICAgICAgIHx8IChzdGF0dXMgPSAoc3RhdHVzX3QpcmVwbHkucmVhZEludDMyKCkpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAqcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgKnBvcnRJZCA9IChhdWRpb19wb3J0X2hhbmRsZV90KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQogfTsKIAogSU1QTEVNRU5UX01FVEFfSU5URVJGQUNFKE1lZGlhUmVjb3JkZXIsICJhbmRyb2lkLm1lZGlhLklNZWRpYVJlY29yZGVyIik7CkBAIC02NjEsNiArNjk4LDM0IEBACiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAKICAgICAgICAgfQorICAgICAgICBjYXNlIEdFVF9QT1JUX0lEOiB7CisgICAgICAgICAgICBBTE9HVigiR0VUX1BPUlRfSUQiKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQ7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRQb3J0SWQoJnBvcnRJZCk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHBvcnRJZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBTRVRfUFJFRkVSUkVEX01JQ1JPUEhPTkVfRElSRUNUSU9OOiB7CisgICAgICAgICAgICBBTE9HVigiU0VUX1BSRUZFUlJFRF9NSUNST1BIT05FX0RJUkVDVElPTiIpOworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYVJlY29yZGVyLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBpbnQgZGlyZWN0aW9uID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3Q+KGRpcmVjdGlvbikpOworICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICBjYXNlIFNFVF9QUkVGRVJSRURfTUlDUk9QSE9ORV9GSUVMRF9ESU1FTlNJT046IHsKKyAgICAgICAgICAgIEFMT0dWKCJTRVRfTUlDUk9QSE9ORV9GSUVMRF9ESU1FTlNJT04iKTsKKyAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJTWVkaWFSZWNvcmRlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgZmxvYXQgem9vbSA9IGRhdGEucmVhZEZsb2F0KCk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oem9vbSk7CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gQkJpbmRlcjo6b25UcmFuc2FjdChjb2RlLCBkYXRhLCByZXBseSwgZmxhZ3MpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JTWVkaWFTb3VyY2UuY3BwCmluZGV4IGYxODVmZDQuLjUwODI2YzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL0lNZWRpYVNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU1lZGlhU291cmNlLmNwcApAQCAtMTA3LDYgKzEwNyw3IEBACiAgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihCcE1lZGlhU291cmNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBzdGF0dXNfdCByZXQgPSByZW1vdGUoKS0+dHJhbnNhY3QoR0VURk9STUFULCBkYXRhLCAmcmVwbHkpOwogICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwogICAgICAgICAgICAgbU1ldGFEYXRhID0gTWV0YURhdGE6OmNyZWF0ZUZyb21QYXJjZWwocmVwbHkpOwogICAgICAgICAgICAgcmV0dXJuIG1NZXRhRGF0YTsKICAgICAgICAgfQpAQCAtMTg2LDYgKzE4Nyw5IEBACiAgICAgICAgIHJldCA9IHJlcGx5LnJlYWRJbnQzMigpOwogICAgICAgICBBTE9HVigicmVhZE11bHRpcGxlIHN0YXR1cyAlZCwgYnVmZmVyQ291bnQgJXUsIHNpbmNlU3RvcCAldSIsCiAgICAgICAgICAgICAgICAgcmV0LCBidWZmZXJDb3VudCwgbUJ1ZmZlcnNTaW5jZVN0b3ApOworICAgICAgICBpZiAoYnVmZmVyQ291bnQgJiYgcmV0ID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICByZXQgPSBPSzsKKyAgICAgICAgfQogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KIApAQCAtMjE5LDYgKzIyMyw4IEBACiAgICAgLy8gTnVQbGF5ZXIgcGFzc2VzIHBvaW50ZXJzLXRvLW1ldGFkYXRhIGFyb3VuZCwgc28gd2UgdXNlIHRoaXMgdG8ga2VlcCB0aGUgbWV0YWRhdGEgYWxpdmUKICAgICAvLyBYWFg6IGNvdWxkIHdlIHVzZSB0aGlzIGZvciBjYWNoaW5nLCBvciBkb2VzIG1ldGFkYXRhIGNoYW5nZSBvbiB0aGUgZmx5PwogICAgIHNwPE1ldGFEYXRhPiBtTWV0YURhdGE7CisgICAgLy8gZW5zdXJlIHN5bmNocm9uaXplIGFjY2VzcyB0byBtTWV0YURhdGEKKyAgICBNdXRleCBtTG9jazsKIAogICAgIC8vIENhY2hlIGFsbCBJTWVtb3J5IG9iamVjdHMgcmVjZWl2ZWQgZnJvbSBNZWRpYUV4dHJhY3Rvci4KICAgICAvLyBXZSBnYyBJTWVtb3J5IG9iamVjdHMgdGhhdCBhcmUgbm8gbG9uZ2VyIGFjdGl2ZSAocmVmZXJlbmNlZCBieSBhIE1lZGlhQnVmZmVyKS4KQEAgLTM2MiwxMyArMzY4LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiVXNlIHNoYXJlZCBtZW1vcnk6ICV6dSIsIGxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlckJ1ZiA9IGJ1ZjsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJMYXJnZSBidWZmZXIgJXp1IHdpdGhvdXQgSU1lbW9yeSEiLCBsZW5ndGgpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkxhcmdlIGJ1ZmZlciAlenUgd2l0aG91dCBJTWVtb3J5ISIsIGxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXQgPSBtR3JvdXAtPmFjcXVpcmVfYnVmZmVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWVkaWFCdWZmZXJCYXNlICoqKSZ0cmFuc2ZlckJ1ZiwgZmFsc2UgLyogbm9uQmxvY2tpbmcgKi8sIGxlbmd0aCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmV0ICE9IE9LCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHRyYW5zZmVyQnVmID09IG51bGxwdHIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHJhbnNmZXJCdWYtPm1NZW1vcnkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWNxdWlyZSBzaGFyZWQgbWVtb3J5LCBzaXplICV6dSwgcmV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiRmFpbGVkIHRvIGFjcXVpcmUgc2hhcmVkIG1lbW9yeSwgc2l6ZSAlenUsIHJldCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgsIHJldCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyQnVmICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJCdWYtPnJlbGVhc2UoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL0lPTVguY3BwIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKaW5kZXggYTA3MzA4MS4uYmMwYzJjZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvSU9NWC5jcHAKQEAgLTI3LDcgKzI3LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgogI2luY2x1ZGUgPG1lZGlhL09NWEJ1ZmZlci5oPgogI2luY2x1ZGUgPHV0aWxzL05hdGl2ZUhhbmRsZS5oPgotI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9JR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgpAQCAtNjIsNzkgKzYxLDYgQEAKICAgICBTRVRfUVVJUktTLAogfTsKIAotY2xhc3MgQnBPTVggOiBwdWJsaWMgQnBJbnRlcmZhY2U8SU9NWD4gewotcHVibGljOgotICAgIGV4cGxpY2l0IEJwT01YKGNvbnN0IHNwPElCaW5kZXI+ICZpbXBsKQotICAgICAgICA6IEJwSW50ZXJmYWNlPElPTVg+KGltcGwpIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3ROb2RlcyhMaXN0PENvbXBvbmVudEluZm8+ICpsaXN0KSB7Ci0gICAgICAgIGxpc3QtPmNsZWFyKCk7Ci0KLSAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwotICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSU9NWDo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKLSAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KExJU1RfTk9ERVMsIGRhdGEsICZyZXBseSk7Ci0KLSAgICAgICAgaW50MzJfdCBuID0gcmVwbHkucmVhZEludDMyKCk7Ci0gICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICAgICAgbGlzdC0+cHVzaF9iYWNrKENvbXBvbmVudEluZm8oKSk7Ci0gICAgICAgICAgICBDb21wb25lbnRJbmZvICZpbmZvID0gKi0tbGlzdC0+ZW5kKCk7Ci0KLSAgICAgICAgICAgIGluZm8ubU5hbWUgPSByZXBseS5yZWFkU3RyaW5nOCgpOwotICAgICAgICAgICAgaW50MzJfdCBudW1Sb2xlcyA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgZm9yIChpbnQzMl90IGogPSAwOyBqIDwgbnVtUm9sZXM7ICsraikgewotICAgICAgICAgICAgICAgIGluZm8ubVJvbGVzLnB1c2hfYmFjayhyZXBseS5yZWFkU3RyaW5nOCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGFsbG9jYXRlTm9kZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IHNwPElPTVhPYnNlcnZlcj4gJm9ic2VydmVyLAotICAgICAgICAgICAgc3A8SU9NWE5vZGU+ICpvbXhOb2RlKSB7Ci0gICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGRhdGEud3JpdGVDU3RyaW5nKG5hbWUpOwotICAgICAgICBkYXRhLndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKG9ic2VydmVyKSk7Ci0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChBTExPQ0FURV9OT0RFLCBkYXRhLCAmcmVwbHkpOwotCi0gICAgICAgIHN0YXR1c190IGVyciA9IHJlcGx5LnJlYWRJbnQzMigpOwotICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAqb214Tm9kZSA9IElPTVhOb2RlOjphc0ludGVyZmFjZShyZXBseS5yZWFkU3Ryb25nQmluZGVyKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgb214Tm9kZS0+Y2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVJbnB1dFN1cmZhY2UoCi0gICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiAqYnVmZmVyUHJvZHVjZXIsCi0gICAgICAgICAgICBzcDxJR3JhcGhpY0J1ZmZlclNvdXJjZT4gKmJ1ZmZlclNvdXJjZSkgewotICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7Ci0gICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElPTVg6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7Ci0gICAgICAgIGVyciA9IHJlbW90ZSgpLT50cmFuc2FjdChDUkVBVEVfSU5QVVRfU1VSRkFDRSwgZGF0YSwgJnJlcGx5KTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR1coImJpbmRlciB0cmFuc2FjdGlvbiBmYWlsZWQ6ICVkIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBlcnIgPSByZXBseS5yZWFkSW50MzIoKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgICpidWZmZXJQcm9kdWNlciA9IElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmFzSW50ZXJmYWNlKAotICAgICAgICAgICAgICAgIHJlcGx5LnJlYWRTdHJvbmdCaW5kZXIoKSk7Ci0gICAgICAgICpidWZmZXJTb3VyY2UgPSBJR3JhcGhpY0J1ZmZlclNvdXJjZTo6YXNJbnRlcmZhY2UoCi0gICAgICAgICAgICAgICAgcmVwbHkucmVhZFN0cm9uZ0JpbmRlcigpKTsKLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLX07Ci0KIGNsYXNzIEJwT01YTm9kZSA6IHB1YmxpYyBCcEludGVyZmFjZTxJT01YTm9kZT4gewogcHVibGljOgogICAgIGV4cGxpY2l0IEJwT01YTm9kZShjb25zdCBzcDxJQmluZGVyPiAmaW1wbCkKQEAgLTU1MSw4ICs0NzcsNyBAQAogICAgIH0KIH07CiAKLUlNUExFTUVOVF9NRVRBX0lOVEVSRkFDRShPTVgsICJhbmRyb2lkLmhhcmR3YXJlLklPTVgiKTsKLUlNUExFTUVOVF9IWUJSSURfTUVUQV9JTlRFUkZBQ0UoT01YTm9kZSwgSU9teE5vZGUsICJhbmRyb2lkLmhhcmR3YXJlLklPTVhOb2RlIik7CitJTVBMRU1FTlRfSFlCUklEX01FVEFfSU5URVJGQUNFKE9NWE5vZGUsICJhbmRyb2lkLmhhcmR3YXJlLklPTVhOb2RlIik7CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKQEAgLTU2Miw4MiArNDg3LDYgQEAKICAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsgXAogICAgICAgICB9IH0gd2hpbGUgKDApCiAKLXN0YXR1c190IEJuT01YOjpvblRyYW5zYWN0KAotICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCAmZGF0YSwgUGFyY2VsICpyZXBseSwgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBzd2l0Y2ggKGNvZGUpIHsKLSAgICAgICAgY2FzZSBMSVNUX05PREVTOgotICAgICAgICB7Ci0gICAgICAgICAgICBDSEVDS19PTVhfSU5URVJGQUNFKElPTVgsIGRhdGEsIHJlcGx5KTsKLQotICAgICAgICAgICAgTGlzdDxDb21wb25lbnRJbmZvPiBsaXN0OwotICAgICAgICAgICAgbGlzdE5vZGVzKCZsaXN0KTsKLQotICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIobGlzdC5zaXplKCkpOwotICAgICAgICAgICAgZm9yIChMaXN0PENvbXBvbmVudEluZm8+OjppdGVyYXRvciBpdCA9IGxpc3QuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICAgaXQgIT0gbGlzdC5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgICAgIENvbXBvbmVudEluZm8gJmN1ciA9ICppdDsKLQotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZVN0cmluZzgoY3VyLm1OYW1lKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihjdXIubVJvbGVzLnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChMaXN0PFN0cmluZzg+OjppdGVyYXRvciByb2xlX2l0ID0gY3VyLm1Sb2xlcy5iZWdpbigpOwotICAgICAgICAgICAgICAgICAgICAgcm9sZV9pdCAhPSBjdXIubVJvbGVzLmVuZCgpOyArK3JvbGVfaXQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3RyaW5nOCgqcm9sZV9pdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEFMTE9DQVRFX05PREU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIENIRUNLX09NWF9JTlRFUkZBQ0UoSU9NWCwgZGF0YSwgcmVwbHkpOwotCi0gICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gZGF0YS5yZWFkQ1N0cmluZygpOwotCi0gICAgICAgICAgICBzcDxJT01YT2JzZXJ2ZXI+IG9ic2VydmVyID0KLSAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJT01YT2JzZXJ2ZXI+KGRhdGEucmVhZFN0cm9uZ0JpbmRlcigpKTsKLQotICAgICAgICAgICAgaWYgKG5hbWUgPT0gTlVMTCB8fCBvYnNlcnZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImIvMjYzOTI3MDAiKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihJTlZBTElEX09QRVJBVElPTik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxJT01YTm9kZT4gb214Tm9kZTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gYWxsb2NhdGVOb2RlKG5hbWUsIG9ic2VydmVyLCAmb214Tm9kZSk7Ci0KLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGVycik7Ci0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKG9teE5vZGUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBDUkVBVEVfSU5QVVRfU1VSRkFDRToKLSAgICAgICAgewotICAgICAgICAgICAgQ0hFQ0tfT01YX0lOVEVSRkFDRShJT01YLCBkYXRhLCByZXBseSk7Ci0KLSAgICAgICAgICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGJ1ZmZlclByb2R1Y2VyOwotICAgICAgICAgICAgc3A8SUdyYXBoaWNCdWZmZXJTb3VyY2U+IGJ1ZmZlclNvdXJjZTsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGNyZWF0ZUlucHV0U3VyZmFjZSgmYnVmZmVyUHJvZHVjZXIsICZidWZmZXJTb3VyY2UpOwotCi0gICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihlcnIpOwotCi0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlclByb2R1Y2VyKSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPndyaXRlU3Ryb25nQmluZGVyKElJbnRlcmZhY2U6OmFzQmluZGVyKGJ1ZmZlclNvdXJjZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKLSAgICB9Ci19Ci0KIHN0YXR1c190IEJuT01YTm9kZTo6b25UcmFuc2FjdCgKICAgICB1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwgJmRhdGEsIFBhcmNlbCAqcmVwbHksIHVpbnQzMl90IGZsYWdzKSB7CiAgICAgc3dpdGNoIChjb2RlKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAKaW5kZXggOTcyNGZjMS4uZjhhMGExNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmNwcApAQCAtMzIsNiArMzIsNyBAQAogICAgIENPTkZJRyA9IElCaW5kZXI6OkZJUlNUX0NBTExfVFJBTlNBQ1RJT04sCiAgICAgQUREX1JFU09VUkNFLAogICAgIFJFTU9WRV9SRVNPVVJDRSwKKyAgICBSRU1PVkVfQ0xJRU5ULAogICAgIFJFQ0xBSU1fUkVTT1VSQ0UsCiB9OwogCkBAIC03MiwxMiArNzMsMTQgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBhZGRSZXNvdXJjZSgKICAgICAgICAgICAgIGludCBwaWQsCisgICAgICAgICAgICBpbnQgdWlkLAogICAgICAgICAgICAgaW50NjRfdCBjbGllbnRJZCwKICAgICAgICAgICAgIGNvbnN0IHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudCwKICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzKSB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpnZXRJbnRlcmZhY2VEZXNjcmlwdG9yKCkpOwogICAgICAgICBkYXRhLndyaXRlSW50MzIocGlkKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHVpZCk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQ2NChjbGllbnRJZCk7CiAgICAgICAgIGRhdGEud3JpdGVTdHJvbmdCaW5kZXIoSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KSk7CiAgICAgICAgIHdyaXRlVG9QYXJjZWwoJmRhdGEsIHJlc291cmNlcyk7CkBAIC04NSwxMyArODgsMjMgQEAKICAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KEFERF9SRVNPVVJDRSwgZGF0YSwgJnJlcGx5KTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlUmVzb3VyY2UoaW50IHBpZCwgaW50NjRfdCBjbGllbnRJZCkgeworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVSZXNvdXJjZShpbnQgcGlkLCBpbnQ2NF90IGNsaWVudElkLCBjb25zdCBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gJnJlc291cmNlcykgeworICAgICAgICBQYXJjZWwgZGF0YSwgcmVwbHk7CisgICAgICAgIGRhdGEud3JpdGVJbnRlcmZhY2VUb2tlbihJUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZUludDMyKHBpZCk7CisgICAgICAgIGRhdGEud3JpdGVJbnQ2NChjbGllbnRJZCk7CisgICAgICAgIHdyaXRlVG9QYXJjZWwoJmRhdGEsIHJlc291cmNlcyk7CisKKyAgICAgICAgcmVtb3RlKCktPnRyYW5zYWN0KFJFTU9WRV9SRVNPVVJDRSwgZGF0YSwgJnJlcGx5KTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlQ2xpZW50KGludCBwaWQsIGludDY0X3QgY2xpZW50SWQpIHsKICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVJlc291cmNlTWFuYWdlclNlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CiAgICAgICAgIGRhdGEud3JpdGVJbnQzMihwaWQpOwogICAgICAgICBkYXRhLndyaXRlSW50NjQoY2xpZW50SWQpOwogCi0gICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfUkVTT1VSQ0UsIGRhdGEsICZyZXBseSk7CisgICAgICAgIHJlbW90ZSgpLT50cmFuc2FjdChSRU1PVkVfQ0xJRU5ULCBkYXRhLCAmcmVwbHkpOwogICAgIH0KIAogICAgIHZpcnR1YWwgYm9vbCByZWNsYWltUmVzb3VyY2UoaW50IGNhbGxpbmdQaWQsIGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzKSB7CkBAIC0xMjksNiArMTQyLDcgQEAKICAgICAgICAgY2FzZSBBRERfUkVTT1VSQ0U6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJUmVzb3VyY2VNYW5hZ2VyU2VydmljZSwgZGF0YSwgcmVwbHkpOwogICAgICAgICAgICAgaW50IHBpZCA9IGRhdGEucmVhZEludDMyKCk7CisgICAgICAgICAgICBpbnQgdWlkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGludDY0X3QgY2xpZW50SWQgPSBkYXRhLnJlYWRJbnQ2NCgpOwogICAgICAgICAgICAgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50KAogICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSkpOwpAQCAtMTM3LDcgKzE1MSw3IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzOwogICAgICAgICAgICAgcmVhZEZyb21QYXJjZWwoZGF0YSwgJnJlc291cmNlcyk7Ci0gICAgICAgICAgICBhZGRSZXNvdXJjZShwaWQsIGNsaWVudElkLCBjbGllbnQsIHJlc291cmNlcyk7CisgICAgICAgICAgICBhZGRSZXNvdXJjZShwaWQsIHVpZCwgY2xpZW50SWQsIGNsaWVudCwgcmVzb3VyY2VzKTsKICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfSBicmVhazsKIApAQCAtMTQ1LDcgKzE1OSwxNyBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CiAgICAgICAgICAgICBpbnQgcGlkID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGludDY0X3QgY2xpZW50SWQgPSBkYXRhLnJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgcmVtb3ZlUmVzb3VyY2UocGlkLCBjbGllbnRJZCk7CisgICAgICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzOworICAgICAgICAgICAgcmVhZEZyb21QYXJjZWwoZGF0YSwgJnJlc291cmNlcyk7CisgICAgICAgICAgICByZW1vdmVSZXNvdXJjZShwaWQsIGNsaWVudElkLCByZXNvdXJjZXMpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9IGJyZWFrOworCisgICAgICAgIGNhc2UgUkVNT1ZFX0NMSUVOVDogeworICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBpbnQgcGlkID0gZGF0YS5yZWFkSW50MzIoKTsKKyAgICAgICAgICAgIGludDY0X3QgY2xpZW50SWQgPSBkYXRhLnJlYWRJbnQ2NCgpOworICAgICAgICAgICAgcmVtb3ZlQ2xpZW50KHBpZCwgY2xpZW50SWQpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9IGJyZWFrOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvSmV0UGxheWVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQzYzFiYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9KZXRQbGF5ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkpldFBsYXllci1DIgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSmV0UGxheWVyLmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLQotc3RhdGljIGNvbnN0IGludCBNSVhfTlVNX0JVRkZFUlMgPSA0Owotc3RhdGljIGNvbnN0IFNfRUFTX0xJQl9DT05GSUcqIHBMaWJDb25maWcgPSBOVUxMOwotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUpldFBsYXllcjo6SmV0UGxheWVyKHZvaWQgKmphdmFKZXRQbGF5ZXIsIGludCBtYXhUcmFja3MsIGludCB0cmFja0J1ZmZlclNpemUpIDoKLSAgICAgICAgbUV2ZW50Q2FsbGJhY2soTlVMTCksCi0gICAgICAgIG1KYXZhSmV0UGxheWVyUmVmKGphdmFKZXRQbGF5ZXIpLAotICAgICAgICBtVGlkKC0xKSwKLSAgICAgICAgbVJlbmRlcihmYWxzZSksCi0gICAgICAgIG1QYXVzZWQoZmFsc2UpLAotICAgICAgICBtTWF4VHJhY2tzKG1heFRyYWNrcyksCi0gICAgICAgIG1FYXNEYXRhKE5VTEwpLAotICAgICAgICBtSW9XcmFwcGVyKE5VTEwpLAotICAgICAgICBtVHJhY2tCdWZmZXJTaXplKHRyYWNrQnVmZmVyU2l6ZSkKLXsKLSAgICBBTE9HVigiSmV0UGxheWVyIGNvbnN0cnVjdG9yIik7Ci0gICAgbVByZXZpb3VzSmV0U3RhdHVzLmN1cnJlbnRVc2VySUQgPSAtMTsKLSAgICBtUHJldmlvdXNKZXRTdGF0dXMuc2VnbWVudFJlcGVhdENvdW50ID0gLTE7Ci0gICAgbVByZXZpb3VzSmV0U3RhdHVzLm51bVF1ZXVlZFNlZ21lbnRzID0gLTE7Ci0gICAgbVByZXZpb3VzSmV0U3RhdHVzLnBhdXNlZCA9IHRydWU7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotSmV0UGxheWVyOjp+SmV0UGxheWVyKCkKLXsKLSAgICBBTE9HVigifkpldFBsYXllciIpOwotICAgIHJlbGVhc2UoKTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQgSmV0UGxheWVyOjppbml0KCkKLXsKLSAgICAvL011dGV4OjpBdXRvbG9jayBsb2NrKCZtTXV0ZXgpOwotCi0gICAgRUFTX1JFU1VMVCByZXN1bHQ7Ci0KLSAgICAvLyByZXRyaWV2ZSB0aGUgRUFTIGxpYnJhcnkgc2V0dGluZ3MKLSAgICBpZiAocExpYkNvbmZpZyA9PSBOVUxMKQotICAgICAgICBwTGliQ29uZmlnID0gRUFTX0NvbmZpZygpOwotICAgIGlmIChwTGliQ29uZmlnID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIkpldFBsYXllcjo6aW5pdCgpOiBFQVMgbGlicmFyeSBjb25maWd1cmF0aW9uIGNvdWxkIG5vdCBiZSByZXRyaWV2ZWQsIGFib3J0aW5nLiIpOwotICAgICAgICByZXR1cm4gRUFTX0ZBSUxVUkU7Ci0gICAgfQotCi0gICAgLy8gaW5pdCB0aGUgRUFTIGxpYnJhcnkKLSAgICByZXN1bHQgPSBFQVNfSW5pdCgmbUVhc0RhdGEpOwotICAgIGlmIChyZXN1bHQgIT0gRUFTX1NVQ0NFU1MpIHsKLSAgICAgICAgQUxPR0UoIkpldFBsYXllcjo6aW5pdCgpOiBFcnJvciBpbml0aWFsaXppbmcgU29uaXZveCBFQVMgbGlicmFyeSwgYWJvcnRpbmcuIik7Ci0gICAgICAgIG1TdGF0ZSA9IEVBU19TVEFURV9FUlJPUjsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgLy8gaW5pdCB0aGUgSkVUIGxpYnJhcnkgd2l0aCB0aGUgZGVmYXVsdCBhcHAgZXZlbnQgY29udHJvbGxlciByYW5nZQotICAgIHJlc3VsdCA9IEpFVF9Jbml0KG1FYXNEYXRhLCBOVUxMLCBzaXplb2YoU19KRVRfQ09ORklHKSk7Ci0gICAgaWYgKHJlc3VsdCAhPSBFQVNfU1VDQ0VTUykgewotICAgICAgICBBTE9HRSgiSmV0UGxheWVyOjppbml0KCk6IEVycm9yIGluaXRpYWxpemluZyBKRVQgbGlicmFyeSwgYWJvcnRpbmcuIik7Ci0gICAgICAgIG1TdGF0ZSA9IEVBU19TVEFURV9FUlJPUjsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyBjcmVhdGUgdGhlIG91dHB1dCBBdWRpb1RyYWNrCi0gICAgbUF1ZGlvVHJhY2sgPSBuZXcgQXVkaW9UcmFjaygpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1RyYWNrLT5zZXQoQVVESU9fU1RSRUFNX01VU0lDLCAgLy9UT0RPIHBhcmFtZXRlcml6ZSB0aGlzCi0gICAgICAgICAgICBwTGliQ29uZmlnLT5zYW1wbGVSYXRlLAotICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCi0gICAgICAgICAgICBhdWRpb19jaGFubmVsX291dF9tYXNrX2Zyb21fY291bnQocExpYkNvbmZpZy0+bnVtQ2hhbm5lbHMpLAotICAgICAgICAgICAgKHNpemVfdCkgbVRyYWNrQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUpOwotICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkpldFBsYXllcjo6aW5pdCgpOiBFcnJvciBpbml0aWFsaXppbmcgSkVUIGxpYnJhcnk7IEF1ZGlvVHJhY2sgZXJyb3IgJWQiLCBzdGF0dXMpOwotICAgICAgICBtQXVkaW9UcmFjay5jbGVhcigpOwotICAgICAgICBtU3RhdGUgPSBFQVNfU1RBVEVfRVJST1I7Ci0gICAgICAgIHJldHVybiBFQVNfRkFJTFVSRTsKLSAgICB9Ci0KLSAgICAvLyBjcmVhdGUgcmVuZGVyIGFuZCBwbGF5YmFjayB0aHJlYWQKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7Ci0gICAgICAgIEFMT0dWKCJKZXRQbGF5ZXI6OmluaXQoKTogdHJ5aW5nIHRvIHN0YXJ0IHJlbmRlciB0aHJlYWQiKTsKLSAgICAgICAgbVRocmVhZCA9IG5ldyBKZXRQbGF5ZXJUaHJlYWQodGhpcyk7Ci0gICAgICAgIG1UaHJlYWQtPnJ1bigiamV0UmVuZGVyVGhyZWFkIiwgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7Ci0gICAgICAgIG1Db25kaXRpb24ud2FpdChtTXV0ZXgpOwotICAgIH0KLSAgICBpZiAobVRpZCA+IDApIHsKLSAgICAgICAgLy8gcmVuZGVyIHRocmVhZCBzdGFydGVkLCB3ZSdyZSByZWFkeQotICAgICAgICBBTE9HVigiSmV0UGxheWVyOjppbml0KCk6IHJlbmRlciB0aHJlYWQoJWQpIHN1Y2Nlc3NmdWxseSBzdGFydGVkLiIsIG1UaWQpOwotICAgICAgICBtU3RhdGUgPSBFQVNfU1RBVEVfUkVBRFk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoIkpldFBsYXllcjo6aW5pdCgpOiBmYWlsZWQgdG8gc3RhcnQgcmVuZGVyIHRocmVhZC4iKTsKLSAgICAgICAgbVN0YXRlID0gRUFTX1NUQVRFX0VSUk9SOwotICAgICAgICByZXR1cm4gRUFTX0ZBSUxVUkU7Ci0gICAgfQotCi0gICAgcmV0dXJuIEVBU19TVUNDRVNTOwotfQotCi12b2lkIEpldFBsYXllcjo6c2V0RXZlbnRDYWxsYmFjayhqZXRldmVudF9jYWxsYmFjayBldmVudENhbGxiYWNrKQotewotICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7Ci0gICAgbUV2ZW50Q2FsbGJhY2sgPSBldmVudENhbGxiYWNrOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBKZXRQbGF5ZXI6OnJlbGVhc2UoKQotewotICAgIEFMT0dWKCJKZXRQbGF5ZXI6OnJlbGVhc2UoKSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgbVBhdXNlZCA9IHRydWU7Ci0gICAgbVJlbmRlciA9IGZhbHNlOwotICAgIGlmIChtRWFzRGF0YSkgewotICAgICAgICBKRVRfUGF1c2UobUVhc0RhdGEpOwotICAgICAgICBKRVRfQ2xvc2VGaWxlKG1FYXNEYXRhKTsKLSAgICAgICAgSkVUX1NodXRkb3duKG1FYXNEYXRhKTsKLSAgICAgICAgRUFTX1NodXRkb3duKG1FYXNEYXRhKTsKLSAgICB9Ci0gICAgZGVsZXRlIG1Jb1dyYXBwZXI7Ci0gICAgbUlvV3JhcHBlciA9IE5VTEw7Ci0gICAgaWYgKG1BdWRpb1RyYWNrICE9IDApIHsKLSAgICAgICAgbUF1ZGlvVHJhY2stPnN0b3AoKTsKLSAgICAgICAgbUF1ZGlvVHJhY2stPmZsdXNoKCk7Ci0gICAgICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7Ci0gICAgfQotICAgIGlmIChtQXVkaW9CdWZmZXIpIHsKLSAgICAgICAgZGVsZXRlIG1BdWRpb0J1ZmZlcjsKLSAgICAgICAgbUF1ZGlvQnVmZmVyID0gTlVMTDsKLSAgICB9Ci0gICAgbUVhc0RhdGEgPSBOVUxMOwotCi0gICAgcmV0dXJuIEVBU19TVUNDRVNTOwotfQotCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50IEpldFBsYXllcjo6cmVuZGVyKCkgewotICAgIEVBU19SRVNVTFQgcmVzdWx0ID0gRUFTX0ZBSUxVUkU7Ci0gICAgRUFTX0kzMiBjb3VudDsKLSAgICBpbnQgdGVtcDsKLSAgICBib29sIGF1ZGlvU3RhcnRlZCA9IGZhbHNlOwotCi0gICAgQUxPR1YoIkpldFBsYXllcjo6cmVuZGVyKCk6IGVudGVyaW5nIik7Ci0KLSAgICAvLyBhbGxvY2F0ZSByZW5kZXIgYnVmZmVyCi0gICAgbUF1ZGlvQnVmZmVyID0KLSAgICAgICAgbmV3IEVBU19QQ01bcExpYkNvbmZpZy0+bWl4QnVmZmVyU2l6ZSAqIHBMaWJDb25maWctPm51bUNoYW5uZWxzICogTUlYX05VTV9CVUZGRVJTXTsKLQotICAgIC8vIHNpZ25hbCBtYWluIHRocmVhZCB0aGF0IHdlIHN0YXJ0ZWQKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7Ci0gICAgICAgIG1UaWQgPSBnZXR0aWQoKTsKLSAgICAgICAgQUxPR1YoIkpldFBsYXllcjo6cmVuZGVyKCk6IHJlbmRlciB0aHJlYWQoJWQpIHNpZ25hbCIsIG1UaWQpOwotICAgICAgICBtQ29uZGl0aW9uLnNpZ25hbCgpOwotICAgIH0KLQotICAgIHdoaWxlICgxKSB7Ci0KLSAgICAgICAgbU11dGV4LmxvY2soKTsgLy8gW1tbW1tbW1sgTE9DSyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICBpZiAobUVhc0RhdGEgPT0gTlVMTCkgewotICAgICAgICAgICAgbU11dGV4LnVubG9jaygpOwotICAgICAgICAgICAgQUxPR1YoIkpldFBsYXllcjo6cmVuZGVyKCk6IE5VTEwgRUFTIGRhdGEsIGV4aXRpbmcgcmVuZGVyLiIpOwotICAgICAgICAgICAgZ290byB0aHJlYWRFeGl0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm90aGluZyB0byByZW5kZXIsIHdhaXQgZm9yIGNsaWVudCB0aHJlYWQgdG8gd2FrZSB1cyB1cAotICAgICAgICB3aGlsZSAoIW1SZW5kZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJKZXRQbGF5ZXI6OnJlbmRlcigpOiBzaWduYWwgd2FpdCIpOwotICAgICAgICAgICAgaWYgKGF1ZGlvU3RhcnRlZCkgewotICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrLT5wYXVzZSgpOwotICAgICAgICAgICAgICAgIC8vIHdlIGhhdmUgdG8gcmVzdGFydCB0aGUgcGxheWJhY2sgb25jZSB3ZSBzdGFydCByZW5kZXJpbmcgYWdhaW4KLSAgICAgICAgICAgICAgICBhdWRpb1N0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Db25kaXRpb24ud2FpdChtTXV0ZXgpOwotICAgICAgICAgICAgQUxPR1YoIkpldFBsYXllcjo6cmVuZGVyKCk6IHNpZ25hbCByeCdkIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZW5kZXIgbWlkaSBkYXRhIGludG8gdGhlIGlucHV0IGJ1ZmZlcgotICAgICAgICBpbnQgbnVtX291dHB1dCA9IDA7Ci0gICAgICAgIEVBU19QQ00qIHAgPSBtQXVkaW9CdWZmZXI7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUlYX05VTV9CVUZGRVJTOyBpKyspIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IEVBU19SZW5kZXIobUVhc0RhdGEsIHAsIHBMaWJDb25maWctPm1peEJ1ZmZlclNpemUsICZjb3VudCk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IEVBU19TVUNDRVNTKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkpldFBsYXllcjo6cmVuZGVyKCk6IEVBU19SZW5kZXIgcmV0dXJuZWQgZXJyb3IgJWxkIiwgcmVzdWx0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHAgKz0gY291bnQgKiBwTGliQ29uZmlnLT5udW1DaGFubmVsczsKLSAgICAgICAgICAgIG51bV9vdXRwdXQgKz0gY291bnQgKiBwTGliQ29uZmlnLT5udW1DaGFubmVscyAqIHNpemVvZihFQVNfUENNKTsKLQotICAgICAgICAgICAgLy8gc2VuZCBldmVudHMgdGhhdCB3ZXJlIGdlbmVyYXRlZCAoaWYgYW55KSB0byB0aGUgZXZlbnQgY2FsbGJhY2sKLSAgICAgICAgICAgIGZpcmVFdmVudHNGcm9tSmV0UXVldWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHVwZGF0ZSBwbGF5YmFjayBzdGF0ZQotICAgICAgICAvL0FMT0dWKCJKZXRQbGF5ZXI6OnJlbmRlcigpOiB1cGRhdGluZyBzdGF0ZSIpOwotICAgICAgICBKRVRfU3RhdHVzKG1FYXNEYXRhLCAmbUpldFN0YXR1cyk7Ci0gICAgICAgIGZpcmVVcGRhdGVPblN0YXR1c0NoYW5nZSgpOwotICAgICAgICBtUGF1c2VkID0gbUpldFN0YXR1cy5wYXVzZWQ7Ci0KLSAgICAgICAgbU11dGV4LnVubG9jaygpOyAvLyBVTkxPQ0sgXV1dXV1dXV0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgICAgICAvLyBjaGVjayBhdWRpbyBvdXRwdXQgdHJhY2sKLSAgICAgICAgaWYgKG1BdWRpb1RyYWNrID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dFKCJKZXRQbGF5ZXI6OnJlbmRlcigpOiBvdXRwdXQgQXVkaW9UcmFjayB3YXMgbm90IGNyZWF0ZWQiKTsKLSAgICAgICAgICAgIGdvdG8gdGhyZWFkRXhpdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdyaXRlIGRhdGEgdG8gdGhlIGF1ZGlvIGhhcmR3YXJlCi0gICAgICAgIC8vQUxPR1YoIkpldFBsYXllcjo6cmVuZGVyKCk6IHdyaXRpbmcgdG8gYXVkaW8gb3V0cHV0Iik7Ci0gICAgICAgIGlmICgodGVtcCA9IG1BdWRpb1RyYWNrLT53cml0ZShtQXVkaW9CdWZmZXIsIG51bV9vdXRwdXQpKSA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJKZXRQbGF5ZXI6OnJlbmRlcigpOiBFcnJvciBpbiB3cml0aW5nOiVkIix0ZW1wKTsKLSAgICAgICAgICAgIHJldHVybiB0ZW1wOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc3RhcnQgYXVkaW8gb3V0cHV0IGlmIG5lY2Vzc2FyeQotICAgICAgICBpZiAoIWF1ZGlvU3RhcnRlZCkgewotICAgICAgICAgICAgQUxPR1YoIkpldFBsYXllcjo6cmVuZGVyKCk6IHN0YXJ0aW5nIGF1ZGlvIHBsYXliYWNrIik7Ci0gICAgICAgICAgICBtQXVkaW9UcmFjay0+c3RhcnQoKTsKLSAgICAgICAgICAgIGF1ZGlvU3RhcnRlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgIH0vL3doaWxlICgxKQotCi10aHJlYWRFeGl0OgotICAgIGlmIChtQXVkaW9UcmFjayAhPSBOVUxMKSB7Ci0gICAgICAgIG1BdWRpb1RyYWNrLT5zdG9wKCk7Ci0gICAgICAgIG1BdWRpb1RyYWNrLT5mbHVzaCgpOwotICAgIH0KLSAgICBkZWxldGUgW10gbUF1ZGlvQnVmZmVyOwotICAgIG1BdWRpb0J1ZmZlciA9IE5VTEw7Ci0gICAgbU11dGV4LmxvY2soKTsKLSAgICBtVGlkID0gLTE7Ci0gICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLSAgICBtTXV0ZXgudW5sb2NrKCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIGZpcmUgdXAgYW4gdXBkYXRlIGlmIGFueSBvZiB0aGUgc3RhdHVzIGZpZWxkcyBoYXMgY2hhbmdlZAotLy8gcHJlY29uZGl0aW9uOiBtTXV0ZXggbG9ja2VkCi12b2lkIEpldFBsYXllcjo6ZmlyZVVwZGF0ZU9uU3RhdHVzQ2hhbmdlKCkKLXsKLSAgICBpZiAoIChtSmV0U3RhdHVzLmN1cnJlbnRVc2VySUQgICAgICAhPSBtUHJldmlvdXNKZXRTdGF0dXMuY3VycmVudFVzZXJJRCkKLSAgICAgICB8fChtSmV0U3RhdHVzLnNlZ21lbnRSZXBlYXRDb3VudCAhPSBtUHJldmlvdXNKZXRTdGF0dXMuc2VnbWVudFJlcGVhdENvdW50KSApIHsKLSAgICAgICAgaWYgKG1FdmVudENhbGxiYWNrKSAgewotICAgICAgICAgICAgbUV2ZW50Q2FsbGJhY2soCi0gICAgICAgICAgICAgICAgSmV0UGxheWVyOjpKRVRfVVNFUklEX1VQREFURSwKLSAgICAgICAgICAgICAgICBtSmV0U3RhdHVzLmN1cnJlbnRVc2VySUQsCi0gICAgICAgICAgICAgICAgbUpldFN0YXR1cy5zZWdtZW50UmVwZWF0Q291bnQsCi0gICAgICAgICAgICAgICAgbUphdmFKZXRQbGF5ZXJSZWYpOwotICAgICAgICB9Ci0gICAgICAgIG1QcmV2aW91c0pldFN0YXR1cy5jdXJyZW50VXNlcklEICAgICAgPSBtSmV0U3RhdHVzLmN1cnJlbnRVc2VySUQ7Ci0gICAgICAgIG1QcmV2aW91c0pldFN0YXR1cy5zZWdtZW50UmVwZWF0Q291bnQgPSBtSmV0U3RhdHVzLnNlZ21lbnRSZXBlYXRDb3VudDsKLSAgICB9Ci0KLSAgICBpZiAobUpldFN0YXR1cy5udW1RdWV1ZWRTZWdtZW50cyAhPSBtUHJldmlvdXNKZXRTdGF0dXMubnVtUXVldWVkU2VnbWVudHMpIHsKLSAgICAgICAgaWYgKG1FdmVudENhbGxiYWNrKSAgewotICAgICAgICAgICAgbUV2ZW50Q2FsbGJhY2soCi0gICAgICAgICAgICAgICAgSmV0UGxheWVyOjpKRVRfTlVNUVVFVUVEU0VHTUVOVF9VUERBVEUsCi0gICAgICAgICAgICAgICAgbUpldFN0YXR1cy5udW1RdWV1ZWRTZWdtZW50cywKLSAgICAgICAgICAgICAgICAtMSwKLSAgICAgICAgICAgICAgICBtSmF2YUpldFBsYXllclJlZik7Ci0gICAgICAgIH0KLSAgICAgICAgbVByZXZpb3VzSmV0U3RhdHVzLm51bVF1ZXVlZFNlZ21lbnRzICA9IG1KZXRTdGF0dXMubnVtUXVldWVkU2VnbWVudHM7Ci0gICAgfQotCi0gICAgaWYgKG1KZXRTdGF0dXMucGF1c2VkICE9IG1QcmV2aW91c0pldFN0YXR1cy5wYXVzZWQpIHsKLSAgICAgICAgaWYgKG1FdmVudENhbGxiYWNrKSAgewotICAgICAgICAgICAgbUV2ZW50Q2FsbGJhY2soSmV0UGxheWVyOjpKRVRfUEFVU0VfVVBEQVRFLAotICAgICAgICAgICAgICAgIG1KZXRTdGF0dXMucGF1c2VkLAotICAgICAgICAgICAgICAgIC0xLAotICAgICAgICAgICAgICAgIG1KYXZhSmV0UGxheWVyUmVmKTsKLSAgICAgICAgfQotICAgICAgICBtUHJldmlvdXNKZXRTdGF0dXMucGF1c2VkID0gbUpldFN0YXR1cy5wYXVzZWQ7Ci0gICAgfQotCi19Ci0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBmaXJlIHVwIGFsbCB0aGUgSkVUIGV2ZW50cyBpbiB0aGUgSkVUIGVuZ2luZSBxdWV1ZSAodW50aWwgdGhlIHF1ZXVlIGlzIGVtcHR5KQotLy8gcHJlY29uZGl0aW9uOiBtTXV0ZXggbG9ja2VkCi12b2lkIEpldFBsYXllcjo6ZmlyZUV2ZW50c0Zyb21KZXRRdWV1ZSgpCi17Ci0gICAgaWYgKCFtRXZlbnRDYWxsYmFjaykgewotICAgICAgICAvLyBubyBjYWxsYmFjaywganVzdCBlbXB0eSB0aGUgZXZlbnQgcXVldWUKLSAgICAgICAgd2hpbGUgKEpFVF9HZXRFdmVudChtRWFzRGF0YSwgTlVMTCwgTlVMTCkpIHsgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgRUFTX1UzMiByYXdFdmVudDsKLSAgICB3aGlsZSAoSkVUX0dldEV2ZW50KG1FYXNEYXRhLCAmcmF3RXZlbnQsIE5VTEwpKSB7Ci0gICAgICAgIG1FdmVudENhbGxiYWNrKAotICAgICAgICAgICAgSmV0UGxheWVyOjpKRVRfRVZFTlQsCi0gICAgICAgICAgICByYXdFdmVudCwKLSAgICAgICAgICAgIC0xLAotICAgICAgICAgICAgbUphdmFKZXRQbGF5ZXJSZWYpOwotICAgIH0KLX0KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBKZXRQbGF5ZXI6OmxvYWRGcm9tRmlsZShjb25zdCBjaGFyKiBwYXRoKQotewotICAgIEFMT0dWKCJKZXRQbGF5ZXI6OmxvYWRGcm9tRmlsZSgpOiBwYXRoPSVzIiwgcGF0aCk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotCi0gICAgZGVsZXRlIG1Jb1dyYXBwZXI7Ci0gICAgbUlvV3JhcHBlciA9IG5ldyBNaWRpSW9XcmFwcGVyKHBhdGgpOwotCi0gICAgRUFTX1JFU1VMVCByZXN1bHQgPSBKRVRfT3BlbkZpbGUobUVhc0RhdGEsIG1Jb1dyYXBwZXItPmdldExvY2F0b3IoKSk7Ci0gICAgaWYgKHJlc3VsdCAhPSBFQVNfU1VDQ0VTUykKLSAgICAgICAgbVN0YXRlID0gRUFTX1NUQVRFX0VSUk9SOwotICAgIGVsc2UKLSAgICAgICAgbVN0YXRlID0gRUFTX1NUQVRFX09QRU47Ci0gICAgcmV0dXJuKCByZXN1bHQgKTsKLX0KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBKZXRQbGF5ZXI6OmxvYWRGcm9tRkQoY29uc3QgaW50IGZkLCBjb25zdCBsb25nIGxvbmcgb2Zmc2V0LCBjb25zdCBsb25nIGxvbmcgbGVuZ3RoKQotewotICAgIEFMT0dWKCJKZXRQbGF5ZXI6OmxvYWRGcm9tRkQoKTogZmQ9JWQgb2Zmc2V0PSVsbGQgbGVuZ3RoPSVsbGQiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgIGRlbGV0ZSBtSW9XcmFwcGVyOwotICAgIG1Jb1dyYXBwZXIgPSBuZXcgTWlkaUlvV3JhcHBlcihmZCwgb2Zmc2V0LCBsZW5ndGgpOwotCi0gICAgRUFTX1JFU1VMVCByZXN1bHQgPSBKRVRfT3BlbkZpbGUobUVhc0RhdGEsIG1Jb1dyYXBwZXItPmdldExvY2F0b3IoKSk7Ci0gICAgaWYgKHJlc3VsdCAhPSBFQVNfU1VDQ0VTUykKLSAgICAgICAgbVN0YXRlID0gRUFTX1NUQVRFX0VSUk9SOwotICAgIGVsc2UKLSAgICAgICAgbVN0YXRlID0gRUFTX1NUQVRFX09QRU47Ci0gICAgcmV0dXJuKCByZXN1bHQgKTsKLX0KLQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBKZXRQbGF5ZXI6OmNsb3NlRmlsZSgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICByZXR1cm4gSkVUX0Nsb3NlRmlsZShtRWFzRGF0YSk7Ci19Ci0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQgSmV0UGxheWVyOjpwbGF5KCkKLXsKLSAgICBBTE9HVigiSmV0UGxheWVyOjpwbGF5KCk6IGVudGVyaW5nIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLQotICAgIEVBU19SRVNVTFQgcmVzdWx0ID0gSkVUX1BsYXkobUVhc0RhdGEpOwotCi0gICAgbVBhdXNlZCA9IGZhbHNlOwotICAgIG1SZW5kZXIgPSB0cnVlOwotCi0gICAgSkVUX1N0YXR1cyhtRWFzRGF0YSwgJm1KZXRTdGF0dXMpOwotICAgIHRoaXMtPmR1bXBKZXRTdGF0dXMoJm1KZXRTdGF0dXMpOwotCi0gICAgZmlyZVVwZGF0ZU9uU3RhdHVzQ2hhbmdlKCk7Ci0KLSAgICAvLyB3YWtlIHVwIHJlbmRlciB0aHJlYWQKLSAgICBBTE9HVigiSmV0UGxheWVyOjpwbGF5KCk6IHdha2V1cCByZW5kZXIgdGhyZWFkIik7Ci0gICAgbUNvbmRpdGlvbi5zaWduYWwoKTsKLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50IEpldFBsYXllcjo6cGF1c2UoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgbVBhdXNlZCA9IHRydWU7Ci0gICAgRUFTX1JFU1VMVCByZXN1bHQgPSBKRVRfUGF1c2UobUVhc0RhdGEpOwotCi0gICAgbVJlbmRlciA9IGZhbHNlOwotCi0gICAgSkVUX1N0YXR1cyhtRWFzRGF0YSwgJm1KZXRTdGF0dXMpOwotICAgIHRoaXMtPmR1bXBKZXRTdGF0dXMoJm1KZXRTdGF0dXMpOwotICAgIGZpcmVVcGRhdGVPblN0YXR1c0NoYW5nZSgpOwotCi0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi0KLS8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW50IEpldFBsYXllcjo6cXVldWVTZWdtZW50KGludCBzZWdtZW50TnVtLCBpbnQgbGliTnVtLCBpbnQgcmVwZWF0Q291bnQsIGludCB0cmFuc3Bvc2UsCi0gICAgICAgIEVBU19VMzIgbXV0ZUZsYWdzLCBFQVNfVTggdXNlcklEKQotewotICAgIEFMT0dWKCJKZXRQbGF5ZXI6OnF1ZXVlU2VnbWVudCBzZWdtZW50TnVtPSVkLCBsaWJOdW09JWQsIHJlcGVhdENvdW50PSVkLCB0cmFuc3Bvc2U9JWQiLAotICAgICAgICBzZWdtZW50TnVtLCBsaWJOdW0sIHJlcGVhdENvdW50LCB0cmFuc3Bvc2UpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgcmV0dXJuIEpFVF9RdWV1ZVNlZ21lbnQobUVhc0RhdGEsIHNlZ21lbnROdW0sIGxpYk51bSwgcmVwZWF0Q291bnQsIHRyYW5zcG9zZSwgbXV0ZUZsYWdzLAotICAgICAgICAgICAgdXNlcklEKTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQgSmV0UGxheWVyOjpzZXRNdXRlRmxhZ3MoRUFTX1UzMiBtdXRlRmxhZ3MsIGJvb2wgc3luYykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIHJldHVybiBKRVRfU2V0TXV0ZUZsYWdzKG1FYXNEYXRhLCBtdXRlRmxhZ3MsIHN5bmMpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBKZXRQbGF5ZXI6OnNldE11dGVGbGFnKGludCB0cmFja051bSwgYm9vbCBtdXRlRmxhZywgYm9vbCBzeW5jKQotewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1NdXRleCk7Ci0gICAgcmV0dXJuIEpFVF9TZXRNdXRlRmxhZyhtRWFzRGF0YSwgdHJhY2tOdW0sIG11dGVGbGFnLCBzeW5jKTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQgSmV0UGxheWVyOjp0cmlnZ2VyQ2xpcChpbnQgY2xpcElkKQotewotICAgIEFMT0dWKCJKZXRQbGF5ZXI6OnRyaWdnZXJDbGlwIGNsaXBJZD0lZCIsIGNsaXBJZCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobU11dGV4KTsKLSAgICByZXR1cm4gSkVUX1RyaWdnZXJDbGlwKG1FYXNEYXRhLCBjbGlwSWQpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWludCBKZXRQbGF5ZXI6OmNsZWFyUXVldWUoKQotewotICAgIEFMT0dWKCJKZXRQbGF5ZXI6OmNsZWFyUXVldWUiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTXV0ZXgpOwotICAgIHJldHVybiBKRVRfQ2xlYXJfUXVldWUobUVhc0RhdGEpOwotfQotCi0vLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXZvaWQgSmV0UGxheWVyOjpkdW1wKCkKLXsKLX0KLQotdm9pZCBKZXRQbGF5ZXI6OmR1bXBKZXRTdGF0dXMoU19KRVRfU1RBVFVTKiBwSmV0U3RhdHVzKQotewotICAgIGlmIChwSmV0U3RhdHVzIT1OVUxMKQotICAgICAgICBBTE9HVigiPj4gY3VycmVudCBKRVQgcGxheWVyIHN0YXR1czogdXNlcklEPSVkIHNlZ21lbnRSZXBlYXRDb3VudD0lZCBudW1RdWV1ZWRTZWdtZW50cz0lZCAiCi0gICAgICAgICAgICAgICAgInBhdXNlZD0lZCIsCi0gICAgICAgICAgICAgICAgcEpldFN0YXR1cy0+Y3VycmVudFVzZXJJRCwgcEpldFN0YXR1cy0+c2VnbWVudFJlcGVhdENvdW50LAotICAgICAgICAgICAgICAgIHBKZXRTdGF0dXMtPm51bVF1ZXVlZFNlZ21lbnRzLCBwSmV0U3RhdHVzLT5wYXVzZWQpOwotICAgIGVsc2UKLSAgICAgICAgQUxPR0UoIj4+IEpFVCBwbGF5ZXIgc3RhdHVzIGlzIE5VTEwiKTsKLX0KLQotCi19IC8vIGVuZCBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0luZm8uY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFDb2RlY0luZm8uY3BwCmluZGV4IDUzMDhlMWMuLjg2YWQ5OTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhQ29kZWNJbmZvLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYUNvZGVjSW5mby5jcHAKQEAgLTI4LDYgKzI4LDE1IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorLyoqIFRoaXMgcmVkdW5kYW50IHJlZGVjbGFyYXRpb24gaXMgbmVlZGVkIGZvciBDKysgcHJlIDE0ICovCitjb25zdGV4cHIgY2hhciBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGRUFUVVJFX0FEQVBUSVZFX1BMQVlCQUNLW107Citjb25zdGV4cHIgY2hhciBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGRUFUVVJFX0RZTkFNSUNfVElNRVNUQU1QW107Citjb25zdGV4cHIgY2hhciBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGRUFUVVJFX0ZSQU1FX1BBUlNJTkdbXTsKK2NvbnN0ZXhwciBjaGFyIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfSU5UUkFfUkVGUkVTSFtdOworY29uc3RleHByIGNoYXIgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6RkVBVFVSRV9NVUxUSVBMRV9GUkFNRVNbXTsKK2NvbnN0ZXhwciBjaGFyIE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfU0VDVVJFX1BMQVlCQUNLW107Citjb25zdGV4cHIgY2hhciBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpGRUFUVVJFX1RVTk5FTEVEX1BMQVlCQUNLW107CisKIHZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Z2V0U3VwcG9ydGVkUHJvZmlsZUxldmVscygKICAgICAgICAgVmVjdG9yPFByb2ZpbGVMZXZlbD4gKnByb2ZpbGVMZXZlbHMpIGNvbnN0IHsKICAgICBwcm9maWxlTGV2ZWxzLT5jbGVhcigpOwpAQCAtNDAsMTYgKzQ5LDExIEBACiAgICAgY29sb3JGb3JtYXRzLT5hcHBlbmRWZWN0b3IobUNvbG9yRm9ybWF0cyk7CiB9CiAKLXVpbnQzMl90IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OmdldEZsYWdzKCkgY29uc3QgewotICAgIHJldHVybiBtRmxhZ3M7Ci19Ci0KIGNvbnN0IHNwPEFNZXNzYWdlPiBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjpnZXREZXRhaWxzKCkgY29uc3QgewogICAgIHJldHVybiBtRGV0YWlsczsKIH0KIAotTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Q2FwYWJpbGl0aWVzKCkKLSAgOiBtRmxhZ3MoMCkgeworTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6Q2FwYWJpbGl0aWVzKCkgewogICAgIG1EZXRhaWxzID0gbmV3IEFNZXNzYWdlOwogfQogCkBAIC03MywxMiArNzcsMTAgQEAKICAgICAgICAgICAgIGNhcHMtPm1Db2xvckZvcm1hdHMucHVzaF9iYWNrKGNvbG9yKTsKICAgICAgICAgfQogICAgIH0KLSAgICB1aW50MzJfdCBmbGFncyA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihwYXJjZWwucmVhZEludDMyKCkpOwogICAgIHNwPEFNZXNzYWdlPiBkZXRhaWxzID0gQU1lc3NhZ2U6OkZyb21QYXJjZWwocGFyY2VsKTsKICAgICBpZiAoZGV0YWlscyA9PSBOVUxMKQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICBpZiAoY2FwcyAhPSBOVUxMKSB7Ci0gICAgICAgIGNhcHMtPm1GbGFncyA9IGZsYWdzOwogICAgICAgICBjYXBzLT5tRGV0YWlscyA9IGRldGFpbHM7CiAgICAgfQogICAgIHJldHVybiBjYXBzOwpAQCAtOTYsNyArOTgsNiBAQAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvbG9yRm9ybWF0cy5zaXplKCk7IGkrKykgewogICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIobUNvbG9yRm9ybWF0cy5pdGVtQXQoaSkpOwogICAgIH0KLSAgICBwYXJjZWwtPndyaXRlSW50MzIobUZsYWdzKTsKICAgICBtRGV0YWlscy0+d3JpdGVUb1BhcmNlbChwYXJjZWwpOwogICAgIHJldHVybiBPSzsKIH0KQEAgLTExMSw2ICsxMTIsMTQgQEAKICAgICBtQ2FwLT5tRGV0YWlscy0+c2V0SW50MzIoa2V5LCB2YWx1ZSk7CiB9CiAKK3ZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcjo6cmVtb3ZlRGV0YWlsKGNvbnN0IGNoYXIqIGtleSkgeworICAgIGlmIChtQ2FwLT5tRGV0YWlscy0+cmVtb3ZlRW50cnlBdChtQ2FwLT5tRGV0YWlscy0+ZmluZEVudHJ5QnlOYW1lKGtleSkpID09IE9LKSB7CisgICAgICAgIEFMT0dEKCJzdWNjZXNzZnVsbHkgcmVtb3ZlZCBkZXRhaWwgJXMiLCBrZXkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCJkZXRhaWwgJXMgd2Fzbid0IHByZXNlbnQgdG8gcmVtb3ZlIiwga2V5KTsKKyAgICB9Cit9CisKIHZvaWQgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcjo6YWRkUHJvZmlsZUxldmVsKAogICAgICAgICB1aW50MzJfdCBwcm9maWxlLCB1aW50MzJfdCBsZXZlbCkgewogICAgIFByb2ZpbGVMZXZlbCBwcm9maWxlTGV2ZWw7CkBAIC0xMjksMzIgKzEzOCwzMiBAQAogICAgIH0KIH0KIAotdm9pZCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyOjphZGRGbGFncyh1aW50MzJfdCBmbGFncykgewotICAgIG1DYXAtPm1GbGFncyB8PSBmbGFnczsKLX0KLQogTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcjo6Q2FwYWJpbGl0aWVzV3JpdGVyKAogICAgICAgICBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzKiBjYXApIDogbUNhcChjYXApIHsKIH0KIAotYm9vbCBNZWRpYUNvZGVjSW5mbzo6aXNFbmNvZGVyKCkgY29uc3QgewotICAgIHJldHVybiBtSXNFbmNvZGVyOworTWVkaWFDb2RlY0luZm86OkF0dHJpYnV0ZXMgTWVkaWFDb2RlY0luZm86OmdldEF0dHJpYnV0ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1BdHRyaWJ1dGVzOwogfQogCi11aW50MzJfdCBNZWRpYUNvZGVjSW5mbzo6cmFuaygpIGNvbnN0IHsKK3VpbnQzMl90IE1lZGlhQ29kZWNJbmZvOjpnZXRSYW5rKCkgY29uc3QgewogICAgIHJldHVybiBtUmFuazsKIH0KIAotdm9pZCBNZWRpYUNvZGVjSW5mbzo6Z2V0U3VwcG9ydGVkTWltZXMoVmVjdG9yPEFTdHJpbmc+ICptaW1lcykgY29uc3QgewotICAgIG1pbWVzLT5jbGVhcigpOwordm9pZCBNZWRpYUNvZGVjSW5mbzo6Z2V0QWxpYXNlcyhWZWN0b3I8QVN0cmluZz4gKmFsaWFzZXMpIGNvbnN0IHsKKyAgICAqYWxpYXNlcyA9IG1BbGlhc2VzOworfQorCit2b2lkIE1lZGlhQ29kZWNJbmZvOjpnZXRTdXBwb3J0ZWRNZWRpYVR5cGVzKFZlY3RvcjxBU3RyaW5nPiAqbWVkaWFUeXBlcykgY29uc3QgeworICAgIG1lZGlhVHlwZXMtPmNsZWFyKCk7CiAgICAgZm9yIChzaXplX3QgaXggPSAwOyBpeCA8IG1DYXBzLnNpemUoKTsgaXgrKykgewotICAgICAgICBtaW1lcy0+cHVzaF9iYWNrKG1DYXBzLmtleUF0KGl4KSk7CisgICAgICAgIG1lZGlhVHlwZXMtPnB1c2hfYmFjayhtQ2Fwcy5rZXlBdChpeCkpOwogICAgIH0KIH0KIAogY29uc3Qgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4KLU1lZGlhQ29kZWNJbmZvOjpnZXRDYXBhYmlsaXRpZXNGb3IoY29uc3QgY2hhciAqbWltZSkgY29uc3QgewotICAgIHNzaXplX3QgaXggPSBnZXRDYXBhYmlsaXR5SW5kZXgobWltZSk7CitNZWRpYUNvZGVjSW5mbzo6Z2V0Q2FwYWJpbGl0aWVzRm9yKGNvbnN0IGNoYXIgKm1lZGlhVHlwZSkgY29uc3QgeworICAgIHNzaXplX3QgaXggPSBnZXRDYXBhYmlsaXR5SW5kZXgobWVkaWFUeXBlKTsKICAgICBpZiAoaXggPj0gMCkgewogICAgICAgICByZXR1cm4gbUNhcHMudmFsdWVBdChpeCk7CiAgICAgfQpAQCAtMTczLDIxICsxODIsMjYgQEAKIHNwPE1lZGlhQ29kZWNJbmZvPiBNZWRpYUNvZGVjSW5mbzo6RnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCkgewogICAgIEFTdHJpbmcgbmFtZSA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKICAgICBBU3RyaW5nIG93bmVyID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOwotICAgIGJvb2wgaXNFbmNvZGVyID0gc3RhdGljX2Nhc3Q8Ym9vbD4ocGFyY2VsLnJlYWRJbnQzMigpKTsKKyAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMgPSBzdGF0aWNfY2FzdDxBdHRyaWJ1dGVzPihwYXJjZWwucmVhZEludDMyKCkpOwogICAgIHVpbnQzMl90IHJhbmsgPSBwYXJjZWwucmVhZFVpbnQzMigpOwogICAgIHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gbmV3IE1lZGlhQ29kZWNJbmZvOwogICAgIGluZm8tPm1OYW1lID0gbmFtZTsKICAgICBpbmZvLT5tT3duZXIgPSBvd25lcjsKLSAgICBpbmZvLT5tSXNFbmNvZGVyID0gaXNFbmNvZGVyOworICAgIGluZm8tPm1BdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKICAgICBpbmZvLT5tUmFuayA9IHJhbms7CisgICAgc2l6ZV90IG51bUFsaWFzZXMgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1BbGlhc2VzOyBpKyspIHsKKyAgICAgICAgQVN0cmluZyBhbGlhcyA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKKyAgICAgICAgaW5mby0+bUFsaWFzZXMuYWRkKGFsaWFzKTsKKyAgICB9CiAgICAgc2l6ZV90IHNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHBhcmNlbC5yZWFkSW50MzIoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgQVN0cmluZyBtaW1lID0gQVN0cmluZzo6RnJvbVBhcmNlbChwYXJjZWwpOworICAgICAgICBBU3RyaW5nIG1lZGlhVHlwZSA9IEFTdHJpbmc6OkZyb21QYXJjZWwocGFyY2VsKTsKICAgICAgICAgc3A8Q2FwYWJpbGl0aWVzPiBjYXBzID0gQ2FwYWJpbGl0aWVzOjpGcm9tUGFyY2VsKHBhcmNlbCk7CiAgICAgICAgIGlmIChjYXBzID09IE5VTEwpCiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgaWYgKGluZm8gIT0gTlVMTCkgewotICAgICAgICAgICAgaW5mby0+bUNhcHMuYWRkKG1pbWUsIGNhcHMpOworICAgICAgICAgICAgaW5mby0+bUNhcHMuYWRkKG1lZGlhVHlwZSwgY2Fwcyk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGluZm87CkBAIC0xOTYsOCArMjEwLDEyIEBACiBzdGF0dXNfdCBNZWRpYUNvZGVjSW5mbzo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKnBhcmNlbCkgY29uc3QgewogICAgIG1OYW1lLndyaXRlVG9QYXJjZWwocGFyY2VsKTsKICAgICBtT3duZXIud3JpdGVUb1BhcmNlbChwYXJjZWwpOwotICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtSXNFbmNvZGVyKTsKKyAgICBwYXJjZWwtPndyaXRlSW50MzIobUF0dHJpYnV0ZXMpOwogICAgIHBhcmNlbC0+d3JpdGVVaW50MzIobVJhbmspOworICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtQWxpYXNlcy5zaXplKCkpOworICAgIGZvciAoY29uc3QgQVN0cmluZyAmYWxpYXMgOiBtQWxpYXNlcykgeworICAgICAgICBhbGlhcy53cml0ZVRvUGFyY2VsKHBhcmNlbCk7CisgICAgfQogICAgIHBhcmNlbC0+d3JpdGVJbnQzMihtQ2Fwcy5zaXplKCkpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNhcHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgbUNhcHMua2V5QXQoaSkud3JpdGVUb1BhcmNlbChwYXJjZWwpOwpAQCAtMjA2LDEwICsyMjQsMTAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXNzaXplX3QgTWVkaWFDb2RlY0luZm86OmdldENhcGFiaWxpdHlJbmRleChjb25zdCBjaGFyICptaW1lKSBjb25zdCB7Ci0gICAgaWYgKG1pbWUpIHsKK3NzaXplX3QgTWVkaWFDb2RlY0luZm86OmdldENhcGFiaWxpdHlJbmRleChjb25zdCBjaGFyICptZWRpYVR5cGUpIGNvbnN0IHsKKyAgICBpZiAobWVkaWFUeXBlKSB7CiAgICAgICAgIGZvciAoc2l6ZV90IGl4ID0gMDsgaXggPCBtQ2Fwcy5zaXplKCk7IGl4KyspIHsKLSAgICAgICAgICAgIGlmIChtQ2Fwcy5rZXlBdChpeCkuZXF1YWxzSWdub3JlQ2FzZShtaW1lKSkgeworICAgICAgICAgICAgaWYgKG1DYXBzLmtleUF0KGl4KS5lcXVhbHNJZ25vcmVDYXNlKG1lZGlhVHlwZSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gaXg7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIxNywxOSArMjM1LDI2IEBACiAgICAgcmV0dXJuIC0xOwogfQogCi1NZWRpYUNvZGVjSW5mbzo6TWVkaWFDb2RlY0luZm8oKSA6IG1SYW5rKDB4MTAwKSB7CitNZWRpYUNvZGVjSW5mbzo6TWVkaWFDb2RlY0luZm8oKQorICAgIDogbUF0dHJpYnV0ZXMoKE1lZGlhQ29kZWNJbmZvOjpBdHRyaWJ1dGVzKTApLAorICAgICAgbVJhbmsoMHgxMDApIHsKIH0KIAogdm9pZCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6c2V0TmFtZShjb25zdCBjaGFyKiBuYW1lKSB7CiAgICAgbUluZm8tPm1OYW1lID0gbmFtZTsKIH0KIAordm9pZCBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6YWRkQWxpYXMoY29uc3QgY2hhciogbmFtZSkgeworICAgIG1JbmZvLT5tQWxpYXNlcy5hZGQobmFtZSk7Cit9CisKIHZvaWQgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnNldE93bmVyKGNvbnN0IGNoYXIqIG93bmVyKSB7CiAgICAgbUluZm8tPm1Pd25lciA9IG93bmVyOwogfQogCi12b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpzZXRFbmNvZGVyKGJvb2wgaXNFbmNvZGVyKSB7Ci0gICAgbUluZm8tPm1Jc0VuY29kZXIgPSBpc0VuY29kZXI7Cit2b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpzZXRBdHRyaWJ1dGVzKAorICAgICAgICB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxNZWRpYUNvZGVjSW5mbzo6QXR0cmlidXRlcz46OnR5cGUgYXR0cmlidXRlcykgeworICAgIG1JbmZvLT5tQXR0cmlidXRlcyA9IChNZWRpYUNvZGVjSW5mbzo6QXR0cmlidXRlcylhdHRyaWJ1dGVzOwogfQogCiB2b2lkIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpzZXRSYW5rKHVpbnQzMl90IHJhbmspIHsKQEAgLTIzNywyMSArMjYyLDIxIEBACiB9CiAKIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyPgotICAgICAgICBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6YWRkTWltZShjb25zdCBjaGFyICptaW1lKSB7Ci0gICAgc3NpemVfdCBpeCA9IG1JbmZvLT5nZXRDYXBhYmlsaXR5SW5kZXgobWltZSk7CisgICAgICAgIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjphZGRNZWRpYVR5cGUoY29uc3QgY2hhciAqbWVkaWFUeXBlKSB7CisgICAgc3NpemVfdCBpeCA9IG1JbmZvLT5nZXRDYXBhYmlsaXR5SW5kZXgobWVkaWFUeXBlKTsKICAgICBpZiAoaXggPj0gMCkgewogICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+KAogICAgICAgICAgICAgICAgIG5ldyBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyKAogICAgICAgICAgICAgICAgIG1JbmZvLT5tQ2Fwcy52YWx1ZUF0KGl4KS5nZXQoKSkpOwogICAgIH0KICAgICBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBjYXBzID0gbmV3IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXMoKTsKLSAgICBtSW5mby0+bUNhcHMuYWRkKEFTdHJpbmcobWltZSksIGNhcHMpOworICAgIG1JbmZvLT5tQ2Fwcy5hZGQoQVN0cmluZyhtZWRpYVR5cGUpLCBjYXBzKTsKICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+KAogICAgICAgICAgICAgbmV3IE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXIoY2Fwcy5nZXQoKSkpOwogfQogCi1ib29sIE1lZGlhQ29kZWNJbmZvV3JpdGVyOjpyZW1vdmVNaW1lKGNvbnN0IGNoYXIgKm1pbWUpIHsKLSAgICBzc2l6ZV90IGl4ID0gbUluZm8tPmdldENhcGFiaWxpdHlJbmRleChtaW1lKTsKK2Jvb2wgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OnJlbW92ZU1lZGlhVHlwZShjb25zdCBjaGFyICptZWRpYVR5cGUpIHsKKyAgICBzc2l6ZV90IGl4ID0gbUluZm8tPmdldENhcGFiaWxpdHlJbmRleChtZWRpYVR5cGUpOwogICAgIGlmIChpeCA+PSAwKSB7CiAgICAgICAgIG1JbmZvLT5tQ2Fwcy5yZW1vdmVJdGVtc0F0KGl4KTsKICAgICAgICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NZWRpYVByb2ZpbGVzLmNwcCBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCmluZGV4IGUwZjVhNDAuLjYzNzMyMmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01lZGlhUHJvZmlsZXMuY3BwCkBAIC0yOSw5ICsyOSw1NSBAQAogI2luY2x1ZGUgPE9NWF9WaWRlby5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNvbnN0ZXhwciBjaGFyIGNvbnN0ICogY29uc3QgTWVkaWFQcm9maWxlczo6eG1sRmlsZXNbXTsKK25hbWVzcGFjZSAvKiB1bm5hbWVkICovIHsKKworLy8gUmV0dXJucyBhIGxpc3Qgb2YgcG9zc2libGUgcGF0aHMgZm9yIHRoZSBtZWRpYV9wcm9maWxlcyBYTUwgZmlsZS4KK3N0ZDo6YXJyYXk8Y2hhciBjb25zdCosIDU+IGNvbnN0JiBnZXRYbWxQYXRocygpIHsKKyAgICBzdGF0aWMgc3RkOjphcnJheTxzdGQ6OnN0cmluZyBjb25zdCwgNT4gY29uc3QgcGF0aHMgPQorICAgICAgICBbXSgpIC0+IGRlY2x0eXBlKHBhdGhzKSB7CisgICAgICAgICAgICAvLyBEaXJlY3RvcmllcyBmb3IgWE1MIGZpbGUgdGhhdCB3aWxsIGJlIHNlYXJjaGVkIChpbiB0aGlzIG9yZGVyKS4KKyAgICAgICAgICAgIGNvbnN0ZXhwciBzdGQ6OmFycmF5PGNoYXIgY29uc3QqLCA0PiBzZWFyY2hEaXJzID0geworICAgICAgICAgICAgICAgICJwcm9kdWN0L2V0Yy8iLAorICAgICAgICAgICAgICAgICJvZG0vZXRjLyIsCisgICAgICAgICAgICAgICAgInZlbmRvci9ldGMvIiwKKyAgICAgICAgICAgICAgICAic3lzdGVtL2V0Yy8iLAorICAgICAgICAgICAgfTsKKworICAgICAgICAgICAgLy8gVGhlIGZpbGUgbmFtZSBtYXkgY29udGFpbiBhIHZhcmlhbnQgaWYgdGhlIHZlbmRvciBwcm9wZXJ0eQorICAgICAgICAgICAgLy8gcm8udmVuZG9yLm1lZGlhX3Byb2ZpbGVzX3htbF92YXJpYW50IGlzIHNldC4KKyAgICAgICAgICAgIGNoYXIgdmFyaWFudFtQUk9QRVJUWV9WQUxVRV9NQVhdOworICAgICAgICAgICAgcHJvcGVydHlfZ2V0KCJyby5tZWRpYS54bWxfdmFyaWFudC5wcm9maWxlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiX1YxXzAiKTsKKworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmlsZU5hbWUgPQorICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKCJtZWRpYV9wcm9maWxlcyIpICsgdmFyaWFudCArICIueG1sIjsKKworICAgICAgICAgICAgcmV0dXJuIHsgc2VhcmNoRGlyc1swXSArIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgc2VhcmNoRGlyc1sxXSArIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgc2VhcmNoRGlyc1syXSArIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgc2VhcmNoRGlyc1szXSArIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgInN5c3RlbS9ldGMvbWVkaWFfcHJvZmlsZXNfVjFfMC54bWwiIC8vIFN5c3RlbSBmYWxsYmFjaworICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgIH0oKTsKKyAgICBzdGF0aWMgc3RkOjphcnJheTxjaGFyIGNvbnN0KiwgNT4gY29uc3QgY1BhdGhzID0geworICAgICAgICAgICAgcGF0aHNbMF0uZGF0YSgpLAorICAgICAgICAgICAgcGF0aHNbMV0uZGF0YSgpLAorICAgICAgICAgICAgcGF0aHNbMl0uZGF0YSgpLAorICAgICAgICAgICAgcGF0aHNbM10uZGF0YSgpLAorICAgICAgICAgICAgcGF0aHNbNF0uZGF0YSgpCisgICAgICAgIH07CisgICAgcmV0dXJuIGNQYXRoczsKK30KKworfSAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCiBNdXRleCBNZWRpYVByb2ZpbGVzOjpzTG9jazsKIGJvb2wgTWVkaWFQcm9maWxlczo6c0lzSW5pdGlhbGl6ZWQgPSBmYWxzZTsKIE1lZGlhUHJvZmlsZXMgKk1lZGlhUHJvZmlsZXM6OnNJbnN0YW5jZSA9IE5VTEw7CkBAIC00OCw3ICs5NCw4IEBACiAgICAgeyJhbXJ3YiIsICBBVURJT19FTkNPREVSX0FNUl9XQn0sCiAgICAgeyJhYWMiLCAgICBBVURJT19FTkNPREVSX0FBQ30sCiAgICAgeyJoZWFhYyIsICBBVURJT19FTkNPREVSX0hFX0FBQ30sCi0gICAgeyJhYWNlbGQiLCBBVURJT19FTkNPREVSX0FBQ19FTER9CisgICAgeyJhYWNlbGQiLCBBVURJT19FTkNPREVSX0FBQ19FTER9LAorICAgIHsib3B1cyIsICAgQVVESU9fRU5DT0RFUl9PUFVTfQogfTsKIAogY29uc3QgTWVkaWFQcm9maWxlczo6TmFtZVRvVGFnTWFwIE1lZGlhUHJvZmlsZXM6OnNGaWxlRm9ybWF0TWFwW10gPSB7CkBAIC05MSw2ICsxMzgsMTkgQEAKICAgICB7ImhpZ2hzcGVlZDcyMHAiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzcyMFB9LAogICAgIHsiaGlnaHNwZWVkMTA4MHAiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzEwODBQfSwKICAgICB7ImhpZ2hzcGVlZDIxNjBwIiwgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF8yMTYwUH0sCisKKyAgICAvLyBWZW5kb3Itc3BlY2lmaWMgcHJvZmlsZXMKKyAgICB7InZnYSIsIENBTUNPUkRFUl9RVUFMSVRZX1ZHQX0sCisgICAgeyI0a2RjaSIsIENBTUNPUkRFUl9RVUFMSVRZXzRLRENJfSwKKyAgICB7InRpbWVsYXBzZXZnYSIsIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfVkdBfSwKKyAgICB7InRpbWVsYXBzZTRrZGNpIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV80S0RDSX0sCisgICAgeyJoaWdoc3BlZWRjaWYiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0NJRn0sCisgICAgeyJoaWdoc3BlZWR2Z2EiLCBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX1ZHQX0sCisgICAgeyJoaWdoc3BlZWQ0a2RjaSIsIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfNEtEQ0l9LAorICAgIHsicWhkIiwgQ0FNQ09SREVSX1FVQUxJVFlfUUhEfSwKKyAgICB7IjJrIiwgQ0FNQ09SREVSX1FVQUxJVFlfMmt9LAorICAgIHsidGltZWxhcHNlcWhkIiwgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9RSER9LAorICAgIHsidGltZWxhcHNlMmsiLCBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzJrfSwKIH07CiAKICNpZiBMT0dfTkRFQlVHCkBAIC01OTYsNyArNjU2LDcgQEAKICAgICAgICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwogICAgICAgICBpZiAocHJvcGVydHlfZ2V0KCJtZWRpYS5zZXR0aW5ncy54bWwiLCB2YWx1ZSwgTlVMTCkgPD0gMCkgewogICAgICAgICAgICAgY29uc3QgY2hhciogeG1sRmlsZSA9IG51bGxwdHI7Ci0gICAgICAgICAgICBmb3IgKGF1dG8gY29uc3QmIGYgOiB4bWxGaWxlcykgeworICAgICAgICAgICAgZm9yIChhdXRvIGNvbnN0JiBmIDogZ2V0WG1sUGF0aHMoKSkgewogICAgICAgICAgICAgICAgIGlmIChjaGVja1htbEZpbGUoZikpIHsKICAgICAgICAgICAgICAgICAgICAgeG1sRmlsZSA9IGY7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTWVkaWFSZXNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVJlc291cmNlLmNwcAppbmRleCBlNjM2YTUwLi44NjI2MDA5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9NZWRpYVJlc291cmNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYS9NZWRpYVJlc291cmNlLmNwcApAQCAtMTksNiArMTksOCBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUmVzb3VyY2UuaD4KIAorI2luY2x1ZGUgPHZlY3Rvcj4KKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBNZWRpYVJlc291cmNlOjpNZWRpYVJlc291cmNlKCkKQEAgLTM2LDI2ICszOCw0OCBAQAogICAgICAgICAgIG1TdWJUeXBlKHN1YlR5cGUpLAogICAgICAgICAgIG1WYWx1ZSh2YWx1ZSkge30KIAorTWVkaWFSZXNvdXJjZTo6TWVkaWFSZXNvdXJjZShUeXBlIHR5cGUsIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICZpZCwgdWludDY0X3QgdmFsdWUpCisgICAgICAgIDogbVR5cGUodHlwZSksCisgICAgICAgICAgbVN1YlR5cGUoa1Vuc3BlY2lmaWVkU3ViVHlwZSksCisgICAgICAgICAgbVZhbHVlKHZhbHVlKSwKKyAgICAgICAgICBtSWQoaWQpIHt9CisKIHZvaWQgTWVkaWFSZXNvdXJjZTo6cmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpIHsKICAgICBtVHlwZSA9IHN0YXRpY19jYXN0PFR5cGU+KHBhcmNlbC5yZWFkSW50MzIoKSk7CiAgICAgbVN1YlR5cGUgPSBzdGF0aWNfY2FzdDxTdWJUeXBlPihwYXJjZWwucmVhZEludDMyKCkpOwogICAgIG1WYWx1ZSA9IHBhcmNlbC5yZWFkVWludDY0KCk7CisgICAgcGFyY2VsLnJlYWRCeXRlVmVjdG9yKCZtSWQpOwogfQogCiB2b2lkIE1lZGlhUmVzb3VyY2U6OndyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0IHsKICAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obVR5cGUpKTsKICAgICBwYXJjZWwtPndyaXRlSW50MzIoc3RhdGljX2Nhc3Q8aW50MzJfdD4obVN1YlR5cGUpKTsKICAgICBwYXJjZWwtPndyaXRlVWludDY0KG1WYWx1ZSk7CisgICAgcGFyY2VsLT53cml0ZUJ5dGVWZWN0b3IobUlkKTsKK30KKworc3RhdGljIFN0cmluZzggYnl0ZXNUb0hleFN0cmluZyhjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmYnl0ZXMpIHsKKyAgICBTdHJpbmc4IHN0cjsKKyAgICBmb3IgKGF1dG8gJmIgOiBieXRlcykgeworICAgICAgICBzdHIuYXBwZW5kRm9ybWF0KCIlMDJ4IiwgYik7CisgICAgfQorICAgIHJldHVybiBzdHI7CiB9CiAKIFN0cmluZzggTWVkaWFSZXNvdXJjZTo6dG9TdHJpbmcoKSBjb25zdCB7CiAgICAgU3RyaW5nOCBzdHI7Ci0gICAgc3RyLmFwcGVuZEZvcm1hdCgiJXMvJXM6JWxsdSIsIGFzU3RyaW5nKG1UeXBlKSwgYXNTdHJpbmcobVN1YlR5cGUpLCAodW5zaWduZWQgbG9uZyBsb25nKW1WYWx1ZSk7CisgICAgc3RyLmFwcGVuZEZvcm1hdCgiJXMvJXM6WyVzXTolbGx1IiwKKyAgICAgICAgYXNTdHJpbmcobVR5cGUpLCBhc1N0cmluZyhtU3ViVHlwZSksCisgICAgICAgIGJ5dGVzVG9IZXhTdHJpbmcobUlkKS5jX3N0cigpLAorICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKW1WYWx1ZSk7CiAgICAgcmV0dXJuIHN0cjsKIH0KIAogYm9vbCBNZWRpYVJlc291cmNlOjpvcGVyYXRvcj09KGNvbnN0IE1lZGlhUmVzb3VyY2UgJm90aGVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIChvdGhlci5tVHlwZSA9PSBtVHlwZSkgJiYgKG90aGVyLm1TdWJUeXBlID09IG1TdWJUeXBlKSAmJiAob3RoZXIubVZhbHVlID09IG1WYWx1ZSk7CisgICAgcmV0dXJuIChvdGhlci5tVHlwZSA9PSBtVHlwZSkKKyAgICAgICYmIChvdGhlci5tU3ViVHlwZSA9PSBtU3ViVHlwZSkKKyAgICAgICYmIChvdGhlci5tVmFsdWUgPT0gbVZhbHVlKQorICAgICAgJiYgKG90aGVyLm1JZCA9PSBtSWQpOwogfQogCiBib29sIE1lZGlhUmVzb3VyY2U6Om9wZXJhdG9yIT0oY29uc3QgTWVkaWFSZXNvdXJjZSAmb3RoZXIpIGNvbnN0IHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01lZGlhVXRpbHMuY3BwIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFVdGlscy5jcHAKaW5kZXggMzE5NzJmYS4uMmVmYjMwZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvTWVkaWFVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvTWVkaWFVdGlscy5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAotI2luY2x1ZGUgPGJpb25pY19tYWxsb2MuaD4KKyNpbmNsdWRlIDxiaW9uaWMvbWFsbG9jLmg+CiAKICNpbmNsdWRlICJNZWRpYVV0aWxzLmgiCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL01pZGlEZXZpY2VJbmZvLmNwcCBiL21lZGlhL2xpYm1lZGlhL01pZGlEZXZpY2VJbmZvLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU4OGUwMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9NaWRpRGV2aWNlSW5mby5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiTWlkaURldmljZUluZm8iCi0KLSNpbmNsdWRlIDxtZWRpYS9NaWRpRGV2aWNlSW5mby5oPgotCi0jaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgotI2luY2x1ZGUgPGxvZy9sb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgbWVkaWEgewotbmFtZXNwYWNlIG1pZGkgewotCi0vLyBUaGUgY29uc3RhbnQgdmFsdWVzIG5lZWQgdG8gYmUga2VwdCBpbiBzeW5jIHdpdGggTWlkaURldmljZUluZm8uamF2YS4KLS8vIHN0YXRpYwotY29uc3QgY2hhciogY29uc3QgTWlkaURldmljZUluZm86OlBST1BFUlRZX05BTUUgPSAibmFtZSI7Ci1jb25zdCBjaGFyKiBjb25zdCBNaWRpRGV2aWNlSW5mbzo6UFJPUEVSVFlfTUFOVUZBQ1RVUkVSID0gIm1hbnVmYWN0dXJlciI7Ci1jb25zdCBjaGFyKiBjb25zdCBNaWRpRGV2aWNlSW5mbzo6UFJPUEVSVFlfUFJPRFVDVCA9ICJwcm9kdWN0IjsKLWNvbnN0IGNoYXIqIGNvbnN0IE1pZGlEZXZpY2VJbmZvOjpQUk9QRVJUWV9WRVJTSU9OID0gInZlcnNpb24iOwotY29uc3QgY2hhciogY29uc3QgTWlkaURldmljZUluZm86OlBST1BFUlRZX1NFUklBTF9OVU1CRVIgPSAic2VyaWFsX251bWJlciI7Ci1jb25zdCBjaGFyKiBjb25zdCBNaWRpRGV2aWNlSW5mbzo6UFJPUEVSVFlfQUxTQV9DQVJEID0gImFsc2FfY2FyZCI7Ci1jb25zdCBjaGFyKiBjb25zdCBNaWRpRGV2aWNlSW5mbzo6UFJPUEVSVFlfQUxTQV9ERVZJQ0UgPSAiYWxzYV9kZXZpY2UiOwotCi1TdHJpbmcxNiBNaWRpRGV2aWNlSW5mbzo6Z2V0UHJvcGVydHkoY29uc3QgY2hhciogcHJvcGVydHlOYW1lKSB7Ci0gICAgU3RyaW5nMTYgdmFsdWU7Ci0gICAgaWYgKG1Qcm9wZXJ0aWVzLmdldFN0cmluZyhTdHJpbmcxNihwcm9wZXJ0eU5hbWUpLCAmdmFsdWUpKSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gU3RyaW5nMTYoKTsKLSAgICB9Ci19Ci0KLSNkZWZpbmUgUkVUVVJOX0lGX0ZBSUxFRChjYWxsZWRPbmNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGF0dXNfdCByZXR1cm5TdGF0dXMgPSBjYWxsZWRPbmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgaWYgKHJldHVyblN0YXR1cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBBTE9HRSgiRmFpbGVkIGF0ICVzOiVkICglcykiLCBfX0ZJTEVfXywgX19MSU5FX18sIF9fZnVuY19fKTsgXAotICAgICAgICAgICAgcmV0dXJuIHJldHVyblN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCi1zdGF0dXNfdCBNaWRpRGV2aWNlSW5mbzo6d3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3QgewotICAgIC8vIE5lZWRzIHRvIGJlIGtlcHQgaW4gc3luYyB3aXRoIGNvZGUgaW4gTWlkaURldmljZUluZm8uamF2YQotICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT53cml0ZUludDMyKG1UeXBlKSk7Ci0gICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlSW50MzIobUlkKSk7Ci0gICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlSW50MzIoKGludDMyX3QpbUlucHV0UG9ydE5hbWVzLnNpemUoKSkpOwotICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT53cml0ZUludDMyKChpbnQzMl90KW1PdXRwdXRQb3J0TmFtZXMuc2l6ZSgpKSk7Ci0gICAgUkVUVVJOX0lGX0ZBSUxFRCh3cml0ZVN0cmluZ1ZlY3RvcihwYXJjZWwsIG1JbnB1dFBvcnROYW1lcykpOwotICAgIFJFVFVSTl9JRl9GQUlMRUQod3JpdGVTdHJpbmdWZWN0b3IocGFyY2VsLCBtT3V0cHV0UG9ydE5hbWVzKSk7Ci0gICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPndyaXRlSW50MzIobUlzUHJpdmF0ZSA/IDEgOiAwKSk7Ci0gICAgUkVUVVJOX0lGX0ZBSUxFRChtUHJvcGVydGllcy53cml0ZVRvUGFyY2VsKHBhcmNlbCkpOwotICAgIC8vIFRoaXMgY29ycmVzcG9uZHMgdG8gImV4dHJhIiBwcm9wZXJ0aWVzIHdyaXR0ZW4gYnkgSmF2YSBjb2RlCi0gICAgUkVUVVJOX0lGX0ZBSUxFRChtUHJvcGVydGllcy53cml0ZVRvUGFyY2VsKHBhcmNlbCkpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTWlkaURldmljZUluZm86OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCogcGFyY2VsKSB7Ci0gICAgLy8gTmVlZHMgdG8gYmUga2VwdCBpbiBzeW5jIHdpdGggY29kZSBpbiBNaWRpRGV2aWNlSW5mby5qYXZhCi0gICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRJbnQzMigmbVR5cGUpKTsKLSAgICBSRVRVUk5fSUZfRkFJTEVEKHBhcmNlbC0+cmVhZEludDMyKCZtSWQpKTsKLSAgICBpbnQzMl90IGlucHV0UG9ydENvdW50OwotICAgIFJFVFVSTl9JRl9GQUlMRUQocGFyY2VsLT5yZWFkSW50MzIoJmlucHV0UG9ydENvdW50KSk7Ci0gICAgaW50MzJfdCBvdXRwdXRQb3J0Q291bnQ7Ci0gICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRJbnQzMigmb3V0cHV0UG9ydENvdW50KSk7Ci0gICAgUkVUVVJOX0lGX0ZBSUxFRChyZWFkU3RyaW5nVmVjdG9yKHBhcmNlbCwgJm1JbnB1dFBvcnROYW1lcywgaW5wdXRQb3J0Q291bnQpKTsKLSAgICBSRVRVUk5fSUZfRkFJTEVEKHJlYWRTdHJpbmdWZWN0b3IocGFyY2VsLCAmbU91dHB1dFBvcnROYW1lcywgb3V0cHV0UG9ydENvdW50KSk7Ci0gICAgaW50MzJfdCBpc1ByaXZhdGU7Ci0gICAgUkVUVVJOX0lGX0ZBSUxFRChwYXJjZWwtPnJlYWRJbnQzMigmaXNQcml2YXRlKSk7Ci0gICAgbUlzUHJpdmF0ZSA9IGlzUHJpdmF0ZSA9PSAxOwotICAgIFJFVFVSTl9JRl9GQUlMRUQobVByb3BlcnRpZXMucmVhZEZyb21QYXJjZWwocGFyY2VsKSk7Ci0gICAgLy8gSWdub3JlICJleHRyYSIgcHJvcGVydGllcyBhcyB0aGV5IG1heSBjb250YWluIEphdmEgUGFyY2VsYWJsZXMKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1pZGlEZXZpY2VJbmZvOjpyZWFkU3RyaW5nVmVjdG9yKAotICAgICAgICBjb25zdCBQYXJjZWwqIHBhcmNlbCwgVmVjdG9yPFN0cmluZzE2PiAqdmVjdG9yUHRyLCBzaXplX3QgZGVmYXVsdExlbmd0aCkgewotICAgIHN0ZDo6dW5pcXVlX3B0cjxzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nMTY+Pj4gdjsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSBwYXJjZWwtPnJlYWRTdHJpbmcxNlZlY3Rvcigmdik7Ci0gICAgaWYgKHJlc3VsdCAhPSBPSykgcmV0dXJuIHJlc3VsdDsKLSAgICB2ZWN0b3JQdHItPmNsZWFyKCk7Ci0gICAgaWYgKHYuZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZXIgOiAqdikgewotICAgICAgICAgICAgaWYgKGl0ZXIuZ2V0KCkgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIHZlY3RvclB0ci0+cHVzaF9iYWNrKCppdGVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdmVjdG9yUHRyLT5wdXNoX2JhY2soU3RyaW5nMTYoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICB2ZWN0b3JQdHItPnJlc2l6ZShkZWZhdWx0TGVuZ3RoKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNaWRpRGV2aWNlSW5mbzo6d3JpdGVTdHJpbmdWZWN0b3IoUGFyY2VsKiBwYXJjZWwsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIHZlY3RvcikgY29uc3QgewotICAgIHN0ZDo6dmVjdG9yPFN0cmluZzE2PiB2OwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdmVjdG9yLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIHYucHVzaF9iYWNrKHZlY3RvcltpXSk7Ci0gICAgfQotICAgIHJldHVybiBwYXJjZWwtPndyaXRlU3RyaW5nMTZWZWN0b3Iodik7Ci19Ci0KLS8vIFZlY3RvciBkb2VzIG5vdCBkZWZpbmUgb3BlcmF0b3I9PQotc3RhdGljIGlubGluZSBib29sIGFyZVZlY3RvcnNFcXVhbChjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBsaHMsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIHJocykgewotICAgIGlmIChsaHMuc2l6ZSgpICE9IHJocy5zaXplKCkpIHJldHVybiBmYWxzZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxocy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAobGhzW2ldICE9IHJoc1tpXSkgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1pZGlEZXZpY2VJbmZvJiBsaHMsIGNvbnN0IE1pZGlEZXZpY2VJbmZvJiByaHMpIHsKLSAgICByZXR1cm4gKGxocy5tVHlwZSA9PSByaHMubVR5cGUgJiYgbGhzLm1JZCA9PSByaHMubUlkICYmCi0gICAgICAgICAgICBhcmVWZWN0b3JzRXF1YWwobGhzLm1JbnB1dFBvcnROYW1lcywgcmhzLm1JbnB1dFBvcnROYW1lcykgJiYKLSAgICAgICAgICAgIGFyZVZlY3RvcnNFcXVhbChsaHMubU91dHB1dFBvcnROYW1lcywgcmhzLm1PdXRwdXRQb3J0TmFtZXMpICYmCi0gICAgICAgICAgICBsaHMubVByb3BlcnRpZXMgPT0gcmhzLm1Qcm9wZXJ0aWVzICYmCi0gICAgICAgICAgICBsaHMubUlzUHJpdmF0ZSA9PSByaHMubUlzUHJpdmF0ZSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtaWRpCi19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9NaWRpSW9XcmFwcGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCmluZGV4IDVjYTNiNDguLmU3MWVhMmMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhL01pZGlJb1dyYXBwZXIuY3BwCkBAIC0xNywxMiArMTcsMTIgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTWlkaUlvV3JhcHBlciIKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9NaWRpSW9XcmFwcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KIAogc3RhdGljIGludCByZWFkQXQodm9pZCAqaGFuZGxlLCB2b2lkICpidWZmZXIsIGludCBwb3MsIGludCBzaXplKSB7CiAgICAgcmV0dXJuICgoYW5kcm9pZDo6TWlkaUlvV3JhcHBlciopaGFuZGxlKS0+cmVhZEF0KGJ1ZmZlciwgcG9zLCBzaXplKTsKQEAgLTQ5LDEwICs0OSw0NyBAQAogICAgIG1EYXRhU291cmNlID0gbnVsbHB0cjsKIH0KIAotTWlkaUlvV3JhcHBlcjo6TWlkaUlvV3JhcHBlcihEYXRhU291cmNlQmFzZSAqc291cmNlKSB7Ci0gICAgQUxPR1YoIk1pZGlJb1dyYXBwZXIoRGF0YVNvdXJjZSkiKTsKK2NsYXNzIE1pZGlJb1dyYXBwZXI6OkRhdGFTb3VyY2VVbndyYXBwZXIgeworCitwdWJsaWM6CisgICAgZXhwbGljaXQgRGF0YVNvdXJjZVVud3JhcHBlcihDRGF0YVNvdXJjZSAqY3NvdXJjZSkgeworICAgICAgICBtU291cmNlID0gY3NvdXJjZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5EYXRhU291cmNlVW53cmFwcGVyKCkge30KKworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgeyByZXR1cm4gT0s7IH0KKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtMSBvbiBmYWlsdXJlLiBJdCdzIG5vdCBhbiBlcnJvciBpZgorICAgIC8vIHRoaXMgcmV0dXJucyB6ZXJvOyBpdCBqdXN0IG1lYW5zIHRoZSBnaXZlbiBvZmZzZXQgaXMgZXF1YWwgdG8sIG9yCisgICAgLy8gYmV5b25kLCB0aGUgZW5kIG9mIHRoZSBzb3VyY2UuCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWRBdChtU291cmNlLT5oYW5kbGUsIG9mZnNldCwgZGF0YSwgc2l6ZSk7CisgICAgfQorCisgICAgLy8gTWF5IHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgICAgICByZXR1cm4gbVNvdXJjZS0+Z2V0U2l6ZShtU291cmNlLT5oYW5kbGUsIHNpemUpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBnZXRVcmkoY2hhciAqIC8qdXJpU3RyaW5nKi8sIHNpemVfdCAvKmJ1ZmZlclNpemUqLykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGNsb3NlKCkge307Citwcml2YXRlOgorICAgIENEYXRhU291cmNlICptU291cmNlOworfTsKKworTWlkaUlvV3JhcHBlcjo6TWlkaUlvV3JhcHBlcihDRGF0YVNvdXJjZSAqY3NvdXJjZSkgeworICAgIEFMT0dWKCJNaWRpSW9XcmFwcGVyKENEYXRhU291cmNlKSIpOwogICAgIG1GZCA9IC0xOwotICAgIG1EYXRhU291cmNlID0gc291cmNlOworICAgIG1CYXNlID0gMDsKKyAgICBtRGF0YVNvdXJjZSA9IG5ldyBEYXRhU291cmNlVW53cmFwcGVyKGNzb3VyY2UpOwogICAgIG9mZjY0X3QgbDsKICAgICBpZiAobURhdGFTb3VyY2UtPmdldFNpemUoJmwpID09IE9LKSB7CiAgICAgICAgIG1MZW5ndGggPSBsOwpAQCAtNjYsNiArMTAzLDcgQEAKICAgICBpZiAobUZkID49IDApIHsKICAgICAgICAgY2xvc2UobUZkKTsKICAgICB9CisgICAgZGVsZXRlIG1EYXRhU291cmNlOwogfQogCiBpbnQgTWlkaUlvV3JhcHBlcjo6cmVhZEF0KHZvaWQgKmJ1ZmZlciwgaW50IG9mZnNldCwgaW50IHNpemUpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRXJyb3JQcml2LmNwcCBiL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRXJyb3JQcml2LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTNiOTE5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvTmRrTWVkaWFFcnJvclByaXYuY3BwCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCittZWRpYV9zdGF0dXNfdCB0cmFuc2xhdGVfZXJyb3Ioc3RhdHVzX3QgZXJyKSB7CisKKyAgICBpZiAoZXJyID09IE9LKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfSU8pIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBFUlJPUl9NQUxGT1JNRUQpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CisgICAgfSBlbHNlIGlmIChlcnIgPT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09QRVJBVElPTjsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBVTktOT1dOX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKKyAgICB9CisKKyAgICBBTE9HRSgic2YgZXJyb3IgY29kZTogJWQiLCBlcnIpOworICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKK30KKworc3RhdHVzX3QgcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3IobWVkaWFfc3RhdHVzX3QgZXJyKSB7CisKKyAgICBpZiAoZXJyID09IEFNRURJQV9PSykgeworICAgICAgICByZXR1cm4gT0s7CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0pIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX0lPKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9JTzsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFfRVJST1JfV09VTERfQkxPQ0spIHsKKyAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9NQUxGT1JNRUQpIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFfRVJST1JfSU5WQUxJRF9PUEVSQVRJT04pIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0gZWxzZSBpZiAoZXJyID09IEFNRURJQV9FUlJPUl9VTktOT1dOKSB7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIEFMT0dFKCJuZGsgZXJyb3IgY29kZTogJWQiLCBlcnIpOworICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2LmNwcCBiL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E5ZmI4YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5jcHAKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmRrTWVkaWFGb3JtYXQiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKworI2luY2x1ZGUgPGpuaS5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBwcml2YXRlIGZ1bmN0aW9ucyBmb3IgY29udmVyc2lvbiB0by9mcm9tIEFNZXNzYWdlCitBTWVkaWFGb3JtYXQqIEFNZWRpYUZvcm1hdF9mcm9tTXNnKHNwPEFNZXNzYWdlPiAqZGF0YSkgeworICAgIEFMT0dWKCJwcml2YXRlIGN0b3IiKTsKKyAgICBBTWVkaWFGb3JtYXQqIG1EYXRhID0gbmV3IEFNZWRpYUZvcm1hdCgpOworICAgIG1EYXRhLT5tRm9ybWF0ID0gKmRhdGE7CisgICAgaWYgKG1EYXRhLT5tRm9ybWF0ID09IE5VTEwpIHsKKyAgICAgICAgQUxPR1coImdvdCBOVUxMIGZvcm1hdCIpOworICAgICAgICBtRGF0YS0+bUZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKKyAgICB9CisgICAgcmV0dXJuIG1EYXRhOworfQorCit2b2lkIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoY29uc3QgQU1lZGlhRm9ybWF0KiBtRGF0YSwgc3A8QU1lc3NhZ2U+ICpkZXN0KSB7CisgICAgKmRlc3QgPSBtRGF0YS0+bUZvcm1hdDsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL05ka1dyYXBwZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvTmRrV3JhcHBlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExODQwN2UuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvTmRrV3JhcHBlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMzA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTmRrV3JhcHBlciIKLQotI2luY2x1ZGUgPG1lZGlhL05ka1dyYXBwZXIuaD4KLQotI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgotI2luY2x1ZGUgPGxvZy9sb2cuaD4KLSNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNvZGVjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDcnlwdG8uaD4KLSNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYURybS5oPgotI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgotCi0vLyBUZW1wb3JhcmlseSBrZWVwaW5nIEFNZWRpYUV4dHJhY3Rvcl9kaXNjb25uZWN0KCkgd2hlcmUgaXQgaXMgdXNlZC4KLS8vIFdpbGwgYmUgcmVtb3ZlZCBzb29uIGluIGZhdm9yIG9mIG9mZmljaWFsIHB1YmxpYyBBUElzLgotc3RydWN0IEFNZWRpYUV4dHJhY3RvciB7Ci0gICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6TnVNZWRpYUV4dHJhY3Rvcj4gbUltcGw7Ci0gICAgYW5kcm9pZDo6c3A8YW5kcm9pZDo6QUJ1ZmZlcj4gbVBzc2hCdWY7Ci19OwotCi1tZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JfZGlzY29ubmVjdChBTWVkaWFFeHRyYWN0b3IgKiBleCkgewotICAgIGV4LT5tSW1wbC0+ZGlzY29ubmVjdCgpOwotICAgIHJldHVybiBBTUVESUFfT0s7Ci19Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIGNvbnN0IHNpemVfdCBrQUVTQmxvY2tTaXplID0gMTY7ICAvLyBBRVNfQkxPQ0tfU0laRQotCi1zdGF0aWMgY29uc3QgY2hhciAqQU1lZGlhRm9ybWF0S2V5R3JvdXBJbnQzMltdID0gewotICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19BVFRFTlVBVElPTl9GQUNUT1IsCi0gICAgQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0JPT1NUX0ZBQ1RPUiwKLSAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfSEVBVllfQ09NUFJFU1NJT04sCi0gICAgQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX1RBUkdFVF9SRUZFUkVOQ0VfTEVWRUwsCi0gICAgQU1FRElBRk9STUFUX0tFWV9BQUNfRU5DT0RFRF9UQVJHRVRfTEVWRUwsCi0gICAgQU1FRElBRk9STUFUX0tFWV9BQUNfTUFYX09VVFBVVF9DSEFOTkVMX0NPVU5ULAotICAgIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEUsCi0gICAgQU1FRElBRk9STUFUX0tFWV9BQUNfU0JSX01PREUsCi0gICAgQU1FRElBRk9STUFUX0tFWV9BVURJT19TRVNTSU9OX0lELAotICAgIEFNRURJQUZPUk1BVF9LRVlfQklUUkFURV9NT0RFLAotICAgIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsCi0gICAgQU1FRElBRk9STUFUX0tFWV9DQVBUVVJFX1JBVEUsCi0gICAgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULAotICAgIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9NQVNLLAotICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFULAotICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfUkFOR0UsCi0gICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9TVEFOREFSRCwKLSAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSLAotICAgIEFNRURJQUZPUk1BVF9LRVlfQ09NUExFWElUWSwKLSAgICBBTUVESUFGT1JNQVRfS0VZX0ZMQUNfQ09NUFJFU1NJT05fTEVWRUwsCi0gICAgQU1FRElBRk9STUFUX0tFWV9HUklEX0NPTFVNTlMsCi0gICAgQU1FRElBRk9STUFUX0tFWV9HUklEX1JPV1MsCi0gICAgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsCi0gICAgQU1FRElBRk9STUFUX0tFWV9JTlRSQV9SRUZSRVNIX1BFUklPRCwKLSAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0FEVFMsCi0gICAgQU1FRElBRk9STUFUX0tFWV9JU19BVVRPU0VMRUNULAotICAgIEFNRURJQUZPUk1BVF9LRVlfSVNfREVGQVVMVCwKLSAgICBBTUVESUFGT1JNQVRfS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSwKLSAgICBBTUVESUFGT1JNQVRfS0VZX0xBVEVOQ1ksCi0gICAgQU1FRElBRk9STUFUX0tFWV9MRVZFTCwKLSAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9IRUlHSFQsCi0gICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSwKLSAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9XSURUSCwKLSAgICBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORywKLSAgICBBTUVESUFGT1JNQVRfS0VZX1BSSU9SSVRZLAotICAgIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSwKLSAgICBBTUVESUFGT1JNQVRfS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QLAotICAgIEFNRURJQUZPUk1BVF9LRVlfUk9UQVRJT04sCi0gICAgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwKLSAgICBBTUVESUFGT1JNQVRfS0VZX1NMSUNFX0hFSUdIVCwKLSAgICBBTUVESUFGT1JNQVRfS0VZX1NUUklERSwKLSAgICBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lELAotICAgIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsCi0gICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0hFSUdIVCwKLSAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfV0lEVEgsCi0gICAgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRCwKLSAgICBBTUVESUFGT1JNQVRfS0VZX1RJTEVfSEVJR0hULAotICAgIEFNRURJQUZPUk1BVF9LRVlfVElMRV9XSURUSCwKLSAgICBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lOREVYLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKkFNZWRpYUZvcm1hdEtleUdyb3VwSW50NjRbXSA9IHsKLSAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OLAotICAgIEFNRURJQUZPUk1BVF9LRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSLAotICAgIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyICpBTWVkaWFGb3JtYXRLZXlHcm91cFN0cmluZ1tdID0gewotICAgIEFNRURJQUZPUk1BVF9LRVlfTEFOR1VBR0UsCi0gICAgQU1FRElBRk9STUFUX0tFWV9NSU1FLAotICAgIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJJTkcsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqQU1lZGlhRm9ybWF0S2V5R3JvdXBCdWZmZXJbXSA9IHsKLSAgICBBTUVESUFGT1JNQVRfS0VZX0hEUl9TVEFUSUNfSU5GTywKLSAgICBBTUVESUFGT1JNQVRfS0VZX1NFSSwKLSAgICBBTUVESUFGT1JNQVRfS0VZX01QRUdfVVNFUl9EQVRBLAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgKkFNZWRpYUZvcm1hdEtleUdyb3VwQ3NkW10gPSB7Ci0gICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwKLSAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8xLAotICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzIsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqQU1lZGlhRm9ybWF0S2V5R3JvdXBSZWN0W10gPSB7Ci0gICAgQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0NST1AsCi19OwotCi1zdGF0aWMgY29uc3QgY2hhciAqQU1lZGlhRm9ybWF0S2V5R3JvdXBGbG9hdEludDMyW10gPSB7Ci0gICAgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLAotICAgIEFNRURJQUZPUk1BVF9LRVlfSV9GUkFNRV9JTlRFUlZBTCwKLSAgICBBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFLAotfTsKLQotc3RhdGljIHN0YXR1c190IHRyYW5zbGF0ZUVycm9yQ29kZShtZWRpYV9zdGF0dXNfdCBlcnIpIHsKLSAgICBpZiAoZXJyID09IEFNRURJQV9PSykgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfSBlbHNlIGlmIChlcnIgPT0gQU1FRElBX0VSUk9SX0lPKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9JTzsKLSAgICB9IGVsc2UgaWYgKGVyciA9PSBBTUVESUFDT0RFQ19JTkZPX1RSWV9BR0FJTl9MQVRFUikgewotICAgICAgICByZXR1cm4gLUVBR0FJTjsKLSAgICB9Ci0KLSAgICBBTE9HRSgibmRrIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKLSAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLX0KLQotc3RhdGljIGludDMyX3QgdHJhbnNsYXRlQWN0aW9uQ29kZShpbnQzMl90IGFjdGlvbkNvZGUpIHsKLSAgICBpZiAoQU1lZGlhQ29kZWNBY3Rpb25Db2RlX2lzVHJhbnNpZW50KGFjdGlvbkNvZGUpKSB7Ci0gICAgICAgIHJldHVybiBBQ1RJT05fQ09ERV9UUkFOU0lFTlQ7Ci0gICAgfSBlbHNlIGlmIChBTWVkaWFDb2RlY0FjdGlvbkNvZGVfaXNSZWNvdmVyYWJsZShhY3Rpb25Db2RlKSkgewotICAgICAgICByZXR1cm4gQUNUSU9OX0NPREVfUkVDT1ZFUkFCTEU7Ci0gICAgfQotICAgIHJldHVybiBBQ1RJT05fQ09ERV9GQVRBTDsKLX0KLQotc3RhdGljIENyeXB0b1BsdWdpbjo6TW9kZSB0cmFuc2xhdGVUb0NyeXB0b1BsdWdpbk1vZGUoY3J5cHRvaW5mb19tb2RlX3QgbW9kZSkgewotICAgIENyeXB0b1BsdWdpbjo6TW9kZSByZXQgPSBDcnlwdG9QbHVnaW46OmtNb2RlX1VuZW5jcnlwdGVkOwotICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgICBjYXNlIEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQUVTX0NUUjogewotICAgICAgICAgICAgcmV0ID0gQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfQ1RSOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQUVTX1dWOiB7Ci0gICAgICAgICAgICByZXQgPSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19XVjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0FFU19DQkM6IHsKLSAgICAgICAgICAgIHJldCA9IENyeXB0b1BsdWdpbjo6a01vZGVfQUVTX0NCQzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyBjcnlwdG9pbmZvX21vZGVfdCB0cmFuc2xhdGVUb0NyeXB0b0luZm9Nb2RlKENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlKSB7Ci0gICAgY3J5cHRvaW5mb19tb2RlX3QgcmV0ID0gQU1FRElBQ09ERUNSWVBUT0lORk9fTU9ERV9DTEVBUjsKLSAgICBzd2l0Y2ggKG1vZGUpIHsKLSAgICAgICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19DVFI6IHsKLSAgICAgICAgICAgIHJldCA9IEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQUVTX0NUUjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBDcnlwdG9QbHVnaW46OmtNb2RlX0FFU19XVjogewotICAgICAgICAgICAgcmV0ID0gQU1FRElBQ09ERUNSWVBUT0lORk9fTU9ERV9BRVNfV1Y7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfQ0JDOiB7Ci0gICAgICAgICAgICByZXQgPSBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0FFU19DQkM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi0vLy8vLy8vLy8vLy8gQU1lZGlhRm9ybWF0V3JhcHBlcgotLy8gc3RhdGljCi1zcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiBBTWVkaWFGb3JtYXRXcmFwcGVyOjpDcmVhdGUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtZXNzYWdlKSB7Ci0gICAgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gYU1lZGlhRm9ybWF0ID0gbmV3IEFNZWRpYUZvcm1hdFdyYXBwZXIoKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWVzc2FnZS0+Y291bnRFbnRyaWVzKCk7ICsraSkgewotICAgICAgICBBTWVzc2FnZTo6VHlwZSB2YWx1ZVR5cGU7Ci0gICAgICAgIGNvbnN0IGNoYXIgKmtleSA9IG1lc3NhZ2UtPmdldEVudHJ5TmFtZUF0KGksICZ2YWx1ZVR5cGUpOwotCi0gICAgICAgIHN3aXRjaCAodmFsdWVUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZUludDMyOiB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCB2YWw7Ci0gICAgICAgICAgICAgICAgaWYgKCFtZXNzYWdlLT5maW5kSW50MzIoa2V5LCAmdmFsKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQU1lZGlhRm9ybWF0V3JhcHBlcjo6Q3JlYXRlOiBlcnJvciBhdCBpdGVtICV6dSIsIGkpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYU1lZGlhRm9ybWF0LT5zZXRJbnQzMihrZXksIHZhbCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlSW50NjQ6IHsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbDsKLSAgICAgICAgICAgICAgICBpZiAoIW1lc3NhZ2UtPmZpbmRJbnQ2NChrZXksICZ2YWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJBTWVkaWFGb3JtYXRXcmFwcGVyOjpDcmVhdGU6IGVycm9yIGF0IGl0ZW0gJXp1IiwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhTWVkaWFGb3JtYXQtPnNldEludDY0KGtleSwgdmFsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVGbG9hdDogewotICAgICAgICAgICAgICAgIGZsb2F0IHZhbDsKLSAgICAgICAgICAgICAgICBpZiAoIW1lc3NhZ2UtPmZpbmRGbG9hdChrZXksICZ2YWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJBTWVkaWFGb3JtYXRXcmFwcGVyOjpDcmVhdGU6IGVycm9yIGF0IGl0ZW0gJXp1IiwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhTWVkaWFGb3JtYXQtPnNldEZsb2F0KGtleSwgdmFsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVEb3VibGU6IHsKLSAgICAgICAgICAgICAgICBkb3VibGUgdmFsOwotICAgICAgICAgICAgICAgIGlmICghbWVzc2FnZS0+ZmluZERvdWJsZShrZXksICZ2YWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJBTWVkaWFGb3JtYXRXcmFwcGVyOjpDcmVhdGU6IGVycm9yIGF0IGl0ZW0gJXp1IiwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhTWVkaWFGb3JtYXQtPnNldERvdWJsZShrZXksIHZhbCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlU2l6ZTogewotICAgICAgICAgICAgICAgIHNpemVfdCB2YWw7Ci0gICAgICAgICAgICAgICAgaWYgKCFtZXNzYWdlLT5maW5kU2l6ZShrZXksICZ2YWwpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJBTWVkaWFGb3JtYXRXcmFwcGVyOjpDcmVhdGU6IGVycm9yIGF0IGl0ZW0gJXp1IiwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhTWVkaWFGb3JtYXQtPnNldFNpemUoa2V5LCB2YWwpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIEFNZXNzYWdlOjprVHlwZVJlY3Q6IHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbTsKLSAgICAgICAgICAgICAgICBpZiAoIW1lc3NhZ2UtPmZpbmRSZWN0KGtleSwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkFNZWRpYUZvcm1hdFdyYXBwZXI6OkNyZWF0ZTogZXJyb3IgYXQgaXRlbSAlenUiLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFNZWRpYUZvcm1hdC0+c2V0UmVjdChrZXksIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGNhc2UgQU1lc3NhZ2U6OmtUeXBlU3RyaW5nOiB7Ci0gICAgICAgICAgICAgICAgQVN0cmluZyB2YWw7Ci0gICAgICAgICAgICAgICAgaWYgKCFtZXNzYWdlLT5maW5kU3RyaW5nKGtleSwgJnZhbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkFNZWRpYUZvcm1hdFdyYXBwZXI6OkNyZWF0ZTogZXJyb3IgYXQgaXRlbSAlenUiLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFNZWRpYUZvcm1hdC0+c2V0U3RyaW5nKGtleSwgdmFsKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgY2FzZSBBTWVzc2FnZTo6a1R5cGVCdWZmZXI6IHsKLSAgICAgICAgICAgICAgICBzcDxBQnVmZmVyPiB2YWw7Ci0gICAgICAgICAgICAgICAgaWYgKCFtZXNzYWdlLT5maW5kQnVmZmVyKGtleSwgJnZhbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkFNZWRpYUZvcm1hdFdyYXBwZXI6OkNyZWF0ZTogZXJyb3IgYXQgaXRlbSAlenUiLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGFNZWRpYUZvcm1hdC0+c2V0QnVmZmVyKGtleSwgdmFsLT5kYXRhKCksIHZhbC0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGFNZWRpYUZvcm1hdDsKLX0KLQotQU1lZGlhRm9ybWF0V3JhcHBlcjo6QU1lZGlhRm9ybWF0V3JhcHBlcigpIHsKLSAgICBtQU1lZGlhRm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOwotfQotCi1BTWVkaWFGb3JtYXRXcmFwcGVyOjpBTWVkaWFGb3JtYXRXcmFwcGVyKEFNZWRpYUZvcm1hdCAqYU1lZGlhRm9ybWF0KQotICAgIDogbUFNZWRpYUZvcm1hdChhTWVkaWFGb3JtYXQpIHsKLX0KLQotQU1lZGlhRm9ybWF0V3JhcHBlcjo6fkFNZWRpYUZvcm1hdFdyYXBwZXIoKSB7Ci0gICAgcmVsZWFzZSgpOwotfQotCi1zdGF0dXNfdCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpyZWxlYXNlKCkgewotICAgIGlmIChtQU1lZGlhRm9ybWF0ICE9IE5VTEwpIHsKLSAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gQU1lZGlhRm9ybWF0X2RlbGV0ZShtQU1lZGlhRm9ybWF0KTsKLSAgICAgICAgbUFNZWRpYUZvcm1hdCA9IE5VTEw7Ci0gICAgICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1BTWVkaWFGb3JtYXQgKkFNZWRpYUZvcm1hdFdyYXBwZXI6OmdldEFNZWRpYUZvcm1hdCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUFNZWRpYUZvcm1hdDsKLX0KLQotc3A8QU1lc3NhZ2U+IEFNZWRpYUZvcm1hdFdyYXBwZXI6OnRvQU1lc3NhZ2UoKSBjb25zdCB7Ci0gIHNwPEFNZXNzYWdlPiBtc2c7Ci0gIHdyaXRlVG9BTWVzc2FnZShtc2cpOwotICByZXR1cm4gbXNnOwotfQotCi12b2lkIEFNZWRpYUZvcm1hdFdyYXBwZXI6OndyaXRlVG9BTWVzc2FnZShzcDxBTWVzc2FnZT4gJm1zZykgY29uc3QgewotICAgIGlmIChtQU1lZGlhRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgbXNnID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobXNnID09IE5VTEwpIHsKLSAgICAgICAgbXNnID0gbmV3IEFNZXNzYWdlOwotICAgIH0KLSAgICBmb3IgKGF1dG8mIGtleSA6IEFNZWRpYUZvcm1hdEtleUdyb3VwSW50MzIpIHsKLSAgICAgICAgaW50MzJfdCB2YWw7Ci0gICAgICAgIGlmIChnZXRJbnQzMihrZXksICZ2YWwpKSB7Ci0gICAgICAgICAgICBtc2ctPnNldEludDMyKGtleSwgdmFsKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKGF1dG8mIGtleSA6IEFNZWRpYUZvcm1hdEtleUdyb3VwSW50NjQpIHsKLSAgICAgICAgaW50NjRfdCB2YWw7Ci0gICAgICAgIGlmIChnZXRJbnQ2NChrZXksICZ2YWwpKSB7Ci0gICAgICAgICAgICBtc2ctPnNldEludDY0KGtleSwgdmFsKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKGF1dG8mIGtleSA6IEFNZWRpYUZvcm1hdEtleUdyb3VwU3RyaW5nKSB7Ci0gICAgICAgIEFTdHJpbmcgdmFsOwotICAgICAgICBpZiAoZ2V0U3RyaW5nKGtleSwgJnZhbCkpIHsKLSAgICAgICAgICAgIG1zZy0+c2V0U3RyaW5nKGtleSwgdmFsKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBmb3IgKGF1dG8mIGtleSA6IEFNZWRpYUZvcm1hdEtleUdyb3VwQnVmZmVyKSB7Ci0gICAgICAgIHZvaWQgKmRhdGE7Ci0gICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBpZiAoZ2V0QnVmZmVyKGtleSwgJmRhdGEsICZzaXplKSkgewotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGRhdGEsIHNpemUpOwotICAgICAgICAgICAgbXNnLT5zZXRCdWZmZXIoa2V5LCBidWZmZXIpOwotICAgICAgICB9Ci0gICAgfQotICAgIGZvciAoYXV0byYga2V5IDogQU1lZGlhRm9ybWF0S2V5R3JvdXBDc2QpIHsKLSAgICAgICAgdm9pZCAqZGF0YTsKLSAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgIGlmIChnZXRCdWZmZXIoa2V5LCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoZGF0YSwgc2l6ZSk7Ci0gICAgICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoQU1FRElBRk9STUFUX0tFWV9DU0QsIDEpOwotICAgICAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUywgMCk7Ci0gICAgICAgICAgICBtc2ctPnNldEJ1ZmZlcihrZXksIGJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChhdXRvJiBrZXkgOiBBTWVkaWFGb3JtYXRLZXlHcm91cFJlY3QpIHsKLSAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b207Ci0gICAgICAgIGlmIChnZXRSZWN0KGtleSwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSkpIHsKLSAgICAgICAgICAgIG1zZy0+c2V0UmVjdChrZXksIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChhdXRvJiBrZXkgOiBBTWVkaWFGb3JtYXRLZXlHcm91cEZsb2F0SW50MzIpIHsKLSAgICAgICAgZmxvYXQgdmFsRmxvYXQ7Ci0gICAgICAgIGlmIChnZXRGbG9hdChrZXksICZ2YWxGbG9hdCkpIHsKLSAgICAgICAgICAgIG1zZy0+c2V0RmxvYXQoa2V5LCB2YWxGbG9hdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbnQzMl90IHZhbEludDMyOwotICAgICAgICAgICAgaWYgKGdldEludDMyKGtleSwgJnZhbEludDMyKSkgewotICAgICAgICAgICAgICAgIG1zZy0+c2V0RmxvYXQoa2V5LCAoZmxvYXQpdmFsSW50MzIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi1jb25zdCBjaGFyKiBBTWVkaWFGb3JtYXRXcmFwcGVyOjp0b1N0cmluZygpIGNvbnN0IHsKLSAgICBpZiAobUFNZWRpYUZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gQU1lZGlhRm9ybWF0X3RvU3RyaW5nKG1BTWVkaWFGb3JtYXQpOwotfQotCi1ib29sIEFNZWRpYUZvcm1hdFdyYXBwZXI6OmdldEludDMyKGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKm91dCkgY29uc3QgewotICAgIGlmIChtQU1lZGlhRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2dldEludDMyKG1BTWVkaWFGb3JtYXQsIG5hbWUsIG91dCk7Ci19Ci0KLWJvb2wgQU1lZGlhRm9ybWF0V3JhcHBlcjo6Z2V0SW50NjQoY29uc3QgY2hhciAqbmFtZSwgaW50NjRfdCAqb3V0KSBjb25zdCB7Ci0gICAgaWYgKG1BTWVkaWFGb3JtYXQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBBTWVkaWFGb3JtYXRfZ2V0SW50NjQobUFNZWRpYUZvcm1hdCwgbmFtZSwgb3V0KTsKLX0KLQotYm9vbCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpnZXRGbG9hdChjb25zdCBjaGFyICpuYW1lLCBmbG9hdCAqb3V0KSBjb25zdCB7Ci0gICAgaWYgKG1BTWVkaWFGb3JtYXQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBBTWVkaWFGb3JtYXRfZ2V0RmxvYXQobUFNZWRpYUZvcm1hdCwgbmFtZSwgb3V0KTsKLX0KLQotYm9vbCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpnZXREb3VibGUoY29uc3QgY2hhciAqbmFtZSwgZG91YmxlICpvdXQpIGNvbnN0IHsKLSAgICBpZiAobUFNZWRpYUZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIEFNZWRpYUZvcm1hdF9nZXREb3VibGUobUFNZWRpYUZvcm1hdCwgbmFtZSwgb3V0KTsKLX0KLQotYm9vbCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpnZXRTaXplKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCAqb3V0KSBjb25zdCB7Ci0gICAgaWYgKG1BTWVkaWFGb3JtYXQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBBTWVkaWFGb3JtYXRfZ2V0U2l6ZShtQU1lZGlhRm9ybWF0LCBuYW1lLCBvdXQpOwotfQotCi1ib29sIEFNZWRpYUZvcm1hdFdyYXBwZXI6OmdldFJlY3QoCi0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKmxlZnQsIGludDMyX3QgKnRvcCwgaW50MzJfdCAqcmlnaHQsIGludDMyX3QgKmJvdHRvbSkgY29uc3QgewotICAgIGlmIChtQU1lZGlhRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2dldFJlY3QobUFNZWRpYUZvcm1hdCwgbmFtZSwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKLX0KLQotYm9vbCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpnZXRCdWZmZXIoY29uc3QgY2hhciAqbmFtZSwgdm9pZCoqIGRhdGEsIHNpemVfdCAqb3V0U2l6ZSkgY29uc3QgewotICAgIGlmIChtQU1lZGlhRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihtQU1lZGlhRm9ybWF0LCBuYW1lLCBkYXRhLCBvdXRTaXplKTsKLX0KLQotYm9vbCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpnZXRTdHJpbmcoY29uc3QgY2hhciAqbmFtZSwgQVN0cmluZyAqb3V0KSBjb25zdCB7Ci0gICAgaWYgKG1BTWVkaWFGb3JtYXQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGNvbnN0IGNoYXIgKm91dENoYXIgPSBOVUxMOwotICAgIGJvb2wgcmV0ID0gQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtQU1lZGlhRm9ybWF0LCBuYW1lLCAmb3V0Q2hhcik7Ci0gICAgaWYgKHJldCkgewotICAgICAgICAqb3V0ID0gQVN0cmluZyhvdXRDaGFyKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpzZXRJbnQzMihjb25zdCBjaGFyKiBuYW1lLCBpbnQzMl90IHZhbHVlKSB7Ci0gICAgaWYgKG1BTWVkaWFGb3JtYXQgIT0gTlVMTCkgewotICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUFNZWRpYUZvcm1hdCwgbmFtZSwgdmFsdWUpOwotICAgIH0KLX0KLQotdm9pZCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpzZXRJbnQ2NChjb25zdCBjaGFyKiBuYW1lLCBpbnQ2NF90IHZhbHVlKSB7Ci0gICAgaWYgKG1BTWVkaWFGb3JtYXQgIT0gTlVMTCkgewotICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50NjQobUFNZWRpYUZvcm1hdCwgbmFtZSwgdmFsdWUpOwotICAgIH0KLX0KLQotdm9pZCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpzZXRGbG9hdChjb25zdCBjaGFyKiBuYW1lLCBmbG9hdCB2YWx1ZSkgewotICAgIGlmIChtQU1lZGlhRm9ybWF0ICE9IE5VTEwpIHsKLSAgICAgICAgQU1lZGlhRm9ybWF0X3NldEZsb2F0KG1BTWVkaWFGb3JtYXQsIG5hbWUsIHZhbHVlKTsKLSAgICB9Ci19Ci0KLXZvaWQgQU1lZGlhRm9ybWF0V3JhcHBlcjo6c2V0RG91YmxlKGNvbnN0IGNoYXIqIG5hbWUsIGRvdWJsZSB2YWx1ZSkgewotICAgIGlmIChtQU1lZGlhRm9ybWF0ICE9IE5VTEwpIHsKLSAgICAgICAgQU1lZGlhRm9ybWF0X3NldERvdWJsZShtQU1lZGlhRm9ybWF0LCBuYW1lLCB2YWx1ZSk7Ci0gICAgfQotfQotCi12b2lkIEFNZWRpYUZvcm1hdFdyYXBwZXI6OnNldFNpemUoY29uc3QgY2hhciogbmFtZSwgc2l6ZV90IHZhbHVlKSB7Ci0gICAgaWYgKG1BTWVkaWFGb3JtYXQgIT0gTlVMTCkgewotICAgICAgICBBTWVkaWFGb3JtYXRfc2V0U2l6ZShtQU1lZGlhRm9ybWF0LCBuYW1lLCB2YWx1ZSk7Ci0gICAgfQotfQotCi12b2lkIEFNZWRpYUZvcm1hdFdyYXBwZXI6OnNldFJlY3QoCi0gICAgICAgIGNvbnN0IGNoYXIqIG5hbWUsIGludDMyX3QgbGVmdCwgaW50MzJfdCB0b3AsIGludDMyX3QgcmlnaHQsIGludDMyX3QgYm90dG9tKSB7Ci0gICAgaWYgKG1BTWVkaWFGb3JtYXQgIT0gTlVMTCkgewotICAgICAgICBBTWVkaWFGb3JtYXRfc2V0UmVjdChtQU1lZGlhRm9ybWF0LCBuYW1lLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOwotICAgIH0KLX0KLQotdm9pZCBBTWVkaWFGb3JtYXRXcmFwcGVyOjpzZXRTdHJpbmcoY29uc3QgY2hhciogbmFtZSwgY29uc3QgQVN0cmluZyAmdmFsdWUpIHsKLSAgICBpZiAobUFNZWRpYUZvcm1hdCAhPSBOVUxMKSB7Ci0gICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcobUFNZWRpYUZvcm1hdCwgbmFtZSwgdmFsdWUuY19zdHIoKSk7Ci0gICAgfQotfQotCi12b2lkIEFNZWRpYUZvcm1hdFdyYXBwZXI6OnNldEJ1ZmZlcihjb25zdCBjaGFyKiBuYW1lLCB2b2lkKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtQU1lZGlhRm9ybWF0ICE9IE5VTEwpIHsKLSAgICAgICAgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihtQU1lZGlhRm9ybWF0LCBuYW1lLCBkYXRhLCBzaXplKTsKLSAgICB9Ci19Ci0KLQotLy8vLy8vLy8vLy8vIEFOYXRpdmVXaW5kb3dXcmFwcGVyCi1BTmF0aXZlV2luZG93V3JhcHBlcjo6QU5hdGl2ZVdpbmRvd1dyYXBwZXIoQU5hdGl2ZVdpbmRvdyAqYU5hdGl2ZVdpbmRvdykKLSAgICA6IG1BTmF0aXZlV2luZG93KGFOYXRpdmVXaW5kb3cpIHsKLSAgICBpZiAoYU5hdGl2ZVdpbmRvdyAhPSBOVUxMKSB7Ci0gICAgICAgIEFOYXRpdmVXaW5kb3dfYWNxdWlyZShhTmF0aXZlV2luZG93KTsKLSAgICB9Ci19Ci0KLUFOYXRpdmVXaW5kb3dXcmFwcGVyOjp+QU5hdGl2ZVdpbmRvd1dyYXBwZXIoKSB7Ci0gICAgcmVsZWFzZSgpOwotfQotCi1zdGF0dXNfdCBBTmF0aXZlV2luZG93V3JhcHBlcjo6cmVsZWFzZSgpIHsKLSAgICBpZiAobUFOYXRpdmVXaW5kb3cgIT0gTlVMTCkgewotICAgICAgICBBTmF0aXZlV2luZG93X3JlbGVhc2UobUFOYXRpdmVXaW5kb3cpOwotICAgICAgICBtQU5hdGl2ZVdpbmRvdyA9IE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotQU5hdGl2ZVdpbmRvdyAqQU5hdGl2ZVdpbmRvd1dyYXBwZXI6OmdldEFOYXRpdmVXaW5kb3coKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1BTmF0aXZlV2luZG93OwotfQotCi0KLS8vLy8vLy8vLy8vLyBBTWVkaWFEcm1XcmFwcGVyCi1BTWVkaWFEcm1XcmFwcGVyOjpBTWVkaWFEcm1XcmFwcGVyKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pIHsKLSAgICBtQU1lZGlhRHJtID0gQU1lZGlhRHJtX2NyZWF0ZUJ5VVVJRCh1dWlkKTsKLX0KLQotQU1lZGlhRHJtV3JhcHBlcjo6QU1lZGlhRHJtV3JhcHBlcihBTWVkaWFEcm0gKmFNZWRpYURybSkKLSAgICA6IG1BTWVkaWFEcm0oYU1lZGlhRHJtKSB7Ci19Ci0KLUFNZWRpYURybVdyYXBwZXI6On5BTWVkaWFEcm1XcmFwcGVyKCkgewotICAgIHJlbGVhc2UoKTsKLX0KLQotc3RhdHVzX3QgQU1lZGlhRHJtV3JhcHBlcjo6cmVsZWFzZSgpIHsKLSAgICBpZiAobUFNZWRpYURybSAhPSBOVUxMKSB7Ci0gICAgICAgIEFNZWRpYURybV9yZWxlYXNlKG1BTWVkaWFEcm0pOwotICAgICAgICBtQU1lZGlhRHJtID0gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1BTWVkaWFEcm0gKkFNZWRpYURybVdyYXBwZXI6OmdldEFNZWRpYURybSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUFNZWRpYURybTsKLX0KLQotLy8gc3RhdGljCi1ib29sIEFNZWRpYURybVdyYXBwZXI6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKAotICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLAotICAgICAgICBjb25zdCBjaGFyICptaW1lVHlwZSkgewotICAgIHJldHVybiBBTWVkaWFEcm1faXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVR5cGUpOwotfQotCi0KLS8vLy8vLy8vLy8vLyBBTWVkaWFDcnlwdG9XcmFwcGVyCi1BTWVkaWFDcnlwdG9XcmFwcGVyOjpBTWVkaWFDcnlwdG9XcmFwcGVyKAotICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkICppbml0RGF0YSwgc2l6ZV90IGluaXREYXRhU2l6ZSkgewotICAgIG1BTWVkaWFDcnlwdG8gPSBBTWVkaWFDcnlwdG9fbmV3KHV1aWQsIGluaXREYXRhLCBpbml0RGF0YVNpemUpOwotfQotCi1BTWVkaWFDcnlwdG9XcmFwcGVyOjpBTWVkaWFDcnlwdG9XcmFwcGVyKEFNZWRpYUNyeXB0byAqYU1lZGlhQ3J5cHRvKQotICAgIDogbUFNZWRpYUNyeXB0byhhTWVkaWFDcnlwdG8pIHsKLX0KLQotQU1lZGlhQ3J5cHRvV3JhcHBlcjo6fkFNZWRpYUNyeXB0b1dyYXBwZXIoKSB7Ci0gICAgcmVsZWFzZSgpOwotfQotCi1zdGF0dXNfdCBBTWVkaWFDcnlwdG9XcmFwcGVyOjpyZWxlYXNlKCkgewotICAgIGlmIChtQU1lZGlhQ3J5cHRvICE9IE5VTEwpIHsKLSAgICAgICAgQU1lZGlhQ3J5cHRvX2RlbGV0ZShtQU1lZGlhQ3J5cHRvKTsKLSAgICAgICAgbUFNZWRpYUNyeXB0byA9IE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotQU1lZGlhQ3J5cHRvICpBTWVkaWFDcnlwdG9XcmFwcGVyOjpnZXRBTWVkaWFDcnlwdG8oKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1BTWVkaWFDcnlwdG87Ci19Ci0KLWJvb2wgQU1lZGlhQ3J5cHRvV3JhcHBlcjo6aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSkgewotICAgIGlmIChtQU1lZGlhQ3J5cHRvID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gQU1lZGlhQ3J5cHRvX2lzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQpOwotfQotCi1ib29sIEFNZWRpYUNyeXB0b1dyYXBwZXI6OnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChjb25zdCBjaGFyICptaW1lKSB7Ci0gICAgaWYgKG1BTWVkaWFDcnlwdG8gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBBTWVkaWFDcnlwdG9fcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KG1pbWUpOwotfQotCi0KLS8vLy8vLy8vLy8vLyBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyCi0vLyBzdGF0aWMKLXNwPEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI+IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OkNyZWF0ZShNZXRhRGF0YUJhc2UgJm1ldGEpIHsKLQotICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgY29uc3Qgdm9pZCAqY3J5cHRlZGRhdGE7Ci0gICAgc2l6ZV90IGNyeXB0ZWRzaXplOwotCi0gICAgaWYgKCFtZXRhLmZpbmREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywgJnR5cGUsICZjcnlwdGVkZGF0YSwgJmNyeXB0ZWRzaXplKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpbnQgbnVtU3ViU2FtcGxlcyA9IGNyeXB0ZWRzaXplIC8gc2l6ZW9mKHNpemVfdCk7Ci0KLSAgICBpZiAobnVtU3ViU2FtcGxlcyA8PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJDcmVhdGU6IElOVkFMSUQgbnVtU3ViU2FtcGxlczogJWQiLCBudW1TdWJTYW1wbGVzKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgY29uc3Qgdm9pZCAqY2xlYXJkYXRhOwotICAgIHNpemVfdCBjbGVhcnNpemU7Ci0gICAgaWYgKG1ldGEuZmluZERhdGEoa0tleVBsYWluU2l6ZXMsICZ0eXBlLCAmY2xlYXJkYXRhLCAmY2xlYXJzaXplKSkgewotICAgICAgICBpZiAoY2xlYXJzaXplICE9IGNyeXB0ZWRzaXplKSB7Ci0gICAgICAgICAgICAvLyBUaGUgdHdvIG11c3QgYmUgb2YgdGhlIHNhbWUgbGVuZ3RoLgotICAgICAgICAgICAgQUxPR0UoIkNyZWF0ZTogbWlzbWF0Y2ggY3J5cHRlZHNpemU6ICV6dSAhPSBjbGVhcnNpemU6ICV6dSIsIGNyeXB0ZWRzaXplLCBjbGVhcnNpemUpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjb25zdCB2b2lkICprZXk7Ci0gICAgc2l6ZV90IGtleXNpemU7Ci0gICAgaWYgKG1ldGEuZmluZERhdGEoa0tleUNyeXB0b0tleSwgJnR5cGUsICZrZXksICZrZXlzaXplKSkgewotICAgICAgICBpZiAoa2V5c2l6ZSAhPSBrQUVTQmxvY2tTaXplKSB7Ci0gICAgICAgICAgICAvLyBLZXlzIG11c3QgYmUgMTYgYnl0ZXMgaW4gbGVuZ3RoLgotICAgICAgICAgICAgQUxPR0UoIkNyZWF0ZTogS2V5cyBtdXN0IGJlICV6dSBieXRlcyBpbiBsZW5ndGg6ICV6dSIsIGtBRVNCbG9ja1NpemUsIGtleXNpemUpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBjb25zdCB2b2lkICppdjsKLSAgICBzaXplX3QgaXZzaXplOwotICAgIGlmIChtZXRhLmZpbmREYXRhKGtLZXlDcnlwdG9JViwgJnR5cGUsICZpdiwgJml2c2l6ZSkpIHsKLSAgICAgICAgaWYgKGl2c2l6ZSAhPSBrQUVTQmxvY2tTaXplKSB7Ci0gICAgICAgICAgICAvLyBJVnMgbXVzdCBiZSAxNiBieXRlcyBpbiBsZW5ndGguCi0gICAgICAgICAgICBBTE9HRSgiQ3JlYXRlOiBJViBtdXN0IGJlICV6dSBieXRlcyBpbiBsZW5ndGg6ICV6dSIsIGtBRVNCbG9ja1NpemUsIGl2c2l6ZSk7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludDMyX3QgbW9kZTsKLSAgICBpZiAoIW1ldGEuZmluZEludDMyKGtLZXlDcnlwdG9Nb2RlLCAmbW9kZSkpIHsKLSAgICAgICAgbW9kZSA9IENyeXB0b1BsdWdpbjo6a01vZGVfQUVTX0NUUjsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXIoCi0gICAgICAgICAgICBudW1TdWJTYW1wbGVzLAotICAgICAgICAgICAgKHVpbnQ4X3QqKSBrZXksCi0gICAgICAgICAgICAodWludDhfdCopIGl2LAotICAgICAgICAgICAgKENyeXB0b1BsdWdpbjo6TW9kZSltb2RlLAotICAgICAgICAgICAgKHNpemVfdCopIGNsZWFyZGF0YSwKLSAgICAgICAgICAgIChzaXplX3QqKSBjcnlwdGVkZGF0YSk7Ci19Ci0KLUFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OkFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXIoCi0gICAgICAgIGludCBudW1zdWJzYW1wbGVzLAotICAgICAgICB1aW50OF90IGtleVsxNl0sCi0gICAgICAgIHVpbnQ4X3QgaXZbMTZdLAotICAgICAgICBDcnlwdG9QbHVnaW46Ok1vZGUgbW9kZSwKLSAgICAgICAgc2l6ZV90ICpjbGVhcmJ5dGVzLAotICAgICAgICBzaXplX3QgKmVuY3J5cHRlZGJ5dGVzKSB7Ci0gICAgbUFNZWRpYUNvZGVjQ3J5cHRvSW5mbyA9Ci0gICAgICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19uZXcobnVtc3Vic2FtcGxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNsYXRlVG9DcnlwdG9JbmZvTW9kZShtb2RlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcmJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRlZGJ5dGVzKTsKLX0KLQotQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcjo6QU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcigKLSAgICAgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvICphTWVkaWFDb2RlY0NyeXB0b0luZm8pCi0gICAgOiBtQU1lZGlhQ29kZWNDcnlwdG9JbmZvKGFNZWRpYUNvZGVjQ3J5cHRvSW5mbykgewotfQotCi1BTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyOjp+QU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcigpIHsKLSAgICByZWxlYXNlKCk7Ci19Ci0KLXN0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OnJlbGVhc2UoKSB7Ci0gICAgaWYgKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8gIT0gTlVMTCkgewotICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZGVsZXRlKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8pOwotICAgICAgICBtQU1lZGlhQ29kZWNDcnlwdG9JbmZvID0gTlVMTDsKLSAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShlcnIpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLUFNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcjo6Z2V0QU1lZGlhQ29kZWNDcnlwdG9JbmZvKCkgY29uc3QgewotICAgIHJldHVybiBtQU1lZGlhQ29kZWNDcnlwdG9JbmZvOwotfQotCi12b2lkIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OnNldFBhdHRlcm4oQ3J5cHRvUGx1Z2luOjpQYXR0ZXJuICpwYXR0ZXJuKSB7Ci0gICAgaWYgKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8gPT0gTlVMTCB8fCBwYXR0ZXJuID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjcnlwdG9pbmZvX3BhdHRlcm5fdCBuZGtQYXR0ZXJuID0geyhpbnQzMl90KXBhdHRlcm4tPm1FbmNyeXB0QmxvY2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpcGF0dGVybi0+bVNraXBCbG9ja3MgfTsKLSAgICByZXR1cm4gQU1lZGlhQ29kZWNDcnlwdG9JbmZvX3NldFBhdHRlcm4obUFNZWRpYUNvZGVjQ3J5cHRvSW5mbywgJm5ka1BhdHRlcm4pOwotfQotCi1zaXplX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcjo6Z2V0TnVtU3ViU2FtcGxlcygpIHsKLSAgICBpZiAobUFNZWRpYUNvZGVjQ3J5cHRvSW5mbyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldE51bVN1YlNhbXBsZXMobUFNZWRpYUNvZGVjQ3J5cHRvSW5mbyk7Ci19Ci0KLXN0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OmdldEtleSh1aW50OF90ICpkc3QpIHsKLSAgICBpZiAobUFNZWRpYUNvZGVjQ3J5cHRvSW5mbyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0gICAgaWYgKGRzdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoCi0gICAgICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRLZXkobUFNZWRpYUNvZGVjQ3J5cHRvSW5mbywgZHN0KSk7Ci19Ci0KLXN0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OmdldElWKHVpbnQ4X3QgKmRzdCkgewotICAgIGlmIChtQU1lZGlhQ29kZWNDcnlwdG9JbmZvID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBpZiAoZHN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZSgKLSAgICAgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldElWKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8sIGRzdCkpOwotfQotCi1DcnlwdG9QbHVnaW46Ok1vZGUgQU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcjo6Z2V0TW9kZSgpIHsKLSAgICBpZiAobUFNZWRpYUNvZGVjQ3J5cHRvSW5mbyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBDcnlwdG9QbHVnaW46OmtNb2RlX1VuZW5jcnlwdGVkOwotICAgIH0KLSAgICByZXR1cm4gdHJhbnNsYXRlVG9DcnlwdG9QbHVnaW5Nb2RlKAotICAgICAgICBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0TW9kZShtQU1lZGlhQ29kZWNDcnlwdG9JbmZvKSk7Ci19Ci0KLXN0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OmdldENsZWFyQnl0ZXMoc2l6ZV90ICpkc3QpIHsKLSAgICBpZiAobUFNZWRpYUNvZGVjQ3J5cHRvSW5mbyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0gICAgaWYgKGRzdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoCi0gICAgICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRDbGVhckJ5dGVzKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8sIGRzdCkpOwotfQotCi1zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyOjpnZXRFbmNyeXB0ZWRCeXRlcyhzaXplX3QgKmRzdCkgewotICAgIGlmIChtQU1lZGlhQ29kZWNDcnlwdG9JbmZvID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBpZiAoZHN0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZSgKLSAgICAgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldEVuY3J5cHRlZEJ5dGVzKG1BTWVkaWFDb2RlY0NyeXB0b0luZm8sIGRzdCkpOwotfQotCi0KLS8vLy8vLy8vLy8vLyBBTWVkaWFDb2RlY1dyYXBwZXIKLS8vIHN0YXRpYwotc3A8QU1lZGlhQ29kZWNXcmFwcGVyPiBBTWVkaWFDb2RlY1dyYXBwZXI6OkNyZWF0ZUNvZGVjQnlOYW1lKGNvbnN0IEFTdHJpbmcgJm5hbWUpIHsKLSAgICBBTWVkaWFDb2RlYyAqYU1lZGlhQ29kZWMgPSBBTWVkaWFDb2RlY19jcmVhdGVDb2RlY0J5TmFtZShuYW1lLmNfc3RyKCkpOwotICAgIHJldHVybiBuZXcgQU1lZGlhQ29kZWNXcmFwcGVyKGFNZWRpYUNvZGVjKTsKLX0KLQotLy8gc3RhdGljCi1zcDxBTWVkaWFDb2RlY1dyYXBwZXI+IEFNZWRpYUNvZGVjV3JhcHBlcjo6Q3JlYXRlRGVjb2RlckJ5VHlwZShjb25zdCBBU3RyaW5nICZtaW1lVHlwZSkgewotICAgIEFNZWRpYUNvZGVjICphTWVkaWFDb2RlYyA9IEFNZWRpYUNvZGVjX2NyZWF0ZURlY29kZXJCeVR5cGUobWltZVR5cGUuY19zdHIoKSk7Ci0gICAgcmV0dXJuIG5ldyBBTWVkaWFDb2RlY1dyYXBwZXIoYU1lZGlhQ29kZWMpOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgQU1lZGlhQ29kZWNXcmFwcGVyOjpPbklucHV0QXZhaWxhYmxlQ0IoCi0gICAgICAgIEFNZWRpYUNvZGVjICogLyogYU1lZGlhQ29kZWMgKi8sCi0gICAgICAgIHZvaWQgKnVzZXJkYXRhLAotICAgICAgICBpbnQzMl90IGluZGV4KSB7Ci0gICAgQUxPR1YoIk9uSW5wdXRBdmFpbGFibGVDQjogaW5kZXgoJWQpIiwgaW5kZXgpOwotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBzcDxBTWVzc2FnZT4oKEFNZXNzYWdlICopdXNlcmRhdGEpLT5kdXAoKTsKLSAgICBtc2ctPnNldEludDMyKCJjYWxsYmFja0lEIiwgQ0JfSU5QVVRfQVZBSUxBQkxFKTsKLSAgICBtc2ctPnNldEludDMyKCJpbmRleCIsIGluZGV4KTsKLSAgICBtc2ctPnBvc3QoKTsKLX0KLQotLy8gc3RhdGljCi12b2lkIEFNZWRpYUNvZGVjV3JhcHBlcjo6T25PdXRwdXRBdmFpbGFibGVDQigKLSAgICAgICAgQU1lZGlhQ29kZWMgKiAvKiBhTWVkaWFDb2RlYyAqLywKLSAgICAgICAgdm9pZCAqdXNlcmRhdGEsCi0gICAgICAgIGludDMyX3QgaW5kZXgsCi0gICAgICAgIEFNZWRpYUNvZGVjQnVmZmVySW5mbyAqYnVmZmVySW5mbykgewotICAgIEFMT0dWKCJPbk91dHB1dEF2YWlsYWJsZUNCOiBpbmRleCglZCksICglZCwgJWQsICVsbGQsIDB4JXgpIiwKLSAgICAgICAgICBpbmRleCwgYnVmZmVySW5mby0+b2Zmc2V0LCBidWZmZXJJbmZvLT5zaXplLAotICAgICAgICAgIChsb25nIGxvbmcpYnVmZmVySW5mby0+cHJlc2VudGF0aW9uVGltZVVzLCBidWZmZXJJbmZvLT5mbGFncyk7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IHNwPEFNZXNzYWdlPigoQU1lc3NhZ2UgKil1c2VyZGF0YSktPmR1cCgpOwotICAgIG1zZy0+c2V0SW50MzIoImNhbGxiYWNrSUQiLCBDQl9PVVRQVVRfQVZBSUxBQkxFKTsKLSAgICBtc2ctPnNldEludDMyKCJpbmRleCIsIGluZGV4KTsKLSAgICBtc2ctPnNldFNpemUoIm9mZnNldCIsIChzaXplX3QpKGJ1ZmZlckluZm8tPm9mZnNldCkpOwotICAgIG1zZy0+c2V0U2l6ZSgic2l6ZSIsIChzaXplX3QpKGJ1ZmZlckluZm8tPnNpemUpKTsKLSAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCBidWZmZXJJbmZvLT5wcmVzZW50YXRpb25UaW1lVXMpOwotICAgIG1zZy0+c2V0SW50MzIoImZsYWdzIiwgKGludDMyX3QpKGJ1ZmZlckluZm8tPmZsYWdzKSk7Ci0gICAgbXNnLT5wb3N0KCk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBBTWVkaWFDb2RlY1dyYXBwZXI6Ok9uRm9ybWF0Q2hhbmdlZENCKAotICAgICAgICBBTWVkaWFDb2RlYyAqIC8qIGFNZWRpYUNvZGVjICovLAotICAgICAgICB2b2lkICp1c2VyZGF0YSwKLSAgICAgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQpIHsKLSAgICBzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiBmb3JtYXRXcmFwcGVyID0gbmV3IEFNZWRpYUZvcm1hdFdyYXBwZXIoZm9ybWF0KTsKLSAgICBzcDxBTWVzc2FnZT4gb3V0cHV0Rm9ybWF0ID0gZm9ybWF0V3JhcHBlci0+dG9BTWVzc2FnZSgpOwotICAgIEFMT0dWKCJPbkZvcm1hdENoYW5nZWRDQjogZm9ybWF0KCVzKSIsIG91dHB1dEZvcm1hdC0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKLQotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBzcDxBTWVzc2FnZT4oKEFNZXNzYWdlICopdXNlcmRhdGEpLT5kdXAoKTsKLSAgICBtc2ctPnNldEludDMyKCJjYWxsYmFja0lEIiwgQ0JfT1VUUFVUX0ZPUk1BVF9DSEFOR0VEKTsKLSAgICBtc2ctPnNldE1lc3NhZ2UoImZvcm1hdCIsIG91dHB1dEZvcm1hdCk7Ci0gICAgbXNnLT5wb3N0KCk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBBTWVkaWFDb2RlY1dyYXBwZXI6Ok9uRXJyb3JDQigKLSAgICAgICAgQU1lZGlhQ29kZWMgKiAvKiBhTWVkaWFDb2RlYyAqLywKLSAgICAgICAgdm9pZCAqdXNlcmRhdGEsCi0gICAgICAgIG1lZGlhX3N0YXR1c190IGVyciwKLSAgICAgICAgaW50MzJfdCBhY3Rpb25Db2RlLAotICAgICAgICBjb25zdCBjaGFyICpkZXRhaWwpIHsKLSAgICBBTE9HVigiT25FcnJvckNCOiBlcnIoJWQpLCBhY3Rpb25Db2RlKCVkKSwgZGV0YWlsKCVzKSIsIGVyciwgYWN0aW9uQ29kZSwgZGV0YWlsKTsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gc3A8QU1lc3NhZ2U+KChBTWVzc2FnZSAqKXVzZXJkYXRhKS0+ZHVwKCk7Ci0gICAgbXNnLT5zZXRJbnQzMigiY2FsbGJhY2tJRCIsIENCX0VSUk9SKTsKLSAgICBtc2ctPnNldEludDMyKCJlcnIiLCB0cmFuc2xhdGVFcnJvckNvZGUoZXJyKSk7Ci0gICAgbXNnLT5zZXRJbnQzMigiYWN0aW9uQ29kZSIsIHRyYW5zbGF0ZUFjdGlvbkNvZGUoYWN0aW9uQ29kZSkpOwotICAgIG1zZy0+c2V0U3RyaW5nKCJkZXRhaWwiLCBkZXRhaWwpOwotICAgIG1zZy0+cG9zdCgpOwotfQotCi1BTWVkaWFDb2RlY1dyYXBwZXI6OkFNZWRpYUNvZGVjV3JhcHBlcihBTWVkaWFDb2RlYyAqYU1lZGlhQ29kZWMpCi0gICAgOiBtQU1lZGlhQ29kZWMoYU1lZGlhQ29kZWMpIHsKLX0KLQotQU1lZGlhQ29kZWNXcmFwcGVyOjp+QU1lZGlhQ29kZWNXcmFwcGVyKCkgewotICAgIHJlbGVhc2UoKTsKLX0KLQotc3RhdHVzX3QgQU1lZGlhQ29kZWNXcmFwcGVyOjpyZWxlYXNlKCkgewotICAgIGlmIChtQU1lZGlhQ29kZWMgIT0gTlVMTCkgewotICAgICAgICBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjayBhQ0IgPSB7fTsKLSAgICAgICAgQU1lZGlhQ29kZWNfc2V0QXN5bmNOb3RpZnlDYWxsYmFjayhtQU1lZGlhQ29kZWMsIGFDQiwgTlVMTCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IE5VTEw7Ci0KLSAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gQU1lZGlhQ29kZWNfZGVsZXRlKG1BTWVkaWFDb2RlYyk7Ci0gICAgICAgIG1BTWVkaWFDb2RlYyA9IE5VTEw7Ci0gICAgICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1BTWVkaWFDb2RlYyAqQU1lZGlhQ29kZWNXcmFwcGVyOjpnZXRBTWVkaWFDb2RlYygpIGNvbnN0IHsKLSAgICByZXR1cm4gbUFNZWRpYUNvZGVjOwotfQotCi1zdGF0dXNfdCBBTWVkaWFDb2RlY1dyYXBwZXI6OmdldE5hbWUoQVN0cmluZyAqb3V0Q29tcG9uZW50TmFtZSkgY29uc3QgewotICAgIGlmIChtQU1lZGlhQ29kZWMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIGNoYXIgKm5hbWUgPSBOVUxMOwotICAgIG1lZGlhX3N0YXR1c190IGVyciA9IEFNZWRpYUNvZGVjX2dldE5hbWUobUFNZWRpYUNvZGVjLCAmbmFtZSk7Ci0gICAgaWYgKGVyciAhPSBBTUVESUFfT0spIHsKLSAgICAgICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShlcnIpOwotICAgIH0KLQotICAgICpvdXRDb21wb25lbnROYW1lID0gQVN0cmluZyhuYW1lKTsKLSAgICBBTWVkaWFDb2RlY19yZWxlYXNlTmFtZShtQU1lZGlhQ29kZWMsIG5hbWUpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgQU1lZGlhQ29kZWNXcmFwcGVyOjpjb25maWd1cmUoCi0gICAgY29uc3Qgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gJmZvcm1hdCwKLSAgICBjb25zdCBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gJm53dywKLSAgICBjb25zdCBzcDxBTWVkaWFDcnlwdG9XcmFwcGVyPiAmY3J5cHRvLAotICAgIHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0KLSAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBBTWVkaWFDb2RlY19jb25maWd1cmUoCi0gICAgICAgICAgICBtQU1lZGlhQ29kZWMsCi0gICAgICAgICAgICBmb3JtYXQtPmdldEFNZWRpYUZvcm1hdCgpLAotICAgICAgICAgICAgKG53dyA9PSBOVUxMID8gTlVMTCA6IG53dy0+Z2V0QU5hdGl2ZVdpbmRvdygpKSwKLSAgICAgICAgICAgIGNyeXB0byA9PSBOVUxMID8gTlVMTCA6IGNyeXB0by0+Z2V0QU1lZGlhQ3J5cHRvKCksCi0gICAgICAgICAgICBmbGFncyk7Ci0KLSAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKGVycik7Ci19Ci0KLXN0YXR1c190IEFNZWRpYUNvZGVjV3JhcHBlcjo6c2V0Q2FsbGJhY2soY29uc3Qgc3A8QU1lc3NhZ2U+ICZjYWxsYmFjaykgewotICAgIGlmIChtQU1lZGlhQ29kZWMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotCi0gICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0KLSAgICBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjayBhQ0IgPSB7Ci0gICAgICAgIE9uSW5wdXRBdmFpbGFibGVDQiwKLSAgICAgICAgT25PdXRwdXRBdmFpbGFibGVDQiwKLSAgICAgICAgT25Gb3JtYXRDaGFuZ2VkQ0IsCi0gICAgICAgIE9uRXJyb3JDQgotICAgIH07Ci0KLSAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKAotICAgICAgICAgICAgQU1lZGlhQ29kZWNfc2V0QXN5bmNOb3RpZnlDYWxsYmFjayhtQU1lZGlhQ29kZWMsIGFDQiwgY2FsbGJhY2suZ2V0KCkpKTsKLX0KLQotc3RhdHVzX3QgQU1lZGlhQ29kZWNXcmFwcGVyOjpyZWxlYXNlQ3J5cHRvKCkgewotICAgIGlmIChtQU1lZGlhQ29kZWMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoQU1lZGlhQ29kZWNfcmVsZWFzZUNyeXB0byhtQU1lZGlhQ29kZWMpKTsKLX0KLQotc3RhdHVzX3QgQU1lZGlhQ29kZWNXcmFwcGVyOjpzdGFydCgpIHsKLSAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKEFNZWRpYUNvZGVjX3N0YXJ0KG1BTWVkaWFDb2RlYykpOwotfQotCi1zdGF0dXNfdCBBTWVkaWFDb2RlY1dyYXBwZXI6OnN0b3AoKSB7Ci0gICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0gICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShBTWVkaWFDb2RlY19zdG9wKG1BTWVkaWFDb2RlYykpOwotfQotCi1zdGF0dXNfdCBBTWVkaWFDb2RlY1dyYXBwZXI6OmZsdXNoKCkgewotICAgIGlmIChtQU1lZGlhQ29kZWMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoQU1lZGlhQ29kZWNfZmx1c2gobUFNZWRpYUNvZGVjKSk7Ci19Ci0KLXVpbnQ4X3QqIEFNZWRpYUNvZGVjV3JhcHBlcjo6Z2V0SW5wdXRCdWZmZXIoc2l6ZV90IGlkeCwgc2l6ZV90ICpvdXRfc2l6ZSkgewotICAgIGlmIChtQU1lZGlhQ29kZWMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIEFNZWRpYUNvZGVjX2dldElucHV0QnVmZmVyKG1BTWVkaWFDb2RlYywgaWR4LCBvdXRfc2l6ZSk7Ci19Ci0KLXVpbnQ4X3QqIEFNZWRpYUNvZGVjV3JhcHBlcjo6Z2V0T3V0cHV0QnVmZmVyKHNpemVfdCBpZHgsIHNpemVfdCAqb3V0X3NpemUpIHsKLSAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBBTWVkaWFDb2RlY19nZXRPdXRwdXRCdWZmZXIobUFNZWRpYUNvZGVjLCBpZHgsIG91dF9zaXplKTsKLX0KLQotc3RhdHVzX3QgQU1lZGlhQ29kZWNXcmFwcGVyOjpxdWV1ZUlucHV0QnVmZmVyKAotICAgICAgICBzaXplX3QgaWR4LAotICAgICAgICBzaXplX3Qgb2Zmc2V0LAotICAgICAgICBzaXplX3Qgc2l6ZSwKLSAgICAgICAgdWludDY0X3QgdGltZSwKLSAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKAotICAgICAgICBBTWVkaWFDb2RlY19xdWV1ZUlucHV0QnVmZmVyKG1BTWVkaWFDb2RlYywgaWR4LCBvZmZzZXQsIHNpemUsIHRpbWUsIGZsYWdzKSk7Ci19Ci0KLXN0YXR1c190IEFNZWRpYUNvZGVjV3JhcHBlcjo6cXVldWVTZWN1cmVJbnB1dEJ1ZmZlcigKLSAgICAgICAgc2l6ZV90IGlkeCwKLSAgICAgICAgc2l6ZV90IG9mZnNldCwKLSAgICAgICAgc3A8QU1lZGlhQ29kZWNDcnlwdG9JbmZvV3JhcHBlcj4gJmNvZGVjQ3J5cHRvSW5mbywKLSAgICAgICAgdWludDY0X3QgdGltZSwKLSAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKLSAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKAotICAgICAgICBBTWVkaWFDb2RlY19xdWV1ZVNlY3VyZUlucHV0QnVmZmVyKAotICAgICAgICAgICAgbUFNZWRpYUNvZGVjLAotICAgICAgICAgICAgaWR4LAotICAgICAgICAgICAgb2Zmc2V0LAotICAgICAgICAgICAgY29kZWNDcnlwdG9JbmZvLT5nZXRBTWVkaWFDb2RlY0NyeXB0b0luZm8oKSwKLSAgICAgICAgICAgIHRpbWUsCi0gICAgICAgICAgICBmbGFncykpOwotfQotCi1zcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiBBTWVkaWFDb2RlY1dyYXBwZXI6OmdldE91dHB1dEZvcm1hdCgpIHsKLSAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBuZXcgQU1lZGlhRm9ybWF0V3JhcHBlcihBTWVkaWFDb2RlY19nZXRPdXRwdXRGb3JtYXQobUFNZWRpYUNvZGVjKSk7Ci19Ci0KLXNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+IEFNZWRpYUNvZGVjV3JhcHBlcjo6Z2V0SW5wdXRGb3JtYXQoKSB7Ci0gICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbmV3IEFNZWRpYUZvcm1hdFdyYXBwZXIoQU1lZGlhQ29kZWNfZ2V0SW5wdXRGb3JtYXQobUFNZWRpYUNvZGVjKSk7Ci19Ci0KLXN0YXR1c190IEFNZWRpYUNvZGVjV3JhcHBlcjo6cmVsZWFzZU91dHB1dEJ1ZmZlcihzaXplX3QgaWR4LCBib29sIHJlbmRlcikgewotICAgIGlmIChtQU1lZGlhQ29kZWMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoCi0gICAgICAgIEFNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXIobUFNZWRpYUNvZGVjLCBpZHgsIHJlbmRlcikpOwotfQotCi1zdGF0dXNfdCBBTWVkaWFDb2RlY1dyYXBwZXI6OnNldE91dHB1dFN1cmZhY2UoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3cpIHsKLSAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKAotICAgICAgICBBTWVkaWFDb2RlY19zZXRPdXRwdXRTdXJmYWNlKG1BTWVkaWFDb2RlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobnd3ID09IE5VTEwgPyBOVUxMIDogbnd3LT5nZXRBTmF0aXZlV2luZG93KCkpKSk7Ci19Ci0KLXN0YXR1c190IEFNZWRpYUNvZGVjV3JhcHBlcjo6cmVsZWFzZU91dHB1dEJ1ZmZlckF0VGltZShzaXplX3QgaWR4LCBpbnQ2NF90IHRpbWVzdGFtcE5zKSB7Ci0gICAgaWYgKG1BTWVkaWFDb2RlYyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0gICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZSgKLSAgICAgICAgQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlckF0VGltZShtQU1lZGlhQ29kZWMsIGlkeCwgdGltZXN0YW1wTnMpKTsKLX0KLQotc3RhdHVzX3QgQU1lZGlhQ29kZWNXcmFwcGVyOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+ICZwYXJhbXMpIHsKLSAgICBpZiAobUFNZWRpYUNvZGVjID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKAotICAgICAgICBBTWVkaWFDb2RlY19zZXRQYXJhbWV0ZXJzKG1BTWVkaWFDb2RlYywgcGFyYW1zLT5nZXRBTWVkaWFGb3JtYXQoKSkpOwotfQotCi0vLy8vLy8vLy8vLy8gQU1lZGlhRXh0cmFjdG9yV3JhcHBlcgotCi1BTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpBTWVkaWFFeHRyYWN0b3JXcmFwcGVyKEFNZWRpYUV4dHJhY3RvciAqYU1lZGlhRXh0cmFjdG9yKQotICAgIDogbUFNZWRpYUV4dHJhY3RvcihhTWVkaWFFeHRyYWN0b3IpIHsKLX0KLQotQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6fkFNZWRpYUV4dHJhY3RvcldyYXBwZXIoKSB7Ci0gICAgcmVsZWFzZSgpOwotfQotCi1zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpyZWxlYXNlKCkgewotICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yICE9IE5VTEwpIHsKLSAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShtQU1lZGlhRXh0cmFjdG9yKTsKLSAgICAgICAgbUFNZWRpYUV4dHJhY3RvciA9IE5VTEw7Ci0gICAgICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpkaXNjb25uZWN0KCkgewotICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yICE9IE5VTEwpIHsKLSAgICAgICAgbWVkaWFfc3RhdHVzX3QgZXJyID0gQU1lZGlhRXh0cmFjdG9yX2Rpc2Nvbm5lY3QobUFNZWRpYUV4dHJhY3Rvcik7Ci0gICAgICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoZXJyKTsKLSAgICB9Ci0gICAgcmV0dXJuIERFQURfT0JKRUNUOwotfQotCi1BTWVkaWFFeHRyYWN0b3IgKkFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmdldEFNZWRpYUV4dHJhY3RvcigpIGNvbnN0IHsKLSAgICByZXR1cm4gbUFNZWRpYUV4dHJhY3RvcjsKLX0KLQotc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6c2V0RGF0YVNvdXJjZShpbnQgZmQsIG9mZjY0X3Qgb2Zmc2V0LCBvZmY2NF90IGxlbmd0aCkgewotICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlRmQoCi0gICAgICAgICAgICBtQU1lZGlhRXh0cmFjdG9yLCBmZCwgb2Zmc2V0LCBsZW5ndGgpKTsKLX0KLQotc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6c2V0RGF0YVNvdXJjZShjb25zdCBjaGFyICpsb2NhdGlvbikgewotICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlKG1BTWVkaWFFeHRyYWN0b3IsIGxvY2F0aW9uKSk7Ci19Ci0KLXN0YXR1c190IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OnNldERhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZSAqc291cmNlKSB7Ci0gICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VDdXN0b20obUFNZWRpYUV4dHJhY3Rvciwgc291cmNlKSk7Ci19Ci0KLXNpemVfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpnZXRUcmFja0NvdW50KCkgewotICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tDb3VudChtQU1lZGlhRXh0cmFjdG9yKTsKLX0KLQotc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6Z2V0Rm9ybWF0KCkgewotICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBuZXcgQU1lZGlhRm9ybWF0V3JhcHBlcihBTWVkaWFFeHRyYWN0b3JfZ2V0RmlsZUZvcm1hdChtQU1lZGlhRXh0cmFjdG9yKSk7Ci19Ci0KLXNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmdldFRyYWNrRm9ybWF0KHNpemVfdCBpZHgpIHsKLSAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gbmV3IEFNZWRpYUZvcm1hdFdyYXBwZXIoQU1lZGlhRXh0cmFjdG9yX2dldFRyYWNrRm9ybWF0KG1BTWVkaWFFeHRyYWN0b3IsIGlkeCkpOwotfQotCi1zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpzZWxlY3RUcmFjayhzaXplX3QgaWR4KSB7Ci0gICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgfQotICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoQU1lZGlhRXh0cmFjdG9yX3NlbGVjdFRyYWNrKG1BTWVkaWFFeHRyYWN0b3IsIGlkeCkpOwotfQotCi1zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjp1bnNlbGVjdFRyYWNrKHNpemVfdCBpZHgpIHsKLSAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICB9Ci0gICAgcmV0dXJuIHRyYW5zbGF0ZUVycm9yQ29kZShBTWVkaWFFeHRyYWN0b3JfdW5zZWxlY3RUcmFjayhtQU1lZGlhRXh0cmFjdG9yLCBpZHgpKTsKLX0KLQotc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6c2VsZWN0U2luZ2xlVHJhY2soc2l6ZV90IGlkeCkgewotICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0NvdW50KG1BTWVkaWFFeHRyYWN0b3IpOyArK2kpIHsKLSAgICAgICAgaWYgKGkgPT0gaWR4KSB7Ci0gICAgICAgICAgICBtZWRpYV9zdGF0dXNfdCBlcnIgPSBBTWVkaWFFeHRyYWN0b3Jfc2VsZWN0VHJhY2sobUFNZWRpYUV4dHJhY3RvciwgaSk7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IEFNRURJQV9PSykgewotICAgICAgICAgICAgICAgIHJldHVybiB0cmFuc2xhdGVFcnJvckNvZGUoZXJyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1lZGlhX3N0YXR1c190IGVyciA9IEFNZWRpYUV4dHJhY3Rvcl91bnNlbGVjdFRyYWNrKG1BTWVkaWFFeHRyYWN0b3IsIGkpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBBTUVESUFfT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKGVycik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zc2l6ZV90IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OnJlYWRTYW1wbGVEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpIHsKLSAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgcmV0dXJuIEFNZWRpYUV4dHJhY3Rvcl9yZWFkU2FtcGxlRGF0YShtQU1lZGlhRXh0cmFjdG9yLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5jYXBhY2l0eSgpKTsKLX0KLQotc3NpemVfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpnZXRTYW1wbGVTaXplKCkgewotICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlU2l6ZShtQU1lZGlhRXh0cmFjdG9yKTsKLX0KLQotdWludDMyX3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6Z2V0U2FtcGxlRmxhZ3MoKSB7Ci0gICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVGbGFncyhtQU1lZGlhRXh0cmFjdG9yKTsKLX0KLQotaW50IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmdldFNhbXBsZVRyYWNrSW5kZXgoKSB7Ci0gICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVHJhY2tJbmRleChtQU1lZGlhRXh0cmFjdG9yKTsKLX0KLQotaW50NjRfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpnZXRTYW1wbGVUaW1lKCkgewotICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICByZXR1cm4gQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRpbWUobUFNZWRpYUV4dHJhY3Rvcik7Ci19Ci0KLXN0YXR1c190IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmdldFNhbXBsZUZvcm1hdChzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiAmZm9ybWF0V3JhcHBlcikgewotICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLSAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCA9IEFNZWRpYUZvcm1hdF9uZXcoKTsKLSAgICBmb3JtYXRXcmFwcGVyID0gbmV3IEFNZWRpYUZvcm1hdFdyYXBwZXIoZm9ybWF0KTsKLSAgICByZXR1cm4gdHJhbnNsYXRlRXJyb3JDb2RlKEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVGb3JtYXQobUFNZWRpYUV4dHJhY3RvciwgZm9ybWF0KSk7Ci19Ci0KLWludDY0X3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6Z2V0Q2FjaGVkRHVyYXRpb24oKSB7Ci0gICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3JfZ2V0Q2FjaGVkRHVyYXRpb24obUFNZWRpYUV4dHJhY3Rvcik7Ci19Ci0KLWJvb2wgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcjo6YWR2YW5jZSgpIHsKLSAgICBpZiAobUFNZWRpYUV4dHJhY3RvciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIEFNZWRpYUV4dHJhY3Rvcl9hZHZhbmNlKG1BTWVkaWFFeHRyYWN0b3IpOwotfQotCi1zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyOjpzZWVrVG8oaW50NjRfdCBzZWVrUG9zVXMsIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgbW9kZSkgewotICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwotICAgIH0KLQotICAgIFNlZWtNb2RlIGFNb2RlOwotICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgICBjYXNlIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19QUkVWSU9VU19TWU5DOiB7Ci0gICAgICAgICAgICBhTW9kZSA9IEFNRURJQUVYVFJBQ1RPUl9TRUVLX1BSRVZJT1VTX1NZTkM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U0VFS19ORVhUX1NZTkM6IHsKLSAgICAgICAgICAgIGFNb2RlID0gQU1FRElBRVhUUkFDVE9SX1NFRUtfTkVYVF9TWU5DOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgYU1vZGUgPSBBTUVESUFFWFRSQUNUT1JfU0VFS19DTE9TRVNUX1NZTkM7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQU1lZGlhRXh0cmFjdG9yX3NlZWtUbyhtQU1lZGlhRXh0cmFjdG9yLCBzZWVrUG9zVXMsIGFNb2RlKTsKLX0KLQotUHNzaEluZm8qIEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmdldFBzc2hJbmZvKCkgewotICAgIGlmIChtQU1lZGlhRXh0cmFjdG9yID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3JfZ2V0UHNzaEluZm8obUFNZWRpYUV4dHJhY3Rvcik7Ci19Ci0KLXNwPEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI+IEFNZWRpYUV4dHJhY3RvcldyYXBwZXI6OmdldFNhbXBsZUNyeXB0b0luZm8oKSB7Ci0gICAgaWYgKG1BTWVkaWFFeHRyYWN0b3IgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyKEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVDcnlwdG9JbmZvKG1BTWVkaWFFeHRyYWN0b3IpKTsKLX0KLQotc3NpemVfdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfZ2V0U2l6ZSh2b2lkICp1c2VyZGF0YSkgewotICAgIERhdGFTb3VyY2UgKnNvdXJjZSA9IHN0YXRpY19jYXN0PERhdGFTb3VyY2UgKj4odXNlcmRhdGEpOwotICAgIG9mZjY0X3Qgc2l6ZSA9IC0xOwotICAgIHNvdXJjZS0+Z2V0U2l6ZSgmc2l6ZSk7Ci0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLXNzaXplX3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyX3JlYWRBdCh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKiBidWYsIHNpemVfdCBzaXplKSB7Ci0gICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7Ci0gICAgcmV0dXJuIHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmLCBzaXplKTsKLX0KLQotdm9pZCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6QU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfY2xvc2Uodm9pZCAqdXNlcmRhdGEpIHsKLSAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKLSAgICBzb3VyY2UtPmNsb3NlKCk7Ci19Ci0KLUFNZWRpYURhdGFTb3VyY2VXcmFwcGVyOjpBTWVkaWFEYXRhU291cmNlV3JhcHBlcihjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSkKLSAgICA6IG1EYXRhU291cmNlKGRhdGFTb3VyY2UpLAotICAgICAgbUFNZWRpYURhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZV9uZXcoKSkgewotICAgIEFMT0dWKCJzZXREYXRhU291cmNlIChzb3VyY2U6ICVwKSIsIGRhdGFTb3VyY2UuZ2V0KCkpOwotICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0VXNlcmRhdGEobUFNZWRpYURhdGFTb3VyY2UsIGRhdGFTb3VyY2UuZ2V0KCkpOwotICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0KG1BTWVkaWFEYXRhU291cmNlLCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9yZWFkQXQpOwotICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0U2l6ZShtQU1lZGlhRGF0YVNvdXJjZSwgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfZ2V0U2l6ZSk7Ci0gICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRDbG9zZShtQU1lZGlhRGF0YVNvdXJjZSwgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfY2xvc2UpOwotfQotCi1BTWVkaWFEYXRhU291cmNlV3JhcHBlcjo6fkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKCkgewotICAgIGlmIChtQU1lZGlhRGF0YVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQU1lZGlhRGF0YVNvdXJjZV9kZWxldGUobUFNZWRpYURhdGFTb3VyY2UpOwotICAgIG1BTWVkaWFEYXRhU291cmNlID0gTlVMTDsKLX0KLQotQU1lZGlhRGF0YVNvdXJjZSogQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXI6OmdldEFNZWRpYURhdGFTb3VyY2UoKSB7Ci0gICAgcmV0dXJuIG1BTWVkaWFEYXRhU291cmNlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvVGltZUNoZWNrLmNwcCBiL21lZGlhL2xpYm1lZGlhL1RpbWVDaGVjay5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhYjVkNGYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvVGltZUNoZWNrLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0KLSNpbmNsdWRlIDxtZWRpYS9UaW1lQ2hlY2suaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKiBzdGF0aWMgKi8KLXNwPFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkPiBUaW1lQ2hlY2s6OmdldFRpbWVDaGVja1RocmVhZCgpCi17Ci0gICAgc3RhdGljIHNwPFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkPiBzVGltZUNoZWNrVGhyZWFkID0gbmV3IFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkKCk7Ci0gICAgcmV0dXJuIHNUaW1lQ2hlY2tUaHJlYWQ7Ci19Ci0KLVRpbWVDaGVjazo6VGltZUNoZWNrKGNvbnN0IGNoYXIgKnRhZywgdWludDMyX3QgdGltZW91dE1zKQotICAgIDogbUVuZFRpbWVOcyhnZXRUaW1lQ2hlY2tUaHJlYWQoKS0+c3RhcnRNb25pdG9yaW5nKHRhZywgdGltZW91dE1zKSkKLXsKLX0KLQotVGltZUNoZWNrOjp+VGltZUNoZWNrKCkgewotICAgIGdldFRpbWVDaGVja1RocmVhZCgpLT5zdG9wTW9uaXRvcmluZyhtRW5kVGltZU5zKTsKLX0KLQotVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6On5UaW1lQ2hlY2tUaHJlYWQoKQotewotICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOwotICAgIHJlcXVlc3RFeGl0KCk7Ci0gICAgbU1vbml0b3JSZXF1ZXN0cy5jbGVhcigpOwotICAgIG1Db25kLnNpZ25hbCgpOwotfQotCi1uc2Vjc190IFRpbWVDaGVjazo6VGltZUNoZWNrVGhyZWFkOjpzdGFydE1vbml0b3JpbmcoY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKLSAgICBuc2Vjc190IGVuZFRpbWVOcyA9IHN5c3RlbVRpbWUoKSArIG1pbGxpc2Vjb25kcyh0aW1lb3V0TXMpOwotICAgIGZvciAoOyBtTW9uaXRvclJlcXVlc3RzLmluZGV4T2ZLZXkoZW5kVGltZU5zKSA+PSAwOyArK2VuZFRpbWVOcyk7Ci0gICAgbU1vbml0b3JSZXF1ZXN0cy5hZGQoZW5kVGltZU5zLCB0YWcpOwotICAgIG1Db25kLnNpZ25hbCgpOwotICAgIHJldHVybiBlbmRUaW1lTnM7Ci19Ci0KLXZvaWQgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnN0b3BNb25pdG9yaW5nKG5zZWNzX3QgZW5kVGltZU5zKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1NdXRleCk7Ci0gICAgbU1vbml0b3JSZXF1ZXN0cy5yZW1vdmVJdGVtKGVuZFRpbWVOcyk7Ci0gICAgbUNvbmQuc2lnbmFsKCk7Ci19Ci0KLWJvb2wgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnRocmVhZExvb3AoKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IFRJTUVEX09VVDsKLSAgICBjb25zdCBjaGFyICp0YWc7Ci0gICAgewotICAgICAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKLQotICAgICAgICBpZiAoZXhpdFBlbmRpbmcoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgbnNlY3NfdCBlbmRUaW1lTnMgPSBJTlQ2NF9NQVg7Ci0gICAgICAgIC8vIEtleWVkVmVjdG9yIG1Nb25pdG9yUmVxdWVzdHMgaXMgb3JkZXJlZCBzbyB0YWtlIGZpcnN0IGVudHJ5IGFzIG5leHQgdGltZW91dAotICAgICAgICBpZiAobU1vbml0b3JSZXF1ZXN0cy5zaXplKCkgIT0gMCkgewotICAgICAgICAgICAgZW5kVGltZU5zID0gbU1vbml0b3JSZXF1ZXN0cy5rZXlBdCgwKTsKLSAgICAgICAgICAgIHRhZyA9IG1Nb25pdG9yUmVxdWVzdHMudmFsdWVBdCgwKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IG5zZWNzX3Qgd2FpdFRpbWVOcyA9IGVuZFRpbWVOcyAtIHN5c3RlbVRpbWUoKTsKLSAgICAgICAgaWYgKHdhaXRUaW1lTnMgPiAwKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBtQ29uZC53YWl0UmVsYXRpdmUobU11dGV4LCB3YWl0VGltZU5zKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgIlRpbWVDaGVjayB0aW1lb3V0IGZvciAlcyIsIHRhZyk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9UeXBlQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL1R5cGVDb252ZXJ0ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmRlZjAyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL1R5cGVDb252ZXJ0ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDUxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLSNkZWZpbmUgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKHN0cmluZykgeyAjc3RyaW5nLCBzdHJpbmcgfQotI2RlZmluZSBURVJNSU5BVE9SIHsgLmxpdGVyYWwgPSBudWxscHRyIH0KLQotdGVtcGxhdGUgPD4KLWNvbnN0IE91dHB1dERldmljZUNvbnZlcnRlcjo6VGFibGUgT3V0cHV0RGV2aWNlQ29udmVydGVyOjptVGFibGVbXSA9IHsKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX05PTkUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURQSE9ORSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19IRUFEU0VUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQUxMX1NDTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFApLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfSERNSSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0RHVExfRE9DS19IRUFEU0VUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTExfVVNCKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFgpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0xJTkUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9TUERJRiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfRk0pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9JUCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQlVTKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9QUk9YWSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9FQ0hPX0NBTkNFTExFUiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfREVGQVVMVCksCi0gICAgLy8gU1RVQiBtdXN0IGJlIGFmdGVyIERFRkFVTFQsIHNvIHRoZSBsYXR0ZXIgaXMgcGlja2VkIHVwIGJ5IHRvU3RyaW5nIGZpcnN0LgotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1NUVUIpLAotICAgIFRFUk1JTkFUT1IKLX07Ci0KLXRlbXBsYXRlIDw+Ci1jb25zdCBJbnB1dERldmljZUNvbnZlcnRlcjo6VGFibGUgSW5wdXREZXZpY2VDb252ZXJ0ZXI6Om1UYWJsZVtdID0gewotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfTk9ORSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9DT01NVU5JQ0FUSU9OKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0FNQklFTlQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0FMTF9TQ08pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9BVVhfRElHSVRBTCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9IRE1JKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1RFTEVQSE9OWV9SWCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQU5MR19ET0NLX0hFQURTRVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fREdUTF9ET0NLX0hFQURTRVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fVVNCX0FDQ0VTU09SWSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0FMTF9VU0IpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fVFZfVFVORVIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fTElORSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9TUERJRiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfQTJEUCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9MT09QQkFDSyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9JUCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9CVVMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fUFJPWFkpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fREVGQVVMVCksCi0gICAgLy8gU1RVQiBtdXN0IGJlIGFmdGVyIERFRkFVTFQsIHNvIHRoZSBsYXR0ZXIgaXMgcGlja2VkIHVwIGJ5IHRvU3RyaW5nIGZpcnN0LgotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fU1RVQiksCi0gICAgVEVSTUlOQVRPUgotfTsKLQotCi10ZW1wbGF0ZSA8PgotY29uc3QgT3V0cHV0RmxhZ0NvbnZlcnRlcjo6VGFibGUgT3V0cHV0RmxhZ0NvbnZlcnRlcjo6bVRhYmxlW10gPSB7Ci0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX05PTkUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19UVFMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19SQVcpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19TWU5DKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfSUVDOTU4X05PTkFVRElPKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUX1BDTSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfSU5DQUxMX01VU0lDKSwKLSAgICBURVJNSU5BVE9SCi19OwotCi0KLXRlbXBsYXRlIDw+Ci1jb25zdCBJbnB1dEZsYWdDb252ZXJ0ZXI6OlRhYmxlIElucHV0RmxhZ0NvbnZlcnRlcjo6bVRhYmxlW10gPSB7Ci0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfTk9ORSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfRkFTVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfSFdfSE9UV09SRCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfUkFXKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19TWU5DKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19WT0lQX1RYKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DKSwKLSAgICBURVJNSU5BVE9SCi19OwotCi0KLXRlbXBsYXRlIDw+Ci1jb25zdCBGb3JtYXRDb252ZXJ0ZXI6OlRhYmxlIEZvcm1hdENvbnZlcnRlcjo6bVRhYmxlW10gPSB7Ci0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX1BDTV84X0JJVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9QQ01fMzJfQklUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTVAzKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FNUl9OQiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BTVJfV0IpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19NQUlOKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfU1NSKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MVFApLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0hFX1YxKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19TQ0FMQUJMRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfRVJMQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfTEQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0hFX1YyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19FTEQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX1hIRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19NQUlOKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX0xDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX1NTUiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19MVFApLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfSEVfVjEpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfU0NBTEFCTEUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfRVJMQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19MRCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19IRV9WMiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19FTEQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfWEhFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX1ZPUkJJUyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9IRV9BQUNfVjEpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfSEVfQUFDX1YyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX09QVVMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUMzKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0VfQUMzKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0RUUyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9EVFNfSEQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfSUVDNjE5MzcpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRE9MQllfVFJVRUhEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0VWUkMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRVZSQ0IpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRVZSQ1dCKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0VWUkNOVyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURJRiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9XTUEpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfV01BX1BSTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BTVJfV0JfUExVUyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9NUDIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfUUNFTFApLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRFNEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0ZMQUMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUxBQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BUEUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfU0JDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FQVFgpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQVBUWF9IRCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQzQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTERBQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9NQVQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRV9BQzNfSk9DKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX01BVF8xXzApLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTUFUXzJfMCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9NQVRfMl8xKSwKLSAgICBURVJNSU5BVE9SCi19OwotCi0KLXRlbXBsYXRlIDw+Ci1jb25zdCBPdXRwdXRDaGFubmVsQ29udmVydGVyOjpUYWJsZSBPdXRwdXRDaGFubmVsQ29udmVydGVyOjptVGFibGVbXSA9IHsKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDEpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF8yUE9JTlQwUE9JTlQyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMVBPSU5UMiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1RSSSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1RSSV9CQUNLKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDBQT0lOVDIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfUVVBRCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1FVQURfQkFDSyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1FVQURfU0lERSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1NVUlJPVU5EKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfUEVOVEEpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF81UE9JTlQxKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9CQUNLKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMV9TSURFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMVBPSU5UMiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDFQT0lOVDQpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF82UE9JTlQxKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDFQT0lOVDIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxUE9JTlQ0KSwKLSAgICBURVJNSU5BVE9SCi19OwotCi0KLXRlbXBsYXRlIDw+Ci1jb25zdCBJbnB1dENoYW5uZWxDb252ZXJ0ZXI6OlRhYmxlIElucHV0Q2hhbm5lbENvbnZlcnRlcjo6bVRhYmxlW10gPSB7Ci0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fTU9OTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl82KSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl8yUE9JTlQwUE9JTlQyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl8yUE9JTlQxUE9JTlQyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl8zUE9JTlQwUE9JTlQyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl8zUE9JTlQxUE9JTlQyKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl81UE9JTlQxKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTktfTU9OTyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfRE5MSU5LX01PTk8pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0NBTExfTU9OTyksCi0gICAgVEVSTUlOQVRPUgotfTsKLQotdGVtcGxhdGUgPD4KLWNvbnN0IENoYW5uZWxJbmRleENvbnZlcnRlcjo6VGFibGUgQ2hhbm5lbEluZGV4Q29udmVydGVyOjptVGFibGVbXSA9IHsKLSAgICB7IkFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xIiwgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18xKX0sCi0gICAgeyJBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMiIsIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMil9LAotICAgIHsiQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzMiLCBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzMpfSwKLSAgICB7IkFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS180Iiwgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS180KX0sCi0gICAgeyJBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNSIsIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNSl9LAotICAgIHsiQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzYiLCBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzYpfSwKLSAgICB7IkFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS183Iiwgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS183KX0sCi0gICAgeyJBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOCIsIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihBVURJT19DSEFOTkVMX0lOREVYX01BU0tfOCl9LAotICAgIFRFUk1JTkFUT1IKLX07Ci0KLQotdGVtcGxhdGUgPD4KLWNvbnN0IEdhaW5Nb2RlQ29udmVydGVyOjpUYWJsZSBHYWluTW9kZUNvbnZlcnRlcjo6bVRhYmxlW10gPSB7Ci0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0dBSU5fTU9ERV9KT0lOVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0dBSU5fTU9ERV9SQU1QKSwKLSAgICBURVJNSU5BVE9SCi19OwotCi0KLXRlbXBsYXRlIDw+Ci1jb25zdCBTdHJlYW1UeXBlQ29udmVydGVyOjpUYWJsZSBTdHJlYW1UeXBlQ29udmVydGVyOjptVGFibGVbXSA9IHsKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fU1lTVEVNKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX1JJTkcpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fTVVTSUMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fQUxBUk0pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08gKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fRFRNRiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9UVFMpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9SRVJPVVRJTkcpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fUEFUQ0gpLAotICAgIFRFUk1JTkFUT1IKLX07Ci0KLXRlbXBsYXRlPD4KLWNvbnN0IEF1ZGlvTW9kZUNvbnZlcnRlcjo6VGFibGUgQXVkaW9Nb2RlQ29udmVydGVyOjptVGFibGVbXSA9IHsKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fTU9ERV9JTlZBTElEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fTU9ERV9DVVJSRU5UKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fTU9ERV9OT1JNQUwpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19NT0RFX1JJTkdUT05FKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fTU9ERV9JTl9DQUxMKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fTU9ERV9JTl9DT01NVU5JQ0FUSU9OKSwKLSAgICBURVJNSU5BVE9SCi19OwotCi10ZW1wbGF0ZTw+Ci1jb25zdCBBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOjpUYWJsZSBBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOjptVGFibGVbXSA9IHsKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DT05URU5UX1RZUEVfU1BFRUNIKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ09OVEVOVF9UWVBFX01VU0lDKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ09OVEVOVF9UWVBFX01PVklFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ09OVEVOVF9UWVBFX1NPTklGSUNBVElPTiksCi0gICAgVEVSTUlOQVRPUgotfTsKLQotdGVtcGxhdGUgPD4KLWNvbnN0IFVzYWdlVHlwZUNvbnZlcnRlcjo6VGFibGUgVXNhZ2VUeXBlQ29udmVydGVyOjptVGFibGVbXSA9IHsKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfVU5LTk9XTiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX01FRElBKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX0FMQVJNKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1QpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfR0FNRSksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfQVNTSVNUQU5UKSwKLSAgICBURVJNSU5BVE9SCi19OwotCi10ZW1wbGF0ZSA8PgotY29uc3QgU291cmNlVHlwZUNvbnZlcnRlcjo6VGFibGUgU291cmNlVHlwZUNvbnZlcnRlcjo6bVRhYmxlW10gPSB7Ci0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9ERUZBVUxUKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX01JQyksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTkspLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTkspLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTCksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9DQU1DT1JERVIpLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pLAotICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiksCi0gICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX0ZNX1RVTkVSKSwKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX0hPVFdPUkQpLAotICAgIFRFUk1JTkFUT1IKLX07Ci0KLXRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8T3V0cHV0RGV2aWNlVHJhaXRzPjsKLXRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8SW5wdXREZXZpY2VUcmFpdHM+OwotdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxPdXRwdXRGbGFnVHJhaXRzPjsKLXRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8SW5wdXRGbGFnVHJhaXRzPjsKLXRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8Rm9ybWF0VHJhaXRzPjsKLXRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8T3V0cHV0Q2hhbm5lbFRyYWl0cz47Ci10ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPElucHV0Q2hhbm5lbFRyYWl0cz47Ci10ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPENoYW5uZWxJbmRleFRyYWl0cz47Ci10ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPEdhaW5Nb2RlVHJhaXRzPjsKLXRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8U3RyZWFtVHJhaXRzPjsKLXRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8QXVkaW9Nb2RlVHJhaXRzPjsKLXRlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8VXNhZ2VUcmFpdHM+OwotdGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxTb3VyY2VUcmFpdHM+OwotCi1ib29sIGRldmljZUZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGxpdGVyYWxEZXZpY2UsIGF1ZGlvX2RldmljZXNfdCYgZGV2aWNlKSB7Ci0gICAgcmV0dXJuIElucHV0RGV2aWNlQ29udmVydGVyOjpmcm9tU3RyaW5nKGxpdGVyYWxEZXZpY2UsIGRldmljZSkgfHwKLSAgICAgICAgICAgIE91dHB1dERldmljZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhsaXRlcmFsRGV2aWNlLCBkZXZpY2UpOwotfQotCi1ib29sIGRldmljZVRvU3RyaW5nKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHN0ZDo6c3RyaW5nJiBsaXRlcmFsRGV2aWNlKSB7Ci0gICAgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9CSVRfSU4pIHsKLSAgICAgICAgcmV0dXJuIElucHV0RGV2aWNlQ29udmVydGVyOjp0b1N0cmluZyhkZXZpY2UsIGxpdGVyYWxEZXZpY2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OnRvU3RyaW5nKGRldmljZSwgbGl0ZXJhbERldmljZSk7Ci0gICAgfQotfQotCi1TYW1wbGVSYXRlVHJhaXRzOjpDb2xsZWN0aW9uIHNhbXBsaW5nUmF0ZXNGcm9tU3RyaW5nKAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc2FtcGxpbmdSYXRlcywgY29uc3QgY2hhciAqZGVsKQotewotICAgIFNhbXBsZVJhdGVUcmFpdHM6OkNvbGxlY3Rpb24gc2FtcGxpbmdSYXRlQ29sbGVjdGlvbjsKLSAgICBjb2xsZWN0aW9uRnJvbVN0cmluZzxTYW1wbGVSYXRlVHJhaXRzPihzYW1wbGluZ1JhdGVzLCBzYW1wbGluZ1JhdGVDb2xsZWN0aW9uLCBkZWwpOwotICAgIHJldHVybiBzYW1wbGluZ1JhdGVDb2xsZWN0aW9uOwotfQotCi1Gb3JtYXRUcmFpdHM6OkNvbGxlY3Rpb24gZm9ybWF0c0Zyb21TdHJpbmcoCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmb3JtYXRzLCBjb25zdCBjaGFyICpkZWwpCi17Ci0gICAgRm9ybWF0VHJhaXRzOjpDb2xsZWN0aW9uIGZvcm1hdENvbGxlY3Rpb247Ci0gICAgRm9ybWF0Q29udmVydGVyOjpjb2xsZWN0aW9uRnJvbVN0cmluZyhmb3JtYXRzLCBmb3JtYXRDb2xsZWN0aW9uLCBkZWwpOwotICAgIHJldHVybiBmb3JtYXRDb2xsZWN0aW9uOwotfQotCi1hdWRpb19mb3JtYXRfdCBmb3JtYXRGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZsaXRlcmFsRm9ybWF0LCBhdWRpb19mb3JtYXRfdCBkZWZhdWx0Rm9ybWF0KQotewotICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdDsKLSAgICBpZiAobGl0ZXJhbEZvcm1hdC5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0Rm9ybWF0OwotICAgIH0KLSAgICBGb3JtYXRDb252ZXJ0ZXI6OmZyb21TdHJpbmcobGl0ZXJhbEZvcm1hdCwgZm9ybWF0KTsKLSAgICByZXR1cm4gZm9ybWF0OwotfQotCi1hdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFza0Zyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJmxpdGVyYWxDaGFubmVscykKLXsKLSAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsczsKLSAgICBpZiAoIU91dHB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcobGl0ZXJhbENoYW5uZWxzLCBjaGFubmVscykgJiYKLSAgICAgICAgICAgICFJbnB1dENoYW5uZWxDb252ZXJ0ZXI6OmZyb21TdHJpbmcobGl0ZXJhbENoYW5uZWxzLCBjaGFubmVscykpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX0NIQU5ORUxfSU5WQUxJRDsKLSAgICB9Ci0gICAgcmV0dXJuIGNoYW5uZWxzOwotfQotCi1DaGFubmVsVHJhaXRzOjpDb2xsZWN0aW9uIGNoYW5uZWxNYXNrc0Zyb21TdHJpbmcoCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZjaGFubmVscywgY29uc3QgY2hhciAqZGVsKQotewotICAgIENoYW5uZWxUcmFpdHM6OkNvbGxlY3Rpb24gY2hhbm5lbE1hc2tDb2xsZWN0aW9uOwotICAgIE91dHB1dENoYW5uZWxDb252ZXJ0ZXI6OmNvbGxlY3Rpb25Gcm9tU3RyaW5nKGNoYW5uZWxzLCBjaGFubmVsTWFza0NvbGxlY3Rpb24sIGRlbCk7Ci0gICAgSW5wdXRDaGFubmVsQ29udmVydGVyOjpjb2xsZWN0aW9uRnJvbVN0cmluZyhjaGFubmVscywgY2hhbm5lbE1hc2tDb2xsZWN0aW9uLCBkZWwpOwotICAgIENoYW5uZWxJbmRleENvbnZlcnRlcjo6Y29sbGVjdGlvbkZyb21TdHJpbmcoY2hhbm5lbHMsIGNoYW5uZWxNYXNrQ29sbGVjdGlvbiwgZGVsKTsKLSAgICByZXR1cm4gY2hhbm5lbE1hc2tDb2xsZWN0aW9uOwotfQotCi1JbnB1dENoYW5uZWxUcmFpdHM6OkNvbGxlY3Rpb24gaW5wdXRDaGFubmVsTWFza3NGcm9tU3RyaW5nKAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaW5DaGFubmVscywgY29uc3QgY2hhciAqZGVsKQotewotICAgIElucHV0Q2hhbm5lbFRyYWl0czo6Q29sbGVjdGlvbiBpbnB1dENoYW5uZWxNYXNrQ29sbGVjdGlvbjsKLSAgICBJbnB1dENoYW5uZWxDb252ZXJ0ZXI6OmNvbGxlY3Rpb25Gcm9tU3RyaW5nKGluQ2hhbm5lbHMsIGlucHV0Q2hhbm5lbE1hc2tDb2xsZWN0aW9uLCBkZWwpOwotICAgIENoYW5uZWxJbmRleENvbnZlcnRlcjo6Y29sbGVjdGlvbkZyb21TdHJpbmcoaW5DaGFubmVscywgaW5wdXRDaGFubmVsTWFza0NvbGxlY3Rpb24sIGRlbCk7Ci0gICAgcmV0dXJuIGlucHV0Q2hhbm5lbE1hc2tDb2xsZWN0aW9uOwotfQotCi1PdXRwdXRDaGFubmVsVHJhaXRzOjpDb2xsZWN0aW9uIG91dHB1dENoYW5uZWxNYXNrc0Zyb21TdHJpbmcoCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZvdXRDaGFubmVscywgY29uc3QgY2hhciAqZGVsKQotewotICAgIE91dHB1dENoYW5uZWxUcmFpdHM6OkNvbGxlY3Rpb24gb3V0cHV0Q2hhbm5lbE1hc2tDb2xsZWN0aW9uOwotICAgIE91dHB1dENoYW5uZWxDb252ZXJ0ZXI6OmNvbGxlY3Rpb25Gcm9tU3RyaW5nKG91dENoYW5uZWxzLCBvdXRwdXRDaGFubmVsTWFza0NvbGxlY3Rpb24sIGRlbCk7Ci0gICAgQ2hhbm5lbEluZGV4Q29udmVydGVyOjpjb2xsZWN0aW9uRnJvbVN0cmluZyhvdXRDaGFubmVscywgb3V0cHV0Q2hhbm5lbE1hc2tDb2xsZWN0aW9uLCBkZWwpOwotICAgIHJldHVybiBvdXRwdXRDaGFubmVsTWFza0NvbGxlY3Rpb247Ci19Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9WaXN1YWxpemVyLmNwcCBiL21lZGlhL2xpYm1lZGlhL1Zpc3VhbGl6ZXIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjhkMzc1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL1Zpc3VhbGl6ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNDQyICswLDAgQEAKLS8qCi0qKgotKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJWaXN1YWxpemVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8bGltaXRzLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9WaXN1YWxpemVyLmg+Ci0jaW5jbHVkZSA8YXVkaW9fdXRpbHMvZml4ZWRmZnQuaD4KLSNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVmlzdWFsaXplcjo6VmlzdWFsaXplciAoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCi0gICAgICAgICBpbnQzMl90IHByaW9yaXR5LAotICAgICAgICAgZWZmZWN0X2NhbGxiYWNrX3QgY2JmLAotICAgICAgICAgdm9pZCogdXNlciwKLSAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpCi0gICAgOiAgIEF1ZGlvRWZmZWN0KFNMX0lJRF9WSVNVQUxJWkFUSU9OLCBvcFBhY2thZ2VOYW1lLCBOVUxMLCBwcmlvcml0eSwgY2JmLCB1c2VyLCBzZXNzaW9uSWQpLAotICAgICAgICBtQ2FwdHVyZVJhdGUoQ0FQVFVSRV9SQVRFX0RFRiksCi0gICAgICAgIG1DYXB0dXJlU2l6ZShDQVBUVVJFX1NJWkVfREVGKSwKLSAgICAgICAgbVNhbXBsZVJhdGUoNDQxMDAwMDApLAotICAgICAgICBtU2NhbGluZ01vZGUoVklTVUFMSVpFUl9TQ0FMSU5HX01PREVfTk9STUFMSVpFRCksCi0gICAgICAgIG1NZWFzdXJlbWVudE1vZGUoTUVBU1VSRU1FTlRfTU9ERV9OT05FKSwKLSAgICAgICAgbUNhcHR1cmVDYWxsQmFjayhOVUxMKSwKLSAgICAgICAgbUNhcHR1cmVDYmtVc2VyKE5VTEwpCi17Ci0gICAgaW5pdENhcHR1cmVTaXplKCk7Ci19Ci0KLVZpc3VhbGl6ZXI6On5WaXN1YWxpemVyKCkKLXsKLSAgICBBTE9HVigiVmlzdWFsaXplcjo6flZpc3VhbGl6ZXIoKSIpOwotICAgIHNldEVuYWJsZWQoZmFsc2UpOwotICAgIHNldENhcHR1cmVDYWxsQmFjayhOVUxMLCBOVUxMLCAwLCAwKTsKLX0KLQotdm9pZCBWaXN1YWxpemVyOjpyZWxlYXNlKCkKLXsKLSAgICBBTE9HVigiVmlzdWFsaXplcjo6cmVsZWFzZSgpIik7Ci0gICAgc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYXB0dXJlTG9jayk7Ci0KLSAgICBtQ2FwdHVyZVRocmVhZC5jbGVhcigpOwotICAgIG1DYXB0dXJlQ2FsbEJhY2sgPSBOVUxMOwotICAgIG1DYXB0dXJlQ2JrVXNlciA9IE5VTEw7Ci0gICAgbUNhcHR1cmVGbGFncyA9IDA7Ci0gICAgbUNhcHR1cmVSYXRlID0gMDsKLX0KLQotc3RhdHVzX3QgVmlzdWFsaXplcjo6c2V0RW5hYmxlZChib29sIGVuYWJsZWQpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1DYXB0dXJlTG9jayk7Ci0KLSAgICBzcDxDYXB0dXJlVGhyZWFkPiB0ID0gbUNhcHR1cmVUaHJlYWQ7Ci0gICAgaWYgKHQgIT0gMCkgewotICAgICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICAgICAgaWYgKHQtPmV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAodC0+cmVxdWVzdEV4aXRBbmRXYWl0KCkgPT0gV09VTERfQkxPQ0spIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlZpc3VhbGl6ZXI6OmVuYWJsZSgpIGNhbGxlZCBmcm9tIHRocmVhZCIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHQtPm1Mb2NrLmxvY2soKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBBdWRpb0VmZmVjdDo6c2V0RW5hYmxlZChlbmFibGVkKTsKLQotICAgIGlmICh0ICE9IDApIHsKLSAgICAgICAgaWYgKGVuYWJsZWQgJiYgc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICB0LT5ydW4oIlZpc3VhbGl6ZXIiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHQtPnJlcXVlc3RFeGl0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodCAhPSAwKSB7Ci0gICAgICAgIHQtPm1Mb2NrLnVubG9jaygpOwotICAgIH0KLQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFZpc3VhbGl6ZXI6OnNldENhcHR1cmVDYWxsQmFjayhjYXB0dXJlX2Nia190IGNiaywgdm9pZCogdXNlciwgdWludDMyX3QgZmxhZ3MsCi0gICAgICAgIHVpbnQzMl90IHJhdGUpCi17Ci0gICAgaWYgKHJhdGUgPiBDQVBUVVJFX1JBVEVfTUFYKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FwdHVyZUxvY2spOwotCi0gICAgaWYgKG1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBpZiAobUNhcHR1cmVUaHJlYWQgIT0gMCkgewotICAgICAgICBtQ2FwdHVyZUxvY2sudW5sb2NrKCk7Ci0gICAgICAgIG1DYXB0dXJlVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKLSAgICAgICAgbUNhcHR1cmVMb2NrLmxvY2soKTsKLSAgICB9Ci0KLSAgICBtQ2FwdHVyZVRocmVhZC5jbGVhcigpOwotICAgIG1DYXB0dXJlQ2FsbEJhY2sgPSBjYms7Ci0gICAgbUNhcHR1cmVDYmtVc2VyID0gdXNlcjsKLSAgICBtQ2FwdHVyZUZsYWdzID0gZmxhZ3M7Ci0gICAgbUNhcHR1cmVSYXRlID0gcmF0ZTsKLQotICAgIGlmIChjYmsgIT0gTlVMTCkgewotICAgICAgICBtQ2FwdHVyZVRocmVhZCA9IG5ldyBDYXB0dXJlVGhyZWFkKHRoaXMsIHJhdGUsICgoZmxhZ3MgJiBDQVBUVVJFX0NBTExfSkFWQSkgIT0gMCkpOwotICAgIH0KLSAgICBBTE9HVigic2V0Q2FwdHVyZUNhbGxCYWNrKCkgcmF0ZTogJWQgdGhyZWFkICVwIGZsYWdzIDB4JTA4eCIsCi0gICAgICAgICAgICByYXRlLCBtQ2FwdHVyZVRocmVhZC5nZXQoKSwgbUNhcHR1cmVGbGFncyk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBWaXN1YWxpemVyOjpzZXRDYXB0dXJlU2l6ZSh1aW50MzJfdCBzaXplKQotewotICAgIGlmIChzaXplID4gVklTVUFMSVpFUl9DQVBUVVJFX1NJWkVfTUFYIHx8Ci0gICAgICAgIHNpemUgPCBWSVNVQUxJWkVSX0NBUFRVUkVfU0laRV9NSU4gfHwKLSAgICAgICAgcG9wY291bnQoc2l6ZSkgIT0gMSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FwdHVyZUxvY2spOwotICAgIGlmIChtRW5hYmxlZCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgdWludDMyX3QgYnVmMzJbc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSAvIHNpemVvZih1aW50MzJfdCkgKyAyXTsKLSAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKWJ1ZjMyOwotCi0gICAgcC0+cHNpemUgPSBzaXplb2YodWludDMyX3QpOwotICAgIHAtPnZzaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKLSAgICAqKGludDMyX3QgKilwLT5kYXRhID0gVklTVUFMSVpFUl9QQVJBTV9DQVBUVVJFX1NJWkU7Ci0gICAgKigoaW50MzJfdCAqKXAtPmRhdGEgKyAxKT0gc2l6ZTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRQYXJhbWV0ZXIocCk7Ci0KLSAgICBBTE9HVigic2V0Q2FwdHVyZVNpemUgc2l6ZSAlZCAgc3RhdHVzICVkIHAtPnN0YXR1cyAlZCIsIHNpemUsIHN0YXR1cywgcC0+c3RhdHVzKTsKLQotICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgc3RhdHVzID0gcC0+c3RhdHVzOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtQ2FwdHVyZVNpemUgPSBzaXplOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgVmlzdWFsaXplcjo6c2V0U2NhbGluZ01vZGUodWludDMyX3QgbW9kZSkgewotICAgIGlmICgobW9kZSAhPSBWSVNVQUxJWkVSX1NDQUxJTkdfTU9ERV9OT1JNQUxJWkVEKQotICAgICAgICAgICAgJiYgKG1vZGUgIT0gVklTVUFMSVpFUl9TQ0FMSU5HX01PREVfQVNfUExBWUVEKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FwdHVyZUxvY2spOwotCi0gICAgdWludDMyX3QgYnVmMzJbc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSAvIHNpemVvZih1aW50MzJfdCkgKyAyXTsKLSAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKWJ1ZjMyOwotCi0gICAgcC0+cHNpemUgPSBzaXplb2YodWludDMyX3QpOwotICAgIHAtPnZzaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKLSAgICAqKGludDMyX3QgKilwLT5kYXRhID0gVklTVUFMSVpFUl9QQVJBTV9TQ0FMSU5HX01PREU7Ci0gICAgKigoaW50MzJfdCAqKXAtPmRhdGEgKyAxKT0gbW9kZTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXRQYXJhbWV0ZXIocCk7Ci0KLSAgICBBTE9HVigic2V0U2NhbGluZ01vZGUgbW9kZSAlZCAgc3RhdHVzICVkIHAtPnN0YXR1cyAlZCIsIG1vZGUsIHN0YXR1cywgcC0+c3RhdHVzKTsKLQotICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgc3RhdHVzID0gcC0+c3RhdHVzOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtU2NhbGluZ01vZGUgPSBtb2RlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgVmlzdWFsaXplcjo6c2V0TWVhc3VyZW1lbnRNb2RlKHVpbnQzMl90IG1vZGUpIHsKLSAgICBpZiAoKG1vZGUgIT0gTUVBU1VSRU1FTlRfTU9ERV9OT05FKQotICAgICAgICAgICAgLy9Ob3RlOiBuZWVkcyB0byBiZSBoYW5kbGVkIGFzIGEgbWFzayB3aGVuIG1vcmUgbWVhc3VyZW1lbnQgbW9kZXMgYXJlIGFkZGVkCi0gICAgICAgICAgICAmJiAoKG1vZGUgJiBNRUFTVVJFTUVOVF9NT0RFX1BFQUtfUk1TKSAhPSBtb2RlKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtQ2FwdHVyZUxvY2spOwotCi0gICAgdWludDMyX3QgYnVmMzJbc2l6ZW9mKGVmZmVjdF9wYXJhbV90KSAvIHNpemVvZih1aW50MzJfdCkgKyAyXTsKLSAgICBlZmZlY3RfcGFyYW1fdCAqcCA9IChlZmZlY3RfcGFyYW1fdCAqKWJ1ZjMyOwotCi0gICAgcC0+cHNpemUgPSBzaXplb2YodWludDMyX3QpOwotICAgIHAtPnZzaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKLSAgICAqKGludDMyX3QgKilwLT5kYXRhID0gVklTVUFMSVpFUl9QQVJBTV9NRUFTVVJFTUVOVF9NT0RFOwotICAgICooKGludDMyX3QgKilwLT5kYXRhICsgMSk9IG1vZGU7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0UGFyYW1ldGVyKHApOwotCi0gICAgQUxPR1YoInNldE1lYXN1cmVtZW50TW9kZSBtb2RlICVkICBzdGF0dXMgJWQgcC0+c3RhdHVzICVkIiwgbW9kZSwgc3RhdHVzLCBwLT5zdGF0dXMpOwotCi0gICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBzdGF0dXMgPSBwLT5zdGF0dXM7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1NZWFzdXJlbWVudE1vZGUgPSBtb2RlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFZpc3VhbGl6ZXI6OmdldEludE1lYXN1cmVtZW50cyh1aW50MzJfdCB0eXBlLCB1aW50MzJfdCBudW1iZXIsIGludDMyX3QgKm1lYXN1cmVtZW50cykgewotICAgIGlmIChtTWVhc3VyZW1lbnRNb2RlID09IE1FQVNVUkVNRU5UX01PREVfTk9ORSkgewotICAgICAgICBBTE9HRSgiQ2Fubm90IHJldHJpZXZlIGludCBtZWFzdXJlbWVudHMsIG5vIG1lYXN1cmVtZW50IG1vZGUgc2V0Iik7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgaWYgKCEobU1lYXN1cmVtZW50TW9kZSAmIHR5cGUpKSB7Ci0gICAgICAgIC8vIG1lYXN1cmVtZW50IHR5cGUgaGFzIG5vdCBiZWVuIHNldCBvbiB0aGlzIFZpc3VhbGl6ZXIKLSAgICAgICAgQUxPR0UoIkNhbm5vdCByZXRyaWV2ZSBpbnQgbWVhc3VyZW1lbnRzLCByZXF1ZXN0ZWQgbWVhc3VyZW1lbnQgbW9kZSAweCV4IG5vdCBzZXQoMHgleCkiLAotICAgICAgICAgICAgICAgIHR5cGUsIG1NZWFzdXJlbWVudE1vZGUpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIC8vIG9ubHkgcGVhaytSTVMgbWVhc3VyZW1lbnQgc3VwcG9ydGVkCi0gICAgaWYgKCh0eXBlICE9IE1FQVNVUkVNRU5UX01PREVfUEVBS19STVMpCi0gICAgICAgICAgICAvLyBmb3IgcGVhaytSTVMgbWVhc3VyZW1lbnQsIHRoZSByZXN1bHRzIGFyZSAyIGludDMyX3QgdmFsdWVzCi0gICAgICAgICAgICB8fCAobnVtYmVyICE9IDIpKSB7Ci0gICAgICAgIEFMT0dFKCJDYW5ub3QgcmV0cmlldmUgaW50IG1lYXN1cmVtZW50cywgTUVBU1VSRU1FTlRfTU9ERV9QRUFLX1JNUyByZXR1cm5zIDIgaW50cywgbm90ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgaWYgKG1FbmFibGVkKSB7Ci0gICAgICAgIHVpbnQzMl90IHJlcGx5U2l6ZSA9IG51bWJlciAqIHNpemVvZihpbnQzMl90KTsKLSAgICAgICAgc3RhdHVzID0gY29tbWFuZChWSVNVQUxJWkVSX0NNRF9NRUFTVVJFLAotICAgICAgICAgICAgICAgIHNpemVvZih1aW50MzJfdCkgIC8qY21kU2l6ZSovLAotICAgICAgICAgICAgICAgICZ0eXBlIC8qY21kRGF0YSovLAotICAgICAgICAgICAgICAgICZyZXBseVNpemUsIG1lYXN1cmVtZW50cyk7Ci0gICAgICAgIEFMT0dWKCJnZXRNZWFzdXJlbWVudHMoKSBjb21tYW5kIHJldHVybmVkICVkIiwgc3RhdHVzKTsKLSAgICAgICAgaWYgKChzdGF0dXMgPT0gTk9fRVJST1IpICYmIChyZXBseVNpemUgPT0gMCkpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJnZXRNZWFzdXJlbWVudHMoKSBkaXNhYmxlZCIpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFZpc3VhbGl6ZXI6OmdldFdhdmVGb3JtKHVpbnQ4X3QgKndhdmVmb3JtKQotewotICAgIGlmICh3YXZlZm9ybSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGlmIChtQ2FwdHVyZVNpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBpZiAobUVuYWJsZWQpIHsKLSAgICAgICAgdWludDMyX3QgcmVwbHlTaXplID0gbUNhcHR1cmVTaXplOwotICAgICAgICBzdGF0dXMgPSBjb21tYW5kKFZJU1VBTElaRVJfQ01EX0NBUFRVUkUsIDAsIE5VTEwsICZyZXBseVNpemUsIHdhdmVmb3JtKTsKLSAgICAgICAgQUxPR1YoImdldFdhdmVGb3JtKCkgY29tbWFuZCByZXR1cm5lZCAlZCIsIHN0YXR1cyk7Ci0gICAgICAgIGlmICgoc3RhdHVzID09IE5PX0VSUk9SKSAmJiAocmVwbHlTaXplID09IDApKSB7Ci0gICAgICAgICAgICBzdGF0dXMgPSBOT1RfRU5PVUdIX0RBVEE7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiZ2V0V2F2ZUZvcm0oKSBkaXNhYmxlZCIpOwotICAgICAgICBtZW1zZXQod2F2ZWZvcm0sIDB4ODAsIG1DYXB0dXJlU2l6ZSk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IFZpc3VhbGl6ZXI6OmdldEZmdCh1aW50OF90ICpmZnQpCi17Ci0gICAgaWYgKGZmdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGlmIChtQ2FwdHVyZVNpemUgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBpZiAobUVuYWJsZWQpIHsKLSAgICAgICAgdWludDhfdCBidWZbbUNhcHR1cmVTaXplXTsKLSAgICAgICAgc3RhdHVzID0gZ2V0V2F2ZUZvcm0oYnVmKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3RhdHVzID0gZG9GZnQoZmZ0LCBidWYpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbWVtc2V0KGZmdCwgMCwgbUNhcHR1cmVTaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgVmlzdWFsaXplcjo6ZG9GZnQodWludDhfdCAqZmZ0LCB1aW50OF90ICp3YXZlZm9ybSkKLXsKLSAgICBpbnQzMl90IHdvcmtzcGFjZVttQ2FwdHVyZVNpemUgPj4gMV07Ci0gICAgaW50MzJfdCBub256ZXJvID0gMDsKLQotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBtQ2FwdHVyZVNpemU7IGkgKz0gMikgewotICAgICAgICB3b3Jrc3BhY2VbaSA+PiAxXSA9Ci0gICAgICAgICAgICAgICAgKCh3YXZlZm9ybVtpXSBeIDB4ODApIDw8IDI0KSB8ICgod2F2ZWZvcm1baSArIDFdIF4gMHg4MCkgPDwgOCk7Ci0gICAgICAgIG5vbnplcm8gfD0gd29ya3NwYWNlW2kgPj4gMV07Ci0gICAgfQotCi0gICAgaWYgKG5vbnplcm8pIHsKLSAgICAgICAgZml4ZWRfZmZ0X3JlYWwobUNhcHR1cmVTaXplID4+IDEsIHdvcmtzcGFjZSk7Ci0gICAgfQotCi0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG1DYXB0dXJlU2l6ZTsgaSArPSAyKSB7Ci0gICAgICAgIHNob3J0IHRtcCA9IHdvcmtzcGFjZVtpID4+IDFdID4+IDIxOwotICAgICAgICB3aGlsZSAodG1wID4gMTI3IHx8IHRtcCA8IC0xMjgpIHRtcCA+Pj0gMTsKLSAgICAgICAgZmZ0W2ldID0gdG1wOwotICAgICAgICB0bXAgPSB3b3Jrc3BhY2VbaSA+PiAxXTsKLSAgICAgICAgdG1wID4+PSA1OwotICAgICAgICB3aGlsZSAodG1wID4gMTI3IHx8IHRtcCA8IC0xMjgpIHRtcCA+Pj0gMTsKLSAgICAgICAgZmZ0W2kgKyAxXSA9IHRtcDsKLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgVmlzdWFsaXplcjo6cGVyaW9kaWNDYXB0dXJlKCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUNhcHR1cmVMb2NrKTsKLSAgICBBTE9HVigicGVyaW9kaWNDYXB0dXJlKCkgJXAgbUNhcHR1cmVDYWxsQmFjayAlcCBtQ2FwdHVyZUZsYWdzIDB4JTA4eCIsCi0gICAgICAgICAgICB0aGlzLCBtQ2FwdHVyZUNhbGxCYWNrLCBtQ2FwdHVyZUZsYWdzKTsKLSAgICBpZiAobUNhcHR1cmVDYWxsQmFjayAhPSBOVUxMICYmCi0gICAgICAgIChtQ2FwdHVyZUZsYWdzICYgKENBUFRVUkVfV0FWRUZPUk18Q0FQVFVSRV9GRlQpKSAmJgotICAgICAgICBtQ2FwdHVyZVNpemUgIT0gMCkgewotICAgICAgICB1aW50OF90IHdhdmVmb3JtW21DYXB0dXJlU2l6ZV07Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGdldFdhdmVGb3JtKHdhdmVmb3JtKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHVpbnQ4X3QgZmZ0W21DYXB0dXJlU2l6ZV07Ci0gICAgICAgIGlmIChtQ2FwdHVyZUZsYWdzICYgQ0FQVFVSRV9GRlQpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IGRvRmZ0KGZmdCwgd2F2ZWZvcm0pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB1aW50OF90ICp3YXZlUHRyID0gTlVMTDsKLSAgICAgICAgdWludDhfdCAqZmZ0UHRyID0gTlVMTDsKLSAgICAgICAgdWludDMyX3Qgd2F2ZVNpemUgPSAwOwotICAgICAgICB1aW50MzJfdCBmZnRTaXplID0gMDsKLSAgICAgICAgaWYgKG1DYXB0dXJlRmxhZ3MgJiBDQVBUVVJFX1dBVkVGT1JNKSB7Ci0gICAgICAgICAgICB3YXZlUHRyID0gd2F2ZWZvcm07Ci0gICAgICAgICAgICB3YXZlU2l6ZSA9IG1DYXB0dXJlU2l6ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUNhcHR1cmVGbGFncyAmIENBUFRVUkVfRkZUKSB7Ci0gICAgICAgICAgICBmZnRQdHIgPSBmZnQ7Ci0gICAgICAgICAgICBmZnRTaXplID0gbUNhcHR1cmVTaXplOwotICAgICAgICB9Ci0gICAgICAgIG1DYXB0dXJlQ2FsbEJhY2sobUNhcHR1cmVDYmtVc2VyLCB3YXZlU2l6ZSwgd2F2ZVB0ciwgZmZ0U2l6ZSwgZmZ0UHRyLCBtU2FtcGxlUmF0ZSk7Ci0gICAgfQotfQotCi11aW50MzJfdCBWaXN1YWxpemVyOjppbml0Q2FwdHVyZVNpemUoKQotewotICAgIHVpbnQzMl90IGJ1ZjMyW3NpemVvZihlZmZlY3RfcGFyYW1fdCkgLyBzaXplb2YodWludDMyX3QpICsgMl07Ci0gICAgZWZmZWN0X3BhcmFtX3QgKnAgPSAoZWZmZWN0X3BhcmFtX3QgKilidWYzMjsKLQotICAgIHAtPnBzaXplID0gc2l6ZW9mKHVpbnQzMl90KTsKLSAgICBwLT52c2l6ZSA9IHNpemVvZih1aW50MzJfdCk7Ci0gICAgKihpbnQzMl90ICopcC0+ZGF0YSA9IFZJU1VBTElaRVJfUEFSQU1fQ0FQVFVSRV9TSVpFOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGdldFBhcmFtZXRlcihwKTsKLQotICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgc3RhdHVzID0gcC0+c3RhdHVzOwotICAgIH0KLQotICAgIHVpbnQzMl90IHNpemUgPSAwOwotICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgc2l6ZSA9ICooKGludDMyX3QgKilwLT5kYXRhICsgMSk7Ci0gICAgfQotICAgIG1DYXB0dXJlU2l6ZSA9IHNpemU7Ci0KLSAgICBBTE9HVigiaW5pdENhcHR1cmVTaXplIHNpemUgJWQgc3RhdHVzICVkIiwgbUNhcHR1cmVTaXplLCBzdGF0dXMpOwotCi0gICAgcmV0dXJuIHNpemU7Ci19Ci0KLXZvaWQgVmlzdWFsaXplcjo6Y29udHJvbFN0YXR1c0NoYW5nZWQoYm9vbCBjb250cm9sR3JhbnRlZCkgewotICAgIGlmIChjb250cm9sR3JhbnRlZCkgewotICAgICAgICAvLyB0aGlzIFZpc3VhbGl6ZXIgaW5zdGFuY2UgcmVnYWluZWQgY29udHJvbCBvZiB0aGUgZWZmZWN0LCByZXNldCB0aGUgc2NhbGluZyBtb2RlCi0gICAgICAgIC8vICAgYW5kIGNhcHR1cmUgc2l6ZSBhcyBoYXMgYmVlbiBjYWNoZWQgdGhyb3VnaCBpdC4KLSAgICAgICAgQUxPR1YoImNvbnRyb2xTdGF0dXNDaGFuZ2VkKHRydWUpIGNhdXNlcyBlZmZlY3QgcGFyYW1ldGVyIHJlc2V0OiIpOwotICAgICAgICBBTE9HVigiICAgIHNjYWxpbmcgbW9kZSByZXNldCB0byAlZCIsIG1TY2FsaW5nTW9kZSk7Ci0gICAgICAgIHNldFNjYWxpbmdNb2RlKG1TY2FsaW5nTW9kZSk7Ci0gICAgICAgIEFMT0dWKCIgICAgY2FwdHVyZSBzaXplIHJlc2V0IHRvICVkIiwgbUNhcHR1cmVTaXplKTsKLSAgICAgICAgc2V0Q2FwdHVyZVNpemUobUNhcHR1cmVTaXplKTsKLSAgICB9Ci0gICAgQXVkaW9FZmZlY3Q6OmNvbnRyb2xTdGF0dXNDaGFuZ2VkKGNvbnRyb2xHcmFudGVkKTsKLX0KLQotLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVZpc3VhbGl6ZXI6OkNhcHR1cmVUaHJlYWQ6OkNhcHR1cmVUaHJlYWQoVmlzdWFsaXplciogcmVjZWl2ZXIsIHVpbnQzMl90IGNhcHR1cmVSYXRlLAotICAgICAgICBib29sIGJDYW5DYWxsSmF2YSkKLSAgICA6IFRocmVhZChiQ2FuQ2FsbEphdmEpLCBtUmVjZWl2ZXIocmVjZWl2ZXIpCi17Ci0gICAgbVNsZWVwVGltZVVzID0gMTAwMDAwMDAwMCAvIGNhcHR1cmVSYXRlOwotICAgIEFMT0dWKCJDYXB0dXJlVGhyZWFkIGNzdG9yICVwIGNhcHR1cmVSYXRlICVkIG1TbGVlcFRpbWVVcyAlZCIsIHRoaXMsIGNhcHR1cmVSYXRlLCBtU2xlZXBUaW1lVXMpOwotfQotCi1ib29sIFZpc3VhbGl6ZXI6OkNhcHR1cmVUaHJlYWQ6OnRocmVhZExvb3AoKQotewotICAgIEFMT0dWKCJDYXB0dXJlVGhyZWFkICVwIGVudGVyIiwgdGhpcyk7Ci0gICAgc3A8VmlzdWFsaXplcj4gcmVjZWl2ZXIgPSBtUmVjZWl2ZXIucHJvbW90ZSgpOwotICAgIGlmIChyZWNlaXZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgd2hpbGUgKCFleGl0UGVuZGluZygpKQotICAgIHsKLSAgICAgICAgdXNsZWVwKG1TbGVlcFRpbWVVcyk7Ci0gICAgICAgIHJlY2VpdmVyLT5wZXJpb2RpY0NhcHR1cmUoKTsKLSAgICB9Ci0gICAgQUxPR1YoIkNhcHR1cmVUaHJlYWQgJXAgZXhpdGluZyIsIHRoaXMpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuYWlkbCBiL21lZGlhL2xpYm1lZGlhL2FpZGwvYW5kcm9pZC9tZWRpYS9JTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3YjFiYzkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvYWlkbC9hbmRyb2lkL21lZGlhL0lNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuYWlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgYW5kcm9pZC5tZWRpYTsKLQotLyoqCi0gKiBTZXJ2aWNlIHRvIHJlbG9hZCBleHRyYWN0b3IgcGx1Z2lucyB3aGVuIHVwZGF0ZSBwYWNrYWdlIGlzIGluc3RhbGxlZC91bmluc3RhbGxlZC4KLSAqIEBoaWRlCi0gKi8KLWludGVyZmFjZSBJTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlIHsKLSAgICB2b2lkIGxvYWRQbHVnaW5zKEB1dGY4SW5DcHAgU3RyaW5nIGFwa1BhdGgpOwotfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJQcm92aWRlcnMuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyUHJvdmlkZXJzLmgKaW5kZXggZDZhOWNmYi4uYjAzODg1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJQcm92aWRlcnMuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlclByb3ZpZGVycy5oCkBAIC03OCw2ICs3OCw3IEBACiAKICAgICAvLyBPdmVycmlkZXMgUGFzc3RocnVCdWZmZXJQcm92aWRlcgogICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOworICAgIHZvaWQgc2V0QnVmZmVyUHJvdmlkZXIoQXVkaW9CdWZmZXJQcm92aWRlciAqcCkgb3ZlcnJpZGU7CiAKICAgICAvLyB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBzdXBwbGllZCBieSB0aGUgZGVyaXZlZCBjbGFzcy4gIEl0IGNvbnZlcnRzCiAgICAgLy8gI2ZyYW1lcyBpbiB0aGUgKnNyYyBwb2ludGVyIHRvIHRoZSAqZHN0IHBvaW50ZXIuICBJdCBpcyBwdWJsaWMgYmVjYXVzZQpAQCAtMTg2LDYgKzE4Nyw3IEBACiAKICAgICAvLyBPdmVycmlkZXMgUGFzc3RocnVCdWZmZXJQcm92aWRlcgogICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOworICAgIHZvaWQgc2V0QnVmZmVyUHJvdmlkZXIoQXVkaW9CdWZmZXJQcm92aWRlciAqcCkgb3ZlcnJpZGU7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKTsKIApAQCAtMjE2LDYgKzIxOCw0MSBAQAogICAgIGJvb2wgICAgICAgICAgICAgICAgIG1BdWRpb1BsYXliYWNrUmF0ZVZhbGlkOyAvLyBmbGFnIGZvciBjdXJyZW50IHBhcmFtZXRlcnMgdmFsaWRpdHkKIH07CiAKKy8vIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIgZGVyaXZlcyBmcm9tIENvcHlCdWZmZXJQcm92aWRlciB0byBhZGp1c3Qgc2FtcGxlIGRhdGEuCisvLyBFeHBhbmRzIG9yIGNvbnRyYWN0cyBzYW1wbGUgZGF0YSBmcm9tIG9uZSBpbnRlcmxlYXZlZCBjaGFubmVsIGZvcm1hdCB0byBhbm90aGVyLgorLy8gRXh0cmEgZXhwYW5kZWQgY2hhbm5lbHMgYXJlIGZpbGxlZCB3aXRoIHplcm9zIGFuZCBwdXQgYXQgdGhlIGVuZCBvZiBlYWNoIGF1ZGlvIGZyYW1lLgorLy8gQ29udHJhY3RlZCBjaGFubmVscyBhcmUgY29waWVkIHRvIHRoZSBlbmQgb2YgdGhlIG91dHB1dCBidWZmZXIoc3RvcmFnZSBzaG91bGQgYmUKKy8vIGFsbG9jYXRlZCBhcHByb3ByaWF0ZWx5KS4KKy8vIENvbnRyYWN0ZWQgY2hhbm5lbHMgY291bGQgYmUgd3JpdHRlbiB0byBvdXRwdXQgYnVmZmVyLgorY2xhc3MgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlciA6IHB1YmxpYyBDb3B5QnVmZmVyUHJvdmlkZXIgeworcHVibGljOgorICAgIEFkanVzdENoYW5uZWxzQnVmZmVyUHJvdmlkZXIoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LCBzaXplX3QgaW5DaGFubmVsQ291bnQsCisgICAgICAgICAgICBzaXplX3Qgb3V0Q2hhbm5lbENvdW50LCBzaXplX3QgZnJhbWVDb3VudCkgOiBBZGp1c3RDaGFubmVsc0J1ZmZlclByb3ZpZGVyKAorICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGluQ2hhbm5lbENvdW50LCBvdXRDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsIEFVRElPX0ZPUk1BVF9JTlZBTElELCBudWxscHRyKSB7IH0KKyAgICAvLyBDb250cmFjdGVkIGRhdGEgaXMgY29udmVydGVkIHRvIGNvbnRyYWN0ZWRGb3JtYXQgYW5kIHB1dCBpbnRvIGNvbnRyYWN0ZWRCdWZmZXIuCisgICAgQWRqdXN0Q2hhbm5lbHNCdWZmZXJQcm92aWRlcihhdWRpb19mb3JtYXRfdCBmb3JtYXQsIHNpemVfdCBpbkNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIHNpemVfdCBvdXRDaGFubmVsQ291bnQsIHNpemVfdCBmcmFtZUNvdW50LCBhdWRpb19mb3JtYXRfdCBjb250cmFjdGVkRm9ybWF0LAorICAgICAgICAgICAgdm9pZCogY29udHJhY3RlZEJ1ZmZlcik7CisgICAgLy9PdmVycmlkZXMKKyAgICBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEJ1ZmZlciogcEJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgdm9pZCBjb3B5RnJhbWVzKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QgZnJhbWVzKSBvdmVycmlkZTsKKyAgICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGNsZWFyQ29udHJhY3RlZEZyYW1lcygpIHsgbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzID0gMDsgfQorCitwcm90ZWN0ZWQ6CisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtSW5DaGFubmVsQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbU91dENoYW5uZWxDb3VudDsKKyAgICBjb25zdCBzaXplX3QgICAgICAgICBtU2FtcGxlU2l6ZUluQnl0ZXM7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUZyYW1lQ291bnQ7CisgICAgY29uc3Qgc2l6ZV90ICAgICAgICAgbUNvbnRyYWN0ZWRDaGFubmVsQ291bnQ7CisgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgbUNvbnRyYWN0ZWRGb3JtYXQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAqbUNvbnRyYWN0ZWRCdWZmZXI7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgbUNvbnRyYWN0ZWRXcml0dGVuRnJhbWVzOworICAgIHNpemVfdCAgICAgICAgICAgICAgIG1Db250cmFjdGVkRnJhbWVTaXplOworfTsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9CdWZmZXJpbmdTZXR0aW5ncy5oCmluZGV4IGQyYTNlNDAuLmQ5N2NjMDAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmgKQEAgLTE3LDExICsxNywxMSBAQAogI2lmbmRlZiBBTkRST0lEX0JVRkZFUklOR19TRVRUSU5HU19ICiAjZGVmaW5lIEFORFJPSURfQlVGRkVSSU5HX1NFVFRJTkdTX0gKIAotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0cnVjdCBCdWZmZXJpbmdTZXR0aW5ncyA6IHB1YmxpYyBQYXJjZWxhYmxlIHsKK3N0cnVjdCBCdWZmZXJpbmdTZXR0aW5ncyB7CiAgICAgc3RhdGljIGNvbnN0IGludCBrTm9NYXJrID0gLTE7CiAKICAgICBpbnQgbUluaXRpYWxNYXJrTXM7CkBAIC0zMiw5ICszMiw2IEBACiAKICAgICBCdWZmZXJpbmdTZXR0aW5ncygpOwogCi0gICAgc3RhdHVzX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwqIHBhcmNlbCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgc3RhdHVzX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsKiBwYXJjZWwpIG92ZXJyaWRlOwotCiAgICAgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0OwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9DcnlwdG9IYWwuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvQ3J5cHRvSGFsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmODc4OWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9DcnlwdG9IYWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBDUllQVE9fSEFMX0hfCi0KLSNkZWZpbmUgQ1JZUFRPX0hBTF9IXwotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lDcnlwdG9GYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9kcm0vMS4wL0lDcnlwdG9QbHVnaW4uaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSUNyeXB0b0ZhY3RvcnkuaD4KLQotI2luY2x1ZGUgPG1lZGlhZHJtL0lDcnlwdG8uaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotbmFtZXNwYWNlIGRybSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmRybTsKLXVzaW5nIGRybTo6VjFfMDo6SUNyeXB0b0ZhY3Rvcnk7Ci11c2luZyBkcm06OlYxXzA6OklDcnlwdG9QbHVnaW47Ci11c2luZyBkcm06OlYxXzA6OlNoYXJlZEJ1ZmZlcjsKLQotY2xhc3MgSU1lbW9yeUhlYXA7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IENyeXB0b0hhbCA6IHB1YmxpYyBCbkNyeXB0byB7Ci0gICAgQ3J5cHRvSGFsKCk7Ci0gICAgdmlydHVhbCB+Q3J5cHRvSGFsKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotCi0gICAgdmlydHVhbCBib29sIGlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0pOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oCi0gICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlc3Ryb3lQbHVnaW4oKTsKLQotICAgIHZpcnR1YWwgYm9vbCByZXF1aXJlc1NlY3VyZURlY29kZXJDb21wb25lbnQoCi0gICAgICAgICAgICBjb25zdCBjaGFyICptaW1lKSBjb25zdDsKLQotICAgIHZpcnR1YWwgdm9pZCBub3RpZnlSZXNvbHV0aW9uKHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYURybVNlc3Npb24oY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpOwotCi0gICAgdmlydHVhbCBzc2l6ZV90IGRlY3J5cHQoY29uc3QgdWludDhfdCBrZXlbMTZdLCBjb25zdCB1aW50OF90IGl2WzE2XSwKLSAgICAgICAgICAgIENyeXB0b1BsdWdpbjo6TW9kZSBtb2RlLCBjb25zdCBDcnlwdG9QbHVnaW46OlBhdHRlcm4gJnBhdHRlcm4sCi0gICAgICAgICAgICBjb25zdCBJQ3J5cHRvOjpTb3VyY2VCdWZmZXIgJnNvdXJjZSwgc2l6ZV90IG9mZnNldCwKLSAgICAgICAgICAgIGNvbnN0IENyeXB0b1BsdWdpbjo6U3ViU2FtcGxlICpzdWJTYW1wbGVzLCBzaXplX3QgbnVtU3ViU2FtcGxlcywKLSAgICAgICAgICAgIGNvbnN0IElDcnlwdG86OkRlc3RpbmF0aW9uQnVmZmVyICZkZXN0aW5hdGlvbiwKLSAgICAgICAgICAgIEFTdHJpbmcgKmVycm9yRGV0YWlsTXNnKTsKLQotICAgIHZpcnR1YWwgaW50MzJfdCBzZXRIZWFwKGNvbnN0IHNwPElNZW1vcnlIZWFwPiYgaGVhcCkgewotICAgICAgICByZXR1cm4gc2V0SGVhcEJhc2UoaGVhcCk7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCB1bnNldEhlYXAoaW50MzJfdCBzZXFOdW0pIHsgY2xlYXJIZWFwQmFzZShzZXFOdW0pOyB9Ci0KLXByaXZhdGU6Ci0gICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLQotICAgIGNvbnN0IFZlY3RvcjxzcDxJQ3J5cHRvRmFjdG9yeT4+IG1GYWN0b3JpZXM7Ci0gICAgc3A8SUNyeXB0b1BsdWdpbj4gbVBsdWdpbjsKLQotICAgIC8qKgotICAgICAqIG1Jbml0Q2hlY2sgaXM6Ci0gICAgICogICBOT19JTklUIGlmIGEgcGx1Z2luIGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0Ci0gICAgICogICBFUlJPUl9VTlNVUFBPUlRFRCBpZiBhIHBsdWdpbiBjYW4ndCBiZSBjcmVhdGVkIGZvciB0aGUgdXVpZAotICAgICAqICAgT0sgYWZ0ZXIgYSBwbHVnaW4gaGFzIGJlZW4gY3JlYXRlZCBhbmQgbVBsdWdpbiBpcyB2YWxpZAotICAgICAqLwotICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0KLSAgICBzdHJ1Y3QgSGVhcEJhc2UgewotICAgICAgICBIZWFwQmFzZSgpIDogbUJ1ZmZlcklkKDApLCBtU2l6ZSgwKSB7fQotICAgICAgICBIZWFwQmFzZSh1aW50MzJfdCBidWZmZXJJZCwgc2l6ZV90IHNpemUpIDoKLSAgICAgICAgICAgIG1CdWZmZXJJZChidWZmZXJJZCksIG1TaXplKHNpemUpIHt9Ci0KLSAgICAgICAgdWludDMyX3QgZ2V0QnVmZmVySWQoKSBjb25zdCB7cmV0dXJuIG1CdWZmZXJJZDt9Ci0gICAgICAgIHNpemVfdCBnZXRTaXplKCkgY29uc3Qge3JldHVybiBtU2l6ZTt9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICB1aW50MzJfdCBtQnVmZmVySWQ7Ci0gICAgICAgIHNpemVfdCBtU2l6ZTsKLSAgICB9OwotCi0gICAgS2V5ZWRWZWN0b3I8aW50MzJfdCwgSGVhcEJhc2U+IG1IZWFwQmFzZXM7Ci0gICAgdWludDMyX3QgbU5leHRCdWZmZXJJZDsKLSAgICBpbnQzMl90IG1IZWFwU2VxTnVtOwotCi0gICAgVmVjdG9yPHNwPElDcnlwdG9GYWN0b3J5Pj4gbWFrZUNyeXB0b0ZhY3RvcmllcygpOwotICAgIHNwPElDcnlwdG9QbHVnaW4+IG1ha2VDcnlwdG9QbHVnaW4oY29uc3Qgc3A8SUNyeXB0b0ZhY3Rvcnk+JiBmYWN0b3J5LAotICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3Qgdm9pZCAqaW5pdERhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIGludDMyX3Qgc2V0SGVhcEJhc2UoY29uc3Qgc3A8SU1lbW9yeUhlYXA+JiBoZWFwKTsKLSAgICB2b2lkIGNsZWFySGVhcEJhc2UoaW50MzJfdCBzZXFOdW0pOwotCi0gICAgc3RhdHVzX3QgdG9TaGFyZWRCdWZmZXIoY29uc3Qgc3A8SU1lbW9yeT4mIG1lbW9yeSwgaW50MzJfdCBzZXFOdW0sIDo6U2hhcmVkQnVmZmVyKiBidWZmZXIpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ3J5cHRvSGFsKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gQ1JZUFRPX0hBTF9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlRGVzYy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlRGVzYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTkwMjYxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZURlc2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9EQVRBU09VUkNFREVTQ19ICi0jZGVmaW5lIEFORFJPSURfREFUQVNPVVJDRURFU0NfSAotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEYXRhU291cmNlOwotc3RydWN0IE1lZGlhSFRUUFNlcnZpY2U7Ci0KLS8vIEEgYmluZGVyIGludGVyZmFjZSBmb3IgaW1wbGVtZW50aW5nIGEgc3RhZ2VmcmlnaHQgRGF0YVNvdXJjZSByZW1vdGVseS4KLXN0cnVjdCBEYXRhU291cmNlRGVzYyA6IHB1YmxpYyBSZWZCYXNlIHsKLXB1YmxpYzoKLSAgICBlbnVtIHsKLSAgICAgICAgLyogTm8gZGF0YSBzb3VyY2UgaGFzIGJlZW4gc2V0IHlldCAqLwotICAgICAgICBUWVBFX05PTkUgICAgID0gMCwKLSAgICAgICAgLyogZGF0YSBzb3VyY2UgaXMgdHlwZSBvZiBNZWRpYURhdGFTb3VyY2UgKi8KLSAgICAgICAgVFlQRV9DQUxMQkFDSyA9IDEsCi0gICAgICAgIC8qIGRhdGEgc291cmNlIGlzIHR5cGUgb2YgRmlsZURlc2NyaXB0b3IgKi8KLSAgICAgICAgVFlQRV9GRCAgICAgICA9IDIsCi0gICAgICAgIC8qIGRhdGEgc291cmNlIGlzIHR5cGUgb2YgVXJsICovCi0gICAgICAgIFRZUEVfVVJMICAgICAgPSAzLAotICAgIH07Ci0KLSAgICBEYXRhU291cmNlRGVzYygpOwotCi0gICAgaW50IG1UeXBlOwotCi0gICAgc3A8TWVkaWFIVFRQU2VydmljZT4gbUh0dHBTZXJ2aWNlOwotICAgIFN0cmluZzggbVVybDsKLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtSGVhZGVyczsKLQotICAgIGludCBtRkQ7Ci0gICAgaW50NjRfdCBtRkRPZmZzZXQ7Ci0gICAgaW50NjRfdCBtRkRMZW5ndGg7Ci0KLSAgICBzcDxEYXRhU291cmNlPiBtQ2FsbGJhY2tTb3VyY2U7Ci0KLSAgICBpbnQ2NF90IG1JZDsKLSAgICBpbnQ2NF90IG1TdGFydFBvc2l0aW9uTXM7Ci0gICAgaW50NjRfdCBtRW5kUG9zaXRpb25NczsKLQotcHJpdmF0ZToKLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEYXRhU291cmNlRGVzYyk7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9EQVRBU09VUkNFREVTQ19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1IYWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI2N2Y3Ni4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybUhhbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIERSTV9IQUxfSF8KLQotI2RlZmluZSBEUk1fSEFMX0hfCi0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSURybUZhY3RvcnkuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvSURybVBsdWdpbi5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZHJtLzEuMC9JRHJtUGx1Z2luTGlzdGVuZXIuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybUZhY3RvcnkuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvSURybVBsdWdpbi5oPgotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+Ci0jaW5jbHVkZSA8bWVkaWFkcm0vRHJtTWV0cmljcy5oPgotI2luY2x1ZGUgPG1lZGlhZHJtL0lEcm0uaD4KLSNpbmNsdWRlIDxtZWRpYWRybS9JRHJtQ2xpZW50Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgZHJtID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOwotdXNpbmcgZHJtOjpWMV8wOjpFdmVudFR5cGU7Ci11c2luZyBkcm06OlYxXzA6OklEcm1GYWN0b3J5OwotdXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luOwotdXNpbmcgZHJtOjpWMV8wOjpJRHJtUGx1Z2luTGlzdGVuZXI7Ci11c2luZyBkcm06OlYxXzA6OktleVN0YXR1czsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgRHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZTsKLQotaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBWZWN0b3I8dWludDhfdD4gJmwsIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmcikgewotICAgIGlmIChsLnNpemUoKSAhPSByLnNpemUoKSkgcmV0dXJuIGZhbHNlOwotICAgIHJldHVybiBtZW1jbXAobC5hcnJheSgpLCByLmFycmF5KCksIGwuc2l6ZSgpKSA9PSAwOwotfQotCi1zdHJ1Y3QgRHJtSGFsIDogcHVibGljIEJuRHJtLAotICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwKLSAgICAgICAgICAgICBwdWJsaWMgSURybVBsdWdpbkxpc3RlbmVyIHsKLSAgICBEcm1IYWwoKTsKLSAgICB2aXJ0dWFsIH5Ecm1IYWwoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQoY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgU3RyaW5nOCAmbWltZVR5cGUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZhcHBQYWNrYWdlTmFtZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlc3Ryb3lQbHVnaW4oKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlblNlc3Npb24oRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsIGxldmVsLAotICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZzZXNzaW9uSWQpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjbG9zZVNlc3Npb24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdAotICAgICAgICBnZXRLZXlSZXF1ZXN0KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5pdERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmbWltZVR5cGUsIERybVBsdWdpbjo6S2V5VHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGNvbnN0ICZvcHRpb25hbFBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZyZXF1ZXN0LCBTdHJpbmc4ICZkZWZhdWx0VXJsLAotICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgKmtleVJlcXVlc3RUeXBlKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJvdmlkZUtleVJlc3BvbnNlKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZrZXlTZXRJZCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUtleXMoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5S2V5U3RhdHVzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gJmluZm9NYXApIGNvbnN0OwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm92aXNpb25SZXF1ZXN0KFN0cmluZzggY29uc3QgJmNlcnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZjZXJ0QXV0aG9yaXR5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggJmRlZmF1bFVybCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVQcm92aXNpb25SZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJnJlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmY2VydGlmaWNhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ3cmFwcGVkS2V5KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0U2VjdXJlU3RvcHMoTGlzdDxWZWN0b3I8dWludDhfdD4+ICZzZWN1cmVTdG9wcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wSWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+PiAmc2VjdXJlU3RvcElkcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NpZCwgVmVjdG9yPHVpbnQ4X3Q+ICZzZWN1cmVTdG9wKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVNlY3VyZVN0b3AoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc2lkKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZUFsbFNlY3VyZVN0b3BzKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEhkY3BMZXZlbHMoRHJtUGx1Z2luOjpIZGNwTGV2ZWwgKmNvbm5lY3RlZExldmVsLAotICAgICAgICAgICAgRHJtUGx1Z2luOjpIZGNwTGV2ZWwgKm1heExldmVsKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE51bWJlck9mU2Vzc2lvbnModWludDMyX3QgKmN1cnJlbnRTZXNzaW9ucywKLSAgICAgICAgICAgIHVpbnQzMl90ICptYXhTZXNzaW9ucykgY29uc3Q7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsICpsZXZlbCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsIFN0cmluZzggJnZhbHVlICkgY29uc3Q7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eUJ5dGVBcnJheShTdHJpbmc4IGNvbnN0ICZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSApIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJvcGVydHlTdHJpbmcoU3RyaW5nOCBjb25zdCAmbmFtZSwgU3RyaW5nOCBjb25zdCAmdmFsdWUgKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QgJm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJnZhbHVlICkgY29uc3Q7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNZXRyaWNzKG9zOjpQZXJzaXN0YWJsZUJ1bmRsZSAqbWV0cmljcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENpcGhlckFsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZhbGdvcml0aG0pOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYWNBbGdvcml0aG0oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmYWxnb3JpdGhtKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5jcnlwdChWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZpdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZvdXRwdXQpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJml2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJm91dHB1dCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNpZ24oVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAma2V5SWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZzaWduYXR1cmUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCB2ZXJpZnkoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzaWduYXR1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmbWF0Y2gpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzaWduUlNBKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZhbGdvcml0aG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZ3cmFwcGVkS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnNpZ25hdHVyZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldExpc3RlbmVyKGNvbnN0IHNwPElEcm1DbGllbnQ+JiBsaXN0ZW5lcik7Ci0KLSAgICAvLyBNZXRob2RzIG9mIElEcm1QbHVnaW5MaXN0ZW5lcgotICAgIFJldHVybjx2b2lkPiBzZW5kRXZlbnQoRXZlbnRUeXBlIGV2ZW50VHlwZSwKLSAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBkYXRhKTsKLQotICAgIFJldHVybjx2b2lkPiBzZW5kRXhwaXJhdGlvblVwZGF0ZShjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvbklkLAotICAgICAgICAgICAgaW50NjRfdCBleHBpcnlUaW1lSW5NUyk7Ci0KLSAgICBSZXR1cm48dm9pZD4gc2VuZEtleXNDaGFuZ2UoY29uc3QgaGlkbF92ZWM8dWludDhfdD4mIHNlc3Npb25JZCwKLSAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPEtleVN0YXR1cz4mIGtleVN0YXR1c0xpc3QsIGJvb2wgaGFzTmV3VXNhYmxlS2V5KTsKLQotICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ0aGVfbGF0ZV93aG8pOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyBNdXRleCBtTG9jazsKLQotICAgIHNwPERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U+IG1Ecm1TZXNzaW9uQ2xpZW50OwotCi0gICAgc3A8SURybUNsaWVudD4gbUxpc3RlbmVyOwotICAgIG11dGFibGUgTXV0ZXggbUV2ZW50TG9jazsKLSAgICBtdXRhYmxlIE11dGV4IG1Ob3RpZnlMb2NrOwotCi0gICAgY29uc3QgVmVjdG9yPHNwPElEcm1GYWN0b3J5Pj4gbUZhY3RvcmllczsKLSAgICBzcDxJRHJtUGx1Z2luPiBtUGx1Z2luOwotICAgIHNwPGRybTo6VjFfMTo6SURybVBsdWdpbj4gbVBsdWdpblYxXzE7Ci0gICAgU3RyaW5nOCBtQXBwUGFja2FnZU5hbWU7Ci0KLSAgICAvLyBNdXRhYmxlIHRvIGFsbG93IG1vZGlmaWNhdGlvbiB3aXRoaW4gR2V0UHJvcGVydHlCeXRlQXJyYXkuCi0gICAgbXV0YWJsZSBNZWRpYURybU1ldHJpY3MgbU1ldHJpY3M7Ci0KLSAgICBWZWN0b3I8VmVjdG9yPHVpbnQ4X3Q+PiBtT3BlblNlc3Npb25zOwotICAgIHZvaWQgY2xvc2VPcGVuU2Vzc2lvbnMoKTsKLSAgICB2b2lkIGNsZWFudXAoKTsKLQotICAgIC8qKgotICAgICAqIG1Jbml0Q2hlY2sgaXM6Ci0gICAgICogICBOT19JTklUIGlmIGEgcGx1Z2luIGhhc24ndCBiZWVuIGNyZWF0ZWQgeWV0Ci0gICAgICogICBFUlJPUl9VTlNVUFBPUlRFRCBpZiBhIHBsdWdpbiBjYW4ndCBiZSBjcmVhdGVkIGZvciB0aGUgdXVpZAotICAgICAqICAgT0sgYWZ0ZXIgYSBwbHVnaW4gaGFzIGJlZW4gY3JlYXRlZCBhbmQgbVBsdWdpbiBpcyB2YWxpZAotICAgICAqLwotICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0KLSAgICBWZWN0b3I8c3A8SURybUZhY3Rvcnk+PiBtYWtlRHJtRmFjdG9yaWVzKCk7Ci0gICAgc3A8SURybVBsdWdpbj4gbWFrZURybVBsdWdpbihjb25zdCBzcDxJRHJtRmFjdG9yeT4mIGZhY3RvcnksCi0gICAgICAgICAgICBjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4JiBhcHBQYWNrYWdlTmFtZSk7Ci0KLSAgICB2b2lkIHdyaXRlQnl0ZUFycmF5KFBhcmNlbCAmb2JqLCBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgYXJyYXkpOwotCi0gICAgdm9pZCByZXBvcnRQbHVnaW5NZXRyaWNzKCkgY29uc3Q7Ci0gICAgdm9pZCByZXBvcnRGcmFtZXdvcmtNZXRyaWNzKCkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgZ2V0UHJvcGVydHlTdHJpbmdJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXlJbnRlcm5hbChTdHJpbmc4IGNvbnN0ICZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ2YWx1ZSkgY29uc3Q7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEcm1IYWwpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBEUk1fSEFMX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybU1ldHJpY3MuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtTWV0cmljcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjE5OThmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvRHJtTWV0cmljcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIERSTV9NRVRSSUNTX0hfCi0jZGVmaW5lIERSTV9NRVRSSUNTX0hfCi0KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjAvdHlwZXMuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2RybS8xLjEvdHlwZXMuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGVyc2lzdGFibGVCdW5kbGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9Db3VudGVyTWV0cmljLmg+Ci0jaW5jbHVkZSA8bWVkaWEvRXZlbnRNZXRyaWMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKioKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgbWV0cmljcyBjYXB0dXJlZCB3aXRoaW4gTWVkaWFEcm0uCi0gKiBJdCBhbHNvIGNvbnRhaW5zIGEgbWV0aG9kIGZvciBleHBvcnRpbmcgYWxsIG9mIHRoZSBtZXRyaWNzIHRvIGEKLSAqIFBlcnNpc3RhYmxlQnVuZGxlLgotICovCi1jbGFzcyBNZWRpYURybU1ldHJpY3MgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgTWVkaWFEcm1NZXRyaWNzKCk7Ci0gIHZpcnR1YWwgfk1lZGlhRHJtTWV0cmljcygpIHt9OwotICAvLyBDb3VudCBvZiBvcGVuU2Vzc2lvbiBjYWxscy4KLSAgQ291bnRlck1ldHJpYzxzdGF0dXNfdD4gbU9wZW5TZXNzaW9uQ291bnRlcjsKLSAgLy8gQ291bnQgb2YgY2xvc2VTZXNzaW9uIGNhbGxzLgotICBDb3VudGVyTWV0cmljPHN0YXR1c190PiBtQ2xvc2VTZXNzaW9uQ291bnRlcjsKLSAgLy8gQ291bnQgYW5kIHRpbWluZyBvZiBnZXRLZXlSZXF1ZXN0IGNhbGxzLgotICBFdmVudE1ldHJpYzxzdGF0dXNfdD4gbUdldEtleVJlcXVlc3RUaW1lVXM7Ci0gIC8vIENvdW50IGFuZCB0aW1pbmcgb2YgcHJvdmlkZUtleVJlc3BvbnNlIGNhbGxzLgotICBFdmVudE1ldHJpYzxzdGF0dXNfdD4gbVByb3ZpZGVLZXlSZXNwb25zZVRpbWVVczsKLSAgLy8gQ291bnQgb2YgZ2V0UHJvdmlzaW9uUmVxdWVzdCBjYWxscy4KLSAgQ291bnRlck1ldHJpYzxzdGF0dXNfdD4gbUdldFByb3Zpc2lvblJlcXVlc3RDb3VudGVyOwotICAvLyBDb3VudCBvZiBwcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UgY2FsbHMuCi0gIENvdW50ZXJNZXRyaWM8c3RhdHVzX3Q+IG1Qcm92aWRlUHJvdmlzaW9uUmVzcG9uc2VDb3VudGVyOwotCi0gIC8vIENvdW50IG9mIGtleSBzdGF0dXMgZXZlbnRzIGJyb2tlbiBvdXQgYnkgc3RhdHVzIHR5cGUuCi0gIENvdW50ZXJNZXRyaWM8OjphbmRyb2lkOjpoYXJkd2FyZTo6ZHJtOjpWMV8wOjpLZXlTdGF0dXNUeXBlPgotICAgICAgbUtleVN0YXR1c0NoYW5nZUNvdW50ZXI7Ci0gIC8vIENvdW50IG9mIGV2ZW50cyBicm9rZW4gb3V0IGJ5IGV2ZW50IHR5cGUKLSAgQ291bnRlck1ldHJpYzw6OmFuZHJvaWQ6OmhhcmR3YXJlOjpkcm06OlYxXzA6OkV2ZW50VHlwZT4gbUV2ZW50Q291bnRlcjsKLQotICAvLyBDb3VudCBnZXRQcm9wZXJ0eUJ5dGVBcnJheSBjYWxscyB0byByZXRyaWV2ZSB0aGUgZGV2aWNlIHVuaXF1ZSBpZC4KLSAgQ291bnRlck1ldHJpYzxzdGF0dXNfdD4gbUdldERldmljZVVuaXF1ZUlkQ291bnRlcjsKLQotICAvLyBBZGRzIGEgc2Vzc2lvbiBzdGFydCB0aW1lIHJlY29yZC4KLSAgdm9pZCBTZXRTZXNzaW9uU3RhcnQoY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOwotCi0gIC8vIEFkZHMgYSBzZXNzaW9uIGVuZCB0aW1lIHJlY29yZC4KLSAgdm9pZCBTZXRTZXNzaW9uRW5kKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKLQotICAvLyBUaGUgYXBwIHBhY2thZ2UgbmFtZSBpcyB0aGUgYXBwbGljYXRpb24gcGFja2FnZSBuYW1lIHRoYXQgaXMgdXNpbmcgdGhlCi0gIC8vIGluc3RhbmNlLiBUaGUgYXBwIHBhY2thZ2UgbmFtZSBpcyBoZWxkIGhlcmUgZm9yIGNvbnZlbmllbmNlLiBJdCBpcyBub3QKLSAgLy8gc2VyaWFsaXplZCBvciBleHBvcnRlZCB3aXRoIHRoZSBtZXRyaWNzLgotICB2b2lkIFNldEFwcFBhY2thZ2VOYW1lKGNvbnN0IFN0cmluZzgmIGFwcFBhY2thZ2VOYW1lKSB7IG1BcHBQYWNrYWdlTmFtZSA9IGFwcFBhY2thZ2VOYW1lOyB9Ci0gIGNvbnN0IFN0cmluZzgmIEdldEFwcFBhY2thZ2VOYW1lKCkgeyByZXR1cm4gbUFwcFBhY2thZ2VOYW1lOyB9Ci0KLSAgLy8gRXhwb3J0IHRoZSBtZXRyaWNzIHRvIGEgUGVyc2lzdGFibGVCdW5kbGUuCi0gIHZvaWQgRXhwb3J0KG9zOjpQZXJzaXN0YWJsZUJ1bmRsZSogbWV0cmljc0J1bmRsZSk7Ci0KLSAgLy8gR2V0IHRoZSBzZXJpYWxpemVkIG1ldHJpY3MuIE1ldHJpY3MgYXJlIGZvcm1hdHRlZCBhcyBhIHNlcmlhbGl6ZWQKLSAgLy8gRHJtRnJhbWV3b3JrTWV0cmljcyBwcm90by4gSWYgdGhlcmUgaXMgYSBmYWlsdXJlIHNlcmlhbGl6aW5nIHRoZSBtZXRyaWNzLAotICAvLyB0aGlzIHJldHVybnMgYW4gZXJyb3IuIFRoZSBwYXJhbWV0ZXIgfHNlcmxpYWxpemVkTWV0cmljc3wgaXMgb3duZWQgYnkgdGhlCi0gIC8vIGNhbGxlciBhbmQgbXVzdCBub3QgYmUgbnVsbC4KLSAgc3RhdHVzX3QgR2V0U2VyaWFsaXplZE1ldHJpY3Moc3RkOjpzdHJpbmcqIHNlcmlhbGl6ZWRNZXRyaWNzKTsKLQotICAvLyBDb252ZXJ0cyB0aGUgRFJNIHBsdWdpbiBtZXRyaWNzIHRvIGEgUGVyc2lzdGFibGVCdW5kbGUuIEFsbCBvZiB0aGUgbWV0cmljcwotICAvLyBmb3VuZCBpbiB8cGx1Z2luTWV0cmljc3wgYXJlIGFkZGVkIHRvIHRoZSB8bWV0cmljc0J1bmRsZXwgcGFyYW1ldGVyLgotICAvLyB8cGx1Z2luQnVuZGxlfCBpcyBvd25lZCBieSB0aGUgY2FsbGVyIGFuZCBtdXN0IG5vdCBiZSBudWxsLgotICAvLwotICAvLyBFYWNoIGl0ZW0gaW4gdGhlIHBsdWdpbk1ldHJpY3MgdmVjdG9yIGlzIGFkZGVkIGFzIGEgbmV3IFBlcnNpc3RhYmxlQnVuZGxlLiBFLmcuCi0gIC8vIERybU1ldHJpY0dyb3VwIHsKLSAgLy8gICBtZXRyaWNzWzBdIHsKLSAgLy8gICAgIG5hbWU6ICJidWZfY29weSIKLSAgLy8gICAgIGF0dHJpYnV0ZXNbMF0gewotICAvLyAgICAgICBuYW1lOiAic2l6ZSIKLSAgLy8gICAgICAgdHlwZTogSU5UNjRfVFlQRQotICAvLyAgICAgICBpbnQ2NFZhbHVlOiAxMDI0Ci0gIC8vICAgICB9Ci0gIC8vICAgICB2YWx1ZXNbMF0gewotICAvLyAgICAgICBjb21wb25lbnROYW1lOiAib3BlcmF0aW9uX2NvdW50IgotICAvLyAgICAgICB0eXBlOiBJTlQ2NF9UWVBFCi0gIC8vICAgICAgIGludDY0VmFsdWU6IDc1Ci0gIC8vICAgICB9Ci0gIC8vICAgICB2YWx1ZXNbMV0gewotICAvLyAgICAgICBjb21wb25lbnRfbmFtZTogImF2ZXJhZ2VfdGltZV9zZWNvbmRzIgotICAvLyAgICAgICB0eXBlOiBET1VCTEVfVFlQRQotICAvLyAgICAgICBkb3VibGVWYWx1ZTogMC4wMDAwMDA0MgotICAvLyAgICAgfQotICAvLyAgIH0KLSAgLy8gfQotICAvLwotICAvLyBiZWNvbWVzCi0gIC8vCi0gIC8vIG1ldHJpY3NCdW5kbGUgewotICAvLyAgICIwIjogKFBlcnNpc3RhYmxlQnVuZGxlKSB7Ci0gIC8vICAgICAiYXR0cmlidXRlcyIgOiAoUGVyc2lzdGFibGVCdW5kbGUpIHsKLSAgLy8gICAgICAgInNpemUiIDogKGludDY0KSAxMDI0Ci0gIC8vICAgICB9Ci0gIC8vICAgICAib3BlcmF0aW9uX2NvdW50IiA6IChpbnQ2NCkgNzUKLSAgLy8gICAgICJhdmVyYWdlX3RpbWVfc2Vjb25kcyIgOiAoZG91YmxlKSAwLjAwMDAwMDQyCi0gIC8vICAgfQotICAvLwotICBzdGF0aWMgc3RhdHVzX3QgSGlkbE1ldHJpY3NUb0J1bmRsZSgKLSAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmRybTo6VjFfMTo6RHJtTWV0cmljR3JvdXA+JiBwbHVnaW5NZXRyaWNzLAotICAgICAgICAgIG9zOjpQZXJzaXN0YWJsZUJ1bmRsZSogbWV0cmljc0J1bmRsZSk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8vIFRoaXMgaXMgdmlzaWJsZSBmb3IgdGVzdGluZyBvbmx5LgotICB2aXJ0dWFsIGludDY0X3QgR2V0Q3VycmVudFRpbWVNcygpOwotCi0gcHJpdmF0ZToKLSAgLy8gU2Vzc2lvbiBsaWZldGltZXMuIEEgcGFpciBvZiB2YWx1ZXMgcmVwcmVzZW50aW5nIHRoZSBtaWxsaXNlY29uZHMgc2luY2UKLSAgLy8gZXBvY2gsIFVUQy4gVGhlIGZpcnN0IHZhbHVlIGlzIHRoZSBzdGFydCB0aW1lLCB0aGUgc2Vjb25kIGlzIHRoZSBlbmQgdGltZS4KLSAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6cGFpcjxpbnQ2NF90LCBpbnQ2NF90Pj4gbVNlc3Npb25MaWZlc3BhbnM7Ci0KLSAgU3RyaW5nOCBtQXBwUGFja2FnZU5hbWU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIERSTV9NRVRSSUNTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybVNlc3Npb25NYW5hZ2VyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0RybVNlc3Npb25NYW5hZ2VyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMjcxOTkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9Ecm1TZXNzaW9uTWFuYWdlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgRFJNX1NFU1NJT05fTUFOQUdFUl9IXwotCi0jZGVmaW5lIERSTV9TRVNTSU9OX01BTkFHRVJfSF8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgRHJtU2Vzc2lvbk1hbmFnZXJUZXN0Owotc3RydWN0IERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U7Ci1zdHJ1Y3QgUHJvY2Vzc0luZm9JbnRlcmZhY2U7Ci0KLWJvb2wgaXNFcXVhbFNlc3Npb25JZChjb25zdCBWZWN0b3I8dWludDhfdD4gJnNlc3Npb25JZDEsIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkMik7Ci0KLXN0cnVjdCBTZXNzaW9uSW5mbyB7Ci0gICAgc3A8RHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZT4gZHJtOwotICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7Ci0gICAgaW50NjRfdCB0aW1lU3RhbXA7Ci19OwotCi10eXBlZGVmIFZlY3RvcjxTZXNzaW9uSW5mbyA+IFNlc3Npb25JbmZvczsKLXR5cGVkZWYgS2V5ZWRWZWN0b3I8aW50LCBTZXNzaW9uSW5mb3MgPiBQaWRTZXNzaW9uSW5mb3NNYXA7Ci0KLXN0cnVjdCBEcm1TZXNzaW9uTWFuYWdlciA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBzdGF0aWMgc3A8RHJtU2Vzc2lvbk1hbmFnZXI+IEluc3RhbmNlKCk7Ci0KLSAgICBEcm1TZXNzaW9uTWFuYWdlcigpOwotICAgIGV4cGxpY2l0IERybVNlc3Npb25NYW5hZ2VyKHNwPFByb2Nlc3NJbmZvSW50ZXJmYWNlPiBwcm9jZXNzSW5mbyk7Ci0KLSAgICB2b2lkIGFkZFNlc3Npb24oaW50IHBpZCwgY29uc3Qgc3A8RHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZT4mIGRybSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQpOwotICAgIHZvaWQgdXNlU2Vzc2lvbihjb25zdCBWZWN0b3I8dWludDhfdD4mIHNlc3Npb25JZCk7Ci0gICAgdm9pZCByZW1vdmVTZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKTsKLSAgICB2b2lkIHJlbW92ZURybShjb25zdCBzcDxEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlPiYgZHJtKTsKLSAgICBib29sIHJlY2xhaW1TZXNzaW9uKGludCBjYWxsaW5nUGlkKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkRybVNlc3Npb25NYW5hZ2VyKCk7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIERybVNlc3Npb25NYW5hZ2VyVGVzdDsKLQotICAgIGludDY0X3QgZ2V0VGltZV9sKCk7Ci0gICAgYm9vbCBnZXRMb3dlc3RQcmlvcml0eV9sKGludCogbG93ZXN0UHJpb3JpdHlQaWQsIGludCogbG93ZXN0UHJpb3JpdHkpOwotICAgIGJvb2wgZ2V0TGVhc3RVc2VkU2Vzc2lvbl9sKAotICAgICAgICAgICAgaW50IHBpZCwgc3A8RHJtU2Vzc2lvbkNsaWVudEludGVyZmFjZT4qIGRybSwgVmVjdG9yPHVpbnQ4X3Q+KiBzZXNzaW9uSWQpOwotCi0gICAgc3A8UHJvY2Vzc0luZm9JbnRlcmZhY2U+IG1Qcm9jZXNzSW5mbzsKLSAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwotICAgIFBpZFNlc3Npb25JbmZvc01hcCBtU2Vzc2lvbk1hcDsKLSAgICBpbnQ2NF90IG1UaW1lOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHJtU2Vzc2lvbk1hbmFnZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBEUk1fU0VTU0lPTl9NQU5BR0VSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEYXRhU291cmNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lEYXRhU291cmNlLmgKaW5kZXggMzg1OGY3OC4uNDNlMmI1MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRGF0YVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURhdGFTb3VyY2UuaApAQCAtNTAsOCArNTAsNiBAQAogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0RmxhZ3MoKSA9IDA7CiAgICAgLy8gZ2V0IGEgZGVzY3JpcHRpb24gb2YgdGhlIHNvdXJjZSwgZS5nLiB0aGUgdXJsIG9yIGZpbGVuYW1lIGl0IGlzIGJhc2VkIG9uCiAgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgPSAwOwotICAgIC8vIEluaXRpYWxpemUgRFJNIGFuZCByZXR1cm4gYSBEZWNyeXB0SGFuZGxlLgotICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqbWltZSkgPSAwOwogCiBwcml2YXRlOgogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKElEYXRhU291cmNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSURybS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRHJtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlOWViM2EuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JRHJtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxiaW5kZXIvSUludGVyZmFjZS5oPgotI2luY2x1ZGUgPGJpbmRlci9QZXJzaXN0YWJsZUJ1bmRsZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9kcm0vRHJtQVBJLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+Ci0jaW5jbHVkZSA8bWVkaWFkcm0vSURybUNsaWVudC5oPgotCi0jaWZuZGVmIEFORFJPSURfSURSTV9IXwotCi0jZGVmaW5lIEFORFJPSURfSURSTV9IXwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBU3RyaW5nOwotCi1zdHJ1Y3QgSURybSA6IHB1YmxpYyBJSW50ZXJmYWNlIHsKLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKERybSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgYm9vbCBpc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBTdHJpbmc4ICZtaW1lVHlwZSkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVQbHVnaW4oY29uc3QgdWludDhfdCB1dWlkWzE2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4ICZhcHBQYWNrYWdlTmFtZSkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZXN0cm95UGx1Z2luKCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuU2Vzc2lvbihEcm1QbHVnaW46OlNlY3VyaXR5TGV2ZWwgc2VjdXJpdHlMZXZlbCwKLSAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2Vzc2lvbklkKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNsb3NlU2Vzc2lvbihWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdAotICAgICAgICBnZXRLZXlSZXF1ZXN0KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmaW5pdERhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjb25zdCAmbWltZVR5cGUsIERybVBsdWdpbjo6S2V5VHlwZSBrZXlUeXBlLAotICAgICAgICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGNvbnN0ICZvcHRpb25hbFBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZyZXF1ZXN0LCBTdHJpbmc4ICZkZWZhdWx0VXJsLAotICAgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUgKmtleVJlcXVlc3RUeXBlKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVLZXlSZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJnJlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAma2V5U2V0SWQpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlS2V5cyhWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleVNldElkKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlc3RvcmVLZXlzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZrZXlTZXRJZCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBxdWVyeUtleVN0YXR1cyhWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICZpbmZvTWFwKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb3Zpc2lvblJlcXVlc3QoU3RyaW5nOCBjb25zdCAmY2VydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmNlcnRBdXRob3JpdHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAmZGVmYXVsVXJsKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByb3ZpZGVQcm92aXNpb25SZXNwb25zZShWZWN0b3I8dWludDhfdD4gY29uc3QgJnJlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmY2VydGlmaWNhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+ICZ3cmFwcGVkS2V5KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3BzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BzKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cmVTdG9wSWRzKExpc3Q8VmVjdG9yPHVpbnQ4X3Q+ID4gJnNlY3VyZVN0b3BJZHMpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNlY3VyZVN0b3AoVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZzc2lkLCBWZWN0b3I8dWludDhfdD4gJnNlY3VyZVN0b3ApID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZVNlY3VyZVN0b3BzKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NSZWxlYXNlKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTZWN1cmVTdG9wKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc3NpZCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlQWxsU2VjdXJlU3RvcHMoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEhkY3BMZXZlbHMoRHJtUGx1Z2luOjpIZGNwTGV2ZWwgKmNvbm5lY3RlZExldmVsLAotICAgICAgICAgICAgRHJtUGx1Z2luOjpIZGNwTGV2ZWwgKm1heExldmVsKQotICAgICAgICAgICAgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TnVtYmVyT2ZTZXNzaW9ucyh1aW50MzJfdCAqY3VycmVudFNlc3Npb25zLAotICAgICAgICAgICAgdWludDMyX3QgKm1heFNlc3Npb25zKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTZWN1cml0eUxldmVsKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgRHJtUGx1Z2luOjpTZWN1cml0eUxldmVsICpsZXZlbCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9wZXJ0eVN0cmluZyhTdHJpbmc4IGNvbnN0ICZuYW1lLCBTdHJpbmc4ICZ2YWx1ZSkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJvcGVydHlCeXRlQXJyYXkoU3RyaW5nOCBjb25zdCAmbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmdmFsdWUpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb3BlcnR5U3RyaW5nKFN0cmluZzggY29uc3QgJm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZ2YWx1ZSApIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzggY29uc3QgJm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJnZhbHVlKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldHJpY3Mob3M6OlBlcnNpc3RhYmxlQnVuZGxlICptZXRyaWNzKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldENpcGhlckFsZ29yaXRobShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZhbGdvcml0aG0pID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWFjQWxnb3JpdGhtKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggY29uc3QgJmFsZ29yaXRobSkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBlbmNyeXB0KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJml2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJm91dHB1dCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZWNyeXB0KFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJml2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJm91dHB1dCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzaWduKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJm1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiAmc2lnbmF0dXJlKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHZlcmlmeShWZWN0b3I8dWludDhfdD4gY29uc3QgJnNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJmtleUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gY29uc3QgJnNpZ25hdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZtYXRjaCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzaWduUlNBKFZlY3Rvcjx1aW50OF90PiBjb25zdCAmc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGNvbnN0ICZhbGdvcml0aG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3Rvcjx1aW50OF90PiBjb25zdCAmbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZ3cmFwcGVkS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8dWludDhfdD4gJnNpZ25hdHVyZSkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRMaXN0ZW5lcihjb25zdCBzcDxJRHJtQ2xpZW50PiYgbGlzdGVuZXIpID0gMDsKLQotcHJpdmF0ZToKLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJRHJtKTsKLX07Ci0KLXN0cnVjdCBCbkRybSA6IHB1YmxpYyBCbkludGVyZmFjZTxJRHJtPiB7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBvblRyYW5zYWN0KAotICAgICAgICAgICAgdWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsICZkYXRhLCBQYXJjZWwgKnJlcGx5LAotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLXByaXZhdGU6Ci0gICAgdm9pZCByZWFkVmVjdG9yKGNvbnN0IFBhcmNlbCAmZGF0YSwgVmVjdG9yPHVpbnQ4X3Q+ICZ2ZWN0b3IpIGNvbnN0OwotICAgIHZvaWQgd3JpdGVWZWN0b3IoUGFyY2VsICpyZXBseSwgVmVjdG9yPHVpbnQ4X3Q+IGNvbnN0ICZ2ZWN0b3IpIGNvbnN0OwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfSURSTV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaAppbmRleCA0NWU5NjIwLi41Y2UyY2RiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaApAQCAtMTcsNiArMTcsOCBAQAogI2lmbmRlZiBBTkRST0lEX0lNRURJQUVYVFJBQ1RPUlNFUlZJQ0VfSAogI2RlZmluZSBBTkRST0lEX0lNRURJQUVYVFJBQ1RPUlNFUlZJQ0VfSAogCisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKwogI2luY2x1ZGUgPGJpbmRlci9JSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CkBAIC0zMyw2ICszNSw4IEBACiAgICAgdmlydHVhbCBzcDxJTWVkaWFFeHRyYWN0b3I+IG1ha2VFeHRyYWN0b3IoY29uc3Qgc3A8SURhdGFTb3VyY2U+ICZzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpID0gMDsKIAogICAgIHZpcnR1YWwgc3A8SURhdGFTb3VyY2U+IG1ha2VJRGF0YVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgPSAwOworCisgICAgdmlydHVhbCBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IGdldFN1cHBvcnRlZFR5cGVzKCkgPSAwOwogfTsKIAogY2xhc3MgQm5NZWRpYUV4dHJhY3RvclNlcnZpY2U6IHB1YmxpYyBCbkludGVyZmFjZTxJTWVkaWFFeHRyYWN0b3JTZXJ2aWNlPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFQbGF5ZXJTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAppbmRleCAyMTdkZTE0Li5mMmUyMDYwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaApAQCAtMjYsMTEgKzI2LDExIEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXJDbGllbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFQbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFNZXRhZGF0YVJldHJpZXZlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKK2NsYXNzIElNZWRpYVBsYXllcjsKIGNsYXNzIElNZWRpYUNvZGVjTGlzdDsKIHN0cnVjdCBJTWVkaWFIVFRQU2VydmljZTsKIGNsYXNzIElNZWRpYVJlY29yZGVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFSZWNvcmRlci5oCmluZGV4IDM3OTAwMGUuLmY5YzU1N2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhUmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVJlY29yZGVyLmgKQEAgLTczLDcgKzczLDkgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcygKICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKSA9IDA7Ci0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JTWVkaWFTb3VyY2UuaAppbmRleCA3YTRiMWI5Li4zODFkZjI0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lNZWRpYVNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU1lZGlhU291cmNlLmgKQEAgLTEyNCwxMCArMTI0LDExIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtCaW5kZXJNZWRpYUJ1ZmZlcnMgPSA0OyAvLyBidWZmZXJzIG1hbmFnZWQgYnkgQm5NZWRpYVNvdXJjZQorICAgIC8vIGFsaWduIGJ1ZmZlciBjb3VudCB3aXRoIHZpZGVvIHJlcXVlc3Qgc2l6ZSBpbiBOdU1lZGlhRXh0cmFjdG9yOjpzZWxlY3RUcmFjaygpCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrQmluZGVyTWVkaWFCdWZmZXJzID0gODsgLy8gYnVmZmVycyBtYW5hZ2VkIGJ5IEJuTWVkaWFTb3VyY2UKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUcmFuc2ZlclNoYXJlZEFzU2hhcmVkVGhyZXNob2xkID0gNCAqIDEwMjQ7ICAvLyBpZiA+PSBzaGFyZWQsIGVsc2UgaW5saW5lCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVHJhbnNmZXJJbmxpbmVBc1NoYXJlZFRocmVzaG9sZCA9IDY0ICogMTAyNDsgLy8gaWYgPj0gc2hhcmVkLCBlbHNlIGlubGluZQotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0lubGluZU1heFRyYW5zZmVyID0gMjU2ICogMTAyNDsgLy8gQmluZGVyIHNpemUgbGltaXRlZCB0byBCSU5ERVJfVk1fU0laRS4KKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtUcmFuc2ZlcklubGluZUFzU2hhcmVkVGhyZXNob2xkID0gOCAqIDEwMjQ7IC8vIGlmID49IHNoYXJlZCwgZWxzZSBpbmxpbmUKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtJbmxpbmVNYXhUcmFuc2ZlciA9IDY0ICogMTAyNDsgLy8gQmluZGVyIHNpemUgbGltaXRlZCB0byBCSU5ERVJfVk1fU0laRS4KIAogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkJuTWVkaWFTb3VyY2UoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSU9NWC5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JT01YLmgKaW5kZXggZTY5YzAyZC4uN2U3YzJkMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JT01YLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JT01YLmgKQEAgLTQ3LDkgKzQ3LDggQEAKIAogdXNpbmcgaGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OklPbXhOb2RlOwogCi1jbGFzcyBJT01YIDogcHVibGljIElJbnRlcmZhY2UgeworY2xhc3MgSU9NWCA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKLSAgICBERUNMQVJFX01FVEFfSU5URVJGQUNFKE9NWCk7CiAKICAgICB0eXBlZGVmIHVpbnQzMl90IGJ1ZmZlcl9pZDsKIApAQCAtMjI0LDE0ICsyMjMsNiBAQAogfTsKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotY2xhc3MgQm5PTVggOiBwdWJsaWMgQm5JbnRlcmZhY2U8SU9NWD4gewotcHVibGljOgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgb25UcmFuc2FjdCgKLSAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsIGNvbnN0IFBhcmNlbCAmZGF0YSwgUGFyY2VsICpyZXBseSwKLSAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gMCk7Ci19OwotCiBjbGFzcyBCbk9NWE5vZGUgOiBwdWJsaWMgQm5JbnRlcmZhY2U8SU9NWE5vZGU+IHsKIHB1YmxpYzoKICAgICB2aXJ0dWFsIHN0YXR1c190IG9uVHJhbnNhY3QoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgKaW5kZXggMWU0ZjZkZS4uODk5MmY4YiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9JUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuaApAQCAtMzksMTEgKzM5LDE1IEBACiAKICAgICB2aXJ0dWFsIHZvaWQgYWRkUmVzb3VyY2UoCiAgICAgICAgICAgICBpbnQgcGlkLAorICAgICAgICAgICAgaW50IHVpZCwKICAgICAgICAgICAgIGludDY0X3QgY2xpZW50SWQsCiAgICAgICAgICAgICBjb25zdCBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBjbGllbnQsCiAgICAgICAgICAgICBjb25zdCBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gJnJlc291cmNlcykgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkIHJlbW92ZVJlc291cmNlKGludCBwaWQsIGludDY0X3QgY2xpZW50SWQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlUmVzb3VyY2UoaW50IHBpZCwgaW50NjRfdCBjbGllbnRJZCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzKSA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlQ2xpZW50KGludCBwaWQsIGludDY0X3QgY2xpZW50SWQpID0gMDsKIAogICAgIHZpcnR1YWwgYm9vbCByZWNsYWltUmVzb3VyY2UoCiAgICAgICAgICAgICBpbnQgY2FsbGluZ1BpZCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSkF1ZGlvQXR0cmlidXRlcy5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmgKaW5kZXggZmIxMTQzNS4uZWEwYWFhMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmgKQEAgLTI2LDggKzI2LDcgQEAKIHB1YmxpYzoKICAgICAvKiBDcmVhdGVzIGEgSmF2YSBBdWRpb0F0dHJpYnV0ZXMgb2JqZWN0LiAqLwogICAgIHN0YXRpYyBqb2JqZWN0IGNyZWF0ZUF1ZGlvQXR0cmlidXRlc09iaihKTklFbnYgKmVudiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190KiBwQXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMpIHsKIAogICAgICAgICBqY2xhc3MgakJ1aWxkZXJDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMkQnVpbGRlciIpOwogICAgICAgICBqbWV0aG9kSUQgakJ1aWxkZXJDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgIjxpbml0PiIsICIoKVYiKTsKQEAgLTU4LDExICs1Nyw2IEBACiAgICAgICAgICAgICAvLyBUT0RPOiBIYW5kbGUgdGhlICd0YWdzJyAoY2hhcltdIHRvIEhhc2hTZXQ8U3RyaW5nPikuCiAgICAgICAgICAgICAvLyBIb3cgdG8gcGFyc2UgdGhlIGNoYXJbXT8gSXMgdGhlcmUgYW55IGV4YW1wbGUgb2YgaXQ/CiAgICAgICAgICAgICAvLyBBbHNvLCB0aGUgYWRkVGFncygpIG1ldGhvZCBpcyBoaWRkZW4uCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBDYWxsIEF1ZGlvQXR0cmlidXRlcy5CdWlsZGVyLnNldExlZ2FjeVN0cmVhbVR5cGUoKS5idWlsZCgpCi0gICAgICAgICAgICBqbWV0aG9kSUQgalNldExlZ2FjeVN0cmVhbVR5cGUgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0TGVnYWN5U3RyZWFtVHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICIoSSlMYW5kcm9pZC9tZWRpYS9BdWRpb0F0dHJpYnV0ZXMkQnVpbGRlcjsiKTsKLSAgICAgICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqU2V0TGVnYWN5U3RyZWFtVHlwZSwgc3RyZWFtVHlwZSk7CiAgICAgICAgIH0KIAogICAgICAgICBqbWV0aG9kSUQgakJ1aWxkID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgImJ1aWxkIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSmV0UGxheWVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL0pldFBsYXllci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjU2OWJjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvSmV0UGxheWVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgSkVUUExBWUVSX0hfCi0jZGVmaW5lIEpFVFBMQVlFUl9IXwotCi0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi0jaW5jbHVkZSA8bGlic29uaXZveC9qZXQuaD4KLSNpbmNsdWRlIDxsaWJzb25pdm94L2Vhc190eXBlcy5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KLSNpbmNsdWRlIDxtZWRpYS9NaWRpSW9XcmFwcGVyLmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi10eXBlZGVmIHZvaWQgKCpqZXRldmVudF9jYWxsYmFjaykoaW50IGV2ZW50VHlwZSwgaW50IHZhbDEsIGludCB2YWwyLCB2b2lkICpjb29raWUpOwotCi1jbGFzcyBKZXRQbGF5ZXIgewotCi1wdWJsaWM6Ci0KLSAgICAvLyB0byBrZWVwIGluIHN5bmMgd2l0aCB0aGUgSmV0UGxheWVyIGNsYXNzIGNvbnN0YW50cwotICAgIC8vIGRlZmluZWQgaW4gZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9KZXRQbGF5ZXIuamF2YQotICAgIHN0YXRpYyBjb25zdCBpbnQgSkVUX0VWRU5UICAgICAgICAgICAgICAgICAgID0gMTsKLSAgICBzdGF0aWMgY29uc3QgaW50IEpFVF9VU0VSSURfVVBEQVRFICAgICAgICAgICA9IDI7Ci0gICAgc3RhdGljIGNvbnN0IGludCBKRVRfTlVNUVVFVUVEU0VHTUVOVF9VUERBVEUgPSAzOwotICAgIHN0YXRpYyBjb25zdCBpbnQgSkVUX1BBVVNFX1VQREFURSAgICAgICAgICAgID0gNDsKLQotICAgIEpldFBsYXllcih2b2lkICpqYXZhSmV0UGxheWVyLAotICAgICAgICAgICAgaW50IG1heFRyYWNrcyA9IDMyLAotICAgICAgICAgICAgaW50IHRyYWNrQnVmZmVyU2l6ZSA9IDEyMDApOwotICAgIH5KZXRQbGF5ZXIoKTsKLSAgICBpbnQgaW5pdCgpOwotICAgIGludCByZWxlYXNlKCk7Ci0KLSAgICBpbnQgbG9hZEZyb21GaWxlKGNvbnN0IGNoYXIqIHVybCk7Ci0gICAgaW50IGxvYWRGcm9tRkQoY29uc3QgaW50IGZkLCBjb25zdCBsb25nIGxvbmcgb2Zmc2V0LCBjb25zdCBsb25nIGxvbmcgbGVuZ3RoKTsKLSAgICBpbnQgY2xvc2VGaWxlKCk7Ci0gICAgaW50IHBsYXkoKTsKLSAgICBpbnQgcGF1c2UoKTsKLSAgICBpbnQgcXVldWVTZWdtZW50KGludCBzZWdtZW50TnVtLCBpbnQgbGliTnVtLCBpbnQgcmVwZWF0Q291bnQsIGludCB0cmFuc3Bvc2UsCi0gICAgICAgICAgICBFQVNfVTMyIG11dGVGbGFncywgRUFTX1U4IHVzZXJJRCk7Ci0gICAgaW50IHNldE11dGVGbGFncyhFQVNfVTMyIG11dGVGbGFncywgYm9vbCBzeW5jKTsKLSAgICBpbnQgc2V0TXV0ZUZsYWcoaW50IHRyYWNrTnVtLCBib29sIG11dGVGbGFnLCBib29sIHN5bmMpOwotICAgIGludCB0cmlnZ2VyQ2xpcChpbnQgY2xpcElkKTsKLSAgICBpbnQgY2xlYXJRdWV1ZSgpOwotCi0gICAgdm9pZCBzZXRFdmVudENhbGxiYWNrKGpldGV2ZW50X2NhbGxiYWNrIGNhbGxiYWNrKTsKLQotICAgIGludCBnZXRNYXhUcmFja3MoKSB7IHJldHVybiBtTWF4VHJhY2tzOyB9OwotCi0KLXByaXZhdGU6Ci0gICAgaW50ICAgICAgICAgICAgICAgICByZW5kZXIoKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgIGZpcmVVcGRhdGVPblN0YXR1c0NoYW5nZSgpOwotICAgIHZvaWQgICAgICAgICAgICAgICAgZmlyZUV2ZW50c0Zyb21KZXRRdWV1ZSgpOwotCi0gICAgSmV0UGxheWVyKCkge30gLy8gbm8gZGVmYXVsdCBjb25zdHJ1Y3RvcgotICAgIHZvaWQgZHVtcCgpOwotICAgIHZvaWQgZHVtcEpldFN0YXR1cyhTX0pFVF9TVEFUVVMqIHBKZXRTdGF0dXMpOwotCi0gICAgamV0ZXZlbnRfY2FsbGJhY2sgICBtRXZlbnRDYWxsYmFjazsKLQotICAgIHZvaWQqICAgICAgICAgICAgICAgbUphdmFKZXRQbGF5ZXJSZWY7Ci0gICAgTXV0ZXggICAgICAgICAgICAgICBtTXV0ZXg7IC8vIG11dGV4IHRvIHN5bmMgdGhlIHJlbmRlciBhbmQgcGxheWJhY2sgdGhyZWFkIHdpdGggdGhlIEpFVCBjYWxscwotICAgIHBpZF90ICAgICAgICAgICAgICAgbVRpZDsKLSAgICBDb25kaXRpb24gICAgICAgICAgIG1Db25kaXRpb247Ci0gICAgdm9sYXRpbGUgYm9vbCAgICAgICBtUmVuZGVyOwotICAgIGJvb2wgICAgICAgICAgICAgICAgbVBhdXNlZDsKLQotICAgIEVBU19TVEFURSAgICAgICAgICAgbVN0YXRlOwotICAgIGludCogICAgICAgICAgICAgICAgbU1lbUZhaWxlZFZhcjsKLQotICAgIGludCAgICAgICAgICAgICAgICAgbU1heFRyYWNrczsgLy8gbWF4IG51bWJlciBvZiBNSURJIHRyYWNrcywgdXN1YWxseSAzMgotICAgIEVBU19EQVRBX0hBTkRMRSAgICAgbUVhc0RhdGE7Ci0gICAgTWlkaUlvV3JhcHBlciogICAgICBtSW9XcmFwcGVyOwotICAgIEVBU19QQ00qICAgICAgICAgICAgbUF1ZGlvQnVmZmVyOy8vIEVBUyByZW5kZXJzIHRoZSBNSURJIGRhdGEgaW50byB0aGlzIGJ1ZmZlciwKLSAgICBzcDxBdWRpb1RyYWNrPiAgICAgIG1BdWRpb1RyYWNrOyAvLyBhbmQgd2UgcGxheSBpdCBpbiB0aGlzIGF1ZGlvIHRyYWNrCi0gICAgaW50ICAgICAgICAgICAgICAgICBtVHJhY2tCdWZmZXJTaXplOwotICAgIFNfSkVUX1NUQVRVUyAgICAgICAgbUpldFN0YXR1czsKLSAgICBTX0pFVF9TVEFUVVMgICAgICAgIG1QcmV2aW91c0pldFN0YXR1czsKLQotICAgIGNsYXNzIEpldFBsYXllclRocmVhZCA6IHB1YmxpYyBUaHJlYWQgewotICAgIHB1YmxpYzoKLSAgICAgICAgSmV0UGxheWVyVGhyZWFkKEpldFBsYXllciAqcGxheWVyKSA6IG1QbGF5ZXIocGxheWVyKSB7Ci0gICAgICAgIH0KLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgdmlydHVhbCB+SmV0UGxheWVyVGhyZWFkKCkge30KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIEpldFBsYXllciAqbVBsYXllcjsKLQotICAgICAgICBib29sIHRocmVhZExvb3AoKSB7Ci0gICAgICAgICAgICBpbnQgcmVzdWx0OwotICAgICAgICAgICAgcmVzdWx0ID0gbVBsYXllci0+cmVuZGVyKCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBKZXRQbGF5ZXJUaHJlYWQoY29uc3QgSmV0UGxheWVyVGhyZWFkICYpOwotICAgICAgICBKZXRQbGF5ZXJUaHJlYWQgJm9wZXJhdG9yPShjb25zdCBKZXRQbGF5ZXJUaHJlYWQgJik7Ci0gICAgfTsKLQotICAgIHNwPEpldFBsYXllclRocmVhZD4gbVRocmVhZDsKLQotfTsgLy8gZW5kIGNsYXNzIEpldFBsYXllcgotCi19IC8vIGVuZCBuYW1lc3BhY2UgYW5kcm9pZAotCi0KLQotI2VuZGlmIC8qSkVUUExBWUVSX0hfKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFDb2RlY0luZm8uaAppbmRleCBiMzc3N2QzLi41NGY1NjVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhQ29kZWNJbmZvLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYUNvZGVjSW5mby5oCkBAIC0zMCw2ICszMCw4IEBACiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IEFNZXNzYWdlOwpAQCAtNTEsMjEgKzUzLDQ3IEBACiAKICAgICBzdHJ1Y3QgQ2FwYWJpbGl0aWVzV3JpdGVyOwogCisgICAgZW51bSBBdHRyaWJ1dGVzIDogaW50MzJfdCB7CisgICAgICAgIC8vIGF0dHJpYnV0ZSBmbGFncworICAgICAgICBrRmxhZ0lzRW5jb2RlciA9IDEgPDwgMCwKKyAgICAgICAga0ZsYWdJc1ZlbmRvciA9IDEgPDwgMSwKKyAgICAgICAga0ZsYWdJc1NvZnR3YXJlT25seSA9IDEgPDwgMiwKKyAgICAgICAga0ZsYWdJc0hhcmR3YXJlQWNjZWxlcmF0ZWQgPSAxIDw8IDMsCisgICAgfTsKKwogICAgIHN0cnVjdCBDYXBhYmlsaXRpZXMgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgICAgIGVudW0gewotICAgICAgICAgICAgLy8gZGVjb2RlciBmbGFncwotICAgICAgICAgICAga0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2sgPSAxIDw8IDAsCi0gICAgICAgICAgICBrRmxhZ1N1cHBvcnRzU2VjdXJlUGxheWJhY2sgPSAxIDw8IDEsCi0gICAgICAgICAgICBrRmxhZ1N1cHBvcnRzVHVubmVsZWRQbGF5YmFjayA9IDEgPDwgMiwKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBjaGFyIEZFQVRVUkVfQURBUFRJVkVfUExBWUJBQ0tbXSA9ICJmZWF0dXJlLWFkYXB0aXZlLXBsYXliYWNrIjsKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBjaGFyIEZFQVRVUkVfRFlOQU1JQ19USU1FU1RBTVBbXSA9ICJmZWF0dXJlLWR5bmFtaWMtdGltZXN0YW1wIjsKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBjaGFyIEZFQVRVUkVfRlJBTUVfUEFSU0lOR1tdID0gImZlYXR1cmUtZnJhbWUtcGFyc2luZyI7CisgICAgICAgIGNvbnN0ZXhwciBzdGF0aWMgY2hhciBGRUFUVVJFX0lOVFJBX1JFRlJFU0hbXSA9ICJmZWF0dXJlLWZyYW1lLXBhcnNpbmciOworICAgICAgICBjb25zdGV4cHIgc3RhdGljIGNoYXIgRkVBVFVSRV9NVUxUSVBMRV9GUkFNRVNbXSA9ICJmZWF0dXJlLW11bHRpcGxlLWZyYW1lcyI7CisgICAgICAgIGNvbnN0ZXhwciBzdGF0aWMgY2hhciBGRUFUVVJFX1NFQ1VSRV9QTEFZQkFDS1tdID0gImZlYXR1cmUtc2VjdXJlLXBsYXliYWNrIjsKKyAgICAgICAgY29uc3RleHByIHN0YXRpYyBjaGFyIEZFQVRVUkVfVFVOTkVMRURfUExBWUJBQ0tbXSA9ICJmZWF0dXJlLXR1bm5lbGVkLXBsYXliYWNrIjsKIAotICAgICAgICAgICAgLy8gZW5jb2RlciBmbGFncwotICAgICAgICAgICAga0ZsYWdTdXBwb3J0c0ludHJhUmVmcmVzaCA9IDEgPDwgMCwKLQotICAgICAgICB9OwotCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdXBwb3J0ZWQgbGV2ZWxzIGZvciBlYWNoIHN1cHBvcnRlZCBwcm9maWxlIGluIGEgdGFyZ2V0IGFycmF5LgorICAgICAgICAgKgorICAgICAgICAgKiBAcGFyYW0gcHJvZmlsZUxldmVscyB0YXJnZXQgYXJyYXkgZm9yIHRoZSBwcm9maWxlIGxldmVscy4KKyAgICAgICAgICovCiAgICAgICAgIHZvaWQgZ2V0U3VwcG9ydGVkUHJvZmlsZUxldmVscyhWZWN0b3I8UHJvZmlsZUxldmVsPiAqcHJvZmlsZUxldmVscykgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgdGhlIHN1cHBvcnRlZCBjb2xvciBmb3JtYXRzIGluIGEgdGFyZ2V0IGFycmF5LiBPbmx5IHVzZWQgZm9yIHZpZGVvL2ltYWdlCisgICAgICAgICAqIGNvbXBvbmVudHMuCisgICAgICAgICAqCisgICAgICAgICAqIEBwYXJhbSBjb2xvckZvcm1hdHMgdGFyZ2V0IGFycmF5IGZvciB0aGUgY29sb3IgZm9ybWF0cy4KKyAgICAgICAgICovCiAgICAgICAgIHZvaWQgZ2V0U3VwcG9ydGVkQ29sb3JGb3JtYXRzKFZlY3Rvcjx1aW50MzJfdD4gKmNvbG9yRm9ybWF0cykgY29uc3Q7Ci0gICAgICAgIHVpbnQzMl90IGdldEZsYWdzKCkgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIFJldHVybnMgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY29kZWMgY2FwYWJpbGl0eS4KKyAgICAgICAgICoKKyAgICAgICAgICogVGhpcyBjb250YWluczoKKyAgICAgICAgICogLSBmZWF0dXJlcywKKyAgICAgICAgICogLSBwZXJmb3JtYW5jZSBkYXRhLgorICAgICAgICAgKgorICAgICAgICAgKiBUT0RPOiBleHBvc2UgdGhpcyBhcyBzZXBhcmF0ZSBBUEktcyBhbmQgd3JhcCBoZXJlLgorICAgICAgICAgKi8KICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+IGdldERldGFpbHMoKSBjb25zdDsKIAogICAgIHByb3RlY3RlZDoKQEAgLTczLDcgKzEwMSw2IEBACiAgICAgICAgIFNvcnRlZFZlY3RvcjxQcm9maWxlTGV2ZWw+IG1Qcm9maWxlTGV2ZWxzU29ydGVkOwogICAgICAgICBWZWN0b3I8dWludDMyX3Q+IG1Db2xvckZvcm1hdHM7CiAgICAgICAgIFNvcnRlZFZlY3Rvcjx1aW50MzJfdD4gbUNvbG9yRm9ybWF0c1NvcnRlZDsKLSAgICAgICAgdWludDMyX3QgbUZsYWdzOwogICAgICAgICBzcDxBTWVzc2FnZT4gbURldGFpbHM7CiAKICAgICAgICAgQ2FwYWJpbGl0aWVzKCk7CkBAIC05Myw4ICsxMjAsNyBAQAogICAgIC8qKgogICAgICAqIFRoaXMgY2xhc3MgaXMgdXNlZCBmb3IgbW9kaWZ5aW5nIGluZm9ybWF0aW9uIGluc2lkZSBhIGBDYXBhYmlsaXRpZXNgCiAgICAgICogb2JqZWN0LiBBbiBvYmplY3Qgb2YgdHlwZSBgQ2FwYWJpbGl0aWVzV3JpdGVyYCBjYW4gYmUgb2J0YWluZWQgYnkgY2FsbGluZwotICAgICAqIGBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6YWRkTWltZSgpYCBvcgotICAgICAqIGBNZWRpYUNvZGVjSW5mb1dyaXRlcjo6dXBkYXRlTWltZSgpYC4KKyAgICAgKiBgTWVkaWFDb2RlY0luZm9Xcml0ZXI6OmFkZE1lZGlhVHlwZSgpYC4KICAgICAgKi8KICAgICBzdHJ1Y3QgQ2FwYWJpbGl0aWVzV3JpdGVyIHsKICAgICAgICAgLyoqCkBAIC0xMjIsNiArMTQ4LDEzIEBACiAgICAgICAgICAqLwogICAgICAgICB2b2lkIGFkZERldGFpbChjb25zdCBjaGFyKiBrZXksIGludDMyX3QgdmFsdWUpOwogICAgICAgICAvKioKKyAgICAgICAgICogUmVtb3ZlcyBhIGtleS12YWx1ZSBwYWlyIGZyb20gdGhlIGxpc3Qgb2YgZGV0YWlscy4gSWYgdGhlIGtleSBpcyBub3QKKyAgICAgICAgICogcHJlc2VudCwgdGhpcyBjYWxsIGRvZXMgbm90aGluZy4KKyAgICAgICAgICoKKyAgICAgICAgICogQHBhcmFtIGtleSBUaGUga2V5LgorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCByZW1vdmVEZXRhaWwoY29uc3QgY2hhcioga2V5KTsKKyAgICAgICAgLyoqCiAgICAgICAgICAqIEFkZCBhIHByb2ZpbGUtbGV2ZWwgcGFpci4gSWYgdGhpcyBwcm9maWxlLWxldmVsIHBhaXIgYWxyZWFkeSBleGlzdHMsCiAgICAgICAgICAqIGl0IHdpbGwgYmUgaWdub3JlZC4KICAgICAgICAgICoKQEAgLTEzNiwxMyArMTY5LDcgQEAKICAgICAgICAgICogQHBhcmFtIGZvcm1hdCBUaGUgY29sb3IgZm9ybWF0LgogICAgICAgICAgKi8KICAgICAgICAgdm9pZCBhZGRDb2xvckZvcm1hdCh1aW50MzJfdCBmb3JtYXQpOwotICAgICAgICAvKioKLSAgICAgICAgICogQWRkIGZsYWdzLiBUaGUgdW5kZXJseWluZyBvcGVyYXRpb24gaXMgYml0d2lzZS1vci4gSW4gb3RoZXIgd29yZHMsCi0gICAgICAgICAqIGJpdHMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiBzZXQgd2lsbCBiZSBpZ25vcmVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZmxhZ3MgVGhlIGFkZGl0aW9uYWwgZmxhZ3MuCi0gICAgICAgICAqLwotICAgICAgICB2b2lkIGFkZEZsYWdzKHVpbnQzMl90IGZsYWdzKTsKKwogICAgIHByaXZhdGU6CiAgICAgICAgIC8qKgogICAgICAgICAgKiBUaGUgYXNzb2NpYXRlZCBgQ2FwYWJpbGl0aWVzYCBvYmplY3QuCkBAIC0xNTgsMTkgKzE4NSw0MiBAQAogICAgICAgICBmcmllbmQgTWVkaWFDb2RlY0luZm9Xcml0ZXI7CiAgICAgfTsKIAotICAgIGJvb2wgaXNFbmNvZGVyKCkgY29uc3Q7Ci0gICAgdm9pZCBnZXRTdXBwb3J0ZWRNaW1lcyhWZWN0b3I8QVN0cmluZz4gKm1pbWVzKSBjb25zdDsKLSAgICBjb25zdCBzcDxDYXBhYmlsaXRpZXM+IGdldENhcGFiaWxpdGllc0Zvcihjb25zdCBjaGFyICptaW1lKSBjb25zdDsKKyAgICBpbmxpbmUgYm9vbCBpc0VuY29kZXIoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBnZXRBdHRyaWJ1dGVzKCkgJiBrRmxhZ0lzRW5jb2RlcjsKKyAgICB9CisKKyAgICBBdHRyaWJ1dGVzIGdldEF0dHJpYnV0ZXMoKSBjb25zdDsKKyAgICB2b2lkIGdldFN1cHBvcnRlZE1lZGlhVHlwZXMoVmVjdG9yPEFTdHJpbmc+ICptZWRpYVR5cGVzKSBjb25zdDsKKyAgICBjb25zdCBzcDxDYXBhYmlsaXRpZXM+IGdldENhcGFiaWxpdGllc0Zvcihjb25zdCBjaGFyICptZWRpYVR5cGUpIGNvbnN0OwogICAgIGNvbnN0IGNoYXIgKmdldENvZGVjTmFtZSgpIGNvbnN0OwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyBhIHZlY3RvciBjb250YWluaW5nIGFsdGVybmF0ZSBuYW1lcyBmb3IgdGhlIGNvZGVjLgorICAgICAqCisgICAgICogXHBhcmFtIGFsaWFzZXMgdGhlIGRlc3RpbmF0aW9uIGFycmF5IGZvciB0aGUgYWxpYXNlcy4gVGhpcyBpcyBjbGVhcmVkLgorICAgICAqCisgICAgICogTXVsdGlwbGUgY29kZWNzIG1heSBzaGFyZSBhbHRlcm5hdGUgbmFtZXMgYXMgbG9uZyBhcyB0aGVpciBzdXBwb3J0ZWQgbWVkaWEgdHlwZXMgYXJlCisgICAgICogZGlzdGluY3Q7IGhvd2V2ZXIsIHRoZXNlIHdpbGwgcmVzdWx0IGluIGRpZmZlcmVudCBhbGlhc2VzIGZvciB0aGUgTWVkaWFDb2RlYyB1c2VyIGFzCisgICAgICogdGhlIGNhbm9uaWNhbCBjb2RlYyBoYXMgdG8gYmUgcmVzb2x2ZWQgd2l0aG91dCBrbm93aW5nIHRoZSBtZWRpYSB0eXBlIGluCisgICAgICogTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lLgorICAgICAqLworICAgIHZvaWQgZ2V0QWxpYXNlcyhWZWN0b3I8QVN0cmluZz4gKmFsaWFzZXMpIGNvbnN0OworCisgICAgLyoqCiAgICAgICogUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlIHRoYXQgaG9zdHMgdGhlIGNvZGVjLiBUaGlzIHZhbHVlIGlzIG5vdAogICAgICAqIHZpc2libGUgYXQgdGhlIEphdmEgbGV2ZWwuCiAgICAgICoKICAgICAgKiBDdXJyZW50bHksIHRoaXMgaXMgdGhlICJpbnN0YW5jZSBuYW1lIiBvZiB0aGUgSU9teCBzZXJ2aWNlLgogICAgICAqLwogICAgIGNvbnN0IGNoYXIgKmdldE93bmVyTmFtZSgpIGNvbnN0OwotICAgIHVpbnQzMl90IHJhbmsoKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIFJldHVybnMgdGhlIHJhbmsgb2YgdGhlIGNvbXBvbmVudC4KKyAgICAgKgorICAgICAqIFRlY2huaWNhbGx5IHRoaXMgaXMgZGVmaW5lZCB0byBiZSBwZXIgbWVkaWEgdHlwZSwgYnV0IHRoYXQgbWFrZXMgb3JkZXJpbmcgdGhlIE1lZGlhQ29kZWNMaXN0CisgICAgICogaW1wb3NzaWJsZSBhcyBNZWRpYUNvZGVjTGlzdCBpcyBvcmRlcmVkIGJ5IGNvZGVjIG5hbWUuCisgICAgICovCisgICAgdWludDMyX3QgZ2V0UmFuaygpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogU2VyaWFsaXphdGlvbiBvdmVyIEJpbmRlcgpAQCAtMTgxLDExICsyMzEsMTIgQEAKIHByaXZhdGU6CiAgICAgQVN0cmluZyBtTmFtZTsKICAgICBBU3RyaW5nIG1Pd25lcjsKLSAgICBib29sIG1Jc0VuY29kZXI7CisgICAgQXR0cmlidXRlcyBtQXR0cmlidXRlczsKICAgICBLZXllZFZlY3RvcjxBU3RyaW5nLCBzcDxDYXBhYmlsaXRpZXM+ID4gbUNhcHM7CisgICAgVmVjdG9yPEFTdHJpbmc+IG1BbGlhc2VzOwogICAgIHVpbnQzMl90IG1SYW5rOwogCi0gICAgc3NpemVfdCBnZXRDYXBhYmlsaXR5SW5kZXgoY29uc3QgY2hhciAqbWltZSkgY29uc3Q7CisgICAgc3NpemVfdCBnZXRDYXBhYmlsaXR5SW5kZXgoY29uc3QgY2hhciAqbWVkaWFUeXBlKSBjb25zdDsKIAogICAgIC8qKgogICAgICAqIENvbnN0cnVjdCBhbiBgTWVkaWFDb2RlY0luZm9gIG9iamVjdC4gQWZ0ZXIgdGhlIGNvbnN0cnVjdGlvbiwgaXRzCkBAIC0yMTksNiArMjcwLDEzIEBACiAgICAgICovCiAgICAgdm9pZCBzZXROYW1lKGNvbnN0IGNoYXIqIG5hbWUpOwogICAgIC8qKgorICAgICAqIEFkZHMgYW4gYWxpYXMgKGFsdGVybmF0ZSBuYW1lKSBmb3IgdGhlIGNvZGVjLiBNdWx0aXBsZSBjb2RlY3MgY2FuIHNoYXJlIGFuIGFsdGVybmF0ZSBuYW1lCisgICAgICogYXMgbG9uZyBhcyB0aGVpciBzdXBwb3J0ZWQgbWVkaWEgdHlwZXMgYXJlIGRpc3RpbmN0LgorICAgICAqCisgICAgICogQHBhcmFtIG5hbWUgYW4gYWx0ZXJuYXRlIG5hbWUuCisgICAgICovCisgICAgdm9pZCBhZGRBbGlhcyhjb25zdCBjaGFyKiBuYW1lKTsKKyAgICAvKioKICAgICAgKiBTZXQgdGhlIG93bmVyIG5hbWUgb2YgdGhlIGNvZGVjLgogICAgICAqCiAgICAgICogVGhpcyAib3duZXIgbmFtZSIgaXMgdGhlIG5hbWUgb2YgdGhlIGBJT214YCBpbnN0YW5jZSB0aGF0IHN1cHBvcnRzIHRoaXMKQEAgLTIyOCwzMiArMjg2LDMyIEBACiAgICAgICovCiAgICAgdm9pZCBzZXRPd25lcihjb25zdCBjaGFyKiBvd25lcik7CiAgICAgLyoqCi0gICAgICogU2V0IHdoZXRoZXIgdGhpcyBjb2RlYyBpcyBhbiBlbmNvZGVyIG9yIGEgZGVjb2Rlci4KKyAgICAgKiBTZXRzIGNvZGVjIGF0dHJpYnV0ZXMuCiAgICAgICoKLSAgICAgKiBAcGFyYW0gaXNFbmNvZGVyIFdoZXRoZXIgdGhpcyBjb2RlYyBpcyBhbiBlbmNvZGVyIG9yIGEgZGVjb2Rlci4KKyAgICAgKiBAcGFyYW0gYXR0cmlidXRlcyBDb2RlYyBhdHRyaWJ1dGVzLgogICAgICAqLwotICAgIHZvaWQgc2V0RW5jb2Rlcihib29sIGlzRW5jb2RlciA9IHRydWUpOworICAgIHZvaWQgc2V0QXR0cmlidXRlcyh0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxNZWRpYUNvZGVjSW5mbzo6QXR0cmlidXRlcz46OnR5cGUgYXR0cmlidXRlcyk7CiAgICAgLyoqCi0gICAgICogQWRkIGEgbWltZSB0byBhbiBpbmRleGVkIGxpc3QgYW5kIHJldHVybiBhIGBDYXBhYmlsaXRpZXNXcml0ZXJgIG9iamVjdAorICAgICAqIEFkZCBhIG1lZGlhIHR5cGUgdG8gYW4gaW5kZXhlZCBsaXN0IGFuZCByZXR1cm4gYSBgQ2FwYWJpbGl0aWVzV3JpdGVyYCBvYmplY3QKICAgICAgKiB0aGF0IGNhbiBiZSB1c2VkIGZvciBtb2RpZnlpbmcgdGhlIGFzc29jaWF0ZWQgYENhcGFiaWxpdGllc2AuCiAgICAgICoKLSAgICAgKiBJZiB0aGUgbWltZSBhbHJlYWR5IGV4aXN0cywgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0aGUKLSAgICAgKiBgQ2FwYWJpbGl0aWVzV3JpdGVyYCBhc3NvY2lhdGVkIHdpdGggdGhlIG1pbWUuCisgICAgICogSWYgdGhlIG1lZGlhIHR5cGUgYWxyZWFkeSBleGlzdHMsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdGhlCisgICAgICogYENhcGFiaWxpdGllc1dyaXRlcmAgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZWRpYSB0eXBlLgogICAgICAqCi0gICAgICogQHBhcmFtW2luXSBtaW1lIFRoZSBuYW1lIG9mIGEgbmV3IG1pbWUgdG8gYWRkLgorICAgICAqIEBwYXJhbVtpbl0gbWVkaWFUeXBlIFRoZSBuYW1lIG9mIGEgbmV3IG1lZGlhIHR5cGUgdG8gYWRkLgogICAgICAqIEByZXR1cm4gd3JpdGVyIFRoZSBgQ2FwYWJpbGl0aWVzV3JpdGVyYCBvYmplY3QgZm9yIG1vZGlmeWluZyB0aGUKLSAgICAgKiBgQ2FwYWJpbGl0aWVzYCBhc3NvY2lhdGVkIHdpdGggdGhlIG1pbWUuIGB3cml0ZXJgIHdpbGwgYmUgdmFsaWQKLSAgICAgKiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYG1pbWVgIGFscmVhZHkgZXhpc3RzIG9yIG5vdC4KKyAgICAgKiBgQ2FwYWJpbGl0aWVzYCBhc3NvY2lhdGVkIHdpdGggdGhlIG1lZGlhIHR5cGUuIGB3cml0ZXJgIHdpbGwgYmUgdmFsaWQKKyAgICAgKiByZWdhcmRsZXNzIG9mIHdoZXRoZXIgYG1lZGlhVHlwZWAgYWxyZWFkeSBleGlzdHMgb3Igbm90LgogICAgICAqLwotICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzV3JpdGVyPiBhZGRNaW1lKAotICAgICAgICAgICAgY29uc3QgY2hhciogbWltZSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXNXcml0ZXI+IGFkZE1lZGlhVHlwZSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1lZGlhVHlwZSk7CiAgICAgLyoqCi0gICAgICogUmVtb3ZlIGEgbWltZS4KKyAgICAgKiBSZW1vdmUgYSBtZWRpYSB0eXBlLgogICAgICAqCi0gICAgICogQHBhcmFtIG1pbWUgVGhlIG5hbWUgb2YgdGhlIG1pbWUgdG8gcmVtb3ZlLgotICAgICAqIEByZXR1cm4gYHRydWVgIGlmIGBtaW1lYCBpcyByZW1vdmVkOyBgZmFsc2VgIGlmIGBtaW1lYCBpcyBub3QgZm91bmQuCisgICAgICogQHBhcmFtIG1lZGlhVHlwZSBUaGUgbmFtZSBvZiB0aGUgbWVkaWEgdHlwZSB0byByZW1vdmUuCisgICAgICogQHJldHVybiBgdHJ1ZWAgaWYgYG1lZGlhVHlwZWAgaXMgcmVtb3ZlZDsgYGZhbHNlYCBpZiBgbWVkaWFUeXBlYCBpcyBub3QgZm91bmQuCiAgICAgICovCi0gICAgYm9vbCByZW1vdmVNaW1lKGNvbnN0IGNoYXIqIG1pbWUpOworICAgIGJvb2wgcmVtb3ZlTWVkaWFUeXBlKGNvbnN0IGNoYXIqIG1lZGlhVHlwZSk7CiAgICAgLyoqCiAgICAgICogU2V0IHJhbmsgb2YgdGhlIGNvZGVjLiBNZWRpYUNvZGVjTGlzdCB3aWxsIHN0YWJsZS1zb3J0IHRoZSBsaXN0IGFjY29yZGluZwogICAgICAqIHRvIHJhbmsgaW4gbm9uLWRlc2NlbmRpbmcgb3JkZXIuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUHJvZmlsZXMuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCmluZGV4IDBmZWI0ZjMuLjRjYzViOTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFQcm9maWxlcy5oCkBAIC0xLDE4ICsxLDE4IEBACiAvKgotICoqCi0gKiogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QuCi0gKioKLSAqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKioKLSAqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKioKLSAqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICogQ29weXJpZ2h0IDIwMTAsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAogI2lmbmRlZiBBTkRST0lEX01FRElBUFJPRklMRVNfSApAQCAtMzQsNyArMzQsMTEgQEAKICAgICBDQU1DT1JERVJfUVVBTElUWV8xMDgwUCA9IDYsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfUVZHQSA9IDcsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfMjE2MFAgPSA4LAotICAgIENBTUNPUkRFUl9RVUFMSVRZX0xJU1RfRU5EID0gOCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9WR0EgPSA5LAorICAgIENBTUNPUkRFUl9RVUFMSVRZXzRLRENJID0gMTAsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfUUhEID0gMTEsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfMmsgPSAxMiwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9MSVNUX0VORCA9IDEyLAogCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MSVNUX1NUQVJUID0gMTAwMCwKICAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX0xPVyAgPSAxMDAwLApAQCAtNDYsNyArNTAsMTEgQEAKICAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzEwODBQID0gMTAwNiwKICAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX1FWR0EgPSAxMDA3LAogICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfMjE2MFAgPSAxMDA4LAotICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfTElTVF9FTkQgPSAxMDA4LAorICAgIENBTUNPUkRFUl9RVUFMSVRZX1RJTUVfTEFQU0VfVkdBID0gMTAwOSwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFXzRLRENJID0gMTAxMCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9USU1FX0xBUFNFX1FIRCA9IDEwMTEsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV8yayA9IDEwMTIsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfVElNRV9MQVBTRV9MSVNUX0VORCA9IDEwMTIsCiAKICAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0xJU1RfU1RBUlQgPSAyMDAwLAogICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfTE9XICA9IDIwMDAsCkBAIC01NSw3ICs2MywxMCBAQAogICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfNzIwUCA9IDIwMDMsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF8xMDgwUCA9IDIwMDQsCiAgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF8yMTYwUCA9IDIwMDUsCi0gICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9MSVNUX0VORCA9IDIwMDUsCisgICAgQ0FNQ09SREVSX1FVQUxJVFlfSElHSF9TUEVFRF9DSUYgPSAyMDA2LAorICAgIENBTUNPUkRFUl9RVUFMSVRZX0hJR0hfU1BFRURfVkdBID0gMjAwNywKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEXzRLRENJID0gMjAwOCwKKyAgICBDQU1DT1JERVJfUVVBTElUWV9ISUdIX1NQRUVEX0xJU1RfRU5EID0gMjAwOCwKIH07CiAKIGVudW0gdmlkZW9fZGVjb2RlciB7CkBAIC03MSwyOSArODIsMTIgQEAKIHsKIHB1YmxpYzoKIAotICAgIC8qCi0gICAgICogSWYgcHJvcGVydHkgbWVkaWEuc2V0dGluZ3MueG1sIGlzIG5vdCBzZXQ6Ci0gICAgICoKLSAgICAgKiBnZXRJbnN0YW5jZSgpIHdpbGwgc2VhcmNoIHRocm91Z2ggcGF0aHMgbGlzdGVkIGluIHhtbEZpbGVzLgotICAgICAqIFRoZSBzZWFyY2ggZ29lcyB0aHJvdWdoIG1lbWJlcnMgb2YgeG1sRmlsZXMgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSBhcmUKLSAgICAgKiBkZWZpbmVkLCBzbyBmaWxlcyBhdCBsb3dlciBpbmRpY2VzIGhhdmUgaGlnaGVyIHByaW9yaXR5IHRoYW4gdGhvc2UgYXQKLSAgICAgKiBoaWdoZXIgaW5kaWNlcy4KLSAgICAgKgotICAgICAqIFRPRE86IEFkZCBydW50aW1lIHZhbGlkYXRpb24gb2YgeG1sIGZpbGVzLiBBIHNlYXJjaCBzaG91bGQgYmUgY29uc2lkZXJlZAotICAgICAqIHN1Y2Nlc3NmdWwgb25seSB3aGVuIHZhbGlkYXRpb24gaXMgc3VjY2Vzc2Z1bC4KLSAgICAgKi8KLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIgY29uc3QgKiBjb25zdCB4bWxGaWxlc1tdID0gewotICAgICAgICAgICAgIm9kbS9ldGMvbWVkaWFfcHJvZmlsZXNfVjFfMC54bWwiLAotICAgICAgICAgICAgInZlbmRvci9ldGMvbWVkaWFfcHJvZmlsZXNfVjFfMC54bWwiLAotICAgICAgICAgICAgInN5c3RlbS9ldGMvbWVkaWFfcHJvZmlsZXMueG1sIgotICAgICAgICAgICAgfTsKLQogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIHNpbmdsZXRvbiBpbnN0YW5jZSBmb3Igc3Vic2VxdWVuY2UgcXVlcmllcyBvciBOVUxMIGlmIGVycm9yLgogICAgICAqCiAgICAgICogSWYgcHJvcGVydHkgbWVkaWEuc2V0dGluZ3MueG1sIGlzIHNldCwgZ2V0SW5zdGFuY2UoKSB3aWxsIGF0dGVtcHQgdG8gcmVhZAogICAgICAqIGZyb20gZmlsZSBwYXRoIGluIG1lZGlhLnNldHRpbmdzLnhtbC4gT3RoZXJ3aXNlLCBnZXRJbnN0YW5jZSgpIHdpbGwKLSAgICAgKiBzZWFyY2ggdGhyb3VnaCB0aGUgbGlzdCB4bWxGaWxlcyBhcyBkZXNjcmliZWQgYWJvdmUuCisgICAgICogc2VhcmNoIHRocm91Z2ggdGhlIGxpc3Qgb2YgcHJlc2V0IFhNTCBmaWxlIHBhdGhzLgogICAgICAqCiAgICAgICogSWYgdGhlIHNlYXJjaCBpcyB1bnN1Y2Nlc3NmdWwsIHRoZSBkZWZhdWx0IGluc3RhbmNlIHdpbGwgYmUgY3JlYXRlZAogICAgICAqIGluc3RlYWQuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVjb3JkZXJCYXNlLmgKaW5kZXggNTM0MGRkZS4uYTJkZmYzMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NZWRpYVJlY29yZGVyQmFzZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZWNvcmRlckJhc2UuaApAQCAtNzIsNiArNzIsOSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKAogICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBjb25zdCA9IDA7CiAKIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01lZGlhUmVzb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZXNvdXJjZS5oCmluZGV4IGUxZmRiOWIuLmU5Njg0ZjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZXNvdXJjZS5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvTWVkaWFSZXNvdXJjZS5oCkBAIC0yMCw2ICsyMCw3IEBACiAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMSwxNyArMzIsMjAgQEAKICAgICAgICAga05vblNlY3VyZUNvZGVjLAogICAgICAgICBrR3JhcGhpY01lbW9yeSwKICAgICAgICAga0NwdUJvb3N0LAorICAgICAgICBrQmF0dGVyeSwKKyAgICAgICAga0RybVNlc3Npb24sCiAgICAgfTsKIAogICAgIGVudW0gU3ViVHlwZSB7CiAgICAgICAgIGtVbnNwZWNpZmllZFN1YlR5cGUgPSAwLAogICAgICAgICBrQXVkaW9Db2RlYywKLSAgICAgICAga1ZpZGVvQ29kZWMKKyAgICAgICAga1ZpZGVvQ29kZWMsCiAgICAgfTsKIAogICAgIE1lZGlhUmVzb3VyY2UoKTsKICAgICBNZWRpYVJlc291cmNlKFR5cGUgdHlwZSwgdWludDY0X3QgdmFsdWUpOwogICAgIE1lZGlhUmVzb3VyY2UoVHlwZSB0eXBlLCBTdWJUeXBlIHN1YlR5cGUsIHVpbnQ2NF90IHZhbHVlKTsKKyAgICBNZWRpYVJlc291cmNlKFR5cGUgdHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4gJmlkLCB1aW50NjRfdCB2YWx1ZSk7CiAKICAgICB2b2lkIHJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKTsKICAgICB2b2lkIHdyaXRlVG9QYXJjZWwoUGFyY2VsICpwYXJjZWwpIGNvbnN0OwpAQCAtNTQsNiArNTgsOCBAQAogICAgIFR5cGUgbVR5cGU7CiAgICAgU3ViVHlwZSBtU3ViVHlwZTsKICAgICB1aW50NjRfdCBtVmFsdWU7CisgICAgLy8gZm9yIGtEcm1TZXNzaW9uLXR5cGUgbUlkIGlzIHRoZSB1bmlxdWUgc2Vzc2lvbiBpZCBvYnRhaW5lZCB2aWEgTWVkaWFEcm0jb3BlblNlc3Npb24KKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtSWQ7CiB9OwogCiBpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nKE1lZGlhUmVzb3VyY2U6OlR5cGUgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgewpAQCAtNjIsNiArNjgsOSBAQAogICAgICAgICBjYXNlIE1lZGlhUmVzb3VyY2U6OmtTZWN1cmVDb2RlYzogICAgcmV0dXJuICJzZWN1cmUtY29kZWMiOwogICAgICAgICBjYXNlIE1lZGlhUmVzb3VyY2U6OmtOb25TZWN1cmVDb2RlYzogcmV0dXJuICJub24tc2VjdXJlLWNvZGVjIjsKICAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjprR3JhcGhpY01lbW9yeTogIHJldHVybiAiZ3JhcGhpYy1tZW1vcnkiOworICAgICAgICBjYXNlIE1lZGlhUmVzb3VyY2U6OmtDcHVCb29zdDogICAgICAgcmV0dXJuICJjcHUtYm9vc3QiOworICAgICAgICBjYXNlIE1lZGlhUmVzb3VyY2U6OmtCYXR0ZXJ5OiAgICAgICAgcmV0dXJuICJiYXR0ZXJ5IjsKKyAgICAgICAgY2FzZSBNZWRpYVJlc291cmNlOjprRHJtU2Vzc2lvbjogICAgIHJldHVybiAiZHJtLXNlc3Npb24iOwogICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKICAgICB9CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlEZXZpY2VJbmZvLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlEZXZpY2VJbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNGEyNDEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NaWRpRGV2aWNlSW5mby5oCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9NRURJQV9NSURJX0RFVklDRV9JTkZPX0gKLSNkZWZpbmUgQU5EUk9JRF9NRURJQV9NSURJX0RFVklDRV9JTkZPX0gKLQotI2luY2x1ZGUgPGJpbmRlci9QYXJjZWxhYmxlLmg+Ci0jaW5jbHVkZSA8YmluZGVyL1BlcnNpc3RhYmxlQnVuZGxlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLW5hbWVzcGFjZSBtaWRpIHsKLQotY2xhc3MgTWlkaURldmljZUluZm8gOiBwdWJsaWMgUGFyY2VsYWJsZSB7Ci1wdWJsaWM6Ci0gICAgTWlkaURldmljZUluZm8oKSA9IGRlZmF1bHQ7Ci0gICAgdmlydHVhbCB+TWlkaURldmljZUluZm8oKSA9IGRlZmF1bHQ7Ci0gICAgTWlkaURldmljZUluZm8oY29uc3QgTWlkaURldmljZUluZm8mIG1pZGlEZXZpY2VJbmZvKSA9IGRlZmF1bHQ7Ci0KLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCogcGFyY2VsKSBjb25zdCBvdmVycmlkZTsKLSAgICBzdGF0dXNfdCByZWFkRnJvbVBhcmNlbChjb25zdCBQYXJjZWwqIHBhcmNlbCkgb3ZlcnJpZGU7Ci0KLSAgICBpbnQgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1UeXBlOyB9Ci0gICAgaW50IGdldFVpZCgpIGNvbnN0IHsgcmV0dXJuIG1JZDsgfQotICAgIGJvb2wgaXNQcml2YXRlKCkgY29uc3QgeyByZXR1cm4gbUlzUHJpdmF0ZTsgfQotICAgIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGdldElucHV0UG9ydE5hbWVzKCkgY29uc3QgeyByZXR1cm4gbUlucHV0UG9ydE5hbWVzOyB9Ci0gICAgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgIGdldE91dHB1dFBvcnROYW1lcygpIGNvbnN0IHsgcmV0dXJuIG1PdXRwdXRQb3J0TmFtZXM7IH0KLSAgICBTdHJpbmcxNiBnZXRQcm9wZXJ0eShjb25zdCBjaGFyKiBwcm9wZXJ0eU5hbWUpOwotCi0gICAgLy8gVGhlIGNvbnN0YW50cyBuZWVkIHRvIGJlIGtlcHQgaW4gc3luYyB3aXRoIE1pZGlEZXZpY2VJbmZvLmphdmEKLSAgICBlbnVtIHsKLSAgICAgICAgVFlQRV9VU0IgPSAxLAotICAgICAgICBUWVBFX1ZJUlRVQUwgPSAyLAotICAgICAgICBUWVBFX0JMVUVUT09USCA9IDMsCi0gICAgfTsKLSAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgUFJPUEVSVFlfTkFNRTsKLSAgICBzdGF0aWMgY29uc3QgY2hhciogY29uc3QgUFJPUEVSVFlfTUFOVUZBQ1RVUkVSOwotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBQUk9QRVJUWV9QUk9EVUNUOwotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBQUk9QRVJUWV9WRVJTSU9OOwotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBQUk9QRVJUWV9TRVJJQUxfTlVNQkVSOwotICAgIHN0YXRpYyBjb25zdCBjaGFyKiBjb25zdCBQUk9QRVJUWV9BTFNBX0NBUkQ7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIqIGNvbnN0IFBST1BFUlRZX0FMU0FfREVWSUNFOwotCi0gICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNaWRpRGV2aWNlSW5mbyYgbGhzLCBjb25zdCBNaWRpRGV2aWNlSW5mbyYgcmhzKTsKLSAgICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1pZGlEZXZpY2VJbmZvJiBsaHMsIGNvbnN0IE1pZGlEZXZpY2VJbmZvJiByaHMpIHsKLSAgICAgICAgcmV0dXJuICEobGhzID09IHJocyk7Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHN0YXR1c190IHJlYWRTdHJpbmdWZWN0b3IoCi0gICAgICAgICAgICBjb25zdCBQYXJjZWwqIHBhcmNlbCwgVmVjdG9yPFN0cmluZzE2PiAqdmVjdG9yUHRyLCBzaXplX3QgZGVmYXVsdExlbmd0aCk7Ci0gICAgc3RhdHVzX3Qgd3JpdGVTdHJpbmdWZWN0b3IoUGFyY2VsKiBwYXJjZWwsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIHZlY3RvcikgY29uc3Q7Ci0KLSAgICBpbnQzMl90IG1UeXBlOwotICAgIGludDMyX3QgbUlkOwotICAgIFZlY3RvcjxTdHJpbmcxNj4gbUlucHV0UG9ydE5hbWVzOwotICAgIFZlY3RvcjxTdHJpbmcxNj4gbU91dHB1dFBvcnROYW1lczsKLSAgICBvczo6UGVyc2lzdGFibGVCdW5kbGUgbVByb3BlcnRpZXM7Ci0gICAgYm9vbCBtSXNQcml2YXRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG1pZGkKLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBBTkRST0lEX01FRElBX01JRElfREVWSUNFX0lORk9fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9NaWRpSW9XcmFwcGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaAppbmRleCBiNWU1NjVlLi5kMjk5NDllIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL01pZGlJb1dyYXBwZXIuaApAQCAtMjMsMTEgKzIzLDEzIEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IENEYXRhU291cmNlOworCiBjbGFzcyBNaWRpSW9XcmFwcGVyIHsKIHB1YmxpYzoKICAgICBleHBsaWNpdCBNaWRpSW9XcmFwcGVyKGNvbnN0IGNoYXIgKnBhdGgpOwogICAgIGV4cGxpY2l0IE1pZGlJb1dyYXBwZXIoaW50IGZkLCBvZmY2NF90IG9mZnNldCwgaW50NjRfdCBzaXplKTsKLSAgICBleHBsaWNpdCBNaWRpSW9XcmFwcGVyKERhdGFTb3VyY2VCYXNlICpzb3VyY2UpOworICAgIGV4cGxpY2l0IE1pZGlJb1dyYXBwZXIoQ0RhdGFTb3VyY2UgKmNzb3VyY2UpOwogCiAgICAgfk1pZGlJb1dyYXBwZXIoKTsKIApAQCAtNDAsNyArNDIsOCBAQAogICAgIGludCBtRmQ7CiAgICAgb2ZmNjRfdCBtQmFzZTsKICAgICBpbnQ2NF90ICBtTGVuZ3RoOwotICAgIERhdGFTb3VyY2VCYXNlICptRGF0YVNvdXJjZTsKKyAgICBjbGFzcyBEYXRhU291cmNlVW53cmFwcGVyOworICAgIERhdGFTb3VyY2VVbndyYXBwZXIgKm1EYXRhU291cmNlOwogICAgIEVBU19GSUxFIG1FYXNGaWxlOwogfTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9OZGtXcmFwcGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL05ka1dyYXBwZXIuaAppbmRleCBjOTdkMTcxLi44YTQxN2Y2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL05ka1dyYXBwZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL05ka1dyYXBwZXIuaApAQCAtMjc4LDYgKzI3OCwyNSBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYUNvZGVjV3JhcHBlcik7CiB9OwogCitzdHJ1Y3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIgOiBwdWJsaWMgUmVmQmFzZSB7CisKKyAgICBBTWVkaWFEYXRhU291cmNlV3JhcHBlcihjb25zdCBzcDxEYXRhU291cmNlPiYpOworICAgIEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKEFNZWRpYURhdGFTb3VyY2UqKTsKKworICAgIEFNZWRpYURhdGFTb3VyY2UgKmdldEFNZWRpYURhdGFTb3VyY2UoKTsKKworICAgIHZvaWQgY2xvc2UoKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgfkFNZWRpYURhdGFTb3VyY2VXcmFwcGVyKCk7CisKK3ByaXZhdGU6CisgICAgc3A8RGF0YVNvdXJjZT4gbURhdGFTb3VyY2U7CisgICAgQU1lZGlhRGF0YVNvdXJjZSAqbUFNZWRpYURhdGFTb3VyY2U7CisKKyAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVkaWFEYXRhU291cmNlV3JhcHBlcik7Cit9OworCiBzdHJ1Y3QgQU1lZGlhRXh0cmFjdG9yV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKIAogICAgIEFNZWRpYUV4dHJhY3RvcldyYXBwZXIoQU1lZGlhRXh0cmFjdG9yICphTWVkaWFFeHRyYWN0b3IpOwpAQCAtMjg3LDggKzMwNiw2IEBACiAKICAgICBzdGF0dXNfdCByZWxlYXNlKCk7CiAKLSAgICBzdGF0dXNfdCBkaXNjb25uZWN0KCk7Ci0KICAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgbGVuZ3RoKTsKIAogICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3QgY2hhciAqbG9jYXRpb24pOwpAQCAtMzM5LDMxICszNTYsNiBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFNZWRpYUV4dHJhY3RvcldyYXBwZXIpOwogfTsKIAotc3RydWN0IEFNZWRpYURhdGFTb3VyY2VXcmFwcGVyIDogcHVibGljIFJlZkJhc2UgewotCi0gICAgc3RhdGljIHN0YXR1c190IHRyYW5zbGF0ZV9lcnJvcihtZWRpYV9zdGF0dXNfdCBlcnIpOwotCi0gICAgc3RhdGljIHNzaXplX3QgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXJfZ2V0U2l6ZSh2b2lkICp1c2VyZGF0YSk7Ci0KLSAgICBzdGF0aWMgc3NpemVfdCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9yZWFkQXQodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICogYnVmLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICBzdGF0aWMgdm9pZCBBTWVkaWFEYXRhU291cmNlV3JhcHBlcl9jbG9zZSh2b2lkICp1c2VyZGF0YSk7Ci0KLSAgICBBTWVkaWFEYXRhU291cmNlV3JhcHBlcihjb25zdCBzcDxEYXRhU291cmNlPiAmZGF0YVNvdXJjZSk7Ci0KLSAgICBBTWVkaWFEYXRhU291cmNlICpnZXRBTWVkaWFEYXRhU291cmNlKCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5BTWVkaWFEYXRhU291cmNlV3JhcHBlcigpOwotCi1wcml2YXRlOgotICAgIHNwPERhdGFTb3VyY2U+IG1EYXRhU291cmNlOwotCi0gICAgQU1lZGlhRGF0YVNvdXJjZSAqbUFNZWRpYURhdGFTb3VyY2U7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBTWVkaWFEYXRhU291cmNlV3JhcHBlcik7Ci19OwotCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIE5ES19XUkFQUEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1BhdGNoQnVpbGRlci5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9QYXRjaEJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjcyMmE2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9QYXRjaEJ1aWxkZXIuaApAQCAtMCwwICsxLDEwMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9QQVRDSF9CVUlMREVSX0gKKyNkZWZpbmUgQU5EUk9JRF9QQVRDSF9CVUlMREVSX0gKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KKworLy8gVGhpcyBpcyBhIGhlYWRlci1vbmx5IHV0aWxpdHkuCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgUGF0Y2hCdWlsZGVyIHsKKyAgcHVibGljOgorICAgIHVzaW5nIG1peF91c2VjYXNlX3QgPSBkZWNsdHlwZShhdWRpb19wb3J0X2NvbmZpZ19taXhfZXh0Ojp1c2VjYXNlKTsKKworICAgIFBhdGNoQnVpbGRlcigpID0gZGVmYXVsdDsKKworICAgIC8vIEFsbCBleGlzdGluZyBtZXRob2RzIG9wZXJhdGluZyBvbiBhdWRpbyBwYXRjaGVzIHRha2UgYSBwb2ludGVyIHRvIGNvbnN0LgorICAgIC8vIEl0J3MgT0sgdG8gY29uc3RydWN0IGEgdGVtcG9yYXJ5IFBhdGNoQnVpbGRlciB3aGlsZSBwcmVwYXJpbmcgYSBwYXJhbWV0ZXIKKyAgICAvLyB0byBzdWNoIGEgZnVuY3Rpb24gYmVjYXVzZSB0aGUgQnVpbGRlciB3aWxsIGJlIGtlcHQgYWxpdmUgdW50aWwgdGhlIGNvZGUKKyAgICAvLyBleGVjdXRpb24gcmVhY2hlcyB0aGUgZnVuY3Rpb24gY2FsbCBzdGF0ZW1lbnQgc2VtaWNvbG9uLgorICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCogcGF0Y2goKSBjb25zdCB7IHJldHVybiAmbVBhdGNoOyB9CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBTPgorICAgIFBhdGNoQnVpbGRlciYgYWRkU2luayhUJiYgdCwgUyYmLi4uIHMpIHsKKyAgICAgICAgc2lua3MoKS5hZGQoc3RkOjpmb3J3YXJkPFQ+KHQpLCBzdGQ6OmZvcndhcmQ8Uz4ocykuLi4pOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIC8vIEV4cGxpY2l0IHR5cGUgb2YgdGhlIHNlY29uZCBwYXJhbWV0ZXIgYWxsb3dzIGNsaWVudHMgdG8gcHJvdmlkZSB0aGUgc3RydWN0IGlubGluZS4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICAgIFBhdGNoQnVpbGRlciYgYWRkU2luayhUJiYgdCwgY29uc3QgbWl4X3VzZWNhc2VfdCYgdXBkYXRlKSB7CisgICAgICAgIHNpbmtzKCkuYWRkKHN0ZDo6Zm9yd2FyZDxUPih0KSwgdXBkYXRlKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBTPgorICAgIFBhdGNoQnVpbGRlciYgYWRkU291cmNlKFQmJiB0LCBTJiYuLi4gcykgeworICAgICAgICBzb3VyY2VzKCkuYWRkKHN0ZDo6Zm9yd2FyZDxUPih0KSwgc3RkOjpmb3J3YXJkPFM+KHMpLi4uKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICAvLyBFeHBsaWNpdCB0eXBlIG9mIHRoZSBzZWNvbmQgcGFyYW1ldGVyIGFsbG93cyBjbGllbnRzIHRvIHByb3ZpZGUgdGhlIHN0cnVjdCBpbmxpbmUuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBQYXRjaEJ1aWxkZXImIGFkZFNvdXJjZShUJiYgdCwgY29uc3QgbWl4X3VzZWNhc2VfdCYgdXBkYXRlKSB7CisgICAgICAgIHNvdXJjZXMoKS5hZGQoc3RkOjpmb3J3YXJkPFQ+KHQpLCB1cGRhdGUpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc3RydWN0IFBvcnRDZmdzIHsKKyAgICAgICAgUG9ydENmZ3ModW5zaWduZWQgaW50ICpjb3VudFB0ciwgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpwb3J0Q2ZncykKKyAgICAgICAgICAgICAgICA6IG1Db3VudFB0cihjb3VudFB0ciksIG1Qb3J0Q2Zncyhwb3J0Q2Zncykge30KKyAgICAgICAgYXVkaW9fcG9ydF9jb25maWcmIGFkZChjb25zdCBhdWRpb19wb3J0X2NvbmZpZyYgcG9ydENmZykgeworICAgICAgICAgICAgcmV0dXJuICphZHZhbmNlKCkgPSBwb3J0Q2ZnOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnJiBhZGQoY29uc3Qgc3A8VD4mIGVudGl0eSkgeworICAgICAgICAgICAgYXVkaW9fcG9ydF9jb25maWcqIGFkZGVkID0gYWR2YW5jZSgpOworICAgICAgICAgICAgZW50aXR5LT50b0F1ZGlvUG9ydENvbmZpZyhhZGRlZCk7CisgICAgICAgICAgICByZXR1cm4gKmFkZGVkOworICAgICAgICB9CisgICAgICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgICAgIHZvaWQgYWRkKGNvbnN0IHNwPFQ+JiBlbnRpdHksIGNvbnN0IG1peF91c2VjYXNlX3QmIHVzZWNhc2VVcGRhdGUpIHsKKyAgICAgICAgICAgIGFkZChlbnRpdHkpLmV4dC5taXgudXNlY2FzZSA9IHVzZWNhc2VVcGRhdGU7CisgICAgICAgIH0KKyAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICAgICAgdm9pZCBhZGQoY29uc3Qgc3A8VD4mIGVudGl0eSwKKyAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPG1peF91c2VjYXNlX3QoY29uc3QgbWl4X3VzZWNhc2VfdCYpPiB1c2VjYXNlVXBkYXRlcikgeworICAgICAgICAgICAgbWl4X3VzZWNhc2VfdCogdXNlY2FzZSA9ICZhZGQoZW50aXR5KS5leHQubWl4LnVzZWNhc2U7CisgICAgICAgICAgICAqdXNlY2FzZSA9IHVzZWNhc2VVcGRhdGVyKCp1c2VjYXNlKTsKKyAgICAgICAgfQorICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcqIGFkdmFuY2UoKSB7CisgICAgICAgICAgICByZXR1cm4gJm1Qb3J0Q2Znc1soKm1Db3VudFB0cikrK107CisgICAgICAgIH0KKyAgICAgICAgdW5zaWduZWQgaW50ICptQ291bnRQdHI7CisgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqbVBvcnRDZmdzOworICAgIH07CisKKyAgICBQb3J0Q2ZncyBzaW5rcygpIHsgcmV0dXJuIFBvcnRDZmdzKCZtUGF0Y2gubnVtX3NpbmtzLCBtUGF0Y2guc2lua3MpOyB9CisgICAgUG9ydENmZ3Mgc291cmNlcygpIHsgcmV0dXJuIFBvcnRDZmdzKCZtUGF0Y2gubnVtX3NvdXJjZXMsIG1QYXRjaC5zb3VyY2VzKTsgfQorCisgICAgc3RydWN0IGF1ZGlvX3BhdGNoIG1QYXRjaCA9IHt9OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX1BBVENIX0JVSUxERVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1NpbmdsZVN0YXRlUXVldWUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQyMzk2Mi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1NpbmdsZVN0YXRlUXVldWUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBTSU5HTEVfU1RBVEVfUVVFVUVfSAotI2RlZmluZSBTSU5HTEVfU1RBVEVfUVVFVUVfSAotCi0vLyBOb24tYmxvY2tpbmcgc2luZ2xlIGVsZW1lbnQgc3RhdGUgcXVldWUsIG9yCi0vLyBOb24tYmxvY2tpbmcgc2luZ2xlLXJlYWRlciAvIHNpbmdsZS13cml0ZXIgbXVsdGktd29yZCBhdG9taWMgbG9hZCAvIHN0b3JlCi0KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgU2luZ2xlU3RhdGVRdWV1ZSB7Ci0KLXB1YmxpYzoKLQotICAgIGNsYXNzIE11dGF0b3I7Ci0gICAgY2xhc3MgT2JzZXJ2ZXI7Ci0KLSAgICBlbnVtIFNTUV9TVEFUVVMgewotICAgICAgICBTU1FfUEVORElORywgLyogPSAwICovCi0gICAgICAgIFNTUV9SRUFELAotICAgICAgICBTU1FfRE9ORSwKLSAgICB9OwotCi0gICAgc3RydWN0IFNoYXJlZCB7Ci0gICAgICAgIC8vIG5lZWRzIHRvIGJlIHBhcnQgb2YgYSB1bmlvbiBzbyBkb24ndCBkZWZpbmUgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvcgotCi0gICAgICAgIGZyaWVuZCBjbGFzcyBNdXRhdG9yOwotICAgICAgICBmcmllbmQgY2xhc3MgT2JzZXJ2ZXI7Ci0KLXByaXZhdGU6Ci0gICAgICAgIHZvaWQgICAgICAgICAgICAgICAgaW5pdCgpIHsgbUFjayA9IDA7IG1TZXF1ZW5jZSA9IDA7IH0KLQotICAgICAgICB2b2xhdGlsZSBpbnQzMl90ICAgIG1BY2s7Ci0gICAgICAgIHZvbGF0aWxlIGludDMyX3QgICAgbVNlcXVlbmNlOwotICAgICAgICBUICAgICAgICAgICAgICAgICAgIG1WYWx1ZTsKLSAgICB9OwotCi0gICAgY2xhc3MgTXV0YXRvciB7Ci0gICAgcHVibGljOgotICAgICAgICBNdXRhdG9yKFNoYXJlZCAqc2hhcmVkKQotICAgICAgICAgICAgOiBtU2VxdWVuY2UoMCksIG1TaGFyZWQoc2hhcmVkKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBleGFjdGx5IG9uZSBvZiBNdXRhdG9yIGFuZCBPYnNlcnZlciBtdXN0IGluaXRpYWxpemUsIGN1cnJlbnRseSBpdCBpcyBPYnNlcnZlcgotICAgICAgICAgICAgLy8gc2hhcmVkLT5pbml0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwdXNoIG5ldyB2YWx1ZSBvbnRvIHN0YXRlIHF1ZXVlLCBvdmVyd3JpdGluZyBwcmV2aW91cyB2YWx1ZTsKLSAgICAgICAgLy8gcmV0dXJucyBhIHNlcXVlbmNlIG51bWJlciB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIGFjaygpCi0gICAgICAgIGludDMyX3QgcHVzaChjb25zdCBUJiB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgU2hhcmVkICpzaGFyZWQgPSBtU2hhcmVkOwotICAgICAgICAgICAgaW50MzJfdCBzZXF1ZW5jZSA9IG1TZXF1ZW5jZTsKLSAgICAgICAgICAgIHNlcXVlbmNlKys7Ci0gICAgICAgICAgICBhbmRyb2lkX2F0b21pY19hY3F1aXJlX3N0b3JlKHNlcXVlbmNlLCAmc2hhcmVkLT5tU2VxdWVuY2UpOwotICAgICAgICAgICAgc2hhcmVkLT5tVmFsdWUgPSB2YWx1ZTsKLSAgICAgICAgICAgIHNlcXVlbmNlKys7Ci0gICAgICAgICAgICBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlKHNlcXVlbmNlLCAmc2hhcmVkLT5tU2VxdWVuY2UpOwotICAgICAgICAgICAgbVNlcXVlbmNlID0gc2VxdWVuY2U7Ci0gICAgICAgICAgICAvLyBjb25zaWRlciBzaWduYWxsaW5nIGEgZnV0ZXggaGVyZSwgaWYgd2Uga25vdyB0aGF0IG9ic2VydmVyIGlzIHdhaXRpbmcKLSAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJldHVybnMgdGhlIHN0YXR1cyBvZiB0aGUgbGFzdCBzdGF0ZSBwdXNoLiAgVGhpcyBtYXkgYmUgYSBzdGFsZSB2YWx1ZS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gU1NRX1BFTkRJTkcsIG9yIDAsIG1lYW5zIGl0IGhhcyBub3QgYmVlbiBvYnNlcnZlZAotICAgICAgICAvLyBTU1FfUkVBRCBtZWFucyBpdCBoYXMgYmVlbiByZWFkCi0gICAgICAgIC8vIFNTUV9ET05FIG1lYW5zIGl0IGhhcyBiZWVuIGFjdGVkIHVwb24sIGFmdGVyIE9ic2VydmVyOjpkb25lKCkgaXMgY2FsbGVkCi0gICAgICAgIGVudW0gU1NRX1NUQVRVUyBhY2soKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU1FfRE9ORSwgcHJldmVudCBhbnkgc3VidGxlIGRhdGEtcmFjZXMgb2Ygc3Vic2VxdWVudCByZWFkcwotICAgICAgICAgICAgLy8gYmVpbmcgcGVyZm9ybWVkIChvdXQtb2Ytb3JkZXIpIGJlZm9yZSB0aGUgYWNrIHJlYWQsIHNob3VsZCB0aGUgY2FsbGVyIGJlCi0gICAgICAgICAgICAvLyBkZXBlbmRpbmcgb24gc2VxdWVudGlhbGl0eSBvZiByZWFkcy4KLSAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYWNrID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZtU2hhcmVkLT5tQWNrKTsKLSAgICAgICAgICAgIHJldHVybiBhY2sgLSBtU2VxdWVuY2UgJiB+MSA/IFNTUV9QRU5ESU5HIC8qIHNlcSBkaWZmZXIgKi8gOgotICAgICAgICAgICAgICAgICAgICBhY2sgJiAxID8gU1NRX0RPTkUgOiBTU1FfUkVBRDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHJldHVybiB0cnVlIGlmIGEgcHVzaCB3aXRoIHNwZWNpZmllZCBzZXF1ZW5jZSBudW1iZXIgb3IgbGF0ZXIgaGFzIGJlZW4gb2JzZXJ2ZWQKLSAgICAgICAgYm9vbCBhY2soaW50MzJfdCBzZXF1ZW5jZSkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgLy8gdGhpcyByZWxpZXMgb24gMidzIGNvbXBsZW1lbnQgcm9sbG92ZXIgdG8gZGV0ZWN0IGFuIGFuY2llbnQgc2VxdWVuY2UgbnVtYmVyCi0gICAgICAgICAgICByZXR1cm4gbVNoYXJlZC0+bUFjayAtIHNlcXVlbmNlID49IDA7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGludDMyX3QgICAgIG1TZXF1ZW5jZTsKLSAgICAgICAgU2hhcmVkICogY29uc3QgbVNoYXJlZDsKLSAgICB9OwotCi0gICAgY2xhc3MgT2JzZXJ2ZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgT2JzZXJ2ZXIoU2hhcmVkICpzaGFyZWQpCi0gICAgICAgICAgICA6IG1TZXF1ZW5jZSgwKSwgbVNlZWQoMSksIG1TaGFyZWQoc2hhcmVkKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBleGFjdGx5IG9uZSBvZiBNdXRhdG9yIGFuZCBPYnNlcnZlciBtdXN0IGluaXRpYWxpemUsIGN1cnJlbnRseSBpdCBpcyBPYnNlcnZlcgotICAgICAgICAgICAgc2hhcmVkLT5pbml0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyByZXR1cm4gdHJ1ZSBpZiB2YWx1ZSBoYXMgY2hhbmdlZAotICAgICAgICBib29sIHBvbGwoVCYgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFNoYXJlZCAqc2hhcmVkID0gbVNoYXJlZDsKLSAgICAgICAgICAgIGludDMyX3QgYmVmb3JlID0gc2hhcmVkLT5tU2VxdWVuY2U7Ci0gICAgICAgICAgICBpZiAoYmVmb3JlID09IG1TZXF1ZW5jZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IHRyaWVzID0gMDsgOyApIHsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgTUFYX1RSSUVTID0gNTsKLSAgICAgICAgICAgICAgICBpZiAoYmVmb3JlICYgMSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKyt0cmllcyA+PSBNQVhfVFJJRVMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBiZWZvcmUgPSBzaGFyZWQtPm1TZXF1ZW5jZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX21lbW9yeV9iYXJyaWVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIFQgdGVtcCA9IHNoYXJlZC0+bVZhbHVlOwotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGFmdGVyID0gYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9sb2FkKCZzaGFyZWQtPm1TZXF1ZW5jZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhZnRlciA9PSBiZWZvcmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGVtcDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZC0+bUFjayA9IGJlZm9yZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXF1ZW5jZSA9IGJlZm9yZTsgLy8gbVNlcXVlbmNlIGlzIGV2ZW4gYWZ0ZXIgcG9sbCBzdWNjZXNzCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoKyt0cmllcyA+PSBNQVhfVFJJRVMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBiZWZvcmUgPSBhZnRlcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyAob3B0aW9uYWwpIHVzZWQgdG8gaW5kaWNhdGUgdG8gdGhlIE11dGF0b3IgdGhhdCB0aGUgc3RhdGUgdGhhdCBoYXMgYmVlbiBwb2xsZWQKLSAgICAgICAgLy8gaGFzIGFsc28gYmVlbiBhY3RlZCB1cG9uLgotICAgICAgICB2b2lkIGRvbmUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb25zdCBpbnQzMl90IGFjayA9IG1TaGFyZWQtPm1BY2sgKyAxOwotICAgICAgICAgICAgLy8gZW5zdXJlIGFsbCBwcmV2aW91cyB3cml0ZXMgaGF2ZSBiZWVuIHBlcmZvcm1lZC4KLSAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUoYWNrLCAmbVNoYXJlZC0+bUFjayk7IC8vIG1TZXF1ZW5jZSBpcyBvZGQgYWZ0ZXIgImRvbmUiCi0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIGludDMyX3QgICAgIG1TZXF1ZW5jZTsKLSAgICAgICAgaW50ICAgICAgICAgbVNlZWQ7ICAvLyBmb3IgUFJORwotICAgICAgICBTaGFyZWQgKiBjb25zdCBtU2hhcmVkOwotICAgIH07Ci0KLSNpZiAwCi0gICAgU2luZ2xlU3RhdGVRdWV1ZSh2b2lkIC8qU2hhcmVkKi8gKnNoYXJlZCk7Ci0gICAgLyp2aXJ0dWFsKi8gflNpbmdsZVN0YXRlUXVldWUoKSB7IH0KLQotICAgIHN0YXRpYyBzaXplX3Qgc2l6ZSgpIHsgcmV0dXJuIHNpemVvZihTaGFyZWQpOyB9Ci0jZW5kaWYKLQotfTsKLQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gU0lOR0xFX1NUQVRFX1FVRVVFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1RpbWVDaGVjay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzVmNjU2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVGltZUNoZWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotCi0jaWZuZGVmIEFORFJPSURfVElNRV9DSEVDS19ICi0jZGVmaW5lIEFORFJPSURfVElNRV9DSEVDS19ICi0KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgotCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gQSBjbGFzcyBtb25pdG9yaW5nIGV4ZWN1dGlvbiB0aW1lIGZvciBhIGNvZGUgYmxvY2sgKHNjb3BlZCB2YXJpYWJsZSkgYW5kIGNhdXNpbmcgYW4gYXNzZXJ0Ci0vLyBpZiBpdCBleGNlZWRzIGEgY2VydGFpbiB0aW1lCi0KLWNsYXNzIFRpbWVDaGVjayB7Ci1wdWJsaWM6Ci0KLSAgICAvLyBUaGUgZGVmYXVsdCB0aW1lb3V0IGlzIGNob3NlbiB0byBiZSBsZXNzIHRoYW4gc3lzdGVtIHNlcnZlciB3YXRjaGRvZyB0aW1lb3V0Ci0gICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrRGVmYXVsdFRpbWVPdXRNcyA9IDUwMDA7Ci0KLSAgICAgICAgICAgIFRpbWVDaGVjayhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcyA9IGtEZWZhdWx0VGltZU91dE1zKTsKLSAgICAgICAgICAgIH5UaW1lQ2hlY2soKTsKLQotcHJpdmF0ZToKLQotICAgIGNsYXNzIFRpbWVDaGVja1RocmVhZCA6IHB1YmxpYyBUaHJlYWQgewotICAgIHB1YmxpYzoKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVDaGVja1RocmVhZCgpIHt9Ci0gICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgflRpbWVDaGVja1RocmVhZCgpIG92ZXJyaWRlOwotCi0gICAgICAgICAgICAgICAgbnNlY3NfdCAgICAgc3RhcnRNb25pdG9yaW5nKGNvbnN0IGNoYXIgKnRhZywgdWludDMyX3QgdGltZW91dE1zKTsKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wTW9uaXRvcmluZyhuc2Vjc190IGVuZFRpbWVOcyk7Ci0KLSAgICBwcml2YXRlOgotCi0gICAgICAgICAgICAgICAgLy8gUmVmQmFzZQotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKSBvdmVycmlkZSB7IHJ1bigiVGltZUNoZWNrVGhyZWFkIiwgUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsgfQotCi0gICAgICAgICAgICAgICAgLy8gVGhyZWFkCi0gICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpIG92ZXJyaWRlOwotCi0gICAgICAgICAgICAgICAgQ29uZGl0aW9uICAgICAgICAgICBtQ29uZDsKLSAgICAgICAgICAgICAgICBNdXRleCAgICAgICAgICAgICAgIG1NdXRleDsKLSAgICAgICAgICAgICAgICAvLyB1c2luZyB0aGUgZW5kIHRpbWUgaW4gbnMgYXMga2V5IGlzIE9LIGdpdmVuIHRoZSByaXNrIGlzIGxvdyB0aGF0IHR3byBlbnRyaWVzCi0gICAgICAgICAgICAgICAgLy8gYXJlIGFkZGVkIGluIHN1Y2ggYSB3YXkgdGhhdCA8YWRkIHRpbWU+ICsgPHRpbWVvdXQ+IGFyZSB0aGUgc2FtZSBmb3IgYm90aC4KLSAgICAgICAgICAgICAgICBLZXllZFZlY3RvcjwgbnNlY3NfdCwgY29uc3QgY2hhcio+ICBtTW9uaXRvclJlcXVlc3RzOwotICAgIH07Ci0KLSAgICBzdGF0aWMgc3A8VGltZUNoZWNrVGhyZWFkPiBnZXRUaW1lQ2hlY2tUaHJlYWQoKTsKLQotICAgIGNvbnN0ICAgICAgICAgICBuc2Vjc190IG1FbmRUaW1lTnM7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfVElNRV9DSEVDS19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmYwZDRjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfVFlQRV9DT05WRVJURVJfSF8KLSNkZWZpbmUgQU5EUk9JRF9UWVBFX0NPTlZFUlRFUl9IXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgotI2luY2x1ZGUgImNvbnZlcnQuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgU2FtcGxlUmF0ZVRyYWl0cwotewotICAgIHR5cGVkZWYgdWludDMyX3QgVHlwZTsKLSAgICB0eXBlZGVmIFNvcnRlZFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBEZXZpY2VUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX2RldmljZXNfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IE91dHB1dERldmljZVRyYWl0cyA6IHB1YmxpYyBEZXZpY2VUcmFpdHMge307Ci1zdHJ1Y3QgSW5wdXREZXZpY2VUcmFpdHMgOiBwdWJsaWMgRGV2aWNlVHJhaXRzIHt9Owotc3RydWN0IE91dHB1dEZsYWdUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX291dHB1dF9mbGFnc190IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgSW5wdXRGbGFnVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19pbnB1dF9mbGFnc190IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgRm9ybWF0VHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19mb3JtYXRfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IENoYW5uZWxUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGF1ZGlvX2NoYW5uZWxfbWFza190IFR5cGU7Ci0gICAgdHlwZWRlZiBTb3J0ZWRWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgT3V0cHV0Q2hhbm5lbFRyYWl0cyA6IHB1YmxpYyBDaGFubmVsVHJhaXRzIHt9Owotc3RydWN0IElucHV0Q2hhbm5lbFRyYWl0cyA6IHB1YmxpYyBDaGFubmVsVHJhaXRzIHt9Owotc3RydWN0IENoYW5uZWxJbmRleFRyYWl0cyA6IHB1YmxpYyBDaGFubmVsVHJhaXRzIHt9Owotc3RydWN0IEdhaW5Nb2RlVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19nYWluX21vZGVfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IFN0cmVhbVRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fc3RyZWFtX3R5cGVfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IEF1ZGlvTW9kZVRyYWl0cwotewotICAgIHR5cGVkZWYgYXVkaW9fbW9kZV90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgQXVkaW9Db250ZW50VHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19jb250ZW50X3R5cGVfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IFVzYWdlVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb191c2FnZV90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgU291cmNlVHJhaXRzCi17Ci0gICAgdHlwZWRlZiBhdWRpb19zb3VyY2VfdCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19OwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgRGVmYXVsdFRyYWl0cwotewotICAgIHR5cGVkZWYgVCBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhaXRzPgotc3RhdGljIHZvaWQgY29sbGVjdGlvbkZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgdHlwZW5hbWUgVHJhaXRzOjpDb2xsZWN0aW9uICZjb2xsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVsID0gQXVkaW9QYXJhbWV0ZXI6OnZhbHVlTGlzdFNlcGFyYXRvcikKLXsKLSAgICBjaGFyICpsaXRlcmFsID0gc3RyZHVwKHN0ci5jX3N0cigpKTsKLSAgICBmb3IgKGNvbnN0IGNoYXIgKmNzdHIgPSBzdHJ0b2sobGl0ZXJhbCwgZGVsKTsgY3N0ciAhPSBOVUxMOyBjc3RyID0gc3RydG9rKE5VTEwsIGRlbCkpIHsKLSAgICAgICAgdHlwZW5hbWUgVHJhaXRzOjpUeXBlIHZhbHVlOwotICAgICAgICBpZiAodXRpbGl0aWVzOjpjb252ZXJ0VG88c3RkOjpzdHJpbmcsIHR5cGVuYW1lIFRyYWl0czo6VHlwZSA+KGNzdHIsIHZhbHVlKSkgewotICAgICAgICAgICAgY29sbGVjdGlvbi5hZGQodmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotICAgIGZyZWUobGl0ZXJhbCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFpdHM+Ci1jbGFzcyBUeXBlQ29udmVydGVyCi17Ci1wdWJsaWM6Ci0gICAgc3RhdGljIGJvb2wgdG9TdHJpbmcoY29uc3QgdHlwZW5hbWUgVHJhaXRzOjpUeXBlICZ2YWx1ZSwgc3RkOjpzdHJpbmcgJnN0cik7Ci0KLSAgICBzdGF0aWMgYm9vbCBmcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIHR5cGVuYW1lIFRyYWl0czo6VHlwZSAmcmVzdWx0KTsKLQotICAgIHN0YXRpYyB2b2lkIGNvbGxlY3Rpb25Gcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgVHJhaXRzOjpDb2xsZWN0aW9uICZjb2xsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRlbCA9IEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IpOwotCi0gICAgc3RhdGljIHVpbnQzMl90IG1hc2tGcm9tU3RyaW5nKAotICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgY29uc3QgY2hhciAqZGVsID0gQXVkaW9QYXJhbWV0ZXI6OnZhbHVlTGlzdFNlcGFyYXRvcik7Ci0KLSAgICBzdGF0aWMgdm9pZCBtYXNrVG9TdHJpbmcoCi0gICAgICAgICAgICB1aW50MzJfdCBtYXNrLCBzdGQ6OnN0cmluZyAmc3RyLCBjb25zdCBjaGFyICpkZWwgPSBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKTsKLQotcHJvdGVjdGVkOgotICAgIHN0cnVjdCBUYWJsZSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKmxpdGVyYWw7Ci0gICAgICAgIHR5cGVuYW1lIFRyYWl0czo6VHlwZSB2YWx1ZTsKLSAgICB9OwotCi0gICAgc3RhdGljIGNvbnN0IFRhYmxlIG1UYWJsZVtdOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFRyYWl0cz4KLWlubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8VHJhaXRzPjo6dG9TdHJpbmcoY29uc3QgdHlwZW5hbWUgVHJhaXRzOjpUeXBlICZ2YWx1ZSwgc3RkOjpzdHJpbmcgJnN0cikKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgbVRhYmxlW2ldLmxpdGVyYWw7IGkrKykgewotICAgICAgICBpZiAobVRhYmxlW2ldLnZhbHVlID09IHZhbHVlKSB7Ci0gICAgICAgICAgICBzdHIgPSBtVGFibGVbaV0ubGl0ZXJhbDsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIGNoYXIgcmVzdWx0WzY0XTsKLSAgICBzbnByaW50ZihyZXN1bHQsIHNpemVvZihyZXN1bHQpLCAiVW5rbm93biBlbnVtIHZhbHVlICVkIiwgdmFsdWUpOwotICAgIHN0ciA9IHJlc3VsdDsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFpdHM+Ci1pbmxpbmUgYm9vbCBUeXBlQ29udmVydGVyPFRyYWl0cz46OmZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgdHlwZW5hbWUgVHJhaXRzOjpUeXBlICZyZXN1bHQpCi17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IG1UYWJsZVtpXS5saXRlcmFsOyBpKyspIHsKLSAgICAgICAgaWYgKHN0cmNtcChtVGFibGVbaV0ubGl0ZXJhbCwgc3RyLmNfc3RyKCkpID09IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJzdHJpbmdUb0VudW0oKSBmb3VuZCAlcyIsIG1UYWJsZVtpXS5saXRlcmFsKTsKLSAgICAgICAgICAgIHJlc3VsdCA9IG1UYWJsZVtpXS52YWx1ZTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFRyYWl0cz4KLWlubGluZSB2b2lkIFR5cGVDb252ZXJ0ZXI8VHJhaXRzPjo6Y29sbGVjdGlvbkZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwKLSAgICAgICAgdHlwZW5hbWUgVHJhaXRzOjpDb2xsZWN0aW9uICZjb2xsZWN0aW9uLAotICAgICAgICBjb25zdCBjaGFyICpkZWwpCi17Ci0gICAgY2hhciAqbGl0ZXJhbCA9IHN0cmR1cChzdHIuY19zdHIoKSk7Ci0KLSAgICBmb3IgKGNvbnN0IGNoYXIgKmNzdHIgPSBzdHJ0b2sobGl0ZXJhbCwgZGVsKTsgY3N0ciAhPSBOVUxMOyBjc3RyID0gc3RydG9rKE5VTEwsIGRlbCkpIHsKLSAgICAgICAgdHlwZW5hbWUgVHJhaXRzOjpUeXBlIHZhbHVlOwotICAgICAgICBpZiAoZnJvbVN0cmluZyhjc3RyLCB2YWx1ZSkpIHsKLSAgICAgICAgICAgIGNvbGxlY3Rpb24uYWRkKHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBmcmVlKGxpdGVyYWwpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVHJhaXRzPgotaW5saW5lIHVpbnQzMl90IFR5cGVDb252ZXJ0ZXI8VHJhaXRzPjo6bWFza0Zyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgY29uc3QgY2hhciAqZGVsKQotewotICAgIGNoYXIgKmxpdGVyYWwgPSBzdHJkdXAoc3RyLmNfc3RyKCkpOwotICAgIHVpbnQzMl90IHZhbHVlID0gMDsKLSAgICBmb3IgKGNvbnN0IGNoYXIgKmNzdHIgPSBzdHJ0b2sobGl0ZXJhbCwgZGVsKTsgY3N0ciAhPSBOVUxMOyBjc3RyID0gc3RydG9rKE5VTEwsIGRlbCkpIHsKLSAgICAgICAgdHlwZW5hbWUgVHJhaXRzOjpUeXBlIHR5cGU7Ci0gICAgICAgIGlmIChmcm9tU3RyaW5nKGNzdHIsIHR5cGUpKSB7Ci0gICAgICAgICAgICB2YWx1ZSB8PSBzdGF0aWNfY2FzdDx1aW50MzJfdD4odHlwZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgZnJlZShsaXRlcmFsKTsKLSAgICByZXR1cm4gdmFsdWU7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUcmFpdHM+Ci1pbmxpbmUgdm9pZCBUeXBlQ29udmVydGVyPFRyYWl0cz46Om1hc2tUb1N0cmluZyh1aW50MzJfdCBtYXNrLCBzdGQ6OnN0cmluZyAmc3RyLCBjb25zdCBjaGFyICpkZWwpCi17Ci0gICAgaWYgKG1hc2sgIT0gMCkgewotICAgICAgICBib29sIGZpcnN0X2ZsYWcgPSB0cnVlOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgbVRhYmxlW2ldLmxpdGVyYWw7IGkrKykgewotICAgICAgICAgICAgdWludDMyX3QgdmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4obVRhYmxlW2ldLnZhbHVlKTsKLSAgICAgICAgICAgIGlmIChtVGFibGVbaV0udmFsdWUgIT0gMCAmJiAoKG1hc2sgJiB2YWx1ZSkgPT0gdmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFmaXJzdF9mbGFnKSBzdHIgKz0gZGVsOwotICAgICAgICAgICAgICAgIGZpcnN0X2ZsYWcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBzdHIgKz0gbVRhYmxlW2ldLmxpdGVyYWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICB0b1N0cmluZyhzdGF0aWNfY2FzdDx0eXBlbmFtZSBUcmFpdHM6OlR5cGU+KDApLCBzdHIpOwotICAgIH0KLX0KLQotdHlwZWRlZiBUeXBlQ29udmVydGVyPE91dHB1dERldmljZVRyYWl0cz4gT3V0cHV0RGV2aWNlQ29udmVydGVyOwotdHlwZWRlZiBUeXBlQ29udmVydGVyPElucHV0RGV2aWNlVHJhaXRzPiBJbnB1dERldmljZUNvbnZlcnRlcjsKLXR5cGVkZWYgVHlwZUNvbnZlcnRlcjxPdXRwdXRGbGFnVHJhaXRzPiBPdXRwdXRGbGFnQ29udmVydGVyOwotdHlwZWRlZiBUeXBlQ29udmVydGVyPElucHV0RmxhZ1RyYWl0cz4gSW5wdXRGbGFnQ29udmVydGVyOwotdHlwZWRlZiBUeXBlQ29udmVydGVyPEZvcm1hdFRyYWl0cz4gRm9ybWF0Q29udmVydGVyOwotdHlwZWRlZiBUeXBlQ29udmVydGVyPE91dHB1dENoYW5uZWxUcmFpdHM+IE91dHB1dENoYW5uZWxDb252ZXJ0ZXI7Ci10eXBlZGVmIFR5cGVDb252ZXJ0ZXI8SW5wdXRDaGFubmVsVHJhaXRzPiBJbnB1dENoYW5uZWxDb252ZXJ0ZXI7Ci10eXBlZGVmIFR5cGVDb252ZXJ0ZXI8Q2hhbm5lbEluZGV4VHJhaXRzPiBDaGFubmVsSW5kZXhDb252ZXJ0ZXI7Ci10eXBlZGVmIFR5cGVDb252ZXJ0ZXI8R2Fpbk1vZGVUcmFpdHM+IEdhaW5Nb2RlQ29udmVydGVyOwotdHlwZWRlZiBUeXBlQ29udmVydGVyPFN0cmVhbVRyYWl0cz4gU3RyZWFtVHlwZUNvbnZlcnRlcjsKLXR5cGVkZWYgVHlwZUNvbnZlcnRlcjxBdWRpb01vZGVUcmFpdHM+IEF1ZGlvTW9kZUNvbnZlcnRlcjsKLXR5cGVkZWYgVHlwZUNvbnZlcnRlcjxBdWRpb0NvbnRlbnRUcmFpdHM+IEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI7Ci10eXBlZGVmIFR5cGVDb252ZXJ0ZXI8VXNhZ2VUcmFpdHM+IFVzYWdlVHlwZUNvbnZlcnRlcjsKLXR5cGVkZWYgVHlwZUNvbnZlcnRlcjxTb3VyY2VUcmFpdHM+IFNvdXJjZVR5cGVDb252ZXJ0ZXI7Ci0KLXRlbXBsYXRlPD4gY29uc3QgT3V0cHV0RGV2aWNlQ29udmVydGVyOjpUYWJsZSBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6Om1UYWJsZVtdOwotdGVtcGxhdGU8PiBjb25zdCBJbnB1dERldmljZUNvbnZlcnRlcjo6VGFibGUgSW5wdXREZXZpY2VDb252ZXJ0ZXI6Om1UYWJsZVtdOwotdGVtcGxhdGU8PiBjb25zdCBPdXRwdXRGbGFnQ29udmVydGVyOjpUYWJsZSBPdXRwdXRGbGFnQ29udmVydGVyOjptVGFibGVbXTsKLXRlbXBsYXRlPD4gY29uc3QgSW5wdXRGbGFnQ29udmVydGVyOjpUYWJsZSBJbnB1dEZsYWdDb252ZXJ0ZXI6Om1UYWJsZVtdOwotdGVtcGxhdGU8PiBjb25zdCBGb3JtYXRDb252ZXJ0ZXI6OlRhYmxlIEZvcm1hdENvbnZlcnRlcjo6bVRhYmxlW107Ci10ZW1wbGF0ZTw+IGNvbnN0IE91dHB1dENoYW5uZWxDb252ZXJ0ZXI6OlRhYmxlIE91dHB1dENoYW5uZWxDb252ZXJ0ZXI6Om1UYWJsZVtdOwotdGVtcGxhdGU8PiBjb25zdCBJbnB1dENoYW5uZWxDb252ZXJ0ZXI6OlRhYmxlIElucHV0Q2hhbm5lbENvbnZlcnRlcjo6bVRhYmxlW107Ci10ZW1wbGF0ZTw+IGNvbnN0IENoYW5uZWxJbmRleENvbnZlcnRlcjo6VGFibGUgQ2hhbm5lbEluZGV4Q29udmVydGVyOjptVGFibGVbXTsKLXRlbXBsYXRlPD4gY29uc3QgR2Fpbk1vZGVDb252ZXJ0ZXI6OlRhYmxlIEdhaW5Nb2RlQ29udmVydGVyOjptVGFibGVbXTsKLXRlbXBsYXRlPD4gY29uc3QgU3RyZWFtVHlwZUNvbnZlcnRlcjo6VGFibGUgU3RyZWFtVHlwZUNvbnZlcnRlcjo6bVRhYmxlW107Ci10ZW1wbGF0ZTw+IGNvbnN0IEF1ZGlvTW9kZUNvbnZlcnRlcjo6VGFibGUgQXVkaW9Nb2RlQ29udmVydGVyOjptVGFibGVbXTsKLXRlbXBsYXRlPD4gY29uc3QgQXVkaW9Db250ZW50VHlwZUNvbnZlcnRlcjo6VGFibGUgQXVkaW9Db250ZW50VHlwZUNvbnZlcnRlcjo6bVRhYmxlW107Ci10ZW1wbGF0ZTw+IGNvbnN0IFVzYWdlVHlwZUNvbnZlcnRlcjo6VGFibGUgVXNhZ2VUeXBlQ29udmVydGVyOjptVGFibGVbXTsKLXRlbXBsYXRlPD4gY29uc3QgU291cmNlVHlwZUNvbnZlcnRlcjo6VGFibGUgU291cmNlVHlwZUNvbnZlcnRlcjo6bVRhYmxlW107Ci0KLWJvb2wgZGV2aWNlRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgbGl0ZXJhbERldmljZSwgYXVkaW9fZGV2aWNlc190JiBkZXZpY2UpOwotCi1ib29sIGRldmljZVRvU3RyaW5nKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIHN0ZDo6c3RyaW5nJiBsaXRlcmFsRGV2aWNlKTsKLQotU2FtcGxlUmF0ZVRyYWl0czo6Q29sbGVjdGlvbiBzYW1wbGluZ1JhdGVzRnJvbVN0cmluZygKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNhbXBsaW5nUmF0ZXMsIGNvbnN0IGNoYXIgKmRlbCA9IEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IpOwotCi1Gb3JtYXRUcmFpdHM6OkNvbGxlY3Rpb24gZm9ybWF0c0Zyb21TdHJpbmcoCi0gICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmb3JtYXRzLCBjb25zdCBjaGFyICpkZWwgPSBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKTsKLQotYXVkaW9fZm9ybWF0X3QgZm9ybWF0RnJvbVN0cmluZygKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmxpdGVyYWxGb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IGRlZmF1bHRGb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCk7Ci0KLWF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmbGl0ZXJhbENoYW5uZWxzKTsKLQotQ2hhbm5lbFRyYWl0czo6Q29sbGVjdGlvbiBjaGFubmVsTWFza3NGcm9tU3RyaW5nKAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY2hhbm5lbHMsIGNvbnN0IGNoYXIgKmRlbCA9IEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IpOwotCi1JbnB1dENoYW5uZWxUcmFpdHM6OkNvbGxlY3Rpb24gaW5wdXRDaGFubmVsTWFza3NGcm9tU3RyaW5nKAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaW5DaGFubmVscywgY29uc3QgY2hhciAqZGVsID0gQXVkaW9QYXJhbWV0ZXI6OnZhbHVlTGlzdFNlcGFyYXRvcik7Ci0KLU91dHB1dENoYW5uZWxUcmFpdHM6OkNvbGxlY3Rpb24gb3V0cHV0Q2hhbm5lbE1hc2tzRnJvbVN0cmluZygKLSAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm91dENoYW5uZWxzLCBjb25zdCBjaGFyICpkZWwgPSBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvKkFORFJPSURfVFlQRV9DT05WRVJURVJfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9WaXN1YWxpemVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1Zpc3VhbGl6ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODA3OGUzNi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL1Zpc3VhbGl6ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX01FRElBX1ZJU1VBTElaRVJfSAotI2RlZmluZSBBTkRST0lEX01FRElBX1ZJU1VBTElaRVJfSAotCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfdmlzdWFsaXplci5oPgotI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgotCi0vKioKLSAqIFRoZSBWaXN1YWxpemVyIGNsYXNzIGVuYWJsZXMgYXBwbGljYXRpb24gdG8gcmV0cmlldmUgcGFydCBvZiB0aGUgY3VycmVudGx5IHBsYXlpbmcgYXVkaW8gZm9yCi0gKiB2aXN1YWxpemF0aW9uIHB1cnBvc2UuIEl0IGlzIG5vdCBhbiBhdWRpbyByZWNvcmRpbmcgaW50ZXJmYWNlIGFuZCBvbmx5IHJldHVybnMgcGFydGlhbCBhbmQgbG93Ci0gKiBxdWFsaXR5IGF1ZGlvIGNvbnRlbnQuIEhvd2V2ZXIsIHRvIHByb3RlY3QgcHJpdmFjeSBvZiBjZXJ0YWluIGF1ZGlvIGRhdGEgKGUuZyB2b2ljZSBtYWlsKSB0aGUgdXNlCi0gKiBvZiB0aGUgdmlzdWFsaXplciByZXF1aXJlcyB0aGUgcGVybWlzc2lvbiBhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPLgotICogVGhlIGF1ZGlvIHNlc3Npb24gSUQgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3RvciBpbmRpY2F0ZXMgd2hpY2ggYXVkaW8gY29udGVudCBzaG91bGQgYmUKLSAqIHZpc3VhbGl6ZWQ6Ci0gKiAtIElmIHRoZSBzZXNzaW9uIGlzIDAsIHRoZSBhdWRpbyBvdXRwdXQgbWl4IGlzIHZpc3VhbGl6ZWQKLSAqIC0gSWYgdGhlIHNlc3Npb24gaXMgbm90IDAsIHRoZSBhdWRpbyBmcm9tIGEgcGFydGljdWxhciBNZWRpYVBsYXllciBvciBBdWRpb1RyYWNrCi0gKiAgIHVzaW5nIHRoaXMgYXVkaW8gc2Vzc2lvbiBpcyB2aXN1YWxpemVkCi0gKiBUd28gdHlwZXMgb2YgcmVwcmVzZW50YXRpb24gb2YgYXVkaW8gY29udGVudCBjYW4gYmUgY2FwdHVyZWQ6Ci0gKiAtIFdhdmVmb3JtIGRhdGE6IGNvbnNlY3V0aXZlIDgtYml0ICh1bnNpZ25lZCkgbW9ubyBzYW1wbGVzIGJ5IHVzaW5nIHRoZSBnZXRXYXZlRm9ybSgpIG1ldGhvZAotICogLSBGcmVxdWVuY3kgZGF0YTogOC1iaXQgbWFnbml0dWRlIEZGVCBieSB1c2luZyB0aGUgZ2V0RmZ0KCkgbWV0aG9kCi0gKgotICogVGhlIGxlbmd0aCBvZiB0aGUgY2FwdHVyZSBjYW4gYmUgcmV0cmlldmVkIG9yIHNwZWNpZmllZCBieSBjYWxsaW5nIHJlc3BlY3RpdmVseQotICogZ2V0Q2FwdHVyZVNpemUoKSBhbmQgc2V0Q2FwdHVyZVNpemUoKSBtZXRob2RzLiBOb3RlIHRoYXQgdGhlIHNpemUgb2YgdGhlIEZGVAotICogaXMgaGFsZiBvZiB0aGUgc3BlY2lmaWVkIGNhcHR1cmUgc2l6ZSBidXQgYm90aCBzaWRlcyBvZiB0aGUgc3BlY3RydW0gYXJlIHJldHVybmVkIHlpZWxkaW5nIGluIGEKLSAqIG51bWJlciBvZiBieXRlcyBlcXVhbCB0byB0aGUgY2FwdHVyZSBzaXplLiBUaGUgY2FwdHVyZSBzaXplIG11c3QgYmUgYSBwb3dlciBvZiAyIGluIHRoZSByYW5nZQotICogcmV0dXJuZWQgYnkgZ2V0TWluQ2FwdHVyZVNpemUoKSBhbmQgZ2V0TWF4Q2FwdHVyZVNpemUoKS4KLSAqIEluIGFkZGl0aW9uIHRvIHRoZSBwb2xsaW5nIGNhcHR1cmUgbW9kZSwgYSBjYWxsYmFjayBtb2RlIGlzIGFsc28gYXZhaWxhYmxlIGJ5IGluc3RhbGxpbmcgYQotICogY2FsbGJhY2sgZnVuY3Rpb24gYnkgdXNlIG9mIHRoZSBzZXRDYXB0dXJlQ2FsbEJhY2soKSBtZXRob2QuIFRoZSByYXRlIGF0IHdoaWNoIHRoZSBjYWxsYmFjawotICogaXMgY2FsbGVkIGFzIHdlbGwgYXMgdGhlIHR5cGUgb2YgZGF0YSByZXR1cm5lZCBpcyBzcGVjaWZpZWQuCi0gKiBCZWZvcmUgY2FwdHVyaW5nIGRhdGEsIHRoZSBWaXN1YWxpemVyIG11c3QgYmUgZW5hYmxlZCBieSBjYWxsaW5nIHRoZSBzZXRFbmFibGVkKCkgbWV0aG9kLgotICogV2hlbiBkYXRhIGNhcHR1cmUgaXMgbm90IG5lZWRlZCBhbnkgbW9yZSwgdGhlIFZpc3VhbGl6ZXIgc2hvdWxkIGJlIGRpc2FibGVkLgotICovCi0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIFZpc3VhbGl6ZXI6IHB1YmxpYyBBdWRpb0VmZmVjdCB7Ci1wdWJsaWM6Ci0KLSAgICBlbnVtIGNhbGxiYWNrX2ZsYWdzIHsKLSAgICAgICAgQ0FQVFVSRV9XQVZFRk9STSA9IDB4MDAwMDAwMDEsICAvLyBjYXB0dXJlIGNhbGxiYWNrIHJldHVybnMgYSBQQ00gd2F2ZSBmb3JtCi0gICAgICAgIENBUFRVUkVfRkZUID0gMHgwMDAwMDAwMiwgICAgICAgLy8gYXB0dXJlIGNhbGxiYWNrIHJldHVybnMgYSBmcmVxdWVuY3kgcmVwcmVzZW50YXRpb24KLSAgICAgICAgQ0FQVFVSRV9DQUxMX0pBVkEgPSAweDAwMDAwMDA0ICAvLyB0aGUgY2FsbGJhY2sgdGhyZWFkIGNhbiBjYWxsIGphdmEKLSAgICB9OwotCi0KLSAgICAvKiBDb25zdHJ1Y3Rvci4KLSAgICAgKiBTZWUgQXVkaW9FZmZlY3QgY29uc3RydWN0b3IgZm9yIGRldGFpbHMgb24gcGFyYW1ldGVycy4KLSAgICAgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgIFZpc3VhbGl6ZXIoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHkgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfY2FsbGJhY2tfdCBjYmYgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyID0gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCA9IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIH5WaXN1YWxpemVyKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKTsKLQotICAgIC8vIG1heGltdW0gY2FwdHVyZSBzaXplIGluIHNhbXBsZXMKLSAgICBzdGF0aWMgdWludDMyX3QgZ2V0TWF4Q2FwdHVyZVNpemUoKSB7IHJldHVybiBWSVNVQUxJWkVSX0NBUFRVUkVfU0laRV9NQVg7IH0KLSAgICAvLyBtaW5pbXVtIGNhcHR1cmUgc2l6ZSBpbiBzYW1wbGVzCi0gICAgc3RhdGljIHVpbnQzMl90IGdldE1pbkNhcHR1cmVTaXplKCkgeyByZXR1cm4gVklTVUFMSVpFUl9DQVBUVVJFX1NJWkVfTUlOOyB9Ci0gICAgLy8gbWF4aW11bSBjYXB0dXJlIHJhdGUgaW4gbWlsbGloZXJ0egotICAgIHN0YXRpYyB1aW50MzJfdCBnZXRNYXhDYXB0dXJlUmF0ZSgpIHsgcmV0dXJuIENBUFRVUkVfUkFURV9NQVg7IH0KLQotICAgIC8vIGNhbGxiYWNrIHVzZWQgdG8gcmV0dXJuIHBlcmlvZGljIFBDTSBvciBGRlQgY2FwdHVyZXMgdG8gdGhlIGFwcGxpY2F0aW9uLiBFaXRoZXIgb25lIG9yIGJvdGgKLSAgICAvLyB0eXBlcyBvZiBkYXRhIGFyZSByZXR1cm5lZCAoUENNIGFuZCBGRlQpIGFjY29yZGluZyB0byBmbGFncyBpbmRpY2F0ZWQgd2hlbiBpbnN0YWxsaW5nIHRoZQotICAgIC8vIGNhbGxiYWNrLiBXaGVuIGEgdHlwZSBvZiBkYXRhIGlzIG5vdCBwcmVzZW50LCB0aGUgY29ycmVzcG9uZGluZyBzaXplICh3YXZlZm9ybVNpemUgb3IKLSAgICAvLyBmZnRTaXplKSBpcyAwLgotICAgIHR5cGVkZWYgdm9pZCAoKmNhcHR1cmVfY2JrX3QpKHZvaWQqIHVzZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB3YXZlZm9ybVNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp3YXZlZm9ybSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZmdFNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICpmZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ3JhdGUpOwotCi0gICAgLy8gaW5zdGFsbCBhIGNhbGxiYWNrIHRvIHJlY2VpdmUgcGVyaW9kaWMgY2FwdHVyZXMuIFRoZSBjYXB0dXJlIHJhdGUgaXMgc3BlY2lmaWVkIGluIG1pbGxpSGVydHoKLSAgICAvLyBhbmQgdGhlIGNhcHR1cmUgZm9ybWF0IGlzIGFjY29yZGluZyB0byBmbGFncyAgKHNlZSBjYWxsYmFja19mbGFncykuCi0gICAgc3RhdHVzX3Qgc2V0Q2FwdHVyZUNhbGxCYWNrKGNhcHR1cmVfY2JrX3QgY2JrLCB2b2lkKiB1c2VyLCB1aW50MzJfdCBmbGFncywgdWludDMyX3QgcmF0ZSk7Ci0KLSAgICAvLyBzZXQgdGhlIGNhcHR1cmUgc2l6ZSBjYXB0dXJlIHNpemUgbXVzdCBiZSBhIHBvd2VyIG9mIHR3byBpbiB0aGUgcmFuZ2UKLSAgICAvLyBbVklTVUFMSVpFUl9DQVBUVVJFX1NJWkVfTUFYLiBWSVNVQUxJWkVSX0NBUFRVUkVfU0laRV9NSU5dCi0gICAgLy8gbXVzdCBiZSBjYWxsZWQgd2hlbiB0aGUgdmlzdWFsaXplciBpcyBub3QgZW5hYmxlZAotICAgIHN0YXR1c190IHNldENhcHR1cmVTaXplKHVpbnQzMl90IHNpemUpOwotICAgIHVpbnQzMl90IGdldENhcHR1cmVTaXplKCkgeyByZXR1cm4gbUNhcHR1cmVTaXplOyB9Ci0KLSAgICAvLyByZXR1cm5zIHRoZSBjYXB0dXJlIHJhdGUgaW5kaWNhdGVkIHdoZW4gaW5zdGFsbGluZyB0aGUgY2FsbGJhY2sKLSAgICB1aW50MzJfdCBnZXRDYXB0dXJlUmF0ZSgpIHsgcmV0dXJuIG1DYXB0dXJlUmF0ZTsgfQotCi0gICAgLy8gcmV0dXJucyB0aGUgc2FtcGxpbmcgcmF0ZSBvZiB0aGUgYXVkaW8gYmVpbmcgY2FwdHVyZWQKLSAgICB1aW50MzJfdCBnZXRTYW1wbGluZ1JhdGUoKSB7IHJldHVybiBtU2FtcGxlUmF0ZTsgfQotCi0gICAgLy8gc2V0IHRoZSB3YXkgdm9sdW1lIGFmZmVjdHMgdGhlIGNhcHR1cmVkIGRhdGEKLSAgICAvLyBtb2RlIG11c3Qgb25lIG9mIFZJU1VBTElaRVJfU0NBTElOR19NT0RFX05PUk1BTElaRUQsCi0gICAgLy8gIFZJU1VBTElaRVJfU0NBTElOR19NT0RFX0FTX1BMQVlFRAotICAgIHN0YXR1c190IHNldFNjYWxpbmdNb2RlKHVpbnQzMl90IG1vZGUpOwotICAgIHVpbnQzMl90IGdldFNjYWxpbmdNb2RlKCkgeyByZXR1cm4gbVNjYWxpbmdNb2RlOyB9Ci0KLSAgICAvLyBzZXQgd2hpY2ggbWVhc3VyZW1lbnRzIGFyZSBkb25lIG9uIHRoZSBhdWRpbyBidWZmZXJzIHByb2Nlc3NlZCBieSB0aGUgZWZmZWN0LgotICAgIC8vIHZhbGlkIG1lYXN1cmVtZW50cyAobWFzayk6IE1FQVNVUkVNRU5UX01PREVfUEVBS19STVMKLSAgICBzdGF0dXNfdCBzZXRNZWFzdXJlbWVudE1vZGUodWludDMyX3QgbW9kZSk7Ci0gICAgdWludDMyX3QgZ2V0TWVhc3VyZW1lbnRNb2RlKCkgeyByZXR1cm4gbU1lYXN1cmVtZW50TW9kZTsgfQotCi0gICAgLy8gcmV0dXJuIGEgc2V0IG9mIGludDMyX3QgbWVhc3VyZW1lbnRzCi0gICAgc3RhdHVzX3QgZ2V0SW50TWVhc3VyZW1lbnRzKHVpbnQzMl90IHR5cGUsIHVpbnQzMl90IG51bWJlciwgaW50MzJfdCAqbWVhc3VyZW1lbnRzKTsKLQotICAgIC8vIHJldHVybiBhIGNhcHR1cmUgaW4gUENNIDggYml0IHVuc2lnbmVkIGZvcm1hdC4gVGhlIHNpemUgb2YgdGhlIGNhcHR1cmUgaXMgZXF1YWwgdG8KLSAgICAvLyBnZXRDYXB0dXJlU2l6ZSgpCi0gICAgc3RhdHVzX3QgZ2V0V2F2ZUZvcm0odWludDhfdCAqd2F2ZWZvcm0pOwotCi0gICAgLy8gcmV0dXJuIGEgY2FwdHVyZSBpbiBGRlQgOCBiaXQgc2lnbmVkIGZvcm1hdC4gVGhlIHNpemUgb2YgdGhlIGNhcHR1cmUgaXMgZXF1YWwgdG8KLSAgICAvLyBnZXRDYXB0dXJlU2l6ZSgpIGJ1dCB0aGUgbGVuZ3RoIG9mIHRoZSBGRlQgaXMgaGFsZiBvZiB0aGUgc2l6ZSAoYm90aCBwYXJ0cyBvZiB0aGUgc3BlY3RydW0KLSAgICAvLyBhcmUgcmV0dXJuZWQKLSAgICBzdGF0dXNfdCBnZXRGZnQodWludDhfdCAqZmZ0KTsKLSAgICB2b2lkIHJlbGVhc2UoKTsKLQotcHJvdGVjdGVkOgotICAgIC8vIGZyb20gSUVmZmVjdENsaWVudAotICAgIHZpcnR1YWwgdm9pZCBjb250cm9sU3RhdHVzQ2hhbmdlZChib29sIGNvbnRyb2xHcmFudGVkKTsKLQotcHJpdmF0ZToKLQotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBDQVBUVVJFX1JBVEVfTUFYID0gMjAwMDA7Ci0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IENBUFRVUkVfUkFURV9ERUYgPSAxMDAwMDsKLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgQ0FQVFVSRV9TSVpFX0RFRiA9IFZJU1VBTElaRVJfQ0FQVFVSRV9TSVpFX01BWDsKLQotICAgIC8qIGludGVybmFsIGNsYXNzIHRvIGhhbmRsZSB0aGUgY2FsbGJhY2sgKi8KLSAgICBjbGFzcyBDYXB0dXJlVGhyZWFkIDogcHVibGljIFRocmVhZAotICAgIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIENhcHR1cmVUaHJlYWQoVmlzdWFsaXplciogdmlzdWFsaXplciwgdWludDMyX3QgY2FwdHVyZVJhdGUsIGJvb2wgYkNhbkNhbGxKYXZhID0gZmFsc2UpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgZnJpZW5kIGNsYXNzIFZpc3VhbGl6ZXI7Ci0gICAgICAgIHZpcnR1YWwgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwotICAgICAgICB3cDxWaXN1YWxpemVyPiBtUmVjZWl2ZXI7Ci0gICAgICAgIE11dGV4ICAgICAgIG1Mb2NrOwotICAgICAgICB1aW50MzJfdCBtU2xlZXBUaW1lVXM7Ci0gICAgfTsKLQotICAgIHN0YXR1c190IGRvRmZ0KHVpbnQ4X3QgKmZmdCwgdWludDhfdCAqd2F2ZWZvcm0pOwotICAgIHZvaWQgcGVyaW9kaWNDYXB0dXJlKCk7Ci0gICAgdWludDMyX3QgaW5pdENhcHR1cmVTaXplKCk7Ci0KLSAgICBNdXRleCBtQ2FwdHVyZUxvY2s7Ci0gICAgdWludDMyX3QgbUNhcHR1cmVSYXRlOwotICAgIHVpbnQzMl90IG1DYXB0dXJlU2l6ZTsKLSAgICB1aW50MzJfdCBtU2FtcGxlUmF0ZTsKLSAgICB1aW50MzJfdCBtU2NhbGluZ01vZGU7Ci0gICAgdWludDMyX3QgbU1lYXN1cmVtZW50TW9kZTsKLSAgICBjYXB0dXJlX2Nia190IG1DYXB0dXJlQ2FsbEJhY2s7Ci0gICAgdm9pZCAqbUNhcHR1cmVDYmtVc2VyOwotICAgIHNwPENhcHR1cmVUaHJlYWQ+IG1DYXB0dXJlVGhyZWFkOwotICAgIHVpbnQzMl90IG1DYXB0dXJlRmxhZ3M7Ci19OwotCi0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX01FRElBX1ZJU1VBTElaRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9tZWRpYXJlY29yZGVyLmggYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAppbmRleCBkOGIwZmU3Li4yZGQ0YjdmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL21lZGlhcmVjb3JkZXIuaApAQCAtNjcsNyArNjcsNyBAQAogICAgIE9VVFBVVF9GT1JNQVRfQUFDX0FEVFMgPSA2LAogCiAgICAgT1VUUFVUX0ZPUk1BVF9BVURJT19PTkxZX0VORCA9IDcsIC8vIFVzZWQgaW4gdmFsaWRhdGluZyB0aGUgb3V0cHV0IGZvcm1hdC4gIFNob3VsZCBiZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIGF0IHRoZSBlbmQgb2YgdGhlIGF1ZGlvIG9ubHkgb3V0cHV0IGZvcm1hdHMuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGF1ZGlvIG9ubHkgb3V0cHV0IGZvcm1hdHMuCiAKICAgICAvKiBTdHJlYW0gb3ZlciBhIHNvY2tldCwgbGltaXRlZCB0byBhIHNpbmdsZSBzdHJlYW0gKi8KICAgICBPVVRQVVRfRk9STUFUX1JUUF9BVlAgPSA3LApAQCAtODEsNiArODEsOSBAQAogICAgIC8qIEhFSUMgZGF0YSBpbiBhIEhFSUYgY29udGFpbmVyICovCiAgICAgT1VUUFVUX0ZPUk1BVF9IRUlGID0gMTAsCiAKKyAgICAvKiBPcHVzIGRhdGEgaW4gYSBPR0cgY29udGFpbmVyICovCisgICAgT1VUUFVUX0ZPUk1BVF9PR0cgPSAxMSwKKwogICAgIE9VVFBVVF9GT1JNQVRfTElTVF9FTkQgLy8gbXVzdCBiZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSBmb3JtYXQgdHlwZQogfTsKIApAQCAtOTIsNiArOTUsNyBAQAogICAgIEFVRElPX0VOQ09ERVJfSEVfQUFDID0gNCwKICAgICBBVURJT19FTkNPREVSX0FBQ19FTEQgPSA1LAogICAgIEFVRElPX0VOQ09ERVJfVk9SQklTID0gNiwKKyAgICBBVURJT19FTkNPREVSX09QVVMgPSA3LAogCiAgICAgQVVESU9fRU5DT0RFUl9MSVNUX0VORCAvLyBtdXN0IGJlIHRoZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSB0aGUgYXVkaW8gZW5jb2RlciB0eXBlCiB9OwpAQCAtMTExLDkgKzExNSw2IEBACiAgKiBUaGUgc3RhdGUgbWFjaGluZSBvZiB0aGUgbWVkaWFfcmVjb3JkZXIuCiAgKi8KIGVudW0gbWVkaWFfcmVjb3JkZXJfc3RhdGVzIHsKLSAgICAvLyBFcnJvciBzdGF0ZS4KLSAgICBNRURJQV9SRUNPUkRFUl9FUlJPUiAgICAgICAgICAgICAgICAgPSAgICAgIDAsCi0KICAgICAvLyBSZWNvcmRlciB3YXMganVzdCBjcmVhdGVkLgogICAgIE1FRElBX1JFQ09SREVSX0lETEUgICAgICAgICAgICAgICAgICA9IDEgPDwgMCwKIApAQCAtMTI4LDYgKzEyOSw5IEBACiAKICAgICAvLyBSZWNvcmRpbmcgaXMgaW4gcHJvZ3Jlc3MuCiAgICAgTUVESUFfUkVDT1JERVJfUkVDT1JESU5HICAgICAgICAgICAgID0gMSA8PCA0LAorCisgICAgLy8gRXJyb3Igc3RhdGUuCisgICAgTUVESUFfUkVDT1JERVJfRVJST1IgICAgICAgICAgICAgICAgID0gMSA8PCA1LAogfTsKIAogLy8gVGhlICJtc2ciIGNvZGUgcGFzc2VkIHRvIHRoZSBsaXN0ZW5lciBpbiBub3RpZnkuCkBAIC0yNjAsNiArMjY0LDEwIEBACiAgICAgc3RhdHVzX3QgICAgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqZGV2aWNlSWQpOwogICAgIHN0YXR1c190ICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKICAgICBzdGF0dXNfdCAgICBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgc3RhdHVzX3QgICAgc2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7CisgICAgc3RhdHVzX3QgICAgc2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOworCisgICAgc3RhdHVzX3QgICAgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgZG9DbGVhblVwKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvQ29udmVyc2lvbi5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL0NvbnZlcnNpb24uaAppbmRleCAzNzAwYTIzLi42ZGM0NmI3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvQ29udmVyc2lvbi5oCisrKyBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9Db252ZXJzaW9uLmgKQEAgLTE0LDggKzE0LDggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9PTVhfVjFfMF9fQ09OVkVSU0lPTl9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfTUVESUFfT01YX1YxXzBfX0NPTlZFUlNJT05fSAorI2lmbmRlZiBBTkRST0lEX0hBUkRXQVJFX01FRElBX09NWF9WMV8wX1VUSUxTX0NPTlZFUlNJT05fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX09NWF9WMV8wX1VUSUxTX0NPTlZFUlNJT05fSAogCiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPGxpc3Q+CkBAIC0zMSwxMiArMzEsMTIgQEAKICNpbmNsdWRlIDx1aS9GZW5jZVRpbWUuaD4KICNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgogCisjaW5jbHVkZSA8dWkvQnVmZmVyUXVldWVEZWZzLmg+CiAjaW5jbHVkZSA8dWkvR3JhcGhpY0J1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL09NWEZlbmNlUGFyY2VsYWJsZS5oPgogI2luY2x1ZGUgPG1lZGlhL09NWEJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL3R5cGVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXguaD4KQEAgLTI1OCw3ICsyNTgsMTIgQEAKICAqLwogLy8gY29udmVydDogU3RhdHVzIC0+IHN0YXR1c190CiBpbmxpbmUgc3RhdHVzX3QgdG9TdGF0dXNUKFJldHVybjxTdGF0dXM+IGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIHQuaXNPaygpID8gdG9TdGF0dXNUKHN0YXRpY19jYXN0PFN0YXR1cz4odCkpIDogVU5LTk9XTl9FUlJPUjsKKyAgICBpZiAodC5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHRvU3RhdHVzVChzdGF0aWNfY2FzdDxTdGF0dXM+KHQpKTsKKyAgICB9IGVsc2UgaWYgKHQuaXNEZWFkT2JqZWN0KCkpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKIH0KIAogLyoqCkBAIC0yODIsOCArMjg3LDggQEAKICAgICBjYXNlIFRJTUVEX09VVDoKICAgICBjYXNlIEVSUk9SX1VOU1VQUE9SVEVEOgogICAgIGNhc2UgVU5LTk9XTl9FUlJPUjoKLSAgICBjYXNlIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlJFTEVBU0VfQUxMX0JVRkZFUlM6Ci0gICAgY2FzZSBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OOgorICAgIGNhc2UgQnVmZmVyUXVldWVEZWZzOjpSRUxFQVNFX0FMTF9CVUZGRVJTOgorICAgIGNhc2UgQnVmZmVyUXVldWVEZWZzOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OOgogICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3RhdHVzPihsKTsKICAgICBjYXNlIE5PVF9FTk9VR0hfREFUQToKICAgICAgICAgcmV0dXJuIFN0YXR1czo6QlVGRkVSX05FRURTX1JFQUxMT0NBVElPTjsKQEAgLTYyMCw4ICs2MjUsMTggQEAKIC8vIGNvbnZlcnQ6IEFud0J1ZmZlciAtPiBHcmFwaGljQnVmZmVyCiAvLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvR3JhcGhpY0J1ZmZlci5jcHA6IEdyYXBoaWNCdWZmZXI6OmZsYXR0ZW4KIGlubGluZSBib29sIGNvbnZlcnRUbyhHcmFwaGljQnVmZmVyKiBsLCBBbndCdWZmZXIgY29uc3QmIHQpIHsKLSAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IHQubmF0aXZlSGFuZGxlID09IG51bGxwdHIgPwotICAgICAgICAgICAgbnVsbHB0ciA6IG5hdGl2ZV9oYW5kbGVfY2xvbmUodC5uYXRpdmVIYW5kbGUpOworICAgIG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlID0gbnVsbHB0cjsKKworICAgIGlmICh0Lm5hdGl2ZUhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgIGhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY2xvbmUodC5uYXRpdmVIYW5kbGUpOworICAgICAgICBpZiAoaGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY2xvbmUgaGFuZGxlOiBudW1GZHM9JWQsIGRhdGFbMF09JWQsIGRhdGFbMV09JWQiLAorICAgICAgICAgICAgICAgICAgICB0Lm5hdGl2ZUhhbmRsZS0+bnVtRmRzLAorICAgICAgICAgICAgICAgICAgICAodC5uYXRpdmVIYW5kbGUtPm51bUZkcyA+IDApID8gdC5uYXRpdmVIYW5kbGUtPmRhdGFbMF0gOiAtMSwKKyAgICAgICAgICAgICAgICAgICAgKHQubmF0aXZlSGFuZGxlLT5udW1GZHMgPiAxKSA/IHQubmF0aXZlSGFuZGxlLT5kYXRhWzFdIDogLTEpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQogCiAgICAgc2l6ZV90IGNvbnN0IG51bUludHMgPSAxMiArIChoYW5kbGUgPyBoYW5kbGUtPm51bUludHMgOiAwKTsKICAgICBpbnQzMl90KiBpbnRzID0gbmV3IGludDMyX3RbbnVtSW50c107CkBAIC03NTEsNyArNzY2LDEyIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBbndCdWZmZXIgYW53QnVmZmVyOwotICAgICAgICAgICAgYW53QnVmZmVyLm5hdGl2ZUhhbmRsZSA9IHQubmF0aXZlSGFuZGxlOworICAgICAgICAgICAgLy8gRXhwbGljaXRseSBnZXQgdGhlIG5hdGl2ZV9oYW5kbGVfdCogKGluIHN0ZWFkIG9mIGFzc2lnbmluZyB0Lm5hdGl2ZUhhbmRsZSkKKyAgICAgICAgICAgIC8vIHNvIHRoYXQgd2UgZG9uJ3QgZG8gYW4gZXh0cmEgbmF0aXZlX2hhbmRsZV9jbG9uZSgpIGluIHRoaXMgc3RlcCwgYXMgdGhlCisgICAgICAgICAgICAvLyBjb252ZXJ0aW9uIHRvIEdyYXBoaWNCdWZmZXIgYmVsb3cgd2lsbCBkbyBhIGNsb25lIHJlZ2FyZGxlc3MuCisgICAgICAgICAgICAvLyBJZiB3ZSBlbmNvdW50ZXIgYW4gaW52YWxpZCBoYW5kbGUsIHRoZSBjb252ZXJ0VG8oKSBiZWxvdyB3b3VsZCBmYWlsICh3aGlsZQorICAgICAgICAgICAgLy8gdGhlIGFzc2lnbmluZyBvZiBoaWRsX2hhbmRsZSB3b3VsZCBhYm9ydCBhbmQgY2F1c2UgYSBjcmFzaCkuCisgICAgICAgICAgICBhbndCdWZmZXIubmF0aXZlSGFuZGxlID0gdC5uYXRpdmVIYW5kbGUuZ2V0TmF0aXZlSGFuZGxlKCk7CiAgICAgICAgICAgICBhbndCdWZmZXIuYXR0ciA9IHQuYXR0ci5hbndCdWZmZXI7CiAgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaGljQnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKICAgICAgICAgICAgIGlmICghY29udmVydFRvKGdyYXBoaWNCdWZmZXIuZ2V0KCksIGFud0J1ZmZlcikpIHsKQEAgLTkzOCw0ICs5NTgsNCBAQAogfSAgLy8gbmFtZXNwYWNlIGhhcmR3YXJlCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCi0jZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfT01YX1YxXzBfX0NPTlZFUlNJT05fSAorI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX09NWF9WMV8wX1VUSUxTX0NPTlZFUlNJT05fSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXguaCBiL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214LmgKaW5kZXggZjEzNTQ2ZS4uMDY4MGVlYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXguaAorKysgYi9tZWRpYS9saWJtZWRpYS9pbmNsdWRlL21lZGlhL29teC8xLjAvV09teC5oCkBAIC00Nyw3ICs0Nyw2IEBACiAKIHVzaW5nIDo6YW5kcm9pZDo6TGlzdDsKIHVzaW5nIDo6YW5kcm9pZDo6SU9NWDsKLXVzaW5nIDo6YW5kcm9pZDo6Qm5PTVg7CiAKIC8qKgogICogV3JhcHBlciBjbGFzc2VzIGZvciBjb252ZXJzaW9uCkBAIC01OCw3ICs1Nyw3IEBACiAgKiAtIFRXID0gVHJlYmxlIFdyYXBwZXIgLS0tIEl0IHdyYXBzIGEgbGVnYWN5IG9iamVjdCBpbnNpZGUgYSBUcmVibGUgb2JqZWN0LgogICovCiAKLXN0cnVjdCBMV09teCA6IHB1YmxpYyBCbk9NWCB7CitzdHJ1Y3QgTFdPbXggOiBwdWJsaWMgSU9NWCB7CiAgICAgc3A8SU9teD4gbUJhc2U7CiAgICAgTFdPbXgoc3A8SU9teD4gY29uc3QmIGJhc2UpOwogICAgIHN0YXR1c190IGxpc3ROb2RlcyhMaXN0PElPTVg6OkNvbXBvbmVudEluZm8+KiBsaXN0KSBvdmVycmlkZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL2luY2x1ZGUvbWVkaWEvb214LzEuMC9XT214Tm9kZS5oIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmgKaW5kZXggZWViYzhjNi4uMWRiNDI0OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmgKKysrIGIvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9vbXgvMS4wL1dPbXhOb2RlLmgKQEAgLTU5LDcgKzU5LDcgQEAKICAqIC0gVFcgPSBUcmVibGUgV3JhcHBlciAtLS0gSXQgd3JhcHMgYSBsZWdhY3kgb2JqZWN0IGluc2lkZSBhIFRyZWJsZSBvYmplY3QuCiAgKi8KIAotc3RydWN0IExXT214Tm9kZSA6IHB1YmxpYyBIMkJDb252ZXJ0ZXI8SU9teE5vZGUsIElPTVhOb2RlLCBCbk9NWE5vZGU+IHsKK3N0cnVjdCBMV09teE5vZGUgOiBwdWJsaWMgSDJCQ29udmVydGVyPElPbXhOb2RlLCBCbk9NWE5vZGU+IHsKICAgICBMV09teE5vZGUoc3A8SU9teE5vZGU+IGNvbnN0JiBiYXNlKSA6IENCYXNlKGJhc2UpIHt9CiAgICAgc3RhdHVzX3QgZnJlZU5vZGUoKSBvdmVycmlkZTsKICAgICBzdGF0dXNfdCBzZW5kQ29tbWFuZCgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL21lZGlhcmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKaW5kZXggOTJjZmIxYy4uNDU3MGFmOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvbWVkaWFyZWNvcmRlci5jcHAKQEAgLTg0Miw0ICs4NDIsMjUgQEAKICAgICByZXR1cm4gbU1lZGlhUmVjb3JkZXItPmdldEFjdGl2ZU1pY3JvcGhvbmVzKGFjdGl2ZU1pY3JvcGhvbmVzKTsKIH0KIAorc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgeworICAgIEFMT0dWKCJzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKCVkKSIsIGRpcmVjdGlvbik7CisgICAgcmV0dXJuIG1NZWRpYVJlY29yZGVyLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGRpcmVjdGlvbik7Cit9CisKK3N0YXR1c190IE1lZGlhUmVjb3JkZXI6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgQUxPR1YoInNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbiglZikiLCB6b29tKTsKKyAgICByZXR1cm4gbU1lZGlhUmVjb3JkZXItPnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKTsKK30KKworc3RhdHVzX3QgTWVkaWFSZWNvcmRlcjo6Z2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3QKK3sKKyAgICBBTE9HVigiZ2V0UG9ydElkIik7CisKKyAgICBpZiAobU1lZGlhUmVjb3JkZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgibWVkaWEgcmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIHlldCIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorICAgIHJldHVybiBtTWVkaWFSZWNvcmRlci0+Z2V0UG9ydElkKHBvcnRJZCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL29teC8xLjAvV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIGIvbWVkaWEvbGlibWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKaW5kZXggMzFkMWRmOS4uMWVkMWQwNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5jcHAKQEAgLTMyLDcgKzMyLDcgQEAKIAogQm5TdGF0dXMgTFdHcmFwaGljQnVmZmVyU291cmNlOjpjb25maWd1cmUoCiAgICAgICAgIGNvbnN0IHNwPElPTVhOb2RlPiYgb214Tm9kZSwgaW50MzJfdCBkYXRhU3BhY2UpIHsKLSAgICBzcDxJT214Tm9kZT4gaE9teE5vZGUgPSBvbXhOb2RlLT5nZXRIYWxJbnRlcmZhY2UoKTsKKyAgICBzcDxJT214Tm9kZT4gaE9teE5vZGUgPSBvbXhOb2RlLT5nZXRIYWxJbnRlcmZhY2U8SU9teE5vZGU+KCk7CiAgICAgcmV0dXJuIHRvQmluZGVyU3RhdHVzKG1CYXNlLT5jb25maWd1cmUoCiAgICAgICAgICAgICBoT214Tm9kZSA9PSBudWxscHRyID8gbmV3IFRXT214Tm9kZShvbXhOb2RlKSA6IGhPbXhOb2RlLAogICAgICAgICAgICAgdG9IYXJkd2FyZURhdGFzcGFjZShkYXRhU3BhY2UpKSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS94c2QvYXBpL2N1cnJlbnQudHh0IGIvbWVkaWEvbGlibWVkaWEveHNkL2FwaS9jdXJyZW50LnR4dAppbmRleCAwNWU4YTQ5Li43M2I1ZjhkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS94c2QvYXBpL2N1cnJlbnQudHh0CisrKyBiL21lZGlhL2xpYm1lZGlhL3hzZC9hcGkvY3VycmVudC50eHQKQEAgLTQ0LDIwICs0NCwyMCBAQAogICBwdWJsaWMgY2xhc3MgQ2FtY29yZGVyUHJvZmlsZXMgewogICAgIGN0b3IgcHVibGljIENhbWNvcmRlclByb2ZpbGVzKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBpbnQgZ2V0Q2FtZXJhSWQoKTsKLSAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLnByb2ZpbGVzLkVuY29kZXJQcm9maWxlPiBnZXRFbmNvZGVyUHJvZmlsZSgpOwotICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEucHJvZmlsZXMuQ2FtY29yZGVyUHJvZmlsZXMuSW1hZ2VEZWNvZGluZz4gZ2V0SW1hZ2VEZWNvZGluZygpOwotICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEucHJvZmlsZXMuQ2FtY29yZGVyUHJvZmlsZXMuSW1hZ2VFbmNvZGluZz4gZ2V0SW1hZ2VFbmNvZGluZygpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEucHJvZmlsZXMuRW5jb2RlclByb2ZpbGU+IGdldEVuY29kZXJQcm9maWxlX29wdGlvbmFsKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5wcm9maWxlcy5DYW1jb3JkZXJQcm9maWxlcy5JbWFnZURlY29kaW5nT3B0aW9uYWw+IGdldEltYWdlRGVjb2Rpbmdfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLnByb2ZpbGVzLkNhbWNvcmRlclByb2ZpbGVzLkltYWdlRW5jb2RpbmdPcHRpb25hbD4gZ2V0SW1hZ2VFbmNvZGluZ19vcHRpb25hbCgpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRDYW1lcmFJZChpbnQpOwogICB9CiAKLSAgcHVibGljIHN0YXRpYyBjbGFzcyBDYW1jb3JkZXJQcm9maWxlcy5JbWFnZURlY29kaW5nIHsKLSAgICBjdG9yIHB1YmxpYyBDYW1jb3JkZXJQcm9maWxlcy5JbWFnZURlY29kaW5nKCk7CisgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQ2FtY29yZGVyUHJvZmlsZXMuSW1hZ2VEZWNvZGluZ09wdGlvbmFsIHsKKyAgICBjdG9yIHB1YmxpYyBDYW1jb3JkZXJQcm9maWxlcy5JbWFnZURlY29kaW5nT3B0aW9uYWwoKTsKICAgICBtZXRob2QgcHVibGljIGludCBnZXRNZW1DYXAoKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0TWVtQ2FwKGludCk7CiAgIH0KIAotICBwdWJsaWMgc3RhdGljIGNsYXNzIENhbWNvcmRlclByb2ZpbGVzLkltYWdlRW5jb2RpbmcgewotICAgIGN0b3IgcHVibGljIENhbWNvcmRlclByb2ZpbGVzLkltYWdlRW5jb2RpbmcoKTsKKyAgcHVibGljIHN0YXRpYyBjbGFzcyBDYW1jb3JkZXJQcm9maWxlcy5JbWFnZUVuY29kaW5nT3B0aW9uYWwgeworICAgIGN0b3IgcHVibGljIENhbWNvcmRlclByb2ZpbGVzLkltYWdlRW5jb2RpbmdPcHRpb25hbCgpOwogICAgIG1ldGhvZCBwdWJsaWMgaW50IGdldFF1YWxpdHkoKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0UXVhbGl0eShpbnQpOwogICB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYS94c2QvbWVkaWFfcHJvZmlsZXMueHNkIGIvbWVkaWEvbGlibWVkaWEveHNkL21lZGlhX3Byb2ZpbGVzLnhzZAppbmRleCBhMDIyNTJhLi45NjY0NDU2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS94c2QvbWVkaWFfcHJvZmlsZXMueHNkCisrKyBiL21lZGlhL2xpYm1lZGlhL3hzZC9tZWRpYV9wcm9maWxlcy54c2QKQEAgLTM1LDE5ICszNSwxOSBAQAogICAgICAgICA8L3hzOmNvbXBsZXhUeXBlPgogICAgIDwveHM6ZWxlbWVudD4KICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iQ2FtY29yZGVyUHJvZmlsZXMiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJFbmNvZGVyUHJvZmlsZSIgdHlwZT0iRW5jb2RlclByb2ZpbGUiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkltYWdlRW5jb2RpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRW5jb2RlclByb2ZpbGUiIHR5cGU9IkVuY29kZXJQcm9maWxlIi8+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJJbWFnZUVuY29kaW5nIj4KICAgICAgICAgICAgICAgICA8eHM6Y29tcGxleFR5cGU+CiAgICAgICAgICAgICAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icXVhbGl0eSIgdHlwZT0ieHM6aW50Ii8+CiAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkltYWdlRGVjb2RpbmciIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iSW1hZ2VEZWNvZGluZyI+CiAgICAgICAgICAgICAgICAgPHhzOmNvbXBsZXhUeXBlPgogICAgICAgICAgICAgICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im1lbUNhcCIgdHlwZT0ieHM6aW50Ii8+CiAgICAgICAgICAgICAgICAgPC94czpjb21wbGV4VHlwZT4KICAgICAgICAgICAgIDwveHM6ZWxlbWVudD4KLSAgICAgICAgPC94czpzZXF1ZW5jZT4KKyAgICAgICAgPC94czpjaG9pY2U+CiAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iY2FtZXJhSWQiIHR5cGU9InhzOmludCIvPgogICAgIDwveHM6Y29tcGxleFR5cGU+CiAgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9IkVuY29kZXJQcm9maWxlIj4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvQW5kcm9pZC5icAppbmRleCBiNTkwYTEyLi40NzM5NTA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS94c2QvdnRzL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9BbmRyb2lkLmJwCkBAIC0yNCw2ICsyNCw3IEBACiAgICAgICAgICJsaWJ4bWwyIiwKICAgICBdLAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiYXNlIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvVmFsaWRhdGVNZWRpYVByb2ZpbGVzLmNwcCBiL21lZGlhL2xpYm1lZGlhL3hzZC92dHMvVmFsaWRhdGVNZWRpYVByb2ZpbGVzLmNwcAppbmRleCBmZjliMDYwLi40ZjM5NTFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYS94c2QvdnRzL1ZhbGlkYXRlTWVkaWFQcm9maWxlcy5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWEveHNkL3Z0cy9WYWxpZGF0ZU1lZGlhUHJvZmlsZXMuY3BwCkBAIC0xNCwxNSArMTQsNjggQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9maWxlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlICJ1dGlsaXR5L1ZhbGlkYXRlWG1sLmgiCiAKK2Jvb2wgaXNGaWxlUmVhZGFibGUoc3RkOjpzdHJpbmcgY29uc3QmIHBhdGgpIHsKKyAgc3RkOjppZnN0cmVhbSBmKHBhdGgpOworICByZXR1cm4gZi5nb29kKCk7Cit9CisKIFRFU1QoQ2hlY2tDb25maWcsIG1lZGlhUHJvZmlsZXNWYWxpZGF0aW9uKSB7CiAgICAgUmVjb3JkUHJvcGVydHkoImRlc2NyaXB0aW9uIiwKICAgICAgICAgICAgICAgICAgICAiVmVyaWZ5IHRoYXQgdGhlIG1lZGlhIHByb2ZpbGVzIGZpbGUgIgogICAgICAgICAgICAgICAgICAgICJpcyB2YWxpZCBhY2NvcmRpbmcgdG8gdGhlIHNjaGVtYSIpOwogCi0gICAgY29uc3QgY2hhciogbG9jYXRpb24gPSAiL3ZlbmRvci9ldGMiOworICAgIC8vIFNjaGVtYSBwYXRoLgorICAgIGNvbnN0ZXhwciBjaGFyIGNvbnN0KiB4c2RQYXRoID0gIi9kYXRhL2xvY2FsL3RtcC9tZWRpYV9wcm9maWxlcy54c2QiOwogCi0gICAgRVhQRUNUX09ORV9WQUxJRF9YTUxfTVVMVElQTEVfTE9DQVRJT05TKCJtZWRpYV9wcm9maWxlc19WMV8wLnhtbCIsIHtsb2NhdGlvbn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvZGF0YS9sb2NhbC90bXAvbWVkaWFfcHJvZmlsZXMueHNkIik7CisgICAgLy8gSWYgIm1lZGlhLnNldHRpbmdzLnhtbCIgaXMgc2V0LCBpdCB3aWxsIGJlIHVzZWQgYXMgYW4gYWJzb2x1dGUgcGF0aC4KKyAgICBzdGQ6OnN0cmluZyBtZWRpYVNldHRpbmdzUGF0aCA9IGFuZHJvaWQ6OmJhc2U6OkdldFByb3BlcnR5KCJtZWRpYS5zZXR0aW5ncy54bWwiLCAiIik7CisgICAgaWYgKG1lZGlhU2V0dGluZ3NQYXRoLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gSWYgIm1lZGlhLnNldHRpbmdzLnhtbCIgaXMgbm90IHNldCwgd2Ugd2lsbCBzZWFyY2ggdGhyb3VnaCBhIGxpc3Qgb2YKKyAgICAgICAgLy8gZmlsZSBwYXRocy4KKworICAgICAgICBjb25zdGV4cHIgY2hhciBjb25zdCogeG1sU2VhcmNoRGlyc1tdID0geworICAgICAgICAgICAgICAgICIvcHJvZHVjdC9ldGMvIiwKKyAgICAgICAgICAgICAgICAiL29kbS9ldGMvIiwKKyAgICAgICAgICAgICAgICAiL3ZlbmRvci9ldGMvIiwKKyAgICAgICAgICAgIH07CisKKyAgICAgICAgLy8gVGhlIHZlbmRvciBtYXkgcHJvdmlkZSBhIHZlbmRvciB2YXJpYW50IGZvciB0aGUgZmlsZSBuYW1lLgorICAgICAgICBzdGQ6OnN0cmluZyB2YXJpYW50ID0gYW5kcm9pZDo6YmFzZTo6R2V0UHJvcGVydHkoCisgICAgICAgICAgICAgICAgInJvLm1lZGlhLnhtbF92YXJpYW50LnByb2ZpbGVzIiwgIl9WMV8wIik7CisgICAgICAgIHN0ZDo6c3RyaW5nIGZpbGVOYW1lID0gIm1lZGlhX3Byb2ZpbGVzIiArIHZhcmlhbnQgKyAiLnhtbCI7CisKKyAgICAgICAgLy8gRmFsbGJhY2sgcGF0aCBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIHByb3BlcnR5IGRlZmluZWQgZnJvbSB0aGUgdmVuZG9yCisgICAgICAgIC8vIHBhcnRpdGlvbi4KKyAgICAgICAgY29uc3RleHByIGNoYXIgY29uc3QqIGZhbGxiYWNrWG1sUGF0aCA9CisgICAgICAgICAgICAgICAgIi9zeXN0ZW0vZXRjL21lZGlhX3Byb2ZpbGVzX1YxXzAueG1sIjsKKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4geG1sUGF0aHMgPSB7CisgICAgICAgICAgICAgICAgeG1sU2VhcmNoRGlyc1swXSArIGZpbGVOYW1lLAorICAgICAgICAgICAgICAgIHhtbFNlYXJjaERpcnNbMV0gKyBmaWxlTmFtZSwKKyAgICAgICAgICAgICAgICB4bWxTZWFyY2hEaXJzWzJdICsgZmlsZU5hbWUsCisgICAgICAgICAgICAgICAgZmFsbGJhY2tYbWxQYXRoCisgICAgICAgICAgICB9OworCisgICAgICAgIGF1dG8gZmluZFhtbFBhdGggPQorICAgICAgICAgICAgc3RkOjpmaW5kX2lmKHhtbFBhdGhzLmJlZ2luKCksIHhtbFBhdGhzLmVuZCgpLCBpc0ZpbGVSZWFkYWJsZSk7CisgICAgICAgIEFTU0VSVF9UUlVFKGZpbmRYbWxQYXRoICE9IHhtbFBhdGhzLmVuZCgpKQorICAgICAgICAgICAgICAgIDw8ICJDYW5ub3QgcmVhZCBmcm9tICIgPDwgZmlsZU5hbWUKKyAgICAgICAgICAgICAgICA8PCAiIGluIGFueSBzZWFyY2ggZGlyZWN0b3JpZXMgKCIKKyAgICAgICAgICAgICAgICA8PCB4bWxTZWFyY2hEaXJzWzBdIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCB4bWxTZWFyY2hEaXJzWzFdIDw8ICIsICIKKyAgICAgICAgICAgICAgICA8PCB4bWxTZWFyY2hEaXJzWzJdIDw8ICIpIGFuZCBmcm9tICIKKyAgICAgICAgICAgICAgICA8PCBmYWxsYmFja1htbFBhdGggPDwgIi4iOworCisgICAgICAgIGNoYXIgY29uc3QqIHhtbFBhdGggPSBmaW5kWG1sUGF0aC0+Y19zdHIoKTsKKyAgICAgICAgRVhQRUNUX1ZBTElEX1hNTCh4bWxQYXRoLCB4c2RQYXRoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBFWFBFQ1RfVkFMSURfWE1MKG1lZGlhU2V0dGluZ3NQYXRoLmNfc3RyKCksIHhzZFBhdGgpOworICAgIH0KIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDNiOGY2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi1jY19saWJyYXJ5IHsKLSAgICBuYW1lOiAibGlibWVkaWFleHRyYWN0b3IiLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlIiwKLSAgICBdLAotCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCi0KLSAgICBjZmxhZ3M6IFsKLSAgICAgICAgIi1Xbm8tbXVsdGljaGFyIiwKLSAgICAgICAgIi1XZXJyb3IiLAotICAgICAgICAiLVdhbGwiLAotICAgIF0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgIkRhdGFTb3VyY2VCYXNlLmNwcCIsCi0gICAgICAgICJNZWRpYUJ1ZmZlci5jcHAiLAotICAgICAgICAiTWVkaWFCdWZmZXJCYXNlLmNwcCIsCi0gICAgICAgICJNZWRpYUJ1ZmZlckdyb3VwLmNwcCIsCi0gICAgICAgICJNZWRpYVNvdXJjZS5jcHAiLAotICAgICAgICAiTWVkaWFUcmFjay5jcHAiLAotICAgICAgICAiTWVkaWFFeHRyYWN0b3IuY3BwIiwKLSAgICAgICAgIk1ldGFEYXRhLmNwcCIsCi0gICAgICAgICJNZXRhRGF0YUJhc2UuY3BwIiwKLSAgICAgICAgIlZvcmJpc0NvbW1lbnQuY3BwIiwKLSAgICBdLAotCi0gICAgY2xhbmc6IHRydWUsCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgXSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9EYXRhU291cmNlQmFzZS5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9EYXRhU291cmNlQmFzZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNDdlZTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvRGF0YVNvdXJjZUJhc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJEYXRhU291cmNlQmFzZSIKLQotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1ib29sIERhdGFTb3VyY2VCYXNlOjpnZXRVSW50MTYob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4KSB7Ci0gICAgKnggPSAwOwotCi0gICAgdWludDhfdCBieXRlWzJdOwotICAgIGlmIChyZWFkQXQob2Zmc2V0LCBieXRlLCAyKSAhPSAyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAqeCA9IChieXRlWzBdIDw8IDgpIHwgYnl0ZVsxXTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIERhdGFTb3VyY2VCYXNlOjpnZXRVSW50MjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KSB7Ci0gICAgKnggPSAwOwotCi0gICAgdWludDhfdCBieXRlWzNdOwotICAgIGlmIChyZWFkQXQob2Zmc2V0LCBieXRlLCAzKSAhPSAzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAqeCA9IChieXRlWzBdIDw8IDE2KSB8IChieXRlWzFdIDw8IDgpIHwgYnl0ZVsyXTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIERhdGFTb3VyY2VCYXNlOjpnZXRVSW50MzIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KSB7Ci0gICAgKnggPSAwOwotCi0gICAgdWludDMyX3QgdG1wOwotICAgIGlmIChyZWFkQXQob2Zmc2V0LCAmdG1wLCA0KSAhPSA0KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAqeCA9IG50b2hsKHRtcCk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEYXRhU291cmNlQmFzZTo6Z2V0VUludDY0KG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCkgewotICAgICp4ID0gMDsKLQotICAgIHVpbnQ2NF90IHRtcDsKLSAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgOCkgIT0gOCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKnggPSBudG9oNjQodG1wKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIERhdGFTb3VyY2VCYXNlOjpnZXRVSW50MTZWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4LCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChzaXplID09IDIpIHsKLSAgICAgICAgcmV0dXJuIGdldFVJbnQxNihvZmZzZXQsIHgpOwotICAgIH0KLSAgICBpZiAoc2l6ZSA9PSAxKSB7Ci0gICAgICAgIHVpbnQ4X3QgdG1wOwotICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgMSkgPT0gMSkgewotICAgICAgICAgICAgKnggPSB0bXA7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgRGF0YVNvdXJjZUJhc2U6OmdldFVJbnQzMlZhcihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKHNpemUgPT0gNCkgewotICAgICAgICByZXR1cm4gZ2V0VUludDMyKG9mZnNldCwgeCk7Ci0gICAgfQotICAgIGlmIChzaXplID09IDIpIHsKLSAgICAgICAgdWludDE2X3QgdG1wOwotICAgICAgICBpZiAoZ2V0VUludDE2KG9mZnNldCwgJnRtcCkpIHsKLSAgICAgICAgICAgICp4ID0gdG1wOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIERhdGFTb3VyY2VCYXNlOjpnZXRVSW50NjRWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQ2NF90ICp4LCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChzaXplID09IDgpIHsKLSAgICAgICAgcmV0dXJuIGdldFVJbnQ2NChvZmZzZXQsIHgpOwotICAgIH0KLSAgICBpZiAoc2l6ZSA9PSA0KSB7Ci0gICAgICAgIHVpbnQzMl90IHRtcDsKLSAgICAgICAgaWYgKGdldFVJbnQzMihvZmZzZXQsICZ0bXApKSB7Ci0gICAgICAgICAgICAqeCA9IHRtcDsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdHVzX3QgRGF0YVNvdXJjZUJhc2U6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgewotICAgICpzaXplID0gMDsKLQotICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLX0KLQotYm9vbCBEYXRhU291cmNlQmFzZTo6Z2V0VXJpKGNoYXIgKnVyaVN0cmluZyBfX3VudXNlZCwgc2l6ZV90IGJ1ZmZlclNpemUgX191bnVzZWQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlci5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxOTdiM2YuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk1lZGlhQnVmZmVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKiBzdGF0aWMgKi8KLXN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgTWVkaWFCdWZmZXI6Om1Vc2VTaGFyZWRNZW1vcnkoMCk7Ci0KLU1lZGlhQnVmZmVyOjpNZWRpYUJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkKLSAgICA6IG1PYnNlcnZlcihOVUxMKSwKLSAgICAgIG1SZWZDb3VudCgwKSwKLSAgICAgIG1EYXRhKGRhdGEpLAotICAgICAgbVNpemUoc2l6ZSksCi0gICAgICBtUmFuZ2VPZmZzZXQoMCksCi0gICAgICBtUmFuZ2VMZW5ndGgoc2l6ZSksCi0gICAgICBtT3duc0RhdGEoZmFsc2UpLAotICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YUJhc2UpLAotICAgICAgbU9yaWdpbmFsKE5VTEwpIHsKLX0KLQotTWVkaWFCdWZmZXI6Ok1lZGlhQnVmZmVyKHNpemVfdCBzaXplKQotICAgIDogbU9ic2VydmVyKE5VTEwpLAotICAgICAgbVJlZkNvdW50KDApLAotICAgICAgbURhdGEoTlVMTCksCi0gICAgICBtU2l6ZShzaXplKSwKLSAgICAgIG1SYW5nZU9mZnNldCgwKSwKLSAgICAgIG1SYW5nZUxlbmd0aChzaXplKSwKLSAgICAgIG1Pd25zRGF0YSh0cnVlKSwKLSAgICAgIG1NZXRhRGF0YShuZXcgTWV0YURhdGFCYXNlKSwKLSAgICAgIG1PcmlnaW5hbChOVUxMKSB7Ci0gICAgaWYgKHNpemUgPCBrU2hhcmVkTWVtVGhyZXNob2xkCi0gICAgICAgICAgICB8fCBzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCZtVXNlU2hhcmVkTWVtb3J5LCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KSA9PSAwKSB7Ci0gICAgICAgIG1EYXRhID0gbWFsbG9jKHNpemUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJjcmVhdGluZyBtZW1vcnlEZWFsZXIiKTsKLSAgICAgICAgc3A8TWVtb3J5RGVhbGVyPiBtZW1vcnlEZWFsZXIgPQotICAgICAgICAgICAgICAgIG5ldyBNZW1vcnlEZWFsZXIoc2l6ZSArIHNpemVvZihTaGFyZWRDb250cm9sKSwgIk1lZGlhQnVmZmVyIik7Ci0gICAgICAgIG1NZW1vcnkgPSBtZW1vcnlEZWFsZXItPmFsbG9jYXRlKHNpemUgKyBzaXplb2YoU2hhcmVkQ29udHJvbCkpOwotICAgICAgICBpZiAobU1lbW9yeSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGFsbG9jYXRlIHNoYXJlZCBtZW1vcnksIHRyeWluZyByZWd1bGFyIGFsbG9jYXRpb24hIik7Ci0gICAgICAgICAgICBtRGF0YSA9IG1hbGxvYyhzaXplKTsKLSAgICAgICAgICAgIGlmIChtRGF0YSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIk91dCBvZiBtZW1vcnkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdldFNoYXJlZENvbnRyb2woKS0+Y2xlYXIoKTsKLSAgICAgICAgICAgIG1EYXRhID0gKHVpbnQ4X3QgKiltTWVtb3J5LT5wb2ludGVyKCkgKyBzaXplb2YoU2hhcmVkQ29udHJvbCk7Ci0gICAgICAgICAgICBBTE9HVigiQWxsb2NhdGVkIHNoYXJlZCBtZW0gYnVmZmVyIG9mIHNpemUgJXp1IEAgJXAiLCBzaXplLCBtRGF0YSk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLU1lZGlhQnVmZmVyOjpNZWRpYUJ1ZmZlcihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKQotICAgIDogbU9ic2VydmVyKE5VTEwpLAotICAgICAgbVJlZkNvdW50KDApLAotICAgICAgbURhdGEoYnVmZmVyLT5kYXRhKCkpLAotICAgICAgbVNpemUoYnVmZmVyLT5zaXplKCkpLAotICAgICAgbVJhbmdlT2Zmc2V0KDApLAotICAgICAgbVJhbmdlTGVuZ3RoKG1TaXplKSwKLSAgICAgIG1CdWZmZXIoYnVmZmVyKSwKLSAgICAgIG1Pd25zRGF0YShmYWxzZSksCi0gICAgICBtTWV0YURhdGEobmV3IE1ldGFEYXRhQmFzZSksCi0gICAgICBtT3JpZ2luYWwoTlVMTCkgewotfQotCi12b2lkIE1lZGlhQnVmZmVyOjpyZWxlYXNlKCkgewotICAgIGlmIChtT2JzZXJ2ZXIgPT0gTlVMTCkgewotICAgICAgICAvLyBMZWdhY3kgY29udHJhY3QgZm9yIE1lZGlhQnVmZmVyIHdpdGhvdXQgYSBNZWRpYUJ1ZmZlckdyb3VwLgotICAgICAgICBDSEVDS19FUShtUmVmQ291bnQsIDApOwotICAgICAgICBkZWxldGUgdGhpczsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGludCBwcmV2Q291bnQgPSBtUmVmQ291bnQuZmV0Y2hfc3ViKDEpOwotICAgIGlmIChwcmV2Q291bnQgPT0gMSkgewotICAgICAgICBpZiAobU9ic2VydmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGRlbGV0ZSB0aGlzOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbU9ic2VydmVyLT5zaWduYWxCdWZmZXJSZXR1cm5lZCh0aGlzKTsKLSAgICB9Ci0gICAgQ0hFQ0socHJldkNvdW50ID4gMCk7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXI6OmNsYWltKCkgewotICAgIENIRUNLKG1PYnNlcnZlciAhPSBOVUxMKTsKLSAgICBDSEVDS19FUShtUmVmQ291bnQubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSwgMSk7Ci0KLSAgICBtUmVmQ291bnQuc3RvcmUoMCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXI6OmFkZF9yZWYoKSB7Ci0gICAgKHZvaWQpIG1SZWZDb3VudC5mZXRjaF9hZGQoMSk7Ci19Ci0KLXZvaWQgKk1lZGlhQnVmZmVyOjpkYXRhKCkgY29uc3QgewotICAgIHJldHVybiBtRGF0YTsKLX0KLQotc2l6ZV90IE1lZGlhQnVmZmVyOjpzaXplKCkgY29uc3QgewotICAgIHJldHVybiBtU2l6ZTsKLX0KLQotc2l6ZV90IE1lZGlhQnVmZmVyOjpyYW5nZV9vZmZzZXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1SYW5nZU9mZnNldDsKLX0KLQotc2l6ZV90IE1lZGlhQnVmZmVyOjpyYW5nZV9sZW5ndGgoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1SYW5nZUxlbmd0aDsKLX0KLQotdm9pZCBNZWRpYUJ1ZmZlcjo6c2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpIHsKLSAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID4gbVNpemUpIHsKLSAgICAgICAgQUxPR0UoIm9mZnNldCA9ICV6dSwgbGVuZ3RoID0gJXp1LCBtU2l6ZSA9ICV6dSIsIG9mZnNldCwgbGVuZ3RoLCBtU2l6ZSk7Ci0gICAgfQotICAgIENIRUNLKG9mZnNldCArIGxlbmd0aCA8PSBtU2l6ZSk7Ci0KLSAgICBtUmFuZ2VPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgbVJhbmdlTGVuZ3RoID0gbGVuZ3RoOwotfQotCi1NZXRhRGF0YUJhc2UmIE1lZGlhQnVmZmVyOjptZXRhX2RhdGEoKSB7Ci0gICAgcmV0dXJuICptTWV0YURhdGE7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXI6OnJlc2V0KCkgewotICAgIG1NZXRhRGF0YS0+Y2xlYXIoKTsKLSAgICBzZXRfcmFuZ2UoMCwgbVNpemUpOwotfQotCi1NZWRpYUJ1ZmZlcjo6fk1lZGlhQnVmZmVyKCkgewotICAgIENIRUNLKG1PYnNlcnZlciA9PSBOVUxMKTsKLQotICAgIGlmIChtT3duc0RhdGEgJiYgbURhdGEgIT0gTlVMTCAmJiBtTWVtb3J5ID09IE5VTEwpIHsKLSAgICAgICAgZnJlZShtRGF0YSk7Ci0gICAgICAgIG1EYXRhID0gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobU9yaWdpbmFsICE9IE5VTEwpIHsKLSAgICAgICAgbU9yaWdpbmFsLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1PcmlnaW5hbCA9IE5VTEw7Ci0gICAgfQotCi0gICBpZiAobU1lbW9yeS5nZXQoKSAhPSBudWxscHRyKSB7Ci0gICAgICAgZ2V0U2hhcmVkQ29udHJvbCgpLT5zZXREZWFkT2JqZWN0KCk7Ci0gICB9Ci0gICBkZWxldGUgbU1ldGFEYXRhOwotfQotCi12b2lkIE1lZGlhQnVmZmVyOjpzZXRPYnNlcnZlcihNZWRpYUJ1ZmZlck9ic2VydmVyICpvYnNlcnZlcikgewotICAgIENIRUNLKG9ic2VydmVyID09IE5VTEwgfHwgbU9ic2VydmVyID09IE5VTEwpOwotICAgIG1PYnNlcnZlciA9IG9ic2VydmVyOwotfQotCi1NZWRpYUJ1ZmZlckJhc2UgKk1lZGlhQnVmZmVyOjpjbG9uZSgpIHsKLSAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKG1EYXRhLCBtU2l6ZSk7Ci0gICAgYnVmZmVyLT5zZXRfcmFuZ2UobVJhbmdlT2Zmc2V0LCBtUmFuZ2VMZW5ndGgpOwotICAgIGJ1ZmZlci0+bU1ldGFEYXRhID0gbmV3IE1ldGFEYXRhQmFzZSgqbU1ldGFEYXRhKTsKLQotICAgIGFkZF9yZWYoKTsKLSAgICBidWZmZXItPm1PcmlnaW5hbCA9IHRoaXM7Ci0KLSAgICByZXR1cm4gYnVmZmVyOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFCdWZmZXJHcm91cC5jcHAgYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlckdyb3VwLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE4ZGQ0MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlckdyb3VwLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJNZWRpYUJ1ZmZlckdyb3VwIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8bGlzdD4KLQotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdGQ6Om1pbiBpcyBub3QgY29uc3RleHByIGluIEMrKzExCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotY29uc3RleHByIFQgTUlOKGNvbnN0IFQgJmEsIGNvbnN0IFQgJmIpIHsgcmV0dXJuIGEgPD0gYiA/IGEgOiBiOyB9Ci0KLS8vIE1lZGlhQnVmZmVyR3JvdXAgbWF5IGNyZWF0ZSBzaGFyZWQgbWVtb3J5IGJ1ZmZlcnMgYXQgYQotLy8gc21hbGxlciB0aHJlc2hvbGQgdGhhbiBhbiBpc29sYXRlZCBuZXcgTWVkaWFCdWZmZXIuCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtTaGFyZWRNZW1vcnlUaHJlc2hvbGQgPSBNSU4oCi0gICAgICAgIChzaXplX3QpTWVkaWFCdWZmZXI6OmtTaGFyZWRNZW1UaHJlc2hvbGQsIChzaXplX3QpKDQgKiAxMDI0KSk7Ci0KLXN0cnVjdCBNZWRpYUJ1ZmZlckdyb3VwOjpJbnRlcm5hbERhdGEgewotICAgIE11dGV4IG1Mb2NrOwotICAgIENvbmRpdGlvbiBtQ29uZGl0aW9uOwotICAgIHNpemVfdCBtR3Jvd3RoTGltaXQ7ICAvLyBEbyBub3QgYXV0b21hdGljYWxseSBncm93IGdyb3VwIGxhcmdlciB0aGFuIHRoaXMuCi0gICAgc3RkOjpsaXN0PE1lZGlhQnVmZmVyQmFzZSAqPiBtQnVmZmVyczsKLX07Ci0KLU1lZGlhQnVmZmVyR3JvdXA6Ok1lZGlhQnVmZmVyR3JvdXAoc2l6ZV90IGdyb3d0aExpbWl0KQotICAgIDogbUludGVybmFsKG5ldyBJbnRlcm5hbERhdGEoKSkgewotICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID0gZ3Jvd3RoTGltaXQ7Ci19Ci0KLU1lZGlhQnVmZmVyR3JvdXA6Ok1lZGlhQnVmZmVyR3JvdXAoc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0KQotICAgIDogbUludGVybmFsKG5ldyBJbnRlcm5hbERhdGEoKSkgewotICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID0gZ3Jvd3RoTGltaXQ7Ci0KLSAgICBpZiAobUludGVybmFsLT5tR3Jvd3RoTGltaXQgPiAwICYmIGJ1ZmZlcnMgPiBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCkgewotICAgICAgICBBTE9HVygiUHJlYWxsb2NhdGVkIGJ1ZmZlcnMgJXp1ID4gZ3Jvd3RoTGltaXQgJXp1LCBpbmNyZWFzaW5nIGdyb3d0aExpbWl0IiwKLSAgICAgICAgICAgICAgICBidWZmZXJzLCBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCk7Ci0gICAgICAgIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0ID0gYnVmZmVyczsKLSAgICB9Ci0KLSAgICBpZiAoYnVmZmVyX3NpemUgPj0ga1NoYXJlZE1lbW9yeVRocmVzaG9sZCkgewotICAgICAgICBBTE9HRCgiY3JlYXRpbmcgTWVtb3J5RGVhbGVyIik7Ci0gICAgICAgIC8vIFVzaW5nIGEgc2luZ2xlIE1lbW9yeURlYWxlciBpcyBlZmZpY2llbnQgZm9yIGEgZ3JvdXAgb2Ygc2hhcmVkIG1lbW9yeSBvYmplY3RzLgotICAgICAgICAvLyBUaGlzIGxvb3AgZ3VhcmFudGVlcyB0aGF0IHdlIHVzZSBzaGFyZWQgbWVtb3J5IChubyBmYWxsYmFjayB0byBtYWxsb2MpLgotCi0gICAgICAgIHNpemVfdCBhbGlnbm1lbnQgPSBNZW1vcnlEZWFsZXI6OmdldEFsbG9jYXRpb25BbGlnbm1lbnQoKTsKLSAgICAgICAgc2l6ZV90IGF1Z21lbnRlZF9zaXplID0gYnVmZmVyX3NpemUgKyBzaXplb2YoTWVkaWFCdWZmZXI6OlNoYXJlZENvbnRyb2wpOwotICAgICAgICBzaXplX3QgdG90YWwgPSAoYXVnbWVudGVkX3NpemUgKyBhbGlnbm1lbnQgLSAxKSAvIGFsaWdubWVudCAqIGFsaWdubWVudCAqIGJ1ZmZlcnM7Ci0gICAgICAgIHNwPE1lbW9yeURlYWxlcj4gbWVtb3J5RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcih0b3RhbCwgIk1lZGlhQnVmZmVyR3JvdXAiKTsKLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcnM7ICsraSkgewotICAgICAgICAgICAgc3A8SU1lbW9yeT4gbWVtID0gbWVtb3J5RGVhbGVyLT5hbGxvY2F0ZShhdWdtZW50ZWRfc2l6ZSk7Ci0gICAgICAgICAgICBpZiAobWVtLmdldCgpID09IG51bGxwdHIgfHwgbWVtLT5wb2ludGVyKCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dXKCJPbmx5IGFsbG9jYXRlZCAlenUgc2hhcmVkIGJ1ZmZlcnMgb2Ygc2l6ZSAlenUiLCBpLCBidWZmZXJfc2l6ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKG1lbSk7Ci0gICAgICAgICAgICBidWZmZXItPmdldFNoYXJlZENvbnRyb2woKS0+Y2xlYXIoKTsKLSAgICAgICAgICAgIGFkZF9idWZmZXIoYnVmZmVyKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gTm9uLXNoYXJlZCBtZW1vcnkgYWxsb2NhdGlvbi4KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcnM7ICsraSkgewotICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGJ1ZmZlcl9zaXplKTsKLSAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBidWZmZXI7IC8vIGRvbid0IGNhbGwgcmVsZWFzZSwgaXQncyBub3QgcHJvcGVybHkgZm9ybWVkCi0gICAgICAgICAgICBBTE9HVygiT25seSBhbGxvY2F0ZWQgJXp1IG1hbGxvYyBidWZmZXJzIG9mIHNpemUgJXp1IiwgaSwgYnVmZmVyX3NpemUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkX2J1ZmZlcihidWZmZXIpOwotICAgIH0KLX0KLQotTWVkaWFCdWZmZXJHcm91cDo6fk1lZGlhQnVmZmVyR3JvdXAoKSB7Ci0gICAgZm9yIChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA6IG1JbnRlcm5hbC0+bUJ1ZmZlcnMpIHsKLSAgICAgICAgaWYgKGJ1ZmZlci0+cmVmY291bnQoKSAhPSAwKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQgbG9jYWxSZWZjb3VudCA9IGJ1ZmZlci0+bG9jYWxSZWZjb3VudCgpOwotICAgICAgICAgICAgY29uc3QgaW50IHJlbW90ZVJlZmNvdW50ID0gYnVmZmVyLT5yZW1vdGVSZWZjb3VudCgpOwotCi0gICAgICAgICAgICAvLyBGYXRhbCBpZiB3ZSBoYXZlIGEgbG9jYWwgcmVmY291bnQuCi0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGxvY2FsUmVmY291bnQgIT0gMCwKLSAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciglcCkgbG9jYWxSZWZjb3VudCAlZCAhPSAwLCByZW1vdGVSZWZjb3VudCAlZCIsCi0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgbG9jYWxSZWZjb3VudCwgcmVtb3RlUmVmY291bnQpOwotCi0gICAgICAgICAgICAvLyBMb2cgYW4gZXJyb3IgaWYgd2UgaGF2ZSBhIHJlbWFpbmluZyByZW1vdGUgcmVmY291bnQsCi0gICAgICAgICAgICAvLyBhcyB0aGUgcmVtb3RlIHByb2Nlc3MgbWF5IGhhdmUgZGllZCBvciBtYXkgaGF2ZSBpbmFwcHJvcHJpYXRlIGJlaGF2aW9yLgotICAgICAgICAgICAgLy8gVGhlIHNoYXJlZCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBNZWRpYUJ1ZmZlciB3aWxsCi0gICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGJlIHJlY2xhaW1lZCB3aGVuIHRoZXJlIGFyZSBubyByZW1haW5pbmcgZmRzCi0gICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggaXQuCi0gICAgICAgICAgICBBTE9HRSgiYnVmZmVyKCVwKSBoYXMgcmVzaWR1YWwgcmVtb3RlUmVmY291bnQgJWQiLAotICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHJlbW90ZVJlZmNvdW50KTsKLSAgICAgICAgfQotICAgICAgICAvLyBncmFjZWZ1bGx5IGRlbGV0ZS4KLSAgICAgICAgYnVmZmVyLT5zZXRPYnNlcnZlcihudWxscHRyKTsKLSAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgfQotICAgIGRlbGV0ZSBtSW50ZXJuYWw7Ci19Ci0KLXZvaWQgTWVkaWFCdWZmZXJHcm91cDo6YWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtSW50ZXJuYWwtPm1Mb2NrKTsKLQotICAgIC8vIGlmIHdlJ3JlIGFib3ZlIG91ciBncm93dGggbGltaXQsIHJlbGVhc2UgYnVmZmVycyBpZiB3ZSBjYW4KLSAgICBmb3IgKGF1dG8gaXQgPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmJlZ2luKCk7Ci0gICAgICAgICAgICBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA+IDAKLSAgICAgICAgICAgICYmIG1JbnRlcm5hbC0+bUJ1ZmZlcnMuc2l6ZSgpID49IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0Ci0gICAgICAgICAgICAmJiBpdCAhPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpOykgewotICAgICAgICBpZiAoKCppdCktPnJlZmNvdW50KCkgPT0gMCkgewotICAgICAgICAgICAgKCppdCktPnNldE9ic2VydmVyKG51bGxwdHIpOwotICAgICAgICAgICAgKCppdCktPnJlbGVhc2UoKTsKLSAgICAgICAgICAgIGl0ID0gbUludGVybmFsLT5tQnVmZmVycy5lcmFzZShpdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICArK2l0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgYnVmZmVyLT5zZXRPYnNlcnZlcih0aGlzKTsKLSAgICBtSW50ZXJuYWwtPm1CdWZmZXJzLmVtcGxhY2VfYmFjayhidWZmZXIpOwotfQotCi1ib29sIE1lZGlhQnVmZmVyR3JvdXA6Omhhc19idWZmZXJzKCkgewotICAgIGlmIChtSW50ZXJuYWwtPm1CdWZmZXJzLnNpemUoKSA8IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KSB7Ci0gICAgICAgIHJldHVybiB0cnVlOyAvLyBXZSBjYW4gYWRkIG1vcmUgYnVmZmVycyBpbnRlcm5hbGx5LgotICAgIH0KLSAgICBmb3IgKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyIDogbUludGVybmFsLT5tQnVmZmVycykgewotICAgICAgICBpZiAoYnVmZmVyLT5yZWZjb3VudCgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdHVzX3QgTWVkaWFCdWZmZXJHcm91cDo6YWNxdWlyZV9idWZmZXIoCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKm91dCwgYm9vbCBub25CbG9ja2luZywgc2l6ZV90IHJlcXVlc3RlZFNpemUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUludGVybmFsLT5tTG9jayk7Ci0gICAgZm9yICg7OykgewotICAgICAgICBzaXplX3Qgc21hbGxlc3QgPSByZXF1ZXN0ZWRTaXplOwotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA9IG51bGxwdHI7Ci0gICAgICAgIGF1dG8gZnJlZSA9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCk7Ci0gICAgICAgIGZvciAoYXV0byBpdCA9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKTsgKytpdCkgewotICAgICAgICAgICAgaWYgKCgqaXQpLT5yZWZjb3VudCgpID09IDApIHsKLSAgICAgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9ICgqaXQpLT5zaXplKCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNpemUgPj0gcmVxdWVzdGVkU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICBidWZmZXIgPSAqaXQ7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc2l6ZSA8IHNtYWxsZXN0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHNtYWxsZXN0ID0gc2l6ZTsgLy8gYWx3YXlzIGZyZWUgdGhlIHNtYWxsZXN0IGJ1ZgotICAgICAgICAgICAgICAgICAgICBmcmVlID0gaXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cgotICAgICAgICAgICAgICAgICYmIChmcmVlICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCkKLSAgICAgICAgICAgICAgICAgICAgfHwgbUludGVybmFsLT5tQnVmZmVycy5zaXplKCkgPCBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCkpIHsKLSAgICAgICAgICAgIC8vIFdlIGFsbG9jIGJlZm9yZSB3ZSBmcmVlIHNvIGZhaWx1cmUgbGVhdmVzIGdyb3VwIHVuY2hhbmdlZC4KLSAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhbGxvY2F0ZVNpemUgPSByZXF1ZXN0ZWRTaXplIDwgU0laRV9NQVggLyAzICogMiAvKiBOQjogb3JkZXJpbmcgKi8gPwotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRTaXplICogMyAvIDIgOiByZXF1ZXN0ZWRTaXplOwotICAgICAgICAgICAgYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGFsbG9jYXRlU2l6ZSk7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyLT5kYXRhKCkgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgZm9yIHNpemUgJXp1IiwgYWxsb2NhdGVTaXplKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgYnVmZmVyOyAvLyBJbnZhbGlkIGFsbG9jLCBwcmVmZXIgbm90IHRvIGNhbGwgcmVsZWFzZS4KLSAgICAgICAgICAgICAgICBidWZmZXIgPSBudWxscHRyOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWZmZXItPnNldE9ic2VydmVyKHRoaXMpOwotICAgICAgICAgICAgICAgIGlmIChmcmVlICE9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJlYWxsb2NhdGUgYnVmZmVyLCByZXF1ZXN0ZWQgc2l6ZSAlenUgdnMgYXZhaWxhYmxlICV6dSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkU2l6ZSwgKCpmcmVlKS0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgKCpmcmVlKS0+c2V0T2JzZXJ2ZXIobnVsbHB0cik7Ci0gICAgICAgICAgICAgICAgICAgICgqZnJlZSktPnJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgKmZyZWUgPSBidWZmZXI7IC8vIGluLXBsYWNlIHJlcGxhY2UKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiYWxsb2NhdGUgYnVmZmVyLCByZXF1ZXN0ZWQgc2l6ZSAlenUiLCByZXF1ZXN0ZWRTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgbUludGVybmFsLT5tQnVmZmVycy5lbXBsYWNlX2JhY2soYnVmZmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJ1ZmZlciAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBidWZmZXItPmFkZF9yZWYoKTsKLSAgICAgICAgICAgIGJ1ZmZlci0+cmVzZXQoKTsKLSAgICAgICAgICAgICpvdXQgPSBidWZmZXI7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG5vbkJsb2NraW5nKSB7Ci0gICAgICAgICAgICAqb3V0ID0gbnVsbHB0cjsKLSAgICAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKLSAgICAgICAgfQotICAgICAgICAvLyBBbGwgYnVmZmVycyBhcmUgaW4gdXNlLCBibG9jayB1bnRpbCBvbmUgb2YgdGhlbSBpcyByZXR1cm5lZC4KLSAgICAgICAgbUludGVybmFsLT5tQ29uZGl0aW9uLndhaXQobUludGVybmFsLT5tTG9jayk7Ci0gICAgfQotICAgIC8vIE5ldmVyIGdldHMgaGVyZS4KLX0KLQotc2l6ZV90IE1lZGlhQnVmZmVyR3JvdXA6OmJ1ZmZlcnMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1JbnRlcm5hbC0+bUJ1ZmZlcnMuc2l6ZSgpOwotfQotCi12b2lkIE1lZGlhQnVmZmVyR3JvdXA6OnNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1JbnRlcm5hbC0+bUxvY2spOwotICAgIG1JbnRlcm5hbC0+bUNvbmRpdGlvbi5zaWduYWwoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiM2RjOS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3Rvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJNZWRpYUV4dHJhY3RvciIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxwd2QuaD4KLQotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLU1lZGlhRXh0cmFjdG9yOjpNZWRpYUV4dHJhY3RvcigpIHsKLSAgICBpZiAoIUxPR19OREVCVUcpIHsKLSAgICAgICAgdWlkX3QgdWlkID0gZ2V0dWlkKCk7Ci0gICAgICAgIHN0cnVjdCBwYXNzd2QgKnB3ID0gZ2V0cHd1aWQodWlkKTsKLSAgICAgICAgQUxPR1YoImV4dHJhY3RvciBjcmVhdGVkIGluIHVpZDogJWQgKCVzKSIsIGdldHVpZCgpLCBwdy0+cHdfbmFtZSk7Ci0gICAgfQotfQotCi1NZWRpYUV4dHJhY3Rvcjo6fk1lZGlhRXh0cmFjdG9yKCkge30KLQotdWludDMyX3QgTWVkaWFFeHRyYWN0b3I6OmZsYWdzKCkgY29uc3QgewotICAgIHJldHVybiBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fUEFVU0UgfCBDQU5fU0VFSzsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhVHJhY2suY3BwIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFUcmFjay5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5NjNmNTguLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFUcmFjay5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG1lZGlhL01lZGlhVHJhY2suaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1NZWRpYVRyYWNrOjpNZWRpYVRyYWNrKCkge30KLQotTWVkaWFUcmFjazo6fk1lZGlhVHJhY2soKSB7fQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1NZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6UmVhZE9wdGlvbnMoKSB7Ci0gICAgcmVzZXQoKTsKLX0KLQotdm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6cmVzZXQoKSB7Ci0gICAgbU9wdGlvbnMgPSAwOwotICAgIG1TZWVrVGltZVVzID0gMDsKLSAgICBtTm9uQmxvY2tpbmcgPSBmYWxzZTsKLX0KLQotdm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6c2V0Tm9uQmxvY2tpbmcoKSB7Ci0gICAgbU5vbkJsb2NraW5nID0gdHJ1ZTsKLX0KLQotdm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Y2xlYXJOb25CbG9ja2luZygpIHsKLSAgICBtTm9uQmxvY2tpbmcgPSBmYWxzZTsKLX0KLQotYm9vbCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Z2V0Tm9uQmxvY2tpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Ob25CbG9ja2luZzsKLX0KLQotdm9pZCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6c2V0U2Vla1RvKGludDY0X3QgdGltZV91cywgU2Vla01vZGUgbW9kZSkgewotICAgIG1PcHRpb25zIHw9IGtTZWVrVG9fT3B0aW9uOwotICAgIG1TZWVrVGltZVVzID0gdGltZV91czsKLSAgICBtU2Vla01vZGUgPSBtb2RlOwotfQotCi12b2lkIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpjbGVhclNlZWtUbygpIHsKLSAgICBtT3B0aW9ucyAmPSB+a1NlZWtUb19PcHRpb247Ci0gICAgbVNlZWtUaW1lVXMgPSAwOwotICAgIG1TZWVrTW9kZSA9IFNFRUtfQ0xPU0VTVF9TWU5DOwotfQotCi1ib29sIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpnZXRTZWVrVG8oCi0gICAgICAgIGludDY0X3QgKnRpbWVfdXMsIFNlZWtNb2RlICptb2RlKSBjb25zdCB7Ci0gICAgKnRpbWVfdXMgPSBtU2Vla1RpbWVVczsKLSAgICAqbW9kZSA9IG1TZWVrTW9kZTsKLSAgICByZXR1cm4gKG1PcHRpb25zICYga1NlZWtUb19PcHRpb24pICE9IDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9Wb3JiaXNDb21tZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL1ZvcmJpc0NvbW1lbnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYWJhZjUxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL1ZvcmJpc0NvbW1lbnQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIlZvcmJpc0NvbW1lbnQiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJtZWRpYS9Wb3JiaXNDb21tZW50LmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIHZvaWQgZXh0cmFjdEFsYnVtQXJ0KAotICAgICAgICBNZXRhRGF0YUJhc2UgKmZpbGVNZXRhLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIEFMT0dWKCJleHRyYWN0QWxidW1BcnQgZnJvbSAnJXMnIiwgKGNvbnN0IGNoYXIgKilkYXRhKTsKLQotICAgIHNwPEFCdWZmZXI+IGZsYWNCdWZmZXIgPSBkZWNvZGVCYXNlNjQoQVN0cmluZygoY29uc3QgY2hhciAqKWRhdGEsIHNpemUpKTsKLSAgICBpZiAoZmxhY0J1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJtYWxmb3JtZWQgYmFzZTY0IGVuY29kZWQgZGF0YS4iKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNpemVfdCBmbGFjU2l6ZSA9IGZsYWNCdWZmZXItPnNpemUoKTsKLSAgICB1aW50OF90ICpmbGFjID0gZmxhY0J1ZmZlci0+ZGF0YSgpOwotICAgIEFMT0dWKCJnb3QgZmxhYyBvZiBzaXplICV6dSIsIGZsYWNTaXplKTsKLQotICAgIHVpbnQzMl90IHBpY1R5cGU7Ci0gICAgdWludDMyX3QgdHlwZUxlbjsKLSAgICB1aW50MzJfdCBkZXNjTGVuOwotICAgIHVpbnQzMl90IGRhdGFMZW47Ci0gICAgY2hhciB0eXBlWzEyOF07Ci0KLSAgICBpZiAoZmxhY1NpemUgPCA4KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBwaWNUeXBlID0gVTMyX0FUKGZsYWMpOwotCi0gICAgaWYgKHBpY1R5cGUgIT0gMykgewotICAgICAgICAvLyBUaGlzIGlzIG5vdCBhIGZyb250IGNvdmVyLgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgdHlwZUxlbiA9IFUzMl9BVCgmZmxhY1s0XSk7Ci0gICAgaWYgKHR5cGVMZW4gPiBzaXplb2YodHlwZSkgLSAxKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyB3ZSd2ZSBhbHJlYWR5IGNoZWNrZWQgYWJvdmUgdGhhdCBmbGFjU2l6ZSA+PSA4Ci0gICAgaWYgKGZsYWNTaXplIC0gOCA8IHR5cGVMZW4pIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIG1lbWNweSh0eXBlLCAmZmxhY1s4XSwgdHlwZUxlbik7Ci0gICAgdHlwZVt0eXBlTGVuXSA9ICdcMCc7Ci0KLSAgICBBTE9HVigicGljVHlwZSA9ICVkLCB0eXBlID0gJyVzJyIsIHBpY1R5cGUsIHR5cGUpOwotCi0gICAgaWYgKCFzdHJjbXAodHlwZSwgIi0tPiIpKSB7Ci0gICAgICAgIC8vIFRoaXMgaXMgbm90IGlubGluZSBjb3ZlciBhcnQsIGJ1dCBhbiBleHRlcm5hbCB1cmwgaW5zdGVhZC4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChmbGFjU2l6ZSA8IDMyIHx8IGZsYWNTaXplIC0gMzIgPCB0eXBlTGVuKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBkZXNjTGVuID0gVTMyX0FUKCZmbGFjWzggKyB0eXBlTGVuXSk7Ci0gICAgaWYgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIDwgZGVzY0xlbikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZGF0YUxlbiA9IFUzMl9BVCgmZmxhY1s4ICsgdHlwZUxlbiArIDQgKyBkZXNjTGVuICsgMTZdKTsKLQotICAgIC8vIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBhYm92ZSB0aGF0IChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4pID49IDAKLSAgICBpZiAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuIDwgZGF0YUxlbikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQUxPR1YoImdvdCBpbWFnZSBkYXRhLCAlenUgdHJhaWxpbmcgYnl0ZXMiLAotICAgICAgICAgZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gLSBkZXNjTGVuIC0gZGF0YUxlbik7Ci0KLSAgICBmaWxlTWV0YS0+c2V0RGF0YSgKLSAgICAgICAgICAgIGtLZXlBbGJ1bUFydCwgMCwgJmZsYWNbOCArIHR5cGVMZW4gKyA0ICsgZGVzY0xlbiArIDIwXSwgZGF0YUxlbik7Ci0KLSAgICBmaWxlTWV0YS0+c2V0Q1N0cmluZyhrS2V5QWxidW1BcnRNSU1FLCB0eXBlKTsKLX0KLQotdm9pZCBwYXJzZVZvcmJpc0NvbW1lbnQoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGEsIGNvbnN0IGNoYXIgKmNvbW1lbnQsIHNpemVfdCBjb21tZW50TGVuZ3RoKQotewotICAgIHN0cnVjdCB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0IG1UYWc7Ci0gICAgICAgIHVpbnQzMl90IG1LZXk7Ci0gICAgfSBrTWFwW10gPSB7Ci0gICAgICAgIHsgIlRJVExFIiwga0tleVRpdGxlIH0sCi0gICAgICAgIHsgIkFSVElTVCIsIGtLZXlBcnRpc3QgfSwKLSAgICAgICAgeyAiQUxCVU1BUlRJU1QiLCBrS2V5QWxidW1BcnRpc3QgfSwKLSAgICAgICAgeyAiQUxCVU0gQVJUSVNUIiwga0tleUFsYnVtQXJ0aXN0IH0sCi0gICAgICAgIHsgIkNPTVBJTEFUSU9OIiwga0tleUNvbXBpbGF0aW9uIH0sCi0gICAgICAgIHsgIkFMQlVNIiwga0tleUFsYnVtIH0sCi0gICAgICAgIHsgIkNPTVBPU0VSIiwga0tleUNvbXBvc2VyIH0sCi0gICAgICAgIHsgIkdFTlJFIiwga0tleUdlbnJlIH0sCi0gICAgICAgIHsgIkFVVEhPUiIsIGtLZXlBdXRob3IgfSwKLSAgICAgICAgeyAiVFJBQ0tOVU1CRVIiLCBrS2V5Q0RUcmFja051bWJlciB9LAotICAgICAgICB7ICJESVNDTlVNQkVSIiwga0tleURpc2NOdW1iZXIgfSwKLSAgICAgICAgeyAiREFURSIsIGtLZXlEYXRlIH0sCi0gICAgICAgIHsgIllFQVIiLCBrS2V5WWVhciB9LAotICAgICAgICB7ICJMWVJJQ0lTVCIsIGtLZXlXcml0ZXIgfSwKLSAgICAgICAgeyAiTUVUQURBVEFfQkxPQ0tfUElDVFVSRSIsIGtLZXlBbGJ1bUFydCB9LAotICAgICAgICB7ICJBTkRST0lEX0xPT1AiLCBrS2V5QXV0b0xvb3AgfSwKLSAgICB9OwotCi0gICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOyArK2opIHsKLSAgICAgICAgICAgIHNpemVfdCB0YWdMZW4gPSBzdHJsZW4oa01hcFtqXS5tVGFnKTsKLSAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoa01hcFtqXS5tVGFnLCBjb21tZW50LCB0YWdMZW4pCi0gICAgICAgICAgICAgICAgICAgICYmIGNvbW1lbnRbdGFnTGVuXSA9PSAnPScpIHsKLSAgICAgICAgICAgICAgICBpZiAoa01hcFtqXS5tS2V5ID09IGtLZXlBbGJ1bUFydCkgewotICAgICAgICAgICAgICAgICAgICBleHRyYWN0QWxidW1BcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZU1ldGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1lbnRbdGFnTGVuICsgMV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29tbWVudExlbmd0aCAtIHRhZ0xlbiAtIDEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoa01hcFtqXS5tS2V5ID09IGtLZXlBdXRvTG9vcCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoIXN0cmNhc2VjbXAoJmNvbW1lbnRbdGFnTGVuICsgMV0sICJ0cnVlIikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVNZXRhLT5zZXRJbnQzMihrS2V5QXV0b0xvb3AsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsZU1ldGEtPnNldENTdHJpbmcoa01hcFtqXS5tS2V5LCAmY29tbWVudFt0YWdMZW4gKyAxXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlNTlmMzkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBEQVRBX1NPVVJDRV9IXwotCi0jZGVmaW5lIERBVEFfU09VUkNFX0hfCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSURhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+Ci0KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdHJpbmc4OwotCi1jbGFzcyBEYXRhU291cmNlIDogcHVibGljIERhdGFTb3VyY2VCYXNlLCBwdWJsaWMgdmlydHVhbCBSZWZCYXNlIHsKLXB1YmxpYzoKLSAgICBEYXRhU291cmNlKCkge30KLQotICAgIC8vIHJldHVybnMgYSBwb2ludGVyIHRvIElEYXRhU291cmNlIGlmIGl0IGlzIHdyYXBwZWQuCi0gICAgdmlydHVhbCBzcDxJRGF0YVNvdXJjZT4gZ2V0SURhdGFTb3VyY2UoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLQotICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoIjx1bnNwZWNpZmllZD4iKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3QgLypvZmZzZXQqLykgewotICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgLy8gZm9yIERSTQotICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqIC8qbWltZSovID0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCkgewotICAgICAgICByZXR1cm4gU3RyaW5nOCgpOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBnZXRVcmkoY2hhciAqdXJpU3RyaW5nLCBzaXplX3QgYnVmZmVyU2l6ZSkgZmluYWwgewotICAgICAgICBpbnQgcmV0ID0gc25wcmludGYodXJpU3RyaW5nLCBidWZmZXJTaXplLCAiJXMiLCBnZXRVcmkoKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIHJldCA+PSAwICYmIHN0YXRpY19jYXN0PHNpemVfdD4ocmV0KSA8IGJ1ZmZlclNpemU7Ci0gICAgfQotCi0gICAgdmlydHVhbCBTdHJpbmc4IGdldE1JTUVUeXBlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gU3RyaW5nOCgiYXBwbGljYXRpb24vb2N0ZXQtc3RyZWFtIik7Ci0gICAgfQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+RGF0YVNvdXJjZSgpIHt9Ci0KLXByaXZhdGU6Ci0gICAgRGF0YVNvdXJjZShjb25zdCBEYXRhU291cmNlICYpOwotICAgIERhdGFTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlICYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBEQVRBX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9EYXRhU291cmNlQmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTk5M2RhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvRGF0YVNvdXJjZUJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIERBVEFfU09VUkNFX0JBU0VfSF8KLQotI2RlZmluZSBEQVRBX1NPVVJDRV9CQVNFX0hfCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdHJpbmc4OwotCi1jbGFzcyBEYXRhU291cmNlQmFzZSB7Ci1wdWJsaWM6Ci0gICAgZW51bSBGbGFncyB7Ci0gICAgICAgIGtXYW50c1ByZWZldGNoaW5nICAgICAgPSAxLAotICAgICAgICBrU3RyZWFtZWRGcm9tTG9jYWxIb3N0ID0gMiwKLSAgICAgICAga0lzQ2FjaGluZ0RhdGFTb3VyY2UgICA9IDQsCi0gICAgICAgIGtJc0hUVFBCYXNlZFNvdXJjZSAgICAgPSA4LAotICAgICAgICBrSXNMb2NhbEZpbGVTb3VyY2UgICAgID0gMTYsCi0gICAgfTsKLQotICAgIERhdGFTb3VyY2VCYXNlKCkge30KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgPSAwOwotCi0gICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQsIG9yIC0xIG9uIGZhaWx1cmUuIEl0J3Mgbm90IGFuIGVycm9yIGlmCi0gICAgLy8gdGhpcyByZXR1cm5zIHplcm87IGl0IGp1c3QgbWVhbnMgdGhlIGdpdmVuIG9mZnNldCBpcyBlcXVhbCB0bywgb3IKLSAgICAvLyBiZXlvbmQsIHRoZSBlbmQgb2YgdGhlIHNvdXJjZS4KLSAgICB2aXJ0dWFsIHNzaXplX3QgcmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgPSAwOwotCi0gICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kczoKLSAgICBib29sIGdldFVJbnQxNihvZmY2NF90IG9mZnNldCwgdWludDE2X3QgKngpOwotICAgIGJvb2wgZ2V0VUludDI0KG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCk7IC8vIDMgYnl0ZSBpbnQsIHJldHVybmVkIGFzIGEgMzItYml0IGludAotICAgIGJvb2wgZ2V0VUludDMyKG9mZjY0X3Qgb2Zmc2V0LCB1aW50MzJfdCAqeCk7Ci0gICAgYm9vbCBnZXRVSW50NjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQ2NF90ICp4KTsKLQotICAgIC8vIHJlYWQgZWl0aGVyIGludDxOPiBvciBpbnQ8Mk4+IGludG8gYSB1aW50PDJOPl90LCBzaXplIGlzIHRoZSBpbnQgc2l6ZSBpbiBieXRlcy4KLSAgICBib29sIGdldFVJbnQxNlZhcihvZmY2NF90IG9mZnNldCwgdWludDE2X3QgKngsIHNpemVfdCBzaXplKTsKLSAgICBib29sIGdldFVJbnQzMlZhcihvZmY2NF90IG9mZnNldCwgdWludDMyX3QgKngsIHNpemVfdCBzaXplKTsKLSAgICBib29sIGdldFVJbnQ2NFZhcihvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngsIHNpemVfdCBzaXplKTsKLQotICAgIC8vIE1heSByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQuCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwotCi0gICAgdmlydHVhbCBib29sIGdldFVyaShjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKTsKLQotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIHt9OwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+RGF0YVNvdXJjZUJhc2UoKSB7fQotCi1wcml2YXRlOgotICAgIERhdGFTb3VyY2VCYXNlKGNvbnN0IERhdGFTb3VyY2VCYXNlICYpOwotICAgIERhdGFTb3VyY2VCYXNlICZvcGVyYXRvcj0oY29uc3QgRGF0YVNvdXJjZUJhc2UgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIERBVEFfU09VUkNFX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFFeHRyYWN0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJhOThkYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL01lZGlhRXh0cmFjdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfRVhUUkFDVE9SX0hfCi0KLSNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX0hfCi0KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBEYXRhU291cmNlQmFzZTsKLWNsYXNzIE1ldGFEYXRhQmFzZTsKLXN0cnVjdCBNZWRpYVRyYWNrOwotCi0KLWNsYXNzIEV4dHJhY3RvckFsbG9jVHJhY2tlciB7Ci1wdWJsaWM6Ci0gICAgRXh0cmFjdG9yQWxsb2NUcmFja2VyKCkgewotICAgICAgICBBTE9HRCgiZXh0cmFjdG9yIGFsbG9jYXRlZDogJXAiLCB0aGlzKTsKLSAgICB9Ci0gICAgdmlydHVhbCB+RXh0cmFjdG9yQWxsb2NUcmFja2VyKCkgewotICAgICAgICBBTE9HRCgiZXh0cmFjdG9yIGZyZWVkOiAlcCIsIHRoaXMpOwotICAgIH0KLX07Ci0KLQotY2xhc3MgTWVkaWFFeHRyYWN0b3IKLS8vIDogcHVibGljIEV4dHJhY3RvckFsbG9jVHJhY2tlcgotewotcHVibGljOgotICAgIHZpcnR1YWwgfk1lZGlhRXh0cmFjdG9yKCk7Ci0gICAgdmlydHVhbCBzaXplX3QgY291bnRUcmFja3MoKSA9IDA7Ci0gICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpID0gMDsKLQotICAgIGVudW0gR2V0VHJhY2tNZXRhRGF0YUZsYWdzIHsKLSAgICAgICAga0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSA9IDEKLSAgICB9OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgICAgIE1ldGFEYXRhQmFzZSYgbWV0YSwKLSAgICAgICAgICAgIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKSA9IDA7Ci0KLSAgICAvLyBSZXR1cm4gY29udGFpbmVyIHNwZWNpZmljIG1ldGEtZGF0YS4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLSAgICAvLyByZXR1cm5zIGFuIGVtcHR5IG1ldGFkYXRhIG9iamVjdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSkgPSAwOwotCi0gICAgZW51bSBGbGFncyB7Ci0gICAgICAgIENBTl9TRUVLX0JBQ0tXQVJEICA9IDEsICAvLyB0aGUgInNlZWsgMTBzZWNzIGJhY2sgYnV0dG9uIgotICAgICAgICBDQU5fU0VFS19GT1JXQVJEICAgPSAyLCAgLy8gdGhlICJzZWVrIDEwc2VjcyBmb3J3YXJkIGJ1dHRvbiIKLSAgICAgICAgQ0FOX1BBVVNFICAgICAgICAgID0gNCwKLSAgICAgICAgQ0FOX1NFRUsgICAgICAgICAgID0gOCwgIC8vIHRoZSAic2VlayBiYXIiCi0gICAgfTsKLQotICAgIC8vIElmIHN1YmNsYXNzZXMgZG8gX25vdF8gb3ZlcnJpZGUgdGhpcywgdGhlIGRlZmF1bHQgaXMKLSAgICAvLyBDQU5fU0VFS19CQUNLV0FSRCB8IENBTl9TRUVLX0ZPUldBUkQgfCBDQU5fU0VFSyB8IENBTl9QQVVTRQotICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogLypjYXNUb2tlbiovLCBzaXplX3QgLypzaXplKi8pIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqIG5hbWUoKSB7IHJldHVybiAiPHVuc3BlY2lmaWVkPiI7IH0KLQotICAgIHR5cGVkZWYgTWVkaWFFeHRyYWN0b3IqICgqQ3JlYXRvckZ1bmMpKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgdm9pZCAqbWV0YSk7Ci0gICAgdHlwZWRlZiB2b2lkICgqRnJlZU1ldGFGdW5jKSh2b2lkICptZXRhKTsKLQotICAgIC8vIFRoZSBzbmlmZmVyIGNhbiBvcHRpb25hbGx5IGZpbGwgaW4gYW4gb3BhcXVlIG9iamVjdCwgIm1ldGEiLCB0aGF0IGhlbHBzCi0gICAgLy8gdGhlIGNvcnJlc3BvbmRpbmcgZXh0cmFjdG9yIGluaXRpYWxpemUgaXRzIHN0YXRlIHdpdGhvdXQgZHVwbGljYXRpbmcKLSAgICAvLyBlZmZvcnQgYWxyZWFkeSBleGVydGVkIGJ5IHRoZSBzbmlmZmVyLiBJZiAiZnJlZU1ldGEiIGlzIGdpdmVuLCBpdCB3aWxsIGJlCi0gICAgLy8gY2FsbGVkIGFnYWluc3QgdGhlIG9wYXF1ZSBvYmplY3Qgd2hlbiBpdCBpcyBubyBsb25nZXIgdXNlZC4KLSAgICB0eXBlZGVmIENyZWF0b3JGdW5jICgqU25pZmZlckZ1bmMpKAotICAgICAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsCi0gICAgICAgICAgICB2b2lkICoqbWV0YSwgRnJlZU1ldGFGdW5jICpmcmVlTWV0YSk7Ci0KLSAgICB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgYlsxNl07Ci0gICAgfSB1dWlkX3Q7Ci0KLSAgICB0eXBlZGVmIHN0cnVjdCB7Ci0gICAgICAgIC8vIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgc3RydWN0dXJlCi0gICAgICAgIGNvbnN0IHVpbnQzMl90IGRlZl92ZXJzaW9uOwotCi0gICAgICAgIC8vIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgZXh0cmFjdG9yLgotICAgICAgICAvLyBTZWUgYmVsb3cgZm9yIGEgY29udmVuaWVuY2UgbWFjcm8gdG8gY3JlYXRlIHRoaXMgZnJvbSBhIHN0cmluZy4KLSAgICAgICAgdXVpZF90IGV4dHJhY3Rvcl91dWlkOwotCi0gICAgICAgIC8vIFZlcnNpb24gbnVtYmVyIG9mIHRoaXMgZXh0cmFjdG9yLiBXaGVuIHR3byBleHRyYWN0b3JzIHdpdGggdGhlIHNhbWUKLSAgICAgICAgLy8gdXVpZCBhcmUgZW5jb3VudGVyZWQsIHRoZSBvbmUgd2l0aCB0aGUgbGFyZ2VzdCB2ZXJzaW9uIG51bWJlciB3aWxsCi0gICAgICAgIC8vIGJlIHVzZWQuCi0gICAgICAgIGNvbnN0IHVpbnQzMl90IGV4dHJhY3Rvcl92ZXJzaW9uOwotCi0gICAgICAgIC8vIGEgaHVtYW4gcmVhZGFibGUgbmFtZQotICAgICAgICBjb25zdCBjaGFyICpleHRyYWN0b3JfbmFtZTsKLQotICAgICAgICAvLyB0aGUgc25pZmZlciBmdW5jdGlvbgotICAgICAgICBjb25zdCBTbmlmZmVyRnVuYyBzbmlmZjsKLSAgICB9IEV4dHJhY3RvckRlZjsKLQotICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBFWFRSQUNUT1JERUZfVkVSU0lPTiA9IDE7Ci0KLSAgICB0eXBlZGVmIEV4dHJhY3RvckRlZiAoKkdldEV4dHJhY3RvckRlZikoKTsKLQotcHJvdGVjdGVkOgotICAgIE1lZGlhRXh0cmFjdG9yKCk7Ci0KLXByaXZhdGU6Ci0gICAgTWVkaWFFeHRyYWN0b3IoY29uc3QgTWVkaWFFeHRyYWN0b3IgJik7Ci0gICAgTWVkaWFFeHRyYWN0b3IgJm9wZXJhdG9yPShjb25zdCBNZWRpYUV4dHJhY3RvciAmKTsKLX07Ci0KLS8vIHB1cnBvc2VseSBub3QgZGVmaW5lZCBhbnl3aGVyZSBzbyB0aGF0IHRoaXMgd2lsbCBmYWlsIHRvIGxpbmsgaWYKLS8vIGV4cHJlc3Npb25zIGJlbG93IGFyZSBub3QgZXZhbHVhdGVkIGF0IGNvbXBpbGUgdGltZQotaW50IGludmFsaWRfdXVpZF9zdHJpbmcoY29uc3QgY2hhciAqKTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgotY29uc3RleHByIHVpbnQ4X3QgX2RpZ2l0QXRfKGNvbnN0IFQgKCZzKVtOXSwgY29uc3Qgc2l6ZV90IG4pIHsKLSAgICByZXR1cm4gc1tuXSA+PSAnMCcgJiYgc1tuXSA8PSAnOScgPyBzW25dIC0gJzAnCi0gICAgICAgICAgICA6IHNbbl0gPj0gJ2EnICYmIHNbbl0gPD0gJ2YnID8gc1tuXSAtICdhJyArIDEwCi0gICAgICAgICAgICAgICAgICAgIDogc1tuXSA+PSAnQScgJiYgc1tuXSA8PSAnRicgPyBzW25dIC0gJ0EnICsgMTAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGludmFsaWRfdXVpZF9zdHJpbmcoInV1aWQ6IGJhZCBkaWdpdHMiKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPgotY29uc3RleHByIHVpbnQ4X3QgX2hleEJ5dGVBdF8oY29uc3QgVCAoJnMpW05dLCBzaXplX3QgbikgewotICAgIHJldHVybiAoX2RpZ2l0QXRfKHMsIG4pIDw8IDQpICsgX2RpZ2l0QXRfKHMsIG4gKyAxKTsKLX0KLQotY29uc3RleHByIGJvb2wgX2Fzc2VydElzRGFzaF8oY2hhciBjKSB7Ci0gICAgcmV0dXJuIGMgPT0gJy0nID8gdHJ1ZSA6IGludmFsaWRfdXVpZF9zdHJpbmcoIldyb25nIGZvcm1hdCIpOwotfQotCi10ZW1wbGF0ZSA8c2l6ZV90IE4+Ci1jb25zdGV4cHIgTWVkaWFFeHRyYWN0b3I6OnV1aWRfdCBjb25zdFVVSUQoY29uc3QgY2hhciAoJnMpIFtOXSkgewotICAgIHN0YXRpY19hc3NlcnQoTiA9PSAzNywgInV1aWQ6IHdyb25nIGxlbmd0aCIpOwotICAgIHJldHVybgotICAgICAgICAgICAgX2Fzc2VydElzRGFzaF8oc1s4XSksCi0gICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzEzXSksCi0gICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzE4XSksCi0gICAgICAgICAgICBfYXNzZXJ0SXNEYXNoXyhzWzIzXSksCi0gICAgICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6dXVpZF90IHt7Ci0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMiksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgNCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgNiksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgOSksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTEpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDE0KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAxNiksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMTkpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDIxKSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAyNCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMjYpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDI4KSwKLSAgICAgICAgICAgICAgICBfaGV4Qnl0ZUF0XyhzLCAzMCksCi0gICAgICAgICAgICAgICAgX2hleEJ5dGVBdF8ocywgMzIpLAotICAgICAgICAgICAgICAgIF9oZXhCeXRlQXRfKHMsIDM0KSwKLSAgICAgICAgICAgIH19OwotfQotLy8gQ29udmVuaWVuY2UgbWFjcm8gdG8gY3JlYXRlIGEgdXVpZF90IGZyb20gYSBzdHJpbmcgbGl0ZXJhbCwgd2hpY2ggc2hvdWxkCi0vLyBiZSBmb3JtYXR0ZWQgYXMgIjEyMzQ1Njc4LTEyMzQtMTIzNC0xMjM0LTEyMzQ1Njc4OWFiYyIsIGFzIGdlbmVyYXRlZCBieQotLy8gZS5nLiBodHRwczovL3d3dy51dWlkZ2VuZXJhdG9yLm5ldC8gb3IgdGhlICd1dWlkZ2VuJyBsaW51eCBjb21tYW5kLgotLy8gSGV4IGRpZ2l0cyBtYXkgYmUgdXBwZXIgb3IgbG93ZXIgY2FzZS4KLS8vCi0vLyBUaGUgbWFjcm8gY2FsbCBpcyBvdGhlcndpc2UgZXF1aXZhbGVudCB0byBzcGVjaWZ5aW5nIHRoZSBzdHJ1Y3R1cmUgZGlyZWN0bHkKLS8vIChlLmcuIFVVSUQoIjdkNjEzODU4LTU4MzctNGEzOC04NGM1LTMzMmQxY2RkZWUyNyIpIGlzIHRoZSBzYW1lIGFzCi0vLyAgICAgICB7ezB4N2QsIDB4NjEsIDB4MzgsIDB4NTgsIDB4NTgsIDB4MzcsIDB4NGEsIDB4MzgsCi0vLyAgICAgICAgIDB4ODQsIDB4YzUsIDB4MzMsIDB4MmQsIDB4MWMsIDB4ZGQsIDB4ZWUsIDB4Mjd9fSkKLQotI2RlZmluZSBVVUlEKHN0cikgW117IGNvbnN0ZXhwciBNZWRpYUV4dHJhY3Rvcjo6dXVpZF90IHV1aWQgPSBjb25zdFVVSUQoc3RyKTsgcmV0dXJuIHV1aWQ7IH0oKQotCi0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRURJQV9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFUcmFjay5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFkZWE2MWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVRyYWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfU09VUkNFX0JBU0VfSF8KLQotI2RlZmluZSBNRURJQV9TT1VSQ0VfQkFTRV9IXwotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgotI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1lZGlhQnVmZmVyQmFzZTsKLQotY2xhc3MgU291cmNlQmFzZUFsbG9jVHJhY2tlciB7Ci1wdWJsaWM6Ci0gICAgU291cmNlQmFzZUFsbG9jVHJhY2tlcigpIHsKLSAgICAgICAgQUxPR0QoInNvdXJjZWJhc2UgYWxsb2NhdGVkOiAlcCIsIHRoaXMpOwotICAgIH0KLSAgICB2aXJ0dWFsIH5Tb3VyY2VCYXNlQWxsb2NUcmFja2VyKCkgewotICAgICAgICBBTE9HRCgic291cmNlYmFzZSBmcmVlZDogJXAiLCB0aGlzKTsKLSAgICB9Ci19OwotCi1zdHJ1Y3QgTWVkaWFUcmFjawotLy8gICAgOiBwdWJsaWMgU291cmNlQmFzZUFsbG9jVHJhY2tlcgotewotICAgIE1lZGlhVHJhY2soKTsKLQotICAgIC8vIFRvIGJlIGNhbGxlZCBiZWZvcmUgYW55IG90aGVyIG1ldGhvZHMgb24gdGhpcyBvYmplY3QsIGV4Y2VwdAotICAgIC8vIGdldEZvcm1hdCgpLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGFCYXNlICpwYXJhbXMgPSBOVUxMKSA9IDA7Ci0KLSAgICAvLyBBbnkgYmxvY2tpbmcgcmVhZCBjYWxsIHJldHVybnMgaW1tZWRpYXRlbHkgd2l0aCBhIHJlc3VsdCBvZiBOT19JTklULgotICAgIC8vIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgYW55IG1ldGhvZHMgb3RoZXIgdGhhbiBzdGFydCBhZnRlciB0aGlzIGNhbGwKLSAgICAvLyByZXR1cm5zLiBBbnkgYnVmZmVycyB0aGUgb2JqZWN0IG1heSBiZSBob2xkaW5nIG9udG8gYXQgdGhlIHRpbWUgb2YKLSAgICAvLyB0aGUgc3RvcCgpIGNhbGwgYXJlIHJlbGVhc2VkLgotICAgIC8vIEFsc28sIGl0IGlzIGltcGVyYXRpdmUgdGhhdCBhbnkgYnVmZmVycyBvdXRwdXQgYnkgdGhpcyBvYmplY3QgYW5kCi0gICAgLy8gaGVsZCBvbnRvIGJ5IGNhbGxlcnMgYmUgcmVsZWFzZWQgYmVmb3JlIGEgY2FsbCB0byBzdG9wKCkgISEhCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCkgPSAwOwotCi0gICAgLy8gUmV0dXJucyB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIG91dHB1dCBieSB0aGlzIG1lZGlhIHRyYWNrLgotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYgZm9ybWF0KSA9IDA7Ci0KLSAgICAvLyBPcHRpb25zIHRoYXQgbW9kaWZ5IHJlYWQoKSBiZWhhdmlvdXIuIFRoZSBkZWZhdWx0IGlzIHRvCi0gICAgLy8gYSkgbm90IHJlcXVlc3QgYSBzZWVrCi0gICAgLy8gYikgbm90IGJlIGxhdGUsIGkuZS4gbGF0ZW5lc3NfdXMgPSAwCi0gICAgc3RydWN0IFJlYWRPcHRpb25zIHsKLSAgICAgICAgZW51bSBTZWVrTW9kZSA6IGludDMyX3QgewotICAgICAgICAgICAgU0VFS19QUkVWSU9VU19TWU5DLAotICAgICAgICAgICAgU0VFS19ORVhUX1NZTkMsCi0gICAgICAgICAgICBTRUVLX0NMT1NFU1RfU1lOQywKLSAgICAgICAgICAgIFNFRUtfQ0xPU0VTVCwKLSAgICAgICAgICAgIFNFRUtfRlJBTUVfSU5ERVgsCi0gICAgICAgIH07Ci0KLSAgICAgICAgUmVhZE9wdGlvbnMoKTsKLQotICAgICAgICAvLyBSZXNldCBldmVyeXRoaW5nIGJhY2sgdG8gZGVmYXVsdHMuCi0gICAgICAgIHZvaWQgcmVzZXQoKTsKLQotICAgICAgICB2b2lkIHNldFNlZWtUbyhpbnQ2NF90IHRpbWVfdXMsIFNlZWtNb2RlIG1vZGUgPSBTRUVLX0NMT1NFU1RfU1lOQyk7Ci0gICAgICAgIHZvaWQgY2xlYXJTZWVrVG8oKTsKLSAgICAgICAgYm9vbCBnZXRTZWVrVG8oaW50NjRfdCAqdGltZV91cywgU2Vla01vZGUgKm1vZGUpIGNvbnN0OwotCi0gICAgICAgIHZvaWQgc2V0Tm9uQmxvY2tpbmcoKTsKLSAgICAgICAgdm9pZCBjbGVhck5vbkJsb2NraW5nKCk7Ci0gICAgICAgIGJvb2wgZ2V0Tm9uQmxvY2tpbmcoKSBjb25zdDsKLQotICAgICAgICAvLyBVc2VkIHRvIGNsZWFyIGFsbCBub24tcGVyc2lzdGVudCBvcHRpb25zIGZvciBtdWx0aXBsZSBidWZmZXIgcmVhZHMuCi0gICAgICAgIHZvaWQgY2xlYXJOb25QZXJzaXN0ZW50KCkgewotICAgICAgICAgICAgY2xlYXJTZWVrVG8oKTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgZW51bSBPcHRpb25zIHsKLSAgICAgICAgICAgIGtTZWVrVG9fT3B0aW9uICAgICAgPSAxLAotICAgICAgICB9OwotCi0gICAgICAgIHVpbnQzMl90IG1PcHRpb25zOwotICAgICAgICBpbnQ2NF90IG1TZWVrVGltZVVzOwotICAgICAgICBTZWVrTW9kZSBtU2Vla01vZGU7Ci0gICAgICAgIGJvb2wgbU5vbkJsb2NraW5nOwotICAgIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7IC8vIHNlbnQgdGhyb3VnaCBCaW5kZXIKLQotICAgIC8vIFJldHVybnMgYSBuZXcgYnVmZmVyIG9mIGRhdGEuIENhbGwgYmxvY2tzIHVudGlsIGEKLSAgICAvLyBidWZmZXIgaXMgYXZhaWxhYmxlLCBhbiBlcnJvciBpcyBlbmNvdW50ZXJlZCBvZiB0aGUgZW5kIG9mIHRoZSBzdHJlYW0KLSAgICAvLyBpcyByZWFjaGVkLgotICAgIC8vIEVuZCBvZiBzdHJlYW0gaXMgc2lnbmFsbGVkIGJ5IGEgcmVzdWx0IG9mIEVSUk9SX0VORF9PRl9TVFJFQU0uCi0gICAgLy8gQSByZXN1bHQgb2YgSU5GT19GT1JNQVRfQ0hBTkdFRCBpbmRpY2F0ZXMgdGhhdCB0aGUgZm9ybWF0IG9mIHRoaXMKLSAgICAvLyBNZWRpYVNvdXJjZSBoYXMgY2hhbmdlZCBtaWQtc3RyZWFtLCB0aGUgY2xpZW50IGNhbiBjb250aW51ZSByZWFkaW5nCi0gICAgLy8gYnV0IHNob3VsZCBiZSBwcmVwYXJlZCBmb3IgYnVmZmVycyBvZiB0aGUgbmV3IGNvbmZpZ3VyYXRpb24uCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKAotICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpID0gMDsKLQotICAgIHZpcnR1YWwgfk1lZGlhVHJhY2soKTsKLQotcHJpdmF0ZToKLSAgICBNZWRpYVRyYWNrKGNvbnN0IE1lZGlhVHJhY2sgJik7Ci0gICAgTWVkaWFUcmFjayAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhVHJhY2sgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FRElBX1NPVVJDRV9CQVNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL1ZvcmJpc0NvbW1lbnQuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YmEzMjk1Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvVm9yYmlzQ29tbWVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLQotI2lmbmRlZiBWT1JCSVNfQ09NTUVOVF9IXwotI2RlZmluZSBWT1JCSVNfQ09NTUVOVF9IXwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1ldGFEYXRhQmFzZTsKLQotdm9pZCBwYXJzZVZvcmJpc0NvbW1lbnQoCi0gICAgICAgIE1ldGFEYXRhQmFzZSAqZmlsZU1ldGEsIGNvbnN0IGNoYXIgKmNvbW1lbnQsIHNpemVfdCBjb21tZW50TGVuZ3RoKTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIFZPUkJJU19DT01NRU5UX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmggYi9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVhMjU5NjUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMjIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX0JVRkZFUl9IXwotCi0jZGVmaW5lIE1FRElBX0JVRkZFUl9IXwotCi0jaW5jbHVkZSA8YXRvbWljPgotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBQnVmZmVyOwotY2xhc3MgTWVkaWFCdWZmZXI7Ci1jbGFzcyBNZWRpYUJ1ZmZlck9ic2VydmVyOwotY2xhc3MgTWV0YURhdGFCYXNlOwotCi1jbGFzcyBNZWRpYUJ1ZmZlciA6IHB1YmxpYyBNZWRpYUJ1ZmZlckJhc2UgewotcHVibGljOgotICAgIC8vIGFsbG9jYXRpb25zIGxhcmdlciB0aGFuIG9yIGVxdWFsIHRvIHRoaXMgd2lsbCB1c2Ugc2hhcmVkIG1lbW9yeS4KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtTaGFyZWRNZW1UaHJlc2hvbGQgPSA2NCAqIDEwMjQ7Ci0KLSAgICAvLyBUaGUgdW5kZXJseWluZyBkYXRhIHJlbWFpbnMgdGhlIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIhCi0gICAgTWVkaWFCdWZmZXIodm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgZXhwbGljaXQgTWVkaWFCdWZmZXIoc2l6ZV90IHNpemUpOwotCi0gICAgZXhwbGljaXQgTWVkaWFCdWZmZXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7Ci0KLSAgICBNZWRpYUJ1ZmZlcihjb25zdCBzcDxJTWVtb3J5PiAmbWVtKSA6Ci0gICAgICAgIE1lZGlhQnVmZmVyKCh1aW50OF90ICopbWVtLT5wb2ludGVyKCkgKyBzaXplb2YoU2hhcmVkQ29udHJvbCksIG1lbS0+c2l6ZSgpKSB7Ci0gICAgICAgIC8vIGRlbGVnYXRlIGFuZCBvdmVycmlkZSBtTWVtb3J5Ci0gICAgICAgIG1NZW1vcnkgPSBtZW07Ci0gICAgfQotCi0gICAgLy8gSWYgTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIGRlY3JlbWVudCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50OwotICAgIC8vIGlmIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gMCwgcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlCi0gICAgLy8gYXNzb2NpYXRlZCBNZWRpYUJ1ZmZlckdyb3VwLgotICAgIC8vCi0gICAgLy8gSWYgbm8gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSB6ZXJvCi0gICAgLy8gd2hlbiBjYWxsZWQsIHdoZXJldXBvbiB0aGUgTWVkaWFCdWZmZXIgaXMgZGVsZXRlZC4KLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpOwotCi0gICAgLy8gSW5jcmVtZW50cyB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50LgotICAgIC8vIFVzZSBvbmx5IHdoZW4gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQuCi0gICAgdmlydHVhbCB2b2lkIGFkZF9yZWYoKTsKLQotICAgIHZpcnR1YWwgdm9pZCAqZGF0YSgpIGNvbnN0OwotICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX29mZnNldCgpIGNvbnN0OwotICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX2xlbmd0aCgpIGNvbnN0OwotCi0gICAgdmlydHVhbCB2b2lkIHNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKTsKLQotICAgIE1ldGFEYXRhQmFzZSYgbWV0YV9kYXRhKCk7Ci0KLSAgICAvLyBDbGVhcnMgbWV0YSBkYXRhIGFuZCByZXNldHMgdGhlIHJhbmdlIHRvIHRoZSBmdWxsIGV4dGVudC4KLSAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXRPYnNlcnZlcihNZWRpYUJ1ZmZlck9ic2VydmVyICpncm91cCk7Ci0KLSAgICAvLyBSZXR1cm5zIGEgY2xvbmUgb2YgdGhpcyBNZWRpYUJ1ZmZlciBpbmNyZWFzaW5nIGl0cyByZWZlcmVuY2UgY291bnQuCi0gICAgLy8gVGhlIGNsb25lIHJlZmVyZW5jZXMgdGhlIHNhbWUgZGF0YSBidXQgaGFzIGl0cyBvd24gcmFuZ2UgYW5kCi0gICAgLy8gTWV0YURhdGEuCi0gICAgdmlydHVhbCBNZWRpYUJ1ZmZlckJhc2UgKmNsb25lKCk7Ci0KLSAgICAvLyBzdW0gb2YgbG9jYWxSZWZjb3VudCgpIGFuZCByZW1vdGVSZWZjb3VudCgpCi0gICAgLy8gUmVzdWx0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGFwcHJveGltYXRlIHVubGVzcyB0aGUgcmVzdWx0IHByZWNsdWRlcyBjb25jdXJyZW50IGFjY2Vzc2VzLgotICAgIHZpcnR1YWwgaW50IHJlZmNvdW50KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbG9jYWxSZWZjb3VudCgpICsgcmVtb3RlUmVmY291bnQoKTsKLSAgICB9Ci0KLSAgICAvLyBSZXN1bHQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYXBwcm94aW1hdGUgdW5sZXNzIHRoZSByZXN1bHQgcHJlY2x1ZGVzIGNvbmN1cnJlbnQgYWNjZXNzZXMuCi0gICAgdmlydHVhbCBpbnQgbG9jYWxSZWZjb3VudCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1SZWZDb3VudC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOwotICAgIH0KLQotICAgIHZpcnR1YWwgaW50IHJlbW90ZVJlZmNvdW50KCkgY29uc3QgewotICAgICAgICBpZiAobU1lbW9yeS5nZXQoKSA9PSBudWxscHRyIHx8IG1NZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSByZXR1cm4gMDsKLSAgICAgICAgaW50MzJfdCByZW1vdGVSZWZjb3VudCA9Ci0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1NZW1vcnktPnBvaW50ZXIoKSktPmdldFJlbW90ZVJlZmNvdW50KCk7Ci0gICAgICAgIC8vIFNhbml0eSBjaGVjayBzbyB0aGF0IHJlbW90ZVJlZkNvdW50KCkgaXMgbm9uLW5lZ2F0aXZlLgotICAgICAgICByZXR1cm4gcmVtb3RlUmVmY291bnQgPj0gMCA/IHJlbW90ZVJlZmNvdW50IDogMDsgLy8gZG8gbm90IGFsbG93IGNvcnJ1cHRlZCBkYXRhLgotICAgIH0KLQotICAgIC8vIHJldHVybnMgb2xkIHZhbHVlCi0gICAgaW50IGFkZFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKG1NZW1vcnkuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtTWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgcmV0dXJuIDA7Ci0gICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obU1lbW9yeS0+cG9pbnRlcigpKS0+YWRkUmVtb3RlUmVmY291bnQodmFsdWUpOwotICAgIH0KLQotICAgIGJvb2wgaXNEZWFkT2JqZWN0KCkgY29uc3QgewotICAgICAgICByZXR1cm4gaXNEZWFkT2JqZWN0KG1NZW1vcnkpOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sIGlzRGVhZE9iamVjdChjb25zdCBzcDxJTWVtb3J5PiAmbWVtb3J5KSB7Ci0gICAgICAgIGlmIChtZW1vcnkuZ2V0KCkgPT0gbnVsbHB0ciB8fCBtZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obWVtb3J5LT5wb2ludGVyKCkpLT5pc0RlYWRPYmplY3QoKTsKLSAgICB9Ci0KLSAgICAvLyBTdGlja3kgb24gZW5hYmxpbmcgb2Ygc2hhcmVkIG1lbW9yeSBNZWRpYUJ1ZmZlcnMuIEJ5IGRlZmF1bHQgd2UgZG9uJ3QgdXNlCi0gICAgLy8gc2hhcmVkIG1lbW9yeSBmb3IgTWVkaWFCdWZmZXJzLCBidXQgd2UgZW5hYmxlIHRoaXMgZm9yIHRob3NlIHByb2Nlc3NlcwotICAgIC8vIHRoYXQgZXhwb3J0IE1lZGlhQnVmZmVycy4KLSAgICBzdGF0aWMgdm9pZCB1c2VTaGFyZWRNZW1vcnkoKSB7Ci0gICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAotICAgICAgICAgICAgICAgICZtVXNlU2hhcmVkTWVtb3J5LCAoaW50X2xlYXN0MzJfdCkxLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICAvLyB0cnVlIGlmIE1lZGlhQnVmZmVyIGlzIG9ic2VydmVkIChwYXJ0IG9mIGEgTWVkaWFCdWZmZXJHcm91cCkuCi0gICAgaW5saW5lIGJvb2wgaXNPYnNlcnZlZCgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1PYnNlcnZlciAhPSBudWxscHRyOwotICAgIH0KLQotICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyKCk7Ci0KLSAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBjbGFzcyBNZWRpYUJ1ZmZlckdyb3VwOwotICAgIGZyaWVuZCBjbGFzcyBPTVhEZWNvZGVyOwotICAgIGZyaWVuZCBjbGFzcyBCbk1lZGlhU291cmNlOwotICAgIGZyaWVuZCBjbGFzcyBCcE1lZGlhU291cmNlOwotCi0gICAgLy8gRm9yIHVzZSBieSBPTVhEZWNvZGVyLCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSAxLCBkcm9wIHJlZmVyZW5jZQotICAgIC8vIGNvdW50IHRvIDAgd2l0aG91dCBzaWduYWxsaW5nIHRoZSBvYnNlcnZlci4KLSAgICB2b2lkIGNsYWltKCk7Ci0KLSAgICBNZWRpYUJ1ZmZlck9ic2VydmVyICptT2JzZXJ2ZXI7Ci0gICAgc3RkOjphdG9taWM8aW50PiBtUmVmQ291bnQ7Ci0KLSAgICB2b2lkICptRGF0YTsKLSAgICBzaXplX3QgbVNpemUsIG1SYW5nZU9mZnNldCwgbVJhbmdlTGVuZ3RoOwotICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7Ci0KLSAgICBib29sIG1Pd25zRGF0YTsKLQotICAgIE1ldGFEYXRhQmFzZSogbU1ldGFEYXRhOwotCi0gICAgTWVkaWFCdWZmZXIgKm1PcmlnaW5hbDsKLQotICAgIHN0YXRpYyBzdGQ6OmF0b21pY19pbnRfbGVhc3QzMl90IG1Vc2VTaGFyZWRNZW1vcnk7Ci0KLSAgICBNZWRpYUJ1ZmZlcihjb25zdCBNZWRpYUJ1ZmZlciAmKTsKLSAgICBNZWRpYUJ1ZmZlciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhQnVmZmVyICYpOwotCi0gICAgLy8gU2hhcmVkQ29udHJvbCBibG9jayBhdCB0aGUgc3RhcnQgb2YgSU1lbW9yeS4KLSAgICBzdHJ1Y3QgU2hhcmVkQ29udHJvbCB7Ci0gICAgICAgIGVudW0gewotICAgICAgICAgICAgRkxBR19ERUFEX09CSkVDVCA9ICgxIDw8IDApLAotICAgICAgICB9OwotCi0gICAgICAgIC8vIHJldHVybnMgb2xkIHZhbHVlCi0gICAgICAgIGlubGluZSBpbnQzMl90IGFkZFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGQ6OmF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQoCi0gICAgICAgICAgICAgICAgICAgICZtUmVtb3RlUmVmY291bnQsIChpbnRfbGVhc3QzMl90KXZhbHVlLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlubGluZSBpbnQzMl90IGdldFJlbW90ZVJlZmNvdW50KCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoJm1SZW1vdGVSZWZjb3VudCwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgdm9pZCBzZXRSZW1vdGVSZWZjb3VudChpbnQzMl90IHZhbHVlKSB7Ci0gICAgICAgICAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCgKLSAgICAgICAgICAgICAgICAgICAgJm1SZW1vdGVSZWZjb3VudCwgKGludF9sZWFzdDMyX3QpdmFsdWUsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5saW5lIGJvb2wgaXNEZWFkT2JqZWN0KCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIChzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KAotICAgICAgICAgICAgICAgICAgICAmbUZsYWdzLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KSAmIEZMQUdfREVBRF9PQkpFQ1QpICE9IDA7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgdm9pZCBzZXREZWFkT2JqZWN0KCkgewotICAgICAgICAgICAgKHZvaWQpc3RkOjphdG9taWNfZmV0Y2hfb3JfZXhwbGljaXQoCi0gICAgICAgICAgICAgICAgICAgICZtRmxhZ3MsIChpbnRfbGVhc3QzMl90KUZMQUdfREVBRF9PQkpFQ1QsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW5saW5lIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCgKLSAgICAgICAgICAgICAgICAgICAgJm1GbGFncywgKGludF9sZWFzdDMyX3QpMCwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7Ci0gICAgICAgICAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCgKLSAgICAgICAgICAgICAgICAgICAgJm1SZW1vdGVSZWZjb3VudCwgKGludF9sZWFzdDMyX3QpMCwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIENhdXRpb246IGF0b21pY19pbnRfZmFzdDMyX3QgaXMgNjQgYml0cyBvbiBMUDY0LgotICAgICAgICBzdGQ6OmF0b21pY19pbnRfbGVhc3QzMl90IG1GbGFnczsKLSAgICAgICAgc3RkOjphdG9taWNfaW50X2xlYXN0MzJfdCBtUmVtb3RlUmVmY291bnQ7Ci0gICAgICAgIGludDMyX3QgdW51c2VkWzZdIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKTsgLy8gYWRkaXRpb25hbCBidWZmZXIgc3BhY2UKLSAgICB9OwotCi0gICAgaW5saW5lIFNoYXJlZENvbnRyb2wgKmdldFNoYXJlZENvbnRyb2woKSBjb25zdCB7Ci0gICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1NZW1vcnktPnBvaW50ZXIoKSk7Ci0gICAgIH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmM4ZDk0YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQlVGRkVSX0JBU0VfSF8KLQotI2RlZmluZSBNRURJQV9CVUZGRVJfQkFTRV9IXwotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1lZGlhQnVmZmVyQmFzZTsKLWNsYXNzIE1ldGFEYXRhQmFzZTsKLQotY2xhc3MgTWVkaWFCdWZmZXJPYnNlcnZlciB7Ci1wdWJsaWM6Ci0gICAgTWVkaWFCdWZmZXJPYnNlcnZlcigpIHt9Ci0gICAgdmlydHVhbCB+TWVkaWFCdWZmZXJPYnNlcnZlcigpIHt9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpID0gMDsKLQotcHJpdmF0ZToKLSAgICBNZWRpYUJ1ZmZlck9ic2VydmVyKGNvbnN0IE1lZGlhQnVmZmVyT2JzZXJ2ZXIgJik7Ci0gICAgTWVkaWFCdWZmZXJPYnNlcnZlciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhQnVmZmVyT2JzZXJ2ZXIgJik7Ci19OwotCi1jbGFzcyBNZWRpYUJ1ZmZlckJhc2UgewotcHVibGljOgotICAgIHN0YXRpYyBNZWRpYUJ1ZmZlckJhc2UgKkNyZWF0ZShzaXplX3Qgc2l6ZSk7Ci0KLSAgICAvLyBJZiBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldCwgZGVjcmVtZW50IHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQ7Ci0gICAgLy8gaWYgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byAwLCByZXR1cm4gdGhlIGJ1ZmZlciB0byB0aGUKLSAgICAvLyBhc3NvY2lhdGVkIE1lZGlhQnVmZmVyR3JvdXAuCi0gICAgLy8KLSAgICAvLyBJZiBubyBNZWRpYUJ1ZmZlckdyb3VwIGlzIHNldCwgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudCBtdXN0IGJlIHplcm8KLSAgICAvLyB3aGVuIGNhbGxlZCwgd2hlcmV1cG9uIHRoZSBNZWRpYUJ1ZmZlciBpcyBkZWxldGVkLgotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlKCkgPSAwOwotCi0gICAgLy8gSW5jcmVtZW50cyB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50LgotICAgIC8vIFVzZSBvbmx5IHdoZW4gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQuCi0gICAgdmlydHVhbCB2b2lkIGFkZF9yZWYoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgKmRhdGEoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBzaXplX3Qgc2l6ZSgpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX29mZnNldCgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9sZW5ndGgoKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpID0gMDsKLQotICAgIHZpcnR1YWwgTWV0YURhdGFCYXNlJiBtZXRhX2RhdGEoKSA9IDA7Ci0KLSAgICAvLyBDbGVhcnMgbWV0YSBkYXRhIGFuZCByZXNldHMgdGhlIHJhbmdlIHRvIHRoZSBmdWxsIGV4dGVudC4KLSAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0T2JzZXJ2ZXIoTWVkaWFCdWZmZXJPYnNlcnZlciAqZ3JvdXApID0gMDsKLQotICAgIC8vIFJldHVybnMgYSBjbG9uZSBvZiB0aGlzIE1lZGlhQnVmZmVyQmFzZSBpbmNyZWFzaW5nIGl0cyByZWZlcmVuY2UKLSAgICAvLyBjb3VudC4gVGhlIGNsb25lIHJlZmVyZW5jZXMgdGhlIHNhbWUgZGF0YSBidXQgaGFzIGl0cyBvd24gcmFuZ2UgYW5kCi0gICAgLy8gTWV0YURhdGEuCi0gICAgdmlydHVhbCBNZWRpYUJ1ZmZlckJhc2UgKmNsb25lKCkgPSAwOwotCi0gICAgdmlydHVhbCBpbnQgcmVmY291bnQoKSBjb25zdCA9IDA7Ci0KLSAgICB2aXJ0dWFsIGludCBsb2NhbFJlZmNvdW50KCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgaW50IHJlbW90ZVJlZmNvdW50KCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCB+TWVkaWFCdWZmZXJCYXNlKCkge307Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FRElBX0JVRkZFUl9CQVNFX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaCBiL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWQ1ZGY3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTUVESUFfQlVGRkVSX0dST1VQX0hfCi0KLSNkZWZpbmUgTUVESUFfQlVGRkVSX0dST1VQX0hfCi0KLSNpbmNsdWRlIDxsaXN0PgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIE1lZGlhQnVmZmVyQmFzZTsKLQotY2xhc3MgTWVkaWFCdWZmZXJHcm91cCA6IHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKLXB1YmxpYzoKLSAgICBNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBncm93dGhMaW1pdCA9IDApOwotCi0gICAgLy8gY3JlYXRlIGEgbWVkaWEgYnVmZmVyIGdyb3VwIHdpdGggcHJlYWxsb2NhdGVkIGJ1ZmZlcnMKLSAgICBNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCA9IDApOwotCi0gICAgfk1lZGlhQnVmZmVyR3JvdXAoKTsKLQotICAgIHZvaWQgYWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7Ci0KLSAgICBib29sIGhhc19idWZmZXJzKCk7Ci0KLSAgICAvLyBJZiBub25CbG9ja2luZyBpcyBmYWxzZSwgaXQgYmxvY2tzIHVudGlsIGEgYnVmZmVyIGlzIGF2YWlsYWJsZSBhbmQKLSAgICAvLyBwYXNzZXMgaXQgdG8gdGhlIGNhbGxlciBpbiAqYnVmZmVyLCB3aGlsZSByZXR1cm5pbmcgT0suCi0gICAgLy8gVGhlIHJldHVybmVkIGJ1ZmZlciB3aWxsIGhhdmUgYSByZWZlcmVuY2UgY291bnQgb2YgMS4KLSAgICAvLyBJZiBub25CbG9ja2luZyBpcyB0cnVlIGFuZCBhIGJ1ZmZlciBpcyBub3QgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLAotICAgIC8vIGJ1ZmZlciBpcyBzZXQgdG8gTlVMTCBhbmQgaXQgcmV0dXJucyBXT1VMRF9CTE9DSy4KLSAgICAvLyBJZiByZXF1ZXN0ZWRTaXplIGlzIDAsIGFueSBmcmVlIE1lZGlhQnVmZmVyIHdpbGwgYmUgcmV0dXJuZWQuCi0gICAgLy8gSWYgcmVxdWVzdGVkU2l6ZSBpcyA+IDAsIHRoZSByZXR1cm5lZCBNZWRpYUJ1ZmZlciBzaG91bGQgaGF2ZSBidWZmZXIKLSAgICAvLyBzaXplIG9mIGF0IGxlYXN0IHJlcXVzdGVkU2l6ZS4KLSAgICBzdGF0dXNfdCBhY3F1aXJlX2J1ZmZlcigKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgYm9vbCBub25CbG9ja2luZyA9IGZhbHNlLCBzaXplX3QgcmVxdWVzdGVkU2l6ZSA9IDApOwotCi0gICAgc2l6ZV90IGJ1ZmZlcnMoKSBjb25zdDsKLQotICAgIC8vIElmIGJ1ZmZlciBpcyBudWxscHRyLCBoYXZlIGFjcXVpcmVfYnVmZmVyKCkgY2hlY2sgZm9yIHJlbW90ZSByZWxlYXNlLgotICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IEludGVybmFsRGF0YTsKLSAgICBJbnRlcm5hbERhdGEgKm1JbnRlcm5hbDsKLQotICAgIE1lZGlhQnVmZmVyR3JvdXAoY29uc3QgTWVkaWFCdWZmZXJHcm91cCAmKTsKLSAgICBNZWRpYUJ1ZmZlckdyb3VwICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXJHcm91cCAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0dST1VQX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oIGIvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0ZTg2Yy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FVEFfREFUQV9CQVNFX0hfCi0KLSNkZWZpbmUgTUVUQV9EQVRBX0JBU0VfSF8KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotCi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIFRoZSBmb2xsb3dpbmcga2V5cyBtYXAgdG8gaW50MzJfdCBkYXRhIHVubGVzcyBpbmRpY2F0ZWQgb3RoZXJ3aXNlLgotZW51bSB7Ci0gICAga0tleU1JTUVUeXBlICAgICAgICAgID0gJ21pbWUnLCAgLy8gY3N0cmluZwotICAgIGtLZXlXaWR0aCAgICAgICAgICAgICA9ICd3aWR0JywgIC8vIGludDMyX3QsIGltYWdlIHBpeGVsCi0gICAga0tleUhlaWdodCAgICAgICAgICAgID0gJ2hlaWcnLCAgLy8gaW50MzJfdCwgaW1hZ2UgcGl4ZWwKLSAgICBrS2V5RGlzcGxheVdpZHRoICAgICAgPSAnZFdpZCcsICAvLyBpbnQzMl90LCBkaXNwbGF5L3ByZXNlbnRhdGlvbgotICAgIGtLZXlEaXNwbGF5SGVpZ2h0ICAgICA9ICdkSGd0JywgIC8vIGludDMyX3QsIGRpc3BsYXkvcHJlc2VudGF0aW9uCi0gICAga0tleVNBUldpZHRoICAgICAgICAgID0gJ3NhclcnLCAgLy8gaW50MzJfdCwgc2FtcGxlQXNwZWN0UmF0aW8gd2lkdGgKLSAgICBrS2V5U0FSSGVpZ2h0ICAgICAgICAgPSAnc2FySCcsICAvLyBpbnQzMl90LCBzYW1wbGVBc3BlY3RSYXRpbyBoZWlnaHQKLSAgICBrS2V5VGh1bWJuYWlsV2lkdGggICAgPSAndGhiVycsICAvLyBpbnQzMl90LCB0aHVtYm5haWwgd2lkdGgKLSAgICBrS2V5VGh1bWJuYWlsSGVpZ2h0ICAgPSAndGhiSCcsICAvLyBpbnQzMl90LCB0aHVtYm5haWwgaGVpZ2h0Ci0KLSAgICAvLyBhIHJlY3RhbmdsZSwgaWYgYWJzZW50IGFzc3VtZWQgdG8gYmUgKDAsIDAsIHdpZHRoIC0gMSwgaGVpZ2h0IC0gMSkKLSAgICBrS2V5Q3JvcFJlY3QgICAgICAgICAgPSAnY3JvcCcsCi0KLSAgICBrS2V5Um90YXRpb24gICAgICAgICAgPSAncm90QScsICAvLyBpbnQzMl90IChhbmdsZSBpbiBkZWdyZWVzKQotICAgIGtLZXlJRnJhbWVzSW50ZXJ2YWwgICA9ICdpZml2JywgIC8vIGludDMyX3QKLSAgICBrS2V5U3RyaWRlICAgICAgICAgICAgPSAnc3RyZCcsICAvLyBpbnQzMl90Ci0gICAga0tleVNsaWNlSGVpZ2h0ICAgICAgID0gJ3NsaHQnLCAgLy8gaW50MzJfdAotICAgIGtLZXlDaGFubmVsQ291bnQgICAgICA9ICcjY2huJywgIC8vIGludDMyX3QKLSAgICBrS2V5Q2hhbm5lbE1hc2sgICAgICAgPSAnY2hubScsICAvLyBpbnQzMl90Ci0gICAga0tleVNhbXBsZVJhdGUgICAgICAgID0gJ3NydGUnLCAgLy8gaW50MzJfdCAoYXVkaW8gc2FtcGxpbmcgcmF0ZSBIeikKLSAgICBrS2V5UGNtRW5jb2RpbmcgICAgICAgPSAnUENNZScsICAvLyBpbnQzMl90IChhdWRpbyBlbmNvZGluZyBlbnVtKQotICAgIGtLZXlGcmFtZVJhdGUgICAgICAgICA9ICdmcm1SJywgIC8vIGludDMyX3QgKHZpZGVvIGZyYW1lIHJhdGUgZnBzKQotICAgIGtLZXlCaXRSYXRlICAgICAgICAgICA9ICdicnRlJywgIC8vIGludDMyX3QgKGJwcykKLSAgICBrS2V5TWF4Qml0UmF0ZSAgICAgICAgPSAnbXhCcicsICAvLyBpbnQzMl90IChicHMpCi0gICAga0tleUJpdHNQZXJTYW1wbGUgICAgID0gJ2JpdHMnLCAgLy8gaW50MzJfdCAoYml0cyBwZXIgc2FtcGxlKQotICAgIGtLZXlTdHJlYW1IZWFkZXIgICAgICA9ICdzdEhkJywgIC8vIHJhdyBkYXRhCi0gICAga0tleUVTRFMgICAgICAgICAgICAgID0gJ2VzZHMnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5QUFDUHJvZmlsZSAgICAgICAgPSAnYWFjcCcsICAvLyBpbnQzMl90Ci0gICAga0tleUFWQ0MgICAgICAgICAgICAgID0gJ2F2Y2MnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5SFZDQyAgICAgICAgICAgICAgPSAnaHZjYycsICAvLyByYXcgZGF0YQotICAgIGtLZXlUaHVtYm5haWxIVkNDICAgICA9ICd0aHZjJywgIC8vIHJhdyBkYXRhCi0gICAga0tleUQyNjMgICAgICAgICAgICAgID0gJ2QyNjMnLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5Vm9yYmlzSW5mbyAgICAgICAgPSAndmluZicsICAvLyByYXcgZGF0YQotICAgIGtLZXlWb3JiaXNCb29rcyAgICAgICA9ICd2Ym9vJywgIC8vIHJhdyBkYXRhCi0gICAga0tleU9wdXNIZWFkZXIgICAgICAgID0gJ29oZHInLCAgLy8gcmF3IGRhdGEKLSAgICBrS2V5T3B1c0NvZGVjRGVsYXkgICAgPSAnb2NvZCcsICAvLyB1aW50NjRfdCAoY29kZWMgZGVsYXkgaW4gbnMpCi0gICAga0tleU9wdXNTZWVrUHJlUm9sbCAgID0gJ29zcHInLCAgLy8gdWludDY0X3QgKHNlZWsgcHJlcm9sbCBpbiBucykKLSAgICBrS2V5RmxhY01ldGFkYXRhICAgICAgPSAnZmxNZCcsICAvLyByYXcgZGF0YQotICAgIGtLZXlWcDlDb2RlY1ByaXZhdGUgICA9ICd2cDlwJywgIC8vIHJhdyBkYXRhICh2cDkgY3NkIGluZm9ybWF0aW9uKQotICAgIGtLZXlXYW50c05BTEZyYWdtZW50cyA9ICdOQUxmJywKLSAgICBrS2V5SXNTeW5jRnJhbWUgICAgICAgPSAnc3luYycsICAvLyBpbnQzMl90IChib29sKQotICAgIGtLZXlJc0NvZGVjQ29uZmlnICAgICA9ICdjb25mJywgIC8vIGludDMyX3QgKGJvb2wpCi0gICAga0tleUlzTXV4ZXJEYXRhICAgICAgID0gJ211eGQnLCAgLy8gaW50MzJfdCAoYm9vbCkKLSAgICBrS2V5VGltZSAgICAgICAgICAgICAgPSAndGltZScsICAvLyBpbnQ2NF90ICh1c2VjcykKLSAgICBrS2V5RGVjb2RpbmdUaW1lICAgICAgPSAnZGVjVCcsICAvLyBpbnQ2NF90IChkZWNvZGluZyB0aW1lc3RhbXAgaW4gdXNlY3MpCi0gICAga0tleU5UUFRpbWUgICAgICAgICAgID0gJ250cFQnLCAgLy8gdWludDY0X3QgKG50cC10aW1lc3RhbXApCi0gICAga0tleVRhcmdldFRpbWUgICAgICAgID0gJ3RhclQnLCAgLy8gaW50NjRfdCAodXNlY3MpCi0gICAga0tleURyaWZ0VGltZSAgICAgICAgID0gJ2RmdFQnLCAgLy8gaW50NjRfdCAodXNlY3MpCi0gICAga0tleUFuY2hvclRpbWUgICAgICAgID0gJ2FuY1QnLCAgLy8gaW50NjRfdCAodXNlY3MpCi0gICAga0tleUR1cmF0aW9uICAgICAgICAgID0gJ2R1cmEnLCAgLy8gaW50NjRfdCAodXNlY3MpCi0gICAga0tleVBpeGVsRm9ybWF0ICAgICAgID0gJ3BpeGYnLCAgLy8gaW50MzJfdAotICAgIGtLZXlDb2xvckZvcm1hdCAgICAgICA9ICdjb2xmJywgIC8vIGludDMyX3QKLSAgICBrS2V5Q29sb3JTcGFjZSAgICAgICAgPSAnY29scycsICAvLyBpbnQzMl90Ci0gICAga0tleVBsYXRmb3JtUHJpdmF0ZSAgID0gJ3ByaXYnLCAgLy8gcG9pbnRlcgotICAgIGtLZXlEZWNvZGVyQ29tcG9uZW50ICA9ICdkZWNDJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5QnVmZmVySUQgICAgICAgICAgPSAnYmZJRCcsCi0gICAga0tleU1heElucHV0U2l6ZSAgICAgID0gJ2lucFMnLAotICAgIGtLZXlNYXhXaWR0aCAgICAgICAgICA9ICdtYXhXJywKLSAgICBrS2V5TWF4SGVpZ2h0ICAgICAgICAgPSAnbWF4SCcsCi0gICAga0tleVRodW1ibmFpbFRpbWUgICAgID0gJ3RoYlQnLCAgLy8gaW50NjRfdCAodXNlY3MpCi0gICAga0tleVRyYWNrSUQgICAgICAgICAgID0gJ3RySUQnLAotICAgIGtLZXlJc0RSTSAgICAgICAgICAgICA9ICdpZHJtJywgIC8vIGludDMyX3QgKGJvb2wpCi0gICAga0tleUVuY29kZXJEZWxheSAgICAgID0gJ2VuY2QnLCAgLy8gaW50MzJfdCAoZnJhbWVzKQotICAgIGtLZXlFbmNvZGVyUGFkZGluZyAgICA9ICdlbmNwJywgIC8vIGludDMyX3QgKGZyYW1lcykKLQotICAgIGtLZXlBbGJ1bSAgICAgICAgICAgICA9ICdhbGJ1JywgIC8vIGNzdHJpbmcKLSAgICBrS2V5QXJ0aXN0ICAgICAgICAgICAgPSAnYXJ0aScsICAvLyBjc3RyaW5nCi0gICAga0tleUFsYnVtQXJ0aXN0ICAgICAgID0gJ2FhcnQnLCAgLy8gY3N0cmluZwotICAgIGtLZXlDb21wb3NlciAgICAgICAgICA9ICdjb21wJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5R2VucmUgICAgICAgICAgICAgPSAnZ2VucicsICAvLyBjc3RyaW5nCi0gICAga0tleVRpdGxlICAgICAgICAgICAgID0gJ3RpdGwnLCAgLy8gY3N0cmluZwotICAgIGtLZXlZZWFyICAgICAgICAgICAgICA9ICd5ZWFyJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5QWxidW1BcnQgICAgICAgICAgPSAnYWxiQScsICAvLyBjb21wcmVzc2VkIGltYWdlIGRhdGEKLSAgICBrS2V5QWxidW1BcnRNSU1FICAgICAgPSAnYWxBTScsICAvLyBjc3RyaW5nCi0gICAga0tleUF1dGhvciAgICAgICAgICAgID0gJ2F1dGgnLCAgLy8gY3N0cmluZwotICAgIGtLZXlDRFRyYWNrTnVtYmVyICAgICA9ICdjZHRyJywgIC8vIGNzdHJpbmcKLSAgICBrS2V5RGlzY051bWJlciAgICAgICAgPSAnZG51bScsICAvLyBjc3RyaW5nCi0gICAga0tleURhdGUgICAgICAgICAgICAgID0gJ2RhdGUnLCAgLy8gY3N0cmluZwotICAgIGtLZXlXcml0ZXIgICAgICAgICAgICA9ICd3cml0JywgIC8vIGNzdHJpbmcKLSAgICBrS2V5Q29tcGlsYXRpb24gICAgICAgPSAnY3BpbCcsICAvLyBjc3RyaW5nCi0gICAga0tleUxvY2F0aW9uICAgICAgICAgID0gJ2xvYyAnLCAgLy8gY3N0cmluZwotICAgIGtLZXlUaW1lU2NhbGUgICAgICAgICA9ICd0bXNsJywgIC8vIGludDMyX3QKLSAgICBrS2V5Q2FwdHVyZUZyYW1lcmF0ZSAgPSAnY2FwRicsICAvLyBmbG9hdCAoY2FwdHVyZSBmcHMpCi0KLSAgICAvLyB2aWRlbyBwcm9maWxlIGFuZCBsZXZlbAotICAgIGtLZXlWaWRlb1Byb2ZpbGUgICAgICA9ICd2cHJmJywgIC8vIGludDMyX3QKLSAgICBrS2V5VmlkZW9MZXZlbCAgICAgICAgPSAndmxldicsICAvLyBpbnQzMl90Ci0KLSAgICAvLyBTZXQgdGhpcyBrZXkgdG8gZW5hYmxlIGF1dGhvcmluZyBmaWxlcyBpbiA2NC1iaXQgb2Zmc2V0Ci0gICAga0tleTY0Qml0RmlsZU9mZnNldCAgID0gJ2ZvYnQnLCAgLy8gaW50MzJfdCAoYm9vbCkKLSAgICBrS2V5MkJ5dGVOYWxMZW5ndGggICAgPSAnMk5BTCcsICAvLyBpbnQzMl90IChib29sKQotCi0gICAgLy8gSWRlbnRpZnkgdGhlIGZpbGUgb3V0cHV0IGZvcm1hdCBmb3IgYXV0aG9yaW5nCi0gICAgLy8gUGxlYXNlIHNlZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPiBmb3IgdGhlIHN1cHBvcnRlZAotICAgIC8vIGZpbGUgb3V0cHV0IGZvcm1hdHMuCi0gICAga0tleUZpbGVUeXBlICAgICAgICAgID0gJ2Z0eXAnLCAgLy8gaW50MzJfdAotCi0gICAgLy8gVHJhY2sgYXV0aG9yaW5nIHByb2dyZXNzIHN0YXR1cwotICAgIC8vIGtLZXlUcmFja1RpbWVTdGF0dXMgaXMgdXNlZCB0byB0cmFjayBwcm9ncmVzcyBpbiBlbGFwc2VkIHRpbWUKLSAgICBrS2V5VHJhY2tUaW1lU3RhdHVzICAgPSAndGt0bScsICAvLyBpbnQ2NF90Ci0KLSAgICBrS2V5UmVhbFRpbWVSZWNvcmRpbmcgPSAncnRyYycsICAvLyBib29sIChpbnQzMl90KQotICAgIGtLZXlOdW1CdWZmZXJzICAgICAgICA9ICduYmJmJywgIC8vIGludDMyX3QKLQotICAgIC8vIE9nZyBmaWxlcyBjYW4gYmUgdGFnZ2VkIHRvIGJlIGF1dG9tYXRpY2FsbHkgbG9vcGluZy4uLgotICAgIGtLZXlBdXRvTG9vcCAgICAgICAgICA9ICdhdXRMJywgIC8vIGJvb2wgKGludDMyX3QpCi0KLSAgICBrS2V5VmFsaWRTYW1wbGVzICAgICAgPSAndmFsRCcsICAvLyBpbnQzMl90Ci0KLSAgICBrS2V5SXNVbnJlYWRhYmxlICAgICAgPSAndW5yZScsICAvLyBib29sIChpbnQzMl90KQotCi0gICAgLy8gQW4gaW5kaWNhdGlvbiB0aGF0IGEgdmlkZW8gYnVmZmVyIGhhcyBiZWVuIHJlbmRlcmVkLgotICAgIGtLZXlSZW5kZXJlZCAgICAgICAgICA9ICdyZW5kJywgIC8vIGJvb2wgKGludDMyX3QpCi0KLSAgICAvLyBUaGUgbGFuZ3VhZ2UgY29kZSBmb3IgdGhpcyBtZWRpYQotICAgIGtLZXlNZWRpYUxhbmd1YWdlICAgICA9ICdsYW5nJywgIC8vIGNzdHJpbmcKLQotICAgIC8vIFRvIHN0b3JlIHRoZSB0aW1lZCB0ZXh0IGZvcm1hdCBkYXRhCi0gICAga0tleVRleHRGb3JtYXREYXRhICAgID0gJ3RleHQnLCAgLy8gcmF3IGRhdGEKLQotICAgIGtLZXlSZXF1aXJlc1NlY3VyZUJ1ZmZlcnMgPSAnc2VjdScsICAvLyBib29sIChpbnQzMl90KQotCi0gICAga0tleUlzQURUUyAgICAgICAgICAgID0gJ2FkdHMnLCAgLy8gYm9vbCAoaW50MzJfdCkKLSAgICBrS2V5QUFDQU9UICAgICAgICAgICAgPSAnYWFvdCcsICAvLyBpbnQzMl90Ci0KLSAgICAvLyBJZiBhIE1lZGlhQnVmZmVyJ3MgZGF0YSByZXByZXNlbnRzIChhdCBsZWFzdCBwYXJ0aWFsbHkpIGVuY3J5cHRlZAotICAgIC8vIGRhdGEsIHRoZSBmb2xsb3dpbmcgZmllbGRzIGFpZCBpbiBkZWNyeXB0aW9uLgotICAgIC8vIFRoZSBkYXRhIGNhbiBiZSB0aG91Z2h0IG9mIGFzIHBhaXJzIG9mIHBsYWluIGFuZCBlbmNyeXB0ZWQgZGF0YQotICAgIC8vIGZyYWdtZW50cywgaS5lLiBwbGFpbiBhbmQgZW5jcnlwdGVkIGRhdGEgYWx0ZXJuYXRlLgotICAgIC8vIFRoZSBmaXJzdCBmcmFnbWVudCBpcyBieSBjb252ZW50aW9uIHBsYWluIGRhdGEgKGlmIHRoYXQncyBub3QgdGhlCi0gICAgLy8gY2FzZSwgc2ltcGx5IHNwZWNpZnkgcGxhaW4gZnJhZ21lbnQgc2l6ZSBvZiAwKS4KLSAgICAvLyBrS2V5RW5jcnlwdGVkU2l6ZXMgYW5kIGtLZXlQbGFpblNpemVzIGVhY2ggbWFwIHRvIGFuIGFycmF5IG9mCi0gICAgLy8gc2l6ZV90IHZhbHVlcy4gVGhlIHN1bSB0b3RhbCBvZiBhbGwgc2l6ZV90IHZhbHVlcyBvZiBib3RoIGFycmF5cwotICAgIC8vIG11c3QgZXF1YWwgdGhlIGFtb3VudCBvZiBkYXRhIChpLmUuIE1lZGlhQnVmZmVyJ3MgcmFuZ2VfbGVuZ3RoKCkpLgotICAgIC8vIElmIGJvdGggYXJyYXlzIGFyZSBwcmVzZW50LCB0aGV5IG11c3QgYmUgb2YgdGhlIHNhbWUgc2l6ZS4KLSAgICAvLyBJZiBvbmx5IGVuY3J5cHRlZCBzaXplcyBhcmUgcHJlc2VudCBpdCBpcyBhc3N1bWVkIHRoYXQgYWxsCi0gICAgLy8gcGxhaW4gc2l6ZXMgYXJlIDAsIGkuZS4gYWxsIGZyYWdtZW50cyBhcmUgZW5jcnlwdGVkLgotICAgIC8vIFRvIHByb2dyYW1tYXRpY2FsbHkgc2V0IHRoZXNlIGFycmF5LCB1c2UgdGhlIE1ldGFEYXRhQmFzZTo6c2V0RGF0YSBBUEksIGkuZS4KLSAgICAvLyBjb25zdCBzaXplX3QgZW5jU2l6ZXNbXTsKLSAgICAvLyBtZXRhLT5zZXREYXRhKAotICAgIC8vICBrS2V5RW5jcnlwdGVkU2l6ZXMsIDAgLyogdHlwZSAqLywgZW5jU2l6ZXMsIHNpemVvZihlbmNTaXplcykpOwotICAgIC8vIEEgcGxhaW4gc2l6ZXMgYXJyYXkgYnkgaXRzZWxmIG1ha2VzIG5vIHNlbnNlLgotICAgIGtLZXlFbmNyeXB0ZWRTaXplcyAgICA9ICdlbmNyJywgIC8vIHNpemVfdFtdCi0gICAga0tleVBsYWluU2l6ZXMgICAgICAgID0gJ3BsYWknLCAgLy8gc2l6ZV90W10KLSAgICBrS2V5Q3J5cHRvS2V5ICAgICAgICAgPSAnY3J5SycsICAvLyB1aW50OF90WzE2XQotICAgIGtLZXlDcnlwdG9JViAgICAgICAgICA9ICdjcnlJJywgIC8vIHVpbnQ4X3RbMTZdCi0gICAga0tleUNyeXB0b01vZGUgICAgICAgID0gJ2NyeU0nLCAgLy8gaW50MzJfdAotCi0gICAga0tleUNyeXB0b0RlZmF1bHRJVlNpemUgPSAnY3J5UycsICAvLyBpbnQzMl90Ci0KLSAgICBrS2V5UHNzaCAgICAgICAgICAgICAgPSAncHNzaCcsICAvLyByYXcgZGF0YQotICAgIGtLZXlDQVN5c3RlbUlEICAgICAgICA9ICdjYWlkJywgIC8vIGludDMyX3QKLSAgICBrS2V5Q0FTZXNzaW9uSUQgICAgICAgPSAnc2VpZCcsICAvLyByYXcgZGF0YQotCi0gICAga0tleUVuY3J5cHRlZEJ5dGVCbG9jayA9ICdjYmxrJywgIC8vIHVpbnQ4X3QKLSAgICBrS2V5U2tpcEJ5dGVCbG9jayAgICAgPSAnc2JsaycsICAvLyB1aW50OF90Ci0KLSAgICAvLyBQbGVhc2Ugc2VlIE1lZGlhRm9ybWF0LktFWV9JU19BVVRPU0VMRUNULgotICAgIGtLZXlUcmFja0lzQXV0b3NlbGVjdCA9ICdhdXRvJywgLy8gYm9vbCAoaW50MzJfdCkKLSAgICAvLyBQbGVhc2Ugc2VlIE1lZGlhRm9ybWF0LktFWV9JU19ERUZBVUxULgotICAgIGtLZXlUcmFja0lzRGVmYXVsdCAgICA9ICdkZmx0JywgLy8gYm9vbCAoaW50MzJfdCkKLSAgICAvLyBTaW1pbGFyIHRvIE1lZGlhRm9ybWF0LktFWV9JU19GT1JDRURfU1VCVElUTEUgYnV0IHBlcnRhaW5zIHRvIGF2IHRyYWNrcyBhcyB3ZWxsLgotICAgIGtLZXlUcmFja0lzRm9yY2VkICAgICA9ICdmcmNkJywgLy8gYm9vbCAoaW50MzJfdCkKLQotICAgIC8vIEgyNjQgc3VwcGxlbWVudGFsIGVuaGFuY2VtZW50IGluZm9ybWF0aW9uIG9mZnNldHMvc2l6ZXMKLSAgICBrS2V5U0VJICAgICAgICAgICAgICAgPSAnc2VpICcsIC8vIHJhdyBkYXRhCi0KLSAgICAvLyBNUEVHIHVzZXIgZGF0YSBvZmZzZXRzCi0gICAga0tleU1wZWdVc2VyRGF0YSAgICAgID0gJ21wdWQnLCAvLyBzaXplX3RbXQotCi0gICAgLy8gU2l6ZSBvZiBOQUxVIGxlbmd0aCBpbiBta3YvbXA0Ci0gICAga0tleU5hbExlbmd0aFNpemUgICAgID0gJ25hbHMnLCAvLyBpbnQzMl90Ci0KLSAgICAvLyBIRFIgcmVsYXRlZAotICAgIGtLZXlIZHJTdGF0aWNJbmZvICAgID0gJ2hkclMnLCAvLyBIRFJTdGF0aWNJbmZvCi0KLSAgICAvLyBjb2xvciBhc3BlY3RzCi0gICAga0tleUNvbG9yUmFuZ2UgICAgICAgPSAnY1JuZycsIC8vIGludDMyX3QsIGNvbG9yIHJhbmdlLCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5SYW5nZQotICAgIGtLZXlDb2xvclByaW1hcmllcyAgID0gJ2NQcm0nLCAvLyBpbnQzMl90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xvciBQcmltYXJpZXMsIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLlByaW1hcmllcwotICAgIGtLZXlUcmFuc2ZlckZ1bmN0aW9uID0gJ3RGdW4nLCAvLyBpbnQzMl90LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cmFuc2ZlciBGdW5jdGlvbiwgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuVHJhbnNmZXIuCi0gICAga0tleUNvbG9yTWF0cml4ICAgICAgPSAnY010eCcsIC8vIGludDMyX3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvbG9yIE1hdHJpeCwgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuTWF0cml4Q29lZmZzLgotICAgIGtLZXlUZW1wb3JhbExheWVySWQgID0gJ2lMeXInLCAvLyBpbnQzMl90LCB0ZW1wb3JhbCBsYXllci1pZC4gMC1iYXNlZCAoMCA9PiBiYXNlIGxheWVyKQotICAgIGtLZXlUZW1wb3JhbExheWVyQ291bnQgPSAnY0x5cicsIC8vIGludDMyX3QsIG51bWJlciBvZiB0ZW1wb3JhbCBsYXllcnMgZW5jb2RlZAotCi0gICAga0tleVRpbGVXaWR0aCAgICAgICAgPSAndGlsVycsIC8vIGludDMyX3QsIEhFSUYgdGlsZSB3aWR0aAotICAgIGtLZXlUaWxlSGVpZ2h0ICAgICAgID0gJ3RpbEgnLCAvLyBpbnQzMl90LCBIRUlGIHRpbGUgaGVpZ2h0Ci0gICAga0tleUdyaWRSb3dzICAgICAgICAgPSAnZ3JkUicsIC8vIGludDMyX3QsIEhFSUYgZ3JpZCByb3dzCi0gICAga0tleUdyaWRDb2xzICAgICAgICAgPSAnZ3JkQycsIC8vIGludDMyX3QsIEhFSUYgZ3JpZCBjb2x1bW5zCi0gICAga0tleUljY1Byb2ZpbGUgICAgICAgPSAncHJvZicsIC8vIHJhdyBkYXRhLCBJQ0MgcHJvZmlsZSBkYXRhCi0gICAga0tleUlzUHJpbWFyeUltYWdlICAgPSAncHJpbScsIC8vIGJvb2wgKGludDMyX3QpLCBpbWFnZSB0cmFjayBpcyB0aGUgcHJpbWFyeSBpbWFnZQotICAgIGtLZXlGcmFtZUNvdW50ICAgICAgID0gJ25mcm0nLCAvLyBpbnQzMl90LCB0b3RhbCBudW1iZXIgb2YgZnJhbWUgaW4gdmlkZW8gdHJhY2sKLSAgICBrS2V5RXhpZk9mZnNldCAgICAgICA9ICdleG9mJywgLy8gaW50NjRfdCwgRXhpZiBkYXRhIG9mZnNldAotICAgIGtLZXlFeGlmU2l6ZSAgICAgICAgID0gJ2V4c3onLCAvLyBpbnQ2NF90LCBFeGlmIGRhdGEgc2l6ZQotICAgIGtLZXlJc0V4aWYgICAgICAgICAgID0gJ2V4aWYnLCAvLyBib29sIChpbnQzMl90KSBidWZmZXIgY29udGFpbnMgZXhpZiBkYXRhIGJsb2NrCi0KLSAgICBrS2V5UGNtQmlnRW5kaWFuICAgICA9ICdwY21iJywgLy8gYm9vbCAoaW50MzJfdCkKLQotICAgIC8vIEtleSBmb3IgQUxBQyBNYWdpYyBDb29raWUKLSAgICBrS2V5QWxhY01hZ2ljQ29va2llICA9ICdhbG1jJywgLy8gcmF3IGRhdGEKLX07Ci0KLWVudW0gewotICAgIGtUeXBlRVNEUyAgICAgICAgPSAnZXNkcycsCi0gICAga1R5cGVBVkNDICAgICAgICA9ICdhdmNjJywKLSAgICBrVHlwZUhWQ0MgICAgICAgID0gJ2h2Y2MnLAotICAgIGtUeXBlRDI2MyAgICAgICAgPSAnZDI2MycsCi19OwotCi1lbnVtIHsKLSAgICBrQ3J5cHRvTW9kZVVuZW5jcnlwdGVkID0gMCwKLSAgICBrQ3J5cHRvTW9kZUFlc0N0ciAgICAgID0gMSwKLSAgICBrQ3J5cHRvTW9kZUFlc0NiYyAgICAgID0gMiwKLX07Ci0KLWNsYXNzIFBhcmNlbDsKLQotY2xhc3MgTWV0YURhdGFCYXNlIHsKLXB1YmxpYzoKLSAgICBNZXRhRGF0YUJhc2UoKTsKLSAgICBNZXRhRGF0YUJhc2UoY29uc3QgTWV0YURhdGFCYXNlICZmcm9tKTsKLSAgICBNZXRhRGF0YUJhc2UmIG9wZXJhdG9yID0gKGNvbnN0IE1ldGFEYXRhQmFzZSAmKTsKLQotICAgIHZpcnR1YWwgfk1ldGFEYXRhQmFzZSgpOwotCi0gICAgZW51bSBUeXBlIHsKLSAgICAgICAgVFlQRV9OT05FICAgICA9ICdub25lJywKLSAgICAgICAgVFlQRV9DX1NUUklORyA9ICdjc3RyJywKLSAgICAgICAgVFlQRV9JTlQzMiAgICA9ICdpbjMyJywKLSAgICAgICAgVFlQRV9JTlQ2NCAgICA9ICdpbjY0JywKLSAgICAgICAgVFlQRV9GTE9BVCAgICA9ICdmbG9hJywKLSAgICAgICAgVFlQRV9QT0lOVEVSICA9ICdwdHIgJywKLSAgICAgICAgVFlQRV9SRUNUICAgICA9ICdyZWN0JywKLSAgICB9OwotCi0gICAgdm9pZCBjbGVhcigpOwotICAgIGJvb2wgcmVtb3ZlKHVpbnQzMl90IGtleSk7Ci0KLSAgICBib29sIHNldENTdHJpbmcodWludDMyX3Qga2V5LCBjb25zdCBjaGFyICp2YWx1ZSk7Ci0gICAgYm9vbCBzZXRJbnQzMih1aW50MzJfdCBrZXksIGludDMyX3QgdmFsdWUpOwotICAgIGJvb2wgc2V0SW50NjQodWludDMyX3Qga2V5LCBpbnQ2NF90IHZhbHVlKTsKLSAgICBib29sIHNldEZsb2F0KHVpbnQzMl90IGtleSwgZmxvYXQgdmFsdWUpOwotICAgIGJvb2wgc2V0UG9pbnRlcih1aW50MzJfdCBrZXksIHZvaWQgKnZhbHVlKTsKLQotICAgIGJvb2wgc2V0UmVjdCgKLSAgICAgICAgICAgIHVpbnQzMl90IGtleSwKLSAgICAgICAgICAgIGludDMyX3QgbGVmdCwgaW50MzJfdCB0b3AsCi0gICAgICAgICAgICBpbnQzMl90IHJpZ2h0LCBpbnQzMl90IGJvdHRvbSk7Ci0KLSAgICBib29sIGZpbmRDU3RyaW5nKHVpbnQzMl90IGtleSwgY29uc3QgY2hhciAqKnZhbHVlKSBjb25zdDsKLSAgICBib29sIGZpbmRJbnQzMih1aW50MzJfdCBrZXksIGludDMyX3QgKnZhbHVlKSBjb25zdDsKLSAgICBib29sIGZpbmRJbnQ2NCh1aW50MzJfdCBrZXksIGludDY0X3QgKnZhbHVlKSBjb25zdDsKLSAgICBib29sIGZpbmRGbG9hdCh1aW50MzJfdCBrZXksIGZsb2F0ICp2YWx1ZSkgY29uc3Q7Ci0gICAgYm9vbCBmaW5kUG9pbnRlcih1aW50MzJfdCBrZXksIHZvaWQgKip2YWx1ZSkgY29uc3Q7Ci0KLSAgICBib29sIGZpbmRSZWN0KAotICAgICAgICAgICAgdWludDMyX3Qga2V5LAotICAgICAgICAgICAgaW50MzJfdCAqbGVmdCwgaW50MzJfdCAqdG9wLAotICAgICAgICAgICAgaW50MzJfdCAqcmlnaHQsIGludDMyX3QgKmJvdHRvbSkgY29uc3Q7Ci0KLSAgICBib29sIHNldERhdGEodWludDMyX3Qga2V5LCB1aW50MzJfdCB0eXBlLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICBib29sIGZpbmREYXRhKHVpbnQzMl90IGtleSwgdWludDMyX3QgKnR5cGUsCi0gICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICoqZGF0YSwgc2l6ZV90ICpzaXplKSBjb25zdDsKLQotICAgIGJvb2wgaGFzRGF0YSh1aW50MzJfdCBrZXkpIGNvbnN0OwotCi0gICAgU3RyaW5nOCB0b1N0cmluZygpIGNvbnN0OwotICAgIHZvaWQgZHVtcFRvTG9nKCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgZnJpZW5kIGNsYXNzIEJwTWVkaWFTb3VyY2U7Ci0gICAgZnJpZW5kIGNsYXNzIEJuTWVkaWFTb3VyY2U7Ci0gICAgZnJpZW5kIGNsYXNzIEJuTWVkaWFFeHRyYWN0b3I7Ci0gICAgZnJpZW5kIGNsYXNzIE1ldGFEYXRhOwotCi0gICAgc3RydWN0IHR5cGVkX2RhdGE7Ci0gICAgc3RydWN0IFJlY3Q7Ci0gICAgc3RydWN0IE1ldGFEYXRhSW50ZXJuYWw7Ci0gICAgTWV0YURhdGFJbnRlcm5hbCAqbUludGVybmFsRGF0YTsKLSAgICBzdGF0dXNfdCB3cml0ZVRvUGFyY2VsKFBhcmNlbCAmcGFyY2VsKTsKLSAgICBzdGF0dXNfdCB1cGRhdGVGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCAmcGFyY2VsKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVUQV9EQVRBX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWhlbHBlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmVkZWVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDI5IEBACitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJtZWRpYV9oZWxwZXJfaGVhZGVycyIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKK30KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYm1lZGlhX2hlbHBlciIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICB2bmRrOiB7CisgICAgICAgIGVuYWJsZWQ6IHRydWUsCisgICAgfSwKKyAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCisgICAgc3JjczogWyJBdWRpb1BhcmFtZXRlci5jcHAiLCAiVHlwZUNvbnZlcnRlci5jcHAiXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJ1dGlscyIsICJsaWJsb2ciXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFfaGVscGVyX2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiLAorICAgIF0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGlibWVkaWFfaGVscGVyX2hlYWRlcnMiLAorICAgIF0sCisgICAgY2xhbmc6IHRydWUsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWhlbHBlci9BdWRpb1BhcmFtZXRlci5jcHAgYi9tZWRpYS9saWJtZWRpYWhlbHBlci9BdWRpb1BhcmFtZXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYzNDAzNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhaGVscGVyL0F1ZGlvUGFyYW1ldGVyLmNwcApAQCAtMCwwICsxLDIyMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNi0yMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBdWRpb1BhcmFtZXRlciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK2NvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyA9IEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUk9VVElORzsKK2NvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5U2FtcGxpbmdSYXRlID0gQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TQU1QTElOR19SQVRFOworY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlGb3JtYXQgPSBBVURJT19QQVJBTUVURVJfU1RSRUFNX0ZPUk1BVDsKK2NvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5Q2hhbm5lbHMgPSBBVURJT19QQVJBTUVURVJfU1RSRUFNX0NIQU5ORUxTOworY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlGcmFtZUNvdW50ID0gQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9GUkFNRV9DT1VOVDsKK2NvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5SW5wdXRTb3VyY2UgPSBBVURJT19QQVJBTUVURVJfU1RSRUFNX0lOUFVUX1NPVVJDRTsKK2NvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5U2NyZWVuU3RhdGUgPSBBVURJT19QQVJBTUVURVJfS0VZX1NDUkVFTl9TVEFURTsKK2NvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5QnROcmVjID0gQVVESU9fUEFSQU1FVEVSX0tFWV9CVF9OUkVDOworY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlId0F2U3luYyA9IEFVRElPX1BBUkFNRVRFUl9IV19BVl9TWU5DOworY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlQcmVzZW50YXRpb25JZCA9IEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fUFJFU0VOVEFUSU9OX0lEOworY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlQcm9ncmFtSWQgPSBBVURJT19QQVJBTUVURVJfU1RSRUFNX1BST0dSQU1fSUQ7Citjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleUF1ZGlvTGFuZ3VhZ2VQcmVmZXJyZWQgPQorICAgICAgICBBVURJT19QQVJBTUVURVJfS0VZX0FVRElPX0xBTkdVQUdFX1BSRUZFUlJFRDsKK2NvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5TW9ub091dHB1dCA9IEFVRElPX1BBUkFNRVRFUl9NT05PX09VVFBVVDsKK2NvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtSHdBdlN5bmMgPSBBVURJT19QQVJBTUVURVJfU1RSRUFNX0hXX0FWX1NZTkM7Citjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleURldmljZUNvbm5lY3QgPSBBVURJT19QQVJBTUVURVJfREVWSUNFX0NPTk5FQ1Q7Citjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleURldmljZURpc2Nvbm5lY3QgPSBBVURJT19QQVJBTUVURVJfREVWSUNFX0RJU0NPTk5FQ1Q7Citjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbUNvbm5lY3QgPSBBVURJT19QQVJBTUVURVJfREVWSUNFX0NPTk5FQ1Q7Citjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbURpc2Nvbm5lY3QgPSBBVURJT19QQVJBTUVURVJfREVWSUNFX0RJU0NPTk5FQ1Q7Citjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZEZvcm1hdHMgPSBBVURJT19QQVJBTUVURVJfU1RSRUFNX1NVUF9GT1JNQVRTOworY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyA9IEFVRElPX1BBUkFNRVRFUl9TVFJFQU1fU1VQX0NIQU5ORUxTOworY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRTYW1wbGluZ1JhdGVzID0KKyAgICAgICAgQVVESU9fUEFSQU1FVEVSX1NUUkVBTV9TVVBfU0FNUExJTkdfUkFURVM7Citjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OnZhbHVlT24gPSBBVURJT19QQVJBTUVURVJfVkFMVUVfT047Citjb25zdCBjaGFyICogY29uc3QgQXVkaW9QYXJhbWV0ZXI6OnZhbHVlT2ZmID0gQVVESU9fUEFSQU1FVEVSX1ZBTFVFX09GRjsKK2NvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yID0gQVVESU9fUEFSQU1FVEVSX1ZBTFVFX0xJU1RfU0VQQVJBVE9SOworY29uc3QgY2hhciAqIGNvbnN0IEF1ZGlvUGFyYW1ldGVyOjprZXlSZWNvbmZpZ0EyZHAgPSBBVURJT19QQVJBTUVURVJfUkVDT05GSUdfQTJEUDsKK2NvbnN0IGNoYXIgKiBjb25zdCBBdWRpb1BhcmFtZXRlcjo6a2V5UmVjb25maWdBMmRwU3VwcG9ydGVkID0gQVVESU9fUEFSQU1FVEVSX0EyRFBfUkVDT05GSUdfU1VQUE9SVEVEOworCitBdWRpb1BhcmFtZXRlcjo6QXVkaW9QYXJhbWV0ZXIoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKK3sKKyAgICBjaGFyICpzdHIgPSBuZXcgY2hhcltrZXlWYWx1ZVBhaXJzLmxlbmd0aCgpKzFdOworICAgIG1LZXlWYWx1ZVBhaXJzID0ga2V5VmFsdWVQYWlyczsKKyAgICBjaGFyICpsYXN0OworCisgICAgc3RyY3B5KHN0ciwga2V5VmFsdWVQYWlycy5zdHJpbmcoKSk7CisgICAgY2hhciAqcGFpciA9IHN0cnRva19yKHN0ciwgIjsiLCAmbGFzdCk7CisgICAgd2hpbGUgKHBhaXIgIT0gTlVMTCkgeworICAgICAgICBpZiAoc3RybGVuKHBhaXIpICE9IDApIHsKKyAgICAgICAgICAgIHNpemVfdCBlcUlkeCA9IHN0cmNzcG4ocGFpciwgIj0iKTsKKyAgICAgICAgICAgIFN0cmluZzgga2V5ID0gU3RyaW5nOChwYWlyLCBlcUlkeCk7CisgICAgICAgICAgICBTdHJpbmc4IHZhbHVlOworICAgICAgICAgICAgaWYgKGVxSWR4ID09IHN0cmxlbihwYWlyKSkgeworICAgICAgICAgICAgICAgIHZhbHVlID0gU3RyaW5nOCgiIik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZhbHVlID0gU3RyaW5nOChwYWlyICsgZXFJZHggKyAxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUGFyYW1ldGVycy5pbmRleE9mS2V5KGtleSkgPCAwKSB7CisgICAgICAgICAgICAgICAgbVBhcmFtZXRlcnMuYWRkKGtleSwgdmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtUGFyYW1ldGVycy5yZXBsYWNlVmFsdWVGb3Ioa2V5LCB2YWx1ZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVigiQXVkaW9QYXJhbWV0ZXIoKSBjc3RvciBlbXB0eSBrZXkgdmFsdWUgcGFpciIpOworICAgICAgICB9CisgICAgICAgIHBhaXIgPSBzdHJ0b2tfcihOVUxMLCAiOyIsICZsYXN0KTsKKyAgICB9CisKKyAgICBkZWxldGVbXSBzdHI7Cit9CisKK0F1ZGlvUGFyYW1ldGVyOjp+QXVkaW9QYXJhbWV0ZXIoKQoreworICAgIG1QYXJhbWV0ZXJzLmNsZWFyKCk7Cit9CisKK1N0cmluZzggQXVkaW9QYXJhbWV0ZXI6OnRvU3RyaW5nSW1wbChib29sIHVzZVZhbHVlcykgY29uc3QKK3sKKyAgICBTdHJpbmc4IHN0ciA9IFN0cmluZzgoIiIpOworCisgICAgc2l6ZV90IHNpemUgPSBtUGFyYW1ldGVycy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgc3RyICs9IG1QYXJhbWV0ZXJzLmtleUF0KGkpOworICAgICAgICBpZiAodXNlVmFsdWVzKSB7CisgICAgICAgICAgICBzdHIgKz0gIj0iOworICAgICAgICAgICAgc3RyICs9IG1QYXJhbWV0ZXJzLnZhbHVlQXQoaSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGkgPCAoc2l6ZSAtIDEpKSBzdHIgKz0gIjsiOworICAgIH0KKyAgICByZXR1cm4gc3RyOworfQorCitzdGF0dXNfdCBBdWRpb1BhcmFtZXRlcjo6YWRkKGNvbnN0IFN0cmluZzgmIGtleSwgY29uc3QgU3RyaW5nOCYgdmFsdWUpCit7CisgICAgaWYgKG1QYXJhbWV0ZXJzLmluZGV4T2ZLZXkoa2V5KSA8IDApIHsKKyAgICAgICAgbVBhcmFtZXRlcnMuYWRkKGtleSwgdmFsdWUpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVBhcmFtZXRlcnMucmVwbGFjZVZhbHVlRm9yKGtleSwgdmFsdWUpOworICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BhcmFtZXRlcjo6YWRkS2V5KGNvbnN0IFN0cmluZzgmIGtleSkKK3sKKyAgICByZXR1cm4gYWRkKGtleSwgU3RyaW5nOCgpKTsKK30KKworc3RhdHVzX3QgQXVkaW9QYXJhbWV0ZXI6OmFkZEludChjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IGludCB2YWx1ZSkKK3sKKyAgICBjaGFyIHN0clsxMl07CisgICAgaWYgKHNucHJpbnRmKHN0ciwgMTIsICIlZCIsIHZhbHVlKSA+IDApIHsKKyAgICAgICAgU3RyaW5nOCBzdHI4ID0gU3RyaW5nOChzdHIpOworICAgICAgICByZXR1cm4gYWRkKGtleSwgc3RyOCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUGFyYW1ldGVyOjphZGRGbG9hdChjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IGZsb2F0IHZhbHVlKQoreworICAgIGNoYXIgc3RyWzIzXTsKKyAgICBpZiAoc25wcmludGYoc3RyLCAyMywgIiUuMTBmIiwgdmFsdWUpID4gMCkgeworICAgICAgICBTdHJpbmc4IHN0cjggPSBTdHJpbmc4KHN0cik7CisgICAgICAgIHJldHVybiBhZGQoa2V5LCBzdHI4KTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9QYXJhbWV0ZXI6OnJlbW92ZShjb25zdCBTdHJpbmc4JiBrZXkpCit7CisgICAgaWYgKG1QYXJhbWV0ZXJzLmluZGV4T2ZLZXkoa2V5KSA+PSAwKSB7CisgICAgICAgIG1QYXJhbWV0ZXJzLnJlbW92ZUl0ZW0oa2V5KTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BhcmFtZXRlcjo6Z2V0KGNvbnN0IFN0cmluZzgmIGtleSwgU3RyaW5nOCYgdmFsdWUpIGNvbnN0Cit7CisgICAgaWYgKG1QYXJhbWV0ZXJzLmluZGV4T2ZLZXkoa2V5KSA+PSAwKSB7CisgICAgICAgIHZhbHVlID0gbVBhcmFtZXRlcnMudmFsdWVGb3Ioa2V5KTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb1BhcmFtZXRlcjo6Z2V0SW50KGNvbnN0IFN0cmluZzgmIGtleSwgaW50JiB2YWx1ZSkgY29uc3QKK3sKKyAgICBTdHJpbmc4IHN0cjg7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0KGtleSwgc3RyOCk7CisgICAgdmFsdWUgPSAwOworICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaW50IHZhbDsKKyAgICAgICAgaWYgKHNzY2FuZihzdHI4LnN0cmluZygpLCAiJWQiLCAmdmFsKSA9PSAxKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHZhbDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IEF1ZGlvUGFyYW1ldGVyOjpnZXRGbG9hdChjb25zdCBTdHJpbmc4JiBrZXksIGZsb2F0JiB2YWx1ZSkgY29uc3QKK3sKKyAgICBTdHJpbmc4IHN0cjg7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gZ2V0KGtleSwgc3RyOCk7CisgICAgdmFsdWUgPSAwOworICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgZmxvYXQgdmFsOworICAgICAgICBpZiAoc3NjYW5mKHN0cjguc3RyaW5nKCksICIlZiIsICZ2YWwpID09IDEpIHsKKyAgICAgICAgICAgIHZhbHVlID0gdmFsOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzdWx0ID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdHVzX3QgQXVkaW9QYXJhbWV0ZXI6OmdldEF0KHNpemVfdCBpbmRleCwgU3RyaW5nOCYga2V5KSBjb25zdAoreworICAgIGlmIChtUGFyYW1ldGVycy5zaXplKCkgPiBpbmRleCkgeworICAgICAgICBrZXkgPSBtUGFyYW1ldGVycy5rZXlBdChpbmRleCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9QYXJhbWV0ZXI6OmdldEF0KHNpemVfdCBpbmRleCwgU3RyaW5nOCYga2V5LCBTdHJpbmc4JiB2YWx1ZSkgY29uc3QKK3sKKyAgICBpZiAobVBhcmFtZXRlcnMuc2l6ZSgpID4gaW5kZXgpIHsKKyAgICAgICAga2V5ID0gbVBhcmFtZXRlcnMua2V5QXQoaW5kZXgpOworICAgICAgICB2YWx1ZSA9IG1QYXJhbWV0ZXJzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhaGVscGVyL1R5cGVDb252ZXJ0ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvVHlwZUNvbnZlcnRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzEwMzIzNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhaGVscGVyL1R5cGVDb252ZXJ0ZXIuY3BwCkBAIC0wLDAgKzEsNDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisjZGVmaW5lIE1BS0VfU1RSSU5HX0ZST01fRU5VTShzdHJpbmcpIHsgI3N0cmluZywgc3RyaW5nIH0KKyNkZWZpbmUgVEVSTUlOQVRPUiB7IC5saXRlcmFsID0gbnVsbHB0ciB9CisKK3RlbXBsYXRlIDw+Citjb25zdCBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OlRhYmxlIE91dHB1dERldmljZUNvbnZlcnRlcjo6bVRhYmxlW10gPSB7CisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9OT05FKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08pLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT19DQVJLSVQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FMTF9TQ08pLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUwpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0hETUkpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfQUxMX1VTQiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9MSU5FKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfU1BESUYpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0ZNKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9BVVhfTElORSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfSVApLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0JVUyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfUFJPWFkpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VUKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9PVVRfRUNIT19DQU5DRUxMRVIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQpLAorICAgIC8vIFNUVUIgbXVzdCBiZSBhZnRlciBERUZBVUxULCBzbyB0aGUgbGF0dGVyIGlzIHBpY2tlZCB1cCBieSB0b1N0cmluZyBmaXJzdC4KKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX09VVF9TVFVCKSwKKyAgICBURVJNSU5BVE9SCit9OworCit0ZW1wbGF0ZSA8PgorY29uc3QgSW5wdXREZXZpY2VDb252ZXJ0ZXI6OlRhYmxlIElucHV0RGV2aWNlQ29udmVydGVyOjptVGFibGVbXSA9IHsKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX05PTkUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQ09NTVVOSUNBVElPTiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9BTUJJRU5UKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9BTExfU0NPKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQVVYX0RJR0lUQUwpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fSERNSSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9IRE1JX0FSQyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9CQUNLX01JQyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0FOTEdfRE9DS19IRUFEU0VUKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0RHVExfRE9DS19IRUFEU0VUKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1VTQl9BQ0NFU1NPUlkpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0RFVklDRV9JTl9BTExfVVNCKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0ZNX1RVTkVSKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1RWX1RVTkVSKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0xJTkUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fU1BESUYpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fTE9PUEJBQ0spLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fSVApLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fQlVTKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1BST1hZKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VUKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9CTEUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fRUNIT19SRUZFUkVOQ0UpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fREVGQVVMVCksCisgICAgLy8gU1RVQiBtdXN0IGJlIGFmdGVyIERFRkFVTFQsIHNvIHRoZSBsYXR0ZXIgaXMgcGlja2VkIHVwIGJ5IHRvU3RyaW5nIGZpcnN0LgorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19ERVZJQ0VfSU5fU1RVQiksCisgICAgVEVSTUlOQVRPUgorfTsKKworCit0ZW1wbGF0ZSA8PgorY29uc3QgT3V0cHV0RmxhZ0NvbnZlcnRlcjo6VGFibGUgT3V0cHV0RmxhZ0NvbnZlcnRlcjo6bVRhYmxlW10gPSB7CisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX05PTkUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX05PTl9CTE9DS0lORyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19UVFMpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19SQVcpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19TWU5DKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfSUVDOTU4X05PTkFVRElPKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUX1BDTSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fT1VUUFVUX0ZMQUdfSU5DQUxMX01VU0lDKSwKKyAgICBURVJNSU5BVE9SCit9OworCisKK3RlbXBsYXRlIDw+Citjb25zdCBJbnB1dEZsYWdDb252ZXJ0ZXI6OlRhYmxlIElucHV0RmxhZ0NvbnZlcnRlcjo6bVRhYmxlW10gPSB7CisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfTk9ORSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfRkFTVCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfSFdfSE9UV09SRCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0lOUFVUX0ZMQUdfUkFXKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19TWU5DKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19WT0lQX1RYKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19IV19BVl9TWU5DKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QpLAorICAgIFRFUk1JTkFUT1IKK307CisKKwordGVtcGxhdGUgPD4KK2NvbnN0IEZvcm1hdENvbnZlcnRlcjo6VGFibGUgRm9ybWF0Q29udmVydGVyOjptVGFibGVbXSA9IHsKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX1BDTV8xNl9CSVQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfUENNXzhfQklUKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX1BDTV8zMl9CSVQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfUENNXzhfMjRfQklUKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX1BDTV9GTE9BVCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9NUDMpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQU1SX05CKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FNUl9XQiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUMpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX01BSU4pLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0xDKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19TU1IpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0xUUCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfSEVfVjEpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX1NDQUxBQkxFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19FUkxDKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19MRCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfSEVfVjIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0VMRCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfWEhFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX01BSU4pLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfTEMpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0FEVFNfU1NSKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX0xUUCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19IRV9WMSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19TQ0FMQUJMRSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19FUkxDKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX0xEKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX0hFX1YyKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRFRTX0VMRCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUU19YSEUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfVk9SQklTKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0hFX0FBQ19WMSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9IRV9BQUNfVjIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfT1BVUyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQzMpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRV9BQzMpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRFRTKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0RUU19IRCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9JRUM2MTkzNyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9ET0xCWV9UUlVFSEQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRVZSQyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9FVlJDQiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9FVlJDV0IpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRVZSQ05XKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FBQ19BRElGKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX1dNQSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9XTUFfUFJPKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FNUl9XQl9QTFVTKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX01QMiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9RQ0VMUCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9EU0QpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfRkxBQyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BTEFDKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FQRSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BQUNfQURUUyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9TQkMpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQVBUWCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BUFRYX0hEKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0FDNCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9MREFDKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX01BVCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9FX0FDM19KT0MpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTUFUXzFfMCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9NQVRfMl8wKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX01BVF8yXzEpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0xBVE0pLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0xBVE1fTEMpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0xBVE1fSEVfVjEpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQUFDX0xBVE1fSEVfVjIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfQ0VMVCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BUFRYX0FEQVBUSVZFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRk9STUFUX0xIREMpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GT1JNQVRfTEhEQ19MTCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZPUk1BVF9BUFRYX1RXU1ApLAorICAgIFRFUk1JTkFUT1IKK307CisKKwordGVtcGxhdGUgPD4KK2NvbnN0IE91dHB1dENoYW5uZWxDb252ZXJ0ZXI6OlRhYmxlIE91dHB1dENoYW5uZWxDb252ZXJ0ZXI6Om1UYWJsZVtdID0geworICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9NT05PKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfMlBPSU5UMSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzJQT0lOVDBQT0lOVDIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfVFJJKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfVFJJX0JBQ0spLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfM1BPSU5UMFBPSU5UMiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzNQT0lOVDFQT0lOVDIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9RVUFEKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9CQUNLKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfUVVBRF9TSURFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfU1VSUk9VTkQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9QRU5UQSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX0JBQ0spLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF81UE9JTlQxX1NJREUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF81UE9JTlQxUE9JTlQyKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMVBPSU5UNCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzZQT0lOVDEpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF83UE9JTlQxKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMVBPSU5UMiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDFQT0lOVDQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9IQVBUSUNfQSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX01PTk9fSEFQVElDX0EpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9TVEVSRU9fSEFQVElDX0EpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9IQVBUSUNfQUIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX09VVF9NT05PX0hBUFRJQ19BQiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfT1VUX1NURVJFT19IQVBUSUNfQUIpLAorICAgIFRFUk1JTkFUT1IKK307CisKKwordGVtcGxhdGUgPD4KK2NvbnN0IElucHV0Q2hhbm5lbENvbnZlcnRlcjo6VGFibGUgSW5wdXRDaGFubmVsQ29udmVydGVyOjptVGFibGVbXSA9IHsKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9NT05PKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8pLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOX0ZST05UX0JBQ0spLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOXzYpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOXzJQT0lOVDBQT0lOVDIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOXzJQT0lOVDFQT0lOVDIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOXzNQT0lOVDBQT0lOVDIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOXzNQT0lOVDFQT0lOVDIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOXzVQT0lOVDEpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DSEFOTkVMX0lOX1ZPSUNFX1VQTElOS19NT05PKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9ETkxJTktfTU9OTyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NIQU5ORUxfSU5fVk9JQ0VfQ0FMTF9NT05PKSwKKyAgICBURVJNSU5BVE9SCit9OworCit0ZW1wbGF0ZSA8PgorY29uc3QgQ2hhbm5lbEluZGV4Q29udmVydGVyOjpUYWJsZSBDaGFubmVsSW5kZXhDb252ZXJ0ZXI6Om1UYWJsZVtdID0geworICAgIHsiQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEiLCBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzEpfSwKKyAgICB7IkFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yIiwgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS18yKX0sCisgICAgeyJBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMyIsIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihBVURJT19DSEFOTkVMX0lOREVYX01BU0tfMyl9LAorICAgIHsiQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzQiLCBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzQpfSwKKyAgICB7IkFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS181Iiwgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS181KX0sCisgICAgeyJBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNiIsIHN0YXRpY19jYXN0PGF1ZGlvX2NoYW5uZWxfbWFza190PihBVURJT19DSEFOTkVMX0lOREVYX01BU0tfNil9LAorICAgIHsiQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzciLCBzdGF0aWNfY2FzdDxhdWRpb19jaGFubmVsX21hc2tfdD4oQVVESU9fQ0hBTk5FTF9JTkRFWF9NQVNLXzcpfSwKKyAgICB7IkFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS184Iiwgc3RhdGljX2Nhc3Q8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+KEFVRElPX0NIQU5ORUxfSU5ERVhfTUFTS184KX0sCisgICAgVEVSTUlOQVRPUgorfTsKKworCit0ZW1wbGF0ZSA8PgorY29uc3QgR2Fpbk1vZGVDb252ZXJ0ZXI6OlRhYmxlIEdhaW5Nb2RlQ29udmVydGVyOjptVGFibGVbXSA9IHsKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fR0FJTl9NT0RFX0pPSU5UKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fR0FJTl9NT0RFX1JBTVApLAorICAgIFRFUk1JTkFUT1IKK307CisKKwordGVtcGxhdGUgPD4KK2NvbnN0IFN0cmVhbVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFN0cmVhbVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdID0geworICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fREVGQVVMVCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX1NZU1RFTSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9SSU5HKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX01VU0lDKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX0FMQVJNKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPICksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX0RUTUYpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fVFRTKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TVFJFQU1fQVNTSVNUQU5UKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU1RSRUFNX1JFUk9VVElORyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NUUkVBTV9QQVRDSCksCisgICAgVEVSTUlOQVRPUgorfTsKKwordGVtcGxhdGU8PgorY29uc3QgQXVkaW9Nb2RlQ29udmVydGVyOjpUYWJsZSBBdWRpb01vZGVDb252ZXJ0ZXI6Om1UYWJsZVtdID0geworICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19NT0RFX0lOVkFMSUQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19NT0RFX0NVUlJFTlQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19NT0RFX05PUk1BTCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX01PREVfUklOR1RPTkUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19NT0RFX0lOX0NBTEwpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19NT0RFX0lOX0NPTU1VTklDQVRJT04pLAorICAgIFRFUk1JTkFUT1IKK307CisKK3RlbXBsYXRlPD4KK2NvbnN0IEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6OlRhYmxlIEF1ZGlvQ29udGVudFR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdID0geworICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0gpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DT05URU5UX1RZUEVfTVVTSUMpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DT05URU5UX1RZUEVfTU9WSUUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OKSwKKyAgICBURVJNSU5BVE9SCit9OworCit0ZW1wbGF0ZSA8PgorY29uc3QgVXNhZ2VUeXBlQ29udmVydGVyOjpUYWJsZSBVc2FnZVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdID0geworICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9VTktOT1dOKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfTUVESUEpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfQUxBUk0pLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9OT1RJRklDQVRJT04pLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVCksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9ERUxBWUVEKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5UKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04pLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9HQU1FKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fVVNBR0VfVklSVFVBTF9TT1VSQ0UpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19VU0FHRV9BU1NJU1RBTlQpLAorICAgIFRFUk1JTkFUT1IKK307CisKK3RlbXBsYXRlIDw+Citjb25zdCBTb3VyY2VUeXBlQ29udmVydGVyOjpUYWJsZSBTb3VyY2VUeXBlQ29udmVydGVyOjptVGFibGVbXSA9IHsKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX0RFRkFVTFQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfTUlDKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX1ZPSUNFX1VQTElOSyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX0NBTUNPUkRFUiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVgpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0UpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfRk1fVFVORVIpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19TT1VSQ0VfSE9UV09SRCksCisgICAgVEVSTUlOQVRPUgorfTsKKwordGVtcGxhdGUgPD4KK2NvbnN0IEF1ZGlvRmxhZ0NvbnZlcnRlcjo6VGFibGUgQXVkaW9GbGFnQ29udmVydGVyOjptVGFibGVbXSA9IHsKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19OT05FKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19TRUNVUkUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX1NDTyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfQkVBQ09OKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19IV19BVl9TWU5DKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19IV19IT1RXT1JEKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19CWVBBU1NfSU5URVJSVVBUSU9OX1BPTElDWSksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfQllQQVNTX01VVEUpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX0xPV19MQVRFTkNZKSwKKyAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oQVVESU9fRkxBR19ERUVQX0JVRkZFUiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfTk9fTUVESUFfUFJPSkVDVElPTiksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKEFVRElPX0ZMQUdfTVVURV9IQVBUSUMpLAorICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShBVURJT19GTEFHX05PX1NZU1RFTV9DQVBUVVJFKSwKKyAgICBURVJNSU5BVE9SCit9OworCit0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPE91dHB1dERldmljZVRyYWl0cz47Cit0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPElucHV0RGV2aWNlVHJhaXRzPjsKK3RlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8T3V0cHV0RmxhZ1RyYWl0cz47Cit0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPElucHV0RmxhZ1RyYWl0cz47Cit0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPEZvcm1hdFRyYWl0cz47Cit0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPE91dHB1dENoYW5uZWxUcmFpdHM+OwordGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxJbnB1dENoYW5uZWxUcmFpdHM+OwordGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxDaGFubmVsSW5kZXhUcmFpdHM+OwordGVtcGxhdGUgY2xhc3MgVHlwZUNvbnZlcnRlcjxHYWluTW9kZVRyYWl0cz47Cit0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPFN0cmVhbVRyYWl0cz47Cit0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPEF1ZGlvTW9kZVRyYWl0cz47Cit0ZW1wbGF0ZSBjbGFzcyBUeXBlQ29udmVydGVyPFVzYWdlVHJhaXRzPjsKK3RlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8U291cmNlVHJhaXRzPjsKK3RlbXBsYXRlIGNsYXNzIFR5cGVDb252ZXJ0ZXI8QXVkaW9GbGFnVHJhaXRzPjsKKworYm9vbCBkZXZpY2VGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBsaXRlcmFsRGV2aWNlLCBhdWRpb19kZXZpY2VzX3QmIGRldmljZSkgeworICAgIHJldHVybiBJbnB1dERldmljZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhsaXRlcmFsRGV2aWNlLCBkZXZpY2UpIHx8CisgICAgICAgICAgICBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OmZyb21TdHJpbmcobGl0ZXJhbERldmljZSwgZGV2aWNlKTsKK30KKworU2FtcGxlUmF0ZVRyYWl0czo6Q29sbGVjdGlvbiBzYW1wbGluZ1JhdGVzRnJvbVN0cmluZygKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNhbXBsaW5nUmF0ZXMsIGNvbnN0IGNoYXIgKmRlbCkKK3sKKyAgICBTYW1wbGVSYXRlVHJhaXRzOjpDb2xsZWN0aW9uIHNhbXBsaW5nUmF0ZUNvbGxlY3Rpb247CisgICAgY29sbGVjdGlvbkZyb21TdHJpbmc8U2FtcGxlUmF0ZVRyYWl0cz4oc2FtcGxpbmdSYXRlcywgc2FtcGxpbmdSYXRlQ29sbGVjdGlvbiwgZGVsKTsKKyAgICByZXR1cm4gc2FtcGxpbmdSYXRlQ29sbGVjdGlvbjsKK30KKworRm9ybWF0VHJhaXRzOjpDb2xsZWN0aW9uIGZvcm1hdHNGcm9tU3RyaW5nKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZm9ybWF0cywgY29uc3QgY2hhciAqZGVsKQoreworICAgIEZvcm1hdFRyYWl0czo6Q29sbGVjdGlvbiBmb3JtYXRDb2xsZWN0aW9uOworICAgIEZvcm1hdENvbnZlcnRlcjo6Y29sbGVjdGlvbkZyb21TdHJpbmcoZm9ybWF0cywgZm9ybWF0Q29sbGVjdGlvbiwgZGVsKTsKKyAgICByZXR1cm4gZm9ybWF0Q29sbGVjdGlvbjsKK30KKworYXVkaW9fZm9ybWF0X3QgZm9ybWF0RnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmbGl0ZXJhbEZvcm1hdCwgYXVkaW9fZm9ybWF0X3QgZGVmYXVsdEZvcm1hdCkKK3sKKyAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQ7CisgICAgaWYgKGxpdGVyYWxGb3JtYXQuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gZGVmYXVsdEZvcm1hdDsKKyAgICB9CisgICAgRm9ybWF0Q29udmVydGVyOjpmcm9tU3RyaW5nKGxpdGVyYWxGb3JtYXQsIGZvcm1hdCk7CisgICAgcmV0dXJuIGZvcm1hdDsKK30KKworYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2tGcm9tU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZsaXRlcmFsQ2hhbm5lbHMpCit7CisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbHM7CisgICAgaWYgKCFPdXRwdXRDaGFubmVsQ29udmVydGVyOjpmcm9tU3RyaW5nKGxpdGVyYWxDaGFubmVscywgY2hhbm5lbHMpICYmCisgICAgICAgICAgICAhSW5wdXRDaGFubmVsQ29udmVydGVyOjpmcm9tU3RyaW5nKGxpdGVyYWxDaGFubmVscywgY2hhbm5lbHMpKSB7CisgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX0lOVkFMSUQ7CisgICAgfQorICAgIHJldHVybiBjaGFubmVsczsKK30KKworQ2hhbm5lbFRyYWl0czo6Q29sbGVjdGlvbiBjaGFubmVsTWFza3NGcm9tU3RyaW5nKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY2hhbm5lbHMsIGNvbnN0IGNoYXIgKmRlbCkKK3sKKyAgICBDaGFubmVsVHJhaXRzOjpDb2xsZWN0aW9uIGNoYW5uZWxNYXNrQ29sbGVjdGlvbjsKKyAgICBPdXRwdXRDaGFubmVsQ29udmVydGVyOjpjb2xsZWN0aW9uRnJvbVN0cmluZyhjaGFubmVscywgY2hhbm5lbE1hc2tDb2xsZWN0aW9uLCBkZWwpOworICAgIElucHV0Q2hhbm5lbENvbnZlcnRlcjo6Y29sbGVjdGlvbkZyb21TdHJpbmcoY2hhbm5lbHMsIGNoYW5uZWxNYXNrQ29sbGVjdGlvbiwgZGVsKTsKKyAgICBDaGFubmVsSW5kZXhDb252ZXJ0ZXI6OmNvbGxlY3Rpb25Gcm9tU3RyaW5nKGNoYW5uZWxzLCBjaGFubmVsTWFza0NvbGxlY3Rpb24sIGRlbCk7CisgICAgcmV0dXJuIGNoYW5uZWxNYXNrQ29sbGVjdGlvbjsKK30KKworSW5wdXRDaGFubmVsVHJhaXRzOjpDb2xsZWN0aW9uIGlucHV0Q2hhbm5lbE1hc2tzRnJvbVN0cmluZygKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmluQ2hhbm5lbHMsIGNvbnN0IGNoYXIgKmRlbCkKK3sKKyAgICBJbnB1dENoYW5uZWxUcmFpdHM6OkNvbGxlY3Rpb24gaW5wdXRDaGFubmVsTWFza0NvbGxlY3Rpb247CisgICAgSW5wdXRDaGFubmVsQ29udmVydGVyOjpjb2xsZWN0aW9uRnJvbVN0cmluZyhpbkNoYW5uZWxzLCBpbnB1dENoYW5uZWxNYXNrQ29sbGVjdGlvbiwgZGVsKTsKKyAgICBDaGFubmVsSW5kZXhDb252ZXJ0ZXI6OmNvbGxlY3Rpb25Gcm9tU3RyaW5nKGluQ2hhbm5lbHMsIGlucHV0Q2hhbm5lbE1hc2tDb2xsZWN0aW9uLCBkZWwpOworICAgIHJldHVybiBpbnB1dENoYW5uZWxNYXNrQ29sbGVjdGlvbjsKK30KKworT3V0cHV0Q2hhbm5lbFRyYWl0czo6Q29sbGVjdGlvbiBvdXRwdXRDaGFubmVsTWFza3NGcm9tU3RyaW5nKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmb3V0Q2hhbm5lbHMsIGNvbnN0IGNoYXIgKmRlbCkKK3sKKyAgICBPdXRwdXRDaGFubmVsVHJhaXRzOjpDb2xsZWN0aW9uIG91dHB1dENoYW5uZWxNYXNrQ29sbGVjdGlvbjsKKyAgICBPdXRwdXRDaGFubmVsQ29udmVydGVyOjpjb2xsZWN0aW9uRnJvbVN0cmluZyhvdXRDaGFubmVscywgb3V0cHV0Q2hhbm5lbE1hc2tDb2xsZWN0aW9uLCBkZWwpOworICAgIENoYW5uZWxJbmRleENvbnZlcnRlcjo6Y29sbGVjdGlvbkZyb21TdHJpbmcob3V0Q2hhbm5lbHMsIG91dHB1dENoYW5uZWxNYXNrQ29sbGVjdGlvbiwgZGVsKTsKKyAgICByZXR1cm4gb3V0cHV0Q2hhbm5lbE1hc2tDb2xsZWN0aW9uOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFoZWxwZXIvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oIGIvbWVkaWEvbGlibWVkaWFoZWxwZXIvaW5jbHVkZS9tZWRpYS9BdWRpb1BhcmFtZXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMTkwZjIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWhlbHBlci9pbmNsdWRlL21lZGlhL0F1ZGlvUGFyYW1ldGVyLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDgtMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9BVURJT1BBUkFNRVRFUl9IXworI2RlZmluZSBBTkRST0lEX0FVRElPUEFSQU1FVEVSX0hfCisKKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBdWRpb1BhcmFtZXRlciB7CisKK3B1YmxpYzoKKyAgICBBdWRpb1BhcmFtZXRlcigpIHt9CisgICAgQXVkaW9QYXJhbWV0ZXIoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CisgICAgdmlydHVhbCB+QXVkaW9QYXJhbWV0ZXIoKTsKKworICAgIC8vIHJlc2VydmVkIHBhcmFtZXRlciBrZXlzIGZvciBjaGFuZ2luZyBzdGFuZGFyZCBwYXJhbWV0ZXJzIHdpdGggc2V0UGFyYW1ldGVycygpIGZ1bmN0aW9uLgorICAgIC8vIFVzaW5nIHRoZXNlIGtleXMgaXMgbWFuZGF0b3J5IGZvciBBdWRpb0ZsaW5nZXIgdG8gcHJvcGVybHkgbW9uaXRvciBhdWRpbyBvdXRwdXQvaW5wdXQKKyAgICAvLyBjb25maWd1cmF0aW9uIGNoYW5nZXMgYW5kIGFjdCBhY2NvcmRpbmdseS4KKyAgICAvLyAga2V5Um91dGluZzogdG8gY2hhbmdlIGF1ZGlvIHJvdXRpbmcsIHZhbHVlIGlzIGFuIGludCBpbiBhdWRpb19kZXZpY2VzX3QKKyAgICAvLyAga2V5U2FtcGxpbmdSYXRlOiB0byBjaGFuZ2Ugc2FtcGxpbmcgcmF0ZSByb3V0aW5nLCB2YWx1ZSBpcyBhbiBpbnQKKyAgICAvLyAga2V5Rm9ybWF0OiB0byBjaGFuZ2UgYXVkaW8gZm9ybWF0LCB2YWx1ZSBpcyBhbiBpbnQgaW4gYXVkaW9fZm9ybWF0X3QKKyAgICAvLyAga2V5Q2hhbm5lbHM6IHRvIGNoYW5nZSBhdWRpbyBjaGFubmVsIGNvbmZpZ3VyYXRpb24sIHZhbHVlIGlzIGFuIGludCBpbiBhdWRpb19jaGFubmVsc190CisgICAgLy8gIGtleUZyYW1lQ291bnQ6IHRvIGNoYW5nZSBhdWRpbyBvdXRwdXQgZnJhbWUgY291bnQsIHZhbHVlIGlzIGFuIGludAorICAgIC8vICBrZXlJbnB1dFNvdXJjZTogdG8gY2hhbmdlIGF1ZGlvIGlucHV0IHNvdXJjZSwgdmFsdWUgaXMgYW4gaW50IGluIGF1ZGlvX3NvdXJjZV90CisgICAgLy8gICAgIChkZWZpbmVkIGluIG1lZGlhL21lZGlhcmVjb3JkZXIuaCkKKyAgICAvLyAga2V5U2NyZWVuU3RhdGU6IGVpdGhlciAib24iIG9yICJvZmYiCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlSb3V0aW5nOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5U2FtcGxpbmdSYXRlOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5Rm9ybWF0OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5Q2hhbm5lbHM7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlGcmFtZUNvdW50OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5SW5wdXRTb3VyY2U7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlTY3JlZW5TdGF0ZTsKKworICAgIC8vICBrZXlCdE5yZWM6IEJUIFNDTyBOb2lzZSBSZWR1Y3Rpb24gKyBFY2hvIENhbmNlbGxhdGlvbiBwYXJhbWV0ZXJzCisgICAgLy8gIGtleUh3QXZTeW5jOiBnZXQgSFcgc3luY2hyb25pemF0aW9uIHNvdXJjZSBpZGVudGlmaWVyIGZyb20gYSBkZXZpY2UKKyAgICAvLyAga2V5TW9ub091dHB1dDogRW5hYmxlIG1vbm8gYXVkaW8gcGxheWJhY2sKKyAgICAvLyAga2V5U3RyZWFtSHdBdlN5bmM6IHNldCBIVyBzeW5jaHJvbml6YXRpb24gc291cmNlIGlkZW50aWZpZXIgb24gYSBzdHJlYW0KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleUJ0TnJlYzsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleUh3QXZTeW5jOworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5TW9ub091dHB1dDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVN0cmVhbUh3QXZTeW5jOworCisgICAgLy8gIGtleXMgZm9yIHByZXNlbnRhdGlvbiBzZWxlY3Rpb24KKyAgICAvLyAga2V5UHJlc2VudGF0aW9uSWQ6IEF1ZGlvIHByZXNlbnRhdGlvbiBpZGVudGlmaWVyCisgICAgLy8gIGtleVByb2dyYW1JZDogQXVkaW8gcHJlc2VudGF0aW9uIHByb2dyYW0gaWRlbnRpZmllcgorICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5UHJlc2VudGF0aW9uSWQ7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlQcm9ncmFtSWQ7CisKKyAgICAvLyAga2V5QXVkaW9MYW5ndWFnZVByZWZlcnJlZDogUHJlZmVycmVkIGF1ZGlvIGxhbmd1YWdlCisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlBdWRpb0xhbmd1YWdlUHJlZmVycmVkOworCisgICAgLy8gIGtleURldmljZUNvbm5lY3QgLyBEaXNjb25uZWN0OiB2YWx1ZSBpcyBhbiBpbnQgaW4gYXVkaW9fZGV2aWNlc190CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlEZXZpY2VDb25uZWN0OworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5RGV2aWNlRGlzY29ubmVjdDsKKyAgICAvLyAgTmVlZCB0byBiZSBoZXJlIGJlY2F1c2UgdmVuZG9ycyBzdGlsbCB1c2UgdGhlbS4KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVN0cmVhbUNvbm5lY3Q7ICAvLyBEZXByZWNhdGVkOiBETyBOT1QgVVNFLgorICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga2V5U3RyZWFtRGlzY29ubmVjdDsgIC8vIERlcHJlY2F0ZWQ6IERPIE5PVCBVU0UuCisKKyAgICAvLyBGb3IgcXVlcnlpbmcgc3RyZWFtIGNhcGFiaWxpdGllcy4gQWxsIHRoZSByZXR1cm5lZCB2YWx1ZXMgYXJlIGxpc3RzLgorICAgIC8vICAga2V5U3RyZWFtU3VwcG9ydGVkRm9ybWF0czogYXVkaW9fZm9ybWF0X3QKKyAgICAvLyAgIGtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzOiBhdWRpb19jaGFubmVsX21hc2tfdAorICAgIC8vICAga2V5U3RyZWFtU3VwcG9ydGVkU2FtcGxpbmdSYXRlczogc2FtcGxpbmcgcmF0ZSB2YWx1ZXMKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVN0cmVhbVN1cHBvcnRlZEZvcm1hdHM7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVsczsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXM7CisKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IHZhbHVlT247CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCB2YWx1ZU9mZjsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3QgdmFsdWVMaXN0U2VwYXJhdG9yOworCisgICAgLy8ga2V5UmVjb25maWdBMmRwOiBBc2sgSHdNb2R1bGUgdG8gcmVjb25maWd1cmUgQTJEUCBvZmZsb2FkZWQgY29kZWMKKyAgICAvLyBrZXlSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQ6IFF1ZXJ5IGlmIEh3TW9kdWxlIHN1cHBvcnRzIEEyRFAgb2ZmbG9hZCBjb2RlYyBjb25maWcKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVJlY29uZmlnQTJkcDsKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtleVJlY29uZmlnQTJkcFN1cHBvcnRlZDsKKworICAgIFN0cmluZzggdG9TdHJpbmcoKSBjb25zdCB7IHJldHVybiB0b1N0cmluZ0ltcGwodHJ1ZSk7IH0KKyAgICBTdHJpbmc4IGtleXNUb1N0cmluZygpIGNvbnN0IHsgcmV0dXJuIHRvU3RyaW5nSW1wbChmYWxzZSk7IH0KKworICAgIHN0YXR1c190IGFkZChjb25zdCBTdHJpbmc4JiBrZXksIGNvbnN0IFN0cmluZzgmIHZhbHVlKTsKKyAgICBzdGF0dXNfdCBhZGRJbnQoY29uc3QgU3RyaW5nOCYga2V5LCBjb25zdCBpbnQgdmFsdWUpOworICAgIHN0YXR1c190IGFkZEtleShjb25zdCBTdHJpbmc4JiBrZXkpOworICAgIHN0YXR1c190IGFkZEZsb2F0KGNvbnN0IFN0cmluZzgmIGtleSwgY29uc3QgZmxvYXQgdmFsdWUpOworCisgICAgc3RhdHVzX3QgcmVtb3ZlKGNvbnN0IFN0cmluZzgmIGtleSk7CisKKyAgICBzdGF0dXNfdCBnZXQoY29uc3QgU3RyaW5nOCYga2V5LCBTdHJpbmc4JiB2YWx1ZSkgY29uc3Q7CisgICAgc3RhdHVzX3QgZ2V0SW50KGNvbnN0IFN0cmluZzgmIGtleSwgaW50JiB2YWx1ZSkgY29uc3Q7CisgICAgc3RhdHVzX3QgZ2V0RmxvYXQoY29uc3QgU3RyaW5nOCYga2V5LCBmbG9hdCYgdmFsdWUpIGNvbnN0OworICAgIHN0YXR1c190IGdldEF0KHNpemVfdCBpbmRleCwgU3RyaW5nOCYga2V5KSBjb25zdDsKKyAgICBzdGF0dXNfdCBnZXRBdChzaXplX3QgaW5kZXgsIFN0cmluZzgmIGtleSwgU3RyaW5nOCYgdmFsdWUpIGNvbnN0OworCisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBtUGFyYW1ldGVycy5zaXplKCk7IH0KKworcHJpdmF0ZToKKyAgICBTdHJpbmc4IG1LZXlWYWx1ZVBhaXJzOworICAgIEtleWVkVmVjdG9yIDxTdHJpbmc4LCBTdHJpbmc4PiBtUGFyYW1ldGVyczsKKworICAgIFN0cmluZzggdG9TdHJpbmdJbXBsKGJvb2wgdXNlVmFsdWVzKSBjb25zdDsKK307CisKK307ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8qQU5EUk9JRF9BVURJT1BBUkFNRVRFUl9IXyovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWhlbHBlci9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaCBiL21lZGlhL2xpYm1lZGlhaGVscGVyL2luY2x1ZGUvbWVkaWEvVHlwZUNvbnZlcnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxMTQ5OGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYWhlbHBlci9pbmNsdWRlL21lZGlhL1R5cGVDb252ZXJ0ZXIuaApAQCAtMCwwICsxLDMxMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9UWVBFX0NPTlZFUlRFUl9IXworI2RlZmluZSBBTkRST0lEX1RZUEVfQ09OVkVSVEVSX0hfCisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KKyNpbmNsdWRlICJjb252ZXJ0LmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgRGVmYXVsdFRyYWl0cworeworICAgIHR5cGVkZWYgVCBUeXBlOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKKyAgICBzdGF0aWMgdm9pZCBhZGQoQ29sbGVjdGlvbiAmY29sbGVjdGlvbiwgVHlwZSB2YWx1ZSkKKyAgICB7CisgICAgICAgIGNvbGxlY3Rpb24ucHVzaF9iYWNrKHZhbHVlKTsKKyAgICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU29ydGVkVmVjdG9yVHJhaXRzCit7CisgICAgdHlwZWRlZiBUIFR5cGU7CisgICAgdHlwZWRlZiBTb3J0ZWRWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKKyAgICBzdGF0aWMgdm9pZCBhZGQoQ29sbGVjdGlvbiAmY29sbGVjdGlvbiwgVHlwZSB2YWx1ZSkKKyAgICB7CisgICAgICAgIGNvbGxlY3Rpb24uYWRkKHZhbHVlKTsKKyAgICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgU2V0VHJhaXRzCit7CisgICAgdHlwZWRlZiBUIFR5cGU7CisgICAgdHlwZWRlZiBzdGQ6OnNldDxUeXBlPiBDb2xsZWN0aW9uOworICAgIHN0YXRpYyB2b2lkIGFkZChDb2xsZWN0aW9uICZjb2xsZWN0aW9uLCBUeXBlIHZhbHVlKQorICAgIHsKKyAgICAgICAgY29sbGVjdGlvbi5pbnNlcnQodmFsdWUpOworICAgIH0KK307CisKK3VzaW5nIFNhbXBsZVJhdGVUcmFpdHMgPSBTZXRUcmFpdHM8dWludDMyX3Q+OwordXNpbmcgRGV2aWNlVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb19kZXZpY2VzX3Q+Oworc3RydWN0IE91dHB1dERldmljZVRyYWl0cyA6IHB1YmxpYyBEZXZpY2VUcmFpdHMge307CitzdHJ1Y3QgSW5wdXREZXZpY2VUcmFpdHMgOiBwdWJsaWMgRGV2aWNlVHJhaXRzIHt9OwordXNpbmcgQ2hhbm5lbFRyYWl0cyA9IFNldFRyYWl0czxhdWRpb19jaGFubmVsX21hc2tfdD47CitzdHJ1Y3QgT3V0cHV0Q2hhbm5lbFRyYWl0cyA6IHB1YmxpYyBDaGFubmVsVHJhaXRzIHt9Oworc3RydWN0IElucHV0Q2hhbm5lbFRyYWl0cyA6IHB1YmxpYyBDaGFubmVsVHJhaXRzIHt9Oworc3RydWN0IENoYW5uZWxJbmRleFRyYWl0cyA6IHB1YmxpYyBDaGFubmVsVHJhaXRzIHt9OwordXNpbmcgSW5wdXRGbGFnVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb19pbnB1dF9mbGFnc190PjsKK3VzaW5nIE91dHB1dEZsYWdUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX291dHB1dF9mbGFnc190PjsKK3VzaW5nIEZvcm1hdFRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fZm9ybWF0X3Q+OwordXNpbmcgR2Fpbk1vZGVUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX2dhaW5fbW9kZV90PjsKK3VzaW5nIFN0cmVhbVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fc3RyZWFtX3R5cGVfdD47Cit1c2luZyBBdWRpb01vZGVUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX21vZGVfdD47Cit1c2luZyBBdWRpb0NvbnRlbnRUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGF1ZGlvX2NvbnRlbnRfdHlwZV90PjsKK3VzaW5nIFVzYWdlVHJhaXRzID0gRGVmYXVsdFRyYWl0czxhdWRpb191c2FnZV90PjsKK3VzaW5nIFNvdXJjZVRyYWl0cyA9IERlZmF1bHRUcmFpdHM8YXVkaW9fc291cmNlX3Q+Oworc3RydWN0IEF1ZGlvRmxhZ1RyYWl0cyA6IHB1YmxpYyBEZWZhdWx0VHJhaXRzPGF1ZGlvX2ZsYWdzX21hc2tfdD4ge307CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFpdHM+CitzdGF0aWMgdm9pZCBjb2xsZWN0aW9uRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCB0eXBlbmFtZSBUcmFpdHM6OkNvbGxlY3Rpb24gJmNvbGxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZWwgPSBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKQoreworICAgIGNoYXIgKmxpdGVyYWwgPSBzdHJkdXAoc3RyLmNfc3RyKCkpOworICAgIGZvciAoY29uc3QgY2hhciAqY3N0ciA9IHN0cnRvayhsaXRlcmFsLCBkZWwpOyBjc3RyICE9IE5VTEw7IGNzdHIgPSBzdHJ0b2soTlVMTCwgZGVsKSkgeworICAgICAgICB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgdmFsdWU7CisgICAgICAgIGlmICh1dGlsaXRpZXM6OmNvbnZlcnRUbzxzdGQ6OnN0cmluZywgdHlwZW5hbWUgVHJhaXRzOjpUeXBlID4oY3N0ciwgdmFsdWUpKSB7CisgICAgICAgICAgICBUcmFpdHM6OmFkZChjb2xsZWN0aW9uLCB2YWx1ZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZnJlZShsaXRlcmFsKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYWl0cz4KK2NsYXNzIFR5cGVDb252ZXJ0ZXIKK3sKK3B1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCB0b1N0cmluZyhjb25zdCB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgJnZhbHVlLCBzdGQ6OnN0cmluZyAmc3RyKTsKKworICAgIHN0YXRpYyBib29sIGZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwgdHlwZW5hbWUgVHJhaXRzOjpUeXBlICZyZXN1bHQpOworCisgICAgc3RhdGljIHZvaWQgY29sbGVjdGlvbkZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJnN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBUcmFpdHM6OkNvbGxlY3Rpb24gJmNvbGxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGVsID0gQXVkaW9QYXJhbWV0ZXI6OnZhbHVlTGlzdFNlcGFyYXRvcik7CisKKyAgICBzdGF0aWMgdWludDMyX3QgbWFza0Zyb21TdHJpbmcoCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBjb25zdCBjaGFyICpkZWwgPSBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKTsKKworICAgIHN0YXRpYyB2b2lkIG1hc2tUb1N0cmluZygKKyAgICAgICAgICAgIHVpbnQzMl90IG1hc2ssIHN0ZDo6c3RyaW5nICZzdHIsIGNvbnN0IGNoYXIgKmRlbCA9IEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IpOworCitwcm90ZWN0ZWQ6CisgICAgc3RydWN0IFRhYmxlIHsKKyAgICAgICAgY29uc3QgY2hhciAqbGl0ZXJhbDsKKyAgICAgICAgdHlwZW5hbWUgVHJhaXRzOjpUeXBlIHZhbHVlOworICAgIH07CisKKyAgICBzdGF0aWMgY29uc3QgVGFibGUgbVRhYmxlW107Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXRzPgoraW5saW5lIGJvb2wgVHlwZUNvbnZlcnRlcjxUcmFpdHM+Ojp0b1N0cmluZyhjb25zdCB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgJnZhbHVlLCBzdGQ6OnN0cmluZyAmc3RyKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBtVGFibGVbaV0ubGl0ZXJhbDsgaSsrKSB7CisgICAgICAgIGlmIChtVGFibGVbaV0udmFsdWUgPT0gdmFsdWUpIHsKKyAgICAgICAgICAgIHN0ciA9IG1UYWJsZVtpXS5saXRlcmFsOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgY2hhciByZXN1bHRbNjRdOworICAgIHNucHJpbnRmKHJlc3VsdCwgc2l6ZW9mKHJlc3VsdCksICJVbmtub3duIGVudW0gdmFsdWUgJWQiLCB2YWx1ZSk7CisgICAgc3RyID0gcmVzdWx0OworICAgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYWl0cz4KK2lubGluZSBib29sIFR5cGVDb252ZXJ0ZXI8VHJhaXRzPjo6ZnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgJnJlc3VsdCkKK3sKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgbVRhYmxlW2ldLmxpdGVyYWw7IGkrKykgeworICAgICAgICBpZiAoc3RyY21wKG1UYWJsZVtpXS5saXRlcmFsLCBzdHIuY19zdHIoKSkgPT0gMCkgeworICAgICAgICAgICAgQUxPR1YoInN0cmluZ1RvRW51bSgpIGZvdW5kICVzIiwgbVRhYmxlW2ldLmxpdGVyYWwpOworICAgICAgICAgICAgcmVzdWx0ID0gbVRhYmxlW2ldLnZhbHVlOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXRzPgoraW5saW5lIHZvaWQgVHlwZUNvbnZlcnRlcjxUcmFpdHM+Ojpjb2xsZWN0aW9uRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3RyLAorICAgICAgICB0eXBlbmFtZSBUcmFpdHM6OkNvbGxlY3Rpb24gJmNvbGxlY3Rpb24sCisgICAgICAgIGNvbnN0IGNoYXIgKmRlbCkKK3sKKyAgICBjaGFyICpsaXRlcmFsID0gc3RyZHVwKHN0ci5jX3N0cigpKTsKKworICAgIGZvciAoY29uc3QgY2hhciAqY3N0ciA9IHN0cnRvayhsaXRlcmFsLCBkZWwpOyBjc3RyICE9IE5VTEw7IGNzdHIgPSBzdHJ0b2soTlVMTCwgZGVsKSkgeworICAgICAgICB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgdmFsdWU7CisgICAgICAgIGlmIChmcm9tU3RyaW5nKGNzdHIsIHZhbHVlKSkgeworICAgICAgICAgICAgVHJhaXRzOjphZGQoY29sbGVjdGlvbiwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorICAgIGZyZWUobGl0ZXJhbCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFpdHM+CitpbmxpbmUgdWludDMyX3QgVHlwZUNvbnZlcnRlcjxUcmFpdHM+OjptYXNrRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBjb25zdCBjaGFyICpkZWwpCit7CisgICAgY2hhciAqbGl0ZXJhbCA9IHN0cmR1cChzdHIuY19zdHIoKSk7CisgICAgdWludDMyX3QgdmFsdWUgPSAwOworICAgIGZvciAoY29uc3QgY2hhciAqY3N0ciA9IHN0cnRvayhsaXRlcmFsLCBkZWwpOyBjc3RyICE9IE5VTEw7IGNzdHIgPSBzdHJ0b2soTlVMTCwgZGVsKSkgeworICAgICAgICB0eXBlbmFtZSBUcmFpdHM6OlR5cGUgdHlwZTsKKyAgICAgICAgaWYgKGZyb21TdHJpbmcoY3N0ciwgdHlwZSkpIHsKKyAgICAgICAgICAgIHZhbHVlIHw9IHN0YXRpY19jYXN0PHVpbnQzMl90Pih0eXBlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmcmVlKGxpdGVyYWwpOworICAgIHJldHVybiB2YWx1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyYWl0cz4KK2lubGluZSB2b2lkIFR5cGVDb252ZXJ0ZXI8VHJhaXRzPjo6bWFza1RvU3RyaW5nKHVpbnQzMl90IG1hc2ssIHN0ZDo6c3RyaW5nICZzdHIsIGNvbnN0IGNoYXIgKmRlbCkKK3sKKyAgICBpZiAobWFzayAhPSAwKSB7CisgICAgICAgIGJvb2wgZmlyc3RfZmxhZyA9IHRydWU7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBtVGFibGVbaV0ubGl0ZXJhbDsgaSsrKSB7CisgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihtVGFibGVbaV0udmFsdWUpOworICAgICAgICAgICAgaWYgKG1UYWJsZVtpXS52YWx1ZSAhPSAwICYmICgobWFzayAmIHZhbHVlKSA9PSB2YWx1ZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWZpcnN0X2ZsYWcpIHN0ciArPSBkZWw7CisgICAgICAgICAgICAgICAgZmlyc3RfZmxhZyA9IGZhbHNlOworICAgICAgICAgICAgICAgIHN0ciArPSBtVGFibGVbaV0ubGl0ZXJhbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHRvU3RyaW5nKHN0YXRpY19jYXN0PHR5cGVuYW1lIFRyYWl0czo6VHlwZT4oMCksIHN0cik7CisgICAgfQorfQorCit0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8T3V0cHV0RGV2aWNlVHJhaXRzPiBPdXRwdXREZXZpY2VDb252ZXJ0ZXI7Cit0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8SW5wdXREZXZpY2VUcmFpdHM+IElucHV0RGV2aWNlQ29udmVydGVyOwordHlwZWRlZiBUeXBlQ29udmVydGVyPE91dHB1dEZsYWdUcmFpdHM+IE91dHB1dEZsYWdDb252ZXJ0ZXI7Cit0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8SW5wdXRGbGFnVHJhaXRzPiBJbnB1dEZsYWdDb252ZXJ0ZXI7Cit0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8Rm9ybWF0VHJhaXRzPiBGb3JtYXRDb252ZXJ0ZXI7Cit0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8T3V0cHV0Q2hhbm5lbFRyYWl0cz4gT3V0cHV0Q2hhbm5lbENvbnZlcnRlcjsKK3R5cGVkZWYgVHlwZUNvbnZlcnRlcjxJbnB1dENoYW5uZWxUcmFpdHM+IElucHV0Q2hhbm5lbENvbnZlcnRlcjsKK3R5cGVkZWYgVHlwZUNvbnZlcnRlcjxDaGFubmVsSW5kZXhUcmFpdHM+IENoYW5uZWxJbmRleENvbnZlcnRlcjsKK3R5cGVkZWYgVHlwZUNvbnZlcnRlcjxHYWluTW9kZVRyYWl0cz4gR2Fpbk1vZGVDb252ZXJ0ZXI7Cit0eXBlZGVmIFR5cGVDb252ZXJ0ZXI8U3RyZWFtVHJhaXRzPiBTdHJlYW1UeXBlQ29udmVydGVyOwordHlwZWRlZiBUeXBlQ29udmVydGVyPEF1ZGlvTW9kZVRyYWl0cz4gQXVkaW9Nb2RlQ29udmVydGVyOwordHlwZWRlZiBUeXBlQ29udmVydGVyPEF1ZGlvQ29udGVudFRyYWl0cz4gQXVkaW9Db250ZW50VHlwZUNvbnZlcnRlcjsKK3R5cGVkZWYgVHlwZUNvbnZlcnRlcjxVc2FnZVRyYWl0cz4gVXNhZ2VUeXBlQ29udmVydGVyOwordHlwZWRlZiBUeXBlQ29udmVydGVyPFNvdXJjZVRyYWl0cz4gU291cmNlVHlwZUNvbnZlcnRlcjsKK3R5cGVkZWYgVHlwZUNvbnZlcnRlcjxBdWRpb0ZsYWdUcmFpdHM+IEF1ZGlvRmxhZ0NvbnZlcnRlcjsKKwordGVtcGxhdGU8PiBjb25zdCBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6OlRhYmxlIE91dHB1dERldmljZUNvbnZlcnRlcjo6bVRhYmxlW107Cit0ZW1wbGF0ZTw+IGNvbnN0IElucHV0RGV2aWNlQ29udmVydGVyOjpUYWJsZSBJbnB1dERldmljZUNvbnZlcnRlcjo6bVRhYmxlW107Cit0ZW1wbGF0ZTw+IGNvbnN0IE91dHB1dEZsYWdDb252ZXJ0ZXI6OlRhYmxlIE91dHB1dEZsYWdDb252ZXJ0ZXI6Om1UYWJsZVtdOwordGVtcGxhdGU8PiBjb25zdCBJbnB1dEZsYWdDb252ZXJ0ZXI6OlRhYmxlIElucHV0RmxhZ0NvbnZlcnRlcjo6bVRhYmxlW107Cit0ZW1wbGF0ZTw+IGNvbnN0IEZvcm1hdENvbnZlcnRlcjo6VGFibGUgRm9ybWF0Q29udmVydGVyOjptVGFibGVbXTsKK3RlbXBsYXRlPD4gY29uc3QgT3V0cHV0Q2hhbm5lbENvbnZlcnRlcjo6VGFibGUgT3V0cHV0Q2hhbm5lbENvbnZlcnRlcjo6bVRhYmxlW107Cit0ZW1wbGF0ZTw+IGNvbnN0IElucHV0Q2hhbm5lbENvbnZlcnRlcjo6VGFibGUgSW5wdXRDaGFubmVsQ29udmVydGVyOjptVGFibGVbXTsKK3RlbXBsYXRlPD4gY29uc3QgQ2hhbm5lbEluZGV4Q29udmVydGVyOjpUYWJsZSBDaGFubmVsSW5kZXhDb252ZXJ0ZXI6Om1UYWJsZVtdOwordGVtcGxhdGU8PiBjb25zdCBHYWluTW9kZUNvbnZlcnRlcjo6VGFibGUgR2Fpbk1vZGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwordGVtcGxhdGU8PiBjb25zdCBTdHJlYW1UeXBlQ29udmVydGVyOjpUYWJsZSBTdHJlYW1UeXBlQ29udmVydGVyOjptVGFibGVbXTsKK3RlbXBsYXRlPD4gY29uc3QgQXVkaW9Nb2RlQ29udmVydGVyOjpUYWJsZSBBdWRpb01vZGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwordGVtcGxhdGU8PiBjb25zdCBBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOjpUYWJsZSBBdWRpb0NvbnRlbnRUeXBlQ29udmVydGVyOjptVGFibGVbXTsKK3RlbXBsYXRlPD4gY29uc3QgVXNhZ2VUeXBlQ29udmVydGVyOjpUYWJsZSBVc2FnZVR5cGVDb252ZXJ0ZXI6Om1UYWJsZVtdOwordGVtcGxhdGU8PiBjb25zdCBTb3VyY2VUeXBlQ29udmVydGVyOjpUYWJsZSBTb3VyY2VUeXBlQ29udmVydGVyOjptVGFibGVbXTsKK3RlbXBsYXRlPD4gY29uc3QgQXVkaW9GbGFnQ29udmVydGVyOjpUYWJsZSBBdWRpb0ZsYWdDb252ZXJ0ZXI6Om1UYWJsZVtdOworCitib29sIGRldmljZUZyb21TdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGxpdGVyYWxEZXZpY2UsIGF1ZGlvX2RldmljZXNfdCYgZGV2aWNlKTsKKworU2FtcGxlUmF0ZVRyYWl0czo6Q29sbGVjdGlvbiBzYW1wbGluZ1JhdGVzRnJvbVN0cmluZygKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNhbXBsaW5nUmF0ZXMsIGNvbnN0IGNoYXIgKmRlbCA9IEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IpOworCitGb3JtYXRUcmFpdHM6OkNvbGxlY3Rpb24gZm9ybWF0c0Zyb21TdHJpbmcoCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmb3JtYXRzLCBjb25zdCBjaGFyICpkZWwgPSBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKTsKKworYXVkaW9fZm9ybWF0X3QgZm9ybWF0RnJvbVN0cmluZygKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmxpdGVyYWxGb3JtYXQsIGF1ZGlvX2Zvcm1hdF90IGRlZmF1bHRGb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVCk7CisKK2F1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrRnJvbVN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmbGl0ZXJhbENoYW5uZWxzKTsKKworQ2hhbm5lbFRyYWl0czo6Q29sbGVjdGlvbiBjaGFubmVsTWFza3NGcm9tU3RyaW5nKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY2hhbm5lbHMsIGNvbnN0IGNoYXIgKmRlbCA9IEF1ZGlvUGFyYW1ldGVyOjp2YWx1ZUxpc3RTZXBhcmF0b3IpOworCitJbnB1dENoYW5uZWxUcmFpdHM6OkNvbGxlY3Rpb24gaW5wdXRDaGFubmVsTWFza3NGcm9tU3RyaW5nKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaW5DaGFubmVscywgY29uc3QgY2hhciAqZGVsID0gQXVkaW9QYXJhbWV0ZXI6OnZhbHVlTGlzdFNlcGFyYXRvcik7CisKK091dHB1dENoYW5uZWxUcmFpdHM6OkNvbGxlY3Rpb24gb3V0cHV0Q2hhbm5lbE1hc2tzRnJvbVN0cmluZygKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm91dENoYW5uZWxzLCBjb25zdCBjaGFyICpkZWwgPSBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKTsKKworLy8gY291bnRpbmcgZW51bWVyYXRpb25zCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjplbmFibGVfaWZfdDxzdGQ6OmlzX3NhbWU8VCwgYXVkaW9fY29udGVudF90eXBlX3Q+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPFQsIGF1ZGlvX21vZGVfdD46OnZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBzdGQ6OmlzX3NhbWU8VCwgYXVkaW9fc291cmNlX3Q+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPFQsIGF1ZGlvX3N0cmVhbV90eXBlX3Q+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPFQsIGF1ZGlvX3VzYWdlX3Q+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPFQsIGF1ZGlvX2Zvcm1hdF90Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgaW50PiA9IDA+CitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IFQmIHZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICByZXR1cm4gVHlwZUNvbnZlcnRlcjxEZWZhdWx0VHJhaXRzPFQ+Pjo6dG9TdHJpbmcodmFsdWUsIHJlc3VsdCkKKyAgICAgICAgICAgID8gcmVzdWx0IDogc3RkOjp0b19zdHJpbmcoc3RhdGljX2Nhc3Q8aW50Pih2YWx1ZSkpOworCit9CisKKy8vIGZsYWcgZW51bWVyYXRpb25zCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjplbmFibGVfaWZfdDxzdGQ6OmlzX3NhbWU8VCwgYXVkaW9fZ2Fpbl9tb2RlX3Q+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPFQsIGF1ZGlvX2lucHV0X2ZsYWdzX3Q+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgc3RkOjppc19zYW1lPFQsIGF1ZGlvX291dHB1dF9mbGFnc190Pjo6dmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgaW50PiA9IDA+CitzdGF0aWMgaW5saW5lIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKGNvbnN0IFQmIHZhbHVlKQoreworICAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgICBUeXBlQ29udmVydGVyPERlZmF1bHRUcmFpdHM8VD4+OjptYXNrVG9TdHJpbmcodmFsdWUsIHJlc3VsdCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworc3RhdGljIGlubGluZSBzdGQ6OnN0cmluZyB0b1N0cmluZyhjb25zdCBhdWRpb19kZXZpY2VzX3QmIGRldmljZXMpCit7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0OworICAgIGlmICgoZGV2aWNlcyAmIEFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApIHsKKyAgICAgICAgSW5wdXREZXZpY2VDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhkZXZpY2VzLCByZXN1bHQpOworICAgIH0gZWxzZSB7CisgICAgICAgIE91dHB1dERldmljZUNvbnZlcnRlcjo6bWFza1RvU3RyaW5nKGRldmljZXMsIHJlc3VsdCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXRpYyBpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKQoreworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSByZXN1bHQ7CisgICAgcmVzdWx0IDw8ICJ7IENvbnRlbnQgdHlwZTogIiA8PCB0b1N0cmluZyhhdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSkKKyAgICAgICAgICAgPDwgIiBVc2FnZTogIiA8PCB0b1N0cmluZyhhdHRyaWJ1dGVzLnVzYWdlKQorICAgICAgICAgICA8PCAiIFNvdXJjZTogIiA8PCB0b1N0cmluZyhhdHRyaWJ1dGVzLnNvdXJjZSkKKyAgICAgICAgICAgPDwgc3RkOjpoZXggPDwgIiBGbGFnczogMHgiIDw8IGF0dHJpYnV0ZXMuZmxhZ3MKKyAgICAgICAgICAgPDwgc3RkOjpkZWMgPDwgIiBUYWdzOiAiIDw8IGF0dHJpYnV0ZXMudGFncworICAgICAgICAgICA8PCAiIH0iOworCisgICAgcmV0dXJuIHJlc3VsdC5zdHIoKTsKK30KKworfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvKkFORFJPSURfVFlQRV9DT05WRVJURVJfSF8qLwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9jb252ZXJ0LmggYi9tZWRpYS9saWJtZWRpYWhlbHBlci9pbmNsdWRlL21lZGlhL2NvbnZlcnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWEvaW5jbHVkZS9tZWRpYS9jb252ZXJ0LmgKcmVuYW1lIHRvIG1lZGlhL2xpYm1lZGlhaGVscGVyL2luY2x1ZGUvbWVkaWEvY29udmVydC5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwCmluZGV4IDBhMzQyYjguLjE1ZWE1NzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9BbmRyb2lkLmJwCkBAIC0xLDIwICsxLDE3IEBACi0vLyBUT0RPOiBjaGFuZ2UgaXQgYmFjayB0byBjY19saWJyYXJ5X3NoYXJlZCB3aGVuIHRoZXJlIGlzIGEgd2F5IHRvCi0vLyBleHBvc2UgbWVkaWEgbWV0cmljcyBhcyBzdGFibGUgQVBJLgotY2NfbGlicmFyeSB7CitjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYm1lZGlhbWV0cmljcyIsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJJTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcCIsCiAgICAgICAgICJNZWRpYUFuYWx5dGljc0l0ZW0uY3BwIiwKKyAgICAgICAgIk1lZGlhTWV0cmljcy5jcHAiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKQEAgLTMyLDQgKzI5LDE0IEBACiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAorCisgICAgLy8gZW51bWVyYXRlIHN0YWJsZSBlbnRyeSBwb2ludHMsIGZvciBhcGV4IHVzZQorICAgIHN0dWJzOiB7CisgICAgICAgIHN5bWJvbF9maWxlOiAibGlibWVkaWFtZXRyaWNzLm1hcC50eHQiLAorICAgICAgICB2ZXJzaW9uczogWworICAgICAgICAgICAgIjEiICwKKyAgICAgICAgXQorICAgIH0sCiB9CisKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCmluZGV4IDI4YTc3NDYuLjkxMTQ5MjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9JTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKQEAgLTE0Miw3ICsxNDIsNyBAQAogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElNZWRpYUFuYWx5dGljc1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKIAogICAgICAgICAgICAgYm9vbCBmb3JjZW5ldzsKLSAgICAgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW07CisgICAgICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSBNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZSgpOwogCiAgICAgICAgICAgICBkYXRhLnJlYWRCb29sKCZmb3JjZW5ldyk7CiAgICAgICAgICAgICBpdGVtLT5yZWFkRnJvbVBhcmNlbChkYXRhKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYUFuYWx5dGljc0l0ZW0uY3BwIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhQW5hbHl0aWNzSXRlbS5jcHAKaW5kZXggMTM1YzliNi4uYjc4NTZhNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhQW5hbHl0aWNzSXRlbS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL01lZGlhQW5hbHl0aWNzSXRlbS5jcHAKQEAgLTUyLDYgKzUyLDI3IEBACiBjb25zdCBjaGFyICogY29uc3QgTWVkaWFBbmFseXRpY3NJdGVtOjpFbmFibGVkUHJvcGVydHlQZXJzaXN0ICA9ICJwZXJzaXN0Lm1lZGlhLm1ldHJpY3MuZW5hYmxlZCI7CiBjb25zdCBpbnQgTWVkaWFBbmFseXRpY3NJdGVtOjpFbmFibGVkUHJvcGVydHlfZGVmYXVsdCAgPSAxOwogCisvLyBTbyBjYWxsZXIgZG9lc24ndCBuZWVkIHRvIGtub3cgc2l6ZSBvZiBhbGxvY2F0ZWQgc3BhY2UKK01lZGlhQW5hbHl0aWNzSXRlbSAqTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoKQoreworICAgIHJldHVybiBNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShrS2V5Tm9uZSk7Cit9CisKK01lZGlhQW5hbHl0aWNzSXRlbSAqTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoTWVkaWFBbmFseXRpY3NJdGVtOjpLZXkga2V5KQoreworICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa2V5KTsKKyAgICByZXR1cm4gaXRlbTsKK30KKworTWVkaWFBbmFseXRpY3NJdGVtKiBNZWRpYUFuYWx5dGljc0l0ZW06OmNvbnZlcnQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSkgeworICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIHJldHVybiBpdGVtOworfQorCittZWRpYW1ldHJpY3NfaGFuZGxlX3QgTWVkaWFBbmFseXRpY3NJdGVtOjpjb252ZXJ0KE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSApIHsKKyAgICBtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlID0gKG1lZGlhbWV0cmljc19oYW5kbGVfdCkgaXRlbTsKKyAgICByZXR1cm4gaGFuZGxlOworfQogCiAvLyBhY2Nlc3MgZnVuY3Rpb25zIGZvciB0aGUgY2xhc3MKIE1lZGlhQW5hbHl0aWNzSXRlbTo6TWVkaWFBbmFseXRpY3NJdGVtKCkKQEAgLTQ3OCw3ICs0OTksNyBAQAogLy8gY2FsbGVyIHJlc3BvbnNpYmxlIGZvciB0aGUgcmV0dXJuZWQgc3RyaW5nCiBib29sIE1lZGlhQW5hbHl0aWNzSXRlbTo6Z2V0Q1N0cmluZyhNZWRpYUFuYWx5dGljc0l0ZW06OkF0dHIgbmFtZSwgY2hhciAqKnZhbHVlKSB7CiAgICAgUHJvcCAqcHJvcCA9IGZpbmRQcm9wKG5hbWUpOwotICAgIGlmIChwcm9wID09IE5VTEwgfHwgcHJvcC0+bVR5cGUgIT0ga1R5cGVEb3VibGUpIHsKKyAgICBpZiAocHJvcCA9PSBOVUxMIHx8IHByb3AtPm1UeXBlICE9IGtUeXBlQ1N0cmluZykgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CkBAIC00ODcsNiArNTA4LDE4IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgTWVkaWFBbmFseXRpY3NJdGVtOjpnZXRTdHJpbmcoTWVkaWFBbmFseXRpY3NJdGVtOjpBdHRyIG5hbWUsIHN0ZDo6c3RyaW5nICp2YWx1ZSkgeworICAgIFByb3AgKnByb3AgPSBmaW5kUHJvcChuYW1lKTsKKyAgICBpZiAocHJvcCA9PSBOVUxMIHx8IHByb3AtPm1UeXBlICE9IGtUeXBlQ1N0cmluZykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICh2YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgIC8vIHN0ZDo6c3RyaW5nIG1ha2VzIGEgY29weSBmb3IgdXMKKyAgICAgICAgKnZhbHVlID0gcHJvcC0+dS5DU3RyaW5nVmFsdWU7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCiAvLyByZW1vdmUgaW5kaWNhdGVkIGtleXMgYW5kIHRoZWlyIHZhbHVlcwogLy8gcmV0dXJuIHZhbHVlIGlzICMga2V5cyByZW1vdmVkCiBpbnQzMl90IE1lZGlhQW5hbHl0aWNzSXRlbTo6ZmlsdGVyKGludCBuLCBNZWRpYUFuYWx5dGljc0l0ZW06OkF0dHIgYXR0cnNbXSkgewpAQCAtNjMwLDYgKzY2MywxOSBAQAogLy8KIAogaW50MzJfdCBNZWRpYUFuYWx5dGljc0l0ZW06OnJlYWRGcm9tUGFyY2VsKGNvbnN0IFBhcmNlbCYgZGF0YSkgeworICAgIGludDMyX3QgdmVyc2lvbiA9IGRhdGEucmVhZEludDMyKCk7CisKKyAgICBzd2l0Y2godmVyc2lvbikgeworICAgICAgICBjYXNlIDA6CisgICAgICAgICAgcmV0dXJuIHJlYWRGcm9tUGFyY2VsMChkYXRhKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgTWVkaWFBbmFseXRpY3NJdGVtIFBhcmNlbCB2ZXJzaW9uOiAlZCIsIHZlcnNpb24pOworICAgICAgICAgIHJldHVybiAtMTsKKyAgICB9Cit9CisKK2ludDMyX3QgTWVkaWFBbmFseXRpY3NJdGVtOjpyZWFkRnJvbVBhcmNlbDAoY29uc3QgUGFyY2VsJiBkYXRhKSB7CiAgICAgLy8gaW50byAndGhpcycgb2JqZWN0CiAgICAgLy8gLi4gd2UgbWFrZSBhIGNvcHkgb2YgdGhlIHN0cmluZyB0byBwdXQgYXdheS4KICAgICBtS2V5ID0gZGF0YS5yZWFkQ1N0cmluZygpOwpAQCAtNjc5LDggKzcyNSwyMyBAQAogfQogCiBpbnQzMl90IE1lZGlhQW5hbHl0aWNzSXRlbTo6d3JpdGVUb1BhcmNlbChQYXJjZWwgKmRhdGEpIHsKKwogICAgIGlmIChkYXRhID09IE5VTEwpIHJldHVybiAtMTsKIAorICAgIGludDMyX3QgdmVyc2lvbiA9IDA7CisgICAgZGF0YS0+d3JpdGVJbnQzMih2ZXJzaW9uKTsKKworICAgIHN3aXRjaCh2ZXJzaW9uKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICByZXR1cm4gd3JpdGVUb1BhcmNlbDAoZGF0YSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIE1lZGlhQW5hbHl0aWNzSXRlbSBQYXJjZWwgdmVyc2lvbjogJWQiLCB2ZXJzaW9uKTsKKyAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorfQorCitpbnQzMl90IE1lZGlhQW5hbHl0aWNzSXRlbTo6d3JpdGVUb1BhcmNlbDAoUGFyY2VsICpkYXRhKSB7CiAKICAgICBkYXRhLT53cml0ZUNTdHJpbmcobUtleS5jX3N0cigpKTsKICAgICBkYXRhLT53cml0ZUludDMyKG1QaWQpOwpAQCAtNzI1LDYgKzc4NiwxNCBAQAogICAgIHJldHVybiAwOwogfQogCitjb25zdCBjaGFyICpNZWRpYUFuYWx5dGljc0l0ZW06OnRvQ1N0cmluZygpIHsKKyAgIHJldHVybiB0b0NTdHJpbmcoUFJPVE9fTEFTVCk7Cit9CisKK2NvbnN0IGNoYXIgKiBNZWRpYUFuYWx5dGljc0l0ZW06OnRvQ1N0cmluZyhpbnQgdmVyc2lvbikgeworICAgIHN0ZDo6c3RyaW5nIHZhbCA9IHRvU3RyaW5nKHZlcnNpb24pOworICAgIHJldHVybiBzdHJkdXAodmFsLmNfc3RyKCkpOworfQogCiBzdGQ6OnN0cmluZyBNZWRpYUFuYWx5dGljc0l0ZW06OnRvU3RyaW5nKCkgewogICAgcmV0dXJuIHRvU3RyaW5nKFBST1RPX0xBU1QpOwpAQCAtODU1LDggKzkyNCw2IEBACiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RkOjpzdHJpbmcgcCA9IHRoaXMtPnRvU3RyaW5nKCk7Ci0gICAgICAgIEFMT0dXKCJVbmFibGUgdG8gcmVjb3JkOiAlcyBbZm9yY2VuZXc9JWRdIiwgcC5jX3N0cigpLCBmb3JjZW5ldyk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiB9CkBAIC0xMDE0LDUgKzEwODEsMTcwIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKKy8vIGEgYnl0ZSBhcnJheTsgY29udGVudHMgYXJlCisvLyBvdmVyYWxsIGxlbmd0aCAodWludDMyKSBpbmNsdWRpbmcgdGhlIGxlbmd0aCBmaWVsZCBpdHNlbGYKKy8vIGVuY29kaW5nIHZlcnNpb24gKHVpbnQzMikKKy8vIGNvdW50IG9mIHByb3BlcnRpZXMgKHVpbnQzMikKKy8vIE4gY29waWVzIG9mOgorLy8gICAgIHByb3BlcnR5IG5hbWUgYXMgbGVuZ3RoKGludDE2KSwgYnl0ZXMKKy8vICAgICAgICAgdGhlIGJ5dGVzIFdJTEwgaW5jbHVkZSB0aGUgbnVsbCB0ZXJtaW5hdG9yIG9mIHRoZSBuYW1lCisvLyAgICAgdHlwZSAodWludDggLS0gMSBieXRlKQorLy8gICAgIHNpemUgb2YgdmFsdWUgZmllbGQgKGludDE2IC0tIDIgYnl0ZXMpCisvLyAgICAgdmFsdWUgKHNpemUgYmFzZWQgb24gdHlwZSkKKy8vICAgICAgIGludDMyLCBpbnQ2NCwgZG91YmxlIC0tIGxpdHRsZSBlbmRpYW4gNC84LzggYnl0ZXMgcmVzcGVjdGl2ZWx5CisvLyAgICAgICBjc3RyaW5nIC0tIE4gYnl0ZXMgb2YgdmFsdWUgW1dJVEggdGVybWluYXRvcl0KKworZW51bSB7IGtJbnQzMiA9IDAsIGtJbnQ2NCwga0RvdWJsZSwga1JhdGUsIGtDU3RyaW5nfTsKKworYm9vbCBNZWRpYUFuYWx5dGljc0l0ZW06OmR1bXBBdHRyaWJ1dGVzKGNoYXIgKipwYnVmZmVyLCBzaXplX3QgKnBsZW5ndGgpIHsKKworICAgIGNoYXIgKmJ1aWxkID0gTlVMTDsKKworICAgIGlmIChwYnVmZmVyID09IE5VTEwgfHwgcGxlbmd0aCA9PSBOVUxMKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBjb25zaXN0ZW5jeSBmb3IgdGhlIGNhbGxlciwgd2hvIG93bnMgd2hhdGV2ZXIgY29tZXMgYmFjayBpbiB0aGlzIHBvaW50ZXIuCisgICAgKnBidWZmZXIgPSBOVUxMOworCisgICAgLy8gZmlyc3QsIGxldCdzIGNhbGN1bGF0ZSBzaXplcworICAgIGludDMyX3QgZ29hbCA9IDA7CisgICAgaW50MzJfdCB2ZXJzaW9uID0gMDsKKworICAgIGdvYWwgKz0gc2l6ZW9mKHVpbnQzMl90KTsgICAvLyBvdmVyYWxsIGxlbmd0aCwgaW5jbHVkaW5nIHRoZSBsZW5ndGggZmllbGQKKyAgICBnb2FsICs9IHNpemVvZih1aW50MzJfdCk7ICAgLy8gZW5jb2RpbmcgdmVyc2lvbgorICAgIGdvYWwgKz0gc2l6ZW9mKHVpbnQzMl90KTsgICAvLyAjIHByb3BlcnRpZXMKKworICAgIGludDMyX3QgY291bnQgPSBtUHJvcENvdW50OworICAgIGZvciAoaW50IGkgPSAwIDsgaSA8IGNvdW50OyBpKysgKSB7CisgICAgICAgIFByb3AgKnByb3AgPSAmbVByb3BzW2ldOworICAgICAgICBnb2FsICs9IHNpemVvZih1aW50MTZfdCk7ICAgICAgICAgICAvLyBuYW1lIGxlbmd0aAorICAgICAgICBnb2FsICs9IHN0cmxlbihwcm9wLT5tTmFtZSkgKyAxOyAgICAvLyBzdHJpbmcgKyBudWxsCisgICAgICAgIGdvYWwgKz0gc2l6ZW9mKHVpbnQ4X3QpOyAgICAgICAgICAgIC8vIHR5cGUKKyAgICAgICAgZ29hbCArPSBzaXplb2YodWludDE2X3QpOyAgICAgICAgICAgLy8gc2l6ZSBvZiB2YWx1ZQorICAgICAgICBzd2l0Y2ggKHByb3AtPm1UeXBlKSB7CisgICAgICAgICAgICBjYXNlIE1lZGlhQW5hbHl0aWNzSXRlbTo6a1R5cGVJbnQzMjoKKyAgICAgICAgICAgICAgICAgICAgZ29hbCArPSBzaXplb2YodWludDMyX3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZUludDY0OgorICAgICAgICAgICAgICAgICAgICBnb2FsICs9IHNpemVvZih1aW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlRG91YmxlOgorICAgICAgICAgICAgICAgICAgICBnb2FsICs9IHNpemVvZihkb3VibGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZVJhdGU6CisgICAgICAgICAgICAgICAgICAgIGdvYWwgKz0gMiAqIHNpemVvZih1aW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlQ1N0cmluZzoKKyAgICAgICAgICAgICAgICAgICAgLy8gbGVuZ3RoICsgYWN0dWFsIHN0cmluZyArIG51bGwKKyAgICAgICAgICAgICAgICAgICAgZ29hbCArPSBzdHJsZW4ocHJvcC0+dS5DU3RyaW5nVmFsdWUpICsgMTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZm91bmQgYmFkIFByb3AgdHlwZTogJWQsIGlkeCAlZCwgbmFtZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3AtPm1UeXBlLCBpLCBwcm9wLT5tTmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIG5vdyB0aGF0IHdlIGhhdmUgYSBzaXplLi4uIGxldCdzIGFsbG9jYXRlIGFuZCBmaWxsCisgICAgYnVpbGQgPSAoY2hhciAqKW1hbGxvYyhnb2FsKTsKKyAgICBpZiAoYnVpbGQgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgbWVtc2V0KGJ1aWxkLCAwLCBnb2FsKTsKKworICAgIGNoYXIgKmZpbGxpbmcgPSBidWlsZDsKKworI2RlZmluZSBfSU5TRVJUKHZhbCwgc2l6ZSkgXAorICAgIHsgbWVtY3B5KGZpbGxpbmcsICYodmFsKSwgKHNpemUpKTsgZmlsbGluZyArPSAoc2l6ZSk7fQorI2RlZmluZSBfSU5TRVJUU1RSSU5HKHZhbCwgc2l6ZSkgXAorICAgIHsgbWVtY3B5KGZpbGxpbmcsICh2YWwpLCAoc2l6ZSkpOyBmaWxsaW5nICs9IChzaXplKTt9CisKKyAgICBfSU5TRVJUKGdvYWwsIHNpemVvZihpbnQzMl90KSk7CisgICAgX0lOU0VSVCh2ZXJzaW9uLCBzaXplb2YoaW50MzJfdCkpOworICAgIF9JTlNFUlQoY291bnQsIHNpemVvZihpbnQzMl90KSk7CisKKyAgICBmb3IgKGludCBpID0gMCA7IGkgPCBjb3VudDsgaSsrICkgeworICAgICAgICBQcm9wICpwcm9wID0gJm1Qcm9wc1tpXTsKKyAgICAgICAgaW50MTZfdCBhdHRyTmFtZUxlbiA9IHN0cmxlbihwcm9wLT5tTmFtZSkgKyAxOworICAgICAgICBfSU5TRVJUKGF0dHJOYW1lTGVuLCBzaXplb2YoaW50MTZfdCkpOworICAgICAgICBfSU5TRVJUU1RSSU5HKHByb3AtPm1OYW1lLCBhdHRyTmFtZUxlbik7ICAgIC8vIHRlcm1pbmF0aW9uIGluY2x1ZGVkCisgICAgICAgIGludDhfdCBlbGVtdHlwZTsKKyAgICAgICAgaW50MTZfdCBlbGVtc2l6ZTsKKyAgICAgICAgc3dpdGNoIChwcm9wLT5tVHlwZSkgeworICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlSW50MzI6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbGVtdHlwZSA9IGtJbnQzMjsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtdHlwZSwgc2l6ZW9mKGludDhfdCkpOworICAgICAgICAgICAgICAgICAgICBlbGVtc2l6ZSA9IHNpemVvZihpbnQzMl90KTsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtc2l6ZSwgc2l6ZW9mKGludDE2X3QpKTsKKworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKHByb3AtPnUuaW50MzJWYWx1ZSwgc2l6ZW9mKGludDMyX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlSW50NjQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbGVtdHlwZSA9IGtJbnQ2NDsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtdHlwZSwgc2l6ZW9mKGludDhfdCkpOworICAgICAgICAgICAgICAgICAgICBlbGVtc2l6ZSA9IHNpemVvZihpbnQ2NF90KTsKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChlbGVtc2l6ZSwgc2l6ZW9mKGludDE2X3QpKTsKKworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKHByb3AtPnUuaW50NjRWYWx1ZSwgc2l6ZW9mKGludDY0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBNZWRpYUFuYWx5dGljc0l0ZW06OmtUeXBlRG91YmxlOgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgZWxlbXR5cGUgPSBrRG91YmxlOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKGVsZW10eXBlLCBzaXplb2YoaW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIGVsZW1zaXplID0gc2l6ZW9mKGRvdWJsZSk7CisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQoZWxlbXNpemUsIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChwcm9wLT51LmRvdWJsZVZhbHVlLCBzaXplb2YoZG91YmxlKSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZVJhdGU6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbGVtdHlwZSA9IGtSYXRlOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKGVsZW10eXBlLCBzaXplb2YoaW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIGVsZW1zaXplID0gMiAqIHNpemVvZih1aW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQoZWxlbXNpemUsIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVChwcm9wLT51LnJhdGUuY291bnQsIHNpemVvZih1aW50NjRfdCkpOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKHByb3AtPnUucmF0ZS5kdXJhdGlvbiwgc2l6ZW9mKHVpbnQ2NF90KSk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTWVkaWFBbmFseXRpY3NJdGVtOjprVHlwZUNTdHJpbmc6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBlbGVtdHlwZSA9IGtDU3RyaW5nOworICAgICAgICAgICAgICAgICAgICBfSU5TRVJUKGVsZW10eXBlLCBzaXplb2YoaW50OF90KSk7CisgICAgICAgICAgICAgICAgICAgIGVsZW1zaXplID0gc3RybGVuKHByb3AtPnUuQ1N0cmluZ1ZhbHVlKSArIDE7CisgICAgICAgICAgICAgICAgICAgIF9JTlNFUlQoZWxlbXNpemUsIHNpemVvZihpbnQxNl90KSk7CisKKyAgICAgICAgICAgICAgICAgICAgX0lOU0VSVFNUUklORyhwcm9wLT51LkNTdHJpbmdWYWx1ZSwgZWxlbXNpemUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAvLyBlcnJvciBpZiBjYW4ndCBlbmNvZGU7IHdhcm5pbmcgaWYgY2FuJ3QgZGVjb2RlCisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJmb3VuZCBiYWQgUHJvcCB0eXBlOiAlZCwgaWR4ICVkLCBuYW1lICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcC0+bVR5cGUsIGksIHByb3AtPm1OYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgZ290byBiYWRuZXNzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGJ1aWxkICsgZ29hbCAhPSBmaWxsaW5nKSB7CisgICAgICAgIEFMT0dFKCJwcm9ibGVtcyBwb3B1bGF0aW5nOyB3cm90ZT0lZCBwbGFubmVkPSVkIiwKKyAgICAgICAgICAgICAgKGludCkoZmlsbGluZy1idWlsZCksIGdvYWwpOworICAgICAgICBnb3RvIGJhZG5lc3M7CisgICAgfQorCisgICAgKnBidWZmZXIgPSBidWlsZDsKKyAgICAqcGxlbmd0aCA9IGdvYWw7CisKKyAgICByZXR1cm4gdHJ1ZTsKKworICBiYWRuZXNzOgorICAgIGZyZWUoYnVpbGQpOworICAgIHJldHVybiBmYWxzZTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzLmNwcCBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9NZWRpYU1ldHJpY3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2MGFlMGMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvTWVkaWFNZXRyaWNzLmNwcApAQCAtMCwwICsxLDIwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFNZXRyaWNzIgorCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0cmljcy5oPgorCisvLworLy8gcHJvdmlkZSBhIEMtaXNoIGludGVyZmFjZSB0aGF0IGlzIGVhc2llciB0byBzdGFiaWxpemUgdGhhbiB0aGUgZXhpc3RpbmcgQysrCisvLyBpbnRlcmZhY2UKKy8vCisvLyBBTEwgZnVuY3Rpb25zIHJldHVybmluZyBhIGNoYXIgKiBnaXZlIHJlc3BvbnNpYmlsaXR5IGZvciB0aGUgYWxsb2NhdGVkIGJ1ZmZlcgorLy8gdG8gdGhlIGNhbGxlci4gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSB0byBjYWxsIGZyZWUoKSBvbiB0aGF0IHBvaW50ZXIuCisvLworCisvLyBtYW5hZ2UgdGhlIG92ZXJhbGwgcmVjb3JkCittZWRpYW1ldHJpY3NfaGFuZGxlX3QgbWVkaWFtZXRyaWNzX2NyZWF0ZShtZWRpYW1ldHJpY3NrZXlfdCBrZXkpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShrZXkpOworICAgIHJldHVybiAobWVkaWFtZXRyaWNzX2hhbmRsZV90KSBpdGVtOworfQorCit2b2lkIG1lZGlhbWV0cmljc19kZWxldGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybjsKKyAgICBkZWxldGUgaXRlbTsKK30KKworbWVkaWFtZXRyaWNza2V5X3QgbWVkaWFtZXRyaWNzX2dldEtleShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHN0cmR1cChpdGVtLT5nZXRLZXkoKS5jX3N0cigpKTsKK30KKworLy8gbnVwbGF5ZXIsIGV0IGFsIHVzZSBpdCB3aGVuIGFjdGluZyBhcyBwcm94aWVzCit2b2lkIG1lZGlhbWV0cmljc19zZXRVaWQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgdWlkX3QgdWlkKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgaXRlbS0+c2V0VWlkKHVpZCk7Cit9CisKKy8vIHNldCBhdHRyaWJ1dGVzCisvLworCit2b2lkIG1lZGlhbWV0cmljc19zZXRJbnQzMihtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPnNldEludDMyKGF0dHIsIHZhbHVlKTsKK30KKwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5zZXRJbnQ2NChhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPnNldERvdWJsZShhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb3VudCwgaW50NjRfdCBkdXJhdGlvbikgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPnNldFJhdGUoYXR0ciwgY291bnQsIGR1cmF0aW9uKTsKK30KKwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gIT0gTlVMTCkgaXRlbS0+c2V0Q1N0cmluZyhhdHRyLCB2YWx1ZSk7Cit9CisKKy8vIGZ1c2VkIGdldC9hZGQvc2V0OyBpZiBhdHRyIHdhc24ndCB0aGVyZSwgaXQncyBhIHNpbXBsZSBzZXQuCisvLworCit2b2lkIG1lZGlhbWV0cmljc19hZGRJbnQzMihtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPmFkZEludDMyKGF0dHIsIHZhbHVlKTsKK30KKwordm9pZCBtZWRpYW1ldHJpY3NfYWRkSW50NjQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSAhPSBOVUxMKSBpdGVtLT5hZGRJbnQ2NChhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPmFkZERvdWJsZShhdHRyLCB2YWx1ZSk7Cit9CisKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb3VudCwgaW50NjRfdCBkdXJhdGlvbikgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtICE9IE5VTEwpIGl0ZW0tPmFkZFJhdGUoYXR0ciwgY291bnQsIGR1cmF0aW9uKTsKK30KKworLy8gZmluZCAmIGV4dHJhY3QgdmFsdWVzCisvLyByZXR1cm4gaW5kaWNhdGVzIHdoZXRoZXIgYXR0ciBleGlzdHMgKGFuZCB0aHVzIHdoZXRoZXIgdmFsdWUgZmlsbGVkIGluKQorLy8gTlVMTCBwYXJhbWV0ZXIgdmFsdWUgc3VwcHJlc3NlcyBzdG9yYWdlIG9mIHZhbHVlLgorLy8KKworYm9vbCBtZWRpYW1ldHJpY3NfZ2V0SW50MzIobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgKiB2YWx1ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gaXRlbS0+Z2V0SW50MzIoYXR0ciwgdmFsdWUpOworfQorCitib29sIG1lZGlhbWV0cmljc19nZXRJbnQ2NChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqIHZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBpdGVtLT5nZXRJbnQ2NChhdHRyLCB2YWx1ZSk7Cit9CisKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSAqdmFsdWUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGl0ZW0tPmdldERvdWJsZShhdHRyLCB2YWx1ZSk7Cit9CisKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqIGNvdW50LCBpbnQ2NF90ICogZHVyYXRpb24sIGRvdWJsZSAqcmF0ZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gaXRlbS0+Z2V0UmF0ZShhdHRyLCBjb3VudCwgZHVyYXRpb24sIHJhdGUpOworfQorCisvLyBOQjogY2FsbGVyIG93bnMgdGhlIHN0cmluZyB0aGF0IGNvbWVzIGJhY2ssIGlzIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIGl0Citib29sIG1lZGlhbWV0cmljc19nZXRDU3RyaW5nKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqKnZhbHVlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGl0ZW0tPmdldENTdHJpbmcoYXR0ciwgdmFsdWUpOworfQorCisvLyB0byByZWxlYXNlIHN0cmluZ3MgcmV0dXJuZWQgdmlhIGdldENTdHJpbmcoKQordm9pZCBtZWRpYW1ldHJpY3NfZnJlZUNTdHJpbmcoY2hhciAqdmFsdWUpIHsKKyAgICBmcmVlKHZhbHVlKTsKK30KKworYm9vbCBtZWRpYW1ldHJpY3Nfc2VsZlJlY29yZChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKSB7CisgICAgYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gKGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqKSBoYW5kbGU7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBpdGVtLT5zZWxmcmVjb3JkKCk7Cit9CisKK21lZGlhbWV0cmljc19oYW5kbGVfdCBtZWRpYW1ldHJpY3NfZHVwKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtOjpjb252ZXJ0KGl0ZW0pOworICAgIHJldHVybiBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW06OmNvbnZlcnQoaXRlbS0+ZHVwKCkpOworfQorCitjb25zdCBjaGFyICptZWRpYW1ldHJpY3NfcmVhZGFibGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSkgeworICAgIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IChhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKikgaGFuZGxlOworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiAiIjsKKyAgICByZXR1cm4gaXRlbS0+dG9DU3RyaW5nKCk7Cit9CisKK2ludDMyX3QgbWVkaWFtZXRyaWNzX2NvdW50KG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gMDsKKyAgICByZXR1cm4gaXRlbS0+Y291bnQoKTsKK30KKworYm9vbCBtZWRpYW1ldHJpY3NfaXNFbmFibGVkKCkgeworICAgIC8vIHN0YXRpYywgc28gZG9lc24ndCBuZWVkIGFuIGluc3RhbmNlCisgICAgcmV0dXJuIGFuZHJvaWQ6Ok1lZGlhQW5hbHl0aWNzSXRlbTo6aXNFbmFibGVkKCk7Cit9CisKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldEF0dHJpYnV0ZXMobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgY2hhciAqKmJ1ZmZlciwgc2l6ZV90ICpsZW5ndGgpIHsKKyAgICBhbmRyb2lkOjpNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0gPSAoYW5kcm9pZDo6TWVkaWFBbmFseXRpY3NJdGVtICopIGhhbmRsZTsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGl0ZW0tPmR1bXBBdHRyaWJ1dGVzKGJ1ZmZlciwgbGVuZ3RoKTsKKworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFBbmFseXRpY3NJdGVtLmggYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYUFuYWx5dGljc0l0ZW0uaAppbmRleCAyNjNjZGU3Li40MmEyZjViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYUFuYWx5dGljc0l0ZW0uaAorKysgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvaW5jbHVkZS9NZWRpYUFuYWx5dGljc0l0ZW0uaApAQCAtMTcsOSArMTcsMTIgQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQV9NRURJQUFOQUxZVElDU0lURU1fSAogI2RlZmluZSBBTkRST0lEX01FRElBX01FRElBQU5BTFlUSUNTSVRFTV9ICiAKLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgIk1lZGlhTWV0cmljcy5oIgorCiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KQEAgLTgxLDEyICs4NCwyMiBAQAogICAgICAgICAgICAgUFJPVE9fTEFTVCA9IFBST1RPX1YxLAogICAgICAgICB9OwogCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gdXNlIHRoZSA6OmNyZWF0ZSgpIG1ldGhvZCBpbnN0ZWFkCisgICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSgpOworICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0oS2V5KTsKKyAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtKGNvbnN0IE1lZGlhQW5hbHl0aWNzSXRlbSYpOworICAgICAgICBNZWRpYUFuYWx5dGljc0l0ZW0gJm9wZXJhdG9yPShjb25zdCBNZWRpYUFuYWx5dGljc0l0ZW0mKTsKIAogICAgIHB1YmxpYzoKIAorICAgICAgICBzdGF0aWMgTWVkaWFBbmFseXRpY3NJdGVtKiBjcmVhdGUoS2V5IGtleSk7CisgICAgICAgIHN0YXRpYyBNZWRpYUFuYWx5dGljc0l0ZW0qIGNyZWF0ZSgpOworCisgICAgICAgIHN0YXRpYyBNZWRpYUFuYWx5dGljc0l0ZW0qIGNvbnZlcnQobWVkaWFtZXRyaWNzX2hhbmRsZV90KTsKKyAgICAgICAgc3RhdGljIG1lZGlhbWV0cmljc19oYW5kbGVfdCBjb252ZXJ0KE1lZGlhQW5hbHl0aWNzSXRlbSAqKTsKKwogICAgICAgICAvLyBhY2Nlc3MgZnVuY3Rpb25zIGZvciB0aGUgY2xhc3MKLSAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtKCk7Ci0gICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbShLZXkpOwogICAgICAgICB+TWVkaWFBbmFseXRpY3NJdGVtKCk7CiAKICAgICAgICAgLy8gU2Vzc2lvbklEIHRpZXMgbXVsdGlwbGUgc3VibWlzc2lvbnMgZm9yIHNhbWUga2V5IHRvZ2V0aGVyCkBAIC0xMzQsNiArMTQ3LDcgQEAKICAgICAgICAgYm9vbCBnZXRSYXRlKEF0dHIsIGludDY0X3QgKmNvdW50LCBpbnQ2NF90ICpkdXJhdGlvbiwgZG91YmxlICpyYXRlKTsKICAgICAgICAgLy8gQ2FsbGVyIG93bnMgdGhlIHJldHVybmVkIHN0cmluZwogICAgICAgICBib29sIGdldENTdHJpbmcoQXR0ciwgY2hhciAqKnZhbHVlKTsKKyAgICAgICAgYm9vbCBnZXRTdHJpbmcoQXR0ciwgc3RkOjpzdHJpbmcgKnZhbHVlKTsKIAogICAgICAgICAvLyBwYXJhbWV0ZXIgaW5kaWNhdGVzIHdoZXRoZXIgdG8gY2xvc2UgYW55IGV4aXN0aW5nIG9wZW4KICAgICAgICAgLy8gcmVjb3JkIHdpdGggc2FtZSBrZXkgYmVmb3JlIGVzdGFibGlzaGluZyBhIG5ldyByZWNvcmQKQEAgLTE3NCwxMiArMTg4LDIyIEBACiAgICAgICAgIGludDMyX3Qgd3JpdGVUb1BhcmNlbChQYXJjZWwgKik7CiAgICAgICAgIGludDMyX3QgcmVhZEZyb21QYXJjZWwoY29uc3QgUGFyY2VsJik7CiAKKyAgICAgICAgLy8gc3VwcG9ydHMgdGhlIHN0YWJsZSBpbnRlcmZhY2UKKyAgICAgICAgYm9vbCBkdW1wQXR0cmlidXRlcyhjaGFyICoqcGJ1ZmZlciwgc2l6ZV90ICpwbGVuZ3RoKTsKKwogICAgICAgICBzdGQ6OnN0cmluZyB0b1N0cmluZygpOwogICAgICAgICBzdGQ6OnN0cmluZyB0b1N0cmluZyhpbnQgdmVyc2lvbik7CisgICAgICAgIGNvbnN0IGNoYXIgKnRvQ1N0cmluZygpOworICAgICAgICBjb25zdCBjaGFyICp0b0NTdHJpbmcoaW50IHZlcnNpb24pOwogCiAgICAgICAgIC8vIGFyZSB3ZSBjb2xsZWN0aW5nIGFuYWx5dGljcyBkYXRhCiAgICAgICAgIHN0YXRpYyBib29sIGlzRW5hYmxlZCgpOwogCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gaGFuZGxlIFBhcmNlbCB2ZXJzaW9uIDAKKyAgICAgICAgaW50MzJfdCB3cml0ZVRvUGFyY2VsMChQYXJjZWwgKik7CisgICAgICAgIGludDMyX3QgcmVhZEZyb21QYXJjZWwwKGNvbnN0IFBhcmNlbCYpOworCiAgICAgcHJvdGVjdGVkOgogCiAgICAgICAgIC8vIG1lcmdlIGZpZWxkcyBmcm9tIGFyZyBpbnRvIHRoaXMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhTWV0cmljcy5oIGIvbWVkaWEvbGlibWVkaWFtZXRyaWNzL2luY2x1ZGUvTWVkaWFNZXRyaWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjlmYjI0MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9pbmNsdWRlL01lZGlhTWV0cmljcy5oCkBAIC0wLDAgKzEsOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfTUVESUFNRVRSSUNTX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9NRURJQU1FVFJJQ1NfSAorCisvLworLy8gZGVmaW5lIGEgQyBpbnRlcmZhY2UgdG8gdGhlIG1lZGlhIG1ldHJpY3MgZnVuY3Rpb25hbGl0eQorLy8KKy8vIEFsbCBmdW5jdGlvbnMgdGhhdCByZXR1cm4gYSBjaGFyICogb3IgY29uc3QgY2hhciAqIGFsc28gZ2l2ZSByZXNwb25zaWJpbGl0eQorLy8gZm9yIHRoYXQgc3RyaW5nIHRvIHRoZSBjYWxsZXIuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNhbGxpbmcgZnJlZSgpCisvLyBvbiB0aGF0IHBvaW50ZXIgd2hlbiBkb25lIHVzaW5nIHRoZSB2YWx1ZS4KKworX19CRUdJTl9ERUNMUworCisvLyBpbnRlcm5hbGx5IHJlLWNhc3QgdG8gdGhlIGJlaGluZC10aGUtc2NlbmVzIEMrKyBjbGFzcyBpbnN0YW5jZQordHlwZWRlZiBpbnQ2NF90IG1lZGlhbWV0cmljc19oYW5kbGVfdDsKK3R5cGVkZWYgY29uc3QgY2hhciAqbWVkaWFtZXRyaWNza2V5X3Q7Cit0eXBlZGVmIGNvbnN0IGNoYXIgKmF0dHJfdDsKKworbWVkaWFtZXRyaWNzX2hhbmRsZV90IG1lZGlhbWV0cmljc19jcmVhdGUobWVkaWFtZXRyaWNza2V5X3Qga2V5KTsKK3ZvaWQgbWVkaWFtZXRyaWNzX2RlbGV0ZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKTsKKworbWVkaWFtZXRyaWNza2V5X3QgbWVkaWFtZXRyaWNzX2dldEtleShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKTsKKworCisvLyBzZXQKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldEludDMyKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSk7Cit2b2lkIG1lZGlhbWV0cmljc19zZXRJbnQ2NChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdmFsdWUpOwordm9pZCBtZWRpYW1ldHJpY3Nfc2V0RG91YmxlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSk7Cit2b2lkIG1lZGlhbWV0cmljc19zZXRSYXRlKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGNvdW50LCBpbnQ2NF90IGR1cmF0aW9uKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIHZhbHVlKTsKKworLy8gZnVzZWQgZ2V0L2FkZC9zZXQ7IGlmIGF0dHIgd2Fzbid0IHRoZXJlLCBpdCdzIGEgc2ltcGxlIHNldC4KKy8vIHRoZXNlIGRvIG5vdCBwcm92aWRlIGF0b21pY2l0eSBvciBtdXR1YWwgZXhjbHVzaW9uLCBvbmx5IHNpbXBsZXIgY29kZSBzZXF1ZW5jZXMuCit2b2lkIG1lZGlhbWV0cmljc19hZGRJbnQzMihtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWUpOwordm9pZCBtZWRpYW1ldHJpY3NfYWRkSW50NjQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbHVlKTsKK3ZvaWQgbWVkaWFtZXRyaWNzX2FkZERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWUpOwordm9pZCBtZWRpYW1ldHJpY3NfYWRkUmF0ZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBjb3VudCwgaW50NjRfdCBkdXJhdGlvbik7CisKKy8vIGZpbmQgJiBleHRyYWN0IHZhbHVlcworLy8gcmV0dXJuIGluZGljYXRlcyB3aGV0aGVyIGF0dHIgZXhpc3RzIChhbmQgdGh1cyB3aGV0aGVyIHZhbHVlIGZpbGxlZCBpbikKKy8vIE5VTEwgcGFyYW1ldGVyIHZhbHVlIHN1cHByZXNzZXMgc3RvcmFnZSBvZiB2YWx1ZS4KK2Jvb2wgbWVkaWFtZXRyaWNzX2dldEludDMyKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAqIHZhbHVlKTsKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldEludDY0KG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGF0dHJfdCBhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqIHZhbHVlKTsKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldERvdWJsZShtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgKnZhbHVlKTsKK2Jvb2wgbWVkaWFtZXRyaWNzX2dldFJhdGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgYXR0cl90IGF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKiBjb3VudCwgaW50NjRfdCAqIGR1cmF0aW9uLCBkb3VibGUgKnJhdGUpOworYm9vbCBtZWRpYW1ldHJpY3NfZ2V0Q1N0cmluZyhtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlLCBhdHRyX3QgYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICoqdmFsdWUpOworLy8gdG8gcmVsZWFzZSBzdHJpbmdzIHJldHVybmVkIHZpYSBnZXRDU3RyaW5nKCkKK3ZvaWQgbWVkaWFtZXRyaWNzX2ZyZWVDU3RyaW5nKGNoYXIgKnZhbHVlKTsKKworLy8gIyBvZiBhdHRyaWJ1dGVzIHNldCB3aXRoaW4gdGhpcyByZWNvcmQuCitpbnQzMl90IG1lZGlhbWV0cmljc19jb3VudChtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaGFuZGxlKTsKKworbWVkaWFtZXRyaWNzX2hhbmRsZV90IG1lZGlhbWV0cmljc19kdXAobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSk7Citib29sIG1lZGlhbWV0cmljc19zZWxmUmVjb3JkKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUpOworCitjb25zdCBjaGFyICptZWRpYW1ldHJpY3NfcmVhZGFibGUobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSk7Cit2b2lkIG1lZGlhbWV0cmljc19zZXRVaWQobWVkaWFtZXRyaWNzX2hhbmRsZV90IGhhbmRsZSwgdWlkX3QgdWlkKTsKK2Jvb2wgbWVkaWFtZXRyaWNzX2lzRW5hYmxlZCgpOworCisvLyBzZXJpYWxpemVkIGNvcHkgb2YgdGhlIGF0dHJpYnV0ZXMvdmFsdWVzLCBtb3N0bHkgZm9yIHVwc3RyZWFtIGdldE1ldHJpY3MoKSBjYWxscworLy8gY2FsbGVyIG93bnMgdGhlIGJ1ZmZlciBhbGxvY2F0ZWQgYXMgcGFydCBvZiB0aGlzIGNhbGwuCitib29sIG1lZGlhbWV0cmljc19nZXRBdHRyaWJ1dGVzKG1lZGlhbWV0cmljc19oYW5kbGVfdCBoYW5kbGUsIGNoYXIgKipidWZmZXIsIHNpemVfdCAqbGVuZ3RoKTsKKworX19FTkRfREVDTFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYW1ldHJpY3MvbGlibWVkaWFtZXRyaWNzLm1hcC50eHQgYi9tZWRpYS9saWJtZWRpYW1ldHJpY3MvbGlibWVkaWFtZXRyaWNzLm1hcC50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ2MjgxYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhbWV0cmljcy9saWJtZWRpYW1ldHJpY3MubWFwLnR4dApAQCAtMCwwICsxLDI5IEBACitMSUJNRURJQU1FVFJJQ1NfMSB7CisgIGdsb2JhbDoKKyAgICBtZWRpYW1ldHJpY3NfYWRkRG91YmxlOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfYWRkSW50MzI7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19hZGRJbnQ2NDsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2FkZFJhdGU7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19jb3VudDsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2NyZWF0ZTsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2RlbGV0ZTsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2ZyZWVDU3RyaW5nOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfZ2V0QXR0cmlidXRlczsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2dldENTdHJpbmc7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19nZXREb3VibGU7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19nZXRJbnQzMjsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2dldEludDY0OyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfZ2V0S2V5OyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3NfZ2V0UmF0ZTsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX2lzRW5hYmxlZDsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX3JlYWRhYmxlOyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3Nfc2VsZlJlY29yZDsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmc7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19zZXREb3VibGU7ICMgYXBleAorICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMjsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX3NldEludDY0OyAjIGFwZXgKKyAgICBtZWRpYW1ldHJpY3Nfc2V0UmF0ZTsgIyBhcGV4CisgICAgbWVkaWFtZXRyaWNzX3NldFVpZDsgIyBhcGV4CisgIGxvY2FsOgorICAgICo7Cit9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvQW5kcm9pZC5icApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2QyN2JkMS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLWNjX2xpYnJhcnlfaGVhZGVycyB7Ci0gICAgbmFtZTogImxpYm1lZGlhcGxheWVyMl9oZWFkZXJzIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAotfQotCi1jY19saWJyYXJ5IHsKLSAgICBuYW1lOiAibGlibWVkaWFwbGF5ZXIyIiwKLQotICAgIHNyY3M6IFsKLSAgICAgICAgIkpBdWRpb1RyYWNrLmNwcCIsCi0gICAgICAgICJNZWRpYVBsYXllcjJBdWRpb091dHB1dC5jcHAiLAotICAgICAgICAibWVkaWFwbGF5ZXIyLmNwcCIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJhbmRyb2lkX3J1bnRpbWUiLAotICAgICAgICAibGliYXVkaW9jbGllbnQiLAotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJndWkiLAotICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYm1lZGlhX29teCIsCi0gICAgICAgICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1aSIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0KLSAgICAgICAgImxpYmNyeXB0byIsCi0gICAgICAgICJsaWJtZWRpYWRybSIsCi0gICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAotICAgICAgICAibGlibWVkaWFuZGsiLAotICAgICAgICAibGlibWVkaWF1dGlscyIsCi0gICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCi0gICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAotICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2h0dHBsaXZlIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3BsYXllcjIiLAotICAgIF0sCi0KLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCi0gICAgICAgICJsaWJhdWRpb2NsaWVudCIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGlibWVkaWFfb214IiwKLSAgICBdLAotCi0gICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKLSAgICBdLAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9udXBsYXllcjIiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLAotICAgIF0sCi0KLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2Vycm9yIiwKLSAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAotICAgICAgICAiLVdhbGwiLAotICAgIF0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwotICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKLSAgICAgICAgXSwKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgIH0sCi19CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWMwY2M1Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvSkF1ZGlvVHJhY2suY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNjg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiSkF1ZGlvVHJhY2siCi0KLSNpbmNsdWRlICJtZWRpYS9KQXVkaW9BdHRyaWJ1dGVzLmgiCi0jaW5jbHVkZSAibWVkaWEvSkF1ZGlvRm9ybWF0LmgiCi0jaW5jbHVkZSAibWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmgiCi0KLSNpbmNsdWRlIDxhbmRyb2lkX21lZGlhX0F1ZGlvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gVE9ETzogU3RvcmUgSmF2YSBjbGFzcy9tZXRob2RJRCBhcyBhIG1lbWJlciB2YXJpYWJsZSBpbiB0aGUgY2xhc3MuCi0vLyBUT0RPOiBBZGQgTlVMTCAmJiBFeGNlcHRpb24gY2hlY2tzIGFmdGVyIGV2ZXJ5IEpOSSBjYWxsLgotSkF1ZGlvVHJhY2s6OkpBdWRpb1RyYWNrKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gPCBVc2FnZXMgb2YgdGhlIGFyZ3VtZW50cyBhcmUgYmVsb3cgPgotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsICAgICAgICAgICAgICAgLy8gQXVkaW9BdWRpb0F0dHJpYnV0ZXMKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEF1ZGlvRm9ybWF0ICYmIGJ1ZmZlclNpemVJbkJ5dGVzCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb0Zvcm1hdCAmJiBidWZmZXJTaXplSW5CeXRlcwotICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgICAgICAgICAgICAgLy8gQXVkaW9Gb3JtYXQgJiYgYnVmZmVyU2l6ZUluQnl0ZXMKLSAgICAgICAgY2FsbGJhY2tfdCBjYmYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9mZmxvYWQKLSAgICAgICAgdm9pZCogdXNlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9mZmxvYWQKLSAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlclNpemVJbkJ5dGVzCi0gICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsICAgICAgICAgICAgICAgICAgICAvLyBBdWRpb1RyYWNrCi0gICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCogcEF0dHJpYnV0ZXMsICAgICAgICAvLyBBdWRpb0F0dHJpYnV0ZXMKLSAgICAgICAgZmxvYXQgbWF4UmVxdWlyZWRTcGVlZCkgeyAgICAgICAgICAgICAgICAgICAgIC8vIGJ1ZmZlclNpemVJbkJ5dGVzCi0KLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqY2xhc3MgakF1ZGlvVHJhY2tDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrIik7Ci0gICAgbUF1ZGlvVHJhY2tDbHMgPSAoamNsYXNzKSBlbnYtPk5ld0dsb2JhbFJlZihqQXVkaW9UcmFja0Nscyk7Ci0KLSAgICBtYXhSZXF1aXJlZFNwZWVkID0gc3RkOjptaW4oc3RkOjptYXgobWF4UmVxdWlyZWRTcGVlZCwgMS4wZiksIEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01BWCk7Ci0KLSAgICBpbnQgYnVmZmVyU2l6ZUluQnl0ZXMgPSAwOwotICAgIGlmIChzYW1wbGVSYXRlID09IDAgfHwgZnJhbWVDb3VudCA+IDApIHsKLSAgICAgICAgLy8gTWFudWFsbHkgY2FsY3VsYXRlIGJ1ZmZlciBzaXplLgotICAgICAgICBidWZmZXJTaXplSW5CeXRlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzaykKLSAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUoZm9ybWF0KSAqIChmcmFtZUNvdW50ID4gMCA/IGZyYW1lQ291bnQgOiAxKTsKLSAgICB9IGVsc2UgaWYgKHNhbXBsZVJhdGUgPiAwKSB7Ci0gICAgICAgIC8vIENhbGwgSmF2YSBBdWRpb1RyYWNrOjpnZXRNaW5CdWZmZXJTaXplKCkuCi0gICAgICAgIGptZXRob2RJRCBqR2V0TWluQnVmZmVyU2l6ZSA9Ci0gICAgICAgICAgICAgICAgZW52LT5HZXRTdGF0aWNNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldE1pbkJ1ZmZlclNpemUiLCAiKElJSSlJIik7Ci0gICAgICAgIGJ1ZmZlclNpemVJbkJ5dGVzID0gZW52LT5DYWxsU3RhdGljSW50TWV0aG9kKG1BdWRpb1RyYWNrQ2xzLCBqR2V0TWluQnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBvdXRDaGFubmVsTWFza0Zyb21OYXRpdmUoY2hhbm5lbE1hc2spLCBhdWRpb0Zvcm1hdEZyb21OYXRpdmUoZm9ybWF0KSk7Ci0gICAgfQotICAgIGJ1ZmZlclNpemVJbkJ5dGVzID0gKGludCkgKGJ1ZmZlclNpemVJbkJ5dGVzICogbWF4UmVxdWlyZWRTcGVlZCk7Ci0KLSAgICAvLyBDcmVhdGUgYSBKYXZhIEF1ZGlvVHJhY2sgb2JqZWN0IHRocm91Z2ggaXRzIEJ1aWxkZXIuCi0gICAgamNsYXNzIGpCdWlsZGVyQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjayRCdWlsZGVyIik7Ci0gICAgam1ldGhvZElEIGpCdWlsZGVyQ3RvciA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICI8aW5pdD4iLCAiKClWIik7Ci0gICAgam9iamVjdCBqQnVpbGRlck9iaiA9IGVudi0+TmV3T2JqZWN0KGpCdWlsZGVyQ2xzLCBqQnVpbGRlckN0b3IpOwotCi0gICAgam1ldGhvZElEIGpTZXRBdWRpb0F0dHJpYnV0ZXMgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0QXVkaW9BdHRyaWJ1dGVzIiwKLSAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9BdHRyaWJ1dGVzOylMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrJEJ1aWxkZXI7Iik7Ci0gICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpTZXRBdWRpb0F0dHJpYnV0ZXMsCi0gICAgICAgICAgICBKQXVkaW9BdHRyaWJ1dGVzOjpjcmVhdGVBdWRpb0F0dHJpYnV0ZXNPYmooZW52LCBwQXR0cmlidXRlcywgc3RyZWFtVHlwZSkpOwotCi0gICAgam1ldGhvZElEIGpTZXRBdWRpb0Zvcm1hdCA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRBdWRpb0Zvcm1hdCIsCi0gICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL0F1ZGlvRm9ybWF0OylMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrJEJ1aWxkZXI7Iik7Ci0gICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpTZXRBdWRpb0Zvcm1hdCwKLSAgICAgICAgICAgIEpBdWRpb0Zvcm1hdDo6Y3JlYXRlQXVkaW9Gb3JtYXRPYmooZW52LCBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrKSk7Ci0KLSAgICBqbWV0aG9kSUQgalNldEJ1ZmZlclNpemVJbkJ5dGVzID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldEJ1ZmZlclNpemVJbkJ5dGVzIiwKLSAgICAgICAgICAgICIoSSlMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrJEJ1aWxkZXI7Iik7Ci0gICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpTZXRCdWZmZXJTaXplSW5CeXRlcywgYnVmZmVyU2l6ZUluQnl0ZXMpOwotCi0gICAgLy8gV2Ugb25seSB1c2Ugc3RyZWFtaW5nIG1vZGUgb2YgSmF2YSBBdWRpb1RyYWNrLgotICAgIGpmaWVsZElEIGpNb2RlU3RyZWFtID0gZW52LT5HZXRTdGF0aWNGaWVsZElEKG1BdWRpb1RyYWNrQ2xzLCAiTU9ERV9TVFJFQU0iLCAiSSIpOwotICAgIGppbnQgdHJhbnNmZXJNb2RlID0gZW52LT5HZXRTdGF0aWNJbnRGaWVsZChtQXVkaW9UcmFja0Nscywgak1vZGVTdHJlYW0pOwotICAgIGptZXRob2RJRCBqU2V0VHJhbnNmZXJNb2RlID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldFRyYW5zZmVyTW9kZSIsCi0gICAgICAgICAgICAiKEkpTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjayRCdWlsZGVyOyIpOwotICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqU2V0VHJhbnNmZXJNb2RlLAotICAgICAgICAgICAgdHJhbnNmZXJNb2RlIC8qIEphdmEgQXVkaW9UcmFjazo6TU9ERV9TVFJFQU0gKi8pOwotCi0gICAgaWYgKHNlc3Npb25JZCAhPSAwKSB7Ci0gICAgICAgIGptZXRob2RJRCBqU2V0U2Vzc2lvbklkID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldFNlc3Npb25JZCIsCi0gICAgICAgICAgICAgICAgIihJKUxhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2skQnVpbGRlcjsiKTsKLSAgICAgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpTZXRTZXNzaW9uSWQsIHNlc3Npb25JZCk7Ci0gICAgfQotCi0gICAgaWYgKGNiZiAhPSBOVUxMKSB7Ci0gICAgICAgIGptZXRob2RJRCBqU2V0T2ZmbG9hZGVkUGxheWJhY2sgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAic2V0T2ZmbG9hZGVkUGxheWJhY2siLAotICAgICAgICAgICAgICAgICIoWilMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrJEJ1aWxkZXI7Iik7Ci0gICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqU2V0T2ZmbG9hZGVkUGxheWJhY2ssIHRydWUpOwotICAgICAgICBtRmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEOwotICAgIH0KLQotICAgIGptZXRob2RJRCBqQnVpbGQgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiYnVpbGQiLCAiKClMYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrOyIpOwotICAgIG1BdWRpb1RyYWNrT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyT2JqLCBqQnVpbGQpOwotCi0gICAgaWYgKGNiZiAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIFNldCBvZmZsb2FkIG1vZGUgY2FsbGJhY2sKLSAgICAgICAgam9iamVjdCBqU3RyZWFtRXZlbnRDYWxsYmFja09iaiA9IGNyZWF0ZVN0cmVhbUV2ZW50Q2FsbGJhY2soY2JmLCB1c2VyKTsKLSAgICAgICAgam9iamVjdCBqRXhlY3V0b3JPYmogPSBjcmVhdGVDYWxsYmFja0V4ZWN1dG9yKCk7Ci0gICAgICAgIGptZXRob2RJRCBqU2V0U3RyZWFtRXZlbnRDYWxsYmFjayA9IGVudi0+R2V0TWV0aG9kSUQoCi0gICAgICAgICAgICAgICAgakF1ZGlvVHJhY2tDbHMsCi0gICAgICAgICAgICAgICAgInNldFN0cmVhbUV2ZW50Q2FsbGJhY2siLAotICAgICAgICAgICAgICAgICIoTGphdmEvdXRpbC9jb25jdXJyZW50L0V4ZWN1dG9yO0xhbmRyb2lkL21lZGlhL0F1ZGlvVHJhY2skU3RyZWFtRXZlbnRDYWxsYmFjazspViIpOwotICAgICAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKAotICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrT2JqLCBqU2V0U3RyZWFtRXZlbnRDYWxsYmFjaywgakV4ZWN1dG9yT2JqLCBqU3RyZWFtRXZlbnRDYWxsYmFja09iaik7Ci0gICAgfQotfQotCi1KQXVkaW9UcmFjazo6fkpBdWRpb1RyYWNrKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGVudi0+RGVsZXRlR2xvYmFsUmVmKG1BdWRpb1RyYWNrQ2xzKTsKLX0KLQotc2l6ZV90IEpBdWRpb1RyYWNrOjpmcmFtZUNvdW50KCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGptZXRob2RJRCBqR2V0QnVmZmVyU2l6ZUluRnJhbWVzID0gZW52LT5HZXRNZXRob2RJRCgKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2xzLCAiZ2V0QnVmZmVyU2l6ZUluRnJhbWVzIiwgIigpSSIpOwotICAgIHJldHVybiBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRCdWZmZXJTaXplSW5GcmFtZXMpOwotfQotCi1zaXplX3QgSkF1ZGlvVHJhY2s6OmNoYW5uZWxDb3VudCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqbWV0aG9kSUQgakdldENoYW5uZWxDb3VudCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJnZXRDaGFubmVsQ291bnQiLCAiKClJIik7Ci0gICAgcmV0dXJuIGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldENoYW5uZWxDb3VudCk7Ci19Ci0KLXVpbnQzMl90IEpBdWRpb1RyYWNrOjpsYXRlbmN5KCkgewotICAgIC8vIFRPRE86IEN1cnJlbnRseSBoYXJkLWNvZGVkIGFzIHJldHVybmluZyB6ZXJvLgotICAgIHJldHVybiAwOwotfQotCi1zdGF0dXNfdCBKQXVkaW9UcmFjazo6Z2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSB7Ci0gICAgaWYgKHBvc2l0aW9uID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqbWV0aG9kSUQgakdldFBsYXliYWNrSGVhZFBvc2l0aW9uID0gZW52LT5HZXRNZXRob2RJRCgKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrQ2xzLCAiZ2V0UGxheWJhY2tIZWFkUG9zaXRpb24iLCAiKClJIik7Ci0gICAgKnBvc2l0aW9uID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0UGxheWJhY2tIZWFkUG9zaXRpb24pOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1ib29sIEpBdWRpb1RyYWNrOjpnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotCi0gICAgamNsYXNzIGpBdWRpb1RpbWVTdGFtcENscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL0F1ZGlvVGltZXN0YW1wIik7Ci0gICAgam9iamVjdCBqQXVkaW9UaW1lU3RhbXBPYmogPSBlbnYtPkFsbG9jT2JqZWN0KGpBdWRpb1RpbWVTdGFtcENscyk7Ci0KLSAgICBqZmllbGRJRCBqRnJhbWVQb3NpdGlvbiA9IGVudi0+R2V0RmllbGRJRChqQXVkaW9UaW1lU3RhbXBDbHMsICJmcmFtZVBvc2l0aW9uIiwgIkwiKTsKLSAgICBqZmllbGRJRCBqTmFub1RpbWUgPSBlbnYtPkdldEZpZWxkSUQoakF1ZGlvVGltZVN0YW1wQ2xzLCAibmFub1RpbWUiLCAiTCIpOwotCi0gICAgam1ldGhvZElEIGpHZXRUaW1lc3RhbXAgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLAotICAgICAgICAgICAgImdldFRpbWVzdGFtcCIsICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9UaW1lc3RhbXApQiIpOwotICAgIGJvb2wgc3VjY2VzcyA9IGVudi0+Q2FsbEJvb2xlYW5NZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRUaW1lc3RhbXAsIGpBdWRpb1RpbWVTdGFtcE9iaik7Ci0KLSAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGxvbmcgbG9uZyBmcmFtZVBvc2l0aW9uID0gZW52LT5HZXRMb25nRmllbGQoakF1ZGlvVGltZVN0YW1wT2JqLCBqRnJhbWVQb3NpdGlvbik7Ci0gICAgbG9uZyBsb25nIG5hbm9UaW1lID0gZW52LT5HZXRMb25nRmllbGQoakF1ZGlvVGltZVN0YW1wT2JqLCBqTmFub1RpbWUpOwotCi0gICAgc3RydWN0IHRpbWVzcGVjIHRzOwotICAgIGNvbnN0IGxvbmcgbG9uZyBzZWNvbmRUb05hbm8gPSAxMDAwMDAwMDAwTEw7IC8vIDFFOQotICAgIHRzLnR2X3NlYyA9IG5hbm9UaW1lIC8gc2Vjb25kVG9OYW5vOwotICAgIHRzLnR2X25zZWMgPSBuYW5vVGltZSAlIHNlY29uZFRvTmFubzsKLSAgICB0aW1lc3RhbXAubVRpbWUgPSB0czsKLSAgICB0aW1lc3RhbXAubVBvc2l0aW9uID0gKHVpbnQzMl90KSBmcmFtZVBvc2l0aW9uOwotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXR1c190IEpBdWRpb1RyYWNrOjpnZXRUaW1lc3RhbXAoRXh0ZW5kZWRUaW1lc3RhbXAgKnRpbWVzdGFtcCBfX3VudXNlZCkgewotICAgIC8vIFRPRE86IEltcGxlbWVudCB0aGlzIGFmdGVyIGFwcHJvcHJpYXRlIEphdmEgQXVkaW9UcmFjayBtZXRob2QgaXMgYXZhaWxhYmxlLgotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKSB7Ci0gICAgLy8gVE9ETzogZXhpc3RpbmcgbmF0aXZlIEF1ZGlvVHJhY2sgcmV0dXJucyBJTlZBTElEX09QRVJBVElPTiBvbiBvZmZsb2FkL2RpcmVjdC9mYXN0IHRyYWNrcy4KLSAgICAvLyBTaG91bGQgd2UgZG8gdGhlIHNhbWUgdGhpbmc/Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0KLSAgICBqY2xhc3MgalBsYXliYWNrUGFyYW1zQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvUGxheWJhY2tQYXJhbXMiKTsKLSAgICBqbWV0aG9kSUQgalBsYXliYWNrUGFyYW1zQ3RvciA9IGVudi0+R2V0TWV0aG9kSUQoalBsYXliYWNrUGFyYW1zQ2xzLCAiPGluaXQ+IiwgIigpViIpOwotICAgIGpvYmplY3QgalBsYXliYWNrUGFyYW1zT2JqID0gZW52LT5OZXdPYmplY3QoalBsYXliYWNrUGFyYW1zQ2xzLCBqUGxheWJhY2tQYXJhbXNDdG9yKTsKLQotICAgIGptZXRob2RJRCBqU2V0QXVkaW9GYWxsYmFja01vZGUgPSBlbnYtPkdldE1ldGhvZElEKAotICAgICAgICAgICAgalBsYXliYWNrUGFyYW1zQ2xzLCAic2V0QXVkaW9GYWxsYmFja01vZGUiLCAiKEkpTGFuZHJvaWQvbWVkaWEvUGxheWJhY2tQYXJhbXM7Iik7Ci0gICAgalBsYXliYWNrUGFyYW1zT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKAotICAgICAgICAgICAgalBsYXliYWNrUGFyYW1zT2JqLCBqU2V0QXVkaW9GYWxsYmFja01vZGUsIHBsYXliYWNrUmF0ZS5tRmFsbGJhY2tNb2RlKTsKLQotICAgIGptZXRob2RJRCBqU2V0QXVkaW9TdHJldGNoTW9kZSA9IGVudi0+R2V0TWV0aG9kSUQoCi0gICAgICAgICAgICAgICAgalBsYXliYWNrUGFyYW1zQ2xzLCAic2V0QXVkaW9TdHJldGNoTW9kZSIsICIoSSlMYW5kcm9pZC9tZWRpYS9QbGF5YmFja1BhcmFtczsiKTsKLSAgICBqUGxheWJhY2tQYXJhbXNPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoCi0gICAgICAgICAgICBqUGxheWJhY2tQYXJhbXNPYmosIGpTZXRBdWRpb1N0cmV0Y2hNb2RlLCBwbGF5YmFja1JhdGUubVN0cmV0Y2hNb2RlKTsKLQotICAgIGptZXRob2RJRCBqU2V0UGl0Y2ggPSBlbnYtPkdldE1ldGhvZElEKAotICAgICAgICAgICAgalBsYXliYWNrUGFyYW1zQ2xzLCAic2V0UGl0Y2giLCAiKEYpTGFuZHJvaWQvbWVkaWEvUGxheWJhY2tQYXJhbXM7Iik7Ci0gICAgalBsYXliYWNrUGFyYW1zT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpQbGF5YmFja1BhcmFtc09iaiwgalNldFBpdGNoLCBwbGF5YmFja1JhdGUubVBpdGNoKTsKLQotICAgIGptZXRob2RJRCBqU2V0U3BlZWQgPSBlbnYtPkdldE1ldGhvZElEKAotICAgICAgICAgICAgalBsYXliYWNrUGFyYW1zQ2xzLCAic2V0U3BlZWQiLCAiKEYpTGFuZHJvaWQvbWVkaWEvUGxheWJhY2tQYXJhbXM7Iik7Ci0gICAgalBsYXliYWNrUGFyYW1zT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpQbGF5YmFja1BhcmFtc09iaiwgalNldFNwZWVkLCBwbGF5YmFja1JhdGUubVNwZWVkKTsKLQotCi0gICAgLy8gU2V0IHRoaXMgSmF2YSBQbGF5YmFja1BhcmFtcyBvYmplY3QgaW50byBKYXZhIEF1ZGlvVHJhY2suCi0gICAgam1ldGhvZElEIGpTZXRQbGF5YmFja1BhcmFtcyA9IGVudi0+R2V0TWV0aG9kSUQoCi0gICAgICAgICAgICBtQXVkaW9UcmFja0NscywgInNldFBsYXliYWNrUGFyYW1zIiwgIihMYW5kcm9pZC9tZWRpYS9QbGF5YmFja1BhcmFtczspViIpOwotICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpTZXRQbGF5YmFja1BhcmFtcywgalBsYXliYWNrUGFyYW1zT2JqKTsKLSAgICAvLyBUT0RPOiBTaG91bGQgd2UgY2F0Y2ggdGhlIEphdmEgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uPwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1jb25zdCBBdWRpb1BsYXliYWNrUmF0ZSBKQXVkaW9UcmFjazo6Z2V0UGxheWJhY2tSYXRlKCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotCi0gICAgam1ldGhvZElEIGpHZXRQbGF5YmFja1BhcmFtcyA9IGVudi0+R2V0TWV0aG9kSUQoCi0gICAgICAgICAgICBtQXVkaW9UcmFja0NscywgImdldFBsYXliYWNrUGFyYW1zIiwgIigpTGFuZHJvaWQvbWVkaWEvUGxheWJhY2tQYXJhbXM7Iik7Ci0gICAgam9iamVjdCBqUGxheWJhY2tQYXJhbXNPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRQbGF5YmFja1BhcmFtcyk7Ci0KLSAgICBBdWRpb1BsYXliYWNrUmF0ZSBwbGF5YmFja1JhdGU7Ci0gICAgamNsYXNzIGpQbGF5YmFja1BhcmFtc0NscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL1BsYXliYWNrUGFyYW1zIik7Ci0KLSAgICBqbWV0aG9kSUQgakdldEF1ZGlvRmFsbGJhY2tNb2RlID0gZW52LT5HZXRNZXRob2RJRCgKLSAgICAgICAgICAgIGpQbGF5YmFja1BhcmFtc0NscywgImdldEF1ZGlvRmFsbGJhY2tNb2RlIiwgIigpSSIpOwotICAgIC8vIFRPRE86IFNob3VsZCB3ZSBlbmFibGUgcGFzc2luZyBBVURJT19USU1FU1RSRVRDSF9GQUxMQkFDS19DVVRfUkVQRUFUPwotICAgIC8vICAgICAgIFRoZSBlbnVtIGlzIGludGVybmFsIG9ubHksIHNvIGl0IGlzIG5vdCBkZWZpbmVkIGluIFBsYXliYWNrUGFybWFzLmphdmEuCi0gICAgLy8gVE9ETzogSXMgdGhpcyByaWdodCB3YXkgdG8gY29udmVydCBhbiBpbnQgdG8gYW4gZW51bT8KLSAgICBwbGF5YmFja1JhdGUubUZhbGxiYWNrTW9kZSA9IHN0YXRpY19jYXN0PEF1ZGlvVGltZXN0cmV0Y2hGYWxsYmFja01vZGU+KAotICAgICAgICAgICAgZW52LT5DYWxsSW50TWV0aG9kKGpQbGF5YmFja1BhcmFtc09iaiwgakdldEF1ZGlvRmFsbGJhY2tNb2RlKSk7Ci0KLSAgICBqbWV0aG9kSUQgakdldEF1ZGlvU3RyZXRjaE1vZGUgPSBlbnYtPkdldE1ldGhvZElEKAotICAgICAgICAgICAgalBsYXliYWNrUGFyYW1zQ2xzLCAiZ2V0QXVkaW9TdHJldGNoTW9kZSIsICIoKUkiKTsKLSAgICBwbGF5YmFja1JhdGUubVN0cmV0Y2hNb2RlID0gc3RhdGljX2Nhc3Q8QXVkaW9UaW1lc3RyZXRjaFN0cmV0Y2hNb2RlPigKLSAgICAgICAgICAgIGVudi0+Q2FsbEludE1ldGhvZChqUGxheWJhY2tQYXJhbXNPYmosIGpHZXRBdWRpb1N0cmV0Y2hNb2RlKSk7Ci0KLSAgICBqbWV0aG9kSUQgakdldFBpdGNoID0gZW52LT5HZXRNZXRob2RJRChqUGxheWJhY2tQYXJhbXNDbHMsICJnZXRQaXRjaCIsICIoKUYiKTsKLSAgICBwbGF5YmFja1JhdGUubVBpdGNoID0gZW52LT5DYWxsRmxvYXRNZXRob2QoalBsYXliYWNrUGFyYW1zT2JqLCBqR2V0UGl0Y2gpOwotCi0gICAgam1ldGhvZElEIGpHZXRTcGVlZCA9IGVudi0+R2V0TWV0aG9kSUQoalBsYXliYWNrUGFyYW1zQ2xzLCAiZ2V0U3BlZWQiLCAiKClGIik7Ci0gICAgcGxheWJhY2tSYXRlLm1TcGVlZCA9IGVudi0+Q2FsbEZsb2F0TWV0aG9kKGpQbGF5YmFja1BhcmFtc09iaiwgakdldFNwZWVkKTsKLQotICAgIHJldHVybiBwbGF5YmFja1JhdGU7Ci19Ci0KLW1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyBKQXVkaW9UcmFjazo6YXBwbHlWb2x1bWVTaGFwZXIoCi0gICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWd1cmF0aW9uLAotICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIHsKLQotICAgIGpvYmplY3QgakNvbmZpZ3VyYXRpb25PYmogPSBjcmVhdGVWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uT2JqKGNvbmZpZ3VyYXRpb24pOwotICAgIGpvYmplY3Qgak9wZXJhdGlvbk9iaiA9IGNyZWF0ZVZvbHVtZVNoYXBlck9wZXJhdGlvbk9iaihvcGVyYXRpb24pOwotCi0gICAgaWYgKGpDb25maWd1cmF0aW9uT2JqID09IE5VTEwgfHwgak9wZXJhdGlvbk9iaiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0dXMoQkFEX1ZBTFVFKTsKLSAgICB9Ci0KLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLQotICAgIGptZXRob2RJRCBqQ3JlYXRlVm9sdW1lU2hhcGVyID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImNyZWF0ZVZvbHVtZVNoYXBlciIsCi0gICAgICAgICAgICAiKExhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciRDb25maWd1cmF0aW9uOylMYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXI7Iik7Ci0gICAgam9iamVjdCBqVm9sdW1lU2hhcGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKAotICAgICAgICAgICAgbUF1ZGlvVHJhY2tPYmosIGpDcmVhdGVWb2x1bWVTaGFwZXIsIGpDb25maWd1cmF0aW9uT2JqKTsKLQotICAgIGpjbGFzcyBqVm9sdW1lU2hhcGVyQ2xzID0gZW52LT5GaW5kQ2xhc3MoImFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyIik7Ci0gICAgam1ldGhvZElEIGpBcHBseSA9IGVudi0+R2V0TWV0aG9kSUQoalZvbHVtZVNoYXBlckNscywgImFwcGx5IiwKLSAgICAgICAgICAgICIoTGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyJE9wZXJhdGlvbjspViIpOwotICAgIGVudi0+Q2FsbFZvaWRNZXRob2QoalZvbHVtZVNoYXBlck9iaiwgakFwcGx5LCBqT3BlcmF0aW9uT2JqKTsKLQotICAgIHJldHVybiBtZWRpYTo6Vm9sdW1lU2hhcGVyOjpTdGF0dXMoTk9fRVJST1IpOwotfQotCi1zdGF0dXNfdCBKQXVkaW9UcmFjazo6c2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgam1ldGhvZElEIGpTZXRBdXhFZmZlY3RTZW5kTGV2ZWwgPSBlbnYtPkdldE1ldGhvZElEKAotICAgICAgICAgICAgbUF1ZGlvVHJhY2tDbHMsICJzZXRBdXhFZmZlY3RTZW5kTGV2ZWwiLCAiKEYpSSIpOwotICAgIGludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpTZXRBdXhFZmZlY3RTZW5kTGV2ZWwsIGxldmVsKTsKLSAgICByZXR1cm4gamF2YVRvTmF0aXZlU3RhdHVzKHJlc3VsdCk7Ci19Ci0KLXN0YXR1c190IEpBdWRpb1RyYWNrOjphdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgam1ldGhvZElEIGpBdHRhY2hBdXhFZmZlY3QgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiYXR0YWNoQXV4RWZmZWN0IiwgIihJKUkiKTsKLSAgICBpbnQgcmVzdWx0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqQXR0YWNoQXV4RWZmZWN0LCBlZmZlY3RJZCk7Ci0gICAgcmV0dXJuIGphdmFUb05hdGl2ZVN0YXR1cyhyZXN1bHQpOwotfQotCi1zdGF0dXNfdCBKQXVkaW9UcmFjazo6c2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgLy8gVE9ETzogSmF2YSBzZXRTdGVyZW9Wb2x1bWUgaXMgZGVwcmVjYXRlZC4gRG8gd2UgcmVhbGx5IG5lZWQgdGhpcyBtZXRob2Q/Ci0gICAgam1ldGhvZElEIGpTZXRTdGVyZW9Wb2x1bWUgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAic2V0U3RlcmVvVm9sdW1lIiwgIihGRilJIik7Ci0gICAgaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgalNldFN0ZXJlb1ZvbHVtZSwgbGVmdCwgcmlnaHQpOwotICAgIHJldHVybiBqYXZhVG9OYXRpdmVTdGF0dXMocmVzdWx0KTsKLX0KLQotc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OnNldFZvbHVtZShmbG9hdCB2b2x1bWUpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqbWV0aG9kSUQgalNldFZvbHVtZSA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJzZXRWb2x1bWUiLCAiKEYpSSIpOwotICAgIGludCByZXN1bHQgPSBlbnYtPkNhbGxJbnRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpTZXRWb2x1bWUsIHZvbHVtZSk7Ci0gICAgcmV0dXJuIGphdmFUb05hdGl2ZVN0YXR1cyhyZXN1bHQpOwotfQotCi1zdGF0dXNfdCBKQXVkaW9UcmFjazo6c3RhcnQoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgam1ldGhvZElEIGpQbGF5ID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgInBsYXkiLCAiKClWIik7Ci0gICAgLy8gVE9ETzogU2hvdWxkIHdlIGNhdGNoIHRoZSBKYXZhIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBmcm9tIHBsYXkoKT8KLSAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqUGxheSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zc2l6ZV90IEpBdWRpb1RyYWNrOjp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGJsb2NraW5nKSB7Ci0gICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgamJ5dGVBcnJheSBqQXVkaW9EYXRhID0gZW52LT5OZXdCeXRlQXJyYXkoc2l6ZSk7Ci0gICAgZW52LT5TZXRCeXRlQXJyYXlSZWdpb24oakF1ZGlvRGF0YSwgMCwgc2l6ZSwgKGpieXRlICopIGJ1ZmZlcik7Ci0KLSAgICBqY2xhc3MgakJ5dGVCdWZmZXJDbHMgPSBlbnYtPkZpbmRDbGFzcygiamF2YS9uaW8vQnl0ZUJ1ZmZlciIpOwotICAgIGptZXRob2RJRCBqV3JhcCA9IGVudi0+R2V0U3RhdGljTWV0aG9kSUQoakJ5dGVCdWZmZXJDbHMsICJ3cmFwIiwgIihbQilMamF2YS9uaW8vQnl0ZUJ1ZmZlcjsiKTsKLSAgICBqb2JqZWN0IGpCeXRlQnVmZmVyT2JqID0gZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKGpCeXRlQnVmZmVyQ2xzLCBqV3JhcCwgakF1ZGlvRGF0YSk7Ci0KLSAgICBpbnQgd3JpdGVNb2RlID0gMDsKLSAgICBpZiAoYmxvY2tpbmcpIHsKLSAgICAgICAgamZpZWxkSUQgaldyaXRlQmxvY2tpbmcgPSBlbnYtPkdldFN0YXRpY0ZpZWxkSUQobUF1ZGlvVHJhY2tDbHMsICJXUklURV9CTE9DS0lORyIsICJJIik7Ci0gICAgICAgIHdyaXRlTW9kZSA9IGVudi0+R2V0U3RhdGljSW50RmllbGQobUF1ZGlvVHJhY2tDbHMsIGpXcml0ZUJsb2NraW5nKTsKLSAgICB9IGVsc2UgewotICAgICAgICBqZmllbGRJRCBqV3JpdGVOb25CbG9ja2luZyA9IGVudi0+R2V0U3RhdGljRmllbGRJRCgKLSAgICAgICAgICAgICAgICBtQXVkaW9UcmFja0NscywgIldSSVRFX05PTl9CTE9DS0lORyIsICJJIik7Ci0gICAgICAgIHdyaXRlTW9kZSA9IGVudi0+R2V0U3RhdGljSW50RmllbGQobUF1ZGlvVHJhY2tDbHMsIGpXcml0ZU5vbkJsb2NraW5nKTsKLSAgICB9Ci0KLSAgICBqbWV0aG9kSUQgaldyaXRlID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgIndyaXRlIiwgIihMamF2YS9uaW8vQnl0ZUJ1ZmZlcjtJSSlJIik7Ci0gICAgaW50IHJlc3VsdCA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgaldyaXRlLCBqQnl0ZUJ1ZmZlck9iaiwgc2l6ZSwgd3JpdGVNb2RlKTsKLQotICAgIGlmIChyZXN1bHQgPj0gMCkgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBqYXZhVG9OYXRpdmVTdGF0dXMocmVzdWx0KTsKLSAgICB9Ci19Ci0KLXZvaWQgSkF1ZGlvVHJhY2s6OnN0b3AoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgam1ldGhvZElEIGpTdG9wID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgInN0b3AiLCAiKClWIik7Ci0gICAgZW52LT5DYWxsVm9pZE1ldGhvZChtQXVkaW9UcmFja09iaiwgalN0b3ApOwotICAgIC8vIFRPRE86IFNob3VsZCB3ZSBjYXRjaCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24/Ci19Ci0KLS8vIFRPRE86IElzIHRoZSByaWdodCBpbXBsZW1lbnRhdGlvbj8KLWJvb2wgSkF1ZGlvVHJhY2s6OnN0b3BwZWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuICFpc1BsYXlpbmcoKTsKLX0KLQotdm9pZCBKQXVkaW9UcmFjazo6Zmx1c2goKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgam1ldGhvZElEIGpGbHVzaCA9IGVudi0+R2V0TWV0aG9kSUQobUF1ZGlvVHJhY2tDbHMsICJmbHVzaCIsICIoKVYiKTsKLSAgICBlbnYtPkNhbGxWb2lkTWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqRmx1c2gpOwotfQotCi12b2lkIEpBdWRpb1RyYWNrOjpwYXVzZSgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqbWV0aG9kSUQgalBhdXNlID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgInBhdXNlIiwgIigpViIpOwotICAgIGVudi0+Q2FsbFZvaWRNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpQYXVzZSk7Ci0gICAgLy8gVE9ETzogU2hvdWxkIHdlIGNhdGNoIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbj8KLX0KLQotYm9vbCBKQXVkaW9UcmFjazo6aXNQbGF5aW5nKCkgY29uc3QgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGptZXRob2RJRCBqR2V0UGxheVN0YXRlID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldFBsYXlTdGF0ZSIsICIoKUkiKTsKLSAgICBpbnQgY3VycmVudFBsYXlTdGF0ZSA9IGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFBsYXlTdGF0ZSk7Ci0KLSAgICAvLyBUT0RPOiBJbiBKYXZhIEF1ZGlvVHJhY2ssIHRoZXJlIGlzIG5vIFNUT1BQSU5HIHN0YXRlLgotICAgIC8vIFRoaXMgbWVhbnMgd2hpbGUgc3RvcHBpbmcsIGlzUGxheWluZygpIHdpbGwgcmV0dXJuIGRpZmZlcmVudCB2YWx1ZSBpbiB0d28gY2xhc3MuCi0gICAgLy8gIC0gaW4gZXhpc3RpbmcgbmF0aXZlIEF1ZGlvVHJhY2s6IHRydWUKLSAgICAvLyAgLSBpbiBKQXVkaW9UcmFjazogZmFsc2UKLSAgICAvLyBJZiBub3Qgb2theSwgYWxzbyBtb2RpZnkgdGhlIGltcGxlbWVudGF0aW9uIG9mIHN0b3BwZWQoKS4KLSAgICBqZmllbGRJRCBqUGxheVN0YXRlUGxheWluZyA9IGVudi0+R2V0U3RhdGljRmllbGRJRChtQXVkaW9UcmFja0NscywgIlBMQVlTVEFURV9QTEFZSU5HIiwgIkkiKTsKLSAgICBpbnQgc3RhdGVQbGF5aW5nID0gZW52LT5HZXRTdGF0aWNJbnRGaWVsZChtQXVkaW9UcmFja0NscywgalBsYXlTdGF0ZVBsYXlpbmcpOwotICAgIHJldHVybiBjdXJyZW50UGxheVN0YXRlID09IHN0YXRlUGxheWluZzsKLX0KLQotdWludDMyX3QgSkF1ZGlvVHJhY2s6OmdldFNhbXBsZVJhdGUoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgam1ldGhvZElEIGpHZXRTYW1wbGVSYXRlID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldFNhbXBsZVJhdGUiLCAiKClJIik7Ci0gICAgcmV0dXJuIGVudi0+Q2FsbEludE1ldGhvZChtQXVkaW9UcmFja09iaiwgakdldFNhbXBsZVJhdGUpOwotfQotCi1zdGF0dXNfdCBKQXVkaW9UcmFjazo6Z2V0QnVmZmVyRHVyYXRpb25JblVzKGludDY0X3QgKmR1cmF0aW9uKSB7Ci0gICAgaWYgKGR1cmF0aW9uID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqbWV0aG9kSUQgakdldEJ1ZmZlclNpemVJbkZyYW1lcyA9IGVudi0+R2V0TWV0aG9kSUQoCi0gICAgICAgICAgICBtQXVkaW9UcmFja0NscywgImdldEJ1ZmZlclNpemVJbkZyYW1lcyIsICIoKUkiKTsKLSAgICBpbnQgYnVmZmVyU2l6ZUluRnJhbWVzID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0QnVmZmVyU2l6ZUluRnJhbWVzKTsKLQotICAgIGNvbnN0IGRvdWJsZSBzZWNvbmRUb01pY3JvID0gMTAwMDAwMExMOyAvLyAxRTYKLSAgICBpbnQgc2FtcGxlUmF0ZSA9IEpBdWRpb1RyYWNrOjpnZXRTYW1wbGVSYXRlKCk7Ci0gICAgZmxvYXQgc3BlZWQgPSBKQXVkaW9UcmFjazo6Z2V0UGxheWJhY2tSYXRlKCkubVNwZWVkOwotCi0gICAgKmR1cmF0aW9uID0gKGludDY0X3QpIChidWZmZXJTaXplSW5GcmFtZXMgKiBzZWNvbmRUb01pY3JvIC8gKHNhbXBsZVJhdGUgKiBzcGVlZCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotYXVkaW9fZm9ybWF0X3QgSkF1ZGlvVHJhY2s6OmZvcm1hdCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqbWV0aG9kSUQgakdldEF1ZGlvRm9ybWF0ID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldEF1ZGlvRm9ybWF0IiwgIigpSSIpOwotICAgIGludCBqYXZhRm9ybWF0ID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0QXVkaW9Gb3JtYXQpOwotICAgIHJldHVybiBhdWRpb0Zvcm1hdFRvTmF0aXZlKGphdmFGb3JtYXQpOwotfQotCi1zdGF0dXNfdCBKQXVkaW9UcmFjazo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpIGNvbnN0Ci17Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICByZXN1bHQuYXBwZW5kKCIgSkF1ZGlvVHJhY2s6OmR1bXBcbiIpOwotCi0gICAgLy8gVE9ETzogUmVtb3ZlIGxvZ3MgdGhhdCBpbmNsdWRlcyB1bmF2YWlsYWJsZSBpbmZvcm1hdGlvbiBmcm9tIGJlbG93LgotLy8gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBzdGF0dXMoJWQpLCBzdGF0ZSglZCksIHNlc3Npb24gSWQoJWQpLCBmbGFncyglI3gpXG4iLAotLy8gICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHVzLCBtU3RhdGUsIG1TZXNzaW9uSWQsIG1GbGFncyk7Ci0vLyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIHN0cmVhbSB0eXBlKCVkKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSglZiwgJWYpXG4iLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAobVN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0RFRkFVTFQpID8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKCZtQXR0cmlidXRlcykgOiBtU3RyZWFtVHlwZSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgbVZvbHVtZVtBVURJT19JTlRFUkxFQVZFX0xFRlRdLCBtVm9sdW1lW0FVRElPX0lOVEVSTEVBVkVfUklHSFRdKTsKLS8vICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgZm9ybWF0KCUjeCksIGNoYW5uZWwgbWFzayglI3gpLCBjaGFubmVsIGNvdW50KCV1KVxuIiwKLS8vICAgICAgICAgICAgICAgICAgZm9ybWF0KCksIG1DaGFubmVsTWFzaywgY2hhbm5lbENvdW50KCkpOwotLy8gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBzYW1wbGUgcmF0ZSgldSksIG9yaWdpbmFsIHNhbXBsZSByYXRlKCV1KSwgc3BlZWQoJWYpXG4iLAotLy8gICAgICAgICAgICBnZXRTYW1wbGVSYXRlKCksIG1PcmlnaW5hbFNhbXBsZVJhdGUsIG1QbGF5YmFja1JhdGUubVNwZWVkKTsKLS8vICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgZnJhbWUgY291bnQoJXp1KSwgcmVxLiBmcmFtZSBjb3VudCglenUpXG4iLAotLy8gICAgICAgICAgICAgICAgICBmcmFtZUNvdW50KCksIG1SZXFGcmFtZUNvdW50KTsKLS8vICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgbm90aWYuIGZyYW1lIGNvdW50KCV1KSwgcmVxLiBub3RpZi4gZnJhbWUgY291bnQoJXUpLCIKLS8vICAgICAgICAgICAgIiByZXEuIG5vdGlmLiBwZXIgYnVmZigldSlcbiIsCi0vLyAgICAgICAgICAgICBtTm90aWZpY2F0aW9uRnJhbWVzQWN0LCBtTm90aWZpY2F0aW9uRnJhbWVzUmVxLCBtTm90aWZpY2F0aW9uc1BlckJ1ZmZlclJlcSk7Ci0vLyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgIGxhdGVuY3kgKCVkKSwgc2VsZWN0ZWQgZGV2aWNlIElkKCVkKSwgcm91dGVkIGRldmljZSBJZCglZClcbiIsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIGxhdGVuY3koKSwgbVNlbGVjdGVkRGV2aWNlSWQsIGdldFJvdXRlZERldmljZUlkKCkpOwotLy8gICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBvdXRwdXQoJWQpIEFGIGxhdGVuY3kgKCV1KSBBRiBmcmFtZSBjb3VudCglenUpIEFGIFNhbXBsZVJhdGUoJXUpXG4iLAotLy8gICAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0LCBtQWZMYXRlbmN5LCBtQWZGcmFtZUNvdW50LCBtQWZTYW1wbGVSYXRlKTsKLSAgICA6OndyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotYXVkaW9fcG9ydF9oYW5kbGVfdCBKQXVkaW9UcmFjazo6Z2V0Um91dGVkRGV2aWNlSWQoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgam1ldGhvZElEIGpHZXRSb3V0ZWREZXZpY2UgPSBlbnYtPkdldE1ldGhvZElEKG1BdWRpb1RyYWNrQ2xzLCAiZ2V0Um91dGVkRGV2aWNlIiwKLSAgICAgICAgICAgICIoKUxhbmRyb2lkL21lZGlhL0F1ZGlvRGV2aWNlSW5mbzsiKTsKLSAgICBqb2JqZWN0IGpBdWRpb0RldmljZUluZm9PYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QobUF1ZGlvVHJhY2tPYmosIGpHZXRSb3V0ZWREZXZpY2UpOwotICAgIGlmIChlbnYtPklzU2FtZU9iamVjdChqQXVkaW9EZXZpY2VJbmZvT2JqLCBOVUxMKSkgewotICAgICAgICByZXR1cm4gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICB9Ci0KLSAgICBqY2xhc3MgakF1ZGlvRGV2aWNlSW5mb0NscyA9IGVudi0+RmluZENsYXNzKCJMYW5kcm9pZC9tZWRpYS9BdWRpb0RldmljZUluZm8iKTsKLSAgICBqbWV0aG9kSUQgakdldElkID0gZW52LT5HZXRNZXRob2RJRChqQXVkaW9EZXZpY2VJbmZvQ2xzLCAiZ2V0SWQiLCAiKClJIik7Ci0gICAgamludCByb3V0ZWREZXZpY2VJZCA9IGVudi0+Q2FsbEludE1ldGhvZChqQXVkaW9EZXZpY2VJbmZvT2JqLCBqR2V0SWQpOwotICAgIHJldHVybiByb3V0ZWREZXZpY2VJZDsKLX0KLQotYXVkaW9fc2Vzc2lvbl90IEpBdWRpb1RyYWNrOjpnZXRBdWRpb1Nlc3Npb25JZCgpIHsKLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLSAgICBqbWV0aG9kSUQgakdldEF1ZGlvU2Vzc2lvbklkID0gZW52LT5HZXRNZXRob2RJRChtQXVkaW9UcmFja0NscywgImdldEF1ZGlvU2Vzc2lvbklkIiwgIigpSSIpOwotICAgIGppbnQgc2Vzc2lvbklkID0gZW52LT5DYWxsSW50TWV0aG9kKG1BdWRpb1RyYWNrT2JqLCBqR2V0QXVkaW9TZXNzaW9uSWQpOwotICAgIHJldHVybiAoYXVkaW9fc2Vzc2lvbl90KSBzZXNzaW9uSWQ7Ci19Ci0KLXN0YXR1c190IEpBdWRpb1RyYWNrOjpzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGpjbGFzcyBqTVAySW1wbENscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL01lZGlhUGxheWVyMkltcGwiKTsKLSAgICBqbWV0aG9kSUQgalNldEF1ZGlvT3V0cHV0RGV2aWNlQnlJZCA9IGVudi0+R2V0TWV0aG9kSUQoCi0gICAgICAgICAgICBqTVAySW1wbENscywgInNldEF1ZGlvT3V0cHV0RGV2aWNlQnlJZCIsICIoTGFuZHJvaWQvbWVkaWEvQXVkaW9UcmFjaztJKVoiKTsKLSAgICBqYm9vbGVhbiByZXN1bHQgPSBlbnYtPkNhbGxTdGF0aWNCb29sZWFuTWV0aG9kKAotICAgICAgICAgICAgak1QMkltcGxDbHMsIGpTZXRBdWRpb091dHB1dERldmljZUJ5SWQsIG1BdWRpb1RyYWNrT2JqLCBkZXZpY2VJZCk7Ci0gICAgcmV0dXJuIHJlc3VsdCA9PSB0cnVlID8gTk9fRVJST1IgOiBCQURfVkFMVUU7Ci19Ci0KLXN0YXR1c190IEpBdWRpb1RyYWNrOjpwZW5kaW5nRHVyYXRpb24oaW50MzJfdCAqbXNlYykgewotICAgIGlmIChtc2VjID09IG51bGxwdHIpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBib29sIGlzUHVyZVBjbURhdGEgPSBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCgpKSAmJiAoZ2V0RmxhZ3MoKSAmIEFVRElPX0ZMQUdfSFdfQVZfU1lOQykgPT0gMDsKLSAgICBpZiAoIWlzUHVyZVBjbURhdGEpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIC8vIFRPRE86IE5lZWQgdG8ga25vdyB0aGUgZGlmZmVyZW5jZSBidHcuIGNsaWVudCBhbmQgc2VydmVyIHRpbWUuCi0gICAgLy8gSWYgZ2V0VGltZXN0YW1wKEV4dGVuZGVkVGltZXN0YW1wKSBpcyByZWFkeSwgYW5kIHVuLWNvbW1lbnQgYmVsb3cgYW5kIG1vZGlmeSBhcHByb3ByaWF0ZWx5LgotICAgIC8vIChjb3BpZWQgZnJvbSBBdWRpb1RyYWNrLmNwcCkKLQotLy8gICAgRXh0ZW5kZWRUaW1lc3RhbXAgZXRzOwotLy8gICAgRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OIGxvY2F0aW9uID0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUjsKLS8vICAgIGlmIChnZXRUaW1lc3RhbXBfbCgmZXRzKSA9PSBPSyAmJiBldHMubVRpbWVOc1tsb2NhdGlvbl0gPiAwKSB7Ci0vLyAgICAgICAgaW50NjRfdCBkaWZmID0gZXRzLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fQ0xJRU5UXQotLy8gICAgICAgICAgICAgICAgLSBldHMubVBvc2l0aW9uW2xvY2F0aW9uXTsKLS8vICAgICAgICBpZiAoZGlmZiA8IDApIHsKLS8vICAgICAgICAgICAgKm1zZWMgPSAwOwotLy8gICAgICAgIH0gZWxzZSB7Ci0vLyAgICAgICAgICAgIC8vIG1zIGlzIHRoZSBwbGF5YmFjayB0aW1lIGJ5IGZyYW1lcwotLy8gICAgICAgICAgICBpbnQ2NF90IG1zID0gKGludDY0X3QpKChkb3VibGUpZGlmZiAqIDEwMDAgLwotLy8gICAgICAgICAgICAgICAgICAgICgoZG91YmxlKW1TYW1wbGVSYXRlICogbVBsYXliYWNrUmF0ZS5tU3BlZWQpKTsKLS8vICAgICAgICAgICAgLy8gY2xvY2tkaWZmIGlzIHRoZSB0aW1lc3RhbXAgYWdlIChuZWdhdGl2ZSkKLS8vICAgICAgICAgICAgaW50NjRfdCBjbG9ja2RpZmYgPSAobVN0YXRlICE9IFNUQVRFX0FDVElWRSkgPyAwIDoKLS8vICAgICAgICAgICAgICAgICAgICBldHMubVRpbWVOc1tsb2NhdGlvbl0KLS8vICAgICAgICAgICAgICAgICAgICArIGV0cy5tVGltZWJhc2VPZmZzZXRbRXh0ZW5kZWRUaW1lc3RhbXA6OlRJTUVCQVNFX01PTk9UT05JQ10KLS8vICAgICAgICAgICAgICAgICAgICAtIHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLS8vCi0vLyAgICAgICAgICAgIC8vQUxPR1YoIm1zOiAlbGxkICBjbG9ja2RpZmY6ICVsbGQiLCAobG9uZyBsb25nKW1zLCAobG9uZyBsb25nKWNsb2NrZGlmZik7Ci0vLyAgICAgICAgICAgIHN0YXRpYyBjb25zdCBpbnQgTkFOT1NfUEVSX01JTExJUyA9IDEwMDAwMDA7Ci0vLyAgICAgICAgICAgICptc2VjID0gKGludDMyX3QpKG1zICsgY2xvY2tkaWZmIC8gTkFOT1NfUEVSX01JTExJUyk7Ci0vLyAgICAgICAgfQotLy8gICAgICAgIHJldHVybiBOT19FUlJPUjsKLS8vICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soCi0gICAgICAgIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2sgX191bnVzZWQpIHsKLSAgICAvLyBUT0RPOiBJbXBsZW1lbnQgdGhpcyBhZnRlciBhcHByb3ByaWF0ZSBKYXZhIEF1ZGlvVHJhY2sgbWV0aG9kIGlzIGF2YWlsYWJsZS4KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEpBdWRpb1RyYWNrOjpyZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKAotICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrIF9fdW51c2VkKSB7Ci0gICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMgYWZ0ZXIgYXBwcm9wcmlhdGUgSmF2YSBBdWRpb1RyYWNrIG1ldGhvZCBpcyBhdmFpbGFibGUuCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLy8gICAgICAgICAgICAgICAgUHJpdmF0ZSBtZXRob2QgYmVnaW5zICAgICAgICAgICAgICAgICAgLy8vCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLWpvYmplY3QgSkF1ZGlvVHJhY2s6OmNyZWF0ZVZvbHVtZVNoYXBlckNvbmZpZ3VyYXRpb25PYmooCi0gICAgICAgIGNvbnN0IHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24+JiBjb25maWcpIHsKLQotICAgIC8vIFRPRE86IEphdmEgVm9sdW1lU2hhcGVyJ3Mgc2V0SWQoKSAvIHNldE9wdGlvbkZsYWdzKCkgYXJlIGhpZGRlbi4KLSAgICBpZiAoY29uZmlnID09IE5VTEwgfHwgY29uZmlnLT5nZXRUeXBlKCkgPT0gbWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbjo6VFlQRV9JRCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLQotICAgIC8vIFJlZmVyZW5jZWQgImFuZHJvaWRfbWVkaWFfVm9sdW1lU2hhcGVyLmgiLgotICAgIGpmbG9hdEFycmF5IHhhcnJheSA9IG51bGxwdHI7Ci0gICAgamZsb2F0QXJyYXkgeWFycmF5ID0gbnVsbHB0cjsKLSAgICBpZiAoY29uZmlnLT5nZXRUeXBlKCkgPT0gbWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbjo6VFlQRV9TQ0FMRSkgewotICAgICAgICAvLyBjb252ZXJ0IGN1cnZlIGFycmF5cwotICAgICAgICB4YXJyYXkgPSBlbnYtPk5ld0Zsb2F0QXJyYXkoY29uZmlnLT5zaXplKCkpOwotICAgICAgICB5YXJyYXkgPSBlbnYtPk5ld0Zsb2F0QXJyYXkoY29uZmlnLT5zaXplKCkpOwotICAgICAgICBmbG9hdCAqIGNvbnN0IHggPSBlbnYtPkdldEZsb2F0QXJyYXlFbGVtZW50cyh4YXJyYXksIG51bGxwdHIgLyogaXNDb3B5ICovKTsKLSAgICAgICAgZmxvYXQgKiBjb25zdCB5ID0gZW52LT5HZXRGbG9hdEFycmF5RWxlbWVudHMoeWFycmF5LCBudWxscHRyIC8qIGlzQ29weSAqLyk7Ci0gICAgICAgIGZsb2F0ICp4cHRyID0geCwgKnlwdHIgPSB5OwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnB0IDogKmNvbmZpZy5nZXQoKSkgewotICAgICAgICAgICAgKnhwdHIrKyA9IHB0LmZpcnN0OwotICAgICAgICAgICAgKnlwdHIrKyA9IHB0LnNlY29uZDsKLSAgICAgICAgfQotICAgICAgICBlbnYtPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoeGFycmF5LCB4LCAwIC8qIG1vZGUgKi8pOwotICAgICAgICBlbnYtPlJlbGVhc2VGbG9hdEFycmF5RWxlbWVudHMoeWFycmF5LCB5LCAwIC8qIG1vZGUgKi8pOwotICAgIH0KLQotICAgIGpjbGFzcyBqQnVpbGRlckNscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciRDb25maWd1cmF0aW9uJEJ1aWxkZXIiKTsKLSAgICBqbWV0aG9kSUQgakJ1aWxkZXJDdG9yID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgIjxpbml0PiIsICIoKVYiKTsKLSAgICBqb2JqZWN0IGpCdWlsZGVyT2JqID0gZW52LT5OZXdPYmplY3QoakJ1aWxkZXJDbHMsIGpCdWlsZGVyQ3Rvcik7Ci0KLSAgICBqbWV0aG9kSUQgalNldER1cmF0aW9uID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldER1cmF0aW9uIiwKLSAgICAgICAgICAgICIoTClMYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIkQ29uZmlndXJhdGlvbiRCdWlsZGVyOyIpOwotICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyQ2xzLCBqU2V0RHVyYXRpb24sIChqbG9uZykgY29uZmlnLT5nZXREdXJhdGlvbk1zKCkpOwotCi0gICAgam1ldGhvZElEIGpTZXRJbnRlcnBvbGF0b3JUeXBlID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldEludGVycG9sYXRvclR5cGUiLAotICAgICAgICAgICAgIihJKUxhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciRDb25maWd1cmF0aW9uJEJ1aWxkZXI7Iik7Ci0gICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJDbHMsIGpTZXRJbnRlcnBvbGF0b3JUeXBlLAotICAgICAgICAgICAgY29uZmlnLT5nZXRJbnRlcnBvbGF0b3JUeXBlKCkpOwotCi0gICAgam1ldGhvZElEIGpTZXRDdXJ2ZSA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJzZXRDdXJ2ZSIsCi0gICAgICAgICAgICAiKFtGW0YpTGFuZHJvaWQvbWVkaWEvVm9sdW1lU2hhcGVyJENvbmZpZ3VyYXRpb24kQnVpbGRlcjsiKTsKLSAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlckNscywgalNldEN1cnZlLCB4YXJyYXksIHlhcnJheSk7Ci0KLSAgICBqbWV0aG9kSUQgakJ1aWxkID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgImJ1aWxkIiwKLSAgICAgICAgICAgICIoKUxhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciRDb25maWd1cmF0aW9uOyIpOwotICAgIHJldHVybiBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJPYmosIGpCdWlsZCk7Ci19Ci0KLWpvYmplY3QgSkF1ZGlvVHJhY2s6OmNyZWF0ZVZvbHVtZVNoYXBlck9wZXJhdGlvbk9iaigKLSAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSB7Ci0KLSAgICBKTklFbnYgKmVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKLQotICAgIGpjbGFzcyBqQnVpbGRlckNscyA9IGVudi0+RmluZENsYXNzKCJhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciRPcGVyYXRpb24kQnVpbGRlciIpOwotICAgIGptZXRob2RJRCBqQnVpbGRlckN0b3IgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiPGluaXQ+IiwgIigpViIpOwotICAgIGpvYmplY3QgakJ1aWxkZXJPYmogPSBlbnYtPk5ld09iamVjdChqQnVpbGRlckNscywgakJ1aWxkZXJDdG9yKTsKLQotICAgIC8vIFNldCBYT2Zmc2V0Ci0gICAgam1ldGhvZElEIGpTZXRYT2Zmc2V0ID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInNldFhPZmZzZXQiLAotICAgICAgICAgICAgIihGKUxhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciRPcGVyYXRpb24kQnVpbGRlcjsiKTsKLSAgICBqQnVpbGRlck9iaiA9IGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlckNscywgalNldFhPZmZzZXQsIG9wZXJhdGlvbi0+Z2V0WE9mZnNldCgpKTsKLQotICAgIGludDMyX3QgZmxhZ3MgPSBvcGVyYXRpb24tPmdldEZsYWdzKCk7Ci0KLSAgICBpZiAob3BlcmF0aW9uLT5nZXRSZXBsYWNlSWQoKSA+PSAwKSB7Ci0gICAgICAgIGptZXRob2RJRCBqUmVwbGFjZSA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJyZXBsYWNlIiwKLSAgICAgICAgICAgICAgICAiKElCKUxhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciRPcGVyYXRpb24kQnVpbGRlcjsiKTsKLSAgICAgICAgYm9vbCBqb2luID0gKGZsYWdzIHwgbWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uOjpGTEFHX0pPSU4pICE9IDA7Ci0gICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyQ2xzLCBqUmVwbGFjZSwgb3BlcmF0aW9uLT5nZXRSZXBsYWNlSWQoKSwgam9pbik7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzIHwgbWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uOjpGTEFHX1JFVkVSU0UpIHsKLSAgICAgICAgam1ldGhvZElEIGpSZXZlcnNlID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgInJldmVyc2UiLAotICAgICAgICAgICAgICAgICIoKUxhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciRPcGVyYXRpb24kQnVpbGRlcjsiKTsKLSAgICAgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJDbHMsIGpSZXZlcnNlKTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBWb2x1bWVTaGFwZXIgSmF2YWRvYyBzYXlzICJEbyBub3QgY2FsbCB0ZXJtaW5hdGUoKSBkaXJlY3RseSIuIENhbiB3ZSBjYWxsIHRoaXM/Ci0gICAgaWYgKGZsYWdzIHwgbWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uOjpGTEFHX1RFUk1JTkFURSkgewotICAgICAgICBqbWV0aG9kSUQgalRlcm1pbmF0ZSA9IGVudi0+R2V0TWV0aG9kSUQoakJ1aWxkZXJDbHMsICJ0ZXJtaW5hdGUiLAotICAgICAgICAgICAgICAgICIoKUxhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciRPcGVyYXRpb24kQnVpbGRlcjsiKTsKLSAgICAgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJDbHMsIGpUZXJtaW5hdGUpOwotICAgIH0KLQotICAgIGlmIChmbGFncyB8IG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbjo6RkxBR19ERUxBWSkgewotICAgICAgICBqbWV0aG9kSUQgakRlZmVyID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgImRlZmVyIiwKLSAgICAgICAgICAgICAgICAiKClMYW5kcm9pZC9tZWRpYS9Wb2x1bWVTaGFwZXIkT3BlcmF0aW9uJEJ1aWxkZXI7Iik7Ci0gICAgICAgIGpCdWlsZGVyT2JqID0gZW52LT5DYWxsT2JqZWN0TWV0aG9kKGpCdWlsZGVyQ2xzLCBqRGVmZXIpOwotICAgIH0KLQotICAgIGlmIChmbGFncyB8IG1lZGlhOjpWb2x1bWVTaGFwZXI6Ok9wZXJhdGlvbjo6RkxBR19DUkVBVEVfSUZfTkVDRVNTQVJZKSB7Ci0gICAgICAgIGptZXRob2RJRCBqQ3JlYXRlSWZOZWVkZWQgPSBlbnYtPkdldE1ldGhvZElEKGpCdWlsZGVyQ2xzLCAiY3JlYXRlSWZOZWVkZWQiLAotICAgICAgICAgICAgICAgICIoKUxhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciRPcGVyYXRpb24kQnVpbGRlcjsiKTsKLSAgICAgICAgakJ1aWxkZXJPYmogPSBlbnYtPkNhbGxPYmplY3RNZXRob2QoakJ1aWxkZXJDbHMsIGpDcmVhdGVJZk5lZWRlZCk7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogSGFuZGxlIGVycm9yIGNhc2UgKGNhbiBpdCBiZSBOVUxMPykKLSAgICBqbWV0aG9kSUQgakJ1aWxkID0gZW52LT5HZXRNZXRob2RJRChqQnVpbGRlckNscywgImJ1aWxkIiwKLSAgICAgICAgICAgICIoKUxhbmRyb2lkL21lZGlhL1ZvbHVtZVNoYXBlciRPcGVyYXRpb247Iik7Ci0gICAgcmV0dXJuIGVudi0+Q2FsbE9iamVjdE1ldGhvZChqQnVpbGRlck9iaiwgakJ1aWxkKTsKLX0KLQotam9iamVjdCBKQXVkaW9UcmFjazo6Y3JlYXRlU3RyZWFtRXZlbnRDYWxsYmFjayhjYWxsYmFja190IGNiZiwgdm9pZCogdXNlcikgewotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGpjbGFzcyBqQ2FsbGJhY2tDbHMgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjJJbXBsJFN0cmVhbUV2ZW50Q2FsbGJhY2siKTsKLSAgICBqbWV0aG9kSUQgakNhbGxiYWNrQ3RvciA9IGVudi0+R2V0TWV0aG9kSUQoakNhbGxiYWNrQ2xzLCAiPGluaXQ+IiwgIihKSkopViIpOwotICAgIGpvYmplY3QgakNhbGxiYWNrT2JqID0gZW52LT5OZXdPYmplY3QoakNhbGxiYWNrQ2xzLCBqQ2FsbGJhY2tDdG9yLCB0aGlzLCBjYmYsIHVzZXIpOwotICAgIHJldHVybiBqQ2FsbGJhY2tPYmo7Ci19Ci0KLWpvYmplY3QgSkF1ZGlvVHJhY2s6OmNyZWF0ZUNhbGxiYWNrRXhlY3V0b3IoKSB7Ci0gICAgSk5JRW52ICplbnYgPSBBbmRyb2lkUnVudGltZTo6Z2V0Sk5JRW52KCk7Ci0gICAgamNsYXNzIGpFeGVjdXRvcnNDbHMgPSBlbnYtPkZpbmRDbGFzcygiamF2YS91dGlsL2NvbmN1cnJlbnQvRXhlY3V0b3JzIik7Ci0gICAgam1ldGhvZElEIGpOZXdTaW5nbGVUaHJlYWRFeGVjdXRvciA9IGVudi0+R2V0U3RhdGljTWV0aG9kSUQoakV4ZWN1dG9yc0NscywKLSAgICAgICAgICAgICJuZXdTaW5nbGVUaHJlYWRFeGVjdXRvciIsICIoKUxqYXZhL3V0aWwvY29uY3VycmVudC9FeGVjdXRvclNlcnZpY2U7Iik7Ci0gICAgam9iamVjdCBqU2luZ2xlVGhyZWFkRXhlY3V0b3JPYmogPQotICAgICAgICAgICAgZW52LT5DYWxsU3RhdGljT2JqZWN0TWV0aG9kKGpFeGVjdXRvcnNDbHMsIGpOZXdTaW5nbGVUaHJlYWRFeGVjdXRvcik7Ci0gICAgcmV0dXJuIGpTaW5nbGVUaHJlYWRFeGVjdXRvck9iajsKLX0KLQotc3RhdHVzX3QgSkF1ZGlvVHJhY2s6OmphdmFUb05hdGl2ZVN0YXR1cyhpbnQgamF2YVN0YXR1cykgewotICAgIHN3aXRjaCAoamF2YVN0YXR1cykgewotICAgIGNhc2UgQVVESU9fSkFWQV9TVUNDRVNTOgotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgY2FzZSBBVURJT19KQVZBX0JBRF9WQUxVRToKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICBjYXNlIEFVRElPX0pBVkFfSU5WQUxJRF9PUEVSQVRJT046Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBjYXNlIEFVRElPX0pBVkFfUEVSTUlTU0lPTl9ERU5JRUQ6Ci0gICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICBjYXNlIEFVRElPX0pBVkFfTk9fSU5JVDoKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgY2FzZSBBVURJT19KQVZBX1dPVUxEX0JMT0NLOgotICAgICAgICByZXR1cm4gV09VTERfQkxPQ0s7Ci0gICAgY2FzZSBBVURJT19KQVZBX0RFQURfT0JKRUNUOgotICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYThlMWQxZi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsNzI3ICswLDAgQEAKLS8qCi0qKgotKiogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQiCi0jaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkF1ZGlvT3V0cHV0Lmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPiAvLyBmb3IgcHJvcGVydHlfZ2V0Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeUhlbHBlci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVHJhY2suaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotCi1uYW1lc3BhY2UgewotCi1jb25zdCBmbG9hdCBrTWF4UmVxdWlyZWRTcGVlZCA9IDguMGY7IC8vIGZvciBQQ00gdHJhY2tzIGFsbG93IHVwIHRvIDh4IHNwZWVkdXAuCi0KLX0gLy8gYW5vbnltb3VzIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIFRPRE86IEZpbmQgcmVhbCBjYXVzZSBvZiBBdWRpby9WaWRlbyBkZWxheSBpbiBQViBmcmFtZXdvcmsgYW5kIHJlbW92ZSB0aGlzIHdvcmthcm91bmQKLS8qIHN0YXRpYyAqLyBpbnQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6Om1NaW5CdWZmZXJDb3VudCA9IDQ7Ci0vKiBzdGF0aWMgKi8gYm9vbCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6bUlzT25FbXVsYXRvciA9IGZhbHNlOwotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0IHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHJlc3VsdC5hcHBlbmQoIiBNZWRpYVBsYXllcjJBdWRpb091dHB1dFxuIik7Ci0gICAgc25wcmludGYoYnVmZmVyLCAyNTUsICIgIHN0cmVhbSB0eXBlKCVkKSwgbGVmdCAtIHJpZ2h0IHZvbHVtZSglZiwgJWYpXG4iLAotICAgICAgICAgICAgbVN0cmVhbVR5cGUsIG1MZWZ0Vm9sdW1lLCBtUmlnaHRWb2x1bWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgbXNlYyBwZXIgZnJhbWUoJWYpLCBsYXRlbmN5ICglZClcbiIsCi0gICAgICAgICAgICBtTXNlY3NQZXJGcmFtZSwgKG1UcmFjayAhPSAwKSA/IG1UcmFjay0+bGF0ZW5jeSgpIDogLTEpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgYXV4IGVmZmVjdCBpZCglZCksIHNlbmQgbGV2ZWwgKCVmKVxuIiwKLSAgICAgICAgICAgIG1BdXhFZmZlY3RJZCwgbVNlbmRMZXZlbCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgOjp3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5kdW1wKGZkLCBhcmdzKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1NZWRpYVBsYXllcjJBdWRpb091dHB1dDo6TWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwgdWlkX3QgdWlkLCBpbnQgcGlkLAotICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIGF0dHIsIGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgZGV2aWNlQ2FsbGJhY2spCi0gICAgOiBtQ2FsbGJhY2soTlVMTCksCi0gICAgICBtQ2FsbGJhY2tDb29raWUoTlVMTCksCi0gICAgICBtQ2FsbGJhY2tEYXRhKE5VTEwpLAotICAgICAgbVN0cmVhbVR5cGUoQVVESU9fU1RSRUFNX01VU0lDKSwKLSAgICAgIG1MZWZ0Vm9sdW1lKDEuMCksCi0gICAgICBtUmlnaHRWb2x1bWUoMS4wKSwKLSAgICAgIG1QbGF5YmFja1JhdGUoQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUKSwKLSAgICAgIG1TYW1wbGVSYXRlSHooMCksCi0gICAgICBtTXNlY3NQZXJGcmFtZSgwKSwKLSAgICAgIG1GcmFtZVNpemUoMCksCi0gICAgICBtU2Vzc2lvbklkKHNlc3Npb25JZCksCi0gICAgICBtVWlkKHVpZCksCi0gICAgICBtUGlkKHBpZCksCi0gICAgICBtU2VuZExldmVsKDAuMCksCi0gICAgICBtQXV4RWZmZWN0SWQoMCksCi0gICAgICBtRmxhZ3MoQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSksCi0gICAgICBtU2VsZWN0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKLSAgICAgIG1Sb3V0ZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKLSAgICAgIG1EZXZpY2VDYWxsYmFja0VuYWJsZWQoZmFsc2UpLAotICAgICAgbURldmljZUNhbGxiYWNrKGRldmljZUNhbGxiYWNrKSB7Ci0gICAgQUxPR1YoIk1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KCVkKSIsIHNlc3Npb25JZCk7Ci0gICAgaWYgKGF0dHIgIT0gTlVMTCkgewotICAgICAgICBtQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgaWYgKG1BdHRyaWJ1dGVzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1lbWNweShtQXR0cmlidXRlcywgYXR0ciwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICAgICAgbVN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGF0dHIpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUF0dHJpYnV0ZXMgPSBOVUxMOwotICAgIH0KLQotICAgIHNldE1pbkJ1ZmZlckNvdW50KCk7Ci19Ci0KLU1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0Ojp+TWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQoKSB7Ci0gICAgY2xvc2UoKTsKLSAgICBmcmVlKG1BdHRyaWJ1dGVzKTsKLSAgICBkZWxldGUgbUNhbGxiYWNrRGF0YTsKLX0KLQotLy9zdGF0aWMKLXZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldE1pbkJ1ZmZlckNvdW50KCkgewotICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJyby5rZXJuZWwucWVtdSIsIHZhbHVlLCAwKSkgewotICAgICAgICBtSXNPbkVtdWxhdG9yID0gdHJ1ZTsKLSAgICAgICAgbU1pbkJ1ZmZlckNvdW50ID0gMTI7ICAvLyB0byBwcmV2ZW50IHN5c3RlbWF0aWMgYnVmZmVyIHVuZGVycnVuIGZvciBlbXVsYXRvcgotICAgIH0KLX0KLQotLy8gc3RhdGljCi1ib29sIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0Ojppc09uRW11bGF0b3IoKSB7Ci0gICAgc2V0TWluQnVmZmVyQ291bnQoKTsgIC8vIGJlbmlnbiByYWNlIHdydCBvdGhlciB0aHJlYWRzCi0gICAgcmV0dXJuIG1Jc09uRW11bGF0b3I7Ci19Ci0KLS8vIHN0YXRpYwotaW50IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRNaW5CdWZmZXJDb3VudCgpIHsKLSAgICBzZXRNaW5CdWZmZXJDb3VudCgpOyAgLy8gYmVuaWduIHJhY2Ugd3J0IG90aGVyIHRocmVhZHMKLSAgICByZXR1cm4gbU1pbkJ1ZmZlckNvdW50OwotfQotCi1zc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpidWZmZXJTaXplKCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtVHJhY2stPmZyYW1lQ291bnQoKSAqIG1GcmFtZVNpemU7Ci19Ci0KLXNzaXplX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmZyYW1lQ291bnQoKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+ZnJhbWVDb3VudCgpOwotfQotCi1zc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpjaGFubmVsQ291bnQoKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+Y2hhbm5lbENvdW50KCk7Ci19Ci0KLXNzaXplX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmZyYW1lU2l6ZSgpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbUZyYW1lU2l6ZTsKLX0KLQotdWludDMyX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmxhdGVuY3kgKCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBtVHJhY2stPmxhdGVuY3koKTsKLX0KLQotZmxvYXQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6Om1zZWNzUGVyRnJhbWUoKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIHJldHVybiBtTXNlY3NQZXJGcmFtZTsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtVHJhY2stPmdldFBvc2l0aW9uKHBvc2l0aW9uKTsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCAmdHMpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5nZXRUaW1lc3RhbXAodHMpOwotfQotCi0vLyBUT0RPOiBSZW1vdmUgdW5uZWNlc3NhcnkgY2FsbHMgdG8gZ2V0UGxheWVkT3V0RHVyYXRpb25VcygpCi0vLyBhcyBpdCBhY3F1aXJlcyBsb2NrcyBhbmQgbWF5IHF1ZXJ5IHRoZSBhdWRpbyBkcml2ZXIuCi0vLwotLy8gU29tZSBjYWxscyBjb3VsZCBjb25jZWl2YWJseSByZXRyaWV2ZSBleHRyYXBvbGF0ZWQgZGF0YSBpbnN0ZWFkIG9mCi0vLyBhY2Nlc3NpbmcgZ2V0VGltZXN0YW1wKCkgb3IgZ2V0UG9zaXRpb24oKSBldmVyeSB0aW1lIGEgZGF0YSBidWZmZXIgd2l0aAotLy8gYSBtZWRpYSB0aW1lIGlzIHJlY2VpdmVkLgotLy8KLS8vIENhbGN1bGF0ZSBkdXJhdGlvbiBvZiBwbGF5ZWQgc2FtcGxlcyBpZiBwbGF5ZWQgYXQgbm9ybWFsIHJhdGUgKGkuZS4sIDEuMCkuCi1pbnQ2NF90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRQbGF5ZWRPdXREdXJhdGlvblVzKGludDY0X3Qgbm93VXMpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwIHx8IG1TYW1wbGVSYXRlSHogPT0gMCkgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBudW1GcmFtZXNQbGF5ZWQ7Ci0gICAgaW50NjRfdCBudW1GcmFtZXNQbGF5ZWRBdFVzOwotICAgIEF1ZGlvVGltZXN0YW1wIHRzOwotCi0gICAgc3RhdHVzX3QgcmVzID0gbVRyYWNrLT5nZXRUaW1lc3RhbXAodHMpOwotICAgIGlmIChyZXMgPT0gT0spIHsgICAgICAgICAgICAgICAgIC8vIGNhc2UgMTogbWl4aW5nIGF1ZGlvIHRyYWNrcyBhbmQgb2ZmbG9hZGVkIHRyYWNrcy4KLSAgICAgICAgbnVtRnJhbWVzUGxheWVkID0gdHMubVBvc2l0aW9uOwotICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdFVzID0gdHMubVRpbWUudHZfc2VjICogMTAwMDAwMExMICsgdHMubVRpbWUudHZfbnNlYyAvIDEwMDA7Ci0gICAgICAgIC8vQUxPR0QoImdldFRpbWVzdGFtcDogT0sgJWQgJWxsZCIsIG51bUZyYW1lc1BsYXllZCwgKGxvbmcgbG9uZyludW1GcmFtZXNQbGF5ZWRBdFVzKTsKLSAgICB9IGVsc2UgaWYgKHJlcyA9PSBXT1VMRF9CTE9DSykgeyAvLyBjYXNlIDI6IHRyYW5zaXRvcnkgc3RhdGUgb24gc3RhcnQgb2YgYSBuZXcgdHJhY2sKLSAgICAgICAgbnVtRnJhbWVzUGxheWVkID0gMDsKLSAgICAgICAgbnVtRnJhbWVzUGxheWVkQXRVcyA9IG5vd1VzOwotICAgICAgICAvL0FMT0dEKCJnZXRUaW1lc3RhbXA6IFdPVUxEX0JMT0NLICVkICVsbGQiLAotICAgICAgICAvLyAgICAgICAgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0VXMpOwotICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhc2UgMzogdHJhbnNpdG9yeSBhdCBuZXcgdHJhY2sgb3IgYXVkaW8gZmFzdCB0cmFja3MuCi0gICAgICAgIHJlcyA9IG1UcmFjay0+Z2V0UG9zaXRpb24oJm51bUZyYW1lc1BsYXllZCk7Ci0gICAgICAgIENIRUNLX0VRKHJlcywgKHN0YXR1c190KU9LKTsKLSAgICAgICAgbnVtRnJhbWVzUGxheWVkQXRVcyA9IG5vd1VzOwotICAgICAgICBudW1GcmFtZXNQbGF5ZWRBdFVzICs9IDEwMDBMTCAqIG1UcmFjay0+bGF0ZW5jeSgpIC8gMjsgLyogWFhYICovCi0gICAgICAgIC8vQUxPR0QoImdldFBvc2l0aW9uOiAldSAlbGxkIiwgbnVtRnJhbWVzUGxheWVkLCAobG9uZyBsb25nKW51bUZyYW1lc1BsYXllZEF0VXMpOwotICAgIH0KLQotICAgIC8vIENIRUNLX0VRKG51bUZyYW1lc1BsYXllZCAmICgxIDw8IDMxKSwgMCk7ICAvLyBjYW4ndCBiZSBuZWdhdGl2ZSB1bnRpbCAxMi40IGhycywgdGVzdAotICAgIC8vIFRPRE86IHJlbW92ZSB0aGUgKGludDMyX3QpIGNhc3RpbmcgYmVsb3cgYXMgaXQgbWF5IG92ZXJmbG93IGF0IDEyLjQgaG91cnMuCi0gICAgaW50NjRfdCBkdXJhdGlvblVzID0gKGludDY0X3QpKChpbnQzMl90KW51bUZyYW1lc1BsYXllZCAqIDEwMDAwMDBMTCAvIG1TYW1wbGVSYXRlSHopCi0gICAgICAgICAgICArIG5vd1VzIC0gbnVtRnJhbWVzUGxheWVkQXRVczsKLSAgICBpZiAoZHVyYXRpb25VcyA8IDApIHsKLSAgICAgICAgLy8gT2NjdXJzIHdoZW4gbnVtRnJhbWVzUGxheWVkIHBvc2l0aW9uIGlzIHZlcnkgc21hbGwgYW5kIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAgIC8vICgxKSBJbiBjYXNlIDEsIHRoZSB0aW1lIG5vd1VzIGlzIGNvbXB1dGVkIGJlZm9yZSBnZXRUaW1lc3RhbXAoKSBpcyBjYWxsZWQgYW5kCi0gICAgICAgIC8vICAgICBudW1GcmFtZXNQbGF5ZWRBdFVzIGlzIGdyZWF0ZXIgdGhhbiBub3dVcyBieSB0aW1lIG1vcmUgdGhhbiBudW1GcmFtZXNQbGF5ZWQuCi0gICAgICAgIC8vICgyKSBJbiBjYXNlIDMsIHVzaW5nIGdldFBvc2l0aW9uIGFuZCBhZGRpbmcgbUF1ZGlvU2luay0+bGF0ZW5jeSgpIHRvCi0gICAgICAgIC8vICAgICBudW1GcmFtZXNQbGF5ZWRBdFVzLCBieSBhIHRpbWUgYW1vdW50IGdyZWF0ZXIgdGhhbiBudW1GcmFtZXNQbGF5ZWQuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIEJvdGggb2YgdGhlc2UgYXJlIHRyYW5zaXRvcnkgY29uZGl0aW9ucy4KLSAgICAgICAgQUxPR1YoImdldFBsYXllZE91dER1cmF0aW9uVXM6IG5lZ2F0aXZlIGR1cmF0aW9uICVsbGQgc2V0IHRvIHplcm8iLCAobG9uZyBsb25nKWR1cmF0aW9uVXMpOwotICAgICAgICBkdXJhdGlvblVzID0gMDsKLSAgICB9Ci0gICAgQUxPR1YoImdldFBsYXllZE91dER1cmF0aW9uVXMoJWxsZCkgbm93VXMoJWxsZCkgZnJhbWVzKCV1KSBmcmFtZXNBdCglbGxkKSIsCi0gICAgICAgICAgICAobG9uZyBsb25nKWR1cmF0aW9uVXMsIChsb25nIGxvbmcpbm93VXMsCi0gICAgICAgICAgICBudW1GcmFtZXNQbGF5ZWQsIChsb25nIGxvbmcpbnVtRnJhbWVzUGxheWVkQXRVcyk7Ci0gICAgcmV0dXJuIGR1cmF0aW9uVXM7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRGcmFtZXNXcml0dGVuKHVpbnQzMl90ICpmcmFtZXN3cml0dGVuKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgRXh0ZW5kZWRUaW1lc3RhbXAgZXRzOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1UcmFjay0+Z2V0VGltZXN0YW1wKCZldHMpOwotICAgIGlmIChzdGF0dXMgPT0gT0sgfHwgc3RhdHVzID09IFdPVUxEX0JMT0NLKSB7Ci0gICAgICAgICpmcmFtZXN3cml0dGVuID0gKHVpbnQzMl90KWV0cy5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0NMSUVOVF07Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICByZXR1cm4gbVRyYWNrLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcnMpOwotfQotCi1TdHJpbmc4ICBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiBrZXlzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGlmIChtVHJhY2sgPT0gMCkgewotICAgICAgICByZXR1cm4gU3RyaW5nODo6ZW1wdHkoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1UcmFjay0+Z2V0UGFyYW1ldGVycyhrZXlzKTsKLX0KLQotdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0QXVkaW9BdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqIGF0dHJpYnV0ZXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKGF0dHJpYnV0ZXMgPT0gTlVMTCkgewotICAgICAgICBmcmVlKG1BdHRyaWJ1dGVzKTsKLSAgICAgICAgbUF0dHJpYnV0ZXMgPSBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtQXR0cmlidXRlcyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtQXR0cmlidXRlcyA9IChhdWRpb19hdHRyaWJ1dGVzX3QgKikgY2FsbG9jKDEsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgfQotICAgICAgICBtZW1jcHkobUF0dHJpYnV0ZXMsIGF0dHJpYnV0ZXMsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgbVN0cmVhbVR5cGUgPSBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKGF0dHJpYnV0ZXMpOwotICAgIH0KLX0KLQotdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICAvLyBkbyBub3QgYWxsb3cgZGlyZWN0IHN0cmVhbSB0eXBlIG1vZGlmaWNhdGlvbiBpZiBhdHRyaWJ1dGVzIGhhdmUgYmVlbiBzZXQKLSAgICBpZiAobUF0dHJpYnV0ZXMgPT0gTlVMTCkgewotICAgICAgICBtU3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpjbG9zZV9sKCkgewotICAgIG1UcmFjay5jbGVhcigpOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6b3BlbigKLSAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgaW50IGJ1ZmZlckNvdW50LAotICAgICAgICBBdWRpb0NhbGxiYWNrIGNiLCB2b2lkICpjb29raWUsCi0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8sCi0gICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QsCi0gICAgICAgIHVpbnQzMl90IHN1Z2dlc3RlZEZyYW1lQ291bnQpIHsKLSAgICBBTE9HVigib3BlbigldSwgJWQsIDB4JXgsIDB4JXgsICVkLCAlZCAweCV4KSIsIHNhbXBsZVJhdGUsIGNoYW5uZWxDb3VudCwgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgZm9ybWF0LCBidWZmZXJDb3VudCwgbVNlc3Npb25JZCwgZmxhZ3MpOwotCi0gICAgLy8gb2ZmbG9hZGluZyBpcyBvbmx5IHN1cHBvcnRlZCBpbiBjYWxsYmFjayBtb2RlIGZvciBub3cuCi0gICAgLy8gb2ZmbG9hZEluZm8gbXVzdCBiZSBwcmVzZW50IGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQKLSAgICBpZiAoKChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApICYmCi0gICAgICAgICAgICAoKGNiID09IE5VTEwpIHx8IChvZmZsb2FkSW5mbyA9PSBOVUxMKSkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICAvLyBjb21wdXRlIGZyYW1lIGNvdW50IGZvciB0aGUgQXVkaW9UcmFjayBpbnRlcm5hbCBidWZmZXIKLSAgICBzaXplX3QgZnJhbWVDb3VudDsKLSAgICBpZiAoKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgewotICAgICAgICBmcmFtZUNvdW50ID0gMDsgLy8gQXVkaW9UcmFjayB3aWxsIGdldCBmcmFtZSBjb3VudCBmcm9tIEF1ZGlvRmxpbmdlcgotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIHRyeSB0byBlc3RpbWF0ZSB0aGUgYnVmZmVyIHByb2Nlc3NpbmcgZmV0Y2ggc2l6ZSBmcm9tIEF1ZGlvRmxpbmdlci4KLSAgICAgICAgLy8gZnJhbWVzUGVyQnVmZmVyIGlzIGFwcHJveGltYXRlIGFuZCBnZW5lcmFsbHkgY29ycmVjdCwgZXhjZXB0IHdoZW4gaXQncyBub3QgOi0pLgotICAgICAgICB1aW50MzJfdCBhZlNhbXBsZVJhdGU7Ci0gICAgICAgIHNpemVfdCBhZkZyYW1lQ291bnQ7Ci0gICAgICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0RnJhbWVDb3VudCgmYWZGcmFtZUNvdW50LCBtU3RyZWFtVHlwZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgICAgIGlmIChBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0U2FtcGxpbmdSYXRlKCZhZlNhbXBsZVJhdGUsIG1TdHJlYW1UeXBlKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLSAgICAgICAgY29uc3Qgc2l6ZV90IGZyYW1lc1BlckJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYW1wbGVSYXRlICogYWZGcmFtZUNvdW50IC8gYWZTYW1wbGVSYXRlOwotCi0gICAgICAgIGlmIChidWZmZXJDb3VudCA9PSAwKSB7Ci0gICAgICAgICAgICAvLyB1c2Ugc3VnZ2VzdGVkRnJhbWVDb3VudAotICAgICAgICAgICAgYnVmZmVyQ291bnQgPSAoc3VnZ2VzdGVkRnJhbWVDb3VudCArIGZyYW1lc1BlckJ1ZmZlciAtIDEpIC8gZnJhbWVzUGVyQnVmZmVyOwotICAgICAgICB9Ci0gICAgICAgIC8vIENoZWNrIGFyZ3VtZW50IGJ1ZmZlckNvdW50IGFnYWluc3QgdGhlIG1pbmludW0gYnVmZmVyIGNvdW50Ci0gICAgICAgIGlmIChidWZmZXJDb3VudCAhPSAwICYmIGJ1ZmZlckNvdW50IDwgbU1pbkJ1ZmZlckNvdW50KSB7Ci0gICAgICAgICAgICBBTE9HVigiYnVmZmVyQ291bnQgKCVkKSBpbmNyZWFzZWQgdG8gJWQiLCBidWZmZXJDb3VudCwgbU1pbkJ1ZmZlckNvdW50KTsKLSAgICAgICAgICAgIGJ1ZmZlckNvdW50ID0gbU1pbkJ1ZmZlckNvdW50OwotICAgICAgICB9Ci0gICAgICAgIC8vIGlmIGZyYW1lQ291bnQgaXMgMCwgdGhlbiBBdWRpb1RyYWNrIHdpbGwgZ2V0IGZyYW1lIGNvdW50IGZyb20gQXVkaW9GbGluZ2VyCi0gICAgICAgIC8vIHdoaWNoIHdpbGwgYmUgdGhlIG1pbmltdW0gc2l6ZSBwZXJtaXR0ZWQuCi0gICAgICAgIGZyYW1lQ291bnQgPSBidWZmZXJDb3VudCAqIGZyYW1lc1BlckJ1ZmZlcjsKLSAgICB9Ci0KLSAgICBpZiAoY2hhbm5lbE1hc2sgPT0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSKSB7Ci0gICAgICAgIGNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7Ci0gICAgICAgIGlmICgwID09IGNoYW5uZWxNYXNrKSB7Ci0gICAgICAgICAgICBBTE9HRSgib3BlbigpIGVycm9yLCBjYW5cJ3QgZGVyaXZlIG1hc2sgZm9yICVkIGF1ZGlvIGNoYW5uZWxzIiwgY2hhbm5lbENvdW50KTsKLSAgICAgICAgICAgIHJldHVybiBOT19JTklUOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIG1DYWxsYmFjayA9IGNiOwotICAgIG1DYWxsYmFja0Nvb2tpZSA9IGNvb2tpZTsKLQotICAgIHNwPEF1ZGlvVHJhY2s+IHQ7Ci0gICAgQ2FsbGJhY2tEYXRhICpuZXdjYmQgPSBOVUxMOwotCi0gICAgQUxPR1YoImNyZWF0aW5nIG5ldyBBdWRpb1RyYWNrIik7Ci0KLSAgICBpZiAobUNhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgbmV3Y2JkID0gbmV3IENhbGxiYWNrRGF0YSh0aGlzKTsKLSAgICAgICAgdCA9IG5ldyBBdWRpb1RyYWNrKAotICAgICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgZm9ybWF0LAotICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAgICAgQ2FsbGJhY2tXcmFwcGVyLAotICAgICAgICAgICAgICAgIG5ld2NiZCwKLSAgICAgICAgICAgICAgICAwLCAgLy8gbm90aWZpY2F0aW9uIGZyYW1lcwotICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgQXVkaW9UcmFjazo6VFJBTlNGRVJfQ0FMTEJBQ0ssCi0gICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8sCi0gICAgICAgICAgICAgICAgbVVpZCwKLSAgICAgICAgICAgICAgICBtUGlkLAotICAgICAgICAgICAgICAgIG1BdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgIGRvTm90UmVjb25uZWN0LAotICAgICAgICAgICAgICAgIDEuMGYsICAvLyBkZWZhdWx0IHZhbHVlIGZvciBtYXhSZXF1aXJlZFNwZWVkCi0gICAgICAgICAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFRPRE86IER1ZSB0byBidWZmZXIgbWVtb3J5IGNvbmNlcm5zLCB3ZSB1c2UgYSBtYXggdGFyZ2V0IHBsYXliYWNrIHNwZWVkCi0gICAgICAgIC8vIGJhc2VkIG9uIG1QbGF5YmFja1JhdGUgYXQgdGhlIHRpbWUgb2Ygb3BlbiAoaW5zdGVhZCBvZiBrTWF4UmVxdWlyZWRTcGVlZCksCi0gICAgICAgIC8vIGFsc28gY2xhbXBpbmcgdGhlIHRhcmdldCBzcGVlZCB0byAxLjAgPD0gdGFyZ2V0U3BlZWQgPD0ga01heFJlcXVpcmVkU3BlZWQuCi0gICAgICAgIGNvbnN0IGZsb2F0IHRhcmdldFNwZWVkID0KLSAgICAgICAgICAgICAgICBzdGQ6Om1pbihzdGQ6Om1heChtUGxheWJhY2tSYXRlLm1TcGVlZCwgMS4wZiksIGtNYXhSZXF1aXJlZFNwZWVkKTsKLSAgICAgICAgQUxPR1dfSUYodGFyZ2V0U3BlZWQgIT0gbVBsYXliYWNrUmF0ZS5tU3BlZWQsCi0gICAgICAgICAgICAgICAgInRyYWNrIHRhcmdldCBzcGVlZDolZiBjbGFtcGVkIGZyb20gcGxheWJhY2sgc3BlZWQ6JWYiLAotICAgICAgICAgICAgICAgIHRhcmdldFNwZWVkLCBtUGxheWJhY2tSYXRlLm1TcGVlZCk7Ci0gICAgICAgIHQgPSBuZXcgQXVkaW9UcmFjaygKLSAgICAgICAgICAgICAgICBtU3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgIGZvcm1hdCwKLSAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgICAgIE5VTEwsIC8vIGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgTlVMTCwgLy8gdXNlciBkYXRhCi0gICAgICAgICAgICAgICAgMCwgLy8gbm90aWZpY2F0aW9uIGZyYW1lcwotICAgICAgICAgICAgICAgIG1TZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgQXVkaW9UcmFjazo6VFJBTlNGRVJfREVGQVVMVCwKLSAgICAgICAgICAgICAgICBOVUxMLCAvLyBvZmZsb2FkIGluZm8KLSAgICAgICAgICAgICAgICBtVWlkLAotICAgICAgICAgICAgICAgIG1QaWQsCi0gICAgICAgICAgICAgICAgbUF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgZG9Ob3RSZWNvbm5lY3QsCi0gICAgICAgICAgICAgICAgdGFyZ2V0U3BlZWQsCi0gICAgICAgICAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQpOwotICAgIH0KLQotICAgIGlmICgodCA9PSAwKSB8fCAodC0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gY3JlYXRlIGF1ZGlvIHRyYWNrIik7Ci0gICAgICAgIGRlbGV0ZSBuZXdjYmQ7Ci0gICAgICAgIC8vIHQgZ29lcyBvdXQgb2Ygc2NvcGUsIHNvIHJlZmVyZW5jZSBjb3VudCBkcm9wcyB0byB6ZXJvCi0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIHN1Y2Nlc3NmdWwgQXVkaW9UcmFjayBpbml0aWFsaXphdGlvbiBpbXBsaWVzIGEgbGVnYWN5IHN0cmVhbSB0eXBlIHdhcyBnZW5lcmF0ZWQKLSAgICAgICAgLy8gZnJvbSB0aGUgYXVkaW8gYXR0cmlidXRlcwotICAgICAgICBtU3RyZWFtVHlwZSA9IHQtPnN0cmVhbVR5cGUoKTsKLSAgICB9Ci0KLSAgICBDSEVDSygodCAhPSBOVUxMKSAmJiAoKG1DYWxsYmFjayA9PSBOVUxMKSB8fCAobmV3Y2JkICE9IE5VTEwpKSk7Ci0KLSAgICBtQ2FsbGJhY2tEYXRhID0gbmV3Y2JkOwotICAgIEFMT0dWKCJzZXRWb2x1bWUiKTsKLSAgICB0LT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7Ci0KLSAgICBtU2FtcGxlUmF0ZUh6ID0gc2FtcGxlUmF0ZTsKLSAgICBtRmxhZ3MgPSBmbGFnczsKLSAgICBtTXNlY3NQZXJGcmFtZSA9IDFFM2YgLyAobVBsYXliYWNrUmF0ZS5tU3BlZWQgKiBzYW1wbGVSYXRlKTsKLSAgICBtRnJhbWVTaXplID0gdC0+ZnJhbWVTaXplKCk7Ci0gICAgbVRyYWNrID0gdDsKLQotICAgIHJldHVybiB1cGRhdGVUcmFja19sKCk7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0Ojp1cGRhdGVUcmFja19sKCkgewotICAgIGlmIChtVHJhY2sgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgcmVzID0gTk9fRVJST1I7Ci0gICAgLy8gTm90ZSBzb21lIG91dHB1dCBkZXZpY2VzIG1heSBnaXZlIHVzIGEgZGlyZWN0IHRyYWNrIGV2ZW4gdGhvdWdoIHdlIGRvbid0IHNwZWNpZnkgaXQuCi0gICAgLy8gRXhhbXBsZTogTGluZSBhcHBsaWNhdGlvbiBiLzE3NDU5OTgyLgotICAgIGlmICgobVRyYWNrLT5nZXRGbGFncygpCi0gICAgICAgICAgICAmIChBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSkgPT0gMCkgewotICAgICAgICByZXMgPSBtVHJhY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tSYXRlKTsKLSAgICAgICAgaWYgKHJlcyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbVRyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7Ci0gICAgICAgICAgICByZXMgPSBtVHJhY2stPmF0dGFjaEF1eEVmZmVjdChtQXV4RWZmZWN0SWQpOwotICAgICAgICB9Ci0gICAgfQotICAgIG1UcmFjay0+c2V0T3V0cHV0RGV2aWNlKG1TZWxlY3RlZERldmljZUlkKTsKLSAgICBpZiAobURldmljZUNhbGxiYWNrRW5hYmxlZCkgewotICAgICAgICBtVHJhY2stPmFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2sobURldmljZUNhbGxiYWNrLnByb21vdGUoKSk7Ci0gICAgfQotICAgIEFMT0dWKCJ1cGRhdGVUcmFja19sKCkgRE9ORSBzdGF0dXMgJWQiLCByZXMpOwotICAgIHJldHVybiByZXM7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzdGFydCgpIHsKLSAgICBBTE9HVigic3RhcnQiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1DYWxsYmFja0RhdGEgIT0gTlVMTCkgewotICAgICAgICBtQ2FsbGJhY2tEYXRhLT5lbmRUcmFja1N3aXRjaCgpOwotICAgIH0KLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5zZXRWb2x1bWUobUxlZnRWb2x1bWUsIG1SaWdodFZvbHVtZSk7Ci0gICAgICAgIG1UcmFjay0+c2V0QXV4RWZmZWN0U2VuZExldmVsKG1TZW5kTGV2ZWwpOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtVHJhY2stPnN0YXJ0KCk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOwotfQotCi1zc2l6ZV90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0Ojp3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGJsb2NraW5nKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUNhbGxiYWNrICE9IE5VTEwsICJEb24ndCBjYWxsIHdyaXRlIGlmIHN1cHBseWluZyBhIGNhbGxiYWNrLiIpOwotCi0gICAgLy9BTE9HVigid3JpdGUoJXAsICV1KSIsIGJ1ZmZlciwgc2l6ZSk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtVHJhY2stPndyaXRlKGJ1ZmZlciwgc2l6ZSwgYmxvY2tpbmcpOwotICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKLX0KLQotdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6c3RvcCgpIHsKLSAgICBBTE9HVigic3RvcCIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5zdG9wKCk7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpmbHVzaCgpIHsKLSAgICBBTE9HVigiZmx1c2giKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIG1UcmFjay0+Zmx1c2goKTsKLSAgICB9Ci19Ci0KLXZvaWQgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnBhdXNlKCkgewotICAgIEFMT0dWKCJwYXVzZSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5wYXVzZSgpOwotICAgIH0KLX0KLQotdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Y2xvc2UoKSB7Ci0gICAgQUxPR1YoImNsb3NlIik7Ci0gICAgc3A8QXVkaW9UcmFjaz4gdHJhY2s7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgICAgIHRyYWNrID0gbVRyYWNrOwotICAgICAgICBjbG9zZV9sKCk7IC8vIGNsZWFycyBtVHJhY2sKLSAgICB9Ci0gICAgLy8gZGVzdHJ1Y3Rpb24gb2YgdGhlIHRyYWNrIG9jY3VycyBvdXRzaWRlIG9mIG11dGV4LgotfQotCi12b2lkIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIHsKLSAgICBBTE9HVigic2V0Vm9sdW1lKCVmLCAlZikiLCBsZWZ0LCByaWdodCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIG1MZWZ0Vm9sdW1lID0gbGVmdDsKLSAgICBtUmlnaHRWb2x1bWUgPSByaWdodDsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVRyYWNrLT5zZXRWb2x1bWUobGVmdCwgcmlnaHQpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OnNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSkgewotICAgIEFMT0dWKCJzZXRQbGF5YmFja1JhdGUoJWYgJWYgJWQgJWQpIiwKLSAgICAgICAgICAgICAgICByYXRlLm1TcGVlZCwgcmF0ZS5tUGl0Y2gsIHJhdGUubUZhbGxiYWNrTW9kZSwgcmF0ZS5tU3RyZXRjaE1vZGUpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKLSAgICAgICAgLy8gcmVtZW1iZXIgcmF0ZSBzbyB0aGF0IHdlIGNhbiBzZXQgaXQgd2hlbiB0aGUgdHJhY2sgaXMgb3BlbmVkCi0gICAgICAgIG1QbGF5YmFja1JhdGUgPSByYXRlOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIHN0YXR1c190IHJlcyA9IG1UcmFjay0+c2V0UGxheWJhY2tSYXRlKHJhdGUpOwotICAgIGlmIChyZXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHJlczsKLSAgICB9Ci0gICAgLy8gcmF0ZS5tU3BlZWQgaXMgYWx3YXlzIGdyZWF0ZXIgdGhhbiAwIGlmIHNldFBsYXliYWNrUmF0ZSBzdWNjZWVkZWQKLSAgICBDSEVDS19HVChyYXRlLm1TcGVlZCwgMC5mKTsKLSAgICBtUGxheWJhY2tSYXRlID0gcmF0ZTsKLSAgICBpZiAobVNhbXBsZVJhdGVIeiAhPSAwKSB7Ci0gICAgICAgIG1Nc2Vjc1BlckZyYW1lID0gMUUzZiAvIChyYXRlLm1TcGVlZCAqIG1TYW1wbGVSYXRlSHopOwotICAgIH0KLSAgICByZXR1cm4gcmVzOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0UGxheWJhY2tSYXRlKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlKSB7Ci0gICAgQUxPR1YoInNldFBsYXliYWNrUmF0ZSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgICpyYXRlID0gbVRyYWNrLT5nZXRQbGF5YmFja1JhdGUoKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpIHsKLSAgICBBTE9HVigic2V0QXV4RWZmZWN0U2VuZExldmVsKCVmKSIsIGxldmVsKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgbVNlbmRMZXZlbCA9IGxldmVsOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICByZXR1cm4gbVRyYWNrLT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobGV2ZWwpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjphdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKSB7Ci0gICAgQUxPR1YoImF0dGFjaEF1eEVmZmVjdCglZCkiLCBlZmZlY3RJZCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIG1BdXhFZmZlY3RJZCA9IGVmZmVjdElkOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICByZXR1cm4gbVRyYWNrLT5hdHRhY2hBdXhFZmZlY3QoZWZmZWN0SWQpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgewotICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoJWQpIiwgZGV2aWNlSWQpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBtU2VsZWN0ZWREZXZpY2VJZCA9IGRldmljZUlkOwotICAgIGlmIChtVHJhY2sgIT0gMCkgewotICAgICAgICByZXR1cm4gbVRyYWNrLT5zZXRPdXRwdXREZXZpY2UoZGV2aWNlSWQpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCkgewotICAgIEFMT0dWKCJnZXRSb3V0ZWREZXZpY2VJZCIpOwotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrICE9IDApIHsKLSAgICAgICAgbVJvdXRlZERldmljZUlkID0gbVRyYWNrLT5nZXRSb3V0ZWREZXZpY2VJZCgpOwotICAgIH0KLSAgICAqZGV2aWNlSWQgPSBtUm91dGVkRGV2aWNlSWQ7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6ZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpIHsKLSAgICBBTE9HVigiZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjaywgJWQiLCBlbmFibGVkKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgbURldmljZUNhbGxiYWNrRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgaWYgKG1UcmFjayAhPSAwKSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1czsKLSAgICAgICAgaWYgKGVuYWJsZWQpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG1UcmFjay0+YWRkQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2sucHJvbW90ZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IG1UcmFjay0+cmVtb3ZlQXVkaW9EZXZpY2VDYWxsYmFjayhtRGV2aWNlQ2FsbGJhY2sucHJvbW90ZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Q2FsbGJhY2tXcmFwcGVyKAotICAgICAgICBpbnQgZXZlbnQsIHZvaWQgKmNvb2tpZSwgdm9pZCAqaW5mbykgewotICAgIC8vQUxPR1YoImNhbGxiYWNrd3JhcHBlciIpOwotICAgIENhbGxiYWNrRGF0YSAqZGF0YSA9IChDYWxsYmFja0RhdGEqKWNvb2tpZTsKLSAgICAvLyBsb2NrIHRvIGVuc3VyZSB3ZSBhcmVuJ3QgY2F1Z2h0IGluIHRoZSBtaWRkbGUgb2YgYSB0cmFjayBzd2l0Y2guCi0gICAgZGF0YS0+bG9jaygpOwotICAgIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0ICptZSA9IGRhdGEtPmdldE91dHB1dCgpOwotICAgIEF1ZGlvVHJhY2s6OkJ1ZmZlciAqYnVmZmVyID0gKEF1ZGlvVHJhY2s6OkJ1ZmZlciAqKWluZm87Ci0gICAgaWYgKG1lID09IE5VTEwpIHsKLSAgICAgICAgLy8gbm8gb3V0cHV0IHNldCwgbGlrZWx5IGJlY2F1c2UgdGhlIHRyYWNrIHdhcyBzY2hlZHVsZWQgdG8gYmUgcmV1c2VkCi0gICAgICAgIC8vIGJ5IGFub3RoZXIgcGxheWVyLCBidXQgdGhlIGZvcm1hdCB0dXJuZWQgb3V0IHRvIGJlIGluY29tcGF0aWJsZS4KLSAgICAgICAgZGF0YS0+dW5sb2NrKCk7Ci0gICAgICAgIGlmIChidWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgYnVmZmVyLT5zaXplID0gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3dpdGNoKGV2ZW50KSB7Ci0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEE6IHsKLSAgICAgICAgc2l6ZV90IGFjdHVhbFNpemUgPSAoKm1lLT5tQ2FsbGJhY2spKAotICAgICAgICAgICAgICAgIG1lLCBidWZmZXItPnJhdywgYnVmZmVyLT5zaXplLCBtZS0+bUNhbGxiYWNrQ29va2llLAotICAgICAgICAgICAgICAgIENCX0VWRU5UX0ZJTExfQlVGRkVSKTsKLQotICAgICAgICAvLyBMb2cgd2hlbiBubyBkYXRhIGlzIHJldHVybmVkIGZyb20gdGhlIGNhbGxiYWNrLgotICAgICAgICAvLyAoMSkgV2UgbWF5IGhhdmUgbm8gZGF0YSAoZXNwZWNpYWxseSB3aXRoIG5ldHdvcmsgc3RyZWFtaW5nIHNvdXJjZXMpLgotICAgICAgICAvLyAoMikgV2UgbWF5IGhhdmUgcmVhY2hlZCB0aGUgRU9TIGFuZCB0aGUgYXVkaW8gdHJhY2sgaXMgbm90IHN0b3BwZWQgeWV0LgotICAgICAgICAvLyBOb3RlIHRoYXQgQXdlc29tZVBsYXllci9BdWRpb1BsYXllciB3aWxsIG9ubHkgcmV0dXJuIHplcm8gc2l6ZSB3aGVuIGl0IHJlYWNoZXMgdGhlIEVPUy4KLSAgICAgICAgLy8gTnVQbGF5ZXIyUmVuZGVyZXIgd2lsbCByZXR1cm4gemVybyB3aGVuIGl0IGRvZXNuJ3QgaGF2ZSBkYXRhIChpdCBkb2Vzbid0IGJsb2NrIHRvIGZpbGwpLgotICAgICAgICAvLwotICAgICAgICAvLyBUaGlzIGlzIGEgYmVuaWduIGJ1c3ktd2FpdCwgd2l0aCB0aGUgbmV4dCBkYXRhIHJlcXVlc3QgZ2VuZXJhdGVkIDEwIG1zIG9yIG1vcmUgbGF0ZXI7Ci0gICAgICAgIC8vIG5ldmVydGhlbGVzcyBmb3IgcG93ZXIgcmVhc29ucywgd2UgZG9uJ3Qgd2FudCB0byBzZWUgdG9vIG1hbnkgb2YgdGhlc2UuCi0KLSAgICAgICAgQUxPR1ZfSUYoYWN0dWFsU2l6ZSA9PSAwICYmIGJ1ZmZlci0+c2l6ZSA+IDAsICJjYWxsYmFja3dyYXBwZXI6IGVtcHR5IGJ1ZmZlciByZXR1cm5lZCIpOwotCi0gICAgICAgIGJ1ZmZlci0+c2l6ZSA9IGFjdHVhbFNpemU7Ci0gICAgICAgIH0gYnJlYWs7Ci0KLSAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX1NUUkVBTV9FTkQ6Ci0gICAgICAgIC8vIGN1cnJlbnRseSBvbmx5IG9jY3VycyBmb3Igb2ZmbG9hZGVkIGNhbGxiYWNrcwotICAgICAgICBBTE9HVigiY2FsbGJhY2t3cmFwcGVyOiBkZWxpdmVyIEVWRU5UX1NUUkVBTV9FTkQiKTsKLSAgICAgICAgKCptZS0+bUNhbGxiYWNrKShtZSwgTlVMTCAvKiBidWZmZXIgKi8sIDAgLyogc2l6ZSAqLywKLSAgICAgICAgICAgICAgICBtZS0+bUNhbGxiYWNrQ29va2llLCBDQl9FVkVOVF9TVFJFQU1fRU5EKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEF1ZGlvVHJhY2s6OkVWRU5UX05FV19JQVVESU9UUkFDSyA6Ci0gICAgICAgIEFMT0dWKCJjYWxsYmFja3dyYXBwZXI6IGRlbGl2ZXIgRVZFTlRfVEVBUl9ET1dOIik7Ci0gICAgICAgICgqbWUtPm1DYWxsYmFjaykobWUsICBOVUxMIC8qIGJ1ZmZlciAqLywgMCAvKiBzaXplICovLAotICAgICAgICAgICAgICAgIG1lLT5tQ2FsbGJhY2tDb29raWUsIENCX0VWRU5UX1RFQVJfRE9XTik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9VTkRFUlJVTjoKLSAgICAgICAgLy8gVGhpcyBvY2N1cnMgd2hlbiB0aGVyZSBpcyBubyBkYXRhIGF2YWlsYWJsZSwgdHlwaWNhbGx5Ci0gICAgICAgIC8vIHdoZW4gdGhlcmUgaXMgYSBmYWlsdXJlIHRvIHN1cHBseSBkYXRhIHRvIHRoZSBBdWRpb1RyYWNrLiAgSXQgY2FuIGFsc28KLSAgICAgICAgLy8gb2NjdXIgaW4gbm9uLW9mZmxvYWRlZCBtb2RlIHdoZW4gdGhlIGF1ZGlvIGRldmljZSBjb21lcyBvdXQgb2Ygc3RhbmRieS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gSWYgYW4gQXVkaW9UcmFjayB1bmRlcnJ1bnMgaXQgb3V0cHV0cyBzaWxlbmNlLiBTaW5jZSB0aGlzIGhhcHBlbnMgc3VkZGVubHkKLSAgICAgICAgLy8gaXQgbWF5IHNvdW5kIGxpa2UgYW4gYXVkaWJsZSBwb3Agb3IgZ2xpdGNoLgotICAgICAgICAvLwotICAgICAgICAvLyBUaGUgdW5kZXJydW4gZXZlbnQgaXMgc2VudCBvbmNlIHBlciB0cmFjayB1bmRlcnJ1bjsgdGhlIGNvbmRpdGlvbiBpcyByZXNldAotICAgICAgICAvLyB3aGVuIG1vcmUgZGF0YSBpcyBzZW50IHRvIHRoZSBBdWRpb1RyYWNrLgotICAgICAgICBBTE9HRCgiY2FsbGJhY2t3cmFwcGVyOiBFVkVOVF9VTkRFUlJVTiAoZGlzY2FyZGVkKSIpOwotICAgICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dFKCJyZWNlaXZlZCB1bmtub3duIGV2ZW50IHR5cGU6ICVkIGluc2lkZSBDYWxsYmFja1dyYXBwZXIgISIsIGV2ZW50KTsKLSAgICB9Ci0KLSAgICBkYXRhLT51bmxvY2soKTsKLX0KLQotYXVkaW9fc2Vzc2lvbl90IE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0OjpnZXRTZXNzaW9uSWQoKSBjb25zdAotewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gbVNlc3Npb25JZDsKLX0KLQotdWludDMyX3QgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ6OmdldFNhbXBsZVJhdGUoKSBjb25zdAotewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobVRyYWNrID09IDApIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBtVHJhY2stPmdldFNhbXBsZVJhdGUoKTsKLX0KLQotaW50NjRfdCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDo6Z2V0QnVmZmVyRHVyYXRpb25JblVzKCkgY29uc3QKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0gICAgaWYgKG1UcmFjayA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICBpbnQ2NF90IGR1cmF0aW9uOwotICAgIGlmIChtVHJhY2stPmdldEJ1ZmZlckR1cmF0aW9uSW5VcygmZHVyYXRpb24pICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLSAgICByZXR1cm4gZHVyYXRpb247Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9KQXVkaW9UcmFjay5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwMTgyNWIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL0pBdWRpb1RyYWNrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX0pBVURJT1RSQUNLX0gKLSNkZWZpbmUgQU5EUk9JRF9KQVVESU9UUkFDS19ICi0KLSNpbmNsdWRlIDxqbmkuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+Ci0jaW5jbHVkZSA8bWVkaWEvVm9sdW1lU2hhcGVyLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1RpbWVzdGFtcC5oPiAgIC8vIEl0IGhhcyBkZXBlbmRlbmN5IG9uIGF1ZGlvLmgvRXJyb3JzLmgsIGJ1dCBkb2Vzbid0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmNsdWRlIHRoZW0gaW4gaXQuIFRoZXJlZm9yZSBpdCBpcyBpbmNsdWRlZCBoZXJlIGF0IGxhc3QuCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgSkF1ZGlvVHJhY2sgewotcHVibGljOgotCi0gICAgLyogRXZlbnRzIHVzZWQgYnkgQXVkaW9UcmFjayBjYWxsYmFjayBmdW5jdGlvbiAoY2FsbGJhY2tfdCkuCi0gICAgICogS2VlcCBpbiBzeW5jIHdpdGggZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9BdWRpb1RyYWNrLmphdmEgTkFUSVZFX0VWRU5UXyouCi0gICAgICovCi0gICAgZW51bSBldmVudF90eXBlIHsKLSAgICAgICAgRVZFTlRfTU9SRV9EQVRBID0gMCwgICAgICAgIC8vIFJlcXVlc3QgdG8gd3JpdGUgbW9yZSBkYXRhIHRvIGJ1ZmZlci4KLSAgICAgICAgRVZFTlRfTkVXX0lBVURJT1RSQUNLID0gNiwgIC8vIElBdWRpb1RyYWNrIHdhcyByZS1jcmVhdGVkLCBlaXRoZXIgZHVlIHRvIHJlLXJvdXRpbmcgYW5kCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2b2x1bnRhcnkgaW52YWxpZGF0aW9uIGJ5IG1lZGlhc2VydmVyLCBvciBtZWRpYXNlcnZlciBjcmFzaC4KLSAgICAgICAgRVZFTlRfU1RSRUFNX0VORCA9IDcsICAgICAgIC8vIFNlbnQgYWZ0ZXIgYWxsIHRoZSBidWZmZXJzIHF1ZXVlZCBpbiBBRiBhbmQgSFcgYXJlIHBsYXllZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFjayAoYWZ0ZXIgc3RvcCBpcyBjYWxsZWQpIGZvciBhbiBvZmZsb2FkZWQgdHJhY2suCi0gICAgfTsKLQotICAgIGNsYXNzIEJ1ZmZlcgotICAgIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIHNpemVfdCAgICAgIG1TaXplOyAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGluIGJ5dGVzLgotICAgICAgICB2b2lkKiAgICAgICBtRGF0YTsgICAgICAgIC8vIHBvaW50ZXIgdG8gdGhlIGF1ZGlvIGRhdGEuCi0gICAgfTsKLQotICAgIC8qIEFzIGEgY29udmVuaWVuY2UsIGlmIGEgY2FsbGJhY2sgaXMgc3VwcGxpZWQsIGEgaGFuZGxlciB0aHJlYWQKLSAgICAgKiBpcyBhdXRvbWF0aWNhbGx5IGNyZWF0ZWQgd2l0aCB0aGUgYXBwcm9wcmlhdGUgcHJpb3JpdHkuIFRoaXMgdGhyZWFkCi0gICAgICogaW52b2tlcyB0aGUgY2FsbGJhY2sgd2hlbiBhIG5ldyBidWZmZXIgYmVjb21lcyBhdmFpbGFibGUgb3IgdmFyaW91cyBjb25kaXRpb25zIG9jY3VyLgotICAgICAqCi0gICAgICogUGFyYW1ldGVyczoKLSAgICAgKgotICAgICAqIGV2ZW50OiAgIHR5cGUgb2YgZXZlbnQgbm90aWZpZWQgKHNlZSBlbnVtIEF1ZGlvVHJhY2s6OmV2ZW50X3R5cGUpLgotICAgICAqIHVzZXI6ICAgIFBvaW50ZXIgdG8gY29udGV4dCBmb3IgdXNlIGJ5IHRoZSBjYWxsYmFjayByZWNlaXZlci4KLSAgICAgKiBpbmZvOiAgICBQb2ludGVyIHRvIG9wdGlvbmFsIHBhcmFtZXRlciBhY2NvcmRpbmcgdG8gZXZlbnQgdHlwZToKLSAgICAgKiAgICAgICAgICAtIEVWRU5UX01PUkVfREFUQTogcG9pbnRlciB0byBKQXVkaW9UcmFjazo6QnVmZmVyIHN0cnVjdC4gVGhlIGNhbGxiYWNrIG11c3Qgbm90Ci0gICAgICogICAgICAgICAgICB3cml0ZSBtb3JlIGJ5dGVzIHRoYW4gaW5kaWNhdGVkIGJ5ICdzaXplJyBmaWVsZCBhbmQgdXBkYXRlICdzaXplJyBpZiBmZXdlciBieXRlcwotICAgICAqICAgICAgICAgICAgYXJlIHdyaXR0ZW4uCi0gICAgICogICAgICAgICAgLSBFVkVOVF9ORVdfSUFVRElPVFJBQ0s6IHVudXNlZC4KLSAgICAgKiAgICAgICAgICAtIEVWRU5UX1NUUkVBTV9FTkQ6IHVudXNlZC4KLSAgICAgKi8KLQotICAgIHR5cGVkZWYgdm9pZCAoKmNhbGxiYWNrX3QpKGludCBldmVudCwgdm9pZCogdXNlciwgdm9pZCAqaW5mbyk7Ci0KLSAgICAvKiBDcmVhdGVzIGFuIEpBdWRpb1RyYWNrIG9iamVjdCBmb3Igbm9uLW9mZmxvYWQgbW9kZS4KLSAgICAgKiBPbmNlIGNyZWF0ZWQsIHRoZSB0cmFjayBuZWVkcyB0byBiZSBzdGFydGVkIGJlZm9yZSBpdCBjYW4gYmUgdXNlZC4KLSAgICAgKiBVbnNwZWNpZmllZCB2YWx1ZXMgYXJlIHNldCB0byBhcHByb3ByaWF0ZSBkZWZhdWx0IHZhbHVlcy4KLSAgICAgKgotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICoKLSAgICAgKiBzdHJlYW1UeXBlOiAgICAgICAgIFNlbGVjdCB0aGUgdHlwZSBvZiBhdWRpbyBzdHJlYW0gdGhpcyB0cmFjayBpcyBhdHRhY2hlZCB0bwotICAgICAqICAgICAgICAgICAgICAgICAgICAgKGUuZy4gQVVESU9fU1RSRUFNX01VU0lDKS4KLSAgICAgKiBzYW1wbGVSYXRlOiAgICAgICAgIERhdGEgc291cmNlIHNhbXBsaW5nIHJhdGUgaW4gSHouICBaZXJvIG1lYW5zIHRvIHVzZSB0aGUgc2luayBzYW1wbGUgcmF0ZS4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIEEgbm9uLXplcm8gdmFsdWUgbXVzdCBiZSBzcGVjaWZpZWQgaWYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIGlzIHNldC4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIDAgd2lsbCBub3Qgd29yayB3aXRoIGN1cnJlbnQgcG9saWN5IGltcGxlbWVudGF0aW9uIGZvciBkaXJlY3Qgb3V0cHV0Ci0gICAgICogICAgICAgICAgICAgICAgICAgICBzZWxlY3Rpb24gd2hlcmUgYW4gZXhhY3QgbWF0Y2ggaXMgbmVlZGVkIGZvciBzYW1wbGluZyByYXRlLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgKFRPRE86IENoZWNrIGRpcmVjdCBvdXRwdXQgYWZ0ZXIgZmxhZ3MgY2FuIGJlIHVzZWQgaW4gSmF2YSBBdWRpb1RyYWNrLikKLSAgICAgKiBmb3JtYXQ6ICAgICAgICAgICAgIEF1ZGlvIGZvcm1hdC4gRm9yIG1peGVkIHRyYWNrcywgYW55IFBDTSBmb3JtYXQgc3VwcG9ydGVkIGJ5IHNlcnZlciBpcyBPSy4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIEZvciBkaXJlY3QgYW5kIG9mZmxvYWRlZCB0cmFja3MsIHRoZSBwb3NzaWJsZSBmb3JtYXQocykgZGVwZW5kcyBvbiB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIG91dHB1dCBzaW5rLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgKFRPRE86IEhvdyBjYW4gd2UgY2hlY2sgd2hldGhlciBhIGZvcm1hdCBpcyBzdXBwb3J0ZWQ/KQotICAgICAqIGNoYW5uZWxNYXNrOiAgICAgICAgQ2hhbm5lbCBtYXNrLCBzdWNoIHRoYXQgYXVkaW9faXNfb3V0cHV0X2NoYW5uZWwoY2hhbm5lbE1hc2spIGlzIHRydWUuCi0gICAgICogY2JmOiAgICAgICAgICAgICAgICBDYWxsYmFjayBmdW5jdGlvbi4gSWYgbm90IG51bGwsIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHBlcmlvZGljYWxseQotICAgICAqICAgICAgICAgICAgICAgICAgICAgdG8gcHJvdmlkZSBuZXcgZGF0YSBhbmQgaW5mb3JtIG9mIG1hcmtlciwgcG9zaXRpb24gdXBkYXRlcywgZXRjLgotICAgICAqIHVzZXI6ICAgICAgICAgICAgICAgQ29udGV4dCBmb3IgdXNlIGJ5IHRoZSBjYWxsYmFjayByZWNlaXZlci4KLSAgICAgKiBmcmFtZUNvdW50OiAgICAgICAgIE1pbmltdW0gc2l6ZSBvZiB0cmFjayBQQ00gYnVmZmVyIGluIGZyYW1lcy4gVGhpcyBkZWZpbmVzIHRoZQotICAgICAqICAgICAgICAgICAgICAgICAgICAgYXBwbGljYXRpb24ncyBjb250cmlidXRpb24gdG8gdGhlIGxhdGVuY3kgb2YgdGhlIHRyYWNrLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgVGhlIGFjdHVhbCBzaXplIHNlbGVjdGVkIGJ5IHRoZSBKQXVkaW9UcmFjayBjb3VsZCBiZSBsYXJnZXIgaWYgdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWQgc2l6ZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGN1cnJlbnQgYXVkaW8gSEFMIGNvbmZpZ3VyYXRpb24uCi0gICAgICogICAgICAgICAgICAgICAgICAgICBaZXJvIG1lYW5zIHRvIHVzZSBhIGRlZmF1bHQgdmFsdWUuCi0gICAgICogc2Vzc2lvbklkOiAgICAgICAgICBTcGVjaWZpYyBzZXNzaW9uIElELCBvciB6ZXJvIHRvIHVzZSBkZWZhdWx0LgotICAgICAqIHBBdHRyaWJ1dGVzOiAgICAgICAgSWYgbm90IE5VTEwsIHN1cGVyc2VkZXMgc3RyZWFtVHlwZSBmb3IgdXNlIGNhc2Ugc2VsZWN0aW9uLgotICAgICAqIG1heFJlcXVpcmVkU3BlZWQ6ICAgRm9yIFBDTSB0cmFja3MsIHRoaXMgY3JlYXRlcyBhbiBhcHByb3ByaWF0ZSBidWZmZXIgc2l6ZSB0aGF0IHdpbGwgYWxsb3cKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIG1heFJlcXVpcmVkU3BlZWQgcGxheWJhY2suIFZhbHVlcyBsZXNzIHRoYW4gMS4wZiBhbmQgZ3JlYXRlciB0aGFuCi0gICAgICogICAgICAgICAgICAgICAgICAgICBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NQVggd2lsbCBiZSBjbGFtcGVkLiAgRm9yIG5vbi1QQ00gdHJhY2tzCi0gICAgICogICAgICAgICAgICAgICAgICAgICBhbmQgZGlyZWN0IG9yIG9mZmxvYWRlZCB0cmFja3MsIHRoaXMgcGFyYW1ldGVyIGlzIGlnbm9yZWQuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAoVE9ETzogSGFuZGxlIHRoaXMgYWZ0ZXIgb2ZmbG9hZCAvIGRpcmVjdCB0cmFjayBpcyBzdXBwb3J0ZWQuKQotICAgICAqCi0gICAgICogVE9ETzogUmV2aXZlIHJlbW92ZWQgYXJndW1lbnRzIGFmdGVyIG9mZmxvYWQgbW9kZSBpcyBzdXBwb3J0ZWQuCi0gICAgICovCi0gICAgSkF1ZGlvVHJhY2soYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgIGNhbGxiYWNrX3QgY2JmLAotICAgICAgICAgICAgICAgIHZvaWQqIHVzZXIsCi0gICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAwLAotICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgID0gQVVESU9fU0VTU0lPTl9BTExPQ0FURSwKLSAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QqIHBBdHRyaWJ1dGVzID0gTlVMTCwKLSAgICAgICAgICAgICAgICBmbG9hdCBtYXhSZXF1aXJlZFNwZWVkID0gMS4wZik7Ci0KLSAgICAvKgotICAgICAgIC8vIFEuIE1heSBiZSB1c2VkIGluIEF1ZGlvVHJhY2suc2V0UHJlZmVycmVkRGV2aWNlKEF1ZGlvRGV2aWNlSW5mbyk/Ci0gICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAotCi0gICAgICAgLy8gVE9ETzogTm8gcGxhY2UgdG8gdXNlIHRoZXNlIHZhbHVlcy4KLSAgICAgICBpbnQzMl90IG5vdGlmaWNhdGlvbkZyYW1lcywKLSAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8sCi0gICAgKi8KLQotICAgIHZpcnR1YWwgfkpBdWRpb1RyYWNrKCk7Ci0KLSAgICBzaXplX3QgZnJhbWVDb3VudCgpOwotICAgIHNpemVfdCBjaGFubmVsQ291bnQoKTsKLQotICAgIC8qIFJldHVybnMgdGhpcyB0cmFjaydzIGVzdGltYXRlZCBsYXRlbmN5IGluIG1pbGxpc2Vjb25kcy4KLSAgICAgKiBUaGlzIGluY2x1ZGVzIHRoZSBsYXRlbmN5IGR1ZSB0byBBdWRpb1RyYWNrIGJ1ZmZlciBzaXplLCBBdWRpb01peGVyIChpZiBhbnkpCi0gICAgICogYW5kIGF1ZGlvIGhhcmR3YXJlIGRyaXZlci4KLSAgICAgKi8KLSAgICB1aW50MzJfdCBsYXRlbmN5KCk7Ci0KLSAgICAvKiBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBmcmFtZXMgcGxheWVkIHNpbmNlIHBsYXliYWNrIHN0YXJ0LgotICAgICAqIFRoZSBjb3VudGVyIHdpbGwgd3JhcCAob3ZlcmZsb3cpIHBlcmlvZGljYWxseSwgZS5nLiBldmVyeSB+MjcgaG91cnMgYXQgNDQuMSBrSHouCi0gICAgICogSXQgaXMgcmVzZXQgdG8gemVybyBieSBmbHVzaCgpLCByZWxvYWQoKSwgYW5kIHN0b3AoKS4KLSAgICAgKgotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICoKLSAgICAgKiBwb3NpdGlvbjogQWRkcmVzcyB3aGVyZSB0byByZXR1cm4gcGxheSBoZWFkIHBvc2l0aW9uLgotICAgICAqCi0gICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6Ci0gICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uCi0gICAgICogIC0gQkFEX1ZBTFVFOiBwb3NpdGlvbiBpcyBOVUxMCi0gICAgICovCi0gICAgc3RhdHVzX3QgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKTsKLQotICAgIC8vIFRPRE86IERvZXMgdGhpcyBjb21tZW50IGFwcGx5IHNhbWUgdG8gSmF2YSBBdWRpb1RyYWNrOjpnZXRUaW1lc3RhbXA/Ci0gICAgLy8gQ2hhbmdlZCB0aGUgcmV0dXJuIHR5cGUgZnJvbSBzdGF0dXNfdCB0byBib29sLCBzaW5jZSBKYXZhIEF1ZGlvVHJhY2s6OmdldFRpbWVzdGFtcCByZXR1cm5zCi0gICAgLy8gYm9vbGVhbi4gV2lsbCBKYXZhIGdldFRpbWVzdGFtcFdpdGhTdGF0dXMoKSBiZSBwdWJsaWM/Ci0gICAgLyogUG9sbCBmb3IgYSB0aW1lc3RhbXAgb24gZGVtYW5kLgotICAgICAqIFVzZSBpZiBFVkVOVF9ORVdfVElNRVNUQU1QIGlzIG5vdCBkZWxpdmVyZWQgb2Z0ZW4gZW5vdWdoIGZvciB5b3VyIG5lZWRzLAotICAgICAqIG9yIGlmIHlvdSBuZWVkIHRvIGdldCB0aGUgbW9zdCByZWNlbnQgdGltZXN0YW1wIG91dHNpZGUgb2YgdGhlIGV2ZW50IGNhbGxiYWNrIGhhbmRsZXIuCi0gICAgICogQ2F1dGlvbjogY2FsbGluZyB0aGlzIG1ldGhvZCB0b28gb2Z0ZW4gbWF5IGJlIGluZWZmaWNpZW50OwotICAgICAqIGlmIHlvdSBuZWVkIGEgaGlnaCByZXNvbHV0aW9uIG1hcHBpbmcgYmV0d2VlbiBmcmFtZSBwb3NpdGlvbiBhbmQgcHJlc2VudGF0aW9uIHRpbWUsCi0gICAgICogY29uc2lkZXIgaW1wbGVtZW50aW5nIHRoYXQgYXQgYXBwbGljYXRpb24gbGV2ZWwsIGJhc2VkIG9uIHRoZSBsb3cgcmVzb2x1dGlvbiB0aW1lc3RhbXBzLgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aW1lc3RhbXAgaXMgdmFsaWQuCi0gICAgICogVGhlIHRpbWVzdGFtcCBwYXJhbWV0ZXIgaXMgdW5kZWZpbmVkIG9uIHJldHVybiwgaWYgZmFsc2UgaXMgcmV0dXJuZWQuCi0gICAgICovCi0gICAgYm9vbCBnZXRUaW1lc3RhbXAoQXVkaW9UaW1lc3RhbXAmIHRpbWVzdGFtcCk7Ci0KLSAgICAvLyBUT0RPOiBUaGlzIGRvYyBpcyBqdXN0IGNvcGllZCBmcm9tIEF1ZGlvVHJhY2suaC4gUmV2aXNlIGl0IGFmdGVyIGltcGxlbWVuYXRpb24uCi0gICAgLyogUmV0dXJuIHRoZSBleHRlbmRlZCB0aW1lc3RhbXAsIHdpdGggYWRkaXRpb25hbCB0aW1lYmFzZSBpbmZvIGFuZCBpbXByb3ZlZCBkcmFpbiBiZWhhdmlvci4KLSAgICAgKgotICAgICAqIFRoaXMgaXMgc2ltaWxhciB0byB0aGUgQXVkaW9UcmFjay5qYXZhIEFQSToKLSAgICAgKiBnZXRUaW1lc3RhbXAoQE5vbk51bGwgQXVkaW9UaW1lc3RhbXAgdGltZXN0YW1wLCBAQXVkaW9UaW1lc3RhbXAuVGltZWJhc2UgaW50IHRpbWViYXNlKQotICAgICAqCi0gICAgICogU29tZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoaXMgbWV0aG9kIGFuZCB0aGUgZ2V0VGltZXN0YW1wKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApIG1ldGhvZAotICAgICAqCi0gICAgICogICAxLiBzdG9wKCkgYnkgaXRzZWxmIGRvZXMgbm90IHJlc2V0IHRoZSBmcmFtZSBwb3NpdGlvbi4KLSAgICAgKiAgICAgIEEgZm9sbG93aW5nIHN0YXJ0KCkgcmVzZXRzIHRoZSBmcmFtZSBwb3NpdGlvbiB0byAwLgotICAgICAqICAgMi4gZmx1c2goKSBieSBpdHNlbGYgZG9lcyBub3QgcmVzZXQgdGhlIGZyYW1lIHBvc2l0aW9uLgotICAgICAqICAgICAgVGhlIGZyYW1lIHBvc2l0aW9uIGFkdmFuY2VzIGJ5IHRoZSBudW1iZXIgb2YgZnJhbWVzIGZsdXNoZWQsCi0gICAgICogICAgICB3aGVuIHRoZSBmaXJzdCBmcmFtZSBhZnRlciBmbHVzaCByZWFjaGVzIHRoZSBhdWRpbyBzaW5rLgotICAgICAqICAgMy4gQk9PVFRJTUUgY2xvY2sgb2Zmc2V0cyBhcmUgcHJvdmlkZWQgdG8gaGVscCBzeW5jaHJvbml6ZSB3aXRoCi0gICAgICogICAgICBub24tYXVkaW8gc3RyZWFtcywgZS5nLiBzZW5zb3IgZGF0YS4KLSAgICAgKiAgIDQuIFBvc2l0aW9uIGlzIHJldHVybmVkIHdpdGggNjQgYml0cyBvZiByZXNvbHV0aW9uLgotICAgICAqCi0gICAgICogUGFyYW1ldGVyczoKLSAgICAgKiAgdGltZXN0YW1wOiBBIHBvaW50ZXIgdG8gdGhlIGNhbGxlciBhbGxvY2F0ZWQgRXh0ZW5kZWRUaW1lc3RhbXAuCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIE5PX0VSUk9SICAgIG9uIHN1Y2Nlc3M7IHRpbWVzdGFtcCBpcyBmaWxsZWQgd2l0aCB2YWxpZCBkYXRhLgotICAgICAqICAgICAgICAgQkFEX1ZBTFVFICAgaWYgdGltZXN0YW1wIGlzIE5VTEwuCi0gICAgICogICAgICAgICBXT1VMRF9CTE9DSyBpZiBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQoKSB3aGVuIHRoZSBudW1iZXIKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIG9mIGZyYW1lcyBjb25zdW1lZCBpcyBsZXNzIHRoYW4gdGhlCi0gICAgICogICAgICAgICAgICAgICAgICAgICBvdmVyYWxsIGhhcmR3YXJlIGxhdGVuY3kgdG8gcGh5c2ljYWwgb3V0cHV0LiBJbiBXT1VMRF9CTE9DSyBjYXNlcywKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIG9uZSBtaWdodCBwb2xsIGFnYWluLCBvciB1c2UgZ2V0UG9zaXRpb24oKSwgb3IgdXNlIDAgcG9zaXRpb24gYW5kCi0gICAgICogICAgICAgICAgICAgICAgICAgICBjdXJyZW50IHRpbWUgZm9yIHRoZSB0aW1lc3RhbXAuCi0gICAgICogICAgICAgICAgICAgICAgICAgICBJZiBXT1VMRF9CTE9DSyBpcyByZXR1cm5lZCwgdGhlIHRpbWVzdGFtcCBpcyBzdGlsbAotICAgICAqICAgICAgICAgICAgICAgICAgICAgbW9kaWZpZWQgd2l0aCB0aGUgTE9DQVRJT05fQ0xJRU5UIHBvcnRpb24gZmlsbGVkLgotICAgICAqICAgICAgICAgREVBRF9PQkpFQ1QgaWYgQXVkaW9GbGluZ2VyIGRpZXMgb3IgdGhlIG91dHB1dCBkZXZpY2UgY2hhbmdlcyBhbmQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIHRoZSB0cmFjayBjYW5ub3QgYmUgYXV0b21hdGljYWxseSByZXN0b3JlZC4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgIFRoZSBhcHBsaWNhdGlvbiBuZWVkcyB0byByZWNyZWF0ZSB0aGUgQXVkaW9UcmFjawotICAgICAqICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSB0aGUgYXVkaW8gZGV2aWNlIGNoYW5nZWQgb3IgQXVkaW9GbGluZ2VyIGRpZWQuCi0gICAgICogICAgICAgICAgICAgICAgICAgICBUaGlzIHR5cGljYWxseSBvY2N1cnMgZm9yIGRpcmVjdCBvciBvZmZsb2FkZWQgdHJhY2tzCi0gICAgICogICAgICAgICAgICAgICAgICAgICBvciBpZiBtRG9Ob3RSZWNvbm5lY3QgaXMgdHJ1ZS4KLSAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OICBpZiBjYWxsZWQgb24gYSBvZmZsb2FkZWQgb3IgZGlyZWN0IHRyYWNrLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgVXNlIGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKSBpbnN0ZWFkLgotICAgICAqLwotICAgIHN0YXR1c190IGdldFRpbWVzdGFtcChFeHRlbmRlZFRpbWVzdGFtcCAqdGltZXN0YW1wKTsKLQotICAgIC8qIFNldCBzb3VyY2UgcGxheWJhY2sgcmF0ZSBmb3IgdGltZXN0cmV0Y2gKLSAgICAgKiAxLjAgaXMgbm9ybWFsIHNwZWVkOiA8IDEuMCBpcyBzbG93ZXIsID4gMS4wIGlzIGZhc3RlcgotICAgICAqIDEuMCBpcyBub3JtYWwgcGl0Y2g6IDwgMS4wIGlzIGxvd2VyIHBpdGNoLCA+IDEuMCBpcyBoaWdoZXIgcGl0Y2gKLSAgICAgKgotICAgICAqIEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01JTiA8PSBzcGVlZCA8PSBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NQVgKLSAgICAgKiBBVURJT19USU1FU1RSRVRDSF9QSVRDSF9NSU4gPD0gcGl0Y2ggPD0gQVVESU9fVElNRVNUUkVUQ0hfUElUQ0hfTUFYCi0gICAgICoKLSAgICAgKiBTcGVlZCBpbmNyZWFzZXMgdGhlIHBsYXliYWNrIHJhdGUgb2YgbWVkaWEsIGJ1dCBkb2VzIG5vdCBhbHRlciBwaXRjaC4KLSAgICAgKiBQaXRjaCBpbmNyZWFzZXMgdGhlICJ0b25hbCBmcmVxdWVuY3kiIG9mIG1lZGlhLCBidXQgZG9lcyBub3QgYWZmZWN0IHRoZSBwbGF5YmFjayByYXRlLgotICAgICAqLwotICAgIHN0YXR1c190IHNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcGxheWJhY2tSYXRlKTsKLQotICAgIC8qIFJldHVybiBjdXJyZW50IHBsYXliYWNrIHJhdGUgKi8KLSAgICBjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSBnZXRQbGF5YmFja1JhdGUoKTsKLQotICAgIC8qIFNldHMgdGhlIHZvbHVtZSBzaGFwZXIgb2JqZWN0ICovCi0gICAgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAotICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pOwotCi0gICAgLyogU2V0IHRoZSBzZW5kIGxldmVsIGZvciB0aGlzIHRyYWNrLiBBbiBhdXhpbGlhcnkgZWZmZWN0IHNob3VsZCBiZSBhdHRhY2hlZAotICAgICAqIHRvIHRoZSB0cmFjayB3aXRoIGF0dGFjaEVmZmVjdCgpLiBMZXZlbCBtdXN0IGJlID49IDAuMCBhbmQgPD0gMS4wLgotICAgICAqLwotICAgIHN0YXR1c190IHNldEF1eEVmZmVjdFNlbmRMZXZlbChmbG9hdCBsZXZlbCk7Ci0KLSAgICAvKiBBdHRhY2ggdHJhY2sgYXV4aWxpYXJ5IG91dHB1dCB0byBzcGVjaWZpZWQgZWZmZWN0LiBVc2UgZWZmZWN0SWQgPSAwCi0gICAgICogdG8gZGV0YWNoIHRyYWNrIGZyb20gZWZmZWN0LgotICAgICAqCi0gICAgICogUGFyYW1ldGVyczoKLSAgICAgKgotICAgICAqIGVmZmVjdElkOiBlZmZlY3RJZCBvYnRhaW5lZCBmcm9tIEF1ZGlvRWZmZWN0OjppZCgpLgotICAgICAqCi0gICAgICogUmV0dXJuZWQgc3RhdHVzIChmcm9tIHV0aWxzL0Vycm9ycy5oKSBjYW4gYmU6Ci0gICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uCi0gICAgICogIC0gSU5WQUxJRF9PUEVSQVRJT046IFRoZSBlZmZlY3QgaXMgbm90IGFuIGF1eGlsaWFyeSBlZmZlY3QuCi0gICAgICogIC0gQkFEX1ZBTFVFOiBUaGUgc3BlY2lmaWVkIGVmZmVjdCBJRCBpcyBpbnZhbGlkLgotICAgICAqLwotICAgIHN0YXR1c190IGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpOwotCi0gICAgLyogU2V0IHZvbHVtZSBmb3IgdGhpcyB0cmFjaywgbW9zdGx5IHVzZWQgZm9yIGdhbWVzJyBzb3VuZCBlZmZlY3RzCi0gICAgICogbGVmdCBhbmQgcmlnaHQgdm9sdW1lcy4gTGV2ZWxzIG11c3QgYmUgPj0gMC4wIGFuZCA8PSAxLjAuCi0gICAgICogVGhpcyBpcyB0aGUgb2xkZXIgQVBJLiAgTmV3IGFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIHNldFZvbHVtZShmbG9hdCkgd2hlbiBwb3NzaWJsZS4KLSAgICAgKi8KLSAgICBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpOwotCi0gICAgLyogU2V0IHZvbHVtZSBmb3IgYWxsIGNoYW5uZWxzLiBUaGlzIGlzIHRoZSBwcmVmZXJyZWQgQVBJIGZvciBuZXcgYXBwbGljYXRpb25zLAotICAgICAqIGVzcGVjaWFsbHkgZm9yIG11bHRpLWNoYW5uZWwgY29udGVudC4KLSAgICAgKi8KLSAgICBzdGF0dXNfdCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lKTsKLQotICAgIC8vIFRPRE86IERvZXMgdGhpcyBjb21tZW50IGVxdWFsbHkgYXBwbHkgdG8gdGhlIEphdmEgQXVkaW9UcmFjazo6cGxheSgpPwotICAgIC8qIEFmdGVyIGl0J3MgY3JlYXRlZCB0aGUgdHJhY2sgaXMgbm90IGFjdGl2ZS4gQ2FsbCBzdGFydCgpIHRvCi0gICAgICogbWFrZSBpdCBhY3RpdmUuIElmIHNldCwgdGhlIGNhbGxiYWNrIHdpbGwgc3RhcnQgYmVpbmcgY2FsbGVkLgotICAgICAqIElmIHRoZSB0cmFjayB3YXMgcHJldmlvdXNseSBwYXVzZWQsIHZvbHVtZSBpcyByYW1wZWQgdXAgb3ZlciB0aGUgZmlyc3QgbWl4IGJ1ZmZlci4KLSAgICAgKi8KLSAgICBzdGF0dXNfdCBzdGFydCgpOwotCi0gICAgLy8gVE9ETzogRG9lcyB0aGlzIGNvbW1lbnQgc3RpbGwgYXBwbGllcz8gSXQgc2VlbXMgbm90LiAob2J0YWluQnVmZmVyLCBBdWRpb0ZsaW5nZXIsIC4uLikKLSAgICAvKiBBcyBhIGNvbnZlbmllbmNlIHdlIHByb3ZpZGUgYSB3cml0ZSgpIGludGVyZmFjZSB0byB0aGUgYXVkaW8gYnVmZmVyLgotICAgICAqIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgaW4gYnl0ZSB1bml0cy4KLSAgICAgKiBUaGlzIGlzIGltcGxlbWVudGVkIG9uIHRvcCBvZiBvYnRhaW5CdWZmZXIvcmVsZWFzZUJ1ZmZlci4gRm9yIGJlc3QKLSAgICAgKiBwZXJmb3JtYW5jZSB1c2UgY2FsbGJhY2tzLiBSZXR1cm5zIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiA+PSAwLAotICAgICAqIG9yIG9uZSBvZiB0aGUgZm9sbG93aW5nIG5lZ2F0aXZlIHN0YXR1cyBjb2RlczoKLSAgICAgKiAgICAgIElOVkFMSURfT1BFUkFUSU9OICAgQXVkaW9UcmFjayBpcyBjb25maWd1cmVkIGZvciBzdGF0aWMgYnVmZmVyIG9yIHN0cmVhbWluZyBtb2RlCi0gICAgICogICAgICBCQURfVkFMVUUgICAgICAgICAgIHNpemUgaXMgaW52YWxpZAotICAgICAqICAgICAgV09VTERfQkxPQ0sgICAgICAgICB3aGVuIG9idGFpbkJ1ZmZlcigpIHJldHVybnMgc2FtZSwgb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9UcmFjayB3YXMgc3RvcHBlZCBkdXJpbmcgdGhlIHdyaXRlCi0gICAgICogICAgICBERUFEX09CSkVDVCAgICAgICAgIHdoZW4gQXVkaW9GbGluZ2VyIGRpZXMgb3IgdGhlIG91dHB1dCBkZXZpY2UgY2hhbmdlcyBhbmQKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIHRyYWNrIGNhbm5vdCBiZSBhdXRvbWF0aWNhbGx5IHJlc3RvcmVkLgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgYXBwbGljYXRpb24gbmVlZHMgdG8gcmVjcmVhdGUgdGhlIEF1ZGlvVHJhY2sKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgYmVjYXVzZSB0aGUgYXVkaW8gZGV2aWNlIGNoYW5nZWQgb3IgQXVkaW9GbGluZ2VyIGRpZWQuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgdHlwaWNhbGx5IG9jY3VycyBmb3IgZGlyZWN0IG9yIG9mZmxvYWQgdHJhY2tzCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgIG9yIGlmIG1Eb05vdFJlY29ubmVjdCBpcyB0cnVlLgotICAgICAqICAgICAgb3IgYW55IG90aGVyIGVycm9yIGNvZGUgcmV0dXJuZWQgYnkgSUF1ZGlvVHJhY2s6OnN0YXJ0KCkgb3IgcmVzdG9yZVRyYWNrX2woKS4KLSAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIG9ubHkgcmV0dXJuIHdoZW4gYWxsIGRhdGEgaGFzIGJlZW4gdHJhbnNmZXJyZWQuIFNldCAnYmxvY2tpbmcnIHRvCi0gICAgICogZmFsc2UgZm9yIHRoZSBtZXRob2QgdG8gcmV0dXJuIGltbWVkaWF0ZWx5IHdpdGhvdXQgd2FpdGluZyB0byB0cnkgbXVsdGlwbGUgdGltZXMgdG8gd3JpdGUKLSAgICAgKiB0aGUgZnVsbCBjb250ZW50IG9mIHRoZSBidWZmZXIuCi0gICAgICovCi0gICAgc3NpemVfdCB3cml0ZShjb25zdCB2b2lkKiBidWZmZXIsIHNpemVfdCBzaXplLCBib29sIGJsb2NraW5nID0gdHJ1ZSk7Ci0KLSAgICAvLyBUT0RPOiBEb2VzIHRoaXMgY29tbWVudCBlcXVhbGx5IGFwcGx5IHRvIHRoZSBKYXZhIEF1ZGlvVHJhY2s6OnN0b3AoKT8KLSAgICAvKiBTdG9wIGEgdHJhY2suCi0gICAgICogSW4gc3RhdGljIGJ1ZmZlciBtb2RlLCB0aGUgdHJhY2sgaXMgc3RvcHBlZCBpbW1lZGlhdGVseS4KLSAgICAgKiBJbiBzdHJlYW1pbmcgbW9kZSwgdGhlIGNhbGxiYWNrIHdpbGwgY2Vhc2UgYmVpbmcgY2FsbGVkLiAgTm90ZSB0aGF0IG9idGFpbkJ1ZmZlcigpIHN0aWxsCi0gICAgICogd29ya3MgYW5kIHdpbGwgZmlsbCB1cCBidWZmZXJzIHVudGlsIHRoZSBwb29sIGlzIGV4aGF1c3RlZCwgYW5kIHRoZW4gd2lsbCByZXR1cm4gV09VTERfQkxPQ0suCi0gICAgICogSW4gc3RyZWFtaW5nIG1vZGUgdGhlIHN0b3AgZG9lcyBub3Qgb2NjdXIgaW1tZWRpYXRlbHk6IGFueSBkYXRhIHJlbWFpbmluZyBpbiB0aGUgYnVmZmVyCi0gICAgICogaXMgZmlyc3QgZHJhaW5lZCwgbWl4ZWQsIGFuZCBvdXRwdXQsIGFuZCBvbmx5IHRoZW4gaXMgdGhlIHRyYWNrIG1hcmtlZCBhcyBzdG9wcGVkLgotICAgICAqLwotICAgIHZvaWQgc3RvcCgpOwotICAgIGJvb2wgc3RvcHBlZCgpIGNvbnN0OwotCi0gICAgLy8gVE9ETzogRG9lcyB0aGlzIGNvbW1lbnQgZXF1YWxseSBhcHBseSB0byB0aGUgSmF2YSBBdWRpb1RyYWNrOjpmbHVzaCgpPwotICAgIC8qIEZsdXNoIGEgc3RvcHBlZCBvciBwYXVzZWQgdHJhY2suIEFsbCBwcmV2aW91c2x5IGJ1ZmZlcmVkIGRhdGEgaXMgZGlzY2FyZGVkIGltbWVkaWF0ZWx5LgotICAgICAqIFRoaXMgaGFzIHRoZSBlZmZlY3Qgb2YgZHJhaW5pbmcgdGhlIGJ1ZmZlcnMgd2l0aG91dCBtaXhpbmcgb3Igb3V0cHV0LgotICAgICAqIEZsdXNoIGlzIGludGVuZGVkIGZvciBzdHJlYW1pbmcgbW9kZSwgZm9yIGV4YW1wbGUgYmVmb3JlIHN3aXRjaGluZyB0byBub24tY29udGlndW91cyBjb250ZW50LgotICAgICAqIFRoaXMgZnVuY3Rpb24gaXMgYSBuby1vcCBpZiB0aGUgdHJhY2sgaXMgbm90IHN0b3BwZWQgb3IgcGF1c2VkLCBvciB1c2VzIGEgc3RhdGljIGJ1ZmZlci4KLSAgICAgKi8KLSAgICB2b2lkIGZsdXNoKCk7Ci0KLSAgICAvLyBUT0RPOiBEb2VzIHRoaXMgY29tbWVudCBlcXVhbGx5IGFwcGx5IHRvIHRoZSBKYXZhIEF1ZGlvVHJhY2s6OnBhdXNlKCk/Ci0gICAgLy8gQXQgbGVhc3Qgd2UgYXJlIG5vdCB1c2luZyBvYnRhaW5CdWZmZXIuCi0gICAgLyogUGF1c2UgYSB0cmFjay4gQWZ0ZXIgcGF1c2UsIHRoZSBjYWxsYmFjayB3aWxsIGNlYXNlIGJlaW5nIGNhbGxlZCBhbmQKLSAgICAgKiBvYnRhaW5CdWZmZXIgcmV0dXJucyBXT1VMRF9CTE9DSy4gTm90ZSB0aGF0IG9idGFpbkJ1ZmZlcigpIHN0aWxsIHdvcmtzCi0gICAgICogYW5kIHdpbGwgZmlsbCB1cCBidWZmZXJzIHVudGlsIHRoZSBwb29sIGlzIGV4aGF1c3RlZC4KLSAgICAgKiBWb2x1bWUgaXMgcmFtcGVkIGRvd24gb3ZlciB0aGUgbmV4dCBtaXggYnVmZmVyIGZvbGxvd2luZyB0aGUgcGF1c2UgcmVxdWVzdCwKLSAgICAgKiBhbmQgdGhlbiB0aGUgdHJhY2sgaXMgbWFya2VkIGFzIHBhdXNlZC4gSXQgY2FuIGJlIHJlc3VtZWQgd2l0aCByYW1wIHVwIGJ5IHN0YXJ0KCkuCi0gICAgICovCi0gICAgdm9pZCBwYXVzZSgpOwotCi0gICAgYm9vbCBpc1BsYXlpbmcoKSBjb25zdDsKLQotICAgIC8qIFJldHVybiBjdXJyZW50IHNvdXJjZSBzYW1wbGUgcmF0ZSBpbiBIei4KLSAgICAgKiBJZiBzcGVjaWZpZWQgYXMgemVybyBpbiBjb25zdHJ1Y3RvciwgdGhpcyB3aWxsIGJlIHRoZSBzaW5rIHNhbXBsZSByYXRlLgotICAgICAqLwotICAgIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKTsKLQotICAgIC8qIFJldHVybnMgdGhlIGJ1ZmZlciBkdXJhdGlvbiBpbiBtaWNyb3NlY29uZHMgYXQgY3VycmVudCBwbGF5YmFjayByYXRlLiAqLwotICAgIHN0YXR1c190IGdldEJ1ZmZlckR1cmF0aW9uSW5VcyhpbnQ2NF90ICpkdXJhdGlvbik7Ci0KLSAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQoKTsKLQotICAgIC8qCi0gICAgICogRHVtcHMgdGhlIHN0YXRlIG9mIGFuIGF1ZGlvIHRyYWNrLgotICAgICAqIE5vdCBhIGdlbmVyYWwtcHVycG9zZSBBUEk7IGludGVuZGVkIG9ubHkgZm9yIHVzZSBieSBtZWRpYSBwbGF5ZXIgc2VydmljZSB0byBkdW1wIGl0cyB0cmFja3MuCi0gICAgICovCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwotCi0gICAgLyogUmV0dXJucyB0aGUgSUQgb2YgdGhlIGF1ZGlvIGRldmljZSBhY3R1YWxseSB1c2VkIGJ5IHRoZSBvdXRwdXQgdG8gd2hpY2ggdGhpcyBBdWRpb1RyYWNrIGlzCi0gICAgICogYXR0YWNoZWQuIFdoZW4gdGhlIEF1ZGlvVHJhY2sgaXMgaW5hY3RpdmUsIGl0IHdpbGwgcmV0dXJuIEFVRElPX1BPUlRfSEFORExFX05PTkUuCi0gICAgICovCi0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRSb3V0ZWREZXZpY2VJZCgpOwotCi0gICAgLyogUmV0dXJucyB0aGUgSUQgb2YgdGhlIGF1ZGlvIHNlc3Npb24gdGhpcyBBdWRpb1RyYWNrIGJlbG9uZ3MgdG8uICovCi0gICAgYXVkaW9fc2Vzc2lvbl90IGdldEF1ZGlvU2Vzc2lvbklkKCk7Ci0KLSAgICAvKiBTZWxlY3RzIHRoZSBhdWRpbyBkZXZpY2UgdG8gdXNlIGZvciBvdXRwdXQgb2YgdGhpcyBBdWRpb1RyYWNrLiBBIHZhbHVlIG9mCi0gICAgICogQVVESU9fUE9SVF9IQU5ETEVfTk9ORSBpbmRpY2F0ZXMgZGVmYXVsdCByb3V0aW5nLgotICAgICAqCi0gICAgICogUGFyYW1ldGVyczoKLSAgICAgKiAgVGhlIGRldmljZSBJRCBvZiB0aGUgc2VsZWN0ZWQgZGV2aWNlIChhcyByZXR1cm5lZCBieSB0aGUgQXVkaW9EZXZpY2VzTWFuYWdlciBBUEkpLgotICAgICAqCi0gICAgICogUmV0dXJuZWQgdmFsdWU6Ci0gICAgICogIC0gTk9fRVJST1I6IHN1Y2Nlc3NmdWwgb3BlcmF0aW9uCi0gICAgICogIC0gQkFEX1ZBTFVFOiBmYWlsZWQgdG8gZmluZCB0aGUgdmFsaWQgb3V0cHV0IGRldmljZSB3aXRoIGdpdmVuIGRldmljZSBJZC4KLSAgICAgKi8KLSAgICBzdGF0dXNfdCBzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7Ci0KLSAgICAvLyBUT0RPOiBBZGQgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHdoZW4gaXQgaXMgcG9zc2libGUgdG8gY2hlY2suCi0gICAgLy8gVE9ETzogQWRkIEFVRElPX0ZMQUdfSFdfQVZfU1lOQyB3aGVuIGl0IGlzIHBvc3NpYmxlIHRvIGNoZWNrLgotICAgIC8qIFJldHVybnMgdGhlIGZsYWdzICovCi0gICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KLQotICAgIC8qIE9idGFpbiB0aGUgcGVuZGluZyBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgZm9yIHBsYXliYWNrIG9mIHB1cmUgUENNIGRhdGEgcmVtYWluaW5nIGluCi0gICAgICogQXVkaW9UcmFjay4KLSAgICAgKgotICAgICAqIFJldHVybnMgTk9fRVJST1IgaWYgc3VjY2Vzc2Z1bC4KLSAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBBdWRpb1RyYWNrIGRvZXMgbm90IGNvbnRhaW4gcHVyZSBQQ00gZGF0YS4KLSAgICAgKiAgICAgICAgIEJBRF9WQUxVRSBpZiBtc2VjIGlzIG51bGxwdHIuCi0gICAgICovCi0gICAgc3RhdHVzX3QgcGVuZGluZ0R1cmF0aW9uKGludDMyX3QgKm1zZWMpOwotCi0gICAgLyogQWRkcyBhbiBBdWRpb0RldmljZUNhbGxiYWNrLiBUaGUgY2FsbGVyIHdpbGwgYmUgbm90aWZpZWQgd2hlbiB0aGUgYXVkaW8gZGV2aWNlIHRvIHdoaWNoIHRoaXMKLSAgICAgKiBBdWRpb1RyYWNrIGlzIHJvdXRlZCBpcyB1cGRhdGVkLgotICAgICAqIFJlcGxhY2VzIGFueSBwcmV2aW91c2x5IGluc3RhbGxlZCBjYWxsYmFjay4KLSAgICAgKgotICAgICAqIFBhcmFtZXRlcnM6Ci0gICAgICoKLSAgICAgKiBjYWxsYmFjazogVGhlIGNhbGxiYWNrIGludGVyZmFjZQotICAgICAqCi0gICAgICogUmV0dXJucyBOT19FUlJPUiBpZiBzdWNjZXNzZnVsLgotICAgICAqICAgICAgICAgSU5WQUxJRF9PUEVSQVRJT04gaWYgdGhlIHNhbWUgY2FsbGJhY2sgaXMgYWxyZWFkeSBpbnN0YWxsZWQuCi0gICAgICogICAgICAgICBOT19JTklUIG9yIFBSRU1JU1NJT05fREVOSUVEIGlmIEF1ZGlvRmxpbmdlciBzZXJ2aWNlIGlzIG5vdCByZWFjaGFibGUKLSAgICAgKiAgICAgICAgIEJBRF9WQUxVRSBpZiB0aGUgY2FsbGJhY2sgaXMgTlVMTAotICAgICAqLwotICAgIHN0YXR1c190IGFkZEF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayk7Ci0KLSAgICAvKiBSZW1vdmVzIGFuIEF1ZGlvRGV2aWNlQ2FsbGJhY2suCi0gICAgICoKLSAgICAgKiBQYXJhbWV0ZXJzOgotICAgICAqCi0gICAgICogY2FsbGJhY2s6IFRoZSBjYWxsYmFjayBpbnRlcmZhY2UKLSAgICAgKgotICAgICAqIFJldHVybnMgTk9fRVJST1IgaWYgc3VjY2Vzc2Z1bC4KLSAgICAgKiAgICAgICAgIElOVkFMSURfT1BFUkFUSU9OIGlmIHRoZSBjYWxsYmFjayBpcyBub3QgaW5zdGFsbGVkCi0gICAgICogICAgICAgICBCQURfVkFMVUUgaWYgdGhlIGNhbGxiYWNrIGlzIE5VTEwKLSAgICAgKi8KLSAgICBzdGF0dXNfdCByZW1vdmVBdWRpb0RldmljZUNhbGxiYWNrKGNvbnN0IHNwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiYgY2FsbGJhY2spOwotCi1wcml2YXRlOgotICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsKLQotICAgIGpjbGFzcyBtQXVkaW9UcmFja0NsczsKLSAgICBqb2JqZWN0IG1BdWRpb1RyYWNrT2JqOwotCi0gICAgLyogQ3JlYXRlcyBhIEphdmEgVm9sdW1lU2hhcGVyLkNvbmZpZ3VyYXRpb24gb2JqZWN0IGZyb20gVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uICovCi0gICAgam9iamVjdCBjcmVhdGVWb2x1bWVTaGFwZXJDb25maWd1cmF0aW9uT2JqKAotICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZyk7Ci0KLSAgICAvKiBDcmVhdGVzIGEgSmF2YSBWb2x1bWVTaGFwZXIuT3BlcmF0aW9uIG9iamVjdCBmcm9tIFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uICovCi0gICAgam9iamVjdCBjcmVhdGVWb2x1bWVTaGFwZXJPcGVyYXRpb25PYmooCi0gICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pOwotCi0gICAgLyogQ3JlYXRlcyBhIEphdmEgU3RyZWFtRXZlbnRDYWxsYmFjayBvYmplY3QgKi8KLSAgICBqb2JqZWN0IGNyZWF0ZVN0cmVhbUV2ZW50Q2FsbGJhY2soY2FsbGJhY2tfdCBjYmYsIHZvaWQqIHVzZXIpOwotCi0gICAgLyogQ3JlYXRlcyBhIEphdmEgRXhlY3V0b3Igb2JqZWN0IGZvciBydW5uaW5nIGEgY2FsbGJhY2sgKi8KLSAgICBqb2JqZWN0IGNyZWF0ZUNhbGxiYWNrRXhlY3V0b3IoKTsKLQotICAgIHN0YXR1c190IGphdmFUb05hdGl2ZVN0YXR1cyhpbnQgamF2YVN0YXR1cyk7Ci19OwotCi19OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgLy8gQU5EUk9JRF9KQVVESU9UUkFDS19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDViOGU0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qCi0qKgotKiogQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLSNpZm5kZWYgQU5EUk9JRF9NRURJQVBMQVlFUjJBVURJT09VVFBVVF9ICi0jZGVmaW5lIEFORFJPSURfTUVESUFQTEFZRVIyQVVESU9PVVRQVVRfSAotCi0jaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oPgotCi0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBBdWRpb1RyYWNrOwotCi1jbGFzcyBNZWRpYVBsYXllcjJBdWRpb091dHB1dCA6IHB1YmxpYyBNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luawotewotICAgIGNsYXNzIENhbGxiYWNrRGF0YTsKLQotcHVibGljOgotICAgIE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICogYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGRldmljZUNhbGxiYWNrKTsKLSAgICB2aXJ0dWFsIH5NZWRpYVBsYXllcjJBdWRpb091dHB1dCgpOwotCi0gICAgdmlydHVhbCBib29sIHJlYWR5KCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVRyYWNrICE9IDA7Ci0gICAgfQotICAgIHZpcnR1YWwgc3NpemVfdCBidWZmZXJTaXplKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzc2l6ZV90IGZyYW1lQ291bnQoKSBjb25zdDsKLSAgICB2aXJ0dWFsIHNzaXplX3QgY2hhbm5lbENvdW50KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzc2l6ZV90IGZyYW1lU2l6ZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgdWludDMyX3QgbGF0ZW5jeSgpIGNvbnN0OwotICAgIHZpcnR1YWwgZmxvYXQgbXNlY3NQZXJGcmFtZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UG9zaXRpb24odWludDMyX3QgKnBvc2l0aW9uKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCAmdHMpIGNvbnN0OwotICAgIHZpcnR1YWwgaW50NjRfdCBnZXRQbGF5ZWRPdXREdXJhdGlvblVzKGludDY0X3Qgbm93VXMpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVzV3JpdHRlbih1aW50MzJfdCAqZnJhbWVzd3JpdHRlbikgY29uc3Q7Ci0gICAgdmlydHVhbCBhdWRpb19zZXNzaW9uX3QgZ2V0U2Vzc2lvbklkKCkgY29uc3Q7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBnZXRTYW1wbGVSYXRlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBpbnQ2NF90IGdldEJ1ZmZlckR1cmF0aW9uSW5VcygpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBvcGVuKAotICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsIGludCBidWZmZXJDb3VudCwKLSAgICAgICAgICAgIEF1ZGlvQ2FsbGJhY2sgY2IsIHZvaWQgKmNvb2tpZSwKLSAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgIGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190ICpvZmZsb2FkSW5mbyA9IE5VTEwsCi0gICAgICAgICAgICBib29sIGRvTm90UmVjb25uZWN0ID0gZmFsc2UsCi0gICAgICAgICAgICB1aW50MzJfdCBzdWdnZXN0ZWRGcmFtZUNvdW50ID0gMCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0gICAgdmlydHVhbCBzc2l6ZV90IHdyaXRlKGNvbnN0IHZvaWQqIGJ1ZmZlciwgc2l6ZV90IHNpemUsIGJvb2wgYmxvY2tpbmcgPSB0cnVlKTsKLSAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpOwotICAgIHZpcnR1YWwgdm9pZCBmbHVzaCgpOwotICAgIHZpcnR1YWwgdm9pZCBwYXVzZSgpOwotICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpOwotICAgIHZvaWQgc2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSk7Ci0gICAgdmlydHVhbCBhdWRpb19zdHJlYW1fdHlwZV90IGdldEF1ZGlvU3RyZWFtVHlwZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1TdHJlYW1UeXBlOwotICAgIH0KLSAgICB2b2lkIHNldEF1ZGlvQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKiBhdHRyaWJ1dGVzKTsKLQotICAgIHZvaWQgc2V0Vm9sdW1lKGZsb2F0IGxlZnQsIGZsb2F0IHJpZ2h0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQbGF5YmFja1JhdGUoQXVkaW9QbGF5YmFja1JhdGUqIHJhdGUgLyogbm9ubnVsbCAqLyk7Ci0KLSAgICBzdGF0dXNfdCBzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpOwotICAgIHN0YXR1c190IGF0dGFjaEF1eEVmZmVjdChpbnQgZWZmZWN0SWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OwotCi0gICAgc3RhdGljIGJvb2wgaXNPbkVtdWxhdG9yKCk7Ci0gICAgc3RhdGljIGludCBnZXRNaW5CdWZmZXJDb3VudCgpOwotICAgIHZpcnR1YWwgYm9vbCBuZWVkc1RyYWlsaW5nUGFkZGluZygpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIC8vIFRPRE86IHJldHVybiBjb3JyZWN0IHZhbHVlLgotICAgICAgICAvL3JldHVybiBtTmV4dE91dHB1dCA9PSBOVUxMOwotICAgIH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7Ci0gICAgdmlydHVhbCBTdHJpbmc4IGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7Ci0KLSAgICAvLyBBdWRpb1JvdXRpbmcKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFJvdXRlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QqIGRldmljZUlkKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKLQotcHJpdmF0ZToKLSAgICBzdGF0aWMgdm9pZCBzZXRNaW5CdWZmZXJDb3VudCgpOwotICAgIHN0YXRpYyB2b2lkIENhbGxiYWNrV3JhcHBlcihpbnQgZXZlbnQsIHZvaWQgKm1lLCB2b2lkICppbmZvKTsKLSAgICB2b2lkIGRlbGV0ZVJlY3ljbGVkVHJhY2tfbCgpOwotICAgIHZvaWQgY2xvc2VfbCgpOwotICAgIHN0YXR1c190IHVwZGF0ZVRyYWNrX2woKTsKLQotICAgIHNwPEF1ZGlvVHJhY2s+ICAgICAgICAgIG1UcmFjazsKLSAgICBBdWRpb0NhbGxiYWNrICAgICAgICAgICBtQ2FsbGJhY2s7Ci0gICAgdm9pZCAqICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrQ29va2llOwotICAgIENhbGxiYWNrRGF0YSAqICAgICAgICAgIG1DYWxsYmFja0RhdGE7Ci0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgbVN0cmVhbVR5cGU7Ci0gICAgYXVkaW9fYXR0cmlidXRlc190ICogICAgbUF0dHJpYnV0ZXM7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbUxlZnRWb2x1bWU7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbVJpZ2h0Vm9sdW1lOwotICAgIEF1ZGlvUGxheWJhY2tSYXRlICAgICAgIG1QbGF5YmFja1JhdGU7Ci0gICAgdWludDMyX3QgICAgICAgICAgICAgICAgbVNhbXBsZVJhdGVIejsgLy8gc2FtcGxlIHJhdGUgb2YgdGhlIGNvbnRlbnQsIGFzIHNldCBpbiBvcGVuKCkKLSAgICBmbG9hdCAgICAgICAgICAgICAgICAgICBtTXNlY3NQZXJGcmFtZTsKLSAgICBzaXplX3QgICAgICAgICAgICAgICAgICBtRnJhbWVTaXplOwotICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgIG1TZXNzaW9uSWQ7Ci0gICAgdWlkX3QgICAgICAgICAgICAgICAgICAgbVVpZDsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICBtUGlkOwotICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1TZW5kTGV2ZWw7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUF1eEVmZmVjdElkOwotICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICAgIG1GbGFnczsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtU2VsZWN0ZWREZXZpY2VJZDsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtUm91dGVkRGV2aWNlSWQ7Ci0gICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbURldmljZUNhbGxiYWNrRW5hYmxlZDsKLSAgICB3cDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4gICAgICAgIG1EZXZpY2VDYWxsYmFjazsKLSAgICBtdXRhYmxlIE11dGV4ICAgICAgICAgICBtTG9jazsKLQotICAgIC8vIHN0YXRpYyB2YXJpYWJsZXMgYmVsb3cgbm90IHByb3RlY3RlZCBieSBtdXRleAotICAgIHN0YXRpYyBib29sICAgICAgICAgICAgIG1Jc09uRW11bGF0b3I7Ci0gICAgc3RhdGljIGludCAgICAgICAgICAgICAgbU1pbkJ1ZmZlckNvdW50OyAgLy8gMTIgZm9yIGVtdWxhdG9yOyBvdGhlcndpc2UgNAotCi0gICAgLy8gQ2FsbGJhY2tEYXRhIGlzIHdoYXQgaXMgcGFzc2VkIHRvIHRoZSBBdWRpb1RyYWNrIGFzIHRoZSAidXNlciIgZGF0YS4KLSAgICAvLyBXZSBuZWVkIHRvIGJlIGFibGUgdG8gdGFyZ2V0IHRoaXMgdG8gYSBkaWZmZXJlbnQgT3V0cHV0IG9uIHRoZSBmbHksCi0gICAgLy8gc28gd2UgY2FuJ3QgdXNlIHRoZSBPdXRwdXQgaXRzZWxmIGZvciB0aGlzLgotICAgIGNsYXNzIENhbGxiYWNrRGF0YSB7Ci0gICAgICAgIGZyaWVuZCBNZWRpYVBsYXllcjJBdWRpb091dHB1dDsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGV4cGxpY2l0IENhbGxiYWNrRGF0YShNZWRpYVBsYXllcjJBdWRpb091dHB1dCAqY29va2llKSB7Ci0gICAgICAgICAgICBtRGF0YSA9IGNvb2tpZTsKLSAgICAgICAgICAgIG1Td2l0Y2hpbmcgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBNZWRpYVBsYXllcjJBdWRpb091dHB1dCAqZ2V0T3V0cHV0KCkgY29uc3QgewotICAgICAgICAgICAgcmV0dXJuIG1EYXRhOwotICAgICAgICB9Ci0gICAgICAgIHZvaWQgc2V0T3V0cHV0KE1lZGlhUGxheWVyMkF1ZGlvT3V0cHV0KiBuZXdjb29raWUpIHsKLSAgICAgICAgICAgIG1EYXRhID0gbmV3Y29va2llOwotICAgICAgICB9Ci0gICAgICAgIC8vIGxvY2svdW5sb2NrIGFyZSB1c2VkIGJ5IHRoZSBjYWxsYmFjayBiZWZvcmUgYWNjZXNzaW5nIHRoZSBwYXlsb2FkIG9mIHRoaXMgb2JqZWN0Ci0gICAgICAgIHZvaWQgbG9jaygpIGNvbnN0IHsKLSAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgfQotICAgICAgICB2b2lkIHVubG9jaygpIGNvbnN0IHsKLSAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdHJ5QmVnaW5UcmFja1N3aXRjaC9lbmRUcmFja1N3aXRjaCBhcmUgdXNlZCB3aGVuIHRoZSBDYWxsYmFja0RhdGEgaXMgaGFuZGVkIG92ZXIKLSAgICAgICAgLy8gdG8gdGhlIG5leHQgc2luay4KLQotICAgICAgICAvLyB0cnlCZWdpblRyYWNrU3dpdGNoKCkgcmV0dXJucyB0cnVlIG9ubHkgaWYgaXQgb2J0YWlucyB0aGUgbG9jay4KLSAgICAgICAgYm9vbCB0cnlCZWdpblRyYWNrU3dpdGNoKCkgewotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtU3dpdGNoaW5nLCAidHJ5QmVnaW5UcmFja1N3aXRjaCgpIGFscmVhZHkgY2FsbGVkIik7Ci0gICAgICAgICAgICBpZiAobUxvY2sudHJ5TG9jaygpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVN3aXRjaGluZyA9IHRydWU7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICB2b2lkIGVuZFRyYWNrU3dpdGNoKCkgewotICAgICAgICAgICAgaWYgKG1Td2l0Y2hpbmcpIHsKLSAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Td2l0Y2hpbmcgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgTWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQgKm1EYXRhOwotICAgICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOyAvLyBhIHJlY3Vyc2l2ZSBtdXRleCBtaWdodCBtYWtlIHRoaXMgdW5uZWNlc3NhcnkuCi0gICAgICAgIGJvb2wgbVN3aXRjaGluZzsKLSAgICAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ2FsbGJhY2tEYXRhKTsKLSAgICB9OwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfTUVESUFQTEFZRVIyQVVESU9PVVRQVVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmJmODkxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDI4MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEFORFJPSURfTUVESUFQTEFZRVIySU5URVJGQUNFX0gKLSNkZWZpbmUgQU5EUk9JRF9NRURJQVBMQVlFUjJJTlRFUkZBQ0VfSAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9BVlN5bmNTZXR0aW5ncy5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1RpbWVzdGFtcC5oPgotI2luY2x1ZGUgPG1lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWV0YWRhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMlR5cGVzLmg+Ci0KLS8vIEZ3ZCBkZWNsIHRvIG1ha2Ugc3VyZSBldmVyeW9uZSBhZ3JlZXMgdGhhdCB0aGUgc2NvcGUgb2Ygc3RydWN0IHNvY2thZGRyX2luIGlzCi0vLyBnbG9iYWwsIGFuZCBub3QgaW4gYW5kcm9pZDo6Ci1zdHJ1Y3Qgc29ja2FkZHJfaW47Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IERhdGFTb3VyY2VEZXNjOwotY2xhc3MgUGFyY2VsOwotc3RydWN0IEFOYXRpdmVXaW5kb3dXcmFwcGVyOwotCi0jZGVmaW5lIERFRkFVTFRfQVVESU9TSU5LX0JVRkZFUkNPVU5UIDQKLSNkZWZpbmUgREVGQVVMVF9BVURJT1NJTktfQlVGRkVSU0laRSAxMjAwCi0jZGVmaW5lIERFRkFVTFRfQVVESU9TSU5LX1NBTVBMRVJBVEUgNDQxMDAKLQotLy8gd2hlbiB0aGUgY2hhbm5lbCBtYXNrIGlzbid0IGtub3duLCB1c2UgdGhlIGNoYW5uZWwgY291bnQgdG8gZGVyaXZlIGEgbWFzayBpbiBBdWRpb1Npbms6Om9wZW4oKQotI2RlZmluZSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIgMAotCi0vLyBkdXJhdGlvbiBiZWxvdyB3aGljaCB3ZSBkbyBub3QgYWxsb3cgZGVlcCBhdWRpbyBidWZmZXJpbmcKLSNkZWZpbmUgQVVESU9fU0lOS19NSU5fREVFUF9CVUZGRVJfRFVSQVRJT05fVVMgNTAwMDAwMAotCi1jbGFzcyBNZWRpYVBsYXllcjJJbnRlcmZhY2VMaXN0ZW5lcjogcHVibGljIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIHZvaWQgbm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICpvYmopID0gMDsKLX07Ci0KLWNsYXNzIE1lZGlhUGxheWVyMkludGVyZmFjZSA6IHB1YmxpYyBBSGFuZGxlciB7Ci1wdWJsaWM6Ci0gICAgLy8gQXVkaW9TaW5rOiBhYnN0cmFjdGlvbiBsYXllciBmb3IgYXVkaW8gb3V0cHV0Ci0gICAgY2xhc3MgQXVkaW9TaW5rIDogcHVibGljIFJlZkJhc2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgZW51bSBjYl9ldmVudF90IHsKLSAgICAgICAgICAgIENCX0VWRU5UX0ZJTExfQlVGRkVSLCAgIC8vIFJlcXVlc3QgdG8gd3JpdGUgbW9yZSBkYXRhIHRvIGJ1ZmZlci4KLSAgICAgICAgICAgIENCX0VWRU5UX1NUUkVBTV9FTkQsICAgIC8vIFNlbnQgYWZ0ZXIgYWxsIHRoZSBidWZmZXJzIHF1ZXVlZCBpbiBBRiBhbmQgSFcgYXJlIHBsYXllZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmFjayAoYWZ0ZXIgc3RvcCBpcyBjYWxsZWQpCi0gICAgICAgICAgICBDQl9FVkVOVF9URUFSX0RPV04gICAgICAvLyBUaGUgQXVkaW9UcmFjayB3YXMgaW52YWxpZGF0ZWQgZHVlIHRvIHVzZSBjYXNlIGNoYW5nZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5lZWQgdG8gcmUtZXZhbHVhdGUgb2ZmbG9hZGluZyBvcHRpb25zCi0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gQ2FsbGJhY2sgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGFjdHVhbGx5IHdyaXR0ZW4gdG8gdGhlIGJ1ZmZlci4KLSAgICAgICAgdHlwZWRlZiBzaXplX3QgKCpBdWRpb0NhbGxiYWNrKSgKLSAgICAgICAgICAgICAgICBBdWRpb1NpbmsgKmF1ZGlvU2luaywgdm9pZCAqYnVmZmVyLCBzaXplX3Qgc2l6ZSwgdm9pZCAqY29va2llLCBjYl9ldmVudF90IGV2ZW50KTsKLQotICAgICAgICB2aXJ0dWFsIH5BdWRpb1NpbmsoKSB7fQotICAgICAgICB2aXJ0dWFsIGJvb2wgcmVhZHkoKSBjb25zdCA9IDA7IC8vIGF1ZGlvIG91dHB1dCBpcyBvcGVuIGFuZCByZWFkeQotICAgICAgICB2aXJ0dWFsIHNzaXplX3QgYnVmZmVyU2l6ZSgpIGNvbnN0ID0gMDsKLSAgICAgICAgdmlydHVhbCBzc2l6ZV90IGZyYW1lQ291bnQoKSBjb25zdCA9IDA7Ci0gICAgICAgIHZpcnR1YWwgc3NpemVfdCBjaGFubmVsQ291bnQoKSBjb25zdCA9IDA7Ci0gICAgICAgIHZpcnR1YWwgc3NpemVfdCBmcmFtZVNpemUoKSBjb25zdCA9IDA7Ci0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgbGF0ZW5jeSgpIGNvbnN0ID0gMDsKLSAgICAgICAgdmlydHVhbCBmbG9hdCBtc2Vjc1BlckZyYW1lKCkgY29uc3QgPSAwOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBvc2l0aW9uKHVpbnQzMl90ICpwb3NpdGlvbikgY29uc3QgPSAwOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCAmdHMpIGNvbnN0ID0gMDsKLSAgICAgICAgdmlydHVhbCBpbnQ2NF90IGdldFBsYXllZE91dER1cmF0aW9uVXMoaW50NjRfdCBub3dVcykgY29uc3QgPSAwOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEZyYW1lc1dyaXR0ZW4odWludDMyX3QgKmZyYW1lc3dyaXR0ZW4pIGNvbnN0ID0gMDsKLSAgICAgICAgdmlydHVhbCBhdWRpb19zZXNzaW9uX3QgZ2V0U2Vzc2lvbklkKCkgY29uc3QgPSAwOwotICAgICAgICB2aXJ0dWFsIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0QXVkaW9TdHJlYW1UeXBlKCkgY29uc3QgPSAwOwotICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFNhbXBsZVJhdGUoKSBjb25zdCA9IDA7Ci0gICAgICAgIHZpcnR1YWwgaW50NjRfdCBnZXRCdWZmZXJEdXJhdGlvbkluVXMoKSBjb25zdCA9IDA7Ci0KLSAgICAgICAgLy8gSWYgbm8gY2FsbGJhY2sgaXMgc3BlY2lmaWVkLCB1c2UgdGhlICJ3cml0ZSIgQVBJIGJlbG93IHRvIHN1Ym1pdAotICAgICAgICAvLyBhdWRpbyBkYXRhLgotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW4oCi0gICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgaW50IGNoYW5uZWxDb3VudCwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0PUFVRElPX0ZPUk1BVF9QQ01fMTZfQklULAotICAgICAgICAgICAgICAgIGludCBidWZmZXJDb3VudD1ERUZBVUxUX0FVRElPU0lOS19CVUZGRVJDT1VOVCwKLSAgICAgICAgICAgICAgICBBdWRpb0NhbGxiYWNrIGNiID0gTlVMTCwKLSAgICAgICAgICAgICAgICB2b2lkICpjb29raWUgPSBOVUxMLAotICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAqb2ZmbG9hZEluZm8gPSBOVUxMLAotICAgICAgICAgICAgICAgIGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBzdWdnZXN0ZWRGcmFtZUNvdW50ID0gMCkgPSAwOwotCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoKSA9IDA7Ci0KLSAgICAgICAgLyogSW5wdXQgcGFyYW1ldGVyIHxzaXplfCBpcyBpbiBieXRlIHVuaXRzIHN0b3JlZCBpbiB8YnVmZmVyfC4KLSAgICAgICAgICogRGF0YSBpcyBjb3BpZWQgb3ZlciBhbmQgYWN0dWFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuICg+PSAwKQotICAgICAgICAgKiBpcyByZXR1cm5lZCwgb3Igbm8gZGF0YSBpcyBjb3BpZWQgYW5kIGEgbmVnYXRpdmUgc3RhdHVzIGNvZGUKLSAgICAgICAgICogaXMgcmV0dXJuZWQgKGV2ZW4gd2hlbiB8YmxvY2tpbmd8IGlzIHRydWUpLgotICAgICAgICAgKiBXaGVuIHxibG9ja2luZ3wgaXMgZmFsc2UsIEF1ZGlvU2luayB3aWxsIGltbWVkaWF0ZWx5IHJldHVybiBhZnRlcgotICAgICAgICAgKiBwYXJ0IG9mIG9yIGZ1bGwgfGJ1ZmZlcnwgaXMgY29waWVkIG92ZXIuCi0gICAgICAgICAqIFdoZW4gfGJsb2NraW5nfCBpcyB0cnVlLCBBdWRpb1Npbmsgd2lsbCB3YWl0IHRvIGNvcHkgdGhlIGVudGlyZQotICAgICAgICAgKiBidWZmZXIsIHVubGVzcyBhbiBlcnJvciBvY2N1cnMgb3IgdGhlIGNvcHkgb3BlcmF0aW9uIGlzCi0gICAgICAgICAqIHByZW1hdHVyZWx5IHN0b3BwZWQuCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIHNzaXplX3Qgd3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBzaXplX3Qgc2l6ZSwgYm9vbCBibG9ja2luZyA9IHRydWUpID0gMDsKLQotICAgICAgICB2aXJ0dWFsIHZvaWQgc3RvcCgpID0gMDsKLSAgICAgICAgdmlydHVhbCB2b2lkIGZsdXNoKCkgPSAwOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcGF1c2UoKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpID0gMDsKLQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrUmF0ZShjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSkgPSAwOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBsYXliYWNrUmF0ZShBdWRpb1BsYXliYWNrUmF0ZSogcmF0ZSAvKiBub25udWxsICovKSA9IDA7Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBuZWVkc1RyYWlsaW5nUGFkZGluZygpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIC8qIGtleVZhbHVlUGFpcnMgKi8pIHsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhjb25zdCBTdHJpbmc4JiAvKiBrZXlzICovKSB7Ci0gICAgICAgICAgICByZXR1cm4gU3RyaW5nODo6ZW1wdHkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEF1ZGlvUm91dGluZwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOwotICAgIH07Ci0KLSAgICBNZWRpYVBsYXllcjJJbnRlcmZhY2UoKSA6IG1MaXN0ZW5lcihOVUxMKSB7IH0KLSAgICB2aXJ0dWFsIH5NZWRpYVBsYXllcjJJbnRlcmZhY2UoKSB7IH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1NpbmsoY29uc3Qgc3A8QXVkaW9TaW5rPiYgYXVkaW9TaW5rKSB7Ci0gICAgICAgIG1BdWRpb1NpbmsgPSBhdWRpb1Npbms7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2VEZXNjPiAmZHNkKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVOZXh0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlRGVzYz4gJmRzZCkgPSAwOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwbGF5TmV4dERhdGFTb3VyY2UoaW50NjRfdCBzcmNJZCkgPSAwOwotCi0gICAgLy8gcGFzcyB0aGUgYnVmZmVyZWQgbmF0aXZlIHdpbmRvdyB0byB0aGUgbWVkaWEgcGxheWVyIHNlcnZpY2UKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZpZGVvU3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+JiBud3cpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyaW5nU2V0dGluZ3MoQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSB7Ci0gICAgICAgICpidWZmZXJpbmcgPSBCdWZmZXJpbmdTZXR0aW5ncygpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIC8qIGJ1ZmZlcmluZyAqLykgewotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydCgpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgaXNQbGF5aW5nKCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGxheWJhY2tTZXR0aW5ncyhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSYgcmF0ZSkgewotICAgICAgICAvLyBieSBkZWZhdWx0LCBwbGF5ZXJzIG9ubHkgc3VwcG9ydCBzZXR0aW5nIHJhdGUgdG8gdGhlIGRlZmF1bHQKLSAgICAgICAgaWYgKCFpc0F1ZGlvUGxheWJhY2tSYXRlRXF1YWwocmF0ZSwgQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUKSkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSogcmF0ZSAvKiBub25udWxsICovKSB7Ci0gICAgICAgICpyYXRlID0gQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzJiBzeW5jLCBmbG9hdCAvKiB2aWRlb0ZwcyAqLykgewotICAgICAgICAvLyBCeSBkZWZhdWx0LCBwbGF5ZXJzIG9ubHkgc3VwcG9ydCBzZXR0aW5nIHN5bmMgc291cmNlIHRvIGRlZmF1bHQ7IGFsbCBvdGhlciBzeW5jCi0gICAgICAgIC8vIHNldHRpbmdzIGFyZSBpZ25vcmVkLiBUaGVyZSBpcyBubyByZXF1aXJlbWVudCBmb3IgZ2V0dGVycyB0byByZXR1cm4gc2V0IHZhbHVlcy4KLSAgICAgICAgaWYgKHN5bmMubVNvdXJjZSAhPSBBVlNZTkNfU09VUkNFX0RFRkFVTFQpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFN5bmNTZXR0aW5ncygKLSAgICAgICAgICAgIEFWU3luY1NldHRpbmdzKiBzeW5jIC8qIG5vbm51bGwgKi8sIGZsb2F0KiB2aWRlb0ZwcyAvKiBub25udWxsICovKSB7Ci0gICAgICAgICpzeW5jID0gQVZTeW5jU2V0dGluZ3MoKTsKLSAgICAgICAgKnZpZGVvRnBzID0gLTEuZjsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNlZWtUbygKLSAgICAgICAgICAgIGludDY0X3QgbXNlYywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptc2VjKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICptc2VjKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCByZXNldCgpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IG5vdGlmeUF0KGludDY0X3QgLyogbWVkaWFUaW1lVXMgKi8pIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldExvb3BpbmcoaW50IGxvb3ApID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwgJnJlcXVlc3QpID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSA9IDA7Ci0KLSAgICAvLyBJbnZva2UgYSBnZW5lcmljIG1ldGhvZCBvbiB0aGUgcGxheWVyIGJ5IHVzaW5nIG9wYXF1ZSBwYXJjZWxzCi0gICAgLy8gZm9yIHRoZSByZXF1ZXN0IGFuZCByZXBseS4KLSAgICAvLwotICAgIC8vIEBwYXJhbSByZXF1ZXN0IFBhcmNlbCB0aGF0IGlzIHBvc2l0aW9uZWQgYXQgdGhlIHN0YXJ0IG9mIHRoZQotICAgIC8vICAgICAgICAgICAgICAgIGRhdGEgc2VudCBieSB0aGUgamF2YSBsYXllci4KLSAgICAvLyBAcGFyYW1bb3V0XSByZXBseSBQYXJjZWwgdG8gaG9sZCB0aGUgcmVwbHkgZGF0YS4gQ2Fubm90IGJlIG51bGwuCi0gICAgLy8gQHJldHVybiBPSyBpZiB0aGUgY2FsbCB3YXMgc3VjY2Vzc2Z1bC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpID0gMDsKLQotICAgIC8vIFRoZSBDbGllbnQgaW4gdGhlIE1ldGFkYXRhUGxheWVyU2VydmljZSBjYWxscyB0aGlzIG1ldGhvZCBvbgotICAgIC8vIHRoZSBuYXRpdmUgcGxheWVyIHRvIHJldHJpZXZlIGFsbCBvciBhIHN1YnNldCBvZiBtZXRhZGF0YS4KLSAgICAvLwotICAgIC8vIEBwYXJhbSBpZHMgU29ydGVkTGlzdCBvZiBtZXRhZGF0YSBJRCB0byBiZSBmZXRjaC4gSWYgZW1wdHksIGFsbAotICAgIC8vICAgICAgICAgICAgdGhlIGtub3duIG1ldGFkYXRhIHNob3VsZCBiZSByZXR1cm5lZC4KLSAgICAvLyBAcGFyYW1baW5vdXRdIHJlY29yZHMgUGFyY2VsIHdoZXJlIHRoZSBwbGF5ZXIgYXBwZW5kcyBpdHMgbWV0YWRhdGEuCi0gICAgLy8gQHJldHVybiBPSyBpZiB0aGUgY2FsbCB3YXMgc3VjY2Vzc2Z1bC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFkYXRhKGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyJiAvKiBpZHMgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIC8qIHJlY29yZHMgKi8pIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH07Ci0KLSAgICB2b2lkIHNldExpc3RlbmVyKGNvbnN0IHNwPE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyPiAmbGlzdGVuZXIpIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1MaXN0ZW5lckxvY2spOwotICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICB2b2lkIHNlbmRFdmVudChpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MT0wLCBpbnQgZXh0Mj0wLCBjb25zdCBQYXJjZWwgKm9iaj1OVUxMKSB7Ci0gICAgICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyPiBsaXN0ZW5lcjsKLSAgICAgICAgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1MaXN0ZW5lckxvY2spOwotICAgICAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGlzdGVuZXIpIHsKLSAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnkoc3JjSWQsIG1zZywgZXh0MSwgZXh0Miwgb2JqKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgLyogZmQgKi8sIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIC8qIGFyZ3MgKi8pIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJiAvKiBtc2cgKi8pIG92ZXJyaWRlIHsgfQotCi0gICAgLy8gTW9kdWxhciBEUk0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVEcm0oY29uc3QgdWludDhfdCAvKiB1dWlkICovWzE2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+JiAvKiBkcm1TZXNzaW9uSWQgKi8pIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VEcm0oKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICBzcDxBdWRpb1Npbms+IG1BdWRpb1Npbms7Ci0KLXByaXZhdGU6Ci0gICAgTXV0ZXggbUxpc3RlbmVyTG9jazsKLSAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2VMaXN0ZW5lcj4gbUxpc3RlbmVyOwotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIF9fY3BsdXNwbHVzCi0KLQotI2VuZGlmIC8vIEFORFJPSURfTUVESUFQTEFZRVIySU5URVJGQUNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9pbmNsdWRlL21lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJUeXBlcy5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMlR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5MDViNTUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMlR5cGVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyMDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBTkRST0lEX01FRElBUExBWUVSMl9UWVBFU19ICi0jZGVmaW5lIEFORFJPSURfTUVESUFQTEFZRVIyX1RZUEVTX0gKLQotI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyX2NvbW1vbi5oPgotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi10eXBlZGVmIE1lZGlhU291cmNlOjpSZWFkT3B0aW9uczo6U2Vla01vZGUgTWVkaWFQbGF5ZXIyU2Vla01vZGU7Ci0KLWVudW0gbWVkaWEyX2V2ZW50X3R5cGUgewotICAgIE1FRElBMl9OT1AgICAgICAgICAgICAgICA9IDAsIC8vIGludGVyZmFjZSB0ZXN0IG1lc3NhZ2UKLSAgICBNRURJQTJfUFJFUEFSRUQgICAgICAgICAgPSAxLAotICAgIE1FRElBMl9QTEFZQkFDS19DT01QTEVURSA9IDIsCi0gICAgTUVESUEyX0JVRkZFUklOR19VUERBVEUgID0gMywKLSAgICBNRURJQTJfU0VFS19DT01QTEVURSAgICAgPSA0LAotICAgIE1FRElBMl9TRVRfVklERU9fU0laRSAgICA9IDUsCi0gICAgTUVESUEyX1NUQVJURUQgICAgICAgICAgID0gNiwKLSAgICBNRURJQTJfUEFVU0VEICAgICAgICAgICAgPSA3LAotICAgIE1FRElBMl9TVE9QUEVEICAgICAgICAgICA9IDgsCi0gICAgTUVESUEyX1NLSVBQRUQgICAgICAgICAgID0gOSwKLSAgICBNRURJQTJfTk9USUZZX1RJTUUgICAgICAgPSA5OCwKLSAgICBNRURJQTJfVElNRURfVEVYVCAgICAgICAgPSA5OSwKLSAgICBNRURJQTJfRVJST1IgICAgICAgICAgICAgPSAxMDAsCi0gICAgTUVESUEyX0lORk8gICAgICAgICAgICAgID0gMjAwLAotICAgIE1FRElBMl9TVUJUSVRMRV9EQVRBICAgICA9IDIwMSwKLSAgICBNRURJQTJfTUVUQV9EQVRBICAgICAgICAgPSAyMDIsCi0gICAgTUVESUEyX0RSTV9JTkZPICAgICAgICAgID0gMjEwLAotICAgIE1FRElBMl9BVURJT19ST1VUSU5HX0NIQU5HRUQgPSAxMDAwMCwKLX07Ci0KLS8vIEdlbmVyaWMgZXJyb3IgY29kZXMgZm9yIHRoZSBtZWRpYSBwbGF5ZXIgZnJhbWV3b3JrLiAgRXJyb3JzIGFyZSBmYXRhbCwgdGhlCi0vLyBwbGF5YmFjayBtdXN0IGFib3J0LgotLy8KLS8vIEVycm9ycyBhcmUgY29tbXVuaWNhdGVkIGJhY2sgdG8gdGhlIGNsaWVudCB1c2luZyB0aGUKLS8vIE1lZGlhUGxheWVyMkxpc3RlbmVyOjpub3RpZnkgbWV0aG9kIGRlZmluZWQgYmVsb3cuCi0vLyBJbiB0aGlzIHNpdHVhdGlvbiwgJ25vdGlmeScgaXMgaW52b2tlZCB3aXRoIHRoZSBmb2xsb3dpbmc6Ci0vLyAgICdtc2cnIGlzIHNldCB0byBNRURJQV9FUlJPUi4KLS8vICAgJ2V4dDEnIHNob3VsZCBiZSBhIHZhbHVlIGZyb20gdGhlIGVudW0gbWVkaWEyX2Vycm9yX3R5cGUuCi0vLyAgICdleHQyJyBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBkZXBlbmRhbnQgZXJyb3IgY29kZSB0byBwcm92aWRlCi0vLyAgICAgICAgICBtb3JlIGRldGFpbHMuIFNob3VsZCBkZWZhdWx0IHRvIDAgd2hlbiBub3QgdXNlZC4KLS8vCi0vLyBUaGUgY29kZXMgYXJlIGRpc3RyaWJ1dGVkIGFzIGZvbGxvdzoKLS8vICAgMHh4OiBSZXNlcnZlZAotLy8gICAxeHg6IEFuZHJvaWQgUGxheWVyIGVycm9ycy4gU29tZXRoaW5nIHdlbnQgd3JvbmcgaW5zaWRlIHRoZSBNZWRpYVBsYXllcjIuCi0vLyAgIDJ4eDogTWVkaWEgZXJyb3JzIChlLmcgQ29kZWMgbm90IHN1cHBvcnRlZCkuIFRoZXJlIGlzIGEgcHJvYmxlbSB3aXRoIHRoZQotLy8gICAgICAgIG1lZGlhIGl0c2VsZi4KLS8vICAgM3h4OiBSdW50aW1lIGVycm9ycy4gU29tZSBleHRyYW9yZGluYXJ5IGNvbmRpdGlvbiBhcm9zZSBtYWtpbmcgdGhlIHBsYXliYWNrCi0vLyAgICAgICAgaW1wb3NzaWJsZS4KLS8vCi1lbnVtIG1lZGlhMl9lcnJvcl90eXBlIHsKLSAgICAvLyAweHgKLSAgICBNRURJQTJfRVJST1JfVU5LTk9XTiA9IDEsCi0gICAgLy8gMXh4Ci0gICAgLy8gTUVESUEyX0VSUk9SX1NFUlZFUl9ESUVEID0gMTAwLAotICAgIC8vIDJ4eAotICAgIE1FRElBMl9FUlJPUl9OT1RfVkFMSURfRk9SX1BST0dSRVNTSVZFX1BMQVlCQUNLID0gMjAwLAotICAgIC8vIDN4eAotICAgIE1FRElBMl9FUlJPUl9GQUlMRURfVE9fU0VUX0RBVEFfU09VUkNFID0gMzAwLAotfTsKLQotCi0vLyBJbmZvIGFuZCB3YXJuaW5nIGNvZGVzIGZvciB0aGUgbWVkaWEgcGxheWVyIGZyYW1ld29yay4gIFRoZXNlIGFyZSBub24gZmF0YWwsCi0vLyB0aGUgcGxheWJhY2sgaXMgZ29pbmcgb24gYnV0IHRoZXJlIG1pZ2h0IGJlIHNvbWUgdXNlciB2aXNpYmxlIGlzc3Vlcy4KLS8vCi0vLyBJbmZvIGFuZCB3YXJuaW5nIG1lc3NhZ2VzIGFyZSBjb21tdW5pY2F0ZWQgYmFjayB0byB0aGUgY2xpZW50IHVzaW5nIHRoZQotLy8gTWVkaWFQbGF5ZXIyTGlzdGVuZXI6Om5vdGlmeSBtZXRob2QgZGVmaW5lZCBiZWxvdy4gIEluIHRoaXMgc2l0dWF0aW9uLAotLy8gJ25vdGlmeScgaXMgaW52b2tlZCB3aXRoIHRoZSBmb2xsb3dpbmc6Ci0vLyAgICdtc2cnIGlzIHNldCB0byBNRURJQV9JTkZPLgotLy8gICAnZXh0MScgc2hvdWxkIGJlIGEgdmFsdWUgZnJvbSB0aGUgZW51bSBtZWRpYTJfaW5mb190eXBlLgotLy8gICAnZXh0MicgY29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gZGVwZW5kYW50IGluZm8gY29kZSB0byBwcm92aWRlCi0vLyAgICAgICAgICBtb3JlIGRldGFpbHMuIFNob3VsZCBkZWZhdWx0IHRvIDAgd2hlbiBub3QgdXNlZC4KLS8vCi0vLyBUaGUgY29kZXMgYXJlIGRpc3RyaWJ1dGVkIGFzIGZvbGxvdzoKLS8vICAgMHh4OiBSZXNlcnZlZAotLy8gICA3eHg6IEFuZHJvaWQgUGxheWVyIGluZm8vd2FybmluZyAoZS5nIHBsYXllciBsYWdnaW5nIGJlaGluZC4pCi0vLyAgIDh4eDogTWVkaWEgaW5mby93YXJuaW5nIChlLmcgbWVkaWEgYmFkbHkgaW50ZXJsZWF2ZWQuKQotLy8KLWVudW0gbWVkaWEyX2luZm9fdHlwZSB7Ci0gICAgLy8gMHh4Ci0gICAgTUVESUEyX0lORk9fVU5LTk9XTiA9IDEsCi0gICAgLy8gVGhlIHBsYXllciB3YXMgc3RhcnRlZCBiZWNhdXNlIGl0IHdhcyB1c2VkIGFzIHRoZSBuZXh0IHBsYXllciBmb3IgYW5vdGhlcgotICAgIC8vIHBsYXllciwgd2hpY2gganVzdCBjb21wbGV0ZWQgcGxheWJhY2sKLSAgICBNRURJQTJfSU5GT19TVEFSVEVEX0FTX05FWFQgPSAyLAotICAgIC8vIFRoZSBwbGF5ZXIganVzdCBwdXNoZWQgdGhlIHZlcnkgZmlyc3QgdmlkZW8gZnJhbWUgZm9yIHJlbmRlcmluZwotICAgIE1FRElBMl9JTkZPX1ZJREVPX1JFTkRFUklOR19TVEFSVCA9IDMsCi0gICAgLy8gVGhlIHBsYXllciBqdXN0IHB1c2hlZCB0aGUgdmVyeSBmaXJzdCBhdWRpbyBmcmFtZSBmb3IgcmVuZGVyaW5nCi0gICAgTUVESUEyX0lORk9fQVVESU9fUkVOREVSSU5HX1NUQVJUID0gNCwKLSAgICAvLyBUaGUgcGxheWVyIGp1c3QgY29tcGxldGVkIHRoZSBwbGF5YmFjayBvZiB0aGlzIGRhdGEgc291cmNlCi0gICAgTUVESUEyX0lORk9fUExBWUJBQ0tfQ09NUExFVEUgPSA1LAotICAgIC8vIFRoZSBwbGF5ZXIganVzdCBjb21wbGV0ZWQgdGhlIHBsYXliYWNrIG9mIHRoZSBmdWxsIHBsYXkgbGlzdAotICAgIE1FRElBMl9JTkZPX1BMQVlMSVNUX0VORCA9IDYsCi0KLSAgICAvLzF4eAotICAgIC8vIFRoZSBwbGF5ZXIganVzdCBwcmVwYXJlZCBhIGRhdGEgc291cmNlLgotICAgIE1FRElBMl9JTkZPX1BSRVBBUkVEID0gMTAwLAotICAgIC8vIFRoZSBwbGF5ZXIganVzdCBjb21wbGV0ZWQgYSBjYWxsIHBsYXkoKS4KLSAgICBNRURJQTJfSU5GT19DT01QTEVURV9DQUxMX1BMQVkgPSAxMDEsCi0gICAgLy8gVGhlIHBsYXllciBqdXN0IGNvbXBsZXRlZCBhIGNhbGwgcGF1c2UoKS4KLSAgICBNRURJQTJfSU5GT19DT01QTEVURV9DQUxMX1BBVVNFID0gMTAyLAotICAgIC8vIFRoZSBwbGF5ZXIganVzdCBjb21wbGV0ZWQgYSBjYWxsIHNlZWtUby4KLSAgICBNRURJQTJfSU5GT19DT01QTEVURV9DQUxMX1NFRUsgPSAxMDMsCi0KLSAgICAvLyA3eHgKLSAgICAvLyBUaGUgdmlkZW8gaXMgdG9vIGNvbXBsZXggZm9yIHRoZSBkZWNvZGVyOiBpdCBjYW4ndCBkZWNvZGUgZnJhbWVzIGZhc3QKLSAgICAvLyBlbm91Z2guIFBvc3NpYmx5IG9ubHkgdGhlIGF1ZGlvIHBsYXlzIGZpbmUgYXQgdGhpcyBzdGFnZS4KLSAgICBNRURJQTJfSU5GT19WSURFT19UUkFDS19MQUdHSU5HID0gNzAwLAotICAgIC8vIE1lZGlhUGxheWVyMiBpcyB0ZW1wb3JhcmlseSBwYXVzaW5nIHBsYXliYWNrIGludGVybmFsbHkgaW4gb3JkZXIgdG8KLSAgICAvLyBidWZmZXIgbW9yZSBkYXRhLgotICAgIE1FRElBMl9JTkZPX0JVRkZFUklOR19TVEFSVCA9IDcwMSwKLSAgICAvLyBNZWRpYVBsYXllcjIgaXMgcmVzdW1pbmcgcGxheWJhY2sgYWZ0ZXIgZmlsbGluZyBidWZmZXJzLgotICAgIE1FRElBMl9JTkZPX0JVRkZFUklOR19FTkQgPSA3MDIsCi0gICAgLy8gQmFuZHdpZHRoIGluIHJlY2VudCBwYXN0Ci0gICAgTUVESUEyX0lORk9fTkVUV09SS19CQU5EV0lEVEggPSA3MDMsCi0KLSAgICAvLyA4eHgKLSAgICAvLyBCYWQgaW50ZXJsZWF2aW5nIG1lYW5zIHRoYXQgYSBtZWRpYSBoYXMgYmVlbiBpbXByb3Blcmx5IGludGVybGVhdmVkIG9yIG5vdAotICAgIC8vIGludGVybGVhdmVkIGF0IGFsbCwgZS5nIGhhcyBhbGwgdGhlIHZpZGVvIHNhbXBsZXMgZmlyc3QgdGhlbiBhbGwgdGhlIGF1ZGlvCi0gICAgLy8gb25lcy4gVmlkZW8gaXMgcGxheWluZyBidXQgYSBsb3Qgb2YgZGlzayBzZWVrIG1heSBiZSBoYXBwZW5pbmcuCi0gICAgTUVESUEyX0lORk9fQkFEX0lOVEVSTEVBVklORyA9IDgwMCwKLSAgICAvLyBUaGUgbWVkaWEgaXMgbm90IHNlZWthYmxlIChlLmcgbGl2ZSBzdHJlYW0pLgotICAgIE1FRElBMl9JTkZPX05PVF9TRUVLQUJMRSA9IDgwMSwKLSAgICAvLyBOZXcgbWVkaWEgbWV0YWRhdGEgaXMgYXZhaWxhYmxlLgotICAgIE1FRElBMl9JTkZPX01FVEFEQVRBX1VQREFURSA9IDgwMiwKLSAgICAvLyBBdWRpbyBjYW4gbm90IGJlIHBsYXllZC4KLSAgICBNRURJQTJfSU5GT19QTEFZX0FVRElPX0VSUk9SID0gODA0LAotICAgIC8vIFZpZGVvIGNhbiBub3QgYmUgcGxheWVkLgotICAgIE1FRElBMl9JTkZPX1BMQVlfVklERU9fRVJST1IgPSA4MDUsCi0KLSAgICAvLzl4eAotICAgIE1FRElBMl9JTkZPX1RJTUVEX1RFWFRfRVJST1IgPSA5MDAsCi19OwotCi0vLyBEbyBub3QgY2hhbmdlIHRoZXNlIHZhbHVlcyB3aXRob3V0IHVwZGF0aW5nIHRoZWlyIGNvdW50ZXJwYXJ0cyBpbiBNZWRpYVBsYXllcjIuamF2YQotZW51bSBtZWRpYXBsYXllcjJfc3RhdGVzIHsKLSAgICBNRURJQVBMQVlFUjJfU1RBVEVfSURMRSAgICAgICAgID0gMSwKLSAgICBNRURJQVBMQVlFUjJfU1RBVEVfUFJFUEFSRUQgICAgID0gMiwKLSAgICBNRURJQVBMQVlFUjJfU1RBVEVfUExBWUlORyAgICAgID0gMywKLSAgICBNRURJQVBMQVlFUjJfU1RBVEVfUEFVU0VEICAgICAgID0gNCwKLSAgICBNRURJQVBMQVlFUjJfU1RBVEVfRVJST1IgICAgICAgID0gNSwKLX07Ci0KLWVudW0gbWVkaWFfcGxheWVyMl9pbnRlcm5hbF9zdGF0ZXMgewotICAgIE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1IgICAgICAgID0gMCwKLSAgICBNRURJQV9QTEFZRVIyX0lETEUgICAgICAgICAgICAgICA9IDEgPDwgMCwKLSAgICBNRURJQV9QTEFZRVIyX0lOSVRJQUxJWkVEICAgICAgICA9IDEgPDwgMSwKLSAgICBNRURJQV9QTEFZRVIyX1BSRVBBUklORyAgICAgICAgICA9IDEgPDwgMiwKLSAgICBNRURJQV9QTEFZRVIyX1BSRVBBUkVEICAgICAgICAgICA9IDEgPDwgMywKLSAgICBNRURJQV9QTEFZRVIyX1NUQVJURUQgICAgICAgICAgICA9IDEgPDwgNCwKLSAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCAgICAgICAgICAgICA9IDEgPDwgNSwKLSAgICBNRURJQV9QTEFZRVIyX1NUT1BQRUQgICAgICAgICAgICA9IDEgPDwgNiwKLSAgICBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFICA9IDEgPDwgNwotfTsKLQotLy8gS2VlcCBLRVlfUEFSQU1FVEVSXyogaW4gc3luYyB3aXRoIE1lZGlhUGxheWVyMi5qYXZhLgotLy8gVGhlIHNhbWUgZW51bSBzcGFjZSBpcyB1c2VkIGZvciBib3RoIHNldCBhbmQgZ2V0LCBpbiBjYXNlIHRoZXJlIGFyZSBmdXR1cmUga2V5cyB0aGF0Ci0vLyBjYW4gYmUgYm90aCBzZXQgYW5kIGdldC4gIEJ1dCBhcyBvZiBub3csIGFsbCBwYXJhbWV0ZXJzIGFyZSBlaXRoZXIgc2V0IG9ubHkgb3IgZ2V0IG9ubHkuCi1lbnVtIG1lZGlhMl9wYXJhbWV0ZXJfa2V5cyB7Ci0gICAgLy8gU3RyZWFtaW5nL2J1ZmZlcmluZyBwYXJhbWV0ZXJzCi0gICAgTUVESUEyX0tFWV9QQVJBTUVURVJfQ0FDSEVfU1RBVF9DT0xMRUNUX0ZSRVFfTVMgPSAxMTAwLCAgICAgICAgICAgIC8vIHNldCBvbmx5Ci0KLSAgICAvLyBSZXR1cm4gYSBQYXJjZWwgY29udGFpbmluZyBhIHNpbmdsZSBpbnQsIHdoaWNoIGlzIHRoZSBjaGFubmVsIGNvdW50IG9mIHRoZQotICAgIC8vIGF1ZGlvIHRyYWNrLCBvciB6ZXJvIGZvciBlcnJvciAoZS5nLiBubyBhdWRpbyB0cmFjaykgb3IgdW5rbm93bi4KLSAgICBNRURJQTJfS0VZX1BBUkFNRVRFUl9BVURJT19DSEFOTkVMX0NPVU5UID0gMTIwMCwgICAgICAgICAgICAgICAgICAgLy8gZ2V0IG9ubHkKLQotICAgIC8vIFBsYXliYWNrIHJhdGUgZXhwcmVzc2VkIGluIHBlcm1pbGxlICgxMDAwIGlzIG5vcm1hbCBzcGVlZCksIHNhdmVkIGFzIGludDMyX3QsIHdpdGggbmVnYXRpdmUKLSAgICAvLyB2YWx1ZXMgdXNlZCBmb3IgcmV3aW5kaW5nIG9yIHJldmVyc2UgcGxheWJhY2suCi0gICAgTUVESUEyX0tFWV9QQVJBTUVURVJfUExBWUJBQ0tfUkFURV9QRVJNSUxMRSA9IDEzMDAsICAgICAgICAgICAgICAgIC8vIHNldCBvbmx5Ci0KLSAgICAvLyBTZXQgYSBQYXJjZWwgY29udGFpbmluZyB0aGUgdmFsdWUgb2YgYSBwYXJjZWxsZWQgSmF2YSBBdWRpb0F0dHJpYnV0ZSBpbnN0YW5jZQotICAgIE1FRElBMl9LRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVMgPSAxNDAwICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgb25seQotfTsKLQotLy8gS2VlcCBJTlZPS0VfSURfKiBpbiBzeW5jIHdpdGggTWVkaWFQbGF5ZXIyLmphdmEuCi1lbnVtIG1lZGlhX3BsYXllcjJfaW52b2tlX2lkcyB7Ci0gICAgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfR0VUX1RSQUNLX0lORk8gPSAxLAotICAgIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX0FERF9FWFRFUk5BTF9TT1VSQ0UgPSAyLAotICAgIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX0FERF9FWFRFUk5BTF9TT1VSQ0VfRkQgPSAzLAotICAgIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1NFTEVDVF9UUkFDSyA9IDQsCi0gICAgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfVU5TRUxFQ1RfVFJBQ0sgPSA1LAotICAgIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1NFVF9WSURFT19TQ0FMSU5HX01PREUgPSA2LAotICAgIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX0dFVF9TRUxFQ1RFRF9UUkFDSyA9IDcKLX07Ci0KLX07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX01FRElBUExBWUVSMl9UWVBFU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvaW5jbHVkZS9tZWRpYXBsYXllcjIvbWVkaWFwbGF5ZXIyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ODYxOTIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL2luY2x1ZGUvbWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9NRURJQVBMQVlFUjJfSAotI2RlZmluZSBBTkRST0lEX01FRElBUExBWUVSMl9ICi0KLSNpbmNsdWRlIDxtZWRpYS9BVlN5bmNTZXR0aW5ncy5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQnVmZmVyaW5nU2V0dGluZ3MuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyX2NvbW1vbi5oPgotI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxtZWRpYXBsYXllcjIvTWVkaWFQbGF5ZXIyVHlwZXMuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLWJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQU5hdGl2ZVdpbmRvd1dyYXBwZXI7Ci1zdHJ1Y3QgRGF0YVNvdXJjZURlc2M7Ci1jbGFzcyBNZWRpYVBsYXllcjJBdWRpb091dHB1dDsKLQotLy8gcmVmLWNvdW50ZWQgb2JqZWN0IGZvciBjYWxsYmFja3MKLWNsYXNzIE1lZGlhUGxheWVyMkxpc3RlbmVyOiB2aXJ0dWFsIHB1YmxpYyBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqb2JqKSA9IDA7Ci19OwotCi1jbGFzcyBNZWRpYVBsYXllcjIgOiBwdWJsaWMgTWVkaWFQbGF5ZXIySW50ZXJmYWNlTGlzdGVuZXIKLXsKLXB1YmxpYzoKLSAgICB+TWVkaWFQbGF5ZXIyKCk7Ci0KLSAgICBzdGF0aWMgc3A8TWVkaWFQbGF5ZXIyPiBDcmVhdGUoKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgRHVtcEFsbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCi0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0U3JjSWQoaW50NjRfdCAqc3JjSWQpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZURlc2M+ICZkc2QpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHByZXBhcmVOZXh0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlRGVzYz4gJmRzZCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcGxheU5leHREYXRhU291cmNlKGludDY0X3Qgc3JjSWQpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFZpZGVvU3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+JiBud3cpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldExpc3RlbmVyKGNvbnN0IHNwPE1lZGlhUGxheWVyMkxpc3RlbmVyPiYgbGlzdGVuZXIpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldEJ1ZmZlcmluZ1NldHRpbmdzKEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLyk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZyk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcHJlcGFyZUFzeW5jKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc3RhcnQoKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzdG9wKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcGF1c2UoKTsKLSAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBpc1BsYXlpbmcoKTsKLSAgICAgICAgICAgIG1lZGlhcGxheWVyMl9zdGF0ZXMgZ2V0TWVkaWFQbGF5ZXIyU3RhdGUoKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlJiByYXRlKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlKiByYXRlIC8qIG5vbm51bGwgKi8pOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyYgc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRTeW5jU2V0dGluZ3MoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVlN5bmNTZXR0aW5ncyogc3luYyAvKiBub25udWxsICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHZpZGVvRnBzIC8qIG5vbm51bGwgKi8pOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldFZpZGVvV2lkdGgoaW50ICp3KTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRWaWRlb0hlaWdodChpbnQgKmgpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNlZWtUbygKLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBtc2VjLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgbm90aWZ5QXQoaW50NjRfdCBtZWRpYVRpbWVVcyk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1zZWMpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGdldER1cmF0aW9uKGludDY0X3QgKm1zZWMpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHJlc2V0KCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3QgdHlwZSk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0QXVkaW9TdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3QgKnR5cGUpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldExvb3BpbmcoaW50IGxvb3ApOwotICAgICAgICAgICAgYm9vbCAgICAgICAgICAgIGlzTG9vcGluZygpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldFZvbHVtZShmbG9hdCBsZWZ0Vm9sdW1lLCBmbG9hdCByaWdodFZvbHVtZSk7Ci0gICAgICAgICAgICB2b2lkICAgICAgICAgICAgbm90aWZ5KGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsICpvYmogPSBOVUxMKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBpbnZva2UoY29uc3QgUGFyY2VsJiByZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRNZXRhZGF0YUZpbHRlcihjb25zdCBQYXJjZWwmIGZpbHRlcik7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgZ2V0TWV0YWRhdGEoYm9vbCB1cGRhdGVfb25seSwgYm9vbCBhcHBseV9maWx0ZXIsIFBhcmNlbCAqbWV0YWRhdGEpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIHNldEF1ZGlvU2Vzc2lvbklkKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGdldEF1ZGlvU2Vzc2lvbklkKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0QXV4RWZmZWN0U2VuZExldmVsKGZsb2F0IGxldmVsKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsJiByZXF1ZXN0KTsKLSAgICAgICAgICAgIHN0YXR1c190ICAgICAgICBnZXRQYXJhbWV0ZXIoaW50IGtleSwgUGFyY2VsKiByZXBseSk7Ci0KLSAgICAgICAgICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcHJlcGFyZURybShjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4mIGRybVNlc3Npb25JZCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgcmVsZWFzZURybSgpOwotICAgICAgICAgICAgLy8gQXVkaW9Sb3V0aW5nCi0gICAgICAgICAgICBzdGF0dXNfdCAgICAgICAgc2V0T3V0cHV0RGV2aWNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpOwotICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRSb3V0ZWREZXZpY2VJZCgpOwotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLQotcHJpdmF0ZToKLSAgICBNZWRpYVBsYXllcjIoKTsKLSAgICBib29sIGluaXQoKTsKLQotICAgIC8vIEBwYXJhbSB0eXBlIE9mIHRoZSBtZXRhZGF0YSB0byBiZSB0ZXN0ZWQuCi0gICAgLy8gQHJldHVybiB0cnVlIGlmIHRoZSBtZXRhZGF0YSBzaG91bGQgYmUgZHJvcHBlZCBhY2NvcmRpbmcgdG8KLSAgICAvLyAgICAgICAgICAgICAgdGhlIGZpbHRlcnMuCi0gICAgYm9vbCBzaG91bGREcm9wTWV0YWRhdGEobWVkaWE6Ok1ldGFkYXRhOjpUeXBlIHR5cGUpIGNvbnN0OwotCi0gICAgLy8gQWRkIGEgbmV3IGVsZW1lbnQgdG8gdGhlIHNldCBvZiBtZXRhZGF0YSB1cGRhdGVkLiBOb29wIGlmCi0gICAgLy8gdGhlIGVsZW1lbnQgZXhpc3RzIGFscmVhZHkuCi0gICAgLy8gQHBhcmFtIHR5cGUgT2YgdGhlIG1ldGFkYXRhIHRvIGJlIHJlY29yZGVkLgotICAgIHZvaWQgYWRkTmV3TWV0YWRhdGFVcGRhdGUobWVkaWE6Ok1ldGFkYXRhOjpUeXBlIHR5cGUpOwotCi0gICAgLy8gRGlzY29ubmVjdCBmcm9tIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIEFOYXRpdmVXaW5kb3cuCi0gICAgdm9pZCBkaXNjb25uZWN0TmF0aXZlV2luZG93X2woKTsKLQotICAgIHN0YXR1c190IHNldEF1ZGlvQXR0cmlidXRlc19sKGNvbnN0IFBhcmNlbCAmcmVxdWVzdCk7Ci0KLSAgICB2b2lkIGNsZWFyX2woKTsKLSAgICBzdGF0dXNfdCBzZWVrVG9fbChpbnQ2NF90IG1zZWMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpOwotICAgIHN0YXR1c190IHByZXBhcmVBc3luY19sKCk7Ci0gICAgc3RhdHVzX3QgZ2V0RHVyYXRpb25fbChpbnQ2NF90ICptc2VjKTsKLSAgICBzdGF0dXNfdCByZXNldF9sKCk7Ci0gICAgc3RhdHVzX3QgY2hlY2tTdGF0ZUZvcktleVNldF9sKGludCBrZXkpOwotCi0gICAgcGlkX3QgICAgICAgICAgICAgICAgICAgICAgIG1QaWQ7Ci0gICAgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgIG1VaWQ7Ci0gICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiAgIG1QbGF5ZXI7Ci0gICAgc3A8TWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ+IG1BdWRpb091dHB1dDsKLSAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgbVNyY0lkOwotICAgIHRocmVhZF9pZF90ICAgICAgICAgICAgICAgICBtTG9ja1RocmVhZElkOwotICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgICAgICBtTG9jazsKLSAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICAgbU5vdGlmeUxvY2s7Ci0gICAgc3A8TWVkaWFQbGF5ZXIyTGlzdGVuZXI+ICAgIG1MaXN0ZW5lcjsKLSAgICBtZWRpYV9wbGF5ZXIyX2ludGVybmFsX3N0YXRlcyBtQ3VycmVudFN0YXRlOwotICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFBvc2l0aW9uOwotICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlICAgICAgICBtQ3VycmVudFNlZWtNb2RlOwotICAgIGludDY0X3QgICAgICAgICAgICAgICAgICAgICBtU2Vla1Bvc2l0aW9uOwotICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlICAgICAgICBtU2Vla01vZGU7Ci0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAgICAgICAgIG1TdHJlYW1UeXBlOwotICAgIFBhcmNlbCogICAgICAgICAgICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsOwotICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtTG9vcDsKLSAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbUxlZnRWb2x1bWU7Ci0gICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgIG1SaWdodFZvbHVtZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvV2lkdGg7Ci0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0hlaWdodDsKLSAgICBhdWRpb19zZXNzaW9uX3QgICAgICAgICAgICAgbUF1ZGlvU2Vzc2lvbklkOwotICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAqICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzOwotICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICBtU2VuZExldmVsOwotCi0gICAgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICAgIG1Db25uZWN0ZWRXaW5kb3c7Ci0KLSAgICAvLyBNZXRhZGF0YSBmaWx0ZXJzLgotICAgIG1lZGlhOjpNZXRhZGF0YTo6RmlsdGVyIG1NZXRhZGF0YUFsbG93OyAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCi0gICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgbU1ldGFkYXRhRHJvcDsgIC8vIHByb3RlY3RlZCBieSBtTG9jawotCi0gICAgLy8gTWV0YWRhdGEgdXBkYXRlZC4gRm9yIGVhY2ggTUVESUFfSU5GT19NRVRBREFUQV9VUERBVEUKLSAgICAvLyBub3RpZmljYXRpb24gd2UgdHJ5IHRvIHVwZGF0ZSBtTWV0YWRhdGFVcGRhdGVkIHdoaWNoIGlzIGEKLSAgICAvLyBzZXQ6IG5vIGR1cGxpY2F0ZS4KLSAgICAvLyBnZXRNZXRhZGF0YSBjbGVhcnMgdGhpcyBzZXQuCi0gICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgbU1ldGFkYXRhVXBkYXRlZDsgIC8vIHByb3RlY3RlZCBieSBtTG9jawotfTsKLQotfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmIC8vIEFORFJPSURfTUVESUFQTEFZRVIyX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NTY3ZGMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUyICswLDAgQEAKLS8qCi0qKgotKiogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFQbGF5ZXIyTmF0aXZlIgotCi0jaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlRGVzYy5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgotI2luY2x1ZGUgPG1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL05ka1dyYXBwZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3BlclJvc3Rlci5oPgotI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJBdWRpb091dHB1dC5oPgotI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuaD4KLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KLQotI2luY2x1ZGUgPG51cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuaD4KLQotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotZXh0ZXJuIEFMb29wZXJSb3N0ZXIgZ0xvb3BlclJvc3RlcjsKLQotbmFtZXNwYWNlIHsKLQotY29uc3QgaW50IGtEdW1wTG9ja1JldHJpZXMgPSA1MDsKLWNvbnN0IGludCBrRHVtcExvY2tTbGVlcFVzID0gMjAwMDA7Ci0KLS8vIE1heCBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgZmlsdGVyLgotY29uc3QgaW50IGtNYXhGaWx0ZXJTaXplID0gNjQ7ICAvLyBJIHB1bGxlZCB0aGF0IG91dCBvZiB0aGluIGFpci4KLQotLy8gRklYTUU6IE1vdmUgYWxsIHRoZSBtZXRhZGF0YSByZWxhdGVkIGZ1bmN0aW9uIGluIHRoZSBNZXRhZGF0YS5jcHAKLQotLy8gVW5tYXJzaGFsbCBhIGZpbHRlciBmcm9tIGEgUGFyY2VsLgotLy8gRmlsdGVyIGZvcm1hdCBpbiBhIHBhcmNlbDoKLS8vCi0vLyAgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxCi0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyIG9mIGVudHJpZXMgKG4pICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSB0eXBlIDEgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIG1ldGFkYXRhIHR5cGUgMiAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gIC4uLi4KLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBtZXRhZGF0YSB0eXBlIG4gICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vCi0vLyBAcGFyYW0gcCBQYXJjZWwgdGhhdCBzaG91bGQgc3RhcnQgd2l0aCBhIGZpbHRlci4KLS8vIEBwYXJhbVtvdXRdIGZpbHRlciBPbiBleGl0IGNvbnRhaW5zIHRoZSBsaXN0IG9mIG1ldGFkYXRhIHR5cGUgdG8gYmUKLS8vICAgICAgICAgICAgICAgICAgICBmaWx0ZXJlZC4KLS8vIEBwYXJhbVtvdXRdIHN0YXR1cyBPbiBleGl0IGNvbnRhaW5zIHRoZSBzdGF0dXMgY29kZSB0byBiZSByZXR1cm5lZC4KLS8vIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcGFyY2VsIHN0YXJ0cyB3aXRoIGEgdmFsaWQgZmlsdGVyLgotYm9vbCB1bm1hcnNoYWxsRmlsdGVyKGNvbnN0IFBhcmNlbCYgcCwKLSAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciAqZmlsdGVyLAotICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpIHsKLSAgICBpbnQzMl90IHZhbDsKLSAgICBpZiAocC5yZWFkSW50MzIoJnZhbCkgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byByZWFkIGZpbHRlcidzIGxlbmd0aCIpOwotICAgICAgICAqc3RhdHVzID0gTk9UX0VOT1VHSF9EQVRBOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHZhbCA+IGtNYXhGaWx0ZXJTaXplIHx8IHZhbCA8IDApIHsKLSAgICAgICAgQUxPR0UoIkludmFsaWQgZmlsdGVyIGxlbiAlZCIsIHZhbCk7Ci0gICAgICAgICpzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb25zdCBzaXplX3QgbnVtID0gdmFsOwotCi0gICAgZmlsdGVyLT5jbGVhcigpOwotICAgIGZpbHRlci0+c2V0Q2FwYWNpdHkobnVtKTsKLQotICAgIHNpemVfdCBzaXplID0gbnVtICogc2l6ZW9mKG1lZGlhOjpNZXRhZGF0YTo6VHlwZSk7Ci0KLQotICAgIGlmIChwLmRhdGFBdmFpbCgpIDwgc2l6ZSkgewotICAgICAgICBBTE9HRSgiRmlsdGVyIHRvbyBzaG9ydCBleHBlY3RlZCAlenUgYnV0IGdvdCAlenUiLCBzaXplLCBwLmRhdGFBdmFpbCgpKTsKLSAgICAgICAgKnN0YXR1cyA9IE5PVF9FTk9VR0hfREFUQTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6VHlwZSAqZGF0YSA9Ci0gICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IG1lZGlhOjpNZXRhZGF0YTo6VHlwZSo+KHAucmVhZElucGxhY2Uoc2l6ZSkpOwotCi0gICAgaWYgKE5VTEwgPT0gZGF0YSkgewotICAgICAgICBBTE9HRSgiRmlsdGVyIGhhZCBubyBkYXRhIik7Ci0gICAgICAgICpzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBUaGUgc3RsIGltcGwgb2YgdmVjdG9yIHdvdWxkIGJlIG1vcmUgZWZmaWNpZW50IGhlcmUKLSAgICAvLyBiZWNhdXNlIGl0IGRlZ2VuZXJhdGVzIGludG8gYSBtZW1jcHkgb24gcG9kIHR5cGVzLiBUcnkgdG8KLSAgICAvLyByZXBsYWNlIGxhdGVyIG9yIHVzZSBzdGw6OnNldC4KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bTsgKytpKSB7Ci0gICAgICAgIGZpbHRlci0+YWRkKCpkYXRhKTsKLSAgICAgICAgKytkYXRhOwotICAgIH0KLSAgICAqc3RhdHVzID0gT0s7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIEBwYXJhbSBmaWx0ZXIgT2YgbWV0YWRhdGEgdHlwZS4KLS8vIEBwYXJhbSB2YWwgVG8gYmUgc2VhcmNoZWQuCi0vLyBAcmV0dXJuIHRydWUgaWYgYSBtYXRjaCB3YXMgZm91bmQuCi1ib29sIGZpbmRNZXRhZGF0YShjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgZmlsdGVyLCBjb25zdCBpbnQzMl90IHZhbCkgewotICAgIC8vIERlYWwgd2l0aCBlbXB0eSBhbmQgQU5ZIHJpZ2h0IGF3YXkKLSAgICBpZiAoZmlsdGVyLmlzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChmaWx0ZXJbMF0gPT0gbWVkaWE6Ok1ldGFkYXRhOjprQW55KSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBmaWx0ZXIuaW5kZXhPZih2YWwpID49IDA7Ci19Ci0KLS8vIG1hcnNoYWxsaW5nIHRhZyBpbmRpY2F0aW5nIGZsYXR0ZW5lZCB1dGYxNiB0YWdzCi0vLyBrZWVwIGluIHN5bmMgd2l0aCBmcmFtZXdvcmtzL2Jhc2UvbWVkaWEvamF2YS9hbmRyb2lkL21lZGlhL0F1ZGlvQXR0cmlidXRlcy5qYXZhCi1jb25zdCBpbnQzMl90IGtBdWRpb0F0dHJpYnV0ZXNNYXJzaGFsbFRhZ0ZsYXR0ZW5UYWdzID0gMTsKLQotLy8gQXVkaW8gYXR0cmlidXRlcyBmb3JtYXQgaW4gYSBwYXJjZWw6Ci0vLwotLy8gIDAgMSAyIDMgNCA1IDYgNyA4IDkgMCAxIDIgMyA0IDUgNiA3IDggOSAwIDEgMiAzIDQgNSA2IDcgOCA5IDAgMQotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgY29udGVudF90eXBlICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLS8vICstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rCi0vLyB8ICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAotLy8gKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSsKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAga0F1ZGlvQXR0cmlidXRlc01hcnNoYWxsVGFnRmxhdHRlblRhZ3MgIHwgLy8gaWdub3JlIHRhZ3MgaWYgbm90IGZvdW5kCi0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8gfCAgICAgICAgICAgICAgICAgICAgICAgZmxhdHRlbmVkIHRhZ3MgaW4gVVRGMTYgICAgICAgICAgICAgICAgIHwKLS8vIHwgICAgICAgICAgICAgICAgICAgICAgICAgLi4uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0vLyArLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKwotLy8KLS8vIEBwYXJhbSBwIFBhcmNlbCB0aGF0IGNvbnRhaW5zIGF1ZGlvIGF0dHJpYnV0ZXMuCi0vLyBAcGFyYW1bb3V0XSBhdHRyaWJ1dGVzIE9uIGV4aXQgcG9pbnRzIHRvIGFuIGluaXRpYWxpemVkIGF1ZGlvX2F0dHJpYnV0ZXNfdCBzdHJ1Y3R1cmUKLS8vIEBwYXJhbVtvdXRdIHN0YXR1cyBPbiBleGl0IGNvbnRhaW5zIHRoZSBzdGF0dXMgY29kZSB0byBiZSByZXR1cm5lZC4KLXZvaWQgdW5tYXJzaGFsbEF1ZGlvQXR0cmlidXRlcyhjb25zdCBQYXJjZWwmIHBhcmNlbCwgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzKSB7Ci0gICAgYXR0cmlidXRlcy0+dXNhZ2UgPSAoYXVkaW9fdXNhZ2VfdCkgcGFyY2VsLnJlYWRJbnQzMigpOwotICAgIGF0dHJpYnV0ZXMtPmNvbnRlbnRfdHlwZSA9IChhdWRpb19jb250ZW50X3R5cGVfdCkgcGFyY2VsLnJlYWRJbnQzMigpOwotICAgIGF0dHJpYnV0ZXMtPnNvdXJjZSA9IChhdWRpb19zb3VyY2VfdCkgcGFyY2VsLnJlYWRJbnQzMigpOwotICAgIGF0dHJpYnV0ZXMtPmZsYWdzID0gKGF1ZGlvX2ZsYWdzX21hc2tfdCkgcGFyY2VsLnJlYWRJbnQzMigpOwotICAgIGNvbnN0IGJvb2wgaGFzRmxhdHRlbmVkVGFnID0gKHBhcmNlbC5yZWFkSW50MzIoKSA9PSBrQXVkaW9BdHRyaWJ1dGVzTWFyc2hhbGxUYWdGbGF0dGVuVGFncyk7Ci0gICAgaWYgKGhhc0ZsYXR0ZW5lZFRhZykgewotICAgICAgICAvLyB0aGUgdGFncyBhcmUgVVRGMTYsIGNvbnZlcnQgdG8gVVRGOAotICAgICAgICBTdHJpbmcxNiB0YWdzID0gcGFyY2VsLnJlYWRTdHJpbmcxNigpOwotICAgICAgICBzc2l6ZV90IHJlYWxUYWdTaXplID0gdXRmMTZfdG9fdXRmOF9sZW5ndGgodGFncy5zdHJpbmcoKSwgdGFncy5zaXplKCkpOwotICAgICAgICBpZiAocmVhbFRhZ1NpemUgPD0gMCkgewotICAgICAgICAgICAgc3RyY3B5KGF0dHJpYnV0ZXMtPnRhZ3MsICIiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIGNvcHkgdGhlIGZsYXR0ZW5lZCBzdHJpbmcgaW50byB0aGUgYXR0cmlidXRlcyBhcyB0aGUgZGVzdGluYXRpb24gZm9yIHRoZSBjb252ZXJzaW9uOgotICAgICAgICAgICAgLy8gY29weWluZyBhcnJheSBzaXplIC0xLCBhcnJheSBmb3IgdGFncyB3YXMgY2FsbG9jJ2QsIG5vIG5lZWQgdG8gTlVMTC10ZXJtaW5hdGUgaXQKLSAgICAgICAgICAgIHNpemVfdCB0YWdTaXplID0gcmVhbFRhZ1NpemUgPiBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxID8KLSAgICAgICAgICAgICAgICAgICAgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSA6IHJlYWxUYWdTaXplOwotICAgICAgICAgICAgdXRmMTZfdG9fdXRmOCh0YWdzLnN0cmluZygpLCB0YWdTaXplLCBhdHRyaWJ1dGVzLT50YWdzLAotICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXR0cmlidXRlcy0+dGFncykgLyBzaXplb2YoYXR0cmlidXRlcy0+dGFnc1swXSkpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoInVubWFyc2hhbGxBdWRpb0F0dHJpYnV0ZXMoKSByZWNlaXZlZCB1bmZsYXR0ZW5lZCB0YWdzLCBpZ25vcmluZyB0YWcgdmFsdWVzIik7Ci0gICAgICAgIHN0cmNweShhdHRyaWJ1dGVzLT50YWdzLCAiIik7Ci0gICAgfQotfQotCi1jbGFzcyBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcjogcHVibGljIEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrIHsKLXB1YmxpYzoKLSAgICBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcihjb25zdCBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+JiBsaXN0ZW5lcikKLSAgICAgICAgOiBtTGlzdGVuZXIobGlzdGVuZXIpIHsgfQotCi0gICAgfkF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyKCkgeyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb0RldmljZVVwZGF0ZShhdWRpb19pb19oYW5kbGVfdCBhdWRpb0lvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBsaXN0ZW5lciA9IG1MaXN0ZW5lci5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBsaXN0ZW5lci0+c2VuZEV2ZW50KDAsIE1FRElBMl9BVURJT19ST1VUSU5HX0NIQU5HRUQsIGF1ZGlvSW8sIGRldmljZUlkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJsaXN0ZW5lciBmb3IgcHJvY2VzcyAlZCBkZWF0aCBpcyBnb25lIiwgTUVESUEyX0FVRElPX1JPVVRJTkdfQ0hBTkdFRCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgd3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBtTGlzdGVuZXI7Ci19OwotCi1jbGFzcyBwcm94eUxpc3RlbmVyIDogcHVibGljIE1lZGlhUGxheWVyMkludGVyZmFjZUxpc3RlbmVyIHsKLXB1YmxpYzoKLSAgICBwcm94eUxpc3RlbmVyKGNvbnN0IHdwPE1lZGlhUGxheWVyMj4gJnBsYXllcikKLSAgICAgICAgOiBtUGxheWVyKHBsYXllcikgeyB9Ci0KLSAgICB+cHJveHlMaXN0ZW5lcigpIHsgfTsKLQotICAgIHZpcnR1YWwgdm9pZCBub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgb3ZlcnJpZGUgewotICAgICAgICBzcDxNZWRpYVBsYXllcjI+IHBsYXllciA9IG1QbGF5ZXIucHJvbW90ZSgpOwotICAgICAgICBpZiAocGxheWVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHBsYXllci0+bm90aWZ5KHNyY0lkLCBtc2csIGV4dDEsIGV4dDIsIG9iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgd3A8TWVkaWFQbGF5ZXIyPiBtUGxheWVyOwotfTsKLQotTXV0ZXggc1JlY29yZExvY2s7Ci1Tb3J0ZWRWZWN0b3I8d3A8TWVkaWFQbGF5ZXIyPiA+ICpzUGxheWVyczsKLQotdm9pZCBlbnN1cmVJbml0X2woKSB7Ci0gICAgaWYgKHNQbGF5ZXJzID09IE5VTEwpIHsKLSAgICAgICAgc1BsYXllcnMgPSBuZXcgU29ydGVkVmVjdG9yPHdwPE1lZGlhUGxheWVyMj4gPigpOwotICAgIH0KLX0KLQotdm9pZCBhZGRQbGF5ZXIoY29uc3Qgd3A8TWVkaWFQbGF5ZXIyPiYgcGxheWVyKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soc1JlY29yZExvY2spOwotICAgIGVuc3VyZUluaXRfbCgpOwotICAgIHNQbGF5ZXJzLT5hZGQocGxheWVyKTsKLX0KLQotdm9pZCByZW1vdmVQbGF5ZXIoY29uc3Qgd3A8TWVkaWFQbGF5ZXIyPiYgcGxheWVyKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2soc1JlY29yZExvY2spOwotICAgIGVuc3VyZUluaXRfbCgpOwotICAgIHNQbGF5ZXJzLT5yZW1vdmUocGxheWVyKTsKLX0KLQotLyoqCi0gKiBUaGUgb25seSBhcmd1bWVudHMgdGhpcyB1bmRlcnN0YW5kcyByaWdodCBub3cgYXJlIC1jLCAtdm9uIGFuZCAtdm9mZiwKLSAqIHdoaWNoIGFyZSBwYXJzZWQgYnkgQUxvb3BlclJvc3Rlcjo6ZHVtcCgpCi0gKi8KLXN0YXR1c190IGR1bXBQbGF5ZXJzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotICAgIFNvcnRlZFZlY3Rvcjwgc3A8TWVkaWFQbGF5ZXIyPiA+IHBsYXllcnM7IC8vdG8gc2VyaWFsaXNlIHRoZSBtdXRleCB1bmxvY2sgJiBjbGllbnQgZGVzdHJ1Y3Rpb24uCi0KLSAgICBpZiAoY2hlY2tDYWxsaW5nUGVybWlzc2lvbihTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKSkgPT0gZmFsc2UpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgTWVkaWFQbGF5ZXIyXG4iKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKHNSZWNvcmRMb2NrKTsKLSAgICAgICAgICAgIGVuc3VyZUluaXRfbCgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDAsIG4gPSBzUGxheWVycy0+c2l6ZSgpOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgc3A8TWVkaWFQbGF5ZXIyPiBwID0gKCpzUGxheWVycylbaV0ucHJvbW90ZSgpOwotICAgICAgICAgICAgICAgIGlmIChwICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcC0+ZHVtcChmZCwgYXJncyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBsYXllcnMuYWRkKHApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIEZpbGVzIG9wZW5lZCBhbmQvb3IgbWFwcGVkOlxuIik7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL21hcHMiLCBnZXRwaWQoKSk7Ci0gICAgICAgIEZJTEUgKmYgPSBmb3BlbihidWZmZXIsICJyIik7Ci0gICAgICAgIGlmIChmKSB7Ci0gICAgICAgICAgICB3aGlsZSAoIWZlb2YoZikpIHsKLSAgICAgICAgICAgICAgICBmZ2V0cyhidWZmZXIsIFNJWkUsIGYpOwotICAgICAgICAgICAgICAgIGlmIChzdHJzdHIoYnVmZmVyLCAiIC9zdG9yYWdlLyIpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHN0cnN0cihidWZmZXIsICIgL3N5c3RlbS9zb3VuZHMvIikgfHwKLSAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGJ1ZmZlciwgIiAvZGF0YS8iKSB8fAotICAgICAgICAgICAgICAgICAgICBzdHJzdHIoYnVmZmVyLCAiIC9zeXN0ZW0vbWVkaWEvIikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAiKTsKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZjbG9zZShmKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoImNvdWxkbid0IG9wZW4gIik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiL3Byb2MvJWQvZmQiLCBnZXRwaWQoKSk7Ci0gICAgICAgIERJUiAqZCA9IG9wZW5kaXIoYnVmZmVyKTsKLSAgICAgICAgaWYgKGQpIHsKLSAgICAgICAgICAgIHN0cnVjdCBkaXJlbnQgKmVudDsKLSAgICAgICAgICAgIHdoaWxlKChlbnQgPSByZWFkZGlyKGQpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0cmNtcChlbnQtPmRfbmFtZSwiLiIpICYmIHN0cmNtcChlbnQtPmRfbmFtZSwiLi4iKSkgewotICAgICAgICAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIvcHJvYy8lZC9mZC8lcyIsIGdldHBpZCgpLCBlbnQtPmRfbmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzdGF0IHM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChsc3RhdChidWZmZXIsICZzKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKHMuc3RfbW9kZSAmIFNfSUZNVCkgPT0gU19JRkxOSykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgbGlua3RvWzI1Nl07Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxlbiA9IHJlYWRsaW5rKGJ1ZmZlciwgbGlua3RvLCBzaXplb2YobGlua3RvKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYobGVuID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZihsZW4gPiAyNTUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTJdID0gJy4nOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1M10gPSAnLic7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjU0XSA9ICcuJzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTVdID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmt0b1tsZW5dID0gMDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3Ryc3RyKGxpbmt0bywgIi9zdG9yYWdlLyIpID09IGxpbmt0byB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGxpbmt0bywgIi9zeXN0ZW0vc291bmRzLyIpID09IGxpbmt0byB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGxpbmt0bywgIi9kYXRhLyIpID09IGxpbmt0byB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryc3RyKGxpbmt0bywgIi9zeXN0ZW0vbWVkaWEvIikgPT0gbGlua3RvKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCIgICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiIC0+ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5rdG8pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICB1bmV4cGVjdGVkIHR5cGUgZm9yICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xvc2VkaXIoZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKCJjb3VsZG4ndCBvcGVuICIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGdMb29wZXJSb3N0ZXIuZHVtcChmZCwgYXJncyk7Ci0KLSAgICAgICAgYm9vbCBkdW1wTWVtID0gZmFsc2U7Ci0gICAgICAgIGJvb2wgdW5yZWFjaGFibGVNZW1vcnkgPSBmYWxzZTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoYXJnc1tpXSA9PSBTdHJpbmcxNigiLW0iKSkgewotICAgICAgICAgICAgICAgIGR1bXBNZW0gPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhcmdzW2ldID09IFN0cmluZzE2KCItLXVucmVhY2hhYmxlIikpIHsKLSAgICAgICAgICAgICAgICB1bnJlYWNoYWJsZU1lbW9yeSA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGR1bXBNZW0pIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuRHVtcGluZyBtZW1vcnk6XG4iKTsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHMgPSBkdW1wTWVtb3J5QWRkcmVzc2VzKDEwMCAvKiBsaW1pdCAqLyk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKHMuY19zdHIoKSwgcy5zaXplKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1bnJlYWNoYWJsZU1lbW9yeSkgewotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiXG5EdW1waW5nIHVucmVhY2hhYmxlIG1lbW9yeTpcbiIpOwotICAgICAgICAgICAgLy8gVE9ETyAtIHNob3VsZCBsaW1pdCBiZSBhbiBhcmd1bWVudCBwYXJhbWV0ZXI/Ci0gICAgICAgICAgICAvLyBUT0RPOiBlbmFibGUgR2V0VW5yZWFjaGFibGVNZW1vcnlTdHJpbmcgaWYgaXQncyBwYXJ0IG9mIHN0YWJsZSBBUEkKLSAgICAgICAgICAgIC8vc3RkOjpzdHJpbmcgcyA9IEdldFVucmVhY2hhYmxlTWVtb3J5U3RyaW5nKHRydWUgLyogY29udGVudHMgKi8sIDEwMDAwIC8qIGxpbWl0ICovKTsKLSAgICAgICAgICAgIC8vcmVzdWx0LmFwcGVuZChzLmNfc3RyKCksIHMuc2l6ZSgpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLX0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKLQotLy9zdGF0aWMKLXNwPE1lZGlhUGxheWVyMj4gTWVkaWFQbGF5ZXIyOjpDcmVhdGUoKSB7Ci0gICAgc3A8TWVkaWFQbGF5ZXIyPiBwbGF5ZXIgPSBuZXcgTWVkaWFQbGF5ZXIyKCk7Ci0KLSAgICBpZiAoIXBsYXllci0+aW5pdCgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIEFMT0dWKCJDcmVhdGUgbmV3IHBsYXllciglcCkiLCBwbGF5ZXIuZ2V0KCkpOwotCi0gICAgYWRkUGxheWVyKHBsYXllcik7Ci0gICAgcmV0dXJuIHBsYXllcjsKLX0KLQotLy8gc3RhdGljCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OkR1bXBBbGwoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7Ci0gICAgcmV0dXJuIGR1bXBQbGF5ZXJzKGZkLCBhcmdzKTsKLX0KLQotTWVkaWFQbGF5ZXIyOjpNZWRpYVBsYXllcjIoKSB7Ci0gICAgQUxPR1YoImNvbnN0cnVjdG9yIik7Ci0gICAgbVNyY0lkID0gMDsKLSAgICBtTG9ja1RocmVhZElkID0gMDsKLSAgICBtTGlzdGVuZXIgPSBOVUxMOwotICAgIG1TdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX01VU0lDOwotICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgPSBOVUxMOwotICAgIG1DdXJyZW50UG9zaXRpb24gPSAtMTsKLSAgICBtQ3VycmVudFNlZWtNb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQzsKLSAgICBtU2Vla1Bvc2l0aW9uID0gLTE7Ci0gICAgbVNlZWtNb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQzsKLSAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9JRExFOwotICAgIG1Mb29wID0gZmFsc2U7Ci0gICAgbUxlZnRWb2x1bWUgPSBtUmlnaHRWb2x1bWUgPSAxLjA7Ci0gICAgbVZpZGVvV2lkdGggPSBtVmlkZW9IZWlnaHQgPSAwOwotICAgIG1BdWRpb1Nlc3Npb25JZCA9IChhdWRpb19zZXNzaW9uX3QpIEF1ZGlvU3lzdGVtOjpuZXdBdWRpb1VuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfU0VTU0lPTik7Ci0gICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQsIC0xKTsKLSAgICBtU2VuZExldmVsID0gMDsKLQotICAgIC8vIFRPRE86IGdldCBwaWQgYW5kIHVpZCBmcm9tIEpBVkEKLSAgICBtUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgIG1VaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0KLSAgICBtQXVkaW9BdHRyaWJ1dGVzID0gTlVMTDsKLX0KLQotTWVkaWFQbGF5ZXIyOjp+TWVkaWFQbGF5ZXIyKCkgewotICAgIEFMT0dWKCJkZXN0cnVjdG9yIik7Ci0gICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgewotICAgICAgICBkZWxldGUgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbDsKLSAgICAgICAgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbCA9IE5VTEw7Ci0gICAgfQotICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQobUF1ZGlvU2Vzc2lvbklkLCAtMSk7Ci0gICAgZGlzY29ubmVjdCgpOwotICAgIHJlbW92ZVBsYXllcih0aGlzKTsKLSAgICBpZiAobUF1ZGlvQXR0cmlidXRlcyAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUF1ZGlvQXR0cmlidXRlcyk7Ci0gICAgfQotfQotCi1ib29sIE1lZGlhUGxheWVyMjo6aW5pdCgpIHsKLSAgICAvLyBUT0RPOiBhZnRlciBtZXJnZSB3aXRoIE51UGxheWVyMkRyaXZlciwgTWVkaWFQbGF5ZXIyIHdpbGwgaGF2ZSBpdHMgb3duCi0gICAgLy8gbG9vcGVyIGZvciBub3RpZmljYXRpb24uCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgTWVkaWFQbGF5ZXIyOjpkaXNjb25uZWN0KCkgewotICAgIEFMT0dWKCJkaXNjb25uZWN0Iik7Ci0gICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBwOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgcCA9IG1QbGF5ZXI7Ci0gICAgICAgIG1QbGF5ZXIuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBpZiAocCAhPSAwKSB7Ci0gICAgICAgIHAtPnNldExpc3RlbmVyKE5VTEwpOwotICAgICAgICBwLT5yZXNldCgpOwotICAgIH0KLQotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgZGlzY29ubmVjdE5hdGl2ZVdpbmRvd19sKCk7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhUGxheWVyMjo6Y2xlYXJfbCgpIHsKLSAgICBtQ3VycmVudFBvc2l0aW9uID0gLTE7Ci0gICAgbUN1cnJlbnRTZWVrTW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkM7Ci0gICAgbVNlZWtQb3NpdGlvbiA9IC0xOwotICAgIG1TZWVrTW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkM7Ci0gICAgbVZpZGVvV2lkdGggPSBtVmlkZW9IZWlnaHQgPSAwOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldExpc3RlbmVyKGNvbnN0IHNwPE1lZGlhUGxheWVyMkxpc3RlbmVyPiYgbGlzdGVuZXIpIHsKLSAgICBBTE9HVigic2V0TGlzdGVuZXIiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRTcmNJZChpbnQ2NF90ICpzcmNJZCkgewotICAgIGlmIChzcmNJZCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAqc3JjSWQgPSBtU3JjSWQ7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZURlc2M+ICZkc2QpIHsKLSAgICBpZiAoZHNkID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgQUxPR1YoInNldERhdGFTb3VyY2UgdHlwZSglZCksIHNyY0lkKCVsbGQpIiwgZHNkLT5tVHlwZSwgKGxvbmcgbG9uZylkc2QtPm1JZCk7Ci0KLSAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+IG9sZFBsYXllcjsKLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgewotICAgICAgICBpZiAoISgobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfSURMRSkKLSAgICAgICAgICAgICAgfHwgbUN1cnJlbnRTdGF0ZSA9PSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SKSkgewotICAgICAgICAgICAgQUxPR0UoInNldERhdGFTb3VyY2UgY2FsbGVkIGluIHdyb25nIHN0YXRlICVkIiwgbUN1cnJlbnRTdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLQotICAgICAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+IHBsYXllciA9IG5ldyBOdVBsYXllcjJEcml2ZXIobVBpZCwgbVVpZCk7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IHBsYXllci0+aW5pdENoZWNrKCk7Ci0gICAgICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIHBsYXllciBvYmplY3QsIGluaXRDaGVjayBmYWlsZWQoJWQpIiwgZXJyKTsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBjbGVhcl9sKCk7Ci0KLSAgICAgICAgcGxheWVyLT5zZXRMaXN0ZW5lcihuZXcgcHJveHlMaXN0ZW5lcih0aGlzKSk7Ci0gICAgICAgIG1BdWRpb091dHB1dCA9IG5ldyBNZWRpYVBsYXllcjJBdWRpb091dHB1dChtQXVkaW9TZXNzaW9uSWQsIG1VaWQsCi0gICAgICAgICAgICAgICAgbVBpZCwgbUF1ZGlvQXR0cmlidXRlcywgbmV3IEF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyKHBsYXllcikpOwotICAgICAgICBwbGF5ZXItPnNldEF1ZGlvU2luayhtQXVkaW9PdXRwdXQpOwotCi0gICAgICAgIGVyciA9IHBsYXllci0+c2V0RGF0YVNvdXJjZShkc2QpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgic2V0RGF0YVNvdXJjZSBlcnJvcjogJWQiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfQotCi0gICAgICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZT4gb2xkUGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgbVBsYXllciA9IHBsYXllcjsKLSAgICAgICAgbVNyY0lkID0gZHNkLT5tSWQ7Ci0gICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX0lOSVRJQUxJWkVEOwotICAgIH0KLQotICAgIGlmIChvbGRQbGF5ZXIgIT0gTlVMTCkgewotICAgICAgICBvbGRQbGF5ZXItPnNldExpc3RlbmVyKE5VTEwpOwotICAgICAgICBvbGRQbGF5ZXItPnJlc2V0KCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnByZXBhcmVOZXh0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlRGVzYz4gJmRzZCkgewotICAgIGlmIChkc2QgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBBTE9HVigicHJlcGFyZU5leHREYXRhU291cmNlIHR5cGUoJWQpLCBzcmNJZCglbGxkKSIsIGRzZC0+bVR5cGUsIChsb25nIGxvbmcpZHNkLT5tSWQpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJwcmVwYXJlTmV4dERhdGFTb3VyY2UgZmFpbGVkOiBzdGF0ZSAlWCwgbVBsYXllciglcCkiLCBtQ3VycmVudFN0YXRlLCBtUGxheWVyLmdldCgpKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICByZXR1cm4gbVBsYXllci0+cHJlcGFyZU5leHREYXRhU291cmNlKGRzZCk7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyMjo6cGxheU5leHREYXRhU291cmNlKGludDY0X3Qgc3JjSWQpIHsKLSAgICBBTE9HVigicGxheU5leHREYXRhU291cmNlIHNyY0lkKCVsbGQpIiwgKGxvbmcgbG9uZylzcmNJZCk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGxheWVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoInBsYXlOZXh0RGF0YVNvdXJjZSBmYWlsZWQ6IHN0YXRlICVYLCBtUGxheWVyKCVwKSIsIG1DdXJyZW50U3RhdGUsIG1QbGF5ZXIuZ2V0KCkpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIG1TcmNJZCA9IHNyY0lkOwotICAgIHJldHVybiBtUGxheWVyLT5wbGF5TmV4dERhdGFTb3VyY2Uoc3JjSWQpOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6Omludm9rZShjb25zdCBQYXJjZWwmIHJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGNvbnN0IGJvb2wgaGFzQmVlbkluaXRpYWxpemVkID0KLSAgICAgICAgICAgIChtQ3VycmVudFN0YXRlICE9IE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1IpICYmCi0gICAgICAgICAgICAoKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX0lETEUpICE9IE1FRElBX1BMQVlFUjJfSURMRSk7Ci0gICAgaWYgKChtUGxheWVyID09IE5VTEwpIHx8ICFoYXNCZWVuSW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgQUxPR0UoImludm9rZSBmYWlsZWQ6IHdyb25nIHN0YXRlICVYLCBtUGxheWVyKCVwKSIsIG1DdXJyZW50U3RhdGUsIG1QbGF5ZXIuZ2V0KCkpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIEFMT0dWKCJpbnZva2UgJXp1IiwgcmVxdWVzdC5kYXRhU2l6ZSgpKTsKLSAgICByZXR1cm4gbVBsYXllci0+aW52b2tlKHJlcXVlc3QsIHJlcGx5KTsKLX0KLQotLy8gVGhpcyBjYWxsIGRvZXNuJ3QgbmVlZCB0byBhY2Nlc3MgdGhlIG5hdGl2ZSBwbGF5ZXIuCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldE1ldGFkYXRhRmlsdGVyKGNvbnN0IFBhcmNlbCYgZmlsdGVyKSB7Ci0gICAgQUxPR0QoInNldE1ldGFkYXRhRmlsdGVyIik7Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgbWVkaWE6Ok1ldGFkYXRhOjpGaWx0ZXIgYWxsb3csIGRyb3A7Ci0KLSAgICBpZiAodW5tYXJzaGFsbEZpbHRlcihmaWx0ZXIsICZhbGxvdywgJnN0YXR1cykgJiYKLSAgICAgICAgdW5tYXJzaGFsbEZpbHRlcihmaWx0ZXIsICZkcm9wLCAmc3RhdHVzKSkgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0KLSAgICAgICAgbU1ldGFkYXRhQWxsb3cgPSBhbGxvdzsKLSAgICAgICAgbU1ldGFkYXRhRHJvcCA9IGRyb3A7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0TWV0YWRhdGEoYm9vbCB1cGRhdGVfb25seSwgYm9vbCAvKiBhcHBseV9maWx0ZXIgKi8sIFBhcmNlbCAqcmVwbHkpIHsKLSAgICBBTE9HRCgiZ2V0TWV0YWRhdGEiKTsKLSAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U+IHBsYXllcjsKLSAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBpZHM7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIHsKLSAgICAgICAgaWYgKG1QbGF5ZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICAvLyBQbGFjZWhvbGRlciBmb3IgdGhlIHJldHVybiBjb2RlLCB1cGRhdGVkIGJ5IHRoZSBjYWxsZXIuCi0gICAgICAgIHJlcGx5LT53cml0ZUludDMyKC0xKTsKLQotICAgICAgICAvLyBXZSBkb24ndCBibG9jayBub3RpZmljYXRpb25zIHdoaWxlIHdlIGZldGNoIHRoZSBkYXRhLiBXZSBjbGVhcgotICAgICAgICAvLyBtTWV0YWRhdGFVcGRhdGVkIGZpcnN0IHNvIHdlIGRvbid0IGxvc2Ugbm90aWZpY2F0aW9ucyBoYXBwZW5pbmcKLSAgICAgICAgLy8gZHVyaW5nIHRoZSByZXN0IG9mIHRoaXMgY2FsbC4KLSAgICAgICAgaWYgKHVwZGF0ZV9vbmx5KSB7Ci0gICAgICAgICAgICBpZHMgPSBtTWV0YWRhdGFVcGRhdGVkOwotICAgICAgICB9Ci0gICAgICAgIG1NZXRhZGF0YVVwZGF0ZWQuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBtZWRpYTo6TWV0YWRhdGEgbWV0YWRhdGEocmVwbHkpOwotCi0gICAgbWV0YWRhdGEuYXBwZW5kSGVhZGVyKCk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gcGxheWVyLT5nZXRNZXRhZGF0YShpZHMsIHJlcGx5KTsKLQotICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgbWV0YWRhdGEucmVzZXRQYXJjZWwoKTsKLSAgICAgICAgQUxPR0UoImdldE1ldGFkYXRhIGZhaWxlZCAlZCIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgLy8gRklYTUU6IGVtZW50IGZpbHRlcmluZyBvbiB0aGUgcmVzdWx0LiBOb3QgY3JpdGljYWwgc2luY2UKLSAgICAvLyBmaWx0ZXJpbmcgdGFrZXMgcGxhY2Ugb24gdGhlIHVwZGF0ZSBub3RpZmljYXRpb25zIGFscmVhZHkuIFRoaXMKLSAgICAvLyB3b3VsZCBiZSB3aGVuIGFsbCB0aGUgbWV0YWRhdGEgYXJlIGZldGNoIGFuZCBhIGZpbHRlciBpcyBzZXQuCi0KLSAgICAvLyBFdmVyeXRoaW5nIGlzIGZpbmUsIHVwZGF0ZSB0aGUgbWV0YWRhdGEgbGVuZ3RoLgotICAgIG1ldGFkYXRhLnVwZGF0ZUxlbmd0aCgpOwotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBNZWRpYVBsYXllcjI6OmRpc2Nvbm5lY3ROYXRpdmVXaW5kb3dfbCgpIHsKLSAgICBpZiAobUNvbm5lY3RlZFdpbmRvdyAhPSBOVUxMICYmIG1Db25uZWN0ZWRXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSAhPSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QoCi0gICAgICAgICAgICAgICAgbUNvbm5lY3RlZFdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpLCBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR1coIm5hdGl2ZVdpbmRvd0Rpc2Nvbm5lY3QgcmV0dXJuZWQgYW4gZXJyb3I6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLWVyciksIGVycik7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbUNvbm5lY3RlZFdpbmRvdy5jbGVhcigpOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldFZpZGVvU3VyZmFjZVRleHR1cmUoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+JiBud3cpIHsKLSAgICBBTmF0aXZlV2luZG93ICphbncgPSAobnd3ID09IE5VTEwgPyBOVUxMIDogbnd3LT5nZXRBTmF0aXZlV2luZG93KCkpOwotICAgIEFMT0dWKCJzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKCVwKSIsIGFudyk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBsYXllciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIGlmIChhbncgIT0gTlVMTCkgewotICAgICAgICBpZiAobUNvbm5lY3RlZFdpbmRvdyAhPSBOVUxMCi0gICAgICAgICAgICAmJiBtQ29ubmVjdGVkV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCkgPT0gYW53KSB7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChhbncsIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKLQotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgic2V0VmlkZW9TdXJmYWNlVGV4dHVyZSBmYWlsZWQ6ICVkIiwgZXJyKTsKLSAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBtdXN0IGRvIHRoZSByZXNldCBiZWZvcmUgZGlzY29ubmVjdGluZyBmcm9tIHRoZSBBTlcuCi0gICAgICAgICAgICAvLyBPdGhlcndpc2UgcXVldWUvZGVxdWV1ZSBjYWxscyBjb3VsZCBiZSBtYWRlIG9uIHRoZSBkaXNjb25uZWN0ZWQKLSAgICAgICAgICAgIC8vIEFOVywgd2hpY2ggbWF5IHJlc3VsdCBpbiBlcnJvcnMuCi0gICAgICAgICAgICBtUGxheWVyLT5yZXNldCgpOwotICAgICAgICAgICAgZGlzY29ubmVjdE5hdGl2ZVdpbmRvd19sKCk7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm90ZSB0aGF0IHdlIG11c3Qgc2V0IHRoZSBwbGF5ZXIncyBuZXcgR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGJlZm9yZQotICAgIC8vIGRpc2Nvbm5lY3RpbmcgdGhlIG9sZCBvbmUuICBPdGhlcndpc2UgcXVldWUvZGVxdWV1ZSBjYWxscyBjb3VsZCBiZSBtYWRlCi0gICAgLy8gb24gdGhlIGRpc2Nvbm5lY3RlZCBBTlcsIHdoaWNoIG1heSByZXN1bHQgaW4gZXJyb3JzLgotICAgIHN0YXR1c190IGVyciA9IG1QbGF5ZXItPnNldFZpZGVvU3VyZmFjZVRleHR1cmUobnd3KTsKLQotICAgIGRpc2Nvbm5lY3ROYXRpdmVXaW5kb3dfbCgpOwotCi0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICBtQ29ubmVjdGVkV2luZG93ID0gbnd3OwotICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICB9IGVsc2UgaWYgKGFudyAhPSBOVUxMKSB7Ci0gICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICBzdGF0dXNfdCBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KGFudywgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dXKCJuYXRpdmVXaW5kb3dEaXNjb25uZWN0IHJldHVybmVkIGFuIGVycm9yOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1lcnIpLCBlcnIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRCdWZmZXJpbmdTZXR0aW5ncyhCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIHsKLSAgICBBTE9HVigiZ2V0QnVmZmVyaW5nU2V0dGluZ3MiKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QbGF5ZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5nZXRCdWZmZXJpbmdTZXR0aW5ncyhidWZmZXJpbmcpOwotICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1YoImdldEJ1ZmZlcmluZ1NldHRpbmdzeyVzfSIsIGJ1ZmZlcmluZy0+dG9TdHJpbmcoKS5zdHJpbmcoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoImdldEJ1ZmZlcmluZ1NldHRpbmdzIHJldHVybmVkICVkIiwgcmV0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSB7Ci0gICAgQUxPR1YoInNldEJ1ZmZlcmluZ1NldHRpbmdzeyVzfSIsIGJ1ZmZlcmluZy50b1N0cmluZygpLnN0cmluZygpKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QbGF5ZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0gICAgcmV0dXJuIG1QbGF5ZXItPnNldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QXVkaW9BdHRyaWJ1dGVzX2woY29uc3QgUGFyY2VsICZwYXJjZWwpIHsKLSAgICBpZiAobUF1ZGlvQXR0cmlidXRlcyAhPSBOVUxMKSB7Ci0gICAgICAgIGZyZWUobUF1ZGlvQXR0cmlidXRlcyk7Ci0gICAgfQotICAgIG1BdWRpb0F0dHJpYnV0ZXMgPSAoYXVkaW9fYXR0cmlidXRlc190ICopIGNhbGxvYygxLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7Ci0gICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLSAgICB1bm1hcnNoYWxsQXVkaW9BdHRyaWJ1dGVzKHBhcmNlbCwgbUF1ZGlvQXR0cmlidXRlcyk7Ci0KLSAgICBBTE9HVigic2V0QXVkaW9BdHRyaWJ1dGVzX2woKSB1c2FnZT0lZCBjb250ZW50PSVkIGZsYWdzPTB4JXggdGFncz0lcyIsCi0gICAgICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzLT51c2FnZSwgbUF1ZGlvQXR0cmlidXRlcy0+Y29udGVudF90eXBlLCBtQXVkaW9BdHRyaWJ1dGVzLT5mbGFncywKLSAgICAgICAgICAgIG1BdWRpb0F0dHJpYnV0ZXMtPnRhZ3MpOwotCi0gICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7Ci0gICAgICAgIG1BdWRpb091dHB1dC0+c2V0QXVkaW9BdHRyaWJ1dGVzKG1BdWRpb0F0dHJpYnV0ZXMpOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyMjo6cHJlcGFyZUFzeW5jKCkgewotICAgIEFMT0dWKCJwcmVwYXJlQXN5bmMiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmICgobVBsYXllciAhPSAwKSAmJiAobUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX0lOSVRJQUxJWkVEIHwgTUVESUFfUExBWUVSMl9TVE9QUEVEKSkpIHsKLSAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0QXVkaW9BdHRyaWJ1dGVzX2woKm1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwpOwotICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHsKLSAgICAgICAgICAgIG1BdWRpb091dHB1dC0+c2V0QXVkaW9TdHJlYW1UeXBlKG1TdHJlYW1UeXBlKTsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9QUkVQQVJJTkc7Ci0gICAgICAgIHJldHVybiBtUGxheWVyLT5wcmVwYXJlQXN5bmMoKTsKLSAgICB9Ci0gICAgQUxPR0UoInByZXBhcmVBc3luYyBjYWxsZWQgaW4gc3RhdGUgJWQsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnN0YXJ0KCkgewotICAgIEFMT0dWKCJzdGFydCIpOwotCi0gICAgc3RhdHVzX3QgcmV0ID0gTk9fRVJST1I7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLQotICAgIG1Mb2NrVGhyZWFkSWQgPSBnZXRUaHJlYWRJZCgpOwotCi0gICAgaWYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUQVJURUQpIHsKLSAgICAgICAgcmV0ID0gTk9fRVJST1I7Ci0gICAgfSBlbHNlIGlmICggKG1QbGF5ZXIgIT0gMCkgJiYgKCBtQ3VycmVudFN0YXRlICYgKCBNRURJQV9QTEFZRVIyX1BSRVBBUkVEIHwKLSAgICAgICAgICAgICAgICAgICAgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSB8IE1FRElBX1BMQVlFUjJfUEFVU0VEICkgKSApIHsKLSAgICAgICAgbVBsYXllci0+c2V0TG9vcGluZyhtTG9vcCk7Ci0KLSAgICAgICAgaWYgKG1BdWRpb091dHB1dCAhPSAwKSB7Ci0gICAgICAgICAgICBtQXVkaW9PdXRwdXQtPnNldFZvbHVtZShtTGVmdFZvbHVtZSwgbVJpZ2h0Vm9sdW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgewotICAgICAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobVNlbmRMZXZlbCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfU1RBUlRFRDsKLSAgICAgICAgcmV0ID0gbVBsYXllci0+c3RhcnQoKTsKLSAgICAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBNRURJQV9QTEFZRVIyX1BMQVlCQUNLX0NPTVBMRVRFKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInBsYXliYWNrIGNvbXBsZXRlZCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgc3RhcnQoKSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoInN0YXJ0IGNhbGxlZCBpbiBzdGF0ZSAlZCwgbVBsYXllciglcCkiLCBtQ3VycmVudFN0YXRlLCBtUGxheWVyLmdldCgpKTsKLSAgICAgICAgcmV0ID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgbUxvY2tUaHJlYWRJZCA9IDA7Ci0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnN0b3AoKSB7Ci0gICAgQUxPR1YoInN0b3AiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9TVE9QUEVEKSByZXR1cm4gTk9fRVJST1I7Ci0gICAgaWYgKCAobVBsYXllciAhPSAwKSAmJiAoIG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUjJfU1RBUlRFRCB8IE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfAotICAgICAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUgKSApICkgewotICAgICAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5zdG9wKCk7Ci0gICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfU1RPUFBFRDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLSAgICBBTE9HRSgic3RvcCBjYWxsZWQgaW4gc3RhdGUgJWQsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnBhdXNlKCkgewotICAgIEFMT0dWKCJwYXVzZSIpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9QQVVTRUR8TUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpCi0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICBpZiAoKG1QbGF5ZXIgIT0gMCkgJiYgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1NUQVJURUQpKSB7Ci0gICAgICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnBhdXNlKCk7Ci0gICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfUEFVU0VEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIEFMT0dFKCJwYXVzZSBjYWxsZWQgaW4gc3RhdGUgJWQsIG1QbGF5ZXIoJXApIiwgbUN1cnJlbnRTdGF0ZSwgbVBsYXllci5nZXQoKSk7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1ib29sIE1lZGlhUGxheWVyMjo6aXNQbGF5aW5nKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QbGF5ZXIgIT0gMCkgewotICAgICAgICBib29sIHRlbXAgPSBtUGxheWVyLT5pc1BsYXlpbmcoKTsKLSAgICAgICAgQUxPR1YoImlzUGxheWluZzogJWQiLCB0ZW1wKTsKLSAgICAgICAgaWYgKChtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9TVEFSVEVEKSAmJiAhIHRlbXApIHsKLSAgICAgICAgICAgIEFMT0dFKCJpbnRlcm5hbC9leHRlcm5hbCBzdGF0ZSBtaXNtYXRjaCBjb3JyZWN0ZWQiKTsKLSAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1BBVVNFRDsKLSAgICAgICAgfSBlbHNlIGlmICgobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfUEFVU0VEKSAmJiB0ZW1wKSB7Ci0gICAgICAgICAgICBBTE9HRSgiaW50ZXJuYWwvZXh0ZXJuYWwgc3RhdGUgbWlzbWF0Y2ggY29ycmVjdGVkIik7Ci0gICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9TVEFSVEVEOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0ZW1wOwotICAgIH0KLSAgICBBTE9HVigiaXNQbGF5aW5nOiBubyBhY3RpdmUgcGxheWVyIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1tZWRpYXBsYXllcjJfc3RhdGVzIE1lZGlhUGxheWVyMjo6Z2V0TWVkaWFQbGF5ZXIyU3RhdGUoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIE1FRElBUExBWUVSMl9TVEFURV9FUlJPUjsKLSAgICB9Ci0gICAgaWYgKG1QbGF5ZXIgPT0gMAotICAgICAgICB8fCAobUN1cnJlbnRTdGF0ZSAmCi0gICAgICAgICAgICAoTUVESUFfUExBWUVSMl9JRExFIHwgTUVESUFfUExBWUVSMl9JTklUSUFMSVpFRCB8IE1FRElBX1BMQVlFUjJfUFJFUEFSSU5HKSkpIHsKLSAgICAgICAgcmV0dXJuIE1FRElBUExBWUVSMl9TVEFURV9JRExFOwotICAgIH0KLSAgICBpZiAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RBUlRFRCkgewotICAgICAgICByZXR1cm4gTUVESUFQTEFZRVIyX1NUQVRFX1BMQVlJTkc7Ci0gICAgfQotICAgIGlmIChtQ3VycmVudFN0YXRlCi0gICAgICAgICYgKE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9TVE9QUEVEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpIHsKLSAgICAgICAgcmV0dXJuIE1FRElBUExBWUVSMl9TVEFURV9QQVVTRUQ7Ci0gICAgfQotICAgIC8vIG5vdyBvbmx5IG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX1BSRVBBUkVEIGlzIHRydWUKLSAgICByZXR1cm4gTUVESUFQTEFZRVIyX1NUQVRFX1BSRVBBUkVEOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUmIHJhdGUpIHsKLSAgICBBTE9HVigic2V0UGxheWJhY2tTZXR0aW5nczogJWYgJWYgJWQgJWQiLAotICAgICAgICAgICAgcmF0ZS5tU3BlZWQsIHJhdGUubVBpdGNoLCByYXRlLm1GYWxsYmFja01vZGUsIHJhdGUubVN0cmV0Y2hNb2RlKTsKLSAgICAvLyBOZWdhdGl2ZSBzcGVlZCBhbmQgcGl0Y2ggZG9lcyBub3QgbWFrZSBzZW5zZS4gRnVydGhlciB2YWxpZGF0aW9uIHdpbGwKLSAgICAvLyBiZSBkb25lIGJ5IHRoZSByZXNwZWN0aXZlIG1lZGlhcGxheWVycy4KLSAgICBpZiAocmF0ZS5tU3BlZWQgPD0gMC5mIHx8IHJhdGUubVBpdGNoIDwgMC5mKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QbGF5ZXIgPT0gMCB8fCAobUN1cnJlbnRTdGF0ZSAmIE1FRElBX1BMQVlFUjJfU1RPUFBFRCkpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHN0YXR1c190IGVyciA9IG1QbGF5ZXItPnNldFBsYXliYWNrU2V0dGluZ3MocmF0ZSk7Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlKiByYXRlIC8qIG5vbm51bGwgKi8pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGxheWVyID09IDApIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5nZXRQbGF5YmFja1NldHRpbmdzKHJhdGUpOwotICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR1YoImdldFBsYXliYWNrU2V0dGluZ3MoJWYsICVmLCAlZCwgJWQpIiwKLSAgICAgICAgICAgICAgICByYXRlLT5tU3BlZWQsIHJhdGUtPm1QaXRjaCwgcmF0ZS0+bUZhbGxiYWNrTW9kZSwgcmF0ZS0+bVN0cmV0Y2hNb2RlKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiZ2V0UGxheWJhY2tTZXR0aW5ncyByZXR1cm5lZCAlZCIsIHJldCk7Ci0gICAgfQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzJiBzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpIHsKLSAgICBBTE9HVigic2V0U3luY1NldHRpbmdzOiAldSAldSAlZiAlZiIsCi0gICAgICAgICAgICBzeW5jLm1Tb3VyY2UsIHN5bmMubUF1ZGlvQWRqdXN0TW9kZSwgc3luYy5tVG9sZXJhbmNlLCB2aWRlb0Zwc0hpbnQpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QbGF5ZXIgPT0gMCkgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIHJldHVybiBtUGxheWVyLT5zZXRTeW5jU2V0dGluZ3Moc3luYywgdmlkZW9GcHNIaW50KTsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRTeW5jU2V0dGluZ3MoCi0gICAgICAgIEFWU3luY1NldHRpbmdzKiBzeW5jIC8qIG5vbm51bGwgKi8sIGZsb2F0KiB2aWRlb0ZwcyAvKiBub25udWxsICovKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBsYXllciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+Z2V0U3luY1NldHRpbmdzKHN5bmMsIHZpZGVvRnBzKTsKLSAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dWKCJnZXRTeW5jU2V0dGluZ3MoJXUsICV1LCAlZiwgJWYpIiwKLSAgICAgICAgICAgICAgICBzeW5jLT5tU291cmNlLCBzeW5jLT5tQXVkaW9BZGp1c3RNb2RlLCBzeW5jLT5tVG9sZXJhbmNlLCAqdmlkZW9GcHMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dWKCJnZXRTeW5jU2V0dGluZ3MgcmV0dXJuZWQgJWQiLCByZXQpOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotCi19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyMjo6Z2V0VmlkZW9XaWR0aChpbnQgKncpIHsKLSAgICBBTE9HVigiZ2V0VmlkZW9XaWR0aCIpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QbGF5ZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgICp3ID0gbVZpZGVvV2lkdGg7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OmdldFZpZGVvSGVpZ2h0KGludCAqaCkgewotICAgIEFMT0dWKCJnZXRWaWRlb0hlaWdodCIpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QbGF5ZXIgPT0gMCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgICpoID0gbVZpZGVvSGVpZ2h0OwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbXNlYykgewotICAgIEFMT0dWKCJnZXRDdXJyZW50UG9zaXRpb24iKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGxheWVyID09IDApIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBpZiAobUN1cnJlbnRQb3NpdGlvbiA+PSAwKSB7Ci0gICAgICAgIEFMT0dWKCJVc2luZyBjYWNoZWQgc2VlayBwb3NpdGlvbjogJWxsZCIsIChsb25nIGxvbmcpbUN1cnJlbnRQb3NpdGlvbik7Ci0gICAgICAgICptc2VjID0gbUN1cnJlbnRQb3NpdGlvbjsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5nZXRDdXJyZW50UG9zaXRpb24obXNlYyk7Ci0gICAgaWYgKHJldCA9PSBOT19FUlJPUikgewotICAgICAgICBBTE9HVigiZ2V0Q3VycmVudFBvc2l0aW9uID0gJWxsZCIsIChsb25nIGxvbmcpKm1zZWMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJnZXRDdXJyZW50UG9zaXRpb24gcmV0dXJuZWQgJWQiLCByZXQpOwotICAgIH0KLSAgICByZXR1cm4gcmV0OwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OmdldER1cmF0aW9uKGludDY0X3QgKm1zZWMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIEFMT0dWKCJnZXREdXJhdGlvbl9sIik7Ci0gICAgYm9vbCBpc1ZhbGlkU3RhdGUgPSAobUN1cnJlbnRTdGF0ZSAmIChNRURJQV9QTEFZRVIyX1BSRVBBUkVEIHwgTUVESUFfUExBWUVSMl9TVEFSVEVEIHwKLSAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9TVE9QUEVEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkpOwotICAgIGlmIChtUGxheWVyID09IDAgfHwgIWlzVmFsaWRTdGF0ZSkgewotICAgICAgICBBTE9HRSgiQXR0ZW1wdCB0byBjYWxsIGdldER1cmF0aW9uIGluIHdyb25nIHN0YXRlOiBtUGxheWVyPSVwLCBtQ3VycmVudFN0YXRlPSV1IiwKLSAgICAgICAgICAgICAgICBtUGxheWVyLmdldCgpLCBtQ3VycmVudFN0YXRlKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLSAgICBpbnQ2NF90IGR1cmF0aW9uTXM7Ci0gICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uTXMpOwotCi0gICAgaWYgKHJldCA9PSBOT19FUlJPUikgewotICAgICAgICBBTE9HVigiZ2V0RHVyYXRpb24gPSAlbGxkIiwgKGxvbmcgbG9uZylkdXJhdGlvbk1zKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiZ2V0RHVyYXRpb24gcmV0dXJuZWQgJWQiLCByZXQpOwotICAgICAgICAvLyBEbyBub3QgZW50ZXIgZXJyb3Igc3RhdGUganVzdCBiZWNhdXNlIG5vIGR1cmF0aW9uIHdhcyBhdmFpbGFibGUuCi0gICAgICAgIGR1cmF0aW9uTXMgPSAtMTsKLSAgICB9Ci0KLSAgICBpZiAobXNlYykgewotICAgICAgICAqbXNlYyA9IGR1cmF0aW9uTXM7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZWVrVG9fbChpbnQ2NF90IG1zZWMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpIHsKLSAgICBBTE9HVigic2Vla1RvICglbGxkLCAlZCkiLCAobG9uZyBsb25nKW1zZWMsIG1vZGUpOwotICAgIGlmICgobVBsYXllciA9PSAwKSB8fCAhKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9TVEFSVEVEIHwgTUVESUFfUExBWUVSMl9QUkVQQVJFRCB8Ci0gICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8IE1FRElBX1BMQVlFUjJfUExBWUJBQ0tfQ09NUExFVEUpKSkgewotICAgICAgICBBTE9HRSgiQXR0ZW1wdCB0byBwZXJmb3JtIHNlZWtUbyBpbiB3cm9uZyBzdGF0ZTogbVBsYXllcj0lcCwgbUN1cnJlbnRTdGF0ZT0ldSIsCi0gICAgICAgICAgICAgIG1QbGF5ZXIuZ2V0KCksIG1DdXJyZW50U3RhdGUpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIGlmIChtc2VjIDwgMCkgewotICAgICAgICBBTE9HVygiQXR0ZW1wdCB0byBzZWVrIHRvIGludmFsaWQgcG9zaXRpb246ICVsbGQiLCAobG9uZyBsb25nKW1zZWMpOwotICAgICAgICBtc2VjID0gMDsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IGR1cmF0aW9uTXM7Ci0gICAgc3RhdHVzX3QgZXJyID0gbVBsYXllci0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uTXMpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HVygiU3RyZWFtIGhhcyBubyBkdXJhdGlvbiBhbmQgaXMgdGhlcmVmb3JlIG5vdCBzZWVrYWJsZS4iKTsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAobXNlYyA+IGR1cmF0aW9uTXMpIHsKLSAgICAgICAgQUxPR1coIkF0dGVtcHQgdG8gc2VlayB0byBwYXN0IGVuZCBvZiBmaWxlOiByZXF1ZXN0ID0gJWxsZCwgZHVyYXRpb25NcyA9ICVsbGQiLAotICAgICAgICAgICAgICAobG9uZyBsb25nKW1zZWMsIChsb25nIGxvbmcpZHVyYXRpb25Ncyk7Ci0KLSAgICAgICAgbXNlYyA9IGR1cmF0aW9uTXM7Ci0gICAgfQotCi0gICAgLy8gY2FjaGUgZHVyYXRpb24KLSAgICBtQ3VycmVudFBvc2l0aW9uID0gbXNlYzsKLSAgICBtQ3VycmVudFNlZWtNb2RlID0gbW9kZTsKLSAgICBpZiAobVNlZWtQb3NpdGlvbiA8IDApIHsKLSAgICAgICAgbVNlZWtQb3NpdGlvbiA9IG1zZWM7Ci0gICAgICAgIG1TZWVrTW9kZSA9IG1vZGU7Ci0gICAgICAgIHJldHVybiBtUGxheWVyLT5zZWVrVG8obXNlYywgbW9kZSk7Ci0gICAgfQotICAgIEFMT0dWKCJTZWVrIGluIHByb2dyZXNzIC0gcXVldWUgdXAgc2Vla1RvWyVsbGQsICVkXSIsIChsb25nIGxvbmcpbXNlYywgbW9kZSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNlZWtUbyhpbnQ2NF90IG1zZWMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpIHsKLSAgICBtTG9ja1RocmVhZElkID0gZ2V0VGhyZWFkSWQoKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHN0YXR1c190IHJlc3VsdCA9IHNlZWtUb19sKG1zZWMsIG1vZGUpOwotICAgIG1Mb2NrVGhyZWFkSWQgPSAwOwotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBsYXllciAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICByZXR1cm4gbVBsYXllci0+bm90aWZ5QXQobWVkaWFUaW1lVXMpOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnJlc2V0X2woKSB7Ci0gICAgbUxvb3AgPSBmYWxzZTsKLSAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBNRURJQV9QTEFZRVIyX0lETEUpIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICBpZiAobVBsYXllciAhPSAwKSB7Ci0gICAgICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnJlc2V0KCk7Ci0gICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dFKCJyZXNldCgpIGZhaWxlZCB3aXRoIHJldHVybiBjb2RlICglZCkiLCByZXQpOwotICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1I7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUGxheWVyLT5zZXRMaXN0ZW5lcihOVUxMKTsKLSAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX0lETEU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gc2V0RGF0YVNvdXJjZSBoYXMgdG8gYmUgY2FsbGVkIGFnYWluIHRvIGNyZWF0ZSBhCi0gICAgICAgIC8vIG5ldyBtZWRpYXBsYXllci4KLSAgICAgICAgbVBsYXllciA9IDA7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotICAgIGNsZWFyX2woKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyMjo6cmVzZXQoKSB7Ci0gICAgQUxPR1YoInJlc2V0Iik7Ci0gICAgbUxvY2tUaHJlYWRJZCA9IGdldFRocmVhZElkKCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBzdGF0dXNfdCByZXN1bHQgPSByZXNldF9sKCk7Ci0gICAgbUxvY2tUaHJlYWRJZCA9IDA7Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldEF1ZGlvU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHR5cGUpIHsKLSAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRBdWRpb1N0cmVhbVR5cGUiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtU3RyZWFtVHlwZSA9PSB0eXBlKSByZXR1cm4gTk9fRVJST1I7Ci0gICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfCBNRURJQV9QTEFZRVIyX1NUQVJURUQgfAotICAgICAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSApICkgewotICAgICAgICAvLyBDYW4ndCBjaGFuZ2UgdGhlIHN0cmVhbSB0eXBlIGFmdGVyIHByZXBhcmUKLSAgICAgICAgQUxPR0UoInNldEF1ZGlvU3RyZWFtIGNhbGxlZCBpbiBzdGF0ZSAlZCIsIG1DdXJyZW50U3RhdGUpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotICAgIC8vIGNhY2hlCi0gICAgbVN0cmVhbVR5cGUgPSB0eXBlOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpnZXRBdWRpb1N0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCAqdHlwZSkgewotICAgIEFMT0dWKCJnZXRBdWRpb1N0cmVhbVR5cGUiKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICp0eXBlID0gbVN0cmVhbVR5cGU7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldExvb3BpbmcoaW50IGxvb3ApIHsKLSAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRMb29waW5nIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBtTG9vcCA9IChsb29wICE9IDApOwotICAgIGlmIChtUGxheWVyICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1QbGF5ZXItPnNldExvb3BpbmcobG9vcCk7Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotYm9vbCBNZWRpYVBsYXllcjI6OmlzTG9vcGluZygpIHsKLSAgICBBTE9HVigiaXNMb29waW5nIik7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBsYXllciAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtTG9vcDsKLSAgICB9Ci0gICAgQUxPR1YoImlzTG9vcGluZzogbm8gYWN0aXZlIHBsYXllciIpOwotICAgIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRWb2x1bWUoZmxvYXQgbGVmdFZvbHVtZSwgZmxvYXQgcmlnaHRWb2x1bWUpIHsKLSAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRWb2x1bWUoJWYsICVmKSIsIGxlZnRWb2x1bWUsIHJpZ2h0Vm9sdW1lKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1MZWZ0Vm9sdW1lID0gbGVmdFZvbHVtZTsKLSAgICBtUmlnaHRWb2x1bWUgPSByaWdodFZvbHVtZTsKLSAgICBpZiAobUF1ZGlvT3V0cHV0ICE9IDApIHsKLSAgICAgICAgbUF1ZGlvT3V0cHV0LT5zZXRWb2x1bWUobGVmdFZvbHVtZSwgcmlnaHRWb2x1bWUpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyMjo6c2V0QXVkaW9TZXNzaW9uSWQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgewotICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OnNldEF1ZGlvU2Vzc2lvbklkKCVkKSIsIHNlc3Npb25JZCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAoIShtQ3VycmVudFN0YXRlICYgTUVESUFfUExBWUVSMl9JRExFKSkgewotICAgICAgICBBTE9HRSgic2V0QXVkaW9TZXNzaW9uSWQgY2FsbGVkIGluIHN0YXRlICVkIiwgbUN1cnJlbnRTdGF0ZSk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0gICAgaWYgKHNlc3Npb25JZCA8IDApIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgaWYgKHNlc3Npb25JZCAhPSBtQXVkaW9TZXNzaW9uSWQpIHsKLSAgICAgICAgQXVkaW9TeXN0ZW06OmFjcXVpcmVBdWRpb1Nlc3Npb25JZChzZXNzaW9uSWQsIC0xKTsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VBdWRpb1Nlc3Npb25JZChtQXVkaW9TZXNzaW9uSWQsIC0xKTsKLSAgICAgICAgbUF1ZGlvU2Vzc2lvbklkID0gc2Vzc2lvbklkOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLWF1ZGlvX3Nlc3Npb25fdCBNZWRpYVBsYXllcjI6OmdldEF1ZGlvU2Vzc2lvbklkKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1BdWRpb1Nlc3Npb25JZDsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoZmxvYXQgbGV2ZWwpIHsKLSAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRBdXhFZmZlY3RTZW5kTGV2ZWwoJWYpIiwgbGV2ZWwpOwotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbVNlbmRMZXZlbCA9IGxldmVsOwotICAgIGlmIChtQXVkaW9PdXRwdXQgIT0gMCkgewotICAgICAgICByZXR1cm4gbUF1ZGlvT3V0cHV0LT5zZXRBdXhFZmZlY3RTZW5kTGV2ZWwobGV2ZWwpOwotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyMjo6YXR0YWNoQXV4RWZmZWN0KGludCBlZmZlY3RJZCkgewotICAgIEFMT0dWKCJNZWRpYVBsYXllcjI6OmF0dGFjaEF1eEVmZmVjdCglZCkiLCBlZmZlY3RJZCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobUF1ZGlvT3V0cHV0ID09IDAgfHwKLSAgICAgICAgKG1DdXJyZW50U3RhdGUgJiBNRURJQV9QTEFZRVIyX0lETEUpIHx8Ci0gICAgICAgIChtQ3VycmVudFN0YXRlID09IE1FRElBX1BMQVlFUjJfU1RBVEVfRVJST1IgKSkgewotICAgICAgICBBTE9HRSgiYXR0YWNoQXV4RWZmZWN0IGNhbGxlZCBpbiBzdGF0ZSAlZCwgbVBsYXllciglcCkiLCBtQ3VycmVudFN0YXRlLCBtUGxheWVyLmdldCgpKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPmF0dGFjaEF1eEVmZmVjdChlZmZlY3RJZCk7Ci19Ci0KLS8vIGFsd2F5cyBjYWxsIHdpdGggbG9jayBoZWxkCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OmNoZWNrU3RhdGVGb3JLZXlTZXRfbChpbnQga2V5KSB7Ci0gICAgc3dpdGNoKGtleSkgewotICAgIGNhc2UgTUVESUEyX0tFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKLSAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoIE1FRElBX1BMQVlFUjJfUFJFUEFSRUQgfCBNRURJQV9QTEFZRVIyX1NUQVJURUQgfAotICAgICAgICAgICAgICAgIE1FRElBX1BMQVlFUjJfUEFVU0VEIHwgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSkgKSB7Ci0gICAgICAgICAgICAvLyBDYW4ndCBjaGFuZ2UgdGhlIGF1ZGlvIGF0dHJpYnV0ZXMgYWZ0ZXIgcHJlcGFyZQotICAgICAgICAgICAgQUxPR0UoInRyeWluZyB0byBzZXQgYXVkaW8gYXR0cmlidXRlcyBjYWxsZWQgaW4gc3RhdGUgJWQiLCBtQ3VycmVudFN0YXRlKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICAvLyBwYXJhbWV0ZXIgZG9lc24ndCByZXF1aXJlIHBsYXllciBzdGF0ZSBjaGVjawotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OnNldFBhcmFtZXRlcihpbnQga2V5LCBjb25zdCBQYXJjZWwmIHJlcXVlc3QpIHsKLSAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpzZXRQYXJhbWV0ZXIoJWQpIiwga2V5KTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChjaGVja1N0YXRlRm9yS2V5U2V0X2woa2V5KSAhPSBPSykgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBzd2l0Y2ggKGtleSkgewotICAgIGNhc2UgTUVESUEyX0tFWV9QQVJBTUVURVJfQVVESU9fQVRUUklCVVRFUzoKLSAgICAgICAgLy8gc2F2ZSB0aGUgbWFyc2hhbGxlZCBhdWRpbyBhdHRyaWJ1dGVzCi0gICAgICAgIGlmIChtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtQXVkaW9BdHRyaWJ1dGVzUGFyY2VsOwotICAgICAgICB9Ci0gICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgPSBuZXcgUGFyY2VsKCk7Ci0gICAgICAgIG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwtPmFwcGVuZEZyb20oJnJlcXVlc3QsIDAsIHJlcXVlc3QuZGF0YVNpemUoKSk7Ci0gICAgICAgIHN0YXR1cyA9IHNldEF1ZGlvQXR0cmlidXRlc19sKHJlcXVlc3QpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dWX0lGKG1QbGF5ZXIgPT0gTlVMTCwgInNldFBhcmFtZXRlcjogbm8gYWN0aXZlIHBsYXllciIpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAobVBsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1cyA9IG1QbGF5ZXItPnNldFBhcmFtZXRlcihrZXksIHJlcXVlc3QpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBNZWRpYVBsYXllcjI6OmdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7Ci0gICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6Z2V0UGFyYW1ldGVyKCVkKSIsIGtleSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAoa2V5ID09IE1FRElBMl9LRVlfUEFSQU1FVEVSX0FVRElPX0FUVFJJQlVURVMpIHsKLSAgICAgICAgaWYgKHJlcGx5ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXNQYXJjZWwgIT0gTlVMTCkgewotICAgICAgICAgICAgcmVwbHktPmFwcGVuZEZyb20obUF1ZGlvQXR0cmlidXRlc1BhcmNlbCwgMCwgbUF1ZGlvQXR0cmlidXRlc1BhcmNlbC0+ZGF0YVNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmIChtUGxheWVyID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoImdldFBhcmFtZXRlcjogbm8gYWN0aXZlIHBsYXllciIpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gIG1QbGF5ZXItPmdldFBhcmFtZXRlcihrZXksIHJlcGx5KTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dEKCJnZXRQYXJhbWV0ZXIgcmV0dXJucyAlZCIsIHN0YXR1cyk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLWJvb2wgTWVkaWFQbGF5ZXIyOjpzaG91bGREcm9wTWV0YWRhdGEobWVkaWE6Ok1ldGFkYXRhOjpUeXBlIGNvZGUpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7Ci0KLSAgICBpZiAoZmluZE1ldGFkYXRhKG1NZXRhZGF0YURyb3AsIGNvZGUpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChtTWV0YWRhdGFBbGxvdy5pc0VtcHR5KCkgfHwgZmluZE1ldGFkYXRhKG1NZXRhZGF0YUFsbG93LCBjb2RlKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotfQotCi0KLXZvaWQgTWVkaWFQbGF5ZXIyOjphZGROZXdNZXRhZGF0YVVwZGF0ZShtZWRpYTo6TWV0YWRhdGE6OlR5cGUgbWV0YWRhdGFfdHlwZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKLSAgICBpZiAobU1ldGFkYXRhVXBkYXRlZC5pbmRleE9mKG1ldGFkYXRhX3R5cGUpIDwgMCkgewotICAgICAgICBtTWV0YWRhdGFVcGRhdGVkLmFkZChtZXRhZGF0YV90eXBlKTsKLSAgICB9Ci19Ci0KLXZvaWQgTWVkaWFQbGF5ZXIyOjpub3RpZnkoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEsIGludCBleHQyLCBjb25zdCBQYXJjZWwgKm9iaikgewotICAgIEFMT0dWKCJtZXNzYWdlIHJlY2VpdmVkIHNyY0lkPSVsbGQsIG1zZz0lZCwgZXh0MT0lZCwgZXh0Mj0lZCIsCi0gICAgICAgICAgKGxvbmcgbG9uZylzcmNJZCwgbXNnLCBleHQxLCBleHQyKTsKLQotICAgIGlmIChNRURJQTJfSU5GTyA9PSBtc2cgJiYgTUVESUEyX0lORk9fTUVUQURBVEFfVVBEQVRFID09IGV4dDEpIHsKLSAgICAgICAgY29uc3QgbWVkaWE6Ok1ldGFkYXRhOjpUeXBlIG1ldGFkYXRhX3R5cGUgPSBleHQyOwotCi0gICAgICAgIGlmKHNob3VsZERyb3BNZXRhZGF0YShtZXRhZGF0YV90eXBlKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVXBkYXRlIHRoZSBsaXN0IG9mIG1ldGFkYXRhIHRoYXQgaGF2ZSBjaGFuZ2VkLiBnZXRNZXRhZGF0YQotICAgICAgICAvLyBhbHNvIGFjY2VzcyBtTWV0YWRhdGFVcGRhdGVkIGFuZCBjbGVhcnMgaXQuCi0gICAgICAgIGFkZE5ld01ldGFkYXRhVXBkYXRlKG1ldGFkYXRhX3R5cGUpOwotICAgIH0KLQotICAgIGJvb2wgc2VuZCA9IHRydWU7Ci0gICAgYm9vbCBsb2NrZWQgPSBmYWxzZTsKLQotICAgIC8vIFRPRE86IEluIHRoZSBmdXR1cmUsIHdlIG1pZ2h0IGJlIG9uIHRoZSBzYW1lIHRocmVhZCBpZiB0aGUgYXBwIGlzCi0gICAgLy8gcnVubmluZyBpbiB0aGUgc2FtZSBwcm9jZXNzIGFzIHRoZSBtZWRpYSBzZXJ2ZXIuIEluIHRoYXQgY2FzZSwKLSAgICAvLyB0aGlzIHdpbGwgZGVhZGxvY2suCi0gICAgLy8KLSAgICAvLyBUaGUgdGhyZWFkSWQgaGFjayBiZWxvdyB3b3JrcyBhcm91bmQgdGhpcyBmb3IgdGhlIGNhcmUgb2YgcHJlcGFyZSwKLSAgICAvLyBzZWVrVG8sIHN0YXJ0LCBhbmQgcmVzZXQgd2l0aGluIHRoZSBzYW1lIHByb2Nlc3MuCi0gICAgLy8gRklYTUU6IFJlbWVtYmVyLCB0aGlzIGlzIGEgaGFjaywgaXQncyBub3QgZXZlbiBhIGhhY2sgdGhhdCBpcyBhcHBsaWVkCi0gICAgLy8gY29uc2lzdGVudGx5IGZvciBhbGwgdXNlLWNhc2VzLCB0aGlzIG5lZWRzIHRvIGJlIHJldmlzaXRlZC4KLSAgICBpZiAobUxvY2tUaHJlYWRJZCAhPSBnZXRUaHJlYWRJZCgpKSB7Ci0gICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgbG9ja2VkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvLyBBbGxvd3MgY2FsbHMgZnJvbSBKTkkgaW4gaWRsZSBzdGF0ZSB0byBub3RpZnkgZXJyb3JzCi0gICAgaWYgKCEobXNnID09IE1FRElBMl9FUlJPUiAmJiBtQ3VycmVudFN0YXRlID09IE1FRElBX1BMQVlFUjJfSURMRSkgJiYgbVBsYXllciA9PSAwKSB7Ci0gICAgICAgIEFMT0dWKCJub3RpZnkoJWxsZCwgJWQsICVkLCAlZCkgY2FsbGJhY2sgb24gZGlzY29ubmVjdGVkIG1lZGlhcGxheWVyIiwKLSAgICAgICAgICAgICAgKGxvbmcgbG9uZylzcmNJZCwgbXNnLCBleHQxLCBleHQyKTsKLSAgICAgICAgaWYgKGxvY2tlZCkgbUxvY2sudW5sb2NrKCk7ICAgLy8gcmVsZWFzZSB0aGUgbG9jayB3aGVuIGRvbmUuCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKG1zZykgewotICAgIGNhc2UgTUVESUEyX05PUDogLy8gaW50ZXJmYWNlIHRlc3QgbWVzc2FnZQotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1FRElBMl9QUkVQQVJFRDoKLSAgICAgICAgQUxPR1YoIk1lZGlhUGxheWVyMjo6bm90aWZ5KCkgcHJlcGFyZWQiKTsKLSAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IE1FRElBX1BMQVlFUjJfUFJFUEFSRUQ7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTUVESUEyX0RSTV9JTkZPOgotICAgICAgICBBTE9HVigiTWVkaWFQbGF5ZXIyOjpub3RpZnkoKSBNRURJQTJfRFJNX0lORk8oJWxsZCwgJWQsICVkLCAlZCwgJXApIiwKLSAgICAgICAgICAgICAgKGxvbmcgbG9uZylzcmNJZCwgbXNnLCBleHQxLCBleHQyLCBvYmopOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1FRElBMl9QTEFZQkFDS19DT01QTEVURToKLSAgICAgICAgQUxPR1YoInBsYXliYWNrIGNvbXBsZXRlIik7Ci0gICAgICAgIGlmIChtQ3VycmVudFN0YXRlID09IE1FRElBX1BMQVlFUjJfSURMRSkgewotICAgICAgICAgICAgQUxPR0UoInBsYXliYWNrIGNvbXBsZXRlIGluIGlkbGUgc3RhdGUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1Mb29wKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1FRElBMl9FUlJPUjoKLSAgICAgICAgLy8gQWx3YXlzIGxvZyBlcnJvcnMuCi0gICAgICAgIC8vIGV4dDE6IE1lZGlhIGZyYW1ld29yayBlcnJvciBjb2RlLgotICAgICAgICAvLyBleHQyOiBJbXBsZW1lbnRhdGlvbiBkZXBlbmRhbnQgZXJyb3IgY29kZS4KLSAgICAgICAgQUxPR0UoImVycm9yICglZCwgJWQpIiwgZXh0MSwgZXh0Mik7Ci0gICAgICAgIG1DdXJyZW50U3RhdGUgPSBNRURJQV9QTEFZRVIyX1NUQVRFX0VSUk9SOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1FRElBMl9JTkZPOgotICAgICAgICAvLyBleHQxOiBNZWRpYSBmcmFtZXdvcmsgZXJyb3IgY29kZS4KLSAgICAgICAgLy8gZXh0MjogSW1wbGVtZW50YXRpb24gZGVwZW5kYW50IGVycm9yIGNvZGUuCi0gICAgICAgIGlmIChleHQxICE9IE1FRElBMl9JTkZPX1ZJREVPX1RSQUNLX0xBR0dJTkcpIHsKLSAgICAgICAgICAgIEFMT0dXKCJpbmZvL3dhcm5pbmcgKCVkLCAlZCkiLCBleHQxLCBleHQyKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1FRElBMl9TRUVLX0NPTVBMRVRFOgotICAgICAgICBBTE9HVigiUmVjZWl2ZWQgc2VlayBjb21wbGV0ZSIpOwotICAgICAgICBpZiAobVNlZWtQb3NpdGlvbiAhPSBtQ3VycmVudFBvc2l0aW9uIHx8IChtU2Vla01vZGUgIT0gbUN1cnJlbnRTZWVrTW9kZSkpIHsKLSAgICAgICAgICAgIEFMT0dWKCJFeGVjdXRpbmcgcXVldWVkIHNlZWtUbyglbGxkLCAlZCkiLAotICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltQ3VycmVudFBvc2l0aW9uLCBtQ3VycmVudFNlZWtNb2RlKTsKLSAgICAgICAgICAgIG1TZWVrUG9zaXRpb24gPSAtMTsKLSAgICAgICAgICAgIG1TZWVrTW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkM7Ci0gICAgICAgICAgICBzZWVrVG9fbChtQ3VycmVudFBvc2l0aW9uLCBtQ3VycmVudFNlZWtNb2RlKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJBbGwgc2Vla3MgY29tcGxldGUgLSByZXR1cm4gdG8gcmVndWxhcmx5IHNjaGVkdWxlZCBwcm9ncmFtIik7Ci0gICAgICAgICAgICBtQ3VycmVudFBvc2l0aW9uID0gbVNlZWtQb3NpdGlvbiA9IC0xOwotICAgICAgICAgICAgbUN1cnJlbnRTZWVrTW9kZSA9IG1TZWVrTW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkM7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNRURJQTJfQlVGRkVSSU5HX1VQREFURToKLSAgICAgICAgQUxPR1YoImJ1ZmZlcmluZyAlZCIsIGV4dDEpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1FRElBMl9TRVRfVklERU9fU0laRToKLSAgICAgICAgQUxPR1YoIk5ldyB2aWRlbyBzaXplICVkIHggJWQiLCBleHQxLCBleHQyKTsKLSAgICAgICAgbVZpZGVvV2lkdGggPSBleHQxOwotICAgICAgICBtVmlkZW9IZWlnaHQgPSBleHQyOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1FRElBMl9OT1RJRllfVElNRToKLSAgICAgICAgQUxPR1YoIlJlY2VpdmVkIG5vdGlmeSB0aW1lIG1lc3NhZ2UiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNRURJQTJfVElNRURfVEVYVDoKLSAgICAgICAgQUxPR1YoIlJlY2VpdmVkIHRpbWVkIHRleHQgbWVzc2FnZSIpOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1FRElBMl9TVUJUSVRMRV9EQVRBOgotICAgICAgICBBTE9HVigiUmVjZWl2ZWQgc3VidGl0bGUgZGF0YSBtZXNzYWdlIik7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTUVESUEyX01FVEFfREFUQToKLSAgICAgICAgQUxPR1YoIlJlY2VpdmVkIHRpbWVkIG1ldGFkYXRhIG1lc3NhZ2UiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1YoInVucmVjb2duaXplZCBtZXNzYWdlOiAoJWQsICVkLCAlZCkiLCBtc2csIGV4dDEsIGV4dDIpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzcDxNZWRpYVBsYXllcjJMaXN0ZW5lcj4gbGlzdGVuZXIgPSBtTGlzdGVuZXI7Ci0gICAgaWYgKGxvY2tlZCkgbUxvY2sudW5sb2NrKCk7Ci0KLSAgICAvLyB0aGlzIHByZXZlbnRzIHJlLWVudHJhbnQgY2FsbHMgaW50byBjbGllbnQgY29kZQotICAgIGlmICgobGlzdGVuZXIgIT0gMCkgJiYgc2VuZCkgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmeUxvY2spOwotICAgICAgICBBTE9HVigiY2FsbGJhY2sgYXBwbGljYXRpb24iKTsKLSAgICAgICAgbGlzdGVuZXItPm5vdGlmeShzcmNJZCwgbXNnLCBleHQxLCBleHQyLCBvYmopOwotICAgICAgICBBTE9HVigiYmFjayBmcm9tIGNhbGxiYWNrIik7Ci0gICAgfQotfQotCi0vLyBNb2R1bGFyIERSTQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgZHJtU2Vzc2lvbklkKSB7Ci0gICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKLSAgICBBTE9HRCgicHJlcGFyZURybTogdXVpZDogJXAgIGRybVNlc3Npb25JZDogJXAoJXp1KSIsIHV1aWQsCi0gICAgICAgICAgICBkcm1TZXNzaW9uSWQuYXJyYXkoKSwgZHJtU2Vzc2lvbklkLnNpemUoKSk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZiAobVBsYXllciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIC8vIE9ubHkgYWxsb3dlZCBpdCBpbiBwbGF5ZXIncyBwcmVwYXJpbmcvcHJlcGFyZWQgc3RhdGUuCi0gICAgLy8gV2UgZ2V0IGhlcmUgb25seSBpZiBNRURJQV9EUk1fSU5GTyBoYXMgYWxyZWFkeSBhcnJpdmVkIChlLmcuLCBwcmVwYXJlIGlzIGhhbGYtd2F5IHRocm91Z2ggb3IKLSAgICAvLyBjb21wbGV0ZWQpIHNvIHRoZSBzdGF0ZSBjaGFuZ2UgdG8gInByZXBhcmVkIiBtaWdodCBub3QgaGF2ZSBoYXBwZW5lZCB5ZXQgKGUuZy4sIGJ1ZmZlcmluZykuCi0gICAgLy8gU3RpbGwsIHdlIGNhbiBhbGxvdyBwcmVwYXJlRHJtIGZvciB0aGUgdXNlIGNhc2Ugb2YgYmVpbmcgY2FsbGVkIGluIE9uRHJtSW5mb0xpc3RlbmVyLgotICAgIGlmICghKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9QUkVQQVJJTkcgfCBNRURJQV9QTEFZRVIyX1BSRVBBUkVEKSkpIHsKLSAgICAgICAgQUxPR0UoInByZXBhcmVEcm0gaXMgY2FsbGVkIGluIHRoZSB3cm9uZyBzdGF0ZSAoJWQpLiIsIG1DdXJyZW50U3RhdGUpOwotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgaWYgKGRybVNlc3Npb25JZC5pc0VtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoInByZXBhcmVEcm06IFVuZXhwZWN0ZWQuIENhbid0IHByb2NlZWQgd2l0aCBjcnlwdG8uIEVtcHR5IGRybVNlc3Npb25JZC4iKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIC8vIFBhc3NpbmcgZG93biB0byBtZWRpYXNlcnZlciBtYWlubHkgZm9yIGNyZWF0aW5nIHRoZSBjcnlwdG8KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGxheWVyLT5wcmVwYXJlRHJtKHV1aWQsIGRybVNlc3Npb25JZCk7Ci0gICAgQUxPR0VfSUYoc3RhdHVzICE9IE9LLCAicHJlcGFyZURybTogRmFpbGVkIGF0IG1lZGlhc2VydmVyIHdpdGggcmV0OiAlZCIsIHN0YXR1cyk7Ci0KLSAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgotICAgIEFMT0dEKCJwcmVwYXJlRHJtOiBtZWRpYXNlcnZlcjo6cHJlcGFyZURybSByZXQ9JWQiLCBzdGF0dXMpOwotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpyZWxlYXNlRHJtKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QbGF5ZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTk9fSU5JVDsKLSAgICB9Ci0KLSAgICAvLyBOb3QgYWxsb3dpbmcgcmVsZWFzZURybSBpbiBhbiBhY3RpdmUvcmVzdW1hYmxlIHN0YXRlCi0gICAgaWYgKG1DdXJyZW50U3RhdGUgJiAoTUVESUFfUExBWUVSMl9TVEFSVEVEIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9QTEFZRVIyX1BBVVNFRCB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfUExBWUVSMl9QTEFZQkFDS19DT01QTEVURSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfUExBWUVSMl9TVEFURV9FUlJPUikpIHsKLSAgICAgICAgQUxPR0UoInJlbGVhc2VEcm0gVW5leHBlY3RlZCBzdGF0ZSAlZC4gQ2FuIG9ubHkgYmUgY2FsbGVkIGluIHN0b3BwZWQvaWRsZS4iLCBtQ3VycmVudFN0YXRlKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHN0YXR1c190IHN0YXR1cyA9IG1QbGF5ZXItPnJlbGVhc2VEcm0oKTsKLSAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgotICAgIEFMT0dEKCJyZWxlYXNlRHJtOiBtZWRpYXNlcnZlcjo6cmVsZWFzZURybSByZXQ6ICVkIiwgc3RhdHVzKTsKLSAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJyZWxlYXNlRHJtOiBGYWlsZWQgYXQgbWVkaWFzZXJ2ZXIgd2l0aCByZXQ6ICVkIiwgc3RhdHVzKTsKLSAgICAgICAgLy8gT3ZlcnJpZGluZyB0byBPSyBzbyB0aGUgY2xpZW50IHByb2NlZWQgd2l0aCBpdHMgb3duIGNsZWFudXAKLSAgICAgICAgLy8gQ2xpZW50IGNhbid0IGRvIG1vcmUgY2xlYW51cC4gbWVkaWFzZXJ2ZXIgcmVsZWFzZSBpdHMgY3J5cHRvIGF0IGVuZCBvZiBzZXNzaW9uIGFueXdheS4KLSAgICAgICAgc3RhdHVzID0gT0s7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjpzZXRPdXRwdXREZXZpY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1BdWRpb091dHB1dCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2U6IGF1ZGlvIHNpbmsgbm90IGluaXQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPnNldE91dHB1dERldmljZShkZXZpY2VJZCk7Ci19Ci0KLWF1ZGlvX3BvcnRfaGFuZGxlX3QgTWVkaWFQbGF5ZXIyOjpnZXRSb3V0ZWREZXZpY2VJZCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtQXVkaW9PdXRwdXQgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiZ2V0Um91dGVkRGV2aWNlSWQ6IGF1ZGlvIHNpbmsgbm90IGluaXQiKTsKLSAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfSEFORExFX05PTkU7Ci0gICAgfQotICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQ7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvT3V0cHV0LT5nZXRSb3V0ZWREZXZpY2VJZCgmZGV2aWNlSWQpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1BPUlRfSEFORExFX05PTkU7Ci0gICAgfQotICAgIHJldHVybiBkZXZpY2VJZDsKLX0KLQotc3RhdHVzX3QgTWVkaWFQbGF5ZXIyOjplbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1BdWRpb091dHB1dCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJhZGRBdWRpb0RldmljZUNhbGxiYWNrOiBwbGF5ZXIgbm90IGluaXQiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotICAgIHJldHVybiBtQXVkaW9PdXRwdXQtPmVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soZW5hYmxlZCk7Ci19Ci0KLXN0YXR1c190IE1lZGlhUGxheWVyMjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLSAgICByZXN1bHQuYXBwZW5kKCIgTWVkaWFQbGF5ZXIyXG4iKTsKLSAgICBzbnByaW50ZihidWZmZXIsIDI1NSwgIiAgcGlkKCVkKSwgbG9vcGluZyglcylcbiIsIG1QaWQsIG1Mb29wPyJ0cnVlIjogImZhbHNlIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgc3A8TWVkaWFQbGF5ZXIySW50ZXJmYWNlPiBwbGF5ZXI7Ci0gICAgc3A8TWVkaWFQbGF5ZXIyQXVkaW9PdXRwdXQ+IGF1ZGlvT3V0cHV0OwotICAgIGJvb2wgbG9ja2VkID0gZmFsc2U7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRHVtcExvY2tSZXRyaWVzOyArK2kpIHsKLSAgICAgICAgaWYgKG1Mb2NrLnRyeUxvY2soKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHVzbGVlcChrRHVtcExvY2tTbGVlcFVzKTsKLSAgICB9Ci0KLSAgICBpZiAobG9ja2VkKSB7Ci0gICAgICAgIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGF1ZGlvT3V0cHV0ID0gbUF1ZGlvT3V0cHV0OwotICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQuYXBwZW5kKCIgIGxvY2sgaXMgdGFrZW4sIG5vIGR1bXAgZnJvbSBwbGF5ZXIgYW5kIGF1ZGlvIG91dHB1dFxuIik7Ci0gICAgfQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotCi0gICAgaWYgKHBsYXllciAhPSBOVUxMKSB7Ci0gICAgICAgIHBsYXllci0+ZHVtcChmZCwgYXJncyk7Ci0gICAgfQotICAgIGlmIChhdWRpb091dHB1dCAhPSAwKSB7Ci0gICAgICAgIGF1ZGlvT3V0cHV0LT5kdW1wKGZkLCBhcmdzKTsKLSAgICB9Ci0gICAgd3JpdGUoZmQsICJcbiIsIDEpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjNhYWQyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xLDY2ICswLDAgQEAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLQotICAgIHNyY3M6IFsKLSAgICAgICAgIkpXYWtlTG9jay5jcHAiLAotICAgICAgICAiR2VuZXJpY1NvdXJjZTIuY3BwIiwKLSAgICAgICAgIkhUVFBMaXZlU291cmNlMi5jcHAiLAotICAgICAgICAiTnVQbGF5ZXIyLmNwcCIsCi0gICAgICAgICJOdVBsYXllcjJDQ0RlY29kZXIuY3BwIiwKLSAgICAgICAgIk51UGxheWVyMkRlY29kZXIuY3BwIiwKLSAgICAgICAgIk51UGxheWVyMkRlY29kZXJCYXNlLmNwcCIsCi0gICAgICAgICJOdVBsYXllcjJEZWNvZGVyUGFzc1Rocm91Z2guY3BwIiwKLSAgICAgICAgIk51UGxheWVyMkRyaXZlci5jcHAiLAotICAgICAgICAiTnVQbGF5ZXIyRHJtLmNwcCIsCi0gICAgICAgICJOdVBsYXllcjJSZW5kZXJlci5jcHAiLAotICAgICAgICAiUlRTUFNvdXJjZTIuY3BwIiwKLSAgICBdLAotCi0gICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCi0gICAgICAgICJsaWJtZWRpYXBsYXllcjJfaGVhZGVycyIsCi0gICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCi0gICAgXSwKLQotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0IiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV2Vycm9yIiwKLSAgICAgICAgIi1XYWxsIiwKLSAgICBdLAotCi0gICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKLSAgICAgICAgZGVidWdnYWJsZTogewotICAgICAgICAgICAgY2ZsYWdzOiBbCi0gICAgICAgICAgICAgICAgIi1ERU5BQkxFX1NUQUdFRlJJR0hUX0VYUEVSSU1FTlRTIiwKLSAgICAgICAgICAgIF0sCi0gICAgICAgIH0KLSAgICB9LAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgICAgICJsaWJ1aSIsCi0gICAgICAgICJsaWJndWkiLAotICAgICAgICAibGlibWVkaWEiLAotICAgICAgICAibGlibWVkaWFkcm0iLAotICAgICAgICAibGlibWVkaWFuZGsiLAotICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKLSAgICBdLAotCi0gICAgc3RhdGljX2xpYnM6IFsKLSAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCi0gICAgXSwKLQotICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9udXBsYXllcjIiLAotCi0gICAgc2FuaXRpemU6IHsKLSAgICAgICAgY2ZpOiB0cnVlLAotICAgIH0sCi0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NmIxMDMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNjE1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiR2VuZXJpY1NvdXJjZTIiCi0KLSNpbmNsdWRlICJHZW5lcmljU291cmNlMi5oIgotI2luY2x1ZGUgIk51UGxheWVyMkRybS5oIgotCi0jaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUJ1ZmZlckhvbGRlci5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3RvclNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL05ka1dyYXBwZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OZGtVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0jaW5jbHVkZSAiLi4vLi4vbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCIKLSNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIGNvbnN0IGludCBrSW5pdGlhbE1hcmtNcyAgICAgICAgPSA1MDAwOyAgLy8gNXNlY3MKLQotLy9zdGF0aWMgY29uc3QgaW50IGtQYXVzZVBsYXliYWNrTWFya01zICA9IDIwMDA7ICAvLyAyc2Vjcwotc3RhdGljIGNvbnN0IGludCBrUmVzdW1lUGxheWJhY2tNYXJrTXMgPSAxNTAwMDsgIC8vIDE1c2VjcwotCi1OdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpHZW5lcmljU291cmNlMigKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2spCi0gICAgOiBTb3VyY2Uobm90aWZ5KSwKLSAgICAgIG1BdWRpb1RpbWVVcygwKSwKLSAgICAgIG1BdWRpb0xhc3REZXF1ZXVlVGltZVVzKDApLAotICAgICAgbVZpZGVvVGltZVVzKDApLAotICAgICAgbVZpZGVvTGFzdERlcXVldWVUaW1lVXMoMCksCi0gICAgICBtUHJldkJ1ZmZlclBlcmNlbnRhZ2UoLTEpLAotICAgICAgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uKDApLAotICAgICAgbVNlbnRQYXVzZU9uQnVmZmVyaW5nKGZhbHNlKSwKLSAgICAgIG1BdWRpb0RhdGFHZW5lcmF0aW9uKDApLAotICAgICAgbVZpZGVvRGF0YUdlbmVyYXRpb24oMCksCi0gICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKDApLAotICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24oMCksCi0gICAgICBtRHVyYXRpb25VcygtMWxsKSwKLSAgICAgIG1BdWRpb0lzVm9yYmlzKGZhbHNlKSwKLSAgICAgIG1Jc1NlY3VyZShmYWxzZSksCi0gICAgICBtSXNTdHJlYW1pbmcoZmFsc2UpLAotICAgICAgbVVJRCh1aWQpLAotICAgICAgbU1lZGlhQ2xvY2sobWVkaWFDbG9jayksCi0gICAgICBtRmQoLTEpLAotICAgICAgbUJpdHJhdGUoLTFsbCksCi0gICAgICBtUGVuZGluZ1JlYWRCdWZmZXJUeXBlcygwKSB7Ci0gICAgQUxPR1YoIkdlbmVyaWNTb3VyY2UyIik7Ci0gICAgQ0hFQ0sobWVkaWFDbG9jayAhPSBOVUxMKTsKLQotICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tSW5pdGlhbE1hcmtNcyA9IGtJbml0aWFsTWFya01zOwotICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgPSBrUmVzdW1lUGxheWJhY2tNYXJrTXM7Ci0gICAgcmVzZXREYXRhU291cmNlKCk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6cmVzZXREYXRhU291cmNlKCkgewotICAgIEFMT0dWKCJyZXNldERhdGFTb3VyY2UiKTsKLQotICAgIG1IVFRQU2VydmljZS5jbGVhcigpOwotICAgIG1IdHRwU291cmNlLmNsZWFyKCk7Ci0gICAgbURpc2Nvbm5lY3RlZCA9IGZhbHNlOwotICAgIG1VcmkuY2xlYXIoKTsKLSAgICBtVXJpSGVhZGVycy5jbGVhcigpOwotICAgIGlmIChtRmQgPj0gMCkgewotICAgICAgICBjbG9zZShtRmQpOwotICAgICAgICBtRmQgPSAtMTsKLSAgICB9Ci0gICAgbU9mZnNldCA9IDA7Ci0gICAgbUxlbmd0aCA9IDA7Ci0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICBtUHJlcGFyaW5nID0gZmFsc2U7Ci0KLSAgICBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKLSAgICBtSXNEcm1SZWxlYXNlZCA9IGZhbHNlOwotICAgIG1Jc1NlY3VyZSA9IGZhbHNlOwotICAgIG1NaW1lcy5jbGVhcigpOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCi0gICAgICAgIGNvbnN0IGNoYXIgKnVybCwKLSAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIEFMT0dWKCJzZXREYXRhU291cmNlIHVybDogJXMiLCB1cmwpOwotCi0gICAgcmVzZXREYXRhU291cmNlKCk7Ci0KLSAgICBtSFRUUFNlcnZpY2UgPSBodHRwU2VydmljZTsKLSAgICBtVXJpID0gdXJsOwotCi0gICAgaWYgKGhlYWRlcnMpIHsKLSAgICAgICAgbVVyaUhlYWRlcnMgPSAqaGVhZGVyczsKLSAgICB9Ci0KLSAgICAvLyBkZWxheSBkYXRhIHNvdXJjZSBjcmVhdGlvbiB0byBwcmVwYXJlQXN5bmMoKSB0byBhdm9pZCBibG9ja2luZwotICAgIC8vIHRoZSBjYWxsaW5nIHRocmVhZCBpbiBzZXREYXRhU291cmNlIGZvciBhbnkgc2lnbmlmaWNhbnQgdGltZS4KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBBTE9HVigic2V0RGF0YVNvdXJjZSAlZC8lbGxkLyVsbGQiLCBmZCwgKGxvbmcgbG9uZylvZmZzZXQsIChsb25nIGxvbmcpbGVuZ3RoKTsKLQotICAgIHJlc2V0RGF0YVNvdXJjZSgpOwotCi0gICAgbUZkID0gZHVwKGZkKTsKLSAgICBtT2Zmc2V0ID0gb2Zmc2V0OwotICAgIG1MZW5ndGggPSBsZW5ndGg7Ci0KLSAgICAvLyBkZWxheSBkYXRhIHNvdXJjZSBjcmVhdGlvbiB0byBwcmVwYXJlQXN5bmMoKSB0byBhdm9pZCBibG9ja2luZwotICAgIC8vIHRoZSBjYWxsaW5nIHRocmVhZCBpbiBzZXREYXRhU291cmNlIGZvciBhbnkgc2lnbmlmaWNhbnQgdGltZS4KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIHNvdXJjZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgQUxPR1YoInNldERhdGFTb3VyY2UgKHNvdXJjZTogJXApIiwgc291cmNlLmdldCgpKTsKLQotICAgIHJlc2V0RGF0YVNvdXJjZSgpOwotICAgIG1EYXRhU291cmNlID0gc291cmNlOwotICAgIHJldHVybiBPSzsKLX0KLQotc3A8TWV0YURhdGE+IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmdldEZpbGVGb3JtYXRNZXRhKCkgY29uc3QgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIG1GaWxlTWV0YTsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6aW5pdEZyb21EYXRhU291cmNlKCkgewotICAgIG1FeHRyYWN0b3IgPSBuZXcgQU1lZGlhRXh0cmFjdG9yV3JhcHBlcihBTWVkaWFFeHRyYWN0b3JfbmV3KCkpOwotICAgIENIRUNLKG1EYXRhU291cmNlICE9IE5VTEwgfHwgbUZkICE9IC0xKTsKLSAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gbURhdGFTb3VyY2U7Ci0gICAgY29uc3QgaW50IGZkID0gbUZkOwotICAgIGNvbnN0IGludDY0X3Qgb2Zmc2V0ID0gbU9mZnNldDsKLSAgICBjb25zdCBpbnQ2NF90IGxlbmd0aCA9IG1MZW5ndGg7Ci0KLSAgICBtTG9jay51bmxvY2soKTsKLSAgICAvLyBUaGlzIG1pZ2h0IHRha2UgbG9uZyB0aW1lIGlmIGRhdGEgc291cmNlIGlzIG5vdCByZWxpYWJsZS4KLSAgICBzdGF0dXNfdCBlcnI7Ci0gICAgaWYgKGRhdGFTb3VyY2UgIT0gbnVsbHB0cikgewotICAgICAgICBtRGF0YVNvdXJjZVdyYXBwZXIgPSBuZXcgQU1lZGlhRGF0YVNvdXJjZVdyYXBwZXIoZGF0YVNvdXJjZSk7Ci0gICAgICAgIGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UobURhdGFTb3VyY2VXcmFwcGVyLT5nZXRBTWVkaWFEYXRhU291cmNlKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IG1FeHRyYWN0b3ItPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJpbml0RnJvbURhdGFTb3VyY2UsIGZhaWxlZCB0byBjcmVhdGUgZGF0YSBzb3VyY2UhIik7Ci0gICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgc2l6ZV90IG51bXRyYWNrcyA9IG1FeHRyYWN0b3ItPmdldFRyYWNrQ291bnQoKTsKLSAgICBpZiAobnVtdHJhY2tzID09IDApIHsKLSAgICAgICAgQUxPR0UoImluaXRGcm9tRGF0YVNvdXJjZSwgc291cmNlIGhhcyBubyB0cmFjayEiKTsKLSAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBtTG9jay5sb2NrKCk7Ci0gICAgbUZkID0gLTE7Ci0gICAgbURhdGFTb3VyY2UgPSBkYXRhU291cmNlOwotICAgIG1GaWxlTWV0YSA9IGNvbnZlcnRNZWRpYUZvcm1hdFdyYXBwZXJUb01ldGFEYXRhKG1FeHRyYWN0b3ItPmdldEZvcm1hdCgpKTsKLSAgICBpZiAobUZpbGVNZXRhICE9IE5VTEwpIHsKLSAgICAgICAgaW50NjRfdCBkdXJhdGlvbjsKLSAgICAgICAgaWYgKG1GaWxlTWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSkgewotICAgICAgICAgICAgbUR1cmF0aW9uVXMgPSBkdXJhdGlvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludDMyX3QgdG90YWxCaXRyYXRlID0gMDsKLQotICAgIG1NaW1lcy5jbGVhcigpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3M7ICsraSkgewotCi0gICAgICAgIHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+IHRyYWNrRm9ybWF0ID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2tGb3JtYXQoaSk7Ci0gICAgICAgIGlmICh0cmFja0Zvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgibm8gbWV0YWRhdGEgZm9yIHRyYWNrICV6dSIsIGkpOwotICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICBzcDxBTWVkaWFFeHRyYWN0b3JXcmFwcGVyPiB0cmFja0V4dHJhY3RvciA9IG5ldyBBTWVkaWFFeHRyYWN0b3JXcmFwcGVyKEFNZWRpYUV4dHJhY3Rvcl9uZXcoKSk7Ci0gICAgICAgIGlmIChtRGF0YVNvdXJjZVdyYXBwZXIgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgZXJyID0gdHJhY2tFeHRyYWN0b3ItPnNldERhdGFTb3VyY2UobURhdGFTb3VyY2VXcmFwcGVyLT5nZXRBTWVkaWFEYXRhU291cmNlKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZXJyID0gdHJhY2tFeHRyYWN0b3ItPnNldERhdGFTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gY29udmVydE1lZGlhRm9ybWF0V3JhcHBlclRvTWV0YURhdGEodHJhY2tGb3JtYXQpOwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0KLSAgICAgICAgQUxPR1YoImluaXRGcm9tRGF0YVNvdXJjZSB0cmFja1slenVdOiAlcyIsIGksIG1pbWUpOwotCi0gICAgICAgIC8vIERvIHRoZSBzdHJpbmcgY29tcGFyZSBpbW1lZGlhdGVseSB3aXRoICJtaW1lIiwKLSAgICAgICAgLy8gd2UgY2FuJ3QgYXNzdW1lICJtaW1lIiB3b3VsZCBzdGF5IHZhbGlkIGFmdGVyIGFub3RoZXIKLSAgICAgICAgLy8gZXh0cmFjdG9yIG9wZXJhdGlvbiwgc29tZSBleHRyYWN0b3JzIG1pZ2h0IG1vZGlmeSBtZXRhCi0gICAgICAgIC8vIGR1cmluZyBnZXRUcmFjaygpIGFuZCBtYWtlIGl0IGludmFsaWQuCi0gICAgICAgIGlmICghc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpKSB7Ci0gICAgICAgICAgICBpZiAobUF1ZGlvVHJhY2subUV4dHJhY3RvciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2subUluZGV4ID0gaTsKLSAgICAgICAgICAgICAgICBtQXVkaW9UcmFjay5tRXh0cmFjdG9yID0gdHJhY2tFeHRyYWN0b3I7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2subUV4dHJhY3Rvci0+c2VsZWN0VHJhY2soaSk7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2subVBhY2tldHMgPSBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShtZXRhKTsKLQotICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BdWRpb0lzVm9yYmlzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtQXVkaW9Jc1ZvcmJpcyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1NaW1lcy5hZGQoU3RyaW5nOChtaW1lKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KSkgewotICAgICAgICAgICAgaWYgKG1WaWRlb1RyYWNrLm1FeHRyYWN0b3IgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrLm1JbmRleCA9IGk7Ci0gICAgICAgICAgICAgICAgbVZpZGVvVHJhY2subUV4dHJhY3RvciA9IHRyYWNrRXh0cmFjdG9yOwotICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrLm1FeHRyYWN0b3ItPnNlbGVjdFRyYWNrKGkpOwotICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrLm1QYWNrZXRzID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobWV0YSk7Ci0KLSAgICAgICAgICAgICAgICAvLyB2aWRlbyBhbHdheXMgYXQgdGhlIGJlZ2lubmluZwotICAgICAgICAgICAgICAgIG1NaW1lcy5pbnNlcnRBdChTdHJpbmc4KG1pbWUpLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIG1FeHRyYWN0b3JzLnB1c2godHJhY2tFeHRyYWN0b3IpOwotICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7Ci0gICAgICAgIGlmIChtZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKLSAgICAgICAgICAgIGlmIChkdXJhdGlvblVzID4gbUR1cmF0aW9uVXMpIHsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQzMl90IGJpdHJhdGU7Ci0gICAgICAgIGlmICh0b3RhbEJpdHJhdGUgPj0gMCAmJiBtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZiaXRyYXRlKSkgewotICAgICAgICAgICAgdG90YWxCaXRyYXRlICs9IGJpdHJhdGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0b3RhbEJpdHJhdGUgPSAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dWKCJpbml0RnJvbURhdGFTb3VyY2UgbUV4dHJhY3RvcnMuc2l6ZSgpOiAlenUgIG1Jc1NlY3VyZTogJWQgIG1pbWVbMF06ICVzIiwgbUV4dHJhY3RvcnMuc2l6ZSgpLAotICAgICAgICAgICAgbUlzU2VjdXJlLCAobU1pbWVzLmlzRW1wdHkoKSA/ICJOT05FIiA6IG1NaW1lc1swXS5zdHJpbmcoKSkpOwotCi0gICAgaWYgKG1FeHRyYWN0b3JzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJiLzIzNzA1Njk1Iik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIC8vIE1vZHVsYXIgRFJNOiBUaGUgcmV0dXJuIHZhbHVlIGRvZXNuJ3QgYWZmZWN0IHNvdXJjZSBpbml0aWFsaXphdGlvbi4KLSAgICAodm9pZCljaGVja0RybUluZm8oKTsKLQotICAgIG1CaXRyYXRlID0gdG90YWxCaXRyYXRlOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpnZXRCdWZmZXJpbmdTZXR0aW5ncygKLSAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSB7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICAqYnVmZmVyaW5nID0gbUJ1ZmZlcmluZ1NldHRpbmdzOwotICAgIH0KLQotICAgIEFMT0dWKCJnZXRCdWZmZXJpbmdTZXR0aW5nc3slc30iLCBidWZmZXJpbmctPnRvU3RyaW5nKCkuc3RyaW5nKCkpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6c2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgewotICAgIEFMT0dWKCJzZXRCdWZmZXJpbmdTZXR0aW5nc3slc30iLCBidWZmZXJpbmcudG9TdHJpbmcoKS5zdHJpbmcoKSk7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1CdWZmZXJpbmdTZXR0aW5ncyA9IGJ1ZmZlcmluZzsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLWludDY0X3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6Z2V0TGFzdFJlYWRQb3NpdGlvbigpIHsKLSAgICBpZiAobUF1ZGlvVHJhY2subUV4dHJhY3RvciAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBtQXVkaW9UaW1lVXM7Ci0gICAgfSBlbHNlIGlmIChtVmlkZW9UcmFjay5tRXh0cmFjdG9yICE9IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIG1WaWRlb1RpbWVVczsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLWJvb2wgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6aXNTdHJlYW1pbmcoKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbUlzU3RyZWFtaW5nOwotfQotCi1OdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjp+R2VuZXJpY1NvdXJjZTIoKSB7Ci0gICAgQUxPR1YoIn5HZW5lcmljU291cmNlMiIpOwotICAgIGlmIChtTG9vcGVyICE9IE5VTEwpIHsKLSAgICAgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7Ci0gICAgICAgIG1Mb29wZXItPnN0b3AoKTsKLSAgICB9Ci0gICAgaWYgKG1EYXRhU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbURhdGFTb3VyY2UtPmNsb3NlKCk7Ci0gICAgfQotICAgIHJlc2V0RGF0YVNvdXJjZSgpOwotfQotCi12b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnByZXBhcmVBc3luYygpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIEFMT0dWKCJwcmVwYXJlQXN5bmM6IChsb29wZXI6ICVkKSIsIChtTG9vcGVyICE9IE5VTEwpKTsKLQotICAgIGlmIChtTG9vcGVyID09IE5VTEwpIHsKLSAgICAgICAgbUxvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgICAgICBtTG9vcGVyLT5zZXROYW1lKCJnZW5lcmljIik7Ci0gICAgICAgIG1Mb29wZXItPnN0YXJ0KGZhbHNlLCAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8qIGNhbkNhbGxKYXZhICovCi0gICAgICAgICAgICAgICAgICAgICAgIFBSSU9SSVRZX0RFRkFVTFQpOwotCi0gICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKLSAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UHJlcGFyZUFzeW5jLCB0aGlzKTsKLSAgICBtc2ctPnBvc3QoKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpvblByZXBhcmVBc3luYygpIHsKLSAgICBBTE9HVigib25QcmVwYXJlQXN5bmM6IG1EYXRhU291cmNlOiAlZCIsIChtRGF0YVNvdXJjZSAhPSBOVUxMKSk7Ci0KLSAgICAvLyBkZWxheWVkIGRhdGEgc291cmNlIGNyZWF0aW9uCi0gICAgaWYgKG1EYXRhU291cmNlID09IE5VTEwpIHsKLSAgICAgICAgLy8gc2V0IHRvIGZhbHNlIGZpcnN0LCBpZiB0aGUgZXh0cmFjdG9yCi0gICAgICAgIC8vIGNvbWVzIGJhY2sgYXMgc2VjdXJlLCBzZXQgaXQgdG8gdHJ1ZSB0aGVuLgotICAgICAgICBtSXNTZWN1cmUgPSBmYWxzZTsKLQotICAgICAgICBpZiAoIW1VcmkuZW1wdHkoKSkgewotICAgICAgICAgICAgY29uc3QgY2hhciogdXJpID0gbVVyaS5jX3N0cigpOwotICAgICAgICAgICAgU3RyaW5nOCBjb250ZW50VHlwZTsKLQotICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVyaSwgNykgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIHVyaSwgOCkpIHsKLSAgICAgICAgICAgICAgICBtSHR0cFNvdXJjZSA9IERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVNZWRpYUhUVFAobUhUVFBTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICBpZiAobUh0dHBTb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBodHRwIHNvdXJjZSEiKTsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKFVOS05PV05fRVJST1IpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIC8vIFRoaXMgbWlnaHQgdGFrZSBsb25nIHRpbWUgaWYgY29ubmVjdGlvbiBoYXMgc29tZSBpc3N1ZS4KLSAgICAgICAgICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlRnJvbVVSSSgKLSAgICAgICAgICAgICAgICAgICBtSFRUUFNlcnZpY2UsIHVyaSwgJm1VcmlIZWFkZXJzLCAmY29udGVudFR5cGUsCi0gICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4obUh0dHBTb3VyY2UuZ2V0KCkpKTsKLSAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgIGlmICghbURpc2Nvbm5lY3RlZCkgewotICAgICAgICAgICAgICAgIG1EYXRhU291cmNlID0gZGF0YVNvdXJjZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRmQgPT0gLTEgJiYgbURhdGFTb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgZGF0YSBzb3VyY2UhIik7Ci0gICAgICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoVU5LTk9XTl9FUlJPUik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobURhdGFTb3VyY2UgIT0gbnVsbHB0ciAmJiBtRGF0YVNvdXJjZS0+ZmxhZ3MoKSAmIERhdGFTb3VyY2U6OmtJc0NhY2hpbmdEYXRhU291cmNlKSB7Ci0gICAgICAgIG1DYWNoZWRTb3VyY2UgPSBzdGF0aWNfY2FzdDxOdUNhY2hlZFNvdXJjZTIgKj4obURhdGFTb3VyY2UuZ2V0KCkpOwotICAgIH0KLQotICAgIC8vIEZvciBjYWNoZWQgc3RyZWFtaW5nIGNhc2VzLCB3ZSBuZWVkIHRvIHdhaXQgZm9yIGVub3VnaAotICAgIC8vIGJ1ZmZlcmluZyBiZWZvcmUgcmVwb3J0aW5nIHByZXBhcmVkLgotICAgIG1Jc1N0cmVhbWluZyA9IChtQ2FjaGVkU291cmNlICE9IE5VTEwpOwotCi0gICAgLy8gaW5pdCBleHRyYWN0b3IgZnJvbSBkYXRhIHNvdXJjZQotICAgIHN0YXR1c190IGVyciA9IGluaXRGcm9tRGF0YVNvdXJjZSgpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluaXQgZnJvbSBkYXRhIHNvdXJjZSEiKTsKLSAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKGVycik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobVZpZGVvVHJhY2subUV4dHJhY3RvciAhPSBOVUxMKSB7Ci0gICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZ2V0Rm9ybWF0TWV0YV9sKGZhbHNlIC8qIGF1ZGlvICovKTsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgZXJyID0gY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKG1ldGEsICZtc2cpOwotICAgICAgICBpZihlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChlcnIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQobXNnKTsKLSAgICB9Ci0KLSAgICBub3RpZnlGbGFnc0NoYW5nZWQoCi0gICAgICAgICAgICAvLyBGTEFHX1NFQ1VSRSB3aWxsIGJlIGtub3duIGlmL3doZW4gcHJlcGFyZURybSBpcyBjYWxsZWQgYnkgdGhlIGFwcAotICAgICAgICAgICAgLy8gRkxBR19QUk9URUNURUQgd2lsbCBiZSBrbm93biBpZi93aGVuIHByZXBhcmVEcm0gaXMgY2FsbGVkIGJ5IHRoZSBhcHAKLSAgICAgICAgICAgIEZMQUdfQ0FOX1BBVVNFIHwKLSAgICAgICAgICAgIEZMQUdfQ0FOX1NFRUtfQkFDS1dBUkQgfAotICAgICAgICAgICAgRkxBR19DQU5fU0VFS19GT1JXQVJEIHwKLSAgICAgICAgICAgIEZMQUdfQ0FOX1NFRUspOwotCi0gICAgZmluaXNoUHJlcGFyZUFzeW5jKCk7Ci0KLSAgICBBTE9HVigib25QcmVwYXJlQXN5bmM6IERvbmUiKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpmaW5pc2hQcmVwYXJlQXN5bmMoKSB7Ci0gICAgQUxPR1YoImZpbmlzaFByZXBhcmVBc3luYyIpOwotCi0gICAgaWYgKG1Jc1N0cmVhbWluZykgewotICAgICAgICBtQ2FjaGVkU291cmNlLT5yZXN1bWVGZXRjaGluZ0lmTmVjZXNzYXJ5KCk7Ci0gICAgICAgIG1QcmVwYXJpbmcgPSB0cnVlOwotICAgICAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBub3RpZnlQcmVwYXJlZCgpOwotICAgIH0KLQotICAgIGlmIChtQXVkaW9UcmFjay5tRXh0cmFjdG9yICE9IE5VTEwpIHsKLSAgICAgICAgcG9zdFJlYWRCdWZmZXIoTUVESUFfVFJBQ0tfVFlQRV9BVURJTyk7Ci0gICAgfQotCi0gICAgaWYgKG1WaWRlb1RyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTCkgewotICAgICAgICBwb3N0UmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX1ZJREVPKTsKLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6bm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKHN0YXR1c190IGVycikgewotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgbURhdGFTb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgbUNhY2hlZFNvdXJjZS5jbGVhcigpOwotICAgICAgICBtSHR0cFNvdXJjZS5jbGVhcigpOwotCi0gICAgICAgIG1CaXRyYXRlID0gLTE7Ci0gICAgICAgIG1QcmV2QnVmZmVyUGVyY2VudGFnZSA9IC0xOwotICAgICAgICArK21Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbjsKLSAgICB9Ci0gICAgbm90aWZ5UHJlcGFyZWQoZXJyKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzdGFydCgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIEFMT0dJKCJzdGFydCIpOwotCi0gICAgaWYgKG1BdWRpb1RyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTCkgewotICAgICAgICBwb3N0UmVhZEJ1ZmZlcihNRURJQV9UUkFDS19UWVBFX0FVRElPKTsKLSAgICB9Ci0KLSAgICBpZiAobVZpZGVvVHJhY2subUV4dHJhY3RvciAhPSBOVUxMKSB7Ci0gICAgICAgIHBvc3RSZWFkQnVmZmVyKE1FRElBX1RSQUNLX1RZUEVfVklERU8pOwotICAgIH0KLQotICAgIG1TdGFydGVkID0gdHJ1ZTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzdG9wKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpwYXVzZSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1TdGFydGVkID0gZmFsc2U7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6cmVzdW1lKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotfQotCi12b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmRpc2Nvbm5lY3QoKSB7Ci0gICAgc3A8RGF0YVNvdXJjZT4gZGF0YVNvdXJjZSwgaHR0cFNvdXJjZTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIGRhdGFTb3VyY2UgPSBtRGF0YVNvdXJjZTsKLSAgICAgICAgaHR0cFNvdXJjZSA9IG1IdHRwU291cmNlOwotICAgICAgICBtRGlzY29ubmVjdGVkID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAoZGF0YVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIGRpc2Nvbm5lY3QgZGF0YSBzb3VyY2UKLSAgICAgICAgaWYgKGRhdGFTb3VyY2UtPmZsYWdzKCkgJiBEYXRhU291cmNlOjprSXNDYWNoaW5nRGF0YVNvdXJjZSkgewotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TnVDYWNoZWRTb3VyY2UyICo+KGRhdGFTb3VyY2UuZ2V0KCkpLT5kaXNjb25uZWN0KCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGh0dHBTb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihodHRwU291cmNlLmdldCgpKS0+ZGlzY29ubmVjdCgpOwotICAgIH0KLQotICAgIG1EYXRhU291cmNlV3JhcHBlciA9IE5VTEw7Ci0KLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6ZmVlZE1vcmVUU0RhdGEoKSB7Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnNlbmRDYWNoZVN0YXRzKCkgewotICAgIGludDMyX3Qga2JwcyA9IDA7Ci0gICAgc3RhdHVzX3QgZXJyID0gVU5LTk9XTl9FUlJPUjsKLQotICAgIGlmIChtQ2FjaGVkU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgZXJyID0gbUNhY2hlZFNvdXJjZS0+Z2V0RXN0aW1hdGVkQmFuZHdpZHRoS2Jwcygma2Jwcyk7Ci0gICAgfQotCi0gICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7Ci0gICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdENhY2hlU3RhdHMpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJiYW5kd2lkdGgiLCBrYnBzKTsKLSAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICBjYXNlIGtXaGF0UHJlcGFyZUFzeW5jOgotICAgICAgewotICAgICAgICAgIG9uUHJlcGFyZUFzeW5jKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGE6Ci0gICAgICB7Ci0gICAgICAgICAgZmV0Y2hUZXh0RGF0YShrV2hhdFNlbmRTdWJ0aXRsZURhdGEsIE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUsCi0gICAgICAgICAgICAgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uLCBtU3VidGl0bGVUcmFjay5tUGFja2V0cywgbXNnKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBrV2hhdEZldGNoVGltZWRUZXh0RGF0YToKLSAgICAgIHsKLSAgICAgICAgICBmZXRjaFRleHREYXRhKGtXaGF0U2VuZFRpbWVkVGV4dERhdGEsIE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhULAotICAgICAgICAgICAgICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24sIG1UaW1lZFRleHRUcmFjay5tUGFja2V0cywgbXNnKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBrV2hhdFNlbmRTdWJ0aXRsZURhdGE6Ci0gICAgICB7Ci0gICAgICAgICAgc2VuZFRleHREYXRhKGtXaGF0U3VidGl0bGVEYXRhLCBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFLAotICAgICAgICAgICAgICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbiwgbVN1YnRpdGxlVHJhY2subVBhY2tldHMsIG1zZyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2Uga1doYXRTZW5kR2xvYmFsVGltZWRUZXh0RGF0YToKLSAgICAgIHsKLSAgICAgICAgICBzZW5kR2xvYmFsVGV4dERhdGEoa1doYXRUaW1lZFRleHREYXRhLCBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbiwgbXNnKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2Uga1doYXRTZW5kVGltZWRUZXh0RGF0YToKLSAgICAgIHsKLSAgICAgICAgICBzZW5kVGV4dERhdGEoa1doYXRUaW1lZFRleHREYXRhLCBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCwKLSAgICAgICAgICAgICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uLCBtVGltZWRUZXh0VHJhY2subVBhY2tldHMsIG1zZyk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2Uga1doYXRDaGFuZ2VBVlNvdXJjZToKLSAgICAgIHsKLSAgICAgICAgICBpbnQzMl90IHRyYWNrSW5kZXg7Ci0gICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOwotICAgICAgICAgIGNvbnN0IHNwPEFNZWRpYUV4dHJhY3RvcldyYXBwZXI+IGV4dHJhY3RvciA9IG1FeHRyYWN0b3JzLml0ZW1BdCh0cmFja0luZGV4KTsKLQotICAgICAgICAgIFRyYWNrKiB0cmFjazsKLSAgICAgICAgICBBU3RyaW5nIG1pbWU7Ci0gICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUsIGNvdW50ZXJwYXJ0VHlwZTsKLSAgICAgICAgICBzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiBmb3JtYXQgPSBleHRyYWN0b3ItPmdldFRyYWNrRm9ybWF0KHRyYWNrSW5kZXgpOwotICAgICAgICAgIGZvcm1hdC0+Z2V0U3RyaW5nKEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpOwotICAgICAgICAgIGlmICghc3RybmNhc2VjbXAobWltZS5jX3N0cigpLCAiYXVkaW8vIiwgNikpIHsKLSAgICAgICAgICAgICAgdHJhY2sgPSAmbUF1ZGlvVHJhY2s7Ci0gICAgICAgICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfQVVESU87Ci0gICAgICAgICAgICAgIGNvdW50ZXJwYXJ0VHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfVklERU87OwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIENIRUNLKCFzdHJuY2FzZWNtcChtaW1lLmNfc3RyKCksICJ2aWRlby8iLCA2KSk7Ci0gICAgICAgICAgICAgIHRyYWNrID0gJm1WaWRlb1RyYWNrOwotICAgICAgICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX1ZJREVPOwotICAgICAgICAgICAgICBjb3VudGVycGFydFR5cGUgPSBNRURJQV9UUkFDS19UWVBFX0FVRElPOzsKLSAgICAgICAgICB9Ci0KLQotICAgICAgICAgIHRyYWNrLT5tRXh0cmFjdG9yID0gZXh0cmFjdG9yOwotICAgICAgICAgIHRyYWNrLT5tRXh0cmFjdG9yLT5zZWxlY3RTaW5nbGVUcmFjayh0cmFja0luZGV4KTsKLSAgICAgICAgICB0cmFjay0+bUluZGV4ID0gdHJhY2tJbmRleDsKLSAgICAgICAgICArK21BdWRpb0RhdGFHZW5lcmF0aW9uOwotICAgICAgICAgICsrbVZpZGVvRGF0YUdlbmVyYXRpb247Ci0KLSAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgYWN0dWFsVGltZVVzOwotICAgICAgICAgIGNvbnN0IGJvb2wgZm9ybWF0Q2hhbmdlID0gdHJ1ZTsKLSAgICAgICAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfQVVESU8pIHsKLSAgICAgICAgICAgICAgdGltZVVzID0gbUF1ZGlvTGFzdERlcXVldWVUaW1lVXM7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgdGltZVVzID0gbVZpZGVvTGFzdERlcXVldWVUaW1lVXM7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJlYWRCdWZmZXIodHJhY2tUeXBlLCB0aW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMgLyogbW9kZSAqLywKLSAgICAgICAgICAgICAgICAgICZhY3R1YWxUaW1lVXMsIGZvcm1hdENoYW5nZSk7Ci0gICAgICAgICAgcmVhZEJ1ZmZlcihjb3VudGVycGFydFR5cGUsIC0xLCBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DIC8qIG1vZGUgKi8sCi0gICAgICAgICAgICAgICAgICBOVUxMLCAhZm9ybWF0Q2hhbmdlKTsKLSAgICAgICAgICBBTE9HVigidGltZVVzICVsbGQgYWN0dWFsVGltZVVzICVsbGQiLCAobG9uZyBsb25nKXRpbWVVcywgKGxvbmcgbG9uZylhY3R1YWxUaW1lVXMpOwotCi0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2Uga1doYXRTZWVrOgotICAgICAgewotICAgICAgICAgIG9uU2Vlayhtc2cpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIGtXaGF0UmVhZEJ1ZmZlcjoKLSAgICAgIHsKLSAgICAgICAgICBvblJlYWRCdWZmZXIobXNnKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBrV2hhdFBvbGxCdWZmZXJpbmc6Ci0gICAgICB7Ci0gICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOwotICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKLSAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiA9PSBtUG9sbEJ1ZmZlcmluZ0dlbmVyYXRpb24pIHsKLSAgICAgICAgICAgICAgb25Qb2xsQnVmZmVyaW5nKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBkZWZhdWx0OgotICAgICAgICAgIFNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKLSAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6ZmV0Y2hUZXh0RGF0YSgKLSAgICAgICAgdWludDMyX3Qgc2VuZFdoYXQsCi0gICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSwKLSAgICAgICAgaW50MzJfdCBjdXJHZW4sCi0gICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+JiBwYWNrZXRzLAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4mIG1zZykgewotICAgIGludDMyX3QgbXNnR2VuZXJhdGlvbjsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZtc2dHZW5lcmF0aW9uKSk7Ci0gICAgaWYgKG1zZ0dlbmVyYXRpb24gIT0gY3VyR2VuKSB7Ci0gICAgICAgIC8vIHN0YWxlCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGF2YWlsOwotICAgIGlmIChwYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmF2YWlsKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKLQotICAgIGludDY0X3Qgc3ViVGltZVVzID0gMDsKLSAgICByZWFkQnVmZmVyKHR5cGUsIHRpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyAvKiBtb2RlICovLCAmc3ViVGltZVVzKTsKLQotICAgIHN0YXR1c190IGVvc1Jlc3VsdDsKLSAgICBpZiAoIXBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZW9zUmVzdWx0KSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEpIHsKLSAgICAgICAgc3ViVGltZVVzIC09IDEwMDAwMDBsbDsgIC8vIHNlbmQgc3VidGlsZSBkYXRhIG9uZSBzZWNvbmQgZWFybGllcgotICAgIH0KLSAgICBzcDxBTWVzc2FnZT4gbXNnMiA9IG5ldyBBTWVzc2FnZShzZW5kV2hhdCwgdGhpcyk7Ci0gICAgbXNnMi0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtc2dHZW5lcmF0aW9uKTsKLSAgICBtTWVkaWFDbG9jay0+YWRkVGltZXIobXNnMiwgc3ViVGltZVVzKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzZW5kVGV4dERhdGEoCi0gICAgICAgIHVpbnQzMl90IHdoYXQsCi0gICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHlwZSwKLSAgICAgICAgaW50MzJfdCBjdXJHZW4sCi0gICAgICAgIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+JiBwYWNrZXRzLAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4mIG1zZykgewotICAgIGludDMyX3QgbXNnR2VuZXJhdGlvbjsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZtc2dHZW5lcmF0aW9uKSk7Ci0gICAgaWYgKG1zZ0dlbmVyYXRpb24gIT0gY3VyR2VuKSB7Ci0gICAgICAgIC8vIHN0YWxlCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHN1YlRpbWVVczsKLSAgICBpZiAocGFja2V0cy0+bmV4dEJ1ZmZlclRpbWUoJnN1YlRpbWVVcykgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGludDY0X3QgbmV4dFN1YlRpbWVVczsKLSAgICByZWFkQnVmZmVyKHR5cGUsIC0xLCBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DIC8qIG1vZGUgKi8sICZuZXh0U3ViVGltZVVzKTsKLQotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKLSAgICBzdGF0dXNfdCBkZXF1ZXVlU3RhdHVzID0gcGFja2V0cy0+ZGVxdWV1ZUFjY2Vzc1VuaXQoJmJ1ZmZlcik7Ci0gICAgaWYgKGRlcXVldWVTdGF0dXMgPT0gT0spIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwgd2hhdCk7Ci0gICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJidWZmZXIiLCBidWZmZXIpOwotICAgICAgICBub3RpZnktPnBvc3QoKTsKLQotICAgICAgICBpZiAobXNnLT53aGF0KCkgPT0ga1doYXRTZW5kU3VidGl0bGVEYXRhKSB7Ci0gICAgICAgICAgICBuZXh0U3ViVGltZVVzIC09IDEwMDAwMDBsbDsgIC8vIHNlbmQgc3VidGlsZSBkYXRhIG9uZSBzZWNvbmQgZWFybGllcgotICAgICAgICB9Ci0gICAgICAgIG1NZWRpYUNsb2NrLT5hZGRUaW1lcihtc2csIG5leHRTdWJUaW1lVXMpOwotICAgIH0KLX0KLQotdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpzZW5kR2xvYmFsVGV4dERhdGEoCi0gICAgICAgIHVpbnQzMl90IHdoYXQsCi0gICAgICAgIGludDMyX3QgY3VyR2VuLAotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnKSB7Ci0gICAgaW50MzJfdCBtc2dHZW5lcmF0aW9uOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJm1zZ0dlbmVyYXRpb24pKTsKLSAgICBpZiAobXNnR2VuZXJhdGlvbiAhPSBjdXJHZW4pIHsKLSAgICAgICAgLy8gc3RhbGUKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHZvaWQgKmRhdGEgPSBOVUxMOwotICAgIHNpemVfdCBzaXplID0gMDsKLSAgICBpZiAobVRpbWVkVGV4dFRyYWNrLm1FeHRyYWN0b3ItPmdldFRyYWNrRm9ybWF0KG1UaW1lZFRleHRUcmFjay5tSW5kZXgpLT5nZXRCdWZmZXIoCi0gICAgICAgICAgICAgICAgICAgICJ0ZXh0IiwgJmRhdGEsICZzaXplKSkgewotICAgICAgICBtR2xvYmFsVGltZWRUZXh0ID0gbmV3IEFCdWZmZXIoc2l6ZSk7Ci0gICAgICAgIGlmIChtR2xvYmFsVGltZWRUZXh0LT5kYXRhKCkpIHsKLSAgICAgICAgICAgIG1lbWNweShtR2xvYmFsVGltZWRUZXh0LT5kYXRhKCksIGRhdGEsIHNpemUpOwotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGdsb2JhbE1ldGEgPSBtR2xvYmFsVGltZWRUZXh0LT5tZXRhKCk7Ci0gICAgICAgICAgICBnbG9iYWxNZXRhLT5zZXRJbnQ2NCgidGltZVVzIiwgMCk7Ci0gICAgICAgICAgICBnbG9iYWxNZXRhLT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApOwotICAgICAgICAgICAgZ2xvYmFsTWV0YS0+c2V0SW50MzIoImdsb2JhbCIsIDEpOwotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIHdoYXQpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIG1HbG9iYWxUaW1lZFRleHQpOwotICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXNwPEFNZXNzYWdlPiBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpnZXRGb3JtYXQoYm9vbCBhdWRpbykgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIGdldEZvcm1hdF9sKGF1ZGlvKTsKLX0KLQotc3A8TWV0YURhdGE+IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmdldEZvcm1hdE1ldGEoYm9vbCBhdWRpbykgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcmV0dXJuIGdldEZvcm1hdE1ldGFfbChhdWRpbyk7Ci19Ci0KLXNwPEFNZXNzYWdlPiBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpnZXRGb3JtYXRfbChib29sIGF1ZGlvKSB7Ci0gICAgc3A8QU1lZGlhRXh0cmFjdG9yV3JhcHBlcj4gZXh0cmFjdG9yID0gYXVkaW8gPyBtQXVkaW9UcmFjay5tRXh0cmFjdG9yIDogbVZpZGVvVHJhY2subUV4dHJhY3RvcjsKLSAgICBzaXplX3QgdHJhY2tJbmRleCA9IGF1ZGlvID8gbUF1ZGlvVHJhY2subUluZGV4IDogbVZpZGVvVHJhY2subUluZGV4OwotCi0gICAgaWYgKGV4dHJhY3RvciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBleHRyYWN0b3ItPmdldFRyYWNrRm9ybWF0KHRyYWNrSW5kZXgpLT50b0FNZXNzYWdlKCk7Ci19Ci0KLXNwPE1ldGFEYXRhPiBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpnZXRGb3JtYXRNZXRhX2woYm9vbCBhdWRpbykgewotICAgIHNwPEFNZWRpYUV4dHJhY3RvcldyYXBwZXI+IGV4dHJhY3RvciA9IGF1ZGlvID8gbUF1ZGlvVHJhY2subUV4dHJhY3RvciA6IG1WaWRlb1RyYWNrLm1FeHRyYWN0b3I7Ci0gICAgc2l6ZV90IHRyYWNrSW5kZXggPSBhdWRpbyA/IG1BdWRpb1RyYWNrLm1JbmRleCA6IG1WaWRlb1RyYWNrLm1JbmRleDsKLQotICAgIGlmIChleHRyYWN0b3IgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29udmVydE1lZGlhRm9ybWF0V3JhcHBlclRvTWV0YURhdGEoZXh0cmFjdG9yLT5nZXRUcmFja0Zvcm1hdCh0cmFja0luZGV4KSk7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmRlcXVldWVBY2Nlc3NVbml0KAotICAgICAgICBib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgLy8gSWYgaGFzIGdvbmUgdGhyb3VnaCBzdG9wL3JlbGVhc2VEcm0gc2VxdWVuY2UsIHdlIG5vIGxvbmdlciBzZW5kIGRvd24gYW55IGJ1ZmZlciBiL2MKLSAgICAvLyB0aGUgY29kZWMncyBjcnlwdG8gb2JqZWN0IGhhcyBnb25lIGF3YXkgKGIvMzc5NjAwOTYpLgotICAgIC8vIE5vdGU6IFRoaXMgd2lsbCBiZSB1bm5lY2Vzc2FyeSB3aGVuIHN0b3AoKSBjaGFuZ2VzIGJlaGF2aW9yIGFuZCByZWxlYXNlcyBjb2RlYyAoYi8zNTI0ODI4MykuCi0gICAgaWYgKCFtU3RhcnRlZCAmJiBtSXNEcm1SZWxlYXNlZCkgewotICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOwotICAgIH0KLQotICAgIFRyYWNrICp0cmFjayA9IGF1ZGlvID8gJm1BdWRpb1RyYWNrIDogJm1WaWRlb1RyYWNrOwotCi0gICAgaWYgKHRyYWNrLT5tRXh0cmFjdG9yID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKLSAgICBpZiAoIXRyYWNrLT5tUGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKLSAgICAgICAgaWYgKGZpbmFsUmVzdWx0ID09IE9LKSB7Ci0gICAgICAgICAgICBwb3N0UmVhZEJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyBNRURJQV9UUkFDS19UWVBFX0FVRElPIDogTUVESUFfVFJBQ0tfVFlQRV9WSURFTyk7Ci0gICAgICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmaW5hbFJlc3VsdDsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCByZXN1bHQgPSB0cmFjay0+bVBhY2tldHMtPmRlcXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOwotCi0gICAgLy8gc3RhcnQgcHVsbGluZyBpbiBtb3JlIGJ1ZmZlcnMgaWYgY2FjaGUgaXMgcnVubmluZyBsb3cKLSAgICAvLyBzbyB0aGF0IGRlY29kZXIgaGFzIGxlc3MgY2hhbmNlIG9mIGJlaW5nIHN0YXJ2ZWQKLSAgICBpZiAoIW1Jc1N0cmVhbWluZykgewotICAgICAgICBpZiAodHJhY2stPm1QYWNrZXRzLT5nZXRBdmFpbGFibGVCdWZmZXJDb3VudCgmZmluYWxSZXN1bHQpIDwgMikgewotICAgICAgICAgICAgcG9zdFJlYWRCdWZmZXIoYXVkaW8/IE1FRElBX1RSQUNLX1RZUEVfQVVESU8gOiBNRURJQV9UUkFDS19UWVBFX1ZJREVPKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IHRyYWNrLT5tUGFja2V0cy0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZmaW5hbFJlc3VsdCk7Ci0gICAgICAgIC8vIFRPRE86IG1heFJlYnVmZmVyaW5nTWFya01zIGNvdWxkIGJlIGxhcmdlciB0aGFuCi0gICAgICAgIC8vIG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMKLSAgICAgICAgaW50NjRfdCByZXN0YXJ0QnVmZmVyaW5nTWFya1VzID0KLSAgICAgICAgICAgICBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zICogMTAwMGxsIC8gMjsKLSAgICAgICAgaWYgKGZpbmFsUmVzdWx0ID09IE9LKSB7Ci0gICAgICAgICAgICBpZiAoZHVyYXRpb25VcyA8IHJlc3RhcnRCdWZmZXJpbmdNYXJrVXMpIHsKLSAgICAgICAgICAgICAgICBwb3N0UmVhZEJ1ZmZlcihhdWRpbz8gTUVESUFfVFJBQ0tfVFlQRV9BVURJTyA6IE1FRElBX1RSQUNLX1RZUEVfVklERU8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRyYWNrLT5tUGFja2V0cy0+Z2V0QXZhaWxhYmxlQnVmZmVyQ291bnQoJmZpbmFsUmVzdWx0KSA8IDIKLSAgICAgICAgICAgICAgICAmJiAhbVNlbnRQYXVzZU9uQnVmZmVyaW5nICYmICFtUHJlcGFyaW5nKSB7Ci0gICAgICAgICAgICAgICAgbUNhY2hlZFNvdXJjZS0+cmVzdW1lRmV0Y2hpbmdJZk5lY2Vzc2FyeSgpOwotICAgICAgICAgICAgICAgIHNlbmRDYWNoZVN0YXRzKCk7Ci0gICAgICAgICAgICAgICAgbVNlbnRQYXVzZU9uQnVmZmVyaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UGF1c2VPbkJ1ZmZlcmluZ1N0YXJ0KTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChyZXN1bHQgIT0gT0spIHsKLSAgICAgICAgaWYgKG1TdWJ0aXRsZVRyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTCkgewotICAgICAgICAgICAgbVN1YnRpdGxlVHJhY2subVBhY2tldHMtPmNsZWFyKCk7Ci0gICAgICAgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKys7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1UaW1lZFRleHRUcmFjay5tRXh0cmFjdG9yICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1UaW1lZFRleHRUcmFjay5tUGFja2V0cy0+Y2xlYXIoKTsKLSAgICAgICAgICAgIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKys7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHRpbWVVczsKLSAgICBzdGF0dXNfdCBlb3NSZXN1bHQ7IC8vIGlnbm9yZWQKLSAgICBDSEVDSygoKmFjY2Vzc1VuaXQpLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotICAgIGlmIChhdWRpbykgewotICAgICAgICBtQXVkaW9MYXN0RGVxdWV1ZVRpbWVVcyA9IHRpbWVVczsKLSAgICB9IGVsc2UgewotICAgICAgICBtVmlkZW9MYXN0RGVxdWV1ZVRpbWVVcyA9IHRpbWVVczsKLSAgICB9Ci0KLSAgICBpZiAobVN1YnRpdGxlVHJhY2subUV4dHJhY3RvciAhPSBOVUxMCi0gICAgICAgICAgICAmJiAhbVN1YnRpdGxlVHJhY2subVBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZW9zUmVzdWx0KSkgewotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEsIHRoaXMpOwotICAgICAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwotICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbik7Ci0gICAgICAgIG1zZy0+cG9zdCgpOwotICAgIH0KLQotICAgIGlmIChtVGltZWRUZXh0VHJhY2subUV4dHJhY3RvciAhPSBOVUxMCi0gICAgICAgICAgICAmJiAhbVRpbWVkVGV4dFRyYWNrLm1QYWNrZXRzLT5oYXNCdWZmZXJBdmFpbGFibGUoJmVvc1Jlc3VsdCkpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZldGNoVGltZWRUZXh0RGF0YSwgdGhpcyk7Ci0gICAgICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbik7Ci0gICAgICAgIG1zZy0+cG9zdCgpOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmdldER1cmF0aW9uKGludDY0X3QgKmR1cmF0aW9uVXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICpkdXJhdGlvblVzID0gbUR1cmF0aW9uVXM7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zaXplX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6Z2V0VHJhY2tDb3VudCgpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBtRXh0cmFjdG9ycy5zaXplKCk7Ci19Ci0KLXNwPEFNZXNzYWdlPiBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpnZXRUcmFja0luZm8oc2l6ZV90IHRyYWNrSW5kZXgpIGNvbnN0IHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHNpemVfdCB0cmFja0NvdW50ID0gbUV4dHJhY3RvcnMuc2l6ZSgpOwotICAgIGlmICh0cmFja0luZGV4ID49IHRyYWNrQ291bnQpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG1FeHRyYWN0b3JzLml0ZW1BdCh0cmFja0luZGV4KS0+Z2V0VHJhY2tGb3JtYXQodHJhY2tJbmRleCktPnRvQU1lc3NhZ2UoKTsKLSAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIm5vIG1ldGFkYXRhIGZvciB0cmFjayAlenUiLCB0cmFja0luZGV4KTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgQVN0cmluZyBtaW1lOwotICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZyhBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7Ci0KLSAgICBpbnQzMl90IHRyYWNrVHlwZTsKLSAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUuY19zdHIoKSwgInZpZGVvLyIsIDYpKSB7Ci0gICAgICAgIHRyYWNrVHlwZSA9IE1FRElBX1RSQUNLX1RZUEVfVklERU87Ci0gICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZS5jX3N0cigpLCAiYXVkaW8vIiwgNikpIHsKLSAgICAgICAgdHJhY2tUeXBlID0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTzsKLSAgICB9IGVsc2UgaWYgKCFzdHJjYXNlY21wKG1pbWUuY19zdHIoKSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKSkgewotICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVDsKLSAgICB9IGVsc2UgewotICAgICAgICB0cmFja1R5cGUgPSBNRURJQV9UUkFDS19UWVBFX1VOS05PV047Ci0gICAgfQotICAgIGZvcm1hdC0+c2V0SW50MzIoInR5cGUiLCB0cmFja1R5cGUpOwotCi0gICAgQVN0cmluZyBsYW5nOwotICAgIGlmICghZm9ybWF0LT5maW5kU3RyaW5nKCJsYW5ndWFnZSIsICZsYW5nKSkgewotICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibGFuZ3VhZ2UiLCAidW5kIik7Ci0gICAgfQotCi0gICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7Ci0gICAgICAgIGludDMyX3QgaXNBdXRvc2VsZWN0ID0gMSwgaXNEZWZhdWx0ID0gMCwgaXNGb3JjZWQgPSAwOwotICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMihBTUVESUFGT1JNQVRfS0VZX0lTX0FVVE9TRUxFQ1QsICZpc0F1dG9zZWxlY3QpOwotICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMihBTUVESUFGT1JNQVRfS0VZX0lTX0RFRkFVTFQsICZpc0RlZmF1bHQpOwotICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMihBTUVESUFGT1JNQVRfS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSwgJmlzRm9yY2VkKTsKLQotICAgICAgICBmb3JtYXQtPnNldEludDMyKCJhdXRvIiwgISFpc0F1dG9zZWxlY3QpOwotICAgICAgICBmb3JtYXQtPnNldEludDMyKCJkZWZhdWx0IiwgISFpc0RlZmF1bHQpOwotICAgICAgICBmb3JtYXQtPnNldEludDMyKCJmb3JjZWQiLCAhIWlzRm9yY2VkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZm9ybWF0OwotfQotCi1zc2l6ZV90IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBjb25zdCBUcmFjayAqdHJhY2sgPSBOVUxMOwotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9WSURFTzoKLSAgICAgICAgdHJhY2sgPSAmbVZpZGVvVHJhY2s7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9BVURJTzoKLSAgICAgICAgdHJhY2sgPSAmbUF1ZGlvVHJhY2s7Ci0gICAgICAgIGJyZWFrOwotICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQ6Ci0gICAgICAgIHRyYWNrID0gJm1UaW1lZFRleHRUcmFjazsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFOgotICAgICAgICB0cmFjayA9ICZtU3VidGl0bGVUcmFjazsKLSAgICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgaWYgKHRyYWNrICE9IE5VTEwgJiYgdHJhY2stPm1FeHRyYWN0b3IgIT0gTlVMTCkgewotICAgICAgICByZXR1cm4gdHJhY2stPm1JbmRleDsKLSAgICB9Ci0KLSAgICByZXR1cm4gLTE7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCwgaW50NjRfdCB0aW1lVXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIEFMT0dWKCIlcyB0cmFjazogJXp1Iiwgc2VsZWN0ID8gInNlbGVjdCIgOiAiZGVzZWxlY3QiLCB0cmFja0luZGV4KTsKLQotICAgIGlmICh0cmFja0luZGV4ID49IG1FeHRyYWN0b3JzLnNpemUoKSkgewotICAgICAgICByZXR1cm4gQkFEX0lOREVYOwotICAgIH0KLQotICAgIGlmICghc2VsZWN0KSB7Ci0gICAgICAgIFRyYWNrKiB0cmFjayA9IE5VTEw7Ci0gICAgICAgIGlmIChtU3VidGl0bGVUcmFjay5tRXh0cmFjdG9yICE9IE5VTEwgJiYgdHJhY2tJbmRleCA9PSBtU3VidGl0bGVUcmFjay5tSW5kZXgpIHsKLSAgICAgICAgICAgIHRyYWNrID0gJm1TdWJ0aXRsZVRyYWNrOwotICAgICAgICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbisrOwotICAgICAgICB9IGVsc2UgaWYgKG1UaW1lZFRleHRUcmFjay5tRXh0cmFjdG9yICE9IE5VTEwgJiYgdHJhY2tJbmRleCA9PSBtVGltZWRUZXh0VHJhY2subUluZGV4KSB7Ci0gICAgICAgICAgICB0cmFjayA9ICZtVGltZWRUZXh0VHJhY2s7Ci0gICAgICAgICAgICBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbisrOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0cmFjayA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgdHJhY2stPm1FeHRyYWN0b3IgPSBOVUxMOwotICAgICAgICB0cmFjay0+bVBhY2tldHMtPmNsZWFyKCk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBjb25zdCBzcDxBTWVkaWFFeHRyYWN0b3JXcmFwcGVyPiBleHRyYWN0b3IgPSBtRXh0cmFjdG9ycy5pdGVtQXQodHJhY2tJbmRleCk7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBjb252ZXJ0TWVkaWFGb3JtYXRXcmFwcGVyVG9NZXRhRGF0YShleHRyYWN0b3ItPmdldFRyYWNrRm9ybWF0KHRyYWNrSW5kZXgpKTsKLSAgICBjb25zdCBjaGFyICptaW1lOwotICAgIENIRUNLKG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLSAgICBpZiAoIXN0cm5jYXNlY21wKG1pbWUsICJ0ZXh0LyIsIDUpKSB7Ci0gICAgICAgIGJvb2wgaXNTdWJ0aXRsZSA9IHN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKTsKLSAgICAgICAgVHJhY2sgKnRyYWNrID0gaXNTdWJ0aXRsZSA/ICZtU3VidGl0bGVUcmFjayA6ICZtVGltZWRUZXh0VHJhY2s7Ci0gICAgICAgIGlmICh0cmFjay0+bUV4dHJhY3RvciAhPSBOVUxMICYmIHRyYWNrLT5tSW5kZXggPT0gdHJhY2tJbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgICAgIHRyYWNrLT5tSW5kZXggPSB0cmFja0luZGV4OwotICAgICAgICB0cmFjay0+bUV4dHJhY3RvciA9IG1FeHRyYWN0b3JzLml0ZW1BdCh0cmFja0luZGV4KTsKLSAgICAgICAgdHJhY2stPm1FeHRyYWN0b3ItPnNlbGVjdFNpbmdsZVRyYWNrKHRyYWNrSW5kZXgpOwotICAgICAgICBpZiAodHJhY2stPm1QYWNrZXRzID09IE5VTEwpIHsKLSAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cyA9IG5ldyBBbm90aGVyUGFja2V0U291cmNlKG1ldGEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5jbGVhcigpOwotICAgICAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5zZXRGb3JtYXQobWV0YSk7Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpc1N1YnRpdGxlKSB7Ci0gICAgICAgICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRmV0Y2hUaW1lZFRleHREYXRhR2VuZXJhdGlvbisrOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzX3QgZW9zUmVzdWx0OyAvLyBpZ25vcmVkCi0gICAgICAgIGlmIChtU3VidGl0bGVUcmFjay5tRXh0cmFjdG9yICE9IE5VTEwKLSAgICAgICAgICAgICAgICAmJiAhbVN1YnRpdGxlVHJhY2subVBhY2tldHMtPmhhc0J1ZmZlckF2YWlsYWJsZSgmZW9zUmVzdWx0KSkgewotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEZldGNoU3VidGl0bGVEYXRhLCB0aGlzKTsKLSAgICAgICAgICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7Ci0gICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbik7Ci0gICAgICAgICAgICBtc2ctPnBvc3QoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cyID0gbmV3IEFNZXNzYWdlKGtXaGF0U2VuZEdsb2JhbFRpbWVkVGV4dERhdGEsIHRoaXMpOwotICAgICAgICBtc2cyLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uKTsKLSAgICAgICAgbXNnMi0+cG9zdCgpOwotCi0gICAgICAgIGlmIChtVGltZWRUZXh0VHJhY2subUV4dHJhY3RvciAhPSBOVUxMCi0gICAgICAgICAgICAgICAgJiYgIW1UaW1lZFRleHRUcmFjay5tUGFja2V0cy0+aGFzQnVmZmVyQXZhaWxhYmxlKCZlb3NSZXN1bHQpKSB7Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hUaW1lZFRleHREYXRhLCB0aGlzKTsKLSAgICAgICAgICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7Ci0gICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24pOwotICAgICAgICAgICAgbXNnLT5wb3N0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZSwgImF1ZGlvLyIsIDYpIHx8ICFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKLSAgICAgICAgYm9vbCBhdWRpbyA9ICFzdHJuY2FzZWNtcChtaW1lLCAiYXVkaW8vIiwgNik7Ci0gICAgICAgIFRyYWNrICp0cmFjayA9IGF1ZGlvID8gJm1BdWRpb1RyYWNrIDogJm1WaWRlb1RyYWNrOwotICAgICAgICBpZiAodHJhY2stPm1FeHRyYWN0b3IgIT0gTlVMTCAmJiB0cmFjay0+bUluZGV4ID09IHRyYWNrSW5kZXgpIHsKLSAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDaGFuZ2VBVlNvdXJjZSwgdGhpcyk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoInRyYWNrSW5kZXgiLCB0cmFja0luZGV4KTsKLSAgICAgICAgbXNnLT5wb3N0KCk7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnNlZWtUbyhpbnQ2NF90IHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpIHsKLSAgICBBTE9HVigic2Vla1RvOiAlbGxkLCAlZCIsIChsb25nIGxvbmcpc2Vla1RpbWVVcywgbW9kZSk7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNlZWssIHRoaXMpOwotICAgIG1zZy0+c2V0SW50NjQoInNlZWtUaW1lVXMiLCBzZWVrVGltZVVzKTsKLSAgICBtc2ctPnNldEludDMyKCJtb2RlIiwgbW9kZSk7Ci0KLSAgICAvLyBOZWVkIHRvIGNhbGwgcmVhZEJ1ZmZlciBvbiB8bUxvb3BlcnwgdG8gZW5zdXJlIHRoZSBjYWxscyB0bwotICAgIC8vIElNZWRpYVNvdXJjZTo6cmVhZCogYXJlIHNlcmlhbGl6ZWQuIE5vdGUgdGhhdCBJTWVkaWFTb3VyY2U6OnJlYWQqCi0gICAgLy8gaXMgY2FsbGVkIHdpdGhvdXQgfG1Mb2NrfCBhY3F1aXJlZCBhbmQgTWVkaWFTb3VyY2UgaXMgbm90IHRocmVhZCBzYWZlLgotICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKLSAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7Ci0gICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7Ci0gICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi12b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6Om9uU2Vlayhjb25zdCBzcDxBTWVzc2FnZT4mIG1zZykgewotICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICBpbnQzMl90IG1vZGU7Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNlZWtUaW1lVXMiLCAmc2Vla1RpbWVVcykpOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJtb2RlIiwgJm1vZGUpKTsKLQotICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICBzdGF0dXNfdCBlcnIgPSBkb1NlZWsoc2Vla1RpbWVVcywgKE1lZGlhUGxheWVyMlNlZWtNb2RlKW1vZGUpOwotICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLQotICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLSAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpkb1NlZWsoaW50NjRfdCBzZWVrVGltZVVzLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKSB7Ci0gICAgaWYgKG1WaWRlb1RyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTCkgewotICAgICAgICArK21WaWRlb0RhdGFHZW5lcmF0aW9uOwotCi0gICAgICAgIGludDY0X3QgYWN0dWFsVGltZVVzOwotICAgICAgICByZWFkQnVmZmVyKE1FRElBX1RSQUNLX1RZUEVfVklERU8sIHNlZWtUaW1lVXMsIG1vZGUsICZhY3R1YWxUaW1lVXMpOwotCi0gICAgICAgIGlmIChtb2RlICE9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX0NMT1NFU1QpIHsKLSAgICAgICAgICAgIHNlZWtUaW1lVXMgPSBhY3R1YWxUaW1lVXM7Ci0gICAgICAgIH0KLSAgICAgICAgbVZpZGVvTGFzdERlcXVldWVUaW1lVXMgPSBhY3R1YWxUaW1lVXM7Ci0gICAgfQotCi0gICAgaWYgKG1BdWRpb1RyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTCkgewotICAgICAgICArK21BdWRpb0RhdGFHZW5lcmF0aW9uOwotICAgICAgICByZWFkQnVmZmVyKE1FRElBX1RSQUNLX1RZUEVfQVVESU8sIHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX0NMT1NFU1QpOwotICAgICAgICBtQXVkaW9MYXN0RGVxdWV1ZVRpbWVVcyA9IHNlZWtUaW1lVXM7Ci0gICAgfQotCi0gICAgaWYgKG1TdWJ0aXRsZVRyYWNrLm1FeHRyYWN0b3IgIT0gTlVMTCkgewotICAgICAgICBtU3VidGl0bGVUcmFjay5tUGFja2V0cy0+Y2xlYXIoKTsKLSAgICAgICAgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbisrOwotICAgIH0KLQotICAgIGlmIChtVGltZWRUZXh0VHJhY2subUV4dHJhY3RvciAhPSBOVUxMKSB7Ci0gICAgICAgIG1UaW1lZFRleHRUcmFjay5tUGFja2V0cy0+Y2xlYXIoKTsKLSAgICAgICAgbUZldGNoVGltZWRUZXh0RGF0YUdlbmVyYXRpb24rKzsKLSAgICB9Ci0KLSAgICArK21Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbjsKLSAgICBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXNwPEFCdWZmZXI+IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6Om1lZGlhQnVmZmVyVG9BQnVmZmVyKAotICAgICAgICBNZWRpYUJ1ZmZlckJhc2UqIG1iLAotICAgICAgICBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSkgewotICAgIGJvb2wgYXVkaW8gPSB0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9BVURJTzsKLSAgICBzaXplX3Qgb3V0TGVuZ3RoID0gbWItPnJhbmdlX2xlbmd0aCgpOwotCi0gICAgaWYgKGF1ZGlvICYmIG1BdWRpb0lzVm9yYmlzKSB7Ci0gICAgICAgIG91dExlbmd0aCArPSBzaXplb2YoaW50MzJfdCk7Ci0gICAgfQotCi0gICAgc3A8QUJ1ZmZlcj4gYWI7Ci0KLSAgICBpZiAobUlzRHJtUHJvdGVjdGVkKSAgIHsKLSAgICAgICAgLy8gTW9kdWxhciBEUk0KLSAgICAgICAgLy8gRW5hYmxlZCBmb3IgYm90aCB2aWRlby9hdWRpbyBzbyAxKSBtZWRpYSBidWZmZXIgaXMgcmV1c2VkIHdpdGhvdXQgZXh0cmEgY29weWluZwotICAgICAgICAvLyAyKSBtZXRhIGRhdGEgY2FuIGJlIHJldHJpZXZlZCBpbiBvbklucHV0QnVmZmVyRmV0Y2hlZCBmb3IgY2FsbGluZyBxdWV1ZVNlY3VyZUlucHV0QnVmZmVyLgotCi0gICAgICAgIC8vIGRhdGEgaXMgYWxyZWFkeSBwcm92aWRlZCBpbiB0aGUgYnVmZmVyCi0gICAgICAgIGFiID0gbmV3IEFCdWZmZXIoTlVMTCwgbWItPnJhbmdlX2xlbmd0aCgpKTsKLSAgICAgICAgYWItPm1ldGEoKS0+c2V0T2JqZWN0KCJtZWRpYUJ1ZmZlckhvbGRlciIsIG5ldyBNZWRpYUJ1ZmZlckhvbGRlcihtYikpOwotCi0gICAgICAgIC8vIE1vZHVsYXIgRFJNOiBSZXF1aXJlZCBiL2Mgb2YgdGhlIGFib3ZlIGFkZF9yZWYuCi0gICAgICAgIC8vIElmIHJlZj4wLCB0aGVyZSBtdXN0IGJlIGFuIG9ic2VydmVyLCBvciBpdCdsbCBjcmFzaCBhdCByZWxlYXNlKCkuCi0gICAgICAgIC8vIFRPRE86IE1lZGlhQnVmZmVyIG1pZ2h0IG5lZWQgdG8gYmUgcmV2aXNlZCB0byBlYXNlIHN1Y2ggbmVlZC4KLSAgICAgICAgbWItPnNldE9ic2VydmVyKHRoaXMpOwotICAgICAgICAvLyBzZXRNZWRpYUJ1ZmZlckJhc2UoKSBpbnRlcmVzdGluZ2x5IGRvZXNuJ3QgaW5jcmVtZW50IHRoZSByZWYgY291bnQgb24gaXRzIG93bi4KLSAgICAgICAgLy8gRXh0cmEgaW5jcmVtZW50IChzaW5jZSB3ZSB3YW50IHRvIGtlZXAgbWIgYWxpdmUgYW5kIGF0dGFjaGVkIHRvIGFiIGJleW9uZCB0aGlzIGZ1bmN0aW9uCi0gICAgICAgIC8vIGNhbGwuIFRoaXMgaXMgdG8gY291bnRlciB0aGUgZWZmZWN0IG9mIG1iLT5yZWxlYXNlKCkgdG93YXJkcyB0aGUgZW5kLgotICAgICAgICBtYi0+YWRkX3JlZigpOwotCi0gICAgfSBlbHNlIHsKLSAgICAgICAgYWIgPSBuZXcgQUJ1ZmZlcihvdXRMZW5ndGgpOwotICAgICAgICBtZW1jcHkoYWItPmRhdGEoKSwKLSAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopbWItPmRhdGEoKSArIG1iLT5yYW5nZV9vZmZzZXQoKSwKLSAgICAgICAgICAgICAgIG1iLT5yYW5nZV9sZW5ndGgoKSk7Ci0gICAgfQotCi0gICAgaWYgKGF1ZGlvICYmIG1BdWRpb0lzVm9yYmlzKSB7Ci0gICAgICAgIGludDMyX3QgbnVtUGFnZVNhbXBsZXM7Ci0gICAgICAgIGlmICghbWItPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5VmFsaWRTYW1wbGVzLCAmbnVtUGFnZVNhbXBsZXMpKSB7Ci0gICAgICAgICAgICBudW1QYWdlU2FtcGxlcyA9IC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgdWludDhfdCogYWJFbmQgPSBhYi0+ZGF0YSgpICsgbWItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICBtZW1jcHkoYWJFbmQsICZudW1QYWdlU2FtcGxlcywgc2l6ZW9mKG51bVBhZ2VTYW1wbGVzKSk7Ci0gICAgfQotCi0gICAgc3A8QU1lc3NhZ2U+IG1ldGEgPSBhYi0+bWV0YSgpOwotCi0gICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgQ0hFQ0sobWItPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NChrS2V5VGltZSwgJnRpbWVVcykpOwotICAgIG1ldGEtPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwotCi0gICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPKSB7Ci0gICAgICAgIGludDMyX3QgbGF5ZXJJZDsKLSAgICAgICAgaWYgKG1iLT5tZXRhX2RhdGEoKS5maW5kSW50MzIoa0tleVRlbXBvcmFsTGF5ZXJJZCwgJmxheWVySWQpKSB7Ci0gICAgICAgICAgICBtZXRhLT5zZXRJbnQzMigidGVtcG9yYWwtbGF5ZXItaWQiLCBsYXllcklkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQpIHsKLSAgICAgICAgQVN0cmluZyBtaW1lOwotICAgICAgICBzcDxBTWVkaWFFeHRyYWN0b3JXcmFwcGVyPiBleHRyYWN0b3IgPSBtVGltZWRUZXh0VHJhY2subUV4dHJhY3RvcjsKLSAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXggPSBtVGltZWRUZXh0VHJhY2subUluZGV4OwotICAgICAgICBDSEVDSyhleHRyYWN0b3IgIT0gTlVMTAotICAgICAgICAgICAgICAgICYmIGV4dHJhY3Rvci0+Z2V0VHJhY2tGb3JtYXQodHJhY2tJbmRleCktPmdldFN0cmluZyhBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKSk7Ci0gICAgICAgIG1ldGEtPnNldFN0cmluZygibWltZSIsIG1pbWUuY19zdHIoKSk7Ci0gICAgfQotCi0gICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgIGlmIChtYi0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uVXMpKSB7Ci0gICAgICAgIG1ldGEtPnNldEludDY0KCJkdXJhdGlvblVzIiwgZHVyYXRpb25Vcyk7Ci0gICAgfQotCi0gICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKSB7Ci0gICAgICAgIG1ldGEtPnNldEludDMyKEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVgsIG1TdWJ0aXRsZVRyYWNrLm1JbmRleCk7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZGF0YVR5cGU7IC8vIHVudXNlZAotICAgIGNvbnN0IHZvaWQgKnNlaURhdGE7Ci0gICAgc2l6ZV90IHNlaUxlbmd0aDsKLSAgICBpZiAobWItPm1ldGFfZGF0YSgpLmZpbmREYXRhKGtLZXlTRUksICZkYXRhVHlwZSwgJnNlaURhdGEsICZzZWlMZW5ndGgpKSB7Ci0gICAgICAgIHNwPEFCdWZmZXI+IHNlaSA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShzZWlEYXRhLCBzZWlMZW5ndGgpOzsKLSAgICAgICAgbWV0YS0+c2V0QnVmZmVyKCJzZWkiLCBzZWkpOwotICAgIH0KLQotICAgIGNvbnN0IHZvaWQgKm1wZWdVc2VyRGF0YVBvaW50ZXI7Ci0gICAgc2l6ZV90IG1wZWdVc2VyRGF0YUxlbmd0aDsKLSAgICBpZiAobWItPm1ldGFfZGF0YSgpLmZpbmREYXRhKAotICAgICAgICAgICAga0tleU1wZWdVc2VyRGF0YSwgJmRhdGFUeXBlLCAmbXBlZ1VzZXJEYXRhUG9pbnRlciwgJm1wZWdVc2VyRGF0YUxlbmd0aCkpIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gbXBlZ1VzZXJEYXRhID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KG1wZWdVc2VyRGF0YVBvaW50ZXIsIG1wZWdVc2VyRGF0YUxlbmd0aCk7Ci0gICAgICAgIG1ldGEtPnNldEJ1ZmZlcihBTUVESUFGT1JNQVRfS0VZX01QRUdfVVNFUl9EQVRBLCBtcGVnVXNlckRhdGEpOwotICAgIH0KLQotICAgIG1iLT5yZWxlYXNlKCk7Ci0gICAgbWIgPSBOVUxMOwotCi0gICAgcmV0dXJuIGFiOwotfQotCi1pbnQzMl90IE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OmdldERhdGFHZW5lcmF0aW9uKG1lZGlhX3RyYWNrX3R5cGUgdHlwZSkgY29uc3QgewotICAgIGludDMyX3QgZ2VuZXJhdGlvbiA9IC0xOwotICAgIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9WSURFTzoKLSAgICAgICAgZ2VuZXJhdGlvbiA9IG1WaWRlb0RhdGFHZW5lcmF0aW9uOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfQVVESU86Ci0gICAgICAgIGdlbmVyYXRpb24gPSBtQXVkaW9EYXRhR2VuZXJhdGlvbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgY2FzZSBNRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVDoKLSAgICAgICAgZ2VuZXJhdGlvbiA9IG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uOwotICAgICAgICBicmVhazsKLSAgICBjYXNlIE1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEU6Ci0gICAgICAgIGdlbmVyYXRpb24gPSBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uOwotICAgICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ2VuZXJhdGlvbjsKLX0KLQotdm9pZCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpwb3N0UmVhZEJ1ZmZlcihtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSkgewotICAgIGlmICgobVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMgJiAoMSA8PCB0cmFja1R5cGUpKSA9PSAwKSB7Ci0gICAgICAgIG1QZW5kaW5nUmVhZEJ1ZmZlclR5cGVzIHw9ICgxIDw8IHRyYWNrVHlwZSk7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZWFkQnVmZmVyLCB0aGlzKTsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigidHJhY2tUeXBlIiwgdHJhY2tUeXBlKTsKLSAgICAgICAgbXNnLT5wb3N0KCk7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6Om9uUmVhZEJ1ZmZlcihjb25zdCBzcDxBTWVzc2FnZT4mIG1zZykgewotICAgIGludDMyX3QgdG1wVHlwZTsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHJhY2tUeXBlIiwgJnRtcFR5cGUpKTsKLSAgICBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSA9IChtZWRpYV90cmFja190eXBlKXRtcFR5cGU7Ci0gICAgbVBlbmRpbmdSZWFkQnVmZmVyVHlwZXMgJj0gfigxIDw8IHRyYWNrVHlwZSk7Ci0gICAgcmVhZEJ1ZmZlcih0cmFja1R5cGUpOwotfQotCi12b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnJlYWRCdWZmZXIoCi0gICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlLCBpbnQ2NF90IHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUsCi0gICAgICAgIGludDY0X3QgKmFjdHVhbFRpbWVVcywgYm9vbCBmb3JtYXRDaGFuZ2UpIHsKLSAgICBUcmFjayAqdHJhY2s7Ci0gICAgc2l6ZV90IG1heEJ1ZmZlcnMgPSAxOwotICAgIHN3aXRjaCAodHJhY2tUeXBlKSB7Ci0gICAgICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9WSURFTzoKLSAgICAgICAgICAgIHRyYWNrID0gJm1WaWRlb1RyYWNrOwotICAgICAgICAgICAgbWF4QnVmZmVycyA9IDg7ICAvLyB0b28gbGFyZ2Ugb2YgYSBudW1iZXIgbWF5IGluZmx1ZW5jZSBzZWVrcwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9BVURJTzoKLSAgICAgICAgICAgIHRyYWNrID0gJm1BdWRpb1RyYWNrOwotICAgICAgICAgICAgbWF4QnVmZmVycyA9IDY0OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRToKLSAgICAgICAgICAgIHRyYWNrID0gJm1TdWJ0aXRsZVRyYWNrOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQ6Ci0gICAgICAgICAgICB0cmFjayA9ICZtVGltZWRUZXh0VHJhY2s7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgfQotCi0gICAgaWYgKHRyYWNrLT5tRXh0cmFjdG9yID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChhY3R1YWxUaW1lVXMpIHsKLSAgICAgICAgKmFjdHVhbFRpbWVVcyA9IHNlZWtUaW1lVXM7Ci0gICAgfQotCi0KLSAgICBib29sIHNlZWtpbmcgPSBmYWxzZTsKLSAgICBzcDxBTWVkaWFFeHRyYWN0b3JXcmFwcGVyPiBleHRyYWN0b3IgPSB0cmFjay0+bUV4dHJhY3RvcjsKLSAgICBpZiAoc2Vla1RpbWVVcyA+PSAwKSB7Ci0gICAgICAgIGV4dHJhY3Rvci0+c2Vla1RvKHNlZWtUaW1lVXMsIG1vZGUpOwotICAgICAgICBzZWVraW5nID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGdlbmVyYXRpb24gPSBnZXREYXRhR2VuZXJhdGlvbih0cmFja1R5cGUpOwotICAgIGZvciAoc2l6ZV90IG51bUJ1ZmZlcnMgPSAwOyBudW1CdWZmZXJzIDwgbWF4QnVmZmVyczsgKSB7Ci0gICAgICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IGFCdWZmZXJzOwotCi0gICAgICAgIG1Mb2NrLnVubG9jaygpOwotCi0gICAgICAgIHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+IGZvcm1hdDsKLSAgICAgICAgc3NpemVfdCBzYW1wbGVTaXplID0gLTE7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IGV4dHJhY3Rvci0+Z2V0U2FtcGxlRm9ybWF0KGZvcm1hdCk7Ci0gICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgIHNhbXBsZVNpemUgPSBleHRyYWN0b3ItPmdldFNhbXBsZVNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlcnIgIT0gT0sgfHwgc2FtcGxlU2l6ZSA8IDApIHsKLSAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgIHRyYWNrLT5tUGFja2V0cy0+c2lnbmFsRU9TKGVyciAhPSBPSyA/IGVyciA6IEVSUk9SX0VORF9PRl9TVFJFQU0pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBzcDxBQnVmZmVyPiBhYnVmID0gbmV3IEFCdWZmZXIoc2FtcGxlU2l6ZSk7Ci0gICAgICAgIHNhbXBsZVNpemUgPSBleHRyYWN0b3ItPnJlYWRTYW1wbGVEYXRhKGFidWYpOwotICAgICAgICBtTG9jay5sb2NrKCk7Ci0KLSAgICAgICAgLy8gaW4gY2FzZSB0cmFjayBoYXMgYmVlbiBjaGFuZ2VkIHNpbmNlIHdlIGRvbid0IGhhdmUgbG9jayBmb3Igc29tZSB0aW1lLgotICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBnZXREYXRhR2VuZXJhdGlvbih0cmFja1R5cGUpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGludDY0X3QgdGltZVVzID0gZXh0cmFjdG9yLT5nZXRTYW1wbGVUaW1lKCk7Ci0gICAgICAgIGlmICh0aW1lVXMgPCAwKSB7Ci0gICAgICAgICAgICB0cmFjay0+bVBhY2tldHMtPnNpZ25hbEVPUyhFUlJPUl9NQUxGT1JNRUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBzcDxBTWVzc2FnZT4gbWV0YSA9IGFidWYtPm1ldGEoKTsKLSAgICAgICAgZm9ybWF0LT53cml0ZVRvQU1lc3NhZ2UobWV0YSk7Ci0gICAgICAgIG1ldGEtPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwotICAgICAgICBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfQVVESU8pIHsKLSAgICAgICAgICAgIG1BdWRpb1RpbWVVcyA9IHRpbWVVczsKLSAgICAgICAgfSBlbHNlIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9WSURFTykgewotICAgICAgICAgICAgbVZpZGVvVGltZVVzID0gdGltZVVzOwotICAgICAgICB9Ci0KLSAgICAgICAgcXVldWVEaXNjb250aW51aXR5SWZOZWVkZWQoc2Vla2luZywgZm9ybWF0Q2hhbmdlLCB0cmFja1R5cGUsIHRyYWNrKTsKLQotICAgICAgICBpZiAobnVtQnVmZmVycyA9PSAwICYmIGFjdHVhbFRpbWVVcyAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAqYWN0dWFsVGltZVVzID0gdGltZVVzOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWVraW5nKSB7Ci0gICAgICAgICAgICBpZiAobWV0YSAhPSBudWxscHRyICYmIG1vZGUgPT0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfQ0xPU0VTVAotICAgICAgICAgICAgICAgICAgICAmJiBzZWVrVGltZVVzID4gdGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGV4dHJhID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgICAgIGV4dHJhLT5zZXRJbnQ2NCgicmVzdW1lLWF0LW1lZGlhVGltZVVzIiwgc2Vla1RpbWVVcyk7Ci0gICAgICAgICAgICAgICAgbWV0YS0+c2V0TWVzc2FnZSgiZXh0cmEiLCBleHRyYSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB0cmFjay0+bVBhY2tldHMtPnF1ZXVlQWNjZXNzVW5pdChhYnVmKTsKLSAgICAgICAgZm9ybWF0Q2hhbmdlID0gZmFsc2U7Ci0gICAgICAgIHNlZWtpbmcgPSBmYWxzZTsKLSAgICAgICAgKytudW1CdWZmZXJzOwotICAgICAgICBleHRyYWN0b3ItPmFkdmFuY2UoKTsKLQotICAgIH0KLQotICAgIGlmIChtSXNTdHJlYW1pbmcKLSAgICAgICAgJiYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPIHx8IHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX0FVRElPKSkgewotICAgICAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKLSAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzID0gdHJhY2stPm1QYWNrZXRzLT5nZXRCdWZmZXJlZER1cmF0aW9uVXMoJmZpbmFsUmVzdWx0KTsKLQotICAgICAgICAvLyBUT0RPOiBtYXhSZWJ1ZmZlcmluZ01hcmtNcyBjb3VsZCBiZSBsYXJnZXIgdGhhbgotICAgICAgICAvLyBtQnVmZmVyaW5nU2V0dGluZ3MubVJlc3VtZVBsYXliYWNrTWFya01zCi0gICAgICAgIGludDY0X3QgbWFya1VzID0gKG1QcmVwYXJpbmcgPyBtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxNYXJrTXMKLSAgICAgICAgICAgIDogbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcykgKiAxMDAwbGw7Ci0gICAgICAgIGlmIChmaW5hbFJlc3VsdCA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNIHx8IGR1cmF0aW9uVXMgPj0gbWFya1VzKSB7Ci0gICAgICAgICAgICBpZiAobVByZXBhcmluZyB8fCBtU2VudFBhdXNlT25CdWZmZXJpbmcpIHsKLSAgICAgICAgICAgICAgICBUcmFjayAqY291bnRlclRyYWNrID0KLSAgICAgICAgICAgICAgICAgICAgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPID8gJm1BdWRpb1RyYWNrIDogJm1WaWRlb1RyYWNrKTsKLSAgICAgICAgICAgICAgICBpZiAoY291bnRlclRyYWNrLT5tRXh0cmFjdG9yICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25VcyA9IGNvdW50ZXJUcmFjay0+bVBhY2tldHMtPmdldEJ1ZmZlcmVkRHVyYXRpb25VcygmZmluYWxSZXN1bHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoZmluYWxSZXN1bHQgPT0gRVJST1JfRU5EX09GX1NUUkVBTSB8fCBkdXJhdGlvblVzID49IG1hcmtVcykgewotICAgICAgICAgICAgICAgICAgICBpZiAobVByZXBhcmluZykgewotICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QcmVwYXJpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRDYWNoZVN0YXRzKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VudFBhdXNlT25CdWZmZXJpbmcgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFJlc3VtZU9uQnVmZmVyaW5nRW5kKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgcG9zdFJlYWRCdWZmZXIodHJhY2tUeXBlKTsKLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6cXVldWVEaXNjb250aW51aXR5SWZOZWVkZWQoCi0gICAgICAgIGJvb2wgc2Vla2luZywgYm9vbCBmb3JtYXRDaGFuZ2UsIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlLCBUcmFjayAqdHJhY2spIHsKLSAgICAvLyBmb3JtYXRDaGFuZ2UgJiYgc2Vla2luZzogdHJhY2sgd2hvc2Ugc291cmNlIGlzIGNoYW5nZWQgZHVyaW5nIHNlbGVjdGlvbgotICAgIC8vIGZvcm1hdENoYW5nZSAmJiAhc2Vla2luZzogdHJhY2sgd2hvc2Ugc291cmNlIGlzIG5vdCBjaGFuZ2VkIGR1cmluZyBzZWxlY3Rpb24KLSAgICAvLyAhZm9ybWF0Q2hhbmdlOiBub3JtYWwgc2VlawotICAgIGlmICgoc2Vla2luZyB8fCBmb3JtYXRDaGFuZ2UpCi0gICAgICAgICAgICAmJiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfQVVESU8KLSAgICAgICAgICAgIHx8IHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1ZJREVPKSkgewotICAgICAgICBBVFNQYXJzZXI6OkRpc2NvbnRpbnVpdHlUeXBlIHR5cGUgPSAoZm9ybWF0Q2hhbmdlICYmIHNlZWtpbmcpCi0gICAgICAgICAgICAgICAgPyBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFCi0gICAgICAgICAgICAgICAgOiBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfTk9ORTsKLSAgICAgICAgdHJhY2stPm1QYWNrZXRzLT5xdWV1ZURpc2NvbnRpbnVpdHkodHlwZSwgTlVMTCAvKiBleHRyYSAqLywgdHJ1ZSAvKiBkaXNjYXJkICovKTsKLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6bm90aWZ5QnVmZmVyaW5nVXBkYXRlKGludDMyX3QgcGVyY2VudGFnZSkgewotICAgIC8vIEJ1ZmZlcmluZyBwZXJjZW50IGNvdWxkIGdvIGJhY2t3YXJkIGFzIGl0J3MgZXN0aW1hdGVkIGZyb20gcmVtYWluaW5nCi0gICAgLy8gZGF0YSBhbmQgbGFzdCBhY2Nlc3MgdGltZS4gVGhpcyBjb3VsZCBjYXVzZSB0aGUgYnVmZmVyaW5nIHBvc2l0aW9uCi0gICAgLy8gZHJhd24gb24gbWVkaWEgY29udHJvbCB0byBqaXR0ZXIgc2xpZ2h0bHkuIFJlbWVtYmVyIHByZXZpb3VzbHkgcmVwb3J0ZWQKLSAgICAvLyBwZXJjZW50YWdlIGFuZCBkb24ndCBhbGxvdyBpdCB0byBnbyBiYWNrd2FyZC4KLSAgICBpZiAocGVyY2VudGFnZSA8IG1QcmV2QnVmZmVyUGVyY2VudGFnZSkgewotICAgICAgICBwZXJjZW50YWdlID0gbVByZXZCdWZmZXJQZXJjZW50YWdlOwotICAgIH0gZWxzZSBpZiAocGVyY2VudGFnZSA+IDEwMCkgewotICAgICAgICBwZXJjZW50YWdlID0gMTAwOwotICAgIH0KLQotICAgIG1QcmV2QnVmZmVyUGVyY2VudGFnZSA9IHBlcmNlbnRhZ2U7Ci0KLSAgICBBTE9HVigibm90aWZ5QnVmZmVyaW5nVXBkYXRlOiBidWZmZXJpbmcgJWQlJSIsIHBlcmNlbnRhZ2UpOwotCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEJ1ZmZlcmluZ1VwZGF0ZSk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigicGVyY2VudGFnZSIsIHBlcmNlbnRhZ2UpOwotICAgIG5vdGlmeS0+cG9zdCgpOwotfQotCi12b2lkIE51UGxheWVyMjo6R2VuZXJpY1NvdXJjZTI6OnNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbEJ1ZmZlcmluZywgdGhpcyk7Ci0gICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Qb2xsQnVmZmVyaW5nR2VuZXJhdGlvbik7Ci0gICAgLy8gRW5xdWlyZXMgYnVmZmVyaW5nIHN0YXR1cyBldmVyeSBzZWNvbmQuCi0gICAgbXNnLT5wb3N0KDEwMDAwMDBsbCk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6b25Qb2xsQnVmZmVyaW5nKCkgewotICAgIHN0YXR1c190IGZpbmFsU3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKLSAgICBpbnQ2NF90IGNhY2hlZER1cmF0aW9uVXMgPSAtMWxsOwotICAgIHNzaXplX3QgY2FjaGVkRGF0YVJlbWFpbmluZyA9IC0xOwotCi0gICAgaWYgKG1DYWNoZWRTb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBjYWNoZWREYXRhUmVtYWluaW5nID0gbUNhY2hlZFNvdXJjZS0+YXBwcm94RGF0YVJlbWFpbmluZygmZmluYWxTdGF0dXMpOwotCi0gICAgICAgIGlmIChmaW5hbFN0YXR1cyA9PSBPSykgewotICAgICAgICAgICAgb2ZmNjRfdCBzaXplOwotICAgICAgICAgICAgaW50NjRfdCBiaXRyYXRlID0gMGxsOwotICAgICAgICAgICAgaWYgKG1EdXJhdGlvblVzID4gMCAmJiBtQ2FjaGVkU291cmNlLT5nZXRTaXplKCZzaXplKSA9PSBPSykgewotICAgICAgICAgICAgICAgIC8vIHxiaXRyYXRlfCB1c2VzIGJpdHMvc2Vjb25kIHVuaXQsIHdoaWxlIHNpemUgaXMgbnVtYmVyIG9mIGJ5dGVzLgotICAgICAgICAgICAgICAgIGJpdHJhdGUgPSBzaXplICogODAwMDAwMGxsIC8gbUR1cmF0aW9uVXM7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1CaXRyYXRlID4gMCkgewotICAgICAgICAgICAgICAgIGJpdHJhdGUgPSBtQml0cmF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChiaXRyYXRlID4gMCkgewotICAgICAgICAgICAgICAgIGNhY2hlZER1cmF0aW9uVXMgPSBjYWNoZWREYXRhUmVtYWluaW5nICogODAwMDAwMGxsIC8gYml0cmF0ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChmaW5hbFN0YXR1cyAhPSBPSykgewotICAgICAgICBBTE9HVigib25Qb2xsQnVmZmVyaW5nOiBFT1MgKGZpbmFsU3RhdHVzID0gJWQpIiwgZmluYWxTdGF0dXMpOwotCi0gICAgICAgIGlmIChmaW5hbFN0YXR1cyA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUoMTAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoY2FjaGVkRHVyYXRpb25VcyA+PSAwbGwpIHsKLSAgICAgICAgaWYgKG1EdXJhdGlvblVzID4gMGxsKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IGNhY2hlZFBvc1VzID0gZ2V0TGFzdFJlYWRQb3NpdGlvbigpICsgY2FjaGVkRHVyYXRpb25VczsKLSAgICAgICAgICAgIGludCBwZXJjZW50YWdlID0gMTAwLjAgKiBjYWNoZWRQb3NVcyAvIG1EdXJhdGlvblVzOwotICAgICAgICAgICAgaWYgKHBlcmNlbnRhZ2UgPiAxMDApIHsKLSAgICAgICAgICAgICAgICBwZXJjZW50YWdlID0gMTAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUocGVyY2VudGFnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBBTE9HVigib25Qb2xsQnVmZmVyaW5nOiBjYWNoZWREdXJhdGlvblVzICUuMWYgc2VjIiwgY2FjaGVkRHVyYXRpb25VcyAvIDEwMDAwMDAuMGYpOwotICAgIH0KLQotICAgIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOwotfQotCi0vLyBNb2R1bGFyIERSTQotc3RhdHVzX3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6cHJlcGFyZURybSgKLSAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKLSAgICAgICAgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQsCi0gICAgICAgIHNwPEFNZWRpYUNyeXB0b1dyYXBwZXI+ICpvdXRDcnlwdG8pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIEFMT0dWKCJwcmVwYXJlRHJtIik7Ci0KLSAgICBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKLSAgICBtSXNEcm1SZWxlYXNlZCA9IGZhbHNlOwotICAgIG1Jc1NlY3VyZSA9IGZhbHNlOwotCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gT0s7Ci0gICAgc3A8QU1lZGlhQ3J5cHRvV3JhcHBlcj4gY3J5cHRvID0KLSAgICAgICAgbmV3IEFNZWRpYUNyeXB0b1dyYXBwZXIodXVpZCwgZHJtU2Vzc2lvbklkLmFycmF5KCksIGRybVNlc3Npb25JZC5zaXplKCkpOwotICAgIGlmIChjcnlwdG8gPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgicHJlcGFyZURybTogZmFpbGVkIHRvIGNyZWF0ZSBjcnlwdG8uIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLSAgICBBTE9HVigicHJlcGFyZURybTogY3J5cHRvIGNyZWF0ZWQgZm9yIHV1aWQ6ICVzIiwKLSAgICAgICAgICAgIERybVVVSUQ6OnRvSGV4U3RyaW5nKHV1aWQpLnN0cmluZygpKTsKLQotICAgICpvdXRDcnlwdG8gPSBjcnlwdG87Ci0gICAgLy8gYXMgbG9uZyBhIHRoZXJlIGlzIGFuIGFjdGl2ZSBjcnlwdG8KLSAgICBtSXNEcm1Qcm90ZWN0ZWQgPSB0cnVlOwotCi0gICAgaWYgKG1NaW1lcy5zaXplKCkgPT0gMCkgewotICAgICAgICBzdGF0dXMgPSBVTktOT1dOX0VSUk9SOwotICAgICAgICBBTE9HRSgicHJlcGFyZURybTogVW5leHBlY3RlZC4gTXVzdCBoYXZlIGF0IGxlYXN0IG9uZSB0cmFjay4gc3RhdHVzOiAlZCIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgLy8gZmlyc3QgbWltZSBpbiB0aGlzIGxpc3QgaXMgZWl0aGVyIHRoZSB2aWRlbyB0cmFjaywgb3IgdGhlIGZpcnN0IGF1ZGlvIHRyYWNrCi0gICAgY29uc3QgY2hhciAqbWltZSA9IG1NaW1lc1swXS5zdHJpbmcoKTsKLSAgICBtSXNTZWN1cmUgPSBjcnlwdG8tPnJlcXVpcmVzU2VjdXJlRGVjb2RlckNvbXBvbmVudChtaW1lKTsKLSAgICBBTE9HVigicHJlcGFyZURybTogcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50IG1pbWU6ICVzICBpc1NlY3VyZTogJWQiLAotICAgICAgICAgICAgbWltZSwgbUlzU2VjdXJlKTsKLQotICAgIC8vIENoZWNraW5nIHRoZSBtZW1iZXIgZmxhZ3Mgd2hpbGUgaW4gdGhlIGxvb3BlciB0byBzZW5kIG91dCB0aGUgbm90aWZpY2F0aW9uLgotICAgIC8vIFRoZSBsZWdhY3kgbURlY3J5cHRIYW5kbGUhPU5VTEwgY2hlY2sgKGZvciBGTEFHX1BST1RFQ1RFRCkgaXMgZXF1aXZhbGVudCB0byBtSXNEcm1Qcm90ZWN0ZWQuCi0gICAgbm90aWZ5RmxhZ3NDaGFuZ2VkKAotICAgICAgICAgICAgKG1Jc1NlY3VyZSA/IEZMQUdfU0VDVVJFIDogMCkgfAotICAgICAgICAgICAgLy8gU2V0dGluZyAicHJvdGVjdGVkIHNjcmVlbiIgb25seSBmb3IgTDE6IGIvMzgzOTA4MzYKLSAgICAgICAgICAgIChtSXNTZWN1cmUgPyBGTEFHX1BST1RFQ1RFRCA6IDApIHwKLSAgICAgICAgICAgIEZMQUdfQ0FOX1BBVVNFIHwKLSAgICAgICAgICAgIEZMQUdfQ0FOX1NFRUtfQkFDS1dBUkQgfAotICAgICAgICAgICAgRkxBR19DQU5fU0VFS19GT1JXQVJEIHwKLSAgICAgICAgICAgIEZMQUdfQ0FOX1NFRUspOwotCi0gICAgaWYgKHN0YXR1cyA9PSBPSykgewotICAgICAgICBBTE9HVigicHJlcGFyZURybTogbUNyeXB0bzogJXAiLCBvdXRDcnlwdG8tPmdldCgpKTsKLSAgICAgICAgQUxPR0QoInByZXBhcmVEcm0gcmV0OiAlZCAiLCBzdGF0dXMpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJwcmVwYXJlRHJtIGVycjogJWQiLCBzdGF0dXMpOwotICAgIH0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpyZWxlYXNlRHJtKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgQUxPR1YoInJlbGVhc2VEcm0iKTsKLQotICAgIGlmIChtSXNEcm1Qcm90ZWN0ZWQpIHsKLSAgICAgICAgbUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7Ci0gICAgICAgIC8vIHRvIHByZXZlbnQgcmV0dXJuaW5nIGFueSBtb3JlIGJ1ZmZlciBhZnRlciBzdG9wL3JlbGVhc2VEcm0gKGIvMzc5NjAwOTYpCi0gICAgICAgIG1Jc0RybVJlbGVhc2VkID0gdHJ1ZTsKLSAgICAgICAgQUxPR1YoInJlbGVhc2VEcm06IG1Jc0RybVByb3RlY3RlZCBpcyByZXNldC4iKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgicmVsZWFzZURybTogbUlzRHJtUHJvdGVjdGVkIGlzIGFscmVhZHkgZmFsc2UuIik7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjI6OkdlbmVyaWNTb3VyY2UyOjpjaGVja0RybUluZm8oKQotewotICAgIC8vIGNsZWFyaW5nIHRoZSBmbGFnIGF0IHByZXBhcmUgaW4gY2FzZSB0aGUgcGxheWVyIGlzIHJldXNlZCBhZnRlciBzdG9wL3JlbGVhc2VEcm0gd2l0aCB0aGUKLSAgICAvLyBzYW1lIHNvdXJjZSB3aXRob3V0IGJlaW5nIHJlc2V0IChjYWxsZWQgYnkgcHJlcGFyZUFzeW5jL2luaXRGcm9tRGF0YVNvdXJjZSkKLSAgICBtSXNEcm1SZWxlYXNlZCA9IGZhbHNlOwotCi0gICAgaWYgKG1FeHRyYWN0b3IgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiY2hlY2tEcm1JbmZvOiBObyBleHRyYWN0b3IiKTsKLSAgICAgICAgcmV0dXJuIE9LOyAvLyBsZXR0aW5nIHRoZSBjYWxsZXIgcmVzcG9uZHMgYWNjb3JkaW5nbHkKLSAgICB9Ci0KLSAgICBQc3NoSW5mbyAqcHNzaEluZm8gPSBtRXh0cmFjdG9yLT5nZXRQc3NoSW5mbygpOwotICAgIGlmIChwc3NoSW5mbyA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dWKCJjaGVja0RybUluZm86IE5vIFBTU0giKTsKLSAgICAgICAgcmV0dXJuIE9LOyAvLyBzb3VyY2Ugd2l0aG91dCBEUk0gaW5mbwotICAgIH0KLQotICAgIHNwPEFCdWZmZXI+IGRybUluZm9CdWZmZXIgPSBOdVBsYXllcjJEcm06OnJldHJpZXZlRHJtSW5mbyhwc3NoSW5mbyk7Ci0gICAgQUxPR1YoImNoZWNrRHJtSW5mbzogTUVESUFfRFJNX0lORk8gUFNTSCBkcm0gaW5mbyBzaXplOiAlZCIsIChpbnQpZHJtSW5mb0J1ZmZlci0+c2l6ZSgpKTsKLQotICAgIGlmIChkcm1JbmZvQnVmZmVyLT5zaXplKCkgPT0gMCkgewotICAgICAgICBBTE9HRSgiY2hlY2tEcm1JbmZvOiBVbmV4cGVjdGVkIHBhcmNlbCBzaXplOiAwIik7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIG5vdGlmeURybUluZm8oZHJtSW5mb0J1ZmZlcik7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMjo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpCi17Ci0gICAgLy9BTE9HVigic2lnbmFsQnVmZmVyUmV0dXJuZWQgJXAgIHJlZkNvdW50OiAlZCIsIGJ1ZmZlciwgYnVmZmVyLT5sb2NhbFJlZmNvdW50KCkpOwotCi0gICAgYnVmZmVyLT5zZXRPYnNlcnZlcihOVUxMKTsKLSAgICBidWZmZXItPnJlbGVhc2UoKTsgLy8gdGhpcyBsZWFkcyB0byBkZWxldGUgc2luY2UgdGhhdCB0aGVyZSBpcyBubyBvYnNlcnZvcgotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9HZW5lcmljU291cmNlMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmM1MTgyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvR2VuZXJpY1NvdXJjZTIuaAorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEdFTkVSSUNfU09VUkNFMl9IXwotCi0jZGVmaW5lIEdFTkVSSUNfU09VUkNFMl9IXwotCi0jaW5jbHVkZSAiTnVQbGF5ZXIyLmgiCi0jaW5jbHVkZSAiTnVQbGF5ZXIyU291cmNlLmgiCi0KLSNpbmNsdWRlICJBVFNQYXJzZXIuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL21lZGlhcGxheWVyMi5oPgotI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTmRrV3JhcHBlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERlY3J5cHRIYW5kbGU7Ci1zdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKLXN0cnVjdCBBUlRTUENvbnRyb2xsZXI7Ci1jbGFzcyBEYXRhU291cmNlOwotY2xhc3MgSURhdGFTb3VyY2U7Ci1jbGFzcyBJTWVkaWFTb3VyY2U7Ci1zdHJ1Y3QgTWVkaWFIVFRQU2VydmljZTsKLXN0cnVjdCBNZWRpYVNvdXJjZTsKLWNsYXNzIE1lZGlhQnVmZmVyOwotc3RydWN0IE1lZGlhQ2xvY2s7Ci1zdHJ1Y3QgTnVDYWNoZWRTb3VyY2UyOwotCi1zdHJ1Y3QgTnVQbGF5ZXIyOjpHZW5lcmljU291cmNlMiA6IHB1YmxpYyBOdVBsYXllcjI6OlNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgLy8gTW9kdWxhciBEUk0KLXsKLSAgICBHZW5lcmljU291cmNlMihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrKTsKLQotICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoCi0gICAgICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7Ci0KLSAgICBzdGF0dXNfdCBzZXREYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKLQotICAgIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4mIGRhdGFTb3VyY2UpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRCdWZmZXJpbmdTZXR0aW5ncygKLSAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgb3ZlcnJpZGU7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgdm9pZCBwcmVwYXJlQXN5bmMoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOwotICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7Ci0gICAgdmlydHVhbCB2b2lkIHBhdXNlKCk7Ci0gICAgdmlydHVhbCB2b2lkIHJlc3VtZSgpOwotCi0gICAgdmlydHVhbCB2b2lkIGRpc2Nvbm5lY3QoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZmVlZE1vcmVUU0RhdGEoKTsKLQotICAgIHZpcnR1YWwgc3A8TWV0YURhdGE+IGdldEZpbGVGb3JtYXRNZXRhKCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25Vcyk7Ci0gICAgdmlydHVhbCBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0OwotICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgdHJhY2tJbmRleCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzc2l6ZV90IGdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCB0cmFja0luZGV4LCBib29sIHNlbGVjdCwgaW50NjRfdCB0aW1lVXMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2Vla1RvKAotICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMsCi0gICAgICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbWluZygpIGNvbnN0OwotCi0gICAgLy8gTW9kdWxhciBEUk0KLSAgICB2aXJ0dWFsIHZvaWQgc2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlRHJtKAotICAgICAgICAgICAgY29uc3QgdWludDhfdCB1dWlkWzE2XSwKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkLAotICAgICAgICAgICAgc3A8QU1lZGlhQ3J5cHRvV3JhcHBlcj4gKm91dENyeXB0byk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VEcm0oKTsKLQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+R2VuZXJpY1NvdXJjZTIoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0KLSAgICB2aXJ0dWFsIHNwPEFNZXNzYWdlPiBnZXRGb3JtYXQoYm9vbCBhdWRpbyk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0TWV0YShib29sIGF1ZGlvKTsKLQotcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAga1doYXRQcmVwYXJlQXN5bmMsCi0gICAgICAgIGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEsCi0gICAgICAgIGtXaGF0RmV0Y2hUaW1lZFRleHREYXRhLAotICAgICAgICBrV2hhdFNlbmRTdWJ0aXRsZURhdGEsCi0gICAgICAgIGtXaGF0U2VuZEdsb2JhbFRpbWVkVGV4dERhdGEsCi0gICAgICAgIGtXaGF0U2VuZFRpbWVkVGV4dERhdGEsCi0gICAgICAgIGtXaGF0Q2hhbmdlQVZTb3VyY2UsCi0gICAgICAgIGtXaGF0UG9sbEJ1ZmZlcmluZywKLSAgICAgICAga1doYXRTZWVrLAotICAgICAgICBrV2hhdFJlYWRCdWZmZXIsCi0gICAgICAgIGtXaGF0U3RhcnQsCi0gICAgICAgIGtXaGF0UmVzdW1lLAotICAgICAgICBrV2hhdFNlY3VyZURlY29kZXJzSW5zdGFudGlhdGVkLAotICAgIH07Ci0KLSAgICBzdHJ1Y3QgVHJhY2sgewotICAgICAgICBzaXplX3QgbUluZGV4OwotICAgICAgICBzcDxBTWVkaWFFeHRyYWN0b3JXcmFwcGVyPiBtRXh0cmFjdG9yOwotICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtUGFja2V0czsKLSAgICB9OwotCi0gICAgaW50NjRfdCBtQXVkaW9UaW1lVXM7Ci0gICAgaW50NjRfdCBtQXVkaW9MYXN0RGVxdWV1ZVRpbWVVczsKLSAgICBpbnQ2NF90IG1WaWRlb1RpbWVVczsKLSAgICBpbnQ2NF90IG1WaWRlb0xhc3REZXF1ZXVlVGltZVVzOwotCi0gICAgQnVmZmVyaW5nU2V0dGluZ3MgbUJ1ZmZlcmluZ1NldHRpbmdzOwotICAgIGludDMyX3QgbVByZXZCdWZmZXJQZXJjZW50YWdlOwotICAgIGludDMyX3QgbVBvbGxCdWZmZXJpbmdHZW5lcmF0aW9uOwotICAgIGJvb2wgbVNlbnRQYXVzZU9uQnVmZmVyaW5nOwotCi0gICAgaW50MzJfdCBtQXVkaW9EYXRhR2VuZXJhdGlvbjsKLSAgICBpbnQzMl90IG1WaWRlb0RhdGFHZW5lcmF0aW9uOwotICAgIGludDMyX3QgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbjsKLSAgICBpbnQzMl90IG1GZXRjaFRpbWVkVGV4dERhdGFHZW5lcmF0aW9uOwotICAgIGludDY0X3QgbUR1cmF0aW9uVXM7Ci0gICAgYm9vbCBtQXVkaW9Jc1ZvcmJpczsKLSAgICAvLyBTZWN1cmUgY29kZWMgaXMgcmVxdWlyZWQuCi0gICAgYm9vbCBtSXNTZWN1cmU7Ci0gICAgYm9vbCBtSXNTdHJlYW1pbmc7Ci0gICAgdWlkX3QgbVVJRDsKLSAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiBtTWVkaWFDbG9jazsKLSAgICBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBtSFRUUFNlcnZpY2U7Ci0gICAgQVN0cmluZyBtVXJpOwotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IG1VcmlIZWFkZXJzOwotICAgIGludCBtRmQ7Ci0gICAgaW50NjRfdCBtT2Zmc2V0OwotICAgIGludDY0X3QgbUxlbmd0aDsKLQotICAgIGJvb2wgbURpc2Nvbm5lY3RlZDsKLSAgICBzcDxEYXRhU291cmNlPiBtRGF0YVNvdXJjZTsKLSAgICBzcDxOdUNhY2hlZFNvdXJjZTI+IG1DYWNoZWRTb3VyY2U7Ci0gICAgc3A8RGF0YVNvdXJjZT4gbUh0dHBTb3VyY2U7Ci0gICAgc3A8TWV0YURhdGE+IG1GaWxlTWV0YTsKLSAgICBzcDxBTWVkaWFEYXRhU291cmNlV3JhcHBlcj4gbURhdGFTb3VyY2VXcmFwcGVyOwotICAgIHNwPEFNZWRpYUV4dHJhY3RvcldyYXBwZXI+IG1FeHRyYWN0b3I7Ci0gICAgVmVjdG9yPHNwPEFNZWRpYUV4dHJhY3RvcldyYXBwZXI+ID4gbUV4dHJhY3RvcnM7Ci0gICAgYm9vbCBtU3RhcnRlZDsKLSAgICBib29sIG1QcmVwYXJpbmc7Ci0gICAgaW50NjRfdCBtQml0cmF0ZTsKLSAgICB1aW50MzJfdCBtUGVuZGluZ1JlYWRCdWZmZXJUeXBlczsKLSAgICBzcDxBQnVmZmVyPiBtR2xvYmFsVGltZWRUZXh0OwotCi0gICAgVHJhY2sgbVZpZGVvVHJhY2s7Ci0gICAgVHJhY2sgbUF1ZGlvVHJhY2s7Ci0gICAgVHJhY2sgbVN1YnRpdGxlVHJhY2s7Ci0gICAgVHJhY2sgbVRpbWVkVGV4dFRyYWNrOwotCi0gICAgbXV0YWJsZSBNdXRleCBtTG9jazsKLQotICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7Ci0KLSAgICB2b2lkIHJlc2V0RGF0YVNvdXJjZSgpOwotCi0gICAgc3RhdHVzX3QgaW5pdEZyb21EYXRhU291cmNlKCk7Ci0gICAgaW50NjRfdCBnZXRMYXN0UmVhZFBvc2l0aW9uKCk7Ci0KLSAgICB2b2lkIG5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChzdGF0dXNfdCBlcnIpOwotICAgIHZvaWQgb25TZWN1cmVEZWNvZGVyc0luc3RhbnRpYXRlZChzdGF0dXNfdCBlcnIpOwotICAgIHZvaWQgZmluaXNoUHJlcGFyZUFzeW5jKCk7Ci0gICAgc3RhdHVzX3Qgc3RhcnRTb3VyY2VzKCk7Ci0KLSAgICB2b2lkIG9uU2Vlayhjb25zdCBzcDxBTWVzc2FnZT4mIG1zZyk7Ci0gICAgc3RhdHVzX3QgZG9TZWVrKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSk7Ci0KLSAgICB2b2lkIG9uUHJlcGFyZUFzeW5jKCk7Ci0KLSAgICB2b2lkIGZldGNoVGV4dERhdGEoCi0gICAgICAgICAgICB1aW50MzJfdCB3aGF0LCBtZWRpYV90cmFja190eXBlIHR5cGUsCi0gICAgICAgICAgICBpbnQzMl90IGN1ckdlbiwgY29uc3Qgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4mIHBhY2tldHMsIGNvbnN0IHNwPEFNZXNzYWdlPiYgbXNnKTsKLQotICAgIHZvaWQgc2VuZEdsb2JhbFRleHREYXRhKAotICAgICAgICAgICAgdWludDMyX3Qgd2hhdCwKLSAgICAgICAgICAgIGludDMyX3QgY3VyR2VuLCBzcDxBTWVzc2FnZT4gbXNnKTsKLQotICAgIHZvaWQgc2VuZFRleHREYXRhKAotICAgICAgICAgICAgdWludDMyX3Qgd2hhdCwgbWVkaWFfdHJhY2tfdHlwZSB0eXBlLAotICAgICAgICAgICAgaW50MzJfdCBjdXJHZW4sIGNvbnN0IHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+JiBwYWNrZXRzLCBjb25zdCBzcDxBTWVzc2FnZT4mIG1zZyk7Ci0KLSAgICBzcDxBQnVmZmVyPiBtZWRpYUJ1ZmZlclRvQUJ1ZmZlcigKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqbWJ1ZiwKLSAgICAgICAgICAgIG1lZGlhX3RyYWNrX3R5cGUgdHJhY2tUeXBlKTsKLQotICAgIHZvaWQgcG9zdFJlYWRCdWZmZXIobWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUpOwotICAgIHZvaWQgb25SZWFkQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiYgbXNnKTsKLSAgICAvLyBXaGVuIHxtb2RlfCBpcyBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19DTE9TRVNULCB0aGUgYnVmZmVyIHJlYWQgc2hhbGwKLSAgICAvLyBpbmNsdWRlIGFuIGl0ZW0gaW5kaWNhdGluZyBza2lwcGluZyByZW5kZXJpbmcgYWxsIGJ1ZmZlcnMgd2l0aCB0aW1lc3RhbXAKLSAgICAvLyBlYXJsaWVyIHRoYW4gfHNlZWtUaW1lVXN8LgotICAgIC8vIEZvciBvdGhlciBtb2RlcywgdGhlIGJ1ZmZlciByZWFkIHdpbGwgbm90IGluY2x1ZGUgdGhlIGl0ZW0gYXMgYWJvdmUgaW4gb3JkZXIKLSAgICAvLyB0byBmYWNpbGl0YXRlIGZhc3Qgc2VlayBvcGVyYXRpb24uCi0gICAgdm9pZCByZWFkQnVmZmVyKAotICAgICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0cmFja1R5cGUsCi0gICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMgPSAtMWxsLAotICAgICAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMsCi0gICAgICAgICAgICBpbnQ2NF90ICphY3R1YWxUaW1lVXMgPSBOVUxMLCBib29sIGZvcm1hdENoYW5nZSA9IGZhbHNlKTsKLQotICAgIHZvaWQgcXVldWVEaXNjb250aW51aXR5SWZOZWVkZWQoCi0gICAgICAgICAgICBib29sIHNlZWtpbmcsIGJvb2wgZm9ybWF0Q2hhbmdlLCBtZWRpYV90cmFja190eXBlIHRyYWNrVHlwZSwgVHJhY2sgKnRyYWNrKTsKLQotICAgIHZvaWQgc2NoZWR1bGVQb2xsQnVmZmVyaW5nKCk7Ci0gICAgdm9pZCBvblBvbGxCdWZmZXJpbmcoKTsKLSAgICB2b2lkIG5vdGlmeUJ1ZmZlcmluZ1VwZGF0ZShpbnQzMl90IHBlcmNlbnRhZ2UpOwotCi0gICAgdm9pZCBzZW5kQ2FjaGVTdGF0cygpOwotCi0gICAgc3A8QU1lc3NhZ2U+IGdldEZvcm1hdF9sKGJvb2wgYXVkaW8pOwotICAgIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXRNZXRhX2woYm9vbCBhdWRpbyk7Ci0gICAgaW50MzJfdCBnZXREYXRhR2VuZXJhdGlvbihtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0OwotCi0gICAgLy8gTW9kdWxhciBEUk0KLSAgICAvLyBUaGUgc291cmNlIGlzIERSTSBwcm90ZWN0ZWQgYW5kIGlzIHByZXBhcmVkIGZvciBEUk0uCi0gICAgYm9vbCBtSXNEcm1Qcm90ZWN0ZWQ7Ci0gICAgLy8gcmVsZWFzZURybSBoYXMgYmVlbiBwcm9jZXNzZWQuCi0gICAgYm9vbCBtSXNEcm1SZWxlYXNlZDsKLSAgICBWZWN0b3I8U3RyaW5nOD4gbU1pbWVzOwotCi0gICAgc3RhdHVzX3QgY2hlY2tEcm1JbmZvKCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhHZW5lcmljU291cmNlMik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEdFTkVSSUNfU09VUkNFMl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9IVFRQTGl2ZVNvdXJjZTIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWRiY2JmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkhUVFBMaXZlU291cmNlMiIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkhUVFBMaXZlU291cmNlMi5oIgotCi0jaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgotI2luY2x1ZGUgIkxpdmVEYXRhU291cmNlLmgiCi0KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUhUVFBTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0KLS8vIGRlZmF1bHQgYnVmZmVyIHByZXBhcmUvcmVhZHkvdW5kZXJmbG93IG1hcmtzCi1zdGF0aWMgY29uc3QgaW50IGtSZWFkeU1hcmtNcyAgICAgPSA1MDAwOyAgLy8gNSBzZWNvbmRzCi1zdGF0aWMgY29uc3QgaW50IGtQcmVwYXJlTWFya01zICAgPSAxNTAwOyAgLy8gMS41IHNlY29uZHMKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1OdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6SFRUUExpdmVTb3VyY2UyKAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAotICAgICAgICBjb25zdCBjaGFyICp1cmwsCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKQotICAgIDogU291cmNlKG5vdGlmeSksCi0gICAgICBtSFRUUFNlcnZpY2UoaHR0cFNlcnZpY2UpLAotICAgICAgbVVSTCh1cmwpLAotICAgICAgbUZsYWdzKDApLAotICAgICAgbUZpbmFsUmVzdWx0KE9LKSwKLSAgICAgIG1PZmZzZXQoMCksCi0gICAgICBtRmV0Y2hTdWJ0aXRsZURhdGFHZW5lcmF0aW9uKDApLAotICAgICAgbUZldGNoTWV0YURhdGFHZW5lcmF0aW9uKDApLAotICAgICAgbUhhc01ldGFkYXRhKGZhbHNlKSwKLSAgICAgIG1NZXRhZGF0YVNlbGVjdGVkKGZhbHNlKSB7Ci0gICAgbUJ1ZmZlcmluZ1NldHRpbmdzLm1Jbml0aWFsTWFya01zID0ga1ByZXBhcmVNYXJrTXM7Ci0gICAgbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcyA9IGtSZWFkeU1hcmtNczsKLSAgICBpZiAoaGVhZGVycykgewotICAgICAgICBtRXh0cmFIZWFkZXJzID0gKmhlYWRlcnM7Ci0KLSAgICAgICAgc3NpemVfdCBpbmRleCA9Ci0gICAgICAgICAgICBtRXh0cmFIZWFkZXJzLmluZGV4T2ZLZXkoU3RyaW5nOCgieC1oaWRlLXVybHMtZnJvbS1sb2ciKSk7Ci0KLSAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgIG1GbGFncyB8PSBrRmxhZ0luY29nbml0bzsKLQotICAgICAgICAgICAgbUV4dHJhSGVhZGVycy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6On5IVFRQTGl2ZVNvdXJjZTIoKSB7Ci0gICAgaWYgKG1MaXZlU2Vzc2lvbiAhPSBOVUxMKSB7Ci0gICAgICAgIG1MaXZlU2Vzc2lvbi0+ZGlzY29ubmVjdCgpOwotCi0gICAgICAgIG1MaXZlTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtTGl2ZVNlc3Npb24tPmlkKCkpOwotICAgICAgICBtTGl2ZUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7Ci0gICAgICAgIG1MaXZlTG9vcGVyLT5zdG9wKCk7Ci0KLSAgICAgICAgbUxpdmVTZXNzaW9uLmNsZWFyKCk7Ci0gICAgICAgIG1MaXZlTG9vcGVyLmNsZWFyKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6Z2V0QnVmZmVyaW5nU2V0dGluZ3MoCi0gICAgICAgICAgICBCdWZmZXJpbmdTZXR0aW5ncyogYnVmZmVyaW5nIC8qIG5vbm51bGwgKi8pIHsKLSAgICAqYnVmZmVyaW5nID0gbUJ1ZmZlcmluZ1NldHRpbmdzOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6c2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgewotICAgIG1CdWZmZXJpbmdTZXR0aW5ncyA9IGJ1ZmZlcmluZzsKLQotICAgIGlmIChtTGl2ZVNlc3Npb24gIT0gTlVMTCkgewotICAgICAgICBtTGl2ZVNlc3Npb24tPnNldEJ1ZmZlcmluZ1NldHRpbmdzKG1CdWZmZXJpbmdTZXR0aW5ncyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpwcmVwYXJlQXN5bmMoKSB7Ci0gICAgaWYgKG1MaXZlTG9vcGVyID09IE5VTEwpIHsKLSAgICAgICAgbUxpdmVMb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICAgICAgbUxpdmVMb29wZXItPnNldE5hbWUoImh0dHAgbGl2ZSIpOwotICAgICAgICBtTGl2ZUxvb3Blci0+c3RhcnQoZmFsc2UsIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBjYW5DYWxsSmF2YSAqLyk7Ci0KLSAgICAgICAgbUxpdmVMb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKLSAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0U2Vzc2lvbk5vdGlmeSwgdGhpcyk7Ci0KLSAgICBtTGl2ZVNlc3Npb24gPSBuZXcgTGl2ZVNlc3Npb24oCi0gICAgICAgICAgICBub3RpZnksCi0gICAgICAgICAgICAobUZsYWdzICYga0ZsYWdJbmNvZ25pdG8pID8gTGl2ZVNlc3Npb246OmtGbGFnSW5jb2duaXRvIDogMCwKLSAgICAgICAgICAgIG1IVFRQU2VydmljZSk7Ci0KLSAgICBtTGl2ZUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1MaXZlU2Vzc2lvbik7Ci0KLSAgICBtTGl2ZVNlc3Npb24tPnNldEJ1ZmZlcmluZ1NldHRpbmdzKG1CdWZmZXJpbmdTZXR0aW5ncyk7Ci0gICAgbUxpdmVTZXNzaW9uLT5jb25uZWN0QXN5bmMoCi0gICAgICAgICAgICBtVVJMLmNfc3RyKCksIG1FeHRyYUhlYWRlcnMuaXNFbXB0eSgpID8gTlVMTCA6ICZtRXh0cmFIZWFkZXJzKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6c3RhcnQoKSB7Ci19Ci0KLXNwPE1ldGFEYXRhPiBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6Z2V0Rm9ybWF0TWV0YShib29sIGF1ZGlvKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGE7Ci0gICAgaWYgKG1MaXZlU2Vzc2lvbiAhPSBOVUxMKSB7Ci0gICAgICAgIG1MaXZlU2Vzc2lvbi0+Z2V0U3RyZWFtRm9ybWF0TWV0YSgKLSAgICAgICAgICAgICAgICBhdWRpbyA/IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPCi0gICAgICAgICAgICAgICAgICAgICAgOiBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9WSURFTywKLSAgICAgICAgICAgICAgICAmbWV0YSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1ldGE7Ci19Ci0KLXNwPEFNZXNzYWdlPiBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6Z2V0Rm9ybWF0KGJvb2wgYXVkaW8pIHsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YTsKLSAgICBzdGF0dXNfdCBlcnIgPSAtRVdPVUxEQkxPQ0s7Ci0gICAgaWYgKG1MaXZlU2Vzc2lvbiAhPSBOVUxMKSB7Ci0gICAgICAgIGVyciA9IG1MaXZlU2Vzc2lvbi0+Z2V0U3RyZWFtRm9ybWF0TWV0YSgKLSAgICAgICAgICAgICAgICBhdWRpbyA/IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPCi0gICAgICAgICAgICAgICAgICAgICAgOiBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9WSURFTywKLSAgICAgICAgICAgICAgICAmbWV0YSk7Ci0gICAgfQotCi0gICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKLSAgICBpZiAoZXJyID09IC1FV09VTERCTE9DSykgewotICAgICAgICBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKLSAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIGZvcm1hdDsKLSAgICB9Ci0KLSAgICBpZiAoZXJyICE9IE9LIHx8IGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShtZXRhLCAmZm9ybWF0KSAhPSBPSykgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgcmV0dXJuIGZvcm1hdDsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6OmZlZWRNb3JlVFNEYXRhKCkgewotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6OmRlcXVldWVBY2Nlc3NVbml0KAotICAgICAgICBib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCkgewotICAgIHJldHVybiBtTGl2ZVNlc3Npb24tPmRlcXVldWVBY2Nlc3NVbml0KAotICAgICAgICAgICAgYXVkaW8gPyBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9BVURJTwotICAgICAgICAgICAgICAgICAgOiBMaXZlU2Vzc2lvbjo6U1RSRUFNVFlQRV9WSURFTywKLSAgICAgICAgICAgIGFjY2Vzc1VuaXQpOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6Z2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25VcykgewotICAgIHJldHVybiBtTGl2ZVNlc3Npb24tPmdldER1cmF0aW9uKGR1cmF0aW9uVXMpOwotfQotCi1zaXplX3QgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6OmdldFRyYWNrQ291bnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1MaXZlU2Vzc2lvbi0+Z2V0VHJhY2tDb3VudCgpOwotfQotCi1zcDxBTWVzc2FnZT4gTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6OmdldFRyYWNrSW5mbyhzaXplX3QgdHJhY2tJbmRleCkgY29uc3QgewotICAgIHJldHVybiBtTGl2ZVNlc3Npb24tPmdldFRyYWNrSW5mbyh0cmFja0luZGV4KTsKLX0KLQotc3NpemVfdCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6Z2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0IHsKLSAgICBpZiAobUxpdmVTZXNzaW9uID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSBpZiAodHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX01FVEFEQVRBKSB7Ci0gICAgICAgIC8vIE1FRElBX1RSQUNLX1RZUEVfTUVUQURBVEEgaXMgYWx3YXlzIGxhc3QgdHJhY2sKLSAgICAgICAgLy8gbU1ldGFkYXRhU2VsZWN0ZWQgY2FuIG9ubHkgYmUgdHJ1ZSB3aGVuIG1IYXNNZXRhZGF0YSBpcyB0cnVlCi0gICAgICAgIHJldHVybiBtTWV0YWRhdGFTZWxlY3RlZCA/IChtTGl2ZVNlc3Npb24tPmdldFRyYWNrQ291bnQoKSAtIDEpIDogLTE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1MaXZlU2Vzc2lvbi0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgLyp0aW1lVXMqLykgewotICAgIGlmIChtTGl2ZVNlc3Npb24gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgYm9vbCBwb3N0RmV0Y2hNc2cgPSBmYWxzZSwgaXNTdWIgPSBmYWxzZTsKLSAgICBpZiAoIW1IYXNNZXRhZGF0YSB8fCB0cmFja0luZGV4ICE9IG1MaXZlU2Vzc2lvbi0+Z2V0VHJhY2tDb3VudCgpIC0gMSkgewotICAgICAgICBlcnIgPSBtTGl2ZVNlc3Npb24tPnNlbGVjdFRyYWNrKHRyYWNrSW5kZXgsIHNlbGVjdCk7Ci0gICAgICAgIHBvc3RGZXRjaE1zZyA9IHNlbGVjdDsKLSAgICAgICAgaXNTdWIgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIG1ldGFkYXRhIHRyYWNrOyBpLmUuIChtSGFzTWV0YWRhdGEgJiYgdHJhY2tJbmRleCA9PSBtTGl2ZVNlc3Npb24tPmdldFRyYWNrQ291bnQoKSAtIDEpCi0gICAgICAgIGlmIChtTWV0YWRhdGFTZWxlY3RlZCAmJiAhc2VsZWN0KSB7Ci0gICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgfSBlbHNlIGlmICghbU1ldGFkYXRhU2VsZWN0ZWQgJiYgc2VsZWN0KSB7Ci0gICAgICAgICAgICBwb3N0RmV0Y2hNc2cgPSB0cnVlOwotICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlcnIgPSBCQURfVkFMVUU7IC8vIGJlaGF2ZSBhcyBMaXZlU2Vzc2lvbjo6c2VsZWN0VHJhY2sKLSAgICAgICAgfQotCi0gICAgICAgIG1NZXRhZGF0YVNlbGVjdGVkID0gc2VsZWN0OwotICAgIH0KLQotICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgaW50MzJfdCAmZ2VuZXJhdGlvbiA9IGlzU3ViID8gbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbiA6IG1GZXRjaE1ldGFEYXRhR2VuZXJhdGlvbjsKLSAgICAgICAgZ2VuZXJhdGlvbisrOwotICAgICAgICBpZiAocG9zdEZldGNoTXNnKSB7Ci0gICAgICAgICAgICBpbnQzMl90IHdoYXQgPSBpc1N1YiA/IGtXaGF0RmV0Y2hTdWJ0aXRsZURhdGEgOiBrV2hhdEZldGNoTWV0YURhdGE7Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKHdoYXQsIHRoaXMpOwotICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIGdlbmVyYXRpb24pOwotICAgICAgICAgICAgbXNnLT5wb3N0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBMaXZlU2Vzc2lvbjo6c2VsZWN0VHJhY2sgcmV0dXJucyBCQURfVkFMVUUgd2hlbiBzZWxlY3RpbmcgdGhlIGN1cnJlbnRseQotICAgIC8vIHNlbGVjdGVkIHRyYWNrLCBvciB1bnNlbGVjdGluZyBhIG5vbi1zZWxlY3RlZCB0cmFjay4gSW4gdGhpcyBjYXNlIGl0J3MgYW4KLSAgICAvLyBuby1vcCBzbyB3ZSByZXR1cm4gT0suCi0gICAgcmV0dXJuIChlcnIgPT0gT0sgfHwgZXJyID09IEJBRF9WQUxVRSkgPyAoc3RhdHVzX3QpT0sgOiBlcnI7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpzZWVrVG8oaW50NjRfdCBzZWVrVGltZVVzLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKSB7Ci0gICAgaWYgKG1MaXZlU2Vzc2lvbi0+aXNTZWVrYWJsZSgpKSB7Ci0gICAgICAgIHJldHVybiBtTGl2ZVNlc3Npb24tPnNlZWtUbyhzZWVrVGltZVVzLCBtb2RlKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMjo6SFRUUExpdmVTb3VyY2UyOjpwb2xsRm9yUmF3RGF0YSgKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDMyX3QgY3VycmVudEdlbmVyYXRpb24sCi0gICAgICAgIExpdmVTZXNzaW9uOjpTdHJlYW1UeXBlIGZldGNoVHlwZSwgaW50MzJfdCBwdXNoV2hhdCkgewotCi0gICAgaW50MzJfdCBnZW5lcmF0aW9uOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKLQotICAgIGlmIChnZW5lcmF0aW9uICE9IGN1cnJlbnRHZW5lcmF0aW9uKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzcDxBQnVmZmVyPiBidWZmZXI7Ci0gICAgd2hpbGUgKG1MaXZlU2Vzc2lvbi0+ZGVxdWV1ZUFjY2Vzc1VuaXQoZmV0Y2hUeXBlLCAmYnVmZmVyKSA9PSBPSykgewotCi0gICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKLSAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIHB1c2hXaGF0KTsKLSAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGJ1ZmZlcik7Ci0KLSAgICAgICAgaW50NjRfdCB0aW1lVXMsIGJhc2VVcywgZGVsYXlVczsKLSAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgiYmFzZVVzIiwgJmJhc2VVcykpOwotICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0gICAgICAgIGRlbGF5VXMgPSBiYXNlVXMgKyB0aW1lVXMgLSBBTG9vcGVyOjpHZXROb3dVcygpOwotCi0gICAgICAgIGlmIChmZXRjaFR5cGUgPT0gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfU1VCVElUTEVTKSB7Ci0gICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICAgICAgICAgIG1zZy0+cG9zdChkZWxheVVzID4gMExMID8gZGVsYXlVcyA6IDBMTCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoZmV0Y2hUeXBlID09IExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX01FVEFEQVRBKSB7Ci0gICAgICAgICAgICBpZiAoZGVsYXlVcyA8IC0xMDAwMDAwTEwpIHsgLy8gMSBzZWNvbmQKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotICAgICAgICAgICAgLy8gcHVzaCBhbGwgY3VycmVudGx5IGF2YWlsYWJsZSBtZXRhZGF0YSBidWZmZXJzIGluIGVhY2ggaW52b2NhdGlvbiBvZiBwb2xsRm9yUmF3RGF0YQotICAgICAgICAgICAgLy8gY29udGludWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBUUkVTUEFTUygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gdHJ5IGFnYWluIGluIDEgc2Vjb25kCi0gICAgbXNnLT5wb3N0KDEwMDAwMDBMTCk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpIVFRQTGl2ZVNvdXJjZTI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewotICAgICAgICBjYXNlIGtXaGF0U2Vzc2lvbk5vdGlmeToKLSAgICAgICAgewotICAgICAgICAgICAgb25TZXNzaW9uTm90aWZ5KG1zZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRGZXRjaFN1YnRpdGxlRGF0YToKLSAgICAgICAgewotICAgICAgICAgICAgcG9sbEZvclJhd0RhdGEoCi0gICAgICAgICAgICAgICAgICAgIG1zZywgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgLyogZmV0Y2ggKi8gTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfU1VCVElUTEVTLAotICAgICAgICAgICAgICAgICAgICAvKiBwdXNoICovIGtXaGF0U3VidGl0bGVEYXRhKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0RmV0Y2hNZXRhRGF0YToKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFtTWV0YWRhdGFTZWxlY3RlZCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwb2xsRm9yUmF3RGF0YSgKLSAgICAgICAgICAgICAgICAgICAgbXNnLCBtRmV0Y2hNZXRhRGF0YUdlbmVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIC8qIGZldGNoICovIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX01FVEFEQVRBLAotICAgICAgICAgICAgICAgICAgICAvKiBwdXNoICovIGtXaGF0VGltZWRNZXRhRGF0YSk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFNvdXJjZTo6b25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMjo6b25TZXNzaW9uTm90aWZ5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgaW50MzJfdCB3aGF0OwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKLQotICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICBjYXNlIExpdmVTZXNzaW9uOjprV2hhdFByZXBhcmVkOgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBub3RpZnkgdGhlIGN1cnJlbnQgc2l6ZSBoZXJlIGlmIHdlIGhhdmUgaXQsIG90aGVyd2lzZSByZXBvcnQgYW4gaW5pdGlhbCBzaXplIG9mICgwLDApCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gZ2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKTsKLSAgICAgICAgICAgIGludDMyX3Qgd2lkdGg7Ci0gICAgICAgICAgICBpbnQzMl90IGhlaWdodDsKLSAgICAgICAgICAgIGlmIChmb3JtYXQgIT0gTlVMTCAmJgotICAgICAgICAgICAgICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpICYmIGZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgewotICAgICAgICAgICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoZm9ybWF0KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7Ci0gICAgICAgICAgICBpZiAobUxpdmVTZXNzaW9uLT5pc1NlZWthYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0NBTl9QQVVTRTsKLSAgICAgICAgICAgICAgICBmbGFncyB8PSBGTEFHX0NBTl9TRUVLOwotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfQ0FOX1NFRUtfQkFDS1dBUkQ7Ci0gICAgICAgICAgICAgICAgZmxhZ3MgfD0gRkxBR19DQU5fU0VFS19GT1JXQVJEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUxpdmVTZXNzaW9uLT5oYXNEeW5hbWljRHVyYXRpb24oKSkgewotICAgICAgICAgICAgICAgIGZsYWdzIHw9IEZMQUdfRFlOQU1JQ19EVVJBVElPTjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbm90aWZ5RmxhZ3NDaGFuZ2VkKGZsYWdzKTsKLQotICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBMaXZlU2Vzc2lvbjo6a1doYXRQcmVwYXJhdGlvbkZhaWxlZDoKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKLQotICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWQoZXJyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBMaXZlU2Vzc2lvbjo6a1doYXRTdHJlYW1zQ2hhbmdlZDoKLSAgICAgICAgewotICAgICAgICAgICAgdWludDMyX3QgY2hhbmdlZE1hc2s7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgICJjaGFuZ2VkTWFzayIsIChpbnQzMl90ICopJmNoYW5nZWRNYXNrKSk7Ci0KLSAgICAgICAgICAgIGJvb2wgYXVkaW8gPSBjaGFuZ2VkTWFzayAmIExpdmVTZXNzaW9uOjpTVFJFQU1UWVBFX0FVRElPOwotICAgICAgICAgICAgYm9vbCB2aWRlbyA9IGNoYW5nZWRNYXNrICYgTGl2ZVNlc3Npb246OlNUUkVBTVRZUEVfVklERU87Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseTsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInJlcGx5IiwgJnJlcGx5KSk7Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFF1ZXVlRGVjb2RlclNodXRkb3duKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImF1ZGlvIiwgYXVkaW8pOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigidmlkZW8iLCB2aWRlbyk7Ci0gICAgICAgICAgICBub3RpZnktPnNldE1lc3NhZ2UoInJlcGx5IiwgcmVwbHkpOwotICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgTGl2ZVNlc3Npb246OmtXaGF0QnVmZmVyaW5nU3RhcnQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFBhdXNlT25CdWZmZXJpbmdTdGFydCk7Ci0gICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBMaXZlU2Vzc2lvbjo6a1doYXRCdWZmZXJpbmdFbmQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFJlc3VtZU9uQnVmZmVyaW5nRW5kKTsKLSAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIGNhc2UgTGl2ZVNlc3Npb246OmtXaGF0QnVmZmVyaW5nVXBkYXRlOgotICAgICAgICB7Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7Ci0gICAgICAgICAgICBpbnQzMl90IHBlcmNlbnRhZ2U7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicGVyY2VudGFnZSIsICZwZXJjZW50YWdlKSk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRCdWZmZXJpbmdVcGRhdGUpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicGVyY2VudGFnZSIsIHBlcmNlbnRhZ2UpOwotICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgTGl2ZVNlc3Npb246OmtXaGF0TWV0YWRhdGFEZXRlY3RlZDoKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFtSGFzTWV0YWRhdGEpIHsKLSAgICAgICAgICAgICAgICBtSGFzTWV0YWRhdGEgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOwotICAgICAgICAgICAgICAgIC8vIG5vdGlmaWNhdGlvbiB3aXRob3V0IGJ1ZmZlciB0cmlnZ2VycyBNRURJQTJfSU5GT19NRVRBREFUQV9VUERBVEUKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRUaW1lZE1ldGFEYXRhKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBMaXZlU2Vzc2lvbjo6a1doYXRFcnJvcjoKLSAgICAgICAgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0hUVFBMaXZlU291cmNlMi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5N2QzNjUzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSFRUUExpdmVTb3VyY2UyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEhUVFBfTElWRV9TT1VSQ0UyX0hfCi0KLSNkZWZpbmUgSFRUUF9MSVZFX1NPVVJDRTJfSF8KLQotI2luY2x1ZGUgIk51UGxheWVyMi5oIgotI2luY2x1ZGUgIk51UGxheWVyMlNvdXJjZS5oIgotCi0jaW5jbHVkZSAiTGl2ZVNlc3Npb24uaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgTGl2ZVNlc3Npb247Ci0KLXN0cnVjdCBOdVBsYXllcjI6OkhUVFBMaXZlU291cmNlMiA6IHB1YmxpYyBOdVBsYXllcjI6OlNvdXJjZSB7Ci0gICAgSFRUUExpdmVTb3VyY2UyKAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlcmluZ1NldHRpbmdzKAotICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYygpOwotICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkZXF1ZXVlQWNjZXNzVW5pdChib29sIGF1ZGlvLCBzcDxBQnVmZmVyPiAqYWNjZXNzVW5pdCk7Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0TWV0YShib29sIGF1ZGlvKTsKLSAgICB2aXJ0dWFsIHNwPEFNZXNzYWdlPiBnZXRGb3JtYXQoYm9vbCBhdWRpbyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZlZWRNb3JlVFNEYXRhKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXREdXJhdGlvbihpbnQ2NF90ICpkdXJhdGlvblVzKTsKLSAgICB2aXJ0dWFsIHNpemVfdCBnZXRUcmFja0NvdW50KCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0VHJhY2tJbmZvKHNpemVfdCB0cmFja0luZGV4KSBjb25zdDsKLSAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIC8qIHR5cGUgKi8pIGNvbnN0OwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IHRpbWVVcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZWVrVG8oCi0gICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMsCi0gICAgICAgICAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQykgb3ZlcnJpZGU7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5IVFRQTGl2ZVNvdXJjZTIoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSBGbGFncyB7Ci0gICAgICAgIC8vIERvbid0IGxvZyBhbnkgVVJMcy4KLSAgICAgICAga0ZsYWdJbmNvZ25pdG8gPSAxLAotICAgIH07Ci0KLSAgICBlbnVtIHsKLSAgICAgICAga1doYXRTZXNzaW9uTm90aWZ5LAotICAgICAgICBrV2hhdEZldGNoU3VidGl0bGVEYXRhLAotICAgICAgICBrV2hhdEZldGNoTWV0YURhdGEsCi0gICAgfTsKLQotICAgIHNwPE1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKLSAgICBBU3RyaW5nIG1VUkw7Ci0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUV4dHJhSGVhZGVyczsKLSAgICB1aW50MzJfdCBtRmxhZ3M7Ci0gICAgc3RhdHVzX3QgbUZpbmFsUmVzdWx0OwotICAgIG9mZjY0X3QgbU9mZnNldDsKLSAgICBzcDxBTG9vcGVyPiBtTGl2ZUxvb3BlcjsKLSAgICBzcDxMaXZlU2Vzc2lvbj4gbUxpdmVTZXNzaW9uOwotICAgIGludDMyX3QgbUZldGNoU3VidGl0bGVEYXRhR2VuZXJhdGlvbjsKLSAgICBpbnQzMl90IG1GZXRjaE1ldGFEYXRhR2VuZXJhdGlvbjsKLSAgICBib29sIG1IYXNNZXRhZGF0YTsKLSAgICBib29sIG1NZXRhZGF0YVNlbGVjdGVkOwotICAgIEJ1ZmZlcmluZ1NldHRpbmdzIG1CdWZmZXJpbmdTZXR0aW5nczsKLQotICAgIHZvaWQgb25TZXNzaW9uTm90aWZ5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2b2lkIHBvbGxGb3JSYXdEYXRhKAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIGludDMyX3QgY3VycmVudEdlbmVyYXRpb24sCi0gICAgICAgICAgICBMaXZlU2Vzc2lvbjo6U3RyZWFtVHlwZSBmZXRjaFR5cGUsIGludDMyX3QgcHVzaFdoYXQpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSFRUUExpdmVTb3VyY2UyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gSFRUUF9MSVZFX1NPVVJDRTJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzlhMTA3MS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJKV2FrZUxvY2siCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJKV2FrZUxvY2suaCIKLQotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPHBvd2VybWFuYWdlci9Qb3dlck1hbmFnZXIuaD4KLQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vVE9ETzogdXNlIEpBVkEgUG93ZXJNYW5hZ2VyLCBpbnN0ZWFkIG9mIGJpbmRlcgotSldha2VMb2NrOjpKV2FrZUxvY2soKSA6Ci0gICAgbVBvd2VyTWFuYWdlcihOVUxMKSwKLSAgICBtV2FrZUxvY2tUb2tlbihOVUxMKSwKLSAgICBtV2FrZUxvY2tDb3VudCgwKSwKLSAgICBtRGVhdGhSZWNpcGllbnQobmV3IFBNRGVhdGhSZWNpcGllbnQodGhpcykpIHt9Ci0KLUpXYWtlTG9jazo6fkpXYWtlTG9jaygpIHsKLSAgICBpZiAobVBvd2VyTWFuYWdlciAhPSBOVUxMKSB7Ci0gICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKG1Qb3dlck1hbmFnZXIpOwotICAgICAgICBiaW5kZXItPnVubGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50KTsKLSAgICB9Ci0gICAgY2xlYXJQb3dlck1hbmFnZXIoKTsKLX0KLQotYm9vbCBKV2FrZUxvY2s6OmFjcXVpcmUoKSB7Ci0gICAgaWYgKG1XYWtlTG9ja0NvdW50ID09IDApIHsKLSAgICAgICAgQ0hFQ0sobVdha2VMb2NrVG9rZW4gPT0gTlVMTCk7Ci0gICAgICAgIGlmIChtUG93ZXJNYW5hZ2VyID09IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIHVzZSBjaGVja1NlcnZpY2UoKSB0byBhdm9pZCBibG9ja2luZyBpZiBwb3dlciBzZXJ2aWNlIGlzIG5vdCB1cCB5ZXQKLSAgICAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCktPmNoZWNrU2VydmljZShTdHJpbmcxNigicG93ZXIiKSk7Ci0gICAgICAgICAgICBpZiAoYmluZGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY291bGQgbm90IGdldCB0aGUgcG93ZXIgbWFuYWdlciBzZXJ2aWNlIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Qb3dlck1hbmFnZXIgPSBpbnRlcmZhY2VfY2FzdDxJUG93ZXJNYW5hZ2VyPihiaW5kZXIpOwotICAgICAgICAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAobVBvd2VyTWFuYWdlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBuZXcgQkJpbmRlcigpOwotICAgICAgICAgICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUG93ZXJNYW5hZ2VyLT5hY3F1aXJlV2FrZUxvY2soCi0gICAgICAgICAgICAgICAgICAgIFBPV0VSTUFOQUdFUl9QQVJUSUFMX1dBS0VfTE9DSywKLSAgICAgICAgICAgICAgICAgICAgYmluZGVyLCBTdHJpbmcxNigiSldha2VMb2NrIiksIFN0cmluZzE2KCJtZWRpYSIpKTsKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIG1XYWtlTG9ja1Rva2VuID0gYmluZGVyOwotICAgICAgICAgICAgICAgIG1XYWtlTG9ja0NvdW50Kys7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBtV2FrZUxvY2tDb3VudCsrOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEpXYWtlTG9jazo6cmVsZWFzZShib29sIGZvcmNlKSB7Ci0gICAgaWYgKG1XYWtlTG9ja0NvdW50ID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoZm9yY2UpIHsKLSAgICAgICAgLy8gRm9yY2Ugd2FrZWxvY2sgcmVsZWFzZSBiZWxvdyBieSBzZXR0aW5nIHJlZmVyZW5jZSBjb3VudCB0byAxLgotICAgICAgICBtV2FrZUxvY2tDb3VudCA9IDE7Ci0gICAgfQotICAgIGlmICgtLW1XYWtlTG9ja0NvdW50ID09IDApIHsKLSAgICAgICAgQ0hFQ0sobVdha2VMb2NrVG9rZW4gIT0gTlVMTCk7Ci0gICAgICAgIGlmIChtUG93ZXJNYW5hZ2VyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOwotICAgICAgICAgICAgbVBvd2VyTWFuYWdlci0+cmVsZWFzZVdha2VMb2NrKG1XYWtlTG9ja1Rva2VuLCAwIC8qIGZsYWdzICovKTsKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwotICAgICAgICB9Ci0gICAgICAgIG1XYWtlTG9ja1Rva2VuLmNsZWFyKCk7Ci0gICAgfQotfQotCi12b2lkIEpXYWtlTG9jazo6Y2xlYXJQb3dlck1hbmFnZXIoKSB7Ci0gICAgcmVsZWFzZSh0cnVlKTsKLSAgICBtUG93ZXJNYW5hZ2VyLmNsZWFyKCk7Ci19Ci0KLXZvaWQgSldha2VMb2NrOjpQTURlYXRoUmVjaXBpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpIHsKLSAgICBpZiAobVdha2VMb2NrICE9IE5VTEwpIHsKLSAgICAgICAgbVdha2VMb2NrLT5jbGVhclBvd2VyTWFuYWdlcigpOwotICAgIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL0pXYWtlTG9jay5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWNlODdlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvSldha2VMb2NrLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIEpfV0FLRUxPQ0tfSF8KLSNkZWZpbmUgSl9XQUtFTE9DS19IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPHBvd2VybWFuYWdlci9JUG93ZXJNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEpXYWtlTG9jayA6IHB1YmxpYyBSZWZCYXNlIHsKLQotcHVibGljOgotICAgIEpXYWtlTG9jaygpOwotCi0gICAgLy8gTk9URTogYWNxdWlyZSBhbmQgcmVsZWFzZSBhcmUgbm90IHRocmVhZCBzYWZlCi0KLSAgICAvLyByZXR1cm5zIHRydWUgaWYgd2FrZWxvY2sgd2FzIGFjcXVpcmVkCi0gICAgYm9vbCBhY3F1aXJlKCk7Ci0gICAgdm9pZCByZWxlYXNlKGJvb2wgZm9yY2UgPSBmYWxzZSk7Ci0KLSAgICB2aXJ0dWFsIH5KV2FrZUxvY2soKTsKLQotcHJpdmF0ZToKLSAgICBzcDxJUG93ZXJNYW5hZ2VyPiBtUG93ZXJNYW5hZ2VyOwotICAgIHNwPElCaW5kZXI+ICAgICAgIG1XYWtlTG9ja1Rva2VuOwotICAgIHVpbnQzMl90ICAgICAgICAgIG1XYWtlTG9ja0NvdW50OwotCi0gICAgY2xhc3MgUE1EZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7Ci0gICAgcHVibGljOgotICAgICAgICBleHBsaWNpdCBQTURlYXRoUmVjaXBpZW50KEpXYWtlTG9jayAqd2FrZUxvY2spIDogbVdha2VMb2NrKHdha2VMb2NrKSB7fQotICAgICAgICB2aXJ0dWFsIH5QTURlYXRoUmVjaXBpZW50KCkge30KLQotICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAotICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIFBNRGVhdGhSZWNpcGllbnQoY29uc3QgUE1EZWF0aFJlY2lwaWVudCYpOwotICAgICAgICBQTURlYXRoUmVjaXBpZW50JiBvcGVyYXRvcj0gKGNvbnN0IFBNRGVhdGhSZWNpcGllbnQmKTsKLQotICAgICAgICBKV2FrZUxvY2sgKm1XYWtlTG9jazsKLSAgICB9OwotCi0gICAgY29uc3Qgc3A8UE1EZWF0aFJlY2lwaWVudD4gbURlYXRoUmVjaXBpZW50OwotCi0gICAgdm9pZCBjbGVhclBvd2VyTWFuYWdlcigpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSldha2VMb2NrKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gSl9XQUtFTE9DS19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MzdiYmM4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDMxMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJOdVBsYXllcjIiCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJOdVBsYXllcjIuaCIKLQotI2luY2x1ZGUgIkhUVFBMaXZlU291cmNlMi5oIgotI2luY2x1ZGUgIk51UGxheWVyMkNDRGVjb2Rlci5oIgotI2luY2x1ZGUgIk51UGxheWVyMkRlY29kZXIuaCIKLSNpbmNsdWRlICJOdVBsYXllcjJEZWNvZGVyQmFzZS5oIgotI2luY2x1ZGUgIk51UGxheWVyMkRlY29kZXJQYXNzVGhyb3VnaC5oIgotI2luY2x1ZGUgIk51UGxheWVyMkRyaXZlci5oIgotI2luY2x1ZGUgIk51UGxheWVyMlJlbmRlcmVyLmgiCi0jaW5jbHVkZSAiTnVQbGF5ZXIyU291cmNlLmgiCi0jaW5jbHVkZSAiUlRTUFNvdXJjZTIuaCIKLSNpbmNsdWRlICJHZW5lcmljU291cmNlMi5oIgotI2luY2x1ZGUgIlRleHREZXNjcmlwdGlvbnMuaCIKLQotI2luY2x1ZGUgIkFUU1BhcnNlci5oIgotCi0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLQotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KLSNpbmNsdWRlIDxtZWRpYS9BVlN5bmNTZXR0aW5ncy5oPgotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VEZXNjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL05ka1dyYXBwZXIuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaGV4ZHVtcC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotCi0jaW5jbHVkZSAiRVNEUy5oIgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0KLSNpbmNsdWRlIDxzeXN0ZW0vd2luZG93Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdGljIHN0YXR1c190IHNlbmRNZXRhRGF0YVRvSGFsKHNwPE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rPiYgc2luaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpIHsKLSAgICBpbnQzMl90IHNhbXBsZVJhdGUgPSAwOwotICAgIGludDMyX3QgYml0UmF0ZSA9IDA7Ci0gICAgaW50MzJfdCBjaGFubmVsTWFzayA9IDA7Ci0gICAgaW50MzJfdCBkZWxheVNhbXBsZXMgPSAwOwotICAgIGludDMyX3QgcGFkZGluZ1NhbXBsZXMgPSAwOwotCi0gICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwotCi0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpKSB7Ci0gICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX09GRkxPQURfQ09ERUNfU0FNUExFX1JBVEUpLCBzYW1wbGVSYXRlKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbE1hc2ssICZjaGFubmVsTWFzaykpIHsKLSAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fT0ZGTE9BRF9DT0RFQ19OVU1fQ0hBTk5FTCksIGNoYW5uZWxNYXNrKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmJpdFJhdGUpKSB7Ci0gICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEFVRElPX09GRkxPQURfQ09ERUNfQVZHX0JJVF9SQVRFKSwgYml0UmF0ZSk7Ci0gICAgfQotICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUVuY29kZXJEZWxheSwgJmRlbGF5U2FtcGxlcykpIHsKLSAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fT0ZGTE9BRF9DT0RFQ19ERUxBWV9TQU1QTEVTKSwgZGVsYXlTYW1wbGVzKTsKLSAgICB9Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5RW5jb2RlclBhZGRpbmcsICZwYWRkaW5nU2FtcGxlcykpIHsKLSAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQVVESU9fT0ZGTE9BRF9DT0RFQ19QQURESU5HX1NBTVBMRVMpLCBwYWRkaW5nU2FtcGxlcyk7Ci0gICAgfQotCi0gICAgQUxPR1YoInNlbmRNZXRhRGF0YVRvSGFsOiBiaXRSYXRlICVkLCBzYW1wbGVSYXRlICVkLCBjaGFuTWFzayAlZCwiCi0gICAgICAgICAgImRlbGF5U2FtcGxlICVkLCBwYWRkaW5nU2FtcGxlICVkIiwgYml0UmF0ZSwgc2FtcGxlUmF0ZSwKLSAgICAgICAgICBjaGFubmVsTWFzaywgZGVsYXlTYW1wbGVzLCBwYWRkaW5nU2FtcGxlcyk7Ci0KLSAgICBzaW5rLT5zZXRQYXJhbWV0ZXJzKHBhcmFtLnRvU3RyaW5nKCkpOwotICAgIHJldHVybiBPSzsKLX0KLQotCi1zdHJ1Y3QgTnVQbGF5ZXIyOjpBY3Rpb24gOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgQWN0aW9uKCkge30KLQotICAgIHZpcnR1YWwgdm9pZCBleGVjdXRlKE51UGxheWVyMiAqcGxheWVyKSA9IDA7Ci0KLXByaXZhdGU6Ci0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQWN0aW9uKTsKLX07Ci0KLXN0cnVjdCBOdVBsYXllcjI6OlNlZWtBY3Rpb24gOiBwdWJsaWMgQWN0aW9uIHsKLSAgICBleHBsaWNpdCBTZWVrQWN0aW9uKGludDY0X3Qgc2Vla1RpbWVVcywgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSkKLSAgICAgICAgOiBtU2Vla1RpbWVVcyhzZWVrVGltZVVzKSwKLSAgICAgICAgICBtTW9kZShtb2RlKSB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIGV4ZWN1dGUoTnVQbGF5ZXIyICpwbGF5ZXIpIHsKLSAgICAgICAgcGxheWVyLT5wZXJmb3JtU2VlayhtU2Vla1RpbWVVcywgbU1vZGUpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBpbnQ2NF90IG1TZWVrVGltZVVzOwotICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1Nb2RlOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2Vla0FjdGlvbik7Ci19OwotCi1zdHJ1Y3QgTnVQbGF5ZXIyOjpSZXN1bWVEZWNvZGVyQWN0aW9uIDogcHVibGljIEFjdGlvbiB7Ci0gICAgZXhwbGljaXQgUmVzdW1lRGVjb2RlckFjdGlvbihib29sIG5lZWROb3RpZnkpCi0gICAgICAgIDogbU5lZWROb3RpZnkobmVlZE5vdGlmeSkgewotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBleGVjdXRlKE51UGxheWVyMiAqcGxheWVyKSB7Ci0gICAgICAgIHBsYXllci0+cGVyZm9ybVJlc3VtZURlY29kZXJzKG1OZWVkTm90aWZ5KTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgYm9vbCBtTmVlZE5vdGlmeTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlc3VtZURlY29kZXJBY3Rpb24pOwotfTsKLQotc3RydWN0IE51UGxheWVyMjo6U2V0U3VyZmFjZUFjdGlvbiA6IHB1YmxpYyBBY3Rpb24gewotICAgIGV4cGxpY2l0IFNldFN1cmZhY2VBY3Rpb24oY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3cpCi0gICAgICAgIDogbU5hdGl2ZVdpbmRvdyhud3cpIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgZXhlY3V0ZShOdVBsYXllcjIgKnBsYXllcikgewotICAgICAgICBwbGF5ZXItPnBlcmZvcm1TZXRTdXJmYWNlKG1OYXRpdmVXaW5kb3cpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gbU5hdGl2ZVdpbmRvdzsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNldFN1cmZhY2VBY3Rpb24pOwotfTsKLQotc3RydWN0IE51UGxheWVyMjo6Rmx1c2hEZWNvZGVyQWN0aW9uIDogcHVibGljIEFjdGlvbiB7Ci0gICAgRmx1c2hEZWNvZGVyQWN0aW9uKEZsdXNoQ29tbWFuZCBhdWRpbywgRmx1c2hDb21tYW5kIHZpZGVvKQotICAgICAgICA6IG1BdWRpbyhhdWRpbyksCi0gICAgICAgICAgbVZpZGVvKHZpZGVvKSB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIGV4ZWN1dGUoTnVQbGF5ZXIyICpwbGF5ZXIpIHsKLSAgICAgICAgcGxheWVyLT5wZXJmb3JtRGVjb2RlckZsdXNoKG1BdWRpbywgbVZpZGVvKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgRmx1c2hDb21tYW5kIG1BdWRpbzsKLSAgICBGbHVzaENvbW1hbmQgbVZpZGVvOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmx1c2hEZWNvZGVyQWN0aW9uKTsKLX07Ci0KLXN0cnVjdCBOdVBsYXllcjI6OlBvc3RNZXNzYWdlQWN0aW9uIDogcHVibGljIEFjdGlvbiB7Ci0gICAgZXhwbGljaXQgUG9zdE1lc3NhZ2VBY3Rpb24oY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpCi0gICAgICAgIDogbU1lc3NhZ2UobXNnKSB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIGV4ZWN1dGUoTnVQbGF5ZXIyICopIHsKLSAgICAgICAgbU1lc3NhZ2UtPnBvc3QoKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgc3A8QU1lc3NhZ2U+IG1NZXNzYWdlOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUG9zdE1lc3NhZ2VBY3Rpb24pOwotfTsKLQotLy8gVXNlIHRoaXMgaWYgdGhlcmUncyBubyBzdGF0ZSBuZWNlc3NhcnkgdG8gc2F2ZSBpbiBvcmRlciB0byBleGVjdXRlCi0vLyB0aGUgYWN0aW9uLgotc3RydWN0IE51UGxheWVyMjo6U2ltcGxlQWN0aW9uIDogcHVibGljIEFjdGlvbiB7Ci0gICAgdHlwZWRlZiB2b2lkIChOdVBsYXllcjI6OipBY3Rpb25GdW5jKSgpOwotCi0gICAgZXhwbGljaXQgU2ltcGxlQWN0aW9uKEFjdGlvbkZ1bmMgZnVuYykKLSAgICAgICAgOiBtRnVuYyhmdW5jKSB7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIGV4ZWN1dGUoTnVQbGF5ZXIyICpwbGF5ZXIpIHsKLSAgICAgICAgKHBsYXllci0+Km1GdW5jKSgpOwotICAgIH0KLQotcHJpdmF0ZToKLSAgICBBY3Rpb25GdW5jIG1GdW5jOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2ltcGxlQWN0aW9uKTsKLX07Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLU51UGxheWVyMjo6TnVQbGF5ZXIyKHBpZF90IHBpZCwgdWlkX3QgdWlkLCBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jaykKLSAgICA6IG1QSUQocGlkKSwKLSAgICAgIG1VSUQodWlkKSwKLSAgICAgIG1NZWRpYUNsb2NrKG1lZGlhQ2xvY2spLAotICAgICAgbVNvdXJjZUZsYWdzKDApLAotICAgICAgbU9mZmxvYWRBdWRpbyhmYWxzZSksCi0gICAgICBtQXVkaW9EZWNvZGVyR2VuZXJhdGlvbigwKSwKLSAgICAgIG1WaWRlb0RlY29kZXJHZW5lcmF0aW9uKDApLAotICAgICAgbVJlbmRlcmVyR2VuZXJhdGlvbigwKSwKLSAgICAgIG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMoMCksCi0gICAgICBtUHJldmlvdXNTZWVrVGltZVVzKDApLAotICAgICAgbUF1ZGlvRU9TKGZhbHNlKSwKLSAgICAgIG1WaWRlb0VPUyhmYWxzZSksCi0gICAgICBtU2NhblNvdXJjZXNQZW5kaW5nKGZhbHNlKSwKLSAgICAgIG1TY2FuU291cmNlc0dlbmVyYXRpb24oMCksCi0gICAgICBtUG9sbER1cmF0aW9uR2VuZXJhdGlvbigwKSwKLSAgICAgIG1UaW1lZFRleHRHZW5lcmF0aW9uKDApLAotICAgICAgbUZsdXNoaW5nQXVkaW8oTk9ORSksCi0gICAgICBtRmx1c2hpbmdWaWRlbyhOT05FKSwKLSAgICAgIG1SZXN1bWVQZW5kaW5nKGZhbHNlKSwKLSAgICAgIG1WaWRlb1NjYWxpbmdNb2RlKE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX1NDQUxFX1RPX1dJTkRPVyksCi0gICAgICBtUGxheWJhY2tTZXR0aW5ncyhBVURJT19QTEFZQkFDS19SQVRFX0RFRkFVTFQpLAotICAgICAgbVZpZGVvRnBzSGludCgtMS5mKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgIG1QcmVwYXJlZChmYWxzZSksCi0gICAgICBtUmVzZXR0aW5nKGZhbHNlKSwKLSAgICAgIG1Tb3VyY2VTdGFydGVkKGZhbHNlKSwKLSAgICAgIG1BdWRpb0RlY29kZXJFcnJvcihmYWxzZSksCi0gICAgICBtVmlkZW9EZWNvZGVyRXJyb3IoZmFsc2UpLAotICAgICAgbVBhdXNlZChmYWxzZSksCi0gICAgICBtUGF1c2VkQnlDbGllbnQodHJ1ZSksCi0gICAgICBtUGF1c2VkRm9yQnVmZmVyaW5nKGZhbHNlKSwKLSAgICAgIG1Jc0RybVByb3RlY3RlZChmYWxzZSksCi0gICAgICBtRGF0YVNvdXJjZVR5cGUoREFUQV9TT1VSQ0VfVFlQRV9OT05FKSB7Ci0gICAgQ0hFQ0sobWVkaWFDbG9jayAhPSBOVUxMKTsKLSAgICBjbGVhckZsdXNoQ29tcGxldGUoKTsKLX0KLQotTnVQbGF5ZXIyOjp+TnVQbGF5ZXIyKCkgewotfQotCi12b2lkIE51UGxheWVyMjo6c2V0RHJpdmVyKGNvbnN0IHdwPE51UGxheWVyMkRyaXZlcj4gJmRyaXZlcikgewotICAgIG1Ecml2ZXIgPSBkcml2ZXI7Ci19Ci0KLXN0YXRpYyBib29sIElzSFRUUExpdmVVUkwoY29uc3QgY2hhciAqdXJsKSB7Ci0gICAgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVybCwgNykKLSAgICAgICAgICAgIHx8ICFzdHJuY2FzZWNtcCgiaHR0cHM6Ly8iLCB1cmwsIDgpCi0gICAgICAgICAgICB8fCAhc3RybmNhc2VjbXAoImZpbGU6Ly8iLCB1cmwsIDcpKSB7Ci0gICAgICAgIHNpemVfdCBsZW4gPSBzdHJsZW4odXJsKTsKLSAgICAgICAgaWYgKGxlbiA+PSA1ICYmICFzdHJjYXNlY21wKCIubTN1OCIsICZ1cmxbbGVuIC0gNV0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChzdHJzdHIodXJsLCJtM3U4IikpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjI6OmNyZWF0ZU51UGxheWVyMlNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlRGVzYz4gJmRzZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFNvdXJjZT4gKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBVEFfU09VUkNFX1RZUEUgKmRhdGFTb3VyY2VUeXBlKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gTk9fRVJST1I7Ci0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFNvdXJjZU5vdGlmeSwgdGhpcyk7Ci0gICAgbm90aWZ5LT5zZXRJbnQ2NCgic3JjSWQiLCBkc2QtPm1JZCk7Ci0KLSAgICBzd2l0Y2ggKGRzZC0+bVR5cGUpIHsKLSAgICAgICAgY2FzZSBEYXRhU291cmNlRGVzYzo6VFlQRV9VUkw6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCA9IGRzZC0+bVVybC5jX3N0cigpOwotICAgICAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbih1cmwpOwotCi0gICAgICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UgPSBkc2QtPm1IdHRwU2VydmljZTsKLSAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzID0gJihkc2QtPm1IZWFkZXJzKTsKLQotICAgICAgICAgICAgaWYgKElzSFRUUExpdmVVUkwodXJsKSkgewotICAgICAgICAgICAgICAgICpzb3VyY2UgPSBuZXcgSFRUUExpdmVTb3VyY2UyKG5vdGlmeSwgaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycyk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZU51UGxheWVyMlNvdXJjZSBIVFRQTGl2ZVNvdXJjZTIgJXMiLCB1cmwpOwotICAgICAgICAgICAgICAgICpkYXRhU291cmNlVHlwZSA9IERBVEFfU09VUkNFX1RZUEVfSFRUUF9MSVZFOwotICAgICAgICAgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAodXJsLCAicnRzcDovLyIsIDcpKSB7Ci0gICAgICAgICAgICAgICAgKnNvdXJjZSA9IG5ldyBSVFNQU291cmNlMigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeSwgaHR0cFNlcnZpY2UsIHVybCwgaGVhZGVycywgbVVJRCk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZU51UGxheWVyMlNvdXJjZSBSVFNQU291cmNlMiAlcyIsIHVybCk7Ci0gICAgICAgICAgICAgICAgKmRhdGFTb3VyY2VUeXBlID0gREFUQV9TT1VSQ0VfVFlQRV9SVFNQOwotICAgICAgICAgICAgfSBlbHNlIGlmICgoIXN0cm5jYXNlY21wKHVybCwgImh0dHA6Ly8iLCA3KQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgIXN0cm5jYXNlY21wKHVybCwgImh0dHBzOi8vIiwgOCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKChsZW4gPj0gNCAmJiAhc3RyY2FzZWNtcCgiLnNkcCIsICZ1cmxbbGVuIC0gNF0pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHN0cnN0cih1cmwsICIuc2RwPyIpKSkgewotICAgICAgICAgICAgICAgICpzb3VyY2UgPSBuZXcgUlRTUFNvdXJjZTIoCi0gICAgICAgICAgICAgICAgICAgICAgICBub3RpZnksIGh0dHBTZXJ2aWNlLCB1cmwsIGhlYWRlcnMsIG1VSUQsIHRydWUpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVOdVBsYXllcjJTb3VyY2UgUlRTUFNvdXJjZTIgaHR0cC9odHRwcy8uc2RwICVzIiwgdXJsKTsKLSAgICAgICAgICAgICAgICAqZGF0YVNvdXJjZVR5cGUgPSBEQVRBX1NPVVJDRV9UWVBFX1JUU1A7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVOdVBsYXllcjJTb3VyY2UgR2VuZXJpY1NvdXJjZTIgJXMiLCB1cmwpOwotCi0gICAgICAgICAgICAgICAgc3A8R2VuZXJpY1NvdXJjZTI+IGdlbmVyaWNTb3VyY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNTb3VyY2UyKG5vdGlmeSwgbVVJRCwgbU1lZGlhQ2xvY2spOwotCi0gICAgICAgICAgICAgICAgZXJyID0gZ2VuZXJpY1NvdXJjZS0+c2V0RGF0YVNvdXJjZShodHRwU2VydmljZSwgdXJsLCBoZWFkZXJzKTsKLQotICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgKnNvdXJjZSA9IGdlbmVyaWNTb3VyY2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgKnNvdXJjZSA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIE51UGxheWVyMlNvdXJjZSEiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyByZWdhcmRsZXNzIG9mIHN1Y2Nlc3MvZmFpbHVyZQotICAgICAgICAgICAgICAgICpkYXRhU291cmNlVHlwZSA9IERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19VUkw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRGF0YVNvdXJjZURlc2M6OlRZUEVfRkQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPEdlbmVyaWNTb3VyY2UyPiBnZW5lcmljU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNTb3VyY2UyKG5vdGlmeSwgbVVJRCwgbU1lZGlhQ2xvY2spOwotCi0gICAgICAgICAgICBBTE9HVigiY3JlYXRlTnVQbGF5ZXIyU291cmNlIGZkICVkLyVsbGQvJWxsZCBzb3VyY2U6ICVwIiwKLSAgICAgICAgICAgICAgICAgIGRzZC0+bUZELCAobG9uZyBsb25nKWRzZC0+bUZET2Zmc2V0LCAobG9uZyBsb25nKWRzZC0+bUZETGVuZ3RoLAotICAgICAgICAgICAgICAgICAgZ2VuZXJpY1NvdXJjZS5nZXQoKSk7Ci0KLSAgICAgICAgICAgIGVyciA9IGdlbmVyaWNTb3VyY2UtPnNldERhdGFTb3VyY2UoZHNkLT5tRkQsIGRzZC0+bUZET2Zmc2V0LCBkc2QtPm1GRExlbmd0aCk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBOdVBsYXllcjJTb3VyY2UhIik7Ci0gICAgICAgICAgICAgICAgKnNvdXJjZSA9IE5VTEw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpzb3VyY2UgPSBnZW5lcmljU291cmNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAqZGF0YVNvdXJjZVR5cGUgPSBEQVRBX1NPVVJDRV9UWVBFX0dFTkVSSUNfRkQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRGF0YVNvdXJjZURlc2M6OlRZUEVfQ0FMTEJBQ0s6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPEdlbmVyaWNTb3VyY2UyPiBnZW5lcmljU291cmNlID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IEdlbmVyaWNTb3VyY2UyKG5vdGlmeSwgbVVJRCwgbU1lZGlhQ2xvY2spOwotICAgICAgICAgICAgZXJyID0gZ2VuZXJpY1NvdXJjZS0+c2V0RGF0YVNvdXJjZShkc2QtPm1DYWxsYmFja1NvdXJjZSk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBOdVBsYXllcjJTb3VyY2UhIik7Ci0gICAgICAgICAgICAgICAgKnNvdXJjZSA9IE5VTEw7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICpzb3VyY2UgPSBnZW5lcmljU291cmNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAqZGF0YVNvdXJjZVR5cGUgPSBEQVRBX1NPVVJDRV9UWVBFX01FRElBOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgZXJyID0gQkFEX1RZUEU7Ci0gICAgICAgICAgICAqc291cmNlID0gTlVMTDsKLSAgICAgICAgICAgICpkYXRhU291cmNlVHlwZSA9IERBVEFfU09VUkNFX1RZUEVfTk9ORTsKLSAgICAgICAgICAgIEFMT0dFKCJpbnZhbGlkIGRhdGEgc291cmNlIHR5cGUhIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi12b2lkIE51UGxheWVyMjo6c2V0RGF0YVNvdXJjZUFzeW5jKGNvbnN0IHNwPERhdGFTb3VyY2VEZXNjPiAmZHNkKSB7Ci0gICAgREFUQV9TT1VSQ0VfVFlQRSBkYXRhU291cmNlVHlwZTsKLSAgICBzcDxTb3VyY2U+IHNvdXJjZTsKLSAgICBjcmVhdGVOdVBsYXllcjJTb3VyY2UoZHNkLCAmc291cmNlLCAmZGF0YVNvdXJjZVR5cGUpOwotCi0gICAgLy8gVE9ETzogY3VycmVudGx5IE51UGxheWVyMkRyaXZlciBtYWtlcyBibG9ja2luZyBjYWxsIHRvIHNldERhdGFTb3VyY2VBc3luYwotICAgIC8vIGFuZCBleHBlY3RzIG5vdGlmeVNldERhdGFTb3VyY2VDb21wbGV0ZWQgcmVnYXJkbGVzcyBvZiBzdWNjZXNzIG9yIGZhaWx1cmUuCi0gICAgLy8gVGhpcyB3aWxsIGJlIGNoYW5nZWQgc2luY2Ugc2V0RGF0YVNvdXJjZSBzaG91bGQgYmUgYXN5bmNocm9ub3VzIGF0IEpBVkEgbGV2ZWwuCi0gICAgLy8gV2hlbiBpdCBzdWNjZWVkcywgYXBwIHdpbGwgZ2V0IG9uSW5mbyBub3RpZmljYXRpb24uIE90aGVyd2lzZSwgb25FcnJvcgotICAgIC8vIHdpbGwgYmUgY2FsbGVkLgotICAgIC8qCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBub3RpZnlMaXN0ZW5lcihkc2QtPm1JZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfRkFJTEVEX1RPX1NFVF9EQVRBX1NPVVJDRSwgZXJyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIE5vdywgc291cmNlICE9IE5VTEwuCi0gICAgKi8KLQotICAgIG1EYXRhU291cmNlVHlwZSA9IGRhdGFTb3VyY2VUeXBlOwotCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldERhdGFTb3VyY2UsIHRoaXMpOwotICAgIG1zZy0+c2V0T2JqZWN0KCJzb3VyY2UiLCBzb3VyY2UpOwotICAgIG1zZy0+c2V0SW50NjQoInNyY0lkIiwgZHNkLT5tSWQpOwotICAgIG1zZy0+cG9zdCgpOwotfQotCi12b2lkIE51UGxheWVyMjo6cHJlcGFyZU5leHREYXRhU291cmNlQXN5bmMoY29uc3Qgc3A8RGF0YVNvdXJjZURlc2M+ICZkc2QpIHsKLSAgICBEQVRBX1NPVVJDRV9UWVBFIGRhdGFTb3VyY2VUeXBlOwotICAgIHNwPFNvdXJjZT4gc291cmNlOwotICAgIGNyZWF0ZU51UGxheWVyMlNvdXJjZShkc2QsICZzb3VyY2UsICZkYXRhU291cmNlVHlwZSk7Ci0KLSAgICAvKgotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXIoZHNkLT5tSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX0ZBSUxFRF9UT19TRVRfREFUQV9TT1VSQ0UsIGVycik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBOb3csIHNvdXJjZSAhPSBOVUxMLgotICAgICovCi0KLSAgICBtTmV4dERhdGFTb3VyY2VUeXBlID0gZGF0YVNvdXJjZVR5cGU7Ci0KLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UHJlcGFyZU5leHREYXRhU291cmNlLCB0aGlzKTsKLSAgICBtc2ctPnNldE9iamVjdCgic291cmNlIiwgc291cmNlKTsKLSAgICBtc2ctPnNldEludDY0KCJzcmNJZCIsIGRzZC0+bUlkKTsKLSAgICBtc2ctPnBvc3QoKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OnBsYXlOZXh0RGF0YVNvdXJjZShpbnQ2NF90IHNyY0lkKSB7Ci0gICAgZGlzY29ubmVjdFNvdXJjZSgpOwotCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBsYXlOZXh0RGF0YVNvdXJjZSwgdGhpcyk7Ci0gICAgbXNnLT5zZXRJbnQ2NCgic3JjSWQiLCBzcmNJZCk7Ci0gICAgbXNnLT5wb3N0KCk7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMjo6Z2V0QnVmZmVyaW5nU2V0dGluZ3MoCi0gICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzICpidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRCdWZmZXJpbmdTZXR0aW5ncywgdGhpcyk7Ci0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLSAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKLSAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOwotICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKHJlc3BvbnNlLCBidWZmZXJpbmcpOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMjo6c2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZXRCdWZmZXJpbmdTZXR0aW5ncywgdGhpcyk7Ci0gICAgd3JpdGVUb0FNZXNzYWdlKG1zZywgYnVmZmVyaW5nKTsKLSAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwotICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgewotICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpwcmVwYXJlQXN5bmMoKSB7Ci0gICAgQUxPR1YoInByZXBhcmVBc3luYyIpOwotCi0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFByZXBhcmUsIHRoaXMpKS0+cG9zdCgpOwotfQotCi12b2lkIE51UGxheWVyMjo6c2V0VmlkZW9TdXJmYWNlVGV4dHVyZUFzeW5jKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbnd3KSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFZpZGVvU3VyZmFjZSwgdGhpcyk7Ci0KLSAgICBpZiAobnd3ID09IE5VTEwgfHwgbnd3LT5nZXRBTmF0aXZlV2luZG93KCkgPT0gTlVMTCkgewotICAgICAgICBtc2ctPnNldE9iamVjdCgic3VyZmFjZSIsIE5VTEwpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1zZy0+c2V0T2JqZWN0KCJzdXJmYWNlIiwgbnd3KTsKLSAgICB9Ci0KLSAgICBtc2ctPnBvc3QoKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OnNldEF1ZGlvU2luayhjb25zdCBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luaz4gJnNpbmspIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0QXVkaW9TaW5rLCB0aGlzKTsKLSAgICBtc2ctPnNldE9iamVjdCgic2luayIsIHNpbmspOwotICAgIG1zZy0+cG9zdCgpOwotfQotCi12b2lkIE51UGxheWVyMjo6c3RhcnQoKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFN0YXJ0LCB0aGlzKSktPnBvc3QoKTsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyOjpzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKSB7Ci0gICAgLy8gZG8gc29tZSBjdXJzb3J5IHZhbGlkYXRpb24gb2YgdGhlIHNldHRpbmdzIGhlcmUuIGF1ZGlvIG1vZGVzIGFyZQotICAgIC8vIG9ubHkgdmFsaWRhdGVkIHdoZW4gc2V0IG9uIHRoZSBhdWRpb3NpbmsuCi0gICAgIGlmICgocmF0ZS5tU3BlZWQgIT0gMC5mICYmIHJhdGUubVNwZWVkIDwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOKQotICAgICAgICAgICAgfHwgcmF0ZS5tU3BlZWQgPiBBVURJT19USU1FU1RSRVRDSF9TUEVFRF9NQVgKLSAgICAgICAgICAgIHx8IHJhdGUubVBpdGNoIDwgQVVESU9fVElNRVNUUkVUQ0hfU1BFRURfTUlOCi0gICAgICAgICAgICB8fCByYXRlLm1QaXRjaCA+IEFVRElPX1RJTUVTVFJFVENIX1NQRUVEX01BWCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlnUGxheWJhY2ssIHRoaXMpOwotICAgIHdyaXRlVG9BTWVzc2FnZShtc2csIHJhdGUpOwotICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKLSAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7Ci0gICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7Ci0gICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlIC8qIG5vbm51bGwgKi8pIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0UGxheWJhY2tTZXR0aW5ncywgdGhpcyk7Ci0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLSAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKLSAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOwotICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKHJlc3BvbnNlLCByYXRlKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjI6OnNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyAmc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENvbmZpZ1N5bmMsIHRoaXMpOwotICAgIHdyaXRlVG9BTWVzc2FnZShtc2csIHN5bmMsIHZpZGVvRnBzSGludCk7Ci0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLSAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKLSAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjI6OmdldFN5bmNTZXR0aW5ncygKLSAgICAgICAgQVZTeW5jU2V0dGluZ3MgKnN5bmMgLyogbm9ubnVsbCAqLywgZmxvYXQgKnZpZGVvRnBzIC8qIG5vbm51bGwgKi8pIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0U3luY1NldHRpbmdzLCB0aGlzKTsKLSAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwotICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgewotICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7Ci0gICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgIHJlYWRGcm9tQU1lc3NhZ2UocmVzcG9uc2UsIHN5bmMsIHZpZGVvRnBzKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi12b2lkIE51UGxheWVyMjo6cGF1c2UoKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCB0aGlzKSktPnBvc3QoKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OnJlc2V0QXN5bmMoKSB7Ci0gICAgZGlzY29ubmVjdFNvdXJjZSgpOwotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRSZXNldCwgdGhpcykpLT5wb3N0KCk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpkaXNjb25uZWN0U291cmNlKCkgewotICAgIHNwPFNvdXJjZT4gc291cmNlOwotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Tb3VyY2VMb2NrKTsKLSAgICAgICAgc291cmNlID0gbVNvdXJjZTsKLSAgICB9Ci0KLSAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgLy8gRHVyaW5nIGEgcmVzZXQsIHRoZSBkYXRhIHNvdXJjZSBtaWdodCBiZSB1bnJlc3BvbnNpdmUgYWxyZWFkeSwgd2UgbmVlZCB0bwotICAgICAgICAvLyBkaXNjb25uZWN0IGV4cGxpY2l0bHkgc28gdGhhdCByZWFkcyBleGl0IHByb21wdGx5LgotICAgICAgICAvLyBXZSBjYW4ndCBxdWV1ZSB0aGUgZGlzY29ubmVjdCByZXF1ZXN0IHRvIHRoZSBsb29wZXIsIGFzIGl0IG1pZ2h0IGJlCi0gICAgICAgIC8vIHF1ZXVlZCBiZWhpbmQgYSBzdHVjayByZWFkIGFuZCBuZXZlciBnZXRzIHByb2Nlc3NlZC4KLSAgICAgICAgLy8gRG9pbmcgYSBkaXNjb25uZWN0IG91dHNpZGUgdGhlIGxvb3BlciB0byBhbGxvd3MgdGhlIHBlbmRpbmcgcmVhZHMgdG8gZXhpdAotICAgICAgICAvLyAoZWl0aGVyIHN1Y2Nlc3NmdWxseSBvciB3aXRoIGVycm9yKS4KLSAgICAgICAgc291cmNlLT5kaXNjb25uZWN0KCk7Ci0gICAgfQotCi19Ci0KLXN0YXR1c190IE51UGxheWVyMjo6bm90aWZ5QXQoaW50NjRfdCBtZWRpYVRpbWVVcykgewotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXROb3RpZnlUaW1lLCB0aGlzKTsKLSAgICBub3RpZnktPnNldEludDY0KCJ0aW1lclVzIiwgbWVkaWFUaW1lVXMpOwotICAgIG1NZWRpYUNsb2NrLT5hZGRUaW1lcihub3RpZnksIG1lZGlhVGltZVVzKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpzZWVrVG9Bc3luYyhpbnQ2NF90IHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUsIGJvb2wgbmVlZE5vdGlmeSkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWVrLCB0aGlzKTsKLSAgICBtc2ctPnNldEludDY0KCJzZWVrVGltZVVzIiwgc2Vla1RpbWVVcyk7Ci0gICAgbXNnLT5zZXRJbnQzMigibW9kZSIsIG1vZGUpOwotICAgIG1zZy0+c2V0SW50MzIoIm5lZWROb3RpZnkiLCBuZWVkTm90aWZ5KTsKLSAgICBtc2ctPnBvc3QoKTsKLX0KLQotCi12b2lkIE51UGxheWVyMjo6d3JpdGVUcmFja0luZm8oCi0gICAgICAgIFBhcmNlbCogcmVwbHksIGNvbnN0IHNwPEFNZXNzYWdlPiYgZm9ybWF0KSBjb25zdCB7Ci0gICAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJOVUxMIGZvcm1hdCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludDMyX3QgdHJhY2tUeXBlOwotICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoInR5cGUiLCAmdHJhY2tUeXBlKSkgewotICAgICAgICBBTE9HRSgibm8gdHJhY2sgdHlwZSIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQVN0cmluZyBtaW1lOwotICAgIGlmICghZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKSB7Ci0gICAgICAgIC8vIEphdmEgTWVkaWFQbGF5ZXIgb25seSB1c2VzIG1pbWV0eXBlIGZvciBzdWJ0aXRsZSBhbmQgdGltZWR0ZXh0IHRyYWNrcy4KLSAgICAgICAgLy8gSWYgd2UgY2FuJ3QgZmluZCB0aGUgbWltZXR5cGUgaGVyZSBpdCBtZWFucyB0aGF0IHdlIHdvdWxkbid0IGJlIG5lZWRpbmcKLSAgICAgICAgLy8gdGhlIG1pbWV0eXBlIG9uIHRoZSBKYXZhIGVuZC4gV2Ugc3RpbGwgd3JpdGUgYSBwbGFjZWhvbGRlciBtaW1lIHRvIGtlZXAgdGhlCi0gICAgICAgIC8vIChkZSlzZXJpYWxpemF0aW9uIGxvZ2ljIHNpbXBsZS4KLSAgICAgICAgaWYgKHRyYWNrVHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX0FVRElPKSB7Ci0gICAgICAgICAgICBtaW1lID0gImF1ZGlvLyI7Ci0gICAgICAgIH0gZWxzZSBpZiAodHJhY2tUeXBlID09IE1FRElBX1RSQUNLX1RZUEVfVklERU8pIHsKLSAgICAgICAgICAgIG1pbWUgPSAidmlkZW8vIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJ1bmtub3duIHRyYWNrIHR5cGU6ICVkIiwgdHJhY2tUeXBlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFTdHJpbmcgbGFuZzsKLSAgICBpZiAoIWZvcm1hdC0+ZmluZFN0cmluZygibGFuZ3VhZ2UiLCAmbGFuZykpIHsKLSAgICAgICAgQUxPR0UoIm5vIGxhbmd1YWdlIik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICByZXBseS0+d3JpdGVJbnQzMigyKTsgLy8gd3JpdGUgc29tZXRoaW5nIG5vbi16ZXJvCi0gICAgcmVwbHktPndyaXRlSW50MzIodHJhY2tUeXBlKTsKLSAgICByZXBseS0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNihtaW1lLmNfc3RyKCkpKTsKLSAgICByZXBseS0+d3JpdGVTdHJpbmcxNihTdHJpbmcxNihsYW5nLmNfc3RyKCkpKTsKLQotICAgIGlmICh0cmFja1R5cGUgPT0gTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRSkgewotICAgICAgICBpbnQzMl90IGlzQXV0bywgaXNEZWZhdWx0LCBpc0ZvcmNlZDsKLSAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoImF1dG8iLCAmaXNBdXRvKSk7Ci0gICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJkZWZhdWx0IiwgJmlzRGVmYXVsdCkpOwotICAgICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiZm9yY2VkIiwgJmlzRm9yY2VkKSk7Ci0KLSAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNBdXRvKTsKLSAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNEZWZhdWx0KTsKLSAgICAgICAgcmVwbHktPndyaXRlSW50MzIoaXNGb3JjZWQpOwotICAgIH0KLX0KLQotdm9pZCBOdVBsYXllcjI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewotICAgICAgICBjYXNlIGtXaGF0U2V0RGF0YVNvdXJjZToKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoImtXaGF0U2V0RGF0YVNvdXJjZSIpOwotCi0gICAgICAgICAgICBDSEVDSyhtU291cmNlID09IE5VTEwpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic291cmNlIiwgJm9iaikpOwotICAgICAgICAgICAgaWYgKG9iaiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Tb3VyY2VMb2NrKTsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmbVNyY0lkKSk7Ci0gICAgICAgICAgICAgICAgbVNvdXJjZSA9IHN0YXRpY19jYXN0PFNvdXJjZSAqPihvYmouZ2V0KCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgICAgIEFMT0dFKCJrV2hhdFNldERhdGFTb3VyY2UsIHNvdXJjZSBzaG91bGQgbm90IGJlIE5VTEwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQ0hFQ0sobURyaXZlciAhPSBOVUxMKTsKLSAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNldERhdGFTb3VyY2VDb21wbGV0ZWQobVNyY0lkLCBlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0UHJlcGFyZU5leHREYXRhU291cmNlOgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVigia1doYXRQcmVwYXJlTmV4dERhdGFTb3VyY2UiKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInNvdXJjZSIsICZvYmopKTsKLSAgICAgICAgICAgIGlmIChvYmogIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgJm1OZXh0U3JjSWQpKTsKLSAgICAgICAgICAgICAgICBtTmV4dFNvdXJjZSA9IHN0YXRpY19jYXN0PFNvdXJjZSAqPihvYmouZ2V0KCkpOwotICAgICAgICAgICAgICAgIG1OZXh0U291cmNlLT5wcmVwYXJlQXN5bmMoKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0UGxheU5leHREYXRhU291cmNlOgotICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVigia1doYXRQbGF5TmV4dERhdGFTb3VyY2UiKTsKLSAgICAgICAgICAgIGludDY0X3Qgc3JjSWQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmc3JjSWQpKTsKLSAgICAgICAgICAgIGlmIChzcmNJZCAhPSBtTmV4dFNyY0lkKSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoc3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIDApOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVJlc2V0dGluZyA9IHRydWU7Ci0gICAgICAgICAgICBzdG9wUGxheWJhY2tUaW1lcigia1doYXRQbGF5TmV4dERhdGFTb3VyY2UiKTsKLSAgICAgICAgICAgIHN0b3BSZWJ1ZmZlcmluZ1RpbWVyKHRydWUpOwotCi0gICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9TSFVURE9XTiAvKiBhdWRpbyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9TSFVURE9XTiAvKiB2aWRlbyAqLykpOwotCi0gICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFjdGlvbigmTnVQbGF5ZXIyOjpwZXJmb3JtUGxheU5leHREYXRhU291cmNlKSk7Ci0KLSAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdEdldEJ1ZmZlcmluZ1NldHRpbmdzOgotICAgICAgICB7Ci0gICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLQotICAgICAgICAgICAgQUxPR1YoImtXaGF0R2V0QnVmZmVyaW5nU2V0dGluZ3MiKTsKLSAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzIGJ1ZmZlcmluZzsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGVyciA9IG1Tb3VyY2UtPmdldEJ1ZmZlcmluZ1NldHRpbmdzKCZidWZmZXJpbmcpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICB3cml0ZVRvQU1lc3NhZ2UocmVzcG9uc2UsIGJ1ZmZlcmluZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0U2V0QnVmZmVyaW5nU2V0dGluZ3M6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotCi0gICAgICAgICAgICBBTE9HVigia1doYXRTZXRCdWZmZXJpbmdTZXR0aW5ncyIpOwotICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MgYnVmZmVyaW5nOwotICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShtc2csICZidWZmZXJpbmcpOwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+c2V0QnVmZmVyaW5nU2V0dGluZ3MoYnVmZmVyaW5nKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0UHJlcGFyZToKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoIm9uTWVzc2FnZVJlY2VpdmVkIGtXaGF0UHJlcGFyZSIpOwotCi0gICAgICAgICAgICBtU291cmNlLT5wcmVwYXJlQXN5bmMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdEdldFRyYWNrSW5mbzoKLSAgICAgICAgewotICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0KLSAgICAgICAgICAgIFBhcmNlbCogcmVwbHk7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJyZXBseSIsICh2b2lkKiopJnJlcGx5KSk7Ci0KLSAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOwotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2l6ZV90IGNjVHJhY2tzID0gMDsKLSAgICAgICAgICAgIGlmIChtQ0NEZWNvZGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBjY1RyYWNrcyA9IG1DQ0RlY29kZXItPmdldFRyYWNrQ291bnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gdG90YWwgdHJhY2sgY291bnQKLSAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKGluYmFuZFRyYWNrcyArIGNjVHJhY2tzKTsKLQotICAgICAgICAgICAgLy8gd3JpdGUgaW5iYW5kIHRyYWNrcwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmJhbmRUcmFja3M7ICsraSkgewotICAgICAgICAgICAgICAgIHdyaXRlVHJhY2tJbmZvKHJlcGx5LCBtU291cmNlLT5nZXRUcmFja0luZm8oaSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyB3cml0ZSBDQyB0cmFjawotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjY1RyYWNrczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgd3JpdGVUcmFja0luZm8ocmVwbHksIG1DQ0RlY29kZXItPmdldFRyYWNrSW5mbyhpKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRHZXRTZWxlY3RlZFRyYWNrOgotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBPSzsKLQotICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTMyOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ0eXBlIiwgKGludDMyX3QqKSZ0eXBlMzIpKTsKLSAgICAgICAgICAgICAgICBtZWRpYV90cmFja190eXBlIHR5cGUgPSAobWVkaWFfdHJhY2tfdHlwZSl0eXBlMzI7Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBzZWxlY3RlZFRyYWNrID0gbVNvdXJjZS0+Z2V0U2VsZWN0ZWRUcmFjayh0eXBlKTsKLQotICAgICAgICAgICAgICAgIFBhcmNlbCogcmVwbHk7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigicmVwbHkiLCAodm9pZCoqKSZyZXBseSkpOwotICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlbGVjdGVkVHJhY2spOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0KLSAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFNlbGVjdFRyYWNrOgotICAgICAgICB7Ci0gICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLQotICAgICAgICAgICAgc2l6ZV90IHRyYWNrSW5kZXg7Ci0gICAgICAgICAgICBpbnQzMl90IHNlbGVjdDsKLSAgICAgICAgICAgIGludDY0X3QgdGltZVVzOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigic2VsZWN0IiwgJnNlbGVjdCkpOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKLQotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gSU5WQUxJRF9PUEVSQVRJT047Ci0KLSAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOwotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNpemVfdCBjY1RyYWNrcyA9IDA7Ci0gICAgICAgICAgICBpZiAobUNDRGVjb2RlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgY2NUcmFja3MgPSBtQ0NEZWNvZGVyLT5nZXRUcmFja0NvdW50KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0cmFja0luZGV4IDwgaW5iYW5kVHJhY2tzKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgc2VsZWN0LCB0aW1lVXMpOwotCi0gICAgICAgICAgICAgICAgaWYgKCFzZWxlY3QgJiYgZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDMyX3QgdHlwZTsKLSAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGluZm8gPSBtU291cmNlLT5nZXRUcmFja0luZm8odHJhY2tJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmZvICE9IE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBpbmZvLT5maW5kSW50MzIoInR5cGUiLCAmdHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiB0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfVElNRURURVhUKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICArK21UaW1lZFRleHRHZW5lcmF0aW9uOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0cmFja0luZGV4IC09IGluYmFuZFRyYWNrczsKLQotICAgICAgICAgICAgICAgIGlmICh0cmFja0luZGV4IDwgY2NUcmFja3MpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gbUNDRGVjb2Rlci0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgc2VsZWN0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLQotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFBvbGxEdXJhdGlvbjoKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOwotCi0gICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtUG9sbER1cmF0aW9uR2VuZXJhdGlvbikgewotICAgICAgICAgICAgICAgIC8vIHN0YWxlCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgICAgIGlmIChtRHJpdmVyICE9IE5VTEwgJiYgbVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlEdXJhdGlvbihtU3JjSWQsIGR1cmF0aW9uVXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbXNnLT5wb3N0KDEwMDAwMDBMTCk7ICAvLyBwb2xsIGFnYWluIGluIGEgc2Vjb25kLgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0U2V0VmlkZW9TdXJmYWNlOgotICAgICAgICB7Ci0KLSAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgic3VyZmFjZSIsICZvYmopKTsKLSAgICAgICAgICAgIHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiBud3cgPSBzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93V3JhcHBlciAqPihvYmouZ2V0KCkpOwotCi0gICAgICAgICAgICBBTE9HRCgib25TZXRWaWRlb1N1cmZhY2UoJXAsICVzIHZpZGVvIGRlY29kZXIpIiwKLSAgICAgICAgICAgICAgICAgICAgKG53dyA9PSBOVUxMID8gTlVMTCA6IG53dy0+Z2V0QU5hdGl2ZVdpbmRvdygpKSwKLSAgICAgICAgICAgICAgICAgICAgKG1Tb3VyY2UgIT0gTlVMTCAmJiBtU3RhcnRlZCAmJiBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pICE9IE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBtVmlkZW9EZWNvZGVyICE9IE5VTEwpID8gImhhdmUiIDogIm5vIik7Ci0KLSAgICAgICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgbVN0YXJ0ZWQgYmVmb3JlIGNhbGxpbmcgbVNvdXJjZS0+Z2V0Rm9ybWF0IGJlY2F1c2UgTnVQbGF5ZXIyIG1pZ2h0Ci0gICAgICAgICAgICAvLyBiZSBpbiBwcmVwYXJpbmcgc3RhdGUgYW5kIGl0IGNvdWxkIHRha2UgbG9uZyB0aW1lLgotICAgICAgICAgICAgLy8gV2hlbiBtU3RhcnRlZCBpcyB0cnVlLCBtU291cmNlIG11c3QgaGF2ZSBiZWVuIHNldC4KLSAgICAgICAgICAgIGlmIChtU291cmNlID09IE5VTEwgfHwgIW1TdGFydGVkIHx8IG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgPT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAvLyBOT1RFOiBtVmlkZW9EZWNvZGVyJ3MgbU5hdGl2ZVdpbmRvdyBpcyBhbHdheXMgbm9uLW51bGwKLSAgICAgICAgICAgICAgICAgICAgfHwgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCAmJiBtVmlkZW9EZWNvZGVyLT5zZXRWaWRlb1N1cmZhY2Uobnd3KSA9PSBPSykpIHsKLSAgICAgICAgICAgICAgICBwZXJmb3JtU2V0U3VyZmFjZShud3cpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAob2JqICE9IE5VTEwgPyBGTFVTSF9DTURfRkxVU0ggOiBGTFVTSF9DTURfTk9ORSkgLyogYXVkaW8gKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxVU0hfQ01EX1NIVVRET1dOIC8qIHZpZGVvICovKSk7Ci0KLSAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKG5ldyBTZXRTdXJmYWNlQWN0aW9uKG53dykpOwotCi0gICAgICAgICAgICBpZiAob2JqICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSXNzdWUgYSBzZWVrIHRvIHJlZnJlc2ggdGhlIHZpZGVvIHNjcmVlbiBvbmx5IGlmIHN0YXJ0ZWQgb3RoZXJ3aXNlCi0gICAgICAgICAgICAgICAgICAgIC8vIHRoZSBleHRyYWN0b3IgbWF5IG5vdCB5ZXQgYmUgc3RhcnRlZCBhbmQgd2lsbCBhc3NlcnQuCi0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZSB2aWRlbyBkZWNvZGVyIGlzIG5vdCBzZXQgKHBlcmhhcHMgYXVkaW8gb25seSBpbiB0aGlzIGNhc2UpCi0gICAgICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBwZXJmb3JtIGEgc2VlayBhcyBpdCBpcyBub3QgbmVlZGVkLgotICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGN1cnJlbnRQb3NpdGlvblVzID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGdldEN1cnJlbnRQb3NpdGlvbigmY3VycmVudFBvc2l0aW9uVXMpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlZWtBY3Rpb24oY3VycmVudFBvc2l0aW9uVXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyAvKiBtb2RlICovKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBJZiB0aGVyZSBpcyBhIG5ldyBzdXJmYWNlIHRleHR1cmUsIGluc3RhbnRpYXRlIGRlY29kZXJzCi0gICAgICAgICAgICAgICAgLy8gYWdhaW4gaWYgcG9zc2libGUuCi0gICAgICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgU2ltcGxlQWN0aW9uKCZOdVBsYXllcjI6OnBlcmZvcm1TY2FuU291cmNlcykpOwotCi0gICAgICAgICAgICAgICAgLy8gQWZ0ZXIgYSBmbHVzaCB3aXRob3V0IHNodXRkb3duLCBkZWNvZGVyIGlzIHBhdXNlZC4KLSAgICAgICAgICAgICAgICAvLyBEb24ndCByZXN1bWUgaXQgdW50aWwgc291cmNlIHNlZWsgaXMgZG9uZSwgb3RoZXJ3aXNlIGl0IGNvdWxkCi0gICAgICAgICAgICAgICAgLy8gc3RhcnQgcHVsbGluZyBzdGFsZSBkYXRhIHRvbyBzb29uLgotICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJlc3VtZURlY29kZXJBY3Rpb24oZmFsc2UgLyogbmVlZE5vdGlmeSAqLykpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRTZXRBdWRpb1Npbms6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJrV2hhdFNldEF1ZGlvU2luayIpOwotCi0gICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRPYmplY3QoInNpbmsiLCAmb2JqKSk7Ci0KLSAgICAgICAgICAgIG1BdWRpb1NpbmsgPSBzdGF0aWNfY2FzdDxNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luayAqPihvYmouZ2V0KCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0U3RhcnQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJrV2hhdFN0YXJ0Iik7Ci0gICAgICAgICAgICBpZiAobVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3QgcmVzdW1lIHlldCBpZiB0aGUgc291cmNlIGlzIHN0aWxsIGJ1ZmZlcmluZwotICAgICAgICAgICAgICAgIGlmICghbVBhdXNlZEZvckJ1ZmZlcmluZykgewotICAgICAgICAgICAgICAgICAgICBvblJlc3VtZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb25TdGFydCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBhdXNlZEJ5Q2xpZW50ID0gZmFsc2U7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9TVEFSVEVELCAwLCAwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdENvbmZpZ1BsYXliYWNrOgotICAgICAgICB7Ci0gICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLSAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIHJhdGUgLyogc2FuaXRpemVkICovOwotICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShtc2csICZyYXRlKTsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgICAgICAgICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgLy8gQXVkaW9TaW5rIGFsbG93cyBvbmx5IDEuZiBhbmQgMC5mIGZvciBvZmZsb2FkIG1vZGUuCi0gICAgICAgICAgICAgICAgLy8gRm9yIG90aGVyIHNwZWVkLCBzd2l0Y2ggdG8gbm9uLW9mZmxvYWQgbW9kZS4KLSAgICAgICAgICAgICAgICBpZiAobU9mZmxvYWRBdWRpbyAmJiAoKHJhdGUubVNwZWVkICE9IDAuZiAmJiByYXRlLm1TcGVlZCAhPSAxLmYpCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCByYXRlLm1QaXRjaCAhPSAxLmYpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChnZXRDdXJyZW50UG9zaXRpb24oJmN1cnJlbnRQb3NpdGlvblVzKSAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uVXMgPSBtUHJldmlvdXNTZWVrVGltZVVzOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgLy8gU2V0IG1QbGF5YmFja1NldHRpbmdzIHNvIHRoYXQgdGhlIG5ldyBhdWRpbyBkZWNvZGVyIGNhbgotICAgICAgICAgICAgICAgICAgICAvLyBiZSBjcmVhdGVkIGNvcnJlY3RseS4KLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrU2V0dGluZ3MgPSByYXRlOwotICAgICAgICAgICAgICAgICAgICBpZiAoIW1QYXVzZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+cGF1c2UoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXN0YXJ0QXVkaW8oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudFBvc2l0aW9uVXMsIHRydWUgLyogZm9yY2VOb25PZmZsb2FkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLyogbmVlZHNUb0NyZWF0ZUF1ZGlvRGVjb2RlciAqLyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghbVBhdXNlZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVJlbmRlcmVyLT5yZXN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGVyciA9IG1SZW5kZXJlci0+c2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICBpZiAocmF0ZS5tU3BlZWQgPT0gMC5mKSB7Ci0gICAgICAgICAgICAgICAgICAgIG9uUGF1c2UoKTsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfUEFVU0VELCAwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgbVBhdXNlZEJ5Q2xpZW50ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBhbGwgb3RoZXIgc2V0dGluZ3MgKHVzaW5nIG5vbi1wYXVzZWQgc3BlZWQpCi0gICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIGNhbiByZXN0b3JlIHRoZW0gb24gc3RhcnQKLSAgICAgICAgICAgICAgICAgICAgQXVkaW9QbGF5YmFja1JhdGUgbmV3UmF0ZSA9IHJhdGU7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1JhdGUubVNwZWVkID0gbVBsYXliYWNrU2V0dGluZ3MubVNwZWVkOwotICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IG5ld1JhdGU7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsgLyogcmF0ZS5tU3BlZWQgIT0gMC5mICovCi0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gcmF0ZTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3QgcmVzdW1lIHlldCBpZiB0aGUgc291cmNlIGlzIHN0aWxsIGJ1ZmZlcmluZwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtUGF1c2VkRm9yQnVmZmVyaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb25SZXN1bWUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUHJlcGFyZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG9uU3RhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIG1QYXVzZWRCeUNsaWVudCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBwYXJhbXMgPSBuZXcgQU1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJwbGF5YmFjay1zcGVlZCIsIG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZCk7Ci0gICAgICAgICAgICAgICAgbVZpZGVvRGVjb2Rlci0+c2V0UGFyYW1ldGVycyhwYXJhbXMpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0R2V0UGxheWJhY2tTZXR0aW5nczoKLSAgICAgICAgewotICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0gICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSByYXRlID0gbVBsYXliYWNrU2V0dGluZ3M7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICAgICAgICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGVyciA9IG1SZW5kZXJlci0+Z2V0UGxheWJhY2tTZXR0aW5ncygmcmF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgLy8gZ2V0IHBsYXliYWNrIHNldHRpbmdzIHVzZWQgYnkgcmVuZGVyZXIsIGFzIGl0IG1heSBiZQotICAgICAgICAgICAgICAgIC8vIHNsaWdodGx5IG9mZiBkdWUgdG8gYXVkaW9zaW5rIG5vdCB0YWtpbmcgc21hbGwgY2hhbmdlcy4KLSAgICAgICAgICAgICAgICBtUGxheWJhY2tTZXR0aW5ncyA9IHJhdGU7Ci0gICAgICAgICAgICAgICAgaWYgKG1QYXVzZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgcmF0ZS5tU3BlZWQgPSAwLmY7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIHdyaXRlVG9BTWVzc2FnZShyZXNwb25zZSwgcmF0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0Q29uZmlnU3luYzoKLSAgICAgICAgewotICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0KLSAgICAgICAgICAgIEFMT0dWKCJrV2hhdENvbmZpZ1N5bmMiKTsKLSAgICAgICAgICAgIEFWU3luY1NldHRpbmdzIHN5bmM7Ci0gICAgICAgICAgICBmbG9hdCB2aWRlb0Zwc0hpbnQ7Ci0gICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKG1zZywgJnN5bmMsICZ2aWRlb0Zwc0hpbnQpOwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBtUmVuZGVyZXItPnNldFN5bmNTZXR0aW5ncyhzeW5jLCB2aWRlb0Zwc0hpbnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIG1TeW5jU2V0dGluZ3MgPSBzeW5jOwotICAgICAgICAgICAgICAgIG1WaWRlb0Zwc0hpbnQgPSB2aWRlb0Zwc0hpbnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0R2V0U3luY1NldHRpbmdzOgotICAgICAgICB7Ci0gICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLSAgICAgICAgICAgIEFWU3luY1NldHRpbmdzIHN5bmMgPSBtU3luY1NldHRpbmdzOwotICAgICAgICAgICAgZmxvYXQgdmlkZW9GcHMgPSBtVmlkZW9GcHNIaW50OwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBtUmVuZGVyZXItPmdldFN5bmNTZXR0aW5ncygmc3luYywgJnZpZGVvRnBzKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TeW5jU2V0dGluZ3MgPSBzeW5jOwotICAgICAgICAgICAgICAgICAgICBtVmlkZW9GcHNIaW50ID0gdmlkZW9GcHM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIHdyaXRlVG9BTWVzc2FnZShyZXNwb25zZSwgc3luYywgdmlkZW9GcHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFNjYW5Tb3VyY2VzOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb247Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7Ci0gICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtU2NhblNvdXJjZXNHZW5lcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgLy8gRHJvcCBvYnNvbGV0ZSBtc2cuCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TY2FuU291cmNlc1BlbmRpbmcgPSBmYWxzZTsKLQotICAgICAgICAgICAgQUxPR1YoInNjYW5uaW5nIHNvdXJjZXMgaGF2ZUF1ZGlvPSVkLCBoYXZlVmlkZW89JWQiLAotICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyICE9IE5VTEwsIG1WaWRlb0RlY29kZXIgIT0gTlVMTCk7Ci0KLSAgICAgICAgICAgIGJvb2wgbUhhZEFueVNvdXJjZXNCZWZvcmUgPQotICAgICAgICAgICAgICAgIChtQXVkaW9EZWNvZGVyICE9IE5VTEwpIHx8IChtVmlkZW9EZWNvZGVyICE9IE5VTEwpOwotICAgICAgICAgICAgYm9vbCByZXNjYW4gPSBmYWxzZTsKLQotICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSB2aWRlbyBiZWZvcmUgYXVkaW8gYmVjYXVzZSBzdWNjZXNzZnVsIGluaXRpYWxpemF0aW9uIG9mCi0gICAgICAgICAgICAvLyB2aWRlbyBtYXkgY2hhbmdlIGRlZXAgYnVmZmVyIG1vZGUgb2YgYXVkaW8uCi0gICAgICAgICAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMICYmIG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluc3RhbnRpYXRlRGVjb2RlcihmYWxzZSwgJm1WaWRlb0RlY29kZXIpID09IC1FV09VTERCTE9DSykgewotICAgICAgICAgICAgICAgICAgICByZXNjYW4gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRG9uJ3QgdHJ5IHRvIHJlLW9wZW4gYXVkaW8gc2luayBpZiB0aGVyZSdzIGFuIGV4aXN0aW5nIGRlY29kZXIuCi0gICAgICAgICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMICYmIG1BdWRpb0RlY29kZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGlmIChpbnN0YW50aWF0ZURlY29kZXIodHJ1ZSwgJm1BdWRpb0RlY29kZXIpID09IC1FV09VTERCTE9DSykgewotICAgICAgICAgICAgICAgICAgICByZXNjYW4gPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFtSGFkQW55U291cmNlc0JlZm9yZQotICAgICAgICAgICAgICAgICAgICAmJiAobUF1ZGlvRGVjb2RlciAhPSBOVUxMIHx8IG1WaWRlb0RlY29kZXIgIT0gTlVMTCkpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIGZvdW5kIGFueXRoaW5nIHBsYXlhYmxlLgotCi0gICAgICAgICAgICAgICAgaWYgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlUG9sbER1cmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgICAgICBpZiAoKGVyciA9IG1Tb3VyY2UtPmZlZWRNb3JlVFNEYXRhKCkpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1BdWRpb0RlY29kZXIgPT0gTlVMTCAmJiBtVmlkZW9EZWNvZGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV2UncmUgbm90IGN1cnJlbnRseSBkZWNvZGluZyBhbnl0aGluZyAobm8gYXVkaW8gb3IKLSAgICAgICAgICAgICAgICAgICAgLy8gdmlkZW8gdHJhY2tzIGZvdW5kKSBhbmQgd2UganVzdCByYW4gb3V0IG9mIGlucHV0IGRhdGEuCi0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9QTEFZQkFDS19DT01QTEVURSwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXNjYW4pIHsKLSAgICAgICAgICAgICAgICBtc2ctPnBvc3QoMTAwMDAwTEwpOwotICAgICAgICAgICAgICAgIG1TY2FuU291cmNlc1BlbmRpbmcgPSB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0VmlkZW9Ob3RpZnk6Ci0gICAgICAgIGNhc2Uga1doYXRBdWRpb05vdGlmeToKLSAgICAgICAgewotICAgICAgICAgICAgYm9vbCBhdWRpbyA9IG1zZy0+d2hhdCgpID09IGtXaGF0QXVkaW9Ob3RpZnk7Ci0KLSAgICAgICAgICAgIGludDMyX3QgY3VycmVudERlY29kZXJHZW5lcmF0aW9uID0KLSAgICAgICAgICAgICAgICAoYXVkaW8/IG1BdWRpb0RlY29kZXJHZW5lcmF0aW9uIDogbVZpZGVvRGVjb2RlckdlbmVyYXRpb24pOwotICAgICAgICAgICAgaW50MzJfdCByZXF1ZXN0ZXJHZW5lcmF0aW9uID0gY3VycmVudERlY29kZXJHZW5lcmF0aW9uIC0gMTsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJnJlcXVlc3RlckdlbmVyYXRpb24pKTsKLQotICAgICAgICAgICAgaWYgKHJlcXVlc3RlckdlbmVyYXRpb24gIT0gY3VycmVudERlY29kZXJHZW5lcmF0aW9uKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImdvdCBtZXNzYWdlIGZyb20gb2xkICVzIGRlY29kZXIsIGdlbmVyYXRpb24oJWQ6JWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIsIHJlcXVlc3RlckdlbmVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGVjb2RlckdlbmVyYXRpb24pOwotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseTsKLSAgICAgICAgICAgICAgICBpZiAoIShtc2ctPmZpbmRNZXNzYWdlKCJyZXBseSIsICZyZXBseSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICByZXBseS0+c2V0SW50MzIoImVyciIsIElORk9fRElTQ09OVElOVUlUWSk7Ci0gICAgICAgICAgICAgICAgcmVwbHktPnBvc3QoKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDMyX3Qgd2hhdDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKLQotICAgICAgICAgICAgaWYgKHdoYXQgPT0gRGVjb2RlckJhc2U6OmtXaGF0SW5wdXREaXNjb250aW51aXR5KSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBmb3JtYXRDaGFuZ2U7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImZvcm1hdENoYW5nZSIsICZmb3JtYXRDaGFuZ2UpKTsKLQotICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBkaXNjb250aW51aXR5OiBmb3JtYXRDaGFuZ2UgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgZm9ybWF0Q2hhbmdlKTsKLQotICAgICAgICAgICAgICAgIGlmIChmb3JtYXRDaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyBGTFVTSF9DTURfU0hVVERPV04gOiBGTFVTSF9DTURfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyBGTFVTSF9DTURfTk9ORSA6IEZMVVNIX0NNRF9TSFVURE9XTikpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk51UGxheWVyMjo6cGVyZm9ybVNjYW5Tb3VyY2VzKSk7Ci0KLSAgICAgICAgICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gRGVjb2RlckJhc2U6OmtXaGF0RU9TKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBlcnI7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKLQotICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiZ290ICVzIGRlY29kZXIgRU9TIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImdvdCAlcyBkZWNvZGVyIEVPUyB3LyBlcnJvciAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBlcnIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1SZW5kZXJlci0+cXVldWVFT1MoYXVkaW8sIGVycik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gRGVjb2RlckJhc2U6OmtXaGF0Rmx1c2hDb21wbGV0ZWQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiZGVjb2RlciAlcyBmbHVzaCBjb21wbGV0ZWQiLCBhdWRpbyA/ICJhdWRpbyIgOiAidmlkZW8iKTsKLQotICAgICAgICAgICAgICAgIGhhbmRsZUZsdXNoQ29tcGxldGUoYXVkaW8sIHRydWUgLyogaXNEZWNvZGVyICovKTsKLSAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBEZWNvZGVyQmFzZTo6a1doYXRWaWRlb1NpemVDaGFuZ2VkKSB7Ci0gICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7Ci0KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gaW5wdXRGb3JtYXQgPQotICAgICAgICAgICAgICAgICAgICAgICAgbVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qIGF1ZGlvICovKTsKLQotICAgICAgICAgICAgICAgIHNldFZpZGVvU2NhbGluZ01vZGUobVZpZGVvU2NhbGluZ01vZGUpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVZpZGVvU2l6ZShtU3JjSWQsIGlucHV0Rm9ybWF0LCBmb3JtYXQpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXJCYXNlOjprV2hhdFNodXRkb3duQ29tcGxldGVkKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzIHNodXRkb3duIGNvbXBsZXRlZCIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwotICAgICAgICAgICAgICAgIGlmIChhdWRpbykgewotICAgICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1BdWRpb0RlY29kZXJFcnJvciA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICArK21BdWRpb0RlY29kZXJHZW5lcmF0aW9uOwotCi0gICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKChpbnQpbUZsdXNoaW5nQXVkaW8sIChpbnQpU0hVVFRJTkdfRE9XTl9ERUNPREVSKTsKLSAgICAgICAgICAgICAgICAgICAgbUZsdXNoaW5nQXVkaW8gPSBTSFVUX0RPV047Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvRGVjb2Rlci5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBtVmlkZW9EZWNvZGVyRXJyb3IgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgKyttVmlkZW9EZWNvZGVyR2VuZXJhdGlvbjsKLQotICAgICAgICAgICAgICAgICAgICBDSEVDS19FUSgoaW50KW1GbHVzaGluZ1ZpZGVvLCAoaW50KVNIVVRUSU5HX0RPV05fREVDT0RFUik7Ci0gICAgICAgICAgICAgICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gU0hVVF9ET1dOOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXJCYXNlOjprV2hhdFJlc3VtZUNvbXBsZXRlZCkgewotICAgICAgICAgICAgICAgIGZpbmlzaFJlc3VtZSgpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh3aGF0ID09IERlY29kZXJCYXNlOjprV2hhdEVycm9yKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpIHx8IGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICBlcnIgPSBVTktOT1dOX0VSUk9SOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIERlY29kZXIgZXJyb3JzIGNhbiBiZSBkdWUgdG8gU291cmNlIChlLmcuIGZyb20gc3RyZWFtaW5nKSwKLSAgICAgICAgICAgICAgICAvLyBvciBmcm9tIGRlY29kaW5nIGNvcnJ1cHRlZCBiaXRzdHJlYW1zLCBvciBmcm9tIG90aGVyIGRlY29kZXIKLSAgICAgICAgICAgICAgICAvLyBNZWRpYUNvZGVjIG9wZXJhdGlvbnMgKGUuZy4gZnJvbSBhbiBvbmdvaW5nIHJlc2V0IG9yIHNlZWspLgotICAgICAgICAgICAgICAgIC8vIFRoZXkgbWF5IGFsc28gYmUgZHVlIHRvIG9wZW5BdWRpb1NpbmsgZmFpbHVyZSBhdAotICAgICAgICAgICAgICAgIC8vIGRlY29kZXIgc3RhcnQgb3IgYWZ0ZXIgYSBmb3JtYXQgY2hhbmdlLgotICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgLy8gV2UgdHJ5IHRvIGdyYWNlZnVsbHkgc2h1dCBkb3duIHRoZSBhZmZlY3RlZCBkZWNvZGVyIGlmIHBvc3NpYmxlLAotICAgICAgICAgICAgICAgIC8vIHJhdGhlciB0aGFuIHRyeWluZyB0byBmb3JjZSB0aGUgc2h1dGRvd24gd2l0aCBzb21ldGhpbmcKLSAgICAgICAgICAgICAgICAvLyBzaW1pbGFyIHRvIHBlcmZvcm1SZXNldCgpLiBUaGlzIG1ldGhvZCBjYW4gbGVhZCB0byBhIGhhbmcKLSAgICAgICAgICAgICAgICAvLyBpZiBNZWRpYUNvZGVjIGZ1bmN0aW9ucyBibG9jayBhZnRlciBhbiBlcnJvciwgYnV0IHRoZXkgc2hvdWxkCi0gICAgICAgICAgICAgICAgLy8gdHlwaWNhbGx5IHJldHVybiBJTlZBTElEX09QRVJBVElPTiBpbnN0ZWFkIG9mIGJsb2NraW5nLgotCi0gICAgICAgICAgICAgICAgRmx1c2hTdGF0dXMgKmZsdXNoaW5nID0gYXVkaW8gPyAmbUZsdXNoaW5nQXVkaW8gOiAmbUZsdXNoaW5nVmlkZW87Ci0gICAgICAgICAgICAgICAgQUxPR0UoInJlY2VpdmVkIGVycm9yKCUjeCkgZnJvbSAlcyBkZWNvZGVyLCBmbHVzaGluZyglZCksIG5vdyBzaHV0dGluZyBkb3duIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgKmZsdXNoaW5nKTsKLQotICAgICAgICAgICAgICAgIHN3aXRjaCAoKmZsdXNoaW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTk9ORToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmx1c2hEZWNvZGVyQWN0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gPyBGTFVTSF9DTURfU0hVVERPV04gOiBGTFVTSF9DTURfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvID8gRkxVU0hfQ01EX05PTkUgOiBGTFVTSF9DTURfU0hVVERPV04pKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIEZMVVNISU5HX0RFQ09ERVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICAqZmx1c2hpbmcgPSBGTFVTSElOR19ERUNPREVSX1NIVVRET1dOOyAvLyBpbml0aWF0ZSBzaHV0ZG93biBhZnRlciBmbHVzaC4KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBXYWl0IGZvciBmbHVzaCB0byBjb21wbGV0ZS4KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGTFVTSElOR19ERUNPREVSX1NIVVRET1dOOgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7IC8vIFdhaXQgZm9yIGZsdXNoIHRvIGNvbXBsZXRlLgotICAgICAgICAgICAgICAgICAgICBjYXNlIFNIVVRUSU5HX0RPV05fREVDT0RFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBXYWl0IGZvciBzaHV0ZG93biB0byBjb21wbGV0ZS4KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBGTFVTSEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVjb2RlcihhdWRpbyktPmluaXRpYXRlU2h1dGRvd24oKTsgLy8gSW4gdGhlIG1pZGRsZSBvZiBhIHNlZWsuCi0gICAgICAgICAgICAgICAgICAgICAgICAqZmx1c2hpbmcgPSBTSFVUVElOR19ET1dOX0RFQ09ERVI7ICAgICAvLyBTaHV0IGRvd24uCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTSFVUX0RPV046Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsgIC8vIFNob3VsZCBub3Qgb2NjdXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgIC8vIEZpbmlzaCBhbnl3YXlzLgotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdWRpbykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb0RlY29kZXJFcnJvciB8fCBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pID09IE5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgbU5hdGl2ZVdpbmRvdyA9PSBOVUxMIHx8IG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSA9PSBOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1WaWRlb0RlY29kZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gYm90aCBhdWRpbyBhbmQgdmlkZW8gaGF2ZSBlcnJvciwgb3IgdGhpcyBzdHJlYW0gaGFzIG9ubHkgYXVkaW8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aGljaCBoYXMgZXJyb3IsIG5vdGlmeSBjbGllbnQgb2YgZXJyb3IuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IGF1ZGlvIHRyYWNrIGhhcyBlcnJvci4gVmlkZW8gdHJhY2sgY291bGQgYmUgc3RpbGwgZ29vZCB0byBwbGF5LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX1BMQVlfQVVESU9fRVJST1IsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyRXJyb3IgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0RlY29kZXJFcnJvciB8fCBtU291cmNlLT5nZXRGb3JtYXQodHJ1ZSAvKiBhdWRpbyAqLykgPT0gTlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8fCBtQXVkaW9TaW5rID09IE5VTEwgfHwgbUF1ZGlvRGVjb2RlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2hlbiBib3RoIGF1ZGlvIGFuZCB2aWRlbyBoYXZlIGVycm9yLCBvciB0aGlzIHN0cmVhbSBoYXMgb25seSB2aWRlbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoaWNoIGhhcyBlcnJvciwgbm90aWZ5IGNsaWVudCBvZiBlcnJvci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE9ubHkgdmlkZW8gdHJhY2sgaGFzIGVycm9yLiBBdWRpbyB0cmFjayBjb3VsZCBiZSBzdGlsbCBnb29kIHRvIHBsYXkuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fUExBWV9WSURFT19FUlJPUiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1WaWRlb0RlY29kZXJFcnJvciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJVbmhhbmRsZWQgZGVjb2RlciBub3RpZmljYXRpb24gJWQgJyVjJWMlYyVjJy4iLAotICAgICAgICAgICAgICAgICAgICAgIHdoYXQsCi0gICAgICAgICAgICAgICAgICAgICAgd2hhdCA+PiAyNCwKLSAgICAgICAgICAgICAgICAgICAgICAod2hhdCA+PiAxNikgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICh3aGF0ID4+IDgpICYgMHhmZiwKLSAgICAgICAgICAgICAgICAgICAgICB3aGF0ICYgMHhmZik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFJlbmRlcmVyTm90aWZ5OgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHJlcXVlc3RlckdlbmVyYXRpb24gPSBtUmVuZGVyZXJHZW5lcmF0aW9uIC0gMTsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJnJlcXVlc3RlckdlbmVyYXRpb24pKTsKLSAgICAgICAgICAgIGlmIChyZXF1ZXN0ZXJHZW5lcmF0aW9uICE9IG1SZW5kZXJlckdlbmVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiZ290IG1lc3NhZ2UgZnJvbSBvbGQgcmVuZGVyZXIsIGdlbmVyYXRpb24oJWQ6JWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlckdlbmVyYXRpb24sIG1SZW5kZXJlckdlbmVyYXRpb24pOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50MzJfdCB3aGF0OwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOwotCi0gICAgICAgICAgICBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRFT1MpIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IGF1ZGlvOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZhdWRpbykpOwotCi0gICAgICAgICAgICAgICAgaW50MzJfdCBmaW5hbFJlc3VsdDsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmluYWxSZXN1bHQiLCAmZmluYWxSZXN1bHQpKTsKLQotICAgICAgICAgICAgICAgIGlmIChhdWRpbykgewotICAgICAgICAgICAgICAgICAgICBtQXVkaW9FT1MgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1WaWRlb0VPUyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKGZpbmFsUmVzdWx0ID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoInJlYWNoZWQgJXMgRU9TIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzIHRyYWNrIGVuY291bnRlcmVkIGFuIGVycm9yICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIsIGZpbmFsUmVzdWx0KTsKLQotICAgICAgICAgICAgICAgICAgICBub3RpZnlMaXN0ZW5lcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3JjSWQsIE1FRElBMl9FUlJPUiwgTUVESUEyX0VSUk9SX1VOS05PV04sIGZpbmFsUmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoKG1BdWRpb0VPUyB8fCBtQXVkaW9EZWNvZGVyID09IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAobVZpZGVvRU9TIHx8IG1WaWRlb0RlY29kZXIgPT0gTlVMTCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEUsIDAsIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRGbHVzaENvbXBsZXRlKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBhdWRpbzsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmYXVkaW8pKTsKLQotICAgICAgICAgICAgICAgIGlmIChhdWRpbykgewotICAgICAgICAgICAgICAgICAgICBtQXVkaW9FT1MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtVmlkZW9FT1MgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBBTE9HVigicmVuZGVyZXIgJXMgZmx1c2ggY29tcGxldGVkLiIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwotICAgICAgICAgICAgICAgIGlmIChhdWRpbyAmJiAobUZsdXNoaW5nQXVkaW8gPT0gTk9ORSB8fCBtRmx1c2hpbmdBdWRpbyA9PSBGTFVTSEVECi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBtRmx1c2hpbmdBdWRpbyA9PSBTSFVUX0RPV04pKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZsdXNoIGhhcyBiZWVuIGhhbmRsZWQgYnkgdGVhciBkb3duLgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaGFuZGxlRmx1c2hDb21wbGV0ZShhdWRpbywgZmFsc2UgLyogaXNEZWNvZGVyICovKTsKLSAgICAgICAgICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRWaWRlb1JlbmRlcmluZ1N0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fVklERU9fUkVOREVSSU5HX1NUQVJULCAwKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBSZW5kZXJlcjo6a1doYXRNZWRpYVJlbmRlcmluZ1N0YXJ0KSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIm1lZGlhIHJlbmRlcmluZyBzdGFydGVkIik7Ci0gICAgICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfU1RBUlRFRCwgMCwgMCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gUmVuZGVyZXI6OmtXaGF0QXVkaW9UZWFyRG93bikgewotICAgICAgICAgICAgICAgIGludDMyX3QgcmVhc29uOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZWFzb24iLCAmcmVhc29uKSk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlRlYXIgZG93biBhdWRpbyB3aXRoIHJlYXNvbiAlZC4iLCByZWFzb24pOwotICAgICAgICAgICAgICAgIGlmIChyZWFzb24gPT0gUmVuZGVyZXI6OmtEdWVUb1RpbWVvdXQgJiYgIShtUGF1c2VkICYmIG1PZmZsb2FkQXVkaW8pKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRpbWVvdXRXaGVuUGF1c2VkIGlzIG9ubHkgZm9yIG9mZmxvYWQgbW9kZS4KLSAgICAgICAgICAgICAgICAgICAgQUxPR1coIlJlY2VpdmUgYSBzdGFsZSBtZXNzYWdlIGZvciB0ZWFyZG93bi4iKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludDY0X3QgcG9zaXRpb25VczsKLSAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KCJwb3NpdGlvblVzIiwgJnBvc2l0aW9uVXMpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uVXMgPSBtUHJldmlvdXNTZWVrVGltZVVzOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHJlc3RhcnRBdWRpbygKLSAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uVXMsIHJlYXNvbiA9PSBSZW5kZXJlcjo6a0ZvcmNlTm9uT2ZmbG9hZCAvKiBmb3JjZU5vbk9mZmxvYWQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICByZWFzb24gIT0gUmVuZGVyZXI6OmtEdWVUb1RpbWVvdXQgLyogbmVlZHNUb0NyZWF0ZUF1ZGlvRGVjb2RlciAqLyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRNb3JlRGF0YVF1ZXVlZDoKLSAgICAgICAgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0UmVzZXQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJrV2hhdFJlc2V0Iik7Ci0KLSAgICAgICAgICAgIG1SZXNldHRpbmcgPSB0cnVlOwotICAgICAgICAgICAgc3RvcFBsYXliYWNrVGltZXIoImtXaGF0UmVzZXQiKTsKLSAgICAgICAgICAgIHN0b3BSZWJ1ZmZlcmluZ1RpbWVyKHRydWUpOwotCi0gICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9TSFVURE9XTiAvKiBhdWRpbyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9TSFVURE9XTiAvKiB2aWRlbyAqLykpOwotCi0gICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFjdGlvbigmTnVQbGF5ZXIyOjpwZXJmb3JtUmVzZXQpKTsKLQotICAgICAgICAgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0Tm90aWZ5VGltZToKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoImtXaGF0Tm90aWZ5VGltZSIpOwotICAgICAgICAgICAgaW50NjRfdCB0aW1lclVzOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWVyVXMiLCAmdGltZXJVcykpOwotCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9OT1RJRllfVElNRSwgdGltZXJVcywgMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRTZWVrOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXM7Ci0gICAgICAgICAgICBpbnQzMl90IG1vZGU7Ci0gICAgICAgICAgICBpbnQzMl90IG5lZWROb3RpZnk7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic2Vla1RpbWVVcyIsICZzZWVrVGltZVVzKSk7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibW9kZSIsICZtb2RlKSk7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibmVlZE5vdGlmeSIsICZuZWVkTm90aWZ5KSk7Ci0KLSAgICAgICAgICAgIEFMT0dWKCJrV2hhdFNlZWsgc2Vla1RpbWVVcz0lbGxkIHVzLCBtb2RlPSVkLCBuZWVkTm90aWZ5PSVkIiwKLSAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylzZWVrVGltZVVzLCBtb2RlLCBuZWVkTm90aWZ5KTsKLQotICAgICAgICAgICAgaWYgKCFtU3RhcnRlZCkgewotICAgICAgICAgICAgICAgIGlmICghbVNvdXJjZVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBtU291cmNlLT5zdGFydCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc2Vla1RpbWVVcyA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGVyZm9ybVNlZWsoc2Vla1RpbWVVcywgKE1lZGlhUGxheWVyMlNlZWtNb2RlKW1vZGUpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChuZWVkTm90aWZ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeURyaXZlclNlZWtDb21wbGV0ZShtU3JjSWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gc2Vla3MgY2FuIHRha2UgYSB3aGlsZSwgc28gd2UgZXNzZW50aWFsbHkgcGF1c2VkCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9QQVVTRUQsIDAsIDApOwotCi0gICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbihGTFVTSF9DTURfRkxVU0ggLyogYXVkaW8gKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRkxVU0hfQ01EX0ZMVVNIIC8qIHZpZGVvICovKSk7Ci0KLSAgICAgICAgICAgIG1EZWZlcnJlZEFjdGlvbnMucHVzaF9iYWNrKAotICAgICAgICAgICAgICAgICAgICBuZXcgU2Vla0FjdGlvbihzZWVrVGltZVVzLCAoTWVkaWFQbGF5ZXIyU2Vla01vZGUpbW9kZSkpOwotCi0gICAgICAgICAgICAvLyBBZnRlciBhIGZsdXNoIHdpdGhvdXQgc2h1dGRvd24sIGRlY29kZXIgaXMgcGF1c2VkLgotICAgICAgICAgICAgLy8gRG9uJ3QgcmVzdW1lIGl0IHVudGlsIHNvdXJjZSBzZWVrIGlzIGRvbmUsIG90aGVyd2lzZSBpdCBjb3VsZAotICAgICAgICAgICAgLy8gc3RhcnQgcHVsbGluZyBzdGFsZSBkYXRhIHRvbyBzb29uLgotICAgICAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgICAgIG5ldyBSZXN1bWVEZWNvZGVyQWN0aW9uKG5lZWROb3RpZnkpKTsKLQotICAgICAgICAgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0UGF1c2U6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG9uUGF1c2UoKTsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1BBVVNFRCwgMCwgMCk7Ci0gICAgICAgICAgICBtUGF1c2VkQnlDbGllbnQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0U291cmNlTm90aWZ5OgotICAgICAgICB7Ci0gICAgICAgICAgICBvblNvdXJjZU5vdGlmeShtc2cpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0Q2xvc2VkQ2FwdGlvbk5vdGlmeToKLSAgICAgICAgewotICAgICAgICAgICAgb25DbG9zZWRDYXB0aW9uTm90aWZ5KG1zZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRQcmVwYXJlRHJtOgotICAgICAgICB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvblByZXBhcmVEcm0obXNnKTsKLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJzdGF0dXMiLCBzdGF0dXMpOwotICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0UmVsZWFzZURybToKLSAgICAgICAgewotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb25SZWxlYXNlRHJtKCk7Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigic3RhdHVzIiwgc3RhdHVzKTsKLSAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIFRSRVNQQVNTKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpvblJlc3VtZSgpIHsKLSAgICBpZiAoIW1QYXVzZWQgfHwgbVJlc2V0dGluZykgewotICAgICAgICBBTE9HRF9JRihtUmVzZXR0aW5nLCAicmVzZXR0aW5nLCBvblJlc3VtZSBkaXNjYXJkZWQiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtUGF1c2VkID0gZmFsc2U7Ci0gICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBtU291cmNlLT5yZXN1bWUoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygicmVzdW1lIGNhbGxlZCB3aGVuIHNvdXJjZSBpcyBnb25lIG9yIG5vdCBzZXQiKTsKLSAgICB9Ci0gICAgLy8gfG1BdWRpb0RlY29kZXJ8IG1heSBoYXZlIGJlZW4gcmVsZWFzZWQgZHVlIHRvIHRoZSBwYXVzZSB0aW1lb3V0LCBzbyByZS1jcmVhdGUgaXQgaWYKLSAgICAvLyBuZWVkZWQuCi0gICAgaWYgKGF1ZGlvRGVjb2RlclN0aWxsTmVlZGVkKCkgJiYgbUF1ZGlvRGVjb2RlciA9PSBOVUxMKSB7Ci0gICAgICAgIGluc3RhbnRpYXRlRGVjb2Rlcih0cnVlIC8qIGF1ZGlvICovLCAmbUF1ZGlvRGVjb2Rlcik7Ci0gICAgfQotICAgIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgewotICAgICAgICBtUmVuZGVyZXItPnJlc3VtZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJyZXN1bWUgY2FsbGVkIHdoZW4gcmVuZGVyZXIgaXMgZ29uZSBvciBub3Qgc2V0Iik7Ci0gICAgfQotCi0gICAgc3RhcnRQbGF5YmFja1RpbWVyKCJvbnJlc3VtZSIpOwotfQotCi12b2lkIE51UGxheWVyMjo6b25TdGFydCgpIHsKLSAgICBBTE9HVigib25TdGFydDogbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKLQotICAgIGlmICghbVNvdXJjZVN0YXJ0ZWQpIHsKLSAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICBtU291cmNlLT5zdGFydCgpOwotICAgIH0KLQotICAgIG1PZmZsb2FkQXVkaW8gPSBmYWxzZTsKLSAgICBtQXVkaW9FT1MgPSBmYWxzZTsKLSAgICBtVmlkZW9FT1MgPSBmYWxzZTsKLSAgICBtU3RhcnRlZCA9IHRydWU7Ci0gICAgbVBhdXNlZCA9IGZhbHNlOwotCi0gICAgdWludDMyX3QgZmxhZ3MgPSAwOwotCi0gICAgaWYgKG1Tb3VyY2UtPmlzUmVhbFRpbWUoKSkgewotICAgICAgICBmbGFncyB8PSBSZW5kZXJlcjo6RkxBR19SRUFMX1RJTUU7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNBdWRpbyA9IChtU291cmNlLT5nZXRGb3JtYXQodHJ1ZSAvKiBhdWRpbyAqLykgIT0gTlVMTCk7Ci0gICAgYm9vbCBoYXNWaWRlbyA9IChtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pICE9IE5VTEwpOwotICAgIGlmICghaGFzQXVkaW8gJiYgIWhhc1ZpZGVvKSB7Ci0gICAgICAgIEFMT0dFKCJubyBtZXRhZGF0YSBmb3IgZWl0aGVyIGF1ZGlvIG9yIHZpZGVvIHNvdXJjZSIpOwotICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgIG1Tb3VyY2VTdGFydGVkID0gZmFsc2U7Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgRVJST1JfTUFMRk9STUVEKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBBTE9HVl9JRighaGFzQXVkaW8sICJubyBtZXRhZGF0YSBmb3IgYXVkaW8gc291cmNlIik7ICAvLyB2aWRlbyBvbmx5IHN0cmVhbQotCi0gICAgc3A8TWV0YURhdGE+IGF1ZGlvTWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdE1ldGEodHJ1ZSAvKiBhdWRpbyAqLyk7Ci0KLSAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgewotICAgICAgICBzdHJlYW1UeXBlID0gbUF1ZGlvU2luay0+Z2V0QXVkaW9TdHJlYW1UeXBlKCk7Ci0gICAgfQotCi0gICAgbU9mZmxvYWRBdWRpbyA9Ci0gICAgICAgIGNhbk9mZmxvYWRTdHJlYW0oYXVkaW9NZXRhLCBoYXNWaWRlbywgbVNvdXJjZS0+aXNTdHJlYW1pbmcoKSwgc3RyZWFtVHlwZSkKLSAgICAgICAgICAgICAgICAmJiAobVBsYXliYWNrU2V0dGluZ3MubVNwZWVkID09IDEuZiAmJiBtUGxheWJhY2tTZXR0aW5ncy5tUGl0Y2ggPT0gMS5mKTsKLQotICAgIC8vIE1vZHVsYXIgRFJNOiBEaXNhYmxpbmcgYXVkaW8gb2ZmbG9hZCBpZiB0aGUgc291cmNlIGlzIHByb3RlY3RlZAotICAgIGlmIChtT2ZmbG9hZEF1ZGlvICYmIG1Jc0RybVByb3RlY3RlZCkgewotICAgICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7Ci0gICAgICAgIEFMT0dWKCJvblN0YXJ0OiBEaXNhYmxpbmcgbU9mZmxvYWRBdWRpbyBub3cgdGhhdCB0aGUgc291cmNlIGlzIHByb3RlY3RlZC4iKTsKLSAgICB9Ci0KLSAgICBpZiAobU9mZmxvYWRBdWRpbykgewotICAgICAgICBmbGFncyB8PSBSZW5kZXJlcjo6RkxBR19PRkZMT0FEX0FVRElPOwotICAgIH0KLQotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZW5kZXJlck5vdGlmeSwgdGhpcyk7Ci0gICAgKyttUmVuZGVyZXJHZW5lcmF0aW9uOwotICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtUmVuZGVyZXJHZW5lcmF0aW9uKTsKLSAgICBtUmVuZGVyZXIgPSBuZXcgUmVuZGVyZXIobUF1ZGlvU2luaywgbU1lZGlhQ2xvY2ssIG5vdGlmeSwgZmxhZ3MpOwotICAgIG1SZW5kZXJlckxvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgIG1SZW5kZXJlckxvb3Blci0+c2V0TmFtZSgiTnVQbGF5ZXJSZW5kZXJlciIpOwotICAgIG1SZW5kZXJlckxvb3Blci0+c3RhcnQoZmFsc2UsIGZhbHNlLCBBTkRST0lEX1BSSU9SSVRZX0FVRElPKTsKLSAgICBtUmVuZGVyZXJMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUmVuZGVyZXIpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gbVJlbmRlcmVyLT5zZXRQbGF5YmFja1NldHRpbmdzKG1QbGF5YmFja1NldHRpbmdzKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKLSAgICAgICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZmxvYXQgcmF0ZSA9IGdldEZyYW1lUmF0ZSgpOwotICAgIGlmIChyYXRlID4gMCkgewotICAgICAgICBtUmVuZGVyZXItPnNldFZpZGVvRnJhbWVSYXRlKHJhdGUpOwotICAgIH0KLQotICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKLSAgICAgICAgbVZpZGVvRGVjb2Rlci0+c2V0UmVuZGVyZXIobVJlbmRlcmVyKTsKLSAgICB9Ci0gICAgaWYgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCkgewotICAgICAgICBtQXVkaW9EZWNvZGVyLT5zZXRSZW5kZXJlcihtUmVuZGVyZXIpOwotICAgIH0KLQotICAgIHN0YXJ0UGxheWJhY2tUaW1lcigib25zdGFydCIpOwotCi0gICAgcG9zdFNjYW5Tb3VyY2VzKCk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpzdGFydFBsYXliYWNrVGltZXIoY29uc3QgY2hhciAqd2hlcmUpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVBsYXlpbmdUaW1lTG9jayk7Ci0gICAgaWYgKG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMgPT0gMCkgewotICAgICAgICBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zID0gc3lzdGVtVGltZSgpOwotICAgICAgICBBTE9HVigic3RhcnRQbGF5YmFja1RpbWVyKCkgdGltZSAlMjAiIFBSSWQ2NCAiICglcykiLCAgbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcywgd2hlcmUpOwotICAgIH0KLX0KLQotdm9pZCBOdVBsYXllcjI6OnN0b3BQbGF5YmFja1RpbWVyKGNvbnN0IGNoYXIgKndoZXJlKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1QbGF5aW5nVGltZUxvY2spOwotCi0gICAgQUxPR1YoInN0b3BQbGF5YmFja1RpbWVyKCkgIHRpbWUgJTIwIiBQUklkNjQgIiAoJXMpIiwgbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOcywgd2hlcmUpOwotCi0gICAgaWYgKG1MYXN0U3RhcnRlZFBsYXlpbmdUaW1lTnMgIT0gMCkgewotICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwotICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGludDY0X3Qgbm93ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgICAgaW50NjRfdCBwbGF5ZWQgPSBub3cgLSBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zOwotICAgICAgICAgICAgQUxPR1YoInN0b3BQbGF5YmFja1RpbWVyKCkgIGxvZyAgJTIwIiBQUklkNjQgIiIsIHBsYXllZCk7Ci0KLSAgICAgICAgICAgIGlmIChwbGF5ZWQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlNb3JlUGxheWluZ1RpbWVVcyhtU3JjSWQsIChwbGF5ZWQrNTAwKS8xMDAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtTGFzdFN0YXJ0ZWRQbGF5aW5nVGltZU5zID0gMDsKLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpzdGFydFJlYnVmZmVyaW5nVGltZXIoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1QbGF5aW5nVGltZUxvY2spOwotICAgIGlmIChtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOcyA9PSAwKSB7Ci0gICAgICAgIG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zID0gc3lzdGVtVGltZSgpOwotICAgICAgICBBTE9HVigic3RhcnRSZWJ1ZmZlcmluZ1RpbWVyKCkgdGltZSAlMjAiIFBSSWQ2NCAiIiwgIG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zKTsKLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpzdG9wUmVidWZmZXJpbmdUaW1lcihib29sIGV4aXRpbmdQbGF5YmFjaykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtUGxheWluZ1RpbWVMb2NrKTsKLQotICAgIEFMT0dWKCJzdG9wUmVidWZmZXJUaW1lcigpICB0aW1lICUyMCIgUFJJZDY0ICIgKGV4aXRpbmcgJWQpIiwgbUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMsIGV4aXRpbmdQbGF5YmFjayk7Ci0KLSAgICBpZiAobUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnMgIT0gMCkgewotICAgICAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwotICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGludDY0X3Qgbm93ID0gc3lzdGVtVGltZSgpOwotICAgICAgICAgICAgaW50NjRfdCByZWJ1ZmZlcmVkID0gbm93IC0gbUxhc3RTdGFydGVkUmVidWZmZXJpbmdUaW1lTnM7Ci0gICAgICAgICAgICBBTE9HVigic3RvcFJlYnVmZmVyaW5nVGltZXIoKSAgbG9nICAlMjAiIFBSSWQ2NCAiIiwgcmVidWZmZXJlZCk7Ci0KLSAgICAgICAgICAgIGlmIChyZWJ1ZmZlcmVkID4gMCkgewotICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5TW9yZVJlYnVmZmVyaW5nVGltZVVzKG1TcmNJZCwgKHJlYnVmZmVyZWQrNTAwKS8xMDAwKTsKLSAgICAgICAgICAgICAgICBpZiAoZXhpdGluZ1BsYXliYWNrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5UmVidWZmZXJpbmdXaGVuRXhpdChtU3JjSWQsIHRydWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBtTGFzdFN0YXJ0ZWRSZWJ1ZmZlcmluZ1RpbWVOcyA9IDA7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMjo6b25QYXVzZSgpIHsKLQotICAgIHN0b3BQbGF5YmFja1RpbWVyKCJvblBhdXNlIik7Ci0KLSAgICBpZiAobVBhdXNlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1QYXVzZWQgPSB0cnVlOwotICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbVNvdXJjZS0+cGF1c2UoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygicGF1c2UgY2FsbGVkIHdoZW4gc291cmNlIGlzIGdvbmUgb3Igbm90IHNldCIpOwotICAgIH0KLSAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKLSAgICAgICAgbVJlbmRlcmVyLT5wYXVzZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJwYXVzZSBjYWxsZWQgd2hlbiByZW5kZXJlciBpcyBnb25lIG9yIG5vdCBzZXQiKTsKLSAgICB9Ci0KLX0KLQotYm9vbCBOdVBsYXllcjI6OmF1ZGlvRGVjb2RlclN0aWxsTmVlZGVkKCkgewotICAgIC8vIEF1ZGlvIGRlY29kZXIgaXMgbm8gbG9uZ2VyIG5lZWRlZCBpZiBpdCdzIGluIHNodXQvc2h1dHRpbmcgZG93biBzdGF0dXMuCi0gICAgcmV0dXJuICgobUZsdXNoaW5nQXVkaW8gIT0gU0hVVF9ET1dOKSAmJiAobUZsdXNoaW5nQXVkaW8gIT0gU0hVVFRJTkdfRE9XTl9ERUNPREVSKSk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpoYW5kbGVGbHVzaENvbXBsZXRlKGJvb2wgYXVkaW8sIGJvb2wgaXNEZWNvZGVyKSB7Ci0gICAgLy8gV2Ugd2FpdCBmb3IgYm90aCB0aGUgZGVjb2RlciBmbHVzaCBhbmQgdGhlIHJlbmRlcmVyIGZsdXNoIHRvIGNvbXBsZXRlCi0gICAgLy8gYmVmb3JlIGVudGVyaW5nIGVpdGhlciB0aGUgRkxVU0hFRCBvciB0aGUgU0hVVFRJTkdfRE9XTl9ERUNPREVSIHN0YXRlLgotCi0gICAgbUZsdXNoQ29tcGxldGVbYXVkaW9dW2lzRGVjb2Rlcl0gPSB0cnVlOwotICAgIGlmICghbUZsdXNoQ29tcGxldGVbYXVkaW9dWyFpc0RlY29kZXJdKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBGbHVzaFN0YXR1cyAqc3RhdGUgPSBhdWRpbyA/ICZtRmx1c2hpbmdBdWRpbyA6ICZtRmx1c2hpbmdWaWRlbzsKLSAgICBzd2l0Y2ggKCpzdGF0ZSkgewotICAgICAgICBjYXNlIEZMVVNISU5HX0RFQ09ERVI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgICpzdGF0ZSA9IEZMVVNIRUQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgRkxVU0hJTkdfREVDT0RFUl9TSFVURE9XTjoKLSAgICAgICAgewotICAgICAgICAgICAgKnN0YXRlID0gU0hVVFRJTkdfRE9XTl9ERUNPREVSOwotCi0gICAgICAgICAgICBBTE9HVigiaW5pdGlhdGluZyAlcyBkZWNvZGVyIHNodXRkb3duIiwgYXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIik7Ci0gICAgICAgICAgICBnZXREZWNvZGVyKGF1ZGlvKS0+aW5pdGlhdGVTaHV0ZG93bigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgLy8gZGVjb2RlciBmbHVzaCBjb21wbGV0ZXMgb25seSBvY2N1ciBpbiBhIGZsdXNoaW5nIHN0YXRlLgotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpc0RlY29kZXIsICJkZWNvZGVyIGZsdXNoIGluIGludmFsaWQgc3RhdGUgJWQiLCAqc3RhdGUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMjo6ZmluaXNoRmx1c2hJZlBvc3NpYmxlKCkgewotICAgIGlmIChtRmx1c2hpbmdBdWRpbyAhPSBOT05FICYmIG1GbHVzaGluZ0F1ZGlvICE9IEZMVVNIRUQKLSAgICAgICAgICAgICYmIG1GbHVzaGluZ0F1ZGlvICE9IFNIVVRfRE9XTikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1GbHVzaGluZ1ZpZGVvICE9IE5PTkUgJiYgbUZsdXNoaW5nVmlkZW8gIT0gRkxVU0hFRAotICAgICAgICAgICAgJiYgbUZsdXNoaW5nVmlkZW8gIT0gU0hVVF9ET1dOKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBBTE9HVigiYm90aCBhdWRpbyBhbmQgdmlkZW8gYXJlIGZsdXNoZWQgbm93LiIpOwotCi0gICAgbUZsdXNoaW5nQXVkaW8gPSBOT05FOwotICAgIG1GbHVzaGluZ1ZpZGVvID0gTk9ORTsKLQotICAgIGNsZWFyRmx1c2hDb21wbGV0ZSgpOwotCi0gICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOwotfQotCi12b2lkIE51UGxheWVyMjo6cG9zdFNjYW5Tb3VyY2VzKCkgewotICAgIGlmIChtU2NhblNvdXJjZXNQZW5kaW5nKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2NhblNvdXJjZXMsIHRoaXMpOwotICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtU2NhblNvdXJjZXNHZW5lcmF0aW9uKTsKLSAgICBtc2ctPnBvc3QoKTsKLQotICAgIG1TY2FuU291cmNlc1BlbmRpbmcgPSB0cnVlOwotfQotCi12b2lkIE51UGxheWVyMjo6dHJ5T3BlbkF1ZGlvU2lua0Zvck9mZmxvYWQoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCBzcDxNZXRhRGF0YT4gJmF1ZGlvTWV0YSwgYm9vbCBoYXNWaWRlbykgewotICAgIC8vIE5vdGU6IFRoaXMgaXMgY2FsbGVkIGVhcmx5IGluIE51UGxheWVyMiB0byBkZXRlcm1pbmUgd2hldGhlciBvZmZsb2FkaW5nCi0gICAgLy8gaXMgcG9zc2libGU7IG90aGVyd2lzZSB0aGUgZGVjb2RlcnMgY2FsbCB0aGUgcmVuZGVyZXIgb3BlbkF1ZGlvU2luayBkaXJlY3RseS4KLQotICAgIHN0YXR1c190IGVyciA9IG1SZW5kZXJlci0+b3BlbkF1ZGlvU2luaygKLSAgICAgICAgICAgIGZvcm1hdCwgdHJ1ZSAvKiBvZmZsb2FkT25seSAqLywgaGFzVmlkZW8sCi0gICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmbU9mZmxvYWRBdWRpbywgbVNvdXJjZS0+aXNTdHJlYW1pbmcoKSk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAvLyBBbnkgZmFpbHVyZSB3ZSB0dXJuIG9mZiBtT2ZmbG9hZEF1ZGlvLgotICAgICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7Ci0gICAgfSBlbHNlIGlmIChtT2ZmbG9hZEF1ZGlvKSB7Ci0gICAgICAgIHNlbmRNZXRhRGF0YVRvSGFsKG1BdWRpb1NpbmssIGF1ZGlvTWV0YSk7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMjo6Y2xvc2VBdWRpb1NpbmsoKSB7Ci0gICAgbVJlbmRlcmVyLT5jbG9zZUF1ZGlvU2luaygpOwotfQotCi12b2lkIE51UGxheWVyMjo6cmVzdGFydEF1ZGlvKAotICAgICAgICBpbnQ2NF90IGN1cnJlbnRQb3NpdGlvblVzLCBib29sIGZvcmNlTm9uT2ZmbG9hZCwgYm9vbCBuZWVkc1RvQ3JlYXRlQXVkaW9EZWNvZGVyKSB7Ci0gICAgaWYgKG1BdWRpb0RlY29kZXIgIT0gTlVMTCkgewotICAgICAgICBtQXVkaW9EZWNvZGVyLT5wYXVzZSgpOwotICAgICAgICBtQXVkaW9EZWNvZGVyLmNsZWFyKCk7Ci0gICAgICAgIG1BdWRpb0RlY29kZXJFcnJvciA9IGZhbHNlOwotICAgICAgICArK21BdWRpb0RlY29kZXJHZW5lcmF0aW9uOwotICAgIH0KLSAgICBpZiAobUZsdXNoaW5nQXVkaW8gPT0gRkxVU0hJTkdfREVDT0RFUikgewotICAgICAgICBtRmx1c2hDb21wbGV0ZVsxIC8qIGF1ZGlvICovXVsxIC8qIGlzRGVjb2RlciAqL10gPSB0cnVlOwotICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IEZMVVNIRUQ7Ci0gICAgICAgIGZpbmlzaEZsdXNoSWZQb3NzaWJsZSgpOwotICAgIH0gZWxzZSBpZiAobUZsdXNoaW5nQXVkaW8gPT0gRkxVU0hJTkdfREVDT0RFUl9TSFVURE9XTgotICAgICAgICAgICAgfHwgbUZsdXNoaW5nQXVkaW8gPT0gU0hVVFRJTkdfRE9XTl9ERUNPREVSKSB7Ci0gICAgICAgIG1GbHVzaENvbXBsZXRlWzEgLyogYXVkaW8gKi9dWzEgLyogaXNEZWNvZGVyICovXSA9IHRydWU7Ci0gICAgICAgIG1GbHVzaGluZ0F1ZGlvID0gU0hVVF9ET1dOOwotICAgICAgICBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKLSAgICAgICAgbmVlZHNUb0NyZWF0ZUF1ZGlvRGVjb2RlciA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAobVJlbmRlcmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjbG9zZUF1ZGlvU2luaygpOwotICAgIG1SZW5kZXJlci0+Zmx1c2godHJ1ZSAvKiBhdWRpbyAqLywgZmFsc2UgLyogbm90aWZ5Q29tcGxldGUgKi8pOwotICAgIGlmIChtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKLSAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2soCi0gICAgICAgICAgICAgICAgbmV3IEZsdXNoRGVjb2RlckFjdGlvbihGTFVTSF9DTURfTk9ORSAvKiBhdWRpbyAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZMVVNIX0NNRF9GTFVTSCAvKiB2aWRlbyAqLykpOwotICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICBuZXcgU2Vla0FjdGlvbihjdXJyZW50UG9zaXRpb25VcywKLSAgICAgICAgICAgICAgICBNZWRpYVBsYXllclNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMgLyogbW9kZSAqLykpOwotICAgICAgICAvLyBBZnRlciBhIGZsdXNoIHdpdGhvdXQgc2h1dGRvd24sIGRlY29kZXIgaXMgcGF1c2VkLgotICAgICAgICAvLyBEb24ndCByZXN1bWUgaXQgdW50aWwgc291cmNlIHNlZWsgaXMgZG9uZSwgb3RoZXJ3aXNlIGl0IGNvdWxkCi0gICAgICAgIC8vIHN0YXJ0IHB1bGxpbmcgc3RhbGUgZGF0YSB0b28gc29vbi4KLSAgICAgICAgbURlZmVycmVkQWN0aW9ucy5wdXNoX2JhY2sobmV3IFJlc3VtZURlY29kZXJBY3Rpb24oZmFsc2UpKTsKLSAgICAgICAgcHJvY2Vzc0RlZmVycmVkQWN0aW9ucygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHBlcmZvcm1TZWVrKGN1cnJlbnRQb3NpdGlvblVzLCBNZWRpYVBsYXllclNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMgLyogbW9kZSAqLyk7Ci0gICAgfQotCi0gICAgaWYgKGZvcmNlTm9uT2ZmbG9hZCkgewotICAgICAgICBtUmVuZGVyZXItPnNpZ25hbERpc2FibGVPZmZsb2FkQXVkaW8oKTsKLSAgICAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAobmVlZHNUb0NyZWF0ZUF1ZGlvRGVjb2RlcikgewotICAgICAgICBpbnN0YW50aWF0ZURlY29kZXIodHJ1ZSAvKiBhdWRpbyAqLywgJm1BdWRpb0RlY29kZXIsICFmb3JjZU5vbk9mZmxvYWQpOwotICAgIH0KLX0KLQotdm9pZCBOdVBsYXllcjI6OmRldGVybWluZUF1ZGlvTW9kZUNoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJmF1ZGlvRm9ybWF0KSB7Ci0gICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCB8fCBtQXVkaW9TaW5rID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtUmVuZGVyZXIgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiTm8gcmVuZGVyZXIgY2FuIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIGF1ZGlvIG1vZGUuIFVzZSBub24tb2ZmbG9hZCBmb3Igc2FmZXR5LiIpOwotICAgICAgICBtT2ZmbG9hZEF1ZGlvID0gZmFsc2U7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzcDxNZXRhRGF0YT4gYXVkaW9NZXRhID0gbVNvdXJjZS0+Z2V0Rm9ybWF0TWV0YSh0cnVlIC8qIGF1ZGlvICovKTsKLSAgICBzcDxBTWVzc2FnZT4gdmlkZW9Gb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoZmFsc2UgLyogYXVkaW8gKi8pOwotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IG1BdWRpb1NpbmstPmdldEF1ZGlvU3RyZWFtVHlwZSgpOwotICAgIGNvbnN0IGJvb2wgaGFzVmlkZW8gPSAodmlkZW9Gb3JtYXQgIT0gTlVMTCk7Ci0gICAgYm9vbCBjYW5PZmZsb2FkID0gY2FuT2ZmbG9hZFN0cmVhbSgKLSAgICAgICAgICAgIGF1ZGlvTWV0YSwgaGFzVmlkZW8sIG1Tb3VyY2UtPmlzU3RyZWFtaW5nKCksIHN0cmVhbVR5cGUpCi0gICAgICAgICAgICAgICAgICAgICYmIChtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQgPT0gMS5mICYmIG1QbGF5YmFja1NldHRpbmdzLm1QaXRjaCA9PSAxLmYpOwotCi0gICAgLy8gTW9kdWxhciBEUk06IERpc2FibGluZyBhdWRpbyBvZmZsb2FkIGlmIHRoZSBzb3VyY2UgaXMgcHJvdGVjdGVkCi0gICAgaWYgKGNhbk9mZmxvYWQgJiYgbUlzRHJtUHJvdGVjdGVkKSB7Ci0gICAgICAgIGNhbk9mZmxvYWQgPSBmYWxzZTsKLSAgICAgICAgQUxPR1YoImRldGVybWluZUF1ZGlvTW9kZUNoYW5nZTogRGlzYWJsaW5nIG1PZmZsb2FkQXVkaW8gYi9jIHRoZSBzb3VyY2UgaXMgcHJvdGVjdGVkLiIpOwotICAgIH0KLQotICAgIGlmIChjYW5PZmZsb2FkKSB7Ci0gICAgICAgIGlmICghbU9mZmxvYWRBdWRpbykgewotICAgICAgICAgICAgbVJlbmRlcmVyLT5zaWduYWxFbmFibGVPZmZsb2FkQXVkaW8oKTsKLSAgICAgICAgfQotICAgICAgICAvLyBvcGVuIGF1ZGlvIHNpbmsgZWFybHkgdW5kZXIgb2ZmbG9hZCBtb2RlLgotICAgICAgICB0cnlPcGVuQXVkaW9TaW5rRm9yT2ZmbG9hZChhdWRpb0Zvcm1hdCwgYXVkaW9NZXRhLCBoYXNWaWRlbyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1PZmZsb2FkQXVkaW8pIHsKLSAgICAgICAgICAgIG1SZW5kZXJlci0+c2lnbmFsRGlzYWJsZU9mZmxvYWRBdWRpbygpOwotICAgICAgICAgICAgbU9mZmxvYWRBdWRpbyA9IGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0dXNfdCBOdVBsYXllcjI6Omluc3RhbnRpYXRlRGVjb2RlcigKLSAgICAgICAgYm9vbCBhdWRpbywgc3A8RGVjb2RlckJhc2U+ICpkZWNvZGVyLCBib29sIGNoZWNrQXVkaW9Nb2RlQ2hhbmdlKSB7Ci0gICAgLy8gVGhlIGF1ZGlvIGRlY29kZXIgY291bGQgYmUgY2xlYXJlZCBieSB0ZWFyIGRvd24uIElmIHN0aWxsIGluIHNodXQgZG93bgotICAgIC8vIHByb2Nlc3MsIG5vIG5lZWQgdG8gY3JlYXRlIGEgbmV3IGF1ZGlvIGRlY29kZXIuCi0gICAgaWYgKCpkZWNvZGVyICE9IE5VTEwgfHwgKGF1ZGlvICYmIG1GbHVzaGluZ0F1ZGlvID09IFNIVVRfRE9XTikpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBtU291cmNlLT5nZXRGb3JtYXQoYXVkaW8pOwotCi0gICAgaWYgKGZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0YXR1c190IGVycjsKLSAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSAmJiBlcnIpIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3JtYXQtPnNldEludDMyKCJwcmlvcml0eSIsIDAgLyogcmVhbHRpbWUgKi8pOwotCi0gICAgaWYgKCFhdWRpbykgewotICAgICAgICBBU3RyaW5nIG1pbWU7Ci0gICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IGNjTm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2xvc2VkQ2FwdGlvbk5vdGlmeSwgdGhpcyk7Ci0gICAgICAgIGlmIChtQ0NEZWNvZGVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIG1DQ0RlY29kZXIgPSBuZXcgQ0NEZWNvZGVyKGNjTm90aWZ5KTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfU0VDVVJFKSB7Ci0gICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJzZWN1cmUiLCB0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfUFJPVEVDVEVEKSB7Ci0gICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJwcm90ZWN0ZWQiLCB0cnVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZsb2F0IHJhdGUgPSBnZXRGcmFtZVJhdGUoKTsKLSAgICAgICAgaWYgKHJhdGUgPiAwKSB7Ci0gICAgICAgICAgICBmb3JtYXQtPnNldEZsb2F0KCJvcGVyYXRpbmctcmF0ZSIsIHJhdGUgKiBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb05vdGlmeSwgdGhpcyk7Ci0gICAgICAgICsrbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247Ci0gICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtQXVkaW9EZWNvZGVyR2VuZXJhdGlvbik7Ci0KLSAgICAgICAgaWYgKGNoZWNrQXVkaW9Nb2RlQ2hhbmdlKSB7Ci0gICAgICAgICAgICBkZXRlcm1pbmVBdWRpb01vZGVDaGFuZ2UoZm9ybWF0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAobU9mZmxvYWRBdWRpbykgewotICAgICAgICAgICAgbVNvdXJjZS0+c2V0T2ZmbG9hZEF1ZGlvKHRydWUgLyogb2ZmbG9hZCAqLyk7Ci0KLSAgICAgICAgICAgIGNvbnN0IGJvb2wgaGFzVmlkZW8gPSAobVNvdXJjZS0+Z2V0Rm9ybWF0KGZhbHNlIC8qYXVkaW8gKi8pICE9IE5VTEwpOwotICAgICAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiaGFzLXZpZGVvIiwgaGFzVmlkZW8pOwotICAgICAgICAgICAgKmRlY29kZXIgPSBuZXcgRGVjb2RlclBhc3NUaHJvdWdoKG5vdGlmeSwgbVNvdXJjZSwgbVJlbmRlcmVyKTsKLSAgICAgICAgICAgIEFMT0dWKCJpbnN0YW50aWF0ZURlY29kZXIgYXVkaW8gRGVjb2RlclBhc3NUaHJvdWdoICBoYXNWaWRlbzogJWQiLCBoYXNWaWRlbyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtU291cmNlLT5zZXRPZmZsb2FkQXVkaW8oZmFsc2UgLyogb2ZmbG9hZCAqLyk7Ci0KLSAgICAgICAgICAgICpkZWNvZGVyID0gbmV3IERlY29kZXIobm90aWZ5LCBtU291cmNlLCBtUElELCBtVUlELCBtUmVuZGVyZXIpOwotICAgICAgICAgICAgQUxPR1YoImluc3RhbnRpYXRlRGVjb2RlciBhdWRpbyBEZWNvZGVyIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUF1ZGlvRGVjb2RlckVycm9yID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdFZpZGVvTm90aWZ5LCB0aGlzKTsKLSAgICAgICAgKyttVmlkZW9EZWNvZGVyR2VuZXJhdGlvbjsKLSAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1WaWRlb0RlY29kZXJHZW5lcmF0aW9uKTsKLQotICAgICAgICAqZGVjb2RlciA9IG5ldyBEZWNvZGVyKAotICAgICAgICAgICAgICAgIG5vdGlmeSwgbVNvdXJjZSwgbVBJRCwgbVVJRCwgbVJlbmRlcmVyLCBtTmF0aXZlV2luZG93LCBtQ0NEZWNvZGVyKTsKLSAgICAgICAgbVZpZGVvRGVjb2RlckVycm9yID0gZmFsc2U7Ci0KLSAgICAgICAgLy8gZW5hYmxlIEZSQyBpZiBoaWdoLXF1YWxpdHkgQVYgc3luYyBpcyByZXF1ZXN0ZWQsIGV2ZW4gaWYgbm90Ci0gICAgICAgIC8vIGRpcmVjdGx5IHF1ZXVpbmcgdG8gZGlzcGxheSwgYXMgdGhpcyB3aWxsIGV2ZW4gaW1wcm92ZSB0ZXh0dXJldmlldwotICAgICAgICAvLyBwbGF5YmFjay4KLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LnN5cy5tZWRpYS5hdnN5bmMiLCBmYWxzZSkpIHsKLSAgICAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJhdXRvLWZyYyIsIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgICgqZGVjb2RlciktPmluaXQoKTsKLQotICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgaWYgKG1Jc0RybVByb3RlY3RlZCkgewotICAgICAgICBmb3JtYXQtPnNldE9iamVjdCgiY3J5cHRvIiwgbUNyeXB0byk7Ci0gICAgICAgIEFMT0dWKCJpbnN0YW50aWF0ZURlY29kZXI6IG1DcnlwdG86ICVwIGlzU2VjdXJlOiAlZCIsIG1DcnlwdG8uZ2V0KCksCi0gICAgICAgICAgICAgICAgKG1Tb3VyY2VGbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpICE9IDApOwotICAgIH0KLQotICAgICgqZGVjb2RlciktPmNvbmZpZ3VyZShmb3JtYXQpOwotCi0gICAgaWYgKCFhdWRpbykgewotICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlKCk7Ci0gICAgICAgIGZsb2F0IHJhdGUgPSBnZXRGcmFtZVJhdGUoKTsKLSAgICAgICAgaWYgKHJhdGUgPiAwKSB7Ci0gICAgICAgICAgICBwYXJhbXMtPnNldEZsb2F0KCJmcmFtZS1yYXRlLXRvdGFsIiwgcmF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzcDxNZXRhRGF0YT4gZmlsZU1ldGEgPSBnZXRGaWxlTWV0YSgpOwotICAgICAgICBpZiAoZmlsZU1ldGEgIT0gTlVMTCkgewotICAgICAgICAgICAgaW50MzJfdCB2aWRlb1RlbXBvcmFsTGF5ZXJDb3VudDsKLSAgICAgICAgICAgIGlmIChmaWxlTWV0YS0+ZmluZEludDMyKGtLZXlUZW1wb3JhbExheWVyQ291bnQsICZ2aWRlb1RlbXBvcmFsTGF5ZXJDb3VudCkKLSAgICAgICAgICAgICAgICAgICAgJiYgdmlkZW9UZW1wb3JhbExheWVyQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigidGVtcG9yYWwtbGF5ZXItY291bnQiLCB2aWRlb1RlbXBvcmFsTGF5ZXJDb3VudCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAocGFyYW1zLT5jb3VudEVudHJpZXMoKSA+IDApIHsKLSAgICAgICAgICAgICgqZGVjb2RlciktPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjp1cGRhdGVWaWRlb1NpemUoCi0gICAgICAgIGludDY0X3Qgc3JjSWQsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmaW5wdXRGb3JtYXQsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmb3V0cHV0Rm9ybWF0KSB7Ci0gICAgaWYgKGlucHV0Rm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coIlVua25vd24gdmlkZW8gc2l6ZSwgcmVwb3J0aW5nIDB4MCEiKTsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXIoc3JjSWQsIE1FRElBMl9TRVRfVklERU9fU0laRSwgMCwgMCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaW50MzJfdCBlcnIgPSBPSzsKLSAgICBpbnB1dEZvcm1hdC0+ZmluZEludDMyKCJlcnIiLCAmZXJyKTsKLSAgICBpZiAoZXJyID09IC1FV09VTERCTE9DSykgewotICAgICAgICBBTE9HVygiVmlkZW8gbWV0YSBpcyBub3QgYXZhaWxhYmxlIHlldCEiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dXKCJTb21ldGhpbmcgaXMgd3Jvbmcgd2l0aCB2aWRlbyBtZXRhISIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50MzJfdCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQ7Ci0gICAgaWYgKG91dHB1dEZvcm1hdCAhPSBOVUxMKSB7Ci0gICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKSk7Ci0gICAgICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7Ci0KLSAgICAgICAgaW50MzJfdCBjcm9wTGVmdCwgY3JvcFRvcCwgY3JvcFJpZ2h0LCBjcm9wQm90dG9tOwotICAgICAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRSZWN0KAotICAgICAgICAgICAgICAgICAgICAiY3JvcCIsCi0gICAgICAgICAgICAgICAgICAgICZjcm9wTGVmdCwgJmNyb3BUb3AsICZjcm9wUmlnaHQsICZjcm9wQm90dG9tKSk7Ci0KLSAgICAgICAgZGlzcGxheVdpZHRoID0gY3JvcFJpZ2h0IC0gY3JvcExlZnQgKyAxOwotICAgICAgICBkaXNwbGF5SGVpZ2h0ID0gY3JvcEJvdHRvbSAtIGNyb3BUb3AgKyAxOwotCi0gICAgICAgIEFMT0dWKCJWaWRlbyBvdXRwdXQgZm9ybWF0IGNoYW5nZWQgdG8gJWQgeCAlZCAiCi0gICAgICAgICAgICAgIihjcm9wOiAlZCB4ICVkIEAgKCVkLCAlZCkpIiwKLSAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LAotICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwKLSAgICAgICAgICAgICBkaXNwbGF5SGVpZ2h0LAotICAgICAgICAgICAgIGNyb3BMZWZ0LCBjcm9wVG9wKTsKLSAgICB9IGVsc2UgewotICAgICAgICBDSEVDSyhpbnB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZkaXNwbGF5V2lkdGgpKTsKLSAgICAgICAgQ0hFQ0soaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmRpc3BsYXlIZWlnaHQpKTsKLQotICAgICAgICBBTE9HVigiVmlkZW8gaW5wdXQgZm9ybWF0ICVkIHggJWQiLCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpOwotICAgIH0KLQotICAgIC8vIFRha2UgaW50byBhY2NvdW50IHNhbXBsZSBhc3BlY3QgcmF0aW8gaWYgbmVjZXNzYXJ5OgotICAgIGludDMyX3Qgc2FyV2lkdGgsIHNhckhlaWdodDsKLSAgICBpZiAoaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigic2FyLXdpZHRoIiwgJnNhcldpZHRoKQotICAgICAgICAgICAgJiYgaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigic2FyLWhlaWdodCIsICZzYXJIZWlnaHQpCi0gICAgICAgICAgICAmJiBzYXJXaWR0aCA+IDAgJiYgc2FySGVpZ2h0ID4gMCkgewotICAgICAgICBBTE9HVigiU2FtcGxlIGFzcGVjdCByYXRpbyAlZCA6ICVkIiwgc2FyV2lkdGgsIHNhckhlaWdodCk7Ci0KLSAgICAgICAgZGlzcGxheVdpZHRoID0gKGRpc3BsYXlXaWR0aCAqIHNhcldpZHRoKSAvIHNhckhlaWdodDsKLQotICAgICAgICBBTE9HVigiZGlzcGxheSBkaW1lbnNpb25zICVkIHggJWQiLCBkaXNwbGF5V2lkdGgsIGRpc3BsYXlIZWlnaHQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgaWYgKGlucHV0Rm9ybWF0LT5maW5kSW50MzIoImRpc3BsYXktd2lkdGgiLCAmd2lkdGgpCi0gICAgICAgICAgICAgICAgJiYgaW5wdXRGb3JtYXQtPmZpbmRJbnQzMigiZGlzcGxheS1oZWlnaHQiLCAmaGVpZ2h0KQotICAgICAgICAgICAgICAgICYmIHdpZHRoID4gMCAmJiBoZWlnaHQgPiAwCi0gICAgICAgICAgICAgICAgJiYgZGlzcGxheVdpZHRoID4gMCAmJiBkaXNwbGF5SGVpZ2h0ID4gMCkgewotICAgICAgICAgICAgaWYgKGRpc3BsYXlIZWlnaHQgKiAoaW50NjRfdCl3aWR0aCAvIGhlaWdodCA+IChpbnQ2NF90KWRpc3BsYXlXaWR0aCkgewotICAgICAgICAgICAgICAgIGRpc3BsYXlIZWlnaHQgPSAoaW50MzJfdCkoZGlzcGxheVdpZHRoICogKGludDY0X3QpaGVpZ2h0IC8gd2lkdGgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkaXNwbGF5V2lkdGggPSAoaW50MzJfdCkoZGlzcGxheUhlaWdodCAqIChpbnQ2NF90KXdpZHRoIC8gaGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJWaWRlbyBkaXNwbGF5IHdpZHRoIGFuZCBoZWlnaHQgYXJlIG92ZXJyaWRkZW4gdG8gJWQgeCAlZCIsCi0gICAgICAgICAgICAgICAgIGRpc3BsYXlXaWR0aCwgZGlzcGxheUhlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQzMl90IHJvdGF0aW9uRGVncmVlczsKLSAgICBpZiAoIWlucHV0Rm9ybWF0LT5maW5kSW50MzIoInJvdGF0aW9uLWRlZ3JlZXMiLCAmcm90YXRpb25EZWdyZWVzKSkgewotICAgICAgICByb3RhdGlvbkRlZ3JlZXMgPSAwOwotICAgIH0KLQotICAgIGlmIChyb3RhdGlvbkRlZ3JlZXMgPT0gOTAgfHwgcm90YXRpb25EZWdyZWVzID09IDI3MCkgewotICAgICAgICBpbnQzMl90IHRtcCA9IGRpc3BsYXlXaWR0aDsKLSAgICAgICAgZGlzcGxheVdpZHRoID0gZGlzcGxheUhlaWdodDsKLSAgICAgICAgZGlzcGxheUhlaWdodCA9IHRtcDsKLSAgICB9Ci0KLSAgICBub3RpZnlMaXN0ZW5lcigKLSAgICAgICAgICAgIHNyY0lkLAotICAgICAgICAgICAgTUVESUEyX1NFVF9WSURFT19TSVpFLAotICAgICAgICAgICAgZGlzcGxheVdpZHRoLAotICAgICAgICAgICAgZGlzcGxheUhlaWdodCk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpub3RpZnlMaXN0ZW5lcihpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKLSAgICBpZiAobURyaXZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzcDxOdVBsYXllcjJEcml2ZXI+IGRyaXZlciA9IG1Ecml2ZXIucHJvbW90ZSgpOwotCi0gICAgaWYgKGRyaXZlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBkcml2ZXItPm5vdGlmeUxpc3RlbmVyKHNyY0lkLCBtc2csIGV4dDEsIGV4dDIsIGluKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OmZsdXNoRGVjb2Rlcihib29sIGF1ZGlvLCBib29sIG5lZWRTaHV0ZG93bikgewotICAgIEFMT0dWKCJbJXNdIGZsdXNoRGVjb2RlciBuZWVkU2h1dGRvd249JWQiLAotICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIsIG5lZWRTaHV0ZG93bik7Ci0KLSAgICBjb25zdCBzcDxEZWNvZGVyQmFzZT4gJmRlY29kZXIgPSBnZXREZWNvZGVyKGF1ZGlvKTsKLSAgICBpZiAoZGVjb2RlciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dJKCJmbHVzaERlY29kZXIgJXMgd2l0aG91dCBkZWNvZGVyIHByZXNlbnQiLAotICAgICAgICAgICAgIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gTWFrZSBzdXJlIHdlIGRvbid0IGNvbnRpbnVlIHRvIHNjYW4gc291cmNlcyB1bnRpbCB3ZSBmaW5pc2ggZmx1c2hpbmcuCi0gICAgKyttU2NhblNvdXJjZXNHZW5lcmF0aW9uOwotICAgIGlmIChtU2NhblNvdXJjZXNQZW5kaW5nKSB7Ci0gICAgICAgIGlmICghbmVlZFNodXRkb3duKSB7Ci0gICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICAgICAgbmV3IFNpbXBsZUFjdGlvbigmTnVQbGF5ZXIyOjpwZXJmb3JtU2NhblNvdXJjZXMpKTsKLSAgICAgICAgfQotICAgICAgICBtU2NhblNvdXJjZXNQZW5kaW5nID0gZmFsc2U7Ci0gICAgfQotCi0gICAgZGVjb2Rlci0+c2lnbmFsRmx1c2goKTsKLQotICAgIEZsdXNoU3RhdHVzIG5ld1N0YXR1cyA9Ci0gICAgICAgIG5lZWRTaHV0ZG93biA/IEZMVVNISU5HX0RFQ09ERVJfU0hVVERPV04gOiBGTFVTSElOR19ERUNPREVSOwotCi0gICAgbUZsdXNoQ29tcGxldGVbYXVkaW9dW2ZhbHNlIC8qIGlzRGVjb2RlciAqL10gPSAobVJlbmRlcmVyID09IE5VTEwpOwotICAgIG1GbHVzaENvbXBsZXRlW2F1ZGlvXVt0cnVlIC8qIGlzRGVjb2RlciAqL10gPSBmYWxzZTsKLSAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgQUxPR0VfSUYobUZsdXNoaW5nQXVkaW8gIT0gTk9ORSwKLSAgICAgICAgICAgICAgICAiYXVkaW8gZmx1c2hEZWNvZGVyKCkgaXMgY2FsbGVkIGluIHN0YXRlICVkIiwgbUZsdXNoaW5nQXVkaW8pOwotICAgICAgICBtRmx1c2hpbmdBdWRpbyA9IG5ld1N0YXR1czsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRV9JRihtRmx1c2hpbmdWaWRlbyAhPSBOT05FLAotICAgICAgICAgICAgICAgICJ2aWRlbyBmbHVzaERlY29kZXIoKSBpcyBjYWxsZWQgaW4gc3RhdGUgJWQiLCBtRmx1c2hpbmdWaWRlbyk7Ci0gICAgICAgIG1GbHVzaGluZ1ZpZGVvID0gbmV3U3RhdHVzOwotICAgIH0KLX0KLQotdm9pZCBOdVBsYXllcjI6OnF1ZXVlRGVjb2RlclNodXRkb3duKAotICAgICAgICBib29sIGF1ZGlvLCBib29sIHZpZGVvLCBjb25zdCBzcDxBTWVzc2FnZT4gJnJlcGx5KSB7Ci0gICAgQUxPR0koInF1ZXVlRGVjb2RlclNodXRkb3duIGF1ZGlvPSVkLCB2aWRlbz0lZCIsIGF1ZGlvLCB2aWRlbyk7Ci0KLSAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKLSAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oCi0gICAgICAgICAgICAgICAgYXVkaW8gPyBGTFVTSF9DTURfU0hVVERPV04gOiBGTFVTSF9DTURfTk9ORSwKLSAgICAgICAgICAgICAgICB2aWRlbyA/IEZMVVNIX0NNRF9TSFVURE9XTiA6IEZMVVNIX0NNRF9OT05FKSk7Ci0KLSAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKLSAgICAgICAgICAgIG5ldyBTaW1wbGVBY3Rpb24oJk51UGxheWVyMjo6cGVyZm9ybVNjYW5Tb3VyY2VzKSk7Ci0KLSAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjayhuZXcgUG9zdE1lc3NhZ2VBY3Rpb24ocmVwbHkpKTsKLQotICAgIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyOjpzZXRWaWRlb1NjYWxpbmdNb2RlKGludDMyX3QgbW9kZSkgewotICAgIG1WaWRlb1NjYWxpbmdNb2RlID0gbW9kZTsKLSAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMICYmIG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSAhPSBOVUxMKSB7Ci0gICAgICAgIHN0YXR1c190IHJldCA9IG5hdGl2ZV93aW5kb3dfc2V0X3NjYWxpbmdfbW9kZSgKLSAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCksIG1WaWRlb1NjYWxpbmdNb2RlKTsKLSAgICAgICAgaWYgKHJldCAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBzZXQgc2NhbGluZyBtb2RlICglZCk6ICVzIiwKLSAgICAgICAgICAgICAgICAtcmV0LCBzdHJlcnJvcigtcmV0KSk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyOjpnZXRUcmFja0luZm8oUGFyY2VsKiByZXBseSkgY29uc3QgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRHZXRUcmFja0luZm8sIHRoaXMpOwotICAgIG1zZy0+c2V0UG9pbnRlcigicmVwbHkiLCByZXBseSk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMjo6Z2V0U2VsZWN0ZWRUcmFjayhpbnQzMl90IHR5cGUsIFBhcmNlbCogcmVwbHkpIGNvbnN0IHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0R2V0U2VsZWN0ZWRUcmFjaywgdGhpcyk7Ci0gICAgbXNnLT5zZXRQb2ludGVyKCJyZXBseSIsIHJlcGx5KTsKLSAgICBtc2ctPnNldEludDMyKCJ0eXBlIiwgdHlwZSk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwotICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgewotICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMjo6c2VsZWN0VHJhY2soc2l6ZV90IHRyYWNrSW5kZXgsIGJvb2wgc2VsZWN0LCBpbnQ2NF90IHRpbWVVcykgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTZWxlY3RUcmFjaywgdGhpcyk7Ci0gICAgbXNnLT5zZXRTaXplKCJ0cmFja0luZGV4IiwgdHJhY2tJbmRleCk7Ci0gICAgbXNnLT5zZXRJbnQzMigic2VsZWN0Iiwgc2VsZWN0KTsKLSAgICBtc2ctPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBpZiAoIXJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7Ci0gICAgICAgIGVyciA9IE9LOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMjo6Z2V0Q3VycmVudFBvc2l0aW9uKGludDY0X3QgKm1lZGlhVXMpIHsKLSAgICBzcDxSZW5kZXJlcj4gcmVuZGVyZXIgPSBtUmVuZGVyZXI7Ci0gICAgaWYgKHJlbmRlcmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlbmRlcmVyLT5nZXRDdXJyZW50UG9zaXRpb24obWVkaWFVcyk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpnZXRTdGF0cyhWZWN0b3I8c3A8QU1lc3NhZ2U+ID4gKm1UcmFja1N0YXRzKSB7Ci0gICAgQ0hFQ0sobVRyYWNrU3RhdHMgIT0gTlVMTCk7Ci0KLSAgICBtVHJhY2tTdGF0cy0+Y2xlYXIoKTsKLSAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1UcmFja1N0YXRzLT5wdXNoX2JhY2sobVZpZGVvRGVjb2Rlci0+Z2V0U3RhdHMoKSk7Ci0gICAgfQotICAgIGlmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwpIHsKLSAgICAgICAgbVRyYWNrU3RhdHMtPnB1c2hfYmFjayhtQXVkaW9EZWNvZGVyLT5nZXRTdGF0cygpKTsKLSAgICB9Ci19Ci0KLXNwPE1ldGFEYXRhPiBOdVBsYXllcjI6OmdldEZpbGVNZXRhKCkgewotICAgIHJldHVybiBtU291cmNlLT5nZXRGaWxlRm9ybWF0TWV0YSgpOwotfQotCi1mbG9hdCBOdVBsYXllcjI6OmdldEZyYW1lUmF0ZSgpIHsKLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1Tb3VyY2UtPmdldEZvcm1hdE1ldGEoZmFsc2UgLyogYXVkaW8gKi8pOwotICAgIGlmIChtZXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIGludDMyX3QgcmF0ZTsKLSAgICBpZiAoIW1ldGEtPmZpbmRJbnQzMihrS2V5RnJhbWVSYXRlLCAmcmF0ZSkpIHsKLSAgICAgICAgLy8gZmFsbCBiYWNrIHRvIHRyeSBmaWxlIG1ldGEKLSAgICAgICAgc3A8TWV0YURhdGE+IGZpbGVNZXRhID0gZ2V0RmlsZU1ldGEoKTsKLSAgICAgICAgaWYgKGZpbGVNZXRhID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dXKCJzb3VyY2UgaGFzIHZpZGVvIG1ldGEgYnV0IG5vdCBmaWxlIG1ldGEiKTsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBpbnQzMl90IGZpbGVNZXRhUmF0ZTsKLSAgICAgICAgaWYgKCFmaWxlTWV0YS0+ZmluZEludDMyKGtLZXlGcmFtZVJhdGUsICZmaWxlTWV0YVJhdGUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZpbGVNZXRhUmF0ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHJhdGU7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpzY2hlZHVsZVBvbGxEdXJhdGlvbigpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbER1cmF0aW9uLCB0aGlzKTsKLSAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbVBvbGxEdXJhdGlvbkdlbmVyYXRpb24pOwotICAgIG1zZy0+cG9zdCgpOwotfQotCi12b2lkIE51UGxheWVyMjo6Y2FuY2VsUG9sbER1cmF0aW9uKCkgewotICAgICsrbVBvbGxEdXJhdGlvbkdlbmVyYXRpb247Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCkgewotICAgIHdoaWxlICghbURlZmVycmVkQWN0aW9ucy5lbXB0eSgpKSB7Ci0gICAgICAgIC8vIFdlIHdvbid0IGV4ZWN1dGUgYW55IGRlZmVycmVkIGFjdGlvbnMgdW50aWwgd2UncmUgbm8gbG9uZ2VyIGluCi0gICAgICAgIC8vIGFuIGludGVybWVkaWF0ZSBzdGF0ZSwgaS5lLiBvbmUgbW9yZSBtb3JlIGRlY29kZXJzIGFyZSBjdXJyZW50bHkKLSAgICAgICAgLy8gZmx1c2hpbmcgb3Igc2h1dHRpbmcgZG93bi4KLQotICAgICAgICBpZiAobUZsdXNoaW5nQXVkaW8gIT0gTk9ORSB8fCBtRmx1c2hpbmdWaWRlbyAhPSBOT05FKSB7Ci0gICAgICAgICAgICAvLyBXZSdyZSBjdXJyZW50bHkgZmx1c2hpbmcsIHBvc3Rwb25lIHRoZSByZXNldCB1bnRpbCB0aGF0J3MKLSAgICAgICAgICAgIC8vIGNvbXBsZXRlZC4KLQotICAgICAgICAgICAgQUxPR1YoInBvc3Rwb25pbmcgYWN0aW9uIG1GbHVzaGluZ0F1ZGlvPSVkLCBtRmx1c2hpbmdWaWRlbz0lZCIsCi0gICAgICAgICAgICAgICAgICBtRmx1c2hpbmdBdWRpbywgbUZsdXNoaW5nVmlkZW8pOwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHNwPEFjdGlvbj4gYWN0aW9uID0gKm1EZWZlcnJlZEFjdGlvbnMuYmVnaW4oKTsKLSAgICAgICAgbURlZmVycmVkQWN0aW9ucy5lcmFzZShtRGVmZXJyZWRBY3Rpb25zLmJlZ2luKCkpOwotCi0gICAgICAgIGFjdGlvbi0+ZXhlY3V0ZSh0aGlzKTsKLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpwZXJmb3JtU2VlayhpbnQ2NF90IHNlZWtUaW1lVXMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUpIHsKLSAgICBBTE9HVigicGVyZm9ybVNlZWsgc2Vla1RpbWVVcz0lbGxkIHVzICglLjJmIHNlY3MpLCBtb2RlPSVkIiwKLSAgICAgICAgICAobG9uZyBsb25nKXNlZWtUaW1lVXMsIHNlZWtUaW1lVXMgLyAxRTYsIG1vZGUpOwotCi0gICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgewotICAgICAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiByZXNldCBvY2N1cnMgcmlnaHQgYmVmb3JlIHRoZSBsb29wIG1vZGUKLSAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgc2Vla3MgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzdHJlYW0uCi0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUF1ZGlvRGVjb2RlciAhPSBOVUxMIHx8IG1WaWRlb0RlY29kZXIgIT0gTlVMTCwKLSAgICAgICAgICAgICAgICAibVNvdXJjZSBpcyBOVUxMIGFuZCBkZWNvZGVycyBub3QgTlVMTCBhdWRpbyglcCkgdmlkZW8oJXApIiwKLSAgICAgICAgICAgICAgICBtQXVkaW9EZWNvZGVyLmdldCgpLCBtVmlkZW9EZWNvZGVyLmdldCgpKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtUHJldmlvdXNTZWVrVGltZVVzID0gc2Vla1RpbWVVczsKLSAgICBtU291cmNlLT5zZWVrVG8oc2Vla1RpbWVVcywgbW9kZSk7Ci0gICAgKyttVGltZWRUZXh0R2VuZXJhdGlvbjsKLQotICAgIC8vIGV2ZXJ5dGhpbmcncyBmbHVzaGVkLCBjb250aW51ZSBwbGF5YmFjay4KLX0KLQotdm9pZCBOdVBsYXllcjI6OnBlcmZvcm1EZWNvZGVyRmx1c2goRmx1c2hDb21tYW5kIGF1ZGlvLCBGbHVzaENvbW1hbmQgdmlkZW8pIHsKLSAgICBBTE9HVigicGVyZm9ybURlY29kZXJGbHVzaCBhdWRpbz0lZCwgdmlkZW89JWQiLCBhdWRpbywgdmlkZW8pOwotCi0gICAgaWYgKChhdWRpbyA9PSBGTFVTSF9DTURfTk9ORSB8fCBtQXVkaW9EZWNvZGVyID09IE5VTEwpCi0gICAgICAgICAgICAmJiAodmlkZW8gPT0gRkxVU0hfQ01EX05PTkUgfHwgbVZpZGVvRGVjb2RlciA9PSBOVUxMKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGF1ZGlvICE9IEZMVVNIX0NNRF9OT05FICYmIG1BdWRpb0RlY29kZXIgIT0gTlVMTCkgewotICAgICAgICBmbHVzaERlY29kZXIodHJ1ZSAvKiBhdWRpbyAqLywgKGF1ZGlvID09IEZMVVNIX0NNRF9TSFVURE9XTikpOwotICAgIH0KLQotICAgIGlmICh2aWRlbyAhPSBGTFVTSF9DTURfTk9ORSAmJiBtVmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKLSAgICAgICAgZmx1c2hEZWNvZGVyKGZhbHNlIC8qIGF1ZGlvICovLCAodmlkZW8gPT0gRkxVU0hfQ01EX1NIVVRET1dOKSk7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMjo6cGVyZm9ybVJlc2V0KCkgewotICAgIEFMT0dWKCJwZXJmb3JtUmVzZXQiKTsKLQotICAgIENIRUNLKG1BdWRpb0RlY29kZXIgPT0gTlVMTCk7Ci0gICAgQ0hFQ0sobVZpZGVvRGVjb2RlciA9PSBOVUxMKTsKLQotICAgIHN0b3BQbGF5YmFja1RpbWVyKCJwZXJmb3JtUmVzZXQiKTsKLSAgICBzdG9wUmVidWZmZXJpbmdUaW1lcih0cnVlKTsKLQotICAgIGNhbmNlbFBvbGxEdXJhdGlvbigpOwotCi0gICAgKyttU2NhblNvdXJjZXNHZW5lcmF0aW9uOwotICAgIG1TY2FuU291cmNlc1BlbmRpbmcgPSBmYWxzZTsKLQotICAgIGlmIChtUmVuZGVyZXJMb29wZXIgIT0gTlVMTCkgewotICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1SZW5kZXJlckxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobVJlbmRlcmVyLT5pZCgpKTsKLSAgICAgICAgfQotICAgICAgICBtUmVuZGVyZXJMb29wZXItPnN0b3AoKTsKLSAgICAgICAgbVJlbmRlcmVyTG9vcGVyLmNsZWFyKCk7Ci0gICAgfQotICAgIG1SZW5kZXJlci5jbGVhcigpOwotICAgICsrbVJlbmRlcmVyR2VuZXJhdGlvbjsKLQotICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgbVNvdXJjZS0+c3RvcCgpOwotCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtU291cmNlTG9jayk7Ci0gICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBpZiAobURyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlSZXNldENvbXBsZXRlKG1TcmNJZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgIG1QcmVwYXJlZCA9IGZhbHNlOwotICAgIG1SZXNldHRpbmcgPSBmYWxzZTsKLSAgICBtU291cmNlU3RhcnRlZCA9IGZhbHNlOwotCi0gICAgLy8gTW9kdWxhciBEUk0KLSAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIGRlY29kZXJzIHdpbGwgYmUgZmx1c2hlZCBiZWZvcmUgdGhpcyBzbyB0aGVpciBtQ3J5cHRvIHdvdWxkIGdvIGF3YXkgb24gdGhlaXIgb3duCi0gICAgICAgIC8vIFRPRE8gY2hhbmdlIHRvIEFMT0dWCi0gICAgICAgIEFMT0dEKCJwZXJmb3JtUmVzZXQgbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKLSAgICAgICAgbUNyeXB0by5jbGVhcigpOwotICAgIH0KLSAgICBtSXNEcm1Qcm90ZWN0ZWQgPSBmYWxzZTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OnBlcmZvcm1QbGF5TmV4dERhdGFTb3VyY2UoKSB7Ci0gICAgQUxPR1YoInBlcmZvcm1QbGF5TmV4dERhdGFTb3VyY2UiKTsKLQotICAgIENIRUNLKG1BdWRpb0RlY29kZXIgPT0gTlVMTCk7Ci0gICAgQ0hFQ0sobVZpZGVvRGVjb2RlciA9PSBOVUxMKTsKLQotICAgIHN0b3BQbGF5YmFja1RpbWVyKCJwZXJmb3JtUGxheU5leHREYXRhU291cmNlIik7Ci0gICAgc3RvcFJlYnVmZmVyaW5nVGltZXIodHJ1ZSk7Ci0KLSAgICBjYW5jZWxQb2xsRHVyYXRpb24oKTsKLQotICAgICsrbVNjYW5Tb3VyY2VzR2VuZXJhdGlvbjsKLSAgICBtU2NhblNvdXJjZXNQZW5kaW5nID0gZmFsc2U7Ci0KLSAgICArK21SZW5kZXJlckdlbmVyYXRpb247Ci0KLSAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1Tb3VyY2UtPnN0b3AoKTsKLSAgICB9Ci0KLSAgICBsb25nIHByZXZpb3VzU3JjSWQ7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobVNvdXJjZUxvY2spOwotICAgICAgICBtU291cmNlID0gbU5leHRTb3VyY2U7Ci0gICAgICAgIG1OZXh0U291cmNlID0gTlVMTDsKLSAgICAgICAgcHJldmlvdXNTcmNJZCA9IG1TcmNJZDsKLSAgICAgICAgbVNyY0lkID0gbU5leHRTcmNJZDsKLSAgICAgICAgKyttTmV4dFNyY0lkOyAgLy8gdG8gZGlzdGluZ3Vpc2ggdGhlIHR3byBzb3VyY2VzLgotICAgIH0KLQotICAgIGlmIChtRHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKLSAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihwcmV2aW91c1NyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fUExBWUJBQ0tfQ09NUExFVEUsIDApOwotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fU1RBUlRFRF9BU19ORVhULCAwKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgbVByZXBhcmVkID0gdHJ1ZTsgIC8vIFRPRE86IHdoYXQgaWYgaXQncyBub3QgcHJlcGFyZWQKLSAgICBtUmVzZXR0aW5nID0gZmFsc2U7Ci0gICAgbVNvdXJjZVN0YXJ0ZWQgPSBmYWxzZTsKLQotICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgaWYgKG1DcnlwdG8gIT0gTlVMTCkgewotICAgICAgICAvLyBkZWNvZGVycyB3aWxsIGJlIGZsdXNoZWQgYmVmb3JlIHRoaXMgc28gdGhlaXIgbUNyeXB0byB3b3VsZCBnbyBhd2F5IG9uIHRoZWlyIG93bgotICAgICAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgotICAgICAgICBBTE9HRCgicGVyZm9ybVJlc2V0IG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7Ci0gICAgICAgIG1DcnlwdG8uY2xlYXIoKTsKLSAgICB9Ci0gICAgbUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7Ci0KLSAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKLSAgICAgICAgbVJlbmRlcmVyLT5yZXN1bWUoKTsKLSAgICB9Ci0KLSAgICBvblN0YXJ0KCk7Ci0gICAgbVBhdXNlZEJ5Q2xpZW50ID0gZmFsc2U7Ci0gICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfU1RBUlRFRCwgMCwgMCk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpwZXJmb3JtU2NhblNvdXJjZXMoKSB7Ci0gICAgQUxPR1YoInBlcmZvcm1TY2FuU291cmNlcyIpOwotCi0gICAgaWYgKCFtU3RhcnRlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1BdWRpb0RlY29kZXIgPT0gTlVMTCB8fCBtVmlkZW9EZWNvZGVyID09IE5VTEwpIHsKLSAgICAgICAgcG9zdFNjYW5Tb3VyY2VzKCk7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMjo6cGVyZm9ybVNldFN1cmZhY2UoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICZud3cpIHsKLSAgICBBTE9HVigicGVyZm9ybVNldFN1cmZhY2UiKTsKLQotICAgIG1OYXRpdmVXaW5kb3cgPSBud3c7Ci0KLSAgICAvLyBYWFggLSBpZ25vcmUgZXJyb3IgZnJvbSBzZXRWaWRlb1NjYWxpbmdNb2RlIGZvciBub3cKLSAgICBzZXRWaWRlb1NjYWxpbmdNb2RlKG1WaWRlb1NjYWxpbmdNb2RlKTsKLQotICAgIGlmIChtRHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgc3A8TnVQbGF5ZXIyRHJpdmVyPiBkcml2ZXIgPSBtRHJpdmVyLnByb21vdGUoKTsKLSAgICAgICAgaWYgKGRyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBkcml2ZXItPm5vdGlmeVNldFN1cmZhY2VDb21wbGV0ZShtU3JjSWQpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMjo6cGVyZm9ybVJlc3VtZURlY29kZXJzKGJvb2wgbmVlZE5vdGlmeSkgewotICAgIGlmIChuZWVkTm90aWZ5KSB7Ci0gICAgICAgIG1SZXN1bWVQZW5kaW5nID0gdHJ1ZTsKLSAgICAgICAgaWYgKG1WaWRlb0RlY29kZXIgPT0gTlVMTCkgewotICAgICAgICAgICAgLy8gaWYgYXVkaW8tb25seSwgd2UgY2FuIG5vdGlmeSBzZWVrIGNvbXBsZXRlIG5vdywKLSAgICAgICAgICAgIC8vIGFzIHRoZSByZXN1bWUgb3BlcmF0aW9uIHdpbGwgYmUgcmVsYXRpdmVseSBmYXN0LgotICAgICAgICAgICAgZmluaXNoUmVzdW1lKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobVZpZGVvRGVjb2RlciAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIFdoZW4gdGhlcmUgaXMgY29udGludW91cyBzZWVrLCBNZWRpYVBsYXllciB3aWxsIGNhY2hlIHRoZSBzZWVrCi0gICAgICAgIC8vIHBvc2l0aW9uLCBhbmQgc2VuZCBkb3duIG5ldyBzZWVrIHJlcXVlc3Qgd2hlbiBwcmV2aW91cyBzZWVrIGlzCi0gICAgICAgIC8vIGNvbXBsZXRlLiBMZXQncyB3YWl0IGZvciBhdCBsZWFzdCBvbmUgdmlkZW8gb3V0cHV0IGZyYW1lIGJlZm9yZQotICAgICAgICAvLyBub3RpZnlpbmcgc2VlayBjb21wbGV0ZSwgc28gdGhhdCB0aGUgdmlkZW8gdGh1bWJuYWlsIGdldHMgdXBkYXRlZAotICAgICAgICAvLyB3aGVuIHNlZWtiYXIgaXMgZHJhZ2dlZC4KLSAgICAgICAgbVZpZGVvRGVjb2Rlci0+c2lnbmFsUmVzdW1lKG5lZWROb3RpZnkpOwotICAgIH0KLQotICAgIGlmIChtQXVkaW9EZWNvZGVyICE9IE5VTEwpIHsKLSAgICAgICAgbUF1ZGlvRGVjb2Rlci0+c2lnbmFsUmVzdW1lKGZhbHNlIC8qIG5lZWROb3RpZnkgKi8pOwotICAgIH0KLX0KLQotdm9pZCBOdVBsYXllcjI6OmZpbmlzaFJlc3VtZSgpIHsKLSAgICBpZiAobVJlc3VtZVBlbmRpbmcpIHsKLSAgICAgICAgbVJlc3VtZVBlbmRpbmcgPSBmYWxzZTsKLSAgICAgICAgbm90aWZ5RHJpdmVyU2Vla0NvbXBsZXRlKG1TcmNJZCk7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMjo6bm90aWZ5RHJpdmVyU2Vla0NvbXBsZXRlKGludDY0X3Qgc3JjSWQpIHsKLSAgICBpZiAobURyaXZlciAhPSBOVUxMKSB7Ci0gICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChkcml2ZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlTZWVrQ29tcGxldGUoc3JjSWQpOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMjo6b25Tb3VyY2VOb3RpZnkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBpbnQzMl90IHdoYXQ7Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIndoYXQiLCAmd2hhdCkpOwotCi0gICAgaW50NjRfdCBzcmNJZDsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgic3JjSWQiLCAmc3JjSWQpKTsKLSAgICBzd2l0Y2ggKHdoYXQpIHsKLSAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0UHJlcGFyZWQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFMT0dWKCJOdVBsYXllcjI6Om9uU291cmNlTm90aWZ5IFNvdXJjZTo6a1doYXRQcmVwYXJlZCBzb3VyY2U6ICVwIiwgbVNvdXJjZS5nZXQoKSk7Ci0gICAgICAgICAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIHN0YWxlIG5vdGlmaWNhdGlvbiBmcm9tIGEgc291cmNlIHRoYXQgd2FzCi0gICAgICAgICAgICAgICAgLy8gYXN5bmNocm9ub3VzbHkgcHJlcGFyaW5nIHdoZW4gdGhlIGNsaWVudCBjYWxsZWQgcmVzZXQoKS4KLSAgICAgICAgICAgICAgICAvLyBXZSBoYW5kbGVkIHRoZSByZXNldCwgdGhlIHNvdXJjZSBpcyBnb25lLgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQzMl90IGVycjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAvLyBzaHV0IGRvd24gcG90ZW50aWFsIHNlY3VyZSBjb2RlY3MgaW4gY2FzZSBjbGllbnQgbmV2ZXIgY2FsbHMgcmVzZXQKLSAgICAgICAgICAgICAgICBtRGVmZXJyZWRBY3Rpb25zLnB1c2hfYmFjaygKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGbHVzaERlY29kZXJBY3Rpb24oRkxVU0hfQ01EX1NIVVRET1dOIC8qIGF1ZGlvICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTFVTSF9DTURfU0hVVERPV04gLyogdmlkZW8gKi8pKTsKLSAgICAgICAgICAgICAgICBwcm9jZXNzRGVmZXJyZWRBY3Rpb25zKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1QcmVwYXJlZCA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvLyBub3RpZnkgZHVyYXRpb24gZmlyc3QsIHNvIHRoYXQgaXQncyBkZWZpbml0ZWx5IHNldCB3aGVuCi0gICAgICAgICAgICAgICAgLy8gdGhlIGFwcCByZWNlaXZlZCB0aGUgInByZXBhcmUgY29tcGxldGUiIGNhbGxiYWNrLgotICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgICAgICAgICBpZiAobVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRyaXZlci0+bm90aWZ5RHVyYXRpb24oc3JjSWQsIGR1cmF0aW9uVXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeVByZXBhcmVDb21wbGV0ZWQoc3JjSWQsIGVycik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTW9kdWxhciBEUk0KLSAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0RHJtSW5mbzoKLSAgICAgICAgewotICAgICAgICAgICAgUGFyY2VsIHBhcmNlbDsKLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGRybUluZm87Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRCdWZmZXIoImRybUluZm8iLCAmZHJtSW5mbykpOwotICAgICAgICAgICAgcGFyY2VsLnNldERhdGEoZHJtSW5mby0+ZGF0YSgpLCBkcm1JbmZvLT5zaXplKCkpOwotCi0gICAgICAgICAgICBBTE9HVigib25Tb3VyY2VOb3RpZnkoKSBrV2hhdERybUluZm8gTUVESUEyX0RSTV9JTkZPIGRybUluZm86ICVwICBwYXJjZWwgc2l6ZTogJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgZHJtSW5mby5nZXQoKSwgcGFyY2VsLmRhdGFTaXplKCkpOwotCi0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0RSTV9JTkZPLCAwIC8qIGV4dDEgKi8sIDAgLyogZXh0MiAqLywgJnBhcmNlbCk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0RmxhZ3NDaGFuZ2VkOgotICAgICAgICB7Ci0gICAgICAgICAgICB1aW50MzJfdCBmbGFnczsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJmbGFncyIsIChpbnQzMl90ICopJmZsYWdzKSk7Ci0KLSAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBpZiAoZHJpdmVyICE9IE5VTEwpIHsKLQotICAgICAgICAgICAgICAgIEFMT0dWKCJvblNvdXJjZU5vdGlmeSgpIGtXaGF0RmxhZ3NDaGFuZ2VkICBGTEFHX0NBTl9QQVVTRTogJWQgICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJGTEFHX0NBTl9TRUVLX0JBQ0tXQVJEOiAlZCBcblx0XHRcdFx0IEZMQUdfQ0FOX1NFRUtfRk9SV0FSRDogJWQgICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJGTEFHX0NBTl9TRUVLOiAlZCAgRkxBR19EWU5BTUlDX0RVUkFUSU9OOiAlZCBcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICJcdFx0XHRcdCBGTEFHX1NFQ1VSRTogJWQgIEZMQUdfUFJPVEVDVEVEOiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfQ0FOX1BBVVNFKSAhPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgU291cmNlOjpGTEFHX0NBTl9TRUVLX0JBQ0tXQVJEKSAhPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgKGZsYWdzICYgU291cmNlOjpGTEFHX0NBTl9TRUVLX0ZPUldBUkQpICE9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfQ0FOX1NFRUspICE9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikgIT0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIFNvdXJjZTo6RkxBR19TRUNVUkUpICE9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfUFJPVEVDVEVEKSAhPSAwKTsKLQotICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBOdVBsYXllcjI6OlNvdXJjZTo6RkxBR19DQU5fU0VFSykgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBkcml2ZXItPm5vdGlmeUxpc3RlbmVyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fTk9UX1NFRUtBQkxFLCAwKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZHJpdmVyLT5ub3RpZnlGbGFnc0NoYW5nZWQoc3JjSWQsIGZsYWdzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKChtU291cmNlRmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikKLSAgICAgICAgICAgICAgICAgICAgJiYgKCEoZmxhZ3MgJiBTb3VyY2U6OkZMQUdfRFlOQU1JQ19EVVJBVElPTikpKSB7Ci0gICAgICAgICAgICAgICAgY2FuY2VsUG9sbER1cmF0aW9uKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCEobVNvdXJjZUZsYWdzICYgU291cmNlOjpGTEFHX0RZTkFNSUNfRFVSQVRJT04pCi0gICAgICAgICAgICAgICAgICAgICYmIChmbGFncyAmIFNvdXJjZTo6RkxBR19EWU5BTUlDX0RVUkFUSU9OKQotICAgICAgICAgICAgICAgICAgICAmJiAobUF1ZGlvRGVjb2RlciAhPSBOVUxMIHx8IG1WaWRlb0RlY29kZXIgIT0gTlVMTCkpIHsKLSAgICAgICAgICAgICAgICBzY2hlZHVsZVBvbGxEdXJhdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtU291cmNlRmxhZ3MgPSBmbGFnczsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0VmlkZW9TaXplQ2hhbmdlZDoKLSAgICAgICAgewotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKLQotICAgICAgICAgICAgdXBkYXRlVmlkZW9TaXplKHNyY0lkLCBmb3JtYXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRCdWZmZXJpbmdVcGRhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3QgcGVyY2VudGFnZTsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJwZXJjZW50YWdlIiwgJnBlcmNlbnRhZ2UpKTsKLQotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoc3JjSWQsIE1FRElBMl9CVUZGRVJJTkdfVVBEQVRFLCBwZXJjZW50YWdlLCAwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0UGF1c2VPbkJ1ZmZlcmluZ1N0YXJ0OgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUgaWYgbm90IHBsYXlpbmcKLSAgICAgICAgICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICAgICAgICAgIEFMT0dJKCJidWZmZXIgbG93LCBwYXVzaW5nLi4uIik7Ci0KLSAgICAgICAgICAgICAgICBzdGFydFJlYnVmZmVyaW5nVGltZXIoKTsKLSAgICAgICAgICAgICAgICBtUGF1c2VkRm9yQnVmZmVyaW5nID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBvblBhdXNlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX0JVRkZFUklOR19TVEFSVCwgMCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU291cmNlOjprV2hhdFJlc3VtZU9uQnVmZmVyaW5nRW5kOgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUgaWYgbm90IHBsYXlpbmcKLSAgICAgICAgICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICAgICAgICAgIEFMT0dJKCJidWZmZXIgcmVhZHksIHJlc3VtaW5nLi4uIik7Ci0KLSAgICAgICAgICAgICAgICBzdG9wUmVidWZmZXJpbmdUaW1lcihmYWxzZSk7Ci0gICAgICAgICAgICAgICAgbVBhdXNlZEZvckJ1ZmZlcmluZyA9IGZhbHNlOwotCi0gICAgICAgICAgICAgICAgLy8gZG8gbm90IHJlc3VtZSB5ZXQgaWYgY2xpZW50IGRpZG4ndCB1bnBhdXNlCi0gICAgICAgICAgICAgICAgaWYgKCFtUGF1c2VkQnlDbGllbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgb25SZXN1bWUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcihzcmNJZCwgTUVESUEyX0lORk8sIE1FRElBMl9JTkZPX0JVRkZFUklOR19FTkQsIDApOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXRDYWNoZVN0YXRzOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IGticHM7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYmFuZHdpZHRoIiwgJmticHMpKTsKLQotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIoc3JjSWQsIE1FRElBMl9JTkZPLCBNRURJQTJfSU5GT19ORVRXT1JLX0JBTkRXSURUSCwga2Jwcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU291cmNlOjprV2hhdFN1YnRpdGxlRGF0YToKLSAgICAgICAgewotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKSk7Ci0KLSAgICAgICAgICAgIHNlbmRTdWJ0aXRsZURhdGEoYnVmZmVyLCAwIC8qIGJhc2VJbmRleCAqLyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU291cmNlOjprV2hhdFRpbWVkTWV0YURhdGE6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKLSAgICAgICAgICAgIGlmICghbXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKSkgewotICAgICAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKHNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fTUVUQURBVEFfVVBEQVRFLCAwKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2VuZFRpbWVkTWV0YURhdGEoYnVmZmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTb3VyY2U6OmtXaGF0VGltZWRUZXh0RGF0YToKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOwotICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pCi0gICAgICAgICAgICAgICAgICAgICYmIGdlbmVyYXRpb24gIT0gbVRpbWVkVGV4dEdlbmVyYXRpb24pIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKSk7Ci0KLSAgICAgICAgICAgIHNwPE51UGxheWVyMkRyaXZlcj4gZHJpdmVyID0gbURyaXZlci5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBpZiAoZHJpdmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50NjRfdCBwb3NNczsKLSAgICAgICAgICAgIGludDY0X3QgdGltZVVzLCBwb3NVczsKLSAgICAgICAgICAgIGRyaXZlci0+Z2V0Q3VycmVudFBvc2l0aW9uKCZwb3NNcyk7Ci0gICAgICAgICAgICBwb3NVcyA9IHBvc01zICogMTAwMExMOwotICAgICAgICAgICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotCi0gICAgICAgICAgICBpZiAocG9zVXMgPCB0aW1lVXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImdlbmVyYXRpb24iLCBtVGltZWRUZXh0R2VuZXJhdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1zZy0+cG9zdCh0aW1lVXMgLSBwb3NVcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNlbmRUaW1lZFRleHREYXRhKGJ1ZmZlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgU291cmNlOjprV2hhdFF1ZXVlRGVjb2RlclNodXRkb3duOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IGF1ZGlvLCB2aWRlbzsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZhdWRpbykpOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInZpZGVvIiwgJnZpZGVvKSk7Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseTsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInJlcGx5IiwgJnJlcGx5KSk7Ci0KLSAgICAgICAgICAgIHF1ZXVlRGVjb2RlclNodXRkb3duKGF1ZGlvLCB2aWRlbywgcmVwbHkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNvdXJjZTo6a1doYXREcm1Ob0xpY2Vuc2U6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyKHNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBFUlJPUl9EUk1fTk9fTElDRU5TRSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUUkVTUEFTUygpOwotICAgIH0KLX0KLQotdm9pZCBOdVBsYXllcjI6Om9uQ2xvc2VkQ2FwdGlvbk5vdGlmeShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIGludDMyX3Qgd2hhdDsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigid2hhdCIsICZ3aGF0KSk7Ci0KLSAgICBzd2l0Y2ggKHdoYXQpIHsKLSAgICAgICAgY2FzZSBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6a1doYXRDbG9zZWRDYXB0aW9uRGF0YToKLSAgICAgICAgewotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKSk7Ci0KLSAgICAgICAgICAgIHNpemVfdCBpbmJhbmRUcmFja3MgPSAwOwotICAgICAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGluYmFuZFRyYWNrcyA9IG1Tb3VyY2UtPmdldFRyYWNrQ291bnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2VuZFN1YnRpdGxlRGF0YShidWZmZXIsIGluYmFuZFRyYWNrcyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OmtXaGF0VHJhY2tBZGRlZDoKLSAgICAgICAgewotICAgICAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfSU5GTywgTUVESUEyX0lORk9fTUVUQURBVEFfVVBEQVRFLCAwKTsKLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICB9Ci0KLQotfQotCi12b2lkIE51UGxheWVyMjo6c2VuZFN1YnRpdGxlRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyLCBpbnQzMl90IGJhc2VJbmRleCkgewotICAgIGludDMyX3QgdHJhY2tJbmRleDsKLSAgICBpbnQ2NF90IHRpbWVVcywgZHVyYXRpb25VczsKLSAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVgsICZ0cmFja0luZGV4KSk7Ci0gICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoImR1cmF0aW9uVXMiLCAmZHVyYXRpb25VcykpOwotCi0gICAgUGFyY2VsIGluOwotICAgIGluLndyaXRlSW50MzIodHJhY2tJbmRleCArIGJhc2VJbmRleCk7Ci0gICAgaW4ud3JpdGVJbnQ2NCh0aW1lVXMpOwotICAgIGluLndyaXRlSW50NjQoZHVyYXRpb25Vcyk7Ci0gICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7Ci0gICAgaW4ud3JpdGVJbnQzMihidWZmZXItPnNpemUoKSk7Ci0gICAgaW4ud3JpdGUoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKLQotICAgIG5vdGlmeUxpc3RlbmVyKG1TcmNJZCwgTUVESUEyX1NVQlRJVExFX0RBVEEsIDAsIDAsICZpbik7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpzZW5kVGltZWRNZXRhRGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7Ci0gICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotCi0gICAgUGFyY2VsIGluOwotICAgIGluLndyaXRlSW50NjQodGltZVVzKTsKLSAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKLSAgICBpbi53cml0ZUludDMyKGJ1ZmZlci0+c2l6ZSgpKTsKLSAgICBpbi53cml0ZShidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwotCi0gICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfTUVUQV9EQVRBLCAwLCAwLCAmaW4pOwotfQotCi12b2lkIE51UGxheWVyMjo6c2VuZFRpbWVkVGV4dERhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcikgewotICAgIGNvbnN0IHZvaWQgKmRhdGE7Ci0gICAgc2l6ZV90IHNpemUgPSAwOwotICAgIGludDY0X3QgdGltZVVzOwotICAgIGludDMyX3QgZmxhZyA9IFRleHREZXNjcmlwdGlvbnM6OklOX0JBTkRfVEVYVF8zR1BQOwotCi0gICAgQVN0cmluZyBtaW1lOwotICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKLSAgICBDSEVDSyhzdHJjYXNlY21wKG1pbWUuY19zdHIoKSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKSA9PSAwKTsKLQotICAgIGRhdGEgPSBidWZmZXItPmRhdGEoKTsKLSAgICBzaXplID0gYnVmZmVyLT5zaXplKCk7Ci0KLSAgICBQYXJjZWwgcGFyY2VsOwotICAgIGlmIChzaXplID4gMCkgewotICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0gICAgICAgIGludDMyX3QgZ2xvYmFsID0gMDsKLSAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImdsb2JhbCIsICZnbG9iYWwpICYmIGdsb2JhbCkgewotICAgICAgICAgICAgZmxhZyB8PSBUZXh0RGVzY3JpcHRpb25zOjpHTE9CQUxfREVTQ1JJUFRJT05TOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmxhZyB8PSBUZXh0RGVzY3JpcHRpb25zOjpMT0NBTF9ERVNDUklQVElPTlM7Ci0gICAgICAgIH0KLSAgICAgICAgVGV4dERlc2NyaXB0aW9uczo6Z2V0UGFyY2VsT2ZEZXNjcmlwdGlvbnMoCi0gICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhLCBzaXplLCBmbGFnLCB0aW1lVXMgLyAxMDAwLCAmcGFyY2VsKTsKLSAgICB9Ci0KLSAgICBpZiAoKHBhcmNlbC5kYXRhU2l6ZSgpID4gMCkpIHsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXIobVNyY0lkLCBNRURJQTJfVElNRURfVEVYVCwgMCwgMCwgJnBhcmNlbCk7Ci0gICAgfSBlbHNlIHsgIC8vIHNlbmQgYW4gZW1wdHkgdGltZWQgdGV4dAotICAgICAgICBub3RpZnlMaXN0ZW5lcihtU3JjSWQsIE1FRElBMl9USU1FRF9URVhULCAwLCAwKTsKLSAgICB9Ci19Ci0KLWNvbnN0IGNoYXIgKk51UGxheWVyMjo6Z2V0RGF0YVNvdXJjZVR5cGUoKSB7Ci0gICAgc3dpdGNoIChtRGF0YVNvdXJjZVR5cGUpIHsKLSAgICAgICAgY2FzZSBEQVRBX1NPVVJDRV9UWVBFX0hUVFBfTElWRToKLSAgICAgICAgICAgIHJldHVybiAiSFRUUExpdmUiOwotCi0gICAgICAgIGNhc2UgREFUQV9TT1VSQ0VfVFlQRV9SVFNQOgotICAgICAgICAgICAgcmV0dXJuICJSVFNQIjsKLQotICAgICAgICBjYXNlIERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19VUkw6Ci0gICAgICAgICAgICByZXR1cm4gIkdlblVSTCI7Ci0KLSAgICAgICAgY2FzZSBEQVRBX1NPVVJDRV9UWVBFX0dFTkVSSUNfRkQ6Ci0gICAgICAgICAgICByZXR1cm4gIkdlbkZEIjsKLQotICAgICAgICBjYXNlIERBVEFfU09VUkNFX1RZUEVfTUVESUE6Ci0gICAgICAgICAgICByZXR1cm4gIk1lZGlhIjsKLQotICAgICAgICBjYXNlIERBVEFfU09VUkNFX1RZUEVfTk9ORToKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiAiTm9uZSI7Ci0gICAgfQotIH0KLQotLy8gTW9kdWxhciBEUk0gYmVnaW4KLXN0YXR1c190IE51UGxheWVyMjo6cHJlcGFyZURybShjb25zdCB1aW50OF90IHV1aWRbMTZdLCBjb25zdCBWZWN0b3I8dWludDhfdD4gJmRybVNlc3Npb25JZCkKLXsKLSAgICBBTE9HVigicHJlcGFyZURybSAiKTsKLQotICAgIC8vIFBhc3NpbmcgdG8gdGhlIGxvb3BlciBhbnl3YXk7IGNhbGxlZCBpbiBhIHByZS1jb25maWcgcHJlcGFyZWQgc3RhdGUgc28gbm8gcmFjZSBvbiBtQ3J5cHRvCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFByZXBhcmVEcm0sIHRoaXMpOwotICAgIC8vIHN5bmNocm9ub3VzIGNhbGwgc28ganVzdCBwYXNzaW5nIHRoZSBhZGRyZXNzIGJ1dCB3aXRoIGxvY2FsIGNvcGllcyBvZiAiY29uc3QiIGFyZ3MKLSAgICB1aW50OF90IFVVSURbMTZdOwotICAgIG1lbWNweShVVUlELCB1dWlkLCBzaXplb2YoVVVJRCkpOwotICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQgPSBkcm1TZXNzaW9uSWQ7Ci0gICAgbXNnLT5zZXRQb2ludGVyKCJ1dWlkIiwgKHZvaWQqKVVVSUQpOwotICAgIG1zZy0+c2V0UG9pbnRlcigiZHJtU2Vzc2lvbklkIiwgKHZvaWQqKSZzZXNzaW9uSWQpOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLQotICAgIGlmIChzdGF0dXMgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgewotICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJzdGF0dXMiLCAmc3RhdHVzKSk7Ci0gICAgICAgIEFMT0dWKCJwcmVwYXJlRHJtIHJldDogJWQgIiwgc3RhdHVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgicHJlcGFyZURybSBlcnI6ICVkIiwgc3RhdHVzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjI6OnJlbGVhc2VEcm0oKQotewotICAgIEFMT0dWKCJyZWxlYXNlRHJtICIpOwotCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlbGVhc2VEcm0sIHRoaXMpOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLQotICAgIGlmIChzdGF0dXMgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgewotICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJzdGF0dXMiLCAmc3RhdHVzKSk7Ci0gICAgICAgIEFMT0dWKCJyZWxlYXNlRHJtIHJldDogJWQgIiwgc3RhdHVzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgicmVsZWFzZURybSBlcnI6ICVkIiwgc3RhdHVzKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjI6Om9uUHJlcGFyZURybShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykKLXsKLSAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgotICAgIEFMT0dEKCJvblByZXBhcmVEcm0gIik7Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJvblByZXBhcmVEcm06IE5vIHNvdXJjZS4gb25QcmVwYXJlRHJtIGZhaWxlZCB3aXRoICVkLiIsIHN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotCi0gICAgdWludDhfdCAqdXVpZDsKLSAgICBWZWN0b3I8dWludDhfdD4gKmRybVNlc3Npb25JZDsKLSAgICBDSEVDSyhtc2ctPmZpbmRQb2ludGVyKCJ1dWlkIiwgKHZvaWQqKikmdXVpZCkpOwotICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImRybVNlc3Npb25JZCIsICh2b2lkKiopJmRybVNlc3Npb25JZCkpOwotCi0gICAgc3RhdHVzID0gT0s7Ci0gICAgc3A8QU1lZGlhQ3J5cHRvV3JhcHBlcj4gY3J5cHRvID0gTlVMTDsKLQotICAgIHN0YXR1cyA9IG1Tb3VyY2UtPnByZXBhcmVEcm0odXVpZCwgKmRybVNlc3Npb25JZCwgJmNyeXB0byk7Ci0gICAgaWYgKGNyeXB0byA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJvblByZXBhcmVEcm06IG1Tb3VyY2UtPnByZXBhcmVEcm0gZmFpbGVkLiBzdGF0dXM6ICVkIiwgc3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgQUxPR1YoIm9uUHJlcGFyZURybTogbVNvdXJjZS0+cHJlcGFyZURybSBzdWNjZWVkZWQiKTsKLQotICAgIGlmIChtQ3J5cHRvICE9IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIm9uUHJlcGFyZURybTogVW5leHBlY3RlZC4gQWxyZWFkeSBoYXZpbmcgbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKLSAgICAgICAgbUNyeXB0by5jbGVhcigpOwotICAgIH0KLQotICAgIG1DcnlwdG8gPSBjcnlwdG87Ci0gICAgbUlzRHJtUHJvdGVjdGVkID0gdHJ1ZTsKLSAgICAvLyBUT0RPIGNoYW5nZSB0byBBTE9HVgotICAgIEFMT0dEKCJvblByZXBhcmVEcm06IG1DcnlwdG86ICVwIiwgbUNyeXB0by5nZXQoKSk7Ci0KLSAgICByZXR1cm4gc3RhdHVzOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjI6Om9uUmVsZWFzZURybSgpCi17Ci0gICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKLSAgICBBTE9HRCgib25SZWxlYXNlRHJtICIpOwotCi0gICAgaWYgKCFtSXNEcm1Qcm90ZWN0ZWQpIHsKLSAgICAgICAgQUxPR1coIm9uUmVsZWFzZURybTogVW5leHBlY3RlZC4gbUlzRHJtUHJvdGVjdGVkIGlzIGFscmVhZHkgZmFsc2UuIik7Ci0gICAgfQotCi0gICAgbUlzRHJtUHJvdGVjdGVkID0gZmFsc2U7Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgaWYgKG1DcnlwdG8gIT0gTlVMTCkgewotICAgICAgICAvLyBub3RpZnlpbmcgdGhlIHNvdXJjZSBmaXJzdCBiZWZvcmUgcmVtb3ZpbmcgY3J5cHRvIGZyb20gY29kZWMKLSAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgbVNvdXJjZS0+cmVsZWFzZURybSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdHVzPU9LOwotICAgICAgICAvLyBmaXJzdCBtYWtpbmcgc3VyZSB0aGUgY29kZWNzIGhhdmUgcmVsZWFzZWQgdGhlaXIgY3J5cHRvIHJlZmVyZW5jZQotICAgICAgICBjb25zdCBzcDxEZWNvZGVyQmFzZT4gJnZpZGVvRGVjb2RlciA9IGdldERlY29kZXIoZmFsc2UvKmF1ZGlvKi8pOwotICAgICAgICBpZiAodmlkZW9EZWNvZGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIHN0YXR1cyA9IHZpZGVvRGVjb2Rlci0+cmVsZWFzZUNyeXB0bygpOwotICAgICAgICAgICAgQUxPR1YoIm9uUmVsZWFzZURybTogdmlkZW8gZGVjb2RlciByZXQ6ICVkIiwgc3RhdHVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnN0IHNwPERlY29kZXJCYXNlPiAmYXVkaW9EZWNvZGVyID0gZ2V0RGVjb2Rlcih0cnVlLyphdWRpbyovKTsKLSAgICAgICAgaWYgKGF1ZGlvRGVjb2RlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXNfYXVkaW8gPSBhdWRpb0RlY29kZXItPnJlbGVhc2VDcnlwdG8oKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsgICAvLyBvdGhlcndpc2UsIHJldHVybmluZyB0aGUgZmlyc3QgZXJyb3IKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzdGF0dXNfYXVkaW87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBTE9HVigib25SZWxlYXNlRHJtOiBhdWRpbyBkZWNvZGVyIHJldDogJWQiLCBzdGF0dXNfYXVkaW8pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETyBjaGFuZ2UgdG8gQUxPR1YKLSAgICAgICAgQUxPR0QoIm9uUmVsZWFzZURybTogbUNyeXB0bzogJXAiLCBtQ3J5cHRvLmdldCgpKTsKLSAgICAgICAgbUNyeXB0by5jbGVhcigpOwotICAgIH0gZWxzZSB7ICAgLy8gbUNyeXB0byA9PSBOVUxMCi0gICAgICAgIEFMT0dFKCJvblJlbGVhc2VEcm06IFVuZXhwZWN0ZWQuIFRoZXJlIGlzIG5vIGNyeXB0by4iKTsKLSAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLS8vIE1vZHVsYXIgRFJNIGVuZAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3A8QU1lc3NhZ2U+IE51UGxheWVyMjo6U291cmNlOjpnZXRGb3JtYXQoYm9vbCBhdWRpbykgewotICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gZ2V0Rm9ybWF0TWV0YShhdWRpbyk7Ci0KLSAgICBpZiAobWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2U7Ci0KLSAgICBpZihjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UobWV0YSwgJm1zZykgPT0gT0spIHsKLSAgICAgICAgcmV0dXJuIG1zZzsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpTb3VyY2U6Om5vdGlmeUZsYWdzQ2hhbmdlZCh1aW50MzJfdCBmbGFncykgewotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRGbGFnc0NoYW5nZWQpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoImZsYWdzIiwgZmxhZ3MpOwotICAgIG5vdGlmeS0+cG9zdCgpOwotfQotCi12b2lkIE51UGxheWVyMjo6U291cmNlOjpub3RpZnlWaWRlb1NpemVDaGFuZ2VkKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFZpZGVvU2l6ZUNoYW5nZWQpOwotICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKLSAgICBub3RpZnktPnBvc3QoKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OlNvdXJjZTo6bm90aWZ5UHJlcGFyZWQoc3RhdHVzX3QgZXJyKSB7Ci0gICAgQUxPR1YoIlNvdXJjZTo6bm90aWZ5UHJlcGFyZWQgJWQiLCBlcnIpOwotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRQcmVwYXJlZCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICBub3RpZnktPnBvc3QoKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OlNvdXJjZTo6bm90aWZ5RHJtSW5mbyhjb25zdCBzcDxBQnVmZmVyPiAmZHJtSW5mb0J1ZmZlcikKLXsKLSAgICBBTE9HVigiU291cmNlOjpub3RpZnlEcm1JbmZvIik7Ci0KLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gZHVwTm90aWZ5KCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0RHJtSW5mbyk7Ci0gICAgbm90aWZ5LT5zZXRCdWZmZXIoImRybUluZm8iLCBkcm1JbmZvQnVmZmVyKTsKLQotICAgIG5vdGlmeS0+cG9zdCgpOwotfQotCi12b2lkIE51UGxheWVyMjo6U291cmNlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJiAvKiBtc2cgKi8pIHsKLSAgICBUUkVTUEFTUygpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2Zjg1ZjkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjIuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE5VX1BMQVlFUjJfSF8KLQotI2RlZmluZSBOVV9QTEFZRVIyX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KLQotI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9NZWRpYVBsYXllcjJJbnRlcmZhY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQUJ1ZmZlcjsKLXN0cnVjdCBBTWVkaWFDcnlwdG9XcmFwcGVyOwotc3RydWN0IEFNZXNzYWdlOwotc3RydWN0IEFOYXRpdmVXaW5kb3dXcmFwcGVyOwotc3RydWN0IEF1ZGlvUGxheWJhY2tSYXRlOwotc3RydWN0IEFWU3luY1NldHRpbmdzOwotc3RydWN0IERhdGFTb3VyY2VEZXNjOwotc3RydWN0IE1lZGlhQ2xvY2s7Ci1zdHJ1Y3QgTWVkaWFIVFRQU2VydmljZTsKLWNsYXNzIE1ldGFEYXRhOwotc3RydWN0IE51UGxheWVyMkRyaXZlcjsKLQotc3RydWN0IE51UGxheWVyMiA6IHB1YmxpYyBBSGFuZGxlciB7Ci0gICAgZXhwbGljaXQgTnVQbGF5ZXIyKHBpZF90IHBpZCwgdWlkX3QgdWlkLCBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jayk7Ci0KLSAgICB2b2lkIHNldERyaXZlcihjb25zdCB3cDxOdVBsYXllcjJEcml2ZXI+ICZkcml2ZXIpOwotCi0gICAgdm9pZCBzZXREYXRhU291cmNlQXN5bmMoY29uc3Qgc3A8RGF0YVNvdXJjZURlc2M+ICZkc2QpOwotICAgIHZvaWQgcHJlcGFyZU5leHREYXRhU291cmNlQXN5bmMoY29uc3Qgc3A8RGF0YVNvdXJjZURlc2M+ICZkc2QpOwotICAgIHZvaWQgcGxheU5leHREYXRhU291cmNlKGludDY0X3Qgc3JjSWQpOwotCi0gICAgc3RhdHVzX3QgZ2V0QnVmZmVyaW5nU2V0dGluZ3MoQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKTsKLSAgICBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKTsKLQotICAgIHZvaWQgcHJlcGFyZUFzeW5jKCk7Ci0KLSAgICB2b2lkIHNldFZpZGVvU3VyZmFjZVRleHR1cmVBc3luYyhjb25zdCBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gJm53dyk7Ci0KLSAgICB2b2lkIHNldEF1ZGlvU2luayhjb25zdCBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luaz4gJnNpbmspOwotICAgIHN0YXR1c190IHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpOwotICAgIHN0YXR1c190IGdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUgLyogbm9ubnVsbCAqLyk7Ci0gICAgc3RhdHVzX3Qgc2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpOwotICAgIHN0YXR1c190IGdldFN5bmNTZXR0aW5ncyhBVlN5bmNTZXR0aW5ncyAqc3luYyAvKiBub25udWxsICovLCBmbG9hdCAqdmlkZW9GcHMgLyogbm9ubnVsbCAqLyk7Ci0KLSAgICB2b2lkIHN0YXJ0KCk7Ci0KLSAgICB2b2lkIHBhdXNlKCk7Ci0KLSAgICAvLyBXaWxsIG5vdGlmeSB0aGUgZHJpdmVyIHRocm91Z2ggIm5vdGlmeVJlc2V0Q29tcGxldGUiIG9uY2UgZmluaXNoZWQuCi0gICAgdm9pZCByZXNldEFzeW5jKCk7Ci0KLSAgICAvLyBSZXF1ZXN0IGEgbm90aWZpY2F0aW9uIHdoZW4gc3BlY2lmaWVkIG1lZGlhIHRpbWUgaXMgcmVhY2hlZC4KLSAgICBzdGF0dXNfdCBub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKTsKLQotICAgIC8vIFdpbGwgbm90aWZ5IHRoZSBkcml2ZXIgdGhyb3VnaCAibm90aWZ5U2Vla0NvbXBsZXRlIiBvbmNlIGZpbmlzaGVkCi0gICAgLy8gYW5kIG5lZWROb3RpZnkgaXMgdHJ1ZS4KLSAgICB2b2lkIHNlZWtUb0FzeW5jKAotICAgICAgICAgICAgaW50NjRfdCBzZWVrVGltZVVzLAotICAgICAgICAgICAgTWVkaWFQbGF5ZXIyU2Vla01vZGUgbW9kZSA9IE1lZGlhUGxheWVyMlNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMsCi0gICAgICAgICAgICBib29sIG5lZWROb3RpZnkgPSBmYWxzZSk7Ci0KLSAgICBzdGF0dXNfdCBzZXRWaWRlb1NjYWxpbmdNb2RlKGludDMyX3QgbW9kZSk7Ci0gICAgc3RhdHVzX3QgZ2V0VHJhY2tJbmZvKFBhcmNlbCogcmVwbHkpIGNvbnN0OwotICAgIHN0YXR1c190IGdldFNlbGVjdGVkVHJhY2soaW50MzJfdCB0eXBlLCBQYXJjZWwqIHJlcGx5KSBjb25zdDsKLSAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgdHJhY2tJbmRleCwgYm9vbCBzZWxlY3QsIGludDY0X3QgdGltZVVzKTsKLSAgICBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbWVkaWFVcyk7Ci0gICAgdm9pZCBnZXRTdGF0cyhWZWN0b3I8c3A8QU1lc3NhZ2U+ID4gKm1UcmFja1N0YXRzKTsKLQotICAgIHNwPE1ldGFEYXRhPiBnZXRGaWxlTWV0YSgpOwotICAgIGZsb2F0IGdldEZyYW1lUmF0ZSgpOwotCi0gICAgLy8gTW9kdWxhciBEUk0KLSAgICBzdGF0dXNfdCBwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKTsKLSAgICBzdGF0dXNfdCByZWxlYXNlRHJtKCk7Ci0KLSAgICBjb25zdCBjaGFyICpnZXREYXRhU291cmNlVHlwZSgpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+TnVQbGF5ZXIyKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotCi1wdWJsaWM6Ci0gICAgc3RydWN0IFN0cmVhbUxpc3RlbmVyOwotICAgIHN0cnVjdCBTb3VyY2U7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IERlY29kZXI7Ci0gICAgc3RydWN0IERlY29kZXJCYXNlOwotICAgIHN0cnVjdCBEZWNvZGVyUGFzc1Rocm91Z2g7Ci0gICAgc3RydWN0IENDRGVjb2RlcjsKLSAgICBzdHJ1Y3QgR2VuZXJpY1NvdXJjZTI7Ci0gICAgc3RydWN0IEhUVFBMaXZlU291cmNlMjsKLSAgICBzdHJ1Y3QgUmVuZGVyZXI7Ci0gICAgc3RydWN0IFJUU1BTb3VyY2UyOwotICAgIHN0cnVjdCBBY3Rpb247Ci0gICAgc3RydWN0IFNlZWtBY3Rpb247Ci0gICAgc3RydWN0IFNldFN1cmZhY2VBY3Rpb247Ci0gICAgc3RydWN0IFJlc3VtZURlY29kZXJBY3Rpb247Ci0gICAgc3RydWN0IEZsdXNoRGVjb2RlckFjdGlvbjsKLSAgICBzdHJ1Y3QgUG9zdE1lc3NhZ2VBY3Rpb247Ci0gICAgc3RydWN0IFNpbXBsZUFjdGlvbjsKLQotICAgIGVudW0gewotICAgICAgICBrV2hhdFNldERhdGFTb3VyY2UgICAgICAgICAgICAgID0gJz1EYVMnLAotICAgICAgICBrV2hhdFByZXBhcmUgICAgICAgICAgICAgICAgICAgID0gJ3ByZXAnLAotICAgICAgICBrV2hhdFByZXBhcmVOZXh0RGF0YVNvdXJjZSAgICAgID0gJ3BORFMnLAotICAgICAgICBrV2hhdFBsYXlOZXh0RGF0YVNvdXJjZSAgICAgICAgID0gJ3BsTlMnLAotICAgICAgICBrV2hhdFNldFZpZGVvU3VyZmFjZSAgICAgICAgICAgID0gJz1WU3UnLAotICAgICAgICBrV2hhdFNldEF1ZGlvU2luayAgICAgICAgICAgICAgID0gJz1BdVMnLAotICAgICAgICBrV2hhdE1vcmVEYXRhUXVldWVkICAgICAgICAgICAgID0gJ21vcmUnLAotICAgICAgICBrV2hhdENvbmZpZ1BsYXliYWNrICAgICAgICAgICAgID0gJ2NmUEInLAotICAgICAgICBrV2hhdENvbmZpZ1N5bmMgICAgICAgICAgICAgICAgID0gJ2NmU3knLAotICAgICAgICBrV2hhdEdldFBsYXliYWNrU2V0dGluZ3MgICAgICAgID0gJ2dQYlMnLAotICAgICAgICBrV2hhdEdldFN5bmNTZXR0aW5ncyAgICAgICAgICAgID0gJ2dTeVMnLAotICAgICAgICBrV2hhdFN0YXJ0ICAgICAgICAgICAgICAgICAgICAgID0gJ3N0cnQnLAotICAgICAgICBrV2hhdFNjYW5Tb3VyY2VzICAgICAgICAgICAgICAgID0gJ3NjYW4nLAotICAgICAgICBrV2hhdFZpZGVvTm90aWZ5ICAgICAgICAgICAgICAgID0gJ3ZpZE4nLAotICAgICAgICBrV2hhdEF1ZGlvTm90aWZ5ICAgICAgICAgICAgICAgID0gJ2F1ZE4nLAotICAgICAgICBrV2hhdENsb3NlZENhcHRpb25Ob3RpZnkgICAgICAgID0gJ2NhcE4nLAotICAgICAgICBrV2hhdFJlbmRlcmVyTm90aWZ5ICAgICAgICAgICAgID0gJ3Jlbk4nLAotICAgICAgICBrV2hhdFJlc2V0ICAgICAgICAgICAgICAgICAgICAgID0gJ3JzZXQnLAotICAgICAgICBrV2hhdE5vdGlmeVRpbWUgICAgICAgICAgICAgICAgID0gJ25meVQnLAotICAgICAgICBrV2hhdFNlZWsgICAgICAgICAgICAgICAgICAgICAgID0gJ3NlZWsnLAotICAgICAgICBrV2hhdFBhdXNlICAgICAgICAgICAgICAgICAgICAgID0gJ3BhdXMnLAotICAgICAgICBrV2hhdFJlc3VtZSAgICAgICAgICAgICAgICAgICAgID0gJ3JzbWUnLAotICAgICAgICBrV2hhdFBvbGxEdXJhdGlvbiAgICAgICAgICAgICAgID0gJ3BvbEQnLAotICAgICAgICBrV2hhdFNvdXJjZU5vdGlmeSAgICAgICAgICAgICAgID0gJ3NyY04nLAotICAgICAgICBrV2hhdEdldFRyYWNrSW5mbyAgICAgICAgICAgICAgID0gJ2dUckknLAotICAgICAgICBrV2hhdEdldFNlbGVjdGVkVHJhY2sgICAgICAgICAgID0gJ2dTZWwnLAotICAgICAgICBrV2hhdFNlbGVjdFRyYWNrICAgICAgICAgICAgICAgID0gJ3NlbFQnLAotICAgICAgICBrV2hhdEdldEJ1ZmZlcmluZ1NldHRpbmdzICAgICAgID0gJ2dCdXMnLAotICAgICAgICBrV2hhdFNldEJ1ZmZlcmluZ1NldHRpbmdzICAgICAgID0gJ3NCdVMnLAotICAgICAgICBrV2hhdFByZXBhcmVEcm0gICAgICAgICAgICAgICAgID0gJ3BEcm0nLAotICAgICAgICBrV2hhdFJlbGVhc2VEcm0gICAgICAgICAgICAgICAgID0gJ3JEcm0nLAotICAgIH07Ci0KLSAgICB3cDxOdVBsYXllcjJEcml2ZXI+IG1Ecml2ZXI7Ci0gICAgcGlkX3QgbVBJRDsKLSAgICB1aWRfdCBtVUlEOwotICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+IG1NZWRpYUNsb2NrOwotICAgIE11dGV4IG1Tb3VyY2VMb2NrOyAgLy8gZ3VhcmQgfG1Tb3VyY2V8LgotICAgIHNwPFNvdXJjZT4gbVNvdXJjZTsKLSAgICBpbnQ2NF90IG1TcmNJZDsKLSAgICB1aW50MzJfdCBtU291cmNlRmxhZ3M7Ci0gICAgc3A8U291cmNlPiBtTmV4dFNvdXJjZTsKLSAgICBpbnQ2NF90IG1OZXh0U3JjSWQ7Ci0gICAgdWludDMyX3QgbU5leHRTb3VyY2VGbGFnczsKLSAgICBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gbU5hdGl2ZVdpbmRvdzsKLSAgICBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luaz4gbUF1ZGlvU2luazsKLSAgICBzcDxEZWNvZGVyQmFzZT4gbVZpZGVvRGVjb2RlcjsKLSAgICBib29sIG1PZmZsb2FkQXVkaW87Ci0gICAgc3A8RGVjb2RlckJhc2U+IG1BdWRpb0RlY29kZXI7Ci0gICAgc3A8Q0NEZWNvZGVyPiBtQ0NEZWNvZGVyOwotICAgIHNwPFJlbmRlcmVyPiBtUmVuZGVyZXI7Ci0gICAgc3A8QUxvb3Blcj4gbVJlbmRlcmVyTG9vcGVyOwotICAgIGludDMyX3QgbUF1ZGlvRGVjb2RlckdlbmVyYXRpb247Ci0gICAgaW50MzJfdCBtVmlkZW9EZWNvZGVyR2VuZXJhdGlvbjsKLSAgICBpbnQzMl90IG1SZW5kZXJlckdlbmVyYXRpb247Ci0KLSAgICBNdXRleCBtUGxheWluZ1RpbWVMb2NrOwotICAgIGludDY0X3QgbUxhc3RTdGFydGVkUGxheWluZ1RpbWVOczsKLSAgICB2b2lkIHN0b3BQbGF5YmFja1RpbWVyKGNvbnN0IGNoYXIgKndoZXJlKTsKLSAgICB2b2lkIHN0YXJ0UGxheWJhY2tUaW1lcihjb25zdCBjaGFyICp3aGVyZSk7Ci0KLSAgICBpbnQ2NF90IG1MYXN0U3RhcnRlZFJlYnVmZmVyaW5nVGltZU5zOwotICAgIHZvaWQgc3RhcnRSZWJ1ZmZlcmluZ1RpbWVyKCk7Ci0gICAgdm9pZCBzdG9wUmVidWZmZXJpbmdUaW1lcihib29sIGV4aXRpbmdQbGF5YmFjayk7Ci0KLSAgICBpbnQ2NF90IG1QcmV2aW91c1NlZWtUaW1lVXM7Ci0KLSAgICBMaXN0PHNwPEFjdGlvbj4gPiBtRGVmZXJyZWRBY3Rpb25zOwotCi0gICAgYm9vbCBtQXVkaW9FT1M7Ci0gICAgYm9vbCBtVmlkZW9FT1M7Ci0KLSAgICBib29sIG1TY2FuU291cmNlc1BlbmRpbmc7Ci0gICAgaW50MzJfdCBtU2NhblNvdXJjZXNHZW5lcmF0aW9uOwotCi0gICAgaW50MzJfdCBtUG9sbER1cmF0aW9uR2VuZXJhdGlvbjsKLSAgICBpbnQzMl90IG1UaW1lZFRleHRHZW5lcmF0aW9uOwotCi0gICAgZW51bSBGbHVzaFN0YXR1cyB7Ci0gICAgICAgIE5PTkUsCi0gICAgICAgIEZMVVNISU5HX0RFQ09ERVIsCi0gICAgICAgIEZMVVNISU5HX0RFQ09ERVJfU0hVVERPV04sCi0gICAgICAgIFNIVVRUSU5HX0RPV05fREVDT0RFUiwKLSAgICAgICAgRkxVU0hFRCwKLSAgICAgICAgU0hVVF9ET1dOLAotICAgIH07Ci0KLSAgICBlbnVtIEZsdXNoQ29tbWFuZCB7Ci0gICAgICAgIEZMVVNIX0NNRF9OT05FLAotICAgICAgICBGTFVTSF9DTURfRkxVU0gsCi0gICAgICAgIEZMVVNIX0NNRF9TSFVURE9XTiwKLSAgICB9OwotCi0gICAgLy8gU3RhdHVzIG9mIGZsdXNoIHJlc3BvbnNlcyBmcm9tIHRoZSBkZWNvZGVyIGFuZCByZW5kZXJlci4KLSAgICBib29sIG1GbHVzaENvbXBsZXRlWzJdWzJdOwotCi0gICAgRmx1c2hTdGF0dXMgbUZsdXNoaW5nQXVkaW87Ci0gICAgRmx1c2hTdGF0dXMgbUZsdXNoaW5nVmlkZW87Ci0KLSAgICAvLyBTdGF0dXMgb2YgZmx1c2ggcmVzcG9uc2VzIGZyb20gdGhlIGRlY29kZXIgYW5kIHJlbmRlcmVyLgotICAgIGJvb2wgbVJlc3VtZVBlbmRpbmc7Ci0KLSAgICBpbnQzMl90IG1WaWRlb1NjYWxpbmdNb2RlOwotCi0gICAgQXVkaW9QbGF5YmFja1JhdGUgbVBsYXliYWNrU2V0dGluZ3M7Ci0gICAgQVZTeW5jU2V0dGluZ3MgbVN5bmNTZXR0aW5nczsKLSAgICBmbG9hdCBtVmlkZW9GcHNIaW50OwotICAgIGJvb2wgbVN0YXJ0ZWQ7Ci0gICAgYm9vbCBtUHJlcGFyZWQ7Ci0gICAgYm9vbCBtUmVzZXR0aW5nOwotICAgIGJvb2wgbVNvdXJjZVN0YXJ0ZWQ7Ci0gICAgYm9vbCBtQXVkaW9EZWNvZGVyRXJyb3I7Ci0gICAgYm9vbCBtVmlkZW9EZWNvZGVyRXJyb3I7Ci0KLSAgICAvLyBBY3R1YWwgcGF1c2Ugc3RhdGUsIGVpdGhlciBhcyByZXF1ZXN0ZWQgYnkgY2xpZW50IG9yIGR1ZSB0byBidWZmZXJpbmcuCi0gICAgYm9vbCBtUGF1c2VkOwotCi0gICAgLy8gUGF1c2Ugc3RhdGUgYXMgcmVxdWVzdGVkIGJ5IGNsaWVudC4gTm90ZSB0aGF0IGlmIG1QYXVzZWRCeUNsaWVudCBpcwotICAgIC8vIHRydWUsIG1QYXVzZWQgaXMgYWx3YXlzIHRydWU7IGlmIG1QYXVzZWRCeUNsaWVudCBpcyBmYWxzZSwgbVBhdXNlZCBjb3VsZAotICAgIC8vIHN0aWxsIGJlY29tZSB0cnVlLCB3aGVuIHdlIHBhdXNlIGludGVybmFsbHkgZHVlIHRvIGJ1ZmZlcmluZy4KLSAgICBib29sIG1QYXVzZWRCeUNsaWVudDsKLQotICAgIC8vIFBhdXNlIHN0YXRlIGFzIHJlcXVlc3RlZCBieSBzb3VyY2UgKGludGVybmFsbHkpIGR1ZSB0byBidWZmZXJpbmcKLSAgICBib29sIG1QYXVzZWRGb3JCdWZmZXJpbmc7Ci0KLSAgICAvLyBNb2R1bGFyIERSTQotICAgIHNwPEFNZWRpYUNyeXB0b1dyYXBwZXI+IG1DcnlwdG87Ci0gICAgYm9vbCBtSXNEcm1Qcm90ZWN0ZWQ7Ci0KLSAgICB0eXBlZGVmIGVudW0gewotICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX05PTkUsCi0gICAgICAgIERBVEFfU09VUkNFX1RZUEVfSFRUUF9MSVZFLAotICAgICAgICBEQVRBX1NPVVJDRV9UWVBFX1JUU1AsCi0gICAgICAgIERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19VUkwsCi0gICAgICAgIERBVEFfU09VUkNFX1RZUEVfR0VORVJJQ19GRCwKLSAgICAgICAgREFUQV9TT1VSQ0VfVFlQRV9NRURJQSwKLSAgICB9IERBVEFfU09VUkNFX1RZUEU7Ci0KLSAgICBzdGQ6OmF0b21pYzxEQVRBX1NPVVJDRV9UWVBFPiBtRGF0YVNvdXJjZVR5cGU7Ci0gICAgc3RkOjphdG9taWM8REFUQV9TT1VSQ0VfVFlQRT4gbU5leHREYXRhU291cmNlVHlwZTsKLQotICAgIGlubGluZSBjb25zdCBzcDxEZWNvZGVyQmFzZT4gJmdldERlY29kZXIoYm9vbCBhdWRpbykgewotICAgICAgICByZXR1cm4gYXVkaW8gPyBtQXVkaW9EZWNvZGVyIDogbVZpZGVvRGVjb2RlcjsKLSAgICB9Ci0KLSAgICBpbmxpbmUgdm9pZCBjbGVhckZsdXNoQ29tcGxldGUoKSB7Ci0gICAgICAgIG1GbHVzaENvbXBsZXRlWzBdWzBdID0gZmFsc2U7Ci0gICAgICAgIG1GbHVzaENvbXBsZXRlWzBdWzFdID0gZmFsc2U7Ci0gICAgICAgIG1GbHVzaENvbXBsZXRlWzFdWzBdID0gZmFsc2U7Ci0gICAgICAgIG1GbHVzaENvbXBsZXRlWzFdWzFdID0gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBkaXNjb25uZWN0U291cmNlKCk7Ci0KLSAgICBzdGF0dXNfdCBjcmVhdGVOdVBsYXllcjJTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZURlc2M+ICZkc2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFNvdXJjZT4gKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFUQV9TT1VSQ0VfVFlQRSAqZGF0YVNvdXJjZVR5cGUpOwotCi0gICAgdm9pZCB0cnlPcGVuQXVkaW9TaW5rRm9yT2ZmbG9hZCgKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBjb25zdCBzcDxNZXRhRGF0YT4gJmF1ZGlvTWV0YSwgYm9vbCBoYXNWaWRlbyk7Ci0gICAgdm9pZCBjbG9zZUF1ZGlvU2luaygpOwotICAgIHZvaWQgcmVzdGFydEF1ZGlvKAotICAgICAgICAgICAgaW50NjRfdCBjdXJyZW50UG9zaXRpb25VcywgYm9vbCBmb3JjZU5vbk9mZmxvYWQsIGJvb2wgbmVlZHNUb0NyZWF0ZUF1ZGlvRGVjb2Rlcik7Ci0gICAgdm9pZCBkZXRlcm1pbmVBdWRpb01vZGVDaGFuZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZhdWRpb0Zvcm1hdCk7Ci0KLSAgICBzdGF0dXNfdCBpbnN0YW50aWF0ZURlY29kZXIoCi0gICAgICAgICAgICBib29sIGF1ZGlvLCBzcDxEZWNvZGVyQmFzZT4gKmRlY29kZXIsIGJvb2wgY2hlY2tBdWRpb01vZGVDaGFuZ2UgPSB0cnVlKTsKLQotICAgIHZvaWQgdXBkYXRlVmlkZW9TaXplKAotICAgICAgICAgICAgaW50NjRfdCBzcmNJZCwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmaW5wdXRGb3JtYXQsCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCA9IE5VTEwpOwotCi0gICAgdm9pZCBub3RpZnlMaXN0ZW5lcihpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4gPSBOVUxMKTsKLQotICAgIHZvaWQgaGFuZGxlRmx1c2hDb21wbGV0ZShib29sIGF1ZGlvLCBib29sIGlzRGVjb2Rlcik7Ci0gICAgdm9pZCBmaW5pc2hGbHVzaElmUG9zc2libGUoKTsKLQotICAgIHZvaWQgb25TdGFydCgpOwotICAgIHZvaWQgb25SZXN1bWUoKTsKLSAgICB2b2lkIG9uUGF1c2UoKTsKLQotICAgIGJvb2wgYXVkaW9EZWNvZGVyU3RpbGxOZWVkZWQoKTsKLQotICAgIHZvaWQgZmx1c2hEZWNvZGVyKGJvb2wgYXVkaW8sIGJvb2wgbmVlZFNodXRkb3duKTsKLQotICAgIHZvaWQgZmluaXNoUmVzdW1lKCk7Ci0gICAgdm9pZCBub3RpZnlEcml2ZXJTZWVrQ29tcGxldGUoaW50NjRfdCBzcmNJZCk7Ci0KLSAgICB2b2lkIHBvc3RTY2FuU291cmNlcygpOwotCi0gICAgdm9pZCBzY2hlZHVsZVBvbGxEdXJhdGlvbigpOwotICAgIHZvaWQgY2FuY2VsUG9sbER1cmF0aW9uKCk7Ci0KLSAgICB2b2lkIHByb2Nlc3NEZWZlcnJlZEFjdGlvbnMoKTsKLQotICAgIHZvaWQgcGVyZm9ybVNlZWsoaW50NjRfdCBzZWVrVGltZVVzLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKTsKLSAgICB2b2lkIHBlcmZvcm1EZWNvZGVyRmx1c2goRmx1c2hDb21tYW5kIGF1ZGlvLCBGbHVzaENvbW1hbmQgdmlkZW8pOwotICAgIHZvaWQgcGVyZm9ybVJlc2V0KCk7Ci0gICAgdm9pZCBwZXJmb3JtUGxheU5leHREYXRhU291cmNlKCk7Ci0gICAgdm9pZCBwZXJmb3JtU2NhblNvdXJjZXMoKTsKLSAgICB2b2lkIHBlcmZvcm1TZXRTdXJmYWNlKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbncpOwotICAgIHZvaWQgcGVyZm9ybVJlc3VtZURlY29kZXJzKGJvb2wgbmVlZE5vdGlmeSk7Ci0KLSAgICB2b2lkIG9uU291cmNlTm90aWZ5KGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2b2lkIG9uQ2xvc2VkQ2FwdGlvbk5vdGlmeShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0KLSAgICB2b2lkIHF1ZXVlRGVjb2RlclNodXRkb3duKAotICAgICAgICAgICAgYm9vbCBhdWRpbywgYm9vbCB2aWRlbywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZyZXBseSk7Ci0KLSAgICB2b2lkIHNlbmRTdWJ0aXRsZURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlciwgaW50MzJfdCBiYXNlSW5kZXgpOwotICAgIHZvaWQgc2VuZFRpbWVkTWV0YURhdGEoY29uc3Qgc3A8QUJ1ZmZlcj4gJmJ1ZmZlcik7Ci0gICAgdm9pZCBzZW5kVGltZWRUZXh0RGF0YShjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKLQotICAgIHZvaWQgd3JpdGVUcmFja0luZm8oUGFyY2VsKiByZXBseSwgY29uc3Qgc3A8QU1lc3NhZ2U+JiBmb3JtYXQpIGNvbnN0OwotCi0gICAgc3RhdHVzX3Qgb25QcmVwYXJlRHJtKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICBzdGF0dXNfdCBvblJlbGVhc2VEcm0oKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE51UGxheWVyMik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE5VX1BMQVlFUjJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzNTQ2YS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1OTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJOdVBsYXllcjJDQ0RlY29kZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotI2luY2x1ZGUgIk51UGxheWVyMkNDRGVjb2Rlci5oIgotCi0jaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIEluIENFQS03MDhCLCB0aGUgbWF4aW11bSBiYW5kd2lkdGggb2YgQ0MgaXMgc2V0IHRvIDk2MDBicHMuCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhCYW5kd2l0aFNpemVCeXRlcyA9IDk2MDAgLyA4OwotCi1zdHJ1Y3QgQ0NEYXRhIHsKLSAgICBDQ0RhdGEodWludDhfdCB0eXBlLCB1aW50OF90IGRhdGExLCB1aW50OF90IGRhdGEyKQotICAgICAgICA6IG1UeXBlKHR5cGUpLCBtRGF0YTEoZGF0YTEpLCBtRGF0YTIoZGF0YTIpIHsKLSAgICB9Ci0gICAgYm9vbCBnZXRDaGFubmVsKHNpemVfdCAqY2hhbm5lbCkgY29uc3QgewotICAgICAgICBpZiAobURhdGExID49IDB4MTAgJiYgbURhdGExIDw9IDB4MWYpIHsKLSAgICAgICAgICAgICpjaGFubmVsID0gKG1EYXRhMSA+PSAweDE4ID8gMSA6IDApICsgKG1UeXBlID8gMiA6IDApOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHVpbnQ4X3QgbVR5cGU7Ci0gICAgdWludDhfdCBtRGF0YTE7Ci0gICAgdWludDhfdCBtRGF0YTI7Ci19OwotCi1zdGF0aWMgYm9vbCBpc051bGxQYWQoQ0NEYXRhICpjYykgewotICAgIHJldHVybiBjYy0+bURhdGExIDwgMHgxMCAmJiBjYy0+bURhdGEyIDwgMHgxMDsKLX0KLQotc3RhdGljIHZvaWQgZHVtcEJ5dGVQYWlyKGNvbnN0IHNwPEFCdWZmZXI+ICZjY0J1ZikgX19hdHRyaWJ1dGVfXyAoKHVudXNlZCkpOwotc3RhdGljIHZvaWQgZHVtcEJ5dGVQYWlyKGNvbnN0IHNwPEFCdWZmZXI+ICZjY0J1ZikgewotICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgIEFTdHJpbmcgb3V0OwotCi0gICAgd2hpbGUgKG9mZnNldCA8IGNjQnVmLT5zaXplKCkpIHsKLSAgICAgICAgY2hhciB0bXBbMTI4XTsKLQotICAgICAgICBDQ0RhdGEgKmNjID0gKENDRGF0YSAqKSAoY2NCdWYtPmRhdGEoKSArIG9mZnNldCk7Ci0KLSAgICAgICAgaWYgKGlzTnVsbFBhZChjYykpIHsKLSAgICAgICAgICAgIC8vIDEgbnVsbCBwYWQgb3IgWERTIG1ldGFkYXRhLCBpZ25vcmUKLSAgICAgICAgICAgIG9mZnNldCArPSBzaXplb2YoQ0NEYXRhKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNjLT5tRGF0YTEgPj0gMHgyMCAmJiBjYy0+bURhdGExIDw9IDB4N2YpIHsKLSAgICAgICAgICAgIC8vIDIgYmFzaWMgY2hhcnMKLSAgICAgICAgICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJbJWRdQmFzaWM6ICVjICVjIiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKLSAgICAgICAgfSBlbHNlIGlmICgoY2MtPm1EYXRhMSA9PSAweDExIHx8IGNjLT5tRGF0YTEgPT0gMHgxOSkKLSAgICAgICAgICAgICAgICAgJiYgY2MtPm1EYXRhMiA+PSAweDMwICYmIGNjLT5tRGF0YTIgPD0gMHgzZikgewotICAgICAgICAgICAgLy8gMSBzcGVjaWFsIGNoYXIKLSAgICAgICAgICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJbJWRdU3BlY2lhbDogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKLSAgICAgICAgfSBlbHNlIGlmICgoY2MtPm1EYXRhMSA9PSAweDEyIHx8IGNjLT5tRGF0YTEgPT0gMHgxQSkKLSAgICAgICAgICAgICAgICAgJiYgY2MtPm1EYXRhMiA+PSAweDIwICYmIGNjLT5tRGF0YTIgPD0gMHgzZil7Ci0gICAgICAgICAgICAvLyAxIFNwYW5pc2gvRnJlbmNoIGNoYXIKLSAgICAgICAgICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJbJWRdU3BhbmlzaDogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKLSAgICAgICAgfSBlbHNlIGlmICgoY2MtPm1EYXRhMSA9PSAweDEzIHx8IGNjLT5tRGF0YTEgPT0gMHgxQikKLSAgICAgICAgICAgICAgICAgJiYgY2MtPm1EYXRhMiA+PSAweDIwICYmIGNjLT5tRGF0YTIgPD0gMHgzZil7Ci0gICAgICAgICAgICAvLyAxIFBvcnR1Z3Vlc2UvR2VybWFuL0RhbmlzaCBjaGFyCi0gICAgICAgICAgICBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiWyVkXUdlcm1hbjogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKLSAgICAgICAgfSBlbHNlIGlmICgoY2MtPm1EYXRhMSA9PSAweDExIHx8IGNjLT5tRGF0YTEgPT0gMHgxOSkKLSAgICAgICAgICAgICAgICAgJiYgY2MtPm1EYXRhMiA+PSAweDIwICYmIGNjLT5tRGF0YTIgPD0gMHgyZil7Ci0gICAgICAgICAgICAvLyBNaWQtUm93IENvZGVzIChUYWJsZSA2OSkKLSAgICAgICAgICAgIHNucHJpbnRmKHRtcCwgc2l6ZW9mKHRtcCksICJbJWRdTWlkLXJvdzogJTAyeCAlMDJ4IiwgY2MtPm1UeXBlLCBjYy0+bURhdGExLCBjYy0+bURhdGEyKTsKLSAgICAgICAgfSBlbHNlIGlmICgoKGNjLT5tRGF0YTEgPT0gMHgxNCB8fCBjYy0+bURhdGExID09IDB4MWMpCi0gICAgICAgICAgICAgICAgICAmJiBjYy0+bURhdGEyID49IDB4MjAgJiYgY2MtPm1EYXRhMiA8PSAweDJmKQotICAgICAgICAgICAgICAgICAgfHwKLSAgICAgICAgICAgICAgICAgICAoKGNjLT5tRGF0YTEgPT0gMHgxNyB8fCBjYy0+bURhdGExID09IDB4MWYpCi0gICAgICAgICAgICAgICAgICAmJiBjYy0+bURhdGEyID49IDB4MjEgJiYgY2MtPm1EYXRhMiA8PSAweDIzKSl7Ci0gICAgICAgICAgICAvLyBNaXNjIENvbnRyb2wgQ29kZXMgKFRhYmxlIDcwKQotICAgICAgICAgICAgc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIlslZF1DdHJsOiAlMDJ4ICUwMngiLCBjYy0+bVR5cGUsIGNjLT5tRGF0YTEsIGNjLT5tRGF0YTIpOwotICAgICAgICB9IGVsc2UgaWYgKChjYy0+bURhdGExICYgMHg3MCkgPT0gMHgxMAotICAgICAgICAgICAgICAgICYmIChjYy0+bURhdGEyICYgMHg0MCkgPT0gMHg0MAotICAgICAgICAgICAgICAgICYmICgoY2MtPm1EYXRhMSAmIDB4MDcpIHx8ICEoY2MtPm1EYXRhMiAmIDB4MjApKSApIHsKLSAgICAgICAgICAgIC8vIFByZWFtYmxlIEFkZHJlc3MgQ29kZXMgKFRhYmxlIDcxKQotICAgICAgICAgICAgc25wcmludGYodG1wLCBzaXplb2YodG1wKSwgIlslZF1QQUM6ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzbnByaW50Zih0bXAsIHNpemVvZih0bXApLCAiWyVkXUludmFsaWQ6ICUwMnggJTAyeCIsIGNjLT5tVHlwZSwgY2MtPm1EYXRhMSwgY2MtPm1EYXRhMik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAob3V0LnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG91dC5hcHBlbmQoIiwgIik7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQuYXBwZW5kKHRtcCk7Ci0KLSAgICAgICAgb2Zmc2V0ICs9IHNpemVvZihDQ0RhdGEpOwotICAgIH0KLQotICAgIEFMT0dJKCIlcyIsIG91dC5jX3N0cigpKTsKLX0KLQotTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OkNDRGVjb2Rlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSkKLSAgICA6IG1Ob3RpZnkobm90aWZ5KSwKLSAgICAgIG1TZWxlY3RlZFRyYWNrKC0xKSwKLSAgICAgIG1EVFZDQ1BhY2tldChuZXcgQUJ1ZmZlcihrTWF4QmFuZHdpdGhTaXplQnl0ZXMpKSB7Ci0gICAgbURUVkNDUGFja2V0LT5zZXRSYW5nZSgwLCAwKTsKLQotICAgIC8vIEluIENFQS02MDgsIHN0cmVhbXMgZnJvbSBwYWNrZXRzIHdoaWNoIGhhdmUgdGhlIHZhbHVlIDAgb2YgY2NfdHlwZSBjb250YWluIENDMSBhbmQgQ0MyLCBhbmQKLSAgICAvLyBzdHJlYW1zIGZyb20gcGFja2V0cyB3aGljaCBoYXZlIHRoZSB2YWx1ZSAxIG9mIGNjX3R5cGUgY29udGFpbiBDQzMgYW5kIENDNC4KLSAgICAvLyBUaGUgZm9sbG93aW5nIGFycmF5IGluZGljYXRlcyB0aGUgY3VycmVudCB0cmFuc21pdHRpbmcgY2hhbm5lbHMgZm9yIGVhY2ggdmFsdWUgb2YgY2NfdHlwZS4KLSAgICBtTGluZTIxQ2hhbm5lbHNbMF0gPSAwOyAvLyBDQzEKLSAgICBtTGluZTIxQ2hhbm5lbHNbMV0gPSAyOyAvLyBDQzMKLX0KLQotc2l6ZV90IE51UGxheWVyMjo6Q0NEZWNvZGVyOjpnZXRUcmFja0NvdW50KCkgY29uc3QgewotICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKLX0KLQotc3A8QU1lc3NhZ2U+IE51UGxheWVyMjo6Q0NEZWNvZGVyOjpnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdCB7Ci0gICAgaWYgKCFpc1RyYWNrVmFsaWQoaW5kZXgpKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2UoKTsKLQotICAgIENDVHJhY2sgdHJhY2sgPSBtVHJhY2tzW2luZGV4XTsKLQotICAgIGZvcm1hdC0+c2V0SW50MzIoInR5cGUiLCBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFKTsKLSAgICBmb3JtYXQtPnNldFN0cmluZygibGFuZ3VhZ2UiLCAidW5kIik7Ci0KLSAgICBzd2l0Y2ggKHRyYWNrLm1UcmFja1R5cGUpIHsKLSAgICAgICAgY2FzZSBrVHJhY2tUeXBlQ0VBNjA4OgotICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9URVhUX0NFQV82MDgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2Uga1RyYWNrVHlwZUNFQTcwODoKLSAgICAgICAgICAgIGZvcm1hdC0+c2V0U3RyaW5nKCJtaW1lIiwgTUVESUFfTUlNRVRZUEVfVEVYVF9DRUFfNzA4KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoIlVua25vd24gdHJhY2sgdHlwZTogJWQiLCB0cmFjay5tVHJhY2tUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8vIEZvciBDRUEtNjA4IENDMSwgZmllbGQgMCBjaGFubmVsIDAKLSAgICBib29sIGlzRGVmYXVsdEF1dG8gPSB0cmFjay5tVHJhY2tUeXBlID09IGtUcmFja1R5cGVDRUE2MDgKLSAgICAgICAgICAgICYmIHRyYWNrLm1UcmFja0NoYW5uZWwgPT0gMDsKLSAgICAvLyBGb3IgQ0VBLTcwOCwgUHJpbWFyeSBDYXB0aW9uIFNlcnZpY2UuCi0gICAgYm9vbCBpc0RlZmF1bHRPbmx5ID0gdHJhY2subVRyYWNrVHlwZSA9PSBrVHJhY2tUeXBlQ0VBNzA4Ci0gICAgICAgICAgICAmJiB0cmFjay5tVHJhY2tDaGFubmVsID09IDE7Ci0gICAgZm9ybWF0LT5zZXRJbnQzMigiYXV0byIsIGlzRGVmYXVsdEF1dG8pOwotICAgIGZvcm1hdC0+c2V0SW50MzIoImRlZmF1bHQiLCBpc0RlZmF1bHRBdXRvIHx8IGlzRGVmYXVsdE9ubHkpOwotICAgIGZvcm1hdC0+c2V0SW50MzIoImZvcmNlZCIsIDApOwotCi0gICAgcmV0dXJuIGZvcm1hdDsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OnNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCwgYm9vbCBzZWxlY3QpIHsKLSAgICBpZiAoIWlzVHJhY2tWYWxpZChpbmRleCkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBpZiAoc2VsZWN0KSB7Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayA9PSAoc3NpemVfdClpbmRleCkgewotICAgICAgICAgICAgQUxPR0UoInRyYWNrICV6dSBhbHJlYWR5IHNlbGVjdGVkIiwgaW5kZXgpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigic2VsZWN0ZWQgdHJhY2sgJXp1IiwgaW5kZXgpOwotICAgICAgICBtU2VsZWN0ZWRUcmFjayA9IGluZGV4OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayAhPSAoc3NpemVfdClpbmRleCkgewotICAgICAgICAgICAgQUxPR0UoInRyYWNrICV6dSBpcyBub3Qgc2VsZWN0ZWQiLCBpbmRleCk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJ1bnNlbGVjdGVkIHRyYWNrICV6dSIsIGluZGV4KTsKLSAgICAgICAgbVNlbGVjdGVkVHJhY2sgPSAtMTsKLSAgICB9Ci0KLSAgICAvLyBDbGVhciB0aGUgcHJldmlvdXMgdHJhY2sgcGF5bG9hZHMKLSAgICBtQ0NNYXAuY2xlYXIoKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotYm9vbCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6aXNTZWxlY3RlZCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNlbGVjdGVkVHJhY2sgPj0gMCAmJiBtU2VsZWN0ZWRUcmFjayA8IChpbnQzMl90KWdldFRyYWNrQ291bnQoKTsKLX0KLQotYm9vbCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6aXNUcmFja1ZhbGlkKHNpemVfdCBpbmRleCkgY29uc3QgewotICAgIHJldHVybiBpbmRleCA8IGdldFRyYWNrQ291bnQoKTsKLX0KLQotLy8gcmV0dXJucyB0cnVlIGlmIGEgbmV3IENDIHRyYWNrIGlzIGZvdW5kCi1ib29sIE51UGxheWVyMjo6Q0NEZWNvZGVyOjpleHRyYWN0RnJvbVNFSShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCkgewotICAgIHNwPEFCdWZmZXI+IHNlaTsKLSAgICBpZiAoIWFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEJ1ZmZlcigic2VpIiwgJnNlaSkgfHwgc2VpID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGludDY0X3QgdGltZVVzOwotICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0KLSAgICBib29sIHRyYWNrQWRkZWQgPSBmYWxzZTsKLQotICAgIGNvbnN0IE5BTFBvc2l0aW9uICpuYWwgPSAoTkFMUG9zaXRpb24gKilzZWktPmRhdGEoKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2VpLT5zaXplKCkgLyBzaXplb2YoTkFMUG9zaXRpb24pOyArK2ksICsrbmFsKSB7Ci0gICAgICAgIHRyYWNrQWRkZWQgfD0gcGFyc2VTRUlOYWxVbml0KAotICAgICAgICAgICAgICAgIHRpbWVVcywgYWNjZXNzVW5pdC0+ZGF0YSgpICsgbmFsLT5uYWxPZmZzZXQsIG5hbC0+bmFsU2l6ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRyYWNrQWRkZWQ7Ci19Ci0KLS8vIHJldHVybnMgdHJ1ZSBpZiBhIG5ldyBDQyB0cmFjayBpcyBmb3VuZAotYm9vbCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6cGFyc2VTRUlOYWxVbml0KGludDY0X3QgdGltZVVzLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIHVuc2lnbmVkIG5hbFR5cGUgPSBkYXRhWzBdICYgMHgxZjsKLQotICAgIC8vIHRoZSBidWZmZXIgc2hvdWxkIG9ubHkgaGF2ZSBTRUkgaW4gaXQKLSAgICBpZiAobmFsVHlwZSAhPSA2KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sIHRyYWNrQWRkZWQgPSBmYWxzZTsKLSAgICBOQUxCaXRSZWFkZXIgYnIoZGF0YSArIDEsIHNpemUgLSAxKTsKLQotICAgIC8vIHNlaV9tZXNzYWdlKCkKLSAgICB3aGlsZSAoYnIuYXRMZWFzdE51bUJpdHNMZWZ0KDE2KSkgeyAvLyBhdCBsZWFzdCAxNi1iaXQgZm9yIHNlaV9tZXNzYWdlKCkKLSAgICAgICAgdWludDMyX3QgcGF5bG9hZF90eXBlID0gMDsKLSAgICAgICAgc2l6ZV90IHBheWxvYWRfc2l6ZSA9IDA7Ci0gICAgICAgIHVpbnQ4X3QgbGFzdF9ieXRlOwotCi0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGxhc3RfYnl0ZSA9IGJyLmdldEJpdHMoOCk7Ci0gICAgICAgICAgICBwYXlsb2FkX3R5cGUgKz0gbGFzdF9ieXRlOwotICAgICAgICB9IHdoaWxlIChsYXN0X2J5dGUgPT0gMHhGRik7Ci0KLSAgICAgICAgZG8gewotICAgICAgICAgICAgbGFzdF9ieXRlID0gYnIuZ2V0Qml0cyg4KTsKLSAgICAgICAgICAgIHBheWxvYWRfc2l6ZSArPSBsYXN0X2J5dGU7Ci0gICAgICAgIH0gd2hpbGUgKGxhc3RfYnl0ZSA9PSAweEZGKTsKLQotICAgICAgICBpZiAocGF5bG9hZF9zaXplID4gU0laRV9NQVggLyA4Ci0gICAgICAgICAgICAgICAgfHwgIWJyLmF0TGVhc3ROdW1CaXRzTGVmdChwYXlsb2FkX3NpemUgKiA4KSkgewotICAgICAgICAgICAgQUxPR1YoIk1hbGZvcm1lZCBTRUkgcGF5bG9hZCIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBzZWlfcGF5bG9hZCgpCi0gICAgICAgIGlmIChwYXlsb2FkX3R5cGUgPT0gNCkgewotICAgICAgICAgICAgYm9vbCBpc0NDID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAocGF5bG9hZF9zaXplID4gMSArIDIgKyA0ICsgMSkgewotICAgICAgICAgICAgICAgIC8vIHVzZXJfZGF0YV9yZWdpc3RlcmVkX2l0dV90X3QzNSgpCi0KLSAgICAgICAgICAgICAgICAvLyBBVFNDIEEvNzI6IDYuNC4yCi0gICAgICAgICAgICAgICAgdWludDhfdCBpdHVfdF90MzVfY291bnRyeV9jb2RlID0gYnIuZ2V0Qml0cyg4KTsKLSAgICAgICAgICAgICAgICB1aW50MTZfdCBpdHVfdF90MzVfcHJvdmlkZXJfY29kZSA9IGJyLmdldEJpdHMoMTYpOwotICAgICAgICAgICAgICAgIHVpbnQzMl90IHVzZXJfaWRlbnRpZmllciA9IGJyLmdldEJpdHMoMzIpOwotICAgICAgICAgICAgICAgIHVpbnQ4X3QgdXNlcl9kYXRhX3R5cGVfY29kZSA9IGJyLmdldEJpdHMoOCk7Ci0KLSAgICAgICAgICAgICAgICBwYXlsb2FkX3NpemUgLT0gMSArIDIgKyA0ICsgMTsKLQotICAgICAgICAgICAgICAgIGlzQ0MgPSBpdHVfdF90MzVfY291bnRyeV9jb2RlID09IDB4QjUKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGl0dV90X3QzNV9wcm92aWRlcl9jb2RlID09IDB4MDAzMQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgdXNlcl9pZGVudGlmaWVyID09ICdHQTk0JwotICAgICAgICAgICAgICAgICAgICAgICAgJiYgdXNlcl9kYXRhX3R5cGVfY29kZSA9PSAweDM7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc0NDICYmIHBheWxvYWRfc2l6ZSA+IDIpIHsKLSAgICAgICAgICAgICAgICB0cmFja0FkZGVkIHw9IHBhcnNlTVBFR0NDRGF0YSh0aW1lVXMsIGJyLmRhdGEoKSwgYnIubnVtQml0c0xlZnQoKSAvIDgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiTWFsZm9ybWVkIFNFSSBwYXlsb2FkIHR5cGUgNCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR1YoIlVuc3VwcG9ydGVkIFNFSSBwYXlsb2FkIHR5cGUgJWQiLCBwYXlsb2FkX3R5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gc2tpcHBpbmcgcmVtYWluaW5nIGJpdHMgb2YgdGhpcyBwYXlsb2FkCi0gICAgICAgIGJyLnNraXBCaXRzKHBheWxvYWRfc2l6ZSAqIDgpOwotICAgIH0KLQotICAgIHJldHVybiB0cmFja0FkZGVkOwotfQotCi0vLyByZXR1cm5zIHRydWUgaWYgYSBuZXcgQ0MgdHJhY2sgaXMgZm91bmQKLWJvb2wgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OmV4dHJhY3RGcm9tTVBFR1VzZXJEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSB7Ci0gICAgc3A8QUJ1ZmZlcj4gbXBlZ1VzZXJEYXRhOwotICAgIGlmICghYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kQnVmZmVyKEFNRURJQUZPUk1BVF9LRVlfTVBFR19VU0VSX0RBVEEsICZtcGVnVXNlckRhdGEpCi0gICAgICAgICAgICB8fCBtcGVnVXNlckRhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKTsKLQotICAgIGJvb2wgdHJhY2tBZGRlZCA9IGZhbHNlOwotCi0gICAgY29uc3Qgc2l6ZV90ICp1c2VyRGF0YSA9IChzaXplX3QgKiltcGVnVXNlckRhdGEtPmRhdGEoKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbXBlZ1VzZXJEYXRhLT5zaXplKCkgLyBzaXplb2Yoc2l6ZV90KTsgKytpKSB7Ci0gICAgICAgIHRyYWNrQWRkZWQgfD0gcGFyc2VNUEVHVXNlckRhdGFVbml0KAotICAgICAgICAgICAgICAgIHRpbWVVcywgYWNjZXNzVW5pdC0+ZGF0YSgpICsgdXNlckRhdGFbaV0sIGFjY2Vzc1VuaXQtPnNpemUoKSAtIHVzZXJEYXRhW2ldKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJhY2tBZGRlZDsKLX0KLQotLy8gcmV0dXJucyB0cnVlIGlmIGEgbmV3IENDIHRyYWNrIGlzIGZvdW5kCi1ib29sIE51UGxheWVyMjo6Q0NEZWNvZGVyOjpwYXJzZU1QRUdVc2VyRGF0YVVuaXQoaW50NjRfdCB0aW1lVXMsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgQUJpdFJlYWRlciBicihkYXRhICsgNCwgNSk7Ci0KLSAgICB1aW50MzJfdCB1c2VyX2lkZW50aWZpZXIgPSBici5nZXRCaXRzKDMyKTsKLSAgICB1aW50OF90IHVzZXJfZGF0YV90eXBlID0gYnIuZ2V0Qml0cyg4KTsKLQotICAgIGlmICh1c2VyX2lkZW50aWZpZXIgPT0gJ0dBOTQnICYmIHVzZXJfZGF0YV90eXBlID09IDB4MykgewotICAgICAgICByZXR1cm4gcGFyc2VNUEVHQ0NEYXRhKHRpbWVVcywgZGF0YSArIDksIHNpemUgLSA5KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIHJldHVybnMgdHJ1ZSBpZiBhIG5ldyBDQyB0cmFjayBpcyBmb3VuZAotYm9vbCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6cGFyc2VNUEVHQ0NEYXRhKGludDY0X3QgdGltZVVzLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIGJvb2wgdHJhY2tBZGRlZCA9IGZhbHNlOwotCi0gICAgLy8gTVBFR19jY19kYXRhKCkKLSAgICAvLyBBVFNDIEEvNTMgUGFydCA0OiA2LjIuMy4xCi0gICAgQUJpdFJlYWRlciBicihkYXRhLCBzaXplKTsKLQotICAgIGlmIChici5udW1CaXRzTGVmdCgpIDw9IDE2KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBici5za2lwQml0cygxKTsKLSAgICBib29sIHByb2Nlc3NfY2NfZGF0YV9mbGFnID0gYnIuZ2V0Qml0cygxKTsKLSAgICBici5za2lwQml0cygxKTsKLSAgICBzaXplX3QgY2NfY291bnQgPSBici5nZXRCaXRzKDUpOwotICAgIGJyLnNraXBCaXRzKDgpOwotCi0gICAgaWYgKCFwcm9jZXNzX2NjX2RhdGFfZmxhZyB8fCAzICogOCAqIGNjX2NvdW50ID49IGJyLm51bUJpdHNMZWZ0KCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHNwPEFCdWZmZXI+IGxpbmUyMUNDQnVmID0gTlVMTDsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2NfY291bnQ7ICsraSkgewotICAgICAgICBici5za2lwQml0cyg1KTsKLSAgICAgICAgYm9vbCBjY192YWxpZCA9IGJyLmdldEJpdHMoMSk7Ci0gICAgICAgIHVpbnQ4X3QgY2NfdHlwZSA9IGJyLmdldEJpdHMoMik7Ci0KLSAgICAgICAgaWYgKGNjX3ZhbGlkKSB7Ci0gICAgICAgICAgICBpZiAoY2NfdHlwZSA9PSAzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1EVFZDQ1BhY2tldC0+c2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgICAgICB0cmFja0FkZGVkIHw9IHBhcnNlRFRWQ0NQYWNrZXQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzLCBtRFRWQ0NQYWNrZXQtPmRhdGEoKSwgbURUVkNDUGFja2V0LT5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICBtRFRWQ0NQYWNrZXQtPnNldFJhbmdlKDAsIDApOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobURUVkNDUGFja2V0LT5zaXplKCkgKyAyID4gbURUVkNDUGFja2V0LT5jYXBhY2l0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVtY3B5KG1EVFZDQ1BhY2tldC0+ZGF0YSgpICsgbURUVkNDUGFja2V0LT5zaXplKCksIGJyLmRhdGEoKSwgMik7Ci0gICAgICAgICAgICAgICAgbURUVkNDUGFja2V0LT5zZXRSYW5nZSgwLCBtRFRWQ0NQYWNrZXQtPnNpemUoKSArIDIpOwotICAgICAgICAgICAgICAgIGJyLnNraXBCaXRzKDE2KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobURUVkNDUGFja2V0LT5zaXplKCkgPiAwICYmIGNjX3R5cGUgPT0gMikgewotICAgICAgICAgICAgICAgIGlmIChtRFRWQ0NQYWNrZXQtPnNpemUoKSArIDIgPiBtRFRWQ0NQYWNrZXQtPmNhcGFjaXR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtZW1jcHkobURUVkNDUGFja2V0LT5kYXRhKCkgKyBtRFRWQ0NQYWNrZXQtPnNpemUoKSwgYnIuZGF0YSgpLCAyKTsKLSAgICAgICAgICAgICAgICBtRFRWQ0NQYWNrZXQtPnNldFJhbmdlKDAsIG1EVFZDQ1BhY2tldC0+c2l6ZSgpICsgMik7Ci0gICAgICAgICAgICAgICAgYnIuc2tpcEJpdHMoMTYpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjY190eXBlID09IDAgfHwgY2NfdHlwZSA9PSAxKSB7Ci0gICAgICAgICAgICAgICAgdWludDhfdCBjY19kYXRhXzEgPSBici5nZXRCaXRzKDgpICYgMHg3ZjsKLSAgICAgICAgICAgICAgICB1aW50OF90IGNjX2RhdGFfMiA9IGJyLmdldEJpdHMoOCkgJiAweDdmOwotCi0gICAgICAgICAgICAgICAgQ0NEYXRhIGNjKGNjX3R5cGUsIGNjX2RhdGFfMSwgY2NfZGF0YV8yKTsKLQotICAgICAgICAgICAgICAgIGlmIChpc051bGxQYWQoJmNjKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzaXplX3QgY2hhbm5lbDsKLSAgICAgICAgICAgICAgICBpZiAoY2MuZ2V0Q2hhbm5lbCgmY2hhbm5lbCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxpbmUyMUNoYW5uZWxzW2NjX3R5cGVdID0gY2hhbm5lbDsKLQotICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBuZXcgdHJhY2sgaWYgaXQgZG9lcyBub3QgZXhpc3QuCi0gICAgICAgICAgICAgICAgICAgIGdldFRyYWNrSW5kZXgoa1RyYWNrVHlwZUNFQTYwOCwgY2hhbm5lbCwgJnRyYWNrQWRkZWQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChpc1NlbGVjdGVkKCkgJiYgbVRyYWNrc1ttU2VsZWN0ZWRUcmFja10ubVRyYWNrVHlwZSA9PSBrVHJhY2tUeXBlQ0VBNjA4Ci0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtVHJhY2tzW21TZWxlY3RlZFRyYWNrXS5tVHJhY2tDaGFubmVsID09IG1MaW5lMjFDaGFubmVsc1tjY190eXBlXSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobGluZTIxQ0NCdWYgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbGluZTIxQ0NCdWYgPSBuZXcgQUJ1ZmZlcigoY2NfY291bnQgLSBpKSAqIHNpemVvZihDQ0RhdGEpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUyMUNDQnVmLT5zZXRSYW5nZSgwLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobGluZTIxQ0NCdWYtPnNpemUoKSArIHNpemVvZihjYykgPiBsaW5lMjFDQ0J1Zi0+Y2FwYWNpdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1lbWNweShsaW5lMjFDQ0J1Zi0+ZGF0YSgpICsgbGluZTIxQ0NCdWYtPnNpemUoKSwgJmNjLCBzaXplb2YoY2MpKTsKLSAgICAgICAgICAgICAgICAgICAgbGluZTIxQ0NCdWYtPnNldFJhbmdlKDAsIGxpbmUyMUNDQnVmLT5zaXplKCkgKyBzaXplb2YoQ0NEYXRhKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBici5za2lwQml0cygxNik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoKGNjX3R5cGUgPT0gMyB8fCBjY190eXBlID09IDIpICYmIG1EVFZDQ1BhY2tldC0+c2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIHRyYWNrQWRkZWQgfD0gcGFyc2VEVFZDQ1BhY2tldCh0aW1lVXMsIG1EVFZDQ1BhY2tldC0+ZGF0YSgpLCBtRFRWQ0NQYWNrZXQtPnNpemUoKSk7Ci0gICAgICAgICAgICAgICAgbURUVkNDUGFja2V0LT5zZXRSYW5nZSgwLCAwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyLnNraXBCaXRzKDE2KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChpc1NlbGVjdGVkKCkgJiYgbVRyYWNrc1ttU2VsZWN0ZWRUcmFja10ubVRyYWNrVHlwZSA9PSBrVHJhY2tUeXBlQ0VBNjA4Ci0gICAgICAgICAgICAmJiBsaW5lMjFDQ0J1ZiAhPSBOVUxMICYmIGxpbmUyMUNDQnVmLT5zaXplKCkgPiAwKSB7Ci0gICAgICAgIG1DQ01hcC5hZGQodGltZVVzLCBsaW5lMjFDQ0J1Zik7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRyYWNrQWRkZWQ7Ci19Ci0KLS8vIHJldHVybnMgdHJ1ZSBpZiBhIG5ldyBDQyB0cmFjayBpcyBmb3VuZAotYm9vbCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6cGFyc2VEVFZDQ1BhY2tldChpbnQ2NF90IHRpbWVVcywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKLSAgICAvLyBDRUEtNzA4QiA1IERUVkNDIFBhY2tldCBMYXllci4KLSAgICBBQml0UmVhZGVyIGJyKGRhdGEsIHNpemUpOwotICAgIGJyLnNraXBCaXRzKDIpOwotCi0gICAgc2l6ZV90IHBhY2tldF9zaXplID0gYnIuZ2V0Qml0cyg2KTsKLSAgICBpZiAocGFja2V0X3NpemUgPT0gMCkgcGFja2V0X3NpemUgPSA2NDsKLSAgICBwYWNrZXRfc2l6ZSAqPSAyOwotCi0gICAgaWYgKHNpemUgIT0gcGFja2V0X3NpemUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2wgdHJhY2tBZGRlZCA9IGZhbHNlOwotCi0gICAgd2hpbGUgKGJyLm51bUJpdHNMZWZ0KCkgPj0gMTYpIHsKLSAgICAgICAgLy8gQ0VBLTcwOEIgRmlndXJlIDUgYW5kIDYuCi0gICAgICAgIHVpbnQ4X3Qgc2VydmljZV9udW1iZXIgPSBici5nZXRCaXRzKDMpOwotICAgICAgICBzaXplX3QgYmxvY2tfc2l6ZSA9IGJyLmdldEJpdHMoNSk7Ci0KLSAgICAgICAgaWYgKHNlcnZpY2VfbnVtYmVyID09IDY0KSB7Ci0gICAgICAgICAgICBici5za2lwQml0cygyKTsKLSAgICAgICAgICAgIHNlcnZpY2VfbnVtYmVyID0gYnIuZ2V0Qml0cyg2KTsKLQotICAgICAgICAgICAgaWYgKHNlcnZpY2VfbnVtYmVyIDwgNjQpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJhY2tBZGRlZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChici5udW1CaXRzTGVmdCgpIDwgYmxvY2tfc2l6ZSAqIDgpIHsKLSAgICAgICAgICAgIHJldHVybiB0cmFja0FkZGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGJsb2NrX3NpemUgPiAwKSB7Ci0gICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleCA9IGdldFRyYWNrSW5kZXgoa1RyYWNrVHlwZUNFQTcwOCwgc2VydmljZV9udW1iZXIsICZ0cmFja0FkZGVkKTsKLSAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayA9PSAoc3NpemVfdCl0cmFja0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gY2NQYWNrZXQgPSBuZXcgQUJ1ZmZlcihibG9ja19zaXplKTsKLSAgICAgICAgICAgICAgICBpZiAoY2NQYWNrZXQtPmNhcGFjaXR5KCkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lbWNweShjY1BhY2tldC0+ZGF0YSgpLCBici5kYXRhKCksIGJsb2NrX3NpemUpOwotICAgICAgICAgICAgICAgIG1DQ01hcC5hZGQodGltZVVzLCBjY1BhY2tldCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnIuc2tpcEJpdHMoYmxvY2tfc2l6ZSAqIDgpOwotICAgIH0KLQotICAgIHJldHVybiB0cmFja0FkZGVkOwotfQotCi0vLyByZXR1cm4gdGhlIHRyYWNrIGluZGV4IGZvciBhIGdpdmVuIHR5cGUgYW5kIGNoYW5uZWwuCi0vLyBpZiB0aGUgdHJhY2sgZG9lcyBub3QgZXhpc3QsIGNyZWF0ZXMgYSBuZXcgb25lLgotc2l6ZV90IE51UGxheWVyMjo6Q0NEZWNvZGVyOjpnZXRUcmFja0luZGV4KAotICAgICAgICBpbnQzMl90IHRyYWNrVHlwZSwgc2l6ZV90IGNoYW5uZWwsIGJvb2wgKnRyYWNrQWRkZWQpIHsKLSAgICBDQ1RyYWNrIHRyYWNrKHRyYWNrVHlwZSwgY2hhbm5lbCk7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1UcmFja0luZGljZXMuaW5kZXhPZktleSh0cmFjayk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIC8vIEEgbmV3IHRyYWNrIGlzIGFkZGVkLgotICAgICAgICBpbmRleCA9IG1UcmFja3Muc2l6ZSgpOwotICAgICAgICBtVHJhY2tJbmRpY2VzLmFkZCh0cmFjaywgaW5kZXgpOwotICAgICAgICBtVHJhY2tzLmFkZCh0cmFjayk7Ci0gICAgICAgICp0cmFja0FkZGVkID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgIH0KLQotICAgIHJldHVybiBtVHJhY2tJbmRpY2VzLnZhbHVlQXQoaW5kZXgpOwotfQotCi12b2lkIE51UGxheWVyMjo6Q0NEZWNvZGVyOjpkZWNvZGUoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpIHsKLSAgICBpZiAoZXh0cmFjdEZyb21NUEVHVXNlckRhdGEoYWNjZXNzVW5pdCkgfHwgZXh0cmFjdEZyb21TRUkoYWNjZXNzVW5pdCkpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICBtc2ctPnNldEludDMyKCJ3aGF0Iiwga1doYXRUcmFja0FkZGVkKTsKLSAgICAgICAgbXNnLT5wb3N0KCk7Ci0gICAgfQotICAgIC8vIFRPRE86IGV4dHJhY3QgQ0MgZnJvbSBvdGhlciBzb3VyY2VzCi19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OmRpc3BsYXkoaW50NjRfdCB0aW1lVXMpIHsKLSAgICBpZiAoIWlzU2VsZWN0ZWQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3NpemVfdCBpbmRleCA9IG1DQ01hcC5pbmRleE9mS2V5KHRpbWVVcyk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVigiY2MgZm9yIHRpbWVzdGFtcCAlIiBQUklkNjQgIiBub3QgZm91bmQiLCB0aW1lVXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3A8QUJ1ZmZlcj4gY2NCdWY7Ci0KLSAgICBpZiAoaW5kZXggPT0gMCkgewotICAgICAgICBjY0J1ZiA9IG1DQ01hcC52YWx1ZUF0KGluZGV4KTsKLSAgICB9IGVsc2UgewotICAgICAgICBzaXplX3Qgc2l6ZSA9IDA7Ci0KLSAgICAgICAgZm9yIChzc2l6ZV90IGkgPSAwOyBpIDw9IGluZGV4OyArK2kpIHsKLSAgICAgICAgICAgIHNpemUgKz0gbUNDTWFwLnZhbHVlQXQoaSktPnNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNjQnVmID0gbmV3IEFCdWZmZXIoc2l6ZSk7Ci0gICAgICAgIGNjQnVmLT5zZXRSYW5nZSgwLCAwKTsKLQotICAgICAgICBpZiAoY2NCdWYtPmNhcGFjaXR5KCkgPiAwKSB7Ci0gICAgICAgICAgICBmb3IgKHNzaXplX3QgaSA9IDA7IGkgPD0gaW5kZXg7ICsraSkgewotICAgICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IG1DQ01hcC52YWx1ZUF0KGkpOwotICAgICAgICAgICAgICAgIG1lbWNweShjY0J1Zi0+ZGF0YSgpICsgY2NCdWYtPnNpemUoKSwgYnVmLT5kYXRhKCksIGJ1Zi0+c2l6ZSgpKTsKLSAgICAgICAgICAgICAgICBjY0J1Zi0+c2V0UmFuZ2UoMCwgY2NCdWYtPnNpemUoKSArIGJ1Zi0+c2l6ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChjY0J1Zi0+c2l6ZSgpID4gMCkgewotI2lmIDAKLSAgICAgICAgZHVtcEJ5dGVQYWlyKGNjQnVmKTsKLSNlbmRpZgotCi0gICAgICAgIGNjQnVmLT5tZXRhKCktPnNldEludDMyKEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVgsIG1TZWxlY3RlZFRyYWNrKTsKLSAgICAgICAgY2NCdWYtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7Ci0gICAgICAgIGNjQnVmLT5tZXRhKCktPnNldEludDY0KCJkdXJhdGlvblVzIiwgMExMKTsKLQotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBrV2hhdENsb3NlZENhcHRpb25EYXRhKTsKLSAgICAgICAgbXNnLT5zZXRCdWZmZXIoImJ1ZmZlciIsIGNjQnVmKTsKLSAgICAgICAgbXNnLT5wb3N0KCk7Ci0gICAgfQotCi0gICAgLy8gcmVtb3ZlIGFsbCBlbnRyaWVzIGJlZm9yZSB0aW1lVXMKLSAgICBtQ0NNYXAucmVtb3ZlSXRlbXNBdCgwLCBpbmRleCArIDEpOwotfQotCi12b2lkIE51UGxheWVyMjo6Q0NEZWNvZGVyOjpmbHVzaCgpIHsKLSAgICBtQ0NNYXAuY2xlYXIoKTsKLSAgICBtRFRWQ0NQYWNrZXQtPnNldFJhbmdlKDAsIDApOwotfQotCi1pbnQzMl90IE51UGxheWVyMjo6Q0NEZWNvZGVyOjpDQ1RyYWNrOjpjb21wYXJlKGNvbnN0IE51UGxheWVyMjo6Q0NEZWNvZGVyOjpDQ1RyYWNrJiByaHMpIGNvbnN0IHsKLSAgICBpbnQzMl90IGNtcCA9IG1UcmFja1R5cGUgLSByaHMubVRyYWNrVHlwZTsKLSAgICBpZiAoY21wICE9IDApIHJldHVybiBjbXA7Ci0gICAgcmV0dXJuIG1UcmFja0NoYW5uZWwgLSByaHMubVRyYWNrQ2hhbm5lbDsKLX0KLQotYm9vbCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjazo6b3BlcmF0b3I8KGNvbnN0IE51UGxheWVyMjo6Q0NEZWNvZGVyOjpDQ1RyYWNrJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gY29tcGFyZShyaHMpIDwgMDsKLX0KLQotYm9vbCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjazo6b3BlcmF0b3I9PShjb25zdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjayYgcmhzKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNvbXBhcmUocmhzKSA9PSAwOwotfQotCi1ib29sIE51UGxheWVyMjo6Q0NEZWNvZGVyOjpDQ1RyYWNrOjpvcGVyYXRvciE9KGNvbnN0IE51UGxheWVyMjo6Q0NEZWNvZGVyOjpDQ1RyYWNrJiByaHMpIGNvbnN0IHsKLSAgICByZXR1cm4gY29tcGFyZShyaHMpICE9IDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkNDRGVjb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2Q1ZWEyLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyQ0NEZWNvZGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE5VUExBWUVSMl9DQ0RFQ09ERVJfSF8KLQotI2RlZmluZSBOVVBMQVlFUjJfQ0NERUNPREVSX0hfCi0KLSNpbmNsdWRlICJOdVBsYXllcjIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgTnVQbGF5ZXIyOjpDQ0RlY29kZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0Q2xvc2VkQ2FwdGlvbkRhdGEsCi0gICAgICAgIGtXaGF0VHJhY2tBZGRlZCwKLSAgICB9OwotCi0gICAgZW51bSB7Ci0gICAgICAgIGtUcmFja1R5cGVDRUE2MDgsCi0gICAgICAgIGtUcmFja1R5cGVDRUE3MDgsCi0gICAgfTsKLQotICAgIGV4cGxpY2l0IENDRGVjb2Rlcihjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7Ci0KLSAgICBzaXplX3QgZ2V0VHJhY2tDb3VudCgpIGNvbnN0OwotICAgIHNwPEFNZXNzYWdlPiBnZXRUcmFja0luZm8oc2l6ZV90IGluZGV4KSBjb25zdDsKLSAgICBzdGF0dXNfdCBzZWxlY3RUcmFjayhzaXplX3QgaW5kZXgsIGJvb2wgc2VsZWN0KTsKLSAgICBib29sIGlzU2VsZWN0ZWQoKSBjb25zdDsKLSAgICB2b2lkIGRlY29kZShjb25zdCBzcDxBQnVmZmVyPiAmYWNjZXNzVW5pdCk7Ci0gICAgdm9pZCBkaXNwbGF5KGludDY0X3QgdGltZVVzKTsKLSAgICB2b2lkIGZsdXNoKCk7Ci0KLXByaXZhdGU6Ci0gICAgLy8gQ0MgdHJhY2sgaWRlbnRpZmllci4KLSAgICBzdHJ1Y3QgQ0NUcmFjayB7Ci0gICAgICAgIENDVHJhY2soKSA6IG1UcmFja1R5cGUoMCksIG1UcmFja0NoYW5uZWwoMCkgeyB9Ci0KLSAgICAgICAgQ0NUcmFjayhjb25zdCBpbnQzMl90IHRyYWNrVHlwZSwgY29uc3Qgc2l6ZV90IHRyYWNrQ2hhbm5lbCkKLSAgICAgICAgICAgIDogbVRyYWNrVHlwZSh0cmFja1R5cGUpLCBtVHJhY2tDaGFubmVsKHRyYWNrQ2hhbm5lbCkgeyB9Ci0KLSAgICAgICAgaW50MzJfdCBtVHJhY2tUeXBlOwotICAgICAgICBzaXplX3QgbVRyYWNrQ2hhbm5lbDsKLQotICAgICAgICAvLyBUaGUgb3JkZXJpbmcgb2YgQ0NUcmFja3MgaXMgdG8gYnVpbGQgYSBtYXAgb2YgdHJhY2sgdG8gaW5kZXguCi0gICAgICAgIC8vIEl0IGlzIG5lY2Vzc2FyeSB0byBmaW5kIHRoZSBpbmRleCBvZiB0aGUgbWF0Y2hlZCBDQ1RyYWNrIHdoZW4gQ0MgZGF0YSBjb21lcy4KLSAgICAgICAgaW50IGNvbXBhcmUoY29uc3QgTnVQbGF5ZXIyOjpDQ0RlY29kZXI6OkNDVHJhY2smIHJocykgY29uc3Q7Ci0gICAgICAgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjayYgcmhzKSBjb25zdDsKLSAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjayYgcmhzKSBjb25zdDsKLSAgICAgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBOdVBsYXllcjI6OkNDRGVjb2Rlcjo6Q0NUcmFjayYgcmhzKSBjb25zdDsKLSAgICB9OwotCi0gICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7Ci0gICAgS2V5ZWRWZWN0b3I8aW50NjRfdCwgc3A8QUJ1ZmZlcj4gPiBtQ0NNYXA7Ci0gICAgc3NpemVfdCBtU2VsZWN0ZWRUcmFjazsKLSAgICBLZXllZFZlY3RvcjxDQ1RyYWNrLCBzaXplX3Q+IG1UcmFja0luZGljZXM7Ci0gICAgVmVjdG9yPENDVHJhY2s+IG1UcmFja3M7Ci0KLSAgICAvLyBDRUEtNjA4IGNsb3NlZCBjYXB0aW9uCi0gICAgc2l6ZV90IG1MaW5lMjFDaGFubmVsc1syXTsgLy8gVGhlIGN1cnJlbnQgY2hhbm5lbHMgb2YgTlRTQ19DQ19GSUVMRF97MSwgMn0KLQotICAgIC8vIENFQS03MDggY2xvc2VkIGNhcHRpb24KLSAgICBzcDxBQnVmZmVyPiBtRFRWQ0NQYWNrZXQ7Ci0KLSAgICBib29sIGlzVHJhY2tWYWxpZChzaXplX3QgaW5kZXgpIGNvbnN0OwotICAgIHNpemVfdCBnZXRUcmFja0luZGV4KGludDMyX3QgdHJhY2tUeXBlLCBzaXplX3QgY2hhbm5lbCwgYm9vbCAqdHJhY2tBZGRlZCk7Ci0KLSAgICAvLyBFeHRyYWN0IGZyb20gSC4yNjQgU0VJcwotICAgIGJvb2wgZXh0cmFjdEZyb21TRUkoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOwotICAgIGJvb2wgcGFyc2VTRUlOYWxVbml0KGludDY0X3QgdGltZVVzLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICAvLyBFeHRyYWN0IGZyb20gTVBFRyB1c2VyIGRhdGEKLSAgICBib29sIGV4dHJhY3RGcm9tTVBFR1VzZXJEYXRhKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKLSAgICBib29sIHBhcnNlTVBFR1VzZXJEYXRhVW5pdChpbnQ2NF90IHRpbWVVcywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgLy8gRXh0cmFjdCBDQyB0cmFja3MgZnJvbSBNUEVHX2NjX2RhdGEKLSAgICBib29sIHBhcnNlTVBFR0NDRGF0YShpbnQ2NF90IHRpbWVVcywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwotICAgIGJvb2wgcGFyc2VEVFZDQ1BhY2tldChpbnQ2NF90IHRpbWVVcywgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ0NEZWNvZGVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTlVQTEFZRVIyX0NDREVDT0RFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2Rlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NzE4ZTEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJOdVBsYXllcjJEZWNvZGVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlICJOdVBsYXllcjJDQ0RlY29kZXIuaCIKLSNpbmNsdWRlICJOdVBsYXllcjJEZWNvZGVyLmgiCi0jaW5jbHVkZSAiTnVQbGF5ZXIyRHJtLmgiCi0jaW5jbHVkZSAiTnVQbGF5ZXIyUmVuZGVyZXIuaCIKLSNpbmNsdWRlICJOdVBsYXllcjJTb3VyY2UuaCIKLQotI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFCdWZmZXJIb2xkZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDb2RlYy5oPgotI2luY2x1ZGUgPG1lZGlhL05ka1dyYXBwZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaD4KLQotI2luY2x1ZGUgPHN5c3RlbS93aW5kb3cuaD4KLSNpbmNsdWRlICJBVFNQYXJzZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgZmxvYXQga0Rpc3BsYXlSZWZyZXNoaW5nUmF0ZSA9IDYwLmY7IC8vIFRPRE86IGdldCB0aGlzIGZyb20gdGhlIGRpc3BsYXkKLQotLy8gVGhlIGRlZmF1bHQgdG90YWwgdmlkZW8gZnJhbWUgcmF0ZSBvZiBhIHN0cmVhbSB3aGVuIHRoYXQgaW5mbyBpcyBub3QgYXZhaWxhYmxlIGZyb20KLS8vIHRoZSBzb3VyY2UuCi1zdGF0aWMgZmxvYXQga0RlZmF1bHRWaWRlb0ZyYW1lUmF0ZVRvdGFsID0gMzAuZjsKLQotc3RhdGljIGlubGluZSBib29sIGdldEF1ZGlvRGVlcEJ1ZmZlclNldHRpbmcoKSB7Ci0gICAgcmV0dXJuIHByb3BlcnR5X2dldF9ib29sKCJtZWRpYS5zdGFnZWZyaWdodC5hdWRpby5kZWVwIiwgZmFsc2UgLyogZGVmYXVsdF92YWx1ZSAqLyk7Ci19Ci0KLU51UGxheWVyMjo6RGVjb2Rlcjo6RGVjb2RlcigKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgIGNvbnN0IHNwPFNvdXJjZT4gJnNvdXJjZSwKLSAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgIGNvbnN0IHNwPFJlbmRlcmVyPiAmcmVuZGVyZXIsCi0gICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbnd3LAotICAgICAgICBjb25zdCBzcDxDQ0RlY29kZXI+ICZjY0RlY29kZXIpCi0gICAgOiBEZWNvZGVyQmFzZShub3RpZnkpLAotICAgICAgbU5hdGl2ZVdpbmRvdyhud3cpLAotICAgICAgbVNvdXJjZShzb3VyY2UpLAotICAgICAgbVJlbmRlcmVyKHJlbmRlcmVyKSwKLSAgICAgIG1DQ0RlY29kZXIoY2NEZWNvZGVyKSwKLSAgICAgIG1QaWQocGlkKSwKLSAgICAgIG1VaWQodWlkKSwKLSAgICAgIG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcygtMUxMKSwKLSAgICAgIG1OdW1GcmFtZXNUb3RhbCgwTEwpLAotICAgICAgbU51bUlucHV0RnJhbWVzRHJvcHBlZCgwTEwpLAotICAgICAgbU51bU91dHB1dEZyYW1lc0Ryb3BwZWQoMExMKSwKLSAgICAgIG1WaWRlb1dpZHRoKDApLAotICAgICAgbVZpZGVvSGVpZ2h0KDApLAotICAgICAgbUlzQXVkaW8odHJ1ZSksCi0gICAgICBtSXNWaWRlb0FWQyhmYWxzZSksCi0gICAgICBtSXNTZWN1cmUoZmFsc2UpLAotICAgICAgbUlzRW5jcnlwdGVkKGZhbHNlKSwKLSAgICAgIG1Jc0VuY3J5cHRlZE9ic2VydmVkRWFybGllcihmYWxzZSksCi0gICAgICBtRm9ybWF0Q2hhbmdlUGVuZGluZyhmYWxzZSksCi0gICAgICBtVGltZUNoYW5nZVBlbmRpbmcoZmFsc2UpLAotICAgICAgbUZyYW1lUmF0ZVRvdGFsKGtEZWZhdWx0VmlkZW9GcmFtZVJhdGVUb3RhbCksCi0gICAgICBtUGxheWJhY2tTcGVlZCgxLjBmKSwKLSAgICAgIG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCgxKSwgLy8gZGVjb2RlIGFsbCBsYXllcnMKLSAgICAgIG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJBbGxvd2VkKDEpLAotICAgICAgbUN1cnJlbnRNYXhWaWRlb1RlbXBvcmFsTGF5ZXJJZCgwKSwKLSAgICAgIG1SZXN1bWVQZW5kaW5nKGZhbHNlKSwKLSAgICAgIG1Db21wb25lbnROYW1lKCJkZWNvZGVyIikgewotICAgIG1WaWRlb1RlbXBvcmFsTGF5ZXJBZ2dyZWdhdGVGcHNbMF0gPSBtRnJhbWVSYXRlVG90YWw7Ci19Ci0KLU51UGxheWVyMjo6RGVjb2Rlcjo6fkRlY29kZXIoKSB7Ci0gICAgLy8gTmVlZCB0byBzdG9wIGxvb3BlciBmaXJzdCBzaW5jZSBtQ29kZWMgY291bGQgYmUgYWNjZXNzZWQgb24gdGhlIG1EZWNvZGVyTG9vcGVyLgotICAgIHN0b3BMb29wZXIoKTsKLSAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKLSAgICAgICAgbUNvZGVjLT5yZWxlYXNlKCk7Ci0gICAgfQotICAgIHJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpOwotfQotCi1zcDxBTWVzc2FnZT4gTnVQbGF5ZXIyOjpEZWNvZGVyOjpnZXRTdGF0cygpIGNvbnN0IHsKLSAgICBtU3RhdHMtPnNldEludDY0KCJmcmFtZXMtdG90YWwiLCBtTnVtRnJhbWVzVG90YWwpOwotICAgIG1TdGF0cy0+c2V0SW50NjQoImZyYW1lcy1kcm9wcGVkLWlucHV0IiwgbU51bUlucHV0RnJhbWVzRHJvcHBlZCk7Ci0gICAgbVN0YXRzLT5zZXRJbnQ2NCgiZnJhbWVzLWRyb3BwZWQtb3V0cHV0IiwgbU51bU91dHB1dEZyYW1lc0Ryb3BwZWQpOwotICAgIHJldHVybiBtU3RhdHM7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMjo6RGVjb2Rlcjo6c2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbnd3KSB7Ci0gICAgaWYgKG53dyA9PSBOVUxMIHx8IG53dy0+Z2V0QU5hdGl2ZVdpbmRvdygpID09IE5VTEwKLSAgICAgICAgfHwgQURlYnVnOjppc0V4cGVyaW1lbnRFbmFibGVkKCJsZWdhY3ktc2V0c3VyZmFjZSIpKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFZpZGVvU3VyZmFjZSwgdGhpcyk7Ci0KLSAgICBtc2ctPnNldE9iamVjdCgic3VyZmFjZSIsIG53dyk7Ci0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLSAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKLSAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOwotICAgIH0KLSAgICByZXR1cm4gZXJyOwotfQotCi12b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBBTE9HVigiWyVzXSBvbk1lc3NhZ2U6ICVzIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwotCi0gICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewotICAgICAgICBjYXNlIGtXaGF0Q29kZWNOb3RpZnk6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3QgY2JJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJjYWxsYmFja0lEIiwgJmNiSUQpKTsKLQotICAgICAgICAgICAgQUxPR1YoIlslc10ga1doYXRDb2RlY05vdGlmeTogY2JJRCA9ICVkLCBwYXVzZWQgPSAlZCIsCi0gICAgICAgICAgICAgICAgICAgIG1Jc0F1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIsIGNiSUQsIG1QYXVzZWQpOwotCi0gICAgICAgICAgICBpZiAobVBhdXNlZCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzd2l0Y2ggKGNiSUQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEFNZWRpYUNvZGVjV3JhcHBlcjo6Q0JfSU5QVVRfQVZBSUxBQkxFOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleDsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImluZGV4IiwgJmluZGV4KSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlQW5JbnB1dEJ1ZmZlcihpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNhc2UgQU1lZGlhQ29kZWNXcmFwcGVyOjpDQl9PVVRQVVRfQVZBSUxBQkxFOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleDsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldDsKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOwotICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZsYWdzOwotCi0gICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJpbmRleCIsICZpbmRleCkpOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJvZmZzZXQiLCAmb2Zmc2V0KSk7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoInNpemUiLCAmc2l6ZSkpOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmxhZ3MiLCAmZmxhZ3MpKTsKLQotICAgICAgICAgICAgICAgICAgICBoYW5kbGVBbk91dHB1dEJ1ZmZlcihpbmRleCwgb2Zmc2V0LCBzaXplLCB0aW1lVXMsIGZsYWdzKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBBTWVkaWFDb2RlY1dyYXBwZXI6OkNCX09VVFBVVF9GT1JNQVRfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKTsKLQotICAgICAgICAgICAgICAgICAgICBoYW5kbGVPdXRwdXRGb3JtYXRDaGFuZ2UoZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgY2FzZSBBTWVkaWFDb2RlY1dyYXBwZXI6OkNCX0VSUk9SOgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOwotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRGVjb2RlciAoJXMpIHJlcG9ydGVkIGVycm9yIDogMHgleCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgZXJyKTsKLQotICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihlcnIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRSZW5kZXJCdWZmZXI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICghaXNTdGFsZVJlcGx5KG1zZykpIHsKLSAgICAgICAgICAgICAgICBvblJlbmRlckJ1ZmZlcihtc2cpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0QXVkaW9PdXRwdXRGb3JtYXRDaGFuZ2VkOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWlzU3RhbGVSZXBseShtc2cpKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZXJyIiwgJmVycikgJiYgZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJSZW5kZXJlciByZXBvcnRlZCAweCV4IHdoZW4gY2hhbmdpbmcgYXVkaW8gb3V0cHV0IGZvcm1hdCIsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKGVycik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0U2V0VmlkZW9TdXJmYWNlOgotICAgICAgICB7Ci0gICAgICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLQotICAgICAgICAgICAgc3A8UmVmQmFzZT4gb2JqOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJzdXJmYWNlIiwgJm9iaikpOwotICAgICAgICAgICAgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+IG53dyA9Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvd1dyYXBwZXIgKj4ob2JqLmdldCgpKTsgLy8gbm9uLW51bGwKLSAgICAgICAgICAgIGlmIChud3cgPT0gTlVMTCB8fCBud3ctPmdldEFOYXRpdmVXaW5kb3coKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQzMl90IGVyciA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgLy8gTk9URTogaW4gcHJhY3RpY2UgbU5hdGl2ZVdpbmRvdyBpcyBhbHdheXMgbm9uLW51bGwsCi0gICAgICAgICAgICAvLyBidXQgY2hlY2tpbmcgaGVyZSBmb3IgY29tcGxldGVuZXNzCi0gICAgICAgICAgICBpZiAobUNvZGVjICE9IE5VTEwKLSAgICAgICAgICAgICAgICAmJiBtTmF0aXZlV2luZG93ICE9IE5VTEwgJiYgbU5hdGl2ZVdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBvbmNlIEF3ZXNvbWVQbGF5ZXIgaXMgcmVtb3ZlZCwgcmVtb3ZlIHRoaXMgYXV0b21hdGljIGNvbm5lY3RpbmcKLSAgICAgICAgICAgICAgICAvLyB0byB0aGUgc3VyZmFjZSBieSBNZWRpYVBsYXllclNlcnZpY2UuCi0gICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50IE1lZGlhUGxheWVyMk1hbmFnZXI6OmNsaWVudCBoYXMgYWxyZWFkeSBjb25uZWN0ZWQgdG8gdGhlCi0gICAgICAgICAgICAgICAgLy8gc3VyZmFjZSwgd2hpY2ggTWVkaWFDb2RlYyBkb2VzIG5vdCBleHBlY3QKLSAgICAgICAgICAgICAgICBlcnIgPSBuYXRpdmVfd2luZG93X2FwaV9kaXNjb25uZWN0KG53dy0+Z2V0QU5hdGl2ZVdpbmRvdygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gbUNvZGVjLT5zZXRPdXRwdXRTdXJmYWNlKG53dyk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dJX0lGKGVyciwgImNvZGVjIHNldE91dHB1dFN1cmZhY2UgcmV0dXJuZWQ6ICVkIiwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjb25uZWN0IHRvIHRoZSBvbGQgc3VyZmFjZSBhcyBNUFM6OkNsaWVudCB3aWxsIGV4cGVjdCB0bwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYmUgYWJsZSB0byBkaXNjb25uZWN0IGZyb20gaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCluYXRpdmVfd2luZG93X2FwaV9jb25uZWN0KG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFUSVZFX1dJTkRPV19BUElfTUVESUEpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBtTmF0aXZlV2luZG93ID0gbnd3OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVjb25uZWN0IHRvIHRoZSBuZXcgc3VyZmFjZSBvbiBlcnJvciBhcyBNUFM6OkNsaWVudCB3aWxsIGV4cGVjdCB0bwotICAgICAgICAgICAgICAgICAgICAvLyBiZSBhYmxlIHRvIGRpc2Nvbm5lY3QgZnJvbSBpdC4KLSAgICAgICAgICAgICAgICAgICAgKHZvaWQpbmF0aXZlX3dpbmRvd19hcGlfY29ubmVjdChud3ctPmdldEFOYXRpdmVXaW5kb3coKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQVRJVkVfV0lORE9XX0FQSV9NRURJQSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0RHJtUmVsZWFzZUNyeXB0bzoKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoImtXaGF0RHJtUmVsZWFzZUNyeXB0byIpOwotICAgICAgICAgICAgb25SZWxlYXNlQ3J5cHRvKG1zZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBEZWNvZGVyQmFzZTo6b25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBOdVBsYXllcjI6OkRlY29kZXI6Om9uQ29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7Ci0gICAgQUxPR1YoIlslc10gb25Db25maWd1cmUgKGZvcm1hdD0lcykiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBmb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Ci0gICAgQ0hFQ0sobUNvZGVjID09IE5VTEwpOwotCi0gICAgbUZvcm1hdENoYW5nZVBlbmRpbmcgPSBmYWxzZTsKLSAgICBtVGltZUNoYW5nZVBlbmRpbmcgPSBmYWxzZTsKLQotICAgICsrbUJ1ZmZlckdlbmVyYXRpb247Ci0KLSAgICBBU3RyaW5nIG1pbWU7Ci0gICAgQ0hFQ0soZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKLQotICAgIG1Jc0F1ZGlvID0gIXN0cm5jYXNlY21wKCJhdWRpby8iLCBtaW1lLmNfc3RyKCksIDYpOwotICAgIG1Jc1ZpZGVvQVZDID0gIXN0cmNhc2VjbXAoTUVESUFfTUlNRVRZUEVfVklERU9fQVZDLCBtaW1lLmNfc3RyKCkpOwotCi0gICAgbUNvbXBvbmVudE5hbWUgPSBtaW1lOwotICAgIG1Db21wb25lbnROYW1lLmFwcGVuZCgiIGRlY29kZXIiKTsKLSAgICBBTE9HVigiWyVzXSBvbkNvbmZpZ3VyZSAobnd3PSVwKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksCi0gICAgICAgICAgKG1OYXRpdmVXaW5kb3cgPT0gTlVMTCA/IE5VTEwgOiBtTmF0aXZlV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCkpKTsKLQotICAgIG1Db2RlYyA9IEFNZWRpYUNvZGVjV3JhcHBlcjo6Q3JlYXRlRGVjb2RlckJ5VHlwZShtaW1lKTsKLSAgICBpbnQzMl90IHNlY3VyZSA9IDA7Ci0gICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJzZWN1cmUiLCAmc2VjdXJlKSAmJiBzZWN1cmUgIT0gMCkgewotICAgICAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChtQ29kZWMtPmdldE5hbWUoJm1Db21wb25lbnROYW1lKSA9PSBPSykgewotICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmFwcGVuZCgiLnNlY3VyZSIpOwotICAgICAgICAgICAgICAgIG1Db2RlYy0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIEFMT0dJKCJbJXNdIGNyZWF0aW5nIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgbUNvZGVjID0gQU1lZGlhQ29kZWNXcmFwcGVyOjpDcmVhdGVDb2RlY0J5TmFtZShtQ29tcG9uZW50TmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Db2RlYyA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKG1Db2RlYyA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlICVzJXMgZGVjb2RlciIsCi0gICAgICAgICAgICAgICAgKHNlY3VyZSA/ICJzZWN1cmUgIiA6ICIiKSwgbWltZS5jX3N0cigpKTsKLSAgICAgICAgaGFuZGxlRXJyb3IoTk9fSU5JVCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbUlzU2VjdXJlID0gc2VjdXJlOwotCi0gICAgbUNvZGVjLT5nZXROYW1lKCZtQ29tcG9uZW50TmFtZSk7Ci0KLSAgICBzdGF0dXNfdCBlcnI7Ci0gICAgaWYgKG1OYXRpdmVXaW5kb3cgIT0gTlVMTCAmJiBtTmF0aXZlV2luZG93LT5nZXRBTmF0aXZlV2luZG93KCkgIT0gTlVMTCkgewotICAgICAgICAvLyBkaXNjb25uZWN0IGZyb20gc3VyZmFjZSBhcyBNZWRpYUNvZGVjIHdpbGwgcmVjb25uZWN0Ci0gICAgICAgIGVyciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Rpc2Nvbm5lY3QobU5hdGl2ZVdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKLSAgICAgICAgLy8gV2UgdHJlYXQgdGhpcyBhcyBhIHdhcm5pbmcsIGFzIHRoaXMgaXMgYSBwcmVwYXJhdG9yeSBzdGVwLgotICAgICAgICAvLyBDb2RlYyB3aWxsIHRyeSB0byBjb25uZWN0IHRvIHRoZSBzdXJmYWNlLCB3aGljaCBpcyB3aGVyZQotICAgICAgICAvLyBhbnkgZXJyb3Igc2lnbmFsaW5nIHdpbGwgb2NjdXIuCi0gICAgICAgIEFMT0dXX0lGKGVyciAhPSBPSywgImZhaWxlZCB0byBkaXNjb25uZWN0IGZyb20gc3VyZmFjZTogJWQiLCBlcnIpOwotICAgIH0KLQotICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgc3A8UmVmQmFzZT4gb2JqQ3J5cHRvOwotICAgIGZvcm1hdC0+ZmluZE9iamVjdCgiY3J5cHRvIiwgJm9iakNyeXB0byk7Ci0gICAgc3A8QU1lZGlhQ3J5cHRvV3JhcHBlcj4gY3J5cHRvID0gc3RhdGljX2Nhc3Q8QU1lZGlhQ3J5cHRvV3JhcHBlciAqPihvYmpDcnlwdG8uZ2V0KCkpOwotICAgIC8vIG5vbi1lbmNyeXB0ZWQgc291cmNlIHdvbid0IGhhdmUgYSBjcnlwdG8KLSAgICBtSXNFbmNyeXB0ZWQgPSAoY3J5cHRvICE9IE5VTEwpOwotICAgIC8vIGNvbmZpZ3VyZSBpcyBjYWxsZWQgb25jZTsgc3RpbGwgdXNpbmcgT1IgaW4gY2FzZSB0aGUgYmVoYXZpb3IgY2hhbmdlcy4KLSAgICBtSXNFbmNyeXB0ZWRPYnNlcnZlZEVhcmxpZXIgPSBtSXNFbmNyeXB0ZWRPYnNlcnZlZEVhcmxpZXIgfHwgbUlzRW5jcnlwdGVkOwotICAgIEFMT0dWKCJvbkNvbmZpZ3VyZSBtQ3J5cHRvOiAlcCwgbUlzU2VjdXJlOiAlZCIsIGNyeXB0by5nZXQoKSwgbUlzU2VjdXJlKTsKLQotICAgIGVyciA9IG1Db2RlYy0+Y29uZmlndXJlKAotICAgICAgICAgICAgQU1lZGlhRm9ybWF0V3JhcHBlcjo6Q3JlYXRlKGZvcm1hdCksCi0gICAgICAgICAgICBtTmF0aXZlV2luZG93LAotICAgICAgICAgICAgY3J5cHRvLAotICAgICAgICAgICAgMCAvKiBmbGFncyAqLyk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29uZmlndXJlIFslc10gZGVjb2RlciAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7Ci0gICAgICAgIG1Db2RlYy0+cmVsZWFzZSgpOwotICAgICAgICBtQ29kZWMuY2xlYXIoKTsKLSAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICByZW1lbWJlckNvZGVjU3BlY2lmaWNEYXRhKGZvcm1hdCk7Ci0KLSAgICAvLyB0aGUgZm9sbG93aW5nIHNob3VsZCB3b3JrIGluIGNvbmZpZ3VyZWQgc3RhdGUKLSAgICBzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiBvdXRwdXRGb3JtYXQgPSBtQ29kZWMtPmdldE91dHB1dEZvcm1hdCgpOwotICAgIGlmIChvdXRwdXRGb3JtYXQgPT0gTlVMTCkgewotICAgICAgICBoYW5kbGVFcnJvcihJTlZBTElEX09QRVJBVElPTik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbUlucHV0Rm9ybWF0ID0gbUNvZGVjLT5nZXRJbnB1dEZvcm1hdCgpOwotICAgIGlmIChtSW5wdXRGb3JtYXQgPT0gTlVMTCkgewotICAgICAgICBoYW5kbGVFcnJvcihJTlZBTElEX09QRVJBVElPTik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtU3RhdHMtPnNldFN0cmluZygibWltZSIsIG1pbWUuY19zdHIoKSk7Ci0gICAgbVN0YXRzLT5zZXRTdHJpbmcoImNvbXBvbmVudC1uYW1lIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7Ci0KLSAgICBpZiAoIW1Jc0F1ZGlvKSB7Ci0gICAgICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICAgICAgaWYgKG91dHB1dEZvcm1hdC0+Z2V0SW50MzIoIndpZHRoIiwgJndpZHRoKQotICAgICAgICAgICAgICAgICYmIG91dHB1dEZvcm1hdC0+Z2V0SW50MzIoImhlaWdodCIsICZoZWlnaHQpKSB7Ci0gICAgICAgICAgICBtU3RhdHMtPnNldEludDMyKCJ3aWR0aCIsIHdpZHRoKTsKLSAgICAgICAgICAgIG1TdGF0cy0+c2V0SW50MzIoImhlaWdodCIsIGhlaWdodCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb2RlY05vdGlmeSwgdGhpcyk7Ci0gICAgbUNvZGVjLT5zZXRDYWxsYmFjayhyZXBseSk7Ci0KLSAgICBlcnIgPSBtQ29kZWMtPnN0YXJ0KCk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHN0YXJ0IFslc10gZGVjb2RlciAoZXJyPSVkKSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7Ci0gICAgICAgIG1Db2RlYy0+cmVsZWFzZSgpOwotICAgICAgICBtQ29kZWMuY2xlYXIoKTsKLSAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHJlbGVhc2VBbmRSZXNldE1lZGlhQnVmZmVycygpOwotCi0gICAgbVBhdXNlZCA9IGZhbHNlOwotICAgIG1SZXN1bWVQZW5kaW5nID0gZmFsc2U7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpvblNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpIHsKLSAgICBib29sIG5lZWRBZGp1c3RMYXllcnMgPSBmYWxzZTsKLSAgICBmbG9hdCBmcmFtZVJhdGVUb3RhbDsKLSAgICBpZiAocGFyYW1zLT5maW5kRmxvYXQoImZyYW1lLXJhdGUtdG90YWwiLCAmZnJhbWVSYXRlVG90YWwpCi0gICAgICAgICAgICAmJiBtRnJhbWVSYXRlVG90YWwgIT0gZnJhbWVSYXRlVG90YWwpIHsKLSAgICAgICAgbmVlZEFkanVzdExheWVycyA9IHRydWU7Ci0gICAgICAgIG1GcmFtZVJhdGVUb3RhbCA9IGZyYW1lUmF0ZVRvdGFsOwotICAgIH0KLQotICAgIGludDMyX3QgbnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWw7Ci0gICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJ0ZW1wb3JhbC1sYXllci1jb3VudCIsICZudW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCkKLSAgICAgICAgICAgICYmIG51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsID49IDAKLSAgICAgICAgICAgICYmIG51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsIDw9IGtNYXhOdW1WaWRlb1RlbXBvcmFsTGF5ZXJzCi0gICAgICAgICAgICAmJiBtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgIT0gbnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwpIHsKLSAgICAgICAgbmVlZEFkanVzdExheWVycyA9IHRydWU7Ci0gICAgICAgIG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCA9IHN0ZDo6bWF4KG51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsLCAxKTsKLSAgICB9Ci0KLSAgICBpZiAobmVlZEFkanVzdExheWVycyAmJiBtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgPiAxKSB7Ci0gICAgICAgIC8vIFRPRE86IEZvciBub3csIGxheWVyIGZwcyBpcyBjYWxjdWxhdGVkIGZvciBzb21lIHNwZWNpZmljIGFyY2hpdGVjdHVyZXMuCi0gICAgICAgIC8vIEJ1dCBpdCByZWFsbHkgc2hvdWxkIGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICAgIG1WaWRlb1RlbXBvcmFsTGF5ZXJBZ2dyZWdhdGVGcHNbMF0gPQotICAgICAgICAgICAgbUZyYW1lUmF0ZVRvdGFsIC8gKGZsb2F0KSgxTEwgPDwgKG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCAtIDEpKTsKLSAgICAgICAgZm9yIChpbnQzMl90IGkgPSAxOyBpIDwgbU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsOyArK2kpIHsKLSAgICAgICAgICAgIG1WaWRlb1RlbXBvcmFsTGF5ZXJBZ2dyZWdhdGVGcHNbaV0gPQotICAgICAgICAgICAgICAgIG1GcmFtZVJhdGVUb3RhbCAvIChmbG9hdCkoMUxMIDw8IChtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgLSBpKSkKLSAgICAgICAgICAgICAgICArIG1WaWRlb1RlbXBvcmFsTGF5ZXJBZ2dyZWdhdGVGcHNbaSAtIDFdOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgZmxvYXQgcGxheWJhY2tTcGVlZDsKLSAgICBpZiAocGFyYW1zLT5maW5kRmxvYXQoInBsYXliYWNrLXNwZWVkIiwgJnBsYXliYWNrU3BlZWQpCi0gICAgICAgICAgICAmJiBtUGxheWJhY2tTcGVlZCAhPSBwbGF5YmFja1NwZWVkKSB7Ci0gICAgICAgIG5lZWRBZGp1c3RMYXllcnMgPSB0cnVlOwotICAgICAgICBtUGxheWJhY2tTcGVlZCA9IHBsYXliYWNrU3BlZWQ7Ci0gICAgfQotCi0gICAgaWYgKG5lZWRBZGp1c3RMYXllcnMpIHsKLSAgICAgICAgZmxvYXQgZGVjb2RlRnJhbWVSYXRlID0gbUZyYW1lUmF0ZVRvdGFsOwotICAgICAgICAvLyBlbmFibGUgdGVtcG9yYWwgbGF5ZXJpbmcgb3B0aW1pemF0aW9uIG9ubHkgaWYgd2Uga25vdyB0aGUgbGF5ZXJpbmcgZGVwdGgKLSAgICAgICAgaWYgKG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbCA+IDEpIHsKLSAgICAgICAgICAgIGludDMyX3QgbGF5ZXJJZDsKLSAgICAgICAgICAgIGZvciAobGF5ZXJJZCA9IDA7IGxheWVySWQgPCBtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgLSAxOyArK2xheWVySWQpIHsKLSAgICAgICAgICAgICAgICBpZiAobVZpZGVvVGVtcG9yYWxMYXllckFnZ3JlZ2F0ZUZwc1tsYXllcklkXSAqIG1QbGF5YmFja1NwZWVkCi0gICAgICAgICAgICAgICAgICAgICAgICA+PSBrRGlzcGxheVJlZnJlc2hpbmdSYXRlICogMC45KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJBbGxvd2VkID0gbGF5ZXJJZCArIDE7Ci0gICAgICAgICAgICBkZWNvZGVGcmFtZVJhdGUgPSBtVmlkZW9UZW1wb3JhbExheWVyQWdncmVnYXRlRnBzW2xheWVySWRdOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJvblNldFBhcmFtZXRlcnM6IGFsbG93ZWQgbGF5ZXJzPSVkLCBkZWNvZGVGcHM9JWciLAotICAgICAgICAgICAgICAgIG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJBbGxvd2VkLCBkZWNvZGVGcmFtZVJhdGUpOwotCi0gICAgICAgIGlmIChtQ29kZWMgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1coIm9uU2V0UGFyYW1ldGVycyBjYWxsZWQgYmVmb3JlIGNvZGVjIGlzIGNyZWF0ZWQuIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBzcDxBTWVkaWFGb3JtYXRXcmFwcGVyPiBjb2RlY1BhcmFtcyA9IG5ldyBBTWVkaWFGb3JtYXRXcmFwcGVyKCk7Ci0gICAgICAgIGNvZGVjUGFyYW1zLT5zZXRGbG9hdCgib3BlcmF0aW5nLXJhdGUiLCBkZWNvZGVGcmFtZVJhdGUgKiBtUGxheWJhY2tTcGVlZCk7Ci0gICAgICAgIG1Db2RlYy0+c2V0UGFyYW1ldGVycyhjb2RlY1BhcmFtcyk7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6b25TZXRSZW5kZXJlcihjb25zdCBzcDxSZW5kZXJlcj4gJnJlbmRlcmVyKSB7Ci0gICAgbVJlbmRlcmVyID0gcmVuZGVyZXI7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpvblJlc3VtZShib29sIG5vdGlmeUNvbXBsZXRlKSB7Ci0gICAgbVBhdXNlZCA9IGZhbHNlOwotCi0gICAgaWYgKG5vdGlmeUNvbXBsZXRlKSB7Ci0gICAgICAgIG1SZXN1bWVQZW5kaW5nID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpZiAobUNvZGVjID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIlslc10gb25SZXN1bWUgd2l0aG91dCBhIHZhbGlkIGNvZGVjIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7Ci0gICAgICAgIGhhbmRsZUVycm9yKE5PX0lOSVQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1Db2RlYy0+c3RhcnQoKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OkRlY29kZXI6OmRvRmx1c2goYm9vbCBub3RpZnlDb21wbGV0ZSkgewotICAgIGlmIChtQ0NEZWNvZGVyICE9IE5VTEwpIHsKLSAgICAgICAgbUNDRGVjb2Rlci0+Zmx1c2goKTsKLSAgICB9Ci0KLSAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKLSAgICAgICAgbVJlbmRlcmVyLT5mbHVzaChtSXNBdWRpbywgbm90aWZ5Q29tcGxldGUpOwotICAgICAgICBtUmVuZGVyZXItPnNpZ25hbFRpbWVEaXNjb250aW51aXR5KCk7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgaWYgKG1Db2RlYyAhPSBOVUxMKSB7Ci0gICAgICAgIGVyciA9IG1Db2RlYy0+Zmx1c2goKTsKLSAgICAgICAgbUNTRHNUb1N1Ym1pdCA9IG1DU0RzRm9yQ3VycmVudEZvcm1hdDsgLy8gY29weSBvcGVyYXRvcgotICAgICAgICArK21CdWZmZXJHZW5lcmF0aW9uOwotICAgIH0KLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoImZhaWxlZCB0byBmbHVzaCBbJXNdIChlcnI9JWQpIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgZXJyKTsKLSAgICAgICAgaGFuZGxlRXJyb3IoZXJyKTsKLSAgICAgICAgLy8gZmluaXNoIHdpdGggcG9zdGluZyBrV2hhdEZsdXNoQ29tcGxldGVkLgotICAgICAgICAvLyB3ZSBhdHRlbXB0IHRvIHJlbGVhc2UgdGhlIGJ1ZmZlcnMgZXZlbiBpZiBmbHVzaCBmYWlscy4KLSAgICB9Ci0gICAgcmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCk7Ci0gICAgbVBhdXNlZCA9IHRydWU7Ci19Ci0KLQotdm9pZCBOdVBsYXllcjI6OkRlY29kZXI6Om9uRmx1c2goKSB7Ci0gICAgZG9GbHVzaCh0cnVlKTsKLQotICAgIGlmIChpc0Rpc2NvbnRpbnVpdHlQZW5kaW5nKCkpIHsKLSAgICAgICAgLy8gVGhpcyBjb3VsZCBoYXBwZW4gaWYgdGhlIGNsaWVudCBzdGFydHMgc2Vla2luZy9zaHV0ZG93bgotICAgICAgICAvLyBhZnRlciB3ZSBxdWV1ZWQgYW4gRU9TIGZvciBkaXNjb250aW51aXRpZXMuCi0gICAgICAgIC8vIFdlIGNhbiBjb25zaWRlciBkaXNjb250aW51aXR5IGhhbmRsZWQuCi0gICAgICAgIGZpbmlzaEhhbmRsZURpc2NvbnRpbnVpdHkoZmFsc2UgLyogZmx1c2hPblRpbWVDaGFuZ2UgKi8pOwotICAgIH0KLQotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRGbHVzaENvbXBsZXRlZCk7Ci0gICAgbm90aWZ5LT5wb3N0KCk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpvblNodXRkb3duKGJvb2wgbm90aWZ5Q29tcGxldGUpIHsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIC8vIGlmIHRoZXJlIGlzIGEgcGVuZGluZyByZXN1bWUgcmVxdWVzdCwgbm90aWZ5IGNvbXBsZXRlIG5vdwotICAgIG5vdGlmeVJlc3VtZUNvbXBsZXRlSWZOZWNlc3NhcnkoKTsKLQotICAgIGlmIChtQ29kZWMgIT0gTlVMTCkgewotICAgICAgICBlcnIgPSBtQ29kZWMtPnJlbGVhc2UoKTsKLSAgICAgICAgbUNvZGVjID0gTlVMTDsKLSAgICAgICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKLQotICAgICAgICBpZiAobU5hdGl2ZVdpbmRvdyAhPSBOVUxMICYmIG1OYXRpdmVXaW5kb3ctPmdldEFOYXRpdmVXaW5kb3coKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAvLyByZWNvbm5lY3QgdG8gc3VyZmFjZSBhcyBNZWRpYUNvZGVjIGRpc2Nvbm5lY3RlZCBmcm9tIGl0Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnJvciA9IG5hdGl2ZV93aW5kb3dfYXBpX2Nvbm5lY3QobU5hdGl2ZVdpbmRvdy0+Z2V0QU5hdGl2ZVdpbmRvdygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfQVBJX01FRElBKTsKLSAgICAgICAgICAgIEFMT0dXX0lGKGVycm9yICE9IE5PX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAiWyVzXSBmYWlsZWQgdG8gY29ubmVjdCB0byBuYXRpdmUgd2luZG93LCBlcnJvcj0lZCIsCi0gICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycm9yKTsKLSAgICAgICAgfQotICAgICAgICBtQ29tcG9uZW50TmFtZSA9ICJkZWNvZGVyIjsKLSAgICB9Ci0KLSAgICByZWxlYXNlQW5kUmVzZXRNZWRpYUJ1ZmZlcnMoKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoImZhaWxlZCB0byByZWxlYXNlIFslc10gKGVycj0lZCkiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBlcnIpOwotICAgICAgICBoYW5kbGVFcnJvcihlcnIpOwotICAgICAgICAvLyBmaW5pc2ggd2l0aCBwb3N0aW5nIGtXaGF0U2h1dGRvd25Db21wbGV0ZWQuCi0gICAgfQotCi0gICAgaWYgKG5vdGlmeUNvbXBsZXRlKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0U2h1dGRvd25Db21wbGV0ZWQpOwotICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICAgICAgbVBhdXNlZCA9IHRydWU7Ci0gICAgfQotfQotCi0vKgotICogcmV0dXJucyB0cnVlIGlmIHdlIHNob3VsZCByZXF1ZXN0IG1vcmUgZGF0YQotICovCi1ib29sIE51UGxheWVyMjo6RGVjb2Rlcjo6ZG9SZXF1ZXN0QnVmZmVycygpIHsKLSAgICBpZiAoaXNEaXNjb250aW51aXR5UGVuZGluZygpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgc3RhdHVzX3QgZXJyID0gT0s7Ci0gICAgd2hpbGUgKGVyciA9PSBPSyAmJiAhbURlcXVldWVkSW5wdXRCdWZmZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgc2l6ZV90IGJ1ZmZlckl4ID0gKm1EZXF1ZXVlZElucHV0QnVmZmVycy5iZWdpbigpOwotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7Ci0gICAgICAgIG1zZy0+c2V0U2l6ZSgiYnVmZmVyLWl4IiwgYnVmZmVySXgpOwotICAgICAgICBlcnIgPSBmZXRjaElucHV0RGF0YShtc2cpOwotICAgICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICAvLyBpZiBFT1MsIG5lZWQgdG8gcXVldWUgRU9TIGJ1ZmZlcgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbURlcXVldWVkSW5wdXRCdWZmZXJzLmVyYXNlKG1EZXF1ZXVlZElucHV0QnVmZmVycy5iZWdpbigpKTsKLQotICAgICAgICBpZiAoIW1QZW5kaW5nSW5wdXRNZXNzYWdlcy5lbXB0eSgpCi0gICAgICAgICAgICAgICAgfHwgIW9uSW5wdXRCdWZmZXJGZXRjaGVkKG1zZykpIHsKLSAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRNZXNzYWdlcy5wdXNoX2JhY2sobXNnKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnIgPT0gLUVXT1VMREJMT0NLCi0gICAgICAgICAgICAmJiBtU291cmNlLT5mZWVkTW9yZVRTRGF0YSgpID09IE9LOwotfQotCi12b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6aGFuZGxlRXJyb3IoaW50MzJfdCBlcnIpCi17Ci0gICAgLy8gV2UgY2Fubm90IGltbWVkaWF0ZWx5IHJlbGVhc2UgdGhlIGNvZGVjIGR1ZSB0byBidWZmZXJzIHN0aWxsIG91dHN0YW5kaW5nCi0gICAgLy8gaW4gdGhlIHJlbmRlcmVyLiAgV2Ugc2lnbmFsIHRvIHRoZSBwbGF5ZXIgdGhlIGVycm9yIHNvIGl0IGNhbiBzaHV0ZG93bi9yZWxlYXNlIHRoZQotICAgIC8vIGRlY29kZXIgYWZ0ZXIgZmx1c2hpbmcgYW5kIGluY3JlbWVudCB0aGUgZ2VuZXJhdGlvbiB0byBkaXNjYXJkIHVubmVjZXNzYXJ5IG1lc3NhZ2VzLgotCi0gICAgKyttQnVmZmVyR2VuZXJhdGlvbjsKLQotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRFcnJvcik7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICBub3RpZnktPnBvc3QoKTsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyOjpEZWNvZGVyOjpyZWxlYXNlQ3J5cHRvKCkKLXsKLSAgICBBTE9HVigicmVsZWFzZUNyeXB0byIpOwotCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERybVJlbGVhc2VDcnlwdG8sIHRoaXMpOwotCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLSAgICBpZiAoc3RhdHVzID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKLSAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigic3RhdHVzIiwgJnN0YXR1cykpOwotICAgICAgICBBTE9HVigicmVsZWFzZUNyeXB0byByZXQ6ICVkICIsIHN0YXR1cyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoInJlbGVhc2VDcnlwdG8gZXJyOiAlZCIsIHN0YXR1cyk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotdm9pZCBOdVBsYXllcjI6OkRlY29kZXI6Om9uUmVsZWFzZUNyeXB0byhjb25zdCBzcDxBTWVzc2FnZT4mIG1zZykKLXsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICBpZiAobUNvZGVjICE9IE5VTEwpIHsKLSAgICAgICAgc3RhdHVzID0gbUNvZGVjLT5yZWxlYXNlQ3J5cHRvKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgLy8gcmV0dXJuaW5nIE9LIGlmIHRoZSBjb2RlYyBoYXMgYmVlbiBhbHJlYWR5IHJlbGVhc2VkCi0gICAgICAgIHN0YXR1cyA9IE9LOwotICAgICAgICBBTE9HRSgib25SZWxlYXNlQ3J5cHRvIE5vIG1Db2RlYy4gZXJyOiAlZCIsIHN0YXR1cyk7Ci0gICAgfQotCi0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgIHJlc3BvbnNlLT5zZXRJbnQzMigic3RhdHVzIiwgc3RhdHVzKTsKLSAgICAvLyBDbGVhcmluZyB0aGUgc3RhdGUgYXMgaXQncyB0aWVkIHRvIGNyeXB0by4gbUlzRW5jcnlwdGVkT2JzZXJ2ZWRFYXJsaWVyIGlzIHN0aWNreSB0aG91Z2gKLSAgICAvLyBhbmQgbGFzdHMgZm9yIHRoZSBsaWZldGltZSBvZiB0aGlzIGNvZGVjLiBTZWUgaXRzIHVzZSBpbiBmZXRjaElucHV0RGF0YS4KLSAgICBtSXNFbmNyeXB0ZWQgPSBmYWxzZTsKLQotICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKLSAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotfQotCi1ib29sIE51UGxheWVyMjo6RGVjb2Rlcjo6aGFuZGxlQW5JbnB1dEJ1ZmZlcihzaXplX3QgaW5kZXgpIHsKLSAgICBpZiAoaXNEaXNjb250aW51aXR5UGVuZGluZygpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAobUNvZGVjID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIlslc10gaGFuZGxlQW5JbnB1dEJ1ZmZlciB3aXRob3V0IGEgdmFsaWQgY29kZWMiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKLSAgICAgICAgaGFuZGxlRXJyb3IoTk9fSU5JVCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IDA7Ci0gICAgdWludDhfdCAqYnVmZmVyQmFzZSA9IG1Db2RlYy0+Z2V0SW5wdXRCdWZmZXIoaW5kZXgsICZidWZmZXJTaXplKTsKLQotICAgIGlmIChidWZmZXJCYXNlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIlslc10gaGFuZGxlQW5JbnB1dEJ1ZmZlciwgZmFpbGVkIHRvIGdldCBpbnB1dCBidWZmZXIiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKLSAgICAgICAgaGFuZGxlRXJyb3IoVU5LTk9XTl9FUlJPUik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXIgPQotICAgICAgICBuZXcgTWVkaWFDb2RlY0J1ZmZlcihOVUxMIC8qIGZvcm1hdCAqLywgbmV3IEFCdWZmZXIoYnVmZmVyQmFzZSwgYnVmZmVyU2l6ZSkpOwotCi0gICAgaWYgKGluZGV4ID49IG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSBtSW5wdXRCdWZmZXJzLnNpemUoKTsgaSA8PSBpbmRleDsgKytpKSB7Ci0gICAgICAgICAgICBtSW5wdXRCdWZmZXJzLmFkZCgpOwotICAgICAgICAgICAgbU1lZGlhQnVmZmVycy5hZGQoKTsKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuYWRkKCk7Ci0gICAgICAgICAgICBtTWVkaWFCdWZmZXJzLmVkaXRJdGVtQXQoaSkgPSBOVUxMOwotICAgICAgICAgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5lZGl0SXRlbUF0KGkpID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbUlucHV0QnVmZmVycy5lZGl0SXRlbUF0KGluZGV4KSA9IGJ1ZmZlcjsKLQotICAgIC8vQ0hFQ0tfTFQoYnVmZmVySXgsIG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKLQotICAgIGlmIChtTWVkaWFCdWZmZXJzW2luZGV4XSAhPSBOVUxMKSB7Ci0gICAgICAgIG1NZWRpYUJ1ZmZlcnNbaW5kZXhdLT5yZWxlYXNlKCk7Ci0gICAgICAgIG1NZWRpYUJ1ZmZlcnMuZWRpdEl0ZW1BdChpbmRleCkgPSBOVUxMOwotICAgIH0KLSAgICBtSW5wdXRCdWZmZXJJc0RlcXVldWVkLmVkaXRJdGVtQXQoaW5kZXgpID0gdHJ1ZTsKLQotICAgIGlmICghbUNTRHNUb1N1Ym1pdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOwotICAgICAgICBtc2ctPnNldFNpemUoImJ1ZmZlci1peCIsIGluZGV4KTsKLQotICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBtQ1NEc1RvU3VibWl0Lml0ZW1BdCgwKTsKLSAgICAgICAgQUxPR0koIlslc10gcmVzdWJtaXR0aW5nIENTRCIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOwotICAgICAgICBtc2ctPnNldEJ1ZmZlcigiYnVmZmVyIiwgYnVmZmVyKTsKLSAgICAgICAgbUNTRHNUb1N1Ym1pdC5yZW1vdmVBdCgwKTsKLSAgICAgICAgaWYgKCFvbklucHV0QnVmZmVyRmV0Y2hlZChtc2cpKSB7Ci0gICAgICAgICAgICBoYW5kbGVFcnJvcihVTktOT1dOX0VSUk9SKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICB3aGlsZSAoIW1QZW5kaW5nSW5wdXRNZXNzYWdlcy5lbXB0eSgpKSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSAqbVBlbmRpbmdJbnB1dE1lc3NhZ2VzLmJlZ2luKCk7Ci0gICAgICAgIGlmICghb25JbnB1dEJ1ZmZlckZldGNoZWQobXNnKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbVBlbmRpbmdJbnB1dE1lc3NhZ2VzLmVyYXNlKG1QZW5kaW5nSW5wdXRNZXNzYWdlcy5iZWdpbigpKTsKLSAgICB9Ci0KLSAgICBpZiAoIW1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuZWRpdEl0ZW1BdChpbmRleCkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgbURlcXVldWVkSW5wdXRCdWZmZXJzLnB1c2hfYmFjayhpbmRleCk7Ci0KLSAgICBvblJlcXVlc3RJbnB1dEJ1ZmZlcnMoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBOdVBsYXllcjI6OkRlY29kZXI6OmhhbmRsZUFuT3V0cHV0QnVmZmVyKAotICAgICAgICBzaXplX3QgaW5kZXgsCi0gICAgICAgIHNpemVfdCBvZmZzZXQsCi0gICAgICAgIHNpemVfdCBzaXplLAotICAgICAgICBpbnQ2NF90IHRpbWVVcywKLSAgICAgICAgaW50MzJfdCBmbGFncykgewotICAgIGlmIChtQ29kZWMgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiWyVzXSBoYW5kbGVBbk91dHB1dEJ1ZmZlciB3aXRob3V0IGEgdmFsaWQgY29kZWMiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKLSAgICAgICAgaGFuZGxlRXJyb3IoTk9fSU5JVCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLS8vICAgIENIRUNLX0xUKGJ1ZmZlckl4LCBtT3V0cHV0QnVmZmVycy5zaXplKCkpOwotCi0gICAgc2l6ZV90IGJ1ZmZlclNpemUgPSAwOwotICAgIHVpbnQ4X3QgKmJ1ZmZlckJhc2UgPSBtQ29kZWMtPmdldE91dHB1dEJ1ZmZlcihpbmRleCwgJmJ1ZmZlclNpemUpOwotCi0gICAgaWYgKGJ1ZmZlckJhc2UgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiWyVzXSBoYW5kbGVBbk91dHB1dEJ1ZmZlciwgZmFpbGVkIHRvIGdldCBvdXRwdXQgYnVmZmVyIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7Ci0gICAgICAgIGhhbmRsZUVycm9yKFVOS05PV05fRVJST1IpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyID0KLSAgICAgICAgbmV3IE1lZGlhQ29kZWNCdWZmZXIoTlVMTCAvKiBmb3JtYXQgKi8sIG5ldyBBQnVmZmVyKGJ1ZmZlckJhc2UsIGJ1ZmZlclNpemUpKTsKLQotICAgIGlmIChpbmRleCA+PSBtT3V0cHV0QnVmZmVycy5zaXplKCkpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IG1PdXRwdXRCdWZmZXJzLnNpemUoKTsgaSA8PSBpbmRleDsgKytpKSB7Ci0gICAgICAgICAgICBtT3V0cHV0QnVmZmVycy5hZGQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIG1PdXRwdXRCdWZmZXJzLmVkaXRJdGVtQXQoaW5kZXgpID0gYnVmZmVyOwotCi0gICAgYnVmZmVyLT5zZXRSYW5nZShvZmZzZXQsIHNpemUpOwotICAgIGJ1ZmZlci0+bWV0YSgpLT5jbGVhcigpOwotICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQ2NCgidGltZVVzIiwgdGltZVVzKTsKLQotICAgIGJvb2wgZW9zID0gZmxhZ3MgJiBBTUVESUFDT0RFQ19CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNOwotICAgIC8vIHdlIGRvIG5vdCBleHBlY3QgQ09ERUNDT05GSUcgb3IgU1lOQ0ZSQU1FIGZvciBkZWNvZGVyCi0KLSAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZW5kZXJCdWZmZXIsIHRoaXMpOwotICAgIHJlcGx5LT5zZXRTaXplKCJidWZmZXItaXgiLCBpbmRleCk7Ci0gICAgcmVwbHktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUJ1ZmZlckdlbmVyYXRpb24pOwotCi0gICAgaWYgKGVvcykgewotICAgICAgICBBTE9HSSgiWyVzXSBzYXcgb3V0cHV0IEVPUyIsIG1Jc0F1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwotCi0gICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZW9zIiwgdHJ1ZSk7Ci0gICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZW9zIiwgdHJ1ZSk7Ci0gICAgfQotCi0gICAgbU51bUZyYW1lc1RvdGFsICs9ICFtSXNBdWRpbzsKLQotICAgIGlmIChtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMgPj0gMCkgewotICAgICAgICBpZiAodGltZVVzIDwgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzKSB7Ci0gICAgICAgICAgICBBTE9HVigiWyVzXSBkcm9wcGluZyBidWZmZXIgYXQgdGltZSAlbGxkIGFzIHJlcXVlc3RlZC4iLAotICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgKGxvbmcgbG9uZyl0aW1lVXMpOwotCi0gICAgICAgICAgICByZXBseS0+cG9zdCgpOwotICAgICAgICAgICAgaWYgKGVvcykgewotICAgICAgICAgICAgICAgIG5vdGlmeVJlc3VtZUNvbXBsZXRlSWZOZWNlc3NhcnkoKTsKLSAgICAgICAgICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwgJiYgIWlzRGlzY29udGludWl0eVBlbmRpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBtUmVuZGVyZXItPnF1ZXVlRU9TKG1Jc0F1ZGlvLCBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcyA9IC0xOwotICAgIH0KLQotICAgIC8vIHdhaXQgdW50aWwgMXN0IGZyYW1lIGNvbWVzIG91dCB0byBzaWduYWwgcmVzdW1lIGNvbXBsZXRlCi0gICAgbm90aWZ5UmVzdW1lQ29tcGxldGVJZk5lY2Vzc2FyeSgpOwotCi0gICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIHNlbmQgdGhlIGJ1ZmZlciB0byByZW5kZXJlci4KLSAgICAgICAgbVJlbmRlcmVyLT5xdWV1ZUJ1ZmZlcihtSXNBdWRpbywgYnVmZmVyLCByZXBseSk7Ci0gICAgICAgIGlmIChlb3MgJiYgIWlzRGlzY29udGludWl0eVBlbmRpbmcoKSkgewotICAgICAgICAgICAgbVJlbmRlcmVyLT5xdWV1ZUVPUyhtSXNBdWRpbywgRVJST1JfRU5EX09GX1NUUkVBTSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OkRlY29kZXI6OmhhbmRsZU91dHB1dEZvcm1hdENoYW5nZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgewotICAgIGlmICghbUlzQXVkaW8pIHsKLSAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKQotICAgICAgICAgICAgICAgICYmIGZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgewotICAgICAgICAgICAgbVN0YXRzLT5zZXRJbnQzMigid2lkdGgiLCB3aWR0aCk7Ci0gICAgICAgICAgICBtU3RhdHMtPnNldEludDMyKCJoZWlnaHQiLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0VmlkZW9TaXplQ2hhbmdlZCk7Ci0gICAgICAgIG5vdGlmeS0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKLSAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgfSBlbHNlIGlmIChtUmVuZGVyZXIgIT0gTlVMTCkgewotICAgICAgICB1aW50MzJfdCBmbGFnczsKLSAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICBib29sIGhhc1ZpZGVvID0gKG1Tb3VyY2UtPmdldEZvcm1hdChmYWxzZSAvKiBhdWRpbyAqLykgIT0gTlVMTCk7Ci0gICAgICAgIGlmIChnZXRBdWRpb0RlZXBCdWZmZXJTZXR0aW5nKCkgLy8gb3ZlcnJpZGUgcmVnYXJkbGVzcyBvZiBzb3VyY2UgZHVyYXRpb24KLSAgICAgICAgICAgICAgICB8fCAobVNvdXJjZS0+Z2V0RHVyYXRpb24oJmR1cmF0aW9uVXMpID09IE9LCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBkdXJhdGlvblVzID4gQVVESU9fU0lOS19NSU5fREVFUF9CVUZGRVJfRFVSQVRJT05fVVMpKSB7Ci0gICAgICAgICAgICBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOwotICAgICAgICB9Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IHJlcGx5ID0gbmV3IEFNZXNzYWdlKGtXaGF0QXVkaW9PdXRwdXRGb3JtYXRDaGFuZ2VkLCB0aGlzKTsKLSAgICAgICAgcmVwbHktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUJ1ZmZlckdlbmVyYXRpb24pOwotICAgICAgICBtUmVuZGVyZXItPmNoYW5nZUF1ZGlvRm9ybWF0KAotICAgICAgICAgICAgICAgIGZvcm1hdCwgZmFsc2UgLyogb2ZmbG9hZE9ubHkgKi8sIGhhc1ZpZGVvLAotICAgICAgICAgICAgICAgIGZsYWdzLCBtU291cmNlLT5pc1N0cmVhbWluZygpLCByZXBseSk7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMjo6RGVjb2Rlcjo6cmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCkgewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU1lZGlhQnVmZmVycy5zaXplKCk7IGkrKykgewotICAgICAgICBpZiAobU1lZGlhQnVmZmVyc1tpXSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtTWVkaWFCdWZmZXJzW2ldLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBtTWVkaWFCdWZmZXJzLmVkaXRJdGVtQXQoaSkgPSBOVUxMOwotICAgICAgICB9Ci0gICAgfQotICAgIG1NZWRpYUJ1ZmZlcnMucmVzaXplKG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1NZWRpYUJ1ZmZlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbU1lZGlhQnVmZmVycy5lZGl0SXRlbUF0KGkpID0gTlVMTDsKLSAgICB9Ci0gICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5jbGVhcigpOwotICAgIG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQucmVzaXplKG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dEJ1ZmZlcklzRGVxdWV1ZWQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5lZGl0SXRlbUF0KGkpID0gZmFsc2U7Ci0gICAgfQotCi0gICAgbVBlbmRpbmdJbnB1dE1lc3NhZ2VzLmNsZWFyKCk7Ci0gICAgbURlcXVldWVkSW5wdXRCdWZmZXJzLmNsZWFyKCk7Ci0gICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID0gLTE7Ci19Ci0KLWJvb2wgTnVQbGF5ZXIyOjpEZWNvZGVyOjppc1N0YWxlUmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBpbnQzMl90IGdlbmVyYXRpb247Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOwotICAgIHJldHVybiBnZW5lcmF0aW9uICE9IG1CdWZmZXJHZW5lcmF0aW9uOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjI6OkRlY29kZXI6OmZldGNoSW5wdXREYXRhKHNwPEFNZXNzYWdlPiAmcmVwbHkpIHsKLSAgICBzcDxBQnVmZmVyPiBhY2Nlc3NVbml0OwotICAgIGJvb2wgZHJvcEFjY2Vzc1VuaXQgPSB0cnVlOwotICAgIGRvIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbVNvdXJjZS0+ZGVxdWV1ZUFjY2Vzc1VuaXQobUlzQXVkaW8sICZhY2Nlc3NVbml0KTsKLQotICAgICAgICBpZiAoZXJyID09IC1FV09VTERCTE9DSykgewotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19ESVNDT05USU5VSVRZKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlOwotICAgICAgICAgICAgICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJnR5cGUpKTsKLQotICAgICAgICAgICAgICAgIGJvb2wgZm9ybWF0Q2hhbmdlID0KLSAgICAgICAgICAgICAgICAgICAgKG1Jc0F1ZGlvICYmCi0gICAgICAgICAgICAgICAgICAgICAodHlwZSAmIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9BVURJT19GT1JNQVQpKQotICAgICAgICAgICAgICAgICAgICB8fCAoIW1Jc0F1ZGlvICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgJiBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfVklERU9fRk9STUFUKSk7Ci0KLSAgICAgICAgICAgICAgICBib29sIHRpbWVDaGFuZ2UgPSAodHlwZSAmIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9USU1FKSAhPSAwOwotCi0gICAgICAgICAgICAgICAgQUxPR0koIiVzIGRpc2NvbnRpbnVpdHkgKGZvcm1hdD0lZCwgdGltZT0lZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwgZm9ybWF0Q2hhbmdlLCB0aW1lQ2hhbmdlKTsKLQotICAgICAgICAgICAgICAgIGJvb2wgc2VhbWxlc3NGb3JtYXRDaGFuZ2UgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbmV3Rm9ybWF0ID0gbVNvdXJjZS0+Z2V0Rm9ybWF0KG1Jc0F1ZGlvKTsKLSAgICAgICAgICAgICAgICBpZiAoZm9ybWF0Q2hhbmdlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNlYW1sZXNzRm9ybWF0Q2hhbmdlID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzU2VhbWxlc3NGb3JtYXRDaGFuZ2UobmV3Rm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gdHJlYXQgc2VhbWxlc3MgZm9ybWF0IGNoYW5nZSBzZXBhcmF0ZWx5Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdENoYW5nZSA9ICFzZWFtbGVzc0Zvcm1hdENoYW5nZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBGb3IgZm9ybWF0IG9yIHRpbWUgY2hhbmdlLCByZXR1cm4gRU9TIHRvIHF1ZXVlIEVPUyBpbnB1dCwKLSAgICAgICAgICAgICAgICAvLyB0aGVuIHdhaXQgZm9yIEVPUyBvbiBvdXRwdXQuCi0gICAgICAgICAgICAgICAgaWYgKGZvcm1hdENoYW5nZSAvKiBub3Qgc2VhbWxlc3MgKi8pIHsKLSAgICAgICAgICAgICAgICAgICAgbUZvcm1hdENoYW5nZVBlbmRpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBlcnIgPSBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodGltZUNoYW5nZSkgewotICAgICAgICAgICAgICAgICAgICByZW1lbWJlckNvZGVjU3BlY2lmaWNEYXRhKG5ld0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIG1UaW1lQ2hhbmdlUGVuZGluZyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzZWFtbGVzc0Zvcm1hdENoYW5nZSkgewotICAgICAgICAgICAgICAgICAgICAvLyByZXVzZSBleGlzdGluZyBkZWNvZGVyIGFuZCBkb24ndCBmbHVzaAotICAgICAgICAgICAgICAgICAgICByZW1lbWJlckNvZGVjU3BlY2lmaWNEYXRhKG5ld0Zvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgc3RyZWFtIGlzIHVuYWZmZWN0ZWQgYnkgdGhlIGRpc2NvbnRpbnVpdHkKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIHJlcGx5IHNob3VsZCBvbmx5IGJlIHJldHVybmVkIHdpdGhvdXQgYSBidWZmZXIgc2V0Ci0gICAgICAgICAgICAvLyB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIChpbmNsdWRpbmcgRU9TKQotICAgICAgICAgICAgQ0hFQ0soZXJyICE9IE9LKTsKLQotICAgICAgICAgICAgcmVwbHktPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgICAgIH0KLQotICAgICAgICBkcm9wQWNjZXNzVW5pdCA9IGZhbHNlOwotICAgICAgICBpZiAoIW1Jc0F1ZGlvICYmICFtSXNFbmNyeXB0ZWQpIHsKLSAgICAgICAgICAgIC8vIEV4dHJhIHNhZmVndWFyZCBpZiBoaWdoZXItbGV2ZWwgYmVoYXZpb3IgY2hhbmdlcy4gT3RoZXJ3aXNlLCBub3QgcmVxdWlyZWQgbm93LgotICAgICAgICAgICAgLy8gUHJldmVudGluZyB0aGUgYnVmZmVyIGZyb20gYmVpbmcgcHJvY2Vzc2VkIChhbmQgc2VudCB0byBjb2RlYykgaWYgdGhpcyBpcyBhIGxhdGVyCi0gICAgICAgICAgICAvLyByb3VuZCBvZiBwbGF5YmFjayBidXQgdGhpcyB0aW1lIHdpdGhvdXQgcHJlcGFyZURybS4gT3IgaWYgdGhlcmUgaXMgYSByYWNlIGJldHdlZW4KLSAgICAgICAgICAgIC8vIHN0b3AgKHdoaWNoIGlzIG5vdCBibG9ja2luZykgYW5kIHJlbGVhc2VEcm0gYWxsb3dpbmcgYnVmZmVycyBiZWluZyBwcm9jZXNzZWQgYWZ0ZXIKLSAgICAgICAgICAgIC8vIENyeXB0byBoYXMgYmVlbiByZWxlYXNlZCAoR2VuZXJpY1NvdXJjZSBjdXJyZW50bHkgcHJldmVudHMgdGhpcyByYWNlIHRob3VnaCkuCi0gICAgICAgICAgICAvLyBQYXJ0aWN1bGFybHkgZG9pbmcgdGhpcyBjaGVjayBiZWZvcmUgSXNBVkNSZWZlcmVuY2VGcmFtZSBjYWxsIHRvIHByZXZlbnQgcGFyc2luZwotICAgICAgICAgICAgLy8gb2YgZW5jcnlwdGVkIGRhdGEuCi0gICAgICAgICAgICBpZiAobUlzRW5jcnlwdGVkT2JzZXJ2ZWRFYXJsaWVyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImZldGNoSW5wdXREYXRhOiBtaXNtYXRjaGVkIG1Jc0VuY3J5cHRlZC9tSXNFbmNyeXB0ZWRPYnNlcnZlZEVhcmxpZXIgKDAvMSkiKTsKLQotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50MzJfdCBsYXllcklkID0gMDsKLSAgICAgICAgICAgIGJvb2wgaGF2ZUxheWVySWQgPSBhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQzMigidGVtcG9yYWwtbGF5ZXItaWQiLCAmbGF5ZXJJZCk7Ci0gICAgICAgICAgICBpZiAobVJlbmRlcmVyLT5nZXRWaWRlb0xhdGVCeVVzKCkgPiAxMDAwMDBMTAotICAgICAgICAgICAgICAgICAgICAmJiBtSXNWaWRlb0FWQwotICAgICAgICAgICAgICAgICAgICAmJiAhSXNBVkNSZWZlcmVuY2VGcmFtZShhY2Nlc3NVbml0KSkgewotICAgICAgICAgICAgICAgIGRyb3BBY2Nlc3NVbml0ID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaGF2ZUxheWVySWQgJiYgbU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsID4gMSkgewotICAgICAgICAgICAgICAgIC8vIEFkZCBvbmx5IG9uZSBsYXllciBlYWNoIHRpbWUuCi0gICAgICAgICAgICAgICAgaWYgKGxheWVySWQgPiBtQ3VycmVudE1heFZpZGVvVGVtcG9yYWxMYXllcklkICsgMQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbGF5ZXJJZCA+PSBtTnVtVmlkZW9UZW1wb3JhbExheWVyQWxsb3dlZCkgewotICAgICAgICAgICAgICAgICAgICBkcm9wQWNjZXNzVW5pdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJkcm9wcGluZyBsYXllciglZCksIHNwZWVkPSVnLCBhbGxvd2VkIGxheWVyIGNvdW50PSVkLCBtYXggbGF5ZXJJZD0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJJZCwgbVBsYXliYWNrU3BlZWQsIG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJBbGxvd2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TWF4VmlkZW9UZW1wb3JhbExheWVySWQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobGF5ZXJJZCA+IG1DdXJyZW50TWF4VmlkZW9UZW1wb3JhbExheWVySWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRNYXhWaWRlb1RlbXBvcmFsTGF5ZXJJZCA9IGxheWVySWQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXllcklkID09IDAgJiYgbU51bVZpZGVvVGVtcG9yYWxMYXllclRvdGFsID4gMQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgSXNJRFIoYWNjZXNzVW5pdC0+ZGF0YSgpLCBhY2Nlc3NVbml0LT5zaXplKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50TWF4VmlkZW9UZW1wb3JhbExheWVySWQgPSBtTnVtVmlkZW9UZW1wb3JhbExheWVyVG90YWwgLSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkcm9wQWNjZXNzVW5pdCkgewotICAgICAgICAgICAgICAgIGlmIChsYXllcklkIDw9IG1DdXJyZW50TWF4VmlkZW9UZW1wb3JhbExheWVySWQgJiYgbGF5ZXJJZCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRNYXhWaWRlb1RlbXBvcmFsTGF5ZXJJZCA9IGxheWVySWQgLSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICArK21OdW1JbnB1dEZyYW1lc0Ryb3BwZWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IHdoaWxlIChkcm9wQWNjZXNzVW5pdCk7Ci0KLSAgICAvLyBBTE9HVigicmV0dXJuZWQgYSB2YWxpZCBidWZmZXIgb2YgJXMgZGF0YSIsIG1Jc0F1ZGlvID8gIm1Jc0F1ZGlvIiA6ICJ2aWRlbyIpOwotI2lmIDAKLSAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwotICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKLSAgICBBTE9HVigiWyVzXSBmZWVkaW5nIGlucHV0IGJ1ZmZlciBhdCBtZWRpYSB0aW1lICUuM2YiLAotICAgICAgICAgbUlzQXVkaW8gPyAiYXVkaW8iIDogInZpZGVvIiwKLSAgICAgICAgIG1lZGlhVGltZVVzIC8gMUU2KTsKLSNlbmRpZgotCi0gICAgaWYgKG1DQ0RlY29kZXIgIT0gTlVMTCkgewotICAgICAgICBtQ0NEZWNvZGVyLT5kZWNvZGUoYWNjZXNzVW5pdCk7Ci0gICAgfQotCi0gICAgcmVwbHktPnNldEJ1ZmZlcigiYnVmZmVyIiwgYWNjZXNzVW5pdCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLWJvb2wgTnVQbGF5ZXIyOjpEZWNvZGVyOjpvbklucHV0QnVmZmVyRmV0Y2hlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIGlmIChtQ29kZWMgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiWyVzXSBvbklucHV0QnVmZmVyRmV0Y2hlZCB3aXRob3V0IGEgdmFsaWQgY29kZWMiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKLSAgICAgICAgaGFuZGxlRXJyb3IoTk9fSU5JVCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzaXplX3QgYnVmZmVySXg7Ci0gICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgiYnVmZmVyLWl4IiwgJmJ1ZmZlckl4KSk7Ci0gICAgQ0hFQ0tfTFQoYnVmZmVySXgsIG1JbnB1dEJ1ZmZlcnMuc2l6ZSgpKTsKLSAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBjb2RlY0J1ZmZlciA9IG1JbnB1dEJ1ZmZlcnNbYnVmZmVySXhdOwotCi0gICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOwotICAgIGJvb2wgaGFzQnVmZmVyID0gbXNnLT5maW5kQnVmZmVyKCJidWZmZXIiLCAmYnVmZmVyKTsKLSAgICBib29sIG5lZWRzQ29weSA9IHRydWU7Ci0KLSAgICBpZiAoYnVmZmVyID09IE5VTEwgLyogaW5jbHVkZXMgIWhhc0J1ZmZlciAqLykgewotICAgICAgICBpbnQzMl90IHN0cmVhbUVyciA9IEVSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJlcnIiLCAmc3RyZWFtRXJyKSB8fCAhaGFzQnVmZmVyKTsKLQotICAgICAgICBDSEVDSyhzdHJlYW1FcnIgIT0gT0spOwotCi0gICAgICAgIC8vIGF0dGVtcHQgdG8gcXVldWUgRU9TCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1Db2RlYy0+cXVldWVJbnB1dEJ1ZmZlcigKLSAgICAgICAgICAgICAgICBidWZmZXJJeCwKLSAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgIDAsCi0gICAgICAgICAgICAgICAgMCwKLSAgICAgICAgICAgICAgICBBTUVESUFDT0RFQ19CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNKTsKLSAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5lZGl0SXRlbUF0KGJ1ZmZlckl4KSA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmVhbUVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICBzdHJlYW1FcnIgPSBlcnI7Ci0gICAgICAgICAgICAvLyBlcnIgd2lsbCBub3QgYmUgRVJST1JfRU5EX09GX1NUUkVBTQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHN0cmVhbUVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7Ci0gICAgICAgICAgICBBTE9HRSgiU3RyZWFtIGVycm9yIGZvciBbJXNdIChlcnI9JWQpLCBFT1MgJXMgcXVldWVkIiwKLSAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtRXJyLAotICAgICAgICAgICAgICAgICAgICBlcnIgPT0gT0sgPyAic3VjY2Vzc2Z1bGx5IiA6ICJ1bnN1Y2Nlc3NmdWxseSIpOwotICAgICAgICAgICAgaGFuZGxlRXJyb3Ioc3RyZWFtRXJyKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBleHRyYTsKLSAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kTWVzc2FnZSgiZXh0cmEiLCAmZXh0cmEpICYmIGV4dHJhICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGludDY0X3QgcmVzdW1lQXRNZWRpYVRpbWVVczsKLSAgICAgICAgICAgIGlmIChleHRyYS0+ZmluZEludDY0KAotICAgICAgICAgICAgICAgICAgICAgICAgInJlc3VtZS1hdC1tZWRpYVRpbWVVcyIsICZyZXN1bWVBdE1lZGlhVGltZVVzKSkgewotICAgICAgICAgICAgICAgIEFMT0dJKCJbJXNdIHN1cHByZXNzaW5nIHJlbmRlcmluZyB1bnRpbCAlbGxkIHVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpcmVzdW1lQXRNZWRpYVRpbWVVcyk7Ci0gICAgICAgICAgICAgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID0gcmVzdW1lQXRNZWRpYVRpbWVVczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludDY0X3QgdGltZVVzID0gMDsKLSAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwotICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKSk7Ci0KLSAgICAgICAgaW50MzJfdCBlb3MsIGNzZDsKLSAgICAgICAgLy8gd2UgZG8gbm90IGV4cGVjdCBTWU5DRlJBTUUgZm9yIGRlY29kZXIKLSAgICAgICAgaWYgKGJ1ZmZlci0+bWV0YSgpLT5maW5kSW50MzIoImVvcyIsICZlb3MpICYmIGVvcykgewotICAgICAgICAgICAgZmxhZ3MgfD0gQU1FRElBQ09ERUNfQlVGRkVSX0ZMQUdfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgfSBlbHNlIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjc2QiLCAmY3NkKSAmJiBjc2QpIHsKLSAgICAgICAgICAgIGZsYWdzIHw9IEFNRURJQUNPREVDX0JVRkZFUl9GTEFHX0NPREVDX0NPTkZJRzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqbWVkaWFCdWYgPSBOVUxMOwotICAgICAgICBzcDxBTWVkaWFDb2RlY0NyeXB0b0luZm9XcmFwcGVyPiBjcnlwdEluZm87Ci0KLSAgICAgICAgLy8gY29weSBpbnRvIGNvZGVjIGJ1ZmZlcgotICAgICAgICBpZiAobmVlZHNDb3B5KSB7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyLT5zaXplKCkgPiBjb2RlY0J1ZmZlci0+Y2FwYWNpdHkoKSkgewotICAgICAgICAgICAgICAgIGhhbmRsZUVycm9yKEVSUk9SX0JVRkZFUl9UT09fU01BTEwpOwotICAgICAgICAgICAgICAgIG1EZXF1ZXVlZElucHV0QnVmZmVycy5wdXNoX2JhY2soYnVmZmVySXgpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBjb2RlY0J1ZmZlci0+c2V0UmFuZ2UoMCwgYnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgICAgIG1lbWNweShjb2RlY0J1ZmZlci0+ZGF0YSgpLCBidWZmZXItPmRhdGEoKSwgYnVmZmVyLT5zaXplKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsgLy8gTm8gYnVmZmVyLT5kYXRhKCkKLSAgICAgICAgICAgICAgICAvL01vZHVsYXIgRFJNCi0gICAgICAgICAgICAgICAgc3A8UmVmQmFzZT4gaG9sZGVyOwotICAgICAgICAgICAgICAgIGlmIChidWZmZXItPm1ldGEoKS0+ZmluZE9iamVjdCgibWVkaWFCdWZmZXJIb2xkZXIiLCAmaG9sZGVyKSkgewotICAgICAgICAgICAgICAgICAgICBtZWRpYUJ1ZiA9IChob2xkZXIgIT0gbnVsbHB0cikgPwotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkaWFCdWZmZXJIb2xkZXIqPihob2xkZXIuZ2V0KCkpLT5tZWRpYUJ1ZmZlcigpIDogbnVsbHB0cjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1lZGlhQnVmICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPnNldFJhbmdlKDAsIG1lZGlhQnVmLT5zaXplKCkpOwotICAgICAgICAgICAgICAgICAgICBtZW1jcHkoY29kZWNCdWZmZXItPmRhdGEoKSwgbWVkaWFCdWYtPmRhdGEoKSwgbWVkaWFCdWYtPnNpemUoKSk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlICZtZXRhX2RhdGEgPSBtZWRpYUJ1Zi0+bWV0YV9kYXRhKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNyeXB0SW5mbyA9IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb1dyYXBwZXI6OkNyZWF0ZShtZXRhX2RhdGEpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7IC8vIE5vIG1lZGlhQnVmCi0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJvbklucHV0QnVmZmVyRmV0Y2hlZDogYnVmZmVyLT5kYXRhKCkvbWVkaWFCdWYgYXJlIE5VTEwgZm9yICVwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuZ2V0KCkpOwotICAgICAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihVTktOT1dOX0VSUk9SKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gLy8gYnVmZmVyLT5kYXRhKCkKLSAgICAgICAgfSAvLyBuZWVkc0NvcHkKLQotICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgIGlmIChjcnlwdEluZm8gIT0gTlVMTCkgewotICAgICAgICAgICAgZXJyID0gbUNvZGVjLT5xdWV1ZVNlY3VyZUlucHV0QnVmZmVyKAotICAgICAgICAgICAgICAgICAgICBidWZmZXJJeCwKLSAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPm9mZnNldCgpLAotICAgICAgICAgICAgICAgICAgICBjcnlwdEluZm8sCi0gICAgICAgICAgICAgICAgICAgIHRpbWVVcywKLSAgICAgICAgICAgICAgICAgICAgZmxhZ3MpOwotICAgICAgICAgICAgLy8gc3luY2hyb25vdXMgY2FsbCBzbyBkb25lIHdpdGggY3J5cHRJbmZvIGhlcmUKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGVyciA9IG1Db2RlYy0+cXVldWVJbnB1dEJ1ZmZlcigKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVySXgsCi0gICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5vZmZzZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgY29kZWNCdWZmZXItPnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgdGltZVVzLAotICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0gICAgICAgIH0gLy8gbm8gY3J5cHRJbmZvCi0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIm9uSW5wdXRCdWZmZXJGZXRjaGVkOiBxdWV1ZSVzSW5wdXRCdWZmZXIgZmFpbGVkIGZvciBbJXNdIChlcnI9JWQpIiwKLSAgICAgICAgICAgICAgICAgICAgKGNyeXB0SW5mbyAhPSBOVUxMID8gIlNlY3VyZSIgOiAiIiksCi0gICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7Ci0gICAgICAgICAgICBoYW5kbGVFcnJvcihlcnIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUlucHV0QnVmZmVySXNEZXF1ZXVlZC5lZGl0SXRlbUF0KGJ1ZmZlckl4KSA9IGZhbHNlOwotICAgICAgICB9Ci0KLSAgICB9ICAgLy8gYnVmZmVyICE9IE5VTEwKLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OkRlY29kZXI6Om9uUmVuZGVyQnVmZmVyKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgc3RhdHVzX3QgZXJyOwotICAgIGludDMyX3QgcmVuZGVyOwotICAgIHNpemVfdCBidWZmZXJJeDsKLSAgICBpbnQzMl90IGVvczsKLSAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJidWZmZXItaXgiLCAmYnVmZmVySXgpKTsKLQotICAgIGlmICghbUlzQXVkaW8pIHsKLSAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGJ1ZmZlciA9IG1PdXRwdXRCdWZmZXJzW2J1ZmZlckl4XTsKLSAgICAgICAgYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcyk7Ci0KLSAgICAgICAgaWYgKG1DQ0RlY29kZXIgIT0gTlVMTCAmJiBtQ0NEZWNvZGVyLT5pc1NlbGVjdGVkKCkpIHsKLSAgICAgICAgICAgIG1DQ0RlY29kZXItPmRpc3BsYXkodGltZVVzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChtQ29kZWMgPT0gTlVMTCkgewotICAgICAgICBlcnIgPSBOT19JTklUOwotICAgIH0gZWxzZSBpZiAobXNnLT5maW5kSW50MzIoInJlbmRlciIsICZyZW5kZXIpICYmIHJlbmRlcikgewotICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcE5zOwotICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZXN0YW1wTnMiLCAmdGltZXN0YW1wTnMpKTsKLSAgICAgICAgZXJyID0gbUNvZGVjLT5yZWxlYXNlT3V0cHV0QnVmZmVyQXRUaW1lKGJ1ZmZlckl4LCB0aW1lc3RhbXBOcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbU51bU91dHB1dEZyYW1lc0Ryb3BwZWQgKz0gIW1Jc0F1ZGlvOwotICAgICAgICBlcnIgPSBtQ29kZWMtPnJlbGVhc2VPdXRwdXRCdWZmZXIoYnVmZmVySXgsIGZhbHNlIC8qIHJlbmRlciAqLyk7Ci0gICAgfQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoImZhaWxlZCB0byByZWxlYXNlIG91dHB1dCBidWZmZXIgZm9yIFslc10gKGVycj0lZCkiLAotICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIGVycik7Ci0gICAgICAgIGhhbmRsZUVycm9yKGVycik7Ci0gICAgfQotICAgIGlmIChtc2ctPmZpbmRJbnQzMigiZW9zIiwgJmVvcykgJiYgZW9zCi0gICAgICAgICAgICAmJiBpc0Rpc2NvbnRpbnVpdHlQZW5kaW5nKCkpIHsKLSAgICAgICAgZmluaXNoSGFuZGxlRGlzY29udGludWl0eSh0cnVlIC8qIGZsdXNoT25UaW1lQ2hhbmdlICovKTsKLSAgICB9Ci19Ci0KLWJvb2wgTnVQbGF5ZXIyOjpEZWNvZGVyOjppc0Rpc2NvbnRpbnVpdHlQZW5kaW5nKCkgY29uc3QgewotICAgIHJldHVybiBtRm9ybWF0Q2hhbmdlUGVuZGluZyB8fCBtVGltZUNoYW5nZVBlbmRpbmc7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpmaW5pc2hIYW5kbGVEaXNjb250aW51aXR5KGJvb2wgZmx1c2hPblRpbWVDaGFuZ2UpIHsKLSAgICBBTE9HVigiZmluaXNoSGFuZGxlRGlzY29udGludWl0eTogZm9ybWF0ICVkLCB0aW1lICVkLCBmbHVzaCAlZCIsCi0gICAgICAgICAgICBtRm9ybWF0Q2hhbmdlUGVuZGluZywgbVRpbWVDaGFuZ2VQZW5kaW5nLCBmbHVzaE9uVGltZUNoYW5nZSk7Ci0KLSAgICAvLyBJZiB3ZSBoYXZlIGZvcm1hdCBjaGFuZ2UsIHBhdXNlIGFuZCB3YWl0IHRvIGJlIGtpbGxlZDsKLSAgICAvLyBJZiB3ZSBoYXZlIHRpbWUgY2hhbmdlIG9ubHksIGZsdXNoIGFuZCByZXN0YXJ0IGZldGNoaW5nLgotCi0gICAgaWYgKG1Gb3JtYXRDaGFuZ2VQZW5kaW5nKSB7Ci0gICAgICAgIG1QYXVzZWQgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAobVRpbWVDaGFuZ2VQZW5kaW5nKSB7Ci0gICAgICAgIGlmIChmbHVzaE9uVGltZUNoYW5nZSkgewotICAgICAgICAgICAgZG9GbHVzaChmYWxzZSAvKiBub3RpZnlDb21wbGV0ZSAqLyk7Ci0gICAgICAgICAgICBzaWduYWxSZXN1bWUoZmFsc2UgLyogbm90aWZ5Q29tcGxldGUgKi8pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm90aWZ5IE51UGxheWVyMiB0byBlaXRoZXIgc2h1dGRvd24gZGVjb2Rlciwgb3IgcmVzY2FuIHNvdXJjZXMKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbXNnLT5zZXRJbnQzMigid2hhdCIsIGtXaGF0SW5wdXREaXNjb250aW51aXR5KTsKLSAgICBtc2ctPnNldEludDMyKCJmb3JtYXRDaGFuZ2UiLCBtRm9ybWF0Q2hhbmdlUGVuZGluZyk7Ci0gICAgbXNnLT5wb3N0KCk7Ci0KLSAgICBtRm9ybWF0Q2hhbmdlUGVuZGluZyA9IGZhbHNlOwotICAgIG1UaW1lQ2hhbmdlUGVuZGluZyA9IGZhbHNlOwotfQotCi1ib29sIE51UGxheWVyMjo6RGVjb2Rlcjo6c3VwcG9ydHNTZWFtbGVzc0F1ZGlvRm9ybWF0Q2hhbmdlKAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJnRhcmdldEZvcm1hdCkgY29uc3QgewotICAgIGlmICh0YXJnZXRGb3JtYXQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBBU3RyaW5nIG1pbWU7Ci0gICAgaWYgKCF0YXJnZXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghc3RyY2FzZWNtcChtaW1lLmNfc3RyKCksIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQykpIHsKLSAgICAgICAgLy8gZmllbGQtYnktZmllbGQgY29tcGFyaXNvbgotICAgICAgICBjb25zdCBjaGFyICoga2V5c1tdID0geyAiY2hhbm5lbC1jb3VudCIsICJzYW1wbGUtcmF0ZSIsICJpcy1hZHRzIiB9OwotICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHNpemVvZihrZXlzKSAvIHNpemVvZihrZXlzWzBdKTsgaSsrKSB7Ci0gICAgICAgICAgICBpbnQzMl90IG9sZFZhbCwgbmV3VmFsOwotICAgICAgICAgICAgaWYgKCFtSW5wdXRGb3JtYXQtPmdldEludDMyKGtleXNbaV0sICZvbGRWYWwpIHx8Ci0gICAgICAgICAgICAgICAgICAgICF0YXJnZXRGb3JtYXQtPmZpbmRJbnQzMihrZXlzW2ldLCAmbmV3VmFsKSB8fAotICAgICAgICAgICAgICAgICAgICBvbGRWYWwgIT0gbmV3VmFsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgc3A8QUJ1ZmZlcj4gbmV3QnVmOwotICAgICAgICB1aW50OF90ICpvbGRCdWZEYXRhID0gTlVMTDsKLSAgICAgICAgc2l6ZV90IG9sZEJ1ZlNpemUgPSAwOwotICAgICAgICBpZiAobUlucHV0Rm9ybWF0LT5nZXRCdWZmZXIoImNzZC0wIiwgKHZvaWQqKikmb2xkQnVmRGF0YSwgJm9sZEJ1ZlNpemUpICYmCi0gICAgICAgICAgICAgICAgdGFyZ2V0Rm9ybWF0LT5maW5kQnVmZmVyKCJjc2QtMCIsICZuZXdCdWYpKSB7Ci0gICAgICAgICAgICBpZiAob2xkQnVmU2l6ZSAhPSBuZXdCdWYtPnNpemUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAhbWVtY21wKG9sZEJ1ZkRhdGEsIG5ld0J1Zi0+ZGF0YSgpLCBvbGRCdWZTaXplKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgTnVQbGF5ZXIyOjpEZWNvZGVyOjpzdXBwb3J0c1NlYW1sZXNzRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmdGFyZ2V0Rm9ybWF0KSBjb25zdCB7Ci0gICAgaWYgKG1JbnB1dEZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAodGFyZ2V0Rm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQVN0cmluZyBvbGRNaW1lLCBuZXdNaW1lOwotICAgIGlmICghbUlucHV0Rm9ybWF0LT5nZXRTdHJpbmcoIm1pbWUiLCAmb2xkTWltZSkKLSAgICAgICAgICAgIHx8ICF0YXJnZXRGb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbmV3TWltZSkKLSAgICAgICAgICAgIHx8ICEob2xkTWltZSA9PSBuZXdNaW1lKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbCBhdWRpbyA9ICFzdHJuY2FzZWNtcChvbGRNaW1lLmNfc3RyKCksICJhdWRpby8iLCBzdHJsZW4oImF1ZGlvLyIpKTsKLSAgICBib29sIHNlYW1sZXNzOwotICAgIGlmIChhdWRpbykgewotICAgICAgICBzZWFtbGVzcyA9IHN1cHBvcnRzU2VhbWxlc3NBdWRpb0Zvcm1hdENoYW5nZSh0YXJnZXRGb3JtYXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludDMyX3QgaXNBZGFwdGl2ZTsKLSAgICAgICAgc2VhbWxlc3MgPSAobUNvZGVjICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICBtSW5wdXRGb3JtYXQtPmdldEludDMyKCJhZGFwdGl2ZS1wbGF5YmFjayIsICZpc0FkYXB0aXZlKSAmJgotICAgICAgICAgICAgICAgIGlzQWRhcHRpdmUpOwotICAgIH0KLQotICAgIEFMT0dWKCIlcyBzZWFtbGVzcyBzdXBwb3J0IGZvciAlcyIsIHNlYW1sZXNzID8gInllcyIgOiAibm8iLCBvbGRNaW1lLmNfc3RyKCkpOwotICAgIHJldHVybiBzZWFtbGVzczsKLX0KLQotdm9pZCBOdVBsYXllcjI6OkRlY29kZXI6OnJlbWVtYmVyQ29kZWNTcGVjaWZpY0RhdGEoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKLSAgICBpZiAoZm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtQ1NEc0ZvckN1cnJlbnRGb3JtYXQuY2xlYXIoKTsKLSAgICBmb3IgKGludDMyX3QgaSA9IDA7IDsgKytpKSB7Ci0gICAgICAgIEFTdHJpbmcgdGFnID0gImNzZC0iOwotICAgICAgICB0YWcuYXBwZW5kKGkpOwotICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXI7Ci0gICAgICAgIGlmICghZm9ybWF0LT5maW5kQnVmZmVyKHRhZy5jX3N0cigpLCAmYnVmZmVyKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgbUNTRHNGb3JDdXJyZW50Rm9ybWF0LnB1c2goYnVmZmVyKTsKLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyOjpub3RpZnlSZXN1bWVDb21wbGV0ZUlmTmVjZXNzYXJ5KCkgewotICAgIGlmIChtUmVzdW1lUGVuZGluZykgewotICAgICAgICBtUmVzdW1lUGVuZGluZyA9IGZhbHNlOwotCi0gICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UmVzdW1lQ29tcGxldGVkKTsKLSAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2Rlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGZiMTBlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2Rlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTlVQTEFZRVIyX0RFQ09ERVJfSF8KLSNkZWZpbmUgTlVQTEFZRVIyX0RFQ09ERVJfSF8KLQotI2luY2x1ZGUgIk51UGxheWVyMi5oIgotCi0jaW5jbHVkZSAiTnVQbGF5ZXIyRGVjb2RlckJhc2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBNZWRpYUNvZGVjQnVmZmVyOwotCi1zdHJ1Y3QgQU1lZGlhQ29kZWNXcmFwcGVyOwotc3RydWN0IEFNZWRpYUZvcm1hdFdyYXBwZXI7Ci0KLXN0cnVjdCBOdVBsYXllcjI6OkRlY29kZXIgOiBwdWJsaWMgRGVjb2RlckJhc2UgewotICAgIERlY29kZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBjb25zdCBzcDxTb3VyY2U+ICZzb3VyY2UsCi0gICAgICAgICAgICBwaWRfdCBwaWQsCi0gICAgICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgICAgICBjb25zdCBzcDxSZW5kZXJlcj4gJnJlbmRlcmVyID0gTlVMTCwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbnd3ID0gTlVMTCwKLSAgICAgICAgICAgIGNvbnN0IHNwPENDRGVjb2Rlcj4gJmNjRGVjb2RlciA9IE5VTEwpOwotCi0gICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0U3RhdHMoKSBjb25zdDsKLQotICAgIC8vIHNldHMgdGhlIG91dHB1dCBzdXJmYWNlIG9mIHZpZGVvIGRlY29kZXJzLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiAmbnd3KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUNyeXB0bygpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+RGVjb2RlcigpOwotCi0gICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLQotICAgIHZpcnR1YWwgdm9pZCBvbkNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7Ci0gICAgdmlydHVhbCB2b2lkIG9uU2V0UGFyYW1ldGVycyhjb25zdCBzcDxBTWVzc2FnZT4gJnBhcmFtcyk7Ci0gICAgdmlydHVhbCB2b2lkIG9uU2V0UmVuZGVyZXIoY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlcik7Ci0gICAgdmlydHVhbCB2b2lkIG9uUmVzdW1lKGJvb2wgbm90aWZ5Q29tcGxldGUpOwotICAgIHZpcnR1YWwgdm9pZCBvbkZsdXNoKCk7Ci0gICAgdmlydHVhbCB2b2lkIG9uU2h1dGRvd24oYm9vbCBub3RpZnlDb21wbGV0ZSk7Ci0gICAgdmlydHVhbCBib29sIGRvUmVxdWVzdEJ1ZmZlcnMoKTsKLQotcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAga1doYXRDb2RlY05vdGlmeSAgICAgICAgID0gJ2NkY04nLAotICAgICAgICBrV2hhdFJlbmRlckJ1ZmZlciAgICAgICAgPSAncm5kcicsCi0gICAgICAgIGtXaGF0U2V0VmlkZW9TdXJmYWNlICAgICA9ICdzU3VyJywKLSAgICAgICAga1doYXRBdWRpb091dHB1dEZvcm1hdENoYW5nZWQgPSAnYW9mYycsCi0gICAgICAgIGtXaGF0RHJtUmVsZWFzZUNyeXB0byAgICA9ICdyRHJtJywKLSAgICB9OwotCi0gICAgZW51bSB7Ci0gICAgICAgIGtNYXhOdW1WaWRlb1RlbXBvcmFsTGF5ZXJzID0gMzIsCi0gICAgfTsKLQotICAgIHNwPEFOYXRpdmVXaW5kb3dXcmFwcGVyPiBtTmF0aXZlV2luZG93OwotCi0gICAgc3A8U291cmNlPiBtU291cmNlOwotICAgIHNwPFJlbmRlcmVyPiBtUmVuZGVyZXI7Ci0gICAgc3A8Q0NEZWNvZGVyPiBtQ0NEZWNvZGVyOwotCi0gICAgc3A8QU1lZGlhRm9ybWF0V3JhcHBlcj4gbUlucHV0Rm9ybWF0OwotICAgIHNwPEFNZWRpYUNvZGVjV3JhcHBlcj4gbUNvZGVjOwotCi0gICAgTGlzdDxzcDxBTWVzc2FnZT4gPiBtUGVuZGluZ0lucHV0TWVzc2FnZXM7Ci0KLSAgICBWZWN0b3I8c3A8TWVkaWFDb2RlY0J1ZmZlcj4gPiBtSW5wdXRCdWZmZXJzOwotICAgIFZlY3RvcjxzcDxNZWRpYUNvZGVjQnVmZmVyPiA+IG1PdXRwdXRCdWZmZXJzOwotICAgIFZlY3RvcjxzcDxBQnVmZmVyPiA+IG1DU0RzRm9yQ3VycmVudEZvcm1hdDsKLSAgICBWZWN0b3I8c3A8QUJ1ZmZlcj4gPiBtQ1NEc1RvU3VibWl0OwotICAgIFZlY3Rvcjxib29sPiBtSW5wdXRCdWZmZXJJc0RlcXVldWVkOwotICAgIFZlY3RvcjxNZWRpYUJ1ZmZlciAqPiBtTWVkaWFCdWZmZXJzOwotICAgIFZlY3RvcjxzaXplX3Q+IG1EZXF1ZXVlZElucHV0QnVmZmVyczsKLQotICAgIGNvbnN0IHBpZF90IG1QaWQ7Ci0gICAgY29uc3QgdWlkX3QgbVVpZDsKLSAgICBpbnQ2NF90IG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVczsKLSAgICBpbnQ2NF90IG1OdW1GcmFtZXNUb3RhbDsKLSAgICBpbnQ2NF90IG1OdW1JbnB1dEZyYW1lc0Ryb3BwZWQ7Ci0gICAgaW50NjRfdCBtTnVtT3V0cHV0RnJhbWVzRHJvcHBlZDsKLSAgICBpbnQzMl90IG1WaWRlb1dpZHRoOwotICAgIGludDMyX3QgbVZpZGVvSGVpZ2h0OwotICAgIGJvb2wgbUlzQXVkaW87Ci0gICAgYm9vbCBtSXNWaWRlb0FWQzsKLSAgICBib29sIG1Jc1NlY3VyZTsKLSAgICBib29sIG1Jc0VuY3J5cHRlZDsKLSAgICBib29sIG1Jc0VuY3J5cHRlZE9ic2VydmVkRWFybGllcjsKLSAgICBib29sIG1Gb3JtYXRDaGFuZ2VQZW5kaW5nOwotICAgIGJvb2wgbVRpbWVDaGFuZ2VQZW5kaW5nOwotICAgIGZsb2F0IG1GcmFtZVJhdGVUb3RhbDsKLSAgICBmbG9hdCBtUGxheWJhY2tTcGVlZDsKLSAgICBpbnQzMl90IG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJUb3RhbDsKLSAgICBpbnQzMl90IG1OdW1WaWRlb1RlbXBvcmFsTGF5ZXJBbGxvd2VkOwotICAgIGludDMyX3QgbUN1cnJlbnRNYXhWaWRlb1RlbXBvcmFsTGF5ZXJJZDsKLSAgICBmbG9hdCBtVmlkZW9UZW1wb3JhbExheWVyQWdncmVnYXRlRnBzW2tNYXhOdW1WaWRlb1RlbXBvcmFsTGF5ZXJzXTsKLQotICAgIGJvb2wgbVJlc3VtZVBlbmRpbmc7Ci0gICAgQVN0cmluZyBtQ29tcG9uZW50TmFtZTsKLQotICAgIHZvaWQgaGFuZGxlRXJyb3IoaW50MzJfdCBlcnIpOwotICAgIGJvb2wgaGFuZGxlQW5JbnB1dEJ1ZmZlcihzaXplX3QgaW5kZXgpOwotICAgIGJvb2wgaGFuZGxlQW5PdXRwdXRCdWZmZXIoCi0gICAgICAgICAgICBzaXplX3QgaW5kZXgsCi0gICAgICAgICAgICBzaXplX3Qgb2Zmc2V0LAotICAgICAgICAgICAgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywKLSAgICAgICAgICAgIGludDMyX3QgZmxhZ3MpOwotICAgIHZvaWQgaGFuZGxlT3V0cHV0Rm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKLQotICAgIHZvaWQgcmVsZWFzZUFuZFJlc2V0TWVkaWFCdWZmZXJzKCk7Ci0gICAgYm9vbCBpc1N0YWxlUmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotCi0gICAgdm9pZCBkb0ZsdXNoKGJvb2wgbm90aWZ5Q29tcGxldGUpOwotICAgIHN0YXR1c190IGZldGNoSW5wdXREYXRhKHNwPEFNZXNzYWdlPiAmcmVwbHkpOwotICAgIGJvb2wgb25JbnB1dEJ1ZmZlckZldGNoZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHZvaWQgb25SZW5kZXJCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotCi0gICAgYm9vbCBzdXBwb3J0c1NlYW1sZXNzRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmdG8pIGNvbnN0OwotICAgIGJvb2wgc3VwcG9ydHNTZWFtbGVzc0F1ZGlvRm9ybWF0Q2hhbmdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmdGFyZ2V0Rm9ybWF0KSBjb25zdDsKLSAgICB2b2lkIHJlbWVtYmVyQ29kZWNTcGVjaWZpY0RhdGEoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpOwotICAgIGJvb2wgaXNEaXNjb250aW51aXR5UGVuZGluZygpIGNvbnN0OwotICAgIHZvaWQgZmluaXNoSGFuZGxlRGlzY29udGludWl0eShib29sIGZsdXNoT25UaW1lQ2hhbmdlKTsKLQotICAgIHZvaWQgbm90aWZ5UmVzdW1lQ29tcGxldGVJZk5lY2Vzc2FyeSgpOwotCi0gICAgdm9pZCBvblJlbGVhc2VDcnlwdG8oY29uc3Qgc3A8QU1lc3NhZ2U+JiBtc2cpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGVjb2Rlcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE5VUExBWUVSMl9ERUNPREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJCYXNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlckJhc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzkzMGM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlckJhc2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjE2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTnVQbGF5ZXIyRGVjb2RlckJhc2UiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLQotI2luY2x1ZGUgIk51UGxheWVyMkRlY29kZXJCYXNlLmgiCi0KLSNpbmNsdWRlICJOdVBsYXllcjJSZW5kZXJlci5oIgotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLU51UGxheWVyMjo6RGVjb2RlckJhc2U6OkRlY29kZXJCYXNlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KQotICAgIDogIG1Ob3RpZnkobm90aWZ5KSwKLSAgICAgICBtQnVmZmVyR2VuZXJhdGlvbigwKSwKLSAgICAgICBtUGF1c2VkKGZhbHNlKSwKLSAgICAgICBtU3RhdHMobmV3IEFNZXNzYWdlKSwKLSAgICAgICBtUmVxdWVzdElucHV0QnVmZmVyc1BlbmRpbmcoZmFsc2UpIHsKLSAgICAvLyBFdmVyeSBkZWNvZGVyIGhhcyBpdHMgb3duIGxvb3BlciBiZWNhdXNlIE1lZGlhQ29kZWMgb3BlcmF0aW9ucwotICAgIC8vIGFyZSBibG9ja2luZywgYnV0IE51UGxheWVyMiBuZWVkcyBhc3luY2hyb25vdXMgb3BlcmF0aW9ucy4KLSAgICBtRGVjb2Rlckxvb3BlciA9IG5ldyBBTG9vcGVyOwotICAgIG1EZWNvZGVyTG9vcGVyLT5zZXROYW1lKCJOUERlY29kZXIiKTsKLSAgICBtRGVjb2Rlckxvb3Blci0+c3RhcnQoZmFsc2UsIC8qIHJ1bk9uQ2FsbGluZ1RocmVhZCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLyogY2FuQ2FsbEphdmEgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9QUklPUklUWV9BVURJTyk7Ci19Ci0KLU51UGxheWVyMjo6RGVjb2RlckJhc2U6On5EZWNvZGVyQmFzZSgpIHsKLSAgICBzdG9wTG9vcGVyKCk7Ci19Ci0KLXN0YXRpYwotc3RhdHVzX3QgUG9zdEFuZEF3YWl0UmVzcG9uc2UoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBzcDxBTWVzc2FnZT4gKnJlc3BvbnNlKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZShyZXNwb25zZSk7Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgaWYgKCEoKnJlc3BvbnNlKS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSkgewotICAgICAgICBlcnIgPSBPSzsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi12b2lkIE51UGxheWVyMjo6RGVjb2RlckJhc2U6OmNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRDb25maWd1cmUsIHRoaXMpOwotICAgIG1zZy0+c2V0TWVzc2FnZSgiZm9ybWF0IiwgZm9ybWF0KTsKLSAgICBtc2ctPnBvc3QoKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OkRlY29kZXJCYXNlOjppbml0KCkgewotICAgIG1EZWNvZGVyTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIodGhpcyk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyQmFzZTo6c3RvcExvb3BlcigpIHsKLSAgICBtRGVjb2Rlckxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIoaWQoKSk7Ci0gICAgbURlY29kZXJMb29wZXItPnN0b3AoKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OkRlY29kZXJCYXNlOjpzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFBhcmFtZXRlcnMsIHRoaXMpOwotICAgIG1zZy0+c2V0TWVzc2FnZSgicGFyYW1zIiwgcGFyYW1zKTsKLSAgICBtc2ctPnBvc3QoKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OkRlY29kZXJCYXNlOjpzZXRSZW5kZXJlcihjb25zdCBzcDxSZW5kZXJlcj4gJnJlbmRlcmVyKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFJlbmRlcmVyLCB0aGlzKTsKLSAgICBtc2ctPnNldE9iamVjdCgicmVuZGVyZXIiLCByZW5kZXJlcik7Ci0gICAgbXNnLT5wb3N0KCk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyQmFzZTo6cGF1c2UoKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCB0aGlzKTsKLQotICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKLSAgICBQb3N0QW5kQXdhaXRSZXNwb25zZShtc2csICZyZXNwb25zZSk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyQmFzZTo6c2lnbmFsRmx1c2goKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdEZsdXNoLCB0aGlzKSktPnBvc3QoKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OkRlY29kZXJCYXNlOjpzaWduYWxSZXN1bWUoYm9vbCBub3RpZnlDb21wbGV0ZSkgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bWUsIHRoaXMpOwotICAgIG1zZy0+c2V0SW50MzIoIm5vdGlmeUNvbXBsZXRlIiwgbm90aWZ5Q29tcGxldGUpOwotICAgIG1zZy0+cG9zdCgpOwotfQotCi12b2lkIE51UGxheWVyMjo6RGVjb2RlckJhc2U6OmluaXRpYXRlU2h1dGRvd24oKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFNodXRkb3duLCB0aGlzKSktPnBvc3QoKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OkRlY29kZXJCYXNlOjpvblJlcXVlc3RJbnB1dEJ1ZmZlcnMoKSB7Ci0gICAgaWYgKG1SZXF1ZXN0SW5wdXRCdWZmZXJzUGVuZGluZykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gZG9SZXF1ZXN0QnVmZmVycygpIHJldHVybiB0cnVlIGlmIHdlIHNob3VsZCByZXF1ZXN0IG1vcmUgZGF0YQotICAgIGlmIChkb1JlcXVlc3RCdWZmZXJzKCkpIHsKLSAgICAgICAgbVJlcXVlc3RJbnB1dEJ1ZmZlcnNQZW5kaW5nID0gdHJ1ZTsKLQotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UmVxdWVzdElucHV0QnVmZmVycywgdGhpcyk7Ci0gICAgICAgIG1zZy0+cG9zdCgxMCAqIDEwMDBMTCk7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMjo6RGVjb2RlckJhc2U6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0KLSAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7Ci0gICAgICAgIGNhc2Uga1doYXRDb25maWd1cmU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7Ci0gICAgICAgICAgICBvbkNvbmZpZ3VyZShmb3JtYXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0U2V0UGFyYW1ldGVyczoKLSAgICAgICAgewotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtczsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoInBhcmFtcyIsICZwYXJhbXMpKTsKLSAgICAgICAgICAgIG9uU2V0UGFyYW1ldGVycyhwYXJhbXMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0U2V0UmVuZGVyZXI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPFJlZkJhc2U+IG9iajsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE9iamVjdCgicmVuZGVyZXIiLCAmb2JqKSk7Ci0gICAgICAgICAgICBvblNldFJlbmRlcmVyKHN0YXRpY19jYXN0PFJlbmRlcmVyICo+KG9iai5nZXQoKSkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0UGF1c2U6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotCi0gICAgICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKLQotICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShyZXBseUlEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFJlcXVlc3RJbnB1dEJ1ZmZlcnM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1SZXF1ZXN0SW5wdXRCdWZmZXJzUGVuZGluZyA9IGZhbHNlOwotICAgICAgICAgICAgb25SZXF1ZXN0SW5wdXRCdWZmZXJzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRGbHVzaDoKLSAgICAgICAgewotICAgICAgICAgICAgb25GbHVzaCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0UmVzdW1lOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IG5vdGlmeUNvbXBsZXRlOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIm5vdGlmeUNvbXBsZXRlIiwgJm5vdGlmeUNvbXBsZXRlKSk7Ci0KLSAgICAgICAgICAgIG9uUmVzdW1lKG5vdGlmeUNvbXBsZXRlKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFNodXRkb3duOgotICAgICAgICB7Ci0gICAgICAgICAgICBvblNodXRkb3duKHRydWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgVFJFU1BBU1MoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLX0KLQotdm9pZCBOdVBsYXllcjI6OkRlY29kZXJCYXNlOjpoYW5kbGVFcnJvcihpbnQzMl90IGVycikKLXsKLSAgICAvLyBXZSBjYW5ub3QgaW1tZWRpYXRlbHkgcmVsZWFzZSB0aGUgY29kZWMgZHVlIHRvIGJ1ZmZlcnMgc3RpbGwgb3V0c3RhbmRpbmcKLSAgICAvLyBpbiB0aGUgcmVuZGVyZXIuICBXZSBzaWduYWwgdG8gdGhlIHBsYXllciB0aGUgZXJyb3Igc28gaXQgY2FuIHNodXRkb3duL3JlbGVhc2UgdGhlCi0gICAgLy8gZGVjb2RlciBhZnRlciBmbHVzaGluZyBhbmQgaW5jcmVtZW50IHRoZSBnZW5lcmF0aW9uIHRvIGRpc2NhcmQgdW5uZWNlc3NhcnkgbWVzc2FnZXMuCi0KLSAgICArK21CdWZmZXJHZW5lcmF0aW9uOwotCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEVycm9yKTsKLSAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgIG5vdGlmeS0+cG9zdCgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJCYXNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJCYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlNTdmMGQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTlVQTEFZRVIyX0RFQ09ERVJfQkFTRV9IXwotCi0jZGVmaW5lIE5VUExBWUVSMl9ERUNPREVSX0JBU0VfSF8KLQotI2luY2x1ZGUgIk51UGxheWVyMi5oIgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBQnVmZmVyOwotc3RydWN0IEFOYXRpdmVXaW5kb3dXcmFwcGVyOwotc3RydWN0IE1lZGlhQ29kZWM7Ci1jbGFzcyBNZWRpYUJ1ZmZlcjsKLWNsYXNzIE1lZGlhQ29kZWNCdWZmZXI7Ci0KLXN0cnVjdCBOdVBsYXllcjI6OkRlY29kZXJCYXNlIDogcHVibGljIEFIYW5kbGVyIHsKLSAgICBleHBsaWNpdCBEZWNvZGVyQmFzZShjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSk7Ci0KLSAgICB2b2lkIGNvbmZpZ3VyZShjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7Ci0gICAgdm9pZCBpbml0KCk7Ci0gICAgdm9pZCBzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKTsKLQotICAgIC8vIFN5bmNocm9ub3VzIGNhbGwgdG8gZW5zdXJlIGRlY29kZXIgd2lsbCBub3QgcmVxdWVzdCBvciBzZW5kIG91dCBkYXRhLgotICAgIHZvaWQgcGF1c2UoKTsKLQotICAgIHZvaWQgc2V0UmVuZGVyZXIoY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlcik7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRWaWRlb1N1cmZhY2UoY29uc3Qgc3A8QU5hdGl2ZVdpbmRvd1dyYXBwZXI+ICYpIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9Ci0KLSAgICB2b2lkIHNpZ25hbEZsdXNoKCk7Ci0gICAgdm9pZCBzaWduYWxSZXN1bWUoYm9vbCBub3RpZnlDb21wbGV0ZSk7Ci0gICAgdm9pZCBpbml0aWF0ZVNodXRkb3duKCk7Ci0KLSAgICB2aXJ0dWFsIHNwPEFNZXNzYWdlPiBnZXRTdGF0cygpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIG1TdGF0czsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VDcnlwdG8oKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBlbnVtIHsKLSAgICAgICAga1doYXRJbnB1dERpc2NvbnRpbnVpdHkgID0gJ2luRGknLAotICAgICAgICBrV2hhdFZpZGVvU2l6ZUNoYW5nZWQgICAgPSAndmlTQycsCi0gICAgICAgIGtXaGF0Rmx1c2hDb21wbGV0ZWQgICAgICA9ICdmbHNDJywKLSAgICAgICAga1doYXRTaHV0ZG93bkNvbXBsZXRlZCAgID0gJ3NoREMnLAotICAgICAgICBrV2hhdFJlc3VtZUNvbXBsZXRlZCAgICAgPSAncmVzQycsCi0gICAgICAgIGtXaGF0RU9TICAgICAgICAgICAgICAgICA9ICdlb3MgJywKLSAgICAgICAga1doYXRFcnJvciAgICAgICAgICAgICAgID0gJ2VyciAnLAotICAgIH07Ci0KLXByb3RlY3RlZDoKLQotICAgIHZpcnR1YWwgfkRlY29kZXJCYXNlKCk7Ci0KLSAgICB2b2lkIHN0b3BMb29wZXIoKTsKLQotICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25Db25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgb25TZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIG9uU2V0UmVuZGVyZXIoY29uc3Qgc3A8UmVuZGVyZXI+ICZyZW5kZXJlcikgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBvblJlc3VtZShib29sIG5vdGlmeUNvbXBsZXRlKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIG9uRmx1c2goKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIG9uU2h1dGRvd24oYm9vbCBub3RpZnlDb21wbGV0ZSkgPSAwOwotCi0gICAgdm9pZCBvblJlcXVlc3RJbnB1dEJ1ZmZlcnMoKTsKLSAgICB2aXJ0dWFsIGJvb2wgZG9SZXF1ZXN0QnVmZmVycygpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlRXJyb3IoaW50MzJfdCBlcnIpOwotCi0gICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7Ci0gICAgaW50MzJfdCBtQnVmZmVyR2VuZXJhdGlvbjsKLSAgICBib29sIG1QYXVzZWQ7Ci0gICAgc3A8QU1lc3NhZ2U+IG1TdGF0czsKLQotcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAga1doYXRDb25maWd1cmUgICAgICAgICAgID0gJ2NvbmYnLAotICAgICAgICBrV2hhdFNldFBhcmFtZXRlcnMgICAgICAgPSAnc2V0UCcsCi0gICAgICAgIGtXaGF0U2V0UmVuZGVyZXIgICAgICAgICA9ICdzZXRSJywKLSAgICAgICAga1doYXRQYXVzZSAgICAgICAgICAgICAgID0gJ3BhdXMnLAotICAgICAgICBrV2hhdFJlcXVlc3RJbnB1dEJ1ZmZlcnMgPSAncmVxQicsCi0gICAgICAgIGtXaGF0Rmx1c2ggICAgICAgICAgICAgICA9ICdmbHVzJywKLSAgICAgICAga1doYXRTaHV0ZG93biAgICAgICAgICAgID0gJ3NodUQnLAotICAgIH07Ci0KLSAgICBzcDxBTG9vcGVyPiBtRGVjb2Rlckxvb3BlcjsKLSAgICBib29sIG1SZXF1ZXN0SW5wdXRCdWZmZXJzUGVuZGluZzsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERlY29kZXJCYXNlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTlVQTEFZRVIyX0RFQ09ERVJfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyUGFzc1Rocm91Z2guY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyUGFzc1Rocm91Z2guY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTE0ZTg4Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRGVjb2RlclBhc3NUaHJvdWdoLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk51UGxheWVyMkRlY29kZXJQYXNzVGhyb3VnaCIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0jaW5jbHVkZSAiTnVQbGF5ZXIyRGVjb2RlclBhc3NUaHJvdWdoLmgiCi0KLSNpbmNsdWRlICJOdVBsYXllcjJSZW5kZXJlci5oIgotI2luY2x1ZGUgIk51UGxheWVyMlNvdXJjZS5oIgotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0KLSNpbmNsdWRlICJBVFNQYXJzZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBUT0RPIG9wdGltaXplIGJ1ZmZlciBzaXplIGZvciBwb3dlciBjb25zdW1wdGlvbgotLy8gVGhlIG9mZmxvYWQgcmVhZCBidWZmZXIgc2l6ZSBpcyAzMiBLQiBidXQgMjQgS0IgdXNlcyBsZXNzIHBvd2VyLgotc3RhdGljIGNvbnN0IHNpemVfdCBrQWdncmVnYXRlQnVmZmVyU2l6ZUJ5dGVzID0gMjQgKiAxMDI0Owotc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4Q2FjaGVkQnl0ZXMgPSAyMDAwMDA7Ci0KLU51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjpEZWNvZGVyUGFzc1Rocm91Z2goCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICBjb25zdCBzcDxTb3VyY2U+ICZzb3VyY2UsCi0gICAgICAgIGNvbnN0IHNwPFJlbmRlcmVyPiAmcmVuZGVyZXIpCi0gICAgOiBEZWNvZGVyQmFzZShub3RpZnkpLAotICAgICAgbVNvdXJjZShzb3VyY2UpLAotICAgICAgbVJlbmRlcmVyKHJlbmRlcmVyKSwKLSAgICAgIG1Ta2lwUmVuZGVyaW5nVW50aWxNZWRpYVRpbWVVcygtMUxMKSwKLSAgICAgIG1SZWFjaGVkRU9TKHRydWUpLAotICAgICAgbVBlbmRpbmdBdWRpb0VycihPSyksCi0gICAgICBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluKDApLAotICAgICAgbUNhY2hlZEJ5dGVzKDApLAotICAgICAgbUNvbXBvbmVudE5hbWUoInBhc3MgdGhyb3VnaCBkZWNvZGVyIikgewotICAgIEFMT0dXX0lGKHJlbmRlcmVyID09IE5VTEwsICJleHBlY3QgYSBub24tTlVMTCByZW5kZXJlciIpOwotfQotCi1OdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6fkRlY29kZXJQYXNzVGhyb3VnaCgpIHsKLX0KLQotdm9pZCBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25Db25maWd1cmUoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKLSAgICBBTE9HVigiWyVzXSBvbkNvbmZpZ3VyZSIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOwotICAgIG1DYWNoZWRCeXRlcyA9IDA7Ci0gICAgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbiA9IDA7Ci0gICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKLSAgICArK21CdWZmZXJHZW5lcmF0aW9uOwotCi0gICAgb25SZXF1ZXN0SW5wdXRCdWZmZXJzKCk7Ci0KLSAgICBpbnQzMl90IGhhc1ZpZGVvID0gMDsKLSAgICBmb3JtYXQtPmZpbmRJbnQzMigiaGFzLXZpZGVvIiwgJmhhc1ZpZGVvKTsKLQotICAgIC8vIFRoZSBhdWRpbyBzaW5rIGlzIGFscmVhZHkgb3BlbmVkIGJlZm9yZSB0aGUgUGFzc1Rocm91Z2ggZGVjb2RlciBpcyBjcmVhdGVkLgotICAgIC8vIE9wZW5pbmcgYWdhaW4gbWlnaHQgYmUgcmVsZXZhbnQgaWYgZGVjb2RlciBpcyBpbnN0YW50aWF0ZWQgYWZ0ZXIgc2h1dGRvd24gYW5kCi0gICAgLy8gZm9ybWF0IGlzIGRpZmZlcmVudC4KLSAgICBzdGF0dXNfdCBlcnIgPSBtUmVuZGVyZXItPm9wZW5BdWRpb1NpbmsoCi0gICAgICAgICAgICBmb3JtYXQsIHRydWUgLyogb2ZmbG9hZE9ubHkgKi8sIGhhc1ZpZGVvLAotICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSAvKiBmbGFncyAqLywgTlVMTCAvKiBpc09mZmxvYWRlZCAqLywgbVNvdXJjZS0+aXNTdHJlYW1pbmcoKSk7Ci0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBoYW5kbGVFcnJvcihlcnIpOwotICAgIH0KLX0KLQotdm9pZCBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25TZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmLypwYXJhbXMqLykgewotICAgIEFMT0dXKCJvblNldFBhcmFtZXRlcnMoKSBjYWxsZWQgdW5leHBlY3RlZGx5Iik7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uU2V0UmVuZGVyZXIoCi0gICAgICAgIGNvbnN0IHNwPFJlbmRlcmVyPiAmcmVuZGVyZXIpIHsKLSAgICAvLyByZW5kZXJlciBjYW4ndCBiZSBjaGFuZ2VkIGR1cmluZyBvZmZsb2FkaW5nCi0gICAgQUxPR1dfSUYocmVuZGVyZXIgIT0gbVJlbmRlcmVyLAotICAgICAgICAgICAgImlnbm9yaW5nIHJlcXVlc3QgdG8gY2hhbmdlIHJlbmRlcmVyIik7Ci19Ci0KLWJvb2wgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OmlzU3RhbGVSZXBseShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7Ci0gICAgcmV0dXJuIGdlbmVyYXRpb24gIT0gbUJ1ZmZlckdlbmVyYXRpb247Ci19Ci0KLWJvb2wgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OmlzRG9uZUZldGNoaW5nKCkgY29uc3QgewotICAgIEFMT0dWKCJbJXNdIG1DYWNoZWRCeXRlcyA9ICV6dSwgbVJlYWNoZWRFT1MgPSAlZCBtUGF1c2VkID0gJWQiLAotICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgbUNhY2hlZEJ5dGVzLCBtUmVhY2hlZEVPUywgbVBhdXNlZCk7Ci0KLSAgICByZXR1cm4gbUNhY2hlZEJ5dGVzID49IGtNYXhDYWNoZWRCeXRlcyB8fCBtUmVhY2hlZEVPUyB8fCBtUGF1c2VkOwotfQotCi0vKgotICogcmV0dXJucyB0cnVlIGlmIHdlIHNob3VsZCByZXF1ZXN0IG1vcmUgZGF0YQotICovCi1ib29sIE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjpkb1JlcXVlc3RCdWZmZXJzKCkgewotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIHdoaWxlICghaXNEb25lRmV0Y2hpbmcoKSkgewotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7Ci0KLSAgICAgICAgZXJyID0gZmV0Y2hJbnB1dERhdGEobXNnKTsKLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBvbklucHV0QnVmZmVyRmV0Y2hlZChtc2cpOwotICAgIH0KLQotICAgIHJldHVybiBlcnIgPT0gLUVXT1VMREJMT0NLCi0gICAgICAgICAgICAmJiBtU291cmNlLT5mZWVkTW9yZVRTRGF0YSgpID09IE9LOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6ZGVxdWV1ZUFjY2Vzc1VuaXQoc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpIHsKLSAgICBzdGF0dXNfdCBlcnI7Ci0KLSAgICAvLyBEaWQgd2Ugc2F2ZSBhbiBhY2Nlc3NVbml0IGVhcmxpZXIgYmVjYXVzZSBvZiBhIGRpc2NvbnRpbnVpdHk/Ci0gICAgaWYgKG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0ICE9IE5VTEwpIHsKLSAgICAgICAgKmFjY2Vzc1VuaXQgPSBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdDsKLSAgICAgICAgbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQuY2xlYXIoKTsKLSAgICAgICAgZXJyID0gbVBlbmRpbmdBdWRpb0VycjsKLSAgICAgICAgQUxPR1YoImZlZWREZWNvZGVySW5wdXREYXRhKCkgdXNlIG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0Iik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gbVNvdXJjZS0+ZGVxdWV1ZUFjY2Vzc1VuaXQodHJ1ZSAvKiBhdWRpbyAqLywgYWNjZXNzVW5pdCk7Ci0gICAgfQotCi0gICAgaWYgKGVyciA9PSBJTkZPX0RJU0NPTlRJTlVJVFkgfHwgZXJyID09IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgaWYgKG1BZ2dyZWdhdGVCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgLy8gV2UgYWxyZWFkeSBoYXZlIHNvbWUgZGF0YSBzbyBzYXZlIHRoaXMgZm9yIGxhdGVyLgotICAgICAgICAgICAgbVBlbmRpbmdBdWRpb0VyciA9IGVycjsKLSAgICAgICAgICAgIG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0ID0gKmFjY2Vzc1VuaXQ7Ci0gICAgICAgICAgICAoKmFjY2Vzc1VuaXQpLmNsZWFyKCk7Ci0gICAgICAgICAgICBBTE9HRCgicmV0dXJuIGFnZ3JlZ2F0ZWQgYnVmZmVyIGFuZCBzYXZlIGVycig9JWQpIGZvciBsYXRlciIsIGVycik7Ci0gICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXNwPEFCdWZmZXI+IE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjphZ2dyZWdhdGVCdWZmZXIoCi0gICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KSB7Ci0gICAgc3A8QUJ1ZmZlcj4gYWdncmVnYXRlOwotCi0gICAgaWYgKGFjY2Vzc1VuaXQgPT0gTlVMTCkgewotICAgICAgICAvLyBhY2Nlc3NVbml0IGlzIHNhdmVkIHRvIG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0Ci0gICAgICAgIC8vIHJldHVybiBjdXJyZW50IG1BZ2dyZWdhdGVCdWZmZXIKLSAgICAgICAgYWdncmVnYXRlID0gbUFnZ3JlZ2F0ZUJ1ZmZlcjsKLSAgICAgICAgbUFnZ3JlZ2F0ZUJ1ZmZlci5jbGVhcigpOwotICAgICAgICByZXR1cm4gYWdncmVnYXRlOwotICAgIH0KLQotICAgIHNpemVfdCBzbWFsbFNpemUgPSBhY2Nlc3NVbml0LT5zaXplKCk7Ci0gICAgaWYgKChtQWdncmVnYXRlQnVmZmVyID09IE5VTEwpCi0gICAgICAgICAgICAvLyBEb24ndCBib3RoZXIgaWYgb25seSByb29tIGZvciBhIGZldyBzbWFsbCBidWZmZXJzLgotICAgICAgICAgICAgJiYgKHNtYWxsU2l6ZSA8IChrQWdncmVnYXRlQnVmZmVyU2l6ZUJ5dGVzIC8gMykpKSB7Ci0gICAgICAgIC8vIENyZWF0ZSBhIGxhcmdlciBidWZmZXIgZm9yIGNvbWJpbmluZyBzbWFsbGVyIGJ1ZmZlcnMgZnJvbSB0aGUgZXh0cmFjdG9yLgotICAgICAgICBtQWdncmVnYXRlQnVmZmVyID0gbmV3IEFCdWZmZXIoa0FnZ3JlZ2F0ZUJ1ZmZlclNpemVCeXRlcyk7Ci0gICAgICAgIG1BZ2dyZWdhdGVCdWZmZXItPnNldFJhbmdlKDAsIDApOyAvLyBzdGFydCBlbXB0eQotICAgIH0KLQotICAgIGlmIChtQWdncmVnYXRlQnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgIGludDY0X3QgZHVtbXk7Ci0gICAgICAgIGJvb2wgc21hbGxUaW1lc3RhbXBWYWxpZCA9IGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdGltZVVzKTsKLSAgICAgICAgYm9vbCBiaWdUaW1lc3RhbXBWYWxpZCA9IG1BZ2dyZWdhdGVCdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmZHVtbXkpOwotICAgICAgICAvLyBXaWxsIHRoZSBzbWFsbGVyIGJ1ZmZlciBmaXQ/Ci0gICAgICAgIHNpemVfdCBiaWdTaXplID0gbUFnZ3JlZ2F0ZUJ1ZmZlci0+c2l6ZSgpOwotICAgICAgICBzaXplX3Qgcm9vbUxlZnQgPSBtQWdncmVnYXRlQnVmZmVyLT5jYXBhY2l0eSgpIC0gYmlnU2l6ZTsKLSAgICAgICAgLy8gU2hvdWxkIHdlIHNhdmUgdGhpcyBzbWFsbCBidWZmZXIgZm9yIHRoZSBuZXh0IGJpZyBidWZmZXI/Ci0gICAgICAgIC8vIElmIHRoZSBmaXJzdCBzbWFsbCBidWZmZXIgZGlkIG5vdCBoYXZlIGEgdGltZXN0YW1wIHRoZW4gc2F2ZQotICAgICAgICAvLyBhbnkgYnVmZmVyIHRoYXQgZG9lcyBoYXZlIGEgdGltZXN0YW1wIHVudGlsIHRoZSBuZXh0IGJpZyBidWZmZXIuCi0gICAgICAgIGlmICgoc21hbGxTaXplID4gcm9vbUxlZnQpCi0gICAgICAgICAgICB8fCAoIWJpZ1RpbWVzdGFtcFZhbGlkICYmIChiaWdTaXplID4gMCkgJiYgc21hbGxUaW1lc3RhbXBWYWxpZCkpIHsKLSAgICAgICAgICAgIG1QZW5kaW5nQXVkaW9FcnIgPSBPSzsKLSAgICAgICAgICAgIG1QZW5kaW5nQXVkaW9BY2Nlc3NVbml0ID0gYWNjZXNzVW5pdDsKLSAgICAgICAgICAgIGFnZ3JlZ2F0ZSA9IG1BZ2dyZWdhdGVCdWZmZXI7Ci0gICAgICAgICAgICBtQWdncmVnYXRlQnVmZmVyLmNsZWFyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBHcmFiIHRpbWUgZnJvbSBmaXJzdCBzbWFsbCBidWZmZXIgaWYgYXZhaWxhYmxlLgotICAgICAgICAgICAgaWYgKChiaWdTaXplID09IDApICYmIHNtYWxsVGltZXN0YW1wVmFsaWQpIHsKLSAgICAgICAgICAgICAgICBtQWdncmVnYXRlQnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gQXBwZW5kIHNtYWxsIGJ1ZmZlciB0byB0aGUgYmlnZ2VyIGJ1ZmZlci4KLSAgICAgICAgICAgIG1lbWNweShtQWdncmVnYXRlQnVmZmVyLT5iYXNlKCkgKyBiaWdTaXplLCBhY2Nlc3NVbml0LT5kYXRhKCksIHNtYWxsU2l6ZSk7Ci0gICAgICAgICAgICBiaWdTaXplICs9IHNtYWxsU2l6ZTsKLSAgICAgICAgICAgIG1BZ2dyZWdhdGVCdWZmZXItPnNldFJhbmdlKDAsIGJpZ1NpemUpOwotCi0gICAgICAgICAgICBBTE9HVigiZmVlZERlY29kZXJJbnB1dERhdGEoKSBzbWFsbFNpemUgPSAlenUsIGJpZ1NpemUgPSAlenUsIGNhcGFjaXR5ID0gJXp1IiwKLSAgICAgICAgICAgICAgICAgICAgc21hbGxTaXplLCBiaWdTaXplLCBtQWdncmVnYXRlQnVmZmVyLT5jYXBhY2l0eSgpKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGRlY2lkZWQgbm90IHRvIGFnZ3JlZ2F0ZQotICAgICAgICBhZ2dyZWdhdGUgPSBhY2Nlc3NVbml0OwotICAgIH0KLQotICAgIHJldHVybiBhZ2dyZWdhdGU7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjpmZXRjaElucHV0RGF0YShzcDxBTWVzc2FnZT4gJnJlcGx5KSB7Ci0gICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdDsKLQotICAgIGRvIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gZGVxdWV1ZUFjY2Vzc1VuaXQoJmFjY2Vzc1VuaXQpOwotCi0gICAgICAgIGlmIChlcnIgPT0gLUVXT1VMREJMT0NLKSB7Ci0gICAgICAgICAgICAvLyBGbHVzaCBvdXQgdGhlIGFnZ3JlZ2F0ZSBidWZmZXIgdG8gdHJ5IHRvIGF2b2lkIHVuZGVycnVuLgotICAgICAgICAgICAgYWNjZXNzVW5pdCA9IGFnZ3JlZ2F0ZUJ1ZmZlcihOVUxMIC8qIGFjY2Vzc1VuaXQgKi8pOwotICAgICAgICAgICAgaWYgKGFjY2Vzc1VuaXQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVycjsKLSAgICAgICAgfSBlbHNlIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGlmIChlcnIgPT0gSU5GT19ESVNDT05USU5VSVRZKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCB0eXBlOwotICAgICAgICAgICAgICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDMyKCJkaXNjb250aW51aXR5IiwgJnR5cGUpKTsKLQotICAgICAgICAgICAgICAgIGJvb2wgZm9ybWF0Q2hhbmdlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlICYgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0FVRElPX0ZPUk1BVCkgIT0gMDsKLQotICAgICAgICAgICAgICAgIGJvb2wgdGltZUNoYW5nZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAodHlwZSAmIEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9USU1FKSAhPSAwOwotCi0gICAgICAgICAgICAgICAgQUxPR0koImF1ZGlvIGRpc2NvbnRpbnVpdHkgKGZvcm1hdENoYW5nZT0lZCwgdGltZT0lZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0Q2hhbmdlLCB0aW1lQ2hhbmdlKTsKLQotICAgICAgICAgICAgICAgIGlmIChmb3JtYXRDaGFuZ2UgfHwgdGltZUNoYW5nZSkgewotICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoIndoYXQiLCBrV2hhdElucHV0RGlzY29udGludWl0eSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgcGVyZm9ybSBzZWFtbGVzcyBmb3JtYXQgY2hhbmdlLAotICAgICAgICAgICAgICAgICAgICAvLyBvbmx5IG5vdGlmeSBOdVBsYXllcjIgdG8gc2NhbiBzb3VyY2VzCi0gICAgICAgICAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImZvcm1hdENoYW5nZSIsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgbXNnLT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHRpbWVDaGFuZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgZG9GbHVzaChmYWxzZSAvKiBub3RpZnlDb21wbGV0ZSAqLyk7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZm9ybWF0Q2hhbmdlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRvIHNlYW1sZXNzIGZvcm1hdCBjaGFuZ2UKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzdHJlYW0gaXMgdW5hZmZlY3RlZCBieSB0aGUgZGlzY29udGludWl0eQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVwbHktPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgYWNjZXNzVW5pdCA9IGFnZ3JlZ2F0ZUJ1ZmZlcihhY2Nlc3NVbml0KTsKLSAgICB9IHdoaWxlIChhY2Nlc3NVbml0ID09IE5VTEwpOwotCi0jaWYgMAotICAgIGludDY0X3QgbWVkaWFUaW1lVXM7Ci0gICAgQ0hFQ0soYWNjZXNzVW5pdC0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcykpOwotICAgIEFMT0dWKCJmZWVkaW5nIGF1ZGlvIGlucHV0IGJ1ZmZlciBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsCi0gICAgICAgICBtZWRpYVRpbWVVcyAvIDFFNik7Ci0jZW5kaWYKLQotICAgIHJlcGx5LT5zZXRCdWZmZXIoImJ1ZmZlciIsIGFjY2Vzc1VuaXQpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvbklucHV0QnVmZmVyRmV0Y2hlZCgKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBpZiAobVJlYWNoZWRFT1MpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlcjsKLSAgICBib29sIGhhc0J1ZmZlciA9IG1zZy0+ZmluZEJ1ZmZlcigiYnVmZmVyIiwgJmJ1ZmZlcik7Ci0gICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIGludDMyX3Qgc3RyZWFtRXJyID0gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImVyciIsICZzdHJlYW1FcnIpIHx8ICFoYXNCdWZmZXIpOwotICAgICAgICBpZiAoc3RyZWFtRXJyID09IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoc3RyZWFtRXJyICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pIHsKLSAgICAgICAgICAgIGhhbmRsZUVycm9yKHN0cmVhbUVycik7Ci0gICAgICAgIH0KLSAgICAgICAgbVJlYWNoZWRFT1MgPSB0cnVlOwotICAgICAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1SZW5kZXJlci0+cXVldWVFT1ModHJ1ZSAvKiBhdWRpbyAqLywgRVJST1JfRU5EX09GX1NUUkVBTSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNwPEFNZXNzYWdlPiBleHRyYTsKLSAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRNZXNzYWdlKCJleHRyYSIsICZleHRyYSkgJiYgZXh0cmEgIT0gTlVMTCkgewotICAgICAgICBpbnQ2NF90IHJlc3VtZUF0TWVkaWFUaW1lVXM7Ci0gICAgICAgIGlmIChleHRyYS0+ZmluZEludDY0KAotICAgICAgICAgICAgICAgICAgICAicmVzdW1lLWF0LW1lZGlhdGltZVVzIiwgJnJlc3VtZUF0TWVkaWFUaW1lVXMpKSB7Ci0gICAgICAgICAgICBBTE9HSSgiWyVzXSBzdXBwcmVzc2luZyByZW5kZXJpbmcgdW50aWwgJWxsZCB1cyIsCi0gICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpcmVzdW1lQXRNZWRpYVRpbWVVcyk7Ci0gICAgICAgICAgICBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMgPSByZXN1bWVBdE1lZGlhVGltZVVzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50MzJfdCBidWZmZXJTaXplID0gYnVmZmVyLT5zaXplKCk7Ci0gICAgbUNhY2hlZEJ5dGVzICs9IGJ1ZmZlclNpemU7Ci0KLSAgICBpbnQ2NF90IHRpbWVVcyA9IDA7Ci0gICAgQ0hFQ0soYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJnRpbWVVcykpOwotICAgIGlmIChtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXMgPj0gMCkgewotICAgICAgICBpZiAodGltZVVzIDwgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzKSB7Ci0gICAgICAgICAgICBBTE9HVigiWyVzXSBkcm9wcGluZyBidWZmZXIgYXQgdGltZSAlbGxkIGFzIHJlcXVlc3RlZC4iLAotICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgKGxvbmcgbG9uZyl0aW1lVXMpOwotCi0gICAgICAgICAgICBvbkJ1ZmZlckNvbnN1bWVkKGJ1ZmZlclNpemUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID0gLTE7Ci0gICAgfQotCi0gICAgaWYgKG1SZW5kZXJlciA9PSBOVUxMKSB7Ci0gICAgICAgIG9uQnVmZmVyQ29uc3VtZWQoYnVmZmVyU2l6ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gcmVwbHkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRCdWZmZXJDb25zdW1lZCwgdGhpcyk7Ci0gICAgcmVwbHktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUJ1ZmZlckdlbmVyYXRpb24pOwotICAgIHJlcGx5LT5zZXRJbnQzMigic2l6ZSIsIGJ1ZmZlclNpemUpOwotCi0gICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gbWNCdWZmZXIgPSBuZXcgTWVkaWFDb2RlY0J1ZmZlcihudWxscHRyLCBidWZmZXIpOwotICAgIG1jQnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOwotCi0gICAgbVJlbmRlcmVyLT5xdWV1ZUJ1ZmZlcih0cnVlIC8qIGF1ZGlvICovLCBtY0J1ZmZlciwgcmVwbHkpOwotCi0gICAgKyttUGVuZGluZ0J1ZmZlcnNUb0RyYWluOwotICAgIEFMT0dWKCJvbklucHV0QnVmZmVyRmlsbGVkOiAjVG9EcmFpbiA9ICV6dSwgY2FjaGVkQnl0ZXMgPSAlenUiLAotICAgICAgICAgICAgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbiwgbUNhY2hlZEJ5dGVzKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25CdWZmZXJDb25zdW1lZChpbnQzMl90IHNpemUpIHsKLSAgICAtLW1QZW5kaW5nQnVmZmVyc1RvRHJhaW47Ci0gICAgbUNhY2hlZEJ5dGVzIC09IHNpemU7Ci0gICAgQUxPR1YoIm9uQnVmZmVyQ29uc3VtZWQ6ICNUb0RyYWluID0gJXp1LCBjYWNoZWRCeXRlcyA9ICV6dSIsCi0gICAgICAgICAgICBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluLCBtQ2FjaGVkQnl0ZXMpOwotICAgIG9uUmVxdWVzdElucHV0QnVmZmVycygpOwotfQotCi12b2lkIE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvblJlc3VtZShib29sIG5vdGlmeUNvbXBsZXRlKSB7Ci0gICAgbVBhdXNlZCA9IGZhbHNlOwotCi0gICAgb25SZXF1ZXN0SW5wdXRCdWZmZXJzKCk7Ci0KLSAgICBpZiAobm90aWZ5Q29tcGxldGUpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRSZXN1bWVDb21wbGV0ZWQpOwotICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6OmRvRmx1c2goYm9vbCBub3RpZnlDb21wbGV0ZSkgewotICAgICsrbUJ1ZmZlckdlbmVyYXRpb247Ci0gICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID0gLTE7Ci0gICAgbVBlbmRpbmdBdWRpb0FjY2Vzc1VuaXQuY2xlYXIoKTsKLSAgICBtUGVuZGluZ0F1ZGlvRXJyID0gT0s7Ci0gICAgbUFnZ3JlZ2F0ZUJ1ZmZlci5jbGVhcigpOwotCi0gICAgaWYgKG1SZW5kZXJlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1SZW5kZXJlci0+Zmx1c2godHJ1ZSAvKiBhdWRpbyAqLywgbm90aWZ5Q29tcGxldGUpOwotICAgICAgICBtUmVuZGVyZXItPnNpZ25hbFRpbWVEaXNjb250aW51aXR5KCk7Ci0gICAgfQotCi0gICAgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbiA9IDA7Ci0gICAgbUNhY2hlZEJ5dGVzID0gMDsKLSAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOwotfQotCi12b2lkIE51UGxheWVyMjo6RGVjb2RlclBhc3NUaHJvdWdoOjpvbkZsdXNoKCkgewotICAgIGRvRmx1c2godHJ1ZSAvKiBub3RpZnlDb21wbGV0ZSAqLyk7Ci0KLSAgICBtUGF1c2VkID0gdHJ1ZTsKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0Rmx1c2hDb21wbGV0ZWQpOwotICAgIG5vdGlmeS0+cG9zdCgpOwotCi19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2g6Om9uU2h1dGRvd24oYm9vbCBub3RpZnlDb21wbGV0ZSkgewotICAgICsrbUJ1ZmZlckdlbmVyYXRpb247Ci0gICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID0gLTE7Ci0KLSAgICBpZiAobm90aWZ5Q29tcGxldGUpIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRTaHV0ZG93bkNvbXBsZXRlZCk7Ci0gICAgICAgIG5vdGlmeS0+cG9zdCgpOwotICAgIH0KLQotICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OkRlY29kZXJQYXNzVGhyb3VnaDo6b25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBBTE9HVigiWyVzXSBvbk1lc3NhZ2U6ICVzIiwgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwKLSAgICAgICAgICAgIG1zZy0+ZGVidWdTdHJpbmcoKS5jX3N0cigpKTsKLQotICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKLSAgICAgICAgY2FzZSBrV2hhdEJ1ZmZlckNvbnN1bWVkOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIWlzU3RhbGVSZXBseShtc2cpKSB7Ci0gICAgICAgICAgICAgICAgaW50MzJfdCBzaXplOwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJzaXplIiwgJnNpemUpKTsKLSAgICAgICAgICAgICAgICBvbkJ1ZmZlckNvbnN1bWVkKHNpemUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgRGVjb2RlckJhc2U6Om9uTWVzc2FnZVJlY2VpdmVkKG1zZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJQYXNzVGhyb3VnaC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEZWNvZGVyUGFzc1Rocm91Z2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM4YzYwYS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRlY29kZXJQYXNzVGhyb3VnaC5oCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBOVVBMQVlFUjJfREVDT0RFUl9QQVNTX1RIUk9VR0hfSF8KLQotI2RlZmluZSBOVVBMQVlFUjJfREVDT0RFUl9QQVNTX1RIUk9VR0hfSF8KLQotI2luY2x1ZGUgIk51UGxheWVyMi5oIgotCi0jaW5jbHVkZSAiTnVQbGF5ZXIyRGVjb2RlckJhc2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgTnVQbGF5ZXIyOjpEZWNvZGVyUGFzc1Rocm91Z2ggOiBwdWJsaWMgRGVjb2RlckJhc2UgewotICAgIERlY29kZXJQYXNzVGhyb3VnaChjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U291cmNlPiAmc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxSZW5kZXJlcj4gJnJlbmRlcmVyKTsKLQotcHJvdGVjdGVkOgotCi0gICAgdmlydHVhbCB+RGVjb2RlclBhc3NUaHJvdWdoKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotCi0gICAgdmlydHVhbCB2b2lkIG9uQ29uZmlndXJlKGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKLSAgICB2aXJ0dWFsIHZvaWQgb25TZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKTsKLSAgICB2aXJ0dWFsIHZvaWQgb25TZXRSZW5kZXJlcihjb25zdCBzcDxSZW5kZXJlcj4gJnJlbmRlcmVyKTsKLSAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bWUoYm9vbCBub3RpZnlDb21wbGV0ZSk7Ci0gICAgdmlydHVhbCB2b2lkIG9uRmx1c2goKTsKLSAgICB2aXJ0dWFsIHZvaWQgb25TaHV0ZG93bihib29sIG5vdGlmeUNvbXBsZXRlKTsKLSAgICB2aXJ0dWFsIGJvb2wgZG9SZXF1ZXN0QnVmZmVycygpOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrV2hhdEJ1ZmZlckNvbnN1bWVkICAgICA9ICdidWZDJywKLSAgICB9OwotCi0gICAgc3A8U291cmNlPiBtU291cmNlOwotICAgIHNwPFJlbmRlcmVyPiBtUmVuZGVyZXI7Ci0gICAgaW50NjRfdCBtU2tpcFJlbmRlcmluZ1VudGlsTWVkaWFUaW1lVXM7Ci0KLSAgICBib29sICAgIG1SZWFjaGVkRU9TOwotCi0gICAgLy8gVXNlZCBieSBmZWVkRGVjb2RlcklucHV0RGF0YSB0byBhZ2dyZWdhdGUgc21hbGwgYnVmZmVycyBpbnRvCi0gICAgLy8gb25lIGxhcmdlIGJ1ZmZlci4KLSAgICBzcDxBQnVmZmVyPiBtUGVuZGluZ0F1ZGlvQWNjZXNzVW5pdDsKLSAgICBzdGF0dXNfdCAgICBtUGVuZGluZ0F1ZGlvRXJyOwotICAgIHNwPEFCdWZmZXI+IG1BZ2dyZWdhdGVCdWZmZXI7Ci0KLSAgICAvLyBtUGVuZGluZ0J1ZmZlcnNUb0RyYWluIGFyZSBvbmx5IGZvciBkZWJ1Z2dpbmcuIEl0IGNhbiBiZSByZW1vdmVkCi0gICAgLy8gd2hlbiB0aGUgcG93ZXIgaW52ZXN0aWdhdGlvbiBpcyBkb25lLgotICAgIHNpemVfdCAgbVBlbmRpbmdCdWZmZXJzVG9EcmFpbjsKLSAgICBzaXplX3QgIG1DYWNoZWRCeXRlczsKLSAgICBBU3RyaW5nIG1Db21wb25lbnROYW1lOwotCi0gICAgYm9vbCBpc1N0YWxlUmVwbHkoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIGJvb2wgaXNEb25lRmV0Y2hpbmcoKSBjb25zdDsKLQotICAgIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KTsKLSAgICBzcDxBQnVmZmVyPiBhZ2dyZWdhdGVCdWZmZXIoY29uc3Qgc3A8QUJ1ZmZlcj4gJmFjY2Vzc1VuaXQpOwotICAgIHN0YXR1c190IGZldGNoSW5wdXREYXRhKHNwPEFNZXNzYWdlPiAmcmVwbHkpOwotICAgIHZvaWQgZG9GbHVzaChib29sIG5vdGlmeUNvbXBsZXRlKTsKLQotICAgIHZvaWQgb25JbnB1dEJ1ZmZlckZldGNoZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHZvaWQgb25CdWZmZXJDb25zdW1lZChpbnQzMl90IHNpemUpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGVjb2RlclBhc3NUaHJvdWdoKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTlVQTEFZRVIyX0RFQ09ERVJfUEFTU19USFJPVUdIX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRyaXZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM5OGMyNDYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTA4OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk51UGxheWVyMkRyaXZlciIKLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotCi0jaW5jbHVkZSAiTnVQbGF5ZXIyRHJpdmVyLmgiCi0KLSNpbmNsdWRlICJOdVBsYXllcjIuaCIKLSNpbmNsdWRlICJOdVBsYXllcjJTb3VyY2UuaCIKLQotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VEZXNjLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLQotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuaD4KLQotc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7Ci1zdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1NsZWVwVXMgPSAyMDAwMDsKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgUGFyY2VsV3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBzdGF0aWMgc3A8UGFyY2VsV3JhcHBlcj4gQ3JlYXRlKGNvbnN0IFBhcmNlbCAqcCkgewotICAgICAgICBpZiAocCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBzcDxQYXJjZWxXcmFwcGVyPiBwdyA9IG5ldyBQYXJjZWxXcmFwcGVyKCk7Ci0gICAgICAgICAgICBpZiAocHctPmFwcGVuZEZyb20ocCkgPT0gT0spIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcHc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgY29uc3QgUGFyY2VsICpnZXRQYXJjZWwoKSB7Ci0gICAgICAgIHJldHVybiBtUGFyY2VsOwotICAgIH0KLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflBhcmNlbFdyYXBwZXIoKSB7Ci0gICAgICAgIGlmIChtUGFyY2VsICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGRlbGV0ZSBtUGFyY2VsOwotICAgICAgICB9Ci0gICAgfQotCi1wcml2YXRlOgotICAgIFBhcmNlbFdyYXBwZXIoKQotICAgICAgICA6IG1QYXJjZWwoTlVMTCkgeyB9Ci0KLSAgICBzdGF0dXNfdCBhcHBlbmRGcm9tKGNvbnN0IFBhcmNlbCAqcCkgewotICAgICAgICBpZiAobVBhcmNlbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtUGFyY2VsID0gbmV3IFBhcmNlbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbVBhcmNlbC0+YXBwZW5kRnJvbShwLCAwIC8qIHN0YXJ0ICovLCBwLT5kYXRhU2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBQYXJjZWwgKm1QYXJjZWw7Ci19OwotCi0vLyBrZXkgZm9yIG1lZGlhIHN0YXRpc3RpY3MKLXN0YXRpYyBjb25zdCBjaGFyICprS2V5UGxheWVyID0gIm51cGxheWVyIjsKLS8vIGF0dHJzIGZvciBtZWRpYSBzdGF0aXN0aWNzCi0gICAgLy8gTkI6IHRoZXNlIGFyZSBtYXRjaGVkIHdpdGggcHVibGljIEphdmEgQVBJIGNvbnN0YW50cyBkZWZpbmVkCi0gICAgLy8gaW4gZnJhbWV3b3Jrcy9iYXNlL21lZGlhL2phdmEvYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXllcjIuamF2YQotICAgIC8vIFRoZXNlIG11c3QgYmUga2VwdCBzeW5jaHJvbml6ZWQgd2l0aCB0aGUgY29uc3RhbnRzIHRoZXJlLgotc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJWTWltZSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnZpZGVvLm1pbWUiOwotc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJWQ29kZWMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci52aWRlby5jb2RlYyI7Ci1zdGF0aWMgY29uc3QgY2hhciAqa1BsYXllcldpZHRoID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIud2lkdGgiOwotc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJIZWlnaHQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5oZWlnaHQiOwotc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJGcmFtZXMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5mcmFtZXMiOwotc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJGcmFtZXNEcm9wcGVkID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZHJvcHBlZCI7Ci1zdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckFNaW1lID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuYXVkaW8ubWltZSI7Ci1zdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckFDb2RlYyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmF1ZGlvLmNvZGVjIjsKLXN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRHVyYXRpb24gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kdXJhdGlvbk1zIjsKLXN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyUGxheWluZyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnBsYXlpbmdNcyI7Ci1zdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckVycm9yID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZXJyIjsKLXN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRXJyb3JDb2RlID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZXJyY29kZSI7Ci0KLS8vIE5COiBUaGVzZSBhcmUgbm90IHlldCBleHBvc2VkIGFzIHB1YmxpYyBKYXZhIEFQSSBjb25zdGFudHMuCi1zdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckVycm9yU3RhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5lcnJzdGF0ZSI7Ci1zdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckRhdGFTb3VyY2VUeXBlID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZGF0YVNvdXJjZSI7Ci0vLwotc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJSZWJ1ZmZlcmluZyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnJlYnVmZmVyaW5nTXMiOwotc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJSZWJ1ZmZlcmluZ0NvdW50ID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIucmVidWZmZXJzIjsKLXN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyUmVidWZmZXJpbmdBdEV4aXQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5yZWJ1ZmZlckV4aXQiOwotCi0KLU51UGxheWVyMkRyaXZlcjo6TnVQbGF5ZXIyRHJpdmVyKHBpZF90IHBpZCwgdWlkX3QgdWlkKQotICAgIDogbVN0YXRlKFNUQVRFX0lETEUpLAotICAgICAgbUFzeW5jUmVzdWx0KFVOS05PV05fRVJST1IpLAotICAgICAgbVNyY0lkKDApLAotICAgICAgbVNldFN1cmZhY2VJblByb2dyZXNzKGZhbHNlKSwKLSAgICAgIG1EdXJhdGlvblVzKC0xKSwKLSAgICAgIG1Qb3NpdGlvblVzKC0xKSwKLSAgICAgIG1TZWVrSW5Qcm9ncmVzcyhmYWxzZSksCi0gICAgICBtUGxheWluZ1RpbWVVcygwKSwKLSAgICAgIG1SZWJ1ZmZlcmluZ1RpbWVVcygwKSwKLSAgICAgIG1SZWJ1ZmZlcmluZ0V2ZW50cygwKSwKLSAgICAgIG1SZWJ1ZmZlcmluZ0F0RXhpdChmYWxzZSksCi0gICAgICBtTG9vcGVyKG5ldyBBTG9vcGVyKSwKLSAgICAgIG1OdVBsYXllcjJMb29wZXIobmV3IEFMb29wZXIpLAotICAgICAgbU1lZGlhQ2xvY2sobmV3IE1lZGlhQ2xvY2spLAotICAgICAgbVBsYXllcihuZXcgTnVQbGF5ZXIyKHBpZCwgdWlkLCBtTWVkaWFDbG9jaykpLAotICAgICAgbVBsYXllckZsYWdzKDApLAotICAgICAgbUFuYWx5dGljc0l0ZW0oTlVMTCksCi0gICAgICBtQ2xpZW50VWlkKHVpZCksCi0gICAgICBtQXRFT1MoZmFsc2UpLAotICAgICAgbUxvb3BpbmcoZmFsc2UpLAotICAgICAgbUF1dG9Mb29wKGZhbHNlKSB7Ci0gICAgQUxPR0QoIk51UGxheWVyMkRyaXZlciglcCkgY3JlYXRlZCwgY2xpZW50UGlkKCVkKSIsIHRoaXMsIHBpZCk7Ci0gICAgbUxvb3Blci0+c2V0TmFtZSgiTnVQbGF5ZXIyRHJpdmVyIExvb3BlciIpOwotICAgIG1OdVBsYXllcjJMb29wZXItPnNldE5hbWUoIk51UGxheWVyMiBMb29wZXIiKTsKLQotICAgIG1NZWRpYUNsb2NrLT5pbml0KCk7Ci0KLSAgICAvLyBzZXQgdXAgYW4gYW5hbHl0aWNzIHJlY29yZAotICAgIG1BbmFseXRpY3NJdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbShrS2V5UGxheWVyKTsKLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0VWlkKG1DbGllbnRVaWQpOwotCi0gICAgbU51UGxheWVyMkxvb3Blci0+c3RhcnQoCi0gICAgICAgICAgICBmYWxzZSwgLyogcnVuT25DYWxsaW5nVGhyZWFkICovCi0gICAgICAgICAgICB0cnVlLCAgLyogY2FuQ2FsbEphdmEgKi8KLSAgICAgICAgICAgIFBSSU9SSVRZX0FVRElPKTsKLQotICAgIG1OdVBsYXllcjJMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtUGxheWVyKTsKLQotICAgIG1QbGF5ZXItPnNldERyaXZlcih0aGlzKTsKLX0KLQotTnVQbGF5ZXIyRHJpdmVyOjp+TnVQbGF5ZXIyRHJpdmVyKCkgewotICAgIEFMT0dWKCJ+TnVQbGF5ZXIyRHJpdmVyKCVwKSIsIHRoaXMpOwotICAgIG1OdVBsYXllcjJMb29wZXItPnN0b3AoKTsKLSAgICBtTG9vcGVyLT5zdG9wKCk7Ci0KLSAgICAvLyBmaW5hbGl6ZSBhbnkgcGVuZGluZyBtZXRyaWNzLCB1c3VhbGx5IGEgbm8tb3AuCi0gICAgdXBkYXRlTWV0cmljcygiZGVzdHJ1Y3RvciIpOwotICAgIGxvZ01ldHJpY3MoImRlc3RydWN0b3IiKTsKLQotICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtQW5hbHl0aWNzSXRlbTsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjppbml0Q2hlY2soKSB7Ci0gICAgbUxvb3Blci0+c3RhcnQoCi0gICAgICAgICAgICBmYWxzZSwgLyogcnVuT25DYWxsaW5nVGhyZWFkICovCi0gICAgICAgICAgICB0cnVlLCAgLyogY2FuQ2FsbEphdmEgKi8KLSAgICAgICAgICAgIFBSSU9SSVRZX0FVRElPKTsKLQotICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlRGVzYz4gJmRzZCkgewotICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVwKSIsIHRoaXMpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobVN0YXRlICE9IFNUQVRFX0lETEUpIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIG1TcmNJZCA9IGRzZC0+bUlkOwotICAgIG1TdGF0ZSA9IFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkc7Ci0KLSAgICBtUGxheWVyLT5zZXREYXRhU291cmNlQXN5bmMoZHNkKTsKLQotICAgIHdoaWxlIChtU3RhdGUgPT0gU1RBVEVfU0VUX0RBVEFTT1VSQ0VfUEVORElORykgewotICAgICAgICBtQ29uZGl0aW9uLndhaXQobUxvY2spOwotICAgIH0KLQotICAgIHJldHVybiBtQXN5bmNSZXN1bHQ7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6cHJlcGFyZU5leHREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2VEZXNjPiAmZHNkKSB7Ci0gICAgQUxPR1YoInByZXBhcmVOZXh0RGF0YVNvdXJjZSglcCkiLCB0aGlzKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgbVBsYXllci0+cHJlcGFyZU5leHREYXRhU291cmNlQXN5bmMoZHNkKTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpwbGF5TmV4dERhdGFTb3VyY2UoaW50NjRfdCBzcmNJZCkgewotICAgIEFMT0dWKCJwbGF5TmV4dERhdGFTb3VyY2UoJXApIiwgdGhpcyk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIG1TcmNJZCA9IHNyY0lkOwotICAgIG1QbGF5ZXItPnBsYXlOZXh0RGF0YVNvdXJjZShzcmNJZCk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c2V0VmlkZW9TdXJmYWNlVGV4dHVyZShjb25zdCBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gJm53dykgewotICAgIEFMT0dWKCJzZXRWaWRlb1N1cmZhY2VUZXh0dXJlKCVwKSIsIHRoaXMpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobVNldFN1cmZhY2VJblByb2dyZXNzKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKG1TdGF0ZSkgewotICAgICAgICBjYXNlIFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkc6Ci0gICAgICAgIGNhc2UgU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1M6Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIG1TZXRTdXJmYWNlSW5Qcm9ncmVzcyA9IHRydWU7Ci0KLSAgICBtUGxheWVyLT5zZXRWaWRlb1N1cmZhY2VUZXh0dXJlQXN5bmMobnd3KTsKLQotICAgIHdoaWxlIChtU2V0U3VyZmFjZUluUHJvZ3Jlc3MpIHsKLSAgICAgICAgbUNvbmRpdGlvbi53YWl0KG1Mb2NrKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0QnVmZmVyaW5nU2V0dGluZ3MoQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZykgewotICAgIEFMT0dWKCJnZXRCdWZmZXJpbmdTZXR0aW5ncyglcCkiLCB0aGlzKTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfSURMRSkgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1QbGF5ZXItPmdldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgewotICAgIEFMT0dWKCJzZXRCdWZmZXJpbmdTZXR0aW5ncyglcCkiLCB0aGlzKTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChtU3RhdGUgPT0gU1RBVEVfSURMRSkgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1QbGF5ZXItPnNldEJ1ZmZlcmluZ1NldHRpbmdzKGJ1ZmZlcmluZyk7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6cHJlcGFyZUFzeW5jKCkgewotICAgIEFMT0dWKCJwcmVwYXJlQXN5bmMoJXApIiwgdGhpcyk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHN3aXRjaCAobVN0YXRlKSB7Ci0gICAgICAgIGNhc2UgU1RBVEVfVU5QUkVQQVJFRDoKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BSRVBBUklORzsKLSAgICAgICAgICAgIG1QbGF5ZXItPnByZXBhcmVBc3luYygpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRUQ6Ci0gICAgICAgICAgICAvLyB0aGlzIGlzIHJlYWxseSBqdXN0IHBhdXNlZC4gaGFuZGxlIGFzIHNlZWsgdG8gc3RhcnQKLSAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOwotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOwotICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCwgTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQyAvKiBtb2RlICovLAotICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIG5lZWROb3RpZnkgKi8pOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH07Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c3RhcnQoKSB7Ci0gICAgQUxPR0QoInN0YXJ0KCVwKSwgc3RhdGUgaXMgJWQsIGVvcyBpcyAlZCIsIHRoaXMsIG1TdGF0ZSwgbUF0RU9TKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiBzdGFydF9sKCk7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c3RhcnRfbCgpIHsKLSAgICBzd2l0Y2ggKG1TdGF0ZSkgewotICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDoKLSAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKLSAgICAgICAgewotICAgICAgICAgICAgbVBsYXllci0+c3RhcnQoKTsKLSAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBTVEFURV9SVU5OSU5HOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobUF0RU9TKSB7Ci0gICAgICAgICAgICAgICAgbVBsYXllci0+c2Vla1RvQXN5bmMoMCk7Ci0gICAgICAgICAgICAgICAgbUF0RU9TID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbVBvc2l0aW9uVXMgPSAtMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBTVEFURV9SVU5OSU5HOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OnN0b3AoKSB7Ci0gICAgQUxPR0QoInN0b3AoJXApIiwgdGhpcyk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHN3aXRjaCAobVN0YXRlKSB7Ci0gICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKLSAgICAgICAgICAgIG1QbGF5ZXItPnBhdXNlKCk7Ci0gICAgICAgICAgICAvLyBmYWxsIHRocm91Z2gKLQotICAgICAgICBjYXNlIFNUQVRFX1BBVVNFRDoKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7Ci0gICAgICAgICAgICAvL25vdGlmeUxpc3RlbmVyX2woTUVESUEyX1NUT1BQRUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEOgotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUklORzoKLSAgICAgICAgY2FzZSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDoKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1NUT1BQRUQ7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpwYXVzZSgpIHsKLSAgICBBTE9HRCgicGF1c2UoJXApIiwgdGhpcyk7Ci0gICAgLy8gVGhlIE51UGxheWVyUmVuZGVyZXIgbWF5IGdldCBmbHVzaGVkIGlmIHBhdXNlIGZvciBsb25nIGVub3VnaCwgZS5nLiB0aGUgcGF1c2UgdGltZW91dCB0ZWFyCi0gICAgLy8gZG93biBmb3IgYXVkaW8gb2ZmbG9hZCBtb2RlLiBJZiB0aGF0IGhhcHBlbnMsIHRoZSBOdVBsYXllclJlbmRlcmVyIHdpbGwgbm8gbG9uZ2VyIGtub3cgdGhlCi0gICAgLy8gY3VycmVudCBwb3NpdGlvbi4gU28gc2ltaWxhciB0byBzZWVrVG8sIHVwZGF0ZSB8bVBvc2l0aW9uVXN8IHRvIHRoZSBwYXVzZSBwb3NpdGlvbiBieSBjYWxsaW5nCi0gICAgLy8gZ2V0Q3VycmVudFBvc2l0aW9uIGhlcmUuCi0gICAgaW50NjRfdCB1bnVzZWQ7Ci0gICAgZ2V0Q3VycmVudFBvc2l0aW9uKCZ1bnVzZWQpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHN3aXRjaCAobVN0YXRlKSB7Ci0gICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgotICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOgotICAgICAgICAgICAgcmV0dXJuIE9LOwotCi0gICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzoKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX1BBVVNFRDsKLSAgICAgICAgICAgIG1QbGF5ZXItPnBhdXNlKCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHJldHVybiBPSzsKLX0KLQotYm9vbCBOdVBsYXllcjJEcml2ZXI6OmlzUGxheWluZygpIHsKLSAgICByZXR1cm4gbVN0YXRlID09IFNUQVRFX1JVTk5JTkcgJiYgIW1BdEVPUzsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpzZXRQbGF5YmFja1NldHRpbmdzKGNvbnN0IEF1ZGlvUGxheWJhY2tSYXRlICZyYXRlKSB7Ci0gICAgc3RhdHVzX3QgZXJyID0gbVBsYXllci0+c2V0UGxheWJhY2tTZXR0aW5ncyhyYXRlKTsKLSAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIC8vIHRyeSB0byB1cGRhdGUgcG9zaXRpb24KLSAgICAgICAgaW50NjRfdCB1bnVzZWQ7Ci0gICAgICAgIGdldEN1cnJlbnRQb3NpdGlvbigmdW51c2VkKTsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgaWYgKHJhdGUubVNwZWVkID09IDAuZiAmJiBtU3RhdGUgPT0gU1RBVEVfUlVOTklORykgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfUEFVU0VEOwotICAgICAgICB9IGVsc2UgaWYgKHJhdGUubVNwZWVkICE9IDAuZgotICAgICAgICAgICAgICAgICYmIChtU3RhdGUgPT0gU1RBVEVfUEFVU0VECi0gICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRAotICAgICAgICAgICAgICAgICAgICB8fCBtU3RhdGUgPT0gU1RBVEVfUFJFUEFSRUQpKSB7Ci0gICAgICAgICAgICBlcnIgPSBzdGFydF9sKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlKSB7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPmdldFBsYXliYWNrU2V0dGluZ3MocmF0ZSk7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpIHsKLSAgICByZXR1cm4gbVBsYXllci0+c2V0U3luY1NldHRpbmdzKHN5bmMsIHZpZGVvRnBzSGludCk7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6Z2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jLCBmbG9hdCAqdmlkZW9GcHMpIHsKLSAgICByZXR1cm4gbVBsYXllci0+Z2V0U3luY1NldHRpbmdzKHN5bmMsIHZpZGVvRnBzKTsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpzZWVrVG8oaW50NjRfdCBtc2VjLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKSB7Ci0gICAgQUxPR0QoInNlZWtUbyglcCkgKCVsbGQgbXMsICVkKSBhdCBzdGF0ZSAlZCIsIHRoaXMsIChsb25nIGxvbmcpbXNlYywgbW9kZSwgbVN0YXRlKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaW50NjRfdCBzZWVrVGltZVVzID0gbXNlYyAqIDEwMDBMTDsKLQotICAgIHN3aXRjaCAobVN0YXRlKSB7Ci0gICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSRUQ6Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQ6Ci0gICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgotICAgICAgICBjYXNlIFNUQVRFX1JVTk5JTkc6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1BdEVPUyA9IGZhbHNlOwotICAgICAgICAgICAgbVNlZWtJblByb2dyZXNzID0gdHJ1ZTsKLSAgICAgICAgICAgIG1QbGF5ZXItPnNlZWtUb0FzeW5jKHNlZWtUaW1lVXMsIG1vZGUsIHRydWUgLyogbmVlZE5vdGlmeSAqLyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgbVBvc2l0aW9uVXMgPSBzZWVrVGltZVVzOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbXNlYykgewotICAgIGludDY0X3QgdGVtcFVzID0gMDsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChtU2Vla0luUHJvZ3Jlc3MgfHwgKG1TdGF0ZSA9PSBTVEFURV9QQVVTRUQgJiYgIW1BdEVPUykpIHsKLSAgICAgICAgICAgIHRlbXBVcyA9IChtUG9zaXRpb25VcyA8PSAwKSA/IDAgOiBtUG9zaXRpb25VczsKLSAgICAgICAgICAgICptc2VjID0gZGl2Um91bmQodGVtcFVzLCAoaW50NjRfdCkoMTAwMCkpOwotICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgcmV0ID0gbVBsYXllci0+Z2V0Q3VycmVudFBvc2l0aW9uKCZ0ZW1wVXMpOwotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAvLyBXZSBuZWVkIHRvIGNoZWNrIG1TZWVrSW5Qcm9ncmVzcyBoZXJlIGJlY2F1c2UgbVBsYXllci0+c2Vla1RvQXN5bmMgaXMgYW4gYXN5bmMgY2FsbCwgd2hpY2gKLSAgICAvLyBtZWFucyBnZXRDdXJyZW50UG9zaXRpb24gY2FuIGJlIGNhbGxlZCBiZWZvcmUgc2VlayBpcyBjb21wbGV0ZWQuIElvdywgcmVuZGVyZXIgbWF5IHJldHVybiBhCi0gICAgLy8gcG9zaXRpb24gdmFsdWUgdGhhdCdzIGRpZmZlcmVudCB0aGUgc2VlayB0byBwb3NpdGlvbi4KLSAgICBpZiAocmV0ICE9IE9LKSB7Ci0gICAgICAgIHRlbXBVcyA9IChtUG9zaXRpb25VcyA8PSAwKSA/IDAgOiBtUG9zaXRpb25VczsKLSAgICB9IGVsc2UgewotICAgICAgICBtUG9zaXRpb25VcyA9IHRlbXBVczsKLSAgICB9Ci0gICAgKm1zZWMgPSBkaXZSb3VuZCh0ZW1wVXMsIChpbnQ2NF90KSgxMDAwKSk7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmdldER1cmF0aW9uKGludDY0X3QgKm1zZWMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgaWYgKG1EdXJhdGlvblVzIDwgMCkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICAqbXNlYyA9IChtRHVyYXRpb25VcyArIDUwMExMKSAvIDEwMDA7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyRHJpdmVyOjp1cGRhdGVNZXRyaWNzKGNvbnN0IGNoYXIgKndoZXJlKSB7Ci0gICAgaWYgKHdoZXJlID09IE5VTEwpIHsKLSAgICAgICAgd2hlcmUgPSAidW5rbm93biI7Ci0gICAgfQotICAgIEFMT0dWKCJ1cGRhdGVNZXRyaWNzKCVwKSBmcm9tICVzIGF0IHN0YXRlICVkIiwgdGhpcywgd2hlcmUsIG1TdGF0ZSk7Ci0KLSAgICAvLyBnYXRoZXIgdGhlIGZpbmFsIHN0YXRzIGZvciB0aGlzIHJlY29yZAotICAgIFZlY3RvcjxzcDxBTWVzc2FnZT4+IHRyYWNrU3RhdHM7Ci0gICAgbVBsYXllci0+Z2V0U3RhdHMoJnRyYWNrU3RhdHMpOwotCi0gICAgaWYgKHRyYWNrU3RhdHMuc2l6ZSgpID4gMCkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRyYWNrU3RhdHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmc3RhdHMgPSB0cmFja1N0YXRzLml0ZW1BdChpKTsKLQotICAgICAgICAgICAgQVN0cmluZyBtaW1lOwotICAgICAgICAgICAgc3RhdHMtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSk7Ci0KLSAgICAgICAgICAgIEFTdHJpbmcgbmFtZTsKLSAgICAgICAgICAgIHN0YXRzLT5maW5kU3RyaW5nKCJjb21wb25lbnQtbmFtZSIsICZuYW1lKTsKLQotICAgICAgICAgICAgaWYgKG1pbWUuc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKLSAgICAgICAgICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7Ci0gICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1BsYXllclZNaW1lLCBtaW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIGlmICghbmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJWQ29kZWMsIG5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKHN0YXRzLT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgc3RhdHMtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJXaWR0aCwgd2lkdGgpOwotICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllckhlaWdodCwgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnQ2NF90IG51bUZyYW1lc1RvdGFsID0gMDsKLSAgICAgICAgICAgICAgICBpbnQ2NF90IG51bUZyYW1lc0Ryb3BwZWQgPSAwOwotICAgICAgICAgICAgICAgIHN0YXRzLT5maW5kSW50NjQoImZyYW1lcy10b3RhbCIsICZudW1GcmFtZXNUb3RhbCk7Ci0gICAgICAgICAgICAgICAgc3RhdHMtPmZpbmRJbnQ2NCgiZnJhbWVzLWRyb3BwZWQtb3V0cHV0IiwgJm51bUZyYW1lc0Ryb3BwZWQpOwotCi0gICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtQbGF5ZXJGcmFtZXMsIG51bUZyYW1lc1RvdGFsKTsKLSAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllckZyYW1lc0Ryb3BwZWQsIG51bUZyYW1lc0Ryb3BwZWQpOwotCi0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWltZS5zdGFydHNXaXRoKCJhdWRpby8iKSkgewotICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJBTWltZSwgbWltZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBpZiAoIW5hbWUuZW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyQUNvZGVjLCBuYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGFsd2F5cyBwcm92aWRlIGR1cmF0aW9uIGFuZCBwbGF5aW5nIHRpbWUsIGV2ZW4gaWYgdGhleSBoYXZlIDAvdW5rbm93biB2YWx1ZXMuCi0KLSAgICAvLyBnZXREdXJhdGlvbigpIHVzZXMgbUxvY2sgZm9yIG11dGV4IC0tIGNhcmVmdWwgd2hlcmUgd2UgdXNlIGl0LgotICAgIGludDY0X3QgZHVyYXRpb25fbXMgPSAtMTsKLSAgICBnZXREdXJhdGlvbigmZHVyYXRpb25fbXMpOwotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyRHVyYXRpb24sIGR1cmF0aW9uX21zKTsKLQotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyUGxheWluZywgKG1QbGF5aW5nVGltZVVzKzUwMCkvMTAwMCApOwotCi0gICAgaWYgKG1SZWJ1ZmZlcmluZ0V2ZW50cyAhPSAwKSB7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyUmVidWZmZXJpbmcsIChtUmVidWZmZXJpbmdUaW1lVXMrNTAwKS8xMDAwICk7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyUmVidWZmZXJpbmdDb3VudCwgbVJlYnVmZmVyaW5nRXZlbnRzKTsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJSZWJ1ZmZlcmluZ0F0RXhpdCwgbVJlYnVmZmVyaW5nQXRFeGl0KTsKLSAgICB9Ci0KLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrUGxheWVyRGF0YVNvdXJjZVR5cGUsIG1QbGF5ZXItPmdldERhdGFTb3VyY2VUeXBlKCkpOwotfQotCi0KLXZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpsb2dNZXRyaWNzKGNvbnN0IGNoYXIgKndoZXJlKSB7Ci0gICAgaWYgKHdoZXJlID09IE5VTEwpIHsKLSAgICAgICAgd2hlcmUgPSAidW5rbm93biI7Ci0gICAgfQotICAgIEFMT0dWKCJsb2dNZXRyaWNzKCVwKSBmcm9tICVzIGF0IHN0YXRlICVkIiwgdGhpcywgd2hlcmUsIG1TdGF0ZSk7Ci0KLSAgICBpZiAobUFuYWx5dGljc0l0ZW0gPT0gTlVMTCB8fCBtQW5hbHl0aWNzSXRlbS0+aXNFbmFibGVkKCkgPT0gZmFsc2UpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIGxvZyBvbmx5IG5vbi1lbXB0eSByZWNvcmRzCi0gICAgLy8gd2UgYWx3YXlzIHVwZGF0ZU1ldHJpY3MoKSBiZWZvcmUgd2UgZ2V0IGhlcmUKLSAgICAvLyBhbmQgdGhhdCBhbHdheXMgaW5qZWN0cyAzIGZpZWxkcyAoZHVyYXRpb24sIHBsYXlpbmcgdGltZSwgYW5kCi0gICAgLy8gZGF0YXNvdXJjZSkgaW50byB0aGUgcmVjb3JkLgotICAgIC8vIFNvIHRoZSBjYW5vbmljYWwgImVtcHR5IiByZWNvcmQgaGFzIDMgZWxlbWVudHMgaW4gaXQuCi0gICAgaWYgKG1BbmFseXRpY3NJdGVtLT5jb3VudCgpID4gMykgewotCi0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZWxmcmVjb3JkKCk7Ci0KLSAgICAgICAgLy8gcmUtaW5pdCBpbiBjYXNlIHdlIHByZXBhcmUoKSBhbmQgc3RhcnQoKSBhZ2Fpbi4KLSAgICAgICAgZGVsZXRlIG1BbmFseXRpY3NJdGVtIDsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtLZXlQbGF5ZXIpOwotICAgICAgICBpZiAobUFuYWx5dGljc0l0ZW0pIHsKLSAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRVaWQobUNsaWVudFVpZCk7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiZGlkIG5vdCBoYXZlIGFueXRoaW5nIHRvIHJlY29yZCIpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpyZXNldCgpIHsKLSAgICBBTE9HRCgicmVzZXQoJXApIGF0IHN0YXRlICVkIiwgdGhpcywgbVN0YXRlKTsKLQotICAgIHVwZGF0ZU1ldHJpY3MoInJlc2V0Iik7Ci0gICAgbG9nTWV0cmljcygicmVzZXQiKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBzd2l0Y2ggKG1TdGF0ZSkgewotICAgICAgICBjYXNlIFNUQVRFX0lETEU6Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0KLSAgICAgICAgY2FzZSBTVEFURV9TRVRfREFUQVNPVVJDRV9QRU5ESU5HOgotICAgICAgICBjYXNlIFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTOgotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotCi0gICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSSU5HOgotICAgICAgICB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKG1TcmNJZCwgTUVESUEyX1BSRVBBUkVEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfU1RPUFBFRCkgewotICAgICAgICAvLyBub3RpZnlMaXN0ZW5lcl9sKE1FRElBMl9TVE9QUEVEKTsKLSAgICB9Ci0KLSAgICBtU3RhdGUgPSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUzsKLSAgICBtUGxheWVyLT5yZXNldEFzeW5jKCk7Ci0KLSAgICB3aGlsZSAobVN0YXRlID09IFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTKSB7Ci0gICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgbUR1cmF0aW9uVXMgPSAtMTsKLSAgICBtUG9zaXRpb25VcyA9IC0xOwotICAgIG1Mb29waW5nID0gZmFsc2U7Ci0gICAgbVBsYXlpbmdUaW1lVXMgPSAwOwotICAgIG1SZWJ1ZmZlcmluZ1RpbWVVcyA9IDA7Ci0gICAgbVJlYnVmZmVyaW5nRXZlbnRzID0gMDsKLSAgICBtUmVidWZmZXJpbmdBdEV4aXQgPSBmYWxzZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlBdChpbnQ2NF90IG1lZGlhVGltZVVzKSB7Ci0gICAgQUxPR1YoIm5vdGlmeUF0KCVwKSwgdGltZTolbGxkIiwgdGhpcywgKGxvbmcgbG9uZyltZWRpYVRpbWVVcyk7Ci0gICAgcmV0dXJuIG1QbGF5ZXItPm5vdGlmeUF0KG1lZGlhVGltZVVzKTsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpzZXRMb29waW5nKGludCBsb29wKSB7Ci0gICAgbUxvb3BpbmcgPSBsb29wICE9IDA7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6Omludm9rZShjb25zdCBQYXJjZWwgJnJlcXVlc3QsIFBhcmNlbCAqcmVwbHkpIHsKLSAgICBpZiAocmVwbHkgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgicmVwbHkgaXMgYSBOVUxMIHBvaW50ZXIiKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBpbnQzMl90IG1ldGhvZElkOwotICAgIHN0YXR1c190IHJldCA9IHJlcXVlc3QucmVhZEludDMyKCZtZXRob2RJZCk7Ci0gICAgaWYgKHJldCAhPSBPSykgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHJldHJpZXZlIHRoZSByZXF1ZXN0ZWQgbWV0aG9kIHRvIGludm9rZSwgZXJyKCVkKSIsIHJldCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgc3dpdGNoIChtZXRob2RJZCkgewotICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1NFVF9WSURFT19TQ0FMSU5HX01PREU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBtb2RlID0gcmVxdWVzdC5yZWFkSW50MzIoKTsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZXRWaWRlb1NjYWxpbmdNb2RlKG1vZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBNRURJQV9QTEFZRVIyX0lOVk9LRV9JRF9HRVRfVFJBQ0tfSU5GTzoKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPmdldFRyYWNrSW5mbyhyZXBseSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1NFTEVDVF9UUkFDSzoKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHRyYWNrSW5kZXggPSByZXF1ZXN0LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgaW50NjRfdCBtc2VjID0gMDsKLSAgICAgICAgICAgIC8vIGdldEN1cnJlbnRQb3NpdGlvbiBzaG91bGQgYWx3YXlzIHJldHVybiBPSwotICAgICAgICAgICAgZ2V0Q3VycmVudFBvc2l0aW9uKCZtc2VjKTsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyLT5zZWxlY3RUcmFjayh0cmFja0luZGV4LCB0cnVlIC8qIHNlbGVjdCAqLywgbXNlYyAqIDEwMDBMTCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE1FRElBX1BMQVlFUjJfSU5WT0tFX0lEX1VOU0VMRUNUX1RSQUNLOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgdHJhY2tJbmRleCA9IHJlcXVlc3QucmVhZEludDMyKCk7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXllci0+c2VsZWN0VHJhY2sodHJhY2tJbmRleCwgZmFsc2UgLyogc2VsZWN0ICovLCAweGRlYWRiZWVmIC8qIG5vdCB1c2VkICovKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgTUVESUFfUExBWUVSMl9JTlZPS0VfSURfR0VUX1NFTEVDVEVEX1RSQUNLOgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHR5cGUgPSByZXF1ZXN0LnJlYWRJbnQzMigpOwotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXItPmdldFNlbGVjdGVkVHJhY2sodHlwZSwgcmVwbHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMkRyaXZlcjo6c2V0QXVkaW9TaW5rKGNvbnN0IHNwPEF1ZGlvU2luaz4gJmF1ZGlvU2luaykgewotICAgIG1QbGF5ZXItPnNldEF1ZGlvU2luayhhdWRpb1NpbmspOwotICAgIG1BdWRpb1NpbmsgPSBhdWRpb1Npbms7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6c2V0UGFyYW1ldGVyKAotICAgICAgICBpbnQgLyoga2V5ICovLCBjb25zdCBQYXJjZWwgJiAvKiByZXF1ZXN0ICovKSB7Ci0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KSB7Ci0KLSAgICBpZiAoa2V5ID09IEZPVVJDQygnbScsJ3QnLCdyJywnWCcpKSB7Ci0gICAgICAgIC8vIG10clggLS0gYSBwbGF5IG9uICdtZXRyaWNzJyAobm90IG1hdHJpeCkKLSAgICAgICAgLy8gZ2F0aGVyIGN1cnJlbnQgaW5mbyBhbGwgdG9nZXRoZXIsIHBhcmNlbCBpdCwgYW5kIHNlbmQgaXQgYmFjawotICAgICAgICB1cGRhdGVNZXRyaWNzKCJhcGkiKTsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPndyaXRlVG9QYXJjZWwocmVwbHkpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfQotCi0gICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjJEcml2ZXI6OmdldE1ldGFkYXRhKAotICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgLyogaWRzICovLCBQYXJjZWwgKnJlY29yZHMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgdXNpbmcgbWVkaWE6Ok1ldGFkYXRhOwotCi0gICAgTWV0YWRhdGEgbWV0YShyZWNvcmRzKTsKLQotICAgIG1ldGEuYXBwZW5kQm9vbCgKLSAgICAgICAgICAgIE1ldGFkYXRhOjprUGF1c2VBdmFpbGFibGUsCi0gICAgICAgICAgICBtUGxheWVyRmxhZ3MgJiBOdVBsYXllcjI6OlNvdXJjZTo6RkxBR19DQU5fUEFVU0UpOwotCi0gICAgbWV0YS5hcHBlbmRCb29sKAotICAgICAgICAgICAgTWV0YWRhdGE6OmtTZWVrQmFja3dhcmRBdmFpbGFibGUsCi0gICAgICAgICAgICBtUGxheWVyRmxhZ3MgJiBOdVBsYXllcjI6OlNvdXJjZTo6RkxBR19DQU5fU0VFS19CQUNLV0FSRCk7Ci0KLSAgICBtZXRhLmFwcGVuZEJvb2woCi0gICAgICAgICAgICBNZXRhZGF0YTo6a1NlZWtGb3J3YXJkQXZhaWxhYmxlLAotICAgICAgICAgICAgbVBsYXllckZsYWdzICYgTnVQbGF5ZXIyOjpTb3VyY2U6OkZMQUdfQ0FOX1NFRUtfRk9SV0FSRCk7Ci0KLSAgICBtZXRhLmFwcGVuZEJvb2woCi0gICAgICAgICAgICBNZXRhZGF0YTo6a1NlZWtBdmFpbGFibGUsCi0gICAgICAgICAgICBtUGxheWVyRmxhZ3MgJiBOdVBsYXllcjI6OlNvdXJjZTo6RkxBR19DQU5fU0VFSyk7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlSZXNldENvbXBsZXRlKGludDY0X3QgLyogc3JjSWQgKi8pIHsKLSAgICBBTE9HRCgibm90aWZ5UmVzZXRDb21wbGV0ZSglcCkiLCB0aGlzKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgQ0hFQ0tfRVEobVN0YXRlLCBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUyk7Ci0gICAgbVN0YXRlID0gU1RBVEVfSURMRTsKLSAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotfQotCi12b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5U2V0U3VyZmFjZUNvbXBsZXRlKGludDY0X3QgLyogc3JjSWQgKi8pIHsKLSAgICBBTE9HVigibm90aWZ5U2V0U3VyZmFjZUNvbXBsZXRlKCVwKSIsIHRoaXMpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBDSEVDSyhtU2V0U3VyZmFjZUluUHJvZ3Jlc3MpOwotICAgIG1TZXRTdXJmYWNlSW5Qcm9ncmVzcyA9IGZhbHNlOwotCi0gICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKLX0KLQotdm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeUR1cmF0aW9uKGludDY0X3QgLyogc3JjSWQgKi8sIGludDY0X3QgZHVyYXRpb25VcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbUR1cmF0aW9uVXMgPSBkdXJhdGlvblVzOwotfQotCi12b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5TW9yZVBsYXlpbmdUaW1lVXMoaW50NjRfdCAvKiBzcmNJZCAqLywgaW50NjRfdCBwbGF5aW5nVXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1QbGF5aW5nVGltZVVzICs9IHBsYXlpbmdVczsKLX0KLQotdm9pZCBOdVBsYXllcjJEcml2ZXI6Om5vdGlmeU1vcmVSZWJ1ZmZlcmluZ1RpbWVVcyhpbnQ2NF90IC8qIHNyY0lkICovLCBpbnQ2NF90IHJlYnVmZmVyaW5nVXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1SZWJ1ZmZlcmluZ1RpbWVVcyArPSByZWJ1ZmZlcmluZ1VzOwotICAgIG1SZWJ1ZmZlcmluZ0V2ZW50cysrOwotfQotCi12b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5UmVidWZmZXJpbmdXaGVuRXhpdChpbnQ2NF90IC8qIHNyY0lkICovLCBib29sIHN0YXR1cykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbVJlYnVmZmVyaW5nQXRFeGl0ID0gc3RhdHVzOwotfQotCi12b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5U2Vla0NvbXBsZXRlKGludDY0X3Qgc3JjSWQpIHsKLSAgICBBTE9HVigibm90aWZ5U2Vla0NvbXBsZXRlKCVwKSIsIHRoaXMpOwotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbVNlZWtJblByb2dyZXNzID0gZmFsc2U7Ci0gICAgbm90aWZ5U2Vla0NvbXBsZXRlX2woc3JjSWQpOwotfQotCi12b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5U2Vla0NvbXBsZXRlX2woaW50NjRfdCBzcmNJZCkgewotICAgIGJvb2wgd2FzU2Vla2luZyA9IHRydWU7Ci0gICAgaWYgKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJJTkcpIHsKLSAgICAgICAgd2FzU2Vla2luZyA9IGZhbHNlOwotICAgICAgICBtU3RhdGUgPSBTVEFURV9TVE9QUEVEX0FORF9QUkVQQVJFRDsKLSAgICAgICAgbUNvbmRpdGlvbi5icm9hZGNhc3QoKTsKLSAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBTVEFURV9TVE9QUEVEKSB7Ci0gICAgICAgIC8vIG5vIG5lZWQgdG8gbm90aWZ5IGxpc3RlbmVyCi0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbm90aWZ5TGlzdGVuZXJfbChzcmNJZCwgd2FzU2Vla2luZyA/IE1FRElBMl9TRUVLX0NPTVBMRVRFIDogTUVESUEyX1BSRVBBUkVEKTsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpkdW1wKAotICAgICAgICBpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4gJiAvKiBhcmdzICovKSBjb25zdCB7Ci0KLSAgICBWZWN0b3I8c3A8QU1lc3NhZ2U+ID4gdHJhY2tTdGF0czsKLSAgICBtUGxheWVyLT5nZXRTdGF0cygmdHJhY2tTdGF0cyk7Ci0KLSAgICBBU3RyaW5nIGxvZ1N0cmluZygiIE51UGxheWVyMlxuIik7Ci0gICAgY2hhciBidWZbMjU2XSA9IHswfTsKLQotICAgIGJvb2wgbG9ja2VkID0gZmFsc2U7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRHVtcExvY2tSZXRyaWVzOyArK2kpIHsKLSAgICAgICAgaWYgKG1Mb2NrLnRyeUxvY2soKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHVzbGVlcChrRHVtcExvY2tTbGVlcFVzKTsKLSAgICB9Ci0KLSAgICBpZiAobG9ja2VkKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIgIHN0YXRlKCVkKSwgYXRFT1MoJWQpLCBsb29waW5nKCVkKSwgYXV0b0xvb3AoJWQpXG4iLAotICAgICAgICAgICAgICAgIG1TdGF0ZSwgbUF0RU9TLCBtTG9vcGluZywgbUF1dG9Mb29wKTsKLSAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiAgTlBEKCVwKSBsb2NrIGlzIHRha2VuXG4iLCB0aGlzKTsKLSAgICB9Ci0gICAgbG9nU3RyaW5nLmFwcGVuZChidWYpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0cmFja1N0YXRzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmc3RhdHMgPSB0cmFja1N0YXRzLml0ZW1BdChpKTsKLQotICAgICAgICBBU3RyaW5nIG1pbWU7Ci0gICAgICAgIGlmIChzdGF0cy0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSkgewotICAgICAgICAgICAgc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgIiAgbWltZSglcylcbiIsIG1pbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICBsb2dTdHJpbmcuYXBwZW5kKGJ1Zik7Ci0gICAgICAgIH0KLQotICAgICAgICBBU3RyaW5nIG5hbWU7Ci0gICAgICAgIGlmIChzdGF0cy0+ZmluZFN0cmluZygiY29tcG9uZW50LW5hbWUiLCAmbmFtZSkpIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIgICAgZGVjb2RlciglcylcbiIsIG5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICBsb2dTdHJpbmcuYXBwZW5kKGJ1Zik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgewotICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OwotICAgICAgICAgICAgaWYgKHN0YXRzLT5maW5kSW50MzIoIndpZHRoIiwgJndpZHRoKQotICAgICAgICAgICAgICAgICAgICAmJiBzdGF0cy0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSkgewotICAgICAgICAgICAgICAgIHNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICIgICAgcmVzb2x1dGlvbiglZCB4ICVkKVxuIiwgd2lkdGgsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgbG9nU3RyaW5nLmFwcGVuZChidWYpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQ2NF90IG51bUZyYW1lc1RvdGFsID0gMDsKLSAgICAgICAgICAgIGludDY0X3QgbnVtRnJhbWVzRHJvcHBlZCA9IDA7Ci0KLSAgICAgICAgICAgIHN0YXRzLT5maW5kSW50NjQoImZyYW1lcy10b3RhbCIsICZudW1GcmFtZXNUb3RhbCk7Ci0gICAgICAgICAgICBzdGF0cy0+ZmluZEludDY0KCJmcmFtZXMtZHJvcHBlZC1vdXRwdXQiLCAmbnVtRnJhbWVzRHJvcHBlZCk7Ci0gICAgICAgICAgICBzbnByaW50ZihidWYsIHNpemVvZihidWYpLCAiICAgIG51bUZyYW1lc1RvdGFsKCVsbGQpLCBudW1GcmFtZXNEcm9wcGVkKCVsbGQpLCAiCi0gICAgICAgICAgICAgICAgICAgICAicGVyY2VudGFnZURyb3BwZWQoJS4yZiUlKVxuIiwKLSAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbnVtRnJhbWVzVG90YWwsCi0gICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKW51bUZyYW1lc0Ryb3BwZWQsCi0gICAgICAgICAgICAgICAgICAgICBudW1GcmFtZXNUb3RhbCA9PSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAwLjAgOiAoZG91YmxlKShudW1GcmFtZXNEcm9wcGVkICogMTAwKSAvIG51bUZyYW1lc1RvdGFsKTsKLSAgICAgICAgICAgIGxvZ1N0cmluZy5hcHBlbmQoYnVmKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dJKCIlcyIsIGxvZ1N0cmluZy5jX3N0cigpKTsKLQotICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgIEZJTEUgKm91dCA9IGZkb3BlbihkdXAoZmQpLCAidyIpOwotICAgICAgICBmcHJpbnRmKG91dCwgIiVzIiwgbG9nU3RyaW5nLmNfc3RyKCkpOwotICAgICAgICBmY2xvc2Uob3V0KTsKLSAgICAgICAgb3V0ID0gTlVMTDsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKLSAgICAgICAgY2FzZSBrV2hhdE5vdGlmeUxpc3RlbmVyOiB7Ci0gICAgICAgICAgICBpbnQ2NF90IHNyY0lkOwotICAgICAgICAgICAgaW50MzJfdCBtc2dJZDsKLSAgICAgICAgICAgIGludDMyX3QgZXh0MSA9IDA7Ci0gICAgICAgICAgICBpbnQzMl90IGV4dDIgPSAwOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInNyY0lkIiwgJnNyY0lkKSk7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigibWVzc2FnZUlkIiwgJm1zZ0lkKSk7Ci0gICAgICAgICAgICBtc2ctPmZpbmRJbnQzMigiZXh0MSIsICZleHQxKTsKLSAgICAgICAgICAgIG1zZy0+ZmluZEludDMyKCJleHQyIiwgJmV4dDIpOwotICAgICAgICAgICAgc3A8UGFyY2VsV3JhcHBlcj4gaW47Ci0gICAgICAgICAgICBzcDxSZWZCYXNlPiBvYmo7Ci0gICAgICAgICAgICBpZiAobXNnLT5maW5kT2JqZWN0KCJwYXJjZWwiLCAmb2JqKSAmJiBvYmogIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGluID0gc3RhdGljX2Nhc3Q8UGFyY2VsV3JhcHBlciAqPihvYmouZ2V0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VuZEV2ZW50KHNyY0lkLCBtc2dJZCwgZXh0MSwgZXh0MiwgKGluID09IE5VTEwgPyBOVUxMIDogaW4tPmdldFBhcmNlbCgpKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5TGlzdGVuZXIoCi0gICAgICAgIGludDY0X3Qgc3JjSWQsIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbikgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbm90aWZ5TGlzdGVuZXJfbChzcmNJZCwgbXNnLCBleHQxLCBleHQyLCBpbik7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlMaXN0ZW5lcl9sKAotICAgICAgICBpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSwgaW50IGV4dDIsIGNvbnN0IFBhcmNlbCAqaW4pIHsKLSAgICBBTE9HRCgibm90aWZ5TGlzdGVuZXJfbCglcCksICglbGxkLCAlZCwgJWQsICVkLCAlZCksIGxvb3Agc2V0dGluZyglZCwgJWQpIiwKLSAgICAgICAgICAgIHRoaXMsIChsb25nIGxvbmcpc3JjSWQsIG1zZywgZXh0MSwgZXh0MiwKLSAgICAgICAgICAgIChpbiA9PSBOVUxMID8gLTEgOiAoaW50KWluLT5kYXRhU2l6ZSgpKSwgbUF1dG9Mb29wLCBtTG9vcGluZyk7Ci0gICAgaWYgKHNyY0lkID09IG1TcmNJZCkgewotICAgICAgICBzd2l0Y2ggKG1zZykgewotICAgICAgICAgICAgY2FzZSBNRURJQTJfUExBWUJBQ0tfQ09NUExFVEU6Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSAhPSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUykgewotICAgICAgICAgICAgICAgICAgICBpZiAobUF1dG9Mb29wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSA9IG1BdWRpb1NpbmstPmdldEF1ZGlvU3RyZWFtVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX05PVElGSUNBVElPTikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJkaXNhYmxpbmcgYXV0by1sb29wIGZvciBub3RpZmljYXRpb24iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXV0b0xvb3AgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobUxvb3BpbmcgfHwgbUF1dG9Mb29wKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheWVyLT5zZWVrVG9Bc3luYygwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcmVuZGVyZXIgaGFzIHN0b3BwZWQgdGhlIHNpbmsgYXQgdGhlIGVuZCBpbiBvcmRlciB0byBwbGF5IG91dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsYXN0IGxpdHRsZSBiaXQgb2YgYXVkaW8uIEluIGxvb3BpbmcgbW9kZSwgd2UgbmVlZCB0byByZXN0YXJ0IGl0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBkb24ndCBzZW5kIGNvbXBsZXRpb24gZXZlbnQgd2hlbiBsb29waW5nCi0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJwZXJzaXN0LmRlYnVnLnNmLnN0YXRzIiwgZmFsc2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3I8U3RyaW5nMTY+IGFyZ3M7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkdW1wKC0xLCBhcmdzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtUGxheWVyLT5wYXVzZSgpOwotICAgICAgICAgICAgICAgICAgICBtU3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBjYXNlIE1FRElBMl9FUlJPUjoKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyB3aGVuIHdlIGhhdmUgYW4gZXJyb3IsIGFkZCBpdCB0byB0aGUgYW5hbHl0aWNzIGZvciB0aGlzIHBsYXliYWNrLgotICAgICAgICAgICAgICAgIC8vIGV4dDEgaXMgb3VyIHByaW1hcnkgJ2Vycm9yIHR5cGUnIHZhbHVlLiBPbmx5IGFkZCBleHQyIHdoZW4gbm9uLXplcm8uCi0gICAgICAgICAgICAgICAgLy8gW3Rlc3QgYWdhaW5zdCBtc2cgaXMgZHVlIHRvIGZhbGwgdGhyb3VnaCBmcm9tIHByZXZpb3VzIHN3aXRjaCB2YWx1ZV0KLSAgICAgICAgICAgICAgICBpZiAobXNnID09IE1FRElBMl9FUlJPUikgewotICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1BsYXllckVycm9yLCBleHQxKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGV4dDIgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJFcnJvckNvZGUsIGV4dDIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJFcnJvclN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQXRFT1MgPSB0cnVlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE5vdGlmeUxpc3RlbmVyLCB0aGlzKTsKLSAgICBub3RpZnktPnNldEludDY0KCJzcmNJZCIsIHNyY0lkKTsKLSAgICBub3RpZnktPnNldEludDMyKCJtZXNzYWdlSWQiLCBtc2cpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoImV4dDEiLCBleHQxKTsKLSAgICBub3RpZnktPnNldEludDMyKCJleHQyIiwgZXh0Mik7Ci0gICAgbm90aWZ5LT5zZXRPYmplY3QoInBhcmNlbCIsIFBhcmNlbFdyYXBwZXI6OkNyZWF0ZShpbikpOwotICAgIG5vdGlmeS0+cG9zdCgpOwotfQotCi12b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5U2V0RGF0YVNvdXJjZUNvbXBsZXRlZChpbnQ2NF90IC8qIHNyY0lkICovLCBzdGF0dXNfdCBlcnIpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgQ0hFQ0tfRVEobVN0YXRlLCBTVEFURV9TRVRfREFUQVNPVVJDRV9QRU5ESU5HKTsKLQotICAgIG1Bc3luY1Jlc3VsdCA9IGVycjsKLSAgICBtU3RhdGUgPSAoZXJyID09IE9LKSA/IFNUQVRFX1VOUFJFUEFSRUQgOiBTVEFURV9JRExFOwotICAgIG1Db25kaXRpb24uYnJvYWRjYXN0KCk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyRHJpdmVyOjpub3RpZnlQcmVwYXJlQ29tcGxldGVkKGludDY0X3Qgc3JjSWQsIHN0YXR1c190IGVycikgewotICAgIEFMT0dWKCJub3RpZnlQcmVwYXJlQ29tcGxldGVkICVkIiwgZXJyKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAoc3JjSWQgIT0gbVNyY0lkKSB7Ci0gICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgIG5vdGlmeUxpc3RlbmVyX2woc3JjSWQsIE1FRElBMl9QUkVQQVJFRCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBub3RpZnlMaXN0ZW5lcl9sKHNyY0lkLCBNRURJQTJfRVJST1IsIE1FRElBMl9FUlJPUl9VTktOT1dOLCBlcnIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobVN0YXRlICE9IFNUQVRFX1BSRVBBUklORykgewotICAgICAgICAvLyBXZSB3ZXJlIHByZXBhcmluZyBhc3luY2hyb25vdXNseSB3aGVuIHRoZSBjbGllbnQgY2FsbGVkCi0gICAgICAgIC8vIHJlc2V0KCksIHdlIHNlbnQgYSBwcmVtYXR1cmUgInByZXBhcmVkIiBub3RpZmljYXRpb24gYW5kCi0gICAgICAgIC8vIHRoZW4gaW5pdGlhdGVkIHRoZSByZXNldC4gVGhpcyBub3RpZmljYXRpb24gaXMgc3RhbGUuCi0gICAgICAgIENIRUNLKG1TdGF0ZSA9PSBTVEFURV9SRVNFVF9JTl9QUk9HUkVTUyB8fCBtU3RhdGUgPT0gU1RBVEVfSURMRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBDSEVDS19FUShtU3RhdGUsIFNUQVRFX1BSRVBBUklORyk7Ci0KLSAgICBtQXN5bmNSZXN1bHQgPSBlcnI7Ci0KLSAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIC8vIHVwZGF0ZSBzdGF0ZSBiZWZvcmUgbm90aWZ5aW5nIGNsaWVudCwgc28gdGhhdCBpZiBjbGllbnQgY2FsbHMgYmFjayBpbnRvIE51UGxheWVyMkRyaXZlcgotICAgICAgICAvLyBpbiByZXNwb25zZSwgTnVQbGF5ZXIyRHJpdmVyIGhhcyB0aGUgcmlnaHQgc3RhdGUKLSAgICAgICAgbVN0YXRlID0gU1RBVEVfUFJFUEFSRUQ7Ci0gICAgICAgIG5vdGlmeUxpc3RlbmVyX2woc3JjSWQsIE1FRElBMl9QUkVQQVJFRCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVN0YXRlID0gU1RBVEVfVU5QUkVQQVJFRDsKLSAgICAgICAgbm90aWZ5TGlzdGVuZXJfbChzcmNJZCwgTUVESUEyX0VSUk9SLCBNRURJQTJfRVJST1JfVU5LTk9XTiwgZXJyKTsKLSAgICB9Ci0KLSAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1QbGF5ZXItPmdldEZpbGVNZXRhKCk7Ci0gICAgaW50MzJfdCBsb29wOwotICAgIGlmIChtZXRhICE9IE5VTEwKLSAgICAgICAgICAgICYmIG1ldGEtPmZpbmRJbnQzMihrS2V5QXV0b0xvb3AsICZsb29wKSAmJiBsb29wICE9IDApIHsKLSAgICAgICAgbUF1dG9Mb29wID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBtQ29uZGl0aW9uLmJyb2FkY2FzdCgpOwotfQotCi12b2lkIE51UGxheWVyMkRyaXZlcjo6bm90aWZ5RmxhZ3NDaGFuZ2VkKGludDY0X3QgLyogc3JjSWQgKi8sIHVpbnQzMl90IGZsYWdzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIG1QbGF5ZXJGbGFncyA9IGZsYWdzOwotfQotCi0vLyBNb2R1bGFyIERSTQotc3RhdHVzX3QgTnVQbGF5ZXIyRHJpdmVyOjpwcmVwYXJlRHJtKGNvbnN0IHVpbnQ4X3QgdXVpZFsxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmZHJtU2Vzc2lvbklkKQotewotICAgIEFMT0dWKCJwcmVwYXJlRHJtKCVwKSBzdGF0ZTogJWQiLCB0aGlzLCBtU3RhdGUpOwotCi0gICAgLy8gbGVhdmluZyB0aGUgc3RhdGUgdmVyaWZpY2F0aW9uIGZvciBtZWRpYXBsYXllci5jcHAKLSAgICBzdGF0dXNfdCByZXQgPSBtUGxheWVyLT5wcmVwYXJlRHJtKHV1aWQsIGRybVNlc3Npb25JZCk7Ci0KLSAgICBBTE9HVigicHJlcGFyZURybSByZXQ6ICVkIiwgcmV0KTsKLQotICAgIHJldHVybiByZXQ7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMkRyaXZlcjo6cmVsZWFzZURybSgpCi17Ci0gICAgQUxPR1YoInJlbGVhc2VEcm0oJXApIHN0YXRlOiAlZCIsIHRoaXMsIG1TdGF0ZSk7Ci0KLSAgICAvLyBsZWF2aW5nIHRoZSBzdGF0ZSB2ZXJpZmljYXRpb24gZm9yIG1lZGlhcGxheWVyLmNwcAotICAgIHN0YXR1c190IHJldCA9IG1QbGF5ZXItPnJlbGVhc2VEcm0oKTsKLQotICAgIEFMT0dWKCJyZWxlYXNlRHJtIHJldDogJWQiLCByZXQpOwotCi0gICAgcmV0dXJuIHJldDsKLX0KLQotc3RkOjpzdHJpbmcgTnVQbGF5ZXIyRHJpdmVyOjpzdGF0ZVN0cmluZyhTdGF0ZSBzdGF0ZSkgewotICAgIGNvbnN0IGNoYXIgKnJ2YWwgPSBOVUxMOwotICAgIGNoYXIgcmF3YnVmZmVyWzE2XTsgIC8vIGFsbG93cyAiJWQiCi0KLSAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgIGNhc2UgU1RBVEVfSURMRTogcnZhbCA9ICJJRExFIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBVEVfU0VUX0RBVEFTT1VSQ0VfUEVORElORzogcnZhbCA9ICJTRVRfREFUQVNPVVJDRV9QRU5ESU5HIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBVEVfVU5QUkVQQVJFRDogcnZhbCA9ICJVTlBSRVBBUkVEIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBVEVfUFJFUEFSSU5HOiBydmFsID0gIlBSRVBBUklORyI7IGJyZWFrOwotICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUkVEOiBydmFsID0gIlBSRVBBUkVEIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBVEVfUlVOTklORzogcnZhbCA9ICJSVU5OSU5HIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOiBydmFsID0gIlBBVVNFRCI7IGJyZWFrOwotICAgICAgICBjYXNlIFNUQVRFX1JFU0VUX0lOX1BST0dSRVNTOiBydmFsID0gIlJFU0VUX0lOX1BST0dSRVNTIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRDogcnZhbCA9ICJTVE9QUEVEIjsgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HOiBydmFsID0gIlNUT1BQRURfQU5EX1BSRVBBUklORyI7IGJyZWFrOwotICAgICAgICBjYXNlIFNUQVRFX1NUT1BQRURfQU5EX1BSRVBBUkVEOiBydmFsID0gIlNUT1BQRURfQU5EX1BSRVBBUkVEIjsgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAvLyB5ZXMsIHRoaXMgYnVmZmVyIGlzIHNoYXJlZCBhbmQgdnVsbmVyYWJsZSB0byByYWNlcwotICAgICAgICAgICAgc25wcmludGYocmF3YnVmZmVyLCBzaXplb2YocmF3YnVmZmVyKSwgIiVkIiwgc3RhdGUpOwotICAgICAgICAgICAgcnZhbCA9IHJhd2J1ZmZlcjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIHJldHVybiBydmFsOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJpdmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkYTI1NjYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcml2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bWVkaWFwbGF5ZXIyL01lZGlhUGxheWVyMkludGVyZmFjZS5oPgotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBTG9vcGVyOwotc3RydWN0IE1lZGlhQ2xvY2s7Ci1zdHJ1Y3QgTnVQbGF5ZXIyOwotCi1zdHJ1Y3QgTnVQbGF5ZXIyRHJpdmVyIDogcHVibGljIE1lZGlhUGxheWVyMkludGVyZmFjZSB7Ci0gICAgZXhwbGljaXQgTnVQbGF5ZXIyRHJpdmVyKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZURlc2M+ICZkc2QpIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZU5leHREYXRhU291cmNlKGNvbnN0IHNwPERhdGFTb3VyY2VEZXNjPiAmZHNkKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHBsYXlOZXh0RGF0YVNvdXJjZShpbnQ2NF90IHNyY0lkKSBvdmVycmlkZTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VmlkZW9TdXJmYWNlVGV4dHVyZShjb25zdCBzcDxBTmF0aXZlV2luZG93V3JhcHBlcj4gJm53dykgb3ZlcnJpZGU7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlcmluZ1NldHRpbmdzKAotICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBwcmVwYXJlQXN5bmMoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0KCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wKCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwotICAgIHZpcnR1YWwgYm9vbCBpc1BsYXlpbmcoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTeW5jU2V0dGluZ3MoY29uc3QgQVZTeW5jU2V0dGluZ3MgJnN5bmMsIGZsb2F0IHZpZGVvRnBzSGludCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTeW5jU2V0dGluZ3MoQVZTeW5jU2V0dGluZ3MgKnN5bmMsIGZsb2F0ICp2aWRlb0Zwcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZWVrVG8oCi0gICAgICAgICAgICBpbnQ2NF90IG1zZWMsIE1lZGlhUGxheWVyMlNlZWtNb2RlIG1vZGUgPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptc2VjKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldER1cmF0aW9uKGludDY0X3QgKm1zZWMpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVzZXQoKTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IG5vdGlmeUF0KGludDY0X3QgbWVkaWFUaW1lVXMpIG92ZXJyaWRlOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0TG9vcGluZyhpbnQgbG9vcCk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBpbnZva2UoY29uc3QgUGFyY2VsICZyZXF1ZXN0LCBQYXJjZWwgKnJlcGx5KTsKLSAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9TaW5rKGNvbnN0IHNwPEF1ZGlvU2luaz4gJmF1ZGlvU2luayk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQYXJhbWV0ZXIoaW50IGtleSwgY29uc3QgUGFyY2VsICZyZXF1ZXN0KTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBhcmFtZXRlcihpbnQga2V5LCBQYXJjZWwgKnJlcGx5KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YWRhdGEoCi0gICAgICAgICAgICBjb25zdCBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciYgaWRzLCBQYXJjZWwgKnJlY29yZHMpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiAmYXJncykgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIG92ZXJyaWRlOwotCi0gICAgdm9pZCBub3RpZnlTZXREYXRhU291cmNlQ29tcGxldGVkKGludDY0X3Qgc3JjSWQsIHN0YXR1c190IGVycik7Ci0gICAgdm9pZCBub3RpZnlQcmVwYXJlQ29tcGxldGVkKGludDY0X3Qgc3JjSWQsIHN0YXR1c190IGVycik7Ci0gICAgdm9pZCBub3RpZnlSZXNldENvbXBsZXRlKGludDY0X3Qgc3JjSWQpOwotICAgIHZvaWQgbm90aWZ5U2V0U3VyZmFjZUNvbXBsZXRlKGludDY0X3Qgc3JjSWQpOwotICAgIHZvaWQgbm90aWZ5RHVyYXRpb24oaW50NjRfdCBzcmNJZCwgaW50NjRfdCBkdXJhdGlvblVzKTsKLSAgICB2b2lkIG5vdGlmeU1vcmVQbGF5aW5nVGltZVVzKGludDY0X3Qgc3JjSWQsIGludDY0X3QgdGltZVVzKTsKLSAgICB2b2lkIG5vdGlmeU1vcmVSZWJ1ZmZlcmluZ1RpbWVVcyhpbnQ2NF90IHNyY0lkLCBpbnQ2NF90IHRpbWVVcyk7Ci0gICAgdm9pZCBub3RpZnlSZWJ1ZmZlcmluZ1doZW5FeGl0KGludDY0X3Qgc3JjSWQsIGJvb2wgc3RhdHVzKTsKLSAgICB2b2lkIG5vdGlmeVNlZWtDb21wbGV0ZShpbnQ2NF90IHNyY0lkKTsKLSAgICB2b2lkIG5vdGlmeVNlZWtDb21wbGV0ZV9sKGludDY0X3Qgc3JjSWQpOwotICAgIHZvaWQgbm90aWZ5TGlzdGVuZXIoaW50NjRfdCBzcmNJZCwgaW50IG1zZywgaW50IGV4dDEgPSAwLCBpbnQgZXh0MiA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXJjZWwgKmluID0gTlVMTCk7Ci0gICAgdm9pZCBub3RpZnlGbGFnc0NoYW5nZWQoaW50NjRfdCBzcmNJZCwgdWludDMyX3QgZmxhZ3MpOwotCi0gICAgLy8gTW9kdWxhciBEUk0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHByZXBhcmVEcm0oY29uc3QgdWludDhfdCB1dWlkWzE2XSwgY29uc3QgVmVjdG9yPHVpbnQ4X3Q+ICZkcm1TZXNzaW9uSWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZURybSgpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+TnVQbGF5ZXIyRHJpdmVyKCk7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSBTdGF0ZSB7Ci0gICAgICAgIFNUQVRFX0lETEUsCi0gICAgICAgIFNUQVRFX1NFVF9EQVRBU09VUkNFX1BFTkRJTkcsCi0gICAgICAgIFNUQVRFX1VOUFJFUEFSRUQsCi0gICAgICAgIFNUQVRFX1BSRVBBUklORywKLSAgICAgICAgU1RBVEVfUFJFUEFSRUQsCi0gICAgICAgIFNUQVRFX1JVTk5JTkcsCi0gICAgICAgIFNUQVRFX1BBVVNFRCwKLSAgICAgICAgU1RBVEVfUkVTRVRfSU5fUFJPR1JFU1MsCi0gICAgICAgIFNUQVRFX1NUT1BQRUQsICAgICAgICAgICAgICAgICAgLy8gZXF1aXZhbGVudCB0byBQQVVTRUQKLSAgICAgICAgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSSU5HLCAgICAvLyBlcXVpdmFsZW50IHRvIFBBVVNFRCwgYnV0IHNlZWtpbmcKLSAgICAgICAgU1RBVEVfU1RPUFBFRF9BTkRfUFJFUEFSRUQsICAgICAvLyBlcXVpdmFsZW50IHRvIFBBVVNFRCwgYnV0IHNlZWsgY29tcGxldGUKLSAgICB9OwotCi0gICAgc3RkOjpzdHJpbmcgc3RhdGVTdHJpbmcoU3RhdGUgc3RhdGUpOwotCi0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0Tm90aWZ5TGlzdGVuZXIsCi0gICAgfTsKLQotICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Ci0gICAgQ29uZGl0aW9uIG1Db25kaXRpb247Ci0KLSAgICBTdGF0ZSBtU3RhdGU7Ci0KLSAgICBzdGF0dXNfdCBtQXN5bmNSZXN1bHQ7Ci0KLSAgICAvLyBUaGUgZm9sbG93aW5nIGFyZSBwcm90ZWN0ZWQgdGhyb3VnaCAibUxvY2siCi0gICAgLy8gPj4+Ci0gICAgaW50NjRfdCBtU3JjSWQ7Ci0gICAgYm9vbCBtU2V0U3VyZmFjZUluUHJvZ3Jlc3M7Ci0gICAgaW50NjRfdCBtRHVyYXRpb25VczsKLSAgICBpbnQ2NF90IG1Qb3NpdGlvblVzOwotICAgIGJvb2wgbVNlZWtJblByb2dyZXNzOwotICAgIGludDY0X3QgbVBsYXlpbmdUaW1lVXM7Ci0gICAgaW50NjRfdCBtUmVidWZmZXJpbmdUaW1lVXM7Ci0gICAgaW50MzJfdCBtUmVidWZmZXJpbmdFdmVudHM7Ci0gICAgYm9vbCBtUmVidWZmZXJpbmdBdEV4aXQ7Ci0gICAgLy8gPDw8Ci0KLSAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwotICAgIHNwPEFMb29wZXI+IG1OdVBsYXllcjJMb29wZXI7Ci0gICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gbU1lZGlhQ2xvY2s7Ci0gICAgY29uc3Qgc3A8TnVQbGF5ZXIyPiBtUGxheWVyOwotICAgIHNwPEF1ZGlvU2luaz4gbUF1ZGlvU2luazsKLSAgICB1aW50MzJfdCBtUGxheWVyRmxhZ3M7Ci0KLSAgICBNZWRpYUFuYWx5dGljc0l0ZW0gKm1BbmFseXRpY3NJdGVtOwotICAgIHVpZF90IG1DbGllbnRVaWQ7Ci0KLSAgICBib29sIG1BdEVPUzsKLSAgICBib29sIG1Mb29waW5nOwotICAgIGJvb2wgbUF1dG9Mb29wOwotCi0gICAgdm9pZCB1cGRhdGVNZXRyaWNzKGNvbnN0IGNoYXIgKndoZXJlKTsKLSAgICB2b2lkIGxvZ01ldHJpY3MoY29uc3QgY2hhciAqd2hlcmUpOwotCi0gICAgc3RhdHVzX3Qgc3RhcnRfbCgpOwotICAgIHZvaWQgbm90aWZ5TGlzdGVuZXJfbChpbnQ2NF90IHNyY0lkLCBpbnQgbXNnLCBpbnQgZXh0MSA9IDAsIGludCBleHQyID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGFyY2VsICppbiA9IE5VTEwpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTnVQbGF5ZXIyRHJpdmVyKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZTA5NmIwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyRHJtLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE3NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk51UGxheWVyMkRybSIKLQotI2luY2x1ZGUgIk51UGxheWVyMkRybS5oIgotCi0jaW5jbHVkZSA8bWVkaWEvTmRrV3JhcHBlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotVmVjdG9yPERybVVVSUQ+IE51UGxheWVyMkRybTo6cGFyc2VQU1NIKGNvbnN0IHZvaWQgKnBzc2gsIHNpemVfdCBwc3Noc2l6ZSkKLXsKLSAgICBWZWN0b3I8RHJtVVVJRD4gZHJtU2NoZW1lcywgZW1wdHk7Ci0gICAgY29uc3QgaW50IERBVEFMRU5fU0laRSA9IDQ7Ci0KLSAgICAvLyB0aGUgZm9ybWF0IG9mIHRoZSBidWZmZXIgaXMgMSBvciBtb3JlIG9mOgotICAgIC8vICAgIHsKLSAgICAvLyAgICAgICAgMTYgYnl0ZSB1dWlkCi0gICAgLy8gICAgICAgIDQgYnl0ZSBkYXRhIGxlbmd0aCBOCi0gICAgLy8gICAgICAgIE4gYnl0ZXMgb2YgZGF0YQotICAgIC8vICAgIH0KLSAgICAvLyBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBzb3VyY2UgZGF0YS4KLSAgICAvLyBTaW5jZSB3ZSBnb3QgdGhlIGRhdGEgZnJvbSBzdGFnZWZyaWdodCwgd2UgdHJ1c3QgaXQgaXMgdmFsaWQgYW5kIHByb3Blcmx5IGZvcm1hdHRlZC4KLQotICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSAoY29uc3QgdWludDhfdCopcHNzaDsKLSAgICBzaXplX3QgbGVuID0gcHNzaHNpemU7Ci0gICAgc2l6ZV90IG51bWVudHJpZXMgPSAwOwotICAgIHdoaWxlIChsZW4gPiAwKSB7Ci0gICAgICAgIGlmIChsZW4gPCBEcm1VVUlEOjpVVUlEX1NJWkUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJQYXJzZVBTU0g6IGludmFsaWQgUFNTSCBkYXRhIik7Ci0gICAgICAgICAgICByZXR1cm4gZW1wdHk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCB1aW50OF90ICp1dWlkUHRyID0gZGF0YTsKLQotICAgICAgICAvLyBza2lwIHV1aWQKLSAgICAgICAgZGF0YSArPSBEcm1VVUlEOjpVVUlEX1NJWkU7Ci0gICAgICAgIGxlbiAtPSBEcm1VVUlEOjpVVUlEX1NJWkU7Ci0KLSAgICAgICAgLy8gZ2V0IGRhdGEgbGVuZ3RoCi0gICAgICAgIGlmIChsZW4gPCBEQVRBTEVOX1NJWkUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJQYXJzZVBTU0g6IGludmFsaWQgUFNTSCBkYXRhIik7Ci0gICAgICAgICAgICByZXR1cm4gZW1wdHk7Ci0gICAgICAgIH0KLQotICAgICAgICB1aW50MzJfdCBkYXRhbGVuID0gKigodWludDMyX3QqKWRhdGEpOwotICAgICAgICBkYXRhICs9IERBVEFMRU5fU0laRTsKLSAgICAgICAgbGVuIC09IERBVEFMRU5fU0laRTsKLQotICAgICAgICBpZiAobGVuIDwgZGF0YWxlbikgewotICAgICAgICAgICAgQUxPR0UoIlBhcnNlUFNTSDogaW52YWxpZCBQU1NIIGRhdGEiKTsKLSAgICAgICAgICAgIHJldHVybiBlbXB0eTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHNraXAgdGhlIGRhdGEKLSAgICAgICAgZGF0YSArPSBkYXRhbGVuOwotICAgICAgICBsZW4gLT0gZGF0YWxlbjsKLQotICAgICAgICBEcm1VVUlEIF91dWlkKHV1aWRQdHIpOwotICAgICAgICBkcm1TY2hlbWVzLmFkZChfdXVpZCk7Ci0KLSAgICAgICAgQUxPR1YoIlBhcnNlUFNTSFslenVdOiAlczogJXMiLCBudW1lbnRyaWVzLAotICAgICAgICAgICAgICAgIF91dWlkLnRvSGV4U3RyaW5nKCkuc3RyaW5nKCksCi0gICAgICAgICAgICAgICAgRHJtVVVJRDo6YXJyYXlUb0hleChkYXRhLCBkYXRhbGVuKS5zdHJpbmcoKQotICAgICAgICAgICAgICk7Ci0KLSAgICAgICAgbnVtZW50cmllcysrOwotICAgIH0KLQotICAgIHJldHVybiBkcm1TY2hlbWVzOwotfQotCi1WZWN0b3I8RHJtVVVJRD4gTnVQbGF5ZXIyRHJtOjpnZXRTdXBwb3J0ZWREcm1TY2hlbWVzKGNvbnN0IHZvaWQgKnBzc2gsIHNpemVfdCBwc3Noc2l6ZSkKLXsKLSAgICBWZWN0b3I8RHJtVVVJRD4gcHNzaERSTXMgPSBwYXJzZVBTU0gocHNzaCwgcHNzaHNpemUpOwotCi0gICAgVmVjdG9yPERybVVVSUQ+IHN1cHBvcnRlZERSTXM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwc3NoRFJNcy5zaXplKCk7IGkrKykgewotICAgICAgICBEcm1VVUlEIHV1aWQgPSBwc3NoRFJNc1tpXTsKLSAgICAgICAgaWYgKEFNZWRpYURybVdyYXBwZXI6OmlzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKHV1aWQucHRyKCksIE5VTEwpKSB7Ci0gICAgICAgICAgICBzdXBwb3J0ZWREUk1zLmFkZCh1dWlkKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dWKCJnZXRTdXBwb3J0ZWREcm1TY2hlbWVzOiBwc3NoRFJNczogJXp1IHN1cHBvcnRlZERSTXM6ICV6dSIsCi0gICAgICAgICAgICBwc3NoRFJNcy5zaXplKCksIHN1cHBvcnRlZERSTXMuc2l6ZSgpKTsKLQotICAgIHJldHVybiBzdXBwb3J0ZWREUk1zOwotfQotCi1zcDxBQnVmZmVyPiBOdVBsYXllcjJEcm06OnJldHJpZXZlRHJtSW5mbyhjb25zdCB2b2lkICpwc3NoLCB1aW50MzJfdCBwc3Noc2l6ZSkKLXsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gYnVmOwotCi0gICAgLy8gMSkgUFNTSCBieXRlcwotICAgIGJ1Zi53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oJnBzc2hzaXplKSwgc2l6ZW9mKHBzc2hzaXplKSk7Ci0gICAgYnVmLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPihwc3NoKSwgcHNzaHNpemUpOwotCi0gICAgQUxPR1YoInJldHJpZXZlRHJtSW5mbzogTUVESUEyX0RSTV9JTkZPICBQU1NIOiBzaXplOiAldSAlcyIsIHBzc2hzaXplLAotICAgICAgICAgICAgRHJtVVVJRDo6YXJyYXlUb0hleCgodWludDhfdCopcHNzaCwgcHNzaHNpemUpLnN0cmluZygpKTsKLQotICAgIC8vIDIpIHN1cHBvcnRlZERSTXMKLSAgICBWZWN0b3I8RHJtVVVJRD4gc3VwcG9ydGVkRFJNcyA9IGdldFN1cHBvcnRlZERybVNjaGVtZXMocHNzaCwgcHNzaHNpemUpOwotICAgIHVpbnQzMl90IG4gPSBzdXBwb3J0ZWREUk1zLnNpemUoKTsKLSAgICBidWYud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KCZuKSwgc2l6ZW9mKG4pKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47IGkrKykgewotICAgICAgICBEcm1VVUlEIHV1aWQgPSBzdXBwb3J0ZWREUk1zW2ldOwotICAgICAgICBidWYud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZuKSwgc2l6ZW9mKG4pKTsKLSAgICAgICAgYnVmLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPih1dWlkLnB0cigpKSwgRHJtVVVJRDo6VVVJRF9TSVpFKTsKLQotICAgICAgICBBTE9HVigicmV0cmlldmVEcm1JbmZvOiBNRURJQTJfRFJNX0lORk8gIHN1cHBvcnRlZFNjaGVtZVslenVdICVzIiwgaSwKLSAgICAgICAgICAgICAgICB1dWlkLnRvSGV4U3RyaW5nKCkuc3RyaW5nKCkpOwotICAgIH0KLQotICAgIHNwPEFCdWZmZXI+IGRybUluZm9CdWZmZXIgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoYnVmLnN0cigpLmNfc3RyKCksIGJ1Zi50ZWxscCgpKTsKLSAgICByZXR1cm4gZHJtSW5mb0J1ZmZlcjsKLX0KLQotc3A8QUJ1ZmZlcj4gTnVQbGF5ZXIyRHJtOjpyZXRyaWV2ZURybUluZm8oUHNzaEluZm8gKnBzc2hJbmZvKQotewotCi0gICAgc3RkOjpvc3RyaW5nc3RyZWFtIHBzc2gsIGRybUluZm87Ci0KLSAgICAvLyAwKSBHZW5lcmF0ZSBQU1NIIGJ5dGVzCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwc3NoSW5mby0+bnVtZW50cmllczsgaSsrKSB7Ci0gICAgICAgIFBzc2hFbnRyeSAqZW50cnkgPSAmcHNzaEluZm8tPmVudHJpZXNbaV07Ci0gICAgICAgIHVpbnQzMl90IGRhdGFsZW4gPSBlbnRyeS0+ZGF0YWxlbjsKLSAgICAgICAgcHNzaC53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oJmVudHJ5LT51dWlkKSwgc2l6ZW9mKGVudHJ5LT51dWlkKSk7Ci0gICAgICAgIHBzc2gud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZkYXRhbGVuKSwgc2l6ZW9mKGRhdGFsZW4pKTsKLSAgICAgICAgcHNzaC53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oZW50cnktPmRhdGEpLCBkYXRhbGVuKTsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBwc3NoU2l6ZSA9IHBzc2gudGVsbHAoKTsKLSAgICBzdGQ6OnN0cmluZyBwc3NoQmFzZSA9IHBzc2guc3RyKCk7Ci0gICAgY29uc3QgYXV0byogcHNzaFB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCo+KHBzc2hCYXNlLmNfc3RyKCkpOwotICAgIEFMT0dWKCJyZXRyaWV2ZURybUluZm86IE1FRElBX0RSTV9JTkZPICBQU1NIOiBzaXplOiAldSAlcyIsIHBzc2hTaXplLAotICAgICAgICAgICAgRHJtVVVJRDo6YXJyYXlUb0hleChwc3NoUHRyLCBwc3NoU2l6ZSkuc3RyaW5nKCkpOwotCi0gICAgLy8gMSkgV3JpdGUgUFNTSCBieXRlcwotICAgIGRybUluZm8ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZwc3NoU2l6ZSksIHNpemVvZihwc3NoU2l6ZSkpOwotICAgIGRybUluZm8ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KHBzc2guc3RyKCkuY19zdHIoKSksIHBzc2hTaXplKTsKLQotICAgIC8vIDIpIFdyaXRlIHN1cHBvcnRlZERSTXMKLSAgICB1aW50MzJfdCBudW1lbnRyaWVzID0gcHNzaEluZm8tPm51bWVudHJpZXM7Ci0gICAgZHJtSW5mby53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oJm51bWVudHJpZXMpLCBzaXplb2YobnVtZW50cmllcykpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtZW50cmllczsgaSsrKSB7Ci0gICAgICAgIFBzc2hFbnRyeSAqZW50cnkgPSAmcHNzaEluZm8tPmVudHJpZXNbaV07Ci0gICAgICAgIGRybUluZm8ud3JpdGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZlbnRyeS0+dXVpZCksIHNpemVvZihlbnRyeS0+dXVpZCkpOwotICAgICAgICBBTE9HVigicmV0cmlldmVEcm1JbmZvOiBNRURJQV9EUk1fSU5GTyAgc3VwcG9ydGVkU2NoZW1lWyV6dV0gJXMiLCBpLAotICAgICAgICAgICAgICAgIERybVVVSUQ6OmFycmF5VG9IZXgoKGNvbnN0IHVpbnQ4X3QqKSZlbnRyeS0+dXVpZCwgc2l6ZW9mKEFNZWRpYVVVSUQpKS5zdHJpbmcoKSk7Ci0gICAgfQotCi0gICAgc3A8QUJ1ZmZlcj4gZHJtSW5mb0J1ZiA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShkcm1JbmZvLnN0cigpLmNfc3RyKCksIGRybUluZm8udGVsbHAoKSk7Ci0gICAgZHJtSW5mb0J1Zi0+c2V0UmFuZ2UoMCwgZHJtSW5mby50ZWxscCgpKTsKLSAgICByZXR1cm4gZHJtSW5mb0J1ZjsKLX0KLQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJEcm0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTlkMjQxNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMkRybS5oCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBOVVBMQVlFUjJfRFJNX0hfCi0jZGVmaW5lIE5VUExBWUVSMl9EUk1fSF8KLQotI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotICAgIHN0cnVjdCBEcm1VVUlEIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGludCBVVUlEX1NJWkUgPSAxNjsKLQotICAgICAgICBEcm1VVUlEKCkgewotICAgICAgICAgICAgbWVtc2V0KHRoaXMtPnV1aWQsIDAsIHNpemVvZih1dWlkKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyB0byBhbGxvdyBkZWZpbmluZyBWZWN0b3IvS2V5ZWRWZWN0b3Igb2YgVVVJRCB0eXBlCi0gICAgICAgIERybVVVSUQoY29uc3QgRHJtVVVJRCAmYSkgewotICAgICAgICAgICAgbWVtY3B5KHRoaXMtPnV1aWQsIGEudXVpZCwgc2l6ZW9mKHV1aWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHRvIGFsbG93IGRlZmluaW5nIFZlY3Rvci9LZXllZFZlY3RvciBvZiBVVUlEIHR5cGUKLSAgICAgICAgRHJtVVVJRChjb25zdCB1aW50OF90IHV1aWRfaW5bVVVJRF9TSVpFXSkgewotICAgICAgICAgICAgbWVtY3B5KHRoaXMtPnV1aWQsIHV1aWRfaW4sIHNpemVvZih1dWlkKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCB1aW50OF90ICpwdHIoKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gdXVpZDsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZzggdG9IZXhTdHJpbmcoKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gYXJyYXlUb0hleCh1dWlkLCBVVUlEX1NJWkUpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIFN0cmluZzggdG9IZXhTdHJpbmcoY29uc3QgdWludDhfdCB1dWlkX2luW1VVSURfU0laRV0pIHsKLSAgICAgICAgICAgIHJldHVybiBhcnJheVRvSGV4KHV1aWRfaW4sIFVVSURfU0laRSk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdGF0aWMgU3RyaW5nOCBhcnJheVRvSGV4KGNvbnN0IHVpbnQ4X3QgKmFycmF5LCBpbnQgYnl0ZXMpIHsKLSAgICAgICAgICAgIFN0cmluZzggcmVzdWx0OwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlczsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJTAyeCIsIGFycmF5W2ldKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgcHJvdGVjdGVkOgotICAgICAgICB1aW50OF90IHV1aWRbVVVJRF9TSVpFXTsKLSAgICB9OwotCi0KLSAgICBzdHJ1Y3QgTnVQbGF5ZXIyRHJtIHsKLQotICAgICAgICAvLyBzdGF0aWMgaGVscGVycyAtIGludGVybmFsCi0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIHN0YXRpYyBWZWN0b3I8RHJtVVVJRD4gcGFyc2VQU1NIKGNvbnN0IHZvaWQgKnBzc2gsIHNpemVfdCBwc3Noc2l6ZSk7Ci0gICAgICAgIHN0YXRpYyBWZWN0b3I8RHJtVVVJRD4gZ2V0U3VwcG9ydGVkRHJtU2NoZW1lcyhjb25zdCB2b2lkICpwc3NoLCBzaXplX3QgcHNzaHNpemUpOwotCi0gICAgICAgIC8vIHN0YXRpYyBoZWxwZXJzIC0gcHVibGljCi0KLSAgICBwdWJsaWM6Ci0gICAgICAgIHN0YXRpYyBzcDxBQnVmZmVyPiByZXRyaWV2ZURybUluZm8oY29uc3Qgdm9pZCAqcHNzaCwgdWludDMyX3QgcHNzaHNpemUpOwotICAgICAgICBzdGF0aWMgc3A8QUJ1ZmZlcj4gcmV0cmlldmVEcm1JbmZvKFBzc2hJbmZvICopOwotCi0gICAgfTsgIC8vIE51UGxheWVyMkRybQotCi19ICAgLy8gYW5kcm9pZAotCi0jZW5kaWYgICAgIC8vTlVQTEFZRVIyX0RSTV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q2OTE4OC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDIwOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTnVQbGF5ZXIyUmVuZGVyZXIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJKV2FrZUxvY2suaCIKLSNpbmNsdWRlICJOdVBsYXllcjJSZW5kZXJlci5oIgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLyoKLSAqIEV4YW1wbGUgb2YgY29tbW9uIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MgaW4gc2hlbGwgc2NyaXB0IGZvcm0KLQotICAgI1R1cm4gb2ZmbG9hZCBhdWRpbyBvZmYgKHVzZSBQQ00gZm9yIFBsYXkgTXVzaWMpIC0tIEF1ZGlvUG9saWN5TWFuYWdlcgotICAgYWRiIHNoZWxsIHNldHByb3AgYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIDEKLQotICAgI0FsbG93IG9mZmxvYWQgYXVkaW8gd2l0aCB2aWRlbyAocmVxdWlyZXMgb2ZmbG9hZGluZyB0byBiZSBlbmFibGVkKSAtLSBBdWRpb1BvbGljeU1hbmFnZXIKLSAgIGFkYiBzaGVsbCBzZXRwcm9wIGF1ZGlvLm9mZmxvYWQudmlkZW8gMQotCi0gICAjVXNlIGF1ZGlvIGNhbGxiYWNrcyBmb3IgUENNIGRhdGEKLSAgIGFkYiBzaGVsbCBzZXRwcm9wIG1lZGlhLnN0YWdlZnJpZ2h0LmF1ZGlvLmNiayAxCi0KLSAgICNVc2UgZGVlcCBidWZmZXIgZm9yIFBDTSBkYXRhIHdpdGggdmlkZW8gKGl0IGlzIGdlbmVyYWxseSBlbmFibGVkIGZvciBhdWRpby1vbmx5KQotICAgYWRiIHNoZWxsIHNldHByb3AgbWVkaWEuc3RhZ2VmcmlnaHQuYXVkaW8uZGVlcCAxCi0KLSAgICNTZXQgc2l6ZSBvZiBidWZmZXJzIGZvciBwY20gYXVkaW8gc2luayBpbiBtc2VjIChleGFtcGxlOiAxMDAwIG1zZWMpCi0gICBhZGIgc2hlbGwgc2V0cHJvcCBtZWRpYS5zdGFnZWZyaWdodC5hdWRpby5zaW5rIDEwMDAKLQotICogVGhlc2UgY29uZmlndXJhdGlvbnMgdGFrZSBlZmZlY3QgZm9yIHRoZSBuZXh0IHRyYWNrIHBsYXllZCAobm90IHRoZSBjdXJyZW50IHRyYWNrKS4KLSAqLwotCi1zdGF0aWMgaW5saW5lIGJvb2wgZ2V0VXNlQXVkaW9DYWxsYmFja1NldHRpbmcoKSB7Ci0gICAgcmV0dXJuIHByb3BlcnR5X2dldF9ib29sKCJtZWRpYS5zdGFnZWZyaWdodC5hdWRpby5jYmsiLCBmYWxzZSAvKiBkZWZhdWx0X3ZhbHVlICovKTsKLX0KLQotc3RhdGljIGlubGluZSBpbnQzMl90IGdldEF1ZGlvU2lua1BjbU1zU2V0dGluZygpIHsKLSAgICByZXR1cm4gcHJvcGVydHlfZ2V0X2ludDMyKAotICAgICAgICAgICAgIm1lZGlhLnN0YWdlZnJpZ2h0LmF1ZGlvLnNpbmsiLCA1MDAgLyogZGVmYXVsdF92YWx1ZSAqLyk7Ci19Ci0KLS8vIE1heGltdW0gdGltZSBpbiBwYXVzZWQgc3RhdGUgd2hlbiBvZmZsb2FkaW5nIGF1ZGlvIGRlY29tcHJlc3Npb24uIFdoZW4gZWxhcHNlZCwgdGhlIEF1ZGlvU2luawotLy8gaXMgY2xvc2VkIHRvIGFsbG93IHRoZSBhdWRpbyBEU1AgdG8gcG93ZXIgZG93bi4KLXN0YXRpYyBjb25zdCBpbnQ2NF90IGtPZmZsb2FkUGF1c2VNYXhVcyA9IDEwMDAwMDAwTEw7Ci0KLS8vIE1heGltdW0gYWxsb3dlZCBkZWxheSBmcm9tIEF1ZGlvU2luaywgMS41IHNlY29uZHMuCi1zdGF0aWMgY29uc3QgaW50NjRfdCBrTWF4QWxsb3dlZEF1ZGlvU2lua0RlbGF5VXMgPSAxNTAwMDAwTEw7Ci0KLXN0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5pbXVtQXVkaW9DbG9ja1VwZGF0ZVBlcmlvZFVzID0gMjAgLyogbXNlYyAqLyAqIDEwMDA7Ci0KLS8vIHN0YXRpYwotY29uc3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6UGNtSW5mbyBOdVBsYXllcjI6OlJlbmRlcmVyOjpBVURJT19QQ01JTkZPX0lOSVRJQUxJWkVSID0gewotICAgICAgICBBVURJT19DSEFOTkVMX05PTkUsCi0gICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCi0gICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElELAotICAgICAgICAwLCAvLyBtTnVtQ2hhbm5lbHMKLSAgICAgICAgMCAvLyBtU2FtcGxlUmF0ZQotfTsKLQotLy8gc3RhdGljCi1jb25zdCBpbnQ2NF90IE51UGxheWVyMjo6UmVuZGVyZXI6OmtNaW5Qb3NpdGlvblVwZGF0ZURlbGF5VXMgPSAxMDAwMDBMTDsKLQotc3RhdGljIGF1ZGlvX2Zvcm1hdF90IGNvbnN0ZXhwciBhdWRpb0Zvcm1hdEZyb21FbmNvZGluZyhpbnQzMl90IHBjbUVuY29kaW5nKSB7Ci0gICAgc3dpdGNoIChwY21FbmNvZGluZykgewotICAgIGNhc2Uga0F1ZGlvRW5jb2RpbmdQY21GbG9hdDoKLSAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7Ci0gICAgY2FzZSBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0OgotICAgICAgICByZXR1cm4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0gICAgY2FzZSBrQXVkaW9FbmNvZGluZ1BjbThiaXQ6Ci0gICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfUENNXzhfQklUOyAgLy8gVE9ETzogZG8gd2Ugd2FudCB0byBzdXBwb3J0IHRoaXM/Ci0gICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGVuY29kaW5nOiAlZCIsIF9fZnVuY19fLCBwY21FbmNvZGluZyk7Ci0gICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICB9Ci19Ci0KLU51UGxheWVyMjo6UmVuZGVyZXI6OlJlbmRlcmVyKAotICAgICAgICBjb25zdCBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luaz4gJnNpbmssCi0gICAgICAgIGNvbnN0IHNwPE1lZGlhQ2xvY2s+ICZtZWRpYUNsb2NrLAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgdWludDMyX3QgZmxhZ3MpCi0gICAgOiBtQXVkaW9TaW5rKHNpbmspLAotICAgICAgbVVzZVZpcnR1YWxBdWRpb1NpbmsoZmFsc2UpLAotICAgICAgbU5vdGlmeShub3RpZnkpLAotICAgICAgbUZsYWdzKGZsYWdzKSwKLSAgICAgIG1OdW1GcmFtZXNXcml0dGVuKDApLAotICAgICAgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcoZmFsc2UpLAotICAgICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcoZmFsc2UpLAotICAgICAgbUF1ZGlvUXVldWVHZW5lcmF0aW9uKDApLAotICAgICAgbVZpZGVvUXVldWVHZW5lcmF0aW9uKDApLAotICAgICAgbUF1ZGlvRHJhaW5HZW5lcmF0aW9uKDApLAotICAgICAgbVZpZGVvRHJhaW5HZW5lcmF0aW9uKDApLAotICAgICAgbUF1ZGlvRU9TR2VuZXJhdGlvbigwKSwKLSAgICAgIG1NZWRpYUNsb2NrKG1lZGlhQ2xvY2spLAotICAgICAgbVBsYXliYWNrU2V0dGluZ3MoQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUKSwKLSAgICAgIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMoLTEpLAotICAgICAgbUFuY2hvclRpbWVNZWRpYVVzKC0xKSwKLSAgICAgIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuKC0xKSwKLSAgICAgIG1WaWRlb0xhdGVCeVVzKDBMTCksCi0gICAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMoLTEpLAotICAgICAgbUhhc0F1ZGlvKGZhbHNlKSwKLSAgICAgIG1IYXNWaWRlbyhmYWxzZSksCi0gICAgICBtTm90aWZ5Q29tcGxldGVBdWRpbyhmYWxzZSksCi0gICAgICBtTm90aWZ5Q29tcGxldGVWaWRlbyhmYWxzZSksCi0gICAgICBtU3luY1F1ZXVlcyhmYWxzZSksCi0gICAgICBtUGF1c2VkKGZhbHNlKSwKLSAgICAgIG1QYXVzZURyYWluQXVkaW9BbGxvd2VkVXMoMCksCi0gICAgICBtVmlkZW9TYW1wbGVSZWNlaXZlZChmYWxzZSksCi0gICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydGVkKGZhbHNlKSwKLSAgICAgIG1WaWRlb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbigwKSwKLSAgICAgIG1BdWRpb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbigwKSwKLSAgICAgIG1SZW5kZXJpbmdEYXRhRGVsaXZlcmVkKGZhbHNlKSwKLSAgICAgIG1OZXh0QXVkaW9DbG9ja1VwZGF0ZVRpbWVVcygtMSksCi0gICAgICBtTGFzdEF1ZGlvTWVkaWFUaW1lVXMoLTEpLAotICAgICAgbUF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dEdlbmVyYXRpb24oMCksCi0gICAgICBtQXVkaW9Ub3JuRG93bihmYWxzZSksCi0gICAgICBtQ3VycmVudE9mZmxvYWRJbmZvKEFVRElPX0lORk9fSU5JVElBTElaRVIpLAotICAgICAgbUN1cnJlbnRQY21JbmZvKEFVRElPX1BDTUlORk9fSU5JVElBTElaRVIpLAotICAgICAgbVRvdGFsQnVmZmVyc1F1ZXVlZCgwKSwKLSAgICAgIG1MYXN0QXVkaW9CdWZmZXJEcmFpbmVkKDApLAotICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2soZmFsc2UpLAotICAgICAgbVdha2VMb2NrKG5ldyBKV2FrZUxvY2soKSkgewotICAgIENIRUNLKG1lZGlhQ2xvY2sgIT0gTlVMTCk7Ci0gICAgbVBsYXliYWNrUmF0ZSA9IG1QbGF5YmFja1NldHRpbmdzLm1TcGVlZDsKLSAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1JhdGUpOwotfQotCi1OdVBsYXllcjI6OlJlbmRlcmVyOjp+UmVuZGVyZXIoKSB7Ci0gICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7Ci0gICAgICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKLSAgICAgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKLSAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKLSAgICB9Ci0KLSAgICAvLyBUcnkgdG8gYXZvaWQgcmFjaW5nIGNvbmRpdGlvbiBpbiBjYXNlIGNhbGxiYWNrIGlzIHN0aWxsIG9uLgotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKG1Vc2VBdWRpb0NhbGxiYWNrKSB7Ci0gICAgICAgIGZsdXNoUXVldWUoJm1BdWRpb1F1ZXVlKTsKLSAgICAgICAgZmx1c2hRdWV1ZSgmbVZpZGVvUXVldWUpOwotICAgIH0KLSAgICBtV2FrZUxvY2suY2xlYXIoKTsKLSAgICBtVmlkZW9TY2hlZHVsZXIuY2xlYXIoKTsKLSAgICBtTm90aWZ5LmNsZWFyKCk7Ci0gICAgbUF1ZGlvU2luay5jbGVhcigpOwotfQotCi12b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OnF1ZXVlQnVmZmVyKAotICAgICAgICBib29sIGF1ZGlvLAotICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeUNvbnN1bWVkKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFF1ZXVlQnVmZmVyLCB0aGlzKTsKLSAgICBtc2ctPnNldEludDMyKCJxdWV1ZUdlbmVyYXRpb24iLCBnZXRRdWV1ZUdlbmVyYXRpb24oYXVkaW8pKTsKLSAgICBtc2ctPnNldEludDMyKCJhdWRpbyIsIHN0YXRpY19jYXN0PGludDMyX3Q+KGF1ZGlvKSk7Ci0gICAgbXNnLT5zZXRPYmplY3QoImJ1ZmZlciIsIGJ1ZmZlcik7Ci0gICAgbXNnLT5zZXRNZXNzYWdlKCJub3RpZnlDb25zdW1lZCIsIG5vdGlmeUNvbnN1bWVkKTsKLSAgICBtc2ctPnBvc3QoKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpxdWV1ZUVPUyhib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCkgewotICAgIENIRUNLX05FKGZpbmFsUmVzdWx0LCAoc3RhdHVzX3QpT0spOwotCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFF1ZXVlRU9TLCB0aGlzKTsKLSAgICBtc2ctPnNldEludDMyKCJxdWV1ZUdlbmVyYXRpb24iLCBnZXRRdWV1ZUdlbmVyYXRpb24oYXVkaW8pKTsKLSAgICBtc2ctPnNldEludDMyKCJhdWRpbyIsIHN0YXRpY19jYXN0PGludDMyX3Q+KGF1ZGlvKSk7Ci0gICAgbXNnLT5zZXRJbnQzMigiZmluYWxSZXN1bHQiLCBmaW5hbFJlc3VsdCk7Ci0gICAgbXNnLT5wb3N0KCk7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMjo6UmVuZGVyZXI6OnNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlnUGxheWJhY2ssIHRoaXMpOwotICAgIHdyaXRlVG9BTWVzc2FnZShtc2csIHJhdGUpOwotICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKLSAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7Ci0gICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7Ci0gICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25Db25maWdQbGF5YmFjayhjb25zdCBBdWRpb1BsYXliYWNrUmF0ZSAmcmF0ZSAvKiBzYW5pdGl6ZWQgKi8pIHsKLSAgICBpZiAocmF0ZS5tU3BlZWQgPT0gMC5mKSB7Ci0gICAgICAgIG9uUGF1c2UoKTsKLSAgICAgICAgLy8gZG9uJ3QgY2FsbCBhdWRpb3NpbmsncyBzZXRQbGF5YmFja1JhdGUgaWYgcGF1c2luZywgYXMgcGl0Y2ggZG9lcyBub3QKLSAgICAgICAgLy8gaGF2ZSB0byBjb3JyZXNwb25kIHRvIHRoZSBhbnkgbm9uLTAgc3BlZWQgKGUuZyBvbGQgc3BlZWQpLiBLZWVwCi0gICAgICAgIC8vIHNldHRpbmdzIG5vbmV0aGVsZXNzLCB1c2luZyB0aGUgb2xkIHNwZWVkLCBpbiBjYXNlIGF1ZGlvc2luayBjaGFuZ2VzLgotICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSBuZXdSYXRlID0gcmF0ZTsKLSAgICAgICAgbmV3UmF0ZS5tU3BlZWQgPSBtUGxheWJhY2tTZXR0aW5ncy5tU3BlZWQ7Ci0gICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gbmV3UmF0ZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwgJiYgbUF1ZGlvU2luay0+cmVhZHkoKSkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9TaW5rLT5zZXRQbGF5YmFja1JhdGUocmF0ZSk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbVBsYXliYWNrU2V0dGluZ3MgPSByYXRlOwotICAgIG1QbGF5YmFja1JhdGUgPSByYXRlLm1TcGVlZDsKLSAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1JhdGUpOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Z2V0UGxheWJhY2tTZXR0aW5ncyhBdWRpb1BsYXliYWNrUmF0ZSAqcmF0ZSAvKiBub25udWxsICovKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldFBsYXliYWNrU2V0dGluZ3MsIHRoaXMpOwotICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKLSAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7Ci0gICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7Ci0gICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKLSAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShyZXNwb25zZSwgcmF0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25HZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlIC8qIG5vbm51bGwgKi8pIHsKLSAgICBpZiAobUF1ZGlvU2luayAhPSBOVUxMICYmIG1BdWRpb1NpbmstPnJlYWR5KCkpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvU2luay0+Z2V0UGxheWJhY2tSYXRlKHJhdGUpOwotICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICBpZiAoIWlzQXVkaW9QbGF5YmFja1JhdGVFcXVhbCgqcmF0ZSwgbVBsYXliYWNrU2V0dGluZ3MpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNvcnJlY3RpbmcgbWlzbWF0Y2ggaW4gaW50ZXJuYWwvZXh0ZXJuYWwgcGxheWJhY2sgcmF0ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZ2V0IHBsYXliYWNrIHNldHRpbmdzIHVzZWQgYnkgYXVkaW9zaW5rLCBhcyBpdCBtYXkgYmUKLSAgICAgICAgICAgIC8vIHNsaWdodGx5IG9mZiBkdWUgdG8gYXVkaW9zaW5rIG5vdCB0YWtpbmcgc21hbGwgY2hhbmdlcy4KLSAgICAgICAgICAgIG1QbGF5YmFja1NldHRpbmdzID0gKnJhdGU7Ci0gICAgICAgICAgICBpZiAobVBhdXNlZCkgewotICAgICAgICAgICAgICAgIHJhdGUtPm1TcGVlZCA9IDAuZjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLSAgICAqcmF0ZSA9IG1QbGF5YmFja1NldHRpbmdzOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6c2V0U3luY1NldHRpbmdzKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlnU3luYywgdGhpcyk7Ci0gICAgd3JpdGVUb0FNZXNzYWdlKG1zZywgc3luYywgdmlkZW9GcHNIaW50KTsKLSAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgc3RhdHVzX3QgZXJyID0gbXNnLT5wb3N0QW5kQXdhaXRSZXNwb25zZSgmcmVzcG9uc2UpOwotICAgIGlmIChlcnIgPT0gT0sgJiYgcmVzcG9uc2UgIT0gTlVMTCkgewotICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSk7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMjo6UmVuZGVyZXI6Om9uQ29uZmlnU3luYyhjb25zdCBBVlN5bmNTZXR0aW5ncyAmc3luYywgZmxvYXQgdmlkZW9GcHNIaW50IF9fdW51c2VkKSB7Ci0gICAgaWYgKHN5bmMubVNvdXJjZSAhPSBBVlNZTkNfU09VUkNFX0RFRkFVTFQpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgLy8gVE9ETzogc3VwcG9ydCBzeW5jIHNvdXJjZXMKLSAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMjo6UmVuZGVyZXI6OmdldFN5bmNTZXR0aW5ncyhBVlN5bmNTZXR0aW5ncyAqc3luYywgZmxvYXQgKnZpZGVvRnBzKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEdldFN5bmNTZXR0aW5ncywgdGhpcyk7Ci0gICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlOwotICAgIHN0YXR1c190IGVyciA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLSAgICBpZiAoZXJyID09IE9LICYmIHJlc3BvbnNlICE9IE5VTEwpIHsKLSAgICAgICAgQ0hFQ0socmVzcG9uc2UtPmZpbmRJbnQzMigiZXJyIiwgJmVycikpOwotICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICByZWFkRnJvbUFNZXNzYWdlKHJlc3BvbnNlLCBzeW5jLCB2aWRlb0Zwcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25HZXRTeW5jU2V0dGluZ3MoCi0gICAgICAgIEFWU3luY1NldHRpbmdzICpzeW5jIC8qIG5vbm51bGwgKi8sIGZsb2F0ICp2aWRlb0ZwcyAvKiBub25udWxsICovKSB7Ci0gICAgKnN5bmMgPSBtU3luY1NldHRpbmdzOwotICAgICp2aWRlb0ZwcyA9IC0xLmY7Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OmZsdXNoKGJvb2wgYXVkaW8sIGJvb2wgbm90aWZ5Q29tcGxldGUpIHsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgIGlmIChhdWRpbykgewotICAgICAgICAgICAgbU5vdGlmeUNvbXBsZXRlQXVkaW8gfD0gbm90aWZ5Q29tcGxldGU7Ci0gICAgICAgICAgICBjbGVhckF1ZGlvRmlyc3RBbmNob3JUaW1lX2woKTsKLSAgICAgICAgICAgICsrbUF1ZGlvUXVldWVHZW5lcmF0aW9uOwotICAgICAgICAgICAgKyttQXVkaW9EcmFpbkdlbmVyYXRpb247Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTm90aWZ5Q29tcGxldGVWaWRlbyB8PSBub3RpZnlDb21wbGV0ZTsKLSAgICAgICAgICAgICsrbVZpZGVvUXVldWVHZW5lcmF0aW9uOwotICAgICAgICAgICAgKyttVmlkZW9EcmFpbkdlbmVyYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBtTWVkaWFDbG9jay0+Y2xlYXJBbmNob3IoKTsKLSAgICAgICAgbVZpZGVvTGF0ZUJ5VXMgPSAwOwotICAgICAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMgPSAtMTsKLSAgICAgICAgbVN5bmNRdWV1ZXMgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Rmx1c2gsIHRoaXMpOwotICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvIiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oYXVkaW8pKTsKLSAgICBtc2ctPnBvc3QoKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpzaWduYWxUaW1lRGlzY29udGludWl0eSgpIHsKLX0KLQotdm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpzaWduYWxEaXNhYmxlT2ZmbG9hZEF1ZGlvKCkgewotICAgIChuZXcgQU1lc3NhZ2Uoa1doYXREaXNhYmxlT2ZmbG9hZEF1ZGlvLCB0aGlzKSktPnBvc3QoKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpzaWduYWxFbmFibGVPZmZsb2FkQXVkaW8oKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdEVuYWJsZU9mZmxvYWRBdWRpbywgdGhpcykpLT5wb3N0KCk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6cGF1c2UoKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFBhdXNlLCB0aGlzKSktPnBvc3QoKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpyZXN1bWUoKSB7Ci0gICAgKG5ldyBBTWVzc2FnZShrV2hhdFJlc3VtZSwgdGhpcykpLT5wb3N0KCk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6c2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFNldFZpZGVvRnJhbWVSYXRlLCB0aGlzKTsKLSAgICBtc2ctPnNldEZsb2F0KCJmcmFtZS1yYXRlIiwgZnBzKTsKLSAgICBtc2ctPnBvc3QoKTsKLX0KLQotLy8gQ2FsbGVkIG9uIGFueSB0aHJlYWRzIHdpdGhvdXQgbUxvY2sgYWNxdWlyZWQuCi1zdGF0dXNfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpnZXRDdXJyZW50UG9zaXRpb24oaW50NjRfdCAqbWVkaWFVcykgewotICAgIHN0YXR1c190IHJlc3VsdCA9IG1NZWRpYUNsb2NrLT5nZXRNZWRpYVRpbWUoQUxvb3Blcjo6R2V0Tm93VXMoKSwgbWVkaWFVcyk7Ci0gICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8vIE1lZGlhQ2xvY2sgaGFzIG5vdCBzdGFydGVkIHlldC4gVHJ5IHRvIHN0YXJ0IGl0IGlmIHBvc3NpYmxlLgotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgaWYgKG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMgPT0gLTEpIHsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBBdWRpb1RpbWVzdGFtcCB0czsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gbUF1ZGlvU2luay0+Z2V0VGltZXN0YW1wKHRzKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEF1ZGlvU2luayBoYXMgcmVuZGVyZWQgc29tZSBmcmFtZXMuCi0gICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgICAgICBpbnQ2NF90IG5vd01lZGlhVXMgPSBtQXVkaW9TaW5rLT5nZXRQbGF5ZWRPdXREdXJhdGlvblVzKG5vd1VzKQotICAgICAgICAgICAgICAgICsgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVczsKLSAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZUFuY2hvcihub3dNZWRpYVVzLCBub3dVcywgLTEpOwotICAgIH0KLQotICAgIHJldHVybiBtTWVkaWFDbG9jay0+Z2V0TWVkaWFUaW1lKEFMb29wZXI6OkdldE5vd1VzKCksIG1lZGlhVXMpOwotfQotCi12b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OmNsZWFyQXVkaW9GaXJzdEFuY2hvclRpbWVfbCgpIHsKLSAgICBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzID0gLTE7Ci0gICAgbU1lZGlhQ2xvY2stPnNldFN0YXJ0aW5nVGltZU1lZGlhKC0xKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpzZXRBdWRpb0ZpcnN0QW5jaG9yVGltZUlmTmVlZGVkX2woaW50NjRfdCBtZWRpYVVzKSB7Ci0gICAgaWYgKG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMgPT0gLTEpIHsKLSAgICAgICAgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA9IG1lZGlhVXM7Ci0gICAgICAgIG1NZWRpYUNsb2NrLT5zZXRTdGFydGluZ1RpbWVNZWRpYShtZWRpYVVzKTsKLSAgICB9Ci19Ci0KLS8vIENhbGxlZCBvbiByZW5kZXJlciBsb29wZXIuCi12b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OmNsZWFyQW5jaG9yVGltZSgpIHsKLSAgICBtTWVkaWFDbG9jay0+Y2xlYXJBbmNob3IoKTsKLSAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSAtMTsKLSAgICBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbiA9IC0xOwotfQotCi12b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OnNldFZpZGVvTGF0ZUJ5VXMoaW50NjRfdCBsYXRlVXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIG1WaWRlb0xhdGVCeVVzID0gbGF0ZVVzOwotfQotCi1pbnQ2NF90IE51UGxheWVyMjo6UmVuZGVyZXI6OmdldFZpZGVvTGF0ZUJ5VXMoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gbVZpZGVvTGF0ZUJ5VXM7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMjo6UmVuZGVyZXI6Om9wZW5BdWRpb1NpbmsoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAotICAgICAgICBib29sIG9mZmxvYWRPbmx5LAotICAgICAgICBib29sIGhhc1ZpZGVvLAotICAgICAgICB1aW50MzJfdCBmbGFncywKLSAgICAgICAgYm9vbCAqaXNPZmZsb2FkZWQsCi0gICAgICAgIGJvb2wgaXNTdHJlYW1pbmcpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0T3BlbkF1ZGlvU2luaywgdGhpcyk7Ci0gICAgbXNnLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOwotICAgIG1zZy0+c2V0SW50MzIoIm9mZmxvYWQtb25seSIsIG9mZmxvYWRPbmx5KTsKLSAgICBtc2ctPnNldEludDMyKCJoYXMtdmlkZW8iLCBoYXNWaWRlbyk7Ci0gICAgbXNnLT5zZXRJbnQzMigiZmxhZ3MiLCBmbGFncyk7Ci0gICAgbXNnLT5zZXRJbnQzMigiaXNTdHJlYW1pbmciLCBpc1N0cmVhbWluZyk7Ci0KLSAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2U7Ci0gICAgc3RhdHVzX3QgcG9zdFN0YXR1cyA9IG1zZy0+cG9zdEFuZEF3YWl0UmVzcG9uc2UoJnJlc3BvbnNlKTsKLQotICAgIGludDMyX3QgZXJyOwotICAgIGlmIChwb3N0U3RhdHVzICE9IE9LIHx8IHJlc3BvbnNlLmdldCgpID09IG51bGxwdHIgfHwgIXJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKSB7Ci0gICAgICAgIGVyciA9IElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0gZWxzZSBpZiAoZXJyID09IE9LICYmIGlzT2ZmbG9hZGVkICE9IE5VTEwpIHsKLSAgICAgICAgaW50MzJfdCBvZmZsb2FkOwotICAgICAgICBDSEVDSyhyZXNwb25zZS0+ZmluZEludDMyKCJvZmZsb2FkIiwgJm9mZmxvYWQpKTsKLSAgICAgICAgKmlzT2ZmbG9hZGVkID0gKG9mZmxvYWQgIT0gMCk7Ci0gICAgfQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Y2xvc2VBdWRpb1NpbmsoKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENsb3NlQXVkaW9TaW5rLCB0aGlzKTsKLQotICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKLSAgICBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Y2hhbmdlQXVkaW9Gb3JtYXQoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAotICAgICAgICBib29sIG9mZmxvYWRPbmx5LAotICAgICAgICBib29sIGhhc1ZpZGVvLAotICAgICAgICB1aW50MzJfdCBmbGFncywKLSAgICAgICAgYm9vbCBpc1N0cmVhbWluZywKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpIHsKLSAgICBzcDxBTWVzc2FnZT4gbWV0YSA9IG5ldyBBTWVzc2FnZTsKLSAgICBtZXRhLT5zZXRNZXNzYWdlKCJmb3JtYXQiLCBmb3JtYXQpOwotICAgIG1ldGEtPnNldEludDMyKCJvZmZsb2FkLW9ubHkiLCBvZmZsb2FkT25seSk7Ci0gICAgbWV0YS0+c2V0SW50MzIoImhhcy12aWRlbyIsIGhhc1ZpZGVvKTsKLSAgICBtZXRhLT5zZXRJbnQzMigiZmxhZ3MiLCBmbGFncyk7Ci0gICAgbWV0YS0+c2V0SW50MzIoImlzU3RyZWFtaW5nIiwgaXNTdHJlYW1pbmcpOwotCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdENoYW5nZUF1ZGlvRm9ybWF0LCB0aGlzKTsKLSAgICBtc2ctPnNldEludDMyKCJxdWV1ZUdlbmVyYXRpb24iLCBnZXRRdWV1ZUdlbmVyYXRpb24odHJ1ZSAvKiBhdWRpbyAqLykpOwotICAgIG1zZy0+c2V0TWVzc2FnZSgibm90aWZ5Iiwgbm90aWZ5KTsKLSAgICBtc2ctPnNldE1lc3NhZ2UoIm1ldGEiLCBtZXRhKTsKLSAgICBtc2ctPnBvc3QoKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKLSAgICAgICAgY2FzZSBrV2hhdE9wZW5BdWRpb1Npbms6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7Ci0KLSAgICAgICAgICAgIGludDMyX3Qgb2ZmbG9hZE9ubHk7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigib2ZmbG9hZC1vbmx5IiwgJm9mZmxvYWRPbmx5KSk7Ci0KLSAgICAgICAgICAgIGludDMyX3QgaGFzVmlkZW87Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiaGFzLXZpZGVvIiwgJmhhc1ZpZGVvKSk7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImZsYWdzIiwgKGludDMyX3QgKikmZmxhZ3MpKTsKLQotICAgICAgICAgICAgdWludDMyX3QgaXNTdHJlYW1pbmc7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiaXNTdHJlYW1pbmciLCAoaW50MzJfdCAqKSZpc1N0cmVhbWluZykpOwotCi0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvbk9wZW5BdWRpb1NpbmsoZm9ybWF0LCBvZmZsb2FkT25seSwgaGFzVmlkZW8sIGZsYWdzLCBpc1N0cmVhbWluZyk7Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigib2ZmbG9hZCIsIG9mZmxvYWRpbmdBdWRpbygpKTsKLQotICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRDbG9zZUF1ZGlvU2luazoKLSAgICAgICAgewotICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0KLSAgICAgICAgICAgIG9uQ2xvc2VBdWRpb1NpbmsoKTsKLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IHJlc3BvbnNlID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFN0b3BBdWRpb1Npbms6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdENoYW5nZUF1ZGlvRm9ybWF0OgotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQzMl90IHF1ZXVlR2VuZXJhdGlvbjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJxdWV1ZUdlbmVyYXRpb24iLCAmcXVldWVHZW5lcmF0aW9uKSk7Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnk7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJub3RpZnkiLCAmbm90aWZ5KSk7Ci0KLSAgICAgICAgICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjaGFuZ2VBdWRpb0Zvcm1hdCBzaG91bGQgTk9UIGJlIGNhbGxlZCBpbiBvZmZsb2FkIG1vZGUiKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBJTlZBTElEX09QRVJBVElPTik7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtZXRhOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kTWVzc2FnZSgibWV0YSIsICZtZXRhKSk7Ci0KLSAgICAgICAgICAgIGlmIChxdWV1ZUdlbmVyYXRpb24gIT0gZ2V0UXVldWVHZW5lcmF0aW9uKHRydWUgLyogYXVkaW8gKi8pCi0gICAgICAgICAgICAgICAgICAgIHx8IG1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBvbkNoYW5nZUF1ZGlvRm9ybWF0KG1ldGEsIG5vdGlmeSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFF1ZXVlRW50cnkgZW50cnk7Ci0gICAgICAgICAgICBlbnRyeS5tTm90aWZ5Q29uc3VtZWQgPSBub3RpZnk7Ci0gICAgICAgICAgICBlbnRyeS5tTWV0YSA9IG1ldGE7Ci0KLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgICAgICBtQXVkaW9RdWV1ZS5wdXNoX2JhY2soZW50cnkpOwotICAgICAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKCk7Ci0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdERyYWluQXVkaW9RdWV1ZToKLSAgICAgICAgewotICAgICAgICAgICAgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKLQotICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImRyYWluR2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7Ci0gICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBnZXREcmFpbkdlbmVyYXRpb24odHJ1ZSAvKiBhdWRpbyAqLykpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG9uRHJhaW5BdWRpb1F1ZXVlKCkpIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBudW1GcmFtZXNQbGF5ZWQ7Ci0gICAgICAgICAgICAgICAgQ0hFQ0tfRVEobUF1ZGlvU2luay0+Z2V0UG9zaXRpb24oJm51bUZyYW1lc1BsYXllZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXR1c190KU9LKTsKLQotICAgICAgICAgICAgICAgIC8vIEhhbmRsZSBBdWRpb1RyYWNrIHJhY2Ugd2hlbiBzdGFydCBpcyBpbW1lZGlhdGVseSBjYWxsZWQgYWZ0ZXIgZmx1c2guCi0gICAgICAgICAgICAgICAgdWludDMyX3QgbnVtRnJhbWVzUGVuZGluZ1BsYXlvdXQgPQotICAgICAgICAgICAgICAgICAgICAobU51bUZyYW1lc1dyaXR0ZW4gPiBudW1GcmFtZXNQbGF5ZWQgPwotICAgICAgICAgICAgICAgICAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gLSBudW1GcmFtZXNQbGF5ZWQgOiAwKTsKLQotICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgaG93IGxvbmcgdGhlIGF1ZGlvIHNpbmsgd2lsbCBoYXZlIGRhdGEgdG8KLSAgICAgICAgICAgICAgICAvLyBwbGF5IGJhY2suCi0gICAgICAgICAgICAgICAgaW50NjRfdCBkZWxheVVzID0KLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvU2luay0+bXNlY3NQZXJGcmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAqIG51bUZyYW1lc1BlbmRpbmdQbGF5b3V0ICogMTAwMGxsOwotICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tSYXRlID4gMS4wZikgewotICAgICAgICAgICAgICAgICAgICBkZWxheVVzIC89IG1QbGF5YmFja1JhdGU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gTGV0J3MgZ2l2ZSBpdCBtb3JlIGRhdGEgYWZ0ZXIgYWJvdXQgaGFsZiB0aGF0IHRpbWUKLSAgICAgICAgICAgICAgICAvLyBoYXMgZWxhcHNlZC4KLSAgICAgICAgICAgICAgICBkZWxheVVzIC89IDI7Ci0gICAgICAgICAgICAgICAgLy8gY2hlY2sgdGhlIGJ1ZmZlciBzaXplIHRvIGVzdGltYXRlIG1heGltdW0gZGVsYXkgcGVybWl0dGVkLgotICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbWF4RHJhaW5EZWxheVVzID0gc3RkOjptYXgoCi0gICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5nZXRCdWZmZXJEdXJhdGlvbkluVXMoKSwgKGludDY0X3QpNTAwMDAwIC8qIGhhbGYgc2Vjb25kICovKTsKLSAgICAgICAgICAgICAgICBBTE9HRF9JRihkZWxheVVzID4gbWF4RHJhaW5EZWxheVVzLCAicG9zdERyYWluQXVkaW9RdWV1ZSBsb25nIGRlbGF5OiAlbGxkID4gJWxsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKWRlbGF5VXMsIChsb25nIGxvbmcpbWF4RHJhaW5EZWxheVVzKTsKLSAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICAgICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbChkZWxheVVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdERyYWluVmlkZW9RdWV1ZToKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImRyYWluR2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7Ci0gICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBnZXREcmFpbkdlbmVyYXRpb24oZmFsc2UgLyogYXVkaW8gKi8pKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIG9uRHJhaW5WaWRlb1F1ZXVlKCk7Ci0KLSAgICAgICAgICAgIHBvc3REcmFpblZpZGVvUXVldWUoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFBvc3REcmFpblZpZGVvUXVldWU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJkcmFpbkdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOwotICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gZ2V0RHJhaW5HZW5lcmF0aW9uKGZhbHNlIC8qIGF1ZGlvICovKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IGZhbHNlOwotICAgICAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0UXVldWVCdWZmZXI6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG9uUXVldWVCdWZmZXIobXNnKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdFF1ZXVlRU9TOgotICAgICAgICB7Ci0gICAgICAgICAgICBvblF1ZXVlRU9TKG1zZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRFT1M6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGludDMyX3QgZ2VuZXJhdGlvbjsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpb0VPU0dlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOwotICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gIT0gbUF1ZGlvRU9TR2VuZXJhdGlvbikgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZmluYWxSZXN1bHQiLCAmZmluYWxSZXN1bHQpKTsKLSAgICAgICAgICAgIG5vdGlmeUVPUyh0cnVlIC8qIGF1ZGlvICovLCBmaW5hbFJlc3VsdCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRDb25maWdQbGF5YmFjazoKLSAgICAgICAgewotICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0gICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSByYXRlOwotICAgICAgICAgICAgcmVhZEZyb21BTWVzc2FnZShtc2csICZyYXRlKTsKLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IG9uQ29uZmlnUGxheWJhY2socmF0ZSk7Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgICAgICAgICByZXNwb25zZS0+cG9zdFJlcGx5KHJlcGx5SUQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0R2V0UGxheWJhY2tTZXR0aW5nczoKLSAgICAgICAgewotICAgICAgICAgICAgc3A8QVJlcGx5VG9rZW4+IHJlcGx5SUQ7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPnNlbmRlckF3YWl0c1Jlc3BvbnNlKCZyZXBseUlEKSk7Ci0gICAgICAgICAgICBBdWRpb1BsYXliYWNrUmF0ZSByYXRlID0gQVVESU9fUExBWUJBQ0tfUkFURV9ERUZBVUxUOwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gb25HZXRQbGF5YmFja1NldHRpbmdzKCZyYXRlKTsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICB3cml0ZVRvQU1lc3NhZ2UocmVzcG9uc2UsIHJhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVzcG9uc2UtPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgICAgICAgICAgcmVzcG9uc2UtPnBvc3RSZXBseShyZXBseUlEKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdENvbmZpZ1N5bmM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotICAgICAgICAgICAgQVZTeW5jU2V0dGluZ3Mgc3luYzsKLSAgICAgICAgICAgIGZsb2F0IHZpZGVvRnBzSGludDsKLSAgICAgICAgICAgIHJlYWRGcm9tQU1lc3NhZ2UobXNnLCAmc3luYywgJnZpZGVvRnBzSGludCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvbkNvbmZpZ1N5bmMoc3luYywgdmlkZW9GcHNIaW50KTsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRHZXRTeW5jU2V0dGluZ3M6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFSZXBseVRva2VuPiByZXBseUlEOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotCi0gICAgICAgICAgICBBTE9HVigia1doYXRHZXRTeW5jU2V0dGluZ3MiKTsKLSAgICAgICAgICAgIEFWU3luY1NldHRpbmdzIHN5bmM7Ci0gICAgICAgICAgICBmbG9hdCB2aWRlb0ZwcyA9IC0xLmY7Ci0gICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBvbkdldFN5bmNTZXR0aW5ncygmc3luYywgJnZpZGVvRnBzKTsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZSA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgICAgICAgICB3cml0ZVRvQU1lc3NhZ2UocmVzcG9uc2UsIHN5bmMsIHZpZGVvRnBzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlc3BvbnNlLT5zZXRJbnQzMigiZXJyIiwgZXJyKTsKLSAgICAgICAgICAgIHJlc3BvbnNlLT5wb3N0UmVwbHkocmVwbHlJRCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRGbHVzaDoKLSAgICAgICAgewotICAgICAgICAgICAgb25GbHVzaChtc2cpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0RGlzYWJsZU9mZmxvYWRBdWRpbzoKLSAgICAgICAgewotICAgICAgICAgICAgb25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRFbmFibGVPZmZsb2FkQXVkaW86Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG9uRW5hYmxlT2ZmbG9hZEF1ZGlvKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2Uga1doYXRQYXVzZToKLSAgICAgICAgewotICAgICAgICAgICAgb25QYXVzZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0UmVzdW1lOgotICAgICAgICB7Ci0gICAgICAgICAgICBvblJlc3VtZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0U2V0VmlkZW9GcmFtZVJhdGU6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGZsb2F0IGZwczsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEZsb2F0KCJmcmFtZS1yYXRlIiwgJmZwcykpOwotICAgICAgICAgICAgb25TZXRWaWRlb0ZyYW1lUmF0ZShmcHMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0QXVkaW9UZWFyRG93bjoKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCByZWFzb247Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicmVhc29uIiwgJnJlYXNvbikpOwotCi0gICAgICAgICAgICBvbkF1ZGlvVGVhckRvd24oKEF1ZGlvVGVhckRvd25SZWFzb24pcmVhc29uKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBrV2hhdEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dDoKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImRyYWluR2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7Ci0gICAgICAgICAgICBpZiAoZ2VuZXJhdGlvbiAhPSBtQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0R2VuZXJhdGlvbikgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoIkF1ZGlvIE9mZmxvYWQgdGVhciBkb3duIGR1ZSB0byBwYXVzZSB0aW1lb3V0LiIpOwotICAgICAgICAgICAgb25BdWRpb1RlYXJEb3duKGtEdWVUb1RpbWVvdXQpOwotICAgICAgICAgICAgbVdha2VMb2NrLT5yZWxlYXNlKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUUkVTUEFTUygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6OnBvc3REcmFpbkF1ZGlvUXVldWVfbChpbnQ2NF90IGRlbGF5VXMpIHsKLSAgICBpZiAobURyYWluQXVkaW9RdWV1ZVBlbmRpbmcgfHwgbVN5bmNRdWV1ZXMgfHwgbVVzZUF1ZGlvQ2FsbGJhY2spIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChtQXVkaW9RdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBGSVhNRTogaWYgcGF1c2VkLCB3YWl0IHVudGlsIEF1ZGlvVHJhY2sgc3RvcCgpIGlzIGNvbXBsZXRlIGJlZm9yZSBkZWxpdmVyaW5nIGRhdGEuCi0gICAgaWYgKG1QYXVzZWQpIHsKLSAgICAgICAgY29uc3QgaW50NjRfdCBkaWZmVXMgPSBtUGF1c2VEcmFpbkF1ZGlvQWxsb3dlZFVzIC0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICAgICAgaWYgKGRpZmZVcyA+IGRlbGF5VXMpIHsKLSAgICAgICAgICAgIGRlbGF5VXMgPSBkaWZmVXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBtRHJhaW5BdWRpb1F1ZXVlUGVuZGluZyA9IHRydWU7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdERyYWluQXVkaW9RdWV1ZSwgdGhpcyk7Ci0gICAgbXNnLT5zZXRJbnQzMigiZHJhaW5HZW5lcmF0aW9uIiwgbUF1ZGlvRHJhaW5HZW5lcmF0aW9uKTsKLSAgICBtc2ctPnBvc3QoZGVsYXlVcyk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6cHJlcGFyZUZvck1lZGlhUmVuZGVyaW5nU3RhcnRfbCgpIHsKLSAgICBtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPSBtQXVkaW9EcmFpbkdlbmVyYXRpb247Ci0gICAgbVZpZGVvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uID0gbVZpZGVvRHJhaW5HZW5lcmF0aW9uOwotICAgIG1SZW5kZXJpbmdEYXRhRGVsaXZlcmVkID0gZmFsc2U7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6bm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWRfbCgpIHsKLSAgICBpZiAobVZpZGVvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uID09IG1WaWRlb0RyYWluR2VuZXJhdGlvbiAmJgotICAgICAgICBtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPT0gbUF1ZGlvRHJhaW5HZW5lcmF0aW9uKSB7Ci0gICAgICAgIG1SZW5kZXJpbmdEYXRhRGVsaXZlcmVkID0gdHJ1ZTsKLSAgICAgICAgaWYgKG1QYXVzZWQpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb24gPSAtMTsKLSAgICAgICAgbUF1ZGlvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uID0gLTE7Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRNZWRpYVJlbmRlcmluZ1N0YXJ0KTsKLSAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLXNpemVfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpBdWRpb1NpbmtDYWxsYmFjaygKLSAgICAgICAgTWVkaWFQbGF5ZXIySW50ZXJmYWNlOjpBdWRpb1NpbmsgKiAvKiBhdWRpb1NpbmsgKi8sCi0gICAgICAgIHZvaWQgKmJ1ZmZlciwKLSAgICAgICAgc2l6ZV90IHNpemUsCi0gICAgICAgIHZvaWQgKmNvb2tpZSwKLSAgICAgICAgTWVkaWFQbGF5ZXIySW50ZXJmYWNlOjpBdWRpb1Npbms6OmNiX2V2ZW50X3QgZXZlbnQpIHsKLSAgICBOdVBsYXllcjI6OlJlbmRlcmVyICptZSA9IChOdVBsYXllcjI6OlJlbmRlcmVyICopY29va2llOwotCi0gICAgc3dpdGNoIChldmVudCkgewotICAgICAgICBjYXNlIE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rOjpDQl9FVkVOVF9GSUxMX0JVRkZFUjoKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1lLT5maWxsQXVkaW9CdWZmZXIoYnVmZmVyLCBzaXplKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luazo6Q0JfRVZFTlRfU1RSRUFNX0VORDoKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoIkF1ZGlvU2luazo6Q0JfRVZFTlRfU1RSRUFNX0VORCIpOwotICAgICAgICAgICAgbWUtPm5vdGlmeUVPU0NhbGxiYWNrKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgTWVkaWFQbGF5ZXIySW50ZXJmYWNlOjpBdWRpb1Npbms6OkNCX0VWRU5UX1RFQVJfRE9XTjoKLSAgICAgICAgewotICAgICAgICAgICAgQUxPR1YoIkF1ZGlvU2luazo6Q0JfRVZFTlRfVEVBUl9ET1dOIik7Ci0gICAgICAgICAgICBtZS0+bm90aWZ5QXVkaW9UZWFyRG93bihrRHVlVG9FcnJvcik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiAwOwotfQotCi12b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om5vdGlmeUVPU0NhbGxiYWNrKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAoIW1Vc2VBdWRpb0NhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBub3RpZnlFT1NfbCh0cnVlIC8qIGF1ZGlvICovLCBFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKLX0KLQotc2l6ZV90IE51UGxheWVyMjo6UmVuZGVyZXI6OmZpbGxBdWRpb0J1ZmZlcih2b2lkICpidWZmZXIsIHNpemVfdCBzaXplKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmICghbVVzZUF1ZGlvQ2FsbGJhY2spIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNFT1MgPSBmYWxzZTsKLQotICAgIHNpemVfdCBzaXplQ29waWVkID0gMDsKLSAgICBib29sIGZpcnN0RW50cnkgPSB0cnVlOwotICAgIFF1ZXVlRW50cnkgKmVudHJ5OyAgLy8gd2lsbCBiZSB2YWxpZCBhZnRlciB3aGlsZSBsb29wIGlmIGhhc0VPUyBpcyBzZXQuCi0gICAgd2hpbGUgKHNpemVDb3BpZWQgPCBzaXplICYmICFtQXVkaW9RdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIGVudHJ5ID0gJiptQXVkaW9RdWV1ZS5iZWdpbigpOwotCi0gICAgICAgIGlmIChlbnRyeS0+bUJ1ZmZlciA9PSBOVUxMKSB7IC8vIEVPUwotICAgICAgICAgICAgaGFzRU9TID0gdHJ1ZTsKLSAgICAgICAgICAgIG1BdWRpb1F1ZXVlLmVyYXNlKG1BdWRpb1F1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmlyc3RFbnRyeSAmJiBlbnRyeS0+bU9mZnNldCA9PSAwKSB7Ci0gICAgICAgICAgICBmaXJzdEVudHJ5ID0gZmFsc2U7Ci0gICAgICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwotICAgICAgICAgICAgQ0hFQ0soZW50cnktPm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKLSAgICAgICAgICAgIEFMT0dWKCJmaWxsQXVkaW9CdWZmZXI6IHJlbmRlcmluZyBhdWRpbyBhdCBtZWRpYSB0aW1lICUuMmYgc2VjcyIsIG1lZGlhVGltZVVzIC8gMUU2KTsKLSAgICAgICAgICAgIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWRfbChtZWRpYVRpbWVVcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgY29weSA9IGVudHJ5LT5tQnVmZmVyLT5zaXplKCkgLSBlbnRyeS0+bU9mZnNldDsKLSAgICAgICAgc2l6ZV90IHNpemVSZW1haW5pbmcgPSBzaXplIC0gc2l6ZUNvcGllZDsKLSAgICAgICAgaWYgKGNvcHkgPiBzaXplUmVtYWluaW5nKSB7Ci0gICAgICAgICAgICBjb3B5ID0gc2l6ZVJlbWFpbmluZzsKLSAgICAgICAgfQotCi0gICAgICAgIG1lbWNweSgoY2hhciAqKWJ1ZmZlciArIHNpemVDb3BpZWQsCi0gICAgICAgICAgICAgICBlbnRyeS0+bUJ1ZmZlci0+ZGF0YSgpICsgZW50cnktPm1PZmZzZXQsCi0gICAgICAgICAgICAgICBjb3B5KTsKLQotICAgICAgICBlbnRyeS0+bU9mZnNldCArPSBjb3B5OwotICAgICAgICBpZiAoZW50cnktPm1PZmZzZXQgPT0gZW50cnktPm1CdWZmZXItPnNpemUoKSkgewotICAgICAgICAgICAgZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+cG9zdCgpOwotICAgICAgICAgICAgbUF1ZGlvUXVldWUuZXJhc2UobUF1ZGlvUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgICAgICBlbnRyeSA9IE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgc2l6ZUNvcGllZCArPSBjb3B5OwotCi0gICAgICAgIG5vdGlmeUlmTWVkaWFSZW5kZXJpbmdTdGFydGVkX2woKTsKLSAgICB9Ci0KLSAgICBpZiAobUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyA+PSAwKSB7Ci0gICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgICAgICBpbnQ2NF90IG5vd01lZGlhVXMgPQotICAgICAgICAgICAgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcyArIG1BdWRpb1NpbmstPmdldFBsYXllZE91dER1cmF0aW9uVXMobm93VXMpOwotICAgICAgICAvLyB3ZSBkb24ndCBrbm93IGhvdyBtdWNoIGRhdGEgd2UgYXJlIHF1ZXVlaW5nIGZvciBvZmZsb2FkZWQgdHJhY2tzLgotICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlQW5jaG9yKG5vd01lZGlhVXMsIG5vd1VzLCBJTlQ2NF9NQVgpOwotICAgIH0KLQotICAgIC8vIGZvciBub24tb2ZmbG9hZGVkIGF1ZGlvLCB3ZSBuZWVkIHRvIGNvbXB1dGUgdGhlIGZyYW1lcyB3cml0dGVuIGJlY2F1c2UKLSAgICAvLyB0aGVyZSBpcyBubyBFVkVOVF9TVFJFQU1fRU5EIG5vdGlmaWNhdGlvbi4gVGhlIGZyYW1lcyB3cml0dGVuIGdpdmVzCi0gICAgLy8gYW4gZXN0aW1hdGUgb24gdGhlIHBlbmRpbmcgcGxheWVkIG91dCBkdXJhdGlvbi4KLSAgICBpZiAoIW9mZmxvYWRpbmdBdWRpbygpKSB7Ci0gICAgICAgIG1OdW1GcmFtZXNXcml0dGVuICs9IHNpemVDb3BpZWQgLyBtQXVkaW9TaW5rLT5mcmFtZVNpemUoKTsKLSAgICB9Ci0KLSAgICBpZiAoaGFzRU9TKSB7Ci0gICAgICAgIChuZXcgQU1lc3NhZ2Uoa1doYXRTdG9wQXVkaW9TaW5rLCB0aGlzKSktPnBvc3QoKTsKLSAgICAgICAgLy8gQXMgdGhlcmUgaXMgY3VycmVudGx5IG5vIEVWRU5UX1NUUkVBTV9FTkQgY2FsbGJhY2sgbm90aWZpY2F0aW9uIGZvcgotICAgICAgICAvLyBub24tb2ZmbG9hZGVkIGF1ZGlvIHRyYWNrcywgd2UgbmVlZCB0byBwb3N0IHRoZSBFT1Mgb3Vyc2VsdmVzLgotICAgICAgICBpZiAoIW9mZmxvYWRpbmdBdWRpbygpKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IHBvc3RFT1NEZWxheVVzID0gMDsKLSAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rLT5uZWVkc1RyYWlsaW5nUGFkZGluZygpKSB7Ci0gICAgICAgICAgICAgICAgcG9zdEVPU0RlbGF5VXMgPSBnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25VcyhBTG9vcGVyOjpHZXROb3dVcygpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFMT0dWKCJmaWxsQXVkaW9CdWZmZXI6IG5vdGlmeUVPU19sICIKLSAgICAgICAgICAgICAgICAgICAgIm1OdW1GcmFtZXNXcml0dGVuOiV1ICBmaW5hbFJlc3VsdDolZCAgcG9zdEVPU0RlbGF5OiVsbGQiLAotICAgICAgICAgICAgICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiwgZW50cnktPm1GaW5hbFJlc3VsdCwgKGxvbmcgbG9uZylwb3N0RU9TRGVsYXlVcyk7Ci0gICAgICAgICAgICBub3RpZnlFT1NfbCh0cnVlIC8qIGF1ZGlvICovLCBlbnRyeS0+bUZpbmFsUmVzdWx0LCBwb3N0RU9TRGVsYXlVcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNpemVDb3BpZWQ7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6ZHJhaW5BdWRpb1F1ZXVlVW50aWxMYXN0RU9TKCkgewotICAgIExpc3Q8UXVldWVFbnRyeT46Oml0ZXJhdG9yIGl0ID0gbUF1ZGlvUXVldWUuYmVnaW4oKSwgaXRFT1MgPSBpdDsKLSAgICBib29sIGZvdW5kRU9TID0gZmFsc2U7Ci0gICAgd2hpbGUgKGl0ICE9IG1BdWRpb1F1ZXVlLmVuZCgpKSB7Ci0gICAgICAgIGludDMyX3QgZW9zOwotICAgICAgICBRdWV1ZUVudHJ5ICplbnRyeSA9ICYqaXQrKzsKLSAgICAgICAgaWYgKChlbnRyeS0+bUJ1ZmZlciA9PSBudWxscHRyICYmIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQgPT0gbnVsbHB0cikKLSAgICAgICAgICAgICAgICB8fCAoZW50cnktPm1Ob3RpZnlDb25zdW1lZC0+ZmluZEludDMyKCJlb3MiLCAmZW9zKSAmJiBlb3MgIT0gMCkpIHsKLSAgICAgICAgICAgIGl0RU9TID0gaXQ7Ci0gICAgICAgICAgICBmb3VuZEVPUyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZm91bmRFT1MpIHsKLSAgICAgICAgLy8gcG9zdCBhbGwgcmVwbGllcyBiZWZvcmUgRU9TIGFuZCBkcm9wIHRoZSBzYW1wbGVzCi0gICAgICAgIGZvciAoaXQgPSBtQXVkaW9RdWV1ZS5iZWdpbigpOyBpdCAhPSBpdEVPUzsgaXQrKykgewotICAgICAgICAgICAgaWYgKGl0LT5tQnVmZmVyID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXQtPm1Ob3RpZnlDb25zdW1lZCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGRlbGF5IGRvZXNuJ3QgbWF0dGVyIGFzIHdlIGRvbid0IGV2ZW4gaGF2ZSBhbiBBdWRpb1RyYWNrCi0gICAgICAgICAgICAgICAgICAgIG5vdGlmeUVPUyh0cnVlIC8qIGF1ZGlvICovLCBpdC0+bUZpbmFsUmVzdWx0KTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBUQUcgZm9yIHJlLW9wZW5pbmcgYXVkaW8gc2luay4KLSAgICAgICAgICAgICAgICAgICAgb25DaGFuZ2VBdWRpb0Zvcm1hdChpdC0+bU1ldGEsIGl0LT5tTm90aWZ5Q29uc3VtZWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaXQtPm1Ob3RpZnlDb25zdW1lZC0+cG9zdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1BdWRpb1F1ZXVlLmVyYXNlKG1BdWRpb1F1ZXVlLmJlZ2luKCksIGl0RU9TKTsKLSAgICB9Ci19Ci0KLWJvb2wgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25EcmFpbkF1ZGlvUXVldWUoKSB7Ci0gICAgLy8gZG8gbm90IGRyYWluIGF1ZGlvIGR1cmluZyB0ZWFyZG93biBhcyBxdWV1ZWQgYnVmZmVycyBtYXkgYmUgaW52YWxpZC4KLSAgICBpZiAobUF1ZGlvVG9ybkRvd24pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvLyBUT0RPOiBUaGlzIGNhbGwgdG8gZ2V0UG9zaXRpb24gY2hlY2tzIGlmIEF1ZGlvVHJhY2sgaGFzIGJlZW4gY3JlYXRlZAotICAgIC8vIGluIEF1ZGlvU2luayBiZWZvcmUgZHJhaW5pbmcgYXVkaW8uIElmIEF1ZGlvVHJhY2sgZG9lc24ndCBleGlzdCwgdGhlbgotICAgIC8vIENIRUNLcyBvbiBnZXRQb3NpdGlvbiB3aWxsIGZhaWwuCi0gICAgLy8gV2Ugc3RpbGwgbmVlZCB0byBmaWd1cmUgb3V0IHdoeSBBdWRpb1RyYWNrIGlzIG5vdCBjcmVhdGVkIHdoZW4KLSAgICAvLyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4gT25lIHBvc3NpYmxlIHJlYXNvbiBjb3VsZCBiZSBsZWZ0b3ZlcgotICAgIC8vIGF1ZGlvLiBBbm90aGVyIHBvc3NpYmxlIHBsYWNlIGlzIHRvIGNoZWNrIHdoZXRoZXIgZGVjb2RlcgotICAgIC8vIGhhcyByZWNlaXZlZCBJTkZPX0ZPUk1BVF9DSEFOR0VEIGFzIHRoZSBmaXJzdCBidWZmZXIgc2luY2UKLSAgICAvLyBBdWRpb1NpbmsgaXMgb3BlbmVkIHRoZXJlLCBhbmQgcG9zc2libGUgaW50ZXJhY3Rpb25zIHdpdGggZmx1c2gKLSAgICAvLyBpbW1lZGlhdGVseSBhZnRlciBzdGFydC4gSW52ZXN0aWdhdGUgZXJyb3IgbWVzc2FnZQotICAgIC8vICJ2b3JiaXNfZHNwX3N5bnRoZXNpcyByZXR1cm5lZCAtMTM1IiwgYWxvbmcgd2l0aCBSVFNQLgotICAgIHVpbnQzMl90IG51bUZyYW1lc1BsYXllZDsKLSAgICBpZiAobUF1ZGlvU2luay0+Z2V0UG9zaXRpb24oJm51bUZyYW1lc1BsYXllZCkgIT0gT0spIHsKLSAgICAgICAgLy8gV2hlbiBnZXRQb3NpdGlvbiBmYWlscywgcmVuZGVyZXIgd2lsbCBub3QgcmVzY2hlZHVsZSB0aGUgZHJhaW5pbmcKLSAgICAgICAgLy8gdW5sZXNzIG5ldyBzYW1wbGVzIGFyZSBxdWV1ZWQuCi0gICAgICAgIC8vIElmIHdlIGhhdmUgcGVuZGluZyBFT1MgKG9yICJlb3MiIG1hcmtlciBmb3IgZGlzY29udGludWl0aWVzKSwgd2UgbmVlZAotICAgICAgICAvLyB0byBwb3N0IHRoZXNlIG5vdyBhcyBOdVBsYXllcjJEZWNvZGVyIG1pZ2h0IGJlIHdhaXRpbmcgZm9yIGl0LgotICAgICAgICBkcmFpbkF1ZGlvUXVldWVVbnRpbExhc3RFT1MoKTsKLQotICAgICAgICBBTE9HVygib25EcmFpbkF1ZGlvUXVldWUoKTogYXVkaW8gc2luayBpcyBub3QgcmVhZHkiKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotI2lmIDAKLSAgICBzc2l6ZV90IG51bUZyYW1lc0F2YWlsYWJsZVRvV3JpdGUgPQotICAgICAgICBtQXVkaW9TaW5rLT5mcmFtZUNvdW50KCkgLSAobU51bUZyYW1lc1dyaXR0ZW4gLSBudW1GcmFtZXNQbGF5ZWQpOwotCi0gICAgaWYgKG51bUZyYW1lc0F2YWlsYWJsZVRvV3JpdGUgPT0gbUF1ZGlvU2luay0+ZnJhbWVDb3VudCgpKSB7Ci0gICAgICAgIEFMT0dJKCJhdWRpbyBzaW5rIHVuZGVycnVuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR1YoImF1ZGlvIHF1ZXVlIGhhcyAlZCBmcmFtZXMgbGVmdCB0byBwbGF5IiwKLSAgICAgICAgICAgICBtQXVkaW9TaW5rLT5mcmFtZUNvdW50KCkgLSBudW1GcmFtZXNBdmFpbGFibGVUb1dyaXRlKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIHVpbnQzMl90IHByZXZGcmFtZXNXcml0dGVuID0gbU51bUZyYW1lc1dyaXR0ZW47Ci0gICAgd2hpbGUgKCFtQXVkaW9RdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIFF1ZXVlRW50cnkgKmVudHJ5ID0gJiptQXVkaW9RdWV1ZS5iZWdpbigpOwotCi0gICAgICAgIGlmIChlbnRyeS0+bUJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBpZiAoZW50cnktPm1Ob3RpZnlDb25zdW1lZCAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgLy8gVEFHIGZvciByZS1vcGVuIGF1ZGlvIHNpbmsuCi0gICAgICAgICAgICAgICAgb25DaGFuZ2VBdWRpb0Zvcm1hdChlbnRyeS0+bU1ldGEsIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQpOwotICAgICAgICAgICAgICAgIG1BdWRpb1F1ZXVlLmVyYXNlKG1BdWRpb1F1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBFT1MKLSAgICAgICAgICAgIGlmIChtUGF1c2VkKSB7Ci0gICAgICAgICAgICAgICAgLy8gRG8gbm90IG5vdGlmeSBFT1Mgd2hlbiBwYXVzZWQuCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBuZWVkZWQgdG8gYXZvaWQgc3dpdGNoIHRvIG5leHQgY2xpcCB3aGlsZSBpbiBwYXVzZS4KLSAgICAgICAgICAgICAgICBBTE9HVigib25EcmFpbkF1ZGlvUXVldWUoKTogRG8gbm90IG5vdGlmeSBFT1Mgd2hlbiBwYXVzZWQiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludDY0X3QgcG9zdEVPU0RlbGF5VXMgPSAwOwotICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmstPm5lZWRzVHJhaWxpbmdQYWRkaW5nKCkpIHsKLSAgICAgICAgICAgICAgICBwb3N0RU9TRGVsYXlVcyA9IGdldFBlbmRpbmdBdWRpb1BsYXlvdXREdXJhdGlvblVzKEFMb29wZXI6OkdldE5vd1VzKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm90aWZ5RU9TKHRydWUgLyogYXVkaW8gKi8sIGVudHJ5LT5tRmluYWxSZXN1bHQsIHBvc3RFT1NEZWxheVVzKTsKLSAgICAgICAgICAgIG1MYXN0QXVkaW9NZWRpYVRpbWVVcyA9IGdldER1cmF0aW9uVXNJZlBsYXllZEF0U2FtcGxlUmF0ZShtTnVtRnJhbWVzV3JpdHRlbik7Ci0KLSAgICAgICAgICAgIG1BdWRpb1F1ZXVlLmVyYXNlKG1BdWRpb1F1ZXVlLmJlZ2luKCkpOwotICAgICAgICAgICAgZW50cnkgPSBOVUxMOwotICAgICAgICAgICAgaWYgKG1BdWRpb1NpbmstPm5lZWRzVHJhaWxpbmdQYWRkaW5nKCkpIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBub3QgaW4gZ2FwbGVzcyBwbGF5YmFjayAoaS5lLiB0aHJvdWdoIHNldE5leHRQbGF5ZXIpLCB3ZQotICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gc3RvcCB0aGUgdHJhY2sgaGVyZSwgYmVjYXVzZSB0aGF0IHdpbGwgcGxheSBvdXQgdGhlIGxhc3QKLSAgICAgICAgICAgICAgICAvLyBsaXR0bGUgYml0IGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUuIE90aGVyd2lzZSBzaG9ydCBmaWxlcyB3b24ndCBwbGF5LgotICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKLSAgICAgICAgICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBtTGFzdEF1ZGlvQnVmZmVyRHJhaW5lZCA9IGVudHJ5LT5tQnVmZmVyT3JkaW5hbDsKLQotICAgICAgICAvLyBpZ25vcmUgMC1zaXplZCBidWZmZXIgd2hpY2ggY291bGQgYmUgRU9TIG1hcmtlciB3aXRoIG5vIGRhdGEKLSAgICAgICAgaWYgKGVudHJ5LT5tT2Zmc2V0ID09IDAgJiYgZW50cnktPm1CdWZmZXItPnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGludDY0X3QgbWVkaWFUaW1lVXM7Ci0gICAgICAgICAgICBDSEVDSyhlbnRyeS0+bUJ1ZmZlci0+bWV0YSgpLT5maW5kSW50NjQoInRpbWVVcyIsICZtZWRpYVRpbWVVcykpOwotICAgICAgICAgICAgQUxPR1YoIm9uRHJhaW5BdWRpb1F1ZXVlOiByZW5kZXJpbmcgYXVkaW8gYXQgbWVkaWEgdGltZSAlLjJmIHNlY3MiLAotICAgICAgICAgICAgICAgICAgICBtZWRpYVRpbWVVcyAvIDFFNik7Ci0gICAgICAgICAgICBvbk5ld0F1ZGlvTWVkaWFUaW1lKG1lZGlhVGltZVVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHNpemVfdCBjb3B5ID0gZW50cnktPm1CdWZmZXItPnNpemUoKSAtIGVudHJ5LT5tT2Zmc2V0OwotCi0gICAgICAgIHNzaXplX3Qgd3JpdHRlbiA9IG1BdWRpb1NpbmstPndyaXRlKGVudHJ5LT5tQnVmZmVyLT5kYXRhKCkgKyBlbnRyeS0+bU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29weSwgZmFsc2UgLyogYmxvY2tpbmcgKi8pOwotICAgICAgICBpZiAod3JpdHRlbiA8IDApIHsKLSAgICAgICAgICAgIC8vIEFuIGVycm9yIGluIEF1ZGlvU2luayB3cml0ZS4gUGVyaGFwcyB0aGUgQXVkaW9TaW5rIHdhcyBub3QgcHJvcGVybHkgb3BlbmVkLgotICAgICAgICAgICAgaWYgKHdyaXR0ZW4gPT0gV09VTERfQkxPQ0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9TaW5rIHdyaXRlIHdvdWxkIGJsb2NrIHdoZW4gd3JpdGluZyAlenUgYnl0ZXMiLCBjb3B5KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkF1ZGlvU2luayB3cml0ZSBlcnJvciglemQpIHdoZW4gd3JpdGluZyAlenUgYnl0ZXMiLCB3cml0dGVuLCBjb3B5KTsKLSAgICAgICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiB3aGVuIEF1ZGlvU2luayB3YXMgb3BlbmVkIHdpdGggZG9Ob3RSZWNvbm5lY3QgZmxhZyBzZXQgdG8KLSAgICAgICAgICAgICAgICAvLyB0cnVlLCBpbiB3aGljaCBjYXNlIHRoZSBOdVBsYXllcjIgd2lsbCBoYW5kbGUgdGhlIHJlY29ubmVjdC4KLSAgICAgICAgICAgICAgICBub3RpZnlBdWRpb1RlYXJEb3duKGtEdWVUb0Vycm9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZW50cnktPm1PZmZzZXQgKz0gd3JpdHRlbjsKLSAgICAgICAgc2l6ZV90IHJlbWFpbmRlciA9IGVudHJ5LT5tQnVmZmVyLT5zaXplKCkgLSBlbnRyeS0+bU9mZnNldDsKLSAgICAgICAgaWYgKChzc2l6ZV90KXJlbWFpbmRlciA8IG1BdWRpb1NpbmstPmZyYW1lU2l6ZSgpKSB7Ci0gICAgICAgICAgICBpZiAocmVtYWluZGVyID4gMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJDb3JydXB0ZWQgYXVkaW8gYnVmZmVyIGhhcyBmcmFjdGlvbmFsIGZyYW1lcywgZGlzY2FyZGluZyAlenUgYnl0ZXMuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmRlcik7Ci0gICAgICAgICAgICAgICAgZW50cnktPm1PZmZzZXQgKz0gcmVtYWluZGVyOwotICAgICAgICAgICAgICAgIGNvcHkgLT0gcmVtYWluZGVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5wb3N0KCk7Ci0gICAgICAgICAgICBtQXVkaW9RdWV1ZS5lcmFzZShtQXVkaW9RdWV1ZS5iZWdpbigpKTsKLQotICAgICAgICAgICAgZW50cnkgPSBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IGNvcGllZEZyYW1lcyA9IHdyaXR0ZW4gLyBtQXVkaW9TaW5rLT5mcmFtZVNpemUoKTsKLSAgICAgICAgbU51bUZyYW1lc1dyaXR0ZW4gKz0gY29waWVkRnJhbWVzOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgICAgICBpbnQ2NF90IG1heFRpbWVNZWRpYTsKLSAgICAgICAgICAgIG1heFRpbWVNZWRpYSA9Ci0gICAgICAgICAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzICsKLSAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KShtYXgoKGxvbmcgbG9uZyltTnVtRnJhbWVzV3JpdHRlbiAtIG1BbmNob3JOdW1GcmFtZXNXcml0dGVuLCAwTEwpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogMTAwMExMICogbUF1ZGlvU2luay0+bXNlY3NQZXJGcmFtZSgpKTsKLSAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVNYXhUaW1lTWVkaWEobWF4VGltZU1lZGlhKTsKLQotICAgICAgICAgICAgbm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWRfbCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHdyaXR0ZW4gIT0gKHNzaXplX3QpY29weSkgewotICAgICAgICAgICAgLy8gQSBzaG9ydCBjb3VudCB3YXMgcmVjZWl2ZWQgZnJvbSBBdWRpb1Npbms6OndyaXRlKCkKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyBBdWRpb1Npbmsgd3JpdGUgaXMgY2FsbGVkIGluIG5vbi1ibG9ja2luZyBtb2RlLgotICAgICAgICAgICAgLy8gSXQgbWF5IHJldHVybiB3aXRoIGEgc2hvcnQgY291bnQgd2hlbjoKLSAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAvLyAxKSBTaXplIHRvIGJlIGNvcGllZCBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgZnJhbWUgc2l6ZS4gRnJhY3Rpb25hbCBmcmFtZXMgYXJlCi0gICAgICAgICAgICAvLyAgICBkaXNjYXJkZWQuCi0gICAgICAgICAgICAvLyAyKSBUaGUgZGF0YSB0byBiZSBjb3BpZWQgZXhjZWVkcyB0aGUgYXZhaWxhYmxlIGJ1ZmZlciBpbiBBdWRpb1NpbmsuCi0gICAgICAgICAgICAvLyAzKSBBbiBlcnJvciBvY2N1cnMgYW5kIGRhdGEgaGFzIGJlZW4gcGFydGlhbGx5IGNvcGllZCB0byB0aGUgYnVmZmVyIGluIEF1ZGlvU2luay4KLSAgICAgICAgICAgIC8vIDQpIEF1ZGlvU2luayBpcyBhbiBBdWRpb0NhY2hlIGZvciBkYXRhIHJldHJpZXZhbCwgYW5kIHRoZSBBdWRpb0NhY2hlIGlzIGV4Y2VlZGVkLgotCi0gICAgICAgICAgICAvLyAoQ2FzZSAxKQotICAgICAgICAgICAgLy8gTXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZSBmcmFtZSBzaXplLiAgSWYgaXQgaXMgbm90IGEgbXVsdGlwbGUgb2YgYSBmcmFtZSBzaXplLCBpdAotICAgICAgICAgICAgLy8gbmVlZHMgdG8gZmFpbCwgYXMgd2Ugc2hvdWxkIG5vdCBjYXJyeSBvdmVyIGZyYWN0aW9uYWwgZnJhbWVzIGJldHdlZW4gY2FsbHMuCi0gICAgICAgICAgICBDSEVDS19FUShjb3B5ICUgbUF1ZGlvU2luay0+ZnJhbWVTaXplKCksIDB1KTsKLQotICAgICAgICAgICAgLy8gKENhc2UgMiwgMywgNCkKLSAgICAgICAgICAgIC8vIFJldHVybiBlYXJseSB0byB0aGUgY2FsbGVyLgotICAgICAgICAgICAgLy8gQmV3YXJlIG9mIGNhbGxpbmcgaW1tZWRpYXRlbHkgYWdhaW4gYXMgdGhpcyBtYXkgYnVzeS1sb29wIGlmIHlvdSBhcmUgbm90IGNhcmVmdWwuCi0gICAgICAgICAgICBBTE9HVigiQXVkaW9TaW5rIHdyaXRlIHNob3J0IGZyYW1lIGNvdW50ICV6ZCA8ICV6dSIsIHdyaXR0ZW4sIGNvcHkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBjYWxjdWxhdGUgd2hldGhlciB3ZSBuZWVkIHRvIHJlc2NoZWR1bGUgYW5vdGhlciB3cml0ZS4KLSAgICBib29sIHJlc2NoZWR1bGUgPSAhbUF1ZGlvUXVldWUuZW1wdHkoKQotICAgICAgICAgICAgJiYgKCFtUGF1c2VkCi0gICAgICAgICAgICAgICAgfHwgcHJldkZyYW1lc1dyaXR0ZW4gIT0gbU51bUZyYW1lc1dyaXR0ZW4pOyAvLyBwZXJtaXQgcGF1c2UgdG8gZmlsbCBidWZmZXJzCi0gICAgLy9BTE9HRCgicmVzY2hlZHVsZTolZCAgZW1wdHk6JWQgIG1QYXVzZWQ6JWQgIHByZXZGcmFtZXNXcml0dGVuOiV1ICBtTnVtRnJhbWVzV3JpdHRlbjoldSIsCi0gICAgLy8gICAgICAgIHJlc2NoZWR1bGUsIG1BdWRpb1F1ZXVlLmVtcHR5KCksIG1QYXVzZWQsIHByZXZGcmFtZXNXcml0dGVuLCBtTnVtRnJhbWVzV3JpdHRlbik7Ci0gICAgcmV0dXJuIHJlc2NoZWR1bGU7Ci19Ci0KLWludDY0X3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Z2V0RHVyYXRpb25Vc0lmUGxheWVkQXRTYW1wbGVSYXRlKHVpbnQzMl90IG51bUZyYW1lcykgewotICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IG9mZmxvYWRpbmdBdWRpbygpID8KLSAgICAgICAgICAgIG1DdXJyZW50T2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUgOiBtQ3VycmVudFBjbUluZm8ubVNhbXBsZVJhdGU7Ci0gICAgaWYgKHNhbXBsZVJhdGUgPT0gMCkgewotICAgICAgICBBTE9HRSgic2FtcGxlUmF0ZSBpcyAwIGluICVzIG1vZGUiLCBvZmZsb2FkaW5nQXVkaW8oKSA/ICJvZmZsb2FkIiA6ICJub24tb2ZmbG9hZCIpOwotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgcmV0dXJuIChpbnQ2NF90KShudW1GcmFtZXMgKiAxMDAwMDAwTEwgLyBzYW1wbGVSYXRlKTsKLX0KLQotLy8gQ2FsY3VsYXRlIGR1cmF0aW9uIG9mIHBlbmRpbmcgc2FtcGxlcyBpZiBwbGF5ZWQgYXQgbm9ybWFsIHJhdGUgKGkuZS4sIDEuMCkuCi1pbnQ2NF90IE51UGxheWVyMjo6UmVuZGVyZXI6OmdldFBlbmRpbmdBdWRpb1BsYXlvdXREdXJhdGlvblVzKGludDY0X3Qgbm93VXMpIHsKLSAgICBpbnQ2NF90IHdyaXR0ZW5BdWRpb0R1cmF0aW9uVXMgPSBnZXREdXJhdGlvblVzSWZQbGF5ZWRBdFNhbXBsZVJhdGUobU51bUZyYW1lc1dyaXR0ZW4pOwotICAgIGlmIChtVXNlVmlydHVhbEF1ZGlvU2luaykgewotICAgICAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICAgICAgaW50NjRfdCBtZWRpYVVzOwotICAgICAgICBpZiAobU1lZGlhQ2xvY2stPmdldE1lZGlhVGltZShub3dVcywgJm1lZGlhVXMpICE9IE9LKSB7Ci0gICAgICAgICAgICByZXR1cm4gMExMOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHdyaXR0ZW5BdWRpb0R1cmF0aW9uVXMgLSAobWVkaWFVcyAtIG1BdWRpb0ZpcnN0QW5jaG9yVGltZU1lZGlhVXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgY29uc3QgaW50NjRfdCBhdWRpb1NpbmtQbGF5ZWRVcyA9IG1BdWRpb1NpbmstPmdldFBsYXllZE91dER1cmF0aW9uVXMobm93VXMpOwotICAgIGludDY0X3QgcGVuZGluZ1VzID0gd3JpdHRlbkF1ZGlvRHVyYXRpb25VcyAtIGF1ZGlvU2lua1BsYXllZFVzOwotICAgIGlmIChwZW5kaW5nVXMgPCAwKSB7Ci0gICAgICAgIC8vIFRoaXMgc2hvdWxkbid0IGhhcHBlbiB1bmxlc3MgdGhlIHRpbWVzdGFtcCBpcyBzdGFsZS4KLSAgICAgICAgQUxPR1coIiVzOiBwZW5kaW5nVXMgJWxsZCA8IDAsIGNsYW1waW5nIHRvIHplcm8sIHBvdGVudGlhbCByZXN1bWUgYWZ0ZXIgcGF1c2UgIgotICAgICAgICAgICAgICAgICJ3cml0dGVuQXVkaW9EdXJhdGlvblVzOiAlbGxkLCBhdWRpb1NpbmtQbGF5ZWRVczogJWxsZCIsCi0gICAgICAgICAgICAgICAgX19mdW5jX18sIChsb25nIGxvbmcpcGVuZGluZ1VzLAotICAgICAgICAgICAgICAgIChsb25nIGxvbmcpd3JpdHRlbkF1ZGlvRHVyYXRpb25VcywgKGxvbmcgbG9uZylhdWRpb1NpbmtQbGF5ZWRVcyk7Ci0gICAgICAgIHBlbmRpbmdVcyA9IDA7Ci0gICAgfQotICAgIHJldHVybiBwZW5kaW5nVXM7Ci19Ci0KLWludDY0X3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Z2V0UmVhbFRpbWVVcyhpbnQ2NF90IG1lZGlhVGltZVVzLCBpbnQ2NF90IG5vd1VzKSB7Ci0gICAgaW50NjRfdCByZWFsVXM7Ci0gICAgaWYgKG1NZWRpYUNsb2NrLT5nZXRSZWFsVGltZUZvcihtZWRpYVRpbWVVcywgJnJlYWxVcykgIT0gT0spIHsKLSAgICAgICAgLy8gSWYgZmFpbGVkIHRvIGdldCBjdXJyZW50IHBvc2l0aW9uLCBlLmcuIGR1ZSB0byBhdWRpbyBjbG9jayBpcwotICAgICAgICAvLyBub3QgcmVhZHksIHRoZW4ganVzdCBwbGF5IG91dCB2aWRlbyBpbW1lZGlhdGVseSB3aXRob3V0IGRlbGF5LgotICAgICAgICByZXR1cm4gbm93VXM7Ci0gICAgfQotICAgIHJldHVybiByZWFsVXM7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25OZXdBdWRpb01lZGlhVGltZShpbnQ2NF90IG1lZGlhVGltZVVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAvLyBUUklDS1k6IHZvcmJpcyBkZWNvZGVyIGdlbmVyYXRlcyBtdWx0aXBsZSBmcmFtZXMgd2l0aCB0aGUgc2FtZQotICAgIC8vIHRpbWVzdGFtcCwgc28gb25seSB1cGRhdGUgb24gdGhlIGZpcnN0IGZyYW1lIHdpdGggYSBnaXZlbiB0aW1lc3RhbXAKLSAgICBpZiAobWVkaWFUaW1lVXMgPT0gbUFuY2hvclRpbWVNZWRpYVVzKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc2V0QXVkaW9GaXJzdEFuY2hvclRpbWVJZk5lZWRlZF9sKG1lZGlhVGltZVVzKTsKLQotICAgIC8vIG1OZXh0QXVkaW9DbG9ja1VwZGF0ZVRpbWVVcyBpcyAtMSBpZiB3ZSdyZSB3YWl0aW5nIGZvciBhdWRpbyBzaW5rIHRvIHN0YXJ0Ci0gICAgaWYgKG1OZXh0QXVkaW9DbG9ja1VwZGF0ZVRpbWVVcyA9PSAtMSkgewotICAgICAgICBBdWRpb1RpbWVzdGFtcCB0czsKLSAgICAgICAgaWYgKG1BdWRpb1NpbmstPmdldFRpbWVzdGFtcCh0cykgPT0gT0sgJiYgdHMubVBvc2l0aW9uID4gMCkgewotICAgICAgICAgICAgbU5leHRBdWRpb0Nsb2NrVXBkYXRlVGltZVVzID0gMDsgLy8gc3RhcnQgb3VyIGNsb2NrIHVwZGF0ZXMKLSAgICAgICAgfQotICAgIH0KLSAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICBpZiAobU5leHRBdWRpb0Nsb2NrVXBkYXRlVGltZVVzID49IDApIHsKLSAgICAgICAgaWYgKG5vd1VzID49IG1OZXh0QXVkaW9DbG9ja1VwZGF0ZVRpbWVVcykgewotICAgICAgICAgICAgaW50NjRfdCBub3dNZWRpYVVzID0gbWVkaWFUaW1lVXMgLSBnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25Vcyhub3dVcyk7Ci0gICAgICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlQW5jaG9yKG5vd01lZGlhVXMsIG5vd1VzLCBtZWRpYVRpbWVVcyk7Ci0gICAgICAgICAgICBtVXNlVmlydHVhbEF1ZGlvU2luayA9IGZhbHNlOwotICAgICAgICAgICAgbU5leHRBdWRpb0Nsb2NrVXBkYXRlVGltZVVzID0gbm93VXMgKyBrTWluaW11bUF1ZGlvQ2xvY2tVcGRhdGVQZXJpb2RVczsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGludDY0X3QgdW51c2VkOwotICAgICAgICBpZiAoKG1NZWRpYUNsb2NrLT5nZXRNZWRpYVRpbWUobm93VXMsICZ1bnVzZWQpICE9IE9LKQotICAgICAgICAgICAgICAgICYmIChnZXREdXJhdGlvblVzSWZQbGF5ZWRBdFNhbXBsZVJhdGUobU51bUZyYW1lc1dyaXR0ZW4pCi0gICAgICAgICAgICAgICAgICAgICAgICA+IGtNYXhBbGxvd2VkQXVkaW9TaW5rRGVsYXlVcykpIHsKLSAgICAgICAgICAgIC8vIEVub3VnaCBkYXRhIGhhcyBiZWVuIHNlbnQgdG8gQXVkaW9TaW5rLCBidXQgQXVkaW9TaW5rIGhhcyBub3QgcmVuZGVyZWQKLSAgICAgICAgICAgIC8vIGFueSBkYXRhIHlldC4gU29tZXRoaW5nIGlzIHdyb25nIHdpdGggQXVkaW9TaW5rLCBlLmcuLCB0aGUgZGV2aWNlIGlzIG5vdAotICAgICAgICAgICAgLy8gY29ubmVjdGVkIHRvIGF1ZGlvIG91dC4KLSAgICAgICAgICAgIC8vIFN3aXRjaCB0byBzeXN0ZW0gY2xvY2suIFRoaXMgZXNzZW50aWFsbHkgY3JlYXRlcyBhIHZpcnR1YWwgQXVkaW9TaW5rIHdpdGgKLSAgICAgICAgICAgIC8vIGluaXRpYWwgbGF0ZW50eSBvZiBnZXREdXJhdGlvblVzSWZQbGF5ZWRBdFNhbXBsZVJhdGUobU51bUZyYW1lc1dyaXR0ZW4pLgotICAgICAgICAgICAgLy8gVGhpcyB2aXJ0dWFsIEF1ZGlvU2luayByZW5kZXJzIGF1ZGlvIGRhdGEgc3RhcnRpbmcgZnJvbSB0aGUgdmVyeSBmaXJzdCBzYW1wbGUKLSAgICAgICAgICAgIC8vIGFuZCBpdCdzIHBhY2VkIGJ5IHN5c3RlbSBjbG9jay4KLSAgICAgICAgICAgIEFMT0dXKCJBdWRpb1Npbmsgc3R1Y2suIEFSRSBZT1UgQ09OTkVDVEVEIFRPIEFVRElPIE9VVD8gU3dpdGNoaW5nIHRvIHN5c3RlbSBjbG9jay4iKTsKLSAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVBbmNob3IobUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcywgbm93VXMsIG1lZGlhVGltZVVzKTsKLSAgICAgICAgICAgIG1Vc2VWaXJ0dWFsQXVkaW9TaW5rID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbiA9IG1OdW1GcmFtZXNXcml0dGVuOwotICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IG1lZGlhVGltZVVzOwotfQotCi0vLyBDYWxsZWQgd2l0aG91dCBtTG9jayBhY3F1aXJlZC4KLXZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6cG9zdERyYWluVmlkZW9RdWV1ZSgpIHsKLSAgICBpZiAobURyYWluVmlkZW9RdWV1ZVBlbmRpbmcKLSAgICAgICAgICAgIHx8IGdldFN5bmNRdWV1ZXMoKQotICAgICAgICAgICAgfHwgKG1QYXVzZWQgJiYgbVZpZGVvU2FtcGxlUmVjZWl2ZWQpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobVZpZGVvUXVldWUuZW1wdHkoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgUXVldWVFbnRyeSAmZW50cnkgPSAqbVZpZGVvUXVldWUuYmVnaW4oKTsKLQotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREcmFpblZpZGVvUXVldWUsIHRoaXMpOwotICAgIG1zZy0+c2V0SW50MzIoImRyYWluR2VuZXJhdGlvbiIsIGdldERyYWluR2VuZXJhdGlvbihmYWxzZSAvKiBhdWRpbyAqLykpOwotCi0gICAgaWYgKGVudHJ5Lm1CdWZmZXIgPT0gTlVMTCkgewotICAgICAgICAvLyBFT1MgZG9lc24ndCBjYXJyeSBhIHRpbWVzdGFtcC4KLSAgICAgICAgbXNnLT5wb3N0KCk7Ci0gICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgIGlmIChtRmxhZ3MgJiBGTEFHX1JFQUxfVElNRSkgewotICAgICAgICBpbnQ2NF90IHJlYWxUaW1lVXM7Ci0gICAgICAgIENIRUNLKGVudHJ5Lm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmcmVhbFRpbWVVcykpOwotCi0gICAgICAgIHJlYWxUaW1lVXMgPSBtVmlkZW9TY2hlZHVsZXItPnNjaGVkdWxlKHJlYWxUaW1lVXMgKiAxMDAwKSAvIDEwMDA7Ci0KLSAgICAgICAgaW50NjRfdCB0d29Wc3luY3NVcyA9IDIgKiAobVZpZGVvU2NoZWR1bGVyLT5nZXRWc3luY1BlcmlvZCgpIC8gMTAwMCk7Ci0KLSAgICAgICAgaW50NjRfdCBkZWxheVVzID0gcmVhbFRpbWVVcyAtIG5vd1VzOwotCi0gICAgICAgIEFMT0dXX0lGKGRlbGF5VXMgPiA1MDAwMDAsICJ1bnVzdWFsbHkgaGlnaCBkZWxheVVzOiAlbGxkIiwgKGxvbmcgbG9uZylkZWxheVVzKTsKLSAgICAgICAgLy8gcG9zdCAyIGRpc3BsYXkgcmVmcmVzaGVzIGJlZm9yZSByZW5kZXJpbmcgaXMgZHVlCi0gICAgICAgIG1zZy0+cG9zdChkZWxheVVzID4gdHdvVnN5bmNzVXMgPyBkZWxheVVzIC0gdHdvVnN5bmNzVXMgOiAwKTsKLQotICAgICAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IHRydWU7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IG1lZGlhVGltZVVzOwotICAgIENIRUNLKGVudHJ5Lm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpKTsKLQotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgaWYgKG1BbmNob3JUaW1lTWVkaWFVcyA8IDApIHsKLSAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVBbmNob3IobWVkaWFUaW1lVXMsIG5vd1VzLCBtZWRpYVRpbWVVcyk7Ci0gICAgICAgICAgICBtQW5jaG9yVGltZU1lZGlhVXMgPSBtZWRpYVRpbWVVczsKLSAgICAgICAgfQotICAgIH0KLSAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMgPSBtZWRpYVRpbWVVczsKLSAgICBpZiAoIW1IYXNBdWRpbykgewotICAgICAgICAvLyBzbW9vdGggb3V0IHZpZGVvcyA+PSAxMGZwcwotICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlTWF4VGltZU1lZGlhKG1lZGlhVGltZVVzICsgMTAwMDAwKTsKLSAgICB9Ci0KLSAgICBpZiAoIW1WaWRlb1NhbXBsZVJlY2VpdmVkIHx8IG1lZGlhVGltZVVzIDwgbUF1ZGlvRmlyc3RBbmNob3JUaW1lTWVkaWFVcykgewotICAgICAgICBtc2ctPnBvc3QoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBpbnQ2NF90IHR3b1ZzeW5jc1VzID0gMiAqIChtVmlkZW9TY2hlZHVsZXItPmdldFZzeW5jUGVyaW9kKCkgLyAxMDAwKTsKLQotICAgICAgICAvLyBwb3N0IDIgZGlzcGxheSByZWZyZXNoZXMgYmVmb3JlIHJlbmRlcmluZyBpcyBkdWUKLSAgICAgICAgbU1lZGlhQ2xvY2stPmFkZFRpbWVyKG1zZywgbWVkaWFUaW1lVXMsIC10d29Wc3luY3NVcyk7Ci0gICAgfQotCi0gICAgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmcgPSB0cnVlOwotfQotCi12b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uRHJhaW5WaWRlb1F1ZXVlKCkgewotICAgIGlmIChtVmlkZW9RdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBRdWV1ZUVudHJ5ICplbnRyeSA9ICYqbVZpZGVvUXVldWUuYmVnaW4oKTsKLQotICAgIGlmIChlbnRyeS0+bUJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIEVPUwotCi0gICAgICAgIG5vdGlmeUVPUyhmYWxzZSAvKiBhdWRpbyAqLywgZW50cnktPm1GaW5hbFJlc3VsdCk7Ci0KLSAgICAgICAgbVZpZGVvUXVldWUuZXJhc2UobVZpZGVvUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgIGVudHJ5ID0gTlVMTDsKLQotICAgICAgICBzZXRWaWRlb0xhdGVCeVVzKDApOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgaW50NjRfdCByZWFsVGltZVVzOwotICAgIGludDY0X3QgbWVkaWFUaW1lVXMgPSAtMTsKLSAgICBpZiAobUZsYWdzICYgRkxBR19SRUFMX1RJTUUpIHsKLSAgICAgICAgQ0hFQ0soZW50cnktPm1CdWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmcmVhbFRpbWVVcykpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIENIRUNLKGVudHJ5LT5tQnVmZmVyLT5tZXRhKCktPmZpbmRJbnQ2NCgidGltZVVzIiwgJm1lZGlhVGltZVVzKSk7Ci0KLSAgICAgICAgcmVhbFRpbWVVcyA9IGdldFJlYWxUaW1lVXMobWVkaWFUaW1lVXMsIG5vd1VzKTsKLSAgICB9Ci0gICAgcmVhbFRpbWVVcyA9IG1WaWRlb1NjaGVkdWxlci0+c2NoZWR1bGUocmVhbFRpbWVVcyAqIDEwMDApIC8gMTAwMDsKLQotICAgIGJvb2wgdG9vTGF0ZSA9IGZhbHNlOwotCi0gICAgaWYgKCFtUGF1c2VkKSB7Ci0gICAgICAgIHNldFZpZGVvTGF0ZUJ5VXMobm93VXMgLSByZWFsVGltZVVzKTsKLSAgICAgICAgdG9vTGF0ZSA9IChtVmlkZW9MYXRlQnlVcyA+IDQwMDAwKTsKLQotICAgICAgICBpZiAodG9vTGF0ZSkgewotICAgICAgICAgICAgQUxPR1YoInZpZGVvIGxhdGUgYnkgJWxsZCB1cyAoJS4yZiBzZWNzKSIsCi0gICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVZpZGVvTGF0ZUJ5VXMsIG1WaWRlb0xhdGVCeVVzIC8gMUU2KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludDY0X3QgbWVkaWFVcyA9IDA7Ci0gICAgICAgICAgICBtTWVkaWFDbG9jay0+Z2V0TWVkaWFUaW1lKHJlYWxUaW1lVXMsICZtZWRpYVVzKTsKLSAgICAgICAgICAgIEFMT0dWKCJyZW5kZXJpbmcgdmlkZW8gYXQgbWVkaWEgdGltZSAlLjJmIHNlY3MiLAotICAgICAgICAgICAgICAgICAgICAobUZsYWdzICYgRkxBR19SRUFMX1RJTUUgPyByZWFsVGltZVVzIDoKLSAgICAgICAgICAgICAgICAgICAgbWVkaWFVcykgLyAxRTYpOwotCi0gICAgICAgICAgICBpZiAoIShtRmxhZ3MgJiBGTEFHX1JFQUxfVElNRSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbUxhc3RBdWRpb01lZGlhVGltZVVzICE9IC0xCi0gICAgICAgICAgICAgICAgICAgICYmIG1lZGlhVGltZVVzID4gbUxhc3RBdWRpb01lZGlhVGltZVVzKSB7Ci0gICAgICAgICAgICAgICAgLy8gSWYgYXVkaW8gZW5kcyBiZWZvcmUgdmlkZW8sIHZpZGVvIGNvbnRpbnVlcyB0byBkcml2ZSBtZWRpYSBjbG9jay4KLSAgICAgICAgICAgICAgICAvLyBBbHNvIHNtb290aCBvdXQgdmlkZW9zID49IDEwZnBzLgotICAgICAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVNYXhUaW1lTWVkaWEobWVkaWFUaW1lVXMgKyAxMDAwMDApOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc2V0VmlkZW9MYXRlQnlVcygwKTsKLSAgICAgICAgaWYgKCFtVmlkZW9TYW1wbGVSZWNlaXZlZCAmJiAhbUhhc0F1ZGlvKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIHdpbGwgZW5zdXJlIHRoYXQgdGhlIGZpcnN0IGZyYW1lIGFmdGVyIGEgZmx1c2ggd29uJ3QgYmUgdXNlZCBhcyBhbmNob3IKLSAgICAgICAgICAgIC8vIHdoZW4gcmVuZGVyZXIgaXMgaW4gcGF1c2VkIHN0YXRlLCBiZWNhdXNlIHJlc3VtZSBjYW4gaGFwcGVuIGFueSB0aW1lIGFmdGVyIHNlZWsuCi0gICAgICAgICAgICBjbGVhckFuY2hvclRpbWUoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIEFsd2F5cyByZW5kZXIgdGhlIGZpcnN0IHZpZGVvIGZyYW1lIHdoaWxlIGtlZXBpbmcgc3RhdHMgb24gQS9WIHN5bmMuCi0gICAgaWYgKCFtVmlkZW9TYW1wbGVSZWNlaXZlZCkgewotICAgICAgICByZWFsVGltZVVzID0gbm93VXM7Ci0gICAgICAgIHRvb0xhdGUgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5zZXRJbnQ2NCgidGltZXN0YW1wTnMiLCByZWFsVGltZVVzICogMTAwMExMKTsKLSAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5zZXRJbnQzMigicmVuZGVyIiwgIXRvb0xhdGUpOwotICAgIGVudHJ5LT5tTm90aWZ5Q29uc3VtZWQtPnBvc3QoKTsKLSAgICBtVmlkZW9RdWV1ZS5lcmFzZShtVmlkZW9RdWV1ZS5iZWdpbigpKTsKLSAgICBlbnRyeSA9IE5VTEw7Ci0KLSAgICBtVmlkZW9TYW1wbGVSZWNlaXZlZCA9IHRydWU7Ci0KLSAgICBpZiAoIW1QYXVzZWQpIHsKLSAgICAgICAgaWYgKCFtVmlkZW9SZW5kZXJpbmdTdGFydGVkKSB7Ci0gICAgICAgICAgICBtVmlkZW9SZW5kZXJpbmdTdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIG5vdGlmeVZpZGVvUmVuZGVyaW5nU3RhcnQoKTsKLSAgICAgICAgfQotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICBub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZF9sKCk7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om5vdGlmeVZpZGVvUmVuZGVyaW5nU3RhcnQoKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdFZpZGVvUmVuZGVyaW5nU3RhcnQpOwotICAgIG5vdGlmeS0+cG9zdCgpOwotfQotCi12b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om5vdGlmeUVPUyhib29sIGF1ZGlvLCBzdGF0dXNfdCBmaW5hbFJlc3VsdCwgaW50NjRfdCBkZWxheVVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICBub3RpZnlFT1NfbChhdWRpbywgZmluYWxSZXN1bHQsIGRlbGF5VXMpOwotfQotCi12b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om5vdGlmeUVPU19sKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0LCBpbnQ2NF90IGRlbGF5VXMpIHsKLSAgICBpZiAoYXVkaW8gJiYgZGVsYXlVcyA+IDApIHsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdEVPUywgdGhpcyk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoImF1ZGlvRU9TR2VuZXJhdGlvbiIsIG1BdWRpb0VPU0dlbmVyYXRpb24pOwotICAgICAgICBtc2ctPnNldEludDMyKCJmaW5hbFJlc3VsdCIsIGZpbmFsUmVzdWx0KTsKLSAgICAgICAgbXNnLT5wb3N0KGRlbGF5VXMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRFT1MpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoImF1ZGlvIiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oYXVkaW8pKTsKLSAgICBub3RpZnktPnNldEludDMyKCJmaW5hbFJlc3VsdCIsIGZpbmFsUmVzdWx0KTsKLSAgICBub3RpZnktPnBvc3QoZGVsYXlVcyk7Ci0KLSAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgLy8gVmlkZW8gbWlnaHQgb3V0bGl2ZSBhdWRpby4gQ2xlYXIgYW5jaG9yIHRvIGVuYWJsZSB2aWRlbyBvbmx5IGNhc2UuCi0gICAgICAgIG1BbmNob3JUaW1lTWVkaWFVcyA9IC0xOwotICAgICAgICBtSGFzQXVkaW8gPSBmYWxzZTsKLSAgICAgICAgaWYgKG1OZXh0VmlkZW9UaW1lTWVkaWFVcyA+PSAwKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IG1lZGlhVXMgPSAwOwotICAgICAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBtTWVkaWFDbG9jay0+Z2V0TWVkaWFUaW1lKG5vd1VzLCAmbWVkaWFVcyk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1OZXh0VmlkZW9UaW1lTWVkaWFVcyA+IG1lZGlhVXMpIHsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZU1heFRpbWVNZWRpYShtTmV4dFZpZGVvVGltZU1lZGlhVXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZUFuY2hvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0VmlkZW9UaW1lTWVkaWFVcywgbm93VXMsIG1OZXh0VmlkZW9UaW1lTWVkaWFVcyArIDEwMDAwMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6bm90aWZ5QXVkaW9UZWFyRG93bihBdWRpb1RlYXJEb3duUmVhc29uIHJlYXNvbikgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb1RlYXJEb3duLCB0aGlzKTsKLSAgICBtc2ctPnNldEludDMyKCJyZWFzb24iLCByZWFzb24pOwotICAgIG1zZy0+cG9zdCgpOwotfQotCi12b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uUXVldWVCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBpbnQzMl90IGF1ZGlvOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZhdWRpbykpOwotCi0gICAgaWYgKGRyb3BCdWZmZXJJZlN0YWxlKGF1ZGlvLCBtc2cpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgbUhhc0F1ZGlvID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtSGFzVmlkZW8gPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChtSGFzVmlkZW8pIHsKLSAgICAgICAgaWYgKG1WaWRlb1NjaGVkdWxlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtVmlkZW9TY2hlZHVsZXIgPSBuZXcgVmlkZW9GcmFtZVNjaGVkdWxlcigpOwotICAgICAgICAgICAgbVZpZGVvU2NoZWR1bGVyLT5pbml0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzcDxSZWZCYXNlPiBvYmo7Ci0gICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJidWZmZXIiLCAmb2JqKSk7Ci0gICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gYnVmZmVyID0gc3RhdGljX2Nhc3Q8TWVkaWFDb2RlY0J1ZmZlciAqPihvYmouZ2V0KCkpOwotCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeUNvbnN1bWVkOwotICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoIm5vdGlmeUNvbnN1bWVkIiwgJm5vdGlmeUNvbnN1bWVkKSk7Ci0KLSAgICBRdWV1ZUVudHJ5IGVudHJ5OwotICAgIGVudHJ5Lm1CdWZmZXIgPSBidWZmZXI7Ci0gICAgZW50cnkubU5vdGlmeUNvbnN1bWVkID0gbm90aWZ5Q29uc3VtZWQ7Ci0gICAgZW50cnkubU9mZnNldCA9IDA7Ci0gICAgZW50cnkubUZpbmFsUmVzdWx0ID0gT0s7Ci0gICAgZW50cnkubUJ1ZmZlck9yZGluYWwgPSArK21Ub3RhbEJ1ZmZlcnNRdWV1ZWQ7Ci0KLSAgICBpZiAoYXVkaW8pIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgbUF1ZGlvUXVldWUucHVzaF9iYWNrKGVudHJ5KTsKLSAgICAgICAgcG9zdERyYWluQXVkaW9RdWV1ZV9sKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVZpZGVvUXVldWUucHVzaF9iYWNrKGVudHJ5KTsKLSAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZSgpOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKCFtU3luY1F1ZXVlcyB8fCBtQXVkaW9RdWV1ZS5lbXB0eSgpIHx8IG1WaWRlb1F1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IGZpcnN0QXVkaW9CdWZmZXIgPSAoKm1BdWRpb1F1ZXVlLmJlZ2luKCkpLm1CdWZmZXI7Ci0gICAgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gZmlyc3RWaWRlb0J1ZmZlciA9ICgqbVZpZGVvUXVldWUuYmVnaW4oKSkubUJ1ZmZlcjsKLQotICAgIGlmIChmaXJzdEF1ZGlvQnVmZmVyID09IE5VTEwgfHwgZmlyc3RWaWRlb0J1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgIC8vIEVPUyBzaWduYWxsZWQgb24gZWl0aGVyIHF1ZXVlLgotICAgICAgICBzeW5jUXVldWVzRG9uZV9sKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IGZpcnN0QXVkaW9UaW1lVXM7Ci0gICAgaW50NjRfdCBmaXJzdFZpZGVvVGltZVVzOwotICAgIENIRUNLKGZpcnN0QXVkaW9CdWZmZXItPm1ldGEoKQotICAgICAgICAgICAgLT5maW5kSW50NjQoInRpbWVVcyIsICZmaXJzdEF1ZGlvVGltZVVzKSk7Ci0gICAgQ0hFQ0soZmlyc3RWaWRlb0J1ZmZlci0+bWV0YSgpCi0gICAgICAgICAgICAtPmZpbmRJbnQ2NCgidGltZVVzIiwgJmZpcnN0VmlkZW9UaW1lVXMpKTsKLQotICAgIGludDY0X3QgZGlmZiA9IGZpcnN0VmlkZW9UaW1lVXMgLSBmaXJzdEF1ZGlvVGltZVVzOwotCi0gICAgQUxPR1YoInF1ZXVlRGlmZiA9ICUuMmYgc2VjcyIsIGRpZmYgLyAxRTYpOwotCi0gICAgaWYgKGRpZmYgPiAxMDAwMDBMTCkgewotICAgICAgICAvLyBBdWRpbyBkYXRhIHN0YXJ0cyBNb3JlIHRoYW4gMC4xIHNlY3MgYmVmb3JlIHZpZGVvLgotICAgICAgICAvLyBEcm9wIHNvbWUgYXVkaW8uCi0KLSAgICAgICAgKCptQXVkaW9RdWV1ZS5iZWdpbigpKS5tTm90aWZ5Q29uc3VtZWQtPnBvc3QoKTsKLSAgICAgICAgbUF1ZGlvUXVldWUuZXJhc2UobUF1ZGlvUXVldWUuYmVnaW4oKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzeW5jUXVldWVzRG9uZV9sKCk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6c3luY1F1ZXVlc0RvbmVfbCgpIHsKLSAgICBpZiAoIW1TeW5jUXVldWVzKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBtU3luY1F1ZXVlcyA9IGZhbHNlOwotCi0gICAgaWYgKCFtQXVkaW9RdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbCgpOwotICAgIH0KLQotICAgIGlmICghbVZpZGVvUXVldWUuZW1wdHkoKSkgewotICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgcG9zdERyYWluVmlkZW9RdWV1ZSgpOwotICAgICAgICBtTG9jay5sb2NrKCk7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uUXVldWVFT1MoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBpbnQzMl90IGF1ZGlvOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJhdWRpbyIsICZhdWRpbykpOwotCi0gICAgaWYgKGRyb3BCdWZmZXJJZlN0YWxlKGF1ZGlvLCBtc2cpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGZpbmFsUmVzdWx0OwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJmaW5hbFJlc3VsdCIsICZmaW5hbFJlc3VsdCkpOwotCi0gICAgUXVldWVFbnRyeSBlbnRyeTsKLSAgICBlbnRyeS5tT2Zmc2V0ID0gMDsKLSAgICBlbnRyeS5tRmluYWxSZXN1bHQgPSBmaW5hbFJlc3VsdDsKLQotICAgIGlmIChhdWRpbykgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICBpZiAobUF1ZGlvUXVldWUuZW1wdHkoKSAmJiBtU3luY1F1ZXVlcykgewotICAgICAgICAgICAgc3luY1F1ZXVlc0RvbmVfbCgpOwotICAgICAgICB9Ci0gICAgICAgIG1BdWRpb1F1ZXVlLnB1c2hfYmFjayhlbnRyeSk7Ci0gICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtVmlkZW9RdWV1ZS5lbXB0eSgpICYmIGdldFN5bmNRdWV1ZXMoKSkgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgICAgIHN5bmNRdWV1ZXNEb25lX2woKTsKLSAgICAgICAgfQotICAgICAgICBtVmlkZW9RdWV1ZS5wdXNoX2JhY2soZW50cnkpOwotICAgICAgICBwb3N0RHJhaW5WaWRlb1F1ZXVlKCk7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uRmx1c2goY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBpbnQzMl90IGF1ZGlvLCBub3RpZnlDb21wbGV0ZTsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiYXVkaW8iLCAmYXVkaW8pKTsKLQotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgICAgICBub3RpZnlDb21wbGV0ZSA9IG1Ob3RpZnlDb21wbGV0ZUF1ZGlvOwotICAgICAgICAgICAgbU5vdGlmeUNvbXBsZXRlQXVkaW8gPSBmYWxzZTsKLSAgICAgICAgICAgIG1MYXN0QXVkaW9NZWRpYVRpbWVVcyA9IC0xOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbm90aWZ5Q29tcGxldGUgPSBtTm90aWZ5Q29tcGxldGVWaWRlbzsKLSAgICAgICAgICAgIG1Ob3RpZnlDb21wbGV0ZVZpZGVvID0gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBJZiB3ZSdyZSBjdXJyZW50bHkgc3luY2luZyB0aGUgcXVldWVzLCBpLmUuIGRyb3BwaW5nIGF1ZGlvIHdoaWxlCi0gICAgICAgIC8vIGFsaWduaW5nIHRoZSBmaXJzdCBhdWRpby92aWRlbyBidWZmZXIgdGltZXMgYW5kIG9ubHkgb25lIG9mIHRoZQotICAgICAgICAvLyB0d28gcXVldWVzIGhhcyBkYXRhLCB3ZSBtYXkgc3RhcnZlIHRoYXQgcXVldWUgYnkgbm90IHJlcXVlc3RpbmcKLSAgICAgICAgLy8gbW9yZSBidWZmZXJzIGZyb20gdGhlIGRlY29kZXIuIElmIHRoZSBvdGhlciBzb3VyY2UgdGhlbiBlbmNvdW50ZXJzCi0gICAgICAgIC8vIGEgZGlzY29udGludWl0eSB0aGF0IGxlYWRzIHRvIGZsdXNoaW5nLCB3ZSdsbCBuZXZlciBmaW5kIHRoZQotICAgICAgICAvLyBjb3JyZXNwb25kaW5nIGRpc2NvbnRpbnVpdHkgb24gdGhlIG90aGVyIHF1ZXVlLgotICAgICAgICAvLyBUaGVyZWZvcmUgd2UnbGwgc3RvcCBzeW5jaW5nIHRoZSBxdWV1ZXMgaWYgYXQgbGVhc3Qgb25lIG9mIHRoZW0KLSAgICAgICAgLy8gaXMgZmx1c2hlZC4KLSAgICAgICAgc3luY1F1ZXVlc0RvbmVfbCgpOwotICAgIH0KLSAgICBjbGVhckFuY2hvclRpbWUoKTsKLQotICAgIEFMT0dWKCJmbHVzaGluZyAlcyIsIGF1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwotICAgIGlmIChhdWRpbykgewotICAgICAgICB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICAgICAgZmx1c2hRdWV1ZSgmbUF1ZGlvUXVldWUpOwotCi0gICAgICAgICAgICArK21BdWRpb0RyYWluR2VuZXJhdGlvbjsKLSAgICAgICAgICAgICsrbUF1ZGlvRU9TR2VuZXJhdGlvbjsKLSAgICAgICAgICAgIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0X2woKTsKLQotICAgICAgICAgICAgLy8gdGhlIGZyYW1lIGNvdW50IHdpbGwgYmUgcmVzZXQgYWZ0ZXIgZmx1c2guCi0gICAgICAgICAgICBjbGVhckF1ZGlvRmlyc3RBbmNob3JUaW1lX2woKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7Ci0gICAgICAgICAgICBtQXVkaW9TaW5rLT5wYXVzZSgpOwotICAgICAgICAgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKLSAgICAgICAgICAgIGlmICghbVBhdXNlZCkgewotICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQXVkaW9TaW5rLT5wYXVzZSgpOwotICAgICAgICAgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKLSAgICAgICAgICAgIC8vIENhbGwgc3RvcCgpIHRvIHNpZ25hbCB0byB0aGUgQXVkaW9TaW5rIHRvIGNvbXBsZXRlbHkgZmlsbCB0aGUKLSAgICAgICAgICAgIC8vIGludGVybmFsIGJ1ZmZlciBiZWZvcmUgcmVzdW1pbmcgcGxheWJhY2suCi0gICAgICAgICAgICAvLyBGSVhNRTogdGhpcyBpcyBpZ25vcmVkIGFmdGVyIGZsdXNoKCkuCi0gICAgICAgICAgICBtQXVkaW9TaW5rLT5zdG9wKCk7Ci0gICAgICAgICAgICBpZiAobVBhdXNlZCkgewotICAgICAgICAgICAgICAgIC8vIFJhY2UgY29uZGl0aW9uOiBpZiByZW5kZXJlciBpcyBwYXVzZWQgYW5kIGF1ZGlvIHNpbmsgaXMgc3RvcHBlZCwKLSAgICAgICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSBhdWRpbyB0cmFjayBidWZmZXIgZnVsbHkgZHJhaW5zCi0gICAgICAgICAgICAgICAgLy8gYmVmb3JlIGRlbGl2ZXJpbmcgZGF0YS4KLSAgICAgICAgICAgICAgICAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgaWYgd2UgY2FuIGRldGVjdCBpZiBzdG9wKCkgaXMgY29tcGxldGUuCi0gICAgICAgICAgICAgICAgY29uc3QgaW50IGRlbGF5VXMgPSAyICogNTAgKiAxMDAwOyAvLyAoMiBmdWxsIG1peGVyIHRocmVhZCBjeWNsZXMgYXQgNTBtcykKLSAgICAgICAgICAgICAgICBtUGF1c2VEcmFpbkF1ZGlvQWxsb3dlZFVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKSArIGRlbGF5VXM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTnVtRnJhbWVzV3JpdHRlbiA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgbU5leHRBdWRpb0Nsb2NrVXBkYXRlVGltZVVzID0gLTE7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZmx1c2hRdWV1ZSgmbVZpZGVvUXVldWUpOwotCi0gICAgICAgIG1EcmFpblZpZGVvUXVldWVQZW5kaW5nID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKG1WaWRlb1NjaGVkdWxlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtVmlkZW9TY2hlZHVsZXItPnJlc3RhcnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgICsrbVZpZGVvRHJhaW5HZW5lcmF0aW9uOwotICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydF9sKCk7Ci0gICAgfQotCi0gICAgbVZpZGVvU2FtcGxlUmVjZWl2ZWQgPSBmYWxzZTsKLQotICAgIGlmIChub3RpZnlDb21wbGV0ZSkgewotICAgICAgICBub3RpZnlGbHVzaENvbXBsZXRlKGF1ZGlvKTsKLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Zmx1c2hRdWV1ZShMaXN0PFF1ZXVlRW50cnk+ICpxdWV1ZSkgewotICAgIHdoaWxlICghcXVldWUtPmVtcHR5KCkpIHsKLSAgICAgICAgUXVldWVFbnRyeSAqZW50cnkgPSAmKnF1ZXVlLT5iZWdpbigpOwotCi0gICAgICAgIGlmIChlbnRyeS0+bUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkLT5wb3N0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZW50cnktPm1Ob3RpZnlDb25zdW1lZCAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAvLyBJcyBpdCBuZWVkZWQgdG8gb3BlbiBhdWRpbyBzaW5rIG5vdz8KLSAgICAgICAgICAgIG9uQ2hhbmdlQXVkaW9Gb3JtYXQoZW50cnktPm1NZXRhLCBlbnRyeS0+bU5vdGlmeUNvbnN1bWVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHF1ZXVlLT5lcmFzZShxdWV1ZS0+YmVnaW4oKSk7Ci0gICAgICAgIGVudHJ5ID0gTlVMTDsKLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6bm90aWZ5Rmx1c2hDb21wbGV0ZShib29sIGF1ZGlvKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoIndoYXQiLCBrV2hhdEZsdXNoQ29tcGxldGUpOwotICAgIG5vdGlmeS0+c2V0SW50MzIoImF1ZGlvIiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oYXVkaW8pKTsKLSAgICBub3RpZnktPnBvc3QoKTsKLX0KLQotYm9vbCBOdVBsYXllcjI6OlJlbmRlcmVyOjpkcm9wQnVmZmVySWZTdGFsZSgKLSAgICAgICAgYm9vbCBhdWRpbywgY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBpbnQzMl90IHF1ZXVlR2VuZXJhdGlvbjsKLSAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicXVldWVHZW5lcmF0aW9uIiwgJnF1ZXVlR2VuZXJhdGlvbikpOwotCi0gICAgaWYgKHF1ZXVlR2VuZXJhdGlvbiA9PSBnZXRRdWV1ZUdlbmVyYXRpb24oYXVkaW8pKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5Q29uc3VtZWQ7Ci0gICAgaWYgKG1zZy0+ZmluZE1lc3NhZ2UoIm5vdGlmeUNvbnN1bWVkIiwgJm5vdGlmeUNvbnN1bWVkKSkgewotICAgICAgICBub3RpZnlDb25zdW1lZC0+cG9zdCgpOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uQXVkaW9TaW5rQ2hhbmdlZCgpIHsKLSAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBDSEVDSyghbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcpOwotICAgIG1OdW1GcmFtZXNXcml0dGVuID0gMDsKLSAgICBtQW5jaG9yTnVtRnJhbWVzV3JpdHRlbiA9IC0xOwotICAgIHVpbnQzMl90IHdyaXR0ZW47Ci0gICAgaWYgKG1BdWRpb1NpbmstPmdldEZyYW1lc1dyaXR0ZW4oJndyaXR0ZW4pID09IE9LKSB7Ci0gICAgICAgIG1OdW1GcmFtZXNXcml0dGVuID0gd3JpdHRlbjsKLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbUZsYWdzICY9IH5GTEFHX09GRkxPQURfQVVESU87Ci0gICAgKyttQXVkaW9EcmFpbkdlbmVyYXRpb247Ci0gICAgaWYgKG1BdWRpb1JlbmRlcmluZ1N0YXJ0R2VuZXJhdGlvbiAhPSAtMSkgewotICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydF9sKCk7Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uRW5hYmxlT2ZmbG9hZEF1ZGlvKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgbUZsYWdzIHw9IEZMQUdfT0ZGTE9BRF9BVURJTzsKLSAgICArK21BdWRpb0RyYWluR2VuZXJhdGlvbjsKLSAgICBpZiAobUF1ZGlvUmVuZGVyaW5nU3RhcnRHZW5lcmF0aW9uICE9IC0xKSB7Ci0gICAgICAgIHByZXBhcmVGb3JNZWRpYVJlbmRlcmluZ1N0YXJ0X2woKTsKLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25QYXVzZSgpIHsKLSAgICBpZiAobVBhdXNlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICAvLyB3ZSBkbyBub3QgaW5jcmVtZW50IGF1ZGlvIGRyYWluIGdlbmVyYXRpb24gc28gdGhhdCB3ZSBmaWxsIGF1ZGlvIGJ1ZmZlciBkdXJpbmcgcGF1c2UuCi0gICAgICAgICsrbVZpZGVvRHJhaW5HZW5lcmF0aW9uOwotICAgICAgICBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydF9sKCk7Ci0gICAgICAgIG1QYXVzZWQgPSB0cnVlOwotICAgICAgICBtTWVkaWFDbG9jay0+c2V0UGxheWJhY2tSYXRlKDAuMCk7Ci0gICAgfQotCi0gICAgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmcgPSBmYWxzZTsKLSAgICBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZyA9IGZhbHNlOwotCi0gICAgLy8gTm90ZTogYXVkaW8gZGF0YSBtYXkgbm90IGhhdmUgYmVlbiBkZWNvZGVkLCBhbmQgdGhlIEF1ZGlvU2luayBtYXkgbm90IGJlIG9wZW5lZC4KLSAgICBtQXVkaW9TaW5rLT5wYXVzZSgpOwotICAgIHN0YXJ0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCk7Ci0KLSAgICBBTE9HVigibm93IHBhdXNlZCBhdWRpbyBxdWV1ZSBoYXMgJXp1IGVudHJpZXMsIHZpZGVvIGhhcyAlenUgZW50cmllcyIsCi0gICAgICAgICAgbUF1ZGlvUXVldWUuc2l6ZSgpLCBtVmlkZW9RdWV1ZS5zaXplKCkpOwotfQotCi12b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uUmVzdW1lKCkgewotICAgIGlmICghbVBhdXNlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gTm90ZTogYXVkaW8gZGF0YSBtYXkgbm90IGhhdmUgYmVlbiBkZWNvZGVkLCBhbmQgdGhlIEF1ZGlvU2luayBtYXkgbm90IGJlIG9wZW5lZC4KLSAgICBjYW5jZWxBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKTsKLSAgICBpZiAobUF1ZGlvU2luay0+cmVhZHkoKSkgewotICAgICAgICBzdGF0dXNfdCBlcnIgPSBtQXVkaW9TaW5rLT5zdGFydCgpOwotICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY2Fubm90IHN0YXJ0IEF1ZGlvU2luayBlcnIgJWQiLCBlcnIpOwotICAgICAgICAgICAgbm90aWZ5QXVkaW9UZWFyRG93bihrRHVlVG9FcnJvcik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgIG1QYXVzZWQgPSBmYWxzZTsKLSAgICAgICAgLy8gcmVuZGVyaW5nIHN0YXJ0ZWQgbWVzc2FnZSBtYXkgaGF2ZSBiZWVuIGRlbGF5ZWQgaWYgd2Ugd2VyZSBwYXVzZWQuCi0gICAgICAgIGlmIChtUmVuZGVyaW5nRGF0YURlbGl2ZXJlZCkgewotICAgICAgICAgICAgbm90aWZ5SWZNZWRpYVJlbmRlcmluZ1N0YXJ0ZWRfbCgpOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNvbmZpZ3VyZSBhdWRpb3NpbmsgYXMgd2UgZGlkIG5vdCBkbyBpdCB3aGVuIHBhdXNpbmcKLSAgICAgICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCAmJiBtQXVkaW9TaW5rLT5yZWFkeSgpKSB7Ci0gICAgICAgICAgICBtQXVkaW9TaW5rLT5zZXRQbGF5YmFja1JhdGUobVBsYXliYWNrU2V0dGluZ3MpOwotICAgICAgICB9Ci0KLSAgICAgICAgbU1lZGlhQ2xvY2stPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tSYXRlKTsKLQotICAgICAgICBpZiAoIW1BdWRpb1F1ZXVlLmVtcHR5KCkpIHsKLSAgICAgICAgICAgIHBvc3REcmFpbkF1ZGlvUXVldWVfbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFtVmlkZW9RdWV1ZS5lbXB0eSgpKSB7Ci0gICAgICAgIHBvc3REcmFpblZpZGVvUXVldWUoKTsKLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6b25TZXRWaWRlb0ZyYW1lUmF0ZShmbG9hdCBmcHMpIHsKLSAgICBpZiAobVZpZGVvU2NoZWR1bGVyID09IE5VTEwpIHsKLSAgICAgICAgbVZpZGVvU2NoZWR1bGVyID0gbmV3IFZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKLSAgICB9Ci0gICAgbVZpZGVvU2NoZWR1bGVyLT5pbml0KGZwcyk7Ci19Ci0KLWludDMyX3QgTnVQbGF5ZXIyOjpSZW5kZXJlcjo6Z2V0UXVldWVHZW5lcmF0aW9uKGJvb2wgYXVkaW8pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgIHJldHVybiAoYXVkaW8gPyBtQXVkaW9RdWV1ZUdlbmVyYXRpb24gOiBtVmlkZW9RdWV1ZUdlbmVyYXRpb24pOwotfQotCi1pbnQzMl90IE51UGxheWVyMjo6UmVuZGVyZXI6OmdldERyYWluR2VuZXJhdGlvbihib29sIGF1ZGlvKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gKGF1ZGlvID8gbUF1ZGlvRHJhaW5HZW5lcmF0aW9uIDogbVZpZGVvRHJhaW5HZW5lcmF0aW9uKTsKLX0KLQotYm9vbCBOdVBsYXllcjI6OlJlbmRlcmVyOjpnZXRTeW5jUXVldWVzKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIG1TeW5jUXVldWVzOwotfQotCi12b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uQXVkaW9UZWFyRG93bihBdWRpb1RlYXJEb3duUmVhc29uIHJlYXNvbikgewotICAgIGlmIChtQXVkaW9Ub3JuRG93bikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG1BdWRpb1Rvcm5Eb3duID0gdHJ1ZTsKLQotICAgIGludDY0X3QgY3VycmVudFBvc2l0aW9uVXM7Ci0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgIGlmIChnZXRDdXJyZW50UG9zaXRpb24oJmN1cnJlbnRQb3NpdGlvblVzKSA9PSBPSykgewotICAgICAgICBub3RpZnktPnNldEludDY0KCJwb3NpdGlvblVzIiwgY3VycmVudFBvc2l0aW9uVXMpOwotICAgIH0KLQotICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKLSAgICBtQXVkaW9TaW5rLT5mbHVzaCgpOwotCi0gICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0QXVkaW9UZWFyRG93bik7Ci0gICAgbm90aWZ5LT5zZXRJbnQzMigicmVhc29uIiwgcmVhc29uKTsKLSAgICBub3RpZnktPnBvc3QoKTsKLX0KLQotdm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpzdGFydEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpIHsKLSAgICBpZiAob2ZmbG9hZGluZ0F1ZGlvKCkpIHsKLSAgICAgICAgbVdha2VMb2NrLT5hY3F1aXJlKCk7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQsIHRoaXMpOwotICAgICAgICBtc2ctPnNldEludDMyKCJkcmFpbkdlbmVyYXRpb24iLCBtQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0R2VuZXJhdGlvbik7Ci0gICAgICAgIG1zZy0+cG9zdChrT2ZmbG9hZFBhdXNlTWF4VXMpOwotICAgIH0KLX0KLQotdm9pZCBOdVBsYXllcjI6OlJlbmRlcmVyOjpjYW5jZWxBdWRpb09mZmxvYWRQYXVzZVRpbWVvdXQoKSB7Ci0gICAgLy8gV2UgbWF5IGhhdmUgY2FsbGVkIHN0YXJ0QXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCkgd2l0aG91dAotICAgIC8vIHRoZSBBdWRpb1Npbmsgb3BlbiBhbmQgd2l0aCBvZmZsb2FkaW5nQXVkaW8gZW5hYmxlZC4KLSAgICAvLwotICAgIC8vIFdoZW4gd2UgY2FuY2VsLCBpdCBtYXkgYmUgdGhhdCBvZmZsb2FkaW5nQXVkaW8gaXMgc3Vic2VxdWVudGx5IGRpc2FibGVkLCBzbyByZWdhcmRsZXNzCi0gICAgLy8gd2UgYWx3YXlzIHJlbGVhc2UgdGhlIHdha2Vsb2NrIGFuZCBpbmNyZW1lbnQgdGhlIHBhdXNlIHRpbWVvdXQgZ2VuZXJhdGlvbi4KLSAgICAvLwotICAgIC8vIE5vdGU6IFRoZSBhY3F1aXJlZCB3YWtlbG9jayBwcmV2ZW50cyB0aGUgZGV2aWNlIGZyb20gc3VzcGVuZGluZwotICAgIC8vIGltbWVkaWF0ZWx5IGFmdGVyIG9mZmxvYWQgcGF1c2UgKGluIGNhc2UgYSByZXN1bWUgaGFwcGVucyBzaG9ydGx5IHRoZXJlYWZ0ZXIpLgotICAgIG1XYWtlTG9jay0+cmVsZWFzZSh0cnVlKTsKLSAgICArK21BdWRpb09mZmxvYWRQYXVzZVRpbWVvdXRHZW5lcmF0aW9uOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjI6OlJlbmRlcmVyOjpvbk9wZW5BdWRpb1NpbmsoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmZm9ybWF0LAotICAgICAgICBib29sIG9mZmxvYWRPbmx5LAotICAgICAgICBib29sIGhhc1ZpZGVvLAotICAgICAgICB1aW50MzJfdCBmbGFncywKLSAgICAgICAgYm9vbCBpc1N0cmVhbWluZykgewotICAgIEFMT0dWKCJvcGVuQXVkaW9TaW5rOiBvZmZsb2FkT25seSglZCkgb2ZmbG9hZGluZ0F1ZGlvKCVkKSIsCi0gICAgICAgICAgICBvZmZsb2FkT25seSwgb2ZmbG9hZGluZ0F1ZGlvKCkpOwotICAgIGJvb2wgYXVkaW9TaW5rQ2hhbmdlZCA9IGZhbHNlOwotCi0gICAgaW50MzJfdCBudW1DaGFubmVsczsKLSAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiY2hhbm5lbC1jb3VudCIsICZudW1DaGFubmVscykpOwotCi0gICAgaW50MzJfdCBjaGFubmVsTWFzazsKLSAgICBpZiAoIWZvcm1hdC0+ZmluZEludDMyKCJjaGFubmVsLW1hc2siLCAmY2hhbm5lbE1hc2spKSB7Ci0gICAgICAgIC8vIHNpZ25hbCB0byB0aGUgQXVkaW9TaW5rIHRvIGRlcml2ZSB0aGUgbWFzayBmcm9tIGNvdW50LgotICAgICAgICBjaGFubmVsTWFzayA9IENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUjsKLSAgICB9Ci0KLSAgICBpbnQzMl90IHNhbXBsZVJhdGU7Ci0gICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKTsKLQotICAgIC8vIHJlYWQgcGNtIGVuY29kaW5nIGZyb20gTWVkaWFDb2RlYyBvdXRwdXQgZm9ybWF0LCBpZiBhdmFpbGFibGUKLSAgICBpbnQzMl90IHBjbUVuY29kaW5nOwotICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0KLSAgICAgICAgICAgIGZvcm1hdC0+ZmluZEludDMyKEtFWV9QQ01fRU5DT0RJTkcsICZwY21FbmNvZGluZykgPwotICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdEZyb21FbmNvZGluZyhwY21FbmNvZGluZykgOiBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKLQotICAgIGlmIChvZmZsb2FkaW5nQXVkaW8oKSkgewotICAgICAgICBBU3RyaW5nIG1pbWU7Ci0gICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZFN0cmluZygibWltZSIsICZtaW1lKSk7Ci0gICAgICAgIHN0YXR1c190IGVyciA9IG1hcE1pbWVUb0F1ZGlvRm9ybWF0KGF1ZGlvRm9ybWF0LCBtaW1lLmNfc3RyKCkpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJDb3VsZG4ndCBtYXAgbWltZSBcIiVzXCIgdG8gYSB2YWxpZCAiCi0gICAgICAgICAgICAgICAgICAgICJhdWRpb19mb3JtYXQiLCBtaW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgb25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVigiTWltZSBcIiVzXCIgbWFwcGVkIHRvIGF1ZGlvX2Zvcm1hdCAweCV4IiwKLSAgICAgICAgICAgICAgICAgICAgbWltZS5jX3N0cigpLCBhdWRpb0Zvcm1hdCk7Ci0KLSAgICAgICAgICAgIGludCBhdmdCaXRSYXRlID0gLTE7Ci0gICAgICAgICAgICBmb3JtYXQtPmZpbmRJbnQzMigiYml0cmF0ZSIsICZhdmdCaXRSYXRlKTsKLQotICAgICAgICAgICAgaW50MzJfdCBhYWNQcm9maWxlID0gLTE7Ci0gICAgICAgICAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0FBQwotICAgICAgICAgICAgICAgICAgICAmJiBmb3JtYXQtPmZpbmRJbnQzMigiYWFjLXByb2ZpbGUiLCAmYWFjUHJvZmlsZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBSZWRlZmluZSBBQUMgZm9ybWF0IGFzIHBlciBhYWMgcHJvZmlsZQotICAgICAgICAgICAgICAgIG1hcEFBQ1Byb2ZpbGVUb0F1ZGlvRm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBhYWNQcm9maWxlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3Qgb2ZmbG9hZEluZm8gPSBBVURJT19JTkZPX0lOSVRJQUxJWkVSOwotICAgICAgICAgICAgb2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPSAtMTsKLSAgICAgICAgICAgIGZvcm1hdC0+ZmluZEludDY0KAotICAgICAgICAgICAgICAgICAgICAiZHVyYXRpb25VcyIsICZvZmZsb2FkSW5mby5kdXJhdGlvbl91cyk7Ci0gICAgICAgICAgICBvZmZsb2FkSW5mby5zYW1wbGVfcmF0ZSA9IHNhbXBsZVJhdGU7Ci0gICAgICAgICAgICBvZmZsb2FkSW5mby5jaGFubmVsX21hc2sgPSBjaGFubmVsTWFzazsKLSAgICAgICAgICAgIG9mZmxvYWRJbmZvLmZvcm1hdCA9IGF1ZGlvRm9ybWF0OwotICAgICAgICAgICAgb2ZmbG9hZEluZm8uc3RyZWFtX3R5cGUgPSBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgICAgICAgICBvZmZsb2FkSW5mby5iaXRfcmF0ZSA9IGF2Z0JpdFJhdGU7Ci0gICAgICAgICAgICBvZmZsb2FkSW5mby5oYXNfdmlkZW8gPSBoYXNWaWRlbzsKLSAgICAgICAgICAgIG9mZmxvYWRJbmZvLmlzX3N0cmVhbWluZyA9IGlzU3RyZWFtaW5nOwotCi0gICAgICAgICAgICBpZiAobWVtY21wKCZtQ3VycmVudE9mZmxvYWRJbmZvLCAmb2ZmbG9hZEluZm8sIHNpemVvZihvZmZsb2FkSW5mbykpID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVigib3BlbkF1ZGlvU2luazogbm8gY2hhbmdlIGluIG9mZmxvYWQgbW9kZSIpOwotICAgICAgICAgICAgICAgIC8vIG5vIGNoYW5nZSBmcm9tIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24sIGV2ZXJ5dGhpbmcgb2suCi0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUN1cnJlbnRQY21JbmZvID0gQVVESU9fUENNSU5GT19JTklUSUFMSVpFUjsKLQotICAgICAgICAgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IHRyeSB0byBvcGVuIEF1ZGlvU2luayBpbiBvZmZsb2FkIG1vZGUiKTsKLSAgICAgICAgICAgIHVpbnQzMl90IG9mZmxvYWRGbGFncyA9IGZsYWdzOwotICAgICAgICAgICAgb2ZmbG9hZEZsYWdzIHw9IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQ7Ci0gICAgICAgICAgICBvZmZsb2FkRmxhZ3MgJj0gfkFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOwotICAgICAgICAgICAgYXVkaW9TaW5rQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgICAgICBtQXVkaW9TaW5rLT5jbG9zZSgpOwotCi0gICAgICAgICAgICBlcnIgPSBtQXVkaW9TaW5rLT5vcGVuKAotICAgICAgICAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICBudW1DaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICBhdWRpb0Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgMCAvKiBidWZmZXJDb3VudCAtIHVudXNlZCAqLywKLSAgICAgICAgICAgICAgICAgICAgJk51UGxheWVyMjo6UmVuZGVyZXI6OkF1ZGlvU2lua0NhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3Qpb2ZmbG9hZEZsYWdzLAotICAgICAgICAgICAgICAgICAgICAmb2ZmbG9hZEluZm8pOwotCi0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gbUF1ZGlvU2luay0+c2V0UGxheWJhY2tSYXRlKG1QbGF5YmFja1NldHRpbmdzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGVyciA9PSBPSykgewotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwbGF5YmFjayBpcyBvZmZsb2FkZWQgdG8gaC93LCB3ZSBwYXNzCi0gICAgICAgICAgICAgICAgLy8gdGhlIEhBTCBzb21lIG1ldGFkYXRhIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IHdhbnQgdG8gZG8gdGhpcyBmb3IgUENNIGJlY2F1c2UgaXQKLSAgICAgICAgICAgICAgICAvLyB3aWxsIGJlIGdvaW5nIHRocm91Z2ggdGhlIEF1ZGlvRmxpbmdlciBtaXhlcgotICAgICAgICAgICAgICAgIC8vIGJlZm9yZSByZWFjaGluZyB0aGUgaGFyZHdhcmUuCi0gICAgICAgICAgICAgICAgLy8gVE9ETwotICAgICAgICAgICAgICAgIG1DdXJyZW50T2ZmbG9hZEluZm8gPSBvZmZsb2FkSW5mbzsKLSAgICAgICAgICAgICAgICBpZiAoIW1QYXVzZWQpIHsgLy8gZm9yIHByZXZpZXcgbW9kZSwgZG9uJ3Qgc3RhcnQgaWYgcGF1c2VkCi0gICAgICAgICAgICAgICAgICAgIGVyciA9IG1BdWRpb1NpbmstPnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFMT0dWX0lGKGVyciA9PSBPSywgIm9wZW5BdWRpb1Npbms6IG9mZmxvYWQgc3VjY2VlZGVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2xlYW4gdXAsIGZhbGwgYmFjayB0byBub24gb2ZmbG9hZCBtb2RlLgotICAgICAgICAgICAgICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7Ci0gICAgICAgICAgICAgICAgb25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRPZmZsb2FkSW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IG9mZmxvYWQgZmFpbGVkIik7Ci0gICAgICAgICAgICAgICAgaWYgKG9mZmxvYWRPbmx5KSB7Ci0gICAgICAgICAgICAgICAgICAgIG5vdGlmeUF1ZGlvVGVhckRvd24oa0ZvcmNlTm9uT2ZmbG9hZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVXNlQXVkaW9DYWxsYmFjayA9IHRydWU7ICAvLyBvZmZsb2FkIG1vZGUgdHJhbnNmZXJzIGRhdGEgdGhyb3VnaCBjYWxsYmFjawotICAgICAgICAgICAgICAgICsrbUF1ZGlvRHJhaW5HZW5lcmF0aW9uOyAgLy8gZGlzY2FyZCBwZW5kaW5nIGtXaGF0RHJhaW5BdWRpb1F1ZXVlIG1lc3NhZ2UuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFvZmZsb2FkT25seSAmJiAhb2ZmbG9hZGluZ0F1ZGlvKCkpIHsKLSAgICAgICAgQUxPR1YoIm9wZW5BdWRpb1Npbms6IG9wZW4gQXVkaW9TaW5rIGluIE5PTi1vZmZsb2FkIG1vZGUiKTsKLSAgICAgICAgdWludDMyX3QgcGNtRmxhZ3MgPSBmbGFnczsKLSAgICAgICAgcGNtRmxhZ3MgJj0gfkFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQ7Ci0KLSAgICAgICAgY29uc3QgUGNtSW5mbyBpbmZvID0gewotICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcGNtRmxhZ3MsCi0gICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsCi0gICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgc2FtcGxlUmF0ZQotICAgICAgICB9OwotICAgICAgICBpZiAobWVtY21wKCZtQ3VycmVudFBjbUluZm8sICZpbmZvLCBzaXplb2YoaW5mbykpID09IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJvcGVuQXVkaW9TaW5rOiBubyBjaGFuZ2UgaW4gcGNtIG1vZGUiKTsKLSAgICAgICAgICAgIC8vIG5vIGNoYW5nZSBmcm9tIHByZXZpb3VzIGNvbmZpZ3VyYXRpb24sIGV2ZXJ5dGhpbmcgb2suCi0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KLQotICAgICAgICBhdWRpb1NpbmtDaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKLSAgICAgICAgbUN1cnJlbnRPZmZsb2FkSW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7Ci0gICAgICAgIC8vIE5vdGU6IEl0IGlzIHBvc3NpYmxlIHRvIHNldCB1cCB0aGUgY2FsbGJhY2ssIGJ1dCBub3QgdXNlIGl0IHRvIHNlbmQgYXVkaW8gZGF0YS4KLSAgICAgICAgLy8gVGhpcyByZXF1aXJlcyBhIGZpeCBpbiBBdWRpb1NpbmsgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSB0cmFuc2ZlciBtb2RlLgotICAgICAgICBtVXNlQXVkaW9DYWxsYmFjayA9IGdldFVzZUF1ZGlvQ2FsbGJhY2tTZXR0aW5nKCk7Ci0gICAgICAgIGlmIChtVXNlQXVkaW9DYWxsYmFjaykgewotICAgICAgICAgICAgKyttQXVkaW9EcmFpbkdlbmVyYXRpb247ICAvLyBkaXNjYXJkIHBlbmRpbmcga1doYXREcmFpbkF1ZGlvUXVldWUgbWVzc2FnZS4KLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvbXB1dGUgdGhlIGRlc2lyZWQgYnVmZmVyIHNpemUuCi0gICAgICAgIC8vIEZvciBjYWxsYmFjayBtb2RlLCB0aGUgYW1vdW50IG9mIHRpbWUgYmVmb3JlIHdha2V1cCBpcyBhYm91dCBoYWxmIHRoZSBidWZmZXIgc2l6ZS4KLSAgICAgICAgY29uc3QgdWludDMyX3QgZnJhbWVDb3VudCA9Ci0gICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcgbG9uZylzYW1wbGVSYXRlICogZ2V0QXVkaW9TaW5rUGNtTXNTZXR0aW5nKCkgLyAxMDAwOwotCi0gICAgICAgIC8vIFRoZSBkb05vdFJlY29ubmVjdCBtZWFucyBBdWRpb1Npbmsgd2lsbCBzaWduYWwgYmFjayBhbmQgbGV0IE51UGxheWVyMiB0byByZS1jb25zdHJ1Y3QKLSAgICAgICAgLy8gQXVkaW9TaW5rLiBXZSBkb24ndCB3YW50IHRoaXMgd2hlbiB0aGVyZSdzIHZpZGVvIGJlY2F1c2UgaXQgd2lsbCBjYXVzZSBhIHZpZGVvIHNlZWsgdG8KLSAgICAgICAgLy8gdGhlIHByZXZpb3VzIEkgZnJhbWUuIEJ1dCB3ZSBkbyB3YW50IHRoaXMgd2hlbiB0aGVyZSdzIG9ubHkgYXVkaW8gYmVjYXVzZSBpdCB3aWxsIGdpdmUKLSAgICAgICAgLy8gTnVQbGF5ZXIyIGEgY2hhbmNlIHRvIHN3aXRjaCBmcm9tIG5vbi1vZmZsb2FkIG1vZGUgdG8gb2ZmbG9hZCBtb2RlLgotICAgICAgICAvLyBTbyB3ZSBvbmx5IHNldCBkb05vdFJlY29ubmVjdCB3aGVuIHRoZXJlJ3Mgbm8gdmlkZW8uCi0gICAgICAgIGNvbnN0IGJvb2wgZG9Ob3RSZWNvbm5lY3QgPSAhaGFzVmlkZW87Ci0KLSAgICAgICAgLy8gV2Ugc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRvIHNldCBvdXIgcGxheWJhY2sgc2V0dGluZ3MgaWYgdGhlIHNpbmsgaXMgY2xvc2VkLgotICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1BdWRpb1NpbmstPnNldFBsYXliYWNrUmF0ZShtUGxheWJhY2tTZXR0aW5ncykgIT0gT0ssCi0gICAgICAgICAgICAgICAgIm9uT3BlbkF1ZGlvU2luazogY2FuJ3Qgc2V0IHBsYXliYWNrIHJhdGUgb24gY2xvc2VkIHNpbmsiKTsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0gbUF1ZGlvU2luay0+b3BlbigKLSAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgIDAgLyogYnVmZmVyQ291bnQgLSB1bnVzZWQgKi8sCi0gICAgICAgICAgICAgICAgICAgIG1Vc2VBdWRpb0NhbGxiYWNrID8gJk51UGxheWVyMjo6UmVuZGVyZXI6OkF1ZGlvU2lua0NhbGxiYWNrIDogTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPyB0aGlzIDogTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KXBjbUZsYWdzLAotICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICBkb05vdFJlY29ubmVjdCwKLSAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCk7Ci0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dXKCJvcGVuQXVkaW9TaW5rOiBub24gb2ZmbG9hZGVkIG9wZW4gZmFpbGVkIHN0YXR1czogJWQiLCBlcnIpOwotICAgICAgICAgICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKLSAgICAgICAgICAgIG1DdXJyZW50UGNtSW5mbyA9IEFVRElPX1BDTUlORk9fSU5JVElBTElaRVI7Ci0gICAgICAgICAgICByZXR1cm4gZXJyOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50UGNtSW5mbyA9IGluZm87Ci0gICAgICAgIGlmICghbVBhdXNlZCkgeyAvLyBmb3IgcHJldmlldyBtb2RlLCBkb24ndCBzdGFydCBpZiBwYXVzZWQKLSAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGF1ZGlvU2lua0NoYW5nZWQpIHsKLSAgICAgICAgb25BdWRpb1NpbmtDaGFuZ2VkKCk7Ci0gICAgfQotICAgIG1BdWRpb1Rvcm5Eb3duID0gZmFsc2U7Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uQ2xvc2VBdWRpb1NpbmsoKSB7Ci0gICAgbUF1ZGlvU2luay0+Y2xvc2UoKTsKLSAgICBtQ3VycmVudE9mZmxvYWRJbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKLSAgICBtQ3VycmVudFBjbUluZm8gPSBBVURJT19QQ01JTkZPX0lOSVRJQUxJWkVSOwotfQotCi12b2lkIE51UGxheWVyMjo6UmVuZGVyZXI6Om9uQ2hhbmdlQXVkaW9Gb3JtYXQoCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbWV0YSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpIHsKLSAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OwotICAgIENIRUNLKG1ldGEtPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSk7Ci0KLSAgICBpbnQzMl90IG9mZmxvYWRPbmx5OwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMigib2ZmbG9hZC1vbmx5IiwgJm9mZmxvYWRPbmx5KSk7Ci0KLSAgICBpbnQzMl90IGhhc1ZpZGVvOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMigiaGFzLXZpZGVvIiwgJmhhc1ZpZGVvKSk7Ci0KLSAgICB1aW50MzJfdCBmbGFnczsKLSAgICBDSEVDSyhtZXRhLT5maW5kSW50MzIoImZsYWdzIiwgKGludDMyX3QgKikmZmxhZ3MpKTsKLQotICAgIHVpbnQzMl90IGlzU3RyZWFtaW5nOwotICAgIENIRUNLKG1ldGEtPmZpbmRJbnQzMigiaXNTdHJlYW1pbmciLCAoaW50MzJfdCAqKSZpc1N0cmVhbWluZykpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gb25PcGVuQXVkaW9TaW5rKGZvcm1hdCwgb2ZmbG9hZE9ubHksIGhhc1ZpZGVvLCBmbGFncywgaXNTdHJlYW1pbmcpOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBub3RpZnktPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgIH0KLSAgICBub3RpZnktPnBvc3QoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyUmVuZGVyZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJjZjBkOC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL051UGxheWVyMlJlbmRlcmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBOVVBMQVlFUjJfUkVOREVSRVJfSF8KLQotI2RlZmluZSBOVVBMQVlFUjJfUkVOREVSRVJfSF8KLQotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQVZTeW5jU2V0dGluZ3MuaD4KLQotI2luY2x1ZGUgIk51UGxheWVyMi5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzICBKV2FrZUxvY2s7Ci1zdHJ1Y3QgTWVkaWFDbG9jazsKLWNsYXNzIE1lZGlhQ29kZWNCdWZmZXI7Ci1zdHJ1Y3QgVmlkZW9GcmFtZVNjaGVkdWxlcjsKLQotc3RydWN0IE51UGxheWVyMjo6UmVuZGVyZXIgOiBwdWJsaWMgQUhhbmRsZXIgewotICAgIGVudW0gRmxhZ3MgewotICAgICAgICBGTEFHX1JFQUxfVElNRSA9IDEsCi0gICAgICAgIEZMQUdfT0ZGTE9BRF9BVURJTyA9IDIsCi0gICAgfTsKLSAgICBSZW5kZXJlcihjb25zdCBzcDxNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luaz4gJnNpbmssCi0gICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gJm1lZGlhQ2xvY2ssCi0gICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKLQotICAgIHN0YXRpYyBzaXplX3QgQXVkaW9TaW5rQ2FsbGJhY2soCi0gICAgICAgICAgICBNZWRpYVBsYXllcjJJbnRlcmZhY2U6OkF1ZGlvU2luayAqYXVkaW9TaW5rLAotICAgICAgICAgICAgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsIHZvaWQgKm1lLAotICAgICAgICAgICAgTWVkaWFQbGF5ZXIySW50ZXJmYWNlOjpBdWRpb1Npbms6OmNiX2V2ZW50X3QgZXZlbnQpOwotCi0gICAgdm9pZCBxdWV1ZUJ1ZmZlcigKLSAgICAgICAgICAgIGJvb2wgYXVkaW8sCi0gICAgICAgICAgICBjb25zdCBzcDxNZWRpYUNvZGVjQnVmZmVyPiAmYnVmZmVyLAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnlDb25zdW1lZCk7Ci0KLSAgICB2b2lkIHF1ZXVlRU9TKGJvb2wgYXVkaW8sIHN0YXR1c190IGZpbmFsUmVzdWx0KTsKLQotICAgIHN0YXR1c190IHNldFBsYXliYWNrU2V0dGluZ3MoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUgLyogc2FuaXRpemVkICovKTsKLSAgICBzdGF0dXNfdCBnZXRQbGF5YmFja1NldHRpbmdzKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlIC8qIG5vbm51bGwgKi8pOwotICAgIHN0YXR1c190IHNldFN5bmNTZXR0aW5ncyhjb25zdCBBVlN5bmNTZXR0aW5ncyAmc3luYywgZmxvYXQgdmlkZW9GcHNIaW50KTsKLSAgICBzdGF0dXNfdCBnZXRTeW5jU2V0dGluZ3MoQVZTeW5jU2V0dGluZ3MgKnN5bmMgLyogbm9ubnVsbCAqLywgZmxvYXQgKnZpZGVvRnBzIC8qIG5vbm51bGwgKi8pOwotCi0gICAgdm9pZCBmbHVzaChib29sIGF1ZGlvLCBib29sIG5vdGlmeUNvbXBsZXRlKTsKLQotICAgIHZvaWQgc2lnbmFsVGltZURpc2NvbnRpbnVpdHkoKTsKLQotICAgIHZvaWQgc2lnbmFsRGlzYWJsZU9mZmxvYWRBdWRpbygpOwotICAgIHZvaWQgc2lnbmFsRW5hYmxlT2ZmbG9hZEF1ZGlvKCk7Ci0KLSAgICB2b2lkIHBhdXNlKCk7Ci0gICAgdm9pZCByZXN1bWUoKTsKLQotICAgIHZvaWQgc2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKTsKLQotICAgIHN0YXR1c190IGdldEN1cnJlbnRQb3NpdGlvbihpbnQ2NF90ICptZWRpYVVzKTsKLSAgICBpbnQ2NF90IGdldFZpZGVvTGF0ZUJ5VXMoKTsKLQotICAgIHN0YXR1c190IG9wZW5BdWRpb1NpbmsoCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwKLSAgICAgICAgICAgIGJvb2wgb2ZmbG9hZE9ubHksCi0gICAgICAgICAgICBib29sIGhhc1ZpZGVvLAotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MsCi0gICAgICAgICAgICBib29sICppc09mZmxvYWRlZCwKLSAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcpOwotICAgIHZvaWQgY2xvc2VBdWRpb1NpbmsoKTsKLQotICAgIC8vIHJlLW9wZW4gYXVkaW8gc2luayBhZnRlciBhbGwgcGVuZGluZyBhdWRpbyBidWZmZXJzIHBsYXllZC4KLSAgICB2b2lkIGNoYW5nZUF1ZGlvRm9ybWF0KAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCi0gICAgICAgICAgICBib29sIG9mZmxvYWRPbmx5LAotICAgICAgICAgICAgYm9vbCBoYXNWaWRlbywKLSAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAotICAgICAgICAgICAgYm9vbCBpc1N0cmVhbWluZywKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KTsKLQotICAgIGVudW0gewotICAgICAgICBrV2hhdEVPUyAgICAgICAgICAgICAgICAgICAgICA9ICdlb3MgJywKLSAgICAgICAga1doYXRGbHVzaENvbXBsZXRlICAgICAgICAgICAgPSAnZmx1QycsCi0gICAgICAgIGtXaGF0UG9zaXRpb24gICAgICAgICAgICAgICAgID0gJ3Bvc2knLAotICAgICAgICBrV2hhdFZpZGVvUmVuZGVyaW5nU3RhcnQgICAgICA9ICd2ZHJkJywKLSAgICAgICAga1doYXRNZWRpYVJlbmRlcmluZ1N0YXJ0ICAgICAgPSAnbWRyZCcsCi0gICAgICAgIGtXaGF0QXVkaW9UZWFyRG93biAgICAgICAgICAgID0gJ2FkVEQnLAotICAgICAgICBrV2hhdEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCA9ICdhT1BUJywKLSAgICB9OwotCi0gICAgZW51bSBBdWRpb1RlYXJEb3duUmVhc29uIHsKLSAgICAgICAga0R1ZVRvRXJyb3IgPSAwLCAgIC8vIENvdWxkIHJlc3RhcnQgd2l0aCBlaXRoZXIgb2ZmbG9hZCBvciBub24tb2ZmbG9hZC4KLSAgICAgICAga0R1ZVRvVGltZW91dCwKLSAgICAgICAga0ZvcmNlTm9uT2ZmbG9hZCwgIC8vIFJlc3RhcnQgb25seSB3aXRoIG5vbi1vZmZsb2FkLgotICAgIH07Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5SZW5kZXJlcigpOwotCi0gICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLQotcHJpdmF0ZToKLSAgICBlbnVtIHsKLSAgICAgICAga1doYXREcmFpbkF1ZGlvUXVldWUgICAgID0gJ2RyYUEnLAotICAgICAgICBrV2hhdERyYWluVmlkZW9RdWV1ZSAgICAgPSAnZHJhVicsCi0gICAgICAgIGtXaGF0UG9zdERyYWluVmlkZW9RdWV1ZSA9ICdwRFZRJywKLSAgICAgICAga1doYXRRdWV1ZUJ1ZmZlciAgICAgICAgID0gJ3F1ZUInLAotICAgICAgICBrV2hhdFF1ZXVlRU9TICAgICAgICAgICAgPSAncUVPUycsCi0gICAgICAgIGtXaGF0Q29uZmlnUGxheWJhY2sgICAgICA9ICdjZlBCJywKLSAgICAgICAga1doYXRDb25maWdTeW5jICAgICAgICAgID0gJ2NmU3knLAotICAgICAgICBrV2hhdEdldFBsYXliYWNrU2V0dGluZ3MgPSAnZ1BiUycsCi0gICAgICAgIGtXaGF0R2V0U3luY1NldHRpbmdzICAgICA9ICdnU3lTJywKLSAgICAgICAga1doYXRGbHVzaCAgICAgICAgICAgICAgID0gJ2ZsdXMnLAotICAgICAgICBrV2hhdFBhdXNlICAgICAgICAgICAgICAgPSAncGF1cycsCi0gICAgICAgIGtXaGF0UmVzdW1lICAgICAgICAgICAgICA9ICdyZXNtJywKLSAgICAgICAga1doYXRPcGVuQXVkaW9TaW5rICAgICAgID0gJ29wbkEnLAotICAgICAgICBrV2hhdENsb3NlQXVkaW9TaW5rICAgICAgPSAnY2xzQScsCi0gICAgICAgIGtXaGF0Q2hhbmdlQXVkaW9Gb3JtYXQgICA9ICdjaGdBJywKLSAgICAgICAga1doYXRTdG9wQXVkaW9TaW5rICAgICAgID0gJ3N0cEEnLAotICAgICAgICBrV2hhdERpc2FibGVPZmZsb2FkQXVkaW8gPSAnbm9PQScsCi0gICAgICAgIGtXaGF0RW5hYmxlT2ZmbG9hZEF1ZGlvICA9ICdlbk9BJywKLSAgICAgICAga1doYXRTZXRWaWRlb0ZyYW1lUmF0ZSAgID0gJ3NWRlInLAotICAgIH07Ci0KLSAgICAvLyBpZiBtQnVmZmVyICE9IG51bGxwdHIsIGl0J3MgYSBidWZmZXIgY29udGFpbmluZyByZWFsIGRhdGEuCi0gICAgLy8gZWxzZSBpZiBtTm90aWZ5Q29uc3VtZWQgPT0gbnVsbHB0ciwgaXQncyBFT1MuCi0gICAgLy8gZWxzZSBpdCdzIGEgdGFnIGZvciByZS1vcGVuaW5nIGF1ZGlvIHNpbmsgaW4gZGlmZmVyZW50IGZvcm1hdC4KLSAgICBzdHJ1Y3QgUXVldWVFbnRyeSB7Ci0gICAgICAgIHNwPE1lZGlhQ29kZWNCdWZmZXI+IG1CdWZmZXI7Ci0gICAgICAgIHNwPEFNZXNzYWdlPiBtTWV0YTsKLSAgICAgICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnlDb25zdW1lZDsKLSAgICAgICAgc2l6ZV90IG1PZmZzZXQ7Ci0gICAgICAgIHN0YXR1c190IG1GaW5hbFJlc3VsdDsKLSAgICAgICAgaW50MzJfdCBtQnVmZmVyT3JkaW5hbDsKLSAgICB9OwotCi0gICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01pblBvc2l0aW9uVXBkYXRlRGVsYXlVczsKLQotICAgIHNwPE1lZGlhUGxheWVyMkludGVyZmFjZTo6QXVkaW9TaW5rPiBtQXVkaW9TaW5rOwotICAgIGJvb2wgbVVzZVZpcnR1YWxBdWRpb1Npbms7Ci0gICAgc3A8QU1lc3NhZ2U+IG1Ob3RpZnk7Ci0gICAgTXV0ZXggbUxvY2s7Ci0gICAgdWludDMyX3QgbUZsYWdzOwotICAgIExpc3Q8UXVldWVFbnRyeT4gbUF1ZGlvUXVldWU7Ci0gICAgTGlzdDxRdWV1ZUVudHJ5PiBtVmlkZW9RdWV1ZTsKLSAgICB1aW50MzJfdCBtTnVtRnJhbWVzV3JpdHRlbjsKLSAgICBzcDxWaWRlb0ZyYW1lU2NoZWR1bGVyPiBtVmlkZW9TY2hlZHVsZXI7Ci0KLSAgICBib29sIG1EcmFpbkF1ZGlvUXVldWVQZW5kaW5nOwotICAgIGJvb2wgbURyYWluVmlkZW9RdWV1ZVBlbmRpbmc7Ci0gICAgaW50MzJfdCBtQXVkaW9RdWV1ZUdlbmVyYXRpb247Ci0gICAgaW50MzJfdCBtVmlkZW9RdWV1ZUdlbmVyYXRpb247Ci0gICAgaW50MzJfdCBtQXVkaW9EcmFpbkdlbmVyYXRpb247Ci0gICAgaW50MzJfdCBtVmlkZW9EcmFpbkdlbmVyYXRpb247Ci0gICAgaW50MzJfdCBtQXVkaW9FT1NHZW5lcmF0aW9uOwotCi0gICAgY29uc3Qgc3A8TWVkaWFDbG9jaz4gbU1lZGlhQ2xvY2s7Ci0gICAgZmxvYXQgbVBsYXliYWNrUmF0ZTsgLy8gYXVkaW8gdHJhY2sgcmF0ZQotCi0gICAgQXVkaW9QbGF5YmFja1JhdGUgbVBsYXliYWNrU2V0dGluZ3M7Ci0gICAgQVZTeW5jU2V0dGluZ3MgbVN5bmNTZXR0aW5nczsKLSAgICBmbG9hdCBtVmlkZW9GcHNIaW50OwotCi0gICAgaW50NjRfdCBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzOwotICAgIGludDY0X3QgbUFuY2hvclRpbWVNZWRpYVVzOwotICAgIGludDY0X3QgbUFuY2hvck51bUZyYW1lc1dyaXR0ZW47Ci0gICAgaW50NjRfdCBtVmlkZW9MYXRlQnlVczsKLSAgICBpbnQ2NF90IG1OZXh0VmlkZW9UaW1lTWVkaWFVczsKLSAgICBib29sIG1IYXNBdWRpbzsKLSAgICBib29sIG1IYXNWaWRlbzsKLQotICAgIGJvb2wgbU5vdGlmeUNvbXBsZXRlQXVkaW87Ci0gICAgYm9vbCBtTm90aWZ5Q29tcGxldGVWaWRlbzsKLQotICAgIGJvb2wgbVN5bmNRdWV1ZXM7Ci0KLSAgICAvLyBtb2RpZmllZCBvbiBvbmx5IHJlbmRlcmVyJ3MgdGhyZWFkLgotICAgIGJvb2wgbVBhdXNlZDsKLSAgICBpbnQ2NF90IG1QYXVzZURyYWluQXVkaW9BbGxvd2VkVXM7IC8vIHRpbWUgd2hlbiB3ZSBjYW4gZHJhaW4vZGVsaXZlciBhdWRpbyBpbiBwYXVzZSBtb2RlLgotCi0gICAgYm9vbCBtVmlkZW9TYW1wbGVSZWNlaXZlZDsKLSAgICBib29sIG1WaWRlb1JlbmRlcmluZ1N0YXJ0ZWQ7Ci0gICAgaW50MzJfdCBtVmlkZW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb247Ci0gICAgaW50MzJfdCBtQXVkaW9SZW5kZXJpbmdTdGFydEdlbmVyYXRpb247Ci0gICAgYm9vbCBtUmVuZGVyaW5nRGF0YURlbGl2ZXJlZDsKLQotICAgIGludDY0X3QgbU5leHRBdWRpb0Nsb2NrVXBkYXRlVGltZVVzOwotICAgIC8vIHRoZSBtZWRpYSB0aW1lc3RhbXAgb2YgbGFzdCBhdWRpbyBzYW1wbGUgcmlnaHQgYmVmb3JlIEVPUy4KLSAgICBpbnQ2NF90IG1MYXN0QXVkaW9NZWRpYVRpbWVVczsKLQotICAgIGludDMyX3QgbUF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dEdlbmVyYXRpb247Ci0gICAgYm9vbCBtQXVkaW9Ub3JuRG93bjsKLSAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBtQ3VycmVudE9mZmxvYWRJbmZvOwotCi0gICAgc3RydWN0IFBjbUluZm8gewotICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtQ2hhbm5lbE1hc2s7Ci0gICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsKLSAgICAgICAgaW50MzJfdCBtTnVtQ2hhbm5lbHM7Ci0gICAgICAgIGludDMyX3QgbVNhbXBsZVJhdGU7Ci0gICAgfTsKLSAgICBQY21JbmZvIG1DdXJyZW50UGNtSW5mbzsKLSAgICBzdGF0aWMgY29uc3QgUGNtSW5mbyBBVURJT19QQ01JTkZPX0lOSVRJQUxJWkVSOwotCi0gICAgaW50MzJfdCBtVG90YWxCdWZmZXJzUXVldWVkOwotICAgIGludDMyX3QgbUxhc3RBdWRpb0J1ZmZlckRyYWluZWQ7Ci0gICAgYm9vbCBtVXNlQXVkaW9DYWxsYmFjazsKLQotICAgIHNwPEpXYWtlTG9jaz4gbVdha2VMb2NrOwotCi0gICAgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uT25Mb29wZXIoaW50NjRfdCAqbWVkaWFVcyk7Ci0gICAgc3RhdHVzX3QgZ2V0Q3VycmVudFBvc2l0aW9uT25Mb29wZXIoCi0gICAgICAgICAgICBpbnQ2NF90ICptZWRpYVVzLCBpbnQ2NF90IG5vd1VzLCBib29sIGFsbG93UGFzdFF1ZXVlZFZpZGVvID0gZmFsc2UpOwotICAgIGJvb2wgZ2V0Q3VycmVudFBvc2l0aW9uSWZQYXVzZWRfbChpbnQ2NF90ICptZWRpYVVzKTsKLSAgICBzdGF0dXNfdCBnZXRDdXJyZW50UG9zaXRpb25Gcm9tQW5jaG9yKAotICAgICAgICAgICAgaW50NjRfdCAqbWVkaWFVcywgaW50NjRfdCBub3dVcywgYm9vbCBhbGxvd1Bhc3RRdWV1ZWRWaWRlbyA9IGZhbHNlKTsKLQotICAgIHZvaWQgbm90aWZ5RU9TQ2FsbGJhY2soKTsKLSAgICBzaXplX3QgZmlsbEF1ZGlvQnVmZmVyKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOwotCi0gICAgYm9vbCBvbkRyYWluQXVkaW9RdWV1ZSgpOwotICAgIHZvaWQgZHJhaW5BdWRpb1F1ZXVlVW50aWxMYXN0RU9TKCk7Ci0gICAgaW50NjRfdCBnZXRQZW5kaW5nQXVkaW9QbGF5b3V0RHVyYXRpb25VcyhpbnQ2NF90IG5vd1VzKTsKLSAgICB2b2lkIHBvc3REcmFpbkF1ZGlvUXVldWVfbChpbnQ2NF90IGRlbGF5VXMgPSAwKTsKLQotICAgIHZvaWQgY2xlYXJBbmNob3JUaW1lKCk7Ci0gICAgdm9pZCBjbGVhckF1ZGlvRmlyc3RBbmNob3JUaW1lX2woKTsKLSAgICB2b2lkIHNldEF1ZGlvRmlyc3RBbmNob3JUaW1lSWZOZWVkZWRfbChpbnQ2NF90IG1lZGlhVXMpOwotICAgIHZvaWQgc2V0VmlkZW9MYXRlQnlVcyhpbnQ2NF90IGxhdGVVcyk7Ci0KLSAgICB2b2lkIG9uTmV3QXVkaW9NZWRpYVRpbWUoaW50NjRfdCBtZWRpYVRpbWVVcyk7Ci0gICAgaW50NjRfdCBnZXRSZWFsVGltZVVzKGludDY0X3QgbWVkaWFUaW1lVXMsIGludDY0X3Qgbm93VXMpOwotCi0gICAgdm9pZCBvbkRyYWluVmlkZW9RdWV1ZSgpOwotICAgIHZvaWQgcG9zdERyYWluVmlkZW9RdWV1ZSgpOwotCi0gICAgdm9pZCBwcmVwYXJlRm9yTWVkaWFSZW5kZXJpbmdTdGFydF9sKCk7Ci0gICAgdm9pZCBub3RpZnlJZk1lZGlhUmVuZGVyaW5nU3RhcnRlZF9sKCk7Ci0KLSAgICB2b2lkIG9uUXVldWVCdWZmZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHZvaWQgb25RdWV1ZUVPUyhjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7Ci0gICAgdm9pZCBvbkZsdXNoKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2b2lkIG9uQXVkaW9TaW5rQ2hhbmdlZCgpOwotICAgIHZvaWQgb25EaXNhYmxlT2ZmbG9hZEF1ZGlvKCk7Ci0gICAgdm9pZCBvbkVuYWJsZU9mZmxvYWRBdWRpbygpOwotICAgIHN0YXR1c190IG9uQ29uZmlnUGxheWJhY2soY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUgLyogc2FuaXRpemVkICovKTsKLSAgICBzdGF0dXNfdCBvbkdldFBsYXliYWNrU2V0dGluZ3MoQXVkaW9QbGF5YmFja1JhdGUgKnJhdGUgLyogbm9ubnVsbCAqLyk7Ci0gICAgc3RhdHVzX3Qgb25Db25maWdTeW5jKGNvbnN0IEFWU3luY1NldHRpbmdzICZzeW5jLCBmbG9hdCB2aWRlb0Zwc0hpbnQpOwotICAgIHN0YXR1c190IG9uR2V0U3luY1NldHRpbmdzKEFWU3luY1NldHRpbmdzICpzeW5jIC8qIG5vbm51bGwgKi8sIGZsb2F0ICp2aWRlb0ZwcyAvKiBub25udWxsICovKTsKLQotICAgIHZvaWQgb25QYXVzZSgpOwotICAgIHZvaWQgb25SZXN1bWUoKTsKLSAgICB2b2lkIG9uU2V0VmlkZW9GcmFtZVJhdGUoZmxvYXQgZnBzKTsKLSAgICBpbnQzMl90IGdldFF1ZXVlR2VuZXJhdGlvbihib29sIGF1ZGlvKTsKLSAgICBpbnQzMl90IGdldERyYWluR2VuZXJhdGlvbihib29sIGF1ZGlvKTsKLSAgICBib29sIGdldFN5bmNRdWV1ZXMoKTsKLSAgICB2b2lkIG9uQXVkaW9UZWFyRG93bihBdWRpb1RlYXJEb3duUmVhc29uIHJlYXNvbik7Ci0gICAgc3RhdHVzX3Qgb25PcGVuQXVkaW9TaW5rKAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsCi0gICAgICAgICAgICBib29sIG9mZmxvYWRPbmx5LAotICAgICAgICAgICAgYm9vbCBoYXNWaWRlbywKLSAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAotICAgICAgICAgICAgYm9vbCBpc1N0cmVhbWluZyk7Ci0gICAgdm9pZCBvbkNsb3NlQXVkaW9TaW5rKCk7Ci0gICAgdm9pZCBvbkNoYW5nZUF1ZGlvRm9ybWF0KGNvbnN0IHNwPEFNZXNzYWdlPiAmbWV0YSwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOwotCi0gICAgdm9pZCBub3RpZnlFT1MoYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQsIGludDY0X3QgZGVsYXlVcyA9IDApOwotICAgIHZvaWQgbm90aWZ5RU9TX2woYm9vbCBhdWRpbywgc3RhdHVzX3QgZmluYWxSZXN1bHQsIGludDY0X3QgZGVsYXlVcyA9IDApOwotICAgIHZvaWQgbm90aWZ5Rmx1c2hDb21wbGV0ZShib29sIGF1ZGlvKTsKLSAgICB2b2lkIG5vdGlmeVBvc2l0aW9uKCk7Ci0gICAgdm9pZCBub3RpZnlWaWRlb0xhdGVCeShpbnQ2NF90IGxhdGVCeVVzKTsKLSAgICB2b2lkIG5vdGlmeVZpZGVvUmVuZGVyaW5nU3RhcnQoKTsKLSAgICB2b2lkIG5vdGlmeUF1ZGlvVGVhckRvd24oQXVkaW9UZWFyRG93blJlYXNvbiByZWFzb24pOwotCi0gICAgdm9pZCBmbHVzaFF1ZXVlKExpc3Q8UXVldWVFbnRyeT4gKnF1ZXVlKTsKLSAgICBib29sIGRyb3BCdWZmZXJJZlN0YWxlKGJvb2wgYXVkaW8sIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2b2lkIHN5bmNRdWV1ZXNEb25lX2woKTsKLQotICAgIGJvb2wgb2ZmbG9hZGluZ0F1ZGlvKCkgY29uc3QgeyByZXR1cm4gKG1GbGFncyAmIEZMQUdfT0ZGTE9BRF9BVURJTykgIT0gMDsgfQotCi0gICAgdm9pZCBzdGFydEF1ZGlvT2ZmbG9hZFBhdXNlVGltZW91dCgpOwotICAgIHZvaWQgY2FuY2VsQXVkaW9PZmZsb2FkUGF1c2VUaW1lb3V0KCk7Ci0KLSAgICBpbnQ2NF90IGdldER1cmF0aW9uVXNJZlBsYXllZEF0U2FtcGxlUmF0ZSh1aW50MzJfdCBudW1GcmFtZXMpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVuZGVyZXIpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE5VUExBWUVSMl9SRU5ERVJFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvTnVQbGF5ZXIyU291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MjIzNWYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXIyL251cGxheWVyMi9OdVBsYXllcjJTb3VyY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE5VUExBWUVSMl9TT1VSQ0VfSF8KLQotI2RlZmluZSBOVVBMQVlFUjJfU09VUkNFX0hfCi0KLSNpbmNsdWRlICJOdVBsYXllcjIuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhcGxheWVyMi9tZWRpYXBsYXllcjIuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgQUJ1ZmZlcjsKLXN0cnVjdCBBTWVkaWFDcnlwdG9XcmFwcGVyOwotY2xhc3MgTWVkaWFCdWZmZXI7Ci0KLXN0cnVjdCBOdVBsYXllcjI6OlNvdXJjZSA6IHB1YmxpYyBBSGFuZGxlciB7Ci0gICAgZW51bSBGbGFncyB7Ci0gICAgICAgIEZMQUdfQ0FOX1BBVVNFICAgICAgICAgID0gMSwKLSAgICAgICAgRkxBR19DQU5fU0VFS19CQUNLV0FSRCAgPSAyLCAgLy8gdGhlICIxMCBzZWMgYmFjayBidXR0b24iCi0gICAgICAgIEZMQUdfQ0FOX1NFRUtfRk9SV0FSRCAgID0gNCwgIC8vIHRoZSAiMTAgc2VjIGZvcndhcmQgYnV0dG9uIgotICAgICAgICBGTEFHX0NBTl9TRUVLICAgICAgICAgICA9IDgsICAvLyB0aGUgInNlZWsgYmFyIgotICAgICAgICBGTEFHX0RZTkFNSUNfRFVSQVRJT04gICA9IDE2LAotICAgICAgICBGTEFHX1NFQ1VSRSAgICAgICAgICAgICA9IDMyLCAvLyBTZWN1cmUgY29kZWMgaXMgcmVxdWlyZWQuCi0gICAgICAgIEZMQUdfUFJPVEVDVEVEICAgICAgICAgID0gNjQsIC8vIFRoZSBzY3JlZW4gbmVlZHMgdG8gYmUgcHJvdGVjdGVkIChzY3JlZW5zaG90IGlzIGRpc2FibGVkKS4KLSAgICB9OwotCi0gICAgZW51bSB7Ci0gICAgICAgIGtXaGF0UHJlcGFyZWQsCi0gICAgICAgIGtXaGF0RmxhZ3NDaGFuZ2VkLAotICAgICAgICBrV2hhdFZpZGVvU2l6ZUNoYW5nZWQsCi0gICAgICAgIGtXaGF0QnVmZmVyaW5nVXBkYXRlLAotICAgICAgICBrV2hhdFBhdXNlT25CdWZmZXJpbmdTdGFydCwKLSAgICAgICAga1doYXRSZXN1bWVPbkJ1ZmZlcmluZ0VuZCwKLSAgICAgICAga1doYXRDYWNoZVN0YXRzLAotICAgICAgICBrV2hhdFN1YnRpdGxlRGF0YSwKLSAgICAgICAga1doYXRUaW1lZFRleHREYXRhLAotICAgICAgICBrV2hhdFRpbWVkTWV0YURhdGEsCi0gICAgICAgIGtXaGF0UXVldWVEZWNvZGVyU2h1dGRvd24sCi0gICAgICAgIGtXaGF0RHJtTm9MaWNlbnNlLAotICAgICAgICAvLyBNb2R1bGFyIERSTQotICAgICAgICBrV2hhdERybUluZm8sCi0gICAgfTsKLQotICAgIC8vIFRoZSBwcm92aWRlcyBtZXNzYWdlIGlzIHVzZWQgdG8gbm90aWZ5IHRoZSBwbGF5ZXIgYWJvdXQgdmFyaW91cwotICAgIC8vIGV2ZW50cy4KLSAgICBleHBsaWNpdCBTb3VyY2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpCi0gICAgICAgIDogbU5vdGlmeShub3RpZnkpIHsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlcmluZ1NldHRpbmdzKAotICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRCdWZmZXJpbmdTZXR0aW5ncyhjb25zdCBCdWZmZXJpbmdTZXR0aW5ncyYgYnVmZmVyaW5nKSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgcHJlcGFyZUFzeW5jKCkgPSAwOwotCi0gICAgdmlydHVhbCB2b2lkIHN0YXJ0KCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBzdG9wKCkge30KLSAgICB2aXJ0dWFsIHZvaWQgcGF1c2UoKSB7fQotICAgIHZpcnR1YWwgdm9pZCByZXN1bWUoKSB7fQotCi0gICAgLy8gRXhwbGljaXRseSBkaXNjb25uZWN0IHRoZSB1bmRlcmxpbmcgZGF0YSBzb3VyY2UKLSAgICB2aXJ0dWFsIHZvaWQgZGlzY29ubmVjdCgpIHt9Ci0KLSAgICAvLyBSZXR1cm5zIE9LIGlmZiBtb3JlIGRhdGEgd2FzIGF2YWlsYWJsZSwKLSAgICAvLyBhbiBlcnJvciBvciBFUlJPUl9FTkRfT0ZfU1RSRUFNIGlmIG5vdC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZlZWRNb3JlVFNEYXRhKCkgPSAwOwotCi0gICAgLy8gUmV0dXJucyBub24tTlVMTCBmb3JtYXQgd2hlbiB0aGUgc3BlY2lmaWVkIHRyYWNrIGV4aXN0cy4KLSAgICAvLyBXaGVuIHRoZSBmb3JtYXQgaGFzICJlcnIiIHNldCB0byAtRVdPVUxEQkxPQ0ssIHNvdXJjZSBuZWVkcyBtb3JlIHRpbWUgdG8gZ2V0IHZhbGlkIG1ldGEgZGF0YS4KLSAgICAvLyBSZXR1cm5zIE5VTEwgaWYgdGhlIHNwZWNpZmllZCB0cmFjayBkb2Vzbid0IGV4aXN0IG9yIGlzIGludmFsaWQ7Ci0gICAgdmlydHVhbCBzcDxBTWVzc2FnZT4gZ2V0Rm9ybWF0KGJvb2wgYXVkaW8pOwotCi0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0Rm9ybWF0TWV0YShib29sIC8qIGF1ZGlvICovKSB7IHJldHVybiBOVUxMOyB9Ci0gICAgdmlydHVhbCBzcDxNZXRhRGF0YT4gZ2V0RmlsZUZvcm1hdE1ldGEoKSBjb25zdCB7IHJldHVybiBOVUxMOyB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KAotICAgICAgICAgICAgYm9vbCBhdWRpbywgc3A8QUJ1ZmZlcj4gKmFjY2Vzc1VuaXQpID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqIC8qIGR1cmF0aW9uVXMgKi8pIHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHZpcnR1YWwgc2l6ZV90IGdldFRyYWNrQ291bnQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgLyogdHJhY2tJbmRleCAqLykgY29uc3QgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIC8qIHR5cGUgKi8pIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgIH0KLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2VsZWN0VHJhY2soc2l6ZV90IC8qIHRyYWNrSW5kZXggKi8sIGJvb2wgLyogc2VsZWN0ICovLCBpbnQ2NF90IC8qIHRpbWVVcyovKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNlZWtUbygKLSAgICAgICAgICAgIGludDY0X3QgLyogc2Vla1RpbWVVcyAqLywKLSAgICAgICAgICAgIE1lZGlhUGxheWVyMlNlZWtNb2RlIC8qIG1vZGUgKi8gPSBNZWRpYVBsYXllcjJTZWVrTW9kZTo6U0VFS19QUkVWSU9VU19TWU5DKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIGJvb2wgaXNSZWFsVGltZSgpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbWluZygpIGNvbnN0IHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgdmlydHVhbCB2b2lkIHNldE9mZmxvYWRBdWRpbyhib29sIC8qIG9mZmxvYWQgKi8pIHt9Ci0KLSAgICAvLyBNb2R1bGFyIERSTQotICAgIHZpcnR1YWwgc3RhdHVzX3QgcHJlcGFyZURybSgKLSAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgLyogdXVpZCAqL1sxNl0sIGNvbnN0IFZlY3Rvcjx1aW50OF90PiAmIC8qIGRybVNlc3Npb25JZCAqLywKLSAgICAgICAgICAgIHNwPEFNZWRpYUNyeXB0b1dyYXBwZXI+ICogLyogY3J5cHRvICovKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHJlbGVhc2VEcm0oKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5Tb3VyY2UoKSB7fQotCi0gICAgdmlydHVhbCB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLQotICAgIHNwPEFNZXNzYWdlPiBkdXBOb3RpZnkoKSBjb25zdCB7IHJldHVybiBtTm90aWZ5LT5kdXAoKTsgfQotCi0gICAgdm9pZCBub3RpZnlGbGFnc0NoYW5nZWQodWludDMyX3QgZmxhZ3MpOwotICAgIHZvaWQgbm90aWZ5VmlkZW9TaXplQ2hhbmdlZChjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCA9IE5VTEwpOwotICAgIHZvaWQgbm90aWZ5UHJlcGFyZWQoc3RhdHVzX3QgZXJyID0gT0spOwotICAgIC8vIE1vZHVsYXIgRFJNCi0gICAgdm9pZCBub3RpZnlEcm1JbmZvKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOwotCi1wcml2YXRlOgotICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU291cmNlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTlVQTEFZRVIyX1NPVVJDRV9IXwotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGJjMGE5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsOTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiUlRTUFNvdXJjZTIiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlICJSVFNQU291cmNlMi5oIgotCi0jaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgotI2luY2x1ZGUgIk15SGFuZGxlci5oIgotI2luY2x1ZGUgIlNEUExvYWRlci5oIgotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY29uc3QgaW50NjRfdCBrTmVhckVPU1RpbWVvdXRVcyA9IDIwMDAwMDBMTDsgLy8gMiBzZWNzCi0KLS8vIERlZmF1bHQgQnVmZmVyIFVuZGVyZmxvdy9QcmVwYXJlL1N0YXJ0U2VydmVyL092ZXJmbG93IE1hcmtzCi1zdGF0aWMgY29uc3QgaW50IGtVbmRlcmZsb3dNYXJrTXMgICA9ICAxMDAwOyAgLy8gMSBzZWNvbmQKLXN0YXRpYyBjb25zdCBpbnQga1ByZXBhcmVNYXJrTXMgICAgID0gIDMwMDA7ICAvLyAzIHNlY29uZHMKLS8vc3RhdGljIGNvbnN0IGludCBrU3RhcnRTZXJ2ZXJNYXJrTXMgPSAgNTAwMDsKLXN0YXRpYyBjb25zdCBpbnQga092ZXJmbG93TWFya01zICAgID0gMTAwMDA7ICAvLyAxMCBzZWNvbmRzCi0KLU51UGxheWVyMjo6UlRTUFNvdXJjZTI6OlJUU1BTb3VyY2UyKAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAotICAgICAgICBjb25zdCBjaGFyICp1cmwsCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgIGJvb2wgaXNTRFApCi0gICAgOiBTb3VyY2Uobm90aWZ5KSwKLSAgICAgIG1IVFRQU2VydmljZShodHRwU2VydmljZSksCi0gICAgICBtVVJMKHVybCksCi0gICAgICBtVUlEKHVpZCksCi0gICAgICBtRmxhZ3MoMCksCi0gICAgICBtSXNTRFAoaXNTRFApLAotICAgICAgbVN0YXRlKERJU0NPTk5FQ1RFRCksCi0gICAgICBtRmluYWxSZXN1bHQoT0spLAotICAgICAgbURpc2Nvbm5lY3RSZXBseUlEKDApLAotICAgICAgbUJ1ZmZlcmluZyhmYWxzZSksCi0gICAgICBtSW5QcmVwYXJhdGlvblBoYXNlKHRydWUpLAotICAgICAgbUVPU1BlbmRpbmcoZmFsc2UpLAotICAgICAgbVNlZWtHZW5lcmF0aW9uKDApLAotICAgICAgbUVPU1RpbWVvdXRBdWRpbygwKSwKLSAgICAgIG1FT1NUaW1lb3V0VmlkZW8oMCkgewotICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tSW5pdGlhbE1hcmtNcyA9IGtQcmVwYXJlTWFya01zOwotICAgIG1CdWZmZXJpbmdTZXR0aW5ncy5tUmVzdW1lUGxheWJhY2tNYXJrTXMgPSBrT3ZlcmZsb3dNYXJrTXM7Ci0gICAgaWYgKGhlYWRlcnMpIHsKLSAgICAgICAgbUV4dHJhSGVhZGVycyA9ICpoZWFkZXJzOwotCi0gICAgICAgIHNzaXplX3QgaW5kZXggPQotICAgICAgICAgICAgbUV4dHJhSGVhZGVycy5pbmRleE9mS2V5KFN0cmluZzgoIngtaGlkZS11cmxzLWZyb20tbG9nIikpOwotCi0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdJbmNvZ25pdG87Ci0KLSAgICAgICAgICAgIG1FeHRyYUhlYWRlcnMucmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLU51UGxheWVyMjo6UlRTUFNvdXJjZTI6On5SVFNQU291cmNlMigpIHsKLSAgICBpZiAobUxvb3BlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1Mb29wZXItPnVucmVnaXN0ZXJIYW5kbGVyKGlkKCkpOwotICAgICAgICBtTG9vcGVyLT5zdG9wKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpnZXRCdWZmZXJpbmdTZXR0aW5ncygKLSAgICAgICAgICAgIEJ1ZmZlcmluZ1NldHRpbmdzKiBidWZmZXJpbmcgLyogbm9ubnVsbCAqLykgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtQnVmZmVyaW5nU2V0dGluZ3NMb2NrKTsKLSAgICAqYnVmZmVyaW5nID0gbUJ1ZmZlcmluZ1NldHRpbmdzOwotICAgIHJldHVybiBPSzsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6c2V0QnVmZmVyaW5nU2V0dGluZ3MoY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MmIGJ1ZmZlcmluZykgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtQnVmZmVyaW5nU2V0dGluZ3NMb2NrKTsKLSAgICBtQnVmZmVyaW5nU2V0dGluZ3MgPSBidWZmZXJpbmc7Ci0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OnByZXBhcmVBc3luYygpIHsKLSAgICBpZiAobUlzU0RQICYmIG1IVFRQU2VydmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIG5vdGlmeVByZXBhcmVkKEJBRF9WQUxVRSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAobUxvb3BlciA9PSBOVUxMKSB7Ci0gICAgICAgIG1Mb29wZXIgPSBuZXcgQUxvb3BlcjsKLSAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgicnRzcCIpOwotICAgICAgICBtTG9vcGVyLT5zdGFydCgpOwotCi0gICAgICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcih0aGlzKTsKLSAgICB9Ci0KLSAgICBDSEVDSyhtSGFuZGxlciA9PSBOVUxMKTsKLSAgICBDSEVDSyhtU0RQTG9hZGVyID09IE5VTEwpOwotCi0gICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG5ldyBBTWVzc2FnZShrV2hhdE5vdGlmeSwgdGhpcyk7Ci0KLSAgICBDSEVDS19FUShtU3RhdGUsIChpbnQpRElTQ09OTkVDVEVEKTsKLSAgICBtU3RhdGUgPSBDT05ORUNUSU5HOwotCi0gICAgaWYgKG1Jc1NEUCkgewotICAgICAgICBtU0RQTG9hZGVyID0gbmV3IFNEUExvYWRlcihub3RpZnksCi0gICAgICAgICAgICAgICAgKG1GbGFncyAmIGtGbGFnSW5jb2duaXRvKSA/IFNEUExvYWRlcjo6a0ZsYWdJbmNvZ25pdG8gOiAwLAotICAgICAgICAgICAgICAgIG1IVFRQU2VydmljZSk7Ci0KLSAgICAgICAgbVNEUExvYWRlci0+bG9hZCgKLSAgICAgICAgICAgICAgICBtVVJMLmNfc3RyKCksIG1FeHRyYUhlYWRlcnMuaXNFbXB0eSgpID8gTlVMTCA6ICZtRXh0cmFIZWFkZXJzKTsKLSAgICB9IGVsc2UgewotICAgICAgICBtSGFuZGxlciA9IG5ldyBNeUhhbmRsZXIobVVSTC5jX3N0cigpLCBub3RpZnksIHRydWUgLyogdWlkVmFsaWQgKi8sIG1VSUQpOwotICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOwotCi0gICAgICAgIG1IYW5kbGVyLT5jb25uZWN0KCk7Ci0gICAgfQotCi0gICAgc3RhcnRCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpOwotfQotCi12b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OnN0YXJ0KCkgewotfQotCi12b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OnN0b3AoKSB7Ci0gICAgaWYgKG1Mb29wZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXREaXNjb25uZWN0LCB0aGlzKTsKLQotICAgIHNwPEFNZXNzYWdlPiBkdW1teTsKLSAgICBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZkdW1teSk7Ci19Ci0KLXN0YXR1c190IE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OmZlZWRNb3JlVFNEYXRhKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtQnVmZmVyaW5nTG9jayk7Ci0gICAgcmV0dXJuIG1GaW5hbFJlc3VsdDsKLX0KLQotc3A8TWV0YURhdGE+IE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OmdldEZvcm1hdE1ldGEoYm9vbCBhdWRpbykgewotICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IGdldFNvdXJjZShhdWRpbyk7Ci0KLSAgICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNvdXJjZS0+Z2V0Rm9ybWF0KCk7Ci19Ci0KLWJvb2wgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6aGF2ZVN1ZmZpY2llbnREYXRhT25BbGxUcmFja3MoKSB7Ci0gICAgLy8gV2UncmUgZ29pbmcgdG8gYnVmZmVyIGF0IGxlYXN0IDIgc2VjcyB3b3J0aCBkYXRhIG9uIGFsbCB0cmFja3MgYmVmb3JlCi0gICAgLy8gc3RhcnRpbmcgcGxheWJhY2sgKGJvdGggYXQgc3RhcnR1cCBhbmQgYWZ0ZXIgYSBzZWVrKS4KLQotICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNaW5EdXJhdGlvblVzID0gMjAwMDAwMExMOwotCi0gICAgaW50NjRfdCBtZWRpYUR1cmF0aW9uVXMgPSAwOwotICAgIGdldER1cmF0aW9uKCZtZWRpYUR1cmF0aW9uVXMpOwotICAgIGlmICgobUF1ZGlvVHJhY2sgIT0gTlVMTCAmJiBtQXVkaW9UcmFjay0+aXNGaW5pc2hlZChtZWRpYUR1cmF0aW9uVXMpKQotICAgICAgICAgICAgfHwgKG1WaWRlb1RyYWNrICE9IE5VTEwgJiYgbVZpZGVvVHJhY2stPmlzRmluaXNoZWQobWVkaWFEdXJhdGlvblVzKSkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyOwotICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICBpZiAobUF1ZGlvVHJhY2sgIT0gTlVMTAotICAgICAgICAgICAgJiYgKGR1cmF0aW9uVXMgPSBtQXVkaW9UcmFjay0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZlcnIpKQotICAgICAgICAgICAgICAgICAgICA8IGtNaW5EdXJhdGlvblVzCi0gICAgICAgICAgICAmJiBlcnIgPT0gT0spIHsKLSAgICAgICAgQUxPR1YoImF1ZGlvIHRyYWNrIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggZGF0YSB5ZXQuICglLjJmIHNlY3MgYnVmZmVyZWQpIiwKLSAgICAgICAgICAgICAgZHVyYXRpb25VcyAvIDFFNik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAobVZpZGVvVHJhY2sgIT0gTlVMTAotICAgICAgICAgICAgJiYgKGR1cmF0aW9uVXMgPSBtVmlkZW9UcmFjay0+Z2V0QnVmZmVyZWREdXJhdGlvblVzKCZlcnIpKQotICAgICAgICAgICAgICAgICAgICA8IGtNaW5EdXJhdGlvblVzCi0gICAgICAgICAgICAmJiBlcnIgPT0gT0spIHsKLSAgICAgICAgQUxPR1YoInZpZGVvIHRyYWNrIGRvZXNuJ3QgaGF2ZSBlbm91Z2ggZGF0YSB5ZXQuICglLjJmIHNlY3MgYnVmZmVyZWQpIiwKLSAgICAgICAgICAgICAgZHVyYXRpb25VcyAvIDFFNik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6ZGVxdWV1ZUFjY2Vzc1VuaXQoCi0gICAgICAgIGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KSB7Ci0gICAgaWYgKCFzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnkoKSkgewotICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOwotICAgIH0KLQotICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IGdldFNvdXJjZShhdWRpbyk7Ci0KLSAgICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKLSAgICBpZiAoIXNvdXJjZS0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkpIHsKLSAgICAgICAgaWYgKGZpbmFsUmVzdWx0ID09IE9LKSB7Ci0KLSAgICAgICAgICAgIC8vIElmIG90aGVyIHNvdXJjZSBhbHJlYWR5IHNpZ25hbGVkIEVPUywgdGhpcyBzb3VyY2Ugc2hvdWxkIGFsc28gcmV0dXJuIEVPUwotICAgICAgICAgICAgaWYgKHNvdXJjZVJlYWNoZWRFT1MoIWF1ZGlvKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJZiB0aGlzIHNvdXJjZSBoYXMgZGV0ZWN0ZWQgbmVhciBlbmQsIGdpdmUgaXQgc29tZSB0aW1lIHRvIHJldHJpZXZlIG1vcmUKLSAgICAgICAgICAgIC8vIGRhdGEgYmVmb3JlIHJldHVybmluZyBFT1MKLSAgICAgICAgICAgIGludDY0X3QgbWVkaWFEdXJhdGlvblVzID0gMDsKLSAgICAgICAgICAgIGdldER1cmF0aW9uKCZtZWRpYUR1cmF0aW9uVXMpOwotICAgICAgICAgICAgaWYgKHNvdXJjZS0+aXNGaW5pc2hlZChtZWRpYUR1cmF0aW9uVXMpKSB7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCBlb3NUaW1lb3V0ID0gYXVkaW8gPyBtRU9TVGltZW91dEF1ZGlvIDogbUVPU1RpbWVvdXRWaWRlbzsKLSAgICAgICAgICAgICAgICBpZiAoZW9zVGltZW91dCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEVPU1RpbWVvdXQoYXVkaW8sIEFMb29wZXI6OkdldE5vd1VzKCkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKEFMb29wZXI6OkdldE5vd1VzKCkgLSBlb3NUaW1lb3V0KSA+IGtOZWFyRU9TVGltZW91dFVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEVPU1RpbWVvdXQoYXVkaW8sIDApOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC1FV09VTERCTE9DSzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFzb3VyY2VOZWFyRU9TKCFhdWRpbykpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBzaG91bGQgbm90IGVudGVyIGJ1ZmZlcmluZyBtb2RlCi0gICAgICAgICAgICAgICAgLy8gaWYgYW55IG9mIHRoZSBzb3VyY2VzIGFscmVhZHkgaGF2ZSBkZXRlY3RlZCBFT1MuCi0gICAgICAgICAgICAgICAgc3RhcnRCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gLUVXT1VMREJMT0NLOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmaW5hbFJlc3VsdDsKLSAgICB9Ci0KLSAgICBzZXRFT1NUaW1lb3V0KGF1ZGlvLCAwKTsKLQotICAgIHJldHVybiBzb3VyY2UtPmRlcXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOwotfQotCi1zcDxBbm90aGVyUGFja2V0U291cmNlPiBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpnZXRTb3VyY2UoYm9vbCBhdWRpbykgewotICAgIGlmIChtVFNQYXJzZXIgIT0gTlVMTCkgewotICAgICAgICBzcDxNZWRpYVNvdXJjZT4gc291cmNlID0gbVRTUGFyc2VyLT5nZXRTb3VyY2UoCi0gICAgICAgICAgICAgICAgYXVkaW8gPyBBVFNQYXJzZXI6OkFVRElPIDogQVRTUGFyc2VyOjpWSURFTyk7Ci0KLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEFub3RoZXJQYWNrZXRTb3VyY2UgKj4oc291cmNlLmdldCgpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gYXVkaW8gPyBtQXVkaW9UcmFjayA6IG1WaWRlb1RyYWNrOwotfQotCi12b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OnNldEVPU1RpbWVvdXQoYm9vbCBhdWRpbywgaW50NjRfdCB0aW1lb3V0KSB7Ci0gICAgaWYgKGF1ZGlvKSB7Ci0gICAgICAgIG1FT1NUaW1lb3V0QXVkaW8gPSB0aW1lb3V0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1FT1NUaW1lb3V0VmlkZW8gPSB0aW1lb3V0OwotICAgIH0KLX0KLQotc3RhdHVzX3QgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6Z2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25VcykgewotICAgICpkdXJhdGlvblVzID0gLTFMTDsKLQotICAgIGludDY0X3QgYXVkaW9EdXJhdGlvblVzOwotICAgIGlmIChtQXVkaW9UcmFjayAhPSBOVUxMCi0gICAgICAgICAgICAmJiBtQXVkaW9UcmFjay0+Z2V0Rm9ybWF0KCktPmZpbmRJbnQ2NCgKLSAgICAgICAgICAgICAgICBrS2V5RHVyYXRpb24sICZhdWRpb0R1cmF0aW9uVXMpCi0gICAgICAgICAgICAmJiBhdWRpb0R1cmF0aW9uVXMgPiAqZHVyYXRpb25VcykgewotICAgICAgICAqZHVyYXRpb25VcyA9IGF1ZGlvRHVyYXRpb25VczsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHZpZGVvRHVyYXRpb25VczsKLSAgICBpZiAobVZpZGVvVHJhY2sgIT0gTlVMTAotICAgICAgICAgICAgJiYgbVZpZGVvVHJhY2stPmdldEZvcm1hdCgpLT5maW5kSW50NjQoCi0gICAgICAgICAgICAgICAga0tleUR1cmF0aW9uLCAmdmlkZW9EdXJhdGlvblVzKQotICAgICAgICAgICAgJiYgdmlkZW9EdXJhdGlvblVzID4gKmR1cmF0aW9uVXMpIHsKLSAgICAgICAgKmR1cmF0aW9uVXMgPSB2aWRlb0R1cmF0aW9uVXM7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpzZWVrVG8oaW50NjRfdCBzZWVrVGltZVVzLCBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFBlcmZvcm1TZWVrLCB0aGlzKTsKLSAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgKyttU2Vla0dlbmVyYXRpb24pOwotICAgIG1zZy0+c2V0SW50NjQoInRpbWVVcyIsIHNlZWtUaW1lVXMpOwotICAgIG1zZy0+c2V0SW50MzIoIm1vZGUiLCBtb2RlKTsKLQotICAgIHNwPEFNZXNzYWdlPiByZXNwb25zZTsKLSAgICBzdGF0dXNfdCBlcnIgPSBtc2ctPnBvc3RBbmRBd2FpdFJlc3BvbnNlKCZyZXNwb25zZSk7Ci0gICAgaWYgKGVyciA9PSBPSyAmJiByZXNwb25zZSAhPSBOVUxMKSB7Ci0gICAgICAgIENIRUNLKHJlc3BvbnNlLT5maW5kSW50MzIoImVyciIsICZlcnIpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi12b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OnBlcmZvcm1TZWVrKGludDY0X3Qgc2Vla1RpbWVVcykgewotICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVEVEKSB7Ci0gICAgICAgIGZpbmlzaFNlZWsoSU5WQUxJRF9PUEVSQVRJT04pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbVN0YXRlID0gU0VFS0lORzsKLSAgICBtSGFuZGxlci0+c2VlayhzZWVrVGltZVVzKTsKLSAgICBtRU9TUGVuZGluZyA9IGZhbHNlOwotfQotCi12b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OnNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0UG9sbEJ1ZmZlcmluZywgdGhpcyk7Ci0gICAgbXNnLT5wb3N0KDEwMDAwMDBMTCk7IC8vIDEgc2Vjb25kIGludGVydmFscwotfQotCi12b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OmNoZWNrQnVmZmVyaW5nKAotICAgICAgICBib29sICpwcmVwYXJlZCwgYm9vbCAqdW5kZXJmbG93LCBib29sICpvdmVyZmxvdywgYm9vbCAqc3RhcnRTZXJ2ZXIsIGJvb2wgKmZpbmlzaGVkKSB7Ci0gICAgc2l6ZV90IG51bVRyYWNrcyA9IG1UcmFja3Muc2l6ZSgpOwotICAgIHNpemVfdCBwcmVwYXJlZENvdW50LCB1bmRlcmZsb3dDb3VudCwgb3ZlcmZsb3dDb3VudCwgc3RhcnRDb3VudCwgZmluaXNoZWRDb3VudDsKLSAgICBwcmVwYXJlZENvdW50ID0gdW5kZXJmbG93Q291bnQgPSBvdmVyZmxvd0NvdW50ID0gc3RhcnRDb3VudCA9IGZpbmlzaGVkQ291bnQgPSAwOwotCi0gICAgc2l6ZV90IGNvdW50ID0gbnVtVHJhY2tzOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBzdGF0dXNfdCBmaW5hbFJlc3VsdDsKLSAgICAgICAgVHJhY2tJbmZvICppbmZvID0gJm1UcmFja3MuZWRpdEl0ZW1BdChpKTsKLSAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc3JjID0gaW5mby0+bVNvdXJjZTsKLSAgICAgICAgaWYgKHNyYyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAtLW51bVRyYWNrczsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludDY0X3QgYnVmZmVyZWREdXJhdGlvblVzID0gc3JjLT5nZXRCdWZmZXJlZER1cmF0aW9uVXMoJmZpbmFsUmVzdWx0KTsKLQotICAgICAgICBpbnQ2NF90IGluaXRpYWxNYXJrVXM7Ci0gICAgICAgIGludDY0X3QgbWF4UmVidWZmZXJpbmdNYXJrVXM7Ci0gICAgICAgIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtQnVmZmVyaW5nU2V0dGluZ3NMb2NrKTsKLSAgICAgICAgICAgIGluaXRpYWxNYXJrVXMgPSBtQnVmZmVyaW5nU2V0dGluZ3MubUluaXRpYWxNYXJrTXMgKiAxMDAwTEw7Ci0gICAgICAgICAgICAvLyBUT0RPOiBtYXhSZWJ1ZmZlcmluZ01hcmtVcyBjb3VsZCBiZSBsYXJnZXIgdGhhbgotICAgICAgICAgICAgLy8gbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcyAqIDEwMDBsbC4KLSAgICAgICAgICAgIG1heFJlYnVmZmVyaW5nTWFya1VzID0gbUJ1ZmZlcmluZ1NldHRpbmdzLm1SZXN1bWVQbGF5YmFja01hcmtNcyAqIDEwMDBMTDsKLSAgICAgICAgfQotICAgICAgICAvLyBpc0ZpbmlzaGVkIHdoZW4gZHVyYXRpb24gaXMgMCBjaGVja3MgZm9yIEVPUyByZXN1bHQgb25seQotICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzID4gaW5pdGlhbE1hcmtVcwotICAgICAgICAgICAgICAgIHx8IHNyYy0+aXNGaW5pc2hlZCgvKiBkdXJhdGlvbiAqLyAwKSkgewotICAgICAgICAgICAgKytwcmVwYXJlZENvdW50OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKHNyYy0+aXNGaW5pc2hlZCgvKiBkdXJhdGlvbiAqLyAwKSkgewotICAgICAgICAgICAgKytvdmVyZmxvd0NvdW50OwotICAgICAgICAgICAgKytmaW5pc2hlZENvdW50OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETzogcmVkZWZpbmUga1VuZGVyZmxvd01hcmtNcyB0byBhIGZhaXIgdmFsdWUsCi0gICAgICAgICAgICBpZiAoYnVmZmVyZWREdXJhdGlvblVzIDwga1VuZGVyZmxvd01hcmtNcyAqIDEwMDApIHsKLSAgICAgICAgICAgICAgICArK3VuZGVyZmxvd0NvdW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkRHVyYXRpb25VcyA+IG1heFJlYnVmZmVyaW5nTWFya1VzKSB7Ci0gICAgICAgICAgICAgICAgKytvdmVyZmxvd0NvdW50OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50NjRfdCBzdGFydFNlcnZlck1hcmtVcyA9Ci0gICAgICAgICAgICAgICAgICAgIChrVW5kZXJmbG93TWFya01zICogMTAwMExMICsgbWF4UmVidWZmZXJpbmdNYXJrVXMpIC8gMjsKLSAgICAgICAgICAgIGlmIChidWZmZXJlZER1cmF0aW9uVXMgPCBzdGFydFNlcnZlck1hcmtVcykgewotICAgICAgICAgICAgICAgICsrc3RhcnRDb3VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgICpwcmVwYXJlZCAgICA9IChwcmVwYXJlZENvdW50ID09IG51bVRyYWNrcyk7Ci0gICAgKnVuZGVyZmxvdyAgID0gKHVuZGVyZmxvd0NvdW50ID4gMCk7Ci0gICAgKm92ZXJmbG93ICAgID0gKG92ZXJmbG93Q291bnQgPT0gbnVtVHJhY2tzKTsKLSAgICAqc3RhcnRTZXJ2ZXIgPSAoc3RhcnRDb3VudCA+IDApOwotICAgICpmaW5pc2hlZCAgICA9IChmaW5pc2hlZENvdW50ID4gMCk7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6b25Qb2xsQnVmZmVyaW5nKCkgewotICAgIGJvb2wgcHJlcGFyZWQsIHVuZGVyZmxvdywgb3ZlcmZsb3csIHN0YXJ0U2VydmVyLCBmaW5pc2hlZDsKLSAgICBjaGVja0J1ZmZlcmluZygmcHJlcGFyZWQsICZ1bmRlcmZsb3csICZvdmVyZmxvdywgJnN0YXJ0U2VydmVyLCAmZmluaXNoZWQpOwotCi0gICAgaWYgKHByZXBhcmVkICYmIG1JblByZXBhcmF0aW9uUGhhc2UpIHsKLSAgICAgICAgbUluUHJlcGFyYXRpb25QaGFzZSA9IGZhbHNlOwotICAgICAgICBub3RpZnlQcmVwYXJlZCgpOwotICAgIH0KLQotICAgIGlmICghbUluUHJlcGFyYXRpb25QaGFzZSAmJiB1bmRlcmZsb3cpIHsKLSAgICAgICAgc3RhcnRCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpOwotICAgIH0KLQotICAgIGlmIChoYXZlU3VmZmljaWVudERhdGFPbkFsbFRyYWNrcygpKSB7Ci0gICAgICAgIHN0b3BCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpOwotICAgIH0KLQotICAgIGlmIChvdmVyZmxvdyAmJiBtSGFuZGxlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1IYW5kbGVyLT5wYXVzZSgpOwotICAgIH0KLQotICAgIGlmIChzdGFydFNlcnZlciAmJiBtSGFuZGxlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1IYW5kbGVyLT5yZXN1bWUoKTsKLSAgICB9Ci0KLSAgICBpZiAoZmluaXNoZWQgJiYgbUhhbmRsZXIgIT0gTlVMTCkgewotICAgICAgICBtSGFuZGxlci0+Y2FuY2VsQWNjZXNzVW5pdFRpbWVvdXRDaGVjaygpOwotICAgIH0KLQotICAgIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOwotfQotCi12b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OnNpZ25hbFNvdXJjZUVPUyhzdGF0dXNfdCByZXN1bHQpIHsKLSAgICBjb25zdCBib29sIGF1ZGlvID0gdHJ1ZTsKLSAgICBjb25zdCBib29sIHZpZGVvID0gZmFsc2U7Ci0KLSAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBnZXRTb3VyY2UoYXVkaW8pOwotICAgIGlmIChzb3VyY2UgIT0gTlVMTCkgewotICAgICAgICBzb3VyY2UtPnNpZ25hbEVPUyhyZXN1bHQpOwotICAgIH0KLQotICAgIHNvdXJjZSA9IGdldFNvdXJjZSh2aWRlbyk7Ci0gICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIHNvdXJjZS0+c2lnbmFsRU9TKHJlc3VsdCk7Ci0gICAgfQotfQotCi1ib29sIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OnNvdXJjZVJlYWNoZWRFT1MoYm9vbCBhdWRpbykgewotICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IGdldFNvdXJjZShhdWRpbyk7Ci0gICAgc3RhdHVzX3QgZmluYWxSZXN1bHQ7Ci0gICAgcmV0dXJuIChzb3VyY2UgIT0gTlVMTCAmJgotICAgICAgICAgICAgIXNvdXJjZS0+aGFzQnVmZmVyQXZhaWxhYmxlKCZmaW5hbFJlc3VsdCkgJiYKLSAgICAgICAgICAgIGZpbmFsUmVzdWx0ID09IEVSUk9SX0VORF9PRl9TVFJFQU0pOwotfQotCi1ib29sIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OnNvdXJjZU5lYXJFT1MoYm9vbCBhdWRpbykgewotICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IGdldFNvdXJjZShhdWRpbyk7Ci0gICAgaW50NjRfdCBtZWRpYUR1cmF0aW9uVXMgPSAwOwotICAgIGdldER1cmF0aW9uKCZtZWRpYUR1cmF0aW9uVXMpOwotICAgIHJldHVybiAoc291cmNlICE9IE5VTEwgJiYgc291cmNlLT5pc0ZpbmlzaGVkKG1lZGlhRHVyYXRpb25VcykpOwotfQotCi12b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6Om9uU2lnbmFsRU9TKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgaW50MzJfdCBnZW5lcmF0aW9uOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJnZW5lcmF0aW9uIiwgJmdlbmVyYXRpb24pKTsKLQotICAgIGlmIChnZW5lcmF0aW9uICE9IG1TZWVrR2VuZXJhdGlvbikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1FT1NQZW5kaW5nKSB7Ci0gICAgICAgIHNpZ25hbFNvdXJjZUVPUyhFUlJPUl9FTkRfT0ZfU1RSRUFNKTsKLSAgICAgICAgbUVPU1BlbmRpbmcgPSBmYWxzZTsKLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6cG9zdFNvdXJjZUVPU0lmTmVjZXNzYXJ5KCkgewotICAgIGNvbnN0IGJvb2wgYXVkaW8gPSB0cnVlOwotICAgIGNvbnN0IGJvb2wgdmlkZW8gPSBmYWxzZTsKLSAgICAvLyBJZiBhIHNvdXJjZSBoYXMgZGV0ZWN0ZWQgbmVhciBlbmQsIGdpdmUgaXQgc29tZSB0aW1lIHRvIHJldHJpZXZlIG1vcmUKLSAgICAvLyBkYXRhIGJlZm9yZSBzaWduYWxpbmcgRU9TCi0gICAgaWYgKHNvdXJjZU5lYXJFT1MoYXVkaW8pIHx8IHNvdXJjZU5lYXJFT1ModmlkZW8pKSB7Ci0gICAgICAgIGlmICghbUVPU1BlbmRpbmcpIHsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRTaWduYWxFT1MsIHRoaXMpOwotICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1TZWVrR2VuZXJhdGlvbik7Ci0gICAgICAgICAgICBtc2ctPnBvc3Qoa05lYXJFT1NUaW1lb3V0VXMpOwotICAgICAgICAgICAgbUVPU1BlbmRpbmcgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0RGlzY29ubmVjdCkgewotICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKLSAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwotCi0gICAgICAgIG1EaXNjb25uZWN0UmVwbHlJRCA9IHJlcGx5SUQ7Ci0gICAgICAgIGZpbmlzaERpc2Nvbm5lY3RJZlBvc3NpYmxlKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0UGVyZm9ybVNlZWspIHsKLSAgICAgICAgaW50MzJfdCBnZW5lcmF0aW9uOwotICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigiZ2VuZXJhdGlvbiIsICZnZW5lcmF0aW9uKSk7Ci0gICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJm1TZWVrUmVwbHlJRCkpOwotCi0gICAgICAgIGlmIChnZW5lcmF0aW9uICE9IG1TZWVrR2VuZXJhdGlvbikgewotICAgICAgICAgICAgLy8gb2Jzb2xldGUuCi0gICAgICAgICAgICBmaW5pc2hTZWVrKE9LKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGludDY0X3Qgc2Vla1RpbWVVczsKLSAgICAgICAgaW50MzJfdCBtb2RlOwotICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NCgidGltZVVzIiwgJnNlZWtUaW1lVXMpKTsKLSAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoIm1vZGUiLCAmbW9kZSkpOwotCi0gICAgICAgIC8vIFRPRE86IGFkZCAibW9kZSIgdG8gcGVyZm9ybVNlZWsuCi0gICAgICAgIHBlcmZvcm1TZWVrKHNlZWtUaW1lVXMvKiwgKE1lZGlhUGxheWVyMlNlZWtNb2RlKW1vZGUgKi8pOwotICAgICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChtc2ctPndoYXQoKSA9PSBrV2hhdFBvbGxCdWZmZXJpbmcpIHsKLSAgICAgICAgb25Qb2xsQnVmZmVyaW5nKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKG1zZy0+d2hhdCgpID09IGtXaGF0U2lnbmFsRU9TKSB7Ci0gICAgICAgIG9uU2lnbmFsRU9TKG1zZyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBDSEVDS19FUShtc2ctPndoYXQoKSwga1doYXROb3RpZnkpOwotCi0gICAgaW50MzJfdCB3aGF0OwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJ3aGF0IiwgJndoYXQpKTsKLQotICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICBjYXNlIE15SGFuZGxlcjo6a1doYXRDb25uZWN0ZWQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG9uQ29ubmVjdGVkKCk7Ci0KLSAgICAgICAgICAgIG5vdGlmeVZpZGVvU2l6ZUNoYW5nZWQoKTsKLQotICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwOwotCi0gICAgICAgICAgICBpZiAobUhhbmRsZXItPmlzU2Vla2FibGUoKSkgewotICAgICAgICAgICAgICAgIGZsYWdzID0gRkxBR19DQU5fUEFVU0UKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgRkxBR19DQU5fU0VFSwotICAgICAgICAgICAgICAgICAgICAgICAgfCBGTEFHX0NBTl9TRUVLX0JBQ0tXQVJECi0gICAgICAgICAgICAgICAgICAgICAgICB8IEZMQUdfQ0FOX1NFRUtfRk9SV0FSRDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbm90aWZ5RmxhZ3NDaGFuZ2VkKGZsYWdzKTsKLSAgICAgICAgICAgIHNjaGVkdWxlUG9sbEJ1ZmZlcmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE15SGFuZGxlcjo6a1doYXREaXNjb25uZWN0ZWQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG9uRGlzY29ubmVjdGVkKG1zZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgTXlIYW5kbGVyOjprV2hhdFNlZWtEb25lOgotICAgICAgICB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBDT05ORUNURUQ7Ci0gICAgICAgICAgICAvLyBVbmJsb2NrIHNlZWtUbyBoZXJlIGluIGNhc2Ugd2UgYXR0ZW1wdGVkIHRvIHNlZWsgaW4gYSBsaXZlIHN0cmVhbQotICAgICAgICAgICAgZmluaXNoU2VlayhPSyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgTXlIYW5kbGVyOjprV2hhdFNlZWtQYXVzZWQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IGdldFNvdXJjZSh0cnVlIC8qIGF1ZGlvICovKTsKLSAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNvdXJjZS0+cXVldWVEaXNjb250aW51aXR5KEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9OT05FLAotICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0cmEgKi8gTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgIC8qIGRpc2NhcmQgKi8gdHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzb3VyY2UgPSBnZXRTb3VyY2UoZmFsc2UgLyogdmlkZW8gKi8pOwotICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc291cmNlLT5xdWV1ZURpc2NvbnRpbnVpdHkoQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRyYSAqLyBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgLyogZGlzY2FyZCAqLyB0cnVlKTsKLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgICAgICAgICAgbXNnLT5maW5kSW50MzIoImVyciIsICZlcnIpOwotCi0gICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lVXM7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWUiLCAmdGltZVVzKSk7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXItPmNvbnRpbnVlU2Vla0FmdGVyUGF1c2UodGltZVVzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmluaXNoU2VlayhlcnIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE15SGFuZGxlcjo6a1doYXRBY2Nlc3NVbml0OgotICAgICAgICB7Ci0gICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOwotCi0gICAgICAgICAgICBpZiAobVRTUGFyc2VyID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBDSEVDS19MVCh0cmFja0luZGV4LCBtVHJhY2tzLnNpemUoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIENIRUNLX0VRKHRyYWNrSW5kZXgsIDB1KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYWNjZXNzVW5pdDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEJ1ZmZlcigiYWNjZXNzVW5pdCIsICZhY2Nlc3NVbml0KSk7Ci0KLSAgICAgICAgICAgIGludDMyX3QgZGFtYWdlZDsKLSAgICAgICAgICAgIGlmIChhY2Nlc3NVbml0LT5tZXRhKCktPmZpbmRJbnQzMigiZGFtYWdlZCIsICZkYW1hZ2VkKQotICAgICAgICAgICAgICAgICAgICAmJiBkYW1hZ2VkKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koImRyb3BwaW5nIGRhbWFnZWQgYWNjZXNzIHVuaXQuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtVFNQYXJzZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgICAgICAgICAgICAgIHdoaWxlIChvZmZzZXQgKyAxODggPD0gYWNjZXNzVW5pdC0+c2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGVyciA9IG1UU1BhcnNlci0+ZmVlZFRTUGFja2V0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPmRhdGEoKSArIG9mZnNldCwgMTg4KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMTg4OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgPCBhY2Nlc3NVbml0LT5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgZXJyID0gRVJST1JfTUFMRk9STUVEOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgc2lnbmFsU291cmNlRU9TKGVycik7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcG9zdFNvdXJjZUVPU0lmTmVjZXNzYXJ5KCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQodHJhY2tJbmRleCk7Ci0KLSAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IGluZm8tPm1Tb3VyY2U7Ci0gICAgICAgICAgICBpZiAoc291cmNlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICB1aW50MzJfdCBydHBUaW1lOwotICAgICAgICAgICAgICAgIENIRUNLKGFjY2Vzc1VuaXQtPm1ldGEoKS0+ZmluZEludDMyKCJydHAtdGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKLQotICAgICAgICAgICAgICAgIGlmICghaW5mby0+bU5QVE1hcHBpbmdWYWxpZCkgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgbGl2ZSBzdHJlYW0sIHdlIGRpZG4ndCByZWNlaXZlIGFueSBub3JtYWwKLSAgICAgICAgICAgICAgICAgICAgLy8gcGxheXRpbWUgbWFwcGluZy4gV2Ugd29uJ3QgbWFwIHRvIG5wdCB0aW1lLgotICAgICAgICAgICAgICAgICAgICBzb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50NjRfdCBucHRVcyA9Ci0gICAgICAgICAgICAgICAgICAgICgoZG91YmxlKXJ0cFRpbWUgLSAoZG91YmxlKWluZm8tPm1SVFBUaW1lKQotICAgICAgICAgICAgICAgICAgICAgICAgLyBpbmZvLT5tVGltZVNjYWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAqIDEwMDAwMDBMTAotICAgICAgICAgICAgICAgICAgICAgICAgKyBpbmZvLT5tTm9ybWFsUGxheXRpbWVVczsKLQotICAgICAgICAgICAgICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIG5wdFVzKTsKLQotICAgICAgICAgICAgICAgIHNvdXJjZS0+cXVldWVBY2Nlc3NVbml0KGFjY2Vzc1VuaXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcG9zdFNvdXJjZUVPU0lmTmVjZXNzYXJ5KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgTXlIYW5kbGVyOjprV2hhdEVPUzoKLSAgICAgICAgewotICAgICAgICAgICAgaW50MzJfdCBmaW5hbFJlc3VsdDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJmaW5hbFJlc3VsdCIsICZmaW5hbFJlc3VsdCkpOwotICAgICAgICAgICAgQ0hFQ0tfTkUoZmluYWxSZXN1bHQsIChzdGF0dXNfdClPSyk7Ci0KLSAgICAgICAgICAgIGlmIChtVFNQYXJzZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNpZ25hbFNvdXJjZUVPUyhmaW5hbFJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4OwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7Ci0gICAgICAgICAgICBDSEVDS19MVCh0cmFja0luZGV4LCBtVHJhY2tzLnNpemUoKSk7Ci0KLSAgICAgICAgICAgIFRyYWNrSW5mbyAqaW5mbyA9ICZtVHJhY2tzLmVkaXRJdGVtQXQodHJhY2tJbmRleCk7Ci0gICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzb3VyY2UgPSBpbmZvLT5tU291cmNlOwotICAgICAgICAgICAgaWYgKHNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgc291cmNlLT5zaWduYWxFT1MoZmluYWxSZXN1bHQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgTXlIYW5kbGVyOjprV2hhdFNlZWtEaXNjb250aW51aXR5OgotICAgICAgICB7Ci0gICAgICAgICAgICBzaXplX3QgdHJhY2tJbmRleDsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFNpemUoInRyYWNrSW5kZXgiLCAmdHJhY2tJbmRleCkpOwotICAgICAgICAgICAgQ0hFQ0tfTFQodHJhY2tJbmRleCwgbVRyYWNrcy5zaXplKCkpOwotCi0gICAgICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpOwotICAgICAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gc291cmNlID0gaW5mby0+bVNvdXJjZTsKLSAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHNvdXJjZS0+cXVldWVEaXNjb250aW51aXR5KAotICAgICAgICAgICAgICAgICAgICAgICAgQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX1RJTUUsCi0gICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBkaXNjYXJkICovKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIE15SGFuZGxlcjo6a1doYXROb3JtYWxQbGF5VGltZU1hcHBpbmc6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHNpemVfdCB0cmFja0luZGV4OwotICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kU2l6ZSgidHJhY2tJbmRleCIsICZ0cmFja0luZGV4KSk7Ci0gICAgICAgICAgICBDSEVDS19MVCh0cmFja0luZGV4LCBtVHJhY2tzLnNpemUoKSk7Ci0KLSAgICAgICAgICAgIHVpbnQzMl90IHJ0cFRpbWU7Ci0gICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigicnRwVGltZSIsIChpbnQzMl90ICopJnJ0cFRpbWUpKTsKLQotICAgICAgICAgICAgaW50NjRfdCBucHRVczsKLSAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZEludDY0KCJucHRVcyIsICZucHRVcykpOwotCi0gICAgICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVRyYWNrcy5lZGl0SXRlbUF0KHRyYWNrSW5kZXgpOwotICAgICAgICAgICAgaW5mby0+bVJUUFRpbWUgPSBydHBUaW1lOwotICAgICAgICAgICAgaW5mby0+bU5vcm1hbFBsYXl0aW1lVXMgPSBucHRVczsKLSAgICAgICAgICAgIGluZm8tPm1OUFRNYXBwaW5nVmFsaWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIFNEUExvYWRlcjo6a1doYXRTRFBMb2FkZWQ6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIG9uU0RQTG9hZGVkKG1zZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUUkVTUEFTUygpOwotICAgIH0KLX0KLQotdm9pZCBOdVBsYXllcjI6OlJUU1BTb3VyY2UyOjpvbkNvbm5lY3RlZCgpIHsKLSAgICBDSEVDSyhtQXVkaW9UcmFjayA9PSBOVUxMKTsKLSAgICBDSEVDSyhtVmlkZW9UcmFjayA9PSBOVUxMKTsKLQotICAgIHNpemVfdCBudW1UcmFja3MgPSBtSGFuZGxlci0+Y291bnRUcmFja3MoKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVRyYWNrczsgKytpKSB7Ci0gICAgICAgIGludDMyX3QgdGltZVNjYWxlOwotICAgICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gbUhhbmRsZXItPmdldFRyYWNrRm9ybWF0KGksICZ0aW1lU2NhbGUpOwotCi0gICAgICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgICAgIENIRUNLKGZvcm1hdC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwotCi0gICAgICAgIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzJUUykpIHsKLSAgICAgICAgICAgIC8vIFZlcnkgc3BlY2lhbCBjYXNlIGZvciBNUEVHMiBUcmFuc3BvcnQgU3RyZWFtcy4KLSAgICAgICAgICAgIENIRUNLX0VRKG51bVRyYWNrcywgMXUpOwotCi0gICAgICAgICAgICBtVFNQYXJzZXIgPSBuZXcgQVRTUGFyc2VyOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbCBpc0F1ZGlvID0gIXN0cm5jYXNlY21wKG1pbWUsICJhdWRpby8iLCA2KTsKLSAgICAgICAgYm9vbCBpc1ZpZGVvID0gIXN0cm5jYXNlY21wKG1pbWUsICJ2aWRlby8iLCA2KTsKLQotICAgICAgICBUcmFja0luZm8gaW5mbzsKLSAgICAgICAgaW5mby5tVGltZVNjYWxlID0gdGltZVNjYWxlOwotICAgICAgICBpbmZvLm1SVFBUaW1lID0gMDsKLSAgICAgICAgaW5mby5tTm9ybWFsUGxheXRpbWVVcyA9IDBMTDsKLSAgICAgICAgaW5mby5tTlBUTWFwcGluZ1ZhbGlkID0gZmFsc2U7Ci0KLSAgICAgICAgaWYgKChpc0F1ZGlvICYmIG1BdWRpb1RyYWNrID09IE5VTEwpCi0gICAgICAgICAgICAgICAgfHwgKGlzVmlkZW8gJiYgbVZpZGVvVHJhY2sgPT0gTlVMTCkpIHsKLSAgICAgICAgICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IHNvdXJjZSA9IG5ldyBBbm90aGVyUGFja2V0U291cmNlKGZvcm1hdCk7Ci0KLSAgICAgICAgICAgIGlmIChpc0F1ZGlvKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2sgPSBzb3VyY2U7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrID0gc291cmNlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbmZvLm1Tb3VyY2UgPSBzb3VyY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBtVHJhY2tzLnB1c2goaW5mbyk7Ci0gICAgfQotCi0gICAgbVN0YXRlID0gQ09OTkVDVEVEOwotfQotCi12b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6Om9uU0RQTG9hZGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgc3RhdHVzX3QgZXJyOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmZXJyKSk7Ci0KLSAgICBtU0RQTG9hZGVyLmNsZWFyKCk7Ci0KLSAgICBpZiAobURpc2Nvbm5lY3RSZXBseUlEICE9IDApIHsKLSAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIHNwPEFTZXNzaW9uRGVzY3JpcHRpb24+IGRlc2M7Ci0gICAgICAgIHNwPFJlZkJhc2U+IG9iajsKLSAgICAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJkZXNjcmlwdGlvbiIsICZvYmopKTsKLSAgICAgICAgZGVzYyA9IHN0YXRpY19jYXN0PEFTZXNzaW9uRGVzY3JpcHRpb24gKj4ob2JqLmdldCgpKTsKLQotICAgICAgICBBU3RyaW5nIHJ0c3BVcmk7Ci0gICAgICAgIGlmICghZGVzYy0+ZmluZEF0dHJpYnV0ZSgwLCAiYT1jb250cm9sIiwgJnJ0c3BVcmkpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGZpbmQgdXJsIGluIFNEUCIpOwotICAgICAgICAgICAgZXJyID0gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXROb3RpZnksIHRoaXMpOwotCi0gICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBNeUhhbmRsZXIocnRzcFVyaS5jX3N0cigpLCBub3RpZnksIHRydWUgLyogdWlkVmFsaWQgKi8sIG1VSUQpOwotICAgICAgICAgICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1IYW5kbGVyKTsKLQotICAgICAgICAgICAgbUhhbmRsZXItPmxvYWRTRFAoZGVzYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVElORykgewotICAgICAgICAgICAgLy8gV2UncmUgc3RpbGwgaW4gdGhlIHByZXBhcmF0aW9uIHBoYXNlLCBzaWduYWwgdGhhdCBpdAotICAgICAgICAgICAgLy8gZmFpbGVkLgotICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWQoZXJyKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKLSAgICAgICAgc2V0RXJyb3IoZXJyKTsKLQotICAgICAgICBpZiAobURpc2Nvbm5lY3RSZXBseUlEICE9IDApIHsKLSAgICAgICAgICAgIGZpbmlzaERpc2Nvbm5lY3RJZlBvc3NpYmxlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6b25EaXNjb25uZWN0ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKLSAgICBpZiAobVN0YXRlID09IERJU0NPTk5FQ1RFRCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgZXJyOwotICAgIENIRUNLKG1zZy0+ZmluZEludDMyKCJyZXN1bHQiLCAmZXJyKSk7Ci0gICAgQ0hFQ0tfTkUoZXJyLCAoc3RhdHVzX3QpT0spOwotCi0gICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXItPmlkKCkpOwotICAgIG1IYW5kbGVyLmNsZWFyKCk7Ci0KLSAgICBpZiAobVN0YXRlID09IENPTk5FQ1RJTkcpIHsKLSAgICAgICAgLy8gV2UncmUgc3RpbGwgaW4gdGhlIHByZXBhcmF0aW9uIHBoYXNlLCBzaWduYWwgdGhhdCBpdAotICAgICAgICAvLyBmYWlsZWQuCi0gICAgICAgIG5vdGlmeVByZXBhcmVkKGVycik7Ci0gICAgfQotCi0gICAgbVN0YXRlID0gRElTQ09OTkVDVEVEOwotICAgIHNldEVycm9yKGVycik7Ci0KLSAgICBpZiAobURpc2Nvbm5lY3RSZXBseUlEICE9IDApIHsKLSAgICAgICAgZmluaXNoRGlzY29ubmVjdElmUG9zc2libGUoKTsKLSAgICB9Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6ZmluaXNoRGlzY29ubmVjdElmUG9zc2libGUoKSB7Ci0gICAgaWYgKG1TdGF0ZSAhPSBESVNDT05ORUNURUQpIHsKLSAgICAgICAgaWYgKG1IYW5kbGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1IYW5kbGVyLT5kaXNjb25uZWN0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobVNEUExvYWRlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtU0RQTG9hZGVyLT5jYW5jZWwoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtRGlzY29ubmVjdFJlcGx5SUQpOwotICAgIG1EaXNjb25uZWN0UmVwbHlJRCA9IDA7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6c2V0RXJyb3Ioc3RhdHVzX3QgZXJyKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1CdWZmZXJpbmdMb2NrKTsKLSAgICBtRmluYWxSZXN1bHQgPSBlcnI7Ci19Ci0KLXZvaWQgTnVQbGF5ZXIyOjpSVFNQU291cmNlMjo6c3RhcnRCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUJ1ZmZlcmluZ0xvY2spOwotCi0gICAgaWYgKCFtQnVmZmVyaW5nKSB7Ci0gICAgICAgIG1CdWZmZXJpbmcgPSB0cnVlOwotCi0gICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBkdXBOb3RpZnkoKTsKLSAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UGF1c2VPbkJ1ZmZlcmluZ1N0YXJ0KTsKLSAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0gICAgfQotfQotCi1ib29sIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OnN0b3BCdWZmZXJpbmdJZk5lY2Vzc2FyeSgpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUJ1ZmZlcmluZ0xvY2spOwotCi0gICAgaWYgKG1CdWZmZXJpbmcpIHsKLSAgICAgICAgaWYgKCFoYXZlU3VmZmljaWVudERhdGFPbkFsbFRyYWNrcygpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnVmZmVyaW5nID0gZmFsc2U7Ci0KLSAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOwotICAgICAgICBub3RpZnktPnNldEludDMyKCJ3aGF0Iiwga1doYXRSZXN1bWVPbkJ1ZmZlcmluZ0VuZCk7Ci0gICAgICAgIG5vdGlmeS0+cG9zdCgpOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIE51UGxheWVyMjo6UlRTUFNvdXJjZTI6OmZpbmlzaFNlZWsoc3RhdHVzX3QgZXJyKSB7Ci0gICAgaWYgKG1TZWVrUmVwbHlJRCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3A8QU1lc3NhZ2U+IHNlZWtSZXBseSA9IG5ldyBBTWVzc2FnZTsKLSAgICBzZWVrUmVwbHktPnNldEludDMyKCJlcnIiLCBlcnIpOwotICAgIHNlZWtSZXBseS0+cG9zdFJlcGx5KG1TZWVrUmVwbHlJRCk7Ci0gICAgbVNlZWtSZXBseUlEID0gTlVMTDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyMi9udXBsYXllcjIvUlRTUFNvdXJjZTIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzEyYzNlNS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcjIvbnVwbGF5ZXIyL1JUU1BTb3VyY2UyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBSVFNQX1NPVVJDRTJfSF8KLQotI2RlZmluZSBSVFNQX1NPVVJDRTJfSF8KLQotI2luY2x1ZGUgIk51UGxheWVyMlNvdXJjZS5oIgotCi0jaW5jbHVkZSAiQVRTUGFyc2VyLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFMb29wZXI7Ci1zdHJ1Y3QgQVJlcGx5VG9rZW47Ci1zdHJ1Y3QgQW5vdGhlclBhY2tldFNvdXJjZTsKLXN0cnVjdCBNeUhhbmRsZXI7Ci1zdHJ1Y3QgU0RQTG9hZGVyOwotCi1zdHJ1Y3QgTnVQbGF5ZXIyOjpSVFNQU291cmNlMiA6IHB1YmxpYyBOdVBsYXllcjI6OlNvdXJjZSB7Ci0gICAgUlRTUFNvdXJjZTIoCi0gICAgICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnVybCwKLSAgICAgICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICAgICAgdWlkX3QgdWlkID0gMCwKLSAgICAgICAgICAgIGJvb2wgaXNTRFAgPSBmYWxzZSk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlcmluZ1NldHRpbmdzKAotICAgICAgICAgICAgQnVmZmVyaW5nU2V0dGluZ3MqIGJ1ZmZlcmluZyAvKiBub25udWxsICovKSBvdmVycmlkZTsKLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJ1ZmZlcmluZ1NldHRpbmdzKGNvbnN0IEJ1ZmZlcmluZ1NldHRpbmdzJiBidWZmZXJpbmcpIG92ZXJyaWRlOwotCi0gICAgdmlydHVhbCB2b2lkIHByZXBhcmVBc3luYygpOwotICAgIHZpcnR1YWwgdm9pZCBzdGFydCgpOwotICAgIHZpcnR1YWwgdm9pZCBzdG9wKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGZlZWRNb3JlVFNEYXRhKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGRlcXVldWVBY2Nlc3NVbml0KGJvb2wgYXVkaW8sIHNwPEFCdWZmZXI+ICphY2Nlc3NVbml0KTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25Vcyk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzZWVrVG8oCi0gICAgICAgICAgICBpbnQ2NF90IHNlZWtUaW1lVXMsCi0gICAgICAgICAgICBNZWRpYVBsYXllcjJTZWVrTW9kZSBtb2RlID0gTWVkaWFQbGF5ZXIyU2Vla01vZGU6OlNFRUtfUFJFVklPVVNfU1lOQykgb3ZlcnJpZGU7Ci0KLSAgICB2b2lkIG9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgflJUU1BTb3VyY2UyKCk7Ci0KLSAgICB2aXJ0dWFsIHNwPE1ldGFEYXRhPiBnZXRGb3JtYXRNZXRhKGJvb2wgYXVkaW8pOwotCi1wcml2YXRlOgotICAgIGVudW0gewotICAgICAgICBrV2hhdE5vdGlmeSAgICAgICAgICA9ICdub3RpJywKLSAgICAgICAga1doYXREaXNjb25uZWN0ICAgICAgPSAnZGlzYycsCi0gICAgICAgIGtXaGF0UGVyZm9ybVNlZWsgICAgID0gJ3NlZWsnLAotICAgICAgICBrV2hhdFBvbGxCdWZmZXJpbmcgICA9ICdwb2xsJywKLSAgICAgICAga1doYXRTaWduYWxFT1MgICAgICAgPSAnZW9zICcsCi0gICAgfTsKLQotICAgIGVudW0gU3RhdGUgewotICAgICAgICBESVNDT05ORUNURUQsCi0gICAgICAgIENPTk5FQ1RJTkcsCi0gICAgICAgIENPTk5FQ1RFRCwKLSAgICAgICAgU0VFS0lORywKLSAgICB9OwotCi0gICAgZW51bSBGbGFncyB7Ci0gICAgICAgIC8vIERvbid0IGxvZyBhbnkgVVJMcy4KLSAgICAgICAga0ZsYWdJbmNvZ25pdG8gPSAxLAotICAgIH07Ci0KLSAgICBzdHJ1Y3QgVHJhY2tJbmZvIHsKLSAgICAgICAgc3A8QW5vdGhlclBhY2tldFNvdXJjZT4gbVNvdXJjZTsKLQotICAgICAgICBpbnQzMl90IG1UaW1lU2NhbGU7Ci0gICAgICAgIHVpbnQzMl90IG1SVFBUaW1lOwotICAgICAgICBpbnQ2NF90IG1Ob3JtYWxQbGF5dGltZVVzOwotICAgICAgICBib29sIG1OUFRNYXBwaW5nVmFsaWQ7Ci0gICAgfTsKLQotICAgIHNwPE1lZGlhSFRUUFNlcnZpY2U+IG1IVFRQU2VydmljZTsKLSAgICBBU3RyaW5nIG1VUkw7Ci0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUV4dHJhSGVhZGVyczsKLSAgICB1aWRfdCBtVUlEOwotICAgIHVpbnQzMl90IG1GbGFnczsKLSAgICBib29sIG1Jc1NEUDsKLSAgICBTdGF0ZSBtU3RhdGU7Ci0gICAgc3RhdHVzX3QgbUZpbmFsUmVzdWx0OwotICAgIHNwPEFSZXBseVRva2VuPiBtRGlzY29ubmVjdFJlcGx5SUQ7Ci0gICAgTXV0ZXggbUJ1ZmZlcmluZ0xvY2s7Ci0gICAgYm9vbCBtQnVmZmVyaW5nOwotICAgIGJvb2wgbUluUHJlcGFyYXRpb25QaGFzZTsKLSAgICBib29sIG1FT1NQZW5kaW5nOwotCi0gICAgTXV0ZXggbUJ1ZmZlcmluZ1NldHRpbmdzTG9jazsKLSAgICBCdWZmZXJpbmdTZXR0aW5ncyBtQnVmZmVyaW5nU2V0dGluZ3M7Ci0KLSAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwotICAgIHNwPE15SGFuZGxlcj4gbUhhbmRsZXI7Ci0gICAgc3A8U0RQTG9hZGVyPiBtU0RQTG9hZGVyOwotCi0gICAgVmVjdG9yPFRyYWNrSW5mbz4gbVRyYWNrczsKLSAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtQXVkaW9UcmFjazsKLSAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBtVmlkZW9UcmFjazsKLQotICAgIHNwPEFUU1BhcnNlcj4gbVRTUGFyc2VyOwotCi0gICAgaW50MzJfdCBtU2Vla0dlbmVyYXRpb247Ci0KLSAgICBpbnQ2NF90IG1FT1NUaW1lb3V0QXVkaW87Ci0gICAgaW50NjRfdCBtRU9TVGltZW91dFZpZGVvOwotCi0gICAgc3A8QVJlcGx5VG9rZW4+IG1TZWVrUmVwbHlJRDsKLQotICAgIHNwPEFub3RoZXJQYWNrZXRTb3VyY2U+IGdldFNvdXJjZShib29sIGF1ZGlvKTsKLQotICAgIHZvaWQgb25Db25uZWN0ZWQoKTsKLSAgICB2b2lkIG9uU0RQTG9hZGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2b2lkIG9uRGlzY29ubmVjdGVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLSAgICB2b2lkIGZpbmlzaERpc2Nvbm5lY3RJZlBvc3NpYmxlKCk7Ci0KLSAgICB2b2lkIHBlcmZvcm1TZWVrKGludDY0X3Qgc2Vla1RpbWVVcyk7Ci0gICAgdm9pZCBzY2hlZHVsZVBvbGxCdWZmZXJpbmcoKTsKLSAgICB2b2lkIGNoZWNrQnVmZmVyaW5nKAotICAgICAgICAgICAgYm9vbCAqcHJlcGFyZWQsCi0gICAgICAgICAgICBib29sICp1bmRlcmZsb3csCi0gICAgICAgICAgICBib29sICpvdmVyZmxvdywKLSAgICAgICAgICAgIGJvb2wgKnN0YXJ0U2VydmVyLAotICAgICAgICAgICAgYm9vbCAqZmluaXNoZWQpOwotICAgIHZvaWQgb25Qb2xsQnVmZmVyaW5nKCk7Ci0KLSAgICBib29sIGhhdmVTdWZmaWNpZW50RGF0YU9uQWxsVHJhY2tzKCk7Ci0KLSAgICB2b2lkIHNldEVPU1RpbWVvdXQoYm9vbCBhdWRpbywgaW50NjRfdCB0aW1lb3V0KTsKLSAgICB2b2lkIHNldEVycm9yKHN0YXR1c190IGVycik7Ci0gICAgdm9pZCBzdGFydEJ1ZmZlcmluZ0lmTmVjZXNzYXJ5KCk7Ci0gICAgYm9vbCBzdG9wQnVmZmVyaW5nSWZOZWNlc3NhcnkoKTsKLSAgICB2b2lkIGZpbmlzaFNlZWsoc3RhdHVzX3QgZXJyKTsKLQotICAgIHZvaWQgcG9zdFNvdXJjZUVPU0lmTmVjZXNzYXJ5KCk7Ci0gICAgdm9pZCBzaWduYWxTb3VyY2VFT1Moc3RhdHVzX3QgcmVzdWx0KTsKLSAgICB2b2lkIG9uU2lnbmFsRU9TKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLQotICAgIGJvb2wgc291cmNlTmVhckVPUyhib29sIGF1ZGlvKTsKLSAgICBib29sIHNvdXJjZVJlYWNoZWRFT1MoYm9vbCBhdWRpbyk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSVFNQU291cmNlMik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFJUU1BfU09VUkNFMl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icAppbmRleCA3NDIzNmNiLi41MzAxZjVjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvQW5kcm9pZC5icApAQCAtMiwzMyArMiw0MCBAQAogCiAgICAgc3JjczogWwogICAgICAgICAiQWN0aXZpdHlNYW5hZ2VyLmNwcCIsCisgICAgICAgICJEZWF0aE5vdGlmaWVyLmNwcCIsCiAgICAgICAgICJNZWRpYVBsYXllckZhY3RvcnkuY3BwIiwKICAgICAgICAgIk1lZGlhUGxheWVyU2VydmljZS5jcHAiLAogICAgICAgICAiTWVkaWFSZWNvcmRlckNsaWVudC5jcHAiLAogICAgICAgICAiTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwIiwKKyAgICAgICAgIlN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwIiwKICAgICAgICAgIlN0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwIiwKICAgICAgICAgIlRlc3RQbGF5ZXJTdHViLmNwcCIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLm9teEAxLjAiLAorICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJhdWRpb2NsaWVudCIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCisgICAgICAgICJsaWJjb2RlYzJfY2xpZW50IiwKICAgICAgICAgImxpYmNyeXB0byIsCiAgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZGF0YXNvdXJjZSIsCiAgICAgICAgICJsaWJkbCIsCisgICAgICAgICJsaWJkcm1mcmFtZXdvcmsiLAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKLSAgICAgICAgImxpYmhpZGxtZW1vcnkiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYm1lZGlhX2NvZGVjbGlzdCIsCiAgICAgICAgICJsaWJtZWRpYV9vbXgiLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlibWVkaWFkcm0iLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAogICAgICAgICAibGlibWVtdW5yZWFjaGFibGUiLAorICAgICAgICAibGlibmV0ZF9jbGllbnQiLAogICAgICAgICAibGlicG93ZXJtYW5hZ2VyIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLApAQCAtNDEsNiArNDgsNyBAQAogICAgIF0sCiAKICAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlicGxheWVyc2VydmljZV9kYXRhc291cmNlIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X251cGxheWVyIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3J0c3AiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKQEAgLTYzLDEzICs3MSw5IEBACiAKICAgICBuYW1lOiAibGlibWVkaWFwbGF5ZXJzZXJ2aWNlIiwKIAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCi0KICAgICBzYW5pdGl6ZTogewogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKIAogfQogCi1zdWJkaXJzID0gWyIqIl0KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RlYXRoTm90aWZpZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RlYXRoTm90aWZpZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxM2JkZjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvRGVhdGhOb3RpZmllci5jcHAKQEAgLTAsMCArMSw4MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYVBsYXllclNlcnZpY2UtRGVhdGhOb3RpZmllciIKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSAiRGVhdGhOb3RpZmllci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIERlYXRoTm90aWZpZXI6OkRlYXRoUmVjaXBpZW50IDoKKyAgICAgICAgcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50LAorICAgICAgICBwdWJsaWMgaGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50IHsKK3B1YmxpYzoKKyAgICB1c2luZyBOb3RpZnkgPSBEZWF0aE5vdGlmaWVyOjpOb3RpZnk7CisKKyAgICBEZWF0aFJlY2lwaWVudChOb3RpZnkgY29uc3QmIG5vdGlmeSk6IG1Ob3RpZnl7bm90aWZ5fSB7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQod3A8SUJpbmRlcj4gY29uc3QmKSBvdmVycmlkZSB7CisgICAgICAgIG1Ob3RpZnkoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQodWludDY0X3QsIHdwPEhCYXNlPiBjb25zdCYpIG92ZXJyaWRlIHsKKyAgICAgICAgbU5vdGlmeSgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBOb3RpZnkgbU5vdGlmeTsKK307CisKK0RlYXRoTm90aWZpZXI6OkRlYXRoTm90aWZpZXIoc3A8SUJpbmRlcj4gY29uc3QmIHNlcnZpY2UsIE5vdGlmeSBjb25zdCYgbm90aWZ5KQorICAgICAgOiBtU2VydmljZXtzdGQ6OmluX3BsYWNlX2luZGV4PDE+LCBzZXJ2aWNlfSwKKyAgICAgICAgbURlYXRoUmVjaXBpZW50e25ldyBEZWF0aFJlY2lwaWVudChub3RpZnkpfSB7CisgICAgc2VydmljZS0+bGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50KTsKK30KKworRGVhdGhOb3RpZmllcjo6RGVhdGhOb3RpZmllcihzcDxIQmFzZT4gY29uc3QmIHNlcnZpY2UsIE5vdGlmeSBjb25zdCYgbm90aWZ5KQorICAgICAgOiBtU2VydmljZXtzdGQ6OmluX3BsYWNlX2luZGV4PDI+LCBzZXJ2aWNlfSwKKyAgICAgICAgbURlYXRoUmVjaXBpZW50e25ldyBEZWF0aFJlY2lwaWVudChub3RpZnkpfSB7CisgICAgc2VydmljZS0+bGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50LCAwKTsKK30KKworRGVhdGhOb3RpZmllcjo6RGVhdGhOb3RpZmllcihEZWF0aE5vdGlmaWVyJiYgb3RoZXIpCisgICAgICA6IG1TZXJ2aWNle290aGVyLm1TZXJ2aWNlfSwgbURlYXRoUmVjaXBpZW50e290aGVyLm1EZWF0aFJlY2lwaWVudH0geworICAgIG90aGVyLm1TZXJ2aWNlLmVtcGxhY2U8MD4oKTsKKyAgICBvdGhlci5tRGVhdGhSZWNpcGllbnQgPSBudWxscHRyOworfQorCitEZWF0aE5vdGlmaWVyOjp+RGVhdGhOb3RpZmllcigpIHsKKyAgICBzd2l0Y2ggKG1TZXJ2aWNlLmluZGV4KCkpIHsKKyAgICBjYXNlIDA6CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMToKKyAgICAgICAgc3RkOjpnZXQ8MT4obVNlcnZpY2UpLT51bmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgICAgc3RkOjpnZXQ8Mj4obVNlcnZpY2UpLT51bmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIENIRUNLKGZhbHNlKSA8PCAiQ29ycnVwdGVkIHNlcnZpY2UgdHlwZSBkdXJpbmcgZGVzdHJ1Y3Rpb24uIjsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RlYXRoTm90aWZpZXIuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9EZWF0aE5vdGlmaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2JjMjYxMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9EZWF0aE5vdGlmaWVyLmgKQEAgLTAsMCArMSw0OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBU0VSVklDRV9ERUFUSE5PVElGSUVSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQVNFUlZJQ0VfREVBVEhOT1RJRklFUl9ICisKKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvYmFzZS8xLjAvSUJhc2UuaD4KKyNpbmNsdWRlIDxiaW5kZXIvQmluZGVyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorCisjaW5jbHVkZSA8dmFyaWFudD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBEZWF0aE5vdGlmaWVyIHsKK3B1YmxpYzoKKyAgICB1c2luZyBIQmFzZSA9IGhpZGw6OmJhc2U6OlYxXzA6OklCYXNlOworICAgIHVzaW5nIE5vdGlmeSA9IHN0ZDo6ZnVuY3Rpb248dm9pZCgpPjsKKworICAgIERlYXRoTm90aWZpZXIoc3A8SUJpbmRlcj4gY29uc3QmIHNlcnZpY2UsIE5vdGlmeSBjb25zdCYgbm90aWZ5KTsKKyAgICBEZWF0aE5vdGlmaWVyKHNwPEhCYXNlPiBjb25zdCYgc2VydmljZSwgTm90aWZ5IGNvbnN0JiBub3RpZnkpOworICAgIERlYXRoTm90aWZpZXIoRGVhdGhOb3RpZmllciYmIG90aGVyKTsKKyAgICB+RGVhdGhOb3RpZmllcigpOworCitwcml2YXRlOgorICAgIHN0ZDo6dmFyaWFudDxzdGQ6Om1vbm9zdGF0ZSwgc3A8SUJpbmRlcj4sIHNwPEhCYXNlPj4gbVNlcnZpY2U7CisKKyAgICBjbGFzcyBEZWF0aFJlY2lwaWVudDsKKyAgICBzcDxEZWF0aFJlY2lwaWVudD4gbURlYXRoUmVjaXBpZW50OworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9NRURJQVNFUlZJQ0VfREVBVEhOT1RJRklFUl9ICisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9EZWF0aFJlY2lwaWVudC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL0RlYXRoUmVjaXBpZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY1YWU1YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9EZWF0aFJlY2lwaWVudC5oCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQVNFUlZJQ0VfREVBVEhSRUNJUElFTlRfSAorI2RlZmluZSBBTkRST0lEX01FRElBU0VSVklDRV9ERUFUSFJFQ0lQSUVOVF9ICisKKyNpbmNsdWRlIDxiaW5kZXIvYmluZGVyLmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsU3VwcG9ydC5oPgorCisjaW5jbHVkZSA8dmFyaWFudD4KKworY2xhc3MgRGVhdGhOb3RpZmllciA6CisgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwKKyAgICAgICAgcHVibGljIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50IHsKK3B1YmxpYzoKKyAgICB1c2luZyBTZXJ2aWNlID0gc3RkOjp2YXJpYW50PAorICAgICAgICAgICAgc3A8SUJpbmRlcj4gY29uc3QmLAorICAgICAgICAgICAgc3A8YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+IGNvbnN0Jj47CisKKyAgICBEZWF0aE5vdGlmaWVyKHN0ZDo6dmFyaWFudDxzcDxJQmluZGVyPiBjb25zdCYsIAorICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIHNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBzcDxNZWRpYVBsYXllckJhc2U+JiBsaXN0ZW5lciwKKyAgICAgICAgICAgIGludCB3aGljaCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKKyAgICBEZWF0aE5vdGlmaWVyKAorICAgICAgICAgICAgY29uc3Qgc3A8YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiBoU2VydmljZSwKKyAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZT4mIGxpc3RlbmVyLAorICAgICAgICAgICAgaW50IHdoaWNoLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpOworICAgIHZpcnR1YWwgfkRlYXRoTm90aWZpZXIoKSA9IGRlZmF1bHQ7CisgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CisgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKAorICAgICAgICAgICAgdWludDY0X3QgY29va2llLAorICAgICAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIHdobyk7CisgICAgdm9pZCB1bmxpbmtUb0RlYXRoKCk7CisKK3ByaXZhdGU6CisgICAgc3A8SUJpbmRlcj4gbVNlcnZpY2U7CisgICAgc3A8YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+IG1IU2VydmljZTsgLy8gSElETCBzZXJ2aWNlCisgICAgd3A8TWVkaWFQbGF5ZXJCYXNlPiBtTGlzdGVuZXI7CisgICAgaW50IG1XaGljaDsKKyAgICBzdGQ6OnN0cmluZyBtTmFtZTsKK307CisKKyNlbmRpZiAvLyBBTkRST0lEX01FRElBU0VSVklDRV9ERUFUSFJFQ0lQSUVOVF9ICisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllckZhY3RvcnkuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAKaW5kZXggMTM3NmNjYy4uMDVmNzM2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyRmFjdG9yeS5jcHAKQEAgLTIwLDkgKzIwLDkgQEAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9GaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKaW5kZXggOTZmNzllMC4uNDZjMTMwZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5jcHAKQEAgLTM0LDYgKzM0LDggQEAKIAogI2luY2x1ZGUgPHV0aWxzL21pc2MuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudFN0b3JlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgpAQCAtNDUsNyArNDcsOCBAQAogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxkYXRhc291cmNlL0hUVFBCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JUmVtb3RlRGlzcGxheS5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Q2xpZW50Lmg+CkBAIC01OSw2ICs2Miw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRm91bmRhdGlvblV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXJSb3N0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaD4KQEAgLTc4LDcgKzgyLDYgQEAKICNpbmNsdWRlICJUZXN0UGxheWVyU3R1Yi5oIgogI2luY2x1ZGUgIm51cGxheWVyL051UGxheWVyRHJpdmVyLmgiCiAKLSNpbmNsdWRlICJIVFRQQmFzZS5oIgogCiBzdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1JldHJpZXMgPSA1MDsKIHN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrU2xlZXBVcyA9IDIwMDAwOwpAQCAtNTkwLDcgKzU5Myw2IEBACiAgICAgaWYgKG1BdWRpb0F0dHJpYnV0ZXMgIT0gTlVMTCkgewogICAgICAgICBmcmVlKG1BdWRpb0F0dHJpYnV0ZXMpOwogICAgIH0KLSAgICBjbGVhckRlYXRoTm90aWZpZXJzX2woKTsKICAgICBtQXVkaW9EZXZpY2VVcGRhdGVkTGlzdGVuZXIuY2xlYXIoKTsKIH0KIApAQCAtNjQ2LDU5ICs2NDgsNiBAQAogICAgIHJldHVybiBwOwogfQogCi1NZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6U2VydmljZURlYXRoTm90aWZpZXI6OlNlcnZpY2VEZWF0aE5vdGlmaWVyKAotICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgc2VydmljZSwKLSAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlPiYgbGlzdGVuZXIsCi0gICAgICAgIGludCB3aGljaCkgewotICAgIG1TZXJ2aWNlID0gc2VydmljZTsKLSAgICBtT214ID0gbnVsbHB0cjsKLSAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICBtV2hpY2ggPSB3aGljaDsKLX0KLQotTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OlNlcnZpY2VEZWF0aE5vdGlmaWVyOjpTZXJ2aWNlRGVhdGhOb3RpZmllcigKLSAgICAgICAgY29uc3Qgc3A8SU9teD4mIG9teCwKLSAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlPiYgbGlzdGVuZXIsCi0gICAgICAgIGludCB3aGljaCkgewotICAgIG1TZXJ2aWNlID0gbnVsbHB0cjsKLSAgICBtT214ID0gb214OwotICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIG1XaGljaCA9IHdoaWNoOwotfQotCi1NZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6U2VydmljZURlYXRoTm90aWZpZXI6On5TZXJ2aWNlRGVhdGhOb3RpZmllcigpIHsKLX0KLQotdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6U2VydmljZURlYXRoTm90aWZpZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIC8qd2hvKi8pIHsKLSAgICBzcDxNZWRpYVBsYXllckJhc2U+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKLSAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICBsaXN0ZW5lci0+c2VuZEV2ZW50KE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9TRVJWRVJfRElFRCwgbVdoaWNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygibGlzdGVuZXIgZm9yIHByb2Nlc3MgJWQgZGVhdGggaXMgZ29uZSIsIG1XaGljaCk7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpTZXJ2aWNlRGVhdGhOb3RpZmllcjo6c2VydmljZURpZWQoCi0gICAgICAgIHVpbnQ2NF90IC8qIGNvb2tpZSAqLywKLSAgICAgICAgY29uc3Qgd3A8OjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIC8qIHdobyAqLykgewotICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOwotICAgIGlmIChsaXN0ZW5lciAhPSBOVUxMKSB7Ci0gICAgICAgIGxpc3RlbmVyLT5zZW5kRXZlbnQoTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1NFUlZFUl9ESUVELCBtV2hpY2gpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJsaXN0ZW5lciBmb3IgcHJvY2VzcyAlZCBkZWF0aCBpcyBnb25lIiwgbVdoaWNoKTsKLSAgICB9Ci19Ci0KLXZvaWQgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDbGllbnQ6OlNlcnZpY2VEZWF0aE5vdGlmaWVyOjp1bmxpbmtUb0RlYXRoKCkgewotICAgIGlmIChtU2VydmljZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIG1TZXJ2aWNlLT51bmxpbmtUb0RlYXRoKHRoaXMpOwotICAgICAgICBtU2VydmljZSA9IG51bGxwdHI7Ci0gICAgfSBlbHNlIGlmIChtT214ICE9IG51bGxwdHIpIHsKLSAgICAgICAgbU9teC0+dW5saW5rVG9EZWF0aCh0aGlzKTsKLSAgICAgICAgbU9teCA9IG51bGxwdHI7Ci0gICAgfQotfQotCiB2b2lkIE1lZGlhUGxheWVyU2VydmljZTo6Q2xpZW50OjpBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcjo6b25BdWRpb0RldmljZVVwZGF0ZSgKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYXVkaW9JbywKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCkgewpAQCAtNzEwLDE3ICs2NTksNiBAQAogICAgIH0KIH0KIAotdm9pZCBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6Y2xlYXJEZWF0aE5vdGlmaWVyc19sKCkgewotICAgIGlmIChtRXh0cmFjdG9yRGVhdGhMaXN0ZW5lciAhPSBudWxscHRyKSB7Ci0gICAgICAgIG1FeHRyYWN0b3JEZWF0aExpc3RlbmVyLT51bmxpbmtUb0RlYXRoKCk7Ci0gICAgICAgIG1FeHRyYWN0b3JEZWF0aExpc3RlbmVyID0gbnVsbHB0cjsKLSAgICB9Ci0gICAgaWYgKG1Db2RlY0RlYXRoTGlzdGVuZXIgIT0gbnVsbHB0cikgewotICAgICAgICBtQ29kZWNEZWF0aExpc3RlbmVyLT51bmxpbmtUb0RlYXRoKCk7Ci0gICAgICAgIG1Db2RlY0RlYXRoTGlzdGVuZXIgPSBudWxscHRyOwotICAgIH0KLX0KLQogc3A8TWVkaWFQbGF5ZXJCYXNlPiBNZWRpYVBsYXllclNlcnZpY2U6OkNsaWVudDo6c2V0RGF0YVNvdXJjZV9wcmUoCiAgICAgICAgIHBsYXllcl90eXBlIHBsYXllclR5cGUpCiB7CkBAIC03MzIsMzAgKzY3MCw4MyBAQAogICAgICAgICByZXR1cm4gcDsKICAgICB9CiAKKyAgICBzdGQ6OnZlY3RvcjxEZWF0aE5vdGlmaWVyPiBkZWF0aE5vdGlmaWVyczsKKworICAgIC8vIExpc3RlbiB0byBkZWF0aCBvZiBtZWRpYS5leHRyYWN0b3Igc2VydmljZQogICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBzbS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEuZXh0cmFjdG9yIikpOwogICAgIGlmIChiaW5kZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiZXh0cmFjdG9yIHNlcnZpY2Ugbm90IGF2YWlsYWJsZSIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgc3A8U2VydmljZURlYXRoTm90aWZpZXI+IGV4dHJhY3RvckRlYXRoTGlzdGVuZXIgPQotICAgICAgICAgICAgbmV3IFNlcnZpY2VEZWF0aE5vdGlmaWVyKGJpbmRlciwgcCwgTUVESUFFWFRSQUNUT1JfUFJPQ0VTU19ERUFUSCk7Ci0gICAgYmluZGVyLT5saW5rVG9EZWF0aChleHRyYWN0b3JEZWF0aExpc3RlbmVyKTsKKyAgICBkZWF0aE5vdGlmaWVycy5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICBiaW5kZXIsIFtsID0gd3A8TWVkaWFQbGF5ZXJCYXNlPihwKV0oKSB7CisgICAgICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gbGlzdGVuZXIgPSBsLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICBBTE9HSSgibWVkaWEuZXh0cmFjdG9yIGRpZWQuIFNlbmRpbmcgZGVhdGggbm90aWZpY2F0aW9uLiIpOworICAgICAgICAgICAgbGlzdGVuZXItPnNlbmRFdmVudChNRURJQV9FUlJPUiwgTUVESUFfRVJST1JfU0VSVkVSX0RJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBRVhUUkFDVE9SX1BST0NFU1NfREVBVEgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIm1lZGlhLmV4dHJhY3RvciBkaWVkIHdpdGhvdXQgYSBkZWF0aCBoYW5kbGVyLiIpOworICAgICAgICB9CisgICAgfSk7CiAKLSAgICBzcDxJT214PiBvbXggPSBJT214OjpnZXRTZXJ2aWNlKCk7Ci0gICAgaWYgKG9teCA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJJT214IHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSIpOwotICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB7CisgICAgICAgIHVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U7CisKKyAgICAgICAgLy8gTGlzdGVuIHRvIGRlYXRoIG9mIE9NWCBzZXJ2aWNlCisgICAgICAgIHsKKyAgICAgICAgICAgIHNwPElCYXNlPiBiYXNlID0gOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6CisgICAgICAgICAgICAgICAgICAgIElPbXg6OmdldFNlcnZpY2UoKTsKKyAgICAgICAgICAgIGlmIChiYXNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiT01YIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBkZWF0aE5vdGlmaWVycy5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLCBbbCA9IHdwPE1lZGlhUGxheWVyQmFzZT4ocCldKCkgeworICAgICAgICAgICAgICAgICAgICBzcDxNZWRpYVBsYXllckJhc2U+IGxpc3RlbmVyID0gbC5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0koIk9NWCBzZXJ2aWNlIGRpZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZW5kaW5nIGRlYXRoIG5vdGlmaWNhdGlvbi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5zZW5kRXZlbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9TRVJWRVJfRElFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFDT0RFQ19QUk9DRVNTX0RFQVRIKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJPTVggc2VydmljZSBkaWVkIHdpdGhvdXQgYSBkZWF0aCBoYW5kbGVyLiIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBMaXN0ZW4gdG8gZGVhdGggb2YgQ29kZWMyIHNlcnZpY2VzCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gY29uc3QmIGNsaWVudCA6CisgICAgICAgICAgICAgICAgICAgIENvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbUFsbFNlcnZpY2VzKCkpIHsKKyAgICAgICAgICAgICAgICBzcDxJQmFzZT4gYmFzZSA9IGNsaWVudC0+Z2V0QmFzZSgpOworICAgICAgICAgICAgICAgIGRlYXRoTm90aWZpZXJzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsIFtsID0gd3A8TWVkaWFQbGF5ZXJCYXNlPihwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gc3RkOjpzdHJpbmcoY2xpZW50LT5nZXRTZXJ2aWNlTmFtZSgpKV0oKSB7CisgICAgICAgICAgICAgICAgICAgIHNwPE1lZGlhUGxheWVyQmFzZT4gbGlzdGVuZXIgPSBsLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiQ29kZWMyIHNlcnZpY2UgXCIlc1wiIGRpZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZW5kaW5nIGRlYXRoIG5vdGlmaWNhdGlvbi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5zZW5kRXZlbnQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9TRVJWRVJfRElFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFDT0RFQ19QUk9DRVNTX0RFQVRIKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJDb2RlYzIgc2VydmljZSBcIiVzXCIgZGllZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aG91dCBhIGRlYXRoIGhhbmRsZXIuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KLSAgICBzcDxTZXJ2aWNlRGVhdGhOb3RpZmllcj4gY29kZWNEZWF0aExpc3RlbmVyID0KLSAgICAgICAgICAgIG5ldyBTZXJ2aWNlRGVhdGhOb3RpZmllcihvbXgsIHAsIE1FRElBQ09ERUNfUFJPQ0VTU19ERUFUSCk7Ci0gICAgb214LT5saW5rVG9EZWF0aChjb2RlY0RlYXRoTGlzdGVuZXIsIDApOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogCi0gICAgY2xlYXJEZWF0aE5vdGlmaWVyc19sKCk7Ci0gICAgbUV4dHJhY3RvckRlYXRoTGlzdGVuZXIgPSBleHRyYWN0b3JEZWF0aExpc3RlbmVyOwotICAgIG1Db2RlY0RlYXRoTGlzdGVuZXIgPSBjb2RlY0RlYXRoTGlzdGVuZXI7CisgICAgbURlYXRoTm90aWZpZXJzLmNsZWFyKCk7CisgICAgbURlYXRoTm90aWZpZXJzLnN3YXAoZGVhdGhOb3RpZmllcnMpOwogICAgIG1BdWRpb0RldmljZVVwZGF0ZWRMaXN0ZW5lciA9IG5ldyBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcihwKTsKIAogICAgIGlmICghcC0+aGFyZHdhcmVPdXRwdXQoKSkgewpAQCAtMTYyNyw3ICsxNjE4LDcgQEAKICAgICAgICAgbUF0dHJpYnV0ZXMgPSAoYXVkaW9fYXR0cmlidXRlc190ICopIGNhbGxvYygxLCBzaXplb2YoYXVkaW9fYXR0cmlidXRlc190KSk7CiAgICAgICAgIGlmIChtQXR0cmlidXRlcyAhPSBOVUxMKSB7CiAgICAgICAgICAgICBtZW1jcHkobUF0dHJpYnV0ZXMsIGF0dHIsIHNpemVvZihhdWRpb19hdHRyaWJ1dGVzX3QpKTsKLSAgICAgICAgICAgIG1TdHJlYW1UeXBlID0gYXVkaW9fYXR0cmlidXRlc190b19zdHJlYW1fdHlwZShhdHRyKTsKKyAgICAgICAgICAgIG1TdHJlYW1UeXBlID0gQXVkaW9TeXN0ZW06OmF0dHJpYnV0ZXNUb1N0cmVhbVR5cGUoKmF0dHIpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgICAgbUF0dHJpYnV0ZXMgPSBOVUxMOwpAQCAtMTgxNiw3ICsxODA3LDcgQEAKICAgICAgICAgICAgIG1BdHRyaWJ1dGVzID0gKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqKSBjYWxsb2MoMSwgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwogICAgICAgICB9CiAgICAgICAgIG1lbWNweShtQXR0cmlidXRlcywgYXR0cmlidXRlcywgc2l6ZW9mKGF1ZGlvX2F0dHJpYnV0ZXNfdCkpOwotICAgICAgICBtU3RyZWFtVHlwZSA9IGF1ZGlvX2F0dHJpYnV0ZXNfdG9fc3RyZWFtX3R5cGUoYXR0cmlidXRlcyk7CisgICAgICAgIG1TdHJlYW1UeXBlID0gQXVkaW9TeXN0ZW06OmF0dHJpYnV0ZXNUb1N0cmVhbVR5cGUoKmF0dHJpYnV0ZXMpOwogICAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUGxheWVyU2VydmljZS5oCmluZGV4IGJmYjdjYzIuLjI1NjJiOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVBsYXllclNlcnZpY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFQbGF5ZXJTZXJ2aWNlLmgKQEAgLTI2LDExICsyNiwxMSBAQAogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZXRhZGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KIApAQCAtMzksMTAgKzM5LDEwIEBACiBzdHJ1Y3QgQXVkaW9QbGF5YmFja1JhdGU7CiBjbGFzcyBBdWRpb1RyYWNrOwogc3RydWN0IEFWU3luY1NldHRpbmdzOworY2xhc3MgRGVhdGhOb3RpZmllcjsKIGNsYXNzIElEYXRhU291cmNlOwogY2xhc3MgSU1lZGlhUmVjb3JkZXI7CiBjbGFzcyBJTWVkaWFNZXRhZGF0YVJldHJpZXZlcjsKLWNsYXNzIElPTVg7CiBjbGFzcyBJUmVtb3RlRGlzcGxheTsKIGNsYXNzIElSZW1vdGVEaXNwbGF5Q2xpZW50OwogY2xhc3MgTWVkaWFSZWNvcmRlckNsaWVudDsKQEAgLTcwLDcgKzcwLDYgQEAKIGNsYXNzIE1lZGlhUGxheWVyU2VydmljZSA6IHB1YmxpYyBCbk1lZGlhUGxheWVyU2VydmljZQogewogICAgIGNsYXNzIENsaWVudDsKLSAgICB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OklPbXggSU9teDsKIAogICAgIGNsYXNzIEF1ZGlvT3V0cHV0IDogcHVibGljIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rCiAgICAgewpAQCAtMzkwLDMzICszODksNiBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKIAogICAgIHByaXZhdGU6Ci0gICAgICAgIGNsYXNzIFNlcnZpY2VEZWF0aE5vdGlmaWVyOgotICAgICAgICAgICAgICAgIHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCwKLSAgICAgICAgICAgICAgICBwdWJsaWMgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQKLSAgICAgICAgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBTZXJ2aWNlRGVhdGhOb3RpZmllcigKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcj4mIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZT4mIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICBpbnQgd2hpY2gpOwotICAgICAgICAgICAgU2VydmljZURlYXRoTm90aWZpZXIoCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElPbXg+JiBvbXgsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPE1lZGlhUGxheWVyQmFzZT4mIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgICAgICBpbnQgd2hpY2gpOwotICAgICAgICAgICAgdmlydHVhbCB+U2VydmljZURlYXRoTm90aWZpZXIoKTsKLSAgICAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8pOwotICAgICAgICAgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKAotICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBjb29raWUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2U+JiB3aG8pOwotICAgICAgICAgICAgdm9pZCB1bmxpbmtUb0RlYXRoKCk7Ci0KLSAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICAgIGludCBtV2hpY2g7Ci0gICAgICAgICAgICBzcDxJQmluZGVyPiBtU2VydmljZTsKLSAgICAgICAgICAgIHNwPElPbXg+IG1PbXg7Ci0gICAgICAgICAgICB3cDxNZWRpYVBsYXllckJhc2U+IG1MaXN0ZW5lcjsKLSAgICAgICAgfTsKLQogICAgICAgICBjbGFzcyBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcjogcHVibGljIEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrCiAgICAgICAgIHsKICAgICAgICAgcHVibGljOgpAQCAtNDMyLDggKzQwNCw2IEBACiAgICAgICAgICAgICB3cDxNZWRpYVBsYXllckJhc2U+IG1MaXN0ZW5lcjsKICAgICAgICAgfTsKIAotICAgICAgICB2b2lkIGNsZWFyRGVhdGhOb3RpZmllcnNfbCgpOwotCiAgICAgICAgIGZyaWVuZCBjbGFzcyBNZWRpYVBsYXllclNlcnZpY2U7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsaWVudCggY29uc3Qgc3A8TWVkaWFQbGF5ZXJTZXJ2aWNlPiYgc2VydmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQsCkBAIC01MDgsOCArNDc4LDcgQEAKICAgICAgICAgLy8gZ2V0TWV0YWRhdGEgY2xlYXJzIHRoaXMgc2V0LgogICAgICAgICBtZWRpYTo6TWV0YWRhdGE6OkZpbHRlciBtTWV0YWRhdGFVcGRhdGVkOyAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCiAKLSAgICAgICAgc3A8U2VydmljZURlYXRoTm90aWZpZXI+IG1FeHRyYWN0b3JEZWF0aExpc3RlbmVyOwotICAgICAgICBzcDxTZXJ2aWNlRGVhdGhOb3RpZmllcj4gbUNvZGVjRGVhdGhMaXN0ZW5lcjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8RGVhdGhOb3RpZmllcj4gbURlYXRoTm90aWZpZXJzOwogICAgICAgICBzcDxBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcj4gbUF1ZGlvRGV2aWNlVXBkYXRlZExpc3RlbmVyOwogI2lmIENBTExCQUNLX0FOVEFHT05JWkVSCiAgICAgICAgICAgICAgICAgICAgIEFudGFnb25pemVyKiAgICAgICAgICAgICAgICAgIG1BbnRhZ29uaXplcjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmNwcAppbmRleCA0MjA2NjQ3Li43MDNkYTRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuY3BwCkBAIC0xOCwyNyArMTgsMjggQEAKICNkZWZpbmUgTE9HX1RBRyAiTWVkaWFSZWNvcmRlclNlcnZpY2UiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGRpcmVudC5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPiAvLyBmb3IgcHJvcGVydHlfZ2V0CisjaW5jbHVkZSAiTWVkaWFSZWNvcmRlckNsaWVudC5oIgorI2luY2x1ZGUgIk1lZGlhUGxheWVyU2VydmljZS5oIgorI2luY2x1ZGUgIlN0YWdlZnJpZ2h0UmVjb3JkZXIuaCIKKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9jMi8xLjAvSUNvbXBvbmVudFN0b3JlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+Ci0KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC9jbGllbnQuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4gLy8gZm9yIHByb3BlcnR5X2dldAorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmcxNi5oPgogCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0KLSNpbmNsdWRlICJNZWRpYVJlY29yZGVyQ2xpZW50LmgiCi0jaW5jbHVkZSAiTWVkaWFQbGF5ZXJTZXJ2aWNlLmgiCi0KLSNpbmNsdWRlICJTdGFnZWZyaWdodFJlY29yZGVyLmgiCi0jaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMzksNyArMzQwLDcgQEAKICAgICAgICAgd3A8TWVkaWFSZWNvcmRlckNsaWVudD4gY2xpZW50KHRoaXMpOwogICAgICAgICBtTWVkaWFQbGF5ZXJTZXJ2aWNlLT5yZW1vdmVNZWRpYVJlY29yZGVyQ2xpZW50KGNsaWVudCk7CiAgICAgfQotICAgIGNsZWFyRGVhdGhOb3RpZmllcnNfbCgpOworICAgIG1EZWF0aE5vdGlmaWVycy5jbGVhcigpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtMzU4LDU5ICszNTksNiBAQAogICAgIHJlbGVhc2UoKTsKIH0KIAotTWVkaWFSZWNvcmRlckNsaWVudDo6U2VydmljZURlYXRoTm90aWZpZXI6OlNlcnZpY2VEZWF0aE5vdGlmaWVyKAotICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgc2VydmljZSwKLSAgICAgICAgY29uc3Qgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+JiBsaXN0ZW5lciwKLSAgICAgICAgaW50IHdoaWNoKSB7Ci0gICAgbVNlcnZpY2UgPSBzZXJ2aWNlOwotICAgIG1PbXggPSBudWxscHRyOwotICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIG1XaGljaCA9IHdoaWNoOwotfQotCi1NZWRpYVJlY29yZGVyQ2xpZW50OjpTZXJ2aWNlRGVhdGhOb3RpZmllcjo6U2VydmljZURlYXRoTm90aWZpZXIoCi0gICAgICAgIGNvbnN0IHNwPElPbXg+JiBvbXgsCi0gICAgICAgIGNvbnN0IHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiYgbGlzdGVuZXIsCi0gICAgICAgIGludCB3aGljaCkgewotICAgIG1TZXJ2aWNlID0gbnVsbHB0cjsKLSAgICBtT214ID0gb214OwotICAgIG1MaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIG1XaGljaCA9IHdoaWNoOwotfQotCi1NZWRpYVJlY29yZGVyQ2xpZW50OjpTZXJ2aWNlRGVhdGhOb3RpZmllcjo6flNlcnZpY2VEZWF0aE5vdGlmaWVyKCkgewotfQotCi12b2lkIE1lZGlhUmVjb3JkZXJDbGllbnQ6OlNlcnZpY2VEZWF0aE5vdGlmaWVyOjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiAvKndobyovKSB7Ci0gICAgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKLSAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICBsaXN0ZW5lci0+bm90aWZ5KE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9TRVJWRVJfRElFRCwgbVdoaWNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygibGlzdGVuZXIgZm9yIHByb2Nlc3MgJWQgZGVhdGggaXMgZ29uZSIsIG1XaGljaCk7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhUmVjb3JkZXJDbGllbnQ6OlNlcnZpY2VEZWF0aE5vdGlmaWVyOjpzZXJ2aWNlRGllZCgKLSAgICAgICAgdWludDY0X3QgLyogY29va2llICovLAotICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgLyogd2hvICovKSB7Ci0gICAgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+IGxpc3RlbmVyID0gbUxpc3RlbmVyLnByb21vdGUoKTsKLSAgICBpZiAobGlzdGVuZXIgIT0gTlVMTCkgewotICAgICAgICBsaXN0ZW5lci0+bm90aWZ5KE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9TRVJWRVJfRElFRCwgbVdoaWNoKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygibGlzdGVuZXIgZm9yIHByb2Nlc3MgJWQgZGVhdGggaXMgZ29uZSIsIG1XaGljaCk7Ci0gICAgfQotfQotCi12b2lkIE1lZGlhUmVjb3JkZXJDbGllbnQ6OlNlcnZpY2VEZWF0aE5vdGlmaWVyOjp1bmxpbmtUb0RlYXRoKCkgewotICAgIGlmIChtU2VydmljZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIG1TZXJ2aWNlLT51bmxpbmtUb0RlYXRoKHRoaXMpOwotICAgICAgICBtU2VydmljZSA9IG51bGxwdHI7Ci0gICAgfSBlbHNlIGlmIChtT214ICE9IG51bGxwdHIpIHsKLSAgICAgICAgbU9teC0+dW5saW5rVG9EZWF0aCh0aGlzKTsKLSAgICAgICAgbU9teCA9IG51bGxwdHI7Ci0gICAgfQotfQotCiBNZWRpYVJlY29yZGVyQ2xpZW50OjpBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcjo6QXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXIoCiAgICAgICAgIGNvbnN0IHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiYgbGlzdGVuZXIpIHsKICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKQEAgLTQzMCwyMiArMzc4LDExIEBACiAgICAgfQogfQogCi12b2lkIE1lZGlhUmVjb3JkZXJDbGllbnQ6OmNsZWFyRGVhdGhOb3RpZmllcnNfbCgpIHsKLSAgICBpZiAobUNhbWVyYURlYXRoTGlzdGVuZXIgIT0gbnVsbHB0cikgewotICAgICAgICBtQ2FtZXJhRGVhdGhMaXN0ZW5lci0+dW5saW5rVG9EZWF0aCgpOwotICAgICAgICBtQ2FtZXJhRGVhdGhMaXN0ZW5lciA9IG51bGxwdHI7Ci0gICAgfQotICAgIGlmIChtQ29kZWNEZWF0aExpc3RlbmVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgbUNvZGVjRGVhdGhMaXN0ZW5lci0+dW5saW5rVG9EZWF0aCgpOwotICAgICAgICBtQ29kZWNEZWF0aExpc3RlbmVyID0gbnVsbHB0cjsKLSAgICB9Ci19Ci0KIHN0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OnNldExpc3RlbmVyKGNvbnN0IHNwPElNZWRpYVJlY29yZGVyQ2xpZW50PiYgbGlzdGVuZXIpCiB7CiAgICAgQUxPR1YoInNldExpc3RlbmVyIik7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwotICAgIGNsZWFyRGVhdGhOb3RpZmllcnNfbCgpOworICAgIG1EZWF0aE5vdGlmaWVycy5jbGVhcigpOwogICAgIGlmIChtUmVjb3JkZXIgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgicmVjb3JkZXIgaXMgbm90IGluaXRpYWxpemVkIik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtNDYzLDIwICs0MDAsNzMgQEAKICAgICAvLyBJZiB0aGUgZGV2aWNlIGRvZXMgbm90IGhhdmUgYSBjYW1lcmEsIGRvIG5vdCBjcmVhdGUgYSBkZWF0aCBsaXN0ZW5lciBmb3IgaXQuCiAgICAgaWYgKGJpbmRlciAhPSBOVUxMKSB7CiAgICAgICAgIHNDYW1lcmFWZXJpZmllZCA9IHRydWU7Ci0gICAgICAgIG1DYW1lcmFEZWF0aExpc3RlbmVyID0gbmV3IFNlcnZpY2VEZWF0aE5vdGlmaWVyKGJpbmRlciwgbGlzdGVuZXIsCi0gICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDQU1FUkFfUFJPQ0VTU19ERUFUSCk7Ci0gICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobUNhbWVyYURlYXRoTGlzdGVuZXIpOworICAgICAgICBtRGVhdGhOb3RpZmllcnMuZW1wbGFjZV9iYWNrKAorICAgICAgICAgICAgICAgIGJpbmRlciwgW2wgPSB3cDxJTWVkaWFSZWNvcmRlckNsaWVudD4obGlzdGVuZXIpXSgpeworICAgICAgICAgICAgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+IGxpc3RlbmVyID0gbC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAobGlzdGVuZXIpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigibWVkaWEuY2FtZXJhIHNlcnZpY2UgZGllZC4gIgorICAgICAgICAgICAgICAgICAgICAgICJTZW5kaW5nIGRlYXRoIG5vdGlmaWNhdGlvbi4iKTsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5KAorICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1NFUlZFUl9ESUVELAorICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpDQU1FUkFfUFJPQ0VTU19ERUFUSCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCJtZWRpYS5jYW1lcmEgc2VydmljZSBkaWVkIHdpdGhvdXQgYSBkZWF0aCBoYW5kbGVyLiIpOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKICAgICB9CiAgICAgc0NhbWVyYUNoZWNrZWQgPSB0cnVlOwogCi0gICAgc3A8SU9teD4gb214ID0gSU9teDo6Z2V0U2VydmljZSgpOwotICAgIGlmIChvbXggPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiSU9teCBzZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUiKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgeworICAgICAgICB1c2luZyA6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlOworCisgICAgICAgIC8vIExpc3RlbiB0byBPTVgncyBJT214U3RvcmUvZGVmYXVsdAorICAgICAgICB7CisgICAgICAgICAgICBzcDxJQmFzZT4gYmFzZSA9IDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OgorICAgICAgICAgICAgICAgICAgICBJT214OjpnZXRTZXJ2aWNlKCk7CisgICAgICAgICAgICBpZiAoYmFzZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoIk9NWCBzZXJ2aWNlIGlzIG5vdCBhdmFpbGFibGUiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbURlYXRoTm90aWZpZXJzLmVtcGxhY2VfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsIFtsID0gd3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+KGxpc3RlbmVyKV0oKXsKKyAgICAgICAgICAgICAgICAgICAgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+IGxpc3RlbmVyID0gbC5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChsaXN0ZW5lcikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIk9NWCBzZXJ2aWNlIGRpZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZW5kaW5nIGRlYXRoIG5vdGlmaWNhdGlvbi4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyLT5ub3RpZnkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1FRElBX0VSUk9SLCBNRURJQV9FUlJPUl9TRVJWRVJfRElFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOjpNRURJQUNPREVDX1BST0NFU1NfREVBVEgpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIk9NWCBzZXJ2aWNlIGRpZWQgd2l0aG91dCBhIGRlYXRoIGhhbmRsZXIuIik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIExpc3RlbiB0byBDb2RlYzIncyBJQ29tcG9uZW50U3RvcmUgaW5zdGFuY2VzCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoc3RkOjpzaGFyZWRfcHRyPENvZGVjMkNsaWVudD4gY29uc3QmIGNsaWVudCA6CisgICAgICAgICAgICAgICAgICAgIENvZGVjMkNsaWVudDo6Q3JlYXRlRnJvbUFsbFNlcnZpY2VzKCkpIHsKKyAgICAgICAgICAgICAgICBzcDxJQmFzZT4gYmFzZSA9IGNsaWVudC0+Z2V0QmFzZSgpOworICAgICAgICAgICAgICAgIG1EZWF0aE5vdGlmaWVycy5lbXBsYWNlX2JhY2soCisgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLCBbbCA9IHdwPElNZWRpYVJlY29yZGVyQ2xpZW50PihsaXN0ZW5lciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSA9IHN0ZDo6c3RyaW5nKGNsaWVudC0+Z2V0U2VydmljZU5hbWUoKSldKCkgeworICAgICAgICAgICAgICAgICAgICBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4gbGlzdGVuZXIgPSBsLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxpc3RlbmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiQ29kZWMyIHNlcnZpY2UgXCIlc1wiIGRpZWQuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJTZW5kaW5nIGRlYXRoIG5vdGlmaWNhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXItPm5vdGlmeSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUVESUFfRVJST1IsIE1FRElBX0VSUk9SX1NFUlZFUl9ESUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllclNlcnZpY2U6Ok1FRElBQ09ERUNfUFJPQ0VTU19ERUFUSCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiQ29kZWMyIHNlcnZpY2UgXCIlc1wiIGRpZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndpdGhvdXQgYSBkZWF0aCBoYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KLSAgICBtQ29kZWNEZWF0aExpc3RlbmVyID0gbmV3IFNlcnZpY2VEZWF0aE5vdGlmaWVyKG9teCwgbGlzdGVuZXIsCi0gICAgICAgICAgICBNZWRpYVBsYXllclNlcnZpY2U6Ok1FRElBQ09ERUNfUFJPQ0VTU19ERUFUSCk7Ci0gICAgb214LT5saW5rVG9EZWF0aChtQ29kZWNEZWF0aExpc3RlbmVyLCAwKTsKIAogICAgIG1BdWRpb0RldmljZVVwZGF0ZWROb3RpZmllciA9IG5ldyBBdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcihsaXN0ZW5lcik7CiAgICAgbVJlY29yZGVyLT5zZXRBdWRpb0RldmljZUNhbGxiYWNrKG1BdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcik7CkBAIC01MzcsNCArNTI3LDMwIEBACiAgICAgfQogICAgIHJldHVybiBOT19JTklUOwogfQorCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKAorICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICBBTE9HVigic2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbiglZCkiLCBkaXJlY3Rpb24pOworICAgIGlmIChtUmVjb3JkZXIgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbVJlY29yZGVyLT5zZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGRpcmVjdGlvbik7CisgICAgfQorICAgIHJldHVybiBOT19JTklUOworfQorCitzdGF0dXNfdCBNZWRpYVJlY29yZGVyQ2xpZW50OjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgeworICAgIEFMT0dWKCJzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oJWYpIiwgem9vbSk7CisgICAgaWYgKG1SZWNvcmRlciAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybiBtUmVjb3JkZXItPnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3N0YXR1c190IE1lZGlhUmVjb3JkZXJDbGllbnQ6OmdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIHsKKyAgICBBTE9HVigiZ2V0UG9ydElkIik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOworICAgIGlmIChtUmVjb3JkZXIgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gbVJlY29yZGVyLT5nZXRQb3J0SWQocG9ydElkKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CiB9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZWRpYVJlY29yZGVyQ2xpZW50LmgKaW5kZXggZDJlNjgxZi4uOWUwZjg3NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01lZGlhUmVjb3JkZXJDbGllbnQuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWVkaWFSZWNvcmRlckNsaWVudC5oCkBAIC0xOCwxMCArMTgsMTIgQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQVJFQ09SREVSQ0xJRU5UX0gKICNkZWZpbmUgQU5EUk9JRF9NRURJQVJFQ09SREVSQ0xJRU5UX0gKIAorI2luY2x1ZGUgIkRlYXRoTm90aWZpZXIuaCIKKwogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhUmVjb3JkZXIuaD4KIAotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMxLDM0ICszMyw2IEBACiAKIGNsYXNzIE1lZGlhUmVjb3JkZXJDbGllbnQgOiBwdWJsaWMgQm5NZWRpYVJlY29yZGVyCiB7Ci0gICAgdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjpJT214IElPbXg7Ci0KLSAgICBjbGFzcyBTZXJ2aWNlRGVhdGhOb3RpZmllciA6Ci0gICAgICAgICAgICBwdWJsaWMgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQsCi0gICAgICAgICAgICBwdWJsaWMgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQKLSAgICB7Ci0gICAgcHVibGljOgotICAgICAgICBTZXJ2aWNlRGVhdGhOb3RpZmllcigKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxJQmluZGVyPiYgc2VydmljZSwKLSAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVkaWFSZWNvcmRlckNsaWVudD4mIGxpc3RlbmVyLAotICAgICAgICAgICAgICAgIGludCB3aGljaCk7Ci0gICAgICAgIFNlcnZpY2VEZWF0aE5vdGlmaWVyKAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPElPbXg+JiBvbXgsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lZGlhUmVjb3JkZXJDbGllbnQ+JiBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBpbnQgd2hpY2gpOwotICAgICAgICB2aXJ0dWFsIH5TZXJ2aWNlRGVhdGhOb3RpZmllcigpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgd2hvKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIHNlcnZpY2VEaWVkKAotICAgICAgICAgICAgICAgIHVpbnQ2NF90IGNvb2tpZSwKLSAgICAgICAgICAgICAgICBjb25zdCB3cDw6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlPiYgd2hvKTsKLSAgICAgICAgdm9pZCB1bmxpbmtUb0RlYXRoKCk7Ci0gICAgcHJpdmF0ZToKLSAgICAgICAgaW50IG1XaGljaDsKLSAgICAgICAgc3A8SUJpbmRlcj4gbVNlcnZpY2U7Ci0gICAgICAgIHNwPElPbXg+IG1PbXg7Ci0gICAgICAgIHdwPElNZWRpYVJlY29yZGVyQ2xpZW50PiBtTGlzdGVuZXI7Ci0gICAgfTsKLQogICAgIGNsYXNzIEF1ZGlvRGV2aWNlVXBkYXRlZE5vdGlmaWVyOiBwdWJsaWMgQXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2sKICAgICB7CiAgICAgcHVibGljOgpAQCAtNzEsOCArNDUsNiBAQAogICAgICAgICB3cDxJTWVkaWFSZWNvcmRlckNsaWVudD4gbUxpc3RlbmVyOwogICAgIH07CiAKLSAgICB2b2lkIGNsZWFyRGVhdGhOb3RpZmllcnNfbCgpOwotCiBwdWJsaWM6CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBzZXRDYW1lcmEoY29uc3Qgc3A8aGFyZHdhcmU6OklDYW1lcmE+JiBjYW1lcmEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQ2FtZXJhUmVjb3JkaW5nUHJveHk+JiBwcm94eSk7CkBAIC0xMDksNiArODEsOSBAQAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgZ2V0QWN0aXZlTWljcm9waG9uZXMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKTsKKyAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgIHNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgIGdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogICAgIGZyaWVuZCBjbGFzcyAgICAgICAgICAgTWVkaWFQbGF5ZXJTZXJ2aWNlOyAgLy8gZm9yIGFjY2Vzc2luZyBwcml2YXRlIGNvbnN0cnVjdG9yCkBAIC0xMTksOCArOTQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgfk1lZGlhUmVjb3JkZXJDbGllbnQoKTsKIAotICAgIHNwPFNlcnZpY2VEZWF0aE5vdGlmaWVyPiBtQ2FtZXJhRGVhdGhMaXN0ZW5lcjsKLSAgICBzcDxTZXJ2aWNlRGVhdGhOb3RpZmllcj4gbUNvZGVjRGVhdGhMaXN0ZW5lcjsKKyAgICBzdGQ6OnZlY3RvcjxEZWF0aE5vdGlmaWVyPiBtRGVhdGhOb3RpZmllcnM7CiAgICAgc3A8QXVkaW9EZXZpY2VVcGRhdGVkTm90aWZpZXI+IG1BdWRpb0RldmljZVVwZGF0ZWROb3RpZmllcjsKIAogICAgIHBpZF90ICAgICAgICAgICAgICAgICAgbVBpZDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvTWV0YWRhdGFSZXRyaWV2ZXJDbGllbnQuY3BwCmluZGV4IDQwYjE3YmYuLjRkYmFiMGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9NZXRhZGF0YVJldHJpZXZlckNsaWVudC5jcHAKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL01ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmNwcApAQCAtMzcsNiArMzcsNyBAQAogI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZvdW5kYXRpb25VdGlscy5oPgogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvVmlkZW9GcmFtZS5oPgogI2luY2x1ZGUgIk1ldGFkYXRhUmV0cmlldmVyQ2xpZW50LmgiCiAjaW5jbHVkZSAiU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhYWUyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKQEAgLTAsMCArMSw3MDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKworI2luY2x1ZGUgIlN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaCIKKyNpbmNsdWRlICJGcmFtZURlY29kZXIuaCIKKworI2luY2x1ZGUgPGRhdGFzb3VyY2UvUGxheWVyU2VydmljZURhdGFTb3VyY2VGYWN0b3J5Lmg+CisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9QbGF5ZXJTZXJ2aWNlRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL0NoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyKCkKKyAgICA6IG1QYXJzZWRNZXRhRGF0YShmYWxzZSksCisgICAgICBtQWxidW1BcnQoTlVMTCksCisgICAgICBtTGFzdEltYWdlSW5kZXgoLTEpIHsKKyAgICBBTE9HVigiU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcigpIik7Cit9CisKK1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6On5TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyKCkgeworICAgIEFMT0dWKCJ+U3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcigpIik7CisgICAgY2xlYXJNZXRhZGF0YSgpOworICAgIGlmIChtU291cmNlICE9IE5VTEwpIHsKKyAgICAgICAgbVNvdXJjZS0+Y2xvc2UoKTsKKyAgICB9Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OnNldERhdGFTb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gKmhlYWRlcnMpIHsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZSglcykiLCB1cmkpOworCisgICAgY2xlYXJNZXRhZGF0YSgpOworICAgIG1Tb3VyY2UgPSBQbGF5ZXJTZXJ2aWNlRGF0YVNvdXJjZUZhY3Rvcnk6OmdldEluc3RhbmNlKCktPkNyZWF0ZUZyb21VUkkoCisgICAgICAgICAgICBodHRwU2VydmljZSwgdXJpLCBoZWFkZXJzKTsKKworICAgIGlmIChtU291cmNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjcmVhdGUgZGF0YSBzb3VyY2UgZm9yICclcycuIiwgdXJpKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbUV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlKG1Tb3VyY2UpOworCisgICAgaWYgKG1FeHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIGluc3RhbnRpYXRlIGFuIGV4dHJhY3RvciBmb3IgJyVzJy4iLCB1cmkpOworCisgICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKKworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIFdhcm5pbmcgY2FsbGVyIHJldGFpbnMgb3duZXJzaGlwIG9mIHRoZSBmaWxlZGVzY3JpcHRvciEgRHVwIGl0IGlmIG5lY2Vzc2FyeS4KK3N0YXR1c190IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OnNldERhdGFTb3VyY2UoCisgICAgICAgIGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKSB7CisgICAgZmQgPSBkdXAoZmQpOworCisgICAgQUxPR1YoInNldERhdGFTb3VyY2UoJWQsICUiIFBSSWQ2NCAiLCAlIiBQUklkNjQgIikiLCBmZCwgb2Zmc2V0LCBsZW5ndGgpOworCisgICAgY2xlYXJNZXRhZGF0YSgpOworICAgIG1Tb3VyY2UgPSBuZXcgUGxheWVyU2VydmljZUZpbGVTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKTsKKworICAgIHN0YXR1c190IGVycjsKKyAgICBpZiAoKGVyciA9IG1Tb3VyY2UtPmluaXRDaGVjaygpKSAhPSBPSykgeworICAgICAgICBtU291cmNlLmNsZWFyKCk7CisKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBtRXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGUobVNvdXJjZSk7CisKKyAgICBpZiAobUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKKworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OnNldERhdGFTb3VyY2UoCisgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+JiBzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpIHsKKyAgICBBTE9HVigic2V0RGF0YVNvdXJjZShEYXRhU291cmNlKSIpOworCisgICAgY2xlYXJNZXRhZGF0YSgpOworICAgIG1Tb3VyY2UgPSBzb3VyY2U7CisgICAgbUV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlKG1Tb3VyY2UsIG1pbWUpOworCisgICAgaWYgKG1FeHRyYWN0b3IgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluc3RhbnRpYXRlIGEgTWVkaWFFeHRyYWN0b3IuIik7CisgICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitzcDxJTWVtb3J5PiBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpnZXRJbWFnZUF0SW5kZXgoCisgICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5LCBib29sIHRodW1ibmFpbCkgeworICAgIEFMT0dWKCJnZXRJbWFnZUF0SW5kZXg6IGluZGV4KCVkKSBjb2xvckZvcm1hdCglZCkgbWV0YU9ubHkoJWQpIHRodW1ibmFpbCglZCkiLAorICAgICAgICAgICAgaW5kZXgsIGNvbG9yRm9ybWF0LCBtZXRhT25seSwgdGh1bWJuYWlsKTsKKworICAgIHJldHVybiBnZXRJbWFnZUludGVybmFsKGluZGV4LCBjb2xvckZvcm1hdCwgbWV0YU9ubHksIHRodW1ibmFpbCwgTlVMTCk7Cit9CisKK3NwPElNZW1vcnk+IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OmdldEltYWdlUmVjdEF0SW5kZXgoCisgICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7CisgICAgQUxPR1YoImdldEltYWdlUmVjdEF0SW5kZXg6IGluZGV4KCVkKSBjb2xvckZvcm1hdCglZCkgcmVjdCB7JWQsICVkLCAlZCwgJWR9IiwKKyAgICAgICAgICAgIGluZGV4LCBjb2xvckZvcm1hdCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKKworICAgIEZyYW1lUmVjdCByZWN0ID0ge2xlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbX07CisKKyAgICBpZiAobUltYWdlRGVjb2RlciAhPSBOVUxMICYmIGluZGV4ID09IG1MYXN0SW1hZ2VJbmRleCkgeworICAgICAgICByZXR1cm4gbUltYWdlRGVjb2Rlci0+ZXh0cmFjdEZyYW1lKCZyZWN0KTsKKyAgICB9CisKKyAgICByZXR1cm4gZ2V0SW1hZ2VJbnRlcm5hbCgKKyAgICAgICAgICAgIGluZGV4LCBjb2xvckZvcm1hdCwgZmFsc2UgLyptZXRhT25seSovLCBmYWxzZSAvKnRodW1ibmFpbCovLCAmcmVjdCk7Cit9CisKK3NwPElNZW1vcnk+IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OmdldEltYWdlSW50ZXJuYWwoCisgICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5LCBib29sIHRodW1ibmFpbCwgRnJhbWVSZWN0KiByZWN0KSB7CisKKyAgICBpZiAobUV4dHJhY3Rvci5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJubyBleHRyYWN0b3IuIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHNpemVfdCBuID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKKyAgICBzaXplX3QgaTsKKyAgICBpbnQgaW1hZ2VDb3VudCA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7CisgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YShpKTsKKyAgICAgICAgaWYgKCFtZXRhKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiZ2V0dGluZyB0cmFjayAlenUgb2YgJXp1LCBtZXRhPSVzIiwgaSwgbiwgbWV0YS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKworICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAiaW1hZ2UvIiwgNikpIHsKKyAgICAgICAgICAgIGludDMyX3QgaXNQcmltYXJ5OworICAgICAgICAgICAgaWYgKChpbmRleCA8IDAgJiYgbWV0YS0+ZmluZEludDMyKAorICAgICAgICAgICAgICAgICAgICBrS2V5VHJhY2tJc0RlZmF1bHQsICZpc1ByaW1hcnkpICYmIGlzUHJpbWFyeSkKKyAgICAgICAgICAgICAgICAgICAgfHwgKGluZGV4ID09IGltYWdlQ291bnQrKykpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpID09IG4pIHsKKyAgICAgICAgQUxPR0UoImltYWdlIHRyYWNrIG5vdCBmb3VuZC4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8TWV0YURhdGE+IHRyYWNrTWV0YSA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7CisgICAgaWYgKCF0cmFja01ldGEpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKG1ldGFPbmx5KSB7CisgICAgICAgIHJldHVybiBGcmFtZURlY29kZXI6OmdldE1ldGFkYXRhT25seSh0cmFja01ldGEsIGNvbG9yRm9ybWF0LCB0aHVtYm5haWwpOworICAgIH0KKworICAgIHNwPElNZWRpYVNvdXJjZT4gc291cmNlID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2soaSk7CisKKyAgICBpZiAoc291cmNlLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoInVuYWJsZSB0byBpbnN0YW50aWF0ZSBpbWFnZSB0cmFjay4iKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKKyAgICBBTE9HVigiZXh0cmFjdGluZyBmcm9tICVzIHRyYWNrIiwgbWltZSk7CisgICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykpIHsKKyAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkM7CisgICAgICAgIHRyYWNrTWV0YSA9IG5ldyBNZXRhRGF0YSgqdHJhY2tNZXRhKTsKKyAgICAgICAgdHJhY2tNZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZSk7CisgICAgfQorCisgICAgYm9vbCBwcmVmZXJodyA9IHByb3BlcnR5X2dldF9ib29sKAorICAgICAgICAgICAgIm1lZGlhLnN0YWdlZnJpZ2h0LnRodW1ibmFpbC5wcmVmZXJfaHdfY29kZWNzIiwgZmFsc2UpOworICAgIHVpbnQzMl90IGZsYWdzID0gcHJlZmVyaHcgPyAwIDogTWVkaWFDb2RlY0xpc3Q6OmtQcmVmZXJTb2Z0d2FyZUNvZGVjczsKKyAgICBWZWN0b3I8QVN0cmluZz4gbWF0Y2hpbmdDb2RlY3M7CisgICAgTWVkaWFDb2RlY0xpc3Q6OmZpbmRNYXRjaGluZ0NvZGVjcygKKyAgICAgICAgICAgIG1pbWUsCisgICAgICAgICAgICBmYWxzZSwgLyogZW5jb2RlciAqLworICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAmbWF0Y2hpbmdDb2RlY3MpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGluZ0NvZGVjcy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lID0gbWF0Y2hpbmdDb2RlY3NbaV07CisgICAgICAgIHNwPEltYWdlRGVjb2Rlcj4gZGVjb2RlciA9IG5ldyBJbWFnZURlY29kZXIoY29tcG9uZW50TmFtZSwgdHJhY2tNZXRhLCBzb3VyY2UpOworICAgICAgICBpbnQ2NF90IGZyYW1lVGltZVVzID0gdGh1bWJuYWlsID8gLTEgOiAwOworICAgICAgICBpZiAoZGVjb2Rlci0+aW5pdChmcmFtZVRpbWVVcywgMSAvKm51bUZyYW1lcyovLCAwIC8qb3B0aW9uKi8sIGNvbG9yRm9ybWF0KSA9PSBPSykgeworICAgICAgICAgICAgc3A8SU1lbW9yeT4gZnJhbWUgPSBkZWNvZGVyLT5leHRyYWN0RnJhbWUocmVjdCk7CisKKyAgICAgICAgICAgIGlmIChmcmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlY3QgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIHRoZSBkZWNvZGVyIGlmIHNsaWNlIGRlY29kaW5nCisgICAgICAgICAgICAgICAgICAgIG1JbWFnZURlY29kZXIgPSBkZWNvZGVyOworICAgICAgICAgICAgICAgICAgICBtTGFzdEltYWdlSW5kZXggPSBpbmRleDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGZyYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEFMT0dWKCIlcyBmYWlsZWQgdG8gZXh0cmFjdCB0aHVtYm5haWwsIHRyeWluZyBuZXh0IGRlY29kZXIuIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKK30KKworc3A8SU1lbW9yeT4gU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6Z2V0RnJhbWVBdFRpbWUoCisgICAgICAgIGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpIHsKKyAgICBBTE9HVigiZ2V0RnJhbWVBdFRpbWU6ICUiIFBSSWQ2NCAiIHVzIG9wdGlvbjogJWQgY29sb3JGb3JtYXQ6ICVkLCBtZXRhT25seTogJWQiLAorICAgICAgICAgICAgdGltZVVzLCBvcHRpb24sIGNvbG9yRm9ybWF0LCBtZXRhT25seSk7CisKKyAgICBzcDxJTWVtb3J5PiBmcmFtZTsKKyAgICBzdGF0dXNfdCBlcnIgPSBnZXRGcmFtZUludGVybmFsKAorICAgICAgICAgICAgdGltZVVzLCAxLCBvcHRpb24sIGNvbG9yRm9ybWF0LCBtZXRhT25seSwgJmZyYW1lLCBOVUxMIC8qb3V0RnJhbWVzKi8pOworICAgIHJldHVybiAoZXJyID09IE9LKSA/IGZyYW1lIDogTlVMTDsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6Z2V0RnJhbWVBdEluZGV4KAorICAgICAgICBzdGQ6OnZlY3RvcjxzcDxJTWVtb3J5PiA+KiBmcmFtZXMsCisgICAgICAgIGludCBmcmFtZUluZGV4LCBpbnQgbnVtRnJhbWVzLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpIHsKKyAgICBBTE9HVigiZ2V0RnJhbWVBdEluZGV4OiBmcmFtZUluZGV4ICVkLCBudW1GcmFtZXMgJWQsIGNvbG9yRm9ybWF0OiAlZCwgbWV0YU9ubHk6ICVkIiwKKyAgICAgICAgICAgIGZyYW1lSW5kZXgsIG51bUZyYW1lcywgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKKworICAgIHJldHVybiBnZXRGcmFtZUludGVybmFsKAorICAgICAgICAgICAgZnJhbWVJbmRleCwgbnVtRnJhbWVzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfRlJBTUVfSU5ERVgsCisgICAgICAgICAgICBjb2xvckZvcm1hdCwgbWV0YU9ubHksIE5VTEwgLypvdXRGcmFtZSovLCBmcmFtZXMpOworfQorCitzdGF0dXNfdCBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpnZXRGcmFtZUludGVybmFsKAorICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG51bUZyYW1lcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5LAorICAgICAgICBzcDxJTWVtb3J5Piogb3V0RnJhbWUsIHN0ZDo6dmVjdG9yPHNwPElNZW1vcnk+ID4qIG91dEZyYW1lcykgeworICAgIGlmIChtRXh0cmFjdG9yLmdldCgpID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIm5vIGV4dHJhY3Rvci4iKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3A8TWV0YURhdGE+IGZpbGVNZXRhID0gbUV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoKTsKKworICAgIGlmIChmaWxlTWV0YSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJleHRyYWN0b3IgZG9lc24ndCBwdWJsaXNoIG1ldGFkYXRhLCBmYWlsZWQgdG8gaW5pdGlhbGl6ZT8iKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc2l6ZV90IG4gPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOworICAgIHNpemVfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtRXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKGkpOworICAgICAgICBpZiAoIW1ldGEpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOworCisgICAgICAgIGlmICghc3RybmNhc2VjbXAobWltZSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpID09IG4pIHsKKyAgICAgICAgQUxPR0UoIm5vIHZpZGVvIHRyYWNrIGZvdW5kLiIpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgc3A8TWV0YURhdGE+IHRyYWNrTWV0YSA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoCisgICAgICAgICAgICBpLCBNZWRpYUV4dHJhY3Rvcjo6a0luY2x1ZGVFeHRlbnNpdmVNZXRhRGF0YSk7CisgICAgaWYgKCF0cmFja01ldGEpIHsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgaWYgKG1ldGFPbmx5KSB7CisgICAgICAgIGlmIChvdXRGcmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAqb3V0RnJhbWUgPSBGcmFtZURlY29kZXI6OmdldE1ldGFkYXRhT25seSh0cmFja01ldGEsIGNvbG9yRm9ybWF0KTsKKyAgICAgICAgICAgIGlmICgqb3V0RnJhbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBzcDxJTWVkaWFTb3VyY2U+IHNvdXJjZSA9IG1FeHRyYWN0b3ItPmdldFRyYWNrKGkpOworCisgICAgaWYgKHNvdXJjZS5nZXQoKSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJ1bmFibGUgdG8gaW5zdGFudGlhdGUgdmlkZW8gdHJhY2suIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgdWludDMyX3QgdHlwZTsKKyAgICBzaXplX3QgZGF0YVNpemU7CisgICAgaWYgKGZpbGVNZXRhLT5maW5kRGF0YShrS2V5QWxidW1BcnQsICZ0eXBlLCAmZGF0YSwgJmRhdGFTaXplKQorICAgICAgICAgICAgJiYgbUFsYnVtQXJ0ID09IE5VTEwpIHsKKyAgICAgICAgbUFsYnVtQXJ0ID0gTWVkaWFBbGJ1bUFydDo6ZnJvbURhdGEoZGF0YVNpemUsIGRhdGEpOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7CisKKyAgICBib29sIHByZWZlcmh3ID0gcHJvcGVydHlfZ2V0X2Jvb2woCisgICAgICAgICAgICAibWVkaWEuc3RhZ2VmcmlnaHQudGh1bWJuYWlsLnByZWZlcl9od19jb2RlY3MiLCBmYWxzZSk7CisgICAgdWludDMyX3QgZmxhZ3MgPSBwcmVmZXJodyA/IDAgOiBNZWRpYUNvZGVjTGlzdDo6a1ByZWZlclNvZnR3YXJlQ29kZWNzOworICAgIFZlY3RvcjxBU3RyaW5nPiBtYXRjaGluZ0NvZGVjczsKKyAgICBNZWRpYUNvZGVjTGlzdDo6ZmluZE1hdGNoaW5nQ29kZWNzKAorICAgICAgICAgICAgbWltZSwKKyAgICAgICAgICAgIGZhbHNlLCAvKiBlbmNvZGVyICovCisgICAgICAgICAgICBmbGFncywKKyAgICAgICAgICAgICZtYXRjaGluZ0NvZGVjcyk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1hdGNoaW5nQ29kZWNzLnNpemUoKTsgKytpKSB7CisgICAgICAgIGNvbnN0IEFTdHJpbmcgJmNvbXBvbmVudE5hbWUgPSBtYXRjaGluZ0NvZGVjc1tpXTsKKyAgICAgICAgc3A8VmlkZW9GcmFtZURlY29kZXI+IGRlY29kZXIgPSBuZXcgVmlkZW9GcmFtZURlY29kZXIoY29tcG9uZW50TmFtZSwgdHJhY2tNZXRhLCBzb3VyY2UpOworICAgICAgICBpZiAoZGVjb2Rlci0+aW5pdCh0aW1lVXMsIG51bUZyYW1lcywgb3B0aW9uLCBjb2xvckZvcm1hdCkgPT0gT0spIHsKKyAgICAgICAgICAgIGlmIChvdXRGcmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgKm91dEZyYW1lID0gZGVjb2Rlci0+ZXh0cmFjdEZyYW1lKCk7CisgICAgICAgICAgICAgICAgaWYgKCpvdXRGcmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKG91dEZyYW1lcyAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZGVjb2Rlci0+ZXh0cmFjdEZyYW1lcyhvdXRGcmFtZXMpOworICAgICAgICAgICAgICAgIGlmIChlcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HVigiJXMgZmFpbGVkIHRvIGV4dHJhY3QgZnJhbWUsIHRyeWluZyBuZXh0IGRlY29kZXIuIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBBTE9HRSgiYWxsIGNvZGVjcyBmYWlsZWQgdG8gZXh0cmFjdCBmcmFtZS4iKTsKKyAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKK30KKworTWVkaWFBbGJ1bUFydCAqU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6ZXh0cmFjdEFsYnVtQXJ0KCkgeworICAgIEFMT0dWKCJleHRyYWN0QWxidW1BcnQgKGV4dHJhY3RvcjogJXMpIiwgbUV4dHJhY3Rvci5nZXQoKSAhPSBOVUxMID8gIllFUyIgOiAiTk8iKTsKKworICAgIGlmIChtRXh0cmFjdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKCFtUGFyc2VkTWV0YURhdGEpIHsKKyAgICAgICAgcGFyc2VNZXRhRGF0YSgpOworCisgICAgICAgIG1QYXJzZWRNZXRhRGF0YSA9IHRydWU7CisgICAgfQorCisgICAgaWYgKG1BbGJ1bUFydCkgeworICAgICAgICByZXR1cm4gbUFsYnVtQXJ0LT5jbG9uZSgpOworICAgIH0KKworICAgIHJldHVybiBOVUxMOworfQorCitjb25zdCBjaGFyICpTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpleHRyYWN0TWV0YWRhdGEoaW50IGtleUNvZGUpIHsKKyAgICBpZiAobUV4dHJhY3RvciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmICghbVBhcnNlZE1ldGFEYXRhKSB7CisgICAgICAgIHBhcnNlTWV0YURhdGEoKTsKKworICAgICAgICBtUGFyc2VkTWV0YURhdGEgPSB0cnVlOworICAgIH0KKworICAgIHNzaXplX3QgaW5kZXggPSBtTWV0YURhdGEuaW5kZXhPZktleShrZXlDb2RlKTsKKworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgcmV0dXJuIG1NZXRhRGF0YS52YWx1ZUF0KGluZGV4KS5zdHJpbmcoKTsKK30KKwordm9pZCBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpwYXJzZUNvbG9yQXNwZWN0cyhjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpIHsKKyAgICBzcDxBTWVzc2FnZT4gZm9ybWF0ID0gbmV3IEFNZXNzYWdlKCk7CisgICAgaWYgKGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShtZXRhLCAmZm9ybWF0KSAhPSBPSykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaW50MzJfdCBzdGFuZGFyZCwgdHJhbnNmZXIsIHJhbmdlOworICAgIGlmIChmb3JtYXQtPmZpbmRJbnQzMigiY29sb3Itc3RhbmRhcmQiLCAmc3RhbmRhcmQpCisgICAgICAgICAgICAmJiBmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItdHJhbnNmZXIiLCAmdHJhbnNmZXIpCisgICAgICAgICAgICAmJiBmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItcmFuZ2UiLCAmcmFuZ2UpKSB7CisgICAgICAgIEFMT0dWKCJmb3VuZCBjb2xvciBhc3BlY3RzIDogc3RhbmRhcmQ9JWQsIHRyYW5zZmVyPSVkLCByYW5nZT0lZCIsCisgICAgICAgICAgICAgICAgc3RhbmRhcmQsIHRyYW5zZmVyLCByYW5nZSk7CisKKyAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfQ09MT1JfU1RBTkRBUkQsIFN0cmluZzg6OmZvcm1hdCgiJWQiLCBzdGFuZGFyZCkpOworICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9DT0xPUl9UUkFOU0ZFUiwgU3RyaW5nODo6Zm9ybWF0KCIlZCIsIHRyYW5zZmVyKSk7CisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0NPTE9SX1JBTkdFLCBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgcmFuZ2UpKTsKKyAgICB9Cit9CisKK3ZvaWQgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6cGFyc2VNZXRhRGF0YSgpIHsKKyAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1FeHRyYWN0b3ItPmdldE1ldGFEYXRhKCk7CisKKyAgICBpZiAobWV0YSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCJleHRyYWN0b3IgZG9lc24ndCBwdWJsaXNoIG1ldGFkYXRhLCBmYWlsZWQgdG8gaW5pdGlhbGl6ZT8iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0cnVjdCBNYXAgeworICAgICAgICBpbnQgZnJvbTsKKyAgICAgICAgaW50IHRvOworICAgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgIH07CisgICAgc3RhdGljIGNvbnN0IE1hcCBrTWFwW10gPSB7CisgICAgICAgIHsga0tleU1JTUVUeXBlLCBNRVRBREFUQV9LRVlfTUlNRVRZUEUsIE5VTEwgfSwKKyAgICAgICAgeyBrS2V5Q0RUcmFja051bWJlciwgTUVUQURBVEFfS0VZX0NEX1RSQUNLX05VTUJFUiwgInRyYWNrbnVtYmVyIiB9LAorICAgICAgICB7IGtLZXlEaXNjTnVtYmVyLCBNRVRBREFUQV9LRVlfRElTQ19OVU1CRVIsICJkaXNjbnVtYmVyIiB9LAorICAgICAgICB7IGtLZXlBbGJ1bSwgTUVUQURBVEFfS0VZX0FMQlVNLCAiYWxidW0iIH0sCisgICAgICAgIHsga0tleUFydGlzdCwgTUVUQURBVEFfS0VZX0FSVElTVCwgImFydGlzdCIgfSwKKyAgICAgICAgeyBrS2V5QWxidW1BcnRpc3QsIE1FVEFEQVRBX0tFWV9BTEJVTUFSVElTVCwgImFsYnVtYXJ0aXN0IiB9LAorICAgICAgICB7IGtLZXlBdXRob3IsIE1FVEFEQVRBX0tFWV9BVVRIT1IsIE5VTEwgfSwKKyAgICAgICAgeyBrS2V5Q29tcG9zZXIsIE1FVEFEQVRBX0tFWV9DT01QT1NFUiwgImNvbXBvc2VyIiB9LAorICAgICAgICB7IGtLZXlEYXRlLCBNRVRBREFUQV9LRVlfREFURSwgTlVMTCB9LAorICAgICAgICB7IGtLZXlHZW5yZSwgTUVUQURBVEFfS0VZX0dFTlJFLCAiZ2VucmUiIH0sCisgICAgICAgIHsga0tleVRpdGxlLCBNRVRBREFUQV9LRVlfVElUTEUsICJ0aXRsZSIgfSwKKyAgICAgICAgeyBrS2V5WWVhciwgTUVUQURBVEFfS0VZX1lFQVIsICJ5ZWFyIiB9LAorICAgICAgICB7IGtLZXlXcml0ZXIsIE1FVEFEQVRBX0tFWV9XUklURVIsICJ3cml0ZXIiIH0sCisgICAgICAgIHsga0tleUNvbXBpbGF0aW9uLCBNRVRBREFUQV9LRVlfQ09NUElMQVRJT04sICJjb21waWxhdGlvbiIgfSwKKyAgICAgICAgeyBrS2V5TG9jYXRpb24sIE1FVEFEQVRBX0tFWV9MT0NBVElPTiwgTlVMTCB9LAorICAgIH07CisKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1NYXBFbnRyaWVzID0gc2l6ZW9mKGtNYXApIC8gc2l6ZW9mKGtNYXBbMF0pOworCisgICAgQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3RvciAqZGV0ZWN0b3IgPSBuZXcgQ2hhcmFjdGVyRW5jb2RpbmdEZXRlY3RvcigpOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBrTnVtTWFwRW50cmllczsgKytpKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlOworICAgICAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa01hcFtpXS5mcm9tLCAmdmFsdWUpKSB7CisgICAgICAgICAgICBpZiAoa01hcFtpXS5uYW1lKSB7CisgICAgICAgICAgICAgICAgLy8gYWRkIHRvIGNoYXJzZXQgZGV0ZWN0b3IKKyAgICAgICAgICAgICAgICBkZXRlY3Rvci0+YWRkVGFnKGtNYXBbaV0ubmFtZSwgdmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBkaXJlY3RseSBhZGQgdG8gb3V0cHV0IGxpc3QKKyAgICAgICAgICAgICAgICBtTWV0YURhdGEuYWRkKGtNYXBbaV0udG8sIFN0cmluZzgodmFsdWUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGRldGVjdG9yLT5kZXRlY3RBbmRDb252ZXJ0KCk7CisgICAgaW50IHNpemUgPSBkZXRlY3Rvci0+c2l6ZSgpOworICAgIGlmIChzaXplKSB7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lOworICAgICAgICAgICAgY29uc3QgY2hhciAqdmFsdWU7CisgICAgICAgICAgICBkZXRlY3Rvci0+Z2V0VGFnKGksICZuYW1lLCAmdmFsdWUpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBrTnVtTWFwRW50cmllczsgKytqKSB7CisgICAgICAgICAgICAgICAgaWYgKGtNYXBbal0ubmFtZSAmJiAhc3RyY21wKGtNYXBbal0ubmFtZSwgbmFtZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1ldGFEYXRhLmFkZChrTWFwW2pdLnRvLCBTdHJpbmc4KHZhbHVlKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGRlbGV0ZSBkZXRlY3RvcjsKKworICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgdWludDMyX3QgdHlwZTsKKyAgICBzaXplX3QgZGF0YVNpemU7CisgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlBbGJ1bUFydCwgJnR5cGUsICZkYXRhLCAmZGF0YVNpemUpCisgICAgICAgICAgICAmJiBtQWxidW1BcnQgPT0gTlVMTCkgeworICAgICAgICBtQWxidW1BcnQgPSBNZWRpYUFsYnVtQXJ0Ojpmcm9tRGF0YShkYXRhU2l6ZSwgZGF0YSk7CisgICAgfQorCisgICAgc2l6ZV90IG51bVRyYWNrcyA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CisKKyAgICBjaGFyIHRtcFszMl07CisgICAgc3ByaW50Zih0bXAsICIlenUiLCBudW1UcmFja3MpOworCisgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfTlVNX1RSQUNLUywgU3RyaW5nOCh0bXApKTsKKworICAgIGZsb2F0IGNhcHR1cmVGcHM7CisgICAgaWYgKG1ldGEtPmZpbmRGbG9hdChrS2V5Q2FwdHVyZUZyYW1lcmF0ZSwgJmNhcHR1cmVGcHMpKSB7CisgICAgICAgIHNwcmludGYodG1wLCAiJWYiLCBjYXB0dXJlRnBzKTsKKyAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfQ0FQVFVSRV9GUkFNRVJBVEUsIFN0cmluZzgodG1wKSk7CisgICAgfQorCisgICAgaW50NjRfdCBleGlmT2Zmc2V0LCBleGlmU2l6ZTsKKyAgICBpZiAobWV0YS0+ZmluZEludDY0KGtLZXlFeGlmT2Zmc2V0LCAmZXhpZk9mZnNldCkKKyAgICAgJiYgbWV0YS0+ZmluZEludDY0KGtLZXlFeGlmU2l6ZSwgJmV4aWZTaXplKSkgeworICAgICAgICBzcHJpbnRmKHRtcCwgIiVsbGQiLCAobG9uZyBsb25nKWV4aWZPZmZzZXQpOworICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9FWElGX09GRlNFVCwgU3RyaW5nOCh0bXApKTsKKyAgICAgICAgc3ByaW50Zih0bXAsICIlbGxkIiwgKGxvbmcgbG9uZylleGlmU2l6ZSk7CisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0VYSUZfTEVOR1RILCBTdHJpbmc4KHRtcCkpOworICAgIH0KKworICAgIGJvb2wgaGFzQXVkaW8gPSBmYWxzZTsKKyAgICBib29sIGhhc1ZpZGVvID0gZmFsc2U7CisgICAgaW50MzJfdCB2aWRlb1dpZHRoID0gLTE7CisgICAgaW50MzJfdCB2aWRlb0hlaWdodCA9IC0xOworICAgIGludDMyX3QgdmlkZW9GcmFtZUNvdW50ID0gMDsKKyAgICBpbnQzMl90IGF1ZGlvQml0cmF0ZSA9IC0xOworICAgIGludDMyX3Qgcm90YXRpb25BbmdsZSA9IC0xOworICAgIGludDMyX3QgaW1hZ2VDb3VudCA9IDA7CisgICAgaW50MzJfdCBpbWFnZVByaW1hcnkgPSAwOworICAgIGludDMyX3QgaW1hZ2VXaWR0aCA9IC0xOworICAgIGludDMyX3QgaW1hZ2VIZWlnaHQgPSAtMTsKKyAgICBpbnQzMl90IGltYWdlUm90YXRpb24gPSAtMTsKKworICAgIC8vIFRoZSBvdmVyYWxsIGR1cmF0aW9uIGlzIHRoZSBkdXJhdGlvbiBvZiB0aGUgbG9uZ2VzdCB0cmFjay4KKyAgICBpbnQ2NF90IG1heER1cmF0aW9uVXMgPSAwOworICAgIFN0cmluZzggdGltZWRUZXh0TGFuZzsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVRyYWNrczsgKytpKSB7CisgICAgICAgIHNwPE1ldGFEYXRhPiB0cmFja01ldGEgPSBtRXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKGkpOworICAgICAgICBpZiAoIXRyYWNrTWV0YSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXM7CisgICAgICAgIGlmICh0cmFja01ldGEtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgeworICAgICAgICAgICAgaWYgKGR1cmF0aW9uVXMgPiBtYXhEdXJhdGlvblVzKSB7CisgICAgICAgICAgICAgICAgbWF4RHVyYXRpb25VcyA9IGR1cmF0aW9uVXM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICBpZiAodHJhY2tNZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSkgeworICAgICAgICAgICAgaWYgKCFoYXNBdWRpbyAmJiAhc3RybmNhc2VjbXAoImF1ZGlvLyIsIG1pbWUsIDYpKSB7CisgICAgICAgICAgICAgICAgaGFzQXVkaW8gPSB0cnVlOworCisgICAgICAgICAgICAgICAgaWYgKCF0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5Qml0UmF0ZSwgJmF1ZGlvQml0cmF0ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9CaXRyYXRlID0gLTE7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlID0gLTE7CisgICAgICAgICAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlID0gLTE7CisgICAgICAgICAgICAgICAgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleUJpdHNQZXJTYW1wbGUsICZiaXRzUGVyU2FtcGxlKTsKKyAgICAgICAgICAgICAgICB0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgJnNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgIGlmIChiaXRzUGVyU2FtcGxlID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsIGJpdHNQZXJTYW1wbGUpOworICAgICAgICAgICAgICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9CSVRTX1BFUl9TQU1QTEUsIFN0cmluZzgodG1wKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChzYW1wbGVSYXRlID49IDApIHsKKyAgICAgICAgICAgICAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsIHNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9TQU1QTEVSQVRFLCBTdHJpbmc4KHRtcCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWhhc1ZpZGVvICYmICFzdHJuY2FzZWNtcCgidmlkZW8vIiwgbWltZSwgNikpIHsKKyAgICAgICAgICAgICAgICBoYXNWaWRlbyA9IHRydWU7CisKKyAgICAgICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ2aWRlb1dpZHRoKSk7CisgICAgICAgICAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJnZpZGVvSGVpZ2h0KSk7CisgICAgICAgICAgICAgICAgaWYgKCF0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZyb3RhdGlvbkFuZ2xlKSkgeworICAgICAgICAgICAgICAgICAgICByb3RhdGlvbkFuZ2xlID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCF0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5RnJhbWVDb3VudCwgJnZpZGVvRnJhbWVDb3VudCkpIHsKKyAgICAgICAgICAgICAgICAgICAgdmlkZW9GcmFtZUNvdW50ID0gMDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBwYXJzZUNvbG9yQXNwZWN0cyh0cmFja01ldGEpOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAoImltYWdlLyIsIG1pbWUsIDYpKSB7CisgICAgICAgICAgICAgICAgaW50MzJfdCBpc1ByaW1hcnk7CisgICAgICAgICAgICAgICAgaWYgKHRyYWNrTWV0YS0+ZmluZEludDMyKAorICAgICAgICAgICAgICAgICAgICAgICAga0tleVRyYWNrSXNEZWZhdWx0LCAmaXNQcmltYXJ5KSAmJiBpc1ByaW1hcnkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VQcmltYXJ5ID0gaW1hZ2VDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmaW1hZ2VXaWR0aCkpOworICAgICAgICAgICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaW1hZ2VIZWlnaHQpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCF0cmFja01ldGEtPmZpbmRJbnQzMihrS2V5Um90YXRpb24sICZpbWFnZVJvdGF0aW9uKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VSb3RhdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaW1hZ2VDb3VudCsrOworICAgICAgICAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9URVhUXzNHUFApKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbGFuZzsKKyAgICAgICAgICAgICAgICBpZiAodHJhY2tNZXRhLT5maW5kQ1N0cmluZyhrS2V5TWVkaWFMYW5ndWFnZSwgJmxhbmcpKSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVkVGV4dExhbmcuYXBwZW5kKFN0cmluZzgobGFuZykpOworICAgICAgICAgICAgICAgICAgICB0aW1lZFRleHRMYW5nLmFwcGVuZChTdHJpbmc4KCI6IikpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJObyBsYW5ndWFnZSBmb3VuZCBmb3IgdGltZWQgdGV4dCIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFRvIHNhdmUgdGhlIGxhbmd1YWdlIGNvZGVzIGZvciBhbGwgdGltZWQgdGV4dCB0cmFja3MKKyAgICAvLyBJZiBtdWx0aXBsZSB0ZXh0IHRyYWNrcyBwcmVzZW50LCB0aGUgZm9ybWF0IHdpbGwgbG9vaworICAgIC8vIGxpa2UgImVuZzpjaGkiCisgICAgaWYgKCF0aW1lZFRleHRMYW5nLmlzRW1wdHkoKSkgeworICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9USU1FRF9URVhUX0xBTkdVQUdFUywgdGltZWRUZXh0TGFuZyk7CisgICAgfQorCisgICAgLy8gVGhlIGR1cmF0aW9uIHZhbHVlIGlzIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZHVyYXRpb24gaW4gbXMuCisgICAgc3ByaW50Zih0bXAsICIlIiBQUklkNjQsIChtYXhEdXJhdGlvblVzICsgNTAwKSAvIDEwMDApOworICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0RVUkFUSU9OLCBTdHJpbmc4KHRtcCkpOworCisgICAgaWYgKGhhc0F1ZGlvKSB7CisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0hBU19BVURJTywgU3RyaW5nOCgieWVzIikpOworICAgIH0KKworICAgIGlmIChoYXNWaWRlbykgeworICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9IQVNfVklERU8sIFN0cmluZzgoInllcyIpKTsKKworICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgdmlkZW9XaWR0aCk7CisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX1ZJREVPX1dJRFRILCBTdHJpbmc4KHRtcCkpOworCisgICAgICAgIHNwcmludGYodG1wLCAiJWQiLCB2aWRlb0hlaWdodCk7CisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX1ZJREVPX0hFSUdIVCwgU3RyaW5nOCh0bXApKTsKKworICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgcm90YXRpb25BbmdsZSk7CisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX1ZJREVPX1JPVEFUSU9OLCBTdHJpbmc4KHRtcCkpOworCisgICAgICAgIGlmICh2aWRlb0ZyYW1lQ291bnQgPiAwKSB7CisgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgdmlkZW9GcmFtZUNvdW50KTsKKyAgICAgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX1ZJREVPX0ZSQU1FX0NPVU5ULCBTdHJpbmc4KHRtcCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGltYWdlQ291bnQgPiAwKSB7CisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0hBU19JTUFHRSwgU3RyaW5nOCgieWVzIikpOworCisgICAgICAgIHNwcmludGYodG1wLCAiJWQiLCBpbWFnZUNvdW50KTsKKyAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfSU1BR0VfQ09VTlQsIFN0cmluZzgodG1wKSk7CisKKyAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsIGltYWdlUHJpbWFyeSk7CisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0lNQUdFX1BSSU1BUlksIFN0cmluZzgodG1wKSk7CisKKyAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsIGltYWdlV2lkdGgpOworICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9JTUFHRV9XSURUSCwgU3RyaW5nOCh0bXApKTsKKworICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgaW1hZ2VIZWlnaHQpOworICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9JTUFHRV9IRUlHSFQsIFN0cmluZzgodG1wKSk7CisKKyAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsIGltYWdlUm90YXRpb24pOworICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9JTUFHRV9ST1RBVElPTiwgU3RyaW5nOCh0bXApKTsKKyAgICB9CisKKyAgICBpZiAobnVtVHJhY2tzID09IDEgJiYgaGFzQXVkaW8gJiYgYXVkaW9CaXRyYXRlID49IDApIHsKKyAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsIGF1ZGlvQml0cmF0ZSk7CisgICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0JJVFJBVEUsIFN0cmluZzgodG1wKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb2ZmNjRfdCBzb3VyY2VTaXplOworICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMICYmIG1Tb3VyY2UtPmdldFNpemUoJnNvdXJjZVNpemUpID09IE9LKSB7CisgICAgICAgICAgICBpbnQ2NF90IGF2Z0JpdFJhdGUgPSAoaW50NjRfdCkoc291cmNlU2l6ZSAqIDhFNiAvIG1heER1cmF0aW9uVXMpOworCisgICAgICAgICAgICBzcHJpbnRmKHRtcCwgIiUiIFBSSWQ2NCwgYXZnQml0UmF0ZSk7CisgICAgICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9CSVRSQVRFLCBTdHJpbmc4KHRtcCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG51bVRyYWNrcyA9PSAxKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVNSU1FOworCisgICAgICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZmaWxlTUlNRSkgJiYKKyAgICAgICAgICAgICAgICAhc3RyY2FzZWNtcChmaWxlTUlNRSwgInZpZGVvL3gtbWF0cm9za2EiKSkgeworICAgICAgICAgICAgc3A8TWV0YURhdGE+IHRyYWNrTWV0YSA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoMCk7CisgICAgICAgICAgICBjb25zdCBjaGFyICp0cmFja01JTUU7CisgICAgICAgICAgICBpZiAodHJhY2tNZXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJnRyYWNrTUlNRSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgiYXVkaW8vIiwgdHJhY2tNSU1FLCA2KSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSBtYXRyb3NrYSBmaWxlIG9ubHkgY29udGFpbnMgYSBzaW5nbGUgYXVkaW8gdHJhY2ssCisgICAgICAgICAgICAgICAgLy8gcmV3cml0ZSBpdHMgbWltZSB0eXBlLgorICAgICAgICAgICAgICAgIG1NZXRhRGF0YS5hZGQoCisgICAgICAgICAgICAgICAgICAgICAgICBNRVRBREFUQV9LRVlfTUlNRVRZUEUsIFN0cmluZzgoImF1ZGlvL3gtbWF0cm9za2EiKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6Y2xlYXJNZXRhZGF0YSgpIHsKKyAgICBtUGFyc2VkTWV0YURhdGEgPSBmYWxzZTsKKyAgICBtTWV0YURhdGEuY2xlYXIoKTsKKyAgICBkZWxldGUgbUFsYnVtQXJ0OworICAgIG1BbGJ1bUFydCA9IE5VTEw7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTA2NzdhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaApAQCAtMCwwICsxLDg2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTVEFHRUZSSUdIVF9NRVRBREFUQV9SRVRSSUVWRVJfSF8KKworI2RlZmluZSBTVEFHRUZSSUdIVF9NRVRBREFUQV9SRVRSSUVWRVJfSF8KKworI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3Rvci5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhTWV0YWRhdGFSZXRyaWV2ZXJJbnRlcmZhY2UuaD4KKworI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGF0YVNvdXJjZTsKK3N0cnVjdCBJbWFnZURlY29kZXI7CitzdHJ1Y3QgRnJhbWVSZWN0OworCitzdHJ1Y3QgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlciA6IHB1YmxpYyBNZWRpYU1ldGFkYXRhUmV0cmlldmVyQmFzZSB7CisgICAgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcigpOworICAgIHZpcnR1YWwgflN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIoKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCisgICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCisgICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiYgc291cmNlLCBjb25zdCBjaGFyICptaW1lKTsKKworICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gZ2V0RnJhbWVBdFRpbWUoCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KTsKKyAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldEltYWdlQXRJbmRleCgKKyAgICAgICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5LCBib29sIHRodW1ibmFpbCk7CisgICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRJbWFnZVJlY3RBdEluZGV4KAorICAgICAgICAgICAgaW50IGluZGV4LCBpbnQgY29sb3JGb3JtYXQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVBdEluZGV4KAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3A8SU1lbW9yeT4gPiogZnJhbWVzLAorICAgICAgICAgICAgaW50IGZyYW1lSW5kZXgsIGludCBudW1GcmFtZXMsIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSk7CisKKyAgICB2aXJ0dWFsIE1lZGlhQWxidW1BcnQgKmV4dHJhY3RBbGJ1bUFydCgpOworICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZXh0cmFjdE1ldGFkYXRhKGludCBrZXlDb2RlKTsKKworcHJpdmF0ZToKKyAgICBzcDxEYXRhU291cmNlPiBtU291cmNlOworICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gbUV4dHJhY3RvcjsKKworICAgIGJvb2wgbVBhcnNlZE1ldGFEYXRhOworICAgIEtleWVkVmVjdG9yPGludCwgU3RyaW5nOD4gbU1ldGFEYXRhOworICAgIE1lZGlhQWxidW1BcnQgKm1BbGJ1bUFydDsKKworICAgIHNwPEltYWdlRGVjb2Rlcj4gbUltYWdlRGVjb2RlcjsKKyAgICBpbnQgbUxhc3RJbWFnZUluZGV4OworICAgIHZvaWQgcGFyc2VNZXRhRGF0YSgpOworICAgIHZvaWQgcGFyc2VDb2xvckFzcGVjdHMoY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKKyAgICAvLyBEZWxldGUgYWxidW0gYXJ0IGFuZCBjbGVhciBtZXRhZGF0YS4KKyAgICB2b2lkIGNsZWFyTWV0YWRhdGEoKTsKKworICAgIHN0YXR1c190IGdldEZyYW1lSW50ZXJuYWwoCisgICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG51bUZyYW1lcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5LAorICAgICAgICAgICAgc3A8SU1lbW9yeT4qIG91dEZyYW1lLCBzdGQ6OnZlY3RvcjxzcDxJTWVtb3J5PiA+KiBvdXRGcmFtZXMpOworICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gZ2V0SW1hZ2VJbnRlcm5hbCgKKyAgICAgICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5LCBib29sIHRodW1ibmFpbCwgRnJhbWVSZWN0KiByZWN0KTsKKworICAgIFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIoY29uc3QgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlciAmKTsKKworICAgIFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIgJm9wZXJhdG9yPSgKKyAgICAgICAgICAgIGNvbnN0IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIgJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFNUQUdFRlJJR0hUX01FVEFEQVRBX1JFVFJJRVZFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuY3BwCmluZGV4IGUzYWUwMmUuLjYzNjgxZmEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9JQ2FtZXJhLmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KQEAgLTQ2LDYgKzQ3LDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUHJvZmlsZXMuaD4KICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhUGFyYW1ldGVycy5oPgpAQCAtMTE2LDcgKzExOCw5IEBACiAgICAgICBtVmlkZW9Tb3VyY2UoVklERU9fU09VUkNFX0xJU1RfRU5EKSwKICAgICAgIG1TdGFydGVkKGZhbHNlKSwKICAgICAgIG1TZWxlY3RlZERldmljZUlkKEFVRElPX1BPUlRfSEFORExFX05PTkUpLAotICAgICAgbURldmljZUNhbGxiYWNrRW5hYmxlZChmYWxzZSkgeworICAgICAgbURldmljZUNhbGxiYWNrRW5hYmxlZChmYWxzZSksCisgICAgICBtU2VsZWN0ZWRNaWNEaXJlY3Rpb24oTUlDX0RJUkVDVElPTl9VTlNQRUNJRklFRCksCisgICAgICBtU2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbihNSUNfRklFTERfRElNRU5TSU9OX05PUk1BTCkgewogCiAgICAgQUxPR1YoIkNvbnN0cnVjdG9yIik7CiAKQEAgLTE2MCw5ICsxNjQsMTIgQEAKICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1JlY29yZGVyVmlkZW9JZnJhbWVJbnRlcnZhbCwgbUlGcmFtZXNJbnRlcnZhbFNlYyk7CiAgICAgLy8gVEJEIG1BdWRpb1NvdXJjZU5vZGUgPSAwOwogICAgIC8vIFRCRCBtVXNlNjRCaXRGaWxlT2Zmc2V0ID0gZmFsc2U7Ci0gICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtSZWNvcmRlck1vdmllVGltZXNjYWxlLCBtTW92aWVUaW1lU2NhbGUpOwotICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUmVjb3JkZXJBdWRpb1RpbWVzY2FsZSwgbUF1ZGlvVGltZVNjYWxlKTsKLSAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1JlY29yZGVyVmlkZW9UaW1lc2NhbGUsIG1WaWRlb1RpbWVTY2FsZSk7CisgICAgaWYgKG1Nb3ZpZVRpbWVTY2FsZSAhPSAtMSkKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtSZWNvcmRlck1vdmllVGltZXNjYWxlLCBtTW92aWVUaW1lU2NhbGUpOworICAgIGlmIChtQXVkaW9UaW1lU2NhbGUgIT0gLTEpCisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUmVjb3JkZXJBdWRpb1RpbWVzY2FsZSwgbUF1ZGlvVGltZVNjYWxlKTsKKyAgICBpZiAobVZpZGVvVGltZVNjYWxlICE9IC0xKQorICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1JlY29yZGVyVmlkZW9UaW1lc2NhbGUsIG1WaWRlb1RpbWVTY2FsZSk7CiAgICAgLy8gVEJEIG1DYW1lcmFJZCAgICAgICAgPSAwOwogICAgIC8vIFRCRCBtU3RhcnRUaW1lT2Zmc2V0TXMgPSAtMTsKICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa1JlY29yZGVyVmlkZW9Qcm9maWxlLCBtVmlkZW9FbmNvZGVyUHJvZmlsZSk7CkBAIC0yMDEsNyArMjA4LDcgQEAKICAgICB9CiAgICAgbUFuYWx5dGljc0RpcnR5ID0gZmFsc2U7CiAgICAgaWYgKHJlaW5pdGlhbGl6ZSkgewotICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0tleVJlY29yZGVyKTsKKyAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZShrS2V5UmVjb3JkZXIpOwogICAgIH0KIH0KIApAQCAtMzk2LDE0ICs0MDMsMTUgQEAKICAgICAgICAgcmV0dXJuIC1FQkFERjsKICAgICB9CiAKLSAgICAvLyBzdGFydCB3aXRoIGEgY2xlYW4sIGVtcHR5IGZpbGUKLSAgICBmdHJ1bmNhdGUoZmQsIDApOwotICAgIGludCBuZXh0RmQgPSBkdXAoZmQpOwotICAgIGlmIChtV3JpdGVyID09IE5VTEwpIHsKKyAgICBpZiAobVdyaXRlciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCJzZXROZXh0T3V0cHV0RmlsZSBmYWlsZWQuIFdyaXRlciBoYXMgYmVlbiBmcmVlZCIpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIHJldHVybiBtV3JpdGVyLT5zZXROZXh0RmQobmV4dEZkKTsKKworICAgIC8vIHN0YXJ0IHdpdGggYSBjbGVhbiwgZW1wdHkgZmlsZQorICAgIGZ0cnVuY2F0ZShmZCwgMCk7CisKKyAgICByZXR1cm4gbVdyaXRlci0+c2V0TmV4dEZkKGZkKTsKIH0KIAogLy8gQXR0ZW1wdCB0byBwYXJzZSBhbiBmbG9hdCBsaXRlcmFsIG9wdGlvbmFsbHkgc3Vycm91bmRlZCBieSB3aGl0ZXNwYWNlLApAQCAtOTQ4LDYgKzk1NiwxMCBAQAogICAgICAgICAgICAgc3RhdHVzID0gc2V0dXBNUEVHMlRTUmVjb3JkaW5nKCk7CiAgICAgICAgICAgICBicmVhazsKIAorICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfT0dHOgorICAgICAgICAgICAgc3RhdHVzID0gc2V0dXBPZ2dSZWNvcmRpbmcoKTsKKyAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgb3V0cHV0IGZpbGUgZm9ybWF0OiAlZCIsIG1PdXRwdXRGb3JtYXQpOwogICAgICAgICAgICAgc3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKQEAgLTEwMTMsNiArMTAyNSw3IEBACiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9BQUNfQURUUzoKICAgICAgICAgY2FzZSBPVVRQVVRfRk9STUFUX1JUUF9BVlA6CiAgICAgICAgIGNhc2UgT1VUUFVUX0ZPUk1BVF9NUEVHMlRTOgorICAgICAgICBjYXNlIE9VVFBVVF9GT1JNQVRfT0dHOgogICAgICAgICB7CiAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG5ldyBNZXRhRGF0YTsKICAgICAgICAgICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBzeXN0ZW1UaW1lKCkgLyAxMDAwOwpAQCAtMTA4Myw3ICsxMDk2LDkgQEAKICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICBtQ2xpZW50VWlkLAogICAgICAgICAgICAgICAgIG1DbGllbnRQaWQsCi0gICAgICAgICAgICAgICAgbVNlbGVjdGVkRGV2aWNlSWQpOworICAgICAgICAgICAgICAgIG1TZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgIG1TZWxlY3RlZE1pY0RpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICBtU2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbik7CiAKICAgICBzdGF0dXNfdCBlcnIgPSBhdWRpb1NvdXJjZS0+aW5pdENoZWNrKCk7CiAKQEAgLTExMTMsNiArMTEyOCw5IEBACiAgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CiAgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJhYWMtcHJvZmlsZSIsIE9NWF9BVURJT19BQUNPYmplY3RFTEQpOwogICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9PUFVTOgorICAgICAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKTsKKyAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBhdWRpbyBlbmNvZGVyOiAlZCIsIG1BdWRpb0VuY29kZXIpOwpAQCAtMTE2OSw2ICsxMTg3LDEzIEBACiAgICAgcmV0dXJuIHNldHVwUmF3QXVkaW9SZWNvcmRpbmcoKTsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0dXBPZ2dSZWNvcmRpbmcoKSB7CisgICAgQ0hFQ0tfRVEobU91dHB1dEZvcm1hdCwgT1VUUFVUX0ZPUk1BVF9PR0cpOworCisgICAgbVdyaXRlciA9IG5ldyBPZ2dXcml0ZXIobU91dHB1dEZkKTsKKyAgICByZXR1cm4gc2V0dXBSYXdBdWRpb1JlY29yZGluZygpOworfQorCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpzZXR1cEFNUlJlY29yZGluZygpIHsKICAgICBDSEVDSyhtT3V0cHV0Rm9ybWF0ID09IE9VVFBVVF9GT1JNQVRfQU1SX05CIHx8CiAgICAgICAgICAgbU91dHB1dEZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0FNUl9XQik7CkBAIC0xNzQ1LDEzICsxNzcwLDI2IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICAvLyBFbmFibGUgdGVtcG9yYWwgbGF5ZXJpbmcgaWYgdGhlIGV4cGVjdGVkIChtYXgpIHBsYXliYWNrIGZyYW1lIHJhdGUgaXMgZ3JlYXRlciB0aGFuIH4xMSUgb2YKKyAgICAvLyB0aGUgbWluaW11bSBkaXNwbGF5IHJlZnJlc2ggcmF0ZSBvbiBhIHR5cGljYWwgZGV2aWNlLiBBZGQgbGF5ZXJzIHVudGlsIHRoZSBiYXNlIGxheWVyIGZhbGxzCisgICAgLy8gdW5kZXIgdGhpcyBsaW1pdC4gQWxsb3cgZGV2aWNlIG1hbnVmYWN0dXJlcnMgdG8gb3ZlcnJpZGUgdGhpcyBsaW1pdC4KKworICAgIC8vIFRPRE86IG1ha2UgdGhpcyBjb25maWd1cmFibGUgYnkgdGhlIGFwcGxpY2F0aW9uCisgICAgc3RkOjpzdHJpbmcgbWF4QmFzZUxheWVyRnBzUHJvcGVydHkgPQorICAgICAgICA6OmFuZHJvaWQ6OmJhc2U6OkdldFByb3BlcnR5KCJyby5tZWRpYS5yZWNvcmRlci1tYXgtYmFzZS1sYXllci1mcHMiLCAiIik7CisgICAgZmxvYXQgbWF4QmFzZUxheWVyRnBzID0gKGZsb2F0KTo6YXRvZihtYXhCYXNlTGF5ZXJGcHNQcm9wZXJ0eS5jX3N0cigpKTsKKyAgICAvLyBUUklDS1k6IHVzZSAhPiB0byBmaXggdXAgYW55IE5hTiB2YWx1ZXMKKyAgICBpZiAoIShtYXhCYXNlTGF5ZXJGcHMgPj0ga01pblR5cGljYWxEaXNwbGF5UmVmcmVzaGluZ1JhdGUgLyAwLjkpKSB7CisgICAgICAgIG1heEJhc2VMYXllckZwcyA9IGtNaW5UeXBpY2FsRGlzcGxheVJlZnJlc2hpbmdSYXRlIC8gMC45OworICAgIH0KKwogICAgIGZvciAodWludDMyX3QgdHJ5TGF5ZXJzID0gMTsgdHJ5TGF5ZXJzIDw9IGtNYXhOdW1WaWRlb1RlbXBvcmFsTGF5ZXJzOyArK3RyeUxheWVycykgewogICAgICAgICBpZiAodHJ5TGF5ZXJzID4gdHNMYXllcnMpIHsKICAgICAgICAgICAgIHRzTGF5ZXJzID0gdHJ5TGF5ZXJzOwogICAgICAgICB9CiAgICAgICAgIC8vIGtlZXAgZ29pbmcgdW50aWwgdGhlIGJhc2UgbGF5ZXIgZnBzIGZhbGxzIGJlbG93IHRoZSB0eXBpY2FsIGRpc3BsYXkgcmVmcmVzaCByYXRlCiAgICAgICAgIGZsb2F0IGJhc2VMYXllckZwcyA9IG1heFBsYXliYWNrRnBzIC8gKDEgPDwgKHRyeUxheWVycyAtIDEpKTsKLSAgICAgICAgaWYgKGJhc2VMYXllckZwcyA8IGtNaW5UeXBpY2FsRGlzcGxheVJlZnJlc2hpbmdSYXRlIC8gMC45KSB7CisgICAgICAgIGlmIChiYXNlTGF5ZXJGcHMgPCBtYXhCYXNlTGF5ZXJGcHMpIHsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtMTgxMyw2ICsxODUxLDcgQEAKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FBQzoKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0hFX0FBQzoKICAgICAgICAgY2FzZSBBVURJT19FTkNPREVSX0FBQ19FTEQ6CisgICAgICAgIGNhc2UgQVVESU9fRU5DT0RFUl9PUFVTOgogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKQEAgLTE4NjMsMTkgKzE5MDIsMTggQEAKICAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtVmlkZW9CaXRSYXRlOwogICAgIH0KIAotICAgIGlmIChtT3V0cHV0Rm9ybWF0ICE9IE9VVFBVVF9GT1JNQVRfV0VCTSkgewotICAgICAgICAvLyBBdWRpbyBzb3VyY2UgaXMgYWRkZWQgYXQgdGhlIGVuZCBpZiBpdCBleGlzdHMuCi0gICAgICAgIC8vIFRoaXMgaGVscCBtYWtlIHN1cmUgdGhhdCB0aGUgInJlY29kaW5nIiBzb3VuZCBpcyBzdXBwcmVzc2VkIGZvcgotICAgICAgICAvLyBjYW1jb3JkZXIgYXBwbGljYXRpb25zIGluIHRoZSByZWNvcmRlZCBmaWxlcy4KLSAgICAgICAgLy8gVE9ETyBBdWRpbyBzb3VyY2UgaXMgY3VycmVudGx5IHVuc3VwcG9ydGVkIGZvciB3ZWJtIG91dHB1dDsgdm9yYmlzIGVuY29kZXIgbmVlZGVkLgotICAgICAgICAvLyBkaXNhYmxlIGF1ZGlvIGZvciB0aW1lIGxhcHNlIHJlY29yZGluZwotICAgICAgICBib29sIGRpc2FibGVBdWRpbyA9IG1DYXB0dXJlRnBzRW5hYmxlICYmIG1DYXB0dXJlRnBzIDwgbUZyYW1lUmF0ZTsKLSAgICAgICAgaWYgKCFkaXNhYmxlQXVkaW8gJiYgbUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpIHsKLSAgICAgICAgICAgIGVyciA9IHNldHVwQXVkaW9FbmNvZGVyKHdyaXRlcik7Ci0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSByZXR1cm4gZXJyOwotICAgICAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOwotICAgICAgICB9CisgICAgLy8gQXVkaW8gc291cmNlIGlzIGFkZGVkIGF0IHRoZSBlbmQgaWYgaXQgZXhpc3RzLgorICAgIC8vIFRoaXMgaGVscCBtYWtlIHN1cmUgdGhhdCB0aGUgInJlY29kaW5nIiBzb3VuZCBpcyBzdXBwcmVzc2VkIGZvcgorICAgIC8vIGNhbWNvcmRlciBhcHBsaWNhdGlvbnMgaW4gdGhlIHJlY29yZGVkIGZpbGVzLgorICAgIC8vIGRpc2FibGUgYXVkaW8gZm9yIHRpbWUgbGFwc2UgcmVjb3JkaW5nCisgICAgY29uc3QgYm9vbCBkaXNhYmxlQXVkaW8gPSBtQ2FwdHVyZUZwc0VuYWJsZSAmJiBtQ2FwdHVyZUZwcyA8IG1GcmFtZVJhdGU7CisgICAgaWYgKCFkaXNhYmxlQXVkaW8gJiYgbUF1ZGlvU291cmNlICE9IEFVRElPX1NPVVJDRV9DTlQpIHsKKyAgICAgICAgZXJyID0gc2V0dXBBdWRpb0VuY29kZXIod3JpdGVyKTsKKyAgICAgICAgaWYgKGVyciAhPSBPSykgcmV0dXJuIGVycjsKKyAgICAgICAgbVRvdGFsQml0UmF0ZSArPSBtQXVkaW9CaXRSYXRlOworICAgIH0KIAorICAgIGlmIChtT3V0cHV0Rm9ybWF0ICE9IE9VVFBVVF9GT1JNQVRfV0VCTSkgewogICAgICAgICBpZiAobUNhcHR1cmVGcHNFbmFibGUpIHsKICAgICAgICAgICAgIG1wNHdyaXRlci0+c2V0Q2FwdHVyZVJhdGUobUNhcHR1cmVGcHMpOwogICAgICAgICB9CkBAIC0yMTc1LDcgKzIyMTMsNyBAQAogfQogCiBzdGF0dXNfdCBTdGFnZWZyaWdodFJlY29yZGVyOjpnZXRNZXRyaWNzKFBhcmNlbCAqcmVwbHkpIHsKLSAgICBBTE9HRCgiU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Z2V0TWV0cmljcyIpOworICAgIEFMT0dWKCJTdGFnZWZyaWdodFJlY29yZGVyOjpnZXRNZXRyaWNzIik7CiAKICAgICBpZiAocmVwbHkgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgiTnVsbCBwb2ludGVyIGFyZ3VtZW50Iik7CkBAIC0yMjM5LDYgKzIyNzcsMzAgQEAKICAgICByZXR1cm4gTk9fSU5JVDsKIH0KIAorc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbikgeworICAgIEFMT0dWKCJzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKCVkKSIsIGRpcmVjdGlvbik7CisgICAgbVNlbGVjdGVkTWljRGlyZWN0aW9uID0gZGlyZWN0aW9uOworICAgIGlmIChtQXVkaW9Tb3VyY2VOb2RlICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb1NvdXJjZU5vZGUtPnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oZGlyZWN0aW9uKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3N0YXR1c190IFN0YWdlZnJpZ2h0UmVjb3JkZXI6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgQUxPR1YoInNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbiglZikiLCB6b29tKTsKKyAgICBtU2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbiA9IHpvb207CisgICAgaWYgKG1BdWRpb1NvdXJjZU5vZGUgIT0gMCkgeworICAgICAgICByZXR1cm4gbUF1ZGlvU291cmNlTm9kZS0+c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKHpvb20pOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6Z2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3QgeworICAgIGlmIChtQXVkaW9Tb3VyY2VOb2RlICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1BdWRpb1NvdXJjZU5vZGUtPmdldFBvcnRJZChwb3J0SWQpOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KIAogc3RhdHVzX3QgU3RhZ2VmcmlnaHRSZWNvcmRlcjo6ZHVtcCgKICAgICAgICAgaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBjb25zdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL1N0YWdlZnJpZ2h0UmVjb3JkZXIuaAppbmRleCBmYWEyZTU5Li44YmYwODNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvU3RhZ2VmcmlnaHRSZWNvcmRlci5oCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9TdGFnZWZyaWdodFJlY29yZGVyLmgKQEAgLTc3LDcgKzc3LDkgQEAKICAgICB2aXJ0dWFsIHZvaWQgc2V0QXVkaW9EZXZpY2VDYWxsYmFjayhjb25zdCBzcDxBdWRpb1N5c3RlbTo6QXVkaW9EZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGVuYWJsZUF1ZGlvRGV2aWNlQ2FsbGJhY2soYm9vbCBlbmFibGVkKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKLQorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CisgICAgICAgICAgICBzdGF0dXNfdCBnZXRQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSBjb25zdCBvdmVycmlkZTsKIAogcHJpdmF0ZToKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwpAQCAtMTU5LDYgKzE2MSw5IEBACiAgICAgYm9vbCBtRGV2aWNlQ2FsbGJhY2tFbmFibGVkOwogICAgIHdwPEF1ZGlvU3lzdGVtOjpBdWRpb0RldmljZUNhbGxiYWNrPiBtQXVkaW9EZXZpY2VDYWxsYmFjazsKIAorICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgbVNlbGVjdGVkTWljRGlyZWN0aW9uOworICAgIGZsb2F0IG1TZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uOworCiAgICAgc3RhdGljIGNvbnN0IGludCBrTWF4SGlnaFNwZWVkRnBzID0gMTAwMDsKIAogICAgIHN0YXR1c190IHByZXBhcmVJbnRlcm5hbCgpOwpAQCAtMTY2LDYgKzE3MSw3IEBACiAgICAgdm9pZCBzZXR1cE1QRUc0b3JXRUJNTWV0YURhdGEoc3A8TWV0YURhdGE+ICptZXRhKTsKICAgICBzdGF0dXNfdCBzZXR1cEFNUlJlY29yZGluZygpOwogICAgIHN0YXR1c190IHNldHVwQUFDUmVjb3JkaW5nKCk7CisgICAgc3RhdHVzX3Qgc2V0dXBPZ2dSZWNvcmRpbmcoKTsKICAgICBzdGF0dXNfdCBzZXR1cFJhd0F1ZGlvUmVjb3JkaW5nKCk7CiAgICAgc3RhdHVzX3Qgc2V0dXBSVFBSZWNvcmRpbmcoKTsKICAgICBzdGF0dXNfdCBzZXR1cE1QRUcyVFNSZWNvcmRpbmcoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9kYXRhc291cmNlL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZGF0YXNvdXJjZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxZmE1MGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZGF0YXNvdXJjZS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDMgQEAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlicGxheWVyc2VydmljZV9kYXRhc291cmNlIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlBsYXllclNlcnZpY2VEYXRhU291cmNlRmFjdG9yeS5jcHAiLAorICAgICAgICAiUGxheWVyU2VydmljZUZpbGVTb3VyY2UuY3BwIiwKKyAgICAgICAgIlBsYXllclNlcnZpY2VNZWRpYUhUVFAuY3BwIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliZGF0YXNvdXJjZSIsCisgICAgICAgICJsaWJkcm1mcmFtZXdvcmsiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWVycm9yPWRlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2RhdGFzb3VyY2UvUGxheWVyU2VydmljZURhdGFTb3VyY2VGYWN0b3J5LmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9kYXRhc291cmNlL1BsYXllclNlcnZpY2VEYXRhU291cmNlRmFjdG9yeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY5NDZlOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9kYXRhc291cmNlL1BsYXllclNlcnZpY2VEYXRhU291cmNlRmFjdG9yeS5jcHAKQEAgLTAsMCArMSw2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlBsYXllclNlcnZ1Y2VEYXRhU291cmNlRmFjdG9yeSIKKworCisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9QbGF5ZXJTZXJ2aWNlRGF0YVNvdXJjZUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxkYXRhc291cmNlL1BsYXllclNlcnZpY2VGaWxlU291cmNlLmg+CisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9QbGF5ZXJTZXJ2aWNlTWVkaWFIVFRQLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK3NwPFBsYXllclNlcnZpY2VEYXRhU291cmNlRmFjdG9yeT4gUGxheWVyU2VydmljZURhdGFTb3VyY2VGYWN0b3J5OjpzSW5zdGFuY2U7CisvLyBzdGF0aWMKK011dGV4IFBsYXllclNlcnZpY2VEYXRhU291cmNlRmFjdG9yeTo6c0luc3RhbmNlTG9jazsKKworLy8gc3RhdGljCitzcDxQbGF5ZXJTZXJ2aWNlRGF0YVNvdXJjZUZhY3Rvcnk+IFBsYXllclNlcnZpY2VEYXRhU291cmNlRmFjdG9yeTo6Z2V0SW5zdGFuY2UoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwoc0luc3RhbmNlTG9jayk7CisgICAgaWYgKCFzSW5zdGFuY2UpIHsKKyAgICAgICAgc0luc3RhbmNlID0gbmV3IFBsYXllclNlcnZpY2VEYXRhU291cmNlRmFjdG9yeSgpOworICAgIH0KKyAgICByZXR1cm4gc0luc3RhbmNlOworfQorCitzcDxEYXRhU291cmNlPiBQbGF5ZXJTZXJ2aWNlRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZU1lZGlhSFRUUCgKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKSB7CisgICAgaWYgKGh0dHBTZXJ2aWNlID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gY29ubiA9IGh0dHBTZXJ2aWNlLT5tYWtlSFRUUENvbm5lY3Rpb24oKTsKKyAgICBpZiAoY29ubiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFrZSBodHRwIGNvbm5lY3Rpb24gZnJvbSBodHRwIHNlcnZpY2UhIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBuZXcgUGxheWVyU2VydmljZU1lZGlhSFRUUChjb25uKTsKKyAgICB9Cit9CisKK3NwPERhdGFTb3VyY2U+IFBsYXllclNlcnZpY2VEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlRmlsZVNvdXJjZShjb25zdCBjaGFyICp1cmkpIHsKKyAgICByZXR1cm4gbmV3IFBsYXllclNlcnZpY2VGaWxlU291cmNlKHVyaSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZGF0YXNvdXJjZS9QbGF5ZXJTZXJ2aWNlRmlsZVNvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZGF0YXNvdXJjZS9QbGF5ZXJTZXJ2aWNlRmlsZVNvdXJjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI0YmE3NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9kYXRhc291cmNlL1BsYXllclNlcnZpY2VGaWxlU291cmNlLmNwcApAQCAtMCwwICsxLDE1OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiUGxheWVyU2VydmljZUZpbGVTb3VyY2UiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxkYXRhc291cmNlL1BsYXllclNlcnZpY2VGaWxlU291cmNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitQbGF5ZXJTZXJ2aWNlRmlsZVNvdXJjZTo6UGxheWVyU2VydmljZUZpbGVTb3VyY2UoY29uc3QgY2hhciAqZmlsZW5hbWUpCisgICAgOiBGaWxlU291cmNlKGZpbGVuYW1lKSwKKyAgICAgIG1EZWNyeXB0SGFuZGxlKE5VTEwpLAorICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCksCisgICAgICBtRHJtQnVmT2Zmc2V0KDApLAorICAgICAgbURybUJ1ZlNpemUoMCksCisgICAgICBtRHJtQnVmKE5VTEwpeworICAgICh2b2lkKSBEcm1Jbml0aWFsaXphdGlvbihudWxscHRyKTsKK30KKworUGxheWVyU2VydmljZUZpbGVTb3VyY2U6OlBsYXllclNlcnZpY2VGaWxlU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKQorICAgIDogRmlsZVNvdXJjZShmZCwgb2Zmc2V0LCBsZW5ndGgpLAorICAgICAgbURlY3J5cHRIYW5kbGUoTlVMTCksCisgICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSwKKyAgICAgIG1Ecm1CdWZPZmZzZXQoMCksCisgICAgICBtRHJtQnVmU2l6ZSgwKSwKKyAgICAgIG1Ecm1CdWYoTlVMTCkgeworICAgICh2b2lkKSBEcm1Jbml0aWFsaXphdGlvbihudWxscHRyKTsKK30KKworUGxheWVyU2VydmljZUZpbGVTb3VyY2U6On5QbGF5ZXJTZXJ2aWNlRmlsZVNvdXJjZSgpIHsKKyAgICBpZiAobURybUJ1ZiAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZVtdIG1Ecm1CdWY7CisgICAgICAgIG1Ecm1CdWYgPSBOVUxMOworICAgIH0KKworICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIC8vIFRvIHJlbGVhc2UgbURlY3J5cHRIYW5kbGUKKyAgICAgICAgQ0hFQ0sobURybU1hbmFnZXJDbGllbnQpOworICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+Y2xvc2VEZWNyeXB0U2Vzc2lvbihtRGVjcnlwdEhhbmRsZSk7CisgICAgICAgIG1EZWNyeXB0SGFuZGxlID0gTlVMTDsKKyAgICB9CisKKyAgICBpZiAobURybU1hbmFnZXJDbGllbnQgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbURybU1hbmFnZXJDbGllbnQ7CisgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gTlVMTDsKKyAgICB9Cit9CisKK3NzaXplX3QgUGxheWVyU2VydmljZUZpbGVTb3VyY2U6OnJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICBpZiAobUZkIDwgMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOworCisgICAgaWYgKG1MZW5ndGggPj0gMCkgeworICAgICAgICBpZiAob2Zmc2V0ID49IG1MZW5ndGgpIHsKKyAgICAgICAgICAgIHJldHVybiAwOyAgLy8gcmVhZCBiZXlvbmQgRU9GLgorICAgICAgICB9CisgICAgICAgIHVpbnQ2NF90IG51bUF2YWlsYWJsZSA9IG1MZW5ndGggLSBvZmZzZXQ7CisgICAgICAgIGlmICgodWludDY0X3Qpc2l6ZSA+IG51bUF2YWlsYWJsZSkgeworICAgICAgICAgICAgc2l6ZSA9IG51bUF2YWlsYWJsZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMICYmIERlY3J5cHRBcGlUeXBlOjpDT05UQUlORVJfQkFTRUQKKyAgICAgICAgICAgID09IG1EZWNyeXB0SGFuZGxlLT5kZWNyeXB0QXBpVHlwZSkgeworICAgICAgICByZXR1cm4gcmVhZEF0RFJNX2wob2Zmc2V0LCBkYXRhLCBzaXplKTsKKyAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiByZWFkQXRfbChvZmZzZXQsIGRhdGEsIHNpemUpOworICAgIH0KK30KKworc3A8RGVjcnlwdEhhbmRsZT4gUGxheWVyU2VydmljZUZpbGVTb3VyY2U6OkRybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIgKm1pbWUpIHsKKyAgICBpZiAoZ2V0dWlkKCkgPT0gQUlEX01FRElBX0VYKSB7CisgICAgICAgcmV0dXJuIE5VTEw7IC8vIG5vIERSTSBpbiBtZWRpYSBleHRyYWN0b3IKKyAgICB9CisgICAgaWYgKG1Ecm1NYW5hZ2VyQ2xpZW50ID09IE5VTEwpIHsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBuZXcgRHJtTWFuYWdlckNsaWVudCgpOworICAgIH0KKworICAgIGlmIChtRHJtTWFuYWdlckNsaWVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChtRGVjcnlwdEhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIG1EZWNyeXB0SGFuZGxlID0gbURybU1hbmFnZXJDbGllbnQtPm9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICAgICAgICAgICAgICBtRmQsIG1PZmZzZXQsIG1MZW5ndGgsIG1pbWUpOworICAgIH0KKworICAgIGlmIChtRGVjcnlwdEhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtRHJtTWFuYWdlckNsaWVudDsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBOVUxMOworICAgIH0KKworICAgIHJldHVybiBtRGVjcnlwdEhhbmRsZTsKK30KKworc3NpemVfdCBQbGF5ZXJTZXJ2aWNlRmlsZVNvdXJjZTo6cmVhZEF0RFJNX2wob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgc2l6ZV90IERSTV9DQUNIRV9TSVpFID0gMTAyNDsKKyAgICBpZiAobURybUJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIG1Ecm1CdWYgPSBuZXcgdW5zaWduZWQgY2hhcltEUk1fQ0FDSEVfU0laRV07CisgICAgfQorCisgICAgaWYgKG1Ecm1CdWYgIT0gTlVMTCAmJiBtRHJtQnVmU2l6ZSA+IDAgJiYgKG9mZnNldCArIG1PZmZzZXQpID49IG1Ecm1CdWZPZmZzZXQKKyAgICAgICAgICAgICYmIChvZmZzZXQgKyBtT2Zmc2V0ICsgc2l6ZSkgPD0gc3RhdGljX2Nhc3Q8c2l6ZV90PihtRHJtQnVmT2Zmc2V0ICsgbURybUJ1ZlNpemUpKSB7CisgICAgICAgIC8qIFVzZSBidWZmZXJlZCBkYXRhICovCisgICAgICAgIG1lbWNweShkYXRhLCAodm9pZCopKG1Ecm1CdWYrKG9mZnNldCttT2Zmc2V0LW1Ecm1CdWZPZmZzZXQpKSwgc2l6ZSk7CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0gZWxzZSBpZiAoc2l6ZSA8PSBEUk1fQ0FDSEVfU0laRSkgeworICAgICAgICAvKiBCdWZmZXIgbmV3IGRhdGEgKi8KKyAgICAgICAgbURybUJ1Zk9mZnNldCA9ICBvZmZzZXQgKyBtT2Zmc2V0OworICAgICAgICBtRHJtQnVmU2l6ZSA9IG1Ecm1NYW5hZ2VyQ2xpZW50LT5wcmVhZChtRGVjcnlwdEhhbmRsZSwgbURybUJ1ZiwKKyAgICAgICAgICAgICAgICBEUk1fQ0FDSEVfU0laRSwgb2Zmc2V0ICsgbU9mZnNldCk7CisgICAgICAgIGlmIChtRHJtQnVmU2l6ZSA+IDApIHsKKyAgICAgICAgICAgIGludDY0X3QgZGF0YVJlYWQgPSAwOworICAgICAgICAgICAgZGF0YVJlYWQgPSBzaXplID4gc3RhdGljX2Nhc3Q8c2l6ZV90PihtRHJtQnVmU2l6ZSkgPyBtRHJtQnVmU2l6ZSA6IHNpemU7CisgICAgICAgICAgICBtZW1jcHkoZGF0YSwgKHZvaWQqKW1Ecm1CdWYsIGRhdGFSZWFkKTsKKyAgICAgICAgICAgIHJldHVybiBkYXRhUmVhZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBtRHJtQnVmU2l6ZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRvbyBiaWcgY2h1bmsgdG8gY2FjaGUuIENhbGwgRFJNIGRpcmVjdGx5ICovCisgICAgICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudC0+cHJlYWQobURlY3J5cHRIYW5kbGUsIGRhdGEsIHNpemUsIG9mZnNldCArIG1PZmZzZXQpOworICAgIH0KK30KKworLyogc3RhdGljICovCitib29sIFBsYXllclNlcnZpY2VGaWxlU291cmNlOjpyZXF1aXJlc0RybShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCwgY29uc3QgY2hhciAqbWltZSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxEcm1NYW5hZ2VyQ2xpZW50PiBkcm1DbGllbnQobmV3IERybU1hbmFnZXJDbGllbnQoKSk7CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gZGVjcnlwdEhhbmRsZSA9CisgICAgICAgICAgICBkcm1DbGllbnQtPm9wZW5EZWNyeXB0U2Vzc2lvbihmZCwgb2Zmc2V0LCBsZW5ndGgsIG1pbWUpOworICAgIGJvb2wgcmVxdWlyZXNEcm0gPSBmYWxzZTsKKyAgICBpZiAoZGVjcnlwdEhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJlcXVpcmVzRHJtID0gZGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUgPT0gRGVjcnlwdEFwaVR5cGU6OkNPTlRBSU5FUl9CQVNFRDsKKyAgICAgICAgZHJtQ2xpZW50LT5jbG9zZURlY3J5cHRTZXNzaW9uKGRlY3J5cHRIYW5kbGUpOworICAgIH0KKyAgICByZXR1cm4gcmVxdWlyZXNEcm07Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZGF0YXNvdXJjZS9QbGF5ZXJTZXJ2aWNlTWVkaWFIVFRQLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9kYXRhc291cmNlL1BsYXllclNlcnZpY2VNZWRpYUhUVFAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OWE4NjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZGF0YXNvdXJjZS9QbGF5ZXJTZXJ2aWNlTWVkaWFIVFRQLmNwcApAQCAtMCwwICsxLDc1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJQbGF5ZXJTZXJ2aWNlTWVkaWFIVFRQIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9QbGF5ZXJTZXJ2aWNlTWVkaWFIVFRQLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Gb3VuZGF0aW9uVXRpbHMuaD4KKworI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUENvbm5lY3Rpb24uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitQbGF5ZXJTZXJ2aWNlTWVkaWFIVFRQOjpQbGF5ZXJTZXJ2aWNlTWVkaWFIVFRQKGNvbnN0IHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKQorICAgIDogTWVkaWFIVFRQKGNvbm4pLAorICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCkgeworICAgICh2b2lkKSBEcm1Jbml0aWFsaXphdGlvbihudWxscHRyKTsKK30KKworUGxheWVyU2VydmljZU1lZGlhSFRUUDo6flBsYXllclNlcnZpY2VNZWRpYUhUVFAoKSB7CisgICAgY2xlYXJEUk1TdGF0ZV9sKCk7Cit9CisKKy8vIERSTS4uLgorCitzcDxEZWNyeXB0SGFuZGxlPiBQbGF5ZXJTZXJ2aWNlTWVkaWFIVFRQOjpEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICptaW1lKSB7CisgICAgaWYgKG1Ecm1NYW5hZ2VyQ2xpZW50ID09IE5VTEwpIHsKKyAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBuZXcgRHJtTWFuYWdlckNsaWVudCgpOworICAgIH0KKworICAgIGlmIChtRHJtTWFuYWdlckNsaWVudCA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGlmIChtRGVjcnlwdEhhbmRsZSA9PSBOVUxMKSB7CisgICAgICAgIG1EZWNyeXB0SGFuZGxlID0gbURybU1hbmFnZXJDbGllbnQtPm9wZW5EZWNyeXB0U2Vzc2lvbigKKyAgICAgICAgICAgICAgICBTdHJpbmc4KG1MYXN0VVJJLmNfc3RyKCkpLCBtaW1lKTsKKyAgICB9CisKKyAgICBpZiAobURlY3J5cHRIYW5kbGUgPT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbURybU1hbmFnZXJDbGllbnQ7CisgICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gTlVMTDsKKyAgICB9CisKKyAgICByZXR1cm4gbURlY3J5cHRIYW5kbGU7Cit9CisKK3ZvaWQgUGxheWVyU2VydmljZU1lZGlhSFRUUDo6Y2xlYXJEUk1TdGF0ZV9sKCkgeworICAgIGlmIChtRGVjcnlwdEhhbmRsZSAhPSBOVUxMKSB7CisgICAgICAgIC8vIFRvIHJlbGVhc2UgbURlY3J5cHRIYW5kbGUKKyAgICAgICAgQ0hFQ0sobURybU1hbmFnZXJDbGllbnQpOworICAgICAgICBtRHJtTWFuYWdlckNsaWVudC0+Y2xvc2VEZWNyeXB0U2Vzc2lvbihtRGVjcnlwdEhhbmRsZSk7CisgICAgICAgIG1EZWNyeXB0SGFuZGxlID0gTlVMTDsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZGF0YXNvdXJjZS9pbmNsdWRlL2RhdGFzb3VyY2UvUGxheWVyU2VydmljZURhdGFTb3VyY2VGYWN0b3J5LmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZGF0YXNvdXJjZS9pbmNsdWRlL2RhdGFzb3VyY2UvUGxheWVyU2VydmljZURhdGFTb3VyY2VGYWN0b3J5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Q1OGM1YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9kYXRhc291cmNlL2luY2x1ZGUvZGF0YXNvdXJjZS9QbGF5ZXJTZXJ2aWNlRGF0YVNvdXJjZUZhY3RvcnkuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBQTEFZRVJfU0VSVklDRV9EQVRBX1NPVVJDRV9GQUNUT1JZX0hfCisKKyNkZWZpbmUgUExBWUVSX1NFUlZJQ0VfREFUQV9TT1VSQ0VfRkFDVE9SWV9IXworCisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9EYXRhU291cmNlRmFjdG9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE1lZGlhSFRUUFNlcnZpY2U7CitjbGFzcyBTdHJpbmc4Oworc3RydWN0IEhUVFBCYXNlOworCitjbGFzcyBQbGF5ZXJTZXJ2aWNlRGF0YVNvdXJjZUZhY3RvcnkgOiBwdWJsaWMgRGF0YVNvdXJjZUZhY3RvcnkgeworcHVibGljOgorICAgIHN0YXRpYyBzcDxQbGF5ZXJTZXJ2aWNlRGF0YVNvdXJjZUZhY3Rvcnk+IGdldEluc3RhbmNlKCk7CisgICAgdmlydHVhbCBzcDxEYXRhU291cmNlPiBDcmVhdGVNZWRpYUhUVFAoY29uc3Qgc3A8TWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlKTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgc3A8RGF0YVNvdXJjZT4gQ3JlYXRlRmlsZVNvdXJjZShjb25zdCBjaGFyICp1cmkpOworCitwcml2YXRlOgorICAgIHN0YXRpYyBzcDxQbGF5ZXJTZXJ2aWNlRGF0YVNvdXJjZUZhY3Rvcnk+IHNJbnN0YW5jZTsKKyAgICBzdGF0aWMgTXV0ZXggc0luc3RhbmNlTG9jazsKKyAgICBQbGF5ZXJTZXJ2aWNlRGF0YVNvdXJjZUZhY3RvcnkoKSB7fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gUExBWUVSX1NFUlZJQ0VfREFUQV9TT1VSQ0VfRkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2RhdGFzb3VyY2UvaW5jbHVkZS9kYXRhc291cmNlL1BsYXllclNlcnZpY2VGaWxlU291cmNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZGF0YXNvdXJjZS9pbmNsdWRlL2RhdGFzb3VyY2UvUGxheWVyU2VydmljZUZpbGVTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWU4ZGRhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2RhdGFzb3VyY2UvaW5jbHVkZS9kYXRhc291cmNlL1BsYXllclNlcnZpY2VGaWxlU291cmNlLmgKQEAgLTAsMCArMSw2MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgUExBWUVSX1NFUlZJQ0VfRklMRV9TT1VSQ0VfSF8KKworI2RlZmluZSBQTEFZRVJfU0VSVklDRV9GSUxFX1NPVVJDRV9IXworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGRhdGFzb3VyY2UvRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorI2luY2x1ZGUgPGRybS9Ecm1NYW5hZ2VyQ2xpZW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gRmlsZVNvdXJjZSBpbXBsZW1lbnRhdGlvbiB3aGljaCB3b3JrcyBvbiBNZWRpYVBsYXllclNlcnZpY2UuCisvLyBTdXBwb3J0cyBPTUEoZm9yd29yZC1sb2NrKSBmaWxlcy4KK2NsYXNzIFBsYXllclNlcnZpY2VGaWxlU291cmNlIDogcHVibGljIEZpbGVTb3VyY2UgeworcHVibGljOgorICAgIFBsYXllclNlcnZpY2VGaWxlU291cmNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKTsKKyAgICAvLyBQbGF5ZXJTZXJ2aWNlRmlsZVNvdXJjZSB0YWtlcyBvd25lcnNoaXAgYW5kIHdpbGwgY2xvc2UgdGhlIGZkCisgICAgUGxheWVyU2VydmljZUZpbGVTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOworCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgICAgc3RhdGljIGJvb2wgcmVxdWlyZXNEcm0oaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIgKm1pbWUpOworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+UGxheWVyU2VydmljZUZpbGVTb3VyY2UoKTsKKworcHJpdmF0ZToKKyAgICAvKmZvciBEUk0qLworICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOworICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OworICAgIGludDY0X3QgbURybUJ1Zk9mZnNldDsKKyAgICBzc2l6ZV90IG1Ecm1CdWZTaXplOworICAgIHVuc2lnbmVkIGNoYXIgKm1Ecm1CdWY7CisKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICptaW1lKTsKKyAgICBzc2l6ZV90IHJlYWRBdERSTV9sKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKKyAgICBQbGF5ZXJTZXJ2aWNlRmlsZVNvdXJjZShjb25zdCBQbGF5ZXJTZXJ2aWNlRmlsZVNvdXJjZSAmKTsKKyAgICBQbGF5ZXJTZXJ2aWNlRmlsZVNvdXJjZSAmb3BlcmF0b3I9KGNvbnN0IFBsYXllclNlcnZpY2VGaWxlU291cmNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBQTEFZRVJfU0VSVklDRV9GSUxFX1NPVVJDRV9IXworCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvZGF0YXNvdXJjZS9pbmNsdWRlL2RhdGFzb3VyY2UvUGxheWVyU2VydmljZU1lZGlhSFRUUC5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2RhdGFzb3VyY2UvaW5jbHVkZS9kYXRhc291cmNlL1BsYXllclNlcnZpY2VNZWRpYUhUVFAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTEyNGRjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2RhdGFzb3VyY2UvaW5jbHVkZS9kYXRhc291cmNlL1BsYXllclNlcnZpY2VNZWRpYUhUVFAuaApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBQTEFZRVJfU0VSVklDRV9NRURJQV9IVFRQX0hfCisKKyNkZWZpbmUgUExBWUVSX1NFUlZJQ0VfTUVESUFfSFRUUF9IXworCisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9NZWRpYUhUVFAuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgTWVkaWFIVFRQQ29ubmVjdGlvbjsKKworLy8gTWVkaWFIVFRQIGltcGxlbWVudGF0aW9uIHdoaWNoIHdvcmtzIG9uIE1lZGlhUGxheWVyU2VydmljZS4KKy8vIFN1cHBvcnRzIE9NQShmb3J3b3JkLWxvY2spIHN0cmVhbS4KK3N0cnVjdCBQbGF5ZXJTZXJ2aWNlTWVkaWFIVFRQIDogcHVibGljIE1lZGlhSFRUUCB7CisgICAgUGxheWVyU2VydmljZU1lZGlhSFRUUChjb25zdCBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiAmY29ubik7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5QbGF5ZXJTZXJ2aWNlTWVkaWFIVFRQKCk7CisKK3ByaXZhdGU6CisgICAgc3A8RGVjcnlwdEhhbmRsZT4gbURlY3J5cHRIYW5kbGU7CisgICAgRHJtTWFuYWdlckNsaWVudCAqbURybU1hbmFnZXJDbGllbnQ7CisKKyAgICBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyICptaW1lKTsKKyAgICB2b2lkIGNsZWFyRFJNU3RhdGVfbCgpOworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGxheWVyU2VydmljZU1lZGlhSFRUUCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFBMQVlFUl9TRVJWSUNFX01FRElBX0hUVFBfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9pbmNsdWRlL01lZGlhUGxheWVySW50ZXJmYWNlLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvaW5jbHVkZS9NZWRpYVBsYXllckludGVyZmFjZS5oCmluZGV4IDMxMTk5NTAuLjQzNmNiMzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9pbmNsdWRlL01lZGlhUGxheWVySW50ZXJmYWNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL2luY2x1ZGUvTWVkaWFQbGF5ZXJJbnRlcmZhY2UuaApAQCAtMjcsNyArMjcsNiBAQAogCiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9UaW1lc3RhbXAuaD4KICNpbmNsdWRlIDxtZWRpYS9BVlN5bmNTZXR0aW5ncy5oPgogI2luY2x1ZGUgPG1lZGlhL0J1ZmZlcmluZ1NldHRpbmdzLmg+CkBAIC0xNTEsMTMgKzE1MCwxMyBAQAogCiAgICAgICAgIHZpcnR1YWwgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pOwotICAgICAgICB2aXJ0dWFsIHNwPG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXRlPiBnZXRWb2x1bWVTaGFwZXJTdGF0ZShpbnQgaWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSA9IDA7CisgICAgICAgIHZpcnR1YWwgc3A8bWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdGU+IGdldFZvbHVtZVNoYXBlclN0YXRlKGludCBpZCkgPSAwOwogCiAgICAgICAgIC8vIEF1ZGlvUm91dGluZwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBnZXRSb3V0ZWREZXZpY2VJZChhdWRpb19wb3J0X2hhbmRsZV90KiBkZXZpY2VJZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZW5hYmxlQXVkaW9EZXZpY2VDYWxsYmFjayhib29sIGVuYWJsZWQpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNldE91dHB1dERldmljZShhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkKSA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZ2V0Um91dGVkRGV2aWNlSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCogZGV2aWNlSWQpID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBlbmFibGVBdWRpb0RldmljZUNhbGxiYWNrKGJvb2wgZW5hYmxlZCkgPSAwOwogICAgIH07CiAKICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZSgpIHt9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLmJwCmluZGV4IDIzYTE5ZTcuLmM4ZjQ4YTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9BbmRyb2lkLmJwCkBAIC0xOCw2ICsxOCw3IEBACiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYWRybV9oZWFkZXJzIiwKICAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKICAgICBdLAogCkBAIC00NSw2ICs0Niw3IEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmRhdGFzb3VyY2UiLAogICAgICAgICAibGlidWkiLAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYm1lZGlhIiwKQEAgLTUyLDYgKzU0LDEwIEBACiAgICAgICAgICJsaWJwb3dlcm1hbmFnZXIiLAogICAgIF0sCiAKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlicGxheWVyc2VydmljZV9kYXRhc291cmNlIiwKKyAgICBdLAorCiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X251cGxheWVyIiwKIAogICAgIHNhbml0aXplOiB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5jcHAKaW5kZXggNjk0MjM1YS4uMDBlMzQ0MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmNwcApAQCAtMjMsMjYgKzIzLDI2IEBACiAjaW5jbHVkZSAiQW5vdGhlclBhY2tldFNvdXJjZS5oIgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPGRhdGFzb3VyY2UvUGxheWVyU2VydmljZURhdGFTb3VyY2VGYWN0b3J5Lmg+CisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9QbGF5ZXJTZXJ2aWNlRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPGRhdGFzb3VyY2UvSFRUUEJhc2UuaD4KKyNpbmNsdWRlIDxkYXRhc291cmNlL051Q2FjaGVkU291cmNlMi5oPgogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUJ1ZmZlckhvbGRlci5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCi0jaW5jbHVkZSAiLi4vLi4vbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTkwLDggKzkwLDExIEBACiAgICAgQUxPR1YoInJlc2V0RGF0YVNvdXJjZSIpOwogCiAgICAgbUhUVFBTZXJ2aWNlLmNsZWFyKCk7Ci0gICAgbUh0dHBTb3VyY2UuY2xlYXIoKTsKLSAgICBtRGlzY29ubmVjdGVkID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2xfZChtRGlzY29ubmVjdExvY2spOworICAgICAgICBtSHR0cFNvdXJjZS5jbGVhcigpOworICAgICAgICBtRGlzY29ubmVjdGVkID0gZmFsc2U7CisgICAgfQogICAgIG1VcmkuY2xlYXIoKTsKICAgICBtVXJpSGVhZGVycy5jbGVhcigpOwogICAgIG1Tb3VyY2VzLmNsZWFyKCk7CkBAIC0xNTIsNyArMTU1LDEwIEBACiAgICAgQUxPR1YoInNldERhdGFTb3VyY2UgKHNvdXJjZTogJXApIiwgc291cmNlLmdldCgpKTsKIAogICAgIHJlc2V0RGF0YVNvdXJjZSgpOwotICAgIG1EYXRhU291cmNlID0gc291cmNlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sX2QobURpc2Nvbm5lY3RMb2NrKTsKKyAgICAgICAgbURhdGFTb3VyY2UgPSBzb3VyY2U7CisgICAgfQogICAgIHJldHVybiBPSzsKIH0KIApAQCAtMTYzLDggKzE2OSwxMiBAQAogCiBzdGF0dXNfdCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6aW5pdEZyb21EYXRhU291cmNlKCkgewogICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gZXh0cmFjdG9yOwotICAgIENIRUNLKG1EYXRhU291cmNlICE9IE5VTEwpOwotICAgIHNwPERhdGFTb3VyY2U+IGRhdGFTb3VyY2UgPSBtRGF0YVNvdXJjZTsKKyAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sX2QobURpc2Nvbm5lY3RMb2NrKTsKKyAgICAgICAgZGF0YVNvdXJjZSA9IG1EYXRhU291cmNlOworICAgIH0KKyAgICBDSEVDSyhkYXRhU291cmNlICE9IE5VTEwpOwogCiAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgLy8gVGhpcyBtaWdodCB0YWtlIGxvbmcgdGltZSBpZiBkYXRhIHNvdXJjZSBpcyBub3QgcmVsaWFibGUuCkBAIC0zNTksNiArMzY5LDcgQEAKIH0KIAogdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6b25QcmVwYXJlQXN5bmMoKSB7CisgICAgbURpc2Nvbm5lY3RMb2NrLmxvY2soKTsKICAgICBBTE9HVigib25QcmVwYXJlQXN5bmM6IG1EYXRhU291cmNlOiAlZCIsIChtRGF0YVNvdXJjZSAhPSBOVUxMKSk7CiAKICAgICAvLyBkZWxheWVkIGRhdGEgc291cmNlIGNyZWF0aW9uCkBAIC0zNzIsMjYgKzM4MywzNyBAQAogICAgICAgICAgICAgU3RyaW5nOCBjb250ZW50VHlwZTsKIAogICAgICAgICAgICAgaWYgKCFzdHJuY2FzZWNtcCgiaHR0cDovLyIsIHVyaSwgNykgfHwgIXN0cm5jYXNlY21wKCJodHRwczovLyIsIHVyaSwgOCkpIHsKLSAgICAgICAgICAgICAgICBtSHR0cFNvdXJjZSA9IERhdGFTb3VyY2VGYWN0b3J5OjpDcmVhdGVNZWRpYUhUVFAobUhUVFBTZXJ2aWNlKTsKLSAgICAgICAgICAgICAgICBpZiAobUh0dHBTb3VyY2UgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHNwPERhdGFTb3VyY2U+IGh0dHBTb3VyY2U7CisgICAgICAgICAgICAgICAgbURpc2Nvbm5lY3RMb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgIGh0dHBTb3VyY2UgPSBQbGF5ZXJTZXJ2aWNlRGF0YVNvdXJjZUZhY3Rvcnk6OmdldEluc3RhbmNlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC0+Q3JlYXRlTWVkaWFIVFRQKG1IVFRQU2VydmljZSk7CisgICAgICAgICAgICAgICAgaWYgKGh0dHBTb3VyY2UgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNyZWF0ZSBodHRwIHNvdXJjZSEiKTsKICAgICAgICAgICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKFVOS05PV05fRVJST1IpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1EaXNjb25uZWN0TG9jay5sb2NrKCk7CisKKyAgICAgICAgICAgICAgICBpZiAoIW1EaXNjb25uZWN0ZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbUh0dHBTb3VyY2UgPSBodHRwU291cmNlOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICBtRGlzY29ubmVjdExvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAvLyBUaGlzIG1pZ2h0IHRha2UgbG9uZyB0aW1lIGlmIGNvbm5lY3Rpb24gaGFzIHNvbWUgaXNzdWUuCi0gICAgICAgICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21VUkkoCi0gICAgICAgICAgICAgICAgICAgbUhUVFBTZXJ2aWNlLCB1cmksICZtVXJpSGVhZGVycywgJmNvbnRlbnRUeXBlLAotICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEhUVFBCYXNlICo+KG1IdHRwU291cmNlLmdldCgpKSk7CisgICAgICAgICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0gUGxheWVyU2VydmljZURhdGFTb3VyY2VGYWN0b3J5OjpnZXRJbnN0YW5jZSgpCisgICAgICAgICAgICAgICAgICAgIC0+Q3JlYXRlRnJvbVVSSShtSFRUUFNlcnZpY2UsIHVyaSwgJm1VcmlIZWFkZXJzLCAmY29udGVudFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4obUh0dHBTb3VyY2UuZ2V0KCkpKTsKKyAgICAgICAgICAgIG1EaXNjb25uZWN0TG9jay5sb2NrKCk7CiAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICBpZiAoIW1EaXNjb25uZWN0ZWQpIHsKICAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZSA9IGRhdGFTb3VyY2U7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woIm1lZGlhLnN0YWdlZnJpZ2h0LmV4dHJhY3RyZW1vdGUiLCB0cnVlKSAmJgotICAgICAgICAgICAgICAgICAgICAhRmlsZVNvdXJjZTo6cmVxdWlyZXNEcm0obUZkLCBtT2Zmc2V0LCBtTGVuZ3RoLCBudWxscHRyIC8qIG1pbWUgKi8pKSB7CisgICAgICAgICAgICAgICAgICAgICFQbGF5ZXJTZXJ2aWNlRmlsZVNvdXJjZTo6cmVxdWlyZXNEcm0oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZkLCBtT2Zmc2V0LCBtTGVuZ3RoLCBudWxscHRyIC8qIG1pbWUgKi8pKSB7CiAgICAgICAgICAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0KICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5leHRyYWN0b3IiKSk7CiAgICAgICAgICAgICAgICAgaWYgKGJpbmRlciAhPSBudWxscHRyKSB7CkBAIC00MTgsNyArNDQwLDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtRGF0YVNvdXJjZSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgQUxPR0QoIkZpbGVTb3VyY2UgbG9jYWwiKTsKLSAgICAgICAgICAgICAgICBtRGF0YVNvdXJjZSA9IG5ldyBGaWxlU291cmNlKG1GZCwgbU9mZnNldCwgbUxlbmd0aCk7CisgICAgICAgICAgICAgICAgbURhdGFTb3VyY2UgPSBuZXcgUGxheWVyU2VydmljZUZpbGVTb3VyY2UobUZkLCBtT2Zmc2V0LCBtTGVuZ3RoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIFRPRE86IGNsb3NlIHNob3VsZCBhbHdheXMgYmUgZG9uZSBvbiBtRmQsIHNlZSB0aGUgbGluZXMgZm9sbG93aW5nCiAgICAgICAgICAgICAvLyBDcmVhdGVEYXRhU291cmNlRnJvbUlEYXRhU291cmNlIGFib3ZlLApAQCAtNDI4LDYgKzQ1MCw3IEBACiAKICAgICAgICAgaWYgKG1EYXRhU291cmNlID09IE5VTEwpIHsKICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY3JlYXRlIGRhdGEgc291cmNlISIpOworICAgICAgICAgICAgbURpc2Nvbm5lY3RMb2NrLnVubG9jaygpOwogICAgICAgICAgICAgbm90aWZ5UHJlcGFyZWRBbmRDbGVhbnVwKFVOS05PV05fRVJST1IpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC00MzcsNiArNDYwLDggQEAKICAgICAgICAgbUNhY2hlZFNvdXJjZSA9IHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihtRGF0YVNvdXJjZS5nZXQoKSk7CiAgICAgfQogCisgICAgbURpc2Nvbm5lY3RMb2NrLnVubG9jaygpOworCiAgICAgLy8gRm9yIGNhY2hlZCBzdHJlYW1pbmcgY2FzZXMsIHdlIG5lZWQgdG8gd2FpdCBmb3IgZW5vdWdoCiAgICAgLy8gYnVmZmVyaW5nIGJlZm9yZSByZXBvcnRpbmcgcHJlcGFyZWQuCiAgICAgbUlzU3RyZWFtaW5nID0gKG1DYWNoZWRTb3VyY2UgIT0gTlVMTCk7CkBAIC01MDMsOSArNTI4LDEzIEBACiAKIHZvaWQgTnVQbGF5ZXI6OkdlbmVyaWNTb3VyY2U6Om5vdGlmeVByZXBhcmVkQW5kQ2xlYW51cChzdGF0dXNfdCBlcnIpIHsKICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIG1EYXRhU291cmNlLmNsZWFyKCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbF9kKG1EaXNjb25uZWN0TG9jayk7CisgICAgICAgICAgICBtRGF0YVNvdXJjZS5jbGVhcigpOworICAgICAgICAgICAgbUh0dHBTb3VyY2UuY2xlYXIoKTsKKyAgICAgICAgfQorCiAgICAgICAgIG1DYWNoZWRTb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgbUh0dHBTb3VyY2UuY2xlYXIoKTsKIAogICAgICAgICBtQml0cmF0ZSA9IC0xOwogICAgICAgICBtUHJldkJ1ZmZlclBlcmNlbnRhZ2UgPSAtMTsKQEAgLTU0Nyw3ICs1NzYsNyBAQAogdm9pZCBOdVBsYXllcjo6R2VuZXJpY1NvdXJjZTo6ZGlzY29ubmVjdCgpIHsKICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlLCBodHRwU291cmNlOwogICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sX2QobURpc2Nvbm5lY3RMb2NrKTsKICAgICAgICAgZGF0YVNvdXJjZSA9IG1EYXRhU291cmNlOwogICAgICAgICBodHRwU291cmNlID0gbUh0dHBTb3VyY2U7CiAgICAgICAgIG1EaXNjb25uZWN0ZWQgPSB0cnVlOwpAQCAtNzU1LDcgKzc4NCw3IEBACiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBpbnQ2NF90IG5leHRTdWJUaW1lVXM7CisgICAgaW50NjRfdCBuZXh0U3ViVGltZVVzID0gMDsKICAgICByZWFkQnVmZmVyKHR5cGUsIC0xLCBNZWRpYVBsYXllclNlZWtNb2RlOjpTRUVLX1BSRVZJT1VTX1NZTkMgLyogbW9kZSAqLywgJm5leHRTdWJUaW1lVXMpOwogCiAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOwpAQCAtMTU1MCw2ICsxNTc5LDE2IEBACiAgICAgICAgICAgICBub3RpZnlCdWZmZXJpbmdVcGRhdGUoMTAwKTsKICAgICAgICAgfQogCisgICAgICAgIGlmIChtUHJlcGFyaW5nKSB7CisgICAgICAgICAgICBub3RpZnlQcmVwYXJlZEFuZENsZWFudXAoZmluYWxTdGF0dXMgPT0gRVJST1JfRU5EX09GX1NUUkVBTSA/IE9LIDogZmluYWxTdGF0dXMpOworICAgICAgICAgICAgbVByZXBhcmluZyA9IGZhbHNlOworICAgICAgICB9IGVsc2UgaWYgKG1TZW50UGF1c2VPbkJ1ZmZlcmluZykgeworICAgICAgICAgICAgc2VuZENhY2hlU3RhdHMoKTsKKyAgICAgICAgICAgIG1TZW50UGF1c2VPbkJ1ZmZlcmluZyA9IGZhbHNlOworICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IGR1cE5vdGlmeSgpOworICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigid2hhdCIsIGtXaGF0UmVzdW1lT25CdWZmZXJpbmdFbmQpOworICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7CisgICAgICAgIH0KICAgICAgICAgcmV0dXJuOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9HZW5lcmljU291cmNlLmgKaW5kZXggMDY1Y2FjMS4uNGQxOTA1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL0dlbmVyaWNTb3VyY2UuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvR2VuZXJpY1NvdXJjZS5oCkBAIC0xNzAsNiArMTcwLDcgQEAKICAgICBzcDxBQnVmZmVyPiBtR2xvYmFsVGltZWRUZXh0OwogCiAgICAgbXV0YWJsZSBNdXRleCBtTG9jazsKKyAgICBtdXRhYmxlIE11dGV4IG1EaXNjb25uZWN0TG9jazsgLy8gUHJvdGVjdHMgbURhdGFTb3VyY2UsIG1IdHRwU291cmNlIGFuZCBtRGlzY29ubmVjdGVkCiAKICAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmNwcAppbmRleCBjZjc1YWVjLi5jMWM0YjU1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllci5jcHAKQEAgLTY1OSwyMCArNjU5LDMxIEBACiAKICAgICAgICAgY2FzZSBrV2hhdEdldFNlbGVjdGVkVHJhY2s6CiAgICAgICAgIHsKKyAgICAgICAgICAgIGludDMyX3QgdHlwZTMyOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoInR5cGUiLCAoaW50MzJfdCopJnR5cGUzMikpOworICAgICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0eXBlID0gKG1lZGlhX3RyYWNrX3R5cGUpdHlwZTMyOworCisgICAgICAgICAgICBzaXplX3QgaW5iYW5kVHJhY2tzID0gMDsKICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgc3NpemVfdCBzZWxlY3RlZFRyYWNrID0gLTE7CiAgICAgICAgICAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7CiAgICAgICAgICAgICAgICAgZXJyID0gT0s7Ci0KLSAgICAgICAgICAgICAgICBpbnQzMl90IHR5cGUzMjsKLSAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQzMigidHlwZSIsIChpbnQzMl90KikmdHlwZTMyKSk7Ci0gICAgICAgICAgICAgICAgbWVkaWFfdHJhY2tfdHlwZSB0eXBlID0gKG1lZGlhX3RyYWNrX3R5cGUpdHlwZTMyOwotICAgICAgICAgICAgICAgIHNzaXplX3Qgc2VsZWN0ZWRUcmFjayA9IG1Tb3VyY2UtPmdldFNlbGVjdGVkVHJhY2sodHlwZSk7Ci0KLSAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5OwotICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoInJlcGx5IiwgKHZvaWQqKikmcmVwbHkpKTsKLSAgICAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzZWxlY3RlZFRyYWNrKTsKKyAgICAgICAgICAgICAgICBpbmJhbmRUcmFja3MgPSBtU291cmNlLT5nZXRUcmFja0NvdW50KCk7CisgICAgICAgICAgICAgICAgc2VsZWN0ZWRUcmFjayA9IG1Tb3VyY2UtPmdldFNlbGVjdGVkVHJhY2sodHlwZSk7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChzZWxlY3RlZFRyYWNrID09IC0xICYmIG1DQ0RlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGVyciA9IE9LOworICAgICAgICAgICAgICAgIHNlbGVjdGVkVHJhY2sgPSBtQ0NEZWNvZGVyLT5nZXRTZWxlY3RlZFRyYWNrKHR5cGUpOworICAgICAgICAgICAgICAgIGlmIChzZWxlY3RlZFRyYWNrICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkVHJhY2sgKz0gaW5iYW5kVHJhY2tzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgUGFyY2VsKiByZXBseTsKKyAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoInJlcGx5IiwgKHZvaWQqKikmcmVwbHkpKTsKKyAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHNlbGVjdGVkVHJhY2spOworCiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcmVzcG9uc2UgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICByZXNwb25zZS0+c2V0SW50MzIoImVyciIsIGVycik7CiAKQEAgLTE3ODcsNyArMTc5OCw5IEBACiB9CiAKIHZvaWQgTnVQbGF5ZXI6OmNsb3NlQXVkaW9TaW5rKCkgewotICAgIG1SZW5kZXJlci0+Y2xvc2VBdWRpb1NpbmsoKTsKKyAgICBpZiAobVJlbmRlcmVyICE9IE5VTEwpIHsKKyAgICAgICAgbVJlbmRlcmVyLT5jbG9zZUF1ZGlvU2luaygpOworICAgIH0KIH0KIAogdm9pZCBOdVBsYXllcjo6cmVzdGFydEF1ZGlvKApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaAppbmRleCA5ZjViZTA2Li4wZTU4ZWMyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXIuaApAQCAtMTksNyArMTksNyBAQAogI2RlZmluZSBOVV9QTEFZRVJfSF8KIAogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVBsYXllckludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckNDRGVjb2Rlci5jcHAKaW5kZXggMDlhZDZiMi4uYTJjYzEzZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuY3BwCkBAIC0yMDAsNiArMjAwLDE4IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzc2l6ZV90IE51UGxheWVyOjpDQ0RlY29kZXI6OmdldFNlbGVjdGVkVHJhY2sobWVkaWFfdHJhY2tfdHlwZSB0eXBlKSBjb25zdCB7CisgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IC0xKSB7CisgICAgICAgIENDVHJhY2sgdHJhY2sgPSBtVHJhY2tzW21TZWxlY3RlZFRyYWNrXTsKKyAgICAgICAgaWYgKHRyYWNrLm1UcmFja1R5cGUgPT0ga1RyYWNrVHlwZUNFQTYwOCB8fCB0cmFjay5tVHJhY2tUeXBlID09IGtUcmFja1R5cGVDRUE3MDgpIHsKKyAgICAgICAgICAgIHJldHVybiAodHlwZSA9PSBNRURJQV9UUkFDS19UWVBFX1NVQlRJVExFID8gbVNlbGVjdGVkVHJhY2sgOiAtMSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICh0eXBlID09IE1FRElBX1RSQUNLX1RZUEVfVU5LTk9XTiA/IG1TZWxlY3RlZFRyYWNrIDogLTEpOworICAgIH0KKworICAgIHJldHVybiAtMTsKK30KKwogYm9vbCBOdVBsYXllcjo6Q0NEZWNvZGVyOjppc1NlbGVjdGVkKCkgY29uc3QgewogICAgIHJldHVybiBtU2VsZWN0ZWRUcmFjayA+PSAwICYmIG1TZWxlY3RlZFRyYWNrIDwgKGludDMyX3QpZ2V0VHJhY2tDb3VudCgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyQ0NEZWNvZGVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuaAppbmRleCBmMzEwZjM3Li4zN2I4MjMwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuaAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJDQ0RlY29kZXIuaApAQCAtMzgsNiArMzgsNyBAQAogICAgIHNpemVfdCBnZXRUcmFja0NvdW50KCkgY29uc3Q7CiAgICAgc3A8QU1lc3NhZ2U+IGdldFRyYWNrSW5mbyhzaXplX3QgaW5kZXgpIGNvbnN0OwogICAgIHN0YXR1c190IHNlbGVjdFRyYWNrKHNpemVfdCBpbmRleCwgYm9vbCBzZWxlY3QpOworICAgIHNzaXplX3QgZ2V0U2VsZWN0ZWRUcmFjayhtZWRpYV90cmFja190eXBlIHR5cGUpIGNvbnN0OwogICAgIGJvb2wgaXNTZWxlY3RlZCgpIGNvbnN0OwogICAgIHZvaWQgZGVjb2RlKGNvbnN0IHNwPEFCdWZmZXI+ICZhY2Nlc3NVbml0KTsKICAgICB2b2lkIGRpc3BsYXkoaW50NjRfdCB0aW1lVXMpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAppbmRleCA0YWQ2ZWFiLi5iZDJiODg0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyLmNwcApAQCAtMjgsNyArMjgsNyBAQAogI2luY2x1ZGUgIk51UGxheWVyU291cmNlLmgiCiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFCdWZmZXJIb2xkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC0xMDcsMTAgKzEwNywxNiBAQAogfQogCiBzcDxBTWVzc2FnZT4gTnVQbGF5ZXI6OkRlY29kZXI6OmdldFN0YXRzKCkgY29uc3QgeworCiAgICAgbVN0YXRzLT5zZXRJbnQ2NCgiZnJhbWVzLXRvdGFsIiwgbU51bUZyYW1lc1RvdGFsKTsKICAgICBtU3RhdHMtPnNldEludDY0KCJmcmFtZXMtZHJvcHBlZC1pbnB1dCIsIG1OdW1JbnB1dEZyYW1lc0Ryb3BwZWQpOwogICAgIG1TdGF0cy0+c2V0SW50NjQoImZyYW1lcy1kcm9wcGVkLW91dHB1dCIsIG1OdW1PdXRwdXRGcmFtZXNEcm9wcGVkKTsKLSAgICByZXR1cm4gbVN0YXRzOworICAgIG1TdGF0cy0+c2V0RmxvYXQoImZyYW1lLXJhdGUtdG90YWwiLCBtRnJhbWVSYXRlVG90YWwpOworCisgICAgLy8gaSdtIG11dGV4ZWQgcmlnaHQgbm93LgorICAgIC8vIG1ha2Ugb3VyIG93biBjb3B5LCBzbyB3ZSBhcmVuJ3QgdmljdGltIHRvIGFueSBsYXRlciBjaGFuZ2VzLgorICAgIHNwPEFNZXNzYWdlPiBjb3BpZWRTdGF0cyA9IG1TdGF0cy0+ZHVwKCk7CisgICAgcmV0dXJuIGNvcGllZFN0YXRzOwogfQogCiBzdGF0dXNfdCBOdVBsYXllcjo6RGVjb2Rlcjo6c2V0VmlkZW9TdXJmYWNlKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CkBAIC02NzcsNyArNjgzLDcgQEAKICAgICAgICAgbXNnLT5zZXRTaXplKCJidWZmZXItaXgiLCBpbmRleCk7CiAKICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbUNTRHNUb1N1Ym1pdC5pdGVtQXQoMCk7Ci0gICAgICAgIEFMT0dJKCJbJXNdIHJlc3VibWl0dGluZyBDU0QiLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKKyAgICAgICAgQUxPR1YoIlslc10gcmVzdWJtaXR0aW5nIENTRCIsIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOwogICAgICAgICBtc2ctPnNldEJ1ZmZlcigiYnVmZmVyIiwgYnVmZmVyKTsKICAgICAgICAgbUNTRHNUb1N1Ym1pdC5yZW1vdmVBdCgwKTsKICAgICAgICAgaWYgKCFvbklucHV0QnVmZmVyRmV0Y2hlZChtc2cpKSB7CkBAIC03NDgsNyArNzU0LDcgQEAKICAgICByZXBseS0+c2V0U2l6ZSgic2l6ZSIsIHNpemUpOwogCiAgICAgaWYgKGVvcykgewotICAgICAgICBBTE9HSSgiWyVzXSBzYXcgb3V0cHV0IEVPUyIsIG1Jc0F1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOworICAgICAgICBBTE9HVigiWyVzXSBzYXcgb3V0cHV0IEVPUyIsIG1Jc0F1ZGlvID8gImF1ZGlvIiA6ICJ2aWRlbyIpOwogCiAgICAgICAgIGJ1ZmZlci0+bWV0YSgpLT5zZXRJbnQzMigiZW9zIiwgdHJ1ZSk7CiAgICAgICAgIHJlcGx5LT5zZXRJbnQzMigiZW9zIiwgdHJ1ZSk7CkBAIC0xMDI4LDcgKzEwMzQsNyBAQAogICAgICAgICAgICAgaW50NjRfdCByZXN1bWVBdE1lZGlhVGltZVVzOwogICAgICAgICAgICAgaWYgKGV4dHJhLT5maW5kSW50NjQoCiAgICAgICAgICAgICAgICAgICAgICAgICAicmVzdW1lLWF0LW1lZGlhVGltZVVzIiwgJnJlc3VtZUF0TWVkaWFUaW1lVXMpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koIlslc10gc3VwcHJlc3NpbmcgcmVuZGVyaW5nIHVudGlsICVsbGQgdXMiLAorICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIHN1cHByZXNzaW5nIHJlbmRlcmluZyB1bnRpbCAlbGxkIHVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksIChsb25nIGxvbmcpcmVzdW1lQXRNZWRpYVRpbWVVcyk7CiAgICAgICAgICAgICAgICAgbVNraXBSZW5kZXJpbmdVbnRpbE1lZGlhVGltZVVzID0gcmVzdW1lQXRNZWRpYVRpbWVVczsKICAgICAgICAgICAgIH0KQEAgLTEwNjksNiArMTA3NSwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TWVkaWFCdWZmZXJIb2xkZXIqPihob2xkZXIuZ2V0KCkpLT5tZWRpYUJ1ZmZlcigpIDogbnVsbHB0cjsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgaWYgKG1lZGlhQnVmICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhQnVmLT5zaXplKCkgPiBjb2RlY0J1ZmZlci0+Y2FwYWNpdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoRVJST1JfQlVGRkVSX1RPT19TTUFMTCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtRGVxdWV1ZWRJbnB1dEJ1ZmZlcnMucHVzaF9iYWNrKGJ1ZmZlckl4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgICAgIGNvZGVjQnVmZmVyLT5zZXRSYW5nZSgwLCBtZWRpYUJ1Zi0+c2l6ZSgpKTsKICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGNvZGVjQnVmZmVyLT5kYXRhKCksIG1lZGlhQnVmLT5kYXRhKCksIG1lZGlhQnVmLT5zaXplKCkpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRGVjb2RlclBhc3NUaHJvdWdoLmNwcAppbmRleCAwOTk3ZTdkLi43OTMwMTRlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEZWNvZGVyUGFzc1Rocm91Z2guY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRlY29kZXJQYXNzVGhyb3VnaC5jcHAKQEAgLTI0LDcgKzI0LDcgQEAKICNpbmNsdWRlICJOdVBsYXllclJlbmRlcmVyLmgiCiAjaW5jbHVkZSAiTnVQbGF5ZXJTb3VyY2UuaCIKIAotI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJpdmVyLmNwcAppbmRleCBiODNlNzY2Li45NWM5NzNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcml2ZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRyaXZlci5jcHAKQEAgLTMzLDYgKzMzLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNsb2NrLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZvdW5kYXRpb25VdGlscy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQW5hbHl0aWNzU2VydmljZS5oPgogCkBAIC01Myw2ICs1NCw3IEBACiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckhlaWdodCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmhlaWdodCI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckZyYW1lcyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmZyYW1lcyI7CiBzdGF0aWMgY29uc3QgY2hhciAqa1BsYXllckZyYW1lc0Ryb3BwZWQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5kcm9wcGVkIjsKK3N0YXRpYyBjb25zdCBjaGFyICprUGxheWVyRnJhbWVSYXRlID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZnBzIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyQU1pbWUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5hdWRpby5taW1lIjsKIHN0YXRpYyBjb25zdCBjaGFyICprUGxheWVyQUNvZGVjID0gImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuYXVkaW8uY29kZWMiOwogc3RhdGljIGNvbnN0IGNoYXIgKmtQbGF5ZXJEdXJhdGlvbiA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmR1cmF0aW9uTXMiOwpAQCAtOTYsNyArOTgsNyBAQAogICAgIG1NZWRpYUNsb2NrLT5pbml0KCk7CiAKICAgICAvLyBzZXQgdXAgYW4gYW5hbHl0aWNzIHJlY29yZAotICAgIG1BbmFseXRpY3NJdGVtID0gbmV3IE1lZGlhQW5hbHl0aWNzSXRlbShrS2V5UGxheWVyKTsKKyAgICBtQW5hbHl0aWNzSXRlbSA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKGtLZXlQbGF5ZXIpOwogCiAgICAgbUxvb3Blci0+c3RhcnQoCiAgICAgICAgICAgICBmYWxzZSwgLyogcnVuT25DYWxsaW5nVGhyZWFkICovCkBAIC0zMjgsNyArMzMwLDcgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnN0YXJ0KCkgewotICAgIEFMT0dEKCJzdGFydCglcCksIHN0YXRlIGlzICVkLCBlb3MgaXMgJWQiLCB0aGlzLCBtU3RhdGUsIG1BdEVPUyk7CisgICAgQUxPR1YoInN0YXJ0KCVwKSwgc3RhdGUgaXMgJWQsIGVvcyBpcyAlZCIsIHRoaXMsIG1TdGF0ZSwgbUF0RU9TKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogICAgIHJldHVybiBzdGFydF9sKCk7CiB9CkBAIC00NzAsNyArNDcyLDcgQEAKIH0KIAogc3RhdHVzX3QgTnVQbGF5ZXJEcml2ZXI6OnNlZWtUbyhpbnQgbXNlYywgTWVkaWFQbGF5ZXJTZWVrTW9kZSBtb2RlKSB7Ci0gICAgQUxPR0QoInNlZWtUbyglcCkgKCVkIG1zLCAlZCkgYXQgc3RhdGUgJWQiLCB0aGlzLCBtc2VjLCBtb2RlLCBtU3RhdGUpOworICAgIEFMT0dWKCJzZWVrVG8oJXApICglZCBtcywgJWQpIGF0IHN0YXRlICVkIiwgdGhpcywgbXNlYywgbW9kZSwgbVN0YXRlKTsKICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwogCiAgICAgaW50NjRfdCBzZWVrVGltZVVzID0gbXNlYyAqIDEwMDBMTDsKQEAgLTU3Nyw2ICs1NzksMTAgQEAKICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa1BsYXllckZyYW1lcywgbnVtRnJhbWVzVG90YWwpOwogICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyRnJhbWVzRHJvcHBlZCwgbnVtRnJhbWVzRHJvcHBlZCk7CiAKKyAgICAgICAgICAgICAgICBmbG9hdCBmcmFtZVJhdGUgPSAwOworICAgICAgICAgICAgICAgIGlmIChzdGF0cy0+ZmluZEZsb2F0KCJmcmFtZS1yYXRlLXRvdGFsIiwgJmZyYW1lUmF0ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldERvdWJsZShrUGxheWVyRnJhbWVSYXRlLCAoZG91YmxlKSBmcmFtZVJhdGUpOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgfSBlbHNlIGlmIChtaW1lLnN0YXJ0c1dpdGgoImF1ZGlvLyIpKSB7CiAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa1BsYXllckFNaW1lLCBtaW1lLmNfc3RyKCkpOwpAQCAtNjAyLDYgKzYwOCw3IEBACiAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrUGxheWVyUmVidWZmZXJpbmcsIChtUmVidWZmZXJpbmdUaW1lVXMrNTAwKS8xMDAwICk7CiAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrUGxheWVyUmVidWZmZXJpbmdDb3VudCwgbVJlYnVmZmVyaW5nRXZlbnRzKTsKICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtQbGF5ZXJSZWJ1ZmZlcmluZ0F0RXhpdCwgbVJlYnVmZmVyaW5nQXRFeGl0KTsKKwogICAgIH0KIAogICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtQbGF5ZXJEYXRhU291cmNlVHlwZSwgbVBsYXllci0+Z2V0RGF0YVNvdXJjZVR5cGUoKSk7CkBAIC02MjksNyArNjM2LDcgQEAKIAogICAgICAgICAvLyByZS1pbml0IGluIGNhc2Ugd2UgcHJlcGFyZSgpIGFuZCBzdGFydCgpIGFnYWluLgogICAgICAgICBkZWxldGUgbUFuYWx5dGljc0l0ZW0gOwotICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oIm51cGxheWVyIik7CisgICAgICAgIG1BbmFseXRpY3NJdGVtID0gTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoa0tleVBsYXllcik7CiAgICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbSkgewogICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldFVpZChtQ2xpZW50VWlkKTsKICAgICAgICAgfQpAQCAtOTU5LDcgKzk2Niw3IEBACiAKIHZvaWQgTnVQbGF5ZXJEcml2ZXI6Om5vdGlmeUxpc3RlbmVyX2woCiAgICAgICAgIGludCBtc2csIGludCBleHQxLCBpbnQgZXh0MiwgY29uc3QgUGFyY2VsICppbikgewotICAgIEFMT0dEKCJub3RpZnlMaXN0ZW5lcl9sKCVwKSwgKCVkLCAlZCwgJWQsICVkKSwgbG9vcCBzZXR0aW5nKCVkLCAlZCkiLAorICAgIEFMT0dWKCJub3RpZnlMaXN0ZW5lcl9sKCVwKSwgKCVkLCAlZCwgJWQsICVkKSwgbG9vcCBzZXR0aW5nKCVkLCAlZCkiLAogICAgICAgICAgICAgdGhpcywgbXNnLCBleHQxLCBleHQyLCAoaW4gPT0gTlVMTCA/IC0xIDogKGludClpbi0+ZGF0YVNpemUoKSksIG1BdXRvTG9vcCwgbUxvb3BpbmcpOwogICAgIHN3aXRjaCAobXNnKSB7CiAgICAgICAgIGNhc2UgTUVESUFfUExBWUJBQ0tfQ09NUExFVEU6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uY3BwIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmNwcAppbmRleCBiZGUwODYyLi4yZDBjOWUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJEcm0uY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRybS5jcHAKQEAgLTE1OSw4ICsxNTksMTIgQEAKICAgICBpZiAoZHJtICE9IE5VTEwpIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwc3NoRFJNcy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgRHJtVVVJRCB1dWlkID0gcHNzaERSTXNbaV07Ci0gICAgICAgICAgICBpZiAoZHJtLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLnB0cigpLCBTdHJpbmc4KCkpKQorICAgICAgICAgICAgYm9vbCBpc1N1cHBvcnRlZCA9IGZhbHNlOworICAgICAgICAgICAgc3RhdHVzID0gZHJtLT5pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZCh1dWlkLnB0cigpLCBTdHJpbmc4KCksCisgICAgICAgICAgICAgICAgICAgIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxVbmtub3duLCAmaXNTdXBwb3J0ZWQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSyAmJiBpc1N1cHBvcnRlZCkgewogICAgICAgICAgICAgICAgIHN1cHBvcnRlZERSTXMuYWRkKHV1aWQpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgZHJtLmNsZWFyKCk7CkBAIC0yMzksOCArMjQzLDE0IEBACiAgICAgICAgIHNpemVfdCAqZW5jcnlwdGVkYnl0ZXMpCiB7CiAgICAgLy8gc2l6ZSBuZWVkZWQgdG8gc3RvcmUgYWxsIHRoZSBjcnlwdG8gZGF0YQotICAgIHNpemVfdCBjcnlwdG9zaXplID0gc2l6ZW9mKENyeXB0b0luZm8pICsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSkgKiBudW1TdWJTYW1wbGVzOworICAgIHNpemVfdCBjcnlwdG9zaXplOworICAgIC8vIHNpemVvZihDcnlwdG9JbmZvKSArIHNpemVvZihDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSkgKiBudW1TdWJTYW1wbGVzOworICAgIGlmIChfX2J1aWx0aW5fbXVsX292ZXJmbG93KHNpemVvZihDcnlwdG9QbHVnaW46OlN1YlNhbXBsZSksIG51bVN1YlNhbXBsZXMsICZjcnlwdG9zaXplKSB8fAorICAgICAgICAgICAgX19idWlsdGluX2FkZF9vdmVyZmxvdyhjcnlwdG9zaXplLCBzaXplb2YoQ3J5cHRvSW5mbyksICZjcnlwdG9zaXplKSkgeworICAgICAgICBBTE9HRSgiY3J5cHRvIHNpemUgb3ZlcmZsb3ciKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCiAgICAgQ3J5cHRvSW5mbyAqcmV0ID0gKENyeXB0b0luZm8qKSBtYWxsb2MoY3J5cHRvc2l6ZSk7CiAgICAgaWYgKHJldCA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJjb3VsZG4ndCBhbGxvY2F0ZSAlenUgYnl0ZXMiLCBjcnlwdG9zaXplKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllckRybS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmgKaW5kZXggNTBmNjlmZi4uNDM2MDY1NiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyRHJtLmgKQEAgLTE4LDggKzE4LDggQEAKICNkZWZpbmUgTlVQTEFZRVJfRFJNX0hfCiAKICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgotI2luY2x1ZGUgPG1lZGlhL0lEcm0uaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vSURybS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+IC8vIGZvciBDcnlwdEluZm8KIAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5jcHAKaW5kZXggNDk5MjEzNy4uMzliZTQwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmNwcApAQCAtMjYsNiArMjYsOCBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ2xvY2suaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CkBAIC03NSw2ICs3NywxMCBAQAogCiBzdGF0aWMgY29uc3QgaW50NjRfdCBrTWluaW11bUF1ZGlvQ2xvY2tVcGRhdGVQZXJpb2RVcyA9IDIwIC8qIG1zZWMgKi8gKiAxMDAwOwogCisvLyBEZWZhdWx0IHZpZGVvIGZyYW1lIGRpc3BsYXkgZHVyYXRpb24gd2hlbiBvbmx5IHZpZGVvIGV4aXN0cy4KKy8vIFVzZWQgdG8gc2V0IG1heCBtZWRpYSB0aW1lIGluIE1lZGlhQ2xvY2suCitzdGF0aWMgY29uc3QgaW50NjRfdCBrRGVmYXVsdFZpZGVvRnJhbWVJbnRlcnZhbFVzID0gMTAwMDAwTEw7CisKIC8vIHN0YXRpYwogY29uc3QgTnVQbGF5ZXI6OlJlbmRlcmVyOjpQY21JbmZvIE51UGxheWVyOjpSZW5kZXJlcjo6QVVESU9fUENNSU5GT19JTklUSUFMSVpFUiA9IHsKICAgICAgICAgQVVESU9fQ0hBTk5FTF9OT05FLApAQCAtODcsNiArOTMsMjAgQEAKIC8vIHN0YXRpYwogY29uc3QgaW50NjRfdCBOdVBsYXllcjo6UmVuZGVyZXI6OmtNaW5Qb3NpdGlvblVwZGF0ZURlbGF5VXMgPSAxMDAwMDBsbDsKIAorc3RhdGljIGF1ZGlvX2Zvcm1hdF90IGNvbnN0ZXhwciBhdWRpb0Zvcm1hdEZyb21FbmNvZGluZyhpbnQzMl90IHBjbUVuY29kaW5nKSB7CisgICAgc3dpdGNoIChwY21FbmNvZGluZykgeworICAgIGNhc2Uga0F1ZGlvRW5jb2RpbmdQY21GbG9hdDoKKyAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisgICAgY2FzZSBrQXVkaW9FbmNvZGluZ1BjbTE2Yml0OgorICAgICAgICByZXR1cm4gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgY2FzZSBrQXVkaW9FbmNvZGluZ1BjbThiaXQ6CisgICAgICAgIHJldHVybiBBVURJT19GT1JNQVRfUENNXzhfQklUOyAvLyBUT0RPOiBkbyB3ZSB3YW50IHRvIHN1cHBvcnQgdGhpcz8KKyAgICBkZWZhdWx0OgorICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgZW5jb2Rpbmc6ICVkIiwgX19mdW5jX18sIHBjbUVuY29kaW5nKTsKKyAgICAgICAgcmV0dXJuIEFVRElPX0ZPUk1BVF9JTlZBTElEOworICAgIH0KK30KKwogTnVQbGF5ZXI6OlJlbmRlcmVyOjpSZW5kZXJlcigKICAgICAgICAgY29uc3Qgc3A8TWVkaWFQbGF5ZXJCYXNlOjpBdWRpb1Npbms+ICZzaW5rLAogICAgICAgICBjb25zdCBzcDxNZWRpYUNsb2NrPiAmbWVkaWFDbG9jaywKQEAgLTI5OCwxMSArMzE4LDExIEBACiAgICAgICAgICAgICBtTm90aWZ5Q29tcGxldGVWaWRlbyB8PSBub3RpZnlDb21wbGV0ZTsKICAgICAgICAgICAgICsrbVZpZGVvUXVldWVHZW5lcmF0aW9uOwogICAgICAgICAgICAgKyttVmlkZW9EcmFpbkdlbmVyYXRpb247CisgICAgICAgICAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMgPSAtMTsKICAgICAgICAgfQogCiAgICAgICAgIG1NZWRpYUNsb2NrLT5jbGVhckFuY2hvcigpOwogICAgICAgICBtVmlkZW9MYXRlQnlVcyA9IDA7Ci0gICAgICAgIG1OZXh0VmlkZW9UaW1lTWVkaWFVcyA9IC0xOwogICAgICAgICBtU3luY1F1ZXVlcyA9IGZhbHNlOwogICAgIH0KIApAQCAtMTI4Niw3ICsxMzA2LDcgQEAKICAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMgPSBtZWRpYVRpbWVVczsKICAgICBpZiAoIW1IYXNBdWRpbykgewogICAgICAgICAvLyBzbW9vdGggb3V0IHZpZGVvcyA+PSAxMGZwcwotICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlTWF4VGltZU1lZGlhKG1lZGlhVGltZVVzICsgMTAwMDAwKTsKKyAgICAgICAgbU1lZGlhQ2xvY2stPnVwZGF0ZU1heFRpbWVNZWRpYShtZWRpYVRpbWVVcyArIGtEZWZhdWx0VmlkZW9GcmFtZUludGVydmFsVXMpOwogICAgIH0KIAogICAgIGlmICghbVZpZGVvU2FtcGxlUmVjZWl2ZWQgfHwgbWVkaWFUaW1lVXMgPCBtQXVkaW9GaXJzdEFuY2hvclRpbWVNZWRpYVVzKSB7CkBAIC0xMzUzLDcgKzEzNzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAmJiBtZWRpYVRpbWVVcyA+IG1MYXN0QXVkaW9NZWRpYVRpbWVVcykgewogICAgICAgICAgICAgICAgIC8vIElmIGF1ZGlvIGVuZHMgYmVmb3JlIHZpZGVvLCB2aWRlbyBjb250aW51ZXMgdG8gZHJpdmUgbWVkaWEgY2xvY2suCiAgICAgICAgICAgICAgICAgLy8gQWxzbyBzbW9vdGggb3V0IHZpZGVvcyA+PSAxMGZwcy4KLSAgICAgICAgICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlTWF4VGltZU1lZGlhKG1lZGlhVGltZVVzICsgMTAwMDAwKTsKKyAgICAgICAgICAgICAgICBtTWVkaWFDbG9jay0+dXBkYXRlTWF4VGltZU1lZGlhKG1lZGlhVGltZVVzICsga0RlZmF1bHRWaWRlb0ZyYW1lSW50ZXJ2YWxVcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtMTQyOCw3ICsxNDQ4LDggQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVBbmNob3IoCi0gICAgICAgICAgICAgICAgICAgICAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMsIG5vd1VzLCBtTmV4dFZpZGVvVGltZU1lZGlhVXMgKyAxMDAwMDApOworICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRWaWRlb1RpbWVNZWRpYVVzLCBub3dVcywKKyAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0VmlkZW9UaW1lTWVkaWFVcyArIGtEZWZhdWx0VmlkZW9GcmFtZUludGVydmFsVXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTU4MSw2ICsxNjAyLDE0IEBACiAgICAgICAgICAgICBub3RpZnlDb21wbGV0ZSA9IG1Ob3RpZnlDb21wbGV0ZUF1ZGlvOwogICAgICAgICAgICAgbU5vdGlmeUNvbXBsZXRlQXVkaW8gPSBmYWxzZTsKICAgICAgICAgICAgIG1MYXN0QXVkaW9NZWRpYVRpbWVVcyA9IC0xOworCisgICAgICAgICAgICBtSGFzQXVkaW8gPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChtTmV4dFZpZGVvVGltZU1lZGlhVXMgPj0gMCkgeworICAgICAgICAgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOworICAgICAgICAgICAgICAgIG1NZWRpYUNsb2NrLT51cGRhdGVBbmNob3IoCisgICAgICAgICAgICAgICAgICAgICAgICBtTmV4dFZpZGVvVGltZU1lZGlhVXMsIG5vd1VzLAorICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRWaWRlb1RpbWVNZWRpYVVzICsga0RlZmF1bHRWaWRlb0ZyYW1lSW50ZXJ2YWxVcyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBub3RpZnlDb21wbGV0ZSA9IG1Ob3RpZnlDb21wbGV0ZVZpZGVvOwogICAgICAgICAgICAgbU5vdGlmeUNvbXBsZXRlVmlkZW8gPSBmYWxzZTsKQEAgLTE4ODMsOCArMTkxMiwxMyBAQAogICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigic2FtcGxlLXJhdGUiLCAmc2FtcGxlUmF0ZSkpOwogCisgICAgLy8gcmVhZCBwY20gZW5jb2RpbmcgZnJvbSBNZWRpYUNvZGVjIG91dHB1dCBmb3JtYXQsIGlmIGF2YWlsYWJsZQorICAgIGludDMyX3QgcGNtRW5jb2Rpbmc7CisgICAgYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQgPQorICAgICAgICAgICAgZm9ybWF0LT5maW5kSW50MzIoS0VZX1BDTV9FTkNPRElORywgJnBjbUVuY29kaW5nKSA/CisgICAgICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0RnJvbUVuY29kaW5nKHBjbUVuY29kaW5nKSA6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworCiAgICAgaWYgKG9mZmxvYWRpbmdBdWRpbygpKSB7Ci0gICAgICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CiAgICAgICAgIEFTdHJpbmcgbWltZTsKICAgICAgICAgQ0hFQ0soZm9ybWF0LT5maW5kU3RyaW5nKCJtaW1lIiwgJm1pbWUpKTsKICAgICAgICAgc3RhdHVzX3QgZXJyID0gbWFwTWltZVRvQXVkaW9Gb3JtYXQoYXVkaW9Gb3JtYXQsIG1pbWUuY19zdHIoKSk7CkBAIC0xOTg2LDcgKzIwMjAsNyBAQAogICAgICAgICBjb25zdCBQY21JbmZvIGluZm8gPSB7CiAgICAgICAgICAgICAgICAgKGF1ZGlvX2NoYW5uZWxfbWFza190KWNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdClwY21GbGFncywKLSAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgLy8gVE9ETzogY2hhbmdlIHRvIGF1ZGlvRm9ybWF0CisgICAgICAgICAgICAgICAgYXVkaW9Gb3JtYXQsCiAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZQogICAgICAgICB9OwpAQCAtMjAyNSw3ICsyMDU5LDcgQEAKICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgIChhdWRpb19jaGFubmVsX21hc2tfdCljaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvRm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAwIC8qIGJ1ZmZlckNvdW50IC0gdW51c2VkICovLAogICAgICAgICAgICAgICAgICAgICBtVXNlQXVkaW9DYWxsYmFjayA/ICZOdVBsYXllcjo6UmVuZGVyZXI6OkF1ZGlvU2lua0NhbGxiYWNrIDogTlVMTCwKICAgICAgICAgICAgICAgICAgICAgbVVzZUF1ZGlvQ2FsbGJhY2sgPyB0aGlzIDogTlVMTCwKQEAgLTIwODMsNCArMjExNywzIEBACiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmggYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvTnVQbGF5ZXJSZW5kZXJlci5oCmluZGV4IGEwNDc5NzUuLmE1MjFmNjIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclJlbmRlcmVyLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyUmVuZGVyZXIuaApAQCAtMjgsNyArMjgsNyBAQAogY2xhc3MgIEFXYWtlTG9jazsKIHN0cnVjdCBNZWRpYUNsb2NrOwogY2xhc3MgTWVkaWFDb2RlY0J1ZmZlcjsKLXN0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOworc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOwogCiBzdHJ1Y3QgTnVQbGF5ZXI6OlJlbmRlcmVyIDogcHVibGljIEFIYW5kbGVyIHsKICAgICBlbnVtIEZsYWdzIHsKQEAgLTE1Niw3ICsxNTYsNyBAQAogICAgIExpc3Q8UXVldWVFbnRyeT4gbUF1ZGlvUXVldWU7CiAgICAgTGlzdDxRdWV1ZUVudHJ5PiBtVmlkZW9RdWV1ZTsKICAgICB1aW50MzJfdCBtTnVtRnJhbWVzV3JpdHRlbjsKLSAgICBzcDxWaWRlb0ZyYW1lU2NoZWR1bGVyPiBtVmlkZW9TY2hlZHVsZXI7CisgICAgc3A8VmlkZW9GcmFtZVNjaGVkdWxlckJhc2U+IG1WaWRlb1NjaGVkdWxlcjsKIAogICAgIGJvb2wgbURyYWluQXVkaW9RdWV1ZVBlbmRpbmc7CiAgICAgYm9vbCBtRHJhaW5WaWRlb1F1ZXVlUGVuZGluZzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9OdVBsYXllclNvdXJjZS5oIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU291cmNlLmgKaW5kZXggOWY1ZWY3OC4uZjEzN2M1MiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU291cmNlLmgKKysrIGIvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL251cGxheWVyL051UGxheWVyU291cmNlLmgKQEAgLTIwLDcgKzIwLDcgQEAKIAogI2luY2x1ZGUgIk51UGxheWVyLmgiCiAKLSNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vSUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvbnVwbGF5ZXIvU3RyZWFtaW5nU291cmNlLmNwcCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCmluZGV4IGFmZGNkMzcuLmYyMWQyYjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS9udXBsYXllci9TdHJlYW1pbmdTb3VyY2UuY3BwCkBAIC0xMzAsMjkgKzEzMCwzMiBAQAogICAgICAgICB9IGVsc2UgaWYgKG4gPCAwKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChidWZmZXJbMF0gPT0gMHgwMCkgeworICAgICAgICAgICAgaWYgKGJ1ZmZlclswXSA9PSAweDAwKSB7IC8vIE9LIHRvIGFjY2VzcyBidWZmZXJbMF0gc2luY2UgbiBtdXN0IGJlID4gMCBoZXJlCiAgICAgICAgICAgICAgICAgLy8gWFhYIGxlZ2FjeQogCiAgICAgICAgICAgICAgICAgaWYgKGV4dHJhID09IE5VTEwpIHsKICAgICAgICAgICAgICAgICAgICAgZXh0cmEgPSBuZXcgQU1lc3NhZ2U7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgdWludDhfdCB0eXBlID0gYnVmZmVyWzFdOworICAgICAgICAgICAgICAgIHVpbnQ4X3QgdHlwZSA9IDA7CisgICAgICAgICAgICAgICAgaWYgKG4gPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSBidWZmZXJbMV07CiAKLSAgICAgICAgICAgICAgICBpZiAodHlwZSAmIDIpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVczsKLSAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZtZWRpYVRpbWVVcywgJmJ1ZmZlclsyXSwgc2l6ZW9mKG1lZGlhVGltZVVzKSk7CisgICAgICAgICAgICAgICAgICAgIGlmICgodHlwZSAmIDIpICYmIChuID49IDIgKyBzaXplb2YoaW50NjRfdCkpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG1lZGlhVGltZVVzOworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KCZtZWRpYVRpbWVVcywgJmJ1ZmZlclsyXSwgc2l6ZW9mKG1lZGlhVGltZVVzKSk7CiAKLSAgICAgICAgICAgICAgICAgICAgZXh0cmEtPnNldEludDY0KGtBVFNQYXJzZXJLZXlNZWRpYVRpbWVVcywgbWVkaWFUaW1lVXMpOworICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEtPnNldEludDY0KGtBVFNQYXJzZXJLZXlNZWRpYVRpbWVVcywgbWVkaWFUaW1lVXMpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgbVRTUGFyc2VyLT5zaWduYWxEaXNjb250aW51aXR5KAogICAgICAgICAgICAgICAgICAgICAgICAgKCh0eXBlICYgMSkgPT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9USU1FCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVFNQYXJzZXI6OkRJU0NPTlRJTlVJVFlfRk9STUFUQ0hBTkdFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IEFUU1BhcnNlcjo6RElTQ09OVElOVUlUWV9USU1FCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVRTUGFyc2VyOjpESVNDT05USU5VSVRZX0ZPUk1BVENIQU5HRSwKICAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVRTUGFyc2VyLT5mZWVkVFNQYWNrZXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gbVRTUGFyc2VyLT5mZWVkVFNQYWNrZXQoYnVmZmVyLCBuKTsKIAogICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIlRTIFBhcnNlciByZXR1cm5lZCBlcnJvciAlZCIsIGVycik7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGU4NmI2OGEuLjgzNTc5MjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9BbmRyb2lkLmJwCkBAIC02LDE0ICs2LDIxIEBACiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJtZWRpYSIsCiAgICAgICAgICJsaWJtZWRpYXBsYXllcnNlcnZpY2UiLAogICAgICAgICAibGlibWVkaWFkcm0iLAorICAgICAgICAibGlicmVzb3VyY2VtYW5hZ2Vyc2VydmljZSIsCiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4xIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMiIsCiAgICAgXSwKIAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlciIsCisgICAgXSwKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdC5jcHAgYi9tZWRpYS9saWJtZWRpYXBsYXllcnNlcnZpY2UvdGVzdHMvRHJtU2Vzc2lvbk1hbmFnZXJfdGVzdC5jcHAKaW5kZXggZDgxZWUwNS4uNThlNGJlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlibWVkaWFwbGF5ZXJzZXJ2aWNlL3Rlc3RzL0RybVNlc3Npb25NYW5hZ2VyX3Rlc3QuY3BwCisrKyBiL21lZGlhL2xpYm1lZGlhcGxheWVyc2VydmljZS90ZXN0cy9Ecm1TZXNzaW9uTWFuYWdlcl90ZXN0LmNwcApAQCAtMjAsMTQgKzIwLDI5IEBACiAKICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCisjaW5jbHVkZSA8bWVkaWEvSVJlc291cmNlTWFuYWdlclNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9JUmVzb3VyY2VNYW5hZ2VyQ2xpZW50Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mb0ludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhZHJtL0RybUhhbC5oPgogI2luY2x1ZGUgPG1lZGlhZHJtL0RybVNlc3Npb25DbGllbnRJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxtZWRpYWRybS9Ecm1TZXNzaW9uTWFuYWdlci5oPgogCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIlJlc291cmNlTWFuYWdlclNlcnZpY2UuaCIKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdGF0aWMgVmVjdG9yPHVpbnQ4X3Q+IHRvQW5kcm9pZFZlY3Rvcihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiAmdmVjKSB7CisgICAgVmVjdG9yPHVpbnQ4X3Q+IGFWZWM7CisgICAgZm9yIChhdXRvIGIgOiB2ZWMpIHsKKyAgICAgICAgYVZlYy5wdXNoX2JhY2soYik7CisgICAgfQorICAgIHJldHVybiBhVmVjOworfQorCiBzdHJ1Y3QgRmFrZVByb2Nlc3NJbmZvIDogcHVibGljIFByb2Nlc3NJbmZvSW50ZXJmYWNlIHsKICAgICBGYWtlUHJvY2Vzc0luZm8oKSB7fQogICAgIHZpcnR1YWwgfkZha2VQcm9jZXNzSW5mbygpIHt9CkBAIC00NywxNzMgKzYyLDEyOCBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZha2VQcm9jZXNzSW5mbyk7CiB9OwogCi1zdHJ1Y3QgRmFrZURybSA6IHB1YmxpYyBEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlIHsKLSAgICBGYWtlRHJtKCkge30KK3N0cnVjdCBGYWtlRHJtIDogcHVibGljIEJuUmVzb3VyY2VNYW5hZ2VyQ2xpZW50IHsKKyAgICBGYWtlRHJtKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBzZXNzaW9uSWQsIGNvbnN0IHNwPERybVNlc3Npb25NYW5hZ2VyPiYgbWFuYWdlcikKKyAgICAgICAgOiBtU2Vzc2lvbklkKHRvQW5kcm9pZFZlY3RvcihzZXNzaW9uSWQpKSwKKyAgICAgICAgICBtUmVjbGFpbWVkKGZhbHNlKSwKKyAgICAgICAgICBtRHJtU2Vzc2lvbk1hbmFnZXIobWFuYWdlcikge30KKwogICAgIHZpcnR1YWwgfkZha2VEcm0oKSB7fQogCi0gICAgdmlydHVhbCBib29sIHJlY2xhaW1TZXNzaW9uKGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkKSB7Ci0gICAgICAgIG1SZWNsYWltZWRTZXNzaW9ucy5wdXNoX2JhY2soc2Vzc2lvbklkKTsKKyAgICB2aXJ0dWFsIGJvb2wgcmVjbGFpbVJlc291cmNlKCkgeworICAgICAgICBtUmVjbGFpbWVkID0gdHJ1ZTsKKyAgICAgICAgbURybVNlc3Npb25NYW5hZ2VyLT5yZW1vdmVTZXNzaW9uKG1TZXNzaW9uSWQpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBjb25zdCBWZWN0b3I8VmVjdG9yPHVpbnQ4X3Q+ID4mIHJlY2xhaW1lZFNlc3Npb25zKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVJlY2xhaW1lZFNlc3Npb25zOworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXROYW1lKCkgeworICAgICAgICBTdHJpbmc4IG5hbWUoIkZha2VEcm1bIik7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNlc3Npb25JZC5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgbmFtZS5hcHBlbmRGb3JtYXQoIiUwMngiLCBtU2Vzc2lvbklkW2ldKTsKKyAgICAgICAgfQorICAgICAgICBuYW1lLmFwcGVuZCgiXSIpOworICAgICAgICByZXR1cm4gbmFtZTsKICAgICB9CiAKKyAgICBib29sIGlzUmVjbGFpbWVkKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVJlY2xhaW1lZDsKKyAgICB9CisKKyAgICBjb25zdCBWZWN0b3I8dWludDhfdD4gbVNlc3Npb25JZDsKKwogcHJpdmF0ZToKLSAgICBWZWN0b3I8VmVjdG9yPHVpbnQ4X3Q+ID4gbVJlY2xhaW1lZFNlc3Npb25zOworICAgIGJvb2wgbVJlY2xhaW1lZDsKKyAgICBjb25zdCBzcDxEcm1TZXNzaW9uTWFuYWdlcj4gbURybVNlc3Npb25NYW5hZ2VyOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmFrZURybSk7CiB9OwogCitzdHJ1Y3QgRmFrZVN5c3RlbUNhbGxiYWNrIDoKKyAgICAgICAgcHVibGljIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OlN5c3RlbUNhbGxiYWNrSW50ZXJmYWNlIHsKKyAgICBGYWtlU3lzdGVtQ2FsbGJhY2soKSB7fQorCisgICAgdmlydHVhbCB2b2lkIG5vdGVTdGFydFZpZGVvKGludCAvKnVpZCovKSBvdmVycmlkZSB7fQorCisgICAgdmlydHVhbCB2b2lkIG5vdGVTdG9wVmlkZW8oaW50IC8qdWlkKi8pIG92ZXJyaWRlIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgbm90ZVJlc2V0VmlkZW8oKSBvdmVycmlkZSB7fQorCisgICAgdmlydHVhbCBib29sIHJlcXVlc3RDcHVzZXRCb29zdCgKKyAgICAgICAgICAgIGJvb2wgLyplbmFibGUqLywgY29uc3Qgc3A8SUludGVyZmFjZT4gJi8qY2xpZW50Ki8pIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+RmFrZVN5c3RlbUNhbGxiYWNrKCkge30KKworcHJpdmF0ZToKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZha2VTeXN0ZW1DYWxsYmFjayk7Cit9OworCiBzdGF0aWMgY29uc3QgaW50IGtUZXN0UGlkMSA9IDMwOwogc3RhdGljIGNvbnN0IGludCBrVGVzdFBpZDIgPSAyMDsKLXN0YXRpYyBjb25zdCB1aW50OF90IGtUZXN0U2Vzc2lvbklkMVtdID0gezEsIDIsIDN9Owotc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1Rlc3RTZXNzaW9uSWQyW10gPSB7NCwgNSwgNiwgNywgOH07Ci1zdGF0aWMgY29uc3QgdWludDhfdCBrVGVzdFNlc3Npb25JZDNbXSA9IHs5LCAwfTsKK3N0YXRpYyBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiBrVGVzdFNlc3Npb25JZDF7MSwgMiwgM307CitzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4ga1Rlc3RTZXNzaW9uSWQyezQsIDUsIDYsIDcsIDh9Oworc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGtUZXN0U2Vzc2lvbklkM3s5LCAwfTsKIAogY2xhc3MgRHJtU2Vzc2lvbk1hbmFnZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CiBwdWJsaWM6CiAgICAgRHJtU2Vzc2lvbk1hbmFnZXJUZXN0KCkKLSAgICAgICAgOiBtRHJtU2Vzc2lvbk1hbmFnZXIobmV3IERybVNlc3Npb25NYW5hZ2VyKG5ldyBGYWtlUHJvY2Vzc0luZm8oKSkpLAotICAgICAgICAgIG1UZXN0RHJtMShuZXcgRmFrZURybSgpKSwKLSAgICAgICAgICBtVGVzdERybTIobmV3IEZha2VEcm0oKSkgewotICAgICAgICBHZXRTZXNzaW9uSWQoa1Rlc3RTZXNzaW9uSWQxLCBBUlJBWV9TSVpFKGtUZXN0U2Vzc2lvbklkMSksICZtU2Vzc2lvbklkMSk7Ci0gICAgICAgIEdldFNlc3Npb25JZChrVGVzdFNlc3Npb25JZDIsIEFSUkFZX1NJWkUoa1Rlc3RTZXNzaW9uSWQyKSwgJm1TZXNzaW9uSWQyKTsKLSAgICAgICAgR2V0U2Vzc2lvbklkKGtUZXN0U2Vzc2lvbklkMywgQVJSQVlfU0laRShrVGVzdFNlc3Npb25JZDMpLCAmbVNlc3Npb25JZDMpOworICAgICAgICA6IG1TZXJ2aWNlKG5ldyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKG5ldyBGYWtlUHJvY2Vzc0luZm8oKSwgbmV3IEZha2VTeXN0ZW1DYWxsYmFjaygpKSksCisgICAgICAgICAgbURybVNlc3Npb25NYW5hZ2VyKG5ldyBEcm1TZXNzaW9uTWFuYWdlcihtU2VydmljZSkpLAorICAgICAgICAgIG1UZXN0RHJtMShuZXcgRmFrZURybShrVGVzdFNlc3Npb25JZDEsIG1Ecm1TZXNzaW9uTWFuYWdlcikpLAorICAgICAgICAgIG1UZXN0RHJtMihuZXcgRmFrZURybShrVGVzdFNlc3Npb25JZDIsIG1Ecm1TZXNzaW9uTWFuYWdlcikpLAorICAgICAgICAgIG1UZXN0RHJtMyhuZXcgRmFrZURybShrVGVzdFNlc3Npb25JZDMsIG1Ecm1TZXNzaW9uTWFuYWdlcikpIHsKKyAgICAgICAgRHJtU2Vzc2lvbk1hbmFnZXIgKnB0ciA9IG5ldyBEcm1TZXNzaW9uTWFuYWdlcihtU2VydmljZSk7CisgICAgICAgIEVYUEVDVF9ORShwdHIsIG51bGxwdHIpOworICAgICAgICAvKiBtRHJtU2Vzc2lvbk1hbmFnZXIgPSBwdHI7ICovCiAgICAgfQogCiBwcm90ZWN0ZWQ6Ci0gICAgc3RhdGljIHZvaWQgR2V0U2Vzc2lvbklkKGNvbnN0IHVpbnQ4X3QqIGlkcywgc2l6ZV90IG51bSwgVmVjdG9yPHVpbnQ4X3Q+KiBzZXNzaW9uSWQpIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW07ICsraSkgewotICAgICAgICAgICAgc2Vzc2lvbklkLT5wdXNoX2JhY2soaWRzW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIEV4cGVjdEVxU2Vzc2lvbkluZm8oY29uc3QgU2Vzc2lvbkluZm8mIGluZm8sIHNwPERybVNlc3Npb25DbGllbnRJbnRlcmZhY2U+IGRybSwKLSAgICAgICAgICAgIGNvbnN0IFZlY3Rvcjx1aW50OF90PiYgc2Vzc2lvbklkLCBpbnQ2NF90IHRpbWVTdGFtcCkgewotICAgICAgICBFWFBFQ1RfRVEoZHJtLCBpbmZvLmRybSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGlzRXF1YWxTZXNzaW9uSWQoc2Vzc2lvbklkLCBpbmZvLnNlc3Npb25JZCkpOwotICAgICAgICBFWFBFQ1RfRVEodGltZVN0YW1wLCBpbmZvLnRpbWVTdGFtcCk7Ci0gICAgfQotCiAgICAgdm9pZCBhZGRTZXNzaW9uKCkgewotICAgICAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPmFkZFNlc3Npb24oa1Rlc3RQaWQxLCBtVGVzdERybTEsIG1TZXNzaW9uSWQxKTsKLSAgICAgICAgbURybVNlc3Npb25NYW5hZ2VyLT5hZGRTZXNzaW9uKGtUZXN0UGlkMiwgbVRlc3REcm0yLCBtU2Vzc2lvbklkMik7Ci0gICAgICAgIG1Ecm1TZXNzaW9uTWFuYWdlci0+YWRkU2Vzc2lvbihrVGVzdFBpZDIsIG1UZXN0RHJtMiwgbVNlc3Npb25JZDMpOwotICAgICAgICBjb25zdCBQaWRTZXNzaW9uSW5mb3NNYXAmIG1hcCA9IHNlc3Npb25NYXAoKTsKLSAgICAgICAgRVhQRUNUX0VRKDJ1LCBtYXAuc2l6ZSgpKTsKLSAgICAgICAgc3NpemVfdCBpbmRleDEgPSBtYXAuaW5kZXhPZktleShrVGVzdFBpZDEpOwotICAgICAgICBBU1NFUlRfR0UoaW5kZXgxLCAwKTsKLSAgICAgICAgY29uc3QgU2Vzc2lvbkluZm9zJiBpbmZvczEgPSBtYXBbaW5kZXgxXTsKLSAgICAgICAgRVhQRUNUX0VRKDF1LCBpbmZvczEuc2l6ZSgpKTsKLSAgICAgICAgRXhwZWN0RXFTZXNzaW9uSW5mbyhpbmZvczFbMF0sIG1UZXN0RHJtMSwgbVNlc3Npb25JZDEsIDApOwotCi0gICAgICAgIHNzaXplX3QgaW5kZXgyID0gbWFwLmluZGV4T2ZLZXkoa1Rlc3RQaWQyKTsKLSAgICAgICAgQVNTRVJUX0dFKGluZGV4MiwgMCk7Ci0gICAgICAgIGNvbnN0IFNlc3Npb25JbmZvcyYgaW5mb3MyID0gbWFwW2luZGV4Ml07Ci0gICAgICAgIEVYUEVDVF9FUSgydSwgaW5mb3MyLnNpemUoKSk7Ci0gICAgICAgIEV4cGVjdEVxU2Vzc2lvbkluZm8oaW5mb3MyWzBdLCBtVGVzdERybTIsIG1TZXNzaW9uSWQyLCAxKTsKLSAgICAgICAgRXhwZWN0RXFTZXNzaW9uSW5mbyhpbmZvczJbMV0sIG1UZXN0RHJtMiwgbVNlc3Npb25JZDMsIDIpOworICAgICAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPmFkZFNlc3Npb24oa1Rlc3RQaWQxLCBtVGVzdERybTEsIG1UZXN0RHJtMS0+bVNlc3Npb25JZCk7CisgICAgICAgIG1Ecm1TZXNzaW9uTWFuYWdlci0+YWRkU2Vzc2lvbihrVGVzdFBpZDIsIG1UZXN0RHJtMiwgbVRlc3REcm0yLT5tU2Vzc2lvbklkKTsKKyAgICAgICAgbURybVNlc3Npb25NYW5hZ2VyLT5hZGRTZXNzaW9uKGtUZXN0UGlkMiwgbVRlc3REcm0zLCBtVGVzdERybTMtPm1TZXNzaW9uSWQpOwogICAgIH0KIAotICAgIGNvbnN0IFBpZFNlc3Npb25JbmZvc01hcCYgc2Vzc2lvbk1hcCgpIHsKLSAgICAgICAgcmV0dXJuIG1Ecm1TZXNzaW9uTWFuYWdlci0+bVNlc3Npb25NYXA7Ci0gICAgfQotCi0gICAgdm9pZCB0ZXN0R2V0TG93ZXN0UHJpb3JpdHkoKSB7Ci0gICAgICAgIGludCBwaWQ7Ci0gICAgICAgIGludCBwcmlvcml0eTsKLSAgICAgICAgRVhQRUNUX0ZBTFNFKG1Ecm1TZXNzaW9uTWFuYWdlci0+Z2V0TG93ZXN0UHJpb3JpdHlfbCgmcGlkLCAmcHJpb3JpdHkpKTsKLQotICAgICAgICBhZGRTZXNzaW9uKCk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKG1Ecm1TZXNzaW9uTWFuYWdlci0+Z2V0TG93ZXN0UHJpb3JpdHlfbCgmcGlkLCAmcHJpb3JpdHkpKTsKLQotICAgICAgICBFWFBFQ1RfRVEoa1Rlc3RQaWQxLCBwaWQpOwotICAgICAgICBGYWtlUHJvY2Vzc0luZm8gcHJvY2Vzc0luZm87Ci0gICAgICAgIGludCBwcmlvcml0eTE7Ci0gICAgICAgIHByb2Nlc3NJbmZvLmdldFByaW9yaXR5KGtUZXN0UGlkMSwgJnByaW9yaXR5MSk7Ci0gICAgICAgIEVYUEVDVF9FUShwcmlvcml0eTEsIHByaW9yaXR5KTsKLSAgICB9Ci0KLSAgICB2b2lkIHRlc3RHZXRMZWFzdFVzZWRTZXNzaW9uKCkgewotICAgICAgICBzcDxEcm1TZXNzaW9uQ2xpZW50SW50ZXJmYWNlPiBkcm07Ci0gICAgICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7Ci0gICAgICAgIEVYUEVDVF9GQUxTRShtRHJtU2Vzc2lvbk1hbmFnZXItPmdldExlYXN0VXNlZFNlc3Npb25fbChrVGVzdFBpZDEsICZkcm0sICZzZXNzaW9uSWQpKTsKLQotICAgICAgICBhZGRTZXNzaW9uKCk7Ci0KLSAgICAgICAgRVhQRUNUX1RSVUUobURybVNlc3Npb25NYW5hZ2VyLT5nZXRMZWFzdFVzZWRTZXNzaW9uX2woa1Rlc3RQaWQxLCAmZHJtLCAmc2Vzc2lvbklkKSk7Ci0gICAgICAgIEVYUEVDVF9FUShtVGVzdERybTEsIGRybSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGlzRXF1YWxTZXNzaW9uSWQobVNlc3Npb25JZDEsIHNlc3Npb25JZCkpOwotCi0gICAgICAgIEVYUEVDVF9UUlVFKG1Ecm1TZXNzaW9uTWFuYWdlci0+Z2V0TGVhc3RVc2VkU2Vzc2lvbl9sKGtUZXN0UGlkMiwgJmRybSwgJnNlc3Npb25JZCkpOwotICAgICAgICBFWFBFQ1RfRVEobVRlc3REcm0yLCBkcm0pOwotICAgICAgICBFWFBFQ1RfVFJVRShpc0VxdWFsU2Vzc2lvbklkKG1TZXNzaW9uSWQyLCBzZXNzaW9uSWQpKTsKLQotICAgICAgICAvLyBtU2Vzc2lvbklkMiBpcyBubyBsb25nZXIgdGhlIGxlYXN0IHVzZWQgc2Vzc2lvbi4KLSAgICAgICAgbURybVNlc3Npb25NYW5hZ2VyLT51c2VTZXNzaW9uKG1TZXNzaW9uSWQyKTsKLSAgICAgICAgRVhQRUNUX1RSVUUobURybVNlc3Npb25NYW5hZ2VyLT5nZXRMZWFzdFVzZWRTZXNzaW9uX2woa1Rlc3RQaWQyLCAmZHJtLCAmc2Vzc2lvbklkKSk7Ci0gICAgICAgIEVYUEVDVF9FUShtVGVzdERybTIsIGRybSk7Ci0gICAgICAgIEVYUEVDVF9UUlVFKGlzRXF1YWxTZXNzaW9uSWQobVNlc3Npb25JZDMsIHNlc3Npb25JZCkpOwotICAgIH0KLQorICAgIHNwPElSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlPiBtU2VydmljZTsKICAgICBzcDxEcm1TZXNzaW9uTWFuYWdlcj4gbURybVNlc3Npb25NYW5hZ2VyOwogICAgIHNwPEZha2VEcm0+IG1UZXN0RHJtMTsKICAgICBzcDxGYWtlRHJtPiBtVGVzdERybTI7Ci0gICAgVmVjdG9yPHVpbnQ4X3Q+IG1TZXNzaW9uSWQxOwotICAgIFZlY3Rvcjx1aW50OF90PiBtU2Vzc2lvbklkMjsKLSAgICBWZWN0b3I8dWludDhfdD4gbVNlc3Npb25JZDM7CisgICAgc3A8RmFrZURybT4gbVRlc3REcm0zOwogfTsKIAogVEVTVF9GKERybVNlc3Npb25NYW5hZ2VyVGVzdCwgYWRkU2Vzc2lvbikgewogICAgIGFkZFNlc3Npb24oKTsKKworICAgIEVYUEVDVF9FUSgzdSwgbURybVNlc3Npb25NYW5hZ2VyLT5nZXRTZXNzaW9uQ291bnQoKSk7CisgICAgRVhQRUNUX1RSVUUobURybVNlc3Npb25NYW5hZ2VyLT5jb250YWluc1Nlc3Npb24obVRlc3REcm0xLT5tU2Vzc2lvbklkKSk7CisgICAgRVhQRUNUX1RSVUUobURybVNlc3Npb25NYW5hZ2VyLT5jb250YWluc1Nlc3Npb24obVRlc3REcm0yLT5tU2Vzc2lvbklkKSk7CisgICAgRVhQRUNUX1RSVUUobURybVNlc3Npb25NYW5hZ2VyLT5jb250YWluc1Nlc3Npb24obVRlc3REcm0zLT5tU2Vzc2lvbklkKSk7CiB9CiAKIFRFU1RfRihEcm1TZXNzaW9uTWFuYWdlclRlc3QsIHVzZVNlc3Npb24pIHsKICAgICBhZGRTZXNzaW9uKCk7CiAKLSAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPnVzZVNlc3Npb24obVNlc3Npb25JZDEpOwotICAgIG1Ecm1TZXNzaW9uTWFuYWdlci0+dXNlU2Vzc2lvbihtU2Vzc2lvbklkMyk7CisgICAgbURybVNlc3Npb25NYW5hZ2VyLT51c2VTZXNzaW9uKG1UZXN0RHJtMS0+bVNlc3Npb25JZCk7CisgICAgbURybVNlc3Npb25NYW5hZ2VyLT51c2VTZXNzaW9uKG1UZXN0RHJtMy0+bVNlc3Npb25JZCk7CiAKLSAgICBjb25zdCBQaWRTZXNzaW9uSW5mb3NNYXAmIG1hcCA9IHNlc3Npb25NYXAoKTsKLSAgICBjb25zdCBTZXNzaW9uSW5mb3MmIGluZm9zMSA9IG1hcC52YWx1ZUZvcihrVGVzdFBpZDEpOwotICAgIGNvbnN0IFNlc3Npb25JbmZvcyYgaW5mb3MyID0gbWFwLnZhbHVlRm9yKGtUZXN0UGlkMik7Ci0gICAgRXhwZWN0RXFTZXNzaW9uSW5mbyhpbmZvczFbMF0sIG1UZXN0RHJtMSwgbVNlc3Npb25JZDEsIDMpOwotICAgIEV4cGVjdEVxU2Vzc2lvbkluZm8oaW5mb3MyWzFdLCBtVGVzdERybTIsIG1TZXNzaW9uSWQzLCA0KTsKKyAgICBFWFBFQ1RfRVEoM3UsIG1Ecm1TZXNzaW9uTWFuYWdlci0+Z2V0U2Vzc2lvbkNvdW50KCkpOworICAgIEVYUEVDVF9UUlVFKG1Ecm1TZXNzaW9uTWFuYWdlci0+Y29udGFpbnNTZXNzaW9uKG1UZXN0RHJtMS0+bVNlc3Npb25JZCkpOworICAgIEVYUEVDVF9UUlVFKG1Ecm1TZXNzaW9uTWFuYWdlci0+Y29udGFpbnNTZXNzaW9uKG1UZXN0RHJtMi0+bVNlc3Npb25JZCkpOworICAgIEVYUEVDVF9UUlVFKG1Ecm1TZXNzaW9uTWFuYWdlci0+Y29udGFpbnNTZXNzaW9uKG1UZXN0RHJtMy0+bVNlc3Npb25JZCkpOwogfQogCiBURVNUX0YoRHJtU2Vzc2lvbk1hbmFnZXJUZXN0LCByZW1vdmVTZXNzaW9uKSB7CiAgICAgYWRkU2Vzc2lvbigpOwogCi0gICAgbURybVNlc3Npb25NYW5hZ2VyLT5yZW1vdmVTZXNzaW9uKG1TZXNzaW9uSWQyKTsKKyAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPnJlbW92ZVNlc3Npb24obVRlc3REcm0yLT5tU2Vzc2lvbklkKTsKIAotICAgIGNvbnN0IFBpZFNlc3Npb25JbmZvc01hcCYgbWFwID0gc2Vzc2lvbk1hcCgpOwotICAgIEVYUEVDVF9FUSgydSwgbWFwLnNpemUoKSk7Ci0gICAgY29uc3QgU2Vzc2lvbkluZm9zJiBpbmZvczEgPSBtYXAudmFsdWVGb3Ioa1Rlc3RQaWQxKTsKLSAgICBjb25zdCBTZXNzaW9uSW5mb3MmIGluZm9zMiA9IG1hcC52YWx1ZUZvcihrVGVzdFBpZDIpOwotICAgIEVYUEVDVF9FUSgxdSwgaW5mb3MxLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKDF1LCBpbmZvczIuc2l6ZSgpKTsKLSAgICAvLyBtU2Vzc2lvbklkMiBoYXMgYmVlbiByZW1vdmVkLgotICAgIEV4cGVjdEVxU2Vzc2lvbkluZm8oaW5mb3MyWzBdLCBtVGVzdERybTIsIG1TZXNzaW9uSWQzLCAyKTsKLX0KLQotVEVTVF9GKERybVNlc3Npb25NYW5hZ2VyVGVzdCwgcmVtb3ZlRHJtKSB7Ci0gICAgYWRkU2Vzc2lvbigpOwotCi0gICAgc3A8RmFrZURybT4gZHJtID0gbmV3IEZha2VEcm07Ci0gICAgY29uc3QgdWludDhfdCBpZHNbXSA9IHsxMjN9OwotICAgIFZlY3Rvcjx1aW50OF90PiBzZXNzaW9uSWQ7Ci0gICAgR2V0U2Vzc2lvbklkKGlkcywgQVJSQVlfU0laRShpZHMpLCAmc2Vzc2lvbklkKTsKLSAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPmFkZFNlc3Npb24oa1Rlc3RQaWQyLCBkcm0sIHNlc3Npb25JZCk7Ci0KLSAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPnJlbW92ZURybShtVGVzdERybTIpOwotCi0gICAgY29uc3QgUGlkU2Vzc2lvbkluZm9zTWFwJiBtYXAgPSBzZXNzaW9uTWFwKCk7Ci0gICAgY29uc3QgU2Vzc2lvbkluZm9zJiBpbmZvczIgPSBtYXAudmFsdWVGb3Ioa1Rlc3RQaWQyKTsKLSAgICBFWFBFQ1RfRVEoMXUsIGluZm9zMi5zaXplKCkpOwotICAgIC8vIG1UZXN0RHJtMiBoYXMgYmVlbiByZW1vdmVkLgotICAgIEV4cGVjdEVxU2Vzc2lvbkluZm8oaW5mb3MyWzBdLCBkcm0sIHNlc3Npb25JZCwgMyk7CisgICAgRVhQRUNUX0VRKDJ1LCBtRHJtU2Vzc2lvbk1hbmFnZXItPmdldFNlc3Npb25Db3VudCgpKTsKKyAgICBFWFBFQ1RfVFJVRShtRHJtU2Vzc2lvbk1hbmFnZXItPmNvbnRhaW5zU2Vzc2lvbihtVGVzdERybTEtPm1TZXNzaW9uSWQpKTsKKyAgICBFWFBFQ1RfRkFMU0UobURybVNlc3Npb25NYW5hZ2VyLT5jb250YWluc1Nlc3Npb24obVRlc3REcm0yLT5tU2Vzc2lvbklkKSk7CisgICAgRVhQRUNUX1RSVUUobURybVNlc3Npb25NYW5hZ2VyLT5jb250YWluc1Nlc3Npb24obVRlc3REcm0zLT5tU2Vzc2lvbklkKSk7CiB9CiAKIFRFU1RfRihEcm1TZXNzaW9uTWFuYWdlclRlc3QsIHJlY2xhaW1TZXNzaW9uKSB7CkBAIC0yMjQsMzAgKzE5NCw2MyBAQAogICAgIEVYUEVDVF9GQUxTRShtRHJtU2Vzc2lvbk1hbmFnZXItPnJlY2xhaW1TZXNzaW9uKDUwKSk7CiAKICAgICBFWFBFQ1RfVFJVRShtRHJtU2Vzc2lvbk1hbmFnZXItPnJlY2xhaW1TZXNzaW9uKDEwKSk7Ci0gICAgRVhQRUNUX0VRKDF1LCBtVGVzdERybTEtPnJlY2xhaW1lZFNlc3Npb25zKCkuc2l6ZSgpKTsKLSAgICBFWFBFQ1RfVFJVRShpc0VxdWFsU2Vzc2lvbklkKG1TZXNzaW9uSWQxLCBtVGVzdERybTEtPnJlY2xhaW1lZFNlc3Npb25zKClbMF0pKTsKLQotICAgIG1Ecm1TZXNzaW9uTWFuYWdlci0+cmVtb3ZlU2Vzc2lvbihtU2Vzc2lvbklkMSk7CisgICAgRVhQRUNUX1RSVUUobVRlc3REcm0xLT5pc1JlY2xhaW1lZCgpKTsKIAogICAgIC8vIGFkZCBhIHNlc3Npb24gZnJvbSBhIGhpZ2hlciBwcmlvcml0eSBwcm9jZXNzLgotICAgIHNwPEZha2VEcm0+IGRybSA9IG5ldyBGYWtlRHJtOwotICAgIGNvbnN0IHVpbnQ4X3QgaWRzW10gPSB7MSwgMywgNX07Ci0gICAgVmVjdG9yPHVpbnQ4X3Q+IHNlc3Npb25JZDsKLSAgICBHZXRTZXNzaW9uSWQoaWRzLCBBUlJBWV9TSVpFKGlkcyksICZzZXNzaW9uSWQpOwotICAgIG1Ecm1TZXNzaW9uTWFuYWdlci0+YWRkU2Vzc2lvbigxNSwgZHJtLCBzZXNzaW9uSWQpOworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHNpZHsxLCAzLCA1fTsKKyAgICBzcDxGYWtlRHJtPiBkcm0gPSBuZXcgRmFrZURybShzaWQsIG1Ecm1TZXNzaW9uTWFuYWdlcik7CisgICAgbURybVNlc3Npb25NYW5hZ2VyLT5hZGRTZXNzaW9uKDE1LCBkcm0sIGRybS0+bVNlc3Npb25JZCk7CiAKKyAgICAvLyBtYWtlIHN1cmUgbVRlc3REcm0yIGlzIHJlY2xhaW1lZCBuZXh0IGluc3RlYWQgb2YgbVRlc3REcm0zCisgICAgbURybVNlc3Npb25NYW5hZ2VyLT51c2VTZXNzaW9uKG1UZXN0RHJtMy0+bVNlc3Npb25JZCk7CiAgICAgRVhQRUNUX1RSVUUobURybVNlc3Npb25NYW5hZ2VyLT5yZWNsYWltU2Vzc2lvbigxOCkpOwotICAgIEVYUEVDVF9FUSgxdSwgbVRlc3REcm0yLT5yZWNsYWltZWRTZXNzaW9ucygpLnNpemUoKSk7Ci0gICAgLy8gbVNlc3Npb25JZDIgaXMgcmVjbGFpbWVkLgotICAgIEVYUEVDVF9UUlVFKGlzRXF1YWxTZXNzaW9uSWQobVNlc3Npb25JZDIsIG1UZXN0RHJtMi0+cmVjbGFpbWVkU2Vzc2lvbnMoKVswXSkpOworICAgIEVYUEVDVF9UUlVFKG1UZXN0RHJtMi0+aXNSZWNsYWltZWQoKSk7CisKKyAgICBFWFBFQ1RfRVEoMnUsIG1Ecm1TZXNzaW9uTWFuYWdlci0+Z2V0U2Vzc2lvbkNvdW50KCkpOworICAgIEVYUEVDVF9GQUxTRShtRHJtU2Vzc2lvbk1hbmFnZXItPmNvbnRhaW5zU2Vzc2lvbihtVGVzdERybTEtPm1TZXNzaW9uSWQpKTsKKyAgICBFWFBFQ1RfRkFMU0UobURybVNlc3Npb25NYW5hZ2VyLT5jb250YWluc1Nlc3Npb24obVRlc3REcm0yLT5tU2Vzc2lvbklkKSk7CisgICAgRVhQRUNUX1RSVUUobURybVNlc3Npb25NYW5hZ2VyLT5jb250YWluc1Nlc3Npb24obVRlc3REcm0zLT5tU2Vzc2lvbklkKSk7CisgICAgRVhQRUNUX1RSVUUobURybVNlc3Npb25NYW5hZ2VyLT5jb250YWluc1Nlc3Npb24oZHJtLT5tU2Vzc2lvbklkKSk7CiB9CiAKLVRFU1RfRihEcm1TZXNzaW9uTWFuYWdlclRlc3QsIGdldExvd2VzdFByaW9yaXR5KSB7Ci0gICAgdGVzdEdldExvd2VzdFByaW9yaXR5KCk7Ci19CitURVNUX0YoRHJtU2Vzc2lvbk1hbmFnZXJUZXN0LCByZWNsYWltQWZ0ZXJVc2UpIHsKKyAgICAvLyBub3RoaW5nIHRvIHJlY2xhaW0geWV0CisgICAgRVhQRUNUX0ZBTFNFKG1Ecm1TZXNzaW9uTWFuYWdlci0+cmVjbGFpbVNlc3Npb24oa1Rlc3RQaWQxKSk7CisgICAgRVhQRUNUX0ZBTFNFKG1Ecm1TZXNzaW9uTWFuYWdlci0+cmVjbGFpbVNlc3Npb24oa1Rlc3RQaWQyKSk7CiAKLVRFU1RfRihEcm1TZXNzaW9uTWFuYWdlclRlc3QsIGdldExlYXN0VXNlZFNlc3Npb25fbCkgewotICAgIHRlc3RHZXRMZWFzdFVzZWRTZXNzaW9uKCk7CisgICAgLy8gYWRkIHNlc3Npb25zIGZyb20gc2FtZSBwaWQKKyAgICBtRHJtU2Vzc2lvbk1hbmFnZXItPmFkZFNlc3Npb24oa1Rlc3RQaWQyLCBtVGVzdERybTEsIG1UZXN0RHJtMS0+bVNlc3Npb25JZCk7CisgICAgbURybVNlc3Npb25NYW5hZ2VyLT5hZGRTZXNzaW9uKGtUZXN0UGlkMiwgbVRlc3REcm0yLCBtVGVzdERybTItPm1TZXNzaW9uSWQpOworICAgIG1Ecm1TZXNzaW9uTWFuYWdlci0+YWRkU2Vzc2lvbihrVGVzdFBpZDIsIG1UZXN0RHJtMywgbVRlc3REcm0zLT5tU2Vzc2lvbklkKTsKKworICAgIC8vIHVzZSBzb21lIGJ1dCBub3QgYWxsIHNlc3Npb25zCisgICAgbURybVNlc3Npb25NYW5hZ2VyLT51c2VTZXNzaW9uKG1UZXN0RHJtMS0+bVNlc3Npb25JZCk7CisgICAgbURybVNlc3Npb25NYW5hZ2VyLT51c2VTZXNzaW9uKG1UZXN0RHJtMS0+bVNlc3Npb25JZCk7CisgICAgbURybVNlc3Npb25NYW5hZ2VyLT51c2VTZXNzaW9uKG1UZXN0RHJtMi0+bVNlc3Npb25JZCk7CisKKyAgICAvLyBjYWxsaW5nIHBpZCBwcmlvcml0eSBpcyB0b28gbG93CisgICAgaW50IGxvd1ByaW9yaXR5UGlkID0ga1Rlc3RQaWQyICsgMTsKKyAgICBFWFBFQ1RfRkFMU0UobURybVNlc3Npb25NYW5hZ2VyLT5yZWNsYWltU2Vzc2lvbihsb3dQcmlvcml0eVBpZCkpOworCisgICAgLy8gdW51c2VkIHNlc3Npb24gaXMgcmVjbGFpbWVkIGZpcnN0CisgICAgaW50IGhpZ2hQcmlvcml0eVBpZCA9IGtUZXN0UGlkMiAtIDE7CisgICAgRVhQRUNUX1RSVUUobURybVNlc3Npb25NYW5hZ2VyLT5yZWNsYWltU2Vzc2lvbihoaWdoUHJpb3JpdHlQaWQpKTsKKyAgICBFWFBFQ1RfRkFMU0UobVRlc3REcm0xLT5pc1JlY2xhaW1lZCgpKTsKKyAgICBFWFBFQ1RfRkFMU0UobVRlc3REcm0yLT5pc1JlY2xhaW1lZCgpKTsKKyAgICBFWFBFQ1RfVFJVRShtVGVzdERybTMtPmlzUmVjbGFpbWVkKCkpOworICAgIG1Ecm1TZXNzaW9uTWFuYWdlci0+cmVtb3ZlU2Vzc2lvbihtVGVzdERybTMtPm1TZXNzaW9uSWQpOworCisgICAgLy8gbGVzcy11c2VkIHNlc3Npb24gaXMgcmVjbGFpbWVkIG5leHQKKyAgICBFWFBFQ1RfVFJVRShtRHJtU2Vzc2lvbk1hbmFnZXItPnJlY2xhaW1TZXNzaW9uKGhpZ2hQcmlvcml0eVBpZCkpOworICAgIEVYUEVDVF9GQUxTRShtVGVzdERybTEtPmlzUmVjbGFpbWVkKCkpOworICAgIEVYUEVDVF9UUlVFKG1UZXN0RHJtMi0+aXNSZWNsYWltZWQoKSk7CisgICAgRVhQRUNUX1RSVUUobVRlc3REcm0zLT5pc1JlY2xhaW1lZCgpKTsKKworICAgIC8vIG1vc3QtdXNlZCBzZXNzaW9uIHN0aWxsIG9wZW4KKyAgICBFWFBFQ1RfRVEoMXUsIG1Ecm1TZXNzaW9uTWFuYWdlci0+Z2V0U2Vzc2lvbkNvdW50KCkpOworICAgIEVYUEVDVF9UUlVFKG1Ecm1TZXNzaW9uTWFuYWdlci0+Y29udGFpbnNTZXNzaW9uKG1UZXN0RHJtMS0+bVNlc3Npb25JZCkpOworICAgIEVYUEVDVF9GQUxTRShtRHJtU2Vzc2lvbk1hbmFnZXItPmNvbnRhaW5zU2Vzc2lvbihtVGVzdERybTItPm1TZXNzaW9uSWQpKTsKKyAgICBFWFBFQ1RfRkFMU0UobURybVNlc3Npb25NYW5hZ2VyLT5jb250YWluc1Nlc3Npb24obVRlc3REcm0zLT5tU2Vzc2lvbklkKSk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJuYmFpby9BbmRyb2lkLmJwCmluZGV4IGE0ZGYzOGQuLjA0ZGRjZmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5iYWlvL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibmJhaW8vQW5kcm9pZC5icApAQCAtMSw0ICsxLDMgQEAKLQogY2NfZGVmYXVsdHMgewogICAgIG5hbWU6ICJsaWJuYmFpb19tb25vX2RlZmF1bHRzIiwKICAgICBzcmNzOiBbCkBAIC05LDIwICs4LDI3IEBACiAgICAgaGVhZGVyX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvY2xpZW50X2hlYWRlcnMiLAogICAgICAgICAibGliYXVkaW9fc3lzdGVtX2hlYWRlcnMiLAotICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCiAgICAgXSwKICAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbCiAgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKLSAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAorICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGVfbW9ubyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAogfQogCiAvLyBsaWJuYmFpb19tb25vIGlzIHRoZSBwYXJ0IG9mIGxpYm5iYWlvIHRoYXQgaXMgYXZhaWxhYmxlIGZvciB2ZW5kb3JzIHRvIHVzZS4gVmVuZG9yIG1vZHVsZXMgY2FuJ3QKQEAgLTUzLDIwICs1OSw3IEBACiAgICAgLy8gXSwKICAgICAvLyBzdGF0aWNfbGliczogWyJsaWJzbmRmaWxlIl0sCiAKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYXVkaW91dGlscyIsCi0gICAgICAgICJsaWJiaW5kZXIiLAotICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWwotICAgICAgICAiLVdlcnJvciIsCi0gICAgICAgICItV2FsbCIsCi0gICAgXSwKLQotICAgIGluY2x1ZGVfZGlyczogWyJzeXN0ZW0vbWVkaWEvYXVkaW9fdXRpbHMvaW5jbHVkZSJdLAorICAgIGhlYWRlcl9saWJzOiBbImxpYmF1ZGlvaGFsX2hlYWRlcnMiXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJhaW8vaW5jbHVkZV9tb25vL21lZGlhL25iYWlvL01vbm9QaXBlLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTW9ub1BpcGUuaAppbmRleCBjNTFkMGZlLi45MjZkODRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTW9ub1BpcGUuaAorKysgYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vTW9ub1BpcGUuaApAQCAtMTksNyArMTksNyBAQAogCiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KLSNpbmNsdWRlIDxtZWRpYS9TaW5nbGVTdGF0ZVF1ZXVlLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vU2luZ2xlU3RhdGVRdWV1ZS5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL05CQUlPLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5iYWlvL2luY2x1ZGVfbW9uby9tZWRpYS9uYmFpby9TaW5nbGVTdGF0ZVF1ZXVlLmggYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vU2luZ2xlU3RhdGVRdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyNzYxY2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmFpby9pbmNsdWRlX21vbm8vbWVkaWEvbmJhaW8vU2luZ2xlU3RhdGVRdWV1ZS5oCkBAIC0wLDAgKzEsMTgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDEyIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBTSU5HTEVfU1RBVEVfUVVFVUVfSAorI2RlZmluZSBTSU5HTEVfU1RBVEVfUVVFVUVfSAorCisvLyBOb24tYmxvY2tpbmcgc2luZ2xlIGVsZW1lbnQgc3RhdGUgcXVldWUsIG9yCisvLyBOb24tYmxvY2tpbmcgc2luZ2xlLXJlYWRlciAvIHNpbmdsZS13cml0ZXIgbXVsdGktd29yZCBhdG9taWMgbG9hZCAvIHN0b3JlCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgU2luZ2xlU3RhdGVRdWV1ZSB7CisKK3B1YmxpYzoKKworICAgIGNsYXNzIE11dGF0b3I7CisgICAgY2xhc3MgT2JzZXJ2ZXI7CisKKyAgICBlbnVtIFNTUV9TVEFUVVMgeworICAgICAgICBTU1FfUEVORElORywgLyogPSAwICovCisgICAgICAgIFNTUV9SRUFELAorICAgICAgICBTU1FfRE9ORSwKKyAgICB9OworCisgICAgc3RydWN0IFNoYXJlZCB7CisgICAgICAgIC8vIG5lZWRzIHRvIGJlIHBhcnQgb2YgYSB1bmlvbiBzbyBkb24ndCBkZWZpbmUgY29uc3RydWN0b3Igb3IgZGVzdHJ1Y3RvcgorCisgICAgICAgIGZyaWVuZCBjbGFzcyBNdXRhdG9yOworICAgICAgICBmcmllbmQgY2xhc3MgT2JzZXJ2ZXI7CisKK3ByaXZhdGU6CisgICAgICAgIHZvaWQgICAgICAgICAgICAgICAgaW5pdCgpIHsgbUFjayA9IDA7IG1TZXF1ZW5jZSA9IDA7IH0KKworICAgICAgICB2b2xhdGlsZSBpbnQzMl90ICAgIG1BY2s7CisgICAgICAgIHZvbGF0aWxlIGludDMyX3QgICAgbVNlcXVlbmNlOworICAgICAgICBUICAgICAgICAgICAgICAgICAgIG1WYWx1ZTsKKyAgICB9OworCisgICAgY2xhc3MgTXV0YXRvciB7CisgICAgcHVibGljOgorICAgICAgICBNdXRhdG9yKFNoYXJlZCAqc2hhcmVkKQorICAgICAgICAgICAgOiBtU2VxdWVuY2UoMCksIG1TaGFyZWQoc2hhcmVkKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBleGFjdGx5IG9uZSBvZiBNdXRhdG9yIGFuZCBPYnNlcnZlciBtdXN0IGluaXRpYWxpemUsIGN1cnJlbnRseSBpdCBpcyBPYnNlcnZlcgorICAgICAgICAgICAgLy8gc2hhcmVkLT5pbml0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwdXNoIG5ldyB2YWx1ZSBvbnRvIHN0YXRlIHF1ZXVlLCBvdmVyd3JpdGluZyBwcmV2aW91cyB2YWx1ZTsKKyAgICAgICAgLy8gcmV0dXJucyBhIHNlcXVlbmNlIG51bWJlciB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIGFjaygpCisgICAgICAgIGludDMyX3QgcHVzaChjb25zdCBUJiB2YWx1ZSkKKyAgICAgICAgeworICAgICAgICAgICAgU2hhcmVkICpzaGFyZWQgPSBtU2hhcmVkOworICAgICAgICAgICAgaW50MzJfdCBzZXF1ZW5jZSA9IG1TZXF1ZW5jZTsKKyAgICAgICAgICAgIHNlcXVlbmNlKys7CisgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19hY3F1aXJlX3N0b3JlKHNlcXVlbmNlLCAmc2hhcmVkLT5tU2VxdWVuY2UpOworICAgICAgICAgICAgc2hhcmVkLT5tVmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIHNlcXVlbmNlKys7CisgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlKHNlcXVlbmNlLCAmc2hhcmVkLT5tU2VxdWVuY2UpOworICAgICAgICAgICAgbVNlcXVlbmNlID0gc2VxdWVuY2U7CisgICAgICAgICAgICAvLyBjb25zaWRlciBzaWduYWxsaW5nIGEgZnV0ZXggaGVyZSwgaWYgd2Uga25vdyB0aGF0IG9ic2VydmVyIGlzIHdhaXRpbmcKKyAgICAgICAgICAgIHJldHVybiBzZXF1ZW5jZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJldHVybnMgdGhlIHN0YXR1cyBvZiB0aGUgbGFzdCBzdGF0ZSBwdXNoLiAgVGhpcyBtYXkgYmUgYSBzdGFsZSB2YWx1ZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gU1NRX1BFTkRJTkcsIG9yIDAsIG1lYW5zIGl0IGhhcyBub3QgYmVlbiBvYnNlcnZlZAorICAgICAgICAvLyBTU1FfUkVBRCBtZWFucyBpdCBoYXMgYmVlbiByZWFkCisgICAgICAgIC8vIFNTUV9ET05FIG1lYW5zIGl0IGhhcyBiZWVuIGFjdGVkIHVwb24sIGFmdGVyIE9ic2VydmVyOjpkb25lKCkgaXMgY2FsbGVkCisgICAgICAgIGVudW0gU1NRX1NUQVRVUyBhY2soKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICAvLyBpbiB0aGUgY2FzZSBvZiBTU1FfRE9ORSwgcHJldmVudCBhbnkgc3VidGxlIGRhdGEtcmFjZXMgb2Ygc3Vic2VxdWVudCByZWFkcworICAgICAgICAgICAgLy8gYmVpbmcgcGVyZm9ybWVkIChvdXQtb2Ytb3JkZXIpIGJlZm9yZSB0aGUgYWNrIHJlYWQsIHNob3VsZCB0aGUgY2FsbGVyIGJlCisgICAgICAgICAgICAvLyBkZXBlbmRpbmcgb24gc2VxdWVudGlhbGl0eSBvZiByZWFkcy4KKyAgICAgICAgICAgIGNvbnN0IGludDMyX3QgYWNrID0gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZtU2hhcmVkLT5tQWNrKTsKKyAgICAgICAgICAgIHJldHVybiBhY2sgLSBtU2VxdWVuY2UgJiB+MSA/IFNTUV9QRU5ESU5HIC8qIHNlcSBkaWZmZXIgKi8gOgorICAgICAgICAgICAgICAgICAgICBhY2sgJiAxID8gU1NRX0RPTkUgOiBTU1FfUkVBRDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHJldHVybiB0cnVlIGlmIGEgcHVzaCB3aXRoIHNwZWNpZmllZCBzZXF1ZW5jZSBudW1iZXIgb3IgbGF0ZXIgaGFzIGJlZW4gb2JzZXJ2ZWQKKyAgICAgICAgYm9vbCBhY2soaW50MzJfdCBzZXF1ZW5jZSkgY29uc3QKKyAgICAgICAgeworICAgICAgICAgICAgLy8gdGhpcyByZWxpZXMgb24gMidzIGNvbXBsZW1lbnQgcm9sbG92ZXIgdG8gZGV0ZWN0IGFuIGFuY2llbnQgc2VxdWVuY2UgbnVtYmVyCisgICAgICAgICAgICByZXR1cm4gbVNoYXJlZC0+bUFjayAtIHNlcXVlbmNlID49IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyByZXR1cm5zIHRoZSBsYXN0IHZhbHVlIHdyaXR0ZW4gKG9yIHRoZSBjb250ZW50cyBvZiB0aGUgc2hhcmVkIGJ1ZmZlciBhZnRlciBpbml0aWFsaXphdGlvbgorICAgICAgICAvLyBpZiBubyB2YWx1ZSB3YXMgd3JpdHRlbikuCisgICAgICAgIFQgbGFzdCgpIGNvbnN0CisgICAgICAgIHsgICAvLyBhc3N1bWUgbm8gc2VxdWVuY2UgY2hlY2sgcmVxdWlyZWQgLSB3ZSBhcmUgdGhlIHdyaXRlci4KKyAgICAgICAgICAgIHJldHVybiBtU2hhcmVkLT5tVmFsdWU7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGludDMyX3QgICAgIG1TZXF1ZW5jZTsKKyAgICAgICAgU2hhcmVkICogY29uc3QgbVNoYXJlZDsKKyAgICB9OworCisgICAgY2xhc3MgT2JzZXJ2ZXIgeworICAgIHB1YmxpYzoKKyAgICAgICAgT2JzZXJ2ZXIoU2hhcmVkICpzaGFyZWQpCisgICAgICAgICAgICA6IG1TZXF1ZW5jZSgwKSwgbVNlZWQoMSksIG1TaGFyZWQoc2hhcmVkKQorICAgICAgICB7CisgICAgICAgICAgICAvLyBleGFjdGx5IG9uZSBvZiBNdXRhdG9yIGFuZCBPYnNlcnZlciBtdXN0IGluaXRpYWxpemUsIGN1cnJlbnRseSBpdCBpcyBPYnNlcnZlcgorICAgICAgICAgICAgc2hhcmVkLT5pbml0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyByZXR1cm4gdHJ1ZSBpZiB2YWx1ZSBoYXMgY2hhbmdlZAorICAgICAgICBib29sIHBvbGwoVCYgdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIFNoYXJlZCAqc2hhcmVkID0gbVNoYXJlZDsKKyAgICAgICAgICAgIGludDMyX3QgYmVmb3JlID0gc2hhcmVkLT5tU2VxdWVuY2U7CisgICAgICAgICAgICBpZiAoYmVmb3JlID09IG1TZXF1ZW5jZSkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IHRyaWVzID0gMDsgOyApIHsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgTUFYX1RSSUVTID0gNTsKKyAgICAgICAgICAgICAgICBpZiAoYmVmb3JlICYgMSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoKyt0cmllcyA+PSBNQVhfVFJJRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBiZWZvcmUgPSBzaGFyZWQtPm1TZXF1ZW5jZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX21lbW9yeV9iYXJyaWVyKCk7CisgICAgICAgICAgICAgICAgICAgIFQgdGVtcCA9IHNoYXJlZC0+bVZhbHVlOworICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGFmdGVyID0gYW5kcm9pZF9hdG9taWNfcmVsZWFzZV9sb2FkKCZzaGFyZWQtPm1TZXF1ZW5jZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhZnRlciA9PSBiZWZvcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdGVtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJlZC0+bUFjayA9IGJlZm9yZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TZXF1ZW5jZSA9IGJlZm9yZTsgLy8gbVNlcXVlbmNlIGlzIGV2ZW4gYWZ0ZXIgcG9sbCBzdWNjZXNzCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKyt0cmllcyA+PSBNQVhfVFJJRVMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBiZWZvcmUgPSBhZnRlcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyAob3B0aW9uYWwpIHVzZWQgdG8gaW5kaWNhdGUgdG8gdGhlIE11dGF0b3IgdGhhdCB0aGUgc3RhdGUgdGhhdCBoYXMgYmVlbiBwb2xsZWQKKyAgICAgICAgLy8gaGFzIGFsc28gYmVlbiBhY3RlZCB1cG9uLgorICAgICAgICB2b2lkIGRvbmUoKQorICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IGFjayA9IG1TaGFyZWQtPm1BY2sgKyAxOworICAgICAgICAgICAgLy8gZW5zdXJlIGFsbCBwcmV2aW91cyB3cml0ZXMgaGF2ZSBiZWVuIHBlcmZvcm1lZC4KKyAgICAgICAgICAgIGFuZHJvaWRfYXRvbWljX3JlbGVhc2Vfc3RvcmUoYWNrLCAmbVNoYXJlZC0+bUFjayk7IC8vIG1TZXF1ZW5jZSBpcyBvZGQgYWZ0ZXIgImRvbmUiCisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGludDMyX3QgICAgIG1TZXF1ZW5jZTsKKyAgICAgICAgaW50ICAgICAgICAgbVNlZWQ7ICAvLyBmb3IgUFJORworICAgICAgICBTaGFyZWQgKiBjb25zdCBtU2hhcmVkOworICAgIH07CisKKyNpZiAwCisgICAgU2luZ2xlU3RhdGVRdWV1ZSh2b2lkIC8qU2hhcmVkKi8gKnNoYXJlZCk7CisgICAgLyp2aXJ0dWFsKi8gflNpbmdsZVN0YXRlUXVldWUoKSB7IH0KKworICAgIHN0YXRpYyBzaXplX3Qgc2l6ZSgpIHsgcmV0dXJuIHNpemVvZihTaGFyZWQpOyB9CisjZW5kaWYKKworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gU0lOR0xFX1NUQVRFX1FVRVVFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJuYmxvZy9BbmRyb2lkLmJwCmluZGV4IDc0YWFmNzcuLjExODgzMjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlibmJsb2cvQW5kcm9pZC5icApAQCAtMyw5ICszLDEzIEBACiAgICAgbmFtZTogImxpYm5ibG9nIiwKIAogICAgIHNyY3M6IFsKLSAgICAgICAgIk5CTG9nLmNwcCIsCisgICAgICAgICJFbnRyeS5jcHAiLAorICAgICAgICAiTWVyZ2VyLmNwcCIsCiAgICAgICAgICJQZXJmb3JtYW5jZUFuYWx5c2lzLmNwcCIsCisgICAgICAgICJSZWFkZXIuY3BwIiwKICAgICAgICAgIlJlcG9ydFBlcmZvcm1hbmNlLmNwcCIsCisgICAgICAgICJUaW1lbGluZS5jcHAiLAorICAgICAgICAiV3JpdGVyLmNwcCIsCiAgICAgXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCkBAIC0xMyw5ICsxNywxNCBAQAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLAogCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmpzb25jcHAiLAorICAgIF0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvRW50cnkuY3BwIGIvbWVkaWEvbGlibmJsb2cvRW50cnkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NzU2MzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9FbnRyeS5jcHAKQEAgLTAsMCArMSwyNjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk5CTG9nIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmby5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0VudHJ5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBOQkxvZyB7CisKK2ludCBFbnRyeTo6Y29weUVudHJ5RGF0YUF0KHNpemVfdCBvZmZzZXQpIGNvbnN0Cit7CisgICAgLy8gRklYTUUgVGhpcyBpcyB0b28gc2xvdworICAgIGlmIChvZmZzZXQgPT0gMCkgeworICAgICAgICByZXR1cm4gbUV2ZW50OworICAgIH0gZWxzZSBpZiAob2Zmc2V0ID09IDEpIHsKKyAgICAgICAgcmV0dXJuIG1MZW5ndGg7CisgICAgfSBlbHNlIGlmIChvZmZzZXQgPCAoc2l6ZV90KSAobUxlbmd0aCArIDIpKSB7CisgICAgICAgIHJldHVybiAoaW50KSAoKGNoYXIgKikgbURhdGEpW29mZnNldCAtIDJdOworICAgIH0gZWxzZSBpZiAob2Zmc2V0ID09IChzaXplX3QpIChtTGVuZ3RoICsgMikpIHsKKyAgICAgICAgcmV0dXJuIG1MZW5ndGg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIDA7ICAgLy8gRklYTUUgaXMgdGhpcyBhbiBlcnJvcj8KKyAgICB9Cit9CisKK0VudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoKSAgIC8vIER1bW15IGluaXRpYWxpemF0aW9uLgorICAgIDogbVB0cihudWxscHRyKQoreworfQorCitFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKGNvbnN0IHVpbnQ4X3QgKmVudHJ5KQorICAgIDogbVB0cihlbnRyeSkKK3sKK30KKworRW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcihjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcikKKyAgICA6IG1QdHIob3RoZXIubVB0cikKK3sKK30KKworY29uc3QgZW50cnkmIEVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0Cit7CisgICAgcmV0dXJuICooZW50cnkqKSBtUHRyOworfQorCitjb25zdCBlbnRyeSogRW50cnlJdGVyYXRvcjo6b3BlcmF0b3ItPigpIGNvbnN0Cit7CisgICAgcmV0dXJuIChlbnRyeSopIG1QdHI7Cit9CisKK0VudHJ5SXRlcmF0b3ImIEVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yKysoKQoreworICAgIG1QdHIgKz0gbVB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKyBFbnRyeTo6a092ZXJoZWFkOworICAgIHJldHVybiAqdGhpczsKK30KKworRW50cnlJdGVyYXRvciYgRW50cnlJdGVyYXRvcjo6b3BlcmF0b3ItLSgpCit7CisgICAgbVB0ciAtPSBtUHRyW0VudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdICsgRW50cnk6OmtPdmVyaGVhZDsKKyAgICByZXR1cm4gKnRoaXM7Cit9CisKK0VudHJ5SXRlcmF0b3IgRW50cnlJdGVyYXRvcjo6bmV4dCgpIGNvbnN0Cit7CisgICAgRW50cnlJdGVyYXRvciBhdXgoKnRoaXMpOworICAgIHJldHVybiArK2F1eDsKK30KKworRW50cnlJdGVyYXRvciBFbnRyeUl0ZXJhdG9yOjpwcmV2KCkgY29uc3QKK3sKKyAgICBFbnRyeUl0ZXJhdG9yIGF1eCgqdGhpcyk7CisgICAgcmV0dXJuIC0tYXV4OworfQorCitib29sIEVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yIT0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1QdHIgIT0gb3RoZXIubVB0cjsKK30KKworaW50IEVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLShjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcikgY29uc3QKK3sKKyAgICByZXR1cm4gbVB0ciAtIG90aGVyLm1QdHI7Cit9CisKK2Jvb2wgRW50cnlJdGVyYXRvcjo6aGFzQ29uc2lzdGVudExlbmd0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1QdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldID09IG1QdHJbbVB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKworICAgICAgICBFbnRyeTo6a092ZXJoZWFkICsgRW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF07Cit9CisKK3ZvaWQgRW50cnlJdGVyYXRvcjo6Y29weVRvKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCkgY29uc3QKK3sKKyAgICBzaXplX3QgbGVuZ3RoID0gbVB0cltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKyBFbnRyeTo6a092ZXJoZWFkOworICAgIGRzdC0+d3JpdGUobVB0ciwgbGVuZ3RoKTsKK30KKwordm9pZCBFbnRyeUl0ZXJhdG9yOjpjb3B5RGF0YSh1aW50OF90ICpkc3QpIGNvbnN0Cit7CisgICAgbWVtY3B5KCh2b2lkKikgZHN0LCBtUHRyICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpLCBtUHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGQ6OnVuaXF1ZV9wdHI8QWJzdHJhY3RFbnRyeT4gQWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpCit7CisgICAgaWYgKHB0ciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjb25zdCB1aW50OF90IHR5cGUgPSBFbnRyeUl0ZXJhdG9yKHB0ciktPnR5cGU7CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBFVkVOVF9GTVRfU1RBUlQ6CisgICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEZvcm1hdEVudHJ5PihGb3JtYXRFbnRyeShwdHIpKTsKKyAgICBjYXNlIEVWRU5UX0FVRElPX1NUQVRFOgorICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTOgorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3VuaXF1ZTxIaXN0b2dyYW1FbnRyeT4oSGlzdG9ncmFtRW50cnkocHRyKSk7CisgICAgZGVmYXVsdDoKKyAgICAgICAgQUxPR1coIlRyaWVkIHRvIGNyZWF0ZSBBYnN0cmFjdEVudHJ5IG9mIHR5cGUgJWQiLCB0eXBlKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorfQorCitFbnRyeUl0ZXJhdG9yIEZvcm1hdEVudHJ5OjpiZWdpbigpIGNvbnN0Cit7CisgICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KTsKK30KKworY29uc3QgY2hhciAqRm9ybWF0RW50cnk6OmZvcm1hdFN0cmluZygpIGNvbnN0Cit7CisgICAgcmV0dXJuIChjb25zdCBjaGFyKikgbUVudHJ5ICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpOworfQorCitzaXplX3QgRm9ybWF0RW50cnk6OmZvcm1hdFN0cmluZ0xlbmd0aCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1FbnRyeVtvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV07Cit9CisKK0VudHJ5SXRlcmF0b3IgRm9ybWF0RW50cnk6OmFyZ3MoKSBjb25zdAoreworICAgIGF1dG8gaXQgPSBiZWdpbigpOworICAgICsraXQ7IC8vIHNraXAgc3RhcnQgZm10CisgICAgKytpdDsgLy8gc2tpcCB0aW1lc3RhbXAKKyAgICArK2l0OyAvLyBza2lwIGhhc2gKKyAgICAvLyBTa2lwIGF1dGhvciBpZiBwcmVzZW50CisgICAgaWYgKGl0LT50eXBlID09IEVWRU5UX0ZNVF9BVVRIT1IpIHsKKyAgICAgICAgKytpdDsKKyAgICB9CisgICAgcmV0dXJuIGl0OworfQorCitpbnQ2NF90IEZvcm1hdEVudHJ5Ojp0aW1lc3RhbXAoKSBjb25zdAoreworICAgIGF1dG8gaXQgPSBiZWdpbigpOworICAgICsraXQ7IC8vIHNraXAgc3RhcnQgZm10CisgICAgcmV0dXJuIGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKK30KKworbG9nX2hhc2hfdCBGb3JtYXRFbnRyeTo6aGFzaCgpIGNvbnN0Cit7CisgICAgYXV0byBpdCA9IGJlZ2luKCk7CisgICAgKytpdDsgLy8gc2tpcCBzdGFydCBmbXQKKyAgICArK2l0OyAvLyBza2lwIHRpbWVzdGFtcAorICAgIC8vIHVuYWxpZ25lZCA2NC1iaXQgcmVhZCBub3Qgc3VwcG9ydGVkCisgICAgbG9nX2hhc2hfdCBoYXNoOworICAgIG1lbWNweSgmaGFzaCwgaXQtPmRhdGEsIHNpemVvZihoYXNoKSk7CisgICAgcmV0dXJuIGhhc2g7Cit9CisKK2ludCBGb3JtYXRFbnRyeTo6YXV0aG9yKCkgY29uc3QKK3sKKyAgICBhdXRvIGl0ID0gYmVnaW4oKTsKKyAgICArK2l0OyAvLyBza2lwIHN0YXJ0IGZtdAorICAgICsraXQ7IC8vIHNraXAgdGltZXN0YW1wCisgICAgKytpdDsgLy8gc2tpcCBoYXNoCisgICAgLy8gaWYgdGhlcmUgaXMgYW4gYXV0aG9yIGVudHJ5LCByZXR1cm4gaXQsIHJldHVybiAtMSBvdGhlcndpc2UKKyAgICByZXR1cm4gaXQtPnR5cGUgPT0gRVZFTlRfRk1UX0FVVEhPUiA/IGl0LnBheWxvYWQ8aW50PigpIDogLTE7Cit9CisKK0VudHJ5SXRlcmF0b3IgRm9ybWF0RW50cnk6OmNvcHlXaXRoQXV0aG9yKAorICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsIGludCBhdXRob3IpIGNvbnN0Cit7CisgICAgYXV0byBpdCA9IGJlZ2luKCk7CisgICAgaXQuY29weVRvKGRzdCk7ICAgICAvLyBjb3B5IGZtdCBzdGFydCBlbnRyeQorICAgICgrK2l0KS5jb3B5VG8oZHN0KTsgLy8gY29weSB0aW1lc3RhbXAKKyAgICAoKytpdCkuY29weVRvKGRzdCk7IC8vIGNvcHkgaGFzaAorICAgIC8vIGluc2VydCBhdXRob3IgZW50cnkKKyAgICBzaXplX3QgYXV0aG9yRW50cnlTaXplID0gRW50cnk6OmtPdmVyaGVhZCArIHNpemVvZihhdXRob3IpOworICAgIHVpbnQ4X3QgYXV0aG9yRW50cnlbYXV0aG9yRW50cnlTaXplXTsKKyAgICBhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgdHlwZSldID0gRVZFTlRfRk1UX0FVVEhPUjsKKyAgICBhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gPQorICAgICAgICBhdXRob3JFbnRyeVthdXRob3JFbnRyeVNpemUgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSA9CisgICAgICAgIHNpemVvZihhdXRob3IpOworICAgICooaW50KikgKCZhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgZGF0YSldKSA9IGF1dGhvcjsKKyAgICBkc3QtPndyaXRlKGF1dGhvckVudHJ5LCBhdXRob3JFbnRyeVNpemUpOworICAgIC8vIGNvcHkgcmVzdCBvZiBlbnRyaWVzCisgICAgd2hpbGUgKCgrK2l0KS0+dHlwZSAhPSBFVkVOVF9GTVRfRU5EKSB7CisgICAgICAgIGl0LmNvcHlUbyhkc3QpOworICAgIH0KKyAgICBpdC5jb3B5VG8oZHN0KTsKKyAgICArK2l0OworICAgIHJldHVybiBpdDsKK30KKworaW50NjRfdCBIaXN0b2dyYW1FbnRyeTo6dGltZXN0YW1wKCkgY29uc3QKK3sKKyAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLnBheWxvYWQ8SGlzdFRzRW50cnk+KCkudHM7Cit9CisKK2xvZ19oYXNoX3QgSGlzdG9ncmFtRW50cnk6Omhhc2goKSBjb25zdAoreworICAgIHJldHVybiBFbnRyeUl0ZXJhdG9yKG1FbnRyeSkucGF5bG9hZDxIaXN0VHNFbnRyeT4oKS5oYXNoOworfQorCitpbnQgSGlzdG9ncmFtRW50cnk6OmF1dGhvcigpIGNvbnN0Cit7CisgICAgRW50cnlJdGVyYXRvciBpdChtRW50cnkpOworICAgIHJldHVybiBpdC0+bGVuZ3RoID09IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpCisgICAgICAgICAgICA/IGl0LnBheWxvYWQ8SGlzdFRzRW50cnlXaXRoQXV0aG9yPigpLmF1dGhvciA6IC0xOworfQorCitFbnRyeUl0ZXJhdG9yIEhpc3RvZ3JhbUVudHJ5Ojpjb3B5V2l0aEF1dGhvcigKKyAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LCBpbnQgYXV0aG9yKSBjb25zdAoreworICAgIC8vIEN1cnJlbnQgaGlzdG9ncmFtIGVudHJ5IGhhcyB7dHlwZSwgbGVuZ3RoLCBzdHJ1Y3QgSGlzdFRzRW50cnksIGxlbmd0aH0uCisgICAgLy8gV2Ugbm93IHdhbnQge3R5cGUsIGxlbmd0aCwgc3RydWN0IEhpc3RUc0VudHJ5V2l0aEF1dGhvciwgbGVuZ3RofQorICAgIHVpbnQ4X3QgYnVmZmVyW0VudHJ5OjprT3ZlcmhlYWQgKyBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKV07CisgICAgLy8gQ29weSBjb250ZW50IHVudGlsIHRoZSBwb2ludCB3ZSB3YW50IHRvIGFkZCB0aGUgYXV0aG9yCisgICAgbWVtY3B5KGJ1ZmZlciwgbUVudHJ5LCBzaXplb2YoZW50cnkpICsgc2l6ZW9mKEhpc3RUc0VudHJ5KSk7CisgICAgLy8gQ29weSB0aGUgYXV0aG9yCisgICAgKihpbnQqKSAoYnVmZmVyICsgc2l6ZW9mKGVudHJ5KSArIHNpemVvZihIaXN0VHNFbnRyeSkpID0gYXV0aG9yOworICAgIC8vIFVwZGF0ZSBsZW5ndGhzCisgICAgYnVmZmVyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSA9IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpOworICAgIGJ1ZmZlcltvZmZzZXRvZihlbnRyeSwgZGF0YSkgKyBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKSArIG9mZnNldG9mKGVuZGluZywgbGVuZ3RoKV0KKyAgICAgICAgPSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKTsKKyAgICAvLyBXcml0ZSBuZXcgYnVmZmVyIGludG8gRklGTworICAgIGRzdC0+d3JpdGUoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5uZXh0KCk7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvTWVyZ2VyLmNwcCBiL21lZGlhL2xpYm5ibG9nL01lcmdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FkNmQ2YgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL01lcmdlci5jcHAKQEAgLTAsMCArMSwzMjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk5CTG9nIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2ZpZm8uaD4KKyNpbmNsdWRlIDxqc29uL2pzb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9NZXJnZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZWFkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9UaW1lbGluZS5oPgorI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCitNZXJnZXI6Ok1lcmdlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKToKKyAgICAgIG1TaGFyZWQoKFNoYXJlZCAqKSBzaGFyZWQpLAorICAgICAgbUZpZm8obVNoYXJlZCAhPSBOVUxMID8KKyAgICAgICAgbmV3IGF1ZGlvX3V0aWxzX2ZpZm8oc2l6ZSwgc2l6ZW9mKHVpbnQ4X3QpLAorICAgICAgICAgICAgbVNoYXJlZC0+bUJ1ZmZlciwgbVNoYXJlZC0+bVJlYXIsIE5VTEwgLyp0aHJvdHRsZXNGcm9udCovKSA6IE5VTEwpLAorICAgICAgbUZpZm9Xcml0ZXIobUZpZm8gIT0gTlVMTCA/IG5ldyBhdWRpb191dGlsc19maWZvX3dyaXRlcigqbUZpZm8pIDogTlVMTCkKK3sKK30KKwordm9pZCBNZXJnZXI6OmFkZFJlYWRlcihjb25zdCBzcDxSZWFkZXI+ICZyZWFkZXIpCit7CisgICAgLy8gRklYTUUgVGhpcyBpcyBjYWxsZWQgYnkgYmluZGVyIHRocmVhZCBpbiBNZWRpYUxvZ1NlcnZpY2U6OnJlZ2lzdGVyV3JpdGVyCisgICAgLy8gICAgICAgYnV0IHRoZSBhY2Nlc3MgdG8gc2hhcmVkIHZhcmlhYmxlIG1SZWFkZXJzIGlzIG5vdCB5ZXQgcHJvdGVjdGVkIGJ5IGEgbG9jay4KKyAgICBtUmVhZGVycy5wdXNoX2JhY2socmVhZGVyKTsKK30KKworLy8gaXRlbXMgcGxhY2VkIGluIHByaW9yaXR5IHF1ZXVlIGR1cmluZyBtZXJnZQorLy8gY29tcG9zZWQgYnkgYSB0aW1lc3RhbXAgYW5kIHRoZSBpbmRleCBvZiB0aGUgc25hcHNob3Qgd2hlcmUgdGhlIHRpbWVzdGFtcCBjYW1lIGZyb20KK3N0cnVjdCBNZXJnZUl0ZW0KK3sKKyAgICBpbnQ2NF90IHRzOworICAgIGludCBpbmRleDsKKyAgICBNZXJnZUl0ZW0oaW50NjRfdCB0cywgaW50IGluZGV4KTogdHModHMpLCBpbmRleChpbmRleCkge30KK307CisKK2Jvb2wgb3BlcmF0b3I+KGNvbnN0IHN0cnVjdCBNZXJnZUl0ZW0gJmkxLCBjb25zdCBzdHJ1Y3QgTWVyZ2VJdGVtICZpMikKK3sKKyAgICByZXR1cm4gaTEudHMgPiBpMi50cyB8fCAoaTEudHMgPT0gaTIudHMgJiYgaTEuaW5kZXggPiBpMi5pbmRleCk7Cit9CisKKy8vIE1lcmdlIHJlZ2lzdGVyZWQgcmVhZGVycywgc29ydGVkIGJ5IHRpbWVzdGFtcCwgYW5kIHdyaXRlIGRhdGEgdG8gYSBzaW5nbGUgRklGTyBpbiBsb2NhbCBtZW1vcnkKK3ZvaWQgTWVyZ2VyOjptZXJnZSgpCit7CisgICAgaWYgKHRydWUpIHJldHVybjsgLy8gTWVyZ2luZyBpcyBub3QgbmVjZXNzYXJ5IGF0IHRoZSBtb21lbnQsIHNvIHRoaXMgaXMgdG8gZGlzYWJsZSBpdAorICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBieXBhc3MgY29tcGlsZXIgd2FybmluZ3MgYWJvdXQgbWVtYmVyIHZhcmlhYmxlcyBub3QgYmVpbmcgdXNlZC4KKyAgICBjb25zdCBpbnQgbkxvZ3MgPSBtUmVhZGVycy5zaXplKCk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90Pj4gc25hcHNob3RzKG5Mb2dzKTsKKyAgICBzdGQ6OnZlY3RvcjxFbnRyeUl0ZXJhdG9yPiBvZmZzZXRzOworICAgIG9mZnNldHMucmVzZXJ2ZShuTG9ncyk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTG9nczsgKytpKSB7CisgICAgICAgIHNuYXBzaG90c1tpXSA9IG1SZWFkZXJzW2ldLT5nZXRTbmFwc2hvdCgpOworICAgICAgICBvZmZzZXRzLnB1c2hfYmFjayhzbmFwc2hvdHNbaV0tPmJlZ2luKCkpOworICAgIH0KKyAgICAvLyBpbml0aWFsaXplIG9mZnNldHMKKyAgICAvLyBUT0RPIGN1c3RvbSBoZWFwIGltcGxlbWVudGF0aW9uIGNvdWxkIGFsbG93IHRvIHVwZGF0ZSB0b3AsIGltcHJvdmluZyBwZXJmb3JtYW5jZQorICAgIC8vIGZvciBidXJzdHkgYnVmZmVycworICAgIHN0ZDo6cHJpb3JpdHlfcXVldWU8TWVyZ2VJdGVtLCBzdGQ6OnZlY3RvcjxNZXJnZUl0ZW0+LCBzdGQ6OmdyZWF0ZXI8TWVyZ2VJdGVtPj4gdGltZXN0YW1wczsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Mb2dzOyArK2kpCisgICAgeworICAgICAgICBpZiAob2Zmc2V0c1tpXSAhPSBzbmFwc2hvdHNbaV0tPmVuZCgpKSB7CisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QWJzdHJhY3RFbnRyeT4gYWJzdHJhY3RFbnRyeSA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpXSk7CisgICAgICAgICAgICBpZiAoYWJzdHJhY3RFbnRyeSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aW1lc3RhbXBzLmVtcGxhY2UoYWJzdHJhY3RFbnRyeS0+dGltZXN0YW1wKCksIGkpOworICAgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKCF0aW1lc3RhbXBzLmVtcHR5KCkpIHsKKyAgICAgICAgaW50IGluZGV4ID0gdGltZXN0YW1wcy50b3AoKS5pbmRleDsgICAgIC8vIGZpbmQgbWluaW11bSB0aW1lc3RhbXAKKyAgICAgICAgLy8gY29weSBpdCB0byB0aGUgbG9nLCBpbmNyZWFzaW5nIG9mZnNldAorICAgICAgICBvZmZzZXRzW2luZGV4XSA9IEFic3RyYWN0RW50cnk6OmJ1aWxkRW50cnkob2Zmc2V0c1tpbmRleF0pLT4KKyAgICAgICAgICAgIGNvcHlXaXRoQXV0aG9yKG1GaWZvV3JpdGVyLCBpbmRleCk7CisgICAgICAgIC8vIHVwZGF0ZSBkYXRhIHN0cnVjdHVyZXMKKyAgICAgICAgdGltZXN0YW1wcy5wb3AoKTsKKyAgICAgICAgaWYgKG9mZnNldHNbaW5kZXhdICE9IHNuYXBzaG90c1tpbmRleF0tPmVuZCgpKSB7CisgICAgICAgICAgICBpbnQ2NF90IHRzID0gQWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShvZmZzZXRzW2luZGV4XSktPnRpbWVzdGFtcCgpOworICAgICAgICAgICAgdGltZXN0YW1wcy5lbXBsYWNlKHRzLCBpbmRleCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPHNwPFJlYWRlcj4+JiBNZXJnZXI6OmdldFJlYWRlcnMoKSBjb25zdAoreworICAgIC8vQXV0b011dGV4IF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbVJlYWRlcnM7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNZXJnZVJlYWRlcjo6TWVyZ2VSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgTWVyZ2VyICZtZXJnZXIpCisgICAgOiBSZWFkZXIoc2hhcmVkLCBzaXplLCAiTWVyZ2VSZWFkZXIiKSwgbVJlYWRlcnMobWVyZ2VyLmdldFJlYWRlcnMoKSkKK3sKK30KKworLy8gVGFrZXMgcmF3IGNvbnRlbnQgb2YgdGhlIGxvY2FsIG1lcmdlciBGSUZPLCBwcm9jZXNzZXMgbG9nIGVudHJpZXMsIGFuZAorLy8gd3JpdGVzIHRoZSBkYXRhIHRvIGEgbWFwIG9mIGNsYXNzIFBlcmZvcm1hbmNlQW5hbHlzaXMsIGJhc2VkIG9uIHRoZWlyIHRocmVhZCBJRC4KK3ZvaWQgTWVyZ2VSZWFkZXI6OnByb2Nlc3NTbmFwc2hvdChTbmFwc2hvdCAmc25hcHNob3QsIGludCBhdXRob3IpCit7CisgICAgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YSYgZGF0YSA9IG1UaHJlYWRQZXJmb3JtYW5jZURhdGFbYXV0aG9yXTsKKyAgICAvLyBXZSBkb24ndCBkbyAiYXV0byBpdCIgYmVjYXVzZSBpdCByZWR1Y2VzIHJlYWRhYmlsaXR5IGluIHRoaXMgY2FzZS4KKyAgICBmb3IgKEVudHJ5SXRlcmF0b3IgaXQgPSBzbmFwc2hvdC5iZWdpbigpOyBpdCAhPSBzbmFwc2hvdC5lbmQoKTsgKytpdCkgeworICAgICAgICBzd2l0Y2ggKGl0LT50eXBlKSB7CisgICAgICAgIGNhc2UgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTOiB7CisgICAgICAgICAgICBjb25zdCBIaXN0VHNFbnRyeSBwYXlsb2FkID0gaXQucGF5bG9hZDxIaXN0VHNFbnRyeT4oKTsKKyAgICAgICAgICAgIC8vIFRPRE86IGhhc2ggZm9yIGhpc3RvZ3JhbSB0cyBhbmQgYXVkaW8gc3RhdGUgbmVlZCB0byBtYXRjaAorICAgICAgICAgICAgLy8gYW5kIGNvcnJlc3BvbmQgdG8gYXVkaW8gcHJvZHVjdGlvbiBzb3VyY2UgZmlsZSBsb2NhdGlvbgorICAgICAgICAgICAgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXNbYXV0aG9yXVswIC8qaGFzaCovXS5sb2dUc0VudHJ5KHBheWxvYWQudHMpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX0FVRElPX1NUQVRFOiB7CisgICAgICAgICAgICBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpc1thdXRob3JdWzAgLypoYXNoKi9dLmhhbmRsZVN0YXRlQ2hhbmdlKCk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfVEhSRUFEX0lORk86IHsKKyAgICAgICAgICAgIGNvbnN0IHRocmVhZF9pbmZvX3QgaW5mbyA9IGl0LnBheWxvYWQ8dGhyZWFkX2luZm9fdD4oKTsKKyAgICAgICAgICAgIGRhdGEudGhyZWFkSW5mbyA9IGluZm87CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfVEhSRUFEX1BBUkFNUzogeworICAgICAgICAgICAgY29uc3QgdGhyZWFkX3BhcmFtc190IHBhcmFtcyA9IGl0LnBheWxvYWQ8dGhyZWFkX3BhcmFtc190PigpOworICAgICAgICAgICAgZGF0YS50aHJlYWRQYXJhbXMgPSBwYXJhbXM7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfTEFURU5DWTogeworICAgICAgICAgICAgY29uc3QgZG91YmxlIGxhdGVuY3lNcyA9IGl0LnBheWxvYWQ8ZG91YmxlPigpOworICAgICAgICAgICAgZGF0YS5sYXRlbmN5SGlzdC5hZGQobGF0ZW5jeU1zKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9XT1JLX1RJTUU6IHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgbW9ub3RvbmljTnMgPSBpdC5wYXlsb2FkPGludDY0X3Q+KCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbW9ub3RvbmljTXMgPSBtb25vdG9uaWNOcyAqIDFlLTY7CisgICAgICAgICAgICBkYXRhLndvcmtIaXN0LmFkZChtb25vdG9uaWNNcyk7CisgICAgICAgICAgICBkYXRhLmFjdGl2ZSArPSBtb25vdG9uaWNOczsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9XQVJNVVBfVElNRTogeworICAgICAgICAgICAgY29uc3QgZG91YmxlIHRpbWVNcyA9IGl0LnBheWxvYWQ8ZG91YmxlPigpOworICAgICAgICAgICAgZGF0YS53YXJtdXBIaXN0LmFkZCh0aW1lTXMpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1VOREVSUlVOOiB7CisgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRzID0gaXQucGF5bG9hZDxpbnQ2NF90PigpOworICAgICAgICAgICAgZGF0YS51bmRlcnJ1bnMrKzsKKyAgICAgICAgICAgIGRhdGEuc25hcHNob3RzLmVtcGxhY2VfZnJvbnQoRVZFTlRfVU5ERVJSVU4sIHRzKTsKKyAgICAgICAgICAgIC8vIFRPRE8gaGF2ZSBhIGRhdGEgc3RydWN0dXJlIHRvIGF1dG9tYXRpY2FsbHkgaGFuZGxlIHJlc2l6aW5nCisgICAgICAgICAgICBpZiAoZGF0YS5zbmFwc2hvdHMuc2l6ZSgpID4gUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YTo6a01heFNuYXBzaG90c1RvU3RvcmUpIHsKKyAgICAgICAgICAgICAgICBkYXRhLnNuYXBzaG90cy5wb3BfYmFjaygpOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX09WRVJSVU46IHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdHMgPSBpdC5wYXlsb2FkPGludDY0X3Q+KCk7CisgICAgICAgICAgICBkYXRhLm92ZXJydW5zKys7CisgICAgICAgICAgICBkYXRhLnNuYXBzaG90cy5lbXBsYWNlX2Zyb250KEVWRU5UX1VOREVSUlVOLCB0cyk7CisgICAgICAgICAgICAvLyBUT0RPIGhhdmUgYSBkYXRhIHN0cnVjdHVyZSB0byBhdXRvbWF0aWNhbGx5IGhhbmRsZSByZXNpemluZworICAgICAgICAgICAgaWYgKGRhdGEuc25hcHNob3RzLnNpemUoKSA+IFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGE6OmtNYXhTbmFwc2hvdHNUb1N0b3JlKSB7CisgICAgICAgICAgICAgICAgZGF0YS5zbmFwc2hvdHMucG9wX2JhY2soKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9SRVNFUlZFRDoKKyAgICAgICAgY2FzZSBFVkVOVF9VUFBFUl9CT1VORDoKKyAgICAgICAgICAgIEFMT0dXKCJ3YXJuaW5nOiB1bmV4cGVjdGVkIGV2ZW50ICVkIiwgaXQtPnR5cGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNZXJnZVJlYWRlcjo6Z2V0QW5kUHJvY2Vzc1NuYXBzaG90KCkKK3sKKyAgICAvLyBnZXQgYSBzbmFwc2hvdCBvZiBlYWNoIHJlYWRlciBhbmQgcHJvY2VzcyB0aGVtCisgICAgLy8gVE9ETyBpbnNlcnQgbG9jayBoZXJlCisgICAgY29uc3Qgc2l6ZV90IG5Mb2dzID0gbVJlYWRlcnMuc2l6ZSgpOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4+IHNuYXBzaG90cyhuTG9ncyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuTG9nczsgaSsrKSB7CisgICAgICAgIHNuYXBzaG90c1tpXSA9IG1SZWFkZXJzW2ldLT5nZXRTbmFwc2hvdCgpOworICAgIH0KKyAgICAvLyBUT0RPIHVubG9jayBsb2NrIGhlcmUKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5Mb2dzOyBpKyspIHsKKyAgICAgICAgaWYgKHNuYXBzaG90c1tpXSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBwcm9jZXNzU25hcHNob3QoKihzbmFwc2hvdHNbaV0pLCBpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBjaGVja1B1c2hUb01lZGlhTWV0cmljcygpOworfQorCit2b2lkIE1lcmdlUmVhZGVyOjpjaGVja1B1c2hUb01lZGlhTWV0cmljcygpCit7CisgICAgY29uc3QgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKCk7CisgICAgZm9yIChhdXRvJiBpdGVtIDogbVRocmVhZFBlcmZvcm1hbmNlRGF0YSkgeworICAgICAgICBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VEYXRhJiBkYXRhID0gaXRlbS5zZWNvbmQ7CisgICAgICAgIGlmIChub3cgLSBkYXRhLnN0YXJ0ID49IGtQZXJpb2RpY01lZGlhTWV0cmljc1B1c2gpIHsKKyAgICAgICAgICAgICh2b2lkKVJlcG9ydFBlcmZvcm1hbmNlOjpzZW5kVG9NZWRpYU1ldHJpY3MoZGF0YSk7CisgICAgICAgICAgICBkYXRhLnJlc2V0KCk7ICAgLy8gZGF0YSBpcyBwZXJzaXN0ZW50IHBlciB0aHJlYWQKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBNZXJnZVJlYWRlcjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit7CisgICAgLy8gVE9ETzogYWRkIGEgbXV0ZXggYXJvdW5kIG1lZGlhLmxvZyBkdW1wCisgICAgLy8gT3B0aW9ucyBmb3IgZHVtcHN5cworICAgIGJvb2wgcGEgPSBmYWxzZSwganNvbiA9IGZhbHNlLCBwbG90cyA9IGZhbHNlLCByZXRybyA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byAmYXJnIDogYXJncykgeworICAgICAgICBpZiAoYXJnID09IFN0cmluZzE2KCItLXBhIikpIHsKKyAgICAgICAgICAgIHBhID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmcgPT0gU3RyaW5nMTYoIi0tanNvbiIpKSB7CisgICAgICAgICAgICBqc29uID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChhcmcgPT0gU3RyaW5nMTYoIi0tcGxvdHMiKSkgeworICAgICAgICAgICAgcGxvdHMgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGFyZyA9PSBTdHJpbmcxNigiLS1yZXRybyIpKSB7CisgICAgICAgICAgICByZXRybyA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKHBhKSB7CisgICAgICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wKGZkLCAwIC8qaW5kZW50Ki8sIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzKTsKKyAgICB9CisgICAgaWYgKGpzb24pIHsKKyAgICAgICAgUmVwb3J0UGVyZm9ybWFuY2U6OmR1bXBKc29uKGZkLCBtVGhyZWFkUGVyZm9ybWFuY2VEYXRhKTsKKyAgICB9CisgICAgaWYgKHBsb3RzKSB7CisgICAgICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wUGxvdHMoZmQsIG1UaHJlYWRQZXJmb3JtYW5jZURhdGEpOworICAgIH0KKyAgICBpZiAocmV0cm8pIHsKKyAgICAgICAgUmVwb3J0UGVyZm9ybWFuY2U6OmR1bXBSZXRybyhmZCwgbVRocmVhZFBlcmZvcm1hbmNlRGF0YSk7CisgICAgfQorfQorCit2b2lkIE1lcmdlUmVhZGVyOjpoYW5kbGVBdXRob3IoY29uc3QgQWJzdHJhY3RFbnRyeSAmZW50cnksIFN0cmluZzggKmJvZHkpCit7CisgICAgaW50IGF1dGhvciA9IGVudHJ5LmF1dGhvcigpOworICAgIGlmIChhdXRob3IgPT0gLTEpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBGSVhNRSBOZWVkcyBhIGxvY2sKKyAgICBjb25zdCBjaGFyKiBuYW1lID0gbVJlYWRlcnNbYXV0aG9yXS0+bmFtZSgpLmNfc3RyKCk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlczogIiwgbmFtZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitNZXJnZVRocmVhZDo6TWVyZ2VUaHJlYWQoTWVyZ2VyICZtZXJnZXIsIE1lcmdlUmVhZGVyICZtZXJnZVJlYWRlcikKKyAgICA6IG1NZXJnZXIobWVyZ2VyKSwKKyAgICAgIG1NZXJnZVJlYWRlcihtZXJnZVJlYWRlciksCisgICAgICBtVGltZW91dFVzKDApCit7Cit9CisKK01lcmdlVGhyZWFkOjp+TWVyZ2VUaHJlYWQoKQoreworICAgIC8vIHNldCBleGl0IGZsYWcsIHNldCB0aW1lb3V0IHRvIDAgdG8gZm9yY2UgdGhyZWFkTG9vcCB0byBleGl0IGFuZCB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIGpvaW4KKyAgICByZXF1ZXN0RXhpdCgpOworICAgIHNldFRpbWVvdXRVcygwKTsKKyAgICBqb2luKCk7Cit9CisKK2Jvb2wgTWVyZ2VUaHJlYWQ6OnRocmVhZExvb3AoKQoreworICAgIGJvb2wgZG9NZXJnZTsKKyAgICB7CisgICAgICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOworICAgICAgICAvLyBJZiBtVGltZW91dFVzIGlzIG5lZ2F0aXZlLCB3YWl0IG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgdW50aWwgaXQncyBwb3NpdGl2ZS4KKyAgICAgICAgLy8gSWYgaXQncyBwb3NpdGl2ZSwgbWVyZ2UuIFRoZSBtaW5pbXVtIHBlcmlvZCBiZXR3ZWVuIHdha2luZyB0aGUgY29uZGl0aW9uIHZhcmlhYmxlCisgICAgICAgIC8vIGlzIGhhbmRsZWQgaW4gQXVkaW9GbGluZ2VyOjpNZWRpYUxvZ05vdGlmaWVyOjp0aHJlYWRMb29wKCkuCisgICAgICAgIG1Db25kLndhaXQobU11dGV4KTsKKyAgICAgICAgZG9NZXJnZSA9IG1UaW1lb3V0VXMgPiAwOworICAgICAgICBtVGltZW91dFVzIC09IGtUaHJlYWRTbGVlcFBlcmlvZFVzOworICAgIH0KKyAgICBpZiAoZG9NZXJnZSkgeworICAgICAgICAvLyBNZXJnZSBkYXRhIGZyb20gYWxsIHRoZSByZWFkZXJzCisgICAgICAgIG1NZXJnZXIubWVyZ2UoKTsKKyAgICAgICAgLy8gUHJvY2VzcyB0aGUgZGF0YSBjb2xsZWN0ZWQgYnkgbU1lcmdlciBhbmQgd3JpdGUgaXQgdG8gUGVyZm9ybWFuY2VBbmFseXNpcworICAgICAgICAvLyBGSVhNRTogZGVjaWRlIHdoZXRoZXIgdG8gY2FsbCBnZXRBbmRQcm9jZXNzU25hcHNob3QgZXZlcnkgdGltZQorICAgICAgICAvLyBvciB3aGV0aGVyIHRvIGhhdmUgYSBzZXBhcmF0ZSB0aHJlYWQgdGhhdCBjYWxscyBpdCB3aXRoIGEgbG93ZXIgZnJlcXVlbmN5CisgICAgICAgIG1NZXJnZVJlYWRlci5nZXRBbmRQcm9jZXNzU25hcHNob3QoKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgTWVyZ2VUaHJlYWQ6Ondha2V1cCgpCit7CisgICAgc2V0VGltZW91dFVzKGtUaHJlYWRXYWtldXBQZXJpb2RVcyk7Cit9CisKK3ZvaWQgTWVyZ2VUaHJlYWQ6OnNldFRpbWVvdXRVcyhpbnQgdGltZSkKK3sKKyAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKKyAgICBtVGltZW91dFVzID0gdGltZTsKKyAgICBtQ29uZC5zaWduYWwoKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9OQkxvZy5jcHAgYi9tZWRpYS9saWJuYmxvZy9OQkxvZy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2ZmEzZTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlibmJsb2cvTkJMb2cuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTE1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKgotICoKLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIk5CTG9nIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGNsaW1pdHM+Ci0jaW5jbHVkZSA8ZGVxdWU+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8bnVtZXJpYz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KLSNpbmNsdWRlIDx0aW1lLmg+Ci0jaW5jbHVkZSA8bmV3PgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3JvdW5kdXAuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9OQkxvZy5oPgotI2luY2x1ZGUgPG1lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oPgotI2luY2x1ZGUgPHV0aWxzL0NhbGxTdGFjay5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLQotI2luY2x1ZGUgPHF1ZXVlPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotaW50IE5CTG9nOjpFbnRyeTo6Y29weUVudHJ5RGF0YUF0KHNpemVfdCBvZmZzZXQpIGNvbnN0Ci17Ci0gICAgLy8gRklYTUUgVGhpcyBpcyB0b28gc2xvdwotICAgIGlmIChvZmZzZXQgPT0gMCkKLSAgICAgICAgcmV0dXJuIG1FdmVudDsKLSAgICBlbHNlIGlmIChvZmZzZXQgPT0gMSkKLSAgICAgICAgcmV0dXJuIG1MZW5ndGg7Ci0gICAgZWxzZSBpZiAob2Zmc2V0IDwgKHNpemVfdCkgKG1MZW5ndGggKyAyKSkKLSAgICAgICAgcmV0dXJuICgoY2hhciAqKSBtRGF0YSlbb2Zmc2V0IC0gMl07Ci0gICAgZWxzZSBpZiAob2Zmc2V0ID09IChzaXplX3QpIChtTGVuZ3RoICsgMikpCi0gICAgICAgIHJldHVybiBtTGVuZ3RoOwotICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIDA7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vKnN0YXRpYyovCi1zdGQ6OnVuaXF1ZV9wdHI8TkJMb2c6OkFic3RyYWN0RW50cnk+IE5CTG9nOjpBYnN0cmFjdEVudHJ5OjpidWlsZEVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cikgewotICAgIGNvbnN0IHVpbnQ4X3QgdHlwZSA9IEVudHJ5SXRlcmF0b3IocHRyKS0+dHlwZTsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIEVWRU5UX1NUQVJUX0ZNVDoKLSAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV91bmlxdWU8Rm9ybWF0RW50cnk+KEZvcm1hdEVudHJ5KHB0cikpOwotICAgIGNhc2UgRVZFTlRfQVVESU9fU1RBVEU6Ci0gICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFM6Ci0gICAgICAgIHJldHVybiBzdGQ6Om1ha2VfdW5pcXVlPEhpc3RvZ3JhbUVudHJ5PihIaXN0b2dyYW1FbnRyeShwdHIpKTsKLSAgICBkZWZhdWx0OgotICAgICAgICBBTE9HVygiVHJpZWQgdG8gY3JlYXRlIEFic3RyYWN0RW50cnkgb2YgdHlwZSAlZCIsIHR5cGUpOwotICAgICAgICByZXR1cm4gbnVsbHB0cjsKLSAgICB9Ci19Ci0KLU5CTG9nOjpBYnN0cmFjdEVudHJ5OjpBYnN0cmFjdEVudHJ5KGNvbnN0IHVpbnQ4X3QgKmVudHJ5KSA6IG1FbnRyeShlbnRyeSkgewotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OkZvcm1hdEVudHJ5OjpiZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpOwotfQotCi1jb25zdCBjaGFyICpOQkxvZzo6Rm9ybWF0RW50cnk6OmZvcm1hdFN0cmluZygpIGNvbnN0IHsKLSAgICByZXR1cm4gKGNvbnN0IGNoYXIqKSBtRW50cnkgKyBvZmZzZXRvZihlbnRyeSwgZGF0YSk7Ci19Ci0KLXNpemVfdCBOQkxvZzo6Rm9ybWF0RW50cnk6OmZvcm1hdFN0cmluZ0xlbmd0aCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbUVudHJ5W29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXTsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3IgTkJMb2c6OkZvcm1hdEVudHJ5OjphcmdzKCkgY29uc3QgewotICAgIGF1dG8gaXQgPSBiZWdpbigpOwotICAgIC8vIHNraXAgc3RhcnQgZm10Ci0gICAgKytpdDsKLSAgICAvLyBza2lwIHRpbWVzdGFtcAotICAgICsraXQ7Ci0gICAgLy8gc2tpcCBoYXNoCi0gICAgKytpdDsKLSAgICAvLyBTa2lwIGF1dGhvciBpZiBwcmVzZW50Ci0gICAgaWYgKGl0LT50eXBlID09IEVWRU5UX0FVVEhPUikgewotICAgICAgICArK2l0OwotICAgIH0KLSAgICByZXR1cm4gaXQ7Ci19Ci0KLWludDY0X3QgTkJMb2c6OkZvcm1hdEVudHJ5Ojp0aW1lc3RhbXAoKSBjb25zdCB7Ci0gICAgYXV0byBpdCA9IGJlZ2luKCk7Ci0gICAgLy8gc2tpcCBzdGFydCBmbXQKLSAgICArK2l0OwotICAgIHJldHVybiBpdC5wYXlsb2FkPGludDY0X3Q+KCk7Ci19Ci0KLU5CTG9nOjpsb2dfaGFzaF90IE5CTG9nOjpGb3JtYXRFbnRyeTo6aGFzaCgpIGNvbnN0IHsKLSAgICBhdXRvIGl0ID0gYmVnaW4oKTsKLSAgICAvLyBza2lwIHN0YXJ0IGZtdAotICAgICsraXQ7Ci0gICAgLy8gc2tpcCB0aW1lc3RhbXAKLSAgICArK2l0OwotICAgIC8vIHVuYWxpZ25lZCA2NC1iaXQgcmVhZCBub3Qgc3VwcG9ydGVkCi0gICAgbG9nX2hhc2hfdCBoYXNoOwotICAgIG1lbWNweSgmaGFzaCwgaXQtPmRhdGEsIHNpemVvZihoYXNoKSk7Ci0gICAgcmV0dXJuIGhhc2g7Ci19Ci0KLWludCBOQkxvZzo6Rm9ybWF0RW50cnk6OmF1dGhvcigpIGNvbnN0IHsKLSAgICBhdXRvIGl0ID0gYmVnaW4oKTsKLSAgICAvLyBza2lwIHN0YXJ0IGZtdAotICAgICsraXQ7Ci0gICAgLy8gc2tpcCB0aW1lc3RhbXAKLSAgICArK2l0OwotICAgIC8vIHNraXAgaGFzaAotICAgICsraXQ7Ci0gICAgLy8gaWYgdGhlcmUgaXMgYW4gYXV0aG9yIGVudHJ5LCByZXR1cm4gaXQsIHJldHVybiAtMSBvdGhlcndpc2UKLSAgICBpZiAoaXQtPnR5cGUgPT0gRVZFTlRfQVVUSE9SKSB7Ci0gICAgICAgIHJldHVybiBpdC5wYXlsb2FkPGludD4oKTsKLSAgICB9Ci0gICAgcmV0dXJuIC0xOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciBOQkxvZzo6Rm9ybWF0RW50cnk6OmNvcHlXaXRoQXV0aG9yKAotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsIGludCBhdXRob3IpIGNvbnN0IHsKLSAgICBhdXRvIGl0ID0gYmVnaW4oKTsKLSAgICAvLyBjb3B5IGZtdCBzdGFydCBlbnRyeQotICAgIGl0LmNvcHlUbyhkc3QpOwotICAgIC8vIGNvcHkgdGltZXN0YW1wCi0gICAgKCsraXQpLmNvcHlUbyhkc3QpOyAgICAvLyBjb3B5IGhhc2gKLSAgICAoKytpdCkuY29weVRvKGRzdCk7Ci0gICAgLy8gaW5zZXJ0IGF1dGhvciBlbnRyeQotICAgIHNpemVfdCBhdXRob3JFbnRyeVNpemUgPSBOQkxvZzo6RW50cnk6OmtPdmVyaGVhZCArIHNpemVvZihhdXRob3IpOwotICAgIHVpbnQ4X3QgYXV0aG9yRW50cnlbYXV0aG9yRW50cnlTaXplXTsKLSAgICBhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgdHlwZSldID0gRVZFTlRfQVVUSE9SOwotICAgIGF1dGhvckVudHJ5W29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSA9Ci0gICAgICAgIGF1dGhvckVudHJ5W2F1dGhvckVudHJ5U2l6ZSArIE5CTG9nOjpFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSA9Ci0gICAgICAgIHNpemVvZihhdXRob3IpOwotICAgICooaW50KikgKCZhdXRob3JFbnRyeVtvZmZzZXRvZihlbnRyeSwgZGF0YSldKSA9IGF1dGhvcjsKLSAgICBkc3QtPndyaXRlKGF1dGhvckVudHJ5LCBhdXRob3JFbnRyeVNpemUpOwotICAgIC8vIGNvcHkgcmVzdCBvZiBlbnRyaWVzCi0gICAgd2hpbGUgKCgrK2l0KS0+dHlwZSAhPSBFVkVOVF9FTkRfRk1UKSB7Ci0gICAgICAgIGl0LmNvcHlUbyhkc3QpOwotICAgIH0KLSAgICBpdC5jb3B5VG8oZHN0KTsKLSAgICArK2l0OwotICAgIHJldHVybiBpdDsKLX0KLQotdm9pZCBOQkxvZzo6RW50cnlJdGVyYXRvcjo6Y29weVRvKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCkgY29uc3QgewotICAgIHNpemVfdCBsZW5ndGggPSBwdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsgTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQ7Ci0gICAgZHN0LT53cml0ZShwdHIsIGxlbmd0aCk7Ci19Ci0KLXZvaWQgTkJMb2c6OkVudHJ5SXRlcmF0b3I6OmNvcHlEYXRhKHVpbnQ4X3QgKmRzdCkgY29uc3QgewotICAgIG1lbWNweSgodm9pZCopIGRzdCwgcHRyICsgb2Zmc2V0b2YoZW50cnksIGRhdGEpLCBwdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldKTsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3I6OkVudHJ5SXRlcmF0b3IoKQotICAgIDogcHRyKG51bGxwdHIpIHt9Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpFbnRyeUl0ZXJhdG9yKGNvbnN0IHVpbnQ4X3QgKmVudHJ5KQotICAgIDogcHRyKGVudHJ5KSB7fQotCi1OQkxvZzo6RW50cnlJdGVyYXRvcjo6RW50cnlJdGVyYXRvcihjb25zdCBOQkxvZzo6RW50cnlJdGVyYXRvciAmb3RoZXIpCi0gICAgOiBwdHIob3RoZXIucHRyKSB7fQotCi1jb25zdCBOQkxvZzo6ZW50cnkmIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvciooKSBjb25zdCB7Ci0gICAgcmV0dXJuICooZW50cnkqKSBwdHI7Ci19Ci0KLWNvbnN0IE5CTG9nOjplbnRyeSogTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLT4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIChlbnRyeSopIHB0cjsKLX0KLQotTkJMb2c6OkVudHJ5SXRlcmF0b3ImIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpvcGVyYXRvcisrKCkgewotICAgIHB0ciArPSBwdHJbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsgTkJMb2c6OkVudHJ5OjprT3ZlcmhlYWQ7Ci0gICAgcmV0dXJuICp0aGlzOwotfQotCi1OQkxvZzo6RW50cnlJdGVyYXRvciYgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yLS0oKSB7Ci0gICAgcHRyIC09IHB0cltOQkxvZzo6RW50cnk6OmtQcmV2aW91c0xlbmd0aE9mZnNldF0gKyBOQkxvZzo6RW50cnk6OmtPdmVyaGVhZDsKLSAgICByZXR1cm4gKnRoaXM7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpuZXh0KCkgY29uc3QgewotICAgIEVudHJ5SXRlcmF0b3IgYXV4KCp0aGlzKTsKLSAgICByZXR1cm4gKythdXg7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpFbnRyeUl0ZXJhdG9yOjpwcmV2KCkgY29uc3QgewotICAgIEVudHJ5SXRlcmF0b3IgYXV4KCp0aGlzKTsKLSAgICByZXR1cm4gLS1hdXg7Ci19Ci0KLWludCBOQkxvZzo6RW50cnlJdGVyYXRvcjo6b3BlcmF0b3ItKGNvbnN0IE5CTG9nOjpFbnRyeUl0ZXJhdG9yICZvdGhlcikgY29uc3QgewotICAgIHJldHVybiBwdHIgLSBvdGhlci5wdHI7Ci19Ci0KLWJvb2wgTkJMb2c6OkVudHJ5SXRlcmF0b3I6Om9wZXJhdG9yIT0oY29uc3QgRW50cnlJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gcHRyICE9IG90aGVyLnB0cjsKLX0KLQotYm9vbCBOQkxvZzo6RW50cnlJdGVyYXRvcjo6aGFzQ29uc2lzdGVudExlbmd0aCgpIGNvbnN0IHsKLSAgICByZXR1cm4gcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSA9PSBwdHJbcHRyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSArCi0gICAgICAgIE5CTG9nOjpFbnRyeTo6a092ZXJoZWFkICsgTkJMb2c6OkVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW50NjRfdCBOQkxvZzo6SGlzdG9ncmFtRW50cnk6OnRpbWVzdGFtcCgpIGNvbnN0IHsKLSAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLnBheWxvYWQ8SGlzdFRzRW50cnk+KCkudHM7Ci19Ci0KLU5CTG9nOjpsb2dfaGFzaF90IE5CTG9nOjpIaXN0b2dyYW1FbnRyeTo6aGFzaCgpIGNvbnN0IHsKLSAgICByZXR1cm4gRW50cnlJdGVyYXRvcihtRW50cnkpLnBheWxvYWQ8SGlzdFRzRW50cnk+KCkuaGFzaDsKLX0KLQotaW50IE5CTG9nOjpIaXN0b2dyYW1FbnRyeTo6YXV0aG9yKCkgY29uc3QgewotICAgIEVudHJ5SXRlcmF0b3IgaXQobUVudHJ5KTsKLSAgICBpZiAoaXQtPmxlbmd0aCA9PSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKSkgewotICAgICAgICByZXR1cm4gaXQucGF5bG9hZDxIaXN0VHNFbnRyeVdpdGhBdXRob3I+KCkuYXV0aG9yOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpIaXN0b2dyYW1FbnRyeTo6Y29weVdpdGhBdXRob3IoCi0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwgaW50IGF1dGhvcikgY29uc3QgewotICAgIC8vIEN1cnJlbnQgaGlzdG9ncmFtIGVudHJ5IGhhcyB7dHlwZSwgbGVuZ3RoLCBzdHJ1Y3QgSGlzdFRzRW50cnksIGxlbmd0aH0uCi0gICAgLy8gV2Ugbm93IHdhbnQge3R5cGUsIGxlbmd0aCwgc3RydWN0IEhpc3RUc0VudHJ5V2l0aEF1dGhvciwgbGVuZ3RofQotICAgIHVpbnQ4X3QgYnVmZmVyW0VudHJ5OjprT3ZlcmhlYWQgKyBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKV07Ci0gICAgLy8gQ29weSBjb250ZW50IHVudGlsIHRoZSBwb2ludCB3ZSB3YW50IHRvIGFkZCB0aGUgYXV0aG9yCi0gICAgbWVtY3B5KGJ1ZmZlciwgbUVudHJ5LCBzaXplb2YoZW50cnkpICsgc2l6ZW9mKEhpc3RUc0VudHJ5KSk7Ci0gICAgLy8gQ29weSB0aGUgYXV0aG9yCi0gICAgKihpbnQqKSAoYnVmZmVyICsgc2l6ZW9mKGVudHJ5KSArIHNpemVvZihIaXN0VHNFbnRyeSkpID0gYXV0aG9yOwotICAgIC8vIFVwZGF0ZSBsZW5ndGhzCi0gICAgYnVmZmVyW29mZnNldG9mKGVudHJ5LCBsZW5ndGgpXSA9IHNpemVvZihIaXN0VHNFbnRyeVdpdGhBdXRob3IpOwotICAgIGJ1ZmZlcltvZmZzZXRvZihlbnRyeSwgZGF0YSkgKyBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKSArIG9mZnNldG9mKGVuZGluZywgbGVuZ3RoKV0KLSAgICAgICAgPSBzaXplb2YoSGlzdFRzRW50cnlXaXRoQXV0aG9yKTsKLSAgICAvLyBXcml0ZSBuZXcgYnVmZmVyIGludG8gRklGTwotICAgIGRzdC0+d3JpdGUoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7Ci0gICAgcmV0dXJuIEVudHJ5SXRlcmF0b3IobUVudHJ5KS5uZXh0KCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgMCAgIC8vIEZJWE1FIHNlZSBub3RlIGluIE5CTG9nLmgKLU5CTG9nOjpUaW1lbGluZTo6VGltZWxpbmUoc2l6ZV90IHNpemUsIHZvaWQgKnNoYXJlZCkKLSAgICA6IG1TaXplKHJvdW5kdXAoc2l6ZSkpLCBtT3duKHNoYXJlZCA9PSBOVUxMKSwKLSAgICAgIG1TaGFyZWQoKFNoYXJlZCAqKSAobU93biA/IG5ldyBjaGFyW3NoYXJlZFNpemUoc2l6ZSldIDogc2hhcmVkKSkKLXsKLSAgICBuZXcgKG1TaGFyZWQpIFNoYXJlZDsKLX0KLQotTkJMb2c6OlRpbWVsaW5lOjp+VGltZWxpbmUoKQotewotICAgIG1TaGFyZWQtPn5TaGFyZWQoKTsKLSAgICBpZiAobU93bikgewotICAgICAgICBkZWxldGVbXSAoY2hhciAqKSBtU2hhcmVkOwotICAgIH0KLX0KLSNlbmRpZgotCi0vKnN0YXRpYyovCi1zaXplX3QgTkJMb2c6OlRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemVfdCBzaXplKQotewotICAgIC8vIFRPRE8gZmlmbyBub3cgc3VwcG9ydHMgbm9uLXBvd2VyLW9mLTIgYnVmZmVyIHNpemVzLCBzbyBjb3VsZCByZW1vdmUgdGhlIHJvdW5kdXAKLSAgICByZXR1cm4gc2l6ZW9mKFNoYXJlZCkgKyByb3VuZHVwKHNpemUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTkJMb2c6OldyaXRlcjo6V3JpdGVyKCkKLSAgICA6IG1TaGFyZWQoTlVMTCksIG1GaWZvKE5VTEwpLCBtRmlmb1dyaXRlcihOVUxMKSwgbUVuYWJsZWQoZmFsc2UpLCBtUGlkVGFnKE5VTEwpLCBtUGlkVGFnU2l6ZSgwKQotewotfQotCi1OQkxvZzo6V3JpdGVyOjpXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSkKLSAgICA6IG1TaGFyZWQoKFNoYXJlZCAqKSBzaGFyZWQpLAotICAgICAgbUZpZm8obVNoYXJlZCAhPSBOVUxMID8KLSAgICAgICAgbmV3IGF1ZGlvX3V0aWxzX2ZpZm8oc2l6ZSwgc2l6ZW9mKHVpbnQ4X3QpLAotICAgICAgICAgICAgbVNoYXJlZC0+bUJ1ZmZlciwgbVNoYXJlZC0+bVJlYXIsIE5VTEwgLyp0aHJvdHRsZXNGcm9udCovKSA6IE5VTEwpLAotICAgICAgbUZpZm9Xcml0ZXIobUZpZm8gIT0gTlVMTCA/IG5ldyBhdWRpb191dGlsc19maWZvX3dyaXRlcigqbUZpZm8pIDogTlVMTCksCi0gICAgICBtRW5hYmxlZChtRmlmb1dyaXRlciAhPSBOVUxMKQotewotICAgIC8vIGNhY2hpbmcgcGlkIGFuZCBwcm9jZXNzIG5hbWUKLSAgICBwaWRfdCBpZCA9IDo6Z2V0cGlkKCk7Ci0gICAgY2hhciBwcm9jTmFtZVsxNl07Ci0gICAgaW50IHN0YXR1cyA9IHByY3RsKFBSX0dFVF9OQU1FLCBwcm9jTmFtZSk7Ci0gICAgaWYgKHN0YXR1cykgeyAgLy8gZXJyb3IgZ2V0dGluZyBwcm9jZXNzIG5hbWUKLSAgICAgICAgcHJvY05hbWVbMF0gPSAnXDAnOwotICAgIH0KLSAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKHByb2NOYW1lKTsKLSAgICBtUGlkVGFnU2l6ZSA9IGxlbmd0aCArIHNpemVvZihwaWRfdCk7Ci0gICAgbVBpZFRhZyA9IG5ldyBjaGFyW21QaWRUYWdTaXplXTsKLSAgICBtZW1jcHkobVBpZFRhZywgJmlkLCBzaXplb2YocGlkX3QpKTsKLSAgICBtZW1jcHkobVBpZFRhZyArIHNpemVvZihwaWRfdCksIHByb2NOYW1lLCBsZW5ndGgpOwotfQotCi1OQkxvZzo6V3JpdGVyOjpXcml0ZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplKQotICAgIDogV3JpdGVyKGlNZW1vcnkgIT0gMCA/IChTaGFyZWQgKikgaU1lbW9yeS0+cG9pbnRlcigpIDogTlVMTCwgc2l6ZSkKLXsKLSAgICBtSU1lbW9yeSA9IGlNZW1vcnk7Ci19Ci0KLU5CTG9nOjpXcml0ZXI6On5Xcml0ZXIoKQotewotICAgIGRlbGV0ZSBtRmlmb1dyaXRlcjsKLSAgICBkZWxldGUgbUZpZm87Ci0gICAgZGVsZXRlW10gbVBpZFRhZzsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2coY29uc3QgY2hhciAqc3RyaW5nKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0cmluZyA9PSBOVUxMLCAiQXR0ZW1wdGVkIHRvIGxvZyBOVUxMIHN0cmluZyIpOwotICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4oc3RyaW5nKTsKLSAgICBpZiAobGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKLSAgICAgICAgbGVuZ3RoID0gRW50cnk6OmtNYXhMZW5ndGg7Ci0gICAgfQotICAgIGxvZyhFVkVOVF9TVFJJTkcsIHN0cmluZywgbGVuZ3RoKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICB2YV9saXN0IGFwOwotICAgIHZhX3N0YXJ0KGFwLCBmbXQpOwotICAgIFdyaXRlcjo6bG9ndmYoZm10LCBhcCk7ICAgICAvLyB0aGUgV3JpdGVyOjogaXMgbmVlZGVkIHRvIGF2b2lkIHZpcnR1YWwgZGlzcGF0Y2ggZm9yIExvY2tlZFdyaXRlcgotICAgIHZhX2VuZChhcCk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjaGFyIGJ1ZmZlcltFbnRyeTo6a01heExlbmd0aCArIDEgLypOVUwqL107Ci0gICAgaW50IGxlbmd0aCA9IHZzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCBmbXQsIGFwKTsKLSAgICBpZiAobGVuZ3RoID49IChpbnQpIHNpemVvZihidWZmZXIpKSB7Ci0gICAgICAgIGxlbmd0aCA9IHNpemVvZihidWZmZXIpIC0gMTsKLSAgICAgICAgLy8gTlVMIHRlcm1pbmF0aW9uIGlzIG5vdCByZXF1aXJlZAotICAgICAgICAvLyBidWZmZXJbbGVuZ3RoXSA9ICdcMCc7Ci0gICAgfQotICAgIGlmIChsZW5ndGggPj0gMCkgewotICAgICAgICBsb2coRVZFTlRfU1RSSU5HLCBidWZmZXIsIGxlbmd0aCk7Ci0gICAgfQotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ1RpbWVzdGFtcCgpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGludDY0X3QgdHMgPSBnZXRfbW9ub3RvbmljX25zKCk7Ci0gICAgaWYgKHRzID4gMCkgewotICAgICAgICBsb2coRVZFTlRfVElNRVNUQU1QLCAmdHMsIHNpemVvZih0cykpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHRpbWVzdGFtcCIpOwotICAgIH0KLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dUaW1lc3RhbXAoY29uc3QgaW50NjRfdCB0cykKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX1RJTUVTVEFNUCwgJnRzLCBzaXplb2YodHMpKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dJbnRlZ2VyKGNvbnN0IGludCB4KQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2coRVZFTlRfSU5URUdFUiwgJngsIHNpemVvZih4KSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nRmxvYXQoY29uc3QgZmxvYXQgeCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX0ZMT0FULCAmeCwgc2l6ZW9mKHgpKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dQSUQoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2coRVZFTlRfUElELCBtUGlkVGFnLCBtUGlkVGFnU2l6ZSk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nU3RhcnQoY29uc3QgY2hhciAqZm10KQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKGZtdCk7Ci0gICAgaWYgKGxlbmd0aCA+IEVudHJ5OjprTWF4TGVuZ3RoKSB7Ci0gICAgICAgIGxlbmd0aCA9IEVudHJ5OjprTWF4TGVuZ3RoOwotICAgIH0KLSAgICBsb2coRVZFTlRfU1RBUlRfRk1ULCBmbXQsIGxlbmd0aCk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nRW5kKCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgRW50cnkgZW50cnkgPSBFbnRyeShFVkVOVF9FTkRfRk1ULCBOVUxMLCAwKTsKLSAgICBsb2coJmVudHJ5LCB0cnVlKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dIYXNoKGxvZ19oYXNoX3QgaGFzaCkKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgbG9nKEVWRU5UX0hBU0gsICZoYXNoLCBzaXplb2YoaGFzaCkpOwotfQotCi12b2lkIE5CTG9nOjpXcml0ZXI6OmxvZ0V2ZW50SGlzdFRzKEV2ZW50IGV2ZW50LCBsb2dfaGFzaF90IGhhc2gpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEhpc3RUc0VudHJ5IGRhdGE7Ci0gICAgZGF0YS5oYXNoID0gaGFzaDsKLSAgICBkYXRhLnRzID0gZ2V0X21vbm90b25pY19ucygpOwotICAgIGlmIChkYXRhLnRzID4gMCkgewotICAgICAgICBsb2coZXZlbnQsICZkYXRhLCBzaXplb2YoZGF0YSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHRpbWVzdGFtcCIpOwotICAgIH0KLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIC4uLikKLXsKLSAgICBpZiAoIW1FbmFibGVkKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB2YV9saXN0IGFwOwotICAgIHZhX3N0YXJ0KGFwLCBoYXNoKTsKLSAgICBXcml0ZXI6OmxvZ1ZGb3JtYXQoZm10LCBoYXNoLCBhcCk7Ci0gICAgdmFfZW5kKGFwKTsKLX0KLQotdm9pZCBOQkxvZzo6V3JpdGVyOjpsb2dWRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCB2YV9saXN0IGFyZ3ApCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIFdyaXRlcjo6bG9nU3RhcnQoZm10KTsKLSAgICBpbnQgaTsKLSAgICBkb3VibGUgZjsKLSAgICBjaGFyKiBzOwotICAgIGludDY0X3QgdDsKLSAgICBXcml0ZXI6OmxvZ1RpbWVzdGFtcCgpOwotICAgIFdyaXRlcjo6bG9nSGFzaChoYXNoKTsKLSAgICBmb3IgKGNvbnN0IGNoYXIgKnAgPSBmbXQ7ICpwICE9ICdcMCc7IHArKykgewotICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgbW9yZSBjb21wbGV4IGZvcm1hdHRpbmcgc3VjaCBhcyAlLjNmCi0gICAgICAgIGlmICgqcCAhPSAnJScpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaCgqKytwKSB7Ci0gICAgICAgIGNhc2UgJ3MnOiAvLyBzdHJpbmcKLSAgICAgICAgICAgIHMgPSB2YV9hcmcoYXJncCwgY2hhciAqKTsKLSAgICAgICAgICAgIFdyaXRlcjo6bG9nKHMpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAndCc6IC8vIHRpbWVzdGFtcAotICAgICAgICAgICAgdCA9IHZhX2FyZyhhcmdwLCBpbnQ2NF90KTsKLSAgICAgICAgICAgIFdyaXRlcjo6bG9nVGltZXN0YW1wKHQpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnZCc6IC8vIGludGVnZXIKLSAgICAgICAgICAgIGkgPSB2YV9hcmcoYXJncCwgaW50KTsKLSAgICAgICAgICAgIFdyaXRlcjo6bG9nSW50ZWdlcihpKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ2YnOiAvLyBmbG9hdAotICAgICAgICAgICAgZiA9IHZhX2FyZyhhcmdwLCBkb3VibGUpOyAvLyBmbG9hdCBhcmd1bWVudHMgYXJlIHByb21vdGVkIHRvIGRvdWJsZSBpbiB2YXJhcmcgbGlzdHMKLSAgICAgICAgICAgIFdyaXRlcjo6bG9nRmxvYXQoKGZsb2F0KWYpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAncCc6IC8vIHBpZAotICAgICAgICAgICAgV3JpdGVyOjpsb2dQSUQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIC8vIHRoZSAiJVwwIiBjYXNlIGZpbmlzaGVzIHBhcnNpbmcKLSAgICAgICAgY2FzZSAnXDAnOgotICAgICAgICAgICAgLS1wOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAnJSc6Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR1coIk5CTG9nIFdyaXRlciBwYXJzZWQgaW52YWxpZCBmb3JtYXQgc3BlY2lmaWVyOiAlYyIsICpwKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIFdyaXRlcjo6bG9nRW5kKCk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nKEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQotewotICAgIGlmICghbUVuYWJsZWQpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBpZiAoZGF0YSA9PSBOVUxMIHx8IGxlbmd0aCA+IEVudHJ5OjprTWF4TGVuZ3RoKSB7Ci0gICAgICAgIC8vIFRPRE8gUGVyaGFwcyBpdCBtYWtlcyBzZW5zZSB0byBkaXNwbGF5IHRydW5jYXRlZCBkYXRhIG9yIGF0IGxlYXN0IGEKLSAgICAgICAgLy8gICAgICBtZXNzYWdlIHRoYXQgdGhlIGRhdGEgaXMgdG9vIGxvbmc/ICBUaGUgY3VycmVudCBiZWhhdmlvciBjYW4gY3JlYXRlCi0gICAgICAgIC8vICAgICAgYSBjb25mdXNpb24gZm9yIGEgcHJvZ3JhbW1lciBkZWJ1Z2dpbmcgdGhlaXIgY29kZS4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICAvLyBJZ25vcmUgaWYgaW52YWxpZCBldmVudAotICAgIGlmIChldmVudCA9PSBFVkVOVF9SRVNFUlZFRCB8fCBldmVudCA+PSBFVkVOVF9VUFBFUl9CT1VORCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIEVudHJ5IGV0cihldmVudCwgZGF0YSwgbGVuZ3RoKTsKLSAgICBsb2coJmV0ciwgdHJ1ZSAvKnRydXN0ZWQqLyk7Ci19Ci0KLXZvaWQgTkJMb2c6OldyaXRlcjo6bG9nKGNvbnN0IE5CTG9nOjpFbnRyeSAqZXRyLCBib29sIHRydXN0ZWQpCi17Ci0gICAgaWYgKCFtRW5hYmxlZCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICghdHJ1c3RlZCkgewotICAgICAgICBsb2coZXRyLT5tRXZlbnQsIGV0ci0+bURhdGEsIGV0ci0+bUxlbmd0aCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc2l6ZV90IG5lZWQgPSBldHItPm1MZW5ndGggKyBFbnRyeTo6a092ZXJoZWFkOyAgICAvLyBtRXZlbnQsIG1MZW5ndGgsIGRhdGFbbUxlbmd0aF0sIG1MZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgPSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byBGSUZPCi0KLSAgICAvLyBGSVhNRSBvcHRpbWl6ZSB0aGlzIHVzaW5nIG1lbWNweSBmb3IgdGhlIGRhdGEgcGFydCBvZiB0aGUgRW50cnkuCi0gICAgLy8gVGhlIEVudHJ5IGNvdWxkIGhhdmUgYSBtZXRob2QgY29weVRvKHB0ciwgb2Zmc2V0LCBzaXplKSB0byBvcHRpbWl6ZSB0aGUgY29weS4KLSAgICAvLyBjaGVja3Mgc2l6ZSBvZiBhIHNpbmdsZSBsb2cgRW50cnk6IHR5cGUsIGxlbmd0aCwgZGF0YSBwb2ludGVyIGFuZCBlbmRpbmcKLSAgICB1aW50OF90IHRlbXBbRW50cnk6OmtNYXhMZW5ndGggKyBFbnRyeTo6a092ZXJoZWFkXTsKLSAgICAvLyB3cml0ZSB0aGlzIGRhdGEgdG8gdGVtcCBhcnJheQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbmVlZDsgaSsrKSB7Ci0gICAgICAgIHRlbXBbaV0gPSBldHItPmNvcHlFbnRyeURhdGFBdChpKTsKLSAgICB9Ci0gICAgLy8gd3JpdGUgdG8gY2lyY3VsYXIgYnVmZmVyCi0gICAgbUZpZm9Xcml0ZXItPndyaXRlKHRlbXAsIG5lZWQpOwotfQotCi1ib29sIE5CTG9nOjpXcml0ZXI6OmlzRW5hYmxlZCgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1FbmFibGVkOwotfQotCi1ib29sIE5CTG9nOjpXcml0ZXI6OnNldEVuYWJsZWQoYm9vbCBlbmFibGVkKQotewotICAgIGJvb2wgb2xkID0gbUVuYWJsZWQ7Ci0gICAgbUVuYWJsZWQgPSBlbmFibGVkICYmIG1TaGFyZWQgIT0gTlVMTDsKLSAgICByZXR1cm4gb2xkOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTkJMb2c6OkxvY2tlZFdyaXRlcjo6TG9ja2VkV3JpdGVyKCkKLSAgICA6IFdyaXRlcigpCi17Ci19Ci0KLU5CTG9nOjpMb2NrZWRXcml0ZXI6OkxvY2tlZFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKQotICAgIDogV3JpdGVyKHNoYXJlZCwgc2l6ZSkKLXsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2coY29uc3QgY2hhciAqc3RyaW5nKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2coc3RyaW5nKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dmKGNvbnN0IGNoYXIgKmZtdCwgLi4uKQotewotICAgIC8vIEZJWE1FIHNob3VsZCBub3QgdGFrZSB0aGUgbG9jayB1bnRpbCBhZnRlciBmb3JtYXR0aW5nIGlzIGRvbmUKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHZhX2xpc3QgYXA7Ci0gICAgdmFfc3RhcnQoYXAsIGZtdCk7Ci0gICAgV3JpdGVyOjpsb2d2ZihmbXQsIGFwKTsKLSAgICB2YV9lbmQoYXApOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ3ZmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKLXsKLSAgICAvLyBGSVhNRSBzaG91bGQgbm90IHRha2UgdGhlIGxvY2sgdW50aWwgYWZ0ZXIgZm9ybWF0dGluZyBpcyBkb25lCi0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ3ZmKGZtdCwgYXApOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ1RpbWVzdGFtcCgpCi17Ci0gICAgLy8gRklYTUUgc2hvdWxkIG5vdCB0YWtlIHRoZSBsb2NrIHVudGlsIGFmdGVyIHRoZSBjbG9ja19nZXR0aW1lKCkgc3lzY2FsbAotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dUaW1lc3RhbXAoKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dUaW1lc3RhbXAoY29uc3QgaW50NjRfdCB0cykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nVGltZXN0YW1wKHRzKTsKLX0KLQotdm9pZCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpsb2dJbnRlZ2VyKGNvbnN0IGludCB4KQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dJbnRlZ2VyKHgpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ0Zsb2F0KGNvbnN0IGZsb2F0IHgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ0Zsb2F0KHgpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ1BJRCgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ1BJRCgpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIFdyaXRlcjo6bG9nU3RhcnQoZm10KTsKLX0KLQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ0VuZCgpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBXcml0ZXI6OmxvZ0VuZCgpOwotfQotCi12b2lkIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmxvZ0hhc2gobG9nX2hhc2hfdCBoYXNoKQotewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgV3JpdGVyOjpsb2dIYXNoKGhhc2gpOwotfQotCi1ib29sIE5CTG9nOjpMb2NrZWRXcml0ZXI6OmlzRW5hYmxlZCgpIGNvbnN0Ci17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gV3JpdGVyOjppc0VuYWJsZWQoKTsKLX0KLQotYm9vbCBOQkxvZzo6TG9ja2VkV3JpdGVyOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBXcml0ZXI6OnNldEVuYWJsZWQoZW5hYmxlZCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jb25zdCBzdGQ6OnNldDxOQkxvZzo6RXZlbnQ+IE5CTG9nOjpSZWFkZXI6OnN0YXJ0aW5nVHlwZXMge05CTG9nOjpFdmVudDo6RVZFTlRfU1RBUlRfRk1ULAotICAgICAgICBOQkxvZzo6RXZlbnQ6OkVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywKLSAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9BVURJT19TVEFURX07Ci1jb25zdCBzdGQ6OnNldDxOQkxvZzo6RXZlbnQ+IE5CTG9nOjpSZWFkZXI6OmVuZGluZ1R5cGVzICAge05CTG9nOjpFdmVudDo6RVZFTlRfRU5EX0ZNVCwKLSAgICAgICAgTkJMb2c6OkV2ZW50OjpFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFMsCi0gICAgICAgIE5CTG9nOjpFdmVudDo6RVZFTlRfQVVESU9fU1RBVEV9OwotCi1OQkxvZzo6UmVhZGVyOjpSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSkKLSAgICA6IG1GZCgtMSksIG1JbmRlbnQoMCksIG1Mb3N0KDApLAotICAgICAgbVNoYXJlZCgoLypjb25zdCovIFNoYXJlZCAqKSBzaGFyZWQpLCAvKm1JTWVtb3J5Ki8KLSAgICAgIG1GaWZvKG1TaGFyZWQgIT0gTlVMTCA/Ci0gICAgICAgIG5ldyBhdWRpb191dGlsc19maWZvKHNpemUsIHNpemVvZih1aW50OF90KSwKLSAgICAgICAgICAgIG1TaGFyZWQtPm1CdWZmZXIsIG1TaGFyZWQtPm1SZWFyLCBOVUxMIC8qdGhyb3R0bGVzRnJvbnQqLykgOiBOVUxMKSwKLSAgICAgIG1GaWZvUmVhZGVyKG1GaWZvICE9IE5VTEwgPyBuZXcgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIoKm1GaWZvKSA6IE5VTEwpCi17Ci19Ci0KLU5CTG9nOjpSZWFkZXI6OlJlYWRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpCi0gICAgOiBSZWFkZXIoaU1lbW9yeSAhPSAwID8gKFNoYXJlZCAqKSBpTWVtb3J5LT5wb2ludGVyKCkgOiBOVUxMLCBzaXplKQotewotICAgIG1JTWVtb3J5ID0gaU1lbW9yeTsKLX0KLQotTkJMb2c6OlJlYWRlcjo6flJlYWRlcigpCi17Ci0gICAgZGVsZXRlIG1GaWZvUmVhZGVyOwotICAgIGRlbGV0ZSBtRmlmbzsKLX0KLQotY29uc3QgdWludDhfdCAqTkJMb2c6OlJlYWRlcjo6ZmluZExhc3RFbnRyeU9mVHlwZXMoY29uc3QgdWludDhfdCAqZnJvbnQsIGNvbnN0IHVpbnQ4X3QgKmJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PEV2ZW50PiAmdHlwZXMpIHsKLSAgICB3aGlsZSAoYmFjayArIEVudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXQgPj0gZnJvbnQpIHsKLSAgICAgICAgY29uc3QgdWludDhfdCAqcHJldiA9IGJhY2sgLSBiYWNrW0VudHJ5OjprUHJldmlvdXNMZW5ndGhPZmZzZXRdIC0gRW50cnk6OmtPdmVyaGVhZDsKLSAgICAgICAgaWYgKHByZXYgPCBmcm9udCB8fCBwcmV2ICsgcHJldltvZmZzZXRvZihlbnRyeSwgbGVuZ3RoKV0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudHJ5OjprT3ZlcmhlYWQgIT0gYmFjaykgewotCi0gICAgICAgICAgICAvLyBwcmV2IHBvaW50cyB0byBhbiBvdXQgb2YgbGltaXRzIG9yIGluY29uc2lzdGVudCBlbnRyeQotICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGVzLmZpbmQoKGNvbnN0IEV2ZW50KSBwcmV2W29mZnNldG9mKGVudHJ5LCB0eXBlKV0pICE9IHR5cGVzLmVuZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcHJldjsKLSAgICAgICAgfQotICAgICAgICBiYWNrID0gcHJldjsKLSAgICB9Ci0gICAgcmV0dXJuIG51bGxwdHI7IC8vIG5vIGVudHJ5IGZvdW5kCi19Ci0KLS8vIENvcGllcyBjb250ZW50IG9mIGEgUmVhZGVyIEZJRk8gaW50byBpdHMgU25hcHNob3QKLS8vIFRoZSBTbmFwc2hvdCBoYXMgdGhlIHNhbWUgcmF3IGRhdGEsIGJ1dCByZXByZXNlbnRlZCBhcyBhIHNlcXVlbmNlIG9mIGVudHJpZXMKLS8vIGFuZCBhbiBFbnRyeUl0ZXJhdG9yIG1ha2luZyBpdCBwb3NzaWJsZSB0byBwcm9jZXNzIHRoZSBkYXRhLgotc3RkOjp1bmlxdWVfcHRyPE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90PiBOQkxvZzo6UmVhZGVyOjpnZXRTbmFwc2hvdCgpCi17Ci0gICAgaWYgKG1GaWZvUmVhZGVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdD4obmV3IFNuYXBzaG90KCkpOwotICAgIH0KLSAgICAvLyBtYWtlIGEgY29weSB0byBhdm9pZCByYWNlIGNvbmRpdGlvbiB3aXRoIHdyaXRlcgotICAgIHNpemVfdCBjYXBhY2l0eSA9IG1GaWZvLT5jYXBhY2l0eSgpOwotCi0gICAgLy8gVGhpcyBlbXVsYXRlcyB0aGUgYmVoYXZpb3VyIG9mIGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyOjpyZWFkLCBidXQgd2l0aG91dCBpbmNyZW1lbnRpbmcgdGhlCi0gICAgLy8gcmVhZGVyIGluZGV4LiBUaGUgaW5kZXggaXMgaW5jcmVtZW50ZWQgYWZ0ZXIgaGFuZGxpbmcgY29ycnVwdGlvbiwgdG8gYWZ0ZXIgdGhlIGxhc3QgY29tcGxldGUKLSAgICAvLyBlbnRyeSBvZiB0aGUgYnVmZmVyCi0gICAgc2l6ZV90IGxvc3Q7Ci0gICAgYXVkaW9fdXRpbHNfaW92ZWMgaW92ZWNbMl07Ci0gICAgc3NpemVfdCBhdmFpbFRvUmVhZCA9IG1GaWZvUmVhZGVyLT5vYnRhaW4oaW92ZWMsIGNhcGFjaXR5LCBOVUxMIC8qdGltZW91dCovLCAmbG9zdCk7Ci0gICAgaWYgKGF2YWlsVG9SZWFkIDw9IDApIHsKLSAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdD4obmV3IFNuYXBzaG90KCkpOwotICAgIH0KLQotICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gc25hcHNob3QobmV3IFNuYXBzaG90KGF2YWlsVG9SZWFkKSk7Ci0gICAgbWVtY3B5KHNuYXBzaG90LT5tRGF0YSwgKGNvbnN0IGNoYXIgKikgbUZpZm8tPmJ1ZmZlcigpICsgaW92ZWNbMF0ubU9mZnNldCwgaW92ZWNbMF0ubUxlbmd0aCk7Ci0gICAgaWYgKGlvdmVjWzFdLm1MZW5ndGggPiAwKSB7Ci0gICAgICAgIG1lbWNweShzbmFwc2hvdC0+bURhdGEgKyAoaW92ZWNbMF0ubUxlbmd0aCksCi0gICAgICAgICAgICAoY29uc3QgY2hhciAqKSBtRmlmby0+YnVmZmVyKCkgKyBpb3ZlY1sxXS5tT2Zmc2V0LCBpb3ZlY1sxXS5tTGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvLyBIYW5kbGUgY29ycnVwdGVkIGJ1ZmZlcgotICAgIC8vIFBvdGVudGlhbGx5LCBhIGJ1ZmZlciBoYXMgY29ycnVwdGVkIGRhdGEgb24gYm90aCBiZWdpbm5pbmcgKGR1ZSB0byBvdmVyZmxvdykgYW5kIGVuZAotICAgIC8vIChkdWUgdG8gaW5jb21wbGV0ZSBmb3JtYXQgZW50cnkpLiBCdXQgZXZlbiBpZiB0aGUgZW5kIGZvcm1hdCBlbnRyeSBpcyBpbmNvbXBsZXRlLAotICAgIC8vIGl0IGVuZHMgaW4gYSBjb21wbGV0ZSBlbnRyeSAod2hpY2ggaXMgbm90IGFuIEVORF9GTVQpLiBTbyBpcyBzYWZlIHRvIHRyYXZlcnNlIGJhY2t3YXJkcy4KLSAgICAvLyBUT0RPOiBoYW5kbGUgY2xpZW50IGNvcnJ1cHRpb24gKGluIHRoZSBtaWRkbGUgb2YgYSBidWZmZXIpCi0KLSAgICBjb25zdCB1aW50OF90ICpiYWNrID0gc25hcHNob3QtPm1EYXRhICsgYXZhaWxUb1JlYWQ7Ci0gICAgY29uc3QgdWludDhfdCAqZnJvbnQgPSBzbmFwc2hvdC0+bURhdGE7Ci0KLSAgICAvLyBGaW5kIGxhc3QgRU5EX0ZNVC4gPGJhY2s+IGlzIHNpdHRpbmcgb24gYW4gZW50cnkgd2hpY2ggbWlnaHQgYmUgdGhlIG1pZGRsZSBvZiBhIEZvcm1hdEVudHJ5LgotICAgIC8vIFdlIGdvIGJhY2t3YXJkcyB1bnRpbCB3ZSBmaW5kIGFuIEVWRU5UX0VORF9GTVQuCi0gICAgY29uc3QgdWludDhfdCAqbGFzdEVuZCA9IGZpbmRMYXN0RW50cnlPZlR5cGVzKGZyb250LCBiYWNrLCBlbmRpbmdUeXBlcyk7Ci0gICAgaWYgKGxhc3RFbmQgPT0gbnVsbHB0cikgewotICAgICAgICBzbmFwc2hvdC0+bUVuZCA9IHNuYXBzaG90LT5tQmVnaW4gPSBFbnRyeUl0ZXJhdG9yKGZyb250KTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyBlbmQgb2Ygc25hcHNob3QgcG9pbnRzIHRvIGFmdGVyIGxhc3QgRU5EX0ZNVCBlbnRyeQotICAgICAgICBzbmFwc2hvdC0+bUVuZCA9IEVudHJ5SXRlcmF0b3IobGFzdEVuZCkubmV4dCgpOwotICAgICAgICAvLyBmaW5kIGZpcnN0IFNUQVJUX0ZNVAotICAgICAgICBjb25zdCB1aW50OF90ICpmaXJzdFN0YXJ0ID0gbnVsbHB0cjsKLSAgICAgICAgY29uc3QgdWludDhfdCAqZmlyc3RTdGFydFRtcCA9IHNuYXBzaG90LT5tRW5kOwotICAgICAgICB3aGlsZSAoKGZpcnN0U3RhcnRUbXAgPSBmaW5kTGFzdEVudHJ5T2ZUeXBlcyhmcm9udCwgZmlyc3RTdGFydFRtcCwgc3RhcnRpbmdUeXBlcykpCi0gICAgICAgICAgICAgICAgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgZmlyc3RTdGFydCA9IGZpcnN0U3RhcnRUbXA7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gZmlyc3RTdGFydCBpcyBudWxsIGlmIG5vIFNUQVJUX0ZNVCBlbnRyeSB3YXMgZm91bmQgYmVmb3JlIGxhc3RFbmQKLSAgICAgICAgaWYgKGZpcnN0U3RhcnQgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgc25hcHNob3QtPm1CZWdpbiA9IHNuYXBzaG90LT5tRW5kOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc25hcHNob3QtPm1CZWdpbiA9IEVudHJ5SXRlcmF0b3IoZmlyc3RTdGFydCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBhZHZhbmNlIGZpZm8gcmVhZGVyIGluZGV4IHRvIGFmdGVyIGxhc3QgZW50cnkgcmVhZC4KLSAgICBtRmlmb1JlYWRlci0+cmVsZWFzZShzbmFwc2hvdC0+bUVuZCAtIGZyb250KTsKLQotICAgIHNuYXBzaG90LT5tTG9zdCA9IGxvc3Q7Ci0gICAgcmV0dXJuIHNuYXBzaG90OwotCi19Ci0KLS8vIFRha2VzIHJhdyBjb250ZW50IG9mIHRoZSBsb2NhbCBtZXJnZXIgRklGTywgcHJvY2Vzc2VzIGxvZyBlbnRyaWVzLCBhbmQKLS8vIHdyaXRlcyB0aGUgZGF0YSB0byBhIG1hcCBvZiBjbGFzcyBQZXJmb3JtYW5jZUFuYWx5c2lzLCBiYXNlZCBvbiB0aGVpciB0aHJlYWQgSUQuCi12b2lkIE5CTG9nOjpNZXJnZVJlYWRlcjo6Z2V0QW5kUHJvY2Vzc1NuYXBzaG90KE5CTG9nOjpSZWFkZXI6OlNuYXBzaG90ICZzbmFwc2hvdCkKLXsKLSAgICBTdHJpbmc4IHRpbWVzdGFtcCwgYm9keTsKLQotICAgIGZvciAoYXV0byBlbnRyeSA9IHNuYXBzaG90LmJlZ2luKCk7IGVudHJ5ICE9IHNuYXBzaG90LmVuZCgpOykgewotICAgICAgICBzd2l0Y2ggKGVudHJ5LT50eXBlKSB7Ci0gICAgICAgIGNhc2UgRVZFTlRfU1RBUlRfRk1UOgotICAgICAgICAgICAgZW50cnkgPSBoYW5kbGVGb3JtYXQoRm9ybWF0RW50cnkoZW50cnkpLCAmdGltZXN0YW1wLCAmYm9keSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFVkVOVF9ISVNUT0dSQU1fRU5UUllfVFM6IHsKLSAgICAgICAgICAgIEhpc3RUc0VudHJ5V2l0aEF1dGhvciAqZGF0YSA9IChIaXN0VHNFbnRyeVdpdGhBdXRob3IgKikgKGVudHJ5LT5kYXRhKTsKLSAgICAgICAgICAgIC8vIFRPRE8gVGhpcyBtZW1jcGllcyBhcmUgaGVyZSB0byBhdm9pZCB1bmFsaWduZWQgbWVtb3J5IGFjY2VzcyBjcmFzaC4KLSAgICAgICAgICAgIC8vIFRoZXJlJ3MgcHJvYmFibHkgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZG8gaXQKLSAgICAgICAgICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICAgICAgICAgIG1lbWNweSgmaGFzaCwgJihkYXRhLT5oYXNoKSwgc2l6ZW9mKGhhc2gpKTsKLSAgICAgICAgICAgIGludDY0X3QgdHM7Ci0gICAgICAgICAgICBtZW1jcHkoJnRzLCAmZGF0YS0+dHMsIHNpemVvZih0cykpOwotICAgICAgICAgICAgLy8gVE9ETzogaGFzaCBmb3IgaGlzdG9ncmFtIHRzIGFuZCBhdWRpbyBzdGF0ZSBuZWVkIHRvIG1hdGNoCi0gICAgICAgICAgICAvLyBhbmQgY29ycmVzcG9uZCB0byBhdWRpbyBwcm9kdWN0aW9uIHNvdXJjZSBmaWxlIGxvY2F0aW9uCi0gICAgICAgICAgICBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpc1tkYXRhLT5hdXRob3JdWzAgLypoYXNoKi9dLmxvZ1RzRW50cnkodHMpOwotICAgICAgICAgICAgKytlbnRyeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRVZFTlRfQVVESU9fU1RBVEU6IHsKLSAgICAgICAgICAgIEhpc3RUc0VudHJ5V2l0aEF1dGhvciAqZGF0YSA9IChIaXN0VHNFbnRyeVdpdGhBdXRob3IgKikgKGVudHJ5LT5kYXRhKTsKLSAgICAgICAgICAgIC8vIFRPRE8gVGhpcyBtZW1jcGllcyBhcmUgaGVyZSB0byBhdm9pZCB1bmFsaWduZWQgbWVtb3J5IGFjY2VzcyBjcmFzaC4KLSAgICAgICAgICAgIC8vIFRoZXJlJ3MgcHJvYmFibHkgYSBtb3JlIGVmZmljaWVudCB3YXkgdG8gZG8gaXQKLSAgICAgICAgICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICAgICAgICAgIG1lbWNweSgmaGFzaCwgJihkYXRhLT5oYXNoKSwgc2l6ZW9mKGhhc2gpKTsKLSAgICAgICAgICAgIC8vIFRPRE86IHJlbW92ZSB0cyBpZiB1bnVzZWQKLSAgICAgICAgICAgIGludDY0X3QgdHM7Ci0gICAgICAgICAgICBtZW1jcHkoJnRzLCAmZGF0YS0+dHMsIHNpemVvZih0cykpOwotICAgICAgICAgICAgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXNbZGF0YS0+YXV0aG9yXVswIC8qaGFzaCovXS5oYW5kbGVTdGF0ZUNoYW5nZSgpOwotICAgICAgICAgICAgKytlbnRyeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgRVZFTlRfRU5EX0ZNVDoKLSAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJ3YXJuaW5nOiBnb3QgdG8gZW5kIGZvcm1hdCBldmVudCIpOwotICAgICAgICAgICAgKytlbnRyeTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEVWRU5UX1JFU0VSVkVEOgotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIndhcm5pbmc6IHVuZXhwZWN0ZWQgZXZlbnQgJWQiLCBlbnRyeS0+dHlwZSk7Ci0gICAgICAgICAgICArK2VudHJ5OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gRklYTUU6IGRlY2lkZSB3aGV0aGVyIHRvIHByaW50IHRoZSB3YXJuaW5ncyBoZXJlIG9yIGVsc2V3aGVyZQotICAgIGlmICghYm9keS5pc0VtcHR5KCkpIHsKLSAgICAgICAgZHVtcExpbmUodGltZXN0YW1wLCBib2R5KTsKLSAgICB9Ci19Ci0KLXZvaWQgTkJMb2c6Ok1lcmdlUmVhZGVyOjpnZXRBbmRQcm9jZXNzU25hcHNob3QoKQotewotICAgIC8vIGdldCBhIHNuYXBzaG90LCBwcm9jZXNzIGl0Ci0gICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBzbmFwID0gZ2V0U25hcHNob3QoKTsKLSAgICBnZXRBbmRQcm9jZXNzU25hcHNob3QoKnNuYXApOwotfQotCi12b2lkIE5CTG9nOjpNZXJnZVJlYWRlcjo6ZHVtcChpbnQgZmQsIGludCBpbmRlbnQpIHsKLSAgICAvLyBUT0RPOiBhZGQgYSBtdXRleCBhcm91bmQgbWVkaWEubG9nIGR1bXAKLSAgICBSZXBvcnRQZXJmb3JtYW5jZTo6ZHVtcChmZCwgaW5kZW50LCBtVGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpcyk7Ci19Ci0KLS8vIFdyaXRlcyBhIHN0cmluZyB0byB0aGUgY29uc29sZQotdm9pZCBOQkxvZzo6UmVhZGVyOjpkdW1wTGluZShjb25zdCBTdHJpbmc4ICZ0aW1lc3RhbXAsIFN0cmluZzggJmJvZHkpCi17Ci0gICAgaWYgKG1GZCA+PSAwKSB7Ci0gICAgICAgIGRwcmludGYobUZkLCAiJS4qcyVzICVzXG4iLCBtSW5kZW50LCAiIiwgdGltZXN0YW1wLnN0cmluZygpLCBib2R5LnN0cmluZygpKTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HSSgiJS4qcyVzICVzIiwgbUluZGVudCwgIiIsIHRpbWVzdGFtcC5zdHJpbmcoKSwgYm9keS5zdHJpbmcoKSk7Ci0gICAgfQotICAgIGJvZHkuY2xlYXIoKTsKLX0KLQotYm9vbCBOQkxvZzo6UmVhZGVyOjppc0lNZW1vcnkoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGlNZW1vcnkgIT0gMCAmJiBtSU1lbW9yeSAhPSAwICYmIGlNZW1vcnktPnBvaW50ZXIoKSA9PSBtSU1lbW9yeS0+cG9pbnRlcigpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBOQkxvZzo6YXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpIHsKLSAgICBpbnQ2NF90IHRzOwotICAgIG1lbWNweSgmdHMsIGRhdGEsIHNpemVvZih0cykpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiWyVkLiUwM2RdIiwgKGludCkgKHRzIC8gKDEwMDAgKiAxMDAwICogMTAwMCkpLAotICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzIC8gKDEwMDAgKiAxMDAwKSkgJSAxMDAwKSk7Ci19Ci0KLXZvaWQgTkJMb2c6OmFwcGVuZEludChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKSB7Ci0gICAgaW50IHggPSAqKChpbnQqKSBkYXRhKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIjwlZD4iLCB4KTsKLX0KLQotdm9pZCBOQkxvZzo6YXBwZW5kRmxvYXQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkgewotICAgIGZsb2F0IGY7Ci0gICAgbWVtY3B5KCZmLCBkYXRhLCBzaXplb2YoZmxvYXQpKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIjwlZj4iLCBmKTsKLX0KLQotdm9pZCBOQkxvZzo6YXBwZW5kUElEKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBsZW5ndGgpIHsKLSAgICBwaWRfdCBpZCA9ICooKHBpZF90KikgZGF0YSk7Ci0gICAgY2hhciAqIG5hbWUgPSAmKChjaGFyKikgZGF0YSlbc2l6ZW9mKHBpZF90KV07Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8UElEOiAlZCwgbmFtZTogJS4qcz4iLCBpZCwgKGludCkgKGxlbmd0aCAtIHNpemVvZihwaWRfdCkpLCBuYW1lKTsKLX0KLQotU3RyaW5nOCBOQkxvZzo6YnVmZmVyRHVtcChjb25zdCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBzaXplKQotewotICAgIFN0cmluZzggc3RyOwotICAgIHN0ci5hcHBlbmQoIlsgIik7Ci0gICAgZm9yKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykKLSAgICB7Ci0gICAgICAgIHN0ci5hcHBlbmRGb3JtYXQoIiVkICIsIGJ1ZmZlcltpXSk7Ci0gICAgfQotICAgIHN0ci5hcHBlbmQoIl0iKTsKLSAgICByZXR1cm4gc3RyOwotfQotCi1TdHJpbmc4IE5CTG9nOjpidWZmZXJEdW1wKGNvbnN0IEVudHJ5SXRlcmF0b3IgJml0KQotewotICAgIHJldHVybiBidWZmZXJEdW1wKGl0LCBpdC0+bGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZCk7Ci19Ci0KLU5CTG9nOjpFbnRyeUl0ZXJhdG9yIE5CTG9nOjpSZWFkZXI6OmhhbmRsZUZvcm1hdChjb25zdCBGb3JtYXRFbnRyeSAmZm10RW50cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4ICp0aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4ICpib2R5KSB7Ci0gICAgLy8gbG9nIHRpbWVzdGFtcAotICAgIGludDY0X3QgdHMgPSBmbXRFbnRyeS50aW1lc3RhbXAoKTsKLSAgICB0aW1lc3RhbXAtPmNsZWFyKCk7Ci0gICAgdGltZXN0YW1wLT5hcHBlbmRGb3JtYXQoIlslZC4lMDNkXSIsIChpbnQpICh0cyAvICgxMDAwICogMTAwMCAqIDEwMDApKSwKLSAgICAgICAgICAgICAgICAgICAgKGludCkgKCh0cyAvICgxMDAwICogMTAwMCkpICUgMTAwMCkpOwotCi0gICAgLy8gbG9nIHVuaXF1ZSBoYXNoCi0gICAgbG9nX2hhc2hfdCBoYXNoID0gZm10RW50cnkuaGFzaCgpOwotICAgIC8vIHByaW50IG9ubHkgbG93ZXIgMTZiaXQgb2YgaGFzaCBhcyBoZXggYW5kIGxpbmUgYXMgaW50IHRvIHJlZHVjZSBzcGFtIGluIHRoZSBsb2cKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIiUuNFgtJWQgIiwgKGludCkoaGFzaCA+PiAxNikgJiAweEZGRkYsIChpbnQpIGhhc2ggJiAweEZGRkYpOwotCi0gICAgLy8gbG9nIGF1dGhvciAoaWYgcHJlc2VudCkKLSAgICBoYW5kbGVBdXRob3IoZm10RW50cnksIGJvZHkpOwotCi0gICAgLy8gbG9nIHN0cmluZwotICAgIE5CTG9nOjpFbnRyeUl0ZXJhdG9yIGFyZyA9IGZtdEVudHJ5LmFyZ3MoKTsKLQotICAgIGNvbnN0IGNoYXIqIGZtdCA9IGZtdEVudHJ5LmZvcm1hdFN0cmluZygpOwotICAgIHNpemVfdCBmbXRfbGVuZ3RoID0gZm10RW50cnkuZm9ybWF0U3RyaW5nTGVuZ3RoKCk7Ci0KLSAgICBmb3IgKHNpemVfdCBmbXRfb2Zmc2V0ID0gMDsgZm10X29mZnNldCA8IGZtdF9sZW5ndGg7ICsrZm10X29mZnNldCkgewotICAgICAgICBpZiAoZm10W2ZtdF9vZmZzZXRdICE9ICclJykgewotICAgICAgICAgICAgYm9keS0+YXBwZW5kKCZmbXRbZm10X29mZnNldF0sIDEpOyAvLyBUT0RPIG9wdGltaXplIHRvIHdyaXRlIGNvbnNlY3V0aXZlIHN0cmluZ3MgYXQgb25jZQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gY2FzZSAiJSUiIgotICAgICAgICBpZiAoZm10WysrZm10X29mZnNldF0gPT0gJyUnKSB7Ci0gICAgICAgICAgICBib2R5LT5hcHBlbmQoIiUiKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIGNhc2UgIiVcMCIKLSAgICAgICAgaWYgKGZtdF9vZmZzZXQgPT0gZm10X2xlbmd0aCkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBOQkxvZzo6RXZlbnQgZXZlbnQgPSAoTkJMb2c6OkV2ZW50KSBhcmctPnR5cGU7Ci0gICAgICAgIHNpemVfdCBsZW5ndGggPSBhcmctPmxlbmd0aDsKLQotICAgICAgICAvLyBUT0RPIGNoZWNrIGxlbmd0aCBmb3IgZXZlbnQgdHlwZSBpcyBjb3JyZWN0Ci0KLSAgICAgICAgaWYgKGV2ZW50ID09IEVWRU5UX0VORF9GTVQpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IG1vcmUgY29tcGxleCBmb3JtYXR0aW5nIHN1Y2ggYXMgJS4zZgotICAgICAgICBjb25zdCB1aW50OF90ICpkYXR1bSA9IGFyZy0+ZGF0YTsgLy8gcG9pbnRlciB0byB0aGUgY3VycmVudCBldmVudCBhcmdzCi0gICAgICAgIHN3aXRjaChmbXRbZm10X29mZnNldF0pCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAncyc6IC8vIHN0cmluZwotICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfU1RSSU5HLAotICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciBzdHJpbmcgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGJvZHktPmFwcGVuZCgoY29uc3QgY2hhciopIGRhdHVtLCBsZW5ndGgpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSAndCc6IC8vIHRpbWVzdGFtcAotICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfVElNRVNUQU1QLAotICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciB0aW1lc3RhbXAgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKLSAgICAgICAgICAgIGFwcGVuZFRpbWVzdGFtcChib2R5LCBkYXR1bSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdkJzogLy8gaW50ZWdlcgotICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfSU5URUdFUiwKLSAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgaW50ZWdlciBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYXBwZW5kSW50KGJvZHksIGRhdHVtKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgJ2YnOiAvLyBmbG9hdAotICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfRkxPQVQsCi0gICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIGZsb2F0IHNwZWNpZmllcjogJWQiLCBldmVudCk7Ci0gICAgICAgICAgICBhcHBlbmRGbG9hdChib2R5LCBkYXR1bSk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlICdwJzogLy8gcGlkCi0gICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9QSUQsCi0gICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHBpZCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOwotICAgICAgICAgICAgYXBwZW5kUElEKGJvZHksIGRhdHVtLCBsZW5ndGgpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIEFMT0dXKCJOQkxvZyBSZWFkZXIgZW5jb3VudGVyZWQgdW5rbm93biBjaGFyYWN0ZXIgJWMiLCBmbXRbZm10X29mZnNldF0pOwotICAgICAgICB9Ci0gICAgICAgICsrYXJnOwotICAgIH0KLSAgICBBTE9HV19JRihhcmctPnR5cGUgIT0gRVZFTlRfRU5EX0ZNVCwgIkV4cGVjdGVkIGVuZCBvZiBmb3JtYXQsIGdvdCAlZCIsIGFyZy0+dHlwZSk7Ci0gICAgKythcmc7Ci0gICAgcmV0dXJuIGFyZzsKLX0KLQotTkJMb2c6Ok1lcmdlcjo6TWVyZ2VyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOgotICAgICAgbVNoYXJlZCgoU2hhcmVkICopIHNoYXJlZCksCi0gICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPwotICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCi0gICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCi0gICAgICBtRmlmb1dyaXRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyKCptRmlmbykgOiBOVUxMKQotICAgICAge30KLQotdm9pZCBOQkxvZzo6TWVyZ2VyOjphZGRSZWFkZXIoY29uc3QgTkJMb2c6Ok5hbWVkUmVhZGVyICZyZWFkZXIpIHsKLQotICAgIC8vIEZJWE1FIFRoaXMgaXMgY2FsbGVkIGJ5IGJpbmRlciB0aHJlYWQgaW4gTWVkaWFMb2dTZXJ2aWNlOjpyZWdpc3RlcldyaXRlcgotICAgIC8vICAgICAgIGJ1dCB0aGUgYWNjZXNzIHRvIHNoYXJlZCB2YXJpYWJsZSBtTmFtZWRSZWFkZXJzIGlzIG5vdCB5ZXQgcHJvdGVjdGVkIGJ5IGEgbG9jay4KLSAgICBtTmFtZWRSZWFkZXJzLnB1c2hfYmFjayhyZWFkZXIpOwotfQotCi0vLyBpdGVtcyBwbGFjZWQgaW4gcHJpb3JpdHkgcXVldWUgZHVyaW5nIG1lcmdlCi0vLyBjb21wb3NlZCBieSBhIHRpbWVzdGFtcCBhbmQgdGhlIGluZGV4IG9mIHRoZSBzbmFwc2hvdCB3aGVyZSB0aGUgdGltZXN0YW1wIGNhbWUgZnJvbQotc3RydWN0IE1lcmdlSXRlbQotewotICAgIGludDY0X3QgdHM7Ci0gICAgaW50IGluZGV4OwotICAgIE1lcmdlSXRlbShpbnQ2NF90IHRzLCBpbnQgaW5kZXgpOiB0cyh0cyksIGluZGV4KGluZGV4KSB7fQotfTsKLQotLy8gb3BlcmF0b3JzIG5lZWRlZCBmb3IgcHJpb3JpdHkgcXVldWUgaW4gbWVyZ2UKLS8vIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGludDY0X3QgJnQxLCBjb25zdCBpbnQ2NF90ICZ0MikgewotLy8gICAgIHJldHVybiB0MS50dl9zZWMgPiB0Mi50dl9zZWMgfHwgKHQxLnR2X3NlYyA9PSB0Mi50dl9zZWMgJiYgdDEudHZfbnNlYyA+IHQyLnR2X25zZWMpOwotLy8gfQotCi1ib29sIG9wZXJhdG9yPihjb25zdCBzdHJ1Y3QgTWVyZ2VJdGVtICZpMSwgY29uc3Qgc3RydWN0IE1lcmdlSXRlbSAmaTIpIHsKLSAgICByZXR1cm4gaTEudHMgPiBpMi50cyB8fCAoaTEudHMgPT0gaTIudHMgJiYgaTEuaW5kZXggPiBpMi5pbmRleCk7Ci19Ci0KLS8vIE1lcmdlIHJlZ2lzdGVyZWQgcmVhZGVycywgc29ydGVkIGJ5IHRpbWVzdGFtcCwgYW5kIHdyaXRlIGRhdGEgdG8gYSBzaW5nbGUgRklGTyBpbiBsb2NhbCBtZW1vcnkKLXZvaWQgTkJMb2c6Ok1lcmdlcjo6bWVyZ2UoKSB7Ci0gICAgLy8gRklYTUUgVGhpcyBpcyBjYWxsZWQgYnkgbWVyZ2UgdGhyZWFkCi0gICAgLy8gICAgICAgYnV0IHRoZSBhY2Nlc3MgdG8gc2hhcmVkIHZhcmlhYmxlIG1OYW1lZFJlYWRlcnMgaXMgbm90IHlldCBwcm90ZWN0ZWQgYnkgYSBsb2NrLgotICAgIGludCBuTG9ncyA9IG1OYW1lZFJlYWRlcnMuc2l6ZSgpOwotICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxOQkxvZzo6UmVhZGVyOjpTbmFwc2hvdD4+IHNuYXBzaG90cyhuTG9ncyk7Ci0gICAgc3RkOjp2ZWN0b3I8TkJMb2c6OkVudHJ5SXRlcmF0b3I+IG9mZnNldHMobkxvZ3MpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbkxvZ3M7ICsraSkgewotICAgICAgICBzbmFwc2hvdHNbaV0gPSBtTmFtZWRSZWFkZXJzW2ldLnJlYWRlcigpLT5nZXRTbmFwc2hvdCgpOwotICAgICAgICBvZmZzZXRzW2ldID0gc25hcHNob3RzW2ldLT5iZWdpbigpOwotICAgIH0KLSAgICAvLyBpbml0aWFsaXplIG9mZnNldHMKLSAgICAvLyBUT0RPIGN1c3RvbSBoZWFwIGltcGxlbWVudGF0aW9uIGNvdWxkIGFsbG93IHRvIHVwZGF0ZSB0b3AsIGltcHJvdmluZyBwZXJmb3JtYW5jZQotICAgIC8vIGZvciBidXJzdHkgYnVmZmVycwotICAgIHN0ZDo6cHJpb3JpdHlfcXVldWU8TWVyZ2VJdGVtLCBzdGQ6OnZlY3RvcjxNZXJnZUl0ZW0+LCBzdGQ6OmdyZWF0ZXI8TWVyZ2VJdGVtPj4gdGltZXN0YW1wczsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG5Mb2dzOyArK2kpCi0gICAgewotICAgICAgICBpZiAob2Zmc2V0c1tpXSAhPSBzbmFwc2hvdHNbaV0tPmVuZCgpKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IHRzID0gQWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShvZmZzZXRzW2ldKS0+dGltZXN0YW1wKCk7Ci0gICAgICAgICAgICB0aW1lc3RhbXBzLmVtcGxhY2UodHMsIGkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgd2hpbGUgKCF0aW1lc3RhbXBzLmVtcHR5KCkpIHsKLSAgICAgICAgLy8gZmluZCBtaW5pbXVtIHRpbWVzdGFtcAotICAgICAgICBpbnQgaW5kZXggPSB0aW1lc3RhbXBzLnRvcCgpLmluZGV4OwotICAgICAgICAvLyBjb3B5IGl0IHRvIHRoZSBsb2csIGluY3JlYXNpbmcgb2Zmc2V0Ci0gICAgICAgIG9mZnNldHNbaW5kZXhdID0gQWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShvZmZzZXRzW2luZGV4XSktPmNvcHlXaXRoQXV0aG9yKG1GaWZvV3JpdGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0gICAgICAgIC8vIHVwZGF0ZSBkYXRhIHN0cnVjdHVyZXMKLSAgICAgICAgdGltZXN0YW1wcy5wb3AoKTsKLSAgICAgICAgaWYgKG9mZnNldHNbaW5kZXhdICE9IHNuYXBzaG90c1tpbmRleF0tPmVuZCgpKSB7Ci0gICAgICAgICAgICBpbnQ2NF90IHRzID0gQWJzdHJhY3RFbnRyeTo6YnVpbGRFbnRyeShvZmZzZXRzW2luZGV4XSktPnRpbWVzdGFtcCgpOwotICAgICAgICAgICAgdGltZXN0YW1wcy5lbXBsYWNlKHRzLCBpbmRleCk7Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLWNvbnN0IHN0ZDo6dmVjdG9yPE5CTG9nOjpOYW1lZFJlYWRlcj4mIE5CTG9nOjpNZXJnZXI6OmdldE5hbWVkUmVhZGVycygpIGNvbnN0IHsKLSAgICAvLyBGSVhNRSBUaGlzIGlzIHJldHVybmluZyBhIHJlZmVyZW5jZSB0byBhIHNoYXJlZCB2YXJpYWJsZSB0aGF0IG5lZWRzIGEgbG9jawotICAgIHJldHVybiBtTmFtZWRSZWFkZXJzOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTkJMb2c6Ok1lcmdlUmVhZGVyOjpNZXJnZVJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplLCBNZXJnZXIgJm1lcmdlcikKLSAgICA6IFJlYWRlcihzaGFyZWQsIHNpemUpLCBtTmFtZWRSZWFkZXJzKG1lcmdlci5nZXROYW1lZFJlYWRlcnMoKSkge30KLQotdm9pZCBOQkxvZzo6TWVyZ2VSZWFkZXI6OmhhbmRsZUF1dGhvcihjb25zdCBOQkxvZzo6QWJzdHJhY3RFbnRyeSAmZW50cnksIFN0cmluZzggKmJvZHkpIHsKLSAgICBpbnQgYXV0aG9yID0gZW50cnkuYXV0aG9yKCk7Ci0gICAgLy8gRklYTUUgTmVlZHMgYSBsb2NrCi0gICAgY29uc3QgY2hhciogbmFtZSA9IG1OYW1lZFJlYWRlcnNbYXV0aG9yXS5uYW1lKCk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlczogIiwgbmFtZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1OQkxvZzo6TWVyZ2VUaHJlYWQ6Ok1lcmdlVGhyZWFkKE5CTG9nOjpNZXJnZXIgJm1lcmdlciwgTkJMb2c6Ok1lcmdlUmVhZGVyICZtZXJnZVJlYWRlcikKLSAgICA6IG1NZXJnZXIobWVyZ2VyKSwKLSAgICAgIG1NZXJnZVJlYWRlcihtZXJnZVJlYWRlciksCi0gICAgICBtVGltZW91dFVzKDApIHt9Ci0KLU5CTG9nOjpNZXJnZVRocmVhZDo6fk1lcmdlVGhyZWFkKCkgewotICAgIC8vIHNldCBleGl0IGZsYWcsIHNldCB0aW1lb3V0IHRvIDAgdG8gZm9yY2UgdGhyZWFkTG9vcCB0byBleGl0IGFuZCB3YWl0IGZvciB0aGUgdGhyZWFkIHRvIGpvaW4KLSAgICByZXF1ZXN0RXhpdCgpOwotICAgIHNldFRpbWVvdXRVcygwKTsKLSAgICBqb2luKCk7Ci19Ci0KLWJvb2wgTkJMb2c6Ok1lcmdlVGhyZWFkOjp0aHJlYWRMb29wKCkgewotICAgIGJvb2wgZG9NZXJnZTsKLSAgICB7Ci0gICAgICAgIEF1dG9NdXRleCBfbChtTXV0ZXgpOwotICAgICAgICAvLyBJZiBtVGltZW91dFVzIGlzIG5lZ2F0aXZlLCB3YWl0IG9uIHRoZSBjb25kaXRpb24gdmFyaWFibGUgdW50aWwgaXQncyBwb3NpdGl2ZS4KLSAgICAgICAgLy8gSWYgaXQncyBwb3NpdGl2ZSwgd2FpdCBrVGhyZWFkU2xlZXBQZXJpb2RVcyBhbmQgdGhlbiBtZXJnZQotICAgICAgICBuc2Vjc190IHdhaXRUaW1lID0gbVRpbWVvdXRVcyA+IDAgPyBrVGhyZWFkU2xlZXBQZXJpb2RVcyAqIDEwMDAgOiBMTE9OR19NQVg7Ci0gICAgICAgIG1Db25kLndhaXRSZWxhdGl2ZShtTXV0ZXgsIHdhaXRUaW1lKTsKLSAgICAgICAgZG9NZXJnZSA9IG1UaW1lb3V0VXMgPiAwOwotICAgICAgICBtVGltZW91dFVzIC09IGtUaHJlYWRTbGVlcFBlcmlvZFVzOwotICAgIH0KLSAgICBpZiAoZG9NZXJnZSkgewotICAgICAgICAvLyBNZXJnZSBkYXRhIGZyb20gYWxsIHRoZSByZWFkZXJzCi0gICAgICAgIG1NZXJnZXIubWVyZ2UoKTsKLSAgICAgICAgLy8gUHJvY2VzcyB0aGUgZGF0YSBjb2xsZWN0ZWQgYnkgbU1lcmdlciBhbmQgd3JpdGUgaXQgdG8gUGVyZm9ybWFuY2VBbmFseXNpcwotICAgICAgICAvLyBGSVhNRTogZGVjaWRlIHdoZXRoZXIgdG8gY2FsbCBnZXRBbmRQcm9jZXNzU25hcHNob3QgZXZlcnkgdGltZQotICAgICAgICAvLyBvciB3aGV0aGVyIHRvIGhhdmUgYSBzZXBhcmF0ZSB0aHJlYWQgdGhhdCBjYWxscyBpdCB3aXRoIGEgbG93ZXIgZnJlcXVlbmN5Ci0gICAgICAgIG1NZXJnZVJlYWRlci5nZXRBbmRQcm9jZXNzU25hcHNob3QoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgTkJMb2c6Ok1lcmdlVGhyZWFkOjp3YWtldXAoKSB7Ci0gICAgc2V0VGltZW91dFVzKGtUaHJlYWRXYWtldXBQZXJpb2RVcyk7Ci19Ci0KLXZvaWQgTkJMb2c6Ok1lcmdlVGhyZWFkOjpzZXRUaW1lb3V0VXMoaW50IHRpbWUpIHsKLSAgICBBdXRvTXV0ZXggX2wobU11dGV4KTsKLSAgICBtVGltZW91dFVzID0gdGltZTsKLSAgICBtQ29uZC5zaWduYWwoKTsKLX0KLQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmNwcCBiL21lZGlhL2xpYm5ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwCmluZGV4IGYwOWU5M2QuLmU5MWE1MTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwCisrKyBiL21lZGlhL2xpYm5ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuY3BwCkBAIC0xNywxMyArMTcsMTYgQEAKIAogI2RlZmluZSBMT0dfVEFHICJQZXJmb3JtYW5jZUFuYWx5c2lzIgogLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vICNkZWZpbmUgV1JJVEVfVE9fRklMRQogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPGNsaW1pdHM+CiAjaW5jbHVkZSA8ZGVxdWU+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8bnVtZXJpYz4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8c3RkYXJnLmg+CiAjaW5jbHVkZSA8c3RkaW50Lmg+CkBAIC0zMiwyMCArMzUsMTI2IEBACiAjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CiAjaW5jbHVkZSA8dGltZS5oPgogI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9Mb2dQbG90Lmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcm91bmR1cC5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogCiAjaW5jbHVkZSA8cXVldWU+CiAjaW5jbHVkZSA8dXRpbGl0eT4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewotCiBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UgewogCit2b2lkIEhpc3RvZ3JhbTo6YWRkKGRvdWJsZSB2YWx1ZSkKK3sKKyAgICBpZiAobUJpblNpemUgPD0gMCB8fCBtQmlucy5zaXplKCkgPCAyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gVE9ETyBIYW5kbGUgZG9tYWluIGFuZCByYW5nZSBlcnJvciBleGNlcHRpb25zPworICAgIGNvbnN0IGludCB1bmJvdW5kZWRJbmRleCA9IGxyb3VuZCgodmFsdWUgLSBtTG93KSAvIG1CaW5TaXplKSArIDE7CisgICAgLy8gc3RkOjpjbGFtcCBpcyBpbnRyb2R1Y2VkIGluIEMrKzE3CisgICAgLy9jb25zdCBpbnQgaW5kZXggPSBzdGQ6OmNsYW1wKHVuYm91bmRlZEluZGV4LCAwLCAoaW50KShtQmlucy5zaXplKCkgLSAxKSk7CisgICAgY29uc3QgaW50IGluZGV4ID0gc3RkOjptYXgoMCwgc3RkOjptaW4oKGludCkobUJpbnMuc2l6ZSgpIC0gMSksIHVuYm91bmRlZEluZGV4KSk7CisgICAgbUJpbnNbaW5kZXhdKys7CisgICAgbVRvdGFsQ291bnQrKzsKK30KKwordm9pZCBIaXN0b2dyYW06OmNsZWFyKCkKK3sKKyAgICBzdGQ6OmZpbGwobUJpbnMuYmVnaW4oKSwgbUJpbnMuZW5kKCksIDApOworICAgIG1Ub3RhbENvdW50ID0gMDsKK30KKwordWludDY0X3QgSGlzdG9ncmFtOjp0b3RhbENvdW50KCkgY29uc3QKK3sKKyAgICByZXR1cm4gbVRvdGFsQ291bnQ7Cit9CisKK3N0ZDo6c3RyaW5nIEhpc3RvZ3JhbTo6dG9TdHJpbmcoKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtEaXZpZGVyID0gJ3wnOworICAgIHNzIDw8IGtWZXJzaW9uIDw8ICIsIiA8PCBtQmluU2l6ZSA8PCAiLCIgPDwgbU51bUJpbnMgPDwgIiwiIDw8IG1Mb3cgPDwgIix7IjsKKyAgICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1CaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtQmluc1tpXSAhPSAwKSB7CisgICAgICAgICAgICBpZiAoIWZpcnN0KSB7CisgICAgICAgICAgICAgICAgc3MgPDwgIiwiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3MgPDwgc3RhdGljX2Nhc3Q8aW50PihpKSAtIDEgPDwga0RpdmlkZXIgPDwgbUJpbnNbaV07CisgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHNzIDw8ICJ9IjsKKworICAgIHJldHVybiBzcy5zdHIoKTsKK30KKworc3RkOjpzdHJpbmcgSGlzdG9ncmFtOjphc2NpaUFydFN0cmluZyhzaXplX3QgaW5kZW50KSBjb25zdCB7CisgICAgaWYgKHRvdGFsQ291bnQoKSA9PSAwIHx8IG1CaW5TaXplIDw9IDAgfHwgbUJpbnMuc2l6ZSgpIDwgMikgeworICAgICAgICByZXR1cm4gIiI7CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtNYXJrZXIgPSAnLSc7CisgICAgLy8gT25lIGluY3JlbWVudCBpcyBjb25zaWRlcmVkIG9uZSBzdGVwIG9mIGEgYmluJ3MgaGVpZ2h0LgorICAgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGtNYXJrZXJzUGVySW5jcmVtZW50ID0gMjsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWF4SW5jcmVtZW50cyA9IDY0ICsgMTsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWF4TnVtYmVyV2lkdGggPSA3OworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBrTWFya2VycyhrTWFya2Vyc1BlckluY3JlbWVudCAqIGtNYXhJbmNyZW1lbnRzLCBrTWFya2VyKTsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcga1NwYWNlcyhrTWFya2Vyc1BlckluY3JlbWVudCAqIGtNYXhJbmNyZW1lbnRzLCAnICcpOworICAgIC8vIGdldCB0aGUgbGFzdCBuIGNoYXJhY3RlcnMgb2Ygcywgb3IgdGhlIHdob2xlIHN0cmluZyBpZiBpdCBpcyBzaG9ydGVyCisgICAgYXV0byBnZXRUYWlsID0gW10oY29uc3Qgc2l6ZV90IG4sIGNvbnN0IHN0ZDo6c3RyaW5nICZzKSB7CisgICAgICAgIHJldHVybiBzLmNfc3RyKCkgKyBzLnNpemUoKSAtIHN0ZDo6bWluKG4sIHMuc2l6ZSgpKTsKKyAgICB9OworCisgICAgLy8gU2luY2UgdG90YWxDb3VudCgpID4gMCwgbUJpbnMgaXMgbm90IGVtcHR5IGFuZCBtYXhDb3VudCA+IDAuCisgICAgY29uc3QgdW5zaWduZWQgbWF4Q291bnQgPSAqc3RkOjptYXhfZWxlbWVudChtQmlucy5iZWdpbigpLCBtQmlucy5lbmQoKSk7CisgICAgY29uc3Qgc2l6ZV90IG1heEluY3JlbWVudHMgPSBsb2cyKG1heENvdW50KSArIDE7CisKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKworICAgIC8vIE5vbi16ZXJvIGJpbnMgbXVzdCBleGlzdCBhdCB0aGlzIHBvaW50IGJlY2F1c2UgdG90YWxDb3VudCgpID4gMC4KKyAgICBzaXplX3QgZmlyc3ROb25aZXJvQmluID0gMDsKKyAgICAvLyBJZiBmaXJzdE5vblplcm9CaW4gcmVhY2hlcyBtQmlucy5zaXplKCkgLSAxLCB0aGVuIGl0IG11c3QgYmUgYSBub256ZXJvIGJpbi4KKyAgICBmb3IgKDsgZmlyc3ROb25aZXJvQmluIDwgbUJpbnMuc2l6ZSgpIC0gMSAmJiBtQmluc1tmaXJzdE5vblplcm9CaW5dID09IDA7IGZpcnN0Tm9uWmVyb0JpbisrKSB7fQorICAgIGNvbnN0IHNpemVfdCBmaXJzdEJpblRvUHJpbnQgPSBmaXJzdE5vblplcm9CaW4gPT0gMCA/IDAgOiBmaXJzdE5vblplcm9CaW4gLSAxOworCisgICAgc2l6ZV90IGxhc3ROb25aZXJvQmluID0gbUJpbnMuc2l6ZSgpIC0gMTsKKyAgICAvLyBJZiBsYXN0Tm9uWmVyb0JpbiByZWFjaGVzIDAsIHRoZW4gaXQgbXVzdCBiZSBhIG5vbnplcm8gYmluLgorICAgIGZvciAoOyBsYXN0Tm9uWmVyb0JpbiA+IDAgJiYgbUJpbnNbbGFzdE5vblplcm9CaW5dID09IDA7IGxhc3ROb25aZXJvQmluLS0pIHt9CisgICAgY29uc3Qgc2l6ZV90IGxhc3RCaW5Ub1ByaW50ID0gbGFzdE5vblplcm9CaW4gPT0gbUJpbnMuc2l6ZSgpIC0gMSA/IGxhc3ROb25aZXJvQmluCisgICAgICAgICAgICA6IGxhc3ROb25aZXJvQmluICsgMTsKKworICAgIGZvciAoc2l6ZV90IGJpbiA9IGZpcnN0QmluVG9QcmludDsgYmluIDw9IGxhc3RCaW5Ub1ByaW50OyBiaW4rKykgeworICAgICAgICBzcyA8PCBzdGQ6OnNldHcoaW5kZW50ICsga01heE51bWJlcldpZHRoKTsKKyAgICAgICAgaWYgKGJpbiA9PSAwKSB7CisgICAgICAgICAgICBzcyA8PCAiPCI7CisgICAgICAgIH0gZWxzZSBpZiAoYmluID09IG1CaW5zLnNpemUoKSAtIDEpIHsKKyAgICAgICAgICAgIHNzIDw8ICI+IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHNzIDw8IG1Mb3cgKyAoYmluIC0gMSkgKiBtQmluU2l6ZTsKKyAgICAgICAgfQorICAgICAgICBzcyA8PCAiIHwiOworICAgICAgICBzaXplX3QgaW5jcmVtZW50cyA9IDA7CisgICAgICAgIGNvbnN0IHVpbnQ2NF90IGJpbkNvdW50ID0gbUJpbnNbYmluXTsKKyAgICAgICAgaWYgKGJpbkNvdW50ID4gMCkgeworICAgICAgICAgICAgaW5jcmVtZW50cyA9IGxvZzIoYmluQ291bnQpICsgMTsKKyAgICAgICAgICAgIHNzIDw8IGdldFRhaWwoaW5jcmVtZW50cyAqIGtNYXJrZXJzUGVySW5jcmVtZW50LCBrTWFya2Vycyk7CisgICAgICAgIH0KKyAgICAgICAgc3MgPDwgZ2V0VGFpbCgobWF4SW5jcmVtZW50cyAtIGluY3JlbWVudHMgKyAxKSAqIGtNYXJrZXJzUGVySW5jcmVtZW50LCBrU3BhY2VzKQorICAgICAgICAgICAgICAgIDw8IGJpbkNvdW50IDw8ICJcbiI7CisgICAgfQorICAgIHNzIDw8ICJcbiI7CisKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIC8vIEdpdmVuIGFuIGF1ZGlvIHByb2Nlc3Npbmcgd2FrZXVwIHRpbWVzdGFtcCwgYnVja2V0cyB0aGUgdGltZSBpbnRlcnZhbAogLy8gc2luY2UgdGhlIHByZXZpb3VzIHRpbWVzdGFtcCBpbnRvIGEgaGlzdG9ncmFtLCBzZWFyY2hlcyBmb3IKIC8vIG91dGxpZXJzLCBhbmFseXplcyB0aGUgb3V0bGllciBzZXJpZXMgZm9yIHVuZXhwZWN0ZWRseQpAQCAtMjA4LDI3ICszMTcsNiBAQAogICAgIHJldHVybiBpc091dGxpZXI7CiB9CiAKLXN0YXRpYyBpbnQgd2lkdGhPZihpbnQgeCkgewotICAgIGludCB3aWR0aCA9IDA7Ci0gICAgaWYgKHggPCAwKSB7Ci0gICAgICAgIHdpZHRoKys7Ci0gICAgICAgIHggPSB4ID09IElOVF9NSU4gPyBJTlRfTUFYIDogLXg7Ci0gICAgfQotICAgIC8vIGFzc2VydCAoeCA+PSAwKQotICAgIGRvIHsKLSAgICAgICAgKyt3aWR0aDsKLSAgICAgICAgeCAvPSAxMDsKLSAgICB9IHdoaWxlICh4ID4gMCk7Ci0gICAgcmV0dXJuIHdpZHRoOwotfQotCi0vLyBjb21wdXRlcyB0aGUgY29sdW1uIHdpZHRoIHJlcXVpcmVkIGZvciBhIHNwZWNpZmljIGhpc3RvZ3JhbSB2YWx1ZQotaW5saW5lIGludCBudW1iZXJXaWR0aChkb3VibGUgbnVtYmVyLCBpbnQgbGVmdFBhZGRpbmcpIHsKLSAgICAvLyBBZGRlZCB2YWx1ZXMgYWNjb3VudCBmb3Igd2hpdGVzcGFjZXMgbmVlZGVkIGFyb3VuZCBudW1iZXJzLCBhbmQgZm9yIHRoZQotICAgIC8vIGRvdCBhbmQgZGVjaW1hbCBkaWdpdCBub3QgYWNjb3VudGVkIGZvciBieSB3aWR0aE9mCi0gICAgcmV0dXJuIHN0ZDo6bWF4KHN0ZDo6bWF4KHdpZHRoT2Yoc3RhdGljX2Nhc3Q8aW50PihudW1iZXIpKSArIDMsIDIpLCBsZWZ0UGFkZGluZyArIDEpOwotfQotCiAvLyByb3VuZHMgdmFsdWUgdG8gcHJlY2lzaW9uIGJhc2VkIG9uIGxvZy1kaXN0YW5jZSBmcm9tIG1lYW4KIF9fYXR0cmlidXRlX18oKG5vX3Nhbml0aXplKCJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIpKSkKIGlubGluZSBkb3VibGUgbG9nUm91bmQoZG91YmxlIHgsIGRvdWJsZSBtZWFuKSB7CkBAIC0yNTQsNyArMzQyLDcgQEAKIC8vIG9mIFBlcmZvcm1hbmNlQW5hbHlzaXMKIHZvaWQgUGVyZm9ybWFuY2VBbmFseXNpczo6cmVwb3J0UGVyZm9ybWFuY2UoU3RyaW5nOCAqYm9keSwgaW50IGF1dGhvciwgbG9nX2hhc2hfdCBoYXNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4SGVpZ2h0KSB7Ci0gICAgaWYgKG1IaXN0cy5lbXB0eSgpKSB7CisgICAgaWYgKG1IaXN0cy5lbXB0eSgpIHx8IGJvZHkgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC0yNzMsNjkgKzM2MSwxNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gdW5kZXJzY29yZXMgYW5kIHNwYWNlcyBsZW5ndGggY29ycmVzcG9uZHMgdG8gbWF4aW11bSB3aWR0aCBvZiBoaXN0b2dyYW0KLSAgICBzdGF0aWMgY29uc3QgaW50IGtMZW4gPSAyMDA7Ci0gICAgc3RkOjpzdHJpbmcgdW5kZXJzY29yZXMoa0xlbiwgJ18nKTsKLSAgICBzdGQ6OnN0cmluZyBzcGFjZXMoa0xlbiwgJyAnKTsKLQotICAgIGF1dG8gaXQgPSBidWNrZXRzLmJlZ2luKCk7Ci0gICAgZG91YmxlIG1heERlbHRhID0gaXQtPmZpcnN0OwotICAgIGludCBtYXhDb3VudCA9IGl0LT5zZWNvbmQ7Ci0gICAgLy8gQ29tcHV0ZSBtYXhpbXVtIHZhbHVlcwotICAgIHdoaWxlICgrK2l0ICE9IGJ1Y2tldHMuZW5kKCkpIHsKLSAgICAgICAgaWYgKGl0LT5maXJzdCA+IG1heERlbHRhKSB7Ci0gICAgICAgICAgICBtYXhEZWx0YSA9IGl0LT5maXJzdDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXQtPnNlY29uZCA+IG1heENvdW50KSB7Ci0gICAgICAgICAgICBtYXhDb3VudCA9IGl0LT5zZWNvbmQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaW50IGhlaWdodCA9IGxvZzIobWF4Q291bnQpICsgMTsgLy8gbWF4Q291bnQgPiAwLCBzYWZlIHRvIGNhbGwgbG9nMgotICAgIGNvbnN0IGludCBsZWZ0UGFkZGluZyA9IHdpZHRoT2YoMSA8PCBoZWlnaHQpOwotICAgIGNvbnN0IGludCBidWNrZXRXaWR0aCA9IG51bWJlcldpZHRoKG1heERlbHRhLCBsZWZ0UGFkZGluZyk7Ci0gICAgaW50IHNjYWxpbmdGYWN0b3IgPSAxOwotICAgIC8vIHNjYWxlIGRhdGEgaWYgaXQgZXhjZWVkcyBtYXhpbXVtIGhlaWdodAotICAgIGlmIChoZWlnaHQgPiBtYXhIZWlnaHQpIHsKLSAgICAgICAgc2NhbGluZ0ZhY3RvciA9IChoZWlnaHQgKyBtYXhIZWlnaHQpIC8gbWF4SGVpZ2h0OwotICAgICAgICBoZWlnaHQgLz0gc2NhbGluZ0ZhY3RvcjsKLSAgICB9Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyAlMy4yZiAlcyIsIGxlZnRQYWRkaW5nICsgMTEsCi0gICAgICAgICAgICAiT2NjdXJyZW5jZXMgaW4iLCAoZWxhcHNlZE1zIC8ga01zUGVyU2VjKSwgInNlY29uZHMgb2YgYXVkaW86Iik7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiUqcyVkLCAlbGxkLCAlbGxkXG4iLCBsZWZ0UGFkZGluZyArIDExLAorICAgIHN0YXRpYyBjb25zdCBpbnQgU0laRSA9IDEyODsKKyAgICBjaGFyIHRpdGxlW1NJWkVdOworICAgIHNucHJpbnRmKHRpdGxlLCBzaXplb2YodGl0bGUpLCAiXG4lcyAlMy4yZiAlc1xuJXMlZCwgJWxsZCwgJWxsZFxuIiwKKyAgICAgICAgICAgICJPY2N1cnJlbmNlcyBpbiIsIChlbGFwc2VkTXMgLyBrTXNQZXJTZWMpLCAic2Vjb25kcyBvZiBhdWRpbzoiLAogICAgICAgICAgICAgIlRocmVhZCwgaGFzaCwgc3RhcnRpbmcgdGltZXN0YW1wOiAiLCBhdXRob3IsCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxsb25nIGxvbmcgaW50PihoYXNoKSwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nIGludD4oc3RhcnRpbmdUcykpOwotICAgIC8vIHdyaXRlIGhpc3RvZ3JhbSBsYWJlbCBsaW5lIHdpdGggYnVja2V0IHZhbHVlcwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiXG4lcyIsICIgIik7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKnMiLCBsZWZ0UGFkZGluZywgIiAiKTsKLSAgICBmb3IgKGF1dG8gY29uc3QgJnggOiBidWNrZXRzKSB7Ci0gICAgICAgIGNvbnN0IGludCBjb2xXaWR0aCA9IG51bWJlcldpZHRoKHguZmlyc3QsIGxlZnRQYWRkaW5nKTsKLSAgICAgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlKmQiLCBjb2xXaWR0aCwgeC5zZWNvbmQpOwotICAgIH0KLSAgICAvLyB3cml0ZSBoaXN0b2dyYW0gYXNjaWkgYXJ0Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCJcbiVzIiwgIiAiKTsKLSAgICBmb3IgKGludCByb3cgPSBoZWlnaHQgKiBzY2FsaW5nRmFjdG9yOyByb3cgPj0gMDsgcm93IC09IHNjYWxpbmdGYWN0b3IpIHsKLSAgICAgICAgY29uc3QgaW50IHZhbHVlID0gMSA8PCByb3c7Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyIsIGxlZnRQYWRkaW5nLCBzcGFjZXMuY19zdHIoKSk7Ci0gICAgICAgIGZvciAoYXV0byBjb25zdCAmeCA6IGJ1Y2tldHMpIHsKLSAgICAgICAgICAgIGNvbnN0IGludCBjb2xXaWR0aCA9IG51bWJlcldpZHRoKHguZmlyc3QsIGxlZnRQYWRkaW5nKTsKLSAgICAgICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgY29sV2lkdGggLSAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlcy5jX3N0cigpLCB4LnNlY29uZCA8IHZhbHVlID8gIiAiIDogInwiKTsKLSAgICAgICAgfQotICAgICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOwotICAgIH0KLSAgICAvLyBwcmludCB4LWF4aXMKLSAgICBjb25zdCBpbnQgY29sdW1ucyA9IHN0YXRpY19jYXN0PGludD4oYnVja2V0cy5zaXplKCkpOwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpjIiwgbGVmdFBhZGRpbmcsICcgJyk7Ci0gICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLipzIiwgKGNvbHVtbnMgKyAxKSAqIGJ1Y2tldFdpZHRoLCB1bmRlcnNjb3Jlcy5jX3N0cigpKTsKLSAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxuJXMiLCAiICIpOworICAgICAgICAgICAgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihoYXNoKSwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPihzdGFydGluZ1RzKSk7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrTGFiZWwgPSAibXMiOwogCi0gICAgLy8gd3JpdGUgZm9vdGVyIHdpdGggYnVja2V0IGxhYmVscwotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSpzIiwgbGVmdFBhZGRpbmcsICIgIik7Ci0gICAgZm9yIChhdXRvIGNvbnN0ICZ4IDogYnVja2V0cykgewotICAgICAgICBjb25zdCBpbnQgY29sV2lkdGggPSBudW1iZXJXaWR0aCh4LmZpcnN0LCBsZWZ0UGFkZGluZyk7Ci0gICAgICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJSouKmYiLCBjb2xXaWR0aCwgMSwgeC5maXJzdCk7Ci0gICAgfQotICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJS4qcyVzIiwgYnVja2V0V2lkdGgsIHNwYWNlcy5jX3N0cigpLCAibXNcbiIpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiJXMiLAorICAgICAgICAgICAgYXVkaW9fdXRpbHNfcGxvdF9oaXN0b2dyYW0oYnVja2V0cywgdGl0bGUsIGtMYWJlbCwgbWF4SGVpZ2h0KS5jX3N0cigpKTsKIAogICAgIC8vIE5vdyByZXBvcnQgZ2xpdGNoZXMKICAgICBib2R5LT5hcHBlbmRGb3JtYXQoIlxudGltZSBlbGFwc2VkIGJldHdlZW4gZ2xpdGNoZXMgYW5kIGdsaXRjaCB0aW1lc3RhbXBzOlxuIik7CkBAIC0zNTAsNyArMzg1LDkgQEAKIC8vIHdyaXRlcyBzdW1tYXJ5IG9mIHBlcmZvcm1hbmNlIGludG8gc3BlY2lmaWVkIGZpbGUgZGVzY3JpcHRvcgogdm9pZCBkdW1wKGludCBmZCwgaW50IGluZGVudCwgUGVyZm9ybWFuY2VBbmFseXNpc01hcCAmdGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpcykgewogICAgIFN0cmluZzggYm9keTsKKyNpZmRlZiBXUklURV9UT19GSUxFCiAgICAgY29uc3QgY2hhciogY29uc3Qga0RpcmVjdG9yeSA9ICIvZGF0YS9taXNjL2F1ZGlvc2VydmVyLyI7CisjZW5kaWYKICAgICBmb3IgKGF1dG8gJiB0aHJlYWQgOiB0aHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzKSB7CiAgICAgICAgIGZvciAoYXV0byAmIGhhc2g6IHRocmVhZC5zZWNvbmQpIHsKICAgICAgICAgICAgIFBlcmZvcm1hbmNlQW5hbHlzaXMmIGN1cnIgPSBoYXNoLnNlY29uZDsKQEAgLTM2MCw5ICszOTcsMTEgQEAKICAgICAgICAgICAgICAgICBkdW1wTGluZShmZCwgaW5kZW50LCBib2R5KTsKICAgICAgICAgICAgICAgICBib2R5LmNsZWFyKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyB3cml0ZSB0byBmaWxlCisjaWZkZWYgV1JJVEVfVE9fRklMRQorICAgICAgICAgICAgLy8gd3JpdGUgdG8gZmlsZS4gRW5hYmxlIGJ5IHVuY29tbWVudGluZyBtYWNybyBhdCB0b3Agb2YgZmlsZS4KICAgICAgICAgICAgIHdyaXRlVG9GaWxlKGN1cnIubUhpc3RzLCBjdXJyLm1PdXRsaWVyRGF0YSwgY3Vyci5tUGVha1RpbWVzdGFtcHMsCiAgICAgICAgICAgICAgICAgICAgICAgICBrRGlyZWN0b3J5LCBmYWxzZSwgdGhyZWFkLmZpcnN0LCBoYXNoLmZpcnN0KTsKKyNlbmRpZgogICAgICAgICB9CiAgICAgfQogfQpAQCAtMzc0LDUgKzQxMyw0IEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCi0KIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvUmVhZGVyLmNwcCBiL21lZGlhL2xpYm5ibG9nL1JlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU1NmUzNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL1JlYWRlci5jcHAKQEAgLTAsMCArMSw0NDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk5CTG9nIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmby5oPgorI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRW50cnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZWFkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9UaW1lbGluZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIE5CTG9nIHsKKworUmVhZGVyOjpSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCisgICAgOiBtTmFtZShuYW1lKSwKKyAgICAgIG1TaGFyZWQoKC8qY29uc3QqLyBTaGFyZWQgKikgc2hhcmVkKSwgLyptSU1lbW9yeSovCisgICAgICBtRmlmbyhtU2hhcmVkICE9IE5VTEwgPworICAgICAgICBuZXcgYXVkaW9fdXRpbHNfZmlmbyhzaXplLCBzaXplb2YodWludDhfdCksCisgICAgICAgICAgICBtU2hhcmVkLT5tQnVmZmVyLCBtU2hhcmVkLT5tUmVhciwgTlVMTCAvKnRocm90dGxlc0Zyb250Ki8pIDogTlVMTCksCisgICAgICBtRmlmb1JlYWRlcihtRmlmbyAhPSBOVUxMID8gbmV3IGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyKCptRmlmbykgOiBOVUxMKQoreworfQorCitSZWFkZXI6OlJlYWRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKQorICAgIDogUmVhZGVyKGlNZW1vcnkgIT0gMCA/IChTaGFyZWQgKikgaU1lbW9yeS0+cG9pbnRlcigpIDogTlVMTCwgc2l6ZSwgbmFtZSkKK3sKKyAgICBtSU1lbW9yeSA9IGlNZW1vcnk7Cit9CisKK1JlYWRlcjo6flJlYWRlcigpCit7CisgICAgZGVsZXRlIG1GaWZvUmVhZGVyOworICAgIGRlbGV0ZSBtRmlmbzsKK30KKworLy8gQ29waWVzIGNvbnRlbnQgb2YgYSBSZWFkZXIgRklGTyBpbnRvIGl0cyBTbmFwc2hvdAorLy8gVGhlIFNuYXBzaG90IGhhcyB0aGUgc2FtZSByYXcgZGF0YSwgYnV0IHJlcHJlc2VudGVkIGFzIGEgc2VxdWVuY2Ugb2YgZW50cmllcworLy8gYW5kIGFuIEVudHJ5SXRlcmF0b3IgbWFraW5nIGl0IHBvc3NpYmxlIHRvIHByb2Nlc3MgdGhlIGRhdGEuCitzdGQ6OnVuaXF1ZV9wdHI8U25hcHNob3Q+IFJlYWRlcjo6Z2V0U25hcHNob3QoYm9vbCBmbHVzaCkKK3sKKyAgICBpZiAobUZpZm9SZWFkZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PihuZXcgU25hcHNob3QoKSk7CisgICAgfQorCisgICAgLy8gVGhpcyBlbXVsYXRlcyB0aGUgYmVoYXZpb3VyIG9mIGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyOjpyZWFkLCBidXQgd2l0aG91dCBpbmNyZW1lbnRpbmcgdGhlCisgICAgLy8gcmVhZGVyIGluZGV4LiBUaGUgaW5kZXggaXMgaW5jcmVtZW50ZWQgYWZ0ZXIgaGFuZGxpbmcgY29ycnVwdGlvbiwgdG8gYWZ0ZXIgdGhlIGxhc3QgY29tcGxldGUKKyAgICAvLyBlbnRyeSBvZiB0aGUgYnVmZmVyCisgICAgc2l6ZV90IGxvc3QgPSAwOworICAgIGF1ZGlvX3V0aWxzX2lvdmVjIGlvdmVjWzJdOworICAgIGNvbnN0IHNpemVfdCBjYXBhY2l0eSA9IG1GaWZvLT5jYXBhY2l0eSgpOworICAgIHNzaXplX3QgYXZhaWxUb1JlYWQ7CisgICAgLy8gQSBjYWxsIHRvIGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyOjpvYnRhaW4oKSBwbGFjZXMgdGhlIHJlYWQgcG9pbnRlciBvbmUgYnVmZmVyIGxlbmd0aAorICAgIC8vIGJlZm9yZSB0aGUgd3JpdGVyJ3MgcG9pbnRlciAoc2luY2UgbUZpZm9SZWFkZXIgd2FzIGNvbnN0cnVjdGVkIHdpdGggZmx1c2g9ZmFsc2UpLiBUaGUKKyAgICAvLyBkbyB3aGlsZSBsb29wIGlzIGFuIGF0dGVtcHQgdG8gcmVhZCBhbGwgb2YgdGhlIEZJRk8ncyBjb250ZW50cyByZWdhcmRsZXNzIG9mIGhvdyBiZWhpbmQKKyAgICAvLyB0aGUgcmVhZGVyIGlzIHdpdGggcmVzcGVjdCB0byB0aGUgd3JpdGVyLiBIb3dldmVyLCB0aGUgZm9sbG93aW5nIHNjaGVkdWxpbmcgc2VxdWVuY2UgaXMKKyAgICAvLyBwb3NzaWJsZSBhbmQgY2FuIGxlYWQgdG8gYSBzdGFydmF0aW9uIHNpdHVhdGlvbjoKKyAgICAvLyAtIFdyaXRlciBUMSB3cml0ZXMsIG92ZXJydW4gd2l0aCByZXNwZWN0IHRvIFJlYWRlciBUMgorICAgIC8vIC0gVDIgY2FsbHMgb2J0YWluKCkgYW5kIGdldHMgRU9WRVJGTE9XLCBUMiBwdHIgcGxhY2VkIG9uZSBidWZmZXIgc2l6ZSBiZWhpbmQgVDEgcHRyCisgICAgLy8gLSBUMSB3cml0ZSwgb3ZlcnJ1bgorICAgIC8vIC0gVDIgb2J0YWluKCksIEVPVkVSRkxPVyAoYW5kIHNvIG9uLi4uKQorICAgIC8vIFRvIGFkZHJlc3MgdGhpcyBpc3N1ZSwgd2UgbGltaXQgdGhlIG51bWJlciBvZiB0cmllcyBmb3IgdGhlIHJlYWRlciB0byBjYXRjaCB1cCB3aXRoCisgICAgLy8gdGhlIHdyaXRlci4KKyAgICBpbnQgdHJpZXMgPSAwOworICAgIHNpemVfdCBsb3N0VGVtcDsKKyAgICBkbyB7CisgICAgICAgIGF2YWlsVG9SZWFkID0gbUZpZm9SZWFkZXItPm9idGFpbihpb3ZlYywgY2FwYWNpdHksIE5VTEwgLyp0aW1lb3V0Ki8sICZsb3N0VGVtcCk7CisgICAgICAgIGxvc3QgKz0gbG9zdFRlbXA7CisgICAgfSB3aGlsZSAoYXZhaWxUb1JlYWQgPCAwIHx8ICsrdHJpZXMgPD0ga01heE9idGFpblRyaWVzKTsKKworICAgIGlmIChhdmFpbFRvUmVhZCA8PSAwKSB7CisgICAgICAgIEFMT0dXX0lGKGF2YWlsVG9SZWFkIDwgMCwgIk5CTG9nIFJlYWRlciAlcyBmYWlsZWQgdG8gY2F0Y2ggdXAgd2l0aCBXcml0ZXIiLCBtTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4obmV3IFNuYXBzaG90KCkpOworICAgIH0KKworICAgIC8vIENoYW5nZSB0byAjaWYgMSBmb3IgZGVidWdnaW5nLiBUaGlzIHN0YXRlbWVudCBpcyB1c2VmdWwgZm9yIGNoZWNraW5nIGJ1ZmZlciBmdWxsbmVzcyBsZXZlbHMKKyAgICAvLyAoYXMgc2VlbiBieSByZWFkZXIpIGFuZCBob3cgbXVjaCBkYXRhIHdhcyBsb3N0LiBJZiB5b3UgZmluZCB0aGF0IHRoZSBmdWxsbmVzcyBsZXZlbCBpcworICAgIC8vIGdldHRpbmcgY2xvc2UgdG8gZnVsbCwgb3IgdGhhdCBkYXRhIGxvc3MgaXMgaGFwcGVuaW5nIHRvIG9mdGVuLCB0aGVuIHlvdSBzaG91bGQKKyAgICAvLyBwcm9iYWJseSB0cnkgc29tZSBvZiB0aGUgZm9sbG93aW5nOgorICAgIC8vIC0gbG9nIGxlc3MgZGF0YQorICAgIC8vIC0gbG9nIGxlc3Mgb2Z0ZW4KKyAgICAvLyAtIGluY3JlYXNlIHRoZSBpbml0aWFsIHNoYXJlZCBtZW1vcnkgYWxsb2NhdGlvbiBmb3IgdGhlIGJ1ZmZlcgorI2lmIDAKKyAgICBBTE9HRCgiZ2V0U25hcHNob3QgbmFtZT0lcywgYXZhaWxUb1JlYWQ9JXpkLCBjYXBhY2l0eT0lenUsIGZ1bGxuZXNzPSUuM2YsIGxvc3Q9JXp1IiwKKyAgICAgICAgICAgIG5hbWUoKS5jX3N0cigpLCBhdmFpbFRvUmVhZCwgY2FwYWNpdHksIChkb3VibGUpYXZhaWxUb1JlYWQgLyAoZG91YmxlKWNhcGFjaXR5LCBsb3N0KTsKKyNlbmRpZgorICAgIHN0ZDo6dW5pcXVlX3B0cjxTbmFwc2hvdD4gc25hcHNob3QobmV3IFNuYXBzaG90KGF2YWlsVG9SZWFkKSk7CisgICAgbWVtY3B5KHNuYXBzaG90LT5tRGF0YSwgKGNvbnN0IGNoYXIgKikgbUZpZm8tPmJ1ZmZlcigpICsgaW92ZWNbMF0ubU9mZnNldCwgaW92ZWNbMF0ubUxlbmd0aCk7CisgICAgaWYgKGlvdmVjWzFdLm1MZW5ndGggPiAwKSB7CisgICAgICAgIG1lbWNweShzbmFwc2hvdC0+bURhdGEgKyAoaW92ZWNbMF0ubUxlbmd0aCksCisgICAgICAgICAgICAgICAgKGNvbnN0IGNoYXIgKikgbUZpZm8tPmJ1ZmZlcigpICsgaW92ZWNbMV0ubU9mZnNldCwgaW92ZWNbMV0ubUxlbmd0aCk7CisgICAgfQorCisgICAgLy8gSGFuZGxlIGNvcnJ1cHRlZCBidWZmZXIKKyAgICAvLyBQb3RlbnRpYWxseSwgYSBidWZmZXIgaGFzIGNvcnJ1cHRlZCBkYXRhIG9uIGJvdGggYmVnaW5uaW5nIChkdWUgdG8gb3ZlcmZsb3cpIGFuZCBlbmQKKyAgICAvLyAoZHVlIHRvIGluY29tcGxldGUgZm9ybWF0IGVudHJ5KS4gQnV0IGV2ZW4gaWYgdGhlIGVuZCBmb3JtYXQgZW50cnkgaXMgaW5jb21wbGV0ZSwKKyAgICAvLyBpdCBlbmRzIGluIGEgY29tcGxldGUgZW50cnkgKHdoaWNoIGlzIG5vdCBhbiBGTVRfRU5EKS4gU28gaXMgc2FmZSB0byB0cmF2ZXJzZSBiYWNrd2FyZHMuCisgICAgLy8gVE9ETzogaGFuZGxlIGNsaWVudCBjb3JydXB0aW9uIChpbiB0aGUgbWlkZGxlIG9mIGEgYnVmZmVyKQorCisgICAgY29uc3QgdWludDhfdCAqYmFjayA9IHNuYXBzaG90LT5tRGF0YSArIGF2YWlsVG9SZWFkOworICAgIGNvbnN0IHVpbnQ4X3QgKmZyb250ID0gc25hcHNob3QtPm1EYXRhOworCisgICAgLy8gRmluZCBsYXN0IEZNVF9FTkQuIDxiYWNrPiBpcyBzaXR0aW5nIG9uIGFuIGVudHJ5IHdoaWNoIG1pZ2h0IGJlIHRoZSBtaWRkbGUgb2YgYSBGb3JtYXRFbnRyeS4KKyAgICAvLyBXZSBnbyBiYWNrd2FyZHMgdW50aWwgd2UgZmluZCBhbiBFVkVOVF9GTVRfRU5ELgorICAgIGNvbnN0IHVpbnQ4X3QgKmxhc3RFbmQgPSBmaW5kTGFzdFZhbGlkRW50cnkoZnJvbnQsIGJhY2ssIGludmFsaWRFbmRUeXBlcyk7CisgICAgaWYgKGxhc3RFbmQgPT0gbnVsbHB0cikgeworICAgICAgICBzbmFwc2hvdC0+bUVuZCA9IHNuYXBzaG90LT5tQmVnaW4gPSBFbnRyeUl0ZXJhdG9yKGZyb250KTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBlbmQgb2Ygc25hcHNob3QgcG9pbnRzIHRvIGFmdGVyIGxhc3QgRk1UX0VORCBlbnRyeQorICAgICAgICBzbmFwc2hvdC0+bUVuZCA9IEVudHJ5SXRlcmF0b3IobGFzdEVuZCkubmV4dCgpOworICAgICAgICAvLyBmaW5kIGZpcnN0IEZNVF9TVEFSVAorICAgICAgICBjb25zdCB1aW50OF90ICpmaXJzdFN0YXJ0ID0gbnVsbHB0cjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqZmlyc3RTdGFydFRtcCA9IHNuYXBzaG90LT5tRW5kOworICAgICAgICB3aGlsZSAoKGZpcnN0U3RhcnRUbXAgPSBmaW5kTGFzdFZhbGlkRW50cnkoZnJvbnQsIGZpcnN0U3RhcnRUbXAsIGludmFsaWRCZWdpblR5cGVzKSkKKyAgICAgICAgICAgICAgICAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBmaXJzdFN0YXJ0ID0gZmlyc3RTdGFydFRtcDsKKyAgICAgICAgfQorICAgICAgICAvLyBmaXJzdFN0YXJ0IGlzIG51bGwgaWYgbm8gRk1UX1NUQVJUIGVudHJ5IHdhcyBmb3VuZCBiZWZvcmUgbGFzdEVuZAorICAgICAgICBpZiAoZmlyc3RTdGFydCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBzbmFwc2hvdC0+bUJlZ2luID0gc25hcHNob3QtPm1FbmQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzbmFwc2hvdC0+bUJlZ2luID0gRW50cnlJdGVyYXRvcihmaXJzdFN0YXJ0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGFkdmFuY2UgZmlmbyByZWFkZXIgaW5kZXggdG8gYWZ0ZXIgbGFzdCBlbnRyeSByZWFkLgorICAgIGlmIChmbHVzaCkgeworICAgICAgICBtRmlmb1JlYWRlci0+cmVsZWFzZShzbmFwc2hvdC0+bUVuZCAtIGZyb250KTsKKyAgICB9CisKKyAgICBzbmFwc2hvdC0+bUxvc3QgPSBsb3N0OworICAgIHJldHVybiBzbmFwc2hvdDsKK30KKworYm9vbCBSZWFkZXI6OmlzSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkgY29uc3QKK3sKKyAgICByZXR1cm4gaU1lbW9yeSAhPSAwICYmIG1JTWVtb3J5ICE9IDAgJiYgaU1lbW9yeS0+cG9pbnRlcigpID09IG1JTWVtb3J5LT5wb2ludGVyKCk7Cit9CisKKy8vIFdlIG1ha2UgYSBzZXQgb2YgdGhlIGludmFsaWQgdHlwZXMgcmF0aGVyIHRoYW4gdGhlIHZhbGlkIHR5cGVzIHdoZW4gYWxpZ25pbmcKKy8vIFNuYXBzaG90IEVudHJ5SXRlcmF0b3JzIHRvIHZhbGlkIGVudHJpZXMgZHVyaW5nIGxvZyBjb3JydXB0aW9uIGNoZWNraW5nLgorLy8gVGhpcyBpcyBkb25lIGluIG9yZGVyIHRvIGF2b2lkIHRoZSBtYWludGVuYW5jZSBvdmVyaGVhZCBvZiBhZGRpbmcgYSBuZXcgRXZlbnQKKy8vIHR5cGUgdG8gdGhlIHR3byBzZXRzIGJlbG93IHdoZW5ldmVyIGEgbmV3IEV2ZW50IHR5cGUgaXMgY3JlYXRlZCwgYXMgaXQgaXMKKy8vIHZlcnkgbGlrZWx5IHRoYXQgbmV3IHR5cGVzIGFkZGVkIHdpbGwgYmUgdmFsaWQgdHlwZXMuCisvLyBDdXJyZW50bHksIGludmFsaWRCZWdpblR5cGVzIGFuZCBpbnZhbGlkRW5kVHlwZXMgYXJlIHVzZWQgdG8gaGFuZGxlIHRoZSBzcGVjaWFsCisvLyBjYXNlIG9mIGEgRm9ybWF0IEVudHJ5LCB3aGljaCBjb25zaXN0cyBvZiBhIHZhcmlhYmxlIG51bWJlciBvZiBzaW1wbGUgbG9nIGVudHJpZXMuCisvLyBJZiBhIG5ldyBFdmVudCBpcyBhZGRlZCB0aGF0IGNvbnNpc3RzIG9mIGEgdmFyaWFibGUgbnVtYmVyIG9mIHNpbXBsZSBsb2cgZW50cmllcywKKy8vIHRoZW4gdGhlc2Ugc2V0cyBuZWVkIHRvIGJlIHVwZGF0ZWQuCisKKy8vIFdlIHdhbnQgdGhlIGJlZ2lubmluZyBvZiBhIFNuYXBzaG90IHRvIHBvaW50IHRvIGFuIGVudHJ5IHRoYXQgaXMgbm90IGluCisvLyB0aGUgbWlkZGxlIG9mIGEgZm9ybWF0dGVkIGVudHJ5IGFuZCBub3QgYW4gRk1UX0VORC4KK2NvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxFdmVudD4gUmVhZGVyOjppbnZhbGlkQmVnaW5UeXBlcyB7CisgICAgRVZFTlRfRk1UX0FVVEhPUiwKKyAgICBFVkVOVF9GTVRfRU5ELAorICAgIEVWRU5UX0ZNVF9GTE9BVCwKKyAgICBFVkVOVF9GTVRfSEFTSCwKKyAgICBFVkVOVF9GTVRfSU5URUdFUiwKKyAgICBFVkVOVF9GTVRfUElELAorICAgIEVWRU5UX0ZNVF9TVFJJTkcsCisgICAgRVZFTlRfRk1UX1RJTUVTVEFNUCwKK307CisKKy8vIFdlIHdhbnQgdGhlIGVuZCBvZiBhIFNuYXBzaG90IHRvIHBvaW50IHRvIGFuIGVudHJ5IHRoYXQgaXMgbm90IGluCisvLyB0aGUgbWlkZGxlIG9mIGEgZm9ybWF0dGVkIGVudHJ5IGFuZCBub3QgYSBGTVRfU1RBUlQuCitjb25zdCBzdGQ6OnVub3JkZXJlZF9zZXQ8RXZlbnQ+IFJlYWRlcjo6aW52YWxpZEVuZFR5cGVzIHsKKyAgICBFVkVOVF9GTVRfQVVUSE9SLAorICAgIEVWRU5UX0ZNVF9GTE9BVCwKKyAgICBFVkVOVF9GTVRfSEFTSCwKKyAgICBFVkVOVF9GTVRfSU5URUdFUiwKKyAgICBFVkVOVF9GTVRfUElELAorICAgIEVWRU5UX0ZNVF9TVEFSVCwKKyAgICBFVkVOVF9GTVRfU1RSSU5HLAorICAgIEVWRU5UX0ZNVF9USU1FU1RBTVAsCit9OworCitjb25zdCB1aW50OF90ICpSZWFkZXI6OmZpbmRMYXN0VmFsaWRFbnRyeShjb25zdCB1aW50OF90ICpmcm9udCwgY29uc3QgdWludDhfdCAqYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxFdmVudD4gJmludmFsaWRUeXBlcykgeworICAgIGlmIChmcm9udCA9PSBudWxscHRyIHx8IGJhY2sgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgd2hpbGUgKGJhY2sgKyBFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0ID49IGZyb250KSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnByZXYgPSBiYWNrIC0gYmFja1tFbnRyeTo6a1ByZXZpb3VzTGVuZ3RoT2Zmc2V0XSAtIEVudHJ5OjprT3ZlcmhlYWQ7CisgICAgICAgIGNvbnN0IEV2ZW50IHR5cGUgPSAoY29uc3QgRXZlbnQpcHJldltvZmZzZXRvZihlbnRyeSwgdHlwZSldOworICAgICAgICBpZiAocHJldiA8IGZyb250CisgICAgICAgICAgICAgICAgfHwgcHJldiArIHByZXZbb2Zmc2V0b2YoZW50cnksIGxlbmd0aCldICsgRW50cnk6OmtPdmVyaGVhZCAhPSBiYWNrCisgICAgICAgICAgICAgICAgfHwgdHlwZSA8PSBFVkVOVF9SRVNFUlZFRCB8fCB0eXBlID49IEVWRU5UX1VQUEVSX0JPVU5EKSB7CisgICAgICAgICAgICAvLyBwcmV2IHBvaW50cyB0byBhbiBvdXQgb2YgbGltaXRzIG9yIGluY29uc2lzdGVudCBlbnRyeQorICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgLy8gaWYgaW52YWxpZFR5cGVzIGRvZXMgbm90IGNvbnRhaW4gdGhlIHR5cGUsIHRoZW4gdGhlIHR5cGUgaXMgdmFsaWQuCisgICAgICAgIGlmIChpbnZhbGlkVHlwZXMuZmluZCh0eXBlKSA9PSBpbnZhbGlkVHlwZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBwcmV2OworICAgICAgICB9CisgICAgICAgIGJhY2sgPSBwcmV2OworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsgLy8gbm8gZW50cnkgZm91bmQKK30KKworLy8gVE9ETyBmb3IgZnV0dXJlIGNvbXBhdGliaWxpdHksIHdvdWxkIHByZWZlciB0byBoYXZlIGEgZHVtcCgpIGdvIHRvIHN0cmluZywgYW5kIHRoZW4gZ28KKy8vIHRvIGZkIG9ubHkgd2hlbiBpbnZva2VkIHRocm91Z2ggYmluZGVyLgordm9pZCBEdW1wUmVhZGVyOjpkdW1wKGludCBmZCwgc2l6ZV90IGluZGVudCkKK3sKKyAgICBpZiAoZmQgPCAwKSByZXR1cm47CisgICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBzbmFwc2hvdCA9IGdldFNuYXBzaG90KGZhbHNlIC8qZmx1c2gqLyk7CisgICAgaWYgKHNuYXBzaG90ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTdHJpbmc4IHRpbWVzdGFtcCwgYm9keTsKKworICAgIC8vIFRPRE8gYWxsIGxvZ2dlZCB0eXBlcyBzaG91bGQgaGF2ZSBhIHByaW50YWJsZSBmb3JtYXQuCisgICAgLy8gVE9ETyBjYW4gd2UgbWFrZSB0aGUgcHJpbnRpbmcgZ2VuZXJpYz8KKyAgICBmb3IgKEVudHJ5SXRlcmF0b3IgaXQgPSBzbmFwc2hvdC0+YmVnaW4oKTsgaXQgIT0gc25hcHNob3QtPmVuZCgpOyArK2l0KSB7CisgICAgICAgIHN3aXRjaCAoaXQtPnR5cGUpIHsKKyAgICAgICAgY2FzZSBFVkVOVF9GTVRfU1RBUlQ6CisgICAgICAgICAgICBpdCA9IGhhbmRsZUZvcm1hdChGb3JtYXRFbnRyeShpdCksICZ0aW1lc3RhbXAsICZib2R5KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX0xBVEVOQ1k6IHsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSBpdC5wYXlsb2FkPGRvdWJsZT4oKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJFVkVOVF9MQVRFTkNZLCUuM2YiLCBsYXRlbmN5TXMpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX09WRVJSVU46IHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdHMgPSBpdC5wYXlsb2FkPGludDY0X3Q+KCk7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiRVZFTlRfT1ZFUlJVTiwlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0cykpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1RIUkVBRF9JTkZPOiB7CisgICAgICAgICAgICBjb25zdCB0aHJlYWRfaW5mb190IGluZm8gPSBpdC5wYXlsb2FkPHRocmVhZF9pbmZvX3Q+KCk7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiRVZFTlRfVEhSRUFEX0lORk8sJWQsJXMiLCBzdGF0aWNfY2FzdDxpbnQ+KGluZm8uaWQpLAorICAgICAgICAgICAgICAgICAgICB0aHJlYWRUeXBlVG9TdHJpbmcoaW5mby50eXBlKSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgRVZFTlRfVU5ERVJSVU46IHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgdHMgPSBpdC5wYXlsb2FkPGludDY0X3Q+KCk7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiRVZFTlRfVU5ERVJSVU4sJWxsZCIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4odHMpKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9XQVJNVVBfVElNRTogeworICAgICAgICAgICAgY29uc3QgZG91YmxlIHRpbWVNcyA9IGl0LnBheWxvYWQ8ZG91YmxlPigpOworICAgICAgICAgICAgYm9keS5hcHBlbmRGb3JtYXQoIkVWRU5UX1dBUk1VUF9USU1FLCUuM2YiLCB0aW1lTXMpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX1dPUktfVElNRTogeworICAgICAgICAgICAgY29uc3QgaW50NjRfdCBtb25vdG9uaWNOcyA9IGl0LnBheWxvYWQ8aW50NjRfdD4oKTsKKyAgICAgICAgICAgIGJvZHkuYXBwZW5kRm9ybWF0KCJFVkVOVF9XT1JLX1RJTUUsJWxsZCIsIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4obW9ub3RvbmljTnMpKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBFVkVOVF9USFJFQURfUEFSQU1TOiB7CisgICAgICAgICAgICBjb25zdCB0aHJlYWRfcGFyYW1zX3QgcGFyYW1zID0gaXQucGF5bG9hZDx0aHJlYWRfcGFyYW1zX3Q+KCk7CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgiRVZFTlRfVEhSRUFEX1BBUkFNUywlenUsJXUiLCBwYXJhbXMuZnJhbWVDb3VudCwgcGFyYW1zLnNhbXBsZVJhdGUpOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIEVWRU5UX0ZNVF9FTkQ6CisgICAgICAgIGNhc2UgRVZFTlRfUkVTRVJWRUQ6CisgICAgICAgIGNhc2UgRVZFTlRfVVBQRVJfQk9VTkQ6CisgICAgICAgICAgICBib2R5LmFwcGVuZEZvcm1hdCgid2FybmluZzogdW5leHBlY3RlZCBldmVudCAlZCIsIGl0LT50eXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFib2R5LmlzRW1wdHkoKSkgeworICAgICAgICAgICAgZHByaW50ZihmZCwgIiUuKnMlcyAlc1xuIiwgKGludClpbmRlbnQsICIiLCB0aW1lc3RhbXAuc3RyaW5nKCksIGJvZHkuc3RyaW5nKCkpOworICAgICAgICAgICAgYm9keS5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIHRpbWVzdGFtcC5jbGVhcigpOworICAgIH0KK30KKworRW50cnlJdGVyYXRvciBEdW1wUmVhZGVyOjpoYW5kbGVGb3JtYXQoY29uc3QgRm9ybWF0RW50cnkgJmZtdEVudHJ5LAorICAgICAgICBTdHJpbmc4ICp0aW1lc3RhbXAsIFN0cmluZzggKmJvZHkpCit7CisgICAgU3RyaW5nOCB0aW1lc3RhbXBMb2NhbDsKKyAgICBTdHJpbmc4IGJvZHlMb2NhbDsKKyAgICBpZiAodGltZXN0YW1wID09IG51bGxwdHIpIHsKKyAgICAgICAgdGltZXN0YW1wID0gJnRpbWVzdGFtcExvY2FsOworICAgIH0KKyAgICBpZiAoYm9keSA9PSBudWxscHRyKSB7CisgICAgICAgIGJvZHkgPSAmYm9keUxvY2FsOworICAgIH0KKworICAgIC8vIGxvZyB0aW1lc3RhbXAKKyAgICBjb25zdCBpbnQ2NF90IHRzID0gZm10RW50cnkudGltZXN0YW1wKCk7CisgICAgdGltZXN0YW1wLT5jbGVhcigpOworICAgIHRpbWVzdGFtcC0+YXBwZW5kRm9ybWF0KCJbJWQuJTAzZF0iLCAoaW50KSAodHMgLyAoMTAwMCAqIDEwMDAgKiAxMDAwKSksCisgICAgICAgICAgICAgICAgICAgIChpbnQpICgodHMgLyAoMTAwMCAqIDEwMDApKSAlIDEwMDApKTsKKworICAgIC8vIGxvZyB1bmlxdWUgaGFzaAorICAgIGxvZ19oYXNoX3QgaGFzaCA9IGZtdEVudHJ5Lmhhc2goKTsKKyAgICAvLyBwcmludCBvbmx5IGxvd2VyIDE2Yml0IG9mIGhhc2ggYXMgaGV4IGFuZCBsaW5lIGFzIGludCB0byByZWR1Y2Ugc3BhbSBpbiB0aGUgbG9nCisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCIlLjRYLSVkICIsIChpbnQpKGhhc2ggPj4gMTYpICYgMHhGRkZGLCAoaW50KSBoYXNoICYgMHhGRkZGKTsKKworICAgIC8vIGxvZyBhdXRob3IgKGlmIHByZXNlbnQpCisgICAgaGFuZGxlQXV0aG9yKGZtdEVudHJ5LCBib2R5KTsKKworICAgIC8vIGxvZyBzdHJpbmcKKyAgICBFbnRyeUl0ZXJhdG9yIGFyZyA9IGZtdEVudHJ5LmFyZ3MoKTsKKworICAgIGNvbnN0IGNoYXIqIGZtdCA9IGZtdEVudHJ5LmZvcm1hdFN0cmluZygpOworICAgIHNpemVfdCBmbXRfbGVuZ3RoID0gZm10RW50cnkuZm9ybWF0U3RyaW5nTGVuZ3RoKCk7CisKKyAgICBmb3IgKHNpemVfdCBmbXRfb2Zmc2V0ID0gMDsgZm10X29mZnNldCA8IGZtdF9sZW5ndGg7ICsrZm10X29mZnNldCkgeworICAgICAgICBpZiAoZm10W2ZtdF9vZmZzZXRdICE9ICclJykgeworICAgICAgICAgICAgYm9keS0+YXBwZW5kKCZmbXRbZm10X29mZnNldF0sIDEpOyAvLyBUT0RPIG9wdGltaXplIHRvIHdyaXRlIGNvbnNlY3V0aXZlIHN0cmluZ3MgYXQgb25jZQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2FzZSAiJSUiIgorICAgICAgICBpZiAoZm10WysrZm10X29mZnNldF0gPT0gJyUnKSB7CisgICAgICAgICAgICBib2R5LT5hcHBlbmQoIiUiKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIC8vIGNhc2UgIiVcMCIKKyAgICAgICAgaWYgKGZtdF9vZmZzZXQgPT0gZm10X2xlbmd0aCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBFdmVudCBldmVudCA9IChFdmVudCkgYXJnLT50eXBlOworICAgICAgICBzaXplX3QgbGVuZ3RoID0gYXJnLT5sZW5ndGg7CisKKyAgICAgICAgLy8gVE9ETyBjaGVjayBsZW5ndGggZm9yIGV2ZW50IHR5cGUgaXMgY29ycmVjdAorCisgICAgICAgIGlmIChldmVudCA9PSBFVkVOVF9GTVRfRU5EKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCBtb3JlIGNvbXBsZXggZm9ybWF0dGluZyBzdWNoIGFzICUuM2YKKyAgICAgICAgY29uc3QgdWludDhfdCAqZGF0dW0gPSBhcmctPmRhdGE7IC8vIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgZXZlbnQgYXJncworICAgICAgICBzd2l0Y2goZm10W2ZtdF9vZmZzZXRdKQorICAgICAgICB7CisgICAgICAgIGNhc2UgJ3MnOiAvLyBzdHJpbmcKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZNVF9TVFJJTkcsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHN0cmluZyBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYm9keS0+YXBwZW5kKChjb25zdCBjaGFyKikgZGF0dW0sIGxlbmd0aCk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICd0JzogLy8gdGltZXN0YW1wCisgICAgICAgICAgICBBTE9HV19JRihldmVudCAhPSBFVkVOVF9GTVRfVElNRVNUQU1QLAorICAgICAgICAgICAgICAgICJOQkxvZyBSZWFkZXIgaW5jb21wYXRpYmxlIGV2ZW50IGZvciB0aW1lc3RhbXAgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGFwcGVuZFRpbWVzdGFtcChib2R5LCBkYXR1bSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdkJzogLy8gaW50ZWdlcgorICAgICAgICAgICAgQUxPR1dfSUYoZXZlbnQgIT0gRVZFTlRfRk1UX0lOVEVHRVIsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIGludGVnZXIgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGFwcGVuZEludChib2R5LCBkYXR1bSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdmJzogLy8gZmxvYXQKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZNVF9GTE9BVCwKKyAgICAgICAgICAgICAgICAiTkJMb2cgUmVhZGVyIGluY29tcGF0aWJsZSBldmVudCBmb3IgZmxvYXQgc3BlY2lmaWVyOiAlZCIsIGV2ZW50KTsKKyAgICAgICAgICAgIGFwcGVuZEZsb2F0KGJvZHksIGRhdHVtKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ3AnOiAvLyBwaWQKKyAgICAgICAgICAgIEFMT0dXX0lGKGV2ZW50ICE9IEVWRU5UX0ZNVF9QSUQsCisgICAgICAgICAgICAgICAgIk5CTG9nIFJlYWRlciBpbmNvbXBhdGlibGUgZXZlbnQgZm9yIHBpZCBzcGVjaWZpZXI6ICVkIiwgZXZlbnQpOworICAgICAgICAgICAgYXBwZW5kUElEKGJvZHksIGRhdHVtLCBsZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dXKCJOQkxvZyBSZWFkZXIgZW5jb3VudGVyZWQgdW5rbm93biBjaGFyYWN0ZXIgJWMiLCBmbXRbZm10X29mZnNldF0pOworICAgICAgICB9CisgICAgICAgICsrYXJnOworICAgIH0KKyAgICBBTE9HV19JRihhcmctPnR5cGUgIT0gRVZFTlRfRk1UX0VORCwgIkV4cGVjdGVkIGVuZCBvZiBmb3JtYXQsIGdvdCAlZCIsIGFyZy0+dHlwZSk7CisgICAgcmV0dXJuIGFyZzsKK30KKwordm9pZCBEdW1wUmVhZGVyOjphcHBlbmRJbnQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKyAgICBpZiAoYm9keSA9PSBudWxscHRyIHx8IGRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vaW50IHggPSAqKChpbnQqKSBkYXRhKTsKKyAgICBpbnQgeDsKKyAgICBtZW1jcHkoJngsIGRhdGEsIHNpemVvZih4KSk7CisgICAgYm9keS0+YXBwZW5kRm9ybWF0KCI8JWQ+IiwgeCk7Cit9CisKK3ZvaWQgRHVtcFJlYWRlcjo6YXBwZW5kRmxvYXQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSkKK3sKKyAgICBpZiAoYm9keSA9PSBudWxscHRyIHx8IGRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZsb2F0IGY7CisgICAgbWVtY3B5KCZmLCBkYXRhLCBzaXplb2YoZikpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPCVmPiIsIGYpOworfQorCit2b2lkIER1bXBSZWFkZXI6OmFwcGVuZFBJRChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkKiBkYXRhLCBzaXplX3QgbGVuZ3RoKQoreworICAgIGlmIChib2R5ID09IG51bGxwdHIgfHwgZGF0YSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgcGlkX3QgaWQgPSAqKChwaWRfdCopIGRhdGEpOworICAgIGNoYXIgKiBuYW1lID0gJigoY2hhciopIGRhdGEpW3NpemVvZihwaWRfdCldOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiPFBJRDogJWQsIG5hbWU6ICUuKnM+IiwgaWQsIChpbnQpIChsZW5ndGggLSBzaXplb2YocGlkX3QpKSwgbmFtZSk7Cit9CisKK3ZvaWQgRHVtcFJlYWRlcjo6YXBwZW5kVGltZXN0YW1wKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEpCit7CisgICAgaWYgKGJvZHkgPT0gbnVsbHB0ciB8fCBkYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQ2NF90IHRzOworICAgIG1lbWNweSgmdHMsIGRhdGEsIHNpemVvZih0cykpOworICAgIGJvZHktPmFwcGVuZEZvcm1hdCgiWyVkLiUwM2RdIiwgKGludCkgKHRzIC8gKDEwMDAgKiAxMDAwICogMTAwMCkpLAorICAgICAgICAgICAgICAgICAgICAoaW50KSAoKHRzIC8gKDEwMDAgKiAxMDAwKSkgJSAxMDAwKSk7Cit9CisKK1N0cmluZzggRHVtcFJlYWRlcjo6YnVmZmVyRHVtcChjb25zdCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBzaXplKQoreworICAgIFN0cmluZzggc3RyOworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gc3RyOworICAgIH0KKyAgICBzdHIuYXBwZW5kKCJbICIpOworICAgIGZvcihzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgc3RyLmFwcGVuZEZvcm1hdCgiJWQgIiwgYnVmZmVyW2ldKTsKKyAgICB9CisgICAgc3RyLmFwcGVuZCgiXSIpOworICAgIHJldHVybiBzdHI7Cit9CisKK1N0cmluZzggRHVtcFJlYWRlcjo6YnVmZmVyRHVtcChjb25zdCBFbnRyeUl0ZXJhdG9yICZpdCkKK3sKKyAgICByZXR1cm4gYnVmZmVyRHVtcChpdCwgaXQtPmxlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWQpOworfQorCit9ICAgLy8gbmFtZXNwYWNlIE5CTG9nCit9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmNwcCBiL21lZGlhL2xpYm5ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmNwcAppbmRleCA4MjdlNzMxLi5iMDUwYjgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5jcHAKKysrIGIvbWVkaWEvbGlibmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuY3BwCkBAIC0xNSw5ICsxNSwxMSBAQAogICovCiAKICNkZWZpbmUgTE9HX1RBRyAiUmVwb3J0UGVyZm9ybWFuY2UiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxmc3RyZWFtPgogI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDxxdWV1ZT4KICNpbmNsdWRlIDxzdGRhcmcuaD4KICNpbmNsdWRlIDxzdGRpbnQuaD4KQEAgLTI3LDIzICsyOSwxOTUgQEAKICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KKyNpbmNsdWRlIDxqc29uL2pzb24uaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQogbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKIAorc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxKc29uOjpWYWx1ZT4gZHVtcFRvSnNvbihjb25zdCBQZXJmb3JtYW5jZURhdGEmIGRhdGEpCit7CisgICAgc3RkOjp1bmlxdWVfcHRyPEpzb246OlZhbHVlPiByb290UHRyID0gc3RkOjptYWtlX3VuaXF1ZTxKc29uOjpWYWx1ZT4oSnNvbjo6b2JqZWN0VmFsdWUpOworICAgIEpzb246OlZhbHVlJiByb290ID0gKnJvb3RQdHI7CisgICAgcm9vdFsiaW9IYW5kbGUiXSA9IGRhdGEudGhyZWFkSW5mby5pZDsKKyAgICByb290WyJ0eXBlIl0gPSBOQkxvZzo6dGhyZWFkVHlwZVRvU3RyaW5nKGRhdGEudGhyZWFkSW5mby50eXBlKTsKKyAgICByb290WyJmcmFtZUNvdW50Il0gPSAoSnNvbjo6VmFsdWU6OkludClkYXRhLnRocmVhZFBhcmFtcy5mcmFtZUNvdW50OworICAgIHJvb3RbInNhbXBsZVJhdGUiXSA9IChKc29uOjpWYWx1ZTo6SW50KWRhdGEudGhyZWFkUGFyYW1zLnNhbXBsZVJhdGU7CisgICAgcm9vdFsid29ya01zSGlzdCJdID0gZGF0YS53b3JrSGlzdC50b1N0cmluZygpOworICAgIHJvb3RbImxhdGVuY3lNc0hpc3QiXSA9IGRhdGEubGF0ZW5jeUhpc3QudG9TdHJpbmcoKTsKKyAgICByb290WyJ3YXJtdXBNc0hpc3QiXSA9IGRhdGEud2FybXVwSGlzdC50b1N0cmluZygpOworICAgIHJvb3RbInVuZGVycnVucyJdID0gKEpzb246OlZhbHVlOjpJbnQ2NClkYXRhLnVuZGVycnVuczsKKyAgICByb290WyJvdmVycnVucyJdID0gKEpzb246OlZhbHVlOjpJbnQ2NClkYXRhLm92ZXJydW5zOworICAgIHJvb3RbImFjdGl2ZU1zIl0gPSAoSnNvbjo6VmFsdWU6OkludDY0KW5zMm1zKGRhdGEuYWN0aXZlKTsKKyAgICByb290WyJkdXJhdGlvbk1zIl0gPSAoSnNvbjo6VmFsdWU6OkludDY0KW5zMm1zKHN5c3RlbVRpbWUoKSAtIGRhdGEuc3RhcnQpOworICAgIHJldHVybiByb290UHRyOworfQorCitzdGF0aWMgc3RkOjpzdHJpbmcgZHVtcEhpc3RvZ3JhbXNUb1N0cmluZyhjb25zdCBQZXJmb3JtYW5jZURhdGEmIGRhdGEpCit7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgc3MgPDwgIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKKyAgICBzcyA8PCAiVGhyZWFkIHR5cGU9IiA8PCBOQkxvZzo6dGhyZWFkVHlwZVRvU3RyaW5nKGRhdGEudGhyZWFkSW5mby50eXBlKQorICAgICAgICAgICAgPDwgIiBoYW5kbGU9IiA8PCBkYXRhLnRocmVhZEluZm8uaWQKKyAgICAgICAgICAgIDw8ICIgc2FtcGxlUmF0ZT0iIDw8IGRhdGEudGhyZWFkUGFyYW1zLnNhbXBsZVJhdGUKKyAgICAgICAgICAgIDw8ICIgZnJhbWVDb3VudD0iIDw8IGRhdGEudGhyZWFkUGFyYW1zLmZyYW1lQ291bnQgPDwgIlxuIjsKKyAgICBzcyA8PCAiICBUaHJlYWQgd29yayB0aW1lcyBpbiBtczpcbiIgPDwgZGF0YS53b3JrSGlzdC5hc2NpaUFydFN0cmluZyg0IC8qaW5kZW50Ki8pOworICAgIHNzIDw8ICIgIFRocmVhZCBsYXRlbmNpZXMgaW4gbXM6XG4iIDw8IGRhdGEubGF0ZW5jeUhpc3QuYXNjaWlBcnRTdHJpbmcoNCAvKmluZGVudCovKTsKKyAgICBzcyA8PCAiICBUaHJlYWQgd2FybXVwIHRpbWVzIGluIG1zOlxuIiA8PCBkYXRhLndhcm11cEhpc3QuYXNjaWlBcnRTdHJpbmcoNCAvKmluZGVudCovKTsKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgZHVtcEpzb24oaW50IGZkLCBjb25zdCBzdGQ6Om1hcDxpbnQsIFBlcmZvcm1hbmNlRGF0YT4mIHRocmVhZERhdGFNYXApCit7CisgICAgaWYgKGZkIDwgMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgSnNvbjo6VmFsdWUgcm9vdChKc29uOjphcnJheVZhbHVlKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0ZW0gOiB0aHJlYWREYXRhTWFwKSB7CisgICAgICAgIGNvbnN0IFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGEmIGRhdGEgPSBpdGVtLnNlY29uZDsKKyAgICAgICAgLy8gU2tpcCB0aHJlYWRzIHRoYXQgZG8gbm90IGhhdmUgcGVyZm9ybWFuY2UgZGF0YSByZWNvcmRlZCB5ZXQuCisgICAgICAgIGlmIChkYXRhLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxKc29uOjpWYWx1ZT4gZGF0YUpzb24gPSBSZXBvcnRQZXJmb3JtYW5jZTo6ZHVtcFRvSnNvbihkYXRhKTsKKyAgICAgICAgaWYgKGRhdGFKc29uID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgICgqZGF0YUpzb24pWyJ0aHJlYWROdW0iXSA9IGl0ZW0uZmlyc3Q7CisgICAgICAgIHJvb3QuYXBwZW5kKCpkYXRhSnNvbik7CisgICAgfQorICAgIEpzb246OlN0eWxlZFdyaXRlciB3cml0ZXI7CisgICAgc3RkOjpzdHJpbmcgcm9vdFN0ciA9IHdyaXRlci53cml0ZShyb290KTsKKyAgICB3cml0ZShmZCwgcm9vdFN0ci5jX3N0cigpLCByb290U3RyLnNpemUoKSk7Cit9CisKK3ZvaWQgZHVtcFBsb3RzKGludCBmZCwgY29uc3Qgc3RkOjptYXA8aW50LCBQZXJmb3JtYW5jZURhdGE+JiB0aHJlYWREYXRhTWFwKQoreworICAgIGlmIChmZCA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byAmaXRlbSA6IHRocmVhZERhdGFNYXApIHsKKyAgICAgICAgY29uc3QgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlRGF0YSYgZGF0YSA9IGl0ZW0uc2Vjb25kOworICAgICAgICBpZiAoZGF0YS5lbXB0eSgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzdGQ6OnN0cmluZyBoaXN0cyA9IFJlcG9ydFBlcmZvcm1hbmNlOjpkdW1wSGlzdG9ncmFtc1RvU3RyaW5nKGRhdGEpOworICAgICAgICB3cml0ZShmZCwgaGlzdHMuY19zdHIoKSwgaGlzdHMuc2l6ZSgpKTsKKyAgICB9Cit9CisKK3N0YXRpYyBzdGQ6OnN0cmluZyBkdW1wUmV0cm9TdHJpbmcoY29uc3QgUGVyZm9ybWFuY2VEYXRhJiBkYXRhLCBpbnQ2NF90IG5vdykKK3sKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgICBzcyA8PCBOQkxvZzo6dGhyZWFkVHlwZVRvU3RyaW5nKGRhdGEudGhyZWFkSW5mby50eXBlKSA8PCAiLCIgPDwgZGF0YS50aHJlYWRJbmZvLmlkIDw8ICJcbiI7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVtIDogZGF0YS5zbmFwc2hvdHMpIHsKKyAgICAgICAgLy8gVE9ETyB1c2UgYW4gZW51bSB0byBzdHJpbmcgY29udmVyc2lvbiBtZXRob2QuIE9uZSBnb29kIGlkZWE6CisgICAgICAgIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8yMzgxNTcKKyAgICAgICAgaWYgKGl0ZW0uZmlyc3QgPT0gTkJMb2c6OkVWRU5UX1VOREVSUlVOKSB7CisgICAgICAgICAgICBzcyA8PCAiRVZFTlRfVU5ERVJSVU4sIjsKKyAgICAgICAgfSBlbHNlIGlmIChpdGVtLmZpcnN0ID09IE5CTG9nOjpFVkVOVF9PVkVSUlVOKSB7CisgICAgICAgICAgICBzcyA8PCAiRVZFTlRfT1ZFUlJVTiwiOworICAgICAgICB9CisgICAgICAgIHNzIDw8IG5vdyAtIGl0ZW0uc2Vjb25kIDw8ICJcbiI7CisgICAgfQorICAgIHNzIDw8ICJcbiI7CisgICAgcmV0dXJuIHNzLnN0cigpOworfQorCit2b2lkIGR1bXBSZXRybyhpbnQgZmQsIGNvbnN0IHN0ZDo6bWFwPGludCwgUGVyZm9ybWFuY2VEYXRhPiYgdGhyZWFkRGF0YU1hcCkKK3sKKyAgICBpZiAoZmQgPCAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBjb25zdCBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZW0gOiB0aHJlYWREYXRhTWFwKSB7CisgICAgICAgIGNvbnN0IFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZURhdGEmIGRhdGEgPSBpdGVtLnNlY29uZDsKKyAgICAgICAgaWYgKGRhdGEuc25hcHNob3RzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHJldHJvU3RyID0gZHVtcFJldHJvU3RyaW5nKGRhdGEsIG5vdyk7CisgICAgICAgIHdyaXRlKGZkLCByZXRyb1N0ci5jX3N0cigpLCByZXRyb1N0ci5zaXplKCkpOworICAgIH0KK30KKworYm9vbCBzZW5kVG9NZWRpYU1ldHJpY3MoY29uc3QgUGVyZm9ybWFuY2VEYXRhJiBkYXRhKQoreworICAgIC8vIFNlZSBkb2N1bWVudGF0aW9uIGZvciB0aGVzZSBtZXRyaWNzIGhlcmU6CisgICAgLy8gZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMTEtLTZkeU9YVk9wYWNZUUxaaWFPWTVRVnRRalV5cU54MnpUOWNDekxLWUUvZWRpdD91c3A9c2hhcmluZworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkVHlwZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQudHlwZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRGcmFtZUNvdW50W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5mcmFtZWNvdW50IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZFNhbXBsZVJhdGVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLnNhbXBsZXJhdGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrVGhyZWFkV29ya0hpc3RbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLndvcmtNcy5oaXN0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZExhdGVuY3lIaXN0W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5sYXRlbmN5TXMuaGlzdCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRXYXJtdXBIaXN0W10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC53YXJtdXBNcy5oaXN0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZFVuZGVycnVuc1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW90aHJlYWQudW5kZXJydW5zIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZE92ZXJydW5zW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5vdmVycnVucyI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGtUaHJlYWRBY3RpdmVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLmFjdGl2ZU1zIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga1RocmVhZER1cmF0aW9uW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC5kdXJhdGlvbk1zIjsKKworICAgIC8vIEN1cnJlbnRseSwgd2Ugb25seSBhbGxvdyBGYXN0TWl4ZXIgdGhyZWFkIGRhdGEgdG8gYmUgc2VudCB0byBNZWRpYSBNZXRyaWNzLgorICAgIGlmIChkYXRhLnRocmVhZEluZm8udHlwZSAhPSBOQkxvZzo6RkFTVE1JWEVSKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFBbmFseXRpY3NJdGVtPiBpdGVtKE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKCJhdWRpb3RocmVhZCIpKTsKKworICAgIGNvbnN0IEhpc3RvZ3JhbSAmd29ya0hpc3QgPSBkYXRhLndvcmtIaXN0OworICAgIGlmICh3b3JrSGlzdC50b3RhbENvdW50KCkgPiAwKSB7CisgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa1RocmVhZFdvcmtIaXN0LCB3b3JrSGlzdC50b1N0cmluZygpLmNfc3RyKCkpOworICAgIH0KKworICAgIGNvbnN0IEhpc3RvZ3JhbSAmbGF0ZW5jeUhpc3QgPSBkYXRhLmxhdGVuY3lIaXN0OworICAgIGlmIChsYXRlbmN5SGlzdC50b3RhbENvdW50KCkgPiAwKSB7CisgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa1RocmVhZExhdGVuY3lIaXN0LCBsYXRlbmN5SGlzdC50b1N0cmluZygpLmNfc3RyKCkpOworICAgIH0KKworICAgIGNvbnN0IEhpc3RvZ3JhbSAmd2FybXVwSGlzdCA9IGRhdGEud2FybXVwSGlzdDsKKyAgICBpZiAod2FybXVwSGlzdC50b3RhbENvdW50KCkgPiAwKSB7CisgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa1RocmVhZFdhcm11cEhpc3QsIHdhcm11cEhpc3QudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBpZiAoZGF0YS51bmRlcnJ1bnMgPiAwKSB7CisgICAgICAgIGl0ZW0tPnNldEludDY0KGtUaHJlYWRVbmRlcnJ1bnMsIGRhdGEudW5kZXJydW5zKTsKKyAgICB9CisKKyAgICBpZiAoZGF0YS5vdmVycnVucyA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0SW50NjQoa1RocmVhZE92ZXJydW5zLCBkYXRhLm92ZXJydW5zKTsKKyAgICB9CisKKyAgICAvLyBTZW5kIHRvIE1lZGlhIE1ldHJpY3MgaWYgdGhlIHJlY29yZCBpcyBub3QgZW1wdHkuCisgICAgLy8gVGhlIHRocmVhZCBhbmQgdGltZSBpbmZvIGFyZSBhZGRlZCBpbnNpZGUgdGhlIGlmIHN0YXRlbWVudCBiZWNhdXNlCisgICAgLy8gd2Ugd2FudCB0byBzZW5kIHRoZW0gb25seSBpZiB0aGVyZSBhcmUgcGVyZm9ybWFuY2UgbWV0cmljcyB0byBzZW5kLgorICAgIGlmIChpdGVtLT5jb3VudCgpID4gMCkgeworICAgICAgICAvLyBBZGQgdGhyZWFkIGluZm8gZmllbGRzLgorICAgICAgICBjb25zdCBjaGFyICogY29uc3QgdHlwZVN0cmluZyA9IE5CTG9nOjp0aHJlYWRUeXBlVG9TdHJpbmcoZGF0YS50aHJlYWRJbmZvLnR5cGUpOworICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtUaHJlYWRUeXBlLCB0eXBlU3RyaW5nKTsKKyAgICAgICAgaXRlbS0+c2V0SW50MzIoa1RocmVhZEZyYW1lQ291bnQsIGRhdGEudGhyZWFkUGFyYW1zLmZyYW1lQ291bnQpOworICAgICAgICBpdGVtLT5zZXRJbnQzMihrVGhyZWFkU2FtcGxlUmF0ZSwgZGF0YS50aHJlYWRQYXJhbXMuc2FtcGxlUmF0ZSk7CisgICAgICAgIC8vIEFkZCB0aW1lIGluZm8gZmllbGRzLgorICAgICAgICBpdGVtLT5zZXRJbnQ2NChrVGhyZWFkQWN0aXZlLCBkYXRhLmFjdGl2ZSAvIDEwMDAwMDApOworICAgICAgICBpdGVtLT5zZXRJbnQ2NChrVGhyZWFkRHVyYXRpb24sIChzeXN0ZW1UaW1lKCkgLSBkYXRhLnN0YXJ0KSAvIDEwMDAwMDApOworICAgICAgICByZXR1cm4gaXRlbS0+c2VsZnJlY29yZCgpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIFRPRE86IHVzZSBhIGZ1bmN0aW9uIGxpa2UgdGhpcyB0byBleHRyYWN0IGxvZ2ljIGZyb20gd3JpdGVUb0ZpbGUKIC8vIGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vYS85Mjc5NjIwCiAKIC8vIFdyaXRlcyBvdXRsaWVyIGludGVydmFscywgdGltZXN0YW1wcywgYW5kIGhpc3RvZ3JhbXMgc3Bhbm5pbmcgbG9uZyB0aW1lIGludGVydmFscyB0byBmaWxlLgogLy8gVE9ETzogd3JpdGUgZGF0YSBpbiBiaW5hcnkgZm9ybWF0Ci12b2lkIHdyaXRlVG9GaWxlKGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdG9ncmFtPj4gJmhpc3RzLAordm9pZCB3cml0ZVRvRmlsZShjb25zdCBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3Q+PiAmaGlzdHMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPG1zSW50ZXJ2YWwsIHRpbWVzdGFtcD4+ICZvdXRsaWVyRGF0YSwKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpkZXF1ZTx0aW1lc3RhbXA+ICZwZWFrVGltZXN0YW1wcywKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGRpcmVjdG9yeSwgYm9vbCBhcHBlbmQsIGludCBhdXRob3IsIGxvZ19oYXNoX3QgaGFzaCkgewpAQCAtMTI4LDYgKzMwMiw1IEBACiAgICAgcGZzLmNsb3NlKCk7CiB9CiAKLX0gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCi0KK30gICAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvVGltZWxpbmUuY3BwIGIvbWVkaWEvbGlibmJsb2cvVGltZWxpbmUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwOWIwM2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9UaW1lbGluZS5jcHAKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3JvdW5kdXAuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9UaW1lbGluZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCisjaWYgMCAgIC8vIEZJWE1FIHNlZSBub3RlIGluIFRpbWVsaW5lLmgKK05CTG9nOjpUaW1lbGluZTo6VGltZWxpbmUoc2l6ZV90IHNpemUsIHZvaWQgKnNoYXJlZCkKKyAgICA6IG1TaXplKHJvdW5kdXAoc2l6ZSkpLCBtT3duKHNoYXJlZCA9PSBOVUxMKSwKKyAgICAgIG1TaGFyZWQoKFNoYXJlZCAqKSAobU93biA/IG5ldyBjaGFyW3NoYXJlZFNpemUoc2l6ZSldIDogc2hhcmVkKSkKK3sKKyAgICBuZXcgKG1TaGFyZWQpIFNoYXJlZDsKK30KKworTkJMb2c6OlRpbWVsaW5lOjp+VGltZWxpbmUoKQoreworICAgIG1TaGFyZWQtPn5TaGFyZWQoKTsKKyAgICBpZiAobU93bikgeworICAgICAgICBkZWxldGVbXSAoY2hhciAqKSBtU2hhcmVkOworICAgIH0KK30KKyNlbmRpZgorCisvKnN0YXRpYyovCitzaXplX3QgVGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZV90IHNpemUpCit7CisgICAgLy8gVE9ETyBmaWZvIG5vdyBzdXBwb3J0cyBub24tcG93ZXItb2YtMiBidWZmZXIgc2l6ZXMsIHNvIGNvdWxkIHJlbW92ZSB0aGUgcm91bmR1cAorICAgIHJldHVybiBzaXplb2YoU2hhcmVkKSArIHJvdW5kdXAoc2l6ZSk7Cit9CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvV3JpdGVyLmNwcCBiL21lZGlhL2xpYm5ibG9nL1dyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGEzYmQ1MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL1dyaXRlci5jcHAKQEAgLTAsMCArMSwzMjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk5CTG9nIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3ByY3RsLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FbnRyeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1RpbWVsaW5lLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvV3JpdGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIE5CTG9nIHsKKworV3JpdGVyOjpXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSkKKyAgICA6IG1TaGFyZWQoKFNoYXJlZCAqKSBzaGFyZWQpLAorICAgICAgbUZpZm8obVNoYXJlZCAhPSBOVUxMID8KKyAgICAgICAgbmV3IGF1ZGlvX3V0aWxzX2ZpZm8oc2l6ZSwgc2l6ZW9mKHVpbnQ4X3QpLAorICAgICAgICAgICAgbVNoYXJlZC0+bUJ1ZmZlciwgbVNoYXJlZC0+bVJlYXIsIE5VTEwgLyp0aHJvdHRsZXNGcm9udCovKSA6IE5VTEwpLAorICAgICAgbUZpZm9Xcml0ZXIobUZpZm8gIT0gTlVMTCA/IG5ldyBhdWRpb191dGlsc19maWZvX3dyaXRlcigqbUZpZm8pIDogTlVMTCksCisgICAgICBtRW5hYmxlZChtRmlmb1dyaXRlciAhPSBOVUxMKQoreworICAgIC8vIGNhY2hpbmcgcGlkIGFuZCBwcm9jZXNzIG5hbWUKKyAgICBwaWRfdCBpZCA9IDo6Z2V0cGlkKCk7CisgICAgY2hhciBwcm9jTmFtZVsxNl07CisgICAgaW50IHN0YXR1cyA9IHByY3RsKFBSX0dFVF9OQU1FLCBwcm9jTmFtZSk7CisgICAgaWYgKHN0YXR1cykgeyAgLy8gZXJyb3IgZ2V0dGluZyBwcm9jZXNzIG5hbWUKKyAgICAgICAgcHJvY05hbWVbMF0gPSAnXDAnOworICAgIH0KKyAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKHByb2NOYW1lKTsKKyAgICBtUGlkVGFnU2l6ZSA9IGxlbmd0aCArIHNpemVvZihwaWRfdCk7CisgICAgbVBpZFRhZyA9IG5ldyBjaGFyW21QaWRUYWdTaXplXTsKKyAgICBtZW1jcHkobVBpZFRhZywgJmlkLCBzaXplb2YocGlkX3QpKTsKKyAgICBtZW1jcHkobVBpZFRhZyArIHNpemVvZihwaWRfdCksIHByb2NOYW1lLCBsZW5ndGgpOworfQorCitXcml0ZXI6OldyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpCisgICAgOiBXcml0ZXIoaU1lbW9yeSAhPSAwID8gKFNoYXJlZCAqKSBpTWVtb3J5LT5wb2ludGVyKCkgOiBOVUxMLCBzaXplKQoreworICAgIG1JTWVtb3J5ID0gaU1lbW9yeTsKK30KKworV3JpdGVyOjp+V3JpdGVyKCkKK3sKKyAgICBkZWxldGUgbUZpZm9Xcml0ZXI7CisgICAgZGVsZXRlIG1GaWZvOworICAgIGRlbGV0ZVtdIG1QaWRUYWc7Cit9CisKK3ZvaWQgV3JpdGVyOjpsb2coY29uc3QgY2hhciAqc3RyaW5nKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0cmluZyA9PSBOVUxMLCAiQXR0ZW1wdGVkIHRvIGxvZyBOVUxMIHN0cmluZyIpOworICAgIHNpemVfdCBsZW5ndGggPSBzdHJsZW4oc3RyaW5nKTsKKyAgICBpZiAobGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKKyAgICAgICAgbGVuZ3RoID0gRW50cnk6OmtNYXhMZW5ndGg7CisgICAgfQorICAgIGxvZyhFVkVOVF9TVFJJTkcsIHN0cmluZywgbGVuZ3RoKTsKK30KKwordm9pZCBXcml0ZXI6OmxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoYXAsIGZtdCk7CisgICAgV3JpdGVyOjpsb2d2ZihmbXQsIGFwKTsgICAgIC8vIHRoZSBXcml0ZXI6OiBpcyBuZWVkZWQgdG8gYXZvaWQgdmlydHVhbCBkaXNwYXRjaCBmb3IgTG9ja2VkV3JpdGVyCisgICAgdmFfZW5kKGFwKTsKK30KKwordm9pZCBXcml0ZXI6OmxvZ1RpbWVzdGFtcCgpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0cnVjdCB0aW1lc3BlYyB0czsKKyAgICBpZiAoIWNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDLCAmdHMpKSB7CisgICAgICAgIGxvZyhFVkVOVF9USU1FU1RBTVAsICZ0cywgc2l6ZW9mKHRzKSk7CisgICAgfQorfQorCit2b2lkIFdyaXRlcjo6bG9nRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCAuLi4pCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoYXAsIGhhc2gpOworICAgIFdyaXRlcjo6bG9nVkZvcm1hdChmbXQsIGhhc2gsIGFwKTsKKyAgICB2YV9lbmQoYXApOworfQorCit2b2lkIFdyaXRlcjo6bG9nRXZlbnRIaXN0VHMoRXZlbnQgZXZlbnQsIGxvZ19oYXNoX3QgaGFzaCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgSGlzdFRzRW50cnkgZGF0YTsKKyAgICBkYXRhLmhhc2ggPSBoYXNoOworICAgIGRhdGEudHMgPSBzeXN0ZW1UaW1lKCk7CisgICAgaWYgKGRhdGEudHMgPiAwKSB7CisgICAgICAgIGxvZyhldmVudCwgJmRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgdGltZXN0YW1wIik7CisgICAgfQorfQorCitib29sIFdyaXRlcjo6aXNFbmFibGVkKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbUVuYWJsZWQ7Cit9CisKK2Jvb2wgV3JpdGVyOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBib29sIG9sZCA9IG1FbmFibGVkOworICAgIG1FbmFibGVkID0gZW5hYmxlZCAmJiBtU2hhcmVkICE9IE5VTEw7CisgICAgcmV0dXJuIG9sZDsKK30KKwordm9pZCBXcml0ZXI6OmxvZyhjb25zdCBFbnRyeSAmZXRyLCBib29sIHRydXN0ZWQpCit7CisgICAgaWYgKCFtRW5hYmxlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghdHJ1c3RlZCkgeworICAgICAgICBsb2coZXRyLm1FdmVudCwgZXRyLm1EYXRhLCBldHIubUxlbmd0aCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3Qgc2l6ZV90IG5lZWQgPSBldHIubUxlbmd0aCArIEVudHJ5OjprT3ZlcmhlYWQ7IC8vIG1FdmVudCwgbUxlbmd0aCwgZGF0YVttTGVuZ3RoXSwgbUxlbmd0aAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkID0gbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gdG8gRklGTworCisgICAgLy8gRklYTUUgb3B0aW1pemUgdGhpcyB1c2luZyBtZW1jcHkgZm9yIHRoZSBkYXRhIHBhcnQgb2YgdGhlIEVudHJ5LgorICAgIC8vIFRoZSBFbnRyeSBjb3VsZCBoYXZlIGEgbWV0aG9kIGNvcHlUbyhwdHIsIG9mZnNldCwgc2l6ZSkgdG8gb3B0aW1pemUgdGhlIGNvcHkuCisgICAgLy8gY2hlY2tzIHNpemUgb2YgYSBzaW5nbGUgbG9nIEVudHJ5OiB0eXBlLCBsZW5ndGgsIGRhdGEgcG9pbnRlciBhbmQgZW5kaW5nCisgICAgdWludDhfdCB0ZW1wW0VudHJ5OjprTWF4TGVuZ3RoICsgRW50cnk6OmtPdmVyaGVhZF07CisgICAgLy8gd3JpdGUgdGhpcyBkYXRhIHRvIHRlbXAgYXJyYXkKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5lZWQ7IGkrKykgeworICAgICAgICB0ZW1wW2ldID0gZXRyLmNvcHlFbnRyeURhdGFBdChpKTsKKyAgICB9CisgICAgLy8gd3JpdGUgdG8gY2lyY3VsYXIgYnVmZmVyCisgICAgbUZpZm9Xcml0ZXItPndyaXRlKHRlbXAsIG5lZWQpOworfQorCit2b2lkIFdyaXRlcjo6bG9nKEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQoreworICAgIGlmICghbUVuYWJsZWQpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoZGF0YSA9PSBOVUxMIHx8IGxlbmd0aCA+IEVudHJ5OjprTWF4TGVuZ3RoKSB7CisgICAgICAgIC8vIFRPRE8gUGVyaGFwcyBpdCBtYWtlcyBzZW5zZSB0byBkaXNwbGF5IHRydW5jYXRlZCBkYXRhIG9yIGF0IGxlYXN0IGEKKyAgICAgICAgLy8gICAgICBtZXNzYWdlIHRoYXQgdGhlIGRhdGEgaXMgdG9vIGxvbmc/ICBUaGUgY3VycmVudCBiZWhhdmlvciBjYW4gY3JlYXRlCisgICAgICAgIC8vICAgICAgYSBjb25mdXNpb24gZm9yIGEgcHJvZ3JhbW1lciBkZWJ1Z2dpbmcgdGhlaXIgY29kZS4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBJZ25vcmUgaWYgaW52YWxpZCBldmVudAorICAgIGlmIChldmVudCA9PSBFVkVOVF9SRVNFUlZFRCB8fCBldmVudCA+PSBFVkVOVF9VUFBFUl9CT1VORCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEVudHJ5IGV0cihldmVudCwgZGF0YSwgbGVuZ3RoKTsKKyAgICBsb2coZXRyLCB0cnVlIC8qdHJ1c3RlZCovKTsKK30KKwordm9pZCBXcml0ZXI6OmxvZ3ZmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY2hhciBidWZmZXJbRW50cnk6OmtNYXhMZW5ndGggKyAxIC8qTlVMKi9dOworICAgIGludCBsZW5ndGggPSB2c25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgZm10LCBhcCk7CisgICAgaWYgKGxlbmd0aCA+PSAoaW50KSBzaXplb2YoYnVmZmVyKSkgeworICAgICAgICBsZW5ndGggPSBzaXplb2YoYnVmZmVyKSAtIDE7CisgICAgICAgIC8vIE5VTCB0ZXJtaW5hdGlvbiBpcyBub3QgcmVxdWlyZWQKKyAgICAgICAgLy8gYnVmZmVyW2xlbmd0aF0gPSAnXDAnOworICAgIH0KKyAgICBpZiAobGVuZ3RoID49IDApIHsKKyAgICAgICAgbG9nKEVWRU5UX1NUUklORywgYnVmZmVyLCBsZW5ndGgpOworICAgIH0KK30KKwordm9pZCBXcml0ZXI6OmxvZ1N0YXJ0KGNvbnN0IGNoYXIgKmZtdCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc2l6ZV90IGxlbmd0aCA9IHN0cmxlbihmbXQpOworICAgIGlmIChsZW5ndGggPiBFbnRyeTo6a01heExlbmd0aCkgeworICAgICAgICBsZW5ndGggPSBFbnRyeTo6a01heExlbmd0aDsKKyAgICB9CisgICAgbG9nKEVWRU5UX0ZNVF9TVEFSVCwgZm10LCBsZW5ndGgpOworfQorCit2b2lkIFdyaXRlcjo6bG9nVGltZXN0YW1wRm9ybWF0KCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgY29uc3QgbnNlY3NfdCB0cyA9IHN5c3RlbVRpbWUoKTsKKyAgICBpZiAodHMgPiAwKSB7CisgICAgICAgIGxvZyhFVkVOVF9GTVRfVElNRVNUQU1QLCAmdHMsIHNpemVvZih0cykpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gZ2V0IHRpbWVzdGFtcCIpOworICAgIH0KK30KKwordm9pZCBXcml0ZXI6OmxvZ1ZGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIHZhX2xpc3QgYXJncCkKK3sKKyAgICBpZiAoIW1FbmFibGVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgV3JpdGVyOjpsb2dTdGFydChmbXQpOworICAgIGludCBpOworICAgIGRvdWJsZSBkOworICAgIGZsb2F0IGY7CisgICAgY2hhciogczsKKyAgICBzaXplX3QgbGVuZ3RoOworICAgIGludDY0X3QgdDsKKyAgICBXcml0ZXI6OmxvZ1RpbWVzdGFtcEZvcm1hdCgpOworICAgIGxvZyhFVkVOVF9GTVRfSEFTSCwgJmhhc2gsIHNpemVvZihoYXNoKSk7CisgICAgZm9yIChjb25zdCBjaGFyICpwID0gZm10OyAqcCAhPSAnXDAnOyBwKyspIHsKKyAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IG1vcmUgY29tcGxleCBmb3JtYXR0aW5nIHN1Y2ggYXMgJS4zZgorICAgICAgICBpZiAoKnAgIT0gJyUnKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBzd2l0Y2goKisrcCkgeworICAgICAgICBjYXNlICdzJzogLy8gc3RyaW5nCisgICAgICAgICAgICBzID0gdmFfYXJnKGFyZ3AsIGNoYXIgKik7CisgICAgICAgICAgICBsZW5ndGggPSBzdHJsZW4ocyk7CisgICAgICAgICAgICBpZiAobGVuZ3RoID4gRW50cnk6OmtNYXhMZW5ndGgpIHsKKyAgICAgICAgICAgICAgICBsZW5ndGggPSBFbnRyeTo6a01heExlbmd0aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGxvZyhFVkVOVF9GTVRfU1RSSU5HLCBzLCBsZW5ndGgpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAndCc6IC8vIHRpbWVzdGFtcAorICAgICAgICAgICAgdCA9IHZhX2FyZyhhcmdwLCBpbnQ2NF90KTsKKyAgICAgICAgICAgIGxvZyhFVkVOVF9GTVRfVElNRVNUQU1QLCAmdCwgc2l6ZW9mKHQpKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgJ2QnOiAvLyBpbnRlZ2VyCisgICAgICAgICAgICBpID0gdmFfYXJnKGFyZ3AsIGludCk7CisgICAgICAgICAgICBsb2coRVZFTlRfRk1UX0lOVEVHRVIsICZpLCBzaXplb2YoaSkpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSAnZic6IC8vIGZsb2F0CisgICAgICAgICAgICBkID0gdmFfYXJnKGFyZ3AsIGRvdWJsZSk7IC8vIGZsb2F0IGFyZ3VtZW50cyBhcmUgcHJvbW90ZWQgdG8gZG91YmxlIGluIHZhcmFyZyBsaXN0cworICAgICAgICAgICAgZiA9IChmbG9hdClkOworICAgICAgICAgICAgbG9nKEVWRU5UX0ZNVF9GTE9BVCwgJmYsIHNpemVvZihmKSk7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICdwJzogLy8gcGlkCisgICAgICAgICAgICBsb2coRVZFTlRfRk1UX1BJRCwgbVBpZFRhZywgbVBpZFRhZ1NpemUpOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gdGhlICIlXDAiIGNhc2UgZmluaXNoZXMgcGFyc2luZworICAgICAgICBjYXNlICdcMCc6CisgICAgICAgICAgICAtLXA7CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlICclJzoKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HVygiTkJMb2cgV3JpdGVyIHBhcnNlZCBpbnZhbGlkIGZvcm1hdCBzcGVjaWZpZXI6ICVjIiwgKnApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgRW50cnkgZXRyKEVWRU5UX0ZNVF9FTkQsIG51bGxwdHIsIDApOworICAgIGxvZyhldHIsIHRydWUpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTG9ja2VkV3JpdGVyOjpMb2NrZWRXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSkKKyAgICA6IFdyaXRlcihzaGFyZWQsIHNpemUpCit7Cit9CisKK2Jvb2wgTG9ja2VkV3JpdGVyOjppc0VuYWJsZWQoKSBjb25zdAoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIFdyaXRlcjo6aXNFbmFibGVkKCk7Cit9CisKK2Jvb2wgTG9ja2VkV3JpdGVyOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBXcml0ZXI6OnNldEVuYWJsZWQoZW5hYmxlZCk7Cit9CisKK3ZvaWQgTG9ja2VkV3JpdGVyOjpsb2coY29uc3QgRW50cnkgJmVudHJ5LCBib29sIHRydXN0ZWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIFdyaXRlcjo6bG9nKGVudHJ5LCB0cnVzdGVkKTsKK30KKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL0VudHJ5LmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL0VudHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmMDBiNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvRW50cnkuaApAQCAtMCwwICsxLDIzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19FTlRSWV9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfRU5UUllfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRXZlbnRzLmg+CisKK2NsYXNzIGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgTkJMb2cgeworCisvLyBlbnRyeSByZXByZXNlbnRhdGlvbiBpbiBtZW1vcnkKK3N0cnVjdCBlbnRyeSB7CisgICAgY29uc3QgdWludDhfdCB0eXBlOworICAgIGNvbnN0IHVpbnQ4X3QgbGVuZ3RoOworICAgIGNvbnN0IHVpbnQ4X3QgZGF0YVswXTsKK307CisKKy8vIGVudHJ5IHRhaWwgcmVwcmVzZW50YXRpb24gKGFmdGVyIGRhdGEpCitzdHJ1Y3QgZW5kaW5nIHsKKyAgICB1aW50OF90IGxlbmd0aDsKKyAgICB1aW50OF90IG5leHRbMF07Cit9OworCisvLyByZXByZXNlbnRhdGlvbiBvZiBhIHNpbmdsZSBsb2cgZW50cnkgaW4gc2hhcmVkIG1lbW9yeQorLy8gIGJ5dGVbMF0gICAgICAgICAgICAgbUV2ZW50CisvLyAgYnl0ZVsxXSAgICAgICAgICAgICBtTGVuZ3RoCisvLyAgYnl0ZVsyXSAgICAgICAgICAgICBtRGF0YVswXQorLy8gIC4uLgorLy8gIGJ5dGVbMitpXSAgICAgICAgICAgbURhdGFbaV0KKy8vICAuLi4KKy8vICBieXRlWzIrbUxlbmd0aC0xXSAgIG1EYXRhW21MZW5ndGgtMV0KKy8vICBieXRlWzIrbUxlbmd0aF0gICAgIGR1cGxpY2F0ZSBjb3B5IG9mIG1MZW5ndGggdG8gcGVybWl0IHJldmVyc2Ugc2NhbgorLy8gIGJ5dGVbMyttTGVuZ3RoXSAgICAgc3RhcnQgb2YgbmV4dCBsb2cgZW50cnkKK2NsYXNzIEVudHJ5IHsKK3B1YmxpYzoKKyAgICBFbnRyeShFdmVudCBldmVudCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCkKKyAgICAgICAgOiBtRXZlbnQoZXZlbnQpLCBtTGVuZ3RoKGxlbmd0aCksIG1EYXRhKGRhdGEpIHt9CisgICAgfkVudHJ5KCkge30KKworICAgIC8vIHVzZWQgZHVyaW5nIHdyaXRpbmcgdG8gZm9ybWF0IEVudHJ5IGluZm9ybWF0aW9uIGFzIGZvbGxvd3M6CisgICAgLy8gW3R5cGVdW2xlbmd0aF1bZGF0YSAuLi4gXVtsZW5ndGhdCisgICAgaW50ICAgICBjb3B5RW50cnlEYXRhQXQoc2l6ZV90IG9mZnNldCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIFdyaXRlcjsKKyAgICBFdmVudCAgICAgICBtRXZlbnQ7ICAgICAvLyBldmVudCB0eXBlCisgICAgdWludDhfdCAgICAgbUxlbmd0aDsgICAgLy8gbGVuZ3RoIG9mIGFkZGl0aW9uYWwgZGF0YSwgMCA8PSBtTGVuZ3RoIDw9IGtNYXhMZW5ndGgKKyAgICBjb25zdCB2b2lkICptRGF0YTsgICAgICAvLyBldmVudCB0eXBlLXNwZWNpZmljIGRhdGEKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhMZW5ndGggPSAyNTU7CitwdWJsaWM6CisgICAgLy8gbUV2ZW50LCBtTGVuZ3RoLCBtRGF0YVsuLi5dLCBkdXBsaWNhdGUgbUxlbmd0aAorICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga092ZXJoZWFkID0gc2l6ZW9mKGVudHJ5KSArIHNpemVvZihlbmRpbmcpOworICAgIC8vIGVuZGluZCBsZW5ndGggb2YgcHJldmlvdXMgZW50cnkKKyAgICBzdGF0aWMgY29uc3Qgc3NpemVfdCBrUHJldmlvdXNMZW5ndGhPZmZzZXQgPSAtIHNpemVvZihlbmRpbmcpICsKKyAgICAgICAgb2Zmc2V0b2YoZW5kaW5nLCBsZW5ndGgpOworfTsKKworLy8gZW50cnkgaXRlcmF0b3IKK2NsYXNzIEVudHJ5SXRlcmF0b3IgeworcHVibGljOgorICAgIC8vIFVzZWQgZm9yIGR1bW15IGluaXRpYWxpemF0aW9uLiBQZXJmb3JtaW5nIG9wZXJhdGlvbnMgb24gYSBkZWZhdWx0LWNvbnN0cnVjdGVkCisgICAgLy8gRW50cnlJdGVyYXRvciBvdGhlciB0aGFuIGFzc2lnbmluZyBpdCB0byBhbm90aGVyIHZhbGlkIEVudHJ5SXRlcmF0b3IKKyAgICAvLyBpcyB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgRW50cnlJdGVyYXRvcigpOworICAgIC8vIENhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIG1ha2Ugc3VyZSBlbnRyeSBpcyBub3QgbnVsbHB0ci4KKyAgICAvLyBQYXNzaW5nIGluIG51bGxwdHIgY2FuIHJlc3VsdCBpbiB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgZXhwbGljaXQgRW50cnlJdGVyYXRvcihjb25zdCB1aW50OF90ICplbnRyeSk7CisgICAgRW50cnlJdGVyYXRvcihjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcik7CisKKyAgICAvLyBkZXJlZmVyZW5jZSB1bmRlcmx5aW5nIGVudHJ5CisgICAgY29uc3QgZW50cnkmICAgIG9wZXJhdG9yKigpIGNvbnN0OworICAgIGNvbnN0IGVudHJ5KiAgICBvcGVyYXRvci0+KCkgY29uc3Q7CisgICAgLy8gYWR2YW5jZSB0byBuZXh0IGVudHJ5CisgICAgRW50cnlJdGVyYXRvciYgIG9wZXJhdG9yKysoKTsgLy8gKytpCisgICAgLy8gYmFjayB0byBwcmV2aW91cyBlbnRyeQorICAgIEVudHJ5SXRlcmF0b3ImICBvcGVyYXRvci0tKCk7IC8vIC0taQorICAgIC8vIHJldHVybnMgYW4gRW50cnlJdGVyYXRvciBjb3JyZXNwb25kaW5nIHRvIHRoZSBuZXh0IGVudHJ5CisgICAgRW50cnlJdGVyYXRvciAgIG5leHQoKSBjb25zdDsKKyAgICAvLyByZXR1cm5zIGFuIEVudHJ5SXRlcmF0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgcHJldmlvdXMgZW50cnkKKyAgICBFbnRyeUl0ZXJhdG9yICAgcHJldigpIGNvbnN0OworICAgIGJvb2wgICAgICAgICAgICBvcGVyYXRvciE9KGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdDsKKyAgICBpbnQgICAgICAgICAgICAgb3BlcmF0b3ItKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdDsKKworICAgIGJvb2wgICAgICAgICAgICBoYXNDb25zaXN0ZW50TGVuZ3RoKCkgY29uc3Q7CisgICAgdm9pZCAgICAgICAgICAgIGNvcHlUbyhzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QpIGNvbnN0OworICAgIHZvaWQgICAgICAgICAgICBjb3B5RGF0YSh1aW50OF90ICpkc3QpIGNvbnN0OworCisgICAgLy8gbWVtY3B5IHByZWZlcnJlZCB0byByZWludGVycHJldF9jYXN0IHRvIGF2b2lkIHBvdGVudGlhbGx5IHVuc3VwcG9ydGVkCisgICAgLy8gdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MuCisjaWYgMAorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgaW5saW5lIGNvbnN0IFQmIHBheWxvYWQoKSB7CisgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUICo+KG1QdHIgKyBvZmZzZXRvZihlbnRyeSwgZGF0YSkpOworICAgIH0KKyNlbHNlCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgICBpbmxpbmUgVCBwYXlsb2FkKCkgY29uc3QgeworICAgICAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlPFQ+Ojp2YWx1ZQorICAgICAgICAgICAgICAgICYmICFzdGQ6OmlzX3BvaW50ZXI8VD46OnZhbHVlLAorICAgICAgICAgICAgICAgICJOQkxvZzo6RW50cnlJdGVyYXRvciBwYXlsb2FkIG11c3QgYmUgdHJpdmlhbGx5IGNvcHlhYmxlLCBub24tcG9pbnRlciB0eXBlLiIpOworICAgICAgICBUIHBheWxvYWQ7CisgICAgICAgIG1lbWNweSgmcGF5bG9hZCwgbVB0ciArIG9mZnNldG9mKGVudHJ5LCBkYXRhKSwgc2l6ZW9mKHBheWxvYWQpKTsKKyAgICAgICAgcmV0dXJuIHBheWxvYWQ7CisgICAgfQorI2VuZGlmCisKKyAgICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgdWludDhfdCooKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtUHRyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBjb25zdCB1aW50OF90ICAqbVB0cjsgICAvLyBTaG91bGQgbm90IGJlIG51bGxwdHIgZXhjZXB0IGZvciBkdW1teSBpbml0aWFsaXphdGlvbgorfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUaGUgZm9sbG93aW5nIGNsYXNzZXMgYXJlIHVzZWQgZm9yIG1lcmdpbmcgaW50byB0aGUgTWVyZ2VyJ3MgYnVmZmVyLgorCitjbGFzcyBBYnN0cmFjdEVudHJ5IHsKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5BYnN0cmFjdEVudHJ5KCkge30KKworICAgIC8vIGJ1aWxkIGNvbmNyZXRlIGVudHJ5IG9mIGFwcHJvcHJpYXRlIGNsYXNzIGZyb20gcHRyLgorICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8QWJzdHJhY3RFbnRyeT4gYnVpbGRFbnRyeShjb25zdCB1aW50OF90ICpwdHIpOworCisgICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSB0aW1lc3RhbXAKKyAgICB2aXJ0dWFsIGludDY0X3QgICAgICAgdGltZXN0YW1wKCkgY29uc3QgPSAwOworCisgICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSdzIHVuaXF1ZSBpZAorICAgIHZpcnR1YWwgbG9nX2hhc2hfdCAgICBoYXNoKCkgY29uc3QgPSAwOworCisgICAgLy8gZW50cnkncyBhdXRob3IgaW5kZXggKC0xIGlmIG5vbmUgcHJlc2VudCkKKyAgICAvLyBhIE1lcmdlciBoYXMgYSB2ZWN0b3Igb2YgUmVhZGVycywgYXV0aG9yIHNpbXBseSBwb2ludHMgdG8gdGhlIGluZGV4IG9mIHRoZQorICAgIC8vIFJlYWRlciB0aGF0IG9yaWdpbmF0ZWQgdGhlIGVudHJ5CisgICAgLy8gVE9ETyBjb25zaWRlciBjaGFuZ2luZyB0byB1aW50MzJfdAorICAgIHZpcnR1YWwgaW50ICAgICAgICAgICBhdXRob3IoKSBjb25zdCA9IDA7CisKKyAgICAvLyBjb3B5IGVudHJ5LCBhZGRpbmcgYXV0aG9yIGJlZm9yZSB0aW1lc3RhbXAsIHJldHVybnMgaXRlcmF0b3IgdG8gZW5kIG9mIGVudHJ5CisgICAgdmlydHVhbCBFbnRyeUl0ZXJhdG9yIGNvcHlXaXRoQXV0aG9yKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgICAgLy8gRW50cnkgc3RhcnRpbmcgaW4gdGhlIGdpdmVuIHBvaW50ZXIsIHdoaWNoIHNoYWxsIG5vdCBiZSBudWxscHRyLgorICAgIGV4cGxpY2l0IEFic3RyYWN0RW50cnkoY29uc3QgdWludDhfdCAqZW50cnkpIDogbUVudHJ5KGVudHJ5KSB7fQorICAgIC8vIGNvcGllcyBvcmRpbmFyeSBlbnRyeSBmcm9tIHNyYyB0byBkc3QsIGFuZCByZXR1cm5zIGxlbmd0aCBvZiBlbnRyeQorICAgIC8vIHNpemVfdCAgICAgIGNvcHlFbnRyeShhdWRpb191dGlsc19maWZvX3dyaXRlciAqZHN0LCBjb25zdCBpdGVyYXRvciAmaXQpOworICAgIGNvbnN0IHVpbnQ4X3QgKiBjb25zdCBtRW50cnk7Cit9OworCisvLyBBUEkgZm9yIGhhbmRsaW5nIGZvcm1hdCBlbnRyeSBvcGVyYXRpb25zCisKKy8vIGEgZm9ybWF0dGVkIGVudHJ5IGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKKy8vICAgICogRk1UX1NUQVJUIGVudHJ5LCBjb250YWluaW5nIHRoZSBmb3JtYXQgc3RyaW5nCisvLyAgICAqIFRJTUVTVEFNUCBlbnRyeQorLy8gICAgKiBIQVNIIGVudHJ5CisvLyAgICAqIGF1dGhvciBlbnRyeSBvZiB0aGUgdGhyZWFkIHRoYXQgZ2VuZXJhdGVkIGl0IChvcHRpb25hbCwgcHJlc2VudCBpbiBtZXJnZWQgbG9nKQorLy8gICAgKiBmb3JtYXQgYXJnMQorLy8gICAgKiBmb3JtYXQgYXJnMgorLy8gICAgKiAuLi4KKy8vICAgICogRk1UX0VORCBlbnRyeQorY2xhc3MgRm9ybWF0RW50cnkgOiBwdWJsaWMgQWJzdHJhY3RFbnRyeSB7CitwdWJsaWM6CisgICAgLy8gZXhwbGljaXQgRm9ybWF0RW50cnkoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpOworICAgIGV4cGxpY2l0IEZvcm1hdEVudHJ5KGNvbnN0IHVpbnQ4X3QgKnB0cikgOiBBYnN0cmFjdEVudHJ5KHB0cikge30KKyAgICB+Rm9ybWF0RW50cnkoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICBFbnRyeUl0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7CisKKyAgICAvLyBFbnRyeSdzIGZvcm1hdCBzdHJpbmcKKyAgICBjb25zdCBjaGFyKiAgIGZvcm1hdFN0cmluZygpIGNvbnN0OworCisgICAgLy8gRW5ydHkncyBmb3JtYXQgc3RyaW5nIGxlbmd0aAorICAgIHNpemVfdCAgICAgICAgZm9ybWF0U3RyaW5nTGVuZ3RoKCkgY29uc3Q7CisKKyAgICAvLyBGb3JtYXQgYXJndW1lbnRzIChleGNsdWRpbmcgZm9ybWF0IHN0cmluZywgdGltZXN0YW1wIGFuZCBhdXRob3IpCisgICAgRW50cnlJdGVyYXRvciBhcmdzKCkgY29uc3Q7CisKKyAgICAvLyBnZXQgZm9ybWF0IGVudHJ5IHRpbWVzdGFtcAorICAgIGludDY0X3QgICAgICAgdGltZXN0YW1wKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBnZXQgZm9ybWF0IGVudHJ5J3MgdW5pcXVlIGlkCisgICAgbG9nX2hhc2hfdCAgICBoYXNoKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBlbnRyeSdzIGF1dGhvciBpbmRleCAoLTEgaWYgbm9uZSBwcmVzZW50KQorICAgIC8vIGEgTWVyZ2VyIGhhcyBhIHZlY3RvciBvZiBSZWFkZXJzLCBhdXRob3Igc2ltcGx5IHBvaW50cyB0byB0aGUgaW5kZXggb2YgdGhlCisgICAgLy8gUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKKyAgICBpbnQgICAgICAgICAgIGF1dGhvcigpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8gY29weSBlbnRyeSwgYWRkaW5nIGF1dGhvciBiZWZvcmUgdGltZXN0YW1wLCByZXR1cm5zIHNpemUgb2Ygb3JpZ2luYWwgZW50cnkKKyAgICBFbnRyeUl0ZXJhdG9yIGNvcHlXaXRoQXV0aG9yKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRob3IpIGNvbnN0IG92ZXJyaWRlOworfTsKKworY2xhc3MgSGlzdG9ncmFtRW50cnkgOiBwdWJsaWMgQWJzdHJhY3RFbnRyeSB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgSGlzdG9ncmFtRW50cnkoY29uc3QgdWludDhfdCAqcHRyKSA6IEFic3RyYWN0RW50cnkocHRyKSB7fQorICAgIH5IaXN0b2dyYW1FbnRyeSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIGludDY0X3QgICAgICAgdGltZXN0YW1wKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBsb2dfaGFzaF90ICAgIGhhc2goKSBjb25zdCBvdmVycmlkZTsKKworICAgIGludCAgICAgICAgICAgYXV0aG9yKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBFbnRyeUl0ZXJhdG9yIGNvcHlXaXRoQXV0aG9yKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRob3IpIGNvbnN0IG92ZXJyaWRlOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19FTlRSWV9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL0V2ZW50cy5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9FdmVudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2E0ZmU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9FdmVudHMuaApAQCAtMCwwICsxLDE1NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19FVkVOVFNfSAorI2RlZmluZSBBTkRST0lEX01FRElBX05CTE9HX0VWRU5UU19ICisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIE5CTG9nIHsKKworLy8gVE9ETyBoYXZlIGEgY29tbWVudCBzb21ld2hlcmUgZXhwbGFpbmluZyB0aGUgd2hvbGUgcHJvY2VzcyBmb3IgYWRkaW5nIGEgbmV3IEVWRU5UXworCisvLyBOQkxvZyBFdmVudCB0eXBlcy4gVGhlIEV2ZW50cyBhcmUgbmFtZWQgdG8gcHJvdmlkZSBjb250ZXh0dWFsIG1lYW5pbmcgZm9yIHdoYXQgaXMgbG9nZ2VkLgorLy8gSWYgYWRkaW5nIGEgbmV3IHN0YW5kYWxvbmUgRXZlbnQgaGVyZSwgdXBkYXRlIHRoZSBldmVudC10by10eXBlIG1hcHBpbmcgYnkgYWRkaW5nIGEKKy8vIE1BUF9FVkVOVF9UT19UWVBFIHN0YXRlbWVudCBiZWxvdy4KKy8vIFhYWCBOb3RlIHRoYXQgYXMgb2YgdGhlIGN1cnJlbnQgZGVzaWduLCBFdmVudHMgc2hvdWxkIG5vdCBiZSByZW51bWJlcmVkIChpLmUuIHJlb3JkZXJlZCkKKy8vIGlmIHRoZXkgZXZlciBsZWF2ZSBtZW1vcnkgKGZvciBleGFtcGxlLCB3cml0dGVuIHRvIGZpbGUsIHVwbG9hZGVkIHRvIGNsb3VkLCBldGMuKS4KKy8vIFRPRE8gbWFrZSBzb21lIHNvcnQgb2YgaW50ZXJmYWNlIHRvIGtlZXAgdGhlc2UgImNvbnRyYWN0IiBjb25zdGFudHMuCitlbnVtIEV2ZW50IDogdWludDhfdCB7CisgICAgRVZFTlRfUkVTRVJWRUQsCisgICAgRVZFTlRfU1RSSU5HLCAgICAgICAgICAgICAgIC8vIEFTQ0lJIHN0cmluZywgbm90IE5VTC10ZXJtaW5hdGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IG1ha2UgdGltZXN0YW1wIG9wdGlvbmFsCisgICAgRVZFTlRfVElNRVNUQU1QLCAgICAgICAgICAgIC8vIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKQorCisgICAgLy8gVHlwZXMgZm9yIEZvcm1hdCBFbnRyeSwgaS5lLiBmb3JtYXR0ZWQgZW50cnkKKyAgICBFVkVOVF9GTVRfU1RBUlQsICAgICAgICAgICAgLy8gbG9nRm9ybWF0IHN0YXJ0IGV2ZW50OiBlbnRyeSBpbmNsdWRlcyBmb3JtYXQgc3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb2xsb3dpbmcgZW50cmllcyBjb250YWluIGZvcm1hdCBhcmd1bWVudHMKKyAgICAvLyBmb3JtYXQgYXJndW1lbnRzCisgICAgRVZFTlRfRk1UX0FVVEhPUiwgICAgICAgICAgIC8vIGF1dGhvciBpbmRleCAocHJlc2VudCBpbiBtZXJnZWQgbG9ncykgdHJhY2tzIGVudHJ5J3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JpZ2luYWwgbG9nCisgICAgRVZFTlRfRk1UX0ZMT0FULCAgICAgICAgICAgIC8vIGZsb2F0aW5nIHBvaW50IHZhbHVlIGVudHJ5CisgICAgRVZFTlRfRk1UX0hBU0gsICAgICAgICAgICAgIC8vIHVuaXF1ZSBIQVNIIG9mIGxvZyBvcmlnaW4sIG9yaWdpbmF0ZXMgZnJvbSBoYXNoIG9mIGZpbGUgbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgbGluZSBudW1iZXIKKyAgICBFVkVOVF9GTVRfSU5URUdFUiwgICAgICAgICAgLy8gaW50ZWdlciB2YWx1ZSBlbnRyeQorICAgIEVWRU5UX0ZNVF9QSUQsICAgICAgICAgICAgICAvLyBwcm9jZXNzIElEIGFuZCBwcm9jZXNzIG5hbWUKKyAgICBFVkVOVF9GTVRfU1RSSU5HLCAgICAgICAgICAgLy8gc3RyaW5nIHZhbHVlIGVudHJ5CisgICAgRVZFTlRfRk1UX1RJTUVTVEFNUCwgICAgICAgIC8vIHRpbWVzdGFtcCB2YWx1ZSBlbnRyeQorICAgIC8vIGVuZCBvZiBmb3JtYXQgYXJndW1lbnRzCisgICAgRVZFTlRfRk1UX0VORCwgICAgICAgICAgICAgIC8vIGVuZCBvZiBsb2dGb3JtYXQgYXJndW1lbnQgbGlzdAorCisgICAgLy8gVHlwZXMgZm9yIHdha2V1cCB0aW1lc3RhbXAgaGlzdG9ncmFtcworICAgIEVWRU5UX0FVRElPX1NUQVRFLCAgICAgICAgICAvLyBhdWRpbyBvbi9vZmYgZXZlbnQ6IGxvZ2dlZCBvbiBGYXN0TWl4ZXI6Om9uU3RhdGVDaGFuZ2UgY2FsbAorICAgIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywgICAvLyBzaW5nbGUgZGF0dW0gZm9yIHRpbWVzdGFtcCBoaXN0b2dyYW0KKworICAgIC8vIFR5cGVzIHJlcHJlc2VudGluZyBhdWRpbyBwZXJmb3JtYW5jZSBtZXRyaWNzCisgICAgRVZFTlRfTEFURU5DWSwgICAgICAgICAgICAgIC8vIGRpZmZlcmVuY2UgYmV0d2VlbiBmcmFtZXMgcHJlc2VudGVkIGJ5IEhBTCBhbmQgZnJhbWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXR0ZW4gdG8gSEFMIG91dHB1dCBzaW5rLCBkaXZpZGVkIGJ5IHNhbXBsZSByYXRlLgorICAgIEVWRU5UX09WRVJSVU4sICAgICAgICAgICAgICAvLyBwcmVkaWN0ZWQgdGhyZWFkIG92ZXJydW4gZXZlbnQgdGltZXN0YW1wCisgICAgRVZFTlRfVEhSRUFEX0lORk8sICAgICAgICAgIC8vIHNlZSB0aHJlYWRfaW5mb190IGJlbG93CisgICAgRVZFTlRfVU5ERVJSVU4sICAgICAgICAgICAgIC8vIHByZWRpY3RlZCB0aHJlYWQgdW5kZXJydW4gZXZlbnQgdGltZXN0YW1wCisgICAgRVZFTlRfV0FSTVVQX1RJTUUsICAgICAgICAgIC8vIHRocmVhZCB3YXJtdXAgdGltZQorICAgIEVWRU5UX1dPUktfVElNRSwgICAgICAgICAgICAvLyB0aGUgdGltZSBhIHRocmVhZCB0YWtlcyB0byBkbyB3b3JrLCBlLmcuIHJlYWQsIHdyaXRlLCBldGMuCisgICAgRVZFTlRfVEhSRUFEX1BBUkFNUywgICAgICAgIC8vIHNlZSB0aHJlYWRfcGFyYW1zX3QgYmVsb3cKKworICAgIEVWRU5UX1VQUEVSX0JPVU5ELCAgICAgICAgICAvLyB0byBjaGVjayBmb3IgaW52YWxpZCBldmVudHMKK307CisKKy8vIE5CTG9nIGN1c3RvbS1kZWZpbmVkIHN0cnVjdHMuIFNvbWUgTkJMb2cgRXZlbnQgdHlwZXMgbWFwIHRvIHRoZXNlIHN0cnVjdHMuCisKK3VzaW5nIGxvZ19oYXNoX3QgPSB1aW50NjRfdDsKKworLy8gdXNlZCBmb3IgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTIChub3QgbWFwcGVkKQorc3RydWN0IEhpc3RUc0VudHJ5IHsKKyAgICBsb2dfaGFzaF90IGhhc2g7CisgICAgaW50NjRfdCB0czsKK307IC8vVE9ETyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLy8gdXNlZCBmb3IgRVZFTlRfSElTVE9HUkFNX0VOVFJZX1RTIChub3QgbWFwcGVkKQorc3RydWN0IEhpc3RUc0VudHJ5V2l0aEF1dGhvciB7CisgICAgbG9nX2hhc2hfdCBoYXNoOworICAgIGludDY0X3QgdHM7CisgICAgaW50IGF1dGhvcjsKK307IC8vVE9ETyBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworZW51bSBUaHJlYWRUeXBlIHsKKyAgICBVTktOT1dOLAorICAgIE1JWEVSLAorICAgIENBUFRVUkUsCisgICAgRkFTVE1JWEVSLAorICAgIEZBU1RDQVBUVVJFLAorfTsKKworaW5saW5lIGNvbnN0IGNoYXIgKnRocmVhZFR5cGVUb1N0cmluZyhUaHJlYWRUeXBlIHR5cGUpIHsKKyAgICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIE1JWEVSOgorICAgICAgICByZXR1cm4gIk1JWEVSIjsKKyAgICBjYXNlIENBUFRVUkU6CisgICAgICAgIHJldHVybiAiQ0FQVFVSRSI7CisgICAgY2FzZSBGQVNUTUlYRVI6CisgICAgICAgIHJldHVybiAiRkFTVE1JWEVSIjsKKyAgICBjYXNlIEZBU1RDQVBUVVJFOgorICAgICAgICByZXR1cm4gIkZBU1RDQVBUVVJFIjsKKyAgICBjYXNlIFVOS05PV046CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuICJVTktOT1dOIjsKKyAgICB9Cit9CisKKy8vIG1hcHBlZCBmcm9tIEVWRU5UX1RIUkVBRF9JTkZPCisvLyBUaGVzZSBmaWVsZHMgYWx3YXlzIHN0YXkgdGhlIHNhbWUgdGhyb3VnaG91dCBhIHRocmVhZCdzIGxpZmV0aW1lIGFuZAorLy8gc2hvdWxkIG9ubHkgbmVlZCB0byBiZSBsb2dnZWQgb25jZSB1cG9uIHRocmVhZCBpbml0aWFsaXphdGlvbi4KKy8vIFRoZXJlIGlzIGN1cnJlbnRseSBubyByZWNvdmVyeSBtZWNoYW5pc20gaWYgdGhlIGxvZyBldmVudCBjb3JyZXNwb25kaW5nCisvLyB0byB0aGlzIHR5cGUgaXMgbG9zdC4KKy8vIFRPRE8gYWRkIHRoaXMgaW5mb3JtYXRpb24gd2hlbiBhZGRpbmcgYSByZWFkZXIgdG8gTWVkaWFMb2dTZXJ2aWNlPworc3RydWN0IHRocmVhZF9pbmZvX3QgeworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkID0gLTE7ICAgICAgLy8gVGhyZWFkIEkvTyBoYW5kbGUKKyAgICBUaHJlYWRUeXBlIHR5cGUgPSBVTktOT1dOOyAgICAgIC8vIFNlZSBlbnVtIFRocmVhZFR5cGUgYWJvdmUKK307CisKKy8vIG1hcHBlZCBmcm9tIEVWRU5UX1RIUkVBRF9QQVJBTVMKKy8vIFRoZXNlIGZpZWxkcyBhcmUgbm90IG5lY2Vzc2FyaWx5IGNvbnN0YW50IHRocm91Z2hvdXQgYSB0aHJlYWQncyBsaWZldGltZSBhbmQKKy8vIGNhbiBiZSBsb2dnZWQgd2hlbmV2ZXIgYSB0aHJlYWQgcmVjZWl2ZXMgbmV3IGNvbmZpZ3VyYXRpb25zIG9yIHBhcmFtZXRlcnMuCitzdHJ1Y3QgdGhyZWFkX3BhcmFtc190IHsKKyAgICBzaXplX3QgZnJhbWVDb3VudCA9IDA7ICAgICAgICAgIC8vIG51bWJlciBvZiBmcmFtZXMgcGVyIHJlYWQgb3Igd3JpdGUgYnVmZmVyCisgICAgdW5zaWduZWQgc2FtcGxlUmF0ZSA9IDA7ICAgICAgICAvLyBpbiBmcmFtZXMgcGVyIHNlY29uZAorfTsKKwordGVtcGxhdGUgPEV2ZW50IEU+IHN0cnVjdCBnZXRfbWFwcGVkOworI2RlZmluZSBNQVBfRVZFTlRfVE9fVFlQRShFLCBUKSBcCit0ZW1wbGF0ZTw+IHN0cnVjdCBnZXRfbWFwcGVkPEU+IHsgXAorICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc190cml2aWFsbHlfY29weWFibGU8VD46OnZhbHVlIFwKKyAgICAgICAgICAgICYmICFzdGQ6OmlzX3BvaW50ZXI8VD46OnZhbHVlLCBcCisgICAgICAgICAgICAiTkJMb2c6OkV2ZW50IG11c3QgbWFwIHRvIHRyaXZpYWxseSBjb3B5YWJsZSwgbm9uLXBvaW50ZXIgdHlwZS4iKTsgXAorICAgIHR5cGVkZWYgVCB0eXBlOyBcCit9CisKKy8vIE1hcHMgYW4gTkJMb2cgRXZlbnQgdHlwZSB0byBhIEMrKyBQT0QgdHlwZS4KK01BUF9FVkVOVF9UT19UWVBFKEVWRU5UX0xBVEVOQ1ksIGRvdWJsZSk7CitNQVBfRVZFTlRfVE9fVFlQRShFVkVOVF9PVkVSUlVOLCBpbnQ2NF90KTsKK01BUF9FVkVOVF9UT19UWVBFKEVWRU5UX1RIUkVBRF9JTkZPLCB0aHJlYWRfaW5mb190KTsKK01BUF9FVkVOVF9UT19UWVBFKEVWRU5UX1VOREVSUlVOLCBpbnQ2NF90KTsKK01BUF9FVkVOVF9UT19UWVBFKEVWRU5UX1dBUk1VUF9USU1FLCBkb3VibGUpOworTUFQX0VWRU5UX1RPX1RZUEUoRVZFTlRfV09SS19USU1FLCBpbnQ2NF90KTsKK01BUF9FVkVOVF9UT19UWVBFKEVWRU5UX1RIUkVBRF9QQVJBTVMsIHRocmVhZF9wYXJhbXNfdCk7CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfTkJMT0dfRVZFTlRTX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTWVyZ2VyLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL01lcmdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYTg1MjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL01lcmdlci5oCkBAIC0wLDAgKzEsMTU3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX01FRElBX05CTE9HX01FUkdFUl9ICisjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfTUVSR0VSX0gKKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvUGVyZm9ybWFuY2VBbmFseXNpcy5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlYWRlci5oPgorI2luY2x1ZGUgPHV0aWxzL0NvbmRpdGlvbi5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1RocmVhZC5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0cmluZzE2OworY2xhc3MgU3RyaW5nODsKKworbmFtZXNwYWNlIE5CTG9nIHsKKworc3RydWN0IFNoYXJlZDsKKworLy8gVE9ETyB1cGRhdGUgY29tbWVudHMgdG8gcmVmbGVjdCBjdXJyZW50IGZ1bmN0aW9uYWxpdGllcworCisvLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVhZCBkYXRhIGZyb20gZWFjaCB0aHJlYWQncyBpbmRpdmlkdWFsIEZJRk8gaW4gc2hhcmVkIG1lbW9yeQorLy8gYW5kIHdyaXRlIGl0IHRvIGEgc2luZ2xlIEZJRk8gaW4gbG9jYWwgbWVtb3J5LgorY2xhc3MgTWVyZ2VyIDogcHVibGljIFJlZkJhc2UgeworcHVibGljOgorICAgIE1lcmdlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKKworICAgIH5NZXJnZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICB2b2lkIGFkZFJlYWRlcihjb25zdCBzcDxOQkxvZzo6UmVhZGVyPiAmcmVhZGVyKTsKKyAgICAvLyBUT0RPIGFkZCByZW1vdmVSZWFkZXIKKyAgICB2b2lkIG1lcmdlKCk7CisKKyAgICAvLyBGSVhNRSBUaGlzIGlzIHJldHVybmluZyBhIHJlZmVyZW5jZSB0byBhIHNoYXJlZCB2YXJpYWJsZSB0aGF0IG5lZWRzIGEgbG9jaworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFJlYWRlcj4+JiBnZXRSZWFkZXJzKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgLy8gdmVjdG9yIG9mIHRoZSByZWFkZXJzIHRoZSBtZXJnZXIgaXMgc3VwcG9zZWQgdG8gbWVyZ2UgZnJvbS4KKyAgICAvLyBldmVyeSByZWFkZXIgcmVhZHMgZnJvbSBhIHdyaXRlcidzIGJ1ZmZlcgorICAgIC8vIEZJWE1FIE5lZWRzIHRvIGJlIHByb3RlY3RlZCBieSBhIGxvY2sKKyAgICBzdGQ6OnZlY3RvcjxzcDxSZWFkZXI+PiBtUmVhZGVyczsKKworICAgIFNoYXJlZCAqIGNvbnN0IG1TaGFyZWQ7IC8vIHJhdyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmbz4gbUZpZm87IC8vIEZJRk8gaXRzZWxmCisgICAgc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiBtRmlmb1dyaXRlcjsgLy8gdXNlZCB0byB3cml0ZSB0byBGSUZPCit9OworCisvLyBUaGlzIGNsYXNzIGhhcyBhIHBvaW50ZXIgdG8gdGhlIEZJRk8gaW4gbG9jYWwgbWVtb3J5IHdoaWNoIHN0b3JlcyB0aGUgbWVyZ2VkCisvLyBkYXRhIGNvbGxlY3RlZCBieSBOQkxvZzo6TWVyZ2VyIGZyb20gYWxsIFJlYWRlcnMuIEl0IGlzIHVzZWQgdG8gcHJvY2VzcworLy8gdGhpcyBkYXRhIGFuZCB3cml0ZSB0aGUgcmVzdWx0IHRvIFBlcmZvcm1hbmNlQW5hbHlzaXMuCitjbGFzcyBNZXJnZVJlYWRlciA6IHB1YmxpYyBSZWFkZXIgeworcHVibGljOgorICAgIE1lcmdlUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIE1lcmdlciAmbWVyZ2VyKTsKKworICAgIC8vIHByb2Nlc3MgYSBwYXJ0aWN1bGFyIHNuYXBzaG90IG9mIHRoZSByZWFkZXIKKyAgICB2b2lkIHByb2Nlc3NTbmFwc2hvdChTbmFwc2hvdCAmc25hcCwgaW50IGF1dGhvcik7CisKKyAgICAvLyBjYWxsIGdldFNuYXBzaG90IG9mIHRoZSBjb250ZW50IG9mIHRoZSByZWFkZXIncyBidWZmZXIgYW5kIHByb2Nlc3MgdGhlIGRhdGEKKyAgICB2b2lkIGdldEFuZFByb2Nlc3NTbmFwc2hvdCgpOworCisgICAgLy8gY2hlY2sgZm9yIHBlcmlvZGljIHB1c2ggb2YgcGVyZm9ybWFuY2UgZGF0YSB0byBtZWRpYSBtZXRyaWNzLCBhbmQgcGVyZm9ybQorICAgIC8vIHRoZSBzZW5kIGlmIGl0IGlzIHRpbWUgdG8gZG8gc28uCisgICAgdm9pZCBjaGVja1B1c2hUb01lZGlhTWV0cmljcygpOworCisgICAgdm9pZCBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKK3ByaXZhdGU6CisgICAgLy8gRklYTUUgTmVlZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IGEgbG9jaywKKyAgICAvLyAgICAgICBiZWNhdXNlIGV2ZW4gdGhvdWdoIG91ciB1c2Ugb2YgaXQgaXMgcmVhZC1vbmx5IHRoZXJlIG1heSBiZSBhc3luY2hyb25vdXMgdXBkYXRlcworICAgIC8vIFRoZSBvYmplY3QgaXMgb3duZWQgYnkgdGhlIE1lcmdlciBjbGFzcy4KKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzcDxSZWFkZXI+PiYgbVJlYWRlcnM7CisKKyAgICAvLyBhbmFseXplcywgY29tcHJlc3NlcyBhbmQgc3RvcmVzIHRoZSBtZXJnZWQgZGF0YQorICAgIC8vIGNvbnRhaW5zIGEgc2VwYXJhdGUgaW5zdGFuY2UgZm9yIGV2ZXJ5IGF1dGhvciAodGhyZWFkKSwgYW5kIGZvciBldmVyeSBzb3VyY2UgZmlsZQorICAgIC8vIGxvY2F0aW9uIHdpdGhpbiBlYWNoIGF1dGhvcgorICAgIFJlcG9ydFBlcmZvcm1hbmNlOjpQZXJmb3JtYW5jZUFuYWx5c2lzTWFwIG1UaHJlYWRQZXJmb3JtYW5jZUFuYWx5c2lzOworCisgICAgLy8gY29tcHJlc3NlcyBhbmQgc3RvcmVzIGF1ZGlvIHBlcmZvcm1hbmNlIGRhdGEgZnJvbSBlYWNoIHRocmVhZCdzIGJ1ZmZlcnMuCisgICAgLy8gZmlyc3QgcGFyYW1ldGVyIGlzIGF1dGhvciwgaS5lLiB0aHJlYWQgaW5kZXguCisgICAgc3RkOjptYXA8aW50LCBSZXBvcnRQZXJmb3JtYW5jZTo6UGVyZm9ybWFuY2VEYXRhPiBtVGhyZWFkUGVyZm9ybWFuY2VEYXRhOworCisgICAgLy8gaG93IG9mdGVuIHRvIHB1c2ggZGF0YSB0byBNZWRpYSBNZXRyaWNzCisgICAgc3RhdGljIGNvbnN0ZXhwciBuc2Vjc190IGtQZXJpb2RpY01lZGlhTWV0cmljc1B1c2ggPSBzMm5zKChuc2Vjc190KTIgKiA2MCAqIDYwKTsgLy8gMiBob3VycworCisgICAgLy8gaGFuZGxlIGF1dGhvciBlbnRyeSBieSBsb29raW5nIHVwIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhcHBlbmRpbmcgaXQgdG8gdGhlIGJvZHkKKyAgICAvLyByZXR1cm5zIG51bWJlciBvZiBieXRlcyByZWFkIGZyb20gZm10RW50cnkKKyAgICB2b2lkIGhhbmRsZUF1dGhvcihjb25zdCBBYnN0cmFjdEVudHJ5ICZmbXRFbnRyeSwgU3RyaW5nOCAqYm9keSk7Cit9OworCisvLyBNZXJnZVRocmVhZCBpcyBhIHRocmVhZCB0aGF0IGNvbnRhaW5zIGEgTWVyZ2VyLiBJdCB3b3JrcyBhcyBhIHJldHJpZ2dlcmFibGUgb25lLXNob3Q6CisvLyB3aGVuIHRyaWdnZXJlZCwgaXQgYXdha2VzIGZvciBhIGxhcHNlIG9mIHRpbWUsIGR1cmluZyB3aGljaCBpdCBwZXJpb2RpY2FsbHkgbWVyZ2VzOyBpZgorLy8gcmV0cmlnZ2VyZWQsIHRoZSB0aW1lb3V0IGlzIHJlc2V0LgorLy8gVGhlIHRocmVhZCBpcyB0cmlnZ2VyZWQgb24gQXVkaW9GbGluZ2VyIGJpbmRlciBhY3Rpdml0eS4KK2NsYXNzIE1lcmdlVGhyZWFkIDogcHVibGljIFRocmVhZCB7CitwdWJsaWM6CisgICAgTWVyZ2VUaHJlYWQoTWVyZ2VyICZtZXJnZXIsIE1lcmdlUmVhZGVyICZtZXJnZVJlYWRlcik7CisgICAgfk1lcmdlVGhyZWFkKCkgb3ZlcnJpZGU7CisKKyAgICAvLyBSZXNldCB0aW1lb3V0IGFuZCBhY3RpdmF0ZSB0aHJlYWQgdG8gbWVyZ2UgcGVyaW9kaWNhbGx5IGlmIGl0J3MgaWRsZQorICAgIHZvaWQgd2FrZXVwKCk7CisKKyAgICAvLyBTZXQgdGltZW91dCBwZXJpb2QgdW50aWwgdGhlIG1lcmdpbmcgdGhyZWFkIGdvZXMgaWRsZSBhZ2FpbgorICAgIHZvaWQgc2V0VGltZW91dFVzKGludCB0aW1lKTsKKworcHJpdmF0ZToKKyAgICBib29sIHRocmVhZExvb3AoKSBvdmVycmlkZTsKKworICAgIC8vIHRoZSBtZXJnZXIgd2hvIGFjdHVhbGx5IGRvZXMgdGhlIHdvcmsgb2YgbWVyZ2luZyB0aGUgbG9ncworICAgIE1lcmdlciYgICAgICBtTWVyZ2VyOworCisgICAgLy8gdGhlIG1lcmdlcmVhZGVyIHVzZWQgdG8gcHJvY2VzcyBkYXRhIG1lcmdlZCBieSBtTWVyZ2VyCisgICAgTWVyZ2VSZWFkZXImIG1NZXJnZVJlYWRlcjsKKworICAgIC8vIG11dGV4IGZvciB0aGUgY29uZGl0aW9uIHZhcmlhYmxlCisgICAgTXV0ZXggICAgICAgIG1NdXRleDsKKworICAgIC8vIGNvbmRpdGlvbiB2YXJpYWJsZSB0byBhY3RpdmF0ZSBtZXJnaW5nIG9uIHRpbWVvdXQgPj0gMAorICAgIENvbmRpdGlvbiAgICBtQ29uZDsKKworICAgIC8vIHRpbWUgbGVmdCB1bnRpbCB0aGUgdGhyZWFkIGJsb2NrcyBhZ2FpbiAoaW4gbWljcm9zZWNvbmRzKQorICAgIGludCAgICAgICAgICBtVGltZW91dFVzOworCisgICAgLy8gbWVyZ2luZyBwZXJpb2Qgd2hlbiB0aGUgdGhyZWFkIGlzIGF3YWtlCisgICAgc3RhdGljIGNvbnN0IGludCAga1RocmVhZFNsZWVwUGVyaW9kVXMgPSAxMDAwMDAwIC8qMXMqLzsKKworICAgIC8vIGluaXRpYWwgdGltZW91dCB2YWx1ZSB3aGVuIHRyaWdnZXJlZAorICAgIHN0YXRpYyBjb25zdCBpbnQgIGtUaHJlYWRXYWtldXBQZXJpb2RVcyA9IDMwMDAwMDAgLyozcyovOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19NRVJHRVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9OQkxvZy5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9OQkxvZy5oCmluZGV4IGZiNmYxNzkuLmZkNzM1MzggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvTkJMb2cuaAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL05CTG9nLmgKQEAgLTE5LDU5NSArMTksMTAgQEAKICNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19ICiAjZGVmaW5lIEFORFJPSURfTUVESUFfTkJMT0dfSAogCi0jaW5jbHVkZSA8ZGVxdWU+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxhdWRpb191dGlscy9maWZvLmg+Ci0jaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxtZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaD4KLSNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBTdHJpbmc4OwotCi1jbGFzcyBOQkxvZyB7Ci0KLXB1YmxpYzoKLQotICAgIHVzaW5nIGxvZ19oYXNoX3QgPSBSZXBvcnRQZXJmb3JtYW5jZTo6bG9nX2hhc2hfdDsKLQotICAgIC8vIEZJWE1FIEV2ZXJ5dGhpbmcgbmVlZGVkIGZvciBjbGllbnQgKHdyaXRlciBBUEkgYW5kIHJlZ2lzdHJhdGlvbikgc2hvdWxkIGJlIGlzb2xhdGVkCi0gICAgLy8gICAgICAgZnJvbSB0aGUgcmVzdCBvZiB0aGUgaW1wbGVtZW50YXRpb24uCi0gICAgY2xhc3MgV3JpdGVyOwotICAgIGNsYXNzIFJlYWRlcjsKLQotICAgIGVudW0gRXZlbnQgOiB1aW50OF90IHsKLSAgICAgICAgRVZFTlRfUkVTRVJWRUQsCi0gICAgICAgIEVWRU5UX1NUUklORywgICAgICAgICAgICAgICAvLyBBU0NJSSBzdHJpbmcsIG5vdCBOVUwtdGVybWluYXRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogbWFrZSB0aW1lc3RhbXAgb3B0aW9uYWwKLSAgICAgICAgRVZFTlRfVElNRVNUQU1QLCAgICAgICAgICAgIC8vIGNsb2NrX2dldHRpbWUoQ0xPQ0tfTU9OT1RPTklDKQotICAgICAgICBFVkVOVF9JTlRFR0VSLCAgICAgICAgICAgICAgLy8gaW50ZWdlciB2YWx1ZSBlbnRyeQotICAgICAgICBFVkVOVF9GTE9BVCwgICAgICAgICAgICAgICAgLy8gZmxvYXRpbmcgcG9pbnQgdmFsdWUgZW50cnkKLSAgICAgICAgRVZFTlRfUElELCAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3MgSUQgYW5kIHByb2Nlc3MgbmFtZQotICAgICAgICBFVkVOVF9BVVRIT1IsICAgICAgICAgICAgICAgLy8gYXV0aG9yIGluZGV4IChwcmVzZW50IGluIG1lcmdlZCBsb2dzKSB0cmFja3MgZW50cnkncwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3JpZ2luYWwgbG9nCi0gICAgICAgIEVWRU5UX1NUQVJUX0ZNVCwgICAgICAgICAgICAvLyBsb2dGb3JtYXQgc3RhcnQgZXZlbnQ6IGVudHJ5IGluY2x1ZGVzIGZvcm1hdCBzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb2xsb3dpbmcgZW50cmllcyBjb250YWluIGZvcm1hdCBhcmd1bWVudHMKLSAgICAgICAgRVZFTlRfSEFTSCwgICAgICAgICAgICAgICAgIC8vIHVuaXF1ZSBIQVNIIG9mIGxvZyBvcmlnaW4sIG9yaWdpbmF0ZXMgZnJvbSBoYXNoIG9mIGZpbGUgbmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIGxpbmUgbnVtYmVyCi0gICAgICAgIEVWRU5UX0hJU1RPR1JBTV9FTlRSWV9UUywgICAvLyBzaW5nbGUgZGF0dW0gZm9yIHRpbWVzdGFtcCBoaXN0b2dyYW0KLSAgICAgICAgRVZFTlRfQVVESU9fU1RBVEUsICAgICAgICAgIC8vIGF1ZGlvIG9uL29mZiBldmVudDogbG9nZ2VkIG9uIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSBjYWxsCi0gICAgICAgIEVWRU5UX0VORF9GTVQsICAgICAgICAgICAgICAvLyBlbmQgb2YgbG9nRm9ybWF0IGFyZ3VtZW50IGxpc3QKLQotICAgICAgICBFVkVOVF9VUFBFUl9CT1VORCwgICAgICAgICAgLy8gdG8gY2hlY2sgZm9yIGludmFsaWQgZXZlbnRzCi0gICAgfTsKLQotcHJpdmF0ZToKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEFQSSBmb3IgaGFuZGxpbmcgZm9ybWF0IGVudHJ5IG9wZXJhdGlvbnMKLQotICAgIC8vIGEgZm9ybWF0dGVkIGVudHJ5IGhhcyB0aGUgZm9sbG93aW5nIHN0cnVjdHVyZToKLSAgICAvLyAgICAqIFNUQVJUX0ZNVCBlbnRyeSwgY29udGFpbmluZyB0aGUgZm9ybWF0IHN0cmluZwotICAgIC8vICAgICogVElNRVNUQU1QIGVudHJ5Ci0gICAgLy8gICAgKiBIQVNIIGVudHJ5Ci0gICAgLy8gICAgKiBhdXRob3IgZW50cnkgb2YgdGhlIHRocmVhZCB0aGF0IGdlbmVyYXRlZCBpdCAob3B0aW9uYWwsIHByZXNlbnQgaW4gbWVyZ2VkIGxvZykKLSAgICAvLyAgICAqIGZvcm1hdCBhcmcxCi0gICAgLy8gICAgKiBmb3JtYXQgYXJnMgotICAgIC8vICAgICogLi4uCi0gICAgLy8gICAgKiBFTkRfRk1UIGVudHJ5Ci0KLSAgICAvLyBlbnRyeSByZXByZXNlbnRhdGlvbiBpbiBtZW1vcnkKLSAgICBzdHJ1Y3QgZW50cnkgewotICAgICAgICBjb25zdCB1aW50OF90IHR5cGU7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgbGVuZ3RoOwotICAgICAgICBjb25zdCB1aW50OF90IGRhdGFbMF07Ci0gICAgfTsKLQotICAgIC8vIGVudHJ5IHRhaWwgcmVwcmVzZW50YXRpb24gKGFmdGVyIGRhdGEpCi0gICAgc3RydWN0IGVuZGluZyB7Ci0gICAgICAgIHVpbnQ4X3QgbGVuZ3RoOwotICAgICAgICB1aW50OF90IG5leHRbMF07Ci0gICAgfTsKLQotICAgIC8vIGVudHJ5IGl0ZXJhdG9yCi0gICAgY2xhc3MgRW50cnlJdGVyYXRvciB7Ci0gICAgcHVibGljOgotICAgICAgICBFbnRyeUl0ZXJhdG9yKCk7Ci0gICAgICAgIGV4cGxpY2l0IEVudHJ5SXRlcmF0b3IoY29uc3QgdWludDhfdCAqZW50cnkpOwotICAgICAgICBFbnRyeUl0ZXJhdG9yKGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKTsKLQotICAgICAgICAvLyBkZXJlZmVyZW5jZSB1bmRlcmx5aW5nIGVudHJ5Ci0gICAgICAgIGNvbnN0IGVudHJ5JiAgICBvcGVyYXRvciooKSBjb25zdDsKLSAgICAgICAgY29uc3QgZW50cnkqICAgIG9wZXJhdG9yLT4oKSBjb25zdDsKLSAgICAgICAgLy8gYWR2YW5jZSB0byBuZXh0IGVudHJ5Ci0gICAgICAgIEVudHJ5SXRlcmF0b3ImICAgICAgIG9wZXJhdG9yKysoKTsgLy8gKytpCi0gICAgICAgIC8vIGJhY2sgdG8gcHJldmlvdXMgZW50cnkKLSAgICAgICAgRW50cnlJdGVyYXRvciYgICAgICAgb3BlcmF0b3ItLSgpOyAvLyAtLWkKLSAgICAgICAgRW50cnlJdGVyYXRvciAgICAgICAgbmV4dCgpIGNvbnN0OwotICAgICAgICBFbnRyeUl0ZXJhdG9yICAgICAgICBwcmV2KCkgY29uc3Q7Ci0gICAgICAgIGJvb2wgICAgICAgICAgICBvcGVyYXRvciE9KGNvbnN0IEVudHJ5SXRlcmF0b3IgJm90aGVyKSBjb25zdDsKLSAgICAgICAgaW50ICAgICAgICAgICAgIG9wZXJhdG9yLShjb25zdCBFbnRyeUl0ZXJhdG9yICZvdGhlcikgY29uc3Q7Ci0KLSAgICAgICAgYm9vbCAgICAgICAgICAgIGhhc0NvbnNpc3RlbnRMZW5ndGgoKSBjb25zdDsKLSAgICAgICAgdm9pZCAgICAgICAgICAgIGNvcHlUbyhzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QpIGNvbnN0OwotICAgICAgICB2b2lkICAgICAgICAgICAgY29weURhdGEodWludDhfdCAqZHN0KSBjb25zdDsKLQotICAgICAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICAgICAgICBpbmxpbmUgY29uc3QgVCYgcGF5bG9hZCgpIHsKLSAgICAgICAgICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUICo+KHB0ciArIG9mZnNldG9mKGVudHJ5LCBkYXRhKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbmxpbmUgb3BlcmF0b3IgY29uc3QgdWludDhfdCooKSBjb25zdCB7Ci0gICAgICAgICAgICByZXR1cm4gcHRyOwotICAgICAgICB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBjb25zdCB1aW50OF90ICAqcHRyOwotICAgIH07Ci0KLSAgICBjbGFzcyBBYnN0cmFjdEVudHJ5IHsKLSAgICBwdWJsaWM6Ci0KLSAgICAgICAgLy8gRW50cnkgc3RhcnRpbmcgaW4gdGhlIGdpdmVuIHBvaW50ZXIKLSAgICAgICAgZXhwbGljaXQgQWJzdHJhY3RFbnRyeShjb25zdCB1aW50OF90ICplbnRyeSk7Ci0gICAgICAgIHZpcnR1YWwgfkFic3RyYWN0RW50cnkoKSB7fQotCi0gICAgICAgIC8vIGJ1aWxkIGNvbmNyZXRlIGVudHJ5IG9mIGFwcHJvcHJpYXRlIGNsYXNzIGZyb20gcG9pbnRlcgotICAgICAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPEFic3RyYWN0RW50cnk+IGJ1aWxkRW50cnkoY29uc3QgdWludDhfdCAqcHRyKTsKLQotICAgICAgICAvLyBnZXQgZm9ybWF0IGVudHJ5IHRpbWVzdGFtcAotICAgICAgICB2aXJ0dWFsIGludDY0X3QgICAgICB0aW1lc3RhbXAoKSBjb25zdCA9IDA7Ci0KLSAgICAgICAgLy8gZ2V0IGZvcm1hdCBlbnRyeSdzIHVuaXF1ZSBpZAotICAgICAgICB2aXJ0dWFsIGxvZ19oYXNoX3QgICBoYXNoKCkgY29uc3QgPSAwOwotCi0gICAgICAgIC8vIGVudHJ5J3MgYXV0aG9yIGluZGV4ICgtMSBpZiBub25lIHByZXNlbnQpCi0gICAgICAgIC8vIGEgTWVyZ2VyIGhhcyBhIHZlY3RvciBvZiBSZWFkZXJzLCBhdXRob3Igc2ltcGx5IHBvaW50cyB0byB0aGUgaW5kZXggb2YgdGhlCi0gICAgICAgIC8vIFJlYWRlciB0aGF0IG9yaWdpbmF0ZWQgdGhlIGVudHJ5Ci0gICAgICAgIC8vIFRPRE8gY29uc2lkZXIgY2hhbmdpbmcgdG8gdWludDMyX3QKLSAgICAgICAgdmlydHVhbCBpbnQgICAgICAgICAgYXV0aG9yKCkgY29uc3QgPSAwOwotCi0gICAgICAgIC8vIGNvcHkgZW50cnksIGFkZGluZyBhdXRob3IgYmVmb3JlIHRpbWVzdGFtcCwgcmV0dXJucyBpdGVyYXRvciB0byBlbmQgb2YgZW50cnkKLSAgICAgICAgdmlydHVhbCBFbnRyeUl0ZXJhdG9yICAgIGNvcHlXaXRoQXV0aG9yKHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gJmRzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdXRob3IpIGNvbnN0ID0gMDsKLQotICAgIHByb3RlY3RlZDoKLSAgICAgICAgLy8gY29waWVzIG9yZGluYXJ5IGVudHJ5IGZyb20gc3JjIHRvIGRzdCwgYW5kIHJldHVybnMgbGVuZ3RoIG9mIGVudHJ5Ci0gICAgICAgIC8vIHNpemVfdCAgICAgIGNvcHlFbnRyeShhdWRpb191dGlsc19maWZvX3dyaXRlciAqZHN0LCBjb25zdCBpdGVyYXRvciAmaXQpOwotICAgICAgICBjb25zdCB1aW50OF90ICAqbUVudHJ5OwotICAgIH07Ci0KLSAgICBjbGFzcyBGb3JtYXRFbnRyeSA6IHB1YmxpYyBBYnN0cmFjdEVudHJ5IHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIC8vIGV4cGxpY2l0IEZvcm1hdEVudHJ5KGNvbnN0IEVudHJ5SXRlcmF0b3IgJml0KTsKLSAgICAgICAgZXhwbGljaXQgRm9ybWF0RW50cnkoY29uc3QgdWludDhfdCAqcHRyKSA6IEFic3RyYWN0RW50cnkocHRyKSB7fQotICAgICAgICB2aXJ0dWFsIH5Gb3JtYXRFbnRyeSgpIHt9Ci0KLSAgICAgICAgRW50cnlJdGVyYXRvciBiZWdpbigpIGNvbnN0OwotCi0gICAgICAgIC8vIEVudHJ5J3MgZm9ybWF0IHN0cmluZwotICAgICAgICBjb25zdCAgIGNoYXIqIGZvcm1hdFN0cmluZygpIGNvbnN0OwotCi0gICAgICAgIC8vIEVucnR5J3MgZm9ybWF0IHN0cmluZyBsZW5ndGgKLSAgICAgICAgc2l6ZV90ICAgICAgZm9ybWF0U3RyaW5nTGVuZ3RoKCkgY29uc3Q7Ci0KLSAgICAgICAgLy8gRm9ybWF0IGFyZ3VtZW50cyAoZXhjbHVkaW5nIGZvcm1hdCBzdHJpbmcsIHRpbWVzdGFtcCBhbmQgYXV0aG9yKQotICAgICAgICBFbnRyeUl0ZXJhdG9yICAgIGFyZ3MoKSBjb25zdDsKLQotICAgICAgICAvLyBnZXQgZm9ybWF0IGVudHJ5IHRpbWVzdGFtcAotICAgICAgICB2aXJ0dWFsIGludDY0X3QgICAgIHRpbWVzdGFtcCgpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIC8vIGdldCBmb3JtYXQgZW50cnkncyB1bmlxdWUgaWQKLSAgICAgICAgdmlydHVhbCBsb2dfaGFzaF90ICBoYXNoKCkgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICAgICAgLy8gZW50cnkncyBhdXRob3IgaW5kZXggKC0xIGlmIG5vbmUgcHJlc2VudCkKLSAgICAgICAgLy8gYSBNZXJnZXIgaGFzIGEgdmVjdG9yIG9mIFJlYWRlcnMsIGF1dGhvciBzaW1wbHkgcG9pbnRzIHRvIHRoZSBpbmRleCBvZiB0aGUKLSAgICAgICAgLy8gUmVhZGVyIHRoYXQgb3JpZ2luYXRlZCB0aGUgZW50cnkKLSAgICAgICAgdmlydHVhbCBpbnQgICAgICAgICBhdXRob3IoKSBjb25zdCBvdmVycmlkZTsKLQotICAgICAgICAvLyBjb3B5IGVudHJ5LCBhZGRpbmcgYXV0aG9yIGJlZm9yZSB0aW1lc3RhbXAsIHJldHVybnMgc2l6ZSBvZiBvcmlnaW5hbCBlbnRyeQotICAgICAgICB2aXJ0dWFsIEVudHJ5SXRlcmF0b3IgICAgY29weVdpdGhBdXRob3Ioc3RkOjp1bmlxdWVfcHRyPGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyPiAmZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1dGhvcikgY29uc3Qgb3ZlcnJpZGU7Ci0KLSAgICB9OwotCi0gICAgY2xhc3MgSGlzdG9ncmFtRW50cnkgOiBwdWJsaWMgQWJzdHJhY3RFbnRyeSB7Ci0gICAgcHVibGljOgotICAgICAgICBleHBsaWNpdCBIaXN0b2dyYW1FbnRyeShjb25zdCB1aW50OF90ICpwdHIpIDogQWJzdHJhY3RFbnRyeShwdHIpIHsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIH5IaXN0b2dyYW1FbnRyeSgpIHt9Ci0KLSAgICAgICAgdmlydHVhbCBpbnQ2NF90ICAgICB0aW1lc3RhbXAoKSBjb25zdCBvdmVycmlkZTsKLQotICAgICAgICB2aXJ0dWFsIGxvZ19oYXNoX3QgIGhhc2goKSBjb25zdCBvdmVycmlkZTsKLQotICAgICAgICB2aXJ0dWFsIGludCAgICAgICAgIGF1dGhvcigpIGNvbnN0IG92ZXJyaWRlOwotCi0gICAgICAgIHZpcnR1YWwgRW50cnlJdGVyYXRvciAgICBjb3B5V2l0aEF1dGhvcihzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmb193cml0ZXI+ICZkc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXV0aG9yKSBjb25zdCBvdmVycmlkZTsKLQotICAgIH07Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIHJlcHJlc2VudGF0aW9uIG9mIGEgc2luZ2xlIGxvZyBlbnRyeSBpbiBwcml2YXRlIG1lbW9yeQotICAgIHN0cnVjdCBFbnRyeSB7Ci0gICAgICAgIEVudHJ5KEV2ZW50IGV2ZW50LCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuZ3RoKQotICAgICAgICAgICAgOiBtRXZlbnQoZXZlbnQpLCBtTGVuZ3RoKGxlbmd0aCksIG1EYXRhKGRhdGEpIHsgfQotICAgICAgICAvKnZpcnR1YWwqLyB+RW50cnkoKSB7IH0KLQotICAgICAgICAvLyB1c2VkIGR1cmluZyB3cml0aW5nIHRvIGZvcm1hdCBFbnRyeSBpbmZvcm1hdGlvbiBhcyBmb2xsb3dzOgotICAgICAgICAvLyBbdHlwZV1bbGVuZ3RoXVtkYXRhIC4uLiBdW2xlbmd0aF0KLSAgICAgICAgaW50ICAgICBjb3B5RW50cnlEYXRhQXQoc2l6ZV90IG9mZnNldCkgY29uc3Q7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgY2xhc3MgV3JpdGVyOwotICAgICAgICBFdmVudCAgICAgICBtRXZlbnQ7ICAgICAvLyBldmVudCB0eXBlCi0gICAgICAgIHVpbnQ4X3QgICAgIG1MZW5ndGg7ICAgIC8vIGxlbmd0aCBvZiBhZGRpdGlvbmFsIGRhdGEsIDAgPD0gbUxlbmd0aCA8PSBrTWF4TGVuZ3RoCi0gICAgICAgIGNvbnN0IHZvaWQgKm1EYXRhOyAgICAgIC8vIGV2ZW50IHR5cGUtc3BlY2lmaWMgZGF0YQotICAgICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhMZW5ndGggPSAyNTU7Ci0gICAgcHVibGljOgotICAgICAgICAvLyBtRXZlbnQsIG1MZW5ndGgsIG1EYXRhWy4uLl0sIGR1cGxpY2F0ZSBtTGVuZ3RoCi0gICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga092ZXJoZWFkID0gc2l6ZW9mKGVudHJ5KSArIHNpemVvZihlbmRpbmcpOwotICAgICAgICAvLyBlbmRpbmQgbGVuZ3RoIG9mIHByZXZpb3VzIGVudHJ5Ci0gICAgICAgIHN0YXRpYyBjb25zdCBzc2l6ZV90IGtQcmV2aW91c0xlbmd0aE9mZnNldCA9IC0gc2l6ZW9mKGVuZGluZykgKwotICAgICAgICAgICAgb2Zmc2V0b2YoZW5kaW5nLCBsZW5ndGgpOwotICAgIH07Ci0KLSAgICBzdHJ1Y3QgSGlzdFRzRW50cnkgewotICAgICAgICBsb2dfaGFzaF90IGhhc2g7Ci0gICAgICAgIGludDY0X3QgdHM7Ci0gICAgfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0gICAgc3RydWN0IEhpc3RUc0VudHJ5V2l0aEF1dGhvciB7Ci0gICAgICAgIGxvZ19oYXNoX3QgaGFzaDsKLSAgICAgICAgaW50NjRfdCB0czsKLSAgICAgICAgaW50IGF1dGhvcjsKLSAgICB9OyAvL1RPRE8gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7Ci0KLSAgICBzdHJ1Y3QgSGlzdEludEVudHJ5IHsKLSAgICAgICAgbG9nX2hhc2hfdCBoYXNoOwotICAgICAgICBpbnQgdmFsdWU7Ci0gICAgfTsgLy9UT0RPIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOwotCi0gICAgLy8gcmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgbG9nIGVudHJ5IGluIHNoYXJlZCBtZW1vcnkKLSAgICAvLyAgYnl0ZVswXSAgICAgICAgICAgICBtRXZlbnQKLSAgICAvLyAgYnl0ZVsxXSAgICAgICAgICAgICBtTGVuZ3RoCi0gICAgLy8gIGJ5dGVbMl0gICAgICAgICAgICAgbURhdGFbMF0KLSAgICAvLyAgLi4uCi0gICAgLy8gIGJ5dGVbMitpXSAgICAgICAgICAgbURhdGFbaV0KLSAgICAvLyAgLi4uCi0gICAgLy8gIGJ5dGVbMittTGVuZ3RoLTFdICAgbURhdGFbbUxlbmd0aC0xXQotICAgIC8vICBieXRlWzIrbUxlbmd0aF0gICAgIGR1cGxpY2F0ZSBjb3B5IG9mIG1MZW5ndGggdG8gcGVybWl0IHJldmVyc2Ugc2NhbgotICAgIC8vICBieXRlWzMrbUxlbmd0aF0gICAgIHN0YXJ0IG9mIG5leHQgbG9nIGVudHJ5Ci0KLSAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRJbnQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSk7Ci0gICAgc3RhdGljIHZvaWQgICAgYXBwZW5kRmxvYXQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSk7Ci0gICAgc3RhdGljIHZvaWQgICAgYXBwZW5kUElEKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpOwotICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZFRpbWVzdGFtcChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKLSAgICBzdGF0aWMgc2l6ZV90ICBmbXRFbnRyeUxlbmd0aChjb25zdCB1aW50OF90ICpkYXRhKTsKLSAgICBzdGF0aWMgU3RyaW5nOCBidWZmZXJEdW1wKGNvbnN0IHVpbnQ4X3QgKmJ1ZmZlciwgc2l6ZV90IHNpemUpOwotICAgIHN0YXRpYyBTdHJpbmc4IGJ1ZmZlckR1bXAoY29uc3QgRW50cnlJdGVyYXRvciAmaXQpOwotcHVibGljOgotCi0gICAgLy8gTG9jYXRlZCBpbiBzaGFyZWQgbWVtb3J5LCBtdXN0IGJlIFBPRC4KLSAgICAvLyBFeGFjdGx5IG9uZSBwcm9jZXNzIG11c3QgZXhwbGljaXRseSBjYWxsIHRoZSBjb25zdHJ1Y3RvciBvciB1c2UgcGxhY2VtZW50IG5ldy4KLSAgICAvLyBTaW5jZSB0aGlzIGlzIGEgUE9ELCB0aGUgZGVzdHJ1Y3RvciBpcyBlbXB0eSBhbmQgdW5uZWNlc3NhcnkgdG8gY2FsbCBpdCBleHBsaWNpdGx5LgotICAgIHN0cnVjdCBTaGFyZWQgewotICAgICAgICBTaGFyZWQoKSAvKiBtUmVhciBpbml0aWFsaXplZCB2aWEgZGVmYXVsdCBjb25zdHJ1Y3RvciAqLyB7IH0KLSAgICAgICAgLyp2aXJ0dWFsKi8gflNoYXJlZCgpIHsgfQotCi0gICAgICAgIGF1ZGlvX3V0aWxzX2ZpZm9faW5kZXggIG1SZWFyOyAgLy8gaW5kZXggb25lIGJ5dGUgcGFzdCB0aGUgZW5kIG9mIG1vc3QgcmVjZW50IEVudHJ5Ci0gICAgICAgIGNoYXIgICAgbUJ1ZmZlclswXTsgICAgICAgICAgICAgLy8gY2lyY3VsYXIgYnVmZmVyIGZvciBlbnRyaWVzCi0gICAgfTsKLQotcHVibGljOgotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBGSVhNRSBUaW1lbGluZSB3YXMgaW50ZW5kZWQgdG8gd3JhcCBXcml0ZXIgYW5kIFJlYWRlciwgYnV0IGlzbid0IGFjdHVhbGx5IHVzZWQgeWV0LgotICAgIC8vIEZvciBub3cgaXQgaXMganVzdCBhIG5hbWVzcGFjZSBmb3Igc2hhcmVkU2l6ZSgpLgotICAgIGNsYXNzIFRpbWVsaW5lIDogcHVibGljIFJlZkJhc2UgewotICAgIHB1YmxpYzoKLSNpZiAwCi0gICAgICAgIFRpbWVsaW5lKHNpemVfdCBzaXplLCB2b2lkICpzaGFyZWQgPSBOVUxMKTsKLSAgICAgICAgdmlydHVhbCB+VGltZWxpbmUoKTsKLSNlbmRpZgotCi0gICAgICAgIC8vIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgdGltZWxpbmUgaW4gYnl0ZSB1bml0cy4KLSAgICAgICAgLy8gUmV0dXJucyB0aGUgc2l6ZSByb3VuZGVkIHVwIHRvIGEgcG93ZXItb2YtMiwgcGx1cyB0aGUgY29uc3RhbnQgc2l6ZSBvdmVyaGVhZCBmb3IgaW5kaWNlcy4KLSAgICAgICAgc3RhdGljIHNpemVfdCBzaGFyZWRTaXplKHNpemVfdCBzaXplKTsKLQotI2lmIDAKLSAgICBwcml2YXRlOgotICAgICAgICBmcmllbmQgY2xhc3MgICAgV3JpdGVyOwotICAgICAgICBmcmllbmQgY2xhc3MgICAgUmVhZGVyOwotCi0gICAgICAgIGNvbnN0IHNpemVfdCAgICBtU2l6ZTsgICAgICAvLyBjaXJjdWxhciBidWZmZXIgc2l6ZSBpbiBieXRlcywgbXVzdCBiZSBhIHBvd2VyIG9mIDIKLSAgICAgICAgYm9vbCAgICAgICAgICAgIG1Pd247ICAgICAgIC8vIHdoZXRoZXIgSSBvd24gdGhlIG1lbW9yeSBhdCBtU2hhcmVkCi0gICAgICAgIFNoYXJlZCogY29uc3QgICBtU2hhcmVkOyAgICAvLyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkKLSNlbmRpZgotICAgIH07Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8vIFdyaXRlciBpcyB0aHJlYWQtc2FmZSB3aXRoIHJlc3BlY3QgdG8gUmVhZGVyLCBidXQgbm90IHdpdGggcmVzcGVjdCB0byBtdWx0aXBsZSB0aHJlYWRzCi0gICAgLy8gY2FsbGluZyBXcml0ZXIgbWV0aG9kcy4gIElmIHlvdSBuZWVkIG11bHRpLXRocmVhZCBzYWZldHkgZm9yIHdyaXRpbmcsIHVzZSBMb2NrZWRXcml0ZXIuCi0gICAgY2xhc3MgV3JpdGVyIDogcHVibGljIFJlZkJhc2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgV3JpdGVyKCk7ICAgICAgICAgICAgICAgICAgIC8vIGR1bW15IG5vcCBpbXBsZW1lbnRhdGlvbiB3aXRob3V0IHNoYXJlZCBtZW1vcnkKLQotICAgICAgICAvLyBJbnB1dCBwYXJhbWV0ZXIgJ3NpemUnIGlzIHRoZSBkZXNpcmVkIHNpemUgb2YgdGhlIHRpbWVsaW5lIGluIGJ5dGUgdW5pdHMuCi0gICAgICAgIC8vIFRoZSBzaXplIG9mIHRoZSBzaGFyZWQgbWVtb3J5IG11c3QgYmUgYXQgbGVhc3QgVGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkuCi0gICAgICAgIFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKLSAgICAgICAgV3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICAgICAgdmlydHVhbCB+V3JpdGVyKCk7Ci0KLSAgICAgICAgLy8gRklYTUUgbmVlZHMgY29tbWVudHMsIGFuZCBzb21lIHNob3VsZCBiZSBwcml2YXRlCi0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2coY29uc3QgY2hhciAqc3RyaW5nKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ3ZmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dUaW1lc3RhbXAoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1RpbWVzdGFtcChjb25zdCBpbnQ2NF90IHRzKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0ludGVnZXIoY29uc3QgaW50IHgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRmxvYXQoY29uc3QgZmxvYXQgeCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dQSUQoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0Zvcm1hdChjb25zdCBjaGFyICpmbXQsIGxvZ19oYXNoX3QgaGFzaCwgLi4uKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1ZGb3JtYXQoY29uc3QgY2hhciAqZm10LCBsb2dfaGFzaF90IGhhc2gsIHZhX2xpc3QgYXApOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nU3RhcnQoY29uc3QgY2hhciAqZm10KTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0VuZCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSGFzaChsb2dfaGFzaF90IGhhc2gpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nRXZlbnRIaXN0VHMoRXZlbnQgZXZlbnQsIGxvZ19oYXNoX3QgaGFzaCk7Ci0KLSAgICAgICAgdmlydHVhbCBib29sICAgIGlzRW5hYmxlZCgpIGNvbnN0OwotCi0gICAgICAgIC8vIHJldHVybiB2YWx1ZSBmb3IgYWxsIG9mIHRoZXNlIGlzIHRoZSBwcmV2aW91cyBpc0VuYWJsZWQoKQotICAgICAgICB2aXJ0dWFsIGJvb2wgICAgc2V0RW5hYmxlZChib29sIGVuYWJsZWQpOyAgIC8vIGJ1dCB3b24ndCBlbmFibGUgaWYgbm8gc2hhcmVkIG1lbW9yeQotICAgICAgICBib29sICAgIGVuYWJsZSgpICAgIHsgcmV0dXJuIHNldEVuYWJsZWQodHJ1ZSk7IH0KLSAgICAgICAgYm9vbCAgICBkaXNhYmxlKCkgICB7IHJldHVybiBzZXRFbmFibGVkKGZhbHNlKTsgfQotCi0gICAgICAgIHNwPElNZW1vcnk+ICAgICBnZXRJTWVtb3J5KCkgY29uc3QgIHsgcmV0dXJuIG1JTWVtb3J5OyB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICAvLyAwIDw9IGxlbmd0aCA8PSBrTWF4TGVuZ3RoCi0gICAgICAgIC8vIHdyaXRlcyBhIHNpbmdsZSBFbnRyeSB0byB0aGUgRklGTwotICAgICAgICB2b2lkICAgIGxvZyhFdmVudCBldmVudCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7Ci0gICAgICAgIC8vIGNoZWNrcyB2YWxpZGl0eSBvZiBhbiBldmVudCBiZWZvcmUgY2FsbGluZyBsb2cgYWJvdmUgdGhpcyBvbmUKLSAgICAgICAgdm9pZCAgICBsb2coY29uc3QgRW50cnkgKmVudHJ5LCBib29sIHRydXN0ZWQgPSBmYWxzZSk7Ci0KLSAgICAgICAgU2hhcmVkKiBjb25zdCAgIG1TaGFyZWQ7ICAgIC8vIHJhdyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkKLSAgICAgICAgc3A8SU1lbW9yeT4gICAgIG1JTWVtb3J5OyAgIC8vIHJlZi1jb3VudGVkIHZlcnNpb24sIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgdGhlbiBjb25zdAotICAgICAgICBhdWRpb191dGlsc19maWZvICogY29uc3QgbUZpZm87ICAgICAgICAgICAgICAgICAvLyBGSUZPIGl0c2VsZiwgbm9uLU5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCi0gICAgICAgIGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyICogY29uc3QgbUZpZm9Xcml0ZXI7ICAgIC8vIHVzZWQgdG8gd3JpdGUgdG8gRklGTywgbm9uLU5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5sZXNzIGR1bW15IGNvbnN0cnVjdG9yIHVzZWQKLSAgICAgICAgYm9vbCAgICAgICAgICAgIG1FbmFibGVkOyAgIC8vIHdoZXRoZXIgdG8gYWN0dWFsbHkgbG9nCi0KLSAgICAgICAgLy8gY2FjaGVkIHBpZCBhbmQgcHJvY2VzcyBuYW1lIHRvIHVzZSBpbiAlcCBmb3JtYXQgc3BlY2lmaWVyCi0gICAgICAgIC8vIHRvdGFsIHRhZyBsZW5ndGggaXMgbVBpZFRhZ1NpemUgYW5kIHByb2Nlc3MgbmFtZSBpcyBub3QgemVybyB0ZXJtaW5hdGVkCi0gICAgICAgIGNoYXIgICAqbVBpZFRhZzsKLSAgICAgICAgc2l6ZV90ICBtUGlkVGFnU2l6ZTsKLSAgICB9OwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBTaW1pbGFyIHRvIFdyaXRlciwgYnV0IHNhZmUgZm9yIG11bHRpcGxlIHRocmVhZHMgdG8gY2FsbCBjb25jdXJyZW50bHkKLSAgICBjbGFzcyBMb2NrZWRXcml0ZXIgOiBwdWJsaWMgV3JpdGVyIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIExvY2tlZFdyaXRlcigpOwotICAgICAgICBMb2NrZWRXcml0ZXIodm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSk7Ci0KLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZyhjb25zdCBjaGFyICpzdHJpbmcpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nZihjb25zdCBjaGFyICpmbXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCAyLCAzKSkpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9ndmYoY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFwKTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1RpbWVzdGFtcCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nVGltZXN0YW1wKGNvbnN0IGludDY0X3QgdHMpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSW50ZWdlcihjb25zdCBpbnQgeCk7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCAgICBsb2dGbG9hdChjb25zdCBmbG9hdCB4KTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ1BJRCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nU3RhcnQoY29uc3QgY2hhciAqZm10KTsKLSAgICAgICAgdmlydHVhbCB2b2lkICAgIGxvZ0VuZCgpOwotICAgICAgICB2aXJ0dWFsIHZvaWQgICAgbG9nSGFzaChsb2dfaGFzaF90IGhhc2gpOwotCi0gICAgICAgIHZpcnR1YWwgYm9vbCAgICBpc0VuYWJsZWQoKSBjb25zdDsKLSAgICAgICAgdmlydHVhbCBib29sICAgIHNldEVuYWJsZWQoYm9vbCBlbmFibGVkKTsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIG11dGFibGUgTXV0ZXggICBtTG9jazsKLSAgICB9OwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBjbGFzcyBSZWFkZXIgOiBwdWJsaWMgUmVmQmFzZSB7Ci0gICAgcHVibGljOgotICAgICAgICAvLyBBIHNuYXBzaG90IG9mIGEgcmVhZGVycyBidWZmZXIKLSAgICAgICAgLy8gVGhpcyBpcyByYXcgZGF0YS4gTm8gYW5hbHlzaXMgaGFzIGJlZW4gZG9uZSBvbiBpdAotICAgICAgICBjbGFzcyBTbmFwc2hvdCB7Ci0gICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIFNuYXBzaG90KCkgOiBtRGF0YShOVUxMKSwgbUxvc3QoMCkge30KLQotICAgICAgICAgICAgU25hcHNob3Qoc2l6ZV90IGJ1ZmZlclNpemUpIDogbURhdGEobmV3IHVpbnQ4X3RbYnVmZmVyU2l6ZV0pIHt9Ci0KLSAgICAgICAgICAgIH5TbmFwc2hvdCgpIHsgZGVsZXRlW10gbURhdGE7IH0KLQotICAgICAgICAgICAgLy8gY29weSBvZiB0aGUgYnVmZmVyCi0gICAgICAgICAgICB1aW50OF90ICpkYXRhKCkgY29uc3QgeyByZXR1cm4gbURhdGE7IH0KLQotICAgICAgICAgICAgLy8gYW1vdW50IG9mIGRhdGEgbG9zdCAoZ2l2ZW4gYnkgYXVkaW9fdXRpbHNfZmlmb19yZWFkZXIpCi0gICAgICAgICAgICBzaXplX3QgICBsb3N0KCkgY29uc3QgeyByZXR1cm4gbUxvc3Q7IH0KLQotICAgICAgICAgICAgLy8gaXRlcmF0b3IgdG8gYmVnaW5uaW5nIG9mIHJlYWRhYmxlIHNlZ21lbnQgb2Ygc25hcHNob3QKLSAgICAgICAgICAgIC8vIGRhdGEgYmV0d2VlbiBiZWdpbiBhbmQgZW5kIGhhcyB2YWxpZCBlbnRyaWVzCi0gICAgICAgICAgICBFbnRyeUl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gbUJlZ2luOyB9Ci0KLSAgICAgICAgICAgIC8vIGl0ZXJhdG9yIHRvIGVuZCBvZiByZWFkYWJsZSBzZWdtZW50IG9mIHNuYXBzaG90Ci0gICAgICAgICAgICBFbnRyeUl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIG1FbmQ7IH0KLQotICAgICAgICBwcml2YXRlOgotICAgICAgICAgICAgZnJpZW5kIGNsYXNzIE1lcmdlUmVhZGVyOwotICAgICAgICAgICAgZnJpZW5kIGNsYXNzIFJlYWRlcjsKLSAgICAgICAgICAgIHVpbnQ4X3QgICAgICAgICAgICAgICptRGF0YTsKLSAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICBtTG9zdDsKLSAgICAgICAgICAgIEVudHJ5SXRlcmF0b3IgbUJlZ2luOwotICAgICAgICAgICAgRW50cnlJdGVyYXRvciBtRW5kOwotICAgICAgICB9OwotCi0gICAgICAgIC8vIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgdGltZWxpbmUgaW4gYnl0ZSB1bml0cy4KLSAgICAgICAgLy8gVGhlIHNpemUgb2YgdGhlIHNoYXJlZCBtZW1vcnkgbXVzdCBiZSBhdCBsZWFzdCBUaW1lbGluZTo6c2hhcmVkU2l6ZShzaXplKS4KLSAgICAgICAgUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOwotICAgICAgICBSZWFkZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplKTsKLQotICAgICAgICB2aXJ0dWFsIH5SZWFkZXIoKTsKLQotICAgICAgICAvLyBnZXQgc25hcHNob3Qgb2YgcmVhZGVycyBmaWZvIGJ1ZmZlciwgZWZmZWN0aXZlbHkgY29uc3VtaW5nIHRoZSBidWZmZXIKLSAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBnZXRTbmFwc2hvdCgpOwotCi0gICAgICAgIGJvb2wgICAgIGlzSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkgY29uc3Q7Ci0KLSAgICBwcm90ZWN0ZWQ6Ci0gICAgICAgIC8vIHByaW50IGEgc3VtbWFyeSBvZiB0aGUgcGVyZm9ybWFuY2UgdG8gdGhlIGNvbnNvbGUKLSAgICAgICAgdm9pZCAgICBkdW1wTGluZShjb25zdCBTdHJpbmc4JiB0aW1lc3RhbXAsIFN0cmluZzgmIGJvZHkpOwotICAgICAgICBFbnRyeUl0ZXJhdG9yICAgaGFuZGxlRm9ybWF0KGNvbnN0IEZvcm1hdEVudHJ5ICZmbXRFbnRyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4ICp0aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCAqYm9keSk7Ci0gICAgICAgIGludCBtRmQ7ICAgICAgICAgICAgICAgIC8vIGZpbGUgZGVzY3JpcHRvcgotICAgICAgICBpbnQgbUluZGVudDsgICAgICAgICAgICAvLyBpbmRlbnRhdGlvbiBsZXZlbAotICAgICAgICBpbnQgbUxvc3Q7ICAgICAgICAgICAgICAvLyBieXRlcyBvZiBkYXRhIGxvc3QgYmVmb3JlIGJ1ZmZlciB3YXMgcmVhZAotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgc3RhdGljIGNvbnN0IHN0ZDo6c2V0PEV2ZW50PiBzdGFydGluZ1R5cGVzOwotICAgICAgICBzdGF0aWMgY29uc3Qgc3RkOjpzZXQ8RXZlbnQ+IGVuZGluZ1R5cGVzOwotCi0gICAgICAgIC8vIGRlY2xhcmVkIGFzIGNvbnN0IGJlY2F1c2UgYXVkaW9fdXRpbHNfZmlmbygpIGNvbnN0cnVjdG9yCi0gICAgICAgIHNwPElNZW1vcnk+IG1JTWVtb3J5OyAgICAgICAvLyByZWYtY291bnRlZCB2ZXJzaW9uLCBhc3NpZ25lZCBvbmx5IGluIGNvbnN0cnVjdG9yCi0KLSAgICAgICAgLypjb25zdCovIFNoYXJlZCogY29uc3QgbVNoYXJlZDsgICAgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeSwgYWN0dWFsbHkgY29uc3QgYnV0IG5vdAotICAgICAgICBhdWRpb191dGlsc19maWZvICogY29uc3QgbUZpZm87ICAgICAgICAgICAgICAgICAvLyBGSUZPIGl0c2VsZiwKLSAgICAgICAgLy8gbm9uLU5VTEwgdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCi0gICAgICAgIGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyICogY29uc3QgbUZpZm9SZWFkZXI7ICAgIC8vIHVzZWQgdG8gcmVhZCBmcm9tIEZJRk8sCi0gICAgICAgIC8vIG5vbi1OVUxMIHVubGVzcyBjb25zdHJ1Y3RvciBmYWlscwotCi0gICAgICAgIC8vIFNlYXJjaGVzIGZvciB0aGUgbGFzdCBlbnRyeSBvZiB0eXBlIDx0eXBlPiBpbiB0aGUgcmFuZ2UgW2Zyb250LCBiYWNrKQotICAgICAgICAvLyBiYWNrIGhhcyB0byBiZSBlbnRyeS1hbGlnbmVkLiBSZXR1cm5zIG51bGxwdHIgaWYgbm9uZSBlbmNvbnVudGVyZWQuCi0gICAgICAgIHN0YXRpYyBjb25zdCB1aW50OF90ICpmaW5kTGFzdEVudHJ5T2ZUeXBlcyhjb25zdCB1aW50OF90ICpmcm9udCwgY29uc3QgdWludDhfdCAqYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PEV2ZW50PiAmdHlwZXMpOwotCi0gICAgICAgIC8vIGR1bW15IG1ldGhvZCBmb3IgaGFuZGxpbmcgYWJzZW50IGF1dGhvciBlbnRyeQotICAgICAgICB2aXJ0dWFsIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkmIC8qZm10RW50cnkqLywgU3RyaW5nOCogLypib2R5Ki8pIHt9Ci0gICAgfTsKLQotICAgIC8vIFdyYXBwZXIgZm9yIGEgcmVhZGVyIHdpdGggYSBuYW1lLiBDb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIHJlYWRlciBhbmQgYSBwb2ludGVyIHRvIHRoZSBuYW1lCi0gICAgY2xhc3MgTmFtZWRSZWFkZXIgewotICAgIHB1YmxpYzoKLSAgICAgICAgTmFtZWRSZWFkZXIoKSB7IG1OYW1lWzBdID0gJ1wwJzsgfSAvLyBmb3IgVmVjdG9yCi0gICAgICAgIE5hbWVkUmVhZGVyKGNvbnN0IHNwPE5CTG9nOjpSZWFkZXI+JiByZWFkZXIsIGNvbnN0IGNoYXIgKm5hbWUpIDoKLSAgICAgICAgICAgIG1SZWFkZXIocmVhZGVyKQotICAgICAgICAgICAgeyBzdHJsY3B5KG1OYW1lLCBuYW1lLCBzaXplb2YobU5hbWUpKTsgfQotICAgICAgICB+TmFtZWRSZWFkZXIoKSB7IH0KLSAgICAgICAgY29uc3Qgc3A8TkJMb2c6OlJlYWRlcj4mICByZWFkZXIoKSBjb25zdCB7IHJldHVybiBtUmVhZGVyOyB9Ci0gICAgICAgIGNvbnN0IGNoYXIqICAgICAgICAgICAgICAgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBzcDxOQkxvZzo6UmVhZGVyPiAgIG1SZWFkZXI7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heE5hbWUgPSAzMjsKLSAgICAgICAgY2hhciAgICAgICAgICAgICAgICBtTmFtZVtrTWF4TmFtZV07Ci0gICAgfTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlYWQgZGF0YSBmcm9tIGVhY2ggdGhyZWFkJ3MgaW5kaXZpZHVhbCBGSUZPIGluIHNoYXJlZCBtZW1vcnkKLSAgICAvLyBhbmQgd3JpdGUgaXQgdG8gYSBzaW5nbGUgRklGTyBpbiBsb2NhbCBtZW1vcnkuCi0gICAgY2xhc3MgTWVyZ2VyIDogcHVibGljIFJlZkJhc2UgewotICAgIHB1YmxpYzoKLSAgICAgICAgTWVyZ2VyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOwotCi0gICAgICAgIHZpcnR1YWwgfk1lcmdlcigpIHt9Ci0KLSAgICAgICAgdm9pZCBhZGRSZWFkZXIoY29uc3QgTmFtZWRSZWFkZXIgJnJlYWRlcik7Ci0gICAgICAgIC8vIFRPRE8gYWRkIHJlbW92ZVJlYWRlcgotICAgICAgICB2b2lkIG1lcmdlKCk7Ci0KLSAgICAgICAgLy8gRklYTUUgVGhpcyBpcyByZXR1cm5pbmcgYSByZWZlcmVuY2UgdG8gYSBzaGFyZWQgdmFyaWFibGUgdGhhdCBuZWVkcyBhIGxvY2sKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TmFtZWRSZWFkZXI+JiBnZXROYW1lZFJlYWRlcnMoKSBjb25zdDsKLQotICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIHZlY3RvciBvZiB0aGUgcmVhZGVycyB0aGUgbWVyZ2VyIGlzIHN1cHBvc2VkIHRvIG1lcmdlIGZyb20uCi0gICAgICAgIC8vIGV2ZXJ5IHJlYWRlciByZWFkcyBmcm9tIGEgd3JpdGVyJ3MgYnVmZmVyCi0gICAgICAgIC8vIEZJWE1FIE5lZWRzIHRvIGJlIHByb3RlY3RlZCBieSBhIGxvY2sKLSAgICAgICAgc3RkOjp2ZWN0b3I8TmFtZWRSZWFkZXI+IG1OYW1lZFJlYWRlcnM7Ci0KLSAgICAgICAgU2hhcmVkICogY29uc3QgbVNoYXJlZDsgLy8gcmF3IHBvaW50ZXIgdG8gc2hhcmVkIG1lbW9yeQotICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8YXVkaW9fdXRpbHNfZmlmbz4gbUZpZm87IC8vIEZJRk8gaXRzZWxmCi0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxhdWRpb191dGlsc19maWZvX3dyaXRlcj4gbUZpZm9Xcml0ZXI7IC8vIHVzZWQgdG8gd3JpdGUgdG8gRklGTwotICAgIH07Ci0KLSAgICAvLyBUaGlzIGNsYXNzIGhhcyBhIHBvaW50ZXIgdG8gdGhlIEZJRk8gaW4gbG9jYWwgbWVtb3J5IHdoaWNoIHN0b3JlcyB0aGUgbWVyZ2VkCi0gICAgLy8gZGF0YSBjb2xsZWN0ZWQgYnkgTkJMb2c6Ok1lcmdlciBmcm9tIGFsbCBOYW1lZFJlYWRlcnMuIEl0IGlzIHVzZWQgdG8gcHJvY2VzcwotICAgIC8vIHRoaXMgZGF0YSBhbmQgd3JpdGUgdGhlIHJlc3VsdCB0byBQZXJmb3JtYW5jZUFuYWx5c2lzLgotICAgIGNsYXNzIE1lcmdlUmVhZGVyIDogcHVibGljIFJlYWRlciB7Ci0gICAgcHVibGljOgotICAgICAgICBNZXJnZVJlYWRlcihjb25zdCB2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplLCBNZXJnZXIgJm1lcmdlcik7Ci0KLSAgICAgICAgdm9pZCBkdW1wKGludCBmZCwgaW50IGluZGVudCA9IDApOwotICAgICAgICAvLyBwcm9jZXNzIGEgcGFydGljdWxhciBzbmFwc2hvdCBvZiB0aGUgcmVhZGVyCi0gICAgICAgIHZvaWQgZ2V0QW5kUHJvY2Vzc1NuYXBzaG90KFNuYXBzaG90ICYgc25hcCk7Ci0gICAgICAgIC8vIGNhbGwgZ2V0U25hcHNob3Qgb2YgdGhlIGNvbnRlbnQgb2YgdGhlIHJlYWRlcidzIGJ1ZmZlciBhbmQgcHJvY2VzcyB0aGUgZGF0YQotICAgICAgICB2b2lkIGdldEFuZFByb2Nlc3NTbmFwc2hvdCgpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgLy8gRklYTUUgTmVlZHMgdG8gYmUgcHJvdGVjdGVkIGJ5IGEgbG9jaywKLSAgICAgICAgLy8gICAgICAgYmVjYXVzZSBldmVuIHRob3VnaCBvdXIgdXNlIG9mIGl0IGlzIHJlYWQtb25seSB0aGVyZSBtYXkgYmUgYXN5bmNocm9ub3VzIHVwZGF0ZXMKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TmFtZWRSZWFkZXI+JiBtTmFtZWRSZWFkZXJzOwotCi0gICAgICAgIC8vIGFuYWx5emVzLCBjb21wcmVzc2VzIGFuZCBzdG9yZXMgdGhlIG1lcmdlZCBkYXRhCi0gICAgICAgIC8vIGNvbnRhaW5zIGEgc2VwYXJhdGUgaW5zdGFuY2UgZm9yIGV2ZXJ5IGF1dGhvciAodGhyZWFkKSwgYW5kIGZvciBldmVyeSBzb3VyY2UgZmlsZQotICAgICAgICAvLyBsb2NhdGlvbiB3aXRoaW4gZWFjaCBhdXRob3IKLSAgICAgICAgUmVwb3J0UGVyZm9ybWFuY2U6OlBlcmZvcm1hbmNlQW5hbHlzaXNNYXAgbVRocmVhZFBlcmZvcm1hbmNlQW5hbHlzaXM7Ci0KLSAgICAgICAgLy8gaGFuZGxlIGF1dGhvciBlbnRyeSBieSBsb29raW5nIHVwIHRoZSBhdXRob3IncyBuYW1lIGFuZCBhcHBlbmRpbmcgaXQgdG8gdGhlIGJvZHkKLSAgICAgICAgLy8gcmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVhZCBmcm9tIGZtdEVudHJ5Ci0gICAgICAgIHZvaWQgaGFuZGxlQXV0aG9yKGNvbnN0IEFic3RyYWN0RW50cnkgJmZtdEVudHJ5LCBTdHJpbmc4ICpib2R5KTsKLSAgICB9OwotCi0gICAgLy8gTWVyZ2VUaHJlYWQgaXMgYSB0aHJlYWQgdGhhdCBjb250YWlucyBhIE1lcmdlci4gSXQgd29ya3MgYXMgYSByZXRyaWdnZXJhYmxlIG9uZS1zaG90OgotICAgIC8vIHdoZW4gdHJpZ2dlcmVkLCBpdCBhd2FrZXMgZm9yIGEgbGFwc2Ugb2YgdGltZSwgZHVyaW5nIHdoaWNoIGl0IHBlcmlvZGljYWxseSBtZXJnZXM7IGlmCi0gICAgLy8gcmV0cmlnZ2VyZWQsIHRoZSB0aW1lb3V0IGlzIHJlc2V0LgotICAgIC8vIFRoZSB0aHJlYWQgaXMgdHJpZ2dlcmVkIG9uIEF1ZGlvRmxpbmdlciBiaW5kZXIgYWN0aXZpdHkuCi0gICAgY2xhc3MgTWVyZ2VUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIE1lcmdlVGhyZWFkKE1lcmdlciAmbWVyZ2VyLCBNZXJnZVJlYWRlciAmbWVyZ2VSZWFkZXIpOwotICAgICAgICB2aXJ0dWFsIH5NZXJnZVRocmVhZCgpIG92ZXJyaWRlOwotCi0gICAgICAgIC8vIFJlc2V0IHRpbWVvdXQgYW5kIGFjdGl2YXRlIHRocmVhZCB0byBtZXJnZSBwZXJpb2RpY2FsbHkgaWYgaXQncyBpZGxlCi0gICAgICAgIHZvaWQgd2FrZXVwKCk7Ci0KLSAgICAgICAgLy8gU2V0IHRpbWVvdXQgcGVyaW9kIHVudGlsIHRoZSBtZXJnaW5nIHRocmVhZCBnb2VzIGlkbGUgYWdhaW4KLSAgICAgICAgdm9pZCBzZXRUaW1lb3V0VXMoaW50IHRpbWUpOwotCi0gICAgcHJpdmF0ZToKLSAgICAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKSBvdmVycmlkZTsKLQotICAgICAgICAvLyB0aGUgbWVyZ2VyIHdobyBhY3R1YWxseSBkb2VzIHRoZSB3b3JrIG9mIG1lcmdpbmcgdGhlIGxvZ3MKLSAgICAgICAgTWVyZ2VyJiAgICAgbU1lcmdlcjsKLQotICAgICAgICAvLyB0aGUgbWVyZ2VyZWFkZXIgdXNlZCB0byBwcm9jZXNzIGRhdGEgbWVyZ2VkIGJ5IG1NZXJnZXIKLSAgICAgICAgTWVyZ2VSZWFkZXImIG1NZXJnZVJlYWRlcjsKLQotICAgICAgICAvLyBtdXRleCBmb3IgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZQotICAgICAgICBNdXRleCAgICAgICBtTXV0ZXg7Ci0KLSAgICAgICAgLy8gY29uZGl0aW9uIHZhcmlhYmxlIHRvIGFjdGl2YXRlIG1lcmdpbmcgb24gdGltZW91dCA+PSAwCi0gICAgICAgIENvbmRpdGlvbiAgIG1Db25kOwotCi0gICAgICAgIC8vIHRpbWUgbGVmdCB1bnRpbCB0aGUgdGhyZWFkIGJsb2NrcyBhZ2FpbiAoaW4gbWljcm9zZWNvbmRzKQotICAgICAgICBpbnQgICAgICAgICBtVGltZW91dFVzOwotCi0gICAgICAgIC8vIG1lcmdpbmcgcGVyaW9kIHdoZW4gdGhlIHRocmVhZCBpcyBhd2FrZQotICAgICAgICBzdGF0aWMgY29uc3QgaW50ICBrVGhyZWFkU2xlZXBQZXJpb2RVcyA9IDEwMDAwMDAgLyoxcyovOwotCi0gICAgICAgIC8vIGluaXRpYWwgdGltZW91dCB2YWx1ZSB3aGVuIHRyaWdnZXJlZAotICAgICAgICBzdGF0aWMgY29uc3QgaW50ICBrVGhyZWFkV2FrZXVwUGVyaW9kVXMgPSAzMDAwMDAwIC8qM3MqLzsKLSAgICB9OwotCi19OyAgLy8gY2xhc3MgTkJMb2cKLQotLy8gVE9ETyBwdXQgc29tZXdoZXJlIGVsc2UKLXN0YXRpYyBpbmxpbmUgaW50NjRfdCBnZXRfbW9ub3RvbmljX25zKCkgewotICAgIHRpbWVzcGVjIHRzOwotICAgIGlmIChjbG9ja19nZXR0aW1lKENMT0NLX01PTk9UT05JQywgJnRzKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAodWludDY0X3QpIHRzLnR2X3NlYyAqIDEwMDAgKiAxMDAwICogMTAwMCArIHRzLnR2X25zZWM7Ci0gICAgfQotICAgIHJldHVybiAwOyAvLyBzaG91bGQgbm90IGhhcHBlbi4KLX0KLQotfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvRW50cnkuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FdmVudHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9SZWFkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9UaW1lbGluZS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL1dyaXRlci5oPgogCiAjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfTkJMT0dfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9QZXJmb3JtYW5jZUFuYWx5c2lzLmggYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaAppbmRleCBkZGZlOWQ2Li5kN2MxNmI2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaAorKysgYi9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1BlcmZvcm1hbmNlQW5hbHlzaXMuaApAQCAtMTksMTQgKzE5LDE3NiBAQAogCiAjaW5jbHVkZSA8ZGVxdWU+CiAjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmg+CisjaW5jbHVkZSA8dXRpbHMvVGltZXJzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorY2xhc3MgU3RyaW5nODsKKwogbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKIAorLy8gVE9ETyBtYWtlIHRoaXMgYSB0ZW1wbGF0ZWQgY2xhc3MgYW5kIHB1dCBpdCBpbiBhIHNlcGFyYXRlIGZpbGUuCisvLyBUaGUgdGVtcGxhdGVkIHBhcmFtZXRlcnMgd291bGQgYmUgYmluIHNpemUgYW5kIGxvdyBsaW1pdC4KKy8qCisgKiBIaXN0b2dyYW0gcHJvdmlkZXMgYSB3YXkgdG8gc3RvcmUgbnVtZXJpYyBkYXRhIGluIGhpc3RvZ3JhbSBmb3JtYXQgYW5kIHJlYWQgaXQgYXMgYSBzZXJpYWxpemVkCisgKiBzdHJpbmcuIFRoZSB0ZXJtcyAiYmluIiBhbmQgImJ1Y2tldCIgYXJlIHVzZWQgaW50ZXJjaGFuZ2VhYmx5LgorICoKKyAqIFRoaXMgY2xhc3MgaXMgbm90IHRocmVhZC1zYWZlLgorICovCitjbGFzcyBIaXN0b2dyYW0geworcHVibGljOgorICAgIHN0cnVjdCBDb25maWcgeworICAgICAgICBjb25zdCBkb3VibGUgYmluU2l6ZTsgICAvLyBUT0RPIHRlbXBsYXRlIHR5cGUKKyAgICAgICAgY29uc3Qgc2l6ZV90IG51bUJpbnM7CisgICAgICAgIGNvbnN0IGRvdWJsZSBsb3c7ICAgICAgIC8vIFRPRE8gdGVtcGxhdGUgdHlwZQorICAgIH07CisKKyAgICAvLyBIaXN0b2dyYW1zIGFyZSBjb25zdHJ1Y3RlZCB3aXRoIGZpeGVkIGNvbmZpZ3VyYXRpb24gbnVtYmVycy4gRHluYW1pYyBjb25maWd1cmF0aW9uIGJhc2VkCisgICAgLy8gdGhlIGRhdGEgaXMgcG9zc2libGUgYnV0IGNvbXBsZXggYmVjYXVzZQorICAgIC8vIC0gZGF0YSBwb2ludHMgYXJlIGFkZGVkIG9uZSBieSBvbmUsIG5vdCBwcm9jZXNzZWQgYXMgYSBiYXRjaC4KKyAgICAvLyAtIEhpc3RvZ3JhbXMgd2l0aCBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGFyZSB0cmlja3kgdG8gYWdncmVnYXRlLCBhbmQgdGhleQorICAgIC8vICAgd2lsbCBuZWVkIHRvIGJlIGFnZ3JlZ2F0ZWQgYXQgdGhlIE1lZGlhIE1ldHJpY3MgY2xvdWQgc2lkZS4KKyAgICAvLyAtIG5vdCBwcm92aWRpbmcgbGltaXRzIHRoZW9yZXRpY2FsbHkgYWxsb3dzIGZvciBpbmZpbml0ZSBudW1iZXIgb2YgYnVja2V0cy4KKworICAgIC8qKgorICAgICAqIFxicmllZiBDcmVhdGVzIGEgSGlzdG9ncmFtIG9iamVjdC4KKyAgICAgKgorICAgICAqIFxwYXJhbSBiaW5TaXplIHRoZSB3aWR0aCBvZiBlYWNoIGJpbiBvZiB0aGUgaGlzdG9ncmFtLCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLgorICAgICAqICAgICAgICAgICAgICAgIFVuaXRzIGFyZSB3aGF0ZXZlciBkYXRhIHRoZSBjYWxsZXIgZGVjaWRlcyB0byBzdG9yZS4KKyAgICAgKiBccGFyYW0gbnVtQmlucyB0aGUgbnVtYmVyIG9mIGJpbnMgZGVzaXJlZCBpbiB0aGUgaGlzdG9ncmFtIHJhbmdlLCBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAwLgorICAgICAqIFxwYXJhbSBsb3cgICAgIHRoZSBsb3dlciBib3VuZCBvZiB0aGUgaGlzdG9ncmFtIGJ1Y2tldCB2YWx1ZXMuCisgICAgICogICAgICAgICAgICAgICAgVW5pdHMgYXJlIHdoYXRldmVyIGRhdGEgdGhlIGNhbGxlciBkZWNpZGVzIHRvIHN0b3JlLgorICAgICAqICAgICAgICAgICAgICAgIE5vdGUgdGhhdCB0aGUgdXBwZXIgYm91bmQgY2FuIGJlIGNhbGN1bGF0ZWQgYnkgdGhlIGZvbGxvd2luZzoKKyAgICAgKiAgICAgICAgICAgICAgICAgIHVwcGVyID0gbG93ZXIgKyBiaW5TaXplICogbnVtQmlucy4KKyAgICAgKi8KKyAgICBIaXN0b2dyYW0oZG91YmxlIGJpblNpemUsIHNpemVfdCBudW1CaW5zLCBkb3VibGUgbG93ID0gMC4pCisgICAgICAgIDogbUJpblNpemUoYmluU2l6ZSksIG1OdW1CaW5zKG51bUJpbnMpLCBtTG93KGxvdyksIG1CaW5zKG1OdW1CaW5zICsgMikge30KKworICAgIEhpc3RvZ3JhbShjb25zdCBDb25maWcgJmMpCisgICAgICAgIDogSGlzdG9ncmFtKGMuYmluU2l6ZSwgYy5udW1CaW5zLCBjLmxvdykge30KKworICAgIC8qKgorICAgICAqIFxicmllZiBBZGQgYSBkYXRhIHBvaW50IHRvIHRoZSBoaXN0b2dyYW0uIFRoZSB2YWx1ZSBvZiB0aGUgZGF0YSBwb2ludAorICAgICAqICAgICAgICBpcyByb3VuZGVkIHRvIHRoZSBuZWFyZXN0IG11bHRpcGxlIG9mIHRoZSBiaW4gc2l6ZSAoYmVmb3JlIGFjY291bnRpbmcKKyAgICAgKiAgICAgICAgZm9yIHRoZSBsb3dlciBib3VuZCBvZmZzZXQsIHdoaWNoIG1heSBub3QgYmUgYSBtdWx0aXBsZSBvZiB0aGUgYmluIHNpemUpLgorICAgICAqCisgICAgICogXHBhcmFtIHZhbHVlIHRoZSB2YWx1ZSBvZiB0aGUgZGF0YSBwb2ludCB0byBhZGQuCisgICAgICovCisgICAgdm9pZCBhZGQoZG91YmxlIHZhbHVlKTsKKworICAgIC8qKgorICAgICAqIFxicmllZiBSZW1vdmVzIGFsbCBkYXRhIHBvaW50cyBmcm9tIHRoZSBoaXN0b2dyYW0uCisgICAgICovCisgICAgdm9pZCBjbGVhcigpOworCisgICAgLyoqCisgICAgICogXGJyaWVmIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBkYXRhIHBvaW50cyBhZGRlZCB0byB0aGUgaGlzdG9ncmFtLgorICAgICAqCisgICAgICogXHJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIGRhdGEgcG9pbnRzIGluIHRoZSBoaXN0b2dyYW0uCisgICAgICovCisgICAgdWludDY0X3QgdG90YWxDb3VudCgpIGNvbnN0OworCisgICAgLyoqCisgICAgICogXGJyaWVmIFNlcmlhbGl6ZXMgdGhlIGhpc3RvZ3JhbSBpbnRvIGEgc3RyaW5nLiBUaGUgZm9ybWF0IGlzIGNob3NlbiB0byBiZSBjb21wYXRpYmxlIHdpdGgKKyAgICAgKiAgICAgICAgdGhlIGhpc3RvZ3JhbSByZXByZXNlbnRhdGlvbiB0byBzZW5kIHRvIHRoZSBNZWRpYSBNZXRyaWNzIHNlcnZpY2UuCisgICAgICoKKyAgICAgKiAgICAgICAgVGhlIHN0cmluZyBpcyBhcyBmb2xsb3dzOgorICAgICAqICAgICAgICAgIGJpblNpemUsbnVtQmlucyxsb3csey0xfGxvd0NvdW50LC4uLixiaW5JbmRleHxjb3VudCwuLi4sbnVtQmluc3xoaWdoQ291bnR9CisgICAgICoKKyAgICAgKiAgICAgICAgLSBiaW5JbmRleCBpcyBhbiBpbnRlZ2VyIHdpdGggMCA8PSBiaW5JbmRleCA8IG51bUJpbnMuCisgICAgICogICAgICAgIC0gY291bnQgaXMgdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiB0aGUgKHJvdW5kZWQpIHZhbHVlCisgICAgICogICAgICAgICAgbG93ICsgYmluU2l6ZSAqIGJ1Y2tldEluZGV4LgorICAgICAqICAgICAgICAtIGxvd0NvdW50IGlzIHRoZSBudW1iZXIgb2YgKHJvdW5kZWQpIHZhbHVlcyBsZXNzIHRoYW4gbG93LgorICAgICAqICAgICAgICAtIGhpZ2hDb3VudCBpcyB0aGUgbnVtYmVyIG9mIChyb3VuZGVkKSB2YWx1ZXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvCisgICAgICogICAgICAgICAgbG93ICsgYmluU2l6ZSAqIG51bUJpbnMuCisgICAgICogICAgICAgIC0gYSBiaW5JbmRleCBtYXkgYmUgc2tpcHBlZCBpZiBpdHMgY291bnQgaXMgMC4KKyAgICAgKgorICAgICAqIFxyZXR1cm4gdGhlIGhpc3RvZ3JhbSBzZXJpYWxpemVkIGFzIGEgc3RyaW5nLgorICAgICAqLworICAgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKCkgY29uc3Q7CisKKyAgICAvLyBEcmF3IGxvZyBzY2FsZSBzaWRld2F5cyBoaXN0b2dyYW0gYXMgQVNDSUkgYXJ0IGFuZCBzdG9yZSBhcyBhIHN0ZDo6c3RyaW5nLgorICAgIC8vIEVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCBpZiB0b3RhbENvdW50KCkgPT0gMC4KKyAgICBzdGQ6OnN0cmluZyBhc2NpaUFydFN0cmluZyhzaXplX3QgaW5kZW50ID0gMCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgLy8gSGlzdG9ncmFtIHZlcnNpb24gbnVtYmVyLgorICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtWZXJzaW9uID0gMTsKKworICAgIGNvbnN0IGRvdWJsZSBtQmluU2l6ZTsgICAgICAgICAgLy8gU2l6ZSBvZiBlYWNoIGJ1Y2tldAorICAgIGNvbnN0IHNpemVfdCBtTnVtQmluczsgICAgICAgICAgLy8gTnVtYmVyIG9mIGJ1Y2tldHMgaW4gcmFuZ2UgKGV4Y2x1ZGVzIGxvdyBhbmQgaGlnaCkKKyAgICBjb25zdCBkb3VibGUgbUxvdzsgICAgICAgICAgICAgIC8vIExvd2VyIGJvdW5kIG9mIHZhbHVlcworCisgICAgLy8gRGF0YSBzdHJ1Y3R1cmUgdG8gc3RvcmUgdGhlIGFjdHVhbCBoaXN0b2dyYW0uIENvdW50cyBvZiBiaW4gdmFsdWVzIGxlc3MgdGhhbiBtTG93CisgICAgLy8gYXJlIHN0b3JlZCBpbiBtQmluc1swXS4gQmluIGluZGV4IGkgY29ycmVzcG9uZHMgdG8gbUJpbnNbaSsxXS4gQ291bnRzIG9mIGJpbiB2YWx1ZXMKKyAgICAvLyA+PSBoaWdoIGFyZSBzdG9yZWQgaW4gbUJpbnNbbU51bUJpbnMgKyAxXS4KKyAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gbUJpbnM7CisKKyAgICB1aW50NjRfdCBtVG90YWxDb3VudCA9IDA7ICAgICAgIC8vIFRvdGFsIG51bWJlciBvZiB2YWx1ZXMgcmVjb3JkZWQKK307CisKKy8vIFRoaXMgaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgY2xhc3MgUGVyZm9ybWFuY2VBbmFseXNpcywgYnV0IFBlcmZvcm1hbmNlQW5hbHlzaXMKKy8vIGFsc28gZG9lcyBzb21lIGFkZGl0aW9uYWwgYW5hbHl6aW5nIG9mIGRhdGEsIHdoaWxlIHRoZSBwdXJwb3NlIG9mIHRoaXMgc3RydWN0IGlzCisvLyB0byBob2xkIGRhdGEuCitzdHJ1Y3QgUGVyZm9ybWFuY2VEYXRhIHsKKyAgICAvLyBUT0RPIHRoZSBIaXN0b2dyYW06OkNvbmZpZyBudW1iZXJzIGJlbG93IGFyZSBmb3IgRmFzdE1peGVyLgorICAgIC8vIFNwZWNpZnkgZGlmZmVyZW50IG51bWJlcnMgZm9yIG90aGVyIHRocmVhZCB0eXBlcy4KKworICAgIC8vIFZhbHVlcyBiYXNlZCBvbiBtVW5kZXJydW5OcyBhbmQgbU92ZXJydW5OcyBpbiBGYXN0TWl4ZXIuY3BwIGZvciBmcmFtZUNvdW50ID0gMTkyCisgICAgLy8gYW5kIG1TYW1wbGVSYXRlID0gNDgwMDAsIHdoaWNoIGNvcnJlc3BvbmQgdG8gMiBhbmQgNyBzZWNvbmRzLgorICAgIHN0YXRpYyBjb25zdGV4cHIgSGlzdG9ncmFtOjpDb25maWcga1dvcmtDb25maWcgPSB7IDAuMjUsIDIwLCAyLn07CisKKyAgICAvLyBWYWx1ZXMgYmFzZWQgb24gdHJpYWwgYW5kIGVycm9yIGxvZ2dpbmcuIE5lZWQgYSBiZXR0ZXIgd2F5IHRvIGRldGVybWluZQorICAgIC8vIGJpbiBzaXplIGFuZCBsb3dlci91cHBlciBsaW1pdHMuCisgICAgc3RhdGljIGNvbnN0ZXhwciBIaXN0b2dyYW06OkNvbmZpZyBrTGF0ZW5jeUNvbmZpZyA9IHsgMi4sIDEwLCAxMC59OworCisgICAgLy8gVmFsdWVzIGJhc2VkIG9uIHRyaWFsIGFuZCBlcnJvciBsb2dnaW5nLiBOZWVkIGEgYmV0dGVyIHdheSB0byBkZXRlcm1pbmUKKyAgICAvLyBiaW4gc2l6ZSBhbmQgbG93ZXIvdXBwZXIgbGltaXRzLgorICAgIHN0YXRpYyBjb25zdGV4cHIgSGlzdG9ncmFtOjpDb25maWcga1dhcm11cENvbmZpZyA9IHsgNS4sIDEwLCAxMC59OworCisgICAgTkJMb2c6OnRocmVhZF9pbmZvX3QgdGhyZWFkSW5mb3t9OworICAgIE5CTG9nOjp0aHJlYWRfcGFyYW1zX3QgdGhyZWFkUGFyYW1ze307CisKKyAgICAvLyBQZXJmb3JtYW5jZSBEYXRhCisgICAgSGlzdG9ncmFtIHdvcmtIaXN0e2tXb3JrQ29uZmlnfTsKKyAgICBIaXN0b2dyYW0gbGF0ZW5jeUhpc3R7a0xhdGVuY3lDb25maWd9OworICAgIEhpc3RvZ3JhbSB3YXJtdXBIaXN0e2tXYXJtdXBDb25maWd9OworICAgIGludDY0X3QgdW5kZXJydW5zID0gMDsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBrTWF4U25hcHNob3RzVG9TdG9yZSA9IDI1NjsKKyAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjxOQkxvZzo6RXZlbnQsIGludDY0X3QgLyp0aW1lc3RhbXAqLz4+IHNuYXBzaG90czsKKyAgICBpbnQ2NF90IG92ZXJydW5zID0gMDsKKyAgICBuc2Vjc190IGFjdGl2ZSA9IDA7CisgICAgbnNlY3NfdCBzdGFydHtzeXN0ZW1UaW1lKCl9OworCisgICAgLy8gUmVzZXQgdGhlIHBlcmZvcm1hbmNlIGRhdGEuIFRoaXMgZG9lcyBub3QgcmVwcmVzZW50IGEgdGhyZWFkIHN0YXRlIGNoYW5nZS4KKyAgICAvLyBUaHJlYWQgaW5mbyBpcyBub3QgcmVzZXQgaGVyZSBiZWNhdXNlIHRoZSBkYXRhIGlzIG1lYW50IHRvIGJlIGEgY29udGludWF0aW9uIG9mIHRoZSB0aHJlYWQKKyAgICAvLyB0aGF0IHN0cnVjdCBQZXJmb3JtYW5jZURhdGEgaXMgYXNzb2NpYXRlZCB3aXRoLgorICAgIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIHdvcmtIaXN0LmNsZWFyKCk7CisgICAgICAgIGxhdGVuY3lIaXN0LmNsZWFyKCk7CisgICAgICAgIHdhcm11cEhpc3QuY2xlYXIoKTsKKyAgICAgICAgdW5kZXJydW5zID0gMDsKKyAgICAgICAgb3ZlcnJ1bnMgPSAwOworICAgICAgICBhY3RpdmUgPSAwOworICAgICAgICBzdGFydCA9IHN5c3RlbVRpbWUoKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBwZXJmb3JtYW5jZSBkYXRhIGhhcyBub3QgYmVlbiByZWNvcmRlZCB5ZXQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIGVtcHR5KCkgY29uc3QgeworICAgICAgICByZXR1cm4gd29ya0hpc3QudG90YWxDb3VudCgpID09IDAgJiYgbGF0ZW5jeUhpc3QudG90YWxDb3VudCgpID09IDAKKyAgICAgICAgICAgICAgICAmJiB3YXJtdXBIaXN0LnRvdGFsQ291bnQoKSA9PSAwICYmIHVuZGVycnVucyA9PSAwICYmIG92ZXJydW5zID09IDAKKyAgICAgICAgICAgICAgICAmJiBhY3RpdmUgPT0gMDsKKyAgICB9Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiBjbGFzcyBQZXJmb3JtYW5jZUFuYWx5c2lzOwogCiAvLyBhIG1hcCBvZiBQZXJmb3JtYW5jZUFuYWx5c2lzIGluc3RhbmNlcwpAQCAtODAsNyArMjQyLDcgQEAKICAgICBzdGQ6OmRlcXVlPHRpbWVzdGFtcD4gbVBlYWtUaW1lc3RhbXBzOwogCiAgICAgLy8gc3RvcmVzIGJ1ZmZlciBwZXJpb2QgaGlzdG9ncmFtcyB3aXRoIHRpbWVzdGFtcCBvZiBmaXJzdCBzYW1wbGUKLSAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3RvZ3JhbT4+IG1IaXN0czsKKyAgICBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3Q+PiBtSGlzdHM7CiAKICAgICAvLyBQYXJhbWV0ZXJzIHVzZWQgd2hlbiBkZXRlY3Rpbmcgb3V0bGllcnMKICAgICBzdHJ1Y3QgQnVmZmVyUGVyaW9kIHsKQEAgLTExOSw4ICsyODEsNyBAQAogdm9pZCBkdW1wKGludCBmZCwgaW50IGluZGVudCwgUGVyZm9ybWFuY2VBbmFseXNpc01hcCAmdGhyZWFkUGVyZm9ybWFuY2VBbmFseXNpcyk7CiB2b2lkIGR1bXBMaW5lKGludCBmZCwgaW50IGluZGVudCwgY29uc3QgU3RyaW5nOCAmYm9keSk7CiAKLX0gLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCi0KK30gICAvLyBuYW1lc3BhY2UgUmVwb3J0UGVyZm9ybWFuY2UKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfUEVSRk9STUFOQ0VBTkFMWVNJU19ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlYWRlci5oIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDk1ZThjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZWFkZXIuaApAQCAtMCwwICsxLDEzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9NRURJQV9OQkxPR19SRUFERVJfSAorI2RlZmluZSBBTkRST0lEX01FRElBX05CTE9HX1JFQURFUl9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKKyNpbmNsdWRlIDxtZWRpYS9uYmxvZy9FbnRyeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworY2xhc3MgYXVkaW9fdXRpbHNfZmlmbzsKK2NsYXNzIGF1ZGlvX3V0aWxzX2ZpZm9fcmVhZGVyOworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIElNZW1vcnk7CitjbGFzcyBTdHJpbmc4OworCituYW1lc3BhY2UgTkJMb2cgeworCitzdHJ1Y3QgU2hhcmVkOworCisvLyBOQkxvZyBSZWFkZXIgQVBJCisKK2NsYXNzIFNuYXBzaG90OyAgICAgLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBuZWVkZWQgZm9yIFJlYWRlcjo6Z2V0U25hcHNob3QoKQorCitjbGFzcyBSZWFkZXIgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgorICAgIC8vIFRoZSBzaXplIG9mIHRoZSBzaGFyZWQgbWVtb3J5IG11c3QgYmUgYXQgbGVhc3QgVGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkuCisgICAgUmVhZGVyKGNvbnN0IHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUsIGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKTsKKyAgICBSZWFkZXIoY29uc3Qgc3A8SU1lbW9yeT4mIGlNZW1vcnksIHNpemVfdCBzaXplLCBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSk7CisgICAgflJlYWRlcigpIG92ZXJyaWRlOworCisgICAgLy8gZ2V0IHNuYXBzaG90IG9mIHJlYWRlcnMgZmlmbyBidWZmZXIsIGVmZmVjdGl2ZWx5IGNvbnN1bWluZyB0aGUgYnVmZmVyCisgICAgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBnZXRTbmFwc2hvdChib29sIGZsdXNoID0gdHJ1ZSk7CisgICAgYm9vbCAgICAgaXNJTWVtb3J5KGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5KSBjb25zdDsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisKK3ByaXZhdGU6CisgICAgLy8gQW1vdW50IG9mIHRyaWVzIGZvciByZWFkZXIgdG8gY2F0Y2ggdXAgd2l0aCB3cml0ZXIgaW4gZ2V0U25hcHNob3QoKS4KKyAgICBzdGF0aWMgY29uc3RleHByIGludCBrTWF4T2J0YWluVHJpZXMgPSAzOworCisgICAgLy8gaW52YWxpZEJlZ2luVHlwZXMgYW5kIGludmFsaWRFbmRUeXBlcyBhcmUgdXNlZCB0byBhbGlnbiB0aGUgU25hcHNob3Q6OmJlZ2luKCkgYW5kCisgICAgLy8gU25hcHNob3Q6OmVuZCgpIEVudHJ5SXRlcmF0b3JzIHRvIHZhbGlkIGVudHJpZXMuCisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxFdmVudD4gaW52YWxpZEJlZ2luVHlwZXM7CisgICAgc3RhdGljIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxFdmVudD4gaW52YWxpZEVuZFR5cGVzOworCisgICAgLy8gZGVjbGFyZWQgYXMgY29uc3QgYmVjYXVzZSBhdWRpb191dGlsc19maWZvKCkgY29uc3RydWN0b3IKKyAgICBzcDxJTWVtb3J5PiBtSU1lbW9yeTsgICAgICAgLy8gcmVmLWNvdW50ZWQgdmVyc2lvbiwgYXNzaWduZWQgb25seSBpbiBjb25zdHJ1Y3RvcgorCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbU5hbWU7ICAgICAgICAgICAgLy8gbmFtZSBvZiByZWFkZXIgKGFjdHVhbGx5IG5hbWUgb2Ygd3JpdGVyKQorICAgIC8qY29uc3QqLyBTaGFyZWQqIGNvbnN0IG1TaGFyZWQ7ICAgIC8vIHJhdyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnksIGFjdHVhbGx5IGNvbnN0IGJ1dCBub3QKKyAgICBhdWRpb191dGlsc19maWZvICogY29uc3QgbUZpZm87ICAgICAgICAgICAgICAgICAvLyBGSUZPIGl0c2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub24tTlVMTCB1bmxlc3MgY29uc3RydWN0b3IgZmFpbHMKKyAgICBhdWRpb191dGlsc19maWZvX3JlYWRlciAqIGNvbnN0IG1GaWZvUmVhZGVyOyAgICAvLyB1c2VkIHRvIHJlYWQgZnJvbSBGSUZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1OVUxMIHVubGVzcyBjb25zdHJ1Y3RvciBmYWlscworCisgICAgLy8gU2VhcmNoZXMgZm9yIHRoZSBsYXN0IHZhbGlkIGVudHJ5IGluIHRoZSByYW5nZSBbZnJvbnQsIGJhY2spCisgICAgLy8gYmFjayBoYXMgdG8gYmUgZW50cnktYWxpZ25lZC4gUmV0dXJucyBudWxscHRyIGlmIG5vbmUgZW5jb251bnRlcmVkLgorICAgIHN0YXRpYyBjb25zdCB1aW50OF90ICpmaW5kTGFzdFZhbGlkRW50cnkoY29uc3QgdWludDhfdCAqZnJvbnQsIGNvbnN0IHVpbnQ4X3QgKmJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX3NldDxFdmVudD4gJmludmFsaWRUeXBlcyk7Cit9OworCisvLyBBIHNuYXBzaG90IG9mIGEgcmVhZGVycyBidWZmZXIKKy8vIFRoaXMgaXMgcmF3IGRhdGEuIE5vIGFuYWx5c2lzIGhhcyBiZWVuIGRvbmUgb24gaXQKK2NsYXNzIFNuYXBzaG90IHsKK3B1YmxpYzoKKyAgICB+U25hcHNob3QoKSB7IGRlbGV0ZVtdIG1EYXRhOyB9CisKKyAgICAvLyBhbW91bnQgb2YgZGF0YSBsb3N0IChnaXZlbiBieSBhdWRpb191dGlsc19maWZvX3JlYWRlcikKKyAgICBzaXplX3QgbG9zdCgpIGNvbnN0IHsgcmV0dXJuIG1Mb3N0OyB9CisKKyAgICAvLyBpdGVyYXRvciB0byBiZWdpbm5pbmcgb2YgcmVhZGFibGUgc2VnbWVudCBvZiBzbmFwc2hvdAorICAgIC8vIGRhdGEgYmV0d2VlbiBiZWdpbiBhbmQgZW5kIGhhcyB2YWxpZCBlbnRyaWVzCisgICAgRW50cnlJdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIG1CZWdpbjsgfQorCisgICAgLy8gaXRlcmF0b3IgdG8gZW5kIG9mIHJlYWRhYmxlIHNlZ21lbnQgb2Ygc25hcHNob3QKKyAgICBFbnRyeUl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIG1FbmQ7IH0KKworcHJpdmF0ZToKKyAgICBTbmFwc2hvdCgpID0gZGVmYXVsdDsKKyAgICBleHBsaWNpdCBTbmFwc2hvdChzaXplX3QgYnVmZmVyU2l6ZSkgOiBtRGF0YShuZXcgdWludDhfdFtidWZmZXJTaXplXSkge30KKyAgICBmcmllbmQgc3RkOjp1bmlxdWVfcHRyPFNuYXBzaG90PiBSZWFkZXI6OmdldFNuYXBzaG90KGJvb2wgZmx1c2gpOworCisgICAgdWludDhfdCAqIGNvbnN0ICAgICAgIG1EYXRhID0gbnVsbHB0cjsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgbUxvc3QgPSAwOworICAgIEVudHJ5SXRlcmF0b3IgICAgICAgICBtQmVnaW47CisgICAgRW50cnlJdGVyYXRvciAgICAgICAgIG1FbmQ7Cit9OworCisvLyBUT0RPIG1vdmUgdGhpcyB0byBNZWRpYUxvZ1NlcnZpY2U/CitjbGFzcyBEdW1wUmVhZGVyIDogcHVibGljIE5CTG9nOjpSZWFkZXIgeworcHVibGljOgorICAgIER1bXBSZWFkZXIoY29uc3Qgdm9pZCAqc2hhcmVkLCBzaXplX3Qgc2l6ZSwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCisgICAgICAgIDogUmVhZGVyKHNoYXJlZCwgc2l6ZSwgbmFtZSkge30KKyAgICBEdW1wUmVhZGVyKGNvbnN0IHNwPElNZW1vcnk+JiBpTWVtb3J5LCBzaXplX3Qgc2l6ZSwgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCisgICAgICAgIDogUmVhZGVyKGlNZW1vcnksIHNpemUsIG5hbWUpIHt9CisgICAgdm9pZCBkdW1wKGludCBmZCwgc2l6ZV90IGluZGVudCA9IDApOworcHJpdmF0ZToKKyAgICB2b2lkIGhhbmRsZUF1dGhvcihjb25zdCBBYnN0cmFjdEVudHJ5JiBmbXRFbnRyeSBfX3VudXNlZCwgU3RyaW5nOCogYm9keSBfX3VudXNlZCkge30KKyAgICBFbnRyeUl0ZXJhdG9yIGhhbmRsZUZvcm1hdChjb25zdCBGb3JtYXRFbnRyeSAmZm10RW50cnksIFN0cmluZzggKnRpbWVzdGFtcCwgU3RyaW5nOCAqYm9keSk7CisKKyAgICBzdGF0aWMgdm9pZCAgICBhcHBlbmRJbnQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSk7CisgICAgc3RhdGljIHZvaWQgICAgYXBwZW5kRmxvYXQoU3RyaW5nOCAqYm9keSwgY29uc3Qgdm9pZCAqZGF0YSk7CisgICAgc3RhdGljIHZvaWQgICAgYXBwZW5kUElEKFN0cmluZzggKmJvZHksIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBsZW5ndGgpOworICAgIHN0YXRpYyB2b2lkICAgIGFwcGVuZFRpbWVzdGFtcChTdHJpbmc4ICpib2R5LCBjb25zdCB2b2lkICpkYXRhKTsKKworICAgIC8vIFRoZSBidWZmZXJEdW1wIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgZGVidWdnaW5nIG9ubHkuCisgICAgc3RhdGljIFN0cmluZzggYnVmZmVyRHVtcChjb25zdCB1aW50OF90ICpidWZmZXIsIHNpemVfdCBzaXplKTsKKyAgICBzdGF0aWMgU3RyaW5nOCBidWZmZXJEdW1wKGNvbnN0IEVudHJ5SXRlcmF0b3IgJml0KTsKK307CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfTkJMT0dfUkVBREVSX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvUmVwb3J0UGVyZm9ybWFuY2UuaAppbmRleCBlYzA4NDJmLi42NGE1NzAxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJuYmxvZy9pbmNsdWRlL21lZGlhL25ibG9nL1JlcG9ydFBlcmZvcm1hbmNlLmgKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9SZXBvcnRQZXJmb3JtYW5jZS5oCkBAIC0yMiwxOSArMjIsMzMgQEAKICNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gVGhlIFN0cmluZzggY2xhc3MgaXMgdXNlZCBieSByZXBvcnRQZXJmb3JtYW5jZSBmdW5jdGlvbgotY2xhc3MgU3RyaW5nODsKLQogbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlIHsKIAorc3RydWN0IFBlcmZvcm1hbmNlRGF0YTsKKworLy8gRHVtcHMgcGVyZm9ybWFuY2UgZGF0YSBpbiBhIEpTT04gZm9ybWF0Lgordm9pZCBkdW1wSnNvbihpbnQgZmQsIGNvbnN0IHN0ZDo6bWFwPGludCwgUGVyZm9ybWFuY2VEYXRhPiYgdGhyZWFkRGF0YU1hcCk7CisKKy8vRHVtcHMgcGVyZm9ybWFuY2UgZGF0YSBhcyB2aXN1YWxpemVkIHBsb3RzLgordm9pZCBkdW1wUGxvdHMoaW50IGZkLCBjb25zdCBzdGQ6Om1hcDxpbnQsIFBlcmZvcm1hbmNlRGF0YT4mIHRocmVhZERhdGFNYXApOworCisvLyBEdW1wcyBzbmFwc2hvdHMgYXQgaW1wb3J0YW50IGV2ZW50cyBpbiB0aGUgcGFzdC4KK3ZvaWQgZHVtcFJldHJvKGludCBmZCwgY29uc3Qgc3RkOjptYXA8aW50LCBQZXJmb3JtYW5jZURhdGE+JiB0aHJlYWREYXRhTWFwKTsKKworLy8gU2VuZCBvbmUgdGhyZWFkJ3MgZGF0YSB0byBtZWRpYSBtZXRyaWNzLCBpZiB0aGUgcGVyZm9ybWFuY2UgZGF0YSBpcyBub250cml2aWFsIChpLmUuIG5vdAorLy8gYWxsIHplcm8gdmFsdWVzKS4gUmV0dXJuIHRydWUgaWYgZGF0YSB3YXMgc2VudCwgZmFsc2UgaWYgdGhlcmUgaXMgbm90aGluZyB0byB3cml0ZQorLy8gb3IgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgd3JpdGluZy4KK2Jvb2wgc2VuZFRvTWVkaWFNZXRyaWNzKGNvbnN0IFBlcmZvcm1hbmNlRGF0YSYgZGF0YSk7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIGNvbnN0ZXhwciBpbnQga01zUGVyU2VjID0gMTAwMDsKIGNvbnN0ZXhwciBpbnQga1NlY1Blck1pbiA9IDYwOwogCiBjb25zdGV4cHIgaW50IGtKaWZmeVBlck1zID0gMTA7IC8vIHRpbWUgdW5pdCBmb3IgaGlzdG9ncmFtIGFzIGEgbXVsdGlwbGUgb2YgbWlsbGlzZWNvbmRzCiAKIC8vIHN0b3JlcyBhIGhpc3RvZ3JhbToga2V5OiBvYnNlcnZlZCBidWZmZXIgcGVyaW9kIChtdWx0aXBsZSBvZiBqaWZmeSkuIHZhbHVlOiBjb3VudAotdXNpbmcgSGlzdG9ncmFtID0gc3RkOjptYXA8aW50LCBpbnQ+OwordXNpbmcgSGlzdCA9IHN0ZDo6bWFwPGludCwgaW50PjsKIAogdXNpbmcgbXNJbnRlcnZhbCA9IGRvdWJsZTsKIHVzaW5nIGppZmZ5SW50ZXJ2YWwgPSBkb3VibGU7CkBAIC01NywxMyArNzEsMTIgQEAKIH0KIAogLy8gV3JpdGVzIG91dGxpZXIgaW50ZXJ2YWxzLCB0aW1lc3RhbXBzLCBwZWFrcyB0aW1lc3RhbXBzLCBhbmQgaGlzdG9ncmFtcyB0byBhIGZpbGUuCi12b2lkIHdyaXRlVG9GaWxlKGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPHRpbWVzdGFtcCwgSGlzdG9ncmFtPj4gJmhpc3RzLAordm9pZCB3cml0ZVRvRmlsZShjb25zdCBzdGQ6OmRlcXVlPHN0ZDo6cGFpcjx0aW1lc3RhbXAsIEhpc3Q+PiAmaGlzdHMsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZGVxdWU8c3RkOjpwYWlyPG1zSW50ZXJ2YWwsIHRpbWVzdGFtcD4+ICZvdXRsaWVyRGF0YSwKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpkZXF1ZTx0aW1lc3RhbXA+ICZwZWFrVGltZXN0YW1wcywKICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGtEaXJlY3RvcnksIGJvb2wgYXBwZW5kLCBpbnQgYXV0aG9yLCBsb2dfaGFzaF90IGhhc2gpOwogCi19IC8vIG5hbWVzcGFjZSBSZXBvcnRQZXJmb3JtYW5jZQotCit9ICAgLy8gbmFtZXNwYWNlIFJlcG9ydFBlcmZvcm1hbmNlCiB9ICAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBBTkRST0lEX01FRElBX1JFUE9SVFBFUkZPUk1BTkNFX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvVGltZWxpbmUuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvVGltZWxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGYwY2ZmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9UaW1lbGluZS5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfTkJMT0dfVElNRUxJTkVfSAorI2RlZmluZSBBTkRST0lEX01FRElBX05CTE9HX1RJTUVMSU5FX0gKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvZmlmb19pbmRleC5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIE5CTG9nIHsKKworLy8gTG9jYXRlZCBpbiBzaGFyZWQgbWVtb3J5LCBtdXN0IGJlIFBPRC4KKy8vIEV4YWN0bHkgb25lIHByb2Nlc3MgbXVzdCBleHBsaWNpdGx5IGNhbGwgdGhlIGNvbnN0cnVjdG9yIG9yIHVzZSBwbGFjZW1lbnQgbmV3LgorLy8gU2luY2UgdGhpcyBpcyBhIFBPRCwgdGhlIGRlc3RydWN0b3IgaXMgZW1wdHkgYW5kIHVubmVjZXNzYXJ5IHRvIGNhbGwgaXQgZXhwbGljaXRseS4KK3N0cnVjdCBTaGFyZWQgeworICAgIFNoYXJlZCgpIC8qIG1SZWFyIGluaXRpYWxpemVkIHZpYSBkZWZhdWx0IGNvbnN0cnVjdG9yICovIHt9CisgICAgflNoYXJlZCgpIHt9CisKKyAgICBhdWRpb191dGlsc19maWZvX2luZGV4ICBtUmVhcjsgIC8vIGluZGV4IG9uZSBieXRlIHBhc3QgdGhlIGVuZCBvZiBtb3N0IHJlY2VudCBFbnRyeQorICAgIGNoYXIgICAgbUJ1ZmZlclswXTsgICAgICAgICAgICAgLy8gY2lyY3VsYXIgYnVmZmVyIGZvciBlbnRyaWVzCit9OworCisvLyBGSVhNRSBUaW1lbGluZSB3YXMgaW50ZW5kZWQgdG8gd3JhcCBXcml0ZXIgYW5kIFJlYWRlciwgYnV0IGlzbid0IGFjdHVhbGx5IHVzZWQgeWV0LgorLy8gRm9yIG5vdyBpdCBpcyBqdXN0IGEgbmFtZXNwYWNlIGZvciBzaGFyZWRTaXplKCkuCitjbGFzcyBUaW1lbGluZSA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyNpZiAwCisgICAgVGltZWxpbmUoc2l6ZV90IHNpemUsIHZvaWQgKnNoYXJlZCA9IE5VTEwpOworICAgIHZpcnR1YWwgflRpbWVsaW5lKCk7CisjZW5kaWYKKworICAgIC8vIElucHV0IHBhcmFtZXRlciAnc2l6ZScgaXMgdGhlIGRlc2lyZWQgc2l6ZSBvZiB0aGUgdGltZWxpbmUgaW4gYnl0ZSB1bml0cy4KKyAgICAvLyBSZXR1cm5zIHRoZSBzaXplIHJvdW5kZWQgdXAgdG8gYSBwb3dlci1vZi0yLCBwbHVzIHRoZSBjb25zdGFudCBzaXplIG92ZXJoZWFkIGZvciBpbmRpY2VzLgorICAgIHN0YXRpYyBzaXplX3Qgc2hhcmVkU2l6ZShzaXplX3Qgc2l6ZSk7CisKKyNpZiAwCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyAgICBXcml0ZXI7CisgICAgZnJpZW5kIGNsYXNzICAgIFJlYWRlcjsKKworICAgIGNvbnN0IHNpemVfdCAgICBtU2l6ZTsgICAgICAvLyBjaXJjdWxhciBidWZmZXIgc2l6ZSBpbiBieXRlcywgbXVzdCBiZSBhIHBvd2VyIG9mIDIKKyAgICBib29sICAgICAgICAgICAgbU93bjsgICAgICAgLy8gd2hldGhlciBJIG93biB0aGUgbWVtb3J5IGF0IG1TaGFyZWQKKyAgICBTaGFyZWQqIGNvbnN0ICAgbVNoYXJlZDsgICAgLy8gcG9pbnRlciB0byBzaGFyZWQgbWVtb3J5CisjZW5kaWYKK307CisKK30gICAvLyBuYW1lc3BhY2UgTkJMb2cKK30gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfTUVESUFfTkJMT0dfVElNRUxJTkVfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibmJsb2cvaW5jbHVkZS9tZWRpYS9uYmxvZy9Xcml0ZXIuaCBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZjZDM5NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYm5ibG9nL2luY2x1ZGUvbWVkaWEvbmJsb2cvV3JpdGVyLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFfTkJMT0dfV1JJVEVSX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQV9OQkxPR19XUklURVJfSAorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisKKyNpbmNsdWRlIDxiaW5kZXIvSU1lbW9yeS5oPgorI2luY2x1ZGUgPG1lZGlhL25ibG9nL0V2ZW50cy5oPgorI2luY2x1ZGUgPHV0aWxzL011dGV4Lmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCitjbGFzcyBhdWRpb191dGlsc19maWZvOworY2xhc3MgYXVkaW9fdXRpbHNfZmlmb193cml0ZXI7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSU1lbW9yeTsKKworbmFtZXNwYWNlIE5CTG9nIHsKKworY2xhc3MgRW50cnk7CitzdHJ1Y3QgU2hhcmVkOworCisvLyBOQkxvZyBXcml0ZXIgSW50ZXJmYWNlCisKKy8vIFdyaXRlciBpcyB0aHJlYWQtc2FmZSB3aXRoIHJlc3BlY3QgdG8gUmVhZGVyLCBidXQgbm90IHdpdGggcmVzcGVjdCB0byBtdWx0aXBsZSB0aHJlYWRzCisvLyBjYWxsaW5nIFdyaXRlciBtZXRob2RzLiAgSWYgeW91IG5lZWQgbXVsdGktdGhyZWFkIHNhZmV0eSBmb3Igd3JpdGluZywgdXNlIExvY2tlZFdyaXRlci4KK2NsYXNzIFdyaXRlciA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICBXcml0ZXIoKSA9IGRlZmF1bHQ7ICAgICAgICAgLy8gZHVtbXkgbm9wIGltcGxlbWVudGF0aW9uIHdpdGhvdXQgc2hhcmVkIG1lbW9yeQorCisgICAgLy8gSW5wdXQgcGFyYW1ldGVyICdzaXplJyBpcyB0aGUgZGVzaXJlZCBzaXplIG9mIHRoZSB0aW1lbGluZSBpbiBieXRlIHVuaXRzLgorICAgIC8vIFRoZSBzaXplIG9mIHRoZSBzaGFyZWQgbWVtb3J5IG11c3QgYmUgYXQgbGVhc3QgVGltZWxpbmU6OnNoYXJlZFNpemUoc2l6ZSkuCisgICAgV3JpdGVyKHZvaWQgKnNoYXJlZCwgc2l6ZV90IHNpemUpOworICAgIFdyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSwgc2l6ZV90IHNpemUpOworCisgICAgfldyaXRlcigpIG92ZXJyaWRlOworCisgICAgLy8gRklYTUUgbmVlZHMgY29tbWVudHMsIGFuZCBzb21lIHNob3VsZCBiZSBwcml2YXRlCisgICAgdm9pZCAgICBsb2coY29uc3QgY2hhciAqc3RyaW5nKTsKKyAgICB2b2lkICAgIGxvZ2YoY29uc3QgY2hhciAqZm10LCAuLi4pIF9fYXR0cmlidXRlX18gKChmb3JtYXQgKHByaW50ZiwgMiwgMykpKTsKKyAgICB2b2lkICAgIGxvZ1RpbWVzdGFtcCgpOworICAgIHZvaWQgICAgbG9nRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCAuLi4pOworICAgIHZvaWQgICAgbG9nRXZlbnRIaXN0VHMoRXZlbnQgZXZlbnQsIGxvZ19oYXNoX3QgaGFzaCk7CisKKyAgICAvLyBMb2cgZGF0YSByZWxhdGVkIHRvIEV2ZW50IEUuIFNlZSB0aGUgZXZlbnQtdG8tdHlwZSBtYXBwaW5nIGZvciB0aGUgdHlwZSBvZiBkYXRhCisgICAgLy8gY29ycmVzcG9uZGluZyB0byB0aGUgZXZlbnQuIEZvciBleGFtcGxlLCBpZiB5b3Ugc2VlIGEgbWFwcGluZyBzdGF0ZW1lbnQ6CisgICAgLy8gICAgIE1BUF9UWVBFX1RPX0VWRU5UKEUsIFQpOworICAgIC8vIHRoZW4gdGhlIHVzYWdlIG9mIHRoaXMgbWV0aG9kIHdvdWxkIGJlOgorICAgIC8vICAgICBUIGRhdGEgPSBkb0NvbXB1dGF0aW9uKCk7CisgICAgLy8gICAgIHRsTkJMb2dXcml0ZXItPmxvZzxOQkxvZzo6RT4oZGF0YSk7CisgICAgdGVtcGxhdGU8RXZlbnQgRT4KKyAgICB2b2lkICAgIGxvZyh0eXBlbmFtZSBnZXRfbWFwcGVkPEU+Ojp0eXBlIGRhdGEpIHsKKyAgICAgICAgbG9nKEUsICZkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCAgICBpc0VuYWJsZWQoKSBjb25zdDsKKworICAgIC8vIHJldHVybiB2YWx1ZSBmb3IgYWxsIG9mIHRoZXNlIGlzIHRoZSBwcmV2aW91cyBpc0VuYWJsZWQoKQorICAgIHZpcnR1YWwgYm9vbCAgICBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCk7ICAgLy8gYnV0IHdvbid0IGVuYWJsZSBpZiBubyBzaGFyZWQgbWVtb3J5CisgICAgYm9vbCAgICAgICAgICAgIGVuYWJsZSgpICB7IHJldHVybiBzZXRFbmFibGVkKHRydWUpOyB9CisgICAgYm9vbCAgICAgICAgICAgIGRpc2FibGUoKSB7IHJldHVybiBzZXRFbmFibGVkKGZhbHNlKTsgfQorCisgICAgc3A8SU1lbW9yeT4gICAgIGdldElNZW1vcnkoKSBjb25zdCB7IHJldHVybiBtSU1lbW9yeTsgfQorCisgICAgLy8gUHVibGljIGxvZ2dpbmcgZnVuY3Rpb24gaW1wbGVtZW50YXRpb25zIHNob3VsZCBhbHdheXMgdXNlIG9uZSBvZiB0aGUKKyAgICAvLyB0d28gbG9nKCkgZnVuY3Rpb24gY2FsbHMgYmVsb3cgdG8gd3JpdGUgdG8gc2hhcmVkIG1lbW9yeS4KK3Byb3RlY3RlZDoKKyAgICAvLyBXcml0ZXMgYSBzaW5nbGUgRW50cnkgdG8gdGhlIEZJRk8gaWYgdGhlIHdyaXRlciBpcyBlbmFibGVkLgorICAgIC8vIFRoaXMgaXMgcHJvdGVjdGVkIGFuZCB2aXJ0dWFsIGJlY2F1c2UgTG9ja2VkV3JpdGVyIHVzZXMgYSBsb2NrIHRvIHByb3RlY3QKKyAgICAvLyB3cml0aW5nIHRvIHRoZSBGSUZPIGJlZm9yZSB3cml0aW5nIHRvIHRoaXMgZnVuY3Rpb24uCisgICAgdmlydHVhbCB2b2lkIGxvZyhjb25zdCBFbnRyeSAmZW50cnksIGJvb2wgdHJ1c3RlZCA9IGZhbHNlKTsKKworcHJpdmF0ZToKKyAgICAvLyAwIDw9IGxlbmd0aCA8PSBrTWF4TGVuZ3RoCisgICAgLy8gTG9nIGEgc2luZ2xlIEVudHJ5IHdpdGggY29ycmVzcG9uZGluZyBldmVudCwgZGF0YSwgYW5kIGxlbmd0aC4KKyAgICB2b2lkICAgIGxvZyhFdmVudCBldmVudCwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisKKyAgICB2b2lkICAgIGxvZ3ZmKGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcCk7CisKKyAgICAvLyBoZWxwZXIgZnVuY3Rpb25zIGZvciBsb2dnaW5nIHBhcnRzIG9mIGEgZm9ybWF0dGVkIGVudHJ5CisgICAgdm9pZCAgICBsb2dTdGFydChjb25zdCBjaGFyICpmbXQpOworICAgIHZvaWQgICAgbG9nVGltZXN0YW1wRm9ybWF0KCk7CisgICAgdm9pZCAgICBsb2dWRm9ybWF0KGNvbnN0IGNoYXIgKmZtdCwgbG9nX2hhc2hfdCBoYXNoLCB2YV9saXN0IGFwKTsKKworICAgIFNoYXJlZCogY29uc3QgICBtU2hhcmVke307ICAgICAgICAgIC8vIHJhdyBwb2ludGVyIHRvIHNoYXJlZCBtZW1vcnkKKyAgICBzcDxJTWVtb3J5PiAgICAgbUlNZW1vcnl7fTsgICAgICAgICAvLyByZWYtY291bnRlZCB2ZXJzaW9uLCBpbml0aWFsaXplZCBpbiBjb25zdHJ1Y3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCB0aGVuIGNvbnN0CisgICAgYXVkaW9fdXRpbHNfZmlmbyAqIGNvbnN0IG1GaWZve307ICAgICAgICAgICAgICAgLy8gRklGTyBpdHNlbGYsIG5vbi1OVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5sZXNzIGNvbnN0cnVjdG9yIGZhaWxzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgZHVtbXkgY29uc3RydWN0b3IgdXNlZAorICAgIGF1ZGlvX3V0aWxzX2ZpZm9fd3JpdGVyICogY29uc3QgbUZpZm9Xcml0ZXJ7fTsgIC8vIHVzZWQgdG8gd3JpdGUgdG8gRklGTywgbm9uLU5VTEwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgZHVtbXkgY29uc3RydWN0b3IgdXNlZAorICAgIGJvb2wgICAgICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOyAgIC8vIHdoZXRoZXIgdG8gYWN0dWFsbHkgbG9nCisKKyAgICAvLyBjYWNoZWQgcGlkIGFuZCBwcm9jZXNzIG5hbWUgdG8gdXNlIGluICVwIGZvcm1hdCBzcGVjaWZpZXIKKyAgICAvLyB0b3RhbCB0YWcgbGVuZ3RoIGlzIG1QaWRUYWdTaXplIGFuZCBwcm9jZXNzIG5hbWUgaXMgbm90IHplcm8gdGVybWluYXRlZAorICAgIGNoYXIgICAqbVBpZFRhZ3t9OworICAgIHNpemVfdCAgbVBpZFRhZ1NpemUgPSAwOworfTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFNpbWlsYXIgdG8gV3JpdGVyLCBidXQgc2FmZSBmb3IgbXVsdGlwbGUgdGhyZWFkcyB0byBjYWxsIGNvbmN1cnJlbnRseQorY2xhc3MgTG9ja2VkV3JpdGVyIDogcHVibGljIFdyaXRlciB7CitwdWJsaWM6CisgICAgTG9ja2VkV3JpdGVyKCkgPSBkZWZhdWx0OworICAgIExvY2tlZFdyaXRlcih2b2lkICpzaGFyZWQsIHNpemVfdCBzaXplKTsKKworICAgIGJvb2wgICAgaXNFbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYm9vbCAgICBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgLy8gTG9jayBuZWVkcyB0byBiZSBvYnRhaW5lZCBiZWZvcmUgd3JpdGluZyB0byBGSUZPLgorICAgIHZvaWQgbG9nKGNvbnN0IEVudHJ5ICZlbnRyeSwgYm9vbCB0cnVzdGVkID0gZmFsc2UpIG92ZXJyaWRlOworCisgICAgbXV0YWJsZSBNdXRleCAgIG1Mb2NrOworfTsKKworfSAgIC8vIG5hbWVzcGFjZSBOQkxvZworfSAgIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9NRURJQV9OQkxPR19XUklURVJfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FBQ1dyaXRlci5jcHAKaW5kZXggMmVhNWZjZC4uZTE3Mzk3NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQUNXcml0ZXIuY3BwCkBAIC04NSw3ICs4NSw3IEBACiAgICAgQ0hFQ0soIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUFDKSk7CiAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsQ291bnQsICZtQ2hhbm5lbENvdW50KSk7CiAgICAgQ0hFQ0sobWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmbVNhbXBsZVJhdGUpKTsKLSAgICBDSEVDSyhtQ2hhbm5lbENvdW50ID49IDEgJiYgbUNoYW5uZWxDb3VudCA8PSAyKTsKKyAgICBDSEVDSyhtQ2hhbm5lbENvdW50ID49IDEgJiYgbUNoYW5uZWxDb3VudCA8PSA3KTsKIAogICAgIC8vIE9wdGlvbmFsbHksIHdlIHdhbnQgdG8gY2hlY2sgd2hldGhlciBBQUNQcm9maWxlIGlzIGFsc28gc2V0LgogICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUFBQ1Byb2ZpbGUsICZtQUFDUHJvZmlsZSkpIHsKQEAgLTE1NCwxMSArMTU0LDExIEBACiAgICAgbURvbmUgPSB0cnVlOwogCiAgICAgdm9pZCAqZHVtbXk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVNvdXJjZS0+c3RvcCgpOwogICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmZHVtbXkpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihkdW1teSkpOwogICAgIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVNvdXJjZS0+c3RvcCgpOwogICAgICAgICBpZiAoZXJyID09IE9LICYmCiAgICAgICAgICAgICAoc3RhdHVzICE9IE9LICYmIHN0YXR1cyAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSkgewogICAgICAgICAgICAgZXJyID0gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlYy5jcHAKaW5kZXggODFhNDY0MC4uZWFjYWVhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BQ29kZWMuY3BwCkBAIC0zNyw2ICszNyw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9CdWZmZXJQcm9kdWNlcldyYXBwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09NWENsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1BlcnNpc3RlbnRTdXJmYWNlLmg+CkBAIC0xNzEsMTEgKzE3Miw3IEBACiB9CiAKIHN0cnVjdCBDb2RlY09ic2VydmVyIDogcHVibGljIEJuT01YT2JzZXJ2ZXIgewotICAgIENvZGVjT2JzZXJ2ZXIoKSB7fQotCi0gICAgdm9pZCBzZXROb3RpZmljYXRpb25NZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgICAgIG1Ob3RpZnkgPSBtc2c7Ci0gICAgfQorICAgIGV4cGxpY2l0IENvZGVjT2JzZXJ2ZXIoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIDogbU5vdGlmeShtc2cpIHt9CiAKICAgICAvLyBmcm9tIElPTVhPYnNlcnZlcgogICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VzKGNvbnN0IHN0ZDo6bGlzdDxvbXhfbWVzc2FnZT4gJm1lc3NhZ2VzKSB7CkBAIC0yNTEsNyArMjQ4LDcgQEAKICAgICB2aXJ0dWFsIH5Db2RlY09ic2VydmVyKCkge30KIAogcHJpdmF0ZToKLSAgICBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKKyAgICBjb25zdCBzcDxBTWVzc2FnZT4gbU5vdGlmeTsKIAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvZGVjT2JzZXJ2ZXIpOwogfTsKQEAgLTU3MiwxMCArNTY5LDEwIEBACiAgICAgICBtRnBzKC0xLjApLAogICAgICAgbUNhcHR1cmVGcHMoLTEuMCksCiAgICAgICBtQ3JlYXRlSW5wdXRCdWZmZXJzU3VzcGVuZGVkKGZhbHNlKSwKLSAgICAgIG1MYXRlbmN5KDApLAogICAgICAgbVR1bm5lbGVkKGZhbHNlKSwKICAgICAgIG1EZXNjcmliZUNvbG9yQXNwZWN0c0luZGV4KChPTVhfSU5ERVhUWVBFKTApLAogICAgICAgbURlc2NyaWJlSERSU3RhdGljSW5mb0luZGV4KChPTVhfSU5ERVhUWVBFKTApLAorICAgICAgbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4KChPTVhfSU5ERVhUWVBFKTApLAogICAgICAgbVN0YXRlR2VuZXJhdGlvbigwKSwKICAgICAgIG1WZW5kb3JFeHRlbnNpb25zU3RhdHVzKGtFeHRlbnNpb25zVW5jaGVja2VkKSB7CiAgICAgbWVtc2V0KCZtTGFzdEhEUlN0YXRpY0luZm8sIDAsIHNpemVvZihtTGFzdEhEUlN0YXRpY0luZm8pKTsKQEAgLTc4Myw2ICs3ODAsOSBAQAogICAgIC8vIG5lZWQgdG8gZW5hYmxlIGFsbG9jYXRpb24gd2hlbiBhdHRhY2hpbmcKICAgICBzdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCktPmFsbG93QWxsb2NhdGlvbih0cnVlKTsKIAorICAgIC8vIGRlcXVldWVCdWZmZXIgY2Fubm90IHRpbWUgb3V0CisgICAgc3VyZmFjZS0+c2V0RGVxdWV1ZVRpbWVvdXQoLTEpOworCiAgICAgLy8gZm9yIG1ldGEgZGF0YSBtb2RlLCB3ZSBtb3ZlIGRlcXVldWQgYnVmZmVycyB0byB0aGUgbmV3IHN1cmZhY2UuCiAgICAgLy8gZm9yIG5vbi1tZXRhIG1vZGUsIHdlIG11c3QgbW92ZSBhbGwgcmVnaXN0ZXJlZCBidWZmZXJzCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidWZmZXJzLnNpemUoKTsgKytpKSB7CkBAIC0xMTM4LDYgKzExMzgsOCBAQAogICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KIAorICAgIHN0YXRpY19jYXN0PFN1cmZhY2UgKj4obU5hdGl2ZVdpbmRvdy5nZXQoKSktPnNldERlcXVldWVUaW1lb3V0KC0xKTsKKwogICAgIC8vIEV4aXRzIGhlcmUgZm9yIHR1bm5lbGVkIHZpZGVvIHBsYXliYWNrIGNvZGVjcyAtLSBpLmUuIHNraXBzIG5hdGl2ZSB3aW5kb3cKICAgICAvLyBidWZmZXIgYWxsb2NhdGlvbiBzdGVwIGFzIHRoaXMgaXMgbWFuYWdlZCBieSB0aGUgdHVubmVsZWQgT01YIG9tcG9uZW50CiAgICAgLy8gaXRzZWxmIGFuZCBleHBsaWNpdGx5IHNldHMgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCB0byAwLgpAQCAtMTc0OSwzNCArMTc1MSwzNyBAQAogICAgIH0KIAogICAgIGludDMyX3Qgc3RvcmVNZXRhOwotICAgIGlmIChlbmNvZGVyCi0gICAgICAgICAgICAmJiBtc2ctPmZpbmRJbnQzMigiYW5kcm9pZC5faW5wdXQtbWV0YWRhdGEtYnVmZmVyLXR5cGUiLCAmc3RvcmVNZXRhKQotICAgICAgICAgICAgJiYgc3RvcmVNZXRhICE9IGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkKSB7Ci0gICAgICAgIElPTVg6OlBvcnRNb2RlIG1vZGU7Ci0gICAgICAgIGlmIChzdG9yZU1ldGEgPT0ga01ldGFkYXRhQnVmZmVyVHlwZU5hdGl2ZUhhbmRsZVNvdXJjZSkgewotICAgICAgICAgICAgbW9kZSA9IElPTVg6OmtQb3J0TW9kZUR5bmFtaWNOYXRpdmVIYW5kbGU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXIgfHwKLSAgICAgICAgICAgICAgICBzdG9yZU1ldGEgPT0ga01ldGFkYXRhQnVmZmVyVHlwZUdyYWxsb2NTb3VyY2UpIHsKLSAgICAgICAgICAgIG1vZGUgPSBJT01YOjprUG9ydE1vZGVEeW5hbWljQU5XQnVmZmVyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBpZiAoZW5jb2RlcikgeworICAgICAgICBJT01YOjpQb3J0TW9kZSBtb2RlID0gSU9NWDo6a1BvcnRNb2RlUHJlc2V0Qnl0ZUJ1ZmZlcjsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJhbmRyb2lkLl9pbnB1dC1tZXRhZGF0YS1idWZmZXItdHlwZSIsICZzdG9yZU1ldGEpCisgICAgICAgICAgICAgICAgJiYgc3RvcmVNZXRhICE9IGtNZXRhZGF0YUJ1ZmZlclR5cGVJbnZhbGlkKSB7CisgICAgICAgICAgICBpZiAoc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVOYXRpdmVIYW5kbGVTb3VyY2UpIHsKKyAgICAgICAgICAgICAgICBtb2RlID0gSU9NWDo6a1BvcnRNb2RlRHluYW1pY05hdGl2ZUhhbmRsZTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVBTldCdWZmZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgc3RvcmVNZXRhID09IGtNZXRhZGF0YUJ1ZmZlclR5cGVHcmFsbG9jU291cmNlKSB7CisgICAgICAgICAgICAgICAgbW9kZSA9IElPTVg6OmtQb3J0TW9kZUR5bmFtaWNBTldCdWZmZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgZXJyID0gc2V0UG9ydE1vZGUoa1BvcnRJbmRleElucHV0LCBtb2RlKTsKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgcmV0dXJuIGVycjsKICAgICAgICAgfQogCi0gICAgICAgIHVpbnQzMl90IHVzYWdlQml0czsKLSAgICAgICAgaWYgKG1PTVhOb2RlLT5nZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1Db25zdW1lclVzYWdlQml0cywKLSAgICAgICAgICAgICAgICAmdXNhZ2VCaXRzLCBzaXplb2YodXNhZ2VCaXRzKSkgPT0gT0spIHsKLSAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgInVzaW5nLXN3LXJlYWQtb2Z0ZW4iLCAhISh1c2FnZUJpdHMgJiBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4pKTsKKyAgICAgICAgaWYgKG1vZGUgIT0gSU9NWDo6a1BvcnRNb2RlUHJlc2V0Qnl0ZUJ1ZmZlcikgeworICAgICAgICAgICAgdWludDMyX3QgdXNhZ2VCaXRzOworICAgICAgICAgICAgaWYgKG1PTVhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHMsCisgICAgICAgICAgICAgICAgICAgICZ1c2FnZUJpdHMsIHNpemVvZih1c2FnZUJpdHMpKSA9PSBPSykgeworICAgICAgICAgICAgICAgIGlucHV0Rm9ybWF0LT5zZXRJbnQzMigKKyAgICAgICAgICAgICAgICAgICAgICAgICJ1c2luZy1zdy1yZWFkLW9mdGVuIiwgISEodXNhZ2VCaXRzICYgR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOKSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpbnQzMl90IHByZXBlbmRTUFNQUFMgPSAwOwotICAgIGlmIChlbmNvZGVyCisgICAgaWYgKGVuY29kZXIgJiYgbUlzVmlkZW8KICAgICAgICAgICAgICYmIG1zZy0+ZmluZEludDMyKCJwcmVwZW5kLXNwcy1wcHMtdG8taWRyLWZyYW1lcyIsICZwcmVwZW5kU1BTUFBTKQogICAgICAgICAgICAgJiYgcHJlcGVuZFNQU1BQUyAhPSAwKSB7CiAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXg7CkBAIC0xODE3LDIwICsxODIyLDM2IEBACiAgICAgICAgIH0KIAogICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KAotICAgICAgICAgICAgICAgICAgICAicmVwZWF0LXByZXZpb3VzLWZyYW1lLWFmdGVyIiwKLSAgICAgICAgICAgICAgICAgICAgJm1SZXBlYXRGcmFtZURlbGF5VXMpKSB7CisgICAgICAgICAgICAgICAgS0VZX1JFUEVBVF9QUkVWSU9VU19GUkFNRV9BRlRFUiwgJm1SZXBlYXRGcmFtZURlbGF5VXMpKSB7CiAgICAgICAgICAgICBtUmVwZWF0RnJhbWVEZWxheVVzID0gLTFMTDsKICAgICAgICAgfQogCisgICAgICAgIGlmICghbXNnLT5maW5kRG91YmxlKCJ0aW1lLWxhcHNlLWZwcyIsICZtQ2FwdHVyZUZwcykpIHsKKyAgICAgICAgICAgIGZsb2F0IGNhcHR1cmVSYXRlOworICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEFzRmxvYXQoS0VZX0NBUFRVUkVfUkFURSwgJmNhcHR1cmVSYXRlKSkgeworICAgICAgICAgICAgICAgIG1DYXB0dXJlRnBzID0gY2FwdHVyZVJhdGU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1DYXB0dXJlRnBzID0gLTEuMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoCisgICAgICAgICAgICAgICAgS0VZX0NSRUFURV9JTlBVVF9TVVJGQUNFX1NVU1BFTkRFRCwKKyAgICAgICAgICAgICAgICAoaW50MzJfdCopJm1DcmVhdGVJbnB1dEJ1ZmZlcnNTdXNwZW5kZWQpKSB7CisgICAgICAgICAgICBtQ3JlYXRlSW5wdXRCdWZmZXJzU3VzcGVuZGVkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZW5jb2RlciAmJiAobUlzVmlkZW8gfHwgbUlzSW1hZ2UpKSB7CiAgICAgICAgIC8vIG9ubHkgYWxsb3cgMzItYml0IHZhbHVlLCBzaW5jZSB3ZSBwYXNzIGl0IGFzIFUzMiB0byBPTVguCi0gICAgICAgIGlmICghbXNnLT5maW5kSW50NjQoIm1heC1wdHMtZ2FwLXRvLWVuY29kZXIiLCAmbU1heFB0c0dhcFVzKSkgeworICAgICAgICBpZiAoIW1zZy0+ZmluZEludDY0KEtFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSLCAmbU1heFB0c0dhcFVzKSkgewogICAgICAgICAgICAgbU1heFB0c0dhcFVzID0gMExMOwogICAgICAgICB9IGVsc2UgaWYgKG1NYXhQdHNHYXBVcyA+IElOVDMyX01BWCB8fCBtTWF4UHRzR2FwVXMgPCBJTlQzMl9NSU4pIHsKICAgICAgICAgICAgIEFMT0dXKCJVbnN1cHBvcnRlZCB2YWx1ZSBmb3IgbWF4IHB0cyBnYXAgJWxsZCIsIChsb25nIGxvbmcpIG1NYXhQdHNHYXBVcyk7CiAgICAgICAgICAgICBtTWF4UHRzR2FwVXMgPSAwTEw7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIW1zZy0+ZmluZEZsb2F0KCJtYXgtZnBzLXRvLWVuY29kZXIiLCAmbU1heEZwcykpIHsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRGbG9hdChLRVlfTUFYX0ZQU19UT19FTkNPREVSLCAmbU1heEZwcykpIHsKICAgICAgICAgICAgIG1NYXhGcHMgPSAtMTsKICAgICAgICAgfQogCkBAIC0xODM4LDE2ICsxODU5LDYgQEAKICAgICAgICAgaWYgKG1NYXhQdHNHYXBVcyA8IDBMTCkgewogICAgICAgICAgICAgbU1heEZwcyA9IC0xOwogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtc2ctPmZpbmREb3VibGUoInRpbWUtbGFwc2UtZnBzIiwgJm1DYXB0dXJlRnBzKSkgewotICAgICAgICAgICAgbUNhcHR1cmVGcHMgPSAtMS4wOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgImNyZWF0ZS1pbnB1dC1idWZmZXJzLXN1c3BlbmRlZCIsCi0gICAgICAgICAgICAgICAgICAgIChpbnQzMl90KikmbUNyZWF0ZUlucHV0QnVmZmVyc1N1c3BlbmRlZCkpIHsKLSAgICAgICAgICAgIG1DcmVhdGVJbnB1dEJ1ZmZlcnNTdXNwZW5kZWQgPSBmYWxzZTsKLSAgICAgICAgfQogICAgIH0KIAogICAgIC8vIE5PVEU6IHdlIG9ubHkgdXNlIG5hdGl2ZSB3aW5kb3cgZm9yIHZpZGVvIGRlY29kZXJzCkBAIC0yMDg5LDcgKzIxMDAsOCBAQAogICAgICAgICBpZiAodXNpbmdTd1JlbmRlcmVyKSB7CiAgICAgICAgICAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKCJ1c2luZy1zdy1yZW5kZXJlciIsIDEpOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHKSkgeworICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRykgfHwKKyAgICAgICAgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JSSkpIHsKICAgICAgICAgaW50MzJfdCBudW1DaGFubmVscywgc2FtcGxlUmF0ZTsKICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiY2hhbm5lbC1jb3VudCIsICZudW1DaGFubmVscykKICAgICAgICAgICAgICAgICB8fCAhbXNnLT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKSB7CkBAIC0yMTgwLDcgKzIxOTIsOCBAQAogICAgICAgICAgICAgZXJyID0gc2V0dXBHNzExQ29kZWMoZW5jb2Rlciwgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDKSkgewotICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzID0gMCwgc2FtcGxlUmF0ZSA9IDAsIGNvbXByZXNzaW9uTGV2ZWwgPSAtMTsKKyAgICAgICAgLy8gbnVtQ2hhbm5lbHMgbmVlZHMgdG8gYmUgc2V0IHRvIHByb3Blcmx5IGNvbW11bmljYXRlIFBDTSB2YWx1ZXMuCisgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHMgPSAyLCBzYW1wbGVSYXRlID0gNDQxMDAsIGNvbXByZXNzaW9uTGV2ZWwgPSAtMTsKICAgICAgICAgaWYgKGVuY29kZXIgJiYKICAgICAgICAgICAgICAgICAoIW1zZy0+ZmluZEludDMyKCJjaGFubmVsLWNvdW50IiwgJm51bUNoYW5uZWxzKQogICAgICAgICAgICAgICAgICAgICAgICAgfHwgIW1zZy0+ZmluZEludDMyKCJzYW1wbGUtcmF0ZSIsICZzYW1wbGVSYXRlKSkpIHsKQEAgLTIyMDYsNyArMjIxOSw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgZXJyID0gc2V0dXBGbGFjQ29kZWMoCi0gICAgICAgICAgICAgICAgICAgIGVuY29kZXIsIG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlLCBjb21wcmVzc2lvbkxldmVsKTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlciwgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGUsIGNvbXByZXNzaW9uTGV2ZWwsIHBjbUVuY29kaW5nKTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlOwpAQCAtMjIzNSw2ICsyMjQ4LDE1IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBlcnIgPSBzZXR1cEVBQzNDb2RlYyhlbmNvZGVyLCBudW1DaGFubmVscywgc2FtcGxlUmF0ZSk7CiAgICAgICAgIH0KKyAgICAgfSBlbHNlIGlmICghc3RyY2FzZWNtcChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19BQzQpKSB7CisgICAgICAgIGludDMyX3QgbnVtQ2hhbm5lbHM7CisgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiY2hhbm5lbC1jb3VudCIsICZudW1DaGFubmVscykKKyAgICAgICAgICAgICAgICB8fCAhbXNnLT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKSB7CisgICAgICAgICAgICBlcnIgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVyciA9IHNldHVwQUM0Q29kZWMoZW5jb2RlciwgbnVtQ2hhbm5lbHMsIHNhbXBsZVJhdGUpOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMjMwOCwxMiArMjMzMCwxNiBAQAogICAgICAgICAgICAgKHZvaWQpbUlucHV0Rm9ybWF0LT5maW5kSW50MzIoInBjbS1lbmNvZGluZyIsIChpbnQzMl90KikmY29kZWNQY21FbmNvZGluZyk7CiAgICAgICAgICAgICBtQ29udmVydGVyW2tQb3J0SW5kZXhJbnB1dF0gPSBBdWRpb0NvbnZlcnRlcjo6Q3JlYXRlKHBjbUVuY29kaW5nLCBjb2RlY1BjbUVuY29kaW5nKTsKICAgICAgICAgICAgIGlmIChtQ29udmVydGVyW2tQb3J0SW5kZXhJbnB1dF0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCIlczogZW5jb2RlciAlcyBpbnB1dCBmb3JtYXQgcGNtIGVuY29kaW5nIGNvbnZlcnRlciBmcm9tICVkIHRvICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtQ29tcG9uZW50TmFtZS5jX3N0cigpLCBwY21FbmNvZGluZywgY29kZWNQY21FbmNvZGluZyk7CiAgICAgICAgICAgICAgICAgbUlucHV0Rm9ybWF0LT5zZXRJbnQzMigicGNtLWVuY29kaW5nIiwgcGNtRW5jb2RpbmcpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgKHZvaWQpbU91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJwY20tZW5jb2RpbmciLCAoaW50MzJfdCopJmNvZGVjUGNtRW5jb2RpbmcpOwogICAgICAgICAgICAgbUNvbnZlcnRlcltrUG9ydEluZGV4T3V0cHV0XSA9IEF1ZGlvQ29udmVydGVyOjpDcmVhdGUoY29kZWNQY21FbmNvZGluZywgcGNtRW5jb2RpbmcpOwogICAgICAgICAgICAgaWYgKG1Db252ZXJ0ZXJba1BvcnRJbmRleE91dHB1dF0gIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCIlczogZGVjb2RlciAlcyBvdXRwdXQgZm9ybWF0IHBjbSBlbmNvZGluZyBjb252ZXJ0ZXIgZnJvbSAlZCB0byAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUNvbXBvbmVudE5hbWUuY19zdHIoKSwgY29kZWNQY21FbmNvZGluZywgcGNtRW5jb2RpbmcpOwogICAgICAgICAgICAgICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJwY20tZW5jb2RpbmciLCBwY21FbmNvZGluZyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTIzNDYsNiArMjM3MiwxNyBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3N0YXR1c190IEFDb2RlYzo6c2V0QXVkaW9QcmVzZW50YXRpb24oaW50MzJfdCBwcmVzZW50YXRpb25JZCwgaW50MzJfdCBwcm9ncmFtSWQpIHsKKyAgICBPTVhfQVVESU9fQ09ORklHX0FORFJPSURfQVVESU9QUkVTRU5UQVRJT04gY29uZmlnOworICAgIEluaXRPTVhQYXJhbXMoJmNvbmZpZyk7CisgICAgY29uZmlnLm5QcmVzZW50YXRpb25JZCA9IChPTVhfUzMyKXByZXNlbnRhdGlvbklkOworICAgIGNvbmZpZy5uUHJvZ3JhbUlkID0gKE9NWF9TMzIpcHJvZ3JhbUlkOworICAgIHN0YXR1c190IGVyciA9IG1PTVhOb2RlLT5zZXRDb25maWcoCisgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhDb25maWdBdWRpb1ByZXNlbnRhdGlvbiwKKyAgICAgICAgICAgICZjb25maWcsIHNpemVvZihjb25maWcpKTsKKyAgICByZXR1cm4gZXJyOworfQorCiBzdGF0dXNfdCBBQ29kZWM6OnNldFByaW9yaXR5KGludDMyX3QgcHJpb3JpdHkpIHsKICAgICBpZiAocHJpb3JpdHkgPCAwKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0yMzczLDcgKzI0MTAsNyBAQAogICAgICAgICB9CiAgICAgICAgIHJhdGUgPSAoT01YX1UzMikocmF0ZUZsb2F0ICogNjU1MzYuMGYgKyAwLjVmKTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAocmF0ZUZsb2F0ID4gVUlOVF9NQVgpIHsKKyAgICAgICAgaWYgKHJhdGVGbG9hdCA+IHN0YXRpY19jYXN0PGZsb2F0PihVSU5UX01BWCkpIHsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICAgICAgcmF0ZSA9IChPTVhfVTMyKShyYXRlRmxvYXQpOwpAQCAtMjU1Miw2ICsyNTg5LDggQEAKICAgICAgICAgbGF5ZXJQYXJhbXMublBMYXllckNvdW50QWN0dWFsID0gbnVtTGF5ZXJzIC0gbnVtQkxheWVyczsKICAgICAgICAgbGF5ZXJQYXJhbXMubkJMYXllckNvdW50QWN0dWFsID0gbnVtQkxheWVyczsKICAgICAgICAgbGF5ZXJQYXJhbXMuYkJpdHJhdGVSYXRpb3NTcGVjaWZpZWQgPSBPTVhfRkFMU0U7CisgICAgICAgIGxheWVyUGFyYW1zLm5MYXllckNvdW50TWF4ID0gbnVtTGF5ZXJzOworICAgICAgICBsYXllclBhcmFtcy5uQkxheWVyQ291bnRNYXggPSBudW1CTGF5ZXJzOwogCiAgICAgICAgIGVyciA9IG1PTVhOb2RlLT5zZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BbmRyb2lkVmlkZW9UZW1wb3JhbExheWVyaW5nLApAQCAtMjg5MSw2ICsyOTMwLDM4IEBACiAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEVhYzMsICZkZWYsIHNpemVvZihkZWYpKTsKIH0KIAorc3RhdHVzX3QgQUNvZGVjOjpzZXR1cEFDNENvZGVjKAorICAgICAgICBib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSkgeworICAgIHN0YXR1c190IGVyciA9IHNldHVwUmF3QXVkaW9Gb3JtYXQoCisgICAgICAgICAgICBlbmNvZGVyID8ga1BvcnRJbmRleElucHV0IDoga1BvcnRJbmRleE91dHB1dCwgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpOworCisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIGlmIChlbmNvZGVyKSB7CisgICAgICAgIEFMT0dXKCJBQzQgZW5jb2RpbmcgaXMgbm90IHN1cHBvcnRlZC4iKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX0FDNFRZUEUgZGVmOworICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CisgICAgZGVmLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4SW5wdXQ7CisKKyAgICBlcnIgPSBtT01YTm9kZS0+Z2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRBYzQsICZkZWYsIHNpemVvZihkZWYpKTsKKworICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIGVycjsKKyAgICB9CisKKyAgICBkZWYubkNoYW5uZWxzID0gbnVtQ2hhbm5lbHM7CisgICAgZGVmLm5TYW1wbGVSYXRlID0gc2FtcGxlUmF0ZTsKKworICAgIHJldHVybiBtT01YTm9kZS0+c2V0UGFyYW1ldGVyKAorICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1BdWRpb0FuZHJvaWRBYzQsICZkZWYsIHNpemVvZihkZWYpKTsKK30KKwogc3RhdGljIE9NWF9BVURJT19BTVJCQU5ETU9ERVRZUEUgcGlja01vZGVGcm9tQml0UmF0ZSgKICAgICAgICAgYm9vbCBpc0FNUldCLCBpbnQzMl90IGJwcykgewogICAgIGlmIChpc0FNUldCKSB7CkBAIC0yOTc0LDggKzMwNDUsOCBAQAogfQogCiBzdGF0dXNfdCBBQ29kZWM6OnNldHVwRmxhY0NvZGVjKAotICAgICAgICBib29sIGVuY29kZXIsIGludDMyX3QgbnVtQ2hhbm5lbHMsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBjb21wcmVzc2lvbkxldmVsKSB7Ci0KKyAgICAgICAgYm9vbCBlbmNvZGVyLCBpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgY29tcHJlc3Npb25MZXZlbCwKKyAgICAgICAgQXVkaW9FbmNvZGluZyBlbmNvZGluZykgewogICAgIGlmIChlbmNvZGVyKSB7CiAgICAgICAgIE9NWF9BVURJT19QQVJBTV9GTEFDVFlQRSBkZWY7CiAgICAgICAgIEluaXRPTVhQYXJhbXMoJmRlZik7CkBAIC0yOTk4LDcgKzMwNjksOCBAQAogICAgIHJldHVybiBzZXR1cFJhd0F1ZGlvRm9ybWF0KAogICAgICAgICAgICAgZW5jb2RlciA/IGtQb3J0SW5kZXhJbnB1dCA6IGtQb3J0SW5kZXhPdXRwdXQsCiAgICAgICAgICAgICBzYW1wbGVSYXRlLAotICAgICAgICAgICAgbnVtQ2hhbm5lbHMpOworICAgICAgICAgICAgbnVtQ2hhbm5lbHMsCisgICAgICAgICAgICBlbmNvZGluZyk7CiB9CiAKIHN0YXR1c190IEFDb2RlYzo6c2V0dXBSYXdBdWRpb0Zvcm1hdCgKQEAgLTMwNTYsNiArMzEyOCw3IEBACiAgICAgcGNtUGFyYW1zLmVQQ01Nb2RlID0gT01YX0FVRElPX1BDTU1vZGVMaW5lYXI7CiAKICAgICBpZiAoZ2V0T01YQ2hhbm5lbE1hcHBpbmcobnVtQ2hhbm5lbHMsIHBjbVBhcmFtcy5lQ2hhbm5lbE1hcHBpbmcpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogaW5jb3JyZWN0IG51bUNoYW5uZWxzOiAlZCIsIF9fZnVuY19fLCBudW1DaGFubmVscyk7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOwogICAgIH0KIApAQCAtMzI0Myw2ICszMzE2LDcgQEAKICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSwgT01YX1ZJREVPX0NvZGluZ1ZQOSB9LAogICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fRE9MQllfVklTSU9OLCBPTVhfVklERU9fQ29kaW5nRG9sYnlWaXNpb24gfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQywgT01YX1ZJREVPX0NvZGluZ0ltYWdlSEVJQyB9LAorICAgIHsgTUVESUFfTUlNRVRZUEVfVklERU9fQVYxLCBPTVhfVklERU9fQ29kaW5nQVYxIH0sCiB9OwogCiBzdGF0aWMgc3RhdHVzX3QgR2V0VmlkZW9Db2RpbmdUeXBlRnJvbU1pbWUoCkBAIC0zNzExLDggKzM3ODUsMTcgQEAKICAgICAgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZGVzY3JpYmVIRFJTdGF0aWNJbmZvIiwgJm1EZXNjcmliZUhEUlN0YXRpY0luZm9JbmRleCk7CiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICBtRGVzY3JpYmVIRFJTdGF0aWNJbmZvSW5kZXggPSAoT01YX0lOREVYVFlQRSkwOworICAgICAgICByZXR1cm4gZXJyOwogICAgIH0KLSAgICByZXR1cm4gZXJyOworCisgICAgZXJyID0gbU9NWE5vZGUtPmdldEV4dGVuc2lvbkluZGV4KAorICAgICAgICAgICAgICAgICJPTVguZ29vZ2xlLmFuZHJvaWQuaW5kZXguZGVzY3JpYmVIRFIxMFBsdXNJbmZvIiwgJm1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCk7CisgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICBtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXggPSAoT01YX0lOREVYVFlQRSkwOworICAgICAgICByZXR1cm4gZXJyOworICAgIH0KKworICAgIHJldHVybiBPSzsKIH0KIAogc3RhdHVzX3QgQUNvZGVjOjpzZXRIRFJTdGF0aWNJbmZvKGNvbnN0IERlc2NyaWJlSERSU3RhdGljSW5mb1BhcmFtcyAmcGFyYW1zKSB7CkBAIC00MjI2LDI0ICs0MzA5LDI3IEBACiAgICAgaW50IG1heERpbWVuc2lvbiA9IG1heCh3aWR0aCwgaGVpZ2h0KTsKIAogICAgIHN0YXRpYyBjb25zdCBpbnQgbGltaXRzW11bNV0gPSB7Ci0gICAgICAgIC8qICAgTUJwcyAgICAgTUIgICBkaW0gIGJpdHJhdGUgICAgICAgIGxldmVsICovCi0gICAgICAgIHsgICAgMTQ4NSwgICAgOTksICAyOCwgICAgIDY0LCBPTVhfVklERU9fQVZDTGV2ZWwxICB9LAotICAgICAgICB7ICAgIDE0ODUsICAgIDk5LCAgMjgsICAgIDEyOCwgT01YX1ZJREVPX0FWQ0xldmVsMWIgfSwKLSAgICAgICAgeyAgICAzMDAwLCAgIDM5NiwgIDU2LCAgICAxOTIsIE9NWF9WSURFT19BVkNMZXZlbDExIH0sCi0gICAgICAgIHsgICAgNjAwMCwgICAzOTYsICA1NiwgICAgMzg0LCBPTVhfVklERU9fQVZDTGV2ZWwxMiB9LAotICAgICAgICB7ICAgMTE4ODAsICAgMzk2LCAgNTYsICAgIDc2OCwgT01YX1ZJREVPX0FWQ0xldmVsMTMgfSwKLSAgICAgICAgeyAgIDExODgwLCAgIDM5NiwgIDU2LCAgIDIwMDAsIE9NWF9WSURFT19BVkNMZXZlbDIgIH0sCi0gICAgICAgIHsgICAxOTgwMCwgICA3OTIsICA3OSwgICA0MDAwLCBPTVhfVklERU9fQVZDTGV2ZWwyMSB9LAotICAgICAgICB7ICAgMjAyNTAsICAxNjIwLCAxMTMsICAgNDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMjIgfSwKLSAgICAgICAgeyAgIDQwNTAwLCAgMTYyMCwgMTEzLCAgMTAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDMgIH0sCi0gICAgICAgIHsgIDEwODAwMCwgIDM2MDAsIDE2OSwgIDE0MDAwLCBPTVhfVklERU9fQVZDTGV2ZWwzMSB9LAotICAgICAgICB7ICAyMTYwMDAsICA1MTIwLCAyMDIsICAyMDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMzIgfSwKLSAgICAgICAgeyAgMjQ1NzYwLCAgODE5MiwgMjU2LCAgMjAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDQgIH0sCi0gICAgICAgIHsgIDI0NTc2MCwgIDgxOTIsIDI1NiwgIDUwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw0MSB9LAotICAgICAgICB7ICA1MjIyNDAsICA4NzA0LCAyNjMsICA1MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNDIgfSwKLSAgICAgICAgeyAgNTg5ODI0LCAyMjA4MCwgNDIwLCAxMzUwMDAsIE9NWF9WSURFT19BVkNMZXZlbDUgIH0sCi0gICAgICAgIHsgIDk4MzA0MCwgMzY4NjQsIDU0MywgMjQwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw1MSB9LAotICAgICAgICB7IDIwNzM2MDAsIDM2ODY0LCA1NDMsIDI0MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNTIgfSwKKyAgICAgICAgLyogICAgTUJwcyAgICAgIE1CICAgZGltICBiaXRyYXRlICAgICAgICBsZXZlbCAqLworICAgICAgICB7ICAgICAxNDg1LCAgICAgOTksICAgMjgsICAgICA2NCwgT01YX1ZJREVPX0FWQ0xldmVsMSAgfSwKKyAgICAgICAgeyAgICAgMTQ4NSwgICAgIDk5LCAgIDI4LCAgICAxMjgsIE9NWF9WSURFT19BVkNMZXZlbDFiIH0sCisgICAgICAgIHsgICAgIDMwMDAsICAgIDM5NiwgICA1NiwgICAgMTkyLCBPTVhfVklERU9fQVZDTGV2ZWwxMSB9LAorICAgICAgICB7ICAgICA2MDAwLCAgICAzOTYsICAgNTYsICAgIDM4NCwgT01YX1ZJREVPX0FWQ0xldmVsMTIgfSwKKyAgICAgICAgeyAgICAxMTg4MCwgICAgMzk2LCAgIDU2LCAgICA3NjgsIE9NWF9WSURFT19BVkNMZXZlbDEzIH0sCisgICAgICAgIHsgICAgMTE4ODAsICAgIDM5NiwgICA1NiwgICAyMDAwLCBPTVhfVklERU9fQVZDTGV2ZWwyICB9LAorICAgICAgICB7ICAgIDE5ODAwLCAgICA3OTIsICAgNzksICAgNDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMjEgfSwKKyAgICAgICAgeyAgICAyMDI1MCwgICAxNjIwLCAgMTEzLCAgIDQwMDAsIE9NWF9WSURFT19BVkNMZXZlbDIyIH0sCisgICAgICAgIHsgICAgNDA1MDAsICAgMTYyMCwgIDExMywgIDEwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWwzICB9LAorICAgICAgICB7ICAgMTA4MDAwLCAgIDM2MDAsICAxNjksICAxNDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsMzEgfSwKKyAgICAgICAgeyAgIDIxNjAwMCwgICA1MTIwLCAgMjAyLCAgMjAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDMyIH0sCisgICAgICAgIHsgICAyNDU3NjAsICAgODE5MiwgIDI1NiwgIDIwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw0ICB9LAorICAgICAgICB7ICAgMjQ1NzYwLCAgIDgxOTIsICAyNTYsICA1MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNDEgfSwKKyAgICAgICAgeyAgIDUyMjI0MCwgICA4NzA0LCAgMjYzLCAgNTAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDQyIH0sCisgICAgICAgIHsgICA1ODk4MjQsICAyMjA4MCwgIDQyMCwgMTM1MDAwLCBPTVhfVklERU9fQVZDTGV2ZWw1ICB9LAorICAgICAgICB7ICAgOTgzMDQwLCAgMzY4NjQsICA1NDMsIDI0MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNTEgfSwKKyAgICAgICAgeyAgMjA3MzYwMCwgIDM2ODY0LCAgNTQzLCAyNDAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDUyIH0sCisgICAgICAgIHsgIDQxNzc5MjAsIDEzOTI2NCwgMTA1NSwgMjQwMDAwLCBPTVhfVklERU9fQVZDTGV2ZWw2ICB9LAorICAgICAgICB7ICA4MzU1ODQwLCAxMzkyNjQsIDEwNTUsIDQ4MDAwMCwgT01YX1ZJREVPX0FWQ0xldmVsNjEgfSwKKyAgICAgICAgeyAxNjcxMTY4MCwgMTM5MjY0LCAxMDU1LCA4MDAwMDAsIE9NWF9WSURFT19BVkNMZXZlbDYyIH0sCiAgICAgfTsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShsaW1pdHMpOyBpKyspIHsKQEAgLTQzNTMsMTIgKzQ0MzksMTMgQEAKICAgICAgICAgICAgIGgyNjR0eXBlLmVQcm9maWxlID09IE9NWF9WSURFT19BVkNQcm9maWxlSGlnaCkgewogICAgICAgICBoMjY0dHlwZS5uU2xpY2VIZWFkZXJTcGFjaW5nID0gMDsKICAgICAgICAgaDI2NHR5cGUuYlVzZUhhZGFtYXJkID0gT01YX1RSVUU7Ci0gICAgICAgIGgyNjR0eXBlLm5SZWZGcmFtZXMgPSAyOwotICAgICAgICBoMjY0dHlwZS5uQkZyYW1lcyA9IG1MYXRlbmN5ID09IDAgPyAxIDogc3RkOjptaW4oMVUsIG1MYXRlbmN5IC0gMSk7Ci0KLSAgICAgICAgLy8gZGlzYWJsZSBCLWZyYW1lcyB1bnRpbCBNUEVHNFdyaXRlciBjYW4gZ3VhcmFudGVlIGZpbmFsaXppbmcgZmlsZXMgd2l0aCBCLWZyYW1lcwotICAgICAgICBoMjY0dHlwZS5uUmVmRnJhbWVzID0gMTsKLSAgICAgICAgaDI2NHR5cGUubkJGcmFtZXMgPSAwOworICAgICAgICBpbnQzMl90IG1heEJmcmFtZXMgPSAwOworICAgICAgICAodm9pZCltc2ctPmZpbmRJbnQzMihLRVlfTUFYX0JfRlJBTUVTLCAmbWF4QmZyYW1lcyk7CisgICAgICAgIGgyNjR0eXBlLm5CRnJhbWVzID0gdWludDMyX3QobWF4QmZyYW1lcyk7CisgICAgICAgIGlmIChtTGF0ZW5jeSAmJiBoMjY0dHlwZS5uQkZyYW1lcyA+ICptTGF0ZW5jeSkgeworICAgICAgICAgICAgaDI2NHR5cGUubkJGcmFtZXMgPSAqbUxhdGVuY3k7CisgICAgICAgIH0KKyAgICAgICAgaDI2NHR5cGUublJlZkZyYW1lcyA9IGgyNjR0eXBlLm5CRnJhbWVzID09IDAgPyAxIDogMjsKIAogICAgICAgICBoMjY0dHlwZS5uUEZyYW1lcyA9IHNldFBGcmFtZXNTcGFjaW5nKGlGcmFtZUludGVydmFsLCBmcmFtZVJhdGUsIGgyNjR0eXBlLm5CRnJhbWVzKTsKICAgICAgICAgaDI2NHR5cGUubkFsbG93ZWRQaWN0dXJlVHlwZXMgPQpAQCAtNDQyNiwyMiArNDUxMywzOCBAQAogc3RhdHVzX3QgQUNvZGVjOjpjb25maWd1cmVJbWFnZUdyaWQoCiAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBzcDxBTWVzc2FnZT4gJm91dHB1dEZvcm1hdCkgewogICAgIGludDMyX3QgdGlsZVdpZHRoLCB0aWxlSGVpZ2h0LCBncmlkUm93cywgZ3JpZENvbHM7Ci0gICAgaWYgKCFtc2ctPmZpbmRJbnQzMigidGlsZS13aWR0aCIsICZ0aWxlV2lkdGgpIHx8Ci0gICAgICAgICFtc2ctPmZpbmRJbnQzMigidGlsZS1oZWlnaHQiLCAmdGlsZUhlaWdodCkgfHwKLSAgICAgICAgIW1zZy0+ZmluZEludDMyKCJncmlkLXJvd3MiLCAmZ3JpZFJvd3MpIHx8Ci0gICAgICAgICFtc2ctPmZpbmRJbnQzMigiZ3JpZC1jb2xzIiwgJmdyaWRDb2xzKSkgeworICAgIE9NWF9CT09MIHVzZUdyaWQgPSBPTVhfRkFMU0U7CisgICAgaWYgKG1zZy0+ZmluZEludDMyKCJ0aWxlLXdpZHRoIiwgJnRpbGVXaWR0aCkgJiYKKyAgICAgICAgbXNnLT5maW5kSW50MzIoInRpbGUtaGVpZ2h0IiwgJnRpbGVIZWlnaHQpICYmCisgICAgICAgIG1zZy0+ZmluZEludDMyKCJncmlkLXJvd3MiLCAmZ3JpZFJvd3MpICYmCisgICAgICAgIG1zZy0+ZmluZEludDMyKCJncmlkLWNvbHMiLCAmZ3JpZENvbHMpKSB7CisgICAgICAgIHVzZUdyaWQgPSBPTVhfVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyB3aGVuIGJFbmFibGVkIGlzIGZhbHNlLCB0aGUgdGlsZSBpbmZvIGlzIG5vdCB1c2VkLAorICAgICAgICAvLyBidXQgY2xlYXIgb3V0IHRoZXNlIHRvby4KKyAgICAgICAgdGlsZVdpZHRoID0gdGlsZUhlaWdodCA9IGdyaWRSb3dzID0gZ3JpZENvbHMgPSAwOworICAgIH0KKworICAgIGlmICghbUlzSW1hZ2UgJiYgIXVzZUdyaWQpIHsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAogICAgIE9NWF9WSURFT19QQVJBTV9BTkRST0lEX0lNQUdFR1JJRFRZUEUgZ3JpZFR5cGU7CiAgICAgSW5pdE9NWFBhcmFtcygmZ3JpZFR5cGUpOwogICAgIGdyaWRUeXBlLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OwotICAgIGdyaWRUeXBlLmJFbmFibGVkID0gT01YX1RSVUU7CisgICAgZ3JpZFR5cGUuYkVuYWJsZWQgPSB1c2VHcmlkOwogICAgIGdyaWRUeXBlLm5UaWxlV2lkdGggPSB0aWxlV2lkdGg7CiAgICAgZ3JpZFR5cGUublRpbGVIZWlnaHQgPSB0aWxlSGVpZ2h0OwogICAgIGdyaWRUeXBlLm5HcmlkUm93cyA9IGdyaWRSb3dzOwogICAgIGdyaWRUeXBlLm5HcmlkQ29scyA9IGdyaWRDb2xzOwogCisgICAgQUxPR1YoInNlbmRpbmcgaW1hZ2UgZ3JpZCBpbmZvIHRvIGNvbXBvbmVudDogYkVuYWJsZWQgJWQsIHRpbGUgJWR4JWQsIGdyaWQgJWR4JWQiLAorICAgICAgICAgICAgZ3JpZFR5cGUuYkVuYWJsZWQsCisgICAgICAgICAgICBncmlkVHlwZS5uVGlsZVdpZHRoLAorICAgICAgICAgICAgZ3JpZFR5cGUublRpbGVIZWlnaHQsCisgICAgICAgICAgICBncmlkVHlwZS5uR3JpZFJvd3MsCisgICAgICAgICAgICBncmlkVHlwZS5uR3JpZENvbHMpOworCiAgICAgc3RhdHVzX3QgZXJyID0gbU9NWE5vZGUtPnNldFBhcmFtZXRlcigKICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtVmlkZW9BbmRyb2lkSW1hZ2VHcmlkLAogICAgICAgICAgICAgJmdyaWRUeXBlLCBzaXplb2YoZ3JpZFR5cGUpKTsKQEAgLTQ0NjIsNiArNDU2NSwxMyBAQAogICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpT01YX0luZGV4UGFyYW1WaWRlb0FuZHJvaWRJbWFnZUdyaWQsCiAgICAgICAgICAgICAmZ3JpZFR5cGUsIHNpemVvZihncmlkVHlwZSkpOwogCisgICAgQUxPR1YoInJlY2VpdmVkIGltYWdlIGdyaWQgaW5mbyBmcm9tIGNvbXBvbmVudDogYkVuYWJsZWQgJWQsIHRpbGUgJWR4JWQsIGdyaWQgJWR4JWQiLAorICAgICAgICAgICAgZ3JpZFR5cGUuYkVuYWJsZWQsCisgICAgICAgICAgICBncmlkVHlwZS5uVGlsZVdpZHRoLAorICAgICAgICAgICAgZ3JpZFR5cGUublRpbGVIZWlnaHQsCisgICAgICAgICAgICBncmlkVHlwZS5uR3JpZFJvd3MsCisgICAgICAgICAgICBncmlkVHlwZS5uR3JpZENvbHMpOworCiAgICAgaWYgKGVyciA9PSBPSyAmJiBncmlkVHlwZS5iRW5hYmxlZCkgewogICAgICAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKCJ0aWxlLXdpZHRoIiwgZ3JpZFR5cGUublRpbGVXaWR0aCk7CiAgICAgICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoInRpbGUtaGVpZ2h0IiwgZ3JpZFR5cGUublRpbGVIZWlnaHQpOwpAQCAtNTI0NCw2ICs1MzU0LDI1IEBACiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIGNhc2UgT01YX0FVRElPX0NvZGluZ0FuZHJvaWRBQzQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBPTVhfQVVESU9fUEFSQU1fQU5EUk9JRF9BQzRUWVBFIHBhcmFtczsKKyAgICAgICAgICAgICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBwb3J0SW5kZXg7CisKKyAgICAgICAgICAgICAgICAgICAgZXJyID0gbU9NWE5vZGUtPmdldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoT01YX0lOREVYVFlQRSlPTVhfSW5kZXhQYXJhbUF1ZGlvQW5kcm9pZEFjNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBlcnI7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBub3RpZnktPnNldFN0cmluZygibWltZSIsIE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCk7CisgICAgICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoImNoYW5uZWwtY291bnQiLCBwYXJhbXMubkNoYW5uZWxzKTsKKyAgICAgICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBwYXJhbXMublNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisKICAgICAgICAgICAgICAgICBjYXNlIE9NWF9BVURJT19Db2RpbmdBbmRyb2lkT1BVUzoKICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgIE9NWF9BVURJT19QQVJBTV9BTkRST0lEX09QVVNUWVBFIHBhcmFtczsKQEAgLTUzMjQsNiArNTQ1Myw3MCBAQAogICAgIHJldHVybiBnZXRWZW5kb3JQYXJhbWV0ZXJzKHBvcnRJbmRleCwgbm90aWZ5KTsKIH0KIAorRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zKiBBQ29kZWM6OmdldEhEUjEwUGx1c0luZm8oc2l6ZV90IHBhcmFtU2l6ZVVzZWQpIHsKKyAgICBpZiAobURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4ID09IDApIHsKKyAgICAgICAgQUxPR0UoImdldEhEUjEwUGx1c0luZm86IGRvZXMgbm90IHN1cHBvcnQgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIHNpemVfdCBuZXdTaXplID0gc2l6ZW9mKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcykgLSAxICsKKyAgICAgICAgICAgICgocGFyYW1TaXplVXNlZCA+IDApID8gcGFyYW1TaXplVXNlZCA6IDUxMik7CisgICAgaWYgKG1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyID09IG51bGxwdHIKKyAgICAgICAgICAgIHx8IG5ld1NpemUgPiBtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlci0+c2l6ZSgpKSB7CisgICAgICAgIG1IZHIxMFBsdXNTY3JhdGNoQnVmZmVyID0gbmV3IEFCdWZmZXIobmV3U2l6ZSk7CisgICAgfQorICAgIERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAqY29uZmlnID0KKyAgICAgICAgICAgIChEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKiltSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlci0+ZGF0YSgpOworICAgIEluaXRPTVhQYXJhbXMoY29uZmlnKTsKKyAgICBjb25maWctPm5TaXplID0gbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXItPnNpemUoKTsKKyAgICBjb25maWctPm5Qb3J0SW5kZXggPSAxOworICAgIHNpemVfdCBwYXJhbVNpemUgPSBjb25maWctPm5TaXplIC0gc2l6ZW9mKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcykgKyAxOworICAgIGNvbmZpZy0+blBhcmFtU2l6ZSA9IHBhcmFtU2l6ZTsKKyAgICBjb25maWctPm5QYXJhbVNpemVVc2VkID0gMDsKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YTm9kZS0+Z2V0Q29uZmlnKAorICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4LAorICAgICAgICAgICAgY29uZmlnLCBjb25maWctPm5TaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZ2V0IERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAoZXJyICVkKSIsIGVycik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBpZiAoY29uZmlnLT5uUGFyYW1TaXplICE9IHBhcmFtU2l6ZSkgeworICAgICAgICBBTE9HRSgiRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zIGFsdGVycyBuUGFyYW1TaXplOiAldSB2cyAlenUiLAorICAgICAgICAgICAgICAgIGNvbmZpZy0+blBhcmFtU2l6ZSwgcGFyYW1TaXplKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChwYXJhbVNpemVVc2VkID4gMCAmJiBjb25maWctPm5QYXJhbVNpemVVc2VkICE9IHBhcmFtU2l6ZVVzZWQpIHsKKyAgICAgICAgQUxPR0UoIkRlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyByZXR1cm5zIHdyb25nIG5QYXJhbVNpemVVc2VkOiAldSB2cyAlenUiLAorICAgICAgICAgICAgICAgIGNvbmZpZy0+blBhcmFtU2l6ZVVzZWQsIHBhcmFtU2l6ZVVzZWQpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIGNvbmZpZzsKK30KKwordm9pZCBBQ29kZWM6Om9uQ29uZmlnVXBkYXRlKE9NWF9JTkRFWFRZUEUgY29uZmlnSW5kZXgpIHsKKyAgICBpZiAobURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4ID09IDAKKyAgICAgICAgICAgIHx8IGNvbmZpZ0luZGV4ICE9IG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCkgeworICAgICAgICAvLyBtRGVzY3JpYmVIRFIxMFBsdXNJbmZvSW5kZXggaXMgdGhlIG9ubHkgdXBkYXRlIHdlIHJlY29nbml6ZSBub3cKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAqY29uZmlnID0gZ2V0SERSMTBQbHVzSW5mbygpOworICAgIGlmIChjb25maWcgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChjb25maWctPm5QYXJhbVNpemVVc2VkID4gY29uZmlnLT5uUGFyYW1TaXplKSB7CisgICAgICAgIC8vIHRyeSBhZ2FpbiB3aXRoIHRoZSBzaXplIHNwZWNpZmllZAorICAgICAgICBjb25maWcgPSBnZXRIRFIxMFBsdXNJbmZvKGNvbmZpZy0+blBhcmFtU2l6ZVVzZWQpOworICAgICAgICBpZiAoY29uZmlnID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIG1PdXRwdXRGb3JtYXQgPSBtT3V0cHV0Rm9ybWF0LT5kdXAoKTsgLy8gdHJpZ2dlciBhbiBvdXRwdXQgZm9ybWF0IGNoYW5nZWQgZXZlbnQKKyAgICBtT3V0cHV0Rm9ybWF0LT5zZXRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsCisgICAgICAgICAgICBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoY29uZmlnLT5uVmFsdWUsIGNvbmZpZy0+blBhcmFtU2l6ZVVzZWQpKTsKK30KKwogdm9pZCBBQ29kZWM6Om9uRGF0YVNwYWNlQ2hhbmdlZChhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsIGNvbnN0IENvbG9yQXNwZWN0cyAmYXNwZWN0cykgewogICAgIC8vIGFzcGVjdHMgYXJlIG5vcm1hbGx5IGNvbW11bmljYXRlZCBpbiBDb2xvckFzcGVjdHMKICAgICBpbnQzMl90IHJhbmdlLCBzdGFuZGFyZCwgdHJhbnNmZXI7CkBAIC01NTU5LDYgKzU3NTIsMTEgQEAKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBrV2hhdENoZWNrSWZTdHVjazogeworICAgICAgICAgICAgQUxPR1YoIk5vLW9wIGJ5IGRlZmF1bHQiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC02MjU5LDYgKzY0NTcsMTUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIHNwPEFCdWZmZXI+IGhkcjEwUGx1c0luZm87CisgICAgICAgIGlmIChidWZmZXItPmZvcm1hdCgpLT5maW5kQnVmZmVyKCJoZHIxMC1wbHVzLWluZm8iLCAmaGRyMTBQbHVzSW5mbykKKyAgICAgICAgICAgICAgICAmJiBoZHIxMFBsdXNJbmZvICE9IG51bGxwdHIgJiYgaGRyMTBQbHVzSW5mby0+c2l6ZSgpID4gMAorICAgICAgICAgICAgICAgICYmIGhkcjEwUGx1c0luZm8gIT0gbUNvZGVjLT5tTGFzdEhkcjEwUGx1c0J1ZmZlcikgeworICAgICAgICAgICAgbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19oZHIxMF9wbHVzX21ldGFkYXRhKG1Db2RlYy0+bU5hdGl2ZVdpbmRvdy5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+c2l6ZSgpLCBoZHIxMFBsdXNJbmZvLT5kYXRhKCkpOworICAgICAgICAgICAgbUNvZGVjLT5tTGFzdEhkcjEwUGx1c0J1ZmZlciA9IGhkcjEwUGx1c0luZm87CisgICAgICAgIH0KKwogICAgICAgICAvLyBzYXZlIGJ1ZmZlcnMgc2VudCB0byB0aGUgc3VyZmFjZSBzbyB3ZSBjYW4gZ2V0IHJlbmRlciB0aW1lIHdoZW4gdGhleSByZXR1cm4KICAgICAgICAgaW50NjRfdCBtZWRpYVRpbWVVcyA9IC0xOwogICAgICAgICBidWZmZXItPm1ldGEoKS0+ZmluZEludDY0KCJ0aW1lVXMiLCAmbWVkaWFUaW1lVXMpOwpAQCAtNjM2Nyw4ICs2NTc0LDEwIEBACiAKICAgICBpZiAobURlYXRoTm90aWZpZXIgIT0gTlVMTCkgewogICAgICAgICBpZiAobUNvZGVjLT5tT01YTm9kZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBhdXRvIHRPbXhOb2RlID0gbUNvZGVjLT5tT01YTm9kZS0+Z2V0SGFsSW50ZXJmYWNlKCk7Ci0gICAgICAgICAgICB0T214Tm9kZS0+dW5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllcik7CisgICAgICAgICAgICBhdXRvIHRPbXhOb2RlID0gbUNvZGVjLT5tT01YTm9kZS0+Z2V0SGFsSW50ZXJmYWNlPElPbXhOb2RlPigpOworICAgICAgICAgICAgaWYgKHRPbXhOb2RlKSB7CisgICAgICAgICAgICAgICAgdE9teE5vZGUtPnVubGlua1RvRGVhdGgobURlYXRoTm90aWZpZXIpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIG1EZWF0aE5vdGlmaWVyLmNsZWFyKCk7CiAgICAgfQpAQCAtNjQ1NSw3ICs2NjY0LDggQEAKIAogICAgIENIRUNLKG1Db2RlYy0+bU9NWE5vZGUgPT0gTlVMTCk7CiAKLSAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0T01YRGllZCwgbUNvZGVjKTsKKyAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0T01YTWVzc2FnZUxpc3QsIG1Db2RlYyk7CisgICAgbm90aWZ5LT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Db2RlYy0+bU5vZGVHZW5lcmF0aW9uICsgMSk7CiAKICAgICBzcDxSZWZCYXNlPiBvYmo7CiAgICAgQ0hFQ0sobXNnLT5maW5kT2JqZWN0KCJjb2RlY0luZm8iLCAmb2JqKSk7CkBAIC02NDcwLDcgKzY2ODAsNyBAQAogICAgIEFTdHJpbmcgY29tcG9uZW50TmFtZTsKICAgICBDSEVDSyhtc2ctPmZpbmRTdHJpbmcoImNvbXBvbmVudE5hbWUiLCAmY29tcG9uZW50TmFtZSkpOwogCi0gICAgc3A8Q29kZWNPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBuZXcgQ29kZWNPYnNlcnZlcjsKKyAgICBzcDxDb2RlY09ic2VydmVyPiBvYnNlcnZlciA9IG5ldyBDb2RlY09ic2VydmVyKG5vdGlmeSk7CiAgICAgc3A8SU9NWD4gb214OwogICAgIHNwPElPTVhOb2RlPiBvbXhOb2RlOwogCkBAIC02NDk1LDE1ICs2NzA1LDEzIEBACiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBtRGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKG5vdGlmeSk7Ci0gICAgYXV0byB0T214Tm9kZSA9IG9teE5vZGUtPmdldEhhbEludGVyZmFjZSgpOwotICAgIGlmICghdE9teE5vZGUtPmxpbmtUb0RlYXRoKG1EZWF0aE5vdGlmaWVyLCAwKSkgeworICAgIG1EZWF0aE5vdGlmaWVyID0gbmV3IERlYXRoTm90aWZpZXIobmV3IEFNZXNzYWdlKGtXaGF0T01YRGllZCwgbUNvZGVjKSk7CisgICAgYXV0byB0T214Tm9kZSA9IG9teE5vZGUtPmdldEhhbEludGVyZmFjZTxJT214Tm9kZT4oKTsKKyAgICBpZiAodE9teE5vZGUgJiYgIXRPbXhOb2RlLT5saW5rVG9EZWF0aChtRGVhdGhOb3RpZmllciwgMCkpIHsKICAgICAgICAgbURlYXRoTm90aWZpZXIuY2xlYXIoKTsKICAgICB9CiAKLSAgICBub3RpZnkgPSBuZXcgQU1lc3NhZ2Uoa1doYXRPTVhNZXNzYWdlTGlzdCwgbUNvZGVjKTsKLSAgICBub3RpZnktPnNldEludDMyKCJnZW5lcmF0aW9uIiwgKyttQ29kZWMtPm1Ob2RlR2VuZXJhdGlvbik7Ci0gICAgb2JzZXJ2ZXItPnNldE5vdGlmaWNhdGlvbk1lc3NhZ2Uobm90aWZ5KTsKKyAgICArK21Db2RlYy0+bU5vZGVHZW5lcmF0aW9uOwogCiAgICAgbUNvZGVjLT5tQ29tcG9uZW50TmFtZSA9IGNvbXBvbmVudE5hbWU7CiAgICAgbUNvZGVjLT5tUmVuZGVyVHJhY2tlci5zZXRDb21wb25lbnROYW1lKGNvbXBvbmVudE5hbWUpOwpAQCAtNjY5NCw3ICs2OTAyLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChtQ29kZWMtPm1NYXhQdHNHYXBVcyAhPSAwTEwpIHsKKyAgICBpZiAobUNvZGVjLT5tSXNWaWRlbyAmJiBtQ29kZWMtPm1NYXhQdHNHYXBVcyAhPSAwTEwpIHsKICAgICAgICAgT01YX1BBUkFNX1UzMlRZUEUgbWF4UHRzR2FwUGFyYW1zOwogICAgICAgICBJbml0T01YUGFyYW1zKCZtYXhQdHNHYXBQYXJhbXMpOwogICAgICAgICBtYXhQdHNHYXBQYXJhbXMublBvcnRJbmRleCA9IGtQb3J0SW5kZXhJbnB1dDsKQEAgLTcyNjEsNyArNzQ2OSw3IEBACiAgICAgfQogCiAgICAgaW50NjRfdCB0aW1lT2Zmc2V0VXM7Ci0gICAgaWYgKHBhcmFtcy0+ZmluZEludDY0KCJ0aW1lLW9mZnNldC11cyIsICZ0aW1lT2Zmc2V0VXMpKSB7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDY0KFBBUkFNRVRFUl9LRVlfT0ZGU0VUX1RJTUUsICZ0aW1lT2Zmc2V0VXMpKSB7CiAgICAgICAgIGlmIChtR3JhcGhpY0J1ZmZlclNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgiWyVzXSBJbnZhbGlkIHRvIHNldCBpbnB1dCBidWZmZXIgdGltZSBvZmZzZXQgd2l0aG91dCBzdXJmYWNlIiwKICAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CkBAIC03Mjk3LDcgKzc1MDUsNyBAQAogICAgIH0KIAogICAgIGludDMyX3QgZHJvcElucHV0RnJhbWVzOwotICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMigiZHJvcC1pbnB1dC1mcmFtZXMiLCAmZHJvcElucHV0RnJhbWVzKSkgeworICAgIGlmIChwYXJhbXMtPmZpbmRJbnQzMihQQVJBTUVURVJfS0VZX1NVU1BFTkQsICZkcm9wSW5wdXRGcmFtZXMpKSB7CiAgICAgICAgIGlmIChtR3JhcGhpY0J1ZmZlclNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgiWyVzXSBJbnZhbGlkIHRvIHNldCBzdXNwZW5kIHdpdGhvdXQgc3VyZmFjZSIsCiAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCkpOwpAQCAtNzMwNSw3ICs3NTEzLDcgQEAKICAgICAgICAgfQogCiAgICAgICAgIGludDY0X3Qgc3VzcGVuZFN0YXJ0VGltZVVzID0gLTE7Ci0gICAgICAgICh2b2lkKSBwYXJhbXMtPmZpbmRJbnQ2NCgiZHJvcC1zdGFydC10aW1lLXVzIiwgJnN1c3BlbmRTdGFydFRpbWVVcyk7CisgICAgICAgICh2b2lkKSBwYXJhbXMtPmZpbmRJbnQ2NChQQVJBTUVURVJfS0VZX1NVU1BFTkRfVElNRSwgJnN1c3BlbmRTdGFydFRpbWVVcyk7CiAgICAgICAgIHN0YXR1c190IGVyciA9IHN0YXR1c0Zyb21CaW5kZXJTdGF0dXMoCiAgICAgICAgICAgICAgICAgbUdyYXBoaWNCdWZmZXJTb3VyY2UtPnNldFN1c3BlbmQoZHJvcElucHV0RnJhbWVzICE9IDAsIHN1c3BlbmRTdGFydFRpbWVVcykpOwogCkBAIC03Mzg1LDEyICs3NTkzLDU3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpbnQzMl90IHByZXNlbnRhdGlvbklkID0gLTE7CisgICAgaWYgKHBhcmFtcy0+ZmluZEludDMyKCJhdWRpby1wcmVzZW50YXRpb24tcHJlc2VudGF0aW9uLWlkIiwgJnByZXNlbnRhdGlvbklkKSkgeworICAgICAgICBpbnQzMl90IHByb2dyYW1JZCA9IC0xOworICAgICAgICBwYXJhbXMtPmZpbmRJbnQzMigiYXVkaW8tcHJlc2VudGF0aW9uLXByb2dyYW0taWQiLCAmcHJvZ3JhbUlkKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gc2V0QXVkaW9QcmVzZW50YXRpb24ocHJlc2VudGF0aW9uSWQsIHByb2dyYW1JZCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dJKCJbJXNdIGZhaWxlZCBzZXRBdWRpb1ByZXNlbnRhdGlvbi4gRmFpbHVyZSBpcyBmaW5lIHNpbmNlIHRoaXMga2V5IGlzIG9wdGlvbmFsIiwKKyAgICAgICAgICAgICAgICAgICAgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICBlcnIgPSBPSzsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNwPEFCdWZmZXI+IGhkcjEwUGx1c0luZm87CisgICAgaWYgKHBhcmFtcy0+ZmluZEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwgJmhkcjEwUGx1c0luZm8pCisgICAgICAgICAgICAmJiBoZHIxMFBsdXNJbmZvICE9IG51bGxwdHIgJiYgaGRyMTBQbHVzSW5mby0+c2l6ZSgpID4gMCkgeworICAgICAgICAodm9pZClzZXRIZHIxMFBsdXNJbmZvKGhkcjEwUGx1c0luZm8pOworICAgIH0KKwogICAgIC8vIElnbm9yZSBlcnJvcnMgYXMgZmFpbHVyZSBpcyBleHBlY3RlZCBmb3IgY29kZWNzIHRoYXQgYXJlbid0IHZpZGVvIGVuY29kZXJzLgogICAgICh2b2lkKWNvbmZpZ3VyZVRlbXBvcmFsTGF5ZXJzKHBhcmFtcywgZmFsc2UgLyogaW5Db25maWd1cmUgKi8sIG1PdXRwdXRGb3JtYXQpOwogCiAgICAgcmV0dXJuIHNldFZlbmRvclBhcmFtZXRlcnMocGFyYW1zKTsKIH0KIAorc3RhdHVzX3QgQUNvZGVjOjpzZXRIZHIxMFBsdXNJbmZvKGNvbnN0IHNwPEFCdWZmZXI+ICZoZHIxMFBsdXNJbmZvKSB7CisgICAgaWYgKG1EZXNjcmliZUhEUjEwUGx1c0luZm9JbmRleCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJzZXRIZHIxMFBsdXNJbmZvOiBkb2VzIG5vdCBzdXBwb3J0IERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyIpOworICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CisgICAgfQorICAgIHNpemVfdCBuZXdTaXplID0gc2l6ZW9mKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcykgKyBoZHIxMFBsdXNJbmZvLT5zaXplKCkgLSAxOworICAgIGlmIChtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlciA9PSBudWxscHRyIHx8CisgICAgICAgICAgICBuZXdTaXplID4gbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXItPnNpemUoKSkgeworICAgICAgICBtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlciA9IG5ldyBBQnVmZmVyKG5ld1NpemUpOworICAgIH0KKyAgICBEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKmNvbmZpZyA9CisgICAgICAgICAgICAoRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zICopbUhkcjEwUGx1c1NjcmF0Y2hCdWZmZXItPmRhdGEoKTsKKyAgICBJbml0T01YUGFyYW1zKGNvbmZpZyk7CisgICAgY29uZmlnLT5uUG9ydEluZGV4ID0gMDsKKyAgICBjb25maWctPm5TaXplID0gbmV3U2l6ZTsKKyAgICBjb25maWctPm5QYXJhbVNpemUgPSBoZHIxMFBsdXNJbmZvLT5zaXplKCk7CisgICAgY29uZmlnLT5uUGFyYW1TaXplVXNlZCA9IGhkcjEwUGx1c0luZm8tPnNpemUoKTsKKyAgICBtZW1jcHkoY29uZmlnLT5uVmFsdWUsIGhkcjEwUGx1c0luZm8tPmRhdGEoKSwgaGRyMTBQbHVzSW5mby0+c2l6ZSgpKTsKKyAgICBzdGF0dXNfdCBlcnIgPSBtT01YTm9kZS0+c2V0Q29uZmlnKAorICAgICAgICAgICAgKE9NWF9JTkRFWFRZUEUpbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4LAorICAgICAgICAgICAgY29uZmlnLCBjb25maWctPm5TaXplKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gc2V0IERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAoZXJyICVkKSIsIGVycik7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogLy8gUmVtb3ZlcyB0cmFpbGluZyB0YWdzIG1hdGNoaW5nIHx0YWd8IGZyb20gfGtleXwgKGUuZy4gYSBzZXR0aW5ncyBuYW1lKS4gfG1pbkxlbmd0aHwgc3BlY2lmaWVzCiAvLyB0aGUgbWluaW11bSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBrZWVwIGluIHxrZXl8IChldmVuIGlmIGl0IGhhcyB0cmFpbGluZyB0YWdzKS4KIC8vIChVc2VkIHRvIHJlbW92ZSB0cmFpbGluZyAndmFsdWUnIHRhZ3MgaW4gc2V0dGluZ3MgbmFtZXMsIGUuZy4gdG8gbm9ybWFsaXplCkBAIC03ODEyLDYgKzgwNjUsMTUgQEAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICB9CiAKKyAgICAgICAgY2FzZSBPTVhfRXZlbnRDb25maWdVcGRhdGU6CisgICAgICAgIHsKKyAgICAgICAgICAgIENIRUNLX0VRKGRhdGExLCAoT01YX1UzMilrUG9ydEluZGV4T3V0cHV0KTsKKworICAgICAgICAgICAgbUNvZGVjLT5vbkNvbmZpZ1VwZGF0ZSgoT01YX0lOREVYVFlQRSlkYXRhMik7CisKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBPTVhfRXZlbnRCdWZmZXJGbGFnOgogICAgICAgICB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTc4NzYsNiArODEzOCwxOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0Q2hlY2tJZlN0dWNrOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb24gPSAwOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gPT0gbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIFRJTUVEX09VVCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaGFuZGxlZCA9IEJhc2VTdGF0ZTo6b25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtNzg4Nyw2ICs4MTYxLDExIEBACiB2b2lkIEFDb2RlYzo6T3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlZFN0YXRlOjpzdGF0ZUVudGVyZWQoKSB7CiAgICAgQUxPR1YoIlslc10gTm93IGhhbmRsaW5nIG91dHB1dCBwb3J0IHNldHRpbmdzIGNoYW5nZSIsCiAgICAgICAgICBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOworCisgICAgLy8gSWYgd2UgaGF2ZW4ndCB0cmFuc2l0aW9uZWQgYWZ0ZXIgMyBzZWNvbmRzLCB3ZSdyZSBwcm9iYWJseSBzdHVjay4KKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKEFDb2RlYzo6a1doYXRDaGVja0lmU3R1Y2ssIG1Db2RlYyk7CisgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1Db2RlYy0+bVN0YXRlR2VuZXJhdGlvbik7CisgICAgbXNnLT5wb3N0KDMwMDAwMDApOwogfQogCiBib29sIEFDb2RlYzo6T3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlZFN0YXRlOjpvbk9NWEZyYW1lUmVuZGVyZWQoCkBAIC04MTUzLDYgKzg0MzIsMTEgQEAKICAgICBBTE9HVigiWyVzXSBOb3cgRmx1c2hpbmciLCBtQ29kZWMtPm1Db21wb25lbnROYW1lLmNfc3RyKCkpOwogCiAgICAgbUZsdXNoQ29tcGxldGVba1BvcnRJbmRleElucHV0XSA9IG1GbHVzaENvbXBsZXRlW2tQb3J0SW5kZXhPdXRwdXRdID0gZmFsc2U7CisKKyAgICAvLyBJZiB3ZSBoYXZlbid0IHRyYW5zaXRpb25lZCBhZnRlciAzIHNlY29uZHMsIHdlJ3JlIHByb2JhYmx5IHN0dWNrLgorICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2UoQUNvZGVjOjprV2hhdENoZWNrSWZTdHVjaywgbUNvZGVjKTsKKyAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKTsKKyAgICBtc2ctPnBvc3QoMzAwMDAwMCk7CiB9CiAKIGJvb2wgQUNvZGVjOjpGbHVzaGluZ1N0YXRlOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewpAQCAtODE2Nyw2ICs4NDUxLDcgQEAKICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJnZW5lcmF0aW9uIiwgbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKTsKICAgICAgICAgICAgICAgICBtc2ctPnBvc3QoMzAwMDAwMCk7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBoYW5kbGVkID0gdHJ1ZTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKQEAgLTgxODcsNiArODQ3MiwxOCBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0Q2hlY2tJZlN0dWNrOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQzMl90IGdlbmVyYXRpb24gPSAwOworICAgICAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikpOworICAgICAgICAgICAgaWYgKGdlbmVyYXRpb24gPT0gbUNvZGVjLT5tU3RhdGVHZW5lcmF0aW9uKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjLT5zaWduYWxFcnJvcihPTVhfRXJyb3JVbmRlZmluZWQsIFRJTUVEX09VVCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGhhbmRsZWQgPSB0cnVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgaGFuZGxlZCA9IEJhc2VTdGF0ZTo6b25NZXNzYWdlUmVjZWl2ZWQobXNnKTsKICAgICAgICAgICAgIGJyZWFrOwpAQCAtODMxMyw3ICs4NjEwLDcgQEAKICAgICB9CiAKICAgICBzcDxJT01YPiBvbXggPSBjbGllbnQuaW50ZXJmYWNlKCk7Ci0gICAgc3A8Q29kZWNPYnNlcnZlcj4gb2JzZXJ2ZXIgPSBuZXcgQ29kZWNPYnNlcnZlcjsKKyAgICBzcDxDb2RlY09ic2VydmVyPiBvYnNlcnZlciA9IG5ldyBDb2RlY09ic2VydmVyKG5ldyBBTWVzc2FnZSk7CiAgICAgc3A8SU9NWE5vZGU+IG9teE5vZGU7CiAKICAgICBlcnIgPSBvbXgtPmFsbG9jYXRlTm9kZShuYW1lLCBvYnNlcnZlciwgJm9teE5vZGUpOwpAQCAtODQyOSwxNCArODcyNiwxNyBAQAogICAgICAgICBpZiAob214Tm9kZS0+Y29uZmlndXJlVmlkZW9UdW5uZWxNb2RlKAogICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9UUlVFLCAwLCAmc2lkZWJhbmRIYW5kbGUpID09IE9LKSB7CiAgICAgICAgICAgICAvLyB0dW5uZWxlZCBwbGF5YmFjayBpbmNsdWRlcyBhZGFwdGl2ZSBwbGF5YmFjawotICAgICAgICAgICAgY2Fwcy0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2sKLSAgICAgICAgICAgICAgICAgICAgfCBNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjprRmxhZ1N1cHBvcnRzVHVubmVsZWRQbGF5YmFjayk7Ci0gICAgICAgIH0gZWxzZSBpZiAob214Tm9kZS0+c2V0UG9ydE1vZGUoCi0gICAgICAgICAgICAgICAga1BvcnRJbmRleE91dHB1dCwgSU9NWDo6a1BvcnRNb2RlRHluYW1pY0FOV0J1ZmZlcikgPT0gT0sgfHwKLSAgICAgICAgICAgICAgICBvbXhOb2RlLT5wcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKLSAgICAgICAgICAgICAgICBrUG9ydEluZGV4T3V0cHV0LCBPTVhfVFJVRSwKLSAgICAgICAgICAgICAgICAxMjgwIC8qIHdpZHRoICovLCA3MjAgLyogaGVpZ2h0ICovKSA9PSBPSykgewotICAgICAgICAgICAgY2Fwcy0+YWRkRmxhZ3MoTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllczo6a0ZsYWdTdXBwb3J0c0FkYXB0aXZlUGxheWJhY2spOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gdHVubmVsZWQgcGxheWJhY2sgaXMgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgY2Fwcy0+cmVtb3ZlRGV0YWlsKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfVFVOTkVMRURfUExBWUJBQ0spOworICAgICAgICAgICAgaWYgKG9teE5vZGUtPnNldFBvcnRNb2RlKAorICAgICAgICAgICAgICAgICAgICBrUG9ydEluZGV4T3V0cHV0LCBJT01YOjprUG9ydE1vZGVEeW5hbWljQU5XQnVmZmVyKSAhPSBPSyAmJgorICAgICAgICAgICAgICAgICAgICBvbXhOb2RlLT5wcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgIGtQb3J0SW5kZXhPdXRwdXQsIE9NWF9UUlVFLAorICAgICAgICAgICAgICAgICAgICAgICAgMTI4MCAvKiB3aWR0aCAqLywgNzIwIC8qIGhlaWdodCAqLykgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAvLyBhZGFwdGl2ZSBwbGF5YmFjayBpcyBub3Qgc3VwcG9ydGVkCisgICAgICAgICAgICAgICAgY2Fwcy0+cmVtb3ZlRGV0YWlsKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfQURBUFRJVkVfUExBWUJBQ0spOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC04NDQ0LDExICs4NzQ0LDIwIEBACiAgICAgICAgIE9NWF9WSURFT19DT05GSUdfQU5EUk9JRF9JTlRSQVJFRlJFU0hUWVBFIHBhcmFtczsKICAgICAgICAgSW5pdE9NWFBhcmFtcygmcGFyYW1zKTsKICAgICAgICAgcGFyYW1zLm5Qb3J0SW5kZXggPSBrUG9ydEluZGV4T3V0cHV0OwotICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgdmVyaWZ5IGlmIGZhbGxiYWNrIGlzIHN1cHBvcnRlZD8KKworICAgICAgICBPTVhfVklERU9fUEFSQU1fSU5UUkFSRUZSRVNIVFlQRSBmYWxsYmFja1BhcmFtczsKKyAgICAgICAgSW5pdE9NWFBhcmFtcygmZmFsbGJhY2tQYXJhbXMpOworICAgICAgICBmYWxsYmFja1BhcmFtcy5uUG9ydEluZGV4ID0ga1BvcnRJbmRleE91dHB1dDsKKyAgICAgICAgZmFsbGJhY2tQYXJhbXMuZVJlZnJlc2hNb2RlID0gT01YX1ZJREVPX0ludHJhUmVmcmVzaEN5Y2xpYzsKKwogICAgICAgICBpZiAob214Tm9kZS0+Z2V0Q29uZmlnKAogICAgICAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleENvbmZpZ0FuZHJvaWRJbnRyYVJlZnJlc2gsCi0gICAgICAgICAgICAgICAgJnBhcmFtcywgc2l6ZW9mKHBhcmFtcykpID09IE9LKSB7Ci0gICAgICAgICAgICBjYXBzLT5hZGRGbGFncyhNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzOjprRmxhZ1N1cHBvcnRzSW50cmFSZWZyZXNoKTsKKyAgICAgICAgICAgICAgICAmcGFyYW1zLCBzaXplb2YocGFyYW1zKSkgIT0gT0sgJiYKKyAgICAgICAgICAgICAgICBvbXhOb2RlLT5nZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgICAgIE9NWF9JbmRleFBhcmFtVmlkZW9JbnRyYVJlZnJlc2gsICZmYWxsYmFja1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGZhbGxiYWNrUGFyYW1zKSkgIT0gT0spIHsKKyAgICAgICAgICAgIC8vIGludHJhIHJlZnJlc2ggaXMgbm90IHN1cHBvcnRlZAorICAgICAgICAgICAgY2Fwcy0+cmVtb3ZlRGV0YWlsKE1lZGlhQ29kZWNJbmZvOjpDYXBhYmlsaXRpZXM6OkZFQVRVUkVfSU5UUkFfUkVGUkVTSCk7CiAgICAgICAgIH0KICAgICB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FDb2RlY0J1ZmZlckNoYW5uZWwuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKaW5kZXggNzEwYWU2OC4uMjY2YTI0MCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAKQEAgLTEyOSw2ICsxMjksNyBAQAogICAgICAgICBzZWN1cmVIYW5kbGUgPSBzdGF0aWNfY2FzdDxuYXRpdmVfaGFuZGxlX3QgKj4oc2VjdXJlRGF0YS0+Z2V0RGVzdGluYXRpb25Qb2ludGVyKCkpOwogICAgIH0KICAgICBzc2l6ZV90IHJlc3VsdCA9IC0xOworICAgIHNzaXplX3QgY29kZWNEYXRhT2Zmc2V0ID0gMDsKICAgICBpZiAobUNyeXB0byAhPSBOVUxMKSB7CiAgICAgICAgIElDcnlwdG86OkRlc3RpbmF0aW9uQnVmZmVyIGRlc3RpbmF0aW9uOwogICAgICAgICBpZiAoc2VjdXJlKSB7CkBAIC0xODAsOSArMTgxLDE2IEBACiAKICAgICAgICAgU3RhdHVzIHN0YXR1cyA9IFN0YXR1czo6T0s7CiAgICAgICAgIGhpZGxfc3RyaW5nIGRldGFpbGVkRXJyb3I7CisgICAgICAgIFNjcmFtYmxpbmdDb250cm9sIHNjdHJsID0gU2NyYW1ibGluZ0NvbnRyb2w6OlVOU0NSQU1CTEVEOworCisgICAgICAgIGlmIChrZXkgIT0gTlVMTCkgeworICAgICAgICAgICAgc2N0cmwgPSAoU2NyYW1ibGluZ0NvbnRyb2wpa2V5WzBdOworICAgICAgICAgICAgLy8gQWRqdXN0IGZvciB0aGUgUEVTIG9mZnNldAorICAgICAgICAgICAgY29kZWNEYXRhT2Zmc2V0ID0ga2V5WzJdIHwgKGtleVszXSA8PCA4KTsKKyAgICAgICAgfQogCiAgICAgICAgIGF1dG8gcmV0dXJuVm9pZCA9IG1EZXNjcmFtYmxlci0+ZGVzY3JhbWJsZSgKLSAgICAgICAgICAgICAgICBrZXkgIT0gTlVMTCA/IChTY3JhbWJsaW5nQ29udHJvbClrZXlbMF0gOiBTY3JhbWJsaW5nQ29udHJvbDo6VU5TQ1JBTUJMRUQsCisgICAgICAgICAgICAgICAgc2N0cmwsCiAgICAgICAgICAgICAgICAgaGlkbFN1YlNhbXBsZXMsCiAgICAgICAgICAgICAgICAgc3JjQnVmZmVyLAogICAgICAgICAgICAgICAgIDAsCkBAIC0yMDIsNiArMjEwLDExIEBACiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogCisgICAgICAgIGlmIChyZXN1bHQgPCBjb2RlY0RhdGFPZmZzZXQpIHsKKyAgICAgICAgICAgIEFMT0dEKCJpbnZhbGlkIGNvZGVjIGRhdGEgb2Zmc2V0OiAlemQsIHJlc3VsdCAlemQiLCBjb2RlY0RhdGFPZmZzZXQsIHJlc3VsdCk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKICAgICAgICAgQUxPR1YoImRlc2NyYW1ibGUgc3VjY2VlZGVkLCAlemQgYnl0ZXMiLCByZXN1bHQpOwogCiAgICAgICAgIGlmIChkc3RCdWZmZXIudHlwZSA9PSBCdWZmZXJUeXBlOjpTSEFSRURfTUVNT1JZKSB7CkBAIC0yMTAsNyArMjIzLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGl0LT5tQ29kZWNCdWZmZXItPnNldFJhbmdlKDAsIHJlc3VsdCk7CisgICAgaXQtPm1Db2RlY0J1ZmZlci0+c2V0UmFuZ2UoY29kZWNEYXRhT2Zmc2V0LCByZXN1bHQgLSBjb2RlY0RhdGFPZmZzZXQpOwogCiAgICAgLy8gQ29weSBtZXRhZGF0YSBmcm9tIGNsaWVudCB0byBjb2RlYyBidWZmZXIuCiAgICAgaXQtPm1Db2RlY0J1ZmZlci0+bWV0YSgpLT5jbGVhcigpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODliOGIwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKQEAgLTAsMCArMSwxMTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitBU3RhdGU6OkFTdGF0ZShjb25zdCBzcDxBU3RhdGU+ICZwYXJlbnRTdGF0ZSkKKyAgICA6IG1QYXJlbnRTdGF0ZShwYXJlbnRTdGF0ZSkgeworfQorCitBU3RhdGU6On5BU3RhdGUoKSB7Cit9CisKK3NwPEFTdGF0ZT4gQVN0YXRlOjpwYXJlbnRTdGF0ZSgpIHsKKyAgICByZXR1cm4gbVBhcmVudFN0YXRlOworfQorCit2b2lkIEFTdGF0ZTo6c3RhdGVFbnRlcmVkKCkgeworfQorCit2b2lkIEFTdGF0ZTo6c3RhdGVFeGl0ZWQoKSB7Cit9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUoKSB7Cit9CisKK0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6On5BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lKCkgeworfQorCit2b2lkIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OmhhbmRsZU1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKKyAgICBzcDxBU3RhdGU+IHNhdmUgPSBtU3RhdGU7CisKKyAgICBzcDxBU3RhdGU+IGN1ciA9IG1TdGF0ZTsKKyAgICB3aGlsZSAoY3VyICE9IE5VTEwgJiYgIWN1ci0+b25NZXNzYWdlUmVjZWl2ZWQobXNnKSkgeworICAgICAgICAvLyBJZiB5b3UgY2xhaW0gbm90IHRvIGhhdmUgaGFuZGxlZCB0aGUgbWVzc2FnZSB5b3Ugc2hvdWxkbid0CisgICAgICAgIC8vIGhhdmUgY2FsbGVkIHNldFN0YXRlLi4uCisgICAgICAgIENIRUNLKHNhdmUgPT0gbVN0YXRlKTsKKworICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7CisgICAgfQorCisgICAgaWYgKGN1ciAhPSBOVUxMKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVygiV2FybmluZyBtZXNzYWdlICVzIHVuaGFuZGxlZCBpbiByb290IHN0YXRlLiIsCisgICAgICAgICBtc2ctPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7Cit9CisKK3ZvaWQgQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZTo6Y2hhbmdlU3RhdGUoY29uc3Qgc3A8QVN0YXRlPiAmc3RhdGUpIHsKKyAgICBpZiAoc3RhdGUgPT0gbVN0YXRlKSB7CisgICAgICAgIC8vIFF1aWNrIGV4aXQgZm9yIHRoZSBlYXN5IGNhc2UuCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBWZWN0b3I8c3A8QVN0YXRlPiA+IEE7CisgICAgc3A8QVN0YXRlPiBjdXIgPSBtU3RhdGU7CisgICAgZm9yICg7OykgeworICAgICAgICBBLnB1c2goY3VyKTsKKyAgICAgICAgaWYgKGN1ciA9PSBOVUxMKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBjdXIgPSBjdXItPnBhcmVudFN0YXRlKCk7CisgICAgfQorCisgICAgVmVjdG9yPHNwPEFTdGF0ZT4gPiBCOworICAgIGN1ciA9IHN0YXRlOworICAgIGZvciAoOzspIHsKKyAgICAgICAgQi5wdXNoKGN1cik7CisgICAgICAgIGlmIChjdXIgPT0gTlVMTCkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY3VyID0gY3VyLT5wYXJlbnRTdGF0ZSgpOworICAgIH0KKworICAgIC8vIFJlbW92ZSB0aGUgY29tbW9uIHRhaWwuCisgICAgd2hpbGUgKEEuc2l6ZSgpID4gMCAmJiBCLnNpemUoKSA+IDAgJiYgQS50b3AoKSA9PSBCLnRvcCgpKSB7CisgICAgICAgIEEucG9wKCk7CisgICAgICAgIEIucG9wKCk7CisgICAgfQorCisgICAgbVN0YXRlID0gc3RhdGU7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEEuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgQS5lZGl0SXRlbUF0KGkpLT5zdGF0ZUV4aXRlZCgpOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPSBCLnNpemUoKTsgaSA+IDA7KSB7CisgICAgICAgIGktLTsKKyAgICAgICAgQi5lZGl0SXRlbUF0KGkpLT5zdGF0ZUVudGVyZWQoKTsKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmNwcAppbmRleCA0MTEwNmExLi4yNGY2ZjBiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BTVJXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FNUldyaXRlci5jcHAKQEAgLTE0OSwxMSArMTQ5LDExIEBACiAgICAgbURvbmUgPSB0cnVlOwogCiAgICAgdm9pZCAqZHVtbXk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVNvdXJjZS0+c3RvcCgpOwogICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmZHVtbXkpOwogCiAgICAgc3RhdHVzX3QgZXJyID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihkdW1teSkpOwogICAgIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVNvdXJjZS0+c3RvcCgpOwogICAgICAgICBpZiAoZXJyID09IE9LICYmCiAgICAgICAgICAgICAoc3RhdHVzICE9IE9LICYmIHN0YXR1cyAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSkgewogICAgICAgICAgICAgZXJyID0gc3RhdHVzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0FuZHJvaWQuYnAKaW5kZXggODllN2M1NC4uMThkYWNiOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BbmRyb2lkLmJwCkBAIC0xOSw4ICsxOSwxMCBAQAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKLQotICAgIHNoYXJlZF9saWJzOiBbImxpYm1lZGlhIl0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidXRpbHMiCisgICAgXSwKIH0KIAogY2NfbGlicmFyeV9zdGF0aWMgewpAQCAtMzksNyArNDEsNyBAQAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKIAotICAgIHNoYXJlZF9saWJzOiBbImxpYm1lZGlhIl0sCisgICAgc2hhcmVkX2xpYnM6IFsibGlibWVkaWEiLCAibGlibWVkaWFuZGsiXSwKIH0KIAogY2NfbGlicmFyeV9zaGFyZWQgewpAQCAtNTgsMTAgKzYwLDE0IEBACiAgICAgICAgICItV2FsbCIsCiAgICAgXSwKIAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYWRybV9oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYm1lZGlhX2NvZGVjbGlzdCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYnV0aWxzIiwKQEAgLTc3LDE2ICs4Myw1NCBAQAogICAgIH0sCiB9CiAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbXBlZzJleHRyYWN0b3IiLAorCisgICAgc3JjczogWworICAgICAgICAiVXRpbHMuY3BwIiwKKyAgICAgICAgIk1lZGlhU291cmNlLmNwcCIsCisgICAgICAgICJIZXZjVXRpbHMuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9vbXgiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlcl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CisKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodCIsCiAKICAgICBzcmNzOiBbCisgICAgICAgICJBQUNXcml0ZXIuY3BwIiwKICAgICAgICAgIkFDb2RlYy5jcHAiLAogICAgICAgICAiQUNvZGVjQnVmZmVyQ2hhbm5lbC5jcHAiLAotICAgICAgICAiQUFDV3JpdGVyLmNwcCIsCisgICAgICAgICJBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmNwcCIsCiAgICAgICAgICJBTVJXcml0ZXIuY3BwIiwKLSAgICAgICAgIkF1ZGlvUGxheWVyLmNwcCIsCi0gICAgICAgICJBdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwIiwKICAgICAgICAgIkF1ZGlvU291cmNlLmNwcCIsCiAgICAgICAgICJCdWZmZXJJbXBsLmNwcCIsCiAgICAgICAgICJDYWxsYmFja0RhdGFTb3VyY2UuY3BwIiwKQEAgLTk0LDExICsxMzgsNyBAQAogICAgICAgICAiQ2FtZXJhU291cmNlLmNwcCIsCiAgICAgICAgICJDYW1lcmFTb3VyY2VUaW1lTGFwc2UuY3BwIiwKICAgICAgICAgIkRhdGFDb252ZXJ0ZXIuY3BwIiwKLSAgICAgICAgIkRhdGFTb3VyY2VGYWN0b3J5LmNwcCIsCi0gICAgICAgICJEYXRhVVJJU291cmNlLmNwcCIsCi0gICAgICAgICJGaWxlU291cmNlLmNwcCIsCiAgICAgICAgICJGcmFtZURlY29kZXIuY3BwIiwKLSAgICAgICAgIkhUVFBCYXNlLmNwcCIsCiAgICAgICAgICJIZXZjVXRpbHMuY3BwIiwKICAgICAgICAgIkludGVyZmFjZVV0aWxzLmNwcCIsCiAgICAgICAgICJKUEVHU291cmNlLmNwcCIsCkBAIC0xMTAsMTIgKzE1MCwxNCBAQAogICAgICAgICAiTWVkaWFDb2RlY0xpc3QuY3BwIiwKICAgICAgICAgIk1lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcCIsCiAgICAgICAgICJNZWRpYUNvZGVjU291cmNlLmNwcCIsCisgICAgICAgICJNZWRpYUV4dHJhY3Rvci5jcHAiLAogICAgICAgICAiTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcCIsCisgICAgICAgICJNZWRpYVNvdXJjZS5jcHAiLAogICAgICAgICAiTWVkaWFTeW5jLmNwcCIsCi0gICAgICAgICJodHRwL01lZGlhSFRUUC5jcHAiLAorICAgICAgICAiTWVkaWFUcmFjay5jcHAiLAogICAgICAgICAiTWVkaWFNdXhlci5jcHAiLAotICAgICAgICAiTnVDYWNoZWRTb3VyY2UyLmNwcCIsCiAgICAgICAgICJOdU1lZGlhRXh0cmFjdG9yLmNwcCIsCisgICAgICAgICJPZ2dXcml0ZXIuY3BwIiwKICAgICAgICAgIk9NWENsaWVudC5jcHAiLAogICAgICAgICAiT214SW5mb0J1aWxkZXIuY3BwIiwKICAgICAgICAgIlJlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcCIsCkBAIC0xMjMsNjUgKzE2NSw2OSBAQAogICAgICAgICAiU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwIiwKICAgICAgICAgIlNraXBDdXRCdWZmZXIuY3BwIiwKICAgICAgICAgIlN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcCIsCi0gICAgICAgICJTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyLmNwcCIsCiAgICAgICAgICJTdGFnZWZyaWdodFBsdWdpbkxvYWRlci5jcHAiLAogICAgICAgICAiU3VyZmFjZVV0aWxzLmNwcCIsCi0gICAgICAgICJVdGlscy5jcHAiLAogICAgICAgICAiVGhyb3R0bGVkU291cmNlLmNwcCIsCisgICAgICAgICJVdGlscy5jcHAiLAorICAgICAgICAiVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuY3BwIiwKICAgICAgICAgIlZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwIiwKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAogICAgICAgICAibGliY2FtZXJhX2NsaWVudCIsCiAgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZGF0YXNvdXJjZSIsCiAgICAgICAgICJsaWJkbCIsCiAgICAgICAgICJsaWJkbF9hbmRyb2lkIiwKLSAgICAgICAgImxpYmRybWZyYW1ld29yayIsCiAgICAgICAgICJsaWJndWkiLAotICAgICAgICAibGliaW9uIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYV9jb2RlY2xpc3QiLAogICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYm1lZGlhX29teF9jbGllbnQiLAogICAgICAgICAibGliYXVkaW9jbGllbnQiLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKICAgICAgICAgImxpYm1lZGlhdXRpbHMiLAotICAgICAgICAibGlibmV0ZF9jbGllbnQiLAogICAgICAgICAibGlidWkiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2NvZGVjYmFzZSIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teF91dGlscyIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAogICAgICAgICAibGliUlNjcHAiLAogICAgICAgICAibGliaGlkbGFsbG9jYXRvcnV0aWxzIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAotICAgICAgICAibGliemlwYXJjaGl2ZSIsCiAgICAgICAgICJhbmRyb2lkLmhpZGwuYWxsb2NhdG9yQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCi0gICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmFsbG9jYXRvckAyLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5tYXBwZXJAMi4wIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2VzZHMiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfY29sb3JfY29udmVyc2lvbiIsCiAgICAgICAgICJsaWJ5dXZfc3RhdGljIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X21lZGlhZmlsdGVyIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3dlYm0iLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfdGltZWR0ZXh0IiwKLSAgICAgICAgImxpYnZweCIsCisgICAgICAgICJsaWJvZ2ciLAogICAgICAgICAibGlid2VibSIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2lkMyIsCi0gICAgICAgICJsaWJGTEFDIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6WworICAgICAgICAibGlibWVkaWFkcm1faGVhZGVycyIsCisgICAgICAgICJsaWJuYXRpdmVsb2FkZXItaGVhZGVycyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXJfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmd1aSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImxpYm1lZGlhIiwKICAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKICAgICBdLApAQCAtMjE0LDEwMyArMjYwLDMgQEAKICAgICAgICAgXSwKICAgICB9LAogfQotCi1jY19saWJyYXJ5IHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcGxheWVyMiIsCi0KLSAgICBzcmNzOiBbCi0gICAgICAgICJDYWxsYmFja0RhdGFTb3VyY2UuY3BwIiwKLSAgICAgICAgIkNhbGxiYWNrTWVkaWFTb3VyY2UuY3BwIiwKLSAgICAgICAgIkRhdGFTb3VyY2VGYWN0b3J5LmNwcCIsCi0gICAgICAgICJEYXRhVVJJU291cmNlLmNwcCIsCi0gICAgICAgICJGaWxlU291cmNlLmNwcCIsCi0gICAgICAgICJIVFRQQmFzZS5jcHAiLAotICAgICAgICAiSGV2Y1V0aWxzLmNwcCIsCi0gICAgICAgICJJbnRlcmZhY2VVdGlscy5jcHAiLAotICAgICAgICAiTWVkaWFDbG9jay5jcHAiLAotICAgICAgICAiTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcCIsCi0gICAgICAgICJOZGtVdGlscy5jcHAiLAotICAgICAgICAiTnVDYWNoZWRTb3VyY2UyLmNwcCIsCi0gICAgICAgICJSZW1vdGVNZWRpYUV4dHJhY3Rvci5jcHAiLAotICAgICAgICAiUmVtb3RlTWVkaWFTb3VyY2UuY3BwIiwKLSAgICAgICAgIlV0aWxzLmNwcCIsCi0gICAgICAgICJWaWRlb0ZyYW1lU2NoZWR1bGVyLmNwcCIsCi0gICAgICAgICJodHRwL01lZGlhSFRUUC5jcHAiLAotICAgIF0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGliYmluZGVyIiwKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJkcm1mcmFtZXdvcmsiLAotICAgICAgICAibGliZ3VpIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAotICAgICAgICAibGliYXVkaW9jbGllbnQiLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAotICAgICAgICAibGlibWVkaWFtZXRyaWNzIiwKLSAgICAgICAgImxpYm1lZGlhdXRpbHMiLAotICAgICAgICAibGlibmV0ZF9jbGllbnQiLAotICAgICAgICAibGlidWkiLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGliemlwYXJjaGl2ZSIsCi0gICAgXSwKLQotICAgIHN0YXRpY19saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKLSAgICBdLAotCi0gICAgaGVhZGVyX2xpYnM6WwotICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAotICAgIF0sCi0KLSAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCi0gICAgICAgICJsaWJtZWRpYV9wbGF5ZXIyX3V0aWwiLAotICAgIF0sCi0KLSAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJpbmNsdWRlIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbCi0gICAgICAgICItV25vLW11bHRpY2hhciIsCi0gICAgICAgICItV2Vycm9yIiwKLSAgICAgICAgIi1Xbm8tZXJyb3I9ZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiLAotICAgICAgICAiLVdhbGwiLAotICAgIF0sCi0KLSAgICBwcm9kdWN0X3ZhcmlhYmxlczogewotICAgICAgICBkZWJ1Z2dhYmxlOiB7Ci0gICAgICAgICAgICAvLyBlbmFibGUgZXhwZXJpbWVudHMgb25seSBpbiB1c2VyZGVidWcgYW5kIGVuZyBidWlsZHMKLSAgICAgICAgICAgIGNmbGFnczogWyItREVOQUJMRV9TVEFHRUZSSUdIVF9FWFBFUklNRU5UUyJdLAotICAgICAgICB9LAotICAgIH0sCi0KLSAgICBzYW5pdGl6ZTogewotICAgICAgICBjZmk6IHRydWUsCi0gICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCi0gICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCi0gICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAotICAgICAgICBdLAotICAgIH0sCi19Ci0KLXN1YmRpcnMgPSBbCi0gICAgImNvZGVjMiIsCi0gICAgImNvZGVjcy8qIiwKLSAgICAiY29sb3Jjb252ZXJzaW9uIiwKLSAgICAiZmlsdGVycyIsCi0gICAgImZsYWMvZGVjIiwKLSAgICAiZm91bmRhdGlvbiIsCi0gICAgImh0dHAiLAotICAgICJodHRwbGl2ZSIsCi0gICAgImlkMyIsCi0gICAgIm1wZWcydHMiLAotICAgICJvbXgiLAotICAgICJydHNwIiwKLSAgICAidGVzdHMiLAotICAgICJ0aW1lZHRleHQiLAotICAgICJ3ZWJtIiwKLSAgICAieG1scGFyc2VyIiwKLV0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZmMGEwYi4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1BsYXllci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2ODEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkF1ZGlvUGxheWVyIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGN1dGlscy9jb21waWxlci5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9UcmFjay5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQXVkaW8uaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb2t1cC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvUGxheWVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotQXVkaW9QbGF5ZXI6OkF1ZGlvUGxheWVyKAotICAgICAgICBjb25zdCBzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4gJmF1ZGlvU2luaywKLSAgICAgICAgdWludDMyX3QgZmxhZ3MpCi0gICAgOiBtSW5wdXRCdWZmZXIoTlVMTCksCi0gICAgICBtU2FtcGxlUmF0ZSgwKSwKLSAgICAgIG1MYXRlbmN5VXMoMCksCi0gICAgICBtRnJhbWVTaXplKDApLAotICAgICAgbU51bUZyYW1lc1BsYXllZCgwKSwKLSAgICAgIG1OdW1GcmFtZXNQbGF5ZWRTeXNUaW1lVXMoQUxvb3Blcjo6R2V0Tm93VXMoKSksCi0gICAgICBtUG9zaXRpb25UaW1lTWVkaWFVcygtMSksCi0gICAgICBtUG9zaXRpb25UaW1lUmVhbFVzKC0xKSwKLSAgICAgIG1TZWVraW5nKGZhbHNlKSwKLSAgICAgIG1SZWFjaGVkRU9TKGZhbHNlKSwKLSAgICAgIG1GaW5hbFN0YXR1cyhPSyksCi0gICAgICBtU2Vla1RpbWVVcygwKSwKLSAgICAgIG1TdGFydGVkKGZhbHNlKSwKLSAgICAgIG1Jc0ZpcnN0QnVmZmVyKGZhbHNlKSwKLSAgICAgIG1GaXJzdEJ1ZmZlclJlc3VsdChPSyksCi0gICAgICBtRmlyc3RCdWZmZXIoTlVMTCksCi0gICAgICBtQXVkaW9TaW5rKGF1ZGlvU2luayksCi0gICAgICBtUGxheWluZyhmYWxzZSksCi0gICAgICBtU3RhcnRQb3NVcygwKSwKLSAgICAgIG1DcmVhdGVGbGFncyhmbGFncykgewotfQotCi1BdWRpb1BsYXllcjo6fkF1ZGlvUGxheWVyKCkgewotICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICByZXNldCgpOwotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BsYXllcjo6c2V0U291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiAmc291cmNlKSB7Ci0gICAgQ0hFQ0sobVNvdXJjZSA9PSBOVUxMKTsKLSAgICBtU291cmNlID0gc291cmNlOwotfQotCi1BTG9va3VwPGF1ZGlvX2Zvcm1hdF90LCBpbnQzMl90PiBzQXVkaW9Gb3JtYXRUb1BjbUVuY29kaW5nIHsKLSAgICB7Ci0gICAgICAgIHsgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIGtBdWRpb0VuY29kaW5nUGNtMTZiaXQgfSwKLSAgICAgICAgeyBBVURJT19GT1JNQVRfUENNXzhfQklULCAga0F1ZGlvRW5jb2RpbmdQY204Yml0ICB9LAotICAgICAgICB7IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQsICBrQXVkaW9FbmNvZGluZ1BjbUZsb2F0IH0sCi0gICAgfQotfTsKLQotc3RhdHVzX3QgQXVkaW9QbGF5ZXI6OnN0YXJ0KGJvb2wgc291cmNlQWxyZWFkeVN0YXJ0ZWQpIHsKLSAgICBDSEVDSyghbVN0YXJ0ZWQpOwotICAgIENIRUNLKG1Tb3VyY2UgIT0gTlVMTCk7Ci0KLSAgICBzdGF0dXNfdCBlcnI7Ci0gICAgaWYgKCFzb3VyY2VBbHJlYWR5U3RhcnRlZCkgewotICAgICAgICBlcnIgPSBtU291cmNlLT5zdGFydCgpOwotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBXZSBhbGxvdyBhbiBvcHRpb25hbCBJTkZPX0ZPUk1BVF9DSEFOR0VEIGF0IHRoZSB2ZXJ5IGJlZ2lubmluZwotICAgIC8vIG9mIHBsYXliYWNrLCBpZiB0aGVyZSBpcyBvbmUsIGdldEZvcm1hdCBiZWxvdyB3aWxsIHJldHJpZXZlIHRoZQotICAgIC8vIHVwZGF0ZWQgZm9ybWF0LCBpZiB0aGVyZSBpc24ndCwgd2UnbGwgc3Rhc2ggYXdheSB0aGUgdmFsaWQgYnVmZmVyCi0gICAgLy8gb2YgZGF0YSB0byBiZSB1c2VkIG9uIHRoZSBmaXJzdCBhdWRpbyBjYWxsYmFjay4KLQotICAgIENIRUNLKG1GaXJzdEJ1ZmZlciA9PSBOVUxMKTsKLQotICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgIGlmIChtU2Vla2luZykgewotICAgICAgICBvcHRpb25zLnNldFNlZWtUbyhtU2Vla1RpbWVVcyk7Ci0gICAgICAgIG1TZWVraW5nID0gZmFsc2U7Ci0gICAgfQotCi0gICAgbUZpcnN0QnVmZmVyUmVzdWx0ID0gbVNvdXJjZS0+cmVhZCgmbUZpcnN0QnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgaWYgKG1GaXJzdEJ1ZmZlclJlc3VsdCA9PSBJTkZPX0ZPUk1BVF9DSEFOR0VEKSB7Ci0gICAgICAgIEFMT0dWKCJJTkZPX0ZPUk1BVF9DSEFOR0VEISEhIik7Ci0KLSAgICAgICAgQ0hFQ0sobUZpcnN0QnVmZmVyID09IE5VTEwpOwotICAgICAgICBtRmlyc3RCdWZmZXJSZXN1bHQgPSBPSzsKLSAgICAgICAgbUlzRmlyc3RCdWZmZXIgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IHRydWU7Ci0gICAgfQotCi0gICAgc3A8TWV0YURhdGE+IGZvcm1hdCA9IG1Tb3VyY2UtPmdldEZvcm1hdCgpOwotICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgYm9vbCBzdWNjZXNzID0gZm9ybWF0LT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKLSAgICBDSEVDSyhzdWNjZXNzKTsKLSAgICBDSEVDSyh1c2VPZmZsb2FkKCkgfHwgIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXKSk7Ci0KLSAgICBzdWNjZXNzID0gZm9ybWF0LT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZtU2FtcGxlUmF0ZSk7Ci0gICAgQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBjaGFubmVsTWFzazsKLSAgICBzdWNjZXNzID0gZm9ybWF0LT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm51bUNoYW5uZWxzKTsKLSAgICBDSEVDSyhzdWNjZXNzKTsKLQotICAgIGlmKCFmb3JtYXQtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbE1hc2ssICZjaGFubmVsTWFzaykpIHsKLSAgICAgICAgLy8gbG9nIG9ubHkgd2hlbiB0aGVyZSdzIGEgcmlzayBvZiBhbWJpZ3VpdHkgb2YgY2hhbm5lbCBtYXNrIHNlbGVjdGlvbgotICAgICAgICBBTE9HSV9JRihudW1DaGFubmVscyA+IDIsCi0gICAgICAgICAgICAgICAgInNvdXJjZSBmb3JtYXQgZGlkbid0IHNwZWNpZnkgY2hhbm5lbCBtYXNrLCB1c2luZyAoJWQpIGNoYW5uZWwgb3JkZXIiLCBudW1DaGFubmVscyk7Ci0gICAgICAgIGNoYW5uZWxNYXNrID0gQ0hBTk5FTF9NQVNLX1VTRV9DSEFOTkVMX09SREVSOwotICAgIH0KLQotICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0gICAgaW50MzJfdCBwY21FbmNvZGluZzsKLSAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoa0tleVBjbUVuY29kaW5nLCAmcGNtRW5jb2RpbmcpKSB7Ci0gICAgICAgIHNBdWRpb0Zvcm1hdFRvUGNtRW5jb2RpbmcubWFwKHBjbUVuY29kaW5nLCAmYXVkaW9Gb3JtYXQpOwotICAgIH0KLQotICAgIGlmICh1c2VPZmZsb2FkKCkpIHsKLSAgICAgICAgaWYgKG1hcE1pbWVUb0F1ZGlvRm9ybWF0KGF1ZGlvRm9ybWF0LCBtaW1lKSAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIkNvdWxkbid0IG1hcCBtaW1lIHR5cGUgXCIlc1wiIHRvIGEgdmFsaWQgQXVkaW9TeXN0ZW06OmF1ZGlvX2Zvcm1hdCIsIG1pbWUpOwotICAgICAgICAgICAgYXVkaW9Gb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dWKCJNaW1lIHR5cGUgXCIlc1wiIG1hcHBlZCB0byBhdWRpb19mb3JtYXQgMHgleCIsIG1pbWUsIGF1ZGlvRm9ybWF0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGludDMyX3QgYWFjYW90ID0gLTE7Ci0gICAgICAgIGlmICgoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0FBQykgJiYgZm9ybWF0LT5maW5kSW50MzIoa0tleUFBQ0FPVCwgJmFhY2FvdCkpIHsKLSAgICAgICAgICAgIC8vIFJlZGVmaW5lIEFBQyBmb3JtYXQgY29ycm9zcG9uZGluZyB0byBhYWMgcHJvZmlsZQotICAgICAgICAgICAgbWFwQUFDUHJvZmlsZVRvQXVkaW9Gb3JtYXQoYXVkaW9Gb3JtYXQsKE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSkgYWFjYW90KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludCBhdmdCaXRSYXRlID0gLTE7Ci0gICAgZm9ybWF0LT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZhdmdCaXRSYXRlKTsKLQotICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKLQotICAgICAgICB1aW50MzJfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7Ci0gICAgICAgIGF1ZGlvX29mZmxvYWRfaW5mb190IG9mZmxvYWRJbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKLQotICAgICAgICBpZiAoYWxsb3dEZWVwQnVmZmVyaW5nKCkpIHsKLSAgICAgICAgICAgIGZsYWdzIHw9IEFVRElPX09VVFBVVF9GTEFHX0RFRVBfQlVGRkVSOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1c2VPZmZsb2FkKCkpIHsKLSAgICAgICAgICAgIGZsYWdzIHw9IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQ7Ci0KLSAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VczsKLSAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRJbnQ2NChrS2V5RHVyYXRpb24sICZkdXJhdGlvblVzKSkgewotICAgICAgICAgICAgICAgIG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzID0gZHVyYXRpb25VczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPSAtMTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgb2ZmbG9hZEluZm8uc2FtcGxlX3JhdGUgPSBtU2FtcGxlUmF0ZTsKLSAgICAgICAgICAgIG9mZmxvYWRJbmZvLmNoYW5uZWxfbWFzayA9IGNoYW5uZWxNYXNrOwotICAgICAgICAgICAgb2ZmbG9hZEluZm8uZm9ybWF0ID0gYXVkaW9Gb3JtYXQ7Ci0gICAgICAgICAgICBvZmZsb2FkSW5mby5zdHJlYW1fdHlwZSA9IEFVRElPX1NUUkVBTV9NVVNJQzsKLSAgICAgICAgICAgIG9mZmxvYWRJbmZvLmJpdF9yYXRlID0gYXZnQml0UmF0ZTsKLSAgICAgICAgICAgIG9mZmxvYWRJbmZvLmhhc192aWRlbyA9ICgobUNyZWF0ZUZsYWdzICYgSEFTX1ZJREVPKSAhPSAwKTsKLSAgICAgICAgICAgIG9mZmxvYWRJbmZvLmlzX3N0cmVhbWluZyA9ICgobUNyZWF0ZUZsYWdzICYgSVNfU1RSRUFNSU5HKSAhPSAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXR1c190IGVyciA9IG1BdWRpb1NpbmstPm9wZW4oCi0gICAgICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG51bUNoYW5uZWxzLCBjaGFubmVsTWFzaywgYXVkaW9Gb3JtYXQsCi0gICAgICAgICAgICAgICAgREVGQVVMVF9BVURJT1NJTktfQlVGRkVSQ09VTlQsCi0gICAgICAgICAgICAgICAgJkF1ZGlvUGxheWVyOjpBdWRpb1NpbmtDYWxsYmFjaywKLSAgICAgICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdClmbGFncywKLSAgICAgICAgICAgICAgICB1c2VPZmZsb2FkKCkgPyAmb2ZmbG9hZEluZm8gOiBOVUxMKTsKLQotICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICBtTGF0ZW5jeVVzID0gKGludDY0X3QpbUF1ZGlvU2luay0+bGF0ZW5jeSgpICogMTAwMDsKLSAgICAgICAgICAgIG1GcmFtZVNpemUgPSBtQXVkaW9TaW5rLT5mcmFtZVNpemUoKTsKLQotICAgICAgICAgICAgaWYgKHVzZU9mZmxvYWQoKSkgewotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwbGF5YmFjayBpcyBvZmZsb2FkZWQgdG8gaC93IHdlIHBhc3MgdGhlCi0gICAgICAgICAgICAgICAgLy8gSEFMIHNvbWUgbWV0YWRhdGEgaW5mb3JtYXRpb24KLSAgICAgICAgICAgICAgICAvLyBXZSBkb24ndCB3YW50IHRvIGRvIHRoaXMgZm9yIFBDTSBiZWNhdXNlIGl0IHdpbGwgYmUgZ29pbmcKLSAgICAgICAgICAgICAgICAvLyB0aHJvdWdoIHRoZSBBdWRpb0ZsaW5nZXIgbWl4ZXIgYmVmb3JlIHJlYWNoaW5nIHRoZSBoYXJkd2FyZQotICAgICAgICAgICAgICAgIHNlbmRNZXRhRGF0YVRvSGFsKG1BdWRpb1NpbmssIGZvcm1hdCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGVyciA9IG1BdWRpb1NpbmstPnN0YXJ0KCk7Ci0gICAgICAgICAgICAvLyBkbyBub3QgYWx0ZXIgYmVoYXZpb3IgZm9yIG5vbiBvZmZsb2FkZWQgdHJhY2tzOiBpZ25vcmUgc3RhcnQgc3RhdHVzLgotICAgICAgICAgICAgaWYgKCF1c2VPZmZsb2FkKCkpIHsKLSAgICAgICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc291cmNlQWxyZWFkeVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIHBsYXlpbmcgdG8gYW4gQXVkaW9UcmFjaywgc2V0IHVwIG1hc2sgaWYgbmVjZXNzYXJ5Ci0gICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGF1ZGlvTWFzayA9IGNoYW5uZWxNYXNrID09IENIQU5ORUxfTUFTS19VU0VfQ0hBTk5FTF9PUkRFUiA/Ci0gICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KG51bUNoYW5uZWxzKSA6IGNoYW5uZWxNYXNrOwotICAgICAgICBpZiAoMCA9PSBhdWRpb01hc2spIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLQotICAgICAgICBtQXVkaW9UcmFjayA9IG5ldyBBdWRpb1RyYWNrKAotICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9NVVNJQywgbVNhbXBsZVJhdGUsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBhdWRpb01hc2ssCi0gICAgICAgICAgICAgICAgMCAvKmZyYW1lQ291bnQqLywgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJkF1ZGlvQ2FsbGJhY2ssIHRoaXMsCi0gICAgICAgICAgICAgICAgMCAvKm5vdGlmaWNhdGlvbkZyYW1lcyovKTsKLQotICAgICAgICBpZiAoKGVyciA9IG1BdWRpb1RyYWNrLT5pbml0Q2hlY2soKSkgIT0gT0spIHsKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgIGlmIChtRmlyc3RCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghc291cmNlQWxyZWFkeVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgICAgICBtU291cmNlLT5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBlcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBtTGF0ZW5jeVVzID0gKGludDY0X3QpbUF1ZGlvVHJhY2stPmxhdGVuY3koKSAqIDEwMDA7Ci0gICAgICAgIG1GcmFtZVNpemUgPSBtQXVkaW9UcmFjay0+ZnJhbWVTaXplKCk7Ci0KLSAgICAgICAgbUF1ZGlvVHJhY2stPnN0YXJ0KCk7Ci0gICAgfQotCi0gICAgbVN0YXJ0ZWQgPSB0cnVlOwotICAgIG1QbGF5aW5nID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBBdWRpb1BsYXllcjo6cGF1c2UoYm9vbCBwbGF5UGVuZGluZ1NhbXBsZXMpIHsKLSAgICBDSEVDSyhtU3RhcnRlZCk7Ci0KLSAgICBpZiAocGxheVBlbmRpbmdTYW1wbGVzKSB7Ci0gICAgICAgIGlmIChtQXVkaW9TaW5rLmdldCgpICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrLT5zdG9wKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtTnVtRnJhbWVzUGxheWVkID0gMDsKLSAgICAgICAgbU51bUZyYW1lc1BsYXllZFN5c1RpbWVVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG1BdWRpb1NpbmsuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICAgICAgbUF1ZGlvU2luay0+cGF1c2UoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1BdWRpb1RyYWNrLT5wYXVzZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgbVBsYXlpbmcgPSBmYWxzZTsKLX0KLQotc3RhdHVzX3QgQXVkaW9QbGF5ZXI6OnJlc3VtZSgpIHsKLSAgICBDSEVDSyhtU3RhcnRlZCk7Ci0gICAgc3RhdHVzX3QgZXJyOwotCi0gICAgaWYgKG1BdWRpb1NpbmsuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICBlcnIgPSBtQXVkaW9TaW5rLT5zdGFydCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGVyciA9IG1BdWRpb1RyYWNrLT5zdGFydCgpOwotICAgIH0KLQotICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgbVBsYXlpbmcgPSB0cnVlOwotICAgIH0KLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXZvaWQgQXVkaW9QbGF5ZXI6OnJlc2V0KCkgewotICAgIENIRUNLKG1TdGFydGVkKTsKLQotICAgIEFMT0dWKCJyZXNldDogbVBsYXlpbmc9JWQgbVJlYWNoZWRFT1M9JWQgdXNlT2ZmbG9hZD0lZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5aW5nLCBtUmVhY2hlZEVPUywgdXNlT2ZmbG9hZCgpICk7Ci0KLSAgICBpZiAobUF1ZGlvU2luay5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIG1BdWRpb1NpbmstPnN0b3AoKTsKLSAgICAgICAgLy8gSWYgd2UncmUgY2xvc2luZyBhbmQgaGF2ZSByZWFjaGVkIEVPUywgd2UgZG9uJ3Qgd2FudCB0byBmbHVzaAotICAgICAgICAvLyB0aGUgdHJhY2sgYmVjYXVzZSBpZiBpdCBpcyBvZmZsb2FkZWQgdGhlcmUgY291bGQgYmUgYSBzbWFsbAotICAgICAgICAvLyBhbW91bnQgb2YgcmVzaWR1YWwgZGF0YSBpbiB0aGUgaGFyZHdhcmUgYnVmZmVyIHdoaWNoIHdlIG11c3QKLSAgICAgICAgLy8gcGxheSB0byBnaXZlIGdhcGxlc3MgcGxheWJhY2suCi0gICAgICAgIC8vIEJ1dCBpZiB3ZSdyZSByZXNldHRpbmcgd2hlbiBwYXVzZWQgb3IgYmVmb3JlIHdlJ3ZlIHJlYWNoZWQgRU9TCi0gICAgICAgIC8vIHdlIGNhbid0IGJlIGRvaW5nIGEgZ2FwbGVzcyBwbGF5YmFjayBhbmQgdGhlcmUgY291bGQgYmUgYSBsYXJnZQotICAgICAgICAvLyBhbW91bnQgb2YgZGF0YSBxdWV1ZWQgaW4gdGhlIGhhcmR3YXJlIGlmIHRoZSB0cmFjayBpcyBvZmZsb2FkZWQsCi0gICAgICAgIC8vIHNvIHdlIG11c3QgZmx1c2ggdG8gcHJldmVudCBhIHRyYWNrIHN3aXRjaCBiZWluZyBkZWxheWVkIHBsYXlpbmcKLSAgICAgICAgLy8gdGhlIGJ1ZmZlcmVkIGRhdGEgdGhhdCB3ZSBkb24ndCB3YW50IG5vdwotICAgICAgICBpZiAoIW1QbGF5aW5nIHx8ICFtUmVhY2hlZEVPUykgewotICAgICAgICAgICAgbUF1ZGlvU2luay0+Zmx1c2goKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1BdWRpb1NpbmstPmNsb3NlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUF1ZGlvVHJhY2stPnN0b3AoKTsKLQotICAgICAgICBpZiAoIW1QbGF5aW5nIHx8ICFtUmVhY2hlZEVPUykgewotICAgICAgICAgICAgbUF1ZGlvVHJhY2stPmZsdXNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBtQXVkaW9UcmFjay5jbGVhcigpOwotICAgIH0KLQotICAgIC8vIE1ha2Ugc3VyZSB0byByZWxlYXNlIGFueSBidWZmZXIgd2UgaG9sZCBvbnRvIHNvIHRoYXQgdGhlCi0gICAgLy8gc291cmNlIGlzIGFibGUgdG8gc3RvcCgpLgotCi0gICAgaWYgKG1GaXJzdEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICBtRmlyc3RCdWZmZXIgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChtSW5wdXRCdWZmZXIgIT0gTlVMTCkgewotICAgICAgICBBTE9HVigiQXVkaW9QbGF5ZXIgcmVsZWFzaW5nIGlucHV0IGJ1ZmZlci4iKTsKLQotICAgICAgICBtSW5wdXRCdWZmZXItPnJlbGVhc2UoKTsKLSAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLSAgICB9Ci0KLSAgICBtU291cmNlLT5zdG9wKCk7Ci0KLSAgICAvLyBUaGUgZm9sbG93aW5nIGhhY2sgaXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IHRoZSBPTVgKLSAgICAvLyBjb21wb25lbnQgaXMgY29tcGxldGVseSByZWxlYXNlZCBieSB0aGUgdGltZSB3ZSBtYXkgdHJ5Ci0gICAgLy8gdG8gaW5zdGFudGlhdGUgaXQgYWdhaW4uCi0gICAgLy8gV2hlbiBvZmZsb2FkaW5nLCB0aGUgT01YIGNvbXBvbmVudCBpcyBub3QgdXNlZCBzbyB0aGlzIGhhY2sKLSAgICAvLyBpcyBub3QgbmVlZGVkCi0gICAgaWYgKCF1c2VPZmZsb2FkKCkpIHsKLSAgICAgICAgd3A8TWVkaWFTb3VyY2U+IHRtcCA9IG1Tb3VyY2U7Ci0gICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgd2hpbGUgKHRtcC5wcm9tb3RlKCkgIT0gTlVMTCkgewotICAgICAgICAgICAgdXNsZWVwKDEwMDApOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbVNvdXJjZS5jbGVhcigpOwotICAgIH0KLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5mbHVzaENvbW1hbmRzKCk7Ci0KLSAgICBtTnVtRnJhbWVzUGxheWVkID0gMDsKLSAgICBtTnVtRnJhbWVzUGxheWVkU3lzVGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICBtUG9zaXRpb25UaW1lTWVkaWFVcyA9IC0xOwotICAgIG1Qb3NpdGlvblRpbWVSZWFsVXMgPSAtMTsKLSAgICBtU2Vla2luZyA9IGZhbHNlOwotICAgIG1TZWVrVGltZVVzID0gMDsKLSAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOwotICAgIG1GaW5hbFN0YXR1cyA9IE9LOwotICAgIG1TdGFydGVkID0gZmFsc2U7Ci0gICAgbVBsYXlpbmcgPSBmYWxzZTsKLSAgICBtU3RhcnRQb3NVcyA9IDA7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBBdWRpb1BsYXllcjo6QXVkaW9DYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKnVzZXIsIHZvaWQgKmluZm8pIHsKLSAgICBzdGF0aWNfY2FzdDxBdWRpb1BsYXllciAqPih1c2VyKS0+QXVkaW9DYWxsYmFjayhldmVudCwgaW5mbyk7Ci19Ci0KLWJvb2wgQXVkaW9QbGF5ZXI6OnJlYWNoZWRFT1Moc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSB7Ci0gICAgKmZpbmFsU3RhdHVzID0gT0s7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICpmaW5hbFN0YXR1cyA9IG1GaW5hbFN0YXR1czsKLSAgICByZXR1cm4gbVJlYWNoZWRFT1M7Ci19Ci0KLXN0YXR1c190IEF1ZGlvUGxheWVyOjpzZXRQbGF5YmFja1JhdGUoY29uc3QgQXVkaW9QbGF5YmFja1JhdGUgJnJhdGUpIHsKLSAgICBpZiAobUF1ZGlvU2luay5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBtQXVkaW9TaW5rLT5zZXRQbGF5YmFja1JhdGUocmF0ZSk7Ci0gICAgfSBlbHNlIGlmIChtQXVkaW9UcmFjayAhPSAwKXsKLSAgICAgICAgcmV0dXJuIG1BdWRpb1RyYWNrLT5zZXRQbGF5YmFja1JhdGUocmF0ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BsYXllcjo6Z2V0UGxheWJhY2tSYXRlKEF1ZGlvUGxheWJhY2tSYXRlICpyYXRlIC8qIG5vbm51bGwgKi8pIHsKLSAgICBpZiAobUF1ZGlvU2luay5nZXQoKSAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBtQXVkaW9TaW5rLT5nZXRQbGF5YmFja1JhdGUocmF0ZSk7Ci0gICAgfSBlbHNlIGlmIChtQXVkaW9UcmFjayAhPSAwKSB7Ci0gICAgICAgICpyYXRlID0gbUF1ZGlvVHJhY2stPmdldFBsYXliYWNrUmF0ZSgpOwotICAgICAgICByZXR1cm4gT0s7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLXNpemVfdCBBdWRpb1BsYXllcjo6QXVkaW9TaW5rQ2FsbGJhY2soCi0gICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rICogLyogYXVkaW9TaW5rICovLAotICAgICAgICB2b2lkICpidWZmZXIsIHNpemVfdCBzaXplLCB2b2lkICpjb29raWUsCi0gICAgICAgIE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rOjpjYl9ldmVudF90IGV2ZW50KSB7Ci0gICAgQXVkaW9QbGF5ZXIgKm1lID0gKEF1ZGlvUGxheWVyICopY29va2llOwotCi0gICAgc3dpdGNoKGV2ZW50KSB7Ci0gICAgY2FzZSBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Q0JfRVZFTlRfRklMTF9CVUZGRVI6Ci0gICAgICAgIHJldHVybiBtZS0+ZmlsbEJ1ZmZlcihidWZmZXIsIHNpemUpOwotCi0gICAgY2FzZSBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Q0JfRVZFTlRfU1RSRUFNX0VORDoKLSAgICAgICAgQUxPR1YoIkF1ZGlvU2lua0NhbGxiYWNrOiBzdHJlYW0gZW5kIik7Ci0gICAgICAgIG1lLT5tUmVhY2hlZEVPUyA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luazo6Q0JfRVZFTlRfVEVBUl9ET1dOOgotICAgICAgICBBTE9HVigiQXVkaW9TaW5rQ2FsbGJhY2s6IFRlYXIgZG93biBldmVudCIpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICByZXR1cm4gMDsKLX0KLQotdm9pZCBBdWRpb1BsYXllcjo6QXVkaW9DYWxsYmFjayhpbnQgZXZlbnQsIHZvaWQgKmluZm8pIHsKLSAgICBzd2l0Y2ggKGV2ZW50KSB7Ci0gICAgY2FzZSBBdWRpb1RyYWNrOjpFVkVOVF9NT1JFX0RBVEE6Ci0gICAgICAgIHsKLSAgICAgICAgQXVkaW9UcmFjazo6QnVmZmVyICpidWZmZXIgPSAoQXVkaW9UcmFjazo6QnVmZmVyICopaW5mbzsKLSAgICAgICAgc2l6ZV90IG51bUJ5dGVzV3JpdHRlbiA9IGZpbGxCdWZmZXIoYnVmZmVyLT5yYXcsIGJ1ZmZlci0+c2l6ZSk7Ci0gICAgICAgIGJ1ZmZlci0+c2l6ZSA9IG51bUJ5dGVzV3JpdHRlbjsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgIGNhc2UgQXVkaW9UcmFjazo6RVZFTlRfU1RSRUFNX0VORDoKLSAgICAgICAgbVJlYWNoZWRFT1MgPSB0cnVlOwotICAgICAgICBicmVhazsKLSAgICB9Ci19Ci0KLXNpemVfdCBBdWRpb1BsYXllcjo6ZmlsbEJ1ZmZlcih2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtTnVtRnJhbWVzUGxheWVkID09IDApIHsKLSAgICAgICAgQUxPR1YoIkF1ZGlvQ2FsbGJhY2siKTsKLSAgICB9Ci0KLSAgICBpZiAobVJlYWNoZWRFT1MpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgc2l6ZV90IHNpemVfZG9uZSA9IDA7Ci0gICAgc2l6ZV90IHNpemVfcmVtYWluaW5nID0gc2l6ZTsKLSAgICB3aGlsZSAoc2l6ZV9yZW1haW5pbmcgPiAwKSB7Ci0gICAgICAgIE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyBvcHRpb25zOwotICAgICAgICBib29sIHJlZnJlc2hTZWVrVGltZSA9IGZhbHNlOwotCi0gICAgICAgIHsKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAgICAgICAgIGlmIChtU2Vla2luZykgewotICAgICAgICAgICAgICAgIGlmIChtSXNGaXJzdEJ1ZmZlcikgewotICAgICAgICAgICAgICAgICAgICBpZiAobUZpcnN0QnVmZmVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUZpcnN0QnVmZmVyID0gTlVMTDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtSXNGaXJzdEJ1ZmZlciA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG9wdGlvbnMuc2V0U2Vla1RvKG1TZWVrVGltZVVzKTsKLSAgICAgICAgICAgICAgICByZWZyZXNoU2Vla1RpbWUgPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBOVUxMOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1TZWVraW5nID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUlucHV0QnVmZmVyID09IE5VTEwpIHsKLSAgICAgICAgICAgIHN0YXR1c190IGVycjsKLQotICAgICAgICAgICAgaWYgKG1Jc0ZpcnN0QnVmZmVyKSB7Ci0gICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gbUZpcnN0QnVmZmVyOwotICAgICAgICAgICAgICAgIG1GaXJzdEJ1ZmZlciA9IE5VTEw7Ci0gICAgICAgICAgICAgICAgZXJyID0gbUZpcnN0QnVmZmVyUmVzdWx0OwotCi0gICAgICAgICAgICAgICAgbUlzRmlyc3RCdWZmZXIgPSBmYWxzZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gbVNvdXJjZS0+cmVhZCgmbUlucHV0QnVmZmVyLCAmb3B0aW9ucyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIENIRUNLKChlcnIgPT0gT0sgJiYgbUlucHV0QnVmZmVyICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgfHwgKGVyciAhPSBPSyAmJiBtSW5wdXRCdWZmZXIgPT0gTlVMTCkpOwotCi0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtUmVhY2hlZEVPUykgewotICAgICAgICAgICAgICAgICAgICBpZiAodXNlT2ZmbG9hZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBtb3JlIGJ1ZmZlcnMgdG8gcHVzaCAtIHN0b3AoKSBhbmQgd2FpdCBmb3IgU1RSRUFNX0VORAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG9uJ3Qgc2V0IG1SZWFjaGVkRU9TIHVudGlsIHN0cmVhbSBlbmQgcmVjZWl2ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9TaW5rLT5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrLT5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmVhY2hlZEVPUyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtRmluYWxTdGF0dXMgPSBlcnI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBtTGF0ZW5jeVVzID0gKGludDY0X3QpbUF1ZGlvU2luay0+bGF0ZW5jeSgpICogMTAwMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbUxhdGVuY3lVcyA9IChpbnQ2NF90KW1BdWRpb1RyYWNrLT5sYXRlbmN5KCkgKiAxMDAwOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZihtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpICE9IDApIHsKLSAgICAgICAgICAgICAgICBDSEVDSyhtSW5wdXRCdWZmZXItPm1ldGFfZGF0YSgpLmZpbmRJbnQ2NCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUaW1lLCAmbVBvc2l0aW9uVGltZU1lZGlhVXMpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbmVlZCB0byBhZGp1c3QgdGhlIG1TdGFydFBvc1VzIGZvciBvZmZsb2FkIGRlY29kaW5nIHNpbmNlIHBhcnNlcgotICAgICAgICAgICAgLy8gbWlnaHQgbm90IGJlIGFibGUgdG8gZ2V0IHRoZSBleGFjdCBzZWVrIHRpbWUgcmVxdWVzdGVkLgotICAgICAgICAgICAgaWYgKHJlZnJlc2hTZWVrVGltZSkgewotICAgICAgICAgICAgICAgIGlmICh1c2VPZmZsb2FkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXJ0UG9zVXMgPSBtUG9zaXRpb25UaW1lTWVkaWFVczsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImFkanVzdCBzZWVrIHRpbWUgdG86ICUuMmYiLCBtU3RhcnRQb3NVcy8gMUU2KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gY2xlYXIgc2VlayB0aW1lIHdpdGggbUxvY2sgbG9ja2VkIGFuZCBvbmNlIHdlIGhhdmUgdmFsaWQgbVBvc2l0aW9uVGltZU1lZGlhVXMKLSAgICAgICAgICAgICAgICAvLyBhbmQgbVBvc2l0aW9uVGltZVJlYWxVcwotICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBjbGVhcmluZyBtU2Vla1RpbWVVcyBjaGVjayBpZiBhIG5ldyBzZWVrIHJlcXVlc3QgaGFzIGJlZW4gcmVjZWl2ZWQgd2hpbGUKLSAgICAgICAgICAgICAgICAvLyB3ZSB3ZXJlIHJlYWRpbmcgZnJvbSB0aGUgc291cmNlIHdpdGggbUxvY2sgcmVsZWFzZWQuCi0gICAgICAgICAgICAgICAgaWYgKCFtU2Vla2luZykgewotICAgICAgICAgICAgICAgICAgICBtU2Vla1RpbWVVcyA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIXVzZU9mZmxvYWQoKSkgewotICAgICAgICAgICAgICAgIG1Qb3NpdGlvblRpbWVSZWFsVXMgPQotICAgICAgICAgICAgICAgICAgICAoKG1OdW1GcmFtZXNQbGF5ZWQgKyBzaXplX2RvbmUgLyBtRnJhbWVTaXplKSAqIDEwMDAwMDApCi0gICAgICAgICAgICAgICAgICAgICAgICAvIG1TYW1wbGVSYXRlOwotICAgICAgICAgICAgICAgIEFMT0dWKCJidWZmZXItPnNpemUoKSA9ICV6dSwgIgotICAgICAgICAgICAgICAgICAgICAgIm1Qb3NpdGlvblRpbWVNZWRpYVVzPSUuMmYgbVBvc2l0aW9uVGltZVJlYWxVcz0lLjJmIiwKLSAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCksCi0gICAgICAgICAgICAgICAgICAgICBtUG9zaXRpb25UaW1lTWVkaWFVcyAvIDFFNiwgbVBvc2l0aW9uVGltZVJlYWxVcyAvIDFFNik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpID09IDApIHsKLSAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmVsZWFzZSgpOwotICAgICAgICAgICAgbUlucHV0QnVmZmVyID0gTlVMTDsKLQotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBzaXplX3QgY29weSA9IHNpemVfcmVtYWluaW5nOwotICAgICAgICBpZiAoY29weSA+IG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpIHsKLSAgICAgICAgICAgIGNvcHkgPSBtSW5wdXRCdWZmZXItPnJhbmdlX2xlbmd0aCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgbWVtY3B5KChjaGFyICopZGF0YSArIHNpemVfZG9uZSwKLSAgICAgICAgICAgICAgIChjb25zdCBjaGFyICopbUlucHV0QnVmZmVyLT5kYXRhKCkgKyBtSW5wdXRCdWZmZXItPnJhbmdlX29mZnNldCgpLAotICAgICAgICAgICAgICAgY29weSk7Ci0KLSAgICAgICAgbUlucHV0QnVmZmVyLT5zZXRfcmFuZ2UobUlucHV0QnVmZmVyLT5yYW5nZV9vZmZzZXQoKSArIGNvcHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkgLSBjb3B5KTsKLQotICAgICAgICBzaXplX2RvbmUgKz0gY29weTsKLSAgICAgICAgc2l6ZV9yZW1haW5pbmcgLT0gY29weTsKLSAgICB9Ci0KLSAgICBpZiAodXNlT2ZmbG9hZCgpKSB7Ci0gICAgICAgIC8vIFdlIG11c3QgYXNrIHRoZSBoYXJkd2FyZSB3aGF0IGl0IGhhcyBwbGF5ZWQKLSAgICAgICAgbVBvc2l0aW9uVGltZVJlYWxVcyA9IGdldE91dHB1dFBsYXlQb3NpdGlvblVzX2woKTsKLSAgICAgICAgQUxPR1YoIm1Qb3NpdGlvblRpbWVNZWRpYVVzPSUuMmYgbVBvc2l0aW9uVGltZVJlYWxVcz0lLjJmIiwKLSAgICAgICAgICAgICBtUG9zaXRpb25UaW1lTWVkaWFVcyAvIDFFNiwgbVBvc2l0aW9uVGltZVJlYWxVcyAvIDFFNik7Ci0gICAgfQotCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICBtTnVtRnJhbWVzUGxheWVkICs9IHNpemVfZG9uZSAvIG1GcmFtZVNpemU7Ci0gICAgICAgIG1OdW1GcmFtZXNQbGF5ZWRTeXNUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgIH0KLQotICAgIHJldHVybiBzaXplX2RvbmU7Ci19Ci0KLWludDY0X3QgQXVkaW9QbGF5ZXI6OmdldE91dHB1dFBsYXlQb3NpdGlvblVzX2woKQotewotICAgIHVpbnQzMl90IHBsYXllZFNhbXBsZXMgPSAwOwotICAgIHVpbnQzMl90IHNhbXBsZVJhdGU7Ci0gICAgaWYgKG1BdWRpb1NpbmsgIT0gTlVMTCkgewotICAgICAgICBtQXVkaW9TaW5rLT5nZXRQb3NpdGlvbigmcGxheWVkU2FtcGxlcyk7Ci0gICAgICAgIHNhbXBsZVJhdGUgPSBtQXVkaW9TaW5rLT5nZXRTYW1wbGVSYXRlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUF1ZGlvVHJhY2stPmdldFBvc2l0aW9uKCZwbGF5ZWRTYW1wbGVzKTsKLSAgICAgICAgc2FtcGxlUmF0ZSA9IG1BdWRpb1RyYWNrLT5nZXRTYW1wbGVSYXRlKCk7Ci0gICAgfQotICAgIGlmIChzYW1wbGVSYXRlICE9IDApIHsKLSAgICAgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOwotICAgIH0KLQotICAgIGludDY0X3QgcGxheWVkVXM7Ci0gICAgaWYgKG1TYW1wbGVSYXRlICE9IDApIHsKLSAgICAgICAgcGxheWVkVXMgPSAoc3RhdGljX2Nhc3Q8aW50NjRfdD4ocGxheWVkU2FtcGxlcykgKiAxMDAwMDAwICkgLyBtU2FtcGxlUmF0ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBwbGF5ZWRVcyA9IDA7Ci0gICAgfQotCi0gICAgLy8gSEFMIHBvc2l0aW9uIGlzIHJlbGF0aXZlIHRvIHRoZSBmaXJzdCBidWZmZXIgd2Ugc2VudCBhdCBtU3RhcnRQb3NVcwotICAgIGNvbnN0IGludDY0X3QgcmVuZGVyZWREdXJhdGlvbiA9IG1TdGFydFBvc1VzICsgcGxheWVkVXM7Ci0gICAgQUxPR1YoImdldE91dHB1dFBsYXlQb3NpdGlvblVzX2wgJSIgUFJJZDY0LCByZW5kZXJlZER1cmF0aW9uKTsKLSAgICByZXR1cm4gcmVuZGVyZWREdXJhdGlvbjsKLX0KLQotc3RhdHVzX3QgQXVkaW9QbGF5ZXI6OnNlZWtUbyhpbnQ2NF90IHRpbWVfdXMpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgQUxPR1YoInNlZWtUbyggJSIgUFJJZDY0ICIgKSIsIHRpbWVfdXMpOwotCi0gICAgbVNlZWtpbmcgPSB0cnVlOwotICAgIG1Qb3NpdGlvblRpbWVSZWFsVXMgPSBtUG9zaXRpb25UaW1lTWVkaWFVcyA9IC0xOwotICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7Ci0gICAgbVNlZWtUaW1lVXMgPSB0aW1lX3VzOwotICAgIG1TdGFydFBvc1VzID0gdGltZV91czsKLQotICAgIC8vIEZsdXNoIHJlc2V0cyB0aGUgbnVtYmVyIG9mIHBsYXllZCBmcmFtZXMKLSAgICBtTnVtRnJhbWVzUGxheWVkID0gMDsKLSAgICBtTnVtRnJhbWVzUGxheWVkU3lzVGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLQotICAgIGlmIChtQXVkaW9TaW5rICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKG1QbGF5aW5nKSB7Ci0gICAgICAgICAgICBtQXVkaW9TaW5rLT5wYXVzZSgpOwotICAgICAgICB9Ci0gICAgICAgIG1BdWRpb1NpbmstPmZsdXNoKCk7Ci0gICAgICAgIGlmIChtUGxheWluZykgewotICAgICAgICAgICAgbUF1ZGlvU2luay0+c3RhcnQoKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtUGxheWluZykgewotICAgICAgICAgICAgbUF1ZGlvVHJhY2stPnBhdXNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUF1ZGlvVHJhY2stPmZsdXNoKCk7Ci0gICAgICAgIGlmIChtUGxheWluZykgewotICAgICAgICAgICAgbUF1ZGlvVHJhY2stPnN0YXJ0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLX0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmUxODU5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvUHJlc2VudGF0aW9uSW5mby5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQXVkaW9QcmVzZW50YXRpb25JbmZvIgotCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9QcmVzZW50YXRpb25JbmZvLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotQXVkaW9QcmVzZW50YXRpb25JbmZvOjpBdWRpb1ByZXNlbnRhdGlvbkluZm8oKSB7Ci19Ci0KLUF1ZGlvUHJlc2VudGF0aW9uSW5mbzo6fkF1ZGlvUHJlc2VudGF0aW9uSW5mbygpIHsKLSAgICBtUHJlc2VudGF0aW9ucy5jbGVhcigpOwotfQotCi12b2lkIEF1ZGlvUHJlc2VudGF0aW9uSW5mbzo6YWRkUHJlc2VudGF0aW9uKHNwPEF1ZGlvUHJlc2VudGF0aW9uPiBwcmVzZW50YXRpb24pIHsKLSAgICBtUHJlc2VudGF0aW9ucy5wdXNoKHByZXNlbnRhdGlvbik7Ci19Ci0KLXNpemVfdCBBdWRpb1ByZXNlbnRhdGlvbkluZm86OmNvdW50UHJlc2VudGF0aW9ucygpIGNvbnN0IHsKLSAgICByZXR1cm4gbVByZXNlbnRhdGlvbnMuc2l6ZSgpOwotfQotCi0vLyBSZXR1cm5zIGFuIEF1ZGlvUHJlc2VudGF0aW9uIGZvciB0aGUgZ2l2ZW4gdmFsaWQgaW5kZXgKLS8vIGluZGV4IG11c3QgYmUgPj0wIGFuZCA8IGNvdW50UHJlc2VudGF0aW9ucygpCi1jb25zdCBzcDxBdWRpb1ByZXNlbnRhdGlvbj4gQXVkaW9QcmVzZW50YXRpb25JbmZvOjpnZXRQcmVzZW50YXRpb24oc2l6ZV90IGluZGV4KSBjb25zdCB7Ci0gICAgcmV0dXJuIG1QcmVzZW50YXRpb25zW2luZGV4XTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmNwcAppbmRleCBhOTFlOTJjLi5kNzhkNzI5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuY3BwCkBAIC01Miw3ICs1Miw5IEBACiBBdWRpb1NvdXJjZTo6QXVkaW9Tb3VyY2UoCiAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLCBjb25zdCBTdHJpbmcxNiAmb3BQYWNrYWdlTmFtZSwKICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwgdWludDMyX3QgY2hhbm5lbENvdW50LCB1aW50MzJfdCBvdXRTYW1wbGVSYXRlLAotICAgICAgICB1aWRfdCB1aWQsIHBpZF90IHBpZCwgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkKQorICAgICAgICB1aWRfdCB1aWQsIHBpZF90IHBpZCwgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkLAorICAgICAgICBhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IHNlbGVjdGVkTWljRGlyZWN0aW9uLAorICAgICAgICBmbG9hdCBzZWxlY3RlZE1pY0ZpZWxkRGltZW5zaW9uKQogICAgIDogbVN0YXJ0ZWQoZmFsc2UpLAogICAgICAgbVNhbXBsZVJhdGUoc2FtcGxlUmF0ZSksCiAgICAgICBtT3V0U2FtcGxlUmF0ZShvdXRTYW1wbGVSYXRlID4gMCA/IG91dFNhbXBsZVJhdGUgOiBzYW1wbGVSYXRlKSwKQEAgLTEwMyw3ICsxMDUsOSBAQAogICAgICAgICAgICAgICAgICAgICB1aWQsCiAgICAgICAgICAgICAgICAgICAgIHBpZCwKICAgICAgICAgICAgICAgICAgICAgTlVMTCAvKnBBdHRyaWJ1dGVzKi8sCi0gICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGV2aWNlSWQpOworICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZE1pY0RpcmVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgc2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbik7CiAgICAgICAgIG1Jbml0Q2hlY2sgPSBtUmVjb3JkLT5pbml0Q2hlY2soKTsKICAgICAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKICAgICAgICAgICAgIG1SZWNvcmQuY2xlYXIoKTsKQEAgLTM4MSwxMSArMzg1LDExIEBACiAgICAgfQogICAgIG1MYXN0RnJhbWVUaW1lc3RhbXBVcyA9IHRpbWVVczsKIAotICAgIHNpemVfdCBudW1Mb3N0Qnl0ZXMgPSAwOworICAgIHVpbnQ2NF90IG51bUxvc3RCeXRlcyA9IDA7IC8vIEF1ZGlvUmVjb3JkOjpnZXRJbnB1dEZyYW1lc0xvc3QoKSByZXR1cm5zIHVpbnQzMl90CiAgICAgaWYgKG1OdW1GcmFtZXNSZWNlaXZlZCA+IDApIHsgIC8vIElnbm9yZSBlYXJsaWVyIGZyYW1lIGxvc3QKICAgICAgICAgLy8gZ2V0SW5wdXRGcmFtZXNMb3N0KCkgcmV0dXJucyB0aGUgbnVtYmVyIG9mIGxvc3QgZnJhbWVzLgogICAgICAgICAvLyBDb252ZXJ0IG51bWJlciBvZiBmcmFtZXMgbG9zdCB0byBudW1iZXIgb2YgYnl0ZXMgbG9zdC4KLSAgICAgICAgbnVtTG9zdEJ5dGVzID0gbVJlY29yZC0+Z2V0SW5wdXRGcmFtZXNMb3N0KCkgKiBtUmVjb3JkLT5mcmFtZVNpemUoKTsKKyAgICAgICAgbnVtTG9zdEJ5dGVzID0gKHVpbnQ2NF90KW1SZWNvcmQtPmdldElucHV0RnJhbWVzTG9zdCgpICogbVJlY29yZC0+ZnJhbWVTaXplKCk7CiAgICAgfQogCiAgICAgQ0hFQ0tfRVEobnVtTG9zdEJ5dGVzICYgMSwgMHUpOwpAQCAtMzkzLDExICszOTcsMTEgQEAKICAgICBpZiAobnVtTG9zdEJ5dGVzID4gMCkgewogICAgICAgICAvLyBMb3NzIG9mIGF1ZGlvIGZyYW1lcyBzaG91bGQgaGFwcGVuIHJhcmVseTsgdGh1cyB0aGUgTE9HVyBzaG91bGQKICAgICAgICAgLy8gbm90IGNhdXNlIGEgbG9nZ2luZyBzcGFtCi0gICAgICAgIEFMT0dXKCJMb3N0IGF1ZGlvIHJlY29yZCBkYXRhOiAlenUgYnl0ZXMiLCBudW1Mb3N0Qnl0ZXMpOworICAgICAgICBBTE9HVygiTG9zdCBhdWRpbyByZWNvcmQgZGF0YTogJSIgUFJJdTY0ICIgYnl0ZXMiLCBudW1Mb3N0Qnl0ZXMpOwogICAgIH0KIAogICAgIHdoaWxlIChudW1Mb3N0Qnl0ZXMgPiAwKSB7Ci0gICAgICAgIHNpemVfdCBidWZmZXJTaXplID0gbnVtTG9zdEJ5dGVzOworICAgICAgICB1aW50NjRfdCBidWZmZXJTaXplID0gbnVtTG9zdEJ5dGVzOwogICAgICAgICBpZiAobnVtTG9zdEJ5dGVzID4ga01heEJ1ZmZlclNpemUpIHsKICAgICAgICAgICAgIG51bUxvc3RCeXRlcyAtPSBrTWF4QnVmZmVyU2l6ZTsKICAgICAgICAgICAgIGJ1ZmZlclNpemUgPSBrTWF4QnVmZmVyU2l6ZTsKQEAgLTUwNCw0ICs1MDgsMjcgQEAKICAgICByZXR1cm4gTk9fSU5JVDsKIH0KIAorc3RhdHVzX3QgQXVkaW9Tb3VyY2U6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pIHsKKyAgICBBTE9HVigic2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbiglZCkiLCBkaXJlY3Rpb24pOworICAgIGlmIChtUmVjb3JkICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1SZWNvcmQtPnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oZGlyZWN0aW9uKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0lOSVQ7Cit9CisKK3N0YXR1c190IEF1ZGlvU291cmNlOjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSkgeworICAgIEFMT0dWKCJzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oJWYpIiwgem9vbSk7CisgICAgaWYgKG1SZWNvcmQgIT0gMCkgeworICAgICAgICByZXR1cm4gbVJlY29yZC0+c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKHpvb20pOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KKworc3RhdHVzX3QgQXVkaW9Tb3VyY2U6OmdldFBvcnRJZChhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpIGNvbnN0IHsKKyAgICBpZiAobVJlY29yZCAhPSAwKSB7CisgICAgICAgICpwb3J0SWQgPSBtUmVjb3JkLT5nZXRQb3J0SWQoKTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gTk9fSU5JVDsKK30KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9CdWZmZXJJbXBsLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0J1ZmZlckltcGwuY3BwCmluZGV4IGI3NjAyNzMuLmY3M2I2MjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0J1ZmZlckltcGwuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0J1ZmZlckltcGwuY3BwCkBAIC0yMSw3ICsyMSw3IEBACiAjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lDcnlwdG8uaD4KICNpbmNsdWRlIDx1dGlscy9OYXRpdmVIYW5kbGUuaD4KIAogI2luY2x1ZGUgImluY2x1ZGUvU2VjdXJlQnVmZmVyLmgiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYWxsYmFja0RhdGFTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ2FsbGJhY2tEYXRhU291cmNlLmNwcAppbmRleCA5MmU2ZWI5Li4yNjVmMjFiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9DYWxsYmFja0RhdGFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NhbGxiYWNrRGF0YVNvdXJjZS5jcHAKQEAgLTExMywxMCArMTEzLDYgQEAKICAgICB9CiB9CiAKLXNwPERlY3J5cHRIYW5kbGU+IENhbGxiYWNrRGF0YVNvdXJjZTo6RHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqbWltZSkgewotICAgIHJldHVybiBtSURhdGFTb3VyY2UtPkRybUluaXRpYWxpemF0aW9uKG1pbWUpOwotfQotCiBzcDxJRGF0YVNvdXJjZT4gQ2FsbGJhY2tEYXRhU291cmNlOjpnZXRJRGF0YVNvdXJjZSgpIGNvbnN0IHsKICAgICByZXR1cm4gbUlEYXRhU291cmNlOwogfQpAQCAtMTkwLDE0ICsxODYsNiBAQAogICAgIHJldHVybiBtU291cmNlLT5mbGFncygpOwogfQogCi1zcDxEZWNyeXB0SGFuZGxlPiBUaW55Q2FjaGVTb3VyY2U6OkRybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIgKm1pbWUpIHsKLSAgICAvLyBmbHVzaCBjYWNoZSB3aGVuIERybUluaXRpYWxpemF0aW9uIG9jY3VycyBzaW5jZSBkZWNyeXB0ZWQKLSAgICAvLyBkYXRhIG1heSBkaWZmZXIgZnJvbSB3aGF0IGlzIGluIGNhY2hlLgotICAgIG1DYWNoZWRPZmZzZXQgPSAwOwotICAgIG1DYWNoZWRTaXplID0gMDsKLSAgICByZXR1cm4gbVNvdXJjZS0+RHJtSW5pdGlhbGl6YXRpb24obWltZSk7Ci19Ci0KIHNwPElEYXRhU291cmNlPiBUaW55Q2FjaGVTb3VyY2U6OmdldElEYXRhU291cmNlKCkgY29uc3QgewogICAgIHJldHVybiBtU291cmNlLT5nZXRJRGF0YVNvdXJjZSgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0NvZGVjQmFzZS5jcHAKaW5kZXggZDA2MTBiMi4uOTdmMzhmOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvQ29kZWNCYXNlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9Db2RlY0Jhc2UuY3BwCkBAIC0xOCw3ICsxOCw3IEBACiAjZGVmaW5lIExPR19UQUcgIkNvZGVjQmFzZSIKIAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FzL25hdGl2ZS8xLjAvSURlc2NyYW1ibGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGJmMGNjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDExNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiRGF0YVNvdXJjZSIKLQotI2luY2x1ZGUgImluY2x1ZGUvSFRUUEJhc2UuaCIKLSNpbmNsdWRlICJpbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0YXRpYwotc3A8RGF0YVNvdXJjZT4gRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21VUkkoCi0gICAgICAgIGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSwKLSAgICAgICAgY29uc3QgY2hhciAqdXJpLAotICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgU3RyaW5nOCAqY29udGVudFR5cGUsCi0gICAgICAgIEhUVFBCYXNlICpodHRwU291cmNlKSB7Ci0gICAgaWYgKGNvbnRlbnRUeXBlICE9IE5VTEwpIHsKLSAgICAgICAgKmNvbnRlbnRUeXBlID0gIiI7Ci0gICAgfQotCi0gICAgc3A8RGF0YVNvdXJjZT4gc291cmNlOwotICAgIGlmICghc3RybmNhc2VjbXAoImZpbGU6Ly8iLCB1cmksIDcpKSB7Ci0gICAgICAgIHNvdXJjZSA9IG5ldyBGaWxlU291cmNlKHVyaSArIDcpOwotICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJodHRwOi8vIiwgdXJpLCA3KSB8fCAhc3RybmNhc2VjbXAoImh0dHBzOi8vIiwgdXJpLCA4KSkgewotICAgICAgICBpZiAoaHR0cFNlcnZpY2UgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgaHR0cCBzZXJ2aWNlISIpOwotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaHR0cFNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiBjb25uID0gaHR0cFNlcnZpY2UtPm1ha2VIVFRQQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgaWYgKGNvbm4gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbWFrZSBodHRwIGNvbm5lY3Rpb24gZnJvbSBodHRwIHNlcnZpY2UhIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBodHRwU291cmNlID0gbmV3IE1lZGlhSFRUUChjb25uKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZzggY2FjaGVDb25maWc7Ci0gICAgICAgIGJvb2wgZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyayA9IGZhbHNlOwotICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBub25DYWNoZVNwZWNpZmljSGVhZGVyczsKLSAgICAgICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewotICAgICAgICAgICAgbm9uQ2FjaGVTcGVjaWZpY0hlYWRlcnMgPSAqaGVhZGVyczsKLSAgICAgICAgICAgIE51Q2FjaGVkU291cmNlMjo6UmVtb3ZlQ2FjaGVTcGVjaWZpY0hlYWRlcnMoCi0gICAgICAgICAgICAgICAgICAgICZub25DYWNoZVNwZWNpZmljSGVhZGVycywKLSAgICAgICAgICAgICAgICAgICAgJmNhY2hlQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAmZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyayk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoaHR0cFNvdXJjZS0+Y29ubmVjdCh1cmksICZub25DYWNoZVNwZWNpZmljSGVhZGVycykgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gY29ubmVjdCBodHRwIHNvdXJjZSEiKTsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbnRlbnRUeXBlICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpjb250ZW50VHlwZSA9IGh0dHBTb3VyY2UtPmdldE1JTUVUeXBlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzb3VyY2UgPSBOdUNhY2hlZFNvdXJjZTI6OkNyZWF0ZSgKLSAgICAgICAgICAgICAgICBodHRwU291cmNlLAotICAgICAgICAgICAgICAgIGNhY2hlQ29uZmlnLmlzRW1wdHkoKSA/IE5VTEwgOiBjYWNoZUNvbmZpZy5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICBkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrKTsKLSAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcCgiZGF0YToiLCB1cmksIDUpKSB7Ci0gICAgICAgIHNvdXJjZSA9IERhdGFVUklTb3VyY2U6OkNyZWF0ZSh1cmkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEFzc3VtZSBpdCdzIGEgZmlsZW5hbWUuCi0gICAgICAgIHNvdXJjZSA9IG5ldyBGaWxlU291cmNlKHVyaSk7Ci0gICAgfQotCi0gICAgaWYgKHNvdXJjZSA9PSBOVUxMIHx8IHNvdXJjZS0+aW5pdENoZWNrKCkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIHNvdXJjZTsKLX0KLQotc3A8RGF0YVNvdXJjZT4gRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21GZChpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgewotICAgIHNwPEZpbGVTb3VyY2U+IHNvdXJjZSA9IG5ldyBGaWxlU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgcmV0dXJuIHNvdXJjZS0+aW5pdENoZWNrKCkgIT0gT0sgPyBudWxscHRyIDogc291cmNlOwotfQotCi1zcDxEYXRhU291cmNlPiBEYXRhU291cmNlRmFjdG9yeTo6Q3JlYXRlTWVkaWFIVFRQKGNvbnN0IHNwPE1lZGlhSFRUUFNlcnZpY2U+ICZodHRwU2VydmljZSkgewotICAgIGlmIChodHRwU2VydmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+IGNvbm4gPSBodHRwU2VydmljZS0+bWFrZUhUVFBDb25uZWN0aW9uKCk7Ci0gICAgaWYgKGNvbm4gPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhSFRUUChjb25uKTsKLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9EYXRhVVJJU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGMzNDVmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVVSSVNvdXJjZS5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBzdGF0aWMKLXNwPERhdGFVUklTb3VyY2U+IERhdGFVUklTb3VyY2U6OkNyZWF0ZShjb25zdCBjaGFyICp1cmkpIHsKLSAgICBpZiAoc3RybmNhc2VjbXAoImRhdGE6IiwgdXJpLCA1KSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBjb25zdCBjaGFyICpjb21tYVBvcyA9IHN0cnJjaHIodXJpLCAnLCcpOwotCi0gICAgaWYgKGNvbW1hUG9zID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgc3A8QUJ1ZmZlcj4gYnVmZmVyOwotCi0gICAgQVN0cmluZyB0bXAoJnVyaVs1XSwgY29tbWFQb3MgLSAmdXJpWzVdKTsKLQotICAgIGlmICh0bXAuZW5kc1dpdGgoIjtiYXNlNjQiKSkgewotICAgICAgICBBU3RyaW5nIGVuY29kZWQoY29tbWFQb3MgKyAxKTsKLQotICAgICAgICAvLyBTdHJpcCBDUiBhbmQgTEYuLi4KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IGVuY29kZWQuc2l6ZSgpOyBpID4gMDspIHsKLSAgICAgICAgICAgIGktLTsKLSAgICAgICAgICAgIGlmIChlbmNvZGVkLmNfc3RyKClbaV0gPT0gJ1xyJyB8fCBlbmNvZGVkLmNfc3RyKClbaV0gPT0gJ1xuJykgewotICAgICAgICAgICAgICAgIGVuY29kZWQuZXJhc2UoaSwgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBidWZmZXIgPSBkZWNvZGVCYXNlNjQoZW5jb2RlZCk7Ci0KLSAgICAgICAgaWYgKGJ1ZmZlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiTWFsZm9ybWVkIGJhc2U2NCBlbmNvZGVkIGNvbnRlbnQgZm91bmQuIik7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0jaWYgMAotICAgICAgICBzaXplX3QgZGF0YUxlbiA9IHN0cmxlbih1cmkpIC0gdG1wLnNpemUoKSAtIDY7Ci0gICAgICAgIGJ1ZmZlciA9IG5ldyBBQnVmZmVyKGRhdGFMZW4pOwotICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGNvbW1hUG9zICsgMSwgZGF0YUxlbik7Ci0KLSAgICAgICAgLy8gdW5lc2NhcGUKLSNlbHNlCi0gICAgICAgIC8vIE1lZGlhUGxheWVyIGRvZXNuJ3QgY2FyZSBmb3IgdGhpcyByaWdodCBub3cgYXMgd2UgZG9uJ3QKLSAgICAgICAgLy8gcGxheSBhbnkgdGV4dC1iYXNlZCBtZWRpYS4KLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0jZW5kaWYKLSAgICB9Ci0KLSAgICAvLyBXZSBkb24ndCByZWFsbHkgY2FyZSBhYm91dCBjaGFyc2V0IG9yIG1pbWUgdHlwZS4KLQotICAgIHJldHVybiBuZXcgRGF0YVVSSVNvdXJjZShidWZmZXIpOwotfQotCi1EYXRhVVJJU291cmNlOjpEYXRhVVJJU291cmNlKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpCi0gICAgOiBtQnVmZmVyKGJ1ZmZlcikgewotfQotCi1EYXRhVVJJU291cmNlOjp+RGF0YVVSSVNvdXJjZSgpIHsKLX0KLQotc3RhdHVzX3QgRGF0YVVSSVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBPSzsKLX0KLQotc3NpemVfdCBEYXRhVVJJU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKChvZmZzZXQgPCAwKSB8fCAob2Zmc2V0ID49IChvZmY2NF90KW1CdWZmZXItPnNpemUoKSkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgc2l6ZV90IGNvcHkgPSBtQnVmZmVyLT5zaXplKCkgLSBvZmZzZXQ7Ci0gICAgaWYgKGNvcHkgPiBzaXplKSB7Ci0gICAgICAgIGNvcHkgPSBzaXplOwotICAgIH0KLQotICAgIG1lbWNweShkYXRhLCBtQnVmZmVyLT5kYXRhKCkgKyBvZmZzZXQsIGNvcHkpOwotCi0gICAgcmV0dXJuIGNvcHk7Ci19Ci0KLXN0YXR1c190IERhdGFVUklTb3VyY2U6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgewotICAgICpzaXplID0gbUJ1ZmZlci0+c2l6ZSgpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9GaWxlU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWY1MzE0Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkZpbGVTb3VyY2UiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotI2luY2x1ZGUgPHByaXZhdGUvYW5kcm9pZF9maWxlc3lzdGVtX2NvbmZpZy5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1GaWxlU291cmNlOjpGaWxlU291cmNlKGNvbnN0IGNoYXIgKmZpbGVuYW1lKQotICAgIDogbUZkKC0xKSwKLSAgICAgIG1PZmZzZXQoMCksCi0gICAgICBtTGVuZ3RoKC0xKSwKLSAgICAgIG1OYW1lKCI8bnVsbD4iKSwKLSAgICAgIG1EZWNyeXB0SGFuZGxlKE5VTEwpLAotICAgICAgbURybU1hbmFnZXJDbGllbnQoTlVMTCksCi0gICAgICBtRHJtQnVmT2Zmc2V0KDApLAotICAgICAgbURybUJ1ZlNpemUoMCksCi0gICAgICBtRHJtQnVmKE5VTEwpewotCi0gICAgaWYgKGZpbGVuYW1lKSB7Ci0gICAgICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJGaWxlU291cmNlKCVzKSIsIGZpbGVuYW1lKTsKLSAgICB9Ci0gICAgQUxPR1YoIiVzIiwgZmlsZW5hbWUpOwotICAgIG1GZCA9IG9wZW4oZmlsZW5hbWUsIE9fTEFSR0VGSUxFIHwgT19SRE9OTFkpOwotCi0gICAgaWYgKG1GZCA+PSAwKSB7Ci0gICAgICAgIG1MZW5ndGggPSBsc2VlazY0KG1GZCwgMCwgU0VFS19FTkQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBmaWxlICclcycuICglcykiLCBmaWxlbmFtZSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICB9Ci19Ci0KLUZpbGVTb3VyY2U6OkZpbGVTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCi0gICAgOiBtRmQoZmQpLAotICAgICAgbU9mZnNldChvZmZzZXQpLAotICAgICAgbUxlbmd0aChsZW5ndGgpLAotICAgICAgbU5hbWUoIjxudWxsPiIpLAotICAgICAgbURlY3J5cHRIYW5kbGUoTlVMTCksCi0gICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSwKLSAgICAgIG1Ecm1CdWZPZmZzZXQoMCksCi0gICAgICBtRHJtQnVmU2l6ZSgwKSwKLSAgICAgIG1Ecm1CdWYoTlVMTCkgewotICAgIEFMT0dWKCJmZD0lZCAoJXMpLCBvZmZzZXQ9JWxsZCwgbGVuZ3RoPSVsbGQiLAotICAgICAgICAgICAgZmQsIG5hbWVGb3JGZChmZCkuY19zdHIoKSwgKGxvbmcgbG9uZykgb2Zmc2V0LCAobG9uZyBsb25nKSBsZW5ndGgpOwotCi0gICAgaWYgKG1PZmZzZXQgPCAwKSB7Ci0gICAgICAgIG1PZmZzZXQgPSAwOwotICAgIH0KLSAgICBpZiAobUxlbmd0aCA8IDApIHsKLSAgICAgICAgbUxlbmd0aCA9IDA7Ci0gICAgfQotICAgIGlmIChtTGVuZ3RoID4gSU5UNjRfTUFYIC0gbU9mZnNldCkgewotICAgICAgICBtTGVuZ3RoID0gSU5UNjRfTUFYIC0gbU9mZnNldDsKLSAgICB9Ci0gICAgc3RydWN0IHN0YXQgczsKLSAgICBpZiAoZnN0YXQoZmQsICZzKSA9PSAwKSB7Ci0gICAgICAgIGlmIChtT2Zmc2V0ID4gcy5zdF9zaXplKSB7Ci0gICAgICAgICAgICBtT2Zmc2V0ID0gcy5zdF9zaXplOwotICAgICAgICAgICAgbUxlbmd0aCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1PZmZzZXQgKyBtTGVuZ3RoID4gcy5zdF9zaXplKSB7Ci0gICAgICAgICAgICBtTGVuZ3RoID0gcy5zdF9zaXplIC0gbU9mZnNldDsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAobU9mZnNldCAhPSBvZmZzZXQgfHwgbUxlbmd0aCAhPSBsZW5ndGgpIHsKLSAgICAgICAgQUxPR1coIm9mZnNldC9sZW5ndGggYWRqdXN0ZWQgZnJvbSAlbGxkLyVsbGQgdG8gJWxsZC8lbGxkIiwKLSAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBvZmZzZXQsIChsb25nIGxvbmcpIGxlbmd0aCwKLSAgICAgICAgICAgICAgICAobG9uZyBsb25nKSBtT2Zmc2V0LCAobG9uZyBsb25nKSBtTGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBtTmFtZSA9IFN0cmluZzg6OmZvcm1hdCgKLSAgICAgICAgICAgICJGaWxlU291cmNlKGZkKCVzKSwgJWxsZCwgJWxsZCkiLAotICAgICAgICAgICAgbmFtZUZvckZkKGZkKS5jX3N0cigpLAotICAgICAgICAgICAgKGxvbmcgbG9uZykgbU9mZnNldCwKLSAgICAgICAgICAgIChsb25nIGxvbmcpIG1MZW5ndGgpOwotCi19Ci0KLUZpbGVTb3VyY2U6On5GaWxlU291cmNlKCkgewotICAgIGlmIChtRmQgPj0gMCkgewotICAgICAgICA6OmNsb3NlKG1GZCk7Ci0gICAgICAgIG1GZCA9IC0xOwotICAgIH0KLQotICAgIGlmIChtRHJtQnVmICE9IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlW10gbURybUJ1ZjsKLSAgICAgICAgbURybUJ1ZiA9IE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1EZWNyeXB0SGFuZGxlICE9IE5VTEwpIHsKLSAgICAgICAgLy8gVG8gcmVsZWFzZSBtRGVjcnlwdEhhbmRsZQotICAgICAgICBDSEVDSyhtRHJtTWFuYWdlckNsaWVudCk7Ci0gICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50LT5jbG9zZURlY3J5cHRTZXNzaW9uKG1EZWNyeXB0SGFuZGxlKTsKLSAgICAgICAgbURlY3J5cHRIYW5kbGUgPSBOVUxMOwotICAgIH0KLQotICAgIGlmIChtRHJtTWFuYWdlckNsaWVudCAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtRHJtTWFuYWdlckNsaWVudDsKLSAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBOVUxMOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRmlsZVNvdXJjZTo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBtRmQgPj0gMCA/IE9LIDogTk9fSU5JVDsKLX0KLQotc3NpemVfdCBGaWxlU291cmNlOjpyZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgaWYgKG1GZCA8IDApIHsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtTGVuZ3RoID49IDApIHsKLSAgICAgICAgaWYgKG9mZnNldCA+PSBtTGVuZ3RoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsgIC8vIHJlYWQgYmV5b25kIEVPRi4KLSAgICAgICAgfQotICAgICAgICB1aW50NjRfdCBudW1BdmFpbGFibGUgPSBtTGVuZ3RoIC0gb2Zmc2V0OwotICAgICAgICBpZiAoKHVpbnQ2NF90KXNpemUgPiBudW1BdmFpbGFibGUpIHsKLSAgICAgICAgICAgIHNpemUgPSBudW1BdmFpbGFibGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCAmJiBEZWNyeXB0QXBpVHlwZTo6Q09OVEFJTkVSX0JBU0VECi0gICAgICAgICAgICA9PSBtRGVjcnlwdEhhbmRsZS0+ZGVjcnlwdEFwaVR5cGUpIHsKLSAgICAgICAgcmV0dXJuIHJlYWRBdERSTShvZmZzZXQsIGRhdGEsIHNpemUpOwotICAgfSBlbHNlIHsKLSAgICAgICAgb2ZmNjRfdCByZXN1bHQgPSBsc2VlazY0KG1GZCwgb2Zmc2V0ICsgbU9mZnNldCwgU0VFS19TRVQpOwotICAgICAgICBpZiAocmVzdWx0ID09IC0xKSB7Ci0gICAgICAgICAgICBBTE9HRSgic2VlayB0byAlbGxkIGZhaWxlZCIsIChsb25nIGxvbmcpKG9mZnNldCArIG1PZmZzZXQpKTsKLSAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIDo6cmVhZChtRmQsIGRhdGEsIHNpemUpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgRmlsZVNvdXJjZTo6Z2V0U2l6ZShvZmY2NF90ICpzaXplKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChtRmQgPCAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgICpzaXplID0gbUxlbmd0aDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3A8RGVjcnlwdEhhbmRsZT4gRmlsZVNvdXJjZTo6RHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqbWltZSkgewotICAgIGlmIChnZXR1aWQoKSA9PSBBSURfTUVESUFfRVgpIHJldHVybiBudWxscHRyOyAvLyBubyBEUk0gaW4gbWVkaWEgZXh0cmFjdG9yCi0gICAgaWYgKG1Ecm1NYW5hZ2VyQ2xpZW50ID09IE5VTEwpIHsKLSAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBuZXcgRHJtTWFuYWdlckNsaWVudCgpOwotICAgIH0KLQotICAgIGlmIChtRHJtTWFuYWdlckNsaWVudCA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmIChtRGVjcnlwdEhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgICAgIG1EZWNyeXB0SGFuZGxlID0gbURybU1hbmFnZXJDbGllbnQtPm9wZW5EZWNyeXB0U2Vzc2lvbigKLSAgICAgICAgICAgICAgICBtRmQsIG1PZmZzZXQsIG1MZW5ndGgsIG1pbWUpOwotICAgIH0KLQotICAgIGlmIChtRGVjcnlwdEhhbmRsZSA9PSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtRHJtTWFuYWdlckNsaWVudDsKLSAgICAgICAgbURybU1hbmFnZXJDbGllbnQgPSBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBtRGVjcnlwdEhhbmRsZTsKLX0KLQotc3NpemVfdCBGaWxlU291cmNlOjpyZWFkQXREUk0ob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgc2l6ZV90IERSTV9DQUNIRV9TSVpFID0gMTAyNDsKLSAgICBpZiAobURybUJ1ZiA9PSBOVUxMKSB7Ci0gICAgICAgIG1Ecm1CdWYgPSBuZXcgdW5zaWduZWQgY2hhcltEUk1fQ0FDSEVfU0laRV07Ci0gICAgfQotCi0gICAgaWYgKG1Ecm1CdWYgIT0gTlVMTCAmJiBtRHJtQnVmU2l6ZSA+IDAgJiYgKG9mZnNldCArIG1PZmZzZXQpID49IG1Ecm1CdWZPZmZzZXQKLSAgICAgICAgICAgICYmIChvZmZzZXQgKyBtT2Zmc2V0ICsgc2l6ZSkgPD0gc3RhdGljX2Nhc3Q8c2l6ZV90PihtRHJtQnVmT2Zmc2V0ICsgbURybUJ1ZlNpemUpKSB7Ci0gICAgICAgIC8qIFVzZSBidWZmZXJlZCBkYXRhICovCi0gICAgICAgIG1lbWNweShkYXRhLCAodm9pZCopKG1Ecm1CdWYrKG9mZnNldCttT2Zmc2V0LW1Ecm1CdWZPZmZzZXQpKSwgc2l6ZSk7Ci0gICAgICAgIHJldHVybiBzaXplOwotICAgIH0gZWxzZSBpZiAoc2l6ZSA8PSBEUk1fQ0FDSEVfU0laRSkgewotICAgICAgICAvKiBCdWZmZXIgbmV3IGRhdGEgKi8KLSAgICAgICAgbURybUJ1Zk9mZnNldCA9ICBvZmZzZXQgKyBtT2Zmc2V0OwotICAgICAgICBtRHJtQnVmU2l6ZSA9IG1Ecm1NYW5hZ2VyQ2xpZW50LT5wcmVhZChtRGVjcnlwdEhhbmRsZSwgbURybUJ1ZiwKLSAgICAgICAgICAgICAgICBEUk1fQ0FDSEVfU0laRSwgb2Zmc2V0ICsgbU9mZnNldCk7Ci0gICAgICAgIGlmIChtRHJtQnVmU2l6ZSA+IDApIHsKLSAgICAgICAgICAgIGludDY0X3QgZGF0YVJlYWQgPSAwOwotICAgICAgICAgICAgZGF0YVJlYWQgPSBzaXplID4gc3RhdGljX2Nhc3Q8c2l6ZV90PihtRHJtQnVmU2l6ZSkgPyBtRHJtQnVmU2l6ZSA6IHNpemU7Ci0gICAgICAgICAgICBtZW1jcHkoZGF0YSwgKHZvaWQqKW1Ecm1CdWYsIGRhdGFSZWFkKTsKLSAgICAgICAgICAgIHJldHVybiBkYXRhUmVhZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtRHJtQnVmU2l6ZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIFRvbyBiaWcgY2h1bmsgdG8gY2FjaGUuIENhbGwgRFJNIGRpcmVjdGx5ICovCi0gICAgICAgIHJldHVybiBtRHJtTWFuYWdlckNsaWVudC0+cHJlYWQobURlY3J5cHRIYW5kbGUsIGRhdGEsIHNpemUsIG9mZnNldCArIG1PZmZzZXQpOwotICAgIH0KLX0KLQotLyogc3RhdGljICovCi1ib29sIEZpbGVTb3VyY2U6OnJlcXVpcmVzRHJtKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoLCBjb25zdCBjaGFyICptaW1lKSB7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPERybU1hbmFnZXJDbGllbnQ+IGRybUNsaWVudChuZXcgRHJtTWFuYWdlckNsaWVudCgpKTsKLSAgICBzcDxEZWNyeXB0SGFuZGxlPiBkZWNyeXB0SGFuZGxlID0KLSAgICAgICAgICAgIGRybUNsaWVudC0+b3BlbkRlY3J5cHRTZXNzaW9uKGZkLCBvZmZzZXQsIGxlbmd0aCwgbWltZSk7Ci0gICAgYm9vbCByZXF1aXJlc0RybSA9IGZhbHNlOwotICAgIGlmIChkZWNyeXB0SGFuZGxlICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmVxdWlyZXNEcm0gPSBkZWNyeXB0SGFuZGxlLT5kZWNyeXB0QXBpVHlwZSA9PSBEZWNyeXB0QXBpVHlwZTo6Q09OVEFJTkVSX0JBU0VEOwotICAgICAgICBkcm1DbGllbnQtPmNsb3NlRGVjcnlwdFNlc3Npb24oZGVjcnlwdEhhbmRsZSk7Ci0gICAgfQotICAgIHJldHVybiByZXF1aXJlc0RybTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9GcmFtZURlY29kZXIuY3BwCmluZGV4IDYyMzE0NTQuLjA4ZjY5MGIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0ZyYW1lRGVjb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvRnJhbWVEZWNvZGVyLmNwcApAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlIZWFwQmFzZS5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vSUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgpAQCAtNTAxLDkgKzUwMSwxNSBAQAogICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodDsKLSAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpKTsKLSAgICBDSEVDSyhvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiaGVpZ2h0IiwgJmhlaWdodCkpOworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgc3RyaWRlLCBzcmNGb3JtYXQ7CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigid2lkdGgiLCAmd2lkdGgpIHx8CisgICAgICAgICAgICAhb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImhlaWdodCIsICZoZWlnaHQpIHx8CisgICAgICAgICAgICAhb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZzdHJpZGUpIHx8CisgICAgICAgICAgICAhb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLWZvcm1hdCIsICZzcmNGb3JtYXQpKSB7CisgICAgICAgIEFMT0dFKCJmb3JtYXQgbWlzc2luZyBkaW1lbnNpb24gb3IgY29sb3I6ICVzIiwKKyAgICAgICAgICAgICAgICBvdXRwdXRGb3JtYXQtPmRlYnVnU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQogCiAgICAgaW50MzJfdCBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbTsKICAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZFJlY3QoImNyb3AiLCAmY3JvcF9sZWZ0LCAmY3JvcF90b3AsICZjcm9wX3JpZ2h0LCAmY3JvcF9ib3R0b20pKSB7CkBAIC01MjIsMTkgKzUyOCwyNyBAQAogICAgIGFkZEZyYW1lKGZyYW1lTWVtKTsKICAgICBWaWRlb0ZyYW1lKiBmcmFtZSA9IHN0YXRpY19jYXN0PFZpZGVvRnJhbWUqPihmcmFtZU1lbS0+cG9pbnRlcigpKTsKIAotICAgIGludDMyX3Qgc3JjRm9ybWF0OwotICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1mb3JtYXQiLCAmc3JjRm9ybWF0KSk7Ci0KICAgICBDb2xvckNvbnZlcnRlciBjb252ZXJ0ZXIoKE9NWF9DT0xPUl9GT1JNQVRUWVBFKXNyY0Zvcm1hdCwgZHN0Rm9ybWF0KCkpOwogCisgICAgdWludDMyX3Qgc3RhbmRhcmQsIHJhbmdlLCB0cmFuc2ZlcjsKKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci1zdGFuZGFyZCIsIChpbnQzMl90Kikmc3RhbmRhcmQpKSB7CisgICAgICAgIHN0YW5kYXJkID0gMDsKKyAgICB9CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItcmFuZ2UiLCAoaW50MzJfdCopJnJhbmdlKSkgeworICAgICAgICByYW5nZSA9IDA7CisgICAgfQorICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXRyYW5zZmVyIiwgKGludDMyX3QqKSZ0cmFuc2ZlcikpIHsKKyAgICAgICAgdHJhbnNmZXIgPSAwOworICAgIH0KKyAgICBjb252ZXJ0ZXIuc2V0U3JjQ29sb3JTcGFjZShzdGFuZGFyZCwgcmFuZ2UsIHRyYW5zZmVyKTsKKwogICAgIGlmIChjb252ZXJ0ZXIuaXNWYWxpZCgpKSB7CiAgICAgICAgIGNvbnZlcnRlci5jb252ZXJ0KAogICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopdmlkZW9GcmFtZUJ1ZmZlci0+ZGF0YSgpLAotICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgc3RyaWRlLAogICAgICAgICAgICAgICAgIGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tLAogICAgICAgICAgICAgICAgIGZyYW1lLT5nZXRGbGF0dGVuZWREYXRhKCksCi0gICAgICAgICAgICAgICAgZnJhbWUtPm1XaWR0aCwKLSAgICAgICAgICAgICAgICBmcmFtZS0+bUhlaWdodCwKKyAgICAgICAgICAgICAgICBmcmFtZS0+bVdpZHRoLCBmcmFtZS0+bUhlaWdodCwgZnJhbWUtPm1Sb3dCeXRlcywKICAgICAgICAgICAgICAgICBjcm9wX2xlZnQsIGNyb3BfdG9wLCBjcm9wX3JpZ2h0LCBjcm9wX2JvdHRvbSk7CiAgICAgICAgIHJldHVybiBPSzsKICAgICB9CkBAIC02ODEsOSArNjk1LDEwIEBACiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQogCi0gICAgaW50MzJfdCB3aWR0aCwgaGVpZ2h0OworICAgIGludDMyX3Qgd2lkdGgsIGhlaWdodCwgc3RyaWRlOwogICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aCkpOwogICAgIENIRUNLKG91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJoZWlnaHQiLCAmaGVpZ2h0KSk7CisgICAgQ0hFQ0sob3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZzdHJpZGUpKTsKIAogICAgIGlmIChtRnJhbWUgPT0gTlVMTCkgewogICAgICAgICBzcDxJTWVtb3J5PiBmcmFtZU1lbSA9IGFsbG9jVmlkZW9GcmFtZSgKQEAgLTY5OCwxMSArNzEzLDE3IEBACiAKICAgICBDb2xvckNvbnZlcnRlciBjb252ZXJ0ZXIoKE9NWF9DT0xPUl9GT1JNQVRUWVBFKXNyY0Zvcm1hdCwgZHN0Rm9ybWF0KCkpOwogCi0gICAgaW50MzJfdCBkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b207Ci0gICAgZHN0TGVmdCA9IG1UaWxlc0RlY29kZWQgJSBtR3JpZENvbHMgKiB3aWR0aDsKLSAgICBkc3RUb3AgPSBtVGlsZXNEZWNvZGVkIC8gbUdyaWRDb2xzICogaGVpZ2h0OwotICAgIGRzdFJpZ2h0ID0gZHN0TGVmdCArIHdpZHRoIC0gMTsKLSAgICBkc3RCb3R0b20gPSBkc3RUb3AgKyBoZWlnaHQgLSAxOworICAgIHVpbnQzMl90IHN0YW5kYXJkLCByYW5nZSwgdHJhbnNmZXI7CisgICAgaWYgKCFvdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3Itc3RhbmRhcmQiLCAoaW50MzJfdCopJnN0YW5kYXJkKSkgeworICAgICAgICBzdGFuZGFyZCA9IDA7CisgICAgfQorICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXJhbmdlIiwgKGludDMyX3QqKSZyYW5nZSkpIHsKKyAgICAgICAgcmFuZ2UgPSAwOworICAgIH0KKyAgICBpZiAoIW91dHB1dEZvcm1hdC0+ZmluZEludDMyKCJjb2xvci10cmFuc2ZlciIsIChpbnQzMl90KikmdHJhbnNmZXIpKSB7CisgICAgICAgIHRyYW5zZmVyID0gMDsKKyAgICB9CisgICAgY29udmVydGVyLnNldFNyY0NvbG9yU3BhY2Uoc3RhbmRhcmQsIHJhbmdlLCB0cmFuc2Zlcik7CiAKICAgICBpbnQzMl90IGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tOwogICAgIGlmICghb3V0cHV0Rm9ybWF0LT5maW5kUmVjdCgiY3JvcCIsICZjcm9wX2xlZnQsICZjcm9wX3RvcCwgJmNyb3BfcmlnaHQsICZjcm9wX2JvdHRvbSkpIHsKQEAgLTcxMSwxNSArNzMyLDI1IEBACiAgICAgICAgIGNyb3BfYm90dG9tID0gaGVpZ2h0IC0gMTsKICAgICB9CiAKKyAgICBpbnQzMl90IGNyb3Bfd2lkdGgsIGNyb3BfaGVpZ2h0OworICAgIGNyb3Bfd2lkdGggPSBjcm9wX3JpZ2h0IC0gY3JvcF9sZWZ0ICsgMTsKKyAgICBjcm9wX2hlaWdodCA9IGNyb3BfYm90dG9tIC0gY3JvcF90b3AgKyAxOworCisgICAgaW50MzJfdCBkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b207CisgICAgZHN0TGVmdCA9IG1UaWxlc0RlY29kZWQgJSBtR3JpZENvbHMgKiBjcm9wX3dpZHRoOworICAgIGRzdFRvcCA9IG1UaWxlc0RlY29kZWQgLyBtR3JpZENvbHMgKiBjcm9wX2hlaWdodDsKKyAgICBkc3RSaWdodCA9IGRzdExlZnQgKyBjcm9wX3dpZHRoIC0gMTsKKyAgICBkc3RCb3R0b20gPSBkc3RUb3AgKyBjcm9wX2hlaWdodCAtIDE7CisKICAgICAvLyBhcHBseSBjcm9wIG9uIGJvdHRvbS1yaWdodAogICAgIC8vIFRPRE86IG5lZWQgdG8gbW92ZSB0aGlzIGludG8gdGhlIGNvbG9yIGNvbnZlcnRlciBpdHNlbGYuCiAgICAgaWYgKGRzdFJpZ2h0ID49IG1XaWR0aCkgewotICAgICAgICBjcm9wX3JpZ2h0ID0gbVdpZHRoIC0gZHN0TGVmdCAtIDE7Ci0gICAgICAgIGRzdFJpZ2h0ID0gZHN0TGVmdCArIGNyb3BfcmlnaHQ7CisgICAgICAgIGNyb3BfcmlnaHQgPSBjcm9wX2xlZnQgKyBtV2lkdGggLSBkc3RMZWZ0IC0gMTsKKyAgICAgICAgZHN0UmlnaHQgPSBtV2lkdGggLSAxOwogICAgIH0KICAgICBpZiAoZHN0Qm90dG9tID49IG1IZWlnaHQpIHsKLSAgICAgICAgY3JvcF9ib3R0b20gPSBtSGVpZ2h0IC0gZHN0VG9wIC0gMTsKLSAgICAgICAgZHN0Qm90dG9tID0gZHN0VG9wICsgY3JvcF9ib3R0b207CisgICAgICAgIGNyb3BfYm90dG9tID0gY3JvcF90b3AgKyBtSGVpZ2h0IC0gZHN0VG9wIC0gMTsKKyAgICAgICAgZHN0Qm90dG9tID0gbUhlaWdodCAtIDE7CiAgICAgfQogCiAgICAgKmRvbmUgPSAoKyttVGlsZXNEZWNvZGVkID49IG1UYXJnZXRUaWxlcyk7CkBAIC03MjcsMTEgKzc1OCwxMCBAQAogICAgIGlmIChjb252ZXJ0ZXIuaXNWYWxpZCgpKSB7CiAgICAgICAgIGNvbnZlcnRlci5jb252ZXJ0KAogICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90ICopdmlkZW9GcmFtZUJ1ZmZlci0+ZGF0YSgpLAotICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgc3RyaWRlLAogICAgICAgICAgICAgICAgIGNyb3BfbGVmdCwgY3JvcF90b3AsIGNyb3BfcmlnaHQsIGNyb3BfYm90dG9tLAogICAgICAgICAgICAgICAgIG1GcmFtZS0+Z2V0RmxhdHRlbmVkRGF0YSgpLAotICAgICAgICAgICAgICAgIG1GcmFtZS0+bVdpZHRoLAotICAgICAgICAgICAgICAgIG1GcmFtZS0+bUhlaWdodCwKKyAgICAgICAgICAgICAgICBtRnJhbWUtPm1XaWR0aCwgbUZyYW1lLT5tSGVpZ2h0LCBtRnJhbWUtPm1Sb3dCeXRlcywKICAgICAgICAgICAgICAgICBkc3RMZWZ0LCBkc3RUb3AsIGRzdFJpZ2h0LCBkc3RCb3R0b20pOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSFRUUEJhc2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZjI0MzI5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hUVFBCYXNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDExIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJIVFRQQmFzZSIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvSFRUUEJhc2UuaCIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+Ci0KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotI2luY2x1ZGUgPGN1dGlscy9xdGFndWlkLmg+Ci0KLSNpbmNsdWRlIDxOZXRkQ2xpZW50Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotSFRUUEJhc2U6OkhUVFBCYXNlKCkKLSAgICA6IG1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXMoMCksCi0gICAgICBtVG90YWxUcmFuc2ZlclRpbWVVcygwKSwKLSAgICAgIG1Ub3RhbFRyYW5zZmVyQnl0ZXMoMCksCi0gICAgICBtTWF4QmFuZHdpZHRoSGlzdG9yeUl0ZW1zKDEwMCksCi0gICAgICBtUHJldkJhbmR3aWR0aE1lYXN1cmVUaW1lVXMoMCksCi0gICAgICBtUHJldkVzdGltYXRlZEJhbmRXaWR0aEticHMoMCksCi0gICAgICBtQmFuZFdpZHRoQ29sbGVjdEZyZXFNcyg1MDAwKSB7Ci0gICAgbU5hbWUgPSBTdHJpbmc4KCJIVFRQQmFzZSg8ZGlzY29ubmVjdGVkPikiKTsKLX0KLQotdm9pZCBIVFRQQmFzZTo6YWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQoCi0gICAgICAgIHNpemVfdCBudW1CeXRlcywgaW50NjRfdCBkZWxheVVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIEJhbmR3aWR0aEVudHJ5IGVudHJ5OwotICAgIGVudHJ5Lm1EZWxheVVzID0gZGVsYXlVczsKLSAgICBlbnRyeS5tTnVtQnl0ZXMgPSBudW1CeXRlczsKLSAgICBtVG90YWxUcmFuc2ZlclRpbWVVcyArPSBkZWxheVVzOwotICAgIG1Ub3RhbFRyYW5zZmVyQnl0ZXMgKz0gbnVtQnl0ZXM7Ci0KLSAgICBtQmFuZHdpZHRoSGlzdG9yeS5wdXNoX2JhY2soZW50cnkpOwotICAgIGlmICgrK21OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXMgPiBtTWF4QmFuZHdpZHRoSGlzdG9yeUl0ZW1zKSB7Ci0gICAgICAgIEJhbmR3aWR0aEVudHJ5ICplbnRyeSA9ICYqbUJhbmR3aWR0aEhpc3RvcnkuYmVnaW4oKTsKLSAgICAgICAgbVRvdGFsVHJhbnNmZXJUaW1lVXMgLT0gZW50cnktPm1EZWxheVVzOwotICAgICAgICBtVG90YWxUcmFuc2ZlckJ5dGVzIC09IGVudHJ5LT5tTnVtQnl0ZXM7Ci0gICAgICAgIG1CYW5kd2lkdGhIaXN0b3J5LmVyYXNlKG1CYW5kd2lkdGhIaXN0b3J5LmJlZ2luKCkpOwotICAgICAgICAtLW1OdW1CYW5kd2lkdGhIaXN0b3J5SXRlbXM7Ci0KLSAgICAgICAgaW50NjRfdCB0aW1lTm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgICAgICBpZiAodGltZU5vd1VzIC0gbVByZXZCYW5kd2lkdGhNZWFzdXJlVGltZVVzID49Ci0gICAgICAgICAgICAgICAgbUJhbmRXaWR0aENvbGxlY3RGcmVxTXMgKiAxMDAwTEwpIHsKLQotICAgICAgICAgICAgaWYgKG1QcmV2QmFuZHdpZHRoTWVhc3VyZVRpbWVVcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbVByZXZFc3RpbWF0ZWRCYW5kV2lkdGhLYnBzID0KLSAgICAgICAgICAgICAgICAgICAgKG1Ub3RhbFRyYW5zZmVyQnl0ZXMgKiA4RTMgLyBtVG90YWxUcmFuc2ZlclRpbWVVcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUHJldkJhbmR3aWR0aE1lYXN1cmVUaW1lVXMgPSB0aW1lTm93VXM7Ci0gICAgICAgIH0KLSAgICB9Ci0KLX0KLQotYm9vbCBIVFRQQmFzZTo6ZXN0aW1hdGVCYW5kd2lkdGgoaW50MzJfdCAqYmFuZHdpZHRoX2JwcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAvLyBEbyBub3QgZG8gYmFuZHdpZHRoIGVzdGltYXRpb24gaWYgd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggc2FtcGxlcywgb3IKLSAgICAvLyB0b3RhbCBieXRlcyBkb3dubG9hZCBhcmUgdG9vIHNtYWxsICg8NjRLKS4KLSAgICAvLyBCYW5kd2lkdGggZXN0aW1hdGlvbiBmcm9tIHRoZXNlIHNhbXBsZXMgY2FuIG9mdGVuIHNob290IHVwIGFuZCBjYXVzZQotICAgIC8vIHVud2FudGVkIGJ3IGFkYXB0aW9uIGJlaGF2aW9ycy4KLSAgICBpZiAobU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtcyA8IDIgfHwgbVRvdGFsVHJhbnNmZXJCeXRlcyA8IDY1NTM2KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAqYmFuZHdpZHRoX2JwcyA9ICgoZG91YmxlKW1Ub3RhbFRyYW5zZmVyQnl0ZXMgKiA4RTYgLyBtVG90YWxUcmFuc2ZlclRpbWVVcyk7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdHVzX3QgSFRUUEJhc2U6OmdldEVzdGltYXRlZEJhbmR3aWR0aEticHMoaW50MzJfdCAqa2JwcykgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgKmticHMgPSBtUHJldkVzdGltYXRlZEJhbmRXaWR0aEticHM7Ci0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBIVFRQQmFzZTo6c2V0QmFuZHdpZHRoU3RhdENvbGxlY3RGcmVxKGludDMyX3QgZnJlcU1zKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIGlmIChmcmVxTXMgPCBrTWluQmFuZHdpZHRoQ29sbGVjdEZyZXFNcwotICAgICAgICAgICAgfHwgZnJlcU1zID4ga01heEJhbmR3aWR0aENvbGxlY3RGcmVxTXMpIHsKLQotICAgICAgICBBTE9HRSgiZnJlcXVlbmN5ICglZCBtcykgaXMgb3V0IG9mIHJhbmdlIFsxMDAwLCA2MDAwMF0iLCBmcmVxTXMpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQotICAgIEFMT0dJKCJmcmVxdWVuY3kgc2V0IHRvICVkIG1zIiwgZnJlcU1zKTsKLSAgICBtQmFuZFdpZHRoQ29sbGVjdEZyZXFNcyA9IGZyZXFNczsKLSAgICByZXR1cm4gT0s7Ci19Ci0KLXZvaWQgSFRUUEJhc2U6OnNldEJhbmR3aWR0aEhpc3RvcnlTaXplKHNpemVfdCBudW1IaXN0b3J5SXRlbXMpIHsKLSAgICBtTWF4QmFuZHdpZHRoSGlzdG9yeUl0ZW1zID0gbnVtSGlzdG9yeUl0ZW1zOwotfQotCi0vLyBzdGF0aWMKLXZvaWQgSFRUUEJhc2U6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkLCB1aWRfdCB1aWQsIHVpbnQzMl90IGtUYWcpIHsKLSAgICBpbnQgcmVzID0gcXRhZ3VpZF90YWdTb2NrZXQoc29ja2ZkLCBrVGFnLCB1aWQpOwotICAgIGlmIChyZXMgIT0gMCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRhZ2dpbmcgc29ja2V0ICVkIGZvciB1aWQgJWQgKE15IFVJRD0lZCkiLCBzb2NrZmQsIHVpZCwgZ2V0ZXVpZCgpKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCkgewotICAgIGludCByZXMgPSBxdGFndWlkX3VudGFnU29ja2V0KHNvY2tmZCk7Ci0gICAgaWYgKHJlcyAhPSAwKSB7Ci0gICAgICAgIEFMT0dFKCJGYWlsZWQgdW50YWdnaW5nIHNvY2tldCAlZCAoTXkgVUlEPSVkKSIsIHNvY2tmZCwgZ2V0ZXVpZCgpKTsKLSAgICB9Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQgc29ja2ZkLCB1aWRfdCB1aWQpIHsKLSAgICBzZXROZXR3b3JrRm9yVXNlcih1aWQsIHNvY2tmZCk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQpIHsKLSAgICBSZWdpc3RlclNvY2tldFVzZXJNYXJrKHNvY2tmZCwgZ2V0ZXVpZCgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hldmNVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9IZXZjVXRpbHMuY3BwCmluZGV4IGYxNTJhMzguLjQ4MmExYTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L0hldmNVdGlscy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvSGV2Y1V0aWxzLmNwcApAQCAtMzEyLDE0ICszMTIsMjMgQEAKICAgICAgICAgICAgIGZvciAodWludDMyX3QgaiA9IDA7IGogPCBudW1QaWNzOyArK2opIHsKICAgICAgICAgICAgICAgICBza2lwVUUoJnJlYWRlcik7IC8vIGRlbHRhX3BvY19zMHwxX21pbnVzMVtpXQogICAgICAgICAgICAgICAgIHJlYWRlci5za2lwQml0cygxKTsgLy8gdXNlZF9ieV9jdXJyX3BpY19zMHwxX2ZsYWdbaV0KKyAgICAgICAgICAgICAgICBpZiAocmVhZGVyLm92ZXJSZWFkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHJlYWRlci5vdmVyUmVhZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CiAgICAgfQogICAgIGlmIChyZWFkZXIuZ2V0Qml0c1dpdGhGYWxsYmFjaygxLCAwKSkgeyAvLyBsb25nX3Rlcm1fcmVmX3BpY3NfcHJlc2VudF9mbGFnCiAgICAgICAgIHVpbnQzMl90IG51bUxvbmdUZXJtUmVmUGljU3BzID0gcGFyc2VVRVdpdGhGYWxsYmFjaygmcmVhZGVyLCAwKTsKICAgICAgICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IG51bUxvbmdUZXJtUmVmUGljU3BzOyArK2kpIHsKICAgICAgICAgICAgIHJlYWRlci5za2lwQml0cyhsb2cyTWF4UGljT3JkZXJDbnRMc2IpOyAvLyBsdF9yZWZfcGljX3BvY19sc2Jfc3BzW2ldCiAgICAgICAgICAgICByZWFkZXIuc2tpcEJpdHMoMSk7IC8vIHVzZWRfYnlfY3Vycl9waWNfbHRfc3BzX2ZsYWdbaV0KKyAgICAgICAgICAgIGlmIChyZWFkZXIub3ZlclJlYWQoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgcmVhZGVyLnNraXBCaXRzKDEpOyAvLyBzcHNfdGVtcG9yYWxfbXZwX2VuYWJsZWRfZmxhZwpAQCAtNDU3LDggKzQ2Niw4IEBACiAgICAgICAgIGlmIChudW1OYWx1cyA9PSAwKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICAvLyBhcnJheV9jb21wbGV0ZW5lc3Mgc2V0IHRvIDAuCi0gICAgICAgIGhlYWRlclswXSA9IHR5cGU7CisgICAgICAgIC8vIGFycmF5X2NvbXBsZXRlbmVzcyBzZXQgdG8gMS4KKyAgICAgICAgaGVhZGVyWzBdID0gdHlwZSB8IDB4ODA7CiAgICAgICAgIGhlYWRlclsxXSA9IChudW1OYWx1cyA+PiA4KSAmIDB4ZmY7CiAgICAgICAgIGhlYWRlclsyXSA9IG51bU5hbHVzICYgMHhmZjsKICAgICAgICAgaGVhZGVyICs9IDM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NUEVHNFdyaXRlci5jcHAKaW5kZXggZDljNGUwNS4uMjU4YmVkOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmNwcApAQCAtNzEsNiArNzEsOCBAQAogc3RhdGljIGNvbnN0IHVpbnQ4X3Qga05hbFVuaXRUeXBlUGljUGFyYW1TZXQgPSAweDA4Owogc3RhdGljIGNvbnN0IGludDY0X3Qga0luaXRpYWxEZWxheVRpbWVVcyAgICAgPSA3MDAwMDBMTDsKIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhNZXRhZGF0YVNpemUgPSAweDQwMDAwMDBMTDsgICAvLyA2NE1CIG1heCBwZXItZnJhbWUgbWV0YWRhdGEgc2l6ZQorc3RhdGljIGNvbnN0IGludDY0X3Qga01heEN0dHNPZmZzZXRUaW1lVXMgPSAzMCAqIDYwICogMTAwMDAwMExMOyAgLy8gMzAgbWludXRlcworc3RhdGljIGNvbnN0IHNpemVfdCBrRVNEU1NjcmF0Y2hCdWZmZXJTaXplID0gMTA7ICAvLyBrTWF4QXRvbVNpemUgaW4gTXBlZzRFeHRyYWN0b3IgNjRNQgogCiBzdGF0aWMgY29uc3QgY2hhciBrTWV0YUtleV9WZXJzaW9uW10gICAgPSAiY29tLmFuZHJvaWQudmVyc2lvbiI7CiBzdGF0aWMgY29uc3QgY2hhciBrTWV0YUtleV9NYW51ZmFjdHVyZXJbXSAgICAgID0gImNvbS5hbmRyb2lkLm1hbnVmYWN0dXJlciI7CkBAIC04NSw3ICs4Nyw3IEBACiBzdGF0aWMgY29uc3QgaW50IGtUaW1lc3RhbXBEZWJ1Z0NvdW50ID0gMTA7CiBzdGF0aWMgY29uc3QgaW50IGtJdGVtSWRCYXNlID0gMTAwMDA7CiBzdGF0aWMgY29uc3QgY2hhciBrRXhpZkhlYWRlcltdID0geydFJywgJ3gnLCAnaScsICdmJywgJ1wwJywgJ1wwJ307Ci1zdGF0aWMgY29uc3QgaW50MzJfdCBrVGlmZkhlYWRlck9mZnNldCA9IGh0b25sKHNpemVvZihrRXhpZkhlYWRlcikpOworc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0V4aWZBcHAxTWFya2VyW10gPSB7J0UnLCAneCcsICdpJywgJ2YnLCAweGZmLCAweGUxfTsKIAogc3RhdGljIGNvbnN0IHVpbnQ4X3Qga01hbmRhdG9yeUhldmNOYWxVbml0VHlwZXNbM10gPSB7CiAgICAga0hldmNOYWxVbml0VHlwZVZwcywKQEAgLTEyNSw3ICsxMjcsNyBAQAogICAgIGJvb2wgaXNBdWRpbygpIGNvbnN0IHsgcmV0dXJuIG1Jc0F1ZGlvOyB9CiAgICAgYm9vbCBpc01QRUc0KCkgY29uc3QgeyByZXR1cm4gbUlzTVBFRzQ7IH0KICAgICBib29sIHVzZVByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIG1Jc0F2YyB8fCBtSXNIZXZjIHx8IG1Jc0hlaWM7IH0KLSAgICBib29sIGlzRXhpZkRhdGEoY29uc3QgTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIGNvbnN0OworICAgIGJvb2wgaXNFeGlmRGF0YShNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDMyX3QgKnRpZmZIZHJPZmZzZXQpIGNvbnN0OwogICAgIHZvaWQgYWRkQ2h1bmtPZmZzZXQob2ZmNjRfdCBvZmZzZXQpOwogICAgIHZvaWQgYWRkSXRlbU9mZnNldEFuZFNpemUob2ZmNjRfdCBvZmZzZXQsIHNpemVfdCBzaXplLCBib29sIGlzRXhpZik7CiAgICAgdm9pZCBmbHVzaEl0ZW1SZWZzKCk7CkBAIC0xMzYsMTEgKzEzOCw2IEBACiAgICAgdm9pZCByZXNldEludGVybmFsKCk7CiAKIHByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIGtNYXhDdHRzT2Zmc2V0VGltZVVzID0gMTAwMDAwMExMLCAgLy8gMSBzZWNvbmQKLSAgICAgICAga1NhbXBsZUFycmF5U2l6ZSA9IDEwMDAsCi0gICAgfTsKLQogICAgIC8vIEEgaGVscGVyIGNsYXNzIHRvIGhhbmRsZSBmYXN0ZXIgd3JpdGUgYm94IHdpdGggdGFibGUgZW50cmllcwogICAgIHRlbXBsYXRlPGNsYXNzIFRZUEUsIHVuc2lnbmVkIEVOVFJZX1NJWkU+CiAgICAgLy8gRU5UUllfU0laRTogIyBvZiB2YWx1ZXMgaW4gZWFjaCBlbnRyeQpAQCAtMzE3LDYgKzMxNCw3IEBACiAgICAgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMT4gKm1TdHNzVGFibGVFbnRyaWVzOwogICAgIExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+ICptU3R0c1RhYmxlRW50cmllczsKICAgICBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAyPiAqbUN0dHNUYWJsZUVudHJpZXM7CisgICAgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMz4gKm1FbHN0VGFibGVFbnRyaWVzOyAvLyAzY29sdW1uczogc2VnRHVyYXRpb24sIG1lZGlhVGltZSwgbWVkaWFSYXRlCiAKICAgICBpbnQ2NF90IG1NaW5DdHRzT2Zmc2V0VGltZVVzOwogICAgIGludDY0X3QgbU1pbkN0dHNPZmZzZXRUaWNrczsKQEAgLTM2MSw3ICszNTksNyBAQAogCiAgICAgVmVjdG9yPHVpbnQxNl90PiBtUHJvcGVydGllczsKICAgICBJdGVtUmVmcyBtRGltZ1JlZnM7Ci0gICAgSXRlbVJlZnMgbUNkc2NSZWZzOworICAgIFZlY3Rvcjx1aW50MTZfdD4gbUV4aWZMaXN0OwogICAgIHVpbnQxNl90IG1JbWFnZUl0ZW1JZDsKICAgICBpbnQzMl90IG1Jc1ByaW1hcnk7CiAgICAgaW50MzJfdCBtV2lkdGgsIG1IZWlnaHQ7CkBAIC00MTYsNiArNDE0LDggQEAKICAgICAvLyBEdXJhdGlvbiBpcyB0aW1lIHNjYWxlIGJhc2VkCiAgICAgdm9pZCBhZGRPbmVTdHRzVGFibGVFbnRyeShzaXplX3Qgc2FtcGxlQ291bnQsIGludDMyX3QgdGltZXNjYWxlZER1cik7CiAgICAgdm9pZCBhZGRPbmVDdHRzVGFibGVFbnRyeShzaXplX3Qgc2FtcGxlQ291bnQsIGludDMyX3QgdGltZXNjYWxlZER1cik7CisgICAgdm9pZCBhZGRPbmVFbHN0VGFibGVFbnRyeSh1aW50MzJfdCBzZWdtZW50RHVyYXRpb24sIGludDMyX3QgbWVkaWFUaW1lLAorICAgICAgICBpbnQxNl90IG1lZGlhUmF0ZSwgaW50MTZfdCBtZWRpYVJhdGVGcmFjdGlvbik7CiAKICAgICBib29sIGlzVHJhY2tNYWxGb3JtZWQoKSBjb25zdDsKICAgICB2b2lkIHNlbmRUcmFja1N1bW1hcnkoYm9vbCBoYXNNdWx0aXBsZVRyYWNrcyk7CkBAIC00NDgsMTMgKzQ0OCwxNCBAQAogICAgIHZvaWQgd3JpdGVWaWRlb0ZvdXJDQ0JveCgpOwogICAgIHZvaWQgd3JpdGVNZXRhZGF0YUZvdXJDQ0JveCgpOwogICAgIHZvaWQgd3JpdGVTdGJsQm94KGJvb2wgdXNlMzJCaXRPZmZzZXQpOworICAgIHZvaWQgd3JpdGVFZHRzQm94KCk7CiAKICAgICBUcmFjayhjb25zdCBUcmFjayAmKTsKICAgICBUcmFjayAmb3BlcmF0b3I9KGNvbnN0IFRyYWNrICYpOwogfTsKIAogTVBFRzRXcml0ZXI6Ok1QRUc0V3JpdGVyKGludCBmZCkgewotICAgIGluaXRJbnRlcm5hbChmZCwgdHJ1ZSAvKmlzRmlyc3RTZXNzaW9uKi8pOworICAgIGluaXRJbnRlcm5hbChkdXAoZmQpLCB0cnVlIC8qaXNGaXJzdFNlc3Npb24qLyk7CiB9CiAKIE1QRUc0V3JpdGVyOjp+TVBFRzRXcml0ZXIoKSB7CkBAIC00NzUsNyArNDc2LDcgQEAKIAogdm9pZCBNUEVHNFdyaXRlcjo6aW5pdEludGVybmFsKGludCBmZCwgYm9vbCBpc0ZpcnN0U2Vzc2lvbikgewogICAgIEFMT0dWKCJpbml0SW50ZXJuYWwiKTsKLSAgICBtRmQgPSBkdXAoZmQpOworICAgIG1GZCA9IGZkOwogICAgIG1OZXh0RmQgPSAtMTsKICAgICBtSW5pdENoZWNrID0gbUZkIDwgMD8gTk9fSU5JVDogT0s7CiAKQEAgLTQ4Myw2ICs0ODQsNyBAQAogCiAgICAgbVN0YXJ0VGltZXN0YW1wVXMgPSAtMUxMOwogICAgIG1TdGFydFRpbWVPZmZzZXRNcyA9IC0xOworICAgIG1TdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMgPSAwOwogICAgIG1QYXVzZWQgPSBmYWxzZTsKICAgICBtU3RhcnRlZCA9IGZhbHNlOwogICAgIG1Xcml0ZXJUaHJlYWRTdGFydGVkID0gZmFsc2U7CkBAIC02MTEsOCArNjEzLDkgQEAKIAogICAgIENIRUNLKHNvdXJjZS5nZXQoKSAhPSBOVUxMKTsKIAotICAgIGNvbnN0IGNoYXIgKm1pbWU7Ci0gICAgc291cmNlLT5nZXRGb3JtYXQoKS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgY29uc3QgY2hhciAqbWltZSA9IE5VTEw7CisgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBzb3VyY2UtPmdldEZvcm1hdCgpOworICAgIG1ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOwogCiAgICAgaWYgKFRyYWNrOjpnZXRGb3VyQ0NGb3JNaW1lKG1pbWUpID09IE5VTEwpIHsKICAgICAgICAgQUxPR0UoIlVuc3VwcG9ydGVkIG1pbWUgJyVzJyIsIG1pbWUpOwpAQCAtMTAzNyw2ICsxMDQwLDEwIEBACiB2b2lkIE1QRUc0V3JpdGVyOjpyZWxlYXNlKCkgewogICAgIGNsb3NlKG1GZCk7CiAgICAgbUZkID0gLTE7CisgICAgaWYgKG1OZXh0RmQgIT0gLTEpIHsKKyAgICAgICAgY2xvc2UobU5leHRGZCk7CisgICAgICAgIG1OZXh0RmQgPSAtMTsKKyAgICB9CiAgICAgbUluaXRDaGVjayA9IE5PX0lOSVQ7CiAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKICAgICBmcmVlKG1Jbk1lbW9yeUNhY2hlKTsKQEAgLTEyNzIsNiArMTI3OSwxMCBAQAogICAgIC8vIEFkanVzdCB0aGUgZ2xvYmFsIHN0YXJ0IHRpbWUuCiAgICAgbVN0YXJ0VGltZXN0YW1wVXMgKz0gbWluQ3R0c09mZnNldFRpbWVVcyAtIGtNYXhDdHRzT2Zmc2V0VGltZVVzOwogCisgICAgLy8gQWRkIG1TdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMoLXZlIG9yIHplcm8pIHRvIHRoZSBkdXJhdGlvbiBvZiBmaXJzdCBlbnRyeSBpbiBTVFRTLgorICAgIG1TdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMgPSBtaW5DdHRzT2Zmc2V0VGltZVVzIC0ga01heEN0dHNPZmZzZXRUaW1lVXM7CisgICAgQUxPR1YoIm1TdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMgOiUiIFBSSWQzMiwgbVN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcyk7CisKICAgICBmb3IgKExpc3Q8VHJhY2sgKj46Oml0ZXJhdG9yIGl0ID0gbVRyYWNrcy5iZWdpbigpOwogICAgICAgICBpdCAhPSBtVHJhY2tzLmVuZCgpOyArK2l0KSB7CiAgICAgICAgIGlmICghKCppdCktPmlzSGVpYygpKSB7CkBAIC0xMzU3LDE0ICsxMzY4LDE2IEBACiB9CiAKIG9mZjY0X3QgTVBFRzRXcml0ZXI6OmFkZFNhbXBsZV9sKAotICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyLCBib29sIHVzZVByZWZpeCwgYm9vbCBpc0V4aWYsIHNpemVfdCAqYnl0ZXNXcml0dGVuKSB7CisgICAgICAgIE1lZGlhQnVmZmVyICpidWZmZXIsIGJvb2wgdXNlUHJlZml4LAorICAgICAgICB1aW50MzJfdCB0aWZmSGRyT2Zmc2V0LCBzaXplX3QgKmJ5dGVzV3JpdHRlbikgewogICAgIG9mZjY0X3Qgb2xkX29mZnNldCA9IG1PZmZzZXQ7CiAKICAgICBpZiAodXNlUHJlZml4KSB7CiAgICAgICAgIGFkZE11bHRpcGxlTGVuZ3RoUHJlZml4ZWRTYW1wbGVzX2woYnVmZmVyKTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAoaXNFeGlmKSB7Ci0gICAgICAgICAgICA6OndyaXRlKG1GZCwgJmtUaWZmSGVhZGVyT2Zmc2V0LCA0KTsgLy8gZXhpZl90aWZmX2hlYWRlcl9vZmZzZXQgZmllbGQKKyAgICAgICAgaWYgKHRpZmZIZHJPZmZzZXQgPiAwKSB7CisgICAgICAgICAgICB0aWZmSGRyT2Zmc2V0ID0gaHRvbmwodGlmZkhkck9mZnNldCk7CisgICAgICAgICAgICA6OndyaXRlKG1GZCwgJnRpZmZIZHJPZmZzZXQsIDQpOyAvLyBleGlmX3RpZmZfaGVhZGVyX29mZnNldCBmaWVsZAogICAgICAgICAgICAgbU9mZnNldCArPSA0OwogICAgICAgICB9CiAKQEAgLTE2MjMsOCArMTYzNiwxMyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAorICAgIC8vIEluY3JlYXNlIG1vb3ZFeHRyYVNpemUgb25jZSBvbmx5IGlycmVzcGVjdGl2ZSBvZiBob3cgbWFueSB0aW1lcworICAgIC8vIHNldENhcHR1cmVSYXRlIGlzIGNhbGxlZC4KKyAgICBib29sIGNvbnRhaW5zQ2FwdHVyZUZwcyA9IG1NZXRhS2V5cy0+Y29udGFpbnMoa01ldGFLZXlfQ2FwdHVyZUZwcyk7CiAgICAgbU1ldGFLZXlzLT5zZXRGbG9hdChrTWV0YUtleV9DYXB0dXJlRnBzLCBjYXB0dXJlRnBzKTsKLSAgICBtTW9vdkV4dHJhU2l6ZSArPSBzaXplb2Yoa01ldGFLZXlfQ2FwdHVyZUZwcykgKyA0ICsgMzI7CisgICAgaWYgKCFjb250YWluc0NhcHR1cmVGcHMpIHsKKyAgICAgICAgbU1vb3ZFeHRyYVNpemUgKz0gc2l6ZW9mKGtNZXRhS2V5X0NhcHR1cmVGcHMpICsgNCArIDMyOworICAgIH0KIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTE3NDcsNiArMTc2NSwxMSBAQAogICAgIHJldHVybiBtU3RhcnRUaW1lc3RhbXBVczsKIH0KIAoraW50MzJfdCBNUEVHNFdyaXRlcjo6Z2V0U3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1TdGFydFRpbWVPZmZzZXRCRnJhbWVzVXM7Cit9CisKIHNpemVfdCBNUEVHNFdyaXRlcjo6bnVtVHJhY2tzKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvbG9jayhtTG9jayk7CiAgICAgcmV0dXJuIG1UcmFja3Muc2l6ZSgpOwpAQCAtMTc3Niw2ICsxNzk5LDcgQEAKICAgICAgIG1TdHNzVGFibGVFbnRyaWVzKG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAxPigxMDAwKSksCiAgICAgICBtU3R0c1RhYmxlRW50cmllcyhuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMj4oMTAwMCkpLAogICAgICAgbUN0dHNUYWJsZUVudHJpZXMobmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+KDEwMDApKSwKKyAgICAgIG1FbHN0VGFibGVFbnRyaWVzKG5ldyBMaXN0VGFibGVFbnRyaWVzPHVpbnQzMl90LCAzPigzKSksIC8vIFJlc2VydmUgMyByb3dzLCBhIHJvdyBoYXMgMyBpdGVtcwogICAgICAgbU1pbkN0dHNPZmZzZXRUaW1lVXMoMCksCiAgICAgICBtTWluQ3R0c09mZnNldFRpY2tzKDApLAogICAgICAgbU1heEN0dHNPZmZzZXRUaWNrcygwKSwKQEAgLTE3ODYsNyArMTgxMCw2IEBACiAgICAgICBtU3RhcnRUaW1lc3RhbXBVcygtMSksCiAgICAgICBtUm90YXRpb24oMCksCiAgICAgICBtRGltZ1JlZnMoImRpbWciKSwKLSAgICAgIG1DZHNjUmVmcygiY2RzYyIpLAogICAgICAgbUltYWdlSXRlbUlkKDApLAogICAgICAgbUlzUHJpbWFyeSgwKSwKICAgICAgIG1XaWR0aCgwKSwKQEAgLTE4NDIsNDYgKzE4NjUsNDggQEAKIAogLy8gQ2xlYXIgYWxsIHRoZSBpbnRlcm5hbCBzdGF0ZXMgZXhjZXB0IHRoZSBDU0QgZGF0YS4KIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjpyZXNldEludGVybmFsKCkgewotICAgICAgbURvbmUgPSBmYWxzZTsKLSAgICAgIG1QYXVzZWQgPSBmYWxzZTsKLSAgICAgIG1SZXN1bWVkID0gZmFsc2U7Ci0gICAgICBtU3RhcnRlZCA9IGZhbHNlOwotICAgICAgbUdvdFN0YXJ0S2V5RnJhbWUgPSBmYWxzZTsKLSAgICAgIG1Jc01hbGZvcm1lZCA9IGZhbHNlOwotICAgICAgbVRyYWNrRHVyYXRpb25VcyA9IDA7Ci0gICAgICBtRXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMgPSAwOwotICAgICAgbVNhbXBsZXNIYXZlU2FtZVNpemUgPSAwOwotICAgICAgaWYgKG1TdHN6VGFibGVFbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgICAgIGRlbGV0ZSBtU3RzelRhYmxlRW50cmllczsKLSAgICAgICAgIG1TdHN6VGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDE+KDEwMDApOwotICAgICAgfQotCi0gICAgICBpZiAobVN0Y29UYWJsZUVudHJpZXMgIT0gTlVMTCkgewotICAgICAgICAgZGVsZXRlIG1TdGNvVGFibGVFbnRyaWVzOwotICAgICAgICAgbVN0Y29UYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMT4oMTAwMCk7Ci0gICAgICB9Ci0gICAgICBpZiAobUNvNjRUYWJsZUVudHJpZXMgIT0gTlVMTCkgewotICAgICAgICAgZGVsZXRlIG1DbzY0VGFibGVFbnRyaWVzOwotICAgICAgICAgbUNvNjRUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczxvZmY2NF90LCAxPigxMDAwKTsKLSAgICAgIH0KLQotICAgICAgaWYgKG1TdHNjVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgICAgIGRlbGV0ZSBtU3RzY1RhYmxlRW50cmllczsKLSAgICAgICAgIG1TdHNjVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDM+KDEwMDApOwotICAgICAgfQotICAgICAgaWYgKG1TdHNzVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgICAgIGRlbGV0ZSBtU3Rzc1RhYmxlRW50cmllczsKLSAgICAgICAgIG1TdHNzVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDE+KDEwMDApOwotICAgICAgfQotICAgICAgaWYgKG1TdHRzVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgICAgIGRlbGV0ZSBtU3R0c1RhYmxlRW50cmllczsKLSAgICAgICAgIG1TdHRzVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+KDEwMDApOwotICAgICAgfQotICAgICAgaWYgKG1DdHRzVGFibGVFbnRyaWVzICE9IE5VTEwpIHsKLSAgICAgICAgIGRlbGV0ZSBtQ3R0c1RhYmxlRW50cmllczsKLSAgICAgICAgIG1DdHRzVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDI+KDEwMDApOwotICAgICAgfQotICAgICAgbVJlYWNoZWRFT1MgPSBmYWxzZTsKKyAgICBtRG9uZSA9IGZhbHNlOworICAgIG1QYXVzZWQgPSBmYWxzZTsKKyAgICBtUmVzdW1lZCA9IGZhbHNlOworICAgIG1TdGFydGVkID0gZmFsc2U7CisgICAgbUdvdFN0YXJ0S2V5RnJhbWUgPSBmYWxzZTsKKyAgICBtSXNNYWxmb3JtZWQgPSBmYWxzZTsKKyAgICBtVHJhY2tEdXJhdGlvblVzID0gMDsKKyAgICBtRXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMgPSAwOworICAgIG1TYW1wbGVzSGF2ZVNhbWVTaXplID0gMDsKKyAgICBpZiAobVN0c3pUYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbVN0c3pUYWJsZUVudHJpZXM7CisgICAgICAgIG1TdHN6VGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDE+KDEwMDApOworICAgIH0KKyAgICBpZiAobVN0Y29UYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbVN0Y29UYWJsZUVudHJpZXM7CisgICAgICAgIG1TdGNvVGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8dWludDMyX3QsIDE+KDEwMDApOworICAgIH0KKyAgICBpZiAobUNvNjRUYWJsZUVudHJpZXMgIT0gTlVMTCkgeworICAgICAgICBkZWxldGUgbUNvNjRUYWJsZUVudHJpZXM7CisgICAgICAgIG1DbzY0VGFibGVFbnRyaWVzID0gbmV3IExpc3RUYWJsZUVudHJpZXM8b2ZmNjRfdCwgMT4oMTAwMCk7CisgICAgfQorICAgIGlmIChtU3RzY1RhYmxlRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtU3RzY1RhYmxlRW50cmllczsKKyAgICAgICAgbVN0c2NUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMz4oMTAwMCk7CisgICAgfQorICAgIGlmIChtU3Rzc1RhYmxlRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtU3Rzc1RhYmxlRW50cmllczsKKyAgICAgICAgbVN0c3NUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMT4oMTAwMCk7CisgICAgfQorICAgIGlmIChtU3R0c1RhYmxlRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtU3R0c1RhYmxlRW50cmllczsKKyAgICAgICAgbVN0dHNUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMj4oMTAwMCk7CisgICAgfQorICAgIGlmIChtQ3R0c1RhYmxlRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtQ3R0c1RhYmxlRW50cmllczsKKyAgICAgICAgbUN0dHNUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMj4oMTAwMCk7CisgICAgfQorICAgIGlmIChtRWxzdFRhYmxlRW50cmllcyAhPSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBtRWxzdFRhYmxlRW50cmllczsKKyAgICAgICAgbUVsc3RUYWJsZUVudHJpZXMgPSBuZXcgTGlzdFRhYmxlRW50cmllczx1aW50MzJfdCwgMz4oMyk7CisgICAgfQorICAgIG1SZWFjaGVkRU9TID0gZmFsc2U7CiB9CiAKIHZvaWQgTVBFRzRXcml0ZXI6OlRyYWNrOjp1cGRhdGVUcmFja1NpemVFc3RpbWF0ZSgpIHsKQEAgLTE5MDAsNiArMTkyNSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3Rzc1RhYmxlRW50cmllcy0+Y291bnQoKSAqIDQgKyAgIC8vIHN0c3MgYm94IHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHRzVGFibGVFbnRyaWVzLT5jb3VudCgpICogOCArICAgLy8gc3R0cyBib3ggc2l6ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN0dHNUYWJsZUVudHJpZXMtPmNvdW50KCkgKiA4ICsgICAvLyBjdHRzIGJveCBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWxzdFRhYmxlRW50cmllcy0+Y291bnQoKSAqIDEyICsgICAvLyBlbHN0IGJveCBzaXplCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGNvQm94U2l6ZUJ5dGVzICsgICAgICAgICAgIC8vIHN0Y28gYm94IHNpemUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0c3pCb3hTaXplQnl0ZXM7ICAgICAgICAgICAgLy8gc3RzeiBib3ggc2l6ZQogICAgIH0KQEAgLTE5MzYsNiArMTk2MiwxNiBAQAogICAgIG1DdHRzVGFibGVFbnRyaWVzLT5hZGQoaHRvbmwoZHVyYXRpb24pKTsKIH0KIAordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OmFkZE9uZUVsc3RUYWJsZUVudHJ5KAorICAgIHVpbnQzMl90IHNlZ21lbnREdXJhdGlvbiwgaW50MzJfdCBtZWRpYVRpbWUsIGludDE2X3QgbWVkaWFSYXRlLCBpbnQxNl90IG1lZGlhUmF0ZUZyYWN0aW9uKSB7CisgICAgQUxPR1YoInNlZ21lbnREdXJhdGlvbjoldSwgbWVkaWFUaW1lOiVkIiwgc2VnbWVudER1cmF0aW9uLCBtZWRpYVRpbWUpOworICAgIEFMT0dWKCJtZWRpYVJhdGUgOiUiIFBSSWQxNiAiLCBtZWRpYVJhdGVGcmFjdGlvbiA6JSIgUFJJZDE2ICIsIE9yZWQgJXUiLCBtZWRpYVJhdGUsCisgICAgICAgIG1lZGlhUmF0ZUZyYWN0aW9uLCAoKCgodWludDMyX3QpbWVkaWFSYXRlKSA8PCAxNikgfCAoKHVpbnQzMl90KW1lZGlhUmF0ZUZyYWN0aW9uKSkpOworICAgIG1FbHN0VGFibGVFbnRyaWVzLT5hZGQoaHRvbmwoc2VnbWVudER1cmF0aW9uKSk7CisgICAgbUVsc3RUYWJsZUVudHJpZXMtPmFkZChodG9ubChtZWRpYVRpbWUpKTsKKyAgICBtRWxzdFRhYmxlRW50cmllcy0+YWRkKGh0b25sKCgoKHVpbnQzMl90KW1lZGlhUmF0ZSkgPDwgMTYpIHwgKHVpbnQzMl90KW1lZGlhUmF0ZUZyYWN0aW9uKSk7Cit9CisKIHN0YXR1c190IE1QRUc0V3JpdGVyOjpzZXROZXh0RmQoaW50IGZkKSB7CiAgICAgQUxPR1YoImFkZE5leHRGZCIpOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKQEAgLTE5NTAsMTUgKzE5ODYsMzggQEAKICAgICAgICAgLy8gTm8gbmVlZCB0byBzZXQgYSBuZXcgRkQgeWV0LgogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotICAgIG1OZXh0RmQgPSBmZDsKKyAgICBtTmV4dEZkID0gZHVwKGZkKTsKICAgICByZXR1cm4gT0s7CiB9CiAKLWJvb2wgTVBFRzRXcml0ZXI6OlRyYWNrOjppc0V4aWZEYXRhKGNvbnN0IE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Jc0hlaWMKLSAgICAgICAgICAgICYmIChidWZmZXItPnJhbmdlX2xlbmd0aCgpID4gc2l6ZW9mKGtFeGlmSGVhZGVyKSkKLSAgICAgICAgICAgICYmICFtZW1jbXAoKHVpbnQ4X3QgKilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCksCi0gICAgICAgICAgICAgICAgICAgIGtFeGlmSGVhZGVyLCBzaXplb2Yoa0V4aWZIZWFkZXIpKTsKK2Jvb2wgTVBFRzRXcml0ZXI6OlRyYWNrOjppc0V4aWZEYXRhKAorICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciwgdWludDMyX3QgKnRpZmZIZHJPZmZzZXQpIGNvbnN0IHsKKyAgICBpZiAoIW1Jc0hlaWMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIEV4aWYgYmxvY2sgc3RhcnRpbmcgd2l0aCAnRXhpZlwwXDAnCisgICAgc2l6ZV90IGxlbmd0aCA9IGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCk7CisgICAgdWludDhfdCAqZGF0YSA9ICh1aW50OF90ICopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpOworICAgIGlmICgobGVuZ3RoID4gc2l6ZW9mKGtFeGlmSGVhZGVyKSkKKyAgICAgICAgJiYgIW1lbWNtcChkYXRhLCBrRXhpZkhlYWRlciwgc2l6ZW9mKGtFeGlmSGVhZGVyKSkpIHsKKyAgICAgICAgKnRpZmZIZHJPZmZzZXQgPSBzaXplb2Yoa0V4aWZIZWFkZXIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBFeGlmIGJsb2NrIHN0YXJ0aW5nIHdpdGggZm91cmNjICdFeGlmJyBmb2xsb3dlZCBieSBBUFAxIG1hcmtlcgorICAgIGlmICgobGVuZ3RoID4gc2l6ZW9mKGtFeGlmQXBwMU1hcmtlcikgKyAyICsgc2l6ZW9mKGtFeGlmSGVhZGVyKSkKKyAgICAgICAgICAgICYmICFtZW1jbXAoZGF0YSwga0V4aWZBcHAxTWFya2VyLCBzaXplb2Yoa0V4aWZBcHAxTWFya2VyKSkKKyAgICAgICAgICAgICYmICFtZW1jbXAoZGF0YSArIHNpemVvZihrRXhpZkFwcDFNYXJrZXIpICsgMiwga0V4aWZIZWFkZXIsIHNpemVvZihrRXhpZkhlYWRlcikpKSB7CisgICAgICAgIC8vIHNraXAgJ0V4aWYnIGZvdXJjYworICAgICAgICBidWZmZXItPnNldF9yYW5nZSg0LCBidWZmZXItPnJhbmdlX2xlbmd0aCgpIC0gNCk7CisKKyAgICAgICAgLy8gMi1ieXRlIEFQUDEgKyAyLWJ5dGUgc2l6ZSBmb2xsb3dlZCBieSBrRXhpZkhlYWRlcgorICAgICAgICAqdGlmZkhkck9mZnNldCA9IDIgKyAyICsgc2l6ZW9mKGtFeGlmSGVhZGVyKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6YWRkQ2h1bmtPZmZzZXQob2ZmNjRfdCBvZmZzZXQpIHsKQEAgLTE5ODQsNyArMjA0Myw3IEBACiAgICAgfQogCiAgICAgaWYgKGlzRXhpZikgewotICAgICAgICAgbUNkc2NSZWZzLnZhbHVlLnB1c2hfYmFjayhtT3duZXItPmFkZEl0ZW1fbCh7CisgICAgICAgICBtRXhpZkxpc3QucHVzaF9iYWNrKG1Pd25lci0+YWRkSXRlbV9sKHsKICAgICAgICAgICAgIC5pdGVtVHlwZSA9ICJFeGlmIiwKICAgICAgICAgICAgIC5pc1ByaW1hcnkgPSBmYWxzZSwKICAgICAgICAgICAgIC5pc0hpZGRlbiA9IGZhbHNlLApAQCAtMjA4Nyw3ICsyMTQ2LDE2IEBACiAKICAgICBpZiAobUltYWdlSXRlbUlkID4gMCkgewogICAgICAgICBtT3duZXItPmFkZFJlZnNfbChtSW1hZ2VJdGVtSWQsIG1EaW1nUmVmcyk7Ci0gICAgICAgIG1Pd25lci0+YWRkUmVmc19sKG1JbWFnZUl0ZW1JZCwgbUNkc2NSZWZzKTsKKworICAgICAgICBpZiAoIW1FeGlmTGlzdC5lbXB0eSgpKSB7CisgICAgICAgICAgICAvLyBUaGUgImNkc2MiIHJlZiBpcyBmcm9tIHRoZSBtZXRhZGF0YS9leGlmIGl0ZW0gdG8gdGhlIGltYWdlIGl0ZW0uCisgICAgICAgICAgICAvLyBTbyB0aGUgcmVmcyBhbGwgY29udGFpbiB0aGUgaW1hZ2UgaXRlbS4KKyAgICAgICAgICAgIEl0ZW1SZWZzIGNkc2NSZWZzKCJjZHNjIik7CisgICAgICAgICAgICBjZHNjUmVmcy52YWx1ZS5wdXNoX2JhY2sobUltYWdlSXRlbUlkKTsKKyAgICAgICAgICAgIGZvciAodWludDE2X3QgZXhpZkl0ZW0gOiBtRXhpZkxpc3QpIHsKKyAgICAgICAgICAgICAgICBtT3duZXItPmFkZFJlZnNfbChleGlmSXRlbSwgY2RzY1JlZnMpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgfQogfQogCkBAIC0yMTE3LDExICsyMTg1LDExIEBACiAgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgewogICAgICAgICBjYXNlIGtXaGF0U3dpdGNoOgogICAgICAgICB7Ci0gICAgICAgICAgICBmaW5pc2hDdXJyZW50U2Vzc2lvbigpOwogICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgaW50IGZkID0gbU5leHRGZDsKICAgICAgICAgICAgIG1OZXh0RmQgPSAtMTsKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgZmluaXNoQ3VycmVudFNlc3Npb24oKTsKICAgICAgICAgICAgIGluaXRJbnRlcm5hbChmZCwgZmFsc2UgLyppc0ZpcnN0U2Vzc2lvbiovKTsKICAgICAgICAgICAgIHN0YXJ0KG1TdGFydE1ldGEuZ2V0KCkpOwogICAgICAgICAgICAgbVN3aXRjaFBlbmRpbmcgPSBmYWxzZTsKQEAgLTIxNzMsNiArMjI0MSw3IEBACiAgICAgZGVsZXRlIG1TdHRzVGFibGVFbnRyaWVzOwogICAgIGRlbGV0ZSBtU3Rzc1RhYmxlRW50cmllczsKICAgICBkZWxldGUgbUN0dHNUYWJsZUVudHJpZXM7CisgICAgZGVsZXRlIG1FbHN0VGFibGVFbnRyaWVzOwogCiAgICAgbVN0c3pUYWJsZUVudHJpZXMgPSBOVUxMOwogICAgIG1TdGNvVGFibGVFbnRyaWVzID0gTlVMTDsKQEAgLTIxODEsNiArMjI1MCw3IEBACiAgICAgbVN0dHNUYWJsZUVudHJpZXMgPSBOVUxMOwogICAgIG1TdHNzVGFibGVFbnRyaWVzID0gTlVMTDsKICAgICBtQ3R0c1RhYmxlRW50cmllcyA9IE5VTEw7CisgICAgbUVsc3RUYWJsZUVudHJpZXMgPSBOVUxMOwogCiAgICAgaWYgKG1Db2RlY1NwZWNpZmljRGF0YSAhPSBOVUxMKSB7CiAgICAgICAgIGZyZWUobUNvZGVjU3BlY2lmaWNEYXRhKTsKQEAgLTIyMzcsMTQgKzIzMDcsMTYgQEAKICAgICB3aGlsZSAoIWNodW5rLT5tU2FtcGxlcy5lbXB0eSgpKSB7CiAgICAgICAgIExpc3Q8TWVkaWFCdWZmZXIgKj46Oml0ZXJhdG9yIGl0ID0gY2h1bmstPm1TYW1wbGVzLmJlZ2luKCk7CiAKLSAgICAgICAgaW50MzJfdCBpc0V4aWY7Ci0gICAgICAgIGlmICghKCppdCktPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5SXNFeGlmLCAmaXNFeGlmKSkgewotICAgICAgICAgICAgaXNFeGlmID0gMDsKKyAgICAgICAgdWludDMyX3QgdGlmZkhkck9mZnNldDsKKyAgICAgICAgaWYgKCEoKml0KS0+bWV0YV9kYXRhKCkuZmluZEludDMyKAorICAgICAgICAgICAgICAgIGtLZXlFeGlmVGlmZk9mZnNldCwgKGludDMyX3QqKSZ0aWZmSGRyT2Zmc2V0KSkgeworICAgICAgICAgICAgdGlmZkhkck9mZnNldCA9IDA7CiAgICAgICAgIH0KKyAgICAgICAgYm9vbCBpc0V4aWYgPSAodGlmZkhkck9mZnNldCA+IDApOwogICAgICAgICBib29sIHVzZVByZWZpeCA9IGNodW5rLT5tVHJhY2stPnVzZVByZWZpeCgpICYmICFpc0V4aWY7CiAKICAgICAgICAgc2l6ZV90IGJ5dGVzV3JpdHRlbjsKLSAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSBhZGRTYW1wbGVfbCgqaXQsIHVzZVByZWZpeCwgaXNFeGlmLCAmYnl0ZXNXcml0dGVuKTsKKyAgICAgICAgb2ZmNjRfdCBvZmZzZXQgPSBhZGRTYW1wbGVfbCgqaXQsIHVzZVByZWZpeCwgdGlmZkhkck9mZnNldCwgJmJ5dGVzV3JpdHRlbik7CiAKICAgICAgICAgaWYgKGNodW5rLT5tVHJhY2stPmlzSGVpYygpKSB7CiAgICAgICAgICAgICBjaHVuay0+bVRyYWNrLT5hZGRJdGVtT2Zmc2V0QW5kU2l6ZShvZmZzZXQsIGJ5dGVzV3JpdHRlbiwgaXNFeGlmKTsKQEAgLTI4NDksMTQgKzI5MjEsMTggQEAKIH0KIAogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OmR1bXBUaW1lU3RhbXBzKCkgewotICAgIEFMT0dFKCJEdW1waW5nICVzIHRyYWNrJ3MgbGFzdCAxMCBmcmFtZXMgdGltZXN0YW1wIGFuZCBmcmFtZSB0eXBlICIsIGdldFRyYWNrVHlwZSgpKTsKLSAgICBzdGQ6OnN0cmluZyB0aW1lU3RhbXBTdHJpbmc7Ci0gICAgZm9yIChzdGQ6Omxpc3Q8VGltZXN0YW1wRGVidWdIZWxwZXJFbnRyeT46Oml0ZXJhdG9yIGVudHJ5ID0gbVRpbWVzdGFtcERlYnVnSGVscGVyLmJlZ2luKCk7Ci0gICAgICAgICAgICBlbnRyeSAhPSBtVGltZXN0YW1wRGVidWdIZWxwZXIuZW5kKCk7ICsrZW50cnkpIHsKLSAgICAgICAgdGltZVN0YW1wU3RyaW5nICs9ICIoIiArIHN0ZDo6dG9fc3RyaW5nKGVudHJ5LT5wdHMpKwotICAgICAgICAgICAgICAgICJ1cywgIiArIHN0ZDo6dG9fc3RyaW5nKGVudHJ5LT5kdHMpICsgInVzICIgKyBlbnRyeS0+ZnJhbWVUeXBlICsgIikgIjsKKyAgICBpZiAoIW1UaW1lc3RhbXBEZWJ1Z0hlbHBlci5lbXB0eSgpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRpbWVTdGFtcFN0cmluZyA9ICJEdW1waW5nICIgKyBzdGQ6OnN0cmluZyhnZXRUcmFja1R5cGUoKSkgKyAiIHRyYWNrJ3MgbGFzdCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp0b19zdHJpbmcobVRpbWVzdGFtcERlYnVnSGVscGVyLnNpemUoKSkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGZyYW1lcycgdGltZXN0YW1wcyhwdHMsIGR0cykgYW5kIGZyYW1lIHR5cGUgOiAiOworICAgICAgICBmb3IgKGNvbnN0IFRpbWVzdGFtcERlYnVnSGVscGVyRW50cnkmIGVudHJ5IDogbVRpbWVzdGFtcERlYnVnSGVscGVyKSB7CisgICAgICAgICAgICB0aW1lU3RhbXBTdHJpbmcgKz0gIlxuKCIgKyBzdGQ6OnRvX3N0cmluZyhlbnRyeS5wdHMpICsgInVzLCAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhlbnRyeS5kdHMpICsgInVzICIgKyBlbnRyeS5mcmFtZVR5cGUgKyAiKSAiOworICAgICAgICB9CisgICAgICAgIEFMT0dFKCIlcyIsIHRpbWVTdGFtcFN0cmluZy5jX3N0cigpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiMCBmcmFtZXMgdG8gZHVtcCB0aW1lU3RhbXBzIGluICVzIHRyYWNrICIsIGdldFRyYWNrVHlwZSgpKTsKICAgICB9Ci0gICAgQUxPR0UoIiVzIiwgdGltZVN0YW1wU3RyaW5nLmNfc3RyKCkpOwogfQogCiBzdGF0dXNfdCBNUEVHNFdyaXRlcjo6VHJhY2s6OnRocmVhZEVudHJ5KCkgewpAQCAtMjk3MCwxMCArMzA0NiwxMSBAQAogICAgICAgICB9CiAKICAgICAgICAgYm9vbCBpc0V4aWYgPSBmYWxzZTsKKyAgICAgICAgdWludDMyX3QgdGlmZkhkck9mZnNldCA9IDA7CiAgICAgICAgIGludDMyX3QgaXNNdXhlckRhdGE7CiAgICAgICAgIGlmIChidWZmZXItPm1ldGFfZGF0YSgpLmZpbmRJbnQzMihrS2V5SXNNdXhlckRhdGEsICZpc011eGVyRGF0YSkgJiYgaXNNdXhlckRhdGEpIHsKICAgICAgICAgICAgIC8vIFdlIG9ubHkgc3VwcG9ydCBvbmUgdHlwZSBvZiBtdXhlciBkYXRhLCB3aGljaCBpcyBFeGlmIGRhdGEgYmxvY2suCi0gICAgICAgICAgICBpc0V4aWYgPSBpc0V4aWZEYXRhKGJ1ZmZlcik7CisgICAgICAgICAgICBpc0V4aWYgPSBpc0V4aWZEYXRhKGJ1ZmZlciwgJnRpZmZIZHJPZmZzZXQpOwogICAgICAgICAgICAgaWYgKCFpc0V4aWYpIHsKICAgICAgICAgICAgICAgICBBTE9HVygiSWdub3JpbmcgYmFkIEV4aWYgZGF0YSBibG9jayIpOwogICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmVsZWFzZSgpOwpAQCAtMjk5NSw3ICszMDcyLDcgQEAKICAgICAgICAgYnVmZmVyID0gTlVMTDsKIAogICAgICAgICBpZiAoaXNFeGlmKSB7Ci0gICAgICAgICAgICBjb3B5LT5tZXRhX2RhdGEoKS5zZXRJbnQzMihrS2V5SXNFeGlmLCAxKTsKKyAgICAgICAgICAgIGNvcHktPm1ldGFfZGF0YSgpLnNldEludDMyKGtLZXlFeGlmVGlmZk9mZnNldCwgdGlmZkhkck9mZnNldCk7CiAgICAgICAgIH0KICAgICAgICAgYm9vbCB1c2VQcmVmaXggPSB0aGlzLT51c2VQcmVmaXgoKSAmJiAhaXNFeGlmOwogCkBAIC0zMDYwLDggKzMxMzcsOCBAQAogICAgICAgICBpZiAoIW1Jc0hlaWMpIHsKICAgICAgICAgICAgIGlmIChtU3RzelRhYmxlRW50cmllcy0+Y291bnQoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgbUZpcnN0U2FtcGxlVGltZVJlYWxVcyA9IHN5c3RlbVRpbWUoKSAvIDEwMDA7CisgICAgICAgICAgICAgICAgbU93bmVyLT5zZXRTdGFydFRpbWVzdGFtcFVzKHRpbWVzdGFtcFVzKTsKICAgICAgICAgICAgICAgICBtU3RhcnRUaW1lc3RhbXBVcyA9IHRpbWVzdGFtcFVzOwotICAgICAgICAgICAgICAgIG1Pd25lci0+c2V0U3RhcnRUaW1lc3RhbXBVcyhtU3RhcnRUaW1lc3RhbXBVcyk7CiAgICAgICAgICAgICAgICAgcHJldmlvdXNQYXVzZWREdXJhdGlvblVzID0gbVN0YXJ0VGltZXN0YW1wVXM7CiAgICAgICAgICAgICB9CiAKQEAgLTMyNjgsNyArMzM0NSw4IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKCFoYXNNdWx0aXBsZVRyYWNrcykgewogICAgICAgICAgICAgc2l6ZV90IGJ5dGVzV3JpdHRlbjsKLSAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0ID0gbU93bmVyLT5hZGRTYW1wbGVfbChjb3B5LCB1c2VQcmVmaXgsIGlzRXhpZiwgJmJ5dGVzV3JpdHRlbik7CisgICAgICAgICAgICBvZmY2NF90IG9mZnNldCA9IG1Pd25lci0+YWRkU2FtcGxlX2woCisgICAgICAgICAgICAgICAgICAgIGNvcHksIHVzZVByZWZpeCwgdGlmZkhkck9mZnNldCwgJmJ5dGVzV3JpdHRlbik7CiAKICAgICAgICAgICAgIGlmIChtSXNIZWljKSB7CiAgICAgICAgICAgICAgICAgYWRkSXRlbU9mZnNldEFuZFNpemUob2Zmc2V0LCBieXRlc1dyaXR0ZW4sIGlzRXhpZik7CkBAIC0zNTI2LDcgKzM2MDQsNyBAQAogfQogCiBpbnQ2NF90IE1QRUc0V3JpdGVyOjpUcmFjazo6Z2V0RHVyYXRpb25VcygpIGNvbnN0IHsKLSAgICByZXR1cm4gbVRyYWNrRHVyYXRpb25VcyArIGdldFN0YXJ0VGltZU9mZnNldFRpbWVVcygpOworICAgIHJldHVybiBtVHJhY2tEdXJhdGlvblVzICsgZ2V0U3RhcnRUaW1lT2Zmc2V0VGltZVVzKCkgKyBtT3duZXItPmdldFN0YXJ0VGltZU9mZnNldEJGcmFtZXNVcygpOwogfQogCiBpbnQ2NF90IE1QRUc0V3JpdGVyOjpUcmFjazo6Z2V0RXN0aW1hdGVkVHJhY2tTaXplQnl0ZXMoKSBjb25zdCB7CkBAIC0zNjEyLDYgKzM2OTAsNyBAQAogICAgIHVpbnQzMl90IG5vdyA9IGdldE1wZWc0VGltZSgpOwogICAgIG1Pd25lci0+YmVnaW5Cb3goInRyYWsiKTsKICAgICAgICAgd3JpdGVUa2hkQm94KG5vdyk7CisgICAgICAgIHdyaXRlRWR0c0JveCgpOwogICAgICAgICBtT3duZXItPmJlZ2luQm94KCJtZGlhIik7CiAgICAgICAgICAgICB3cml0ZU1kaGRCb3gobm93KTsKICAgICAgICAgICAgIHdyaXRlSGRsckJveCgpOwpAQCAtMzY3NCw2ICszNzUzLDI5IEBACiAgICAgICAgIFRSRVNQQVNTKCk7CiAgICAgfQogICAgIG1Pd25lci0+YmVnaW5Cb3goZm91cmNjKTsgICAgLy8gVGV4dE1ldGFEYXRhU2FtcGxlRW50cnkKKworICAgIC8vICBIQUNLIHRvIG1ha2UgdGhlIG1ldGFkYXRhIHRyYWNrIGNvbXBsaWFudCB3aXRoIHRoZSBJU08gc3RhbmRhcmQuCisgICAgLy8KKyAgICAvLyAgTWV0YWRhdGEgdHJhY2sgaXMgYWRkZWQgZnJvbSBBUEkgMjYgYW5kIHRoZSBvcmlnaW5hbCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdAorICAgIC8vICBmdWxseSBmb2xsb3dlZCB0aGUgVGV4dE1ldGFEYXRhU2FtcGxlRW50cnkgc3BlY2lmaWVkIGluIElTTy9JRUMgMTQ0OTYtMTItMjAxNQorICAgIC8vICBpbiB0aGF0IG9ubHkgdGhlIG1pbWVfZm9ybWF0IGlzIHdyaXR0ZW4gb3V0LiBjb250ZW50X2VuY29kaW5nIGFuZAorICAgIC8vICBkYXRhX3JlZmVyZW5jZV9pbmRleCBoYXZlIG5vdCBiZWVuIHdyaXR0ZW4gb3V0LiBUaGlzIGxlYWRzIHRvIHRoZSBmYWlsdXJlCisgICAgLy8gIHdoZW4gc29tZSBNUDQgcGFyc2VyIHRyaWVzIHRvIHBhcnNlIHRoZSBtZXRhZGF0YSB0cmFjayBhY2NvcmRpbmcgdG8gdGhlCisgICAgLy8gIHN0YW5kYXJkLiBUaGUgaGFjayBoZXJlIHdpbGwgbWFrZSB0aGUgbWV0YWRhdGEgdHJhY2sgY29tcGxpYW50IHdpdGggdGhlCisgICAgLy8gIHN0YW5kYXJkIHdoaWxlIHN0aWxsIG1haW50YWluaW5nIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LiBUaGlzIHdvdWxkIGVuYWJsZQorICAgIC8vICBBbmRyb2lkIHZlcnNpb25zIGJlZm9yZSBBUEkgMjkgdG8gYmUgYWJsZSB0byByZWFkIG91dCB0aGUgc3RhbmRhcmQgY29tcGxpYW50CisgICAgLy8gIE1ldGFkYXRhIHRyYWNrIGdlbmVyYXRlZCB3aXRoIEFuZHJvaWQgQVBJIDI5IGFuZCB1cHdhcmQuIFRoZSB0cmljayBpcyBiYXNlZAorICAgIC8vICBvbiB0aGUgZmFjdCB0aGF0IHRoZSBNZXRhZGF0YSB0cmFjayBtdXN0IHN0YXJ0IHdpdGggcHJlZml4IOKAnGFwcGxpY2F0aW9uL+KAnSBhbmQKKyAgICAvLyAgdGhvc2UgbWlzc2luZyBmaWVsZHMgYXJlIG5vdCB1c2VkIGluIEFuZHJvaWQncyBNZXRhZGF0YSB0cmFjay4gQnkgd3JpdHRpbmcKKyAgICAvLyAgb3V0IHRoZSBtaW1lX2Zvcm1hdCB0d2ljZSwgdGhlIGZpcnN0IG1pbWVfZm9ybWF0IHdpbGwgYmUgdXNlZCB0byBmaWxsIG91dCB0aGUKKyAgICAvLyAgbWlzc2luZyByZXNlcnZlZCwgZGF0YV9yZWZlcmVuY2VfaW5kZXggYW5kIGNvbnRlbnQgZW5jb2RpbmcgZmllbGRzLiBPbiB0aGUKKyAgICAvLyAgcGFyc2VyIHNpZGUsIHRoZSBleHRyYWN0ZXIgYmVmb3JlIEFQSSAyOSAgd2lsbCByZWFkIG91dCB0aGUgZmlyc3QgbWltZV9mb3JtYXQKKyAgICAvLyAgY29ycmVjdGx5IGFuZCBkcm9wIHRoZSBzZWNvbmQgbWltZV9mb3JtYXQuIFRoZSBleHRyYWN0b3IgZnJvbSBBUEkgMjkgd2lsbAorICAgIC8vICBjaGVjayBpZiB0aGUgcmVzZXJ2ZWQsIGRhdGFfcmVmZXJlbmNlX2luZGV4IGFuZCBjb250ZW50IGVuY29kaW5nIGFyZSBmaWxsZWQKKyAgICAvLyAgd2l0aCDigJxhcHBsaWNhdGlvbuKAnSB0byBkZXRlY3QgaWYgdGhpcyBpcyBhIHN0YW5kYXJkIGNvbXBsaWFudCBtZXRhZGF0YSB0cmFjaworICAgIC8vICBhbmQgcmVhZCBvdXQgdGhlIGRhdGEgYWNjb3JkaW5nbHkuCisgICAgbU93bmVyLT53cml0ZUNTdHJpbmcobWltZSk7CisKICAgICBtT3duZXItPndyaXRlQ1N0cmluZyhtaW1lKTsgIC8vIG1ldGFkYXRhIG1pbWVfZm9ybWF0CiAgICAgbU93bmVyLT5lbmRCb3goKTsgLy8gbWV0dAogfQpAQCAtMzc4NywyMiArMzg4OSw1MiBAQAogICAgIG1Pd25lci0+ZW5kQm94KCk7CiB9CiAKK3N0YXRpYyB2b2lkIGdlbmVyYXRlRXNkc1NpemUoc2l6ZV90IGRhdGFMZW5ndGgsIHNpemVfdCogc2l6ZUdlbmVyYXRlZCwgdWludDhfdCogYnVmZmVyKSB7CisgICAgc2l6ZV90IG9mZnNldCA9IDAsIGN1ciA9IDA7CisgICAgc2l6ZV90IG1vcmUgPSAweDAwOworICAgICpzaXplR2VuZXJhdGVkID0gMDsKKyAgICAvKiBTdGFydCB3aXRoIHRoZSBMU0IoNyBiaXRzKSBvZiBkYXRhTGVuZ3RoIGFuZCBidWlsZCB0aGUgYnl0ZSBzZXF1ZW5jZSB1cHRvIE1TQi4KKyAgICAgKiBDb250aW51YXRpb24gZmxhZyhtb3N0IHNpZ25pZmljYW50IGJpdCkgd2lsbCBiZSBzZXQgb24gdGhlIGZpcnN0IE4tMSBieXRlcy4KKyAgICAgKi8KKyAgICBkbyB7CisgICAgICAgIGJ1ZmZlcltjdXIrK10gPSAoZGF0YUxlbmd0aCAmIDB4N2YpIHwgbW9yZTsKKyAgICAgICAgZGF0YUxlbmd0aCA+Pj0gNzsKKyAgICAgICAgbW9yZSA9IDB4ODA7CisgICAgICAgICsrKCpzaXplR2VuZXJhdGVkKTsKKyAgICB9IHdoaWxlIChkYXRhTGVuZ3RoID4gMHUpOworICAgIC0tY3VyOworICAgIC8vIFJldmVyc2UgdGhlIG5ld2x5IGZvcm1lZCBieXRlIHNlcXVlbmNlLgorICAgIHdoaWxlIChjdXIgPiBvZmZzZXQpIHsKKyAgICAgICAgdWludDhfdCB0bXAgPSBidWZmZXJbY3VyXTsKKyAgICAgICAgYnVmZmVyW2N1ci0tXSA9IGJ1ZmZlcltvZmZzZXRdOworICAgICAgICBidWZmZXJbb2Zmc2V0KytdID0gdG1wOworICAgIH0KK30KKwogdm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlTXA0YUVzZHNCb3goKSB7Ci0gICAgbU93bmVyLT5iZWdpbkJveCgiZXNkcyIpOwogICAgIENIRUNLKG1Db2RlY1NwZWNpZmljRGF0YSk7CiAgICAgQ0hFQ0tfR1QobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSwgMHUpOwogCi0gICAgLy8gTWFrZSBzdXJlIGFsbCBzaXplcyBlbmNvZGUgdG8gYSBzaW5nbGUgYnl0ZS4KLSAgICBDSEVDS19MVChtQ29kZWNTcGVjaWZpY0RhdGFTaXplICsgMjMsIDEyOHUpOworICAgIHVpbnQ4X3Qgc2l6ZUVTREJ1ZmZlcltrRVNEU1NjcmF0Y2hCdWZmZXJTaXplXTsKKyAgICB1aW50OF90IHNpemVEQ0RCdWZmZXJba0VTRFNTY3JhdGNoQnVmZmVyU2l6ZV07CisgICAgdWludDhfdCBzaXplRFNJQnVmZmVyW2tFU0RTU2NyYXRjaEJ1ZmZlclNpemVdOworICAgIHNpemVfdCBzaXplRVNEID0gMDsKKyAgICBzaXplX3Qgc2l6ZURDRCA9IDA7CisgICAgc2l6ZV90IHNpemVEU0kgPSAwOworICAgIGdlbmVyYXRlRXNkc1NpemUobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSwgJnNpemVEU0ksIHNpemVEU0lCdWZmZXIpOworICAgIGdlbmVyYXRlRXNkc1NpemUobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSArIHNpemVEU0kgKyAxNCwgJnNpemVEQ0QsIHNpemVEQ0RCdWZmZXIpOworICAgIGdlbmVyYXRlRXNkc1NpemUobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSArIHNpemVEU0kgKyBzaXplRENEICsgMjEsICZzaXplRVNELCBzaXplRVNEQnVmZmVyKTsKKworICAgIG1Pd25lci0+YmVnaW5Cb3goImVzZHMiKTsKIAogICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgIC8vIHZlcnNpb249MCwgZmxhZ3M9MAogICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDMpOyAgIC8vIEVTX0Rlc2NyVGFnCi0gICAgbU93bmVyLT53cml0ZUludDgoMjMgKyBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPndyaXRlKHNpemVFU0RCdWZmZXIsIHNpemVFU0QpOwogICAgIG1Pd25lci0+d3JpdGVJbnQxNigweDAwMDApOy8vIEVTX0lECiAgICAgbU93bmVyLT53cml0ZUludDgoMHgwMCk7CiAKICAgICBtT3duZXItPndyaXRlSW50OCgweDA0KTsgICAvLyBEZWNvZGVyQ29uZmlnRGVzY3JUYWcKLSAgICBtT3duZXItPndyaXRlSW50OCgxNSArIG1Db2RlY1NwZWNpZmljRGF0YVNpemUpOworICAgIG1Pd25lci0+d3JpdGUoc2l6ZURDREJ1ZmZlciwgc2l6ZURDRCk7CiAgICAgbU93bmVyLT53cml0ZUludDgoMHg0MCk7ICAgLy8gb2JqZWN0VHlwZUluZGljYXRpb24gSVNPL0lFQyAxNDQ5Mi0yCiAgICAgbU93bmVyLT53cml0ZUludDgoMHgxNSk7ICAgLy8gc3RyZWFtVHlwZSBBdWRpb1N0cmVhbQogCkBAIC0zODE3LDcgKzM5NDksNyBAQAogICAgIG1Pd25lci0+d3JpdGVJbnQzMihhdmdCaXRyYXRlKTsKIAogICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDUpOyAgIC8vIERlY29kZXJTcGVjaWZpY0luZm9UYWcKLSAgICBtT3duZXItPndyaXRlSW50OChtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPndyaXRlKHNpemVEU0lCdWZmZXIsIHNpemVEU0kpOwogICAgIG1Pd25lci0+d3JpdGUobUNvZGVjU3BlY2lmaWNEYXRhLCBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKIAogICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhMltdID0gewpAQCAtMzgzNCwyMCArMzk2NiwyNyBAQAogICAgIENIRUNLKG1Db2RlY1NwZWNpZmljRGF0YSk7CiAgICAgQ0hFQ0tfR1QobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSwgMHUpOwogCi0gICAgLy8gTWFrZSBzdXJlIGFsbCBzaXplcyBlbmNvZGUgdG8gYSBzaW5nbGUgYnl0ZS4KLSAgICBDSEVDS19MVCgyMyArIG1Db2RlY1NwZWNpZmljRGF0YVNpemUsIDEyOHUpOworICAgIHVpbnQ4X3Qgc2l6ZUVTREJ1ZmZlcltrRVNEU1NjcmF0Y2hCdWZmZXJTaXplXTsKKyAgICB1aW50OF90IHNpemVEQ0RCdWZmZXJba0VTRFNTY3JhdGNoQnVmZmVyU2l6ZV07CisgICAgdWludDhfdCBzaXplRFNJQnVmZmVyW2tFU0RTU2NyYXRjaEJ1ZmZlclNpemVdOworICAgIHNpemVfdCBzaXplRVNEID0gMDsKKyAgICBzaXplX3Qgc2l6ZURDRCA9IDA7CisgICAgc2l6ZV90IHNpemVEU0kgPSAwOworICAgIGdlbmVyYXRlRXNkc1NpemUobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSwgJnNpemVEU0ksIHNpemVEU0lCdWZmZXIpOworICAgIGdlbmVyYXRlRXNkc1NpemUobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSArIHNpemVEU0kgKyAxNCwgJnNpemVEQ0QsIHNpemVEQ0RCdWZmZXIpOworICAgIGdlbmVyYXRlRXNkc1NpemUobUNvZGVjU3BlY2lmaWNEYXRhU2l6ZSArIHNpemVEU0kgKyBzaXplRENEICsgMjEsICZzaXplRVNELCBzaXplRVNEQnVmZmVyKTsKIAogICAgIG1Pd25lci0+YmVnaW5Cb3goImVzZHMiKTsKIAogICAgIG1Pd25lci0+d3JpdGVJbnQzMigwKTsgICAgLy8gdmVyc2lvbj0wLCBmbGFncz0wCiAKICAgICBtT3duZXItPndyaXRlSW50OCgweDAzKTsgIC8vIEVTX0Rlc2NyVGFnCi0gICAgbU93bmVyLT53cml0ZUludDgoMjMgKyBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPndyaXRlKHNpemVFU0RCdWZmZXIsIHNpemVFU0QpOwogICAgIG1Pd25lci0+d3JpdGVJbnQxNigweDAwMDApOyAgLy8gRVNfSUQKICAgICBtT3duZXItPndyaXRlSW50OCgweDFmKTsKIAogICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MDQpOyAgLy8gRGVjb2RlckNvbmZpZ0Rlc2NyVGFnCi0gICAgbU93bmVyLT53cml0ZUludDgoMTUgKyBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPndyaXRlKHNpemVEQ0RCdWZmZXIsIHNpemVEQ0QpOwogICAgIG1Pd25lci0+d3JpdGVJbnQ4KDB4MjApOyAgLy8gb2JqZWN0VHlwZUluZGljYXRpb24gSVNPL0lFQyAxNDQ5Mi0yCiAgICAgbU93bmVyLT53cml0ZUludDgoMHgxMSk7ICAvLyBzdHJlYW1UeXBlIFZpc3VhbFN0cmVhbQogCkBAIC0zODY1LDcgKzQwMDQsNyBAQAogCiAgICAgbU93bmVyLT53cml0ZUludDgoMHgwNSk7ICAvLyBEZWNvZGVyU3BlY2lmaWNJbmZvVGFnCiAKLSAgICBtT3duZXItPndyaXRlSW50OChtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKKyAgICBtT3duZXItPndyaXRlKHNpemVEU0lCdWZmZXIsIHNpemVEU0kpOwogICAgIG1Pd25lci0+d3JpdGUobUNvZGVjU3BlY2lmaWNEYXRhLCBtQ29kZWNTcGVjaWZpY0RhdGFTaXplKTsKIAogICAgIHN0YXRpYyBjb25zdCB1aW50OF90IGtEYXRhMltdID0gewpAQCAtMzk1OSw2ICs0MDk4LDMzIEBACiAgICAgbU93bmVyLT5lbmRCb3goKTsKIH0KIAordm9pZCBNUEVHNFdyaXRlcjo6VHJhY2s6OndyaXRlRWR0c0JveCgpeworICAgIEFMT0dWKCIlcyA6IGdldFN0YXJ0VGltZU9mZnNldFRpbWVVcyBvZiB0cmFjazolIiBQUklkNjQgIiB1cyIsIGdldFRyYWNrVHlwZSgpLAorICAgICAgICBnZXRTdGFydFRpbWVPZmZzZXRUaW1lVXMoKSk7CisKKyAgICAvLyBQcmVwb25lIHZpZGVvIHBsYXliYWNrLgorICAgIGlmIChtTWluQ3R0c09mZnNldFRpY2tzICE9IG1NYXhDdHRzT2Zmc2V0VGlja3MpIHsKKyAgICAgICAgaW50MzJfdCBtdmhkVGltZVNjYWxlID0gbU93bmVyLT5nZXRUaW1lU2NhbGUoKTsKKyAgICAgICAgdWludDMyX3QgdGtoZER1cmF0aW9uID0gKGdldER1cmF0aW9uVXMoKSAqIG12aGRUaW1lU2NhbGUgKyA1RTUpIC8gMUU2OworICAgICAgICBpbnQ2NF90IG1lZGlhVGltZSA9ICgoa01heEN0dHNPZmZzZXRUaW1lVXMgLSBnZXRNaW5DdHRzT2Zmc2V0VGltZVVzKCkpCisgICAgICAgICAgICAqIG1UaW1lU2NhbGUgKyA1RTUpIC8gMUU2OworICAgICAgICBpZiAodGtoZER1cmF0aW9uID4gMCAmJiBtZWRpYVRpbWUgPiAwKSB7CisgICAgICAgICAgICBhZGRPbmVFbHN0VGFibGVFbnRyeSh0a2hkRHVyYXRpb24sIG1lZGlhVGltZSwgMSwgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobUVsc3RUYWJsZUVudHJpZXMtPmNvdW50KCkgPT0gMCkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbU93bmVyLT5iZWdpbkJveCgiZWR0cyIpOworICAgICAgICBtT3duZXItPmJlZ2luQm94KCJlbHN0Iik7CisgICAgICAgICAgICBtT3duZXItPndyaXRlSW50MzIoMCk7IC8vIHZlcnNpb249MCwgZmxhZ3M9MAorICAgICAgICAgICAgbUVsc3RUYWJsZUVudHJpZXMtPndyaXRlKG1Pd25lcik7CisgICAgICAgIG1Pd25lci0+ZW5kQm94KCk7IC8vIGVsc3Q7CisgICAgbU93bmVyLT5lbmRCb3goKTsgLy8gZWR0cworfQorCiB2b2lkIE1QRUc0V3JpdGVyOjpUcmFjazo6d3JpdGVNZGhkQm94KHVpbnQzMl90IG5vdykgewogICAgIGludDY0X3QgdHJha0R1cmF0aW9uVXMgPSBnZXREdXJhdGlvblVzKCk7CiAgICAgaW50NjRfdCBtZGhkRHVyYXRpb24gPSAodHJha0R1cmF0aW9uVXMgKiBtVGltZVNjYWxlICsgNUU1KSAvIDFFNjsKQEAgLTQwOTUsNyArNDI2MSw5IEBACiAgICAgICAgIHVpbnQzMl90IGR1cmF0aW9uOwogICAgICAgICBDSEVDSyhtU3R0c1RhYmxlRW50cmllcy0+Z2V0KGR1cmF0aW9uLCAxKSk7CiAgICAgICAgIGR1cmF0aW9uID0gaHRvbmwoZHVyYXRpb24pOyAgLy8gQmFjayB0byBob3N0IGJ5dGUgb3JkZXIKLSAgICAgICAgbVN0dHNUYWJsZUVudHJpZXMtPnNldChodG9ubChkdXJhdGlvbiArIGdldFN0YXJ0VGltZU9mZnNldFNjYWxlZFRpbWUoKSksIDEpOworICAgICAgICBpbnQzMl90IHN0YXJ0VGltZU9mZnNldFNjYWxlZCA9ICgoKGdldFN0YXJ0VGltZU9mZnNldFRpbWVVcygpICsKKyAgICAgICAgICAgIG1Pd25lci0+Z2V0U3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzKCkpICogbVRpbWVTY2FsZSkgKyA1MDAwMDBMTCkgLyAxMDAwMDAwTEw7CisgICAgICAgIG1TdHRzVGFibGVFbnRyaWVzLT5zZXQoaHRvbmwoKGludDMyX3QpZHVyYXRpb24gKyBzdGFydFRpbWVPZmZzZXRTY2FsZWQpLCAxKTsKICAgICB9CiAgICAgbVN0dHNUYWJsZUVudHJpZXMtPndyaXRlKG1Pd25lcik7CiAgICAgbU93bmVyLT5lbmRCb3goKTsgIC8vIHN0dHMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ2xvY2suY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5jcHAKaW5kZXggOGJmZjlmNy4uMjQ2MDhhNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDbG9jay5jcHAKQEAgLTExMCw3ICsxMTAsNyBAQAogICAgIGlmIChtQW5jaG9yVGltZVJlYWxVcyAhPSAtMSkgewogICAgICAgICBpbnQ2NF90IG9sZE5vd01lZGlhVXMgPQogICAgICAgICAgICAgbUFuY2hvclRpbWVNZWRpYVVzICsgKG5vd1VzIC0gbUFuY2hvclRpbWVSZWFsVXMpICogKGRvdWJsZSltUGxheWJhY2tSYXRlOwotICAgICAgICBpZiAobm93TWVkaWFVcyA8IG9sZE5vd01lZGlhVXMKKyAgICAgICAgaWYgKG5vd01lZGlhVXMgPCBvbGROb3dNZWRpYVVzICsga0FuY2hvckZsdWN0dWF0aW9uQWxsb3dlZFVzCiAgICAgICAgICAgICAgICAgJiYgbm93TWVkaWFVcyA+IG9sZE5vd01lZGlhVXMgLSBrQW5jaG9yRmx1Y3R1YXRpb25BbGxvd2VkVXMpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQpAQCAtMjgxLDcgKzI4MSw3IEBACiAgICAgICAgICAgICBpdCA9IG1UaW1lcnMuZXJhc2UoaXQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgaWYgKG1QbGF5YmFja1JhdGUgIT0gMC4wCi0gICAgICAgICAgICAgICAgJiYgKGRvdWJsZSlkaWZmTWVkaWFVcyA8IElOVDY0X01BWCAqIChkb3VibGUpbVBsYXliYWNrUmF0ZSkgeworICAgICAgICAgICAgICAgICYmIChkb3VibGUpZGlmZk1lZGlhVXMgPCAoZG91YmxlKUlOVDY0X01BWCAqIChkb3VibGUpbVBsYXliYWNrUmF0ZSkgewogICAgICAgICAgICAgICAgIGludDY0X3QgdGFyZ2V0UmVhbFVzID0gZGlmZk1lZGlhVXMgLyAoZG91YmxlKW1QbGF5YmFja1JhdGU7CiAgICAgICAgICAgICAgICAgaWYgKHRhcmdldFJlYWxVcyA8IG5leHRMYXBzZVJlYWxVcykgewogICAgICAgICAgICAgICAgICAgICBuZXh0TGFwc2VSZWFsVXMgPSB0YXJnZXRSZWFsVXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCmluZGV4IGZhNTljZGIuLjc3ZWFjZTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWMuY3BwCkBAIC0zNSw3ICszNSw3IEBACiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxndWkvQnVmZmVyUXVldWUuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgotI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgpAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQmF0dGVyeUNoZWNrZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9CdWZmZXJQcm9kdWNlcldyYXBwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KQEAgLTU3LDcgKzU4LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9QZXJzaXN0ZW50U3VyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAjaW5jbHVkZSA8dXRpbHMvU2luZ2xldG9uLmg+CiAKQEAgLTE2Niw4ICsxNjYsOSBAQAogICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlc291cmNlTWFuYWdlckNsaWVudCk7CiB9OwogCi1NZWRpYUNvZGVjOjpSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHk6OlJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eShwaWRfdCBwaWQpCi0gICAgICAgIDogbVBpZChwaWQpIHsKK01lZGlhQ29kZWM6OlJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eTo6UmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5KAorICAgICAgICBwaWRfdCBwaWQsIHVpZF90IHVpZCkKKyAgICAgICAgOiBtUGlkKHBpZCksIG1VaWQodWlkKSB7CiAgICAgaWYgKG1QaWQgPT0gTWVkaWFDb2RlYzo6a05vUGlkKSB7CiAgICAgICAgIG1QaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgfQpAQCAtMjA0LDE1ICsyMDUsMjUgQEAKICAgICBpZiAobVNlcnZpY2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShtUGlkLCBjbGllbnRJZCwgY2xpZW50LCByZXNvdXJjZXMpOworICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShtUGlkLCBtVWlkLCBjbGllbnRJZCwgY2xpZW50LCByZXNvdXJjZXMpOwogfQogCi12b2lkIE1lZGlhQ29kZWM6OlJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eTo6cmVtb3ZlUmVzb3VyY2UoaW50NjRfdCBjbGllbnRJZCkgewordm9pZCBNZWRpYUNvZGVjOjpSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHk6OnJlbW92ZVJlc291cmNlKAorICAgICAgICBpbnQ2NF90IGNsaWVudElkLAorICAgICAgICBjb25zdCBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gJnJlc291cmNlcykgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1TZXJ2aWNlID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBtU2VydmljZS0+cmVtb3ZlUmVzb3VyY2UobVBpZCwgY2xpZW50SWQpOworICAgIG1TZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShtUGlkLCBjbGllbnRJZCwgcmVzb3VyY2VzKTsKK30KKwordm9pZCBNZWRpYUNvZGVjOjpSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHk6OnJlbW92ZUNsaWVudChpbnQ2NF90IGNsaWVudElkKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobVNlcnZpY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1TZXJ2aWNlLT5yZW1vdmVDbGllbnQobVBpZCwgY2xpZW50SWQpOwogfQogCiBib29sIE1lZGlhQ29kZWM6OlJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eTo6cmVjbGFpbVJlc291cmNlKApAQCAtNTE2LDEwICs1MjcsNyBAQAogICAgICAgbUZsYWdzKDApLAogICAgICAgbVN0aWNreUVycm9yKE9LKSwKICAgICAgIG1Tb2Z0UmVuZGVyZXIoTlVMTCksCi0gICAgICBtQW5hbHl0aWNzSXRlbShOVUxMKSwKLSAgICAgIG1SZXNvdXJjZU1hbmFnZXJDbGllbnQobmV3IFJlc291cmNlTWFuYWdlckNsaWVudCh0aGlzKSksCi0gICAgICBtUmVzb3VyY2VNYW5hZ2VyU2VydmljZShuZXcgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5KHBpZCkpLAotICAgICAgbUJhdHRlcnlTdGF0Tm90aWZpZWQoZmFsc2UpLAorICAgICAgbU1ldHJpY3NIYW5kbGUoMCksCiAgICAgICBtSXNWaWRlbyhmYWxzZSksCiAgICAgICBtVmlkZW9XaWR0aCgwKSwKICAgICAgIG1WaWRlb0hlaWdodCgwKSwKQEAgLTUzNywyMCArNTQ1LDIyIEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgbVVpZCA9IHVpZDsKICAgICB9CisgICAgbVJlc291cmNlTWFuYWdlckNsaWVudCA9IG5ldyBSZXNvdXJjZU1hbmFnZXJDbGllbnQodGhpcyk7CisgICAgbVJlc291cmNlTWFuYWdlclNlcnZpY2UgPSBuZXcgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5KHBpZCwgbVVpZCk7CiAKLSAgICBpbml0QW5hbHl0aWNzSXRlbSgpOworICAgIGluaXRNZWRpYW1ldHJpY3MoKTsKIH0KIAogTWVkaWFDb2RlYzo6fk1lZGlhQ29kZWMoKSB7CiAgICAgQ0hFQ0tfRVEobVN0YXRlLCBVTklOSVRJQUxJWkVEKTsKLSAgICBtUmVzb3VyY2VNYW5hZ2VyU2VydmljZS0+cmVtb3ZlUmVzb3VyY2UoZ2V0SWQobVJlc291cmNlTWFuYWdlckNsaWVudCkpOworICAgIG1SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLT5yZW1vdmVDbGllbnQoZ2V0SWQobVJlc291cmNlTWFuYWdlckNsaWVudCkpOwogCi0gICAgZmx1c2hBbmFseXRpY3NJdGVtKCk7CisgICAgZmx1c2hNZWRpYW1ldHJpY3MoKTsKIH0KIAotdm9pZCBNZWRpYUNvZGVjOjppbml0QW5hbHl0aWNzSXRlbSgpIHsKLSAgICBpZiAobUFuYWx5dGljc0l0ZW0gPT0gTlVMTCkgewotICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0NvZGVjS2V5TmFtZSk7Cit2b2lkIE1lZGlhQ29kZWM6OmluaXRNZWRpYW1ldHJpY3MoKSB7CisgICAgaWYgKG1NZXRyaWNzSGFuZGxlID09IDApIHsKKyAgICAgICAgbU1ldHJpY3NIYW5kbGUgPSBtZWRpYW1ldHJpY3NfY3JlYXRlKGtDb2RlY0tleU5hbWUpOwogICAgIH0KIAogICAgIG1MYXRlbmN5SGlzdC5zZXR1cChrTGF0ZW5jeUhpc3RCdWNrZXRzLCBrTGF0ZW5jeUhpc3RXaWR0aCwga0xhdGVuY3lIaXN0Rmxvb3IpOwpAQCAtNTY0LDM4ICs1NzQsMzkgQEAKICAgICB9CiB9CiAKLXZvaWQgTWVkaWFDb2RlYzo6dXBkYXRlQW5hbHl0aWNzSXRlbSgpIHsKLSAgICBBTE9HVigiTWVkaWFDb2RlYzo6dXBkYXRlQW5hbHl0aWNzSXRlbSIpOwotICAgIGlmIChtQW5hbHl0aWNzSXRlbSA9PSBOVUxMKSB7Cit2b2lkIE1lZGlhQ29kZWM6OnVwZGF0ZU1lZGlhbWV0cmljcygpIHsKKyAgICBBTE9HVigiTWVkaWFDb2RlYzo6dXBkYXRlTWVkaWFtZXRyaWNzIik7CisgICAgaWYgKG1NZXRyaWNzSGFuZGxlID09IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorCiAgICAgaWYgKG1MYXRlbmN5SGlzdC5nZXRDb3VudCgpICE9IDAgKSB7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrQ29kZWNMYXRlbmN5TWF4LCBtTGF0ZW5jeUhpc3QuZ2V0TWF4KCkpOwotICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa0NvZGVjTGF0ZW5jeU1pbiwgbUxhdGVuY3lIaXN0LmdldE1pbigpKTsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDY0KGtDb2RlY0xhdGVuY3lBdmcsIG1MYXRlbmN5SGlzdC5nZXRBdmcoKSk7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQ2NChrQ29kZWNMYXRlbmN5Q291bnQsIG1MYXRlbmN5SGlzdC5nZXRDb3VudCgpKTsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNMYXRlbmN5TWF4LCBtTGF0ZW5jeUhpc3QuZ2V0TWF4KCkpOworICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50NjQobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0xhdGVuY3lNaW4sIG1MYXRlbmN5SGlzdC5nZXRNaW4oKSk7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQ2NChtTWV0cmljc0hhbmRsZSwga0NvZGVjTGF0ZW5jeUF2ZywgbUxhdGVuY3lIaXN0LmdldEF2ZygpKTsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNMYXRlbmN5Q291bnQsIG1MYXRlbmN5SGlzdC5nZXRDb3VudCgpKTsKIAogICAgICAgICBpZiAoa0VtaXRIaXN0b2dyYW0pIHsKICAgICAgICAgICAgIC8vIGFuZCB0aGUgaGlzdG9ncmFtIGl0c2VsZgogICAgICAgICAgICAgc3RkOjpzdHJpbmcgaGlzdCA9IG1MYXRlbmN5SGlzdC5lbWl0KCk7Ci0gICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQ29kZWNMYXRlbmN5SGlzdCwgaGlzdC5jX3N0cigpKTsKKyAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNMYXRlbmN5SGlzdCwgaGlzdC5jX3N0cigpKTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAobUxhdGVuY3lVbmtub3duID4gMCkgewotICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50NjQoa0NvZGVjTGF0ZW5jeVVua25vd24sIG1MYXRlbmN5VW5rbm93bik7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQ2NChtTWV0cmljc0hhbmRsZSwga0NvZGVjTGF0ZW5jeVVua25vd24sIG1MYXRlbmN5VW5rbm93bik7CiAgICAgfQogCiAjaWYgMAogICAgIC8vIGVuYWJsZSBmb3Igc2hvcnQgdGVybSwgb25seSB3aGlsZSBkZWJ1Z2dpbmcKLSAgICB1cGRhdGVFcGhlbWVyYWxBbmFseXRpY3MobUFuYWx5dGljc0l0ZW0pOworICAgIHVwZGF0ZUVwaGVtZXJhbE1lZGlhbWV0cmljcyhtTWV0cmljc0hhbmRsZSk7CiAjZW5kaWYKIH0KIAotdm9pZCBNZWRpYUNvZGVjOjp1cGRhdGVFcGhlbWVyYWxBbmFseXRpY3MoTWVkaWFBbmFseXRpY3NJdGVtICppdGVtKSB7Ci0gICAgQUxPR0QoIk1lZGlhQ29kZWM6OnVwZGF0ZUVwaGVtZXJhbEFuYWx5dGljcygpIik7Cit2b2lkIE1lZGlhQ29kZWM6OnVwZGF0ZUVwaGVtZXJhbE1lZGlhbWV0cmljcyhtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaXRlbSkgeworICAgIEFMT0dEKCJNZWRpYUNvZGVjOjp1cGRhdGVFcGhlbWVyYWxNZWRpYW1ldHJpY3MoKSIpOwogCi0gICAgaWYgKGl0ZW0gPT0gTlVMTCkgeworICAgIGlmIChpdGVtID09IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNjE4LDI4ICs2MjksMjcgQEAKIAogICAgIC8vIHNwaXQgdGhlIGRhdGEgKGlmIGFueSkgaW50byB0aGUgc3VwcGxpZWQgYW5hbHl0aWNzIHJlY29yZAogICAgIGlmIChyZWNlbnRIaXN0LmdldENvdW50KCkhPSAwICkgewotICAgICAgICBpdGVtLT5zZXRJbnQ2NChrQ29kZWNSZWNlbnRMYXRlbmN5TWF4LCByZWNlbnRIaXN0LmdldE1heCgpKTsKLSAgICAgICAgaXRlbS0+c2V0SW50NjQoa0NvZGVjUmVjZW50TGF0ZW5jeU1pbiwgcmVjZW50SGlzdC5nZXRNaW4oKSk7Ci0gICAgICAgIGl0ZW0tPnNldEludDY0KGtDb2RlY1JlY2VudExhdGVuY3lBdmcsIHJlY2VudEhpc3QuZ2V0QXZnKCkpOwotICAgICAgICBpdGVtLT5zZXRJbnQ2NChrQ29kZWNSZWNlbnRMYXRlbmN5Q291bnQsIHJlY2VudEhpc3QuZ2V0Q291bnQoKSk7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQ2NChpdGVtLCBrQ29kZWNSZWNlbnRMYXRlbmN5TWF4LCByZWNlbnRIaXN0LmdldE1heCgpKTsKKyAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDY0KGl0ZW0sIGtDb2RlY1JlY2VudExhdGVuY3lNaW4sIHJlY2VudEhpc3QuZ2V0TWluKCkpOworICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50NjQoaXRlbSwga0NvZGVjUmVjZW50TGF0ZW5jeUF2ZywgcmVjZW50SGlzdC5nZXRBdmcoKSk7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQ2NChpdGVtLCBrQ29kZWNSZWNlbnRMYXRlbmN5Q291bnQsIHJlY2VudEhpc3QuZ2V0Q291bnQoKSk7CiAKICAgICAgICAgaWYgKGtFbWl0SGlzdG9ncmFtKSB7CiAgICAgICAgICAgICAvLyBhbmQgdGhlIGhpc3RvZ3JhbSBpdHNlbGYKICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGhpc3QgPSByZWNlbnRIaXN0LmVtaXQoKTsKLSAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0NvZGVjUmVjZW50TGF0ZW5jeUhpc3QsIGhpc3QuY19zdHIoKSk7CisgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhpdGVtLCBrQ29kZWNSZWNlbnRMYXRlbmN5SGlzdCwgaGlzdC5jX3N0cigpKTsKICAgICAgICAgfQogICAgIH0KIH0KIAotdm9pZCBNZWRpYUNvZGVjOjpmbHVzaEFuYWx5dGljc0l0ZW0oKSB7Ci0gICAgdXBkYXRlQW5hbHl0aWNzSXRlbSgpOwotICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIGRvbid0IGxvZyBlbXB0eSByZWNvcmRzCi0gICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbS0+Y291bnQoKSA+IDApIHsKLSAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZWxmcmVjb3JkKCk7Cit2b2lkIE1lZGlhQ29kZWM6OmZsdXNoTWVkaWFtZXRyaWNzKCkgeworICAgIHVwZGF0ZU1lZGlhbWV0cmljcygpOworICAgIGlmIChtTWV0cmljc0hhbmRsZSAhPSAwKSB7CisgICAgICAgIGlmIChtZWRpYW1ldHJpY3NfY291bnQobU1ldHJpY3NIYW5kbGUpID4gMCkgeworICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NlbGZSZWNvcmQobU1ldHJpY3NIYW5kbGUpOwogICAgICAgICB9Ci0gICAgICAgIGRlbGV0ZSBtQW5hbHl0aWNzSXRlbTsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBOVUxMOworICAgICAgICBtZWRpYW1ldHJpY3NfZGVsZXRlKG1NZXRyaWNzSGFuZGxlKTsKKyAgICAgICAgbU1ldHJpY3NIYW5kbGUgPSAwOwogICAgIH0KIH0KIApAQCAtNzQyLDYgKzc1MiwxMiBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgaWYgKG1CYXR0ZXJ5Q2hlY2tlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1CYXR0ZXJ5Q2hlY2tlci0+b25Db2RlY0FjdGl2aXR5KFt0aGlzXSAoKSB7CisgICAgICAgICAgICBhZGRSZXNvdXJjZShNZWRpYVJlc291cmNlOjprQmF0dGVyeSwgTWVkaWFSZXNvdXJjZTo6a1ZpZGVvQ29kZWMsIDEpOworICAgICAgICB9KTsKKyAgICB9CisKICAgICBjb25zdCBpbnQ2NF90IG5vd05zID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwogICAgIEJ1ZmZlckZsaWdodFRpbWluZ190IHN0YXJ0ZGF0YSA9IHsgcHJlc2VudGF0aW9uVXMsIG5vd05zIH07CiAKQEAgLTc3Niw2ICs3OTIsMTIgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAorICAgIGlmIChtQmF0dGVyeUNoZWNrZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtQmF0dGVyeUNoZWNrZXItPm9uQ29kZWNBY3Rpdml0eShbdGhpc10gKCkgeworICAgICAgICAgICAgYWRkUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6a0JhdHRlcnksIE1lZGlhUmVzb3VyY2U6OmtWaWRlb0NvZGVjLCAxKTsKKyAgICAgICAgfSk7CisgICAgfQorCiAgICAgQnVmZmVyRmxpZ2h0VGltaW5nX3Qgc3RhcnRkYXRhOwogICAgIGJvb2wgdmFsaWQgPSBmYWxzZTsKICAgICB3aGlsZSAobUJ1ZmZlcnNJbkZsaWdodC5zaXplKCkgPiAwKSB7CkBAIC04NjIsOSArODg0LDkgQEAKIC8vc3RhdGljCiBzcDxDb2RlY0Jhc2U+IE1lZGlhQ29kZWM6OkdldENvZGVjQmFzZShjb25zdCBBU3RyaW5nICZuYW1lLCBjb25zdCBjaGFyICpvd25lcikgewogICAgIGlmIChvd25lcikgewotICAgICAgICBpZiAoc3RybmNtcChvd25lciwgImRlZmF1bHQiLCA4KSA9PSAwKSB7CisgICAgICAgIGlmIChzdHJjbXAob3duZXIsICJkZWZhdWx0IikgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIG5ldyBBQ29kZWM7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcChvd25lciwgImNvZGVjMiIsIDcpID09IDApIHsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJuY21wKG93bmVyLCAiY29kZWMyIiwgNikgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUNDb2RlYygpOwogICAgICAgICB9CiAgICAgfQpAQCAtOTExLDEwICs5MzMsMTAgQEAKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIG1Db2RlY0luZm8gPSBtY2wtPmdldENvZGVjSW5mbyhjb2RlY0lkeCk7Ci0gICAgICAgIFZlY3RvcjxBU3RyaW5nPiBtaW1lczsKLSAgICAgICAgbUNvZGVjSW5mby0+Z2V0U3VwcG9ydGVkTWltZXMoJm1pbWVzKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaW1lcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKG1pbWVzW2ldLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7CisgICAgICAgIFZlY3RvcjxBU3RyaW5nPiBtZWRpYVR5cGVzOworICAgICAgICBtQ29kZWNJbmZvLT5nZXRTdXBwb3J0ZWRNZWRpYVR5cGVzKCZtZWRpYVR5cGVzKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtZWRpYVR5cGVzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobWVkaWFUeXBlc1tpXS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgewogICAgICAgICAgICAgICAgIG1Jc1ZpZGVvID0gdHJ1ZTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTk1OSw5ICs5ODEsMTQgQEAKICAgICAvLyAiLnNlY3VyZSIKICAgICBtc2ctPnNldFN0cmluZygibmFtZSIsIG5hbWUpOwogCi0gICAgaWYgKG1BbmFseXRpY3NJdGVtICE9IE5VTEwpIHsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa0NvZGVjQ29kZWMsIG5hbWUuY19zdHIoKSk7Ci0gICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtDb2RlY01vZGUsIG1Jc1ZpZGVvID8ga0NvZGVjTW9kZVZpZGVvIDoga0NvZGVjTW9kZUF1ZGlvKTsKKyAgICBpZiAobU1ldHJpY3NIYW5kbGUgIT0gMCkgeworICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtTWV0cmljc0hhbmRsZSwga0NvZGVjQ29kZWMsIG5hbWUuY19zdHIoKSk7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSXNWaWRlbyA/IGtDb2RlY01vZGVWaWRlbyA6IGtDb2RlY01vZGVBdWRpbyk7CisgICAgfQorCisgICAgaWYgKG1Jc1ZpZGVvKSB7CisgICAgICAgIG1CYXR0ZXJ5Q2hlY2tlciA9IG5ldyBCYXR0ZXJ5Q2hlY2tlcihuZXcgQU1lc3NhZ2Uoa1doYXRDaGVja0JhdHRlcnlTdGF0cywgdGhpcykpOwogICAgIH0KIAogICAgIHN0YXR1c190IGVycjsKQEAgLTEwMTgsMTYgKzEwNDUsMTcgQEAKICAgICAgICAgdWludDMyX3QgZmxhZ3MpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0Q29uZmlndXJlLCB0aGlzKTsKIAotICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7CisgICAgaWYgKG1NZXRyaWNzSGFuZGxlICE9IDApIHsKICAgICAgICAgaW50MzJfdCBwcm9maWxlID0gMDsKICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJwcm9maWxlIiwgJnByb2ZpbGUpKSB7Ci0gICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjUHJvZmlsZSwgcHJvZmlsZSk7CisgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY1Byb2ZpbGUsIHByb2ZpbGUpOwogICAgICAgICB9CiAgICAgICAgIGludDMyX3QgbGV2ZWwgPSAwOwogICAgICAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoImxldmVsIiwgJmxldmVsKSkgewotICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0xldmVsLCBsZXZlbCk7CisgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0xldmVsLCBsZXZlbCk7CiAgICAgICAgIH0KLSAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0VuY29kZXIsIChmbGFncyAmIENPTkZJR1VSRV9GTEFHX0VOQ09ERSkgPyAxIDogMCk7CisgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjRW5jb2RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmbGFncyAmIENPTkZJR1VSRV9GTEFHX0VOQ09ERSkgPyAxIDogMCk7CiAgICAgfQogCiAgICAgaWYgKG1Jc1ZpZGVvKSB7CkBAIC0xMDM3LDIzICsxMDY1LDI0IEBACiAgICAgICAgICAgICBtUm90YXRpb25EZWdyZWVzID0gMDsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtQW5hbHl0aWNzSXRlbSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjV2lkdGgsIG1WaWRlb1dpZHRoKTsKLSAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNIZWlnaHQsIG1WaWRlb0hlaWdodCk7Ci0gICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjUm90YXRpb24sIG1Sb3RhdGlvbkRlZ3JlZXMpOworICAgICAgICBpZiAobU1ldHJpY3NIYW5kbGUgIT0gMCkgeworICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNXaWR0aCwgbVZpZGVvV2lkdGgpOworICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNIZWlnaHQsIG1WaWRlb0hlaWdodCk7CisgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY1JvdGF0aW9uLCBtUm90YXRpb25EZWdyZWVzKTsKICAgICAgICAgICAgIGludDMyX3QgbWF4V2lkdGggPSAwOwogICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJtYXgtd2lkdGgiLCAmbWF4V2lkdGgpKSB7Ci0gICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY01heFdpZHRoLCBtYXhXaWR0aCk7CisgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNNYXhXaWR0aCwgbWF4V2lkdGgpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgaW50MzJfdCBtYXhIZWlnaHQgPSAwOwogICAgICAgICAgICAgaWYgKGZvcm1hdC0+ZmluZEludDMyKCJtYXgtaGVpZ2h0IiwgJm1heEhlaWdodCkpIHsKLSAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjTWF4SGVpZ2h0LCBtYXhIZWlnaHQpOworICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjTWF4SGVpZ2h0LCBtYXhIZWlnaHQpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAKICAgICAgICAgLy8gUHJldmVudCBwb3NzaWJsZSBpbnRlZ2VyIG92ZXJmbG93IGluIGRvd25zdHJlYW0gY29kZS4KLSAgICAgICAgaWYgKCh1aW50NjRfdCltVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCA+ICh1aW50NjRfdClJTlQzMl9NQVggLyA0KSB7Ci0gICAgICAgICAgICBBTE9HRSgiYnVmZmVyIHNpemUgaXMgdG9vIGJpZywgd2lkdGg9JWQsIGhlaWdodD0lZCIsIG1WaWRlb1dpZHRoLCBtVmlkZW9IZWlnaHQpOworICAgICAgICBpZiAobVZpZGVvV2lkdGggPCAwIHx8IG1WaWRlb0hlaWdodCA8IDAgfHwKKyAgICAgICAgICAgICAgICh1aW50NjRfdCltVmlkZW9XaWR0aCAqIG1WaWRlb0hlaWdodCA+ICh1aW50NjRfdClJTlQzMl9NQVggLyA0KSB7CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBzaXplKHMpLCB3aWR0aD0lZCwgaGVpZ2h0PSVkIiwgbVZpZGVvV2lkdGgsIG1WaWRlb0hlaWdodCk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgfQpAQCAtMTA2OCw4ICsxMDk3LDggQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1zZy0+c2V0UG9pbnRlcigiZGVzY3JhbWJsZXIiLCBkZXNjcmFtYmxlci5nZXQoKSk7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKG1BbmFseXRpY3NJdGVtICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNDcnlwdG8sIDEpOworICAgICAgICBpZiAobU1ldHJpY3NIYW5kbGUgIT0gMCkgeworICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNDcnlwdG8sIDEpOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtRmxhZ3MgJiBrRmxhZ0lzU2VjdXJlKSB7CiAgICAgICAgIEFMT0dXKCJDcnlwdG8gb3IgZGVzY3JhbWJsZXIgc2hvdWxkIGJlIGdpdmVuIGZvciBzZWN1cmUgY29kZWMiKTsKQEAgLTExMTIsNiArMTE0MSw3IEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KKwogICAgIHJldHVybiBlcnI7CiB9CiAKQEAgLTEyMTksNiArMTI0OSwxMyBAQAogICAgICAgICAgICAgZ2V0SWQobVJlc291cmNlTWFuYWdlckNsaWVudCksIG1SZXNvdXJjZU1hbmFnZXJDbGllbnQsIHJlc291cmNlcyk7CiB9CiAKK3ZvaWQgTWVkaWFDb2RlYzo6cmVtb3ZlUmVzb3VyY2UoCisgICAgICAgIE1lZGlhUmVzb3VyY2U6OlR5cGUgdHlwZSwgTWVkaWFSZXNvdXJjZTo6U3ViVHlwZSBzdWJ0eXBlLCB1aW50NjRfdCB2YWx1ZSkgeworICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXM7CisgICAgcmVzb3VyY2VzLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKHR5cGUsIHN1YnR5cGUsIHZhbHVlKSk7CisgICAgbVJlc291cmNlTWFuYWdlclNlcnZpY2UtPnJlbW92ZVJlc291cmNlKGdldElkKG1SZXNvdXJjZU1hbmFnZXJDbGllbnQpLCByZXNvdXJjZXMpOworfQorCiBzdGF0dXNfdCBNZWRpYUNvZGVjOjpzdGFydCgpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U3RhcnQsIHRoaXMpOwogCkBAIC0xNTI2LDIyICsxNTYzLDIyIEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNZWRpYUNvZGVjOjpnZXRNZXRyaWNzKE1lZGlhQW5hbHl0aWNzSXRlbSAqICZyZXBseSkgeworc3RhdHVzX3QgTWVkaWFDb2RlYzo6Z2V0TWV0cmljcyhtZWRpYW1ldHJpY3NfaGFuZGxlX3QgJnJlcGx5KSB7CiAKLSAgICByZXBseSA9IE5VTEw7CisgICAgcmVwbHkgPSAwOwogCiAgICAgLy8gc2hvdWxkbid0IGhhcHBlbiwgYnV0IGJlIHNhZmUKLSAgICBpZiAobUFuYWx5dGljc0l0ZW0gPT0gTlVMTCkgeworICAgIGlmIChtTWV0cmljc0hhbmRsZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgIH0KIAogICAgIC8vIHVwZGF0ZSBhbnkgaW4tZmxpZ2h0IGRhdGEgdGhhdCdzIG5vdCBjYXJyaWVkIHdpdGhpbiB0aGUgcmVjb3JkCi0gICAgdXBkYXRlQW5hbHl0aWNzSXRlbSgpOworICAgIHVwZGF0ZU1lZGlhbWV0cmljcygpOwogCiAgICAgLy8gc2VuZCBpdCBiYWNrIHRvIHRoZSBjYWxsZXIuCi0gICAgcmVwbHkgPSBtQW5hbHl0aWNzSXRlbS0+ZHVwKCk7CisgICAgcmVwbHkgPSBtZWRpYW1ldHJpY3NfZHVwKG1NZXRyaWNzSGFuZGxlKTsKIAotICAgIHVwZGF0ZUVwaGVtZXJhbEFuYWx5dGljcyhyZXBseSk7CisgICAgdXBkYXRlRXBoZW1lcmFsTWVkaWFtZXRyaWNzKHJlcGx5KTsKIAogICAgIHJldHVybiBPSzsKIH0KQEAgLTE2NTgsMTAgKzE2OTUsMTIgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBpbnQzMl90IGNvbG9yRm9ybWF0OwotICAgIGlmIChtU29mdFJlbmRlcmVyICE9IE5VTEwKLSAgICAgICAgICAgICYmIG1PdXRwdXRGb3JtYXQtPmNvbnRhaW5zKCJoZHItc3RhdGljLWluZm8iKQorICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5jb250YWlucygiaGRyLXN0YXRpYy1pbmZvIikKICAgICAgICAgICAgICYmIG1PdXRwdXRGb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0KQotICAgICAgICAgICAgJiYgKGNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNikpIHsKKyAgICAgICAgICAgIC8vIGNoZWNrIGZvcm1hdCBmb3IgT01YIG9ubHksIGZvciBDMiB0aGUgZm9ybWF0IGlzIGFsd2F5cyBvcGFxdWUgc2luY2UgdGhlCisgICAgICAgICAgICAvLyBzb2Z0d2FyZSByZW5kZXJpbmcgZG9lc24ndCBnbyB0aHJvdWdoIGNsaWVudAorICAgICAgICAgICAgJiYgKChtU29mdFJlbmRlcmVyICE9IE5VTEwgJiYgY29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2KQorICAgICAgICAgICAgICAgICAgICB8fCBtT3duZXJOYW1lLmVxdWFsc0lnbm9yZUNhc2UoImNvZGVjMjo6c29mdHdhcmUiKSkpIHsKICAgICAgICAgaW50MzJfdCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20sIHdpZHRoLCBoZWlnaHQ7CiAgICAgICAgIGludDY0X3QgdG90YWxQaXhlbCA9IDA7CiAgICAgICAgIGlmIChtT3V0cHV0Rm9ybWF0LT5maW5kUmVjdCgiY3JvcCIsICZsZWZ0LCAmdG9wLCAmcmlnaHQsICZib3R0b20pKSB7CkBAIC0xNjc4LDYgKzE3MTcsNTkgQEAKICAgICB9CiB9CiAKK0JhdHRlcnlDaGVja2VyOjpCYXR0ZXJ5Q2hlY2tlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgaW50NjRfdCB0aW1lb3V0VXMpCisgICAgOiBtVGltZW91dFVzKHRpbWVvdXRVcykKKyAgICAsIG1MYXN0QWN0aXZpdHlUaW1lVXMoLTFsbCkKKyAgICAsIG1CYXR0ZXJ5U3RhdE5vdGlmaWVkKGZhbHNlKQorICAgICwgbUJhdHRlcnlDaGVja2VyR2VuZXJhdGlvbigwKQorICAgICwgbUlzRXhlY3V0aW5nKGZhbHNlKQorICAgICwgbUJhdHRlcnlDaGVja2VyTXNnKG1zZykge30KKwordm9pZCBCYXR0ZXJ5Q2hlY2tlcjo6b25Db2RlY0FjdGl2aXR5KHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBiYXR0ZXJ5T25DYikgeworICAgIGlmICghaXNFeGVjdXRpbmcoKSkgeworICAgICAgICAvLyBpZ25vcmUgaWYgbm90IGV4ZWN1dGluZworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghbUJhdHRlcnlTdGF0Tm90aWZpZWQpIHsKKyAgICAgICAgYmF0dGVyeU9uQ2IoKTsKKyAgICAgICAgbUJhdHRlcnlTdGF0Tm90aWZpZWQgPSB0cnVlOworICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbUJhdHRlcnlDaGVja2VyTXNnLT5kdXAoKTsKKyAgICAgICAgbXNnLT5zZXRJbnQzMigiZ2VuZXJhdGlvbiIsIG1CYXR0ZXJ5Q2hlY2tlckdlbmVyYXRpb24pOworCisgICAgICAgIC8vIHBvc3QgY2hlY2tlciBhbmQgY2xlYXIgbGFzdCBhY3Rpdml0eSB0aW1lCisgICAgICAgIG1zZy0+cG9zdChtVGltZW91dFVzKTsKKyAgICAgICAgbUxhc3RBY3Rpdml0eVRpbWVVcyA9IC0xbGw7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gdXBkYXRlIGxhc3QgYWN0aXZpdHkgdGltZQorICAgICAgICBtTGFzdEFjdGl2aXR5VGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKKyAgICB9Cit9CisKK3ZvaWQgQmF0dGVyeUNoZWNrZXI6Om9uQ2hlY2tCYXR0ZXJ5VGltZXIoCisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gYmF0dGVyeU9mZkNiKSB7CisgICAgLy8gaWdub3JlIGlmIHRoaXMgY2hlY2tlciBhbHJlYWR5IGV4cGlyZWQgYmVjYXVzZSB0aGUgY2xpZW50IHJlc291cmNlIHdhcyByZW1vdmVkCisgICAgaW50MzJfdCBnZW5lcmF0aW9uOworICAgIGlmICghbXNnLT5maW5kSW50MzIoImdlbmVyYXRpb24iLCAmZ2VuZXJhdGlvbikKKyAgICAgICAgICAgIHx8IGdlbmVyYXRpb24gIT0gbUJhdHRlcnlDaGVja2VyR2VuZXJhdGlvbikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG1MYXN0QWN0aXZpdHlUaW1lVXMgPCAwbGwpIHsKKyAgICAgICAgLy8gdGltZWQgb3V0IGluYWN0aXZlLCBkbyBub3QgcmVwb3N0IGNoZWNrZXIKKyAgICAgICAgYmF0dGVyeU9mZkNiKCk7CisgICAgICAgIG1CYXR0ZXJ5U3RhdE5vdGlmaWVkID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gcmVwb3N0IGNoZWNrZXIgYW5kIGNsZWFyIGxhc3QgYWN0aXZpdHkgdGltZQorICAgICAgICBtc2ctPnBvc3QobVRpbWVvdXRVcyArIG1MYXN0QWN0aXZpdHlUaW1lVXMgLSBBTG9vcGVyOjpHZXROb3dVcygpKTsKKyAgICAgICAgbUxhc3RBY3Rpdml0eVRpbWVVcyA9IC0xbGw7CisgICAgfQorfQorCit2b2lkIEJhdHRlcnlDaGVja2VyOjpvbkNsaWVudFJlbW92ZWQoKSB7CisgICAgbUJhdHRlcnlTdGF0Tm90aWZpZWQgPSBmYWxzZTsKKyAgICBtQmF0dGVyeUNoZWNrZXJHZW5lcmF0aW9uKys7Cit9CisKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIHZvaWQgTWVkaWFDb2RlYzo6Y2FuY2VsUGVuZGluZ0RlcXVldWVPcGVyYXRpb25zKCkgewpAQCAtMTgwMCwxMCArMTg5MiwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBDT05GSUdVUklORzoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uQ29kZSA9PSBBQ1RJT05fQ09ERV9GQVRBTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjRXJyb3IsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtDb2RlY0Vycm9yU3RhdGUsIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQW5hbHl0aWNzSXRlbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0QW5hbHl0aWNzSXRlbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0Vycm9yLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtTWV0cmljc0hhbmRsZSwga0NvZGVjRXJyb3JTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVTdHJpbmcobVN0YXRlKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hNZWRpYW1ldHJpY3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdE1lZGlhbWV0cmljcygpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTdGF0ZShhY3Rpb25Db2RlID09IEFDVElPTl9DT0RFX0ZBVEFMID8KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVOSU5JVElBTElaRUQgOiBJTklUSUFMSVpFRCk7CkBAIC0xODEzLDEwICsxOTA2LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFNUQVJUSU5HOgogICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3Rpb25Db2RlID09IEFDVElPTl9DT0RFX0ZBVEFMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNFcnJvciwgZXJyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldENTdHJpbmcoa0NvZGVjRXJyb3JTdGF0ZSwgc3RhdGVTdHJpbmcobVN0YXRlKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hBbmFseXRpY3NJdGVtKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRBbmFseXRpY3NJdGVtKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjRXJyb3IsIGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRDU3RyaW5nKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNFcnJvclN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaE1lZGlhbWV0cmljcygpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0TWVkaWFtZXRyaWNzKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKGFjdGlvbkNvZGUgPT0gQUNUSU9OX0NPREVfRkFUQUwgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5JTklUSUFMSVpFRCA6IENPTkZJR1VSRUQpOwpAQCAtMTg1NCwxMCArMTk0OCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGTFVTSElORzoKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aW9uQ29kZSA9PSBBQ1RJT05fQ09ERV9GQVRBTCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjRXJyb3IsIGVycik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtDb2RlY0Vycm9yU3RhdGUsIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoQW5hbHl0aWNzSXRlbSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0QW5hbHl0aWNzSXRlbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0SW50MzIobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0Vycm9yLCBlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtTWV0cmljc0hhbmRsZSwga0NvZGVjRXJyb3JTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGVTdHJpbmcobVN0YXRlKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmx1c2hNZWRpYW1ldHJpY3MoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdE1lZGlhbWV0cmljcygpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKFVOSU5JVElBTElaRUQpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xODg3LDEwICsxOTgyLDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldFN0YXRlKElOSVRJQUxJWkVEKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFuYWx5dGljc0l0ZW0tPnNldEludDMyKGtDb2RlY0Vycm9yLCBlcnIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQ29kZWNFcnJvclN0YXRlLCBzdGF0ZVN0cmluZyhtU3RhdGUpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHVzaEFuYWx5dGljc0l0ZW0oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdEFuYWx5dGljc0l0ZW0oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNFcnJvciwgZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldENTdHJpbmcobU1ldHJpY3NIYW5kbGUsIGtDb2RlY0Vycm9yU3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlU3RyaW5nKG1TdGF0ZSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsdXNoTWVkaWFtZXRyaWNzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRNZWRpYW1ldHJpY3MoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoVU5JTklUSUFMSVpFRCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTE5MzMsNiArMjAyOSwxMyBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdENvbXBvbmVudEFsbG9jYXRlZDoKICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gUkVMRUFTSU5HIHx8IG1TdGF0ZSA9PSBVTklOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIGEga1doYXRFcnJvciBvciBrV2hhdFJlbGVhc2UgbWVzc2FnZSBjYW1lIGluIGFuZCByZXBsaWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbG9nIGEgd2FybmluZyBhbmQgaWdub3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImFsbG9jYXRlIGludGVycnVwdGVkIGJ5IGVycm9yIG9yIHJlbGVhc2UsIGN1cnJlbnQgc3RhdGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIENIRUNLX0VRKG1TdGF0ZSwgSU5JVElBTElaSU5HKTsKICAgICAgICAgICAgICAgICAgICAgc2V0U3RhdGUoSU5JVElBTElaRUQpOwogICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgfD0ga0ZsYWdJc0NvbXBvbmVudEFsbG9jYXRlZDsKQEAgLTE5NDAsNyArMjA0Myw4IEBACiAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFN0cmluZygiY29tcG9uZW50TmFtZSIsICZtQ29tcG9uZW50TmFtZSkpOwogCiAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29tcG9uZW50TmFtZS5jX3N0cigpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0Q1N0cmluZyhrQ29kZWNDb2RlYywgbUNvbXBvbmVudE5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtTWV0cmljc0hhbmRsZSwga0NvZGVjQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29tcG9uZW50TmFtZS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm93bmVyID0gbUNvZGVjSW5mby0+Z2V0T3duZXJOYW1lKCk7CkBAIC0xOTUwLDE2ICsyMDU0LDE3IEBACiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRmxhZ3MgJj0gfmtGbGFnVXNlc1NvZnR3YXJlUmVuZGVyZXI7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbU93bmVyTmFtZSA9IG93bmVyOwogCiAgICAgICAgICAgICAgICAgICAgIE1lZGlhUmVzb3VyY2U6OlR5cGUgcmVzb3VyY2VUeXBlOwogICAgICAgICAgICAgICAgICAgICBpZiAobUNvbXBvbmVudE5hbWUuZW5kc1dpdGgoIi5zZWN1cmUiKSkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUZsYWdzIHw9IGtGbGFnSXNTZWN1cmU7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXNvdXJjZVR5cGUgPSBNZWRpYVJlc291cmNlOjprU2VjdXJlQ29kZWM7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQW5hbHl0aWNzSXRlbS0+c2V0SW50MzIoa0NvZGVjU2VjdXJlLCAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhbWV0cmljc19zZXRJbnQzMihtTWV0cmljc0hhbmRsZSwga0NvZGVjU2VjdXJlLCAxKTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdJc1NlY3VyZTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlVHlwZSA9IE1lZGlhUmVzb3VyY2U6OmtOb25TZWN1cmVDb2RlYzsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRJbnQzMihrQ29kZWNTZWN1cmUsIDApOworICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFtZXRyaWNzX3NldEludDMyKG1NZXRyaWNzSGFuZGxlLCBrQ29kZWNTZWN1cmUsIDApOwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc1ZpZGVvKSB7CkBAIC0xOTczLDEwICsyMDc4LDExIEBACiAKICAgICAgICAgICAgICAgICBjYXNlIGtXaGF0Q29tcG9uZW50Q29uZmlndXJlZDoKICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCB8fCBtU3RhdGUgPT0gSU5JVElBTElaRUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgYSBrV2hhdEVycm9yIG1lc3NhZ2UgY2FtZSBpbiBhbmQgcmVwbGllZCB3aXRoIGVycm9yLAorICAgICAgICAgICAgICAgICAgICBpZiAobVN0YXRlID09IFJFTEVBU0lORyB8fCBtU3RhdGUgPT0gVU5JTklUSUFMSVpFRCB8fCBtU3RhdGUgPT0gSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgYSBrV2hhdEVycm9yIG9yIGtXaGF0UmVsZWFzZSBtZXNzYWdlIGNhbWUgaW4gYW5kIHJlcGxpZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBsb2cgYSB3YXJuaW5nIGFuZCBpZ25vcmUuCi0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY29uZmlndXJlIGludGVycnVwdGVkIGJ5IGVycm9yLCBjdXJyZW50IHN0YXRlICVkIiwgbVN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb25maWd1cmUgaW50ZXJydXB0ZWQgYnkgZXJyb3Igb3IgcmVsZWFzZSwgY3VycmVudCBzdGF0ZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdGUpOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgQ0hFQ0tfRVEobVN0YXRlLCBDT05GSUdVUklORyk7CkBAIC0xOTg2LDYgKzIwOTIsMTMgQEAKIAogICAgICAgICAgICAgICAgICAgICBDSEVDSyhtc2ctPmZpbmRNZXNzYWdlKCJpbnB1dC1mb3JtYXQiLCAmbUlucHV0Rm9ybWF0KSk7CiAgICAgICAgICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZE1lc3NhZ2UoIm91dHB1dC1mb3JtYXQiLCAmbU91dHB1dEZvcm1hdCkpOworCisgICAgICAgICAgICAgICAgICAgIC8vIGxpbWl0IHRvIGNvbmZpcm1pbmcgdGhlIG9wdC1pbiBiZWhhdmlvciB0byBtaW5pbWl6ZSBhbnkgYmVoYXZpb3JhbCBjaGFuZ2UKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdXJmYWNlICE9IG51bGxwdHIgJiYgIW1BbGxvd0ZyYW1lRHJvcHBpbmdCeVN1cmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpZ25hbCBmcmFtZSBkcm9wcGluZyBtb2RlIGluIHRoZSBpbnB1dCBmb3JtYXQgYXMgdGhpcyBtYXkgYWxzbyBiZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVhbmluZ2Z1bCBhbmQgY29uZnVzaW5nIGZvciBhbiBlbmNvZGVyIGluIGEgdHJhbnNjb2RlciBzY2VuYXJpbworICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0Rm9ybWF0LT5zZXRJbnQzMigiYWxsb3ctZnJhbWUtZHJvcCIsIG1BbGxvd0ZyYW1lRHJvcHBpbmdCeVN1cmZhY2UpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJbJXNdIGNvbmZpZ3VyZWQgYXMgaW5wdXQgZm9ybWF0OiAlcywgb3V0cHV0IGZvcm1hdDogJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21wb25lbnROYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0Rm9ybWF0LT5kZWJ1Z1N0cmluZyg0KS5jX3N0cigpLApAQCAtMTk5OSwxNCArMjExMiwxNSBAQAogICAgICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKIAogICAgICAgICAgICAgICAgICAgICAvLyBhdWdtZW50IG91ciBtZWRpYSBtZXRyaWNzIGluZm8sIG5vdyB0aGF0IHdlIGtub3cgbW9yZSB0aGluZ3MKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1BbmFseXRpY3NJdGVtICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1NZXRyaWNzSGFuZGxlICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobUNvbmZpZ3VyZU1zZyAhPSBOVUxMICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbmZpZ3VyZU1zZy0+ZmluZE1lc3NhZ2UoImZvcm1hdCIsICZmb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcm1hdCBpbmNsdWRlczogbWltZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBU3RyaW5nIG1pbWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQtPmZpbmRTdHJpbmcoIm1pbWUiLCAmbWltZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRDU3RyaW5nKGtDb2RlY01pbWUsIG1pbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYW1ldHJpY3Nfc2V0Q1N0cmluZyhtTWV0cmljc0hhbmRsZSwga0NvZGVjTWltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pbWUuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTIwNjcsNiArMjE4MSwxMyBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBrV2hhdFN0YXJ0Q29tcGxldGVkOgogICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBSRUxFQVNJTkcgfHwgbVN0YXRlID09IFVOSU5JVElBTElaRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgYSBrV2hhdFJlbGVhc2UgbWVzc2FnZSBjYW1lIGluIGFuZCByZXBsaWVkLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgbG9nIGEgd2FybmluZyBhbmQgaWdub3JlLgorICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInN0YXJ0IGludGVycnVwdGVkIGJ5IHJlbGVhc2UsIGN1cnJlbnQgc3RhdGUgJWQiLCBtU3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICBDSEVDS19FUShtU3RhdGUsIFNUQVJUSU5HKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1Jc1ZpZGVvKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBhZGRSZXNvdXJjZSgKQEAgLTIxOTcsNyArMjMxOCwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gaGRyMTBQbHVzSW5mbzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobU91dHB1dEZvcm1hdC0+ZmluZEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwgJmhkcjEwUGx1c0luZm8pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBoZHIxMFBsdXNJbmZvICE9IG51bGxwdHIgJiYgaGRyMTBQbHVzSW5mby0+c2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2hkcjEwX3BsdXNfbWV0YWRhdGEobVN1cmZhY2UuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+c2l6ZSgpLCBoZHIxMFBsdXNJbmZvLT5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGhJZ25vcmVDYXNlKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VyZmFjZS0+c2V0RGVxdWV1ZVRpbWVvdXQoLTEpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU29mdFJlbmRlcmVyID0gbmV3IFNvZnR3YXJlUmVuZGVyZXIobVN1cmZhY2UsIG1Sb3RhdGlvbkRlZ3JlZXMpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTIyODMsNyArMjQxMiwxMiBAQAogCiAgICAgICAgICAgICAgICAgICAgIG1GbGFncyAmPSB+a0ZsYWdJc0NvbXBvbmVudEFsbG9jYXRlZDsKIAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VNYW5hZ2VyU2VydmljZS0+cmVtb3ZlUmVzb3VyY2UoZ2V0SWQobVJlc291cmNlTWFuYWdlckNsaWVudCkpOworICAgICAgICAgICAgICAgICAgICAvLyBvZmYgc2luY2Ugd2UncmUgcmVtb3ZpbmcgYWxsIHJlc291cmNlcyBpbmNsdWRpbmcgdGhlIGJhdHRlcnkgb24KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1CYXR0ZXJ5Q2hlY2tlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtQmF0dGVyeUNoZWNrZXItPm9uQ2xpZW50UmVtb3ZlZCgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlTWFuYWdlclNlcnZpY2UtPnJlbW92ZUNsaWVudChnZXRJZChtUmVzb3VyY2VNYW5hZ2VyQ2xpZW50KSk7CiAKICAgICAgICAgICAgICAgICAgICAgKG5ldyBBTWVzc2FnZSktPnBvc3RSZXBseShtUmVwbHlJRCk7CiAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwpAQCAtMjQwMyw2ICsyNTM3LDExIEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIGlmIChvYmogIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmICghZm9ybWF0LT5maW5kSW50MzIoImFsbG93LWZyYW1lLWRyb3AiLCAmbUFsbG93RnJhbWVEcm9wcGluZ0J5U3VyZmFjZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb3cgZnJhbWUgZHJvcHBpbmcgYnkgc3VyZmFjZSBieSBkZWZhdWx0CisgICAgICAgICAgICAgICAgICAgIG1BbGxvd0ZyYW1lRHJvcHBpbmdCeVN1cmZhY2UgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIGZvcm1hdC0+c2V0T2JqZWN0KCJuYXRpdmUtd2luZG93Iiwgb2JqKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBoYW5kbGVTZXRTdXJmYWNlKHN0YXRpY19jYXN0PFN1cmZhY2UgKj4ob2JqLmdldCgpKSk7CiAgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMjQxMCw2ICsyNTQ5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyB3ZSBhcmUgbm90IHVzaW5nIHN1cmZhY2Ugc28gdGhpcyB2YXJpYWJsZSBpcyBub3QgdXNlZCwgYnV0IGluaXRpYWxpemUgc2Vuc2libHkgYW55d2F5CisgICAgICAgICAgICAgICAgbUFsbG93RnJhbWVEcm9wcGluZ0J5U3VyZmFjZSA9IGZhbHNlOworCiAgICAgICAgICAgICAgICAgaGFuZGxlU2V0U3VyZmFjZShOVUxMKTsKICAgICAgICAgICAgIH0KIApAQCAtMjQ4NSw2ICsyNjI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgKG1GbGFncyAmIGtGbGFnUHVzaEJsYW5rQnVmZmVyc09uU2h1dGRvd24pKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaEJsYW5rQnVmZmVyc1RvTmF0aXZlV2luZG93KG1TdXJmYWNlLmdldCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2UtPnNldERlcXVldWVUaW1lb3V0KC0xKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Tb2Z0UmVuZGVyZXIgPSBuZXcgU29mdHdhcmVSZW5kZXJlcihzdXJmYWNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGNoZWNrIGlmIHRoaXMgd2FzIHN1Y2Nlc3NmdWwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTI2MjUsMTEgKzI3NjgsMTIgQEAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gSWYgd2UncmUgZmx1c2hpbmcsIG9yIHdlJ3JlIHN0b3BwaW5nIGJ1dCByZWNlaXZlZCBhIHJlbGVhc2UKLSAgICAgICAgICAgIC8vIHJlcXVlc3QsIHBvc3QgdGhlIHJlcGx5IGZvciB0aGUgcGVuZGluZyBjYWxsIGZpcnN0LCBhbmQgY29uc2lkZXIKLSAgICAgICAgICAgIC8vIGl0IGRvbmUuIFRoZSByZXBseSB0b2tlbiB3aWxsIGJlIHJlcGxhY2VkIGFmdGVyIHRoaXMsIGFuZCB3ZSdsbAotICAgICAgICAgICAgLy8gbm8gbG9uZ2VyIGJlIGFibGUgdG8gcmVwbHkuCi0gICAgICAgICAgICBpZiAobVN0YXRlID09IEZMVVNISU5HIHx8IG1TdGF0ZSA9PSBTVE9QUElORykgeworICAgICAgICAgICAgLy8gSWYgd2UncmUgZmx1c2hpbmcsIHN0b3BwaW5nLCBjb25maWd1cmluZyBvciBzdGFydGluZyAgYnV0CisgICAgICAgICAgICAvLyByZWNlaXZlZCBhIHJlbGVhc2UgcmVxdWVzdCwgcG9zdCB0aGUgcmVwbHkgZm9yIHRoZSBwZW5kaW5nIGNhbGwKKyAgICAgICAgICAgIC8vIGZpcnN0LCBhbmQgY29uc2lkZXIgaXQgZG9uZS4gVGhlIHJlcGx5IHRva2VuIHdpbGwgYmUgcmVwbGFjZWQKKyAgICAgICAgICAgIC8vIGFmdGVyIHRoaXMsIGFuZCB3ZSdsbCBubyBsb25nZXIgYmUgYWJsZSB0byByZXBseS4KKyAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gRkxVU0hJTkcgfHwgbVN0YXRlID09IFNUT1BQSU5HCisgICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0ZSA9PSBDT05GSUdVUklORyB8fCBtU3RhdGUgPT0gU1RBUlRJTkcpIHsKICAgICAgICAgICAgICAgICAobmV3IEFNZXNzYWdlKS0+cG9zdFJlcGx5KG1SZXBseUlEKTsKICAgICAgICAgICAgIH0KIApAQCAtMjY3NCw3ICsyODE4LDcgQEAKICAgICAgICAgICAgIENIRUNLKG1zZy0+c2VuZGVyQXdhaXRzUmVzcG9uc2UoJnJlcGx5SUQpKTsKIAogICAgICAgICAgICAgaWYgKG1GbGFncyAmIGtGbGFnSXNBc3luYykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJkZXF1ZXVlT3V0cHV0QnVmZmVyIGNhbid0IGJlIHVzZWQgaW4gYXN5bmMgbW9kZSIpOworICAgICAgICAgICAgICAgIEFMT0dFKCJkZXF1ZXVlSW5wdXRCdWZmZXIgY2FuJ3QgYmUgdXNlZCBpbiBhc3luYyBtb2RlIik7CiAgICAgICAgICAgICAgICAgUG9zdFJlcGx5V2l0aEVycm9yKHJlcGx5SUQsIElOVkFMSURfT1BFUkFUSU9OKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTI5ODQsNiArMzEyOCwxNiBAQAogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtXaGF0Q2hlY2tCYXR0ZXJ5U3RhdHM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtQmF0dGVyeUNoZWNrZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1CYXR0ZXJ5Q2hlY2tlci0+b25DaGVja0JhdHRlcnlUaW1lcihtc2csIFt0aGlzXSAoKSB7CisgICAgICAgICAgICAgICAgICAgIHJlbW92ZVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OmtCYXR0ZXJ5LCBNZWRpYVJlc291cmNlOjprVmlkZW9Db2RlYywgMSk7CisgICAgICAgICAgICAgICAgfSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBUUkVTUEFTUygpOwogICAgIH0KQEAgLTMwODAsOSArMzIzNCwxMSBAQAogCiAgICAgbVN0YXRlID0gbmV3U3RhdGU7CiAKLSAgICBjYW5jZWxQZW5kaW5nRGVxdWV1ZU9wZXJhdGlvbnMoKTsKKyAgICBpZiAobUJhdHRlcnlDaGVja2VyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUJhdHRlcnlDaGVja2VyLT5zZXRFeGVjdXRpbmcoaXNFeGVjdXRpbmcoKSk7CisgICAgfQogCi0gICAgdXBkYXRlQmF0dGVyeVN0YXQoKTsKKyAgICBjYW5jZWxQZW5kaW5nRGVxdWV1ZU9wZXJhdGlvbnMoKTsKIH0KIAogdm9pZCBNZWRpYUNvZGVjOjpyZXR1cm5CdWZmZXJzVG9Db2RlYyhib29sIGlzUmVjbGFpbSkgewpAQCAtMzQwMCw2ICszNTU2LDEwIEBACiAKICAgICAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICAgICAgQUxPR0UoIm5hdGl2ZVdpbmRvd0Nvbm5lY3QgcmV0dXJuZWQgYW4gZXJyb3I6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwgZXJyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICghbUFsbG93RnJhbWVEcm9wcGluZ0J5U3VyZmFjZSkgeworICAgICAgICAgICAgICAgIGRpc2FibGVMZWdhY3lCdWZmZXJEcm9wUG9zdFEoc3VyZmFjZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgLy8gZG8gbm90IHJldHVybiBBTFJFQURZX0VYSVNUUyB1bmxlc3Mgc3VyZmFjZXMgYXJlIHRoZSBzYW1lCkBAIC0zNTgyLDIwICszNzQyLDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgTWVkaWFDb2RlYzo6dXBkYXRlQmF0dGVyeVN0YXQoKSB7Ci0gICAgaWYgKCFtSXNWaWRlbykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKG1TdGF0ZSA9PSBDT05GSUdVUkVEICYmICFtQmF0dGVyeVN0YXROb3RpZmllZCkgewotICAgICAgICBCYXR0ZXJ5Tm90aWZpZXI6OmdldEluc3RhbmNlKCkubm90ZVN0YXJ0VmlkZW8obVVpZCk7Ci0gICAgICAgIG1CYXR0ZXJ5U3RhdE5vdGlmaWVkID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBVTklOSVRJQUxJWkVEICYmIG1CYXR0ZXJ5U3RhdE5vdGlmaWVkKSB7Ci0gICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlU3RvcFZpZGVvKG1VaWQpOwotICAgICAgICBtQmF0dGVyeVN0YXROb3RpZmllZCA9IGZhbHNlOwotICAgIH0KLX0KLQogc3RkOjpzdHJpbmcgTWVkaWFDb2RlYzo6c3RhdGVTdHJpbmcoU3RhdGUgc3RhdGUpIHsKICAgICBjb25zdCBjaGFyICpydmFsID0gTlVMTDsKICAgICBjaGFyIHJhd2J1ZmZlclsxNl07IC8vIHJvb20gZm9yICIlZCIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmNwcAppbmRleCBlYWZmMjgzLi5hMjY3ZjdlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuY3BwCkBAIC03Nyw3ICs3Nyw4IEBACiAgICAgcmV0dXJuIHByb2ZpbGluZ05lZWRlZDsKIH0KIAotT214SW5mb0J1aWxkZXIgc09teEluZm9CdWlsZGVyOworT214SW5mb0J1aWxkZXIgc09teEluZm9CdWlsZGVye3RydWUgLyogYWxsb3dTdXJmYWNlRW5jb2RlcnMgKi99OworT214SW5mb0J1aWxkZXIgc09teE5vU3VyZmFjZUVuY29kZXJJbmZvQnVpbGRlcntmYWxzZSAvKiBhbGxvd1N1cmZhY2VFbmNvZGVycyAqL307CiAKIE11dGV4IHNDb2RlYzJJbmZvQnVpbGRlck11dGV4Owogc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNMaXN0QnVpbGRlckJhc2U+IHNDb2RlYzJJbmZvQnVpbGRlcjsKQEAgLTk4LDcgKzk5LDExIEBACiAgICAgc3A8UGVyc2lzdGVudFN1cmZhY2U+IHN1cmZhY2VUZXN0ID0KICAgICAgICAgU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OkdldENDb2RlY0luc3RhbmNlKCktPmNyZWF0ZUlucHV0U3VyZmFjZSgpOwogICAgIGlmIChzdXJmYWNlVGVzdCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dEKCJBbGxvd2luZyBhbGwgT01YIGNvZGVjcyIpOwogICAgICAgICBidWlsZGVycy5wdXNoX2JhY2soJnNPbXhJbmZvQnVpbGRlcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0QoIkFsbG93aW5nIG9ubHkgbm9uLXN1cmZhY2UtZW5jb2RlciBPTVggY29kZWNzIik7CisgICAgICAgIGJ1aWxkZXJzLnB1c2hfYmFjaygmc09teE5vU3VyZmFjZUVuY29kZXJJbmZvQnVpbGRlcik7CiAgICAgfQogICAgIGJ1aWxkZXJzLnB1c2hfYmFjayhHZXRDb2RlYzJJbmZvQnVpbGRlcigpKTsKICAgICByZXR1cm4gYnVpbGRlcnM7CkBAIC0xNjUsNiArMTcwLDcgQEAKIHNwPElNZWRpYUNvZGVjTGlzdD4gTWVkaWFDb2RlY0xpc3Q6OnNSZW1vdGVMaXN0OwogCiBzcDxNZWRpYUNvZGVjTGlzdDo6QmluZGVyRGVhdGhPYnNlcnZlcj4gTWVkaWFDb2RlY0xpc3Q6OnNCaW5kZXJEZWF0aE9ic2VydmVyOworc3A8SUJpbmRlcj4gTWVkaWFDb2RlY0xpc3Q6OnNNZWRpYVBsYXllcjsgIC8vIGtlcHQgc2luY2UgbGlua2VkIHRvIGRlYXRoCiAKIHZvaWQgTWVkaWFDb2RlY0xpc3Q6OkJpbmRlckRlYXRoT2JzZXJ2ZXI6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJndobyBfX3VudXNlZCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChzUmVtb3RlSW5pdE11dGV4KTsKQEAgLTE3NiwxNSArMTgyLDE0IEBACiBzcDxJTWVkaWFDb2RlY0xpc3Q+IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2woc1JlbW90ZUluaXRNdXRleCk7CiAgICAgaWYgKHNSZW1vdGVMaXN0ID09IG51bGxwdHIpIHsKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0KLSAgICAgICAgICAgIGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5wbGF5ZXIiKSk7CisgICAgICAgIHNNZWRpYVBsYXllciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5wbGF5ZXIiKSk7CiAgICAgICAgIHNwPElNZWRpYVBsYXllclNlcnZpY2U+IHNlcnZpY2UgPQotICAgICAgICAgICAgaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhUGxheWVyU2VydmljZT4oYmluZGVyKTsKKyAgICAgICAgICAgIGludGVyZmFjZV9jYXN0PElNZWRpYVBsYXllclNlcnZpY2U+KHNNZWRpYVBsYXllcik7CiAgICAgICAgIGlmIChzZXJ2aWNlLmdldCgpICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIHNSZW1vdGVMaXN0ID0gc2VydmljZS0+Z2V0Q29kZWNMaXN0KCk7CiAgICAgICAgICAgICBpZiAoc1JlbW90ZUxpc3QgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIHNCaW5kZXJEZWF0aE9ic2VydmVyID0gbmV3IEJpbmRlckRlYXRoT2JzZXJ2ZXIoKTsKLSAgICAgICAgICAgICAgICBiaW5kZXItPmxpbmtUb0RlYXRoKHNCaW5kZXJEZWF0aE9ic2VydmVyLmdldCgpKTsKKyAgICAgICAgICAgICAgICBzTWVkaWFQbGF5ZXItPmxpbmtUb0RlYXRoKHNCaW5kZXJEZWF0aE9ic2VydmVyLmdldCgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoc1JlbW90ZUxpc3QgPT0gbnVsbHB0cikgewpAQCAtMjE1LDE0ICsyMjAsMjUgQEAKICAgICAgICAgICAgIG1Db2RlY0luZm9zLmJlZ2luKCksCiAgICAgICAgICAgICBtQ29kZWNJbmZvcy5lbmQoKSwKICAgICAgICAgICAgIFtdKGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmaW5mbzEsIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmaW5mbzIpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5mbzIgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbmZvMSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpbmZvMS0+cmFuaygpIDwgaW5mbzItPnJhbmsoKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gbnVsbCBpcyBsb3dlc3QKKyAgICAgICAgICAgICAgICByZXR1cm4gaW5mbzEgPT0gbnVsbHB0cgorICAgICAgICAgICAgICAgICAgICAgICAgfHwgKGluZm8yICE9IG51bGxwdHIgJiYgaW5mbzEtPmdldFJhbmsoKSA8IGluZm8yLT5nZXRSYW5rKCkpOwogICAgICAgICAgICAgfSk7CisKKyAgICAvLyByZW1vdmUgZHVwbGljYXRlIGVudHJpZXMKKyAgICBib29sIGRlZHVwZSA9IHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5zdGFnZWZyaWdodC5kZWR1cGUtY29kZWNzIiwgdHJ1ZSk7CisgICAgaWYgKGRlZHVwZSkgeworICAgICAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gY29kZWNzU2VlbjsKKyAgICAgICAgZm9yIChhdXRvIGl0ID0gbUNvZGVjSW5mb3MuYmVnaW4oKTsgaXQgIT0gbUNvZGVjSW5mb3MuZW5kKCk7ICkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgY29kZWNOYW1lID0gKCppdCktPmdldENvZGVjTmFtZSgpOworICAgICAgICAgICAgaWYgKGNvZGVjc1NlZW4uY291bnQoY29kZWNOYW1lKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgY29kZWNzU2Vlbi5lbXBsYWNlKGNvZGVjTmFtZSk7CisgICAgICAgICAgICAgICAgaXQrKzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXQgPSBtQ29kZWNJbmZvcy5lcmFzZShpdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CiB9CiAKIE1lZGlhQ29kZWNMaXN0Ojp+TWVkaWFDb2RlY0xpc3QoKSB7CkBAIC0yNzIsMTAgKzI4OCwxNyBAQAogfQogCiBzc2l6ZV90IE1lZGlhQ29kZWNMaXN0OjpmaW5kQ29kZWNCeU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QgeworICAgIFZlY3RvcjxBU3RyaW5nPiBhbGlhc2VzOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNvZGVjSW5mb3Muc2l6ZSgpOyArK2kpIHsKICAgICAgICAgaWYgKHN0cmNtcChtQ29kZWNJbmZvc1tpXS0+Z2V0Q29kZWNOYW1lKCksIG5hbWUpID09IDApIHsKICAgICAgICAgICAgIHJldHVybiBpOwogICAgICAgICB9CisgICAgICAgIG1Db2RlY0luZm9zW2ldLT5nZXRBbGlhc2VzKCZhbGlhc2VzKTsKKyAgICAgICAgZm9yIChjb25zdCBBU3RyaW5nICZhbGlhcyA6IGFsaWFzZXMpIHsKKyAgICAgICAgICAgIGlmIChhbGlhcyA9PSBuYW1lKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gLUVOT0VOVDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0T3ZlcnJpZGVzLmNwcAppbmRleCBjYWM1M2Y0Li5iMDI3YTk3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdE92ZXJyaWRlcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RPdmVycmlkZXMuY3BwCkBAIC0yMiw3ICsyMiw3IEBACiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUNvZGVjSW5mby5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUmVzb3VyY2VQb2xpY3kuaD4KQEAgLTIyOCwxOCArMjI4LDE4IEBACiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCi0gICAgICAgIFZlY3RvcjxBU3RyaW5nPiBtaW1lczsKLSAgICAgICAgaW5mby0+Z2V0U3VwcG9ydGVkTWltZXMoJm1pbWVzKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtaW1lcy5zaXplKCk7ICsraSkgeworICAgICAgICBWZWN0b3I8QVN0cmluZz4gbWVkaWFUeXBlczsKKyAgICAgICAgaW5mby0+Z2V0U3VwcG9ydGVkTWVkaWFUeXBlcygmbWVkaWFUeXBlcyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWVkaWFUeXBlcy5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gJmNhcHMgPQotICAgICAgICAgICAgICAgICAgICBpbmZvLT5nZXRDYXBhYmlsaXRpZXNGb3IobWltZXNbaV0uY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmdldENhcGFiaWxpdGllc0ZvcihtZWRpYVR5cGVzW2ldLmNfc3RyKCkpOwogICAgICAgICAgICAgaWYgKCFmb3JjZVRvTWVhc3VyZSAmJgogICAgICAgICAgICAgICAgIChjYXBzLT5nZXREZXRhaWxzKCktPmNvbnRhaW5zKCJtYXgtc3VwcG9ydGVkLWluc3RhbmNlcyIpIHx8CiAgICAgICAgICAgICAgICAgIGNhcHMtPmdldERldGFpbHMoKS0+Y29udGFpbnMoIm1heC1jb25jdXJyZW50LWluc3RhbmNlcyIpKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBzaXplX3QgbWF4ID0gZG9Qcm9maWxlQ29kZWNzKGluZm8tPmlzRW5jb2RlcigpLCBuYW1lLCBtaW1lc1tpXSwgY2Fwcyk7CisgICAgICAgICAgICBzaXplX3QgbWF4ID0gZG9Qcm9maWxlQ29kZWNzKGluZm8tPmlzRW5jb2RlcigpLCBuYW1lLCBtZWRpYVR5cGVzW2ldLCBjYXBzKTsKICAgICAgICAgICAgIGlmIChtYXggPiAwKSB7CiAgICAgICAgICAgICAgICAgQ29kZWNTZXR0aW5ncyBzZXR0aW5nczsKICAgICAgICAgICAgICAgICBjaGFyIG1heFN0clszMl07CkBAIC0yNDgsNyArMjQ4LDcgQEAKIAogICAgICAgICAgICAgICAgIEFTdHJpbmcga2V5ID0gbmFtZTsKICAgICAgICAgICAgICAgICBrZXkuYXBwZW5kKCIgIik7Ci0gICAgICAgICAgICAgICAga2V5LmFwcGVuZChtaW1lc1tpXSk7CisgICAgICAgICAgICAgICAga2V5LmFwcGVuZChtZWRpYVR5cGVzW2ldKTsKIAogICAgICAgICAgICAgICAgIGlmIChpbmZvLT5pc0VuY29kZXIoKSkgewogICAgICAgICAgICAgICAgICAgICBlbmNvZGVyX3Jlc3VsdHMtPmFkZChrZXksIHNldHRpbmdzKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmNwcAppbmRleCBiMzJlNDcwLi5jNGZiMTk5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuY3BwCkBAIC0zNyw2ICszNywxNiBAQAogICAgICAgICAgICAgbmV3IE1lZGlhQ29kZWNJbmZvV3JpdGVyKGluZm8uZ2V0KCkpKTsKIH0KIAorc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPgorICAgICAgICBNZWRpYUNvZGVjTGlzdFdyaXRlcjo6ZmluZE1lZGlhQ29kZWNJbmZvKGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBmb3IgKGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiAmaW5mbyA6IG1Db2RlY0luZm9zKSB7CisgICAgICAgIGlmICghc3RyY21wKGluZm8tPmdldENvZGVjTmFtZSgpLCBuYW1lKSkgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4obmV3IE1lZGlhQ29kZWNJbmZvV3JpdGVyKGluZm8uZ2V0KCkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKK30KKwogdm9pZCBNZWRpYUNvZGVjTGlzdFdyaXRlcjo6d3JpdGVHbG9iYWxTZXR0aW5ncygKICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZnbG9iYWxTZXR0aW5ncykgY29uc3QgewogICAgIGZvciAoY29uc3Qgc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz4gJmt2IDogbUdsb2JhbFNldHRpbmdzKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwCmluZGV4IDVkMjI5MWYuLjcyNDNiODIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhQ29kZWNTb3VyY2UuY3BwCkBAIC0yMiw3ICsyMiw3IEBACiAKICNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lDcnlwdG8uaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYUJ1ZmZlckhvbGRlci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgpAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjQ29uc3RhbnRzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KQEAgLTM2Miw3ICszNjMsNyBAQAogCiBzdGF0dXNfdCBNZWRpYUNvZGVjU291cmNlOjpzZXRJbnB1dEJ1ZmZlclRpbWVPZmZzZXQoaW50NjRfdCB0aW1lT2Zmc2V0VXMpIHsKICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKGtXaGF0U2V0SW5wdXRCdWZmZXJUaW1lT2Zmc2V0LCBtUmVmbGVjdG9yKTsKLSAgICBtc2ctPnNldEludDY0KCJ0aW1lLW9mZnNldC11cyIsIHRpbWVPZmZzZXRVcyk7CisgICAgbXNnLT5zZXRJbnQ2NChQQVJBTUVURVJfS0VZX09GRlNFVF9USU1FLCB0aW1lT2Zmc2V0VXMpOwogICAgIHJldHVybiBwb3N0U3luY2hyb25vdXNseUFuZFJldHVybkVycm9yKG1zZyk7CiB9CiAKQEAgLTQ5MCw3ICs0OTEsNyBAQAogICAgIG1Db2RlY0xvb3Blci0+c3RhcnQoKTsKIAogICAgIGlmIChtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSB7Ci0gICAgICAgIG1PdXRwdXRGb3JtYXQtPnNldEludDMyKCJjcmVhdGUtaW5wdXQtYnVmZmVycy1zdXNwZW5kZWQiLCAxKTsKKyAgICAgICAgbU91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX0NSRUFURV9JTlBVVF9TVVJGQUNFX1NVU1BFTkRFRCwgMSk7CiAgICAgfQogCiAgICAgQVN0cmluZyBvdXRwdXRNSU1FOwpAQCAtNjc3LDkgKzY3OCw5IEBACiAgICAgQ0hFQ0sobUZsYWdzICYgRkxBR19VU0VfU1VSRkFDRV9JTlBVVCk7CiAgICAgaWYgKG1FbmNvZGVyICE9IE5VTEwpIHsKICAgICAgICAgc3A8QU1lc3NhZ2U+IHBhcmFtcyA9IG5ldyBBTWVzc2FnZTsKLSAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigiZHJvcC1pbnB1dC1mcmFtZXMiLCBmYWxzZSk7CisgICAgICAgIHBhcmFtcy0+c2V0SW50MzIoUEFSQU1FVEVSX0tFWV9TVVNQRU5ELCBmYWxzZSk7CiAgICAgICAgIGlmIChyZXN1bWVTdGFydFRpbWVVcyA+IDApIHsKLSAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50NjQoImRyb3Atc3RhcnQtdGltZS11cyIsIHJlc3VtZVN0YXJ0VGltZVVzKTsKKyAgICAgICAgICAgIHBhcmFtcy0+c2V0SW50NjQoUEFSQU1FVEVSX0tFWV9TVVNQRU5EX1RJTUUsIHJlc3VtZVN0YXJ0VGltZVVzKTsKICAgICAgICAgfQogICAgICAgICBtRW5jb2Rlci0+c2V0UGFyYW1ldGVycyhwYXJhbXMpOwogICAgIH0KQEAgLTc5OSw3ICs4MDAsNyBAQAogICAgIGlmIChtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSB7CiAgICAgICAgIGlmIChtRW5jb2RlciAhPSBOVUxMKSB7CiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQzMigiZHJvcC1pbnB1dC1mcmFtZXMiLCBmYWxzZSk7CisgICAgICAgICAgICBwYXJhbXMtPnNldEludDMyKFBBUkFNRVRFUl9LRVlfU1VTUEVORCwgZmFsc2UpOwogICAgICAgICAgICAgaWYgKHN0YXJ0VGltZVVzID49IDApIHsKICAgICAgICAgICAgICAgICBwYXJhbXMtPnNldEludDY0KCJza2lwLWZyYW1lcy1iZWZvcmUiLCBzdGFydFRpbWVVcyk7CiAgICAgICAgICAgICB9CkBAIC04MzAsMTAgKzgzMSwxMiBAQAogfQogCiB2b2lkIE1lZGlhQ29kZWNTb3VyY2U6Om9uUGF1c2UoaW50NjRfdCBwYXVzZVN0YXJ0VGltZVVzKSB7Ci0gICAgaWYgKChtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSAmJiAobUVuY29kZXIgIT0gTlVMTCkpIHsKKyAgICBpZiAobVN0b3BwaW5nIHx8IG1PdXRwdXQubG9jaygpLT5tRW5jb2RlclJlYWNoZWRFT1MpIHsKKyAgICAgICAgLy8gTm90aGluZyB0byBkbworICAgIH0gZWxzZSBpZiAoKG1GbGFncyAmIEZMQUdfVVNFX1NVUkZBQ0VfSU5QVVQpICYmIChtRW5jb2RlciAhPSBOVUxMKSkgewogICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlOwotICAgICAgICBwYXJhbXMtPnNldEludDMyKCJkcm9wLWlucHV0LWZyYW1lcyIsIHRydWUpOwotICAgICAgICBwYXJhbXMtPnNldEludDY0KCJkcm9wLXN0YXJ0LXRpbWUtdXMiLCBwYXVzZVN0YXJ0VGltZVVzKTsKKyAgICAgICAgcGFyYW1zLT5zZXRJbnQzMihQQVJBTUVURVJfS0VZX1NVU1BFTkQsIHRydWUpOworICAgICAgICBwYXJhbXMtPnNldEludDY0KFBBUkFNRVRFUl9LRVlfU1VTUEVORF9USU1FLCBwYXVzZVN0YXJ0VGltZVVzKTsKICAgICAgICAgbUVuY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKICAgICB9IGVsc2UgewogICAgICAgICBDSEVDSyhtUHVsbGVyICE9IE5VTEwpOwpAQCAtMTA5NiwxMiArMTA5OSwxMiBAQAogICAgICAgICBzcDxBUmVwbHlUb2tlbj4gcmVwbHlJRDsKICAgICAgICAgQ0hFQ0sobXNnLT5zZW5kZXJBd2FpdHNSZXNwb25zZSgmcmVwbHlJRCkpOwogICAgICAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICAgICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoInRpbWUtb2Zmc2V0LXVzIiwgJm1JbnB1dEJ1ZmZlclRpbWVPZmZzZXRVcykpOworICAgICAgICBDSEVDSyhtc2ctPmZpbmRJbnQ2NChQQVJBTUVURVJfS0VZX09GRlNFVF9USU1FLCAmbUlucHV0QnVmZmVyVGltZU9mZnNldFVzKSk7CiAKICAgICAgICAgLy8gUHJvcGFnYXRlIHRoZSB0aW1lc3RhbXAgb2Zmc2V0IHRvIEdyYXBoaWNCdWZmZXJTb3VyY2UuCiAgICAgICAgIGlmIChtRmxhZ3MgJiBGTEFHX1VTRV9TVVJGQUNFX0lOUFVUKSB7CiAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gcGFyYW1zID0gbmV3IEFNZXNzYWdlOwotICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQ2NCgidGltZS1vZmZzZXQtdXMiLCBtSW5wdXRCdWZmZXJUaW1lT2Zmc2V0VXMpOworICAgICAgICAgICAgcGFyYW1zLT5zZXRJbnQ2NChQQVJBTUVURVJfS0VZX09GRlNFVF9USU1FLCBtSW5wdXRCdWZmZXJUaW1lT2Zmc2V0VXMpOwogICAgICAgICAgICAgZXJyID0gbUVuY29kZXItPnNldFBhcmFtZXRlcnMocGFyYW1zKTsKICAgICAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkMzM4MgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJNZWRpYUV4dHJhY3RvciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXRQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitNZWRpYUV4dHJhY3Rvcjo6TWVkaWFFeHRyYWN0b3IoKSB7CisgICAgaWYgKCFMT0dfTkRFQlVHKSB7CisgICAgICAgIHVpZF90IHVpZCA9IGdldHVpZCgpOworICAgICAgICBzdHJ1Y3QgcGFzc3dkICpwdyA9IGdldHB3dWlkKHVpZCk7CisgICAgICAgIEFMT0dWKCJleHRyYWN0b3IgY3JlYXRlZCBpbiB1aWQ6ICVkICglcykiLCBnZXR1aWQoKSwgcHctPnB3X25hbWUpOworICAgIH0KK30KKworTWVkaWFFeHRyYWN0b3I6On5NZWRpYUV4dHJhY3RvcigpIHt9CisKK3VpbnQzMl90IE1lZGlhRXh0cmFjdG9yOjpmbGFncygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ0FOX1NFRUtfQkFDS1dBUkQgfCBDQU5fU0VFS19GT1JXQVJEIHwgQ0FOX1BBVVNFIHwgQ0FOX1NFRUs7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6Ok1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcihDTWVkaWFFeHRyYWN0b3IgKnBsdWdpbikgeworICAgIHRoaXMtPnBsdWdpbiA9IHBsdWdpbjsKK30KKworTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjp+TWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyKCkgeworICAgIHBsdWdpbi0+ZnJlZShwbHVnaW4tPmRhdGEpOworICAgIGZyZWUocGx1Z2luKTsKK30KKworc2l6ZV90IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6Y291bnRUcmFja3MoKSB7CisgICAgcmV0dXJuIHBsdWdpbi0+Y291bnRUcmFja3MocGx1Z2luLT5kYXRhKTsKK30KKworTWVkaWFUcmFjayAqTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpnZXRUcmFjayhzaXplX3QgaW5kZXgpIHsKKyAgICByZXR1cm4gTWVkaWFUcmFja0NVbndyYXBwZXI6OmNyZWF0ZShwbHVnaW4tPmdldFRyYWNrKHBsdWdpbi0+ZGF0YSwgaW5kZXgpKTsKK30KKworc3RhdHVzX3QgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyOjpnZXRUcmFja01ldGFEYXRhKAorICAgICAgICBNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBzcDxBTWVzc2FnZT4gbXNnID0gbmV3IEFNZXNzYWdlKCk7CisgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSAgQU1lZGlhRm9ybWF0X2Zyb21Nc2coJm1zZyk7CisgICAgbWVkaWFfc3RhdHVzX3QgcmV0ID0gcGx1Z2luLT5nZXRUcmFja01ldGFEYXRhKHBsdWdpbi0+ZGF0YSwgZm9ybWF0LCBpbmRleCwgZmxhZ3MpOworICAgIHNwPE1ldGFEYXRhPiBuZXdNZXRhID0gbmV3IE1ldGFEYXRhKCk7CisgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKG1zZywgbmV3TWV0YSk7CisgICAgZGVsZXRlIGZvcm1hdDsKKyAgICBtZXRhID0gKm5ld01ldGE7CisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHJldCk7Cit9CisKK3N0YXR1c190IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6Z2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOworICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0ID0gIEFNZWRpYUZvcm1hdF9mcm9tTXNnKCZtc2cpOworICAgIG1lZGlhX3N0YXR1c190IHJldCA9IHBsdWdpbi0+Z2V0TWV0YURhdGEocGx1Z2luLT5kYXRhLCBmb3JtYXQpOworICAgIHNwPE1ldGFEYXRhPiBuZXdNZXRhID0gbmV3IE1ldGFEYXRhKCk7CisgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKG1zZywgbmV3TWV0YSk7CisgICAgZGVsZXRlIGZvcm1hdDsKKyAgICBtZXRhID0gKm5ld01ldGE7CisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHJldCk7Cit9CisKK2NvbnN0IGNoYXIgKiBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6Om5hbWUoKSB7CisgICAgcmV0dXJuIHBsdWdpbi0+bmFtZShwbHVnaW4tPmRhdGEpOworfQorCit1aW50MzJfdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXI6OmZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBwbHVnaW4tPmZsYWdzKHBsdWdpbi0+ZGF0YSk7Cit9CisKK3N0YXR1c190IE1lZGlhRXh0cmFjdG9yQ1Vud3JhcHBlcjo6c2V0TWVkaWFDYXMoY29uc3QgdWludDhfdCogY2FzVG9rZW4sIHNpemVfdCBzaXplKSB7CisgICAgcmV0dXJuIHBsdWdpbi0+c2V0TWVkaWFDYXMocGx1Z2luLT5kYXRhLCBjYXNUb2tlbiwgc2l6ZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmNwcAppbmRleCAzNTk3YTRkLi45ZTg1NDc1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5jcHAKQEAgLTE4LDIwICsxOCwyMSBAQAogI2RlZmluZSBMT0dfVEFHICJNZWRpYUV4dHJhY3RvckZhY3RvcnkiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2RsZXh0Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yU2VydmljZS5oPgorI2luY2x1ZGUgPG5hdGl2ZWxvYWRlci9kbGV4dF9uYW1lc3BhY2VzLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8emlwYXJjaGl2ZS96aXBfYXJjaGl2ZS5oPgogCiAjaW5jbHVkZSA8ZGlyZW50Lmg+CiAjaW5jbHVkZSA8ZGxmY24uaD4KQEAgLTcwLDQ5ICs3MSw0MyBAQAogCiAgICAgQUxPR1YoIk1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlRnJvbVNlcnZpY2UgJXMiLCBtaW1lKTsKIAotICAgIFVwZGF0ZUV4dHJhY3RvcnMobnVsbHB0cik7Ci0KLSAgICAvLyBpbml0aWFsaXplIHNvdXJjZSBkZWNyeXB0aW9uIGlmIG5lZWRlZAotICAgIHNvdXJjZS0+RHJtSW5pdGlhbGl6YXRpb24obnVsbHB0ciAvKiBtaW1lICovKTsKLQogICAgIHZvaWQgKm1ldGEgPSBudWxscHRyOwotICAgIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBjcmVhdG9yID0gTlVMTDsKLSAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jIGZyZWVNZXRhID0gbnVsbHB0cjsKKyAgICB2b2lkICpjcmVhdG9yID0gTlVMTDsKKyAgICBGcmVlTWV0YUZ1bmMgZnJlZU1ldGEgPSBudWxscHRyOwogICAgIGZsb2F0IGNvbmZpZGVuY2U7CiAgICAgc3A8RXh0cmFjdG9yUGx1Z2luPiBwbHVnaW47Ci0gICAgY3JlYXRvciA9IHNuaWZmKHNvdXJjZS5nZXQoKSwgJmNvbmZpZGVuY2UsICZtZXRhLCAmZnJlZU1ldGEsIHBsdWdpbik7CisgICAgdWludDMyX3QgY3JlYXRvclZlcnNpb24gPSAwOworICAgIGNyZWF0b3IgPSBzbmlmZihzb3VyY2UsICZjb25maWRlbmNlLCAmbWV0YSwgJmZyZWVNZXRhLCBwbHVnaW4sICZjcmVhdG9yVmVyc2lvbik7CiAgICAgaWYgKCFjcmVhdG9yKSB7CiAgICAgICAgIEFMT0dWKCJGQUlMRUQgdG8gYXV0b2RldGVjdCBtZWRpYSBjb250ZW50LiIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBNZWRpYUV4dHJhY3RvciAqcmV0ID0gY3JlYXRvcihzb3VyY2UuZ2V0KCksIG1ldGEpOwotICAgIGlmIChtZXRhICE9IG51bGxwdHIgJiYgZnJlZU1ldGEgIT0gbnVsbHB0cikgewotICAgICAgICBmcmVlTWV0YShtZXRhKTsKKyAgICBNZWRpYUV4dHJhY3RvciAqZXggPSBudWxscHRyOworICAgIGlmIChjcmVhdG9yVmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjEgfHwKKyAgICAgICAgICAgIGNyZWF0b3JWZXJzaW9uID09IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMikgeworICAgICAgICBDTWVkaWFFeHRyYWN0b3IgKnJldCA9ICgoQ3JlYXRvckZ1bmMpY3JlYXRvcikoc291cmNlLT53cmFwKCksIG1ldGEpOworICAgICAgICBpZiAobWV0YSAhPSBudWxscHRyICYmIGZyZWVNZXRhICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGZyZWVNZXRhKG1ldGEpOworICAgICAgICB9CisgICAgICAgIGV4ID0gcmV0ICE9IG51bGxwdHIgPyBuZXcgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyKHJldCkgOiBudWxscHRyOwogICAgIH0KIAogICAgIEFMT0dWKCJDcmVhdGVkIGFuIGV4dHJhY3RvciAnJXMnIHdpdGggY29uZmlkZW5jZSAlLjJmIiwKLSAgICAgICAgIHJldCAhPSBudWxscHRyID8gcmV0LT5uYW1lKCkgOiAiPG51bGw+IiwgY29uZmlkZW5jZSk7CisgICAgICAgICBleCAhPSBudWxscHRyID8gZXgtPm5hbWUoKSA6ICI8bnVsbD4iLCBjb25maWRlbmNlKTsKIAotICAgIHJldHVybiBDcmVhdGVJTWVkaWFFeHRyYWN0b3JGcm9tTWVkaWFFeHRyYWN0b3IocmV0LCBzb3VyY2UsIHBsdWdpbik7Ci19Ci0KLS8vc3RhdGljCi12b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6TG9hZFBsdWdpbnMoY29uc3QgOjpzdGQ6OnN0cmluZyYgYXBrUGF0aCkgewotICAgIC8vIFRPRE86IFZlcmlmeSBhcGsgcGF0aCB3aXRoIHBhY2thZ2UgbWFuYWdlciBpbiBleHRyYWN0b3IgcHJvY2Vzcy4KLSAgICBBTE9HVigiTG9hZCBwbHVnaW5zIGZyb206ICVzIiwgYXBrUGF0aC5jX3N0cigpKTsKLSAgICBVcGRhdGVFeHRyYWN0b3JzKGFwa1BhdGguZW1wdHkoKSA/IG51bGxwdHIgOiBhcGtQYXRoLmNfc3RyKCkpOworICAgIHJldHVybiBDcmVhdGVJTWVkaWFFeHRyYWN0b3JGcm9tTWVkaWFFeHRyYWN0b3IoZXgsIHNvdXJjZSwgcGx1Z2luKTsKIH0KIAogc3RydWN0IEV4dHJhY3RvclBsdWdpbiA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBNZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmIGRlZjsKKyAgICBFeHRyYWN0b3JEZWYgZGVmOwogICAgIHZvaWQgKmxpYkhhbmRsZTsKICAgICBTdHJpbmc4IGxpYlBhdGg7CiAgICAgU3RyaW5nOCB1dWlkU3RyaW5nOwogCi0gICAgRXh0cmFjdG9yUGx1Z2luKE1lZGlhRXh0cmFjdG9yOjpFeHRyYWN0b3JEZWYgZGVmaW5pdGlvbiwgdm9pZCAqaGFuZGxlLCBTdHJpbmc4ICZwYXRoKQorICAgIEV4dHJhY3RvclBsdWdpbihFeHRyYWN0b3JEZWYgZGVmaW5pdGlvbiwgdm9pZCAqaGFuZGxlLCBTdHJpbmc4ICZwYXRoKQogICAgICAgICA6IGRlZihkZWZpbml0aW9uKSwgbGliSGFuZGxlKGhhbmRsZSksIGxpYlBhdGgocGF0aCkgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemVvZiBNZWRpYUV4dHJhY3Rvcjo6RXh0cmFjdG9yRGVmOjpleHRyYWN0b3JfdXVpZDsgaSsrKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZW9mIEV4dHJhY3RvckRlZjo6ZXh0cmFjdG9yX3V1aWQ7IGkrKykgewogICAgICAgICAgICAgdXVpZFN0cmluZy5hcHBlbmRGb3JtYXQoIiUwMngiLCBkZWYuZXh0cmFjdG9yX3V1aWQuYltpXSk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMjUsMTcgKzEyMCwxOCBAQAogfTsKIAogTXV0ZXggTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnUGx1Z2luTXV0ZXg7Ci1zdGQ6OnNoYXJlZF9wdHI8TGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnUGx1Z2luczsKK3N0ZDo6c2hhcmVkX3B0cjxzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z1BsdWdpbnM7CiBib29sIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z1BsdWdpbnNSZWdpc3RlcmVkID0gZmFsc2U7Citib29sIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z0lnbm9yZVZlcnNpb24gPSBmYWxzZTsKIAogLy8gc3RhdGljCi1NZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpzbmlmZigKLSAgICAgICAgRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLAotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSwgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luKSB7Cit2b2lkICpNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OnNuaWZmKAorICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBmbG9hdCAqY29uZmlkZW5jZSwgdm9pZCAqKm1ldGEsCisgICAgICAgIEZyZWVNZXRhRnVuYyAqZnJlZU1ldGEsIHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbiwgdWludDMyX3QgKmNyZWF0b3JWZXJzaW9uKSB7CiAgICAgKmNvbmZpZGVuY2UgPSAwLjBmOwogICAgICptZXRhID0gbnVsbHB0cjsKIAotICAgIHN0ZDo6c2hhcmVkX3B0cjxMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBwbHVnaW5zOworICAgIHN0ZDo6c2hhcmVkX3B0cjxzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IHBsdWdpbnM7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soZ1BsdWdpbk11dGV4KTsKICAgICAgICAgaWYgKCFnUGx1Z2luc1JlZ2lzdGVyZWQpIHsKQEAgLTE0NCwxMyArMTQwLDIzIEBACiAgICAgICAgIHBsdWdpbnMgPSBnUGx1Z2luczsKICAgICB9CiAKLSAgICBNZWRpYUV4dHJhY3Rvcjo6Q3JlYXRvckZ1bmMgY3VyQ3JlYXRvciA9IE5VTEw7Ci0gICAgTWVkaWFFeHRyYWN0b3I6OkNyZWF0b3JGdW5jIGJlc3RDcmVhdG9yID0gTlVMTDsKKyAgICB2b2lkICpiZXN0Q3JlYXRvciA9IE5VTEw7CiAgICAgZm9yIChhdXRvIGl0ID0gcGx1Z2lucy0+YmVnaW4oKTsgaXQgIT0gcGx1Z2lucy0+ZW5kKCk7ICsraXQpIHsKKyAgICAgICAgQUxPR1YoInNuaWZmaW5nICVzIiwgKCppdCktPmRlZi5leHRyYWN0b3JfbmFtZSk7CiAgICAgICAgIGZsb2F0IG5ld0NvbmZpZGVuY2U7CiAgICAgICAgIHZvaWQgKm5ld01ldGEgPSBudWxscHRyOwotICAgICAgICBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jIG5ld0ZyZWVNZXRhID0gbnVsbHB0cjsKLSAgICAgICAgaWYgKChjdXJDcmVhdG9yID0gKCppdCktPmRlZi5zbmlmZihzb3VyY2UsICZuZXdDb25maWRlbmNlLCAmbmV3TWV0YSwgJm5ld0ZyZWVNZXRhKSkpIHsKKyAgICAgICAgRnJlZU1ldGFGdW5jIG5ld0ZyZWVNZXRhID0gbnVsbHB0cjsKKworICAgICAgICB2b2lkICpjdXJDcmVhdG9yID0gTlVMTDsKKyAgICAgICAgaWYgKCgqaXQpLT5kZWYuZGVmX3ZlcnNpb24gPT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YxKSB7CisgICAgICAgICAgICBjdXJDcmVhdG9yID0gKHZvaWQqKSAoKml0KS0+ZGVmLnUudjIuc25pZmYoCisgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+d3JhcCgpLCAmbmV3Q29uZmlkZW5jZSwgJm5ld01ldGEsICZuZXdGcmVlTWV0YSk7CisgICAgICAgIH0gZWxzZSBpZiAoKCppdCktPmRlZi5kZWZfdmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIpIHsKKyAgICAgICAgICAgIGN1ckNyZWF0b3IgPSAodm9pZCopICgqaXQpLT5kZWYudS52My5zbmlmZigKKyAgICAgICAgICAgICAgICAgICAgc291cmNlLT53cmFwKCksICZuZXdDb25maWRlbmNlLCAmbmV3TWV0YSwgJm5ld0ZyZWVNZXRhKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChjdXJDcmVhdG9yKSB7CiAgICAgICAgICAgICBpZiAobmV3Q29uZmlkZW5jZSA+ICpjb25maWRlbmNlKSB7CiAgICAgICAgICAgICAgICAgKmNvbmZpZGVuY2UgPSBuZXdDb25maWRlbmNlOwogICAgICAgICAgICAgICAgIGlmICgqbWV0YSAhPSBudWxscHRyICYmICpmcmVlTWV0YSAhPSBudWxscHRyKSB7CkBAIC0xNjAsNiArMTY2LDcgQEAKICAgICAgICAgICAgICAgICAqZnJlZU1ldGEgPSBuZXdGcmVlTWV0YTsKICAgICAgICAgICAgICAgICBwbHVnaW4gPSAqaXQ7CiAgICAgICAgICAgICAgICAgYmVzdENyZWF0b3IgPSBjdXJDcmVhdG9yOworICAgICAgICAgICAgICAgICpjcmVhdG9yVmVyc2lvbiA9ICgqaXQpLT5kZWYuZGVmX3ZlcnNpb247CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChuZXdNZXRhICE9IG51bGxwdHIgJiYgbmV3RnJlZU1ldGEgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgICAgICBuZXdGcmVlTWV0YShuZXdNZXRhKTsKQEAgLTE3MywxMCArMTgwLDEwIEBACiAKIC8vIHN0YXRpYwogdm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlJlZ2lzdGVyRXh0cmFjdG9yKGNvbnN0IHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbiwKLSAgICAgICAgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCkgeworICAgICAgICBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKICAgICAvLyBzYW5pdHkgY2hlY2sgY2hlY2sgc3RydWN0IHZlcnNpb24sIHV1aWQsIG5hbWUKLSAgICBpZiAocGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24gPT0gMAotICAgICAgICAgICAgfHwgcGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24gPiBNZWRpYUV4dHJhY3Rvcjo6RVhUUkFDVE9SREVGX1ZFUlNJT04pIHsKKyAgICBpZiAocGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24gIT0gRVhUUkFDVE9SREVGX1ZFUlNJT05fTkRLX1YxICYmCisgICAgICAgICAgICBwbHVnaW4tPmRlZi5kZWZfdmVyc2lvbiAhPSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIpIHsKICAgICAgICAgQUxPR0UoImRvbid0IHVuZGVyc3RhbmQgZXh0cmFjdG9yIGZvcm1hdCAldSwgaWdub3JpbmcuIiwgcGx1Z2luLT5kZWYuZGVmX3ZlcnNpb24pOwogICAgICAgICByZXR1cm47CiAgICAgfQpAQCAtMTkyLDcgKzE5OSw3IEBACiAgICAgZm9yIChhdXRvIGl0ID0gcGx1Z2luTGlzdC5iZWdpbigpOyBpdCAhPSBwbHVnaW5MaXN0LmVuZCgpOyArK2l0KSB7CiAgICAgICAgIGlmIChtZW1jbXAoJigoKml0KS0+ZGVmLmV4dHJhY3Rvcl91dWlkKSwgJnBsdWdpbi0+ZGVmLmV4dHJhY3Rvcl91dWlkLCAxNikgPT0gMCkgewogICAgICAgICAgICAgLy8gdGhlcmUncyBhbHJlYWR5IGFuIGV4dHJhY3RvciB3aXRoIHRoZSBzYW1lIHV1aWQKLSAgICAgICAgICAgIGlmICgoKml0KS0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uIDwgcGx1Z2luLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24pIHsKKyAgICAgICAgICAgIGlmIChnSWdub3JlVmVyc2lvbiB8fCAoKml0KS0+ZGVmLmV4dHJhY3Rvcl92ZXJzaW9uIDwgcGx1Z2luLT5kZWYuZXh0cmFjdG9yX3ZlcnNpb24pIHsKICAgICAgICAgICAgICAgICAvLyB0aGlzIG9uZSBpcyBuZXdlciwgcmVwbGFjZSB0aGUgb2xkIG9uZQogICAgICAgICAgICAgICAgIEFMT0dXKCJyZXBsYWNpbmcgZXh0cmFjdG9yICclcycgdmVyc2lvbiAldSB3aXRoIHZlcnNpb24gJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2luLT5kZWYuZXh0cmFjdG9yX25hbWUsCkBAIC0yMTQsMTA5ICsyMjEsMTE2IEBACiB9CiAKIC8vc3RhdGljCi12b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6UmVnaXN0ZXJFeHRyYWN0b3JzSW5BcGsoCi0gICAgICAgIGNvbnN0IGNoYXIgKmFwa1BhdGgsIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKLSAgICBBTE9HVigic2VhcmNoIGZvciBwbHVnaW5zIGF0ICVzIiwgYXBrUGF0aCk7Ci0gICAgWmlwQXJjaGl2ZUhhbmRsZSB6aXBIYW5kbGU7Ci0gICAgaW50MzJfdCByZXQgPSBPcGVuQXJjaGl2ZShhcGtQYXRoLCAmemlwSGFuZGxlKTsKLSAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgY2hhciBhYmlbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAgICAgcHJvcGVydHlfZ2V0KCJyby5wcm9kdWN0LmNwdS5hYmkiLCBhYmksICJhcm02NC12OGEiKTsKLSAgICAgICAgU3RyaW5nOCBwcmVmaXg4ID0gU3RyaW5nODo6Zm9ybWF0KCJsaWIvJXMvIiwgYWJpKTsKLSAgICAgICAgdm9pZCogY29va2llOwotICAgICAgICByZXQgPSBTdGFydEl0ZXJhdGlvbih6aXBIYW5kbGUsICZjb29raWUsIHByZWZpeDguY19zdHIoKSwgImV4dHJhY3Rvci5zbyIpOwotICAgICAgICBpZiAocmV0ID09IDApIHsKLSAgICAgICAgICAgIFppcEVudHJ5IGVudHJ5OwotICAgICAgICAgICAgWmlwU3RyaW5nIG5hbWU7Ci0gICAgICAgICAgICB3aGlsZSAoTmV4dChjb29raWUsICZlbnRyeSwgJm5hbWUpID09IDApIHsKLSAgICAgICAgICAgICAgICBTdHJpbmc4IGxpYlBhdGggPSBTdHJpbmc4KGFwa1BhdGgpICsgIiEvIiArCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZzgocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4obmFtZS5uYW1lKSwgbmFtZS5uYW1lX2xlbmd0aCk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogT3BlbiB3aXRoIGEgbGlua2VyIG5hbWVzcGFjZSBzbyB0aGF0IGl0IGNhbiBiZSBsaW5rZWQgd2l0aCBzdWItbGlicmFyaWVzCi0gICAgICAgICAgICAgICAgLy8gd2l0aGluIHRoZSBhcGsgaW5zdGVhZCBvZiBzeXN0ZW0gbGlicmFyaWVzIGFscmVhZHkgbG9hZGVkLgotICAgICAgICAgICAgICAgIHZvaWQgKmxpYkhhbmRsZSA9IGRsb3BlbihsaWJQYXRoLnN0cmluZygpLCBSVExEX05PVyB8IFJUTERfTE9DQUwpOwotICAgICAgICAgICAgICAgIGlmIChsaWJIYW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkdldEV4dHJhY3RvckRlZiBnZXREZWYgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE1lZGlhRXh0cmFjdG9yOjpHZXRFeHRyYWN0b3JEZWYpIGRsc3ltKGxpYkhhbmRsZSwgIkdFVEVYVFJBQ1RPUkRFRiIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0RGVmKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJpbmcgc25pZmZlciBmb3IgJXMiLCBsaWJQYXRoLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyRXh0cmFjdG9yKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRXh0cmFjdG9yUGx1Z2luKGdldERlZigpLCBsaWJIYW5kbGUsIGxpYlBhdGgpLCBwbHVnaW5MaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBkb2VzIG5vdCBjb250YWluIHNuaWZmZXIiLCBsaWJQYXRoLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRsY2xvc2UobGliSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBkbG9wZW4oJXMpICVzIiwgbGliUGF0aC5zdHJpbmcoKSwgc3RyZXJyb3IoZXJybm8pKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFbmRJdGVyYXRpb24oY29va2llKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJjb3VsZG4ndCBmaW5kIHBsdWdpbnMgZnJvbSAlcywgJWQiLCBhcGtQYXRoLCByZXQpOwotICAgICAgICB9Ci0gICAgICAgIENsb3NlQXJjaGl2ZSh6aXBIYW5kbGUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dXKCJjb3VsZG4ndCBvcGVuKCVzKSAlZCIsIGFwa1BhdGgsIHJldCk7Ci0gICAgfQotfQotCi0vL3N0YXRpYwotdm9pZCBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OlJlZ2lzdGVyRXh0cmFjdG9yc0luU3lzdGVtKAotICAgICAgICBjb25zdCBjaGFyICpsaWJEaXJQYXRoLCBMaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+ICZwbHVnaW5MaXN0KSB7Cit2b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6UmVnaXN0ZXJFeHRyYWN0b3JzKAorICAgICAgICBjb25zdCBjaGFyICpsaWJEaXJQYXRoLCBjb25zdCBhbmRyb2lkX2RsZXh0aW5mbyogZGxleHRpbmZvLAorICAgICAgICBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpIHsKICAgICBBTE9HVigic2VhcmNoIGZvciBwbHVnaW5zIGF0ICVzIiwgbGliRGlyUGF0aCk7CisKICAgICBESVIgKmxpYkRpciA9IG9wZW5kaXIobGliRGlyUGF0aCk7CiAgICAgaWYgKGxpYkRpcikgewogICAgICAgICBzdHJ1Y3QgZGlyZW50KiBsaWJFbnRyeTsKICAgICAgICAgd2hpbGUgKChsaWJFbnRyeSA9IHJlYWRkaXIobGliRGlyKSkpIHsKLSAgICAgICAgICAgIFN0cmluZzggbGliUGF0aCA9IFN0cmluZzgobGliRGlyUGF0aCkgKyAiLyIgKyBsaWJFbnRyeS0+ZF9uYW1lOwotICAgICAgICAgICAgdm9pZCAqbGliSGFuZGxlID0gZGxvcGVuKGxpYlBhdGguc3RyaW5nKCksIFJUTERfTk9XIHwgUlRMRF9MT0NBTCk7Ci0gICAgICAgICAgICBpZiAobGliSGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFFeHRyYWN0b3I6OkdldEV4dHJhY3RvckRlZiBnZXREZWYgPQotICAgICAgICAgICAgICAgICAgICAoTWVkaWFFeHRyYWN0b3I6OkdldEV4dHJhY3RvckRlZikgZGxzeW0obGliSGFuZGxlLCAiR0VURVhUUkFDVE9SREVGIik7Ci0gICAgICAgICAgICAgICAgaWYgKGdldERlZikgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJpbmcgc25pZmZlciBmb3IgJXMiLCBsaWJQYXRoLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJFeHRyYWN0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEV4dHJhY3RvclBsdWdpbihnZXREZWYoKSwgbGliSGFuZGxlLCBsaWJQYXRoKSwgcGx1Z2luTGlzdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzIGRvZXMgbm90IGNvbnRhaW4gc25pZmZlciIsIGxpYlBhdGguc3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBkbGNsb3NlKGxpYkhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY291bGRuJ3QgZGxvcGVuKCVzKSAlcyIsIGxpYlBhdGguc3RyaW5nKCksIHN0cmVycm9yKGVycm5vKSk7CisgICAgICAgICAgICBpZiAobGliRW50cnktPmRfbmFtZVswXSA9PSAnLicpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICAgICAgU3RyaW5nOCBsaWJQYXRoID0gU3RyaW5nOChsaWJEaXJQYXRoKSArICIvIiArIGxpYkVudHJ5LT5kX25hbWU7CisgICAgICAgICAgICBpZiAoIWxpYlBhdGguY29udGFpbnMoImV4dHJhY3Rvci5zbyIpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkICpsaWJIYW5kbGUgPSBhbmRyb2lkX2Rsb3Blbl9leHQoCisgICAgICAgICAgICAgICAgICAgIGxpYlBhdGguc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgIFJUTERfTk9XIHwgUlRMRF9MT0NBTCwgZGxleHRpbmZvKTsKKyAgICAgICAgICAgIENIRUNLKGxpYkhhbmRsZSAhPSBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICA8PCAiY291bGRuJ3QgZGxvcGVuKCIgPDwgbGliUGF0aC5zdHJpbmcoKSA8PCAiKSAiIDw8IHN0cmVycm9yKGVycm5vKTsKIAorICAgICAgICAgICAgR2V0RXh0cmFjdG9yRGVmIGdldERlZiA9CisgICAgICAgICAgICAgICAgKEdldEV4dHJhY3RvckRlZikgZGxzeW0obGliSGFuZGxlLCAiR0VURVhUUkFDVE9SREVGIik7CisgICAgICAgICAgICBDSEVDSyhnZXREZWYgIT0gbnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgPDwgbGliUGF0aC5zdHJpbmcoKSA8PCAiIGRvZXMgbm90IGNvbnRhaW4gc25pZmZlciI7CisKKyAgICAgICAgICAgIEFMT0dWKCJyZWdpc3RlcmluZyBzbmlmZmVyIGZvciAlcyIsIGxpYlBhdGguc3RyaW5nKCkpOworICAgICAgICAgICAgUmVnaXN0ZXJFeHRyYWN0b3IoCisgICAgICAgICAgICAgICAgICAgIG5ldyBFeHRyYWN0b3JQbHVnaW4oZ2V0RGVmKCksIGxpYkhhbmRsZSwgbGliUGF0aCksIHBsdWdpbkxpc3QpOworICAgICAgICB9CiAgICAgICAgIGNsb3NlZGlyKGxpYkRpcik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR0UoImNvdWxkbid0IG9wZW5kaXIoJXMpIiwgbGliRGlyUGF0aCk7CiAgICAgfQogfQogCitzdGF0aWMgYm9vbCBjb21wYXJlRnVuYyhjb25zdCBzcDxFeHRyYWN0b3JQbHVnaW4+JiBmaXJzdCwgY29uc3Qgc3A8RXh0cmFjdG9yUGx1Z2luPiYgc2Vjb25kKSB7CisgICAgcmV0dXJuIHN0cmNtcChmaXJzdC0+ZGVmLmV4dHJhY3Rvcl9uYW1lLCBzZWNvbmQtPmRlZi5leHRyYWN0b3JfbmFtZSkgPCAwOworfQorCitzdGF0aWMgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBnU3VwcG9ydGVkRXh0ZW5zaW9uczsKKwogLy8gc3RhdGljCi12b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6VXBkYXRlRXh0cmFjdG9ycyhjb25zdCBjaGFyICpuZXdVcGRhdGVBcGtQYXRoKSB7Cit2b2lkIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6TG9hZEV4dHJhY3RvcnMoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGdQbHVnaW5NdXRleCk7Ci0gICAgaWYgKG5ld1VwZGF0ZUFwa1BhdGggIT0gbnVsbHB0cikgewotICAgICAgICBnUGx1Z2luc1JlZ2lzdGVyZWQgPSBmYWxzZTsKLSAgICB9CisKICAgICBpZiAoZ1BsdWdpbnNSZWdpc3RlcmVkKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzdGQ6OnNoYXJlZF9wdHI8TGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gbmV3TGlzdChuZXcgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PigpKTsKKyAgICBnSWdub3JlVmVyc2lvbiA9IHByb3BlcnR5X2dldF9ib29sKCJkZWJ1Zy5leHRyYWN0b3IuaWdub3JlX3ZlcnNpb24iLCBmYWxzZSk7CiAKLSAgICBSZWdpc3RlckV4dHJhY3RvcnNJblN5c3RlbSgiL3N5c3RlbS9saWIiCisgICAgc3RkOjpzaGFyZWRfcHRyPHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+Pj4gbmV3TGlzdChuZXcgc3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+KCkpOworCisgICAgYW5kcm9pZF9uYW1lc3BhY2VfdCAqbWVkaWFOcyA9IGFuZHJvaWRfZ2V0X2V4cG9ydGVkX25hbWVzcGFjZSgiY29tX2FuZHJvaWRfbWVkaWEiKTsKKyAgICBpZiAobWVkaWFOcyAhPSBOVUxMKSB7CisgICAgICAgIGNvbnN0IGFuZHJvaWRfZGxleHRpbmZvIGRsZXh0aW5mbyA9IHsKKyAgICAgICAgICAgIC5mbGFncyA9IEFORFJPSURfRExFWFRfVVNFX05BTUVTUEFDRSwKKyAgICAgICAgICAgIC5saWJyYXJ5X25hbWVzcGFjZSA9IG1lZGlhTnMsCisgICAgICAgIH07CisgICAgICAgIFJlZ2lzdGVyRXh0cmFjdG9ycygiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEvbGliIgorI2lmZGVmIF9fTFA2NF9fCisgICAgICAgICAgICAgICAgIjY0IgorI2VuZGlmCisgICAgICAgICAgICAgICAgIi9leHRyYWN0b3JzIiwgJmRsZXh0aW5mbywgKm5ld0xpc3QpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoImNvdWxkbid0IGZpbmQgbWVkaWEgbmFtZXNwYWNlLiIpOworICAgIH0KKworICAgIFJlZ2lzdGVyRXh0cmFjdG9ycygiL3N5c3RlbS9saWIiCiAjaWZkZWYgX19MUDY0X18KICAgICAgICAgICAgICI2NCIKICNlbmRpZgotICAgICAgICAgICAgIi9leHRyYWN0b3JzIiwgKm5ld0xpc3QpOworICAgICAgICAgICAgIi9leHRyYWN0b3JzIiwgTlVMTCwgKm5ld0xpc3QpOwogCi0gICAgaWYgKG5ld1VwZGF0ZUFwa1BhdGggIT0gbnVsbHB0cikgewotICAgICAgICBSZWdpc3RlckV4dHJhY3RvcnNJbkFwayhuZXdVcGRhdGVBcGtQYXRoLCAqbmV3TGlzdCk7CisgICAgbmV3TGlzdC0+c29ydChjb21wYXJlRnVuYyk7CisgICAgZ1BsdWdpbnMgPSBuZXdMaXN0OworCisgICAgZm9yIChhdXRvIGl0ID0gZ1BsdWdpbnMtPmJlZ2luKCk7IGl0ICE9IGdQbHVnaW5zLT5lbmQoKTsgKytpdCkgeworICAgICAgICBpZiAoKCppdCktPmRlZi5kZWZfdmVyc2lvbiA9PSBFWFRSQUNUT1JERUZfVkVSU0lPTl9OREtfVjIpIHsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOzsgaSsrKSB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXh0ID0gKCppdCktPmRlZi51LnYzLnN1cHBvcnRlZF90eXBlc1tpXTsKKyAgICAgICAgICAgICAgICBpZiAoZXh0ID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdTdXBwb3J0ZWRFeHRlbnNpb25zLmluc2VydChzdGQ6OnN0cmluZyhleHQpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KIAotICAgIGdQbHVnaW5zID0gbmV3TGlzdDsKICAgICBnUGx1Z2luc1JlZ2lzdGVyZWQgPSB0cnVlOwogfQogCisvLyBzdGF0aWMKK3N0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpnZXRTdXBwb3J0ZWRUeXBlcygpIHsKKyAgICBpZiAoZ2V0dWlkKCkgPT0gQUlEX01FRElBX0VYKSB7CisgICAgICAgIHJldHVybiBnU3VwcG9ydGVkRXh0ZW5zaW9uczsKKyAgICB9CisgICAgQUxPR1YoImdldCBzZXJ2aWNlIG1hbmFnZXIiKTsKKyAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKS0+Z2V0U2VydmljZShTdHJpbmcxNigibWVkaWEuZXh0cmFjdG9yIikpOworCisgICAgaWYgKGJpbmRlciAhPSAwKSB7CisgICAgICAgIHNwPElNZWRpYUV4dHJhY3RvclNlcnZpY2U+IG1lZGlhRXhTZXJ2aWNlKGludGVyZmFjZV9jYXN0PElNZWRpYUV4dHJhY3RvclNlcnZpY2U+KGJpbmRlcikpOworICAgICAgICByZXR1cm4gbWVkaWFFeFNlcnZpY2UtPmdldFN1cHBvcnRlZFR5cGVzKCk7CisgICAgfQorICAgIHJldHVybiBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+KCk7Cit9CisKIHN0YXR1c190IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKGdQbHVnaW5NdXRleCk7CiAgICAgU3RyaW5nOCBvdXQ7CkBAIC0zMzMsMTIgKzM0NywyNSBAQAogICAgICAgICBvdXQuYXBwZW5kKCJBdmFpbGFibGUgZXh0cmFjdG9yczpcbiIpOwogICAgICAgICBpZiAoZ1BsdWdpbnNSZWdpc3RlcmVkKSB7CiAgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBnUGx1Z2lucy0+YmVnaW4oKTsgaXQgIT0gZ1BsdWdpbnMtPmVuZCgpOyArK2l0KSB7Ci0gICAgICAgICAgICAgICAgb3V0LmFwcGVuZEZvcm1hdCgiICAlMjVzOiB1dWlkKCVzKSwgdmVyc2lvbigldSksIHBhdGgoJXMpXG4iLAorICAgICAgICAgICAgICAgIG91dC5hcHBlbmRGb3JtYXQoIiAgJTI1czogcGx1Z2luX3ZlcnNpb24oJWQpLCB1dWlkKCVzKSwgdmVyc2lvbigldSksIHBhdGgoJXMpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICgqaXQpLT5kZWYuZXh0cmFjdG9yX25hbWUsCisgICAgICAgICAgICAgICAgICAgICgqaXQpLT5kZWYuZGVmX3ZlcnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAoKml0KS0+dXVpZFN0cmluZy5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgKCppdCktPmRlZi5leHRyYWN0b3JfdmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICgqaXQpLT5saWJQYXRoLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGlmICgoKml0KS0+ZGVmLmRlZl92ZXJzaW9uID09IEVYVFJBQ1RPUkRFRl9WRVJTSU9OX05ES19WMikgeworICAgICAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKCIsIHN1cHBvcnRzOiAiKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7OyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1pbWUgPSAoKml0KS0+ZGVmLnUudjMuc3VwcG9ydGVkX3R5cGVzW2ldOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbWUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgb3V0LmFwcGVuZEZvcm1hdCgiJXMgIiwgbWltZSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgiXG4iKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG91dC5hcHBlbmQoIlxuIik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBvdXQuYXBwZW5kKCIgIChubyBwbHVnaW5zIHJlZ2lzdGVyZWQpXG4iKTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYU11eGVyLmNwcAppbmRleCA5OGY1OWI1Li43ZWJkYjFhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYU11eGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYU11eGVyLmNwcApAQCAtMzUsNiArMzUsNyBAQAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTUyLDYgKzUzLDggQEAKICAgICAgICAgbVdyaXRlciA9IG5ldyBNUEVHNFdyaXRlcihmZCk7CiAgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9XRUJNKSB7CiAgICAgICAgIG1Xcml0ZXIgPSBuZXcgV2VibVdyaXRlcihmZCk7CisgICAgfSBlbHNlIGlmIChmb3JtYXQgPT0gT1VUUFVUX0ZPUk1BVF9PR0cpIHsKKyAgICAgICAgbVdyaXRlciA9IG5ldyBPZ2dXcml0ZXIoZmQpOwogICAgIH0KIAogICAgIGlmIChtV3JpdGVyICE9IE5VTEwpIHsKQEAgLTU5LDYgKzYyLDggQEAKICAgICAgICAgaWYgKGZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX0hFSUYpIHsKICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB0aGUga2V5IHVzZXMgcmVjb3JkZXIgZmlsZSB0eXBlcy4KICAgICAgICAgICAgIG1GaWxlTWV0YS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBvdXRwdXRfZm9ybWF0OjpPVVRQVVRfRk9STUFUX0hFSUYpOworICAgICAgICB9IGVsc2UgaWYgKGZvcm1hdCA9PSBPVVRQVVRfRk9STUFUX09HRykgeworICAgICAgICAgICAgbUZpbGVNZXRhLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG91dHB1dF9mb3JtYXQ6Ok9VVFBVVF9GT1JNQVRfT0dHKTsKICAgICAgICAgfQogICAgICAgICBtU3RhdGUgPSBJTklUSUFMSVpFRDsKICAgICB9CkBAIC05MSwxMCArOTYsMTggQEAKIAogICAgIHNwPE1lZGlhQWRhcHRlcj4gbmV3VHJhY2sgPSBuZXcgTWVkaWFBZGFwdGVyKHRyYWNrTWV0YSk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbVdyaXRlci0+YWRkU291cmNlKG5ld1RyYWNrKTsKLSAgICBpZiAocmVzdWx0ID09IE9LKSB7Ci0gICAgICAgIHJldHVybiBtVHJhY2tMaXN0LmFkZChuZXdUcmFjayk7CisgICAgaWYgKHJlc3VsdCAhPSBPSykgeworICAgICAgICByZXR1cm4gLTE7CiAgICAgfQotICAgIHJldHVybiAtMTsKKyAgICBmbG9hdCBjYXB0dXJlRnBzID0gLTEuMDsKKyAgICBpZiAoZm9ybWF0LT5maW5kQXNGbG9hdCgidGltZS1sYXBzZS1mcHMiLCAmY2FwdHVyZUZwcykpIHsKKyAgICAgICAgQUxPR1YoImFkZFRyYWNrKCkgdGltZS1sYXBzZS1mcHM6ICVmIiwgY2FwdHVyZUZwcyk7CisgICAgICAgIHJlc3VsdCA9IG1Xcml0ZXItPnNldENhcHR1cmVSYXRlKGNhcHR1cmVGcHMpOworICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HVygiYWRkVHJhY2soKSBzZXRDYXB0dXJlUmF0ZSBmYWlsZWQgOiVkIiwgcmVzdWx0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbVRyYWNrTGlzdC5hZGQobmV3VHJhY2spOwogfQogCiBzdGF0dXNfdCBNZWRpYU11eGVyOjpzZXRPcmllbnRhdGlvbkhpbnQoaW50IGRlZ3JlZXMpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01lZGlhU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhU291cmNlLmNwcApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWVkaWFTb3VyY2UuY3BwCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9NZWRpYVNvdXJjZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhVHJhY2suY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWVkaWFUcmFjay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODljOWIyNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L01lZGlhVHJhY2suY3BwCkBAIC0wLDAgKzEsMTk3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG11dGV4PgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYVRyYWNrLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5BcGkuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK01lZGlhVHJhY2s6Ok1lZGlhVHJhY2soKSB7fQorCitNZWRpYVRyYWNrOjp+TWVkaWFUcmFjaygpIHt9CisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3ZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnNldE5vbkJsb2NraW5nKCkgeworICAgIG1Ob25CbG9ja2luZyA9IHRydWU7Cit9CisKK3ZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmNsZWFyTm9uQmxvY2tpbmcoKSB7CisgICAgbU5vbkJsb2NraW5nID0gZmFsc2U7Cit9CisKK2Jvb2wgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OmdldE5vbkJsb2NraW5nKCkgY29uc3QgeworICAgIHJldHVybiBtTm9uQmxvY2tpbmc7Cit9CisKK3ZvaWQgTWVkaWFUcmFjazo6UmVhZE9wdGlvbnM6OnNldFNlZWtUbyhpbnQ2NF90IHRpbWVfdXMsIFNlZWtNb2RlIG1vZGUpIHsKKyAgICBtT3B0aW9ucyB8PSBrU2Vla1RvX09wdGlvbjsKKyAgICBtU2Vla1RpbWVVcyA9IHRpbWVfdXM7CisgICAgbVNlZWtNb2RlID0gbW9kZTsKK30KKworYm9vbCBNZWRpYVRyYWNrOjpSZWFkT3B0aW9uczo6Z2V0U2Vla1RvKAorICAgICAgICBpbnQ2NF90ICp0aW1lX3VzLCBTZWVrTW9kZSAqbW9kZSkgY29uc3QgeworICAgICp0aW1lX3VzID0gbVNlZWtUaW1lVXM7CisgICAgKm1vZGUgPSBtU2Vla01vZGU7CisgICAgcmV0dXJuIChtT3B0aW9ucyAmIGtTZWVrVG9fT3B0aW9uKSAhPSAwOworfQorCisvKiAtLS0tLS0tLS0tLS0tLSB1bndyYXBwZXIgLS0tLS0tLS0tLS0tLS0tICovCisKK01lZGlhVHJhY2tDVW53cmFwcGVyOjpNZWRpYVRyYWNrQ1Vud3JhcHBlcihDTWVkaWFUcmFjayAqY21lZGlhdHJhY2spIHsKKyAgICB3cmFwcGVyID0gY21lZGlhdHJhY2s7CisgICAgYnVmZmVyR3JvdXAgPSBudWxscHRyOworfQorCitNZWRpYVRyYWNrQ1Vud3JhcHBlciAqTWVkaWFUcmFja0NVbndyYXBwZXI6OmNyZWF0ZShDTWVkaWFUcmFjayAqY21lZGlhdHJhY2spIHsKKyAgICBpZiAoY21lZGlhdHJhY2sgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIG5ldyBNZWRpYVRyYWNrQ1Vud3JhcHBlcihjbWVkaWF0cmFjayk7Cit9CisKK01lZGlhVHJhY2tDVW53cmFwcGVyOjp+TWVkaWFUcmFja0NVbndyYXBwZXIoKSB7CisgICAgd3JhcHBlci0+ZnJlZSh3cmFwcGVyLT5kYXRhKTsKKyAgICBmcmVlKHdyYXBwZXIpOworICAgIGRlbGV0ZSBidWZmZXJHcm91cDsKK30KKworc3RhdHVzX3QgTWVkaWFUcmFja0NVbndyYXBwZXI6OnN0YXJ0KCkgeworICAgIGlmIChidWZmZXJHcm91cCA9PSBudWxscHRyKSB7CisgICAgICAgIGJ1ZmZlckdyb3VwID0gbmV3IE1lZGlhQnVmZmVyR3JvdXAoKTsKKyAgICB9CisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHdyYXBwZXItPnN0YXJ0KHdyYXBwZXItPmRhdGEsIGJ1ZmZlckdyb3VwLT53cmFwKCkpKTsKK30KKworc3RhdHVzX3QgTWVkaWFUcmFja0NVbndyYXBwZXI6OnN0b3AoKSB7CisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHdyYXBwZXItPnN0b3Aod3JhcHBlci0+ZGF0YSkpOworfQorCitzdGF0dXNfdCBNZWRpYVRyYWNrQ1Vud3JhcHBlcjo6Z2V0Rm9ybWF0KE1ldGFEYXRhQmFzZSYgZm9ybWF0KSB7CisgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOworICAgIEFNZWRpYUZvcm1hdCAqdG1wRm9ybWF0ID0gIEFNZWRpYUZvcm1hdF9mcm9tTXNnKCZtc2cpOworICAgIG1lZGlhX3N0YXR1c190IHJldCA9IHdyYXBwZXItPmdldEZvcm1hdCh3cmFwcGVyLT5kYXRhLCB0bXBGb3JtYXQpOworICAgIHNwPE1ldGFEYXRhPiBuZXdNZXRhID0gbmV3IE1ldGFEYXRhKCk7CisgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKG1zZywgbmV3TWV0YSk7CisgICAgZGVsZXRlIHRtcEZvcm1hdDsKKyAgICBmb3JtYXQgPSAqbmV3TWV0YTsKKyAgICByZXR1cm4gcmV2ZXJzZV90cmFuc2xhdGVfZXJyb3IocmV0KTsKK30KKworc3RhdHVzX3QgTWVkaWFUcmFja0NVbndyYXBwZXI6OnJlYWQoTWVkaWFCdWZmZXJCYXNlICoqYnVmZmVyLCBjb25zdCBSZWFkT3B0aW9ucyAqb3B0aW9ucykgeworCisgICAgdWludDMyX3Qgb3B0cyA9IDA7CisKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXROb25CbG9ja2luZygpKSB7CisgICAgICAgIG9wdHMgfD0gQ01lZGlhVHJhY2tSZWFkT3B0aW9uczo6Tk9OQkxPQ0tJTkc7CisgICAgfQorCisgICAgaW50NjRfdCBzZWVrUG9zaXRpb24gPSAwOworICAgIE1lZGlhVHJhY2s6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBzZWVrTW9kZTsKKyAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLT5nZXRTZWVrVG8oJnNlZWtQb3NpdGlvbiwgJnNlZWtNb2RlKSkgeworICAgICAgICBvcHRzIHw9IFNFRUs7CisgICAgICAgIG9wdHMgfD0gKHVpbnQzMl90KSBzZWVrTW9kZTsKKyAgICB9CisgICAgQ01lZGlhQnVmZmVyICpidWYgPSBudWxscHRyOworICAgIG1lZGlhX3N0YXR1c190IHJldCA9IHdyYXBwZXItPnJlYWQod3JhcHBlci0+ZGF0YSwgJmJ1Ziwgb3B0cywgc2Vla1Bvc2l0aW9uKTsKKyAgICBpZiAocmV0ID09IEFNRURJQV9PSyAmJiBidWYgIT0gbnVsbHB0cikgeworICAgICAgICAqYnVmZmVyID0gKE1lZGlhQnVmZmVyQmFzZSopYnVmLT5oYW5kbGU7CisgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSA9ICgqYnVmZmVyKS0+bWV0YV9kYXRhKCk7CisgICAgICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0ID0gYnVmLT5tZXRhX2RhdGEoYnVmLT5oYW5kbGUpOworICAgICAgICAvLyBvbmx5IGNvbnZlcnQgdGhlIGtleXMgd2UncmUgYWN0dWFsbHkgZXhwZWN0aW5nLCBhcyBkb2luZworICAgICAgICAvLyB0aGUgZnVsbCBjb252ZXJ0TWVzc2FnZVRvTWV0YWRhdGEoKSBmb3IgZXZlcnkgYnVmZmVyIGlzCisgICAgICAgIC8vIHRvbyBleHBlbnNpdmUKKyAgICAgICAgaW50NjRfdCB2YWw2NDsKKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDY0KCJ0aW1lVXMiLCAmdmFsNjQpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDY0KGtLZXlUaW1lLCB2YWw2NCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDY0KCJkdXJhdGlvblVzIiwgJnZhbDY0KSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIHZhbDY0KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50NjQoInRhcmdldC10aW1lIiwgJnZhbDY0KSkgeworICAgICAgICAgICAgbWV0YS5zZXRJbnQ2NChrS2V5VGFyZ2V0VGltZSwgdmFsNjQpOworICAgICAgICB9CisgICAgICAgIGludDMyX3QgdmFsMzI7CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigiaXMtc3luYy1mcmFtZSIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCB2YWwzMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJ0ZW1wb3JhbC1sYXllci1pZCIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVRlbXBvcmFsTGF5ZXJJZCwgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigidGVtcG9yYWwtbGF5ZXItY291bnQiLCAmdmFsMzIpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlUZW1wb3JhbExheWVyQ291bnQsIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoImNyeXB0by1kZWZhdWx0LWl2LXNpemUiLCAmdmFsMzIpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplLCB2YWwzMik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEludDMyKCJjcnlwdG8tbW9kZSIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUNyeXB0b01vZGUsIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoImNyeXB0by1lbmNyeXB0ZWQtYnl0ZS1ibG9jayIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleUVuY3J5cHRlZEJ5dGVCbG9jaywgdmFsMzIpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRJbnQzMigiY3J5cHRvLXNraXAtYnl0ZS1ibG9jayIsICZ2YWwzMikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0SW50MzIoa0tleVNraXBCeXRlQmxvY2ssIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZm9ybWF0LT5tRm9ybWF0LT5maW5kSW50MzIoInZhbGlkLXNhbXBsZXMiLCAmdmFsMzIpKSB7CisgICAgICAgICAgICBtZXRhLnNldEludDMyKGtLZXlWYWxpZFNhbXBsZXMsIHZhbDMyKTsKKyAgICAgICAgfQorICAgICAgICBzcDxBQnVmZmVyPiB2YWxidWY7CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRCdWZmZXIoImNyeXB0by1wbGFpbi1zaXplcyIsICZ2YWxidWYpKSB7CisgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleVBsYWluU2l6ZXMsCisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZTo6VHlwZTo6VFlQRV9OT05FLCB2YWxidWYtPmRhdGEoKSwgdmFsYnVmLT5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRCdWZmZXIoImNyeXB0by1lbmNyeXB0ZWQtc2l6ZXMiLCAmdmFsYnVmKSkgeworICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlFbmNyeXB0ZWRTaXplcywKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigiY3J5cHRvLWtleSIsICZ2YWxidWYpKSB7CisgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigiY3J5cHRvLWl2IiwgJnZhbGJ1ZikpIHsKKyAgICAgICAgICAgIG1ldGEuc2V0RGF0YShrS2V5Q3J5cHRvSVYsCisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZTo6VHlwZTo6VFlQRV9OT05FLCB2YWxidWYtPmRhdGEoKSwgdmFsYnVmLT5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChmb3JtYXQtPm1Gb3JtYXQtPmZpbmRCdWZmZXIoInNlaSIsICZ2YWxidWYpKSB7CisgICAgICAgICAgICBtZXRhLnNldERhdGEoa0tleVNFSSwKKyAgICAgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlOjpUeXBlOjpUWVBFX05PTkUsIHZhbGJ1Zi0+ZGF0YSgpLCB2YWxidWYtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcm1hdC0+bUZvcm1hdC0+ZmluZEJ1ZmZlcigiYXVkaW8tcHJlc2VudGF0aW9uLWluZm8iLCAmdmFsYnVmKSkgeworICAgICAgICAgICAgbWV0YS5zZXREYXRhKGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8sCisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZTo6VHlwZTo6VFlQRV9OT05FLCB2YWxidWYtPmRhdGEoKSwgdmFsYnVmLT5zaXplKCkpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIHJldmVyc2VfdHJhbnNsYXRlX2Vycm9yKHJldCk7Cit9CisKK2Jvb2wgTWVkaWFUcmFja0NVbndyYXBwZXI6OnN1cHBvcnROb25ibG9ja2luZ1JlYWQoKSB7CisgICAgcmV0dXJuIHdyYXBwZXItPnN1cHBvcnRzTm9uQmxvY2tpbmdSZWFkKHdyYXBwZXItPmRhdGEpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmNwcAppbmRleCAwNGY2YWRlLi4zZjBiYzdkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmNwcApAQCAtMTYsMTUgKzE2LDI1IEBACiAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKICNkZWZpbmUgTE9HX1RBRyAiTWV0YURhdGFVdGlscyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYXZjX3V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogYm9vbCBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoTWV0YURhdGFCYXNlICZtZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChkYXRhID09IG51bGxwdHIgfHwgc2l6ZSA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBpbnQzMl90IHdpZHRoOwogICAgIGludDMyX3QgaGVpZ2h0OwogICAgIGludDMyX3Qgc2FyV2lkdGg7CkBAIC00NiwyMSArNTYsODYgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIGlmIChtZXRhID09IG51bGxwdHIgfHwgZGF0YSA9PSBudWxscHRyIHx8IHNpemUgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50MzJfdCB3aWR0aDsKKyAgICBpbnQzMl90IGhlaWdodDsKKyAgICBpbnQzMl90IHNhcldpZHRoOworICAgIGludDMyX3Qgc2FySGVpZ2h0OworICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcigodm9pZCopZGF0YSwgIHNpemUpOworICAgIHNwPEFCdWZmZXI+IGNzZCA9IE1ha2VBVkNDb2RlY1NwZWNpZmljRGF0YShhY2Nlc3NVbml0LCAmd2lkdGgsICZoZWlnaHQsICZzYXJXaWR0aCwgJnNhckhlaWdodCk7CisgICAgaWYgKGNzZCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7CisKKyAgICBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQywgY3NkLT5kYXRhKCksIGNzZC0+c2l6ZSgpKTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgd2lkdGgpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgaGVpZ2h0KTsKKyAgICBpZiAoc2FyV2lkdGggPiAwICYmIHNhckhlaWdodCA+IDApIHsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FSX1dJRFRILCBzYXJXaWR0aCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX1NBUl9IRUlHSFQsIHNhckhlaWdodCk7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShNZXRhRGF0YUJhc2UgJm1ldGEsIGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgICAgaWYgKGRhdGEgPT0gbnVsbHB0ciB8fCBzaXplIDwgNykgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQUJpdFJlYWRlciBiaXRzKGRhdGEsIHNpemUpOworCisgICAgLy8gYWR0c19maXhlZF9oZWFkZXIKKworICAgIGlmIChiaXRzLmdldEJpdHMoMTIpICE9IDB4ZmZmdSkgeworICAgICAgICBBTE9HRSgiV3JvbmcgYXRkc19maXhlZF9oZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJpdHMuc2tpcEJpdHMoNCk7ICAvLyBJRCwgbGF5ZXIsIHByb3RlY3Rpb25fYWJzZW50CisKKyAgICB1bnNpZ25lZCBwcm9maWxlID0gYml0cy5nZXRCaXRzKDIpOworICAgIGlmIChwcm9maWxlID09IDN1KSB7CisgICAgICAgIEFMT0dFKCJwcm9maWxlIHNob3VsZCBub3QgYmUgMyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXggPSBiaXRzLmdldEJpdHMoNCk7CisgICAgYml0cy5nZXRCaXRzKDEpOyAgLy8gcHJpdmF0ZV9iaXQKKyAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24gPSBiaXRzLmdldEJpdHMoMyk7CisgICAgaWYgKGNoYW5uZWxfY29uZmlndXJhdGlvbiA9PSAwdSkgeworICAgICAgICBBTE9HRSgiY2hhbm5lbF9jb25maWcgc2hvdWxkIG5vdCBiZSAwIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIU1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgICAgIG1ldGEsIHByb2ZpbGUsIHNhbXBsaW5nX2ZyZXFfaW5kZXgsIGNoYW5uZWxfY29uZmlndXJhdGlvbikpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1ldGEuc2V0SW50MzIoa0tleUlzQURUUywgdHJ1ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKIGJvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKAotICAgICAgICBNZXRhRGF0YUJhc2UgJm1ldGEsCi0gICAgICAgIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCi0gICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbikgeworICAgICAgICB1aW50OF90ICpjc2QsIC8qIG91dCAqLworICAgICAgICBzaXplX3QgKmVzZHNfc2l6ZSwgLyogaW4vb3V0ICovCisgICAgICAgIHVuc2lnbmVkIHByb2ZpbGUsIC8qIGluICovCisgICAgICAgIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsIC8qIGluICovCisgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbiwgLyogaW4gKi8KKyAgICAgICAgaW50MzJfdCAqc2FtcGxpbmdfcmF0ZSAvKiBvdXQgKi8KKykgewogICAgIGlmKHNhbXBsaW5nX2ZyZXFfaW5kZXggPiAxMXUpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBpbnQzMl90IHNhbXBsZVJhdGU7Ci0gICAgaW50MzJfdCBjaGFubmVsQ291bnQ7CiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga1NhbXBsaW5nRnJlcVtdID0gewogICAgICAgICA5NjAwMCwgODgyMDAsIDY0MDAwLCA0ODAwMCwgNDQxMDAsIDMyMDAwLCAyNDAwMCwgMjIwNTAsCiAgICAgICAgIDE2MDAwLCAxMjAwMCwgMTEwMjUsIDgwMDAKICAgICB9OwotICAgIHNhbXBsZVJhdGUgPSBrU2FtcGxpbmdGcmVxW3NhbXBsaW5nX2ZyZXFfaW5kZXhdOwotICAgIGNoYW5uZWxDb3VudCA9IGNoYW5uZWxfY29uZmlndXJhdGlvbjsKKyAgICAqc2FtcGxpbmdfcmF0ZSA9IGtTYW1wbGluZ0ZyZXFbc2FtcGxpbmdfZnJlcV9pbmRleF07CiAKICAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrU3RhdGljRVNEU1tdID0gewogICAgICAgICAweDAzLCAyMiwKQEAgLTgzLDcgKzE1OCw5IEBACiAgICAgfTsKIAogICAgIHNpemVfdCBjc2RTaXplID0gc2l6ZW9mKGtTdGF0aWNFU0RTKSArIDI7Ci0gICAgdWludDhfdCAqY3NkID0gbmV3IHVpbnQ4X3RbY3NkU2l6ZV07CisgICAgaWYgKGNzZFNpemUgPiAqZXNkc19zaXplKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAgICAgbWVtY3B5KGNzZCwga1N0YXRpY0VTRFMsIHNpemVvZihrU3RhdGljRVNEUykpOwogCiAgICAgY3NkW3NpemVvZihrU3RhdGljRVNEUyldID0KQEAgLTkyLDE0ICsxNjksMTk3IEBACiAgICAgY3NkW3NpemVvZihrU3RhdGljRVNEUykgKyAxXSA9CiAgICAgICAgICgoc2FtcGxpbmdfZnJlcV9pbmRleCA8PCA3KSAmIDB4ODApIHwgKGNoYW5uZWxfY29uZmlndXJhdGlvbiA8PCAzKTsKIAorICAgICplc2RzX3NpemUgPSBjc2RTaXplOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCisgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbikgeworCisgICAgaWYoc2FtcGxpbmdfZnJlcV9pbmRleCA+IDExdSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdWludDhfdCBjc2RbMl07CisgICAgY3NkWzBdID0gKChwcm9maWxlICsgMSkgPDwgMykgfCAoc2FtcGxpbmdfZnJlcV9pbmRleCA+PiAxKTsKKyAgICBjc2RbMV0gPSAoKHNhbXBsaW5nX2ZyZXFfaW5kZXggPDwgNykgJiAweDgwKSB8IChjaGFubmVsX2NvbmZpZ3VyYXRpb24gPDwgMyk7CisKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrU2FtcGxpbmdGcmVxW10gPSB7CisgICAgICAgIDk2MDAwLCA4ODIwMCwgNjQwMDAsIDQ4MDAwLCA0NDEwMCwgMzIwMDAsIDI0MDAwLCAyMjA1MCwKKyAgICAgICAgMTYwMDAsIDEyMDAwLCAxMTAyNSwgODAwMAorICAgIH07CisgICAgaW50MzJfdCBzYW1wbGVSYXRlID0ga1NhbXBsaW5nRnJlcVtzYW1wbGluZ19mcmVxX2luZGV4XTsKKworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIobWV0YSwgQU1FRElBRk9STUFUX0tFWV9DU0RfMCwgY3NkLCBzaXplb2YoY3NkKSk7CisgICAgQU1lZGlhRm9ybWF0X3NldFN0cmluZyhtZXRhLCBBTUVESUFGT1JNQVRfS0VZX01JTUUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CisgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1ldGEsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsIHNhbXBsZVJhdGUpOworICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtZXRhLCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsIGNoYW5uZWxfY29uZmlndXJhdGlvbik7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgIE1ldGFEYXRhQmFzZSAmbWV0YSwKKyAgICAgICAgdW5zaWduZWQgcHJvZmlsZSwgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCwKKyAgICAgICAgdW5zaWduZWQgY2hhbm5lbF9jb25maWd1cmF0aW9uKSB7CisKKyAgICB1aW50OF90IGNzZFsyNF07CisgICAgc2l6ZV90IGNzZFNpemUgPSBzaXplb2YoY3NkKTsKKyAgICBpbnQzMl90IHNhbXBsZVJhdGU7CisKKyAgICBpZiAoIU1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShjc2QsICZjc2RTaXplLCBwcm9maWxlLCBzYW1wbGluZ19mcmVxX2luZGV4LAorICAgICAgICAgICAgY2hhbm5lbF9jb25maWd1cmF0aW9uLCAmc2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKwogICAgIG1ldGEuc2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyk7CiAKICAgICBtZXRhLnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGVSYXRlKTsKLSAgICBtZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNoYW5uZWxDb3VudCk7Ci0KKyAgICBtZXRhLnNldEludDMyKGtLZXlDaGFubmVsQ291bnQsIGNoYW5uZWxfY29uZmlndXJhdGlvbik7CiAgICAgbWV0YS5zZXREYXRhKGtLZXlFU0RTLCAwLCBjc2QsIGNzZFNpemUpOwotICAgIGRlbGV0ZSBbXSBjc2Q7CiAgICAgcmV0dXJuIHRydWU7CiB9CiAKKworc3RhdGljIHZvaWQgZXh0cmFjdEFsYnVtQXJ0KAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICAgIEFMT0dWKCJleHRyYWN0QWxidW1BcnQgZnJvbSAnJXMnIiwgKGNvbnN0IGNoYXIgKilkYXRhKTsKKworICAgIHNpemVfdCBpbkxlbiA9IHN0cm5sZW4oKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKTsKKyAgICBzaXplX3QgZmxhY1NpemUgPSBpbkxlbiAvIDQgKiAzOworICAgIHVpbnQ4X3QgKmZsYWMgPSBuZXcgdWludDhfdFtmbGFjU2l6ZV07CisgICAgaWYgKCFkZWNvZGVCYXNlNjQoZmxhYywgJmZsYWNTaXplLCAoY29uc3QgY2hhciopZGF0YSkpIHsKKyAgICAgICAgQUxPR0UoIm1hbGZvcm1lZCBiYXNlNjQgZW5jb2RlZCBkYXRhLiIpOworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgQUxPR1YoImdvdCBmbGFjIG9mIHNpemUgJXp1IiwgZmxhY1NpemUpOworCisgICAgdWludDMyX3QgcGljVHlwZTsKKyAgICB1aW50MzJfdCB0eXBlTGVuOworICAgIHVpbnQzMl90IGRlc2NMZW47CisgICAgdWludDMyX3QgZGF0YUxlbjsKKyAgICBjaGFyIHR5cGVbMTI4XTsKKworICAgIGlmIChmbGFjU2l6ZSA8IDgpIHsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHBpY1R5cGUgPSBVMzJfQVQoZmxhYyk7CisKKyAgICBpZiAocGljVHlwZSAhPSAzKSB7CisgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgZnJvbnQgY292ZXIuCisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICB0eXBlTGVuID0gVTMyX0FUKCZmbGFjWzRdKTsKKyAgICBpZiAodHlwZUxlbiA+IHNpemVvZih0eXBlKSAtIDEpIHsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIHdlJ3ZlIGFscmVhZHkgY2hlY2tlZCBhYm92ZSB0aGF0IGZsYWNTaXplID49IDgKKyAgICBpZiAoZmxhY1NpemUgLSA4IDwgdHlwZUxlbikgeworICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbWVtY3B5KHR5cGUsICZmbGFjWzhdLCB0eXBlTGVuKTsKKyAgICB0eXBlW3R5cGVMZW5dID0gJ1wwJzsKKworICAgIEFMT0dWKCJwaWNUeXBlID0gJWQsIHR5cGUgPSAnJXMnIiwgcGljVHlwZSwgdHlwZSk7CisKKyAgICBpZiAoIXN0cmNtcCh0eXBlLCAiLS0+IikpIHsKKyAgICAgICAgLy8gVGhpcyBpcyBub3QgaW5saW5lIGNvdmVyIGFydCwgYnV0IGFuIGV4dGVybmFsIHVybCBpbnN0ZWFkLgorICAgICAgICBkZWxldGVbXSBmbGFjOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGZsYWNTaXplIDwgMzIgfHwgZmxhY1NpemUgLSAzMiA8IHR5cGVMZW4pIHsKKyAgICAgICAgZGVsZXRlW10gZmxhYzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRlc2NMZW4gPSBVMzJfQVQoJmZsYWNbOCArIHR5cGVMZW5dKTsKKyAgICBpZiAoZmxhY1NpemUgLSAzMiAtIHR5cGVMZW4gPCBkZXNjTGVuKSB7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBkYXRhTGVuID0gVTMyX0FUKCZmbGFjWzggKyB0eXBlTGVuICsgNCArIGRlc2NMZW4gKyAxNl0pOworCisgICAgLy8gd2UndmUgYWxyZWFkeSBjaGVja2VkIGFib3ZlIHRoYXQgKGZsYWNTaXplIC0gMzIgLSB0eXBlTGVuIC0gZGVzY0xlbikgPj0gMAorICAgIGlmIChmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4gPCBkYXRhTGVuKSB7CisgICAgICAgIGRlbGV0ZVtdIGZsYWM7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBBTE9HVigiZ290IGltYWdlIGRhdGEsICV6dSB0cmFpbGluZyBieXRlcyIsCisgICAgICAgICBmbGFjU2l6ZSAtIDMyIC0gdHlwZUxlbiAtIGRlc2NMZW4gLSBkYXRhTGVuKTsKKworICAgIEFNZWRpYUZvcm1hdF9zZXRCdWZmZXIoZmlsZU1ldGEsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlQsCisgICAgICAgICAgICAmZmxhY1s4ICsgdHlwZUxlbiArIDQgKyBkZXNjTGVuICsgMjBdLCBkYXRhTGVuKTsKKworICAgIGRlbGV0ZVtdIGZsYWM7Cit9CisKK3ZvaWQgcGFyc2VWb3JiaXNDb21tZW50KAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhLCBjb25zdCBjaGFyICpjb21tZW50LCBzaXplX3QgY29tbWVudExlbmd0aCkgeworICAgIC8vIEhhcHRpYyB0YWcgaXMgb25seSBrZXB0IGhlcmUgYXMgaXQgd2lsbCBvbmx5IGJlIHVzZWQgaW4gZXh0cmFjdG9yIHRvIGdlbmVyYXRlIGNoYW5uZWwgbWFzay4KKyAgICBzdHJ1Y3QgeworICAgICAgICBjb25zdCBjaGFyICpjb25zdCBtVGFnOworICAgICAgICBjb25zdCBjaGFyICptS2V5OworICAgIH0ga01hcFtdID0geworICAgICAgICB7ICJUSVRMRSIsIEFNRURJQUZPUk1BVF9LRVlfVElUTEUgfSwKKyAgICAgICAgeyAiQVJUSVNUIiwgQU1FRElBRk9STUFUX0tFWV9BUlRJU1QgfSwKKyAgICAgICAgeyAiQUxCVU1BUlRJU1QiLCBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUSVNUIH0sCisgICAgICAgIHsgIkFMQlVNIEFSVElTVCIsIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QgfSwKKyAgICAgICAgeyAiQ09NUElMQVRJT04iLCBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OIH0sCisgICAgICAgIHsgIkFMQlVNIiwgQU1FRElBRk9STUFUX0tFWV9BTEJVTSB9LAorICAgICAgICB7ICJDT01QT1NFUiIsIEFNRURJQUZPUk1BVF9LRVlfQ09NUE9TRVIgfSwKKyAgICAgICAgeyAiR0VOUkUiLCBBTUVESUFGT1JNQVRfS0VZX0dFTlJFIH0sCisgICAgICAgIHsgIkFVVEhPUiIsIEFNRURJQUZPUk1BVF9LRVlfQVVUSE9SIH0sCisgICAgICAgIHsgIlRSQUNLTlVNQkVSIiwgQU1FRElBRk9STUFUX0tFWV9DRFRSQUNLTlVNQkVSIH0sCisgICAgICAgIHsgIkRJU0NOVU1CRVIiLCBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIgfSwKKyAgICAgICAgeyAiREFURSIsIEFNRURJQUZPUk1BVF9LRVlfREFURSB9LAorICAgICAgICB7ICJZRUFSIiwgQU1FRElBRk9STUFUX0tFWV9ZRUFSIH0sCisgICAgICAgIHsgIkxZUklDSVNUIiwgQU1FRElBRk9STUFUX0tFWV9MWVJJQ0lTVCB9LAorICAgICAgICB7ICJNRVRBREFUQV9CTE9DS19QSUNUVVJFIiwgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCB9LAorICAgICAgICB7ICJBTkRST0lEX0xPT1AiLCBBTUVESUFGT1JNQVRfS0VZX0xPT1AgfSwKKyAgICAgICAgeyAiQU5EUk9JRF9IQVBUSUMiLCBBTUVESUFGT1JNQVRfS0VZX0hBUFRJQ19DSEFOTkVMX0NPVU5UIH0sCisgICAgfTsKKworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNpemVvZihrTWFwKSAvIHNpemVvZihrTWFwWzBdKTsgKytqKSB7CisgICAgICAgICAgICBzaXplX3QgdGFnTGVuID0gc3RybGVuKGtNYXBbal0ubVRhZyk7CisgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKGtNYXBbal0ubVRhZywgY29tbWVudCwgdGFnTGVuKQorICAgICAgICAgICAgICAgICAgICAmJiBjb21tZW50W3RhZ0xlbl0gPT0gJz0nKSB7CisgICAgICAgICAgICAgICAgaWYgKGtNYXBbal0ubUtleSA9PSBBTUVESUFGT1JNQVRfS0VZX0FMQlVNQVJUKSB7CisgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RBbGJ1bUFydCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlTWV0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29tbWVudFt0YWdMZW4gKyAxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb21tZW50TGVuZ3RoIC0gdGFnTGVuIC0gMSk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrTWFwW2pdLm1LZXkgPT0gQU1FRElBRk9STUFUX0tFWV9MT09QKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RyY2FzZWNtcCgmY29tbWVudFt0YWdMZW4gKyAxXSwgInRydWUiKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZpbGVNZXRhLCBBTUVESUFGT1JNQVRfS0VZX0xPT1AsIDEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChrTWFwW2pdLm1LZXkgPT0gQU1FRElBRk9STUFUX0tFWV9IQVBUSUNfQ0hBTk5FTF9DT1VOVCkgeworICAgICAgICAgICAgICAgICAgICBjaGFyICplbmQ7CisgICAgICAgICAgICAgICAgICAgIGVycm5vID0gMDsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IGhhcHRpY0NoYW5uZWxDb3VudCA9IHN0cnRvbCgmY29tbWVudFt0YWdMZW4gKyAxXSwgJmVuZCwgMTApOworICAgICAgICAgICAgICAgICAgICBpZiAoZXJybm8gPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKGZpbGVNZXRhLCBrTWFwW2pdLm1LZXksIGhhcHRpY0NoYW5uZWxDb3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiRXJyb3IoJWQpIHdoZW4gcGFyc2luZyBoYXB0aWMgY2hhbm5lbCBjb3VudCIsIGVycm5vKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoZmlsZU1ldGEsIGtNYXBbal0ubUtleSwgJmNvbW1lbnRbdGFnTGVuICsgMV0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCit9CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OZGtVdGlscy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OZGtVdGlscy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNGZlNzIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvTmRrVXRpbHMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L05ka1V0aWxzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3A8TWV0YURhdGE+IGNvbnZlcnRNZWRpYUZvcm1hdFdyYXBwZXJUb01ldGFEYXRhKGNvbnN0IHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+ICZmbXQpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gZm10LT50b0FNZXNzYWdlKCk7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGE7Ci0gICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKG1zZywgbWV0YSk7Ci0gICAgcmV0dXJuIG1ldGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9OdUNhY2hlZFNvdXJjZTIuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMWQzNGZjLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051Q2FjaGVkU291cmNlMi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3NzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIk51Q2FjaGVkU291cmNlMiIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgImluY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgiCi0jaW5jbHVkZSAiaW5jbHVkZS9IVFRQQmFzZS5oIgotCi0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBQYWdlQ2FjaGUgewotICAgIGV4cGxpY2l0IFBhZ2VDYWNoZShzaXplX3QgcGFnZVNpemUpOwotICAgIH5QYWdlQ2FjaGUoKTsKLQotICAgIHN0cnVjdCBQYWdlIHsKLSAgICAgICAgdm9pZCAqbURhdGE7Ci0gICAgICAgIHNpemVfdCBtU2l6ZTsKLSAgICB9OwotCi0gICAgUGFnZSAqYWNxdWlyZVBhZ2UoKTsKLSAgICB2b2lkIHJlbGVhc2VQYWdlKFBhZ2UgKnBhZ2UpOwotCi0gICAgdm9pZCBhcHBlbmRQYWdlKFBhZ2UgKnBhZ2UpOwotICAgIHNpemVfdCByZWxlYXNlRnJvbVN0YXJ0KHNpemVfdCBtYXhCeXRlcyk7Ci0KLSAgICBzaXplX3QgdG90YWxTaXplKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVRvdGFsU2l6ZTsKLSAgICB9Ci0KLSAgICB2b2lkIGNvcHkoc2l6ZV90IGZyb20sIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotcHJpdmF0ZToKLSAgICBzaXplX3QgbVBhZ2VTaXplOwotICAgIHNpemVfdCBtVG90YWxTaXplOwotCi0gICAgTGlzdDxQYWdlICo+IG1BY3RpdmVQYWdlczsKLSAgICBMaXN0PFBhZ2UgKj4gbUZyZWVQYWdlczsKLQotICAgIHZvaWQgZnJlZVBhZ2VzKExpc3Q8UGFnZSAqPiAqbGlzdCk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQYWdlQ2FjaGUpOwotfTsKLQotUGFnZUNhY2hlOjpQYWdlQ2FjaGUoc2l6ZV90IHBhZ2VTaXplKQotICAgIDogbVBhZ2VTaXplKHBhZ2VTaXplKSwKLSAgICAgIG1Ub3RhbFNpemUoMCkgewotfQotCi1QYWdlQ2FjaGU6On5QYWdlQ2FjaGUoKSB7Ci0gICAgZnJlZVBhZ2VzKCZtQWN0aXZlUGFnZXMpOwotICAgIGZyZWVQYWdlcygmbUZyZWVQYWdlcyk7Ci19Ci0KLXZvaWQgUGFnZUNhY2hlOjpmcmVlUGFnZXMoTGlzdDxQYWdlICo+ICpsaXN0KSB7Ci0gICAgTGlzdDxQYWdlICo+OjppdGVyYXRvciBpdCA9IGxpc3QtPmJlZ2luKCk7Ci0gICAgd2hpbGUgKGl0ICE9IGxpc3QtPmVuZCgpKSB7Ci0gICAgICAgIFBhZ2UgKnBhZ2UgPSAqaXQ7Ci0KLSAgICAgICAgZnJlZShwYWdlLT5tRGF0YSk7Ci0gICAgICAgIGRlbGV0ZSBwYWdlOwotICAgICAgICBwYWdlID0gTlVMTDsKLQotICAgICAgICArK2l0OwotICAgIH0KLX0KLQotUGFnZUNhY2hlOjpQYWdlICpQYWdlQ2FjaGU6OmFjcXVpcmVQYWdlKCkgewotICAgIGlmICghbUZyZWVQYWdlcy5lbXB0eSgpKSB7Ci0gICAgICAgIExpc3Q8UGFnZSAqPjo6aXRlcmF0b3IgaXQgPSBtRnJlZVBhZ2VzLmJlZ2luKCk7Ci0gICAgICAgIFBhZ2UgKnBhZ2UgPSAqaXQ7Ci0gICAgICAgIG1GcmVlUGFnZXMuZXJhc2UoaXQpOwotCi0gICAgICAgIHJldHVybiBwYWdlOwotICAgIH0KLQotICAgIFBhZ2UgKnBhZ2UgPSBuZXcgUGFnZTsKLSAgICBwYWdlLT5tRGF0YSA9IG1hbGxvYyhtUGFnZVNpemUpOwotICAgIHBhZ2UtPm1TaXplID0gMDsKLQotICAgIHJldHVybiBwYWdlOwotfQotCi12b2lkIFBhZ2VDYWNoZTo6cmVsZWFzZVBhZ2UoUGFnZSAqcGFnZSkgewotICAgIHBhZ2UtPm1TaXplID0gMDsKLSAgICBtRnJlZVBhZ2VzLnB1c2hfYmFjayhwYWdlKTsKLX0KLQotdm9pZCBQYWdlQ2FjaGU6OmFwcGVuZFBhZ2UoUGFnZSAqcGFnZSkgewotICAgIG1Ub3RhbFNpemUgKz0gcGFnZS0+bVNpemU7Ci0gICAgbUFjdGl2ZVBhZ2VzLnB1c2hfYmFjayhwYWdlKTsKLX0KLQotc2l6ZV90IFBhZ2VDYWNoZTo6cmVsZWFzZUZyb21TdGFydChzaXplX3QgbWF4Qnl0ZXMpIHsKLSAgICBzaXplX3QgYnl0ZXNSZWxlYXNlZCA9IDA7Ci0KLSAgICB3aGlsZSAobWF4Qnl0ZXMgPiAwICYmICFtQWN0aXZlUGFnZXMuZW1wdHkoKSkgewotICAgICAgICBMaXN0PFBhZ2UgKj46Oml0ZXJhdG9yIGl0ID0gbUFjdGl2ZVBhZ2VzLmJlZ2luKCk7Ci0KLSAgICAgICAgUGFnZSAqcGFnZSA9ICppdDsKLQotICAgICAgICBpZiAobWF4Qnl0ZXMgPCBwYWdlLT5tU2l6ZSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBtQWN0aXZlUGFnZXMuZXJhc2UoaXQpOwotCi0gICAgICAgIG1heEJ5dGVzIC09IHBhZ2UtPm1TaXplOwotICAgICAgICBieXRlc1JlbGVhc2VkICs9IHBhZ2UtPm1TaXplOwotCi0gICAgICAgIHJlbGVhc2VQYWdlKHBhZ2UpOwotICAgIH0KLQotICAgIG1Ub3RhbFNpemUgLT0gYnl0ZXNSZWxlYXNlZDsKLSAgICByZXR1cm4gYnl0ZXNSZWxlYXNlZDsKLX0KLQotdm9pZCBQYWdlQ2FjaGU6OmNvcHkoc2l6ZV90IGZyb20sIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgQUxPR1YoImNvcHkgZnJvbSAlenUgc2l6ZSAlenUiLCBmcm9tLCBzaXplKTsKLQotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIENIRUNLX0xFKGZyb20gKyBzaXplLCBtVG90YWxTaXplKTsKLQotICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgIExpc3Q8UGFnZSAqPjo6aXRlcmF0b3IgaXQgPSBtQWN0aXZlUGFnZXMuYmVnaW4oKTsKLSAgICB3aGlsZSAoZnJvbSA+PSBvZmZzZXQgKyAoKml0KS0+bVNpemUpIHsKLSAgICAgICAgb2Zmc2V0ICs9ICgqaXQpLT5tU2l6ZTsKLSAgICAgICAgKytpdDsKLSAgICB9Ci0KLSAgICBzaXplX3QgZGVsdGEgPSBmcm9tIC0gb2Zmc2V0OwotICAgIHNpemVfdCBhdmFpbCA9ICgqaXQpLT5tU2l6ZSAtIGRlbHRhOwotCi0gICAgaWYgKGF2YWlsID49IHNpemUpIHsKLSAgICAgICAgbWVtY3B5KGRhdGEsIChjb25zdCB1aW50OF90ICopKCppdCktPm1EYXRhICsgZGVsdGEsIHNpemUpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbWVtY3B5KGRhdGEsIChjb25zdCB1aW50OF90ICopKCppdCktPm1EYXRhICsgZGVsdGEsIGF2YWlsKTsKLSAgICArK2l0OwotICAgIGRhdGEgPSAodWludDhfdCAqKWRhdGEgKyBhdmFpbDsKLSAgICBzaXplIC09IGF2YWlsOwotCi0gICAgd2hpbGUgKHNpemUgPiAwKSB7Ci0gICAgICAgIHNpemVfdCBjb3B5ID0gKCppdCktPm1TaXplOwotICAgICAgICBpZiAoY29weSA+IHNpemUpIHsKLSAgICAgICAgICAgIGNvcHkgPSBzaXplOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweShkYXRhLCAoKml0KS0+bURhdGEsIGNvcHkpOwotICAgICAgICBkYXRhID0gKHVpbnQ4X3QgKilkYXRhICsgY29weTsKLSAgICAgICAgc2l6ZSAtPSBjb3B5OwotICAgICAgICArK2l0OwotICAgIH0KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotTnVDYWNoZWRTb3VyY2UyOjpOdUNhY2hlZFNvdXJjZTIoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsCi0gICAgICAgIGNvbnN0IGNoYXIgKmNhY2hlQ29uZmlnLAotICAgICAgICBib29sIGRpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcmspCi0gICAgOiBtU291cmNlKHNvdXJjZSksCi0gICAgICBtUmVmbGVjdG9yKG5ldyBBSGFuZGxlclJlZmxlY3RvcjxOdUNhY2hlZFNvdXJjZTI+KHRoaXMpKSwKLSAgICAgIG1Mb29wZXIobmV3IEFMb29wZXIpLAotICAgICAgbUNhY2hlKG5ldyBQYWdlQ2FjaGUoa1BhZ2VTaXplKSksCi0gICAgICBtQ2FjaGVPZmZzZXQoMCksCi0gICAgICBtRmluYWxTdGF0dXMoT0spLAotICAgICAgbUxhc3RBY2Nlc3NQb3MoMCksCi0gICAgICBtRmV0Y2hpbmcodHJ1ZSksCi0gICAgICBtRGlzY29ubmVjdGluZyhmYWxzZSksCi0gICAgICBtTGFzdEZldGNoVGltZVVzKC0xKSwKLSAgICAgIG1OdW1SZXRyaWVzTGVmdChrTWF4TnVtUmV0cmllcyksCi0gICAgICBtSGlnaHdhdGVyVGhyZXNob2xkQnl0ZXMoa0RlZmF1bHRIaWdoV2F0ZXJUaHJlc2hvbGQpLAotICAgICAgbUxvd3dhdGVyVGhyZXNob2xkQnl0ZXMoa0RlZmF1bHRMb3dXYXRlclRocmVzaG9sZCksCi0gICAgICBtS2VlcEFsaXZlSW50ZXJ2YWxVcyhrRGVmYXVsdEtlZXBBbGl2ZUludGVydmFsVXMpLAotICAgICAgbURpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcmsoZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyaykgewotICAgIC8vIFdlIGFyZSBOT1QgZ29pbmcgdG8gc3VwcG9ydCBkaXNjb25uZWN0LWF0LWhpZ2h3YXRlcm1hcmsgaW5kZWZpbml0ZWx5Ci0gICAgLy8gYW5kIHdlIGFyZSBub3QgZ3VhcmFudGVlaW5nIHN1cHBvcnQgZm9yIGNsaWVudC1zcGVjaWZpZWQgY2FjaGUKLSAgICAvLyBwYXJhbWV0ZXJzLiBCb3RoIG9mIHRoZXNlIGFyZSB0ZW1wb3JhcnkgbWVhc3VyZXMgdG8gc29sdmUgYSBzcGVjaWZpYwotICAgIC8vIHByb2JsZW0gdGhhdCB3aWxsIGJlIHNvbHZlZCBpbiBhIGJldHRlciB3YXkgZ29pbmcgZm9yd2FyZC4KLQotICAgIHVwZGF0ZUNhY2hlUGFyYW1zRnJvbVN5c3RlbVByb3BlcnR5KCk7Ci0KLSAgICBpZiAoY2FjaGVDb25maWcgIT0gTlVMTCkgewotICAgICAgICB1cGRhdGVDYWNoZVBhcmFtc0Zyb21TdHJpbmcoY2FjaGVDb25maWcpOwotICAgIH0KLQotICAgIGlmIChtRGlzY29ubmVjdEF0SGlnaHdhdGVybWFyaykgewotICAgICAgICAvLyBNYWtlcyBubyBzZW5zZSB0byBkaXNjb25uZWN0IGFuZCBkbyBrZWVwLWFsaXZlcy4uLgotICAgICAgICBtS2VlcEFsaXZlSW50ZXJ2YWxVcyA9IDA7Ci0gICAgfQotCi0gICAgbUxvb3Blci0+c2V0TmFtZSgiTnVDYWNoZWRTb3VyY2UyIik7Ci0gICAgbUxvb3Blci0+cmVnaXN0ZXJIYW5kbGVyKG1SZWZsZWN0b3IpOwotCi0gICAgLy8gU2luY2UgaXQgbWF5IG5vdCBiZSBvYnZpb3VzIHdoeSBvdXIgbG9vcGVyIHRocmVhZCBuZWVkcyB0byBiZQotICAgIC8vIGFibGUgdG8gY2FsbCBpbnRvIGphdmEgc2luY2UgaXQgZG9lc24ndCBhcHBlYXIgdG8gZG8gc28gYXQgYWxsLi4uCi0gICAgLy8gSU1lZGlhSFRUUENvbm5lY3Rpb24gbWF5IGJlIChhbmQgbW9zdCBsaWtlbHkgaXMpIGltcGxlbWVudGVkIGluIEpBVkEKLSAgICAvLyBhbmQgYSBsb2NhbCBKQVZBIElCaW5kZXIgd2lsbCBjYWxsIGRpcmVjdGx5IGludG8gSk5JIG1ldGhvZHMuCi0gICAgLy8gU28gd2hlbmV2ZXIgd2UgY2FsbCBEYXRhU291cmNlOjpyZWFkQXQgaXQgbWF5IGVuZCB1cCBpbiBhIGNhbGwgdG8KLSAgICAvLyBJTWVkaWFIVFRQQ29ubmVjdGlvbjo6cmVhZEF0IGFuZCB0aGVyZWZvcmUgY2FsbCBiYWNrIGludG8gSkFWQS4KLSAgICBtTG9vcGVyLT5zdGFydChmYWxzZSAvKiBydW5PbkNhbGxpbmdUaHJlYWQgKi8sIHRydWUgLyogY2FuQ2FsbEphdmEgKi8pOwotCi0gICAgbU5hbWUgPSBTdHJpbmc4Ojpmb3JtYXQoIk51Q2FjaGVkU291cmNlMiglcykiLCBtU291cmNlLT50b1N0cmluZygpLnN0cmluZygpKTsKLX0KLQotTnVDYWNoZWRTb3VyY2UyOjp+TnVDYWNoZWRTb3VyY2UyKCkgewotICAgIG1Mb29wZXItPnN0b3AoKTsKLSAgICBtTG9vcGVyLT51bnJlZ2lzdGVySGFuZGxlcihtUmVmbGVjdG9yLT5pZCgpKTsKLQotICAgIGRlbGV0ZSBtQ2FjaGU7Ci0gICAgbUNhY2hlID0gTlVMTDsKLX0KLQotLy8gc3RhdGljCi1zcDxOdUNhY2hlZFNvdXJjZTI+IE51Q2FjaGVkU291cmNlMjo6Q3JlYXRlKAotICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLAotICAgICAgICBjb25zdCBjaGFyICpjYWNoZUNvbmZpZywKLSAgICAgICAgYm9vbCBkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrKSB7Ci0gICAgc3A8TnVDYWNoZWRTb3VyY2UyPiBpbnN0YW5jZSA9IG5ldyBOdUNhY2hlZFNvdXJjZTIoCi0gICAgICAgICAgICBzb3VyY2UsIGNhY2hlQ29uZmlnLCBkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrKTsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2soaW5zdGFuY2UtPm1Mb2NrKTsKLSAgICAobmV3IEFNZXNzYWdlKGtXaGF0RmV0Y2hNb3JlLCBpbnN0YW5jZS0+bVJlZmxlY3RvcikpLT5wb3N0KCk7Ci0gICAgcmV0dXJuIGluc3RhbmNlOwotfQotCi1zdGF0dXNfdCBOdUNhY2hlZFNvdXJjZTI6OmdldEVzdGltYXRlZEJhbmR3aWR0aEticHMoaW50MzJfdCAqa2JwcykgewotICAgIGlmIChtU291cmNlLT5mbGFncygpICYga0lzSFRUUEJhc2VkU291cmNlKSB7Ci0gICAgICAgIEhUVFBCYXNlKiBzb3VyY2UgPSBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihtU291cmNlLmdldCgpKTsKLSAgICAgICAgcmV0dXJuIHNvdXJjZS0+Z2V0RXN0aW1hdGVkQmFuZHdpZHRoS2JwcyhrYnBzKTsKLSAgICB9Ci0gICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwotfQotCi12b2lkIE51Q2FjaGVkU291cmNlMjo6ZGlzY29ubmVjdCgpIHsKLSAgICBpZiAobVNvdXJjZS0+ZmxhZ3MoKSAmIGtJc0hUVFBCYXNlZFNvdXJjZSkgewotICAgICAgICBBTE9HVigiZGlzY29ubmVjdGluZyBIVFRQQmFzZWRTb3VyY2UiKTsKLQotICAgICAgICB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotICAgICAgICAgICAgLy8gc2V0IG1EaXNjb25uZWN0aW5nIHRvIHRydWUsIGlmIGEgZmV0Y2ggcmV0dXJucyBhZnRlcgotICAgICAgICAgICAgLy8gdGhpcywgdGhlIHNvdXJjZSB3aWxsIGJlIG1hcmtlZCBhcyBFT1MuCi0gICAgICAgICAgICBtRGlzY29ubmVjdGluZyA9IHRydWU7Ci0KLSAgICAgICAgICAgIC8vIGV4cGxpY2l0bHkgc2lnbmFsIG1Db25kaXRpb24gc28gdGhhdCB0aGUgcGVuZGluZyByZWFkQXQoKQotICAgICAgICAgICAgLy8gd2lsbCBpbW1lZGlhdGVseSByZXR1cm4KLSAgICAgICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBleHBsaWNpdGx5IGRpc2Nvbm5lY3QgZnJvbSB0aGUgc291cmNlLCB0byBhbGxvdyBhbnkKLSAgICAgICAgLy8gcGVuZGluZyByZWFkcyB0byByZXR1cm4gbW9yZSBwcm9tcHRseQotICAgICAgICBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihtU291cmNlLmdldCgpKS0+ZGlzY29ubmVjdCgpOwotICAgIH0KLX0KLQotc3RhdHVzX3QgTnVDYWNoZWRTb3VyY2UyOjpzZXRDYWNoZVN0YXRDb2xsZWN0RnJlcShpbnQzMl90IGZyZXFNcykgewotICAgIGlmIChtU291cmNlLT5mbGFncygpICYga0lzSFRUUEJhc2VkU291cmNlKSB7Ci0gICAgICAgIEhUVFBCYXNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxIVFRQQmFzZSAqPihtU291cmNlLmdldCgpKTsKLSAgICAgICAgcmV0dXJuIHNvdXJjZS0+c2V0QmFuZHdpZHRoU3RhdENvbGxlY3RGcmVxKGZyZXFNcyk7Ci0gICAgfQotICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLX0KLQotc3RhdHVzX3QgTnVDYWNoZWRTb3VyY2UyOjppbml0Q2hlY2soKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPmluaXRDaGVjaygpOwotfQotCi1zdGF0dXNfdCBOdUNhY2hlZFNvdXJjZTI6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgewotICAgIHJldHVybiBtU291cmNlLT5nZXRTaXplKHNpemUpOwotfQotCi11aW50MzJfdCBOdUNhY2hlZFNvdXJjZTI6OmZsYWdzKCkgewotICAgIC8vIFJlbW92ZSBIVFRQIHJlbGF0ZWQgZmxhZ3Mgc2luY2UgTnVDYWNoZWRTb3VyY2UyIGlzIG5vdCBIVFRQLWJhc2VkLgotICAgIHVpbnQzMl90IGZsYWdzID0gbVNvdXJjZS0+ZmxhZ3MoKSAmIH4oa1dhbnRzUHJlZmV0Y2hpbmcgfCBrSXNIVFRQQmFzZWRTb3VyY2UpOwotICAgIHJldHVybiAoZmxhZ3MgfCBrSXNDYWNoaW5nRGF0YVNvdXJjZSk7Ci19Ci0KLXZvaWQgTnVDYWNoZWRTb3VyY2UyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgewotICAgIHN3aXRjaCAobXNnLT53aGF0KCkpIHsKLSAgICAgICAgY2FzZSBrV2hhdEZldGNoTW9yZToKLSAgICAgICAgewotICAgICAgICAgICAgb25GZXRjaCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIGtXaGF0UmVhZDoKLSAgICAgICAgewotICAgICAgICAgICAgb25SZWFkKG1zZyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBUUkVTUEFTUygpOwotICAgIH0KLX0KLQotdm9pZCBOdUNhY2hlZFNvdXJjZTI6OmZldGNoSW50ZXJuYWwoKSB7Ci0gICAgQUxPR1YoImZldGNoSW50ZXJuYWwiKTsKLQotICAgIGJvb2wgcmVjb25uZWN0ID0gZmFsc2U7Ci0KLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgICAgIENIRUNLKG1GaW5hbFN0YXR1cyA9PSBPSyB8fCBtTnVtUmV0cmllc0xlZnQgPiAwKTsKLQotICAgICAgICBpZiAobUZpbmFsU3RhdHVzICE9IE9LKSB7Ci0gICAgICAgICAgICAtLW1OdW1SZXRyaWVzTGVmdDsKLQotICAgICAgICAgICAgcmVjb25uZWN0ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChyZWNvbm5lY3QpIHsKLSAgICAgICAgc3RhdHVzX3QgZXJyID0KLSAgICAgICAgICAgIG1Tb3VyY2UtPnJlY29ubmVjdEF0T2Zmc2V0KG1DYWNoZU9mZnNldCArIG1DYWNoZS0+dG90YWxTaXplKCkpOwotCi0gICAgICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAgICAgaWYgKG1EaXNjb25uZWN0aW5nKSB7Ci0gICAgICAgICAgICBtTnVtUmV0cmllc0xlZnQgPSAwOwotICAgICAgICAgICAgbUZpbmFsU3RhdHVzID0gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfVU5TVVBQT1JURUQgfHwgZXJyID09IC1FUElQRSkgewotICAgICAgICAgICAgLy8gVGhlc2UgYXJlIGVycm9ycyB0aGF0IGFyZSBub3QgbGlrZWx5IHRvIGdvIGF3YXkgZXZlbiBpZiB3ZQotICAgICAgICAgICAgLy8gcmV0cnksIGkuZS4gdGhlIHNlcnZlciBkb2Vzbid0IHN1cHBvcnQgcmFuZ2UgcmVxdWVzdHMgb3Igc2ltaWxhci4KLSAgICAgICAgICAgIG1OdW1SZXRyaWVzTGVmdCA9IDA7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HSSgiVGhlIGF0dGVtcHQgdG8gcmVjb25uZWN0IGZhaWxlZCwgJWQgcmV0cmllcyByZW1haW5pbmciLAotICAgICAgICAgICAgICAgICBtTnVtUmV0cmllc0xlZnQpOwotCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBQYWdlQ2FjaGU6OlBhZ2UgKnBhZ2UgPSBtQ2FjaGUtPmFjcXVpcmVQYWdlKCk7Ci0KLSAgICBzc2l6ZV90IG4gPSBtU291cmNlLT5yZWFkQXQoCi0gICAgICAgICAgICBtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpLCBwYWdlLT5tRGF0YSwga1BhZ2VTaXplKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBpZiAobiA9PSAwIHx8IG1EaXNjb25uZWN0aW5nKSB7Ci0gICAgICAgIEFMT0dJKCJjYWNoaW5nIHJlYWNoZWQgZW9zLiIpOwotCi0gICAgICAgIG1OdW1SZXRyaWVzTGVmdCA9IDA7Ci0gICAgICAgIG1GaW5hbFN0YXR1cyA9IEVSUk9SX0VORF9PRl9TVFJFQU07Ci0KLSAgICAgICAgbUNhY2hlLT5yZWxlYXNlUGFnZShwYWdlKTsKLSAgICB9IGVsc2UgaWYgKG4gPCAwKSB7Ci0gICAgICAgIG1GaW5hbFN0YXR1cyA9IG47Ci0gICAgICAgIGlmIChuID09IEVSUk9SX1VOU1VQUE9SVEVEIHx8IG4gPT0gLUVQSVBFKSB7Ci0gICAgICAgICAgICAvLyBUaGVzZSBhcmUgZXJyb3JzIHRoYXQgYXJlIG5vdCBsaWtlbHkgdG8gZ28gYXdheSBldmVuIGlmIHdlCi0gICAgICAgICAgICAvLyByZXRyeSwgaS5lLiB0aGUgc2VydmVyIGRvZXNuJ3Qgc3VwcG9ydCByYW5nZSByZXF1ZXN0cyBvciBzaW1pbGFyLgotICAgICAgICAgICAgbU51bVJldHJpZXNMZWZ0ID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEFMT0dFKCJzb3VyY2UgcmV0dXJuZWQgZXJyb3IgJXpkLCAlZCByZXRyaWVzIGxlZnQiLCBuLCBtTnVtUmV0cmllc0xlZnQpOwotICAgICAgICBtQ2FjaGUtPnJlbGVhc2VQYWdlKHBhZ2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChtRmluYWxTdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dJKCJyZXRyeWluZyBhIHByZXZpb3VzbHkgZmFpbGVkIHJlYWQgc3VjY2VlZGVkLiIpOwotICAgICAgICB9Ci0gICAgICAgIG1OdW1SZXRyaWVzTGVmdCA9IGtNYXhOdW1SZXRyaWVzOwotICAgICAgICBtRmluYWxTdGF0dXMgPSBPSzsKLQotICAgICAgICBwYWdlLT5tU2l6ZSA9IG47Ci0gICAgICAgIG1DYWNoZS0+YXBwZW5kUGFnZShwYWdlKTsKLSAgICB9Ci19Ci0KLXZvaWQgTnVDYWNoZWRTb3VyY2UyOjpvbkZldGNoKCkgewotICAgIEFMT0dWKCJvbkZldGNoIik7Ci0KLSAgICBpZiAobUZpbmFsU3RhdHVzICE9IE9LICYmIG1OdW1SZXRyaWVzTGVmdCA9PSAwKSB7Ci0gICAgICAgIEFMT0dWKCJFT1MgcmVhY2hlZCwgZG9uZSBwcmVmZXRjaGluZyBmb3Igbm93Iik7Ci0gICAgICAgIG1GZXRjaGluZyA9IGZhbHNlOwotICAgIH0KLQotICAgIGJvb2wga2VlcEFsaXZlID0KLSAgICAgICAgIW1GZXRjaGluZwotICAgICAgICAgICAgJiYgbUZpbmFsU3RhdHVzID09IE9LCi0gICAgICAgICAgICAmJiBtS2VlcEFsaXZlSW50ZXJ2YWxVcyA+IDAKLSAgICAgICAgICAgICYmIEFMb29wZXI6OkdldE5vd1VzKCkgPj0gbUxhc3RGZXRjaFRpbWVVcyArIG1LZWVwQWxpdmVJbnRlcnZhbFVzOwotCi0gICAgaWYgKG1GZXRjaGluZyB8fCBrZWVwQWxpdmUpIHsKLSAgICAgICAgaWYgKGtlZXBBbGl2ZSkgewotICAgICAgICAgICAgQUxPR0koIktlZXAgYWxpdmUiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZldGNoSW50ZXJuYWwoKTsKLQotICAgICAgICBtTGFzdEZldGNoVGltZVVzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLQotICAgICAgICBpZiAobUZldGNoaW5nICYmIG1DYWNoZS0+dG90YWxTaXplKCkgPj0gbUhpZ2h3YXRlclRocmVzaG9sZEJ5dGVzKSB7Ci0gICAgICAgICAgICBBTE9HSSgiQ2FjaGUgZnVsbCwgZG9uZSBwcmVmZXRjaGluZyBmb3Igbm93Iik7Ci0gICAgICAgICAgICBtRmV0Y2hpbmcgPSBmYWxzZTsKLQotICAgICAgICAgICAgaWYgKG1EaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrCi0gICAgICAgICAgICAgICAgICAgICYmIChtU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzSFRUUEJhc2VkU291cmNlKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJEaXNjb25uZWN0aW5nIGF0IGhpZ2ggd2F0ZXJtYXJrIik7Ci0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8SFRUUEJhc2UgKj4obVNvdXJjZS5nZXQoKSktPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgICAgICAgICBtRmluYWxTdGF0dXMgPSAtRUFHQUlOOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICAgICAgcmVzdGFydFByZWZldGNoZXJJZk5lY2Vzc2FyeV9sKCk7Ci0gICAgfQotCi0gICAgaW50NjRfdCBkZWxheVVzOwotICAgIGlmIChtRmV0Y2hpbmcpIHsKLSAgICAgICAgaWYgKG1GaW5hbFN0YXR1cyAhPSBPSyAmJiBtTnVtUmV0cmllc0xlZnQgPiAwKSB7Ci0gICAgICAgICAgICAvLyBXZSBmYWlsZWQgdGhpcyB0aW1lIGFuZCB3aWxsIHRyeSBhZ2FpbiBpbiAzIHNlY29uZHMuCi0gICAgICAgICAgICBkZWxheVVzID0gMzAwMDAwMExMOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZGVsYXlVcyA9IDA7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBkZWxheVVzID0gMTAwMDAwTEw7Ci0gICAgfQotCi0gICAgKG5ldyBBTWVzc2FnZShrV2hhdEZldGNoTW9yZSwgbVJlZmxlY3RvcikpLT5wb3N0KGRlbGF5VXMpOwotfQotCi12b2lkIE51Q2FjaGVkU291cmNlMjo6b25SZWFkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgQUxPR1YoIm9uUmVhZCIpOwotCi0gICAgaW50NjRfdCBvZmZzZXQ7Ci0gICAgQ0hFQ0sobXNnLT5maW5kSW50NjQoIm9mZnNldCIsICZvZmZzZXQpKTsKLQotICAgIHZvaWQgKmRhdGE7Ci0gICAgQ0hFQ0sobXNnLT5maW5kUG9pbnRlcigiZGF0YSIsICZkYXRhKSk7Ci0KLSAgICBzaXplX3Qgc2l6ZTsKLSAgICBDSEVDSyhtc2ctPmZpbmRTaXplKCJzaXplIiwgJnNpemUpKTsKLQotICAgIHNzaXplX3QgcmVzdWx0ID0gcmVhZEludGVybmFsKG9mZnNldCwgZGF0YSwgc2l6ZSk7Ci0KLSAgICBpZiAocmVzdWx0ID09IC1FQUdBSU4pIHsKLSAgICAgICAgbXNnLT5wb3N0KDUwMDAwKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKG1EaXNjb25uZWN0aW5nKSB7Ci0gICAgICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBDSEVDSyhtQXN5bmNSZXN1bHQgPT0gTlVMTCk7Ci0KLSAgICBtQXN5bmNSZXN1bHQgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgbUFzeW5jUmVzdWx0LT5zZXRJbnQzMigicmVzdWx0IiwgcmVzdWx0KTsKLQotICAgIG1Db25kaXRpb24uc2lnbmFsKCk7Ci19Ci0KLXZvaWQgTnVDYWNoZWRTb3VyY2UyOjpyZXN0YXJ0UHJlZmV0Y2hlcklmTmVjZXNzYXJ5X2woCi0gICAgICAgIGJvb2wgaWdub3JlTG93V2F0ZXJUaHJlc2hvbGQsIGJvb2wgZm9yY2UpIHsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtHcmF5QXJlYSA9IDEwMjQgKiAxMDI0OwotCi0gICAgaWYgKG1GZXRjaGluZyB8fCAobUZpbmFsU3RhdHVzICE9IE9LICYmIG1OdW1SZXRyaWVzTGVmdCA9PSAwKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFpZ25vcmVMb3dXYXRlclRocmVzaG9sZCAmJiAhZm9yY2UKLSAgICAgICAgICAgICYmIG1DYWNoZU9mZnNldCArIG1DYWNoZS0+dG90YWxTaXplKCkgLSBtTGFzdEFjY2Vzc1BvcwotICAgICAgICAgICAgICAgID49IG1Mb3d3YXRlclRocmVzaG9sZEJ5dGVzKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzaXplX3QgbWF4Qnl0ZXMgPSBtTGFzdEFjY2Vzc1BvcyAtIG1DYWNoZU9mZnNldDsKLQotICAgIGlmICghZm9yY2UpIHsKLSAgICAgICAgaWYgKG1heEJ5dGVzIDwga0dyYXlBcmVhKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtYXhCeXRlcyAtPSBrR3JheUFyZWE7Ci0gICAgfQotCi0gICAgc2l6ZV90IGFjdHVhbEJ5dGVzID0gbUNhY2hlLT5yZWxlYXNlRnJvbVN0YXJ0KG1heEJ5dGVzKTsKLSAgICBtQ2FjaGVPZmZzZXQgKz0gYWN0dWFsQnl0ZXM7Ci0KLSAgICBBTE9HSSgicmVzdGFydGluZyBwcmVmZXRjaGVyLCB0b3RhbFNpemUgPSAlenUiLCBtQ2FjaGUtPnRvdGFsU2l6ZSgpKTsKLSAgICBtRmV0Y2hpbmcgPSB0cnVlOwotfQotCi1zc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvU2VyaWFsaXplcihtU2VyaWFsaXplcik7Ci0KLSAgICBBTE9HVigicmVhZEF0IG9mZnNldCAlbGxkLCBzaXplICV6dSIsIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgaWYgKG1EaXNjb25uZWN0aW5nKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0KLQotICAgIC8vIElmIHRoZSByZXF1ZXN0IGNhbiBiZSBjb21wbGV0ZWx5IHNhdGlzZmllZCBmcm9tIHRoZSBjYWNoZSwgZG8gc28uCi0KLSAgICBpZiAob2Zmc2V0ID49IG1DYWNoZU9mZnNldAotICAgICAgICAgICAgJiYgb2Zmc2V0ICsgc2l6ZSA8PSBtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpKSB7Ci0gICAgICAgIHNpemVfdCBkZWx0YSA9IG9mZnNldCAtIG1DYWNoZU9mZnNldDsKLSAgICAgICAgbUNhY2hlLT5jb3B5KGRlbHRhLCBkYXRhLCBzaXplKTsKLQotICAgICAgICBtTGFzdEFjY2Vzc1BvcyA9IG9mZnNldCArIHNpemU7Ci0KLSAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZShrV2hhdFJlYWQsIG1SZWZsZWN0b3IpOwotICAgIG1zZy0+c2V0SW50NjQoIm9mZnNldCIsIG9mZnNldCk7Ci0gICAgbXNnLT5zZXRQb2ludGVyKCJkYXRhIiwgZGF0YSk7Ci0gICAgbXNnLT5zZXRTaXplKCJzaXplIiwgc2l6ZSk7Ci0KLSAgICBDSEVDSyhtQXN5bmNSZXN1bHQgPT0gTlVMTCk7Ci0gICAgbXNnLT5wb3N0KCk7Ci0KLSAgICB3aGlsZSAobUFzeW5jUmVzdWx0ID09IE5VTEwgJiYgIW1EaXNjb25uZWN0aW5nKSB7Ci0gICAgICAgIG1Db25kaXRpb24ud2FpdChtTG9jayk7Ci0gICAgfQotCi0gICAgaWYgKG1EaXNjb25uZWN0aW5nKSB7Ci0gICAgICAgIG1Bc3luY1Jlc3VsdC5jbGVhcigpOwotICAgICAgICByZXR1cm4gRVJST1JfRU5EX09GX1NUUkVBTTsKLSAgICB9Ci0KLSAgICBpbnQzMl90IHJlc3VsdDsKLSAgICBDSEVDSyhtQXN5bmNSZXN1bHQtPmZpbmRJbnQzMigicmVzdWx0IiwgJnJlc3VsdCkpOwotCi0gICAgbUFzeW5jUmVzdWx0LmNsZWFyKCk7Ci0KLSAgICBpZiAocmVzdWx0ID4gMCkgewotICAgICAgICBtTGFzdEFjY2Vzc1BvcyA9IG9mZnNldCArIHJlc3VsdDsKLSAgICB9Ci0KLSAgICByZXR1cm4gKHNzaXplX3QpcmVzdWx0OwotfQotCi1zaXplX3QgTnVDYWNoZWRTb3VyY2UyOjpjYWNoZWRTaXplKCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0gICAgcmV0dXJuIG1DYWNoZU9mZnNldCArIG1DYWNoZS0+dG90YWxTaXplKCk7Ci19Ci0KLXNpemVfdCBOdUNhY2hlZFNvdXJjZTI6OmFwcHJveERhdGFSZW1haW5pbmcoc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdCB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLSAgICByZXR1cm4gYXBwcm94RGF0YVJlbWFpbmluZ19sKGZpbmFsU3RhdHVzKTsKLX0KLQotc2l6ZV90IE51Q2FjaGVkU291cmNlMjo6YXBwcm94RGF0YVJlbWFpbmluZ19sKHN0YXR1c190ICpmaW5hbFN0YXR1cykgY29uc3QgewotICAgICpmaW5hbFN0YXR1cyA9IG1GaW5hbFN0YXR1czsKLQotICAgIGlmIChtRmluYWxTdGF0dXMgIT0gT0sgJiYgbU51bVJldHJpZXNMZWZ0ID4gMCkgewotICAgICAgICAvLyBQcmV0ZW5kIHRoYXQgZXZlcnl0aGluZyBpcyBmaW5lIHVudGlsIHdlJ3JlIG91dCBvZiByZXRyaWVzLgotICAgICAgICAqZmluYWxTdGF0dXMgPSBPSzsKLSAgICB9Ci0KLSAgICBvZmY2NF90IGxhc3RCeXRlUG9zQ2FjaGVkID0gbUNhY2hlT2Zmc2V0ICsgbUNhY2hlLT50b3RhbFNpemUoKTsKLSAgICBpZiAobUxhc3RBY2Nlc3NQb3MgPCBsYXN0Qnl0ZVBvc0NhY2hlZCkgewotICAgICAgICByZXR1cm4gbGFzdEJ5dGVQb3NDYWNoZWQgLSBtTGFzdEFjY2Vzc1BvczsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLXNzaXplX3QgTnVDYWNoZWRTb3VyY2UyOjpyZWFkSW50ZXJuYWwob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSB7Ci0gICAgQ0hFQ0tfTEUoc2l6ZSwgKHNpemVfdCltSGlnaHdhdGVyVGhyZXNob2xkQnl0ZXMpOwotCi0gICAgQUxPR1YoInJlYWRJbnRlcm5hbCBvZmZzZXQgJWxsZCBzaXplICV6dSIsIChsb25nIGxvbmcpb2Zmc2V0LCBzaXplKTsKLQotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAvLyBJZiB3ZSdyZSBkaXNjb25uZWN0aW5nLCByZXR1cm4gRU9TIGFuZCBkb24ndCBhY2Nlc3MgKmRhdGEgcG9pbnRlci4KLSAgICAvLyBkYXRhIGNvdWxkIGJlIG9uIHRoZSBzdGFjayBvZiB0aGUgY2FsbGVyIHRvIE51Q2FjaGVkU291cmNlMjo6cmVhZEF0KCksCi0gICAgLy8gd2hpY2ggbWF5IGhhdmUgZXhpdGVkIGFscmVhZHkuCi0gICAgaWYgKG1EaXNjb25uZWN0aW5nKSB7Ci0gICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwotICAgIH0KLQotICAgIGlmICghbUZldGNoaW5nKSB7Ci0gICAgICAgIG1MYXN0QWNjZXNzUG9zID0gb2Zmc2V0OwotICAgICAgICByZXN0YXJ0UHJlZmV0Y2hlcklmTmVjZXNzYXJ5X2woCi0gICAgICAgICAgICAgICAgZmFsc2UsIC8vIGlnbm9yZUxvd1dhdGVyVGhyZXNob2xkCi0gICAgICAgICAgICAgICAgdHJ1ZSk7IC8vIGZvcmNlCi0gICAgfQotCi0gICAgaWYgKG9mZnNldCA8IG1DYWNoZU9mZnNldAotICAgICAgICAgICAgfHwgb2Zmc2V0ID49IChvZmY2NF90KShtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpKSkgewotICAgICAgICBzdGF0aWMgY29uc3Qgb2ZmNjRfdCBrUGFkZGluZyA9IDI1NiAqIDEwMjQ7Ci0KLSAgICAgICAgLy8gSW4gdGhlIHByZXNlbmNlIG9mIG11bHRpcGxlIGRlY29kZWQgc3RyZWFtcywgb25jZSBvZiB0aGVtIHdpbGwKLSAgICAgICAgLy8gdHJpZ2dlciB0aGlzIHNlZWsgcmVxdWVzdCwgdGhlIG90aGVyIG9uZSB3aWxsIHJlcXVlc3QgZGF0YSAibmVhcmJ5IgotICAgICAgICAvLyBzb29uLCBhZGp1c3QgdGhlIHNlZWsgcG9zaXRpb24gc28gdGhhdCB0aGF0IHN1YnNlcXVlbnQgcmVxdWVzdAotICAgICAgICAvLyBkb2VzIG5vdCB0cmlnZ2VyIGFub3RoZXIgc2Vlay4KLSAgICAgICAgb2ZmNjRfdCBzZWVrT2Zmc2V0ID0gKG9mZnNldCA+IGtQYWRkaW5nKSA/IG9mZnNldCAtIGtQYWRkaW5nIDogMDsKLQotICAgICAgICBzZWVrSW50ZXJuYWxfbChzZWVrT2Zmc2V0KTsKLSAgICB9Ci0KLSAgICBzaXplX3QgZGVsdGEgPSBvZmZzZXQgLSBtQ2FjaGVPZmZzZXQ7Ci0KLSAgICBpZiAobUZpbmFsU3RhdHVzICE9IE9LICYmIG1OdW1SZXRyaWVzTGVmdCA9PSAwKSB7Ci0gICAgICAgIGlmIChkZWx0YSA+PSBtQ2FjaGUtPnRvdGFsU2l6ZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUZpbmFsU3RhdHVzOwotICAgICAgICB9Ci0KLSAgICAgICAgc2l6ZV90IGF2YWlsID0gbUNhY2hlLT50b3RhbFNpemUoKSAtIGRlbHRhOwotCi0gICAgICAgIGlmIChhdmFpbCA+IHNpemUpIHsKLSAgICAgICAgICAgIGF2YWlsID0gc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1DYWNoZS0+Y29weShkZWx0YSwgZGF0YSwgYXZhaWwpOwotCi0gICAgICAgIHJldHVybiBhdmFpbDsKLSAgICB9Ci0KLSAgICBpZiAob2Zmc2V0ICsgc2l6ZSA8PSBtQ2FjaGVPZmZzZXQgKyBtQ2FjaGUtPnRvdGFsU2l6ZSgpKSB7Ci0gICAgICAgIG1DYWNoZS0+Y29weShkZWx0YSwgZGF0YSwgc2l6ZSk7Ci0KLSAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgQUxPR1YoImRlZmVycmluZyByZWFkIik7Ci0KLSAgICByZXR1cm4gLUVBR0FJTjsKLX0KLQotc3RhdHVzX3QgTnVDYWNoZWRTb3VyY2UyOjpzZWVrSW50ZXJuYWxfbChvZmY2NF90IG9mZnNldCkgewotICAgIG1MYXN0QWNjZXNzUG9zID0gb2Zmc2V0OwotCi0gICAgaWYgKG9mZnNldCA+PSBtQ2FjaGVPZmZzZXQKLSAgICAgICAgICAgICYmIG9mZnNldCA8PSAob2ZmNjRfdCkobUNhY2hlT2Zmc2V0ICsgbUNhY2hlLT50b3RhbFNpemUoKSkpIHsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIEFMT0dJKCJuZXcgcmFuZ2U6IG9mZnNldD0gJWxsZCIsIChsb25nIGxvbmcpb2Zmc2V0KTsKLQotICAgIG1DYWNoZU9mZnNldCA9IG9mZnNldDsKLQotICAgIHNpemVfdCB0b3RhbFNpemUgPSBtQ2FjaGUtPnRvdGFsU2l6ZSgpOwotICAgIENIRUNLX0VRKG1DYWNoZS0+cmVsZWFzZUZyb21TdGFydCh0b3RhbFNpemUpLCB0b3RhbFNpemUpOwotCi0gICAgbU51bVJldHJpZXNMZWZ0ID0ga01heE51bVJldHJpZXM7Ci0gICAgbUZldGNoaW5nID0gdHJ1ZTsKLQotICAgIHJldHVybiBPSzsKLX0KLQotdm9pZCBOdUNhY2hlZFNvdXJjZTI6OnJlc3VtZUZldGNoaW5nSWZOZWNlc3NhcnkoKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHJlc3RhcnRQcmVmZXRjaGVySWZOZWNlc3NhcnlfbCh0cnVlIC8qIGlnbm9yZSBsb3cgd2F0ZXIgdGhyZXNob2xkICovKTsKLX0KLQotc3A8RGVjcnlwdEhhbmRsZT4gTnVDYWNoZWRTb3VyY2UyOjpEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyKiBtaW1lKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPkRybUluaXRpYWxpemF0aW9uKG1pbWUpOwotfQotCi1TdHJpbmc4IE51Q2FjaGVkU291cmNlMjo6Z2V0VXJpKCkgewotICAgIHJldHVybiBtU291cmNlLT5nZXRVcmkoKTsKLX0KLQotU3RyaW5nOCBOdUNhY2hlZFNvdXJjZTI6OmdldE1JTUVUeXBlKCkgY29uc3QgewotICAgIHJldHVybiBtU291cmNlLT5nZXRNSU1FVHlwZSgpOwotfQotCi12b2lkIE51Q2FjaGVkU291cmNlMjo6dXBkYXRlQ2FjaGVQYXJhbXNGcm9tU3lzdGVtUHJvcGVydHkoKSB7Ci0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIGlmICghcHJvcGVydHlfZ2V0KCJtZWRpYS5zdGFnZWZyaWdodC5jYWNoZS1wYXJhbXMiLCB2YWx1ZSwgTlVMTCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHVwZGF0ZUNhY2hlUGFyYW1zRnJvbVN0cmluZyh2YWx1ZSk7Ci19Ci0KLXZvaWQgTnVDYWNoZWRTb3VyY2UyOjp1cGRhdGVDYWNoZVBhcmFtc0Zyb21TdHJpbmcoY29uc3QgY2hhciAqcykgewotICAgIHNzaXplX3QgbG93d2F0ZXJNYXJrS2IsIGhpZ2h3YXRlck1hcmtLYjsKLSAgICBpbnQga2VlcEFsaXZlU2VjczsKLQotICAgIGlmIChzc2NhbmYocywgIiV6ZC8lemQvJWQiLAotICAgICAgICAgICAgICAgJmxvd3dhdGVyTWFya0tiLCAmaGlnaHdhdGVyTWFya0tiLCAma2VlcEFsaXZlU2VjcykgIT0gMykgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHBhcnNlIGNhY2hlIHBhcmFtZXRlcnMgZnJvbSAnJXMnLiIsIHMpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGxvd3dhdGVyTWFya0tiID49IDApIHsKLSAgICAgICAgbUxvd3dhdGVyVGhyZXNob2xkQnl0ZXMgPSBsb3d3YXRlck1hcmtLYiAqIDEwMjQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbUxvd3dhdGVyVGhyZXNob2xkQnl0ZXMgPSBrRGVmYXVsdExvd1dhdGVyVGhyZXNob2xkOwotICAgIH0KLQotICAgIGlmIChoaWdod2F0ZXJNYXJrS2IgPj0gMCkgewotICAgICAgICBtSGlnaHdhdGVyVGhyZXNob2xkQnl0ZXMgPSBoaWdod2F0ZXJNYXJrS2IgKiAxMDI0OwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1IaWdod2F0ZXJUaHJlc2hvbGRCeXRlcyA9IGtEZWZhdWx0SGlnaFdhdGVyVGhyZXNob2xkOwotICAgIH0KLQotICAgIGlmIChtTG93d2F0ZXJUaHJlc2hvbGRCeXRlcyA+PSBtSGlnaHdhdGVyVGhyZXNob2xkQnl0ZXMpIHsKLSAgICAgICAgQUxPR0UoIklsbGVnYWwgbG93L2hpZ2h3YXRlciBtYXJrcyBzcGVjaWZpZWQsIHJldmVydGluZyB0byBkZWZhdWx0cy4iKTsKLQotICAgICAgICBtTG93d2F0ZXJUaHJlc2hvbGRCeXRlcyA9IGtEZWZhdWx0TG93V2F0ZXJUaHJlc2hvbGQ7Ci0gICAgICAgIG1IaWdod2F0ZXJUaHJlc2hvbGRCeXRlcyA9IGtEZWZhdWx0SGlnaFdhdGVyVGhyZXNob2xkOwotICAgIH0KLQotICAgIGlmIChrZWVwQWxpdmVTZWNzID49IDApIHsKLSAgICAgICAgbUtlZXBBbGl2ZUludGVydmFsVXMgPSBrZWVwQWxpdmVTZWNzICogMTAwMDAwMExMOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1LZWVwQWxpdmVJbnRlcnZhbFVzID0ga0RlZmF1bHRLZWVwQWxpdmVJbnRlcnZhbFVzOwotICAgIH0KLQotICAgIEFMT0dWKCJsb3d3YXRlciA9ICV6dSBieXRlcywgaGlnaHdhdGVyID0gJXp1IGJ5dGVzLCBrZWVwYWxpdmUgPSAlbGxkIHVzIiwKLSAgICAgICAgIG1Mb3d3YXRlclRocmVzaG9sZEJ5dGVzLAotICAgICAgICAgbUhpZ2h3YXRlclRocmVzaG9sZEJ5dGVzLAotICAgICAgICAgKGxvbmcgbG9uZyltS2VlcEFsaXZlSW50ZXJ2YWxVcyk7Ci19Ci0KLS8vIHN0YXRpYwotdm9pZCBOdUNhY2hlZFNvdXJjZTI6OlJlbW92ZUNhY2hlU3BlY2lmaWNIZWFkZXJzKAotICAgICAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgU3RyaW5nOCAqY2FjaGVDb25maWcsCi0gICAgICAgIGJvb2wgKmRpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcmspIHsKLSAgICAqY2FjaGVDb25maWcgPSBTdHJpbmc4KCk7Ci0gICAgKmRpc2Nvbm5lY3RBdEhpZ2h3YXRlcm1hcmsgPSBmYWxzZTsKLQotICAgIGlmIChoZWFkZXJzID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHNzaXplX3QgaW5kZXg7Ci0gICAgaWYgKChpbmRleCA9IGhlYWRlcnMtPmluZGV4T2ZLZXkoU3RyaW5nOCgieC1jYWNoZS1jb25maWciKSkpID49IDApIHsKLSAgICAgICAgKmNhY2hlQ29uZmlnID0gaGVhZGVycy0+dmFsdWVBdChpbmRleCk7Ci0KLSAgICAgICAgaGVhZGVycy0+cmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0KLSAgICAgICAgQUxPR1YoIlVzaW5nIHNwZWNpYWwgY2FjaGUgY29uZmlnICclcyciLCBjYWNoZUNvbmZpZy0+c3RyaW5nKCkpOwotICAgIH0KLQotICAgIGlmICgoaW5kZXggPSBoZWFkZXJzLT5pbmRleE9mS2V5KAotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCJ4LWRpc2Nvbm5lY3QtYXQtaGlnaHdhdGVybWFyayIpKSkgPj0gMCkgewotICAgICAgICAqZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyayA9IHRydWU7Ci0gICAgICAgIGhlYWRlcnMtPnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotCi0gICAgICAgIEFMT0dWKCJDbGllbnQgcmVxdWVzdGVkIGRpc2Nvbm5lY3Rpb24gYXQgaGlnaHdhdGVyIG1hcmsiKTsKLSAgICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IDQ5ZWI1ZTkuLjY2ZmI0YjAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuY3BwCkBAIC0yMSwyMiArMjEsMjIgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmg+CiAKICNpbmNsdWRlICJpbmNsdWRlL0VTRFMuaCIKLSNpbmNsdWRlICJpbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgogCisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9EYXRhU291cmNlRmFjdG9yeS5oPgorI2luY2x1ZGUgPGRhdGFzb3VyY2UvRmlsZVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZvdW5kYXRpb25VdGlscy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTgyLDcgKzgyLDcgQEAKICAgICB9CiAKICAgICBzcDxEYXRhU291cmNlPiBkYXRhU291cmNlID0KLSAgICAgICAgRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21VUkkoaHR0cFNlcnZpY2UsIHBhdGgsIGhlYWRlcnMpOworICAgICAgICBEYXRhU291cmNlRmFjdG9yeTo6Z2V0SW5zdGFuY2UoKS0+Q3JlYXRlRnJvbVVSSShodHRwU2VydmljZSwgcGF0aCwgaGVhZGVycyk7CiAKICAgICBpZiAoZGF0YVNvdXJjZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiAtRU5PRU5UOwpAQCAtMjA1LDE1ICsyMDUsNiBAQAogICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBOdU1lZGlhRXh0cmFjdG9yOjpkaXNjb25uZWN0KCkgewotICAgIGlmIChtRGF0YVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIC8vIGRpc2Nvbm5lY3QgZGF0YSBzb3VyY2UKLSAgICAgICAgaWYgKG1EYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpIHsKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PE51Q2FjaGVkU291cmNlMiAqPihtRGF0YVNvdXJjZS5nZXQoKSktPmRpc2Nvbm5lY3QoKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQogc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6dXBkYXRlRHVyYXRpb25BbmRCaXRyYXRlKCkgewogICAgIGlmIChtSW1wbC0+Y291bnRUcmFja3MoKSA+IGtNYXhUcmFja0NvdW50KSB7CiAgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKQEAgLTQ0MCwxOCArNDMxLDYgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLXZvaWQgTnVNZWRpYUV4dHJhY3Rvcjo6cmVsZWFzZU9uZVNhbXBsZShUcmFja0luZm8gKmluZm8pIHsKLSAgICBpZiAoaW5mbyA9PSBOVUxMIHx8IGluZm8tPm1TYW1wbGVzLmVtcHR5KCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGF1dG8gaXQgPSBpbmZvLT5tU2FtcGxlcy5iZWdpbigpOwotICAgIGlmIChpdC0+bUJ1ZmZlciAhPSBOVUxMKSB7Ci0gICAgICAgIGl0LT5tQnVmZmVyLT5yZWxlYXNlKCk7Ci0gICAgfQotICAgIGluZm8tPm1TYW1wbGVzLmVyYXNlKGl0KTsKLX0KLQogdm9pZCBOdU1lZGlhRXh0cmFjdG9yOjpyZWxlYXNlVHJhY2tTYW1wbGVzKFRyYWNrSW5mbyAqaW5mbykgewogICAgIGlmIChpbmZvID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwpAQCAtNDgyLDcgKzQ2MSw3IEBACiAgICAgICAgIGZldGNoVHJhY2tTYW1wbGVzKGluZm8sIHNlZWtUaW1lVXMsIG1vZGUpOwogCiAgICAgICAgIHN0YXR1c190IGVyciA9IGluZm8tPm1GaW5hbFJlc3VsdDsKLSAgICAgICAgaWYgKGVyciAhPSBPSyAmJiBlcnIgIT0gRVJST1JfRU5EX09GX1NUUkVBTSkgeworICAgICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNICYmIGluZm8tPm1TYW1wbGVzLmVtcHR5KCkpIHsKICAgICAgICAgICAgIHJldHVybiBlcnI7CiAgICAgICAgIH0KIApAQCAtNTM3LDE0ICs1MTYsNiBAQAogICAgIGluZm8tPm1GaW5hbFJlc3VsdCA9IGVycjsKICAgICBpZiAoZXJyICE9IE9LICYmIGVyciAhPSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CiAgICAgICAgIEFMT0dXKCJyZWFkIG9uIHRyYWNrICV6dSBmYWlsZWQgd2l0aCBlcnJvciAlZCIsIGluZm8tPm1UcmFja0luZGV4LCBlcnIpOwotICAgICAgICBzaXplX3QgY291bnQgPSBtZWRpYUJ1ZmZlcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKHNpemVfdCBpZCA9IDA7IGlkIDwgY291bnQ7ICsraWQpIHsKLSAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqbWJ1ZiA9IG1lZGlhQnVmZmVyc1tpZF07Ci0gICAgICAgICAgICBpZiAobWJ1ZiAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbWJ1Zi0+cmVsZWFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBzaXplX3QgY291bnQgPSBtZWRpYUJ1ZmZlcnMuc2l6ZSgpOwpAQCAtNTk0LDggKzU2NSwyNiBAQAogCiAgICAgVHJhY2tJbmZvICppbmZvID0gJm1TZWxlY3RlZFRyYWNrcy5lZGl0SXRlbUF0KG1pbkluZGV4KTsKIAotICAgIHJlbGVhc2VPbmVTYW1wbGUoaW5mbyk7CisgICAgaWYgKGluZm8gPT0gTlVMTCB8fCBpbmZvLT5tU2FtcGxlcy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KIAorICAgIGF1dG8gaXQgPSBpbmZvLT5tU2FtcGxlcy5iZWdpbigpOworICAgIGlmIChpdC0+bUJ1ZmZlciAhPSBOVUxMKSB7CisgICAgICAgIGl0LT5tQnVmZmVyLT5yZWxlYXNlKCk7CisgICAgfQorICAgIGluZm8tPm1TYW1wbGVzLmVyYXNlKGl0KTsKKworICAgIGlmIChpbmZvLT5tU2FtcGxlcy5lbXB0eSgpKSB7CisgICAgICAgIG1pbkluZGV4ID0gZmV0Y2hBbGxUcmFja1NhbXBsZXMoKTsKKyAgICAgICAgaWYgKG1pbkluZGV4IDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICAgICAgaW5mbyA9ICZtU2VsZWN0ZWRUcmFja3MuZWRpdEl0ZW1BdChtaW5JbmRleCk7CisgICAgICAgIGlmIChpbmZvID09IE5VTEwgfHwgaW5mby0+bVNhbXBsZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICB9CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC03NjYsNiArNzU1LDkgQEAKIH0KIAogc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6Z2V0TWV0cmljcyhQYXJjZWwgKnJlcGx5KSB7CisgICAgaWYgKG1JbXBsID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIC1FSU5WQUw7CisgICAgfQogICAgIHN0YXR1c190IHN0YXR1cyA9IG1JbXBsLT5nZXRNZXRyaWNzKHJlcGx5KTsKICAgICByZXR1cm4gc3RhdHVzOwogfQpAQCAtNzkwLDE2ICs3ODIsMTIgQEAKICAgICAgICAgaW50NjRfdCAqZHVyYXRpb25VcywgYm9vbCAqZW9zKSBjb25zdCB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAorICAgIG9mZjY0X3QgY2FjaGVkRGF0YVJlbWFpbmluZyA9IC0xOworICAgIHN0YXR1c190IGZpbmFsU3RhdHVzID0gbURhdGFTb3VyY2UtPmdldEF2YWlsYWJsZVNpemUoLTEsICZjYWNoZWREYXRhUmVtYWluaW5nKTsKKwogICAgIGludDY0X3QgYml0cmF0ZTsKLSAgICBpZiAoKG1EYXRhU291cmNlLT5mbGFncygpICYgRGF0YVNvdXJjZTo6a0lzQ2FjaGluZ0RhdGFTb3VyY2UpCisgICAgaWYgKGNhY2hlZERhdGFSZW1haW5pbmcgPj0gMAogICAgICAgICAgICAgJiYgZ2V0VG90YWxCaXRyYXRlKCZiaXRyYXRlKSkgewotICAgICAgICBzcDxOdUNhY2hlZFNvdXJjZTI+IGNhY2hlZFNvdXJjZSA9Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDxOdUNhY2hlZFNvdXJjZTIgKj4obURhdGFTb3VyY2UuZ2V0KCkpOwotCi0gICAgICAgIHN0YXR1c190IGZpbmFsU3RhdHVzOwotICAgICAgICBzaXplX3QgY2FjaGVkRGF0YVJlbWFpbmluZyA9Ci0gICAgICAgICAgICBjYWNoZWRTb3VyY2UtPmFwcHJveERhdGFSZW1haW5pbmcoJmZpbmFsU3RhdHVzKTsKLQogICAgICAgICAqZHVyYXRpb25VcyA9IGNhY2hlZERhdGFSZW1haW5pbmcgKiA4MDAwMDAwbGwgLyBiaXRyYXRlOwogICAgICAgICAqZW9zID0gKGZpbmFsU3RhdHVzICE9IE9LKTsKICAgICAgICAgcmV0dXJuIHRydWU7CkBAIC04MDgsNCArNzk2LDM2IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCisvLyBSZXR1cm4gT0sgaWYgd2UgaGF2ZSByZWNlaXZlZCBhbiBhdWRpbyBwcmVzZW50YXRpb24gaW5mby4KKy8vIFJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNIGlmIG5vIHRyYWNrcyBhcmUgYXZhaWxhYmxlLgorLy8gUmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEIGlmIHRoZSB0cmFjayBoYXMgbm8gYXVkaW8gcHJlc2VudGF0aW9uLgorLy8gUmV0dXJuIElOVkFMSURfT1BFUkFUSU9OIGlmIGF1ZGlvIHByZXNlbnRhdGlvbiBtZXRhZGF0YSB2ZXJzaW9uIGRvZXMgbm90IG1hdGNoLgorc3RhdHVzX3QgTnVNZWRpYUV4dHJhY3Rvcjo6Z2V0QXVkaW9QcmVzZW50YXRpb25zKAorICAgICAgICBzaXplX3QgdHJhY2tJbmRleCwgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uICpwcmVzZW50YXRpb25zKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKKyAgICBzc2l6ZV90IG1pbkluZGV4ID0gZmV0Y2hBbGxUcmFja1NhbXBsZXMoKTsKKyAgICBpZiAobWluSW5kZXggPCAwKSB7CisgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1TZWxlY3RlZFRyYWNrcy5zaXplKCk7ICsraSkgeworICAgICAgICBUcmFja0luZm8gKmluZm8gPSAmbVNlbGVjdGVkVHJhY2tzLmVkaXRJdGVtQXQoaSk7CisKKyAgICAgICAgaWYgKGluZm8tPm1UcmFja0luZGV4ID09IHRyYWNrSW5kZXgpIHsKKyAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbmV3IE1ldGFEYXRhKGluZm8tPm1TYW1wbGVzLmJlZ2luKCktPm1CdWZmZXItPm1ldGFfZGF0YSgpKTsKKworICAgICAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGE7CisgICAgICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgICAgIGlmIChtZXRhICE9IE5VTEwgJiYgbWV0YS0+ZmluZERhdGEoa0tleUF1ZGlvUHJlc2VudGF0aW9uSW5mbywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmlzdHJpbmdzdHJlYW0gaW5TdHJlYW0oc3RkOjpzdHJpbmcoc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KGRhdGEpLCBzaXplKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplQXVkaW9QcmVzZW50YXRpb25zKCZpblN0cmVhbSwgcHJlc2VudGF0aW9ucyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HVigiVHJhY2sgJXp1IGRvZXMgbm90IGNvbnRhaW4gYW55IGF1ZGlvIHByZXNlbnRhdGlvbiIsIHRyYWNrSW5kZXgpOworICAgICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCJTb3VyY2UgZG9lcyBub3QgY29udGFpbiBhbnkgYXVkaW8gcHJlc2VudGF0aW9uIik7CisgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworfQorCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ1dyaXRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjczOGZlZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09nZ1dyaXRlci5jcHAKQEAgLTAsMCArMSw0MjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIk9nZ1dyaXRlciIKKworI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuaD4KKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSA8b2dnL29nZy5oPgorfQorCisvLyBzdG9yZSB0aGUgaW50MzIgdmFsdWUgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci4KK3N0YXRpYyBpbmxpbmUgdm9pZCB3cml0ZWludChjaGFyICpidWYsIGludCBiYXNlLCBpbnQzMl90IHZhbCkgeworICAgIGJ1ZltiYXNlICsgM10gPSAoKHZhbCkgPj4gMjQpICYgMHhmZjsKKyAgICBidWZbYmFzZSArIDJdID0gKCh2YWwpID4+IDE2KSAmIDB4ZmY7CisgICAgYnVmW2Jhc2UgKyAxXSA9ICgodmFsKSA+PiA4KSAmIDB4ZmY7CisgICAgYnVmW2Jhc2VdID0gKHZhbCkmMHhmZjsKK30KKworLy8gbGlua2FnZSBiZXR3ZWVuIG91ciBoZWFkZXIgT2dnU3RyZWFtU3RhdGUgYW5kIHRoZSB1bmRlcmx5aW5nIG9nZ19zdHJlYW1fc3RhdGUKKy8vIHNvIHRoYXQgY29uc3VtZXJzIG9mIG91ciBpbnRlcmZhY2UgZG8gbm90IHJlcXVpcmUgdGhlIG9nZyBoZWFkZXJzIHRoZW1zZWx2ZXMuCitzdHJ1Y3QgT2dnU3RyZWFtU3RhdGUgOiBwdWJsaWMgb2dnX3N0cmVhbV9zdGF0ZSB7fTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitPZ2dXcml0ZXI6Ok9nZ1dyaXRlcihpbnQgZmQpCisgICAgICA6IG1GZChkdXAoZmQpKSwKKyAgICAgICAgbUhhdmVBbGxDb2RlY1NwZWNpZmljRGF0YShmYWxzZSksCisgICAgICAgIG1Jbml0Q2hlY2sobUZkIDwgMCA/IE5PX0lOSVQgOiBPSykgeworICAgIC8vIGVtcHR5Cit9CisKK09nZ1dyaXRlcjo6fk9nZ1dyaXRlcigpIHsKKyAgICBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgcmVzZXQoKTsKKyAgICB9CisKKyAgICBpZiAobUZkICE9IC0xKSB7CisgICAgICAgIGNsb3NlKG1GZCk7CisgICAgICAgIG1GZCA9IC0xOworICAgIH0KKworICAgIGZyZWUobU9zKTsKK30KKworc3RhdHVzX3QgT2dnV3JpdGVyOjppbml0Q2hlY2soKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jbml0Q2hlY2s7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6YWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBTdXBwb3J0IGlzIGxpbWl0ZWQgdG8gc2luZ2xlIHRyYWNrIG9mIE9wdXMgYXVkaW8uCisgICAgY29uc3QgY2hhciogbWltZTsKKyAgICBzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKTsKKyAgICBjb25zdCBjaGFyKiBvcHVzID0gTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUzsKKyAgICBpZiAoc3RybmNhc2VjbXAobWltZSwgb3B1cywgc3RybGVuKG9wdXMpKSkgeworICAgICAgICBBTE9HRSgiVHJhY2sgKCVzKSBvdGhlciB0aGFuICVzIGlzIG5vdCBzdXBwb3J0ZWQiLCBtaW1lLCBvcHVzKTsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIG1PcyA9IChPZ2dTdHJlYW1TdGF0ZSopIG1hbGxvYyhzaXplb2Yob2dnX3N0cmVhbV9zdGF0ZSkpOworICAgIGlmIChvZ2dfc3RyZWFtX2luaXQoKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgcmFuZCgpKSA9PSAtMSkgeworICAgICAgICBBTE9HRSgib2dnIHN0cmVhbSBpbml0IGZhaWxlZCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAvLyBXcml0ZSBPZ2cgaGVhZGVycy4KKyAgICBpbnQzMl90IG5DaGFubmVscyA9IDA7CisgICAgaWYgKCFzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleUNoYW5uZWxDb3VudCwgJm5DaGFubmVscykpIHsKKyAgICAgICAgQUxPR0UoIk1pc3NpbmcgZm9ybWF0IGtleXMgZm9yIGF1ZGlvIHRyYWNrIik7CisgICAgICAgIHNvdXJjZS0+Z2V0Rm9ybWF0KCktPmR1bXBUb0xvZygpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBzb3VyY2UtPmdldEZvcm1hdCgpLT5kdW1wVG9Mb2coKTsKKworICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IDA7CisgICAgaWYgKCFzb3VyY2UtPmdldEZvcm1hdCgpLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKSkgeworICAgICAgICBBTE9HRSgiTWlzc2luZyBmb3JtYXQga2V5IGZvciBzYW1wbGUgcmF0ZSIpOworICAgICAgICBzb3VyY2UtPmdldEZvcm1hdCgpLT5kdW1wVG9Mb2coKTsKKyAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CisgICAgfQorCisgICAgbVNhbXBsZVJhdGUgPSBzYW1wbGVSYXRlOworICAgIHVpbnQzMl90IHR5cGU7CisgICAgY29uc3Qgdm9pZCAqaGVhZGVyX2RhdGEgPSBOVUxMOworICAgIHNpemVfdCBwYWNrZXRfc2l6ZSA9IDA7CisKKyAgICBpZiAoIXNvdXJjZS0+Z2V0Rm9ybWF0KCktPmZpbmREYXRhKGtLZXlPcHVzSGVhZGVyLCAmdHlwZSwgJmhlYWRlcl9kYXRhLCAmcGFja2V0X3NpemUpKSB7CisgICAgICAgIEFMT0dWKCJvcHVzIGhlYWRlciBub3QgZm91bmQgaW4gZm9ybWF0Iik7CisgICAgfSBlbHNlIGlmIChoZWFkZXJfZGF0YSAmJiBwYWNrZXRfc2l6ZSkgeworICAgICAgICB3cml0ZU9nZ0hlYWRlclBhY2tldHMoKHVuc2lnbmVkIGNoYXIgKiloZWFkZXJfZGF0YSwgcGFja2V0X3NpemUpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dEKCJpZ25vcmluZyBpbmNvbXBsZXRlIG9wdXMgaGVhZGVyIGRhdGEgaW4gZm9ybWF0Iik7CisgICAgfQorCisgICAgbVNvdXJjZSA9IHNvdXJjZTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE9nZ1dyaXRlcjo6d3JpdGVPZ2dIZWFkZXJQYWNrZXRzKHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpIHsKKyAgICBvZ2dfcGFja2V0IG9wOworICAgIG9nZ19wYWdlIG9nOworICAgIG9wLnBhY2tldCA9IGJ1ZjsKKyAgICBvcC5ieXRlcyA9IHNpemU7CisgICAgb3AuYl9vX3MgPSAxOworICAgIG9wLmVfb19zID0gMDsKKyAgICBvcC5ncmFudWxlcG9zID0gMDsKKyAgICBvcC5wYWNrZXRubyA9IDA7CisgICAgb2dnX3N0cmVhbV9wYWNrZXRpbigob2dnX3N0cmVhbV9zdGF0ZSopbU9zLCAmb3ApOworCisgICAgaW50IHJldDsKKyAgICB3aGlsZSAoKHJldCA9IG9nZ19zdHJlYW1fZmx1c2goKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgJm9nKSkpIHsKKyAgICAgICAgaWYgKCFyZXQpIGJyZWFrOworICAgICAgICB3cml0ZShtRmQsIG9nLmhlYWRlciwgb2cuaGVhZGVyX2xlbik7CisgICAgICAgIHdyaXRlKG1GZCwgb2cuYm9keSwgb2cuYm9keV9sZW4pOworICAgIH0KKworCisgICAgY29uc3QgY2hhciogdmVuZG9yX3N0cmluZyA9ICJsaWJvcHVzIjsKKyAgICBjb25zdCBpbnQgdmVuZG9yX2xlbmd0aCA9IHN0cmxlbih2ZW5kb3Jfc3RyaW5nKTsKKyAgICBpbnQgdXNlcl9jb21tZW50X2xpc3RfbGVuZ3RoID0gMDsKKworICAgIGNvbnN0IGludCBjb21tZW50c19sZW5ndGggPSA4ICsgNCArIHZlbmRvcl9sZW5ndGggKyA0ICsgdXNlcl9jb21tZW50X2xpc3RfbGVuZ3RoOworICAgIGNoYXIqIGNvbW1lbnRzID0gKGNoYXIqKW1hbGxvYyhjb21tZW50c19sZW5ndGgpOworICAgIGlmIChjb21tZW50cyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gYWxsb2NhdGUgb2dnIGNvbW1lbnQgYnVmZmVyIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKyAgICBtZW1jcHkoY29tbWVudHMsICJPcHVzVGFncyIsIDgpOworICAgIHdyaXRlaW50KGNvbW1lbnRzLCA4LCB2ZW5kb3JfbGVuZ3RoKTsKKyAgICBtZW1jcHkoY29tbWVudHMgKyAxMiwgdmVuZG9yX3N0cmluZywgdmVuZG9yX2xlbmd0aCk7CisgICAgd3JpdGVpbnQoY29tbWVudHMsIDEyICsgdmVuZG9yX2xlbmd0aCwgdXNlcl9jb21tZW50X2xpc3RfbGVuZ3RoKTsKKworICAgIG9wLnBhY2tldCA9ICh1bnNpZ25lZCBjaGFyKiljb21tZW50czsKKyAgICBvcC5ieXRlcyA9IGNvbW1lbnRzX2xlbmd0aDsKKyAgICBvcC5iX29fcyA9IDA7CisgICAgb3AuZV9vX3MgPSAwOworICAgIG9wLmdyYW51bGVwb3MgPSAwOworICAgIG9wLnBhY2tldG5vID0gMTsKKyAgICBvZ2dfc3RyZWFtX3BhY2tldGluKChvZ2dfc3RyZWFtX3N0YXRlKiltT3MsICZvcCk7CisKKyAgICB3aGlsZSAoKHJldCA9IG9nZ19zdHJlYW1fZmx1c2goKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgJm9nKSkpIHsKKyAgICAgICAgaWYgKCFyZXQpIGJyZWFrOworICAgICAgICB3cml0ZShtRmQsIG9nLmhlYWRlciwgb2cuaGVhZGVyX2xlbik7CisgICAgICAgIHdyaXRlKG1GZCwgb2cuYm9keSwgb2cuYm9keV9sZW4pOworICAgIH0KKworICAgIGZyZWUoY29tbWVudHMpOworICAgIG1IYXZlQWxsQ29kZWNTcGVjaWZpY0RhdGEgPSB0cnVlOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgT2dnV3JpdGVyOjpzdGFydChNZXRhRGF0YSogLyogcGFyYW1zICovKSB7CisgICAgaWYgKG1Jbml0Q2hlY2sgIT0gT0spIHsKKyAgICAgICAgcmV0dXJuIG1Jbml0Q2hlY2s7CisgICAgfQorCisgICAgaWYgKG1Tb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICBpZiAobVN0YXJ0ZWQgJiYgbVBhdXNlZCkgeworICAgICAgICBtUGF1c2VkID0gZmFsc2U7CisgICAgICAgIG1SZXN1bWVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSBpZiAobVN0YXJ0ZWQpIHsKKyAgICAgICAgLy8gQWxyZWFkeSBzdGFydGVkLCBkb2VzIG5vdGhpbmcKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIHN0YXR1c190IGVyciA9IG1Tb3VyY2UtPnN0YXJ0KCk7CisKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQorCisgICAgcHRocmVhZF9hdHRyX3QgYXR0cjsKKyAgICBwdGhyZWFkX2F0dHJfaW5pdCgmYXR0cik7CisgICAgcHRocmVhZF9hdHRyX3NldGRldGFjaHN0YXRlKCZhdHRyLCBQVEhSRUFEX0NSRUFURV9KT0lOQUJMRSk7CisKKyAgICBtUmVhY2hlZEVPUyA9IGZhbHNlOworICAgIG1Eb25lID0gZmFsc2U7CisKKyAgICBwdGhyZWFkX2NyZWF0ZSgmbVRocmVhZCwgJmF0dHIsIFRocmVhZFdyYXBwZXIsIHRoaXMpOworICAgIHB0aHJlYWRfYXR0cl9kZXN0cm95KCZhdHRyKTsKKworICAgIG1TdGFydGVkID0gdHJ1ZTsKKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgT2dnV3JpdGVyOjpwYXVzZSgpIHsKKyAgICBpZiAoIW1TdGFydGVkKSB7CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgbVBhdXNlZCA9IHRydWU7CisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBPZ2dXcml0ZXI6OnJlc2V0KCkgeworICAgIGlmICghbVN0YXJ0ZWQpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIG1Eb25lID0gdHJ1ZTsKKworICAgIHZvaWQqIGR1bW15OworICAgIHB0aHJlYWRfam9pbihtVGhyZWFkLCAmZHVtbXkpOworCisgICAgc3RhdHVzX3QgZXJyID0gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihkdW1teSkpOworICAgIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbVNvdXJjZS0+c3RvcCgpOworICAgICAgICBpZiAoZXJyID09IE9LICYmIChzdGF0dXMgIT0gT0sgJiYgc3RhdHVzICE9IEVSUk9SX0VORF9PRl9TVFJFQU0pKSB7CisgICAgICAgICAgICBlcnIgPSBzdGF0dXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtU3RhcnRlZCA9IGZhbHNlOworICAgIHJldHVybiBlcnI7Cit9CisKK2Jvb2wgT2dnV3JpdGVyOjpleGNlZWRzRmlsZVNpemVMaW1pdCgpIHsKKyAgICBpZiAobU1heEZpbGVTaXplTGltaXRCeXRlcyA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIG1Fc3RpbWF0ZWRTaXplQnl0ZXMgPiBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzOworfQorCitib29sIE9nZ1dyaXRlcjo6ZXhjZWVkc0ZpbGVEdXJhdGlvbkxpbWl0KCkgeworICAgIGlmIChtTWF4RmlsZUR1cmF0aW9uTGltaXRVcyA9PSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIG1Fc3RpbWF0ZWREdXJhdGlvblVzID4gbU1heEZpbGVEdXJhdGlvbkxpbWl0VXM7Cit9CisKKy8vIHN0YXRpYwordm9pZCogT2dnV3JpdGVyOjpUaHJlYWRXcmFwcGVyKHZvaWQqIG1lKSB7CisgICAgcmV0dXJuICh2b2lkKikodWludHB0cl90KSBzdGF0aWNfY2FzdDxPZ2dXcml0ZXIqPihtZSktPnRocmVhZEZ1bmMoKTsKK30KKworc3RhdHVzX3QgT2dnV3JpdGVyOjp0aHJlYWRGdW5jKCkgeworICAgIG1Fc3RpbWF0ZWREdXJhdGlvblVzID0gMDsKKyAgICBtRXN0aW1hdGVkU2l6ZUJ5dGVzID0gMDsKKyAgICBib29sIHN0b3BwZWRQcmVtYXR1cmVseSA9IHRydWU7CisgICAgaW50NjRfdCBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgPSAwOworICAgIGludDY0X3QgbWF4VGltZXN0YW1wVXMgPSAwOworICAgIHN0YXR1c190IGVyciA9IE9LOworCisgICAgcHJjdGwoUFJfU0VUX05BTUUsICh1bnNpZ25lZCBsb25nKSJPZ2dXcml0ZXIiLCAwLCAwLCAwKTsKKworICAgIHdoaWxlICghbURvbmUpIHsKKyAgICAgICAgTWVkaWFCdWZmZXJCYXNlKiBidWZmZXIgPSBudWxscHRyOworICAgICAgICBlcnIgPSBtU291cmNlLT5yZWFkKCZidWZmZXIpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dXKCJmYWlsZWQgdG8gcmVhZCBuZXh0IGJ1ZmZlciIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAobVBhdXNlZCkgeworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbUVzdGltYXRlZFNpemVCeXRlcyArPSBidWZmZXItPnJhbmdlX2xlbmd0aCgpOworICAgICAgICBpZiAoZXhjZWVkc0ZpbGVTaXplTGltaXQoKSkgeworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgbm90aWZ5KE1FRElBX1JFQ09SREVSX0VWRU5UX0lORk8sIE1FRElBX1JFQ09SREVSX0lORk9fTUFYX0ZJTEVTSVpFX1JFQUNIRUQsIDApOworICAgICAgICAgICAgQUxPR1coImVzdGltYXRlZCBzaXplKCUiIFBSSWQ2NCAiKSBleGNlZWRzIGxpbWl0ICglIiBQUklkNjQgIikiLAorICAgICAgICAgICAgICAgICAgbUVzdGltYXRlZFNpemVCeXRlcywgbU1heEZpbGVTaXplTGltaXRCeXRlcyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgaXNDb2RlY1NwZWNpZmljOworICAgICAgICBpZiAoKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDMyKGtLZXlJc0NvZGVjQ29uZmlnLCAmaXNDb2RlY1NwZWNpZmljKQorICAgICAgICAgICAgICYmIGlzQ29kZWNTcGVjaWZpYykKKyAgICAgICAgICAgIHx8IElzT3B1c0hlYWRlcigodWludDhfdCopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlci0+cmFuZ2VfbGVuZ3RoKCkpKSB7CisgICAgICAgICAgICBpZiAobUhhdmVBbGxDb2RlY1NwZWNpZmljRGF0YSA9PSBmYWxzZSkgeworICAgICAgICAgICAgICAgIHNpemVfdCBvcHVzSGVhZFNpemUgPSAwOworICAgICAgICAgICAgICAgIHNpemVfdCBjb2RlY0RlbGF5QnVmU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgc2l6ZV90IHNlZWtQcmVSb2xsQnVmU2l6ZSA9IDA7CisgICAgICAgICAgICAgICAgdm9pZCAqb3B1c0hlYWRCdWYgPSBOVUxMOworICAgICAgICAgICAgICAgIHZvaWQgKmNvZGVjRGVsYXlCdWYgPSBOVUxMOworICAgICAgICAgICAgICAgIHZvaWQgKnNlZWtQcmVSb2xsQnVmID0gTlVMTDsKKyAgICAgICAgICAgICAgICBHZXRPcHVzSGVhZGVyQnVmZmVycygodWludDhfdCopYnVmZmVyLT5kYXRhKCkgKyBidWZmZXItPnJhbmdlX29mZnNldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5yYW5nZV9sZW5ndGgoKSwgJm9wdXNIZWFkQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9wdXNIZWFkU2l6ZSwgJmNvZGVjRGVsYXlCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29kZWNEZWxheUJ1ZlNpemUsICZzZWVrUHJlUm9sbEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWVrUHJlUm9sbEJ1ZlNpemUpOworICAgICAgICAgICAgICAgIHdyaXRlT2dnSGVhZGVyUGFja2V0cygodW5zaWduZWQgY2hhciAqKW9wdXNIZWFkQnVmLCBvcHVzSGVhZFNpemUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiaWdub3JpbmcgbGF0ZXIgY29weSBvZiBDU0QgY29udGFpbmVkIGluIGluZm8gYnVmZmVyIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSGF2ZUFsbENvZGVjU3BlY2lmaWNEYXRhID09IGZhbHNlKSB7CisgICAgICAgICAgICBBTE9HRSgiRGlkIG5vdCBnZXQgdmFsaWQgb3B1cyBoZWFkZXIgYmVmb3JlIGZpcnN0IHNhbXBsZSBkYXRhIik7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICBlcnIgPSBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3QgdGltZXN0YW1wVXM7CisgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YV9kYXRhKCkuZmluZEludDY0KGtLZXlUaW1lLCAmdGltZXN0YW1wVXMpKTsKKyAgICAgICAgaWYgKHRpbWVzdGFtcFVzID4gbUVzdGltYXRlZER1cmF0aW9uVXMpIHsKKyAgICAgICAgICAgIG1Fc3RpbWF0ZWREdXJhdGlvblVzID0gdGltZXN0YW1wVXM7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1SZXN1bWVkKSB7CisgICAgICAgICAgICBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMgKz0gKHRpbWVzdGFtcFVzIC0gbWF4VGltZXN0YW1wVXMgLSAyMDAwMCk7CisgICAgICAgICAgICBtUmVzdW1lZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdGltZXN0YW1wVXMgLT0gcHJldmlvdXNQYXVzZWREdXJhdGlvblVzOworCisgICAgICAgIEFMT0dWKCJ0aW1lIHN0YW1wOiAlIiBQUklkNjQgIiwgcHJldmlvdXMgcGF1c2VkIGR1cmF0aW9uOiAlIiBQUklkNjQsIHRpbWVzdGFtcFVzLAorICAgICAgICAgICAgICBwcmV2aW91c1BhdXNlZER1cmF0aW9uVXMpOworICAgICAgICBpZiAodGltZXN0YW1wVXMgPiBtYXhUaW1lc3RhbXBVcykgeworICAgICAgICAgICAgbWF4VGltZXN0YW1wVXMgPSB0aW1lc3RhbXBVczsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChleGNlZWRzRmlsZUR1cmF0aW9uTGltaXQoKSkgeworICAgICAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBidWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgbm90aWZ5KE1FRElBX1JFQ09SREVSX0VWRU5UX0lORk8sIE1FRElBX1JFQ09SREVSX0lORk9fTUFYX0RVUkFUSU9OX1JFQUNIRUQsIDApOworICAgICAgICAgICAgQUxPR1coImVzdGltYXRlZCBkdXJhdGlvbiglIiBQUklkNjQgIiB1cykgZXhjZWVkcyBsaW1pdCglIiBQUklkNjQgIiB1cykiLAorICAgICAgICAgICAgICAgICAgbUVzdGltYXRlZER1cmF0aW9uVXMsIG1NYXhGaWxlRHVyYXRpb25MaW1pdFVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgb2dnX3BhY2tldCBvcDsKKyAgICAgICAgb2dnX3BhZ2Ugb2c7CisgICAgICAgIG9wLnBhY2tldCA9ICh1aW50OF90KilidWZmZXItPmRhdGEoKSArIGJ1ZmZlci0+cmFuZ2Vfb2Zmc2V0KCk7CisgICAgICAgIG9wLmJ5dGVzID0gKGxvbmcpYnVmZmVyLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgb3AuYl9vX3MgPSAwOworICAgICAgICBvcC5lX29fcyA9IG1SZWFjaGVkRU9TID8gMSA6IDA7CisgICAgICAgIC8vIGdyYW51bGVwb3MgaXMgdGhlIHRvdGFsIG51bWJlciBvZiBQQ00gYXVkaW8gc2FtcGxlcyBAIDQ4IGtIeiwgdXAgdG8gYW5kCisgICAgICAgIC8vIGluY2x1ZGluZyB0aGUgY3VycmVudCBwYWNrZXQuCisgICAgICAgIG9nZ19pbnQ2NF90IGdyYW51bGVwb3MgPSAoNDgwMDAgKiBtRXN0aW1hdGVkRHVyYXRpb25VcykgLyAxMDAwMDAwOworICAgICAgICBvcC5ncmFudWxlcG9zID0gZ3JhbnVsZXBvczsKKworICAgICAgICAvLyBIZWFkZXJzIGFyZSBhdCBwYWNrZXRzIDAgYW5kIDEuCisgICAgICAgIG9wLnBhY2tldG5vID0gMiArIChvZ2dfaW50MzJfdCltQ3VycmVudFBhY2tldElkKys7CisgICAgICAgIG9nZ19zdHJlYW1fcGFja2V0aW4oKG9nZ19zdHJlYW1fc3RhdGUqKW1PcywgJm9wKTsKKyAgICAgICAgc2l6ZV90IG4gPSAwOworCisgICAgICAgIHdoaWxlIChvZ2dfc3RyZWFtX2ZsdXNoKChvZ2dfc3RyZWFtX3N0YXRlKiltT3MsICZvZykgPiAwKSB7CisgICAgICAgICAgICB3cml0ZShtRmQsIG9nLmhlYWRlciwgb2cuaGVhZGVyX2xlbik7CisgICAgICAgICAgICB3cml0ZShtRmQsIG9nLmJvZHksIG9nLmJvZHlfbGVuKTsKKyAgICAgICAgICAgIG4gPSBuICsgb2cuaGVhZGVyX2xlbiArIG9nLmJvZHlfbGVuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG4gPCBidWZmZXItPnJhbmdlX2xlbmd0aCgpKSB7CisgICAgICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICBlcnIgPSBFUlJPUl9JTzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGVyciAhPSBPSykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzdG9wcGVkUHJlbWF0dXJlbHkgPSBmYWxzZTsKKworICAgICAgICBidWZmZXItPnJlbGVhc2UoKTsKKyAgICAgICAgYnVmZmVyID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLyBlbmQgb2Ygc3RyZWFtIGlzIGFuIG9rIHRoaW5nCisgICAgaWYgKGVyciA9PSBFUlJPUl9FTkRfT0ZfU1RSRUFNKSB7CisgICAgICAgIGVyciA9IE9LOworICAgIH0KKworICAgIGlmIChlcnIgPT0gT0sgJiYgc3RvcHBlZFByZW1hdHVyZWx5KSB7CisgICAgICAgIGVyciA9IEVSUk9SX01BTEZPUk1FRDsKKyAgICB9CisKKyAgICBjbG9zZShtRmQpOworICAgIG1GZCA9IC0xOworICAgIG1SZWFjaGVkRU9TID0gdHJ1ZTsKKworICAgIHJldHVybiBlcnI7Cit9CisKK2Jvb2wgT2dnV3JpdGVyOjpyZWFjaGVkRU9TKCkgeworICAgIHJldHVybiBtUmVhY2hlZEVPUzsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmNwcAppbmRleCA5NmI4OTZiLi43OWZmZGViIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuY3BwCkBAIC0yMSw4ICsyMSw4IEBACiAjZGVmaW5lIE9NWF9BTkRST0lEX0NPTVBJTEVfQVNfMzJCSVRfT05fNjRCSVRfUExBVEZPUk1TCiAjZW5kaWYKIAorI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9wcm9wZXJ0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuaD4KQEAgLTUzLDE4ICs1MywxMyBAQAogbmFtZXNwYWNlIC8qIHVubmFtZWQgKi8gewogCiBib29sIGhhc1ByZWZpeChjb25zdCBoaWRsX3N0cmluZyYgcywgY29uc3QgY2hhciogcHJlZml4KSB7Ci0gICAgcmV0dXJuIHN0cm5jbXAocy5jX3N0cigpLCBwcmVmaXgsIHN0cmxlbihwcmVmaXgpKSA9PSAwOworICAgIHJldHVybiBzdHJuY2FzZWNtcChzLmNfc3RyKCksIHByZWZpeCwgc3RybGVuKHByZWZpeCkpID09IDA7CiB9CiAKIHN0YXR1c190IHF1ZXJ5Q2FwYWJpbGl0aWVzKAotICAgICAgICBjb25zdCBJT214U3RvcmU6Ok5vZGVJbmZvJiBub2RlLCBjb25zdCBjaGFyKiBtaW1lLCBib29sIGlzRW5jb2RlciwKKyAgICAgICAgY29uc3QgSU9teFN0b3JlOjpOb2RlSW5mbyYgbm9kZSwgY29uc3QgY2hhciogbWVkaWFUeXBlLCBib29sIGlzRW5jb2RlciwKICAgICAgICAgTWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlciogY2FwcykgewogICAgIHNwPEFDb2RlYz4gY29kZWMgPSBuZXcgQUNvZGVjKCk7Ci0gICAgc3RhdHVzX3QgZXJyID0gY29kZWMtPnF1ZXJ5Q2FwYWJpbGl0aWVzKAotICAgICAgICAgICAgbm9kZS5vd25lci5jX3N0cigpLCBub2RlLm5hbWUuY19zdHIoKSwgbWltZSwgaXNFbmNvZGVyLCBjYXBzKTsKLSAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQogICAgIGZvciAoY29uc3QgYXV0byYgYXR0cmlidXRlIDogbm9kZS5hdHRyaWJ1dGVzKSB7CiAgICAgICAgIC8vIEFsbCBmZWF0dXJlcyBoYXZlIGFuIGludDMyIHZhbHVlIGV4Y2VwdAogICAgICAgICAvLyAiZmVhdHVyZS1iaXRyYXRlLW1vZGVzIiwgd2hpY2ggaGFzIGEgc3RyaW5nIHZhbHVlLgpAQCAtODEsMTIgKzc2LDE5IEBACiAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5rZXkuY19zdHIoKSwgYXR0cmlidXRlLnZhbHVlLmNfc3RyKCkpOwogICAgICAgICB9CiAgICAgfQorICAgIC8vIHF1ZXJ5IGNhcGFiaWxpdGllcyBtYXkgcmVtb3ZlIGNhcGFiaWxpdGllcyB0aGF0IGFyZSBub3QgYWN0dWFsbHkgc3VwcG9ydGVkIGJ5IHRoZSBjb2RlYworICAgIHN0YXR1c190IGVyciA9IGNvZGVjLT5xdWVyeUNhcGFiaWxpdGllcygKKyAgICAgICAgICAgIG5vZGUub3duZXIuY19zdHIoKSwgbm9kZS5uYW1lLmNfc3RyKCksIG1lZGlhVHlwZSwgaXNFbmNvZGVyLCBjYXBzKTsKKyAgICBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIHJldHVybiBlcnI7CisgICAgfQogICAgIHJldHVybiBPSzsKIH0KIAogfSAgLy8gdW5uYW1lZCBuYW1lc3BhY2UKIAotT214SW5mb0J1aWxkZXI6Ok9teEluZm9CdWlsZGVyKCkgeworT214SW5mb0J1aWxkZXI6Ok9teEluZm9CdWlsZGVyKGJvb2wgYWxsb3dTdXJmYWNlRW5jb2RlcnMpCisgICAgOiBtQWxsb3dTdXJmYWNlRW5jb2RlcnMoYWxsb3dTdXJmYWNlRW5jb2RlcnMpIHsKIH0KIAogc3RhdHVzX3QgT214SW5mb0J1aWxkZXI6OmJ1aWxkTWVkaWFDb2RlY0xpc3QoTWVkaWFDb2RlY0xpc3RXcml0ZXIqIHdyaXRlcikgewpAQCAtMTM0LDEwNyArMTM2LDg3IEBACiAgICAgLy8gQ29udmVydCByb2xlcyB0byBsaXN0cyBvZiBjb2RlY3MKIAogICAgIC8vIGNvZGVjIG5hbWUgLT4gaW5kZXggaW50byBzd0NvZGVjcy9od0NvZGVjcwotICAgIHN0ZDo6bWFwPGhpZGxfc3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm9Xcml0ZXI+PgotICAgICAgICAgICAgc3dDb2RlY05hbWUySW5mbywgaHdDb2RlY05hbWUySW5mbzsKKyAgICBzdGQ6Om1hcDxoaWRsX3N0cmluZywgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQ29kZWNJbmZvV3JpdGVyPj4gY29kZWNOYW1lMkluZm87CiAKLSAgICBjaGFyIHJhbmtbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICB1aW50MzJfdCBkZWZhdWx0UmFuayA9IDB4MTAwOwotICAgIGlmIChwcm9wZXJ0eV9nZXQoImRlYnVnLnN0YWdlZnJpZ2h0Lm9teF9kZWZhdWx0X3JhbmsiLCByYW5rLCBudWxscHRyKSkgewotICAgICAgICBkZWZhdWx0UmFuayA9IHN0ZDo6c3RydG91bChyYW5rLCBudWxscHRyLCAxMCk7Ci0gICAgfQorICAgIHVpbnQzMl90IGRlZmF1bHRSYW5rID0KKyAgICAgICAgOjphbmRyb2lkOjpiYXNlOjpHZXRVaW50UHJvcGVydHkoImRlYnVnLnN0YWdlZnJpZ2h0Lm9teF9kZWZhdWx0X3JhbmsiLCAweDEwMHUpOworICAgIHVpbnQzMl90IGRlZmF1bHRTd0F1ZGlvUmFuayA9CisgICAgICAgIDo6YW5kcm9pZDo6YmFzZTo6R2V0VWludFByb3BlcnR5KCJkZWJ1Zy5zdGFnZWZyaWdodC5vbXhfZGVmYXVsdF9yYW5rLnN3LWF1ZGlvIiwgMHgxMHUpOworICAgIHVpbnQzMl90IGRlZmF1bHRTd090aGVyUmFuayA9CisgICAgICAgIDo6YW5kcm9pZDo6YmFzZTo6R2V0VWludFByb3BlcnR5KCJkZWJ1Zy5zdGFnZWZyaWdodC5vbXhfZGVmYXVsdF9yYW5rLnN3LW90aGVyIiwgMHgyMTB1KTsKKwogICAgIGZvciAoY29uc3QgSU9teFN0b3JlOjpSb2xlSW5mbyYgcm9sZSA6IHJvbGVzKSB7CiAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiB0eXBlTmFtZSA9IHJvbGUudHlwZTsKICAgICAgICAgYm9vbCBpc0VuY29kZXIgPSByb2xlLmlzRW5jb2RlcjsKLSAgICAgICAgYm9vbCBwcmVmZXJQbGF0Zm9ybU5vZGVzID0gcm9sZS5wcmVmZXJQbGF0Zm9ybU5vZGVzOwotICAgICAgICAvLyBJZiBwcmVmZXJQbGF0Zm9ybU5vZGVzIGlzIHRydWUsIGhhcmR3YXJlIG5vZGVzIG11c3QgYmUgYWRkZWQgYWZ0ZXIKLSAgICAgICAgLy8gcGxhdGZvcm0gKHNvZnR3YXJlKSBub2Rlcy4gaHdDb2RlY3MgaXMgdXNlZCB0byBob2xkIGhhcmR3YXJlIG5vZGVzCi0gICAgICAgIC8vIHRoYXQgbmVlZCB0byBiZSBhZGRlZCBhZnRlciBzb2Z0d2FyZSBub2RlcyBmb3IgdGhlIHNhbWUgcm9sZS4KLSAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgSU9teFN0b3JlOjpOb2RlSW5mbyo+IGh3Q29kZWNzOwotICAgICAgICBmb3IgKGNvbnN0IElPbXhTdG9yZTo6Tm9kZUluZm8mIG5vZGUgOiByb2xlLm5vZGVzKSB7CisgICAgICAgIGJvb2wgaXNBdWRpbyA9IGhhc1ByZWZpeChyb2xlLnR5cGUsICJhdWRpby8iKTsKKyAgICAgICAgYm9vbCBpc1ZpZGVvT3JJbWFnZSA9IGhhc1ByZWZpeChyb2xlLnR5cGUsICJ2aWRlby8iKSB8fCBoYXNQcmVmaXgocm9sZS50eXBlLCAiaW1hZ2UvIik7CisKKyAgICAgICAgZm9yIChjb25zdCBJT214U3RvcmU6Ok5vZGVJbmZvICZub2RlIDogcm9sZS5ub2RlcykgewogICAgICAgICAgICAgY29uc3QgaGlkbF9zdHJpbmcmIG5vZGVOYW1lID0gbm9kZS5uYW1lOworCisgICAgICAgICAgICAvLyBjdXJyZW50bHkgaW1hZ2UgYW5kIHZpZGVvIGVuY29kZXJzIHVzZSBzdXJmYWNlIGlucHV0CisgICAgICAgICAgICBpZiAoIW1BbGxvd1N1cmZhY2VFbmNvZGVycyAmJiBpc1ZpZGVvT3JJbWFnZSAmJiBpc0VuY29kZXIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZGlzYWJsaW5nICVzIGZvciBtZWRpYSB0eXBlICVzIGJlY2F1c2Ugd2UgYXJlIG5vdCB1c2luZyBPTVggaW5wdXQgc3VyZmFjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZS5jX3N0cigpLCByb2xlLnR5cGUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKICAgICAgICAgICAgIGJvb2wgaXNTb2Z0d2FyZSA9IGhhc1ByZWZpeChub2RlTmFtZSwgIk9NWC5nb29nbGUiKTsKLSAgICAgICAgICAgIE1lZGlhQ29kZWNJbmZvV3JpdGVyKiBpbmZvOwotICAgICAgICAgICAgaWYgKGlzU29mdHdhcmUpIHsKLSAgICAgICAgICAgICAgICBhdXRvIGMyaSA9IHN3Q29kZWNOYW1lMkluZm8uZmluZChub2RlTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGMyaSA9PSBzd0NvZGVjTmFtZTJJbmZvLmVuZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBNZWRpYUNvZGVjSW5mbyBmb3IgYSBuZXcgbm9kZS4KLSAgICAgICAgICAgICAgICAgICAgYzJpID0gc3dDb2RlY05hbWUySW5mby5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbm9kZU5hbWUsIHdyaXRlci0+YWRkTWVkaWFDb2RlY0luZm8oKSkpLmZpcnN0OwotICAgICAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNldE5hbWUobm9kZU5hbWUuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNldE93bmVyKG5vZGUub3duZXIuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPnNldEVuY29kZXIoaXNFbmNvZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0UmFuayhkZWZhdWx0UmFuayk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGUgaGFzIGJlZW4gc2VlbiBiZWZvcmUuIFNpbXBseSByZXRyaWV2ZSB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgTWVkaWFDb2RlY0luZm9Xcml0ZXIuCi0gICAgICAgICAgICAgICAgICAgIGluZm8gPSBjMmktPnNlY29uZC5nZXQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGF1dG8gYzJpID0gaHdDb2RlY05hbWUySW5mby5maW5kKG5vZGVOYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAoYzJpID09IGh3Q29kZWNOYW1lMkluZm8uZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IE1lZGlhQ29kZWNJbmZvIGZvciBhIG5ldyBub2RlLgotICAgICAgICAgICAgICAgICAgICBpZiAoIXByZWZlclBsYXRmb3JtTm9kZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMyaSA9IGh3Q29kZWNOYW1lMkluZm8uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSwgd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpKSkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXROYW1lKG5vZGVOYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0T3duZXIobm9kZS5vd25lci5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldEVuY29kZXIoaXNFbmNvZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZm8tPnNldFJhbmsoZGVmYXVsdFJhbmspOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgcHJlZmVyUGxhdGZvcm1Ob2RlcyBpcyB0cnVlLCB0aGlzIG5vZGUgbXVzdCBiZQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkZWQgYWZ0ZXIgYWxsIHNvZnR3YXJlIG5vZGVzLgotICAgICAgICAgICAgICAgICAgICAgICAgaHdDb2RlY3MucHVzaF9iYWNrKCZub2RlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgdWludDMyX3QgcmFuayA9IGlzU29mdHdhcmUKKyAgICAgICAgICAgICAgICAgICAgPyAoaXNBdWRpbyA/IGRlZmF1bHRTd0F1ZGlvUmFuayA6IGRlZmF1bHRTd090aGVyUmFuaykKKyAgICAgICAgICAgICAgICAgICAgOiBkZWZhdWx0UmFuazsKKyAgICAgICAgICAgIC8vIGdldCByYW5rIGZyb20gSU9teFN0b3JlIHZpYSBhdHRyaWJ1dGUKKyAgICAgICAgICAgIGZvciAoY29uc3QgSU9teFN0b3JlOjpBdHRyaWJ1dGUmIGF0dHJpYnV0ZSA6IG5vZGUuYXR0cmlidXRlcykgeworICAgICAgICAgICAgICAgIGlmIChhdHRyaWJ1dGUua2V5ID09ICJyYW5rIikgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBvbGRSYW5rID0gcmFuazsKKyAgICAgICAgICAgICAgICAgICAgY2hhciBkdW1teTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNzY2FuZihhdHRyaWJ1dGUudmFsdWUuY19zdHIoKSwgIiV1JWMiLCAmcmFuaywgJmR1bW15KSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByYW5rID0gb2xkUmFuazsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZSBub2RlIGhhcyBiZWVuIHNlZW4gYmVmb3JlLiBTaW1wbHkgcmV0cmlldmUgdGhlCi0gICAgICAgICAgICAgICAgICAgIC8vIGV4aXN0aW5nIE1lZGlhQ29kZWNJbmZvV3JpdGVyLgotICAgICAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgTWVkaWFDb2RlY0luZm9Xcml0ZXIqIGluZm87CisgICAgICAgICAgICBhdXRvIGMyaSA9IGNvZGVjTmFtZTJJbmZvLmZpbmQobm9kZU5hbWUpOworICAgICAgICAgICAgaWYgKGMyaSA9PSBjb2RlY05hbWUySW5mby5lbmQoKSkgeworICAgICAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBNZWRpYUNvZGVjSW5mbyBmb3IgYSBuZXcgbm9kZS4KKyAgICAgICAgICAgICAgICBjMmkgPSBjb2RlY05hbWUySW5mby5pbnNlcnQoc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgICAgICAgICBub2RlTmFtZSwgd3JpdGVyLT5hZGRNZWRpYUNvZGVjSW5mbygpKSkuZmlyc3Q7CisgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOworICAgICAgICAgICAgICAgIGluZm8tPnNldE5hbWUobm9kZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgaW5mby0+c2V0T3duZXIobm9kZS5vd25lci5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBpbmZvLT5zZXRSYW5rKHJhbmspOworCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8TWVkaWFDb2RlY0luZm86OkF0dHJpYnV0ZXM+Ojp0eXBlIGF0dHJzID0gMDsKKyAgICAgICAgICAgICAgICAvLyBhbGwgT01YIGNvZGVjcyBhcmUgdmVuZG9yIGNvZGVjcyAoaW4gdGhlIHZlbmRvciBwYXJ0aXRpb24pLCBidXQKKyAgICAgICAgICAgICAgICAvLyB0cmVhdCBPTVguZ29vZ2xlIGNvZGVjcyBhcyBub24taGFyZHdhcmUtYWNjZWxlcmF0ZWQgYW5kIG5vbi12ZW5kb3IKKyAgICAgICAgICAgICAgICBpZiAoIWlzU29mdHdhcmUpIHsKKyAgICAgICAgICAgICAgICAgICAgYXR0cnMgfD0gTWVkaWFDb2RlY0luZm86OmtGbGFnSXNWZW5kb3I7CisgICAgICAgICAgICAgICAgICAgIGlmICghc3RkOjpjb3VudF9pZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlLmF0dHJpYnV0ZXMuYmVnaW4oKSwgbm9kZS5hdHRyaWJ1dGVzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IElPbXhTdG9yZTo6QXR0cmlidXRlICZpKSAtPiBib29sIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGkua2V5ID09ICJhdHRyaWJ1dGU6OnNvZnR3YXJlLWNvZGVjIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXR0cnMgfD0gTWVkaWFDb2RlY0luZm86OmtGbGFnSXNIYXJkd2FyZUFjY2VsZXJhdGVkOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChpc0VuY29kZXIpIHsKKyAgICAgICAgICAgICAgICAgICAgYXR0cnMgfD0gTWVkaWFDb2RlY0luZm86OmtGbGFnSXNFbmNvZGVyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbmZvLT5zZXRBdHRyaWJ1dGVzKGF0dHJzKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIG5vZGUgaGFzIGJlZW4gc2VlbiBiZWZvcmUuIFNpbXBseSByZXRyaWV2ZSB0aGUKKyAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBNZWRpYUNvZGVjSW5mb1dyaXRlci4KKyAgICAgICAgICAgICAgICBpbmZvID0gYzJpLT5zZWNvbmQuZ2V0KCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4gY2FwcyA9Ci0gICAgICAgICAgICAgICAgICAgIGluZm8tPmFkZE1pbWUodHlwZU5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGluZm8tPmFkZE1lZGlhVHlwZSh0eXBlTmFtZS5jX3N0cigpKTsKICAgICAgICAgICAgIGlmIChxdWVyeUNhcGFiaWxpdGllcygKICAgICAgICAgICAgICAgICAgICAgbm9kZSwgdHlwZU5hbWUuY19zdHIoKSwgaXNFbmNvZGVyLCBjYXBzLmdldCgpKSAhPSBPSykgewotICAgICAgICAgICAgICAgIEFMT0dXKCJGYWlsIHRvIGFkZCBtaW1lICVzIHRvIGNvZGVjICVzIiwKKyAgICAgICAgICAgICAgICBBTE9HVygiRmFpbCB0byBhZGQgbWVkaWEgdHlwZSAlcyB0byBjb2RlYyAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlTmFtZS5jX3N0cigpLCBub2RlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBpbmZvLT5yZW1vdmVNaW1lKHR5cGVOYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgcHJlZmVyUGxhdGZvcm1Ob2RlcyBpcyB0cnVlLCBoYXJkd2FyZSBub2RlcyB3aWxsIG5vdCBoYXZlIGJlZW4KLSAgICAgICAgLy8gYWRkZWQgaW4gdGhlIGxvb3AgYWJvdmUsIGJ1dCByYXRoZXIgc2F2ZWQgaW4gaHdDb2RlY3MuIFRoZXkgYXJlCi0gICAgICAgIC8vIGdvaW5nIHRvIGJlIGFkZGVkIGhlcmUuCi0gICAgICAgIGlmIChwcmVmZXJQbGF0Zm9ybU5vZGVzKSB7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IElPbXhTdG9yZTo6Tm9kZUluZm8gKm5vZGUgOiBod0NvZGVjcykgewotICAgICAgICAgICAgICAgIE1lZGlhQ29kZWNJbmZvV3JpdGVyKiBpbmZvOwotICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBub2RlTmFtZSA9IG5vZGUtPm5hbWU7Ci0gICAgICAgICAgICAgICAgYXV0byBjMmkgPSBod0NvZGVjTmFtZTJJbmZvLmZpbmQobm9kZU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChjMmkgPT0gaHdDb2RlY05hbWUySW5mby5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgTWVkaWFDb2RlY0luZm8gZm9yIGEgbmV3IG5vZGUuCi0gICAgICAgICAgICAgICAgICAgIGMyaSA9IGh3Q29kZWNOYW1lMkluZm8uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVOYW1lLCB3cml0ZXItPmFkZE1lZGlhQ29kZWNJbmZvKCkpKS5maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXROYW1lKG5vZGVOYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRPd25lcihub2RlLT5vd25lci5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICAgICAgaW5mby0+c2V0RW5jb2Rlcihpc0VuY29kZXIpOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5zZXRSYW5rKGRlZmF1bHRSYW5rKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbm9kZSBoYXMgYmVlbiBzZWVuIGJlZm9yZS4gU2ltcGx5IHJldHJpZXZlIHRoZQotICAgICAgICAgICAgICAgICAgICAvLyBleGlzdGluZyBNZWRpYUNvZGVjSW5mb1dyaXRlci4KLSAgICAgICAgICAgICAgICAgICAgaW5mbyA9IGMyaS0+c2Vjb25kLmdldCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllc1dyaXRlcj4gY2FwcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbmZvLT5hZGRNaW1lKHR5cGVOYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIGlmIChxdWVyeUNhcGFiaWxpdGllcygKLSAgICAgICAgICAgICAgICAgICAgICAgICpub2RlLCB0eXBlTmFtZS5jX3N0cigpLCBpc0VuY29kZXIsIGNhcHMuZ2V0KCkpICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJGYWlsIHRvIGFkZCBtaW1lICVzIHRvIGNvZGVjICVzICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgImFmdGVyIHNvZnR3YXJlIGNvZGVjcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVOYW1lLmNfc3RyKCksIG5vZGVOYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICBpbmZvLT5yZW1vdmVNaW1lKHR5cGVOYW1lLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpbmZvLT5yZW1vdmVNZWRpYVR5cGUodHlwZU5hbWUuY19zdHIoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CkBAIC0yNDIsNCArMjI0LDMgQEAKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IDlkMmM0MmIuLjI5YzNhMzUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiUmVtb3RlTWVkaWFFeHRyYWN0b3IiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQW5hbHl0aWNzSXRlbS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhU291cmNlLmg+CkBAIC00OSw3ICs1MCwxMiBAQAogCiAgICAgbUFuYWx5dGljc0l0ZW0gPSBudWxscHRyOwogICAgIGlmIChNRURJQV9MT0cpIHsKLSAgICAgICAgbUFuYWx5dGljc0l0ZW0gPSBuZXcgTWVkaWFBbmFseXRpY3NJdGVtKGtLZXlFeHRyYWN0b3IpOworICAgICAgICBtQW5hbHl0aWNzSXRlbSA9IE1lZGlhQW5hbHl0aWNzSXRlbTo6Y3JlYXRlKGtLZXlFeHRyYWN0b3IpOworCisgICAgICAgIC8vIHdlJ3JlIGluIHRoZSBleHRyYWN0b3Igc2VydmljZSwgd2Ugd2FudCB0byBhdHRyaWJ1dGUgdG8gdGhlIGFwcAorICAgICAgICAvLyB0aGF0IGludm9rZWQgdXMuCisgICAgICAgIGludCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgICAgIG1BbmFseXRpY3NJdGVtLT5zZXRVaWQodWlkKTsKIAogICAgICAgICAvLyB0cmFjayB0aGUgY29udGFpbmVyIGZvcm1hdCAobXBlZywgYWFjLCB3dm0sIGV0YykKICAgICAgICAgc2l6ZV90IG50cmFja3MgPSBleHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5jcHAKaW5kZXggZDA3YWZlYy4uZGIzMWFmMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmNwcApAQCAtMjUsMjUgKzI1LDI5IEBACiAgICAgICAgIE1lZGlhVHJhY2sgKnNvdXJjZSwKICAgICAgICAgY29uc3Qgc3A8UmVmQmFzZT4gJnBsdWdpbikKICAgICA6IG1FeHRyYWN0b3IoZXh0cmFjdG9yKSwKLSAgICAgIG1Tb3VyY2Uoc291cmNlKSwKKyAgICAgIG1UcmFjayhzb3VyY2UpLAogICAgICAgbUV4dHJhY3RvclBsdWdpbihwbHVnaW4pIHt9CiAKIFJlbW90ZU1lZGlhU291cmNlOjp+UmVtb3RlTWVkaWFTb3VyY2UoKSB7Ci0gICAgZGVsZXRlIG1Tb3VyY2U7CisgICAgZGVsZXRlIG1UcmFjazsKICAgICBtRXh0cmFjdG9yUGx1Z2luID0gbnVsbHB0cjsKIH0KIAogc3RhdHVzX3QgUmVtb3RlTWVkaWFTb3VyY2U6OnN0YXJ0KE1ldGFEYXRhICpwYXJhbXMpIHsKLSAgICByZXR1cm4gbVNvdXJjZS0+c3RhcnQocGFyYW1zKTsKKyAgICBpZiAocGFyYW1zKSB7CisgICAgICAgIEFMT0dXKCJkcm9wcGluZyBzdGFydCBwYXJhbWV0ZXJzOiIpOworICAgICAgICBwYXJhbXMtPmR1bXBUb0xvZygpOworICAgIH0KKyAgICByZXR1cm4gbVRyYWNrLT5zdGFydCgpOwogfQogCiBzdGF0dXNfdCBSZW1vdGVNZWRpYVNvdXJjZTo6c3RvcCgpIHsKLSAgICByZXR1cm4gbVNvdXJjZS0+c3RvcCgpOworICAgIHJldHVybiBtVHJhY2stPnN0b3AoKTsKIH0KIAogc3A8TWV0YURhdGE+IFJlbW90ZU1lZGlhU291cmNlOjpnZXRGb3JtYXQoKSB7CiAgICAgc3A8TWV0YURhdGE+IG1ldGEgPSBuZXcgTWV0YURhdGEoKTsKLSAgICBpZiAobVNvdXJjZS0+Z2V0Rm9ybWF0KCptZXRhLmdldCgpKSA9PSBPSykgeworICAgIGlmIChtVHJhY2stPmdldEZvcm1hdCgqbWV0YS5nZXQoKSkgPT0gT0spIHsKICAgICAgICAgcmV0dXJuIG1ldGE7CiAgICAgfQogICAgIHJldHVybiBudWxscHRyOwpAQCAtNTEsNyArNTUsMTEgQEAKIAogc3RhdHVzX3QgUmVtb3RlTWVkaWFTb3VyY2U6OnJlYWQoCiAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgY29uc3QgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zICpvcHRpb25zKSB7Ci0gICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWQoYnVmZmVyLCByZWludGVycHJldF9jYXN0PGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyo+KG9wdGlvbnMpKTsKKyAgICByZXR1cm4gbVRyYWNrLT5yZWFkKGJ1ZmZlciwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnMqPihvcHRpb25zKSk7Cit9CisKK2Jvb2wgUmVtb3RlTWVkaWFTb3VyY2U6OnN1cHBvcnROb25ibG9ja2luZ1JlYWQoKSB7CisgICAgcmV0dXJuIG1UcmFjay0+c3VwcG9ydE5vbmJsb2NraW5nUmVhZCgpOwogfQogCiBzdGF0dXNfdCBSZW1vdGVNZWRpYVNvdXJjZTo6cGF1c2UoKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5jcHAKaW5kZXggNDA0YzUzNy4uYjgwOTg0OCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU2ltcGxlRGVjb2RpbmdTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1NpbXBsZURlY29kaW5nU291cmNlLmNwcApAQCAtMjAsNyArMjAsNyBAQAogCiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgpAQCAtMzcsNiArMzcsNyBAQAogCiBjb25zdCBpbnQ2NF90IGtUaW1lb3V0V2FpdEZvck91dHB1dFVzID0gNTAwMDAwOyAvLyAwLjUgc2Vjb25kcwogY29uc3QgaW50NjRfdCBrVGltZW91dFdhaXRGb3JJbnB1dFVzID0gNTAwMDsgLy8gNSBtaWxsaXNlY29uZHMKK2NvbnN0IGludCBrVGltZW91dE1heFJldHJpZXMgPSAyMDsKIAogLy9zdGF0aWMKIHNwPFNpbXBsZURlY29kaW5nU291cmNlPiBTaW1wbGVEZWNvZGluZ1NvdXJjZTo6Q3JlYXRlKApAQCAtMjQyLDcgKzI0Myw3IEBACiAgICAgICAgIHJldHVybiBFUlJPUl9FTkRfT0ZfU1RSRUFNOwogICAgIH0KIAotICAgIGZvciAoaW50IHJldHJpZXMgPSAwOyArK3JldHJpZXM7ICkgeworICAgIGZvciAoaW50IHJldHJpZXMgPSAwOyByZXRyaWVzIDwga1RpbWVvdXRNYXhSZXRyaWVzOyArK3JldHJpZXMpIHsKICAgICAgICAgLy8gSWYgd2UgZmlsbCBhbGwgYXZhaWxhYmxlIGlucHV0IGJ1ZmZlcnMsIHdlIHNob3VsZCBleHBlY3QgdGhhdAogICAgICAgICAvLyB0aGUgY29kZWMgcHJvZHVjZXMgYXQgbGVhc3Qgb25lIG91dHB1dCBidWZmZXIuIEFsc28sIHRoZSBjb2RlYwogICAgICAgICAvLyBzaG91bGQgcHJvZHVjZSBhbiBvdXRwdXQgYnVmZmVyIGluIGF0IG1vc3QgMSBzZWNvbmRzLiBSZXRyeSBhCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodE1lZGlhU2Nhbm5lci5jcHAKaW5kZXggYzYyNjAzYy4uY2Y0ZWRhZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmNwcApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KIAorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWVkaWFTY2FubmVyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgpAQCAtMzQsMjUgKzM1LDE2IEBACiAKIFN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyOjp+U3RhZ2VmcmlnaHRNZWRpYVNjYW5uZXIoKSB7fQogCi1zdGF0aWMgYm9vbCBGaWxlSGFzQWNjZXB0YWJsZUV4dGVuc2lvbihjb25zdCBjaGFyICpleHRlbnNpb24pIHsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqa1ZhbGlkRXh0ZW5zaW9uc1tdID0gewotICAgICAgICAiLm1wMyIsICIubXA0IiwgIi5tNGEiLCAiLjNncCIsICIuM2dwcCIsICIuM2cyIiwgIi4zZ3BwMiIsCi0gICAgICAgICIubXBlZyIsICIub2dnIiwgIi5taWQiLCAiLnNtZiIsICIuaW15IiwgIi53bWEiLCAiLmFhYyIsCi0gICAgICAgICIud2F2IiwgIi5hbXIiLCAiLm1pZGkiLCAiLnhtZiIsICIucnR0dGwiLCAiLnJ0eCIsICIub3RhIiwKLSAgICAgICAgIi5ta3YiLCAiLm1rYSIsICIud2VibSIsICIudHMiLCAiLmZsIiwgIi5mbGFjIiwgIi5teG1mIiwKLSAgICAgICAgIi5hdmkiLCAiLm1wZWciLCAiLm1wZyIsICIuYXdiIiwgIi5tcGdhIiwgIi5tb3YiLAotICAgICAgICAiLm00diIsICIub2dhIiwgIi5tNHIiCi0gICAgfTsKLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtOdW1WYWxpZEV4dGVuc2lvbnMgPQotICAgICAgICBzaXplb2Yoa1ZhbGlkRXh0ZW5zaW9ucykgLyBzaXplb2Yoa1ZhbGlkRXh0ZW5zaW9uc1swXSk7CitzdGF0aWMgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBnU3VwcG9ydGVkRXh0ZW5zaW9uczsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bVZhbGlkRXh0ZW5zaW9uczsgKytpKSB7Ci0gICAgICAgIGlmICghc3RyY2FzZWNtcChleHRlbnNpb24sIGtWYWxpZEV4dGVuc2lvbnNbaV0pKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQorc3RhdGljIGJvb2wgRmlsZUhhc0FjY2VwdGFibGVFeHRlbnNpb24oY29uc3QgY2hhciAqZXh0ZW5zaW9uKSB7CisKKyAgICBpZiAoZ1N1cHBvcnRlZEV4dGVuc2lvbnMuZW1wdHkoKSkgeworICAgICAgICAvLyBnZXQgdGhlIGxpc3QgZnJvbSB0aGUgc2VydmljZQorICAgICAgICBnU3VwcG9ydGVkRXh0ZW5zaW9ucyA9IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z2V0U3VwcG9ydGVkVHlwZXMoKTsKICAgICB9CiAKLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuICBnU3VwcG9ydGVkRXh0ZW5zaW9ucy5jb3VudChzdGQ6OnN0cmluZyhleHRlbnNpb24gKyAxKSkgIT0gMDsKIH0KIAogTWVkaWFTY2FuUmVzdWx0IFN0YWdlZnJpZ2h0TWVkaWFTY2FubmVyOjpwcm9jZXNzRmlsZSgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYWNjYWQuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw3MTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlciIKLQotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgotCi0jaW5jbHVkZSAiaW5jbHVkZS9GcmFtZURlY29kZXIuaCIKLSNpbmNsdWRlICJpbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaCIKLQotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUhUVFBTZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9DaGFyYWN0ZXJFbmNvZGluZ0RldGVjdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6U3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcigpCi0gICAgOiBtUGFyc2VkTWV0YURhdGEoZmFsc2UpLAotICAgICAgbUFsYnVtQXJ0KE5VTEwpLAotICAgICAgbUxhc3RJbWFnZUluZGV4KC0xKSB7Ci0gICAgQUxPR1YoIlN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIoKSIpOwotfQotCi1TdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjp+U3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcigpIHsKLSAgICBBTE9HVigiflN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIoKSIpOwotICAgIGNsZWFyTWV0YWRhdGEoKTsKLSAgICBpZiAobVNvdXJjZSAhPSBOVUxMKSB7Ci0gICAgICAgIG1Tb3VyY2UtPmNsb3NlKCk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKAotICAgICAgICBjb25zdCBzcDxJTWVkaWFIVFRQU2VydmljZT4gJmh0dHBTZXJ2aWNlLAotICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzKSB7Ci0gICAgQUxPR1YoInNldERhdGFTb3VyY2UoJXMpIiwgdXJpKTsKLQotICAgIGNsZWFyTWV0YWRhdGEoKTsKLSAgICBtU291cmNlID0gRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21VUkkoaHR0cFNlcnZpY2UsIHVyaSwgaGVhZGVycyk7Ci0KLSAgICBpZiAobVNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gY3JlYXRlIGRhdGEgc291cmNlIGZvciAnJXMnLiIsIHVyaSk7Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIG1FeHRyYWN0b3IgPSBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OkNyZWF0ZShtU291cmNlKTsKLQotICAgIGlmIChtRXh0cmFjdG9yID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBpbnN0YW50aWF0ZSBhbiBleHRyYWN0b3IgZm9yICclcycuIiwgdXJpKTsKLQotICAgICAgICBtU291cmNlLmNsZWFyKCk7Ci0KLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi0vLyBXYXJuaW5nIGNhbGxlciByZXRhaW5zIG93bmVyc2hpcCBvZiB0aGUgZmlsZWRlc2NyaXB0b3IhIER1cCBpdCBpZiBuZWNlc3NhcnkuCi1zdGF0dXNfdCBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpzZXREYXRhU291cmNlKAotICAgICAgICBpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCkgewotICAgIGZkID0gZHVwKGZkKTsKLQotICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVkLCAlIiBQUklkNjQgIiwgJSIgUFJJZDY0ICIpIiwgZmQsIG9mZnNldCwgbGVuZ3RoKTsKLQotICAgIGNsZWFyTWV0YWRhdGEoKTsKLSAgICBtU291cmNlID0gbmV3IEZpbGVTb3VyY2UoZmQsIG9mZnNldCwgbGVuZ3RoKTsKLQotICAgIHN0YXR1c190IGVycjsKLSAgICBpZiAoKGVyciA9IG1Tb3VyY2UtPmluaXRDaGVjaygpKSAhPSBPSykgewotICAgICAgICBtU291cmNlLmNsZWFyKCk7Ci0KLSAgICAgICAgcmV0dXJuIGVycjsKLSAgICB9Ci0KLSAgICBtRXh0cmFjdG9yID0gTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpDcmVhdGUobVNvdXJjZSk7Ci0KLSAgICBpZiAobUV4dHJhY3RvciA9PSBOVUxMKSB7Ci0gICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKLQotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OnNldERhdGFTb3VyY2UoCi0gICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+JiBzb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpIHsKLSAgICBBTE9HVigic2V0RGF0YVNvdXJjZShEYXRhU291cmNlKSIpOwotCi0gICAgY2xlYXJNZXRhZGF0YSgpOwotICAgIG1Tb3VyY2UgPSBzb3VyY2U7Ci0gICAgbUV4dHJhY3RvciA9IE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Q3JlYXRlKG1Tb3VyY2UsIG1pbWUpOwotCi0gICAgaWYgKG1FeHRyYWN0b3IgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGluc3RhbnRpYXRlIGEgTWVkaWFFeHRyYWN0b3IuIik7Ci0gICAgICAgIG1Tb3VyY2UuY2xlYXIoKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zcDxJTWVtb3J5PiBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpnZXRJbWFnZUF0SW5kZXgoCi0gICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5LCBib29sIHRodW1ibmFpbCkgewotICAgIEFMT0dWKCJnZXRJbWFnZUF0SW5kZXg6IGluZGV4KCVkKSBjb2xvckZvcm1hdCglZCkgbWV0YU9ubHkoJWQpIHRodW1ibmFpbCglZCkiLAotICAgICAgICAgICAgaW5kZXgsIGNvbG9yRm9ybWF0LCBtZXRhT25seSwgdGh1bWJuYWlsKTsKLQotICAgIHJldHVybiBnZXRJbWFnZUludGVybmFsKGluZGV4LCBjb2xvckZvcm1hdCwgbWV0YU9ubHksIHRodW1ibmFpbCwgTlVMTCk7Ci19Ci0KLXNwPElNZW1vcnk+IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OmdldEltYWdlUmVjdEF0SW5kZXgoCi0gICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7Ci0gICAgQUxPR1YoImdldEltYWdlUmVjdEF0SW5kZXg6IGluZGV4KCVkKSBjb2xvckZvcm1hdCglZCkgcmVjdCB7JWQsICVkLCAlZCwgJWR9IiwKLSAgICAgICAgICAgIGluZGV4LCBjb2xvckZvcm1hdCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKLQotICAgIEZyYW1lUmVjdCByZWN0ID0ge2xlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbX07Ci0KLSAgICBpZiAobUltYWdlRGVjb2RlciAhPSBOVUxMICYmIGluZGV4ID09IG1MYXN0SW1hZ2VJbmRleCkgewotICAgICAgICByZXR1cm4gbUltYWdlRGVjb2Rlci0+ZXh0cmFjdEZyYW1lKCZyZWN0KTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZ2V0SW1hZ2VJbnRlcm5hbCgKLSAgICAgICAgICAgIGluZGV4LCBjb2xvckZvcm1hdCwgZmFsc2UgLyptZXRhT25seSovLCBmYWxzZSAvKnRodW1ibmFpbCovLCAmcmVjdCk7Ci19Ci0KLXNwPElNZW1vcnk+IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OmdldEltYWdlSW50ZXJuYWwoCi0gICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5LCBib29sIHRodW1ibmFpbCwgRnJhbWVSZWN0KiByZWN0KSB7Ci0KLSAgICBpZiAobUV4dHJhY3Rvci5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJubyBleHRyYWN0b3IuIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHNpemVfdCBuID0gbUV4dHJhY3Rvci0+Y291bnRUcmFja3MoKTsKLSAgICBzaXplX3QgaTsKLSAgICBpbnQgaW1hZ2VDb3VudCA9IDA7Ci0KLSAgICBmb3IgKGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgICAgIHNwPE1ldGFEYXRhPiBtZXRhID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YShpKTsKLSAgICAgICAgaWYgKCFtZXRhKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBBTE9HVigiZ2V0dGluZyB0cmFjayAlenUgb2YgJXp1LCBtZXRhPSVzIiwgaSwgbiwgbWV0YS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKLQotICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0KLSAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAiaW1hZ2UvIiwgNikpIHsKLSAgICAgICAgICAgIGludDMyX3QgaXNQcmltYXJ5OwotICAgICAgICAgICAgaWYgKChpbmRleCA8IDAgJiYgbWV0YS0+ZmluZEludDMyKAotICAgICAgICAgICAgICAgICAgICBrS2V5VHJhY2tJc0RlZmF1bHQsICZpc1ByaW1hcnkpICYmIGlzUHJpbWFyeSkKLSAgICAgICAgICAgICAgICAgICAgfHwgKGluZGV4ID09IGltYWdlQ291bnQrKykpIHsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChpID09IG4pIHsKLSAgICAgICAgQUxPR0UoImltYWdlIHRyYWNrIG5vdCBmb3VuZC4iKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgc3A8TWV0YURhdGE+IHRyYWNrTWV0YSA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7Ci0gICAgaWYgKCF0cmFja01ldGEpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgaWYgKG1ldGFPbmx5KSB7Ci0gICAgICAgIHJldHVybiBGcmFtZURlY29kZXI6OmdldE1ldGFkYXRhT25seSh0cmFja01ldGEsIGNvbG9yRm9ybWF0LCB0aHVtYm5haWwpOwotICAgIH0KLQotICAgIHNwPElNZWRpYVNvdXJjZT4gc291cmNlID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2soaSk7Ci0KLSAgICBpZiAoc291cmNlLmdldCgpID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoInVuYWJsZSB0byBpbnN0YW50aWF0ZSBpbWFnZSB0cmFjay4iKTsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLSAgICBBTE9HVigiZXh0cmFjdGluZyBmcm9tICVzIHRyYWNrIiwgbWltZSk7Ci0gICAgaWYgKCFzdHJjYXNlY21wKG1pbWUsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykpIHsKLSAgICAgICAgbWltZSA9IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkM7Ci0gICAgICAgIHRyYWNrTWV0YSA9IG5ldyBNZXRhRGF0YSgqdHJhY2tNZXRhKTsKLSAgICAgICAgdHJhY2tNZXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgbWltZSk7Ci0gICAgfQotCi0gICAgYm9vbCBwcmVmZXJodyA9IHByb3BlcnR5X2dldF9ib29sKAotICAgICAgICAgICAgIm1lZGlhLnN0YWdlZnJpZ2h0LnRodW1ibmFpbC5wcmVmZXJfaHdfY29kZWNzIiwgZmFsc2UpOwotICAgIHVpbnQzMl90IGZsYWdzID0gcHJlZmVyaHcgPyAwIDogTWVkaWFDb2RlY0xpc3Q6OmtQcmVmZXJTb2Z0d2FyZUNvZGVjczsKLSAgICBWZWN0b3I8QVN0cmluZz4gbWF0Y2hpbmdDb2RlY3M7Ci0gICAgTWVkaWFDb2RlY0xpc3Q6OmZpbmRNYXRjaGluZ0NvZGVjcygKLSAgICAgICAgICAgIG1pbWUsCi0gICAgICAgICAgICBmYWxzZSwgLyogZW5jb2RlciAqLwotICAgICAgICAgICAgZmxhZ3MsCi0gICAgICAgICAgICAmbWF0Y2hpbmdDb2RlY3MpOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtYXRjaGluZ0NvZGVjcy5zaXplKCk7ICsraSkgewotICAgICAgICBjb25zdCBBU3RyaW5nICZjb21wb25lbnROYW1lID0gbWF0Y2hpbmdDb2RlY3NbaV07Ci0gICAgICAgIHNwPEltYWdlRGVjb2Rlcj4gZGVjb2RlciA9IG5ldyBJbWFnZURlY29kZXIoY29tcG9uZW50TmFtZSwgdHJhY2tNZXRhLCBzb3VyY2UpOwotICAgICAgICBpbnQ2NF90IGZyYW1lVGltZVVzID0gdGh1bWJuYWlsID8gLTEgOiAwOwotICAgICAgICBpZiAoZGVjb2Rlci0+aW5pdChmcmFtZVRpbWVVcywgMSAvKm51bUZyYW1lcyovLCAwIC8qb3B0aW9uKi8sIGNvbG9yRm9ybWF0KSA9PSBPSykgewotICAgICAgICAgICAgc3A8SU1lbW9yeT4gZnJhbWUgPSBkZWNvZGVyLT5leHRyYWN0RnJhbWUocmVjdCk7Ci0KLSAgICAgICAgICAgIGlmIChmcmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlY3QgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICAvLyBrZWVwIHRoZSBkZWNvZGVyIGlmIHNsaWNlIGRlY29kaW5nCi0gICAgICAgICAgICAgICAgICAgIG1JbWFnZURlY29kZXIgPSBkZWNvZGVyOwotICAgICAgICAgICAgICAgICAgICBtTGFzdEltYWdlSW5kZXggPSBpbmRleDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZyYW1lOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCIlcyBmYWlsZWQgdG8gZXh0cmFjdCB0aHVtYm5haWwsIHRyeWluZyBuZXh0IGRlY29kZXIuIiwgY29tcG9uZW50TmFtZS5jX3N0cigpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotc3A8SU1lbW9yeT4gU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6Z2V0RnJhbWVBdFRpbWUoCi0gICAgICAgIGludDY0X3QgdGltZVVzLCBpbnQgb3B0aW9uLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpIHsKLSAgICBBTE9HVigiZ2V0RnJhbWVBdFRpbWU6ICUiIFBSSWQ2NCAiIHVzIG9wdGlvbjogJWQgY29sb3JGb3JtYXQ6ICVkLCBtZXRhT25seTogJWQiLAotICAgICAgICAgICAgdGltZVVzLCBvcHRpb24sIGNvbG9yRm9ybWF0LCBtZXRhT25seSk7Ci0KLSAgICBzcDxJTWVtb3J5PiBmcmFtZTsKLSAgICBzdGF0dXNfdCBlcnIgPSBnZXRGcmFtZUludGVybmFsKAotICAgICAgICAgICAgdGltZVVzLCAxLCBvcHRpb24sIGNvbG9yRm9ybWF0LCBtZXRhT25seSwgJmZyYW1lLCBOVUxMIC8qb3V0RnJhbWVzKi8pOwotICAgIHJldHVybiAoZXJyID09IE9LKSA/IGZyYW1lIDogTlVMTDsKLX0KLQotc3RhdHVzX3QgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6Z2V0RnJhbWVBdEluZGV4KAotICAgICAgICBzdGQ6OnZlY3RvcjxzcDxJTWVtb3J5PiA+KiBmcmFtZXMsCi0gICAgICAgIGludCBmcmFtZUluZGV4LCBpbnQgbnVtRnJhbWVzLCBpbnQgY29sb3JGb3JtYXQsIGJvb2wgbWV0YU9ubHkpIHsKLSAgICBBTE9HVigiZ2V0RnJhbWVBdEluZGV4OiBmcmFtZUluZGV4ICVkLCBudW1GcmFtZXMgJWQsIGNvbG9yRm9ybWF0OiAlZCwgbWV0YU9ubHk6ICVkIiwKLSAgICAgICAgICAgIGZyYW1lSW5kZXgsIG51bUZyYW1lcywgY29sb3JGb3JtYXQsIG1ldGFPbmx5KTsKLQotICAgIHJldHVybiBnZXRGcmFtZUludGVybmFsKAotICAgICAgICAgICAgZnJhbWVJbmRleCwgbnVtRnJhbWVzLCBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfRlJBTUVfSU5ERVgsCi0gICAgICAgICAgICBjb2xvckZvcm1hdCwgbWV0YU9ubHksIE5VTEwgLypvdXRGcmFtZSovLCBmcmFtZXMpOwotfQotCi1zdGF0dXNfdCBTdGFnZWZyaWdodE1ldGFkYXRhUmV0cmlldmVyOjpnZXRGcmFtZUludGVybmFsKAotICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG51bUZyYW1lcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5LAotICAgICAgICBzcDxJTWVtb3J5Piogb3V0RnJhbWUsIHN0ZDo6dmVjdG9yPHNwPElNZW1vcnk+ID4qIG91dEZyYW1lcykgewotICAgIGlmIChtRXh0cmFjdG9yLmdldCgpID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIm5vIGV4dHJhY3Rvci4iKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgc3A8TWV0YURhdGE+IGZpbGVNZXRhID0gbUV4dHJhY3Rvci0+Z2V0TWV0YURhdGEoKTsKLQotICAgIGlmIChmaWxlTWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJleHRyYWN0b3IgZG9lc24ndCBwdWJsaXNoIG1ldGFkYXRhLCBmYWlsZWQgdG8gaW5pdGlhbGl6ZT8iKTsKLSAgICAgICAgcmV0dXJuIE5PX0lOSVQ7Ci0gICAgfQotCi0gICAgaW50MzJfdCBkcm0gPSAwOwotICAgIGlmIChmaWxlTWV0YS0+ZmluZEludDMyKGtLZXlJc0RSTSwgJmRybSkgJiYgZHJtICE9IDApIHsKLSAgICAgICAgQUxPR0UoImZyYW1lIGdyYWIgbm90IGFsbG93ZWQuIik7Ci0gICAgICAgIHJldHVybiBFUlJPUl9EUk1fVU5LTk9XTjsKLSAgICB9Ci0KLSAgICBzaXplX3QgbiA9IG1FeHRyYWN0b3ItPmNvdW50VHJhY2tzKCk7Ci0gICAgc2l6ZV90IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICBzcDxNZXRhRGF0YT4gbWV0YSA9IG1FeHRyYWN0b3ItPmdldFRyYWNrTWV0YURhdGEoaSk7Ci0gICAgICAgIGlmICghbWV0YSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBjaGFyICptaW1lOwotICAgICAgICBDSEVDSyhtZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZtaW1lKSk7Ci0KLSAgICAgICAgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGkgPT0gbikgewotICAgICAgICBBTE9HRSgibm8gdmlkZW8gdHJhY2sgZm91bmQuIik7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBzcDxNZXRhRGF0YT4gdHJhY2tNZXRhID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YSgKLSAgICAgICAgICAgIGksIE1lZGlhRXh0cmFjdG9yOjprSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhKTsKLSAgICBpZiAoIXRyYWNrTWV0YSkgewotICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICB9Ci0KLSAgICBpZiAobWV0YU9ubHkpIHsKLSAgICAgICAgaWYgKG91dEZyYW1lICE9IE5VTEwpIHsKLSAgICAgICAgICAgICpvdXRGcmFtZSA9IEZyYW1lRGVjb2Rlcjo6Z2V0TWV0YWRhdGFPbmx5KHRyYWNrTWV0YSwgY29sb3JGb3JtYXQpOwotICAgICAgICAgICAgaWYgKCpvdXRGcmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwotICAgIH0KLQotICAgIHNwPElNZWRpYVNvdXJjZT4gc291cmNlID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2soaSk7Ci0KLSAgICBpZiAoc291cmNlLmdldCgpID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1YoInVuYWJsZSB0byBpbnN0YW50aWF0ZSB2aWRlbyB0cmFjay4iKTsKLSAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci0gICAgfQotCi0gICAgY29uc3Qgdm9pZCAqZGF0YTsKLSAgICB1aW50MzJfdCB0eXBlOwotICAgIHNpemVfdCBkYXRhU2l6ZTsKLSAgICBpZiAoZmlsZU1ldGEtPmZpbmREYXRhKGtLZXlBbGJ1bUFydCwgJnR5cGUsICZkYXRhLCAmZGF0YVNpemUpCi0gICAgICAgICAgICAmJiBtQWxidW1BcnQgPT0gTlVMTCkgewotICAgICAgICBtQWxidW1BcnQgPSBNZWRpYUFsYnVtQXJ0Ojpmcm9tRGF0YShkYXRhU2l6ZSwgZGF0YSk7Ci0gICAgfQotCi0gICAgY29uc3QgY2hhciAqbWltZTsKLSAgICBDSEVDSyh0cmFja01ldGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpKTsKLQotICAgIGJvb2wgcHJlZmVyaHcgPSBwcm9wZXJ0eV9nZXRfYm9vbCgKLSAgICAgICAgICAgICJtZWRpYS5zdGFnZWZyaWdodC50aHVtYm5haWwucHJlZmVyX2h3X2NvZGVjcyIsIGZhbHNlKTsKLSAgICB1aW50MzJfdCBmbGFncyA9IHByZWZlcmh3ID8gMCA6IE1lZGlhQ29kZWNMaXN0OjprUHJlZmVyU29mdHdhcmVDb2RlY3M7Ci0gICAgVmVjdG9yPEFTdHJpbmc+IG1hdGNoaW5nQ29kZWNzOwotICAgIE1lZGlhQ29kZWNMaXN0OjpmaW5kTWF0Y2hpbmdDb2RlY3MoCi0gICAgICAgICAgICBtaW1lLAotICAgICAgICAgICAgZmFsc2UsIC8qIGVuY29kZXIgKi8KLSAgICAgICAgICAgIGZsYWdzLAotICAgICAgICAgICAgJm1hdGNoaW5nQ29kZWNzKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWF0Y2hpbmdDb2RlY3Muc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgY29uc3QgQVN0cmluZyAmY29tcG9uZW50TmFtZSA9IG1hdGNoaW5nQ29kZWNzW2ldOwotICAgICAgICBWaWRlb0ZyYW1lRGVjb2RlciBkZWNvZGVyKGNvbXBvbmVudE5hbWUsIHRyYWNrTWV0YSwgc291cmNlKTsKLSAgICAgICAgaWYgKGRlY29kZXIuaW5pdCh0aW1lVXMsIG51bUZyYW1lcywgb3B0aW9uLCBjb2xvckZvcm1hdCkgPT0gT0spIHsKLSAgICAgICAgICAgIGlmIChvdXRGcmFtZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgKm91dEZyYW1lID0gZGVjb2Rlci5leHRyYWN0RnJhbWUoKTsKLSAgICAgICAgICAgICAgICBpZiAoKm91dEZyYW1lICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0RnJhbWVzICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBkZWNvZGVyLmV4dHJhY3RGcmFtZXMob3V0RnJhbWVzKTsKLSAgICAgICAgICAgICAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgQUxPR1YoIiVzIGZhaWxlZCB0byBleHRyYWN0IGZyYW1lLCB0cnlpbmcgbmV4dCBkZWNvZGVyLiIsIGNvbXBvbmVudE5hbWUuY19zdHIoKSk7Ci0gICAgfQotCi0gICAgQUxPR0UoImFsbCBjb2RlY3MgZmFpbGVkIHRvIGV4dHJhY3QgZnJhbWUuIik7Ci0gICAgcmV0dXJuIFVOS05PV05fRVJST1I7Ci19Ci0KLU1lZGlhQWxidW1BcnQgKlN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OmV4dHJhY3RBbGJ1bUFydCgpIHsKLSAgICBBTE9HVigiZXh0cmFjdEFsYnVtQXJ0IChleHRyYWN0b3I6ICVzKSIsIG1FeHRyYWN0b3IuZ2V0KCkgIT0gTlVMTCA/ICJZRVMiIDogIk5PIik7Ci0KLSAgICBpZiAobUV4dHJhY3RvciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmICghbVBhcnNlZE1ldGFEYXRhKSB7Ci0gICAgICAgIHBhcnNlTWV0YURhdGEoKTsKLQotICAgICAgICBtUGFyc2VkTWV0YURhdGEgPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChtQWxidW1BcnQpIHsKLSAgICAgICAgcmV0dXJuIG1BbGJ1bUFydC0+Y2xvbmUoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTlVMTDsKLX0KLQotY29uc3QgY2hhciAqU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6ZXh0cmFjdE1ldGFkYXRhKGludCBrZXlDb2RlKSB7Ci0gICAgaWYgKG1FeHRyYWN0b3IgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoIW1QYXJzZWRNZXRhRGF0YSkgewotICAgICAgICBwYXJzZU1ldGFEYXRhKCk7Ci0KLSAgICAgICAgbVBhcnNlZE1ldGFEYXRhID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbU1ldGFEYXRhLmluZGV4T2ZLZXkoa2V5Q29kZSk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIHJldHVybiBtTWV0YURhdGEudmFsdWVBdChpbmRleCkuc3RyaW5nKCk7Ci19Ci0KLXZvaWQgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcjo6cGFyc2VDb2xvckFzcGVjdHMoY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKSB7Ci0gICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOwotICAgIGlmIChjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UobWV0YSwgJmZvcm1hdCkgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGludDMyX3Qgc3RhbmRhcmQsIHRyYW5zZmVyLCByYW5nZTsKLSAgICBpZiAoZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXN0YW5kYXJkIiwgJnN0YW5kYXJkKQotICAgICAgICAgICAgJiYgZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXRyYW5zZmVyIiwgJnRyYW5zZmVyKQotICAgICAgICAgICAgJiYgZm9ybWF0LT5maW5kSW50MzIoImNvbG9yLXJhbmdlIiwgJnJhbmdlKSkgewotICAgICAgICBBTE9HVigiZm91bmQgY29sb3IgYXNwZWN0cyA6IHN0YW5kYXJkPSVkLCB0cmFuc2Zlcj0lZCwgcmFuZ2U9JWQiLAotICAgICAgICAgICAgICAgIHN0YW5kYXJkLCB0cmFuc2ZlciwgcmFuZ2UpOwotCi0gICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0NPTE9SX1NUQU5EQVJELCBTdHJpbmc4Ojpmb3JtYXQoIiVkIiwgc3RhbmRhcmQpKTsKLSAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfQ09MT1JfVFJBTlNGRVIsIFN0cmluZzg6OmZvcm1hdCgiJWQiLCB0cmFuc2ZlcikpOwotICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9DT0xPUl9SQU5HRSwgU3RyaW5nODo6Zm9ybWF0KCIlZCIsIHJhbmdlKSk7Ci0gICAgfQotfQotCi12b2lkIFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OnBhcnNlTWV0YURhdGEoKSB7Ci0gICAgc3A8TWV0YURhdGE+IG1ldGEgPSBtRXh0cmFjdG9yLT5nZXRNZXRhRGF0YSgpOwotCi0gICAgaWYgKG1ldGEgPT0gTlVMTCkgewotICAgICAgICBBTE9HVigiZXh0cmFjdG9yIGRvZXNuJ3QgcHVibGlzaCBtZXRhZGF0YSwgZmFpbGVkIHRvIGluaXRpYWxpemU/Iik7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzdHJ1Y3QgTWFwIHsKLSAgICAgICAgaW50IGZyb207Ci0gICAgICAgIGludCB0bzsKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICB9OwotICAgIHN0YXRpYyBjb25zdCBNYXAga01hcFtdID0gewotICAgICAgICB7IGtLZXlNSU1FVHlwZSwgTUVUQURBVEFfS0VZX01JTUVUWVBFLCBOVUxMIH0sCi0gICAgICAgIHsga0tleUNEVHJhY2tOdW1iZXIsIE1FVEFEQVRBX0tFWV9DRF9UUkFDS19OVU1CRVIsICJ0cmFja251bWJlciIgfSwKLSAgICAgICAgeyBrS2V5RGlzY051bWJlciwgTUVUQURBVEFfS0VZX0RJU0NfTlVNQkVSLCAiZGlzY251bWJlciIgfSwKLSAgICAgICAgeyBrS2V5QWxidW0sIE1FVEFEQVRBX0tFWV9BTEJVTSwgImFsYnVtIiB9LAotICAgICAgICB7IGtLZXlBcnRpc3QsIE1FVEFEQVRBX0tFWV9BUlRJU1QsICJhcnRpc3QiIH0sCi0gICAgICAgIHsga0tleUFsYnVtQXJ0aXN0LCBNRVRBREFUQV9LRVlfQUxCVU1BUlRJU1QsICJhbGJ1bWFydGlzdCIgfSwKLSAgICAgICAgeyBrS2V5QXV0aG9yLCBNRVRBREFUQV9LRVlfQVVUSE9SLCBOVUxMIH0sCi0gICAgICAgIHsga0tleUNvbXBvc2VyLCBNRVRBREFUQV9LRVlfQ09NUE9TRVIsICJjb21wb3NlciIgfSwKLSAgICAgICAgeyBrS2V5RGF0ZSwgTUVUQURBVEFfS0VZX0RBVEUsIE5VTEwgfSwKLSAgICAgICAgeyBrS2V5R2VucmUsIE1FVEFEQVRBX0tFWV9HRU5SRSwgImdlbnJlIiB9LAotICAgICAgICB7IGtLZXlUaXRsZSwgTUVUQURBVEFfS0VZX1RJVExFLCAidGl0bGUiIH0sCi0gICAgICAgIHsga0tleVllYXIsIE1FVEFEQVRBX0tFWV9ZRUFSLCAieWVhciIgfSwKLSAgICAgICAgeyBrS2V5V3JpdGVyLCBNRVRBREFUQV9LRVlfV1JJVEVSLCAid3JpdGVyIiB9LAotICAgICAgICB7IGtLZXlDb21waWxhdGlvbiwgTUVUQURBVEFfS0VZX0NPTVBJTEFUSU9OLCAiY29tcGlsYXRpb24iIH0sCi0gICAgICAgIHsga0tleUxvY2F0aW9uLCBNRVRBREFUQV9LRVlfTE9DQVRJT04sIE5VTEwgfSwKLSAgICB9OwotCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTnVtTWFwRW50cmllcyA9IHNpemVvZihrTWFwKSAvIHNpemVvZihrTWFwWzBdKTsKLQotICAgIENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IgKmRldGVjdG9yID0gbmV3IENoYXJhY3RlckVuY29kaW5nRGV0ZWN0b3IoKTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga051bU1hcEVudHJpZXM7ICsraSkgewotICAgICAgICBjb25zdCBjaGFyICp2YWx1ZTsKLSAgICAgICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGtNYXBbaV0uZnJvbSwgJnZhbHVlKSkgewotICAgICAgICAgICAgaWYgKGtNYXBbaV0ubmFtZSkgewotICAgICAgICAgICAgICAgIC8vIGFkZCB0byBjaGFyc2V0IGRldGVjdG9yCi0gICAgICAgICAgICAgICAgZGV0ZWN0b3ItPmFkZFRhZyhrTWFwW2ldLm5hbWUsIHZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gZGlyZWN0bHkgYWRkIHRvIG91dHB1dCBsaXN0Ci0gICAgICAgICAgICAgICAgbU1ldGFEYXRhLmFkZChrTWFwW2ldLnRvLCBTdHJpbmc4KHZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBkZXRlY3Rvci0+ZGV0ZWN0QW5kQ29udmVydCgpOwotICAgIGludCBzaXplID0gZGV0ZWN0b3ItPnNpemUoKTsKLSAgICBpZiAoc2l6ZSkgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhbHVlOwotICAgICAgICAgICAgZGV0ZWN0b3ItPmdldFRhZyhpLCAmbmFtZSwgJnZhbHVlKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwga051bU1hcEVudHJpZXM7ICsraikgewotICAgICAgICAgICAgICAgIGlmIChrTWFwW2pdLm5hbWUgJiYgIXN0cmNtcChrTWFwW2pdLm5hbWUsIG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZXRhRGF0YS5hZGQoa01hcFtqXS50bywgU3RyaW5nOCh2YWx1ZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBkZWxldGUgZGV0ZWN0b3I7Ci0KLSAgICBjb25zdCB2b2lkICpkYXRhOwotICAgIHVpbnQzMl90IHR5cGU7Ci0gICAgc2l6ZV90IGRhdGFTaXplOwotICAgIGlmIChtZXRhLT5maW5kRGF0YShrS2V5QWxidW1BcnQsICZ0eXBlLCAmZGF0YSwgJmRhdGFTaXplKQotICAgICAgICAgICAgJiYgbUFsYnVtQXJ0ID09IE5VTEwpIHsKLSAgICAgICAgbUFsYnVtQXJ0ID0gTWVkaWFBbGJ1bUFydDo6ZnJvbURhdGEoZGF0YVNpemUsIGRhdGEpOwotICAgIH0KLQotICAgIHNpemVfdCBudW1UcmFja3MgPSBtRXh0cmFjdG9yLT5jb3VudFRyYWNrcygpOwotCi0gICAgY2hhciB0bXBbMzJdOwotICAgIHNwcmludGYodG1wLCAiJXp1IiwgbnVtVHJhY2tzKTsKLQotICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX05VTV9UUkFDS1MsIFN0cmluZzgodG1wKSk7Ci0KLSAgICBmbG9hdCBjYXB0dXJlRnBzOwotICAgIGlmIChtZXRhLT5maW5kRmxvYXQoa0tleUNhcHR1cmVGcmFtZXJhdGUsICZjYXB0dXJlRnBzKSkgewotICAgICAgICBzcHJpbnRmKHRtcCwgIiVmIiwgY2FwdHVyZUZwcyk7Ci0gICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0NBUFRVUkVfRlJBTUVSQVRFLCBTdHJpbmc4KHRtcCkpOwotICAgIH0KLQotICAgIGludDY0X3QgZXhpZk9mZnNldCwgZXhpZlNpemU7Ci0gICAgaWYgKG1ldGEtPmZpbmRJbnQ2NChrS2V5RXhpZk9mZnNldCwgJmV4aWZPZmZzZXQpCi0gICAgICYmIG1ldGEtPmZpbmRJbnQ2NChrS2V5RXhpZlNpemUsICZleGlmU2l6ZSkpIHsKLSAgICAgICAgc3ByaW50Zih0bXAsICIlbGxkIiwgKGxvbmcgbG9uZylleGlmT2Zmc2V0KTsKLSAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfRVhJRl9PRkZTRVQsIFN0cmluZzgodG1wKSk7Ci0gICAgICAgIHNwcmludGYodG1wLCAiJWxsZCIsIChsb25nIGxvbmcpZXhpZlNpemUpOwotICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9FWElGX0xFTkdUSCwgU3RyaW5nOCh0bXApKTsKLSAgICB9Ci0KLSAgICBib29sIGhhc0F1ZGlvID0gZmFsc2U7Ci0gICAgYm9vbCBoYXNWaWRlbyA9IGZhbHNlOwotICAgIGludDMyX3QgdmlkZW9XaWR0aCA9IC0xOwotICAgIGludDMyX3QgdmlkZW9IZWlnaHQgPSAtMTsKLSAgICBpbnQzMl90IHZpZGVvRnJhbWVDb3VudCA9IDA7Ci0gICAgaW50MzJfdCBhdWRpb0JpdHJhdGUgPSAtMTsKLSAgICBpbnQzMl90IHJvdGF0aW9uQW5nbGUgPSAtMTsKLSAgICBpbnQzMl90IGltYWdlQ291bnQgPSAwOwotICAgIGludDMyX3QgaW1hZ2VQcmltYXJ5ID0gMDsKLSAgICBpbnQzMl90IGltYWdlV2lkdGggPSAtMTsKLSAgICBpbnQzMl90IGltYWdlSGVpZ2h0ID0gLTE7Ci0gICAgaW50MzJfdCBpbWFnZVJvdGF0aW9uID0gLTE7Ci0KLSAgICAvLyBUaGUgb3ZlcmFsbCBkdXJhdGlvbiBpcyB0aGUgZHVyYXRpb24gb2YgdGhlIGxvbmdlc3QgdHJhY2suCi0gICAgaW50NjRfdCBtYXhEdXJhdGlvblVzID0gMDsKLSAgICBTdHJpbmc4IHRpbWVkVGV4dExhbmc7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1UcmFja3M7ICsraSkgewotICAgICAgICBzcDxNZXRhRGF0YT4gdHJhY2tNZXRhID0gbUV4dHJhY3Rvci0+Z2V0VHJhY2tNZXRhRGF0YShpKTsKLSAgICAgICAgaWYgKCF0cmFja01ldGEpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50NjRfdCBkdXJhdGlvblVzOwotICAgICAgICBpZiAodHJhY2tNZXRhLT5maW5kSW50NjQoa0tleUR1cmF0aW9uLCAmZHVyYXRpb25VcykpIHsKLSAgICAgICAgICAgIGlmIChkdXJhdGlvblVzID4gbWF4RHVyYXRpb25VcykgewotICAgICAgICAgICAgICAgIG1heER1cmF0aW9uVXMgPSBkdXJhdGlvblVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgY29uc3QgY2hhciAqbWltZTsKLSAgICAgICAgaWYgKHRyYWNrTWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpIHsKLSAgICAgICAgICAgIGlmICghaGFzQXVkaW8gJiYgIXN0cm5jYXNlY21wKCJhdWRpby8iLCBtaW1lLCA2KSkgewotICAgICAgICAgICAgICAgIGhhc0F1ZGlvID0gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIGlmICghdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZhdWRpb0JpdHJhdGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvQml0cmF0ZSA9IC0xOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZSA9IC0xOwotICAgICAgICAgICAgICAgIGludDMyX3Qgc2FtcGxlUmF0ZSA9IC0xOwotICAgICAgICAgICAgICAgIHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlCaXRzUGVyU2FtcGxlLCAmYml0c1BlclNhbXBsZSk7Ci0gICAgICAgICAgICAgICAgdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoYml0c1BlclNhbXBsZSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWQiLCBiaXRzUGVyU2FtcGxlKTsKLSAgICAgICAgICAgICAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfQklUU19QRVJfU0FNUExFLCBTdHJpbmc4KHRtcCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoc2FtcGxlUmF0ZSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwcmludGYodG1wLCAiJWQiLCBzYW1wbGVSYXRlKTsKLSAgICAgICAgICAgICAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfU0FNUExFUkFURSwgU3RyaW5nOCh0bXApKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFoYXNWaWRlbyAmJiAhc3RybmNhc2VjbXAoInZpZGVvLyIsIG1pbWUsIDYpKSB7Ci0gICAgICAgICAgICAgICAgaGFzVmlkZW8gPSB0cnVlOwotCi0gICAgICAgICAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmdmlkZW9XaWR0aCkpOwotICAgICAgICAgICAgICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZ2aWRlb0hlaWdodCkpOwotICAgICAgICAgICAgICAgIGlmICghdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmcm90YXRpb25BbmdsZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcm90YXRpb25BbmdsZSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleUZyYW1lQ291bnQsICZ2aWRlb0ZyYW1lQ291bnQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZpZGVvRnJhbWVDb3VudCA9IDA7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcGFyc2VDb2xvckFzcGVjdHModHJhY2tNZXRhKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJpbWFnZS8iLCBtaW1lLCA2KSkgewotICAgICAgICAgICAgICAgIGludDMyX3QgaXNQcmltYXJ5OwotICAgICAgICAgICAgICAgIGlmICh0cmFja01ldGEtPmZpbmRJbnQzMigKLSAgICAgICAgICAgICAgICAgICAgICAgIGtLZXlUcmFja0lzRGVmYXVsdCwgJmlzUHJpbWFyeSkgJiYgaXNQcmltYXJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlUHJpbWFyeSA9IGltYWdlQ291bnQ7Ci0gICAgICAgICAgICAgICAgICAgIENIRUNLKHRyYWNrTWV0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJmltYWdlV2lkdGgpKTsKLSAgICAgICAgICAgICAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kSW50MzIoa0tleUhlaWdodCwgJmltYWdlSGVpZ2h0KSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghdHJhY2tNZXRhLT5maW5kSW50MzIoa0tleVJvdGF0aW9uLCAmaW1hZ2VSb3RhdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlUm90YXRpb24gPSAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGltYWdlQ291bnQrKzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIXN0cmNhc2VjbXAobWltZSwgTUVESUFfTUlNRVRZUEVfVEVYVF8zR1BQKSkgewotICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmxhbmc7Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNrTWV0YS0+ZmluZENTdHJpbmcoa0tleU1lZGlhTGFuZ3VhZ2UsICZsYW5nKSkgewotICAgICAgICAgICAgICAgICAgICB0aW1lZFRleHRMYW5nLmFwcGVuZChTdHJpbmc4KGxhbmcpKTsKLSAgICAgICAgICAgICAgICAgICAgdGltZWRUZXh0TGFuZy5hcHBlbmQoU3RyaW5nOCgiOiIpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm8gbGFuZ3VhZ2UgZm91bmQgZm9yIHRpbWVkIHRleHQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUbyBzYXZlIHRoZSBsYW5ndWFnZSBjb2RlcyBmb3IgYWxsIHRpbWVkIHRleHQgdHJhY2tzCi0gICAgLy8gSWYgbXVsdGlwbGUgdGV4dCB0cmFja3MgcHJlc2VudCwgdGhlIGZvcm1hdCB3aWxsIGxvb2sKLSAgICAvLyBsaWtlICJlbmc6Y2hpIgotICAgIGlmICghdGltZWRUZXh0TGFuZy5pc0VtcHR5KCkpIHsKLSAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfVElNRURfVEVYVF9MQU5HVUFHRVMsIHRpbWVkVGV4dExhbmcpOwotICAgIH0KLQotICAgIC8vIFRoZSBkdXJhdGlvbiB2YWx1ZSBpcyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIGR1cmF0aW9uIGluIG1zLgotICAgIHNwcmludGYodG1wLCAiJSIgUFJJZDY0LCAobWF4RHVyYXRpb25VcyArIDUwMCkgLyAxMDAwKTsKLSAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9EVVJBVElPTiwgU3RyaW5nOCh0bXApKTsKLQotICAgIGlmIChoYXNBdWRpbykgewotICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9IQVNfQVVESU8sIFN0cmluZzgoInllcyIpKTsKLSAgICB9Ci0KLSAgICBpZiAoaGFzVmlkZW8pIHsKLSAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfSEFTX1ZJREVPLCBTdHJpbmc4KCJ5ZXMiKSk7Ci0KLSAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsIHZpZGVvV2lkdGgpOwotICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9WSURFT19XSURUSCwgU3RyaW5nOCh0bXApKTsKLQotICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgdmlkZW9IZWlnaHQpOwotICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9WSURFT19IRUlHSFQsIFN0cmluZzgodG1wKSk7Ci0KLSAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsIHJvdGF0aW9uQW5nbGUpOwotICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9WSURFT19ST1RBVElPTiwgU3RyaW5nOCh0bXApKTsKLQotICAgICAgICBpZiAodmlkZW9GcmFtZUNvdW50ID4gMCkgewotICAgICAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsIHZpZGVvRnJhbWVDb3VudCk7Ci0gICAgICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9WSURFT19GUkFNRV9DT1VOVCwgU3RyaW5nOCh0bXApKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChpbWFnZUNvdW50ID4gMCkgewotICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9IQVNfSU1BR0UsIFN0cmluZzgoInllcyIpKTsKLQotICAgICAgICBzcHJpbnRmKHRtcCwgIiVkIiwgaW1hZ2VDb3VudCk7Ci0gICAgICAgIG1NZXRhRGF0YS5hZGQoTUVUQURBVEFfS0VZX0lNQUdFX0NPVU5ULCBTdHJpbmc4KHRtcCkpOwotCi0gICAgICAgIHNwcmludGYodG1wLCAiJWQiLCBpbWFnZVByaW1hcnkpOwotICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9JTUFHRV9QUklNQVJZLCBTdHJpbmc4KHRtcCkpOwotCi0gICAgICAgIHNwcmludGYodG1wLCAiJWQiLCBpbWFnZVdpZHRoKTsKLSAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfSU1BR0VfV0lEVEgsIFN0cmluZzgodG1wKSk7Ci0KLSAgICAgICAgc3ByaW50Zih0bXAsICIlZCIsIGltYWdlSGVpZ2h0KTsKLSAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfSU1BR0VfSEVJR0hULCBTdHJpbmc4KHRtcCkpOwotCi0gICAgICAgIHNwcmludGYodG1wLCAiJWQiLCBpbWFnZVJvdGF0aW9uKTsKLSAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfSU1BR0VfUk9UQVRJT04sIFN0cmluZzgodG1wKSk7Ci0gICAgfQotCi0gICAgaWYgKG51bVRyYWNrcyA9PSAxICYmIGhhc0F1ZGlvICYmIGF1ZGlvQml0cmF0ZSA+PSAwKSB7Ci0gICAgICAgIHNwcmludGYodG1wLCAiJWQiLCBhdWRpb0JpdHJhdGUpOwotICAgICAgICBtTWV0YURhdGEuYWRkKE1FVEFEQVRBX0tFWV9CSVRSQVRFLCBTdHJpbmc4KHRtcCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG9mZjY0X3Qgc291cmNlU2l6ZTsKLSAgICAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCAmJiBtU291cmNlLT5nZXRTaXplKCZzb3VyY2VTaXplKSA9PSBPSykgewotICAgICAgICAgICAgaW50NjRfdCBhdmdCaXRSYXRlID0gKGludDY0X3QpKHNvdXJjZVNpemUgKiA4RTYgLyBtYXhEdXJhdGlvblVzKTsKLQotICAgICAgICAgICAgc3ByaW50Zih0bXAsICIlIiBQUklkNjQsIGF2Z0JpdFJhdGUpOwotICAgICAgICAgICAgbU1ldGFEYXRhLmFkZChNRVRBREFUQV9LRVlfQklUUkFURSwgU3RyaW5nOCh0bXApKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChudW1UcmFja3MgPT0gMSkgewotICAgICAgICBjb25zdCBjaGFyICpmaWxlTUlNRTsKLQotICAgICAgICBpZiAobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmZmlsZU1JTUUpICYmCi0gICAgICAgICAgICAgICAgIXN0cmNhc2VjbXAoZmlsZU1JTUUsICJ2aWRlby94LW1hdHJvc2thIikpIHsKLSAgICAgICAgICAgIHNwPE1ldGFEYXRhPiB0cmFja01ldGEgPSBtRXh0cmFjdG9yLT5nZXRUcmFja01ldGFEYXRhKDApOwotICAgICAgICAgICAgY29uc3QgY2hhciAqdHJhY2tNSU1FOwotICAgICAgICAgICAgaWYgKHRyYWNrTWV0YSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQ0hFQ0sodHJhY2tNZXRhLT5maW5kQ1N0cmluZyhrS2V5TUlNRVR5cGUsICZ0cmFja01JTUUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghc3RybmNhc2VjbXAoImF1ZGlvLyIsIHRyYWNrTUlNRSwgNikpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgbWF0cm9za2EgZmlsZSBvbmx5IGNvbnRhaW5zIGEgc2luZ2xlIGF1ZGlvIHRyYWNrLAotICAgICAgICAgICAgICAgIC8vIHJld3JpdGUgaXRzIG1pbWUgdHlwZS4KLSAgICAgICAgICAgICAgICBtTWV0YURhdGEuYWRkKAotICAgICAgICAgICAgICAgICAgICAgICAgTUVUQURBVEFfS0VZX01JTUVUWVBFLCBTdHJpbmc4KCJhdWRpby94LW1hdHJvc2thIikpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi12b2lkIFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXI6OmNsZWFyTWV0YWRhdGEoKSB7Ci0gICAgbVBhcnNlZE1ldGFEYXRhID0gZmFsc2U7Ci0gICAgbU1ldGFEYXRhLmNsZWFyKCk7Ci0gICAgZGVsZXRlIG1BbGJ1bUFydDsKLSAgICBtQWxidW1BcnQgPSBOVUxMOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuY3BwCmluZGV4IDUxOWU4NzAuLmZiMDNjNWUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5jcHAKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgTE9HX1RBRyAiU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGRsZmNuLmg+CiAKICNpbmNsdWRlICJTdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oIgpAQCAtMjcsOSArMjgsMTcgQEAKIC8qIHN0YXRpYyAqLyBNdXRleCBTdGFnZWZyaWdodFBsdWdpbkxvYWRlcjo6c011dGV4OwogLyogc3RhdGljICovIHN0ZDo6dW5pcXVlX3B0cjxTdGFnZWZyaWdodFBsdWdpbkxvYWRlcj4gU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OnNJbnN0YW5jZTsKIAotU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OlN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyKGNvbnN0IGNoYXIgKmxpYlBhdGgpCi0gICAgOiBtQ3JlYXRlQ29kZWMobnVsbHB0ciksCi0gICAgICBtQ3JlYXRlQnVpbGRlcihudWxscHRyKSB7CituYW1lc3BhY2UgLyogdW5uYW1lZCAqLyB7CisKK2NvbnN0ZXhwciBjb25zdCBjaGFyIGtDQ29kZWNQbHVnaW5QYXRoW10gPSAibGlic2ZwbHVnaW5fY2NvZGVjLnNvIjsKKworfSAgLy8gdW5uYW1lZCBuYW1lc3BhY2UKKworU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXI6OlN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyKGNvbnN0IGNoYXIgKmxpYlBhdGgpIHsKKyAgICBpZiAoYW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHkoImRlYnVnLnN0YWdlZnJpZ2h0LmNjb2RlYyIsIDEpID09IDApIHsKKyAgICAgICAgQUxPR0QoIkNDb2RlYyBpcyBkaXNhYmxlZC4iKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBtTGliSGFuZGxlID0gZGxvcGVuKGxpYlBhdGgsIFJUTERfTk9XIHwgUlRMRF9OT0RFTEVURSk7CiAgICAgaWYgKG1MaWJIYW5kbGUgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGxvYWQgbGlicmFyeTogJXMgKCVzKSIsIGxpYlBhdGgsIGRsZXJyb3IoKSk7CkBAIC00Niw3ICs1NSw3IEBACiAgICAgfQogICAgIG1DcmVhdGVJbnB1dFN1cmZhY2UgPSAoQ29kZWNCYXNlOjpDcmVhdGVJbnB1dFN1cmZhY2VGdW5jKWRsc3ltKAogICAgICAgICAgICAgbUxpYkhhbmRsZSwgIkNyZWF0ZUlucHV0U3VyZmFjZSIpOwotICAgIGlmIChtQ3JlYXRlQnVpbGRlciA9PSBudWxscHRyKSB7CisgICAgaWYgKG1DcmVhdGVJbnB1dFN1cmZhY2UgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRCgiRmFpbGVkIHRvIGZpbmQgc3ltYm9sOiBDcmVhdGVJbnB1dFN1cmZhY2UgKCVzKSIsIGRsZXJyb3IoKSk7CiAgICAgfQogfQpAQCAtODcsNyArOTYsNyBAQAogICAgIE11dGV4OjpBdXRvbG9jayBfbChzTXV0ZXgpOwogICAgIGlmICghc0luc3RhbmNlKSB7CiAgICAgICAgIEFMT0dWKCJMb2FkaW5nIGxpYnJhcnkiKTsKLSAgICAgICAgc0luc3RhbmNlLnJlc2V0KG5ldyBTdGFnZWZyaWdodFBsdWdpbkxvYWRlcigibGlic3RhZ2VmcmlnaHRfY2NvZGVjLnNvIikpOworICAgICAgICBzSW5zdGFuY2UucmVzZXQobmV3IFN0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyKGtDQ29kZWNQbHVnaW5QYXRoKSk7CiAgICAgfQogICAgIHJldHVybiBzSW5zdGFuY2U7CiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3RhZ2VmcmlnaHRQbHVnaW5Mb2FkZXIuaAppbmRleCA5OTlkMzBjLi43OGVmZmJmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9TdGFnZWZyaWdodFBsdWdpbkxvYWRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N0YWdlZnJpZ2h0UGx1Z2luTG9hZGVyLmgKQEAgLTQwLDEwICs0MCwxMCBAQAogICAgIHN0YXRpYyBNdXRleCBzTXV0ZXg7CiAgICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxTdGFnZWZyaWdodFBsdWdpbkxvYWRlcj4gc0luc3RhbmNlOwogCi0gICAgdm9pZCAqbUxpYkhhbmRsZTsKLSAgICBDb2RlY0Jhc2U6OkNyZWF0ZUNvZGVjRnVuYyBtQ3JlYXRlQ29kZWM7Ci0gICAgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZTo6Q3JlYXRlQnVpbGRlckZ1bmMgbUNyZWF0ZUJ1aWxkZXI7Ci0gICAgQ29kZWNCYXNlOjpDcmVhdGVJbnB1dFN1cmZhY2VGdW5jIG1DcmVhdGVJbnB1dFN1cmZhY2U7CisgICAgdm9pZCAqbUxpYkhhbmRsZXtudWxscHRyfTsKKyAgICBDb2RlY0Jhc2U6OkNyZWF0ZUNvZGVjRnVuYyBtQ3JlYXRlQ29kZWN7bnVsbHB0cn07CisgICAgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZTo6Q3JlYXRlQnVpbGRlckZ1bmMgbUNyZWF0ZUJ1aWxkZXJ7bnVsbHB0cn07CisgICAgQ29kZWNCYXNlOjpDcmVhdGVJbnB1dFN1cmZhY2VGdW5jIG1DcmVhdGVJbnB1dFN1cmZhY2V7bnVsbHB0cn07CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5jcHAKaW5kZXggOWUxMWE5NC4uNGM5NGJhYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuY3BwCkBAIC0xOCwxMCArMTgsMTMgQEAKICNkZWZpbmUgTE9HX1RBRyAiU3VyZmFjZVV0aWxzIgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9hcGktbGV2ZWwuaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CiAKK2V4dGVybiAiQyIgaW50IGFuZHJvaWRfZ2V0X2FwcGxpY2F0aW9uX3RhcmdldF9zZGtfdmVyc2lvbigpOworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXR1c190IHNldE5hdGl2ZVdpbmRvd1NpemVGb3JtYXRBbmRVc2FnZSgKQEAgLTI5MSw1ICsyOTQsMjggQEAKIAogICAgIHJldHVybiBlcnI7CiB9CisKK3N0YXR1c190IGRpc2FibGVMZWdhY3lCdWZmZXJEcm9wUG9zdFEoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBpZ2JwID0KKyAgICAgICAgICAgIHN1cmZhY2UgPyBzdXJmYWNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgOiBudWxscHRyOworICAgIGlmIChpZ2JwKSB7CisgICAgICAgIGludCB0YXJnZXRTZGsgPSBhbmRyb2lkX2dldF9hcHBsaWNhdGlvbl90YXJnZXRfc2RrX3ZlcnNpb24oKTsKKyAgICAgICAgLy8gV2hlbiB0aGUgY2FsbGVyIGlzIG5vdCBhbiBhcHAgKGUuZy4gTWVkaWFQbGF5ZXIgaW4gbWVkaWFzZXJ2ZXIpCisgICAgICAgIC8vIHRhcmdldFNkayBpcyBfX0FORFJPSURfQVBJX0ZVVFVSRV9fLgorICAgICAgICBib29sIGRyb3AgPQorICAgICAgICAgICAgICAgIHRhcmdldFNkayA8IF9fQU5EUk9JRF9BUElfUV9fIHx8CisgICAgICAgICAgICAgICAgdGFyZ2V0U2RrID09IF9fQU5EUk9JRF9BUElfRlVUVVJFX187CisgICAgICAgIGlmICghZHJvcCkgeworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gaWdicC0+c2V0TGVnYWN5QnVmZmVyRHJvcChmYWxzZSk7CisgICAgICAgICAgICBpZiAoZXJyID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0QoImxlZ2FjeSBidWZmZXIgZHJvcCBkaXNhYmxlZDogdGFyZ2V0IHNkayAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRTZGspOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRCgiZGlzYWJsaW5nIGxlZ2FjeSBidWZmZXIgZHJvcCBmYWlsZWQ6ICVkIiwgZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFiMjcwYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDE1IEBACit7CisgICJwb3N0c3VibWl0IjogWworICAgIHsKKyAgICAgICJuYW1lIjogIkN0c01lZGlhVGVzdENhc2VzIiwKKyAgICAgICJvcHRpb25zIjogWworICAgICAgICB7CisgICAgICAgICAgImluY2x1ZGUtYW5ub3RhdGlvbiI6ICJhbmRyb2lkLnBsYXRmb3JtLnRlc3QuYW5ub3RhdGlvbnMuUmVxdWlyZXNEZXZpY2UiCisgICAgICAgIH0KKyAgICAgIF0KKyAgICB9LAorICAgIHsKKyAgICAgICAibmFtZSI6ICJCYXR0ZXJ5Q2hlY2tlcl90ZXN0IgorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVXRpbHMuY3BwCmluZGV4IDMzNjE0ZDYuLjAyZThhYjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1V0aWxzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9VdGlscy5jcHAKQEAgLTM3LDcgKzM3LDkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29rdXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1N5c3RlbS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhUGxheWVySW50ZXJmYWNlLmg+CkBAIC03NCw3ICs3Niw3IEBACiB9CiAjZW5kaWYKIAotc3RhdGljIHZvaWQgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlQ29sb3JBc3BlY3RzKGNvbnN0IHNwPE1ldGFEYXRhPiAmbWV0YSwgc3A8QU1lc3NhZ2U+ICZtc2cpIHsKK3N0YXRpYyB2b2lkIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZUNvbG9yQXNwZWN0cyhjb25zdCBNZXRhRGF0YUJhc2UgKm1ldGEsIHNwPEFNZXNzYWdlPiAmbXNnKSB7CiAgICAgLy8gMCB2YWx1ZXMgYXJlIHVuc3BlY2lmaWVkCiAgICAgaW50MzJfdCByYW5nZSA9IDA7CiAgICAgaW50MzJfdCBwcmltYXJpZXMgPSAwOwpAQCAtMTE5LDcgKzEyMSw4IEBACiAgICAgfQogCiAgICAgLy8gaWYgdXNlci9jb250YWluZXIgc3VwcGxpZWQgSERSIHN0YXRpYyBpbmZvIHdpdGhvdXQgdHJhbnNmZXIgc2V0LCBhc3N1bWUgdHJ1ZQotICAgIGlmIChmb3JtYXQtPmNvbnRhaW5zKCJoZHItc3RhdGljLWluZm8iKSAmJiAhZm9ybWF0LT5jb250YWlucygiY29sb3ItdHJhbnNmZXIiKSkgeworICAgIGlmICgoZm9ybWF0LT5jb250YWlucygiaGRyLXN0YXRpYy1pbmZvIikgfHwgZm9ybWF0LT5jb250YWlucygiaGRyMTAtcGx1cy1pbmZvIikpCisgICAgICAgICAgICAmJiAhZm9ybWF0LT5jb250YWlucygiY29sb3ItdHJhbnNmZXIiKSkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgLy8gb3RoZXJ3aXNlLCB2ZXJpZnkgdGhhdCBhbiBIRFIgdHJhbnNmZXIgZnVuY3Rpb24gaXMgc2V0CkBAIC0xOTAsNiArMTkzLDkgQEAKICAgICAgICAgeyA1MCwgT01YX1ZJREVPX0FWQ0xldmVsNSAgfSwKICAgICAgICAgeyA1MSwgT01YX1ZJREVPX0FWQ0xldmVsNTEgfSwKICAgICAgICAgeyA1MiwgT01YX1ZJREVPX0FWQ0xldmVsNTIgfSwKKyAgICAgICAgeyA2MCwgT01YX1ZJREVPX0FWQ0xldmVsNiAgfSwKKyAgICAgICAgeyA2MSwgT01YX1ZJREVPX0FWQ0xldmVsNjEgfSwKKyAgICAgICAgeyA2MiwgT01YX1ZJREVPX0FWQ0xldmVsNjIgfSwKICAgICB9OwogICAgIGNvbnN0IHN0YXRpYyBBTG9va3VwPHVpbnQ4X3QsIE9NWF9WSURFT19BVkNQUk9GSUxFVFlQRT4gcHJvZmlsZXMgewogICAgICAgICB7IDY2LCBPTVhfVklERU9fQVZDUHJvZmlsZUJhc2VsaW5lIH0sCkBAIC01NjgsOCArNTc0LDI1NSBAQAogICAgIH0KIH0KIAorc3RhdGljIHZvaWQgcGFyc2VBVjFQcm9maWxlTGV2ZWxGcm9tQ3NkKGNvbnN0IHNwPEFCdWZmZXI+ICZjc2QsIHNwPEFNZXNzYWdlPiAmZm9ybWF0KSB7CisgICAgLy8gUGFyc2UgQ1NEIHN0cnVjdHVyZSB0byBleHRyYWN0IHByb2ZpbGUgbGV2ZWwgaW5mb3JtYXRpb24KKyAgICAvLyBodHRwczovL2FvbWVkaWFjb2RlYy5naXRodWIuaW8vYXYxLWlzb2JtZmYvI2F2MWNvZGVjY29uZmlndXJhdGlvbmJveAorICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBjc2QtPmRhdGEoKTsKKyAgICBzaXplX3QgcmVtYWluaW5nID0gY3NkLT5zaXplKCk7CisgICAgaWYgKHJlbWFpbmluZyA8IDQgfHwgZGF0YVswXSAhPSAweDgxKSB7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdWludDhfdCBwcm9maWxlRGF0YSA9IChkYXRhWzFdICYgMHhFMCkgPj4gNTsKKyAgICB1aW50OF90IGxldmVsRGF0YSA9IGRhdGFbMV0gJiAweDFGOworICAgIHVpbnQ4X3QgaGlnaEJpdERlcHRoID0gKGRhdGFbMl0gJiAweDQwKSA+PiA2OworCisgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8c3RkOjpwYWlyPHVpbnQ4X3QsIHVpbnQ4X3Q+LCBpbnQzMl90PiBwcm9maWxlcyB7CisgICAgICAgIHsgeyAwLCAwIH0sIEFWMVByb2ZpbGVNYWluOCB9LAorICAgICAgICB7IHsgMSwgMCB9LCBBVjFQcm9maWxlTWFpbjEwIH0sCisgICAgfTsKKworICAgIGludDMyX3QgcHJvZmlsZTsKKyAgICBpZiAocHJvZmlsZXMubWFwKHN0ZDo6bWFrZV9wYWlyKGhpZ2hCaXREZXB0aCwgcHJvZmlsZURhdGEpLCAmcHJvZmlsZSkpIHsKKyAgICAgICAgLy8gYnVtcCB0byBIRFIgcHJvZmlsZQorICAgICAgICBpZiAoaXNIZHIoZm9ybWF0KSAmJiBwcm9maWxlID09IEFWMVByb2ZpbGVNYWluMTApIHsKKyAgICAgICAgICAgIGlmIChmb3JtYXQtPmNvbnRhaW5zKCJoZHIxMC1wbHVzLWluZm8iKSkgeworICAgICAgICAgICAgICAgIHByb2ZpbGUgPSBBVjFQcm9maWxlTWFpbjEwSERSMTBQbHVzOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwcm9maWxlID0gQVYxUHJvZmlsZU1haW4xMEhEUjEwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoInByb2ZpbGUiLCBwcm9maWxlKTsKKyAgICB9CisgICAgY29uc3Qgc3RhdGljIEFMb29rdXA8dWludDhfdCwgaW50MzJfdD4gbGV2ZWxzIHsKKyAgICAgICAgeyAwLCBBVjFMZXZlbDIgICB9LAorICAgICAgICB7IDEsIEFWMUxldmVsMjEgIH0sCisgICAgICAgIHsgMiwgQVYxTGV2ZWwyMiAgfSwKKyAgICAgICAgeyAzLCBBVjFMZXZlbDIzICB9LAorICAgICAgICB7IDQsIEFWMUxldmVsMyAgIH0sCisgICAgICAgIHsgNSwgQVYxTGV2ZWwzMSAgfSwKKyAgICAgICAgeyA2LCBBVjFMZXZlbDMyICB9LAorICAgICAgICB7IDcsIEFWMUxldmVsMzMgIH0sCisgICAgICAgIHsgOCwgQVYxTGV2ZWw0ICAgfSwKKyAgICAgICAgeyA5LCBBVjFMZXZlbDQxICB9LAorICAgICAgICB7IDEwLCBBVjFMZXZlbDQyICB9LAorICAgICAgICB7IDExLCBBVjFMZXZlbDQzICB9LAorICAgICAgICB7IDEyLCBBVjFMZXZlbDUgICB9LAorICAgICAgICB7IDEzLCBBVjFMZXZlbDUxICB9LAorICAgICAgICB7IDE0LCBBVjFMZXZlbDUyICB9LAorICAgICAgICB7IDE1LCBBVjFMZXZlbDUzICB9LAorICAgICAgICB7IDE2LCBBVjFMZXZlbDYgICB9LAorICAgICAgICB7IDE3LCBBVjFMZXZlbDYxICB9LAorICAgICAgICB7IDE4LCBBVjFMZXZlbDYyICB9LAorICAgICAgICB7IDE5LCBBVjFMZXZlbDYzICB9LAorICAgICAgICB7IDIwLCBBVjFMZXZlbDcgICB9LAorICAgICAgICB7IDIxLCBBVjFMZXZlbDcxICB9LAorICAgICAgICB7IDIyLCBBVjFMZXZlbDcyICB9LAorICAgICAgICB7IDIzLCBBVjFMZXZlbDczICB9LAorICAgIH07CisKKyAgICBpbnQzMl90IGxldmVsOworICAgIGlmIChsZXZlbHMubWFwKGxldmVsRGF0YSwgJmxldmVsKSkgeworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJsZXZlbCIsIGxldmVsKTsKKyAgICB9Cit9CisKKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIHVpbnQzMl90Pj4gc3RyaW5nTWFwcGluZ3MgeworICAgIHsKKyAgICAgICAgeyAiYWxidW0iLCBrS2V5QWxidW0gfSwKKyAgICAgICAgeyAiYWxidW1hcnRpc3QiLCBrS2V5QWxidW1BcnRpc3QgfSwKKyAgICAgICAgeyAiYXJ0aXN0Iiwga0tleUFydGlzdCB9LAorICAgICAgICB7ICJhdXRob3IiLCBrS2V5QXV0aG9yIH0sCisgICAgICAgIHsgImNkdHJhY2tudW0iLCBrS2V5Q0RUcmFja051bWJlciB9LAorICAgICAgICB7ICJjb21waWxhdGlvbiIsIGtLZXlDb21waWxhdGlvbiB9LAorICAgICAgICB7ICJjb21wb3NlciIsIGtLZXlDb21wb3NlciB9LAorICAgICAgICB7ICJkYXRlIiwga0tleURhdGUgfSwKKyAgICAgICAgeyAiZGlzY251bSIsIGtLZXlEaXNjTnVtYmVyIH0sCisgICAgICAgIHsgImdlbnJlIiwga0tleUdlbnJlIH0sCisgICAgICAgIHsgImxvY2F0aW9uIiwga0tleUxvY2F0aW9uIH0sCisgICAgICAgIHsgImx5cmljaXN0Iiwga0tleVdyaXRlciB9LAorICAgICAgICB7ICJtYW51ZmFjdHVyZXIiLCBrS2V5TWFudWZhY3R1cmVyIH0sCisgICAgICAgIHsgInRpdGxlIiwga0tleVRpdGxlIH0sCisgICAgICAgIHsgInllYXIiLCBrS2V5WWVhciB9LAorICAgIH0KK307CisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgY2hhciAqLCB1aW50MzJfdD4+IGZsb2F0TWFwcGluZ3MgeworICAgIHsKKyAgICAgICAgeyAiY2FwdHVyZS1yYXRlIiwga0tleUNhcHR1cmVGcmFtZXJhdGUgfSwKKyAgICB9Cit9OworCitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IGNoYXIgKiwgdWludDMyX3Q+PiBpbnQ2NE1hcHBpbmdzIHsKKyAgICB7CisgICAgICAgIHsgImV4aWYtb2Zmc2V0Iiwga0tleUV4aWZPZmZzZXQgfSwKKyAgICAgICAgeyAiZXhpZi1zaXplIiwga0tleUV4aWZTaXplIH0sCisgICAgICAgIHsgInRhcmdldC10aW1lIiwga0tleVRhcmdldFRpbWUgfSwKKyAgICAgICAgeyAidGh1bWJuYWlsLXRpbWUiLCBrS2V5VGh1bWJuYWlsVGltZSB9LAorICAgICAgICB7ICJ0aW1lVXMiLCBrS2V5VGltZSB9LAorICAgICAgICB7ICJkdXJhdGlvblVzIiwga0tleUR1cmF0aW9uIH0sCisgICAgfQorfTsKKworc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBjaGFyICosIHVpbnQzMl90Pj4gaW50MzJNYXBwaW5ncyB7CisgICAgeworICAgICAgICB7ICJsb29wIiwga0tleUF1dG9Mb29wIH0sCisgICAgICAgIHsgInRpbWUtc2NhbGUiLCBrS2V5VGltZVNjYWxlIH0sCisgICAgICAgIHsgImNyeXB0by1tb2RlIiwga0tleUNyeXB0b01vZGUgfSwKKyAgICAgICAgeyAiY3J5cHRvLWRlZmF1bHQtaXYtc2l6ZSIsIGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplIH0sCisgICAgICAgIHsgImNyeXB0by1lbmNyeXB0ZWQtYnl0ZS1ibG9jayIsIGtLZXlFbmNyeXB0ZWRCeXRlQmxvY2sgfSwKKyAgICAgICAgeyAiY3J5cHRvLXNraXAtYnl0ZS1ibG9jayIsIGtLZXlTa2lwQnl0ZUJsb2NrIH0sCisgICAgICAgIHsgImZyYW1lLWNvdW50Iiwga0tleUZyYW1lQ291bnQgfSwKKyAgICAgICAgeyAibWF4LWJpdHJhdGUiLCBrS2V5TWF4Qml0UmF0ZSB9LAorICAgICAgICB7ICJwY20tYmlnLWVuZGlhbiIsIGtLZXlQY21CaWdFbmRpYW4gfSwKKyAgICAgICAgeyAidGVtcG9yYWwtbGF5ZXItY291bnQiLCBrS2V5VGVtcG9yYWxMYXllckNvdW50IH0sCisgICAgICAgIHsgInRlbXBvcmFsLWxheWVyLWlkIiwga0tleVRlbXBvcmFsTGF5ZXJJZCB9LAorICAgICAgICB7ICJ0aHVtYm5haWwtd2lkdGgiLCBrS2V5VGh1bWJuYWlsV2lkdGggfSwKKyAgICAgICAgeyAidGh1bWJuYWlsLWhlaWdodCIsIGtLZXlUaHVtYm5haWxIZWlnaHQgfSwKKyAgICAgICAgeyAidHJhY2staWQiLCBrS2V5VHJhY2tJRCB9LAorICAgICAgICB7ICJ2YWxpZC1zYW1wbGVzIiwga0tleVZhbGlkU2FtcGxlcyB9LAorICAgIH0KK307CisKK3N0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgY2hhciAqLCB1aW50MzJfdD4+IGJ1ZmZlck1hcHBpbmdzIHsKKyAgICB7CisgICAgICAgIHsgImFsYnVtYXJ0Iiwga0tleUFsYnVtQXJ0IH0sCisgICAgICAgIHsgImF1ZGlvLXByZXNlbnRhdGlvbi1pbmZvIiwga0tleUF1ZGlvUHJlc2VudGF0aW9uSW5mbyB9LAorICAgICAgICB7ICJwc3NoIiwga0tleVBzc2ggfSwKKyAgICAgICAgeyAiY3J5cHRvLWl2Iiwga0tleUNyeXB0b0lWIH0sCisgICAgICAgIHsgImNyeXB0by1rZXkiLCBrS2V5Q3J5cHRvS2V5IH0sCisgICAgICAgIHsgImNyeXB0by1lbmNyeXB0ZWQtc2l6ZXMiLCBrS2V5RW5jcnlwdGVkU2l6ZXMgfSwKKyAgICAgICAgeyAiY3J5cHRvLXBsYWluLXNpemVzIiwga0tleVBsYWluU2l6ZXMgfSwKKyAgICAgICAgeyAiaWNjLXByb2ZpbGUiLCBrS2V5SWNjUHJvZmlsZSB9LAorICAgICAgICB7ICJzZWkiLCBrS2V5U0VJIH0sCisgICAgICAgIHsgInRleHQtZm9ybWF0LWRhdGEiLCBrS2V5VGV4dEZvcm1hdERhdGEgfSwKKyAgICAgICAgeyAidGh1bWJuYWlsLWNzZC1oZXZjIiwga0tleVRodW1ibmFpbEhWQ0MgfSwKKyAgICB9Cit9OworCitzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IGNoYXIgKiwgdWludDMyX3Q+PiBDU0RNYXBwaW5ncyB7CisgICAgeworICAgICAgICB7ICJjc2QtMCIsIGtLZXlPcGFxdWVDU0QwIH0sCisgICAgICAgIHsgImNzZC0xIiwga0tleU9wYXF1ZUNTRDEgfSwKKyAgICAgICAgeyAiY3NkLTIiLCBrS2V5T3BhcXVlQ1NEMiB9LAorICAgIH0KK307CisKK3ZvaWQgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhRnJvbU1hcHBpbmdzKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnLCBzcDxNZXRhRGF0YT4gJm1ldGEpIHsKKyAgICBmb3IgKGF1dG8gZWxlbSA6IHN0cmluZ01hcHBpbmdzKSB7CisgICAgICAgIEFTdHJpbmcgdmFsdWU7CisgICAgICAgIGlmIChtc2ctPmZpbmRTdHJpbmcoZWxlbS5maXJzdCwgJnZhbHVlKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0Q1N0cmluZyhlbGVtLnNlY29uZCwgdmFsdWUuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGZsb2F0TWFwcGluZ3MpIHsKKyAgICAgICAgZmxvYXQgdmFsdWU7CisgICAgICAgIGlmIChtc2ctPmZpbmRGbG9hdChlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRGbG9hdChlbGVtLnNlY29uZCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBpbnQ2NE1hcHBpbmdzKSB7CisgICAgICAgIGludDY0X3QgdmFsdWU7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQ2NChlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQ2NChlbGVtLnNlY29uZCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBpbnQzMk1hcHBpbmdzKSB7CisgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMihlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihlbGVtLnNlY29uZCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBidWZmZXJNYXBwaW5ncykgeworICAgICAgICBzcDxBQnVmZmVyPiB2YWx1ZTsKKyAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcihlbGVtLmZpcnN0LCAmdmFsdWUpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGVsZW0uc2Vjb25kLAorICAgICAgICAgICAgICAgICAgICBNZXRhRGF0YUJhc2U6OlR5cGU6OlRZUEVfTk9ORSwgdmFsdWUtPmRhdGEoKSwgdmFsdWUtPnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IENTRE1hcHBpbmdzKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IHZhbHVlOworICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKGVsZW0uZmlyc3QsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoZWxlbS5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgIE1ldGFEYXRhQmFzZTo6VHlwZTo6VFlQRV9OT05FLCB2YWx1ZS0+ZGF0YSgpLCB2YWx1ZS0+c2l6ZSgpKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2VGcm9tTWFwcGluZ3MoY29uc3QgTWV0YURhdGFCYXNlICptZXRhLCBzcDxBTWVzc2FnZT4gZm9ybWF0KSB7CisgICAgZm9yIChhdXRvIGVsZW0gOiBzdHJpbmdNYXBwaW5ncykgeworICAgICAgICBjb25zdCBjaGFyICp2YWx1ZTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRDU3RyaW5nKGVsZW0uc2Vjb25kLCAmdmFsdWUpKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldFN0cmluZyhlbGVtLmZpcnN0LCB2YWx1ZSwgc3RybGVuKHZhbHVlKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKGF1dG8gZWxlbSA6IGZsb2F0TWFwcGluZ3MpIHsKKyAgICAgICAgZmxvYXQgdmFsdWU7CisgICAgICAgIGlmIChtZXRhLT5maW5kRmxvYXQoZWxlbS5zZWNvbmQsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0RmxvYXQoZWxlbS5maXJzdCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBpbnQ2NE1hcHBpbmdzKSB7CisgICAgICAgIGludDY0X3QgdmFsdWU7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50NjQoZWxlbS5zZWNvbmQsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50NjQoZWxlbS5maXJzdCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBpbnQzMk1hcHBpbmdzKSB7CisgICAgICAgIGludDMyX3QgdmFsdWU7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoZWxlbS5zZWNvbmQsICZ2YWx1ZSkpIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoZWxlbS5maXJzdCwgdmFsdWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZm9yIChhdXRvIGVsZW0gOiBidWZmZXJNYXBwaW5ncykgeworICAgICAgICB1aW50MzJfdCB0eXBlOworICAgICAgICBjb25zdCB2b2lkKiBkYXRhOworICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGVsZW0uc2Vjb25kLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KGRhdGEsIHNpemUpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRCdWZmZXIoZWxlbS5maXJzdCwgYnVmKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byBlbGVtIDogQ1NETWFwcGluZ3MpIHsKKyAgICAgICAgdWludDMyX3QgdHlwZTsKKyAgICAgICAgY29uc3Qgdm9pZCogZGF0YTsKKyAgICAgICAgc2l6ZV90IHNpemU7CisgICAgICAgIGlmIChtZXRhLT5maW5kRGF0YShlbGVtLnNlY29uZCwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weShkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIGJ1Zi0+bWV0YSgpLT5zZXRJbnQzMigiY3NkIiwgdHJ1ZSk7CisgICAgICAgICAgICBidWYtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOworICAgICAgICAgICAgZm9ybWF0LT5zZXRCdWZmZXIoZWxlbS5maXJzdCwgYnVmKTsKKyAgICAgICAgfQorICAgIH0KK30KKwogc3RhdHVzX3QgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKAogICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KSB7CisgICAgcmV0dXJuIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZShtZXRhLmdldCgpLCBmb3JtYXQpOworfQorCitzdGF0dXNfdCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoCisgICAgICAgIGNvbnN0IE1ldGFEYXRhQmFzZSAqbWV0YSwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpIHsKIAogICAgIGZvcm1hdC0+Y2xlYXIoKTsKIApAQCAtNTg2LDYgKzgzOSw4IEBACiAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZTsKICAgICBtc2ctPnNldFN0cmluZygibWltZSIsIG1pbWUpOwogCisgICAgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlRnJvbU1hcHBpbmdzKG1ldGEsIG1zZyk7CisKICAgICB1aW50MzJfdCB0eXBlOwogICAgIGNvbnN0IHZvaWQgKmRhdGE7CiAgICAgc2l6ZV90IHNpemU7CkBAIC01OTksNiArODU0LDE2IEBACiAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CiAgICAgfQogCisgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlDQVByaXZhdGVEYXRhLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgeworICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKKyAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMIHx8IGJ1ZmZlci0+YmFzZSgpID09IE5VTEwpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgIH0KKworICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY2EtcHJpdmF0ZS1kYXRhIiwgYnVmZmVyKTsKKyAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBkYXRhLCBzaXplKTsKKyAgICB9CisKICAgICBpbnQzMl90IHN5c3RlbUlkOwogICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNBU3lzdGVtSUQsICZzeXN0ZW1JZCkpIHsKICAgICAgICAgbXNnLT5zZXRJbnQzMigiY2Etc3lzdGVtLWlkIiwgc3lzdGVtSWQpOwpAQCAtNjMyLDEyICs4OTcsNiBAQAogICAgICAgICBtc2ctPnNldEludDMyKCJpcy1zeW5jLWZyYW1lIiwgMSk7CiAgICAgfQogCi0gICAgLy8gdGhpcyBvbmx5IG5lZWRzIHRvIGJlIHRyYW5zbGF0ZWQgZnJvbSBtZXRhIHRvIG1lc3NhZ2UgYXMgaXQgaXMgYW4gZXh0cmFjdG9yIGtleQotICAgIGludDMyX3QgdHJhY2tJRDsKLSAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlUcmFja0lELCAmdHJhY2tJRCkpIHsKLSAgICAgICAgbXNnLT5zZXRJbnQzMigidHJhY2staWQiLCB0cmFja0lEKTsKLSAgICB9Ci0KICAgICBjb25zdCBjaGFyICpsYW5nOwogICAgIGlmIChtZXRhLT5maW5kQ1N0cmluZyhrS2V5TWVkaWFMYW5ndWFnZSwgJmxhbmcpKSB7CiAgICAgICAgIG1zZy0+c2V0U3RyaW5nKCJsYW5ndWFnZSIsIGxhbmcpOwpAQCAtNzEyLDYgKzk3MSwxNiBAQAogICAgICAgICAgICAgQ29sb3JVdGlsczo6c2V0SERSU3RhdGljSW5mb0ludG9Gb3JtYXQoKihIRFJTdGF0aWNJbmZvKilkYXRhLCBtc2cpOwogICAgICAgICB9CiAKKyAgICAgICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlIZHIxMFBsdXNJbmZvLCAmdHlwZSwgJmRhdGEsICZzaXplKQorICAgICAgICAgICAgICAgICYmIHNpemUgPiAwKSB7CisgICAgICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKKyAgICAgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisgICAgICAgICAgICBtc2ctPnNldEJ1ZmZlcigiaGRyMTAtcGx1cy1pbmZvIiwgYnVmZmVyKTsKKyAgICAgICAgfQorCiAgICAgICAgIGNvbnZlcnRNZXRhRGF0YVRvTWVzc2FnZUNvbG9yQXNwZWN0cyhtZXRhLCBtc2cpOwogICAgIH0gZWxzZSBpZiAoIXN0cm5jYXNlY21wKCJhdWRpby8iLCBtaW1lLCA2KSkgewogICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzLCBzYW1wbGVSYXRlOwpAQCAtNzIzLDYgKzk5MiwxMSBAQAogICAgICAgICBtc2ctPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgbnVtQ2hhbm5lbHMpOwogICAgICAgICBtc2ctPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHNhbXBsZVJhdGUpOwogCisgICAgICAgIGludDMyX3QgYml0c1BlclNhbXBsZTsKKyAgICAgICAgaWYgKG1ldGEtPmZpbmRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgJmJpdHNQZXJTYW1wbGUpKSB7CisgICAgICAgICAgICBtc2ctPnNldEludDMyKCJiaXRzLXBlci1zYW1wbGUiLCBiaXRzUGVyU2FtcGxlKTsKKyAgICAgICAgfQorCiAgICAgICAgIGludDMyX3QgY2hhbm5lbE1hc2s7CiAgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUNoYW5uZWxNYXNrLCAmY2hhbm5lbE1hc2spKSB7CiAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJjaGFubmVsLW1hc2siLCBjaGFubmVsTWFzayk7CkBAIC03NTEsNiArMTAyNSwxMSBAQAogICAgICAgICBpZiAobWV0YS0+ZmluZEludDMyKGtLZXlQY21FbmNvZGluZywgJnBjbUVuY29kaW5nKSkgewogICAgICAgICAgICAgbXNnLT5zZXRJbnQzMigicGNtLWVuY29kaW5nIiwgcGNtRW5jb2RpbmcpOwogICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBoYXB0aWNDaGFubmVsQ291bnQ7CisgICAgICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUhhcHRpY0NoYW5uZWxDb3VudCwgJmhhcHRpY0NoYW5uZWxDb3VudCkpIHsKKyAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoImhhcHRpYy1jaGFubmVsLWNvdW50IiwgaGFwdGljQ2hhbm5lbENvdW50KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGludDMyX3QgbWF4SW5wdXRTaXplOwpAQCAtODgwLDcgKzExNTksOSBAQAogICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleUhWQ0MsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciA9IChjb25zdCB1aW50OF90ICopZGF0YTsKIAotICAgICAgICBpZiAoc2l6ZSA8IDIzIHx8IHB0clswXSAhPSAxKSB7ICAvLyBjb25maWd1cmF0aW9uVmVyc2lvbiA9PSAxCisgICAgICAgIGlmIChzaXplIDwgMjMgfHwgKHB0clswXSAhPSAxICYmIHB0clswXSAhPSAwKSkgeworICAgICAgICAgICAgLy8gY29uZmlndXJhdGlvblZlcnNpb24gPT0gMSBvciAwCisgICAgICAgICAgICAvLyAxIGlzIHdoYXQgdGhlIHN0YW5kYXJkIGRpY3RhdGVzLCBidXQgc29tZSBvbGQgbXV4ZXJzIG1heSBoYXZlIHVzZWQgMC4KICAgICAgICAgICAgIEFMT0dFKCJiLzIzNjgwNzgwIik7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CkBAIC0xMDAxLDYgKzEyODIsMTcgQEAKICAgICAgICAgfQogCiAgICAgICAgIHBhcnNlSGV2Y1Byb2ZpbGVMZXZlbEZyb21IdmNjKChjb25zdCB1aW50OF90ICopZGF0YSwgZGF0YVNpemUsIG1zZyk7CisgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5QVYxQywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICB9CisgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7CisKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKKyAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKKyAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0wIiwgYnVmZmVyKTsKKyAgICAgICAgcGFyc2VBVjFQcm9maWxlTGV2ZWxGcm9tQ3NkKGJ1ZmZlciwgbXNnKTsKICAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlFU0RTLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewogICAgICAgICBFU0RTIGVzZHMoKGNvbnN0IGNoYXIgKilkYXRhLCBzaXplKTsKICAgICAgICAgaWYgKGVzZHMuSW5pdENoZWNrKCkgIT0gKHN0YXR1c190KU9LKSB7CkBAIC0xMDQ4LDMzICsxMzQwLDkgQEAKICAgICAgICAgICAgICAgICBtc2ctPnNldEludDMyKCJtYXgtYml0cmF0ZSIsIChpbnQzMl90KW1heEJpdHJhdGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrVHlwZUQyNjMsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CisgICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5RDI2MywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKICAgICAgICAgY29uc3QgdWludDhfdCAqcHRyID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwogICAgICAgICBwYXJzZUgyNjNQcm9maWxlTGV2ZWxGcm9tRDI2MyhwdHIsIHNpemUsIG1zZyk7Ci0gICAgfSBlbHNlIGlmIChtZXRhLT5maW5kRGF0YShrS2V5Vm9yYmlzSW5mbywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7Ci0gICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7Ci0KLSAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKLSAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKLSAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0wIiwgYnVmZmVyKTsKLQotICAgICAgICBpZiAoIW1ldGEtPmZpbmREYXRhKGtLZXlWb3JiaXNCb29rcywgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwotICAgICAgICB9Ci0KLSAgICAgICAgYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7Ci0gICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7Ci0KLSAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKLSAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKLSAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0xIiwgYnVmZmVyKTsKICAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlPcHVzSGVhZGVyLCAmdHlwZSwgJmRhdGEsICZzaXplKSkgewogICAgICAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBuZXcgKHN0ZDo6bm90aHJvdykgQUJ1ZmZlcihzaXplKTsKICAgICAgICAgaWYgKGJ1ZmZlci5nZXQoKSA9PSBOVUxMIHx8IGJ1ZmZlci0+YmFzZSgpID09IE5VTEwpIHsKQEAgLTExMTMsMTYgKzEzODEsNiBAQAogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50MzIoImNzZCIsIHRydWUpOwogICAgICAgICBidWZmZXItPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIDApOwogICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3NkLTIiLCBidWZmZXIpOwotICAgIH0gZWxzZSBpZiAobWV0YS0+ZmluZERhdGEoa0tleUZsYWNNZXRhZGF0YSwgJnR5cGUsICZkYXRhLCAmc2l6ZSkpIHsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IChzdGQ6Om5vdGhyb3cpIEFCdWZmZXIoc2l6ZSk7Ci0gICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gTlVMTCB8fCBidWZmZXItPmJhc2UoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgICAgICB9Ci0gICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7Ci0KLSAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDMyKCJjc2QiLCB0cnVlKTsKLSAgICAgICAgYnVmZmVyLT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCAwKTsKLSAgICAgICAgbXNnLT5zZXRCdWZmZXIoImNzZC0wIiwgYnVmZmVyKTsKICAgICB9IGVsc2UgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlWcDlDb2RlY1ByaXZhdGUsICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7CiAgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKHNpemUpOwogICAgICAgICBpZiAoYnVmZmVyLmdldCgpID09IE5VTEwgfHwgYnVmZmVyLT5iYXNlKCkgPT0gTlVMTCkgewpAQCAtMTE0OCwxMyArMTQwNiw2IEBACiAgICAgICAgIG1zZy0+c2V0QnVmZmVyKCJjc2QtMCIsIGJ1ZmZlcik7CiAgICAgfQogCi0gICAgLy8gVE9ETyBleHBvc2UgImNyeXB0by1rZXkiL2tLZXlDcnlwdG9LZXkgdGhyb3VnaCBwdWJsaWMgYXBpCi0gICAgaWYgKG1ldGEtPmZpbmREYXRhKGtLZXlDcnlwdG9LZXksICZ0eXBlLCAmZGF0YSwgJnNpemUpKSB7Ci0gICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyAoc3RkOjpub3Rocm93KSBBQnVmZmVyKHNpemUpOwotICAgICAgICBtc2ctPnNldEJ1ZmZlcigiY3J5cHRvLWtleSIsIGJ1ZmZlcik7Ci0gICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSwgZGF0YSwgc2l6ZSk7Ci0gICAgfQotCiAgICAgKmZvcm1hdCA9IG1zZzsKIAogICAgIHJldHVybiBPSzsKQEAgLTEzNTMsNiArMTYwNCwyMSBAQAogICAgICAgICBBTE9HVygiZGlkIG5vdCBmaW5kIG1pbWUgdHlwZSIpOwogICAgIH0KIAorICAgIGNvbnZlcnRNZXNzYWdlVG9NZXRhRGF0YUZyb21NYXBwaW5ncyhtc2csIG1ldGEpOworCisgICAgaW50MzJfdCBzeXN0ZW1JZDsKKyAgICBpZiAobXNnLT5maW5kSW50MzIoImNhLXN5c3RlbS1pZCIsICZzeXN0ZW1JZCkpIHsKKyAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIHN5c3RlbUlkKTsKKworICAgICAgICBzcDxBQnVmZmVyPiBjYVNlc3Npb25JZCwgY2FQdnREYXRhOworICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJjYS1zZXNzaW9uLWlkIiwgJmNhU2Vzc2lvbklkKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5Q0FTZXNzaW9uSUQsIDAsIGNhU2Vzc2lvbklkLT5kYXRhKCksIGNhU2Vzc2lvbklkLT5zaXplKCkpOworICAgICAgICB9CisgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImNhLXByaXZhdGUtZGF0YSIsICZjYVB2dERhdGEpKSB7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlDQVByaXZhdGVEYXRhLCAwLCBjYVB2dERhdGEtPmRhdGEoKSwgY2FQdnREYXRhLT5zaXplKCkpOworICAgICAgICB9CisgICAgfQorCiAgICAgaW50NjRfdCBkdXJhdGlvblVzOwogICAgIGlmIChtc2ctPmZpbmRJbnQ2NCgiZHVyYXRpb25VcyIsICZkdXJhdGlvblVzKSkgewogICAgICAgICBtZXRhLT5zZXRJbnQ2NChrS2V5RHVyYXRpb24sIGR1cmF0aW9uVXMpOwpAQCAtMTM4NCw3ICsxNjUwLDcgQEAKICAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlXaWR0aCwgd2lkdGgpOwogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUhlaWdodCwgaGVpZ2h0KTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJkaWQgbm90IGZpbmQgd2lkdGggYW5kL29yIGhlaWdodCIpOworICAgICAgICAgICAgQUxPR1YoImRpZCBub3QgZmluZCB3aWR0aCBhbmQvb3IgaGVpZ2h0Iik7CiAgICAgICAgIH0KIAogICAgICAgICBpbnQzMl90IHNhcldpZHRoLCBzYXJIZWlnaHQ7CkBAIC0xNDQ3LDYgKzE3MTMsMTIgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCisgICAgICAgIHNwPEFCdWZmZXI+IGhkcjEwUGx1c0luZm87CisgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImhkcjEwLXBsdXMtaW5mbyIsICZoZHIxMFBsdXNJbmZvKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SGRyMTBQbHVzSW5mbywgMCwKKyAgICAgICAgICAgICAgICAgICAgaGRyMTBQbHVzSW5mby0+ZGF0YSgpLCBoZHIxMFBsdXNJbmZvLT5zaXplKCkpOworICAgICAgICB9CisKICAgICAgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhQ29sb3JBc3BlY3RzKG1zZywgbWV0YSk7CiAKICAgICAgICAgQVN0cmluZyB0c1NjaGVtYTsKQEAgLTE0NzEsNiArMTc0MywxMCBAQAogICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoInNhbXBsZS1yYXRlIiwgJnNhbXBsZVJhdGUpKSB7CiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5U2FtcGxlUmF0ZSwgc2FtcGxlUmF0ZSk7CiAgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBiaXRzUGVyU2FtcGxlOworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImJpdHMtcGVyLXNhbXBsZSIsICZiaXRzUGVyU2FtcGxlKSkgeworICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUJpdHNQZXJTYW1wbGUsIGJpdHNQZXJTYW1wbGUpOworICAgICAgICB9CiAgICAgICAgIGludDMyX3QgY2hhbm5lbE1hc2s7CiAgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiY2hhbm5lbC1tYXNrIiwgJmNoYW5uZWxNYXNrKSkgewogICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNoYW5uZWxNYXNrLCBjaGFubmVsTWFzayk7CkBAIC0xNDg5LDEwICsxNzY1LDIwIEBACiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5SXNBRFRTLCBpc0FEVFMpOwogICAgICAgICB9CiAKKyAgICAgICAgaW50MzJfdCBhYWNQcm9maWxlID0gLTE7CisgICAgICAgIGlmIChtc2ctPmZpbmRJbnQzMigiYWFjLXByb2ZpbGUiLCAmYWFjUHJvZmlsZSkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlBQUNBT1QsIGFhY1Byb2ZpbGUpOworICAgICAgICB9CisKICAgICAgICAgaW50MzJfdCBwY21FbmNvZGluZzsKICAgICAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJwY20tZW5jb2RpbmciLCAmcGNtRW5jb2RpbmcpKSB7CiAgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5UGNtRW5jb2RpbmcsIHBjbUVuY29kaW5nKTsKICAgICAgICAgfQorCisgICAgICAgIGludDMyX3QgaGFwdGljQ2hhbm5lbENvdW50OworICAgICAgICBpZiAobXNnLT5maW5kSW50MzIoImhhcHRpYy1jaGFubmVsLWNvdW50IiwgJmhhcHRpY0NoYW5uZWxDb3VudCkpIHsKKyAgICAgICAgICAgIG1ldGEtPnNldEludDMyKGtLZXlIYXB0aWNDaGFubmVsQ291bnQsIGhhcHRpY0NoYW5uZWxDb3VudCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpbnQzMl90IG1heElucHV0U2l6ZTsKQEAgLTE1MTUsNyArMTgwMSw3IEBACiAgICAgaWYgKG1zZy0+ZmluZEludDMyKCJmcmFtZS1yYXRlIiwgJmZwcykgJiYgZnBzID4gMCkgewogICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5RnJhbWVSYXRlLCBmcHMpOwogICAgIH0gZWxzZSBpZiAobXNnLT5maW5kRmxvYXQoImZyYW1lLXJhdGUiLCAmZnBzRmxvYXQpCi0gICAgICAgICAgICAmJiBmcHNGbG9hdCA+PSAxICYmIGZwc0Zsb2F0IDw9IElOVDMyX01BWCkgeworICAgICAgICAgICAgJiYgZnBzRmxvYXQgPj0gMSAmJiBzdGF0aWNfY2FzdDxpbnQzMl90PihmcHNGbG9hdCkgPD0gSU5UMzJfTUFYKSB7CiAgICAgICAgIC8vIHRydW5jYXRlIHZhbHVlcyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGUuZy4gMjQgdnMgMjMuOTc2IGZwcwogICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5RnJhbWVSYXRlLCAoaW50MzJfdClmcHNGbG9hdCk7CiAgICAgfQpAQCAtMTUyOSw0MiArMTgxNSw3MSBAQAogICAgICAgICAgICAgaWYgKG1zZy0+ZmluZEJ1ZmZlcigiY3NkLTEiLCAmY3NkMSkpIHsKICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBhdmNjKGNzZDBzaXplICsgY3NkMS0+c2l6ZSgpICsgMTAyNCk7CiAgICAgICAgICAgICAgICAgc2l6ZV90IG91dHNpemUgPSByZWFzc2VtYmxlQVZDQyhjc2QwLCBjc2QxLCBhdmNjLmRhdGEoKSk7Ci0gICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5QVZDQywga0tleUFWQ0MsIGF2Y2MuZGF0YSgpLCBvdXRzaXplKTsKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVkNDLCBrVHlwZUFWQ0MsIGF2Y2MuZGF0YSgpLCBvdXRzaXplKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX0FBQyB8fCBtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0KSB7CisgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19BQUMgfHwKKyAgICAgICAgICAgICAgICBtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX01QRUc0IHx8CisgICAgICAgICAgICAgICAgbWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19XTUEgfHwKKyAgICAgICAgICAgICAgICBtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX01TX0FEUENNIHx8CisgICAgICAgICAgICAgICAgbWltZSA9PSBNRURJQV9NSU1FVFlQRV9BVURJT19EVklfSU1BX0FEUENNKSB7CiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBlc2RzKGNzZDBzaXplICsgMzEpOwogICAgICAgICAgICAgLy8gVGhlIHdyaXR0ZW4gRVNEUyBpcyBhY3R1YWxseSBmb3IgYW4gYXVkaW8gc3RyZWFtLCBidXQgaXQncyBlbm91Z2gKICAgICAgICAgICAgIC8vIGZvciB0cmFuc3BvcnRpbmcgdGhlIENTRCB0byBtdXhlcnMuCiAgICAgICAgICAgICByZWFzc2VtYmxlRVNEUyhjc2QwLCBlc2RzLmRhdGEoKSk7Ci0gICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlFU0RTLCBrS2V5RVNEUywgZXNkcy5kYXRhKCksIGVzZHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUVTRFMsIGtUeXBlRVNEUywgZXNkcy5kYXRhKCksIGVzZHMuc2l6ZSgpKTsKICAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMgfHwKICAgICAgICAgICAgICAgICAgICBtaW1lID09IE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQykgewogICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gaHZjYyhjc2Qwc2l6ZSArIDEwMjQpOwogICAgICAgICAgICAgc2l6ZV90IG91dHNpemUgPSByZWFzc2VtYmxlSFZDQyhjc2QwLCBodmNjLmRhdGEoKSwgaHZjYy5zaXplKCksIDQpOwotICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5SFZDQywga0tleUhWQ0MsIGh2Y2MuZGF0YSgpLCBvdXRzaXplKTsKKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgaHZjYy5kYXRhKCksIG91dHNpemUpOworICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fQVYxKSB7CisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVjFDLCAwLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CiAgICAgICAgIH0gZWxzZSBpZiAobWltZSA9PSBNRURJQV9NSU1FVFlQRV9WSURFT19WUDkpIHsKICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVZwOUNvZGVjUHJpdmF0ZSwgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwogICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUykgewotICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5T3B1c0hlYWRlciwgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOworICAgICAgICAgICAgc2l6ZV90IG9wdXNIZWFkU2l6ZSA9IGNzZDAtPnNpemUoKTsKKyAgICAgICAgICAgIHNpemVfdCBjb2RlY0RlbGF5QnVmU2l6ZSA9IDA7CisgICAgICAgICAgICBzaXplX3Qgc2Vla1ByZVJvbGxCdWZTaXplID0gMDsKKyAgICAgICAgICAgIHZvaWQgKm9wdXNIZWFkQnVmID0gY3NkMC0+ZGF0YSgpOworICAgICAgICAgICAgdm9pZCAqY29kZWNEZWxheUJ1ZiA9IE5VTEw7CisgICAgICAgICAgICB2b2lkICpzZWVrUHJlUm9sbEJ1ZiA9IE5VTEw7CiAgICAgICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJjc2QtMSIsICZjc2QxKSkgewotICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU9wdXNDb2RlY0RlbGF5LCAwLCBjc2QxLT5kYXRhKCksIGNzZDEtPnNpemUoKSk7CisgICAgICAgICAgICAgICAgY29kZWNEZWxheUJ1ZlNpemUgPSBjc2QxLT5zaXplKCk7CisgICAgICAgICAgICAgICAgY29kZWNEZWxheUJ1ZiA9IGNzZDEtPmRhdGEoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChtc2ctPmZpbmRCdWZmZXIoImNzZC0yIiwgJmNzZDIpKSB7Ci0gICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5T3B1c1NlZWtQcmVSb2xsLCAwLCBjc2QyLT5kYXRhKCksIGNzZDItPnNpemUoKSk7CisgICAgICAgICAgICAgICAgc2Vla1ByZVJvbGxCdWZTaXplID0gY3NkMi0+c2l6ZSgpOworICAgICAgICAgICAgICAgIHNlZWtQcmVSb2xsQnVmID0gY3NkMi0+ZGF0YSgpOwogICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSB7Ci0gICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlWb3JiaXNJbmZvLCAwLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7Ci0gICAgICAgICAgICBpZiAobXNnLT5maW5kQnVmZmVyKCJjc2QtMSIsICZjc2QxKSkgewotICAgICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVZvcmJpc0Jvb2tzLCAwLCBjc2QxLT5kYXRhKCksIGNzZDEtPnNpemUoKSk7CisgICAgICAgICAgICAvKiBFeHRyYWN0IGNvZGVjIGRlbGF5IGFuZCBzZWVrIHByZSByb2xsIGZyb20gY3NkLTAsCisgICAgICAgICAgICAgKiBpZiBjc2QtMSBhbmQgY3NkLTIgYXJlIG5vdCBwcmVzZW50ICovCisgICAgICAgICAgICBpZiAoIWNvZGVjRGVsYXlCdWYgJiYgIXNlZWtQcmVSb2xsQnVmKSB7CisgICAgICAgICAgICAgICAgR2V0T3B1c0hlYWRlckJ1ZmZlcnMoY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCksICZvcHVzSGVhZEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvcHVzSGVhZFNpemUsICZjb2RlY0RlbGF5QnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjRGVsYXlCdWZTaXplLCAmc2Vla1ByZVJvbGxCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2Vla1ByZVJvbGxCdWZTaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleU9wdXNIZWFkZXIsIDAsIG9wdXNIZWFkQnVmLCBvcHVzSGVhZFNpemUpOworICAgICAgICAgICAgaWYgKGNvZGVjRGVsYXlCdWYpIHsKKyAgICAgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlPcHVzQ29kZWNEZWxheSwgMCwgY29kZWNEZWxheUJ1ZiwgY29kZWNEZWxheUJ1ZlNpemUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHNlZWtQcmVSb2xsQnVmKSB7CisgICAgICAgICAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5T3B1c1NlZWtQcmVSb2xsLCAwLCBzZWVrUHJlUm9sbEJ1Ziwgc2Vla1ByZVJvbGxCdWZTaXplKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChtaW1lID09IE1FRElBX01JTUVUWVBFX0FVRElPX0FMQUMpIHsKICAgICAgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUFsYWNNYWdpY0Nvb2tpZSwgMCwgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOwogICAgICAgICB9Ci0gICAgfQotCi0gICAgaW50MzJfdCB0aW1lU2NhbGU7Ci0gICAgaWYgKG1zZy0+ZmluZEludDMyKCJ0aW1lLXNjYWxlIiwgJnRpbWVTY2FsZSkpIHsKLSAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleVRpbWVTY2FsZSwgdGltZVNjYWxlKTsKKyAgICB9IGVsc2UgaWYgKG1pbWUgPT0gTUVESUFfTUlNRVRZUEVfVklERU9fQVZDICYmIG1zZy0+ZmluZEJ1ZmZlcigiY3NkLWF2YyIsICZjc2QwKSkgeworICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlBVkNDLCBrVHlwZUFWQ0MsIGNzZDAtPmRhdGEoKSwgY3NkMC0+c2l6ZSgpKTsKKyAgICB9IGVsc2UgaWYgKChtaW1lID09IE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMgfHwgbWltZSA9PSBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpCisgICAgICAgICAgICAmJiBtc2ctPmZpbmRCdWZmZXIoImNzZC1oZXZjIiwgJmNzZDApKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUhWQ0MsIGtUeXBlSFZDQywgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOworICAgIH0gZWxzZSBpZiAobXNnLT5maW5kQnVmZmVyKCJlc2RzIiwgJmNzZDApKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleUVTRFMsIGtUeXBlRVNEUywgY3NkMC0+ZGF0YSgpLCBjc2QwLT5zaXplKCkpOworICAgIH0gZWxzZSBpZiAobXNnLT5maW5kQnVmZmVyKCJtcGVnMi1zdHJlYW0taGVhZGVyIiwgJmNzZDApKSB7CisgICAgICAgIG1ldGEtPnNldERhdGEoa0tleVN0cmVhbUhlYWRlciwgJ21kYXQnLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CisgICAgfSBlbHNlIGlmIChtc2ctPmZpbmRCdWZmZXIoImQyNjMiLCAmY3NkMCkpIHsKKyAgICAgICAgbWV0YS0+c2V0RGF0YShrS2V5RDI2Mywga1R5cGVEMjYzLCBjc2QwLT5kYXRhKCksIGNzZDAtPnNpemUoKSk7CiAgICAgfQogCiAgICAgLy8gWFhYIFRPRE8gYWRkIHdoYXRldmVyIG90aGVyIGtleXMgdGhlcmUgYXJlCkBAIC0xNTc1LDIyICsxODkwLDYgQEAKICNlbmRpZgogfQogCi1BU3RyaW5nIE1ha2VVc2VyQWdlbnQoKSB7Ci0gICAgQVN0cmluZyB1YTsKLSAgICB1YS5hcHBlbmQoInN0YWdlZnJpZ2h0LzEuMiAoTGludXg7QW5kcm9pZCAiKTsKLQotI2lmIChQUk9QRVJUWV9WQUxVRV9NQVggPCA4KQotI2Vycm9yICJQUk9QRVJUWV9WQUxVRV9NQVggbXVzdCBiZSBhdCBsZWFzdCA4IgotI2VuZGlmCi0KLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgcHJvcGVydHlfZ2V0KCJyby5idWlsZC52ZXJzaW9uLnJlbGVhc2UiLCB2YWx1ZSwgIlVua25vd24iKTsKLSAgICB1YS5hcHBlbmQodmFsdWUpOwotICAgIHVhLmFwcGVuZCgiKSIpOwotCi0gICAgcmV0dXJuIHVhOwotfQotCiBzdGF0dXNfdCBzZW5kTWV0YURhdGFUb0hhbChzcDxNZWRpYVBsYXllckJhc2U6OkF1ZGlvU2luaz4mIHNpbmssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEpCiB7CkBAIC0xNjQwLDYgKzE5MzksOSBAQAogICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLCAgICAgIEFVRElPX0ZPUk1BVF9WT1JCSVMgfSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsICAgICAgICBBVURJT19GT1JNQVRfT1BVU30sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BQzMsICAgICAgICAgQVVESU9fRk9STUFUX0FDM30sCisgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzLCAgICAgICAgQVVESU9fRk9STUFUX0VfQUMzfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzNfSk9DLCAgICBBVURJT19GT1JNQVRfRV9BQzNfSk9DfSwKKyAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCwgICAgICAgICBBVURJT19GT1JNQVRfQUM0fSwKICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0ZMQUMsICAgICAgICBBVURJT19GT1JNQVRfRkxBQ30sCiAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDLCAgICAgICAgQVVESU9fRk9STUFUX0FMQUMgfSwKICAgICB7IDAsIEFVRElPX0ZPUk1BVF9JTlZBTElEIH0KQEAgLTE2OTMsNDMgKzE5OTUsNDMgQEAKICAgICByZXR1cm47CiB9CiAKLWJvb2wgY2FuT2ZmbG9hZFN0cmVhbShjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1N0cmVhbWluZywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlKQorc3RhdHVzX3QgZ2V0QXVkaW9PZmZsb2FkSW5mbyhjb25zdCBzcDxNZXRhRGF0YT4mIG1ldGEsIGJvb2wgaGFzVmlkZW8sCisgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgKmluZm8pCiB7CiAgICAgY29uc3QgY2hhciAqbWltZTsKICAgICBpZiAobWV0YSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQ0hFQ0sobWV0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpOwogCi0gICAgYXVkaW9fb2ZmbG9hZF9pbmZvX3QgaW5mbyA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CisgICAgKCppbmZvKSA9IEFVRElPX0lORk9fSU5JVElBTElaRVI7CiAKLSAgICBpbmZvLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwotICAgIGlmIChtYXBNaW1lVG9BdWRpb0Zvcm1hdChpbmZvLmZvcm1hdCwgbWltZSkgIT0gT0spIHsKKyAgICBpbmZvLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICBpZiAobWFwTWltZVRvQXVkaW9Gb3JtYXQoaW5mby0+Zm9ybWF0LCBtaW1lKSAhPSBPSykgewogICAgICAgICBBTE9HRSgiIENvdWxkbid0IG1hcCBtaW1lIHR5cGUgXCIlc1wiIHRvIGEgdmFsaWQgQXVkaW9TeXN0ZW06OmF1ZGlvX2Zvcm1hdCAhIiwgbWltZSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigiTWltZSB0eXBlIFwiJXNcIiBtYXBwZWQgdG8gYXVkaW9fZm9ybWF0ICVkIiwgbWltZSwgaW5mby5mb3JtYXQpOworICAgICAgICBBTE9HVigiTWltZSB0eXBlIFwiJXNcIiBtYXBwZWQgdG8gYXVkaW9fZm9ybWF0ICVkIiwgbWltZSwgaW5mby0+Zm9ybWF0KTsKICAgICB9CiAKLSAgICBpZiAoQVVESU9fRk9STUFUX0lOVkFMSUQgPT0gaW5mby5mb3JtYXQpIHsKKyAgICBpZiAoQVVESU9fRk9STUFUX0lOVkFMSUQgPT0gaW5mby0+Zm9ybWF0KSB7CiAgICAgICAgIC8vIGNhbid0IG9mZmxvYWQgaWYgd2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBzb3VyY2UgZm9ybWF0IGlzCiAgICAgICAgIEFMT0dFKCJtaW1lIHR5cGUgXCIlc1wiIG5vdCBhIGtub3duIGF1ZGlvIGZvcm1hdCIsIG1pbWUpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgLy8gUmVkZWZpbmUgYWFjIGZvcm1hdCBhY2NvcmRpbmcgdG8gaXRzIHByb2ZpbGUKICAgICAvLyBPZmZsb2FkaW5nIGRlcGVuZHMgb24gYXVkaW8gRFNQIGNhcGFiaWxpdGllcy4KICAgICBpbnQzMl90IGFhY2FvdCA9IC0xOwogICAgIGlmIChtZXRhLT5maW5kSW50MzIoa0tleUFBQ0FPVCwgJmFhY2FvdCkpIHsKLSAgICAgICAgbWFwQUFDUHJvZmlsZVRvQXVkaW9Gb3JtYXQoaW5mby5mb3JtYXQsKE9NWF9BVURJT19BQUNQUk9GSUxFVFlQRSkgYWFjYW90KTsKKyAgICAgICAgbWFwQUFDUHJvZmlsZVRvQXVkaW9Gb3JtYXQoaW5mby0+Zm9ybWF0LChPTVhfQVVESU9fQUFDUFJPRklMRVRZUEUpIGFhY2FvdCk7CiAgICAgfQogCiAgICAgaW50MzJfdCBzcmF0ZSA9IC0xOwogICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlTYW1wbGVSYXRlLCAmc3JhdGUpKSB7CiAgICAgICAgIEFMT0dWKCJ0cmFjayBvZiB0eXBlICclcycgZG9lcyBub3QgcHVibGlzaCBzYW1wbGUgcmF0ZSIsIG1pbWUpOwogICAgIH0KLSAgICBpbmZvLnNhbXBsZV9yYXRlID0gc3JhdGU7CisgICAgaW5mby0+c2FtcGxlX3JhdGUgPSBzcmF0ZTsKIAogICAgIGludDMyX3QgY21hc2sgPSAwOwogICAgIGlmICghbWV0YS0+ZmluZEludDMyKGtLZXlDaGFubmVsTWFzaywgJmNtYXNrKSB8fCBjbWFzayA9PSBDSEFOTkVMX01BU0tfVVNFX0NIQU5ORUxfT1JERVIpIHsKQEAgLTE3NDMsNjMgKzIwNDUsMzkgQEAKICAgICAgICAgICAgIGNtYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaW5mby5jaGFubmVsX21hc2sgPSBjbWFzazsKKyAgICBpbmZvLT5jaGFubmVsX21hc2sgPSBjbWFzazsKIAogICAgIGludDY0X3QgZHVyYXRpb24gPSAwOwogICAgIGlmICghbWV0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKSkgewogICAgICAgICBBTE9HVigidHJhY2sgb2YgdHlwZSAnJXMnIGRvZXMgbm90IHB1Ymxpc2ggZHVyYXRpb24iLCBtaW1lKTsKICAgICB9Ci0gICAgaW5mby5kdXJhdGlvbl91cyA9IGR1cmF0aW9uOworICAgIGluZm8tPmR1cmF0aW9uX3VzID0gZHVyYXRpb247CiAKICAgICBpbnQzMl90IGJyYXRlID0gLTE7CiAgICAgaWYgKCFtZXRhLT5maW5kSW50MzIoa0tleUJpdFJhdGUsICZicmF0ZSkpIHsKICAgICAgICAgQUxPR1YoInRyYWNrIG9mIHR5cGUgJyVzJyBkb2VzIG5vdCBwdWJsaXNoIGJpdHJhdGUiLCBtaW1lKTsKICAgICB9Ci0gICAgaW5mby5iaXRfcmF0ZSA9IGJyYXRlOworICAgIGluZm8tPmJpdF9yYXRlID0gYnJhdGU7CiAKIAotICAgIGluZm8uc3RyZWFtX3R5cGUgPSBzdHJlYW1UeXBlOwotICAgIGluZm8uaGFzX3ZpZGVvID0gaGFzVmlkZW87Ci0gICAgaW5mby5pc19zdHJlYW1pbmcgPSBpc1N0cmVhbWluZzsKKyAgICBpbmZvLT5zdHJlYW1fdHlwZSA9IHN0cmVhbVR5cGU7CisgICAgaW5mby0+aGFzX3ZpZGVvID0gaGFzVmlkZW87CisgICAgaW5mby0+aXNfc3RyZWFtaW5nID0gaXNTdHJlYW1pbmc7CisgICAgcmV0dXJuIE9LOworfQogCitib29sIGNhbk9mZmxvYWRTdHJlYW0oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKK3sKKyAgICBhdWRpb19vZmZsb2FkX2luZm9fdCBpbmZvID0gQVVESU9fSU5GT19JTklUSUFMSVpFUjsKKyAgICBpZiAoT0sgIT0gZ2V0QXVkaW9PZmZsb2FkSW5mbyhtZXRhLCBoYXNWaWRlbywgaXNTdHJlYW1pbmcsIHN0cmVhbVR5cGUsICZpbmZvKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQogICAgIC8vIENoZWNrIGlmIG9mZmxvYWQgaXMgcG9zc2libGUgZm9yIGdpdmVuIGZvcm1hdCwgc3RyZWFtIHR5cGUsIHNhbXBsZSByYXRlLAogICAgIC8vIGJpdCByYXRlLCBkdXJhdGlvbiwgdmlkZW8gYW5kIHN0cmVhbWluZwogICAgIHJldHVybiBBdWRpb1N5c3RlbTo6aXNPZmZsb2FkU3VwcG9ydGVkKGluZm8pOwogfQogCi1BU3RyaW5nIHVyaURlYnVnU3RyaW5nKGNvbnN0IEFTdHJpbmcgJnVyaSwgYm9vbCBpbmNvZ25pdG8pIHsKLSAgICBpZiAoaW5jb2duaXRvKSB7Ci0gICAgICAgIHJldHVybiBBU3RyaW5nKCI8VVJJIHN1cHByZXNzZWQ+Iik7Ci0gICAgfQotCi0gICAgaWYgKHByb3BlcnR5X2dldF9ib29sKCJtZWRpYS5zdGFnZWZyaWdodC5sb2ctdXJpIiwgZmFsc2UpKSB7Ci0gICAgICAgIHJldHVybiB1cmk7Ci0gICAgfQotCi0gICAgLy8gZmluZCBzY2hlbWUKLSAgICBBU3RyaW5nIHNjaGVtZTsKLSAgICBjb25zdCBjaGFyICpjaGFycyA9IHVyaS5jX3N0cigpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdXJpLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgYyA9IGNoYXJzW2ldOwotICAgICAgICBpZiAoIWlzYXNjaWkoYykpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYgKGlzYWxwaGEoYykpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgaWYgKGkgPT0gMCkgewotICAgICAgICAgICAgLy8gZmlyc3QgY2hhcmFjdGVyIG11c3QgYmUgYSBsZXR0ZXIKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9IGVsc2UgaWYgKGlzZGlnaXQoYykgfHwgYyA9PSAnKycgfHwgYyA9PSAnLicgfHwgYyA9PSctJykgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoYyAhPSAnOicpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHNjaGVtZSA9IEFTdHJpbmcodXJpLCAwLCBpKTsKLSAgICAgICAgc2NoZW1lLmFwcGVuZCgiOi8vPHN1cHByZXNzZWQ+Iik7Ci0gICAgICAgIHJldHVybiBzY2hlbWU7Ci0gICAgfQotICAgIHJldHVybiBBU3RyaW5nKCI8bm8tc2NoZW1lIFVSSSBzdXBwcmVzc2VkPiIpOwotfQotCiBITFNUaW1lOjpITFNUaW1lKGNvbnN0IHNwPEFNZXNzYWdlPiYgbWV0YSkgOgogICAgIG1TZXEoLTEpLAogICAgIG1UaW1lVXMoLTFMTCksCkBAIC0xODk4LDM3ICsyMTc2LDQgQEAKICAgICB9CiB9CiAKLUFTdHJpbmcgbmFtZUZvckZkKGludCBmZCkgewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIEFTdHJpbmcgcmVzdWx0OwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL2ZkLyVkIiwgZ2V0cGlkKCksIGZkKTsKLSAgICBzdHJ1Y3Qgc3RhdCBzOwotICAgIGlmIChsc3RhdChidWZmZXIsICZzKSA9PSAwKSB7Ci0gICAgICAgIGlmICgocy5zdF9tb2RlICYgU19JRk1UKSA9PSBTX0lGTE5LKSB7Ci0gICAgICAgICAgICBjaGFyIGxpbmt0b1syNTZdOwotICAgICAgICAgICAgaW50IGxlbiA9IHJlYWRsaW5rKGJ1ZmZlciwgbGlua3RvLCBzaXplb2YobGlua3RvKSk7Ci0gICAgICAgICAgICBpZihsZW4gPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYobGVuID4gMjU1KSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTJdID0gJy4nOwotICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjUzXSA9ICcuJzsKLSAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1NF0gPSAnLic7Ci0gICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTVdID0gMDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBsaW5rdG9bbGVuXSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobGlua3RvKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoInVuZXhwZWN0ZWQgdHlwZSBmb3IgIik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQuYXBwZW5kKCJjb3VsZG4ndCBvcGVuICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKaW5kZXggOTAyMGZjMS4uNGU1YjVlMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5jcHAKQEAgLTEsNSArMSw1IEBACiAvKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CiAgKgogICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CiAgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCkBAIC0xOSw4ICsxOSw3IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19WSURFTwogI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+Ci0KLSNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAKICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8Z3VpL0lTdXJmYWNlQ29tcG9zZXIuaD4KQEAgLTMyLDMyMSArMzEsMTQgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrTmFub3NJbjFzID0gMTAwMDAwMDAwMDsKLQotdGVtcGxhdGU8Y2xhc3MgVD4KLXN0YXRpYyBpbnQgY29tcGFyZShjb25zdCBUICpsaHMsIGNvbnN0IFQgKnJocykgewotICAgIGlmICgqbGhzIDwgKnJocykgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfSBlbHNlIGlmICgqbGhzID4gKnJocykgewotICAgICAgICByZXR1cm4gMTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gMDsKLSAgICB9Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUExMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotc3RhdGljIGNvbnN0IHNpemVfdCBrTWluU2FtcGxlc1RvU3RhcnRQcmltZSA9IDM7Ci1zdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyOjprSGlzdG9yeVNpemU7Ci1zdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCA9IDM7Ci1zdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhTYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCA9IFZpZGVvRnJhbWVTY2hlZHVsZXI6OmtIaXN0b3J5U2l6ZTsKLQotc3RhdGljIGNvbnN0IHNpemVfdCBrUHJlY2lzaW9uID0gMTI7Ci1zdGF0aWMgY29uc3QgaW50NjRfdCBrRXJyb3JUaHJlc2hvbGQgPSAoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSAvIDEwOwotc3RhdGljIGNvbnN0IGludDY0X3Qga011bHRpcGxlc1RocmVzaG9sZERpdiA9IDQ7ICAgICAgICAgICAgLy8gMjUlCi1zdGF0aWMgY29uc3QgaW50NjRfdCBrUmVGaXRUaHJlc2hvbGREaXYgPSAxMDA7ICAgICAgICAgICAgICAvLyAxJQotc3RhdGljIGNvbnN0IG5zZWNzX3Qga01heEFsbG93ZWRGcmFtZVNraXAgPSBrTmFub3NJbjFzOyAgICAgLy8gMSBzZWMKLXN0YXRpYyBjb25zdCBuc2Vjc190IGtNaW5QZXJpb2QgPSBrTmFub3NJbjFzIC8gMTIwOyAgICAgICAgIC8vIDEyMEh6Ci1zdGF0aWMgY29uc3QgbnNlY3NfdCBrUmVmaXRSZWZyZXNoUGVyaW9kID0gMTAgKiBrTmFub3NJbjFzOyAvLyAxMCBzZWMKLQotVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjpQTEwoKQotICAgIDogbVBlcmlvZCgtMSksCi0gICAgICBtUGhhc2UoMCksCi0gICAgICBtUHJpbWVkKGZhbHNlKSwKLSAgICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcoMCksCi0gICAgICBtTGFzdFRpbWUoLTEpLAotICAgICAgbU51bVNhbXBsZXMoMCkgewotfQotCi12b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6cmVzZXQoZmxvYXQgZnBzKSB7Ci0gICAgLy90ZXN0KCk7Ci0KLSAgICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID0gMDsKLSAgICBtTGFzdFRpbWUgPSAtMTsKLQotICAgIC8vIHNldCB1cCBvciByZXNldCB2aWRlbyBQTEwKLSAgICBpZiAoZnBzIDw9IDAuZikgewotICAgICAgICBtUGVyaW9kID0gLTE7Ci0gICAgICAgIG1QcmltZWQgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICBBTE9HVigicmVzZXQgYXQgJS4xZiBmcHMiLCBmcHMpOwotICAgICAgICBtUGVyaW9kID0gKG5zZWNzX3QpKDFlOSAvIGZwcyArIDAuNSk7Ci0gICAgICAgIG1QcmltZWQgPSB0cnVlOwotICAgIH0KLQotICAgIHJlc3RhcnQoKTsKLX0KLQotLy8gcmVzZXQgUExMIGJ1dCBrZWVwIHByZXZpb3VzIHBlcmlvZCBlc3RpbWF0ZQotdm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpQTEw6OnJlc3RhcnQoKSB7Ci0gICAgbU51bVNhbXBsZXMgPSAwOwotICAgIG1QaGFzZSA9IC0xOwotfQotCi0jaWYgMAotCi12b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6dGVzdCgpIHsKLSAgICBuc2Vjc190IHBlcmlvZCA9IGtOYW5vc0luMXMgLyA2MDsKLSAgICBtVGltZXNbMF0gPSAwOwotICAgIG1UaW1lc1sxXSA9IHBlcmlvZDsKLSAgICBtVGltZXNbMl0gPSBwZXJpb2QgKiAzOwotICAgIG1UaW1lc1szXSA9IHBlcmlvZCAqIDQ7Ci0gICAgbVRpbWVzWzRdID0gcGVyaW9kICogNzsKLSAgICBtVGltZXNbNV0gPSBwZXJpb2QgKiA4OwotICAgIG1UaW1lc1s2XSA9IHBlcmlvZCAqIDEwOwotICAgIG1UaW1lc1s3XSA9IHBlcmlvZCAqIDEyOwotICAgIG1OdW1TYW1wbGVzID0gODsKLSAgICBpbnQ2NF90IGEsIGIsIGVycjsKLSAgICBmaXQoMCwgcGVyaW9kICogMTIgLyA3LCA4LCAmYSwgJmIsICZlcnIpOwotICAgIC8vIGEgPSAwLjgoNSkrCi0gICAgLy8gYiA9IC0wLjE0MDk3KDIpKwotICAgIC8vIGVyciA9IDAuMjc1MDU3OCg3MDMpKwotICAgIEFMT0dEKCJhPSVsbGQgKCUuNmYpLCBiPSVsbGQgKCUuNmYpLCBlcnI9JWxsZCAoJS42ZikiLAotICAgICAgICAgICAgKGxvbmcgbG9uZylhLCAoYSAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCi0gICAgICAgICAgICAobG9uZyBsb25nKWIsIChiIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKLSAgICAgICAgICAgIChsb25nIGxvbmcpZXJyLCAoZXJyIC8gKGZsb2F0KSgxIDw8IChrUHJlY2lzaW9uICogMikpKSk7Ci19Ci0KLSNlbmRpZgotCi1ib29sIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6Zml0KAotICAgICAgICBuc2Vjc190IHBoYXNlLCBuc2Vjc190IHBlcmlvZCwgc2l6ZV90IG51bVNhbXBsZXNUb1VzZSwKLSAgICAgICAgaW50NjRfdCAqYSwgaW50NjRfdCAqYiwgaW50NjRfdCAqZXJyKSB7Ci0gICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+IG1OdW1TYW1wbGVzKSB7Ci0gICAgICAgIG51bVNhbXBsZXNUb1VzZSA9IG1OdW1TYW1wbGVzOwotICAgIH0KLQotICAgIGlmICgocGVyaW9kID4+IGtQcmVjaXNpb24pID09IDAgKSB7Ci0gICAgICAgIEFMT0dXKCJQZXJpb2QgaXMgMCwgb3IgYWZ0ZXIgaW5jbHVkaW5nIHByZWNpc2lvbiBpcyAwIC0gd291bGQgY2F1c2UgZGl2MCwgcmV0dXJuaW5nIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IHN1bVggPSAwOwotICAgIGludDY0X3Qgc3VtWFggPSAwOwotICAgIGludDY0X3Qgc3VtWFkgPSAwOwotICAgIGludDY0X3Qgc3VtWVkgPSAwOwotICAgIGludDY0X3Qgc3VtWSA9IDA7Ci0KLSAgICBpbnQ2NF90IHggPSAwOyAvLyB4IHVzdWFsbHkgaXMgaW4gWzAuLm51bVNhbXBsZXNUb1VzZSkKLSAgICBuc2Vjc190IGxhc3RUaW1lOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2FtcGxlc1RvVXNlOyBpKyspIHsKLSAgICAgICAgc2l6ZV90IGl4ID0gKG1OdW1TYW1wbGVzIC0gbnVtU2FtcGxlc1RvVXNlICsgaSkgJSBrSGlzdG9yeVNpemU7Ci0gICAgICAgIG5zZWNzX3QgdGltZSA9IG1UaW1lc1tpeF07Ci0gICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgeCArPSBkaXZSb3VuZCh0aW1lIC0gbGFzdFRpbWUsIHBlcmlvZCk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8geSBpcyB1c3VhbGx5IGluIFstbnVtU2FtcGxlc1RvVXNlLi5udW1TYW1wbGVzVG9Vc2Ura1JlZml0UmVmcmVzaFBlcmlvZC9rTWluUGVyaW9kKSA8PCBrUHJlY2lzaW9uCi0gICAgICAgIC8vICAgaWRlYWxseSBpbiBbMC4ubnVtU2FtcGxlc1RvVXNlKSwgYnV0IHNoaWZ0ZWQgYnkgLW51bVNhbXBsZXNUb1VzZSBkdXJpbmcKLSAgICAgICAgLy8gICBwcmltaW5nLCBhbmQgcG9zc2libHkgc2hpZnRlZCBieSB1cCB0byBrUmVmaXRSZWZyZXNoUGVyaW9kL2tNaW5QZXJpb2QKLSAgICAgICAgLy8gICB3aGlsZSB3ZSBhcmUgbm90IHJlZml0dGluZy4KLSAgICAgICAgaW50NjRfdCB5ID0gZGl2Um91bmQodGltZSAtIHBoYXNlLCBwZXJpb2QgPj4ga1ByZWNpc2lvbik7Ci0gICAgICAgIHN1bVggKz0geDsKLSAgICAgICAgc3VtWSArPSB5OwotICAgICAgICBzdW1YWCArPSB4ICogeDsKLSAgICAgICAgc3VtWFkgKz0geCAqIHk7Ci0gICAgICAgIHN1bVlZICs9IHkgKiB5OwotICAgICAgICBsYXN0VGltZSA9IHRpbWU7Ci0gICAgfQotCi0gICAgaW50NjRfdCBkaXYgICA9IChpbnQ2NF90KW51bVNhbXBsZXNUb1VzZSAqIHN1bVhYIC0gc3VtWCAqIHN1bVg7Ci0gICAgaWYgKGRpdiA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpbnQ2NF90IGFfbm9tID0gKGludDY0X3QpbnVtU2FtcGxlc1RvVXNlICogc3VtWFkgLSBzdW1YICogc3VtWTsKLSAgICBpbnQ2NF90IGJfbm9tID0gc3VtWFggKiBzdW1ZICAgICAgICAgICAgLSBzdW1YICogc3VtWFk7Ci0gICAgKmEgPSBkaXZSb3VuZChhX25vbSwgZGl2KTsKLSAgICAqYiA9IGRpdlJvdW5kKGJfbm9tLCBkaXYpOwotICAgIC8vIGRvbid0IHVzZSBhIGFuZCBiIGRpcmVjdGx5IGFzIHRoZSByb3VuZGluZyBlcnJvciBpcyBzaWduaWZpY2FudAotICAgICplcnIgPSBzdW1ZWSAtIGRpdlJvdW5kKGFfbm9tICogc3VtWFkgKyBiX25vbSAqIHN1bVksIGRpdik7Ci0gICAgQUxPR1YoImZpdHRpbmdbJXp1XSBhPSVsbGQgKCUuNmYpLCBiPSVsbGQgKCUuNmYpLCBlcnI9JWxsZCAoJS42ZikiLAotICAgICAgICAgICAgbnVtU2FtcGxlc1RvVXNlLAotICAgICAgICAgICAgKGxvbmcgbG9uZykqYSwgICAoKmEgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAotICAgICAgICAgICAgKGxvbmcgbG9uZykqYiwgICAoKmIgLyAoZmxvYXQpKDEgPDwga1ByZWNpc2lvbikpLAotICAgICAgICAgICAgKGxvbmcgbG9uZykqZXJyLCAoKmVyciAvIChmbG9hdCkoMSA8PCAoa1ByZWNpc2lvbiAqIDIpKSkpOwotICAgIHJldHVybiB0cnVlOwotfQotCi12b2lkIFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6cHJpbWUoc2l6ZV90IG51bVNhbXBsZXNUb1VzZSkgewotICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPiBtTnVtU2FtcGxlcykgewotICAgICAgICBudW1TYW1wbGVzVG9Vc2UgPSBtTnVtU2FtcGxlczsKLSAgICB9Ci0gICAgQ0hFQ0sobnVtU2FtcGxlc1RvVXNlID49IDMpOyAgLy8gbXVzdCBoYXZlIGF0IGxlYXN0IDMgc2FtcGxlcwotCi0gICAgLy8gZXN0aW1hdGUgdmlkZW8gZnJhbWVyYXRlIGZyb20gZGVsdGFzIGJldHdlZW4gdGltZXN0YW1wcywgYW5kCi0gICAgLy8gMm5kIG9yZGVyIGRlbHRhcwotICAgIFZlY3Rvcjxuc2Vjc190PiBkZWx0YXM7Ci0gICAgbnNlY3NfdCBsYXN0VGltZSwgZmlyc3RUaW1lOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU2FtcGxlc1RvVXNlOyArK2kpIHsKLSAgICAgICAgc2l6ZV90IGluZGV4ID0gKG1OdW1TYW1wbGVzIC0gbnVtU2FtcGxlc1RvVXNlICsgaSkgJSBrSGlzdG9yeVNpemU7Ci0gICAgICAgIG5zZWNzX3QgdGltZSA9IG1UaW1lc1tpbmRleF07Ci0gICAgICAgIGlmIChpID4gMCkgewotICAgICAgICAgICAgaWYgKHRpbWUgLSBsYXN0VGltZSA+IGtNaW5QZXJpb2QpIHsKLSAgICAgICAgICAgICAgICAvL0FMT0dWKCJkZWx0YTogJWxsZCIsIChsb25nIGxvbmcpKHRpbWUgLSBsYXN0VGltZSkpOwotICAgICAgICAgICAgICAgIGRlbHRhcy5wdXNoKHRpbWUgLSBsYXN0VGltZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaXJzdFRpbWUgPSB0aW1lOwotICAgICAgICB9Ci0gICAgICAgIGxhc3RUaW1lID0gdGltZTsKLSAgICB9Ci0gICAgZGVsdGFzLnNvcnQoY29tcGFyZTxuc2Vjc190Pik7Ci0gICAgc2l6ZV90IG51bURlbHRhcyA9IGRlbHRhcy5zaXplKCk7Ci0gICAgaWYgKG51bURlbHRhcyA+IDEpIHsKLSAgICAgICAgbnNlY3NfdCBkZWx0YU1pbkxpbWl0ID0gbWF4KGRlbHRhc1swXSAvIGtNdWx0aXBsZXNUaHJlc2hvbGREaXYsIGtNaW5QZXJpb2QpOwotICAgICAgICBuc2Vjc190IGRlbHRhTWF4TGltaXQgPSBkZWx0YXNbbnVtRGVsdGFzIC8gMl0gKiBrTXVsdGlwbGVzVGhyZXNob2xkRGl2OwotICAgICAgICBmb3IgKHNpemVfdCBpID0gbnVtRGVsdGFzIC8gMiArIDE7IGkgPCBudW1EZWx0YXM7ICsraSkgewotICAgICAgICAgICAgaWYgKGRlbHRhc1tpXSA+IGRlbHRhTWF4TGltaXQpIHsKLSAgICAgICAgICAgICAgICBkZWx0YXMucmVzaXplKGkpOwotICAgICAgICAgICAgICAgIG51bURlbHRhcyA9IGk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBudW1EZWx0YXM7ICsraSkgewotICAgICAgICAgICAgbnNlY3NfdCBkZWx0YTJuZCA9IGRlbHRhc1tpXSAtIGRlbHRhc1tpIC0gMV07Ci0gICAgICAgICAgICBpZiAoZGVsdGEybmQgPj0gZGVsdGFNaW5MaW1pdCkgewotICAgICAgICAgICAgICAgIC8vQUxPR1YoImRlbHRhMjogJWxsZCIsIChsb25nIGxvbmcpKGRlbHRhMm5kKSk7Ci0gICAgICAgICAgICAgICAgZGVsdGFzLnB1c2goZGVsdGEybmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gdXNlIHRoZSBvbmUgdGhhdCB5aWVsZHMgdGhlIGJlc3QgbWF0Y2gKLSAgICBpbnQ2NF90IGJlc3RTY29yZTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRlbHRhcy5zaXplKCk7ICsraSkgewotICAgICAgICBuc2Vjc190IGRlbHRhID0gZGVsdGFzW2ldOwotICAgICAgICBpbnQ2NF90IHNjb3JlID0gMDsKLSNpZiAxCi0gICAgICAgIC8vIHNpbXBsZXN0IHNjb3JlOiBudW1iZXIgb2YgZGVsdGFzIHRoYXQgYXJlIG5lYXIgbXVsdGlwbGVzCi0gICAgICAgIHNpemVfdCBtYXRjaGVzID0gMDsKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBkZWx0YXMuc2l6ZSgpOyArK2opIHsKLSAgICAgICAgICAgIG5zZWNzX3QgZXJyID0gcGVyaW9kaWNFcnJvcihkZWx0YXNbal0sIGRlbHRhKTsKLSAgICAgICAgICAgIGlmIChlcnIgPCBkZWx0YSAvIGtNdWx0aXBsZXNUaHJlc2hvbGREaXYpIHsKLSAgICAgICAgICAgICAgICArK21hdGNoZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc2NvcmUgPSBtYXRjaGVzOwotI2lmIDAKLSAgICAgICAgLy8gY291bGQgYmUgd2VpZ2hlZCBieSB0aGUgKDEgLSBub3JtYWxpemVkIGVycm9yKQotICAgICAgICBpZiAobnVtU2FtcGxlc1RvVXNlID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgewotICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7Ci0gICAgICAgICAgICBmaXQoZmlyc3RUaW1lLCBkZWx0YSwgbnVtU2FtcGxlc1RvVXNlLCAmYSwgJmIsICZlcnIpOwotICAgICAgICAgICAgZXJyID0gKDEgPDwgKDIgKiBrUHJlY2lzaW9uKSkgLSBlcnI7Ci0gICAgICAgICAgICBzY29yZSAqPSBtYXgoMCwgZXJyKTsKLSAgICAgICAgfQotI2VuZGlmCi0jZWxzZQotICAgICAgICAvLyBvciB1c2UgdGhlIGVycm9yIGFzIGEgbmVnYXRpdmUgc2NvcmUKLSAgICAgICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+PSBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QpIHsKLSAgICAgICAgICAgIGludDY0X3QgYSwgYiwgZXJyOwotICAgICAgICAgICAgZml0KGZpcnN0VGltZSwgZGVsdGEsIG51bVNhbXBsZXNUb1VzZSwgJmEsICZiLCAmZXJyKTsKLSAgICAgICAgICAgIHNjb3JlID0gLWRlbHRhICogZXJyOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgaWYgKGkgPT0gMCB8fCBzY29yZSA+IGJlc3RTY29yZSkgewotICAgICAgICAgICAgYmVzdFNjb3JlID0gc2NvcmU7Ci0gICAgICAgICAgICBtUGVyaW9kID0gZGVsdGE7Ci0gICAgICAgICAgICBtUGhhc2UgPSBmaXJzdFRpbWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgQUxPR1YoInByaW1pbmdbJXp1XSBwaGFzZTolbGxkIHBlcmlvZDolbGxkIiwKLSAgICAgICAgICAgIG51bVNhbXBsZXNUb1VzZSwgKGxvbmcgbG9uZyltUGhhc2UsIChsb25nIGxvbmcpbVBlcmlvZCk7Ci19Ci0KLW5zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6UExMOjphZGRTYW1wbGUobnNlY3NfdCB0aW1lKSB7Ci0gICAgaWYgKG1MYXN0VGltZSA+PSAwCi0gICAgICAgICAgICAvLyBpZiB0aW1lIGdvZXMgYmFja3dhcmQsIG9yIHdlIHNraXBwZWQgcmVuZGVyaW5nCi0gICAgICAgICAgICAmJiAodGltZSA+IG1MYXN0VGltZSArIGtNYXhBbGxvd2VkRnJhbWVTa2lwIHx8IHRpbWUgPCBtTGFzdFRpbWUpKSB7Ci0gICAgICAgIHJlc3RhcnQoKTsKLSAgICB9Ci0KLSAgICBtTGFzdFRpbWUgPSB0aW1lOwotICAgIG1UaW1lc1ttTnVtU2FtcGxlcyAlIGtIaXN0b3J5U2l6ZV0gPSB0aW1lOwotICAgICsrbU51bVNhbXBsZXM7Ci0KLSAgICBib29sIGRvRml0ID0gdGltZSA+IG1SZWZpdEF0OwotICAgIGlmICgobVBlcmlvZCA8PSAwIHx8ICFtUHJpbWVkKSAmJiBtTnVtU2FtcGxlcyA+PSBrTWluU2FtcGxlc1RvU3RhcnRQcmltZSkgewotICAgICAgICBwcmltZShrTWluU2FtcGxlc1RvU3RvcFByaW1lKTsKLSAgICAgICAgKyttU2FtcGxlc1VzZWRGb3JQcmltaW5nOwotICAgICAgICBkb0ZpdCA9IHRydWU7Ci0gICAgfQotICAgIGlmIChtUGVyaW9kID4gMCAmJiBtTnVtU2FtcGxlcyA+PSBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QpIHsKLSAgICAgICAgaWYgKG1QaGFzZSA8IDApIHsKLSAgICAgICAgICAgIC8vIGluaXRpYWxpemUgcGhhc2UgdG8gdGhlIGN1cnJlbnQgcmVuZGVyIHRpbWUKLSAgICAgICAgICAgIG1QaGFzZSA9IHRpbWU7Ci0gICAgICAgICAgICBkb0ZpdCA9IHRydWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoIWRvRml0KSB7Ci0gICAgICAgICAgICBpbnQ2NF90IGVyciA9IHBlcmlvZGljRXJyb3IodGltZSAtIG1QaGFzZSwgbVBlcmlvZCk7Ci0gICAgICAgICAgICBkb0ZpdCA9IGVyciA+IG1QZXJpb2QgLyBrUmVGaXRUaHJlc2hvbGREaXY7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZG9GaXQpIHsKLSAgICAgICAgICAgIGludDY0X3QgYSwgYiwgZXJyOwotICAgICAgICAgICAgaWYgKCFmaXQobVBoYXNlLCBtUGVyaW9kLCBrTWF4U2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QsICZhLCAmYiwgJmVycikpIHsKLSAgICAgICAgICAgICAgICAvLyBzYW1wbGVzIGFyZSBub3Qgc3VpdGFibGUgZm9yIGZpdHRpbmcuICB0aGlzIG1lYW5zIHRoZXkgYXJlCi0gICAgICAgICAgICAgICAgLy8gYWxzbyBub3Qgc3VpdGFibGUgZm9yIHByaW1pbmcuCi0gICAgICAgICAgICAgICAgQUxPR1YoImNvdWxkIG5vdCBmaXQgLSBrZWVwaW5nIG9sZCBwZXJpb2Q6JWxsZCIsIChsb25nIGxvbmcpbVBlcmlvZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1QZXJpb2Q7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1SZWZpdEF0ID0gdGltZSArIGtSZWZpdFJlZnJlc2hQZXJpb2Q7Ci0KLSAgICAgICAgICAgIG1QaGFzZSArPSAobVBlcmlvZCAqIGIpID4+IGtQcmVjaXNpb247Ci0gICAgICAgICAgICBtUGVyaW9kID0gKG1QZXJpb2QgKiBhKSA+PiBrUHJlY2lzaW9uOwotICAgICAgICAgICAgQUxPR1YoIm5ldyBwaGFzZTolbGxkIHBlcmlvZDolbGxkIiwgKGxvbmcgbG9uZyltUGhhc2UsIChsb25nIGxvbmcpbVBlcmlvZCk7Ci0KLSAgICAgICAgICAgIGlmIChlcnIgPCBrRXJyb3JUaHJlc2hvbGQpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1QcmltZWQgJiYgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA+PSBrTWluU2FtcGxlc1RvU3RvcFByaW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmltZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVByaW1lZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBtUGVyaW9kOwotfQotCi1uc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXI6OlBMTDo6Z2V0UGVyaW9kKCkgY29uc3QgewotICAgIHJldHVybiBtUHJpbWVkID8gbVBlcmlvZCA6IDA7Ci19Ci0KLS8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCi0vKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnJhbWUgU2NoZWR1bGVyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwotLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KLQotc3RhdGljIGNvbnN0IG5zZWNzX3Qga0RlZmF1bHRWc3luY1BlcmlvZCA9IGtOYW5vc0luMXMgLyA2MDsgIC8vIDYwSHoKLXN0YXRpYyBjb25zdCBuc2Vjc190IGtWc3luY1JlZnJlc2hQZXJpb2QgPSBrTmFub3NJbjFzOyAgICAgICAvLyAxIHNlYwotCi1WaWRlb0ZyYW1lU2NoZWR1bGVyOjpWaWRlb0ZyYW1lU2NoZWR1bGVyKCkKLSAgICA6IG1Wc3luY1RpbWUoMCksCi0gICAgICBtVnN5bmNQZXJpb2QoMCksCi0gICAgICBtVnN5bmNSZWZyZXNoQXQoMCksCi0gICAgICBtTGFzdFZzeW5jVGltZSgtMSksCi0gICAgICBtVGltZUNvcnJlY3Rpb24oMCkgeworVmlkZW9GcmFtZVNjaGVkdWxlcjo6VmlkZW9GcmFtZVNjaGVkdWxlcigpIDogVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UoKSB7CiB9CiAKIHZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6dXBkYXRlVnN5bmMoKSB7CiAgICAgbVZzeW5jUmVmcmVzaEF0ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpICsga1ZzeW5jUmVmcmVzaFBlcmlvZDsKLSAgICBtVnN5bmNQZXJpb2QgPSAwOwogICAgIG1Wc3luY1RpbWUgPSAwOworICAgIG1Wc3luY1BlcmlvZCA9IDA7CiAKLSAgICAvLyBUT0RPOiBzY2hlZHVsZSBmcmFtZXMgZm9yIHRoZSBkZXN0aW5hdGlvbiBzdXJmYWNlCi0gICAgLy8gRm9yIG5vdywgc3VyZmFjZSBmbGluZ2VyIG9ubHkgc2NoZWR1bGVzIGZyYW1lcyBvbiB0aGUgcHJpbWFyeSBkaXNwbGF5CiAgICAgaWYgKG1Db21wb3NlciA9PSBOVUxMKSB7CiAgICAgICAgIFN0cmluZzE2IG5hbWUoIlN1cmZhY2VGbGluZ2VyIik7CiAgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKQEAgLTM2OCwxMzYgKzYwLDYgQEAKICAgICB9CiB9CiAKLXZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6aW5pdChmbG9hdCB2aWRlb0ZwcykgewotICAgIHVwZGF0ZVZzeW5jKCk7Ci0KLSAgICBtTGFzdFZzeW5jVGltZSA9IC0xOwotICAgIG1UaW1lQ29ycmVjdGlvbiA9IDA7Ci0KLSAgICBtUGxsLnJlc2V0KHZpZGVvRnBzKTsKLX0KLQotdm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpyZXN0YXJ0KCkgewotICAgIG1MYXN0VnN5bmNUaW1lID0gLTE7Ci0gICAgbVRpbWVDb3JyZWN0aW9uID0gMDsKLQotICAgIG1QbGwucmVzdGFydCgpOwotfQotCi1uc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXI6OmdldFZzeW5jUGVyaW9kKCkgewotICAgIGlmIChtVnN5bmNQZXJpb2QgPiAwKSB7Ci0gICAgICAgIHJldHVybiBtVnN5bmNQZXJpb2Q7Ci0gICAgfQotICAgIHJldHVybiBrRGVmYXVsdFZzeW5jUGVyaW9kOwotfQotCi1mbG9hdCBWaWRlb0ZyYW1lU2NoZWR1bGVyOjpnZXRGcmFtZVJhdGUoKSB7Ci0gICAgbnNlY3NfdCB2aWRlb1BlcmlvZCA9IG1QbGwuZ2V0UGVyaW9kKCk7Ci0gICAgaWYgKHZpZGVvUGVyaW9kID4gMCkgewotICAgICAgICByZXR1cm4gMWU5IC8gdmlkZW9QZXJpb2Q7Ci0gICAgfQotICAgIHJldHVybiAwLmY7Ci19Ci0KLW5zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlcjo6c2NoZWR1bGUobnNlY3NfdCByZW5kZXJUaW1lKSB7Ci0gICAgbnNlY3NfdCBvcmlnUmVuZGVyVGltZSA9IHJlbmRlclRpbWU7Ci0KLSAgICBuc2Vjc190IG5vdyA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBpZiAobm93ID49IG1Wc3luY1JlZnJlc2hBdCkgewotICAgICAgICB1cGRhdGVWc3luYygpOwotICAgIH0KLQotICAgIC8vIHdpdGhvdXQgVlNZTkMgaW5mbywgdGhlcmUgaXMgbm90aGluZyB0byBkbwotICAgIGlmIChtVnN5bmNQZXJpb2QgPT0gMCkgewotICAgICAgICBBTE9HVigibm8gdnN5bmM6IHJlbmRlcj0lbGxkIiwgKGxvbmcgbG9uZylyZW5kZXJUaW1lKTsKLSAgICAgICAgcmV0dXJuIHJlbmRlclRpbWU7Ci0gICAgfQotCi0gICAgLy8gZW5zdXJlIHZzeW5jIHRpbWUgaXMgd2VsbCBiZWZvcmUgKGNvcnJlY3RlZCkgcmVuZGVyIHRpbWUKLSAgICBpZiAobVZzeW5jVGltZSA+IHJlbmRlclRpbWUgLSA0ICogbVZzeW5jUGVyaW9kKSB7Ci0gICAgICAgIG1Wc3luY1RpbWUgLT0KLSAgICAgICAgICAgICgobVZzeW5jVGltZSAtIHJlbmRlclRpbWUpIC8gbVZzeW5jUGVyaW9kICsgNSkgKiBtVnN5bmNQZXJpb2Q7Ci0gICAgfQotCi0gICAgLy8gVmlkZW8gcHJlc2VudGF0aW9uIHRha2VzIHBsYWNlIGF0IHRoZSBWU1lOQyBfYWZ0ZXJfIHJlbmRlclRpbWUuICBBZGp1c3QgcmVuZGVyVGltZQotICAgIC8vIHNvIHRoaXMgZWZmZWN0aXZlbHkgYmVjb21lcyBhIHJvdW5kaW5nIG9wZXJhdGlvbiAodG8gdGhlIF9jbG9zZXN0XyBWU1lOQy4pCi0gICAgcmVuZGVyVGltZSAtPSBtVnN5bmNQZXJpb2QgLyAyOwotCi0gICAgY29uc3QgbnNlY3NfdCB2aWRlb1BlcmlvZCA9IG1QbGwuYWRkU2FtcGxlKG9yaWdSZW5kZXJUaW1lKTsKLSAgICBpZiAodmlkZW9QZXJpb2QgPiAwKSB7Ci0gICAgICAgIC8vIFNtb290aCBvdXQgcmVuZGVyaW5nCi0gICAgICAgIHNpemVfdCBOID0gMTI7Ci0gICAgICAgIG5zZWNzX3QgZml2ZVNpeHRoRGV2ID0KLSAgICAgICAgICAgIGFicygoKHZpZGVvUGVyaW9kICogNSArIG1Wc3luY1BlcmlvZCkgJSAobVZzeW5jUGVyaW9kICogNikpIC0gbVZzeW5jUGVyaW9kKQotICAgICAgICAgICAgICAgICAgICAvIChtVnN5bmNQZXJpb2QgLyAxMDApOwotICAgICAgICAvLyB1c2UgMjAgc2FtcGxlcyBpZiB3ZSBhcmUgZG9pbmcgNTo2IHJhdGlvICstIDElIChlLmcuIHBsYXlpbmcgNTBIeiBvbiA2MEh6KQotICAgICAgICBpZiAoZml2ZVNpeHRoRGV2IDwgMTIpIHsgIC8qIDEyJSAvIDYgPSAyJSAqLwotICAgICAgICAgICAgTiA9IDIwOwotICAgICAgICB9Ci0KLSAgICAgICAgbnNlY3NfdCBvZmZzZXQgPSAwOwotICAgICAgICBuc2Vjc190IGVkZ2VSZW1haW5kZXIgPSAwOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8PSBOOyBpKyspIHsKLSAgICAgICAgICAgIG9mZnNldCArPQotICAgICAgICAgICAgICAgIChyZW5kZXJUaW1lICsgbVRpbWVDb3JyZWN0aW9uICsgdmlkZW9QZXJpb2QgKiBpIC0gbVZzeW5jVGltZSkgJSBtVnN5bmNQZXJpb2Q7Ci0gICAgICAgICAgICBlZGdlUmVtYWluZGVyICs9ICh2aWRlb1BlcmlvZCAqIGkpICUgbVZzeW5jUGVyaW9kOwotICAgICAgICB9Ci0gICAgICAgIG1UaW1lQ29ycmVjdGlvbiArPSBtVnN5bmNQZXJpb2QgLyAyIC0gb2Zmc2V0IC8gKG5zZWNzX3QpTjsKLSAgICAgICAgcmVuZGVyVGltZSArPSBtVGltZUNvcnJlY3Rpb247Ci0gICAgICAgIG5zZWNzX3QgY29ycmVjdGlvbkxpbWl0ID0gbVZzeW5jUGVyaW9kICogMyAvIDU7Ci0gICAgICAgIGVkZ2VSZW1haW5kZXIgPSBhYnMoZWRnZVJlbWFpbmRlciAvIChuc2Vjc190KU4gLSBtVnN5bmNQZXJpb2QgLyAyKTsKLSAgICAgICAgaWYgKGVkZ2VSZW1haW5kZXIgPD0gbVZzeW5jUGVyaW9kIC8gMykgewotICAgICAgICAgICAgY29ycmVjdGlvbkxpbWl0IC89IDI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBlc3RpbWF0ZSBob3cgbWFueSBWU1lOQ3MgYSBmcmFtZSB3aWxsIHNwZW5kIG9uIHRoZSBkaXNwbGF5Ci0gICAgICAgIG5zZWNzX3QgbmV4dFZzeW5jVGltZSA9Ci0gICAgICAgICAgICByZW5kZXJUaW1lICsgbVZzeW5jUGVyaW9kIC0gKChyZW5kZXJUaW1lIC0gbVZzeW5jVGltZSkgJSBtVnN5bmNQZXJpb2QpOwotICAgICAgICBpZiAobUxhc3RWc3luY1RpbWUgPj0gMCkgewotICAgICAgICAgICAgc2l6ZV90IG1pblZzeW5jc1BlckZyYW1lID0gdmlkZW9QZXJpb2QgLyBtVnN5bmNQZXJpb2Q7Ci0gICAgICAgICAgICBzaXplX3QgdnN5bmNzRm9yTGFzdEZyYW1lID0gZGl2Um91bmQobmV4dFZzeW5jVGltZSAtIG1MYXN0VnN5bmNUaW1lLCBtVnN5bmNQZXJpb2QpOwotICAgICAgICAgICAgYm9vbCB2c3luY3NQZXJGcmFtZUFyZU5lYXJseUNvbnN0YW50ID0KLSAgICAgICAgICAgICAgICBwZXJpb2RpY0Vycm9yKHZpZGVvUGVyaW9kLCBtVnN5bmNQZXJpb2QpIC8gKG1Wc3luY1BlcmlvZCAvIDIwKSA9PSAwOwotCi0gICAgICAgICAgICBpZiAobVRpbWVDb3JyZWN0aW9uID4gY29ycmVjdGlvbkxpbWl0ICYmCi0gICAgICAgICAgICAgICAgICAgICh2c3luY3NQZXJGcmFtZUFyZU5lYXJseUNvbnN0YW50IHx8IHZzeW5jc0Zvckxhc3RGcmFtZSA+IG1pblZzeW5jc1BlckZyYW1lKSkgewotICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBhIFZTWU5DCi0gICAgICAgICAgICAgICAgbVRpbWVDb3JyZWN0aW9uIC09IG1Wc3luY1BlcmlvZCAvIDI7Ci0gICAgICAgICAgICAgICAgcmVuZGVyVGltZSAtPSBtVnN5bmNQZXJpb2QgLyAyOwotICAgICAgICAgICAgICAgIG5leHRWc3luY1RpbWUgLT0gbVZzeW5jUGVyaW9kOwotICAgICAgICAgICAgICAgIGlmICh2c3luY3NGb3JMYXN0RnJhbWUgPiAwKQotICAgICAgICAgICAgICAgICAgICAtLXZzeW5jc0Zvckxhc3RGcmFtZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVRpbWVDb3JyZWN0aW9uIDwgLWNvcnJlY3Rpb25MaW1pdCAmJgotICAgICAgICAgICAgICAgICAgICAodnN5bmNzUGVyRnJhbWVBcmVOZWFybHlDb25zdGFudCB8fCB2c3luY3NGb3JMYXN0RnJhbWUgPT0gbWluVnN5bmNzUGVyRnJhbWUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gYWRkIGEgVlNZTkMKLSAgICAgICAgICAgICAgICBtVGltZUNvcnJlY3Rpb24gKz0gbVZzeW5jUGVyaW9kIC8gMjsKLSAgICAgICAgICAgICAgICByZW5kZXJUaW1lICs9IG1Wc3luY1BlcmlvZCAvIDI7Ci0gICAgICAgICAgICAgICAgbmV4dFZzeW5jVGltZSArPSBtVnN5bmNQZXJpb2Q7Ci0gICAgICAgICAgICAgICAgaWYgKHZzeW5jc0Zvckxhc3RGcmFtZSA8IFVMT05HX01BWCkKLSAgICAgICAgICAgICAgICAgICAgKyt2c3luY3NGb3JMYXN0RnJhbWU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG1UaW1lQ29ycmVjdGlvbiA8IC1jb3JyZWN0aW9uTGltaXQgKiAyCi0gICAgICAgICAgICAgICAgICAgIHx8IG1UaW1lQ29ycmVjdGlvbiA+IGNvcnJlY3Rpb25MaW1pdCAqIDIpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY29ycmVjdGlvbiBiZXlvbmQgbGltaXQ6ICVsbGQgdnMgJWxsZCAodnN5bmNzIGZvciBsYXN0IGZyYW1lOiAlenUsIG1pbjogJXp1KSIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgcmVzdGFydGluZy4gcmVuZGVyPSVsbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltVGltZUNvcnJlY3Rpb24sIChsb25nIGxvbmcpY29ycmVjdGlvbkxpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgdnN5bmNzRm9yTGFzdEZyYW1lLCBtaW5Wc3luY3NQZXJGcmFtZSwgKGxvbmcgbG9uZylvcmlnUmVuZGVyVGltZSk7Ci0gICAgICAgICAgICAgICAgcmVzdGFydCgpOwotICAgICAgICAgICAgICAgIHJldHVybiBvcmlnUmVuZGVyVGltZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQVRSQUNFX0lOVCgiRlJBTUVfVlNZTkNTIiwgdnN5bmNzRm9yTGFzdEZyYW1lKTsKLSAgICAgICAgfQotICAgICAgICBtTGFzdFZzeW5jVGltZSA9IG5leHRWc3luY1RpbWU7Ci0gICAgfQotCi0gICAgLy8gYWxpZ24gcmVuZGVydGltZSB0byB0aGUgY2VudGVyIGJldHdlZW4gVlNZTkMgZWRnZXMKLSAgICByZW5kZXJUaW1lIC09IChyZW5kZXJUaW1lIC0gbVZzeW5jVGltZSkgJSBtVnN5bmNQZXJpb2Q7Ci0gICAgcmVuZGVyVGltZSArPSBtVnN5bmNQZXJpb2QgLyAyOwotICAgIEFMT0dWKCJhZGp1c3RpbmcgcmVuZGVyOiAlbGxkID0+ICVsbGQiLCAobG9uZyBsb25nKW9yaWdSZW5kZXJUaW1lLCAobG9uZyBsb25nKXJlbmRlclRpbWUpOwotICAgIEFUUkFDRV9JTlQoIkZSQU1FX0ZMSVBfSU4obXMpIiwgKHJlbmRlclRpbWUgLSBub3cpIC8gMTAwMDAwMCk7Ci0gICAgcmV0dXJuIHJlbmRlclRpbWU7Ci19Ci0KIHZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlcjo6cmVsZWFzZSgpIHsKICAgICBtQ29tcG9zZXIuY2xlYXIoKTsKIH0KQEAgLTUwNyw0ICs2OSwzIEBACiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkMTUxN2IKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5jcHAKQEAgLTAsMCArMSw0NjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfVklERU8KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordGVtcGxhdGU8Y2xhc3MgVD4KK3N0YXRpYyBpbnQgY29tcGFyZShjb25zdCBUICpsaHMsIGNvbnN0IFQgKnJocykgeworICAgIGlmICgqbGhzIDwgKnJocykgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIGlmICgqbGhzID4gKnJocykgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9Cit9CisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUExMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KKworc3RhdGljIGNvbnN0IHNpemVfdCBrTWluU2FtcGxlc1RvU3RhcnRQcmltZSA9IDM7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtNaW5TYW1wbGVzVG9TdG9wUHJpbWUgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6a0hpc3RvcnlTaXplOworc3RhdGljIGNvbnN0IHNpemVfdCBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QgPSAzOworc3RhdGljIGNvbnN0IHNpemVfdCBrTWF4U2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QgPSBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6a0hpc3RvcnlTaXplOworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtQcmVjaXNpb24gPSAxMjsKK3N0YXRpYyBjb25zdCBpbnQ2NF90IGtFcnJvclRocmVzaG9sZCA9ICgxIDw8IChrUHJlY2lzaW9uICogMikpIC8gMTA7CitzdGF0aWMgY29uc3QgaW50NjRfdCBrTXVsdGlwbGVzVGhyZXNob2xkRGl2ID0gNDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMjUlCitzdGF0aWMgY29uc3QgaW50NjRfdCBrUmVGaXRUaHJlc2hvbGREaXYgPSAxMDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMSUKK3N0YXRpYyBjb25zdCBuc2Vjc190IGtNYXhBbGxvd2VkRnJhbWVTa2lwID0gVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmtOYW5vc0luMXM7ICAgICAvLyAxIHNlYworc3RhdGljIGNvbnN0IG5zZWNzX3Qga01pblBlcmlvZCA9IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjprTmFub3NJbjFzIC8gMTIwOyAgICAgICAgIC8vIDEyMEh6CitzdGF0aWMgY29uc3QgbnNlY3NfdCBrUmVmaXRSZWZyZXNoUGVyaW9kID0gMTAgKiBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6a05hbm9zSW4xczsgLy8gMTAgc2VjCisKK1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpQTEw6OlBMTCgpCisgICAgOiBtUGVyaW9kKC0xKSwKKyAgICAgIG1QaGFzZSgwKSwKKyAgICAgIG1QcmltZWQoZmFsc2UpLAorICAgICAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZygwKSwKKyAgICAgIG1MYXN0VGltZSgtMSksCisgICAgICBtTnVtU2FtcGxlcygwKSB7Cit9CisKK3ZvaWQgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OlBMTDo6cmVzZXQoZmxvYXQgZnBzKSB7CisgICAgLy90ZXN0KCk7CisKKyAgICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nID0gMDsKKyAgICBtTGFzdFRpbWUgPSAtMTsKKworICAgIC8vIHNldCB1cCBvciByZXNldCB2aWRlbyBQTEwKKyAgICBpZiAoZnBzIDw9IDAuZikgeworICAgICAgICBtUGVyaW9kID0gLTE7CisgICAgICAgIG1QcmltZWQgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigicmVzZXQgYXQgJS4xZiBmcHMiLCBmcHMpOworICAgICAgICBtUGVyaW9kID0gKG5zZWNzX3QpKDFlOSAvIGZwcyArIDAuNSk7CisgICAgICAgIG1QcmltZWQgPSB0cnVlOworICAgIH0KKworICAgIHJlc3RhcnQoKTsKK30KKworLy8gcmVzZXQgUExMIGJ1dCBrZWVwIHByZXZpb3VzIHBlcmlvZCBlc3RpbWF0ZQordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjpyZXN0YXJ0KCkgeworICAgIG1OdW1TYW1wbGVzID0gMDsKKyAgICBtUGhhc2UgPSAtMTsKK30KKworI2lmIDAKKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjp0ZXN0KCkgeworICAgIG5zZWNzX3QgcGVyaW9kID0gVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OmtOYW5vc0luMXMgLyA2MDsKKyAgICBtVGltZXNbMF0gPSAwOworICAgIG1UaW1lc1sxXSA9IHBlcmlvZDsKKyAgICBtVGltZXNbMl0gPSBwZXJpb2QgKiAzOworICAgIG1UaW1lc1szXSA9IHBlcmlvZCAqIDQ7CisgICAgbVRpbWVzWzRdID0gcGVyaW9kICogNzsKKyAgICBtVGltZXNbNV0gPSBwZXJpb2QgKiA4OworICAgIG1UaW1lc1s2XSA9IHBlcmlvZCAqIDEwOworICAgIG1UaW1lc1s3XSA9IHBlcmlvZCAqIDEyOworICAgIG1OdW1TYW1wbGVzID0gODsKKyAgICBpbnQ2NF90IGEsIGIsIGVycjsKKyAgICBmaXQoMCwgcGVyaW9kICogMTIgLyA3LCA4LCAmYSwgJmIsICZlcnIpOworICAgIC8vIGEgPSAwLjgoNSkrCisgICAgLy8gYiA9IC0wLjE0MDk3KDIpKworICAgIC8vIGVyciA9IDAuMjc1MDU3OCg3MDMpKworICAgIEFMT0dEKCJhPSVsbGQgKCUuNmYpLCBiPSVsbGQgKCUuNmYpLCBlcnI9JWxsZCAoJS42ZikiLAorICAgICAgICAgICAgKGxvbmcgbG9uZylhLCAoYSAvIChmbG9hdCkoMSA8PCBrUHJlY2lzaW9uKSksCisgICAgICAgICAgICAobG9uZyBsb25nKWIsIChiIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpZXJyLCAoZXJyIC8gKGZsb2F0KSgxIDw8IChrUHJlY2lzaW9uICogMikpKSk7Cit9CisKKyNlbmRpZgorCisvLyBJZiBvdmVyZmxvdyBoYXBwZW5zLCB0aGUgdmFsdWUgaXMgYWxyZWFkeSBpbmNvcnJlY3QsIGFuZCBubyBtYXRlciB3aGF0IHZhbHVlIHdlIGdldCBpcyBPSy4KKy8vIEFuZCB0aGlzIHBhcnQgb2YgY2FsY3VsYXRpb24gaXMgbm90IGltcG9ydGFudCwgc28gaXQncyBPSyB0byBzaW1wbHkgZGlzYWJsZSBvdmVyZmxvdyBjaGVjaworLy8gaW5zdGVhZCBvZiB1c2luZyBkb3VibGUgd2hpY2ggbWFrZXMgY29kZSBtb3JlIGNvbXBsaWNhdGVkLgorX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoImludGVnZXIiKSkpCitib29sIFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpQTEw6OmZpdCgKKyAgICAgICAgbnNlY3NfdCBwaGFzZSwgbnNlY3NfdCBwZXJpb2QsIHNpemVfdCBudW1TYW1wbGVzVG9Vc2UsCisgICAgICAgIGludDY0X3QgKmEsIGludDY0X3QgKmIsIGludDY0X3QgKmVycikgeworICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPiBtTnVtU2FtcGxlcykgeworICAgICAgICBudW1TYW1wbGVzVG9Vc2UgPSBtTnVtU2FtcGxlczsKKyAgICB9CisKKyAgICBpZiAoKHBlcmlvZCA+PiBrUHJlY2lzaW9uKSA9PSAwICkgeworICAgICAgICBBTE9HVygiUGVyaW9kIGlzIDAsIG9yIGFmdGVyIGluY2x1ZGluZyBwcmVjaXNpb24gaXMgMCAtIHdvdWxkIGNhdXNlIGRpdjAsIHJldHVybmluZyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50NjRfdCBzdW1YID0gMDsKKyAgICBpbnQ2NF90IHN1bVhYID0gMDsKKyAgICBpbnQ2NF90IHN1bVhZID0gMDsKKyAgICBpbnQ2NF90IHN1bVlZID0gMDsKKyAgICBpbnQ2NF90IHN1bVkgPSAwOworCisgICAgaW50NjRfdCB4ID0gMDsgLy8geCB1c3VhbGx5IGlzIGluIFswLi5udW1TYW1wbGVzVG9Vc2UpCisgICAgbnNlY3NfdCBsYXN0VGltZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bVNhbXBsZXNUb1VzZTsgaSsrKSB7CisgICAgICAgIHNpemVfdCBpeCA9IChtTnVtU2FtcGxlcyAtIG51bVNhbXBsZXNUb1VzZSArIGkpICUga0hpc3RvcnlTaXplOworICAgICAgICBuc2Vjc190IHRpbWUgPSBtVGltZXNbaXhdOworICAgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgICAgIHggKz0gZGl2Um91bmQodGltZSAtIGxhc3RUaW1lLCBwZXJpb2QpOworICAgICAgICB9CisgICAgICAgIC8vIHkgaXMgdXN1YWxseSBpbiBbLW51bVNhbXBsZXNUb1VzZS4ubnVtU2FtcGxlc1RvVXNlK2tSZWZpdFJlZnJlc2hQZXJpb2Qva01pblBlcmlvZCkgPDwga1ByZWNpc2lvbgorICAgICAgICAvLyAgIGlkZWFsbHkgaW4gWzAuLm51bVNhbXBsZXNUb1VzZSksIGJ1dCBzaGlmdGVkIGJ5IC1udW1TYW1wbGVzVG9Vc2UgZHVyaW5nCisgICAgICAgIC8vICAgcHJpbWluZywgYW5kIHBvc3NpYmx5IHNoaWZ0ZWQgYnkgdXAgdG8ga1JlZml0UmVmcmVzaFBlcmlvZC9rTWluUGVyaW9kCisgICAgICAgIC8vICAgd2hpbGUgd2UgYXJlIG5vdCByZWZpdHRpbmcuCisgICAgICAgIGludDY0X3QgeSA9IGRpdlJvdW5kKHRpbWUgLSBwaGFzZSwgcGVyaW9kID4+IGtQcmVjaXNpb24pOworICAgICAgICBzdW1YICs9IHg7CisgICAgICAgIHN1bVkgKz0geTsKKyAgICAgICAgc3VtWFggKz0geCAqIHg7CisgICAgICAgIHN1bVhZICs9IHggKiB5OworICAgICAgICBzdW1ZWSArPSB5ICogeTsKKyAgICAgICAgbGFzdFRpbWUgPSB0aW1lOworICAgIH0KKworICAgIGludDY0X3QgZGl2ICAgPSAoaW50NjRfdCludW1TYW1wbGVzVG9Vc2UgKiBzdW1YWCAtIHN1bVggKiBzdW1YOworICAgIGlmIChkaXYgPT0gMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50NjRfdCBhX25vbSA9IChpbnQ2NF90KW51bVNhbXBsZXNUb1VzZSAqIHN1bVhZIC0gc3VtWCAqIHN1bVk7CisgICAgaW50NjRfdCBiX25vbSA9IHN1bVhYICogc3VtWSAgICAgICAgICAgIC0gc3VtWCAqIHN1bVhZOworICAgICphID0gZGl2Um91bmQoYV9ub20sIGRpdik7CisgICAgKmIgPSBkaXZSb3VuZChiX25vbSwgZGl2KTsKKyAgICAvLyBkb24ndCB1c2UgYSBhbmQgYiBkaXJlY3RseSBhcyB0aGUgcm91bmRpbmcgZXJyb3IgaXMgc2lnbmlmaWNhbnQKKyAgICAqZXJyID0gc3VtWVkgLSBkaXZSb3VuZChhX25vbSAqIHN1bVhZICsgYl9ub20gKiBzdW1ZLCBkaXYpOworICAgIEFMT0dWKCJmaXR0aW5nWyV6dV0gYT0lbGxkICglLjZmKSwgYj0lbGxkICglLjZmKSwgZXJyPSVsbGQgKCUuNmYpIiwKKyAgICAgICAgICAgIG51bVNhbXBsZXNUb1VzZSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpKmEsICAgKCphIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpKmIsICAgKCpiIC8gKGZsb2F0KSgxIDw8IGtQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIChsb25nIGxvbmcpKmVyciwgKCplcnIgLyAoZmxvYXQpKDEgPDwgKGtQcmVjaXNpb24gKiAyKSkpKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjpwcmltZShzaXplX3QgbnVtU2FtcGxlc1RvVXNlKSB7CisgICAgaWYgKG51bVNhbXBsZXNUb1VzZSA+IG1OdW1TYW1wbGVzKSB7CisgICAgICAgIG51bVNhbXBsZXNUb1VzZSA9IG1OdW1TYW1wbGVzOworICAgIH0KKyAgICBDSEVDSyhudW1TYW1wbGVzVG9Vc2UgPj0gMyk7ICAvLyBtdXN0IGhhdmUgYXQgbGVhc3QgMyBzYW1wbGVzCisKKyAgICAvLyBlc3RpbWF0ZSB2aWRlbyBmcmFtZXJhdGUgZnJvbSBkZWx0YXMgYmV0d2VlbiB0aW1lc3RhbXBzLCBhbmQKKyAgICAvLyAybmQgb3JkZXIgZGVsdGFzCisgICAgVmVjdG9yPG5zZWNzX3Q+IGRlbHRhczsKKyAgICBuc2Vjc190IGxhc3RUaW1lLCBmaXJzdFRpbWU7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1TYW1wbGVzVG9Vc2U7ICsraSkgeworICAgICAgICBzaXplX3QgaW5kZXggPSAobU51bVNhbXBsZXMgLSBudW1TYW1wbGVzVG9Vc2UgKyBpKSAlIGtIaXN0b3J5U2l6ZTsKKyAgICAgICAgbnNlY3NfdCB0aW1lID0gbVRpbWVzW2luZGV4XTsKKyAgICAgICAgaWYgKGkgPiAwKSB7CisgICAgICAgICAgICBpZiAodGltZSAtIGxhc3RUaW1lID4ga01pblBlcmlvZCkgeworICAgICAgICAgICAgICAgIC8vQUxPR1YoImRlbHRhOiAlbGxkIiwgKGxvbmcgbG9uZykodGltZSAtIGxhc3RUaW1lKSk7CisgICAgICAgICAgICAgICAgZGVsdGFzLnB1c2godGltZSAtIGxhc3RUaW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZpcnN0VGltZSA9IHRpbWU7CisgICAgICAgIH0KKyAgICAgICAgbGFzdFRpbWUgPSB0aW1lOworICAgIH0KKyAgICBkZWx0YXMuc29ydChjb21wYXJlPG5zZWNzX3Q+KTsKKyAgICBzaXplX3QgbnVtRGVsdGFzID0gZGVsdGFzLnNpemUoKTsKKyAgICBpZiAobnVtRGVsdGFzID4gMSkgeworICAgICAgICBuc2Vjc190IGRlbHRhTWluTGltaXQgPSBtYXgoZGVsdGFzWzBdIC8ga011bHRpcGxlc1RocmVzaG9sZERpdiwga01pblBlcmlvZCk7CisgICAgICAgIG5zZWNzX3QgZGVsdGFNYXhMaW1pdCA9IGRlbHRhc1tudW1EZWx0YXMgLyAyXSAqIGtNdWx0aXBsZXNUaHJlc2hvbGREaXY7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSBudW1EZWx0YXMgLyAyICsgMTsgaSA8IG51bURlbHRhczsgKytpKSB7CisgICAgICAgICAgICBpZiAoZGVsdGFzW2ldID4gZGVsdGFNYXhMaW1pdCkgeworICAgICAgICAgICAgICAgIGRlbHRhcy5yZXNpemUoaSk7CisgICAgICAgICAgICAgICAgbnVtRGVsdGFzID0gaTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG51bURlbHRhczsgKytpKSB7CisgICAgICAgICAgICBuc2Vjc190IGRlbHRhMm5kID0gZGVsdGFzW2ldIC0gZGVsdGFzW2kgLSAxXTsKKyAgICAgICAgICAgIGlmIChkZWx0YTJuZCA+PSBkZWx0YU1pbkxpbWl0KSB7CisgICAgICAgICAgICAgICAgLy9BTE9HVigiZGVsdGEyOiAlbGxkIiwgKGxvbmcgbG9uZykoZGVsdGEybmQpKTsKKyAgICAgICAgICAgICAgICBkZWx0YXMucHVzaChkZWx0YTJuZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyB1c2UgdGhlIG9uZSB0aGF0IHlpZWxkcyB0aGUgYmVzdCBtYXRjaAorICAgIGludDY0X3QgYmVzdFNjb3JlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGVsdGFzLnNpemUoKTsgKytpKSB7CisgICAgICAgIG5zZWNzX3QgZGVsdGEgPSBkZWx0YXNbaV07CisgICAgICAgIGludDY0X3Qgc2NvcmUgPSAwOworI2lmIDEKKyAgICAgICAgLy8gc2ltcGxlc3Qgc2NvcmU6IG51bWJlciBvZiBkZWx0YXMgdGhhdCBhcmUgbmVhciBtdWx0aXBsZXMKKyAgICAgICAgc2l6ZV90IG1hdGNoZXMgPSAwOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGRlbHRhcy5zaXplKCk7ICsraikgeworICAgICAgICAgICAgbnNlY3NfdCBlcnIgPSBwZXJpb2RpY0Vycm9yKGRlbHRhc1tqXSwgZGVsdGEpOworICAgICAgICAgICAgaWYgKGVyciA8IGRlbHRhIC8ga011bHRpcGxlc1RocmVzaG9sZERpdikgeworICAgICAgICAgICAgICAgICsrbWF0Y2hlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBzY29yZSA9IG1hdGNoZXM7CisjaWYgMAorICAgICAgICAvLyBjb3VsZCBiZSB3ZWlnaGVkIGJ5IHRoZSAoMSAtIG5vcm1hbGl6ZWQgZXJyb3IpCisgICAgICAgIGlmIChudW1TYW1wbGVzVG9Vc2UgPj0ga01pblNhbXBsZXNUb0VzdGltYXRlUGVyaW9kKSB7CisgICAgICAgICAgICBpbnQ2NF90IGEsIGIsIGVycjsKKyAgICAgICAgICAgIGZpdChmaXJzdFRpbWUsIGRlbHRhLCBudW1TYW1wbGVzVG9Vc2UsICZhLCAmYiwgJmVycik7CisgICAgICAgICAgICBlcnIgPSAoMSA8PCAoMiAqIGtQcmVjaXNpb24pKSAtIGVycjsKKyAgICAgICAgICAgIHNjb3JlICo9IG1heCgwLCBlcnIpOworICAgICAgICB9CisjZW5kaWYKKyNlbHNlCisgICAgICAgIC8vIG9yIHVzZSB0aGUgZXJyb3IgYXMgYSBuZWdhdGl2ZSBzY29yZQorICAgICAgICBpZiAobnVtU2FtcGxlc1RvVXNlID49IGtNaW5TYW1wbGVzVG9Fc3RpbWF0ZVBlcmlvZCkgeworICAgICAgICAgICAgaW50NjRfdCBhLCBiLCBlcnI7CisgICAgICAgICAgICBmaXQoZmlyc3RUaW1lLCBkZWx0YSwgbnVtU2FtcGxlc1RvVXNlLCAmYSwgJmIsICZlcnIpOworICAgICAgICAgICAgc2NvcmUgPSAtZGVsdGEgKiBlcnI7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICBpZiAoaSA9PSAwIHx8IHNjb3JlID4gYmVzdFNjb3JlKSB7CisgICAgICAgICAgICBiZXN0U2NvcmUgPSBzY29yZTsKKyAgICAgICAgICAgIG1QZXJpb2QgPSBkZWx0YTsKKyAgICAgICAgICAgIG1QaGFzZSA9IGZpcnN0VGltZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigicHJpbWluZ1slenVdIHBoYXNlOiVsbGQgcGVyaW9kOiVsbGQiLAorICAgICAgICAgICAgbnVtU2FtcGxlc1RvVXNlLCAobG9uZyBsb25nKW1QaGFzZSwgKGxvbmcgbG9uZyltUGVyaW9kKTsKK30KKworbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6UExMOjphZGRTYW1wbGUobnNlY3NfdCB0aW1lKSB7CisgICAgaWYgKG1MYXN0VGltZSA+PSAwCisgICAgICAgICAgICAvLyBpZiB0aW1lIGdvZXMgYmFja3dhcmQsIG9yIHdlIHNraXBwZWQgcmVuZGVyaW5nCisgICAgICAgICAgICAmJiAodGltZSA+IG1MYXN0VGltZSArIGtNYXhBbGxvd2VkRnJhbWVTa2lwIHx8IHRpbWUgPCBtTGFzdFRpbWUpKSB7CisgICAgICAgIHJlc3RhcnQoKTsKKyAgICB9CisKKyAgICBtTGFzdFRpbWUgPSB0aW1lOworICAgIG1UaW1lc1ttTnVtU2FtcGxlcyAlIGtIaXN0b3J5U2l6ZV0gPSB0aW1lOworICAgICsrbU51bVNhbXBsZXM7CisKKyAgICBib29sIGRvRml0ID0gdGltZSA+IG1SZWZpdEF0OworICAgIGlmICgobVBlcmlvZCA8PSAwIHx8ICFtUHJpbWVkKSAmJiBtTnVtU2FtcGxlcyA+PSBrTWluU2FtcGxlc1RvU3RhcnRQcmltZSkgeworICAgICAgICBwcmltZShrTWluU2FtcGxlc1RvU3RvcFByaW1lKTsKKyAgICAgICAgKyttU2FtcGxlc1VzZWRGb3JQcmltaW5nOworICAgICAgICBkb0ZpdCA9IHRydWU7CisgICAgfQorICAgIGlmIChtUGVyaW9kID4gMCAmJiBtTnVtU2FtcGxlcyA+PSBrTWluU2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QpIHsKKyAgICAgICAgaWYgKG1QaGFzZSA8IDApIHsKKyAgICAgICAgICAgIC8vIGluaXRpYWxpemUgcGhhc2UgdG8gdGhlIGN1cnJlbnQgcmVuZGVyIHRpbWUKKyAgICAgICAgICAgIG1QaGFzZSA9IHRpbWU7CisgICAgICAgICAgICBkb0ZpdCA9IHRydWU7CisgICAgICAgIH0gZWxzZSBpZiAoIWRvRml0KSB7CisgICAgICAgICAgICBpbnQ2NF90IGVyciA9IHBlcmlvZGljRXJyb3IodGltZSAtIG1QaGFzZSwgbVBlcmlvZCk7CisgICAgICAgICAgICBkb0ZpdCA9IGVyciA+IG1QZXJpb2QgLyBrUmVGaXRUaHJlc2hvbGREaXY7CisgICAgICAgIH0KKworICAgICAgICBpZiAoZG9GaXQpIHsKKyAgICAgICAgICAgIGludDY0X3QgYSwgYiwgZXJyOworICAgICAgICAgICAgaWYgKCFmaXQobVBoYXNlLCBtUGVyaW9kLCBrTWF4U2FtcGxlc1RvRXN0aW1hdGVQZXJpb2QsICZhLCAmYiwgJmVycikpIHsKKyAgICAgICAgICAgICAgICAvLyBzYW1wbGVzIGFyZSBub3Qgc3VpdGFibGUgZm9yIGZpdHRpbmcuICB0aGlzIG1lYW5zIHRoZXkgYXJlCisgICAgICAgICAgICAgICAgLy8gYWxzbyBub3Qgc3VpdGFibGUgZm9yIHByaW1pbmcuCisgICAgICAgICAgICAgICAgQUxPR1YoImNvdWxkIG5vdCBmaXQgLSBrZWVwaW5nIG9sZCBwZXJpb2Q6JWxsZCIsIChsb25nIGxvbmcpbVBlcmlvZCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1QZXJpb2Q7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIG1SZWZpdEF0ID0gdGltZSArIGtSZWZpdFJlZnJlc2hQZXJpb2Q7CisKKyAgICAgICAgICAgIG1QaGFzZSArPSAobVBlcmlvZCAqIGIpID4+IGtQcmVjaXNpb247CisgICAgICAgICAgICBtUGVyaW9kID0gKG1QZXJpb2QgKiBhKSA+PiBrUHJlY2lzaW9uOworICAgICAgICAgICAgQUxPR1YoIm5ldyBwaGFzZTolbGxkIHBlcmlvZDolbGxkIiwgKGxvbmcgbG9uZyltUGhhc2UsIChsb25nIGxvbmcpbVBlcmlvZCk7CisKKyAgICAgICAgICAgIGlmIChlcnIgPCBrRXJyb3JUaHJlc2hvbGQpIHsKKyAgICAgICAgICAgICAgICBpZiAoIW1QcmltZWQgJiYgbVNhbXBsZXNVc2VkRm9yUHJpbWluZyA+PSBrTWluU2FtcGxlc1RvU3RvcFByaW1lKSB7CisgICAgICAgICAgICAgICAgICAgIG1QcmltZWQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbVByaW1lZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1TYW1wbGVzVXNlZEZvclByaW1pbmcgPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBtUGVyaW9kOworfQorCituc2Vjc190IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpQTEw6OmdldFBlcmlvZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbVByaW1lZCA/IG1QZXJpb2QgOiAwOworfQorCisvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworLyogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lIFNjaGVkdWxlciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKK1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSgpCisgICAgOiBtVnN5bmNUaW1lKDApLAorICAgICAgbVZzeW5jUGVyaW9kKDApLAorICAgICAgbVZzeW5jUmVmcmVzaEF0KDApLAorICAgICAgbUxhc3RWc3luY1RpbWUoLTEpLAorICAgICAgbVRpbWVDb3JyZWN0aW9uKDApIHsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6aW5pdChmbG9hdCB2aWRlb0ZwcykgeworICAgIHVwZGF0ZVZzeW5jKCk7CisKKyAgICBtTGFzdFZzeW5jVGltZSA9IC0xOworICAgIG1UaW1lQ29ycmVjdGlvbiA9IDA7CisKKyAgICBtUGxsLnJlc2V0KHZpZGVvRnBzKTsKK30KKwordm9pZCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6cmVzdGFydCgpIHsKKyAgICBtTGFzdFZzeW5jVGltZSA9IC0xOworICAgIG1UaW1lQ29ycmVjdGlvbiA9IDA7CisKKyAgICBtUGxsLnJlc3RhcnQoKTsKK30KKworbnNlY3NfdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6Z2V0VnN5bmNQZXJpb2QoKSB7CisgICAgaWYgKG1Wc3luY1BlcmlvZCA+IDApIHsKKyAgICAgICAgcmV0dXJuIG1Wc3luY1BlcmlvZDsKKyAgICB9CisgICAgcmV0dXJuIGtEZWZhdWx0VnN5bmNQZXJpb2Q7Cit9CisKK2Zsb2F0IFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlOjpnZXRGcmFtZVJhdGUoKSB7CisgICAgbnNlY3NfdCB2aWRlb1BlcmlvZCA9IG1QbGwuZ2V0UGVyaW9kKCk7CisgICAgaWYgKHZpZGVvUGVyaW9kID4gMCkgeworICAgICAgICByZXR1cm4gMWU5IC8gdmlkZW9QZXJpb2Q7CisgICAgfQorICAgIHJldHVybiAwLmY7Cit9CisKK25zZWNzX3QgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2U6OnNjaGVkdWxlKG5zZWNzX3QgcmVuZGVyVGltZSkgeworICAgIG5zZWNzX3Qgb3JpZ1JlbmRlclRpbWUgPSByZW5kZXJUaW1lOworCisgICAgbnNlY3NfdCBub3cgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CisgICAgaWYgKG5vdyA+PSBtVnN5bmNSZWZyZXNoQXQpIHsKKyAgICAgICAgdXBkYXRlVnN5bmMoKTsKKyAgICB9CisKKyAgICAvLyB3aXRob3V0IFZTWU5DIGluZm8sIHRoZXJlIGlzIG5vdGhpbmcgdG8gZG8KKyAgICBpZiAobVZzeW5jUGVyaW9kID09IDApIHsKKyAgICAgICAgQUxPR1YoIm5vIHZzeW5jOiByZW5kZXI9JWxsZCIsIChsb25nIGxvbmcpcmVuZGVyVGltZSk7CisgICAgICAgIHJldHVybiByZW5kZXJUaW1lOworICAgIH0KKworICAgIC8vIGVuc3VyZSB2c3luYyB0aW1lIGlzIHdlbGwgYmVmb3JlIChjb3JyZWN0ZWQpIHJlbmRlciB0aW1lCisgICAgaWYgKG1Wc3luY1RpbWUgPiByZW5kZXJUaW1lIC0gNCAqIG1Wc3luY1BlcmlvZCkgeworICAgICAgICBtVnN5bmNUaW1lIC09CisgICAgICAgICAgICAoKG1Wc3luY1RpbWUgLSByZW5kZXJUaW1lKSAvIG1Wc3luY1BlcmlvZCArIDUpICogbVZzeW5jUGVyaW9kOworICAgIH0KKworICAgIC8vIFZpZGVvIHByZXNlbnRhdGlvbiB0YWtlcyBwbGFjZSBhdCB0aGUgVlNZTkMgX2FmdGVyXyByZW5kZXJUaW1lLiAgQWRqdXN0IHJlbmRlclRpbWUKKyAgICAvLyBzbyB0aGlzIGVmZmVjdGl2ZWx5IGJlY29tZXMgYSByb3VuZGluZyBvcGVyYXRpb24gKHRvIHRoZSBfY2xvc2VzdF8gVlNZTkMuKQorICAgIHJlbmRlclRpbWUgLT0gbVZzeW5jUGVyaW9kIC8gMjsKKworICAgIGNvbnN0IG5zZWNzX3QgdmlkZW9QZXJpb2QgPSBtUGxsLmFkZFNhbXBsZShvcmlnUmVuZGVyVGltZSk7CisgICAgaWYgKHZpZGVvUGVyaW9kID4gMCkgeworICAgICAgICAvLyBTbW9vdGggb3V0IHJlbmRlcmluZworICAgICAgICBzaXplX3QgTiA9IDEyOworICAgICAgICBuc2Vjc190IGZpdmVTaXh0aERldiA9CisgICAgICAgICAgICBhYnMoKCh2aWRlb1BlcmlvZCAqIDUgKyBtVnN5bmNQZXJpb2QpICUgKG1Wc3luY1BlcmlvZCAqIDYpKSAtIG1Wc3luY1BlcmlvZCkKKyAgICAgICAgICAgICAgICAgICAgLyAobVZzeW5jUGVyaW9kIC8gMTAwKTsKKyAgICAgICAgLy8gdXNlIDIwIHNhbXBsZXMgaWYgd2UgYXJlIGRvaW5nIDU6NiByYXRpbyArLSAxJSAoZS5nLiBwbGF5aW5nIDUwSHogb24gNjBIeikKKyAgICAgICAgaWYgKGZpdmVTaXh0aERldiA8IDEyKSB7ICAvKiAxMiUgLyA2ID0gMiUgKi8KKyAgICAgICAgICAgIE4gPSAyMDsKKyAgICAgICAgfQorCisgICAgICAgIG5zZWNzX3Qgb2Zmc2V0ID0gMDsKKyAgICAgICAgbnNlY3NfdCBlZGdlUmVtYWluZGVyID0gMDsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPD0gTjsgaSsrKSB7CisgICAgICAgICAgICBvZmZzZXQgKz0KKyAgICAgICAgICAgICAgICAocmVuZGVyVGltZSArIG1UaW1lQ29ycmVjdGlvbiArIHZpZGVvUGVyaW9kICogaSAtIG1Wc3luY1RpbWUpICUgbVZzeW5jUGVyaW9kOworICAgICAgICAgICAgZWRnZVJlbWFpbmRlciArPSAodmlkZW9QZXJpb2QgKiBpKSAlIG1Wc3luY1BlcmlvZDsKKyAgICAgICAgfQorICAgICAgICBtVGltZUNvcnJlY3Rpb24gKz0gbVZzeW5jUGVyaW9kIC8gMiAtIG9mZnNldCAvIChuc2Vjc190KU47CisgICAgICAgIHJlbmRlclRpbWUgKz0gbVRpbWVDb3JyZWN0aW9uOworICAgICAgICBuc2Vjc190IGNvcnJlY3Rpb25MaW1pdCA9IG1Wc3luY1BlcmlvZCAqIDMgLyA1OworICAgICAgICBlZGdlUmVtYWluZGVyID0gYWJzKGVkZ2VSZW1haW5kZXIgLyAobnNlY3NfdClOIC0gbVZzeW5jUGVyaW9kIC8gMik7CisgICAgICAgIGlmIChlZGdlUmVtYWluZGVyIDw9IG1Wc3luY1BlcmlvZCAvIDMpIHsKKyAgICAgICAgICAgIGNvcnJlY3Rpb25MaW1pdCAvPSAyOworICAgICAgICB9CisKKyAgICAgICAgLy8gZXN0aW1hdGUgaG93IG1hbnkgVlNZTkNzIGEgZnJhbWUgd2lsbCBzcGVuZCBvbiB0aGUgZGlzcGxheQorICAgICAgICBuc2Vjc190IG5leHRWc3luY1RpbWUgPQorICAgICAgICAgICAgcmVuZGVyVGltZSArIG1Wc3luY1BlcmlvZCAtICgocmVuZGVyVGltZSAtIG1Wc3luY1RpbWUpICUgbVZzeW5jUGVyaW9kKTsKKyAgICAgICAgaWYgKG1MYXN0VnN5bmNUaW1lID49IDApIHsKKyAgICAgICAgICAgIHNpemVfdCBtaW5Wc3luY3NQZXJGcmFtZSA9IHZpZGVvUGVyaW9kIC8gbVZzeW5jUGVyaW9kOworICAgICAgICAgICAgc2l6ZV90IHZzeW5jc0Zvckxhc3RGcmFtZSA9IGRpdlJvdW5kKG5leHRWc3luY1RpbWUgLSBtTGFzdFZzeW5jVGltZSwgbVZzeW5jUGVyaW9kKTsKKyAgICAgICAgICAgIGJvb2wgdnN5bmNzUGVyRnJhbWVBcmVOZWFybHlDb25zdGFudCA9CisgICAgICAgICAgICAgICAgcGVyaW9kaWNFcnJvcih2aWRlb1BlcmlvZCwgbVZzeW5jUGVyaW9kKSAvIChtVnN5bmNQZXJpb2QgLyAyMCkgPT0gMDsKKworICAgICAgICAgICAgaWYgKG1UaW1lQ29ycmVjdGlvbiA+IGNvcnJlY3Rpb25MaW1pdCAmJgorICAgICAgICAgICAgICAgICAgICAodnN5bmNzUGVyRnJhbWVBcmVOZWFybHlDb25zdGFudCB8fCB2c3luY3NGb3JMYXN0RnJhbWUgPiBtaW5Wc3luY3NQZXJGcmFtZSkpIHsKKyAgICAgICAgICAgICAgICAvLyByZW1vdmUgYSBWU1lOQworICAgICAgICAgICAgICAgIG1UaW1lQ29ycmVjdGlvbiAtPSBtVnN5bmNQZXJpb2QgLyAyOworICAgICAgICAgICAgICAgIHJlbmRlclRpbWUgLT0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICAgICAgICAgICAgICBuZXh0VnN5bmNUaW1lIC09IG1Wc3luY1BlcmlvZDsKKyAgICAgICAgICAgICAgICBpZiAodnN5bmNzRm9yTGFzdEZyYW1lID4gMCkKKyAgICAgICAgICAgICAgICAgICAgLS12c3luY3NGb3JMYXN0RnJhbWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1UaW1lQ29ycmVjdGlvbiA8IC1jb3JyZWN0aW9uTGltaXQgJiYKKyAgICAgICAgICAgICAgICAgICAgKHZzeW5jc1BlckZyYW1lQXJlTmVhcmx5Q29uc3RhbnQgfHwgdnN5bmNzRm9yTGFzdEZyYW1lID09IG1pblZzeW5jc1BlckZyYW1lKSkgeworICAgICAgICAgICAgICAgIC8vIGFkZCBhIFZTWU5DCisgICAgICAgICAgICAgICAgbVRpbWVDb3JyZWN0aW9uICs9IG1Wc3luY1BlcmlvZCAvIDI7CisgICAgICAgICAgICAgICAgcmVuZGVyVGltZSArPSBtVnN5bmNQZXJpb2QgLyAyOworICAgICAgICAgICAgICAgIG5leHRWc3luY1RpbWUgKz0gbVZzeW5jUGVyaW9kOworICAgICAgICAgICAgICAgIGlmICh2c3luY3NGb3JMYXN0RnJhbWUgPCBVTE9OR19NQVgpCisgICAgICAgICAgICAgICAgICAgICsrdnN5bmNzRm9yTGFzdEZyYW1lOworICAgICAgICAgICAgfSBlbHNlIGlmIChtVGltZUNvcnJlY3Rpb24gPCAtY29ycmVjdGlvbkxpbWl0ICogMgorICAgICAgICAgICAgICAgICAgICB8fCBtVGltZUNvcnJlY3Rpb24gPiBjb3JyZWN0aW9uTGltaXQgKiAyKSB7CisgICAgICAgICAgICAgICAgQUxPR1coImNvcnJlY3Rpb24gYmV5b25kIGxpbWl0OiAlbGxkIHZzICVsbGQgKHZzeW5jcyBmb3IgbGFzdCBmcmFtZTogJXp1LCBtaW46ICV6dSkiCisgICAgICAgICAgICAgICAgICAgICAgICAiIHJlc3RhcnRpbmcuIHJlbmRlcj0lbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpbVRpbWVDb3JyZWN0aW9uLCAobG9uZyBsb25nKWNvcnJlY3Rpb25MaW1pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZzeW5jc0Zvckxhc3RGcmFtZSwgbWluVnN5bmNzUGVyRnJhbWUsIChsb25nIGxvbmcpb3JpZ1JlbmRlclRpbWUpOworICAgICAgICAgICAgICAgIHJlc3RhcnQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gb3JpZ1JlbmRlclRpbWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEFUUkFDRV9JTlQoIkZSQU1FX1ZTWU5DUyIsIHZzeW5jc0Zvckxhc3RGcmFtZSk7CisgICAgICAgIH0KKyAgICAgICAgbUxhc3RWc3luY1RpbWUgPSBuZXh0VnN5bmNUaW1lOworICAgIH0KKworICAgIC8vIGFsaWduIHJlbmRlcnRpbWUgdG8gdGhlIGNlbnRlciBiZXR3ZWVuIFZTWU5DIGVkZ2VzCisgICAgcmVuZGVyVGltZSAtPSAocmVuZGVyVGltZSAtIG1Wc3luY1RpbWUpICUgbVZzeW5jUGVyaW9kOworICAgIHJlbmRlclRpbWUgKz0gbVZzeW5jUGVyaW9kIC8gMjsKKyAgICBBTE9HVigiYWRqdXN0aW5nIHJlbmRlcjogJWxsZCA9PiAlbGxkIiwgKGxvbmcgbG9uZylvcmlnUmVuZGVyVGltZSwgKGxvbmcgbG9uZylyZW5kZXJUaW1lKTsKKyAgICBBVFJBQ0VfSU5UKCJGUkFNRV9GTElQX0lOKG1zKSIsIChyZW5kZXJUaW1lIC0gbm93KSAvIDEwMDAwMDApOworICAgIHJldHVybiByZW5kZXJUaW1lOworfQorCitWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZTo6flZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlKCkge30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0FuZHJvaWQuYnAKaW5kZXggZGI4NjIxOC4uNjcxOWJhYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9BbmRyb2lkLmJwCkBAIC00LDEyICs0LDEwIEBACiAgICAgdm5kazogewogICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgIH0sCi0KKyAgICBkb3VibGVfbG9hZGFibGU6IHRydWUsCiAgICAgc3JjczogWwotICAgICAgICAiQ29udmVyc2lvbi5jcHAiLAogICAgICAgICAiRnJhbWVEcm9wcGVyLmNwcCIsCiAgICAgICAgICJHcmFwaGljQnVmZmVyU291cmNlLmNwcCIsCi0gICAgICAgICJXUHJvZHVjZXJMaXN0ZW5lci5jcHAiLAogICAgIF0sCiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCkBAIC0yNSwyNyArMjMsMzQgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmJhc2UiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJndWkiLAogICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGliaGlkbG1lbW9yeSIsCi0gICAgICAgICJsaWJoaWRsdHJhbnNwb3J0IiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnVpIiwKICAgICAgICAgImxpYnV0aWxzIiwKIAogICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAotCi0gICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLCAvLyBUT0RPKGIvNjI5MjM0NzkpOiB1c2UgaGVhZGVyIGxpYnJhcnkKKyAgICAgICAgLy8gRm9sbG93aW5nIGxpYnMgYXJlIGZyb20gbGliZ3VpX2J1ZmZlcnF1ZXVlX3N0YXRpYworICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAyLjAiLAorICAgICAgICAiYW5kcm9pZC5oaWRsLnRva2VuQDEuMC11dGlscyIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYkVHTCIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgICAgICAibGlidm5ka3N1cHBvcnQiLAorICAgIF0sCisgICAgCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmd1aV9idWZmZXJxdWV1ZV9zdGF0aWMiCiAgICAgXSwKIAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKLSAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5ncmFwaGljcy5idWZmZXJxdWV1ZUAyLjAiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbnZlcnNpb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZWQwMDUuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgY29udmVyc2lvbiB7Ci0KLS8vIG5hdGl2ZV9oYW5kbGVfdCBoZWxwZXIgZnVuY3Rpb25zLgotCi0vKioKLSAqIFxicmllZiBUYWtlIGFuIGZkIGFuZCBjcmVhdGUgYSBuYXRpdmUgaGFuZGxlIGNvbnRhaW5pbmcgb25seSB0aGUgZ2l2ZW4gZmQuCi0gKiBUaGUgY3JlYXRlZCBoYW5kbGUgd2lsbCBuZWVkIHRvIGJlIGRlbGV0ZWQgbWFudWFsbHkgd2l0aAotICogYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgLgotICoKLSAqIFxwYXJhbVtpbl0gZmQgVGhlIHNvdXJjZSBmaWxlIGRlc2NyaXB0b3IgKG9mIHR5cGUgYGludGApLgotICogXHJldHVybiBUaGUgY3JlYXRlIGBuYXRpdmVfaGFuZGxlX3QqYCB0aGF0IGNvbnRhaW5zIHRoZSBnaXZlbiBccCBmZC4gSWYgdGhlCi0gKiBzdXBwbGllZCBccCBmZCBpcyBuZWdhdGl2ZSwgdGhlIGNyZWF0ZWQgbmF0aXZlIGhhbmRsZSB3aWxsIGNvbnRhaW4gbm8gZmlsZQotICogZGVzY3JpcHRvcnMuCi0gKgotICogSWYgdGhlIG5hdGl2ZSBoYW5kbGUgY2Fubm90IGJlIGNyZWF0ZWQsIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZQotICogYG51bGxwdHJgLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZHVwbGljYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IuCi0gKi8KLW5hdGl2ZV9oYW5kbGVfdCogbmF0aXZlX2hhbmRsZV9jcmVhdGVfZnJvbV9mZChpbnQgZmQpIHsKLSAgICBpZiAoZmQgPCAyKSB7Ci0gICAgICAgIHJldHVybiBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgwLCAwKTsKLSAgICB9Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBuaCA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsIDApOwotICAgIGlmIChuaCA9PSBudWxscHRyKSB7Ci0gICAgICAgIHJldHVybiBudWxscHRyOwotICAgIH0KLSAgICBuaC0+ZGF0YVswXSA9IGZkOwotICAgIHJldHVybiBuaDsKLX0KLQotLyoqCi0gKiBcYnJpZWYgRXh0cmFjdCBhIGZpbGUgZGVzY3JpcHRvciBmcm9tIGEgbmF0aXZlIGhhbmRsZS4KLSAqCi0gKiBccGFyYW1baW5dIG5oIFRoZSBzb3VyY2UgYG5hdGl2ZV9oYW5kbGVfdCpgLgotICogXHBhcmFtW2luXSBpbmRleCBUaGUgaW5kZXggb2YgdGhlIGZpbGUgZGVzY3JpcHRvciBpbiBccCBuaCB0byByZWFkIGZyb20uIFRoaXMKLSAqIGlucHV0IGhhcyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBgMGAuCi0gKiBccmV0dXJuIFRoZSBgaW5kZXhgLXRoIGZpbGUgZGVzY3JpcHRvciBpbiBccCBuaC4gSWYgXHAgbmggZG9lcyBub3QgaGF2ZQotICogZW5vdWdoIGZpbGUgZGVzY3JpcHRvcnMsIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIGAtMWAuCi0gKgotICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkdXBsaWNhdGUgdGhlIGZpbGUgZGVzY3JpcHRvci4KLSAqLwotaW50IG5hdGl2ZV9oYW5kbGVfcmVhZF9mZChuYXRpdmVfaGFuZGxlX3QgY29uc3QqIG5oLCBpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gKChuaCA9PSBudWxscHRyKSB8fCAobmgtPm51bUZkcyA9PSAwKSB8fAotICAgICAgICAgICAgKG5oLT5udW1GZHMgPD0gaW5kZXgpIHx8IChpbmRleCA8IDApKSA/Ci0gICAgICAgICAgICAtMSA6IG5oLT5kYXRhW2luZGV4XTsKLX0KLQotLyoqCi0gKiBDb252ZXJzaW9uIGZ1bmN0aW9ucwotICogPT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGVyZSBhcmUgdHdvIG1haW4gZGlyZWN0aW9ucyBvZiBjb252ZXJzaW9uOgotICogLSBgaW5UYXJnZXRUeXBlKC4uLilgOiBDcmVhdGUgYSB3cmFwcGVyIHdob3NlIGxpZmV0aW1lIGRlcGVuZHMgb24gdGhlCi0gKiAgIGlucHV0LiBUaGUgd3JhcHBlciBoYXMgdHlwZSBgVGFyZ2V0VHlwZWAuCi0gKiAtIGB0b1RhcmdldFR5cGUoLi4uKWA6IENyZWF0ZSBhIHN0YW5kYWxvbmUgb2JqZWN0IG9mIHR5cGUgYFRhcmdldFR5cGVgIHRoYXQKLSAqICAgY29ycmVzcG9uZHMgdG8gdGhlIGlucHV0LiBUaGUgbGlmZXRpbWUgb2YgdGhlIG91dHB1dCBkb2VzIG5vdCBkZXBlbmQgb24gdGhlCi0gKiAgIGxpZmV0aW1lIG9mIHRoZSBpbnB1dC4KLSAqIC0gYHdyYXBJbihUYXJnZXRUeXBlKiwgLi4uKWA6IFNhbWUgYXMgYGluVGFyZ2V0VHlwZSgpYCwgYnV0IGZvciBgVGFyZ2V0VHlwZWAKLSAqICAgdGhhdCBjYW5ub3QgYmUgY29waWVkIGFuZC9vciBtb3ZlZCBlZmZpY2llbnRseSwgb3Igd2hlbiB0aGVyZSBhcmUgbXVsdGlwbGUKLSAqICAgb3V0cHV0IGFyZ3VtZW50cy4KLSAqIC0gYGNvbnZlcnRUbyhUYXJnZXRUeXBlKiwgLi4uKWA6IFNhbWUgYXMgYHRvVGFyZ2V0VHlwZSgpYCwgYnV0IGZvcgotICogICBgVGFyZ2V0VHlwZWAgdGhhdCBjYW5ub3QgYmUgY29waWVkIGFuZC9vciBtb3ZlZCBlZmZpY2llbnRseSwgb3Igd2hlbiB0aGVyZQotICogICBhcmUgbXVsdGlwbGUgb3V0cHV0IGFyZ3VtZW50cy4KLSAqCi0gKiBgd3JhcEluKClgIGFuZCBgY29udmVydFRvKClgIGZ1bmN0aW9ucyB3aWxsIHRha2Ugb3V0cHV0IGFyZ3VtZW50cyBiZWZvcmUKLSAqIGlucHV0IGFyZ3VtZW50cy4gU29tZSBvZiB0aGVzZSBmdW5jdGlvbnMgbWlnaHQgcmV0dXJuIGEgdmFsdWUgdG8gaW5kaWNhdGUKLSAqIHN1Y2Nlc3Mgb3IgZXJyb3IuCi0gKgotICogSW4gY29udmVydGluZyBvciB3cmFwcGluZyBzb21ldGhpbmcgYXMgYSBUcmVibGUgdHlwZSB0aGF0IGNvbnRhaW5zIGEKLSAqIGBoaWRsX2hhbmRsZWAsIGBuYXRpdmVfaGFuZGxlX3QqYCB3aWxsIG5lZWQgdG8gYmUgY3JlYXRlZCBhbmQgcmV0dXJuZWQgYXMKLSAqIGFuIGFkZGl0aW9uYWwgb3V0cHV0IGFyZ3VtZW50LCBoZW5jZSBvbmx5IGB3cmFwSW4oKWAgb3IgYGNvbnZlcnRUbygpYCB3b3VsZAotICogYmUgYXZhaWxhYmxlLiBUaGUgY2FsbGVyIG11c3QgY2FsbCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAgdG8gZGVhbGxvY2F0ZSB0aGUKLSAqIHJldHVybmVkIG5hdGl2ZSBoYW5kbGUgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkLgotICoKLSAqIEZvciB0eXBlcyB0aGF0IGNvbnRhaW4gZmlsZSBkZXNjcmlwdG9ycywgYGluVGFyZ2V0VHlwZSgpYCBhbmQgYHdyYXBBcygpYCBkbwotICogbm90IHBlcmZvcm0gZHVwbGljYXRpb24gb2YgZmlsZSBkZXNjcmlwdG9ycywgd2hpbGUgYHRvVGFyZ2V0VHlwZSgpYCBhbmQKLSAqIGBjb252ZXJ0VG8oKWAgZG8uCi0gKi8KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgUmV0dXJuPHZvaWQ+YCB0byBgYmluZGVyOjpTdGF0dXNgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZXR1cm48dm9pZD5gLgotICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgYmluZGVyOjpTdGF0dXNgLgotICovCi0vLyBjb252ZXJ0OiBSZXR1cm48dm9pZD4gLT4gOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cwotOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyB0b0JpbmRlclN0YXR1cygKLSAgICAgICAgUmV0dXJuPHZvaWQ+IGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM6OmZyb21FeGNlcHRpb25Db2RlKAotICAgICAgICAgICAgdC5pc09rKCkgPyBPSyA6IFVOS05PV05fRVJST1IsCi0gICAgICAgICAgICB0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYFJldHVybjx2b2lkPmAgdG8gYHN0YXR1c190YC4gVGhpcyBpcyBmb3IgbGVnYWN5IGJpbmRlciBjYWxscy4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmV0dXJuPHZvaWQ+YC4KLSAqIFxyZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgYHN0YXR1c190YC4KLSAqLwotLy8gY29udmVydDogUmV0dXJuPHZvaWQ+IC0+IHN0YXR1c190Ci1zdGF0dXNfdCB0b1N0YXR1c1QoUmV0dXJuPHZvaWQ+IGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIHQuaXNPaygpID8gT0sgOiBVTktOT1dOX0VSUk9SOwotfQotCi0vKioKLSAqIFxicmllZiBXcmFwIGBuYXRpdmVfaGFuZGxlX3QqYCBpbiBgaGlkbF9oYW5kbGVgLgotICoKLSAqIFxwYXJhbVtpbl0gbmggVGhlIHNvdXJjZSBgbmF0aXZlX2hhbmRsZV90KmAuCi0gKiBccmV0dXJuIFRoZSBgaGlkbF9oYW5kbGVgIHRoYXQgcG9pbnRzIHRvIFxwIG5oLgotICovCi0vLyB3cmFwOiBuYXRpdmVfaGFuZGxlX3QqIC0+IGhpZGxfaGFuZGxlCi1oaWRsX2hhbmRsZSBpbkhpZGxIYW5kbGUobmF0aXZlX2hhbmRsZV90IGNvbnN0KiBuaCkgewotICAgIHJldHVybiBoaWRsX2hhbmRsZShuaCk7Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYGludDMyX3RgIHRvIGBEYXRhc3BhY2VgLgotICoKLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBpbnQzMl90YC4KLSAqIFxyZXN1bHQgVGhlIGNvcnJlc3BvbmRpbmcgYERhdGFzcGFjZWAuCi0gKi8KLS8vIGNvbnZlcnQ6IGludDMyX3QgLT4gRGF0YXNwYWNlCi1EYXRhc3BhY2UgdG9IYXJkd2FyZURhdGFzcGFjZShpbnQzMl90IGwpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RGF0YXNwYWNlPihsKTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgRGF0YXNwYWNlYCB0byBgaW50MzJfdGAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYERhdGFzcGFjZWAuCi0gKiBccmVzdWx0IFRoZSBjb3JyZXNwb25kaW5nIGBpbnQzMl90YC4KLSAqLwotLy8gY29udmVydDogRGF0YXNwYWNlIC0+IGludDMyX3QKLWludDMyX3QgdG9SYXdEYXRhc3BhY2UoRGF0YXNwYWNlIGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KHQpOwotfQotCi0vKioKLSAqIFxicmllZiBXcmFwIGFuIG9wYXF1ZSBidWZmZXIgaW5zaWRlIGEgYGhpZGxfdmVjPHVpbnQ4X3Q+YC4KLSAqCi0gKiBccGFyYW1baW5dIGwgVGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3BhcXVlIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbl0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyLgotICogXHJldHVybiBBIGBoaWRsX3ZlYzx1aW50OF90PmAgdGhhdCBwb2ludHMgdG8gdGhlIGJ1ZmZlci4KLSAqLwotLy8gd3JhcDogdm9pZCosIHNpemVfdCAtPiBoaWRsX3ZlYzx1aW50OF90PgotaGlkbF92ZWM8dWludDhfdD4gaW5IaWRsQnl0ZXModm9pZCBjb25zdCogbCwgc2l6ZV90IHNpemUpIHsKLSAgICBoaWRsX3ZlYzx1aW50OF90PiB0OwotICAgIHQuc2V0VG9FeHRlcm5hbChzdGF0aWNfY2FzdDx1aW50OF90Kj4oY29uc3RfY2FzdDx2b2lkKj4obCkpLCBzaXplLCBmYWxzZSk7Ci0gICAgcmV0dXJuIHQ7Ci19Ci0KLS8qKgotICogXGJyaWVmIENyZWF0ZSBhIGBoaWRsX3ZlYzx1aW50OF90PmAgdGhhdCBpcyBhIGNvcHkgb2YgYW4gb3BhcXVlIGJ1ZmZlci4KLSAqCi0gKiBccGFyYW1baW5dIGwgVGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3BhcXVlIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbl0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyLgotICogXHJldHVybiBBIGBoaWRsX3ZlYzx1aW50OF90PmAgdGhhdCBpcyBhIGNvcHkgb2YgdGhlIGlucHV0IGJ1ZmZlci4KLSAqLwotLy8gY29udmVydDogdm9pZCosIHNpemVfdCAtPiBoaWRsX3ZlYzx1aW50OF90PgotaGlkbF92ZWM8dWludDhfdD4gdG9IaWRsQnl0ZXModm9pZCBjb25zdCogbCwgc2l6ZV90IHNpemUpIHsKLSAgICBoaWRsX3ZlYzx1aW50OF90PiB0OwotICAgIHQucmVzaXplKHNpemUpOwotICAgIHVpbnQ4X3QgY29uc3QqIHNyYyA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgY29uc3QqPihsKTsKLSAgICBzdGQ6OmNvcHkoc3JjLCBzcmMgKyBzaXplLCB0LmRhdGEoKSk7Ci0gICAgcmV0dXJuIHQ7Ci19Ci0KLS8qKgotICogXGJyaWVmIFdyYXAgYEdyYXBoaWNCdWZmZXJgIGluIGBBbndCdWZmZXJgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIHdyYXBwZXIgb2YgdHlwZSBgQW53QnVmZmVyYC4KLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBHcmFwaGljQnVmZmVyYC4KLSAqLwotLy8gd3JhcDogR3JhcGhpY0J1ZmZlciAtPiBBbndCdWZmZXIKLXZvaWQgd3JhcEFzKEFud0J1ZmZlciogdCwgR3JhcGhpY0J1ZmZlciBjb25zdCYgbCkgewotICAgIHQtPmF0dHIud2lkdGggPSBsLmdldFdpZHRoKCk7Ci0gICAgdC0+YXR0ci5oZWlnaHQgPSBsLmdldEhlaWdodCgpOwotICAgIHQtPmF0dHIuc3RyaWRlID0gbC5nZXRTdHJpZGUoKTsKLSAgICB0LT5hdHRyLmZvcm1hdCA9IHN0YXRpY19jYXN0PFBpeGVsRm9ybWF0PihsLmdldFBpeGVsRm9ybWF0KCkpOwotICAgIHQtPmF0dHIubGF5ZXJDb3VudCA9IGwuZ2V0TGF5ZXJDb3VudCgpOwotICAgIHQtPmF0dHIudXNhZ2UgPSBsLmdldFVzYWdlKCk7Ci0gICAgdC0+YXR0ci5pZCA9IGwuZ2V0SWQoKTsKLSAgICB0LT5hdHRyLmdlbmVyYXRpb25OdW1iZXIgPSBsLmdldEdlbmVyYXRpb25OdW1iZXIoKTsKLSAgICB0LT5uYXRpdmVIYW5kbGUgPSBoaWRsX2hhbmRsZShsLmhhbmRsZSk7Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYEFud0J1ZmZlcmAgdG8gYEdyYXBoaWNCdWZmZXJgLgotICoKLSAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGBHcmFwaGljQnVmZmVyYC4KLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBBbndCdWZmZXJgLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgYWxsIGZpbGUgZGVzY3JpcHRvcnMgaW4gXHAgdC4KLSAqLwotLy8gY29udmVydDogQW53QnVmZmVyIC0+IEdyYXBoaWNCdWZmZXIKLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy91aS9HcmFwaGljQnVmZmVyLmNwcDogR3JhcGhpY0J1ZmZlcjo6ZmxhdHRlbgotYm9vbCBjb252ZXJ0VG8oR3JhcGhpY0J1ZmZlciogbCwgQW53QnVmZmVyIGNvbnN0JiB0KSB7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSB0Lm5hdGl2ZUhhbmRsZSA9PSBudWxscHRyID8KLSAgICAgICAgICAgIG51bGxwdHIgOiBuYXRpdmVfaGFuZGxlX2Nsb25lKHQubmF0aXZlSGFuZGxlKTsKLQotICAgIHNpemVfdCBjb25zdCBudW1JbnRzID0gMTIgKyAoaGFuZGxlID8gaGFuZGxlLT5udW1JbnRzIDogMCk7Ci0gICAgaW50MzJfdCogaW50cyA9IG5ldyBpbnQzMl90W251bUludHNdOwotCi0gICAgc2l6ZV90IG51bUZkcyA9IHN0YXRpY19jYXN0PHNpemVfdD4oaGFuZGxlID8gaGFuZGxlLT5udW1GZHMgOiAwKTsKLSAgICBpbnQqIGZkcyA9IG5ldyBpbnRbbnVtRmRzXTsKLQotICAgIGludHNbMF0gPSAnR0JGUic7Ci0gICAgaW50c1sxXSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci53aWR0aCk7Ci0gICAgaW50c1syXSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci5oZWlnaHQpOwotICAgIGludHNbM10gPSBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmF0dHIuc3RyaWRlKTsKLSAgICBpbnRzWzRdID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5hdHRyLmZvcm1hdCk7Ci0gICAgaW50c1s1XSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci5sYXllckNvdW50KTsKLSAgICBpbnRzWzZdID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5hdHRyLnVzYWdlKTsKLSAgICBpbnRzWzddID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5hdHRyLmlkID4+IDMyKTsKLSAgICBpbnRzWzhdID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4odC5hdHRyLmlkICYgMHhGRkZGRkZGRik7Ci0gICAgaW50c1s5XSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KHQuYXR0ci5nZW5lcmF0aW9uTnVtYmVyKTsKLSAgICBpbnRzWzEwXSA9IDA7Ci0gICAgaW50c1sxMV0gPSAwOwotICAgIGlmIChoYW5kbGUpIHsKLSAgICAgICAgaW50c1sxMF0gPSBzdGF0aWNfY2FzdDxpbnQzMl90PihoYW5kbGUtPm51bUZkcyk7Ci0gICAgICAgIGludHNbMTFdID0gc3RhdGljX2Nhc3Q8aW50MzJfdD4oaGFuZGxlLT5udW1JbnRzKTsKLSAgICAgICAgaW50KiBpbnRzU3RhcnQgPSBoYW5kbGUtPmRhdGEgKyBoYW5kbGUtPm51bUZkczsKLSAgICAgICAgc3RkOjpjb3B5KGhhbmRsZS0+ZGF0YSwgaW50c1N0YXJ0LCBmZHMpOwotICAgICAgICBzdGQ6OmNvcHkoaW50c1N0YXJ0LCBpbnRzU3RhcnQgKyBoYW5kbGUtPm51bUludHMsICZpbnRzWzEyXSk7Ci0gICAgfQotCi0gICAgdm9pZCBjb25zdCogY29uc3RCdWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkIGNvbnN0Kj4oaW50cyk7Ci0gICAgc2l6ZV90IHNpemUgPSBudW1JbnRzICogc2l6ZW9mKGludDMyX3QpOwotICAgIGludCBjb25zdCogY29uc3RGZHMgPSBzdGF0aWNfY2FzdDxpbnQgY29uc3QqPihmZHMpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IGwtPnVuZmxhdHRlbihjb25zdEJ1ZmZlciwgc2l6ZSwgY29uc3RGZHMsIG51bUZkcyk7Ci0KLSAgICBkZWxldGUgW10gZmRzOwotICAgIGRlbGV0ZSBbXSBpbnRzOwotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7Ci0gICAgcmV0dXJuIHN0YXR1cyA9PSBOT19FUlJPUjsKLX0KLQotLyoqCi0gKiBDb252ZXJzaW9uIGZ1bmN0aW9ucyBmb3IgdHlwZXMgb3V0c2lkZSBtZWRpYQotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBTb21lIG9iamVjdHMgaW4gbGlidWkgYW5kIGxpYmd1aSB0aGF0IHdlcmUgbWFkZSB0byBnbyB0aHJvdWdoIGJpbmRlciBjYWxscyBkbwotICogbm90IGV4cG9zZSB3YXlzIHRvIHJlYWQgb3Igd3JpdGUgdGhlaXIgZmllbGRzIHRvIHRoZSBwdWJsaWMuIFRvIHBhc3MgYW4KLSAqIG9iamVjdCBvZiB0aGlzIGtpbmQgdGhyb3VnaCB0aGUgSElETCBib3VuZGFyeSwgdHJhbnNsYXRpb24gZnVuY3Rpb25zIG5lZWQgdG8KLSAqIHdvcmsgYXJvdW5kIHRoZSBhY2Nlc3MgcmVzdHJpY3Rpb24gYnkgdXNpbmcgdGhlIHB1YmxpY2x5IGF2YWlsYWJsZQotICogYGZsYXR0ZW4oKWAgYW5kIGB1bmZsYXR0ZW4oKWAgZnVuY3Rpb25zLgotICoKLSAqIEFsbCBgZmxhdHRlbigpYCBhbmQgYHVuZmxhdHRlbigpYCBvdmVybG9hZHMgZm9sbG93IHRoZSBzYW1lIGNvbnZlbnRpb24gYXMKLSAqIGZvbGxvd3M6Ci0gKgotICogICAgIHN0YXR1c190IGZsYXR0ZW4oT2JqZWN0VHlwZSBjb25zdCYgb2JqZWN0LAotICogICAgICAgICAgICAgICAgICAgICAgW090aGVyVHlwZSBjb25zdCYgb3RoZXIsIC4uLl0KLSAqICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwKLSAqICAgICAgICAgICAgICAgICAgICAgIGludComIGZkcywgc2l6ZV90JiBudW1GZHMpCi0gKgotICogICAgIHN0YXR1c190IHVuZmxhdHRlbihPYmplY3RUeXBlKiBvYmplY3QsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIFtPdGhlclR5cGUqIG90aGVyLCAuLi4sXQotICogICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIGludComIGZkcywgc2l6ZV90JiBudW1GZHMpCi0gKgotICogVGhlIG51bWJlciBvZiBgb3RoZXJgIHBhcmFtZXRlcnMgdmFyaWVzIGRlcGVuZGluZyBvbiB0aGUgYE9iamVjdFR5cGVgLiBGb3IKLSAqIGV4YW1wbGUsIGluIHRoZSBwcm9jZXNzIG9mIHVuZmxhdHRlbmluZyBhbiBvYmplY3QgdGhhdCBjb250YWlucwotICogYGhpZGxfaGFuZGxlYCwgYG90aGVyYCBpcyBuZWVkZWQgdG8gaG9sZCBgbmF0aXZlX2hhbmRsZV90YCBvYmplY3RzIHRoYXQgd2lsbAotICogYmUgY3JlYXRlZC4KLSAqCi0gKiBUaGUgbGFzdCBmb3VyIHBhcmFtZXRlcnMgYWx3YXlzIHdvcmsgdGhlIHNhbWUgd2F5IGluIGFsbCBvdmVybG9hZHMgb2YKLSAqIGBmbGF0dGVuKClgIGFuZCBgdW5mbGF0dGVuKClgOgotICogLSBGb3IgYGZsYXR0ZW4oKWAsIGBidWZmZXJgIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBub24tZmQgYnVmZmVyIHRvIGJlIGZpbGxlZCwKLSAqICAgYHNpemVgIGlzIHRoZSBzaXplIChpbiBieXRlcykgb2YgdGhlIG5vbi1mZCBidWZmZXIgcG9pbnRlZCB0byBieSBgYnVmZmVyYCwKLSAqICAgYGZkc2AgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGZkIGJ1ZmZlciB0byBiZSBmaWxsZWQsIGFuZCBgbnVtRmRzYCBpcyB0aGUKLSAqICAgc2l6ZSAoaW4gaW50cykgb2YgdGhlIGZkIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGBmZHNgLgotICogLSBGb3IgYHVuZmxhdHRlbigpYCwgYGJ1ZmZlcmAgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIG5vbi1mZCBidWZmZXIgdG8gYmUgcmVhZAotICogICBmcm9tLCBgc2l6ZWAgaXMgdGhlIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciBwb2ludGVkIHRvIGJ5Ci0gKiAgIGBidWZmZXJgLCBgZmRzYCBpcyB0aGUgcG9pbnRlciB0byB0aGUgZmQgYnVmZmVyIHRvIGJlIHJlYWQgZnJvbSwgYW5kCi0gKiAgIGBudW1GZHNgIGlzIHRoZSBzaXplIChpbiBpbnRzKSBvZiB0aGUgZmQgYnVmZmVyIHBvaW50ZWQgdG8gYnkgYGZkc2AuCi0gKiAtIEFmdGVyIGEgc3VjY2Vzc2Z1bCBjYWxsIHRvIGBmbGF0dGVuKClgIG9yIGB1bmZsYXR0ZW4oKWAsIGBidWZmZXJgIGFuZCBgZmRzYAotICogICB3aWxsIGJlIGFkdmFuY2VkLCB3aGlsZSBgc2l6ZWAgYW5kIGBudW1GZHNgIHdpbGwgYmUgZGVjcmVhc2VkIHRvIHJlZmxlY3QKLSAqICAgaG93IG11Y2ggc3RvcmFnZS9kYXRhIG9mIHRoZSB0d28gYnVmZmVycyAoZmQgYW5kIG5vbi1mZCkgaGF2ZSBiZWVuIHVzZWQuCi0gKiAtIEFmdGVyIGFuIHVuc3VjY2Vzc2Z1bCBjYWxsLCB0aGUgdmFsdWVzIG9mIGBidWZmZXJgLCBgc2l6ZWAsIGBmZHNgIGFuZAotICogICBgbnVtRmRzYCBhcmUgaW52YWxpZC4KLSAqCi0gKiBUaGUgcmV0dXJuIHZhbHVlIG9mIGEgc3VjY2Vzc2Z1bCBgZmxhdHRlbigpYCBvciBgdW5mbGF0dGVuKClgIGNhbGwgd2lsbCBiZQotICogYE9LYCAoYWxzbyBhbGlhc2VkIGFzIGBOT19FUlJPUmApLiBBbnkgb3RoZXIgdmFsdWVzIGluZGljYXRlIGEgZmFpbHVyZS4KLSAqCi0gKiBGb3IgZWFjaCBvYmplY3QgdHlwZSB0aGF0IHN1cHBvcnRzIGZsYXR0ZW5pbmcsIHRoZXJlIHdpbGwgYmUgdHdvIGFjY29tcGFueWluZwotICogZnVuY3Rpb25zOiBgZ2V0RmxhdHRlbmVkU2l6ZSgpYCBhbmQgYGdldEZkQ291bnQoKWAuIGBnZXRGbGF0dGVuZWRTaXplKClgIHdpbGwKLSAqIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciB0aGF0IHRoZSBvYmplY3Qgd2lsbCBuZWVkIGZvcgotICogZmxhdHRlbmluZy4gYGdldEZkQ291bnQoKWAgd2lsbCByZXR1cm4gdGhlIHNpemUgb2YgdGhlIGZkIGJ1ZmZlciB0aGF0IHRoZQotICogb2JqZWN0IHdpbGwgbmVlZCBmb3IgZmxhdHRlbmluZy4KLSAqCi0gKiBUaGUgc2V0IG9mIHRoZXNlIGZvdXIgZnVuY3Rpb25zLCBgZ2V0RmxhdHRlbmVkU2l6ZSgpYCwgYGdldEZkQ291bnQoKWAsCi0gKiBgZmxhdHRlbigpYCBhbmQgYHVuZmxhdHRlbigpYCwgYXJlIHNpbWlsYXIgdG8gZnVuY3Rpb25zIG9mIHRoZSBzYW1lIG5hbWUgaW4KLSAqIHRoZSBhYnN0cmFjdCBjbGFzcyBgRmxhdHRlbmFibGVgLiBUaGUgb25seSBkaWZmZXJlbmNlIGlzIHRoYXQgZnVuY3Rpb25zIGluCi0gKiB0aGlzIGZpbGUgYXJlIG5vdCBtZW1iZXIgZnVuY3Rpb25zIG9mIHRoZSBvYmplY3QgdHlwZS4gRm9yIGV4YW1wbGUsIHdlIHdyaXRlCi0gKgotICogICAgIGZsYXR0ZW4oeCwgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykKLSAqCi0gKiBpbnN0ZWFkIG9mCi0gKgotICogICAgIHguZmxhdHRlbihidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKQotICoKLSAqIGJlY2F1c2Ugd2UgY2Fubm90IG1vZGlmeSB0aGUgdHlwZSBvZiBgeGAuCi0gKgotICogVGhlcmUgaXMgb25lIGV4Y2VwdGlvbiB0byB0aGUgbmFtaW5nIGNvbnZlbnRpb246IGBoaWRsX2hhbmRsZWAgdGhhdAotICogcmVwcmVzZW50cyBhIGZlbmNlLiBUaGUgZm91ciBmdW5jdGlvbnMgZm9yIHRoaXMgIkZlbmNlIiB0eXBlIGhhdmUgdGhlIHdvcmQKLSAqICJGZW5jZSIgYXR0Y2hlZCB0byB0aGVpciBuYW1lcyBiZWNhdXNlIHRoZSBvYmplY3QgdHlwZSwgd2hpY2ggaXMKLSAqIGBoaWRsX2hhbmRsZWAsIGRvZXMgbm90IGNhcnJ5IHRoZSBzcGVjaWFsIG1lYW5pbmcgdGhhdCB0aGUgb2JqZWN0IGl0c2VsZiBjYW4KLSAqIG9ubHkgY29udGFpbiB6ZXJvIG9yIG9uZSBmaWxlIGRlc2NyaXB0b3IuCi0gKi8KLQotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL3VpL0ZlbmNlLmNwcAotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbiBhIGZlbmNlLgotICoKLSAqIFxwYXJhbVtpbl0gZmVuY2UgVGhlIGlucHV0IGZlbmNlIG9mIHR5cGUgYGhpZGxfaGFuZGxlYC4KLSAqIFxyZXR1cm4gVGhlIHJlcXVpcmVkIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICoKLSAqIFRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiBhbHdheXMgcmV0dXJucyA0LCB3aGljaCBpcyB0aGUgbnVtYmVyIG9mCi0gKiBieXRlcyByZXF1aXJlZCB0byBzdG9yZSB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIHRoZSBmZAotICogcGFydCBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKi8KLXNpemVfdCBnZXRGZW5jZUZsYXR0ZW5lZFNpemUoaGlkbF9oYW5kbGUgY29uc3QmIC8qIGZlbmNlICovKSB7Ci0gICAgcmV0dXJuIDQ7Ci19OwotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBhIGZlbmNlLgotICoKLSAqIFxwYXJhbVtpbl0gZmVuY2UgVGhlIGlucHV0IGZlbmNlIG9mIHR5cGUgYGhpZGxfaGFuZGxlYC4KLSAqIFxyZXR1cm4gYDBgIGlmIFxwIGZlbmNlIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IsIG9yIGAxYAotICogb3RoZXJ3aXNlLgotICovCi1zaXplX3QgZ2V0RmVuY2VGZENvdW50KGhpZGxfaGFuZGxlIGNvbnN0JiBmZW5jZSkgewotICAgIHJldHVybiBuYXRpdmVfaGFuZGxlX3JlYWRfZmQoZmVuY2UpID09IC0xID8gMCA6IDE7Ci19Ci0KLS8qKgotICogXGJyaWVmIFVuZmxhdHRlbiBgRmVuY2VgIHRvIGBoaWRsX2hhbmRsZWAuCi0gKgotICogXHBhcmFtW291dF0gZmVuY2UgVGhlIGRlc3RpbmF0aW9uIGBoaWRsX2hhbmRsZWAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBuYXRpdmUgaGFuZGxlLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCwgXHAgbmggd2lsbCBwb2ludCB0byBhIG5ld2x5IGNyZWF0ZWQKLSAqIG5hdGl2ZSBoYW5kbGUsIHdoaWNoIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAKLSAqIGFmdGVyd2FyZHMuCi0gKi8KLXN0YXR1c190IHVuZmxhdHRlbkZlbmNlKGhpZGxfaGFuZGxlKiBmZW5jZSwgbmF0aXZlX2hhbmRsZV90KiogbmgsCi0gICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcykgewotICAgIGlmIChzaXplIDwgNCkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIHVpbnQzMl90IG51bUZkc0luSGFuZGxlOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCBudW1GZHNJbkhhbmRsZSk7Ci0KLSAgICBpZiAobnVtRmRzSW5IYW5kbGUgPiAxKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgaWYgKG51bUZkcyA8IG51bUZkc0luSGFuZGxlKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgaWYgKG51bUZkc0luSGFuZGxlKSB7Ci0gICAgICAgICpuaCA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlX2Zyb21fZmQoKmZkcyk7Ci0gICAgICAgIGlmICgqbmggPT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgfQotICAgICAgICAqZmVuY2UgPSAqbmg7Ci0gICAgICAgICsrZmRzOwotICAgICAgICAtLW51bUZkczsKLSAgICB9IGVsc2UgewotICAgICAgICAqbmggPSBudWxscHRyOwotICAgICAgICAqZmVuY2UgPSBoaWRsX2hhbmRsZSgpOwotICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoqCi0gKiBcYnJpZWYgRmxhdHRlbiBgaGlkbF9oYW5kbGVgIGFzIGBGZW5jZWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYGhpZGxfaGFuZGxlYC4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqLwotc3RhdHVzX3QgZmxhdHRlbkZlbmNlKGhpZGxfaGFuZGxlIGNvbnN0JiBmZW5jZSwKLSAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKSB7Ci0gICAgaWYgKHNpemUgPCBnZXRGZW5jZUZsYXR0ZW5lZFNpemUoZmVuY2UpIHx8Ci0gICAgICAgICAgICBudW1GZHMgPCBnZXRGZW5jZUZkQ291bnQoZmVuY2UpKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotICAgIC8vIENhc3QgdG8gdWludDMyX3Qgc2luY2UgdGhlIHNpemUgb2YgYSBzaXplX3QgY2FuIHZhcnkgYmV0d2VlbiAzMi0gYW5kCi0gICAgLy8gNjQtYml0IHByb2Nlc3NlcwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihnZXRGZW5jZUZkQ291bnQoZmVuY2UpKSk7Ci0gICAgaW50IGZkID0gbmF0aXZlX2hhbmRsZV9yZWFkX2ZkKGZlbmNlKTsKLSAgICBpZiAoZmQgIT0gLTEpIHsKLSAgICAgICAgKmZkcyA9IGZkOwotICAgICAgICArK2ZkczsKLSAgICAgICAgLS1udW1GZHM7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoqCi0gKiBcYnJpZWYgV3JhcCBgRmVuY2VgIGluIGBoaWRsX2hhbmRsZWAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlIGBoaWRsX2hhbmRsZWAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgbmF0aXZlIGhhbmRsZSBwb2ludGVkIHRvIGJ5IFxwIHQuCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgRmVuY2VgLgotICoKLSAqIE9uIHN1Y2Nlc3MsIFxwIG5oIHdpbGwgaG9sZCBhIG5ld2x5IGNyZWF0ZWQgbmF0aXZlIGhhbmRsZSwgd2hpY2ggbXVzdCBiZQotICogZGVsZXRlZCBtYW51YWxseSB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYCBhZnRlcndhcmRzLgotICovCi0vLyB3cmFwOiBGZW5jZSAtPiBoaWRsX2hhbmRsZQotYm9vbCB3cmFwQXMoaGlkbF9oYW5kbGUqIHQsIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLCBGZW5jZSBjb25zdCYgbCkgewotICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGwuZ2V0RmxhdHRlbmVkU2l6ZSgpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJhc2VCdWZmZXIoCi0gICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtiYXNlU2l6ZV0pOwotICAgIGlmICghYmFzZUJ1ZmZlcikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc2l6ZV90IGNvbnN0IGJhc2VOdW1GZHMgPSBsLmdldEZkQ291bnQoKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50W10+IGJhc2VGZHMoCi0gICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgaW50W2Jhc2VOdW1GZHNdKTsKLSAgICBpZiAoIWJhc2VGZHMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplX3Qgc2l6ZSA9IGJhc2VTaXplOwotICAgIGludCogZmRzID0gc3RhdGljX2Nhc3Q8aW50Kj4oYmFzZUZkcy5nZXQoKSk7Ci0gICAgc2l6ZV90IG51bUZkcyA9IGJhc2VOdW1GZHM7Ci0gICAgaWYgKGwuZmxhdHRlbihidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBjb25zdCogY29uc3RCdWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkIGNvbnN0Kj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZSA9IGJhc2VTaXplOwotICAgIGludCBjb25zdCogY29uc3RGZHMgPSBzdGF0aWNfY2FzdDxpbnQgY29uc3QqPihiYXNlRmRzLmdldCgpKTsKLSAgICBudW1GZHMgPSBiYXNlTnVtRmRzOwotICAgIGlmICh1bmZsYXR0ZW5GZW5jZSh0LCBuaCwgY29uc3RCdWZmZXIsIHNpemUsIGNvbnN0RmRzLCBudW1GZHMpCi0gICAgICAgICAgICAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYGhpZGxfaGFuZGxlYCB0byBgRmVuY2VgLgotICoKLSAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGBGZW5jZWAuIGBsYCBtdXN0IG5vdCBoYXZlIGJlZW4gdXNlZAotICogKGBsLT5pc1ZhbGlkKClgIG11c3QgcmV0dXJuIGBmYWxzZWApIGJlZm9yZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZC4KLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBoaWRsX2hhbmRsZWAuCi0gKgotICogSWYgXHAgdCBjb250YWlucyBhIHZhbGlkIGZpbGUgZGVzY3JpcHRvciwgaXQgd2lsbCBiZSBkdXBsaWNhdGVkLgotICovCi0vLyBjb252ZXJ0OiBoaWRsX2hhbmRsZSAtPiBGZW5jZQotYm9vbCBjb252ZXJ0VG8oRmVuY2UqIGwsIGhpZGxfaGFuZGxlIGNvbnN0JiB0KSB7Ci0gICAgaW50IGZkID0gbmF0aXZlX2hhbmRsZV9yZWFkX2ZkKHQpOwotICAgIGlmIChmZCAhPSAtMSkgewotICAgICAgICBmZCA9IGR1cChmZCk7Ci0gICAgICAgIGlmIChmZCA9PSAtMSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIG5hdGl2ZV9oYW5kbGVfdCogbmggPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZV9mcm9tX2ZkKGZkKTsKLSAgICBpZiAobmggPT0gbnVsbHB0cikgewotICAgICAgICBpZiAoZmQgIT0gLTEpIHsKLSAgICAgICAgICAgIGNsb3NlKGZkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc2l6ZV90IGNvbnN0IGJhc2VTaXplID0gZ2V0RmVuY2VGbGF0dGVuZWRTaXplKHQpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjx1aW50OF90W10+IGJhc2VCdWZmZXIoCi0gICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgdWludDhfdFtiYXNlU2l6ZV0pOwotICAgIGlmICghYmFzZUJ1ZmZlcikgewotICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzaXplX3QgY29uc3QgYmFzZU51bUZkcyA9IGdldEZlbmNlRmRDb3VudCh0KTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50W10+IGJhc2VGZHMoCi0gICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgaW50W2Jhc2VOdW1GZHNdKTsKLSAgICBpZiAoIWJhc2VGZHMpIHsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCogYnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemVfdCBzaXplID0gYmFzZVNpemU7Ci0gICAgaW50KiBmZHMgPSBzdGF0aWNfY2FzdDxpbnQqPihiYXNlRmRzLmdldCgpKTsKLSAgICBzaXplX3QgbnVtRmRzID0gYmFzZU51bUZkczsKLSAgICBpZiAoZmxhdHRlbkZlbmNlKGhpZGxfaGFuZGxlKG5oKSwgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLQotICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQgY29uc3QqIGNvbnN0RmRzID0gc3RhdGljX2Nhc3Q8aW50IGNvbnN0Kj4oYmFzZUZkcy5nZXQoKSk7Ci0gICAgbnVtRmRzID0gYmFzZU51bUZkczsKLSAgICBpZiAobC0+dW5mbGF0dGVuKGNvbnN0QnVmZmVyLCBzaXplLCBjb25zdEZkcywgbnVtRmRzKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy91aS9GZW5jZVRpbWUuY3BwOiBGZW5jZVRpbWU6OlNuYXBzaG90Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuCi0gKiBgRmVuY2VUaW1lU25hcHNob3RgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZlbmNlVGltZVNuYXBzaG90YC4KLSAqIFxyZXR1cm4gVGhlIHJlcXVpcmVkIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICovCi1zaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZSgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3QgY29uc3QmIHQpIHsKLSAgICBjb25zdGV4cHIgc2l6ZV90IG1pbiA9IHNpemVvZih0LnN0YXRlKTsKLSAgICBzd2l0Y2ggKHQuc3RhdGUpIHsKLSAgICAgICAgY2FzZSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OkVNUFRZOgotICAgICAgICAgICAgcmV0dXJuIG1pbjsKLSAgICAgICAgY2FzZSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OkZFTkNFOgotICAgICAgICAgICAgcmV0dXJuIG1pbiArIGdldEZlbmNlRmxhdHRlbmVkU2l6ZSh0LmZlbmNlKTsKLSAgICAgICAgY2FzZSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OlNJR05BTF9USU1FOgotICAgICAgICAgICAgcmV0dXJuIG1pbiArIHNpemVvZigKLSAgICAgICAgICAgICAgICAgICAgOjphbmRyb2lkOjpGZW5jZVRpbWU6OlNuYXBzaG90OjpzaWduYWxUaW1lKTsKLSAgICB9Ci0gICAgcmV0dXJuIDA7Ci19Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluCi0gKiBgRmVuY2VUaW1lU25hcHNob3RgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZlbmNlVGltZVNuYXBzaG90YC4KLSAqIFxyZXR1cm4gVGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCBzbmFwc2hvdC4KLSAqLwotc2l6ZV90IGdldEZkQ291bnQoCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90IGNvbnN0JiB0KSB7Ci0gICAgcmV0dXJuIHQuc3RhdGUgPT0KLSAgICAgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6RkVOQ0UgPwotICAgICAgICAgICAgZ2V0RmVuY2VGZENvdW50KHQuZmVuY2UpIDogMDsKLX0KLQotLyoqCi0gKiBcYnJpZWYgRmxhdHRlbiBgRmVuY2VUaW1lU25hcHNob3RgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBGZW5jZVRpbWVTbmFwc2hvdGAuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSB0aGUgZmlsZSBkZXNjcmlwdG9yIGluIGB0LmZlbmNlYCBpZiBgdC5zdGF0ZSA9PQotICogRkVOQ0VgLgotICovCi1zdGF0dXNfdCBmbGF0dGVuKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90IGNvbnN0JiB0LAotICAgICAgICB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKLSAgICBpZiAoc2l6ZSA8IGdldEZsYXR0ZW5lZFNpemUodCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHQuc3RhdGUpIHsKLSAgICAgICAgY2FzZSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OkVNUFRZOgotICAgICAgICAgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLAotICAgICAgICAgICAgICAgICAgICA6OmFuZHJvaWQ6OkZlbmNlVGltZTo6U25hcHNob3Q6OlN0YXRlOjpFTVBUWSk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIGNhc2UgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3Q6OlN0YXRlOjpGRU5DRToKLSAgICAgICAgICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgOjphbmRyb2lkOjpGZW5jZVRpbWU6OlNuYXBzaG90OjpTdGF0ZTo6RkVOQ0UpOwotICAgICAgICAgICAgcmV0dXJuIGZsYXR0ZW5GZW5jZSh0LmZlbmNlLCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKTsKLSAgICAgICAgY2FzZSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdDo6U3RhdGU6OlNJR05BTF9USU1FOgotICAgICAgICAgICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLAotICAgICAgICAgICAgICAgICAgICA6OmFuZHJvaWQ6OkZlbmNlVGltZTo6U25hcHNob3Q6OlN0YXRlOjpTSUdOQUxfVElNRSk7Ci0gICAgICAgICAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHQuc2lnbmFsVGltZU5zKTsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKioKLSAqIFxicmllZiBVbmZsYXR0ZW4gYEZlbmNlVGltZVNuYXBzaG90YC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgRmVuY2VUaW1lU25hcHNob3RgLgotICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgbmF0aXZlIGhhbmRsZS4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGBOT19FUlJPUmAgYW5kIHRoZSBjb25zdHJ1Y3RlZCBzbmFwc2hvdCBjb250YWlucyBhCi0gKiBmaWxlIGRlc2NyaXB0b3IsIFxwIG5oIHdpbGwgYmUgY3JlYXRlZCB0byBob2xkIHRoYXQgZmlsZSBkZXNjcmlwdG9yLiBJbiB0aGlzCi0gKiBjYXNlLCBccCBuaCBuZWVkcyB0byBiZSBkZWxldGVkIHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgIGFmdGVyd2FyZHMuCi0gKi8KLXN0YXR1c190IHVuZmxhdHRlbigKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3QqIHQsIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLAotICAgICAgICB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludCBjb25zdComIGZkcywgc2l6ZV90JiBudW1GZHMpIHsKLSAgICBpZiAoc2l6ZSA8IHNpemVvZih0LT5zdGF0ZSkpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICAqbmggPSBudWxscHRyOwotICAgIDo6YW5kcm9pZDo6RmVuY2VUaW1lOjpTbmFwc2hvdDo6U3RhdGUgc3RhdGU7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHN0YXRlKTsKLSAgICBzd2l0Y2ggKHN0YXRlKSB7Ci0gICAgICAgIGNhc2UgOjphbmRyb2lkOjpGZW5jZVRpbWU6OlNuYXBzaG90OjpTdGF0ZTo6RU1QVFk6Ci0gICAgICAgICAgICB0LT5zdGF0ZSA9IEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6RU1QVFk7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIGNhc2UgOjphbmRyb2lkOjpGZW5jZVRpbWU6OlNuYXBzaG90OjpTdGF0ZTo6RkVOQ0U6Ci0gICAgICAgICAgICB0LT5zdGF0ZSA9IEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6RkVOQ0U7Ci0gICAgICAgICAgICByZXR1cm4gdW5mbGF0dGVuRmVuY2UoJnQtPmZlbmNlLCBuaCwgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcyk7Ci0gICAgICAgIGNhc2UgOjphbmRyb2lkOjpGZW5jZVRpbWU6OlNuYXBzaG90OjpTdGF0ZTo6U0lHTkFMX1RJTUU6Ci0gICAgICAgICAgICB0LT5zdGF0ZSA9IEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZlbmNlVGltZVNuYXBzaG90OjpTdGF0ZTo6U0lHTkFMX1RJTUU7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA8IHNpemVvZih0LT5zaWduYWxUaW1lTnMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5zaWduYWxUaW1lTnMpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvRnJhbWVUaW1lc3RhbXBzLmNwcDogRnJhbWVFdmVudHNEZWx0YQotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gYSBsb3dlciBib3VuZCBvbiB0aGUgc2l6ZSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciByZXF1aXJlZCB0bwotICogZmxhdHRlbiBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKiBccmV0dXJuIEEgbG93ZXIgYm91bmQgb24gdGhlIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICovCi1jb25zdGV4cHIgc2l6ZV90IG1pbkZsYXR0ZW5lZFNpemUoCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRzRGVsdGEgY29uc3QmIC8qIHQgKi8pIHsKLSAgICByZXR1cm4gc2l6ZW9mKHVpbnQ2NF90KSArIC8vIG1GcmFtZU51bWJlcgotICAgICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpICsgLy8gbUluZGV4Ci0gICAgICAgICAgICBzaXplb2YodWludDhfdCkgKyAvLyBtQWRkUG9zdENvbXBvc2l0ZUNhbGxlZAotICAgICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpICsgLy8gbUFkZFJldGlyZUNhbGxlZAotICAgICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpICsgLy8gbUFkZFJlbGVhc2VDYWxsZWQKLSAgICAgICAgICAgIHNpemVvZihuc2Vjc190KSArIC8vIG1Qb3N0ZWRUaW1lCi0gICAgICAgICAgICBzaXplb2YobnNlY3NfdCkgKyAvLyBtUmVxdWVzdGVkUHJlc2VudFRpbWUKLSAgICAgICAgICAgIHNpemVvZihuc2Vjc190KSArIC8vIG1MYXRjaFRpbWUKLSAgICAgICAgICAgIHNpemVvZihuc2Vjc190KSArIC8vIG1GaXJzdFJlZnJlc2hTdGFydFRpbWUKLSAgICAgICAgICAgIHNpemVvZihuc2Vjc190KTsgLy8gbUxhc3RSZWZyZXNoU3RhcnRUaW1lCi19Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuCi0gKiBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqLwotc2l6ZV90IGdldEZsYXR0ZW5lZFNpemUoCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRzRGVsdGEgY29uc3QmIHQpIHsKLSAgICByZXR1cm4gbWluRmxhdHRlbmVkU2l6ZSh0KSArCi0gICAgICAgICAgICBnZXRGbGF0dGVuZWRTaXplKHQuZ3B1Q29tcG9zaXRpb25Eb25lRmVuY2UpICsKLSAgICAgICAgICAgIGdldEZsYXR0ZW5lZFNpemUodC5kaXNwbGF5UHJlc2VudEZlbmNlKSArCi0gICAgICAgICAgICBnZXRGbGF0dGVuZWRTaXplKHQuZGlzcGxheVJldGlyZUZlbmNlKSArCi0gICAgICAgICAgICBnZXRGbGF0dGVuZWRTaXplKHQucmVsZWFzZUZlbmNlKTsKLX07Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluCi0gKiBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKiBccmV0dXJuIFRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KLSAqLwotc2l6ZV90IGdldEZkQ291bnQoCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRzRGVsdGEgY29uc3QmIHQpIHsKLSAgICByZXR1cm4gZ2V0RmRDb3VudCh0LmdwdUNvbXBvc2l0aW9uRG9uZUZlbmNlKSArCi0gICAgICAgICAgICBnZXRGZENvdW50KHQuZGlzcGxheVByZXNlbnRGZW5jZSkgKwotICAgICAgICAgICAgZ2V0RmRDb3VudCh0LmRpc3BsYXlSZXRpcmVGZW5jZSkgKwotICAgICAgICAgICAgZ2V0RmRDb3VudCh0LnJlbGVhc2VGZW5jZSk7Ci19OwotCi0vKioKLSAqIFxicmllZiBVbmZsYXR0ZW4gYEZyYW1lRXZlbnRzRGVsdGFgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBGcmFtZUV2ZW50c0RlbHRhYC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSB1bmRlcmx5aW5nIGFycmF5IG9mIG5hdGl2ZSBoYW5kbGVzLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCwgXHAgbmggd2lsbCBoYXZlIGxlbmd0aCA0LCBhbmQgaXQgd2lsbCBiZQotICogcG9wdWxhdGVkIHdpdGggYG51bGxwdHJgIG9yIG5ld2x5IGNyZWF0ZWQgaGFuZGxlcy4gRWFjaCBub24tbnVsbCBzbG90IGluIFxwCi0gKiBuaCB3aWxsIG5lZWQgdG8gYmUgZGVsZXRlZCBtYW51YWxseSB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KLSAqLwotc3RhdHVzX3QgdW5mbGF0dGVuKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRzRGVsdGEqIHQsCi0gICAgICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+KiBuaCwKLSAgICAgICAgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQgY29uc3QqJiBmZHMsIHNpemVfdCYgbnVtRmRzKSB7Ci0gICAgaWYgKHNpemUgPCBtaW5GbGF0dGVuZWRTaXplKCp0KSkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+ZnJhbWVOdW1iZXIpOwotCi0gICAgLy8gVGhlc2Ugd2VyZSB3cml0dGVuIGFzIHVpbnQ4X3QgZm9yIGFsaWdubWVudC4KLSAgICB1aW50OF90IHRlbXAgPSAwOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0ZW1wKTsKLSAgICBzaXplX3QgaW5kZXggPSBzdGF0aWNfY2FzdDxzaXplX3Q+KHRlbXApOwotICAgIGlmIChpbmRleCA+PSA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5OjpNQVhfRlJBTUVfSElTVE9SWSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICB0LT5pbmRleCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihpbmRleCk7Ci0KLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdGVtcCk7Ci0gICAgdC0+YWRkUG9zdENvbXBvc2l0ZUNhbGxlZCA9IHN0YXRpY19jYXN0PGJvb2w+KHRlbXApOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0ZW1wKTsKLSAgICB0LT5hZGRSZXRpcmVDYWxsZWQgPSBzdGF0aWNfY2FzdDxib29sPih0ZW1wKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdGVtcCk7Ci0gICAgdC0+YWRkUmVsZWFzZUNhbGxlZCA9IHN0YXRpY19jYXN0PGJvb2w+KHRlbXApOwotCi0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPnBvc3RlZFRpbWVOcyk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPnJlcXVlc3RlZFByZXNlbnRUaW1lTnMpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT5sYXRjaFRpbWVOcyk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPmZpcnN0UmVmcmVzaFN0YXJ0VGltZU5zKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgdC0+bGFzdFJlZnJlc2hTdGFydFRpbWVOcyk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPmRlcXVldWVSZWFkeVRpbWUpOwotCi0gICAgLy8gRmVuY2VzCi0gICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3QqIHRTbmFwc2hvdFs0XTsKLSAgICB0U25hcHNob3RbMF0gPSAmdC0+Z3B1Q29tcG9zaXRpb25Eb25lRmVuY2U7Ci0gICAgdFNuYXBzaG90WzFdID0gJnQtPmRpc3BsYXlQcmVzZW50RmVuY2U7Ci0gICAgdFNuYXBzaG90WzJdID0gJnQtPmRpc3BsYXlSZXRpcmVGZW5jZTsKLSAgICB0U25hcHNob3RbM10gPSAmdC0+cmVsZWFzZUZlbmNlOwotICAgIG5oLT5yZXNpemUoNCk7Ci0gICAgZm9yIChzaXplX3Qgc25hcHNob3RJbmRleCA9IDA7IHNuYXBzaG90SW5kZXggPCA0OyArK3NuYXBzaG90SW5kZXgpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gdW5mbGF0dGVuKAotICAgICAgICAgICAgICAgIHRTbmFwc2hvdFtzbmFwc2hvdEluZGV4XSwgJigoKm5oKVtzbmFwc2hvdEluZGV4XSksCi0gICAgICAgICAgICAgICAgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcyk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHdoaWxlIChzbmFwc2hvdEluZGV4ID4gMCkgewotICAgICAgICAgICAgICAgIC0tc25hcHNob3RJbmRleDsKLSAgICAgICAgICAgICAgICBpZiAoKCpuaClbc25hcHNob3RJbmRleF0gIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgoKm5oKVtzbmFwc2hvdEluZGV4XSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qKgotICogXGJyaWVmIEZsYXR0ZW4gYEZyYW1lRXZlbnRzRGVsdGFgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBGcmFtZUV2ZW50c0RlbHRhYC4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCi0gKi8KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvRnJhbWVUaW1lc3RhbXAuY3BwOgotLy8gICAgICBGcmFtZUV2ZW50c0RlbHRhOjpmbGF0dGVuCi1zdGF0dXNfdCBmbGF0dGVuKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRzRGVsdGEgY29uc3QmIHQsCi0gICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50KiYgZmRzLCBzaXplX3QgbnVtRmRzKSB7Ci0gICAgLy8gQ2hlY2sgdGhhdCB0LmluZGV4IGlzIHdpdGhpbiBhIHZhbGlkIHJhbmdlLgotICAgIGlmICh0LmluZGV4ID49IHN0YXRpY19jYXN0PHVpbnQzMl90PihGcmFtZUV2ZW50SGlzdG9yeTo6TUFYX0ZSQU1FX0hJU1RPUlkpCi0gICAgICAgICAgICB8fCB0LmluZGV4ID4gc3RkOjpudW1lcmljX2xpbWl0czx1aW50OF90Pjo6bWF4KCkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHQuZnJhbWVOdW1iZXIpOwotCi0gICAgLy8gVGhlc2UgYXJlIHN0YXRpY19jYXN0IHRvIHVpbnQ4X3QgZm9yIGFsaWdubWVudC4KLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHQuaW5kZXgpKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZSgKLSAgICAgICAgICAgIGJ1ZmZlciwgc2l6ZSwgc3RhdGljX2Nhc3Q8dWludDhfdD4odC5hZGRQb3N0Q29tcG9zaXRlQ2FsbGVkKSk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoCi0gICAgICAgICAgICBidWZmZXIsIHNpemUsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHQuYWRkUmV0aXJlQ2FsbGVkKSk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoCi0gICAgICAgICAgICBidWZmZXIsIHNpemUsIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KHQuYWRkUmVsZWFzZUNhbGxlZCkpOwotCi0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LnBvc3RlZFRpbWVOcyk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LnJlcXVlc3RlZFByZXNlbnRUaW1lTnMpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC5sYXRjaFRpbWVOcyk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LmZpcnN0UmVmcmVzaFN0YXJ0VGltZU5zKTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHQubGFzdFJlZnJlc2hTdGFydFRpbWVOcyk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LmRlcXVldWVSZWFkeVRpbWUpOwotCi0gICAgLy8gRmVuY2VzCi0gICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3QgY29uc3QqIHRTbmFwc2hvdFs0XTsKLSAgICB0U25hcHNob3RbMF0gPSAmdC5ncHVDb21wb3NpdGlvbkRvbmVGZW5jZTsKLSAgICB0U25hcHNob3RbMV0gPSAmdC5kaXNwbGF5UHJlc2VudEZlbmNlOwotICAgIHRTbmFwc2hvdFsyXSA9ICZ0LmRpc3BsYXlSZXRpcmVGZW5jZTsKLSAgICB0U25hcHNob3RbM10gPSAmdC5yZWxlYXNlRmVuY2U7Ci0gICAgZm9yIChzaXplX3Qgc25hcHNob3RJbmRleCA9IDA7IHNuYXBzaG90SW5kZXggPCA0OyArK3NuYXBzaG90SW5kZXgpIHsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZmxhdHRlbigKLSAgICAgICAgICAgICAgICAqKHRTbmFwc2hvdFtzbmFwc2hvdEluZGV4XSksIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2d1aS9GcmFtZVRpbWVzdGFtcHMuY3BwOiBGcmFtZUV2ZW50SGlzdG9yeURlbHRhCi0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKiBccmV0dXJuIFRoZSByZXF1aXJlZCBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqLwotc2l6ZV90IGdldEZsYXR0ZW5lZFNpemUoCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgY29uc3QmIHQpIHsKLSAgICBzaXplX3Qgc2l6ZSA9IDQgKyAvLyBtRGVsdGFzLnNpemUoKQotICAgICAgICAgICAgc2l6ZW9mKHQuY29tcG9zaXRvclRpbWluZyk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0LmRlbHRhcy5zaXplKCk7ICsraSkgewotICAgICAgICBzaXplICs9IGdldEZsYXR0ZW5lZFNpemUodC5kZWx0YXNbaV0pOwotICAgIH0KLSAgICByZXR1cm4gc2l6ZTsKLX0KLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4KLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqIFxyZXR1cm4gVGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgotICovCi1zaXplX3QgZ2V0RmRDb3VudCgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgdCkgewotICAgIHNpemVfdCBudW1GZHMgPSAwOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdC5kZWx0YXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgbnVtRmRzICs9IGdldEZkQ291bnQodC5kZWx0YXNbaV0pOwotICAgIH0KLSAgICByZXR1cm4gbnVtRmRzOwotfQotCi0vKioKLSAqIFxicmllZiBVbmZsYXR0ZW4gYEZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSB1bmRlcmx5aW5nIGFycmF5IG9mIGFycmF5cyBvZiBuYXRpdmUgaGFuZGxlcy4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGBOT19FUlJPUmAsIFxwIG5oIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYG51bGxwdHJgIG9yCi0gKiBuZXdseSBjcmVhdGVkIGhhbmRsZXMuIFRoZSBzZWNvbmQgZGltZW5zaW9uIG9mIFxwIG5oIHdpbGwgYmUgNC4gRWFjaCBub24tbnVsbAotICogc2xvdCBpbiBccCBuaCB3aWxsIG5lZWQgdG8gYmUgZGVsZXRlZCBtYW51YWxseSB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KLSAqLwotc3RhdHVzX3QgdW5mbGF0dGVuKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhKiB0LAotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+KiBuaCwKLSAgICAgICAgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQgY29uc3QqJiBmZHMsIHNpemVfdCYgbnVtRmRzKSB7Ci0gICAgaWYgKHNpemUgPCA0KSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPmNvbXBvc2l0b3JUaW1pbmcpOwotCi0gICAgdWludDMyX3QgZGVsdGFDb3VudCA9IDA7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIGRlbHRhQ291bnQpOwotICAgIGlmIChzdGF0aWNfY2FzdDxzaXplX3Q+KGRlbHRhQ291bnQpID4KLSAgICAgICAgICAgIDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3Rvcnk6Ok1BWF9GUkFNRV9ISVNUT1JZKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIHQtPmRlbHRhcy5yZXNpemUoZGVsdGFDb3VudCk7Ci0gICAgbmgtPnJlc2l6ZShkZWx0YUNvdW50KTsKLSAgICBmb3IgKHNpemVfdCBkZWx0YUluZGV4ID0gMDsgZGVsdGFJbmRleCA8IGRlbHRhQ291bnQ7ICsrZGVsdGFJbmRleCkgewotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSB1bmZsYXR0ZW4oCi0gICAgICAgICAgICAgICAgJih0LT5kZWx0YXNbZGVsdGFJbmRleF0pLCAmKCgqbmgpW2RlbHRhSW5kZXhdKSwKLSAgICAgICAgICAgICAgICBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKTsKLSAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLS8qKgotICogXGJyaWVmIEZsYXR0ZW4gYEZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCi0gKi8KLXN0YXR1c190IGZsYXR0ZW4oCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgY29uc3QmIHQsCi0gICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcykgewotICAgIGlmICh0LmRlbHRhcy5zaXplKCkgPiA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5OjpNQVhfRlJBTUVfSElTVE9SWSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBpZiAoc2l6ZSA8IGdldEZsYXR0ZW5lZFNpemUodCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHQuY29tcG9zaXRvclRpbWluZyk7Ci0KLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIHN0YXRpY19jYXN0PHVpbnQzMl90Pih0LmRlbHRhcy5zaXplKCkpKTsKLSAgICBmb3IgKHNpemVfdCBkZWx0YUluZGV4ID0gMDsgZGVsdGFJbmRleCA8IHQuZGVsdGFzLnNpemUoKTsgKytkZWx0YUluZGV4KSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGZsYXR0ZW4odC5kZWx0YXNbZGVsdGFJbmRleF0sIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoqCi0gKiBcYnJpZWYgV3JhcCBgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURhdGFgIGluCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgYXJyYXkgb2YgYXJyYXkgb2YgbmF0aXZlIGhhbmRsZXMgdGhhdCBhcmUgcmVmZXJyZWQgdG8gYnkKLSAqIG1lbWJlcnMgb2YgXHAgdC4KLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICoKLSAqIE9uIHN1Y2Nlc3MsIGVhY2ggbWVtYmVyIG9mIFxwIG5oIHdpbGwgYmUgZWl0aGVyIGBudWxscHRyYCBvciBhIG5ld2x5IGNyZWF0ZWQKLSAqIG5hdGl2ZSBoYW5kbGUuIEFsbCB0aGUgbm9uLWBudWxscHRyYCBlbGVtZW50cyBtdXN0IGJlIGRlbGV0ZWQgaW5kaXZpZHVhbGx5Ci0gKiB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KLSAqLwotYm9vbCB3cmFwQXMoSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSogdCwKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiogbmgsCi0gICAgICAgIDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgbCkgewotCi0gICAgc2l6ZV90IGNvbnN0IGJhc2VTaXplID0gbC5nZXRGbGF0dGVuZWRTaXplKCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYmFzZUJ1ZmZlcigKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W2Jhc2VTaXplXSk7Ci0gICAgaWYgKCFiYXNlQnVmZmVyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzaXplX3QgY29uc3QgYmFzZU51bUZkcyA9IGwuZ2V0RmRDb3VudCgpOwotICAgIHN0ZDo6dW5pcXVlX3B0cjxpbnRbXT4gYmFzZUZkcygKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSBpbnRbYmFzZU51bUZkc10pOwotICAgIGlmICghYmFzZUZkcykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCogYnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemVfdCBzaXplID0gYmFzZVNpemU7Ci0gICAgaW50KiBmZHMgPSBiYXNlRmRzLmdldCgpOwotICAgIHNpemVfdCBudW1GZHMgPSBiYXNlTnVtRmRzOwotICAgIGlmIChsLmZsYXR0ZW4oYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQgY29uc3QqIGNvbnN0RmRzID0gc3RhdGljX2Nhc3Q8aW50IGNvbnN0Kj4oYmFzZUZkcy5nZXQoKSk7Ci0gICAgbnVtRmRzID0gYmFzZU51bUZkczsKLSAgICBpZiAodW5mbGF0dGVuKHQsIG5oLCBjb25zdEJ1ZmZlciwgc2l6ZSwgY29uc3RGZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYCB0bwotICogYDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBhbGwgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KLSAqLwotYm9vbCBjb252ZXJ0VG8oCi0gICAgICAgIDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSogbCwKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgdCkgewotCi0gICAgc2l6ZV90IGNvbnN0IGJhc2VTaXplID0gZ2V0RmxhdHRlbmVkU2l6ZSh0KTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBiYXNlQnVmZmVyKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbYmFzZVNpemVdKTsKLSAgICBpZiAoIWJhc2VCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHNpemVfdCBjb25zdCBiYXNlTnVtRmRzID0gZ2V0RmRDb3VudCh0KTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8aW50W10+IGJhc2VGZHMoCi0gICAgICAgICAgICBuZXcgKHN0ZDo6bm90aHJvdykgaW50W2Jhc2VOdW1GZHNdKTsKLSAgICBpZiAoIWJhc2VGZHMpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQqIGJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplX3Qgc2l6ZSA9IGJhc2VTaXplOwotICAgIGludCogZmRzID0gc3RhdGljX2Nhc3Q8aW50Kj4oYmFzZUZkcy5nZXQoKSk7Ci0gICAgc2l6ZV90IG51bUZkcyA9IGJhc2VOdW1GZHM7Ci0gICAgaWYgKGZsYXR0ZW4odCwgYnVmZmVyLCBzaXplLCBmZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQgY29uc3QqIGNvbnN0RmRzID0gc3RhdGljX2Nhc3Q8aW50IGNvbnN0Kj4oYmFzZUZkcy5nZXQoKSk7Ci0gICAgbnVtRmRzID0gYmFzZU51bUZkczsKLSAgICBpZiAobC0+dW5mbGF0dGVuKGNvbnN0QnVmZmVyLCBzaXplLCBjb25zdEZkcywgbnVtRmRzKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy91aS9SZWdpb24uY3BwCi0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4gYFJlZ2lvbmAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgUmVnaW9uYC4KLSAqIFxyZXR1cm4gVGhlIHJlcXVpcmVkIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICovCi1zaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZShSZWdpb24gY29uc3QmIHQpIHsKLSAgICByZXR1cm4gc2l6ZW9mKHVpbnQzMl90KSArIHQuc2l6ZSgpICogc2l6ZW9mKDo6YW5kcm9pZDo6UmVjdCk7Ci19Ci0KLS8qKgotICogXGJyaWVmIFVuZmxhdHRlbiBgUmVnaW9uYC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgUmVnaW9uYC4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICovCi1zdGF0dXNfdCB1bmZsYXR0ZW4oUmVnaW9uKiB0LCB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUpIHsKLSAgICBpZiAoc2l6ZSA8IHNpemVvZih1aW50MzJfdCkpIHsKLSAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBudW1SZWN0cyA9IDA7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIG51bVJlY3RzKTsKLSAgICBpZiAoc2l6ZSA8IG51bVJlY3RzICogc2l6ZW9mKFJlY3QpKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotICAgIGlmIChudW1SZWN0cyA+IChVSU5UMzJfTUFYIC8gc2l6ZW9mKFJlY3QpKSkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIHQtPnJlc2l6ZShudW1SZWN0cyk7Ci0gICAgZm9yIChzaXplX3QgciA9IDA7IHIgPCBudW1SZWN0czsgKytyKSB7Ci0gICAgICAgIDo6YW5kcm9pZDo6UmVjdCByZWN0KDo6YW5kcm9pZDo6UmVjdDo6RU1QVFlfUkVDVCk7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlY3QudW5mbGF0dGVuKGJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgRmxhdHRlbmFibGVVdGlsczo6YWR2YW5jZShidWZmZXIsIHNpemUsIHNpemVvZihyZWN0KSk7Ci0gICAgICAgICgqdClbcl0gPSBSZWN0ewotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHJlY3QubGVmdCksCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4ocmVjdC50b3ApLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHJlY3QucmlnaHQpLAotICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHJlY3QuYm90dG9tKX07Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoqCi0gKiBcYnJpZWYgRmxhdHRlbiBgUmVnaW9uYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmVnaW9uYC4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICovCi1zdGF0dXNfdCBmbGF0dGVuKFJlZ2lvbiBjb25zdCYgdCwgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplKSB7Ci0gICAgaWYgKHNpemUgPCBnZXRGbGF0dGVuZWRTaXplKHQpKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7Ci0gICAgfQotCi0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCBzdGF0aWNfY2FzdDx1aW50MzJfdD4odC5zaXplKCkpKTsKLSAgICBmb3IgKHNpemVfdCByID0gMDsgciA8IHQuc2l6ZSgpOyArK3IpIHsKLSAgICAgICAgOjphbmRyb2lkOjpSZWN0IHJlY3QoCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odFtyXS5sZWZ0KSwKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0W3JdLnRvcCksCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odFtyXS5yaWdodCksCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4odFtyXS5ib3R0b20pKTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVjdC5mbGF0dGVuKGJ1ZmZlciwgc2l6ZSk7Ci0gICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICAgIH0KLSAgICAgICAgRmxhdHRlbmFibGVVdGlsczo6YWR2YW5jZShidWZmZXIsIHNpemUsIHNpemVvZihyZWN0KSk7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgOjphbmRyb2lkOjpSZWdpb25gIHRvIGBSZWdpb25gLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBSZWdpb25gLgotICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYDo6YW5kcm9pZDo6UmVnaW9uYC4KLSAqLwotLy8gY29udmVydDogOjphbmRyb2lkOjpSZWdpb24gLT4gUmVnaW9uCi1ib29sIGNvbnZlcnRUbyhSZWdpb24qIHQsIDo6YW5kcm9pZDo6UmVnaW9uIGNvbnN0JiBsKSB7Ci0gICAgc2l6ZV90IGNvbnN0IGJhc2VTaXplID0gbC5nZXRGbGF0dGVuZWRTaXplKCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYmFzZUJ1ZmZlcigKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W2Jhc2VTaXplXSk7Ci0gICAgaWYgKCFiYXNlQnVmZmVyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkKiBidWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkKj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZV90IHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpZiAobC5mbGF0dGVuKGJ1ZmZlciwgc2l6ZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHZvaWQgY29uc3QqIGNvbnN0QnVmZmVyID0gc3RhdGljX2Nhc3Q8dm9pZCBjb25zdCo+KGJhc2VCdWZmZXIuZ2V0KCkpOwotICAgIHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpZiAodW5mbGF0dGVuKHQsIGNvbnN0QnVmZmVyLCBzaXplKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYFJlZ2lvbmAgdG8gYDo6YW5kcm9pZDo6UmVnaW9uYC4KLSAqCi0gKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgOjphbmRyb2lkOjpSZWdpb25gLgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYFJlZ2lvbmAuCi0gKi8KLS8vIGNvbnZlcnQ6IFJlZ2lvbiAtPiA6OmFuZHJvaWQ6OlJlZ2lvbgotYm9vbCBjb252ZXJ0VG8oOjphbmRyb2lkOjpSZWdpb24qIGwsIFJlZ2lvbiBjb25zdCYgdCkgewotICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGdldEZsYXR0ZW5lZFNpemUodCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYmFzZUJ1ZmZlcigKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W2Jhc2VTaXplXSk7Ci0gICAgaWYgKCFiYXNlQnVmZmVyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkKiBidWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkKj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZV90IHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpZiAoZmxhdHRlbih0LCBidWZmZXIsIHNpemUpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplID0gYmFzZVNpemU7Ci0gICAgaWYgKGwtPnVuZmxhdHRlbihjb25zdEJ1ZmZlciwgc2l6ZSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0JHcmFwaGljQnVmZmVyUHJvZHVjZXIuY3BwOgotLy8gICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiBhIGxvd2VyIGJvdW5kIG9uIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICogXHJldHVybiBBIGxvd2VyIGJvdW5kIG9uIHRoZSBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqLwotY29uc3RleHByIHNpemVfdCBtaW5GbGF0dGVuZWRTaXplKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiAvKiB0ICovKSB7Ci0gICAgcmV0dXJuIHNpemVvZihpbnQ2NF90KSArIC8vIHRpbWVzdGFtcAotICAgICAgICAgICAgc2l6ZW9mKGludCkgKyAvLyBpc0F1dG9UaW1lc3RhbXAKLSAgICAgICAgICAgIHNpemVvZihhbmRyb2lkX2RhdGFzcGFjZSkgKyAvLyBkYXRhU3BhY2UKLSAgICAgICAgICAgIHNpemVvZig6OmFuZHJvaWQ6OlJlY3QpICsgLy8gY3JvcAotICAgICAgICAgICAgc2l6ZW9mKGludCkgKyAvLyBzY2FsaW5nTW9kZQotICAgICAgICAgICAgc2l6ZW9mKHVpbnQzMl90KSArIC8vIHRyYW5zZm9ybQotICAgICAgICAgICAgc2l6ZW9mKHVpbnQzMl90KSArIC8vIHN0aWNreVRyYW5zZm9ybQotICAgICAgICAgICAgc2l6ZW9mKGJvb2wpOyAvLyBnZXRGcmFtZVRpbWVzdGFtcHMKLX0KLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKi8KLXNpemVfdCBnZXRGbGF0dGVuZWRTaXplKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgY29uc3QmIHQpIHsKLSAgICByZXR1cm4gbWluRmxhdHRlbmVkU2l6ZSh0KSArCi0gICAgICAgICAgICBnZXRGZW5jZUZsYXR0ZW5lZFNpemUodC5mZW5jZSkgKwotICAgICAgICAgICAgZ2V0RmxhdHRlbmVkU2l6ZSh0LnN1cmZhY2VEYW1hZ2UpICsKLSAgICAgICAgICAgIHNpemVvZihIZHJNZXRhZGF0YTo6dmFsaWRUeXBlcyk7Ci19Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKiBccmV0dXJuIFRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KLSAqLwotc2l6ZV90IGdldEZkQ291bnQoCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgY29uc3QmIHQpIHsKLSAgICByZXR1cm4gZ2V0RmVuY2VGZENvdW50KHQuZmVuY2UpOwotfQotCi0vKioKLSAqIFxicmllZiBGbGF0dGVuIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgbmF0aXZlIGhhbmRsZSBjbG9uZWQgZnJvbSBgdC5mZW5jZWAuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSB0aGUgZmlsZSBkZXNjcmlwdG9yIGluIGB0LmZlbmNlYC4gKi8KLXN0YXR1c190IGZsYXR0ZW4oSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgdCwKLSAgICAgICAgbmF0aXZlX2hhbmRsZV90KiogbmgsCi0gICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcykgewotICAgIGlmIChzaXplIDwgZ2V0RmxhdHRlbmVkU2l6ZSh0KSkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgdC50aW1lc3RhbXApOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgc3RhdGljX2Nhc3Q8aW50Pih0LmlzQXV0b1RpbWVzdGFtcCkpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlX3Q+KHQuZGF0YVNwYWNlKSk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCA6OmFuZHJvaWQ6OlJlY3QoCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmNyb3AubGVmdCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmNyb3AudG9wKSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHQuY3JvcC5yaWdodCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90Pih0LmNyb3AuYm90dG9tKSkpOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OndyaXRlKGJ1ZmZlciwgc2l6ZSwgc3RhdGljX2Nhc3Q8aW50Pih0LnNjYWxpbmdNb2RlKSk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LnRyYW5zZm9ybSk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LnN0aWNreVRyYW5zZm9ybSk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6d3JpdGUoYnVmZmVyLCBzaXplLCB0LmdldEZyYW1lVGltZXN0YW1wcyk7Ci0KLSAgICAqbmggPSB0LmZlbmNlLmdldE5hdGl2ZUhhbmRsZSgpID09IG51bGxwdHIgPwotICAgICAgICAgICAgbnVsbHB0ciA6IG5hdGl2ZV9oYW5kbGVfY2xvbmUodC5mZW5jZSk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gZmxhdHRlbkZlbmNlKGhpZGxfaGFuZGxlKCpuaCksIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICB9Ci0gICAgc3RhdHVzID0gZmxhdHRlbih0LnN1cmZhY2VEYW1hZ2UsIGJ1ZmZlciwgc2l6ZSk7Ci0gICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgIH0KLSAgICBGbGF0dGVuYWJsZVV0aWxzOjp3cml0ZShidWZmZXIsIHNpemUsIGRlY2x0eXBlKEhkck1ldGFkYXRhOjp2YWxpZFR5cGVzKSgwKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi0vKioKLSAqIFxicmllZiBVbmZsYXR0ZW4gYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSB1bmRlcmx5aW5nIG5hdGl2ZSBoYW5kbGUgZm9yIGB0LT5mZW5jZWAuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogSWYgdGhlIHJldHVybiB2YWx1ZSBpcyBgTk9fRVJST1JgIGFuZCBgdC0+ZmVuY2VgIGNvbnRhaW5zIGEgdmFsaWQgZmlsZQotICogZGVzY3JpcHRvciwgXHAgbmggd2lsbCBiZSBhIG5ld2x5IGNyZWF0ZWQgbmF0aXZlIGhhbmRsZSBob2xkaW5nIHRoYXQgZmlsZQotICogZGVzY3JpcHRvci4gXHAgbmggbmVlZHMgdG8gYmUgZGVsZXRlZCB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYAotICogYWZ0ZXJ3YXJkcy4KLSAqLwotc3RhdHVzX3QgdW5mbGF0dGVuKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0KiB0LCBuYXRpdmVfaGFuZGxlX3QqKiBuaCwKLSAgICAgICAgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQgY29uc3QqJiBmZHMsIHNpemVfdCYgbnVtRmRzKSB7Ci0gICAgaWYgKHNpemUgPCBtaW5GbGF0dGVuZWRTaXplKCp0KSkgewotICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwotICAgIH0KLQotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCB0LT50aW1lc3RhbXApOwotICAgIGludCBsSXNBdXRvVGltZXN0YW1wOwotICAgIEZsYXR0ZW5hYmxlVXRpbHM6OnJlYWQoYnVmZmVyLCBzaXplLCBsSXNBdXRvVGltZXN0YW1wKTsKLSAgICB0LT5pc0F1dG9UaW1lc3RhbXAgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihsSXNBdXRvVGltZXN0YW1wKTsKLSAgICBhbmRyb2lkX2RhdGFzcGFjZV90IGxEYXRhU3BhY2U7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIGxEYXRhU3BhY2UpOwotICAgIHQtPmRhdGFTcGFjZSA9IHN0YXRpY19jYXN0PERhdGFzcGFjZT4obERhdGFTcGFjZSk7Ci0gICAgUmVjdCBsQ3JvcDsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgbENyb3ApOwotICAgIHQtPmNyb3AgPSBSZWN0ewotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4obENyb3AubGVmdCksCi0gICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PihsQ3JvcC50b3ApLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4obENyb3AucmlnaHQpLAotICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4obENyb3AuYm90dG9tKX07Ci0gICAgaW50IGxTY2FsaW5nTW9kZTsKLSAgICBGbGF0dGVuYWJsZVV0aWxzOjpyZWFkKGJ1ZmZlciwgc2l6ZSwgbFNjYWxpbmdNb2RlKTsKLSAgICB0LT5zY2FsaW5nTW9kZSA9IHN0YXRpY19jYXN0PGludDMyX3Q+KGxTY2FsaW5nTW9kZSk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPnRyYW5zZm9ybSk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPnN0aWNreVRyYW5zZm9ybSk7Ci0gICAgRmxhdHRlbmFibGVVdGlsczo6cmVhZChidWZmZXIsIHNpemUsIHQtPmdldEZyYW1lVGltZXN0YW1wcyk7Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSB1bmZsYXR0ZW5GZW5jZSgmKHQtPmZlbmNlKSwgbmgsCi0gICAgICAgICAgICBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKTsKLSAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfQotICAgIC8vIEhkck1ldGFkYXRhIGlnbm9yZWQKLSAgICByZXR1cm4gdW5mbGF0dGVuKCYodC0+c3VyZmFjZURhbWFnZSksIGJ1ZmZlciwgc2l6ZSk7Ci19Ci0KLS8qKgotICogXGJyaWVmIFdyYXAgYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgIGluCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBuYXRpdmUgaGFuZGxlIGZvciBgdC0+ZmVuY2VgLgotICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYHRydWVgIGFuZCBgdC0+ZmVuY2VgIGNvbnRhaW5zIGEgdmFsaWQgZmlsZQotICogZGVzY3JpcHRvciwgXHAgbmggd2lsbCBiZSBhIG5ld2x5IGNyZWF0ZWQgbmF0aXZlIGhhbmRsZSBob2xkaW5nIHRoYXQgZmlsZQotICogZGVzY3JpcHRvci4gXHAgbmggbmVlZHMgdG8gYmUgZGVsZXRlZCB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYAotICogYWZ0ZXJ3YXJkcy4KLSAqLwotYm9vbCB3cmFwQXMoCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQqIHQsCi0gICAgICAgIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLAotICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiBsKSB7Ci0KLSAgICBzaXplX3QgY29uc3QgYmFzZVNpemUgPSBsLmdldEZsYXR0ZW5lZFNpemUoKTsKLSAgICBzdGQ6OnVuaXF1ZV9wdHI8dWludDhfdFtdPiBiYXNlQnVmZmVyKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIHVpbnQ4X3RbYmFzZVNpemVdKTsKLSAgICBpZiAoIWJhc2VCdWZmZXIpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHNpemVfdCBjb25zdCBiYXNlTnVtRmRzID0gbC5nZXRGZENvdW50KCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGludFtdPiBiYXNlRmRzKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIGludFtiYXNlTnVtRmRzXSk7Ci0gICAgaWYgKCFiYXNlRmRzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkKiBidWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkKj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZV90IHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQqIGZkcyA9IGJhc2VGZHMuZ2V0KCk7Ci0gICAgc2l6ZV90IG51bUZkcyA9IGJhc2VOdW1GZHM7Ci0gICAgaWYgKGwuZmxhdHRlbihidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdm9pZCBjb25zdCogY29uc3RCdWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkIGNvbnN0Kj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZSA9IGJhc2VTaXplOwotICAgIGludCBjb25zdCogY29uc3RGZHMgPSBzdGF0aWNfY2FzdDxpbnQgY29uc3QqPihiYXNlRmRzLmdldCgpKTsKLSAgICBudW1GZHMgPSBiYXNlTnVtRmRzOwotICAgIGlmICh1bmZsYXR0ZW4odCwgbmgsIGNvbnN0QnVmZmVyLCBzaXplLCBjb25zdEZkcywgbnVtRmRzKSAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgIHRvCi0gKiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKgotICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIElmIGB0LmZlbmNlYCBoYXMgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IsIGl0IHdpbGwgYmUgZHVwbGljYXRlZC4KLSAqLwotYm9vbCBjb252ZXJ0VG8oCi0gICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQqIGwsCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgY29uc3QmIHQpIHsKLQotICAgIHNpemVfdCBjb25zdCBiYXNlU2l6ZSA9IGdldEZsYXR0ZW5lZFNpemUodCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPHVpbnQ4X3RbXT4gYmFzZUJ1ZmZlcigKLSAgICAgICAgICAgIG5ldyAoc3RkOjpub3Rocm93KSB1aW50OF90W2Jhc2VTaXplXSk7Ci0gICAgaWYgKCFiYXNlQnVmZmVyKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzaXplX3QgY29uc3QgYmFzZU51bUZkcyA9IGdldEZkQ291bnQodCk7Ci0gICAgc3RkOjp1bmlxdWVfcHRyPGludFtdPiBiYXNlRmRzKAotICAgICAgICAgICAgbmV3IChzdGQ6Om5vdGhyb3cpIGludFtiYXNlTnVtRmRzXSk7Ci0gICAgaWYgKCFiYXNlRmRzKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkKiBidWZmZXIgPSBzdGF0aWNfY2FzdDx2b2lkKj4oYmFzZUJ1ZmZlci5nZXQoKSk7Ci0gICAgc2l6ZV90IHNpemUgPSBiYXNlU2l6ZTsKLSAgICBpbnQqIGZkcyA9IGJhc2VGZHMuZ2V0KCk7Ci0gICAgc2l6ZV90IG51bUZkcyA9IGJhc2VOdW1GZHM7Ci0gICAgbmF0aXZlX2hhbmRsZV90KiBuaDsKLSAgICBpZiAoZmxhdHRlbih0LCAmbmgsIGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIGNvbnN0KiBjb25zdEJ1ZmZlciA9IHN0YXRpY19jYXN0PHZvaWQgY29uc3QqPihiYXNlQnVmZmVyLmdldCgpKTsKLSAgICBzaXplID0gYmFzZVNpemU7Ci0gICAgaW50IGNvbnN0KiBjb25zdEZkcyA9IHN0YXRpY19jYXN0PGludCBjb25zdCo+KGJhc2VGZHMuZ2V0KCkpOwotICAgIG51bUZkcyA9IGJhc2VOdW1GZHM7Ci0gICAgaWYgKGwtPnVuZmxhdHRlbihjb25zdEJ1ZmZlciwgc2l6ZSwgY29uc3RGZHMsIG51bUZkcykgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgaWYgKG5oICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UobmgpOwotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5jcHA6Ci0vLyAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0Ci0KLS8qKgotICogXGJyaWVmIFdyYXAgYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0YCBpbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0YC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSB3cmFwcGVyIG9mIHR5cGUKLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgYXJyYXkgb2YgYXJyYXkgb2YgbmF0aXZlIGhhbmRsZXMgdGhhdCBhcmUgcmVmZXJyZWQgdG8gYnkKLSAqIG1lbWJlcnMgb2YgXHAgdC4KLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCi0gKgotICogT24gc3VjY2VzcywgZWFjaCBtZW1iZXIgb2YgXHAgbmggd2lsbCBiZSBlaXRoZXIgYG51bGxwdHJgIG9yIGEgbmV3bHkgY3JlYXRlZAotICogbmF0aXZlIGhhbmRsZS4gQWxsIHRoZSBub24tYG51bGxwdHJgIGVsZW1lbnRzIG11c3QgYmUgZGVsZXRlZCBpbmRpdmlkdWFsbHkKLSAqIHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgLgotICovCi0vLyB3cmFwOiBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCAtPgotLy8gSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQKLWJvb2wgd3JhcEFzKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0KiB0LAotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+KiBuaCwKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgY29uc3QmIGwpIHsKLSAgICBpZiAoIXdyYXBBcygmKHQtPmZyYW1lVGltZXN0YW1wcyksIG5oLCBsLmZyYW1lVGltZXN0YW1wcykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICB0LT53aWR0aCA9IGwud2lkdGg7Ci0gICAgdC0+aGVpZ2h0ID0gbC5oZWlnaHQ7Ci0gICAgdC0+dHJhbnNmb3JtSGludCA9IGwudHJhbnNmb3JtSGludDsKLSAgICB0LT5udW1QZW5kaW5nQnVmZmVycyA9IGwubnVtUGVuZGluZ0J1ZmZlcnM7Ci0gICAgdC0+bmV4dEZyYW1lTnVtYmVyID0gbC5uZXh0RnJhbWVOdW1iZXI7Ci0gICAgdC0+YnVmZmVyUmVwbGFjZWQgPSBsLmJ1ZmZlclJlcGxhY2VkOwotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAgdG8KLSAqIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCi0gKgotICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0YC4KLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCi0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBhbGwgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KLSAqLwotLy8gY29udmVydDogSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgLT4KLS8vIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0Ci1ib29sIGNvbnZlcnRUbygKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQqIGwsCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IGNvbnN0JiB0KSB7Ci0gICAgaWYgKCFjb252ZXJ0VG8oJihsLT5mcmFtZVRpbWVzdGFtcHMpLCB0LmZyYW1lVGltZXN0YW1wcykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBsLT53aWR0aCA9IHQud2lkdGg7Ci0gICAgbC0+aGVpZ2h0ID0gdC5oZWlnaHQ7Ci0gICAgbC0+dHJhbnNmb3JtSGludCA9IHQudHJhbnNmb3JtSGludDsKLSAgICBsLT5udW1QZW5kaW5nQnVmZmVycyA9IHQubnVtUGVuZGluZ0J1ZmZlcnM7Ci0gICAgbC0+bmV4dEZyYW1lTnVtYmVyID0gdC5uZXh0RnJhbWVOdW1iZXI7Ci0gICAgbC0+YnVmZmVyUmVwbGFjZWQgPSB0LmJ1ZmZlclJlcGxhY2VkOwotICAgIHJldHVybiB0cnVlOwotfQotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAgdG8KLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCi0gKgotICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYC4KLSAqIFxyZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYC4KLSAqLwotSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGUgdG9IaWRsRGlzY29ubmVjdE1vZGUoCi0gICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlIGwpIHsKLSAgICBzd2l0Y2ggKGwpIHsKLSAgICAgICAgY2FzZSBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QXBpOgotICAgICAgICAgICAgcmV0dXJuIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlOjpBUEk7Ci0gICAgICAgIGNhc2UgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFsbExvY2FsOgotICAgICAgICAgICAgcmV0dXJuIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlOjpBTExfTE9DQUw7Ci0gICAgfQotICAgIHJldHVybiBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QVBJOwotfQotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAgdG8KLSAqIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZWAuCi0gKgotICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYC4KLSAqIFxyZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYC4KLSAqLwotQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGUgdG9HdWlEaXNjb25uZWN0TW9kZSgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGUgdCkgewotICAgIHN3aXRjaCAodCkgewotICAgICAgICBjYXNlIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlOjpBUEk6Ci0gICAgICAgICAgICByZXR1cm4gQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGU6OkFwaTsKLSAgICAgICAgY2FzZSBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZTo6QUxMX0xPQ0FMOgotICAgICAgICAgICAgcmV0dXJuIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlOjpBbGxMb2NhbDsKLSAgICB9Ci0gICAgcmV0dXJuIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlOjpBcGk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb252ZXJzaW9uCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCmluZGV4IDcxY2VlZDguLjU5MzE3ZTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCkBAIC0zMiw2ICszMiwxMSBAQAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgogI2luY2x1ZGUgPHVpL0dyYXBoaWNCdWZmZXIuaD4KICNpbmNsdWRlIDxndWkvQnVmZmVySXRlbS5oPgorI2luY2x1ZGUgPGd1aS9CdWZmZXJRdWV1ZS5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8yLjAvQjJIR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJDb25zdW1lci5oPgogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL0hhcmR3YXJlQVBJLmg+CiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgpAQCAtMjgxLDYgKzI4NiwzOSBAQAogICAgIH0KIH07CiAKK3N0cnVjdCBHcmFwaGljQnVmZmVyU291cmNlOjpDb25zdW1lclByb3h5IDogcHVibGljIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIHsKKyAgICBDb25zdW1lclByb3h5KGNvbnN0IHdwPEdyYXBoaWNCdWZmZXJTb3VyY2U+ICZnYnMpIDogbUdicyhnYnMpIHt9CisKKyAgICB+Q29uc3VtZXJQcm94eSgpID0gZGVmYXVsdDsKKworICAgIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKSBvdmVycmlkZSB7CisgICAgICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IGdicyA9IG1HYnMucHJvbW90ZSgpOworICAgICAgICBpZiAoZ2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGdicy0+b25GcmFtZUF2YWlsYWJsZShpdGVtKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgb25CdWZmZXJzUmVsZWFzZWQoKSBvdmVycmlkZSB7CisgICAgICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IGdicyA9IG1HYnMucHJvbW90ZSgpOworICAgICAgICBpZiAoZ2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGdicy0+b25CdWZmZXJzUmVsZWFzZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKSBvdmVycmlkZSB7CisgICAgICAgIHNwPEdyYXBoaWNCdWZmZXJTb3VyY2U+IGdicyA9IG1HYnMucHJvbW90ZSgpOworICAgICAgICBpZiAoZ2JzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGdicy0+b25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKTsKKyAgICAgICAgfQorICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBOb3RlIHRoYXQgR3JhcGhpY0J1ZmZlclNvdXJjZSBpcyBob2xkaW5nIGFuIHNwIHRvIHVzLCB3ZSBjYW4ndCBob2xkCisgICAgLy8gYW4gc3AgYmFjayB0byBHcmFwaGljQnVmZmVyU291cmNlIGFzIHRoZSBjaXJjdWxhciBkZXBlbmRlbmN5IHdpbGwKKyAgICAvLyBtYWtlIGJvdGggaW1tb3J0YWwuCisgICAgd3A8R3JhcGhpY0J1ZmZlclNvdXJjZT4gbUdiczsKK307CisKIEdyYXBoaWNCdWZmZXJTb3VyY2U6OkdyYXBoaWNCdWZmZXJTb3VyY2UoKSA6CiAgICAgbUluaXRDaGVjayhVTktOT1dOX0VSUk9SKSwKICAgICBtTnVtQXZhaWxhYmxlVW5hY3F1aXJlZEJ1ZmZlcnMoMCksCkBAIC0zMTMsMTQgKzM1MSwxMiBAQAogICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmbVByb2R1Y2VyLCAmbUNvbnN1bWVyKTsKICAgICBtQ29uc3VtZXItPnNldENvbnN1bWVyTmFtZShuYW1lKTsKIAotICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW4ndCBjcmVhdGUgYW4gc3A8Li4uPih0aGlzKSBpbiBhIGN0b3IgdGhhdCB3aWxsIG5vdCBrZWVwIGEKLSAgICAvLyByZWZlcmVuY2Ugb25jZSB0aGUgY3RvciBlbmRzLCBhcyB0aGF0IHdvdWxkIGNhdXNlIHRoZSByZWZjb3VudCBvZiAndGhpcycKLSAgICAvLyBkcm9wcGluZyB0byAwIGF0IHRoZSBlbmQgb2YgdGhlIGN0b3IuICBTaW5jZSBhbGwgd2UgbmVlZCBpcyBhIHdwPC4uLj4KLSAgICAvLyB0aGF0J3Mgd2hhdCB3ZSBjcmVhdGUuCi0gICAgd3A8QnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXI+IGxpc3RlbmVyID0KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyKj4odGhpcyk7CisgICAgLy8gY3JlYXRlIHRoZSBjb25zdW1lciBsaXN0ZW5lciBpbnRlcmZhY2UsIGFuZCBob2xkIHNwIHNvIHRoYXQgdGhpcworICAgIC8vIGludGVyZmFjZSBsaXZlcyBhcyBsb25nIGFzIHRoZSBHcmFwaGljQnVmZmVyU291cmNlLgorICAgIG1Db25zdW1lclByb3h5ID0gbmV3IENvbnN1bWVyUHJveHkodGhpcyk7CisKICAgICBzcDxJQ29uc3VtZXJMaXN0ZW5lcj4gcHJveHkgPQotICAgICAgICAgICAgbmV3IEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXIobGlzdGVuZXIpOworICAgICAgICAgICAgbmV3IEJ1ZmZlclF1ZXVlOjpQcm94eUNvbnN1bWVyTGlzdGVuZXIobUNvbnN1bWVyUHJveHkpOwogCiAgICAgbUluaXRDaGVjayA9IG1Db25zdW1lci0+Y29uc3VtZXJDb25uZWN0KHByb3h5LCBmYWxzZSk7CiAgICAgaWYgKG1Jbml0Q2hlY2sgIT0gTk9fRVJST1IpIHsKQEAgLTM1Nyw2ICszOTMsMjQgQEAKICAgICB9CiB9CiAKK3NwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IEdyYXBoaWNCdWZmZXJTb3VyY2U6OmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Qcm9kdWNlcjsKK30KKworc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPgorR3JhcGhpY0J1ZmZlclNvdXJjZTo6Z2V0SEdyYXBoaWNCdWZmZXJQcm9kdWNlcl9WMV8wKCkgY29uc3QgeworICAgIHVzaW5nIFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyID0gOjphbmRyb2lkOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjwKKyAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPjsKKworICAgIHJldHVybiBuZXcgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXIoZ2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKTsKK30KKworc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMl8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPgorR3JhcGhpY0J1ZmZlclNvdXJjZTo6Z2V0SEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjJfMDo6dXRpbHM6OgorICAgICAgICAgICAgICAgICAgICBCMkhHcmFwaGljQnVmZmVyUHJvZHVjZXIoZ2V0SUdyYXBoaWNCdWZmZXJQcm9kdWNlcigpKTsKK30KKwogU3RhdHVzIEdyYXBoaWNCdWZmZXJTb3VyY2U6OnN0YXJ0KCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTXV0ZXgpOwogICAgIEFMT0dWKCItLT4gc3RhcnQ7IGF2YWlsYWJsZT0lenUsIHN1Ym1pdHRhYmxlPSV6ZCIsCkBAIC03NjcsNyArODIxLDcgQEAKICAgICAgICAgICAgIGRvdWJsZSBuRnJhbWVzID0gKHRpbWVVcyAtIG1QcmV2Q2FwdHVyZVVzKSAqIG1DYXB0dXJlRnBzIC8gMTAwMDAwMDsKICAgICAgICAgICAgIGlmIChuRnJhbWVzIDwgMC41IC0ga1RpbWVzdGFtcEZsdWN0dWF0aW9uKSB7CiAgICAgICAgICAgICAgICAgLy8gc2tpcCB0aGlzIGZyYW1lIGFzIGl0J3MgdG9vIGNsb3NlIHRvIHByZXZpb3VzIGNhcHR1cmUKLSAgICAgICAgICAgICAgICBBTE9HVigic2tpcHBpbmcgZnJhbWUsIHRpbWVVcyAlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpKTsKKyAgICAgICAgICAgICAgICBBTE9HRCgic2tpcHBpbmcgZnJhbWUsIHRpbWVVcyAlbGxkIiwgc3RhdGljX2Nhc3Q8bG9uZyBsb25nPih0aW1lVXMpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobkZyYW1lcyA8PSAxLjApIHsKQEAgLTExMDYsNiArMTE2MCwxNCBAQAogICAgICAgICBjb25zdW1lclVzYWdlIHw9IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUjsKICAgICAgICAgbUNvbnN1bWVyLT5zZXRDb25zdW1lclVzYWdlQml0cyhjb25zdW1lclVzYWdlKTsKIAorICAgICAgICAvLyBTZXQgaW1wbC4gZGVmaW5lZCBmb3JtYXQgYXMgZGVmYXVsdC4gRGVwZW5kaW5nIG9uIHRoZSB1c2FnZSBmbGFncworICAgICAgICAvLyB0aGUgZGV2aWNlLXNwZWNpZmljIGltcGxlbWVudGF0aW9uIHdpbGwgZGVyaXZlIHRoZSBleGFjdCBmb3JtYXQuCisgICAgICAgIGVyciA9IG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlckZvcm1hdChIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpOworICAgICAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbmZpZ3VyZSBzdXJmYWNlIGRlZmF1bHQgZm9ybWF0IHJldDogJWQiLCBlcnIpOworICAgICAgICAgICAgcmV0dXJuIGVycjsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIFNldHMgdGhlIGRlZmF1bHQgYnVmZmVyIGRhdGEgc3BhY2UKICAgICAgICAgQUxPR0QoInNldHRpbmcgZGF0YXNwYWNlOiAlI3gsIGFjcXVpcmVkPSVkIiwgZGF0YVNwYWNlLCBtTnVtT3V0c3RhbmRpbmdBY3F1aXJlcyk7CiAgICAgICAgIG1Db25zdW1lci0+c2V0RGVmYXVsdEJ1ZmZlckRhdGFTcGFjZSgoYW5kcm9pZF9kYXRhc3BhY2UpZGF0YVNwYWNlKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL1dQcm9kdWNlckxpc3RlbmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL1dQcm9kdWNlckxpc3RlbmVyLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNhMTNiZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9XUHJvZHVjZXJMaXN0ZW5lci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dQcm9kdWNlckxpc3RlbmVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gVFdQcm9kdWNlckxpc3RlbmVyCi1UV1Byb2R1Y2VyTGlzdGVuZXI6OlRXUHJvZHVjZXJMaXN0ZW5lcigKLSAgICAgICAgc3A8QlByb2R1Y2VyTGlzdGVuZXI+IGNvbnN0JiBiYXNlKToKLSAgICBtQmFzZShiYXNlKSB7Ci19Ci0KLVJldHVybjx2b2lkPiBUV1Byb2R1Y2VyTGlzdGVuZXI6Om9uQnVmZmVyUmVsZWFzZWQoKSB7Ci0gICAgbUJhc2UtPm9uQnVmZmVyUmVsZWFzZWQoKTsKLSAgICByZXR1cm4gVm9pZCgpOwotfQotCi1SZXR1cm48Ym9vbD4gVFdQcm9kdWNlckxpc3RlbmVyOjpuZWVkc1JlbGVhc2VOb3RpZnkoKSB7Ci0gICAgcmV0dXJuIG1CYXNlLT5uZWVkc1JlbGVhc2VOb3RpZnkoKTsKLX0KLQotLy8gTFdQcm9kdWNlckxpc3RlbmVyCi1MV1Byb2R1Y2VyTGlzdGVuZXI6OkxXUHJvZHVjZXJMaXN0ZW5lcigKLSAgICAgICAgc3A8SFByb2R1Y2VyTGlzdGVuZXI+IGNvbnN0JiBiYXNlKToKLSAgICBtQmFzZShiYXNlKSB7Ci19Ci0KLXZvaWQgTFdQcm9kdWNlckxpc3RlbmVyOjpvbkJ1ZmZlclJlbGVhc2VkKCkgewotICAgIG1CYXNlLT5vbkJ1ZmZlclJlbGVhc2VkKCk7Ci19Ci0KLWJvb2wgTFdQcm9kdWNlckxpc3RlbmVyOjpuZWVkc1JlbGVhc2VOb3RpZnkoKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGJvb2w+KG1CYXNlLT5uZWVkc1JlbGVhc2VOb3RpZnkoKSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0NvbnZlcnNpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGQ4YzFlLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNzY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX1NUQUdFRlJJR0hUX0JRSEVMUEVSX0NPTlZFUlNJT05fSF8KLSNkZWZpbmUgTUVESUFfU1RBR0VGUklHSFRfQlFIRUxQRVJfQ09OVkVSU0lPTl9IXwotCi0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGxpc3Q+Ci0KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLQotI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KLSNpbmNsdWRlIDxoaWRsbWVtb3J5L21hcHBpbmcuaD4KLQotI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+Ci0jaW5jbHVkZSA8dWkvRmVuY2VUaW1lLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLSNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgotCi0jaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvVmlkZW9BUEkuaD4KLQotI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tZW1vcnkvMS4wL0lNZW1vcnkuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzEuMC9JUHJvZHVjZXJMaXN0ZW5lci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci1uYW1lc3BhY2UgY29udmVyc2lvbiB7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9oYW5kbGU7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwotdXNpbmcgOjphbmRyb2lkOjpzcDsKLXVzaW5nIDo6YW5kcm9pZDo6c3RhdHVzX3Q7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6U3RyaW5nODsKLQotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6OlYxXzA6OlJlY3Q7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6VjFfMDo6UmVnaW9uOwotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpEYXRhc3BhY2U7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0OwotCi11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6VjFfMDo6QW53QnVmZmVyOwotdXNpbmcgOjphbmRyb2lkOjpHcmFwaGljQnVmZmVyOwotCi10eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcgotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwotdHlwZWRlZiA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXIKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKLQotLy8gbmF0aXZlX2hhbmRsZV90IGhlbHBlciBmdW5jdGlvbnMuCi0KLS8qKgotICogXGJyaWVmIFRha2UgYW4gZmQgYW5kIGNyZWF0ZSBhIG5hdGl2ZSBoYW5kbGUgY29udGFpbmluZyBvbmx5IHRoZSBnaXZlbiBmZC4KLSAqIFRoZSBjcmVhdGVkIGhhbmRsZSB3aWxsIG5lZWQgdG8gYmUgZGVsZXRlZCBtYW51YWxseSB3aXRoCi0gKiBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAuCi0gKgotICogXHBhcmFtW2luXSBmZCBUaGUgc291cmNlIGZpbGUgZGVzY3JpcHRvciAob2YgdHlwZSBgaW50YCkuCi0gKiBccmV0dXJuIFRoZSBjcmVhdGUgYG5hdGl2ZV9oYW5kbGVfdCpgIHRoYXQgY29udGFpbnMgdGhlIGdpdmVuIFxwIGZkLiBJZiB0aGUKLSAqIHN1cHBsaWVkIFxwIGZkIGlzIG5lZ2F0aXZlLCB0aGUgY3JlYXRlZCBuYXRpdmUgaGFuZGxlIHdpbGwgY29udGFpbiBubyBmaWxlCi0gKiBkZXNjcmlwdG9ycy4KLSAqCi0gKiBJZiB0aGUgbmF0aXZlIGhhbmRsZSBjYW5ub3QgYmUgY3JlYXRlZCwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlCi0gKiBgbnVsbHB0cmAuCi0gKgotICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkdXBsaWNhdGUgdGhlIGZpbGUgZGVzY3JpcHRvci4KLSAqLwotbmF0aXZlX2hhbmRsZV90KiBuYXRpdmVfaGFuZGxlX2NyZWF0ZV9mcm9tX2ZkKGludCBmZCk7Ci0KLS8qKgotICogXGJyaWVmIEV4dHJhY3QgYSBmaWxlIGRlc2NyaXB0b3IgZnJvbSBhIG5hdGl2ZSBoYW5kbGUuCi0gKgotICogXHBhcmFtW2luXSBuaCBUaGUgc291cmNlIGBuYXRpdmVfaGFuZGxlX3QqYC4KLSAqIFxwYXJhbVtpbl0gaW5kZXggVGhlIGluZGV4IG9mIHRoZSBmaWxlIGRlc2NyaXB0b3IgaW4gXHAgbmggdG8gcmVhZCBmcm9tLiBUaGlzCi0gKiBpbnB1dCBoYXMgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYDBgLgotICogXHJldHVybiBUaGUgYGluZGV4YC10aCBmaWxlIGRlc2NyaXB0b3IgaW4gXHAgbmguIElmIFxwIG5oIGRvZXMgbm90IGhhdmUKLSAqIGVub3VnaCBmaWxlIGRlc2NyaXB0b3JzLCB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSBgLTFgLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZHVwbGljYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IuCi0gKi8KLWludCBuYXRpdmVfaGFuZGxlX3JlYWRfZmQobmF0aXZlX2hhbmRsZV90IGNvbnN0KiBuaCwgaW50IGluZGV4ID0gMCk7Ci0KLS8qKgotICogQ29udmVyc2lvbiBmdW5jdGlvbnMKLSAqID09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhlcmUgYXJlIHR3byBtYWluIGRpcmVjdGlvbnMgb2YgY29udmVyc2lvbjoKLSAqIC0gYGluVGFyZ2V0VHlwZSguLi4pYDogQ3JlYXRlIGEgd3JhcHBlciB3aG9zZSBsaWZldGltZSBkZXBlbmRzIG9uIHRoZQotICogICBpbnB1dC4gVGhlIHdyYXBwZXIgaGFzIHR5cGUgYFRhcmdldFR5cGVgLgotICogLSBgdG9UYXJnZXRUeXBlKC4uLilgOiBDcmVhdGUgYSBzdGFuZGFsb25lIG9iamVjdCBvZiB0eXBlIGBUYXJnZXRUeXBlYCB0aGF0Ci0gKiAgIGNvcnJlc3BvbmRzIHRvIHRoZSBpbnB1dC4gVGhlIGxpZmV0aW1lIG9mIHRoZSBvdXRwdXQgZG9lcyBub3QgZGVwZW5kIG9uIHRoZQotICogICBsaWZldGltZSBvZiB0aGUgaW5wdXQuCi0gKiAtIGB3cmFwSW4oVGFyZ2V0VHlwZSosIC4uLilgOiBTYW1lIGFzIGBpblRhcmdldFR5cGUoKWAsIGJ1dCBmb3IgYFRhcmdldFR5cGVgCi0gKiAgIHRoYXQgY2Fubm90IGJlIGNvcGllZCBhbmQvb3IgbW92ZWQgZWZmaWNpZW50bHksIG9yIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlCi0gKiAgIG91dHB1dCBhcmd1bWVudHMuCi0gKiAtIGBjb252ZXJ0VG8oVGFyZ2V0VHlwZSosIC4uLilgOiBTYW1lIGFzIGB0b1RhcmdldFR5cGUoKWAsIGJ1dCBmb3IKLSAqICAgYFRhcmdldFR5cGVgIHRoYXQgY2Fubm90IGJlIGNvcGllZCBhbmQvb3IgbW92ZWQgZWZmaWNpZW50bHksIG9yIHdoZW4gdGhlcmUKLSAqICAgYXJlIG11bHRpcGxlIG91dHB1dCBhcmd1bWVudHMuCi0gKgotICogYHdyYXBJbigpYCBhbmQgYGNvbnZlcnRUbygpYCBmdW5jdGlvbnMgd2lsbCB0YWtlIG91dHB1dCBhcmd1bWVudHMgYmVmb3JlCi0gKiBpbnB1dCBhcmd1bWVudHMuIFNvbWUgb2YgdGhlc2UgZnVuY3Rpb25zIG1pZ2h0IHJldHVybiBhIHZhbHVlIHRvIGluZGljYXRlCi0gKiBzdWNjZXNzIG9yIGVycm9yLgotICoKLSAqIEluIGNvbnZlcnRpbmcgb3Igd3JhcHBpbmcgc29tZXRoaW5nIGFzIGEgVHJlYmxlIHR5cGUgdGhhdCBjb250YWlucyBhCi0gKiBgaGlkbF9oYW5kbGVgLCBgbmF0aXZlX2hhbmRsZV90KmAgd2lsbCBuZWVkIHRvIGJlIGNyZWF0ZWQgYW5kIHJldHVybmVkIGFzCi0gKiBhbiBhZGRpdGlvbmFsIG91dHB1dCBhcmd1bWVudCwgaGVuY2Ugb25seSBgd3JhcEluKClgIG9yIGBjb252ZXJ0VG8oKWAgd291bGQKLSAqIGJlIGF2YWlsYWJsZS4gVGhlIGNhbGxlciBtdXN0IGNhbGwgYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgIHRvIGRlYWxsb2NhdGUgdGhlCi0gKiByZXR1cm5lZCBuYXRpdmUgaGFuZGxlIHdoZW4gaXQgaXMgbm8gbG9uZ2VyIG5lZWRlZC4KLSAqCi0gKiBGb3IgdHlwZXMgdGhhdCBjb250YWluIGZpbGUgZGVzY3JpcHRvcnMsIGBpblRhcmdldFR5cGUoKWAgYW5kIGB3cmFwQXMoKWAgZG8KLSAqIG5vdCBwZXJmb3JtIGR1cGxpY2F0aW9uIG9mIGZpbGUgZGVzY3JpcHRvcnMsIHdoaWxlIGB0b1RhcmdldFR5cGUoKWAgYW5kCi0gKiBgY29udmVydFRvKClgIGRvLgotICovCi0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYFJldHVybjx2b2lkPmAgdG8gYGJpbmRlcjo6U3RhdHVzYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmV0dXJuPHZvaWQ+YC4KLSAqIFxyZXR1cm4gVGhlIGNvcnJlc3BvbmRpbmcgYGJpbmRlcjo6U3RhdHVzYC4KLSAqLwotLy8gY29udmVydDogUmV0dXJuPHZvaWQ+IC0+IDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMKLTo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgdG9CaW5kZXJTdGF0dXMoUmV0dXJuPHZvaWQ+IGNvbnN0JiB0KTsKLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgUmV0dXJuPHZvaWQ+YCB0byBgc3RhdHVzX3RgLiBUaGlzIGlzIGZvciBsZWdhY3kgYmluZGVyIGNhbGxzLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZXR1cm48dm9pZD5gLgotICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgc3RhdHVzX3RgLgotICovCi0vLyBjb252ZXJ0OiBSZXR1cm48dm9pZD4gLT4gc3RhdHVzX3QKLXN0YXR1c190IHRvU3RhdHVzVChSZXR1cm48dm9pZD4gY29uc3QmIHQpOwotCi0vKioKLSAqIFxicmllZiBXcmFwIGBuYXRpdmVfaGFuZGxlX3QqYCBpbiBgaGlkbF9oYW5kbGVgLgotICoKLSAqIFxwYXJhbVtpbl0gbmggVGhlIHNvdXJjZSBgbmF0aXZlX2hhbmRsZV90KmAuCi0gKiBccmV0dXJuIFRoZSBgaGlkbF9oYW5kbGVgIHRoYXQgcG9pbnRzIHRvIFxwIG5oLgotICovCi0vLyB3cmFwOiBuYXRpdmVfaGFuZGxlX3QqIC0+IGhpZGxfaGFuZGxlCi1oaWRsX2hhbmRsZSBpbkhpZGxIYW5kbGUobmF0aXZlX2hhbmRsZV90IGNvbnN0KiBuaCk7Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYGludDMyX3RgIHRvIGBEYXRhc3BhY2VgLgotICoKLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBpbnQzMl90YC4KLSAqIFxyZXN1bHQgVGhlIGNvcnJlc3BvbmRpbmcgYERhdGFzcGFjZWAuCi0gKi8KLS8vIGNvbnZlcnQ6IGludDMyX3QgLT4gRGF0YXNwYWNlCi1EYXRhc3BhY2UgdG9IYXJkd2FyZURhdGFzcGFjZShpbnQzMl90IGwpOwotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBEYXRhc3BhY2VgIHRvIGBpbnQzMl90YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgRGF0YXNwYWNlYC4KLSAqIFxyZXN1bHQgVGhlIGNvcnJlc3BvbmRpbmcgYGludDMyX3RgLgotICovCi0vLyBjb252ZXJ0OiBEYXRhc3BhY2UgLT4gaW50MzJfdAotaW50MzJfdCB0b1Jhd0RhdGFzcGFjZShEYXRhc3BhY2UgY29uc3QmIHQpOwotCi0vKioKLSAqIFxicmllZiBXcmFwIGFuIG9wYXF1ZSBidWZmZXIgaW5zaWRlIGEgYGhpZGxfdmVjPHVpbnQ4X3Q+YC4KLSAqCi0gKiBccGFyYW1baW5dIGwgVGhlIHBvaW50ZXIgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgb3BhcXVlIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbl0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyLgotICogXHJldHVybiBBIGBoaWRsX3ZlYzx1aW50OF90PmAgdGhhdCBwb2ludHMgdG8gdGhlIGJ1ZmZlci4KLSAqLwotLy8gd3JhcDogdm9pZCosIHNpemVfdCAtPiBoaWRsX3ZlYzx1aW50OF90PgotaGlkbF92ZWM8dWludDhfdD4gaW5IaWRsQnl0ZXModm9pZCBjb25zdCogbCwgc2l6ZV90IHNpemUpOwotCi0vKioKLSAqIFxicmllZiBDcmVhdGUgYSBgaGlkbF92ZWM8dWludDhfdD5gIHRoYXQgaXMgYSBjb3B5IG9mIGFuIG9wYXF1ZSBidWZmZXIuCi0gKgotICogXHBhcmFtW2luXSBsIFRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9wYXF1ZSBidWZmZXIuCi0gKiBccGFyYW1baW5dIHNpemUgVGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KLSAqIFxyZXR1cm4gQSBgaGlkbF92ZWM8dWludDhfdD5gIHRoYXQgaXMgYSBjb3B5IG9mIHRoZSBpbnB1dCBidWZmZXIuCi0gKi8KLS8vIGNvbnZlcnQ6IHZvaWQqLCBzaXplX3QgLT4gaGlkbF92ZWM8dWludDhfdD4KLWhpZGxfdmVjPHVpbnQ4X3Q+IHRvSGlkbEJ5dGVzKHZvaWQgY29uc3QqIGwsIHNpemVfdCBzaXplKTsKLQotLyoqCi0gKiBcYnJpZWYgV3JhcCBgR3JhcGhpY0J1ZmZlcmAgaW4gYEFud0J1ZmZlcmAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlIGBBbndCdWZmZXJgLgotICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYEdyYXBoaWNCdWZmZXJgLgotICovCi0vLyB3cmFwOiBHcmFwaGljQnVmZmVyIC0+IEFud0J1ZmZlcgotdm9pZCB3cmFwQXMoQW53QnVmZmVyKiB0LCBHcmFwaGljQnVmZmVyIGNvbnN0JiBsKTsKLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgQW53QnVmZmVyYCB0byBgR3JhcGhpY0J1ZmZlcmAuCi0gKgotICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYEdyYXBoaWNCdWZmZXJgLgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEFud0J1ZmZlcmAuCi0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSBhbGwgZmlsZSBkZXNjcmlwdG9ycyBpbiBccCB0LgotICovCi0vLyBjb252ZXJ0OiBBbndCdWZmZXIgLT4gR3JhcGhpY0J1ZmZlcgotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL3VpL0dyYXBoaWNCdWZmZXIuY3BwOiBHcmFwaGljQnVmZmVyOjpmbGF0dGVuCi1ib29sIGNvbnZlcnRUbyhHcmFwaGljQnVmZmVyKiBsLCBBbndCdWZmZXIgY29uc3QmIHQpOwotCi0vKioKLSAqIENvbnZlcnNpb24gZnVuY3Rpb25zIGZvciB0eXBlcyBvdXRzaWRlIG1lZGlhCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFNvbWUgb2JqZWN0cyBpbiBsaWJ1aSBhbmQgbGliZ3VpIHRoYXQgd2VyZSBtYWRlIHRvIGdvIHRocm91Z2ggYmluZGVyIGNhbGxzIGRvCi0gKiBub3QgZXhwb3NlIHdheXMgdG8gcmVhZCBvciB3cml0ZSB0aGVpciBmaWVsZHMgdG8gdGhlIHB1YmxpYy4gVG8gcGFzcyBhbgotICogb2JqZWN0IG9mIHRoaXMga2luZCB0aHJvdWdoIHRoZSBISURMIGJvdW5kYXJ5LCB0cmFuc2xhdGlvbiBmdW5jdGlvbnMgbmVlZCB0bwotICogd29yayBhcm91bmQgdGhlIGFjY2VzcyByZXN0cmljdGlvbiBieSB1c2luZyB0aGUgcHVibGljbHkgYXZhaWxhYmxlCi0gKiBgZmxhdHRlbigpYCBhbmQgYHVuZmxhdHRlbigpYCBmdW5jdGlvbnMuCi0gKgotICogQWxsIGBmbGF0dGVuKClgIGFuZCBgdW5mbGF0dGVuKClgIG92ZXJsb2FkcyBmb2xsb3cgdGhlIHNhbWUgY29udmVudGlvbiBhcwotICogZm9sbG93czoKLSAqCi0gKiAgICAgc3RhdHVzX3QgZmxhdHRlbihPYmplY3RUeXBlIGNvbnN0JiBvYmplY3QsCi0gKiAgICAgICAgICAgICAgICAgICAgICBbT3RoZXJUeXBlIGNvbnN0JiBvdGhlciwgLi4uXQotICogICAgICAgICAgICAgICAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLAotICogICAgICAgICAgICAgICAgICAgICAgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcykKLSAqCi0gKiAgICAgc3RhdHVzX3QgdW5mbGF0dGVuKE9iamVjdFR5cGUqIG9iamVjdCwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgW090aGVyVHlwZSogb3RoZXIsIC4uLixdCi0gKiAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwKLSAqICAgICAgICAgICAgICAgICAgICAgICAgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcykKLSAqCi0gKiBUaGUgbnVtYmVyIG9mIGBvdGhlcmAgcGFyYW1ldGVycyB2YXJpZXMgZGVwZW5kaW5nIG9uIHRoZSBgT2JqZWN0VHlwZWAuIEZvcgotICogZXhhbXBsZSwgaW4gdGhlIHByb2Nlc3Mgb2YgdW5mbGF0dGVuaW5nIGFuIG9iamVjdCB0aGF0IGNvbnRhaW5zCi0gKiBgaGlkbF9oYW5kbGVgLCBgb3RoZXJgIGlzIG5lZWRlZCB0byBob2xkIGBuYXRpdmVfaGFuZGxlX3RgIG9iamVjdHMgdGhhdCB3aWxsCi0gKiBiZSBjcmVhdGVkLgotICoKLSAqIFRoZSBsYXN0IGZvdXIgcGFyYW1ldGVycyBhbHdheXMgd29yayB0aGUgc2FtZSB3YXkgaW4gYWxsIG92ZXJsb2FkcyBvZgotICogYGZsYXR0ZW4oKWAgYW5kIGB1bmZsYXR0ZW4oKWA6Ci0gKiAtIEZvciBgZmxhdHRlbigpYCwgYGJ1ZmZlcmAgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIG5vbi1mZCBidWZmZXIgdG8gYmUgZmlsbGVkLAotICogICBgc2l6ZWAgaXMgdGhlIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IGBidWZmZXJgLAotICogICBgZmRzYCBpcyB0aGUgcG9pbnRlciB0byB0aGUgZmQgYnVmZmVyIHRvIGJlIGZpbGxlZCwgYW5kIGBudW1GZHNgIGlzIHRoZQotICogICBzaXplIChpbiBpbnRzKSBvZiB0aGUgZmQgYnVmZmVyIHBvaW50ZWQgdG8gYnkgYGZkc2AuCi0gKiAtIEZvciBgdW5mbGF0dGVuKClgLCBgYnVmZmVyYCBpcyB0aGUgcG9pbnRlciB0byB0aGUgbm9uLWZkIGJ1ZmZlciB0byBiZSByZWFkCi0gKiAgIGZyb20sIGBzaXplYCBpcyB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBub24tZmQgYnVmZmVyIHBvaW50ZWQgdG8gYnkKLSAqICAgYGJ1ZmZlcmAsIGBmZHNgIGlzIHRoZSBwb2ludGVyIHRvIHRoZSBmZCBidWZmZXIgdG8gYmUgcmVhZCBmcm9tLCBhbmQKLSAqICAgYG51bUZkc2AgaXMgdGhlIHNpemUgKGluIGludHMpIG9mIHRoZSBmZCBidWZmZXIgcG9pbnRlZCB0byBieSBgZmRzYC4KLSAqIC0gQWZ0ZXIgYSBzdWNjZXNzZnVsIGNhbGwgdG8gYGZsYXR0ZW4oKWAgb3IgYHVuZmxhdHRlbigpYCwgYGJ1ZmZlcmAgYW5kIGBmZHNgCi0gKiAgIHdpbGwgYmUgYWR2YW5jZWQsIHdoaWxlIGBzaXplYCBhbmQgYG51bUZkc2Agd2lsbCBiZSBkZWNyZWFzZWQgdG8gcmVmbGVjdAotICogICBob3cgbXVjaCBzdG9yYWdlL2RhdGEgb2YgdGhlIHR3byBidWZmZXJzIChmZCBhbmQgbm9uLWZkKSBoYXZlIGJlZW4gdXNlZC4KLSAqIC0gQWZ0ZXIgYW4gdW5zdWNjZXNzZnVsIGNhbGwsIHRoZSB2YWx1ZXMgb2YgYGJ1ZmZlcmAsIGBzaXplYCwgYGZkc2AgYW5kCi0gKiAgIGBudW1GZHNgIGFyZSBpbnZhbGlkLgotICoKLSAqIFRoZSByZXR1cm4gdmFsdWUgb2YgYSBzdWNjZXNzZnVsIGBmbGF0dGVuKClgIG9yIGB1bmZsYXR0ZW4oKWAgY2FsbCB3aWxsIGJlCi0gKiBgT0tgIChhbHNvIGFsaWFzZWQgYXMgYE5PX0VSUk9SYCkuIEFueSBvdGhlciB2YWx1ZXMgaW5kaWNhdGUgYSBmYWlsdXJlLgotICoKLSAqIEZvciBlYWNoIG9iamVjdCB0eXBlIHRoYXQgc3VwcG9ydHMgZmxhdHRlbmluZywgdGhlcmUgd2lsbCBiZSB0d28gYWNjb21wYW55aW5nCi0gKiBmdW5jdGlvbnM6IGBnZXRGbGF0dGVuZWRTaXplKClgIGFuZCBgZ2V0RmRDb3VudCgpYC4gYGdldEZsYXR0ZW5lZFNpemUoKWAgd2lsbAotICogcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHRoYXQgdGhlIG9iamVjdCB3aWxsIG5lZWQgZm9yCi0gKiBmbGF0dGVuaW5nLiBgZ2V0RmRDb3VudCgpYCB3aWxsIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgZmQgYnVmZmVyIHRoYXQgdGhlCi0gKiBvYmplY3Qgd2lsbCBuZWVkIGZvciBmbGF0dGVuaW5nLgotICoKLSAqIFRoZSBzZXQgb2YgdGhlc2UgZm91ciBmdW5jdGlvbnMsIGBnZXRGbGF0dGVuZWRTaXplKClgLCBgZ2V0RmRDb3VudCgpYCwKLSAqIGBmbGF0dGVuKClgIGFuZCBgdW5mbGF0dGVuKClgLCBhcmUgc2ltaWxhciB0byBmdW5jdGlvbnMgb2YgdGhlIHNhbWUgbmFtZSBpbgotICogdGhlIGFic3RyYWN0IGNsYXNzIGBGbGF0dGVuYWJsZWAuIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMgdGhhdCBmdW5jdGlvbnMgaW4KLSAqIHRoaXMgZmlsZSBhcmUgbm90IG1lbWJlciBmdW5jdGlvbnMgb2YgdGhlIG9iamVjdCB0eXBlLiBGb3IgZXhhbXBsZSwgd2Ugd3JpdGUKLSAqCi0gKiAgICAgZmxhdHRlbih4LCBidWZmZXIsIHNpemUsIGZkcywgbnVtRmRzKQotICoKLSAqIGluc3RlYWQgb2YKLSAqCi0gKiAgICAgeC5mbGF0dGVuKGJ1ZmZlciwgc2l6ZSwgZmRzLCBudW1GZHMpCi0gKgotICogYmVjYXVzZSB3ZSBjYW5ub3QgbW9kaWZ5IHRoZSB0eXBlIG9mIGB4YC4KLSAqCi0gKiBUaGVyZSBpcyBvbmUgZXhjZXB0aW9uIHRvIHRoZSBuYW1pbmcgY29udmVudGlvbjogYGhpZGxfaGFuZGxlYCB0aGF0Ci0gKiByZXByZXNlbnRzIGEgZmVuY2UuIFRoZSBmb3VyIGZ1bmN0aW9ucyBmb3IgdGhpcyAiRmVuY2UiIHR5cGUgaGF2ZSB0aGUgd29yZAotICogIkZlbmNlIiBhdHRjaGVkIHRvIHRoZWlyIG5hbWVzIGJlY2F1c2UgdGhlIG9iamVjdCB0eXBlLCB3aGljaCBpcwotICogYGhpZGxfaGFuZGxlYCwgZG9lcyBub3QgY2FycnkgdGhlIHNwZWNpYWwgbWVhbmluZyB0aGF0IHRoZSBvYmplY3QgaXRzZWxmIGNhbgotICogb25seSBjb250YWluIHplcm8gb3Igb25lIGZpbGUgZGVzY3JpcHRvci4KLSAqLwotCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvdWkvRmVuY2UuY3BwCi0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuIGEgZmVuY2UuCi0gKgotICogXHBhcmFtW2luXSBmZW5jZSBUaGUgaW5wdXQgZmVuY2Ugb2YgdHlwZSBgaGlkbF9oYW5kbGVgLgotICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKgotICogVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uIGFsd2F5cyByZXR1cm5zIDQsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YKLSAqIGJ5dGVzIHJlcXVpcmVkIHRvIHN0b3JlIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gdGhlIGZkCi0gKiBwYXJ0IG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqLwotc2l6ZV90IGdldEZlbmNlRmxhdHRlbmVkU2l6ZShoaWRsX2hhbmRsZSBjb25zdCYgZmVuY2UpOwotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBhIGZlbmNlLgotICoKLSAqIFxwYXJhbVtpbl0gZmVuY2UgVGhlIGlucHV0IGZlbmNlIG9mIHR5cGUgYGhpZGxfaGFuZGxlYC4KLSAqIFxyZXR1cm4gYDBgIGlmIFxwIGZlbmNlIGRvZXMgbm90IGNvbnRhaW4gYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IsIG9yIGAxYAotICogb3RoZXJ3aXNlLgotICovCi1zaXplX3QgZ2V0RmVuY2VGZENvdW50KGhpZGxfaGFuZGxlIGNvbnN0JiBmZW5jZSk7Ci0KLS8qKgotICogXGJyaWVmIFVuZmxhdHRlbiBgRmVuY2VgIHRvIGBoaWRsX2hhbmRsZWAuCi0gKgotICogXHBhcmFtW291dF0gZmVuY2UgVGhlIGRlc3RpbmF0aW9uIGBoaWRsX2hhbmRsZWAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBuYXRpdmUgaGFuZGxlLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCwgXHAgbmggd2lsbCBwb2ludCB0byBhIG5ld2x5IGNyZWF0ZWQKLSAqIG5hdGl2ZSBoYW5kbGUsIHdoaWNoIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAKLSAqIGFmdGVyd2FyZHMuCi0gKi8KLXN0YXR1c190IHVuZmxhdHRlbkZlbmNlKGhpZGxfaGFuZGxlKiBmZW5jZSwgbmF0aXZlX2hhbmRsZV90KiogbmgsCi0gICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcyk7Ci0KLS8qKgotICogXGJyaWVmIEZsYXR0ZW4gYGhpZGxfaGFuZGxlYCBhcyBgRmVuY2VgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBoaWRsX2hhbmRsZWAuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXR1c190IGZsYXR0ZW5GZW5jZShoaWRsX2hhbmRsZSBjb25zdCYgZmVuY2UsCi0gICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcyk7Ci0KLS8qKgotICogXGJyaWVmIFdyYXAgYEZlbmNlYCBpbiBgaGlkbF9oYW5kbGVgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIHdyYXBwZXIgb2YgdHlwZSBgaGlkbF9oYW5kbGVgLgotICogXHBhcmFtW291dF0gbmggVGhlIG5hdGl2ZSBoYW5kbGUgcG9pbnRlZCB0byBieSBccCB0LgotICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYEZlbmNlYC4KLSAqCi0gKiBPbiBzdWNjZXNzLCBccCBuaCB3aWxsIGhvbGQgYSBuZXdseSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUsIHdoaWNoIG11c3QgYmUKLSAqIGRlbGV0ZWQgbWFudWFsbHkgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAgYWZ0ZXJ3YXJkcy4KLSAqLwotLy8gd3JhcDogRmVuY2UgLT4gaGlkbF9oYW5kbGUKLWJvb2wgd3JhcEFzKGhpZGxfaGFuZGxlKiB0LCBuYXRpdmVfaGFuZGxlX3QqKiBuaCwgRmVuY2UgY29uc3QmIGwpOwotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBoaWRsX2hhbmRsZWAgdG8gYEZlbmNlYC4KLSAqCi0gKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgRmVuY2VgLiBgbGAgbXVzdCBub3QgaGF2ZSBiZWVuIHVzZWQKLSAqIChgbC0+aXNWYWxpZCgpYCBtdXN0IHJldHVybiBgZmFsc2VgKSBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQuCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgaGlkbF9oYW5kbGVgLgotICoKLSAqIElmIFxwIHQgY29udGFpbnMgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IsIGl0IHdpbGwgYmUgZHVwbGljYXRlZC4KLSAqLwotLy8gY29udmVydDogaGlkbF9oYW5kbGUgLT4gRmVuY2UKLWJvb2wgY29udmVydFRvKEZlbmNlKiBsLCBoaWRsX2hhbmRsZSBjb25zdCYgdCk7Ci0KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy91aS9GZW5jZVRpbWUuY3BwOiBGZW5jZVRpbWU6OlNuYXBzaG90Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgbm9uLWZkIGJ1ZmZlciByZXF1aXJlZCB0byBmbGF0dGVuCi0gKiBgRmVuY2VUaW1lU25hcHNob3RgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZlbmNlVGltZVNuYXBzaG90YC4KLSAqIFxyZXR1cm4gVGhlIHJlcXVpcmVkIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICovCi1zaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZShIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCBjb25zdCYgdCk7Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluCi0gKiBgRmVuY2VUaW1lU25hcHNob3RgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZlbmNlVGltZVNuYXBzaG90YC4KLSAqIFxyZXR1cm4gVGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCBzbmFwc2hvdC4KLSAqLwotc2l6ZV90IGdldEZkQ291bnQoSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3QgY29uc3QmIHQpOwotCi0vKioKLSAqIFxicmllZiBGbGF0dGVuIGBGZW5jZVRpbWVTbmFwc2hvdGAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEZlbmNlVGltZVNuYXBzaG90YC4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIHRoZSBmaWxlIGRlc2NyaXB0b3IgaW4gYHQuZmVuY2VgIGlmIGB0LnN0YXRlID09Ci0gKiBGRU5DRWAuCi0gKi8KLXN0YXR1c190IGZsYXR0ZW4oSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RmVuY2VUaW1lU25hcHNob3QgY29uc3QmIHQsCi0gICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcyk7Ci0KLS8qKgotICogXGJyaWVmIFVuZmxhdHRlbiBgRmVuY2VUaW1lU25hcHNob3RgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBGZW5jZVRpbWVTbmFwc2hvdGAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgdW5kZXJseWluZyBuYXRpdmUgaGFuZGxlLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCBhbmQgdGhlIGNvbnN0cnVjdGVkIHNuYXBzaG90IGNvbnRhaW5zIGEKLSAqIGZpbGUgZGVzY3JpcHRvciwgXHAgbmggd2lsbCBiZSBjcmVhdGVkIHRvIGhvbGQgdGhhdCBmaWxlIGRlc2NyaXB0b3IuIEluIHRoaXMKLSAqIGNhc2UsIFxwIG5oIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAgYWZ0ZXJ3YXJkcy4KLSAqLwotc3RhdHVzX3QgdW5mbGF0dGVuKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGZW5jZVRpbWVTbmFwc2hvdCogdCwgbmF0aXZlX2hhbmRsZV90KiogbmgsCi0gICAgICAgIHZvaWQgY29uc3QqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50IGNvbnN0KiYgZmRzLCBzaXplX3QmIG51bUZkcyk7Ci0KLS8vIFJlZjogZnJhbWV3b3Jrcy9uYXRpdmUvbGlicy9ndWkvRnJhbWVUaW1lc3RhbXBzLmNwcDogRnJhbWVFdmVudHNEZWx0YQotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIG5vbi1mZCBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbgotICogYEZyYW1lRXZlbnRzRGVsdGFgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZyYW1lRXZlbnRzRGVsdGFgLgotICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKi8KLXNpemVfdCBnZXRGbGF0dGVuZWRTaXplKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRzRGVsdGEgY29uc3QmIHQpOwotCi0vKioKLSAqIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbgotICogYEZyYW1lRXZlbnRzRGVsdGFgLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgaW5wdXQgYEZyYW1lRXZlbnRzRGVsdGFgLgotICogXHJldHVybiBUaGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCi0gKi8KLXNpemVfdCBnZXRGZENvdW50KEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRzRGVsdGEgY29uc3QmIHQpOwotCi0vKioKLSAqIFxicmllZiBVbmZsYXR0ZW4gYEZyYW1lRXZlbnRzRGVsdGFgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBGcmFtZUV2ZW50c0RlbHRhYC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSB1bmRlcmx5aW5nIGFycmF5IG9mIG5hdGl2ZSBoYW5kbGVzLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIElmIHRoZSByZXR1cm4gdmFsdWUgaXMgYE5PX0VSUk9SYCwgXHAgbmggd2lsbCBoYXZlIGxlbmd0aCA0LCBhbmQgaXQgd2lsbCBiZQotICogcG9wdWxhdGVkIHdpdGggYG51bGxwdHJgIG9yIG5ld2x5IGNyZWF0ZWQgaGFuZGxlcy4gRWFjaCBub24tbnVsbCBzbG90IGluIFxwCi0gKiBuaCB3aWxsIG5lZWQgdG8gYmUgZGVsZXRlZCBtYW51YWxseSB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KLSAqLwotc3RhdHVzX3QgdW5mbGF0dGVuKEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRzRGVsdGEqIHQsCi0gICAgICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+KiBuaCwKLSAgICAgICAgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQgY29uc3QqJiBmZHMsIHNpemVfdCYgbnVtRmRzKTsKLQotLyoqCi0gKiBcYnJpZWYgRmxhdHRlbiBgRnJhbWVFdmVudHNEZWx0YWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEZyYW1lRXZlbnRzRGVsdGFgLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KLSAqLwotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL2d1aS9GcmFtZVRpbWVzdGFtcC5jcHA6Ci0vLyAgICAgIEZyYW1lRXZlbnRzRGVsdGE6OmZsYXR0ZW4KLXN0YXR1c190IGZsYXR0ZW4oSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudHNEZWx0YSBjb25zdCYgdCwKLSAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCBudW1GZHMpOwotCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0ZyYW1lVGltZXN0YW1wcy5jcHA6IEZyYW1lRXZlbnRIaXN0b3J5RGVsdGEKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBub24tZmQgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4KLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqIFxyZXR1cm4gVGhlIHJlcXVpcmVkIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICovCi1zaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZSgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgdCk7Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBpbnB1dCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKiBccmV0dXJuIFRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KLSAqLwotc2l6ZV90IGdldEZkQ291bnQoCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGEgY29uc3QmIHQpOwotCi0vKioKLSAqIFxicmllZiBVbmZsYXR0ZW4gYEZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIGRlc3RpbmF0aW9uIGBGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqIFxwYXJhbVtvdXRdIG5oIFRoZSB1bmRlcmx5aW5nIGFycmF5IG9mIGFycmF5cyBvZiBuYXRpdmUgaGFuZGxlcy4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGBOT19FUlJPUmAsIFxwIG5oIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggYG51bGxwdHJgIG9yCi0gKiBuZXdseSBjcmVhdGVkIGhhbmRsZXMuIFRoZSBzZWNvbmQgZGltZW5zaW9uIG9mIFxwIG5oIHdpbGwgYmUgNC4gRWFjaCBub24tbnVsbAotICogc2xvdCBpbiBccCBuaCB3aWxsIG5lZWQgdG8gYmUgZGVsZXRlZCBtYW51YWxseSB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KLSAqLwotc3RhdHVzX3QgdW5mbGF0dGVuKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhKiB0LAotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+KiBuaCwKLSAgICAgICAgdm9pZCBjb25zdComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQgY29uc3QqJiBmZHMsIHNpemVfdCYgbnVtRmRzKTsKLQotLyoqCi0gKiBcYnJpZWYgRmxhdHRlbiBgRnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IG5vbi1mZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBmZHMgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gbnVtRmRzIFRoZSBzaXplIG9mIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4gXHAgdC4KLSAqLwotc3RhdHVzX3QgZmxhdHRlbigKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgdCwKLSAgICAgICAgdm9pZComIGJ1ZmZlciwgc2l6ZV90JiBzaXplLCBpbnQqJiBmZHMsIHNpemVfdCYgbnVtRmRzKTsKLQotLyoqCi0gKiBcYnJpZWYgV3JhcCBgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURhdGFgIGluCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YWAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgYXJyYXkgb2YgYXJyYXkgb2YgbmF0aXZlIGhhbmRsZXMgdGhhdCBhcmUgcmVmZXJyZWQgdG8gYnkKLSAqIG1lbWJlcnMgb2YgXHAgdC4KLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGA6OmFuZHJvaWQ6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgLgotICoKLSAqIE9uIHN1Y2Nlc3MsIGVhY2ggbWVtYmVyIG9mIFxwIG5oIHdpbGwgYmUgZWl0aGVyIGBudWxscHRyYCBvciBhIG5ld2x5IGNyZWF0ZWQKLSAqIG5hdGl2ZSBoYW5kbGUuIEFsbCB0aGUgbm9uLWBudWxscHRyYCBlbGVtZW50cyBtdXN0IGJlIGRlbGV0ZWQgaW5kaXZpZHVhbGx5Ci0gKiB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KLSAqLwotYm9vbCB3cmFwQXMoSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSogdCwKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiogbmgsCi0gICAgICAgIDo6YW5kcm9pZDo6RnJhbWVFdmVudEhpc3RvcnlEZWx0YSBjb25zdCYgbCk7Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkZyYW1lRXZlbnRIaXN0b3J5RGVsdGFgIHRvCi0gKiBgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBccGFyYW1bb3V0XSBsIFRoZSBkZXN0aW5hdGlvbiBgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhYC4KLSAqCi0gKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZHVwbGljYXRlIGFsbCBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgotICovCi1ib29sIGNvbnZlcnRUbygKLSAgICAgICAgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhKiBsLAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGNvbnN0JiB0KTsKLQotLy8gUmVmOiBmcmFtZXdvcmtzL25hdGl2ZS9saWJzL3VpL1JlZ2lvbi5jcHAKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgcmVxdWlyZWQgdG8gZmxhdHRlbiBgUmVnaW9uYC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBSZWdpb25gLgotICogXHJldHVybiBUaGUgcmVxdWlyZWQgc2l6ZSBvZiB0aGUgZmxhdCBidWZmZXIuCi0gKi8KLXNpemVfdCBnZXRGbGF0dGVuZWRTaXplKFJlZ2lvbiBjb25zdCYgdCk7Ci0KLS8qKgotICogXGJyaWVmIFVuZmxhdHRlbiBgUmVnaW9uYC4KLSAqCi0gKiBccGFyYW1bb3V0XSB0IFRoZSBkZXN0aW5hdGlvbiBgUmVnaW9uYC4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBzaXplIFRoZSBzaXplIG9mIHRoZSBmbGF0IGJ1ZmZlci4KLSAqIFxyZXR1cm4gYE5PX0VSUk9SYCBvbiBzdWNjZXNzOyBvdGhlciB2YWx1ZSBvbiBmYWlsdXJlLgotICovCi1zdGF0dXNfdCB1bmZsYXR0ZW4oUmVnaW9uKiB0LCB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUpOwotCi0vKioKLSAqIFxicmllZiBGbGF0dGVuIGBSZWdpb25gLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZWdpb25gLgotICogXHBhcmFtW2luLG91dF0gYnVmZmVyIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKi8KLXN0YXR1c190IGZsYXR0ZW4oUmVnaW9uIGNvbnN0JiB0LCB2b2lkKiYgYnVmZmVyLCBzaXplX3QmIHNpemUpOwotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGA6OmFuZHJvaWQ6OlJlZ2lvbmAgdG8gYFJlZ2lvbmAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYFJlZ2lvbmAuCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgOjphbmRyb2lkOjpSZWdpb25gLgotICovCi0vLyBjb252ZXJ0OiA6OmFuZHJvaWQ6OlJlZ2lvbiAtPiBSZWdpb24KLWJvb2wgY29udmVydFRvKFJlZ2lvbiogdCwgOjphbmRyb2lkOjpSZWdpb24gY29uc3QmIGwpOwotCi0vKioKLSAqIFxicmllZiBDb252ZXJ0IGBSZWdpb25gIHRvIGA6OmFuZHJvaWQ6OlJlZ2lvbmAuCi0gKgotICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYDo6YW5kcm9pZDo6UmVnaW9uYC4KLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBSZWdpb25gLgotICovCi0vLyBjb252ZXJ0OiBSZWdpb24gLT4gOjphbmRyb2lkOjpSZWdpb24KLWJvb2wgY29udmVydFRvKDo6YW5kcm9pZDo6UmVnaW9uKiBsLCBSZWdpb24gY29uc3QmIHQpOwotCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0JHcmFwaGljQnVmZmVyUHJvZHVjZXIuY3BwOgotLy8gICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0Ci0KLS8qKgotICogXGJyaWVmIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIHJlcXVpcmVkIHRvIGZsYXR0ZW4KLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqIFxyZXR1cm4gVGhlIHJlcXVpcmVkIHNpemUgb2YgdGhlIGZsYXQgYnVmZmVyLgotICovCi1zaXplX3QgZ2V0RmxhdHRlbmVkU2l6ZShIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0IGNvbnN0JiB0KTsKLQotLyoqCi0gKiBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgZmlsZSBkZXNjcmlwdG9ycyBjb250YWluZWQgaW4KLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIGlucHV0IGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqIFxyZXR1cm4gVGhlIG51bWJlciBvZiBmaWxlIGRlc2NyaXB0b3JzIGNvbnRhaW5lZCBpbiBccCB0LgotICovCi1zaXplX3QgZ2V0RmRDb3VudCgKLSAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgdCk7Ci0vKioKLSAqIFxicmllZiBGbGF0dGVuIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKiBccGFyYW1bb3V0XSBuaCBUaGUgbmF0aXZlIGhhbmRsZSBjbG9uZWQgZnJvbSBgdC5mZW5jZWAuCi0gKiBccGFyYW1baW4sb3V0XSBidWZmZXIgVGhlIHBvaW50ZXIgdG8gdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIHNpemUgVGhlIHNpemUgb2YgdGhlIGZsYXQgbm9uLWZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIGZkcyBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccGFyYW1baW4sb3V0XSBudW1GZHMgVGhlIHNpemUgb2YgdGhlIGZsYXQgZmQgYnVmZmVyLgotICogXHJldHVybiBgTk9fRVJST1JgIG9uIHN1Y2Nlc3M7IG90aGVyIHZhbHVlIG9uIGZhaWx1cmUuCi0gKgotICogVGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSB0aGUgZmlsZSBkZXNjcmlwdG9yIGluIGB0LmZlbmNlYC4gKi8KLXN0YXR1c190IGZsYXR0ZW4oSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgdCwKLSAgICAgICAgbmF0aXZlX2hhbmRsZV90KiogbmgsCi0gICAgICAgIHZvaWQqJiBidWZmZXIsIHNpemVfdCYgc2l6ZSwgaW50KiYgZmRzLCBzaXplX3QmIG51bUZkcyk7Ci0KLS8qKgotICogXGJyaWVmIFVuZmxhdHRlbiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgZGVzdGluYXRpb24gYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgbmF0aXZlIGhhbmRsZSBmb3IgYHQtPmZlbmNlYC4KLSAqIFxwYXJhbVtpbixvdXRdIGJ1ZmZlciBUaGUgcG9pbnRlciB0byB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gc2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBub24tZmQgYnVmZmVyLgotICogXHBhcmFtW2luLG91dF0gZmRzIFRoZSBwb2ludGVyIHRvIHRoZSBmbGF0IGZkIGJ1ZmZlci4KLSAqIFxwYXJhbVtpbixvdXRdIG51bUZkcyBUaGUgc2l6ZSBvZiB0aGUgZmxhdCBmZCBidWZmZXIuCi0gKiBccmV0dXJuIGBOT19FUlJPUmAgb24gc3VjY2Vzczsgb3RoZXIgdmFsdWUgb24gZmFpbHVyZS4KLSAqCi0gKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGBOT19FUlJPUmAgYW5kIGB0LT5mZW5jZWAgY29udGFpbnMgYSB2YWxpZCBmaWxlCi0gKiBkZXNjcmlwdG9yLCBccCBuaCB3aWxsIGJlIGEgbmV3bHkgY3JlYXRlZCBuYXRpdmUgaGFuZGxlIGhvbGRpbmcgdGhhdCBmaWxlCi0gKiBkZXNjcmlwdG9yLiBccCBuaCBuZWVkcyB0byBiZSBkZWxldGVkIHdpdGggYG5hdGl2ZV9oYW5kbGVfZGVsZXRlKClgCi0gKiBhZnRlcndhcmRzLgotICovCi1zdGF0dXNfdCB1bmZsYXR0ZW4oCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQqIHQsIG5hdGl2ZV9oYW5kbGVfdCoqIG5oLAotICAgICAgICB2b2lkIGNvbnN0KiYgYnVmZmVyLCBzaXplX3QmIHNpemUsIGludCBjb25zdComIGZkcywgc2l6ZV90JiBudW1GZHMpOwotCi0vKioKLSAqIFxicmllZiBXcmFwIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YCBpbgotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIFxwYXJhbVtvdXRdIHQgVGhlIHdyYXBwZXIgb2YgdHlwZQotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICogXHBhcmFtW291dF0gbmggVGhlIHVuZGVybHlpbmcgbmF0aXZlIGhhbmRsZSBmb3IgYHQtPmZlbmNlYC4KLSAqIFxwYXJhbVtpbl0gbCBUaGUgc291cmNlIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0YC4KLSAqCi0gKiBJZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGB0cnVlYCBhbmQgYHQtPmZlbmNlYCBjb250YWlucyBhIHZhbGlkIGZpbGUKLSAqIGRlc2NyaXB0b3IsIFxwIG5oIHdpbGwgYmUgYSBuZXdseSBjcmVhdGVkIG5hdGl2ZSBoYW5kbGUgaG9sZGluZyB0aGF0IGZpbGUKLSAqIGRlc2NyaXB0b3IuIFxwIG5oIG5lZWRzIHRvIGJlIGRlbGV0ZWQgd2l0aCBgbmF0aXZlX2hhbmRsZV9kZWxldGUoKWAKLSAqIGFmdGVyd2FyZHMuCi0gKi8KLWJvb2wgd3JhcEFzKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0KiB0LAotICAgICAgICBuYXRpdmVfaGFuZGxlX3QqKiBuaCwKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dCBjb25zdCYgbCk7Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgIHRvCi0gKiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJJbnB1dGAuCi0gKgotICogXHBhcmFtW291dF0gbCBUaGUgZGVzdGluYXRpb24gYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICogXHBhcmFtW2luXSB0IFRoZSBzb3VyY2UgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXRgLgotICoKLSAqIElmIGB0LmZlbmNlYCBoYXMgYSB2YWxpZCBmaWxlIGRlc2NyaXB0b3IsIGl0IHdpbGwgYmUgZHVwbGljYXRlZC4KLSAqLwotYm9vbCBjb252ZXJ0VG8oCi0gICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQqIGwsCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgY29uc3QmIHQpOwotCi0vLyBSZWY6IGZyYW1ld29ya3MvbmF0aXZlL2xpYnMvZ3VpL0JHcmFwaGljQnVmZmVyUHJvZHVjZXIuY3BwOgotLy8gICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dAotCi0vKioKLSAqIFxicmllZiBXcmFwIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAgaW4KLSAqIGBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCi0gKgotICogXHBhcmFtW291dF0gdCBUaGUgd3JhcHBlciBvZiB0eXBlCi0gKiBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgotICogXHBhcmFtW291dF0gbmggVGhlIGFycmF5IG9mIGFycmF5IG9mIG5hdGl2ZSBoYW5kbGVzIHRoYXQgYXJlIHJlZmVycmVkIHRvIGJ5Ci0gKiBtZW1iZXJzIG9mIFxwIHQuCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgotICoKLSAqIE9uIHN1Y2Nlc3MsIGVhY2ggbWVtYmVyIG9mIFxwIG5oIHdpbGwgYmUgZWl0aGVyIGBudWxscHRyYCBvciBhIG5ld2x5IGNyZWF0ZWQKLSAqIG5hdGl2ZSBoYW5kbGUuIEFsbCB0aGUgbm9uLWBudWxscHRyYCBlbGVtZW50cyBtdXN0IGJlIGRlbGV0ZWQgaW5kaXZpZHVhbGx5Ci0gKiB3aXRoIGBuYXRpdmVfaGFuZGxlX2RlbGV0ZSgpYC4KLSAqLwotLy8gd3JhcDogQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgLT4KLS8vIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0Ci1ib29sIHdyYXBBcyhIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCogdCwKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiogbmgsCi0gICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IGNvbnN0JiBsKTsKLQotLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgIHRvCi0gKiBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgotICoKLSAqIFxwYXJhbVtvdXRdIGwgVGhlIGRlc3RpbmF0aW9uIGBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dGAuCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXRgLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gd2lsbCBkdXBsaWNhdGUgYWxsIGZpbGUgZGVzY3JpcHRvcnMgY29udGFpbmVkIGluIFxwIHQuCi0gKi8KLS8vIGNvbnZlcnQ6IEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IC0+Ci0vLyBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dAotYm9vbCBjb252ZXJ0VG8oCi0gICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0KiBsLAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBjb25zdCYgdCk7Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYCB0bwotICogYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYC4KLSAqCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICovCi1IR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSB0b0hpZGxEaXNjb25uZWN0TW9kZSgKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGUgbCk7Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYCB0bwotICogYEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkRpc2Nvbm5lY3RNb2RlYC4KLSAqCi0gKiBccGFyYW1baW5dIGwgVGhlIHNvdXJjZSBgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGVgLgotICovCi1CR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSB0b0d1aURpc2Nvbm5lY3RNb2RlKAotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpEaXNjb25uZWN0TW9kZSB0KTsKLQotfSAgLy8gbmFtZXNwYWNlIGNvbnZlcnNpb24KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gTUVESUFfU1RBR0VGUklHSFRfQlFIRUxQRVJfQ09OVkVSU0lPTl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvYnFoZWxwZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9icWhlbHBlci9HcmFwaGljQnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaAppbmRleCBhYmM4OTEwLi5iNGM0ZDRhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL0dyYXBoaWNCdWZmZXJTb3VyY2UuaApAQCAtMTksOCArMTksNiBAQAogI2RlZmluZSBHUkFQSElDX0JVRkZFUl9TT1VSQ0VfSF8KIAogI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KLSNpbmNsdWRlIDxndWkvQnVmZmVyUXVldWUuaD4KLSNpbmNsdWRlIDxndWkvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CkBAIC0yOCwxMyArMjYsMTcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyUmVmbGVjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29tcG9uZW50V3JhcHBlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzIuMC9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdXNpbmcgOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1czsKIAogc3RydWN0IEZyYW1lRHJvcHBlcjsKLQorY2xhc3MgQnVmZmVySXRlbTsKK2NsYXNzIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7CitjbGFzcyBJR3JhcGhpY0J1ZmZlckNvbnN1bWVyOwogLyoKICAqIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBmZWVkIGNvZGVjcyBmcm9tIGEgU3VyZmFjZSB2aWEgQnVmZmVyUXVldWUgb3IKICAqIEhXIHByb2R1Y2VyLgpAQCAtNjgsNyArNzAsNyBAQAogICogKGV2ZW4gaWYgaXQgd2FzIGRyb3BwZWQpIHRvIHJlZW5jb2RlIGl0IGFmdGVyIGFuIGludGVydmFsIGlmIG5vIGZ1cnRoZXIKICAqIGZyYW1lcyBhcmUgc2VudCBieSB0aGUgcHJvZHVjZXIuCiAgKi8KLWNsYXNzIEdyYXBoaWNCdWZmZXJTb3VyY2UgOiBwdWJsaWMgQnVmZmVyUXVldWU6OkNvbnN1bWVyTGlzdGVuZXIgeworY2xhc3MgR3JhcGhpY0J1ZmZlclNvdXJjZSA6IHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKICAgICBHcmFwaGljQnVmZmVyU291cmNlKCk7CiAKQEAgLTgyLDkgKzg0LDE3IEBACiAKICAgICAvLyBSZXR1cm5zIHRoZSBoYW5kbGUgdG8gdGhlIHByb2R1Y2VyIHNpZGUgb2YgdGhlIEJ1ZmZlclF1ZXVlLiAgQnVmZmVycwogICAgIC8vIHF1ZXVlZCBvbiB0aGlzIHdpbGwgYmUgcmVjZWl2ZWQgYnkgR3JhcGhpY0J1ZmZlclNvdXJjZS4KLSAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVByb2R1Y2VyOwotICAgIH0KKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBnZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCkgY29uc3Q7CisKKyAgICAvLyBSZXR1cm5zIHRoZSBoYW5kbGUgdG8gdGhlIGJ1ZmZlcnF1ZXVlIEhBTCAoVjFfMCkgcHJvZHVjZXIgc2lkZSBvZiB0aGUgQnVmZmVyUXVldWUuCisgICAgLy8gQnVmZmVycyBxdWV1ZWQgb24gdGhpcyB3aWxsIGJlIHJlY2VpdmVkIGJ5IEdyYXBoaWNCdWZmZXJTb3VyY2UuCisgICAgc3A8OjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjpJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPgorICAgICAgICBnZXRIR3JhcGhpY0J1ZmZlclByb2R1Y2VyX1YxXzAoKSBjb25zdDsKKworICAgIC8vIFJldHVybnMgdGhlIGhhbmRsZSB0byB0aGUgYnVmZmVycXVldWUgSEFMIHByb2R1Y2VyIHNpZGUgb2YgdGhlIEJ1ZmZlclF1ZXVlLgorICAgIC8vIEJ1ZmZlcnMgcXVldWVkIG9uIHRoaXMgd2lsbCBiZSByZWNlaXZlZCBieSBHcmFwaGljQnVmZmVyU291cmNlLgorICAgIHNwPDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjJfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4KKyAgICAgICAgZ2V0SEdyYXBoaWNCdWZmZXJQcm9kdWNlcigpIGNvbnN0OwogCiAgICAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBjb21wb25lbnQgdHJhbnNpdGlvbnMgdG8gcnVubmluZyBzdGF0ZSwgd2hpY2ggbWVhbnMKICAgICAvLyB3ZSBjYW4gc3RhcnQgaGFuZGluZyBpdCBidWZmZXJzLiAgSWYgd2UgYWxyZWFkeSBoYXZlIGJ1ZmZlcnMgb2YgZGF0YQpAQCAtMTkwLDggKzIwMCw2IEBACiAgICAgc3RhdHVzX3Qgc2V0Q29sb3JBc3BlY3RzKGludDMyX3QgYXNwZWN0c1BhY2tlZCk7CiAKIHByb3RlY3RlZDoKLSAgICAvLyBCUTo6Q29uc3VtZXJMaXN0ZW5lciBpbnRlcmZhY2UKLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAgIC8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGludGVyZmFjZSwgY2FsbGVkIHdoZW4gYSBuZXcgZnJhbWUgb2YKICAgICAvLyBkYXRhIGlzIGF2YWlsYWJsZS4gIElmIHdlJ3JlIGV4ZWN1dGluZyBhbmQgYSBjb2RlYyBidWZmZXIgaXMKQEAgLTE5OSwxOSArMjA3LDI0IEBACiAgICAgLy8gaW50byB0aGUgY29kZWMgYnVmZmVyLCBhbmQgY2FsbCBFbXB0eVtUaGlzXUJ1ZmZlci4gIElmIHdlJ3JlIG5vdCB5ZXQKICAgICAvLyBleGVjdXRpbmcgb3IgdGhlcmUncyBubyBjb2RlYyBidWZmZXIgYXZhaWxhYmxlLCB3ZSBqdXN0IGluY3JlbWVudAogICAgIC8vIG1OdW1GcmFtZXNBdmFpbGFibGUgYW5kIHJldHVybi4KLSAgICB2b2lkIG9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgb3ZlcnJpZGU7CisgICAgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIDsKIAogICAgIC8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGludGVyZmFjZSwgY2FsbGVkIHdoZW4gdGhlIGNsaWVudCBoYXMKICAgICAvLyByZWxlYXNlZCBvbmUgb3IgbW9yZSBHcmFwaGljQnVmZmVycy4gIFdlIGNsZWFyIG91dCB0aGUgYXBwcm9wcmlhdGUKICAgICAvLyBzZXQgb2YgbUJ1ZmZlclNsb3QgZW50cmllcy4KLSAgICB2b2lkIG9uQnVmZmVyc1JlbGVhc2VkKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBvbkJ1ZmZlcnNSZWxlYXNlZCgpIDsKIAogICAgIC8vIEJ1ZmZlclF1ZXVlOjpDb25zdW1lckxpc3RlbmVyIGludGVyZmFjZSwgY2FsbGVkIHdoZW4gdGhlIGNsaWVudCBoYXMKICAgICAvLyBjaGFuZ2VkIHRoZSBzaWRlYmFuZCBzdHJlYW0uIEdyYXBoaWNCdWZmZXJTb3VyY2UgZG9lc24ndCBoYW5kbGUgc2lkZWJhbmQKICAgICAvLyBzdHJlYW1zIHNvIHRoaXMgaXMgYSBuby1vcCAoYW5kIHNob3VsZCBuZXZlciBiZSBjYWxsZWQpLgotICAgIHZvaWQgb25TaWRlYmFuZFN0cmVhbUNoYW5nZWQoKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uU2lkZWJhbmRTdHJlYW1DaGFuZ2VkKCkgOwogCiBwcml2YXRlOgorICAgIC8vIEJROjpDb25zdW1lckxpc3RlbmVyIGludGVyZmFjZQorICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHN0cnVjdCBDb25zdW1lclByb3h5OworICAgIHNwPENvbnN1bWVyUHJveHk+IG1Db25zdW1lclByb3h5OworCiAgICAgLy8gTG9jaywgY292ZXJzIGFsbCBtZW1iZXIgdmFyaWFibGVzLgogICAgIG11dGFibGUgTXV0ZXggbU11dGV4OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGRmMjBmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIE1FRElBX1NUQUdFRlJJR0hUX1dHUkFQSElDQlVGRkVSUFJPRFVDRVJfSF8KLSNkZWZpbmUgTUVESUFfU1RBR0VGUklHSFRfV0dSQVBISUNCVUZGRVJQUk9EVUNFUl9IXwotCi0jaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0JpbmRlci5oPgotI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+Ci0jaW5jbHVkZSA8Z3VpL0lQcm9kdWNlckxpc3RlbmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dQcm9kdWNlckxpc3RlbmVyLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgotCi0jaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9ncmFwaGljcy9idWZmZXJxdWV1ZS8xLjAvSUdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpWMV8wOjpBbndCdWZmZXI7Ci11c2luZyA6OmFuZHJvaWQ6OmhpZGw6OmJhc2U6OlYxXzA6OklCYXNlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9hcnJheTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfaGFuZGxlOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF9tZW1vcnk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3N0cmluZzsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfdmVjOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6UmV0dXJuOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6Vm9pZDsKLXVzaW5nIDo6YW5kcm9pZDo6c3A7Ci0KLXR5cGVkZWYgOjphbmRyb2lkOjpoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjoKLSAgICAgICAgSUdyYXBoaWNCdWZmZXJQcm9kdWNlciBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwotdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OgotICAgICAgICBJUHJvZHVjZXJMaXN0ZW5lciBIUHJvZHVjZXJMaXN0ZW5lcjsKLQotdHlwZWRlZiA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXIgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKLXR5cGVkZWYgOjphbmRyb2lkOjpJUHJvZHVjZXJMaXN0ZW5lciBCUHJvZHVjZXJMaXN0ZW5lcjsKLXVzaW5nIDo6YW5kcm9pZDo6Qm5HcmFwaGljQnVmZmVyUHJvZHVjZXI7Ci0KLSNpZm5kZWYgTE9HCi1zdHJ1Y3QgTE9HX2R1bW15IHsKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgICBMT0dfZHVtbXkmIG9wZXJhdG9yPDwgKGNvbnN0IFQmKSB7IHJldHVybiAqdGhpczsgfQotfTsKLQotI2RlZmluZSBMT0coeCkgIExPR19kdW1teSgpCi0jZW5kaWYKLQotLy8gSW5zdGFudGlhdGUgb25seSBpZiBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGlzIGJhc2Ugb2YgQkFTRS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBCQVNFLAotICAgICAgICAgIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19iYXNlX29mPEhHcmFwaGljQnVmZmVyUHJvZHVjZXIsIEJBU0U+Ojp2YWx1ZT46OnR5cGU+Ci1zdHJ1Y3QgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXIgOiBwdWJsaWMgQkFTRSB7Ci0gICAgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXIoc3A8QkdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gY29uc3QmIGJhc2UpIDogbUJhc2UoYmFzZSkge30KLSAgICBSZXR1cm48dm9pZD4gcmVxdWVzdEJ1ZmZlcihpbnQzMl90IHNsb3QsIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnJlcXVlc3RCdWZmZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKLSAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gYnVmOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQmFzZS0+cmVxdWVzdEJ1ZmZlcihzbG90LCAmYnVmKTsKLSAgICAgICAgQW53QnVmZmVyIGFud0J1ZmZlcjsKLSAgICAgICAgaWYgKGJ1ZiAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICA6OmFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmYW53QnVmZmVyLCAqYnVmKTsKLSAgICAgICAgfQotICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCBhbndCdWZmZXIpOwotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIFJldHVybjxpbnQzMl90PiBzZXRNYXhEZXF1ZXVlZEJ1ZmZlckNvdW50KGludDMyX3QgbWF4RGVxdWV1ZWRCdWZmZXJzKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+c2V0TWF4RGVxdWV1ZWRCdWZmZXJDb3VudCgKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KG1heERlcXVldWVkQnVmZmVycykpKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48aW50MzJfdD4gc2V0QXN5bmNNb2RlKGJvb2wgYXN5bmMpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5zZXRBc3luY01vZGUoYXN5bmMpKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gZGVxdWV1ZUJ1ZmZlcigKLSAgICAgICAgICAgIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsCi0gICAgICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBmb3JtYXQsIHVpbnQzMl90IHVzYWdlLAotICAgICAgICAgICAgYm9vbCBnZXRGcmFtZVRpbWVzdGFtcHMsIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmRlcXVldWVCdWZmZXJfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKLSAgICAgICAgaW50IHNsb3Q7Ci0gICAgICAgIHNwPEZlbmNlPiBmZW5jZTsKLSAgICAgICAgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIG91dFRpbWVzdGFtcHM7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5kZXF1ZXVlQnVmZmVyKAotICAgICAgICAgICAgJnNsb3QsICZmZW5jZSwgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PDo6YW5kcm9pZDo6UGl4ZWxGb3JtYXQ+KGZvcm1hdCksIHVzYWdlLCBudWxscHRyLAotICAgICAgICAgICAgZ2V0RnJhbWVUaW1lc3RhbXBzID8gJm91dFRpbWVzdGFtcHMgOiBudWxscHRyKTsKLSAgICAgICAgaGlkbF9oYW5kbGUgdEZlbmNlOwotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIHRPdXRUaW1lc3RhbXBzOwotCi0gICAgICAgIG5hdGl2ZV9oYW5kbGVfdCogbmggPSBudWxscHRyOwotICAgICAgICBpZiAoKGZlbmNlID09IG51bGxwdHIpIHx8ICE6OmFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmdEZlbmNlLCAmbmgsICpmZW5jZSkpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpkZXF1ZXVlQnVmZmVyIC0gIgotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvdXRwdXQgZmVuY2UiOwotICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwKLSAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHNsb3QpLAotICAgICAgICAgICAgICAgICAgICAgdEZlbmNlLAotICAgICAgICAgICAgICAgICAgICAgdE91dFRpbWVzdGFtcHMpOwotICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICAgICAgfQotICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiA+IG5oQUE7Ci0gICAgICAgIGlmIChnZXRGcmFtZVRpbWVzdGFtcHMgJiYgITo6YW5kcm9pZDo6Y29udmVyc2lvbjo6d3JhcEFzKCZ0T3V0VGltZXN0YW1wcywgJm5oQUEsIG91dFRpbWVzdGFtcHMpKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6ZGVxdWV1ZUJ1ZmZlciAtICIKLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IHRpbWVzdGFtcHMiOwotICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwKLSAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDMyX3Q+KHNsb3QpLAotICAgICAgICAgICAgICAgICAgICAgdEZlbmNlLAotICAgICAgICAgICAgICAgICAgICAgdE91dFRpbWVzdGFtcHMpOwotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4oc2xvdCksCi0gICAgICAgICAgICAgICAgdEZlbmNlLAotICAgICAgICAgICAgICAgIHRPdXRUaW1lc3RhbXBzKTsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotICAgICAgICBpZiAoZ2V0RnJhbWVUaW1lc3RhbXBzKSB7Ci0gICAgICAgICAgICBmb3IgKGF1dG8mIG5oQSA6IG5oQUEpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGF1dG8mIGhhbmRsZSA6IG5oQSkgewotICAgICAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIFJldHVybjxpbnQzMl90PiBkZXRhY2hCdWZmZXIoaW50MzJfdCBzbG90KSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+ZGV0YWNoQnVmZmVyKHNsb3QpKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gZGV0YWNoTmV4dEJ1ZmZlcihIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpkZXRhY2hOZXh0QnVmZmVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7Ci0gICAgICAgIHNwPEdyYXBoaWNCdWZmZXI+IG91dEJ1ZmZlcjsKLSAgICAgICAgc3A8RmVuY2U+IG91dEZlbmNlOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQmFzZS0+ZGV0YWNoTmV4dEJ1ZmZlcigmb3V0QnVmZmVyLCAmb3V0RmVuY2UpOwotICAgICAgICBBbndCdWZmZXIgdEJ1ZmZlcjsKLSAgICAgICAgaGlkbF9oYW5kbGUgdEZlbmNlOwotCi0gICAgICAgIGlmIChvdXRCdWZmZXIgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmRldGFjaE5leHRCdWZmZXIgLSAiCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIG91dHB1dCBidWZmZXIiOwotICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgdEJ1ZmZlciwgdEZlbmNlKTsKLSAgICAgICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgOjphbmRyb2lkOjpjb252ZXJzaW9uOjp3cmFwQXMoJnRCdWZmZXIsICpvdXRCdWZmZXIpOwotICAgICAgICBuYXRpdmVfaGFuZGxlX3QqIG5oID0gbnVsbHB0cjsKLSAgICAgICAgaWYgKChvdXRGZW5jZSAhPSBudWxscHRyKSAmJiAhOjphbmRyb2lkOjpjb252ZXJzaW9uOjp3cmFwQXMoJnRGZW5jZSwgJm5oLCAqb3V0RmVuY2UpKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6ZGV0YWNoTmV4dEJ1ZmZlciAtICIKLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IGZlbmNlIjsKLSAgICAgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIHRCdWZmZXIsIHRGZW5jZSk7Ci0gICAgICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oc3RhdHVzKSwgdEJ1ZmZlciwgdEZlbmNlKTsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobmgpOwotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBhdHRhY2hCdWZmZXIoY29uc3QgQW53QnVmZmVyJiBidWZmZXIsIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmF0dGFjaEJ1ZmZlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgewotICAgICAgICBpbnQgb3V0U2xvdDsKLSAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4gbEJ1ZmZlciA9IG5ldyBHcmFwaGljQnVmZmVyKCk7Ci0gICAgICAgIGlmICghOjphbmRyb2lkOjpjb252ZXJzaW9uOjpjb252ZXJ0VG8obEJ1ZmZlci5nZXQoKSwgYnVmZmVyKSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmF0dGFjaEJ1ZmZlciAtICIKLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaW5wdXQgbmF0aXZlIHdpbmRvdyBidWZmZXIiOwotICAgICAgICAgICAgX2hpZGxfY2Ioc3RhdGljX2Nhc3Q8aW50MzJfdD4oQkFEX1ZBTFVFKSwgLTEpOwotICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICAgICAgfQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQmFzZS0+YXR0YWNoQnVmZmVyKCZvdXRTbG90LCBsQnVmZmVyKTsKLQotICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCBzdGF0aWNfY2FzdDxpbnQzMl90PihvdXRTbG90KSk7Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IHF1ZXVlQnVmZmVyKAotICAgICAgICAgICAgaW50MzJfdCBzbG90LCBjb25zdCBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlcklucHV0JiBpbnB1dCwKLSAgICAgICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OnF1ZXVlQnVmZmVyX2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7Ci0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IHRPdXRwdXQ7Ci0gICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgbElucHV0KAotICAgICAgICAgICAgICAgIDAsIGZhbHNlLCBIQUxfREFUQVNQQUNFX1VOS05PV04sCi0gICAgICAgICAgICAgICAgOjphbmRyb2lkOjpSZWN0KDAsIDAsIDEsIDEpLAotICAgICAgICAgICAgICAgIE5BVElWRV9XSU5ET1dfU0NBTElOR19NT0RFX0ZSRUVaRSwKLSAgICAgICAgICAgICAgICAwLCA6OmFuZHJvaWQ6OkZlbmNlOjpOT19GRU5DRSk7Ci0gICAgICAgIGlmICghOjphbmRyb2lkOjpjb252ZXJzaW9uOjpjb252ZXJ0VG8oJmxJbnB1dCwgaW5wdXQpKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6cXVldWVCdWZmZXIgLSAiCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGlucHV0IjsKLSAgICAgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KEJBRF9WQUxVRSksIHRPdXRwdXQpOwotICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICAgICAgfQotICAgICAgICBCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBsT3V0cHV0OwotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQmFzZS0+cXVldWVCdWZmZXIoCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihzbG90KSwgbElucHV0LCAmbE91dHB1dCk7Ci0KLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiBuaEFBOwotICAgICAgICBpZiAoITo6YW5kcm9pZDo6Y29udmVyc2lvbjo6d3JhcEFzKCZ0T3V0cHV0LCAmbmhBQSwgbE91dHB1dCkpIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIlRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpxdWV1ZUJ1ZmZlciAtICIKLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IjsKLSAgICAgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KEJBRF9WQUxVRSksIHRPdXRwdXQpOwotICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIHRPdXRwdXQpOwotICAgICAgICBmb3IgKGF1dG8mIG5oQSA6IG5oQUEpIHsKLSAgICAgICAgICAgIGZvciAoYXV0byYgbmggOiBuaEEpIHsKLSAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48aW50MzJfdD4gY2FuY2VsQnVmZmVyKGludDMyX3Qgc2xvdCwgY29uc3QgaGlkbF9oYW5kbGUmIGZlbmNlKSBvdmVycmlkZSB7Ci0gICAgICAgIHNwPEZlbmNlPiBsRmVuY2UgPSBuZXcgRmVuY2UoKTsKLSAgICAgICAgaWYgKCE6OmFuZHJvaWQ6OmNvbnZlcnNpb246OmNvbnZlcnRUbyhsRmVuY2UuZ2V0KCksIGZlbmNlKSkgewotICAgICAgICAgICAgTE9HKEVSUk9SKSA8PCAiVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI6OmNhbmNlbEJ1ZmZlciAtICIKLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgaW5wdXQgZmVuY2UiOwotICAgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KEJBRF9WQUxVRSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5jYW5jZWxCdWZmZXIoc3RhdGljX2Nhc3Q8aW50PihzbG90KSwgbEZlbmNlKSk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IHF1ZXJ5KGludDMyX3Qgd2hhdCwgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6cXVlcnlfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKLSAgICAgICAgaW50IGxWYWx1ZTsKLSAgICAgICAgaW50IGxSZXR1cm4gPSBtQmFzZS0+cXVlcnkoc3RhdGljX2Nhc3Q8aW50Pih3aGF0KSwgJmxWYWx1ZSk7Ci0gICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KGxSZXR1cm4pLCBzdGF0aWNfY2FzdDxpbnQzMl90PihsVmFsdWUpKTsKLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gY29ubmVjdChjb25zdCBzcDxIUHJvZHVjZXJMaXN0ZW5lcj4mIGxpc3RlbmVyLAotICAgICAgICAgICAgaW50MzJfdCBhcGksIGJvb2wgcHJvZHVjZXJDb250cm9sbGVkQnlBcHAsCi0gICAgICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpjb25uZWN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7Ci0gICAgICAgIHNwPEJQcm9kdWNlckxpc3RlbmVyPiBsTGlzdGVuZXIgPSBsaXN0ZW5lciA9PSBudWxscHRyID8KLSAgICAgICAgICAgICAgICBudWxscHRyIDogbmV3IExXUHJvZHVjZXJMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgIEJHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IGxPdXRwdXQ7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1CYXNlLT5jb25uZWN0KGxMaXN0ZW5lciwKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KGFwaSksCi0gICAgICAgICAgICAgICAgcHJvZHVjZXJDb250cm9sbGVkQnlBcHAsCi0gICAgICAgICAgICAgICAgJmxPdXRwdXQpOwotCi0gICAgICAgIEhHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVyT3V0cHV0IHRPdXRwdXQ7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+ID4gbmhBQTsKLSAgICAgICAgaWYgKCE6OmFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmdE91dHB1dCwgJm5oQUEsIGxPdXRwdXQpKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Y29ubmVjdCAtICIKLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IjsKLSAgICAgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIHRPdXRwdXQpOwotICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIHRPdXRwdXQpOwotICAgICAgICBmb3IgKGF1dG8mIG5oQSA6IG5oQUEpIHsKLSAgICAgICAgICAgIGZvciAoYXV0byYgbmggOiBuaEEpIHsKLSAgICAgICAgICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48aW50MzJfdD4gZGlzY29ubmVjdCgKLSAgICAgICAgICAgIGludDMyX3QgYXBpLAotICAgICAgICAgICAgSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6RGlzY29ubmVjdE1vZGUgbW9kZSkgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPmRpc2Nvbm5lY3QoCi0gICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihhcGkpLAotICAgICAgICAgICAgICAgIDo6YW5kcm9pZDo6Y29udmVyc2lvbjo6dG9HdWlEaXNjb25uZWN0TW9kZShtb2RlKSkpOwotICAgIH0KLQotICAgIFJldHVybjxpbnQzMl90PiBzZXRTaWRlYmFuZFN0cmVhbShjb25zdCBoaWRsX2hhbmRsZSYgc3RyZWFtKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+c2V0U2lkZWJhbmRTdHJlYW0oTmF0aXZlSGFuZGxlOjpjcmVhdGUoCi0gICAgICAgICAgICAgICAgc3RyZWFtID8gbmF0aXZlX2hhbmRsZV9jbG9uZShzdHJlYW0pIDogTlVMTCwgdHJ1ZSkpKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48dm9pZD4gYWxsb2NhdGVCdWZmZXJzKAotICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwKLSAgICAgICAgICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgIHVpbnQzMl90IHVzYWdlKSBvdmVycmlkZSB7Ci0gICAgICAgIG1CYXNlLT5hbGxvY2F0ZUJ1ZmZlcnMoCi0gICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwKLSAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDw6OmFuZHJvaWQ6OlBpeGVsRm9ybWF0Pihmb3JtYXQpLAotICAgICAgICAgICAgICAgIHVzYWdlKTsKLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48aW50MzJfdD4gYWxsb3dBbGxvY2F0aW9uKGJvb2wgYWxsb3cpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5hbGxvd0FsbG9jYXRpb24oYWxsb3cpKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48aW50MzJfdD4gc2V0R2VuZXJhdGlvbk51bWJlcih1aW50MzJfdCBnZW5lcmF0aW9uTnVtYmVyKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+c2V0R2VuZXJhdGlvbk51bWJlcihnZW5lcmF0aW9uTnVtYmVyKSk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IGdldENvbnN1bWVyTmFtZShIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpnZXRDb25zdW1lck5hbWVfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKLSAgICAgICAgX2hpZGxfY2IobUJhc2UtPmdldENvbnN1bWVyTmFtZSgpLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48aW50MzJfdD4gc2V0U2hhcmVkQnVmZmVyTW9kZShib29sIHNoYXJlZEJ1ZmZlck1vZGUpIG92ZXJyaWRlIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KG1CYXNlLT5zZXRTaGFyZWRCdWZmZXJNb2RlKHNoYXJlZEJ1ZmZlck1vZGUpKTsKLSAgICB9Ci0KLSAgICBSZXR1cm48aW50MzJfdD4gc2V0QXV0b1JlZnJlc2goYm9vbCBhdXRvUmVmcmVzaCkgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obUJhc2UtPnNldEF1dG9SZWZyZXNoKGF1dG9SZWZyZXNoKSk7Ci0gICAgfQotCi0gICAgUmV0dXJuPGludDMyX3Q+IHNldERlcXVldWVUaW1lb3V0KGludDY0X3QgdGltZW91dE5zKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMl90PihtQmFzZS0+c2V0RGVxdWV1ZVRpbWVvdXQodGltZW91dE5zKSk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IGdldExhc3RRdWV1ZWRCdWZmZXIoSEdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Z2V0TGFzdFF1ZXVlZEJ1ZmZlcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgewotICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBsT3V0QnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKLSAgICAgICAgc3A8RmVuY2U+IGxPdXRGZW5jZSA9IG5ldyBGZW5jZSgpOwotICAgICAgICBmbG9hdCBsT3V0VHJhbnNmb3JtTWF0cml4WzE2XTsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUJhc2UtPmdldExhc3RRdWV1ZWRCdWZmZXIoCi0gICAgICAgICAgICAgICAgJmxPdXRCdWZmZXIsICZsT3V0RmVuY2UsIGxPdXRUcmFuc2Zvcm1NYXRyaXgpOwotCi0gICAgICAgIEFud0J1ZmZlciB0T3V0QnVmZmVyOwotICAgICAgICBpZiAobE91dEJ1ZmZlciAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICA6OmFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmdE91dEJ1ZmZlciwgKmxPdXRCdWZmZXIpOwotICAgICAgICB9Ci0gICAgICAgIGhpZGxfaGFuZGxlIHRPdXRGZW5jZTsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV90KiBuaCA9IG51bGxwdHI7Ci0gICAgICAgIGlmICgobE91dEZlbmNlID09IG51bGxwdHIpIHx8ICE6OmFuZHJvaWQ6OmNvbnZlcnNpb246OndyYXBBcygmdE91dEZlbmNlLCAmbmgsICpsT3V0RmVuY2UpKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Z2V0TGFzdFF1ZXVlZEJ1ZmZlciAtICIKLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgb3V0cHV0IGZlbmNlIjsKLSAgICAgICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksCi0gICAgICAgICAgICAgICAgICAgIHRPdXRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgIHRPdXRGZW5jZSwKLSAgICAgICAgICAgICAgICAgICAgaGlkbF9hcnJheTxmbG9hdCwgMTY+KCkpOwotICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICAgICAgfQotICAgICAgICBoaWRsX2FycmF5PGZsb2F0LCAxNj4gdE91dFRyYW5zZm9ybU1hdHJpeChsT3V0VHJhbnNmb3JtTWF0cml4KTsKLQotICAgICAgICBfaGlkbF9jYihzdGF0aWNfY2FzdDxpbnQzMl90PihzdGF0dXMpLCB0T3V0QnVmZmVyLCB0T3V0RmVuY2UsIHRPdXRUcmFuc2Zvcm1NYXRyaXgpOwotICAgICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShuaCk7Ci0gICAgICAgIHJldHVybiBWb2lkKCk7Ci0gICAgfQotCi0gICAgUmV0dXJuPHZvaWQ+IGdldEZyYW1lVGltZXN0YW1wcyhIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpnZXRGcmFtZVRpbWVzdGFtcHNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlIHsKLSAgICAgICAgOjphbmRyb2lkOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIGxEZWx0YTsKLSAgICAgICAgbUJhc2UtPmdldEZyYW1lVGltZXN0YW1wcygmbERlbHRhKTsKLQotICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpGcmFtZUV2ZW50SGlzdG9yeURlbHRhIHREZWx0YTsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4gPiBuaEFBOwotICAgICAgICBpZiAoITo6YW5kcm9pZDo6Y29udmVyc2lvbjo6d3JhcEFzKCZ0RGVsdGEsICZuaEFBLCBsRGVsdGEpKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjo6Z2V0RnJhbWVUaW1lc3RhbXBzIC0gIgotICAgICAgICAgICAgICAgICAgICAiSW52YWxpZCBvdXRwdXQgZnJhbWUgdGltZXN0YW1wcyI7Ci0gICAgICAgICAgICBfaGlkbF9jYih0RGVsdGEpOwotICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIF9oaWRsX2NiKHREZWx0YSk7Ci0gICAgICAgIGZvciAoYXV0byYgbmhBIDogbmhBQSkgewotICAgICAgICAgICAgZm9yIChhdXRvJiBuaCA6IG5oQSkgewotICAgICAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKG5oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVm9pZCgpOwotICAgIH0KLQotICAgIFJldHVybjx2b2lkPiBnZXRVbmlxdWVJZChIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpnZXRVbmlxdWVJZF9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgewotICAgICAgICB1aW50NjRfdCBvdXRJZDsKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUJhc2UtPmdldFVuaXF1ZUlkKCZvdXRJZCk7Ci0gICAgICAgIF9oaWRsX2NiKHN0YXRpY19jYXN0PGludDMyX3Q+KHN0YXR1cyksIG91dElkKTsKLSAgICAgICAgcmV0dXJuIFZvaWQoKTsKLSAgICB9Ci0KLXByaXZhdGU6Ci0gICAgc3A8QkdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gbUJhc2U7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FRElBX1NUQUdFRlJJR0hUX1dHUkFQSElDQlVGRkVSUFJPRFVDRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV1Byb2R1Y2VyTGlzdGVuZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2JxaGVscGVyL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvV1Byb2R1Y2VyTGlzdGVuZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmViYmE4Ny4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9icWhlbHBlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dQcm9kdWNlckxpc3RlbmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9TVEFHRUZSSUdIVF9XUFJPRFVDRVJMSVNURU5FUl9IXwotI2RlZmluZSBNRURJQV9TVEFHRUZSSUdIVF9XUFJPRFVDRVJMSVNURU5FUl9IXwotCi0jaW5jbHVkZSA8aGlkbC9NUURlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgotCi0jaW5jbHVkZSA8YmluZGVyL0lCaW5kZXIuaD4KLSNpbmNsdWRlIDxndWkvSVByb2R1Y2VyTGlzdGVuZXIuaD4KLQotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lQcm9kdWNlckxpc3RlbmVyLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdXNpbmcgOjphbmRyb2lkOjpoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYXJyYXk7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX21lbW9yeTsKLXVzaW5nIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfc3RyaW5nOwotdXNpbmcgOjphbmRyb2lkOjpoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm47Ci11c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpWb2lkOwotdXNpbmcgOjphbmRyb2lkOjpzcDsKLQotdHlwZWRlZiA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OklQcm9kdWNlckxpc3RlbmVyCi0gICAgICAgIEhQcm9kdWNlckxpc3RlbmVyOwotdHlwZWRlZiA6OmFuZHJvaWQ6OklQcm9kdWNlckxpc3RlbmVyCi0gICAgICAgIEJQcm9kdWNlckxpc3RlbmVyOwotdXNpbmcgOjphbmRyb2lkOjpCblByb2R1Y2VyTGlzdGVuZXI7Ci0KLXN0cnVjdCBUV1Byb2R1Y2VyTGlzdGVuZXIgOiBwdWJsaWMgSFByb2R1Y2VyTGlzdGVuZXIgewotICAgIHNwPEJQcm9kdWNlckxpc3RlbmVyPiBtQmFzZTsKLSAgICBUV1Byb2R1Y2VyTGlzdGVuZXIoc3A8QlByb2R1Y2VyTGlzdGVuZXI+IGNvbnN0JiBiYXNlKTsKLSAgICBSZXR1cm48dm9pZD4gb25CdWZmZXJSZWxlYXNlZCgpIG92ZXJyaWRlOwotICAgIFJldHVybjxib29sPiBuZWVkc1JlbGVhc2VOb3RpZnkoKSBvdmVycmlkZTsKLX07Ci0KLWNsYXNzIExXUHJvZHVjZXJMaXN0ZW5lciA6IHB1YmxpYyBCblByb2R1Y2VyTGlzdGVuZXIgewotcHVibGljOgotICAgIHNwPEhQcm9kdWNlckxpc3RlbmVyPiBtQmFzZTsKLSAgICBMV1Byb2R1Y2VyTGlzdGVuZXIoc3A8SFByb2R1Y2VyTGlzdGVuZXI+IGNvbnN0JiBiYXNlKTsKLSAgICB2b2lkIG9uQnVmZmVyUmVsZWFzZWQoKSBvdmVycmlkZTsKLSAgICBib29sIG5lZWRzUmVsZWFzZU5vdGlmeSgpIG92ZXJyaWRlOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBNRURJQV9TVEFHRUZSSUdIVF9XUFJPRFVDRVJMSVNURU5FUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2RlYy9BbmRyb2lkLmJwCmluZGV4IDI1NjI4YTIuLjQ2YjNiOGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZGVjL0FuZHJvaWQuYnAKQEAgLTEsMjIgKzEsMTIgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9hYWNkZWMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWwogICAgICAgICAiU29mdEFBQzIuY3BwIiwKICAgICAgICAgIkRyY1ByZXNNb2RlV3JhcC5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAotCiAgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCiAKICAgICBzYW5pdGl6ZTogewpAQCAtMzAsMTEgKzIwLDYgQEAKICAgICBzdGF0aWNfbGliczogWyJsaWJGcmF1bmhvZmVyQUFDIl0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGliY3V0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FhY2VuYy9BbmRyb2lkLmJwCmluZGV4IGVjMTE1MWIuLmJmNzg5YzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hYWNlbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYWFjZW5jL0FuZHJvaWQuYnAKQEAgLTEsMTkgKzEsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2FhY2VuYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbIlNvZnRBQUNFbmNvZGVyMi5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWyItV2Vycm9yIl0sCi0KICAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAogICAgIHNhbml0aXplOiB7CkBAIC0yNSwxMiArMTUsNCBAQAogICAgIH0sCiAKICAgICBzdGF0aWNfbGliczogWyJsaWJGcmF1bmhvZmVyQUFDIl0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDRjMjk2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc3ViZGlycyA9IFsiKiJdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvY29tbW9uL0FuZHJvaWQuYnAKaW5kZXggNTE3NzU5My4uYmNmNjNkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2NvbW1vbi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9jb21tb24vQW5kcm9pZC5icApAQCAtMSw5ICsxLDcgQEAKLWNjX2xpYnJhcnlfc2hhcmVkIHsKK2NjX2xpYnJhcnkgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJzcmMvYWRkLmNwcCIsCkBAIC03Niw2ICs3NCwxMiBAQAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIAorICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCisKICAgICAvL2FkZHJlc3NpbmcgYi8yNTQwOTc0NAogICAgIC8vc2FuaXRpemU6IHsKICAgICAvLyAgICBtaXNjX3VuZGVmaW5lZDogWwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy9BbmRyb2lkLmJwCmluZGV4IDg4MGYxNjEuLjMzODFkMmUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL0FuZHJvaWQuYnAKQEAgLTEsNiArMSw3IEBACiBjY19saWJyYXJ5X3N0YXRpYyB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAogCiAgICAgc3JjczogWwogICAgICAgICAic3JjL2FfcmVmbC5jcHAiLApAQCAtNDAsNyArNDEsNiBAQAogICAgICAgICAic3JjL3dtZl90b19ldHMuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSJdLAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTYyLDI5ICs2MiwyNiBAQAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CiAKIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfYW1yZGVjIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiU29mdEFNUi5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYyIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgIF0sCiAgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAogCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAotICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIAogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLApAQCAtMTAyLDE4ICs5OSwxNSBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iX2NvbW1vbiIsCiAgICAgXSwKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQorCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJuYmRlY190ZXN0IiwKICAgICBndGVzdDogZmFsc2UsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAKICAgICBzcmNzOiBbInRlc3QvYW1ybmJkZWNfdGVzdC5jcHAiXSwKIApAQCAtMTMyLDYgKzEyNiwxMiBAQAogICAgICAgICAibGlibG9nIiwKICAgICBdLAogCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKKwogICAgIC8vc2FuaXRpemU6IHsKICAgICAvLyAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgIC8vICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0Ftcm5iRGVjVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW1ybmJEZWNUZXN0RW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzQ0YWM1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0Ftcm5iRGVjVGVzdEVudmlyb25tZW50LmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19BTVJOQkRFQ19URVNUX0VOVklST05NRU5UX0hfXworI2RlZmluZSBfX0FNUk5CREVDX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIEFtcm5iRGVjVGVzdEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgQW1ybmJEZWNUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL2RhdGEvbG9jYWwvdG1wLyIpIHt9CisKKyAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyICpfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IHN0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KKworICBwcml2YXRlOgorICAgIHN0cmluZyByZXM7Cit9OworCitpbnQgQW1ybmJEZWNUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJyZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgorICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gX19BTVJOQkRFQ19URVNUX0VOVklST05NRU5UX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0Ftcm5iRGVjb2RlclRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0Ftcm5iRGVjb2RlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNjIwNzQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW1ybmJEZWNvZGVyVGVzdC5jcHAKQEAgLTAsMCArMSwxNzUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFtcm5iRGVjb2RlclRlc3QiCisjZGVmaW5lIE9VVFBVVF9GSUxFICIvZGF0YS9sb2NhbC90bXAvYW1ybmJEZWNvZGUub3V0IgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9zbmRmaWxlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgImdzbWFtcl9kZWMuaCIKKworI2luY2x1ZGUgIkFtcm5iRGVjVGVzdEVudmlyb25tZW50LmgiCisKKy8vIENvbnN0YW50cyBmb3IgQU1SLU5CCitjb25zdGV4cHIgaW50MzJfdCBrSW5wdXRCdWZmZXJTaXplID0gNjQ7Citjb25zdGV4cHIgaW50MzJfdCBrU2FtcGxlc1BlckZyYW1lID0gTF9GUkFNRTsKK2NvbnN0ZXhwciBpbnQzMl90IGtCaXRzUGVyU2FtcGxlID0gMTY7Citjb25zdGV4cHIgaW50MzJfdCBrU2FtcGxlUmF0ZSA9IDgwMDA7Citjb25zdGV4cHIgaW50MzJfdCBrQ2hhbm5lbHMgPSAxOworY29uc3RleHByIGludDMyX3Qga091dHB1dEJ1ZmZlclNpemUgPSBrU2FtcGxlc1BlckZyYW1lICoga0JpdHNQZXJTYW1wbGUgLyA4OworY29uc3QgaW50MzJfdCBrRnJhbWVTaXplc1tdID0gezEyLCAxMywgMTUsIDE3LCAxOSwgMjAsIDI2LCAzMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xfTsKKworY29uc3RleHByIGludDMyX3Qga051bUZyYW1lUmVzZXQgPSAxNTA7CisKK3N0YXRpYyBBbXJuYkRlY1Rlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK2NsYXNzIEFtcm5iRGVjb2RlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0cmluZz4geworICBwdWJsaWM6CisgICAgQW1ybmJEZWNvZGVyVGVzdCgpIDogbUZwSW5wdXQobnVsbHB0cikge30KKworICAgIH5BbXJuYkRlY29kZXJUZXN0KCkgeworICAgICAgICBpZiAobUZwSW5wdXQpIHsKKyAgICAgICAgICAgIGZjbG9zZShtRnBJbnB1dCk7CisgICAgICAgICAgICBtRnBJbnB1dCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBGSUxFICptRnBJbnB1dDsKKyAgICBTTkRGSUxFICpvcGVuT3V0cHV0RmlsZShTRl9JTkZPICpzZkluZm8pOworICAgIGludDMyX3QgRGVjb2RlRnJhbWVzKHZvaWQgKmFtckhhbmRsZSwgU05ERklMRSAqb3V0RmlsZUhhbmRsZSwgaW50MzJfdCBmcmFtZUNvdW50ID0gSU5UMzJfTUFYKTsKK307CisKK1NOREZJTEUgKkFtcm5iRGVjb2RlclRlc3Q6Om9wZW5PdXRwdXRGaWxlKFNGX0lORk8gKnNmSW5mbykgeworICAgIG1lbXNldChzZkluZm8sIDAsIHNpemVvZihTRl9JTkZPKSk7CisgICAgc2ZJbmZvLT5jaGFubmVscyA9IGtDaGFubmVsczsKKyAgICBzZkluZm8tPmZvcm1hdCA9IFNGX0ZPUk1BVF9XQVYgfCBTRl9GT1JNQVRfUENNXzE2OworICAgIHNmSW5mby0+c2FtcGxlcmF0ZSA9IGtTYW1wbGVSYXRlOworICAgIFNOREZJTEUgKm91dEZpbGVIYW5kbGUgPSBzZl9vcGVuKE9VVFBVVF9GSUxFLCBTRk1fV1JJVEUsIHNmSW5mbyk7CisgICAgcmV0dXJuIG91dEZpbGVIYW5kbGU7Cit9CisKK2ludDMyX3QgQW1ybmJEZWNvZGVyVGVzdDo6RGVjb2RlRnJhbWVzKHZvaWQgKmFtckhhbmRsZSwgU05ERklMRSAqb3V0RmlsZUhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVDb3VudCkgeworICAgIHVpbnQ4X3QgaW5wdXRCdWZba0lucHV0QnVmZmVyU2l6ZV07CisgICAgaW50MTZfdCBvdXRwdXRCdWZba091dHB1dEJ1ZmZlclNpemVdOworCisgICAgd2hpbGUgKGZyYW1lQ291bnQgPiAwKSB7CisgICAgICAgIHVpbnQ4X3QgbW9kZTsKKyAgICAgICAgaW50MzJfdCBieXRlc1JlYWQgPSBmcmVhZCgmbW9kZSwgMSwgMSwgbUZwSW5wdXQpOworICAgICAgICBpZiAoYnl0ZXNSZWFkICE9IDEpIGJyZWFrOworCisgICAgICAgIC8vIEZpbmQgZnJhbWUgdHlwZQorICAgICAgICBGcmFtZV9UeXBlXzNHUFAgZnJhbWVUeXBlID0gKEZyYW1lX1R5cGVfM0dQUCkoKG1vZGUgPj4gMykgJiAweDBmKTsKKyAgICAgICAgaW50MzJfdCBmcmFtZVNpemUgPSBrRnJhbWVTaXplc1tmcmFtZVR5cGVdOworICAgICAgICBpZiAoZnJhbWVTaXplIDwgMCkgeworICAgICAgICAgICAgQUxPR0UoIklsbGVnYWwgZnJhbWUgdHlwZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGJ5dGVzUmVhZCA9IGZyZWFkKGlucHV0QnVmLCAxLCBmcmFtZVNpemUsIG1GcElucHV0KTsKKyAgICAgICAgaWYgKGJ5dGVzUmVhZCAhPSBmcmFtZVNpemUpIGJyZWFrOworCisgICAgICAgIGludDMyX3QgYnl0ZXNEZWNvZGVkID0gQU1SRGVjb2RlKGFtckhhbmRsZSwgZnJhbWVUeXBlLCBpbnB1dEJ1Ziwgb3V0cHV0QnVmLCBNSU1FX0lFVEYpOworICAgICAgICBpZiAoYnl0ZXNEZWNvZGVkID09IC0xKSB7CisgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlY29kZSB0aGUgaW5wdXQgZmlsZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgc2Zfd3JpdGVmX3Nob3J0KG91dEZpbGVIYW5kbGUsIG91dHB1dEJ1Ziwga1NhbXBsZXNQZXJGcmFtZSk7CisgICAgICAgIGZyYW1lQ291bnQtLTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK1RFU1RfRihBbXJuYkRlY29kZXJUZXN0LCBDcmVhdGVBbXJuYkRlY29kZXJUZXN0KSB7CisgICAgdm9pZCAqYW1ySGFuZGxlOworICAgIGludDMyX3Qgc3RhdHVzID0gR1NNSW5pdERlY29kZSgmYW1ySGFuZGxlLCAoV29yZDggKikiQU1STkJEZWNvZGVyIik7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkVycm9yIGNyZWF0aW5nIEFNUi1OQiBkZWNvZGVyIjsKKyAgICBHU01EZWNvZGVGcmFtZUV4aXQoJmFtckhhbmRsZSk7CisgICAgQVNTRVJUX0VRKGFtckhhbmRsZSwgbnVsbHB0cikgPDwgIkVycm9yIGRlbGV0aW5nIEFNUi1OQiBkZWNvZGVyIjsKK30KKworVEVTVF9QKEFtcm5iRGVjb2RlclRlc3QsIERlY29kZVRlc3QpIHsKKyAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpOworICAgIG1GcElucHV0ID0gZm9wZW4oaW5wdXRGaWxlLmNfc3RyKCksICJyYiIpOworICAgIEFTU0VSVF9ORShtRnBJbnB1dCwgbnVsbHB0cikgPDwgIkVycm9yIG9wZW5pbmcgaW5wdXQgZmlsZSAiIDw8IGlucHV0RmlsZTsKKworICAgIC8vIE9wZW4gdGhlIG91dHB1dCBmaWxlLgorICAgIFNGX0lORk8gc2ZJbmZvOworICAgIFNOREZJTEUgKm91dEZpbGVIYW5kbGUgPSBvcGVuT3V0cHV0RmlsZSgmc2ZJbmZvKTsKKyAgICBBU1NFUlRfTkUob3V0RmlsZUhhbmRsZSwgbnVsbHB0cikgPDwgIkVycm9yIG9wZW5pbmcgb3V0cHV0IGZpbGUgZm9yIHdyaXRpbmcgZGVjb2RlZCBvdXRwdXQiOworCisgICAgdm9pZCAqYW1ySGFuZGxlOworICAgIGludDMyX3Qgc3RhdHVzID0gR1NNSW5pdERlY29kZSgmYW1ySGFuZGxlLCAoV29yZDggKikiQU1STkJEZWNvZGVyIik7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkVycm9yIGNyZWF0aW5nIEFNUi1OQiBkZWNvZGVyIjsKKworICAgIC8vIERlY29kZQorICAgIGludDMyX3QgZGVjb2RlckVyciA9IERlY29kZUZyYW1lcyhhbXJIYW5kbGUsIG91dEZpbGVIYW5kbGUpOworICAgIEFTU0VSVF9FUShkZWNvZGVyRXJyLCAwKSA8PCAiRGVjb2RlRnJhbWVzIHJldHVybmVkIGVycm9yIjsKKworICAgIHNmX2Nsb3NlKG91dEZpbGVIYW5kbGUpOworICAgIEdTTURlY29kZUZyYW1lRXhpdCgmYW1ySGFuZGxlKTsKKyAgICBBU1NFUlRfRVEoYW1ySGFuZGxlLCBudWxscHRyKSA8PCAiRXJyb3IgZGVsZXRpbmcgQU1SLU5CIGRlY29kZXIiOworfQorCitURVNUX1AoQW1ybmJEZWNvZGVyVGVzdCwgUmVzZXREZWNvZGVUZXN0KSB7CisgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKTsKKyAgICBtRnBJbnB1dCA9IGZvcGVuKGlucHV0RmlsZS5jX3N0cigpLCAicmIiKTsKKyAgICBBU1NFUlRfTkUobUZwSW5wdXQsIG51bGxwdHIpIDw8ICJFcnJvciBvcGVuaW5nIGlucHV0IGZpbGUgIiA8PCBpbnB1dEZpbGU7CisKKyAgICAvLyBPcGVuIHRoZSBvdXRwdXQgZmlsZS4KKyAgICBTRl9JTkZPIHNmSW5mbzsKKyAgICBTTkRGSUxFICpvdXRGaWxlSGFuZGxlID0gb3Blbk91dHB1dEZpbGUoJnNmSW5mbyk7CisgICAgQVNTRVJUX05FKG91dEZpbGVIYW5kbGUsIG51bGxwdHIpIDw8ICJFcnJvciBvcGVuaW5nIG91dHB1dCBmaWxlIGZvciB3cml0aW5nIGRlY29kZWQgb3V0cHV0IjsKKworICAgIHZvaWQgKmFtckhhbmRsZTsKKyAgICBpbnQzMl90IHN0YXR1cyA9IEdTTUluaXREZWNvZGUoJmFtckhhbmRsZSwgKFdvcmQ4ICopIkFNUk5CRGVjb2RlciIpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFcnJvciBjcmVhdGluZyBBTVItTkIgZGVjb2RlciI7CisKKyAgICAvLyBEZWNvZGUga051bUZyYW1lUmVzZXQgZmlyc3QKKyAgICBpbnQzMl90IGRlY29kZXJFcnIgPSBEZWNvZGVGcmFtZXMoYW1ySGFuZGxlLCBvdXRGaWxlSGFuZGxlLCBrTnVtRnJhbWVSZXNldCk7CisgICAgQVNTRVJUX0VRKGRlY29kZXJFcnIsIDApIDw8ICJEZWNvZGVGcmFtZXMgcmV0dXJuZWQgZXJyb3IiOworCisgICAgc3RhdHVzID0gU3BlZWNoX0RlY29kZV9GcmFtZV9yZXNldChhbXJIYW5kbGUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFcnJvciByZXN0aW5nIEFNUi1OQiBkZWNvZGVyIjsKKworICAgIC8vIFN0YXJ0IGRlY29kaW5nIGFnYWluCisgICAgZGVjb2RlckVyciA9IERlY29kZUZyYW1lcyhhbXJIYW5kbGUsIG91dEZpbGVIYW5kbGUpOworICAgIEFTU0VSVF9FUShkZWNvZGVyRXJyLCAwKSA8PCAiRGVjb2RlRnJhbWVzIHJldHVybmVkIGVycm9yIjsKKworICAgIHNmX2Nsb3NlKG91dEZpbGVIYW5kbGUpOworICAgIEdTTURlY29kZUZyYW1lRXhpdCgmYW1ySGFuZGxlKTsKKyAgICBBU1NFUlRfRVEoYW1ySGFuZGxlLCBudWxscHRyKSA8PCAiRXJyb3IgZGVsZXRpbmcgQU1SLU5CIGRlY29kZXIiOworfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoQW1ybmJEZWNvZGVyVGVzdEFsbCwgQW1ybmJEZWNvZGVyVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygoImJiYl84MDAwaHpfMWNoXzhrYnBzX2Ftcm5iXzMwc2VjLmFtcm5iIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJzaW5lX2Ftcm5iXzFjaF8xMmticHNfODAwMGh6LmFtcm5iIikpKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgZ0VudiA9IG5ldyBBbXJuYkRlY1Rlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR1YoIlRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhOTVjZmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkFtcm5iRGVjb2RlclRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiQW1ybmJEZWNvZGVyVGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlic25kZmlsZSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTllNjc4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgQW1yLW5iIERlY29kZXIgdW5pdCB0ZXN0Ij4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iQW1ybmJEZWNvZGVyVGVzdCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJBbXJuYkRlY29kZXJUZXN0LT4vZGF0YS9sb2NhbC90bXAvQW1ybmJEZWNvZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0Ftcm5iRGVjb2RlclRlc3QuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL0Ftcm5iRGVjb2RlclRlc3RSZXMvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJBbXJuYkRlY29kZXJUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWZsYWciIHZhbHVlPSItUCAvZGF0YS9sb2NhbC90bXAvQW1ybmJEZWNvZGVyVGVzdFJlcy8iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkwNzNlNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9kZWMvdGVzdC9SRUFETUUubWQKQEAgLTAsMCArMSwzOSBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIEFNUi1OQiBEZWNvZGVyIDoKK1RoZSBBbXItTmIgRGVjb2RlciBUZXN0IFN1aXRlIHZhbGlkYXRlcyB0aGUgYW1ybmIgZGVjb2RlciBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIEFtcm5iRGVjb2RlclRlc3QKK2BgYAorCitUaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LworCitUaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCisKK1RvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvQW1ybmJEZWNvZGVyVGVzdC9BbXJuYkRlY29kZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvQW1ybmJEZWNvZGVyVGVzdC9BbXJuYkRlY29kZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2RlYy90ZXN0L0Ftcm5iRGVjb2RlclRlc3QuemlwKS4gRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgorCitgYGAKK2FkYiBwdXNoIEFtcm5iRGVjb2RlclRlc3RSZXMvLiAvZGF0YS9sb2NhbC90bXAvCitgYGAKKwordXNhZ2U6IEFtcm5iRGVjb2RlclRlc3QgLVAgXDxwYXRoX3RvX2ZvbGRlclw+CitgYGAKK2FkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvQW1ybmJEZWNvZGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvQW1ybmJEZWNvZGVyVGVzdFJlcy8KK2BgYAorQWx0ZXJuYXRpdmVseSwgdGhlIHRlc3QgY2FuIGFsc28gYmUgcnVuIHVzaW5nIGF0ZXN0IGNvbW1hbmQuCisKK2BgYAorYXRlc3QgQW1ybmJEZWNvZGVyVGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvQW5kcm9pZC5icAppbmRleCAxOWZkNGE4Li40MzhlZDA0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy9BbmRyb2lkLmJwCkBAIC02Miw3ICs2Miw3IEBACiAgICAgICAgICJzcmMvdG9uX3N0YWIuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSJdLAorICAgIGhlYWRlcl9saWJzOiBbImxpYnN0YWdlZnJpZ2h0X2hlYWRlcnMiXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbInNyYyJdLAogCiAgICAgY2ZsYWdzOiBbCkBAIC04NiwyMSArODYsMTIgQEAKIAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2Ftcm5iZW5jIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiU29mdEFNUk5CRW5jb2Rlci5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCiAKLSAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAotCiAgICAgLy9hZGRyZXNzaW5nIGIvMjU0MDk3NDQKICAgICAvL3Nhbml0aXplOiB7CiAgICAgLy8gICAgbWlzY191bmRlZmluZWQ6IFsKQEAgLTExMSwxMyArMTAyLDggQEAKICAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9hbXJuYmVuYyJdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAogICAgIF0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KIAogLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW1ybmJFbmNUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbXJuYkVuY1Rlc3RFbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhMmZjZDEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW1ybmJFbmNUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0FNUk5CRU5DX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisjZGVmaW5lIF9fQU1STkJFTkNfVEVTVF9FTlZJUk9OTUVOVF9IX18KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgQW1ybmJFbmNUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgIHB1YmxpYzoKKyAgICBBbXJuYkVuY1Rlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvIikge30KKworICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIgKl9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQorCisgIHByaXZhdGU6CisgICAgc3RyaW5nIHJlczsKK307CisKK2ludCBBbXJuYkVuY1Rlc3RFbnZpcm9ubWVudDo6aW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHt7InJlcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LCB7MCwgMCwgMCwgMH19OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiUDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ1AnOgorICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCisgICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBfX0FNUk5CRU5DX1RFU1RfRU5WSVJPTk1FTlRfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW1ybmJFbmNvZGVyVGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW1ybmJFbmNvZGVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI3Mjk5OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbXJuYkVuY29kZXJUZXN0LmNwcApAQCAtMCwwICsxLDIwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQW1ybmJFbmNvZGVyVGVzdCIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvc25kZmlsZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJnc21hbXJfZW5jLmgiCisKKyNpbmNsdWRlICJBbXJuYkVuY1Rlc3RFbnZpcm9ubWVudC5oIgorCisjZGVmaW5lIE9VVFBVVF9GSUxFICIvZGF0YS9sb2NhbC90bXAvYW1ybmJFbmNvZGUub3V0IgorCitjb25zdGV4cHIgaW50MzJfdCBrSW5wdXRCdWZmZXJTaXplID0gTF9GUkFNRSAqIDI7ICAvLyAxNjAgc2FtcGxlcyAqIDE2LWJpdCBwZXIgc2FtcGxlLgorY29uc3RleHByIGludDMyX3Qga091dHB1dEJ1ZmZlclNpemUgPSAxMDI0OworY29uc3RleHByIGludDMyX3Qga051bUZyYW1lUmVzZXQgPSAyMDA7Citjb25zdGV4cHIgaW50MzJfdCBrTWF4Q291bnQgPSAxMDsKK3N0cnVjdCBBbXJOYkVuY1N0YXRlIHsKKyAgICB2b2lkICplbmNDdHg7CisgICAgdm9pZCAqcGlkU3luY0N0eDsKK307CisKK3N0YXRpYyBBbXJuYkVuY1Rlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK2NsYXNzIEFtcm5iRW5jb2RlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHBhaXI8c3RyaW5nLCBpbnQzMl90Pj4geworICBwdWJsaWM6CisgICAgQW1ybmJFbmNvZGVyVGVzdCgpIDogbUFtckVuY0hhbmRsZShudWxscHRyKSB7fQorCisgICAgfkFtcm5iRW5jb2RlclRlc3QoKSB7CisgICAgICAgIGlmIChtQW1yRW5jSGFuZGxlKSB7CisgICAgICAgICAgICBmcmVlKG1BbXJFbmNIYW5kbGUpOworICAgICAgICAgICAgbUFtckVuY0hhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBbXJOYkVuY1N0YXRlICptQW1yRW5jSGFuZGxlOworICAgIGludDMyX3QgRW5jb2RlRnJhbWVzKGludDMyX3QgbW9kZSwgRklMRSAqZnBJbnB1dCwgRklMRSAqbUZwT3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVDb3VudCA9IElOVDMyX01BWCk7Cit9OworCitpbnQzMl90IEFtcm5iRW5jb2RlclRlc3Q6OkVuY29kZUZyYW1lcyhpbnQzMl90IG1vZGUsIEZJTEUgKmZwSW5wdXQsIEZJTEUgKm1GcE91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVDb3VudCkgeworICAgIGludDMyX3QgZnJhbWVOdW0gPSAwOworICAgIHVpbnQxNl90IGlucHV0QnVmW2tJbnB1dEJ1ZmZlclNpemVdOworICAgIHVpbnQ4X3Qgb3V0cHV0QnVmW2tPdXRwdXRCdWZmZXJTaXplXTsKKyAgICB3aGlsZSAoZnJhbWVOdW0gPCBmcmFtZUNvdW50KSB7CisgICAgICAgIGludDMyX3QgYnl0ZXNSZWFkID0gZnJlYWQoaW5wdXRCdWYsIDEsIGtJbnB1dEJ1ZmZlclNpemUsIGZwSW5wdXQpOworICAgICAgICBpZiAoYnl0ZXNSZWFkICE9IGtJbnB1dEJ1ZmZlclNpemUgJiYgIWZlb2YoZnBJbnB1dCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gcmVhZCBkYXRhIGZyb20gaW5wdXQgZmlsZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9IGVsc2UgaWYgKGZlb2YoZnBJbnB1dCkgJiYgYnl0ZXNSZWFkID09IDApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIEZyYW1lX1R5cGVfM0dQUCBmcmFtZV90eXBlID0gKEZyYW1lX1R5cGVfM0dQUCltb2RlOworICAgICAgICBpbnQzMl90IGJ5dGVzR2VuZXJhdGVkID0KKyAgICAgICAgICAgICAgICBBTVJFbmNvZGUobUFtckVuY0hhbmRsZS0+ZW5jQ3R4LCBtQW1yRW5jSGFuZGxlLT5waWRTeW5jQ3R4LCAoTW9kZSltb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoV29yZDE2ICopaW5wdXRCdWYsIG91dHB1dEJ1ZiwgJmZyYW1lX3R5cGUsIEFNUl9UWF9XTUYpOworICAgICAgICBmcmFtZU51bSsrOworICAgICAgICBpZiAoYnl0ZXNHZW5lcmF0ZWQgPCAwKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gZW5jb2dpbmcgdGhlIGZpbGU6IEludmFsaWQgb3V0cHV0IGZvcm1hdCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ29udmVydCBmcm9tIFdNRiB0byBSRkMgMzI2NyBmb3JtYXQuCisgICAgICAgIGlmIChieXRlc0dlbmVyYXRlZCA+IDApIHsKKyAgICAgICAgICAgIG91dHB1dEJ1ZlswXSA9ICgob3V0cHV0QnVmWzBdIDw8IDMpIHwgNCkgJiAweDdjOworICAgICAgICB9CisgICAgICAgIGZ3cml0ZShvdXRwdXRCdWYsIDEsIGJ5dGVzR2VuZXJhdGVkLCBtRnBPdXRwdXQpOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworVEVTVF9GKEFtcm5iRW5jb2RlclRlc3QsIENyZWF0ZUFtcm5iRW5jb2RlclRlc3QpIHsKKyAgICBtQW1yRW5jSGFuZGxlID0gKEFtck5iRW5jU3RhdGUgKiltYWxsb2Moc2l6ZW9mKEFtck5iRW5jU3RhdGUpKTsKKyAgICBBU1NFUlRfTkUobUFtckVuY0hhbmRsZSwgbnVsbHB0cikgPDwgIkVycm9yIGluIGFsbG9jYXRpbmcgbWVtb3J5IHRvIENvZGVjIGhhbmRsZSI7CisgICAgZm9yIChpbnQgY291bnQgPSAwOyBjb3VudCA8IGtNYXhDb3VudDsgY291bnQrKykgeworICAgICAgICBpbnQzMl90IHN0YXR1cyA9IEFNUkVuY29kZUluaXQoJm1BbXJFbmNIYW5kbGUtPmVuY0N0eCwgJm1BbXJFbmNIYW5kbGUtPnBpZFN5bmNDdHgsIDApOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXJyb3IgY3JlYXRpbmcgQU1SLU5CIGVuY29kZXIiOworICAgICAgICBBTE9HVigiU3VjY2Vzc2Z1bGx5IGNyZWF0ZWQgZW5jb2RlciIpOworICAgIH0KKyAgICBpZiAobUFtckVuY0hhbmRsZSkgeworICAgICAgICBBTVJFbmNvZGVFeGl0KCZtQW1yRW5jSGFuZGxlLT5lbmNDdHgsICZtQW1yRW5jSGFuZGxlLT5waWRTeW5jQ3R4KTsKKyAgICAgICAgQVNTRVJUX0VRKG1BbXJFbmNIYW5kbGUtPmVuY0N0eCwgbnVsbHB0cikgPDwgIkVycm9yIGRlbGV0aW5nIEFNUi1OQiBlbmNvZGVyIjsKKyAgICAgICAgQVNTRVJUX0VRKG1BbXJFbmNIYW5kbGUtPnBpZFN5bmNDdHgsIG51bGxwdHIpIDw8ICJFcnJvciBkZWxldGluZyBBTVItTkIgZW5jb2RlciI7CisgICAgICAgIGZyZWUobUFtckVuY0hhbmRsZSk7CisgICAgICAgIG1BbXJFbmNIYW5kbGUgPSBudWxscHRyOworICAgICAgICBBTE9HVigiU3VjY2Vzc2Z1bGx5IGRlbGV0ZWQgZW5jb2RlciIpOworICAgIH0KK30KKworVEVTVF9QKEFtcm5iRW5jb2RlclRlc3QsIEVuY29kZVRlc3QpIHsKKyAgICBtQW1yRW5jSGFuZGxlID0gKEFtck5iRW5jU3RhdGUgKiltYWxsb2Moc2l6ZW9mKEFtck5iRW5jU3RhdGUpKTsKKyAgICBBU1NFUlRfTkUobUFtckVuY0hhbmRsZSwgbnVsbHB0cikgPDwgIkVycm9yIGluIGFsbG9jYXRpbmcgbWVtb3J5IHRvIENvZGVjIGhhbmRsZSI7CisgICAgaW50MzJfdCBzdGF0dXMgPSBBTVJFbmNvZGVJbml0KCZtQW1yRW5jSGFuZGxlLT5lbmNDdHgsICZtQW1yRW5jSGFuZGxlLT5waWRTeW5jQ3R4LCAwKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXJyb3IgY3JlYXRpbmcgQU1SLU5CIGVuY29kZXIiOworCisgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKS5maXJzdDsKKyAgICBGSUxFICpmcElucHV0ID0gZm9wZW4oaW5wdXRGaWxlLmNfc3RyKCksICJyYiIpOworICAgIEFTU0VSVF9ORShmcElucHV0LCBudWxscHRyKSA8PCAiRXJyb3Igb3BlbmluZyBpbnB1dCBmaWxlICIgPDwgaW5wdXRGaWxlOworCisgICAgRklMRSAqZnBPdXRwdXQgPSBmb3BlbihPVVRQVVRfRklMRSwgIndiIik7CisgICAgQVNTRVJUX05FKGZwT3V0cHV0LCBudWxscHRyKSA8PCAiRXJyb3Igb3BlbmluZyBvdXRwdXQgZmlsZSAiIDw8IE9VVFBVVF9GSUxFOworCisgICAgLy8gV3JpdGUgZmlsZSBoZWFkZXIuCisgICAgZndyaXRlKCIjIUFNUlxuIiwgMSwgNiwgZnBPdXRwdXQpOworCisgICAgaW50MzJfdCBtb2RlID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgaW50MzJfdCBlbmNvZGVFcnIgPSBFbmNvZGVGcmFtZXMobW9kZSwgZnBJbnB1dCwgZnBPdXRwdXQpOworICAgIEFTU0VSVF9FUShlbmNvZGVFcnIsIDApIDw8ICJFbmNvZGVGcmFtZXMgcmV0dXJuZWQgZXJyb3IgZm9yIENvZGVjIG1vZGU6ICIgPDwgbW9kZTsKKworICAgIGZjbG9zZShmcE91dHB1dCk7CisgICAgZmNsb3NlKGZwSW5wdXQpOworCisgICAgQU1SRW5jb2RlRXhpdCgmbUFtckVuY0hhbmRsZS0+ZW5jQ3R4LCAmbUFtckVuY0hhbmRsZS0+cGlkU3luY0N0eCk7CisgICAgQVNTRVJUX0VRKG1BbXJFbmNIYW5kbGUtPmVuY0N0eCwgbnVsbHB0cikgPDwgIkVycm9yIGRlbGV0aW5nIEFNUi1OQiBlbmNvZGVyIjsKKyAgICBBU1NFUlRfRVEobUFtckVuY0hhbmRsZS0+cGlkU3luY0N0eCwgbnVsbHB0cikgPDwgIkVycm9yIGRlbGV0aW5nIEFNUi1OQiBlbmNvZGVyIjsKKyAgICBmcmVlKG1BbXJFbmNIYW5kbGUpOworICAgIG1BbXJFbmNIYW5kbGUgPSBudWxscHRyOworICAgIEFMT0dWKCJTdWNjZXNzZnVsbHkgZGVsZXRlZCBlbmNvZGVyIik7Cit9CisKK1RFU1RfUChBbXJuYkVuY29kZXJUZXN0LCBSZXNldEVuY29kZXJUZXN0KSB7CisgICAgbUFtckVuY0hhbmRsZSA9IChBbXJOYkVuY1N0YXRlICopbWFsbG9jKHNpemVvZihBbXJOYkVuY1N0YXRlKSk7CisgICAgQVNTRVJUX05FKG1BbXJFbmNIYW5kbGUsIG51bGxwdHIpIDw8ICJFcnJvciBpbiBhbGxvY2F0aW5nIG1lbW9yeSB0byBDb2RlYyBoYW5kbGUiOworICAgIGludDMyX3Qgc3RhdHVzID0gQU1SRW5jb2RlSW5pdCgmbUFtckVuY0hhbmRsZS0+ZW5jQ3R4LCAmbUFtckVuY0hhbmRsZS0+cGlkU3luY0N0eCwgMCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkVycm9yIGNyZWF0aW5nIEFNUi1OQiBlbmNvZGVyIjsKKworICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCkuZmlyc3Q7CisgICAgRklMRSAqZnBJbnB1dCA9IGZvcGVuKGlucHV0RmlsZS5jX3N0cigpLCAicmIiKTsKKyAgICBBU1NFUlRfTkUoZnBJbnB1dCwgbnVsbHB0cikgPDwgIkVycm9yIG9wZW5pbmcgaW5wdXQgZmlsZSAiIDw8IGlucHV0RmlsZTsKKworICAgIEZJTEUgKmZwT3V0cHV0ID0gZm9wZW4oT1VUUFVUX0ZJTEUsICJ3YiIpOworICAgIEFTU0VSVF9ORShmcE91dHB1dCwgbnVsbHB0cikgPDwgIkVycm9yIG9wZW5pbmcgb3V0cHV0IGZpbGUgIiA8PCBPVVRQVVRfRklMRTsKKworICAgIC8vIFdyaXRlIGZpbGUgaGVhZGVyLgorICAgIGZ3cml0ZSgiIyFBTVJcbiIsIDEsIDYsIGZwT3V0cHV0KTsKKworICAgIGludDMyX3QgbW9kZSA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIC8vIEVuY29kZSBrTnVtRnJhbWVSZXNldCBmaXJzdAorICAgIGludDMyX3QgZW5jb2RlRXJyID0gRW5jb2RlRnJhbWVzKG1vZGUsIGZwSW5wdXQsIGZwT3V0cHV0LCBrTnVtRnJhbWVSZXNldCk7CisgICAgQVNTRVJUX0VRKGVuY29kZUVyciwgMCkgPDwgIkVuY29kZUZyYW1lcyByZXR1cm5lZCBlcnJvciBmb3IgQ29kZWMgbW9kZTogIiA8PCBtb2RlOworCisgICAgc3RhdHVzID0gQU1SRW5jb2RlUmVzZXQobUFtckVuY0hhbmRsZS0+ZW5jQ3R4LCBtQW1yRW5jSGFuZGxlLT5waWRTeW5jQ3R4KTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRXJyb3IgcmVzdGluZyBBTVItTkIgZW5jb2RlciI7CisKKyAgICAvLyBTdGFydCBlbmNvZGluZyBhZ2FpbgorICAgIGVuY29kZUVyciA9IEVuY29kZUZyYW1lcyhtb2RlLCBmcElucHV0LCBmcE91dHB1dCk7CisgICAgQVNTRVJUX0VRKGVuY29kZUVyciwgMCkgPDwgIkVuY29kZUZyYW1lcyByZXR1cm5lZCBlcnJvciBmb3IgQ29kZWMgbW9kZTogIiA8PCBtb2RlOworCisgICAgZmNsb3NlKGZwT3V0cHV0KTsKKyAgICBmY2xvc2UoZnBJbnB1dCk7CisKKyAgICBBTVJFbmNvZGVFeGl0KCZtQW1yRW5jSGFuZGxlLT5lbmNDdHgsICZtQW1yRW5jSGFuZGxlLT5waWRTeW5jQ3R4KTsKKyAgICBBU1NFUlRfRVEobUFtckVuY0hhbmRsZS0+ZW5jQ3R4LCBudWxscHRyKSA8PCAiRXJyb3IgZGVsZXRpbmcgQU1SLU5CIGVuY29kZXIiOworICAgIEFTU0VSVF9FUShtQW1yRW5jSGFuZGxlLT5waWRTeW5jQ3R4LCBudWxscHRyKSA8PCAiRXJyb3IgZGVsZXRpbmcgQU1SLU5CIGVuY29kZXIiOworICAgIGZyZWUobUFtckVuY0hhbmRsZSk7CisgICAgbUFtckVuY0hhbmRsZSA9IG51bGxwdHI7CisgICAgQUxPR1YoIlN1Y2Nlc3NmdWxseSBkZWxldGVkIGVuY29kZXIiKTsKK30KKworLy8gVE9ETzogQWRkIG1vcmUgdGVzdCB2ZWN0b3JzCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoQW1ybmJFbmNvZGVyVGVzdEFsbCwgQW1ybmJFbmNvZGVyVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoImJiYl9yYXdfMWNoXzhraHpfczE2bGUucmF3IiwgTVI0NzUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiX3Jhd18xY2hfOGtoel9zMTZsZS5yYXciLCBNUjUxNSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfcmF3XzFjaF84a2h6X3MxNmxlLnJhdyIsIE1SNTkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiX3Jhd18xY2hfOGtoel9zMTZsZS5yYXciLCBNUjY3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl9yYXdfMWNoXzhraHpfczE2bGUucmF3IiwgTVI3NCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfcmF3XzFjaF84a2h6X3MxNmxlLnJhdyIsIE1SNzk1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl9yYXdfMWNoXzhraHpfczE2bGUucmF3IiwgTVIxMDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiX3Jhd18xY2hfOGtoel9zMTZsZS5yYXciLCBNUjEyMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXByYXcucmF3IiwgTVI0NzUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic2luZXN3ZWVwcmF3LnJhdyIsIE1SNTE1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInNpbmVzd2VlcHJhdy5yYXciLCBNUjU5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInNpbmVzd2VlcHJhdy5yYXciLCBNUjY3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInNpbmVzd2VlcHJhdy5yYXciLCBNUjc0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoInNpbmVzd2VlcHJhdy5yYXciLCBNUjc5NSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJzaW5lc3dlZXByYXcucmF3IiwgTVIxMDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigic2luZXN3ZWVwcmF3LnJhdyIsIE1SMTIyKSkpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IEFtcm5iRW5jVGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HVigiVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg5ODJmZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiQW1ybmJFbmNvZGVyVGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJBbXJuYkVuY29kZXJUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJuYl9jb21tb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJlbmMiLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJzbmRmaWxlIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJuYi9lbmMvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlmZTYxYjEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBBbXItbmIgRW5jb2RlciB1bml0IHRlc3QiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJBbXJuYkVuY29kZXJUZXN0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkFtcm5iRW5jb2RlclRlc3QtPi9kYXRhL2xvY2FsL3RtcC9BbXJuYkVuY29kZXJUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW1ybmJFbmNvZGVyVGVzdC56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvQW1ybmJFbmNvZGVyVGVzdFJlcy8iIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IkFtcm5iRW5jb2RlclRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9BbXJuYkVuY29kZXJUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWQyYzk1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2VuYy90ZXN0L1JFQURNRS5tZApAQCAtMCwwICsxLDM5IEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgQU1SLU5CIEVuY29kZXIgOgorVGhlIEFtci1OYiBFbmNvZGVyIFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBhbXJuYiBlbmNvZGVyIGF2YWlsYWJsZSBpbiBsaWJzdGFnZWZyaWdodC4KKworUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6CitgYGAKK20gQW1ybmJFbmNvZGVyVGVzdAorYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9BbXJuYkVuY29kZXJUZXN0L0Ftcm5iRW5jb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9BbXJuYkVuY29kZXJUZXN0L0Ftcm5iRW5jb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZW5jL3Rlc3QvQW1ybmJFbmNvZGVyVGVzdC56aXApLiBEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCisKK2BgYAorYWRiIHB1c2ggQW1ybmJFbmNvZGVyVGVzdFJlcy8uIC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCit1c2FnZTogQW1ybmJFbmNvZGVyVGVzdCAtUCBcPHBhdGhfdG9fZm9sZGVyXD4KK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9BbXJuYkVuY29kZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9BbXJuYkVuY29kZXJUZXN0UmVzLworYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBBbXJuYkVuY29kZXJUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU0ZGUxY2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZnV6emVyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzNyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisKK2NjX2Z1enogeworICAgIG5hbWU6ICJhbXJuYl9kZWNfZnV6emVyIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBzcmNzOiBbCisgICAgICAgICJhbXJuYl9kZWNfZnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJkZWMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfYW1ybmJfY29tbW9uIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzkxYjgzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw2MiBAQAorIyBGdXp6ZXIgZm9yIGxpYnN0YWdlZnJpZ2h0X2Ftcm5iZGVjIGRlY29kZXIKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIEFNUi1OQiBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUKK2NvZGVjIGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK1RoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIG5vdCBoYXJkY29kZWQsIGJ1dCBpbnN0ZWFkIHNlbGVjdGVkIGJhc2VkIG9uCitpbmNvbWluZyBkYXRhLiBUaGlzIGVuc3VyZXMgbW9yZSBjb2RlIHBhdGhzIGFyZSByZWFjaGVkIGJ5IHRoZSBmdXp6ZXIuCisKK0FNUi1OQiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisxLiBTdHJlYW0gZm9ybWF0IChwYXJhbWV0ZXIgbmFtZTogYGlucHV0X2Zvcm1hdGApCisyLiAzR1BQIGZyYW1lIHR5cGUgKHBhcmFtZXRlciBuYW1lOiBgZnJhbWVfdHlwZWApCisKK3wgUGFyYW1ldGVyfCBWYWxpZCBWYWx1ZXN8IENvbmZpZ3VyZWQgVmFsdWV8Cit8LS0tLS0tLS0tLS0tLSB8LS0tLS0tLS0tLS0tLXwgLS0tLS0gfAorfCBgaW5wdXRfZm9ybWF0YCB8IDAuIGBNSU1FX0lFVEZgIDEuIGBJRjJgIHwgQml0IDAgKExTQikgb2YgMXN0IGJ5dGUgb2YgZGF0YS4gfAorfCBgZnJhbWVfdHlwZWAgICB8IDAuIGBBTVJfNDc1YCAxLiBgQU1SXzUxNWAgMi4gYEFNUl81OWAgMy4gYEFNUl82N2AgIDQuIGBBTVJfNzRgIDUuIGBBTVJfNzk1YCA2LiBgQU1SXzEwMmAgNy4gYEFNUl8xMjJgICB8IEJpdHMgMywgNCBhbmQgNSBvZiAxc3QgYnl0ZSBvZiBkYXRhLiB8CisKKworVGhpcyBhbHNvIGVuc3VyZXMgdGhhdCB0aGUgcGx1Z2luIGlzIGFsd2F5cyBkZXRlcm1pbmlzdGljIGZvciBhbnkgZ2l2ZW4gaW5wdXQuCisKKyMjIyMjIE1heGltaXplIHV0aWxpemF0aW9uIG9mIGlucHV0IGRhdGEKK1RoZSBwbHVnaW4gZmVlZHMgdGhlIGVudGlyZSBpbnB1dCBkYXRhIHRvIHRoZSBjb2RlYyB1c2luZyBhIGxvb3AuCitJZiB0aGUgZGVjb2RlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgdGhlIGlucHV0IGlzIGFkdmFuY2VkIGJ5IHRoZSBmcmFtZSBzaXplCit3aGljaCBpcyBiYXNlZCBvbiBgaW5wdXRfZm9ybWF0YCBhbmQgYGZyYW1lX3R5cGVgIHNlbGVjdGVkLgorSWYgdGhlIGRlY29kZSBvcGVyYXRpb24gd2FzIHVuLXN1Y2Nlc3NmdWwsIHRoZSBpbnB1dCBpcyBzdGlsbCBhZHZhbmNlZCBieSBmcmFtZSBzaXplIHNvCit0aGF0IHRoZSBmdXp6ZXIgY2FuIHByb2NlZWQgdG8gZmVlZCB0aGUgbmV4dCBmcmFtZS4KKworVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiB0b2xlcmF0ZXMgYW55IGtpbmQgb2YgaW5wdXQgKGVtcHR5LCBodWdlLAorbWFsZm9ybWVkLCBldGMpIGFuZCBkb2VzbnQgYGV4aXQoKWAgb24gYW55IGlucHV0IGFuZCB0aGVyZWJ5IGluY3JlYXNpbmcgdGhlCitjaGFuY2Ugb2YgaWRlbnRpZnlpbmcgdnVsbmVyYWJpbGl0aWVzLgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBhbXJuYl9kZWNfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBhbXJuYl9kZWNfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgYW1ybmIgZmlsZXMgdG8gdGhhdCBmb2xkZXIKK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvYW1ybmJfZGVjX2Z1enplci9hbXJuYl9kZWNfZnV6emVyIENPUlBVU19ESVIKK2BgYAorVG8gcnVuIG9uIGhvc3QKK2BgYAorICAkICRBTkRST0lEX0hPU1RfT1VUL2Z1enoveDg2XzY0L2Ftcm5iX2RlY19mdXp6ZXIvYW1ybmJfZGVjX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyMgUmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sCisgKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1ybmIvZnV6emVyL2Ftcm5iX2RlY19mdXp6ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9hbXJuYl9kZWNfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNGU3ZTVjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2Ftcm5iL2Z1enplci9hbXJuYl9kZWNfZnV6emVyLmNwcApAQCAtMCwwICsxLDk0IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSAiZ3NtYW1yX2RlYy5oIgorCisvLyBDb25zdGFudHMgZm9yIEFNUi1OQgorY29uc3RleHByIGludDMyX3Qga1NhbXBsZXNQZXJGcmFtZSA9IExfRlJBTUU7Citjb25zdGV4cHIgaW50MzJfdCBrQml0c1BlclNhbXBsZSA9IDE2OworY29uc3RleHByIGludDMyX3Qga091dHB1dEJ1ZmZlclNpemUgPSBrU2FtcGxlc1BlckZyYW1lICoga0JpdHNQZXJTYW1wbGUgLyA4OworY29uc3QgYml0c3RyZWFtX2Zvcm1hdCBrQml0U3RyZWFtRm9ybWF0c1syXSA9IHtNSU1FX0lFVEYsIElGMn07Citjb25zdCBpbnQzMl90IGtMb2NhbFdtZkRlY0J5dGVzUGVyRnJhbWVbOF0gPSB7MTIsIDEzLCAxNSwgMTcsIDE5LCAyMCwgMjYsIDMxfTsKK2NvbnN0IGludDMyX3Qga0xvY2FsSWYyRGVjQnl0ZXNQZXJGcmFtZVs4XSA9IHsxMywgMTQsIDE2LCAxOCwgMTksIDIxLCAyNiwgMzF9OworCitjbGFzcyBDb2RlYyB7CisgcHVibGljOgorICBDb2RlYygpID0gZGVmYXVsdDsKKyAgfkNvZGVjKCkgeyBkZUluaXREZWNvZGVyKCk7IH0KKyAgaW50MTZfdCBpbml0RGVjb2RlcigpOworICB2b2lkIGRlSW5pdERlY29kZXIoKTsKKyAgdm9pZCBkZWNvZGVGcmFtZXMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworCisgcHJpdmF0ZToKKyAgdm9pZCAqbUFtckhhbmRsZSA9IG51bGxwdHI7Cit9OworCitpbnQxNl90IENvZGVjOjppbml0RGVjb2RlcigpIHsgcmV0dXJuIEdTTUluaXREZWNvZGUoJm1BbXJIYW5kbGUsIChXb3JkOCAqKSJBTVJOQkRlY29kZXIiKTsgfQorCit2b2lkIENvZGVjOjpkZUluaXREZWNvZGVyKCkgeyBHU01EZWNvZGVGcmFtZUV4aXQoJm1BbXJIYW5kbGUpOyB9CisKK3ZvaWQgQ29kZWM6OmRlY29kZUZyYW1lcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICB3aGlsZSAoc2l6ZSA+IDApIHsKKyAgICB1aW50OF90IG1vZGUgPSAqZGF0YTsKKyAgICBib29sIGJpdCA9IG1vZGUgJiAweDAxOworICAgIGJpdHN0cmVhbV9mb3JtYXQgYml0c3JlYW1Gb3JtYXQgPSBrQml0U3RyZWFtRm9ybWF0c1tiaXRdOworICAgIGludDMyX3QgZnJhbWVTaXplID0gMDsKKyAgICAvKiBGaW5kIGZyYW1lIHR5cGUgKi8KKyAgICBGcmFtZV9UeXBlXzNHUFAgZnJhbWVUeXBlID0gc3RhdGljX2Nhc3Q8RnJhbWVfVHlwZV8zR1BQPigobW9kZSA+PiAzKSAmIDB4MDcpOworICAgICsrZGF0YTsKKyAgICAtLXNpemU7CisgICAgaWYgKGJpdCkgeworICAgICAgZnJhbWVTaXplID0ga0xvY2FsSWYyRGVjQnl0ZXNQZXJGcmFtZVtmcmFtZVR5cGVdOworICAgIH0gZWxzZSB7CisgICAgICBmcmFtZVNpemUgPSBrTG9jYWxXbWZEZWNCeXRlc1BlckZyYW1lW2ZyYW1lVHlwZV07CisgICAgfQorICAgIGludDE2X3Qgb3V0cHV0QnVmW2tPdXRwdXRCdWZmZXJTaXplXTsKKyAgICB1aW50OF90ICppbnB1dEJ1ZiA9IG5ldyB1aW50OF90W2ZyYW1lU2l6ZV07CisgICAgaWYgKCFpbnB1dEJ1ZikgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQzMl90IG1pblNpemUgPSBzdGQ6Om1pbigoaW50MzJfdClzaXplLCBmcmFtZVNpemUpOworICAgIG1lbWNweShpbnB1dEJ1ZiwgZGF0YSwgbWluU2l6ZSk7CisgICAgQU1SRGVjb2RlKG1BbXJIYW5kbGUsIGZyYW1lVHlwZSwgaW5wdXRCdWYsIG91dHB1dEJ1ZiwgYml0c3JlYW1Gb3JtYXQpOworICAgIC8qIEFNUkRlY29kZSgpIGRlY29kZXMgbWluU2l6ZSBudW1iZXIgb2YgYnl0ZXMgaWYgZGVjb2RlIGlzIHN1Y2Nlc3NmdWwuCisgICAgICogQU1SRGVjb2RlKCkgcmV0dXJucyAtMSBpZiBkZWNvZGUgZmFpbHMuCisgICAgICogRXZlbiBpZiBubyBieXRlcyBhcmUgZGVjb2RlZCwgaW5jcmVtZW50IGJ5IG1pblNpemUgdG8gZW5zdXJlIGZ1enplciBwcm9jZWVkcworICAgICAqIHRvIGZlZWQgbmV4dCBkYXRhICovCisgICAgZGF0YSArPSBtaW5TaXplOworICAgIHNpemUgLT0gbWluU2l6ZTsKKyAgICBkZWxldGVbXSBpbnB1dEJ1ZjsKKyAgfQorfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmIChzaXplIDwgMikgeworICAgIHJldHVybiAwOworICB9CisgIENvZGVjICpjb2RlYyA9IG5ldyBDb2RlYygpOworICBpZiAoIWNvZGVjKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGNvZGVjLT5pbml0RGVjb2RlcigpID09IDApIHsKKyAgICBjb2RlYy0+ZGVjb2RlRnJhbWVzKGRhdGEsIHNpemUpOworICB9CisgIGRlbGV0ZSBjb2RlYzsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLmJwCmluZGV4IDlmZWZkODEuLmQ4Y2I1NjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9BbmRyb2lkLmJwCkBAIC0xLDYgKzEsNyBAQAogY2NfbGlicmFyeV9zdGF0aWMgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgInNyYy9hZ2MyX2Ftcl93Yi5jcHAiLApAQCAtNDQsOCArNDUsNiBAQAogICAgICAgICAic3JjL3dlaWdodF9hbXJ3Yl9scGMuY3BwIiwKICAgICBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSJdLAotCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWwogICAgICAgICAic3JjIiwKICAgICAgICAgImluY2x1ZGUiLApAQCAtNjMsMTIgKzYyLDE5IEBACiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgIH0sCisKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAogfQogCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIGNjX3Rlc3QgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9hbXJ3YmRlY190ZXN0IiwKICAgICBndGVzdDogZmFsc2UsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCiAKICAgICBzcmNzOiBbInRlc3QvYW1yd2JkZWNfdGVzdC5jcHAiXSwKIApAQCAtODgsNCArOTQsMTAgQEAKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCiAgICAgICAgIF0sCiAgICAgfSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZmNzdlMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDM1IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworY2NfZnV6eiB7CisgICAgbmFtZTogImFtcndiX2RlY19mdXp6ZXIiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgImFtcndiX2RlY19mdXp6ZXIuY3BwIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9hbXJ3YmRlYyIsCisgICAgXSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgZGFyd2luOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL2Z1enplci9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvZnV6emVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTQ1Nzg0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL2Z1enplci9SRUFETUUubWQKQEAgLTAsMCArMSw2MSBAQAorIyBGdXp6ZXIgZm9yIGxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjIGRlY29kZXIKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIEFNUi1XQiBpcyBkZXNpZ25lZCBiYXNlZCBvbiB0aGUgdW5kZXJzdGFuZGluZyBvZiB0aGUKK2NvZGVjIGFuZCB0cmllcyB0byBhY2hpZXZlIHRoZSBmb2xsb3dpbmc6CisKKyMjIyMjIE1heGltaXplIGNvZGUgY292ZXJhZ2UKK1RoZSBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnMgYXJlIG5vdCBoYXJkY29kZWQsIGJ1dCBpbnN0ZWFkIHNlbGVjdGVkIGJhc2VkIG9uCitpbmNvbWluZyBkYXRhLiBUaGlzIGVuc3VyZXMgbW9yZSBjb2RlIHBhdGhzIGFyZSByZWFjaGVkIGJ5IHRoZSBmdXp6ZXIuCisKK0FNUi1XQiBzdXBwb3J0cyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CisxLiBRdWFsaXR5IChwYXJhbWV0ZXIgbmFtZTogYHF1YWxpdHlgKQorMi4gTW9kZSAocGFyYW1ldGVyIG5hbWU6IGBtb2RlYCkKKworfCBQYXJhbWV0ZXJ8IFZhbGlkIFZhbHVlc3wgQ29uZmlndXJlZCBWYWx1ZXwKK3wtLS0tLS0tLS0tLS0tIHwtLS0tLS0tLS0tLS0tfCAtLS0tLSB8Cit8IGBxdWFsaXR5YCB8IDAuIGBCYWQgUXVhbGl0eWAgMS4gYEdvb2QgcXVhbGl0eWAgfCBCaXQgMCAoTFNCKSBvZiAxc3QgYnl0ZSBvZiBkYXRhLiB8Cit8IGBtb2RlYCAgIHwgMC4gYE1PREVfN2tgIDEuIGBNT0RFXzlrYCAyLiBgTU9ERV8xMmtgIDMuIGBNT0RFXzE0a2AgIDQuIGBNT0RFXzE2ayBgIDUuIGBNT0RFXzE4a2AgNi4gYE1PREVfMjBrYCA3LiBgTU9ERV8yM2tgIDguIGBNT0RFXzI0a2AgOS4gYE1SRFRYYCAgfCBCaXRzIDMsIDQsIDUgYW5kIDYgb2YgMXN0IGJ5dGUgb2YgZGF0YS4gfAorCitUaGlzIGFsc28gZW5zdXJlcyB0aGF0IHRoZSBwbHVnaW4gaXMgYWx3YXlzIGRldGVybWluaXN0aWMgZm9yIGFueSBnaXZlbiBpbnB1dC4KKworIyMjIyMgTWF4aW1pemUgdXRpbGl6YXRpb24gb2YgaW5wdXQgZGF0YQorVGhlIHBsdWdpbiBmZWVkcyB0aGUgZW50aXJlIGlucHV0IGRhdGEgdG8gdGhlIGNvZGVjIHVzaW5nIGEgbG9vcC4KK0lmIHRoZSBkZWNvZGUgb3BlcmF0aW9uIHdhcyBzdWNjZXNzZnVsLCB0aGUgaW5wdXQgaXMgYWR2YW5jZWQgYnkgdGhlIGZyYW1lIHNpemUKK3doaWNoIGlzIGJhc2VkIG9uIGBtb2RlYCBhbmQgYHF1YWxpdHlgIHNlbGVjdGVkLgorSWYgdGhlIGRlY29kZSBvcGVyYXRpb24gd2FzIHVuLXN1Y2Nlc3NmdWwsIHRoZSBpbnB1dCBpcyBzdGlsbCBhZHZhbmNlZCBieSBmcmFtZSBzaXplIHNvCit0aGF0IHRoZSBmdXp6ZXIgY2FuIHByb2NlZWQgdG8gZmVlZCB0aGUgbmV4dCBmcmFtZS4KKworVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiB0b2xlcmF0ZXMgYW55IGtpbmQgb2YgaW5wdXQgKGVtcHR5LCBodWdlLAorbWFsZm9ybWVkLCBldGMpIGFuZCBkb2VzbnQgYGV4aXQoKWAgb24gYW55IGlucHV0IGFuZCB0aGVyZWJ5IGluY3JlYXNpbmcgdGhlCitjaGFuY2Ugb2YgaWRlbnRpZnlpbmcgdnVsbmVyYWJpbGl0aWVzLgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBhbXJ3Yl9kZWNfZnV6emVyIGJpbmFyeS4KKworIyMjIEFuZHJvaWQKKworIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBhbXJ3Yl9kZWNfZnV6emVyCitgYGAKKworIyMjIyBTdGVwcyB0byBydW4KK0NyZWF0ZSBhIGRpcmVjdG9yeSBDT1JQVVNfRElSIGFuZCBjb3B5IHNvbWUgYW1yd2IgZmlsZXMgdG8gdGhhdCBmb2xkZXIKK1B1c2ggdGhpcyBkaXJlY3RvcnkgdG8gZGV2aWNlLgorCitUbyBydW4gb24gZGV2aWNlCitgYGAKKyAgJCBhZGIgc3luYyBkYXRhCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvYW1yd2JfZGVjX2Z1enplci9hbXJ3Yl9kZWNfZnV6emVyIENPUlBVU19ESVIKK2BgYAorVG8gcnVuIG9uIGhvc3QKK2BgYAorICAkICRBTkRST0lEX0hPU1RfT1VUL2Z1enoveDg2XzY0L2FtcndiX2RlY19mdXp6ZXIvYW1yd2JfZGVjX2Z1enplciBDT1JQVVNfRElSCitgYGAKKworIyMgUmVmZXJlbmNlczoKKyAqIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0xpYkZ1enplci5odG1sCisgKiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL29zcy1mdXp6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvZnV6emVyL2FtcndiX2RlY19mdXp6ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL2Z1enplci9hbXJ3Yl9kZWNfZnV6emVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGMwMjcwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL2Z1enplci9hbXJ3Yl9kZWNfZnV6emVyLmNwcApAQCAtMCwwICsxLDExMCBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgInB2YW1yd2JkZWNvZGVyLmgiCisjaW5jbHVkZSAicHZhbXJ3YmRlY29kZXJfYXBpLmgiCisKKy8vIENvbnN0YW50cyBmb3IgQU1SLVdCLgorY29uc3RleHByIGludDMyX3Qga1NhbXBsZXNQZXJGcmFtZSA9IDMyMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtCaXRzUGVyU2FtcGxlID0gMTY7Citjb25zdGV4cHIgaW50MzJfdCBrTWF4U291cmNlRGF0YVVuaXRTaXplID0gS0FNUldCX05CX0JJVFNfTUFYICogc2l6ZW9mKGludDE2X3QpOworY29uc3RleHByIGludDMyX3Qga091dHB1dEJ1ZmZlclNpemUgPSBrU2FtcGxlc1BlckZyYW1lICoga0JpdHNQZXJTYW1wbGUgLyA4OworY29uc3RleHByIGludDMyX3Qga0ZyYW1lU2l6ZXNbMTZdID0gezE3LCAyMywgMzIsIDM2LCA0MCwgNDYsIDUwLCA1OCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA2MCwgMTcsIDIzLCAzMiwgMzYsIDQwLCA0NiwgNTB9OworCitjbGFzcyBDb2RlYyB7CisgcHVibGljOgorICBDb2RlYygpID0gZGVmYXVsdDsKKyAgfkNvZGVjKCkgeyBkZUluaXREZWNvZGVyKCk7IH0KKyAgYm9vbCBpbml0RGVjb2RlcigpOworICB2b2lkIGRlY29kZUZyYW1lcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisgIHZvaWQgZGVJbml0RGVjb2RlcigpOworCisgcHJpdmF0ZToKKyAgdm9pZCAqbUFtckhhbmRsZSA9IG51bGxwdHI7CisgIGludDE2X3QgKm1EZWNvZGVyQ29va2llID0gbnVsbHB0cjsKKyAgdm9pZCAqbURlY29kZXJCdWZmZXIgPSBudWxscHRyOworfTsKKworYm9vbCBDb2RlYzo6aW5pdERlY29kZXIoKSB7CisgIG1EZWNvZGVyQnVmZmVyID0gbWFsbG9jKHB2RGVjb2Rlcl9BbXJXYk1lbVJlcXVpcmVtZW50cygpKTsKKyAgaWYgKG1EZWNvZGVyQnVmZmVyKSB7CisgICAgcHZEZWNvZGVyX0FtcldiX0luaXQoJm1BbXJIYW5kbGUsIG1EZWNvZGVyQnVmZmVyLCAmbURlY29kZXJDb29raWUpOworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCit2b2lkIENvZGVjOjpkZUluaXREZWNvZGVyKCkgeworICBpZiAobURlY29kZXJCdWZmZXIpIHsKKyAgICBmcmVlKG1EZWNvZGVyQnVmZmVyKTsKKyAgICBtRGVjb2RlckJ1ZmZlciA9IG51bGxwdHI7CisgIH0KKyAgbUFtckhhbmRsZSA9IG51bGxwdHI7CisgIG1EZWNvZGVyQ29va2llID0gbnVsbHB0cjsKK30KKwordm9pZCBDb2RlYzo6ZGVjb2RlRnJhbWVzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIHdoaWxlIChzaXplID4gMCkgeworICAgIHVpbnQ4X3QgbW9kZUJ5dGUgPSAqZGF0YTsKKyAgICBib29sIHF1YWxpdHkgPSBtb2RlQnl0ZSAmIDB4MDE7CisgICAgaW50MTYgbW9kZSA9ICgobW9kZUJ5dGUgPj4gMykgJiAweDBmKTsKKyAgICArK2RhdGE7CisgICAgLS1zaXplOworICAgIGludDMyX3QgZnJhbWVTaXplID0ga0ZyYW1lU2l6ZXNbbW9kZV07CisgICAgaW50MTZfdCBpbnB1dFNhbXBsZUJ1ZltrTWF4U291cmNlRGF0YVVuaXRTaXplXTsKKyAgICB1aW50OF90ICppbnB1dEJ1ZiA9IG5ldyB1aW50OF90W2ZyYW1lU2l6ZV07CisgICAgaWYgKCFpbnB1dEJ1ZikgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnQzMl90IG1pblNpemUgPSBzdGQ6Om1pbigoaW50MzJfdClzaXplLCBmcmFtZVNpemUpOworICAgIG1lbWNweShpbnB1dEJ1ZiwgZGF0YSwgbWluU2l6ZSk7CisgICAgaW50MTYgZnJhbWVNb2RlID0gbW9kZTsKKyAgICBpbnQxNiBmcmFtZVR5cGU7CisgICAgUlhfU3RhdGVfd2Igcnhfc3RhdGU7CisgICAgbWltZV91bnNvcnRpbmcoaW5wdXRCdWYsIGlucHV0U2FtcGxlQnVmLCAmZnJhbWVUeXBlLCAmZnJhbWVNb2RlLCBxdWFsaXR5LCAmcnhfc3RhdGUpOworCisgICAgaW50MTZfdCBudW1TYW1wbGVzT3V0cHV0OworICAgIGludDE2X3Qgb3V0cHV0QnVmW2tPdXRwdXRCdWZmZXJTaXplXTsKKyAgICBwdkRlY29kZXJfQW1yV2IoZnJhbWVNb2RlLCBpbnB1dFNhbXBsZUJ1Ziwgb3V0cHV0QnVmLCAmbnVtU2FtcGxlc091dHB1dCwgbURlY29kZXJCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgIGZyYW1lVHlwZSwgbURlY29kZXJDb29raWUpOworICAgIGRhdGEgKz0gbWluU2l6ZTsKKyAgICBzaXplIC09IG1pblNpemU7CisgICAgZGVsZXRlW10gaW5wdXRCdWY7CisgIH0KK30KKworZXh0ZXJuICJDIiBpbnQgTExWTUZ1enplclRlc3RPbmVJbnB1dChjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBpZiAoc2l6ZSA8IDIpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICBDb2RlYyAqY29kZWMgPSBuZXcgQ29kZWMoKTsKKyAgaWYgKCFjb2RlYykgeworICAgIHJldHVybiAwOworICB9CisgIGlmIChjb2RlYy0+aW5pdERlY29kZXIoKSkgeworICAgIGNvZGVjLT5kZWNvZGVGcmFtZXMoZGF0YSwgc2l6ZSk7CisgIH0KKyAgZGVsZXRlIGNvZGVjOworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvZGVlbXBoYXNpc18zMi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2Ivc3JjL2RlZW1waGFzaXNfMzIuY3BwCmluZGV4IGI4MDU1NWIuLmMwZTRjNTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi9zcmMvZGVlbXBoYXNpc18zMi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3NyYy9kZWVtcGhhc2lzXzMyLmNwcApAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgaW50MTYgbG8sIGhpOwogCiAgICAgTF90bXAgID0gKChpbnQzMil4X2hpWzBdKSA8PCAxNjsKLSAgICBMX3RtcCArPSAoKGludDMyKXhfbG9bMF0pIDw8IDQ7CisgICAgTF90bXAgKz0gKCgoaW50MzIpeF9sb1swXSkgPDwgNCkgJiAweEZGRkY7CiAgICAgTF90bXAgID0gc2hsX2ludDMyKExfdG1wLCAzKTsKIAogICAgIExfdG1wID0gZnhwX21hY18xNmJ5MTYoKm1lbSwgbXUsIExfdG1wKSwKQEAgLTE0NCw3ICsxNDQsNyBAQAogICAgIGZvciAoaSA9IDE7IGkgPCBMIC0gMTsgaSsrKQogICAgIHsKICAgICAgICAgTF90bXAgID0gKChpbnQzMiloaSkgPDwgMTY7Ci0gICAgICAgIExfdG1wICs9ICgoaW50MzIpbG8pIDw8IDQ7CisgICAgICAgIExfdG1wICs9ICgoKGludDMyKWxvKSA8PCA0KSAmIDB4RkZGRjsKICAgICAgICAgTF90bXAgID0gc2hsX2ludDMyKExfdG1wLCAzKTsKICAgICAgICAgTF90bXAgID0gZnhwX21hY18xNmJ5MTYoeVtpIC0gMV0sIG11LCBMX3RtcCksCiAgICAgICAgICAgICAgICAgIExfdG1wICA9IHNobF9pbnQzMihMX3RtcCwgMSk7ICAgICAgICAgICAvKiBzYXR1cmF0aW9uIGNhbiBvY2N1ciBoZXJlICovCkBAIC0xNTMsNyArMTUzLDcgQEAKICAgICAgICAgaGkgICAgID0geF9oaVtpKzFdOwogICAgIH0KICAgICBMX3RtcCAgPSAoKGludDMyKWhpKSA8PCAxNjsKLSAgICBMX3RtcCArPSAoKGludDMyKWxvKSA8PCA0OworICAgIExfdG1wICs9ICgoKGludDMyKWxvKSA8PCA0KSAmIDB4RkZGRjsKICAgICBMX3RtcCAgPSBzaGxfaW50MzIoTF90bXAsIDMpOwogICAgIExfdG1wICA9IGZ4cF9tYWNfMTZieTE2KHlbaSAtIDFdLCBtdSwgTF90bXApLAogICAgICAgICAgICAgIExfdG1wICA9IHNobF9pbnQzMihMX3RtcCwgMSk7ICAgICAgICAgICAvKiBzYXR1cmF0aW9uIGNhbiBvY2N1ciBoZXJlICovCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvdGVzdC9BbXJ3YkRlY1Rlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3Rlc3QvQW1yd2JEZWNUZXN0RW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGQzMzdkCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3Rlc3QvQW1yd2JEZWNUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0FNUldCREVDX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisjZGVmaW5lIF9fQU1SV0JERUNfVEVTVF9FTlZJUk9OTUVOVF9IX18KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgQW1yd2JEZWNUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgIHB1YmxpYzoKKyAgICBBbXJ3YkRlY1Rlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvIikge30KKworICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIgKl9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQorCisgIHByaXZhdGU6CisgICAgc3RyaW5nIHJlczsKK307CisKK2ludCBBbXJ3YkRlY1Rlc3RFbnZpcm9ubWVudDo6aW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHt7InJlcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LCB7MCwgMCwgMCwgMH19OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiUDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ1AnOgorICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCisgICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBfX0FNUldCREVDX1RFU1RfRU5WSVJPTk1FTlRfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvdGVzdC9BbXJ3YkRlY29kZXJUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi90ZXN0L0FtcndiRGVjb2RlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYWQ4MWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvdGVzdC9BbXJ3YkRlY29kZXJUZXN0LmNwcApAQCAtMCwwICsxLDIyMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQW1yd2JEZWNvZGVyVGVzdCIKKyNkZWZpbmUgT1VUUFVUX0ZJTEUgIi9kYXRhL2xvY2FsL3RtcC9hbXJ3YkRlY29kZS5vdXQiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3NuZGZpbGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAicHZhbXJ3YmRlY29kZXIuaCIKKyNpbmNsdWRlICJwdmFtcndiZGVjb2Rlcl9hcGkuaCIKKworI2luY2x1ZGUgIkFtcndiRGVjVGVzdEVudmlyb25tZW50LmgiCisKKy8vIENvbnN0YW50cyBmb3IgQU1SLVdCLgorY29uc3RleHByIGludDMyX3Qga0lucHV0QnVmZmVyU2l6ZSA9IDY0OworY29uc3RleHByIGludDMyX3Qga1NhbXBsZXNQZXJGcmFtZSA9IDMyMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtCaXRzUGVyU2FtcGxlID0gMTY7Citjb25zdGV4cHIgaW50MzJfdCBrU2FtcGxlUmF0ZSA9IDE2MDAwOworY29uc3RleHByIGludDMyX3Qga0NoYW5uZWxzID0gMTsKK2NvbnN0ZXhwciBpbnQzMl90IGtNYXhTb3VyY2VEYXRhVW5pdFNpemUgPSBLQU1SV0JfTkJfQklUU19NQVggKiBzaXplb2YoaW50MTZfdCk7Citjb25zdGV4cHIgaW50MzJfdCBrT3V0cHV0QnVmZmVyU2l6ZSA9IGtTYW1wbGVzUGVyRnJhbWUgKiBrQml0c1BlclNhbXBsZSAvIDg7Citjb25zdCBpbnQzMl90IGtGcmFtZVNpemVzWzE2XSA9IHsxNywgMjMsIDMyLCAzNiwgNDAsIDQ2LCA1MCwgNTgsIDYwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMX07Citjb25zdGV4cHIgaW50MzJfdCBrTnVtRnJhbWVSZXNldCA9IDE1MDsKKworY29uc3RleHByIGludDMyX3Qga01heENvdW50ID0gMTA7CisKK3N0YXRpYyBBbXJ3YkRlY1Rlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK2NsYXNzIEFtcndiRGVjb2RlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0cmluZz4geworICBwdWJsaWM6CisgICAgQW1yd2JEZWNvZGVyVGVzdCgpIDogbUZwSW5wdXQobnVsbHB0cikge30KKworICAgIH5BbXJ3YkRlY29kZXJUZXN0KCkgeworICAgICAgICBpZiAobUZwSW5wdXQpIHsKKyAgICAgICAgICAgIGZjbG9zZShtRnBJbnB1dCk7CisgICAgICAgICAgICBtRnBJbnB1dCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBGSUxFICptRnBJbnB1dDsKKyAgICBpbnQzMl90IERlY29kZUZyYW1lcyhpbnQxNl90ICpkZWNvZGVyQ29va2llLCB2b2lkICpkZWNvZGVyQnVmLCBTTkRGSUxFICpvdXRGaWxlSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVDb3VudCA9IElOVDMyX01BWCk7CisgICAgU05ERklMRSAqb3Blbk91dHB1dEZpbGUoU0ZfSU5GTyAqc2ZJbmZvKTsKK307CisKK1NOREZJTEUgKkFtcndiRGVjb2RlclRlc3Q6Om9wZW5PdXRwdXRGaWxlKFNGX0lORk8gKnNmSW5mbykgeworICAgIG1lbXNldChzZkluZm8sIDAsIHNpemVvZihTRl9JTkZPKSk7CisgICAgc2ZJbmZvLT5jaGFubmVscyA9IGtDaGFubmVsczsKKyAgICBzZkluZm8tPmZvcm1hdCA9IFNGX0ZPUk1BVF9XQVYgfCBTRl9GT1JNQVRfUENNXzE2OworICAgIHNmSW5mby0+c2FtcGxlcmF0ZSA9IGtTYW1wbGVSYXRlOworICAgIFNOREZJTEUgKm91dEZpbGVIYW5kbGUgPSBzZl9vcGVuKE9VVFBVVF9GSUxFLCBTRk1fV1JJVEUsIHNmSW5mbyk7CisgICAgcmV0dXJuIG91dEZpbGVIYW5kbGU7Cit9CisKK2ludDMyX3QgQW1yd2JEZWNvZGVyVGVzdDo6RGVjb2RlRnJhbWVzKGludDE2X3QgKmRlY29kZXJDb29raWUsIHZvaWQgKmRlY29kZXJCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTkRGSUxFICpvdXRGaWxlSGFuZGxlLCBpbnQzMl90IGZyYW1lQ291bnQpIHsKKyAgICB1aW50OF90IGlucHV0QnVmW2tJbnB1dEJ1ZmZlclNpemVdOworICAgIGludDE2X3QgaW5wdXRTYW1wbGVCdWZba01heFNvdXJjZURhdGFVbml0U2l6ZV07CisgICAgaW50MTZfdCBvdXRwdXRCdWZba091dHB1dEJ1ZmZlclNpemVdOworCisgICAgd2hpbGUgKGZyYW1lQ291bnQgPiAwKSB7CisgICAgICAgIHVpbnQ4X3QgbW9kZUJ5dGU7CisgICAgICAgIGludDMyX3QgYnl0ZXNSZWFkID0gZnJlYWQoJm1vZGVCeXRlLCAxLCAxLCBtRnBJbnB1dCk7CisgICAgICAgIGlmIChieXRlc1JlYWQgIT0gMSkgYnJlYWs7CisKKyAgICAgICAgaW50MTYgbW9kZSA9ICgobW9kZUJ5dGUgPj4gMykgJiAweDBmKTsKKyAgICAgICAgaWYgKG1vZGUgPj0gOSkgeworICAgICAgICAgICAgLy8gUHJvZHVjZSBzaWxlbmNlIGZvciBjb21mb3J0IG5vaXNlLCBzcGVlY2ggbG9zdCBhbmQgbm8gZGF0YS4KKyAgICAgICAgICAgIGludDMyX3Qgb3V0cHV0QnVmZmVyU2l6ZSA9IGtTYW1wbGVzUGVyRnJhbWUgKiBrQml0c1BlclNhbXBsZSAvIDg7CisgICAgICAgICAgICBtZW1zZXQob3V0cHV0QnVmLCAwLCBvdXRwdXRCdWZmZXJTaXplKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFJlYWQgcmVzdCBvZiB0aGUgZnJhbWUuCisgICAgICAgICAgICBpbnQzMl90IGZyYW1lU2l6ZSA9IGtGcmFtZVNpemVzW21vZGVdOworICAgICAgICAgICAgLy8gQU1SLVdCIGZpbGUgZm9ybWF0IGNhbm5vdCBoYXZlIG1vZGUgMTAsIDExLCAxMiBhbmQgMTMuCisgICAgICAgICAgICBpZiAoZnJhbWVTaXplIDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbGxlZ2FsIGZyYW1lIG1vZGUiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBieXRlc1JlYWQgPSBmcmVhZChpbnB1dEJ1ZiwgMSwgZnJhbWVTaXplLCBtRnBJbnB1dCk7CisgICAgICAgICAgICBpZiAoYnl0ZXNSZWFkICE9IGZyYW1lU2l6ZSkgYnJlYWs7CisKKyAgICAgICAgICAgIGludDE2IGZyYW1lTW9kZSA9IG1vZGU7CisgICAgICAgICAgICBpbnQxNiBmcmFtZVR5cGU7CisgICAgICAgICAgICBSWF9TdGF0ZV93YiByeF9zdGF0ZTsKKyAgICAgICAgICAgIG1pbWVfdW5zb3J0aW5nKGlucHV0QnVmLCBpbnB1dFNhbXBsZUJ1ZiwgJmZyYW1lVHlwZSwgJmZyYW1lTW9kZSwgMSwgJnJ4X3N0YXRlKTsKKworICAgICAgICAgICAgaW50MTZfdCBudW1TYW1wbGVzT3V0cHV0OworICAgICAgICAgICAgcHZEZWNvZGVyX0FtcldiKGZyYW1lTW9kZSwgaW5wdXRTYW1wbGVCdWYsIG91dHB1dEJ1ZiwgJm51bVNhbXBsZXNPdXRwdXQsIGRlY29kZXJCdWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVUeXBlLCBkZWNvZGVyQ29va2llKTsKKyAgICAgICAgICAgIGlmIChudW1TYW1wbGVzT3V0cHV0ICE9IGtTYW1wbGVzUGVyRnJhbWUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGRlY29kZSB0aGUgaW5wdXQgZmlsZSIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoaW50IGNvdW50ID0gMDsgY291bnQgPCBrU2FtcGxlc1BlckZyYW1lOyArK2NvdW50KSB7CisgICAgICAgICAgICAgICAgLyogRGVsZXRlIHRoZSAyIExTQnMgKDE0LWJpdCBvdXRwdXQpICovCisgICAgICAgICAgICAgICAgb3V0cHV0QnVmW2NvdW50XSAmPSAweGZmZmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2Zfd3JpdGVmX3Nob3J0KG91dEZpbGVIYW5kbGUsIG91dHB1dEJ1Ziwga1NhbXBsZXNQZXJGcmFtZSAvIGtDaGFubmVscyk7CisgICAgICAgIGZyYW1lQ291bnQtLTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK1RFU1RfRihBbXJ3YkRlY29kZXJUZXN0LCBNdWx0aUNyZWF0ZUFtcndiRGVjb2RlclRlc3QpIHsKKyAgICB1aW50MzJfdCBtZW1SZXF1aXJlbWVudHMgPSBwdkRlY29kZXJfQW1yV2JNZW1SZXF1aXJlbWVudHMoKTsKKyAgICB2b2lkICpkZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcXVpcmVtZW50cyk7CisgICAgQVNTRVJUX05FKGRlY29kZXJCdWYsIG51bGxwdHIpCisgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIGRlY29kZXIgbWVtb3J5IG9mIHNpemUgIiA8PCBtZW1SZXF1aXJlbWVudHM7CisKKyAgICAvLyBDcmVhdGUgQU1SLVdCIGRlY29kZXIgaW5zdGFuY2UuCisgICAgdm9pZCAqYW1ySGFuZGxlID0gbnVsbHB0cjsKKyAgICBpbnQxNl90ICpkZWNvZGVyQ29va2llOworICAgIGZvciAoaW50IGNvdW50ID0gMDsgY291bnQgPCBrTWF4Q291bnQ7IGNvdW50KyspIHsKKyAgICAgICAgcHZEZWNvZGVyX0FtcldiX0luaXQoJmFtckhhbmRsZSwgZGVjb2RlckJ1ZiwgJmRlY29kZXJDb29raWUpOworICAgICAgICBBU1NFUlRfTkUoYW1ySGFuZGxlLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGluaXRpYWxpemUgZGVjb2RlciI7CisgICAgICAgIEFMT0dWKCJEZWNvZGVyIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Iik7CisgICAgfQorICAgIGlmIChkZWNvZGVyQnVmKSB7CisgICAgICAgIGZyZWUoZGVjb2RlckJ1Zik7CisgICAgICAgIGRlY29kZXJCdWYgPSBudWxscHRyOworICAgIH0KK30KKworVEVTVF9QKEFtcndiRGVjb2RlclRlc3QsIERlY29kZVRlc3QpIHsKKyAgICB1aW50MzJfdCBtZW1SZXF1aXJlbWVudHMgPSBwdkRlY29kZXJfQW1yV2JNZW1SZXF1aXJlbWVudHMoKTsKKyAgICB2b2lkICpkZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcXVpcmVtZW50cyk7CisgICAgQVNTRVJUX05FKGRlY29kZXJCdWYsIG51bGxwdHIpCisgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIGRlY29kZXIgbWVtb3J5IG9mIHNpemUgIiA8PCBtZW1SZXF1aXJlbWVudHM7CisKKyAgICB2b2lkICphbXJIYW5kbGUgPSBudWxscHRyOworICAgIGludDE2X3QgKmRlY29kZXJDb29raWU7CisgICAgcHZEZWNvZGVyX0FtcldiX0luaXQoJmFtckhhbmRsZSwgZGVjb2RlckJ1ZiwgJmRlY29kZXJDb29raWUpOworICAgIEFTU0VSVF9ORShhbXJIYW5kbGUsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBkZWNvZGVyIjsKKworICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCk7CisgICAgbUZwSW5wdXQgPSBmb3BlbihpbnB1dEZpbGUuY19zdHIoKSwgInJiIik7CisgICAgQVNTRVJUX05FKG1GcElucHV0LCBudWxscHRyKSA8PCAiRXJyb3Igb3BlbmluZyBpbnB1dCBmaWxlICIgPDwgaW5wdXRGaWxlOworCisgICAgLy8gT3BlbiB0aGUgb3V0cHV0IGZpbGUuCisgICAgU0ZfSU5GTyBzZkluZm87CisgICAgU05ERklMRSAqb3V0RmlsZUhhbmRsZSA9IG9wZW5PdXRwdXRGaWxlKCZzZkluZm8pOworICAgIEFTU0VSVF9ORShvdXRGaWxlSGFuZGxlLCBudWxscHRyKSA8PCAiRXJyb3Igb3BlbmluZyBvdXRwdXQgZmlsZSBmb3Igd3JpdGluZyBkZWNvZGVkIG91dHB1dCI7CisKKyAgICBpbnQzMl90IGRlY29kZXJFcnIgPSBEZWNvZGVGcmFtZXMoZGVjb2RlckNvb2tpZSwgZGVjb2RlckJ1Ziwgb3V0RmlsZUhhbmRsZSk7CisgICAgQVNTRVJUX0VRKGRlY29kZXJFcnIsIDApIDw8ICJEZWNvZGVGcmFtZXMgcmV0dXJuZWQgZXJyb3IiOworCisgICAgc2ZfY2xvc2Uob3V0RmlsZUhhbmRsZSk7CisgICAgaWYgKGRlY29kZXJCdWYpIHsKKyAgICAgICAgZnJlZShkZWNvZGVyQnVmKTsKKyAgICAgICAgZGVjb2RlckJ1ZiA9IG51bGxwdHI7CisgICAgfQorfQorCitURVNUX1AoQW1yd2JEZWNvZGVyVGVzdCwgUmVzZXREZWNvZGVyVGVzdCkgeworICAgIHVpbnQzMl90IG1lbVJlcXVpcmVtZW50cyA9IHB2RGVjb2Rlcl9BbXJXYk1lbVJlcXVpcmVtZW50cygpOworICAgIHZvaWQgKmRlY29kZXJCdWYgPSBtYWxsb2MobWVtUmVxdWlyZW1lbnRzKTsKKyAgICBBU1NFUlRfTkUoZGVjb2RlckJ1ZiwgbnVsbHB0cikKKyAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgZGVjb2RlciBtZW1vcnkgb2Ygc2l6ZSAiIDw8IG1lbVJlcXVpcmVtZW50czsKKworICAgIHZvaWQgKmFtckhhbmRsZSA9IG51bGxwdHI7CisgICAgaW50MTZfdCAqZGVjb2RlckNvb2tpZTsKKyAgICBwdkRlY29kZXJfQW1yV2JfSW5pdCgmYW1ySGFuZGxlLCBkZWNvZGVyQnVmLCAmZGVjb2RlckNvb2tpZSk7CisgICAgQVNTRVJUX05FKGFtckhhbmRsZSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBpbml0aWFsaXplIGRlY29kZXIiOworCisgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKTsKKyAgICBtRnBJbnB1dCA9IGZvcGVuKGlucHV0RmlsZS5jX3N0cigpLCAicmIiKTsKKyAgICBBU1NFUlRfTkUobUZwSW5wdXQsIG51bGxwdHIpIDw8ICJFcnJvciBvcGVuaW5nIGlucHV0IGZpbGUgIiA8PCBpbnB1dEZpbGU7CisKKyAgICAvLyBPcGVuIHRoZSBvdXRwdXQgZmlsZS4KKyAgICBTRl9JTkZPIHNmSW5mbzsKKyAgICBTTkRGSUxFICpvdXRGaWxlSGFuZGxlID0gb3Blbk91dHB1dEZpbGUoJnNmSW5mbyk7CisgICAgQVNTRVJUX05FKG91dEZpbGVIYW5kbGUsIG51bGxwdHIpIDw8ICJFcnJvciBvcGVuaW5nIG91dHB1dCBmaWxlIGZvciB3cml0aW5nIGRlY29kZWQgb3V0cHV0IjsKKworICAgIC8vIERlY29kZSAxNTAgZnJhbWVzIGZpcnN0CisgICAgaW50MzJfdCBkZWNvZGVyRXJyID0gRGVjb2RlRnJhbWVzKGRlY29kZXJDb29raWUsIGRlY29kZXJCdWYsIG91dEZpbGVIYW5kbGUsIGtOdW1GcmFtZVJlc2V0KTsKKyAgICBBU1NFUlRfRVEoZGVjb2RlckVyciwgMCkgPDwgIkRlY29kZUZyYW1lcyByZXR1cm5lZCBlcnJvciI7CisKKyAgICAvLyBSZXNldCBEZWNvZGVyCisgICAgcHZEZWNvZGVyX0FtcldiX1Jlc2V0KGRlY29kZXJCdWYsIDEpOworCisgICAgLy8gU3RhcnQgZGVjb2RpbmcgYWdhaW4KKyAgICBkZWNvZGVyRXJyID0gRGVjb2RlRnJhbWVzKGRlY29kZXJDb29raWUsIGRlY29kZXJCdWYsIG91dEZpbGVIYW5kbGUpOworICAgIEFTU0VSVF9FUShkZWNvZGVyRXJyLCAwKSA8PCAiRGVjb2RlRnJhbWVzIHJldHVybmVkIGVycm9yIjsKKworICAgIHNmX2Nsb3NlKG91dEZpbGVIYW5kbGUpOworICAgIGlmIChkZWNvZGVyQnVmKSB7CisgICAgICAgIGZyZWUoZGVjb2RlckJ1Zik7CisgICAgfQorfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoQW1yd2JEZWNvZGVyVGVzdEFsbCwgQW1yd2JEZWNvZGVyVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygoImJiYl9hbXJ3Yl8xY2hfMTRrYnBzXzE2MDAwaHouYW1yd2IiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImJiYl8xNjAwMGh6XzFjaF85a2Jwc19hbXJ3Yl8zMHNlYy5hbXJ3YiIpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGdFbnYgPSBuZXcgQW1yd2JEZWNUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIEFMT0dWKCJUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi90ZXN0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4MjE1YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi90ZXN0L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJBbXJ3YkRlY29kZXJUZXN0IiwKKyAgICBndGVzdDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkFtcndiRGVjb2RlclRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2FtcndiZGVjIiwKKyAgICAgICAgImxpYnNuZGZpbGUiLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvdGVzdC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIxMWExZgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi90ZXN0L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgQW1yLXdiIERlY29kZXIgdW5pdCB0ZXN0Ij4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iQW1yd2JEZWNvZGVyVGVzdCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJBbXJ3YkRlY29kZXJUZXN0LT4vZGF0YS9sb2NhbC90bXAvQW1yd2JEZWNvZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiL3Rlc3QvQW1yd2JEZWNvZGVyVGVzdC56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvQW1yd2JEZWNvZGVyVGVzdFJlcy8iIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IkFtcndiRGVjb2RlclRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9BbXJ3YkRlY29kZXJUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvdGVzdC9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvdGVzdC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTlkNWMwNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3Yi90ZXN0L1JFQURNRS5tZApAQCAtMCwwICsxLDM5IEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgQU1SLVdCIERlY29kZXIgOgorVGhlIEFtci1XYiBEZWNvZGVyIFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBhbXJ3YiBkZWNvZGVyIGF2YWlsYWJsZSBpbiBsaWJzdGFnZWZyaWdodC4KKworUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6CitgYGAKK20gQW1yd2JEZWNvZGVyVGVzdAorYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9BbXJ3YkRlY29kZXJUZXN0L0FtcndiRGVjb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9BbXJ3YkRlY29kZXJUZXN0L0FtcndiRGVjb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2IvdGVzdC9BbXJ3YkRlY29kZXJUZXN0LnppcCkuIERvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KKworYGBgCithZGIgcHVzaCBBbXJ3YkRlY29kZXJUZXN0UmVzLy4gL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK3VzYWdlOiBBbXJ3YkRlY29kZXJUZXN0IC1QIFw8cGF0aF90b19mb2xkZXJcPgorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL0FtcndiRGVjb2RlclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL0FtcndiRGVjb2RlclRlc3RSZXMvCitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IEFtcndiRGVjb2RlclRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLmJwCmluZGV4IGI5ZDQ1YzEuLjA4NGJlMGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9BbmRyb2lkLmJwCkBAIC0xMjksNiArMTI5LDcgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uIiwKKyAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKIAogICAgIGNmbGFnczogWyItV2Vycm9yIl0sCkBAIC0xNDIsMjAgKzE0MywxMCBAQAogCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfYW1yd2JlbmMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWyJTb2Z0QU1SV0JFbmNvZGVyLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKLQogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCiAgICAgc2FuaXRpemU6IHsKQEAgLTE2OCwxNSArMTU5LDcgQEAKICAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9hbXJ3YmVuYyJdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uIiwKICAgICBdLAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CiAKLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1zdWJkaXJzID0gWyJTYW1wbGVDb2RlIl0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvU2FtcGxlQ29kZS9BbmRyb2lkLmJwCmluZGV4IDk1Zjk0OTQuLjk0NDJmYzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9TYW1wbGVDb2RlL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL1NhbXBsZUNvZGUvQW5kcm9pZC5icApAQCAtMTQsNiArMTQsNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKIAogICAgIHN0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvc3JjL2M0dDY0ZnguYyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYzR0NjRmeC5jCmluZGV4IDhjZWJiMDkuLmYyZTI4YzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYzR0NjRmeC5jCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy9zcmMvYzR0NjRmeC5jCkBAIC00Nyw2ICs0NywxMCBAQAogCiAjaW5jbHVkZSAicV9wdWxzZS5oIgogCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJhbXJ3YmVuYyIKKyNpbmNsdWRlICJsb2cvbG9nLmgiCisKIHN0YXRpYyBXb3JkMTYgdGlwb3NbMzZdID0gewogICAgIDAsIDEsIDIsIDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIHBvaW50ICZpcG9zWzBdLCAxc3QgaXRlciAqLwogICAgIDEsIDIsIDMsIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIHBvaW50ICZpcG9zWzRdLCAybmQgaXRlciAqLwpAQCAtNzQ1LDExICs3NDksMTYgQEAKIAogICAgICAgICBpID0gKFdvcmQxNikoKHZvX0xfbXVsdCh0cmFjaywgTlBNQVhQVCkgPj4gMSkpOwogCi0gICAgICAgIHdoaWxlIChpbmRbaV0gPj0gMCkKKyAgICAgICAgd2hpbGUgKGkgPCBOUE1BWFBUICogTkJfVFJBQ0sgJiYgaW5kW2ldID49IDApCiAgICAgICAgIHsKICAgICAgICAgICAgIGkgKz0gMTsKICAgICAgICAgfQotICAgICAgICBpbmRbaV0gPSBpbmRleDsKKyAgICAgICAgaWYgKGkgPCBOUE1BWFBUICogTkJfVFJBQ0spIHsKKyAgICAgICAgICAgIGluZFtpXSA9IGluZGV4OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoImIvMTMyNjQ3MjIyLCBPT0IgYWNjZXNzIGluIGluZCBhcnJheSB0cmFjaz0lZCBpPSVkIiwgdHJhY2ssIGkpOworICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMzI2NDcyMjIiKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGsgPSAwOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3Rlc3QvQW1yd2JFbmNUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy90ZXN0L0FtcndiRW5jVGVzdEVudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDhhZGE2NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy90ZXN0L0FtcndiRW5jVGVzdEVudmlyb25tZW50LmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19BTVJXQkVOQ19URVNUX0VOVklST05NRU5UX0hfXworI2RlZmluZSBfX0FNUldCRU5DX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIEFtcndiRW5jVGVzdEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgQW1yd2JFbmNUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL2RhdGEvbG9jYWwvdG1wLyIpIHt9CisKKyAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyICpfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IHN0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KKworICBwcml2YXRlOgorICAgIHN0cmluZyByZXM7Cit9OworCitpbnQgQW1yd2JFbmNUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJyZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgorICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gX19BTVJXQkVOQ19URVNUX0VOVklST05NRU5UX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3Rlc3QvQW1yd2JFbmNvZGVyVGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvdGVzdC9BbXJ3YkVuY29kZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTZlZTI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3Rlc3QvQW1yd2JFbmNvZGVyVGVzdC5jcHAKQEAgLTAsMCArMSwxOTggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkFtcndiRW5jb2RlclRlc3QiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJjbW5NZW1vcnkuaCIKKyNpbmNsdWRlICJ2b0FNUldCLmgiCisKKyNpbmNsdWRlICJBbXJ3YkVuY1Rlc3RFbnZpcm9ubWVudC5oIgorCisjZGVmaW5lIE9VVFBVVF9GSUxFICIvZGF0YS9sb2NhbC90bXAvYW1yd2JFbmNvZGUub3V0IgorI2RlZmluZSBWT0FNUldCX1JGQzMyNjdfSEVBREVSX0lORk8gIiMhQU1SLVdCXG4iCisKK2NvbnN0ZXhwciBpbnQzMl90IGtJbnB1dEJ1ZmZlclNpemUgPSA2NDA7Citjb25zdGV4cHIgaW50MzJfdCBrT3V0cHV0QnVmZmVyU2l6ZSA9IDEwMjQ7CisKK3N0YXRpYyBBbXJ3YkVuY1Rlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK2NsYXNzIEFtcndiRW5jb2RlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPHN0cmluZywgaW50MzJfdCwgVk9BTVJXQkZSQU1FVFlQRT4+IHsKKyAgcHVibGljOgorICAgIEFtcndiRW5jb2RlclRlc3QoKSA6IG1FbmNvZGVySGFuZGxlKG51bGxwdHIpIHsKKyAgICAgICAgdHVwbGU8c3RyaW5nLCBpbnQzMl90LCBWT0FNUldCRlJBTUVUWVBFPiBwYXJhbXMgPSBHZXRQYXJhbSgpOworICAgICAgICBtSW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MD4ocGFyYW1zKTsKKyAgICAgICAgbU1vZGUgPSBnZXQ8MT4ocGFyYW1zKTsKKyAgICAgICAgbUZyYW1lVHlwZSA9IGdldDwyPihwYXJhbXMpOworICAgICAgICBtTWVtT3BlcmF0b3IuQWxsb2MgPSBjbW5NZW1BbGxvYzsKKyAgICAgICAgbU1lbU9wZXJhdG9yLkNvcHkgPSBjbW5NZW1Db3B5OworICAgICAgICBtTWVtT3BlcmF0b3IuRnJlZSA9IGNtbk1lbUZyZWU7CisgICAgICAgIG1NZW1PcGVyYXRvci5TZXQgPSBjbW5NZW1TZXQ7CisgICAgICAgIG1NZW1PcGVyYXRvci5DaGVjayA9IGNtbk1lbUNoZWNrOworCisgICAgICAgIG1Vc2VyRGF0YS5tZW1mbGFnID0gVk9fSU1GX1VTRVJNRU1PUEVSQVRPUjsKKyAgICAgICAgbVVzZXJEYXRhLm1lbURhdGEgPSAoVk9fUFRSKSgmbU1lbU9wZXJhdG9yKTsKKyAgICB9CisKKyAgICB+QW1yd2JFbmNvZGVyVGVzdCgpIHsKKyAgICAgICAgaWYgKG1FbmNvZGVySGFuZGxlKSB7CisgICAgICAgICAgICBtRW5jb2RlckhhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBzdHJpbmcgbUlucHV0RmlsZTsKKyAgICB1bnNpZ25lZCBjaGFyIG1PdXRwdXRCdWZba091dHB1dEJ1ZmZlclNpemVdOworICAgIHVuc2lnbmVkIGNoYXIgbUlucHV0QnVmW2tJbnB1dEJ1ZmZlclNpemVdOworICAgIFZPQU1SV0JGUkFNRVRZUEUgbUZyYW1lVHlwZTsKKyAgICBWT19BVURJT19DT0RFQ0FQSSBtQXBpSGFuZGxlOworICAgIFZPX01FTV9PUEVSQVRPUiBtTWVtT3BlcmF0b3I7CisgICAgVk9fQ09ERUNfSU5JVF9VU0VSREFUQSBtVXNlckRhdGE7CisgICAgVk9fSEFORExFIG1FbmNvZGVySGFuZGxlOworICAgIGludDMyX3QgbU1vZGU7Cit9OworCitURVNUX1AoQW1yd2JFbmNvZGVyVGVzdCwgQ3JlYXRlQW1yd2JFbmNvZGVyVGVzdCkgeworICAgIGludDMyX3Qgc3RhdHVzID0gdm9HZXRBTVJXQkVuY0FQSSgmbUFwaUhhbmRsZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgVk9fRVJSX05PTkUpIDw8ICJGYWlsZWQgdG8gZ2V0IGFwaSBoYW5kbGUiOworCisgICAgc3RhdHVzID0gbUFwaUhhbmRsZS5Jbml0KCZtRW5jb2RlckhhbmRsZSwgVk9fQVVESU9fQ29kaW5nQU1SV0IsICZtVXNlckRhdGEpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIFZPX0VSUl9OT05FKSA8PCAiRmFpbGVkIHRvIGluaXQgQU1SV0IgZW5jb2RlciI7CisKKyAgICBzdGF0dXMgPSBtQXBpSGFuZGxlLlNldFBhcmFtKG1FbmNvZGVySGFuZGxlLCBWT19QSURfQU1SV0JfRlJBTUVUWVBFLCAmbUZyYW1lVHlwZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgVk9fRVJSX05PTkUpIDw8ICJGYWlsZWQgdG8gc2V0IEFNUldCIGVuY29kZXIgZnJhbWUgdHlwZSB0byAiIDw8IG1GcmFtZVR5cGU7CisKKyAgICBzdGF0dXMgPSBtQXBpSGFuZGxlLlNldFBhcmFtKG1FbmNvZGVySGFuZGxlLCBWT19QSURfQU1SV0JfTU9ERSwgJm1Nb2RlKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBWT19FUlJfTk9ORSkgPDwgIkZhaWxlZCB0byBzZXQgQU1SV0IgZW5jb2RlciBtb2RlIHRvICVkIiA8PCBtTW9kZTsKKyAgICBBTE9HVigiQU1SLVdCIGVuY29kZXIgY3JlYXRlZCBzdWNjZXNzZnVsbHkiKTsKKworICAgIHN0YXR1cyA9IG1BcGlIYW5kbGUuVW5pbml0KG1FbmNvZGVySGFuZGxlKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBWT19FUlJfTk9ORSkgPDwgIkZhaWxlZCB0byBkZWxldGUgQU1SV0IgZW5jb2RlciI7CisgICAgQUxPR1YoIkFNUi1XQiBlbmNvZGVyIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5Iik7Cit9CisKK1RFU1RfUChBbXJ3YkVuY29kZXJUZXN0LCBBbXJ3YkVuY29kZVRlc3QpIHsKKyAgICBWT19DT0RFQ0JVRkZFUiBpbkRhdGE7CisgICAgVk9fQ09ERUNCVUZGRVIgb3V0RGF0YTsKKyAgICBWT19BVURJT19PVVRQVVRJTkZPIG91dEZvcm1hdDsKKworICAgIEZJTEUgKmZwSW5wdXQgPSBmb3BlbihtSW5wdXRGaWxlLmNfc3RyKCksICJyYiIpOworICAgIEFTU0VSVF9ORShmcElucHV0LCBudWxscHRyKSA8PCAiRXJyb3Igb3BlbmluZyBpbnB1dCBmaWxlICIgPDwgbUlucHV0RmlsZTsKKworICAgIEZJTEUgKmZwT3V0cHV0ID0gZm9wZW4oT1VUUFVUX0ZJTEUsICJ3YiIpOworICAgIEFTU0VSVF9ORShmcE91dHB1dCwgbnVsbHB0cikgPDwgIkVycm9yIG9wZW5pbmcgb3V0cHV0IGZpbGUgIiA8PCBPVVRQVVRfRklMRTsKKworICAgIHVpbnQzMl90IHN0YXR1cyA9IHZvR2V0QU1SV0JFbmNBUEkoJm1BcGlIYW5kbGUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIFZPX0VSUl9OT05FKSA8PCAiRmFpbGVkIHRvIGdldCBhcGkgaGFuZGxlIjsKKworICAgIHN0YXR1cyA9IG1BcGlIYW5kbGUuSW5pdCgmbUVuY29kZXJIYW5kbGUsIFZPX0FVRElPX0NvZGluZ0FNUldCLCAmbVVzZXJEYXRhKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBWT19FUlJfTk9ORSkgPDwgIkZhaWxlZCB0byBpbml0IEFNUldCIGVuY29kZXIiOworCisgICAgc3RhdHVzID0gbUFwaUhhbmRsZS5TZXRQYXJhbShtRW5jb2RlckhhbmRsZSwgVk9fUElEX0FNUldCX0ZSQU1FVFlQRSwgJm1GcmFtZVR5cGUpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIFZPX0VSUl9OT05FKSA8PCAiRmFpbGVkIHRvIHNldCBBTVJXQiBlbmNvZGVyIGZyYW1lIHR5cGUgdG8gIiA8PCBtRnJhbWVUeXBlOworCisgICAgc3RhdHVzID0gbUFwaUhhbmRsZS5TZXRQYXJhbShtRW5jb2RlckhhbmRsZSwgVk9fUElEX0FNUldCX01PREUsICZtTW9kZSk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgVk9fRVJSX05PTkUpIDw8ICJGYWlsZWQgdG8gc2V0IEFNUldCIGVuY29kZXIgbW9kZSB0byAiIDw8IG1Nb2RlOworCisgICAgaWYgKG1GcmFtZVR5cGUgPT0gVk9BTVJXQl9SRkMzMjY3KSB7CisgICAgICAgIC8qIHdyaXRlIFJGQzMyNjcgSGVhZGVyIGluZm8gdG8gaW5kaWNhdGUgc2luZ2xlIGNoYW5uZWwgQU1SIGZpbGUgc3RvcmFnZSBmb3JtYXQgKi8KKyAgICAgICAgaW50MzJfdCBzaXplID0gc3RybGVuKFZPQU1SV0JfUkZDMzI2N19IRUFERVJfSU5GTyk7CisgICAgICAgIG1lbWNweShtT3V0cHV0QnVmLCBWT0FNUldCX1JGQzMyNjdfSEVBREVSX0lORk8sIHNpemUpOworICAgICAgICBmd3JpdGUobU91dHB1dEJ1ZiwgMSwgc2l6ZSwgZnBPdXRwdXQpOworICAgIH0KKworICAgIGludDMyX3QgZnJhbWVOdW0gPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGludDMyX3QgYnVmZkxlbmd0aCA9CisgICAgICAgICAgICAgICAgKGludDMyX3QpZnJlYWQobUlucHV0QnVmLCBzaXplb2Yoc2lnbmVkIGNoYXIpLCBrSW5wdXRCdWZmZXJTaXplLCBmcElucHV0KTsKKworICAgICAgICBpZiAoYnVmZkxlbmd0aCA9PSAwIHx8IGZlb2YoZnBJbnB1dCkpIGJyZWFrOworICAgICAgICBBU1NFUlRfRVEoYnVmZkxlbmd0aCwga0lucHV0QnVmZmVyU2l6ZSkgPDwgIkVycm9yIGluIHJlYWRpbmcgaW5wdXQgZmlsZSI7CisKKyAgICAgICAgaW5EYXRhLkJ1ZmZlciA9ICh1bnNpZ25lZCBjaGFyICopbUlucHV0QnVmOworICAgICAgICBpbkRhdGEuTGVuZ3RoID0gYnVmZkxlbmd0aDsKKyAgICAgICAgb3V0RGF0YS5CdWZmZXIgPSBtT3V0cHV0QnVmOworICAgICAgICBzdGF0dXMgPSBtQXBpSGFuZGxlLlNldElucHV0RGF0YShtRW5jb2RlckhhbmRsZSwgJmluRGF0YSk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIFZPX0VSUl9OT05FKSA8PCAiRmFpbGVkIHRvIHNldHVwIElucHV0IGRhdGEiOworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1BcGlIYW5kbGUuR2V0T3V0cHV0RGF0YShtRW5jb2RlckhhbmRsZSwgJm91dERhdGEsICZvdXRGb3JtYXQpOworICAgICAgICAgICAgQVNTRVJUX05FKHN0YXR1cywgVk9fRVJSX0xJQ0VOU0VfRVJST1IpIDw8ICJGYWlsZWQgdG8gZW5jb2RlIHRoZSBmaWxlIjsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICAgICAgICAgIGZyYW1lTnVtKys7CisgICAgICAgICAgICAgICAgZndyaXRlKG91dERhdGEuQnVmZmVyLCAxLCBvdXREYXRhLkxlbmd0aCwgZnBPdXRwdXQpOworICAgICAgICAgICAgICAgIGZmbHVzaChmcE91dHB1dCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHN0YXR1cyAhPSBWT19FUlJfSU5QVVRfQlVGRkVSX1NNQUxMKTsKKyAgICB9CisKKyAgICBBTE9HVigiTnVtYmVyIG9mIGZyYW1lcyBwcm9jZXNzZWQ6ICVkIiwgZnJhbWVOdW0pOworICAgIHN0YXR1cyA9IG1BcGlIYW5kbGUuVW5pbml0KG1FbmNvZGVySGFuZGxlKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBWT19FUlJfTk9ORSkgPDwgIkZhaWxlZCB0byBkZWxldGUgQU1SV0IgZW5jb2RlciI7CisKKyAgICBpZiAoZnBJbnB1dCkgeworICAgICAgICBmY2xvc2UoZnBJbnB1dCk7CisgICAgfQorICAgIGlmIChmcE91dHB1dCkgeworICAgICAgICBmY2xvc2UoZnBPdXRwdXQpOworICAgIH0KK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBBbXJ3YkVuY29kZXJUZXN0QWxsLCBBbXJ3YkVuY29kZXJUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXciLCBWT0FNUldCX01ENjYsIFZPQU1SV0JfREVGQVVMVCksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYmJiX3Jhd18xY2hfMTZraHpfczE2bGUucmF3IiwgVk9BTVJXQl9NRDg4NSwgVk9BTVJXQl9ERUZBVUxUKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXciLCBWT0FNUldCX01EMTI2NSwgVk9BTVJXQl9ERUZBVUxUKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXciLCBWT0FNUldCX01EMTQyNSwgVk9BTVJXQl9ERUZBVUxUKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXciLCBWT0FNUldCX01EMTU4NSwgVk9BTVJXQl9ERUZBVUxUKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXciLCBWT0FNUldCX01EMTgyNSwgVk9BTVJXQl9ERUZBVUxUKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXciLCBWT0FNUldCX01EMTk4NSwgVk9BTVJXQl9ERUZBVUxUKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXciLCBWT0FNUldCX01EMjMwNSwgVk9BTVJXQl9ERUZBVUxUKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXciLCBWT0FNUldCX01EMjM4NSwgVk9BTVJXQl9ERUZBVUxUKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXciLCBWT0FNUldCX01ENjYsIFZPQU1SV0JfSVRVKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXciLCBWT0FNUldCX01EODg1LCBWT0FNUldCX0lUVSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYmJiX3Jhd18xY2hfMTZraHpfczE2bGUucmF3IiwgVk9BTVJXQl9NRDEyNjUsIFZPQU1SV0JfSVRVKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXciLCBWT0FNUldCX01EMTQyNSwgVk9BTVJXQl9JVFUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImJiYl9yYXdfMWNoXzE2a2h6X3MxNmxlLnJhdyIsIFZPQU1SV0JfTUQxNTg1LCBWT0FNUldCX0lUVSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYmJiX3Jhd18xY2hfMTZraHpfczE2bGUucmF3IiwgVk9BTVJXQl9NRDE4MjUsIFZPQU1SV0JfSVRVKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXciLCBWT0FNUldCX01EMTk4NSwgVk9BTVJXQl9JVFUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImJiYl9yYXdfMWNoXzE2a2h6X3MxNmxlLnJhdyIsIFZPQU1SV0JfTUQyMzA1LCBWT0FNUldCX0lUVSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYmJiX3Jhd18xY2hfMTZraHpfczE2bGUucmF3IiwgVk9BTVJXQl9NRDIzODUsIFZPQU1SV0JfSVRVKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXciLCBWT0FNUldCX01ENjYsIFZPQU1SV0JfUkZDMzI2NyksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYmJiX3Jhd18xY2hfMTZraHpfczE2bGUucmF3IiwgVk9BTVJXQl9NRDg4NSwgVk9BTVJXQl9SRkMzMjY3KSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXciLCBWT0FNUldCX01EMTI2NSwgVk9BTVJXQl9SRkMzMjY3KSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXciLCBWT0FNUldCX01EMTQyNSwgVk9BTVJXQl9SRkMzMjY3KSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXciLCBWT0FNUldCX01EMTU4NSwgVk9BTVJXQl9SRkMzMjY3KSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXciLCBWT0FNUldCX01EMTgyNSwgVk9BTVJXQl9SRkMzMjY3KSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXciLCBWT0FNUldCX01EMTk4NSwgVk9BTVJXQl9SRkMzMjY3KSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXciLCBWT0FNUldCX01EMjMwNSwgVk9BTVJXQl9SRkMzMjY3KSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfcmF3XzFjaF8xNmtoel9zMTZsZS5yYXciLCBWT0FNUldCX01EMjM4NSwgVk9BTVJXQl9SRkMzMjY3KSkpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IEFtcndiRW5jVGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HVigiVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvdGVzdC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwNDJiYzUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvdGVzdC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiQW1yd2JFbmNvZGVyVGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJBbXJ3YkVuY29kZXJUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9lbmNfY29tbW9uIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2FtcndiZW5jIiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlic25kZmlsZSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvdGVzdC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZmMTQ3YwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgQW1yLXdiIEVuY29kZXIgdW5pdCB0ZXN0Ij4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iQW1yd2JFbmNvZGVyVGVzdCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJBbXJ3YkVuY29kZXJUZXN0LT4vZGF0YS9sb2NhbC90bXAvQW1yd2JFbmNvZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2FtcndiZW5jL3Rlc3QvQW1yd2JFbmNvZGVyVGVzdC56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvQW1yd2JFbmNvZGVyVGVzdFJlcy8iIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IkFtcndiRW5jb2RlclRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9BbXJ3YkVuY29kZXJUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvdGVzdC9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvdGVzdC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg3NjJjYgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hbXJ3YmVuYy90ZXN0L1JFQURNRS5tZApAQCAtMCwwICsxLDM5IEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgQU1SLVdCIEVuY29kZXIgOgorVGhlIEFtci1XYiBFbmNvZGVyIFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBhbXJ3YiBlbmNvZGVyIGF2YWlsYWJsZSBpbiBsaWJzdGFnZWZyaWdodC4KKworUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6CitgYGAKK20gQW1yd2JFbmNvZGVyVGVzdAorYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9BbXJ3YkVuY29kZXJUZXN0L0FtcndiRW5jb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9BbXJ3YkVuY29kZXJUZXN0L0FtcndiRW5jb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYW1yd2JlbmMvdGVzdC9BbXJ3YkVuY29kZXJUZXN0LnppcCkuIERvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KKworYGBgCithZGIgcHVzaCBBbXJ3YkVuY29kZXJUZXN0UmVzLy4gL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK3VzYWdlOiBBbXJ3YkVuY29kZXJUZXN0IC1QIFw8cGF0aF90b19mb2xkZXJcPgorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL0FtcndiRW5jb2RlclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL0FtcndiRW5jb2RlclRlc3RSZXMvCitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IEFtcndiRW5jb2RlclRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL0FuZHJvaWQuYnAKaW5kZXggOGEzNDg0NS4uMGJiNmJiMCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvQW5kcm9pZC5icApAQCAtMSwzNCArMSwxNiBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2F2Y2RlYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzdGF0aWNfbGliczogWyJsaWJhdmNkZWMiXSwKICAgICBzcmNzOiBbIlNvZnRBVkNEZWMuY3BwIl0sCiAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKLSAgICAgICAgIi1XZXJyb3IiLAogICAgIF0sCiAKICAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2RlY29kZXIiLAotICAgICAgICAiZXh0ZXJuYWwvbGliYXZjL2NvbW1vbiIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLApAQCAtMzcsNSArMTksNCBAQAogICAgIH0sCiAKICAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZGVjL1NvZnRBVkNEZWMuY3BwCmluZGV4IGJmNWUyNDMuLjVhNGIyZjggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNkZWMvU29mdEFWQ0RlYy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2RlYy9Tb2Z0QVZDRGVjLmNwcApAQCAtNTgwLDcgKzU4MCw3IEBACiAgICAgICAgICAgICBzdGF0dXMgPSBpdmRlY19hcGlfZnVuY3Rpb24obUNvZGVjQ3R4LCAodm9pZCAqKSZzX2RlY19pcCwgKHZvaWQgKikmc19kZWNfb3ApOwogCiAgICAgICAgICAgICBib29sIHVuc3VwcG9ydGVkUmVzb2x1dGlvbiA9Ci0gICAgICAgICAgICAgICAgKElWRF9TVFJFQU1fV0lEVEhfSEVJR0hUX05PVF9TVVBQT1JURUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSk7CisgICAgICAgICAgICAgICAgKElWRF9TVFJFQU1fV0lEVEhfSEVJR0hUX05PVF9TVVBQT1JURUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpOwogCiAgICAgICAgICAgICAvKiBDaGVjayBmb3IgdW5zdXBwb3J0ZWQgZGltZW5zaW9ucyAqLwogICAgICAgICAgICAgaWYgKHVuc3VwcG9ydGVkUmVzb2x1dGlvbikgewpAQCAtNTkwLDcgKzU5MCw3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBib29sIGFsbG9jYXRpb25GYWlsZWQgPSAoSVZEX01FTV9BTExPQ19GQUlMRUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSk7CisgICAgICAgICAgICBib29sIGFsbG9jYXRpb25GYWlsZWQgPSAoSVZEX01FTV9BTExPQ19GQUlMRUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpOwogICAgICAgICAgICAgaWYgKGFsbG9jYXRpb25GYWlsZWQpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBmYWlsdXJlIGluIGRlY29kZXIiKTsKICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZywgMCwgTlVMTCk7CkBAIC01OTgsNyArNTk4LDE0IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBib29sIHJlc0NoYW5nZWQgPSAoSVZEX1JFU19DSEFOR0VEID09IChzX2RlY19vcC51NF9lcnJvcl9jb2RlICYgMHhGRikpOworICAgICAgICAgICAgaWYgKElTX0lWRF9GQVRBTF9FUlJPUihzX2RlY19vcC51NF9lcnJvcl9jb2RlKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGYXRhbCBFcnJvciA6IDB4JXgiLCBzX2RlY19vcC51NF9lcnJvcl9jb2RlKTsKKyAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuc3VwcG9ydGVkU2V0dGluZywgMCwgTlVMTCk7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgcmVzQ2hhbmdlZCA9IChJVkRfUkVTX0NIQU5HRUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiBJVkRfRVJST1JfTUFTSykpOwogCiAgICAgICAgICAgICBnZXRWVUlQYXJhbXMoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9BbmRyb2lkLmJwCmluZGV4IDYzNzE4MjguLjk4MDI2MWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL0FuZHJvaWQuYnAKQEAgLTEsMjggKzEsMTAgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9hdmNlbmMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3RhdGljX2xpYnM6IFsibGliYXZjZW5jIl0sCiAgICAgc3JjczogWyJTb2Z0QVZDRW5jLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJleHRlcm5hbC9saWJhdmMvZW5jb2RlciIsCi0gICAgICAgICJleHRlcm5hbC9saWJhdmMvY29tbW9uIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL2hhcmR3YXJlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KICAgICBzYW5pdGl6ZTogewogICAgICAgICBtaXNjX3VuZGVmaW5lZDogWwogICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKQEAgLTMyLDEyICsxNCw5IEBACiAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKLSAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVduby11bnVzZWQtdmFyaWFibGUiLAogICAgIF0sCiAgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAogCiAgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCi0KLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5jcHAKaW5kZXggMzc5ZDQxZS4uOWRiNjQ2NSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2F2Y2VuYy9Tb2Z0QVZDRW5jLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuY3BwCkBAIC0yMSw4ICsyMSw4IEBACiAKICNpbmNsdWRlICJPTVhfVmlkZW8uaCIKIAotI2luY2x1ZGUgPEhhcmR3YXJlQVBJLmg+Ci0jaW5jbHVkZSA8TWV0YWRhdGFCdWZmZXJUeXBlLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CkBAIC0xMDU4LDggKzEwNTgsOCBAQAogICAgIH0KIH0KIAotT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjpzZXRDb25maWcoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcykgeworT01YX0VSUk9SVFlQRSBTb2Z0QVZDOjppbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBfcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZykgewogICAgIHN3aXRjaCAoKGludClpbmRleCkgewogICAgICAgICBjYXNlIE9NWF9JbmRleENvbmZpZ1ZpZGVvSW50cmFWT1BSZWZyZXNoOgogICAgICAgICB7CkBAIC0xMTI1LDcgKzExMjUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpzZXRDb25maWcoaW5kZXgsIF9wYXJhbXMpOworICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0Q29uZmlnKGluZGV4LCBfcGFyYW1zLCBmcmFtZUNvbmZpZyk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvYXZjZW5jL1NvZnRBVkNFbmMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oCmluZGV4IGE0M2NkZjEuLjZkMmUwODQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9hdmNlbmMvU29mdEFWQ0VuYy5oCkBAIC0zNiw3ICszNiw3IEBACiAjZGVmaW5lIERFRkFVTFRfTUFYX1JFT1JERVJfRlJNICAgICAwCiAjZGVmaW5lIERFRkFVTFRfUVBfTUlOICAgICAgICAgICAgICAxMAogI2RlZmluZSBERUZBVUxUX1FQX01BWCAgICAgICAgICAgICAgNDAKLSNkZWZpbmUgREVGQVVMVF9NQVhfQklUUkFURSAgICAgICAgIDIwMDAwMDAwCisjZGVmaW5lIERFRkFVTFRfTUFYX0JJVFJBVEUgICAgICAgICAyNDAwMDAwMDAKICNkZWZpbmUgREVGQVVMVF9NQVhfU1JDSF9SQU5HRV9YICAgIDI1NgogI2RlZmluZSBERUZBVUxUX01BWF9TUkNIX1JBTkdFX1kgICAgMjU2CiAjZGVmaW5lIERFRkFVTFRfTUFYX0ZSQU1FUkFURSAgICAgICAxMjAwMDAKQEAgLTIxOSw4ICsyMTksOCBAQAogICAgIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRCaXRyYXRlUGFyYW1zKAogICAgICAgICBjb25zdCBPTVhfVklERU9fUEFSQU1fQklUUkFURVRZUEUgKmJpdHJhdGUpOwogCi0gICAgT01YX0VSUk9SVFlQRSBzZXRDb25maWcoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcyk7CisgICAgT01YX0VSUk9SVFlQRSBpbnRlcm5hbFNldENvbmZpZygKKyAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBfcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZyk7CiAKICAgICBPTVhfRVJST1JUWVBFIGdldENvbmZpZygKICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBfcGFyYW1zKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9jb21tb24vQW5kcm9pZC5icAppbmRleCAzNzI2OTIyLi5jNWEwNzZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvY29tbW9uL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0xLDkgKzEsNiBAQAogY2NfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2VuY19jb21tb24iLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCiAKICAgICBzcmNzOiBbImNtbk1lbW9yeS5jIl0sCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDRjMjk2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zdWJkaXJzID0gWyIqIl0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKaW5kZXggMTY3NGNiMi4uNDA2NDc1MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsMjMgKzEsMTEgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9mbGFjZGVjIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIlNvZnRGbGFjRGVjb2Rlci5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImV4dGVybmFsL2ZsYWMvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjIiwKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAotCiAgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCiAKICAgICBzYW5pdGl6ZTogewpAQCAtMjksMTIgKzE3LDYgQEAKICAgICB9LAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfZmxhY2RlYyIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCiAgICAgXSwKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcAppbmRleCA0ZGIwMDYwLi44NDJhN2NlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmNwcApAQCAtODksMTIgKzg5LDEyIEBACiAgICAgZGVmLmVEaXIgPSBPTVhfRGlyT3V0cHV0OwogICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtT3V0cHV0QnVmZmVyczsKICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKLSAgICBkZWYubkJ1ZmZlclNpemUgPSA0MDk2ICogRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsczsKKyAgICBkZWYubkJ1ZmZlclNpemUgPSBrTnVtU2FtcGxlc1BlckZyYW1lICogRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVscyAqIHNpemVvZihmbG9hdCk7CiAgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CiAgICAgZGVmLmJQb3B1bGF0ZWQgPSBPTVhfRkFMU0U7CiAgICAgZGVmLmVEb21haW4gPSBPTVhfUG9ydERvbWFpbkF1ZGlvOwogICAgIGRlZi5iQnVmZmVyc0NvbnRpZ3VvdXMgPSBPTVhfRkFMU0U7Ci0gICAgZGVmLm5CdWZmZXJBbGlnbm1lbnQgPSAyOworICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gc2l6ZW9mKGZsb2F0KTsKIAogICAgIGRlZi5mb3JtYXQuYXVkaW8uY01JTUVUeXBlID0gY29uc3RfY2FzdDxjaGFyICo+KCJhdWRpby9yYXciKTsKICAgICBkZWYuZm9ybWF0LmF1ZGlvLnBOYXRpdmVSZW5kZXIgPSBOVUxMOwpAQCAtMTczLDcgKzE3Myw3IEBACiAgICAgICAgICAgICAgICAgZmxhY1BhcmFtcy0+bkNoYW5uZWxzID0gbVN0cmVhbUluZm8uY2hhbm5lbHM7CiAgICAgICAgICAgICAgICAgZmxhY1BhcmFtcy0+blNhbXBsZVJhdGUgPSBtU3RyZWFtSW5mby5zYW1wbGVfcmF0ZTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmxhY1BhcmFtcy0+bkNoYW5uZWxzID0gMTsKKyAgICAgICAgICAgICAgICBmbGFjUGFyYW1zLT5uQ2hhbm5lbHMgPSAyOwogICAgICAgICAgICAgICAgIGZsYWNQYXJhbXMtPm5TYW1wbGVSYXRlID0gNDQxMDA7CiAgICAgICAgICAgICB9CiAKQEAgLTE5NSwxMCArMTk1LDEwIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvckJhZFBvcnRJbmRleDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgICAgICAgICAgcGNtUGFyYW1zLT5lTnVtRGF0YSA9IG1OdW1lcmljYWxEYXRhOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5lRW5kaWFuID0gT01YX0VuZGlhbkJpZzsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+YkludGVybGVhdmVkID0gT01YX1RSVUU7Ci0gICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9IG1CaXRzUGVyU2FtcGxlOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5lUENNTW9kZSA9IE9NWF9BVURJT19QQ01Nb2RlTGluZWFyOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMF0gPSBPTVhfQVVESU9fQ2hhbm5lbExGOwogICAgICAgICAgICAgcGNtUGFyYW1zLT5lQ2hhbm5lbE1hcHBpbmdbMV0gPSBPTVhfQVVESU9fQ2hhbm5lbFJGOwpAQCAtMjExLDcgKzIxMSw3IEBACiAgICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPSBtU3RyZWFtSW5mby5jaGFubmVsczsKICAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5TYW1wbGluZ1JhdGUgPSBtU3RyZWFtSW5mby5zYW1wbGVfcmF0ZTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPSAxOworICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+bkNoYW5uZWxzID0gMjsKICAgICAgICAgICAgICAgICBwY21QYXJhbXMtPm5TYW1wbGluZ1JhdGUgPSA0NDEwMDsKICAgICAgICAgICAgIH0KIApAQCAtMjgxLDYgKzI4MSwxOSBAQAogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQb3J0SW5kZXg7CiAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPmVOdW1EYXRhID09IE9NWF9OdW1lcmljYWxEYXRhRmxvYXQgJiYgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID09IDMyKSB7CisgICAgICAgICAgICAgICAgbU51bWVyaWNhbERhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YUZsb2F0OworICAgICAgICAgICAgICAgIG1CaXRzUGVyU2FtcGxlID0gMzI7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHBjbVBhcmFtcy0+ZU51bURhdGEgPT0gT01YX051bWVyaWNhbERhdGFTaWduZWQKKyAgICAgICAgICAgICAgICAgICAgICYmIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9PSAxNikgeworICAgICAgICAgICAgICAgIG1OdW1lcmljYWxEYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgICAgICAgICAgICAgbUJpdHNQZXJTYW1wbGUgPSAxNjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgZU51bURhdGEgJWQsIG5CaXRzUGVyU2FtcGxlICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZU51bURhdGEsIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIApAQCAtMzAxLDExICszMTQsMTMgQEAKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKIAorICAgIGNvbnN0IGJvb2wgb3V0cHV0RmxvYXQgPSBtTnVtZXJpY2FsRGF0YSA9PSBPTVhfTnVtZXJpY2FsRGF0YUZsb2F0OworCiAgICAgQUxPR1YoIm9uUXVldWVGaWxsZWQgJWQvJWQ6IiwgaW5RdWV1ZS5lbXB0eSgpLCBvdXRRdWV1ZS5lbXB0eSgpKTsKICAgICB3aGlsZSAoKCFpblF1ZXVlLmVtcHR5KCkgfHwgbVNhd0lucHV0RU9TKSAmJiAhb3V0UXVldWUuZW1wdHkoKSAmJiAhbUZpbmlzaGVkRGVjb2RlcikgewogICAgICAgICBCdWZmZXJJbmZvICpvdXRJbmZvID0gKm91dFF1ZXVlLmJlZ2luKCk7CiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICpvdXRIZWFkZXIgPSBvdXRJbmZvLT5tSGVhZGVyOwotICAgICAgICBpbnQxNl90ICpvdXRCdWZmZXIgPSByZWludGVycHJldF9jYXN0PGludDE2X3QgKj4ob3V0SGVhZGVyLT5wQnVmZmVyICsgb3V0SGVhZGVyLT5uT2Zmc2V0KTsKKyAgICAgICAgdm9pZCAqb3V0QnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KG91dEhlYWRlci0+cEJ1ZmZlciArIG91dEhlYWRlci0+bk9mZnNldCk7CiAgICAgICAgIHNpemVfdCBvdXRCdWZmZXJTaXplID0gb3V0SGVhZGVyLT5uQWxsb2NMZW4gLSBvdXRIZWFkZXItPm5PZmZzZXQ7CiAgICAgICAgIGludDY0X3QgdGltZVN0YW1wID0gMDsKIApAQCAtMzc0LDcgKzM4OSw3IEBACiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHN0YXR1c190IGRlY29kZXJFcnIgPSBtRkxBQ0RlY29kZXItPmRlY29kZU9uZUZyYW1lKAotICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgsIG91dEJ1ZmZlciwgJm91dEJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgICAgICBpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgsIG91dEJ1ZmZlciwgJm91dEJ1ZmZlclNpemUsIG91dHB1dEZsb2F0KTsKICAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIm9uUXVldWVGaWxsZWQ6IEZMQUNEZWNvZGVyIGRlY29kZU9uZUZyYW1lIHJldHVybnMgZXJyb3IgJWQiLCBkZWNvZGVyRXJyKTsKICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwpAQCAtMzkzLDcgKzQwOCw5IEBACiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSBpZiAobVNhd0lucHV0RU9TKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBkZWNvZGVyRXJyID0gbUZMQUNEZWNvZGVyLT5kZWNvZGVPbmVGcmFtZShOVUxMLCAwLCBvdXRCdWZmZXIsICZvdXRCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIHN0YXR1c190IGRlY29kZXJFcnIgPSBtRkxBQ0RlY29kZXItPmRlY29kZU9uZUZyYW1lKAorICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGluQnVmZmVyICovLCAwIC8qIGluQnVmZmVyTGVuICovLAorICAgICAgICAgICAgICAgICAgICBvdXRCdWZmZXIsICZvdXRCdWZmZXJTaXplLCBvdXRwdXRGbG9hdCk7CiAgICAgICAgICAgICBtRmluaXNoZWREZWNvZGVyID0gdHJ1ZTsKICAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIm9uUXVldWVGaWxsZWQ6IEZMQUNEZWNvZGVyIGZpbmlzaCByZXR1cm5zIGVycm9yICVkIiwgZGVjb2RlckVycik7CkBAIC00NTYsNyArNDczLDggQEAKICAgICAgICAgICAgIG1PdXRwdXRQb3J0U2V0dGluZ3NDaGFuZ2UgPSBBV0FJVElOR19FTkFCTEVEOwogICAgICAgICAgICAgUG9ydEluZm8gKmluZm8gPSBlZGl0UG9ydEluZm8oMSAvKiBwb3J0SW5kZXggKi8pOwogICAgICAgICAgICAgaWYgKCFpbmZvLT5tRGVmLmJFbmFibGVkKSB7Ci0gICAgICAgICAgICAgICAgaW5mby0+bURlZi5uQnVmZmVyU2l6ZSA9IG1TdHJlYW1JbmZvLm1heF9ibG9ja3NpemUgKiBtU3RyZWFtSW5mby5jaGFubmVscyAqIDI7CisgICAgICAgICAgICAgICAgaW5mby0+bURlZi5uQnVmZmVyU2l6ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby5tYXhfYmxvY2tzaXplICogbVN0cmVhbUluZm8uY2hhbm5lbHMgKiBzaXplb2YoZmxvYXQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2RlYy9Tb2Z0RmxhY0RlY29kZXIuaAppbmRleCBiNjNmN2FkLi5iYTAyMDc0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9kZWMvU29mdEZsYWNEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZGVjL1NvZnRGbGFjRGVjb2Rlci5oCkBAIC00NSwxMCArNDUsMTQgQEAKICAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpIG92ZXJyaWRlOwogCiBwcml2YXRlOgorICAgIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgaW50IGtOdW1TYW1wbGVzUGVyRnJhbWUgPSAyMDQ4OyAvLyBhZGp1c3RlZCBiYXNlZCBvbiBzdHJlYW0uCisKICAgICBlbnVtIHsKICAgICAgICAga051bUlucHV0QnVmZmVycyAgID0gNCwKICAgICAgICAga051bU91dHB1dEJ1ZmZlcnMgID0gNCwKICAgICB9OworICAgIE9NWF9OVU1FUklDQUxEQVRBVFlQRSBtTnVtZXJpY2FsRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgIE9NWF9VMzIgbUJpdHNQZXJTYW1wbGUgPSAxNjsKIAogICAgIEZMQUNEZWNvZGVyICptRkxBQ0RlY29kZXI7CiAgICAgRkxBQ19fU3RyZWFtTWV0YWRhdGFfU3RyZWFtSW5mbyBtU3RyZWFtSW5mbzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAKaW5kZXggOWI2OTZkYS4uZDdkODcxYSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL0FuZHJvaWQuYnAKQEAgLTEsMTUgKzEsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X2ZsYWNlbmMiLAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiU29mdEZsYWNFbmNvZGVyLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICAgICAgImV4dGVybmFsL2ZsYWMvaW5jbHVkZSIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWyItV2Vycm9yIl0sCi0KICAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAogICAgIHNhbml0aXplOiB7CkBAIC0yMCwyMSArMTQsOSBAQAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKIAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KICAgICBoZWFkZXJfbGliczogWyJsaWJiYXNlX2hlYWRlcnMiXSwKLSAgICBzdGF0aWNfbGliczogWyJsaWJGTEFDIl0sCi0KLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9mbGFjZW5jIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAotCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgICAgICJsaWJGTEFDIiwKKyAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcAppbmRleCA5NTVmMjExLi4zYWRkMDA2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmNwcApAQCAtMjAsNyArMjAsNyBAQAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogCiAjaW5jbHVkZSAiU29mdEZsYWNFbmNvZGVyLmgiCi0KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KIApAQCAtNzUsNyArNzUsOSBAQAogICAgIH0KIAogICAgIGlmICghbVNpZ25hbGxlZEVycm9yKSB7IC8vIG5vIHVzZSBhbGxvY2F0aW5nIGlucHV0IGJ1ZmZlciBpZiB3ZSBoYWQgYW4gZXJyb3IgYWJvdmUKLSAgICAgICAgbUlucHV0QnVmZmVyUGNtMzIgPSAoRkxBQ19faW50MzIqKSBtYWxsb2Moc2l6ZW9mKEZMQUNfX2ludDMyKSAqIDIgKiBrTWF4TnVtU2FtcGxlc1BlckZyYW1lKTsKKyAgICAgICAgLy8gMnggdGhlIHBjbTE2IHNhbXBsZXMgY2FuIGV4aXN0IHdpdGggdGhlIHNhbWUgc2l6ZSBhcyBwY21GbG9hdCBzYW1wbGVzLgorICAgICAgICBtSW5wdXRCdWZmZXJQY20zMiA9IChGTEFDX19pbnQzMiopIG1hbGxvYygKKyAgICAgICAgICAgICAgICBzaXplb2YoRkxBQ19faW50MzIpICoga051bVNhbXBsZXNQZXJGcmFtZSAqIGtNYXhDaGFubmVscyAqIDIpOwogICAgICAgICBpZiAobUlucHV0QnVmZmVyUGNtMzIgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoIlNvZnRGbGFjRW5jb2Rlcjo6U29mdEZsYWNFbmNvZGVyKG5hbWU9JXMpIGVycm9yIGFsbG9jYXRpbmcgaW50ZXJuYWwgaW5wdXQgYnVmZmVyIiwgbmFtZSk7CiAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwpAQCAtMTE1LDE0ICsxMTcsMTQgQEAKICAgICAvLyBjb25maWd1cmUgaW5wdXQgcG9ydCBvZiB0aGUgZW5jb2RlcgogICAgIGRlZi5uUG9ydEluZGV4ID0gMDsKICAgICBkZWYuZURpciA9IE9NWF9EaXJJbnB1dDsKLSAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7Ly8gVE9ETyB2ZXJpZnkgdGhhdCAxIGlzIGVub3VnaAorICAgIGRlZi5uQnVmZmVyQ291bnRNaW4gPSBrTnVtQnVmZmVyczsKICAgICBkZWYubkJ1ZmZlckNvdW50QWN0dWFsID0gZGVmLm5CdWZmZXJDb3VudE1pbjsKICAgICBkZWYubkJ1ZmZlclNpemUgPSBrTWF4SW5wdXRCdWZmZXJTaXplOwogICAgIGRlZi5iRW5hYmxlZCA9IE9NWF9UUlVFOwogICAgIGRlZi5iUG9wdWxhdGVkID0gT01YX0ZBTFNFOwogICAgIGRlZi5lRG9tYWluID0gT01YX1BvcnREb21haW5BdWRpbzsKICAgICBkZWYuYkJ1ZmZlcnNDb250aWd1b3VzID0gT01YX0ZBTFNFOwotICAgIGRlZi5uQnVmZmVyQWxpZ25tZW50ID0gMjsKKyAgICBkZWYubkJ1ZmZlckFsaWdubWVudCA9IHNpemVvZihmbG9hdCk7CiAKICAgICBkZWYuZm9ybWF0LmF1ZGlvLmNNSU1FVHlwZSA9IGNvbnN0X2Nhc3Q8Y2hhciAqPigiYXVkaW8vcmF3Iik7CiAgICAgZGVmLmZvcm1hdC5hdWRpby5wTmF0aXZlUmVuZGVyID0gTlVMTDsKQEAgLTEzNCw3ICsxMzYsNyBAQAogICAgIC8vIGNvbmZpZ3VyZSBvdXRwdXQgcG9ydCBvZiB0aGUgZW5jb2RlcgogICAgIGRlZi5uUG9ydEluZGV4ID0gMTsKICAgICBkZWYuZURpciA9IE9NWF9EaXJPdXRwdXQ7Ci0gICAgZGVmLm5CdWZmZXJDb3VudE1pbiA9IGtOdW1CdWZmZXJzOy8vIFRPRE8gdmVyaWZ5IHRoYXQgMSBpcyBlbm91Z2gKKyAgICBkZWYubkJ1ZmZlckNvdW50TWluID0ga051bUJ1ZmZlcnM7CiAgICAgZGVmLm5CdWZmZXJDb3VudEFjdHVhbCA9IGRlZi5uQnVmZmVyQ291bnRNaW47CiAgICAgZGVmLm5CdWZmZXJTaXplID0ga01heE91dHB1dEJ1ZmZlclNpemU7CiAgICAgZGVmLmJFbmFibGVkID0gT01YX1RSVUU7CkBAIC0xOTMsMTAgKzE5NSwxMCBAQAogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHBjbVBhcmFtcy0+ZU51bURhdGEgPSBPTVhfTnVtZXJpY2FsRGF0YVNpZ25lZDsKKyAgICAgICAgICAgIHBjbVBhcmFtcy0+ZU51bURhdGEgPSBtTnVtZXJpY2FsRGF0YTsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUVuZGlhbiA9IE9NWF9FbmRpYW5CaWc7CiAgICAgICAgICAgICBwY21QYXJhbXMtPmJJbnRlcmxlYXZlZCA9IE9NWF9UUlVFOwotICAgICAgICAgICAgcGNtUGFyYW1zLT5uQml0UGVyU2FtcGxlID0gMTY7CisgICAgICAgICAgICBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPSBtQml0c1BlclNhbXBsZTsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZVBDTU1vZGUgPSBPTVhfQVVESU9fUENNTW9kZUxpbmVhcjsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzBdID0gT01YX0FVRElPX0NoYW5uZWxMRjsKICAgICAgICAgICAgIHBjbVBhcmFtcy0+ZUNoYW5uZWxNYXBwaW5nWzFdID0gT01YX0FVRElPX0NoYW5uZWxSRjsKQEAgLTI3MCwxMiArMjcyLDI2IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+bkNoYW5uZWxzIDwgMSB8fCBwY21QYXJhbXMtPm5DaGFubmVscyA+IDIpIHsKKyAgICAgICAgICAgIGlmIChwY21QYXJhbXMtPm5DaGFubmVscyA8IDEgfHwgcGNtUGFyYW1zLT5uQ2hhbm5lbHMgPiBrTWF4Q2hhbm5lbHMpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtTnVtQ2hhbm5lbHMgPSBwY21QYXJhbXMtPm5DaGFubmVsczsKICAgICAgICAgICAgIG1TYW1wbGVSYXRlID0gcGNtUGFyYW1zLT5uU2FtcGxpbmdSYXRlOworCisgICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5lTnVtRGF0YSA9PSBPTVhfTnVtZXJpY2FsRGF0YUZsb2F0ICYmIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSA9PSAzMikgeworICAgICAgICAgICAgICAgIG1OdW1lcmljYWxEYXRhID0gT01YX051bWVyaWNhbERhdGFGbG9hdDsKKyAgICAgICAgICAgICAgICBtQml0c1BlclNhbXBsZSA9IDMyOworICAgICAgICAgICAgfSBlbHNlIGlmIChwY21QYXJhbXMtPmVOdW1EYXRhID09IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkCisgICAgICAgICAgICAgICAgICAgICAmJiBwY21QYXJhbXMtPm5CaXRQZXJTYW1wbGUgPT0gMTYpIHsKKyAgICAgICAgICAgICAgICBtTnVtZXJpY2FsRGF0YSA9IE9NWF9OdW1lcmljYWxEYXRhU2lnbmVkOworICAgICAgICAgICAgICAgIG1CaXRzUGVyU2FtcGxlID0gMTY7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBlTnVtRGF0YSAlZCwgbkJpdHNQZXJTYW1wbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBjbVBhcmFtcy0+ZU51bURhdGEsIHBjbVBhcmFtcy0+bkJpdFBlclNhbXBsZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgQUxPR1YoIndpbGwgZW5jb2RlICVkIGNoYW5uZWxzIGF0ICVkSHoiLCBtTnVtQ2hhbm5lbHMsIG1TYW1wbGVSYXRlKTsKIAogICAgICAgICAgICAgcmV0dXJuIGNvbmZpZ3VyZUVuY29kZXIoKTsKQEAgLTM1Niw2ICszNzIsMTAgQEAKICAgICBMaXN0PEJ1ZmZlckluZm8gKj4gJmluUXVldWUgPSBnZXRQb3J0UXVldWUoMCk7CiAgICAgTGlzdDxCdWZmZXJJbmZvICo+ICZvdXRRdWV1ZSA9IGdldFBvcnRRdWV1ZSgxKTsKIAorICAgIGNvbnN0IGJvb2wgaW5wdXRGbG9hdCA9IG1OdW1lcmljYWxEYXRhID09IE9NWF9OdW1lcmljYWxEYXRhRmxvYXQ7CisgICAgY29uc3Qgc2l6ZV90IHNhbXBsZVNpemUgPSBpbnB1dEZsb2F0ID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihpbnQxNl90KTsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVTaXplID0gc2FtcGxlU2l6ZSAqIG1OdW1DaGFubmVsczsKKwogICAgIEZMQUNfX2Jvb2wgb2sgPSB0cnVlOwogCiAgICAgd2hpbGUgKCghaW5RdWV1ZS5lbXB0eSgpIHx8IG1TYXdJbnB1dEVPUykgJiYgIW91dFF1ZXVlLmVtcHR5KCkgJiYgIW1TZW50T3V0cHV0RU9TKSB7CkBAIC0zODEsMTMgKzQwMSwyMSBAQAogICAgICAgICAgICAgbUVuY29kZXJSZXR1cm5lZE5iQnl0ZXMgPSAwOwogICAgICAgICAgICAgbUN1cnJlbnRJbnB1dFRpbWVTdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOwogCi0gICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0RnJhbWVzID0gaW5IZWFkZXItPm5GaWxsZWRMZW4gLyAoMiAqIG1OdW1DaGFubmVscyk7Ci0gICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0U2FtcGxlcyA9IGluSGVhZGVyLT5uRmlsbGVkTGVuIC8gMjsKLSAgICAgICAgICAgIGNvbnN0IE9NWF9TMTYgKiBjb25zdCBwY20xNiA9IHJlaW50ZXJwcmV0X2Nhc3Q8T01YX1MxNiAqPihpbkhlYWRlci0+cEJ1ZmZlcik7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0RnJhbWVzID0gaW5IZWFkZXItPm5GaWxsZWRMZW4gLyBmcmFtZVNpemU7CisgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBuYklucHV0U2FtcGxlcyA9IGluSGVhZGVyLT5uRmlsbGVkTGVuIC8gc2FtcGxlU2l6ZTsKIAotICAgICAgICAgICAgQ0hFQ0tfTEUobmJJbnB1dFNhbXBsZXMsIDIgKiBrTWF4TnVtU2FtcGxlc1BlckZyYW1lKTsKLSAgICAgICAgICAgIGZvciAodW5zaWduZWQgaT0wIDsgaSA8IG5iSW5wdXRTYW1wbGVzIDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyUGNtMzJbaV0gPSAoRkxBQ19faW50MzIpIHBjbTE2W2ldOworICAgICAgICAgICAgaWYgKGlucHV0RmxvYXQpIHsKKyAgICAgICAgICAgICAgICBDSEVDS19MRShuYklucHV0U2FtcGxlcywga051bVNhbXBsZXNQZXJGcmFtZSAqIGtNYXhDaGFubmVscyk7CisgICAgICAgICAgICAgICAgY29uc3QgZmxvYXQgKiBjb25zdCBwY21GbG9hdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZmxvYXQgKj4oaW5IZWFkZXItPnBCdWZmZXIpOworICAgICAgICAgICAgICAgICBtZW1jcHlfdG9fcThfMjNfZnJvbV9mbG9hdF93aXRoX2NsYW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dEJ1ZmZlclBjbTMyLCBwY21GbG9hdCwgbmJJbnB1dFNhbXBsZXMpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBub3RlIG5iSW5wdXRTYW1wbGVzIG1heSBiZSAyeCBhcyBsYXJnZSBmb3IgcGNtMTYgZGF0YS4KKyAgICAgICAgICAgICAgICBDSEVDS19MRShuYklucHV0U2FtcGxlcywga051bVNhbXBsZXNQZXJGcmFtZSAqIGtNYXhDaGFubmVscyAqIDIpOworICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QgKiBjb25zdCBwY20xNiA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50MTZfdCAqPihpbkhlYWRlci0+cEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5iSW5wdXRTYW1wbGVzOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgbUlucHV0QnVmZmVyUGNtMzJbaV0gPSAoRkxBQ19faW50MzIpIHBjbTE2W2ldOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgICAgIEFMT0dWKCIgYWJvdXQgdG8gZW5jb2RlICV1IHNhbXBsZXMgcGVyIGNoYW5uZWwiLCBuYklucHV0RnJhbWVzKTsKICAgICAgICAgICAgIG9rID0gRkxBQ19fc3RyZWFtX2VuY29kZXJfcHJvY2Vzc19pbnRlcmxlYXZlZCgKQEAgLTUyNiwxMCArNTU0LDEyIEBACiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JJbnZhbGlkU3RhdGU7CiAgICAgfQogCisgICAgY29uc3QgYm9vbCBpbnB1dEZsb2F0ID0gbU51bWVyaWNhbERhdGEgPT0gT01YX051bWVyaWNhbERhdGFGbG9hdDsKKyAgICBjb25zdCBpbnQgY29kZWNCaXRzUGVyU2FtcGxlID0gaW5wdXRGbG9hdCA/IDI0IDogMTY7CiAgICAgRkxBQ19fYm9vbCBvayA9IHRydWU7CiAgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfY2hhbm5lbHMobUZsYWNTdHJlYW1FbmNvZGVyLCBtTnVtQ2hhbm5lbHMpOwogICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X3NhbXBsZV9yYXRlKG1GbGFjU3RyZWFtRW5jb2RlciwgbVNhbXBsZVJhdGUpOwotICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2JpdHNfcGVyX3NhbXBsZShtRmxhY1N0cmVhbUVuY29kZXIsIDE2KTsKKyAgICBvayA9IG9rICYmIEZMQUNfX3N0cmVhbV9lbmNvZGVyX3NldF9iaXRzX3Blcl9zYW1wbGUobUZsYWNTdHJlYW1FbmNvZGVyLCBjb2RlY0JpdHNQZXJTYW1wbGUpOwogICAgIG9rID0gb2sgJiYgRkxBQ19fc3RyZWFtX2VuY29kZXJfc2V0X2NvbXByZXNzaW9uX2xldmVsKG1GbGFjU3RyZWFtRW5jb2RlciwKICAgICAgICAgICAgICh1bnNpZ25lZCltQ29tcHJlc3Npb25MZXZlbCk7CiAgICAgb2sgPSBvayAmJiBGTEFDX19zdHJlYW1fZW5jb2Rlcl9zZXRfdmVyaWZ5KG1GbGFjU3RyZWFtRW5jb2RlciwgZmFsc2UpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2ZsYWMvZW5jL1NvZnRGbGFjRW5jb2Rlci5oCmluZGV4IDY0YTZiMWUuLjcyMmZjMTMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9mbGFjL2VuYy9Tb2Z0RmxhY0VuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZmxhYy9lbmMvU29mdEZsYWNFbmNvZGVyLmgKQEAgLTQ1LDggKzQ1LDEwIEBACiAKIHByaXZhdGU6CiAgICAgY29uc3QgdW5zaWduZWQgaW50IGtOdW1CdWZmZXJzID0gMjsKLSAgICBjb25zdCB1bnNpZ25lZCBpbnQga01heE51bVNhbXBsZXNQZXJGcmFtZSA9IDExNTI7Ci0gICAgY29uc3QgdW5zaWduZWQgaW50IGtNYXhJbnB1dEJ1ZmZlclNpemUgPSBrTWF4TnVtU2FtcGxlc1BlckZyYW1lICogc2l6ZW9mKGludDE2X3QpICogMjsKKyAgICBzdGF0aWMgY29uc3RleHByIHVuc2lnbmVkIGludCBrTWF4Q2hhbm5lbHMgPSAyOworICAgIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgaW50IGtOdW1TYW1wbGVzUGVyRnJhbWUgPSAxMTUyOworICAgIHN0YXRpYyBjb25zdGV4cHIgdW5zaWduZWQgaW50IGtNYXhJbnB1dEJ1ZmZlclNpemUgPQorICAgICAgICAgICAga051bVNhbXBsZXNQZXJGcmFtZSAqIGtNYXhDaGFubmVscyAqIHNpemVvZihmbG9hdCk7CiAgICAgY29uc3QgdW5zaWduZWQgaW50IGtNYXhPdXRwdXRCdWZmZXJTaXplID0gNjU1MzY7ICAgIC8vVE9ETyBjaGVjayBpZiB0aGlzIGNhbiBiZSByZWR1Y2VkCiAKICAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKQEAgLTU0LDYgKzU2LDggQEAKICAgICBPTVhfVTMyIG1OdW1DaGFubmVsczsKICAgICBPTVhfVTMyIG1TYW1wbGVSYXRlOwogICAgIE9NWF9VMzIgbUNvbXByZXNzaW9uTGV2ZWw7CisgICAgT01YX05VTUVSSUNBTERBVEFUWVBFIG1OdW1lcmljYWxEYXRhID0gT01YX051bWVyaWNhbERhdGFTaWduZWQ7CisgICAgT01YX1UzMiBtQml0c1BlclNhbXBsZSA9IDE2OwogCiAgICAgLy8gc2hvdWxkIHRoZSBkYXRhIHJlY2VpdmVkIGJ5IHRoZSBjYWxsYmFjayBiZSB3cml0dGVuIHRvIHRoZSBvdXRwdXQgcG9ydAogICAgIGJvb2wgICAgICAgIG1FbmNvZGVyV3JpdGVEYXRhOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NGMyOTYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXN1YmRpcnMgPSBbIioiXQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5icAppbmRleCA3MDk3Njg4Li5mNTM1N2Y0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvQW5kcm9pZC5icApAQCAtMSwyNiArMSw5IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfZzcxMWRlYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbIlNvZnRHNzExLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQotICAgIGNmbGFnczogWyItV2Vycm9yIl0sCi0KICAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAogICAgIHNhbml0aXplOiB7CkBAIC0zMCw1ICsxMyw0IEBACiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2c3MTEvZGVjL1NvZnRHNzExLmNwcAppbmRleCBjMTQ5ODNhLi44NzdjYjVhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZzcxMS9kZWMvU29mdEc3MTEuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nNzExL2RlYy9Tb2Z0RzcxMS5jcHAKQEAgLTIzLDYgKzIzLDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogCisjZGVmaW5lIE1BWF9DSEFOTkVMX0NPVU5UICAgICAgICAgICAgNiAgLyogbWF4aW11bSBudW1iZXIgb2YgYXVkaW8gY2hhbm5lbHMgdGhhdCBjYW4gYmUgZGVjb2RlZCAqLworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHRlbXBsYXRlPGNsYXNzIFQ+CkBAIC0xODQsNyArMTg2LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5kZWZpbmVkOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocGNtUGFyYW1zLT5uQ2hhbm5lbHMgPCAxIHx8IHBjbVBhcmFtcy0+bkNoYW5uZWxzID4gMikgeworICAgICAgICAgICAgaWYgKHBjbVBhcmFtcy0+bkNoYW5uZWxzIDwgMSB8fCBwY21QYXJhbXMtPm5DaGFubmVscyA+IE1BWF9DSEFOTkVMX0NPVU5UKSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVmaW5lZDsKICAgICAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDRjMjk2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vQW5kcm9pZC5icAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLXN1YmRpcnMgPSBbIioiXQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL0FuZHJvaWQuYnAKaW5kZXggYTk3M2Y3MC4uNTY3MmQ4OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9BbmRyb2lkLmJwCkBAIC0xLDIwICsxLDkgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9nc21kZWMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWyJTb2Z0R1NNLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICAgICAgImV4dGVybmFsL2xpYmdzbS9pbmMiLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAotCiAgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCiAKICAgICBzYW5pdGl6ZTogewpAQCAtMjUsMTMgKzE0LDUgQEAKICAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCiAKLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotCiAgICAgc3RhdGljX2xpYnM6IFsibGliZ3NtIl0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9nc20vZGVjL1NvZnRHU00uaAppbmRleCBlZjg2OTE1Li5kNTg4NWE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvZ3NtL2RlYy9Tb2Z0R1NNLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2dzbS9kZWMvU29mdEdTTS5oCkBAIC0yMCw5ICsyMCw3IEBACiAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oPgogCi1leHRlcm4gIkMiIHsKICNpbmNsdWRlICJnc20uaCIKLX0KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvQW5kcm9pZC5icAppbmRleCA2MGZjNDQ2Li5lYzQzNmNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL0FuZHJvaWQuYnAKQEAgLTEsMjggKzEsMTcgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9oZXZjZGVjIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHN0YXRpY19saWJzOiBbImxpYmhldmNkZWMiXSwKICAgICBzcmNzOiBbIlNvZnRIRVZDLmNwcCJdLAogCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2FsbCIsCi0gICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1Xbm8tdW51c2VkLXZhcmlhYmxlIiwKICAgICBdLAogCiAgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImV4dGVybmFsL2xpYmhldmMvZGVjb2RlciIsCi0gICAgICAgICJleHRlcm5hbC9saWJoZXZjL2NvbW1vbiIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCiAgICAgc2FuaXRpemU6IHsKICAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKICAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCkBAIC0zMCwxNiArMTksOCBAQAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKIAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KICAgICAvLyBXZSBuZWVkIHRoaXMgYmVjYXVzZSB0aGUgY3VycmVudCBhc20gZ2VuZXJhdGVzIHRoZSBmb2xsb3dpbmcgbGluayBlcnJvcjoKICAgICAvLyByZXF1aXJlcyB1bnN1cHBvcnRlZCBkeW5hbWljIHJlbG9jIFJfQVJNX1JFTDMyOyByZWNvbXBpbGUgd2l0aCAtZlBJQwogICAgIC8vIEJ1ZzogMTY4NTMyOTEKICAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9oZXZjZGVjL1NvZnRIRVZDLmNwcAppbmRleCBiYjdkMzYxLi5mNmFlMWY0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvaGV2Y2RlYy9Tb2Z0SEVWQy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL2hldmNkZWMvU29mdEhFVkMuY3BwCkBAIC01NjksNyArNTY5LDcgQEAKICAgICAgICAgICAgIHN0YXR1cyA9IGl2ZGVjX2FwaV9mdW5jdGlvbihtQ29kZWNDdHgsICh2b2lkICopJnNfZGVjX2lwLCAodm9pZCAqKSZzX2RlY19vcCk7CiAKICAgICAgICAgICAgIGJvb2wgdW5zdXBwb3J0ZWRSZXNvbHV0aW9uID0KLSAgICAgICAgICAgICAgICAoSVZEX1NUUkVBTV9XSURUSF9IRUlHSFRfTk9UX1NVUFBPUlRFRCA9PSAoc19kZWNfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKTsKKyAgICAgICAgICAgICAgICAoSVZEX1NUUkVBTV9XSURUSF9IRUlHSFRfTk9UX1NVUFBPUlRFRCA9PSAoc19kZWNfb3AudTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSk7CiAKICAgICAgICAgICAgIC8qIENoZWNrIGZvciB1bnN1cHBvcnRlZCBkaW1lbnNpb25zICovCiAgICAgICAgICAgICBpZiAodW5zdXBwb3J0ZWRSZXNvbHV0aW9uKSB7CkBAIC01NzksNyArNTc5LDggQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGJvb2wgYWxsb2NhdGlvbkZhaWxlZCA9IChJVkRfTUVNX0FMTE9DX0ZBSUxFRCA9PSAoc19kZWNfb3AudTRfZXJyb3JfY29kZSAmIDB4RkYpKTsKKyAgICAgICAgICAgIGJvb2wgYWxsb2NhdGlvbkZhaWxlZCA9IAorICAgICAgICAgICAgICAgIChJVkRfTUVNX0FMTE9DX0ZBSUxFRCA9PSAoc19kZWNfb3AudTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSk7CiAgICAgICAgICAgICBpZiAoYWxsb2NhdGlvbkZhaWxlZCkgewogICAgICAgICAgICAgICAgIEFMT0dFKCJBbGxvY2F0aW9uIGZhaWx1cmUgaW4gZGVjb2RlciIpOwogICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nLCAwLCBOVUxMKTsKQEAgLTU4Nyw3ICs1ODgsMTQgQEAKICAgICAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGJvb2wgcmVzQ2hhbmdlZCA9IChJVkRfUkVTX0NIQU5HRUQgPT0gKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUgJiAweEZGKSk7CisgICAgICAgICAgICBpZiAoSVNfSVZEX0ZBVEFMX0VSUk9SKHNfZGVjX29wLnU0X2Vycm9yX2NvZGUpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkZhdGFsIEVycm9yIDogMHgleCIsIHNfZGVjX29wLnU0X2Vycm9yX2NvZGUpOworICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5zdXBwb3J0ZWRTZXR0aW5nLCAwLCBOVUxMKTsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCByZXNDaGFuZ2VkID0gKElWRF9SRVNfQ0hBTkdFRCA9PSAoc19kZWNfb3AudTRfZXJyb3JfY29kZSAmIElWRF9FUlJPUl9NQVNLKSk7CiAKICAgICAgICAgICAgIGdldFZVSVBhcmFtcygpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDRjMjk2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc3ViZGlycyA9IFsiKiJdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL0FuZHJvaWQuYnAKaW5kZXggNDExNDFiMS4uYjhiODNkNSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvQW5kcm9pZC5icApAQCAtMSw2ICsxLDcgQEAKIGNjX2xpYnJhcnlfc3RhdGljIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKICAgICBzaGFyZWRfbGliczogWyJsaWJsb2ciXSwKIAogICAgIHNyY3M6IFsKQEAgLTM4LDExICszOSw2IEBACiAgICAgICAgICJzcmMvemlnemFnX3RhYi5jcHAiLAogICAgIF0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgIF0sCi0KICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAKQEAgLTYxLDQ4ICs1NywzNSBAQAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKKworICAgIHRhcmdldDogeworICAgICAgICBkYXJ3aW46IHsKKyAgICAgICAgICAgIGVuYWJsZWQ6IGZhbHNlLAorICAgICAgICB9LAorICAgIH0sCiB9CiAKIC8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwogCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzRkZWMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWyJTb2Z0TVBFRzQuY3BwIl0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgIF0sCi0KICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1ET1NDTF9FWFBPUlRfUkVGPSIsCiAgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAotCi0gICAgICAgICItV2Vycm9yIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyJdLAogCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9Tb2Z0TVBFRzQuY3BwCmluZGV4IGE4ZmNkZDEuLjYwNzUwZDkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvU29mdE1QRUc0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL1NvZnRNUEVHNC5jcHAKQEAgLTI0LDcgKzI0LDYgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FVdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgogCiAjaW5jbHVkZSAibXA0ZGVjX2FwaS5oIgogCkBAIC0xMTgsOSArMTE3LDE0IEBACiAgICAgICAgICAgICAgICAgb3V0SGVhZGVyLT5uRmxhZ3MgPSBPTVhfQlVGRkVSRkxBR19FT1M7CiAKICAgICAgICAgICAgICAgICBMaXN0PEJ1ZmZlckluZm8gKj46Oml0ZXJhdG9yIGl0ID0gb3V0UXVldWUuYmVnaW4oKTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoKCppdCktPm1IZWFkZXIgIT0gb3V0SGVhZGVyKSB7CisgICAgICAgICAgICAgICAgd2hpbGUgKGl0ICE9IG91dFF1ZXVlLmVuZCgpICYmICgqaXQpLT5tSGVhZGVyICE9IG91dEhlYWRlcikgewogICAgICAgICAgICAgICAgICAgICArK2l0OwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoaXQgPT0gb3V0UXVldWUuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoImNvdWxkbid0IGZpbmQgcG9ydCBidWZmZXIgJWQgaW4gb3V0UXVldWU6IGIvMTA5ODkxNzI3IiwgbU51bVNhbXBsZXNPdXRwdXQgJiAxKTsKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMDk4OTE3MjciKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIEJ1ZmZlckluZm8gKm91dEluZm8gPSAqaXQ7CiAgICAgICAgICAgICAgICAgb3V0SW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvYmxvY2tfaWRjdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9ibG9ja19pZGN0LmNwcAppbmRleCBhNzU0ODNhLi4zZDEwMDg2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9ibG9ja19pZGN0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9ibG9ja19pZGN0LmNwcApAQCAtNjE3LDYgKzYxNyw3IEBACiAgICAgcmV0dXJuOwogfQogCitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciKSkpCiB2b2lkIGlkY3Ryb3dfaW50cmEoCiAgICAgaW50MTYgKmJsaywgUElYRUwgKmNvbXAsIGludCB3aWR0aAogKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcGFja2V0X3V0aWwuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcGFja2V0X3V0aWwuY3BwCmluZGV4IDQ4NDE0ZDcuLjU4ODBlMzIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3BhY2tldF91dGlsLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wYWNrZXRfdXRpbC5jcHAKQEAgLTUyLDcgKzUyLDExIEBACiAgICAgICAgIFBWX0JpdHN0cmVhbUJ5dGVBbGlnbihzdHJlYW0pOwogICAgICAgICBCaXRzdHJlYW1SZWFkQml0czMyKHN0cmVhbSwgcmVzeW5jX21hcmtlcl9sZW5ndGgpOwogCi0gICAgICAgICpuZXh0X01CID0gKGludCkgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIG5iaXRzKTsKKyAgICAgICAgaW50IG1ibnVtID0gKGludCkgQml0c3RyZWFtUmVhZEJpdHMxNihzdHJlYW0sIG5iaXRzKTsKKyAgICAgICAgaWYgKG1ibnVtIDwgMCkgeworICAgICAgICAgICAgcmV0dXJuIFBWX0ZBSUw7CisgICAgICAgIH0KKyAgICAgICAgKm5leHRfTUIgPSBtYm51bTsKIC8vICAgICAgaWYgKCpuZXh0X01CIDw9IHZpZGVvLT5tYm51bSkgICAvKiAgbmVlZHMgbW9yZSBpbnZlc3RpZ2F0aW9uICovCiAvLyAgICAgICAgICAqbmV4dF9NQiA9IHZpZGVvLT5tYm51bSsxOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wdmRlY19hcGkuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvcHZkZWNfYXBpLmNwcAppbmRleCA3NWNhODQ2Li45YzBmY2ZhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy9wdmRlY19hcGkuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3B2ZGVjX2FwaS5jcHAKQEAgLTE4Niw4ICsxODYsOCBAQAogI2lmZGVmIERFQ19JTlRFUk5BTF9NRU1PUllfT1BUCiAgICAgICAgICAgICAgICAgdmlkZW8tPnZvbFtpZHhdID0gSU1FTV92b2xbaWR4XTsKICAgICAgICAgICAgICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gc2l6ZW9mKFZvbCk7Ci0gICAgICAgICAgICAgICAgb3NjbF9tZW1zZXQodmlkZW8tPnZvbFtpZHhdLCAwLCBzaXplb2YoVm9sKSk7CiAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLT52b2xbaWR4XSA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICAgICAgICAgICAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT52b2xbaWR4XSwgMCwgc2l6ZW9mKFZvbCkpOwogICAgICAgICAgICAgICAgIHN0cmVhbSA9IElNRU1fQml0c3RyZWFtRGVjVmlkZW87CiAjZWxzZQogICAgICAgICAgICAgICAgIHZpZGVvLT52b2xbaWR4XSA9IChWb2wgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKFZvbCkpOwpAQCAtMjEzLDYgKzIxMyw3IEBACiAgICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgaW50MzIgYnVmZmVyX3NpemU7CisgICAgICAgICAgICAgICAgICAgIG9zY2xfbWVtc2V0KHN0cmVhbSwgMCwgc2l6ZW9mKEJpdHN0cmVhbURlY1ZpZGVvKSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICgoYnVmZmVyX3NpemUgPSBCaXRzdHJlYW1PcGVuKHN0cmVhbSwgaWR4KSkgPCAwKQogICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtcDRkZWNfbG9nKCJJbml0VmlkZW9EZWNvZGVyKCk6IENhbid0IGFsbG9jYXRlIGJpdHN0cmVhbSBidWZmZXIuXG4iKTsKQEAgLTMzOSwyNyArMzQwLDMzIEBACiAjaWZkZWYgREVDX0lOVEVSTkFMX01FTU9SWV9PUFQKICAgICB2aWRlby0+Y3VyclZvcC0+eUNoYW4gPSBJTUVNX2N1cnJWb3BfeUNoYW47IC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIFZPUCBPS0EgMy8yLzEqLwogICAgIGlmICh2aWRlby0+Y3VyclZvcC0+eUNoYW4gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0gICAgdmlkZW8tPmN1cnJWb3AtPnVDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgc2l6ZTsKLSAgICB2aWRlby0+Y3VyclZvcC0+dkNoYW4gPSB2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICBlbHNlIHsKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnVDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnlDaGFuICsgc2l6ZTsKKyAgICAgICAgdmlkZW8tPmN1cnJWb3AtPnZDaGFuID0gdmlkZW8tPmN1cnJWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgfQogCiAgICAgdmlkZW8tPnByZXZWb3AtPnlDaGFuID0gSU1FTV9wcmV2Vm9wX3lDaGFuOyAvKiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFsbCBWT1AgT0tBIDMvMi8xKi8KICAgICBpZiAodmlkZW8tPnByZXZWb3AtPnlDaGFuID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOwotICAgIHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiArIHNpemU7Ci0gICAgdmlkZW8tPnByZXZWb3AtPnZDaGFuID0gdmlkZW8tPnByZXZWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgZWxzZSB7CisgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT55Q2hhbiArIHNpemU7CisgICAgICAgIHZpZGVvLT5wcmV2Vm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIH0KICNlbHNlCiAgICAgaWYgKHNpemUgPiBJTlQzMl9NQVggLyAzKSB7CiAgICAgICAgIHJldHVybiBQVl9GQUxTRTsKICAgICB9CiAgICAgdmlkZW8tPmN1cnJWb3AtPnlDaGFuID0gKFBJWEVMICopIG9zY2xfbWFsbG9jKHNpemUgKiAzIC8gMik7IC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIFZPUCBPS0EgMy8yLzEqLwogICAgIGlmICh2aWRlby0+Y3VyclZvcC0+eUNoYW4gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0KLSAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBzaXplOwotICAgIHZpZGVvLT5jdXJyVm9wLT52Q2hhbiA9IHZpZGVvLT5jdXJyVm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIGVsc2UgeworICAgICAgICB2aWRlby0+Y3VyclZvcC0+dUNoYW4gPSB2aWRlby0+Y3VyclZvcC0+eUNoYW4gKyBzaXplOworICAgICAgICB2aWRlby0+Y3VyclZvcC0+dkNoYW4gPSB2aWRlby0+Y3VyclZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICB9CiAgICAgdmlkZW8tPnByZXZWb3AtPnlDaGFuID0gKFBJWEVMICopIG9zY2xfbWFsbG9jKHNpemUgKiAzIC8gMik7IC8qIEFsbG9jYXRlIG1lbW9yeSBmb3IgYWxsIFZPUCBPS0EgMy8yLzEqLwogICAgIGlmICh2aWRlby0+cHJldlZvcC0+eUNoYW4gPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7Ci0KLSAgICB2aWRlby0+cHJldlZvcC0+dUNoYW4gPSB2aWRlby0+cHJldlZvcC0+eUNoYW4gKyBzaXplOwotICAgIHZpZGVvLT5wcmV2Vm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2Vm9wLT51Q2hhbiArIChzaXplID4+IDIpOworICAgIGVsc2UgeworICAgICAgICB2aWRlby0+cHJldlZvcC0+dUNoYW4gPSB2aWRlby0+cHJldlZvcC0+eUNoYW4gKyBzaXplOworICAgICAgICB2aWRlby0+cHJldlZvcC0+dkNoYW4gPSB2aWRlby0+cHJldlZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICB9CiAjZW5kaWYKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gKHNpemUgKiAzKTsKICNlbmRpZiAgIC8vIE1FTU9SWV9QT09MCkBAIC0zODMsOCArMzkwLDEwIEBACiAKICAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+eUNoYW4gPSAoUElYRUwgKikgb3NjbF9tYWxsb2Moc2l6ZSAqIDMgLyAyKTsgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBhbGwgVk9QIE9LQSAzLzIvMSovCiAgICAgICAgICAgICBpZiAodmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKLSAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dUNoYW4gPSB2aWRlby0+cHJldkVuaGNWb3AtPnlDaGFuICsgc2l6ZTsKLSAgICAgICAgICAgIHZpZGVvLT5wcmV2RW5oY1ZvcC0+dkNoYW4gPSB2aWRlby0+cHJldkVuaGNWb3AtPnVDaGFuICsgKHNpemUgPj4gMik7CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB2aWRlby0+cHJldkVuaGNWb3AtPnVDaGFuID0gdmlkZW8tPnByZXZFbmhjVm9wLT55Q2hhbiArIHNpemU7CisgICAgICAgICAgICAgICAgdmlkZW8tPnByZXZFbmhjVm9wLT52Q2hhbiA9IHZpZGVvLT5wcmV2RW5oY1ZvcC0+dUNoYW4gKyAoc2l6ZSA+PiAyKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoMyAqIHNpemUgLyAyKTsKICNlbmRpZgogICAgICAgICB9CkBAIC00MzEsMTAgKzQ0MCwxMiBAQAogI2Vsc2UKICAgICB2aWRlby0+c2xpY2VObyA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQik7CiAgICAgaWYgKHZpZGVvLT5zbGljZU5vID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPnNsaWNlTm8sIDAsIG5Ub3RhbE1CKTsKICAgICB2aWRlby0+bWVtb3J5VXNhZ2UgKz0gblRvdGFsTUI7CiAKICAgICB2aWRlby0+YWNQcmVkRmxhZyA9ICh1aW50OCAqKSBvc2NsX21hbGxvYyhuVG90YWxNQiAqIHNpemVvZih1aW50OCkpOwogICAgIGlmICh2aWRlby0+YWNQcmVkRmxhZyA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG9zY2xfbWVtc2V0KHZpZGVvLT5hY1ByZWRGbGFnLCAwLCBuVG90YWxNQiAqIHNpemVvZih1aW50OCkpOwogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIpOwogCiAgICAgaWYgKChzaXplX3QpblRvdGFsTUIgPiBTSVpFX01BWCAvIHNpemVvZih0eXBlRENTdG9yZSkpIHsKQEAgLTQ0Miw2ICs0NTMsNyBAQAogICAgIH0KICAgICB2aWRlby0+cHJlZERDID0gKHR5cGVEQ1N0b3JlICopIG9zY2xfbWFsbG9jKG5Ub3RhbE1CICogc2l6ZW9mKHR5cGVEQ1N0b3JlKSk7CiAgICAgaWYgKHZpZGVvLT5wcmVkREMgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+cHJlZERDLCAwLCBuVG90YWxNQiAqIHNpemVvZih0eXBlRENTdG9yZSkpOwogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIgKiBzaXplb2YodHlwZURDU3RvcmUpKTsKIAogICAgIGlmIChuTUJQZXJSb3cgPiBJTlQzMl9NQVggLSAxCkBAIC00NTAsNiArNDYyLDcgQEAKICAgICB9CiAgICAgdmlkZW8tPnByZWREQ0FDX2NvbCA9ICh0eXBlRENBQ1N0b3JlICopIG9zY2xfbWFsbG9jKChuTUJQZXJSb3cgKyAxKSAqIHNpemVvZih0eXBlRENBQ1N0b3JlKSk7CiAgICAgaWYgKHZpZGVvLT5wcmVkRENBQ19jb2wgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCh2aWRlby0+cHJlZERDQUNfY29sLCAwLCAobk1CUGVyUm93ICsgMSkgKiBzaXplb2YodHlwZURDQUNTdG9yZSkpOwogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoKG5NQlBlclJvdyArIDEpICogc2l6ZW9mKHR5cGVEQ0FDU3RvcmUpKTsKIAogICAgIC8qIGVsZW1lbnQgemVybyB3aWxsIGJlIHVzZWQgZm9yIHN0b3JpbmcgdmVydGljYWwgKGNvbCkgQUMgY29lZmZpY2llbnRzICovCkBAIC00NTksOSArNDcyLDExIEBACiAgICAgLyogQWxsb2NhdGluZyBIZWFkZXJJbmZvIHN0cnVjdHVyZSAmIFF1YW50aXplciBhcnJheSAqLwogICAgIHZpZGVvLT5oZWFkZXJJbmZvLk1vZGUgPSAodWludDggKikgb3NjbF9tYWxsb2MoblRvdGFsTUIpOwogICAgIGlmICh2aWRlby0+aGVhZGVySW5mby5Nb2RlID09IE5VTEwpIHN0YXR1cyA9IFBWX0ZBTFNFOworICAgIGVsc2Ugb3NjbF9tZW1zZXQodmlkZW8tPmhlYWRlckluZm8uTW9kZSwgMCwgblRvdGFsTUIpOwogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSBuVG90YWxNQjsKICAgICB2aWRlby0+aGVhZGVySW5mby5DQlAgPSAodWludDggKikgb3NjbF9tYWxsb2MoblRvdGFsTUIpOwogICAgIGlmICh2aWRlby0+aGVhZGVySW5mby5DQlAgPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBvc2NsX21lbXNldCAodmlkZW8tPmhlYWRlckluZm8uQ0JQLCAwLCBuVG90YWxNQik7CiAgICAgdmlkZW8tPm1lbW9yeVVzYWdlICs9IG5Ub3RhbE1COwogCiAgICAgaWYgKChzaXplX3QpblRvdGFsTUIgPiBTSVpFX01BWCAvIHNpemVvZihpbnQxNikpIHsKQEAgLTQ2OSw2ICs0ODQsNyBAQAogICAgIH0KICAgICB2aWRlby0+UVBNQiA9IChpbnQxNiAqKSBvc2NsX21hbGxvYyhuVG90YWxNQiAqIHNpemVvZihpbnQxNikpOwogICAgIGlmICh2aWRlby0+UVBNQiA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG1lbXNldCh2aWRlby0+UVBNQiwgMHgwLCBuVG90YWxNQiAqIHNpemVvZihpbnQxNikpOwogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoblRvdGFsTUIgKiBzaXplb2YoaW50KSk7CiAKICAgICAvKiBBbGxvY2F0aW5nIG1hY3JvYmxvY2sgc3BhY2UgKi8KQEAgLTQ4OSw4ICs1MDUsMTAgQEAKICAgICB9CiAgICAgdmlkZW8tPm1vdFggPSAoTU9UICopIG9zY2xfbWFsbG9jKHNpemVvZihNT1QpICogNCAqIG5Ub3RhbE1CKTsKICAgICBpZiAodmlkZW8tPm1vdFggPT0gTlVMTCkgc3RhdHVzID0gUFZfRkFMU0U7CisgICAgZWxzZSBtZW1zZXQodmlkZW8tPm1vdFgsIDAsIHNpemVvZihNT1QpICogNCAqIG5Ub3RhbE1CKTsKICAgICB2aWRlby0+bW90WSA9IChNT1QgKikgb3NjbF9tYWxsb2Moc2l6ZW9mKE1PVCkgKiA0ICogblRvdGFsTUIpOwogICAgIGlmICh2aWRlby0+bW90WSA9PSBOVUxMKSBzdGF0dXMgPSBQVl9GQUxTRTsKKyAgICBlbHNlIG1lbXNldCh2aWRlby0+bW90WSwgMCwgc2l6ZW9mKE1PVCkgKiA0ICogblRvdGFsTUIpOwogICAgIHZpZGVvLT5tZW1vcnlVc2FnZSArPSAoc2l6ZW9mKE1PVCkgKiA4ICogblRvdGFsTUIpOwogI2VuZGlmCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZvcC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3NyYy92b3AuY3BwCmluZGV4IGYxOGY3ODkuLjY3OWIwOTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvc3JjL3ZvcC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy9zcmMvdm9wLmNwcApAQCAtMTM1NSw2ICsxMzU1LDE0IEBACiAgICAgICAgICAgICBpbnQgdG1wSGVpZ2h0ID0gKHRtcERpc3BsYXlIZWlnaHQgKyAxNSkgJiAtMTY7CiAgICAgICAgICAgICBpbnQgdG1wV2lkdGggPSAodG1wRGlzcGxheVdpZHRoICsgMTUpICYgLTE2OwogCisgICAgICAgICAgICBpZiAodG1wV2lkdGggPiB2aWRlby0+d2lkdGgpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gd2hpbGUgYWxsb3dlZCBieSB0aGUgc3BlYywgdGhpcyBkZWNvZGVyIGRvZXMgbm90IGFjdHVhbGx5CisgICAgICAgICAgICAgICAgLy8gc3VwcG9ydCBhbiBpbmNyZWFzZSBpbiBzaXplLgorICAgICAgICAgICAgICAgIEFMT0dFKCJ3aWR0aCBpbmNyZWFzZSBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZfRkFJTDsKKyAgICAgICAgICAgICAgICBnb3RvIHJldHVybl9wb2ludDsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICh0bXBIZWlnaHQgKiB0bXBXaWR0aCA+IHZpZGVvLT5zaXplKQogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMganVzdCBwb3NzaWJseSAiYi8zNzA3OTI5NiIuCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMzVjOWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIk1wZWc0SDI2M0RlY29kZXJUZXN0IiwKKyAgICBndGVzdDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIk1wZWc0SDI2M0RlY29kZXJUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjQ3ZTEwY2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBNcGVnNEgyNjMgRGVjb2RlciB1bml0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iTXBlZzRIMjYzRGVjb2RlclRlc3QiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iTXBlZzRIMjYzRGVjb2RlclRlc3QtPi9kYXRhL2xvY2FsL3RtcC9NcGVnNEgyNjNEZWNvZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L01wZWc0SDI2M0RlY29kZXIuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL01wZWc0SDI2M0RlY29kZXJUZXN0UmVzLyIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iTXBlZzRIMjYzRGVjb2RlclRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9NcGVnNEgyNjNEZWNvZGVyVGVzdFJlcy8iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L01wZWc0SDI2M0RlY29kZXJUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9NcGVnNEgyNjNEZWNvZGVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY3YzFlYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9NcGVnNEgyNjNEZWNvZGVyVGVzdC5jcHAKQEAgLTAsMCArMSw0MjMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1wZWc0SDI2M0RlY29kZXJUZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisjaW5jbHVkZSAibXA0ZGVjX2FwaS5oIgorCisjaW5jbHVkZSAiTXBlZzRIMjYzRGVjb2RlclRlc3RFbnZpcm9ubWVudC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworI2RlZmluZSBPVVRQVVRfRklMRV9OQU1FICIvZGF0YS9sb2NhbC90bXAvT3V0cHV0Lnl1diIKKyNkZWZpbmUgQ09ERUNfQ09ORklHX0ZMQUcgMzIKKyNkZWZpbmUgU1lOQ19GUkFNRSAxCisjZGVmaW5lIE1QRUc0X01BWF9XSURUSCAxOTIwCisjZGVmaW5lIE1QRUc0X01BWF9IRUlHSFQgMTA4MAorI2RlZmluZSBIMjYzX01BWF9XSURUSCAzNTIKKyNkZWZpbmUgSDI2M19NQVhfSEVJR0hUIDI4OAorCitjb25zdGV4cHIgdWludDMyX3Qga051bU91dHB1dEJ1ZmZlcnMgPSAyOworCitzdHJ1Y3QgRnJhbWVJbmZvIHsKKyAgICBpbnQzMl90IGJ5dGVzQ291bnQ7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgaW50NjRfdCB0aW1lc3RhbXA7Cit9OworCitzdHJ1Y3QgdGFndmlkZW9EZWNDb250cm9sczsKKworc3RhdGljIE1wZWc0SDI2M0RlY29kZXJUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCitjbGFzcyBNcGVnNEgyNjNEZWNvZGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGU8c3RyaW5nLCBzdHJpbmcsIGJvb2w+PiB7CisgIHB1YmxpYzoKKyAgICBNcGVnNEgyNjNEZWNvZGVyVGVzdCgpCisgICAgICAgIDogbURlY0hhbmRsZShudWxscHRyKSwKKyAgICAgICAgICBtSW5wdXRCdWZmZXIobnVsbHB0ciksCisgICAgICAgICAgbUluaXRpYWxpemVkKGZhbHNlKSwKKyAgICAgICAgICBtRnJhbWVzQ29uZmlndXJlZChmYWxzZSksCisgICAgICAgICAgbU51bVNhbXBsZXNPdXRwdXQoMCksCisgICAgICAgICAgbVdpZHRoKDM1MiksCisgICAgICAgICAgbUhlaWdodCgyODgpIHsKKyAgICAgICAgbWVtc2V0KG1PdXRwdXRCdWZmZXIsIDB4MCwgc2l6ZW9mKG1PdXRwdXRCdWZmZXIpKTsKKyAgICB9CisKKyAgICB+TXBlZzRIMjYzRGVjb2RlclRlc3QoKSB7CisgICAgICAgIGlmIChtRWxlU3RyZWFtLmlzX29wZW4oKSkgbUVsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICBpZiAobURlY0hhbmRsZSkgeworICAgICAgICAgICAgZGVsZXRlIG1EZWNIYW5kbGU7CisgICAgICAgICAgICBtRGVjSGFuZGxlID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAobUlucHV0QnVmZmVyKSB7CisgICAgICAgICAgICBmcmVlKG1JbnB1dEJ1ZmZlcik7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGZyZWVPdXRwdXRCdWZmZXIoKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBpbml0RGVjb2RlcigpOworICAgIHZvaWQgYWxsb2NPdXRwdXRCdWZmZXIoc2l6ZV90IG91dHB1dEJ1ZmZlclNpemUpOworICAgIHZvaWQgZHVtcE91dHB1dChvZnN0cmVhbSAmb3N0cm0pOworICAgIHZvaWQgZnJlZU91dHB1dEJ1ZmZlcigpOworICAgIHZvaWQgcHJvY2Vzc01wZWc0SDI2M0RlY29kZXIodmVjdG9yPEZyYW1lSW5mbz4gSW5mbywgaW50MzJfdCBvZmZzZXQsIGludDMyX3QgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZnN0cmVhbSAmbUVsZVN0cmVhbSwgb2ZzdHJlYW0gJm9zdHJtLCBNUDREZWNvZGluZ01vZGUgaW5wdXRNb2RlKTsKKyAgICB2b2lkIGRlSW5pdERlY29kZXIoKTsKKworICAgIGlmc3RyZWFtIG1FbGVTdHJlYW07CisgICAgdGFndmlkZW9EZWNDb250cm9scyAqbURlY0hhbmRsZTsKKyAgICBjaGFyICptSW5wdXRCdWZmZXI7CisgICAgdWludDhfdCAqbU91dHB1dEJ1ZmZlcltrTnVtT3V0cHV0QnVmZmVyc107CisgICAgYm9vbCBtSW5pdGlhbGl6ZWQ7CisgICAgYm9vbCBtRnJhbWVzQ29uZmlndXJlZDsKKyAgICB1aW50MzJfdCBtTnVtU2FtcGxlc091dHB1dDsKKyAgICB1aW50MzJfdCBtV2lkdGg7CisgICAgdWludDMyX3QgbUhlaWdodDsKK307CisKK3N0YXR1c190IE1wZWc0SDI2M0RlY29kZXJUZXN0Ojppbml0RGVjb2RlcigpIHsKKyAgICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICAgICAgbURlY0hhbmRsZSA9IG5ldyB0YWd2aWRlb0RlY0NvbnRyb2xzOworICAgIH0KKyAgICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgbWVtc2V0KG1EZWNIYW5kbGUsIDAsIHNpemVvZih0YWd2aWRlb0RlY0NvbnRyb2xzKSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgTXBlZzRIMjYzRGVjb2RlclRlc3Q6OmFsbG9jT3V0cHV0QnVmZmVyKHNpemVfdCBvdXRwdXRCdWZmZXJTaXplKSB7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwga051bU91dHB1dEJ1ZmZlcnM7ICsraSkgeworICAgICAgICBpZiAoIW1PdXRwdXRCdWZmZXJbaV0pIHsKKyAgICAgICAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSAodWludDhfdCAqKW1hbGxvYyhvdXRwdXRCdWZmZXJTaXplKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShtT3V0cHV0QnVmZmVyW2ldLCBudWxscHRyKSA8PCAiT3V0cHV0IGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTXBlZzRIMjYzRGVjb2RlclRlc3Q6OmR1bXBPdXRwdXQob2ZzdHJlYW0gJm9zdHJtKSB7CisgICAgdWludDhfdCAqc3JjID0gbU91dHB1dEJ1ZmZlclttTnVtU2FtcGxlc091dHB1dCAmIDFdOworICAgIHNpemVfdCB2U3RyaWRlID0gYWxpZ24obUhlaWdodCwgMTYpOworICAgIHNpemVfdCBzcmNZU3RyaWRlID0gYWxpZ24obVdpZHRoLCAxNik7CisgICAgc2l6ZV90IHNyY1VWU3RyaWRlID0gc3JjWVN0cmlkZSAvIDI7CisgICAgdWludDhfdCAqc3JjU3RhcnQgPSBzcmM7CisKKyAgICAvKiBZIGJ1ZmZlciAqLworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUhlaWdodDsgKytpKSB7CisgICAgICAgIG9zdHJtLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihzcmMpLCBtV2lkdGgpOworICAgICAgICBzcmMgKz0gc3JjWVN0cmlkZTsKKyAgICB9CisgICAgLyogVSBidWZmZXIgKi8KKyAgICBzcmMgPSBzcmNTdGFydCArIHZTdHJpZGUgKiBzcmNZU3RyaWRlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUhlaWdodCAvIDI7ICsraSkgeworICAgICAgICBvc3RybS53cml0ZShyZWludGVycHJldF9jYXN0PGNoYXIgKj4oc3JjKSwgbVdpZHRoIC8gMik7CisgICAgICAgIHNyYyArPSBzcmNVVlN0cmlkZTsKKyAgICB9CisgICAgLyogViBidWZmZXIgKi8KKyAgICBzcmMgPSBzcmNTdGFydCArIHZTdHJpZGUgKiBzcmNZU3RyaWRlICogNSAvIDQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSGVpZ2h0IC8gMjsgKytpKSB7CisgICAgICAgIG9zdHJtLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihzcmMpLCBtV2lkdGggLyAyKTsKKyAgICAgICAgc3JjICs9IHNyY1VWU3RyaWRlOworICAgIH0KK30KKwordm9pZCBNcGVnNEgyNjNEZWNvZGVyVGVzdDo6ZnJlZU91dHB1dEJ1ZmZlcigpIHsKKyAgICBmb3IgKGludDMyX3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7CisgICAgICAgIGlmIChtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICAgICAgICBmcmVlKG1PdXRwdXRCdWZmZXJbaV0pOworICAgICAgICAgICAgbU91dHB1dEJ1ZmZlcltpXSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgTXBlZzRIMjYzRGVjb2RlclRlc3Q6OnByb2Nlc3NNcGVnNEgyNjNEZWNvZGVyKHZlY3RvcjxGcmFtZUluZm8+IEluZm8sIGludDMyX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCByYW5nZSwgaWZzdHJlYW0gJm1FbGVTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZnN0cmVhbSAmb3N0cm0sIE1QNERlY29kaW5nTW9kZSBpbnB1dE1vZGUpIHsKKyAgICBzaXplX3QgbWF4V2lkdGggPSAoaW5wdXRNb2RlID09IE1QRUc0X01PREUpID8gTVBFRzRfTUFYX1dJRFRIIDogSDI2M19NQVhfV0lEVEg7CisgICAgc2l6ZV90IG1heEhlaWdodCA9IChpbnB1dE1vZGUgPT0gTVBFRzRfTU9ERSkgPyBNUEVHNF9NQVhfSEVJR0hUIDogSDI2M19NQVhfSEVJR0hUOworICAgIHNpemVfdCBvdXRwdXRCdWZmZXJTaXplID0gYWxpZ24obWF4V2lkdGgsIDE2KSAqIGFsaWduKG1heEhlaWdodCwgMTYpICogMyAvIDI7CisgICAgdWludDMyX3QgZnJhbWVJbmRleCA9IG9mZnNldDsKKyAgICBib29sIHN0YXR1cyA9IHRydWU7CisgICAgQVNTRVJUX0dFKHJhbmdlLCAwKSA8PCAiSW52YWxpZCByYW5nZSI7CisgICAgQVNTRVJUX1RSVUUob2Zmc2V0ID49IDAgJiYgb2Zmc2V0IDw9IEluZm8uc2l6ZSgpIC0gMSkgPDwgIkludmFsaWQgb2Zmc2V0IjsKKyAgICBBU1NFUlRfTEUocmFuZ2UgKyBvZmZzZXQsIEluZm8uc2l6ZSgpKSA8PCAicmFuZ2Urb2Zmc2V0IGNhbid0IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbm8gb2YgZnJhbWVzIjsKKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChmcmFtZUluZGV4ID09IEluZm8uc2l6ZSgpIHx8IGZyYW1lSW5kZXggPT0gKG9mZnNldCArIHJhbmdlKSkgYnJlYWs7CisKKyAgICAgICAgaW50MzJfdCBieXRlc0NvdW50ID0gSW5mb1tmcmFtZUluZGV4XS5ieXRlc0NvdW50OworICAgICAgICBBU1NFUlRfR1QoYnl0ZXNDb3VudCwgMCkgPDwgIlNpemUgZm9yIHRoZSBtZW1vcnkgYWxsb2NhdGlvbiBpcyBuZWdhdGl2ZSI7CisgICAgICAgIG1JbnB1dEJ1ZmZlciA9IChjaGFyICopbWFsbG9jKGJ5dGVzQ291bnQpOworICAgICAgICBBU1NFUlRfTkUobUlucHV0QnVmZmVyLCBudWxscHRyKSA8PCAiSW5zdWZmaWNpZW50IG1lbW9yeSB0byByZWFkIGZyYW1lIjsKKyAgICAgICAgbUVsZVN0cmVhbS5yZWFkKG1JbnB1dEJ1ZmZlciwgYnl0ZXNDb3VudCk7CisgICAgICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmdjb3VudCgpLCBieXRlc0NvdW50KSA8PCAibUVsZVN0cmVhbS5nY291bnQoKSAhPSBieXRlc0NvdW50IjsKKyAgICAgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qgdm9sSW5mb1tdID0gezB4MDAsIDB4MDAsIDB4MDEsIDB4QjB9OworICAgICAgICBib29sIHZvbEhlYWRlciA9IG1lbWNtcChtSW5wdXRCdWZmZXIsIHZvbEluZm8sIDQpID09IDA7CisgICAgICAgIGlmICh2b2xIZWFkZXIpIHsKKyAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgICAgICAgICAgIG1Jbml0aWFsaXplZCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKnZvbERhdGFbMV17fTsKKyAgICAgICAgICAgIGludDMyX3Qgdm9sU2l6ZSA9IDA7CisKKyAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzID0gSW5mb1tmcmFtZUluZGV4XS5mbGFnczsKKyAgICAgICAgICAgIGJvb2wgY29kZWNDb25maWcgPSBmbGFncyA9PSBDT0RFQ19DT05GSUdfRkxBRzsKKyAgICAgICAgICAgIGlmIChjb2RlY0NvbmZpZyB8fCB2b2xIZWFkZXIpIHsKKyAgICAgICAgICAgICAgICB2b2xEYXRhWzBdID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KG1JbnB1dEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgdm9sU2l6ZSA9IGJ5dGVzQ291bnQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0YXR1cyA9IFBWSW5pdFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlLCB2b2xEYXRhLCAmdm9sU2l6ZSwgMSwgbWF4V2lkdGgsIG1heEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dE1vZGUpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiUFZJbml0VmlkZW9EZWNvZGVyIGZhaWxlZC4gVW5zdXBwb3J0ZWQgY29udGVudCI7CisKKyAgICAgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CisgICAgICAgICAgICBNUDREZWNvZGluZ01vZGUgYWN0dWFsTW9kZSA9IFBWR2V0RGVjQml0c3RyZWFtTW9kZShtRGVjSGFuZGxlKTsKKyAgICAgICAgICAgIEFTU0VSVF9FUShpbnB1dE1vZGUsIGFjdHVhbE1vZGUpCisgICAgICAgICAgICAgICAgICAgIDw8ICJEZWNvZGVkIG1vZGUgbm90IHNhbWUgYXMgYWN0dWFsIG1vZGUgb2YgdGhlIGRlY29kZXIiOworCisgICAgICAgICAgICBQVlNldFBvc3RQcm9jVHlwZShtRGVjSGFuZGxlLCAwKTsKKworICAgICAgICAgICAgaW50MzJfdCBkaXNwV2lkdGgsIGRpc3BIZWlnaHQ7CisgICAgICAgICAgICBQVkdldFZpZGVvRGltZW5zaW9ucyhtRGVjSGFuZGxlLCAmZGlzcFdpZHRoLCAmZGlzcEhlaWdodCk7CisKKyAgICAgICAgICAgIGludDMyX3QgYnVmV2lkdGgsIGJ1ZkhlaWdodDsKKyAgICAgICAgICAgIFBWR2V0QnVmZmVyRGltZW5zaW9ucyhtRGVjSGFuZGxlLCAmYnVmV2lkdGgsICZidWZIZWlnaHQpOworCisgICAgICAgICAgICBBU1NFUlRfTEUoZGlzcFdpZHRoLCBidWZXaWR0aCkgPDwgIkRpc3BsYXkgd2lkdGggaXMgZ3JlYXRlciB0aGFuIGJ1ZmZlciB3aWR0aCI7CisgICAgICAgICAgICBBU1NFUlRfTEUoZGlzcEhlaWdodCwgYnVmSGVpZ2h0KSA8PCAiRGlzcGxheSBoZWlnaHQgaXMgZ3JlYXRlciB0aGFuIGJ1ZmZlciBoZWlnaHQiOworCisgICAgICAgICAgICBpZiAoZGlzcFdpZHRoICE9IG1XaWR0aCB8fCBkaXNwSGVpZ2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgICAgICAgICBtV2lkdGggPSBkaXNwV2lkdGg7CisgICAgICAgICAgICAgICAgbUhlaWdodCA9IGRpc3BIZWlnaHQ7CisgICAgICAgICAgICAgICAgZnJlZU91dHB1dEJ1ZmZlcigpOworICAgICAgICAgICAgICAgIGlmIChpbnB1dE1vZGUgPT0gSDI2M19NT0RFKSB7CisgICAgICAgICAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKworICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp2b2xEYXRhWzFde307CisgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgdm9sU2l6ZSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUFZJbml0VmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUsIHZvbERhdGEsICZ2b2xTaXplLCAxLCBtYXhXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heEhlaWdodCwgSDI2M19NT0RFKTsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiUFZJbml0VmlkZW9EZWNvZGVyIGZhaWxlZCBmb3IgSDI2MyI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1GcmFtZXNDb25maWd1cmVkID0gZmFsc2U7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChjb2RlY0NvbmZpZykgeworICAgICAgICAgICAgICAgIGZyYW1lSW5kZXgrKzsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIHVpbnQzMl90IHlGcmFtZVNpemUgPSBzaXplb2YodWludDgpICogbURlY0hhbmRsZS0+c2l6ZTsKKyAgICAgICAgQVNTRVJUX0dFKG91dHB1dEJ1ZmZlclNpemUsIHlGcmFtZVNpemUgKiAzIC8gMikKKyAgICAgICAgICAgICAgICA8PCAiVG9vIHNtYWxsIG91dHB1dCBidWZmZXI6ICIgPDwgb3V0cHV0QnVmZmVyU2l6ZSA8PCAiIGJ5dGVzIjsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoYWxsb2NPdXRwdXRCdWZmZXIob3V0cHV0QnVmZmVyU2l6ZSkpOworCisgICAgICAgIGlmICghbUZyYW1lc0NvbmZpZ3VyZWQpIHsKKyAgICAgICAgICAgIFBWU2V0UmVmZXJlbmNlWVVWKG1EZWNIYW5kbGUsIG1PdXRwdXRCdWZmZXJbMV0pOworICAgICAgICAgICAgbUZyYW1lc0NvbmZpZ3VyZWQgPSB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gTmVlZCB0byBjaGVjayBpZiBoZWFkZXIgY29udGFpbnMgbmV3IGluZm8sIGUuZy4sIHdpZHRoL2hlaWdodCwgZXRjLgorICAgICAgICBWb3BIZWFkZXJJbmZvIGhlYWRlckluZm87CisgICAgICAgIHVpbnQzMl90IHVzZUV4dFRpbWVzdGFtcCA9IDE7CisgICAgICAgIGludDMyX3QgaW5wdXRTaXplID0gKEluZm8pW2ZyYW1lSW5kZXhdLmJ5dGVzQ291bnQ7CisgICAgICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IGZyYW1lSW5kZXg7CisKKyAgICAgICAgdWludDhfdCAqYml0c3RyZWFtVG1wID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KG1JbnB1dEJ1ZmZlcik7CisKKyAgICAgICAgc3RhdHVzID0gUFZEZWNvZGVWb3BIZWFkZXIobURlY0hhbmRsZSwgJmJpdHN0cmVhbVRtcCwgJnRpbWVzdGFtcCwgJmlucHV0U2l6ZSwgJmhlYWRlckluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1c2VFeHRUaW1lc3RhbXAsIG1PdXRwdXRCdWZmZXJbbU51bVNhbXBsZXNPdXRwdXQgJiAxXSk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIFBWX1RSVUUpIDw8ICJmYWlsZWQgdG8gZGVjb2RlIHZvcCBoZWFkZXIiOworCisgICAgICAgIC8vIEgyNjMgZG9lc24ndCBoYXZlIFZPTCBoZWFkZXIsIHRoZSBmcmFtZSBzaXplIGluZm9ybWF0aW9uIGlzIGluIHNob3J0IGhlYWRlciwgaS5lLiB0aGUKKyAgICAgICAgLy8gZGVjb2RlciBtYXkgZGV0ZWN0IHNpemUgY2hhbmdlIGFmdGVyIFBWRGVjb2RlVm9wSGVhZGVyLgorICAgICAgICBpbnQzMl90IGRpc3BXaWR0aCwgZGlzcEhlaWdodDsKKyAgICAgICAgUFZHZXRWaWRlb0RpbWVuc2lvbnMobURlY0hhbmRsZSwgJmRpc3BXaWR0aCwgJmRpc3BIZWlnaHQpOworCisgICAgICAgIGludDMyX3QgYnVmV2lkdGgsIGJ1ZkhlaWdodDsKKyAgICAgICAgUFZHZXRCdWZmZXJEaW1lbnNpb25zKG1EZWNIYW5kbGUsICZidWZXaWR0aCwgJmJ1ZkhlaWdodCk7CisKKyAgICAgICAgQVNTRVJUX0xFKGRpc3BXaWR0aCwgYnVmV2lkdGgpIDw8ICJEaXNwbGF5IHdpZHRoIGlzIGdyZWF0ZXIgdGhhbiBidWZmZXIgd2lkdGgiOworICAgICAgICBBU1NFUlRfTEUoZGlzcEhlaWdodCwgYnVmSGVpZ2h0KSA8PCAiRGlzcGxheSBoZWlnaHQgaXMgZ3JlYXRlciB0aGFuIGJ1ZmZlciBoZWlnaHQiOworICAgICAgICBpZiAoZGlzcFdpZHRoICE9IG1XaWR0aCB8fCBkaXNwSGVpZ2h0ICE9IG1IZWlnaHQpIHsKKyAgICAgICAgICAgIG1XaWR0aCA9IGRpc3BXaWR0aDsKKyAgICAgICAgICAgIG1IZWlnaHQgPSBkaXNwSGVpZ2h0OworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gUFZEZWNvZGVWb3BCb2R5KG1EZWNIYW5kbGUsICZpbnB1dFNpemUpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBQVl9UUlVFKSA8PCAiZmFpbGVkIHRvIGRlY29kZSB2aWRlbyBmcmFtZSBObyA9ICVkIiA8PCBmcmFtZUluZGV4OworCisgICAgICAgIGR1bXBPdXRwdXQob3N0cm0pOworCisgICAgICAgICsrbU51bVNhbXBsZXNPdXRwdXQ7CisgICAgICAgICsrZnJhbWVJbmRleDsKKyAgICB9CisgICAgZnJlZU91dHB1dEJ1ZmZlcigpOworfQorCit2b2lkIE1wZWc0SDI2M0RlY29kZXJUZXN0OjpkZUluaXREZWNvZGVyKCkgeworICAgIGlmIChtSW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgaWYgKG1EZWNIYW5kbGUpIHsKKyAgICAgICAgICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgICAgICAgICAgIGRlbGV0ZSBtRGVjSGFuZGxlOworICAgICAgICAgICAgbURlY0hhbmRsZSA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgbUluaXRpYWxpemVkID0gZmFsc2U7CisgICAgfQorICAgIGZyZWVPdXRwdXRCdWZmZXIoKTsKK30KKwordm9pZCBnZXRJbmZvKHN0cmluZyBpbmZvRmlsZU5hbWUsIHZlY3RvcjxGcmFtZUluZm8+ICZJbmZvKSB7CisgICAgaWZzdHJlYW0gZWxlSW5mbzsKKyAgICBlbGVJbmZvLm9wZW4oaW5mb0ZpbGVOYW1lKTsKKyAgICBBU1NFUlRfRVEoZWxlSW5mby5pc19vcGVuKCksIHRydWUpIDw8ICJGYWlsZWQgdG8gb3BlbiAiIDw8IGluZm9GaWxlTmFtZTsKKyAgICBpbnQzMl90IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICBJbmZvLnB1c2hfYmFjayh7Ynl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcH0pOworICAgIH0KKyAgICBpZiAoZWxlSW5mby5pc19vcGVuKCkpIGVsZUluZm8uY2xvc2UoKTsKK30KKworVEVTVF9QKE1wZWc0SDI2M0RlY29kZXJUZXN0LCBEZWNvZGVUZXN0KSB7CisgICAgdHVwbGU8c3RyaW5nIC8qIElucHV0RmlsZU5hbWUgKi8sIHN0cmluZyAvKiBJbmZvRmlsZU5hbWUgKi8sIGJvb2wgLyogbW9kZSAqLz4gcGFyYW1zID0KKyAgICAgICAgICAgIEdldFBhcmFtKCk7CisKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDA+KHBhcmFtcyk7CisgICAgbUVsZVN0cmVhbS5vcGVuKGlucHV0RmlsZU5hbWUsIGlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgIkZhaWxlZCB0byBvcGVuICIgPDwgZ2V0PDA+KHBhcmFtcyk7CisKKyAgICBzdHJpbmcgaW5mb0ZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MT4ocGFyYW1zKTsKKyAgICB2ZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldEluZm8oaW5mb0ZpbGVOYW1lLCBJbmZvKSk7CisgICAgQVNTRVJUX05FKEluZm8uZW1wdHkoKSwgdHJ1ZSkgPDwgIkludmFsaWQgSW5mbyBmaWxlIjsKKworICAgIG9mc3RyZWFtIG9zdHJtOworICAgIG9zdHJtLm9wZW4oT1VUUFVUX0ZJTEVfTkFNRSwgc3RkOjpvZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEob3N0cm0uaXNfb3BlbigpLCB0cnVlKSA8PCAiRmFpbGVkIHRvIG9wZW4gb3V0cHV0IHN0cmVhbSBmb3IgIiA8PCBnZXQ8MD4ocGFyYW1zKTsKKworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgQVNTRVJUX0VRKGVyciwgT0spIDw8ICJpbml0RGVjb2RlcjogZmFpbGVkIHRvIGNyZWF0ZSBkZWNvZGVyICIgPDwgZXJyOworCisgICAgYm9vbCBpc01wZWc0ID0gZ2V0PDI+KHBhcmFtcyk7CisgICAgTVA0RGVjb2RpbmdNb2RlIGlucHV0TW9kZSA9IGlzTXBlZzQgPyBNUEVHNF9NT0RFIDogSDI2M19NT0RFOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKAorICAgICAgICAgICAgcHJvY2Vzc01wZWc0SDI2M0RlY29kZXIoSW5mbywgMCwgSW5mby5zaXplKCksIG1FbGVTdHJlYW0sIG9zdHJtLCBpbnB1dE1vZGUpKTsKKyAgICBkZUluaXREZWNvZGVyKCk7CisgICAgb3N0cm0uY2xvc2UoKTsKKyAgICBJbmZvLmNsZWFyKCk7Cit9CisKK1RFU1RfUChNcGVnNEgyNjNEZWNvZGVyVGVzdCwgRmx1c2hUZXN0KSB7CisgICAgdHVwbGU8c3RyaW5nIC8qIElucHV0RmlsZU5hbWUgKi8sIHN0cmluZyAvKiBJbmZvRmlsZU5hbWUgKi8sIGJvb2wgLyogbW9kZSAqLz4gcGFyYW1zID0KKyAgICAgICAgICAgIEdldFBhcmFtKCk7CisKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDA+KHBhcmFtcyk7CisgICAgbUVsZVN0cmVhbS5vcGVuKGlucHV0RmlsZU5hbWUsIGlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgIkZhaWxlZCB0byBvcGVuICIgPDwgZ2V0PDA+KHBhcmFtcyk7CisKKyAgICBzdHJpbmcgaW5mb0ZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MT4ocGFyYW1zKTsKKyAgICB2ZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGdldEluZm8oaW5mb0ZpbGVOYW1lLCBJbmZvKSk7CisgICAgQVNTRVJUX05FKEluZm8uZW1wdHkoKSwgdHJ1ZSkgPDwgIkludmFsaWQgSW5mbyBmaWxlIjsKKworICAgIG9mc3RyZWFtIG9zdHJtOworICAgIG9zdHJtLm9wZW4oT1VUUFVUX0ZJTEVfTkFNRSwgc3RkOjpvZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEob3N0cm0uaXNfb3BlbigpLCB0cnVlKSA8PCAiRmFpbGVkIHRvIG9wZW4gb3V0cHV0IHN0cmVhbSBmb3IgIiA8PCBnZXQ8MD4ocGFyYW1zKTsKKworICAgIHN0YXR1c190IGVyciA9IGluaXREZWNvZGVyKCk7CisgICAgQVNTRVJUX0VRKGVyciwgT0spIDw8ICJpbml0RGVjb2RlcjogZmFpbGVkIHRvIGNyZWF0ZSBkZWNvZGVyICIgPDwgZXJyOworCisgICAgYm9vbCBpc01wZWc0ID0gZ2V0PDI+KHBhcmFtcyk7CisgICAgTVA0RGVjb2RpbmdNb2RlIGlucHV0TW9kZSA9IGlzTXBlZzQgPyBNUEVHNF9NT0RFIDogSDI2M19NT0RFOworICAgIC8vIE51bWJlciBvZiBmcmFtZXMgdG8gYmUgZGVjb2RlZCBiZWZvcmUgZmx1c2gKKyAgICBpbnQzMl90IG51bUZyYW1lcyA9IEluZm8uc2l6ZSgpIC8gMzsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSgKKyAgICAgICAgICAgIHByb2Nlc3NNcGVnNEgyNjNEZWNvZGVyKEluZm8sIDAsIG51bUZyYW1lcywgbUVsZVN0cmVhbSwgb3N0cm0sIGlucHV0TW9kZSkpOworCisgICAgaWYgKG1Jbml0aWFsaXplZCkgeworICAgICAgICBpbnQzMl90IHN0YXR1cyA9IFBWUmVzZXRWaWRlb0RlY29kZXIobURlY0hhbmRsZSk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIFBWX1RSVUUpOworICAgIH0KKworICAgIC8vIFNlZWsgdG8gbmV4dCBrZXkgZnJhbWUgYW5kIHN0YXJ0IGRlY29kaW5nIHRpbGwgdGhlIGVuZAorICAgIGludDMyX3QgaW5kZXggPSBudW1GcmFtZXM7CisgICAgYm9vbCBrZXlGcmFtZSA9IGZhbHNlOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB3aGlsZSAoaW5kZXggPCAoaW50MzJfdClJbmZvLnNpemUoKSkgeworICAgICAgICBpZiAoSW5mb1tpbmRleF0uZmxhZ3MpIGZsYWdzID0gMXUgPDwgKEluZm9baW5kZXhdLmZsYWdzIC0gMSk7CisgICAgICAgIGlmICgoZmxhZ3MgJiBTWU5DX0ZSQU1FKSA9PSBTWU5DX0ZSQU1FKSB7CisgICAgICAgICAgICBrZXlGcmFtZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmbGFncyA9IDA7CisgICAgICAgIG1FbGVTdHJlYW0uaWdub3JlKEluZm9baW5kZXhdLmJ5dGVzQ291bnQpOworICAgICAgICBpbmRleCsrOworICAgIH0KKyAgICBBTE9HVigiSW5kZXg9ICVkIiwgaW5kZXgpOworICAgIGlmIChrZXlGcmFtZSkgeworICAgICAgICBtTnVtU2FtcGxlc091dHB1dCA9IDA7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHByb2Nlc3NNcGVnNEgyNjNEZWNvZGVyKEluZm8sIGluZGV4LCAoaW50MzJfdClJbmZvLnNpemUoKSAtIGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRWxlU3RyZWFtLCBvc3RybSwgaW5wdXRNb2RlKSk7CisgICAgfQorICAgIGRlSW5pdERlY29kZXIoKTsKKyAgICBvc3RybS5jbG9zZSgpOworICAgIEluZm8uY2xlYXIoKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBNcGVnNEgyNjNEZWNvZGVyVGVzdEFsbCwgTXBlZzRIMjYzRGVjb2RlclRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoInN3aXJsXzEyOHg5Nl9oMjYzLmgyNjMiLCAic3dpcmxfMTI4eDk2X2gyNjMuaW5mbyIsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgic3dpcmxfMTc2eDE0NF9oMjYzLmgyNjMiLCAic3dpcmxfMTc2eDE0NF9oMjYzLmluZm8iLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInN3aXJsXzM1MngyODhfaDI2My5oMjYzIiwgInN3aXJsXzM1MngyODhfaDI2My5pbmZvIiwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfMzUyeDI4OF9oMjYzLmgyNjMiLCAiYmJiXzM1MngyODhfaDI2My5pbmZvIiwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfMzUyeDI4OF9tcGVnNC5tNHYiLCAiYmJiXzM1MngyODhfbXBlZzQuaW5mbyIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJzd2lybF8xMjh4MTI4X21wZWc0Lm00diIsICJzd2lybF8xMjh4MTI4X21wZWc0LmluZm8iLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgic3dpcmxfMTMweDEzMl9tcGVnNC5tNHYiLCAic3dpcmxfMTMweDEzMl9tcGVnNC5pbmZvIiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoInN3aXJsXzEzMngxMzBfbXBlZzQubTR2IiwgInN3aXJsXzEzMngxMzBfbXBlZzQuaW5mbyIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJzd2lybF8xMzZ4MTQ0X21wZWc0Lm00diIsICJzd2lybF8xMzZ4MTQ0X21wZWc0LmluZm8iLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgic3dpcmxfMTQ0eDEzNl9tcGVnNC5tNHYiLCAic3dpcmxfMTQ0eDEzNl9tcGVnNC5pbmZvIiwgdHJ1ZSkpKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgZ0VudiA9IG5ldyBNcGVnNEgyNjNEZWNvZGVyVGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HRCgiRGVjb2RlciBUZXN0IFJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L01wZWc0SDI2M0RlY29kZXJUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9NcGVnNEgyNjNEZWNvZGVyVGVzdEVudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA4NTg0NQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9NcGVnNEgyNjNEZWNvZGVyVGVzdEVudmlyb25tZW50LmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19NUEVHNF9IMjYzX0RFQ09ERVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KKyNkZWZpbmUgX19NUEVHNF9IMjYzX0RFQ09ERVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgTXBlZzRIMjYzRGVjb2RlclRlc3RFbnZpcm9ubWVudCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyAgcHVibGljOgorICAgIE1wZWc0SDI2M0RlY29kZXJUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL2RhdGEvbG9jYWwvdG1wLyIpIHt9CisKKyAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyICpfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IHN0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KKworICBwcml2YXRlOgorICAgIHN0cmluZyByZXM7Cit9OworCitpbnQgTXBlZzRIMjYzRGVjb2RlclRlc3RFbnZpcm9ubWVudDo6aW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHt7InBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzogeworICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCisgICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBfX01QRUc0X0gyNjNfREVDT0RFUl9URVNUX0VOVklST05NRU5UX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2U0YWVhMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9kZWMvdGVzdC9SRUFETUUubWQKQEAgLTAsMCArMSwzOSBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIE1wZWc0SDI2M0RlY29kZXIgOgorVGhlIE1wZWc0SDI2M0RlY29kZXIgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIE1wZWc0IGFuZCBIMjYzIGRlY29kZXIgYXZhaWxhYmxlIGluIGxpYnN0YWdlZnJpZ2h0LgorCitSdW4gdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB0aGUgdGVzdCBzdWl0ZToKK2BgYAorbSBNcGVnNEgyNjNEZWNvZGVyVGVzdAorYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9NcGVnNEgyNjNEZWNvZGVyVGVzdC9NcGVnNEgyNjNEZWNvZGVyVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L01wZWc0SDI2M0RlY29kZXJUZXN0L01wZWc0SDI2M0RlY29kZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2RlYy90ZXN0L01wZWc0SDI2M0RlY29kZXIuemlwKS4gRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgorCitgYGAKK2FkYiBwdXNoIE1wZWc0SDI2M0RlY29kZXIgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK3VzYWdlOiBNcGVnNEgyNjNEZWNvZGVyVGVzdCAtUCBcPHBhdGhfdG9fZm9sZGVyXD4KK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9NcGVnNEgyNjNEZWNvZGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvTXBlZzRIMjYzRGVjb2Rlci8KK2BgYAorQWx0ZXJuYXRpdmVseSwgdGhlIHRlc3QgY2FuIGFsc28gYmUgcnVuIHVzaW5nIGF0ZXN0IGNvbW1hbmQuCisKK2BgYAorYXRlc3QgTXBlZzRIMjYzRGVjb2RlclRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL0FuZHJvaWQuYnAKaW5kZXggZDRmN2Q1MC4uMjczODE4NyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvQW5kcm9pZC5icApAQCAtMzIsMTAgKzMyLDYgQEAKIAogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAogICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJzcmMiXSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKIApAQCAtNTEsNDYgKzQ3LDI3IEBACiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9tcGVnNGVuYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbIlNvZnRNUEVHNEVuY29kZXIuY3BwIl0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9oYXJkd2FyZSIsCi0gICAgXSwKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsic3JjIl0sCi0gICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1EQlhfUkMiLAogICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKICAgICAgICAgIi1ET1NDTF9VTlVTRURfQVJHKHgpPSh2b2lkKSh4KSIsCiAgICAgICAgICItRE9TQ0xfRVhQT1JUX1JFRj0iLAotCi0gICAgICAgICItV2Vycm9yIiwKICAgICBdLAogCiAgICAgc3RhdGljX2xpYnM6IFsibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyJdLAogCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQogCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuY3BwCmluZGV4IGY2YTdiMGUuLmZhN2RiODEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9Tb2Z0TVBFRzRFbmNvZGVyLmNwcApAQCAtMjIsOCArMjIsOCBAQAogI2luY2x1ZGUgIm1wNGVuY19hcGkuaCIKICNpbmNsdWRlICJPTVhfVmlkZW8uaCIKIAotI2luY2x1ZGUgPEhhcmR3YXJlQVBJLmg+Ci0jaW5jbHVkZSA8TWV0YWRhdGFCdWZmZXJUeXBlLmg+CisjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KKyNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9NZXRhZGF0YUJ1ZmZlclR5cGUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL1NvZnRNUEVHNEVuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCmluZGV4IDAwZjJkZDMuLjcxZTExNzAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvU29mdE1QRUc0RW5jb2Rlci5oCkBAIC0xNyw3ICsxNyw2IEBACiAjaWZuZGVmIFNPRlRfTVBFRzRfRU5DT0RFUl9IXwogI2RlZmluZSBTT0ZUX01QRUc0X0VOQ09ERVJfSF8KIAotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50Lmg+CiAjaW5jbHVkZSAibXA0ZW5jX2FwaS5oIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvc3JjL3JhdGVfY29udHJvbC5jcHAKaW5kZXggNTMxNDljMS4uZWNjMzIxNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy9zcmMvcmF0ZV9jb250cm9sLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3NyYy9yYXRlX2NvbnRyb2wuY3BwCkBAIC0zNzcsMTUgKzM3NywxNSBAQAogLyogIEluL291dCAgIDogTnIsIEIsIFJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgUmV0dXJuICAgOiBWb2lkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBNb2RpZmllZCA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSW5wdXQgYXJndW1lbnQgInZpZGVvIiBpcyBndWFyYW50ZWVkIG5vbi1udWxsIGJ5IGNhbGxlciAgICAgICAgICAgICAgICAgICovCiAvKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KIAotCiBQVl9TVEFUVVMgUkNfVXBkYXRlQnVmZmVyKFZpZGVvRW5jRGF0YSAqdmlkZW8sIEludCBjdXJyTGF5ZXIsIEludCBudW1fc2tpcCkKIHsKICAgICByYXRlQ29udHJvbCAqcmMgID0gdmlkZW8tPnJjW2N1cnJMYXllcl07CiAgICAgTXVsdGlQYXNzICAgKnBNUCA9IHZpZGVvLT5wTVBbY3VyckxheWVyXTsKIAotICAgIGlmICh2aWRlbyA9PSBOVUxMIHx8IHJjID09IE5VTEwgfHwgcE1QID09IE5VTEwpCisgICAgaWYgKHJjID09IE5VTEwgfHwgcE1QID09IE5VTEwpCiAgICAgICAgIHJldHVybiBQVl9GQUlMOwogCiAgICAgcmMtPlZCVl9mdWxsbmVzcyAgIC09IChJbnQpKHJjLT5iaXRyYXRlIC8gcmMtPmZyYW1lcmF0ZSAqIG51bV9za2lwKTsgLy9yY1tjdXJyTGF5ZXJdLT5ScDsKQEAgLTUyNCw2ICs1MjQsNyBAQAogLyogIEluL291dCAgIDogcmMtPlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBSZXR1cm4gICA6IFZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogSW5wdXQgYXJndW1lbnQgImlucHV0IiBpcyBndWFyYW50ZWVkIG5vbi1udWxsIGJ5IGNhbGxlciAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKIHZvaWQgdGFyZ2V0Qml0Q2FsY3VsYXRpb24odm9pZCAqaW5wdXQpCkBAIC01MzcsNyArNTM4LDcgQEAKICAgICBJbnQgZGlmZl9jb3VudGVyX0JUc3JjLCBkaWZmX2NvdW50ZXJfQlRkc3QsIHByZXZfY291bnRlcl9kaWZmLCBjdXJyX2NvdW50ZXJfZGlmZiwgYm91bmQ7CiAgICAgLyogQlQgPSBCaXQgVHJhbnNmZXIsIGZvciBwTVAtPmNvdW50ZXJfQlRzcmMsIHBNUC0+Y291bnRlcl9CVGRzdCAqLwogCi0gICAgaWYgKHZpZGVvID09IE5VTEwgfHwgY3VyclZvbCA9PSBOVUxMIHx8IHBNUCA9PSBOVUxMIHx8IHJjID09IE5VTEwpCisgICAgaWYgKGN1cnJWb2wgPT0gTlVMTCB8fCBwTVAgPT0gTlVMTCB8fCByYyA9PSBOVUxMKQogICAgICAgICByZXR1cm47CiAKICAgICAvKiBzb21lIHN0dWZmIGFib3V0IGZyYW1lIGRyb3BwaW5nIHJlbWFpbmVkIGhlcmUgdG8gYmUgZG9uZSBiZWNhdXNlIHBNUCBjYW5ub3QgYmUgaW5zZXJ0ZWQgaW50byB1cGRhdGVSYXRlQ29udHJvbCgpKi8KQEAgLTY5Myw2ICs2OTQsNyBAQAogLyogIEluL291dCAgIDogcmMtPlQgYW5kIHJjLT5RYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qICBSZXR1cm4gICA6IFZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAvKiAgTW9kaWZpZWQgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIElucHV0IGFyZ3VtZW50ICJpbnB1dCIgaXMgZ3VhcmFudGVlZCBub24tbnVsbCBieSBjYWxsZXIgICAgICAgICAgICAgICAgICAgICAgICAgKi8KIC8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCiAKIC8qIE1hZCBiYXNlZCB2YXJpYWJsZSBiaXQgYWxsb2NhdGlvbiArIFFQIGNhbGN1bGF0aW9uIHdpdGggYSBuZXcgcXVhZHJhdGljIG1ldGhvZCAqLwpAQCAtNzA4LDcgKzcxMCw3IEBACiAgICAgZmxvYXQgY3Vycl9tYWQsIHByZXZfbWFkLCBjdXJyX1JELCBwcmV2X1JELCBhdmVyYWdlX21hZCwgYXZlcl9RUDsKIAogCi0gICAgaWYgKHZpZGVvID09IE5VTEwgfHwgY3VyclZvbCA9PSBOVUxMIHx8IHBNUCA9PSBOVUxMIHx8IHJjID09IE5VTEwpCisgICAgaWYgKGN1cnJWb2wgPT0gTlVMTCB8fCBwTVAgPT0gTlVMTCB8fCByYyA9PSBOVUxMKQogICAgICAgICByZXR1cm47CiAKICAgICAvKiBNYWQgYmFzZWQgdmFyaWFibGUgYml0IGFsbG9jYXRpb24gKi8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjlhODExNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiTXBlZzRIMjYzRW5jb2RlclRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjcyA6IFsgIk1wZWc0SDI2M0VuY29kZXJUZXN0LmNwcCIgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2VuYyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MjE4OTMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgTVBFRzRIMjYzIGVuY29kZXIgdW5pdCB0ZXN0cyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9Ik1wZWc0SDI2M0VuY29kZXJUZXN0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9Ik1wZWc0SDI2M0VuY29kZXJUZXN0LT4vZGF0YS9sb2NhbC90bXAvTXBlZzRIMjYzRW5jb2RlclRlc3QvIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvTXBlZzRIMjYzRW5jb2Rlci56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvTXBlZzRIMjYzRW5jb2RlclRlc3RSZXMvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJNcGVnNEgyNjNFbmNvZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL01wZWc0SDI2M0VuY29kZXJUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L01wZWc0SDI2M0VuY29kZXJUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9NcGVnNEgyNjNFbmNvZGVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhjNzA1YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9NcGVnNEgyNjNFbmNvZGVyVGVzdC5jcHAKQEAgLTAsMCArMSwyNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1wZWc0SDI2M0VuY29kZXJUZXN0IgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSAibXA0ZW5jX2FwaS5oIgorCisjaW5jbHVkZSAiTXBlZzRIMjYzRW5jb2RlclRlc3RFbnZpcm9ubWVudC5oIgorCisjZGVmaW5lIEVOQ09ERURfRklMRSAiL2RhdGEvbG9jYWwvdG1wL01wZWc0SDI2M091dHB1dCIKKworLy8gYXNzdW1pbmcgYSB3b3JzdCBjYXNlIGNvbXByZXNzaW9uIG9mIDJYCitjb25zdGV4cHIgaW50MTZfdCBrQ29tcHJlc3Npb25SYXRpbyA9IDI7Citjb25zdGV4cHIgaW50OF90IGtJRFJGcmFtZVJlZnJlc2hJbnRlcnZhbEluU2VjID0gMTsKKworc3RhdGljIE1wZWc0SDI2M0VuY29kZXJUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCitjbGFzcyBNcGVnNEgyNjNFbmNvZGVyVGVzdAorICAgIDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxzdHJpbmcsIGJvb2wsIGludDMyX3QsIGludDMyX3QsIGZsb2F0LCBpbnQzMl90Pj4geworICBwcml2YXRlOgorICAgIHZvaWQgaW5pdEVuY29kZXJQYXJhbXMoKTsKKworICBwdWJsaWM6CisgICAgTXBlZzRIMjYzRW5jb2RlclRlc3QoKQorICAgICAgICA6IG1JbnB1dEJ1ZmZlcihudWxscHRyKSwKKyAgICAgICAgICBtT3V0cHV0QnVmZmVyKG51bGxwdHIpLAorICAgICAgICAgIG1GcElucHV0KG51bGxwdHIpLAorICAgICAgICAgIG1GcE91dHB1dChudWxscHRyKSwKKyAgICAgICAgICBtRW5jb2RlSGFuZGxlKG51bGxwdHIpLAorICAgICAgICAgIG1FbmNvZGVDb250cm9sKG51bGxwdHIpIHt9CisKKyAgICB+TXBlZzRIMjYzRW5jb2RlclRlc3QoKSB7CisgICAgICAgIGlmKG1GcElucHV0KSB7CisgICAgICAgICAgICBmY2xvc2UobUZwSW5wdXQpOworICAgICAgICB9CisgICAgICAgIGlmKG1GcE91dHB1dCkgeworICAgICAgICAgICAgZmNsb3NlKG1GcE91dHB1dCk7CisgICAgICAgIH0KKyAgICAgICAgaWYobUlucHV0QnVmZmVyKSBmcmVlKG1JbnB1dEJ1ZmZlcik7CisgICAgICAgIGlmKG1PdXRwdXRCdWZmZXIpIGZyZWUobU91dHB1dEJ1ZmZlcik7CisgICAgICAgIGlmKG1FbmNvZGVIYW5kbGUpIGZyZWUobUVuY29kZUhhbmRsZSk7CisgICAgICAgIGlmKG1FbmNvZGVDb250cm9sKSBmcmVlKG1FbmNvZGVDb250cm9sKTsKKyAgICB9CisKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICB0dXBsZTxzdHJpbmcgLyogZmlsZU5hbWUgKi8sIGJvb2wgLyogaXNNcGVnNCAqLywgaW50MzJfdCAvKiBmcmFtZVdpZHRoICovLAorICAgICAgICAgIGludDMyX3QgLyogZnJhbWVIZWlnaHQgKi8sIGZsb2F0IC8qIGZyYW1lUmF0ZSAqLywgaW50MzJfdCAvKiBiaXRSYXRlICovPgorICAgICAgICAgICAgcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICAgICAgbUZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MD4ocGFyYW1zKTsKKyAgICAgICAgbUlzTXBlZzQgPSBnZXQ8MT4ocGFyYW1zKTsKKyAgICAgICAgbUZyYW1lV2lkdGggPSBnZXQ8Mj4ocGFyYW1zKTsKKyAgICAgICAgbUZyYW1lSGVpZ2h0ID0gZ2V0PDM+KHBhcmFtcyk7CisgICAgICAgIG1GcmFtZVJhdGUgPSBnZXQ8ND4ocGFyYW1zKTsKKyAgICAgICAgbUJpdFJhdGUgPSBnZXQ8NT4ocGFyYW1zKTsKKworICAgICAgICBBU1NFUlRfVFJVRShtRnJhbWVXaWR0aCAlIDE2ID09IDApIDw8ICJGcmFtZSBXaWR0aCBzaG91bGQgYmUgbXVsdGlwbGUgb2YgMTYiOworICAgICAgICBBU1NFUlRfVFJVRShtRnJhbWVIZWlnaHQgJSAxNiA9PSAwKSA8PCAiRnJhbWUgSGVpZ2h0IHNob3VsZCBiZSBtdWx0aXBsZSBvZiAxNiI7CisgICAgICAgIEFTU0VSVF9MRShtRnJhbWVXaWR0aCwgKG1Jc01wZWc0ID8gNzIwIDogMzUyKSkKKyAgICAgICAgICAgICAgICA8PCAiRnJhbWUgV2lkdGggPD0gNzIwIGZvciBNcGVnNCBhbmQgPD0gMzUyIGZvciBIMjYzIjsKKyAgICAgICAgQVNTRVJUX0xFKG1GcmFtZUhlaWdodCwgKG1Jc01wZWc0ID8gNDgwIDogMjg4KSkKKyAgICAgICAgICAgICAgICA8PCAiRnJhbWUgSGVpZ2h0IDw9IDQ4MCBmb3IgTXBlZzQgYW5kIDw9IDI4OCBmb3IgSDI2MyI7CisgICAgICAgIEFTU0VSVF9MRShtRnJhbWVSYXRlLCAzMCkgPDwgIkZyYW1lIHJhdGUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDMwIjsKKyAgICAgICAgQVNTRVJUX0xFKG1CaXRSYXRlLCAyMDQ4KSA8PCAiQml0IHJhdGUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIDIwNDgga2JwcyI7CisKKyAgICAgICAgbU91dHB1dEJ1ZmZlclNpemUgPSAoIG1GcmFtZVdpZHRoICogbUZyYW1lSGVpZ2h0ICogMy8yICkgLyBrQ29tcHJlc3Npb25SYXRpbzsKKyAgICAgICAgbUVuY29kZUhhbmRsZSA9IG5ldyBWaWRlb0VuY09wdGlvbnM7CisgICAgICAgIEFTU0VSVF9ORShtRW5jb2RlSGFuZGxlLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGdldCBWaWRlbyBFbmNvZGluZyBvcHRpb25zIG9iamVjdCI7CisgICAgICAgIG1lbXNldChtRW5jb2RlSGFuZGxlLCAwLCBzaXplb2YoVmlkZW9FbmNPcHRpb25zKSk7CisgICAgICAgIG1FbmNvZGVDb250cm9sID0gbmV3IFZpZGVvRW5jQ29udHJvbHM7CisgICAgICAgIEFTU0VSVF9ORShtRW5jb2RlQ29udHJvbCwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBnZXQgVmlkZW8gRW5jb2RpbmcgY29udHJvbCBvYmplY3QiOworICAgICAgICBtZW1zZXQobUVuY29kZUNvbnRyb2wsIDAsIHNpemVvZihWaWRlb0VuY0NvbnRyb2xzKSk7CisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGluaXRFbmNvZGVyUGFyYW1zKCkpCisgICAgICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBnZXQgdGhlIGRlZmF1bHQgRW5jb2RpbmcgcGFyYW1ldGVycyEiOworICAgIH0KKworICAgIGludDY0X3QgZ2V0VG90YWxGcmFtZXMoKTsKKyAgICB2b2lkIHByb2Nlc3NFbmNvZGVyKGludDMyX3QpOworICAgIGJvb2wgbUlzTXBlZzQ7CisgICAgaW50MzJfdCBtRnJhbWVXaWR0aCwgbUZyYW1lSGVpZ2h0LCBtQml0UmF0ZTsKKyAgICBpbnQ2NF90IG1PdXRwdXRCdWZmZXJTaXplOworICAgIGZsb2F0IG1GcmFtZVJhdGU7CisgICAgc3RyaW5nIG1GaWxlTmFtZTsKKyAgICB1aW50OF90ICptSW5wdXRCdWZmZXIsICptT3V0cHV0QnVmZmVyOworICAgIEZJTEUgKm1GcElucHV0LCAqbUZwT3V0cHV0OworICAgIFZpZGVvRW5jT3B0aW9ucyAqbUVuY29kZUhhbmRsZTsKKyAgICBWaWRlb0VuY0NvbnRyb2xzICptRW5jb2RlQ29udHJvbDsKK307CisKK3ZvaWQgTXBlZzRIMjYzRW5jb2RlclRlc3Q6OmluaXRFbmNvZGVyUGFyYW1zKCkgeworICAgIGJvb2wgc3RhdHVzID0gUFZHZXREZWZhdWx0RW5jT3B0aW9uKG1FbmNvZGVIYW5kbGUsIDApOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cyk7CisKKyAgICBtRW5jb2RlSGFuZGxlLT5yY1R5cGUgPSBWQlJfMTsKKyAgICBtRW5jb2RlSGFuZGxlLT52YnZEZWxheSA9IDUuMGY7CisgICAgbUVuY29kZUhhbmRsZS0+cHJvZmlsZV9sZXZlbCA9IENPUkVfUFJPRklMRV9MRVZFTDI7CisgICAgbUVuY29kZUhhbmRsZS0+cGFja2V0U2l6ZSA9IDMyOworICAgIG1FbmNvZGVIYW5kbGUtPnJ2bGNFbmFibGUgPSBQVl9PRkY7CisgICAgbUVuY29kZUhhbmRsZS0+bnVtTGF5ZXJzID0gMTsKKyAgICBtRW5jb2RlSGFuZGxlLT50aW1lSW5jUmVzID0gMTAwMDsKKyAgICBtRW5jb2RlSGFuZGxlLT5pUXVhbnRbMF0gPSAxNTsKKyAgICBtRW5jb2RlSGFuZGxlLT5wUXVhbnRbMF0gPSAxMjsKKyAgICBtRW5jb2RlSGFuZGxlLT5xdWFudFR5cGVbMF0gPSAwOworICAgIG1FbmNvZGVIYW5kbGUtPm5vRnJhbWVTa2lwcGVkID0gUFZfT0ZGOworICAgIG1FbmNvZGVIYW5kbGUtPm51bUludHJhTUIgPSAwOworICAgIG1FbmNvZGVIYW5kbGUtPnNjZW5lRGV0ZWN0ID0gUFZfT047CisgICAgbUVuY29kZUhhbmRsZS0+c2VhcmNoUmFuZ2UgPSAxNjsKKyAgICBtRW5jb2RlSGFuZGxlLT5tdjh4OEVuYWJsZSA9IFBWX09GRjsKKyAgICBtRW5jb2RlSGFuZGxlLT5nb2JIZWFkZXJJbnRlcnZhbCA9IDA7CisgICAgbUVuY29kZUhhbmRsZS0+dXNlQUNQcmVkID0gUFZfT047CisgICAgbUVuY29kZUhhbmRsZS0+aW50cmFEQ1ZsY1RoID0gMDsKKyAgICBpZighbUlzTXBlZzQpIHsKKyAgICAgICAgbUVuY29kZUhhbmRsZS0+ZW5jTW9kZSA9IEgyNjNfTU9ERTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRW5jb2RlSGFuZGxlLT5lbmNNb2RlID0gQ09NQklORV9NT0RFX1dJVEhfRVJSX1JFUzsKKyAgICB9CisgICAgbUVuY29kZUhhbmRsZS0+ZW5jV2lkdGhbMF0gPSBtRnJhbWVXaWR0aDsKKyAgICBtRW5jb2RlSGFuZGxlLT5lbmNIZWlnaHRbMF0gPSBtRnJhbWVIZWlnaHQ7CisgICAgbUVuY29kZUhhbmRsZS0+ZW5jRnJhbWVSYXRlWzBdID0gbUZyYW1lUmF0ZTsKKyAgICBtRW5jb2RlSGFuZGxlLT5iaXRSYXRlWzBdID0gbUJpdFJhdGUgKiAxMDI0OworICAgIG1FbmNvZGVIYW5kbGUtPnRpY2tQZXJTcmMgPSBtRW5jb2RlSGFuZGxlLT50aW1lSW5jUmVzIC8gbUZyYW1lUmF0ZTsKKyAgICBpZiAoa0lEUkZyYW1lUmVmcmVzaEludGVydmFsSW5TZWMgPT0gMCkgeworICAgICAgICAvLyBBbGwgSSBmcmFtZXMuCisgICAgICAgIG1FbmNvZGVIYW5kbGUtPmludHJhUGVyaW9kID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRW5jb2RlSGFuZGxlLT5pbnRyYVBlcmlvZCA9IChrSURSRnJhbWVSZWZyZXNoSW50ZXJ2YWxJblNlYyAqIG1GcmFtZVJhdGUpOworICAgIH0KK30KKworaW50NjRfdCBNcGVnNEgyNjNFbmNvZGVyVGVzdDo6Z2V0VG90YWxGcmFtZXMoKSB7CisgICAgaW50MzJfdCBmcmFtZVNpemUgPSAobUZyYW1lV2lkdGggKiBtRnJhbWVIZWlnaHQgKiAzKSAvIDI7CisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIHN0YXQobUZpbGVOYW1lLmNfc3RyKCksICZidWYpOworICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgIGludDY0X3QgdG90YWxGcmFtZXMgPSAoaW50NjRfdCkoZmlsZVNpemUvZnJhbWVTaXplKTsKKyAgICByZXR1cm4gdG90YWxGcmFtZXM7Cit9CisKK3ZvaWQgTXBlZzRIMjYzRW5jb2RlclRlc3Q6OnByb2Nlc3NFbmNvZGVyKGludDMyX3QgbnVtRnJhbWVzVG9FbmNvZGUpIHsKKyAgICBib29sIHN0YXR1czsKKyAgICBpbnQ2NF90IG51bUVuY29kZWRGcmFtZXMgPSAwOworICAgIGludDMyX3QgYnl0ZXNSZWFkOworICAgIGludDMyX3QgZnJhbWVTaXplID0gKG1GcmFtZVdpZHRoICogbUZyYW1lSGVpZ2h0ICogMykgLyAyOworICAgIHdoaWxlKG51bUZyYW1lc1RvRW5jb2RlICE9IDApIHsKKyAgICAgICAgYnl0ZXNSZWFkID0gZnJlYWQobUlucHV0QnVmZmVyLCAxLCBmcmFtZVNpemUsIG1GcElucHV0KTsKKyAgICAgICAgLy8gRW5kIG9mIGZpbGUuCisgICAgICAgIGlmIChieXRlc1JlYWQgIT0gZnJhbWVTaXplKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIFZpZGVvRW5jRnJhbWVJTyB2aWRlb0luLCB2aWRlb091dDsKKyAgICAgICAgdmlkZW9Jbi5oZWlnaHQgPSBtRnJhbWVIZWlnaHQ7CisgICAgICAgIHZpZGVvSW4ucGl0Y2ggPSBtRnJhbWVXaWR0aDsKKyAgICAgICAgdmlkZW9Jbi50aW1lc3RhbXAgPSAobnVtRW5jb2RlZEZyYW1lcyAqIDEwMDApIC8gbUZyYW1lUmF0ZTsgIC8vIGluIG1zLgorICAgICAgICB2aWRlb0luLnlDaGFuID0gbUlucHV0QnVmZmVyOworICAgICAgICB2aWRlb0luLnVDaGFuID0gdmlkZW9Jbi55Q2hhbiArIHZpZGVvSW4uaGVpZ2h0ICogdmlkZW9Jbi5waXRjaDsKKyAgICAgICAgdmlkZW9Jbi52Q2hhbiA9IHZpZGVvSW4udUNoYW4gKyAoKHZpZGVvSW4uaGVpZ2h0ICogdmlkZW9Jbi5waXRjaCkgPj4gMik7CisgICAgICAgIHVpbnQzMl90IG1vZFRpbWVNcyA9IDA7CisgICAgICAgIGludDMyX3QgZGF0YUxlbmd0aCA9IG1PdXRwdXRCdWZmZXJTaXplOworICAgICAgICBpbnQzMl90IG5MYXllciA9IDA7CisgICAgICAgIHN0YXR1cyA9IFBWRW5jb2RlVmlkZW9GcmFtZShtRW5jb2RlQ29udHJvbCwgJnZpZGVvSW4sICZ2aWRlb091dCwgJm1vZFRpbWVNcywgbU91dHB1dEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkYXRhTGVuZ3RoLCAmbkxheWVyKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRmFpbGVkIHRvIEVuY29kZTogIiA8PCBtRmlsZU5hbWU7CisKKyAgICAgICAgTVA0SGludFRyYWNrIGhpbnRUcmFjazsKKyAgICAgICAgc3RhdHVzID0gUFZHZXRIaW50VHJhY2sobUVuY29kZUNvbnRyb2wsICZoaW50VHJhY2spOworICAgICAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IGhpbnQgdHJhY2shIjsKKyAgICAgICAgVUNoYXIgKm92ZXJydW5CdWZmZXIgPSBQVkdldE92ZXJydW5CdWZmZXIobUVuY29kZUNvbnRyb2wpOworICAgICAgICBBU1NFUlRfRVEob3ZlcnJ1bkJ1ZmZlciwgbnVsbHB0cikgPDwgIk92ZXJydW4gb2YgYnVmZmVyISI7CisKKyAgICAgICAgaW50NjRfdCBudW1CeXRlcyA9IGZ3cml0ZShtT3V0cHV0QnVmZmVyLCAxLCBkYXRhTGVuZ3RoLCBtRnBPdXRwdXQpOworICAgICAgICBBU1NFUlRfRVEobnVtQnl0ZXMsIGRhdGFMZW5ndGgpIDw8ICJGYWlsZWQgdG8gd3JpdGUgdG8gdGhlIG91dHB1dCBmaWxlISI7CisgICAgICAgIG51bUVuY29kZWRGcmFtZXMrKzsKKyAgICAgICAgbnVtRnJhbWVzVG9FbmNvZGUtLTsKKyAgICB9Cit9CisKK1RFU1RfUChNcGVnNEgyNjNFbmNvZGVyVGVzdCwgRW5jb2RlVGVzdCkgeworICAgIG1JbnB1dEJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKChtRnJhbWVXaWR0aCAqIG1GcmFtZVdpZHRoICogMykgLyAyKTsKKyAgICBBU1NFUlRfTkUobUlucHV0QnVmZmVyLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIHRoZSBpbnB1dCBidWZmZXIhIjsKKworICAgIG1PdXRwdXRCdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhtT3V0cHV0QnVmZmVyU2l6ZSk7CisgICAgQVNTRVJUX05FKG1PdXRwdXRCdWZmZXIsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgdGhlIG91dHB1dCBidWZmZXIhIjsKKworICAgIG1GcElucHV0ID0gZm9wZW4obUZpbGVOYW1lLmNfc3RyKCksICJyYiIpOworICAgIEFTU0VSVF9ORShtRnBJbnB1dCwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBvcGVuIHRoZSBpbnB1dCBmaWxlOiAiIDw8IG1GaWxlTmFtZTsKKworICAgIG1GcE91dHB1dCA9IGZvcGVuKEVOQ09ERURfRklMRSwgIndiIik7CisgICAgQVNTRVJUX05FKG1GcE91dHB1dCwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBvcGVuIHRoZSBvdXRwdXQgZmlsZToiIDw8IEVOQ09ERURfRklMRTsKKworICAgIGJvb2wgc3RhdHVzID0gUFZJbml0VmlkZW9FbmNvZGVyKG1FbmNvZGVDb250cm9sLCBtRW5jb2RlSGFuZGxlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZW5jb2RlciEiOworCisgICAgLy8gR2V0IFZPTCBoZWFkZXIuCisgICAgaW50MzJfdCBzaXplID0gbU91dHB1dEJ1ZmZlclNpemU7CisgICAgc3RhdHVzID0gUFZHZXRWb2xIZWFkZXIobUVuY29kZUNvbnRyb2wsIG1PdXRwdXRCdWZmZXIsICZzaXplLCAwKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBWT0wgaGVhZGVyISI7CisKKyAgICAvLyBXcml0ZSB0aGUgVk9MIGhlYWRlciBvbiB0aGUgZmlyc3QgZnJhbWUuCisgICAgaW50MzJfdCBudW1CeXRlcyA9IGZ3cml0ZShtT3V0cHV0QnVmZmVyLCAxLCBzaXplLCBtRnBPdXRwdXQpOworICAgIEFTU0VSVF9FUShudW1CeXRlcywgc2l6ZSkgPDwgIkZhaWxlZCB0byB3cml0ZSB0aGUgVk9MIGhlYWRlciEiOworCisgICAgaW50NjRfdCB0b3RhbEZyYW1lcyA9IGdldFRvdGFsRnJhbWVzKCk7CisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUocHJvY2Vzc0VuY29kZXIodG90YWxGcmFtZXMpKSA8PCAiRmFpbGVkIHRvIEVuY29kZTogIiA8PCBtRmlsZU5hbWU7CisgICAgc3RhdHVzID0gUFZDbGVhblVwVmlkZW9FbmNvZGVyKG1FbmNvZGVDb250cm9sKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gY2xlYW4gdXAgdGhlIGVuY29kZXIgcmVzb3VyY2VzISI7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgRW5jb2RlVGVzdCwgTXBlZzRIMjYzRW5jb2RlclRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImJiYl8zNTJ4Mjg4XzQyMHBfMzBmcHNfMzJmcmFtZXMueXV2IiwgZmFsc2UsIDM1MiwgMjg4LCAyNSwgMTAyNCksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYmJiXzM1MngyODhfNDIwcF8zMGZwc18zMmZyYW1lcy55dXYiLCB0cnVlLCAzNTIsIDI4OCwgMjUsIDEwMjQpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImJiYl8zNTJ4Mjg4XzQyMHBfMzBmcHNfMzJmcmFtZXMueXV2IiwgZmFsc2UsIDE3NiwgMTQ0LCAyNSwgMTAyNCksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYmJiXzM1MngyODhfNDIwcF8zMGZwc18zMmZyYW1lcy55dXYiLCB0cnVlLCAxNzYsIDE0NCwgMjUsIDEwMjQpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImZvb3RiYWxsX3F2Z2EueXV2IiwgZmFsc2UsIDM1MiwgMjg4LCAyNSwgMTAyNCksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiZm9vdGJhbGxfcXZnYS55dXYiLCB0cnVlLCAzNTIsIDI4OCwgMjUsIDEwMjQpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImZvb3RiYWxsX3F2Z2EueXV2IiwgZmFsc2UsIDE3NiwgMTQ0LCAzMCwgMTAyNCksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiZm9vdGJhbGxfcXZnYS55dXYiLCB0cnVlLCAxNzYsIDE0NCwgMzAsIDEwMjQpKSk7CisKK2ludDMyX3QgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IE1wZWc0SDI2M0VuY29kZXJUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICB1aW50OF90IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HSSgiRW5jb2RlciBUZXN0IFJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L01wZWc0SDI2M0VuY29kZXJUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9NcGVnNEgyNjNFbmNvZGVyVGVzdEVudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VlMzZlMAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9lbmMvdGVzdC9NcGVnNEgyNjNFbmNvZGVyVGVzdEVudmlyb25tZW50LmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19NUEVHNF9IMjYzX0VOQ09ERVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KKyNkZWZpbmUgX19NUEVHNF9IMjYzX0VOQ09ERVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgTXBlZzRIMjYzRW5jb2RlclRlc3RFbnZpcm9ubWVudCA6IHB1YmxpYzo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgTXBlZzRIMjYzRW5jb2RlclRlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvTXBlZzRIMjYzRW5jb2RlclRlc3QvIikge30KKworICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIgKl9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQorCisgIHByaXZhdGU6CisgICAgc3RyaW5nIHJlczsKK307CisKK2ludCBNcGVnNEgyNjNFbmNvZGVyVGVzdEVudmlyb25tZW50Ojppbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0ge3sicGF0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LCB7MCwgMCwgMCwgMH19OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiUDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ1AnOiB7CisgICAgICAgICAgICAgICAgc2V0UmVzKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdGluZCA8IGFyZ2MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBvcHRpb246ICVzXG5cbiIKKyAgICAgICAgICAgICAgICAidXNhZ2U6ICVzIDxndGVzdCBvcHRpb25zPiA8dGVzdCBvcHRpb25zPlxuXG4iCisgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKKyAgICAgICAgICAgICAgICAiLVAsIC0tcGF0aDogUmVzb3VyY2UgZmlsZXMgZGlyZWN0b3J5IGxvY2F0aW9uXG4iLAorICAgICAgICAgICAgICAgIGFyZ3Zbb3B0aW5kID86IDFdLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYgIC8vIF9fTVBFRzRfSDI2M19FTkNPREVSX1RFU1RfRU5WSVJPTk1FTlRfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZW5jL3Rlc3QvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWRlODc4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L1JFQURNRS5tZApAQCAtMCwwICsxLDM4IEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKworIyMjIyBNcGVnNEgyNjNFbmNvZGVyIDoKK1RoZSBNcGVnNEgyNjNFbmNvZGVyIFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBNcGVnNCBhbmQgSDI2MyBlbmNvZGVyIGF2YWlsYWJsZSBpbiBsaWJzdGFnZWZyaWdodC4KK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIE1wZWc0SDI2M0VuY29kZXJUZXN0CitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9NcGVnNEgyNjNFbmNvZGVyVGVzdC9NcGVnNEgyNjNFbmNvZGVyVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L01wZWc0SDI2M0VuY29kZXJUZXN0L01wZWc0SDI2M0VuY29kZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2VuYy90ZXN0L01wZWc0SDI2M0VuY29kZXIuemlwICkgRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgorCitgYGAKK2FkYiBwdXNoIE1wZWc0SDI2M0VuY29kZXIvLiAvZGF0YS9sb2NhbC90bXAvCitgYGAKKwordXNhZ2U6IE1wZWc0SDI2M0VuY29kZXJUZXN0IC1QIFw8cGF0aF90b19mb2xkZXJcPgorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL01wZWc0SDI2M0VuY29kZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorQWx0ZXJuYXRpdmVseSwgdGhlIHRlc3QgY2FuIGFsc28gYmUgcnVuIHVzaW5nIGF0ZXN0IGNvbW1hbmQuCisKK2BgYAorYXRlc3QgTXBlZzRIMjYzRW5jb2RlclRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE3OWQzNwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDYwIEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdDoKKyAqCisgKiBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE9yaWdpbmFsbHkgZGV2ZWxvcGVkIGFuZCBjb250cmlidXRlZCBieSBJdHRpYW0gU3lzdGVtcyBQdnQuIEx0ZCwgQmFuZ2Fsb3JlCisgKi8KKworY2NfZnV6eiB7CisgICAgbmFtZTogIm1wZWc0X2RlY19mdXp6ZXIiLAorICAgIGhvc3Rfc3VwcG9ydGVkOiB0cnVlLAorICAgIHNyY3M6IFsKKyAgICAgICAgIm1wZWc0X2gyNjNfZGVjX2Z1enplci5jcHAiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X200dmgyNjNkZWMiLAorICAgICAgICAibGlibG9nIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLURPU0NMX0lNUE9SVF9SRUY9IiwKKyAgICAgICAgIi1ETVBFRzQiLAorICAgIF0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KKworY2NfZnV6eiB7CisgICAgbmFtZTogImgyNjNfZGVjX2Z1enplciIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAibXBlZzRfaDI2M19kZWNfZnV6emVyLmNwcCIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbTR2aDI2M2RlYyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRE9TQ0xfSU1QT1JUX1JFRj0iLAorICAgIF0sCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGRhcndpbjogeworICAgICAgICAgICAgZW5hYmxlZDogZmFsc2UsCisgICAgICAgIH0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2Z1enplci9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJhNGY2OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNTcgQEAKKyMgRnV6emVyIGZvciBsaWJzdGFnZWZyaWdodF9tNHZoMjYzZGVjIGRlY29kZXIKKworIyMgUGx1Z2luIERlc2lnbiBDb25zaWRlcmF0aW9ucworVGhlIGZ1enplciBwbHVnaW4gZm9yIE1QRUc0L0gyNjMgaXMgZGVzaWduZWQgYmFzZWQgb24gdGhlIHVuZGVyc3RhbmRpbmcgb2YgdGhlCitjb2RlYyBhbmQgdHJpZXMgdG8gYWNoaWV2ZSB0aGUgZm9sbG93aW5nOgorCisjIyMjIyBNYXhpbWl6ZSBjb2RlIGNvdmVyYWdlCitEaWN0IGZpbGVzIChkaWN0aW9uYXJ5IGZpbGVzKSBhcmUgY3JlYXRlZCBmb3IgTVBFRzQgYW5kIEgyNjMgdG8gZW5zdXJlIHRoYXQgdGhlIHJlcXVpcmVkIHN0YXJ0CitieXRlcyBhcmUgcHJlc2VudCBpbiBldmVyeSBpbnB1dCBmaWxlIHRoYXQgZ29lcyB0byB0aGUgZnV6emVyLgorVGhpcyBlbnN1cmVzIHRoYXQgZGVjb2RlciBkb2VzIG5vdCByZWplY3QgYW55IGlucHV0IGZpbGUgaW4gdGhlIGZpcnN0IGNoZWNrCisKKyMjIyMjIE1heGltaXplIHV0aWxpemF0aW9uIG9mIGlucHV0IGRhdGEKK1RoZSBwbHVnaW4gZmVlZHMgdGhlIGVudGlyZSBpbnB1dCBkYXRhIHRvIHRoZSBjb2RlYyB1c2luZyBhIGxvb3AuCisgKiBJZiB0aGUgZGVjb2RlIG9wZXJhdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgdGhlIGlucHV0IGlzIGFkdmFuY2VkIGJ5IHRoZSBudW1iZXIgb2YgYnl0ZXMgY29uc3VtZWQKKyAgIGluIHRoZSBkZWNvZGUgY2FsbC4KKyAqIElmIHRoZSBkZWNvZGUgb3BlcmF0aW9uIHdhcyB1bi1zdWNjZXNzZnVsLCB0aGUgaW5wdXQgaXMgYWR2YW5jZWQgYnkgMSBieXRlIHNvIHRoYXQgdGhlIGZ1enplcgorICAgY2FuIHByb2NlZWQgdG8gZmVlZCB0aGUgbmV4dCBmcmFtZS4KKworVGhpcyBlbnN1cmVzIHRoYXQgdGhlIHBsdWdpbiB0b2xlcmF0ZXMgYW55IGtpbmQgb2YgaW5wdXQgKGVtcHR5LCBodWdlLCBtYWxmb3JtZWQsIGV0YykKK2FuZCBkb2VzbnQgYGV4aXQoKWAgb24gYW55IGlucHV0IGFuZCB0aGVyZWJ5IGluY3JlYXNpbmcgdGhlIGNoYW5jZSBvZiBpZGVudGlmeWluZyB2dWxuZXJhYmlsaXRpZXMuCisKKyMjIyMjIE90aGVyIGNvbnNpZGVyYXRpb25zCisgKiBUd28gZnV6emVyIGJpbmFyaWVzIC0gbXBlZzRfZGVjX2Z1enplciBhbmQgaDI2M19kZWNfZnV6emVyIGFyZSBnZW5lcmF0ZWQgYmFzZWQgb24gdGhlIHByZXNlbmNlCisgICBvZiBhIGZsYWcgLSAnTVBFRzQnCisgKiBUaGUgbnVtYmVyIG9mIGRlY29kZSBjYWxscyBhcmUga2VwdCB0byBhIG1heGltdW0gb2YgMTAwIHNvIHRoYXQgdGhlIGZ1enplciBkb2VzIG5vdCB0aW1lb3V0LgorCisjIyBCdWlsZAorCitUaGlzIGRlc2NyaWJlcyBzdGVwcyB0byBidWlsZCBtcGVnNF9kZWNfZnV6emVyIGFuZCBoMjYzX2RlY19mdXp6ZXIgYmluYXJ5LgorCisjIyMgQW5kcm9pZAorIyMjIyBTdGVwcyB0byBidWlsZAorQnVpbGQgdGhlIGZ1enplcgorYGBgCisgICQgbW0gLWokKG5wcm9jKSBtcGVnNF9kZWNfZnV6emVyCisgICQgbW0gLWokKG5wcm9jKSBoMjYzX2RlY19mdXp6ZXIKK2BgYAorCisjIyMjIFN0ZXBzIHRvIHJ1bgorQ3JlYXRlIGEgZGlyZWN0b3J5IENPUlBVU19ESVIgYW5kIGNvcHkgc29tZSBNUEVHNCBvciBIMjYzIGZpbGVzIHRvIHRoYXQgZm9sZGVyCitQdXNoIHRoaXMgZGlyZWN0b3J5IHRvIGRldmljZS4KKworVG8gcnVuIG9uIGRldmljZQorYGBgCisgICQgYWRiIHN5bmMgZGF0YQorICAkIGFkYiBzaGVsbCAvZGF0YS9mdXp6L2FybTY0L21wZWc0X2RlY19mdXp6ZXIvbXBlZzRfZGVjX2Z1enplciBDT1JQVVNfRElSCisgICQgYWRiIHNoZWxsIC9kYXRhL2Z1enovYXJtNjQvaDI2M19kZWNfZnV6emVyL2gyNjNfZGVjX2Z1enplciBDT1JQVVNfRElSCitgYGAKK1RvIHJ1biBvbiBob3N0CitgYGAKKyAgJCAkQU5EUk9JRF9IT1NUX09VVC9mdXp6L3g4Nl82NC9tcGVnNF9kZWNfZnV6emVyL21wZWc0X2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorICAkICRBTkRST0lEX0hPU1RfT1VUL2Z1enoveDg2XzY0L2gyNjNfZGVjX2Z1enplci9oMjYzX2RlY19mdXp6ZXIgQ09SUFVTX0RJUgorYGBgCisKKyMjIFJlZmVyZW5jZXM6CisgKiBodHRwOi8vbGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbAorICogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9vc3MtZnV6egpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2Z1enplci9oMjYzX2RlY19mdXp6ZXIuZGljdCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvaDI2M19kZWNfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxZDM3ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvaDI2M19kZWNfZnV6emVyLmRpY3QKQEAgLTAsMCArMSwyIEBACisjIFN0YXJ0IGNvZGUgKGJ5dGVzIDAtMykKK2t3MT0iXHgwMFx4MDBceDgwXHgwMiIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfZGVjX2Z1enplci5kaWN0IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL200dl9oMjYzL2Z1enplci9tcGVnNF9kZWNfZnV6emVyLmRpY3QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyNDFhNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfZGVjX2Z1enplci5kaWN0CkBAIC0wLDAgKzEsMiBAQAorIyBTdGFydCBjb2RlIChieXRlcyAwLTMpCitrdzE9Ilx4MDBceDAwXHgwMVx4QjAiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL21wZWc0X2gyNjNfZGVjX2Z1enplci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbTR2X2gyNjMvZnV6emVyL21wZWc0X2gyNjNfZGVjX2Z1enplci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTEyYzgyMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tNHZfaDI2My9mdXp6ZXIvbXBlZzRfaDI2M19kZWNfZnV6emVyLmNwcApAQCAtMCwwICsxLDIwNSBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQ6CisgKgorICogaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBPcmlnaW5hbGx5IGRldmVsb3BlZCBhbmQgY29udHJpYnV0ZWQgYnkgSXR0aWFtIFN5c3RlbXMgUHZ0LiBMdGQsIEJhbmdhbG9yZQorICovCisjaW5jbHVkZSAibXA0ZGVjX2FwaS5oIgorI2RlZmluZSBNUEVHNF9NQVhfV0lEVEggMTkyMAorI2RlZmluZSBNUEVHNF9NQVhfSEVJR0hUIDEwODAKKyNkZWZpbmUgSDI2M19NQVhfV0lEVEggMzUyCisjZGVmaW5lIEgyNjNfTUFYX0hFSUdIVCAyODgKKyNkZWZpbmUgREVGQVVMVF9XSURUSCAzNTIKKyNkZWZpbmUgREVGQVVMVF9IRUlHSFQgMjg4CisKK2NvbnN0ZXhwciBzaXplX3Qga01heE51bURlY29kZUNhbGxzID0gMTAwOworY29uc3RleHByIHVpbnQ4X3Qga051bU91dHB1dEJ1ZmZlcnMgPSAyOworY29uc3RleHByIGludCBrTGF5ZXIgPSAxOworCitzdHJ1Y3QgdGFndmlkZW9EZWNDb250cm9sczsKKworLyogPT0gY2VpbChudW0gLyBkZW4pICogZGVuLiBUIG11c3QgYmUgaW50ZWdlciB0eXBlLCBhbGlnbm1lbnQgbXVzdCBiZSBwb3NpdGl2ZSBwb3dlciBvZiAyICovCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KK2lubGluZSBzdGF0aWMgY29uc3QgVCBhbGlnbihjb25zdCBUICZudW0sIGNvbnN0IFUgJmRlbikgeworICByZXR1cm4gKG51bSArIChUKShkZW4gLSAxKSkgJiAoVCkgfihkZW4gLSAxKTsKK30KKworY2xhc3MgQ29kZWMgeworIHB1YmxpYzoKKyAgQ29kZWMoKSA9IGRlZmF1bHQ7CisgIH5Db2RlYygpIHsgZGVJbml0RGVjb2RlcigpOyB9CisgIGJvb2wgaW5pdERlY29kZXIoKTsKKyAgYm9vbCBhbGxvY091dHB1dEJ1ZmZlcihzaXplX3Qgb3V0cHV0QnVmZmVyU2l6ZSk7CisgIHZvaWQgZnJlZU91dHB1dEJ1ZmZlcigpOworICB2b2lkIGhhbmRsZVJlc29sdXRpb25DaGFuZ2UoKTsKKyAgdm9pZCBkZWNvZGVGcmFtZXMoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworICB2b2lkIGRlSW5pdERlY29kZXIoKTsKKworIHByaXZhdGU6CisgIHRhZ3ZpZGVvRGVjQ29udHJvbHMgKm1EZWNIYW5kbGUgPSBudWxscHRyOworICB1aW50OF90ICptT3V0cHV0QnVmZmVyW2tOdW1PdXRwdXRCdWZmZXJzXTsKKyAgYm9vbCBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgYm9vbCBtRnJhbWVzQ29uZmlndXJlZCA9IGZhbHNlOworI2lmZGVmIE1QRUc0CisgIE1QNERlY29kaW5nTW9kZSBtSW5wdXRNb2RlID0gTVBFRzRfTU9ERTsKKyAgc2l6ZV90IG1NYXhXaWR0aCA9IE1QRUc0X01BWF9XSURUSDsKKyAgc2l6ZV90IG1NYXhIZWlnaHQgPSBNUEVHNF9NQVhfSEVJR0hUOworI2Vsc2UKKyAgTVA0RGVjb2RpbmdNb2RlIG1JbnB1dE1vZGUgPSBIMjYzX01PREU7CisgIHNpemVfdCBtTWF4V2lkdGggPSBIMjYzX01BWF9XSURUSDsKKyAgc2l6ZV90IG1NYXhIZWlnaHQgPSBIMjYzX01BWF9IRUlHSFQ7CisjZW5kaWYKKyAgdWludDMyX3QgbU51bVNhbXBsZXNPdXRwdXQgPSAwOworICB1aW50MzJfdCBtV2lkdGggPSBERUZBVUxUX1dJRFRIOworICB1aW50MzJfdCBtSGVpZ2h0ID0gREVGQVVMVF9IRUlHSFQ7Cit9OworCitib29sIENvZGVjOjppbml0RGVjb2RlcigpIHsKKyAgbURlY0hhbmRsZSA9IG5ldyB0YWd2aWRlb0RlY0NvbnRyb2xzOworICBpZiAoIW1EZWNIYW5kbGUpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbWVtc2V0KG1EZWNIYW5kbGUsIDAsIHNpemVvZih0YWd2aWRlb0RlY0NvbnRyb2xzKSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENvZGVjOjphbGxvY091dHB1dEJ1ZmZlcihzaXplX3Qgb3V0cHV0QnVmZmVyU2l6ZSkgeworICBmb3IgKHVpbnQ4X3QgaSA9IDA7IGkgPCBrTnVtT3V0cHV0QnVmZmVyczsgKytpKSB7CisgICAgaWYgKCFtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICBtT3V0cHV0QnVmZmVyW2ldID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPihtYWxsb2Mob3V0cHV0QnVmZmVyU2l6ZSkpOworICAgICAgaWYgKCFtT3V0cHV0QnVmZmVyW2ldKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgQ29kZWM6OmZyZWVPdXRwdXRCdWZmZXIoKSB7CisgIGZvciAodWludDhfdCBpID0gMDsgaSA8IGtOdW1PdXRwdXRCdWZmZXJzOyArK2kpIHsKKyAgICBpZiAobU91dHB1dEJ1ZmZlcltpXSkgeworICAgICAgZnJlZShtT3V0cHV0QnVmZmVyW2ldKTsKKyAgICAgIG1PdXRwdXRCdWZmZXJbaV0gPSBudWxscHRyOworICAgIH0KKyAgfQorfQorCit2b2lkIENvZGVjOjpoYW5kbGVSZXNvbHV0aW9uQ2hhbmdlKCkgeworICBpbnQzMl90IGRpc3BXaWR0aCwgZGlzcEhlaWdodDsKKyAgUFZHZXRWaWRlb0RpbWVuc2lvbnMobURlY0hhbmRsZSwgJmRpc3BXaWR0aCwgJmRpc3BIZWlnaHQpOworCisgIGludDMyX3QgYnVmV2lkdGgsIGJ1ZkhlaWdodDsKKyAgUFZHZXRCdWZmZXJEaW1lbnNpb25zKG1EZWNIYW5kbGUsICZidWZXaWR0aCwgJmJ1ZkhlaWdodCk7CisKKyAgaWYgKGRpc3BXaWR0aCAhPSBtV2lkdGggfHwgZGlzcEhlaWdodCAhPSBtSGVpZ2h0KSB7CisgICAgbVdpZHRoID0gZGlzcFdpZHRoOworICAgIG1IZWlnaHQgPSBkaXNwSGVpZ2h0OworICB9Cit9CisKK3ZvaWQgQ29kZWM6OmRlY29kZUZyYW1lcyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSkgeworICBzaXplX3Qgb3V0cHV0QnVmZmVyU2l6ZSA9IGFsaWduKG1NYXhXaWR0aCwgMTYpICogYWxpZ24obU1heEhlaWdodCwgMTYpICogMyAvIDI7CisgIHVpbnQ4X3QgKnN0YXJ0X2NvZGUgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oZGF0YSk7CisgIHN0YXRpYyBjb25zdCB1aW50OF90IHZvbEluZm9bXSA9IHsweDAwLCAweDAwLCAweDAxLCAweEIwfTsKKyAgYm9vbCB2b2xIZWFkZXIgPSBtZW1jbXAoc3RhcnRfY29kZSwgdm9sSW5mbywgNCkgPT0gMDsKKyAgaWYgKHZvbEhlYWRlcikgeworICAgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgfQorCisgIGlmICghbUluaXRpYWxpemVkKSB7CisgICAgdWludDhfdCAqdm9sRGF0YVsxXXt9OworICAgIGludDMyX3Qgdm9sU2l6ZSA9IDA7CisKKyAgICBpZiAodm9sSGVhZGVyKSB7IC8qIHJlbW92ZWQgc29tZSBjb2RlYyBjb25maWcgcGFydCAqLworICAgICAgdm9sRGF0YVswXSA9IGNvbnN0X2Nhc3Q8dWludDhfdCAqPihkYXRhKTsKKyAgICAgIHZvbFNpemUgPSBzaXplOworICAgIH0KKworICAgIGlmICghUFZJbml0VmlkZW9EZWNvZGVyKG1EZWNIYW5kbGUsIHZvbERhdGEsICZ2b2xTaXplLCBrTGF5ZXIsIG1NYXhXaWR0aCwgbU1heEhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRNb2RlKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIE1QNERlY29kaW5nTW9kZSBhY3R1YWxNb2RlID0gUFZHZXREZWNCaXRzdHJlYW1Nb2RlKG1EZWNIYW5kbGUpOworICAgIGlmIChtSW5wdXRNb2RlICE9IGFjdHVhbE1vZGUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBQVlNldFBvc3RQcm9jVHlwZShtRGVjSGFuZGxlLCAwKTsKKyAgfQorICBzaXplX3QgeUZyYW1lU2l6ZSA9IHNpemVvZih1aW50OCkgKiBtRGVjSGFuZGxlLT5zaXplOworICBpZiAob3V0cHV0QnVmZmVyU2l6ZSA8IHlGcmFtZVNpemUgKiAzIC8gMikgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoIWFsbG9jT3V0cHV0QnVmZmVyKG91dHB1dEJ1ZmZlclNpemUpKSB7CisgICAgcmV0dXJuOworICB9CisgIHNpemVfdCBudW1EZWNvZGVDYWxscyA9IDA7CisgIHdoaWxlICgoc2l6ZSA+IDApICYmIChudW1EZWNvZGVDYWxscyA8IGtNYXhOdW1EZWNvZGVDYWxscykpIHsKKyAgICBpZiAoIW1GcmFtZXNDb25maWd1cmVkKSB7CisgICAgICBQVlNldFJlZmVyZW5jZVlVVihtRGVjSGFuZGxlLCBtT3V0cHV0QnVmZmVyWzFdKTsKKyAgICAgIG1GcmFtZXNDb25maWd1cmVkID0gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyBOZWVkIHRvIGNoZWNrIGlmIGhlYWRlciBjb250YWlucyBuZXcgaW5mbywgZS5nLiwgd2lkdGgvaGVpZ2h0LCBldGMuCisgICAgVm9wSGVhZGVySW5mbyBoZWFkZXJfaW5mbzsKKyAgICB1aW50MzJfdCB1c2VFeHRUaW1lc3RhbXAgPSAobnVtRGVjb2RlQ2FsbHMgPT0gMCk7CisgICAgaW50MzJfdCB0ZW1wU2l6ZSA9IChpbnQzMl90KXNpemU7CisgICAgdWludDhfdCAqYml0c3RyZWFtVG1wID0gY29uc3RfY2FzdDx1aW50OF90ICo+KGRhdGEpOworICAgIHVpbnQzMl90IHRpbWVzdGFtcCA9IDA7CisgICAgaWYgKFBWRGVjb2RlVm9wSGVhZGVyKG1EZWNIYW5kbGUsICZiaXRzdHJlYW1UbXAsICZ0aW1lc3RhbXAsICZ0ZW1wU2l6ZSwgJmhlYWRlcl9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmdXNlRXh0VGltZXN0YW1wLCBtT3V0cHV0QnVmZmVyW21OdW1TYW1wbGVzT3V0cHV0ICYgMV0pICE9IFBWX1RSVUUpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBoYW5kbGVSZXNvbHV0aW9uQ2hhbmdlKCk7CisKKyAgICBQVkRlY29kZVZvcEJvZHkobURlY0hhbmRsZSwgJnRlbXBTaXplKTsKKyAgICB1aW50MzJfdCBieXRlc0NvbnN1bWVkID0gMTsKKyAgICBpZiAoc2l6ZSA+IHRlbXBTaXplKSB7CisgICAgICBieXRlc0NvbnN1bWVkID0gc2l6ZSAtIHRlbXBTaXplOworICAgIH0KKyAgICBkYXRhICs9IGJ5dGVzQ29uc3VtZWQ7CisgICAgc2l6ZSAtPSBieXRlc0NvbnN1bWVkOworICAgICsrbU51bVNhbXBsZXNPdXRwdXQ7CisgICAgKytudW1EZWNvZGVDYWxsczsKKyAgfQorICBmcmVlT3V0cHV0QnVmZmVyKCk7Cit9CisKK3ZvaWQgQ29kZWM6OmRlSW5pdERlY29kZXIoKSB7CisgIFBWQ2xlYW5VcFZpZGVvRGVjb2RlcihtRGVjSGFuZGxlKTsKKyAgZGVsZXRlIG1EZWNIYW5kbGU7CisgIG1EZWNIYW5kbGUgPSBudWxscHRyOworICBtSW5pdGlhbGl6ZWQgPSBmYWxzZTsKKyAgZnJlZU91dHB1dEJ1ZmZlcigpOworfQorCitleHRlcm4gIkMiIGludCBMTFZNRnV6emVyVGVzdE9uZUlucHV0KGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplKSB7CisgIGlmIChzaXplIDwgNCkgeworICAgIHJldHVybiAwOworICB9CisgIENvZGVjICpjb2RlYyA9IG5ldyBDb2RlYygpOworICBpZiAoIWNvZGVjKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKyAgaWYgKGNvZGVjLT5pbml0RGVjb2RlcigpKSB7CisgICAgY29kZWMtPmRlY29kZUZyYW1lcyhkYXRhLCBzaXplKTsKKyAgfQorICBkZWxldGUgY29kZWM7CisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9BbmRyb2lkLmJwCmluZGV4IDIxNTRmODQuLmI2MzA1MjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL0FuZHJvaWQuYnAKQEAgLTc4LDI0ICs3OCwxNSBAQAogCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfbXAzZGVjIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiU29mdE1QMy5jcHAiXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKICAgICBsb2NhbF9pbmNsdWRlX2RpcnM6IFsKICAgICAgICAgInNyYyIsCiAgICAgICAgICJpbmNsdWRlIiwKICAgICBdLAogCi0gICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKLQogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCiAgICAgc2FuaXRpemU6IHsKQEAgLTEwNSwxNSArOTYsNyBAQAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKIAotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0KICAgICBzdGF0aWNfbGliczogWyJsaWJzdGFnZWZyaWdodF9tcDNkZWMiXSwKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQogCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL1NvZnRNUDMuY3BwCmluZGV4IGU3ZDMwNWQuLjgwMDgzZjcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvU29mdE1QMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9Tb2Z0TVAzLmNwcApAQCAtMTE0LDcgKzExNCw3IEBACiAgICAgbUNvbmZpZy0+Y3JjRW5hYmxlZCA9IGZhbHNlOwogCiAgICAgdWludDMyX3QgbWVtUmVxdWlyZW1lbnRzID0gcHZtcDNfZGVjb2Rlck1lbVJlcXVpcmVtZW50cygpOwotICAgIG1EZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcXVpcmVtZW50cyk7CisgICAgbURlY29kZXJCdWYgPSBjYWxsb2MoMSwgbWVtUmVxdWlyZW1lbnRzKTsKIAogICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIG1EZWNvZGVyQnVmKTsKICAgICBtSXNGaXJzdCA9IHRydWU7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX2NfZXF1aXZhbGVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZfbXAzZGVjX2Z4ZF9vcF9jX2VxdWl2YWxlbnQuaAppbmRleCBhZGIwZGQ0Li5mOWQ5MWIxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdl9tcDNkZWNfZnhkX29wX2NfZXF1aXZhbGVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2X21wM2RlY19meGRfb3BfY19lcXVpdmFsZW50LmgKQEAgLTQ0LDcgKzQ0LDcgQEAKICNlbmRpZgogCiAjaW5jbHVkZSAicHZtcDNfYXVkaW9fdHlwZV9kZWZzLmgiCi0jZGVmaW5lIFFmbXRfMzEoYSkgICAoSW50MzIpKChmbG9hdCkoYSkqMHg3RkZGRkZGRikKKyNkZWZpbmUgUWZtdF8zMShhKSAgIChJbnQzMikoKGZsb2F0KShhKSooZmxvYXQpMHg3RkZGRkZGRikKIAogI2RlZmluZSBRZm10MTUoeCkgICAoSW50MTYpKCh4KSooKEludDMyKTE8PDE1KSArICgoeCk+PTA/MC41RjotMC41RikpCiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2FsaWFzX3JlZHVjdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19hbGlhc19yZWR1Y3Rpb24uY3BwCmluZGV4IGFmNzM4YmEuLmE0Zjc5OGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2FsaWFzX3JlZHVjdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfYWxpYXNfcmVkdWN0aW9uLmNwcApAQCAtMTY5LDcgKzE2OSw3IEBACiAKICAgICBpbnQzMiBpLCBqOwogCi0gICAgKnVzZWRfZnJlcV9saW5lcyA9IGZ4cF9tdWwzMl9RMzIoKnVzZWRfZnJlcV9saW5lcyA8PCAxNiwgKGludDMyKSgweDdGRkZGRkZGIC8gKGZsb2F0KTE4IC0gMS4wZikpID4+IDE1OworICAgICp1c2VkX2ZyZXFfbGluZXMgPSBmeHBfbXVsMzJfUTMyKCp1c2VkX2ZyZXFfbGluZXMgPDwgMTYsIChpbnQzMikoKGZsb2F0KTB4N0ZGRkZGRkYgLyAxOC4wZiAtIDEuMGYpKSA+PiAxNTsKIAogCiAgICAgaWYgKGdyX2luZm8tPndpbmRvd19zd2l0Y2hpbmdfZmxhZyAmJiAgZ3JfaW5mby0+YmxvY2tfdHlwZSA9PSAyKQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGN0XzkuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy9zcmMvcHZtcDNfZGN0XzkuY3BwCmluZGV4IGJiYjI0N2QuLjljZDBlOTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvc3JjL3B2bXAzX2RjdF85LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3NyYy9wdm1wM19kY3RfOS5jcHAKQEAgLTc3LDcgKzc3LDcgQEAKIDsgSW5jbHVkZSBhbGwgcHJlLXByb2Nlc3NvciBzdGF0ZW1lbnRzIGhlcmUuIEluY2x1ZGUgY29uZGl0aW9uYWwKIDsgY29tcGlsZSB2YXJpYWJsZXMgYWxzby4KIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotI2RlZmluZSBRZm10MzEoYSkgICAoaW50MzIpKChhKSooMHg3RkZGRkZGRikpCisjZGVmaW5lIFFmbXQzMShhKSAgIChpbnQzMikoKGEpKigoZmxvYXQpMHg3RkZGRkZGRikpCiAKICNkZWZpbmUgY29zX3BpXzkgICAgUWZtdDMxKCAwLjkzOTY5MjYyMDc4NTkxZikKICNkZWZpbmUgY29zXzJwaV85ICAgUWZtdDMxKCAwLjc2NjA0NDQ0MzExODk4ZikKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZmOGIxMgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiTXAzRGVjb2RlclRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAibXAzcmVhZGVyLmNwcCIsCisgICAgICAgICJNcDNEZWNvZGVyVGVzdC5jcHAiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfbXAzZGVjIiwKKyAgICAgICAgImxpYnNuZGZpbGUiLAorICAgICAgICAibGliYXVkaW91dGlscyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCisKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBjZmk6IHRydWUsCisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgIH0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmY5NzMyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApAQCAtMCwwICsxLDMxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNvbmZpZ3VyYXRpb24gZGVzY3JpcHRpb249IlRlc3QgbW9kdWxlIGNvbmZpZyBmb3IgTXAzIERlY29kZXIgdW5pdCB0ZXN0Ij4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iTXAzRGVjb2RlclRlc3QiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iTXAzRGVjb2RlclRlc3QtPi9kYXRhL2xvY2FsL3RtcC9NcDNEZWNvZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXAzZGVjL3Rlc3QvTXAzRGVjb2RlclRlc3QuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL01wM0RlY29kZXJUZXN0UmVzLyIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iTXAzRGVjb2RlclRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9NcDNEZWNvZGVyVGVzdFJlcy8iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9NcDNEZWNvZGVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk1NTNlYwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcDNkZWMvdGVzdC9NcDNEZWNvZGVyVGVzdC5jcHAKQEAgLTAsMCArMSwyMDAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1wM0RlY29kZXJUZXN0IgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9zbmRmaWxlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIm1wM3JlYWRlci5oIgorI2luY2x1ZGUgInB2bXAzZGVjb2Rlcl9hcGkuaCIKKworI2luY2x1ZGUgIk1wM0RlY29kZXJUZXN0RW52aXJvbm1lbnQuaCIKKworI2RlZmluZSBPVVRQVVRfRklMRSAiL2RhdGEvbG9jYWwvdG1wL21wM0RlY29kZS5vdXQiCisKK2NvbnN0ZXhwciBpbnQzMl90IGtJbnB1dEJ1ZmZlclNpemUgPSAxMDI0ICogMTA7Citjb25zdGV4cHIgaW50MzJfdCBrT3V0cHV0QnVmZmVyU2l6ZSA9IDQ2MDggKiAyOworY29uc3RleHByIGludDMyX3Qga01heENvdW50ID0gMTA7Citjb25zdGV4cHIgaW50MzJfdCBrTnVtRnJhbWVSZXNldCA9IDE1MDsKKworc3RhdGljIE1wM0RlY29kZXJUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCitjbGFzcyBNcDNEZWNvZGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08c3RyaW5nPiB7CisgIHB1YmxpYzoKKyAgICBNcDNEZWNvZGVyVGVzdCgpIDogbUNvbmZpZyhudWxscHRyKSB7fQorCisgICAgfk1wM0RlY29kZXJUZXN0KCkgeworICAgICAgICBpZiAobUNvbmZpZykgeworICAgICAgICAgICAgZGVsZXRlIG1Db25maWc7CisgICAgICAgICAgICBtQ29uZmlnID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNvbmZpZyA9IG5ldyB0UFZNUDNEZWNvZGVyRXh0ZXJuYWx7fTsKKyAgICAgICAgQVNTRVJUX05FKG1Db25maWcsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjb25maWcuIE5vIE1lbW9yeSBhdmFpbGFibGUiOworICAgICAgICBtQ29uZmlnLT5lcXVhbGl6ZXJUeXBlID0gZmxhdDsKKyAgICAgICAgbUNvbmZpZy0+Y3JjRW5hYmxlZCA9IGZhbHNlOworICAgIH0KKworICAgIHRQVk1QM0RlY29kZXJFeHRlcm5hbCAqbUNvbmZpZzsKKyAgICBNcDNSZWFkZXIgbU1wM1JlYWRlcjsKKworICAgIEVSUk9SX0NPREUgRGVjb2RlRnJhbWVzKHZvaWQgKmRlY29kZXJidWYsIFNOREZJTEUgKm91dEZpbGVIYW5kbGUsIFNGX0lORk8gc2ZJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgZnJhbWVDb3VudCA9IElOVDMyX01BWCk7CisgICAgU05ERklMRSAqb3Blbk91dHB1dEZpbGUoU0ZfSU5GTyAqc2ZJbmZvKTsKK307CisKK0VSUk9SX0NPREUgTXAzRGVjb2RlclRlc3Q6OkRlY29kZUZyYW1lcyh2b2lkICpkZWNvZGVyQnVmLCBTTkRGSUxFICpvdXRGaWxlSGFuZGxlLCBTRl9JTkZPIHNmSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGZyYW1lQ291bnQpIHsKKyAgICB1aW50OF90IGlucHV0QnVmW2tJbnB1dEJ1ZmZlclNpemVdOworICAgIGludDE2X3Qgb3V0cHV0QnVmW2tPdXRwdXRCdWZmZXJTaXplXTsKKyAgICB1aW50MzJfdCBieXRlc1JlYWQ7CisgICAgRVJST1JfQ09ERSBkZWNvZGVyRXJyOworICAgIHdoaWxlIChmcmFtZUNvdW50ID4gMCkgeworICAgICAgICBib29sIHN1Y2Nlc3MgPSBtTXAzUmVhZGVyLmdldEZyYW1lKGlucHV0QnVmLCAmYnl0ZXNSZWFkKTsKKyAgICAgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBtQ29uZmlnLT5pbnB1dEJ1ZmZlckN1cnJlbnRMZW5ndGggPSBieXRlc1JlYWQ7CisgICAgICAgIG1Db25maWctPmlucHV0QnVmZmVyTWF4TGVuZ3RoID0gMDsKKyAgICAgICAgbUNvbmZpZy0+aW5wdXRCdWZmZXJVc2VkTGVuZ3RoID0gMDsKKyAgICAgICAgbUNvbmZpZy0+cElucHV0QnVmZmVyID0gaW5wdXRCdWY7CisgICAgICAgIG1Db25maWctPnBPdXRwdXRCdWZmZXIgPSBvdXRwdXRCdWY7CisgICAgICAgIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSA9IGtPdXRwdXRCdWZmZXJTaXplIC8gc2l6ZW9mKGludDE2X3QpOworICAgICAgICBkZWNvZGVyRXJyID0gcHZtcDNfZnJhbWVkZWNvZGVyKG1Db25maWcsIGRlY29kZXJCdWYpOworICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBOT19ERUNPRElOR19FUlJPUikgYnJlYWs7CisgICAgICAgIHNmX3dyaXRlZl9zaG9ydChvdXRGaWxlSGFuZGxlLCBvdXRwdXRCdWYsIG1Db25maWctPm91dHB1dEZyYW1lU2l6ZSAvIHNmSW5mby5jaGFubmVscyk7CisgICAgICAgIGZyYW1lQ291bnQtLTsKKyAgICB9CisgICAgcmV0dXJuIGRlY29kZXJFcnI7Cit9CisKK1NOREZJTEUgKk1wM0RlY29kZXJUZXN0OjpvcGVuT3V0cHV0RmlsZShTRl9JTkZPICpzZkluZm8pIHsKKyAgICBtZW1zZXQoc2ZJbmZvLCAwLCBzaXplb2YoU0ZfSU5GTykpOworICAgIHNmSW5mby0+Y2hhbm5lbHMgPSBtTXAzUmVhZGVyLmdldE51bUNoYW5uZWxzKCk7CisgICAgc2ZJbmZvLT5mb3JtYXQgPSBTRl9GT1JNQVRfV0FWIHwgU0ZfRk9STUFUX1BDTV8xNjsKKyAgICBzZkluZm8tPnNhbXBsZXJhdGUgPSBtTXAzUmVhZGVyLmdldFNhbXBsZVJhdGUoKTsKKyAgICBTTkRGSUxFICpvdXRGaWxlSGFuZGxlID0gc2Zfb3BlbihPVVRQVVRfRklMRSwgU0ZNX1dSSVRFLCBzZkluZm8pOworICAgIHJldHVybiBvdXRGaWxlSGFuZGxlOworfQorCitURVNUX0YoTXAzRGVjb2RlclRlc3QsIE11bHRpQ3JlYXRlTXAzRGVjb2RlclRlc3QpIHsKKyAgICBzaXplX3QgbWVtUmVxdWlyZW1lbnRzID0gcHZtcDNfZGVjb2Rlck1lbVJlcXVpcmVtZW50cygpOworICAgIEFTU0VSVF9ORShtZW1SZXF1aXJlbWVudHMsIDApIDw8ICJGYWlsZWQgdG8gZ2V0IHRoZSBtZW1vcnkgcmVxdWlyZW1lbnQgc2l6ZSI7CisgICAgdm9pZCAqZGVjb2RlckJ1ZiA9IG1hbGxvYyhtZW1SZXF1aXJlbWVudHMpOworICAgIEFTU0VSVF9ORShkZWNvZGVyQnVmLCBudWxscHRyKQorICAgICAgICAgICAgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBkZWNvZGVyIG1lbW9yeSBvZiBzaXplICIgPDwgbWVtUmVxdWlyZW1lbnRzOworICAgIGZvciAoaW50IGNvdW50ID0gMDsgY291bnQgPCBrTWF4Q291bnQ7IGNvdW50KyspIHsKKyAgICAgICAgcHZtcDNfSW5pdERlY29kZXIobUNvbmZpZywgZGVjb2RlckJ1Zik7CisgICAgICAgIEFMT0dWKCJEZWNvZGVyIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Iik7CisgICAgfQorICAgIGlmIChkZWNvZGVyQnVmKSB7CisgICAgICAgIGZyZWUoZGVjb2RlckJ1Zik7CisgICAgICAgIGRlY29kZXJCdWYgPSBudWxscHRyOworICAgIH0KK30KKworVEVTVF9QKE1wM0RlY29kZXJUZXN0LCBEZWNvZGVUZXN0KSB7CisgICAgc2l6ZV90IG1lbVJlcXVpcmVtZW50cyA9IHB2bXAzX2RlY29kZXJNZW1SZXF1aXJlbWVudHMoKTsKKyAgICBBU1NFUlRfTkUobWVtUmVxdWlyZW1lbnRzLCAwKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgbWVtb3J5IHJlcXVpcmVtZW50IHNpemUiOworICAgIHZvaWQgKmRlY29kZXJCdWYgPSBtYWxsb2MobWVtUmVxdWlyZW1lbnRzKTsKKyAgICBBU1NFUlRfTkUoZGVjb2RlckJ1ZiwgbnVsbHB0cikKKyAgICAgICAgICAgIDw8ICJGYWlsZWQgdG8gYWxsb2NhdGUgZGVjb2RlciBtZW1vcnkgb2Ygc2l6ZSAiIDw8IG1lbVJlcXVpcmVtZW50czsKKworICAgIHB2bXAzX0luaXREZWNvZGVyKG1Db25maWcsIGRlY29kZXJCdWYpOworICAgIEFMT0dWKCJEZWNvZGVyIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5Iik7CisgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKTsKKyAgICBib29sIHN0YXR1cyA9IG1NcDNSZWFkZXIuaW5pdChpbnB1dEZpbGUuY19zdHIoKSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiVW5hYmxlIHRvIGluaXRpYWxpemUgdGhlIG1wM1JlYWRlciI7CisKKyAgICAvLyBPcGVuIHRoZSBvdXRwdXQgZmlsZS4KKyAgICBTRl9JTkZPIHNmSW5mbzsKKyAgICBTTkRGSUxFICpvdXRGaWxlSGFuZGxlID0gb3Blbk91dHB1dEZpbGUoJnNmSW5mbyk7CisgICAgQVNTRVJUX05FKG91dEZpbGVIYW5kbGUsIG51bGxwdHIpIDw8ICJFcnJvciBvcGVuaW5nIG91dHB1dCBmaWxlIGZvciB3cml0aW5nIGRlY29kZWQgb3V0cHV0IjsKKworICAgIEVSUk9SX0NPREUgZGVjb2RlckVyciA9IERlY29kZUZyYW1lcyhkZWNvZGVyQnVmLCBvdXRGaWxlSGFuZGxlLCBzZkluZm8pOworICAgIEFTU0VSVF9FUShkZWNvZGVyRXJyLCBOT19ERUNPRElOR19FUlJPUikgPDwgIkZhaWxlZCB0byBkZWNvZGUgdGhlIGZyYW1lcyI7CisgICAgQVNTRVJUX0VRKHNmSW5mby5jaGFubmVscywgbUNvbmZpZy0+bnVtX2NoYW5uZWxzKSA8PCAiTnVtYmVyIG9mIGNoYW5uZWxzIGRvZXMgbm90IG1hdGNoIjsKKyAgICBBU1NFUlRfRVEoc2ZJbmZvLnNhbXBsZXJhdGUsIG1Db25maWctPnNhbXBsaW5nUmF0ZSkgPDwgIlNhbXBsZSByYXRlIGRvZXMgbm90IG1hdGNoIjsKKworICAgIG1NcDNSZWFkZXIuY2xvc2UoKTsKKyAgICBzZl9jbG9zZShvdXRGaWxlSGFuZGxlKTsKKyAgICBpZiAoZGVjb2RlckJ1ZikgeworICAgICAgICBmcmVlKGRlY29kZXJCdWYpOworICAgICAgICBkZWNvZGVyQnVmID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK1RFU1RfUChNcDNEZWNvZGVyVGVzdCwgUmVzZXREZWNvZGVyVGVzdCkgeworICAgIHNpemVfdCBtZW1SZXF1aXJlbWVudHMgPSBwdm1wM19kZWNvZGVyTWVtUmVxdWlyZW1lbnRzKCk7CisgICAgQVNTRVJUX05FKG1lbVJlcXVpcmVtZW50cywgMCkgPDwgIkZhaWxlZCB0byBnZXQgdGhlIG1lbW9yeSByZXF1aXJlbWVudCBzaXplIjsKKyAgICB2b2lkICpkZWNvZGVyQnVmID0gbWFsbG9jKG1lbVJlcXVpcmVtZW50cyk7CisgICAgQVNTRVJUX05FKGRlY29kZXJCdWYsIG51bGxwdHIpCisgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGFsbG9jYXRlIGRlY29kZXIgbWVtb3J5IG9mIHNpemUgIiA8PCBtZW1SZXF1aXJlbWVudHM7CisKKyAgICBwdm1wM19Jbml0RGVjb2RlcihtQ29uZmlnLCBkZWNvZGVyQnVmKTsKKyAgICBBTE9HVigiRGVjb2RlciBjcmVhdGVkIHN1Y2Nlc3NmdWxseS4iKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpOworICAgIGJvb2wgc3RhdHVzID0gbU1wM1JlYWRlci5pbml0KGlucHV0RmlsZS5jX3N0cigpKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJVbmFibGUgdG8gaW5pdGlhbGl6ZSB0aGUgbXAzUmVhZGVyIjsKKworICAgIC8vIE9wZW4gdGhlIG91dHB1dCBmaWxlLgorICAgIFNGX0lORk8gc2ZJbmZvOworICAgIFNOREZJTEUgKm91dEZpbGVIYW5kbGUgPSBvcGVuT3V0cHV0RmlsZSgmc2ZJbmZvKTsKKyAgICBBU1NFUlRfTkUob3V0RmlsZUhhbmRsZSwgbnVsbHB0cikgPDwgIkVycm9yIG9wZW5pbmcgb3V0cHV0IGZpbGUgZm9yIHdyaXRpbmcgZGVjb2RlZCBvdXRwdXQiOworCisgICAgRVJST1JfQ09ERSBkZWNvZGVyRXJyOworICAgIGRlY29kZXJFcnIgPSBEZWNvZGVGcmFtZXMoZGVjb2RlckJ1Ziwgb3V0RmlsZUhhbmRsZSwgc2ZJbmZvLCBrTnVtRnJhbWVSZXNldCk7CisgICAgQVNTRVJUX0VRKGRlY29kZXJFcnIsIE5PX0RFQ09ESU5HX0VSUk9SKSA8PCAiRmFpbGVkIHRvIGRlY29kZSB0aGUgZnJhbWVzIjsKKyAgICBBU1NFUlRfRVEoc2ZJbmZvLmNoYW5uZWxzLCBtQ29uZmlnLT5udW1fY2hhbm5lbHMpIDw8ICJOdW1iZXIgb2YgY2hhbm5lbHMgZG9lcyBub3QgbWF0Y2giOworICAgIEFTU0VSVF9FUShzZkluZm8uc2FtcGxlcmF0ZSwgbUNvbmZpZy0+c2FtcGxpbmdSYXRlKSA8PCAiU2FtcGxlIHJhdGUgZG9lcyBub3QgbWF0Y2giOworCisgICAgcHZtcDNfcmVzZXREZWNvZGVyKGRlY29kZXJCdWYpOworICAgIC8vIERlY29kZSB0aGUgc2FtZSBmaWxlLgorICAgIGRlY29kZXJFcnIgPSBEZWNvZGVGcmFtZXMoZGVjb2RlckJ1Ziwgb3V0RmlsZUhhbmRsZSwgc2ZJbmZvKTsKKyAgICBBU1NFUlRfRVEoZGVjb2RlckVyciwgTk9fREVDT0RJTkdfRVJST1IpIDw8ICJGYWlsZWQgdG8gZGVjb2RlIHRoZSBmcmFtZXMiOworICAgIEFTU0VSVF9FUShzZkluZm8uY2hhbm5lbHMsIG1Db25maWctPm51bV9jaGFubmVscykgPDwgIk51bWJlciBvZiBjaGFubmVscyBkb2VzIG5vdCBtYXRjaCI7CisgICAgQVNTRVJUX0VRKHNmSW5mby5zYW1wbGVyYXRlLCBtQ29uZmlnLT5zYW1wbGluZ1JhdGUpIDw8ICJTYW1wbGUgcmF0ZSBkb2VzIG5vdCBtYXRjaCI7CisKKyAgICBtTXAzUmVhZGVyLmNsb3NlKCk7CisgICAgc2ZfY2xvc2Uob3V0RmlsZUhhbmRsZSk7CisgICAgaWYgKGRlY29kZXJCdWYpIHsKKyAgICAgICAgZnJlZShkZWNvZGVyQnVmKTsKKyAgICAgICAgZGVjb2RlckJ1ZiA9IG51bGxwdHI7CisgICAgfQorfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoTXAzRGVjb2RlclRlc3RBbGwsIE1wM0RlY29kZXJUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKCgiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjLm1wMyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zLm1wMyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiYmJiX21wM19zdGVyZW9fMTkya2Jwc180ODAwMGh6Lm1wMyIpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGdFbnYgPSBuZXcgTXAzRGVjb2RlclRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR1YoIlRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvTXAzRGVjb2RlclRlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0RW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTRiMzRjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L01wM0RlY29kZXJUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX01QM0RFQ09ERVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KKyNkZWZpbmUgX19NUDNERUNPREVSX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIE1wM0RlY29kZXJUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWMgOjp0ZXN0aW5nOjpFbnZpcm9ubWVudCB7CisgIHB1YmxpYzoKKyAgICBNcDNEZWNvZGVyVGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSB7fQorCisgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisgICAgdm9pZCBzZXRSZXMoY29uc3QgY2hhciAqX3JlcykgeyByZXMgPSBfcmVzOyB9CisKKyAgICBjb25zdCBzdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJpbmcgcmVzOworfTsKKworaW50IE1wM0RlY29kZXJUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJyZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgorICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gX19NUDNERUNPREVSX1RFU1RfRU5WSVJPTk1FTlRfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXAzZGVjL3Rlc3QvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTlmZWM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL21wM2RlYy90ZXN0L1JFQURNRS5tZApAQCAtMCwwICsxLDM5IEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgTXAzRGVjb2RlciA6CitUaGUgTXAzRGVjb2RlciBUZXN0IFN1aXRlIHZhbGlkYXRlcyB0aGUgbXAzZGVjb2RlciBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIE1wM0RlY29kZXJUZXN0CitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0L01wM0RlY29kZXJUZXN0L01wM0RlY29kZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvTXAzRGVjb2RlclRlc3QvTXAzRGVjb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcDNkZWMvdGVzdC9NcDNEZWNvZGVyVGVzdC56aXApLiBEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCisKK2BgYAorYWRiIHB1c2ggTXAzRGVjb2RlclRlc3RSZXMvLiAvZGF0YS9sb2NhbC90bXAvCitgYGAKKwordXNhZ2U6IE1wM0RlY29kZXJUZXN0IC1QIFw8cGF0aF90b19mb2xkZXJcPgorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL01wM0RlY29kZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9NcDNEZWNvZGVyVGVzdFJlcy8KK2BgYAorQWx0ZXJuYXRpdmVseSwgdGhlIHRlc3QgY2FuIGFsc28gYmUgcnVuIHVzaW5nIGF0ZXN0IGNvbW1hbmQuCisKK2BgYAorYXRlc3QgTXAzRGVjb2RlclRlc3QgLS0gLS1lbmFibGUtbW9kdWxlLWR5bmFtaWMtZG93bmxvYWQ9dHJ1ZQorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvbXBlZzJkZWMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCmluZGV4IDNkZjRkNGMuLmU4NDk0MTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9tcGVnMmRlYy9BbmRyb2lkLmJwCkBAIC0xLDM1ICsxLDE3IEBACiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3NvZnRfbXBlZzJkZWMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3RhdGljX2xpYnM6IFsibGlibXBlZzJkZWMiXSwKICAgICBzcmNzOiBbIlNvZnRNUEVHMi5jcHAiXSwKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLVdhbGwiLAotICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV25vLXVudXNlZC12YXJpYWJsZSIsCiAgICAgXSwKIAogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJleHRlcm5hbC9saWJtcGVnMi9kZWNvZGVyIiwKLSAgICAgICAgImV4dGVybmFsL2xpYm1wZWcyL2NvbW1vbiIsCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCi0gICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmxvZyIsCi0gICAgXSwKLQogICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKIAogICAgIHNhbml0aXplOiB7CkBAIC0zOCw1ICsyMCw0IEBACiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NGMyOTYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc3ViZGlycyA9IFsiKiJdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvQW5kcm9pZC5icAppbmRleCAxNzRmMTgzLi44MmJiOGQxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL0FuZHJvaWQuYnAKQEAgLTEsMjcgKzEsMTAgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF92cHhkZWMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWyJTb2Z0VlBYLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCi0gICAgc3RhdGljX2xpYnM6IFsibGlidnB4Il0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotCi0gICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKKyAgICBzaGFyZWRfbGliczogWyJsaWJ2cHgiXSwKIAogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCkBAIC0zMiw1ICsxNSw0IEBACiAgICAgICAgIF0sCiAgICAgICAgIGNmaTogdHJ1ZSwKICAgICB9LAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCmluZGV4IDhkNWYzZTcuLjBmMmZmMTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguY3BwCkBAIC0zMyw2ICszMyw3IEBACiAgICAgeyBPTVhfVklERU9fVlA5UHJvZmlsZTAsIE9NWF9WSURFT19WUDlMZXZlbDUgfSwKICAgICB7IE9NWF9WSURFT19WUDlQcm9maWxlMiwgT01YX1ZJREVPX1ZQOUxldmVsNSB9LAogICAgIHsgT01YX1ZJREVPX1ZQOVByb2ZpbGUySERSLCBPTVhfVklERU9fVlA5TGV2ZWw1IH0sCisgICAgeyBPTVhfVklERU9fVlA5UHJvZmlsZTJIRFIxMFBsdXMsIE9NWF9WSURFT19WUDlMZXZlbDUgfSwKIH07CiAKIFNvZnRWUFg6OlNvZnRWUFgoCkBAIC04NCw2ICs4NSwxMCBAQAogICAgIHJldHVybiB0cnVlOwogfQogCitib29sIFNvZnRWUFg6OnN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKSB7CisgICAgcmV0dXJuIHRydWU7Cit9CisKIHN0YXR1c190IFNvZnRWUFg6OmluaXREZWNvZGVyKCkgewogICAgIG1DdHggPSBuZXcgdnB4X2NvZGVjX2N0eF90OwogICAgIHZweF9jb2RlY19lcnJfdCB2cHhfZXJyOwpAQCAtMTY3LDcgKzE3MiwxMiBAQAogICAgICAgICBvdXRIZWFkZXItPm5PZmZzZXQgPSAwOwogICAgICAgICBvdXRIZWFkZXItPm5GbGFncyA9IDA7CiAgICAgICAgIG91dEhlYWRlci0+bkZpbGxlZExlbiA9IChvdXRwdXRCdWZmZXJXaWR0aCgpICogb3V0cHV0QnVmZmVySGVpZ2h0KCkgKiBicHAgKiAzKSAvIDI7Ci0gICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9ICooT01YX1RJQ0tTICopbUltZy0+dXNlcl9wcml2OworICAgICAgICBQcml2SW5mbyAqcHJpdkluZm8gPSAoUHJpdkluZm8gKiltSW1nLT51c2VyX3ByaXY7CisgICAgICAgIG91dEhlYWRlci0+blRpbWVTdGFtcCA9IHByaXZJbmZvLT5tVGltZVN0YW1wOworICAgICAgICBpZiAocHJpdkluZm8tPm1IZHIxMFBsdXNJbmZvICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHF1ZXVlT3V0cHV0RnJhbWVDb25maWcocHJpdkluZm8tPm1IZHIxMFBsdXNJbmZvKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChvdXRwdXRCdWZmZXJTYWZlKG91dEhlYWRlcikpIHsKICAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IG91dEhlYWRlci0+cEJ1ZmZlcjsKICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY1kgPSAoY29uc3QgdWludDhfdCAqKW1JbWctPnBsYW5lc1tWUFhfUExBTkVfWV07CkBAIC0yNzUsNyArMjg1LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBtVGltZVN0YW1wc1ttVGltZVN0YW1wSWR4XSA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworICAgICAgICBtUHJpdkluZm9bbVRpbWVTdGFtcElkeF0ubVRpbWVTdGFtcCA9IGluSGVhZGVyLT5uVGltZVN0YW1wOworCisgICAgICAgIGlmIChpbkluZm8tPm1GcmFtZUNvbmZpZykgeworICAgICAgICAgICAgbVByaXZJbmZvW21UaW1lU3RhbXBJZHhdLm1IZHIxMFBsdXNJbmZvID0gZGVxdWV1ZUlucHV0RnJhbWVDb25maWcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Qcml2SW5mb1ttVGltZVN0YW1wSWR4XS5tSGRyMTBQbHVzSW5mby5jbGVhcigpOworICAgICAgICB9CiAKICAgICAgICAgaWYgKGluSGVhZGVyLT5uRmxhZ3MgJiBPTVhfQlVGRkVSRkxBR19FT1MpIHsKICAgICAgICAgICAgIG1FT1NTdGF0dXMgPSBJTlBVVF9FT1NfU0VFTjsKQEAgLTI4NSw3ICszMDEsNyBAQAogICAgICAgICBpZiAoaW5IZWFkZXItPm5GaWxsZWRMZW4gPiAwKSB7CiAgICAgICAgICAgICB2cHhfY29kZWNfZXJyX3QgZXJyID0gdnB4X2NvZGVjX2RlY29kZSgKICAgICAgICAgICAgICAgICAgICAgKHZweF9jb2RlY19jdHhfdCAqKW1DdHgsIGluSGVhZGVyLT5wQnVmZmVyICsgaW5IZWFkZXItPm5PZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgIGluSGVhZGVyLT5uRmlsbGVkTGVuLCAmbVRpbWVTdGFtcHNbbVRpbWVTdGFtcElkeF0sIDApOworICAgICAgICAgICAgICAgICAgICBpbkhlYWRlci0+bkZpbGxlZExlbiwgJm1Qcml2SW5mb1ttVGltZVN0YW1wSWR4XSwgMCk7CiAgICAgICAgICAgICBpZiAoZXJyID09IFZQWF9DT0RFQ19PSykgewogICAgICAgICAgICAgICAgIGluSW5mby0+bU93bmVkQnlVcyA9IGZhbHNlOwogICAgICAgICAgICAgICAgIGluUXVldWUuZXJhc2UoaW5RdWV1ZS5iZWdpbigpKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZGVjL1NvZnRWUFguaAppbmRleCBiNjJiNTI2Li4wYWE4ZTljIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2RlYy9Tb2Z0VlBYLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9kZWMvU29mdFZQWC5oCkBAIC0yNiw2ICsyNiw4IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAorc3RydWN0IEFCdWZmZXI7CisKIHN0cnVjdCBTb2Z0VlBYIDogcHVibGljIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQgewogICAgIFNvZnRWUFgoY29uc3QgY2hhciAqbmFtZSwKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbXBvbmVudFJvbGUsCkBAIC00MSw2ICs0Myw3IEBACiAgICAgdmlydHVhbCB2b2lkIG9uUG9ydEZsdXNoQ29tcGxldGVkKE9NWF9VMzIgcG9ydEluZGV4KTsKICAgICB2aXJ0dWFsIHZvaWQgb25SZXNldCgpOwogICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0RGVzY3JpYmVIZHJTdGF0aWNJbmZvKCk7CisgICAgdmlydHVhbCBib29sIHN1cHBvcnREZXNjcmliZUhkcjEwUGx1c0luZm8oKTsKIAogcHJpdmF0ZToKICAgICBlbnVtIHsKQEAgLTYwLDcgKzYzLDExIEBACiAKICAgICB2b2lkICptQ3R4OwogICAgIGJvb2wgbUZyYW1lUGFyYWxsZWxNb2RlOyAgLy8gRnJhbWUgcGFyYWxsZWwgaXMgb25seSBzdXBwb3J0ZWQgYnkgVlA5IGRlY29kZXIuCi0gICAgT01YX1RJQ0tTIG1UaW1lU3RhbXBzW2tOdW1CdWZmZXJzXTsKKyAgICBzdHJ1Y3QgUHJpdkluZm8geworICAgICAgICBPTVhfVElDS1MgbVRpbWVTdGFtcDsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gbUhkcjEwUGx1c0luZm87CisgICAgfTsKKyAgICBQcml2SW5mbyBtUHJpdkluZm9ba051bUJ1ZmZlcnNdOwogICAgIHVpbnQ4X3QgbVRpbWVTdGFtcElkeDsKICAgICB2cHhfaW1hZ2VfdCAqbUltZzsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL0FuZHJvaWQuYnAKaW5kZXggODkxYTc3MS4uNzA1ZTU1NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9BbmRyb2lkLmJwCkBAIC0xLDkgKzEsNiBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X3ZweGVuYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbCiAgICAgICAgICJTb2Z0VlBYRW5jb2Rlci5jcHAiLApAQCAtMTEsMTUgKzgsMTAgQEAKICAgICAgICAgIlNvZnRWUDlFbmNvZGVyLmNwcCIsCiAgICAgXSwKIAotICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCisgICAgY2ZsYWdzOiBbIi1XYWxsIl0sCiAKICAgICB2ZXJzaW9uX3NjcmlwdDogImV4cG9ydHMubGRzIiwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKLQogICAgIHNhbml0aXplOiB7CiAgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCiAgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLApAQCAtMjgsMTMgKzIwLDYgQEAKICAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCiAKLSAgICBzdGF0aWNfbGliczogWyJsaWJ2cHgiXSwKLQotICAgIHNoYXJlZF9saWJzOiBbCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAotICAgIF0sCi0gICAgY29tcGlsZV9tdWx0aWxpYjogIjMyIiwKKyAgICBzaGFyZWRfbGliczogWyJsaWJ2cHgiXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJiYXNlX2hlYWRlcnMiXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUDhFbmNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlA4RW5jb2Rlci5oCmluZGV4IGI0OTA0YmYuLmM1YzJhYmYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUDhFbmNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQOEVuY29kZXIuaApAQCAtMjMsOCArMjMsNiBAQAogI2luY2x1ZGUgPE9NWF9WaWRlb0V4dC5oPgogI2luY2x1ZGUgPE9NWF9JbmRleEV4dC5oPgogCi0jaW5jbHVkZSA8aGFyZHdhcmUvZ3JhbGxvYy5oPgotCiAjaW5jbHVkZSAidnB4L3ZweF9lbmNvZGVyLmgiCiAjaW5jbHVkZSAidnB4L3ZweF9jb2RlYy5oIgogI2luY2x1ZGUgInZweC92cDhjeC5oIgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQOUVuY29kZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUDlFbmNvZGVyLmgKaW5kZXggODVkZjY5YS4uMzA4YTlhYyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQOUVuY29kZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlA5RW5jb2Rlci5oCkBAIC0yMyw4ICsyMyw2IEBACiAjaW5jbHVkZSA8T01YX1ZpZGVvRXh0Lmg+CiAjaW5jbHVkZSA8T01YX0luZGV4RXh0Lmg+CiAKLSNpbmNsdWRlIDxoYXJkd2FyZS9ncmFsbG9jLmg+Ci0KICNpbmNsdWRlICJ2cHgvdnB4X2VuY29kZXIuaCIKICNpbmNsdWRlICJ2cHgvdnB4X2NvZGVjLmgiCiAjaW5jbHVkZSAidnB4L3ZwOGN4LmgiCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5jcHAKaW5kZXggMmRmYmExMy4uZDBjYjA3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmNwcApAQCAtNDAxLDggKzQwMSw4IEBACiAgICAgfQogfQogCi1PTVhfRVJST1JUWVBFIFNvZnRWUFhFbmNvZGVyOjpzZXRDb25maWcoCi0gICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcykgeworT01YX0VSUk9SVFlQRSBTb2Z0VlBYRW5jb2Rlcjo6aW50ZXJuYWxTZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgX3BhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpIHsKICAgICBzd2l0Y2ggKGluZGV4KSB7CiAgICAgICAgIGNhc2UgT01YX0luZGV4Q29uZmlnVmlkZW9JbnRyYVZPUFJlZnJlc2g6CiAgICAgICAgIHsKQEAgLTQ0Miw3ICs0NDIsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHJldHVybiBTaW1wbGVTb2Z0T01YQ29tcG9uZW50OjpzZXRDb25maWcoaW5kZXgsIF9wYXJhbXMpOworICAgICAgICAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmludGVybmFsU2V0Q29uZmlnKGluZGV4LCBfcGFyYW1zLCBmcmFtZUNvbmZpZyk7CiAgICAgfQogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29uMi9lbmMvU29mdFZQWEVuY29kZXIuaAppbmRleCBkZDg2ZDM2Li43MjA4ZDY5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb24yL2VuYy9Tb2Z0VlBYRW5jb2Rlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vbjIvZW5jL1NvZnRWUFhFbmNvZGVyLmgKQEAgLTIzLDggKzIzLDYgQEAKICNpbmNsdWRlIDxPTVhfVmlkZW9FeHQuaD4KICNpbmNsdWRlIDxPTVhfSW5kZXhFeHQuaD4KIAotI2luY2x1ZGUgPGhhcmR3YXJlL2dyYWxsb2MuaD4KLQogI2luY2x1ZGUgInZweC92cHhfZW5jb2Rlci5oIgogI2luY2x1ZGUgInZweC92cHhfY29kZWMuaCIKICNpbmNsdWRlICJ2cHgvdnA4Y3guaCIKQEAgLTg0LDggKzgyLDggQEAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtKTsKIAotICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBzZXRDb25maWcoCi0gICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CisgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGludGVybmFsU2V0Q29uZmlnKAorICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMsIGJvb2wgKmZyYW1lQ29uZmlnKTsKIAogICAgIC8vIE9NWCBjYWxsYmFjayB3aGVuIGJ1ZmZlcnMgYXZhaWxhYmxlCiAgICAgLy8gTm90ZSB0aGF0IGJvdGggYW4gaW5wdXQgYW5kIG91dHB1dCBidWZmZXIKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9BbmRyb2lkLmJwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDRjMjk2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL0FuZHJvaWQuYnAKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1zdWJkaXJzID0gWyIqIl0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL0FuZHJvaWQuYnAKaW5kZXggYWZlNDU5ZC4uNzFhMmEwZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsMjcgKzEsMTMgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF9vcHVzZGVjIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAotICAgIHZuZGs6IHsKLSAgICAgICAgZW5hYmxlZDogdHJ1ZSwKLSAgICB9LAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsiU29mdE9wdXMuY3BwIl0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgIF0sCi0KICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlib3B1cyIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9vbXgiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCi0gICAgICAgICJsaWJ1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAogICAgIF0sCiAKLSAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAotCiAgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCiAKICAgICBzYW5pdGl6ZTogewpAQCAtMzEsNSArMTcsNCBAQAogICAgICAgICBdLAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9vcHVzL2RlYy9Tb2Z0T3B1cy5jcHAKaW5kZXggZDQwZjUyNS4uNGY2MWFhOCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL29wdXMvZGVjL1NvZnRPcHVzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvb3B1cy9kZWMvU29mdE9wdXMuY3BwCkBAIC00MzAsOCArNDMwLDE3IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBpZiAoc2l6ZSA8IHNpemVvZihpbnQ2NF90KSkgeworICAgICAgICAgICAgICAgIC8vIFRoZSAybmQgYW5kIDNyZCBpbnB1dCBidWZmZXIgYXJlIGV4cGVjdGVkIHRvIGNvbnRhaW4KKyAgICAgICAgICAgICAgICAvLyAgYW4gaW50NjRfdCAoc2VlIGJlbG93KSwgc28gbWFrZSBzdXJlIHdlIGdldCBhdCBsZWFzdAorICAgICAgICAgICAgICAgIC8vICB0aGF0IG11Y2guIFRoZSBmaXJzdCBpbnB1dCBidWZmZXIgbXVzdCBjb250YWluIDE5IGJ5dGVzLAorICAgICAgICAgICAgICAgIC8vICBidXQgdGhhdCBpcyBjaGVja2VkIGFscmVhZHkuCisgICAgICAgICAgICAgICAgbm90aWZ5KE9NWF9FdmVudEVycm9yLCBPTVhfRXJyb3JVbmRlZmluZWQsIDAsIE5VTEwpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlckNvdW50ID09IDApIHsKLSAgICAgICAgICAgICAgICBDSEVDSyhtSGVhZGVyID09IE5VTEwpOworICAgICAgICAgICAgICAgIGRlbGV0ZSBtSGVhZGVyOwogICAgICAgICAgICAgICAgIG1IZWFkZXIgPSBuZXcgT3B1c0hlYWRlcigpOwogICAgICAgICAgICAgICAgIG1lbXNldChtSGVhZGVyLCAwLCBzaXplb2YoKm1IZWFkZXIpKTsKICAgICAgICAgICAgICAgICBpZiAoIVBhcnNlT3B1c0hlYWRlcihkYXRhLCBzaXplLCBtSGVhZGVyKSkgewpAQCAtNDUyLDYgKzQ2MSw5IEBACiAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAgICAgaW50IHN0YXR1cyA9IE9QVVNfSU5WQUxJRF9TVEFURTsKKyAgICAgICAgICAgICAgICBpZiAobURlY29kZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfZGVzdHJveShtRGVjb2Rlcik7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1EZWNvZGVyID0gb3B1c19tdWx0aXN0cmVhbV9kZWNvZGVyX2NyZWF0ZShrUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUhlYWRlci0+Y2hhbm5lbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1IZWFkZXItPm51bV9zdHJlYW1zLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3Jhdy9BbmRyb2lkLmJwCmluZGV4IGY4MjI0NDUuLmZjYzdhMGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy9yYXcvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MvcmF3L0FuZHJvaWQuYnAKQEAgLTEsMTkgKzEsOSBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0X3Jhd2RlYyIsCi0gICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKKyAgICBkZWZhdWx0czogWyJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIl0sCiAKICAgICBzcmNzOiBbIlNvZnRSYXcuY3BwIl0sCiAKLSAgICBpbmNsdWRlX2RpcnM6IFsKLSAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZSIsCi0gICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAotICAgIF0sCi0KLSAgICBjZmxhZ3M6IFsiLVdlcnJvciJdLAotCiAgICAgdmVyc2lvbl9zY3JpcHQ6ICJleHBvcnRzLmxkcyIsCiAKICAgICBzYW5pdGl6ZTogewpAQCAtMjMsMTIgKzEzLDQgQEAKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCi0KLSAgICBzaGFyZWRfbGliczogWwotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKLSAgICBdLAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL0FuZHJvaWQuYnAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0NGMyOTYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9BbmRyb2lkLmJwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotc3ViZGlycyA9IFsiKiJdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3ZvcmJpcy9kZWMvQW5kcm9pZC5icAppbmRleCBhOTI2NWNiLi4zZWZiOTUyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsMjcgKzEsMTMgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF92b3JiaXNkZWMiLAotICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCi0gICAgdm5kazogewotICAgICAgICBlbmFibGVkOiB0cnVlLAotICAgIH0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfc29mdG9teC1kZWZhdWx0cyJdLAogCiAgICAgc3JjczogWyJTb2Z0Vm9yYmlzLmNwcCJdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4IiwKLSAgICBdLAotCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYnZvcmJpc2lkZWMiLAotICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214IiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAotICAgICAgICAibGlibG9nIiwKICAgICBdLAogCi0gICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKLQogICAgIHZlcnNpb25fc2NyaXB0OiAiZXhwb3J0cy5sZHMiLAogCiAgICAgc2FuaXRpemU6IHsKQEAgLTMwLDUgKzE2LDQgQEAKICAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKICAgICAgICAgXSwKICAgICB9LAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3Mvdm9yYmlzL2RlYy9Tb2Z0Vm9yYmlzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwCmluZGV4IDhkMGVhM2EuLjA4ZTIwY2MgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy92b3JiaXMvZGVjL1NvZnRWb3JiaXMuY3BwCkBAIC0yOTAsNyArMjkwLDcgQEAKIH0KIAogYm9vbCBTb2Z0Vm9yYmlzOjppc0NvbmZpZ3VyZWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1JbnB1dEJ1ZmZlckNvdW50ID49IDI7CisgICAgcmV0dXJuIChtU3RhdGUgIT0gTlVMTCAmJiBtVmkgIT0gTlVMTCk7CiB9CiAKIHN0YXRpYyB2b2lkIG1ha2VCaXRSZWFkZXIoCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvQW5kcm9pZC5icAppbmRleCA3MzkyZjFlLi41Mzg1ZGJjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL0FuZHJvaWQuYnAKQEAgLTEsMTggKzEsMTIgQEAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfc29mdF94YWFjZGVjIiwKLSAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgtZGVmYXVsdHMiXSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIlNvZnRYQUFDLmNwcCIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCi0gICAgXSwKLQogICAgIGNmbGFnczogWwotICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItREVOQUJMRV9NUEVHX0RfRFJDIgogICAgIF0sCiAKQEAgLTI1LDEyICsxOSw2IEBACiAgICAgc3RhdGljX2xpYnM6IFsibGlieGFhY2RlYyJdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X29teCIsCi0gICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKLSAgICAgICAgImxpYnV0aWxzIiwKICAgICAgICAgImxpYmN1dGlscyIsCi0gICAgICAgICJsaWJsb2ciLAogICAgIF0sCi0KLSAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuY3BwCmluZGV4IGI5OWJjZDguLmRhODY3NTggMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5jcHAKQEAgLTc5LDcgKzc5LDcgQEAKIAogc3RhdGljIGNvbnN0IE9NWF9VMzIga1N1cHBvcnRlZFByb2ZpbGVzW10gPSB7CiAgICAgT01YX0FVRElPX0FBQ09iamVjdExDLCBPTVhfQVVESU9fQUFDT2JqZWN0SEUsICBPTVhfQVVESU9fQUFDT2JqZWN0SEVfUFMsCi0gICAgT01YX0FVRElPX0FBQ09iamVjdExELCBPTVhfQVVESU9fQUFDT2JqZWN0RUxELAorICAgIE9NWF9BVURJT19BQUNPYmplY3RMRCwgT01YX0FVRElPX0FBQ09iamVjdEVMRCwgT01YX0FVRElPX0FBQ09iamVjdFhIRQogfTsKIAogU29mdFhBQUM6OlNvZnRYQUFDKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IE9NWF9DQUxMQkFDS1RZUEUqIGNhbGxiYWNrcywgT01YX1BUUiBhcHBEYXRhLApAQCAtMTEwLDE1ICsxMTAsMjIgQEAKIAogewogICAgIGluaXRQb3J0cygpOwotICAgIENIRUNLX0VRKGluaXREZWNvZGVyKCksIChzdGF0dXNfdClPSyk7CisgICAgbU1lbW9yeVZlYy5jbGVhcigpOworICAgIG1EcmNNZW1vcnlWZWMuY2xlYXIoKTsKKworICAgIENIRUNLX0VRKGluaXREZWNvZGVyKCksIElBX05PX0VSUk9SKTsKIH0KIAogU29mdFhBQUM6On5Tb2Z0WEFBQygpIHsKLSAgICBpbnQgZXJyQ29kZSA9IGRlSW5pdFhBQUNEZWNvZGVyKCk7Ci0gICAgaWYgKDAgIT0gZXJyQ29kZSkgewotICAgICAgICBBTE9HRSgiZGVJbml0WEFBQ0RlY29kZXIoKSBmYWlsZWQgJWQiLCBlcnJDb2RlKTsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBkZUluaXRYQUFDRGVjb2RlcigpOworICAgIGlmIChJQV9OT19FUlJPUiAhPSBlcnJfY29kZSkgeworICAgICAgICBBTE9HRSgiZGVJbml0WEFBQ0RlY29kZXIoKSBmYWlsZWQgJWQiLCBlcnJfY29kZSk7CiAgICAgfQogCisgICAgZXJyX2NvZGUgPSBkZUluaXRNUEVHREREcmMoKTsKKyAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyX2NvZGUpIHsKKyAgICAgICAgQUxPR0UoImRlSW5pdE1QRUdERERyYygpIGZhaWxlZCAlZCIsIGVycl9jb2RlKTsKKyAgICB9CiAgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IGZhbHNlOwogICAgIG1Jc0NvZGVjQ29uZmlnRmx1c2hSZXF1aXJlZCA9IGZhbHNlOwogfQpAQCAtMTY0LDM2ICsxNzEsMTYgQEAKICAgICBhZGRQb3J0KGRlZik7CiB9CiAKLXN0YXR1c190IFNvZnRYQUFDOjppbml0RGVjb2RlcigpIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBVTktOT1dOX0VSUk9SOwotCitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmluaXREZWNvZGVyKCkgewogICAgIGludCB1aV9kcmNfdmFsOwogICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOwogICAgIGludCBsb29wID0gMDsKIAogICAgIGVycl9jb2RlID0gaW5pdFhBQUNEZWNvZGVyKCk7CiAgICAgaWYgKGVycl9jb2RlICE9IElBX05PX0VSUk9SKSB7Ci0gICAgICAgIGlmIChOVUxMID09IG1YaGVhYWNDb2RlY0hhbmRsZSkgewotICAgICAgICAgICAgQUxPR0UoIkFBQyBkZWNvZGVyIGhhbmRsZSBpcyBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKE5VTEwgPT0gbU1wZWdERHJjSGFuZGxlKSB7Ci0gICAgICAgICAgICBBTE9HRSgiTVBFRy1EIERSQyBkZWNvZGVyIGhhbmRsZSBpcyBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChsb29wID0gMTsgbG9vcCA8IG1NYWxsb2NDb3VudDsgbG9vcCsrKSB7Ci0gICAgICAgICAgICBpZiAobU1lbW9yeUFycmF5W2xvb3BdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yICVkXG4iLCBsb29wKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBBTE9HRSgiaW5pdFhBQUNEZWNvZGVyIEZhaWxlZCIpOwotCi0gICAgICAgIGZvciAobG9vcCA9IDA7IGxvb3AgPCBtTWFsbG9jQ291bnQ7IGxvb3ArKykgewotICAgICAgICAgICAgaWYgKG1NZW1vcnlBcnJheVtsb29wXSkgZnJlZShtTWVtb3J5QXJyYXlbbG9vcF0pOwotICAgICAgICB9Ci0gICAgICAgIG1NYWxsb2NDb3VudCA9IDA7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgc3RhdHVzID0gT0s7CisgICAgICAgIEFMT0dFKCJpbml0WEFBQ0RlY29kZXIgZmFpbGVkIHdpdGggZXJyb3IgJWQiLCBlcnJfY29kZSk7CisgICAgICAgIGRlSW5pdFhBQUNEZWNvZGVyKCk7CisgICAgICAgIHJldHVybiBlcnJfY29kZTsKICAgICB9CiAKICAgICBtRW5kT2ZJbnB1dCA9IGZhbHNlOwpAQCAtMjc0LDcgKzI2MSw3IEBACiAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfRFJDX0VGRkVDVF9UWVBFIik7CiAKICNlbmRpZgotICAgIHJldHVybiBzdGF0dXM7CisgICAgcmV0dXJuIElBX05PX0VSUk9SOwogfQogCiBPTVhfRVJST1JUWVBFIFNvZnRYQUFDOjppbnRlcm5hbEdldFBhcmFtZXRlcihPTVhfSU5ERVhUWVBFIGluZGV4LCBPTVhfUFRSIHBhcmFtcykgewpAQCAtNTQ3LDkgKzUzNCw2IEBACiAgICAgLyogc2FtcGxlIGN1cnJlbnRseSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgICBpZiAobUlzQ29kZWNJbml0aWFsaXplZCkgewogICAgICAgICBudW1PdXRCeXRlcyA9IG1PdXRwdXRGcmFtZUxlbmd0aCAqIChtUGNtV2RTeiAvIDgpICogbU51bUNoYW5uZWxzOwotICAgICAgICBpZiAoKG1QY21XZFN6IC8gOCkgIT0gMikgewotICAgICAgICAgICAgQUxPR0UoIlhBQUMgYXNzdW1lcyAyIGJ5dGVzIHBlciBzYW1wbGUhIG1QY21XZFN6ICVkIiwgbVBjbVdkU3opOwotICAgICAgICB9CiAgICAgfQogCiAgICAgd2hpbGUgKCghaW5RdWV1ZS5lbXB0eSgpIHx8IG1FbmRPZklucHV0KSAmJiAhb3V0UXVldWUuZW1wdHkoKSkgewpAQCAtNTY5LDggKzU1Myw4IEBACiAgICAgICAgICAgICAgICAgaW5CdWZmZXJMZW5ndGggPSBpbkhlYWRlci0+bkZpbGxlZExlbjsKIAogICAgICAgICAgICAgICAgIC8qIEdBIGhlYWRlciBjb25maWd1cmF0aW9uIHNlbnQgdG8gRGVjb2RlciEgKi8KLSAgICAgICAgICAgICAgICBpbnQgZXJyX2NvZGUgPSBjb25maWdYQUFDRGVjb2RlcihpbkJ1ZmZlciwgaW5CdWZmZXJMZW5ndGgpOwotICAgICAgICAgICAgICAgIGlmICgwICE9IGVycl9jb2RlKSB7CisgICAgICAgICAgICAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gY29uZmlnWEFBQ0RlY29kZXIoaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBpZiAoSUFfTk9fRVJST1IgIT0gZXJyX2NvZGUpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNvbmZpZ1hBQUNEZWNvZGVyIGVycl9jb2RlID0gJWQiLCBlcnJfY29kZSk7CiAgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIG5vdGlmeShPTVhfRXZlbnRFcnJvciwgT01YX0Vycm9yVW5kZWZpbmVkLCBlcnJfY29kZSwgTlVMTCk7CkBAIC02ODIsOCArNjY2LDggQEAKICAgICAgICAgICAgIC8qIHdoaWNoIHNob3VsZCBpbml0aWFsaXplIHRoZSBjb2RlYy4gT25jZSB0aGlzIHN0YXRlIGlzIHJlYWNoZWQsIGNhbGwgdGhlICAqLwogICAgICAgICAgICAgLyogZGVjb2RlWEFBQ1N0cmVhbSBBUEkgd2l0aCBzYW1lIGZyYW1lIHRvIGRlY29kZSEgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgICAgICAgICAgaWYgKCFtSXNDb2RlY0luaXRpYWxpemVkKSB7Ci0gICAgICAgICAgICAgICAgaW50IGVycl9jb2RlID0gY29uZmlnWEFBQ0RlY29kZXIoaW5CdWZmZXIsIGluQnVmZmVyTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBpZiAoMCAhPSBlcnJfY29kZSkgeworICAgICAgICAgICAgICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IGNvbmZpZ1hBQUNEZWNvZGVyKGluQnVmZmVyLCBpbkJ1ZmZlckxlbmd0aCk7CisgICAgICAgICAgICAgICAgaWYgKElBX05PX0VSUk9SICE9IGVycl9jb2RlKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjb25maWdYQUFDRGVjb2RlciBGYWlsZWQgMiBlcnJfY29kZSA9ICVkIiwgZXJyX2NvZGUpOwogICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOwogICAgICAgICAgICAgICAgICAgICBub3RpZnkoT01YX0V2ZW50RXJyb3IsIE9NWF9FcnJvclVuZGVmaW5lZCwgZXJyX2NvZGUsIE5VTEwpOwpAQCAtODQ1LDcgKzgyOSw3IEBACiAgICAgfQogfQogCi1pbnQgU29mdFhBQUM6OmNvbmZpZ2ZsdXNoRGVjb2RlKCkgeworSUFfRVJST1JDT0RFIFNvZnRYQUFDOjpjb25maWdmbHVzaERlY29kZSgpIHsKICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGU7CiAgICAgVVdPUkQzMiB1aV9pbml0X2RvbmU7CiAgICAgdWludDMyX3QgaW5CdWZmZXJMZW5ndGggPSA4MjAzOwpAQCAtODcxLDE2ICs4NTUsMTMgQEAKICAgICAgICAgICAgICJGb3VuZCBDb2RlYyB3aXRoIGJlbG93IGNvbmZpZy0tLVxuc2FtcEZyZXEgJWRcbm51bUNoYW5uZWxzICVkXG5wY21XZFN6ICIKICAgICAgICAgICAgICIlZFxuY2hhbm5lbE1hc2sgJWRcbm91dHB1dEZyYW1lTGVuZ3RoICVkIiwKICAgICAgICAgICAgIG1TYW1wRnJlcSwgbU51bUNoYW5uZWxzLCBtUGNtV2RTeiwgbUNoYW5uZWxNYXNrLCBtT3V0cHV0RnJhbWVMZW5ndGgpOwotICAgICAgICBpZiAobU51bUNoYW5uZWxzID4gTUFYX0NIQU5ORUxfQ09VTlQpIHsKLSAgICAgICAgICAgIEFMT0dFKCIgTm8gb2YgY2hhbm5lbHMgYXJlIG1vcmUgdGhhbiBtYXggY2hhbm5lbHNcbiIpOwotICAgICAgICAgICAgbUlzQ29kZWNJbml0aWFsaXplZCA9IGZhbHNlOwotICAgICAgICB9IGVsc2UKLSAgICAgICAgICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSB0cnVlOworCisgICAgICAgIG1Jc0NvZGVjSW5pdGlhbGl6ZWQgPSB0cnVlOwogICAgIH0KLSAgICByZXR1cm4gZXJyX2NvZGU7CisgICAgcmV0dXJuIElBX05PX0VSUk9SOwogfQotaW50IFNvZnRYQUFDOjpkcmFpbkRlY29kZXIoKSB7Ci0gICAgcmV0dXJuIDA7CitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmRyYWluRGVjb2RlcigpIHsKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7CiB9CiAKIHZvaWQgU29mdFhBQUM6Om9uUmVzZXQoKSB7CkBAIC05MjEsNyArOTAyLDcgQEAKICAgICB9CiB9CiAKLWludCBTb2Z0WEFBQzo6aW5pdFhBQUNEZWNvZGVyKCkgeworSUFfRVJST1JDT0RFIFNvZnRYQUFDOjppbml0WEFBQ0RlY29kZXIoKSB7CiAgICAgTE9PUElEWCBpOwogCiAgICAgLyogRXJyb3IgY29kZSAqLwpAQCAtOTM5LDExICs5MjAsMTEgQEAKICAgICBVV09SRDMyIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZTsKICAgICAvKiBBUEkgc2l6ZSAqLwogICAgIFVXT1JEMzIgcHVpX2FwaV9zaXplOworICAgIHBWT0lEIHB2X2FsbG9jX3B0cjsKIAogICAgIG1JbnB1dEJ1ZmZlclNpemUgPSAwOwogICAgIG1JbnB1dEJ1ZmZlciA9IDA7CiAgICAgbU91dHB1dEJ1ZmZlciA9IDA7Ci0gICAgbU1hbGxvY0NvdW50ID0gMDsKIAogICAgIC8qIFByb2Nlc3Mgc3RydWN0IGluaXRpbmcgZW5kICovCiAgICAgLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwpAQCAtOTU0LDIwICs5MzUsMTMgQEAKICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkoTlVMTCwgSUFfQVBJX0NNRF9HRVRfQVBJX1NJWkUsIDAsICZwdWlfYXBpX3NpemUpOwogICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX0FQSV9TSVpFIik7CiAKLSAgICBpZiAobU1hbGxvY0NvdW50ID09IE1BWF9NRU1fQUxMT0NTKSB7Ci0gICAgICAgIEFMT0dFKCJtTWVtb3J5QXJyYXkgaXMgZnVsbCIpOwotICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgfQotCiAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBBUEkgKi8KLSAgICBtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9IG1lbWFsaWduKDQsIHB1aV9hcGlfc2l6ZSk7Ci0gICAgaWYgKG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID09IE5VTEwpIHsKKyAgICBtWGhlYWFjQ29kZWNIYW5kbGUgPSBtZW1hbGlnbig0LCBwdWlfYXBpX3NpemUpOworICAgIGlmIChtWGhlYWFjQ29kZWNIYW5kbGUgPT0gTlVMTCkgewogICAgICAgICBBTE9HRSgibWFsbG9jIGZvciBwdWlfYXBpX3NpemUgKyA0ID4+ICVkIEZhaWxlZCIsIHB1aV9hcGlfc2l6ZSArIDQpOwogICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CiAgICAgfQotICAgIC8qIFNldCBBUEkgb2JqZWN0IHdpdGggdGhlIG1lbW9yeSBhbGxvY2F0ZWQgKi8KLSAgICBtWGhlYWFjQ29kZWNIYW5kbGUgPSAocFZPSUQpKChXT1JEOCopbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0pOwotICAgIG1NYWxsb2NDb3VudCsrOworICAgIG1NZW1vcnlWZWMucHVzaChtWGhlYWFjQ29kZWNIYW5kbGUpOwogCiAgICAgLyogU2V0IHRoZSBjb25maWcgcGFyYW1zIHRvIGRlZmF1bHQgdmFsdWVzICovCiAgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULApAQCAtOTc5LDIzICs5NTMsMTYgQEAKIAogICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX0FQSV9TSVpFIik7CiAKLSAgICBpZiAobU1hbGxvY0NvdW50ID09IE1BWF9NRU1fQUxMT0NTKSB7Ci0gICAgICAgIEFMT0dFKCJtTWVtb3J5QXJyYXkgaXMgZnVsbCIpOwotICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgfQotCiAgICAgLyogQWxsb2NhdGUgbWVtb3J5IGZvciBBUEkgKi8KLSAgICBtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9IG1lbWFsaWduKDQsIHB1aV9hcGlfc2l6ZSk7CisgICAgbU1wZWdERHJjSGFuZGxlID0gbWVtYWxpZ24oNCwgcHVpX2FwaV9zaXplKTsKIAotICAgIGlmIChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9PSBOVUxMKSB7CisgICAgaWYgKG1NcGVnRERyY0hhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJtYWxsb2MgZm9yIGRyYyBhcGkgc3RydWN0dXJlIEZhaWxlZCIpOwogICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CiAgICAgfQotICAgIG1lbXNldChtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSwgMCwgcHVpX2FwaV9zaXplKTsKKyAgICBtTWVtb3J5VmVjLnB1c2gobU1wZWdERHJjSGFuZGxlKTsKIAotICAgIC8qIFNldCBBUEkgb2JqZWN0IHdpdGggdGhlIG1lbW9yeSBhbGxvY2F0ZWQgKi8KLSAgICBtTXBlZ0REcmNIYW5kbGUgPSAocFZPSUQpKChXT1JEOCopbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0pOwotICAgIG1NYWxsb2NDb3VudCsrOworICAgIG1lbXNldChtTXBlZ0REcmNIYW5kbGUsIDAsIHB1aV9hcGlfc2l6ZSk7CiAKICAgICAvKiBTZXQgdGhlIGNvbmZpZyBwYXJhbXMgdG8gZGVmYXVsdCB2YWx1ZXMgKi8KICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9JTklULApAQCAtMTAyMSwyMyArOTg4LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1aV9wcm9jX21lbV90YWJzX3NpemUpOwogICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTVRBQlNfU0laRSIpOwogCi0gICAgaWYgKG1NYWxsb2NDb3VudCA9PSBNQVhfTUVNX0FMTE9DUykgewotICAgICAgICBBTE9HRSgibU1lbW9yeUFycmF5IGlzIGZ1bGwiKTsKLSAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgIH0KLQotICAgIG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID0gbWVtYWxpZ24oNCwgdWlfcHJvY19tZW1fdGFic19zaXplKTsKLSAgICBpZiAobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkgeworICAgIHB2X2FsbG9jX3B0ciA9IG1lbWFsaWduKDQsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisgICAgaWYgKHB2X2FsbG9jX3B0ciA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJNYWxsb2MgZm9yIHNpemUgKHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSArIDQpID0gJWQgZmFpbGVkISIsCiAgICAgICAgICAgICAgIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSArIDQpOwogICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CiAgICAgfQotICAgIG1NYWxsb2NDb3VudCsrOwotICAgIC8qIFNldCBwb2ludGVyIGZvciBwcm9jZXNzIG1lbW9yeSB0YWJsZXMgICAgKi8KLSAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBWT0lEKSgoV09SRDgqKW1NZW1vcnlBcnJheVttTWFsbG9jQ291bnQgLSAxXSkpOwotICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTVRBQlNfUFRSIik7CisgICAgbU1lbW9yeVZlYy5wdXNoKHB2X2FsbG9jX3B0cik7CiAKKyAgICAvKiBTZXQgcG9pbnRlciBmb3IgcHJvY2VzcyBtZW1vcnkgdGFibGVzICAgICovCisgICAgZXJyX2NvZGUgPSBpeGhlYWFjZF9kZWNfYXBpKG1YaGVhYWNDb2RlY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNVEFCU19QVFIsIDAsIHB2X2FsbG9jX3B0cik7CisgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNVEFCU19QVFIiKTsKIAogICAgIC8qIGluaXRpYWxpemUgdGhlIEFQSSwgcG9zdCBjb25maWcsIGZpbGwgbWVtb3J5IHRhYmxlcyAgKi8KICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0lOSVQsCkBAIC0xMDY2LDE3ICsxMDI3LDEyIEBACiAgICAgICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUsIGksICZ1aV90eXBlKTsKICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSIpOwogCi0gICAgICAgIGlmIChtTWFsbG9jQ291bnQgPT0gTUFYX01FTV9BTExPQ1MpIHsKLSAgICAgICAgICAgIEFMT0dFKCJtTWVtb3J5QXJyYXkgaXMgZnVsbCIpOwotICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgICAgICB9Ci0gICAgICAgIG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID0gbWVtYWxpZ24odWlfYWxpZ25tZW50LCB1aV9zaXplKTsKLSAgICAgICAgaWYgKG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID09IE5VTEwpIHsKKyAgICAgICAgcHZfYWxsb2NfcHRyID0gbWVtYWxpZ24odWlfYWxpZ25tZW50LCB1aV9zaXplKTsKKyAgICAgICAgaWYgKHB2X2FsbG9jX3B0ciA9PSBOVUxMKSB7CiAgICAgICAgICAgICBBTE9HRSgiTWFsbG9jIGZvciBzaXplICh1aV9zaXplICsgdWlfYWxpZ25tZW50KSA9ICVkIGZhaWxlZCEiLCB1aV9zaXplICsgdWlfYWxpZ25tZW50KTsKICAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKICAgICAgICAgfQotICAgICAgICBwdl9hbGxvY19wdHIgPSAocFZPSUQpKChXT1JEOCopbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0pOwotICAgICAgICBtTWFsbG9jQ291bnQrKzsKKyAgICAgICAgbU1lbW9yeVZlYy5wdXNoKHB2X2FsbG9jX3B0cik7CiAKICAgICAgICAgLyogU2V0IHRoZSBidWZmZXIgcG9pbnRlciAqLwogICAgICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCBpLCBwdl9hbGxvY19wdHIpOwpAQCAtMTA5NSw3ICsxMDUxLDcgQEAKICAgICByZXR1cm4gSUFfTk9fRVJST1I7CiB9CiAKLWludCBTb2Z0WEFBQzo6Y29uZmlnWEFBQ0RlY29kZXIodWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoKSB7CitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmNvbmZpZ1hBQUNEZWNvZGVyKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCkgewogICAgIFVXT1JEMzIgdWlfaW5pdF9kb25lOwogICAgIGludDMyX3QgaV9ieXRlc19jb25zdW1lZDsKIApAQCAtMTE1NCwxNCArMTExMCw3NiBAQAogCiAgICAgcmV0dXJuIElBX05PX0VSUk9SOwogfQotaW50IFNvZnRYQUFDOjpjb25maWdNUEVHRERyYygpIHsKK0lBX0VSUk9SQ09ERSBTb2Z0WEFBQzo6aW5pdE1QRUdERERyYygpIHsKKyAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKKyAgICBpbnQgaTsKKworICAgIGZvciAoaSA9IDA7IGkgPCAoV09SRDMyKTI7IGkrKykgeworICAgICAgICBXT1JEMzIgdWlfc2l6ZSwgdWlfYWxpZ25tZW50LCB1aV90eXBlOworICAgICAgICBwVk9JRCBwdl9hbGxvY19wdHI7CisKKyAgICAgICAgLyogR2V0IG1lbW9yeSBzaXplICovCisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19TSVpFLCBpLCAmdWlfc2l6ZSk7CisKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSIpOworCisgICAgICAgIC8qIEdldCBtZW1vcnkgYWxpZ25tZW50ICovCisgICAgICAgIGVycl9jb2RlID0KKyAgICAgICAgICAgIGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fQUxJR05NRU5ULCBpLCAmdWlfYWxpZ25tZW50KTsKKworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19BTElHTk1FTlQiKTsKKworICAgICAgICAvKiBHZXQgbWVtb3J5IHR5cGUgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1RZUEUsIGksICZ1aV90eXBlKTsKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fVFlQRSIpOworCisgICAgICAgIHB2X2FsbG9jX3B0ciA9IG1lbWFsaWduKDQsIHVpX3NpemUpOworICAgICAgICBpZiAocHZfYWxsb2NfcHRyID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOworICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgICAgICB9CisgICAgICAgIG1EcmNNZW1vcnlWZWMucHVzaChwdl9hbGxvY19wdHIpOworCisgICAgICAgIC8qIFNldCB0aGUgYnVmZmVyIHBvaW50ZXIgKi8KKyAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfU0VUX01FTV9QVFIsIGksIHB2X2FsbG9jX3B0cik7CisKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiIpOworICAgIH0KKworICAgIFdPUkQzMiB1aV9zaXplOworICAgIHVpX3NpemUgPSA4MTkyICogMjsKKworICAgIG1EcmNJbkJ1ZiA9IChpbnQ4X3QqKW1lbWFsaWduKDQsIHVpX3NpemUpOworICAgIGlmIChtRHJjSW5CdWYgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KKyAgICBtRHJjTWVtb3J5VmVjLnB1c2gobURyY0luQnVmKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCAyLCBtRHJjSW5CdWYpOworICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKKworICAgIG1EcmNPdXRCdWYgPSAoaW50OF90KiltZW1hbGlnbig0LCB1aV9zaXplKTsKKyAgICBpZiAobURyY091dEJ1ZiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOworICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7CisgICAgfQorICAgIG1EcmNNZW1vcnlWZWMucHVzaChtRHJjT3V0QnVmKTsKKworICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCAzLCBtRHJjT3V0QnVmKTsKKyAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7Cit9CitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmNvbmZpZ01QRUdERHJjKCkgewogICAgIElBX0VSUk9SQ09ERSBlcnJfY29kZSA9IElBX05PX0VSUk9SOwogICAgIGludCBpX2VmZmVjdF90eXBlOwogICAgIGludCBpX2xvdWRfbm9ybTsKICAgICBpbnQgaV90YXJnZXRfbG91ZG5lc3M7CiAgICAgdW5zaWduZWQgaW50IGlfc2JyX21vZGU7Ci0gICAgaW50IG5fbWVtczsKICAgICBpbnQgaTsKKyAgICBpbnQgdWlfcHJvY19tZW1fdGFic19zaXplID0gMDsKKyAgICBwVk9JRCBwdl9hbGxvY19wdHIgPSBOVUxMOwogCiAjaWZkZWYgRU5BQkxFX01QRUdfRF9EUkMKICAgICB7CkBAIC0xMjEyLDgzICsxMjMwLDQ0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fU0JSX01PREUsICZpX3Nicl9tb2RlKTsKICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX1NCUl9NT0RFIik7CiAKKyAgICAgICAgLyogR2V0IG1lbW9yeSBpbmZvIHRhYmxlcyBzaXplICovCisgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1UQUJTX1NJWkUsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisKKyAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNVEFCU19TSVpFIik7CisKKyAgICAgICAgcHZfYWxsb2NfcHRyID0gbWVtYWxpZ24oNCwgdWlfcHJvY19tZW1fdGFic19zaXplKTsKKworICAgICAgICBpZiAocHZfYWxsb2NfcHRyID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCJDYW5ub3QgY3JlYXRlIHJlcXVlc3RlZCBtZW1vcnkgICVkIiwgdWlfcHJvY19tZW1fdGFic19zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIG1lbXNldChwdl9hbGxvY19wdHIsIDAsIHVpX3Byb2NfbWVtX3RhYnNfc2l6ZSk7CisKKyAgICAgICAgbU1lbW9yeVZlYy5wdXNoKHB2X2FsbG9jX3B0cik7CisKKyAgICAgICAgLyogU2V0IHBvaW50ZXIgZm9yIHByb2Nlc3MgbWVtb3J5IHRhYmxlcyAqLworICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNVEFCU19QVFIsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHZfYWxsb2NfcHRyKTsKKworICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1UQUJTX1BUUiIpOworCiAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0lOSVQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfQ01EX1RZUEVfSU5JVF9BUElfUE9TVF9DT05GSUdfUEFSQU1TLCBOVUxMKTsKIAogICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9DTURfVFlQRV9JTklUX0FQSV9QT1NUX0NPTkZJR19QQVJBTVMiKTsKIAotICAgICAgICBmb3IgKGkgPSAwOyBpIDwgKFdPUkQzMikyOyBpKyspIHsKLSAgICAgICAgICAgIFdPUkQzMiB1aV9zaXplLCB1aV9hbGlnbm1lbnQsIHVpX3R5cGU7Ci0gICAgICAgICAgICBwVk9JRCBwdl9hbGxvY19wdHI7CisgICAgICAgIC8qIEZyZWUgYW55IG1lbW9yeSB0aGF0IGlzIGFsbG9jYXRlZCBmb3IgTVBFRyBEIERyYyBzbyBmYXIgKi8KKyAgICAgICAgZGVJbml0TVBFR0RERHJjKCk7CiAKLSAgICAgICAgICAgIC8qIEdldCBtZW1vcnkgc2l6ZSAqLwotICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX1NJWkUsIGksICZ1aV9zaXplKTsKLQotICAgICAgICAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9HRVRfTUVNX0lORk9fU0laRSIpOwotCi0gICAgICAgICAgICAvKiBHZXQgbWVtb3J5IGFsaWdubWVudCAqLwotICAgICAgICAgICAgZXJyX2NvZGUgPSBpYV9kcmNfZGVjX2FwaShtTXBlZ0REcmNIYW5kbGUsIElBX0FQSV9DTURfR0VUX01FTV9JTkZPX0FMSUdOTUVOVCwgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVpX2FsaWdubWVudCk7Ci0KLSAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfR0VUX01FTV9JTkZPX0FMSUdOTUVOVCIpOwotCi0gICAgICAgICAgICAvKiBHZXQgbWVtb3J5IHR5cGUgKi8KLSAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFLCBpLCAmdWlfdHlwZSk7Ci0gICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX0dFVF9NRU1fSU5GT19UWVBFIik7Ci0gICAgICAgICAgICBpZiAobU1hbGxvY0NvdW50ID09IE1BWF9NRU1fQUxMT0NTKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9IG1lbWFsaWduKDQsIHVpX3NpemUpOwotICAgICAgICAgICAgaWYgKG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwdl9hbGxvY19wdHIgPSAocFZPSUQpKChXT1JEOCopbU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0pOwotICAgICAgICAgICAgbU1hbGxvY0NvdW50Kys7Ci0KLSAgICAgICAgICAgIC8qIFNldCB0aGUgYnVmZmVyIHBvaW50ZXIgKi8KLSAgICAgICAgICAgIGVycl9jb2RlID0gaWFfZHJjX2RlY19hcGkobU1wZWdERHJjSGFuZGxlLCBJQV9BUElfQ01EX1NFVF9NRU1fUFRSLCBpLCBwdl9hbGxvY19wdHIpOwotCi0gICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7CisgICAgICAgIGVycl9jb2RlID0gaW5pdE1QRUdERERyYygpOworICAgICAgICBpZiAoZXJyX2NvZGUgIT0gSUFfTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dFKCJpbml0TVBFR0RERHJjIGZhaWxlZCB3aXRoIGVycm9yICVkIiwgZXJyX2NvZGUpOworICAgICAgICAgICAgZGVJbml0TVBFR0RERHJjKCk7CisgICAgICAgICAgICByZXR1cm4gZXJyX2NvZGU7CiAgICAgICAgIH0KLSAgICAgICAgewotICAgICAgICAgICAgV09SRDMyIHVpX3NpemU7Ci0gICAgICAgICAgICB1aV9zaXplID0gODE5MiAqIDI7Ci0gICAgICAgICAgICBpZiAobU1hbGxvY0NvdW50ID09IE1BWF9NRU1fQUxMT0NTKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIm1NZW1vcnlBcnJheSBpcyBmdWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOwotICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBtTWVtb3J5QXJyYXlbbU1hbGxvY0NvdW50XSA9IG1lbWFsaWduKDQsIHVpX3NpemUpOwotICAgICAgICAgICAgaWYgKG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiIENhbm5vdCBjcmVhdGUgcmVxdWVzdGVkIG1lbW9yeSAgJWQiLCB1aV9zaXplKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSUFfRkFUQUxfRVJST1I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EcmNJbkJ1ZiA9IChpbnQ4X3QqKW1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdOwotICAgICAgICAgICAgbU1hbGxvY0NvdW50Kys7Ci0gICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptT3V0cHV0QnVmZmVyKi8gbURyY0luQnVmKTsKLSAgICAgICAgICAgIFJFVFVSTl9JRl9GQVRBTChlcnJfY29kZSwgIklBX0FQSV9DTURfU0VUX01FTV9QVFIiKTsKLQotICAgICAgICAgICAgaWYgKG1NYWxsb2NDb3VudCA9PSBNQVhfTUVNX0FMTE9DUykgewotICAgICAgICAgICAgICAgIEFMT0dFKCJtTWVtb3J5QXJyYXkgaXMgZnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdID0gbWVtYWxpZ24oNCwgdWlfc2l6ZSk7Ci0gICAgICAgICAgICBpZiAobU1lbW9yeUFycmF5W21NYWxsb2NDb3VudF0gPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dFKCIgQ2Fubm90IGNyZWF0ZSByZXF1ZXN0ZWQgbWVtb3J5ICAlZCIsIHVpX3NpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbURyY091dEJ1ZiA9IChpbnQ4X3QqKW1NZW1vcnlBcnJheVttTWFsbG9jQ291bnRdOwotICAgICAgICAgICAgbU1hbGxvY0NvdW50Kys7Ci0gICAgICAgICAgICBlcnJfY29kZSA9IGlhX2RyY19kZWNfYXBpKG1NcGVnRERyY0hhbmRsZSwgSUFfQVBJX0NNRF9TRVRfTUVNX1BUUiwgMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyptT3V0cHV0QnVmZmVyKi8gbURyY091dEJ1Zik7Ci0gICAgICAgICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9BUElfQ01EX1NFVF9NRU1fUFRSIik7Ci0gICAgICAgIH0KICAgICAgICAgLyogRFJDIGJ1ZmZlcnMKICAgICAgICAgICAgIGJ1ZlswXSAtIGNvbnRhaW5zIGV4dGVuc2lvbiBlbGVtZW50IHBheSBsb2FkIGxvdWRuZXNzIHJlbGF0ZWQKICAgICAgICAgICAgIGJ1ZlsxXSAtIGNvbnRhaW5zIGV4dGVuc2lvbiBlbGVtZW50IHBheSBsb2FkKi8KQEAgLTE0MjMsMTAgKzE0MDIsMTAgQEAKICAgICB9CiAjZW5kaWYKIAotICAgIHJldHVybiBlcnJfY29kZTsKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7CiB9Ci1pbnQgU29mdFhBQUM6OmRlY29kZVhBQUNTdHJlYW0odWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoLCBpbnQzMl90KiBieXRlc0NvbnN1bWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIG91dEJ5dGVzKSB7CitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmRlY29kZVhBQUNTdHJlYW0odWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIGJ5dGVzQ29uc3VtZWQsIGludDMyX3QqIG91dEJ5dGVzKSB7CiAgICAgaWYgKG1JbnB1dEJ1ZmZlclNpemUgPCBpbkJ1ZmZlckxlbmd0aCkgewogICAgICAgICBBTE9HRSgiQ2Fubm90IGNvbmZpZyBBQUMsIGlucHV0IGJ1ZmZlciBzaXplICVkIDwgaW5CdWZmZXJMZW5ndGggJWQiLCBtSW5wdXRCdWZmZXJTaXplLAogICAgICAgICAgICAgICBpbkJ1ZmZlckxlbmd0aCk7CkBAIC0xNTE2LDI0ICsxNDk1LDMzIEBACiAgICAgICAgIG1lbWNweShtT3V0cHV0QnVmZmVyLCBtRHJjT3V0QnVmLCAqb3V0Qnl0ZXMpOwogICAgIH0KICNlbmRpZgotICAgIHJldHVybiBlcnJfY29kZTsKKyAgICByZXR1cm4gSUFfTk9fRVJST1I7CiB9CiAKLWludCBTb2Z0WEFBQzo6ZGVJbml0WEFBQ0RlY29kZXIoKSB7CitJQV9FUlJPUkNPREUgU29mdFhBQUM6OmRlSW5pdFhBQUNEZWNvZGVyKCkgewogICAgIEFMT0dJKCJkZUluaXRYQUFDRGVjb2RlciIpOwogCiAgICAgLyogVGVsbCB0aGF0IHRoZSBpbnB1dCBpcyBvdmVyIGluIHRoaXMgYnVmZmVyICovCiAgICAgSUFfRVJST1JDT0RFIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfSU5QVVRfT1ZFUiwgMCwgTlVMTCk7Ci0gICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfQVBJX0NNRF9JTlBVVF9PVkVSIik7CiAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1NYWxsb2NDb3VudDsgaSsrKSB7Ci0gICAgICAgIGlmIChtTWVtb3J5QXJyYXlbaV0pIGZyZWUobU1lbW9yeUFycmF5W2ldKTsKKyAgICAvKiBJcnJlc3BlY3RpdmUgb2YgZXJyb3IgcmV0dXJuZWQgaW4gSUFfQVBJX0NNRF9JTlBVVF9PVkVSLCBmcmVlIGFsbG9jYXRlZCBtZW1vcnkgKi8KKyAgICBmb3IgKHZvaWQqIGJ1ZiA6IG1NZW1vcnlWZWMpIHsKKyAgICAgICAgZnJlZShidWYpOwogICAgIH0KLSAgICBtTWFsbG9jQ291bnQgPSAwOwotCisgICAgbU1lbW9yeVZlYy5jbGVhcigpOwogICAgIHJldHVybiBlcnJfY29kZTsKIH0KIAorSUFfRVJST1JDT0RFIFNvZnRYQUFDOjpkZUluaXRNUEVHREREcmMoKSB7CisgICAgQUxPR0koImRlSW5pdE1QRUdERERyYyIpOworCisgICAgZm9yICh2b2lkKiBidWYgOiBtRHJjTWVtb3J5VmVjKSB7CisgICAgICAgIGZyZWUoYnVmKTsKKyAgICB9CisgICAgbURyY01lbW9yeVZlYy5jbGVhcigpOworICAgIHJldHVybiBJQV9OT19FUlJPUjsKK30KKwogSUFfRVJST1JDT0RFIFNvZnRYQUFDOjpnZXRYQUFDU3RyZWFtSW5mbygpIHsKICAgICBJQV9FUlJPUkNPREUgZXJyX2NvZGUgPSBJQV9OT19FUlJPUjsKIApAQCAtMTU0NiwxMSArMTUzNCwxOSBAQAogICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUywgJm1OdW1DaGFubmVscyk7CiAgICAgUkVUVVJOX0lGX0ZBVEFMKGVycl9jb2RlLCAiSUFfRU5IQUFDUExVU19ERUNfQ09ORklHX1BBUkFNX05VTV9DSEFOTkVMUyIpOworICAgIGlmIChtTnVtQ2hhbm5lbHMgPiBNQVhfQ0hBTk5FTF9DT1VOVCkgeworICAgICAgICBBTE9HRSgiIE5vIG9mIGNoYW5uZWxzIGFyZSBtb3JlIHRoYW4gbWF4IGNoYW5uZWxzXG4iKTsKKyAgICAgICAgcmV0dXJuIElBX0ZBVEFMX0VSUk9SOworICAgIH0KIAogICAgIC8qIFBDTSB3b3JkIHNpemUgKi8KICAgICBlcnJfY29kZSA9IGl4aGVhYWNkX2RlY19hcGkobVhoZWFhY0NvZGVjSGFuZGxlLCBJQV9BUElfQ01EX0dFVF9DT05GSUdfUEFSQU0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElBX0VOSEFBQ1BMVVNfREVDX0NPTkZJR19QQVJBTV9QQ01fV0RTWiwgJm1QY21XZFN6KTsKICAgICBSRVRVUk5fSUZfRkFUQUwoZXJyX2NvZGUsICJJQV9FTkhBQUNQTFVTX0RFQ19DT05GSUdfUEFSQU1fUENNX1dEU1oiKTsKKyAgICBpZiAoKG1QY21XZFN6IC8gOCkgIT0gMikgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBOdW1iZXIgb2YgYnl0ZXMgcGVyIHNhbXBsZTogJWQsIEV4cGVjdGVkIGlzIDIiLCBtUGNtV2RTeik7CisgICAgICAgIHJldHVybiBJQV9GQVRBTF9FUlJPUjsKKyAgICB9CiAKICAgICAvKiBjaGFubmVsIG1hc2sgdG8gdGVsbCB0aGUgYXJyYW5nZW1lbnQgb2YgY2hhbm5lbHMgaW4gYml0IHN0cmVhbSAqLwogICAgIGVycl9jb2RlID0gaXhoZWFhY2RfZGVjX2FwaShtWGhlYWFjQ29kZWNIYW5kbGUsIElBX0FQSV9DTURfR0VUX0NPTkZJR19QQVJBTSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2RlY3MveGFhY2RlYy9Tb2Z0WEFBQy5oCmluZGV4IDYxNzYwODIuLmE2MmE3OTcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvZGVjcy94YWFjZGVjL1NvZnRYQUFDLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29kZWNzL3hhYWNkZWMvU29mdFhBQUMuaApAQCAtMzMsOCArMzMsNiBAQAogI2luY2x1ZGUgImltcGRfYXBpY21kX3N0YW5kYXJkcy5oIgogI2luY2x1ZGUgImltcGRfZHJjX2NvbmZpZ19wYXJhbXMuaCIKIAotI2RlZmluZSBNQVhfTUVNX0FMTE9DUyAxMDAKLQogZXh0ZXJuICJDIiBJQV9FUlJPUkNPREUgaXhoZWFhY2RfZGVjX2FwaShwVk9JRCBwX2lhX21vZHVsZV9vYmosIFdPUkQzMiBpX2NtZCwgV09SRDMyIGlfaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwVk9JRCBwdl92YWx1ZSk7CiBleHRlcm4gIkMiIElBX0VSUk9SQ09ERSBpYV9kcmNfZGVjX2FwaShwVk9JRCBwX2lhX21vZHVsZV9vYmosIFdPUkQzMiBpX2NtZCwgV09SRDMyIGlfaWR4LApAQCAtODAsMTggKzc4LDE5IEBACiAgICAgZW51bSB7IE5PTkUsIEFXQUlUSU5HX0RJU0FCTEVELCBBV0FJVElOR19FTkFCTEVEIH0gbU91dHB1dFBvcnRTZXR0aW5nc0NoYW5nZTsKIAogICAgIHZvaWQgaW5pdFBvcnRzKCk7Ci0gICAgc3RhdHVzX3QgaW5pdERlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgaW5pdERlY29kZXIoKTsKICAgICBib29sIGlzQ29uZmlndXJlZCgpIGNvbnN0OwotICAgIGludCBkcmFpbkRlY29kZXIoKTsKLSAgICBpbnQgaW5pdFhBQUNEZWNvZGVyKCk7Ci0gICAgaW50IGRlSW5pdFhBQUNEZWNvZGVyKCk7CisgICAgSUFfRVJST1JDT0RFIGRyYWluRGVjb2RlcigpOworICAgIElBX0VSUk9SQ09ERSBpbml0WEFBQ0RlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgZGVJbml0WEFBQ0RlY29kZXIoKTsKKyAgICBJQV9FUlJPUkNPREUgaW5pdE1QRUdERERyYygpOworICAgIElBX0VSUk9SQ09ERSBkZUluaXRNUEVHREREcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgY29uZmlnWEFBQ0RlY29kZXIodWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoKTsKKyAgICBJQV9FUlJPUkNPREUgY29uZmlnTVBFR0REcmMoKTsKKyAgICBJQV9FUlJPUkNPREUgZGVjb2RlWEFBQ1N0cmVhbSh1aW50OF90KiBpbkJ1ZmZlciwgdWludDMyX3QgaW5CdWZmZXJMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCogYnl0ZXNDb25zdW1lZCwgaW50MzJfdCogb3V0Qnl0ZXMpOwogCi0gICAgaW50IGNvbmZpZ1hBQUNEZWNvZGVyKHVpbnQ4X3QqIGluQnVmZmVyLCB1aW50MzJfdCBpbkJ1ZmZlckxlbmd0aCk7Ci0gICAgaW50IGNvbmZpZ01QRUdERHJjKCk7Ci0gICAgaW50IGRlY29kZVhBQUNTdHJlYW0odWludDhfdCogaW5CdWZmZXIsIHVpbnQzMl90IGluQnVmZmVyTGVuZ3RoLCBpbnQzMl90KiBieXRlc0NvbnN1bWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QqIG91dEJ5dGVzKTsKLQotICAgIGludCBjb25maWdmbHVzaERlY29kZSgpOworICAgIElBX0VSUk9SQ09ERSBjb25maWdmbHVzaERlY29kZSgpOwogICAgIElBX0VSUk9SQ09ERSBnZXRYQUFDU3RyZWFtSW5mbygpOwogICAgIElBX0VSUk9SQ09ERSBzZXRYQUFDRFJDSW5mbyhpbnQzMl90IGRyY0N1dCwgaW50MzJfdCBkcmNCb29zdCwgaW50MzJfdCBkcmNSZWZMZXZlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBkcmNIZWF2eUNvbXByZXNzaW9uCkBAIC0xMjAsOSArMTE5LDggQEAKICAgICBpbnQ4X3QqIG1EcmNPdXRCdWY7CiAgICAgaW50MzJfdCBtTXBlZ0REUkNQcmVzZW50OwogICAgIGludDMyX3QgbURSQ0ZsYWc7Ci0KLSAgICB2b2lkKiBtTWVtb3J5QXJyYXlbTUFYX01FTV9BTExPQ1NdOwotICAgIGludDMyX3QgbU1hbGxvY0NvdW50OworICAgIFZlY3Rvcjx2b2lkKj4gbU1lbW9yeVZlYzsKKyAgICBWZWN0b3I8dm9pZCo+IG1EcmNNZW1vcnlWZWM7CiAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb2Z0WEFBQyk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Db2xvckNvbnZlcnRlci5jcHAKaW5kZXggNzBmNTJjMy4uZDY4NTMyMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL0NvbG9yQ29udmVydGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vQ29sb3JDb252ZXJ0ZXIuY3BwCkBAIC0yMSwxMCArMjEsMTMgQEAKIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgogCiAjaW5jbHVkZSAibGlieXV2L2NvbnZlcnRfZnJvbS5oIgorI2luY2x1ZGUgImxpYnl1di9jb252ZXJ0X2FyZ2IuaCIKKyNpbmNsdWRlICJsaWJ5dXYvcGxhbmFyX2Z1bmN0aW9ucy5oIgogI2luY2x1ZGUgImxpYnl1di92aWRlb19jb21tb24uaCIKICNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPHN5cy90aW1lLmg+CkBAIC00NSwxMCArNDgsMjggQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitzdGF0aWMgYm9vbCBpc1JHQihPTVhfQ09MT1JfRk9STUFUVFlQRSBjb2xvckZvcm1hdCkgeworICAgIHJldHVybiBjb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUKKyAgICAgICAgICAgIHx8IGNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4CisgICAgICAgICAgICB8fCBjb2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MzJiaXRCR1JBODg4ODsKK30KKworYm9vbCBDb2xvckNvbnZlcnRlcjo6Q29sb3JTcGFjZTo6aXNCdDcwOSgpIHsKKyAgICByZXR1cm4gKG1TdGFuZGFyZCA9PSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNzA5KTsKK30KKworCitib29sIENvbG9yQ29udmVydGVyOjpDb2xvclNwYWNlOjppc0pwZWcoKSB7CisgICAgcmV0dXJuICgobVN0YW5kYXJkID09IENvbG9yVXRpbHM6OmtDb2xvclN0YW5kYXJkQlQ2MDFfNjI1KQorICAgICAgICAgICAgfHwgKG1TdGFuZGFyZCA9PSBDb2xvclV0aWxzOjprQ29sb3JTdGFuZGFyZEJUNjAxXzUyNSkpCisgICAgICAgICAgICAmJiAobVJhbmdlID09IENvbG9yVXRpbHM6OmtDb2xvclJhbmdlRnVsbCk7Cit9CisKIENvbG9yQ29udmVydGVyOjpDb2xvckNvbnZlcnRlcigKICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgZnJvbSwgT01YX0NPTE9SX0ZPUk1BVFRZUEUgdG8pCiAgICAgOiBtU3JjRm9ybWF0KGZyb20pLAogICAgICAgbURzdEZvcm1hdCh0byksCisgICAgICBtU3JjQ29sb3JTcGFjZSh7MCwgMCwgMH0pLAogICAgICAgbUNsaXAoTlVMTCkgewogfQogCkBAIC03MSwyNCArOTIsNDYgQEAKIAogICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRDYllDclk6CiAgICAgICAgIGNhc2UgT01YX1FDT01fQ09MT1JfRm9ybWF0WVZVNDIwU2VtaVBsYW5hcjoKLSAgICAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjoKICAgICAgICAgY2FzZSBPTVhfVElfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKICAgICAgICAgICAgIHJldHVybiBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NTsKIAorICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorI2lmZGVmIFVTRV9MSUJZVVYKKyAgICAgICAgICAgIHJldHVybiBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NQorICAgICAgICAgICAgICAgICAgICB8fCBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQzMkJpdFJHQkE4ODg4OworI2Vsc2UKKyAgICAgICAgICAgIHJldHVybiBtRHN0Rm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXQxNmJpdFJHQjU2NTsKKyNlbmRpZgorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogfQogCiBib29sIENvbG9yQ29udmVydGVyOjppc0RzdFJHQigpIGNvbnN0IHsKLSAgICByZXR1cm4gbURzdEZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjUKLSAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODgKLSAgICAgICAgICAgIHx8IG1Ec3RGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDMyYml0QkdSQTg4ODg7CisgICAgcmV0dXJuIGlzUkdCKG1Ec3RGb3JtYXQpOwogfQogCit2b2lkIENvbG9yQ29udmVydGVyOjpzZXRTcmNDb2xvclNwYWNlKAorICAgICAgICB1aW50MzJfdCBzdGFuZGFyZCwgdWludDMyX3QgcmFuZ2UsIHVpbnQzMl90IHRyYW5zZmVyKSB7CisgICAgaWYgKGlzUkdCKG1TcmNGb3JtYXQpKSB7CisgICAgICAgIEFMT0dXKCJDYW4ndCBzZXQgY29sb3Igc3BhY2Ugb24gUkdCIHNvdXJjZSIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1TcmNDb2xvclNwYWNlLm1TdGFuZGFyZCA9IHN0YW5kYXJkOworICAgIG1TcmNDb2xvclNwYWNlLm1SYW5nZSA9IHJhbmdlOworICAgIG1TcmNDb2xvclNwYWNlLm1UcmFuc2ZlciA9IHRyYW5zZmVyOworfQorCisvKgorICogSWYgc3RyaWRlIGlzIG5vbi16ZXJvLCBjbGllbnQncyBzdHJpZGUgd2lsbCBiZSB1c2VkLiBGb3IgcGxhbmFyCisgKiBvciBzZW1pLXBsYW5hciBZVVYgZm9ybWF0cywgc3RyaWRlIG11c3QgYmUgZXZlbiBudW1iZXJzLgorICogSWYgc3RyaWRlIGlzIHplcm8sIGl0IHdpbGwgYmUgY2FsY3VsYXRlZCBiYXNlZCBvbiB3aWR0aCBhbmQgYnBwCisgKiBvZiB0aGUgZm9ybWF0LCBhc3N1bWluZyBubyBwYWRkaW5nIG9uIHRoZSByaWdodCBlZGdlLgorICovCiBDb2xvckNvbnZlcnRlcjo6Qml0bWFwUGFyYW1zOjpCaXRtYXBQYXJhbXMoCiAgICAgICAgIHZvaWQgKmJpdHMsCi0gICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LCBzaXplX3Qgc3RyaWRlLAogICAgICAgICBzaXplX3QgY3JvcExlZnQsIHNpemVfdCBjcm9wVG9wLAogICAgICAgICBzaXplX3QgY3JvcFJpZ2h0LCBzaXplX3QgY3JvcEJvdHRvbSwKICAgICAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgY29sb3JGcm9tYXQpCkBAIC0xMDIsNiArMTQ1LDggQEAKICAgICAgIG1Dcm9wQm90dG9tKGNyb3BCb3R0b20pIHsKICAgICBzd2l0Y2gobUNvbG9yRm9ybWF0KSB7CiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU6CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTY6CisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0Q2JZQ3JZOgogICAgICAgICBtQnBwID0gMjsKICAgICAgICAgbVN0cmlkZSA9IDIgKiBtV2lkdGg7CiAgICAgICAgIGJyZWFrOwpAQCAtMTEzLDEzICsxNTgsNyBAQAogICAgICAgICBtU3RyaWRlID0gNCAqIG1XaWR0aDsKICAgICAgICAgYnJlYWs7CiAKLSAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNjoKLSAgICAgICAgbUJwcCA9IDI7Ci0gICAgICAgIG1TdHJpZGUgPSAyICogbVdpZHRoOwotICAgICAgICBicmVhazsKLQogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjoKLSAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRDYllDclk6CiAgICAgY2FzZSBPTVhfUUNPTV9DT0xPUl9Gb3JtYXRZVlU0MjBTZW1pUGxhbmFyOgogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXI6CiAgICAgY2FzZSBPTVhfVElfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hcjoKQEAgLTEzMyw2ICsxNzIsMTAgQEAKICAgICAgICAgbVN0cmlkZSA9IG1XaWR0aDsKICAgICAgICAgYnJlYWs7CiAgICAgfQorICAgIC8vIHVzZSBjbGllbnQncyBzdHJpZGUgaWYgaXQncyBzcGVjaWZpZWQuCisgICAgaWYgKHN0cmlkZSAhPSAwKSB7CisgICAgICAgIG1TdHJpZGUgPSBzdHJpZGU7CisgICAgfQogfQogCiBzaXplX3QgQ29sb3JDb252ZXJ0ZXI6OkJpdG1hcFBhcmFtczo6Y3JvcFdpZHRoKCkgY29uc3QgewpAQCAtMTQ1LDIxICsxODgsMjEgQEAKIAogc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnQoCiAgICAgICAgIGNvbnN0IHZvaWQgKnNyY0JpdHMsCi0gICAgICAgIHNpemVfdCBzcmNXaWR0aCwgc2l6ZV90IHNyY0hlaWdodCwKKyAgICAgICAgc2l6ZV90IHNyY1dpZHRoLCBzaXplX3Qgc3JjSGVpZ2h0LCBzaXplX3Qgc3JjU3RyaWRlLAogICAgICAgICBzaXplX3Qgc3JjQ3JvcExlZnQsIHNpemVfdCBzcmNDcm9wVG9wLAogICAgICAgICBzaXplX3Qgc3JjQ3JvcFJpZ2h0LCBzaXplX3Qgc3JjQ3JvcEJvdHRvbSwKICAgICAgICAgdm9pZCAqZHN0Qml0cywKLSAgICAgICAgc2l6ZV90IGRzdFdpZHRoLCBzaXplX3QgZHN0SGVpZ2h0LAorICAgICAgICBzaXplX3QgZHN0V2lkdGgsIHNpemVfdCBkc3RIZWlnaHQsIHNpemVfdCBkc3RTdHJpZGUsCiAgICAgICAgIHNpemVfdCBkc3RDcm9wTGVmdCwgc2l6ZV90IGRzdENyb3BUb3AsCiAgICAgICAgIHNpemVfdCBkc3RDcm9wUmlnaHQsIHNpemVfdCBkc3RDcm9wQm90dG9tKSB7CiAgICAgQml0bWFwUGFyYW1zIHNyYygKICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8dm9pZCAqPihzcmNCaXRzKSwKLSAgICAgICAgICAgIHNyY1dpZHRoLCBzcmNIZWlnaHQsCisgICAgICAgICAgICBzcmNXaWR0aCwgc3JjSGVpZ2h0LCBzcmNTdHJpZGUsCiAgICAgICAgICAgICBzcmNDcm9wTGVmdCwgc3JjQ3JvcFRvcCwgc3JjQ3JvcFJpZ2h0LCBzcmNDcm9wQm90dG9tLCBtU3JjRm9ybWF0KTsKIAogICAgIEJpdG1hcFBhcmFtcyBkc3QoCiAgICAgICAgICAgICBkc3RCaXRzLAotICAgICAgICAgICAgZHN0V2lkdGgsIGRzdEhlaWdodCwKKyAgICAgICAgICAgIGRzdFdpZHRoLCBkc3RIZWlnaHQsIGRzdFN0cmlkZSwKICAgICAgICAgICAgIGRzdENyb3BMZWZ0LCBkc3RDcm9wVG9wLCBkc3RDcm9wUmlnaHQsIGRzdENyb3BCb3R0b20sIG1Ec3RGb3JtYXQpOwogCiAgICAgaWYgKCEoKHNyYy5tQ3JvcExlZnQgJiAxKSA9PSAwCkBAIC0yMDEsNyArMjQ0LDExIEBACiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOgorI2lmZGVmIFVTRV9MSUJZVVYKKyAgICAgICAgICAgIGVyciA9IGNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVXNlTGliWVVWKHNyYywgZHN0KTsKKyNlbHNlCiAgICAgICAgICAgICBlcnIgPSBjb252ZXJ0WVVWNDIwU2VtaVBsYW5hcihzcmMsIGRzdCk7CisjZW5kaWYKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgT01YX1RJX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXI6CkBAIC0yNzYsNiArMzIzLDEzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCisjZGVmaW5lIERFQ0xBUkVfWVVWMlJHQkZVTkMoZnVuYywgcmdiKSBpbnQgKCpmdW5jKSggICAgIFwKKyAgICAgICAgY29uc3QgdWludDgqLCBpbnQsIGNvbnN0IHVpbnQ4KiwgaW50LCAgICAgICAgICAgXAorICAgICAgICBjb25zdCB1aW50OCosIGludCwgdWludDgqLCBpbnQsIGludCwgaW50KSAgICAgICBcCisgICAgICAgID0gbVNyY0NvbG9yU3BhY2UuaXNCdDcwOSgpID8gbGlieXV2OjpINDIwVG8jI3JnYiBcCisgICAgICAgIDogbVNyY0NvbG9yU3BhY2UuaXNKcGVnKCkgPyBsaWJ5dXY6Oko0MjBUbyMjcmdiICBcCisgICAgICAgIDogbGlieXV2OjpJNDIwVG8jI3JnYgorCiBzdGF0dXNfdCBDb2xvckNvbnZlcnRlcjo6Y29udmVydFlVVjQyMFBsYW5hclVzZUxpYllVVigKICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KSB7CiAgICAgdWludDhfdCAqZHN0X3B0ciA9ICh1aW50OF90ICopZHN0Lm1CaXRzCkBAIC0yOTMsMTkgKzM0NywyOCBAQAogCiAgICAgc3dpdGNoIChtRHN0Rm9ybWF0KSB7CiAgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MTZiaXRSR0I1NjU6Ci0gICAgICAgIGxpYnl1djo6STQyMFRvUkdCNTY1KHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKKyAgICB7CisgICAgICAgIERFQ0xBUkVfWVVWMlJHQkZVTkMoZnVuYywgUkdCNTY1KTsKKyAgICAgICAgKCpmdW5jKShzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSAvIDIsIHNyY192LCBzcmMubVN0cmlkZSAvIDIsCiAgICAgICAgICAgICAgICAgKHVpbnQ4ICopZHN0X3B0ciwgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSk7CiAgICAgICAgIGJyZWFrOworICAgIH0KIAogICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDMyQml0UkdCQTg4ODg6Ci0gICAgICAgIGxpYnl1djo6Q29udmVydEZyb21JNDIwKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKLSAgICAgICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpLCBsaWJ5dXY6OkZPVVJDQ19BQkdSKTsKKyAgICB7CisgICAgICAgIERFQ0xBUkVfWVVWMlJHQkZVTkMoZnVuYywgQUJHUik7CisgICAgICAgICgqZnVuYykoc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUgLyAyLCBzcmNfdiwgc3JjLm1TdHJpZGUgLyAyLAorICAgICAgICAgICAgICAgICh1aW50OCAqKWRzdF9wdHIsIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCkpOwogICAgICAgICBicmVhazsKKyAgICB9CiAKICAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OgotICAgICAgICBsaWJ5dXY6OkNvbnZlcnRGcm9tSTQyMChzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSAvIDIsIHNyY192LCBzcmMubVN0cmlkZSAvIDIsCi0gICAgICAgICAgICAgICAgKHVpbnQ4ICopZHN0X3B0ciwgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSwgbGlieXV2OjpGT1VSQ0NfQVJHQik7CisgICAgeworICAgICAgICBERUNMQVJFX1lVVjJSR0JGVU5DKGZ1bmMsIEFSR0IpOworICAgICAgICAoKmZ1bmMpKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlIC8gMiwgc3JjX3YsIHNyYy5tU3RyaWRlIC8gMiwKKyAgICAgICAgICAgICAgICAodWludDggKilkc3RfcHRyLCBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpKTsKICAgICAgICAgYnJlYWs7CisgICAgfQogCiAgICAgZGVmYXVsdDoKICAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOwpAQCAtMzE0LDYgKzM3Nyw0MSBAQAogICAgIHJldHVybiBPSzsKIH0KIAorc3RhdHVzX3QgQ29sb3JDb252ZXJ0ZXI6OmNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVXNlTGliWVVWKAorICAgICAgICBjb25zdCBCaXRtYXBQYXJhbXMgJnNyYywgY29uc3QgQml0bWFwUGFyYW1zICZkc3QpIHsKKyAgICB1aW50OF90ICpkc3RfcHRyID0gKHVpbnQ4X3QgKilkc3QubUJpdHMKKyAgICAgICAgKyBkc3QubUNyb3BUb3AgKiBkc3QubVN0cmlkZSArIGRzdC5tQ3JvcExlZnQgKiBkc3QubUJwcDsKKworICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0KKyAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilzcmMubUJpdHMgKyBzcmMubUNyb3BUb3AgKiBzcmMubVN0cmlkZSArIHNyYy5tQ3JvcExlZnQ7CisKKyAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1TdHJpZGUgKiBzcmMubUhlaWdodAorICAgICAgICArIChzcmMubUNyb3BUb3AgLyAyKSAqIHNyYy5tU3RyaWRlICsgc3JjLm1Dcm9wTGVmdDsKKworICAgIHN3aXRjaCAobURzdEZvcm1hdCkgeworICAgIGNhc2UgT01YX0NPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OgorICAgICAgICBsaWJ5dXY6Ok5WMTJUb1JHQjU2NShzcmNfeSwgc3JjLm1TdHJpZGUsIHNyY191LCBzcmMubVN0cmlkZSwgKHVpbnQ4ICopZHN0X3B0ciwKKyAgICAgICAgICAgICAgICBkc3QubVN0cmlkZSwgc3JjLmNyb3BXaWR0aCgpLCBzcmMuY3JvcEhlaWdodCgpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIE9NWF9DT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OgorICAgICAgICBsaWJ5dXY6Ok5WMTJUb0FSR0Ioc3JjX3ksIHNyYy5tU3RyaWRlLCBzcmNfdSwgc3JjLm1TdHJpZGUsICh1aW50OCAqKWRzdF9wdHIsCisgICAgICAgICAgICAgICAgZHN0Lm1TdHJpZGUsIHNyYy5jcm9wV2lkdGgoKSwgc3JjLmNyb3BIZWlnaHQoKSk7CisgICAgICAgIGJyZWFrOworCisgICAgY2FzZSBPTVhfQ09MT1JfRm9ybWF0MzJCaXRSR0JBODg4ODoKKyAgICAgICAgbGlieXV2OjpOVjEyVG9BQkdSKHNyY195LCBzcmMubVN0cmlkZSwgc3JjX3UsIHNyYy5tU3RyaWRlLCAodWludDggKilkc3RfcHRyLAorICAgICAgICAgICAgICAgIGRzdC5tU3RyaWRlLCBzcmMuY3JvcFdpZHRoKCksIHNyYy5jcm9wSGVpZ2h0KCkpOworICAgICAgICBicmVhazsKKworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgIH0KKworICAgcmV0dXJuIE9LOworfQorCiBzdGQ6OmZ1bmN0aW9uPHZvaWQgKHZvaWQgKiwgdm9pZCAqLCB2b2lkICosIHNpemVfdCwKICAgICAgICAgICAgICAgICAgICAgc2lnbmVkICosIHNpZ25lZCAqLCBzaWduZWQgKiwgc2lnbmVkICopPgogZ2V0UmVhZEZyb21TcmMoT01YX0NPTE9SX0ZPUk1BVFRZUEUgc3JjRm9ybWF0KSB7CkBAIC03OTMsMTUgKzg5MSwxNSBAQAogCiAgICAgdWludDhfdCAqa0FkanVzdGVkQ2xpcCA9IGluaXRDbGlwKCk7CiAKLSAgICB1aW50MTZfdCAqZHN0X3B0ciA9ICh1aW50MTZfdCAqKWRzdC5tQml0cwotICAgICAgICArIGRzdC5tQ3JvcFRvcCAqIGRzdC5tV2lkdGggKyBkc3QubUNyb3BMZWZ0OworICAgIHVpbnQxNl90ICpkc3RfcHRyID0gKHVpbnQxNl90ICopKCh1aW50OF90ICopCisgICAgICAgICAgICBkc3QubUJpdHMgKyBkc3QubUNyb3BUb3AgKiBkc3QubVN0cmlkZSArIGRzdC5tQ3JvcExlZnQgKiBkc3QubUJwcCk7CiAKICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9Ci0gICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1XaWR0aCArIHNyYy5tQ3JvcExlZnQ7CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1Dcm9wVG9wICogc3JjLm1TdHJpZGUgKyBzcmMubUNyb3BMZWZ0OwogCiAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPQotICAgICAgICAoY29uc3QgdWludDhfdCAqKXNyY195ICsgc3JjLm1XaWR0aCAqIHNyYy5tSGVpZ2h0Ci0gICAgICAgICsgc3JjLm1Dcm9wVG9wICogc3JjLm1XaWR0aCArIHNyYy5tQ3JvcExlZnQ7CisgICAgICAgIChjb25zdCB1aW50OF90ICopc3JjLm1CaXRzICsgc3JjLm1IZWlnaHQgKiBzcmMubVN0cmlkZSArCisgICAgICAgIChzcmMubUNyb3BUb3AgLyAyKSAqIHNyYy5tU3RyaWRlICsgc3JjLm1Dcm9wTGVmdDsKIAogICAgIGZvciAoc2l6ZV90IHkgPSAwOyB5IDwgc3JjLmNyb3BIZWlnaHQoKTsgKyt5KSB7CiAgICAgICAgIGZvciAoc2l6ZV90IHggPSAwOyB4IDwgc3JjLmNyb3BXaWR0aCgpOyB4ICs9IDIpIHsKQEAgLTg0MywxMyArOTQxLDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICBzcmNfeSArPSBzcmMubVdpZHRoOworICAgICAgICBzcmNfeSArPSBzcmMubVN0cmlkZTsKIAogICAgICAgICBpZiAoeSAmIDEpIHsKLSAgICAgICAgICAgIHNyY191ICs9IHNyYy5tV2lkdGg7CisgICAgICAgICAgICBzcmNfdSArPSBzcmMubVN0cmlkZTsKICAgICAgICAgfQogCi0gICAgICAgIGRzdF9wdHIgKz0gZHN0Lm1XaWR0aDsKKyAgICAgICAgZHN0X3B0ciA9ICh1aW50MTZfdCopKCh1aW50OF90Kilkc3RfcHRyICsgZHN0Lm1TdHJpZGUpOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2NvbG9yY29udmVyc2lvbi9Tb2Z0d2FyZVJlbmRlcmVyLmNwcAppbmRleCA2NTdhMDViLi40NzExMzE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9jb2xvcmNvbnZlcnNpb24vU29mdHdhcmVSZW5kZXJlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvY29sb3Jjb252ZXJzaW9uL1NvZnR3YXJlUmVuZGVyZXIuY3BwCkBAIC0zMSw5ICszMSwxNCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXN0YXRpYyBpbnQgQUxJR04oaW50IHgsIGludCB5KSB7Ci0gICAgLy8geSBtdXN0IGJlIGEgcG93ZXIgb2YgMi4KLSAgICByZXR1cm4gKHggKyB5IC0gMSkgJiB+KHkgLSAxKTsKK2lubGluZSB2b2lkIGluaXREc3RZVVYoCisgICAgICAgIGNvbnN0IGFuZHJvaWRfeWNiY3IgJnljYmNyLCBpbnQzMl90IGNyb3BUb3AsIGludDMyX3QgY3JvcExlZnQsCisgICAgICAgIHVpbnQ4X3QgKipkc3RfeSwgdWludDhfdCAqKmRzdF91LCB1aW50OF90ICoqZHN0X3YpIHsKKyAgICAqZHN0X3kgPSAodWludDhfdCAqKXljYmNyLnkgKyBjcm9wVG9wICogeWNiY3IueXN0cmlkZSArIGNyb3BMZWZ0OworCisgICAgaW50MzJfdCBjX29mZnNldCA9IChjcm9wVG9wIC8gMikgKiB5Y2Jjci5jc3RyaWRlICsgY3JvcExlZnQgLyAyOworICAgICpkc3RfdiA9ICh1aW50OF90ICopeWNiY3IuY3IgKyBjX29mZnNldDsKKyAgICAqZHN0X3UgPSAodWludDhfdCAqKXljYmNyLmNiICsgY19vZmZzZXQ7CiB9CiAKIFNvZnR3YXJlUmVuZGVyZXI6OlNvZnR3YXJlUmVuZGVyZXIoCkBAIC00NCw2ICs0OSw3IEBACiAgICAgICBtTmF0aXZlV2luZG93KG5hdGl2ZVdpbmRvdyksCiAgICAgICBtV2lkdGgoMCksCiAgICAgICBtSGVpZ2h0KDApLAorICAgICAgbVN0cmlkZSgwKSwKICAgICAgIG1Dcm9wTGVmdCgwKSwKICAgICAgIG1Dcm9wVG9wKDApLAogICAgICAgbUNyb3BSaWdodCgwKSwKQEAgLTY3LDkgKzczLDEwIEBACiAgICAgaW50MzJfdCBjb2xvckZvcm1hdE5ldzsKICAgICBDSEVDSyhmb3JtYXQtPmZpbmRJbnQzMigiY29sb3ItZm9ybWF0IiwgJmNvbG9yRm9ybWF0TmV3KSk7CiAKLSAgICBpbnQzMl90IHdpZHRoTmV3LCBoZWlnaHROZXc7Ci0gICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZ3aWR0aE5ldykpOworICAgIGludDMyX3Qgd2lkdGhOZXcsIGhlaWdodE5ldywgc3RyaWRlTmV3OworICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJ3aWR0aCIsICZ3aWR0aE5ldykpOwogICAgIENIRUNLKGZvcm1hdC0+ZmluZEludDMyKCJzbGljZS1oZWlnaHQiLCAmaGVpZ2h0TmV3KSk7CisgICAgQ0hFQ0soZm9ybWF0LT5maW5kSW50MzIoInN0cmlkZSIsICZzdHJpZGVOZXcpKTsKIAogICAgIGludDMyX3QgY3JvcExlZnROZXcsIGNyb3BUb3BOZXcsIGNyb3BSaWdodE5ldywgY3JvcEJvdHRvbU5ldzsKICAgICBpZiAoIWZvcm1hdC0+ZmluZFJlY3QoCkBAIC0xMDYsNiArMTEzLDcgQEAKICAgICBtQ29sb3JGb3JtYXQgPSBzdGF0aWNfY2FzdDxPTVhfQ09MT1JfRk9STUFUVFlQRT4oY29sb3JGb3JtYXROZXcpOwogICAgIG1XaWR0aCA9IHdpZHRoTmV3OwogICAgIG1IZWlnaHQgPSBoZWlnaHROZXc7CisgICAgbVN0cmlkZSA9IHN0cmlkZU5ldzsKICAgICBtQ3JvcExlZnQgPSBjcm9wTGVmdE5ldzsKICAgICBtQ3JvcFRvcCA9IGNyb3BUb3BOZXc7CiAgICAgbUNyb3BSaWdodCA9IGNyb3BSaWdodE5ldzsKQEAgLTI2Niw5NyArMjc0LDgzIEBACiAKICAgICBSZWN0IGJvdW5kcyhtQ3JvcFdpZHRoLCBtQ3JvcEhlaWdodCk7CiAKLSAgICB2b2lkICpkc3Q7Ci0gICAgQ0hFQ0tfRVEoMCwgbWFwcGVyLmxvY2soYnVmLT5oYW5kbGUsCi0gICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTkVWRVIgfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX1JBUkVMWSwKLSAgICAgICAgICAgIGJvdW5kcywgJmRzdCkpOworICAgIHZvaWQgKmRzdCA9IE5VTEw7CisgICAgc3RydWN0IGFuZHJvaWRfeWNiY3IgeWNiY3I7CisgICAgaWYgKCAhbUNvbnZlcnRlciAmJgorICAgICAgICAgKG1Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyIHx8CisgICAgICAgICBtQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFNlbWlQbGFuYXIgfHwKKyAgICAgICAgIG1Db2xvckZvcm1hdCA9PSBPTVhfVElfQ09MT1JfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hciB8fAorICAgICAgICAgbUNvbG9yRm9ybWF0ID09IE9NWF9DT0xPUl9Gb3JtYXRZVVY0MjBQbGFuYXIxNikpIHsKKyAgICAgICAgQ0hFQ0tfRVEoMCwgbWFwcGVyLmxvY2tZQ2JDcihidWYtPmhhbmRsZSwKKyAgICAgICAgICAgICAgICBHUkFMTE9DX1VTQUdFX1NXX1JFQURfTkVWRVIgfCBHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX1JBUkVMWSwKKyAgICAgICAgICAgICAgICBib3VuZHMsICZ5Y2JjcikpOworICAgIH0gZWxzZSB7CisgICAgICAgIENIRUNLX0VRKDAsIG1hcHBlci5sb2NrKGJ1Zi0+aGFuZGxlLAorICAgICAgICAgICAgICAgIEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9ORVZFUiB8IEdSQUxMT0NfVVNBR0VfU1dfV1JJVEVfUkFSRUxZLAorICAgICAgICAgICAgICAgIGJvdW5kcywgJmRzdCkpOworICAgIH0KIAogICAgIC8vIFRPRE8gbW92ZSB0aGUgb3RoZXIgY29udmVyc2lvbnMgYWxzbyBpbnRvIENvbG9yQ29udmVydGVyLCBhbmQKICAgICAvLyBmaXggY3JvcHBpbmcgaXNzdWVzICh3aGVuIG1Dcm9wTGVmdC9Ub3AgIT0gMCBvciBtV2lkdGggIT0gbUNyb3BXaWR0aCkKICAgICBpZiAobUNvbnZlcnRlcikgewogICAgICAgICBtQ29udmVydGVyLT5jb252ZXJ0KAogICAgICAgICAgICAgICAgIGRhdGEsCi0gICAgICAgICAgICAgICAgbVdpZHRoLCBtSGVpZ2h0LAorICAgICAgICAgICAgICAgIG1XaWR0aCwgbUhlaWdodCwgbVN0cmlkZSwKICAgICAgICAgICAgICAgICBtQ3JvcExlZnQsIG1Dcm9wVG9wLCBtQ3JvcFJpZ2h0LCBtQ3JvcEJvdHRvbSwKICAgICAgICAgICAgICAgICBkc3QsCi0gICAgICAgICAgICAgICAgYnVmLT5zdHJpZGUsIGJ1Zi0+aGVpZ2h0LAorICAgICAgICAgICAgICAgIGJ1Zi0+c3RyaWRlLCBidWYtPmhlaWdodCwgMCwKICAgICAgICAgICAgICAgICAwLCAwLCBtQ3JvcFdpZHRoIC0gMSwgbUNyb3BIZWlnaHQgLSAxKTsKICAgICB9IGVsc2UgaWYgKG1Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyKSB7Ci0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOwotICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfdSA9Ci0gICAgICAgICAgICAgICAgKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbVdpZHRoICogbUhlaWdodDsKLSAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3YgPSBzcmNfdSArIChtV2lkdGggLyAyICogbUhlaWdodCAvIDIpOworICAgICAgICBjb25zdCB1aW50OF90ICpzcmNfeSA9IChjb25zdCB1aW50OF90ICopZGF0YSArIG1Dcm9wVG9wICogbVN0cmlkZSArIG1Dcm9wTGVmdDsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPSAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtU3RyaWRlICogbUhlaWdodCArIG1Dcm9wVG9wICogbVN0cmlkZSAvIDQ7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY192ID0gKGNvbnN0IHVpbnQ4X3QgKilzcmNfdSArIG1TdHJpZGUgKiBtSGVpZ2h0IC8gNDsKIAotICAgICAgICBzcmNfeSArPW1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoOwotICAgICAgICBzcmNfdSArPShtQ3JvcExlZnQgKyBtQ3JvcFRvcCAqIG1XaWR0aCAvIDIpLzI7Ci0gICAgICAgIHNyY192ICs9KG1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoIC8gMikvMjsKLQotICAgICAgICB1aW50OF90ICpkc3RfeSA9ICh1aW50OF90ICopZHN0OwotICAgICAgICBzaXplX3QgZHN0X3lfc2l6ZSA9IGJ1Zi0+c3RyaWRlICogYnVmLT5oZWlnaHQ7Ci0gICAgICAgIHNpemVfdCBkc3RfY19zdHJpZGUgPSBBTElHTihidWYtPnN0cmlkZSAvIDIsIDE2KTsKLSAgICAgICAgc2l6ZV90IGRzdF9jX3NpemUgPSBkc3RfY19zdHJpZGUgKiBidWYtPmhlaWdodCAvIDI7Ci0gICAgICAgIHVpbnQ4X3QgKmRzdF92ID0gZHN0X3kgKyBkc3RfeV9zaXplOwotICAgICAgICB1aW50OF90ICpkc3RfdSA9IGRzdF92ICsgZHN0X2Nfc2l6ZTsKLQotICAgICAgICBkc3RfeSArPSBtQ3JvcFRvcCAqIGJ1Zi0+c3RyaWRlICsgbUNyb3BMZWZ0OwotICAgICAgICBkc3RfdiArPSAobUNyb3BUb3AvMikgKiBkc3RfY19zdHJpZGUgKyBtQ3JvcExlZnQvMjsKLSAgICAgICAgZHN0X3UgKz0gKG1Dcm9wVG9wLzIpICogZHN0X2Nfc3RyaWRlICsgbUNyb3BMZWZ0LzI7CisgICAgICAgIHVpbnQ4X3QgKmRzdF95LCAqZHN0X3UsICpkc3RfdjsKKyAgICAgICAgaW5pdERzdFlVVih5Y2JjciwgbUNyb3BUb3AsIG1Dcm9wTGVmdCwgJmRzdF95LCAmZHN0X3UsICZkc3Rfdik7CiAKICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBtQ3JvcEhlaWdodDsgKyt5KSB7CiAgICAgICAgICAgICBtZW1jcHkoZHN0X3ksIHNyY195LCBtQ3JvcFdpZHRoKTsKIAotICAgICAgICAgICAgc3JjX3kgKz0gbVdpZHRoOwotICAgICAgICAgICAgZHN0X3kgKz0gYnVmLT5zdHJpZGU7CisgICAgICAgICAgICBzcmNfeSArPSBtU3RyaWRlOworICAgICAgICAgICAgZHN0X3kgKz0geWNiY3IueXN0cmlkZTsKICAgICAgICAgfQogCiAgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgKG1Dcm9wSGVpZ2h0ICsgMSkgLyAyOyArK3kpIHsKICAgICAgICAgICAgIG1lbWNweShkc3RfdSwgc3JjX3UsIChtQ3JvcFdpZHRoICsgMSkgLyAyKTsKICAgICAgICAgICAgIG1lbWNweShkc3Rfdiwgc3JjX3YsIChtQ3JvcFdpZHRoICsgMSkgLyAyKTsKIAotICAgICAgICAgICAgc3JjX3UgKz0gbVdpZHRoIC8gMjsKLSAgICAgICAgICAgIHNyY192ICs9IG1XaWR0aCAvIDI7Ci0gICAgICAgICAgICBkc3RfdSArPSBkc3RfY19zdHJpZGU7Ci0gICAgICAgICAgICBkc3RfdiArPSBkc3RfY19zdHJpZGU7CisgICAgICAgICAgICBzcmNfdSArPSBtU3RyaWRlIC8gMjsKKyAgICAgICAgICAgIHNyY192ICs9IG1TdHJpZGUgLyAyOworICAgICAgICAgICAgZHN0X3UgKz0geWNiY3IuY3N0cmlkZTsKKyAgICAgICAgICAgIGRzdF92ICs9IHljYmNyLmNzdHJpZGU7CiAgICAgICAgIH0KICAgICB9IGVsc2UgaWYgKG1Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwUGxhbmFyMTYpIHsKLSAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY195ID0gKGNvbnN0IHVpbnQxNl90ICopZGF0YTsKLSAgICAgICAgY29uc3QgdWludDE2X3QgKnNyY191ID0gKGNvbnN0IHVpbnQxNl90ICopZGF0YSArIG1XaWR0aCAqIG1IZWlnaHQ7Ci0gICAgICAgIGNvbnN0IHVpbnQxNl90ICpzcmNfdiA9IHNyY191ICsgKG1XaWR0aCAvIDIgKiBtSGVpZ2h0IC8gMik7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY195ID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhICsgbUNyb3BUb3AgKiBtU3RyaWRlICsgbUNyb3BMZWZ0ICogMjsKKyAgICAgICAgY29uc3QgdWludDhfdCAqc3JjX3UgPSAoY29uc3QgdWludDhfdCAqKWRhdGEgKyBtU3RyaWRlICogbUhlaWdodCArIG1Dcm9wVG9wICogbVN0cmlkZSAvIDQ7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnNyY192ID0gKGNvbnN0IHVpbnQ4X3QgKilzcmNfdSArIG1TdHJpZGUgKiBtSGVpZ2h0IC8gNDsKIAotICAgICAgICBzcmNfeSArPSBtQ3JvcExlZnQgKyBtQ3JvcFRvcCAqIG1XaWR0aDsKLSAgICAgICAgc3JjX3UgKz0gKG1Dcm9wTGVmdCArIG1Dcm9wVG9wICogbVdpZHRoIC8gMikgLyAyOwotICAgICAgICBzcmNfdiArPSAobUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGggLyAyKSAvIDI7Ci0KLSAgICAgICAgdWludDhfdCAqZHN0X3kgPSAodWludDhfdCAqKWRzdDsKLSAgICAgICAgc2l6ZV90IGRzdF95X3NpemUgPSBidWYtPnN0cmlkZSAqIGJ1Zi0+aGVpZ2h0OwotICAgICAgICBzaXplX3QgZHN0X2Nfc3RyaWRlID0gQUxJR04oYnVmLT5zdHJpZGUgLyAyLCAxNik7Ci0gICAgICAgIHNpemVfdCBkc3RfY19zaXplID0gZHN0X2Nfc3RyaWRlICogYnVmLT5oZWlnaHQgLyAyOwotICAgICAgICB1aW50OF90ICpkc3RfdiA9IGRzdF95ICsgZHN0X3lfc2l6ZTsKLSAgICAgICAgdWludDhfdCAqZHN0X3UgPSBkc3RfdiArIGRzdF9jX3NpemU7Ci0KLSAgICAgICAgZHN0X3kgKz0gbUNyb3BUb3AgKiBidWYtPnN0cmlkZSArIG1Dcm9wTGVmdDsKLSAgICAgICAgZHN0X3YgKz0gKG1Dcm9wVG9wIC8gMikgKiBkc3RfY19zdHJpZGUgKyBtQ3JvcExlZnQgLyAyOwotICAgICAgICBkc3RfdSArPSAobUNyb3BUb3AgLyAyKSAqIGRzdF9jX3N0cmlkZSArIG1Dcm9wTGVmdCAvIDI7CisgICAgICAgIHVpbnQ4X3QgKmRzdF95LCAqZHN0X3UsICpkc3RfdjsKKyAgICAgICAgaW5pdERzdFlVVih5Y2JjciwgbUNyb3BUb3AsIG1Dcm9wTGVmdCwgJmRzdF95LCAmZHN0X3UsICZkc3Rfdik7CiAKICAgICAgICAgZm9yIChpbnQgeSA9IDA7IHkgPCBtQ3JvcEhlaWdodDsgKyt5KSB7CiAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IG1Dcm9wV2lkdGg7ICsreCkgewotICAgICAgICAgICAgICAgIGRzdF95W3hdID0gKHVpbnQ4X3QpKHNyY195W3hdID4+IDIpOworICAgICAgICAgICAgICAgIGRzdF95W3hdID0gKHVpbnQ4X3QpKCgodWludDE2X3QgKilzcmNfeSlbeF0gPj4gMik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHNyY195ICs9IG1XaWR0aDsKLSAgICAgICAgICAgIGRzdF95ICs9IGJ1Zi0+c3RyaWRlOworICAgICAgICAgICAgc3JjX3kgKz0gbVN0cmlkZTsKKyAgICAgICAgICAgIGRzdF95ICs9IHljYmNyLnlzdHJpZGU7CiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IChtQ3JvcEhlaWdodCArIDEpIC8gMjsgKyt5KSB7CiAgICAgICAgICAgICBmb3IgKGludCB4ID0gMDsgeCA8IChtQ3JvcFdpZHRoICsgMSkgLyAyOyArK3gpIHsKLSAgICAgICAgICAgICAgICBkc3RfdVt4XSA9ICh1aW50OF90KShzcmNfdVt4XSA+PiAyKTsKLSAgICAgICAgICAgICAgICBkc3Rfdlt4XSA9ICh1aW50OF90KShzcmNfdlt4XSA+PiAyKTsKKyAgICAgICAgICAgICAgICBkc3RfdVt4XSA9ICh1aW50OF90KSgoKHVpbnQxNl90ICopc3JjX3UpW3hdID4+IDIpOworICAgICAgICAgICAgICAgIGRzdF92W3hdID0gKHVpbnQ4X3QpKCgodWludDE2X3QgKilzcmNfdilbeF0gPj4gMik7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIHNyY191ICs9IG1XaWR0aCAvIDI7Ci0gICAgICAgICAgICBzcmNfdiArPSBtV2lkdGggLyAyOwotICAgICAgICAgICAgZHN0X3UgKz0gZHN0X2Nfc3RyaWRlOwotICAgICAgICAgICAgZHN0X3YgKz0gZHN0X2Nfc3RyaWRlOworICAgICAgICAgICAgc3JjX3UgKz0gbVN0cmlkZSAvIDI7CisgICAgICAgICAgICBzcmNfdiArPSBtU3RyaWRlIC8gMjsKKyAgICAgICAgICAgIGRzdF91ICs9IHljYmNyLmNzdHJpZGU7CisgICAgICAgICAgICBkc3RfdiArPSB5Y2Jjci5jc3RyaWRlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtQ29sb3JGb3JtYXQgPT0gT01YX1RJX0NPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFNlbWlQbGFuYXIKICAgICAgICAgICAgIHx8IG1Db2xvckZvcm1hdCA9PSBPTVhfQ09MT1JfRm9ybWF0WVVWNDIwU2VtaVBsYW5hcikgewpAQCAtMzY3LDIzICszNjEsMTQgQEAKICAgICAgICAgc3JjX3kgKz0gbUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGg7CiAgICAgICAgIHNyY191diArPSAobUNyb3BMZWZ0ICsgbUNyb3BUb3AgKiBtV2lkdGgpIC8gMjsKIAotICAgICAgICB1aW50OF90ICpkc3RfeSA9ICh1aW50OF90ICopZHN0OwotCi0gICAgICAgIHNpemVfdCBkc3RfeV9zaXplID0gYnVmLT5zdHJpZGUgKiBidWYtPmhlaWdodDsKLSAgICAgICAgc2l6ZV90IGRzdF9jX3N0cmlkZSA9IEFMSUdOKGJ1Zi0+c3RyaWRlIC8gMiwgMTYpOwotICAgICAgICBzaXplX3QgZHN0X2Nfc2l6ZSA9IGRzdF9jX3N0cmlkZSAqIGJ1Zi0+aGVpZ2h0IC8gMjsKLSAgICAgICAgdWludDhfdCAqZHN0X3YgPSBkc3RfeSArIGRzdF95X3NpemU7Ci0gICAgICAgIHVpbnQ4X3QgKmRzdF91ID0gZHN0X3YgKyBkc3RfY19zaXplOwotCi0gICAgICAgIGRzdF95ICs9IG1Dcm9wVG9wICogYnVmLT5zdHJpZGUgKyBtQ3JvcExlZnQ7Ci0gICAgICAgIGRzdF92ICs9IChtQ3JvcFRvcC8yKSAqIGRzdF9jX3N0cmlkZSArIG1Dcm9wTGVmdC8yOwotICAgICAgICBkc3RfdSArPSAobUNyb3BUb3AvMikgKiBkc3RfY19zdHJpZGUgKyBtQ3JvcExlZnQvMjsKKyAgICAgICAgdWludDhfdCAqZHN0X3ksICpkc3RfdSwgKmRzdF92OworICAgICAgICBpbml0RHN0WVVWKHljYmNyLCBtQ3JvcFRvcCwgbUNyb3BMZWZ0LCAmZHN0X3ksICZkc3RfdSwgJmRzdF92KTsKIAogICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IG1Dcm9wSGVpZ2h0OyArK3kpIHsKICAgICAgICAgICAgIG1lbWNweShkc3RfeSwgc3JjX3ksIG1Dcm9wV2lkdGgpOwogCiAgICAgICAgICAgICBzcmNfeSArPSBtV2lkdGg7Ci0gICAgICAgICAgICBkc3RfeSArPSBidWYtPnN0cmlkZTsKKyAgICAgICAgICAgIGRzdF95ICs9IHljYmNyLnlzdHJpZGU7CiAgICAgICAgIH0KIAogICAgICAgICBmb3IgKGludCB5ID0gMDsgeSA8IChtQ3JvcEhlaWdodCArIDEpIC8gMjsgKyt5KSB7CkBAIC0zOTQsOCArMzc5LDggQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgc3JjX3V2ICs9IG1XaWR0aDsKLSAgICAgICAgICAgIGRzdF91ICs9IGRzdF9jX3N0cmlkZTsKLSAgICAgICAgICAgIGRzdF92ICs9IGRzdF9jX3N0cmlkZTsKKyAgICAgICAgICAgIGRzdF91ICs9IHljYmNyLmNzdHJpZGU7CisgICAgICAgICAgICBkc3RfdiArPSB5Y2Jjci5jc3RyaWRlOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtQ29sb3JGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdDI0Yml0UkdCODg4KSB7CiAgICAgICAgIHVpbnQ4X3QqIHNyY1B0ciA9ICh1aW50OF90KilkYXRhICsgbVdpZHRoICogbUNyb3BUb3AgKiAzICsgbUNyb3BMZWZ0ICogMzsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTZiNGIzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNiBAQAorcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAibWVkaWFzd2NvZGVjLnhtbCIsCisgICAgc3JjOiAibWVkaWFfY29kZWNzX3N3LnhtbCIsCisgICAgZmlsZW5hbWU6ICJtZWRpYV9jb2RlY3MueG1sIiwKKyAgICBpbnN0YWxsYWJsZTogZmFsc2UsCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYXVkaW8ueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2F1ZGlvLnhtbAppbmRleCA2MzIwODhhLi44ODk5YWRjIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYXVkaW8ueG1sCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9hdWRpby54bWwKQEAgLTU4LDcgKzU4LDcgQEAKICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJPTVguZ29vZ2xlLnJhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9yYXciPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iOCIgLz4KLSAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTk2MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAtMTkyMDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEwMDAwMDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9Ik9NWC5nb29nbGUuZmxhYy5kZWNvZGVyIiB0eXBlPSJhdWRpby9mbGFjIj4KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl9hdWRpby54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfYXVkaW8ueG1sCmluZGV4IDBiNTU0YTIuLjUwOWY3YTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl9hdWRpby54bWwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX2F1ZGlvLnhtbApAQCAtMTcsNTEgKzE3LDYxIEBACiA8SW5jbHVkZWQ+CiAgICAgPERlY29kZXJzPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm1wMy5kZWNvZGVyIiB0eXBlPSJhdWRpby9tcGVnIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLm1wMy5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLDExMDI1LDEyMDAwLDE2MDAwLDIyMDUwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI4MDAwLTMyMDAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFtcm5iLmRlY29kZXIiIHR5cGU9ImF1ZGlvLzNncHAiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuYW1ybmIuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNDc1MC0xMjIwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFtcndiLmRlY29kZXIiIHR5cGU9ImF1ZGlvL2Ftci13YiI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hbXJ3Yi5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSIxNjAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjYwMC0yMzg1MCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFhYy5kZWNvZGVyIiB0eXBlPSJhdWRpby9tcDRhLWxhdG0iPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuYWFjLmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjczNTAsODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iODAwMC05NjAwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5nNzExLmFsYXcuZGVjb2RlciIgdHlwZT0iYXVkaW8vZzcxMS1hbGF3Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmc3MTEuYWxhdy5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTQ4MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NDAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmc3MTEubWxhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9nNzExLW1sYXciPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuZzcxMS5tbGF3LmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAtNDgwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY0MDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQudm9yYmlzLmRlY29kZXIiIHR5cGU9ImF1ZGlvL3ZvcmJpcyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS52b3JiaXMuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMC05NjAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMzIwMDAtNTAwMDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQub3B1cy5kZWNvZGVyIiB0eXBlPSJhdWRpby9vcHVzIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLm9wdXMuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iNDgwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjYwMDAtNTEwMDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQucmF3LmRlY29kZXIiIHR5cGU9ImF1ZGlvL3JhdyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5yYXcuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+Ci0gICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMC05NjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTE5MjAwMCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmZsYWMuZGVjb2RlciIgdHlwZT0iYXVkaW8vZmxhYyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5mbGFjLmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjEtNjU1MzUwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIxMDAwMDAwIiAvPgpAQCAtNjksMjkgKzc5LDQwIEBACiAgICAgPC9EZWNvZGVycz4KICAgICA8RW5jb2RlcnM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYWFjLmVuY29kZXIiIHR5cGU9ImF1ZGlvL21wNGEtbGF0bSI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hYWMuZW5jb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjYiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIgLz4KICAgICAgICAgICAgIDwhLS0gYWxzbyBtYXkgc3VwcG9ydCA2NDAwMCwgODgyMDAgIGFuZCA5NjAwMCBIeiAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iODAwMC05NjAwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hbXJuYi5lbmNvZGVyIiB0eXBlPSJhdWRpby8zZ3BwIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmFtcm5iLmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjQ3NTAtMTIyMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ0JSIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYW1yd2IuZW5jb2RlciIgdHlwZT0iYXVkaW8vYW1yLXdiIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmFtcndiLmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjE2MDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NjAwLTIzODUwIiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IkNCUiIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmZsYWMuZW5jb2RlciIgdHlwZT0iYXVkaW8vZmxhYyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5mbGFjLmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjEtNjU1MzUwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIxMDAwMDAwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNvbXBsZXhpdHkiIHJhbmdlPSIwLTgiICBkZWZhdWx0PSI1IiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IkNRIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQub3B1cy5lbmNvZGVyIiB0eXBlPSJhdWRpby9vcHVzIj4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCwxMjAwMCwxNjAwMCwyNDAwMCw0ODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNTAwLTUxMjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjb21wbGV4aXR5IiByYW5nZT0iMC0xMCIgIGRlZmF1bHQ9IjUiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iQ0JSIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgPC9FbmNvZGVycz4KIDwvSW5jbHVkZWQ+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdGVsZXBob255LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl90ZWxlcGhvbnkueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1MGIwOTIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdGVsZXBob255LnhtbApAQCAtMCwwICsxLDI2IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPEluY2x1ZGVkPgorICAgIDxEZWNvZGVycz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5nc20uZGVjb2RlciIgdHlwZT0iYXVkaW8vZ3NtIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmdzbS5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxMzAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRGVjb2RlcnM+Cis8L0luY2x1ZGVkPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3R2LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl90di54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWIwMGRjOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl90di54bWwKQEAgLTAsMCArMSwzMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiID8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxJbmNsdWRlZD4KKyAgICA8RGVjb2RlcnM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQubXBlZzIuZGVjb2RlciIgdHlwZT0idmlkZW8vbXBlZzIiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUubXBlZzIuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxITCAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjE5MjB4MTA4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0yNDQ4MDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRGVjb2RlcnM+Cis8L0luY2x1ZGVkPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3ZpZGVvLnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2RhdGEvbWVkaWFfY29kZWNzX2dvb2dsZV9jMl92aWRlby54bWwKaW5kZXggYWRiNDViMy4uMDQwNDFlYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3NfZ29vZ2xlX2MyX3ZpZGVvLnhtbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19nb29nbGVfYzJfdmlkZW8ueG1sCkBAIC0xNyw2ICsxNyw3IEBACiA8SW5jbHVkZWQ+CiAgICAgPERlY29kZXJzPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm1wZWc0LmRlY29kZXIiIHR5cGU9InZpZGVvL21wNHYtZXMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUubXBlZzQuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVTaW1wbGUgOiBMZXZlbDMgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMzUyeDI4OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CkBAIC0yNiw2ICsyNyw3IEBACiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmgyNjMuZGVjb2RlciIgdHlwZT0idmlkZW8vM2dwcCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5oMjYzLmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDMwLCBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDQ1CiAgICAgICAgICAgICAgICAgICAgIFByb2ZpbGVJU1dWMiA6IExldmVsMzAsIFByb2ZpbGVJU1dWMiA6IExldmVsNDUgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMzUyeDI4OCIgLz4KQEAgLTM0LDYgKzM2LDcgQEAKICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiIHR5cGU9InZpZGVvL2F2YyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5oMjY0LmRlY29kZXIiIC8+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlSGlnaCA6IExldmVsNTIgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iNDA4MHg0MDgwIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KQEAgLTQ0LDYgKzQ3LDcgQEAKICAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuaGV2Yy5kZWNvZGVyIiB0eXBlPSJ2aWRlby9oZXZjIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmhldmMuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTWFpblRpZXJMZXZlbDUxIC0tPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjQwOTZ4NDA5NiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CkBAIC01NCw2ICs1OCw3IEBACiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KICAgICAgICAgPC9NZWRpYUNvZGVjPgogICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOC5kZWNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA4Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLnZwOC5kZWNvZGVyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgpAQCAtNjMsNiArNjgsNyBAQAogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC52cDkuZGVjb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOSI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS52cDkuZGVjb2RlciIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KQEAgLTcxLDE2ICs3NywyNyBAQAogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQwMDAwMDAwIiAvPgogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hdjEuZGVjb2RlciIgdHlwZT0idmlkZW8vYXYwMSI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSI5Nng5NiIgbWF4PSIxOTIweDEwODAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgbWluPSIyNCIgbWF4PSIyMDczNjAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEyMDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJmcmFtZS1yYXRlIiByYW5nZT0iMS02MCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgPC9EZWNvZGVycz4KIAogICAgIDxFbmNvZGVycz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5oMjYzLmVuY29kZXIiIHR5cGU9InZpZGVvLzNncHAiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuaDI2My5lbmNvZGVyIiAvPgogICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWw0NSAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE3NngxNDQiIG1heD0iMTc2eDE0NCIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIxNngxNiIgLz4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMjgwMDAiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hdmMuZW5jb2RlciIgdHlwZT0idmlkZW8vYXZjIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmgyNjQuZW5jb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsNDEgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgpAQCAtOTAsNyArMTA3LDIxIEBACiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTIwMDAwMDAiIC8+CiAgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJpbnRyYS1yZWZyZXNoIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuaGV2Yy5lbmNvZGVyIiB0eXBlPSJ2aWRlby9oZXZjIj4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTWFpblRpZXJMZXZlbDUxIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjUxMng1MTIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLXNpemUiIHZhbHVlPSI4eDgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTQwOTYiIC8+IDwhLS0gbWF4IDUxMng1MTIgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTEyMjg4MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJmcmFtZS1yYXRlIiByYW5nZT0iMS0xMjAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTAwMDAwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY29tcGxleGl0eSIgcmFuZ2U9IjAtMTAiICBkZWZhdWx0PSIwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InF1YWxpdHkiIHJhbmdlPSIwLTEwMCIgIGRlZmF1bHQ9IjgwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IlZCUixDQlIsQ1EiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5tcGVnNC5lbmNvZGVyIiB0eXBlPSJ2aWRlby9tcDR2LWVzIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLm1wZWc0LmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQ29yZSA6IExldmVsMiAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjE3NngxNDQiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMTZ4MTYiIC8+CkBAIC05OSw2ICsxMzAsNyBAQAogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTY0MDAwIiAvPgogICAgICAgICA8L01lZGlhQ29kZWM+CiAgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQudnA4LmVuY29kZXIiIHR5cGU9InZpZGVvL3gtdm5kLm9uMi52cDgiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUudnA4LmVuY29kZXIiIC8+CiAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlTWFpbiA6IExldmVsX1ZlcnNpb24wLTMgLS0+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgogICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KQEAgLTEwOSw2ICsxNDEsNyBAQAogICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IlZCUixDQlIiIC8+CiAgICAgICAgIDwvTWVkaWFDb2RlYz4KICAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC52cDkuZW5jb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOSI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS52cDkuZW5jb2RlciIgLz4KICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxfVmVyc2lvbjAtMyAtLT4KICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CiAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYWxpZ25tZW50IiB2YWx1ZT0iMngyIiAvPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3Nfc3cueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZGF0YS9tZWRpYV9jb2RlY3Nfc3cueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZDNmMWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9kYXRhL21lZGlhX2NvZGVjc19zdy54bWwKQEAgLTAsMCArMSwzMjIgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04IiA/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8TWVkaWFDb2RlY3M+CisgICAgPFNldHRpbmdzPgorICAgICAgICA8IS0tIGRpc2FibGUgVFYgYW5kIHRlbGVwaG9ueSBkb21haW5zIGJ5IGRlZmF1bHQuIFRoZXNlIG11c3QgYmUgb3B0ZWQgaW4gYnkgT0VNcyAtLT4KKyAgICAgICAgPERvbWFpbiBuYW1lPSJ0ZWxlcGhvbnkiIGVuYWJsZWQ9ImZhbHNlIiAvPgorICAgICAgICA8RG9tYWluIG5hbWU9InR2IiBlbmFibGVkPSJmYWxzZSIgLz4KKyAgICAgICAgPFZhcmlhbnQgbmFtZT0ic2xvdy1jcHUiIGVuYWJsZWQ9ImZhbHNlIiAvPgorICAgIDwvU2V0dGluZ3M+CisgICAgPERlY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm1wMy5kZWNvZGVyIiB0eXBlPSJhdWRpby9tcGVnIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLm1wMy5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLDExMDI1LDEyMDAwLDE2MDAwLDIyMDUwLDI0MDAwLDMyMDAwLDQ0MTAwLDQ4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI4MDAwLTMyMDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFtcm5iLmRlY29kZXIiIHR5cGU9ImF1ZGlvLzNncHAiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuYW1ybmIuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjEiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNDc1MC0xMjIwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFtcndiLmRlY29kZXIiIHR5cGU9ImF1ZGlvL2Ftci13YiI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hbXJ3Yi5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSIxNjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjYwMC0yMzg1MCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFhYy5kZWNvZGVyIiB0eXBlPSJhdWRpby9tcDRhLWxhdG0iPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuYWFjLmRlY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjczNTAsODAwMCwxMTAyNSwxMjAwMCwxNjAwMCwyMjA1MCwyNDAwMCwzMjAwMCw0NDEwMCw0ODAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iODAwMC05NjAwMDAiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5nNzExLmFsYXcuZGVjb2RlciIgdHlwZT0iYXVkaW8vZzcxMS1hbGF3Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmc3MTEuYWxhdy5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwLTQ4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI2NDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmc3MTEubWxhdy5kZWNvZGVyIiB0eXBlPSJhdWRpby9nNzExLW1sYXciPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuZzcxMS5tbGF3LmRlY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAtNDgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjY0MDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQudm9yYmlzLmRlY29kZXIiIHR5cGU9ImF1ZGlvL3ZvcmJpcyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS52b3JiaXMuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMC05NjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMzIwMDAtNTAwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQub3B1cy5kZWNvZGVyIiB0eXBlPSJhdWRpby9vcHVzIj4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLm9wdXMuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iNDgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjYwMDAtNTEwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQucmF3LmRlY29kZXIiIHR5cGU9ImF1ZGlvL3JhdyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5yYXcuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjaGFubmVsLWNvdW50IiBtYXg9IjgiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2FtcGxlLXJhdGUiIHJhbmdlcz0iODAwMC05NjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmZsYWMuZGVjb2RlciIgdHlwZT0iYXVkaW8vZmxhYyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5mbGFjLmRlY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjEtNjU1MzUwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTIxMDAwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuZ3NtLmRlY29kZXIiIHR5cGU9ImF1ZGlvL2dzbSIgZG9tYWluPSJ0ZWxlcGhvbnkiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuZ3NtLmRlY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIxIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEzMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQubXBlZzQuZGVjb2RlciIgdHlwZT0idmlkZW8vbXA0di1lcyI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5tcGVnNC5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZVNpbXBsZSA6IExldmVsMyAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIzNTJ4Mjg4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxMi0xMTg4MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0zODQwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmgyNjMuZGVjb2RlciIgdHlwZT0idmlkZW8vM2dwcCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5oMjYzLmRlY29kZXIiIC8+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDMwLCBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDQ1CisgICAgICAgICAgICAgICAgICAgIFByb2ZpbGVJU1dWMiA6IExldmVsMzAsIFByb2ZpbGVJU1dWMiA6IExldmVsNDUgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMzUyeDI4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMzg0MDAwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5hdmMuZGVjb2RlciIgdHlwZT0idmlkZW8vYXZjIiB2YXJpYW50PSJzbG93LWNwdSwhc2xvdy1jcHUiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuaDI2NC5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8VmFyaWFudCBuYW1lPSIhc2xvdy1jcHUiPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSI0MDgweDQwODAiIC8+CisgICAgICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUhpZ2ggOiBMZXZlbDUyIC0tPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMzI3NjgiIC8+IDwhLS0gbWF4IDQwOTZ4MjA0OCBlcXVpdmFsZW50IC0tPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTk2NjA4MCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDgwMDAwMDAiIC8+CisgICAgICAgICAgICA8L1ZhcmlhbnQ+CisgICAgICAgICAgICA8VmFyaWFudCBuYW1lPSJzbG93LWNwdSI+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KKyAgICAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlSGlnaCA6IExldmVsNTEgLS0+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0xNjM4NCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTQ5MTUyMCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CisgICAgICAgICAgICA8L1ZhcmlhbnQ+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmhldmMuZGVjb2RlciIgdHlwZT0idmlkZW8vaGV2YyIgdmFyaWFudD0ic2xvdy1jcHUsIXNsb3ctY3B1Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmhldmMuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9Ijh4OCIgLz4KKyAgICAgICAgICAgIDxWYXJpYW50IG5hbWU9IiFzbG93LWNwdSI+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjQwOTZ4NDA5NiIgLz4KKyAgICAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlTWFpbiA6IE1haW5UaWVyTGV2ZWw1MSAtLT4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTE5NjYwOCIgLz4gPCEtLSBtYXggNDA5NngzMDcyIC0tPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMjAwMDAwMCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTAwMDAwMDAiIC8+CisgICAgICAgICAgICA8L1ZhcmlhbnQ+CisgICAgICAgICAgICA8VmFyaWFudCBuYW1lPSJzbG93LWNwdSI+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KKyAgICAgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlTWFpbiA6IE1haW5UaWVyTGV2ZWw1MSAtLT4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTY1NTM2IiAvPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtNDkxNTIwIiAvPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS01MDAwMDAwIiAvPgorICAgICAgICAgICAgPC9WYXJpYW50PgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYWRhcHRpdmUtcGxheWJhY2siIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC52cDguZGVjb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOCIgdmFyaWFudD0ic2xvdy1jcHUsIXNsb3ctY3B1Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLnZwOC5kZWNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMngyIiBtYXg9IjIwNDh4MjA0OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPFZhcmlhbnQgbmFtZT0iIXNsb3ctY3B1Ij4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTE2Mzg0IiAvPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTAwMDAwMCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CisgICAgICAgICAgICA8L1ZhcmlhbnQ+CisgICAgICAgICAgICA8VmFyaWFudCBuYW1lPSJzbG93LWNwdSI+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS04MTkyIiAvPiA8IS0tIG1heCAyMDQ4eDEwMjQgLS0+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0xMDAwMDAwIiAvPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDwvVmFyaWFudD4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQudnA5LmRlY29kZXIiIHR5cGU9InZpZGVvL3gtdm5kLm9uMi52cDkiIHZhcmlhbnQ9InNsb3ctY3B1LCFzbG93LWNwdSI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS52cDkuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPFZhcmlhbnQgbmFtZT0iIXNsb3ctY3B1Ij4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMTYzODQiIC8+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS01MDAwMDAiIC8+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTQwMDAwMDAwIiAvPgorICAgICAgICAgICAgPC9WYXJpYW50PgorICAgICAgICAgICAgPFZhcmlhbnQgbmFtZT0ic2xvdy1jcHUiPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIxMjgweDEyODAiIC8+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2NrLWNvdW50IiByYW5nZT0iMS0zNjAwIiAvPiA8IS0tIG1heCAxMjgweDcyMCAtLT4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTEwODAwMCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNTAwMDAwMCIgLz4KKyAgICAgICAgICAgIDwvVmFyaWFudD4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYXYxLmRlY29kZXIiIHR5cGU9InZpZGVvL2F2MDEiIHZhcmlhbnQ9IiFzbG93LWNwdSI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMTkyMHgxMDgwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTE2Mzg0IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0yMDczNjAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEyMDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImFkYXB0aXZlLXBsYXliYWNrIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQubXBlZzIuZGVjb2RlciIgdHlwZT0idmlkZW8vbXBlZzIiIGRvbWFpbj0idHYiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUubXBlZzIuZGVjb2RlciIgLz4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxITCAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjE2eDE2IiBtYXg9IjE5MjB4MTA4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS0yNDQ4MDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJhZGFwdGl2ZS1wbGF5YmFjayIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRGVjb2RlcnM+CisgICAgPEVuY29kZXJzPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFhYy5lbmNvZGVyIiB0eXBlPSJhdWRpby9tcDRhLWxhdG0iPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuYWFjLmVuY29kZXIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSI2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAsMTEwMjUsMTIwMDAsMTYwMDAsMjIwNTAsMjQwMDAsMzIwMDAsNDQxMDAsNDgwMDAiIC8+CisgICAgICAgICAgICA8IS0tIGFsc28gbWF5IHN1cHBvcnQgNjQwMDAsIDg4MjAwICBhbmQgOTYwMDAgSHogLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjgwMDAtOTYwMDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYW1ybmIuZW5jb2RlciIgdHlwZT0iYXVkaW8vM2dwcCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hbXJuYi5lbmNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSI4MDAwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSI0NzUwLTEyMjAwIiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IkNCUiIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmFtcndiLmVuY29kZXIiIHR5cGU9ImF1ZGlvL2Ftci13YiI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5hbXJ3Yi5lbmNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMSIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSIxNjAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iNjYwMC0yMzg1MCIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJDQlIiIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC5mbGFjLmVuY29kZXIiIHR5cGU9ImF1ZGlvL2ZsYWMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUuZmxhYy5lbmNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImNoYW5uZWwtY291bnQiIG1heD0iMiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzYW1wbGUtcmF0ZSIgcmFuZ2VzPSIxLTY1NTM1MCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMTAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjb21wbGV4aXR5IiByYW5nZT0iMC04IiAgZGVmYXVsdD0iNSIgLz4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJDUSIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm9wdXMuZW5jb2RlciIgdHlwZT0iYXVkaW8vb3B1cyI+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY2hhbm5lbC1jb3VudCIgbWF4PSIyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNhbXBsZS1yYXRlIiByYW5nZXM9IjgwMDAsMTIwMDAsMTYwMDAsMjQwMDAsNDgwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjUwMC01MTIwMDAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iY29tcGxleGl0eSIgcmFuZ2U9IjAtMTAiICBkZWZhdWx0PSI1IiAvPgorICAgICAgICAgICAgPEZlYXR1cmUgbmFtZT0iYml0cmF0ZS1tb2RlcyIgdmFsdWU9IkNCUiIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLmgyNjMuZW5jb2RlciIgdHlwZT0idmlkZW8vM2dwcCI+CisgICAgICAgICAgICA8QWxpYXMgbmFtZT0iT01YLmdvb2dsZS5oMjYzLmVuY29kZXIiIC8+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlQmFzZWxpbmUgOiBMZXZlbDQ1IC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTc2eDE0NCIgbWF4PSIxNzZ4MTQ0IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTEyODAwMCIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLm1wZWc0LmVuY29kZXIiIHR5cGU9InZpZGVvL21wNHYtZXMiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUubXBlZzQuZW5jb2RlciIgLz4KKyAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVDb3JlIDogTGV2ZWwyIC0tPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iMTc2eDE0NCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIxNngxNiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxMi0xNDg1IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJpdHJhdGUiIHJhbmdlPSIxLTY0MDAwIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuYXZjLmVuY29kZXIiIHR5cGU9InZpZGVvL2F2YyIgdmFyaWFudD0ic2xvdy1jcHUsIXNsb3ctY3B1Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLmgyNjQuZW5jb2RlciIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9IjE2eDE2IiAvPgorICAgICAgICAgICAgPFZhcmlhbnQgbmFtZT0iIXNsb3ctY3B1Ij4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIxNngxNiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZUJhc2VsaW5lIDogTGV2ZWw0MSAtLT4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTgxOTIiIC8+IDwhLS0gbWF4IDIwNDh4MTAyNCAtLT4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2tzLXBlci1zZWNvbmQiIHJhbmdlPSIxLTI0NTc2MCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMTIwMDAwMDAiIC8+CisgICAgICAgICAgICA8L1ZhcmlhbnQ+CisgICAgICAgICAgICA8VmFyaWFudCBuYW1lPSJzbG93LWNwdSI+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9InNpemUiIG1pbj0iMTZ4MTYiIG1heD0iMTgwOHgxODA4IiAvPgorICAgICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVCYXNlbGluZSA6IExldmVsMyAtLT4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTE2MjAiIC8+CisgICAgICAgICAgICAgICAgPExpbWl0IG5hbWU9ImJsb2Nrcy1wZXItc2Vjb25kIiByYW5nZT0iMS00MDUwMCIgLz4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtMjAwMDAwMCIgLz4KKyAgICAgICAgICAgIDwvVmFyaWFudD4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImludHJhLXJlZnJlc2giIC8+CisgICAgICAgIDwvTWVkaWFDb2RlYz4KKyAgICAgICAgPE1lZGlhQ29kZWMgbmFtZT0iYzIuYW5kcm9pZC52cDguZW5jb2RlciIgdHlwZT0idmlkZW8veC12bmQub24yLnZwOCIgdmFyaWFudD0ic2xvdy1jcHUsIXNsb3ctY3B1Ij4KKyAgICAgICAgICAgIDxBbGlhcyBuYW1lPSJPTVguZ29vZ2xlLnZwOC5lbmNvZGVyIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8VmFyaWFudCBuYW1lPSIhc2xvdy1jcHUiPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJzaXplIiBtaW49IjJ4MiIgbWF4PSIyMDQ4eDIwNDgiIC8+CisgICAgICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBMZXZlbF9WZXJzaW9uMC0zIC0tPgorICAgICAgICAgICAgICAgIDwhLS0gMjAxNiBkZXZpY2VzIGNhbiBlbmNvZGUgYXQgYWJvdXQgMTBmcHMgYXQgdGhpcyBibG9jayBjb3VudCAtLT4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTE2Mzg0IiAvPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS00MDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDwvVmFyaWFudD4KKyAgICAgICAgICAgIDxWYXJpYW50IG5hbWU9InNsb3ctY3B1Ij4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMTI4MHgxMjgwIiAvPgorICAgICAgICAgICAgICAgIDwhLS0gcHJvZmlsZXMgYW5kIGxldmVsczogIFByb2ZpbGVNYWluIDogTGV2ZWxfVmVyc2lvbjAtMyAtLT4KKyAgICAgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stY291bnQiIHJhbmdlPSIxLTM2MDAiIC8+IDwhLS0gbWF4IDEyODB4NzIwIC0tPgorICAgICAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0yMDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDwvVmFyaWFudD4KKyAgICAgICAgICAgIDxGZWF0dXJlIG5hbWU9ImJpdHJhdGUtbW9kZXMiIHZhbHVlPSJWQlIsQ0JSIiAvPgorICAgICAgICA8L01lZGlhQ29kZWM+CisgICAgICAgIDxNZWRpYUNvZGVjIG5hbWU9ImMyLmFuZHJvaWQuaGV2Yy5lbmNvZGVyIiB0eXBlPSJ2aWRlby9oZXZjIiB2YXJpYW50PSIhc2xvdy1jcHUiPgorICAgICAgICAgICAgPCEtLSBwcm9maWxlcyBhbmQgbGV2ZWxzOiAgUHJvZmlsZU1haW4gOiBNYWluVGllckxldmVsNTEgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iNTEyeDUxMiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJhbGlnbm1lbnQiIHZhbHVlPSIyeDIiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYmxvY2stc2l6ZSIgdmFsdWU9Ijh4OCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtNDA5NiIgLz4gPCEtLSBtYXggNTEyeDUxMiAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9ja3MtcGVyLXNlY29uZCIgcmFuZ2U9IjEtMTIyODgwIiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImZyYW1lLXJhdGUiIHJhbmdlPSIxLTEyMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJiaXRyYXRlIiByYW5nZT0iMS0xMDAwMDAwMCIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJjb21wbGV4aXR5IiByYW5nZT0iMC0xMCIgIGRlZmF1bHQ9IjAiIC8+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0icXVhbGl0eSIgcmFuZ2U9IjAtMTAwIiAgZGVmYXVsdD0iODAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iVkJSLENCUixDUSIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgICAgICA8TWVkaWFDb2RlYyBuYW1lPSJjMi5hbmRyb2lkLnZwOS5lbmNvZGVyIiB0eXBlPSJ2aWRlby94LXZuZC5vbjIudnA5IiB2YXJpYW50PSIhc2xvdy1jcHUiPgorICAgICAgICAgICAgPEFsaWFzIG5hbWU9Ik9NWC5nb29nbGUudnA5LmVuY29kZXIiIC8+CisgICAgICAgICAgICA8IS0tIHByb2ZpbGVzIGFuZCBsZXZlbHM6ICBQcm9maWxlTWFpbiA6IExldmVsX1ZlcnNpb24wLTMgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0ic2l6ZSIgbWluPSIyeDIiIG1heD0iMjA0OHgyMDQ4IiAvPgorICAgICAgICAgICAgPExpbWl0IG5hbWU9ImFsaWdubWVudCIgdmFsdWU9IjJ4MiIgLz4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1zaXplIiB2YWx1ZT0iMTZ4MTYiIC8+CisgICAgICAgICAgICA8IS0tIDIwMTYgZGV2aWNlcyBjYW4gZW5jb2RlIGF0IGFib3V0IDhmcHMgYXQgdGhpcyBibG9jayBjb3VudCAtLT4KKyAgICAgICAgICAgIDxMaW1pdCBuYW1lPSJibG9jay1jb3VudCIgcmFuZ2U9IjEtMzYwMCIgLz4gPCEtLSBtYXggMTI4MHg3MjAgLS0+CisgICAgICAgICAgICA8TGltaXQgbmFtZT0iYml0cmF0ZSIgcmFuZ2U9IjEtNDAwMDAwMDAiIC8+CisgICAgICAgICAgICA8RmVhdHVyZSBuYW1lPSJiaXRyYXRlLW1vZGVzIiB2YWx1ZT0iVkJSLENCUiIgLz4KKyAgICAgICAgPC9NZWRpYUNvZGVjPgorICAgIDwvRW5jb2RlcnM+Cis8L01lZGlhQ29kZWNzPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9BbmRyb2lkLmJwCmluZGV4IDdhNjdlNTUuLjg4ZjMwYzQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL0FuZHJvaWQuYnAKQEAgLTgsNyArOCw3IEBACiAgICAgICAgICJNZWRpYUZpbHRlci5jcHAiLAogICAgICAgICAiUlNGaWx0ZXIuY3BwIiwKICAgICAgICAgIlNhdHVyYXRpb25GaWx0ZXIuY3BwIiwKLSAgICAgICAgInNhdHVyYXRpb25BUkdCLnJzIiwKKyAgICAgICAgInNhdHVyYXRpb25BUkdCLnJzY3JpcHQiLAogICAgICAgICAiU2ltcGxlRmlsdGVyLmNwcCIsCiAgICAgICAgICJaZXJvRmlsdGVyLmNwcCIsCiAgICAgXSwKQEAgLTIzLDYgKzIzLDEwIEBACiAgICAgICAgICItV2FsbCIsCiAgICAgXSwKIAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYWRybV9oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmd1aSIsCiAgICAgICAgICJsaWJtZWRpYSIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL3NhdHVyYXRpb24ucnMgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL3NhdHVyYXRpb24ucnNjcmlwdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9zYXR1cmF0aW9uLnJzCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9maWx0ZXJzL3NhdHVyYXRpb24ucnNjcmlwdApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9zYXR1cmF0aW9uQVJHQi5ycyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZpbHRlcnMvc2F0dXJhdGlvbkFSR0IucnNjcmlwdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9zYXR1cmF0aW9uQVJHQi5ycwpyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmlsdGVycy9zYXR1cmF0aW9uQVJHQi5yc2NyaXB0CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvQW5kcm9pZC5icAppbmRleCA2YmZhYjE2Li5iNDk0ZTE2IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0FuZHJvaWQuYnAKQEAgLTEsOSArMSw2IEBACiBjY19saWJyYXJ5IHsKICAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfZmxhY2RlYyIsCiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKLSAgICB2bmRrOiB7Ci0gICAgICAgIGVuYWJsZWQ6IHRydWUsCi0gICAgfSwKIAogICAgIHNyY3M6IFsKICAgICAgICAgIkZMQUNEZWNvZGVyLmNwcCIsCkBAIC0xMSwxMSArOCw2IEBACiAKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbICIuIiBdLAogCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJleHRlcm5hbC9mbGFjL2luY2x1ZGUiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlIiwKLSAgICBdLAotCiAgICAgY2ZsYWdzOiBbIi1XZXJyb3IiXSwKIAogICAgIHNhbml0aXplOiB7CkBAIC0yNywxNyArMTksMjggQEAKICAgICB9LAogCiAgICAgc3RhdGljOiB7Ci0gICAgICAgIHdob2xlX3N0YXRpY19saWJzOiBbImxpYkZMQUMiXSwKKyAgICAgICAgd2hvbGVfc3RhdGljX2xpYnM6IFsKKyAgICAgICAgICAgICJsaWJGTEFDIiwKKyAgICAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgXSwKICAgICB9LAogCiAgICAgc2hhcmVkOiB7Ci0gICAgICAgIHN0YXRpY19saWJzOiBbImxpYkZMQUMiXSwKKyAgICAgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgICAgICJsaWJGTEFDIiwKKyAgICAgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgXSwKKyAgICAgICAgZXhwb3J0X3N0YXRpY19saWJfaGVhZGVyczogWworICAgICAgICAgICAgImxpYkZMQUMiLAorICAgICAgICBdLAogICAgIH0sCiAKICAgICBzaGFyZWRfbGliczogWwogICAgICAgICAibGlibG9nIiwKLSAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAotICAgICAgICAibGlidXRpbHMiLAogICAgIF0sCi0gICAgaGVhZGVyX2xpYnM6IFsibGlibWVkaWFfaGVhZGVycyJdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibGliRkxBQy1oZWFkZXJzIiwKKyAgICBdLAogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuY3BwCmluZGV4IGRmZGM0MWMuLmNlZjBiYzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKIAogI2luY2x1ZGUgIkZMQUNEZWNvZGVyLmgiCiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+IC8vIGZsb2F0X2Zyb21faTMyCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTExNywxMDQgKzExOCw0MyBAQAogICAgIG1FcnJvclN0YXR1cyA9IHN0YXR1czsKIH0KIAotLy8gQ29weSBzYW1wbGVzIGZyb20gRkxBQyBuYXRpdmUgMzItYml0IG5vbi1pbnRlcmxlYXZlZCB0byAxNi1iaXQgaW50ZXJsZWF2ZWQuCisvLyBDb3B5IHNhbXBsZXMgZnJvbSBGTEFDIG5hdGl2ZSAzMi1iaXQgbm9uLWludGVybGVhdmVkIHRvIDE2LWJpdCBzaWduZWQKKy8vIG9yIDMyLWJpdCBmbG9hdCBpbnRlcmxlYXZlZC4KKy8vIFRPRE86IENvbnNpZGVyIG1vdmluZyB0byBhdWRpb191dGlscy4gIFNlZSBzaW1pbGFyIGNvZGUgYXQgRkxBQ0V4dHJhY3Rvci5jcHAKIC8vIFRoZXNlIGFyZSBjYW5kaWRhdGVzIGZvciBvcHRpbWl6YXRpb24gaWYgbmVlZGVkLgotc3RhdGljIHZvaWQgY29weU1vbm84KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKK3N0YXRpYyB2b2lkIGNvcHlUbzE2U2lnbmVkKAorICAgICAgICBzaG9ydCAqZHN0LAorICAgICAgICBjb25zdCBpbnQgKmNvbnN0ICpzcmMsCiAgICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV0gPDwgODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW84KAotICAgICAgICBpbnQxNl90ICpkc3QsCi0gICAgICAgIGNvbnN0IGludCAqIHNyY1tGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzXSwKLSAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXSA8PCA4OwotICAgICAgICAqZHN0KysgPSBzcmNbMV1baV0gPDwgODsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlNdWx0aUNoOCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMpIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA8PCA4OworICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMsCisgICAgICAgIHVuc2lnbmVkIGJpdHNQZXJTYW1wbGUpIHsKKyAgICBjb25zdCBpbnQgbGVmdFNoaWZ0ID0gMTYgLSAoaW50KWJpdHNQZXJTYW1wbGU7IC8vIGNhc3QgdG8gaW50IHRvIHByZXZlbnQgdW5zaWduZWQgb3ZlcmZsb3cuCisgICAgaWYgKGxlZnRTaGlmdCA+PSAwKSB7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7CisgICAgICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKKyAgICAgICAgICAgICAgICAqZHN0KysgPSBzcmNbY11baV0gPDwgbGVmdFNoaWZ0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29uc3QgaW50IHJpZ2h0U2hpZnQgPSAtbGVmdFNoaWZ0OworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgeworICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IG5DaGFubmVsczsgKytjKSB7CisgICAgICAgICAgICAgICAgKmRzdCsrID0gc3JjW2NdW2ldID4+IHJpZ2h0U2hpZnQ7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXN0YXRpYyB2b2lkIGNvcHlNb25vMTYoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAorc3RhdGljIHZvaWQgY29weVRvRmxvYXQoCisgICAgICAgIGZsb2F0ICpkc3QsCisgICAgICAgIGNvbnN0IGludCAqY29uc3QgKnNyYywKICAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsCi0gICAgICAgIHVuc2lnbmVkIC8qIG5DaGFubmVscyAqLykgewotICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBuU2FtcGxlczsgKytpKSB7Ci0gICAgICAgICpkc3QrKyA9IHNyY1swXVtpXTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlTdGVyZW8xNigKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCAvKiBuQ2hhbm5lbHMgKi8pIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICAqZHN0KysgPSBzcmNbMF1baV07Ci0gICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXTsKLSAgICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNvcHlNdWx0aUNoMTYoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgbkNoYW5uZWxzKSB7CisgICAgICAgIHVuc2lnbmVkIG5DaGFubmVscywKKyAgICAgICAgdW5zaWduZWQgYml0c1BlclNhbXBsZSkgeworICAgIGNvbnN0IHVuc2lnbmVkIGxlZnRTaGlmdCA9IDMyIC0gYml0c1BlclNhbXBsZTsKICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewogICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotLy8gVE9ETzogMjQtYml0IHZlcnNpb25zIHNob3VsZCBkbyBkaXRoZXJpbmcgb3Igbm9pc2Utc2hhcGluZywgaGVyZSBvciBpbiBBdWRpb0ZsaW5nZXIKLXN0YXRpYyB2b2lkIGNvcHlNb25vMjQoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldID4+IDg7Ci0gICAgfQotfQotCi1zdGF0aWMgdm9pZCBjb3B5U3RlcmVvMjQoCi0gICAgICAgIGludDE2X3QgKmRzdCwKLSAgICAgICAgY29uc3QgaW50ICogc3JjW0ZMQUNEZWNvZGVyOjprTWF4Q2hhbm5lbHNdLAotICAgICAgICB1bnNpZ25lZCBuU2FtcGxlcywKLSAgICAgICAgdW5zaWduZWQgLyogbkNoYW5uZWxzICovKSB7Ci0gICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IG5TYW1wbGVzOyArK2kpIHsKLSAgICAgICAgKmRzdCsrID0gc3JjWzBdW2ldID4+IDg7Ci0gICAgICAgICpkc3QrKyA9IHNyY1sxXVtpXSA+PiA4OwotICAgIH0KLX0KLQotc3RhdGljIHZvaWQgY29weU11bHRpQ2gyNCgKLSAgICAgICAgaW50MTZfdCAqZHN0LAotICAgICAgICBjb25zdCBpbnQgKiBzcmNbRkxBQ0RlY29kZXI6OmtNYXhDaGFubmVsc10sCi0gICAgICAgIHVuc2lnbmVkIG5TYW1wbGVzLAotICAgICAgICB1bnNpZ25lZCBuQ2hhbm5lbHMpIHsKLSAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgblNhbXBsZXM7ICsraSkgewotICAgICAgICBmb3IgKHVuc2lnbmVkIGMgPSAwOyBjIDwgbkNoYW5uZWxzOyArK2MpIHsKLSAgICAgICAgICAgICpkc3QrKyA9IHNyY1tjXVtpXSA+PiA4OworICAgICAgICAgICAgKmRzdCsrID0gZmxvYXRfZnJvbV9pMzIoc3JjW2NdW2ldIDw8IGxlZnRTaGlmdCk7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yMzgsOCArMTc4LDcgQEAKICAgICAgIG1TdHJlYW1JbmZvVmFsaWQoZmFsc2UpLAogICAgICAgbVdyaXRlUmVxdWVzdGVkKGZhbHNlKSwKICAgICAgIG1Xcml0ZUNvbXBsZXRlZChmYWxzZSksCi0gICAgICBtRXJyb3JTdGF0dXMoKEZMQUNfX1N0cmVhbURlY29kZXJFcnJvclN0YXR1cykgLTEpLAotICAgICAgbUNvcHkobnVsbHB0cikgeworICAgICAgbUVycm9yU3RhdHVzKChGTEFDX19TdHJlYW1EZWNvZGVyRXJyb3JTdGF0dXMpIC0xKSB7CiAgICAgQUxPR1YoImN0b3I6Iik7CiAgICAgbWVtc2V0KCZtU3RyZWFtSW5mbywgMCwgc2l6ZW9mKG1TdHJlYW1JbmZvKSk7CiAgICAgbWVtc2V0KCZtV3JpdGVIZWFkZXIsIDAsIHNpemVvZihtV3JpdGVIZWFkZXIpKTsKQEAgLTM3OSw2ICszMTgsNyBAQAogICAgICAgICBjYXNlIDg6CiAgICAgICAgIGNhc2UgMTY6CiAgICAgICAgIGNhc2UgMjQ6CisgICAgICAgIGNhc2UgMzI6IC8vIGdlbmVyYWxseSByYXJlLCBidXQgaXMgc3VwcG9ydGVkIGluIHRoZSBmcmFtZXdvcmsKICAgICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGRlZmF1bHQ6CkBAIC0zODcsMzEgKzMyNyw2IEBACiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgIH0KIAotICAgIC8vIGNvbmZpZ3VyZSB0aGUgYXBwcm9wcmlhdGUgY29weSBmdW5jdGlvbiwgZGVmYXVsdGluZyB0byB0cmVzcGFzcwotICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewotICAgICAgICB1bnNpZ25lZCBtQ2hhbm5lbHM7Ci0gICAgICAgIHVuc2lnbmVkIG1CaXRzUGVyU2FtcGxlOwotICAgICAgICB2b2lkICgqbUNvcHkpKGludDE2X3QgKmRzdCwgY29uc3QgaW50ICogc3JjW2tNYXhDaGFubmVsc10sCi0gICAgICAgICAgICAgICAgdW5zaWduZWQgblNhbXBsZXMsIHVuc2lnbmVkIG5DaGFubmVscyk7Ci0gICAgfSB0YWJsZVtdID0gewotICAgICAgICB7IDEsICA4LCBjb3B5TW9ubzggICAgIH0sCi0gICAgICAgIHsgMiwgIDgsIGNvcHlTdGVyZW84ICAgfSwKLSAgICAgICAgeyA4LCAgOCwgY29weU11bHRpQ2g4ICB9LAotICAgICAgICB7IDEsIDE2LCBjb3B5TW9ubzE2ICAgIH0sCi0gICAgICAgIHsgMiwgMTYsIGNvcHlTdGVyZW8xNiAgfSwKLSAgICAgICAgeyA4LCAxNiwgY29weU11bHRpQ2gxNiB9LAotICAgICAgICB7IDEsIDI0LCBjb3B5TW9ubzI0ICAgIH0sCi0gICAgICAgIHsgMiwgMjQsIGNvcHlTdGVyZW8yNCAgfSwKLSAgICAgICAgeyA4LCAyNCwgY29weU11bHRpQ2gyNCB9LAotICAgIH07Ci0gICAgZm9yIChjb25zdCBhdXRvICZlbnRyeSA6IHRhYmxlKSB7Ci0gICAgICAgIGlmIChlbnRyeS5tQ2hhbm5lbHMgPj0gZ2V0Q2hhbm5lbHMoKSAmJgotICAgICAgICAgICAgICAgIGVudHJ5Lm1CaXRzUGVyU2FtcGxlID09IGdldEJpdHNQZXJTYW1wbGUoKSkgewotICAgICAgICAgICAgbUNvcHkgPSBlbnRyeS5tQ29weTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgLy8gTm93IHdlIGhhdmUgYWxsIG1ldGFkYXRhIGJsb2Nrcy4KICAgICBtQnVmZmVyUG9zID0gMDsKICAgICBtQnVmZmVyRGF0YVNpemUgPSAwOwpAQCAtNDIwLDcgKzMzNSw3IEBACiB9CiAKIHN0YXR1c190IEZMQUNEZWNvZGVyOjpkZWNvZGVPbmVGcmFtZShjb25zdCB1aW50OF90ICppbkJ1ZmZlciwgc2l6ZV90IGluQnVmZmVyTGVuLAotICAgICAgICBpbnQxNl90ICpvdXRCdWZmZXIsIHNpemVfdCAqb3V0QnVmZmVyTGVuKSB7CisgICAgICAgIHZvaWQgKm91dEJ1ZmZlciwgc2l6ZV90ICpvdXRCdWZmZXJMZW4sIGJvb2wgb3V0cHV0RmxvYXQpIHsKICAgICBBTE9HVigiZGVjb2RlT25lRnJhbWU6IGlucHV0IHNpemUoJXp1KSIsIGluQnVmZmVyTGVuKTsKIAogICAgIGlmICghbVN0cmVhbUluZm9WYWxpZCkgewpAQCAtNDY5LDIxICszODQsMzMgQEAKICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICB9CiAKLSAgICBzaXplX3QgYnVmZmVyU2l6ZSA9IGJsb2Nrc2l6ZSAqIGdldENoYW5uZWxzKCkgKiBzaXplb2YoaW50MTZfdCk7CisgICAgY29uc3QgdW5zaWduZWQgY2hhbm5lbHMgPSBnZXRDaGFubmVscygpOworICAgIGNvbnN0IHNpemVfdCBzYW1wbGVTaXplID0gb3V0cHV0RmxvYXQgPyBzaXplb2YoZmxvYXQpIDogc2l6ZW9mKGludDE2X3QpOworICAgIGNvbnN0IHNpemVfdCBmcmFtZVNpemUgPSBjaGFubmVscyAqIHNhbXBsZVNpemU7CisgICAgc2l6ZV90IGJ1ZmZlclNpemUgPSBibG9ja3NpemUgKiBmcmFtZVNpemU7CiAgICAgaWYgKGJ1ZmZlclNpemUgPiAqb3V0QnVmZmVyTGVuKSB7CiAgICAgICAgIEFMT0dXKCJkZWNvZGVPbmVGcmFtZTogb3V0cHV0IGJ1ZmZlciBob2xkcyBvbmx5IHBhcnRpYWwgZnJhbWUgJXp1OiV6dSIsCiAgICAgICAgICAgICAgICAgKm91dEJ1ZmZlckxlbiwgYnVmZmVyU2l6ZSk7Ci0gICAgICAgIGJsb2Nrc2l6ZSA9ICpvdXRCdWZmZXJMZW4gLyAoZ2V0Q2hhbm5lbHMoKSAqIHNpemVvZihpbnQxNl90KSk7Ci0gICAgICAgIGJ1ZmZlclNpemUgPSBibG9ja3NpemUgKiBnZXRDaGFubmVscygpICogc2l6ZW9mKGludDE2X3QpOworICAgICAgICBibG9ja3NpemUgPSAqb3V0QnVmZmVyTGVuIC8gZnJhbWVTaXplOworICAgICAgICBidWZmZXJTaXplID0gYmxvY2tzaXplICogZnJhbWVTaXplOwogICAgIH0KIAotICAgIGlmIChtQ29weSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJkZWNvZGVPbmVGcmFtZTogZm9ybWF0IGlzIG5vdCBzdXBwb3J0ZWQ6IGNoYW5uZWxzKCVkKSwgQml0c1BlclNhbXBsZSglZCkiLAotICAgICAgICAgICAgICAgIGdldENoYW5uZWxzKCksIGdldEJpdHNQZXJTYW1wbGUoKSk7Ci0gICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9CiAgICAgLy8gY29weSBQQ00gZnJvbSBGTEFDIHdyaXRlIGJ1ZmZlciB0byBvdXRwdXQgYnVmZmVyLCB3aXRoIGludGVybGVhdmluZwotICAgICgqbUNvcHkpKG91dEJ1ZmZlciwgbVdyaXRlQnVmZmVyLCBibG9ja3NpemUsIGdldENoYW5uZWxzKCkpOworCisgICAgY29uc3QgdW5zaWduZWQgYml0c1BlclNhbXBsZSA9IGdldEJpdHNQZXJTYW1wbGUoKTsKKyAgICBpZiAob3V0cHV0RmxvYXQpIHsKKyAgICAgICAgY29weVRvRmxvYXQocmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KG91dEJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgIG1Xcml0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgYmxvY2tzaXplLAorICAgICAgICAgICAgICAgICAgICBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgYml0c1BlclNhbXBsZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgY29weVRvMTZTaWduZWQocmVpbnRlcnByZXRfY2FzdDxzaG9ydCo+KG91dEJ1ZmZlciksCisgICAgICAgICAgICAgICAgICAgICAgIG1Xcml0ZUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgYmxvY2tzaXplLAorICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVscywKKyAgICAgICAgICAgICAgICAgICAgICAgYml0c1BlclNhbXBsZSk7CisgICAgfQogICAgICpvdXRCdWZmZXJMZW4gPSBidWZmZXJTaXplOwogICAgIHJldHVybiBPSzsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy9GTEFDRGVjb2Rlci5oCmluZGV4IGFmNDE5YTIuLjY5NGZjY2IgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL0ZMQUNEZWNvZGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvRkxBQ0RlY29kZXIuaApAQCAtNDEsNyArNDEsNyBAQAogCiAgICAgc3RhdHVzX3QgcGFyc2VNZXRhZGF0YShjb25zdCB1aW50OF90ICppbkJ1ZmZlciwgc2l6ZV90IGluQnVmZmVyTGVuKTsKICAgICBzdGF0dXNfdCBkZWNvZGVPbmVGcmFtZShjb25zdCB1aW50OF90ICppbkJ1ZmZlciwgc2l6ZV90IGluQnVmZmVyTGVuLAotICAgICAgICAgICAgaW50MTZfdCAqb3V0QnVmZmVyLCBzaXplX3QgKm91dEJ1ZmZlckxlbik7CisgICAgICAgICAgICB2b2lkICpvdXRCdWZmZXIsIHNpemVfdCAqb3V0QnVmZmVyTGVuLCBib29sIG91dHB1dEZsb2F0ID0gZmFsc2UpOwogICAgIHZvaWQgZmx1c2goKTsKICAgICB2aXJ0dWFsIH5GTEFDRGVjb2RlcigpOwogCkBAIC04OSw4ICs4OSw2IEBACiAgICAgLy8gbW9zdCByZWNlbnQgZXJyb3IgcmVwb3J0ZWQgYnkgbGliRkxBQyBkZWNvZGVyCiAgICAgRkxBQ19fU3RyZWFtRGVjb2RlckVycm9yU3RhdHVzIG1FcnJvclN0YXR1czsKIAotICAgIHZvaWQgKCptQ29weSkoaW50MTZfdCAqZHN0LCBjb25zdCBpbnQgKnNyY1trTWF4Q2hhbm5lbHNdLCB1bnNpZ25lZCBuU2FtcGxlcywgdW5zaWduZWQgbkNoYW5uZWxzKTsKLQogICAgIHN0YXR1c190IGluaXQoKTsKIAogICAgIC8vIEZMQUMgc3RyZWFtIGRlY29kZXIgY2FsbGJhY2tzIGFzIEMrKyBpbnN0YW5jZSBtZXRob2RzCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy90ZXN0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzBjYTgwYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL3Rlc3QvQW5kcm9pZC5icApAQCAtMCwwICsxLDUwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIkZsYWNEZWNvZGVyVGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJGbGFjRGVjb2RlclRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mbGFjZGVjIiwKKyAgICAgICAgImxpYkZMQUMiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mbGFjL2RlYy90ZXN0L0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZWJiYThlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvdGVzdC9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIGZsYWMgZGVjb2RlciB1bml0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iRmxhY0RlY29kZXJUZXN0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IkZsYWNEZWNvZGVyVGVzdC0+L2RhdGEvbG9jYWwvdG1wL0ZsYWNEZWNvZGVyVGVzdC8iIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL3Rlc3QvRmxhY0RlY29kZXIuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL0ZsYWNEZWNvZGVyVGVzdFJlcy8iIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IkZsYWNEZWNvZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL0ZsYWNEZWNvZGVyVGVzdFJlcy8iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL3Rlc3QvRmxhY0RlY29kZXJUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL3Rlc3QvRmxhY0RlY29kZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNGYxMmRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvdGVzdC9GbGFjRGVjb2RlclRlc3QuY3BwCkBAIC0wLDAgKzEsMjcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJGbGFjRGVjb2RlclRlc3QiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSAiRkxBQ0RlY29kZXIuaCIKKworI2luY2x1ZGUgIkZsYWNEZWNvZGVyVGVzdEVudmlyb25tZW50LmgiCisKKyNkZWZpbmUgT1VUUFVUX0ZJTEVfTkFNRSAiL2RhdGEvbG9jYWwvdG1wL0ZsYWNEZWNvZGVyT3V0cHV0LnJhdyIKKyNkZWZpbmUgQ09ERUNfQ09ORklHX0ZMQUcgMzIKKworY29uc3RleHByIHVpbnQzMl90IGtNYXhDb3VudCA9IDEwOworY29uc3RleHByIGludDMyX3Qga01heEJsb2NrU2l6ZSA9IDQwOTY7CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdHJ1Y3QgRnJhbWVJbmZvIHsKKyAgICBpbnQzMl90IGJ5dGVzQ291bnQ7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgaW50NjRfdCB0aW1lc3RhbXA7Cit9OworCitzdGF0aWMgRmxhY0RlY29kZXJUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCitjbGFzcyBGTEFDRGVjb2RlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHR1cGxlPHN0cmluZywgc3RyaW5nLCBib29sPj4geworICBwdWJsaWM6CisgICAgRkxBQ0RlY29kZXJUZXN0KCkgOiBtRkxBQ0RlY29kZXIobnVsbHB0ciksIG1IYXNTdHJlYW1JbmZvKGZhbHNlKSwgbUlucHV0QnVmZmVyQ291bnQoMCkge30KKworICAgIH5GTEFDRGVjb2RlclRlc3QoKSB7CisgICAgICAgIGlmIChtRWxlU3RyZWFtLmlzX29wZW4oKSkgbUVsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICBpZiAobUZMQUNEZWNvZGVyKSBkZWxldGUgbUZMQUNEZWNvZGVyOworICAgICAgICBtRkxBQ0RlY29kZXIgPSBudWxscHRyOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbUZMQUNEZWNvZGVyID0gRkxBQ0RlY29kZXI6OkNyZWF0ZSgpOworICAgICAgICBBU1NFUlRfTkUobUZMQUNEZWNvZGVyLCBudWxscHRyKSA8PCAiaW5pdERlY29kZXI6IGZhaWxlZCB0byBjcmVhdGUgRkxBQ0RlY29kZXIiOworICAgIH0KKworICAgIGludDMyX3QgcHJvY2Vzc0ZsYWNEZWNvZGVyKHZlY3RvcjxGcmFtZUluZm8+IEluZm8sIGludDMyX3Qgb2Zmc2V0LCBpbnQzMl90IHJhbmdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQsIG9mc3RyZWFtICZvc3RybSk7CisKKyAgICBGTEFDRGVjb2RlciAqbUZMQUNEZWNvZGVyOworICAgIEZMQUNfX1N0cmVhbU1ldGFkYXRhX1N0cmVhbUluZm8gbVN0cmVhbUluZm87CisKKyAgICBib29sIG1IYXNTdHJlYW1JbmZvOworICAgIGludDMyX3QgbUlucHV0QnVmZmVyQ291bnQ7CisgICAgaWZzdHJlYW0gbUVsZVN0cmVhbTsKK307CisKK3ZvaWQgZ2V0SW5mbyhzdHJpbmcgaW5mb0ZpbGVOYW1lLCB2ZWN0b3I8RnJhbWVJbmZvPiAmSW5mbykgeworICAgIGlmc3RyZWFtIGVsZUluZm87CisgICAgZWxlSW5mby5vcGVuKGluZm9GaWxlTmFtZSk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBpbnQzMl90IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICB1aW50MzJfdCB0aW1lc3RhbXAgPSAwOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmICghKGVsZUluZm8gPj4gYnl0ZXNDb3VudCkpIGJyZWFrOworICAgICAgICBlbGVJbmZvID4+IGZsYWdzOworICAgICAgICBlbGVJbmZvID4+IHRpbWVzdGFtcDsKKyAgICAgICAgSW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICB9CisgICAgaWYgKGVsZUluZm8uaXNfb3BlbigpKSBlbGVJbmZvLmNsb3NlKCk7Cit9CisKK2ludDMyX3QgRkxBQ0RlY29kZXJUZXN0Ojpwcm9jZXNzRmxhY0RlY29kZXIodmVjdG9yPEZyYW1lSW5mbz4gSW5mbywgaW50MzJfdCBvZmZzZXQsIGludDMyX3QgcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb3V0cHV0RmxvYXQsIG9mc3RyZWFtICZvc3RybSkgeworICAgIG1lbXNldCgmbVN0cmVhbUluZm8sIDAsIHNpemVvZihtU3RyZWFtSW5mbykpOworCisgICAgaW50MzJfdCBmcmFtZUlEID0gb2Zmc2V0OworICAgIGlmIChyYW5nZSArIG9mZnNldCA+IEluZm8uc2l6ZSgpIHx8IHJhbmdlIDwgMCB8fCBvZmZzZXQgPiBJbmZvLnNpemUoKSAtIDEgfHwgb2Zmc2V0IDwgMCkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBvZmZzZXQgb3IgcmFuZ2Ugb3IgYm90aCBwYXNzZWQgZm9yIGRlY29kaW5nIik7CisgICAgICAgIEFMT0dFKCJvZmZzZXQgPSAlZCBcdCByYW5nZSA9ICVkICBcdCBJbmZvLnNpemUoKSA9ICV6dSIsIG9mZnNldCwgcmFuZ2UsIEluZm8uc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChmcmFtZUlEID09IEluZm8uc2l6ZSgpIHx8IGZyYW1lSUQgPT0gKG9mZnNldCArIHJhbmdlKSkgYnJlYWs7CisgICAgICAgIGludDY0X3QgZmxhZ3MgPSAoSW5mbylbZnJhbWVJRF0uZmxhZ3M7CisgICAgICAgIGludDMyX3Qgc2l6ZSA9IChJbmZvKVtmcmFtZUlEXS5ieXRlc0NvdW50OworICAgICAgICBpZiAoc2l6ZSA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJTaXplIGZvciB0aGUgbWVtb3J5IGFsbG9jYXRpb24gaXMgbmVnYXRpdmUiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBjaGFyICpkYXRhID0gKGNoYXIgKiltYWxsb2Moc2l6ZSk7CisgICAgICAgIGlmICghZGF0YSkgeworICAgICAgICAgICAgQUxPR0UoIkluc3VmZmljaWVudCBtZW1vcnkgdG8gcmVhZCBmcmFtZSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgbUVsZVN0cmVhbS5yZWFkKGRhdGEsIHNpemUpOworICAgICAgICBpZiAobUVsZVN0cmVhbS5nY291bnQoKSAhPSBzaXplKSB7CisgICAgICAgICAgICBpZiAoZGF0YSkgeworICAgICAgICAgICAgICAgIGZyZWUoZGF0YSk7CisgICAgICAgICAgICAgICAgZGF0YSA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBzaXplIHJlYWQsIHJlcXVlc3RlZDogJWQgYW5kIHJlYWQ6ICV6dSIsIHNpemUsIG1FbGVTdHJlYW0uZ2NvdW50KCkpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGZsYWdzID09IENPREVDX0NPTkZJR19GTEFHICYmIG1JbnB1dEJ1ZmZlckNvdW50ID09IDApIHsKKyAgICAgICAgICAgIHN0YXR1c190IGRlY29kZXJFcnIgPSBtRkxBQ0RlY29kZXItPnBhcnNlTWV0YWRhdGEoKHVpbnQ4X3QgKilkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIGlmIChkZWNvZGVyRXJyID09IFdPVUxEX0JMT0NLKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoInByb2Nlc3M6IHBhcnNlTWV0YWRhdGEgaXMgQmxvY2tpbmcsIENvbnRpbnVlICVkIiwgZGVjb2RlckVycik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKGRlY29kZXJFcnIgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBtU3RyZWFtSW5mbyA9IG1GTEFDRGVjb2Rlci0+Z2V0U3RyZWFtSW5mbygpOworICAgICAgICAgICAgICAgIGlmIChtU3RyZWFtSW5mby5zYW1wbGVfcmF0ZSAmJiBtU3RyZWFtSW5mby5tYXhfYmxvY2tzaXplICYmIG1TdHJlYW1JbmZvLmNoYW5uZWxzKSB7CisgICAgICAgICAgICAgICAgICAgIG1IYXNTdHJlYW1JbmZvID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1YoImRlY29kZXIgY29uZmlndXJhdGlvbiA6ICVkIEh6LCAlZCBjaGFubmVscywgJWQgc2FtcGxlcywiCisgICAgICAgICAgICAgICAgICAgICAgIiAlZCBibG9jayBzaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICBtU3RyZWFtSW5mby5zYW1wbGVfcmF0ZSwgbVN0cmVhbUluZm8uY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3QpbVN0cmVhbUluZm8udG90YWxfc2FtcGxlcywgbVN0cmVhbUluZm8ubWF4X2Jsb2Nrc2l6ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCJGTEFDRGVjb2RlciBwYXJzZU1ldGFEYXRhIHJldHVybnMgZXJyb3IgJWQiLCBkZWNvZGVyRXJyKTsKKyAgICAgICAgICAgICAgICBpZiAoZGF0YSkgeworICAgICAgICAgICAgICAgICAgICBmcmVlKGRhdGEpOworICAgICAgICAgICAgICAgICAgICBkYXRhID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlY29kZXJFcnI7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2FtcGxlU2l6ZSA9IG91dHB1dEZsb2F0ID8gc2l6ZW9mKGZsb2F0KSA6IHNpemVvZihpbnQxNl90KTsKKyAgICAgICAgICAgIHNpemVfdCBvdXRTaXplID0gbUhhc1N0cmVhbUluZm8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1TdHJlYW1JbmZvLm1heF9ibG9ja3NpemUgKiBtU3RyZWFtSW5mby5jaGFubmVscyAqIHNhbXBsZVNpemUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtNYXhCbG9ja1NpemUgKiBGTEFDRGVjb2Rlcjo6a01heENoYW5uZWxzICogc2FtcGxlU2l6ZTsKKworICAgICAgICAgICAgdm9pZCAqb3V0X2J1ZiA9IG1hbGxvYyhvdXRTaXplKTsKKyAgICAgICAgICAgIGlmICghb3V0X2J1ZikgeworICAgICAgICAgICAgICAgIGlmIChkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIGZyZWUoZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBudWxscHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBBTE9HRSgiT3V0cHV0IGJ1ZmZlciBhbGxvY2F0aW9uIGZhaWxlZCIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0YXR1c190IGRlY29kZXJFcnIgPSBtRkxBQ0RlY29kZXItPmRlY29kZU9uZUZyYW1lKCh1aW50OF90ICopZGF0YSwgc2l6ZSwgb3V0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRTaXplLCBvdXRwdXRGbG9hdCk7CisgICAgICAgICAgICBpZiAoZGVjb2RlckVyciAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJkZWNvZGVPbmVGcmFtZSByZXR1cm5zIGVycm9yICVkIiwgZGVjb2RlckVycik7CisgICAgICAgICAgICAgICAgaWYgKGRhdGEpIHsKKyAgICAgICAgICAgICAgICAgICAgZnJlZShkYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgZGF0YSA9IG51bGxwdHI7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChvdXRfYnVmKSB7CisgICAgICAgICAgICAgICAgICAgIGZyZWUob3V0X2J1Zik7CisgICAgICAgICAgICAgICAgICAgIG91dF9idWYgPSBudWxscHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gZGVjb2RlckVycjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9zdHJtLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihvdXRfYnVmKSwgb3V0U2l6ZSk7CisgICAgICAgICAgICBmcmVlKG91dF9idWYpOworICAgICAgICAgICAgb3V0X2J1ZiA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgbUlucHV0QnVmZmVyQ291bnQrKzsKKyAgICAgICAgZnJhbWVJRCsrOworICAgICAgICBmcmVlKGRhdGEpOworICAgICAgICBkYXRhID0gbnVsbHB0cjsKKyAgICB9CisgICAgQUxPR1YoImZyYW1lSUQ9JWQiLCBmcmFtZUlEKTsKKyAgICByZXR1cm4gMDsKK30KKworVEVTVF9GKEZMQUNEZWNvZGVyVGVzdCwgQ3JlYXRlRGVsZXRlVGVzdCkgeworICAgIGlmIChtRkxBQ0RlY29kZXIpIGRlbGV0ZSBtRkxBQ0RlY29kZXI7CisgICAgbUZMQUNEZWNvZGVyID0gbnVsbHB0cjsKKworICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGtNYXhDb3VudDsgaSsrKSB7CisgICAgICAgIG1GTEFDRGVjb2RlciA9IEZMQUNEZWNvZGVyOjpDcmVhdGUoKTsKKyAgICAgICAgQVNTRVJUX05FKG1GTEFDRGVjb2RlciwgbnVsbHB0cikgPDwgIkZMQUNEZWNvZGVyIENyZWF0aW9uIEZhaWxlZCI7CisgICAgICAgIGlmIChtRkxBQ0RlY29kZXIpIGRlbGV0ZSBtRkxBQ0RlY29kZXI7CisgICAgICAgIG1GTEFDRGVjb2RlciA9IG51bGxwdHI7CisgICAgfQorfQorCitURVNUX1AoRkxBQ0RlY29kZXJUZXN0LCBGbHVzaFRlc3QpIHsKKyAgICB0dXBsZTxzdHJpbmcgLyogSW5wdXRGaWxlTmFtZSAqLywgc3RyaW5nIC8qIEluZm9GaWxlTmFtZSAqLywgYm9vbCAvKiBvdXRwdXRmbG9hdCAqLz4gcGFyYW1zID0KKyAgICAgICAgICAgIEdldFBhcmFtKCk7CisKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDA+KHBhcmFtcyk7CisgICAgc3RyaW5nIGluZm9GaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDE+KHBhcmFtcyk7CisgICAgYm9vbCBvdXRwdXRGbG9hdCA9IGdldDwyPihwYXJhbXMpOworCisgICAgdmVjdG9yPEZyYW1lSW5mbz4gSW5mbzsKKyAgICBnZXRJbmZvKGluZm9GaWxlTmFtZSwgSW5mbyk7CisKKyAgICBtRWxlU3RyZWFtLm9wZW4oaW5wdXRGaWxlTmFtZSwgaWZzdHJlYW06OmJpbmFyeSk7CisgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKKworICAgIG9mc3RyZWFtIG9zdHJtOworICAgIG9zdHJtLm9wZW4oT1VUUFVUX0ZJTEVfTkFNRSwgc3RkOjpvZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEob3N0cm0uaXNfb3BlbigpLCB0cnVlKTsKKworICAgIGludDMyX3Qgc3RhdHVzID0gcHJvY2Vzc0ZsYWNEZWNvZGVyKEluZm8sIDAsIEluZm8uc2l6ZSgpIC8gMywgb3V0cHV0RmxvYXQsIG9zdHJtKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiVGVzdCBGYWlsZWQuIERlY29kZSByZXR1cm5lZCBlcnJvciA9ICIgPDwgc3RhdHVzIDw8IGVuZGw7CisgICAgbUZMQUNEZWNvZGVyLT5mbHVzaCgpOworICAgIG1IYXNTdHJlYW1JbmZvID0gZmFsc2U7CisgICAgc3RhdHVzID0gcHJvY2Vzc0ZsYWNEZWNvZGVyKEluZm8sIChJbmZvLnNpemUoKSAvIDMpLCBJbmZvLnNpemUoKSAtIChJbmZvLnNpemUoKSAvIDMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGbG9hdCwgb3N0cm0pOworICAgIG9zdHJtLmNsb3NlKCk7CisgICAgSW5mby5jbGVhcigpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJUZXN0IEZhaWxlZC4gRGVjb2RlIHJldHVybmVkIGVycm9yID0gIiA8PCBzdGF0dXMgPDwgZW5kbDsKK30KKworVEVTVF9QKEZMQUNEZWNvZGVyVGVzdCwgRGVjb2RlVGVzdCkgeworICAgIHR1cGxlPHN0cmluZyAvKiBJbnB1dEZpbGVOYW1lICovLCBzdHJpbmcgLyogSW5mb0ZpbGVOYW1lICovLCBib29sIC8qIG91dHB1dGZsb2F0ICovPiBwYXJhbXMgPQorICAgICAgICAgICAgR2V0UGFyYW0oKTsKKworICAgIHN0cmluZyBpbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MD4ocGFyYW1zKTsKKyAgICBzdHJpbmcgaW5mb0ZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MT4ocGFyYW1zKTsKKyAgICBib29sIG91dHB1dEZsb2F0ID0gZ2V0PDI+KHBhcmFtcyk7CisKKyAgICB2ZWN0b3I8RnJhbWVJbmZvPiBJbmZvOworICAgIGdldEluZm8oaW5mb0ZpbGVOYW1lLCBJbmZvKTsKKworICAgIG1FbGVTdHJlYW0ub3BlbihpbnB1dEZpbGVOYW1lLCBpZnN0cmVhbTo6YmluYXJ5KTsKKyAgICBBU1NFUlRfRVEobUVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpOworCisgICAgb2ZzdHJlYW0gb3N0cm07CisgICAgb3N0cm0ub3BlbihPVVRQVVRfRklMRV9OQU1FLCBzdGQ6Om9mc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShvc3RybS5pc19vcGVuKCksIHRydWUpOworCisgICAgaW50MzJfdCBzdGF0dXMgPSBwcm9jZXNzRmxhY0RlY29kZXIoSW5mbywgMCwgSW5mby5zaXplKCksIG91dHB1dEZsb2F0LCBvc3RybSk7CisgICAgb3N0cm0uY2xvc2UoKTsKKyAgICBJbmZvLmNsZWFyKCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlRlc3QgRmFpbGVkLiBEZWNvZGUgcmV0dXJuZWQgZXJyb3IgPSAiIDw8IHN0YXR1cyA8PCBlbmRsOworfQorCisvLyBUT0RPOiBBZGQgcmVtYWluaW5nIHRlc3RzCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIEZMQUNEZWNvZGVyVGVzdEFsbCwgRkxBQ0RlY29kZXJUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3R1cGxlKCJiYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmZsYWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmluZm8iLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5mbGFjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5pbmZvIiwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfZmxhY19zdGVyZW9fNjAwa2Jwc180NDEwMGh6LmZsYWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfZmxhY19zdGVyZW9fNjAwa2Jwc180NDEwMGh6LmluZm8iLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYmJiX2ZsYWNfc3RlcmVvXzYwMGticHNfNDQxMDBoei5mbGFjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiX2ZsYWNfc3RlcmVvXzYwMGticHNfNDQxMDBoei5pbmZvIiwgZmFsc2UpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGdFbnYgPSBuZXcgRmxhY0RlY29kZXJUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIEFMT0dWKCJGbGFjIERlY29kZXIgVGVzdCBSZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL3Rlc3QvRmxhY0RlY29kZXJUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL3Rlc3QvRmxhY0RlY29kZXJUZXN0RW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzM0YmJhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvdGVzdC9GbGFjRGVjb2RlclRlc3RFbnZpcm9ubWVudC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRkxBQ19ERUNPREVSX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisjZGVmaW5lIF9fRkxBQ19ERUNPREVSX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIEZsYWNEZWNvZGVyVGVzdEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgRmxhY0RlY29kZXJUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL2RhdGEvbG9jYWwvdG1wLyIpIHt9CisKKyAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyICpfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IHN0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KKworICBwcml2YXRlOgorICAgIHN0cmluZyByZXM7Cit9OworCitpbnQgRmxhY0RlY29kZXJUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJwYXRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdQJ30sIHswLCAwLCAwLCAwfX07CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJQOiIsIG9wdGlvbnMsICZpbmRleCk7CisgICAgICAgIGlmIChjID09IC0xKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnUCc6IHsKKyAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgorICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gX19GTEFDX0RFQ09ERVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL3Rlc3QvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvdGVzdC9SRUFETUUubWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQxOTRjZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZsYWMvZGVjL3Rlc3QvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNDAgQEAKKyMjIE1lZGlhIFRlc3RpbmcgIyMKKy0tLQorIyMjIyBGbGFjRGVjb2RlciA6CitUaGUgRmxhY0RlY29kZXIgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIEZsYWNEZWNvZGVyIGF2YWlsYWJsZSBpbiBsaWJzdGFnZWZyaWdodC4KKworUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6CitgYGAKK20gRmxhY0RlY29kZXJUZXN0CitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0L0ZsYWNEZWNvZGVyVGVzdC9GbGFjRGVjb2RlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9GbGFjRGVjb2RlclRlc3QvRmxhY0RlY29kZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZmxhYy9kZWMvdGVzdC9GbGFjRGVjb2Rlci56aXApLgorRG93bmxvYWQsIHVuemlwIGFuZCBwdXNoIHRoZXNlIGZpbGVzIGludG8gZGV2aWNlIGZvciB0ZXN0aW5nLgorCitgYGAKK2FkYiBwdXNoIEZsYWNEZWNvZGVyIC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCit1c2FnZTogRmxhY0RlY29kZXJUZXN0IC1QIFw8cGF0aF90b19mb2xkZXJcPgorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL0ZsYWNEZWNvZGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvRmxhY0RlY29kZXIvCitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IEZsYWNEZWNvZGVyVGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODM3ZjY2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotQVN0YXRlOjpBU3RhdGUoY29uc3Qgc3A8QVN0YXRlPiAmcGFyZW50U3RhdGUpCi0gICAgOiBtUGFyZW50U3RhdGUocGFyZW50U3RhdGUpIHsKLX0KLQotQVN0YXRlOjp+QVN0YXRlKCkgewotfQotCi1zcDxBU3RhdGU+IEFTdGF0ZTo6cGFyZW50U3RhdGUoKSB7Ci0gICAgcmV0dXJuIG1QYXJlbnRTdGF0ZTsKLX0KLQotdm9pZCBBU3RhdGU6OnN0YXRlRW50ZXJlZCgpIHsKLX0KLQotdm9pZCBBU3RhdGU6OnN0YXRlRXhpdGVkKCkgewotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjpBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lKCkgewotfQotCi1BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjp+QUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZSgpIHsKLX0KLQotdm9pZCBBSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lOjpoYW5kbGVNZXNzYWdlKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7Ci0gICAgc3A8QVN0YXRlPiBzYXZlID0gbVN0YXRlOwotCi0gICAgc3A8QVN0YXRlPiBjdXIgPSBtU3RhdGU7Ci0gICAgd2hpbGUgKGN1ciAhPSBOVUxMICYmICFjdXItPm9uTWVzc2FnZVJlY2VpdmVkKG1zZykpIHsKLSAgICAgICAgLy8gSWYgeW91IGNsYWltIG5vdCB0byBoYXZlIGhhbmRsZWQgdGhlIG1lc3NhZ2UgeW91IHNob3VsZG4ndAotICAgICAgICAvLyBoYXZlIGNhbGxlZCBzZXRTdGF0ZS4uLgotICAgICAgICBDSEVDSyhzYXZlID09IG1TdGF0ZSk7Ci0KLSAgICAgICAgY3VyID0gY3VyLT5wYXJlbnRTdGF0ZSgpOwotICAgIH0KLQotICAgIGlmIChjdXIgIT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQUxPR1coIldhcm5pbmcgbWVzc2FnZSAlcyB1bmhhbmRsZWQgaW4gcm9vdCBzdGF0ZS4iLAotICAgICAgICAgbXNnLT5kZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwotfQotCi12b2lkIEFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmU6OmNoYW5nZVN0YXRlKGNvbnN0IHNwPEFTdGF0ZT4gJnN0YXRlKSB7Ci0gICAgaWYgKHN0YXRlID09IG1TdGF0ZSkgewotICAgICAgICAvLyBRdWljayBleGl0IGZvciB0aGUgZWFzeSBjYXNlLgotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgVmVjdG9yPHNwPEFTdGF0ZT4gPiBBOwotICAgIHNwPEFTdGF0ZT4gY3VyID0gbVN0YXRlOwotICAgIGZvciAoOzspIHsKLSAgICAgICAgQS5wdXNoKGN1cik7Ci0gICAgICAgIGlmIChjdXIgPT0gTlVMTCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY3VyID0gY3VyLT5wYXJlbnRTdGF0ZSgpOwotICAgIH0KLQotICAgIFZlY3RvcjxzcDxBU3RhdGU+ID4gQjsKLSAgICBjdXIgPSBzdGF0ZTsKLSAgICBmb3IgKDs7KSB7Ci0gICAgICAgIEIucHVzaChjdXIpOwotICAgICAgICBpZiAoY3VyID09IE5VTEwpIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGN1ciA9IGN1ci0+cGFyZW50U3RhdGUoKTsKLSAgICB9Ci0KLSAgICAvLyBSZW1vdmUgdGhlIGNvbW1vbiB0YWlsLgotICAgIHdoaWxlIChBLnNpemUoKSA+IDAgJiYgQi5zaXplKCkgPiAwICYmIEEudG9wKCkgPT0gQi50b3AoKSkgewotICAgICAgICBBLnBvcCgpOwotICAgICAgICBCLnBvcCgpOwotICAgIH0KLQotICAgIG1TdGF0ZSA9IHN0YXRlOwotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIEEuZWRpdEl0ZW1BdChpKS0+c3RhdGVFeGl0ZWQoKTsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gQi5zaXplKCk7IGkgPiAwOykgewotICAgICAgICBpLS07Ci0gICAgICAgIEIuZWRpdEl0ZW1BdChpKS0+c3RhdGVFbnRlcmVkKCk7Ci0gICAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5jcHAKaW5kZXggNWU3NmM2Ny4uYTI3NjcyMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuY3BwCkBAIC0xNzAsNyArMTcwLDkgQEAKIAogICAgIGludDY0X3Qgd2hlblVzOwogICAgIGlmIChkZWxheVVzID4gMCkgewotICAgICAgICB3aGVuVXMgPSBHZXROb3dVcygpICsgZGVsYXlVczsKKyAgICAgICAgaW50NjRfdCBub3dVcyA9IEdldE5vd1VzKCk7CisgICAgICAgIHdoZW5VcyA9IChkZWxheVVzID4gSU5UNjRfTUFYIC0gbm93VXMgPyBJTlQ2NF9NQVggOiBub3dVcyArIGRlbGF5VXMpOworCiAgICAgfSBlbHNlIHsKICAgICAgICAgd2hlblVzID0gR2V0Tm93VXMoKTsKICAgICB9CkBAIC0yMDgsNiArMjEwLDkgQEAKIAogICAgICAgICBpZiAod2hlblVzID4gbm93VXMpIHsKICAgICAgICAgICAgIGludDY0X3QgZGVsYXlVcyA9IHdoZW5VcyAtIG5vd1VzOworICAgICAgICAgICAgaWYgKGRlbGF5VXMgPiBJTlQ2NF9NQVggLyAxMDAwKSB7CisgICAgICAgICAgICAgICAgZGVsYXlVcyA9IElOVDY0X01BWCAvIDEwMDA7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUXVldWVDaGFuZ2VkQ29uZGl0aW9uLndhaXRSZWxhdGl2ZShtTG9jaywgZGVsYXlVcyAqIDEwMDBsbCk7CiAKICAgICAgICAgICAgIHJldHVybiB0cnVlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTmV0d29ya1Nlc3Npb24uY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYWZkYzM3Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDE0MDEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8jZGVmaW5lIExPR19OREVCVUcgMAotI2RlZmluZSBMT0dfVEFHICJOZXR3b3JrU2Vzc2lvbiIKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgIkFOZXR3b3JrU2Vzc2lvbi5oIgotI2luY2x1ZGUgIlBhcnNlZE1lc3NhZ2UuaCIKLQotI2luY2x1ZGUgPGFycGEvaW5ldC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8bGludXgvdGNwLmg+Ci0jaW5jbHVkZSA8bmV0L2lmLmg+Ci0jaW5jbHVkZSA8bmV0ZGIuaD4KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0jaW5jbHVkZSA8c3lzL2lvY3RsLmg+Ci0jaW5jbHVkZSA8c3lzL3NvY2tldC5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9CeXRlVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhVRFBTaXplID0gMTUwMDsKLXN0YXRpYyBjb25zdCBpbnQzMl90IGtNYXhVRFBSZXRyaWVzID0gMjAwOwotCi1zdHJ1Y3QgQU5ldHdvcmtTZXNzaW9uOjpOZXR3b3JrVGhyZWFkIDogcHVibGljIFRocmVhZCB7Ci0gICAgZXhwbGljaXQgTmV0d29ya1RocmVhZChBTmV0d29ya1Nlc3Npb24gKnNlc3Npb24pOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+TmV0d29ya1RocmVhZCgpOwotCi1wcml2YXRlOgotICAgIEFOZXR3b3JrU2Vzc2lvbiAqbVNlc3Npb247Ci0KLSAgICB2aXJ0dWFsIGJvb2wgdGhyZWFkTG9vcCgpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTmV0d29ya1RocmVhZCk7Ci19OwotCi1zdHJ1Y3QgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uIDogcHVibGljIFJlZkJhc2UgewotICAgIGVudW0gTW9kZSB7Ci0gICAgICAgIE1PREVfUlRTUCwKLSAgICAgICAgTU9ERV9EQVRBR1JBTSwKLSAgICAgICAgTU9ERV9XRUJTT0NLRVQsCi0gICAgfTsKLQotICAgIGVudW0gU3RhdGUgewotICAgICAgICBDT05ORUNUSU5HLAotICAgICAgICBDT05ORUNURUQsCi0gICAgICAgIExJU1RFTklOR19SVFNQLAotICAgICAgICBMSVNURU5JTkdfVENQX0RHUkFNUywKLSAgICAgICAgREFUQUdSQU0sCi0gICAgfTsKLQotICAgIFNlc3Npb24oaW50MzJfdCBzZXNzaW9uSUQsCi0gICAgICAgICAgICBTdGF0ZSBzdGF0ZSwKLSAgICAgICAgICAgIGludCBzLAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnkpOwotCi0gICAgaW50MzJfdCBzZXNzaW9uSUQoKSBjb25zdDsKLSAgICBpbnQgc29ja2V0KCkgY29uc3Q7Ci0gICAgc3A8QU1lc3NhZ2U+IGdldE5vdGlmaWNhdGlvbk1lc3NhZ2UoKSBjb25zdDsKLQotICAgIGJvb2wgaXNSVFNQU2VydmVyKCkgY29uc3Q7Ci0gICAgYm9vbCBpc1RDUERhdGFncmFtU2VydmVyKCkgY29uc3Q7Ci0KLSAgICBib29sIHdhbnRzVG9SZWFkKCk7Ci0gICAgYm9vbCB3YW50c1RvV3JpdGUoKTsKLQotICAgIHN0YXR1c190IHJlYWRNb3JlKCk7Ci0gICAgc3RhdHVzX3Qgd3JpdGVNb3JlKCk7Ci0KLSAgICBzdGF0dXNfdCBzZW5kUmVxdWVzdCgKLSAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNzaXplX3Qgc2l6ZSwgYm9vbCB0aW1lVmFsaWQsIGludDY0X3QgdGltZVVzKTsKLQotICAgIHZvaWQgc2V0TW9kZShNb2RlIG1vZGUpOwotCi0gICAgc3RhdHVzX3Qgc3dpdGNoVG9XZWJTb2NrZXRNb2RlKCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5TZXNzaW9uKCk7Ci0KLXByaXZhdGU6Ci0gICAgZW51bSB7Ci0gICAgICAgIEZSQUdNRU5UX0ZMQUdfVElNRV9WQUxJRCA9IDEsCi0gICAgfTsKLSAgICBzdHJ1Y3QgRnJhZ21lbnQgewotICAgICAgICB1aW50MzJfdCBtRmxhZ3M7Ci0gICAgICAgIGludDY0X3QgbVRpbWVVczsKLSAgICAgICAgc3A8QUJ1ZmZlcj4gbUJ1ZmZlcjsKLSAgICB9OwotCi0gICAgaW50MzJfdCBtU2Vzc2lvbklEOwotICAgIFN0YXRlIG1TdGF0ZTsKLSAgICBNb2RlIG1Nb2RlOwotICAgIGludCBtU29ja2V0OwotICAgIHNwPEFNZXNzYWdlPiBtTm90aWZ5OwotICAgIGJvb2wgbVNhd1JlY2VpdmVGYWlsdXJlLCBtU2F3U2VuZEZhaWx1cmU7Ci0gICAgaW50MzJfdCBtVURQUmV0cmllczsKLQotICAgIExpc3Q8RnJhZ21lbnQ+IG1PdXRGcmFnbWVudHM7Ci0KLSAgICBBU3RyaW5nIG1JbkJ1ZmZlcjsKLQotICAgIGludDY0X3QgbUxhc3RTdGFsbFJlcG9ydFVzOwotCi0gICAgdm9pZCBub3RpZnlFcnJvcihib29sIHNlbmQsIHN0YXR1c190IGVyciwgY29uc3QgY2hhciAqZGV0YWlsKTsKLSAgICB2b2lkIG5vdGlmeShOb3RpZmljYXRpb25SZWFzb24gcmVhc29uKTsKLQotICAgIHZvaWQgZHVtcEZyYWdtZW50U3RhdHMoY29uc3QgRnJhZ21lbnQgJmZyYWcpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2Vzc2lvbik7Ci19OwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotQU5ldHdvcmtTZXNzaW9uOjpOZXR3b3JrVGhyZWFkOjpOZXR3b3JrVGhyZWFkKEFOZXR3b3JrU2Vzc2lvbiAqc2Vzc2lvbikKLSAgICA6IG1TZXNzaW9uKHNlc3Npb24pIHsKLX0KLQotQU5ldHdvcmtTZXNzaW9uOjpOZXR3b3JrVGhyZWFkOjp+TmV0d29ya1RocmVhZCgpIHsKLX0KLQotYm9vbCBBTmV0d29ya1Nlc3Npb246Ok5ldHdvcmtUaHJlYWQ6OnRocmVhZExvb3AoKSB7Ci0gICAgbVNlc3Npb24tPnRocmVhZExvb3AoKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1BTmV0d29ya1Nlc3Npb246OlNlc3Npb246OlNlc3Npb24oCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELAotICAgICAgICBTdGF0ZSBzdGF0ZSwKLSAgICAgICAgaW50IHMsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5KQotICAgIDogbVNlc3Npb25JRChzZXNzaW9uSUQpLAotICAgICAgbVN0YXRlKHN0YXRlKSwKLSAgICAgIG1Nb2RlKE1PREVfREFUQUdSQU0pLAotICAgICAgbVNvY2tldChzKSwKLSAgICAgIG1Ob3RpZnkobm90aWZ5KSwKLSAgICAgIG1TYXdSZWNlaXZlRmFpbHVyZShmYWxzZSksCi0gICAgICBtU2F3U2VuZEZhaWx1cmUoZmFsc2UpLAotICAgICAgbVVEUFJldHJpZXMoa01heFVEUFJldHJpZXMpLAotICAgICAgbUxhc3RTdGFsbFJlcG9ydFVzKC0xbGwpIHsKLSAgICBpZiAobVN0YXRlID09IENPTk5FQ1RFRCkgewotICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gbG9jYWxBZGRyOwotICAgICAgICBzb2NrbGVuX3QgbG9jYWxBZGRyTGVuID0gc2l6ZW9mKGxvY2FsQWRkcik7Ci0KLSAgICAgICAgaW50IHJlcyA9IGdldHNvY2tuYW1lKAotICAgICAgICAgICAgICAgIG1Tb2NrZXQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmbG9jYWxBZGRyLCAmbG9jYWxBZGRyTGVuKTsKLSAgICAgICAgQ0hFQ0tfR0UocmVzLCAwKTsKLQotICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVtb3RlQWRkcjsKLSAgICAgICAgc29ja2xlbl90IHJlbW90ZUFkZHJMZW4gPSBzaXplb2YocmVtb3RlQWRkcik7Ci0KLSAgICAgICAgcmVzID0gZ2V0cGVlcm5hbWUoCi0gICAgICAgICAgICAgICAgbVNvY2tldCwgKHN0cnVjdCBzb2NrYWRkciAqKSZyZW1vdGVBZGRyLCAmcmVtb3RlQWRkckxlbik7Ci0gICAgICAgIENIRUNLX0dFKHJlcywgMCk7Ci0KLSAgICAgICAgaW5fYWRkcl90IGFkZHIgPSBudG9obChsb2NhbEFkZHIuc2luX2FkZHIuc19hZGRyKTsKLSAgICAgICAgQVN0cmluZyBsb2NhbEFkZHJTdHJpbmcgPSBBU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICIlZC4lZC4lZC4lZCIsCi0gICAgICAgICAgICAgICAgKGFkZHIgPj4gMjQpLAotICAgICAgICAgICAgICAgIChhZGRyID4+IDE2KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgKGFkZHIgPj4gOCkgJiAweGZmLAotICAgICAgICAgICAgICAgIGFkZHIgJiAweGZmKTsKLQotICAgICAgICBhZGRyID0gbnRvaGwocmVtb3RlQWRkci5zaW5fYWRkci5zX2FkZHIpOwotICAgICAgICBBU3RyaW5nIHJlbW90ZUFkZHJTdHJpbmcgPSBBU3RyaW5nUHJpbnRmKAotICAgICAgICAgICAgICAgICIlZC4lZC4lZC4lZCIsCi0gICAgICAgICAgICAgICAgKGFkZHIgPj4gMjQpLAotICAgICAgICAgICAgICAgIChhZGRyID4+IDE2KSAmIDB4ZmYsCi0gICAgICAgICAgICAgICAgKGFkZHIgPj4gOCkgJiAweGZmLAotICAgICAgICAgICAgICAgIGFkZHIgJiAweGZmKTsKLQotICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgICAgICBtc2ctPnNldEludDMyKCJyZWFzb24iLCBrV2hhdENsaWVudENvbm5lY3RlZCk7Ci0gICAgICAgIG1zZy0+c2V0U3RyaW5nKCJzZXJ2ZXItaXAiLCBsb2NhbEFkZHJTdHJpbmcuY19zdHIoKSk7Ci0gICAgICAgIG1zZy0+c2V0SW50MzIoInNlcnZlci1wb3J0IiwgbnRvaHMobG9jYWxBZGRyLnNpbl9wb3J0KSk7Ci0gICAgICAgIG1zZy0+c2V0U3RyaW5nKCJjbGllbnQtaXAiLCByZW1vdGVBZGRyU3RyaW5nLmNfc3RyKCkpOwotICAgICAgICBtc2ctPnNldEludDMyKCJjbGllbnQtcG9ydCIsIG50b2hzKHJlbW90ZUFkZHIuc2luX3BvcnQpKTsKLSAgICAgICAgbXNnLT5wb3N0KCk7Ci0gICAgfQotfQotCi1BTmV0d29ya1Nlc3Npb246OlNlc3Npb246On5TZXNzaW9uKCkgewotICAgIEFMT0dWKCJTZXNzaW9uICVkIGdvbmUiLCBtU2Vzc2lvbklEKTsKLQotICAgIGNsb3NlKG1Tb2NrZXQpOwotICAgIG1Tb2NrZXQgPSAtMTsKLX0KLQotaW50MzJfdCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OnNlc3Npb25JRCgpIGNvbnN0IHsKLSAgICByZXR1cm4gbVNlc3Npb25JRDsKLX0KLQotaW50IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6c29ja2V0KCkgY29uc3QgewotICAgIHJldHVybiBtU29ja2V0OwotfQotCi12b2lkIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6c2V0TW9kZShNb2RlIG1vZGUpIHsKLSAgICBtTW9kZSA9IG1vZGU7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6c3dpdGNoVG9XZWJTb2NrZXRNb2RlKCkgewotICAgIGlmIChtU3RhdGUgIT0gQ09OTkVDVEVEIHx8IG1Nb2RlICE9IE1PREVfUlRTUCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgbU1vZGUgPSBNT0RFX1dFQlNPQ0tFVDsKLQotICAgIHJldHVybiBPSzsKLX0KLQotc3A8QU1lc3NhZ2U+IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6Z2V0Tm90aWZpY2F0aW9uTWVzc2FnZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbU5vdGlmeTsKLX0KLQotYm9vbCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OmlzUlRTUFNlcnZlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gbVN0YXRlID09IExJU1RFTklOR19SVFNQOwotfQotCi1ib29sIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6aXNUQ1BEYXRhZ3JhbVNlcnZlcigpIGNvbnN0IHsKLSAgICByZXR1cm4gbVN0YXRlID09IExJU1RFTklOR19UQ1BfREdSQU1TOwotfQotCi1ib29sIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6d2FudHNUb1JlYWQoKSB7Ci0gICAgcmV0dXJuICFtU2F3UmVjZWl2ZUZhaWx1cmUgJiYgbVN0YXRlICE9IENPTk5FQ1RJTkc7Ci19Ci0KLWJvb2wgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjp3YW50c1RvV3JpdGUoKSB7Ci0gICAgcmV0dXJuICFtU2F3U2VuZEZhaWx1cmUKLSAgICAgICAgJiYgKG1TdGF0ZSA9PSBDT05ORUNUSU5HCi0gICAgICAgICAgICB8fCAobVN0YXRlID09IENPTk5FQ1RFRCAmJiAhbU91dEZyYWdtZW50cy5lbXB0eSgpKQotICAgICAgICAgICAgfHwgKG1TdGF0ZSA9PSBEQVRBR1JBTSAmJiAhbU91dEZyYWdtZW50cy5lbXB0eSgpKSk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6cmVhZE1vcmUoKSB7Ci0gICAgaWYgKG1TdGF0ZSA9PSBEQVRBR1JBTSkgewotICAgICAgICBDSEVDS19FUShtTW9kZSwgTU9ERV9EQVRBR1JBTSk7Ci0KLSAgICAgICAgc3RhdHVzX3QgZXJyOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBzcDxBQnVmZmVyPiBidWYgPSBuZXcgQUJ1ZmZlcihrTWF4VURQU2l6ZSk7Ci0KLSAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVBZGRyOwotICAgICAgICAgICAgc29ja2xlbl90IHJlbW90ZUFkZHJMZW4gPSBzaXplb2YocmVtb3RlQWRkcik7Ci0KLSAgICAgICAgICAgIHNzaXplX3QgbjsKLSAgICAgICAgICAgIGRvIHsKLSAgICAgICAgICAgICAgICBuID0gcmVjdmZyb20oCi0gICAgICAgICAgICAgICAgICAgICAgICBtU29ja2V0LCBidWYtPmRhdGEoKSwgYnVmLT5jYXBhY2l0eSgpLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgKHN0cnVjdCBzb2NrYWRkciAqKSZyZW1vdGVBZGRyLCAmcmVtb3RlQWRkckxlbik7Ci0gICAgICAgICAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICAgICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgICAgICAgICBlcnIgPSAtRUNPTk5SRVNFVDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmLT5zZXRSYW5nZSgwLCBuKTsKLQotICAgICAgICAgICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotICAgICAgICAgICAgICAgIGJ1Zi0+bWV0YSgpLT5zZXRJbnQ2NCgiYXJyaXZhbFRpbWVVcyIsIG5vd1VzKTsKLQotICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJyZWFzb24iLCBrV2hhdERhdGFncmFtKTsKLQotICAgICAgICAgICAgICAgIHVpbnQzMl90IGlwID0gbnRvaGwocmVtb3RlQWRkci5zaW5fYWRkci5zX2FkZHIpOwotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgImZyb21BZGRyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFTdHJpbmdQcmludGYoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiV1LiV1LiV1LiV1IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpcCA+PiAyNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXAgPj4gMTYpICYgMHhmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXAgPj4gOCkgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlwICYgMHhmZikuY19zdHIoKSk7Ci0KLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJmcm9tUG9ydCIsIG50b2hzKHJlbW90ZUFkZHIuc2luX3BvcnQpKTsKLQotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJkYXRhIiwgYnVmKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSB3aGlsZSAoZXJyID09IE9LKTsKLQotICAgICAgICBpZiAoZXJyID09IC1FQUdBSU4pIHsKLSAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICAgICAgaWYgKCFtVURQUmV0cmllcykgewotICAgICAgICAgICAgICAgIG5vdGlmeUVycm9yKGZhbHNlIC8qIHNlbmQgKi8sIGVyciwgIlJlY3Zmcm9tIGZhaWxlZC4iKTsKLSAgICAgICAgICAgICAgICBtU2F3UmVjZWl2ZUZhaWx1cmUgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtVURQUmV0cmllcy0tOwotICAgICAgICAgICAgICAgIEFMT0dFKCJSZWN2ZnJvbSBmYWlsZWQsICVkLyVkIHJldHJpZXMgbGVmdCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVURQUmV0cmllcywga01heFVEUFJldHJpZXMpOwotICAgICAgICAgICAgICAgIGVyciA9IE9LOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVVEUFJldHJpZXMgPSBrTWF4VURQUmV0cmllczsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgY2hhciB0bXBbNTEyXTsKLSAgICBzc2l6ZV90IG47Ci0gICAgZG8gewotICAgICAgICBuID0gcmVjdihtU29ja2V0LCB0bXAsIHNpemVvZih0bXApLCAwKTsKLSAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIGlmIChuID4gMCkgewotICAgICAgICBtSW5CdWZmZXIuYXBwZW5kKHRtcCwgbik7Ci0KLSNpZiAwCi0gICAgICAgIEFMT0dJKCJpbjoiKTsKLSAgICAgICAgaGV4ZHVtcCh0bXAsIG4pOwotI2VuZGlmCi0gICAgfSBlbHNlIGlmIChuIDwgMCkgewotICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZXJyID0gLUVDT05OUkVTRVQ7Ci0gICAgfQotCi0gICAgaWYgKG1Nb2RlID09IE1PREVfREFUQUdSQU0pIHsKLSAgICAgICAgLy8gVENQIHN0cmVhbSBjYXJyeWluZyAxNi1iaXQgbGVuZ3RoLXByZWZpeGVkIGRhdGFncmFtcy4KLQotICAgICAgICB3aGlsZSAobUluQnVmZmVyLnNpemUoKSA+PSAyKSB7Ci0gICAgICAgICAgICBzaXplX3QgcGFja2V0U2l6ZSA9IFUxNl9BVCgoY29uc3QgdWludDhfdCAqKW1JbkJ1ZmZlci5jX3N0cigpKTsKLQotICAgICAgICAgICAgaWYgKG1JbkJ1ZmZlci5zaXplKCkgPCBwYWNrZXRTaXplICsgMikgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzcDxBQnVmZmVyPiBwYWNrZXQgPSBuZXcgQUJ1ZmZlcihwYWNrZXRTaXplKTsKLSAgICAgICAgICAgIG1lbWNweShwYWNrZXQtPmRhdGEoKSwgbUluQnVmZmVyLmNfc3RyKCkgKyAyLCBwYWNrZXRTaXplKTsKLQotICAgICAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgICAgICBwYWNrZXQtPm1ldGEoKS0+c2V0SW50NjQoImFycml2YWxUaW1lVXMiLCBub3dVcyk7Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicmVhc29uIiwga1doYXREYXRhZ3JhbSk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEJ1ZmZlcigiZGF0YSIsIHBhY2tldCk7Ci0gICAgICAgICAgICBub3RpZnktPnBvc3QoKTsKLQotICAgICAgICAgICAgbUluQnVmZmVyLmVyYXNlKDAsIHBhY2tldFNpemUgKyAyKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gTU9ERV9SVFNQKSB7Ci0gICAgICAgIGZvciAoOzspIHsKLSAgICAgICAgICAgIHNpemVfdCBsZW5ndGg7Ci0KLSAgICAgICAgICAgIGlmIChtSW5CdWZmZXIuc2l6ZSgpID4gMCAmJiBtSW5CdWZmZXIuY19zdHIoKVswXSA9PSAnJCcpIHsKLSAgICAgICAgICAgICAgICBpZiAobUluQnVmZmVyLnNpemUoKSA8IDQpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbGVuZ3RoID0gVTE2X0FUKChjb25zdCB1aW50OF90ICopbUluQnVmZmVyLmNfc3RyKCkgKyAyKTsKLQotICAgICAgICAgICAgICAgIGlmIChtSW5CdWZmZXIuc2l6ZSgpIDwgNCArIGxlbmd0aCkgewotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gbm90aWZ5ID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicmVhc29uIiwga1doYXRCaW5hcnlEYXRhKTsKLSAgICAgICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJjaGFubmVsIiwgbUluQnVmZmVyLmNfc3RyKClbMV0pOwotCi0gICAgICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gZGF0YSA9IG5ldyBBQnVmZmVyKGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgbWVtY3B5KGRhdGEtPmRhdGEoKSwgbUluQnVmZmVyLmNfc3RyKCkgKyA0LCBsZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgaW50NjRfdCBub3dVcyA9IEFMb29wZXI6OkdldE5vd1VzKCk7Ci0gICAgICAgICAgICAgICAgZGF0YS0+bWV0YSgpLT5zZXRJbnQ2NCgiYXJyaXZhbFRpbWVVcyIsIG5vd1VzKTsKLQotICAgICAgICAgICAgICAgIG5vdGlmeS0+c2V0QnVmZmVyKCJkYXRhIiwgZGF0YSk7Ci0gICAgICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0KLSAgICAgICAgICAgICAgICBtSW5CdWZmZXIuZXJhc2UoMCwgNCArIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPFBhcnNlZE1lc3NhZ2U+IG1zZyA9Ci0gICAgICAgICAgICAgICAgUGFyc2VkTWVzc2FnZTo6UGFyc2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBtSW5CdWZmZXIuY19zdHIoKSwgbUluQnVmZmVyLnNpemUoKSwgZXJyICE9IE9LLCAmbGVuZ3RoKTsKLQotICAgICAgICAgICAgaWYgKG1zZyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBub3RpZnkgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0SW50MzIoInNlc3Npb25JRCIsIG1TZXNzaW9uSUQpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigicmVhc29uIiwga1doYXREYXRhKTsKLSAgICAgICAgICAgIG5vdGlmeS0+c2V0T2JqZWN0KCJkYXRhIiwgbXNnKTsKLSAgICAgICAgICAgIG5vdGlmeS0+cG9zdCgpOwotCi0jaWYgMQotICAgICAgICAgICAgLy8gWFhYIFRoZSAob2xkKSBkb25nbGUgc2VuZHMgdGhlIHdyb25nIGNvbnRlbnQgbGVuZ3RoIGhlYWRlciBvbiBhCi0gICAgICAgICAgICAvLyBTRVRfUEFSQU1FVEVSIHJlcXVlc3QgdGhhdCBzaWduYWxzIGEgIndmZF9pZHJfcmVxdWVzdCIuCi0gICAgICAgICAgICAvLyAoMTcgaW5zdGVhZCBvZiAxOSkuCi0gICAgICAgICAgICBjb25zdCBjaGFyICpjb250ZW50ID0gbXNnLT5nZXRDb250ZW50KCk7Ci0gICAgICAgICAgICBpZiAoY29udGVudAotICAgICAgICAgICAgICAgICAgICAmJiAhbWVtY21wKGNvbnRlbnQsICJ3ZmRfaWRyX3JlcXVlc3RcclxuIiwgMTcpCi0gICAgICAgICAgICAgICAgICAgICYmIGxlbmd0aCA+PSAxOQotICAgICAgICAgICAgICAgICAgICAmJiBtSW5CdWZmZXIuY19zdHIoKVtsZW5ndGhdID09ICdccicKLSAgICAgICAgICAgICAgICAgICAgJiYgbUluQnVmZmVyLmNfc3RyKClbbGVuZ3RoICsgMV0gPT0gJ1xuJykgewotICAgICAgICAgICAgICAgIGxlbmd0aCArPSAyOwotICAgICAgICAgICAgfQotI2VuZGlmCi0KLSAgICAgICAgICAgIG1JbkJ1ZmZlci5lcmFzZSgwLCBsZW5ndGgpOwotCi0gICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBDSEVDS19FUShtTW9kZSwgTU9ERV9XRUJTT0NLRVQpOwotCi0gICAgICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSAoY29uc3QgdWludDhfdCAqKW1JbkJ1ZmZlci5jX3N0cigpOwotICAgICAgICAvLyBoZXhkdW1wKGRhdGEsIG1JbkJ1ZmZlci5zaXplKCkpOwotCi0gICAgICAgIHdoaWxlIChtSW5CdWZmZXIuc2l6ZSgpID49IDIpIHsKLSAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAyOwotCi0gICAgICAgICAgICB1aW50NjRfdCBwYXlsb2FkTGVuID0gZGF0YVsxXSAmIDB4N2Y7Ci0gICAgICAgICAgICBpZiAocGF5bG9hZExlbiA9PSAxMjYpIHsKLSAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICsgMiA+IG1JbkJ1ZmZlci5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcGF5bG9hZExlbiA9IFUxNl9BVCgmZGF0YVtvZmZzZXRdKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gMjsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAocGF5bG9hZExlbiA9PSAxMjcpIHsKLSAgICAgICAgICAgICAgICBpZiAob2Zmc2V0ICsgOCA+IG1JbkJ1ZmZlci5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgcGF5bG9hZExlbiA9IFU2NF9BVCgmZGF0YVtvZmZzZXRdKTsKLSAgICAgICAgICAgICAgICBvZmZzZXQgKz0gODsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdWludDMyX3QgbWFzayA9IDA7Ci0gICAgICAgICAgICBpZiAoZGF0YVsxXSAmIDB4ODApIHsKLSAgICAgICAgICAgICAgICAvLyBNQVNLPT0xCi0gICAgICAgICAgICAgICAgaWYgKG9mZnNldCArIDQgPiBtSW5CdWZmZXIuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIG1hc2sgPSBVMzJfQVQoJmRhdGFbb2Zmc2V0XSk7Ci0gICAgICAgICAgICAgICAgb2Zmc2V0ICs9IDQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYXlsb2FkTGVuID4gbUluQnVmZmVyLnNpemUoKSB8fCBvZmZzZXQgPiBtSW5CdWZmZXIuc2l6ZSgpIC0gcGF5bG9hZExlbikgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBXZSBoYXZlIHRoZSBmdWxsIG1lc3NhZ2UuCi0KLSAgICAgICAgICAgIHNwPEFCdWZmZXI+IHBhY2tldCA9IG5ldyBBQnVmZmVyKHBheWxvYWRMZW4pOwotICAgICAgICAgICAgbWVtY3B5KHBhY2tldC0+ZGF0YSgpLCAmZGF0YVtvZmZzZXRdLCBwYXlsb2FkTGVuKTsKLQotICAgICAgICAgICAgaWYgKG1hc2sgIT0gMCkgewotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF5bG9hZExlbjsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhY2tldC0+ZGF0YSgpW2ldID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbb2Zmc2V0ICsgaV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBeICgobWFzayA+PiAoOCAqICgzIC0gKGkgJSA0KSkpKSAmIDB4ZmYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG5vdGlmeSA9IG1Ob3RpZnktPmR1cCgpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgICAgICAgICBub3RpZnktPnNldEludDMyKCJyZWFzb24iLCBrV2hhdFdlYlNvY2tldE1lc3NhZ2UpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRCdWZmZXIoImRhdGEiLCBwYWNrZXQpOwotICAgICAgICAgICAgbm90aWZ5LT5zZXRJbnQzMigiaGVhZGVyQnl0ZSIsIGRhdGFbMF0pOwotICAgICAgICAgICAgbm90aWZ5LT5wb3N0KCk7Ci0KLSAgICAgICAgICAgIG1JbkJ1ZmZlci5lcmFzZSgwLCBvZmZzZXQgKyBwYXlsb2FkTGVuKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgbm90aWZ5RXJyb3IoZmFsc2UgLyogc2VuZCAqLywgZXJyLCAiUmVjdiBmYWlsZWQuIik7Ci0gICAgICAgIG1TYXdSZWNlaXZlRmFpbHVyZSA9IHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotdm9pZCBBTmV0d29ya1Nlc3Npb246OlNlc3Npb246OmR1bXBGcmFnbWVudFN0YXRzKGNvbnN0IEZyYWdtZW50ICYgLyogZnJhZyAqLykgewotI2lmIDAKLSAgICBpbnQ2NF90IG5vd1VzID0gQUxvb3Blcjo6R2V0Tm93VXMoKTsKLSAgICBpbnQ2NF90IGRlbGF5TXMgPSAobm93VXMgLSBmcmFnLm1UaW1lVXMpIC8gMTAwMGxsOwotCi0gICAgc3RhdGljIGNvbnN0IGludDY0X3Qga01pbkRlbGF5TXMgPSAwOwotICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtNYXhEZWxheU1zID0gMzAwOwotCi0gICAgY29uc3QgY2hhciAqa1BhdHRlcm4gPSAiIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyI7Ci0gICAgc2l6ZV90IGtQYXR0ZXJuU2l6ZSA9IHN0cmxlbihrUGF0dGVybik7Ci0KLSAgICBpbnQgbiA9IChrUGF0dGVyblNpemUgKiAoZGVsYXlNcyAtIGtNaW5EZWxheU1zKSkKLSAgICAgICAgICAgICAgICAvIChrTWF4RGVsYXlNcyAtIGtNaW5EZWxheU1zKTsKLQotICAgIGlmIChuIDwgMCkgewotICAgICAgICBuID0gMDsKLSAgICB9IGVsc2UgaWYgKChzaXplX3QpbiA+IGtQYXR0ZXJuU2l6ZSkgewotICAgICAgICBuID0ga1BhdHRlcm5TaXplOwotICAgIH0KLQotICAgIEFMT0dJKCJbJWxsZF06ICglNGxsZCBtcykgJXNcbiIsCi0gICAgICAgICAgZnJhZy5tVGltZVVzIC8gMTAwMCwKLSAgICAgICAgICBkZWxheU1zLAotICAgICAgICAgIGtQYXR0ZXJuICsga1BhdHRlcm5TaXplIC0gbik7Ci0jZW5kaWYKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjp3cml0ZU1vcmUoKSB7Ci0gICAgaWYgKG1TdGF0ZSA9PSBEQVRBR1JBTSkgewotICAgICAgICBDSEVDSyghbU91dEZyYWdtZW50cy5lbXB0eSgpKTsKLQotICAgICAgICBzdGF0dXNfdCBlcnI7Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIGNvbnN0IEZyYWdtZW50ICZmcmFnID0gKm1PdXRGcmFnbWVudHMuYmVnaW4oKTsKLSAgICAgICAgICAgIGNvbnN0IHNwPEFCdWZmZXI+ICZkYXRhZ3JhbSA9IGZyYWcubUJ1ZmZlcjsKLQotICAgICAgICAgICAgaW50IG47Ci0gICAgICAgICAgICBkbyB7Ci0gICAgICAgICAgICAgICAgbiA9IHNlbmQobVNvY2tldCwgZGF0YWdyYW0tPmRhdGEoKSwgZGF0YWdyYW0tPnNpemUoKSwgMCk7Ci0gICAgICAgICAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICAgICAgICAgIGVyciA9IE9LOwotCi0gICAgICAgICAgICBpZiAobiA+IDApIHsKLSAgICAgICAgICAgICAgICBpZiAoZnJhZy5tRmxhZ3MgJiBGUkFHTUVOVF9GTEFHX1RJTUVfVkFMSUQpIHsKLSAgICAgICAgICAgICAgICAgICAgZHVtcEZyYWdtZW50U3RhdHMoZnJhZyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbU91dEZyYWdtZW50cy5lcmFzZShtT3V0RnJhZ21lbnRzLmJlZ2luKCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChuIDwgMCkgewotICAgICAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZXJyID0gLUVDT05OUkVTRVQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKGVyciA9PSBPSyAmJiAhbU91dEZyYWdtZW50cy5lbXB0eSgpKTsKLQotICAgICAgICBpZiAoZXJyID09IC1FQUdBSU4pIHsKLSAgICAgICAgICAgIGlmICghbU91dEZyYWdtZW50cy5lbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0koIiV6dSBkYXRhZ3JhbXMgcmVtYWluIHF1ZXVlZC4iLCBtT3V0RnJhZ21lbnRzLnNpemUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgIGlmICghbVVEUFJldHJpZXMpIHsKLSAgICAgICAgICAgICAgICBub3RpZnlFcnJvcih0cnVlIC8qIHNlbmQgKi8sIGVyciwgIlNlbmQgZGF0YWdyYW0gZmFpbGVkLiIpOwotICAgICAgICAgICAgICAgIG1TYXdTZW5kRmFpbHVyZSA9IHRydWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1VRFBSZXRyaWVzLS07Ci0gICAgICAgICAgICAgICAgQUxPR0UoIlNlbmQgZGF0YWdyYW0gZmFpbGVkLCAlZC8lZCByZXRyaWVzIGxlZnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgbVVEUFJldHJpZXMsIGtNYXhVRFBSZXRyaWVzKTsKLSAgICAgICAgICAgICAgICBlcnIgPSBPSzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1VRFBSZXRyaWVzID0ga01heFVEUFJldHJpZXM7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXJyOwotICAgIH0KLQotICAgIGlmIChtU3RhdGUgPT0gQ09OTkVDVElORykgewotICAgICAgICBpbnQgZXJyOwotICAgICAgICBzb2NrbGVuX3Qgb3B0aW9uTGVuID0gc2l6ZW9mKGVycik7Ci0gICAgICAgIENIRUNLX0VRKGdldHNvY2tvcHQobVNvY2tldCwgU09MX1NPQ0tFVCwgU09fRVJST1IsICZlcnIsICZvcHRpb25MZW4pLCAwKTsKLSAgICAgICAgQ0hFQ0tfRVEob3B0aW9uTGVuLCAoc29ja2xlbl90KXNpemVvZihlcnIpKTsKLQotICAgICAgICBpZiAoZXJyICE9IDApIHsKLSAgICAgICAgICAgIG5vdGlmeUVycm9yKGtXaGF0RXJyb3IsIC1lcnIsICJDb25uZWN0aW9uIGZhaWxlZCIpOwotICAgICAgICAgICAgbVNhd1NlbmRGYWlsdXJlID0gdHJ1ZTsKLQotICAgICAgICAgICAgcmV0dXJuIC1lcnI7Ci0gICAgICAgIH0KLQotICAgICAgICBtU3RhdGUgPSBDT05ORUNURUQ7Ci0gICAgICAgIG5vdGlmeShrV2hhdENvbm5lY3RlZCk7Ci0KLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIENIRUNLX0VRKG1TdGF0ZSwgQ09OTkVDVEVEKTsKLSAgICBDSEVDSyghbU91dEZyYWdtZW50cy5lbXB0eSgpKTsKLQotICAgIHNzaXplX3QgbiA9IC0xOwotICAgIHdoaWxlICghbU91dEZyYWdtZW50cy5lbXB0eSgpKSB7Ci0gICAgICAgIGNvbnN0IEZyYWdtZW50ICZmcmFnID0gKm1PdXRGcmFnbWVudHMuYmVnaW4oKTsKLQotICAgICAgICBkbyB7Ci0gICAgICAgICAgICBuID0gc2VuZChtU29ja2V0LCBmcmFnLm1CdWZmZXItPmRhdGEoKSwgZnJhZy5tQnVmZmVyLT5zaXplKCksIDApOwotICAgICAgICB9IHdoaWxlIChuIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICAgICAgaWYgKG4gPD0gMCkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBmcmFnLm1CdWZmZXItPnNldFJhbmdlKAotICAgICAgICAgICAgICAgIGZyYWcubUJ1ZmZlci0+b2Zmc2V0KCkgKyBuLCBmcmFnLm1CdWZmZXItPnNpemUoKSAtIG4pOwotCi0gICAgICAgIGlmIChmcmFnLm1CdWZmZXItPnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGZyYWcubUZsYWdzICYgRlJBR01FTlRfRkxBR19USU1FX1ZBTElEKSB7Ci0gICAgICAgICAgICBkdW1wRnJhZ21lbnRTdGF0cyhmcmFnKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1PdXRGcmFnbWVudHMuZXJhc2UobU91dEZyYWdtZW50cy5iZWdpbigpKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLQotICAgIGlmIChuIDwgMCkgewotICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgfSBlbHNlIGlmIChuID09IDApIHsKLSAgICAgICAgZXJyID0gLUVDT05OUkVTRVQ7Ci0gICAgfQotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBub3RpZnlFcnJvcih0cnVlIC8qIHNlbmQgKi8sIGVyciwgIlNlbmQgZmFpbGVkLiIpOwotICAgICAgICBtU2F3U2VuZEZhaWx1cmUgPSB0cnVlOwotICAgIH0KLQotI2lmIDAKLSAgICBpbnQgbnVtQnl0ZXNRdWV1ZWQ7Ci0gICAgaW50IHJlcyA9IGlvY3RsKG1Tb2NrZXQsIFNJT0NPVVRRLCAmbnVtQnl0ZXNRdWV1ZWQpOwotICAgIGlmIChyZXMgPT0gMCAmJiBudW1CeXRlc1F1ZXVlZCA+IDUwICogMTAyNCkgewotICAgICAgICBpZiAobnVtQnl0ZXNRdWV1ZWQgPiA0MDk2MDApIHsKLSAgICAgICAgICAgIEFMT0dXKCIhISEgbnVtQnl0ZXNRdWV1ZWQgPSAlZCIsIG51bUJ5dGVzUXVldWVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludDY0X3Qgbm93VXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotCi0gICAgICAgIGlmIChtTGFzdFN0YWxsUmVwb3J0VXMgPCAwbGwKLSAgICAgICAgICAgICAgICB8fCBub3dVcyA+IG1MYXN0U3RhbGxSZXBvcnRVcyArIDEwMDAwMGxsKSB7Ci0gICAgICAgICAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgICAgICAgICBtc2ctPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICAgICAgICAgIG1zZy0+c2V0SW50MzIoInJlYXNvbiIsIGtXaGF0TmV0d29ya1N0YWxsKTsKLSAgICAgICAgICAgIG1zZy0+c2V0U2l6ZSgibnVtQnl0ZXNRdWV1ZWQiLCBudW1CeXRlc1F1ZXVlZCk7Ci0gICAgICAgICAgICBtc2ctPnBvc3QoKTsKLQotICAgICAgICAgICAgbUxhc3RTdGFsbFJlcG9ydFVzID0gbm93VXM7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6c2VuZFJlcXVlc3QoCi0gICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNzaXplX3Qgc2l6ZSwgYm9vbCB0aW1lVmFsaWQsIGludDY0X3QgdGltZVVzKSB7Ci0gICAgQ0hFQ0sobVN0YXRlID09IENPTk5FQ1RFRCB8fCBtU3RhdGUgPT0gREFUQUdSQU0pOwotCi0gICAgaWYgKHNpemUgPCAwKSB7Ci0gICAgICAgIHNpemUgPSBzdHJsZW4oKGNvbnN0IGNoYXIgKilkYXRhKTsKLSAgICB9Ci0KLSAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICBzcDxBQnVmZmVyPiBidWZmZXI7Ci0KLSAgICBpZiAobVN0YXRlID09IENPTk5FQ1RFRCAmJiBtTW9kZSA9PSBNT0RFX0RBVEFHUkFNKSB7Ci0gICAgICAgIENIRUNLX0xFKHNpemUsIDY1NTM1KTsKLQotICAgICAgICBidWZmZXIgPSBuZXcgQUJ1ZmZlcihzaXplICsgMik7Ci0gICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzBdID0gc2l6ZSA+PiA4OwotICAgICAgICBidWZmZXItPmRhdGEoKVsxXSA9IHNpemUgJiAweGZmOwotICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCkgKyAyLCBkYXRhLCBzaXplKTsKLSAgICB9IGVsc2UgaWYgKG1TdGF0ZSA9PSBDT05ORUNURUQgJiYgbU1vZGUgPT0gTU9ERV9XRUJTT0NLRVQpIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGJvb2wga1VzZU1hc2sgPSBmYWxzZTsgIC8vIENocm9taXVtIGRvZXNuJ3QgbGlrZSBpdC4KLQotICAgICAgICBzaXplX3QgbnVtSGVhZGVyQnl0ZXMgPSAyICsgKGtVc2VNYXNrID8gNCA6IDApOwotICAgICAgICBpZiAoc2l6ZSA+IDY1NTM1KSB7Ci0gICAgICAgICAgICBudW1IZWFkZXJCeXRlcyArPSA4OwotICAgICAgICB9IGVsc2UgaWYgKHNpemUgPiAxMjUpIHsKLSAgICAgICAgICAgIG51bUhlYWRlckJ5dGVzICs9IDI7Ci0gICAgICAgIH0KLQotICAgICAgICBidWZmZXIgPSBuZXcgQUJ1ZmZlcihudW1IZWFkZXJCeXRlcyArIHNpemUpOwotICAgICAgICBidWZmZXItPmRhdGEoKVswXSA9IDB4ODE7ICAvLyBGSU49PTEgfCBvcGNvZGU9MSAodGV4dCkKLSAgICAgICAgYnVmZmVyLT5kYXRhKClbMV0gPSBrVXNlTWFzayA/IDB4ODAgOiAweDAwOwotCi0gICAgICAgIGlmIChzaXplID4gNjU1MzUpIHsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzFdIHw9IDEyNzsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzJdID0gMHgwMDsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzNdID0gMHgwMDsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzRdID0gMHgwMDsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzVdID0gMHgwMDsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzZdID0gKHNpemUgPj4gMjQpICYgMHhmZjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzddID0gKHNpemUgPj4gMTYpICYgMHhmZjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzhdID0gKHNpemUgPj4gOCkgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbOV0gPSBzaXplICYgMHhmZjsKLSAgICAgICAgfSBlbHNlIGlmIChzaXplID4gMTI1KSB7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVsxXSB8PSAxMjY7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVsyXSA9IChzaXplID4+IDgpICYgMHhmZjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpWzNdID0gc2l6ZSAmIDB4ZmY7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVsxXSB8PSBzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGtVc2VNYXNrKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBtYXNrID0gcmFuZCgpOwotCi0gICAgICAgICAgICBidWZmZXItPmRhdGEoKVtudW1IZWFkZXJCeXRlcyAtIDRdID0gKG1hc2sgPj4gMjQpICYgMHhmZjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpW251bUhlYWRlckJ5dGVzIC0gM10gPSAobWFzayA+PiAxNikgJiAweGZmOwotICAgICAgICAgICAgYnVmZmVyLT5kYXRhKClbbnVtSGVhZGVyQnl0ZXMgLSAyXSA9IChtYXNrID4+IDgpICYgMHhmZjsKLSAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpW251bUhlYWRlckJ5dGVzIC0gMV0gPSBtYXNrICYgMHhmZjsKLQotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCAoc2l6ZV90KXNpemU7ICsraSkgewotICAgICAgICAgICAgICAgIGJ1ZmZlci0+ZGF0YSgpW251bUhlYWRlckJ5dGVzICsgaV0gPQotICAgICAgICAgICAgICAgICAgICAoKGNvbnN0IHVpbnQ4X3QgKilkYXRhKVtpXQotICAgICAgICAgICAgICAgICAgICAgICAgXiAoKG1hc2sgPj4gKDggKiAoMyAtIChpICUgNCkpKSkgJiAweGZmKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1lbWNweShidWZmZXItPmRhdGEoKSArIG51bUhlYWRlckJ5dGVzLCBkYXRhLCBzaXplKTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ1ZmZlciA9IG5ldyBBQnVmZmVyKHNpemUpOwotICAgICAgICBtZW1jcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIHNpemUpOwotICAgIH0KLQotICAgIEZyYWdtZW50IGZyYWc7Ci0KLSAgICBmcmFnLm1GbGFncyA9IDA7Ci0gICAgaWYgKHRpbWVWYWxpZCkgewotICAgICAgICBmcmFnLm1GbGFncyA9IEZSQUdNRU5UX0ZMQUdfVElNRV9WQUxJRDsKLSAgICAgICAgZnJhZy5tVGltZVVzID0gdGltZVVzOwotICAgIH0KLQotICAgIGZyYWcubUJ1ZmZlciA9IGJ1ZmZlcjsKLQotICAgIG1PdXRGcmFnbWVudHMucHVzaF9iYWNrKGZyYWcpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi12b2lkIEFOZXR3b3JrU2Vzc2lvbjo6U2Vzc2lvbjo6bm90aWZ5RXJyb3IoCi0gICAgICAgIGJvb2wgc2VuZCwgc3RhdHVzX3QgZXJyLCBjb25zdCBjaGFyICpkZXRhaWwpIHsKLSAgICBzcDxBTWVzc2FnZT4gbXNnID0gbU5vdGlmeS0+ZHVwKCk7Ci0gICAgbXNnLT5zZXRJbnQzMigic2Vzc2lvbklEIiwgbVNlc3Npb25JRCk7Ci0gICAgbXNnLT5zZXRJbnQzMigicmVhc29uIiwga1doYXRFcnJvcik7Ci0gICAgbXNnLT5zZXRJbnQzMigic2VuZCIsIHNlbmQpOwotICAgIG1zZy0+c2V0SW50MzIoImVyciIsIGVycik7Ci0gICAgbXNnLT5zZXRTdHJpbmcoImRldGFpbCIsIGRldGFpbCk7Ci0gICAgbXNnLT5wb3N0KCk7Ci19Ci0KLXZvaWQgQU5ldHdvcmtTZXNzaW9uOjpTZXNzaW9uOjpub3RpZnkoTm90aWZpY2F0aW9uUmVhc29uIHJlYXNvbikgewotICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBtTm90aWZ5LT5kdXAoKTsKLSAgICBtc2ctPnNldEludDMyKCJzZXNzaW9uSUQiLCBtU2Vzc2lvbklEKTsKLSAgICBtc2ctPnNldEludDMyKCJyZWFzb24iLCByZWFzb24pOwotICAgIG1zZy0+cG9zdCgpOwotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi1BTmV0d29ya1Nlc3Npb246OkFOZXR3b3JrU2Vzc2lvbigpCi0gICAgOiBtTmV4dFNlc3Npb25JRCgxKSB7Ci0gICAgbVBpcGVGZFswXSA9IG1QaXBlRmRbMV0gPSAtMTsKLX0KLQotQU5ldHdvcmtTZXNzaW9uOjp+QU5ldHdvcmtTZXNzaW9uKCkgewotICAgIHN0b3AoKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpzdGFydCgpIHsKLSAgICBpZiAobVRocmVhZCAhPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KLSAgICBpbnQgcmVzID0gcGlwZShtUGlwZUZkKTsKLSAgICBpZiAocmVzICE9IDApIHsKLSAgICAgICAgbVBpcGVGZFswXSA9IG1QaXBlRmRbMV0gPSAtMTsKLSAgICAgICAgcmV0dXJuIC1lcnJubzsKLSAgICB9Ci0KLSAgICBtVGhyZWFkID0gbmV3IE5ldHdvcmtUaHJlYWQodGhpcyk7Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtVGhyZWFkLT5ydW4oIkFOZXR3b3JrU2Vzc2lvbiIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOwotCi0gICAgaWYgKGVyciAhPSBPSykgewotICAgICAgICBtVGhyZWFkLmNsZWFyKCk7Ci0KLSAgICAgICAgY2xvc2UobVBpcGVGZFswXSk7Ci0gICAgICAgIGNsb3NlKG1QaXBlRmRbMV0pOwotICAgICAgICBtUGlwZUZkWzBdID0gbVBpcGVGZFsxXSA9IC0xOwotCi0gICAgICAgIHJldHVybiBlcnI7Ci0gICAgfQotCi0gICAgcmV0dXJuIE9LOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OnN0b3AoKSB7Ci0gICAgaWYgKG1UaHJlYWQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQotCi0gICAgbVRocmVhZC0+cmVxdWVzdEV4aXQoKTsKLSAgICBpbnRlcnJ1cHQoKTsKLSAgICBtVGhyZWFkLT5yZXF1ZXN0RXhpdEFuZFdhaXQoKTsKLQotICAgIG1UaHJlYWQuY2xlYXIoKTsKLQotICAgIGNsb3NlKG1QaXBlRmRbMF0pOwotICAgIGNsb3NlKG1QaXBlRmRbMV0pOwotICAgIG1QaXBlRmRbMF0gPSBtUGlwZUZkWzFdID0gLTE7Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlUlRTUENsaWVudCgKLSAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgdW5zaWduZWQgcG9ydCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgIGludDMyX3QgKnNlc3Npb25JRCkgewotICAgIHJldHVybiBjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgICAgIGtNb2RlQ3JlYXRlUlRTUENsaWVudCwKLSAgICAgICAgICAgIE5VTEwgLyogYWRkciAqLywKLSAgICAgICAgICAgIDAgLyogcG9ydCAqLywKLSAgICAgICAgICAgIGhvc3QsCi0gICAgICAgICAgICBwb3J0LAotICAgICAgICAgICAgbm90aWZ5LAotICAgICAgICAgICAgc2Vzc2lvbklEKTsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpjcmVhdGVSVFNQU2VydmVyKAotICAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAmYWRkciwgdW5zaWduZWQgcG9ydCwKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGludDMyX3QgKnNlc3Npb25JRCkgewotICAgIHJldHVybiBjcmVhdGVDbGllbnRPclNlcnZlcigKLSAgICAgICAgICAgIGtNb2RlQ3JlYXRlUlRTUFNlcnZlciwKLSAgICAgICAgICAgICZhZGRyLAotICAgICAgICAgICAgcG9ydCwKLSAgICAgICAgICAgIE5VTEwgLyogcmVtb3RlSG9zdCAqLywKLSAgICAgICAgICAgIDAgLyogcmVtb3RlUG9ydCAqLywKLSAgICAgICAgICAgIG5vdGlmeSwKLSAgICAgICAgICAgIHNlc3Npb25JRCk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlVURQU2Vzc2lvbigKLSAgICAgICAgdW5zaWduZWQgbG9jYWxQb3J0LCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZVVEUFNlc3Npb24obG9jYWxQb3J0LCBOVUxMLCAwLCBub3RpZnksIHNlc3Npb25JRCk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlVURQU2Vzc2lvbigKLSAgICAgICAgdW5zaWduZWQgbG9jYWxQb3J0LAotICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNsaWVudE9yU2VydmVyKAotICAgICAgICAgICAga01vZGVDcmVhdGVVRFBTZXNzaW9uLAotICAgICAgICAgICAgTlVMTCAvKiBhZGRyICovLAotICAgICAgICAgICAgbG9jYWxQb3J0LAotICAgICAgICAgICAgcmVtb3RlSG9zdCwKLSAgICAgICAgICAgIHJlbW90ZVBvcnQsCi0gICAgICAgICAgICBub3RpZnksCi0gICAgICAgICAgICBzZXNzaW9uSUQpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbigKLSAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgJmFkZHIsIHVuc2lnbmVkIHBvcnQsCi0gICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LCBpbnQzMl90ICpzZXNzaW9uSUQpIHsKLSAgICByZXR1cm4gY3JlYXRlQ2xpZW50T3JTZXJ2ZXIoCi0gICAgICAgICAgICBrTW9kZUNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvblBhc3NpdmUsCi0gICAgICAgICAgICAmYWRkciwKLSAgICAgICAgICAgIHBvcnQsCi0gICAgICAgICAgICBOVUxMIC8qIHJlbW90ZUhvc3QgKi8sCi0gICAgICAgICAgICAwIC8qIHJlbW90ZVBvcnQgKi8sCi0gICAgICAgICAgICBub3RpZnksCi0gICAgICAgICAgICBzZXNzaW9uSUQpOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OmNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbigKLSAgICAgICAgdW5zaWduZWQgbG9jYWxQb3J0LAotICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICB1bnNpZ25lZCByZW1vdGVQb3J0LAotICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwKLSAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUNsaWVudE9yU2VydmVyKAotICAgICAgICAgICAga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmUsCi0gICAgICAgICAgICBOVUxMIC8qIGFkZHIgKi8sCi0gICAgICAgICAgICBsb2NhbFBvcnQsCi0gICAgICAgICAgICByZW1vdGVIb3N0LAotICAgICAgICAgICAgcmVtb3RlUG9ydCwKLSAgICAgICAgICAgIG5vdGlmeSwKLSAgICAgICAgICAgIHNlc3Npb25JRCk7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6ZGVzdHJveVNlc3Npb24oaW50MzJfdCBzZXNzaW9uSUQpIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgc3NpemVfdCBpbmRleCA9IG1TZXNzaW9ucy5pbmRleE9mS2V5KHNlc3Npb25JRCk7Ci0KLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIHJldHVybiAtRU5PRU5UOwotICAgIH0KLQotICAgIG1TZXNzaW9ucy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKLQotICAgIGludGVycnVwdCgpOwotCi0gICAgcmV0dXJuIE9LOwotfQotCi0vLyBzdGF0aWMKLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6TWFrZVNvY2tldE5vbkJsb2NraW5nKGludCBzKSB7Ci0gICAgaW50IGZsYWdzID0gZmNudGwocywgRl9HRVRGTCwgMCk7Ci0gICAgaWYgKGZsYWdzIDwgMCkgewotICAgICAgICBmbGFncyA9IDA7Ci0gICAgfQotCi0gICAgaW50IHJlcyA9IGZjbnRsKHMsIEZfU0VURkwsIGZsYWdzIHwgT19OT05CTE9DSyk7Ci0gICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgcmV0dXJuIC1lcnJubzsKLSAgICB9Ci0KLSAgICByZXR1cm4gT0s7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y3JlYXRlQ2xpZW50T3JTZXJ2ZXIoCi0gICAgICAgIE1vZGUgbW9kZSwKLSAgICAgICAgY29uc3Qgc3RydWN0IGluX2FkZHIgKmxvY2FsQWRkciwKLSAgICAgICAgdW5zaWduZWQgcG9ydCwKLSAgICAgICAgY29uc3QgY2hhciAqcmVtb3RlSG9zdCwKLSAgICAgICAgdW5zaWduZWQgcmVtb3RlUG9ydCwKLSAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgIGludDMyX3QgKnNlc3Npb25JRCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICAqc2Vzc2lvbklEID0gMDsKLSAgICBzdGF0dXNfdCBlcnIgPSBPSzsKLSAgICBpbnQgcywgcmVzOwotICAgIHNwPFNlc3Npb24+IHNlc3Npb247Ci0KLSAgICBzID0gc29ja2V0KAotICAgICAgICAgICAgQUZfSU5FVCwKLSAgICAgICAgICAgIChtb2RlID09IGtNb2RlQ3JlYXRlVURQU2Vzc2lvbikgPyBTT0NLX0RHUkFNIDogU09DS19TVFJFQU0sCi0gICAgICAgICAgICAwKTsKLQotICAgIGlmIChzIDwgMCkgewotICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgIGdvdG8gYmFpbDsKLSAgICB9Ci0KLSAgICBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVJUU1BTZXJ2ZXIKLSAgICAgICAgICAgIHx8IG1vZGUgPT0ga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25QYXNzaXZlKSB7Ci0gICAgICAgIGNvbnN0IGludCB5ZXMgPSAxOwotICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJnllcywgc2l6ZW9mKHllcykpOwotCi0gICAgICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgICAgICBlcnIgPSAtZXJybm87Ci0gICAgICAgICAgICBnb3RvIGJhaWwyOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVVRFBTZXNzaW9uKSB7Ci0gICAgICAgIGludCBzaXplID0gMjU2ICogMTAyNDsKLQotICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX1JDVkJVRiwgJnNpemUsIHNpemVvZihzaXplKSk7Ci0KLSAgICAgICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgICAgIH0KLQotICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMsIFNPTF9TT0NLRVQsIFNPX1NOREJVRiwgJnNpemUsIHNpemVvZihzaXplKSk7Ci0KLSAgICAgICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmUpIHsKLSAgICAgICAgaW50IGZsYWcgPSAxOwotICAgICAgICByZXMgPSBzZXRzb2Nrb3B0KHMsIElQUFJPVE9fVENQLCBUQ1BfTk9ERUxBWSwgJmZsYWcsIHNpemVvZihmbGFnKSk7Ci0KLSAgICAgICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgICAgIGVyciA9IC1lcnJubzsKLSAgICAgICAgICAgIGdvdG8gYmFpbDI7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgdG9zID0gMjI0OyAgLy8gVk9JQ0UKLSAgICAgICAgcmVzID0gc2V0c29ja29wdChzLCBJUFBST1RPX0lQLCBJUF9UT1MsICZ0b3MsIHNpemVvZih0b3MpKTsKLQotICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGVyciA9IE1ha2VTb2NrZXROb25CbG9ja2luZyhzKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgZ290byBiYWlsMjsKLSAgICB9Ci0KLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKLSAgICBtZW1zZXQoYWRkci5zaW5femVybywgMCwgc2l6ZW9mKGFkZHIuc2luX3plcm8pKTsKLSAgICBhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotCi0gICAgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVSVFNQQ2xpZW50Ci0gICAgICAgICAgICB8fCBtb2RlID09IGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uQWN0aXZlKSB7Ci0gICAgICAgIHN0cnVjdCBob3N0ZW50ICplbnQ9IGdldGhvc3RieW5hbWUocmVtb3RlSG9zdCk7Ci0gICAgICAgIGlmIChlbnQgPT0gTlVMTCkgewotICAgICAgICAgICAgZXJyID0gLWhfZXJybm87Ci0gICAgICAgICAgICBnb3RvIGJhaWwyOwotICAgICAgICB9Ci0KLSAgICAgICAgYWRkci5zaW5fYWRkci5zX2FkZHIgPSAqKGluX2FkZHJfdCAqKWVudC0+aF9hZGRyOwotICAgICAgICBhZGRyLnNpbl9wb3J0ID0gaHRvbnMocmVtb3RlUG9ydCk7Ci0gICAgfSBlbHNlIGlmIChsb2NhbEFkZHIgIT0gTlVMTCkgewotICAgICAgICBhZGRyLnNpbl9hZGRyID0gKmxvY2FsQWRkcjsKLSAgICAgICAgYWRkci5zaW5fcG9ydCA9IGh0b25zKHBvcnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGFkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0FOWSk7Ci0gICAgICAgIGFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKLSAgICB9Ci0KLSAgICBpZiAobW9kZSA9PSBrTW9kZUNyZWF0ZVJUU1BDbGllbnQKLSAgICAgICAgICAgIHx8IG1vZGUgPT0ga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmUpIHsKLSAgICAgICAgaW5fYWRkcl90IHggPSBudG9obChhZGRyLnNpbl9hZGRyLnNfYWRkcik7Ci0gICAgICAgIEFMT0dJKCJjb25uZWN0aW5nIHNvY2tldCAlZCB0byAlZC4lZC4lZC4lZDolZCIsCi0gICAgICAgICAgICAgIHMsCi0gICAgICAgICAgICAgICh4ID4+IDI0KSwKLSAgICAgICAgICAgICAgKHggPj4gMTYpICYgMHhmZiwKLSAgICAgICAgICAgICAgKHggPj4gOCkgJiAweGZmLAotICAgICAgICAgICAgICB4ICYgMHhmZiwKLSAgICAgICAgICAgICAgbnRvaHMoYWRkci5zaW5fcG9ydCkpOwotCi0gICAgICAgIHJlcyA9IGNvbm5lY3QocywgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpOwotCi0gICAgICAgIENIRUNLX0xUKHJlcywgMCk7Ci0gICAgICAgIGlmIChlcnJubyA9PSBFSU5QUk9HUkVTUykgewotICAgICAgICAgICAgcmVzID0gMDsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlcyA9IGJpbmQocywgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZhZGRyLCBzaXplb2YoYWRkcikpOwotCi0gICAgICAgIGlmIChyZXMgPT0gMCkgewotICAgICAgICAgICAgaWYgKG1vZGUgPT0ga01vZGVDcmVhdGVSVFNQU2VydmVyCi0gICAgICAgICAgICAgICAgICAgIHx8IG1vZGUgPT0ga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25QYXNzaXZlKSB7Ci0gICAgICAgICAgICAgICAgcmVzID0gbGlzdGVuKHMsIDQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBDSEVDS19FUShtb2RlLCBrTW9kZUNyZWF0ZVVEUFNlc3Npb24pOwotCi0gICAgICAgICAgICAgICAgaWYgKHJlbW90ZUhvc3QgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVtb3RlQWRkcjsKLSAgICAgICAgICAgICAgICAgICAgbWVtc2V0KHJlbW90ZUFkZHIuc2luX3plcm8sIDAsIHNpemVvZihyZW1vdGVBZGRyLnNpbl96ZXJvKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW90ZUFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7Ci0gICAgICAgICAgICAgICAgICAgIHJlbW90ZUFkZHIuc2luX3BvcnQgPSBodG9ucyhyZW1vdGVQb3J0KTsKLQotICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgaG9zdGVudCAqZW50PSBnZXRob3N0YnluYW1lKHJlbW90ZUhvc3QpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZW50ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGVyciA9IC1oX2Vycm5vOwotICAgICAgICAgICAgICAgICAgICAgICAgZ290byBiYWlsMjsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHJlbW90ZUFkZHIuc2luX2FkZHIuc19hZGRyID0gKihpbl9hZGRyX3QgKillbnQtPmhfYWRkcjsKLQotICAgICAgICAgICAgICAgICAgICByZXMgPSBjb25uZWN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHN0cnVjdCBzb2NrYWRkciAqKSZyZW1vdGVBZGRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihyZW1vdGVBZGRyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHJlcyA8IDApIHsKLSAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICBnb3RvIGJhaWwyOwotICAgIH0KLQotICAgIFNlc3Npb246OlN0YXRlIHN0YXRlOwotICAgIHN3aXRjaCAobW9kZSkgewotICAgICAgICBjYXNlIGtNb2RlQ3JlYXRlUlRTUENsaWVudDoKLSAgICAgICAgICAgIHN0YXRlID0gU2Vzc2lvbjo6Q09OTkVDVElORzsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2Uga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmU6Ci0gICAgICAgICAgICBzdGF0ZSA9IFNlc3Npb246OkNPTk5FQ1RJTkc7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uUGFzc2l2ZToKLSAgICAgICAgICAgIHN0YXRlID0gU2Vzc2lvbjo6TElTVEVOSU5HX1RDUF9ER1JBTVM7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIGtNb2RlQ3JlYXRlUlRTUFNlcnZlcjoKLSAgICAgICAgICAgIHN0YXRlID0gU2Vzc2lvbjo6TElTVEVOSU5HX1JUU1A7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQ0hFQ0tfRVEobW9kZSwga01vZGVDcmVhdGVVRFBTZXNzaW9uKTsKLSAgICAgICAgICAgIHN0YXRlID0gU2Vzc2lvbjo6REFUQUdSQU07Ci0gICAgICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBzZXNzaW9uID0gbmV3IFNlc3Npb24oCi0gICAgICAgICAgICBtTmV4dFNlc3Npb25JRCsrLAotICAgICAgICAgICAgc3RhdGUsCi0gICAgICAgICAgICBzLAotICAgICAgICAgICAgbm90aWZ5KTsKLQotICAgIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uQWN0aXZlKSB7Ci0gICAgICAgIHNlc3Npb24tPnNldE1vZGUoU2Vzc2lvbjo6TU9ERV9EQVRBR1JBTSk7Ci0gICAgfSBlbHNlIGlmIChtb2RlID09IGtNb2RlQ3JlYXRlUlRTUENsaWVudCkgewotICAgICAgICBzZXNzaW9uLT5zZXRNb2RlKFNlc3Npb246Ok1PREVfUlRTUCk7Ci0gICAgfQotCi0gICAgbVNlc3Npb25zLmFkZChzZXNzaW9uLT5zZXNzaW9uSUQoKSwgc2Vzc2lvbik7Ci0KLSAgICBpbnRlcnJ1cHQoKTsKLQotICAgICpzZXNzaW9uSUQgPSBzZXNzaW9uLT5zZXNzaW9uSUQoKTsKLQotICAgIGdvdG8gYmFpbDsKLQotYmFpbDI6Ci0gICAgY2xvc2Uocyk7Ci0gICAgcyA9IC0xOwotCi1iYWlsOgotICAgIHJldHVybiBlcnI7Ci19Ci0KLXN0YXR1c190IEFOZXR3b3JrU2Vzc2lvbjo6Y29ubmVjdFVEUFNlc3Npb24oCi0gICAgICAgIGludDMyX3Qgc2Vzc2lvbklELCBjb25zdCBjaGFyICpyZW1vdGVIb3N0LCB1bnNpZ25lZCByZW1vdGVQb3J0KSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uSUQpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0KLSAgICBjb25zdCBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25zLnZhbHVlQXQoaW5kZXgpOwotICAgIGludCBzID0gc2Vzc2lvbi0+c29ja2V0KCk7Ci0KLSAgICBzdHJ1Y3Qgc29ja2FkZHJfaW4gcmVtb3RlQWRkcjsKLSAgICBtZW1zZXQocmVtb3RlQWRkci5zaW5femVybywgMCwgc2l6ZW9mKHJlbW90ZUFkZHIuc2luX3plcm8pKTsKLSAgICByZW1vdGVBZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOwotICAgIHJlbW90ZUFkZHIuc2luX3BvcnQgPSBodG9ucyhyZW1vdGVQb3J0KTsKLQotICAgIHN0YXR1c190IGVyciA9IE9LOwotICAgIHN0cnVjdCBob3N0ZW50ICplbnQgPSBnZXRob3N0YnluYW1lKHJlbW90ZUhvc3QpOwotICAgIGlmIChlbnQgPT0gTlVMTCkgewotICAgICAgICBlcnIgPSAtaF9lcnJubzsKLSAgICB9IGVsc2UgewotICAgICAgICByZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkciA9ICooaW5fYWRkcl90ICopZW50LT5oX2FkZHI7Ci0KLSAgICAgICAgaW50IHJlcyA9IGNvbm5lY3QoCi0gICAgICAgICAgICAgICAgcywKLSAgICAgICAgICAgICAgICAoY29uc3Qgc3RydWN0IHNvY2thZGRyICopJnJlbW90ZUFkZHIsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKHJlbW90ZUFkZHIpKTsKLQotICAgICAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAgICAgZXJyID0gLWVycm5vOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGVycjsKLX0KLQotc3RhdHVzX3QgQU5ldHdvcmtTZXNzaW9uOjpzZW5kUmVxdWVzdCgKLSAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IHZvaWQgKmRhdGEsIHNzaXplX3Qgc2l6ZSwKLSAgICAgICAgYm9vbCB0aW1lVmFsaWQsIGludDY0X3QgdGltZVVzKSB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKLQotICAgIHNzaXplX3QgaW5kZXggPSBtU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uSUQpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICByZXR1cm4gLUVOT0VOVDsKLSAgICB9Ci0KLSAgICBjb25zdCBzcDxTZXNzaW9uPiBzZXNzaW9uID0gbVNlc3Npb25zLnZhbHVlQXQoaW5kZXgpOwotCi0gICAgc3RhdHVzX3QgZXJyID0gc2Vzc2lvbi0+c2VuZFJlcXVlc3QoZGF0YSwgc2l6ZSwgdGltZVZhbGlkLCB0aW1lVXMpOwotCi0gICAgaW50ZXJydXB0KCk7Ci0KLSAgICByZXR1cm4gZXJyOwotfQotCi1zdGF0dXNfdCBBTmV0d29ya1Nlc3Npb246OnN3aXRjaFRvV2ViU29ja2V0TW9kZShpbnQzMl90IHNlc3Npb25JRCkgewotICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbVNlc3Npb25zLmluZGV4T2ZLZXkoc2Vzc2lvbklEKTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgcmV0dXJuIC1FTk9FTlQ7Ci0gICAgfQotCi0gICAgY29uc3Qgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9IG1TZXNzaW9ucy52YWx1ZUF0KGluZGV4KTsKLSAgICByZXR1cm4gc2Vzc2lvbi0+c3dpdGNoVG9XZWJTb2NrZXRNb2RlKCk7Ci19Ci0KLXZvaWQgQU5ldHdvcmtTZXNzaW9uOjppbnRlcnJ1cHQoKSB7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgZHVtbXkgPSAwOwotCi0gICAgc3NpemVfdCBuOwotICAgIGRvIHsKLSAgICAgICAgbiA9IHdyaXRlKG1QaXBlRmRbMV0sICZkdW1teSwgMSk7Ci0gICAgfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgaWYgKG4gPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJFcnJvciB3cml0aW5nIHRvIHBpcGUgKCVzKSIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgfQotfQotCi12b2lkIEFOZXR3b3JrU2Vzc2lvbjo6dGhyZWFkTG9vcCgpIHsKLSAgICBmZF9zZXQgcnMsIHdzOwotICAgIEZEX1pFUk8oJnJzKTsKLSAgICBGRF9aRVJPKCZ3cyk7Ci0KLSAgICBGRF9TRVQobVBpcGVGZFswXSwgJnJzKTsKLSAgICBpbnQgbWF4RmQgPSBtUGlwZUZkWzBdOwotCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVNlc3Npb25zLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxTZXNzaW9uPiAmc2Vzc2lvbiA9IG1TZXNzaW9ucy52YWx1ZUF0KGkpOwotCi0gICAgICAgICAgICBpbnQgcyA9IHNlc3Npb24tPnNvY2tldCgpOwotCi0gICAgICAgICAgICBpZiAocyA8IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHNlc3Npb24tPndhbnRzVG9SZWFkKCkpIHsKLSAgICAgICAgICAgICAgICBGRF9TRVQocywgJnJzKTsKLSAgICAgICAgICAgICAgICBpZiAocyA+IG1heEZkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1heEZkID0gczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzZXNzaW9uLT53YW50c1RvV3JpdGUoKSkgewotICAgICAgICAgICAgICAgIEZEX1NFVChzLCAmd3MpOwotICAgICAgICAgICAgICAgIGlmIChzID4gbWF4RmQpIHsKLSAgICAgICAgICAgICAgICAgICAgbWF4RmQgPSBzOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIGludCByZXMgPSBzZWxlY3QobWF4RmQgKyAxLCAmcnMsICZ3cywgTlVMTCwgTlVMTCAvKiB0diAqLyk7Ci0KLSAgICBpZiAocmVzID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChyZXMgPCAwKSB7Ci0gICAgICAgIGlmIChlcnJubyA9PSBFSU5UUikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgQUxPR0UoInNlbGVjdCBmYWlsZWQgdy8gZXJyb3IgJWQgKCVzKSIsIGVycm5vLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKEZEX0lTU0VUKG1QaXBlRmRbMF0sICZycykpIHsKLSAgICAgICAgY2hhciBjOwotICAgICAgICBzc2l6ZV90IG47Ci0gICAgICAgIGRvIHsKLSAgICAgICAgICAgIG4gPSByZWFkKG1QaXBlRmRbMF0sICZjLCAxKTsKLSAgICAgICAgfSB3aGlsZSAobiA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgQUxPR1coIkVycm9yIHJlYWRpbmcgZnJvbSBwaXBlICglcykiLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICB9Ci0KLSAgICAgICAgLS1yZXM7Ci0gICAgfQotCi0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUxvY2spOwotCi0gICAgICAgIExpc3Q8c3A8U2Vzc2lvbj4gPiBzZXNzaW9uc1RvQWRkOwotCi0gICAgICAgIGZvciAoc2l6ZV90IGkgPSBtU2Vzc2lvbnMuc2l6ZSgpOyByZXMgPiAwICYmIGkgPiAwOykgewotICAgICAgICAgICAgaS0tOwotICAgICAgICAgICAgY29uc3Qgc3A8U2Vzc2lvbj4gJnNlc3Npb24gPSBtU2Vzc2lvbnMudmFsdWVBdChpKTsKLQotICAgICAgICAgICAgaW50IHMgPSBzZXNzaW9uLT5zb2NrZXQoKTsKLQotICAgICAgICAgICAgaWYgKHMgPCAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChGRF9JU1NFVChzLCAmcnMpIHx8IEZEX0lTU0VUKHMsICZ3cykpIHsKLSAgICAgICAgICAgICAgICAtLXJlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKEZEX0lTU0VUKHMsICZycykpIHsKLSAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbi0+aXNSVFNQU2VydmVyKCkgfHwgc2Vzc2lvbi0+aXNUQ1BEYXRhZ3JhbVNlcnZlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb2NrYWRkcl9pbiByZW1vdGVBZGRyOwotICAgICAgICAgICAgICAgICAgICBzb2NrbGVuX3QgcmVtb3RlQWRkckxlbiA9IHNpemVvZihyZW1vdGVBZGRyKTsKLQotICAgICAgICAgICAgICAgICAgICBpbnQgY2xpZW50U29ja2V0ID0gYWNjZXB0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsIChzdHJ1Y3Qgc29ja2FkZHIgKikmcmVtb3RlQWRkciwgJnJlbW90ZUFkZHJMZW4pOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnRTb2NrZXQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gTWFrZVNvY2tldE5vbkJsb2NraW5nKGNsaWVudFNvY2tldCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiVW5hYmxlIHRvIG1ha2UgY2xpZW50IHNvY2tldCBub24gYmxvY2tpbmcsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFpbGVkIHcvIGVycm9yICVkICglcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgc3RyZXJyb3IoLWVycikpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoY2xpZW50U29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRTb2NrZXQgPSAtMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5fYWRkcl90IGFkZHIgPSBudG9obChyZW1vdGVBZGRyLnNpbl9hZGRyLnNfYWRkcik7Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HSSgiaW5jb21pbmcgY29ubmVjdGlvbiBmcm9tICVkLiVkLiVkLiVkOiVkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHNvY2tldCAlZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGRyID4+IDI0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWRkciA+PiAxNikgJiAweGZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhZGRyID4+IDgpICYgMHhmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyICYgMHhmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudG9ocyhyZW1vdGVBZGRyLnNpbl9wb3J0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRTb2NrZXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8U2Vzc2lvbj4gY2xpZW50U2Vzc2lvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTZXNzaW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0U2Vzc2lvbklEKyssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vzc2lvbjo6Q09OTkVDVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFNvY2tldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLT5nZXROb3RpZmljYXRpb25NZXNzYWdlKCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50U2Vzc2lvbi0+c2V0TW9kZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmlzUlRTUFNlcnZlcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBTZXNzaW9uOjpNT0RFX1JUU1AKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNlc3Npb246Ok1PREVfREFUQUdSQU0pOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbnNUb0FkZC5wdXNoX2JhY2soY2xpZW50U2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiYWNjZXB0IHJldHVybmVkIGVycm9yICVkICglcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJybm8sIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBzZXNzaW9uLT5yZWFkTW9yZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgicmVhZE1vcmUgb24gc29ja2V0ICVkIGZhaWxlZCB3LyBlcnJvciAlZCAoJXMpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHMsIGVyciwgc3RyZXJyb3IoLWVycikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoRkRfSVNTRVQocywgJndzKSkgewotICAgICAgICAgICAgICAgIHN0YXR1c190IGVyciA9IHNlc3Npb24tPndyaXRlTW9yZSgpOwotICAgICAgICAgICAgICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIndyaXRlTW9yZSBvbiBzb2NrZXQgJWQgZmFpbGVkIHcvIGVycm9yICVkICglcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzLCBlcnIsIHN0cmVycm9yKC1lcnIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB3aGlsZSAoIXNlc3Npb25zVG9BZGQuZW1wdHkoKSkgewotICAgICAgICAgICAgc3A8U2Vzc2lvbj4gc2Vzc2lvbiA9ICpzZXNzaW9uc1RvQWRkLmJlZ2luKCk7Ci0gICAgICAgICAgICBzZXNzaW9uc1RvQWRkLmVyYXNlKHNlc3Npb25zVG9BZGQuYmVnaW4oKSk7Ci0KLSAgICAgICAgICAgIG1TZXNzaW9ucy5hZGQoc2Vzc2lvbi0+c2Vzc2lvbklEKCksIHNlc3Npb24pOwotCi0gICAgICAgICAgICBBTE9HSSgiYWRkZWQgY2xpZW50U2Vzc2lvbiAlZCIsIHNlc3Npb24tPnNlc3Npb25JRCgpKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuY3BwCmluZGV4IGZiNTFjYzUuLmE4YWRmZjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmNwcApAQCAtMzY1LDggKzM2NSw2IEBACiAvLyBzdGF0aWMKIEFTdHJpbmcgQVN0cmluZzo6RnJvbVBhcmNlbChjb25zdCBQYXJjZWwgJnBhcmNlbCkgewogICAgIHNpemVfdCBzaXplID0gc3RhdGljX2Nhc3Q8c2l6ZV90PihwYXJjZWwucmVhZEludDMyKCkpOwotICAgIC8vIFRoZSBzdGF0aWMgYW5hbHl6ZXIgaW5jb3JyZWN0bHkgcmVwb3J0cyBhIGZhbHNlLXBvc2l0aXZlIGhlcmUgaW4gYysrMTcuCi0gICAgLy8gaHR0cHM6Ly9idWdzLmxsdm0ub3JnL3Nob3dfYnVnLmNnaT9pZD0zODE3NiAuIE5PTElOVE5FWFRMSU5FCiAgICAgcmV0dXJuIEFTdHJpbmcoc3RhdGljX2Nhc3Q8Y29uc3QgY2hhciAqPihwYXJjZWwucmVhZElucGxhY2Uoc2l6ZSkpLCBzaXplKTsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BbmRyb2lkLmJwCmluZGV4IDI5Y2YxZWQuLmVmZmJiNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FuZHJvaWQuYnAKQEAgLTQsOCArNCw4IEBACiAgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKIH0KIAotY2NfbGlicmFyeSB7Ci0gICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2RlZmF1bHRzIiwKICAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAogICAgIHZuZGs6IHsKICAgICAgICAgZW5hYmxlZDogdHJ1ZSwKQEAgLTI1LDYgKzI1LDcgQEAKICAgICBoZWFkZXJfbGliczogWwogICAgICAgICAibGliaGFyZHdhcmVfaGVhZGVycyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAogICAgIF0sCiAKQEAgLTMzLDEwICszNCw2IEBACiAgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCiAgICAgXSwKIAotICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKLSAgICAgICAgImxpYmJpbmRlciIsCi0gICAgXSwKLQogICAgIGNmbGFnczogWwogICAgICAgICAiLVduby1tdWx0aWNoYXIiLAogICAgICAgICAiLVdlcnJvciIsCkBAIC01NiwxOCArNTMsMjMgQEAKICAgICAgICAgIkFCdWZmZXIuY3BwIiwKICAgICAgICAgIkFEZWJ1Zy5jcHAiLAogICAgICAgICAiQUhhbmRsZXIuY3BwIiwKLSAgICAgICAgIkFIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuY3BwIiwKICAgICAgICAgIkFMb29wZXIuY3BwIiwKICAgICAgICAgIkFMb29wZXJSb3N0ZXIuY3BwIiwKICAgICAgICAgIkFNZXNzYWdlLmNwcCIsCi0gICAgICAgICJBTmV0d29ya1Nlc3Npb24uY3BwIiwKICAgICAgICAgIkFTdHJpbmcuY3BwIiwKICAgICAgICAgIkFTdHJpbmdVdGlscy5jcHAiLAorICAgICAgICAiQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcCIsCiAgICAgICAgICJCeXRlVXRpbHMuY3BwIiwKICAgICAgICAgIkNvbG9yVXRpbHMuY3BwIiwKKyAgICAgICAgIkZvdW5kYXRpb25VdGlscy5jcHAiLAorICAgICAgICAiTWVkaWFCdWZmZXIuY3BwIiwKKyAgICAgICAgIk1lZGlhQnVmZmVyQmFzZS5jcHAiLAorICAgICAgICAiTWVkaWFCdWZmZXJHcm91cC5jcHAiLAogICAgICAgICAiTWVkaWFEZWZzLmNwcCIsCiAgICAgICAgICJNZWRpYUtleXMuY3BwIiwKLSAgICAgICAgIlBhcnNlZE1lc3NhZ2UuY3BwIiwKKyAgICAgICAgIk1ldGFEYXRhLmNwcCIsCisgICAgICAgICJNZXRhRGF0YUJhc2UuY3BwIiwKKyAgICAgICAgIk9wdXNIZWFkZXIuY3BwIiwKICAgICAgICAgImF2Y191dGlscy5jcHAiLAogICAgICAgICAiYmFzZTY0LmNwcCIsCiAgICAgICAgICJoZXhkdW1wLmNwcCIsCkBAIC04MywzICs4NSwyMCBAQAogICAgICAgICBjZmk6IHRydWUsCiAgICAgfSwKIH0KKworY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgIGRlZmF1bHRzOiBbImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb25fZGVmYXVsdHMiXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uX3dpdGhvdXRfaW1lbW9yeSIsCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbl9kZWZhdWx0cyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1ETk9fSU1FTU9SWSIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjhlOTY5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BdWRpb1ByZXNlbnRhdGlvbkluZm8uY3BwCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9QcmVzZW50YXRpb25JbmZvIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiQXVkaW9QcmVzZW50YXRpb25JbmZvLmgiCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIHNlcmlhbGl6ZUF1ZGlvUHJlc2VudGF0aW9ucyhjb25zdCBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24mIHByZXNlbnRhdGlvbnMsCisgICAgICAgIHN0ZDo6b3N0cmVhbSogc2VyaWFsaXplZE91dHB1dCkgeworICAgIHVpbnQzMl90IG51bVByZXNlbnRhdGlvbnMgPSBwcmVzZW50YXRpb25zLnNpemUoKTsKKyAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZShyZWludGVycHJldF9jYXN0PGNoYXIqPigmbnVtUHJlc2VudGF0aW9ucyksIHNpemVvZihudW1QcmVzZW50YXRpb25zKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBhcCA6IHByZXNlbnRhdGlvbnMpIHsKKyAgICAgICAgaWYgKGFwLm1WZXJzaW9uID09IFBSRVNFTlRBVElPTl9WRVJTSU9OXzEpIHsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmYXAubVZlcnNpb24pKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1WZXJzaW9uKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmFwLm1QcmVzZW50YXRpb25JZCkpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubVByZXNlbnRhdGlvbklkKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmFwLm1Qcm9ncmFtSWQpKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1Qcm9ncmFtSWQpKTsKKworICAgICAgICAgICAgdWludDMyX3QgbnVtTGFiZWxzID0gYXAubUxhYmVscy5zaXplKCk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJm51bUxhYmVscykpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YobnVtTGFiZWxzKSk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGxhYmVsIDogYXAubUxhYmVscykgeworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhYmVsS2V5U2l6ZSA9IGxhYmVsLmZpcnN0LnNpemUoKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZsYWJlbEtleVNpemUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsYWJlbEtleVNpemUpKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZShsYWJlbC5maXJzdC5jX3N0cigpLCBsYWJlbEtleVNpemUpOworCisgICAgICAgICAgICAgICAgdWludDMyX3QgbGFiZWxWYWxTaXplID0gbGFiZWwuc2Vjb25kLnNpemUoKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZsYWJlbFZhbFNpemUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihsYWJlbFZhbFNpemUpKTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZShsYWJlbC5zZWNvbmQuY19zdHIoKSwgbGFiZWxWYWxTaXplKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdWludDMyX3QgbGFuZ1NpemUgPSBhcC5tTGFuZ3VhZ2Uuc2l6ZSgpOworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZsYW5nU2l6ZSkpLAorICAgICAgICAgICAgICAgICAgICBzaXplb2YobGFuZ1NpemUpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKGFwLm1MYW5ndWFnZS5jX3N0cigpLCBsYW5nU2l6ZSk7CisKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRPdXRwdXQtPndyaXRlKAorICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmYXAubU1hc3RlcmluZ0luZGljYXRpb24pKSwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmFwLm1BdWRpb0Rlc2NyaXB0aW9uQXZhaWxhYmxlKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSkpOworICAgICAgICAgICAgc2VyaWFsaXplZE91dHB1dC0+d3JpdGUoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Y2hhcio+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZhcC5tU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tU3Bva2VuU3VidGl0bGVzQXZhaWxhYmxlKSk7CisgICAgICAgICAgICBzZXJpYWxpemVkT3V0cHV0LT53cml0ZSgKKyAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJmFwLm1EaWFsb2d1ZUVuaGFuY2VtZW50QXZhaWxhYmxlKSksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSkpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBkZXNlcmlhbGl6ZUF1ZGlvUHJlc2VudGF0aW9ucyhzdGQ6OmlzdHJlYW0qIHNlcmlhbGl6ZWRJbnB1dCwKKyAgICAgICAgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uICpwcmVzZW50YXRpb25zKSB7CisgICAgdWludDMyX3QgbnVtUHJlc2VudGF0aW9uczsKKyAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJm51bVByZXNlbnRhdGlvbnMpLCBzaXplb2YobnVtUHJlc2VudGF0aW9ucykpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1QcmVzZW50YXRpb25zOyArK2kpIHsKKyAgICAgICAgdWludDMyX3QgdmVyc2lvbjsKKyAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZ2ZXJzaW9uKSwgc2l6ZW9mKHZlcnNpb24pKTsKKyAgICAgICAgaWYgKHZlcnNpb24gPT0gUFJFU0VOVEFUSU9OX1ZFUlNJT05fMSkgeworICAgICAgICAgICAgQXVkaW9QcmVzZW50YXRpb25WMSBhcDsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZCgKKyAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmFwLm1QcmVzZW50YXRpb25JZCksCisgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tUHJlc2VudGF0aW9uSWQpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmYXAubVByb2dyYW1JZCksIHNpemVvZihhcC5tUHJvZ3JhbUlkKSk7CisKKyAgICAgICAgICAgIHVpbnQzMl90IG51bUxhYmVsczsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmbnVtTGFiZWxzKSwgc2l6ZW9mKG51bUxhYmVscykpOworICAgICAgICAgICAgZm9yICh1aW50MzJfdCBqID0gMDsgaiA8IG51bUxhYmVsczsgKytqKSB7CisgICAgICAgICAgICAgICAgdWludDMyX3QgbGFiZWxLZXlTaXplOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmbGFiZWxLZXlTaXplKSwgc2l6ZW9mKGxhYmVsS2V5U2l6ZSkpOworICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGxhYmVsS2V5KGxhYmVsS2V5U2l6ZSk7CisgICAgICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKGxhYmVsS2V5LmRhdGEoKSwgbGFiZWxLZXlTaXplKTsKKworICAgICAgICAgICAgICAgIHVpbnQzMl90IGxhYmVsVmFsU2l6ZTsKKyAgICAgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmxhYmVsVmFsU2l6ZSksIHNpemVvZihsYWJlbFZhbFNpemUpKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBsYWJlbFZhbChsYWJlbFZhbFNpemUpOworICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChsYWJlbFZhbC5kYXRhKCksIGxhYmVsVmFsU2l6ZSk7CisgICAgICAgICAgICAgICAgYXAubUxhYmVscy5lbXBsYWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4obGFiZWxLZXkuZGF0YSgpKSwgbGFiZWxLZXlTaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGxhYmVsVmFsLmRhdGEoKSksIGxhYmVsVmFsU2l6ZSkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgbGFuZ3VhZ2VTaXplOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZsYW5ndWFnZVNpemUpLCBzaXplb2YobGFuZ3VhZ2VTaXplKSk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxjaGFyPiBsYW5ndWFnZShsYW5ndWFnZVNpemUpOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKGxhbmd1YWdlLmRhdGEoKSwgbGFuZ3VhZ2VTaXplKTsKKyAgICAgICAgICAgIGFwLm1MYW5ndWFnZSA9IHN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGxhbmd1YWdlLmRhdGEoKSksIGxhbmd1YWdlU2l6ZSk7CisgICAgICAgICAgICBzZXJpYWxpemVkSW5wdXQtPnJlYWQocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oJmFwLm1NYXN0ZXJpbmdJbmRpY2F0aW9uKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihhcC5tTWFzdGVyaW5nSW5kaWNhdGlvbikpOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZhcC5tQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubUF1ZGlvRGVzY3JpcHRpb25BdmFpbGFibGUpKTsKKyAgICAgICAgICAgIHNlcmlhbGl6ZWRJbnB1dC0+cmVhZChyZWludGVycHJldF9jYXN0PGNoYXIqPigmYXAubVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSkpOworICAgICAgICAgICAgc2VyaWFsaXplZElucHV0LT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KCZhcC5tRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoYXAubURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGUpKTsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvbnMtPnB1c2hfYmFjayhzdGQ6Om1vdmUoYXApKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCJBdWRpbyBwcmVzZW50YXRpb24gaW5mbyB2ZXJzaW9uIGlzIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmNwcAppbmRleCBjNGVhYTI3Li4wNzBlMzI1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb2t1cC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTM0Miw2ICszNDMsMTQgQEAKICAgICBhc3BlY3RzLm1SYW5nZSA9IGZ1bGxSYW5nZSA/IENvbG9yQXNwZWN0czo6UmFuZ2VGdWxsIDogQ29sb3JBc3BlY3RzOjpSYW5nZUxpbWl0ZWQ7CiB9CiAKK3ZvaWQgQ29sb3JVdGlsczo6Y29udmVydElzb0NvbG9yQXNwZWN0c1RvUGxhdGZvcm1Bc3BlY3RzKAorICAgICAgICBpbnQzMl90IHByaW1hcmllcywgaW50MzJfdCBpbnRyYW5zZmVyLCBpbnQzMl90IGNvZWZmcywgYm9vbCBmdWxsUmFuZ2UsCisgICAgICAgIGludDMyX3QgKnJhbmdlLCBpbnQzMl90ICpzdGFuZGFyZCwgaW50MzJfdCAqb3V0dHJhbnNmZXIpIHsKKyAgICBDb2xvckFzcGVjdHMgYXNwZWN0czsKKyAgICBjb252ZXJ0SXNvQ29sb3JBc3BlY3RzVG9Db2RlY0FzcGVjdHMocHJpbWFyaWVzLCBpbnRyYW5zZmVyLCBjb2VmZnMsIGZ1bGxSYW5nZSwgYXNwZWN0cyk7CisgICAgY29udmVydENvZGVjQ29sb3JBc3BlY3RzVG9QbGF0Zm9ybUFzcGVjdHMoYXNwZWN0cywgcmFuZ2UsIHN0YW5kYXJkLCBvdXR0cmFuc2Zlcik7Cit9CisKIC8vIHN0YXRpYwogQ29sb3JBc3BlY3RzIENvbG9yVXRpbHM6OnVucGFja1RvQ29sb3JBc3BlY3RzKHVpbnQzMl90IHBhY2tlZCkgewogICAgIENvbG9yQXNwZWN0cyBhc3BlY3RzOwpAQCAtNjg0LDYgKzY5MywxMyBAQAogICAgICAgICAgICAgdHJhbnNmZXIsIGFzU3RyaW5nKChDb2xvclRyYW5zZmVyKXRyYW5zZmVyKSk7CiB9CiAKKworLy8gc3RhdGljCit2b2lkIENvbG9yVXRpbHM6OnNldEhEUlN0YXRpY0luZm9JbnRvQU1lZGlhRm9ybWF0KAorICAgICAgICBjb25zdCBIRFJTdGF0aWNJbmZvICZpbmZvLCBBTWVkaWFGb3JtYXQgKmZvcm1hdCkgeworICAgIHNldEhEUlN0YXRpY0luZm9JbnRvRm9ybWF0KGluZm8sIGZvcm1hdC0+bUZvcm1hdCk7Cit9CisKIC8vIHN0YXRpYwogdm9pZCBDb2xvclV0aWxzOjpzZXRIRFJTdGF0aWNJbmZvSW50b0Zvcm1hdCgKICAgICAgICAgY29uc3QgSERSU3RhdGljSW5mbyAmaW5mbywgc3A8QU1lc3NhZ2U+ICZmb3JtYXQpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vRm91bmRhdGlvblV0aWxzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vRm91bmRhdGlvblV0aWxzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjg1ZTRjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Gb3VuZGF0aW9uVXRpbHMuY3BwCkBAIC0wLDAgKzEsMTEyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJGb3VuZGF0aW9uVXRpbHMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0FTdHJpbmcgdXJpRGVidWdTdHJpbmcoY29uc3QgQVN0cmluZyAmdXJpLCBib29sIGluY29nbml0bykgeworICAgIGlmIChpbmNvZ25pdG8pIHsKKyAgICAgICAgcmV0dXJuIEFTdHJpbmcoIjxVUkkgc3VwcHJlc3NlZD4iKTsKKyAgICB9CisKKyAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woIm1lZGlhLnN0YWdlZnJpZ2h0LmxvZy11cmkiLCBmYWxzZSkpIHsKKyAgICAgICAgcmV0dXJuIHVyaTsKKyAgICB9CisKKyAgICAvLyBmaW5kIHNjaGVtZQorICAgIEFTdHJpbmcgc2NoZW1lOworICAgIGNvbnN0IGNoYXIgKmNoYXJzID0gdXJpLmNfc3RyKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB1cmkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgY2hhciBjID0gY2hhcnNbaV07CisgICAgICAgIGlmICghaXNhc2NpaShjKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoaXNhbHBoYShjKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoaSA9PSAwKSB7CisgICAgICAgICAgICAvLyBmaXJzdCBjaGFyYWN0ZXIgbXVzdCBiZSBhIGxldHRlcgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSBpZiAoaXNkaWdpdChjKSB8fCBjID09ICcrJyB8fCBjID09ICcuJyB8fCBjID09Jy0nKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfSBlbHNlIGlmIChjICE9ICc6JykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgc2NoZW1lID0gQVN0cmluZyh1cmksIDAsIGkpOworICAgICAgICBzY2hlbWUuYXBwZW5kKCI6Ly88c3VwcHJlc3NlZD4iKTsKKyAgICAgICAgcmV0dXJuIHNjaGVtZTsKKyAgICB9CisgICAgcmV0dXJuIEFTdHJpbmcoIjxuby1zY2hlbWUgVVJJIHN1cHByZXNzZWQ+Iik7Cit9CisKK0FTdHJpbmcgTWFrZVVzZXJBZ2VudCgpIHsKKyAgICBBU3RyaW5nIHVhOworICAgIHVhLmFwcGVuZCgic3RhZ2VmcmlnaHQvMS4yIChMaW51eDtBbmRyb2lkICIpOworCisjaWYgKFBST1BFUlRZX1ZBTFVFX01BWCA8IDgpCisjZXJyb3IgIlBST1BFUlRZX1ZBTFVFX01BWCBtdXN0IGJlIGF0IGxlYXN0IDgiCisjZW5kaWYKKworICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKKyAgICBwcm9wZXJ0eV9nZXQoInJvLmJ1aWxkLnZlcnNpb24ucmVsZWFzZSIsIHZhbHVlLCAiVW5rbm93biIpOworICAgIHVhLmFwcGVuZCh2YWx1ZSk7CisgICAgdWEuYXBwZW5kKCIpIik7CisKKyAgICByZXR1cm4gdWE7Cit9CisKK0FTdHJpbmcgbmFtZUZvckZkKGludCBmZCkgeworICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OworICAgIGNoYXIgYnVmZmVyW1NJWkVdOworICAgIEFTdHJpbmcgcmVzdWx0OworICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi9wcm9jLyVkL2ZkLyVkIiwgZ2V0cGlkKCksIGZkKTsKKyAgICBzdHJ1Y3Qgc3RhdCBzOworICAgIGlmIChsc3RhdChidWZmZXIsICZzKSA9PSAwKSB7CisgICAgICAgIGlmICgocy5zdF9tb2RlICYgU19JRk1UKSA9PSBTX0lGTE5LKSB7CisgICAgICAgICAgICBjaGFyIGxpbmt0b1syNTZdOworICAgICAgICAgICAgaW50IGxlbiA9IHJlYWRsaW5rKGJ1ZmZlciwgbGlua3RvLCBzaXplb2YobGlua3RvKSk7CisgICAgICAgICAgICBpZihsZW4gPiAwKSB7CisgICAgICAgICAgICAgICAgaWYobGVuID4gMjU1KSB7CisgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTJdID0gJy4nOworICAgICAgICAgICAgICAgICAgICBsaW5rdG9bMjUzXSA9ICcuJzsKKyAgICAgICAgICAgICAgICAgICAgbGlua3RvWzI1NF0gPSAnLic7CisgICAgICAgICAgICAgICAgICAgIGxpbmt0b1syNTVdID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBsaW5rdG9bbGVuXSA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQobGlua3RvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoInVuZXhwZWN0ZWQgdHlwZSBmb3IgIik7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kKCJjb3VsZG4ndCBvcGVuICIpOworICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliZWFjMDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyLmNwcApAQCAtMCwwICsxLDE3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiTWVkaWFCdWZmZXIiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIHN0YXRpYyAqLworc3RkOjphdG9taWNfaW50X2xlYXN0MzJfdCBNZWRpYUJ1ZmZlcjo6bVVzZVNoYXJlZE1lbW9yeSgwKTsKKworTWVkaWFCdWZmZXI6Ok1lZGlhQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKQorICAgIDogbU9ic2VydmVyKE5VTEwpLAorICAgICAgbVJlZkNvdW50KDApLAorICAgICAgbURhdGEoZGF0YSksCisgICAgICBtU2l6ZShzaXplKSwKKyAgICAgIG1SYW5nZU9mZnNldCgwKSwKKyAgICAgIG1SYW5nZUxlbmd0aChzaXplKSwKKyAgICAgIG1Pd25zRGF0YShmYWxzZSksCisgICAgICBtTWV0YURhdGEobmV3IE1ldGFEYXRhQmFzZSkgeworfQorCitNZWRpYUJ1ZmZlcjo6TWVkaWFCdWZmZXIoc2l6ZV90IHNpemUpCisgICAgOiBtT2JzZXJ2ZXIoTlVMTCksCisgICAgICBtUmVmQ291bnQoMCksCisgICAgICBtRGF0YShOVUxMKSwKKyAgICAgIG1TaXplKHNpemUpLAorICAgICAgbVJhbmdlT2Zmc2V0KDApLAorICAgICAgbVJhbmdlTGVuZ3RoKHNpemUpLAorICAgICAgbU93bnNEYXRhKHRydWUpLAorICAgICAgbU1ldGFEYXRhKG5ldyBNZXRhRGF0YUJhc2UpIHsKKyNpZm5kZWYgTk9fSU1FTU9SWQorICAgIGlmIChzaXplIDwga1NoYXJlZE1lbVRocmVzaG9sZAorICAgICAgICAgICAgfHwgc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgmbVVzZVNoYXJlZE1lbW9yeSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCkgPT0gMCkgeworI2VuZGlmCisgICAgICAgIG1EYXRhID0gbWFsbG9jKHNpemUpOworI2lmbmRlZiBOT19JTUVNT1JZCisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoImNyZWF0aW5nIG1lbW9yeURlYWxlciIpOworICAgICAgICBzaXplX3QgbmV3U2l6ZSA9IDA7CisgICAgICAgIGlmICghX19idWlsdGluX2FkZF9vdmVyZmxvdyhzaXplLCBzaXplb2YoU2hhcmVkQ29udHJvbCksICZuZXdTaXplKSkgeworICAgICAgICAgICAgc3A8TWVtb3J5RGVhbGVyPiBtZW1vcnlEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKG5ld1NpemUsICJNZWRpYUJ1ZmZlciIpOworICAgICAgICAgICAgbU1lbW9yeSA9IG1lbW9yeURlYWxlci0+YWxsb2NhdGUobmV3U2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1NZW1vcnkgPT0gTlVMTCkgeworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBhbGxvY2F0ZSBzaGFyZWQgbWVtb3J5LCB0cnlpbmcgcmVndWxhciBhbGxvY2F0aW9uISIpOworICAgICAgICAgICAgbURhdGEgPSBtYWxsb2Moc2l6ZSk7CisgICAgICAgICAgICBpZiAobURhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJPdXQgb2YgbWVtb3J5Iik7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBnZXRTaGFyZWRDb250cm9sKCktPmNsZWFyKCk7CisgICAgICAgICAgICBtRGF0YSA9ICh1aW50OF90ICopbU1lbW9yeS0+cG9pbnRlcigpICsgc2l6ZW9mKFNoYXJlZENvbnRyb2wpOworICAgICAgICAgICAgQUxPR1YoIkFsbG9jYXRlZCBzaGFyZWQgbWVtIGJ1ZmZlciBvZiBzaXplICV6dSBAICVwIiwgc2l6ZSwgbURhdGEpOworICAgICAgICB9CisgICAgfQorI2VuZGlmCit9CisKK01lZGlhQnVmZmVyOjpNZWRpYUJ1ZmZlcihjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKQorICAgIDogbU9ic2VydmVyKE5VTEwpLAorICAgICAgbVJlZkNvdW50KDApLAorICAgICAgbURhdGEoYnVmZmVyLT5kYXRhKCkpLAorICAgICAgbVNpemUoYnVmZmVyLT5zaXplKCkpLAorICAgICAgbVJhbmdlT2Zmc2V0KDApLAorICAgICAgbVJhbmdlTGVuZ3RoKG1TaXplKSwKKyAgICAgIG1CdWZmZXIoYnVmZmVyKSwKKyAgICAgIG1Pd25zRGF0YShmYWxzZSksCisgICAgICBtTWV0YURhdGEobmV3IE1ldGFEYXRhQmFzZSkgeworfQorCit2b2lkIE1lZGlhQnVmZmVyOjpyZWxlYXNlKCkgeworICAgIGlmIChtT2JzZXJ2ZXIgPT0gTlVMTCkgeworICAgICAgICAvLyBMZWdhY3kgY29udHJhY3QgZm9yIE1lZGlhQnVmZmVyIHdpdGhvdXQgYSBNZWRpYUJ1ZmZlckdyb3VwLgorICAgICAgICBDSEVDS19FUShtUmVmQ291bnQsIDApOworICAgICAgICBkZWxldGUgdGhpczsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGludCBwcmV2Q291bnQgPSBtUmVmQ291bnQuZmV0Y2hfc3ViKDEpOworICAgIGlmIChwcmV2Q291bnQgPT0gMSkgeworICAgICAgICBpZiAobU9ic2VydmVyID09IE5VTEwpIHsKKyAgICAgICAgICAgIGRlbGV0ZSB0aGlzOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbU9ic2VydmVyLT5zaWduYWxCdWZmZXJSZXR1cm5lZCh0aGlzKTsKKyAgICB9CisgICAgQ0hFQ0socHJldkNvdW50ID4gMCk7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXI6OmNsYWltKCkgeworICAgIENIRUNLKG1PYnNlcnZlciAhPSBOVUxMKTsKKyAgICBDSEVDS19FUShtUmVmQ291bnQubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKSwgMSk7CisKKyAgICBtUmVmQ291bnQuc3RvcmUoMCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXI6OmFkZF9yZWYoKSB7CisgICAgKHZvaWQpIG1SZWZDb3VudC5mZXRjaF9hZGQoMSk7Cit9CisKK3ZvaWQgKk1lZGlhQnVmZmVyOjpkYXRhKCkgY29uc3QgeworICAgIHJldHVybiBtRGF0YTsKK30KKworc2l6ZV90IE1lZGlhQnVmZmVyOjpzaXplKCkgY29uc3QgeworICAgIHJldHVybiBtU2l6ZTsKK30KKworc2l6ZV90IE1lZGlhQnVmZmVyOjpyYW5nZV9vZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1SYW5nZU9mZnNldDsKK30KKworc2l6ZV90IE1lZGlhQnVmZmVyOjpyYW5nZV9sZW5ndGgoKSBjb25zdCB7CisgICAgcmV0dXJuIG1SYW5nZUxlbmd0aDsKK30KKwordm9pZCBNZWRpYUJ1ZmZlcjo6c2V0X3JhbmdlKHNpemVfdCBvZmZzZXQsIHNpemVfdCBsZW5ndGgpIHsKKyAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID4gbVNpemUpIHsKKyAgICAgICAgQUxPR0UoIm9mZnNldCA9ICV6dSwgbGVuZ3RoID0gJXp1LCBtU2l6ZSA9ICV6dSIsIG9mZnNldCwgbGVuZ3RoLCBtU2l6ZSk7CisgICAgfQorICAgIENIRUNLKG9mZnNldCArIGxlbmd0aCA8PSBtU2l6ZSk7CisKKyAgICBtUmFuZ2VPZmZzZXQgPSBvZmZzZXQ7CisgICAgbVJhbmdlTGVuZ3RoID0gbGVuZ3RoOworfQorCitNZXRhRGF0YUJhc2UmIE1lZGlhQnVmZmVyOjptZXRhX2RhdGEoKSB7CisgICAgcmV0dXJuICptTWV0YURhdGE7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXI6OnJlc2V0KCkgeworICAgIG1NZXRhRGF0YS0+Y2xlYXIoKTsKKyAgICBzZXRfcmFuZ2UoMCwgbVNpemUpOworfQorCitNZWRpYUJ1ZmZlcjo6fk1lZGlhQnVmZmVyKCkgeworICAgIENIRUNLKG1PYnNlcnZlciA9PSBOVUxMKTsKKworICAgIGlmIChtT3duc0RhdGEgJiYgbURhdGEgIT0gTlVMTCAmJiBtTWVtb3J5ID09IE5VTEwpIHsKKyAgICAgICAgZnJlZShtRGF0YSk7CisgICAgICAgIG1EYXRhID0gTlVMTDsKKyAgICB9CisKKyAgIGlmIChtTWVtb3J5LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICBnZXRTaGFyZWRDb250cm9sKCktPnNldERlYWRPYmplY3QoKTsKKyAgIH0KKyAgIGRlbGV0ZSBtTWV0YURhdGE7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXI6OnNldE9ic2VydmVyKE1lZGlhQnVmZmVyT2JzZXJ2ZXIgKm9ic2VydmVyKSB7CisgICAgQ0hFQ0sob2JzZXJ2ZXIgPT0gTlVMTCB8fCBtT2JzZXJ2ZXIgPT0gTlVMTCk7CisgICAgbU9ic2VydmVyID0gb2JzZXJ2ZXI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlckJhc2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUJ1ZmZlckJhc2UuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9NZWRpYUJ1ZmZlckJhc2UuY3BwCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyQmFzZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFCdWZmZXJHcm91cC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyR3JvdXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg0ZmY5YTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhQnVmZmVyR3JvdXAuY3BwCkBAIC0wLDAgKzEsMjM5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJNZWRpYUJ1ZmZlckdyb3VwIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlEZWFsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oPgorI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGQ6Om1pbiBpcyBub3QgY29uc3RleHByIGluIEMrKzExCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY29uc3RleHByIFQgTUlOKGNvbnN0IFQgJmEsIGNvbnN0IFQgJmIpIHsgcmV0dXJuIGEgPD0gYiA/IGEgOiBiOyB9CisKKy8vIE1lZGlhQnVmZmVyR3JvdXAgbWF5IGNyZWF0ZSBzaGFyZWQgbWVtb3J5IGJ1ZmZlcnMgYXQgYQorLy8gc21hbGxlciB0aHJlc2hvbGQgdGhhbiBhbiBpc29sYXRlZCBuZXcgTWVkaWFCdWZmZXIuCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtTaGFyZWRNZW1vcnlUaHJlc2hvbGQgPSBNSU4oCisgICAgICAgIChzaXplX3QpTWVkaWFCdWZmZXI6OmtTaGFyZWRNZW1UaHJlc2hvbGQsIChzaXplX3QpKDQgKiAxMDI0KSk7CisKK3N0cnVjdCBNZWRpYUJ1ZmZlckdyb3VwOjpJbnRlcm5hbERhdGEgeworICAgIE11dGV4IG1Mb2NrOworICAgIENvbmRpdGlvbiBtQ29uZGl0aW9uOworICAgIHNpemVfdCBtR3Jvd3RoTGltaXQ7ICAvLyBEbyBub3QgYXV0b21hdGljYWxseSBncm93IGdyb3VwIGxhcmdlciB0aGFuIHRoaXMuCisgICAgc3RkOjpsaXN0PE1lZGlhQnVmZmVyQmFzZSAqPiBtQnVmZmVyczsKK307CisKK01lZGlhQnVmZmVyR3JvdXA6Ok1lZGlhQnVmZmVyR3JvdXAoc2l6ZV90IGdyb3d0aExpbWl0KQorICAgIDogbVdyYXBwZXIobnVsbHB0ciksIG1JbnRlcm5hbChuZXcgSW50ZXJuYWxEYXRhKCkpIHsKKyAgICBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA9IGdyb3d0aExpbWl0OworfQorCitNZWRpYUJ1ZmZlckdyb3VwOjpNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCkKKyAgICA6IG1XcmFwcGVyKG51bGxwdHIpLCBtSW50ZXJuYWwobmV3IEludGVybmFsRGF0YSgpKSB7CisgICAgaW5pdChidWZmZXJzLCBidWZmZXJfc2l6ZSwgZ3Jvd3RoTGltaXQpOworfQorCit2b2lkIE1lZGlhQnVmZmVyR3JvdXA6OmluaXQoc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0KSB7CisgICAgbUludGVybmFsLT5tR3Jvd3RoTGltaXQgPSBncm93dGhMaW1pdDsKKworICAgIGlmIChtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCA+IDAgJiYgYnVmZmVycyA+IG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KSB7CisgICAgICAgIEFMT0dXKCJQcmVhbGxvY2F0ZWQgYnVmZmVycyAlenUgPiBncm93dGhMaW1pdCAlenUsIGluY3JlYXNpbmcgZ3Jvd3RoTGltaXQiLAorICAgICAgICAgICAgICAgIGJ1ZmZlcnMsIG1JbnRlcm5hbC0+bUdyb3d0aExpbWl0KTsKKyAgICAgICAgbUludGVybmFsLT5tR3Jvd3RoTGltaXQgPSBidWZmZXJzOworICAgIH0KKworI2lmbmRlZiBOT19JTUVNT1JZCisgICAgaWYgKGJ1ZmZlcl9zaXplID49IGtTaGFyZWRNZW1vcnlUaHJlc2hvbGQpIHsKKyAgICAgICAgQUxPR0QoImNyZWF0aW5nIE1lbW9yeURlYWxlciIpOworICAgICAgICAvLyBVc2luZyBhIHNpbmdsZSBNZW1vcnlEZWFsZXIgaXMgZWZmaWNpZW50IGZvciBhIGdyb3VwIG9mIHNoYXJlZCBtZW1vcnkgb2JqZWN0cy4KKyAgICAgICAgLy8gVGhpcyBsb29wIGd1YXJhbnRlZXMgdGhhdCB3ZSB1c2Ugc2hhcmVkIG1lbW9yeSAobm8gZmFsbGJhY2sgdG8gbWFsbG9jKS4KKworICAgICAgICBzaXplX3QgYWxpZ25tZW50ID0gTWVtb3J5RGVhbGVyOjpnZXRBbGxvY2F0aW9uQWxpZ25tZW50KCk7CisgICAgICAgIHNpemVfdCBhdWdtZW50ZWRfc2l6ZSA9IGJ1ZmZlcl9zaXplICsgc2l6ZW9mKE1lZGlhQnVmZmVyOjpTaGFyZWRDb250cm9sKTsKKyAgICAgICAgc2l6ZV90IHRvdGFsID0gKGF1Z21lbnRlZF9zaXplICsgYWxpZ25tZW50IC0gMSkgLyBhbGlnbm1lbnQgKiBhbGlnbm1lbnQgKiBidWZmZXJzOworICAgICAgICBzcDxNZW1vcnlEZWFsZXI+IG1lbW9yeURlYWxlciA9IG5ldyBNZW1vcnlEZWFsZXIodG90YWwsICJNZWRpYUJ1ZmZlckdyb3VwIik7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidWZmZXJzOyArK2kpIHsKKyAgICAgICAgICAgIHNwPElNZW1vcnk+IG1lbSA9IG1lbW9yeURlYWxlci0+YWxsb2NhdGUoYXVnbWVudGVkX3NpemUpOworICAgICAgICAgICAgaWYgKG1lbS5nZXQoKSA9PSBudWxscHRyIHx8IG1lbS0+cG9pbnRlcigpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiT25seSBhbGxvY2F0ZWQgJXp1IHNoYXJlZCBidWZmZXJzIG9mIHNpemUgJXp1IiwgaSwgYnVmZmVyX3NpemUpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTWVkaWFCdWZmZXIgKmJ1ZmZlciA9IG5ldyBNZWRpYUJ1ZmZlcihtZW0pOworICAgICAgICAgICAgYnVmZmVyLT5nZXRTaGFyZWRDb250cm9sKCktPmNsZWFyKCk7CisgICAgICAgICAgICBhZGRfYnVmZmVyKGJ1ZmZlcik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbHNlCisgICAgKHZvaWQpa1NoYXJlZE1lbW9yeVRocmVzaG9sZDsKKyNlbmRpZgorCisgICAgLy8gTm9uLXNoYXJlZCBtZW1vcnkgYWxsb2NhdGlvbi4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcnM7ICsraSkgeworICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyID0gbmV3IE1lZGlhQnVmZmVyKGJ1ZmZlcl9zaXplKTsKKyAgICAgICAgaWYgKGJ1ZmZlci0+ZGF0YSgpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRlbGV0ZSBidWZmZXI7IC8vIGRvbid0IGNhbGwgcmVsZWFzZSwgaXQncyBub3QgcHJvcGVybHkgZm9ybWVkCisgICAgICAgICAgICBBTE9HVygiT25seSBhbGxvY2F0ZWQgJXp1IG1hbGxvYyBidWZmZXJzIG9mIHNpemUgJXp1IiwgaSwgYnVmZmVyX3NpemUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYWRkX2J1ZmZlcihidWZmZXIpOworICAgIH0KK30KKworTWVkaWFCdWZmZXJHcm91cDo6fk1lZGlhQnVmZmVyR3JvdXAoKSB7CisgICAgZm9yIChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA6IG1JbnRlcm5hbC0+bUJ1ZmZlcnMpIHsKKyAgICAgICAgaWYgKGJ1ZmZlci0+cmVmY291bnQoKSAhPSAwKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgbG9jYWxSZWZjb3VudCA9IGJ1ZmZlci0+bG9jYWxSZWZjb3VudCgpOworICAgICAgICAgICAgY29uc3QgaW50IHJlbW90ZVJlZmNvdW50ID0gYnVmZmVyLT5yZW1vdGVSZWZjb3VudCgpOworCisgICAgICAgICAgICAvLyBGYXRhbCBpZiB3ZSBoYXZlIGEgbG9jYWwgcmVmY291bnQuCisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGxvY2FsUmVmY291bnQgIT0gMCwKKyAgICAgICAgICAgICAgICAgICAgImJ1ZmZlciglcCkgbG9jYWxSZWZjb3VudCAlZCAhPSAwLCByZW1vdGVSZWZjb3VudCAlZCIsCisgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwgbG9jYWxSZWZjb3VudCwgcmVtb3RlUmVmY291bnQpOworCisgICAgICAgICAgICAvLyBMb2cgYW4gZXJyb3IgaWYgd2UgaGF2ZSBhIHJlbWFpbmluZyByZW1vdGUgcmVmY291bnQsCisgICAgICAgICAgICAvLyBhcyB0aGUgcmVtb3RlIHByb2Nlc3MgbWF5IGhhdmUgZGllZCBvciBtYXkgaGF2ZSBpbmFwcHJvcHJpYXRlIGJlaGF2aW9yLgorICAgICAgICAgICAgLy8gVGhlIHNoYXJlZCBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBNZWRpYUJ1ZmZlciB3aWxsCisgICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGJlIHJlY2xhaW1lZCB3aGVuIHRoZXJlIGFyZSBubyByZW1haW5pbmcgZmRzCisgICAgICAgICAgICAvLyBhc3NvY2lhdGVkIHdpdGggaXQuCisgICAgICAgICAgICBBTE9HRSgiYnVmZmVyKCVwKSBoYXMgcmVzaWR1YWwgcmVtb3RlUmVmY291bnQgJWQiLAorICAgICAgICAgICAgICAgICAgICBidWZmZXIsIHJlbW90ZVJlZmNvdW50KTsKKyAgICAgICAgfQorICAgICAgICAvLyBncmFjZWZ1bGx5IGRlbGV0ZS4KKyAgICAgICAgYnVmZmVyLT5zZXRPYnNlcnZlcihudWxscHRyKTsKKyAgICAgICAgYnVmZmVyLT5yZWxlYXNlKCk7CisgICAgfQorICAgIGRlbGV0ZSBtSW50ZXJuYWw7CisgICAgZGVsZXRlIG1XcmFwcGVyOworfQorCit2b2lkIE1lZGlhQnVmZmVyR3JvdXA6OmFkZF9idWZmZXIoTWVkaWFCdWZmZXJCYXNlICpidWZmZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUludGVybmFsLT5tTG9jayk7CisKKyAgICAvLyBpZiB3ZSdyZSBhYm92ZSBvdXIgZ3Jvd3RoIGxpbWl0LCByZWxlYXNlIGJ1ZmZlcnMgaWYgd2UgY2FuCisgICAgZm9yIChhdXRvIGl0ID0gbUludGVybmFsLT5tQnVmZmVycy5iZWdpbigpOworICAgICAgICAgICAgbUludGVybmFsLT5tR3Jvd3RoTGltaXQgPiAwCisgICAgICAgICAgICAmJiBtSW50ZXJuYWwtPm1CdWZmZXJzLnNpemUoKSA+PSBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdAorICAgICAgICAgICAgJiYgaXQgIT0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKTspIHsKKyAgICAgICAgaWYgKCgqaXQpLT5yZWZjb3VudCgpID09IDApIHsKKyAgICAgICAgICAgICgqaXQpLT5zZXRPYnNlcnZlcihudWxscHRyKTsKKyAgICAgICAgICAgICgqaXQpLT5yZWxlYXNlKCk7CisgICAgICAgICAgICBpdCA9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKytpdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIodGhpcyk7CisgICAgbUludGVybmFsLT5tQnVmZmVycy5lbXBsYWNlX2JhY2soYnVmZmVyKTsKK30KKworYm9vbCBNZWRpYUJ1ZmZlckdyb3VwOjpoYXNfYnVmZmVycygpIHsKKyAgICBpZiAobUludGVybmFsLT5tQnVmZmVycy5zaXplKCkgPCBtSW50ZXJuYWwtPm1Hcm93dGhMaW1pdCkgeworICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gV2UgY2FuIGFkZCBtb3JlIGJ1ZmZlcnMgaW50ZXJuYWxseS4KKyAgICB9CisgICAgZm9yIChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA6IG1JbnRlcm5hbC0+bUJ1ZmZlcnMpIHsKKyAgICAgICAgaWYgKGJ1ZmZlci0+cmVmY291bnQoKSA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IE1lZGlhQnVmZmVyR3JvdXA6OmFjcXVpcmVfYnVmZmVyKAorICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKipvdXQsIGJvb2wgbm9uQmxvY2tpbmcsIHNpemVfdCByZXF1ZXN0ZWRTaXplKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1JbnRlcm5hbC0+bUxvY2spOworICAgIGZvciAoOzspIHsKKyAgICAgICAgc2l6ZV90IHNtYWxsZXN0ID0gcmVxdWVzdGVkU2l6ZTsKKyAgICAgICAgc2l6ZV90IGJpZ2dlc3QgPSByZXF1ZXN0ZWRTaXplOworICAgICAgICBNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIGF1dG8gZnJlZSA9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuZW5kKCk7CisgICAgICAgIGZvciAoYXV0byBpdCA9IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuYmVnaW4oKTsgaXQgIT0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKTsgKytpdCkgeworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IHNpemUgPSAoKml0KS0+c2l6ZSgpOworICAgICAgICAgICAgaWYgKHNpemUgPiBiaWdnZXN0KSB7CisgICAgICAgICAgICAgICAgYmlnZ2VzdCA9IHNpemU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKCppdCktPnJlZmNvdW50KCkgPT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChzaXplID49IHJlcXVlc3RlZFNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyID0gKml0OworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCBzbWFsbGVzdCkgeworICAgICAgICAgICAgICAgICAgICBzbWFsbGVzdCA9IHNpemU7IC8vIGFsd2F5cyBmcmVlIHRoZSBzbWFsbGVzdCBidWYKKyAgICAgICAgICAgICAgICAgICAgZnJlZSA9IGl0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyID09IG51bGxwdHIKKyAgICAgICAgICAgICAgICAmJiAoZnJlZSAhPSBtSW50ZXJuYWwtPm1CdWZmZXJzLmVuZCgpCisgICAgICAgICAgICAgICAgICAgIHx8IG1JbnRlcm5hbC0+bUJ1ZmZlcnMuc2l6ZSgpIDwgbUludGVybmFsLT5tR3Jvd3RoTGltaXQpKSB7CisgICAgICAgICAgICAvLyBXZSBhbGxvYyBiZWZvcmUgd2UgZnJlZSBzbyBmYWlsdXJlIGxlYXZlcyBncm91cCB1bmNoYW5nZWQuCisgICAgICAgICAgICBjb25zdCBzaXplX3QgYWxsb2NhdGVTaXplID0gcmVxdWVzdGVkU2l6ZSA9PSAwID8gYmlnZ2VzdCA6CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNpemUgPCBTSVpFX01BWCAvIDMgKiAyIC8qIE5COiBvcmRlcmluZyAqLyA/CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZFNpemUgKiAzIC8gMiA6IHJlcXVlc3RlZFNpemU7CisgICAgICAgICAgICBidWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYWxsb2NhdGVTaXplKTsKKyAgICAgICAgICAgIGlmIChidWZmZXItPmRhdGEoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFsbG9jYXRpb24gZmFpbHVyZSBmb3Igc2l6ZSAlenUiLCBhbGxvY2F0ZVNpemUpOworICAgICAgICAgICAgICAgIGRlbGV0ZSBidWZmZXI7IC8vIEludmFsaWQgYWxsb2MsIHByZWZlciBub3QgdG8gY2FsbCByZWxlYXNlLgorICAgICAgICAgICAgICAgIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGJ1ZmZlci0+c2V0T2JzZXJ2ZXIodGhpcyk7CisgICAgICAgICAgICAgICAgaWYgKGZyZWUgIT0gbUludGVybmFsLT5tQnVmZmVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigicmVhbGxvY2F0ZSBidWZmZXIsIHJlcXVlc3RlZCBzaXplICV6dSB2cyBhdmFpbGFibGUgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRTaXplLCAoKmZyZWUpLT5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICAoKmZyZWUpLT5zZXRPYnNlcnZlcihudWxscHRyKTsKKyAgICAgICAgICAgICAgICAgICAgKCpmcmVlKS0+cmVsZWFzZSgpOworICAgICAgICAgICAgICAgICAgICAqZnJlZSA9IGJ1ZmZlcjsgLy8gaW4tcGxhY2UgcmVwbGFjZQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJhbGxvY2F0ZSBidWZmZXIsIHJlcXVlc3RlZCBzaXplICV6dSIsIHJlcXVlc3RlZFNpemUpOworICAgICAgICAgICAgICAgICAgICBtSW50ZXJuYWwtPm1CdWZmZXJzLmVtcGxhY2VfYmFjayhidWZmZXIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+YWRkX3JlZigpOworICAgICAgICAgICAgYnVmZmVyLT5yZXNldCgpOworICAgICAgICAgICAgKm91dCA9IGJ1ZmZlcjsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgICAgICBpZiAobm9uQmxvY2tpbmcpIHsKKyAgICAgICAgICAgICpvdXQgPSBudWxscHRyOworICAgICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOworICAgICAgICB9CisgICAgICAgIC8vIEFsbCBidWZmZXJzIGFyZSBpbiB1c2UsIGJsb2NrIHVudGlsIG9uZSBvZiB0aGVtIGlzIHJldHVybmVkLgorICAgICAgICBtSW50ZXJuYWwtPm1Db25kaXRpb24ud2FpdChtSW50ZXJuYWwtPm1Mb2NrKTsKKyAgICB9CisgICAgLy8gTmV2ZXIgZ2V0cyBoZXJlLgorfQorCitzaXplX3QgTWVkaWFCdWZmZXJHcm91cDo6YnVmZmVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUludGVybmFsLT5tQnVmZmVycy5zaXplKCk7Cit9CisKK3ZvaWQgTWVkaWFCdWZmZXJHcm91cDo6c2lnbmFsQnVmZmVyUmV0dXJuZWQoTWVkaWFCdWZmZXJCYXNlICopIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgYXV0b0xvY2sobUludGVybmFsLT5tTG9jayk7CisgICAgbUludGVybmFsLT5tQ29uZGl0aW9uLnNpZ25hbCgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuY3BwCmluZGV4IGU1YTg1ZTkuLmEwOGZlZDEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5jcHAKQEAgLTIzLDYgKzIzLDcgQEAKIAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlA4ID0gInZpZGVvL3gtdm5kLm9uMi52cDgiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlA5ID0gInZpZGVvL3gtdm5kLm9uMi52cDkiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVYxID0gInZpZGVvL2F2MDEiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fQVZDID0gInZpZGVvL2F2YyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDID0gInZpZGVvL2hldmMiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQgPSAidmlkZW8vbXA0di1lcyI7CkBAIC0zMSw2ICszMiwxMCBAQAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fUkFXID0gInZpZGVvL3JhdyI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19ET0xCWV9WSVNJT04gPSAidmlkZW8vZG9sYnktdmlzaW9uIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1NDUkFNQkxFRCA9ICJ2aWRlby9zY3JhbWJsZWQiOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fRElWWCA9ICJ2aWRlby9kaXZ4IjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0RJVlgzID0gInZpZGVvL2RpdngzIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX1hWSUQgPSAidmlkZW8veHZpZCI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NSlBFRyA9ICJ2aWRlby94LW1vdGlvbi1qcGVnIjsKIAogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05CID0gImF1ZGlvLzNncHAiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCID0gImF1ZGlvL2Ftci13YiI7CkBAIC01MCwxMiArNTUsMTggQEAKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX01TR1NNID0gImF1ZGlvL2dzbSI7CiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQzMgPSAiYXVkaW8vYWMzIjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VBQzMgPSAiYXVkaW8vZWFjMyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzX0pPQyA9ICJhdWRpby9lYWMzLWpvYyI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BQzQgPSAiYXVkaW8vYWM0IjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1NDUkFNQkxFRCA9ICJhdWRpby9zY3JhbWJsZWQiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUxBQyA9ICJhdWRpby9hbGFjIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1dNQSA9ICJhdWRpby94LW1zLXdtYSI7Citjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NU19BRFBDTSA9ICJhdWRpby94LWFkcGNtLW1zIjsKK2NvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0RWSV9JTUFfQURQQ00gPSAiYXVkaW8veC1hZHBjbS1kdmktaW1hIjsKKwogCiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQgPSAidmlkZW8vbXA0IjsKIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0NPTlRBSU5FUl9XQVYgPSAiYXVkaW8veC13YXYiOwotY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyA9ICJhcHBsaWNhdGlvbi9vZ2ciOworY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX09HRyA9ICJhdWRpby9vZ2ciOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01BVFJPU0tBID0gInZpZGVvL3gtbWF0cm9za2EiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX01QRUcyVFMgPSAidmlkZW8vbXAydHMiOwogY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX0FWSSA9ICJ2aWRlby9hdmkiOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvTWV0YURhdGEuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01ldGFEYXRhLmNwcApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZXRhRGF0YS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01ldGFEYXRhQmFzZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL01ldGFEYXRhQmFzZS5jcHAKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL01ldGFEYXRhQmFzZS5jcHAKcmVuYW1lIHRvIG1lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWV0YURhdGFCYXNlLmNwcApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJhYzAyNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5jcHAKQEAgLTAsMCArMSwzNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk9wdXNIZWFkZXIiCisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8bG9nL2xvZy5oPgorCisjaW5jbHVkZSAiT3B1c0hlYWRlci5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIE9wdXMgdXNlcyBWb3JiaXMgY2hhbm5lbCBtYXBwaW5nLCBhbmQgVm9yYmlzIGNoYW5uZWwgbWFwcGluZyBzcGVjaWZpZXMKKy8vIG1hcHBpbmdzIGZvciB1cCB0byA4IGNoYW5uZWxzLiBUaGlzIGluZm9ybWF0aW9uIGlzIHBhcnQgb2YgdGhlIFZvcmJpcyBJCisvLyBTcGVjaWZpY2F0aW9uOgorLy8gaHR0cDovL3d3dy54aXBoLm9yZy92b3JiaXMvZG9jL1ZvcmJpc19JX3NwZWMuaHRtbAorY29uc3RleHByIGludCBrTWF4Q2hhbm5lbHMgPSA4OworCitjb25zdGV4cHIgdWludDhfdCBrT3B1c0NoYW5uZWxNYXBba01heENoYW5uZWxzXVtrTWF4Q2hhbm5lbHNdID0geworICAgICAgICB7MH0sCisgICAgICAgIHswLCAxfSwKKyAgICAgICAgezAsIDIsIDF9LAorICAgICAgICB7MCwgMSwgMiwgM30sCisgICAgICAgIHswLCA0LCAxLCAyLCAzfSwKKyAgICAgICAgezAsIDQsIDEsIDIsIDMsIDV9LAorICAgICAgICB7MCwgNCwgMSwgMiwgMywgNSwgNn0sCisgICAgICAgIHswLCA2LCAxLCAyLCAzLCA0LCA1LCA3fSwKK307CisKKy8vIFNpemUgb2YgdGhlIE9wdXMgaGVhZGVyIGV4Y2x1ZGluZyBvcHRpb25hbCBtYXBwaW5nIGluZm9ybWF0aW9uLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlclNpemUgPSAxOTsKKy8vIE9mZnNldCB0byBtYWdpYyBzdHJpbmcgdGhhdCBzdGFydHMgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyTGFiZWxPZmZzZXQgPSAwOworLy8gT2Zmc2V0IHRvIE9wdXMgdmVyc2lvbiBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyVmVyc2lvbk9mZnNldCA9IDg7CisvLyBPZmZzZXQgdG8gdGhlIGNoYW5uZWwgY291bnQgYnl0ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyQ2hhbm5lbHNPZmZzZXQgPSA5OworLy8gT2Zmc2V0IHRvIHRoZSBwcmUtc2tpcCB2YWx1ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyU2tpcFNhbXBsZXNPZmZzZXQgPSAxMDsKKy8vIE9mZnNldCB0byBzYW1wbGUgcmF0ZSBpbiB0aGUgT3B1cyBoZWFkZXIuCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyU2FtcGxlUmF0ZU9mZnNldCA9IDEyOworLy8gT2Zmc2V0IHRvIHRoZSBnYWluIHZhbHVlIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJHYWluT2Zmc2V0ID0gMTY7CisvLyBPZmZzZXQgdG8gdGhlIGNoYW5uZWwgbWFwcGluZyBieXRlIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJDaGFubmVsTWFwcGluZ09mZnNldCA9IDE4OworLy8gT3B1cyBIZWFkZXIgY29udGFpbnMgYSBzdHJlYW0gbWFwLiBUaGUgbWFwcGluZyB2YWx1ZXMgYXJlIGluIHRoZSBoZWFkZXIKKy8vIGJleW9uZCB0aGUgYWx3YXlzIHByZXNlbnQgfGtPcHVzSGVhZGVyU2l6ZXwgYnl0ZXMgb2YgZGF0YS4gVGhlIG1hcHBpbmcKKy8vIGRhdGEgY29udGFpbnMgc3RyZWFtIGNvdW50LCBjb3VwbGluZyBpbmZvcm1hdGlvbiwgYW5kIHBlciBjaGFubmVsIG1hcHBpbmcKKy8vIHZhbHVlczoKKy8vICAgLSBCeXRlIDA6IE51bWJlciBvZiBzdHJlYW1zLgorLy8gICAtIEJ5dGUgMTogTnVtYmVyIGNvdXBsZWQuCisvLyAgIC0gQnl0ZSAyOiBTdGFydGluZyBhdCBieXRlIDIgYXJlIHxoZWFkZXItPmNoYW5uZWxzfCB1aW50OCBtYXBwaW5nCisvLyAgICAgICAgICAgICB2YWx1ZXMuCisvLyBPZmZzZXQgdG8gdGhlIG51bWJlciBvZiBzdHJlYW1zIGluIHRoZSBPcHVzIGhlYWRlci4KK2NvbnN0ZXhwciBzaXplX3Qga09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0ID0gMTk7CisvLyBPZmZzZXQgdG8gdGhlIG51bWJlciBvZiBzdHJlYW1zIHRoYXQgYXJlIGNvdXBsZWQgaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlck51bUNvdXBsZWRTdHJlYW1zT2Zmc2V0ID0gMjA7CisvLyBPZmZzZXQgdG8gdGhlIHN0cmVhbSB0byBjaGFubmVsIG1hcHBpbmcgaW4gdGhlIE9wdXMgaGVhZGVyLgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCA9IDIxOworCisvLyBEZWZhdWx0IGF1ZGlvIG91dHB1dCBjaGFubmVsIGxheW91dC4gVXNlZCB0byBpbml0aWFsaXplIHxzdHJlYW1fbWFwfCBpbgorLy8gT3B1c0hlYWRlciwgYW5kIHBhc3NlZCB0byBvcHVzX211bHRpc3RyZWFtX2RlY29kZXJfY3JlYXRlKCkgd2hlbiB0aGUgaGVhZGVyCisvLyBkb2VzIG5vdCBjb250YWluIG1hcHBpbmcgaW5mb3JtYXRpb24uIFRoZSB2YWx1ZXMgYXJlIHZhbGlkIG9ubHkgZm9yIG1vbm8gYW5kCisvLyBzdGVyZW8gb3V0cHV0OiBPcHVzIHN0cmVhbXMgd2l0aCBtb3JlIHRoYW4gMiBjaGFubmVscyByZXF1aXJlIGEgc3RyZWFtIG1hcC4KK2NvbnN0ZXhwciBpbnQga01heENoYW5uZWxzV2l0aERlZmF1bHRMYXlvdXQgPSAyOworCitzdGF0aWMgdWludDE2X3QgUmVhZExFMTYoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwgdWludDMyX3QgcmVhZF9vZmZzZXQpIHsKKyAgICAvLyBjaGVjayB3aGV0aGVyIHRoZSAybmQgYnl0ZSBpcyB3aXRoaW4gdGhlIGJ1ZmZlcgorICAgIGlmIChyZWFkX29mZnNldCArIDEgPj0gZGF0YV9zaXplKSByZXR1cm4gMDsKKyAgICB1aW50MTZfdCB2YWw7CisgICAgdmFsID0gZGF0YVtyZWFkX29mZnNldF07CisgICAgdmFsIHw9IGRhdGFbcmVhZF9vZmZzZXQgKyAxXSA8PCA4OworICAgIHJldHVybiB2YWw7Cit9CisKKy8vIFBhcnNlcyBPcHVzIEhlYWRlci4gSGVhZGVyIHNwZWM6IGh0dHA6Ly93aWtpLnhpcGgub3JnL09nZ09wdXMjSURfSGVhZGVyCitib29sIFBhcnNlT3B1c0hlYWRlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLCBPcHVzSGVhZGVyKiBoZWFkZXIpIHsKKyAgICBpZiAoZGF0YSA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGRhdGFfc2l6ZSA8IGtPcHVzSGVhZGVyU2l6ZSkgeworICAgICAgICBBTE9HVigiSGVhZGVyIHNpemUgaXMgdG9vIHNtYWxsLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGhlYWRlci0+Y2hhbm5lbHMgPSBkYXRhW2tPcHVzSGVhZGVyQ2hhbm5lbHNPZmZzZXRdOworCisgICAgaWYgKGhlYWRlci0+Y2hhbm5lbHMgPCAxIHx8IGhlYWRlci0+Y2hhbm5lbHMgPiBrTWF4Q2hhbm5lbHMpIHsKKyAgICAgICAgQUxPR1YoIkludmFsaWQgSGVhZGVyLCBiYWQgY2hhbm5lbCBjb3VudDogJWQiLCBoZWFkZXItPmNoYW5uZWxzKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBoZWFkZXItPnNraXBfc2FtcGxlcyA9IFJlYWRMRTE2KGRhdGEsIGRhdGFfc2l6ZSwga09wdXNIZWFkZXJTa2lwU2FtcGxlc09mZnNldCk7CisgICAgaGVhZGVyLT5nYWluX2RiID0gc3RhdGljX2Nhc3Q8aW50MTZfdD4oUmVhZExFMTYoZGF0YSwgZGF0YV9zaXplLCBrT3B1c0hlYWRlckdhaW5PZmZzZXQpKTsKKyAgICBoZWFkZXItPmNoYW5uZWxfbWFwcGluZyA9IGRhdGFba09wdXNIZWFkZXJDaGFubmVsTWFwcGluZ09mZnNldF07CisgICAgaWYgKCFoZWFkZXItPmNoYW5uZWxfbWFwcGluZykgeworICAgICAgICBpZiAoaGVhZGVyLT5jaGFubmVscyA+IGtNYXhDaGFubmVsc1dpdGhEZWZhdWx0TGF5b3V0KSB7CisgICAgICAgICAgICBBTE9HVigiSW52YWxpZCBIZWFkZXIsIG1pc3Npbmcgc3RyZWFtIG1hcC4iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBoZWFkZXItPm51bV9zdHJlYW1zID0gMTsKKyAgICAgICAgaGVhZGVyLT5udW1fY291cGxlZCA9IGhlYWRlci0+Y2hhbm5lbHMgPiAxOworICAgICAgICBoZWFkZXItPnN0cmVhbV9tYXBbMF0gPSAwOworICAgICAgICBoZWFkZXItPnN0cmVhbV9tYXBbMV0gPSAxOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKGRhdGFfc2l6ZSA8IGtPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ICsgaGVhZGVyLT5jaGFubmVscykgeworICAgICAgICBBTE9HVigiSW52YWxpZCBzdHJlYW0gbWFwOyBpbnN1ZmZpY2llbnQgZGF0YSBmb3IgY3VycmVudCBjaGFubmVsICIKKyAgICAgICAgICAgICAgImNvdW50OiAlZCIsCisgICAgICAgICAgICAgIGhlYWRlci0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGhlYWRlci0+bnVtX3N0cmVhbXMgPSBkYXRhW2tPcHVzSGVhZGVyTnVtU3RyZWFtc09mZnNldF07CisgICAgaGVhZGVyLT5udW1fY291cGxlZCA9IGRhdGFba09wdXNIZWFkZXJOdW1Db3VwbGVkU3RyZWFtc09mZnNldF07CisgICAgaWYgKGhlYWRlci0+bnVtX2NvdXBsZWQgPiBoZWFkZXItPm51bV9zdHJlYW1zIHx8CisgICAgICAgIGhlYWRlci0+bnVtX3N0cmVhbXMgKyBoZWFkZXItPm51bV9jb3VwbGVkICE9IGhlYWRlci0+Y2hhbm5lbHMpIHsKKyAgICAgICAgQUxPR1YoIkluY29uc2lzdGVudCBjaGFubmVsIG1hcHBpbmcsIHN0cmVhbXM6ICVkIGNvdXBsZWQ6ICVkIGNoYW5uZWxzOiAlZCIsCisgICAgICAgIGhlYWRlci0+bnVtX3N0cmVhbXMsIGhlYWRlci0+bnVtX2NvdXBsZWQsIGhlYWRlci0+Y2hhbm5lbHMpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGVhZGVyLT5jaGFubmVsczsgKytpKSB7CisgICAgICAgIHVpbnQ4X3QgdmFsdWUgPSBkYXRhW2tPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ICsgaV07CisgICAgICAgIGlmICh2YWx1ZSAhPSAyNTUgJiYgdmFsdWUgPj0gaGVhZGVyLT5jaGFubmVscykgeworICAgICAgICAgICAgQUxPR1YoIkludmFsaWQgY2hhbm5lbCBtYXBwaW5nIGZvciBpbmRleCAlaSA6ICVkIiwgaSwgdmFsdWUpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGhlYWRlci0+c3RyZWFtX21hcFtpXSA9IHZhbHVlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW50IFdyaXRlT3B1c0hlYWRlcihjb25zdCBPcHVzSGVhZGVyICZoZWFkZXIsIGludCBpbnB1dF9zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0cHV0LCBzaXplX3Qgb3V0cHV0X3NpemUpIHsKKyAgICAvLyBTZWUgaHR0cHM6Ly93aWtpLnhpcGgub3JnL09nZ09wdXMjSURfSGVhZGVyLgorICAgIGNvbnN0IHNpemVfdCB0b3RhbF9zaXplID0ga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBoZWFkZXIuY2hhbm5lbHM7CisgICAgaWYgKG91dHB1dF9zaXplIDwgdG90YWxfc2l6ZSkgeworICAgICAgICBBTE9HRSgiT3V0cHV0IGJ1ZmZlciB0b28gc21hbGwgZm9yIGhlYWRlci4iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIGVuc3VyZSBlbnRpcmUgaGVhZGVyIGlzIGNsZWFyZWQsIGV2ZW4gdGhvdWdoIHdlIG92ZXJ3cml0ZSBtdWNoIG9mIGl0IGJlbG93CisgICAgbWVtc2V0KG91dHB1dCwgMCwgb3V0cHV0X3NpemUpOworCisgICAgLy8gU2V0IG1hZ2ljIHNpZ25hdHVyZS4KKyAgICBtZW1jcHkob3V0cHV0ICsga09wdXNIZWFkZXJMYWJlbE9mZnNldCwgIk9wdXNIZWFkIiwgOCk7CisgICAgLy8gU2V0IE9wdXMgdmVyc2lvbi4KKyAgICBvdXRwdXRba09wdXNIZWFkZXJWZXJzaW9uT2Zmc2V0XSA9IDE7CisgICAgLy8gU2V0IGNoYW5uZWwgY291bnQuCisgICAgb3V0cHV0W2tPcHVzSGVhZGVyQ2hhbm5lbHNPZmZzZXRdID0gKHVpbnQ4X3QpaGVhZGVyLmNoYW5uZWxzOworICAgIC8vIFNldCBwcmUtc2tpcAorICAgIG1lbWNweShvdXRwdXQgKyBrT3B1c0hlYWRlclNraXBTYW1wbGVzT2Zmc2V0LCAmaGVhZGVyLnNraXBfc2FtcGxlcywgc2l6ZW9mKHVpbnQxNl90KSk7CisgICAgLy8gU2V0IG9yaWdpbmFsIGlucHV0IHNhbXBsZSByYXRlIGluIEh6LgorICAgIG1lbWNweShvdXRwdXQgKyBrT3B1c0hlYWRlclNhbXBsZVJhdGVPZmZzZXQsICZpbnB1dF9zYW1wbGVfcmF0ZSwgc2l6ZW9mKHVpbnQzMl90KSk7CisgICAgLy8gU2V0IG91dHB1dCBnYWluIGluIGRCLgorICAgIG1lbWNweShvdXRwdXQgKyBrT3B1c0hlYWRlckdhaW5PZmZzZXQsICZoZWFkZXIuZ2Fpbl9kYiwgc2l6ZW9mKHVpbnQxNl90KSk7CisKKyAgICBpZiAoaGVhZGVyLmNoYW5uZWxzID4gMikgeworICAgICAgICAvLyBTZXQgY2hhbm5lbCBtYXBwaW5nCisgICAgICAgIG91dHB1dFtrT3B1c0hlYWRlckNoYW5uZWxNYXBwaW5nT2Zmc2V0XSA9IDE7CisgICAgICAgIC8vIEFzc3VtaW5nIG5vIGNvdXBsZWQgc3RyZWFtcy4gVGhpcyBzaG91bGQgYWN0dWFsbHkgYmUKKyAgICAgICAgLy8gY2hhbm5lbHMoKSAtIHxjb3VwbGVkX3N0cmVhbXN8LgorICAgICAgICBvdXRwdXRba09wdXNIZWFkZXJOdW1TdHJlYW1zT2Zmc2V0XSA9IGhlYWRlci5jaGFubmVsczsKKyAgICAgICAgb3V0cHV0W2tPcHVzSGVhZGVyTnVtQ291cGxlZFN0cmVhbXNPZmZzZXRdID0gMDsKKworICAgICAgICAvLyBTZXQgdGhlIGFjdHVhbCBzdHJlYW0gbWFwLgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGhlYWRlci5jaGFubmVsczsgKytpKSB7CisgICAgICAgICAgICBvdXRwdXRba09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBpXSA9IGtPcHVzQ2hhbm5lbE1hcFtoZWFkZXIuY2hhbm5lbHMgLSAxXVtpXTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4ga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBoZWFkZXIuY2hhbm5lbHMgKyAxOworICAgIH0gZWxzZSB7CisgICAgICAgIG91dHB1dFtrT3B1c0hlYWRlckNoYW5uZWxNYXBwaW5nT2Zmc2V0XSA9IDA7CisgICAgICAgIHJldHVybiBrT3B1c0hlYWRlckNoYW5uZWxNYXBwaW5nT2Zmc2V0ICsgMTsKKyAgICB9Cit9CisKK2ludCBXcml0ZU9wdXNIZWFkZXJzKGNvbnN0IE9wdXNIZWFkZXIgJmhlYWRlciwgaW50IGlucHV0U2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dHB1dCwgc2l6ZV90IG91dHB1dFNpemUsIHVpbnQ2NF90IGNvZGVjRGVsYXksCisgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzZWVrUHJlUm9sbCkgeworICAgIGlmIChvdXRwdXRTaXplIDwgQU9QVVNfVU5JRklFRF9DU0RfTUlOU0laRSkgeworICAgICAgICBBTE9HRCgiQnVmZmVyIG5vdCBsYXJnZSBlbm91Z2ggdG8gaG9sZCB1bmlmaWVkIE9QVVMgQ1NEIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaW50IGhlYWRlckxlbiA9IDA7CisKKyAgICAvLyBBZGQgb3B1cyBoZWFkZXIKKyAgICAvKgorICAgICAgRm9sbG93aW5nIGlzIHRoZSBDU0Qgc3ludGF4IGZvciBzaWduYWxsaW5nIE9wdXNIZWFkZXIKKyAgICAgIChodHRwOi8vd2lraS54aXBoLm9yZy9PZ2dPcHVzI0lEX0hlYWRlcikKKworICAgICAgTWFya2VyICg4IGJ5dGVzKSB8IExlbmd0aCAoOCBieXRlcykgfCBPcHVzSGVhZGVyCisKKyAgICAgIE1hcmtlcnMgc3VwcG9ydGVkOgorICAgICAgQU9QVVNfQ1NEX09QVVNfSEVBREVSX01BUktFUiAtIFNpZ25hbHMgT3B1cyBIZWFkZXIKKworICAgICAgTGVuZ3RoIHNob3VsZCBiZSBhIHZhbHVlIHdpdGhpbiBBT1BVU19PUFVTSEVBRF9NSU5TSVpFIGFuZCBBT1BVU19PUFVTSEVBRF9NQVhTSVpFLgorICAgICovCisKKyAgICBtZW1jcHkob3V0cHV0ICsgaGVhZGVyTGVuLCBBT1BVU19DU0RfT1BVU19IRUFERVJfTUFSS0VSLCBBT1BVU19NQVJLRVJfU0laRSk7CisgICAgaGVhZGVyTGVuICs9IEFPUFVTX01BUktFUl9TSVpFOworCisgICAgLy8gUGxhY2UgaG9sZGVyIGZvciBvcHVzSGVhZGVyIFNpemUKKyAgICBoZWFkZXJMZW4gKz0gQU9QVVNfTEVOR1RIX1NJWkU7CisKKyAgICBpbnQgaGVhZGVyU2l6ZSA9IFdyaXRlT3B1c0hlYWRlcihoZWFkZXIsIGlucHV0U2FtcGxlUmF0ZSwgb3V0cHV0ICsgaGVhZGVyTGVuLAorICAgICAgICBvdXRwdXRTaXplIC0gaGVhZGVyTGVuKTsKKyAgICBpZiAoaGVhZGVyU2l6ZSA8IDApIHsKKyAgICAgICAgQUxPR0QoIiVzOiBXcml0ZU9wdXNIZWFkZXIgZmFpbGVkIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGhlYWRlckxlbiArPSBoZWFkZXJTaXplOworCisgICAgLy8gVXBkYXRlIG9wdXMgaGVhZGVyU2l6ZSBhZnRlciBBT1BVU19DU0RfT1BVU19IRUFERVJfTUFSS0VSCisgICAgdWludDY0X3QgbGVuZ3RoID0gaGVhZGVyU2l6ZTsKKyAgICBtZW1jcHkob3V0cHV0ICsgQU9QVVNfTUFSS0VSX1NJWkUsICZsZW5ndGgsIEFPUFVTX0xFTkdUSF9TSVpFKTsKKworICAgIC8qCisgICAgICBGb2xsb3dpbmcgaXMgdGhlIENTRCBzeW50YXggZm9yIHNpZ25hbGxpbmcgY29kZWMgZGVsYXkgYW5kCisgICAgICBzZWVrIHByZS1yb2xsIHdoaWNoIGlzIHRvIGJlIGFwcGVuZGVkIGFmdGVyIE9wdXNIZWFkZXIKKworICAgICAgTWFya2VyICg4IGJ5dGVzKSB8IExlbmd0aCAoOCBieXRlcykgfCBTYW1wbGVzIGluIG5zICg4IGJ5dGVzKQorCisgICAgICBNYXJrZXJzIHN1cHBvcnRlZDoKKyAgICAgIEFPUFVTX0NTRF9DT0RFQ19ERUxBWV9NQVJLRVIgLSBjb2RlYyBkZWxheSBhcyBzYW1wbGVzIGluIG5zLCByZXByZXNlbnRlZCBpbiA4IGJ5dGVzCisgICAgICBBT1BVU19DU0RfU0VFS19QUkVST0xMX01BUktFUiAtIHByZXJvbGwgYWRqdXN0bWVudCBhcyBzYW1wbGVzIGluIG5zLCByZXByZXNlbnRlZCBpbiA4IGJ5dGVzCisKKyAgICAqLworICAgIGxlbmd0aCA9IHNpemVvZihjb2RlY0RlbGF5KTsKKyAgICBpZiAoaGVhZGVyTGVuID4gKG91dHB1dFNpemUgLSBBT1BVU19NQVJLRVJfU0laRSAtIEFPUFVTX0xFTkdUSF9TSVpFIC0gbGVuZ3RoKSkgeworICAgICAgICBBTE9HRCgiQnVmZmVyIG5vdCBsYXJnZSBlbm91Z2ggdG8gaG9sZCBjb2RlYyBkZWxheSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8vIEFkZCBjb2RlYyBkZWxheQorICAgIG1lbWNweShvdXRwdXQgKyBoZWFkZXJMZW4sIEFPUFVTX0NTRF9DT0RFQ19ERUxBWV9NQVJLRVIsIEFPUFVTX01BUktFUl9TSVpFKTsKKyAgICBoZWFkZXJMZW4gKz0gQU9QVVNfTUFSS0VSX1NJWkU7CisgICAgbWVtY3B5KG91dHB1dCArIGhlYWRlckxlbiwgJmxlbmd0aCwgQU9QVVNfTEVOR1RIX1NJWkUpOworICAgIGhlYWRlckxlbiArPSBBT1BVU19MRU5HVEhfU0laRTsKKyAgICBtZW1jcHkob3V0cHV0ICsgaGVhZGVyTGVuLCAmY29kZWNEZWxheSwgbGVuZ3RoKTsKKyAgICBoZWFkZXJMZW4gKz0gbGVuZ3RoOworCisgICAgbGVuZ3RoID0gc2l6ZW9mKHNlZWtQcmVSb2xsKTsKKyAgICBpZiAoaGVhZGVyTGVuID4gKG91dHB1dFNpemUgLSBBT1BVU19NQVJLRVJfU0laRSAtIEFPUFVTX0xFTkdUSF9TSVpFIC0gbGVuZ3RoKSkgeworICAgICAgICBBTE9HRCgiQnVmZmVyIG5vdCBsYXJnZSBlbm91Z2ggdG8gaG9sZCBzZWVrIHByZSByb2xsIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgLy8gQWRkIHNraXAgcHJlIHJvbGwKKyAgICBtZW1jcHkob3V0cHV0ICsgaGVhZGVyTGVuLCBBT1BVU19DU0RfU0VFS19QUkVST0xMX01BUktFUiwgQU9QVVNfTUFSS0VSX1NJWkUpOworICAgIGhlYWRlckxlbiArPSBBT1BVU19NQVJLRVJfU0laRTsKKyAgICBtZW1jcHkob3V0cHV0ICsgaGVhZGVyTGVuLCAmbGVuZ3RoLCBBT1BVU19MRU5HVEhfU0laRSk7CisgICAgaGVhZGVyTGVuICs9IEFPUFVTX0xFTkdUSF9TSVpFOworICAgIG1lbWNweShvdXRwdXQgKyBoZWFkZXJMZW4sICZzZWVrUHJlUm9sbCwgbGVuZ3RoKTsKKyAgICBoZWFkZXJMZW4gKz0gbGVuZ3RoOworCisgICAgcmV0dXJuIGhlYWRlckxlbjsKK30KKworYm9vbCBJc09wdXNIZWFkZXIoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSkgeworICAgIGlmIChkYXRhX3NpemUgPCBBT1BVU19NQVJLRVJfU0laRSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuICFtZW1jbXAoZGF0YSwgQU9QVVNfQ1NEX09QVVNfSEVBREVSX01BUktFUiwgQU9QVVNfTUFSS0VSX1NJWkUpOworfQorCitib29sIEdldE9wdXNIZWFkZXJCdWZmZXJzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipvcHVzSGVhZEJ1Ziwgc2l6ZV90ICpvcHVzSGVhZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipjb2RlY0RlbGF5QnVmLCBzaXplX3QgKmNvZGVjRGVsYXlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqc2Vla1ByZVJvbGxCdWYsIHNpemVfdCAqc2Vla1ByZVJvbGxTaXplKSB7CisgICAgKmNvZGVjRGVsYXlCdWYgPSBOVUxMOworICAgICpjb2RlY0RlbGF5U2l6ZSA9IDA7CisgICAgKnNlZWtQcmVSb2xsQnVmID0gTlVMTDsKKyAgICAqc2Vla1ByZVJvbGxTaXplID0gMDsKKyAgICAqb3B1c0hlYWRCdWYgPSBOVUxMOworICAgICpvcHVzSGVhZFNpemUgPSAwOworCisgICAgLy8gQU9QVVNfTUFSS0VSX1NJWkUgaXMgOCAiT3B1c0hlYWQiIGlzIG9mIHNpemUgOAorICAgIGlmIChkYXRhX3NpemUgPCA4KQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBDaGVjayBpZiB0aGUgQ1NEIGlzIGluIGxlZ2FjeSBmb3JtYXQKKyAgICBpZiAoIW1lbWNtcCgiT3B1c0hlYWQiLCBkYXRhLCA4KSkgeworICAgICAgICBpZiAoZGF0YV9zaXplIDwgQU9QVVNfT1BVU0hFQURfTUlOU0laRSB8fCBkYXRhX3NpemUgPiBBT1BVU19PUFVTSEVBRF9NQVhTSVpFKSB7CisgICAgICAgICAgICBBTE9HRCgiVW5leHBlY3RlZCBzaXplIGZvciBvcHVzSGVhZFNpemUgJXp1IiwgZGF0YV9zaXplKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICAqb3B1c0hlYWRCdWYgPSAodm9pZCAqKWRhdGE7CisgICAgICAgICpvcHVzSGVhZFNpemUgPSBkYXRhX3NpemU7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZSBpZiAobWVtY21wKEFPUFVTX0NTRF9NQVJLRVJfUFJFRklYLCBkYXRhLCBBT1BVU19DU0RfTUFSS0VSX1BSRUZJWF9TSVpFKSA9PSAwKSB7CisgICAgICAgIHNpemVfdCBpID0gMDsKKyAgICAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgICAgICB3aGlsZSAoaSA8PSBkYXRhX3NpemUgLSBBT1BVU19NQVJLRVJfU0laRSAtIEFPUFVTX0xFTkdUSF9TSVpFKSB7CisgICAgICAgICAgICB1aW50OF90ICpjc2RCdWYgPSAodWludDhfdCAqKWRhdGEgKyBpOworICAgICAgICAgICAgaWYgKCFtZW1jbXAoY3NkQnVmLCBBT1BVU19DU0RfT1BVU19IRUFERVJfTUFSS0VSLCBBT1BVU19NQVJLRVJfU0laRSkpIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCB2YWx1ZTsKKyAgICAgICAgICAgICAgICBtZW1jcHkoJnZhbHVlLCBjc2RCdWYgKyBBT1BVU19NQVJLRVJfU0laRSwgc2l6ZW9mKHZhbHVlKSk7CisgICAgICAgICAgICAgICAgaWYgKHZhbHVlIDwgQU9QVVNfT1BVU0hFQURfTUlOU0laRSB8fCB2YWx1ZSA+IEFPUFVTX09QVVNIRUFEX01BWFNJWkUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIlVuZXhwZWN0ZWQgc2l6ZSBmb3Igb3B1c0hlYWRTaXplICUiIFBSSXU2NCwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGkgKz0gQU9QVVNfTUFSS0VSX1NJWkUgKyBBT1BVU19MRU5HVEhfU0laRSArIHZhbHVlOworICAgICAgICAgICAgICAgIGlmIChpID4gZGF0YV9zaXplKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJNYXJrZXIgc2lnbmFscyBhIGhlYWRlciB0aGF0IGlzIGxhcmdlciB0aGFuIGlucHV0Iik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgKm9wdXNIZWFkQnVmID0gY3NkQnVmICsgQU9QVVNfTUFSS0VSX1NJWkUgKyBBT1BVU19MRU5HVEhfU0laRTsKKyAgICAgICAgICAgICAgICAqb3B1c0hlYWRTaXplID0gdmFsdWU7CisgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgfSBlbHNlIGlmICghbWVtY21wKGNzZEJ1ZiwgQU9QVVNfQ1NEX0NPREVDX0RFTEFZX01BUktFUiwgQU9QVVNfTUFSS0VSX1NJWkUpKSB7CisgICAgICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZ2YWx1ZSwgY3NkQnVmICsgQU9QVVNfTUFSS0VSX1NJWkUsIHNpemVvZih2YWx1ZSkpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBzaXplb2YodWludDY0X3QpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJVbmV4cGVjdGVkIHNpemUgZm9yIGNvZGVjRGVsYXkgJSIgUFJJdTY0LCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaSArPSBBT1BVU19NQVJLRVJfU0laRSArIEFPUFVTX0xFTkdUSF9TSVpFICsgdmFsdWU7CisgICAgICAgICAgICAgICAgaWYgKGkgPiBkYXRhX3NpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0QoIk1hcmtlciBzaWduYWxzIGEgaGVhZGVyIHRoYXQgaXMgbGFyZ2VyIHRoYW4gaW5wdXQiKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAqY29kZWNEZWxheUJ1ZiA9IGNzZEJ1ZiArIEFPUFVTX01BUktFUl9TSVpFICsgQU9QVVNfTEVOR1RIX1NJWkU7CisgICAgICAgICAgICAgICAgKmNvZGVjRGVsYXlTaXplID0gdmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFtZW1jbXAoY3NkQnVmLCBBT1BVU19DU0RfU0VFS19QUkVST0xMX01BUktFUiwgQU9QVVNfTUFSS0VSX1NJWkUpKSB7CisgICAgICAgICAgICAgICAgdWludDY0X3QgdmFsdWU7CisgICAgICAgICAgICAgICAgbWVtY3B5KCZ2YWx1ZSwgY3NkQnVmICsgQU9QVVNfTUFSS0VSX1NJWkUsIHNpemVvZih2YWx1ZSkpOworICAgICAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBzaXplb2YodWludDY0X3QpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dEKCJVbmV4cGVjdGVkIHNpemUgZm9yIHNlZWtQcmVSb2xsU2l6ZSAlIiBQUkl1NjQsIHZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpICs9IEFPUFVTX01BUktFUl9TSVpFICsgQU9QVVNfTEVOR1RIX1NJWkUgKyB2YWx1ZTsKKyAgICAgICAgICAgICAgICBpZiAoaSA+IGRhdGFfc2l6ZSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRCgiTWFya2VyIHNpZ25hbHMgYSBoZWFkZXIgdGhhdCBpcyBsYXJnZXIgdGhhbiBpbnB1dCIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICpzZWVrUHJlUm9sbEJ1ZiA9IGNzZEJ1ZiArIEFPUFVTX01BUktFUl9TSVpFICsgQU9QVVNfTEVOR1RIX1NJWkU7CisgICAgICAgICAgICAgICAgKnNlZWtQcmVSb2xsU2l6ZSA9IHZhbHVlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZvdW5kOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIGl0IGlzbid0IGluIGVpdGhlciBmb3JtYXQKKyAgICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL1BhcnNlZE1lc3NhZ2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9QYXJzZWRNZXNzYWdlLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ5YzlhZC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL1BhcnNlZE1lc3NhZ2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMzAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMiwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlICJQYXJzZWRNZXNzYWdlLmgiCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gc3RhdGljCi1zcDxQYXJzZWRNZXNzYWdlPiBQYXJzZWRNZXNzYWdlOjpQYXJzZSgKLSAgICAgICAgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IHNpemUsIGJvb2wgbm9Nb3JlRGF0YSwgc2l6ZV90ICpsZW5ndGgpIHsKLSAgICBzcDxQYXJzZWRNZXNzYWdlPiBtc2cgPSBuZXcgUGFyc2VkTWVzc2FnZTsKLSAgICBzc2l6ZV90IHJlcyA9IG1zZy0+cGFyc2UoZGF0YSwgc2l6ZSwgbm9Nb3JlRGF0YSk7Ci0KLSAgICBpZiAocmVzIDwgMCkgewotICAgICAgICAqbGVuZ3RoID0gMDsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgKmxlbmd0aCA9IHJlczsKLSAgICByZXR1cm4gbXNnOwotfQotCi1QYXJzZWRNZXNzYWdlOjpQYXJzZWRNZXNzYWdlKCkgewotfQotCi1QYXJzZWRNZXNzYWdlOjp+UGFyc2VkTWVzc2FnZSgpIHsKLX0KLQotYm9vbCBQYXJzZWRNZXNzYWdlOjpmaW5kU3RyaW5nKGNvbnN0IGNoYXIgKm5hbWUsIEFTdHJpbmcgKnZhbHVlKSBjb25zdCB7Ci0gICAgQVN0cmluZyBrZXkgPSBuYW1lOwotICAgIGtleS50b2xvd2VyKCk7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbURpY3QuaW5kZXhPZktleShrZXkpOwotCi0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICB2YWx1ZS0+Y2xlYXIoKTsKLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgKnZhbHVlID0gbURpY3QudmFsdWVBdChpbmRleCk7Ci0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUGFyc2VkTWVzc2FnZTo6ZmluZEludDMyKGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKnZhbHVlKSBjb25zdCB7Ci0gICAgQVN0cmluZyBzdHJpbmdWYWx1ZTsKLQotICAgIGlmICghZmluZFN0cmluZyhuYW1lLCAmc3RyaW5nVmFsdWUpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjaGFyICplbmQ7Ci0gICAgKnZhbHVlID0gc3RydG9sKHN0cmluZ1ZhbHVlLmNfc3RyKCksICZlbmQsIDEwKTsKLQotICAgIGlmIChlbmQgPT0gc3RyaW5nVmFsdWUuY19zdHIoKSB8fCAqZW5kICE9ICdcMCcpIHsKLSAgICAgICAgKnZhbHVlID0gMDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBjaGFyICpQYXJzZWRNZXNzYWdlOjpnZXRDb250ZW50KCkgY29uc3QgewotICAgIHJldHVybiBtQ29udGVudC5jX3N0cigpOwotfQotCi1zc2l6ZV90IFBhcnNlZE1lc3NhZ2U6OnBhcnNlKGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplLCBib29sIG5vTW9yZURhdGEpIHsKLSAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBzc2l6ZV90IGxhc3REaWN0SW5kZXggPSAtMTsKLQotICAgIHNpemVfdCBvZmZzZXQgPSAwOwotICAgIGJvb2wgaGVhZGVyc0NvbXBsZXRlID0gZmFsc2U7Ci0gICAgd2hpbGUgKG9mZnNldCA8IHNpemUpIHsKLSAgICAgICAgc2l6ZV90IGxpbmVFbmRPZmZzZXQgPSBvZmZzZXQ7Ci0gICAgICAgIHdoaWxlIChsaW5lRW5kT2Zmc2V0ICsgMSA8IHNpemUKLSAgICAgICAgICAgICAgICAmJiAoZGF0YVtsaW5lRW5kT2Zmc2V0XSAhPSAnXHInCi0gICAgICAgICAgICAgICAgICAgICAgICB8fCBkYXRhW2xpbmVFbmRPZmZzZXQgKyAxXSAhPSAnXG4nKSkgewotICAgICAgICAgICAgKytsaW5lRW5kT2Zmc2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGxpbmVFbmRPZmZzZXQgKyAxID49IHNpemUpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIEFTdHJpbmcgbGluZSgmZGF0YVtvZmZzZXRdLCBsaW5lRW5kT2Zmc2V0IC0gb2Zmc2V0KTsKLQotICAgICAgICBpZiAob2Zmc2V0ID09IDApIHsKLSAgICAgICAgICAgIC8vIFNwZWNpYWwgaGFuZGxpbmcgZm9yIHRoZSByZXF1ZXN0L3N0YXR1cyBsaW5lLgotCi0gICAgICAgICAgICBtRGljdC5hZGQoQVN0cmluZygiXyIpLCBsaW5lKTsKLSAgICAgICAgICAgIG9mZnNldCA9IGxpbmVFbmRPZmZzZXQgKyAyOwotCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsaW5lRW5kT2Zmc2V0ID09IG9mZnNldCkgewotICAgICAgICAgICAgLy8gQW4gZW1wdHkgbGluZSBzZXBhcmF0ZXMgaGVhZGVycyBmcm9tIGJvZHkuCi0gICAgICAgICAgICBoZWFkZXJzQ29tcGxldGUgPSB0cnVlOwotICAgICAgICAgICAgb2Zmc2V0ICs9IDI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChsaW5lLmNfc3RyKClbMF0gPT0gJyAnIHx8IGxpbmUuY19zdHIoKVswXSA9PSAnXHQnKSB7Ci0gICAgICAgICAgICAvLyBTdXBwb3J0IGZvciBmb2xkZWQgaGVhZGVyIHZhbHVlcy4KLQotICAgICAgICAgICAgaWYgKGxhc3REaWN0SW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBpdCdzIG1hbGZvcm1lZCBzaW5jZSB0aGUgZmlyc3QgaGVhZGVyIGxpbmUKLSAgICAgICAgICAgICAgICAvLyBjYW5ub3QgY29udGludWUgYW55dGhpbmcuLi4KLQotICAgICAgICAgICAgICAgIEFTdHJpbmcgJnZhbHVlID0gbURpY3QuZWRpdFZhbHVlQXQobGFzdERpY3RJbmRleCk7Ci0gICAgICAgICAgICAgICAgdmFsdWUuYXBwZW5kKGxpbmUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBvZmZzZXQgPSBsaW5lRW5kT2Zmc2V0ICsgMjsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3NpemVfdCBjb2xvblBvcyA9IGxpbmUuZmluZCgiOiIpOwotICAgICAgICBpZiAoY29sb25Qb3MgPj0gMCkgewotICAgICAgICAgICAgQVN0cmluZyBrZXkobGluZSwgMCwgY29sb25Qb3MpOwotICAgICAgICAgICAga2V5LnRyaW0oKTsKLSAgICAgICAgICAgIGtleS50b2xvd2VyKCk7Ci0KLSAgICAgICAgICAgIGxpbmUuZXJhc2UoMCwgY29sb25Qb3MgKyAxKTsKLQotICAgICAgICAgICAgbGFzdERpY3RJbmRleCA9IG1EaWN0LmFkZChrZXksIGxpbmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgb2Zmc2V0ID0gbGluZUVuZE9mZnNldCArIDI7Ci0gICAgfQotCi0gICAgaWYgKCFoZWFkZXJzQ29tcGxldGUgJiYgKCFub01vcmVEYXRhIHx8IG9mZnNldCA9PSAwKSkgewotICAgICAgICAvLyBXZSBlaXRoZXIgc2F3IHRoZSBlbXB0eSBsaW5lIHNlcGFyYXRpbmcgaGVhZGVycyBmcm9tIGJvZHkKLSAgICAgICAgLy8gb3Igd2Ugc2F3IGF0IGxlYXN0IHRoZSBzdGF0dXMgbGluZSBhbmQga25vdyB0aGF0IG5vIG1vcmUgZGF0YQotICAgICAgICAvLyBpcyBnb2luZyB0byBmb2xsb3cuCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EaWN0LnNpemUoKTsgKytpKSB7Ci0gICAgICAgIG1EaWN0LmVkaXRWYWx1ZUF0KGkpLnRyaW0oKTsKLSAgICB9Ci0KLSAgICBpbnQzMl90IGNvbnRlbnRMZW5ndGg7Ci0gICAgaWYgKCFmaW5kSW50MzIoImNvbnRlbnQtbGVuZ3RoIiwgJmNvbnRlbnRMZW5ndGgpIHx8IGNvbnRlbnRMZW5ndGggPCAwKSB7Ci0gICAgICAgIGNvbnRlbnRMZW5ndGggPSAwOwotICAgIH0KLQotICAgIHNpemVfdCB0b3RhbExlbmd0aCA9IG9mZnNldCArIGNvbnRlbnRMZW5ndGg7Ci0KLSAgICBpZiAoc2l6ZSA8IHRvdGFsTGVuZ3RoKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBtQ29udGVudC5zZXRUbygmZGF0YVtvZmZzZXRdLCBjb250ZW50TGVuZ3RoKTsKLQotICAgIHJldHVybiB0b3RhbExlbmd0aDsKLX0KLQotYm9vbCBQYXJzZWRNZXNzYWdlOjpnZXRSZXF1ZXN0RmllbGQoc2l6ZV90IGluZGV4LCBBU3RyaW5nICpmaWVsZCkgY29uc3QgewotICAgIEFTdHJpbmcgbGluZTsKLSAgICBDSEVDSyhmaW5kU3RyaW5nKCJfIiwgJmxpbmUpKTsKLQotICAgIHNpemVfdCBwcmV2T2Zmc2V0ID0gMDsKLSAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8PSBpbmRleDsgKytpKSB7Ci0gICAgICAgIGlmIChvZmZzZXQgPj0gbGluZS5zaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHNzaXplX3Qgc3BhY2VQb3MgPSBsaW5lLmZpbmQoIiAiLCBvZmZzZXQpOwotCi0gICAgICAgIGlmIChzcGFjZVBvcyA8IDApIHsKLSAgICAgICAgICAgIHNwYWNlUG9zID0gbGluZS5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcmV2T2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgICBvZmZzZXQgPSBzcGFjZVBvcyArIDE7Ci0gICAgfQotCi0gICAgZmllbGQtPnNldFRvKGxpbmUsIHByZXZPZmZzZXQsIG9mZnNldCAtIHByZXZPZmZzZXQgLSAxKTsKLQotICAgIHJldHVybiB0cnVlOwotfQotCi1ib29sIFBhcnNlZE1lc3NhZ2U6OmdldFN0YXR1c0NvZGUoaW50MzJfdCAqc3RhdHVzQ29kZSkgY29uc3QgewotICAgIEFTdHJpbmcgc3RhdHVzQ29kZVN0cmluZzsKLSAgICBpZiAoIWdldFJlcXVlc3RGaWVsZCgxLCAmc3RhdHVzQ29kZVN0cmluZykpIHsKLSAgICAgICAgKnN0YXR1c0NvZGUgPSAwOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY2hhciAqZW5kOwotICAgICpzdGF0dXNDb2RlID0gc3RydG9sKHN0YXR1c0NvZGVTdHJpbmcuY19zdHIoKSwgJmVuZCwgMTApOwotCi0gICAgaWYgKCplbmQgIT0gJ1wwJyB8fCBlbmQgPT0gc3RhdHVzQ29kZVN0cmluZy5jX3N0cigpCi0gICAgICAgICAgICB8fCAoKnN0YXR1c0NvZGUpIDwgMTAwIHx8ICgqc3RhdHVzQ29kZSkgPiA5OTkpIHsKLSAgICAgICAgKnN0YXR1c0NvZGUgPSAwOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci19Ci0KLUFTdHJpbmcgUGFyc2VkTWVzc2FnZTo6ZGVidWdTdHJpbmcoKSBjb25zdCB7Ci0gICAgQVN0cmluZyBsaW5lOwotICAgIENIRUNLKGZpbmRTdHJpbmcoIl8iLCAmbGluZSkpOwotCi0gICAgbGluZS5hcHBlbmQoIlxuIik7Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EaWN0LnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGNvbnN0IEFTdHJpbmcgJmtleSA9IG1EaWN0LmtleUF0KGkpOwotICAgICAgICBjb25zdCBBU3RyaW5nICZ2YWx1ZSA9IG1EaWN0LnZhbHVlQXQoaSk7Ci0KLSAgICAgICAgaWYgKGtleSA9PSBBU3RyaW5nKCJfIikpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgbGluZS5hcHBlbmQoa2V5KTsKLSAgICAgICAgbGluZS5hcHBlbmQoIjogIik7Ci0gICAgICAgIGxpbmUuYXBwZW5kKHZhbHVlKTsKLSAgICAgICAgbGluZS5hcHBlbmQoIlxuIik7Ci0gICAgfQotCi0gICAgbGluZS5hcHBlbmQoIlxuIik7Ci0gICAgbGluZS5hcHBlbmQobUNvbnRlbnQpOwotCi0gICAgcmV0dXJuIGxpbmU7Ci19Ci0KLS8vIHN0YXRpYwotYm9vbCBQYXJzZWRNZXNzYWdlOjpHZXRBdHRyaWJ1dGUoCi0gICAgICAgIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmtleSwgQVN0cmluZyAqdmFsdWUpIHsKLSAgICB2YWx1ZS0+Y2xlYXIoKTsKLQotICAgIHNpemVfdCBrZXlMZW4gPSBzdHJsZW4oa2V5KTsKLQotICAgIGZvciAoOzspIHsKLSAgICAgICAgd2hpbGUgKGlzc3BhY2UoKnMpKSB7Ci0gICAgICAgICAgICArK3M7Ci0gICAgICAgIH0KLQotICAgICAgICBjb25zdCBjaGFyICpjb2xvblBvcyA9IHN0cmNocihzLCAnOycpOwotCi0gICAgICAgIHNpemVfdCBsZW4gPQotICAgICAgICAgICAgKGNvbG9uUG9zID09IE5VTEwpID8gc3RybGVuKHMpIDogY29sb25Qb3MgLSBzOwotCi0gICAgICAgIGlmIChsZW4gPj0ga2V5TGVuICsgMSAmJiBzW2tleUxlbl0gPT0gJz0nICYmICFzdHJuY21wKHMsIGtleSwga2V5TGVuKSkgewotICAgICAgICAgICAgdmFsdWUtPnNldFRvKCZzW2tleUxlbiArIDFdLCBsZW4gLSBrZXlMZW4gLSAxKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGNvbG9uUG9zID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHMgPSBjb2xvblBvcyArIDE7Ci0gICAgfQotfQotCi0vLyBzdGF0aWMKLWJvb2wgUGFyc2VkTWVzc2FnZTo6R2V0SW50MzJBdHRyaWJ1dGUoCi0gICAgICAgIGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmtleSwgaW50MzJfdCAqdmFsdWUpIHsKLSAgICBBU3RyaW5nIHN0cmluZ1ZhbHVlOwotICAgIGlmICghR2V0QXR0cmlidXRlKHMsIGtleSwgJnN0cmluZ1ZhbHVlKSkgewotICAgICAgICAqdmFsdWUgPSAwOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY2hhciAqZW5kOwotICAgICp2YWx1ZSA9IHN0cnRvbChzdHJpbmdWYWx1ZS5jX3N0cigpLCAmZW5kLCAxMCk7Ci0KLSAgICBpZiAoZW5kID09IHN0cmluZ1ZhbHVlLmNfc3RyKCkgfHwgKmVuZCAhPSAnXDAnKSB7Ci0gICAgICAgICp2YWx1ZSA9IDA7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9URVNUX01BUFBJTkcgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzAxYzRiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9URVNUX01BUFBJTkcKQEAgLTAsMCArMSw1IEBACit7CisgICJwcmVzdWJtaXQiOiBbCisgICAgeyAibmFtZSI6ICJzZl9mb3VuZGF0aW9uX3Rlc3QiIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuY3BwCmluZGV4IDhmMzI1ODIuLjgzNGI4OGYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5jcHAKQEAgLTI4LDE0ICsyOCwzMSBAQAogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKKyAgICBzaXplX3QgYnVmU2l6ZSA9IG4gLyA0ICogMzsKKyAgICBzcDxBQnVmZmVyPiBidWYgPSBuZXcgQUJ1ZmZlcihidWZTaXplKTsKKworICAgIGlmIChkZWNvZGVCYXNlNjQoYnVmLT5kYXRhKCksICZidWZTaXplLCBzLmNfc3RyKCkpKSB7CisgICAgICAgIGJ1Zi0+c2V0UmFuZ2UoMCwgYnVmU2l6ZSk7CisgICAgICAgIHJldHVybiBidWY7CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCitib29sIGRlY29kZUJhc2U2NCh1aW50OF90ICpvdXQsIHNpemVfdCAqaW5PdXRCdWZTaXplLCBjb25zdCBjaGFyKiBzKSB7CisgICAgc2l6ZV90IG4gPSBzdHJsZW4ocyk7CisKKyAgICBpZiAoKG4gJSA0KSAhPSAwKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBzaXplX3QgcGFkZGluZyA9IDA7Ci0gICAgaWYgKG4gPj0gMSAmJiBzLmNfc3RyKClbbiAtIDFdID09ICc9JykgeworICAgIGlmIChuID49IDEgJiYgc1tuIC0gMV0gPT0gJz0nKSB7CiAgICAgICAgIHBhZGRpbmcgPSAxOwogCi0gICAgICAgIGlmIChuID49IDIgJiYgcy5jX3N0cigpW24gLSAyXSA9PSAnPScpIHsKKyAgICAgICAgaWYgKG4gPj0gMiAmJiBzW24gLSAyXSA9PSAnPScpIHsKICAgICAgICAgICAgIHBhZGRpbmcgPSAyOwogCi0gICAgICAgICAgICBpZiAobiA+PSAzICYmIHMuY19zdHIoKVtuIC0gM10gPT0gJz0nKSB7CisgICAgICAgICAgICBpZiAobiA+PSAzICYmIHNbbiAtIDNdID09ICc9JykgewogICAgICAgICAgICAgICAgIHBhZGRpbmcgPSAzOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00NSwxNSArNjIsMTMgQEAKICAgICAvLyBhbHJlYWR5IG1hZGUgc3VyZSB0aGF0IG4gJSA0ID09IDAuCiAgICAgc2l6ZV90IG91dExlbiA9IChuIC8gNCkgKiAzIC0gcGFkZGluZzsKIAotICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKG91dExlbik7Ci0gICAgdWludDhfdCAqb3V0ID0gYnVmZmVyLT5kYXRhKCk7Ci0gICAgaWYgKG91dCA9PSBOVUxMIHx8IGJ1ZmZlci0+c2l6ZSgpIDwgb3V0TGVuKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOworICAgIGlmIChvdXQgPT0gTlVMTCB8fCAqaW5PdXRCdWZTaXplIDwgb3V0TGVuKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgc2l6ZV90IGogPSAwOwogICAgIHVpbnQzMl90IGFjY3VtID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG47ICsraSkgewotICAgICAgICBjaGFyIGMgPSBzLmNfc3RyKClbaV07CisgICAgICAgIGNoYXIgYyA9IHNbaV07CiAgICAgICAgIHVuc2lnbmVkIHZhbHVlOwogICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIHsKICAgICAgICAgICAgIHZhbHVlID0gYyAtICdBJzsKQEAgLTY2LDEwICs4MSwxMCBAQAogICAgICAgICB9IGVsc2UgaWYgKGMgPT0gJy8nIHx8IGMgPT0gJ18nKSB7CiAgICAgICAgICAgICB2YWx1ZSA9IDYzOwogICAgICAgICB9IGVsc2UgaWYgKGMgIT0gJz0nKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChpIDwgbiAtIHBhZGRpbmcpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIHZhbHVlID0gMDsKQEAgLTg2LDcgKzEwMSw4IEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gYnVmZmVyOworICAgICppbk91dEJ1ZlNpemUgPSBqOworICAgIHJldHVybiB0cnVlOwogfQogCiBzdGF0aWMgY2hhciBlbmNvZGU2Qml0KHVuc2lnbmVkIHgpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmgKaW5kZXggYThiODhmZC4uYWIxN2EwMiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmgKQEAgLTUzLDkgKzUzLDExIEBACiAjZGVmaW5lIExJVEVSQUxfVE9fU1RSSU5HX0lOVEVSTkFMKHgpICAgICN4CiAjZGVmaW5lIExJVEVSQUxfVE9fU1RSSU5HKHgpIExJVEVSQUxfVE9fU1RSSU5HX0lOVEVSTkFMKHgpCiAKLSNpZmRlZiBDSEVDSwotI3VuZGVmIENIRUNLCi0jZW5kaWYKKy8vIGFsbG93IHRvIHVzZSBDSEVDS19PUCBmcm9tIGFuZHJvaWQtYmFzZS9sb2dnaW5nLmgKKy8vIFRPRE86IGxvbmd0ZXJtIHJlcGxhY2UgdGhpcyB3aXRoIGFuZHJvaWQtYmFzZS9sb2dnaW5nLmgsIGJ1dCB0aGVyZSBhcmUgc29tZSBudWFuY2VzLCBlLmcuCisvLyBhbmRyb2lkLWJhc2UgQ0hFQ0tfT1AgcmVxdWlyZXMgYSBjb3B5IGNvbnN0cnVjdG9yLCB3aGVyZWFzIHdlIGRvbid0LgorI2lmbmRlZiBDSEVDS19PUAorCiAjZGVmaW5lIENIRUNLKGNvbmRpdGlvbikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgIShjb25kaXRpb24pLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC02MywxMCArNjUsNiBAQAogICAgICAgICAgICAgX19GSUxFX18gIjoiIExJVEVSQUxfVE9fU1RSSU5HKF9fTElORV9fKSAgICBcCiAgICAgICAgICAgICAiIENIRUNLKCIgI2NvbmRpdGlvbiAiKSBmYWlsZWQuIikKIAotI2lmZGVmIENIRUNLX09QCi0jdW5kZWYgQ0hFQ0tfT1AKLSNlbmRpZgotCiAjZGVmaW5lIENIRUNLX09QKHgseSxzdWZmaXgsb3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGNvbnN0IGF1dG8gJmEgPSB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC04MiwxNSArODAsNiBAQAogICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIH0gd2hpbGUgKGZhbHNlKQogCi0jaWZkZWYgQ0hFQ0tfRVEKLSN1bmRlZiBDSEVDS19FUQotI3VuZGVmIENIRUNLX05FCi0jdW5kZWYgQ0hFQ0tfTEUKLSN1bmRlZiBDSEVDS19MVAotI3VuZGVmIENIRUNLX0dFCi0jdW5kZWYgQ0hFQ0tfR1QKLSNlbmRpZgotCiAjZGVmaW5lIENIRUNLX0VRKHgseSkgICBDSEVDS19PUCh4LHksRVEsPT0pCiAjZGVmaW5lIENIRUNLX05FKHgseSkgICBDSEVDS19PUCh4LHksTkUsIT0pCiAjZGVmaW5lIENIRUNLX0xFKHgseSkgICBDSEVDS19PUCh4LHksTEUsPD0pCkBAIC05OCw2ICs4Nyw4IEBACiAjZGVmaW5lIENIRUNLX0dFKHgseSkgICBDSEVDS19PUCh4LHksR0UsPj0pCiAjZGVmaW5lIENIRUNLX0dUKHgseSkgICBDSEVDS19PUCh4LHksR1QsPikKIAorI2VuZGlmCisKICNkZWZpbmUgVFJFU1BBU1MoLi4uKSBcCiAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgX19GSUxFX18gIjoiIExJVEVSQUxfVE9fU1RSSU5HKF9fTElORV9fKSAgICAgICAgICAgIFwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FOZXR3b3JrU2Vzc2lvbi5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkM2ViYWEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU5ldHdvcmtTZXNzaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBBX05FVFdPUktfU0VTU0lPTl9IXwotCi0jZGVmaW5lIEFfTkVUV09SS19TRVNTSU9OX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvVGhyZWFkLmg+Ci0KLSNpbmNsdWRlIDxuZXRpbmV0L2luLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEFNZXNzYWdlOwotCi0vLyBIZWxwZXIgY2xhc3MgdG8gbWFuYWdlIGEgbnVtYmVyIG9mIGxpdmUgc29ja2V0cyAoZGF0YWdyYW0gYW5kIHN0cmVhbS1iYXNlZCkKLS8vIG9uIGEgc2luZ2xlIHRocmVhZC4gQ2xpZW50cyBhcmUgbm90aWZpZWQgYWJvdXQgYWN0aXZpdHkgdGhyb3VnaCBBTWVzc2FnZXMuCi1zdHJ1Y3QgQU5ldHdvcmtTZXNzaW9uIDogcHVibGljIFJlZkJhc2UgewotICAgIEFOZXR3b3JrU2Vzc2lvbigpOwotCi0gICAgc3RhdHVzX3Qgc3RhcnQoKTsKLSAgICBzdGF0dXNfdCBzdG9wKCk7Ci0KLSAgICBzdGF0dXNfdCBjcmVhdGVSVFNQQ2xpZW50KAotICAgICAgICAgICAgY29uc3QgY2hhciAqaG9zdCwgdW5zaWduZWQgcG9ydCwgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksCi0gICAgICAgICAgICBpbnQzMl90ICpzZXNzaW9uSUQpOwotCi0gICAgc3RhdHVzX3QgY3JlYXRlUlRTUFNlcnZlcigKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICZhZGRyLCB1bnNpZ25lZCBwb3J0LAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGludDMyX3QgKnNlc3Npb25JRCk7Ci0KLSAgICBzdGF0dXNfdCBjcmVhdGVVRFBTZXNzaW9uKAotICAgICAgICAgICAgdW5zaWduZWQgbG9jYWxQb3J0LCBjb25zdCBzcDxBTWVzc2FnZT4gJm5vdGlmeSwgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIHN0YXR1c190IGNyZWF0ZVVEUFNlc3Npb24oCi0gICAgICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsCi0gICAgICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICAgICAgdW5zaWduZWQgcmVtb3RlUG9ydCwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIHN0YXR1c190IGNvbm5lY3RVRFBTZXNzaW9uKAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IGNoYXIgKnJlbW90ZUhvc3QsIHVuc2lnbmVkIHJlbW90ZVBvcnQpOwotCi0gICAgLy8gcGFzc2l2ZQotICAgIHN0YXR1c190IGNyZWF0ZVRDUERhdGFncmFtU2Vzc2lvbigKLSAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBpbl9hZGRyICZhZGRyLCB1bnNpZ25lZCBwb3J0LAotICAgICAgICAgICAgY29uc3Qgc3A8QU1lc3NhZ2U+ICZub3RpZnksIGludDMyX3QgKnNlc3Npb25JRCk7Ci0KLSAgICAvLyBhY3RpdmUKLSAgICBzdGF0dXNfdCBjcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb24oCi0gICAgICAgICAgICB1bnNpZ25lZCBsb2NhbFBvcnQsCi0gICAgICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICAgICAgdW5zaWduZWQgcmVtb3RlUG9ydCwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIHN0YXR1c190IGRlc3Ryb3lTZXNzaW9uKGludDMyX3Qgc2Vzc2lvbklEKTsKLQotICAgIHN0YXR1c190IHNlbmRSZXF1ZXN0KAotICAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSUQsIGNvbnN0IHZvaWQgKmRhdGEsIHNzaXplX3Qgc2l6ZSA9IC0xLAotICAgICAgICAgICAgYm9vbCB0aW1lVmFsaWQgPSBmYWxzZSwgaW50NjRfdCB0aW1lVXMgPSAtMWxsKTsKLQotICAgIHN0YXR1c190IHN3aXRjaFRvV2ViU29ja2V0TW9kZShpbnQzMl90IHNlc3Npb25JRCk7Ci0KLSAgICBlbnVtIE5vdGlmaWNhdGlvblJlYXNvbiB7Ci0gICAgICAgIGtXaGF0RXJyb3IsCi0gICAgICAgIGtXaGF0Q29ubmVjdGVkLAotICAgICAgICBrV2hhdENsaWVudENvbm5lY3RlZCwKLSAgICAgICAga1doYXREYXRhLAotICAgICAgICBrV2hhdERhdGFncmFtLAotICAgICAgICBrV2hhdEJpbmFyeURhdGEsCi0gICAgICAgIGtXaGF0V2ViU29ja2V0TWVzc2FnZSwKLSAgICAgICAga1doYXROZXR3b3JrU3RhbGwsCi0gICAgfTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkFOZXR3b3JrU2Vzc2lvbigpOwotCi1wcml2YXRlOgotICAgIHN0cnVjdCBOZXR3b3JrVGhyZWFkOwotICAgIHN0cnVjdCBTZXNzaW9uOwotCi0gICAgTXV0ZXggbUxvY2s7Ci0gICAgc3A8VGhyZWFkPiBtVGhyZWFkOwotCi0gICAgaW50MzJfdCBtTmV4dFNlc3Npb25JRDsKLQotICAgIGludCBtUGlwZUZkWzJdOwotCi0gICAgS2V5ZWRWZWN0b3I8aW50MzJfdCwgc3A8U2Vzc2lvbj4gPiBtU2Vzc2lvbnM7Ci0KLSAgICBlbnVtIE1vZGUgewotICAgICAgICBrTW9kZUNyZWF0ZVVEUFNlc3Npb24sCi0gICAgICAgIGtNb2RlQ3JlYXRlVENQRGF0YWdyYW1TZXNzaW9uUGFzc2l2ZSwKLSAgICAgICAga01vZGVDcmVhdGVUQ1BEYXRhZ3JhbVNlc3Npb25BY3RpdmUsCi0gICAgICAgIGtNb2RlQ3JlYXRlUlRTUFNlcnZlciwKLSAgICAgICAga01vZGVDcmVhdGVSVFNQQ2xpZW50LAotICAgIH07Ci0gICAgc3RhdHVzX3QgY3JlYXRlQ2xpZW50T3JTZXJ2ZXIoCi0gICAgICAgICAgICBNb2RlIG1vZGUsCi0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqYWRkciwKLSAgICAgICAgICAgIHVuc2lnbmVkIHBvcnQsCi0gICAgICAgICAgICBjb25zdCBjaGFyICpyZW1vdGVIb3N0LAotICAgICAgICAgICAgdW5zaWduZWQgcmVtb3RlUG9ydCwKLSAgICAgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiAmbm90aWZ5LAotICAgICAgICAgICAgaW50MzJfdCAqc2Vzc2lvbklEKTsKLQotICAgIHZvaWQgdGhyZWFkTG9vcCgpOwotICAgIHZvaWQgaW50ZXJydXB0KCk7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgTWFrZVNvY2tldE5vbkJsb2NraW5nKGludCBzKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFOZXR3b3JrU2Vzc2lvbik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFfTkVUV09SS19TRVNTSU9OX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0F1ZGlvUHJlc2VudGF0aW9uSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZDRkOWYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaApAQCAtMCwwICsxLDY4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBVURJT19QUkVTRU5UQVRJT05fSU5GT19IXworI2RlZmluZSBBVURJT19QUkVTRU5UQVRJT05fSU5GT19IXworCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworZW51bSBBdWRpb1ByZXNlbnRhdGlvblZlcnNpb24geworICAgIFBSRVNFTlRBVElPTl9WRVJTSU9OX1VOREVGSU5FRCA9IDAsCisgICAgUFJFU0VOVEFUSU9OX1ZFUlNJT05fMSwKK307CisKK2VudW0gTWFzdGVyaW5nSW5kaWNhdGlvbiB7CisgICAgTUFTVEVSSU5HX05PVF9JTkRJQ0FURUQsCisgICAgTUFTVEVSRURfRk9SX1NURVJFTywKKyAgICBNQVNURVJFRF9GT1JfU1VSUk9VTkQsCisgICAgTUFTVEVSRURfRk9SXzNELAorICAgIE1BU1RFUkVEX0ZPUl9IRUFEUEhPTkUsCit9OworCitzdHJ1Y3QgQXVkaW9QcmVzZW50YXRpb24geworICAgIHVpbnQzMl90IG1WZXJzaW9uID0gUFJFU0VOVEFUSU9OX1ZFUlNJT05fVU5ERUZJTkVEOworICAgIGludDMyX3QgbVByZXNlbnRhdGlvbklkID0gLTE7CisgICAgaW50MzJfdCBtUHJvZ3JhbUlkID0gLTE7CisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBtTGFiZWxzOworICAgIHN0ZDo6c3RyaW5nIG1MYW5ndWFnZTsKKyAgICBNYXN0ZXJpbmdJbmRpY2F0aW9uIG1NYXN0ZXJpbmdJbmRpY2F0aW9uID0gTUFTVEVSSU5HX05PVF9JTkRJQ0FURUQ7CisgICAgYm9vbCBtQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSA9IGZhbHNlOworICAgIGJvb2wgbVNwb2tlblN1YnRpdGxlc0F2YWlsYWJsZSA9IGZhbHNlOworICAgIGJvb2wgbURpYWxvZ3VlRW5oYW5jZW1lbnRBdmFpbGFibGUgPSBmYWxzZTsKK307CisKK3N0cnVjdCBBdWRpb1ByZXNlbnRhdGlvblYxIDogcHVibGljIEF1ZGlvUHJlc2VudGF0aW9uIHsKKyAgICBBdWRpb1ByZXNlbnRhdGlvblYxKCkgeworICAgICAgICBtVmVyc2lvbiA9IFBSRVNFTlRBVElPTl9WRVJTSU9OXzE7CisgICAgfQorfTsKKwordHlwZWRlZiBzdGQ6OnZlY3RvcjxBdWRpb1ByZXNlbnRhdGlvbj4gQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uOworCit2b2lkIHNlcmlhbGl6ZUF1ZGlvUHJlc2VudGF0aW9ucyhjb25zdCBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24mIHByZXNlbnRhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6b3N0cmVhbSogc2VyaWFsaXplZE91dHB1dCk7CitzdGF0dXNfdCBkZXNlcmlhbGl6ZUF1ZGlvUHJlc2VudGF0aW9ucyhzdGQ6OmlzdHJlYW0qIHNlcmlhbGl6ZWRJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiAqcHJlc2VudGF0aW9ucyk7Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFVRElPX1BSRVNFTlRBVElPTl9JTkZPX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmgKaW5kZXggZDZjNzY4ZC4uY2QwYWYyYiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0NvbG9yVXRpbHMuaApAQCAtMjcsNiArMjcsOCBAQAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2dyYXBoaWNzLmg+CiAKK3N0cnVjdCBBTWVkaWFGb3JtYXQ7CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RydWN0IENvbG9yVXRpbHMgewpAQCAtMTM1LDYgKzEzNyw5IEBACiAgICAgc3RhdGljIHZvaWQgY29udmVydElzb0NvbG9yQXNwZWN0c1RvQ29kZWNBc3BlY3RzKAogICAgICAgICAgICAgaW50MzJfdCBwcmltYXJpZXMsIGludDMyX3QgdHJhbnNmZXIsIGludDMyX3QgY29lZmZzLCBib29sIGZ1bGxSYW5nZSwKICAgICAgICAgICAgIENvbG9yQXNwZWN0cyAmYXNwZWN0cyk7CisgICAgc3RhdGljIHZvaWQgY29udmVydElzb0NvbG9yQXNwZWN0c1RvUGxhdGZvcm1Bc3BlY3RzKAorICAgICAgICBpbnQzMl90IHByaW1hcmllcywgaW50MzJfdCBpc290cmFuc2ZlciwgaW50MzJfdCBjb2VmZnMsIGJvb2wgZnVsbFJhbmdlLAorICAgICAgICBpbnQzMl90ICpyYW5nZSwgaW50MzJfdCAqc3RhbmRhcmQsIGludDMyX3QgKnRyYW5zZmVyKTsKIAogICAgIC8vIHVucGFjayBhIHVpbnQzMl90IHRvIGEgZnVsbCBDb2xvckFzcGVjdHMgc3RydWN0CiAgICAgc3RhdGljIENvbG9yQXNwZWN0cyB1bnBhY2tUb0NvbG9yQXNwZWN0cyh1aW50MzJfdCBwYWNrZWQpOwpAQCAtMTgwLDYgKzE4NSw4IEBACiAKICAgICAvLyB3cml0ZXMgfGluZm98IGludG8gZm9ybWF0LgogICAgIHN0YXRpYyB2b2lkIHNldEhEUlN0YXRpY0luZm9JbnRvRm9ybWF0KGNvbnN0IEhEUlN0YXRpY0luZm8gJmluZm8sIHNwPEFNZXNzYWdlPiAmZm9ybWF0KTsKKyAgICAvLyB3cml0ZXMgfGluZm98IGludG8gZm9ybWF0LgorICAgIHN0YXRpYyB2b2lkIHNldEhEUlN0YXRpY0luZm9JbnRvQU1lZGlhRm9ybWF0KGNvbnN0IEhEUlN0YXRpY0luZm8gJmluZm8sIEFNZWRpYUZvcm1hdCAqZm9ybWF0KTsKIH07CiAKIGlubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmcoYW5kcm9pZDo6Q29sb3JVdGlsczo6Q29sb3JTdGFuZGFyZCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oCmluZGV4IDU4NzU4YmMuLjFmOWU2MzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL01lZGlhRGVmcy5oCkBAIC0yNSw2ICsyNSw3IEBACiAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19WUDg7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fVlA5OworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0FWMTsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19BVkM7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQzsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19NUEVHNDsKQEAgLTMzLDYgKzM0LDEwIEBACiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fUkFXOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTjsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19TQ1JBTUJMRUQ7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfVklERU9fRElWWDsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19ESVZYMzsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9WSURFT19YVklEOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX1ZJREVPX01KUEVHOwogCiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX05COwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0FNUl9XQjsKQEAgLTUyLDggKzU3LDE0IEBACiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fTVNHU007CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUMzOwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX0VBQzM7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDM19KT0M7CitleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0OwogZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1NDUkFNQkxFRDsKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19BTEFDOworZXh0ZXJuIGNvbnN0IGNoYXIgKk1FRElBX01JTUVUWVBFX0FVRElPX1dNQTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19NU19BRFBDTTsKK2V4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9BVURJT19EVklfSU1BX0FEUENNOworCiAKIGV4dGVybiBjb25zdCBjaGFyICpNRURJQV9NSU1FVFlQRV9DT05UQUlORVJfTVBFRzQ7CiBleHRlcm4gY29uc3QgY2hhciAqTUVESUFfTUlNRVRZUEVfQ09OVEFJTkVSX1dBVjsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL09wdXNIZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTAzN2FmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvKgorICogVGhlIE9wdXMgc3BlY2lmaWNhdGlvbiBpcyBwYXJ0IG9mIElFVEYgUkZDIDY3MTY6CisgKiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM2NzE2CisgKi8KKworI2lmbmRlZiBPUFVTX0hFQURFUl9IXworI2RlZmluZSBPUFVTX0hFQURFUl9IXworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qIENvbnN0YW50cyB1c2VkIGZvciBkZWxpbWl0aW5nIE9wdXMgQ1NEICovCisjZGVmaW5lIEFPUFVTX0NTRF9NQVJLRVJfUFJFRklYICJBT1BVUyIKKyNkZWZpbmUgQU9QVVNfQ1NEX01BUktFUl9QUkVGSVhfU0laRSAoc2l6ZW9mKEFPUFVTX0NTRF9NQVJLRVJfUFJFRklYKSAtIDEpCisjZGVmaW5lIEFPUFVTX0NTRF9PUFVTX0hFQURFUl9NQVJLRVIgQU9QVVNfQ1NEX01BUktFUl9QUkVGSVggIkhEUiIKKyNkZWZpbmUgQU9QVVNfQ1NEX0NPREVDX0RFTEFZX01BUktFUiBBT1BVU19DU0RfTUFSS0VSX1BSRUZJWCAiRExZIgorI2RlZmluZSBBT1BVU19DU0RfU0VFS19QUkVST0xMX01BUktFUiBBT1BVU19DU0RfTUFSS0VSX1BSRUZJWCAiUFJMIgorI2RlZmluZSBBT1BVU19NQVJLRVJfU0laRSA4CisjZGVmaW5lIEFPUFVTX0xFTkdUSF9TSVpFIHNpemVvZih1aW50NjRfdCkKKyNkZWZpbmUgQU9QVVNfQ1NEX0NPREVDX0RFTEFZX1NJWkUgXAorICAgICAoQU9QVVNfTUFSS0VSX1NJWkUpICsgKEFPUFVTX0xFTkdUSF9TSVpFKSArIHNpemVvZih1aW50NjRfdCkKKyNkZWZpbmUgQU9QVVNfQ1NEX1NFRUtfUFJFUk9MTF9TSVpFIFwKKyAgICAgKEFPUFVTX01BUktFUl9TSVpFKSArIChBT1BVU19MRU5HVEhfU0laRSkgKyBzaXplb2YodWludDY0X3QpCisKKy8qIE9wdXNIZWFkIGNzZCBtaW5pbXVtIHNpemUgaXMgMTkgKi8KKyNkZWZpbmUgQU9QVVNfT1BVU0hFQURfTUlOU0laRSAxOQorI2RlZmluZSBBT1BVU19DU0RfT1BVU0hFQURfTUlOU0laRSBcCisgICAgKEFPUFVTX01BUktFUl9TSVpFKSArIChBT1BVU19MRU5HVEhfU0laRSkgKyAoQU9QVVNfT1BVU0hFQURfTUlOU0laRSkKKworI2RlZmluZSBBT1BVU19VTklGSUVEX0NTRF9NSU5TSVpFIFwKKyAgICAoKEFPUFVTX0NTRF9PUFVTSEVBRF9NSU5TSVpFKSArIFwKKyAgICAgKEFPUFVTX0NTRF9DT0RFQ19ERUxBWV9TSVpFKSArIFwKKyAgICAgKEFPUFVTX0NTRF9TRUVLX1BSRVJPTExfU0laRSkpCisKKy8qIE9wdXNIZWFkIGNzZCBhdCBtYXggY2FuIGJlIEFPUFVTX0NTRF9PUFVTSEVBRF9NSU5TSVpFICsgMiArIG1heCBudW1iZXIgb2YgY2hhbm5lbHMgKDI1NSkgKi8KKyNkZWZpbmUgQU9QVVNfT1BVU0hFQURfTUFYU0laRSAoKEFPUFVTX09QVVNIRUFEX01JTlNJWkUpICsgMiArIDI1NSkKKyNkZWZpbmUgQU9QVVNfQ1NEX09QVVNIRUFEX01BWFNJWkUgXAorICAgIChBT1BVU19NQVJLRVJfU0laRSkgKyAoQU9QVVNfTEVOR1RIX1NJWkUpICsgKEFPUFVTX09QVVNIRUFEX01BWFNJWkUpCisKKyNkZWZpbmUgQU9QVVNfVU5JRklFRF9DU0RfTUFYU0laRSBcCisgICAgKChBT1BVU19DU0RfT1BVU0hFQURfTUFYU0laRSkgKyBcCisgICAgIChBT1BVU19DU0RfQ09ERUNfREVMQVlfU0laRSkgKyBcCisgICAgIChBT1BVU19DU0RfU0VFS19QUkVST0xMX1NJWkUpKQorCitzdHJ1Y3QgT3B1c0hlYWRlciB7CisgICAgaW50IGNoYW5uZWxzOworICAgIGludCBjaGFubmVsX21hcHBpbmc7CisgICAgaW50IG51bV9zdHJlYW1zOworICAgIGludCBudW1fY291cGxlZDsKKyAgICBpbnQxNl90IGdhaW5fZGI7CisgICAgaW50IHNraXBfc2FtcGxlczsKKyAgICB1aW50OF90IHN0cmVhbV9tYXBbOF07Cit9OworCitib29sIFBhcnNlT3B1c0hlYWRlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLCBPcHVzSGVhZGVyKiBoZWFkZXIpOworaW50IFdyaXRlT3B1c0hlYWRlcihjb25zdCBPcHVzSGVhZGVyICZoZWFkZXIsIGludCBpbnB1dF9zYW1wbGVfcmF0ZSwgdWludDhfdCogb3V0cHV0LCBzaXplX3Qgb3V0cHV0X3NpemUpOworYm9vbCBHZXRPcHVzSGVhZGVyQnVmZmVycyhjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3QgZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqb3B1c0hlYWRCdWYsIHNpemVfdCAqb3B1c0hlYWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICoqY29kZWNEZWxheUJ1Ziwgc2l6ZV90ICpjb2RlY0RlbGF5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnNlZWtQcmVSb2xsQnVmLCBzaXplX3QgKnNlZWtQcmVSb2xsU2l6ZSk7CitpbnQgV3JpdGVPcHVzSGVhZGVycyhjb25zdCBPcHVzSGVhZGVyICZoZWFkZXIsIGludCBpbnB1dFNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBvdXRwdXQsIHNpemVfdCBvdXRwdXRTaXplLCB1aW50NjRfdCBjb2RlY0RlbGF5LAorICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2Vla1ByZVJvbGwpOworYm9vbCBJc09wdXNIZWFkZXIoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSk7Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIE9QVVNfSEVBREVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9QYXJzZWRNZXNzYWdlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9QYXJzZWRNZXNzYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNDNhOTMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vUGFyc2VkTWVzc2FnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEyLCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FTdHJpbmcuaD4KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyBFbmNhcHN1bGF0ZXMgYW4gIkhUVFAvUlRTUCBzdHlsZSIgcmVzcG9uc2UsIGkuZS4gYSBzdGF0dXMgbGluZSwKLS8vIGtleS92YWx1ZSBwYWlycyBtYWtpbmcgdXAgdGhlIGhlYWRlcnMgYW5kIGFuIG9wdGlvbmFsIGJvZHkvY29udGVudC4KLXN0cnVjdCBQYXJzZWRNZXNzYWdlIDogcHVibGljIFJlZkJhc2UgewotICAgIHN0YXRpYyBzcDxQYXJzZWRNZXNzYWdlPiBQYXJzZSgKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplLCBib29sIG5vTW9yZURhdGEsIHNpemVfdCAqbGVuZ3RoKTsKLQotICAgIGJvb2wgZmluZFN0cmluZyhjb25zdCBjaGFyICpuYW1lLCBBU3RyaW5nICp2YWx1ZSkgY29uc3Q7Ci0gICAgYm9vbCBmaW5kSW50MzIoY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCAqdmFsdWUpIGNvbnN0OwotCi0gICAgY29uc3QgY2hhciAqZ2V0Q29udGVudCgpIGNvbnN0OwotCi0gICAgYm9vbCBnZXRSZXF1ZXN0RmllbGQoc2l6ZV90IGluZGV4LCBBU3RyaW5nICpmaWVsZCkgY29uc3Q7Ci0gICAgYm9vbCBnZXRTdGF0dXNDb2RlKGludDMyX3QgKnN0YXR1c0NvZGUpIGNvbnN0OwotCi0gICAgQVN0cmluZyBkZWJ1Z1N0cmluZygpIGNvbnN0OwotCi0gICAgc3RhdGljIGJvb2wgR2V0QXR0cmlidXRlKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmtleSwgQVN0cmluZyAqdmFsdWUpOwotCi0gICAgc3RhdGljIGJvb2wgR2V0SW50MzJBdHRyaWJ1dGUoCi0gICAgICAgICAgICBjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIGludDMyX3QgKnZhbHVlKTsKLQotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+UGFyc2VkTWVzc2FnZSgpOwotCi1wcml2YXRlOgotICAgIEtleWVkVmVjdG9yPEFTdHJpbmcsIEFTdHJpbmc+IG1EaWN0OwotICAgIEFTdHJpbmcgbUNvbnRlbnQ7Ci0KLSAgICBQYXJzZWRNZXNzYWdlKCk7Ci0KLSAgICBzc2l6ZV90IHBhcnNlKGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBzaXplLCBib29sIG5vTW9yZURhdGEpOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGFyc2VkTWVzc2FnZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vYmFzZTY0LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaAppbmRleCBhYmM5NWUwLi42MGZiOWZmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9iYXNlNjQuaApAQCAtMjYsNiArMjYsOSBAQAogc3RydWN0IEFTdHJpbmc7CiAKIHNwPEFCdWZmZXI+IGRlY29kZUJhc2U2NChjb25zdCBBU3RyaW5nICZzKTsKKworYm9vbCBkZWNvZGVCYXNlNjQodWludDhfdCAqb3V0LCBzaXplX3QgKmluT3V0QnVmU2l6ZSwgY29uc3QgY2hhciogcyk7CisKIHZvaWQgZW5jb2RlQmFzZTY0KGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLCBBU3RyaW5nICpvdXQpOwogCiB2b2lkIGVuY29kZUJhc2U2NFVybChjb25zdCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSwgQVN0cmluZyAqb3V0KTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NWU4MWU4Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTUgQEAKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJzZl9mb3VuZGF0aW9uX3Rlc3QiLAorICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJBRGF0YV90ZXN0LmNwcCIsCisgICAgICAgICJCYXNlNjRfdGVzdC5jcHAiLAorICAgICAgICAiRmxhZ2dlZF90ZXN0LmNwcCIsCisgICAgICAgICJUeXBlVHJhaXRzX3Rlc3QuY3BwIiwKKyAgICAgICAgIlV0aWxzX3Rlc3QuY3BwIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiTWV0YURhdGFCYXNlVW5pdFRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiTWV0YURhdGFCYXNlVW5pdFRlc3QuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQubWsgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZTNjNzYuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotIyBCdWlsZCB0aGUgdW5pdCB0ZXN0cy4KLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9BRERJVElPTkFMX0RFUEVOREVOQ0lFUyA6PSAkKExPQ0FMX1BBVEgpL0FuZHJvaWQubWsKLQotTE9DQUxfTU9EVUxFIDo9IHNmX2ZvdW5kYXRpb25fdGVzdAotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotCUFEYXRhX3Rlc3QuY3BwIFwKLQlCYXNlNjRfdGVzdC5jcHAgXAotCUZsYWdnZWRfdGVzdC5jcHAgXAotCVR5cGVUcmFpdHNfdGVzdC5jcHAgXAotCVV0aWxzX3Rlc3QuY3BwIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0JbGlibG9nIFwKLQlsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIFwKLQlsaWJ1dGlscyBcCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotCWZyYW1ld29ya3MvYXYvaW5jbHVkZSBcCi0KLUxPQ0FMX0NGTEFHUyArPSAtV2Vycm9yIC1XYWxsCi1MT0NBTF9DTEFORyA6PSB0cnVlCi0KLWluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKLQotIyBJbmNsdWRlIHN1YmRpcmVjdG9yeSBtYWtlZmlsZXMKLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSMgSWYgd2UncmUgYnVpbGRpbmcgd2l0aCBPTkVfU0hPVF9NQUtFRklMRSAobW0sIG1tbSksIHRoZW4gd2hhdCB0aGUgZnJhbWV3b3JrCi0jIHRlYW0gcmVhbGx5IHdhbnRzIGlzIHRvIGJ1aWxkIHRoZSBzdHVmZiBkZWZpbmVkIGJ5IHRoaXMgbWFrZWZpbGUuCi1pZmVxICgsJChPTkVfU0hPVF9NQUtFRklMRSkpCi1pbmNsdWRlICQoY2FsbCBmaXJzdC1tYWtlZmlsZXMtdW5kZXIsJChMT0NBTF9QQVRIKSkKLWVuZGlmCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL01ldGFEYXRhQmFzZVVuaXRUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvTWV0YURhdGFCYXNlVW5pdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhZWQ0ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL01ldGFEYXRhQmFzZVVuaXRUZXN0LmNwcApAQCAtMCwwICsxLDI4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmg+CisKK2NvbnN0ZXhwciBpbnQzMl90IGtXaWR0aDEgPSAxOTIwOworY29uc3RleHByIGludDMyX3Qga0hlaWdodDEgPSAxMDgwOworY29uc3RleHByIGludDMyX3Qga1dpZHRoMiA9IDEyODA7Citjb25zdGV4cHIgaW50MzJfdCBrSGVpZ2h0MiA9IDkyMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtXaWR0aDMgPSA3MjA7Citjb25zdGV4cHIgaW50MzJfdCBrSGVpZ2h0MyA9IDQ4MDsKK2NvbnN0ZXhwciBpbnQzMl90IGtQcm9maWxlID0gMTsKK2NvbnN0ZXhwciBpbnQzMl90IGtMZXZlbCA9IDE7Citjb25zdGV4cHIgaW50MzJfdCBrUGxhdGZvcm1WYWx1ZSA9IDE7CisKKy8vIFJlY3RhbmdsZSBtYXJnaW5zCitjb25zdGV4cHIgaW50MzJfdCBrTGVmdCA9IDEwMDsKK2NvbnN0ZXhwciBpbnQzMl90IGtUb3AgPSAxMDA7Citjb25zdGV4cHIgaW50MzJfdCBrUmlnaHQgPSAxMDA7Citjb25zdGV4cHIgaW50MzJfdCBrQm90dG9tID0gMTAwOworCitjb25zdGV4cHIgaW50NjRfdCBrRHVyYXRpb25VcyA9IDYwMDAwMDAwOworCitjb25zdGV4cHIgZmxvYXQga0NhcHR1cmVSYXRlID0gMzAuMDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZXRhRGF0YUJhc2VVbml0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3Qge307CisKK1RFU1RfRihNZXRhRGF0YUJhc2VVbml0VGVzdCwgQ3JlYXRlTWV0YURhdGFCYXNlVGVzdCkgeworICAgIE1ldGFEYXRhQmFzZSAqbWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCk7CisgICAgQVNTRVJUX05FKG1ldGFEYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhIGRhdGEiOworCisgICAgLy8gVGVzdGluZyBjb3B5IGNvbnN0cnVjdG9yCisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YUNvcHkgPSBtZXRhRGF0YTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGFDb3B5LCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhIGRhdGEgY29weSI7CisKKyAgICBkZWxldGUgbWV0YURhdGE7Cit9CisKK1RFU1RfRihNZXRhRGF0YUJhc2VVbml0VGVzdCwgU2V0QW5kRmluZERhdGFUZXN0KSB7CisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIG1ldGEgZGF0YSI7CisKKyAgICAvLyBTZXR0aW5nIHRoZSBkaWZmZXJlbnQga2V5LXZhbHVlIHBhaXIgdHlwZSBmb3IgZmlyc3QgdGltZSwgb3ZlcndyaXRlCisgICAgLy8gZXhwZWN0ZWQgdG8gYmUgZmFsc2UKKyAgICBib29sIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlNSU1FVHlwZSwgb3ZlcndyaXRlIGlzIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGtXaWR0aDEpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleVdpZHRoLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBrSGVpZ2h0MSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5SGVpZ2h0LCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5VmlkZW9Qcm9maWxlLCBrUHJvZmlsZSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5VmlkZW9Qcm9maWxlLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5VmlkZW9MZXZlbCwga0xldmVsKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlWaWRlb0xldmVsLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDY0KGtLZXlEdXJhdGlvbiwga0R1cmF0aW9uVXMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleUR1cmF0aW9uLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEZsb2F0KGtLZXlDYXB0dXJlRnJhbWVyYXRlLCBrQ2FwdHVyZVJhdGUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleUNhcHR1cmVGcmFtZXJhdGUsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBjb25zdCBpbnQzMl90ICpwbGF0Zm9ybSA9ICZrUGxhdGZvcm1WYWx1ZTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0UG9pbnRlcihrS2V5UGxhdGZvcm1Qcml2YXRlLCAodm9pZCAqKXBsYXRmb3JtKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlQbGF0Zm9ybVByaXZhdGUsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0UmVjdChrS2V5Q3JvcFJlY3QsIGtMZWZ0LCBrVG9wLCBrUmlnaHQsIGtCb3R0b20pOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleUNyb3BSZWN0LCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgLy8gRHVtcCB0byBsb2cgZm9yIHJlZmVyZW5jZQorICAgIG1ldGFEYXRhLT5kdW1wVG9Mb2coKTsKKworICAgIC8vIEZpbmQgdGhlIGRhdGEgd2hpY2ggd2FzIHNldAorICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgImtLZXlNSU1FVHlwZSBrZXkgZG9lcyBub3QgZXhpc3RzIGluIG1ldGFkYXRhIjsKKyAgICBBU1NFUlRfU1RSRVEobWltZSwgTUVESUFfTUlNRVRZUEVfVklERU9fQVZDKSA8PCAiSW5jb3JyZWN0IG1pbWUgdHlwZSByZXR1cm5lZCI7CisKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQsIHByb2ZpbGUsIGxldmVsOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVdpZHRoLCAmd2lkdGgpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgImtLZXlXaWR0aCBrZXkgZG9lcyBub3QgZXhpc3RzIGluIG1ldGFkYXRhIjsKKyAgICBBU1NFUlRfRVEod2lkdGgsIGtXaWR0aDEpIDw8ICJJbmNvcnJlY3QgdmFsdWUgb2Ygd2lkdGggcmV0dXJuZWQiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5SGVpZ2h0LCAmaGVpZ2h0KTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJrS2V5SGVpZ2h0IGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUShoZWlnaHQsIGtIZWlnaHQxKSA8PCAiSW5jb3JyZWN0IHZhbHVlIG9mIGhlaWdodCByZXR1cm5lZCI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsICZwcm9maWxlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJrS2V5VmlkZW9Qcm9maWxlIGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUShwcm9maWxlLCBrUHJvZmlsZSkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiBwcm9maWxlIHJldHVybmVkIjsKKworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kSW50MzIoa0tleVZpZGVvTGV2ZWwsICZsZXZlbCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleVZpZGVvTGV2ZWwga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGxldmVsLCBrTGV2ZWwpIDw8ICJJbmNvcnJlY3QgdmFsdWUgb2YgbGV2ZWwgcmV0dXJuZWQiOworCisgICAgaW50NjRfdCBkdXJhdGlvbjsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDY0KGtLZXlEdXJhdGlvbiwgJmR1cmF0aW9uKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJrS2V5RHVyYXRpb24ga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGR1cmF0aW9uLCBrRHVyYXRpb25VcykgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiBkdXJhdGlvbiByZXR1cm5lZCI7CisKKyAgICBmbG9hdCBmcmFtZVJhdGU7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRGbG9hdChrS2V5Q2FwdHVyZUZyYW1lcmF0ZSwgJmZyYW1lUmF0ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleUNhcHR1cmVGcmFtZXJhdGUga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGZyYW1lUmF0ZSwga0NhcHR1cmVSYXRlKSA8PCAiSW5jb3JyZWN0IHZhbHVlIG9mIGNhcHR1cmVGcmFtZVJhdGUgcmV0dXJuZWQiOworCisgICAgaW50MzJfdCB0b3AsIGJvdHRvbSwgbGVmdCwgcmlnaHQ7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRSZWN0KGtLZXlDcm9wUmVjdCwgJmxlZnQsICZ0b3AsICZyaWdodCwgJmJvdHRvbSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleUNyb3BSZWN0IGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUShsZWZ0LCBrTGVmdCkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiBsZWZ0IG1hcmdpbiByZXR1cm5lZCI7CisgICAgQVNTRVJUX0VRKHRvcCwga1RvcCkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiB0b3AgbWFyZ2luIHJldHVybmVkIjsKKyAgICBBU1NFUlRfRVEocmlnaHQsIGtSaWdodCkgPDwgIkluY29ycmVjdCB2YWx1ZSBvZiByaWdodCBtYXJnaW4gcmV0dXJuZWQiOworICAgIEFTU0VSVF9FUShib3R0b20sIGtCb3R0b20pIDw8ICJJbmNvcnJlY3QgdmFsdWUgb2YgYm90dG9tIG1hcmdpbiByZXR1cm5lZCI7CisKKyAgICB2b2lkICpwbGF0Zm9ybVZhbHVlOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5maW5kUG9pbnRlcihrS2V5UGxhdGZvcm1Qcml2YXRlLCAmcGxhdGZvcm1WYWx1ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleVBsYXRmb3JtUHJpdmF0ZSBrZXkgZG9lcyBub3QgZXhpc3RzIGluIG1ldGFkYXRhIjsKKyAgICBBU1NFUlRfRVEocGxhdGZvcm1WYWx1ZSwgJmtQbGF0Zm9ybVZhbHVlKSA8PCAiSW5jb3JyZWN0IHZhbHVlIG9mIHBvaW50ZXIgcmV0dXJuZWQiOworCisgICAgLy8gQ2hlY2sgZm9yIHRoZSBrZXkgd2hpY2ggaXMgbm90IGFkZGVkIHRvIG1ldGFkYXRhCisgICAgaW50MzJfdCBhbmdsZTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlSb3RhdGlvbiwgJmFuZ2xlKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiVmFsdWUgZm9yIGFuIGludmFsaWQga2V5IGlzIHJldHVybmVkIHdoZW4gdGhlIGtleSBpcyBub3Qgc2V0IjsKKworICAgIGRlbGV0ZSAobWV0YURhdGEpOworfQorCitURVNUX0YoTWV0YURhdGFCYXNlVW5pdFRlc3QsIE92ZXJXcml0ZUZ1bmN0aW9uYWxpdHlUZXN0KSB7CisgICAgTWV0YURhdGFCYXNlICptZXRhRGF0YSA9IG5ldyBNZXRhRGF0YUJhc2UoKTsKKyAgICBBU1NFUlRfTkUobWV0YURhdGEsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIG1ldGEgZGF0YSI7CisKKyAgICAvLyBzZXQvc2V0L3JlYWQgdG8gY2hlY2sgZmlyc3Qgb3ZlcndyaXRlIG9wZXJhdGlvbgorICAgIGJvb2wgc3RhdHVzID0gbWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleU1JTUVUeXBlLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIC8vIE92ZXJ3cml0ZSB0aGUgdmFsdWUKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIlNldHRpbmcga0tleU1JTUVUeXBlIGFnYWluLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgdHJ1ZSI7CisgICAgLy8gQ2hlY2sgdGhlIHZhbHVlCisgICAgY29uc3QgY2hhciAqbWltZTsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleU1JTUVUeXBlIGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9TVFJFUShtaW1lLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKSA8PCAiTWltZSB2YWx1ZSBpcyBub3Qgb3ZlcndyaXR0ZW4iOworCisgICAgLy8gc2V0L3NldC9zZXQvcmVhZCB0byBjaGVjayBzZWNvbmQgb3ZlcndyaXRlIG9wZXJhdGlvbgorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGtXaWR0aDEpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleVdpZHRoLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBrSGVpZ2h0MSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5SGVpZ2h0LCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIC8vIE92ZXJ3cml0ZSB0aGUgdmFsdWUKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBrV2lkdGgyKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJTZXR0aW5nIGtLZXlXaWR0aCBhZ2Fpbiwgb3ZlcndyaXRlIGlzIGV4cGVjdGVkIHRvIGJlIHRydWUiOworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5SGVpZ2h0LCBrSGVpZ2h0Mik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiU2V0dGluZyBrS2V5SGVpZ2h0IGFnYWluLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgdHJ1ZSI7CisgICAgLy8gT3ZlcndyaXRlIHRoZSB2YWx1ZSBhZ2FpbgorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5zZXRJbnQzMihrS2V5V2lkdGgsIGtXaWR0aDMpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIlNldHRpbmcga0tleVdpZHRoIGFnYWluLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgdHJ1ZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGtIZWlnaHQzKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJTZXR0aW5nIGtLZXlIZWlnaHQgYWdhaW4sIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSB0cnVlIjsKKyAgICAvLyBDaGVjayB0aGUgdmFsdWUKKyAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPmZpbmRJbnQzMihrS2V5V2lkdGgsICZ3aWR0aCk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAia0tleVdpZHRoIGtleSBkb2VzIG5vdCBleGlzdHMgaW4gbWV0YWRhdGEiOworICAgIEFTU0VSVF9FUSh3aWR0aCwga1dpZHRoMykgPDwgIlZhbHVlIG9mIHdpZHRoIGlzIG5vdCBvdmVyd3JpdHRlbiI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlIZWlnaHQsICZoZWlnaHQpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgImtLZXlIZWlnaHQga2V5IGRvZXMgbm90IGV4aXN0cyBpbiBtZXRhZGF0YSI7CisgICAgQVNTRVJUX0VRKGhlaWdodCwga0hlaWdodDMpIDw8ICJWYWx1ZSBvZiBoZWlnaHQgaXMgbm90IG92ZXJ3cml0dGVuIjsKKworICAgIGRlbGV0ZSAobWV0YURhdGEpOworfQorCitURVNUX0YoTWV0YURhdGFCYXNlVW5pdFRlc3QsIFJlbW92ZUtleVRlc3QpIHsKKyAgICBNZXRhRGF0YUJhc2UgKm1ldGFEYXRhID0gbmV3IE1ldGFEYXRhQmFzZSgpOworICAgIEFTU0VSVF9ORShtZXRhRGF0YSwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgbWV0YSBkYXRhIjsKKworICAgIGJvb2wgc3RhdHVzID0gbWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleU1JTUVUeXBlLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworICAgIC8vIFF1ZXJ5IHRoZSBrZXkKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+aGFzRGF0YShrS2V5TUlNRVR5cGUpOworICAgIEFTU0VSVF9UUlVFKHN0YXR1cykgPDwgIk1ldGFEYXRhIGRvZXMgbm90IGhhdmUgdGhlIG1pbWUga2V5IjsKKworICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5yZW1vdmUoa0tleU1JTUVUeXBlKTsKKyAgICBBU1NFUlRfVFJVRShzdGF0dXMpIDw8ICJGYWlsZWQgdG8gcmVtb3ZlIHRoZSBrS2V5TUlNRVR5cGUga2V5IjsKKworICAgIC8vIFF1ZXJ5IHRoZSBrZXkKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+aGFzRGF0YShrS2V5TUlNRVR5cGUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJNZXRhRGF0YSBoYXMgbWltZSBrZXkgYWZ0ZXIgcmVtb3ZpbmcgaXQsIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIC8vIFJlbW92ZSB0aGUgbm9uIGV4aXN0aW5nIGtleQorICAgIHN0YXR1cyA9IG1ldGFEYXRhLT5yZW1vdmUoa0tleU1JTUVUeXBlKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiUmVtb3ZlZCB0aGUgbm9uIGV4aXN0aW5nIGtleSI7CisKKyAgICAvLyBDaGVjayBvdmVyd3JpdGluZyB0aGUgcmVtb3ZlZCBrZXkKKyAgICBtZXRhRGF0YS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJPdmVyd3JpdGUgc2hvdWxkIGJlIGZhbHNlIHNpbmNlIHRoZSBrZXkgd2FzIHJlbW92ZWQiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlXaWR0aCwga1dpZHRoMSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5V2lkdGgsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICAvLyBDbGVhciB3aG9sZSBtZXRhZGF0YQorICAgIG1ldGFEYXRhLT5jbGVhcigpOworCisgICAgLy8gQ2hlY2sgZmluZGluZyBrZXkgYWZ0ZXIgY2xlYXJpbmcgdGhlIG1ldGFkYXRhCisgICAgaW50MzJfdCB3aWR0aDsKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+ZmluZEludDMyKGtLZXlXaWR0aCwgJndpZHRoKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiTWV0YURhdGEgZm91bmQga0tleVdpZHRoIGtleSBhZnRlciBjbGVhcmluZyBhbGwgdGhlIGl0ZW1zIGluIGl0LCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIC8vIFF1ZXJ5IHRoZSBrZXkKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+aGFzRGF0YShrS2V5V2lkdGgpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpCisgICAgICAgICAgICA8PCAiTWV0YURhdGEgaGFzIHdpZHRoIGtleSBhZnRlciBjbGVhcmluZyBhbGwgdGhlIGl0ZW1zIGluIGl0LCBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+aGFzRGF0YShrS2V5TUlNRVR5cGUpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpCisgICAgICAgICAgICA8PCAiTWV0YURhdGEgaGFzIG1pbWUga2V5IGFmdGVyIGNsZWFyaW5nIGFsbCB0aGUgaXRlbXMgaW4gaXQsIGV4cGVjdGVkIHRvIGJlIGZhbHNlIjsKKworICAgIC8vIENoZWNrIHJlbW92aW5nIGtleSBhZnRlciBjbGVhcmluZyB0aGUgbWV0YWRhdGEKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+cmVtb3ZlKGtLZXlNSU1FVHlwZSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIlJlbW92ZWQgdGhlIGtleSwgYWZ0ZXIgY2xlYXJpbmcgdGhlIG1ldGFkYXRhIjsKKworICAgIC8vIENoZWNraW5nIHNldCBhZnRlciBjbGVhcmluZyB0aGUgbWV0YWRhdGEKKyAgICBzdGF0dXMgPSBtZXRhRGF0YS0+c2V0SW50MzIoa0tleVdpZHRoLCBrV2lkdGgxKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiT3ZlcndyaXRlIHNob3VsZCBiZSBmYWxzZSBzaW5jZSB0aGUgbWV0YWRhdGEgd2FzIGNsZWFyZWQiOworCisgICAgbWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19IRVZDKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiT3ZlcndyaXRlIHNob3VsZCBiZSBmYWxzZSBzaW5jZSB0aGUgbWV0YWRhdGEgd2FzIGNsZWFyZWQiOworCisgICAgZGVsZXRlIChtZXRhRGF0YSk7Cit9CisKK1RFU1RfRihNZXRhRGF0YUJhc2VVbml0VGVzdCwgQ29udmVydFRvU3RyaW5nVGVzdCkgeworICAgIE1ldGFEYXRhQmFzZSAqbWV0YURhdGEgPSBuZXcgTWV0YURhdGFCYXNlKCk7CisgICAgQVNTRVJUX05FKG1ldGFEYXRhLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBtZXRhIGRhdGEiOworCisgICAgU3RyaW5nOCBpbmZvID0gbWV0YURhdGEtPnRvU3RyaW5nKCk7CisgICAgQVNTRVJUX0VRKGluZm8ubGVuZ3RoKCksIDApIDw8ICJFbXB0eSBNZXRhRGF0YSBsZW5ndGggaXMgbm9uLXplcm86ICIgPDwgaW5mby5sZW5ndGgoKTsKKworICAgIGJvb2wgc3RhdHVzID0gbWV0YURhdGEtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleU1JTUVUeXBlLCBvdmVyd3JpdGUgaXMgZXhwZWN0ZWQgdG8gYmUgZmFsc2UiOworCisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlXaWR0aCwga1dpZHRoMSk7CisgICAgQVNTRVJUX0ZBTFNFKHN0YXR1cykgPDwgIkluaXRpYWxpemluZyBrS2V5V2lkdGgsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlIZWlnaHQsIGtIZWlnaHQxKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlIZWlnaHQsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlWaWRlb1Byb2ZpbGUsIGtQcm9maWxlKTsKKyAgICBBU1NFUlRfRkFMU0Uoc3RhdHVzKSA8PCAiSW5pdGlhbGl6aW5nIGtLZXlWaWRlb1Byb2ZpbGUsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisgICAgc3RhdHVzID0gbWV0YURhdGEtPnNldEludDMyKGtLZXlWaWRlb0xldmVsLCBrTGV2ZWwpOworICAgIEFTU0VSVF9GQUxTRShzdGF0dXMpIDw8ICJJbml0aWFsaXppbmcga0tleVZpZGVvTGV2ZWwsIG92ZXJ3cml0ZSBpcyBleHBlY3RlZCB0byBiZSBmYWxzZSI7CisKKyAgICBpbmZvID0gbWV0YURhdGEtPnRvU3RyaW5nKCk7CisgICAgQVNTRVJUX0dUKGluZm8ubGVuZ3RoKCksIDApIDw8ICJNZXRhRGF0YSBjb250YWlucyBubyBpbmZvcm1hdGlvbiI7CisKKyAgICAvLyBEdW1wIHRvIGxvZyBmb3IgcmVmZXJlbmNlCisgICAgbWV0YURhdGEtPmR1bXBUb0xvZygpOworCisgICAgLy8gQ2xlYXIgd2hvbGUgbWV0YWRhdGEKKyAgICBtZXRhRGF0YS0+Y2xlYXIoKTsKKworICAgIGluZm8gPSBtZXRhRGF0YS0+dG9TdHJpbmcoKTsKKyAgICBBU1NFUlRfRVEoaW5mby5sZW5ndGgoKSwgMCkgPDwgIk1ldGFEYXRhIGxlbmd0aCBpcyBub24temVybyBhZnRlciBjbGVhcmluZyBpdDogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBpbmZvLmxlbmd0aCgpOworCisgICAgZGVsZXRlIChtZXRhRGF0YSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMjUxYTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIk9wdXNIZWFkZXJUZXN0IiwKKyAgICBndGVzdDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIk9wdXNIZWFkZXJUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAidW5zaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZWUxNmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciBvcHVzIGhlYWRlciB1bml0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iT3B1c0hlYWRlclRlc3QiIC8+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoIiB2YWx1ZT0iT3B1c0hlYWRlclRlc3QtPi9kYXRhL2xvY2FsL3RtcC9PcHVzSGVhZGVyVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL09wdXNIZWFkZXIuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL09wdXNIZWFkZXJUZXN0UmVzLyIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKworICAgIDx0ZXN0IGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50ZXN0dHlwZS5HVGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im5hdGl2ZS10ZXN0LWRldmljZS1wYXRoIiB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9Im1vZHVsZS1uYW1lIiB2YWx1ZT0iT3B1c0hlYWRlclRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9PcHVzSGVhZGVyVGVzdFJlcy8iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vdGVzdHMvT3B1c0hlYWRlci9PcHVzSGVhZGVyVGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvT3B1c0hlYWRlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNDI3ODEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvT3B1c0hlYWRlclRlc3QuY3BwCkBAIC0wLDAgKzEsMzIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJPcHVzSGVhZGVyVGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vT3B1c0hlYWRlci5oPgorCisjaW5jbHVkZSAiT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworI2RlZmluZSBPVVRQVVRfRklMRV9OQU1FICIvZGF0YS9sb2NhbC90bXAvT3B1c091dHB1dCIKKworLy8gT3B1cyBpbiBXZWJNIGlzIGEgd2VsbC1rbm93biwgeWV0IHVuZGVyLWRvY3VtZW50ZWQsIGZvcm1hdC4gVGhlIGNvZGVjIHByaXZhdGUgZGF0YQorLy8gb2YgdGhlIHRyYWNrIGlzIGFuIE9wdXMgT2dnIGhlYWRlciAoaHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzc4NDUjc2VjdGlvbi01LjEpCisvLyBjaGFubmVsIG1hcHBpbmcgb2Zmc2V0IGluIG9wdXMgaGVhZGVyCitjb25zdGV4cHIgc2l6ZV90IGtPcHVzSGVhZGVyU3RyZWFtTWFwT2Zmc2V0ID0gMjE7Citjb25zdGV4cHIgc2l6ZV90IGtNYXhPcHVzSGVhZGVyU2l6ZSA9IDEwMDsKKy8vIEFPUFVTSERSICsgQU9QVVNIRFJMZW5ndGggKworLy8gKDggKyA4ICkgKworLy8gSGVhZGVyKGNzZCkgKyBudW1fc3RyZWFtcyArIG51bV9jb3VwbGVkICsgMQorLy8gKDE5ICsgMSArIDEgKyAxKSArCisvLyBBT1BVU0RMWSArIEFPUFVTRExZTGVuZ3RoICsgREVMQVkgKyBBT1BVU1BSTCArIEFPUFVTUFJMTGVuZ3RoICsgUFJMCisvLyAoOCArIDggKyA4ICsgOCArIDggKyA4KQorLy8gPSA4NgorY29uc3RleHByIHNpemVfdCBrT3B1c0hlYWRlckNoYW5uZWxNYXBPZmZzZXQgPSA4NjsKK2NvbnN0ZXhwciB1aW50MzJfdCBrT3B1c1NhbXBsZVJhdGUgPSA0ODAwMDsKK2NvbnN0ZXhwciB1aW50NjRfdCBrT3B1c1NlZWtQcmVyb2xsTnMgPSA4MDAwMDAwMDsKK2NvbnN0ZXhwciBpbnQ2NF90IGtOc2VjUGVyU2VjID0gMTAwMDAwMDAwMGxsOworCisvLyBPcHVzIHVzZXMgVm9yYmlzIGNoYW5uZWwgbWFwcGluZywgYW5kIFZvcmJpcyBjaGFubmVsIG1hcHBpbmcgc3BlY2lmaWVzCisvLyBtYXBwaW5ncyBmb3IgdXAgdG8gOCBjaGFubmVscy4gVGhpcyBpbmZvcm1hdGlvbiBpcyBwYXJ0IG9mIHRoZSBWb3JiaXMgSQorLy8gU3BlY2lmaWNhdGlvbjoKKy8vIGh0dHA6Ly93d3cueGlwaC5vcmcvdm9yYmlzL2RvYy9Wb3JiaXNfSV9zcGVjLmh0bWwKK2NvbnN0ZXhwciBpbnQga01heENoYW5uZWxzID0gODsKK2NvbnN0ZXhwciB1aW50OF90IGtPcHVzQ2hhbm5lbE1hcFtrTWF4Q2hhbm5lbHNdW2tNYXhDaGFubmVsc10gPSB7CisgICAgICAgIHswfSwKKyAgICAgICAgezAsIDF9LAorICAgICAgICB7MCwgMiwgMX0sCisgICAgICAgIHswLCAxLCAyLCAzfSwKKyAgICAgICAgezAsIDQsIDEsIDIsIDN9LAorICAgICAgICB7MCwgNCwgMSwgMiwgMywgNX0sCisgICAgICAgIHswLCA0LCAxLCAyLCAzLCA1LCA2fSwKKyAgICAgICAgezAsIDYsIDEsIDIsIDMsIDQsIDUsIDd9LAorfTsKKworc3RhdGljIE9wdXNIZWFkZXJUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCitjbGFzcyBPcHVzSGVhZGVyVGVzdCB7CisgIHB1YmxpYzoKKyAgICBPcHVzSGVhZGVyVGVzdCgpIDogbUlucHV0QnVmZmVyKG51bGxwdHIpIHt9CisKKyAgICB+T3B1c0hlYWRlclRlc3QoKSB7CisgICAgICAgIGlmIChtRWxlU3RyZWFtLmlzX29wZW4oKSkgbUVsZVN0cmVhbS5jbG9zZSgpOworICAgICAgICBpZiAobUlucHV0QnVmZmVyKSB7CisgICAgICAgICAgICBmcmVlKG1JbnB1dEJ1ZmZlcik7CisgICAgICAgICAgICBtSW5wdXRCdWZmZXIgPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorICAgIGlmc3RyZWFtIG1FbGVTdHJlYW07CisgICAgdWludDhfdCAqbUlucHV0QnVmZmVyOworfTsKKworY2xhc3MgT3B1c0hlYWRlclBhcnNlVGVzdCA6IHB1YmxpYyBPcHVzSGVhZGVyVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHVwbGU8c3RyaW5nIC8qIElucHV0RmlsZU5hbWUgKi8sIGludDMyX3QgLyogQ2hhbm5lbENvdW50ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKiBpc0hlYWRlclZhbGlkICovLCBib29sIC8qIGlzQ29kZWNEZWxheVZhbGlkICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKiBpc1NlZWtQcmVSb2xsVmFsaWQgKi8sIGJvb2wgLyogaXNJbnB1dFZhbGlkICovPj4geworfTsKKworY2xhc3MgT3B1c0hlYWRlcldyaXRlVGVzdAorICAgIDogcHVibGljIE9wdXNIZWFkZXJUZXN0LAorICAgICAgcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxwYWlyPGludDMyX3QgLyogQ2hhbm5lbENvdW50ICovLCBpbnQzMl90IC8qIHNraXBTYW1wbGVzICovPj4geworfTsKKworVEVTVF9QKE9wdXNIZWFkZXJXcml0ZVRlc3QsIFdyaXRlVGVzdCkgeworICAgIE9wdXNIZWFkZXIgd3JpdHRlbkhlYWRlcjsKKyAgICBtZW1zZXQoJndyaXR0ZW5IZWFkZXIsIDAsIHNpemVvZih3cml0dGVuSGVhZGVyKSk7CisgICAgaW50MzJfdCBjaGFubmVscyA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgd3JpdHRlbkhlYWRlci5jaGFubmVscyA9IGNoYW5uZWxzOworICAgIHdyaXR0ZW5IZWFkZXIubnVtX3N0cmVhbXMgPSBjaGFubmVsczsKKyAgICB3cml0dGVuSGVhZGVyLmNoYW5uZWxfbWFwcGluZyA9ICgoY2hhbm5lbHMgPiA4KSA/IDI1NSA6IChjaGFubmVscyA+IDIpKTsKKyAgICBpbnQzMl90IHNraXBTYW1wbGVzID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgd3JpdHRlbkhlYWRlci5za2lwX3NhbXBsZXMgPSBza2lwU2FtcGxlczsKKyAgICB1aW50NjRfdCBjb2RlY0RlbGF5TnMgPSBza2lwU2FtcGxlcyAqIGtOc2VjUGVyU2VjIC8ga09wdXNTYW1wbGVSYXRlOworICAgIHVpbnQ4X3QgaGVhZGVyRGF0YVtrTWF4T3B1c0hlYWRlclNpemVdOworICAgIGludDMyX3QgaGVhZGVyU2l6ZSA9IFdyaXRlT3B1c0hlYWRlcnMod3JpdHRlbkhlYWRlciwga09wdXNTYW1wbGVSYXRlLCBoZWFkZXJEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGhlYWRlckRhdGEpLCBjb2RlY0RlbGF5TnMsIGtPcHVzU2Vla1ByZXJvbGxOcyk7CisgICAgQVNTRVJUX0dUKGhlYWRlclNpemUsIDApIDw8ICJmYWlsZWQgdG8gZ2VuZXJhdGUgT3B1cyBoZWFkZXIiOworICAgIEFTU0VSVF9MRShoZWFkZXJTaXplLCBrTWF4T3B1c0hlYWRlclNpemUpCisgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIgd3JpdHRlbi4gSGVhZGVyIHNpemUgY2FuJ3QgZXhjZWVkIGtNYXhPcHVzSGVhZGVyU2l6ZSI7CisKKyAgICBvZnN0cmVhbSBvc3RybTsKKyAgICBvc3RybS5vcGVuKE9VVFBVVF9GSUxFX05BTUUsIG9mc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9UUlVFKG9zdHJtLmlzX29wZW4oKSkgPDwgIkZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlICIgPDwgT1VUUFVUX0ZJTEVfTkFNRTsKKworICAgIC8vIFRPRE8gOiBWYWxpZGF0ZSBiaXRzdHJlYW0gKGIvMTUwMTE2NDAyKQorICAgIG9zdHJtLndyaXRlKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihoZWFkZXJEYXRhKSwgc2l6ZW9mKGhlYWRlckRhdGEpKTsKKyAgICBvc3RybS5jbG9zZSgpOworCisgICAgc2l6ZV90IG9wdXNIZWFkU2l6ZSA9IDA7CisgICAgc2l6ZV90IGNvZGVjRGVsYXlCdWZTaXplID0gMDsKKyAgICBzaXplX3Qgc2Vla1ByZVJvbGxCdWZTaXplID0gMDsKKyAgICB2b2lkICpvcHVzSGVhZEJ1ZiA9IG51bGxwdHI7CisgICAgdm9pZCAqY29kZWNEZWxheUJ1ZiA9IG51bGxwdHI7CisgICAgdm9pZCAqc2Vla1ByZVJvbGxCdWYgPSBudWxscHRyOworICAgIGJvb2wgc3RhdHVzID0gR2V0T3B1c0hlYWRlckJ1ZmZlcnMoaGVhZGVyRGF0YSwgaGVhZGVyU2l6ZSwgJm9wdXNIZWFkQnVmLCAmb3B1c0hlYWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVjRGVsYXlCdWYsICZjb2RlY0RlbGF5QnVmU2l6ZSwgJnNlZWtQcmVSb2xsQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlZWtQcmVSb2xsQnVmU2l6ZSk7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRW5jb3VudGVyZWQgZXJyb3IgaW4gR2V0T3B1c0hlYWRlckJ1ZmZlcnMiOworCisgICAgdWludDY0X3QgdmFsdWUgPSAqKCh1aW50NjRfdCAqKWNvZGVjRGVsYXlCdWYpOworICAgIEFTU0VSVF9FUSh2YWx1ZSwgY29kZWNEZWxheU5zKTsKKworICAgIHZhbHVlID0gKigodWludDY0X3QgKilzZWVrUHJlUm9sbEJ1Zik7CisgICAgQVNTRVJUX0VRKHZhbHVlLCBrT3B1c1NlZWtQcmVyb2xsTnMpOworCisgICAgT3B1c0hlYWRlciBwYXJzZWRIZWFkZXI7CisgICAgc3RhdHVzID0gUGFyc2VPcHVzSGVhZGVyKCh1aW50OF90ICopb3B1c0hlYWRCdWYsIG9wdXNIZWFkU2l6ZSwgJnBhcnNlZEhlYWRlcik7CisgICAgQVNTRVJUX1RSVUUoc3RhdHVzKSA8PCAiRW5jb3VudGVyZWQgZXJyb3Igd2hpbGUgUGFyc2luZyBPcHVzIEhlYWRlci4iOworCisgICAgQVNTRVJUX0VRKHdyaXR0ZW5IZWFkZXIuY2hhbm5lbHMsIHBhcnNlZEhlYWRlci5jaGFubmVscykKKyAgICAgICAgICAgIDw8ICJJbnZhbGlkIGhlYWRlciBnZW5lcmF0ZWQuIE1pc21hdGNoIGJldHdlZW4gY2hhbm5lbCBjb3VudHMiOworCisgICAgQVNTRVJUX0VRKHdyaXR0ZW5IZWFkZXIuc2tpcF9zYW1wbGVzLCBwYXJzZWRIZWFkZXIuc2tpcF9zYW1wbGVzKQorICAgICAgICAgICAgPDwgIk1pc21hdGNoIGJldHdlZW4gbm8gb2Ygc2tpcFNhbXBsZXMgd3JpdHRlbiAiCisgICAgICAgICAgICAgICAiYW5kIG5vIG9mIHNraXBTYW1wbGVzIGdvdCBhZnRlciBwYXJzaW5nIjsKKworICAgIEFTU0VSVF9FUSh3cml0dGVuSGVhZGVyLmNoYW5uZWxfbWFwcGluZywgcGFyc2VkSGVhZGVyLmNoYW5uZWxfbWFwcGluZykKKyAgICAgICAgICAgIDw8ICJNaXNtYXRjaCBiZXR3ZWVuIGNoYW5uZWxNYXBwaW5nIHdyaXR0ZW4gIgorICAgICAgICAgICAgICAgImFuZCBjaGFubmVsTWFwcGluZyBnb3QgYWZ0ZXIgcGFyc2luZyI7CisKKyAgICBpZiAocGFyc2VkSGVhZGVyLmNoYW5uZWxfbWFwcGluZykgeworICAgICAgICBBU1NFUlRfR1QocGFyc2VkSGVhZGVyLmNoYW5uZWxzLCAyKTsKKyAgICAgICAgQVNTRVJUX0VRKHdyaXR0ZW5IZWFkZXIubnVtX3N0cmVhbXMsIHBhcnNlZEhlYWRlci5udW1fc3RyZWFtcykKKyAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIgZ2VuZXJhdGVkLiBNaXNtYXRjaCBiZXR3ZWVuIGNoYW5uZWwgY291bnRzIjsKKworICAgICAgICBBU1NFUlRfRVEod3JpdHRlbkhlYWRlci5udW1fY291cGxlZCwgcGFyc2VkSGVhZGVyLm51bV9jb3VwbGVkKQorICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIGhlYWRlciBnZW5lcmF0ZWQuIE1pc21hdGNoIGJldHdlZW4gY2hhbm5lbCBjb3VudHMiOworCisgICAgICAgIEFTU0VSVF9FUShwYXJzZWRIZWFkZXIubnVtX2NvdXBsZWQgKyBwYXJzZWRIZWFkZXIubnVtX3N0cmVhbXMsIHBhcnNlZEhlYWRlci5jaGFubmVscyk7CisKKyAgICAgICAgQVNTRVJUX0xFKHBhcnNlZEhlYWRlci5udW1fY291cGxlZCwgcGFyc2VkSGVhZGVyLm51bV9zdHJlYW1zKQorICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIGhlYWRlciBnZW5lcmF0ZWQuIE51bWJlciBvZiBjb3VwbGVkIHN0cmVhbXMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAiCisgICAgICAgICAgICAgICAgICAgIm51bWJlciAiCisgICAgICAgICAgICAgICAgICAgIm9mIHN0cmVhbXMuIjsKKworICAgICAgICBBU1NFUlRfRVEoaGVhZGVyU2l6ZSwga09wdXNIZWFkZXJDaGFubmVsTWFwT2Zmc2V0ICsgd3JpdHRlbkhlYWRlci5jaGFubmVscykKKyAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIgd3JpdHRlbi4gSGVhZGVyIHNpemUgc2hvdWxkIGJlIGVxdWFsIHRvIDg2ICsgIgorICAgICAgICAgICAgICAgICAgICJ3cml0dGVuSGVhZGVyLmNoYW5uZWxzIjsKKworICAgICAgICB1aW50OF90IG1hcHBlZENoYW5uZWxOdW1iZXI7CisgICAgICAgIGZvciAoaW50MzJfdCBjaGFubmVsTnVtYmVyID0gMDsgY2hhbm5lbE51bWJlciA8IGNoYW5uZWxzOyBjaGFubmVsTnVtYmVyKyspIHsKKyAgICAgICAgICAgIG1hcHBlZENoYW5uZWxOdW1iZXIgPSAqKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPihvcHVzSGVhZEJ1ZikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga09wdXNIZWFkZXJTdHJlYW1NYXBPZmZzZXQgKyBjaGFubmVsTnVtYmVyKTsKKyAgICAgICAgICAgIEFTU0VSVF9MVChtYXBwZWRDaGFubmVsTnVtYmVyLCBjaGFubmVscykgPDwgIkludmFsaWQgaGVhZGVyIGdlbmVyYXRlZC4gQ2hhbm5lbCBtYXBwaW5nICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBiZSBncmVhdGVyIHRoYW4gY2hhbm5lbCBjb3VudC4iOworCisgICAgICAgICAgICBBU1NFUlRfRVEobWFwcGVkQ2hhbm5lbE51bWJlciwga09wdXNDaGFubmVsTWFwW2NoYW5uZWxzIC0gMV1bY2hhbm5lbE51bWJlcl0pCisgICAgICAgICAgICAgICAgICAgIDw8ICJJbnZhbGlkIGhlYWRlciBnZW5lcmF0ZWQuIENoYW5uZWwgbWFwcGluZyBpcyBub3QgYXMgcGVyIHNwZWNpZmljYXRpb24uIjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9MRShwYXJzZWRIZWFkZXIuY2hhbm5lbHMsIDIpOworICAgIH0KK30KKworVEVTVF9QKE9wdXNIZWFkZXJQYXJzZVRlc3QsIFBhcnNlVGVzdCkgeworICAgIHR1cGxlPHN0cmluZywgaW50MzJfdCwgYm9vbCwgYm9vbCwgYm9vbCwgYm9vbD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlTmFtZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDA+KHBhcmFtcyk7CisgICAgbUVsZVN0cmVhbS5vcGVuKGlucHV0RmlsZU5hbWUsIGlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmlzX29wZW4oKSwgdHJ1ZSkgPDwgIkZhaWxlZCB0byBvcGVuIGlucHV0ZmlsZSAiIDw8IGdldDwwPihwYXJhbXMpOworICAgIGJvb2wgaXNIZWFkZXJWYWxpZCA9IGdldDwyPihwYXJhbXMpOworICAgIGJvb2wgaXNDb2RlY0RlbGF5VmFsaWQgPSBnZXQ8Mz4ocGFyYW1zKTsKKyAgICBib29sIGlzU2Vla1ByZVJvbGxWYWxpZCA9IGdldDw0PihwYXJhbXMpOworICAgIGJvb2wgaXNJbnB1dFZhbGlkID0gZ2V0PDU+KHBhcmFtcyk7CisKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgc3RhdChpbnB1dEZpbGVOYW1lLmNfc3RyKCksICZidWYpOworICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgIG1JbnB1dEJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKGZpbGVTaXplKTsKKyAgICBBU1NFUlRfTkUobUlucHV0QnVmZmVyLCBudWxscHRyKSA8PCAiSW5zdWZmaWNpZW50IG1lbW9yeS4gTWFsbG9jIGZhaWxlZCBmb3Igc2l6ZSAiIDw8IGZpbGVTaXplOworCisgICAgbUVsZVN0cmVhbS5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhciAqPihtSW5wdXRCdWZmZXIpLCBmaWxlU2l6ZSk7CisgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uZ2NvdW50KCksIGZpbGVTaXplKSA8PCAibUVsZVN0cmVhbS5nY291bnQoKSAhPSBieXRlc0NvdW50IjsKKworICAgIE9wdXNIZWFkZXIgaGVhZGVyOworICAgIHNpemVfdCBvcHVzSGVhZFNpemUgPSAwOworICAgIHNpemVfdCBjb2RlY0RlbGF5QnVmU2l6ZSA9IDA7CisgICAgc2l6ZV90IHNlZWtQcmVSb2xsQnVmU2l6ZSA9IDA7CisgICAgdm9pZCAqb3B1c0hlYWRCdWYgPSBudWxscHRyOworICAgIHZvaWQgKmNvZGVjRGVsYXlCdWYgPSBudWxscHRyOworICAgIHZvaWQgKnNlZWtQcmVSb2xsQnVmID0gbnVsbHB0cjsKKyAgICBib29sIHN0YXR1cyA9IEdldE9wdXNIZWFkZXJCdWZmZXJzKG1JbnB1dEJ1ZmZlciwgZmlsZVNpemUsICZvcHVzSGVhZEJ1ZiwgJm9wdXNIZWFkU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjb2RlY0RlbGF5QnVmLCAmY29kZWNEZWxheUJ1ZlNpemUsICZzZWVrUHJlUm9sbEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWVrUHJlUm9sbEJ1ZlNpemUpOworICAgIGlmICghaXNIZWFkZXJWYWxpZCkgeworICAgICAgICBBU1NFUlRfRVEob3B1c0hlYWRCdWYsIG51bGxwdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9ORShvcHVzSGVhZEJ1ZiwgbnVsbHB0cik7CisgICAgfQorICAgIGlmICghaXNDb2RlY0RlbGF5VmFsaWQpIHsKKyAgICAgICAgQVNTRVJUX0VRKGNvZGVjRGVsYXlCdWYsIG51bGxwdHIpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9ORShjb2RlY0RlbGF5QnVmLCBudWxscHRyKTsKKyAgICB9CisgICAgaWYgKCFpc1NlZWtQcmVSb2xsVmFsaWQpIHsKKyAgICAgICAgQVNTRVJUX0VRKHNlZWtQcmVSb2xsQnVmLCBudWxscHRyKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBU1NFUlRfTkUoc2Vla1ByZVJvbGxCdWYsIG51bGxwdHIpOworICAgIH0KKyAgICBpZiAoIXN0YXR1cykgeworICAgICAgICBBU1NFUlRfRkFMU0UoaXNJbnB1dFZhbGlkKSA8PCAiR2V0T3B1c0hlYWRlckJ1ZmZlcnMgZmFpbGVkIjsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0YXR1cyA9IFBhcnNlT3B1c0hlYWRlcigodWludDhfdCAqKW9wdXNIZWFkQnVmLCBvcHVzSGVhZFNpemUsICZoZWFkZXIpOworCisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBBU1NFUlRfVFJVRShpc0lucHV0VmFsaWQpIDw8ICJQYXJzZSBvcHVzIGhlYWRlciBkaWRuJ3QgZmFpbCBmb3IgaW52YWxpZCBpbnB1dCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX0ZBTFNFKGlzSW5wdXRWYWxpZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQzMl90IGNoYW5uZWxzID0gZ2V0PDE+KHBhcmFtcyk7CisgICAgQVNTRVJUX0VRKGhlYWRlci5jaGFubmVscywgY2hhbm5lbHMpIDw8ICJQYXJzZXIgcmV0dXJuZWQgaW52YWxpZCBjaGFubmVsIGNvdW50IjsKKyAgICBBU1NFUlRfTEUoaGVhZGVyLmNoYW5uZWxzLCBrTWF4Q2hhbm5lbHMpOworCisgICAgQVNTRVJUX0xFKGhlYWRlci5udW1fY291cGxlZCwgaGVhZGVyLm51bV9zdHJlYW1zKQorICAgICAgICAgICAgPDwgIkludmFsaWQgaGVhZGVyIGdlbmVyYXRlZC4gTnVtYmVyIG9mIGNvdXBsZWQgc3RyZWFtcyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIG51bWJlciAiCisgICAgICAgICAgICAgICAib2Ygc3RyZWFtcy4iOworCisgICAgQVNTRVJUX0VRKGhlYWRlci5udW1fY291cGxlZCArIGhlYWRlci5udW1fc3RyZWFtcywgaGVhZGVyLmNoYW5uZWxzKTsKKworICAgIGlmIChoZWFkZXIuY2hhbm5lbF9tYXBwaW5nKSB7CisgICAgICAgIHVpbnQ4X3QgbWFwcGVkQ2hhbm5lbE51bWJlcjsKKyAgICAgICAgZm9yIChpbnQzMl90IGNoYW5uZWxOdW1iZXIgPSAwOyBjaGFubmVsTnVtYmVyIDwgY2hhbm5lbHM7IGNoYW5uZWxOdW1iZXIrKykgeworICAgICAgICAgICAgbWFwcGVkQ2hhbm5lbE51bWJlciA9ICoocmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KG9wdXNIZWFkQnVmKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrT3B1c0hlYWRlclN0cmVhbU1hcE9mZnNldCArIGNoYW5uZWxOdW1iZXIpOworICAgICAgICAgICAgQVNTRVJUX0xUKG1hcHBlZENoYW5uZWxOdW1iZXIsIGNoYW5uZWxzKQorICAgICAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIuIENoYW5uZWwgbWFwcGluZyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuIGNoYW5uZWwgY291bnQuIjsKKworICAgICAgICAgICAgQVNTRVJUX0VRKG1hcHBlZENoYW5uZWxOdW1iZXIsIGtPcHVzQ2hhbm5lbE1hcFtjaGFubmVscyAtIDFdW2NoYW5uZWxOdW1iZXJdKQorICAgICAgICAgICAgICAgICAgICA8PCAiSW52YWxpZCBoZWFkZXIgZ2VuZXJhdGVkLiBDaGFubmVsIG1hcHBpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAiaXMgbm90IGFzIHBlciBzcGVjaWZpY2F0aW9uLiI7CisgICAgICAgIH0KKyAgICB9Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUChPcHVzSGVhZGVyVGVzdEFsbCwgT3B1c0hlYWRlcldyaXRlVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoMSwgMzEyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoMiwgMzEyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoNSwgMzEyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoNiwgMzEyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoMSwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKDIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcig1LCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoNiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKDEsIDYyNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKDIsIDYyNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKDUsIDYyNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKDYsIDYyNCkpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBPcHVzSGVhZGVyVGVzdEFsbCwgT3B1c0hlYWRlclBhcnNlVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiMmNoX3ZhbGlkX3NpemU4M0Iub3B1cyIsIDIsIHRydWUsIHRydWUsIHRydWUsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF92YWxpZF9zaXplODhCLm9wdXMiLCAzLCB0cnVlLCB0cnVlLCB0cnVlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCI1Y2hfdmFsaWQub3B1cyIsIDUsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiNmNoX3ZhbGlkLm9wdXMiLCA2LCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjFjaF92YWxpZC5vcHVzIiwgMSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIyY2hfdmFsaWQub3B1cyIsIDIsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfc2l6ZS5vcHVzIiwgMywgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF9pbnZhbGlkX3N0cmVhbXMub3B1cyIsIDMsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCI1Y2hfaW52YWxpZF9jaGFubmVsbWFwcGluZy5vcHVzIiwgNSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiNWNoX2ludmFsaWRfY291cGxlZHN0cmVhbXMub3B1cyIsIDUsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjZjaF9pbnZhbGlkX2NoYW5uZWxtYXBwaW5nLm9wdXMiLCA2LCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCI5Y2hfaW52YWxpZF9jaGFubmVscy5vcHVzIiwgOSwgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjJjaF9pbnZhbGlkX2hlYWRlci5vcHVzIiwgMiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjJjaF9pbnZhbGlkX2hlYWRlcmxlbmd0aF8xNi5vcHVzIiwgMiwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjJjaF9pbnZhbGlkX2hlYWRlcmxlbmd0aF8yNTYub3B1cyIsIDIsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIyY2hfaW52YWxpZF9zaXplLm9wdXMiLCAyLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfY2hhbm5lbG1hcHBpbmdfMC5vcHVzIiwgMywgdHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF9pbnZhbGlkX2NvdXBsZWRzdHJlYW1zLm9wdXMiLCAzLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfaGVhZGVybGVuZ3RoLm9wdXMiLCAzLCB0cnVlLCB0cnVlLCB0cnVlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfaGVhZGVyU2l6ZTEub3B1cyIsIDMsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCIzY2hfaW52YWxpZF9oZWFkZXJTaXplMi5vcHVzIiwgMywgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF9pbnZhbGlkX2hlYWRlclNpemUzLm9wdXMiLCAzLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSksCisgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiM2NoX2ludmFsaWRfbm9kZWxheS5vcHVzIiwgMywgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpLAorICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoIjNjaF9pbnZhbGlkX25vcHJlcm9sbC5vcHVzIiwgMywgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGdFbnYgPSBuZXcgT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR0QoIk9wdXMgSGVhZGVyIFRlc3QgUmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL09wdXNIZWFkZXJUZXN0RW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDE2M2MzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL09wdXNIZWFkZXJUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX09QVVNfSEVBREVSX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisjZGVmaW5lIF9fT1BVU19IRUFERVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyAgcHVibGljOgorICAgIE9wdXNIZWFkZXJUZXN0RW52aXJvbm1lbnQoKSA6IHJlcygiL2RhdGEvbG9jYWwvdG1wLyIpIHt9CisKKyAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudHMKKyAgICBpbnQgaW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndik7CisKKyAgICB2b2lkIHNldFJlcyhjb25zdCBjaGFyICpfcmVzKSB7IHJlcyA9IF9yZXM7IH0KKworICAgIGNvbnN0IHN0cmluZyBnZXRSZXMoKSBjb25zdCB7IHJldHVybiByZXM7IH0KKworICBwcml2YXRlOgorICAgIHN0cmluZyByZXM7Cit9OworCitpbnQgT3B1c0hlYWRlclRlc3RFbnZpcm9ubWVudDo6aW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHt7InBhdGgiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzogeworICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCisgICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBfX09QVVNfSEVBREVSX1RFU1RfRU5WSVJPTk1FTlRfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjBjODI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi90ZXN0cy9PcHVzSGVhZGVyL1JFQURNRS5tZApAQCAtMCwwICsxLDM5IEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgT3B1cyBIZWFkZXIKK1RoZSBPcHVzSGVhZGVyIFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBPUFVTIGhlYWRlciBhdmFpbGFibGUgaW4gbGlic3RhZ2VmcmlnaHQuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittIE9wdXNIZWFkZXJUZXN0CitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0L09wdXNIZWFkZXJUZXN0L09wdXNIZWFkZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUbyB0ZXN0IDMyLWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3QuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvT3B1c0hlYWRlclRlc3QvT3B1c0hlYWRlclRlc3QgL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL3Rlc3RzL09wdXNIZWFkZXIvT3B1c0hlYWRlci56aXApLiBEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCisKK2BgYAorYWRiIHB1c2ggT3B1c0hlYWRlciAvZGF0YS9sb2NhbC90bXAvCitgYGAKKwordXNhZ2U6IE9wdXNIZWFkZXJUZXN0IC1QIFw8cGF0aF90b19mb2xkZXJcPgorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL09wdXNIZWFkZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9PcHVzSGVhZGVyLworYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBPcHVzSGVhZGVyVGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHAvTWVkaWFIVFRQLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M5MjQ3ZS4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwL01lZGlhSFRUUC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFIVFRQIgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgotCi0jaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLU1lZGlhSFRUUDo6TWVkaWFIVFRQKGNvbnN0IHNwPE1lZGlhSFRUUENvbm5lY3Rpb24+ICZjb25uKQotICAgIDogbUluaXRDaGVjaygoY29ubiAhPSBOVUxMKSA/IE9LIDogTk9fSU5JVCksCi0gICAgICBtSFRUUENvbm5lY3Rpb24oY29ubiksCi0gICAgICBtQ2FjaGVkU2l6ZVZhbGlkKGZhbHNlKSwKLSAgICAgIG1DYWNoZWRTaXplKDBsbCksCi0gICAgICBtRHJtTWFuYWdlckNsaWVudChOVUxMKSB7Ci19Ci0KLU1lZGlhSFRUUDo6fk1lZGlhSFRUUCgpIHsKLSAgICBjbGVhckRSTVN0YXRlX2woKTsKLX0KLQotc3RhdHVzX3QgTWVkaWFIVFRQOjpjb25uZWN0KAotICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgIGNvbnN0IEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICBvZmY2NF90IC8qIG9mZnNldCAqLykgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGV4dEhlYWRlcnM7Ci0gICAgaWYgKGhlYWRlcnMgIT0gTlVMTCkgewotICAgICAgICBleHRIZWFkZXJzID0gKmhlYWRlcnM7Ci0gICAgfQotCi0gICAgaWYgKGV4dEhlYWRlcnMuaW5kZXhPZktleShTdHJpbmc4KCJVc2VyLUFnZW50IikpIDwgMCkgewotICAgICAgICBleHRIZWFkZXJzLmFkZChTdHJpbmc4KCJVc2VyLUFnZW50IiksIFN0cmluZzgoTWFrZVVzZXJBZ2VudCgpLmNfc3RyKCkpKTsKLSAgICB9Ci0KLSAgICBtTGFzdFVSSSA9IHVyaTsKLSAgICAvLyByZWNvbm5lY3QoKSBjYWxscyB3aXRoIHVyaSA9PSBvbGQgbUxhc3RVUkkuY19zdHIoKSwgd2hpY2ggZ2V0cyB6YXBwZWQKLSAgICAvLyBhcyBwYXJ0IG9mIHRoZSBhYm92ZSBhc3NpZ25tZW50LiBFbnN1cmUgbm8gYWNjaWRlbnRhbCBsYXRlciB1c2UuCi0gICAgdXJpID0gTlVMTDsKLQotICAgIGJvb2wgc3VjY2VzcyA9IG1IVFRQQ29ubmVjdGlvbi0+Y29ubmVjdChtTGFzdFVSSS5jX3N0cigpLCAmZXh0SGVhZGVycyk7Ci0KLSAgICBtTGFzdEhlYWRlcnMgPSBleHRIZWFkZXJzOwotCi0gICAgbUNhY2hlZFNpemVWYWxpZCA9IGZhbHNlOwotCi0gICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgQVN0cmluZyBzYW5pdGl6ZWQgPSB1cmlEZWJ1Z1N0cmluZyhtTGFzdFVSSSk7Ci0gICAgICAgIG1OYW1lID0gU3RyaW5nODo6Zm9ybWF0KCJNZWRpYUhUVFAoJXMpIiwgc2FuaXRpemVkLmNfc3RyKCkpOwotICAgIH0KLQotICAgIHJldHVybiBzdWNjZXNzID8gT0sgOiBVTktOT1dOX0VSUk9SOwotfQotCi12b2lkIE1lZGlhSFRUUDo6ZGlzY29ubmVjdCgpIHsKLSAgICBtTmFtZSA9IFN0cmluZzgoIk1lZGlhSFRUUCg8ZGlzY29ubmVjdGVkPikiKTsKLSAgICBpZiAobUluaXRDaGVjayAhPSBPSykgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgbUhUVFBDb25uZWN0aW9uLT5kaXNjb25uZWN0KCk7Ci19Ci0KLXN0YXR1c190IE1lZGlhSFRUUDo6aW5pdENoZWNrKCkgY29uc3QgewotICAgIHJldHVybiBtSW5pdENoZWNrOwotfQotCi1zc2l6ZV90IE1lZGlhSFRUUDo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIGludDY0X3Qgc3RhcnRUaW1lVXMgPSBBTG9vcGVyOjpHZXROb3dVcygpOwotCi0gICAgc2l6ZV90IG51bUJ5dGVzUmVhZCA9IDA7Ci0gICAgd2hpbGUgKG51bUJ5dGVzUmVhZCA8IHNpemUpIHsKLSAgICAgICAgc2l6ZV90IGNvcHkgPSBzaXplIC0gbnVtQnl0ZXNSZWFkOwotCi0gICAgICAgIGlmIChjb3B5ID4gNjQgKiAxMDI0KSB7Ci0gICAgICAgICAgICAvLyBsaW1pdCB0aGUgYnVmZmVyIHNpemVzIHRyYW5zZmVycmVkIGFjcm9zcyBiaW5kZXIgYm91bmRhcmllcwotICAgICAgICAgICAgLy8gdG8gYXZvaWQgc3B1cmlvdXMgdHJhbnNhY3Rpb24gZmFpbHVyZXMuCi0gICAgICAgICAgICBjb3B5ID0gNjQgKiAxMDI0OwotICAgICAgICB9Ci0KLSAgICAgICAgc3NpemVfdCBuID0gbUhUVFBDb25uZWN0aW9uLT5yZWFkQXQoCi0gICAgICAgICAgICAgICAgb2Zmc2V0ICsgbnVtQnl0ZXNSZWFkLCAodWludDhfdCAqKWRhdGEgKyBudW1CeXRlc1JlYWQsIGNvcHkpOwotCi0gICAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIG47Ci0gICAgICAgIH0gZWxzZSBpZiAobiA9PSAwKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIG51bUJ5dGVzUmVhZCArPSBuOwotICAgIH0KLQotICAgIGludDY0X3QgZGVsYXlVcyA9IEFMb29wZXI6OkdldE5vd1VzKCkgLSBzdGFydFRpbWVVczsKLQotICAgIGFkZEJhbmR3aWR0aE1lYXN1cmVtZW50KG51bUJ5dGVzUmVhZCwgZGVsYXlVcyk7Ci0KLSAgICByZXR1cm4gbnVtQnl0ZXNSZWFkOwotfQotCi1zdGF0dXNfdCBNZWRpYUhUVFA6OmdldFNpemUob2ZmNjRfdCAqc2l6ZSkgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBtSW5pdENoZWNrOwotICAgIH0KLQotICAgIC8vIENhY2hpbmcgdGhlIHJldHVybmVkIHNpemUgc28gdGhhdCBpdCBzdGF5cyB2YWxpZCBldmVuIGFmdGVyIGEKLSAgICAvLyBkaXNjb25uZWN0LiBOdUNhY2hlZFNvdXJjZTIgcmVsaWVzIG9uIHRoaXMuCi0KLSAgICBpZiAoIW1DYWNoZWRTaXplVmFsaWQpIHsKLSAgICAgICAgbUNhY2hlZFNpemUgPSBtSFRUUENvbm5lY3Rpb24tPmdldFNpemUoKTsKLSAgICAgICAgbUNhY2hlZFNpemVWYWxpZCA9IHRydWU7Ci0gICAgfQotCi0gICAgKnNpemUgPSBtQ2FjaGVkU2l6ZTsKLQotICAgIHJldHVybiAqc2l6ZSA8IDAgPyAqc2l6ZSA6IHN0YXRpY19jYXN0PHN0YXR1c190PihPSyk7Ci19Ci0KLXVpbnQzMl90IE1lZGlhSFRUUDo6ZmxhZ3MoKSB7Ci0gICAgcmV0dXJuIGtXYW50c1ByZWZldGNoaW5nIHwga0lzSFRUUEJhc2VkU291cmNlOwotfQotCi1zdGF0dXNfdCBNZWRpYUhUVFA6OnJlY29ubmVjdEF0T2Zmc2V0KG9mZjY0X3Qgb2Zmc2V0KSB7Ci0gICAgcmV0dXJuIGNvbm5lY3QobUxhc3RVUkkuY19zdHIoKSwgJm1MYXN0SGVhZGVycywgb2Zmc2V0KTsKLX0KLQotLy8gRFJNLi4uCi0KLXNwPERlY3J5cHRIYW5kbGU+IE1lZGlhSFRUUDo6RHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciogbWltZSkgewotICAgIGlmIChtRHJtTWFuYWdlckNsaWVudCA9PSBOVUxMKSB7Ci0gICAgICAgIG1Ecm1NYW5hZ2VyQ2xpZW50ID0gbmV3IERybU1hbmFnZXJDbGllbnQoKTsKLSAgICB9Ci0KLSAgICBpZiAobURybU1hbmFnZXJDbGllbnQgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAobURlY3J5cHRIYW5kbGUgPT0gTlVMTCkgewotICAgICAgICBtRGVjcnlwdEhhbmRsZSA9IG1Ecm1NYW5hZ2VyQ2xpZW50LT5vcGVuRGVjcnlwdFNlc3Npb24oCi0gICAgICAgICAgICAgICAgU3RyaW5nOChtTGFzdFVSSS5jX3N0cigpKSwgbWltZSk7Ci0gICAgfQotCi0gICAgaWYgKG1EZWNyeXB0SGFuZGxlID09IE5VTEwpIHsKLSAgICAgICAgZGVsZXRlIG1Ecm1NYW5hZ2VyQ2xpZW50OwotICAgICAgICBtRHJtTWFuYWdlckNsaWVudCA9IE5VTEw7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1EZWNyeXB0SGFuZGxlOwotfQotCi1TdHJpbmc4IE1lZGlhSFRUUDo6Z2V0VXJpKCkgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4OjplbXB0eSgpOwotICAgIH0KLQotICAgIFN0cmluZzggdXJpOwotICAgIGlmIChPSyA9PSBtSFRUUENvbm5lY3Rpb24tPmdldFVyaSgmdXJpKSkgewotICAgICAgICByZXR1cm4gdXJpOwotICAgIH0KLSAgICByZXR1cm4gU3RyaW5nOChtTGFzdFVSSS5jX3N0cigpKTsKLX0KLQotU3RyaW5nOCBNZWRpYUhUVFA6OmdldE1JTUVUeXBlKCkgY29uc3QgewotICAgIGlmIChtSW5pdENoZWNrICE9IE9LKSB7Ci0gICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKLSAgICB9Ci0KLSAgICBTdHJpbmc4IG1pbWVUeXBlOwotICAgIHN0YXR1c190IGVyciA9IG1IVFRQQ29ubmVjdGlvbi0+Z2V0TUlNRVR5cGUoJm1pbWVUeXBlKTsKLQotICAgIGlmIChlcnIgIT0gT0spIHsKLSAgICAgICAgcmV0dXJuIFN0cmluZzgoImFwcGxpY2F0aW9uL29jdGV0LXN0cmVhbSIpOwotICAgIH0KLQotICAgIHJldHVybiBtaW1lVHlwZTsKLX0KLQotdm9pZCBNZWRpYUhUVFA6OmNsZWFyRFJNU3RhdGVfbCgpIHsKLSAgICBpZiAobURlY3J5cHRIYW5kbGUgIT0gTlVMTCkgewotICAgICAgICAvLyBUbyByZWxlYXNlIG1EZWNyeXB0SGFuZGxlCi0gICAgICAgIENIRUNLKG1Ecm1NYW5hZ2VyQ2xpZW50KTsKLSAgICAgICAgbURybU1hbmFnZXJDbGllbnQtPmNsb3NlRGVjcnlwdFNlc3Npb24obURlY3J5cHRIYW5kbGUpOwotICAgICAgICBtRGVjcnlwdEhhbmRsZSA9IE5VTEw7Ci0gICAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0FuZHJvaWQuYnAKaW5kZXggOTA1M2Q2Mi4uMTJlN2NhNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9BbmRyb2lkLmJwCkBAIC0yOSwxOCArMjksMTkgQEAKIAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJsb2ciLAotICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmNyeXB0byIsCiAgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliZGF0YXNvdXJjZSIsCiAgICAgICAgICJsaWJtZWRpYSIsCi0gICAgICAgICJsaWJtZWRpYWV4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYW5kayIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnV0aWxzIiwKLSAgICAgICAgImxpYmhpZGxhbGxvY2F0b3J1dGlscyIsCiAgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FzQDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKICAgICBdLAogCiAgICAgaGVhZGVyX2xpYnM6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0hUVFBEb3dubG9hZGVyLmNwcAppbmRleCA3MjYwNGUzLi42OGYxZGU5IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9IVFRQRG93bmxvYWRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvSFRUUERvd25sb2FkZXIuY3BwCkBAIC0yMSwxMyArMjEsMTMgQEAKICNpbmNsdWRlICJIVFRQRG93bmxvYWRlci5oIgogI2luY2x1ZGUgIk0zVVBhcnNlci5oIgogCisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9NZWRpYUhUVFAuaD4KKyNpbmNsdWRlIDxkYXRhc291cmNlL0ZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxvcGVuc3NsL2Flcy5oPgogI2luY2x1ZGUgPG9wZW5zc2wvbWQ1Lmg+CiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KQEAgLTE1Nyw2ICsxNTcsMTIgQEAKICAgICAgICAgICAgICAgICAgYnVmZmVyLT5zaXplKCkgKyBidWZmZXJSZW1haW5pbmcpOwogCiAgICAgICAgICAgICBzcDxBQnVmZmVyPiBjb3B5ID0gbmV3IEFCdWZmZXIoYnVmZmVyLT5zaXplKCkgKyBidWZmZXJSZW1haW5pbmcpOworICAgICAgICAgICAgaWYgKGNvcHktPmRhdGEoKSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICI2ODM5OTQzOSIpOworICAgICAgICAgICAgICAgIEFMT0dFKCJub3QgZW5vdWdoIG1lbW9yeSB0byBkb3dubG9hZDogcmVxdWVzdGluZyAlenUgKyAlenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5zaXplKCksIGJ1ZmZlclJlbWFpbmluZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIG1lbWNweShjb3B5LT5kYXRhKCksIGJ1ZmZlci0+ZGF0YSgpLCBidWZmZXItPnNpemUoKSk7CiAgICAgICAgICAgICBjb3B5LT5zZXRSYW5nZSgwLCBidWZmZXItPnNpemUoKSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL0xpdmVTZXNzaW9uLmNwcAppbmRleCAyZWNmYTQzLi4zYmFkMDE1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9MaXZlU2Vzc2lvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTGl2ZVNlc3Npb24uY3BwCkBAIC0zNCw2ICszNCw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZvdW5kYXRpb25VdGlscy5oPgogCiAjaW5jbHVkZSA8dXRpbHMvTXV0ZXguaD4KIApAQCAtMTIzNCw3ICsxMjM1LDcgQEAKICAgICAgICAgY29uc3QgQVN0cmluZyAmdXJpLCB1aW50MzJfdCBzdHJlYW1NYXNrLCBpbnQ2NF90IHRpbWVVcywgYm9vbCBuZXdVcmkpIHsKICAgICBzc2l6ZV90IGluZGV4ID0gbUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KHVyaSk7CiAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HRSgiZGlkIG5vdCBmaW5kIGZldGNoZXIgZm9yIHVyaTogJXMiLCB1cmkuY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCJkaWQgbm90IGZpbmQgZmV0Y2hlciBmb3IgdXJpOiAlcyIsIHVyaURlYnVnU3RyaW5nKHVyaSkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKQEAgLTEzODQsNyArMTM4NSw3IEBACiAgICAgICAgIHdoaWxlIChpbmRleCA+IGxvd2VzdEJhbmR3aWR0aCkgewogICAgICAgICAgICAgLy8gYmUgY29uc2VydmF0aXZlICg3MCUpIHRvIGF2b2lkIG92ZXJlc3RpbWF0aW5nIGFuZCBpbW1lZGlhdGVseQogICAgICAgICAgICAgLy8gc3dpdGNoaW5nIGRvd24gYWdhaW4uCi0gICAgICAgICAgICBzaXplX3QgYWRqdXN0ZWRCYW5kd2lkdGhCcHMgPSBiYW5kd2lkdGhCcHMgKiA3IC8gMTA7CisgICAgICAgICAgICBzaXplX3QgYWRqdXN0ZWRCYW5kd2lkdGhCcHMgPSBiYW5kd2lkdGhCcHMgKiAuN2Y7CiAgICAgICAgICAgICBjb25zdCBCYW5kd2lkdGhJdGVtICZpdGVtID0gbUJhbmR3aWR0aEl0ZW1zW2luZGV4XTsKICAgICAgICAgICAgIGlmIChpdGVtLm1CYW5kd2lkdGggPD0gYWRqdXN0ZWRCYW5kd2lkdGhCcHMKICAgICAgICAgICAgICAgICAgICAgJiYgaXNCYW5kd2lkdGhWYWxpZChpdGVtKSkgewpAQCAtMjAwNSw3ICsyMDA2LDcgQEAKIAogICAgICAgICAgICAgaWYgKChtTmV3U3RyZWFtTWFzayAmIHN0cmVhbSkgJiYgbVN0cmVhbXNbaWR4XS5tTmV3VXJpLmVtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBBTE9HVygic3dhcHBpbmcgc3RyZWFtIHR5cGUgJWQgJXMgdG8gZW1wdHkgc3RyZWFtIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgbVN0cmVhbXNbaWR4XS5tVXJpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCB1cmlEZWJ1Z1N0cmluZyhtU3RyZWFtc1tpZHhdLm1VcmkpLmNfc3RyKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbVN0cmVhbXNbaWR4XS5tVXJpID0gbVN0cmVhbXNbaWR4XS5tTmV3VXJpOwogICAgICAgICAgICAgbVN0cmVhbXNbaWR4XS5tTmV3VXJpLmNsZWFyKCk7CkBAIC0yMDMzLDcgKzIwMzQsNyBAQAogICAgICAgICBDSEVDSyhpZHggPj0gMCk7CiAgICAgICAgIGlmIChtU3RyZWFtc1tpZHhdLm1OZXdVcmkuZW1wdHkoKSkgewogICAgICAgICAgICAgQUxPR1coInN3YXBwaW5nIGV4dHJhIHN0cmVhbSB0eXBlICVkICVzIHRvIGVtcHR5IHN0cmVhbSIsCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgbVN0cmVhbXNbaWR4XS5tVXJpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBzdHJlYW0sIHVyaURlYnVnU3RyaW5nKG1TdHJlYW1zW2lkeF0ubVVyaSkuY19zdHIoKSk7CiAgICAgICAgIH0KICAgICAgICAgbVN0cmVhbXNbaWR4XS5tVXJpID0gbVN0cmVhbXNbaWR4XS5tTmV3VXJpOwogICAgICAgICBtU3RyZWFtc1tpZHhdLm1OZXdVcmkuY2xlYXIoKTsKQEAgLTIxMzgsNyArMjEzOSw3IEBACiAgICAgICAgICAgICBBTE9HVigic3RvcHBpbmcgbmV3VXJpID0gJXMiLCBuZXdVcmkuY19zdHIoKSk7CiAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUZldGNoZXJJbmZvcy5pbmRleE9mS2V5KG5ld1VyaSk7CiAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImRpZCBub3QgZmluZCBmZXRjaGVyIGZvciBuZXdVcmk6ICVzIiwgbmV3VXJpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIEFMT0dFKCJkaWQgbm90IGZpbmQgZmV0Y2hlciBmb3IgbmV3VXJpOiAlcyIsIHVyaURlYnVnU3RyaW5nKG5ld1VyaSkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBGZXRjaGVySW5mbyAmaW5mbyA9IG1GZXRjaGVySW5mb3MuZWRpdFZhbHVlQXQoaW5kZXgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL00zVVBhcnNlci5jcHAKaW5kZXggOTc1ZTJiNS4uZTAzMjRlMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvTTNVUGFyc2VyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9NM1VQYXJzZXIuY3BwCkBAIC0yNyw2ICsyNyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZvdW5kYXRpb25VdGlscy5oPgogI2luY2x1ZGUgPG1lZGlhL21lZGlhcGxheWVyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTcwNiw2ICs3MDcsMTIgQEAKICAgICAgICAgKytsaW5lTm87CiAgICAgfQogCisgICAgLy8gcGxheWxpc3QgaGFzIG5vIGl0ZW0sIHdvdWxkIGNhdXNlIGV4Y2VwdGlvbgorICAgIGlmIChtSXRlbXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoInBsYXlsaXN0IGhhcyBubyBpdGVtIik7CisgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgfQorCiAgICAgLy8gZXJyb3IgY2hlY2tpbmcgb2YgYWxsIGZpZWxkcyB0aGF0J3MgcmVxdWlyZWQgdG8gYXBwZWFyIG9uY2UKICAgICAvLyAoY3VycmVudGx5IG9ubHkgY2hlY2tpbmcgInRhcmdldC1kdXJhdGlvbiIpLCBhbmQKICAgICAvLyBpbml0aWFsaXphdGlvbiBvZiBwbGF5bGlzdCBwcm9wZXJ0aWVzIChlZy4gbVRhcmdldER1cmF0aW9uVXMpCkBAIC0xMTk5LDggKzEyMDYsNyBAQAogICAgICAgICAgICAgaWYgKHZhbC5zaXplKCkgPCAyCiAgICAgICAgICAgICAgICAgICAgIHx8IHZhbC5jX3N0cigpWzBdICE9ICciJwogICAgICAgICAgICAgICAgICAgICB8fCB2YWwuY19zdHIoKVt2YWwuc2l6ZSgpIC0gMV0gIT0gJyInKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIHF1b3RlZCBzdHJpbmcgZm9yIFVSSSwgZ290ICclcycgaW5zdGVhZC4iLAotICAgICAgICAgICAgICAgICAgICAgIHZhbC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgcXVvdGVkIHN0cmluZyBmb3IgVVJJLiIpOwogCiAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKICAgICAgICAgICAgIH0KQEAgLTEzOTEsNiArMTM5NywxOSBAQAogICAgICAgICBjYXNlICdRRE1DJzoKICAgICAgICAgY2FzZSAndWxhdyc6CiAgICAgICAgIGNhc2UgJ3ZkdmEnOgorICAgICAgICBjYXNlICdhYy00JzoKKyAgICAgICAgY2FzZSAnT3B1cyc6CisgICAgICAgIGNhc2UgJ2EzZHMnOgorICAgICAgICBjYXNlICdkdHMrJzoKKyAgICAgICAgY2FzZSAnZHRzLSc6CisgICAgICAgIGNhc2UgJ2R0c3gnOgorICAgICAgICBjYXNlICdkdHN5JzoKKyAgICAgICAgY2FzZSAnZWMrMyc6CisgICAgICAgIGNhc2UgJ21oYTEnOgorICAgICAgICBjYXNlICdtaGEyJzoKKyAgICAgICAgY2FzZSAnbWhtMSc6CisgICAgICAgIGNhc2UgJ21obTInOgorICAgICAgICBjYXNlICdzZXZzJzoKICAgICAgICAgICAgIHJldHVybiAhc3RyY21wKCJhdWRpbyIsIHR5cGUpOwogCiAgICAgICAgIGNhc2UgJ2F2YzEnOgpAQCAtMTQzOSw2ICsxNDU4LDM1IEBACiAgICAgICAgIGNhc2UgJ3RnYSAnOgogICAgICAgICBjYXNlICd0aWZmJzoKICAgICAgICAgY2FzZSAnV1JMRSc6CisgICAgICAgIGNhc2UgJ2EzZDEnOgorICAgICAgICBjYXNlICdhM2QyJzoKKyAgICAgICAgY2FzZSAnYTNkMyc6CisgICAgICAgIGNhc2UgJ2EzZDQnOgorICAgICAgICBjYXNlICdhdmMzJzoKKyAgICAgICAgY2FzZSAnYXZjNCc6CisgICAgICAgIGNhc2UgJ2R2YTEnOgorICAgICAgICBjYXNlICdkdmF2JzoKKyAgICAgICAgY2FzZSAnZHZoMSc6CisgICAgICAgIGNhc2UgJ2R2aGUnOgorICAgICAgICBjYXNlICdoZXYxJzoKKyAgICAgICAgY2FzZSAnaGV2Mic6CisgICAgICAgIGNhc2UgJ2h2YzEnOgorICAgICAgICBjYXNlICdodmMyJzoKKyAgICAgICAgY2FzZSAnaHZ0MSc6CisgICAgICAgIGNhc2UgJ2xoZTEnOgorICAgICAgICBjYXNlICdsaHQxJzoKKyAgICAgICAgY2FzZSAnbGh2MSc6CisgICAgICAgIGNhc2UgJ21qcGcnOgorICAgICAgICBjYXNlICdtdmMzJzoKKyAgICAgICAgY2FzZSAnbXZjNCc6CisgICAgICAgIGNhc2UgJ212ZDEnOgorICAgICAgICBjYXNlICdtdmQyJzoKKyAgICAgICAgY2FzZSAnbXZkMyc6CisgICAgICAgIGNhc2UgJ212ZDQnOgorICAgICAgICBjYXNlICdydjYwJzoKKyAgICAgICAgY2FzZSAnc3ZjMic6CisgICAgICAgIGNhc2UgJ3ZwMDgnOgorICAgICAgICBjYXNlICd2cDA5JzoKICAgICAgICAgICAgIHJldHVybiAhc3RyY21wKCJ2aWRlbyIsIHR5cGUpOwogCiAgICAgICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmNwcAppbmRleCA1NjJjNjI1Li40ZDA4NDhhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2h0dHBsaXZlL1BsYXlsaXN0RmV0Y2hlci5jcHAKQEAgLTI4LDE3ICsyOCwxOCBAQAogI2luY2x1ZGUgIm1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIgogI2luY2x1ZGUgIm1wZWcydHMvSGxzU2FtcGxlRGVjcnlwdG9yLmgiCiAKKyNpbmNsdWRlIDxkYXRhc291cmNlL0RhdGFVUklTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCaXRSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYUtleXMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2F2Y191dGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFVUklTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZvdW5kYXRpb25VdGlscy5oPgogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgpAQCAtMTYwLDYgKzE2MSw3IEBACiAgICAgICBtUGxheWxpc3RUaW1lVXMoLTFMTCksCiAgICAgICBtU2VxTnVtYmVyKC0xKSwKICAgICAgIG1OdW1SZXRyaWVzKDApLAorICAgICAgbU51bVJldHJpZXNGb3JNb25pdG9yUXVldWUoMCksCiAgICAgICBtU3RhcnR1cCh0cnVlKSwKICAgICAgIG1JRFJGb3VuZChmYWxzZSksCiAgICAgICBtU2Vla01vZGUoTGl2ZVNlc3Npb246OmtTZWVrTW9kZUV4YWN0UG9zaXRpb24pLApAQCAtMzY1LDEwICszNjcsMTAgQEAKICAgICAgICAgaWYgKGVyciA9PSBFUlJPUl9OT1RfQ09OTkVDVEVEKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTk9UX0NPTk5FQ1RFRDsKICAgICAgICAgfSBlbHNlIGlmIChlcnIgPCAwKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGZldGNoIGNpcGhlciBrZXkgZnJvbSAnJXMnLiIsIGtleVVSSS5jX3N0cigpKTsKKyAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgdG8gZmV0Y2ggY2lwaGVyIGtleSBmcm9tICclcycuIiwgdXJpRGVidWdTdHJpbmcoa2V5VVJJKS5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9JTzsKICAgICAgICAgfSBlbHNlIGlmIChrZXktPnNpemUoKSAhPSAxNikgewotICAgICAgICAgICAgQUxPR0UoImtleSBmaWxlICclcycgd2Fzbid0IDE2IGJ5dGVzIGluIHNpemUuIiwga2V5VVJJLmNfc3RyKCkpOworICAgICAgICAgICAgQUxPR0UoImtleSBmaWxlICclcycgd2Fzbid0IDE2IGJ5dGVzIGluIHNpemUuIiwgdXJpRGVidWdTdHJpbmcoa2V5VVJJKS5jX3N0cigpKTsKICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgIH0KIApAQCAtODQ5LDcgKzg1MSwxNyBAQAogICAgIC8vIGluIHRoZSBtaWRkbGUgb2YgYW4gdW5maW5pc2hlZCBkb3dubG9hZCwgZGVsYXkKICAgICAvLyBwbGF5bGlzdCByZWZyZXNoIGFzIGl0J2xsIGNoYW5nZSBzZXEgbnVtYmVycwogICAgIGlmICghbURvd25sb2FkU3RhdGUtPmhhc1NhdmVkU3RhdGUoKSkgewotICAgICAgICByZWZyZXNoUGxheWxpc3QoKTsKKyAgICAgICAgc3RhdHVzX3QgZXJyID0gcmVmcmVzaFBsYXlsaXN0KCk7CisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIGlmIChtTnVtUmV0cmllc0Zvck1vbml0b3JRdWV1ZSA8IGtNYXhOdW1SZXRyaWVzKSB7CisgICAgICAgICAgICAgICAgKyttTnVtUmV0cmllc0Zvck1vbml0b3JRdWV1ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbm90aWZ5RXJyb3IoZXJyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1OdW1SZXRyaWVzRm9yTW9uaXRvclF1ZXVlID0gMDsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGludDY0X3QgdGFyZ2V0RHVyYXRpb25VcyA9IGtNaW5CdWZmZXJlZER1cmF0aW9uVXM7CkBAIC0xMzY2LDcgKzEzNzgsNyBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChieXRlc1JlYWQgPCAwKSB7CiAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBieXRlc1JlYWQ7Ci0gICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGZldGNoIC50cyBzZWdtZW50IGF0IHVybCAnJXMnIiwgdXJpLmNfc3RyKCkpOworICAgICAgICAgICAgQUxPR0UoImZhaWxlZCB0byBmZXRjaCAudHMgc2VnbWVudCBhdCB1cmwgJyVzJyIsIHVyaURlYnVnU3RyaW5nKHVyaSkuY19zdHIoKSk7CiAgICAgICAgICAgICBub3RpZnlFcnJvcihlcnIpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CkBAIC0yMTI1LDcgKzIxMzcsMTAgQEAKICAgICBzaXplX3Qgb2Zmc2V0ID0gMDsKICAgICB3aGlsZSAob2Zmc2V0IDwgYnVmZmVyLT5zaXplKCkpIHsKICAgICAgICAgY29uc3QgdWludDhfdCAqYWR0c0hlYWRlciA9IGJ1ZmZlci0+ZGF0YSgpICsgb2Zmc2V0OwotICAgICAgICBDSEVDS19MVChvZmZzZXQgKyA1LCBidWZmZXItPnNpemUoKSk7CisgICAgICAgIGlmIChidWZmZXItPnNpemUoKSA8PSBvZmZzZXQrNSkgeworICAgICAgICAgICAgQUxPR1YoImJ1ZmZlciBkb2VzIG5vdCBjb250YWluIGEgY29tcGxldGUgaGVhZGVyIik7CisgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICB9CiAgICAgICAgIC8vIG5vbi1jb25zdCBwb2ludGVyIGZvciBkZWNyeXB0aW9uIGlmIG5lZWRlZAogICAgICAgICB1aW50OF90ICphZHRzRnJhbWUgPSBidWZmZXItPmRhdGEoKSArIG9mZnNldDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaHR0cGxpdmUvUGxheWxpc3RGZXRjaGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaAppbmRleCBkN2RiNTRhLi41ZDNmOWMxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9odHRwbGl2ZS9QbGF5bGlzdEZldGNoZXIuaApAQCAtMTQ1LDYgKzE0NSw3IEBACiAgICAgc3A8TTNVUGFyc2VyPiBtUGxheWxpc3Q7CiAgICAgaW50MzJfdCBtU2VxTnVtYmVyOwogICAgIGludDMyX3QgbU51bVJldHJpZXM7CisgICAgaW50MzJfdCBtTnVtUmV0cmllc0Zvck1vbml0b3JRdWV1ZTsKICAgICBib29sIG1TdGFydHVwOwogICAgIGJvb2wgbUlEUkZvdW5kOwogICAgIGludDMyX3QgbVNlZWtNb2RlOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icAppbmRleCBmOWY4YTNkLi5jODE3M2NmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvQW5kcm9pZC5icApAQCAtMyw2ICszLDExIEBACiAKICAgICBzcmNzOiBbIklEMy5jcHAiXSwKIAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICAgICAgIm1lZGlhX25ka19oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgY2ZsYWdzOiBbCiAgICAgICAgICItV2Vycm9yIiwKICAgICAgICAgIi1XYWxsIiwKQEAgLTI5LDYgKzM0LDcgQEAKICAgICBdLAogCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmRhdGFzb3VyY2UiLAogICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy9JRDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKaW5kZXggMDg1NjA4Yi4uNDI1NDY4ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL0lEMy5jcHAKQEAgLTIxLDYgKzIxLDggQEAKICNpbmNsdWRlICIuLi9pbmNsdWRlL0lEMy5oIgogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luQXBpLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3JQbHVnaW5IZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgpAQCAtMzAsNyArMzIsNyBAQAogCiBzdGF0aWMgY29uc3Qgc2l6ZV90IGtNYXhNZXRhZGF0YVNpemUgPSAzICogMTAyNCAqIDEwMjQ7CiAKLXN0cnVjdCBNZW1vcnlTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZUJhc2Ugeworc3RydWN0IElEMzo6TWVtb3J5U291cmNlIDogcHVibGljIERhdGFTb3VyY2VCYXNlIHsKICAgICBNZW1vcnlTb3VyY2UoY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpCiAgICAgICAgIDogbURhdGEoZGF0YSksCiAgICAgICAgICAgbVNpemUoc2l6ZSkgewpAQCAtNTYsNiArNTgsNTUgQEAKICAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZW1vcnlTb3VyY2UpOwogfTsKIAorY2xhc3MgSUQzOjpEYXRhU291cmNlVW53cmFwcGVyIDogcHVibGljIERhdGFTb3VyY2VCYXNlIHsKKworcHVibGljOgorICAgIGV4cGxpY2l0IERhdGFTb3VyY2VVbndyYXBwZXIoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlaGVscGVyKSB7CisgICAgICAgIG1Tb3VyY2UgPSBzb3VyY2VoZWxwZXI7CisgICAgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3QgeyByZXR1cm4gT0s7IH0KKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtMSBvbiBmYWlsdXJlLiBJdCdzIG5vdCBhbiBlcnJvciBpZgorICAgIC8vIHRoaXMgcmV0dXJucyB6ZXJvOyBpdCBqdXN0IG1lYW5zIHRoZSBnaXZlbiBvZmZzZXQgaXMgZXF1YWwgdG8sIG9yCisgICAgLy8gYmV5b25kLCB0aGUgZW5kIG9mIHRoZSBzb3VyY2UuCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOworICAgIH0KKworICAgIC8vIE1heSByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpIHsKKyAgICAgICAgcmV0dXJuIG1Tb3VyY2UtPmdldFNpemUoc2l6ZSk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGdldFVyaShjaGFyICogLyp1cmlTdHJpbmcqLywgc2l6ZV90IC8qYnVmZmVyU2l6ZSovKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHVpbnQzMl90IGZsYWdzKCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKSB7fTsKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUhlbHBlciAqbVNvdXJjZTsKK307CisKKworSUQzOjpJRDMoRGF0YVNvdXJjZUhlbHBlciAqc291cmNlaGVscGVyLCBib29sIGlnbm9yZVYxLCBvZmY2NF90IG9mZnNldCkKKyAgICA6IG1Jc1ZhbGlkKGZhbHNlKSwKKyAgICAgIG1EYXRhKE5VTEwpLAorICAgICAgbVNpemUoMCksCisgICAgICBtRmlyc3RGcmFtZU9mZnNldCgwKSwKKyAgICAgIG1WZXJzaW9uKElEM19VTktOT1dOKSwKKyAgICAgIG1SYXdTaXplKDApIHsKKyAgICBEYXRhU291cmNlVW53cmFwcGVyIHNvdXJjZShzb3VyY2VoZWxwZXIpOworICAgIG1Jc1ZhbGlkID0gcGFyc2VWMigmc291cmNlLCBvZmZzZXQpOworCisgICAgaWYgKCFtSXNWYWxpZCAmJiAhaWdub3JlVjEpIHsKKyAgICAgICAgbUlzVmFsaWQgPSBwYXJzZVYxKCZzb3VyY2UpOworICAgIH0KK30KKwogSUQzOjpJRDMoRGF0YVNvdXJjZUJhc2UgKnNvdXJjZSwgYm9vbCBpZ25vcmVWMSwgb2ZmNjRfdCBvZmZzZXQpCiAgICAgOiBtSXNWYWxpZChmYWxzZSksCiAgICAgICBtRGF0YShOVUxMKSwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMjZlZWMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAiSUQzVGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbIklEM1Rlc3QuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliZGF0YXNvdXJjZSIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9pZDMiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjNjY5N2QKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIElEMyB1bml0IHRlc3RzIj4KKyAgICA8b3B0aW9uIG5hbWU9InRlc3Qtc3VpdGUtdGFnIiB2YWx1ZT0iSUQzVGVzdCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJJRDNUZXN0LT4vZGF0YS9sb2NhbC90bXAvSUQzVGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvSUQzVGVzdC56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvSUQzVGVzdFJlcy8iIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IklEM1Rlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9JRDNUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9JRDNUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0lEM1Rlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4ZjE0NzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9JRDNUZXN0LmNwcApAQCAtMCwwICsxLDIxNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiSUQzVGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9GaWxlU291cmNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2hleGR1bXAuaD4KKyNpbmNsdWRlIDxJRDMuaD4KKworI2luY2x1ZGUgIklEM1Rlc3RFbnZpcm9ubWVudC5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKKworc3RhdGljIElEM1Rlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK2NsYXNzIElEM3RhZ1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0cmluZz4ge307CitjbGFzcyBJRDN2ZXJzaW9uVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08cGFpcjxzdHJpbmcsIGludD4+IHt9OworY2xhc3MgSUQzdGV4dFRhZ1Rlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHBhaXI8c3RyaW5nLCBpbnQ+PiB7fTsKK2NsYXNzIElEM2FsYnVtQXJ0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08cGFpcjxzdHJpbmcsIGJvb2w+PiB7fTsKK2NsYXNzIElEM211bHRpQWxidW1BcnRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxwYWlyPHN0cmluZywgaW50Pj4ge307CisKK1RFU1RfUChJRDN0YWdUZXN0LCBUYWdUZXN0KSB7CisgICAgc3RyaW5nIHBhdGggPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCk7CisgICAgc3A8RmlsZVNvdXJjZT4gZmlsZSA9IG5ldyBGaWxlU291cmNlKHBhdGguY19zdHIoKSk7CisgICAgQVNTRVJUX0VRKGZpbGUtPmluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spIDw8ICJGaWxlIGluaXRpYWxpemF0aW9uIGZhaWxlZCEgXG4iOworICAgIElEMyB0YWcoZmlsZS5nZXQoKSk7CisgICAgQVNTRVJUX1RSVUUodGFnLmlzVmFsaWQoKSkgPDwgIk5vIHZhbGlkIElEMyB0YWcgZm91bmQgZm9yICIgPDwgcGF0aC5jX3N0cigpIDw8ICJcbiI7CisKKyAgICBJRDM6Okl0ZXJhdG9yIGl0KHRhZywgbnVsbHB0cik7CisgICAgd2hpbGUgKCFpdC5kb25lKCkpIHsKKyAgICAgICAgU3RyaW5nOCBpZDsKKyAgICAgICAgaXQuZ2V0SUQoJmlkKTsKKyAgICAgICAgQVNTRVJUX0dUKGlkLmxlbmd0aCgpLCAwKSA8PCAiTm8gSUQgdGFnIGZvdW5kISBcbiI7CisgICAgICAgIEFMT0dWKCJGb3VuZCBJRCB0YWc6ICVzXG4iLCBTdHJpbmc4KGlkKS5jX3N0cigpKTsKKyAgICAgICAgaXQubmV4dCgpOworICAgIH0KK30KKworVEVTVF9QKElEM3ZlcnNpb25UZXN0LCBWZXJzaW9uVGVzdCkgeworICAgIGludCB2ZXJzaW9uTnVtYmVyID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgc3RyaW5nIHBhdGggPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCkuZmlyc3Q7CisgICAgc3A8YW5kcm9pZDo6RmlsZVNvdXJjZT4gZmlsZSA9IG5ldyBGaWxlU291cmNlKHBhdGguY19zdHIoKSk7CisgICAgQVNTRVJUX0VRKGZpbGUtPmluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spIDw8ICJGaWxlIGluaXRpYWxpemF0aW9uIGZhaWxlZCEgXG4iOworCisgICAgSUQzIHRhZyhmaWxlLmdldCgpKTsKKyAgICBBU1NFUlRfVFJVRSh0YWcuaXNWYWxpZCgpKSA8PCAiTm8gdmFsaWQgSUQzIHRhZyBmb3VuZCBmb3IgIiA8PCBwYXRoLmNfc3RyKCkgPDwgIlxuIjsKKyAgICBBU1NFUlRfVFJVRSh0YWcudmVyc2lvbigpID49IHZlcnNpb25OdW1iZXIpCisgICAgICAgICAgICA8PCAiRXhwZWN0ZWQgdmVyc2lvbjogIiA8PCB0YWcudmVyc2lvbigpIDw8ICIgRm91bmQgdmVyc2lvbjogIiA8PCB2ZXJzaW9uTnVtYmVyOworfQorCitURVNUX1AoSUQzdGV4dFRhZ1Rlc3QsIFRleHRUYWdUZXN0KSB7CisgICAgaW50IG51bVRleHRGcmFtZXMgPSBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBzdHJpbmcgcGF0aCA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKS5maXJzdDsKKyAgICBzcDxhbmRyb2lkOjpGaWxlU291cmNlPiBmaWxlID0gbmV3IEZpbGVTb3VyY2UocGF0aC5jX3N0cigpKTsKKyAgICBBU1NFUlRfRVEoZmlsZS0+aW5pdENoZWNrKCksIChzdGF0dXNfdClPSykgPDwgIkZpbGUgaW5pdGlhbGl6YXRpb24gZmFpbGVkISBcbiI7CisKKyAgICBJRDMgdGFnKGZpbGUuZ2V0KCkpOworICAgIEFTU0VSVF9UUlVFKHRhZy5pc1ZhbGlkKCkpIDw8ICJObyB2YWxpZCBJRDMgdGFnIGZvdW5kIGZvciAiIDw8IHBhdGguY19zdHIoKSA8PCAiXG4iOworICAgIGludCBjb3VudFRleHRGcmFtZXMgPSAwOworICAgIElEMzo6SXRlcmF0b3IgaXQodGFnLCBudWxscHRyKTsKKyAgICB3aGlsZSAoIWl0LmRvbmUoKSkgeworICAgICAgICBTdHJpbmc4IGlkOworICAgICAgICBpdC5nZXRJRCgmaWQpOworICAgICAgICBBU1NFUlRfR1QoaWQubGVuZ3RoKCksIDApOworICAgICAgICBpZiAoaWRbMF0gPT0gJ1QnKSB7CisgICAgICAgICAgICBTdHJpbmc4IHRleHQ7CisgICAgICAgICAgICBjb3VudFRleHRGcmFtZXMrKzsKKyAgICAgICAgICAgIGl0LmdldFN0cmluZygmdGV4dCk7CisgICAgICAgICAgICBBTE9HVigiRm91bmQgdGV4dCBmcmFtZSAlcyA6ICVzIFxuIiwgaWQuc3RyaW5nKCksIHRleHQuc3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIGl0Lm5leHQoKTsKKyAgICB9CisgICAgQVNTRVJUX0VRKGNvdW50VGV4dEZyYW1lcywgbnVtVGV4dEZyYW1lcykKKyAgICAgICAgICAgIDw8ICJFeHBlY3RlZCAiIDw8IG51bVRleHRGcmFtZXMgPDwgIiB0ZXh0IGZyYW1lcywgZm91bmQgIiA8PCBjb3VudFRleHRGcmFtZXM7Cit9CisKK1RFU1RfUChJRDNhbGJ1bUFydFRlc3QsIEFsYnVtQXJ0VGVzdCkgeworICAgIGJvb2wgYWxidW1BcnRQcmVzZW50ID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgc3RyaW5nIHBhdGggPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCkuZmlyc3Q7CisgICAgc3A8YW5kcm9pZDo6RmlsZVNvdXJjZT4gZmlsZSA9IG5ldyBGaWxlU291cmNlKHBhdGguY19zdHIoKSk7CisgICAgQVNTRVJUX0VRKGZpbGUtPmluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spIDw8ICJGaWxlIGluaXRpYWxpemF0aW9uIGZhaWxlZCEgXG4iOworCisgICAgSUQzIHRhZyhmaWxlLmdldCgpKTsKKyAgICBBU1NFUlRfVFJVRSh0YWcuaXNWYWxpZCgpKSA8PCAiTm8gdmFsaWQgSUQzIHRhZyBmb3VuZCBmb3IgIiA8PCBwYXRoLmNfc3RyKCkgPDwgIlxuIjsKKyAgICBzaXplX3QgZGF0YVNpemU7CisgICAgU3RyaW5nOCBtaW1lOworICAgIGNvbnN0IHZvaWQgKmRhdGEgPSB0YWcuZ2V0QWxidW1BcnQoJmRhdGFTaXplLCAmbWltZSk7CisKKyAgICBpZiAoYWxidW1BcnRQcmVzZW50KSB7CisgICAgICAgIGlmIChkYXRhKSB7CisgICAgICAgICAgICBBTE9HVigiRm91bmQgYWxidW0gYXJ0OiBzaXplID0gJXp1IG1pbWUgPSAlcyBcbiIsIGRhdGFTaXplLCBtaW1lLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgICAgICBBU1NFUlRfTkUoZGF0YSwgbnVsbHB0cikgPDwgIkV4cGVjdGVkIGFsYnVtIGFydCwgZm91bmQgbm9uZSEiIDw8IHBhdGg7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQVNTRVJUX0VRKGRhdGEsIG51bGxwdHIpIDw8ICJGb3VuZCBhbGJ1bSBhcnQgd2hlbiBleHBlY3RlZCBub25lISI7CisgICAgfQorI2lmIChMT0dfTkRFQlVHID09IDApCisgICAgaGV4ZHVtcChkYXRhLCBkYXRhU2l6ZSA+IDEyOCA/IDEyOCA6IGRhdGFTaXplKTsKKyNlbmRpZgorfQorCitURVNUX1AoSUQzbXVsdGlBbGJ1bUFydFRlc3QsIE11bHRpQWxidW1BcnRUZXN0KSB7CisgICAgaW50IG51bUFsYnVtQXJ0ID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgc3RyaW5nIHBhdGggPSBnRW52LT5nZXRSZXMoKSArIEdldFBhcmFtKCkuZmlyc3Q7CisgICAgc3A8YW5kcm9pZDo6RmlsZVNvdXJjZT4gZmlsZSA9IG5ldyBGaWxlU291cmNlKHBhdGguY19zdHIoKSk7CisgICAgQVNTRVJUX0VRKGZpbGUtPmluaXRDaGVjaygpLCAoc3RhdHVzX3QpT0spIDw8ICJGaWxlIGluaXRpYWxpemF0aW9uIGZhaWxlZCEgXG4iOworCisgICAgSUQzIHRhZyhmaWxlLmdldCgpKTsKKyAgICBBU1NFUlRfVFJVRSh0YWcuaXNWYWxpZCgpKSA8PCAiTm8gdmFsaWQgSUQzIHRhZyBmb3VuZCBmb3IgIiA8PCBwYXRoLmNfc3RyKCkgPDwgIlxuIjsKKyAgICBpbnQgY291bnQgPSAwOworICAgIElEMzo6SXRlcmF0b3IgaXQodGFnLCBudWxscHRyKTsKKyAgICB3aGlsZSAoIWl0LmRvbmUoKSkgeworICAgICAgICBTdHJpbmc4IGlkOworICAgICAgICBpdC5nZXRJRCgmaWQpOworICAgICAgICBBU1NFUlRfR1QoaWQubGVuZ3RoKCksIDApOworICAgICAgICAvLyBDaGVjayBpZiB0aGUgdGFnIGlzIGFuICJBUElDL1BJQyIgdGFnLgorICAgICAgICBpZiAoU3RyaW5nOChpZCkgPT0gIkFQSUMiIHx8IFN0cmluZzgoaWQpID09ICJQSUMiKSB7CisgICAgICAgICAgICBjb3VudCsrOworICAgICAgICAgICAgc2l6ZV90IGRhdGFTaXplOworICAgICAgICAgICAgU3RyaW5nOCBtaW1lOworICAgICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSA9IHRhZy5nZXRBbGJ1bUFydCgmZGF0YVNpemUsICZtaW1lKTsKKyAgICAgICAgICAgIGlmIChkYXRhKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIkZvdW5kIGFsYnVtIGFydDogc2l6ZSA9ICV6dSBtaW1lID0gJXMgXG4iLCBkYXRhU2l6ZSwgbWltZS5zdHJpbmcoKSk7CisjaWYgKExPR19OREVCVUcgPT0gMCkKKyAgICAgICAgICAgICAgICBoZXhkdW1wKGRhdGEsIGRhdGFTaXplID4gMTI4ID8gMTI4IDogZGF0YVNpemUpOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBBU1NFUlRfTkUoZGF0YSwgbnVsbHB0cikgPDwgIkV4cGVjdGVkIGFsYnVtIGFydCwgZm91bmQgbm9uZSEiIDw8IHBhdGg7CisgICAgICAgIH0KKyAgICAgICAgaXQubmV4dCgpOworICAgIH0KKyAgICBBU1NFUlRfRVEoY291bnQsIG51bUFsYnVtQXJ0KSA8PCAiRm91bmQgIiA8PCBjb3VudCA8PCAiIGFsYnVtIGFydHMsIGV4cGVjdGVkICIgPDwgbnVtQWxidW1BcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGFsYnVtIGFydHMhIFxuIjsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKGlkM1Rlc3RBbGwsIElEM3RhZ1Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlYy5tcDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfMV9pbWFnZS5tcDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfMl9pbWFnZS5tcDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnMubXAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zXzFfaW1hZ2UubXAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zXzJfaW1hZ2UubXAzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zX2xhcmdlU2l6ZS5tcDMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfbW9yZVRleHRGcmFtZXMubXAzIikpOworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIGlkM1Rlc3RBbGwsIElEM3ZlcnNpb25UZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlYy5tcDMiLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfMV9pbWFnZS5tcDMiLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfMl9pbWFnZS5tcDMiLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnMubXAzIiwgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zXzFfaW1hZ2UubXAzIiwgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zXzJfaW1hZ2UubXAzIiwgNCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zX2xhcmdlU2l6ZS5tcDMiLCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfbW9yZVRleHRGcmFtZXMubXAzIiwgNCkpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBpZDNUZXN0QWxsLCBJRDN0ZXh0VGFnVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWMubXAzIiwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjXzFfaW1hZ2UubXAzIiwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjXzJfaW1hZ2UubXAzIiwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zLm1wMyIsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18xX2ltYWdlLm1wMyIsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc18yX2ltYWdlLm1wMyIsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWluc19sYXJnZVNpemUubXAzIiwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjX21vcmVUZXh0RnJhbWVzLm1wMyIsIDUpKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgaWQzVGVzdEFsbCwgSUQzYWxidW1BcnRUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlYy5tcDMiLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjXzFfaW1hZ2UubXAzIiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjXzJfaW1hZ2UubXAzIiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zLm1wMyIsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnNfMV9pbWFnZS5tcDMiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnNfMl9pbWFnZS5tcDMiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnNfbGFyZ2VTaXplLm1wMyIsIHRydWUpKSk7CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgaWQzVGVzdEFsbCwgSUQzbXVsdGlBbGJ1bUFydFRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjLm1wMyIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWlucy5tcDMiLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfMV9pbWFnZS5tcDMiLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnNfMV9pbWFnZS5tcDMiLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWNfMl9pbWFnZS5tcDMiLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnNfMl9pbWFnZS5tcDMiLCAyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnNfbGFyZ2VTaXplLm1wMyIsIDMpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGdFbnYgPSBuZXcgSUQzVGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HSSgiSUQzIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9JRDNUZXN0RW52aXJvbm1lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0lEM1Rlc3RFbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyMjk3MTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdC9JRDNUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0lEM19URVNUX0VOVklST05NRU5UX0hfXworI2RlZmluZSBfX0lEM19URVNUX0VOVklST05NRU5UX0hfXworCisjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKworI2luY2x1ZGUgPGdldG9wdC5oPgorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjbGFzcyBJRDNUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWM6OnRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyAgcHVibGljOgorICAgIElEM1Rlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvIikge30KKworICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIgKl9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQorCisgIHByaXZhdGU6CisgICAgc3RyaW5nIHJlczsKK307CisKK2ludCBJRDNUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJwYXRoIiwgcmVxdWlyZWRfYXJndW1lbnQsIDAsICdQJ30sIHswLCAwLCAwLCAwfX07CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICBpbnQgaW5kZXggPSAwOworICAgICAgICBpbnQgYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJQOiIsIG9wdGlvbnMsICZpbmRleCk7CisgICAgICAgIGlmIChjID09IC0xKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAoYykgeworICAgICAgICAgICAgY2FzZSAnUCc6IHsKKyAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgorICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gX19JRDNfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L1JFQURNRS5tZCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmQ4OTAxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3QvUkVBRE1FLm1kCkBAIC0wLDAgKzEsNDAgQEAKKyMjIE1lZGlhIFRlc3RpbmcgIyMKKy0tLQorIyMjIyBJRDMgVGVzdCA6CitUaGUgSUQzIFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBJRDMgcGFyc2VyIGF2YWlsYWJsZSBpbiBsaWJzdGFnZWZyaWdodC4KKworUnVuIHRoZSBmb2xsb3dpbmcgY29tbWFuZCBpbiB0aGUgaWQzIGZvbGRlciB0byBidWlsZCB0aGUgdGVzdCBzdWl0ZToKK2BgYAorbSBJRDNUZXN0CitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KK2BgYAorYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0L0lEM1Rlc3QvSUQzVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L0lEM1Rlc3QvSUQzVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0L0lEM1Rlc3QuemlwICkuCitEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCisKK2BgYAorYWRiIHB1c2ggSUQzVGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKwordXNhZ2U6IElEM1Rlc3QgLVAgXDxwYXRoX3RvX2ZvbGRlclw+CitgYGAKK2FkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvSUQzVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvSUQzLworYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBJRDNUZXN0IC0tIC0tZW5hYmxlLW1vZHVsZS1keW5hbWljLWRvd25sb2FkPXRydWUKK2BgYApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3RpZDMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaWQzL3Rlc3RpZDMuY3BwCmluZGV4IDg2ZTZhZGYuLjk5ODRkODUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2lkMy90ZXN0aWQzLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pZDMvdGVzdGlkMy5jcHAKQEAgLTIyLDcgKzIyLDcgQEAKICNpbmNsdWRlIDxkaXJlbnQuaD4KIAogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GaWxlU291cmNlLmg+CisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9GaWxlU291cmNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KIAogI2RlZmluZSBNQVhQQVRITEVOIDI1NgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9BQ29kZWNCdWZmZXJDaGFubmVsLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FDb2RlY0J1ZmZlckNoYW5uZWwuaAppbmRleCA3YzAxZTQ1Li4zYTA4N2QxIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FDb2RlY0J1ZmZlckNoYW5uZWwuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0FDb2RlY0J1ZmZlckNoYW5uZWwuaApAQCAtMjUsNyArMjUsNyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfVHlwZXMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vSUNyeXB0by5oPgogI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9DYWxsYmFja0RhdGFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvQ2FsbGJhY2tEYXRhU291cmNlLmgKaW5kZXggOWY0MTNjZC4uZTQyODQ5NCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9DYWxsYmFja0RhdGFTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0NhbGxiYWNrRGF0YVNvdXJjZS5oCkBAIC00MSw3ICs0MSw2IEBACiAgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gbU5hbWU7CiAgICAgfQotICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqbWltZSA9IE5VTEwpOwogICAgIHZpcnR1YWwgc3A8SURhdGFTb3VyY2U+IGdldElEYXRhU291cmNlKCkgY29uc3Q7CiAKIHByaXZhdGU6CkBAIC03MCw3ICs2OSw2IEBACiAgICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgewogICAgICAgICByZXR1cm4gbU5hbWU7CiAgICAgfQotICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqbWltZSA9IE5VTEwpOwogICAgIHZpcnR1YWwgc3A8SURhdGFTb3VyY2U+IGdldElEYXRhU291cmNlKCkgY29uc3Q7CiAKIHByaXZhdGU6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0hUVFBCYXNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5MjQxOTcuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9IVFRQQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgSFRUUF9CQVNFX0hfCi0KLSNkZWZpbmUgSFRUUF9CQVNFX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdHJ1Y3QgSFRUUEJhc2UgOiBwdWJsaWMgRGF0YVNvdXJjZSB7Ci0gICAgZW51bSBGbGFncyB7Ci0gICAgICAgIC8vIERvbid0IGxvZyBhbnkgVVJMcy4KLSAgICAgICAga0ZsYWdJbmNvZ25pdG8gPSAxCi0gICAgfTsKLQotICAgIEhUVFBCYXNlKCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwsCi0gICAgICAgICAgICBvZmY2NF90IG9mZnNldCA9IDApID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCkgPSAwOwotCi0gICAgLy8gUmV0dXJucyB0cnVlIGlmIGJhbmR3aWR0aCBjb3VsZCBzdWNjZXNzZnVsbHkgYmUgZXN0aW1hdGVkLAotICAgIC8vIGZhbHNlIG90aGVyd2lzZS4KLSAgICB2aXJ0dWFsIGJvb2wgZXN0aW1hdGVCYW5kd2lkdGgoaW50MzJfdCAqYmFuZHdpZHRoX2Jwcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldEVzdGltYXRlZEJhbmR3aWR0aEticHMoaW50MzJfdCAqa2Jwcyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldEJhbmR3aWR0aFN0YXRDb2xsZWN0RnJlcShpbnQzMl90IGZyZXFNcyk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgc2V0QmFuZHdpZHRoSGlzdG9yeVNpemUoc2l6ZV90IG51bUhpc3RvcnlJdGVtcyk7Ci0KLSAgICBzdGF0aWMgdm9pZCBSZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCwgdWlkX3QgdWlkLCB1aW50MzJfdCBrVGFnKTsKLSAgICBzdGF0aWMgdm9pZCBVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbnQgc29ja2ZkKTsKLQotICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCwgdWlkX3QgdWlkKTsKLSAgICBzdGF0aWMgdm9pZCBVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCk7Ci0KLSAgICB2aXJ0dWFsIFN0cmluZzggdG9TdHJpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtTmFtZTsKLSAgICB9Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgYWRkQmFuZHdpZHRoTWVhc3VyZW1lbnQoc2l6ZV90IG51bUJ5dGVzLCBpbnQ2NF90IGRlbGF5VXMpOwotICAgIFN0cmluZzggbU5hbWU7Ci0KLXByaXZhdGU6Ci0gICAgc3RydWN0IEJhbmR3aWR0aEVudHJ5IHsKLSAgICAgICAgaW50NjRfdCBtRGVsYXlVczsKLSAgICAgICAgc2l6ZV90IG1OdW1CeXRlczsKLSAgICB9OwotCi0gICAgTXV0ZXggbUxvY2s7Ci0KLSAgICBMaXN0PEJhbmR3aWR0aEVudHJ5PiBtQmFuZHdpZHRoSGlzdG9yeTsKLSAgICBzaXplX3QgbU51bUJhbmR3aWR0aEhpc3RvcnlJdGVtczsKLSAgICBpbnQ2NF90IG1Ub3RhbFRyYW5zZmVyVGltZVVzOwotICAgIHNpemVfdCBtVG90YWxUcmFuc2ZlckJ5dGVzOwotICAgIHNpemVfdCBtTWF4QmFuZHdpZHRoSGlzdG9yeUl0ZW1zOwotCi0gICAgZW51bSB7Ci0gICAgICAgIGtNaW5CYW5kd2lkdGhDb2xsZWN0RnJlcU1zID0gMTAwMCwgICAvLyAxIHNlY29uZAotICAgICAgICBrTWF4QmFuZHdpZHRoQ29sbGVjdEZyZXFNcyA9IDYwMDAwLCAgLy8gb25lIG1pbnV0ZQotICAgIH07Ci0KLSAgICBpbnQ2NF90IG1QcmV2QmFuZHdpZHRoTWVhc3VyZVRpbWVVczsKLSAgICBpbnQzMl90IG1QcmV2RXN0aW1hdGVkQmFuZFdpZHRoS2JwczsKLSAgICBpbnQzMl90IG1CYW5kV2lkdGhDb2xsZWN0RnJlcU1zOwotCi0gICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSFRUUEJhc2UpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBIVFRQX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL0lEMy5oCmluZGV4IDdjMjM5MWUuLjI4NDNhN2EgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSUQzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9JRDMuaApAQCAtMjQsNiArMjQsNyBAQAogCiBjbGFzcyBEYXRhU291cmNlQmFzZTsKIGNsYXNzIFN0cmluZzg7CitjbGFzcyBEYXRhU291cmNlSGVscGVyOwogCiBzdHJ1Y3QgSUQzIHsKICAgICBlbnVtIFZlcnNpb24gewpAQCAtMzUsNiArMzYsNyBAQAogICAgICAgICBJRDNfVjJfNCwKICAgICB9OwogCisgICAgZXhwbGljaXQgSUQzKERhdGFTb3VyY2VIZWxwZXIgKnNvdXJjZSwgYm9vbCBpZ25vcmVWMSA9IGZhbHNlLCBvZmY2NF90IG9mZnNldCA9IDApOwogICAgIGV4cGxpY2l0IElEMyhEYXRhU291cmNlQmFzZSAqc291cmNlLCBib29sIGlnbm9yZVYxID0gZmFsc2UsIG9mZjY0X3Qgb2Zmc2V0ID0gMCk7CiAgICAgSUQzKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBzaXplLCBib29sIGlnbm9yZVYxID0gZmFsc2UpOwogICAgIH5JRDMoKTsKQEAgLTc1LDYgKzc3LDggQEAKICAgICBzaXplX3QgcmF3U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1SYXdTaXplOyB9CiAKIHByaXZhdGU6CisgICAgY2xhc3MgRGF0YVNvdXJjZVVud3JhcHBlcjsKKyAgICBzdHJ1Y3QgTWVtb3J5U291cmNlOwogICAgIGJvb2wgbUlzVmFsaWQ7CiAgICAgdWludDhfdCAqbURhdGE7CiAgICAgc2l6ZV90IG1TaXplOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvTnVDYWNoZWRTb3VyY2UyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0MzlhMWMuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9OdUNhY2hlZFNvdXJjZTIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE1MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBOVV9DQUNIRURfU09VUkNFXzJfSF8KLQotI2RlZmluZSBOVV9DQUNIRURfU09VUkNFXzJfSF8KLQotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlclJlZmxlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0cnVjdCBBTG9vcGVyOwotc3RydWN0IFBhZ2VDYWNoZTsKLQotc3RydWN0IE51Q2FjaGVkU291cmNlMiA6IHB1YmxpYyBEYXRhU291cmNlIHsKLSAgICBzdGF0aWMgc3A8TnVDYWNoZWRTb3VyY2UyPiBDcmVhdGUoCi0gICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLAotICAgICAgICAgICAgY29uc3QgY2hhciAqY2FjaGVDb25maWcgPSBOVUxMLAotICAgICAgICAgICAgYm9vbCBkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrID0gZmFsc2UpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKLQotICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSk7Ci0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOwotCi0gICAgdmlydHVhbCBzcDxEZWNyeXB0SGFuZGxlPiBEcm1Jbml0aWFsaXphdGlvbihjb25zdCBjaGFyKiBtaW1lKTsKLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0VXJpKCk7Ci0KLSAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdDsKLQotICAgIHZpcnR1YWwgU3RyaW5nOCB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHNpemVfdCBjYWNoZWRTaXplKCk7Ci0gICAgc2l6ZV90IGFwcHJveERhdGFSZW1haW5pbmcoc3RhdHVzX3QgKmZpbmFsU3RhdHVzKSBjb25zdDsKLQotICAgIHZvaWQgcmVzdW1lRmV0Y2hpbmdJZk5lY2Vzc2FyeSgpOwotCi0gICAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSBzdXBwb3J0ZWQgb25seSBpZiB0aGUKLSAgICAvLyBkYXRhIHNvdXJjZSBpcyBIVFRQLWJhc2VkOyBvdGhlcndpc2UsIEVSUk9SX1VOU1VQUE9SVEVECi0gICAgLy8gaXMgcmV0dXJuZWQuCi0gICAgc3RhdHVzX3QgZ2V0RXN0aW1hdGVkQmFuZHdpZHRoS2JwcyhpbnQzMl90ICprYnBzKTsKLSAgICBzdGF0dXNfdCBzZXRDYWNoZVN0YXRDb2xsZWN0RnJlcShpbnQzMl90IGZyZXFNcyk7Ci0KLSAgICBzdGF0aWMgdm9pZCBSZW1vdmVDYWNoZVNwZWNpZmljSGVhZGVycygKLSAgICAgICAgICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+ICpoZWFkZXJzLAotICAgICAgICAgICAgU3RyaW5nOCAqY2FjaGVDb25maWcsCi0gICAgICAgICAgICBib29sICpkaXNjb25uZWN0QXRIaWdod2F0ZXJtYXJrKTsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfk51Q2FjaGVkU291cmNlMigpOwotCi1wcml2YXRlOgotICAgIGZyaWVuZCBzdHJ1Y3QgQUhhbmRsZXJSZWZsZWN0b3I8TnVDYWNoZWRTb3VyY2UyPjsKLQotICAgIE51Q2FjaGVkU291cmNlMigKLSAgICAgICAgICAgIGNvbnN0IHNwPERhdGFTb3VyY2U+ICZzb3VyY2UsCi0gICAgICAgICAgICBjb25zdCBjaGFyICpjYWNoZUNvbmZpZywKLSAgICAgICAgICAgIGJvb2wgZGlzY29ubmVjdEF0SGlnaHdhdGVybWFyayk7Ci0KLSAgICBlbnVtIHsKLSAgICAgICAga1BhZ2VTaXplICAgICAgICAgICAgICAgICAgICAgICA9IDY1NTM2LAotICAgICAgICBrRGVmYXVsdEhpZ2hXYXRlclRocmVzaG9sZCAgICAgID0gMjAgKiAxMDI0ICogMTAyNCwKLSAgICAgICAga0RlZmF1bHRMb3dXYXRlclRocmVzaG9sZCAgICAgICA9IDQgKiAxMDI0ICogMTAyNCwKLQotICAgICAgICAvLyBSZWFkIGRhdGEgYWZ0ZXIgYSAxNSBzZWMgdGltZW91dCB3aGV0aGVyIHdlJ3JlIGFjdGl2ZWx5Ci0gICAgICAgIC8vIGZldGNoaW5nIG9yIG5vdC4KLSAgICAgICAga0RlZmF1bHRLZWVwQWxpdmVJbnRlcnZhbFVzICAgICA9IDE1MDAwMDAwLAotICAgIH07Ci0KLSAgICBlbnVtIHsKLSAgICAgICAga1doYXRGZXRjaE1vcmUgID0gJ2ZldGMnLAotICAgICAgICBrV2hhdFJlYWQgICAgICAgPSAncmVhZCcsCi0gICAgfTsKLQotICAgIGVudW0gewotICAgICAgICBrTWF4TnVtUmV0cmllcyA9IDEwLAotICAgIH07Ci0KLSAgICBzcDxEYXRhU291cmNlPiBtU291cmNlOwotICAgIHNwPEFIYW5kbGVyUmVmbGVjdG9yPE51Q2FjaGVkU291cmNlMj4gPiBtUmVmbGVjdG9yOwotICAgIHNwPEFMb29wZXI+IG1Mb29wZXI7Ci0gICAgU3RyaW5nOCBtTmFtZTsKLQotICAgIE11dGV4IG1TZXJpYWxpemVyOwotICAgIG11dGFibGUgTXV0ZXggbUxvY2s7Ci0gICAgQ29uZGl0aW9uIG1Db25kaXRpb247Ci0KLSAgICBQYWdlQ2FjaGUgKm1DYWNoZTsKLSAgICBvZmY2NF90IG1DYWNoZU9mZnNldDsKLSAgICBzdGF0dXNfdCBtRmluYWxTdGF0dXM7Ci0gICAgb2ZmNjRfdCBtTGFzdEFjY2Vzc1BvczsKLSAgICBzcDxBTWVzc2FnZT4gbUFzeW5jUmVzdWx0OwotICAgIGJvb2wgbUZldGNoaW5nOwotICAgIGJvb2wgbURpc2Nvbm5lY3Rpbmc7Ci0gICAgaW50NjRfdCBtTGFzdEZldGNoVGltZVVzOwotCi0gICAgaW50MzJfdCBtTnVtUmV0cmllc0xlZnQ7Ci0KLSAgICBzaXplX3QgbUhpZ2h3YXRlclRocmVzaG9sZEJ5dGVzOwotICAgIHNpemVfdCBtTG93d2F0ZXJUaHJlc2hvbGRCeXRlczsKLQotICAgIC8vIElmIHRoZSBrZWVwLWFsaXZlIGludGVydmFsIGlzIDAsIGtlZXAtYWxpdmVzIGFyZSBkaXNhYmxlZC4KLSAgICBpbnQ2NF90IG1LZWVwQWxpdmVJbnRlcnZhbFVzOwotCi0gICAgYm9vbCBtRGlzY29ubmVjdEF0SGlnaHdhdGVybWFyazsKLQotICAgIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOwotICAgIHZvaWQgb25GZXRjaCgpOwotICAgIHZvaWQgb25SZWFkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKTsKLQotICAgIHZvaWQgZmV0Y2hJbnRlcm5hbCgpOwotICAgIHNzaXplX3QgcmVhZEludGVybmFsKG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSk7Ci0gICAgc3RhdHVzX3Qgc2Vla0ludGVybmFsX2wob2ZmNjRfdCBvZmZzZXQpOwotCi0gICAgc2l6ZV90IGFwcHJveERhdGFSZW1haW5pbmdfbChzdGF0dXNfdCAqZmluYWxTdGF0dXMpIGNvbnN0OwotCi0gICAgdm9pZCByZXN0YXJ0UHJlZmV0Y2hlcklmTmVjZXNzYXJ5X2woCi0gICAgICAgICAgICBib29sIGlnbm9yZUxvd1dhdGVyVGhyZXNob2xkID0gZmFsc2UsIGJvb2wgZm9yY2UgPSBmYWxzZSk7Ci0KLSAgICB2b2lkIHVwZGF0ZUNhY2hlUGFyYW1zRnJvbVN5c3RlbVByb3BlcnR5KCk7Ci0gICAgdm9pZCB1cGRhdGVDYWNoZVBhcmFtc0Zyb21TdHJpbmcoY29uc3QgY2hhciAqcyk7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhOdUNhY2hlZFNvdXJjZTIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBOVV9DQUNIRURfU09VUkNFXzJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2VjdXJlQnVmZmVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NlY3VyZUJ1ZmZlci5oCmluZGV4IGNmNzkzM2EuLmM0NWUwZTUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU2VjdXJlQnVmZmVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9TZWN1cmVCdWZmZXIuaApAQCAtMTgsNyArMTgsNyBAQAogCiAjZGVmaW5lIFNFQ1VSRV9CVUZGRVJfSF8KIAotI2luY2x1ZGUgPG1lZGlhL0lDcnlwdG8uaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1NvZnR3YXJlUmVuZGVyZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCmluZGV4IGMyODY1MTYuLjY0ZGNhNGUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU29mdHdhcmVSZW5kZXJlci5oCkBAIC01MSw3ICs1MSw3IEBACiAgICAgQ29sb3JDb252ZXJ0ZXIgKm1Db252ZXJ0ZXI7CiAgICAgWVVWTW9kZSBtWVVWTW9kZTsKICAgICBzcDxBTmF0aXZlV2luZG93PiBtTmF0aXZlV2luZG93OwotICAgIGludDMyX3QgbVdpZHRoLCBtSGVpZ2h0OworICAgIGludDMyX3QgbVdpZHRoLCBtSGVpZ2h0LCBtU3RyaWRlOwogICAgIGludDMyX3QgbUNyb3BMZWZ0LCBtQ3JvcFRvcCwgbUNyb3BSaWdodCwgbUNyb3BCb3R0b207CiAgICAgaW50MzJfdCBtQ3JvcFdpZHRoLCBtQ3JvcEhlaWdodDsKICAgICBpbnQzMl90IG1Sb3RhdGlvbkRlZ3JlZXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1N0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTQ0ZTFmLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlci5oCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgU1RBR0VGUklHSFRfTUVUQURBVEFfUkVUUklFVkVSX0hfCi0KLSNkZWZpbmUgU1RBR0VGUklHSFRfTUVUQURBVEFfUkVUUklFVkVSX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYU1ldGFkYXRhUmV0cmlldmVySW50ZXJmYWNlLmg+Ci0KLSNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERhdGFTb3VyY2U7Ci1jbGFzcyBNZWRpYUV4dHJhY3RvcjsKLXN0cnVjdCBJbWFnZURlY29kZXI7Ci1zdHJ1Y3QgRnJhbWVSZWN0OwotCi1zdHJ1Y3QgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlciA6IHB1YmxpYyBNZWRpYU1ldGFkYXRhUmV0cmlldmVyQmFzZSB7Ci0gICAgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlcigpOwotICAgIHZpcnR1YWwgflN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIoKTsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZSgKLSAgICAgICAgICAgIGNvbnN0IHNwPElNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmwsCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IHNldERhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGF0YVNvdXJjZShjb25zdCBzcDxEYXRhU291cmNlPiYgc291cmNlLCBjb25zdCBjaGFyICptaW1lKTsKLQotICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gZ2V0RnJhbWVBdFRpbWUoCi0gICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5KTsKLSAgICB2aXJ0dWFsIHNwPElNZW1vcnk+IGdldEltYWdlQXRJbmRleCgKLSAgICAgICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5LCBib29sIHRodW1ibmFpbCk7Ci0gICAgdmlydHVhbCBzcDxJTWVtb3J5PiBnZXRJbWFnZVJlY3RBdEluZGV4KAotICAgICAgICAgICAgaW50IGluZGV4LCBpbnQgY29sb3JGb3JtYXQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pOwotICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RnJhbWVBdEluZGV4KAotICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3A8SU1lbW9yeT4gPiogZnJhbWVzLAotICAgICAgICAgICAgaW50IGZyYW1lSW5kZXgsIGludCBudW1GcmFtZXMsIGludCBjb2xvckZvcm1hdCwgYm9vbCBtZXRhT25seSk7Ci0KLSAgICB2aXJ0dWFsIE1lZGlhQWxidW1BcnQgKmV4dHJhY3RBbGJ1bUFydCgpOwotICAgIHZpcnR1YWwgY29uc3QgY2hhciAqZXh0cmFjdE1ldGFkYXRhKGludCBrZXlDb2RlKTsKLQotcHJpdmF0ZToKLSAgICBzcDxEYXRhU291cmNlPiBtU291cmNlOwotICAgIHNwPElNZWRpYUV4dHJhY3Rvcj4gbUV4dHJhY3RvcjsKLQotICAgIGJvb2wgbVBhcnNlZE1ldGFEYXRhOwotICAgIEtleWVkVmVjdG9yPGludCwgU3RyaW5nOD4gbU1ldGFEYXRhOwotICAgIE1lZGlhQWxidW1BcnQgKm1BbGJ1bUFydDsKLQotICAgIHNwPEltYWdlRGVjb2Rlcj4gbUltYWdlRGVjb2RlcjsKLSAgICBpbnQgbUxhc3RJbWFnZUluZGV4OwotICAgIHZvaWQgcGFyc2VNZXRhRGF0YSgpOwotICAgIHZvaWQgcGFyc2VDb2xvckFzcGVjdHMoY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKLSAgICAvLyBEZWxldGUgYWxidW0gYXJ0IGFuZCBjbGVhciBtZXRhZGF0YS4KLSAgICB2b2lkIGNsZWFyTWV0YWRhdGEoKTsKLQotICAgIHN0YXR1c190IGdldEZyYW1lSW50ZXJuYWwoCi0gICAgICAgICAgICBpbnQ2NF90IHRpbWVVcywgaW50IG51bUZyYW1lcywgaW50IG9wdGlvbiwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5LAotICAgICAgICAgICAgc3A8SU1lbW9yeT4qIG91dEZyYW1lLCBzdGQ6OnZlY3RvcjxzcDxJTWVtb3J5PiA+KiBvdXRGcmFtZXMpOwotICAgIHZpcnR1YWwgc3A8SU1lbW9yeT4gZ2V0SW1hZ2VJbnRlcm5hbCgKLSAgICAgICAgICAgIGludCBpbmRleCwgaW50IGNvbG9yRm9ybWF0LCBib29sIG1ldGFPbmx5LCBib29sIHRodW1ibmFpbCwgRnJhbWVSZWN0KiByZWN0KTsKLQotICAgIFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIoY29uc3QgU3RhZ2VmcmlnaHRNZXRhZGF0YVJldHJpZXZlciAmKTsKLQotICAgIFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIgJm9wZXJhdG9yPSgKLSAgICAgICAgICAgIGNvbnN0IFN0YWdlZnJpZ2h0TWV0YWRhdGFSZXRyaWV2ZXIgJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIFNUQUdFRlJJR0hUX01FVEFEQVRBX1JFVFJJRVZFUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9UaHJvdHRsZWRTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvVGhyb3R0bGVkU291cmNlLmgKaW5kZXggNzFlNjJmNy4uNWFlMDY1MyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9UaHJvdHRsZWRTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL1Rocm90dGxlZFNvdXJjZS5oCkBAIC01NCwxMCArNTQsNiBAQAogICAgICAgICByZXR1cm4gbVNvdXJjZS0+cmVjb25uZWN0QXRPZmZzZXQob2Zmc2V0KTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIgKm1pbWUgPSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBtU291cmNlLT5Ecm1Jbml0aWFsaXphdGlvbihtaW1lKTsKLSAgICB9Ci0KICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtU291cmNlLT5nZXRNSU1FVHlwZSgpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FDb2RlYy5oCmluZGV4IDk3ZDE1YTcuLjc4NGZkMzYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQUNvZGVjLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BQ29kZWMuaApAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL01ldGFkYXRhQnVmZmVyVHlwZS5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhQ29kZWNJbmZvLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Db2RlY0Jhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9GcmFtZVJlbmRlclRyYWNrZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYURlZnMuaD4KQEAgLTEzNyw2ICsxMzcsNyBAQAogICAgICAgICBrV2hhdE9NWERpZWQgICAgICAgICAgICAgICAgID0gJ09NWGQnLAogICAgICAgICBrV2hhdFJlbGVhc2VDb2RlY0luc3RhbmNlICAgID0gJ3JlbEMnLAogICAgICAgICBrV2hhdEZvcmNlU3RhdGVUcmFuc2l0aW9uICAgID0gJ2ZzdHQnLAorICAgICAgICBrV2hhdENoZWNrSWZTdHVjayAgICAgICAgICAgID0gJ0NzdGsnLAogICAgIH07CiAKICAgICBlbnVtIHsKQEAgLTIzNiw2ICsyMzcsOCBAQAogICAgIGFuZHJvaWRfbmF0aXZlX3JlY3RfdCBtTGFzdE5hdGl2ZVdpbmRvd0Nyb3A7CiAgICAgaW50MzJfdCBtTGFzdE5hdGl2ZVdpbmRvd0RhdGFTcGFjZTsKICAgICBIRFJTdGF0aWNJbmZvIG1MYXN0SERSU3RhdGljSW5mbzsKKyAgICBzcDxBQnVmZmVyPiBtSGRyMTBQbHVzU2NyYXRjaEJ1ZmZlcjsKKyAgICBzcDxBQnVmZmVyPiBtTGFzdEhkcjEwUGx1c0J1ZmZlcjsKICAgICBzcDxBTWVzc2FnZT4gbUNvbmZpZ0Zvcm1hdDsKICAgICBzcDxBTWVzc2FnZT4gbUlucHV0Rm9ybWF0OwogICAgIHNwPEFNZXNzYWdlPiBtT3V0cHV0Rm9ybWF0OwpAQCAtMjgzLDEyICsyODYsMTMgQEAKICAgICBkb3VibGUgbUZwczsKICAgICBkb3VibGUgbUNhcHR1cmVGcHM7CiAgICAgYm9vbCBtQ3JlYXRlSW5wdXRCdWZmZXJzU3VzcGVuZGVkOwotICAgIHVpbnQzMl90IG1MYXRlbmN5OworICAgIHN0ZDo6b3B0aW9uYWw8dWludDMyX3Q+IG1MYXRlbmN5OwogCiAgICAgYm9vbCBtVHVubmVsZWQ7CiAKICAgICBPTVhfSU5ERVhUWVBFIG1EZXNjcmliZUNvbG9yQXNwZWN0c0luZGV4OwogICAgIE9NWF9JTkRFWFRZUEUgbURlc2NyaWJlSERSU3RhdGljSW5mb0luZGV4OworICAgIE9NWF9JTkRFWFRZUEUgbURlc2NyaWJlSERSMTBQbHVzSW5mb0luZGV4OwogCiAgICAgc3RkOjpzaGFyZWRfcHRyPEFDb2RlY0J1ZmZlckNoYW5uZWw+IG1CdWZmZXJDaGFubmVsOwogCkBAIC00MjMsNiArNDI3LDExIEBACiAgICAgLy8gdW5zcGVjaWZpZWQgdmFsdWVzLgogICAgIHZvaWQgb25EYXRhU3BhY2VDaGFuZ2VkKGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSwgY29uc3QgQ29sb3JBc3BlY3RzICZhc3BlY3RzKTsKIAorICAgIC8vIG5vdGlmaWVzIHRoZSBjb2RlYyB0aGF0IHRoZSBjb25maWcgd2l0aCB8Y29uZmlnSW5kZXh8IGhhcyBjaGFuZ2VkLCB0aGUgdmFsdWUKKyAgICAvLyBjYW4gYmUgcXVlcmllZCBieSBPTVggZ2V0Q29uZmlnLCBhbmQgdGhlIGNvbmZpZyBzaG91bGQgYmUgYXBwbGllZCB0byB0aGUgbmV4dAorICAgIC8vIG91dHB1dCBidWZmZXIgbm90aWZpZWQgYWZ0ZXIgdGhpcyBjYWxsYmFjay4KKyAgICB2b2lkIG9uQ29uZmlnVXBkYXRlKE9NWF9JTkRFWFRZUEUgY29uZmlnSW5kZXgpOworCiAgICAgLy8gZ2V0cyBpbmRleCBvciBzZXRzIGl0IHRvIDAgb24gZXJyb3IuIFJldHVybnMgZXJyb3IgZnJvbSBjb2RlYy4KICAgICBzdGF0dXNfdCBpbml0RGVzY3JpYmVIRFJTdGF0aWNJbmZvSW5kZXgoKTsKIApAQCAtNDM0LDEyICs0NDMsMjIgQEAKICAgICAvLyBzZXRzIHxwYXJhbXN8LiBSZXR1cm5zIHRoZSBjb2RlYyBlcnJvci4KICAgICBzdGF0dXNfdCBzZXRIRFJTdGF0aWNJbmZvKGNvbnN0IERlc2NyaWJlSERSU3RhdGljSW5mb1BhcmFtcyAmcGFyYW1zKTsKIAorICAgIC8vIHNldHMgfGhkcjEwUGx1c0luZm98LiBSZXR1cm5zIHRoZSBjb2RlYyBlcnJvci4KKyAgICBzdGF0dXNfdCBzZXRIZHIxMFBsdXNJbmZvKGNvbnN0IHNwPEFCdWZmZXI+ICZoZHIxMFBsdXNJbmZvKTsKKwogICAgIC8vIGdldHMgfHBhcmFtc3wuIFJldHVybnMgdGhlIGNvZGVjIGVycm9yLgogICAgIHN0YXR1c190IGdldEhEUlN0YXRpY0luZm8oRGVzY3JpYmVIRFJTdGF0aWNJbmZvUGFyYW1zICZwYXJhbXMpOwogCiAgICAgLy8gZ2V0cyBIRFIgc3RhdGljIGluZm9ybWF0aW9uIGZvciB0aGUgdmlkZW8gZW5jb2Rlci9kZWNvZGVyIHBvcnQgYW5kIHNldHMgdGhlbSBpbnRvIHxmb3JtYXR8LgogICAgIHN0YXR1c190IGdldEhEUlN0YXRpY0luZm9Gb3JWaWRlb0NvZGVjKE9NWF9VMzIgcG9ydEluZGV4LCBzcDxBTWVzc2FnZT4gJmZvcm1hdCk7CiAKKyAgICAvLyBnZXRzIERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyBwYXJhbXMuIElmIHxwYXJhbVNpemVVc2VkfCBpcyB6ZXJvLCBpdCdzCisgICAgLy8gcG9zc2libGUgdGhhdCB0aGUgcmV0dXJuZWQgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zIG9ubHkgaGFzIHRoZQorICAgIC8vIG5QYXJhbVNpemVVc2VkIGZpZWxkIHVwZGF0ZWQsIGJlY2F1c2UgdGhlIHNpemUgb2YgdGhlIHN0b3JhZ2UgaXMgaW5zdWZmaWNpZW50LgorICAgIC8vIEluIHRoaXMgY2FzZSwgZ2V0SERSMTBQbHVzSW5mbygpIHNob3VsZCBiZSBjYWxsZWQgYWdhaW4gd2l0aCB8cGFyYW1TaXplVXNlZHwKKyAgICAvLyBzcGVjaWZpZWQgdG8gdGhlIHByZXZpb3VzIHJldHVybmVkIHZhbHVlLgorICAgIERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyogZ2V0SERSMTBQbHVzSW5mbyhzaXplX3QgcGFyYW1TaXplVXNlZCA9IDApOworCiAgICAgdHlwZWRlZiBzdHJ1Y3QgZHJjUGFyYW1zIHsKICAgICAgICAgaW50MzJfdCBkcmNDdXQ7CiAgICAgICAgIGludDMyX3QgZHJjQm9vc3Q7CkBAIC00NjAsNiArNDc5LDggQEAKIAogICAgIHN0YXR1c190IHNldHVwRUFDM0NvZGVjKGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlKTsKIAorICAgIHN0YXR1c190IHNldHVwQUM0Q29kZWMoYm9vbCBlbmNvZGVyLCBpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUpOworCiAgICAgc3RhdHVzX3Qgc2VsZWN0QXVkaW9Qb3J0Rm9ybWF0KAogICAgICAgICAgICAgT01YX1UzMiBwb3J0SW5kZXgsIE9NWF9BVURJT19DT0RJTkdUWVBFIGRlc2lyZWRGb3JtYXQpOwogCkBAIC00NjcsNyArNDg4LDggQEAKICAgICBzdGF0dXNfdCBzZXR1cEc3MTFDb2RlYyhib29sIGVuY29kZXIsIGludDMyX3Qgc2FtcGxlUmF0ZSwgaW50MzJfdCBudW1DaGFubmVscyk7CiAKICAgICBzdGF0dXNfdCBzZXR1cEZsYWNDb2RlYygKLSAgICAgICAgICAgIGJvb2wgZW5jb2RlciwgaW50MzJfdCBudW1DaGFubmVscywgaW50MzJfdCBzYW1wbGVSYXRlLCBpbnQzMl90IGNvbXByZXNzaW9uTGV2ZWwpOworICAgICAgICAgICAgYm9vbCBlbmNvZGVyLCBpbnQzMl90IG51bUNoYW5uZWxzLCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgY29tcHJlc3Npb25MZXZlbCwKKyAgICAgICAgICAgIEF1ZGlvRW5jb2RpbmcgZW5jb2RpbmcpOwogCiAgICAgc3RhdHVzX3Qgc2V0dXBSYXdBdWRpb0Zvcm1hdCgKICAgICAgICAgICAgIE9NWF9VMzIgcG9ydEluZGV4LCBpbnQzMl90IHNhbXBsZVJhdGUsIGludDMyX3QgbnVtQ2hhbm5lbHMsCkBAIC00NzYsNiArNDk4LDcgQEAKICAgICBzdGF0dXNfdCBzZXRQcmlvcml0eShpbnQzMl90IHByaW9yaXR5KTsKICAgICBzdGF0dXNfdCBzZXRMYXRlbmN5KHVpbnQzMl90IGxhdGVuY3kpOwogICAgIHN0YXR1c190IGdldExhdGVuY3kodWludDMyX3QgKmxhdGVuY3kpOworICAgIHN0YXR1c190IHNldEF1ZGlvUHJlc2VudGF0aW9uKGludDMyX3QgcHJlc2VudGF0aW9uSWQsIGludDMyX3QgcHJvZ3JhbUlkKTsKICAgICBzdGF0dXNfdCBzZXRPcGVyYXRpbmdSYXRlKGZsb2F0IHJhdGVGbG9hdCwgYm9vbCBpc1ZpZGVvKTsKICAgICBzdGF0dXNfdCBnZXRJbnRyYVJlZnJlc2hQZXJpb2QodWludDMyX3QgKmludHJhUmVmcmVzaFBlcmlvZCk7CiAgICAgc3RhdHVzX3Qgc2V0SW50cmFSZWZyZXNoUGVyaW9kKHVpbnQzMl90IGludHJhUmVmcmVzaFBlcmlvZCwgYm9vbCBpbkNvbmZpZ3VyZSk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9mb3VuZGF0aW9uL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGllcmFyY2hpY2FsU3RhdGVNYWNoaW5lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlic3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhpZXJhcmNoaWNhbFN0YXRlTWFjaGluZS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0FIaWVyYXJjaGljYWxTdGF0ZU1hY2hpbmUuaApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9BdWRpb1NvdXJjZS5oCmluZGV4IDIwNmQzMjIuLmFmMDRkYWQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQXVkaW9Tb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0F1ZGlvU291cmNlLmgKQEAgLTQ0LDcgKzQ0LDkgQEAKICAgICAgICAgICAgIHVpbnQzMl90IG91dFNhbXBsZVJhdGUgPSAwLAogICAgICAgICAgICAgdWlkX3QgdWlkID0gLTEsCiAgICAgICAgICAgICBwaWRfdCBwaWQgPSAtMSwKLSAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwKKyAgICAgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3Qgc2VsZWN0ZWRNaWNEaXJlY3Rpb24gPSBNSUNfRElSRUNUSU9OX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgZmxvYXQgc2VsZWN0ZWRNaWNGaWVsZERpbWVuc2lvbiA9IE1JQ19GSUVMRF9ESU1FTlNJT05fTk9STUFMKTsKIAogICAgIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwogCkBAIC02OCw3ICs3MCwxMCBAQAogICAgIHN0YXR1c190IHJlbW92ZUF1ZGlvRGV2aWNlQ2FsbGJhY2soY29uc3Qgc3A8QXVkaW9TeXN0ZW06OkF1ZGlvRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjayk7CiAKICAgICBzdGF0dXNfdCBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CisgICAgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7CisgICAgc3RhdHVzX3Qgc2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOwogCisgICAgc3RhdHVzX3QgZ2V0UG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgY29uc3Q7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5BdWRpb1NvdXJjZSgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9CYXR0ZXJ5Q2hlY2tlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9CYXR0ZXJ5Q2hlY2tlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYzRhYzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0JhdHRlcnlDaGVja2VyLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQkFUVEVSWV9DSEVDS0VSX0hfCisjZGVmaW5lIEJBVFRFUllfQ0hFQ0tFUl9IXworCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBCYXR0ZXJ5Q2hlY2tlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBCYXR0ZXJ5Q2hlY2tlcihjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgaW50NjRfdCB0aW1lb3V0ID0gMzAwMDAwMGxsKTsKKworICAgIHZvaWQgc2V0RXhlY3V0aW5nKGJvb2wgZXhlY3V0aW5nKSB7IG1Jc0V4ZWN1dGluZyA9IGV4ZWN1dGluZzsgfQorICAgIHZvaWQgb25Db2RlY0FjdGl2aXR5KHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBiYXR0ZXJ5T25DYik7CisgICAgdm9pZCBvbkNoZWNrQmF0dGVyeVRpbWVyKGNvbnN0IHNwPEFNZXNzYWdlPiYgbXNnLCBzdGQ6OmZ1bmN0aW9uPHZvaWQoKT4gYmF0dGVyeU9mZkNiKTsKKyAgICB2b2lkIG9uQ2xpZW50UmVtb3ZlZCgpOworCitwcml2YXRlOgorICAgIGNvbnN0IGludDY0X3QgbVRpbWVvdXRVczsKKyAgICBpbnQ2NF90IG1MYXN0QWN0aXZpdHlUaW1lVXM7CisgICAgYm9vbCBtQmF0dGVyeVN0YXROb3RpZmllZDsKKyAgICBpbnQzMl90IG1CYXR0ZXJ5Q2hlY2tlckdlbmVyYXRpb247CisgICAgYm9vbCBtSXNFeGVjdXRpbmc7CisgICAgc3A8QU1lc3NhZ2U+IG1CYXR0ZXJ5Q2hlY2tlck1zZzsKKworICAgIGJvb2wgaXNFeGVjdXRpbmcoKSB7IHJldHVybiBtSXNFeGVjdXRpbmc7IH0KKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEJhdHRlcnlDaGVja2VyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBCQVRURVJZX0NIRUNLRVJfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvQ29sb3JDb252ZXJ0ZXIuaAppbmRleCA1YjM1NDNkLi43NWIwZDhlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0NvbG9yQ29udmVydGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Db2xvckNvbnZlcnRlci5oCkBAIC0zNSwyMSArMzUsMzIgQEAKIAogICAgIGJvb2wgaXNEc3RSR0IoKSBjb25zdDsKIAorICAgIHZvaWQgc2V0U3JjQ29sb3JTcGFjZSh1aW50MzJfdCBzdGFuZGFyZCwgdWludDMyX3QgcmFuZ2UsIHVpbnQzMl90IHRyYW5zZmVyKTsKKwogICAgIHN0YXR1c190IGNvbnZlcnQoCiAgICAgICAgICAgICBjb25zdCB2b2lkICpzcmNCaXRzLAotICAgICAgICAgICAgc2l6ZV90IHNyY1dpZHRoLCBzaXplX3Qgc3JjSGVpZ2h0LAorICAgICAgICAgICAgc2l6ZV90IHNyY1dpZHRoLCBzaXplX3Qgc3JjSGVpZ2h0LCBzaXplX3Qgc3JjU3RyaWRlLAogICAgICAgICAgICAgc2l6ZV90IHNyY0Nyb3BMZWZ0LCBzaXplX3Qgc3JjQ3JvcFRvcCwKICAgICAgICAgICAgIHNpemVfdCBzcmNDcm9wUmlnaHQsIHNpemVfdCBzcmNDcm9wQm90dG9tLAogICAgICAgICAgICAgdm9pZCAqZHN0Qml0cywKLSAgICAgICAgICAgIHNpemVfdCBkc3RXaWR0aCwgc2l6ZV90IGRzdEhlaWdodCwKKyAgICAgICAgICAgIHNpemVfdCBkc3RXaWR0aCwgc2l6ZV90IGRzdEhlaWdodCwgc2l6ZV90IGRzdFN0cmlkZSwKICAgICAgICAgICAgIHNpemVfdCBkc3RDcm9wTGVmdCwgc2l6ZV90IGRzdENyb3BUb3AsCiAgICAgICAgICAgICBzaXplX3QgZHN0Q3JvcFJpZ2h0LCBzaXplX3QgZHN0Q3JvcEJvdHRvbSk7CiAKIHByaXZhdGU6CisgICAgc3RydWN0IENvbG9yU3BhY2UgeworICAgICAgICB1aW50MzJfdCBtU3RhbmRhcmQ7CisgICAgICAgIHVpbnQzMl90IG1SYW5nZTsKKyAgICAgICAgdWludDMyX3QgbVRyYW5zZmVyOworCisgICAgICAgIGJvb2wgaXNCdDcwOSgpOworICAgICAgICBib29sIGlzSnBlZygpOworICAgIH07CisKICAgICBzdHJ1Y3QgQml0bWFwUGFyYW1zIHsKICAgICAgICAgQml0bWFwUGFyYW1zKAogICAgICAgICAgICAgICAgIHZvaWQgKmJpdHMsCi0gICAgICAgICAgICAgICAgc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LAorICAgICAgICAgICAgICAgIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwgc2l6ZV90IHN0cmlkZSwKICAgICAgICAgICAgICAgICBzaXplX3QgY3JvcExlZnQsIHNpemVfdCBjcm9wVG9wLAogICAgICAgICAgICAgICAgIHNpemVfdCBjcm9wUmlnaHQsIHNpemVfdCBjcm9wQm90dG9tLAogICAgICAgICAgICAgICAgIE9NWF9DT0xPUl9GT1JNQVRUWVBFIGNvbG9yRnJvbWF0KTsKQEAgLTY1LDYgKzc2LDcgQEAKICAgICB9OwogCiAgICAgT01YX0NPTE9SX0ZPUk1BVFRZUEUgbVNyY0Zvcm1hdCwgbURzdEZvcm1hdDsKKyAgICBDb2xvclNwYWNlIG1TcmNDb2xvclNwYWNlOwogICAgIHVpbnQ4X3QgKm1DbGlwOwogCiAgICAgdWludDhfdCAqaW5pdENsaXAoKTsKQEAgLTc4LDYgKzkwLDkgQEAKICAgICBzdGF0dXNfdCBjb252ZXJ0WVVWNDIwUGxhbmFyVXNlTGliWVVWKAogICAgICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KTsKIAorICAgIHN0YXR1c190IGNvbnZlcnRZVVY0MjBTZW1pUGxhbmFyVXNlTGliWVVWKAorICAgICAgICAgICAgY29uc3QgQml0bWFwUGFyYW1zICZzcmMsIGNvbnN0IEJpdG1hcFBhcmFtcyAmZHN0KTsKKwogICAgIHN0YXR1c190IGNvbnZlcnRZVVY0MjBQbGFuYXIxNigKICAgICAgICAgICAgIGNvbnN0IEJpdG1hcFBhcmFtcyAmc3JjLCBjb25zdCBCaXRtYXBQYXJhbXMgJmRzdCk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNkM2U1ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZS5oCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBEQVRBX1NPVVJDRV9IXworCisjZGVmaW5lIERBVEFfU09VUkNFX0hfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2VCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvSURhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CisjaW5jbHVkZSA8ZHJtL0RybU1hbmFnZXJDbGllbnQuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIFN0cmluZzg7CisKK2NsYXNzIERhdGFTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZUJhc2UsIHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgeworcHVibGljOgorICAgIERhdGFTb3VyY2UoKSA6IG1XcmFwcGVyKE5VTEwpIHt9CisKKyAgICAvLyByZXR1cm5zIGEgcG9pbnRlciB0byBJRGF0YVNvdXJjZSBpZiBpdCBpcyB3cmFwcGVkLgorICAgIHZpcnR1YWwgc3A8SURhdGFTb3VyY2U+IGdldElEYXRhU291cmNlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFN0cmluZzggdG9TdHJpbmcoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCI8dW5zcGVjaWZpZWQ+Iik7CisgICAgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCByZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IC8qb2Zmc2V0Ki8pIHsKKyAgICAgICAgcmV0dXJuIEVSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKworICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRVcmkoKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCk7CisgICAgfQorCisgICAgdmlydHVhbCBib29sIGdldFVyaShjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKSBmaW5hbCB7CisgICAgICAgIGludCByZXQgPSBzbnByaW50Zih1cmlTdHJpbmcsIGJ1ZmZlclNpemUsICIlcyIsIGdldFVyaSgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gcmV0ID49IDAgJiYgc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXQpIDwgYnVmZmVyU2l6ZTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCJhcHBsaWNhdGlvbi9vY3RldC1zdHJlYW0iKTsKKyAgICB9CisKKyAgICBDRGF0YVNvdXJjZSAqd3JhcCgpIHsKKyAgICAgICAgaWYgKG1XcmFwcGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgICAgIH0KKyAgICAgICAgbVdyYXBwZXIgPSBuZXcgQ0RhdGFTb3VyY2UoKTsKKyAgICAgICAgbVdyYXBwZXItPmhhbmRsZSA9IHRoaXM7CisKKyAgICAgICAgbVdyYXBwZXItPnJlYWRBdCA9IFtdKHZvaWQgKmhhbmRsZSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKSAtPiBzc2l6ZV90IHsKKyAgICAgICAgICAgIHJldHVybiAoKERhdGFTb3VyY2UqKWhhbmRsZSktPnJlYWRBdChvZmZzZXQsIGRhdGEsIHNpemUpOworICAgICAgICB9OworICAgICAgICBtV3JhcHBlci0+Z2V0U2l6ZSA9IFtdKHZvaWQgKmhhbmRsZSwgb2ZmNjRfdCAqc2l6ZSkgLT4gc3RhdHVzX3QgeworICAgICAgICAgICAgcmV0dXJuICgoRGF0YVNvdXJjZSopaGFuZGxlKS0+Z2V0U2l6ZShzaXplKTsKKyAgICAgICAgfTsKKyAgICAgICAgbVdyYXBwZXItPmZsYWdzID0gW10odm9pZCAqaGFuZGxlKSAtPiB1aW50MzJfdCB7CisgICAgICAgICAgICByZXR1cm4gKChEYXRhU291cmNlKiloYW5kbGUpLT5mbGFncygpOworICAgICAgICB9OworICAgICAgICBtV3JhcHBlci0+Z2V0VXJpID0gW10odm9pZCAqaGFuZGxlLCBjaGFyICp1cmlTdHJpbmcsIHNpemVfdCBidWZmZXJTaXplKSAtPiBib29sIHsKKyAgICAgICAgICAgIHJldHVybiAoKERhdGFTb3VyY2UqKWhhbmRsZSktPmdldFVyaSh1cmlTdHJpbmcsIGJ1ZmZlclNpemUpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+RGF0YVNvdXJjZSgpIHsKKyAgICAgICAgZGVsZXRlIG1XcmFwcGVyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDRGF0YVNvdXJjZSAqbVdyYXBwZXI7CisgICAgRGF0YVNvdXJjZShjb25zdCBEYXRhU291cmNlICYpOworICAgIERhdGFTb3VyY2UgJm9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlICYpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBEQVRBX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2MDdjOTEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VCYXNlLmgKQEAgLTAsMCArMSwxNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIERBVEFfU09VUkNFX0JBU0VfSF8KKworI2RlZmluZSBEQVRBX1NPVVJDRV9CQVNFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0J5dGVVdGlscy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgU3RyaW5nODsKKworY2xhc3MgRGF0YVNvdXJjZUJhc2UgeworcHVibGljOgorICAgIGVudW0gRmxhZ3MgeworICAgICAgICBrV2FudHNQcmVmZXRjaGluZyAgICAgID0gMSwKKyAgICAgICAga1N0cmVhbWVkRnJvbUxvY2FsSG9zdCA9IDIsCisgICAgICAgIGtJc0NhY2hpbmdEYXRhU291cmNlICAgPSA0LAorICAgICAgICBrSXNIVFRQQmFzZWRTb3VyY2UgICAgID0gOCwKKyAgICAgICAga0lzTG9jYWxGaWxlU291cmNlICAgICA9IDE2LAorICAgIH07CisKKyAgICBEYXRhU291cmNlQmFzZSgpIHt9CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0ID0gMDsKKworICAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZWFkLCBvciAtMSBvbiBmYWlsdXJlLiBJdCdzIG5vdCBhbiBlcnJvciBpZgorICAgIC8vIHRoaXMgcmV0dXJucyB6ZXJvOyBpdCBqdXN0IG1lYW5zIHRoZSBnaXZlbiBvZmZzZXQgaXMgZXF1YWwgdG8sIG9yCisgICAgLy8gYmV5b25kLCB0aGUgZW5kIG9mIHRoZSBzb3VyY2UuCisgICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpID0gMDsKKworICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZHM6CisgICAgYm9vbCBnZXRVSW50MTYob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4KSB7CisgICAgICAgICp4ID0gMDsKKworICAgICAgICB1aW50OF90IGJ5dGVbMl07CisgICAgICAgIGlmIChyZWFkQXQob2Zmc2V0LCBieXRlLCAyKSAhPSAyKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAqeCA9IChieXRlWzBdIDw8IDgpIHwgYnl0ZVsxXTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gMyBieXRlIGludCwgcmV0dXJuZWQgYXMgYSAzMi1iaXQgaW50CisgICAgYm9vbCBnZXRVSW50MjQob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KSB7CisgICAgICAgICp4ID0gMDsKKworICAgICAgICB1aW50OF90IGJ5dGVbM107CisgICAgICAgIGlmIChyZWFkQXQob2Zmc2V0LCBieXRlLCAzKSAhPSAzKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAqeCA9IChieXRlWzBdIDw8IDE2KSB8IChieXRlWzFdIDw8IDgpIHwgYnl0ZVsyXTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgYm9vbCBnZXRVSW50MzIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4KSB7CisgICAgICAgICp4ID0gMDsKKworICAgICAgICB1aW50MzJfdCB0bXA7CisgICAgICAgIGlmIChyZWFkQXQob2Zmc2V0LCAmdG1wLCA0KSAhPSA0KSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICAqeCA9IG50b2hsKHRtcCk7CisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGJvb2wgZ2V0VUludDY0KG9mZjY0X3Qgb2Zmc2V0LCB1aW50NjRfdCAqeCkgeworICAgICAgICAqeCA9IDA7CisKKyAgICAgICAgdWludDY0X3QgdG1wOworICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgOCkgIT0gOCkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgKnggPSBudG9oNjQodG1wKTsKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvLyByZWFkIGVpdGhlciBpbnQ8Tj4gb3IgaW50PDJOPiBpbnRvIGEgdWludDwyTj5fdCwgc2l6ZSBpcyB0aGUgaW50IHNpemUgaW4gYnl0ZXMuCisgICAgYm9vbCBnZXRVSW50MTZWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQxNl90ICp4LCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA9PSAyKSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VUludDE2KG9mZnNldCwgeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPT0gMSkgeworICAgICAgICAgICAgdWludDhfdCB0bXA7CisgICAgICAgICAgICBpZiAocmVhZEF0KG9mZnNldCwgJnRtcCwgMSkgPT0gMSkgeworICAgICAgICAgICAgICAgICp4ID0gdG1wOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgYm9vbCBnZXRVSW50MzJWYXIob2ZmNjRfdCBvZmZzZXQsIHVpbnQzMl90ICp4LCBzaXplX3Qgc2l6ZSkgeworICAgICAgICBpZiAoc2l6ZSA9PSA0KSB7CisgICAgICAgICAgICByZXR1cm4gZ2V0VUludDMyKG9mZnNldCwgeCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemUgPT0gMikgeworICAgICAgICAgICAgdWludDE2X3QgdG1wOworICAgICAgICAgICAgaWYgKGdldFVJbnQxNihvZmZzZXQsICZ0bXApKSB7CisgICAgICAgICAgICAgICAgKnggPSB0bXA7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBib29sIGdldFVJbnQ2NFZhcihvZmY2NF90IG9mZnNldCwgdWludDY0X3QgKngsIHNpemVfdCBzaXplKSB7CisgICAgICAgIGlmIChzaXplID09IDgpIHsKKyAgICAgICAgICAgIHJldHVybiBnZXRVSW50NjQob2Zmc2V0LCB4KTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc2l6ZSA9PSA0KSB7CisgICAgICAgICAgICB1aW50MzJfdCB0bXA7CisgICAgICAgICAgICBpZiAoZ2V0VUludDMyKG9mZnNldCwgJnRtcCkpIHsKKyAgICAgICAgICAgICAgICAqeCA9IHRtcDsKKyAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gTWF5IHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRC4KKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqc2l6ZSkgeworICAgICAgICAqc2l6ZSA9IDA7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgZ2V0VXJpKGNoYXIgKiAvKnVyaVN0cmluZyovLCBzaXplX3QgLypidWZmZXJTaXplKi8pIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBjbG9zZSgpIHt9OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRBdmFpbGFibGVTaXplKG9mZjY0X3QgLypvZmZzZXQqLywgb2ZmNjRfdCAqIC8qc2l6ZSovKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5EYXRhU291cmNlQmFzZSgpIHt9CisKK3ByaXZhdGU6CisgICAgRGF0YVNvdXJjZUJhc2UoY29uc3QgRGF0YVNvdXJjZUJhc2UgJik7CisgICAgRGF0YVNvdXJjZUJhc2UgJm9wZXJhdG9yPShjb25zdCBEYXRhU291cmNlQmFzZSAmKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gREFUQV9TT1VSQ0VfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTFkNDkxLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRGF0YVNvdXJjZUZhY3RvcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaWZuZGVmIERBVEFfU09VUkNFX0ZBQ1RPUllfSF8KLQotI2RlZmluZSBEQVRBX1NPVVJDRV9GQUNUT1JZX0hfCi0KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IE1lZGlhSFRUUFNlcnZpY2U7Ci1jbGFzcyBTdHJpbmc4Owotc3RydWN0IEhUVFBCYXNlOwotCi1jbGFzcyBEYXRhU291cmNlRmFjdG9yeSB7Ci1wdWJsaWM6Ci0gICAgc3RhdGljIHNwPERhdGFTb3VyY2U+IENyZWF0ZUZyb21VUkkoCi0gICAgICAgICAgICBjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UsCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycyA9IE5VTEwsCi0gICAgICAgICAgICBTdHJpbmc4ICpjb250ZW50VHlwZSA9IE5VTEwsCi0gICAgICAgICAgICBIVFRQQmFzZSAqaHR0cFNvdXJjZSA9IE5VTEwpOwotCi0gICAgc3RhdGljIHNwPERhdGFTb3VyY2U+IENyZWF0ZU1lZGlhSFRUUChjb25zdCBzcDxNZWRpYUhUVFBTZXJ2aWNlPiAmaHR0cFNlcnZpY2UpOwotICAgIHN0YXRpYyBzcDxEYXRhU291cmNlPiBDcmVhdGVGcm9tRmQoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBEQVRBX1NPVVJDRV9GQUNUT1JZX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjA0ODkwLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRmlsZVNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgRklMRV9TT1VSQ0VfSF8KLQotI2RlZmluZSBGSUxFX1NPVVJDRV9IXwotCi0jaW5jbHVkZSA8c3RkaW8uaD4KLQotI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL3RocmVhZHMuaD4KLSNpbmNsdWRlIDxkcm0vRHJtTWFuYWdlckNsaWVudC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEZpbGVTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZSB7Ci1wdWJsaWM6Ci0gICAgRmlsZVNvdXJjZShjb25zdCBjaGFyICpmaWxlbmFtZSk7Ci0gICAgLy8gRmlsZVNvdXJjZSB0YWtlcyBvd25lcnNoaXAgYW5kIHdpbGwgY2xvc2UgdGhlIGZkCi0gICAgRmlsZVNvdXJjZShpbnQgZmQsIGludDY0X3Qgb2Zmc2V0LCBpbnQ2NF90IGxlbmd0aCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwotCi0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIHsKLSAgICAgICAgcmV0dXJuIGtJc0xvY2FsRmlsZVNvdXJjZTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHNwPERlY3J5cHRIYW5kbGU+IERybUluaXRpYWxpemF0aW9uKGNvbnN0IGNoYXIgKm1pbWUpOwotCi0gICAgdmlydHVhbCBTdHJpbmc4IHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gbU5hbWU7Ci0gICAgfQotCi0gICAgc3RhdGljIGJvb2wgcmVxdWlyZXNEcm0oaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgsIGNvbnN0IGNoYXIgKm1pbWUpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCB+RmlsZVNvdXJjZSgpOwotCi1wcml2YXRlOgotICAgIGludCBtRmQ7Ci0gICAgaW50NjRfdCBtT2Zmc2V0OwotICAgIGludDY0X3QgbUxlbmd0aDsKLSAgICBNdXRleCBtTG9jazsKLSAgICBTdHJpbmc4IG1OYW1lOwotCi0gICAgLypmb3IgRFJNKi8KLSAgICBzcDxEZWNyeXB0SGFuZGxlPiBtRGVjcnlwdEhhbmRsZTsKLSAgICBEcm1NYW5hZ2VyQ2xpZW50ICptRHJtTWFuYWdlckNsaWVudDsKLSAgICBpbnQ2NF90IG1Ecm1CdWZPZmZzZXQ7Ci0gICAgc3NpemVfdCBtRHJtQnVmU2l6ZTsKLSAgICB1bnNpZ25lZCBjaGFyICptRHJtQnVmOwotCi0gICAgc3NpemVfdCByZWFkQXREUk0ob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKLQotICAgIEZpbGVTb3VyY2UoY29uc3QgRmlsZVNvdXJjZSAmKTsKLSAgICBGaWxlU291cmNlICZvcGVyYXRvcj0oY29uc3QgRmlsZVNvdXJjZSAmKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAgLy8gRklMRV9TT1VSQ0VfSF8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9Gb3VuZGF0aW9uVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRm91bmRhdGlvblV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTU0ODk4MQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvRm91bmRhdGlvblV0aWxzLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgRk9VTkRBVElPTl9VVElMU19IXworCisjZGVmaW5lIEZPVU5EQVRJT05fVVRJTFNfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK0FTdHJpbmcgTWFrZVVzZXJBZ2VudCgpOworCitBU3RyaW5nIHVyaURlYnVnU3RyaW5nKGNvbnN0IEFTdHJpbmcgJnVyaSwgYm9vbCBpbmNvZ25pdG8gPSBmYWxzZSk7CisKK0FTdHJpbmcgbmFtZUZvckZkKGludCBmZCk7Cit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEZPVU5EQVRJT05fVVRJTFNfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaAppbmRleCBmMGViZDQ4Li5iODNhOTU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oCkBAIC0xOCw3ICsxOCw2IEBACiAjZGVmaW5lIElOVEVSRkFDRV9VVElMU19IXwogCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUV4dHJhY3Rvci5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NUEVHNFdyaXRlci5oCmluZGV4IGYxODk0MGQuLjZmMTkwMjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzRXcml0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmgKQEAgLTgyLDEwICs4Miw2IEBACiAgICAgICAgIGtXaGF0U3dpdGNoICAgICAgICAgICAgICAgICAgICAgICAgICA9ICdzd2NoJywKICAgICB9OwogCi0gICAgZW51bSB7Ci0gICAgICAgIGtNYXhDdHRzT2Zmc2V0VGltZVVzID0gMTAwMDAwMExMLCAgLy8gMSBzZWNvbmQKLSAgICB9OwotCiAgICAgaW50ICBtRmQ7CiAgICAgaW50IG1OZXh0RmQ7CiAgICAgc3A8TWV0YURhdGE+IG1TdGFydE1ldGE7CkBAIC0xMTAsNiArMTA2LDcgQEAKICAgICB1aW50MzJfdCBtSW50ZXJsZWF2ZUR1cmF0aW9uVXM7CiAgICAgaW50MzJfdCBtVGltZVNjYWxlOwogICAgIGludDY0X3QgbVN0YXJ0VGltZXN0YW1wVXM7CisgICAgaW50MzJfdCBtU3RhcnRUaW1lT2Zmc2V0QkZyYW1lc1VzOyAvLyBTdGFydCB0aW1lIG9mZnNldCB3aGVuIEIgRnJhbWVzIGFyZSBwcmVzZW50CiAgICAgaW50IG1MYXRpdHVkZXgxMDAwMDsKICAgICBpbnQgbUxvbmdpdHVkZXgxMDAwMDsKICAgICBib29sIG1BcmVHZW9UYWdzQXZhaWxhYmxlOwpAQCAtMTI5LDYgKzEyNiw3IEBACiAKICAgICB2b2lkIHNldFN0YXJ0VGltZXN0YW1wVXMoaW50NjRfdCB0aW1lVXMpOwogICAgIGludDY0X3QgZ2V0U3RhcnRUaW1lc3RhbXBVcygpOyAgLy8gTm90IGNvbnN0CisgICAgaW50MzJfdCBnZXRTdGFydFRpbWVPZmZzZXRCRnJhbWVzVXMoKTsKICAgICBzdGF0dXNfdCBzdGFydFRyYWNrcyhNZXRhRGF0YSAqcGFyYW1zKTsKICAgICBzaXplX3QgbnVtVHJhY2tzKCk7CiAgICAgaW50NjRfdCBlc3RpbWF0ZU1vb3ZCb3hTaXplKGludDMyX3QgYml0UmF0ZSk7CkBAIC0yNTUsNyArMjUzLDkgQEAKICAgICB2b2lkIGluaXRJbnRlcm5hbChpbnQgZmQsIGJvb2wgaXNGaXJzdFNlc3Npb24pOwogCiAgICAgLy8gQWNxdWlyZSBsb2NrIGJlZm9yZSBjYWxsaW5nIHRoZXNlIG1ldGhvZHMKLSAgICBvZmY2NF90IGFkZFNhbXBsZV9sKE1lZGlhQnVmZmVyICpidWZmZXIsIGJvb2wgdXNlUHJlZml4LCBib29sIGlzRXhpZiwgc2l6ZV90ICpieXRlc1dyaXR0ZW4pOworICAgIG9mZjY0X3QgYWRkU2FtcGxlX2woCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqYnVmZmVyLCBib29sIHVzZVByZWZpeCwKKyAgICAgICAgICAgIHVpbnQzMl90IHRpZmZIZHJPZmZzZXQsIHNpemVfdCAqYnl0ZXNXcml0dGVuKTsKICAgICB2b2lkIGFkZExlbmd0aFByZWZpeGVkU2FtcGxlX2woTWVkaWFCdWZmZXIgKmJ1ZmZlcik7CiAgICAgdm9pZCBhZGRNdWx0aXBsZUxlbmd0aFByZWZpeGVkU2FtcGxlc19sKE1lZGlhQnVmZmVyICpidWZmZXIpOwogICAgIHVpbnQxNl90IGFkZFByb3BlcnR5X2woY29uc3QgSXRlbVByb3BlcnR5ICYpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAxZDQ5YzFhLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaAorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLS4uLy4uLy4uLy4uL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2U2M2FlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oCkBAIC0wLDAgKzEsMjMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9CVUZGRVJfSF8KKworI2RlZmluZSBNRURJQV9CVUZGRVJfSF8KKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxsaXN0PgorCisjaW5jbHVkZSA8cHRocmVhZC5oPgorCisjaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQUJ1ZmZlcjsKK2NsYXNzIE1lZGlhQnVmZmVyOworY2xhc3MgTWVkaWFCdWZmZXJPYnNlcnZlcjsKK2NsYXNzIE1ldGFEYXRhQmFzZTsKKworY2xhc3MgTWVkaWFCdWZmZXIgOiBwdWJsaWMgTWVkaWFCdWZmZXJCYXNlIHsKK3B1YmxpYzoKKyAgICAvLyBhbGxvY2F0aW9ucyBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byB0aGlzIHdpbGwgdXNlIHNoYXJlZCBtZW1vcnkuCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrU2hhcmVkTWVtVGhyZXNob2xkID0gNjQgKiAxMDI0OworCisgICAgLy8gVGhlIHVuZGVybHlpbmcgZGF0YSByZW1haW5zIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIQorICAgIE1lZGlhQnVmZmVyKHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIGV4cGxpY2l0IE1lZGlhQnVmZmVyKHNpemVfdCBzaXplKTsKKworICAgIGV4cGxpY2l0IE1lZGlhQnVmZmVyKGNvbnN0IHNwPEFCdWZmZXI+ICZidWZmZXIpOworI2lmbmRlZiBOT19JTUVNT1JZCisgICAgTWVkaWFCdWZmZXIoY29uc3Qgc3A8SU1lbW9yeT4gJm1lbSkgOgorICAgICAgICBNZWRpYUJ1ZmZlcigodWludDhfdCAqKW1lbS0+cG9pbnRlcigpICsgc2l6ZW9mKFNoYXJlZENvbnRyb2wpLCBtZW0tPnNpemUoKSkgeworICAgICAgICAvLyBkZWxlZ2F0ZSBhbmQgb3ZlcnJpZGUgbU1lbW9yeQorICAgICAgICBtTWVtb3J5ID0gbWVtOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gSWYgTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIGRlY3JlbWVudCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50OworICAgIC8vIGlmIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gMCwgcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlCisgICAgLy8gYXNzb2NpYXRlZCBNZWRpYUJ1ZmZlckdyb3VwLgorICAgIC8vCisgICAgLy8gSWYgbm8gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSB6ZXJvCisgICAgLy8gd2hlbiBjYWxsZWQsIHdoZXJldXBvbiB0aGUgTWVkaWFCdWZmZXIgaXMgZGVsZXRlZC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpOworCisgICAgLy8gSW5jcmVtZW50cyB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50LgorICAgIC8vIFVzZSBvbmx5IHdoZW4gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQuCisgICAgdmlydHVhbCB2b2lkIGFkZF9yZWYoKTsKKworICAgIHZpcnR1YWwgdm9pZCAqZGF0YSgpIGNvbnN0OworICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdDsKKworICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX29mZnNldCgpIGNvbnN0OworICAgIHZpcnR1YWwgc2l6ZV90IHJhbmdlX2xlbmd0aCgpIGNvbnN0OworCisgICAgdmlydHVhbCB2b2lkIHNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKTsKKworICAgIE1ldGFEYXRhQmFzZSYgbWV0YV9kYXRhKCk7CisKKyAgICAvLyBDbGVhcnMgbWV0YSBkYXRhIGFuZCByZXNldHMgdGhlIHJhbmdlIHRvIHRoZSBmdWxsIGV4dGVudC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKworICAgIHZpcnR1YWwgdm9pZCBzZXRPYnNlcnZlcihNZWRpYUJ1ZmZlck9ic2VydmVyICpncm91cCk7CisKKyAgICAvLyBzdW0gb2YgbG9jYWxSZWZjb3VudCgpIGFuZCByZW1vdGVSZWZjb3VudCgpCisgICAgLy8gUmVzdWx0IHNob3VsZCBiZSB0cmVhdGVkIGFzIGFwcHJveGltYXRlIHVubGVzcyB0aGUgcmVzdWx0IHByZWNsdWRlcyBjb25jdXJyZW50IGFjY2Vzc2VzLgorICAgIHZpcnR1YWwgaW50IHJlZmNvdW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbG9jYWxSZWZjb3VudCgpICsgcmVtb3RlUmVmY291bnQoKTsKKyAgICB9CisKKyAgICAvLyBSZXN1bHQgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYXBwcm94aW1hdGUgdW5sZXNzIHRoZSByZXN1bHQgcHJlY2x1ZGVzIGNvbmN1cnJlbnQgYWNjZXNzZXMuCisgICAgdmlydHVhbCBpbnQgbG9jYWxSZWZjb3VudCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1SZWZDb3VudC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIH0KKworICAgIHZpcnR1YWwgaW50IHJlbW90ZVJlZmNvdW50KCkgY29uc3QgeworI2lmbmRlZiBOT19JTUVNT1JZCisgICAgICAgIGlmIChtTWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbU1lbW9yeS0+cG9pbnRlcigpID09IG51bGxwdHIpIHJldHVybiAwOworICAgICAgICBpbnQzMl90IHJlbW90ZVJlZmNvdW50ID0KKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFNoYXJlZENvbnRyb2wgKj4obU1lbW9yeS0+cG9pbnRlcigpKS0+Z2V0UmVtb3RlUmVmY291bnQoKTsKKyAgICAgICAgLy8gU2FuaXR5IGNoZWNrIHNvIHRoYXQgcmVtb3RlUmVmQ291bnQoKSBpcyBub24tbmVnYXRpdmUuCisgICAgICAgIHJldHVybiByZW1vdGVSZWZjb3VudCA+PSAwID8gcmVtb3RlUmVmY291bnQgOiAwOyAvLyBkbyBub3QgYWxsb3cgY29ycnVwdGVkIGRhdGEuCisjZWxzZQorICAgICAgICByZXR1cm4gMDsKKyNlbmRpZgorICAgIH0KKworICAgIC8vIHJldHVybnMgb2xkIHZhbHVlCisgICAgaW50IGFkZFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKKyNpZm5kZWYgTk9fSU1FTU9SWQorICAgICAgICBpZiAobU1lbW9yeS5nZXQoKSA9PSBudWxscHRyIHx8IG1NZW1vcnktPnBvaW50ZXIoKSA9PSBudWxscHRyKSByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpLT5hZGRSZW1vdGVSZWZjb3VudCh2YWx1ZSk7CisjZWxzZQorICAgICAgICAodm9pZCkgdmFsdWU7CisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisgICAgfQorCisgICAgYm9vbCBpc0RlYWRPYmplY3QoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpc0RlYWRPYmplY3QobU1lbW9yeSk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNEZWFkT2JqZWN0KGNvbnN0IHNwPElNZW1vcnk+ICZtZW1vcnkpIHsKKyNpZm5kZWYgTk9fSU1FTU9SWQorICAgICAgICBpZiAobWVtb3J5LmdldCgpID09IG51bGxwdHIgfHwgbWVtb3J5LT5wb2ludGVyKCkgPT0gbnVsbHB0cikgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxTaGFyZWRDb250cm9sICo+KG1lbW9yeS0+cG9pbnRlcigpKS0+aXNEZWFkT2JqZWN0KCk7CisjZWxzZQorICAgICAgICAodm9pZCkgbWVtb3J5OworICAgICAgICByZXR1cm4gZmFsc2U7CisjZW5kaWYKKyAgICB9CisKKyAgICAvLyBTdGlja3kgb24gZW5hYmxpbmcgb2Ygc2hhcmVkIG1lbW9yeSBNZWRpYUJ1ZmZlcnMuIEJ5IGRlZmF1bHQgd2UgZG9uJ3QgdXNlCisgICAgLy8gc2hhcmVkIG1lbW9yeSBmb3IgTWVkaWFCdWZmZXJzLCBidXQgd2UgZW5hYmxlIHRoaXMgZm9yIHRob3NlIHByb2Nlc3NlcworICAgIC8vIHRoYXQgZXhwb3J0IE1lZGlhQnVmZmVycy4KKyAgICBzdGF0aWMgdm9pZCB1c2VTaGFyZWRNZW1vcnkoKSB7CisgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICZtVXNlU2hhcmVkTWVtb3J5LCAoaW50X2xlYXN0MzJfdCkxLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICAvLyB0cnVlIGlmIE1lZGlhQnVmZmVyIGlzIG9ic2VydmVkIChwYXJ0IG9mIGEgTWVkaWFCdWZmZXJHcm91cCkuCisgICAgaW5saW5lIGJvb2wgaXNPYnNlcnZlZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1PYnNlcnZlciAhPSBudWxscHRyOworICAgIH0KKworICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyKCk7CisKKyAgICBzcDxJTWVtb3J5PiBtTWVtb3J5OworCitwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBNZWRpYUJ1ZmZlckdyb3VwOworICAgIGZyaWVuZCBjbGFzcyBPTVhEZWNvZGVyOworICAgIGZyaWVuZCBjbGFzcyBCbk1lZGlhU291cmNlOworICAgIGZyaWVuZCBjbGFzcyBCcE1lZGlhU291cmNlOworCisgICAgLy8gRm9yIHVzZSBieSBPTVhEZWNvZGVyLCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSAxLCBkcm9wIHJlZmVyZW5jZQorICAgIC8vIGNvdW50IHRvIDAgd2l0aG91dCBzaWduYWxsaW5nIHRoZSBvYnNlcnZlci4KKyAgICB2b2lkIGNsYWltKCk7CisKKyAgICBNZWRpYUJ1ZmZlck9ic2VydmVyICptT2JzZXJ2ZXI7CisgICAgc3RkOjphdG9taWM8aW50PiBtUmVmQ291bnQ7CisKKyAgICB2b2lkICptRGF0YTsKKyAgICBzaXplX3QgbVNpemUsIG1SYW5nZU9mZnNldCwgbVJhbmdlTGVuZ3RoOworICAgIHNwPEFCdWZmZXI+IG1CdWZmZXI7CisKKyAgICBib29sIG1Pd25zRGF0YTsKKworICAgIE1ldGFEYXRhQmFzZSogbU1ldGFEYXRhOworCisgICAgc3RhdGljIHN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgbVVzZVNoYXJlZE1lbW9yeTsKKworICAgIE1lZGlhQnVmZmVyKGNvbnN0IE1lZGlhQnVmZmVyICYpOworICAgIE1lZGlhQnVmZmVyICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXIgJik7CisKKyAgICAvLyBTaGFyZWRDb250cm9sIGJsb2NrIGF0IHRoZSBzdGFydCBvZiBJTWVtb3J5LgorICAgIHN0cnVjdCBTaGFyZWRDb250cm9sIHsKKyAgICAgICAgZW51bSB7CisgICAgICAgICAgICBGTEFHX0RFQURfT0JKRUNUID0gKDEgPDwgMCksCisgICAgICAgIH07CisKKyAgICAgICAgLy8gcmV0dXJucyBvbGQgdmFsdWUKKyAgICAgICAgaW5saW5lIGludDMyX3QgYWRkUmVtb3RlUmVmY291bnQoaW50MzJfdCB2YWx1ZSkgeworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6YXRvbWljX2ZldGNoX2FkZF9leHBsaWNpdCgKKyAgICAgICAgICAgICAgICAgICAgJm1SZW1vdGVSZWZjb3VudCwgKGludF9sZWFzdDMyX3QpdmFsdWUsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpOworICAgICAgICB9CisKKyAgICAgICAgaW5saW5lIGludDMyX3QgZ2V0UmVtb3RlUmVmY291bnQoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCgmbVJlbW90ZVJlZmNvdW50LCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIHNldFJlbW90ZVJlZmNvdW50KGludDMyX3QgdmFsdWUpIHsKKyAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICAgICAmbVJlbW90ZVJlZmNvdW50LCAoaW50X2xlYXN0MzJfdCl2YWx1ZSwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgYm9vbCBpc0RlYWRPYmplY3QoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gKHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoCisgICAgICAgICAgICAgICAgICAgICZtRmxhZ3MsIHN0ZDo6bWVtb3J5X29yZGVyX3NlcV9jc3QpICYgRkxBR19ERUFEX09CSkVDVCkgIT0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlubGluZSB2b2lkIHNldERlYWRPYmplY3QoKSB7CisgICAgICAgICAgICAodm9pZClzdGQ6OmF0b21pY19mZXRjaF9vcl9leHBsaWNpdCgKKyAgICAgICAgICAgICAgICAgICAgJm1GbGFncywgKGludF9sZWFzdDMyX3QpRkxBR19ERUFEX09CSkVDVCwgc3RkOjptZW1vcnlfb3JkZXJfc2VxX2NzdCk7CisgICAgICAgIH0KKworICAgICAgICBpbmxpbmUgdm9pZCBjbGVhcigpIHsKKyAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICAgICAmbUZsYWdzLCAoaW50X2xlYXN0MzJfdCkwLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICAgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KAorICAgICAgICAgICAgICAgICAgICAmbVJlbW90ZVJlZmNvdW50LCAoaW50X2xlYXN0MzJfdCkwLCBzdGQ6Om1lbW9yeV9vcmRlcl9zZXFfY3N0KTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgLy8gQ2F1dGlvbjogYXRvbWljX2ludF9mYXN0MzJfdCBpcyA2NCBiaXRzIG9uIExQNjQuCisgICAgICAgIHN0ZDo6YXRvbWljX2ludF9sZWFzdDMyX3QgbUZsYWdzOworICAgICAgICBzdGQ6OmF0b21pY19pbnRfbGVhc3QzMl90IG1SZW1vdGVSZWZjb3VudDsKKyAgICAgICAgaW50MzJfdCB1bnVzZWRbNl0gX19hdHRyaWJ1dGVfXygoX191bnVzZWRfXykpOyAvLyBhZGRpdGlvbmFsIGJ1ZmZlciBzcGFjZQorICAgIH07CisKKyAgICBpbmxpbmUgU2hhcmVkQ29udHJvbCAqZ2V0U2hhcmVkQ29udHJvbCgpIGNvbnN0IHsKKyNpZm5kZWYgTk9fSU1FTU9SWQorICAgICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8U2hhcmVkQ29udHJvbCAqPihtTWVtb3J5LT5wb2ludGVyKCkpOworI2Vsc2UKKyAgICAgICAgIHJldHVybiBudWxscHRyOworI2VuZGlmCisgICAgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggODBlNDliMC4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vLi4vLi4vbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckJhc2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyY2JmYzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyQmFzZS5oCkBAIC0wLDAgKzEsMTM2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9CVUZGRVJfQkFTRV9IXworCisjZGVmaW5lIE1FRElBX0JVRkZFUl9CQVNFX0hfCisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBNZWRpYUJ1ZmZlckJhc2U7CitjbGFzcyBNZXRhRGF0YUJhc2U7CisKK2NsYXNzIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgeworcHVibGljOgorICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIoKSB7fQorICAgIHZpcnR1YWwgfk1lZGlhQnVmZmVyT2JzZXJ2ZXIoKSB7fQorCisgICAgdmlydHVhbCB2b2lkIHNpZ25hbEJ1ZmZlclJldHVybmVkKE1lZGlhQnVmZmVyQmFzZSAqYnVmZmVyKSA9IDA7CisKK3ByaXZhdGU6CisgICAgTWVkaWFCdWZmZXJPYnNlcnZlcihjb25zdCBNZWRpYUJ1ZmZlck9ic2VydmVyICYpOworICAgIE1lZGlhQnVmZmVyT2JzZXJ2ZXIgJm9wZXJhdG9yPShjb25zdCBNZWRpYUJ1ZmZlck9ic2VydmVyICYpOworfTsKKworY2xhc3MgTWVkaWFCdWZmZXJCYXNlIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgTWVkaWFCdWZmZXJCYXNlICpDcmVhdGUoc2l6ZV90IHNpemUpOworCisgICAgLy8gSWYgTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIGRlY3JlbWVudCB0aGUgbG9jYWwgcmVmZXJlbmNlIGNvdW50OworICAgIC8vIGlmIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgZHJvcHMgdG8gMCwgcmV0dXJuIHRoZSBidWZmZXIgdG8gdGhlCisgICAgLy8gYXNzb2NpYXRlZCBNZWRpYUJ1ZmZlckdyb3VwLgorICAgIC8vCisgICAgLy8gSWYgbm8gTWVkaWFCdWZmZXJHcm91cCBpcyBzZXQsIHRoZSBsb2NhbCByZWZlcmVuY2UgY291bnQgbXVzdCBiZSB6ZXJvCisgICAgLy8gd2hlbiBjYWxsZWQsIHdoZXJldXBvbiB0aGUgTWVkaWFCdWZmZXIgaXMgZGVsZXRlZC4KKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpID0gMDsKKworICAgIC8vIEluY3JlbWVudHMgdGhlIGxvY2FsIHJlZmVyZW5jZSBjb3VudC4KKyAgICAvLyBVc2Ugb25seSB3aGVuIE1lZGlhQnVmZmVyR3JvdXAgaXMgc2V0LgorICAgIHZpcnR1YWwgdm9pZCBhZGRfcmVmKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkICpkYXRhKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc2l6ZV90IHNpemUoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHNpemVfdCByYW5nZV9vZmZzZXQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBzaXplX3QgcmFuZ2VfbGVuZ3RoKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHNldF9yYW5nZShzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKSA9IDA7CisKKyAgICB2aXJ0dWFsIE1ldGFEYXRhQmFzZSYgbWV0YV9kYXRhKCkgPSAwOworCisgICAgLy8gQ2xlYXJzIG1ldGEgZGF0YSBhbmQgcmVzZXRzIHRoZSByYW5nZSB0byB0aGUgZnVsbCBleHRlbnQuCisgICAgdmlydHVhbCB2b2lkIHJlc2V0KCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHNldE9ic2VydmVyKE1lZGlhQnVmZmVyT2JzZXJ2ZXIgKmdyb3VwKSA9IDA7CisKKyAgICB2aXJ0dWFsIGludCByZWZjb3VudCgpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgaW50IGxvY2FsUmVmY291bnQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBpbnQgcmVtb3RlUmVmY291bnQoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIH5NZWRpYUJ1ZmZlckJhc2UoKSB7CisgICAgICAgIGRlbGV0ZSBtV3JhcHBlcjsKKyAgICAgICAgZGVsZXRlIG1Gb3JtYXQ7CisgICAgfTsKKworICAgIENNZWRpYUJ1ZmZlciAqd3JhcCgpIHsKKyAgICAgICAgaWYgKG1XcmFwcGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgICAgIH0KKyAgICAgICAgbVdyYXBwZXIgPSBuZXcgQ01lZGlhQnVmZmVyOworICAgICAgICBtV3JhcHBlci0+aGFuZGxlID0gdGhpczsKKworICAgICAgICBtV3JhcHBlci0+cmVsZWFzZSA9IFtdKHZvaWQgKmhhbmRsZSkgLT4gdm9pZCB7CisgICAgICAgICAgICAoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+cmVsZWFzZSgpOworICAgICAgICB9OworCisgICAgICAgIG1XcmFwcGVyLT5kYXRhID0gW10odm9pZCAqaGFuZGxlKSAtPiB2b2lkICogeworICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5kYXRhKCk7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPnNpemUgPSBbXSh2b2lkICpoYW5kbGUpIC0+IHNpemVfdCB7CisgICAgICAgICAgICByZXR1cm4gKChNZWRpYUJ1ZmZlckJhc2UqKWhhbmRsZSktPnNpemUoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+cmFuZ2Vfb2Zmc2V0ID0gW10odm9pZCAqaGFuZGxlKSAtPiBzaXplX3QgeworICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5yYW5nZV9vZmZzZXQoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+cmFuZ2VfbGVuZ3RoID0gW10odm9pZCAqaGFuZGxlKSAtPiBzaXplX3QgeworICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5yYW5nZV9sZW5ndGgoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+c2V0X3JhbmdlID0gW10odm9pZCAqaGFuZGxlLCBzaXplX3Qgb2Zmc2V0LCBzaXplX3QgbGVuZ3RoKSAtPiB2b2lkIHsKKyAgICAgICAgICAgIHJldHVybiAoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+c2V0X3JhbmdlKG9mZnNldCwgbGVuZ3RoKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+bWV0YV9kYXRhID0gW10odm9pZCAqaGFuZGxlKSAtPiBBTWVkaWFGb3JtYXQqIHsKKyAgICAgICAgICAgIGlmICgoKE1lZGlhQnVmZmVyQmFzZSopaGFuZGxlKS0+bUZvcm1hdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IG1zZyA9IG5ldyBBTWVzc2FnZSgpOworICAgICAgICAgICAgICAgICgoTWVkaWFCdWZmZXJCYXNlKiloYW5kbGUpLT5tRm9ybWF0ID0gQU1lZGlhRm9ybWF0X2Zyb21Nc2coJm1zZyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gKChNZWRpYUJ1ZmZlckJhc2UqKWhhbmRsZSktPm1Gb3JtYXQ7CisgICAgICAgIH07CisKKyAgICAgICAgcmV0dXJuIG1XcmFwcGVyOworICAgIH0KK3Byb3RlY3RlZDoKKyAgICBNZWRpYUJ1ZmZlckJhc2UoKSB7CisgICAgICAgIG1XcmFwcGVyID0gbnVsbHB0cjsKKyAgICAgICAgbUZvcm1hdCA9IG51bGxwdHI7CisgICAgfQorcHJpdmF0ZToKKyAgICBDTWVkaWFCdWZmZXIgKm1XcmFwcGVyOworICAgIEFNZWRpYUZvcm1hdCAqbUZvcm1hdDsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTIwMDAwCmluZGV4IDAwOWIzZDkuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi8uLi8uLi9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQnVmZmVyR3JvdXAuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlckdyb3VwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2MjExNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJHcm91cC5oCkBAIC0wLDAgKzEsMTE0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRURJQV9CVUZGRVJfR1JPVVBfSF8KKworI2RlZmluZSBNRURJQV9CVUZGRVJfR1JPVVBfSF8KKworI2luY2x1ZGUgPGxpc3Q+CisKKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3JQcml2Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFCdWZmZXJCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2NsYXNzIE1lZGlhQnVmZmVyQmFzZTsKKworY2xhc3MgTWVkaWFCdWZmZXJHcm91cCA6IHB1YmxpYyBNZWRpYUJ1ZmZlck9ic2VydmVyIHsKK3B1YmxpYzoKKyAgICBNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBncm93dGhMaW1pdCA9IDApOworCisgICAgLy8gY3JlYXRlIGEgbWVkaWEgYnVmZmVyIGdyb3VwIHdpdGggcHJlYWxsb2NhdGVkIGJ1ZmZlcnMKKyAgICBNZWRpYUJ1ZmZlckdyb3VwKHNpemVfdCBidWZmZXJzLCBzaXplX3QgYnVmZmVyX3NpemUsIHNpemVfdCBncm93dGhMaW1pdCA9IDApOworCisgICAgfk1lZGlhQnVmZmVyR3JvdXAoKTsKKworICAgIHZvaWQgYWRkX2J1ZmZlcihNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CisKKyAgICBib29sIGhhc19idWZmZXJzKCk7CisKKyAgICAvLyBJZiBub25CbG9ja2luZyBpcyBmYWxzZSwgaXQgYmxvY2tzIHVudGlsIGEgYnVmZmVyIGlzIGF2YWlsYWJsZSBhbmQKKyAgICAvLyBwYXNzZXMgaXQgdG8gdGhlIGNhbGxlciBpbiAqYnVmZmVyLCB3aGlsZSByZXR1cm5pbmcgT0suCisgICAgLy8gVGhlIHJldHVybmVkIGJ1ZmZlciB3aWxsIGhhdmUgYSByZWZlcmVuY2UgY291bnQgb2YgMS4KKyAgICAvLyBJZiBub25CbG9ja2luZyBpcyB0cnVlIGFuZCBhIGJ1ZmZlciBpcyBub3QgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLAorICAgIC8vIGJ1ZmZlciBpcyBzZXQgdG8gTlVMTCBhbmQgaXQgcmV0dXJucyBXT1VMRF9CTE9DSy4KKyAgICAvLyBJZiByZXF1ZXN0ZWRTaXplIGlzIDAsIGFueSBmcmVlIE1lZGlhQnVmZmVyIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8gSWYgcmVxdWVzdGVkU2l6ZSBpcyA+IDAsIHRoZSByZXR1cm5lZCBNZWRpYUJ1ZmZlciBzaG91bGQgaGF2ZSBidWZmZXIKKyAgICAvLyBzaXplIG9mIGF0IGxlYXN0IHJlcXVzdGVkU2l6ZS4KKyAgICBzdGF0dXNfdCBhY3F1aXJlX2J1ZmZlcigKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwgYm9vbCBub25CbG9ja2luZyA9IGZhbHNlLCBzaXplX3QgcmVxdWVzdGVkU2l6ZSA9IDApOworCisgICAgc2l6ZV90IGJ1ZmZlcnMoKSBjb25zdDsKKworICAgIC8vIElmIGJ1ZmZlciBpcyBudWxscHRyLCBoYXZlIGFjcXVpcmVfYnVmZmVyKCkgY2hlY2sgZm9yIHJlbW90ZSByZWxlYXNlLgorICAgIHZpcnR1YWwgdm9pZCBzaWduYWxCdWZmZXJSZXR1cm5lZChNZWRpYUJ1ZmZlckJhc2UgKmJ1ZmZlcik7CisKKyAgICBDTWVkaWFCdWZmZXJHcm91cCAqd3JhcCgpIHsKKyAgICAgICAgaWYgKG1XcmFwcGVyKSB7CisgICAgICAgICAgICByZXR1cm4gbVdyYXBwZXI7CisgICAgICAgIH0KKworICAgICAgICBtV3JhcHBlciA9IG5ldyBDTWVkaWFCdWZmZXJHcm91cDsKKyAgICAgICAgbVdyYXBwZXItPmhhbmRsZSA9IHRoaXM7CisKKyAgICAgICAgbVdyYXBwZXItPmFkZF9idWZmZXIgPSBbXSh2b2lkICpoYW5kbGUsIHNpemVfdCBzaXplKSAtPiB2b2lkIHsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYnVmID0gTWVkaWFCdWZmZXJCYXNlOjpDcmVhdGUoc2l6ZSk7CisgICAgICAgICAgICAoKE1lZGlhQnVmZmVyR3JvdXAqKWhhbmRsZSktPmFkZF9idWZmZXIoYnVmKTsKKyAgICAgICAgfTsKKworICAgICAgICBtV3JhcHBlci0+aW5pdCA9IFtdKHZvaWQgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVycywgc2l6ZV90IGJ1ZmZlcl9zaXplLCBzaXplX3QgZ3Jvd3RoTGltaXQpIC0+IGJvb2wgeworICAgICAgICAgICAgKChNZWRpYUJ1ZmZlckdyb3VwKiloYW5kbGUpLT5pbml0KGJ1ZmZlcnMsIGJ1ZmZlcl9zaXplLCBncm93dGhMaW1pdCk7CisgICAgICAgICAgLy8gICgoTWVkaWFCdWZmZXJHcm91cCopaGFuZGxlKS0+bVdyYXBwZXItPmluaXQgPSBudWxscHRyOyAvLyBlbmZvcmNlIGNhbGwtb25jZQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPmFjcXVpcmVfYnVmZmVyID0gW10odm9pZCAqaGFuZGxlLAorICAgICAgICAgICAgICAgIENNZWRpYUJ1ZmZlciAqKmJ1ZiwgYm9vbCBub25CbG9ja2luZywgc2l6ZV90IHJlcXVlc3RlZFNpemUpIC0+IG1lZGlhX3N0YXR1c190IHsKKyAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqYWNxdWlyZWRCdWYgPSBudWxscHRyOworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gKChNZWRpYUJ1ZmZlckdyb3VwKiloYW5kbGUpLT5hY3F1aXJlX2J1ZmZlcigKKyAgICAgICAgICAgICAgICAgICAgJmFjcXVpcmVkQnVmLCBub25CbG9ja2luZywgcmVxdWVzdGVkU2l6ZSk7CisgICAgICAgICAgICBpZiAoZXJyID09IE9LICYmIGFjcXVpcmVkQnVmICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAqYnVmID0gYWNxdWlyZWRCdWYtPndyYXAoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgKmJ1ZiA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gdHJhbnNsYXRlX2Vycm9yKGVycik7CisgICAgICAgIH07CisKKyAgICAgICAgbVdyYXBwZXItPmhhc19idWZmZXJzID0gW10odm9pZCAqaGFuZGxlKSAtPiBib29sIHsKKyAgICAgICAgICAgIHJldHVybiAoKE1lZGlhQnVmZmVyR3JvdXAqKWhhbmRsZSktPmhhc19idWZmZXJzKCk7CisgICAgICAgIH07CisKKyAgICAgICAgcmV0dXJuIG1XcmFwcGVyOworICAgIH0KKworcHJpdmF0ZToKKyAgICBDTWVkaWFCdWZmZXJHcm91cCAqbVdyYXBwZXI7CisgICAgc3RydWN0IEludGVybmFsRGF0YTsKKyAgICBJbnRlcm5hbERhdGEgKm1JbnRlcm5hbDsKKworICAgIE1lZGlhQnVmZmVyR3JvdXAoY29uc3QgTWVkaWFCdWZmZXJHcm91cCAmKTsKKyAgICBNZWRpYUJ1ZmZlckdyb3VwICZvcGVyYXRvcj0oY29uc3QgTWVkaWFCdWZmZXJHcm91cCAmKTsKKyAgICB2b2lkIGluaXQoc2l6ZV90IGJ1ZmZlcnMsIHNpemVfdCBidWZmZXJfc2l6ZSwgc2l6ZV90IGdyb3d0aExpbWl0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gTUVESUFfQlVGRkVSX0dST1VQX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCmluZGV4IDdmNmFhZTYuLjAxZDAzMjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlYy5oCkBAIC0yNSw3ICsyNSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvQ3J5cHRvQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0luZm8uaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVJlc291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFNZXRyaWNzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZyYW1lUmVuZGVyVHJhY2tlci5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgpAQCAtMzYsNiArMzYsNyBAQAogc3RydWN0IEFNZXNzYWdlOwogc3RydWN0IEFSZXBseVRva2VuOwogc3RydWN0IEFTdHJpbmc7CitzdHJ1Y3QgQmF0dGVyeUNoZWNrZXI7CiBjbGFzcyBCdWZmZXJDaGFubmVsQmFzZTsKIHN0cnVjdCBDb2RlY0Jhc2U7CiBjbGFzcyBJQmF0dGVyeVN0YXRzOwpAQCAtMTg4LDcgKzE4OSw3IEBACiAKICAgICBzdGF0dXNfdCBnZXRDb2RlY0luZm8oc3A8TWVkaWFDb2RlY0luZm8+ICpjb2RlY0luZm8pIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgZ2V0TWV0cmljcyhNZWRpYUFuYWx5dGljc0l0ZW0gKiAmcmVwbHkpOworICAgIHN0YXR1c190IGdldE1ldHJpY3MobWVkaWFtZXRyaWNzX2hhbmRsZV90ICZyZXBseSk7CiAKICAgICBzdGF0dXNfdCBzZXRQYXJhbWV0ZXJzKGNvbnN0IHNwPEFNZXNzYWdlPiAmcGFyYW1zKTsKIApAQCAtMjU3LDYgKzI1OCw3IEBACiAgICAgICAgIGtXaGF0U2V0Q2FsbGJhY2sgICAgICAgICAgICAgICAgICAgID0gJ3NldEMnLAogICAgICAgICBrV2hhdFNldE5vdGlmaWNhdGlvbiAgICAgICAgICAgICAgICA9ICdzZXROJywKICAgICAgICAga1doYXREcm1SZWxlYXNlQ3J5cHRvICAgICAgICAgICAgICAgPSAnckRybScsCisgICAgICAgIGtXaGF0Q2hlY2tCYXR0ZXJ5U3RhdHMgICAgICAgICAgICAgID0gJ2Noa0InLAogICAgIH07CiAKICAgICBlbnVtIHsKQEAgLTI4Myw3ICsyODUsNyBAQAogICAgIH07CiAKICAgICBzdHJ1Y3QgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5IDogcHVibGljIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IHsKLSAgICAgICAgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVByb3h5KHBpZF90IHBpZCk7CisgICAgICAgIFJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eShwaWRfdCBwaWQsIHVpZF90IHVpZCk7CiAgICAgICAgIH5SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlUHJveHkoKTsKIAogICAgICAgICB2b2lkIGluaXQoKTsKQEAgLTI5Niw3ICsyOTgsMTEgQEAKICAgICAgICAgICAgICAgICBjb25zdCBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiAmY2xpZW50LAogICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzKTsKIAotICAgICAgICB2b2lkIHJlbW92ZVJlc291cmNlKGludDY0X3QgY2xpZW50SWQpOworICAgICAgICB2b2lkIHJlbW92ZVJlc291cmNlKAorICAgICAgICAgICAgICAgIGludDY0X3QgY2xpZW50SWQsCisgICAgICAgICAgICAgICAgY29uc3QgVmVjdG9yPE1lZGlhUmVzb3VyY2U+ICZyZXNvdXJjZXMpOworCisgICAgICAgIHZvaWQgcmVtb3ZlQ2xpZW50KGludDY0X3QgY2xpZW50SWQpOwogCiAgICAgICAgIGJvb2wgcmVjbGFpbVJlc291cmNlKGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzKTsKIApAQCAtMzA0LDYgKzMxMCw3IEBACiAgICAgICAgIE11dGV4IG1Mb2NrOwogICAgICAgICBzcDxJUmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gbVNlcnZpY2U7CiAgICAgICAgIHBpZF90IG1QaWQ7CisgICAgICAgIHVpZF90IG1VaWQ7CiAgICAgfTsKIAogICAgIFN0YXRlIG1TdGF0ZTsKQEAgLTMxMyw2ICszMjAsNyBAQAogICAgIHNwPEFMb29wZXI+IG1Db2RlY0xvb3BlcjsKICAgICBzcDxDb2RlY0Jhc2U+IG1Db2RlYzsKICAgICBBU3RyaW5nIG1Db21wb25lbnROYW1lOworICAgIEFTdHJpbmcgbU93bmVyTmFtZTsKICAgICBzcDxNZWRpYUNvZGVjSW5mbz4gbUNvZGVjSW5mbzsKICAgICBzcDxBUmVwbHlUb2tlbj4gbVJlcGx5SUQ7CiAgICAgdWludDMyX3QgbUZsYWdzOwpAQCAtMzIwLDExICszMjgsMTEgQEAKICAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZTsKICAgICBTb2Z0d2FyZVJlbmRlcmVyICptU29mdFJlbmRlcmVyOwogCi0gICAgTWVkaWFBbmFseXRpY3NJdGVtICptQW5hbHl0aWNzSXRlbTsKLSAgICB2b2lkIGluaXRBbmFseXRpY3NJdGVtKCk7Ci0gICAgdm9pZCB1cGRhdGVBbmFseXRpY3NJdGVtKCk7Ci0gICAgdm9pZCBmbHVzaEFuYWx5dGljc0l0ZW0oKTsKLSAgICB2b2lkIHVwZGF0ZUVwaGVtZXJhbEFuYWx5dGljcyhNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pOworICAgIG1lZGlhbWV0cmljc19oYW5kbGVfdCBtTWV0cmljc0hhbmRsZTsKKyAgICB2b2lkIGluaXRNZWRpYW1ldHJpY3MoKTsKKyAgICB2b2lkIHVwZGF0ZU1lZGlhbWV0cmljcygpOworICAgIHZvaWQgZmx1c2hNZWRpYW1ldHJpY3MoKTsKKyAgICB2b2lkIHVwZGF0ZUVwaGVtZXJhbE1lZGlhbWV0cmljcyhtZWRpYW1ldHJpY3NfaGFuZGxlX3QgaXRlbSk7CiAKICAgICBzcDxBTWVzc2FnZT4gbU91dHB1dEZvcm1hdDsKICAgICBzcDxBTWVzc2FnZT4gbUlucHV0Rm9ybWF0OwpAQCAtMzM0LDExICszNDIsMTEgQEAKICAgICBzcDxJUmVzb3VyY2VNYW5hZ2VyQ2xpZW50PiBtUmVzb3VyY2VNYW5hZ2VyQ2xpZW50OwogICAgIHNwPFJlc291cmNlTWFuYWdlclNlcnZpY2VQcm94eT4gbVJlc291cmNlTWFuYWdlclNlcnZpY2U7CiAKLSAgICBib29sIG1CYXR0ZXJ5U3RhdE5vdGlmaWVkOwogICAgIGJvb2wgbUlzVmlkZW87CiAgICAgaW50MzJfdCBtVmlkZW9XaWR0aDsKICAgICBpbnQzMl90IG1WaWRlb0hlaWdodDsKICAgICBpbnQzMl90IG1Sb3RhdGlvbkRlZ3JlZXM7CisgICAgaW50MzJfdCBtQWxsb3dGcmFtZURyb3BwaW5nQnlTdXJmYWNlOwogCiAgICAgLy8gaW5pdGlhbCBjcmVhdGUgcGFyYW1ldGVycwogICAgIEFTdHJpbmcgbUluaXROYW1lOwpAQCAtNDIzLDExICs0MzEsMTEgQEAKICAgICBzdGF0dXNfdCBvblNldFBhcmFtZXRlcnMoY29uc3Qgc3A8QU1lc3NhZ2U+ICZwYXJhbXMpOwogCiAgICAgc3RhdHVzX3QgYW1lbmRPdXRwdXRGb3JtYXRXaXRoQ29kZWNTcGVjaWZpY0RhdGEoY29uc3Qgc3A8TWVkaWFDb2RlY0J1ZmZlcj4gJmJ1ZmZlcik7Ci0gICAgdm9pZCB1cGRhdGVCYXR0ZXJ5U3RhdCgpOwogICAgIGJvb2wgaXNFeGVjdXRpbmcoKSBjb25zdDsKIAogICAgIHVpbnQ2NF90IGdldEdyYXBoaWNCdWZmZXJTaXplKCk7CiAgICAgdm9pZCBhZGRSZXNvdXJjZShNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUgc3VidHlwZSwgdWludDY0X3QgdmFsdWUpOworICAgIHZvaWQgcmVtb3ZlUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLCBNZWRpYVJlc291cmNlOjpTdWJUeXBlIHN1YnR5cGUsIHVpbnQ2NF90IHZhbHVlKTsKICAgICB2b2lkIHJlcXVlc3RDcHVCb29zdElmTmVlZGVkKCk7CiAKICAgICBib29sIGhhc1BlbmRpbmdCdWZmZXIoaW50IHBvcnRJbmRleCk7CkBAIC00NTYsNiArNDY0LDggQEAKICAgICBNdXRleCBtTGF0ZW5jeUxvY2s7CiAgICAgaW50NjRfdCBtTGF0ZW5jeVVua25vd247ICAgIC8vIGJ1ZmZlcnMgZm9yIHdoaWNoIHdlIGNvdWxkbid0IGNhbGN1bGF0ZSBsYXRlbmN5CiAKKyAgICBzcDxCYXR0ZXJ5Q2hlY2tlcj4gbUJhdHRlcnlDaGVja2VyOworCiAgICAgdm9pZCBzdGF0c0J1ZmZlclNlbnQoaW50NjRfdCBwcmVzZW50YXRpb25Vcyk7CiAgICAgdm9pZCBzdGF0c0J1ZmZlclJlY2VpdmVkKGludDY0X3QgcHJlc2VudGF0aW9uVXMpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNDb25zdGFudHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCmluZGV4IDNlZjRjMGUuLjUwZDc3MjQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oCkBAIC0zMSw2ICszMSwyMSBAQAogY29uc3RleHByIGludDMyX3QgQVZDUHJvZmlsZUNvbnN0cmFpbmVkQmFzZWxpbmUgPSAweDEwMDAwOwogY29uc3RleHByIGludDMyX3QgQVZDUHJvZmlsZUNvbnN0cmFpbmVkSGlnaCAgICAgPSAweDgwMDAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0FWQ1Byb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgQVZDUHJvZmlsZUJhc2VsaW5lOiAgICAgICAgICAgIHJldHVybiAiQmFzZWxpbmUiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVNYWluOiAgICAgICAgICAgICAgICByZXR1cm4gIk1haW4iOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVFeHRlbmRlZDogICAgICAgICAgICByZXR1cm4gIkV4dGVuZGVkIjsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlSGlnaDogICAgICAgICAgICAgICAgcmV0dXJuICJIaWdoIjsKKyAgICAgICAgY2FzZSBBVkNQcm9maWxlSGlnaDEwOiAgICAgICAgICAgICAgcmV0dXJuICJIaWdoMTAiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVIaWdoNDIyOiAgICAgICAgICAgICByZXR1cm4gIkhpZ2g0MjIiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVIaWdoNDQ0OiAgICAgICAgICAgICByZXR1cm4gIkhpZ2g0NDQiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEJhc2VsaW5lOiByZXR1cm4gIkNvbnN0cmFpbmVkQmFzZWxpbmUiOworICAgICAgICBjYXNlIEFWQ1Byb2ZpbGVDb25zdHJhaW5lZEhpZ2g6ICAgICByZXR1cm4gIkNvbnN0cmFpbmVkSGlnaCI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBBVkNMZXZlbDEgICAgICAgPSAweDAxOwogY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWwxYiAgICAgID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsMTEgICAgICA9IDB4MDQ7CkBAIC00OCw2ICs2MywzNSBAQAogY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw1ICAgICAgID0gMHg0MDAwOwogY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw1MSAgICAgID0gMHg4MDAwOwogY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw1MiAgICAgID0gMHgxMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWQ0xldmVsNiAgICAgICA9IDB4MjAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVkNMZXZlbDYxICAgICAgPSAweDQwMDAwOworY29uc3RleHByIGludDMyX3QgQVZDTGV2ZWw2MiAgICAgID0gMHg4MDAwMDsKKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19BVkNMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDE6ICAgICByZXR1cm4gIjEiOworICAgICAgICBjYXNlIEFWQ0xldmVsMWI6ICAgIHJldHVybiAiMWIiOworICAgICAgICBjYXNlIEFWQ0xldmVsMTE6ICAgIHJldHVybiAiMS4xIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDEyOiAgICByZXR1cm4gIjEuMiI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWwxMzogICAgcmV0dXJuICIxLjMiOworICAgICAgICBjYXNlIEFWQ0xldmVsMjogICAgIHJldHVybiAiMiI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWwyMTogICAgcmV0dXJuICIyLjEiOworICAgICAgICBjYXNlIEFWQ0xldmVsMjI6ICAgIHJldHVybiAiMi4yIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDM6ICAgICByZXR1cm4gIjMiOworICAgICAgICBjYXNlIEFWQ0xldmVsMzE6ICAgIHJldHVybiAiMy4xIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDMyOiAgICByZXR1cm4gIjMuMiI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWw0OiAgICAgcmV0dXJuICI0IjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDQxOiAgICByZXR1cm4gIjQuMSI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWw0MjogICAgcmV0dXJuICI0LjIiOworICAgICAgICBjYXNlIEFWQ0xldmVsNTogICAgIHJldHVybiAiNSI7CisgICAgICAgIGNhc2UgQVZDTGV2ZWw1MTogICAgcmV0dXJuICI1LjEiOworICAgICAgICBjYXNlIEFWQ0xldmVsNTI6ICAgIHJldHVybiAiNS4yIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDY6ICAgICByZXR1cm4gIjYiOworICAgICAgICBjYXNlIEFWQ0xldmVsNjE6ICAgIHJldHVybiAiNi4xIjsKKyAgICAgICAgY2FzZSBBVkNMZXZlbDYyOiAgICByZXR1cm4gIjYuMiI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CiAKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNQcm9maWxlQmFzZWxpbmUgICAgICAgICAgICAgPSAweDAxOwogY29uc3RleHByIGludDMyX3QgSDI2M1Byb2ZpbGVIMzIwQ29kaW5nICAgICAgICAgICA9IDB4MDI7CkBAIC01OSw2ICsxMDMsMjEgQEAKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNQcm9maWxlSW50ZXJsYWNlICAgICAgICAgICAgPSAweDgwOwogY29uc3RleHByIGludDMyX3QgSDI2M1Byb2ZpbGVIaWdoTGF0ZW5jeSAgICAgICAgICA9IDB4MTAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0gyNjNQcm9maWxlKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEgyNjNQcm9maWxlQmFzZWxpbmU6ICAgICAgICAgICByZXR1cm4gIkJhc2VsaW5lIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUgzMjBDb2Rpbmc6ICAgICAgICAgcmV0dXJuICJIMzIwQ29kaW5nIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUJhY2t3YXJkQ29tcGF0aWJsZTogcmV0dXJuICJCYWNrd2FyZENvbXBhdGlibGUiOworICAgICAgICBjYXNlIEgyNjNQcm9maWxlSVNXVjI6ICAgICAgICAgICAgICByZXR1cm4gIklTV1YyIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUlTV1YzOiAgICAgICAgICAgICAgcmV0dXJuICJJU1dWMyI7CisgICAgICAgIGNhc2UgSDI2M1Byb2ZpbGVIaWdoQ29tcHJlc3Npb246ICAgIHJldHVybiAiSGlnaENvbXByZXNzaW9uIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUludGVybmV0OiAgICAgICAgICAgcmV0dXJuICJJbnRlcm5ldCI7CisgICAgICAgIGNhc2UgSDI2M1Byb2ZpbGVJbnRlcmxhY2U6ICAgICAgICAgIHJldHVybiAiSW50ZXJsYWNlIjsKKyAgICAgICAgY2FzZSBIMjYzUHJvZmlsZUhpZ2hMYXRlbmN5OiAgICAgICAgcmV0dXJuICJIaWdoTGF0ZW5jeSI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBIMjYzTGV2ZWwxMCAgICAgID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNMZXZlbDIwICAgICAgPSAweDAyOwogY29uc3RleHByIGludDMyX3QgSDI2M0xldmVsMzAgICAgICA9IDB4MDQ7CkBAIC02OCw2ICsxMjcsMjAgQEAKIGNvbnN0ZXhwciBpbnQzMl90IEgyNjNMZXZlbDYwICAgICAgPSAweDQwOwogY29uc3RleHByIGludDMyX3QgSDI2M0xldmVsNzAgICAgICA9IDB4ODA7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfSDI2M0xldmVsKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEgyNjNMZXZlbDEwOiAgIHJldHVybiAiMTAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDIwOiAgIHJldHVybiAiMjAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDMwOiAgIHJldHVybiAiMzAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDQwOiAgIHJldHVybiAiNDAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDQ1OiAgIHJldHVybiAiNDUiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDUwOiAgIHJldHVybiAiNTAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDYwOiAgIHJldHVybiAiNjAiOworICAgICAgICBjYXNlIEgyNjNMZXZlbDcwOiAgIHJldHVybiAiNzAiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVTaW1wbGUgICAgICAgICAgICAgID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlICAgICAgPSAweDAyOwogY29uc3RleHByIGludDMyX3QgTVBFRzRQcm9maWxlQ29yZSAgICAgICAgICAgICAgICA9IDB4MDQ7CkBAIC04NSw2ICsxNTgsMjggQEAKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGUgICAgPSAweDQwMDA7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNFByb2ZpbGVBZHZhbmNlZFNpbXBsZSAgICAgID0gMHg4MDAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX01QRUc0UHJvZmlsZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVTaW1wbGU6ICAgICAgICAgICAgcmV0dXJuICJTaW1wbGUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZVNpbXBsZVNjYWxhYmxlOiAgICByZXR1cm4gIlNpbXBsZVNjYWxhYmxlIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVDb3JlOiAgICAgICAgICAgICAgcmV0dXJuICJDb3JlIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVNYWluOiAgICAgICAgICAgICAgcmV0dXJuICJNYWluIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVOYml0OiAgICAgICAgICAgICAgcmV0dXJuICJOYml0IjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVTY2FsYWJsZVRleHR1cmU6ICAgcmV0dXJuICJTY2FsYWJsZVRleHR1cmUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZVNpbXBsZUZhY2U6ICAgICAgICByZXR1cm4gIlNpbXBsZUZhY2UiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZVNpbXBsZUZCQTogICAgICAgICByZXR1cm4gIlNpbXBsZUZCQSI7CisgICAgICAgIGNhc2UgTVBFRzRQcm9maWxlQmFzaWNBbmltYXRlZDogICAgIHJldHVybiAiQmFzaWNBbmltYXRlZCI7CisgICAgICAgIGNhc2UgTVBFRzRQcm9maWxlSHlicmlkOiAgICAgICAgICAgIHJldHVybiAiSHlicmlkIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVBZHZhbmNlZFJlYWxUaW1lOiAgcmV0dXJuICJBZHZhbmNlZFJlYWxUaW1lIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVDb3JlU2NhbGFibGU6ICAgICAgcmV0dXJuICJDb3JlU2NhbGFibGUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZUFkdmFuY2VkQ29kaW5nOiAgICByZXR1cm4gIkFkdmFuY2VkQ29kaW5nIjsKKyAgICAgICAgY2FzZSBNUEVHNFByb2ZpbGVBZHZhbmNlZENvcmU6ICAgICAgcmV0dXJuICJBZHZhbmNlZENvcmUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZUFkdmFuY2VkU2NhbGFibGU6ICByZXR1cm4gIkFkdmFuY2VkU2NhbGFibGUiOworICAgICAgICBjYXNlIE1QRUc0UHJvZmlsZUFkdmFuY2VkU2ltcGxlOiAgICByZXR1cm4gIkFkdmFuY2VkU2ltcGxlIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUc0TGV2ZWwwICAgICAgPSAweDAxOwogY29uc3RleHByIGludDMyX3QgTVBFRzRMZXZlbDBiICAgICA9IDB4MDI7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNExldmVsMSAgICAgID0gMHgwNDsKQEAgLTk2LDYgKzE5MSwyMiBAQAogY29uc3RleHByIGludDMyX3QgTVBFRzRMZXZlbDUgICAgICA9IDB4ODA7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHNExldmVsNiAgICAgID0gMHgxMDA7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfTVBFRzRMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBNUEVHNExldmVsMDogICByZXR1cm4gIjAiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWwwYjogIHJldHVybiAiMGIiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWwxOiAgIHJldHVybiAiMSI7CisgICAgICAgIGNhc2UgTVBFRzRMZXZlbDI6ICAgcmV0dXJuICIyIjsKKyAgICAgICAgY2FzZSBNUEVHNExldmVsMzogICByZXR1cm4gIjMiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWwzYjogIHJldHVybiAiM2IiOworICAgICAgICBjYXNlIE1QRUc0TGV2ZWw0OiAgIHJldHVybiAiNCI7CisgICAgICAgIGNhc2UgTVBFRzRMZXZlbDRhOiAgcmV0dXJuICI0YSI7CisgICAgICAgIGNhc2UgTVBFRzRMZXZlbDU6ICAgcmV0dXJuICI1IjsKKyAgICAgICAgY2FzZSBNUEVHNExldmVsNjogICByZXR1cm4gIjYiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMlByb2ZpbGVTaW1wbGUgICAgICAgICAgICAgID0gMHgwMDsKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUcyUHJvZmlsZU1haW4gICAgICAgICAgICAgICAgPSAweDAxOwogY29uc3RleHByIGludDMyX3QgTVBFRzJQcm9maWxlNDIyICAgICAgICAgICAgICAgICA9IDB4MDI7CkBAIC0xMDMsMTIgKzIxNCwzNSBAQAogY29uc3RleHByIGludDMyX3QgTVBFRzJQcm9maWxlU3BhdGlhbCAgICAgICAgICAgICA9IDB4MDQ7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMlByb2ZpbGVIaWdoICAgICAgICAgICAgICAgID0gMHgwNTsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19NUEVHMlByb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgTVBFRzJQcm9maWxlU2ltcGxlOiAgICByZXR1cm4gIlNpbXBsZSI7CisgICAgICAgIGNhc2UgTVBFRzJQcm9maWxlTWFpbjogICAgICByZXR1cm4gIk1haW4iOworICAgICAgICBjYXNlIE1QRUcyUHJvZmlsZTQyMjogICAgICAgcmV0dXJuICI0MjIiOworICAgICAgICBjYXNlIE1QRUcyUHJvZmlsZVNOUjogICAgICAgcmV0dXJuICJTTlIiOworICAgICAgICBjYXNlIE1QRUcyUHJvZmlsZVNwYXRpYWw6ICAgcmV0dXJuICJTcGF0aWFsIjsKKyAgICAgICAgY2FzZSBNUEVHMlByb2ZpbGVIaWdoOiAgICAgIHJldHVybiAiSGlnaCI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgTVBFRzJMZXZlbExMICAgICA9IDB4MDA7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMkxldmVsTUwgICAgID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IE1QRUcyTGV2ZWxIMTQgICAgPSAweDAyOwogY29uc3RleHByIGludDMyX3QgTVBFRzJMZXZlbEhMICAgICA9IDB4MDM7CiBjb25zdGV4cHIgaW50MzJfdCBNUEVHMkxldmVsSFAgICAgID0gMHgwNDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19NUEVHMkxldmVsKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIE1QRUcyTGV2ZWxMTDogIHJldHVybiAiTEwiOworICAgICAgICBjYXNlIE1QRUcyTGV2ZWxNTDogIHJldHVybiAiTUwiOworICAgICAgICBjYXNlIE1QRUcyTGV2ZWxIMTQ6IHJldHVybiAiSDE0IjsKKyAgICAgICAgY2FzZSBNUEVHMkxldmVsSEw6ICByZXR1cm4gIkhMIjsKKyAgICAgICAgY2FzZSBNUEVHMkxldmVsSFA6ICByZXR1cm4gIkhQIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgQUFDT2JqZWN0TWFpbiAgICAgICA9IDE7CiBjb25zdGV4cHIgaW50MzJfdCBBQUNPYmplY3RMQyAgICAgICAgID0gMjsKIGNvbnN0ZXhwciBpbnQzMl90IEFBQ09iamVjdFNTUiAgICAgICAgPSAzOwpAQCAtMTIyLDE5ICsyNTYsNzAgQEAKIGNvbnN0ZXhwciBpbnQzMl90IEFBQ09iamVjdEVMRCAgICAgICAgPSAzOTsKIGNvbnN0ZXhwciBpbnQzMl90IEFBQ09iamVjdFhIRSAgICAgICAgPSA0MjsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19BQUNPYmplY3QoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0TWFpbjogICAgICAgICByZXR1cm4gIk1haW4iOworICAgICAgICBjYXNlIEFBQ09iamVjdExDOiAgICAgICAgICAgcmV0dXJuICJMQyI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0U1NSOiAgICAgICAgICByZXR1cm4gIlNTUiI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0TFRQOiAgICAgICAgICByZXR1cm4gIkxUUCI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0SEU6ICAgICAgICAgICByZXR1cm4gIkhFIjsKKyAgICAgICAgY2FzZSBBQUNPYmplY3RTY2FsYWJsZTogICAgIHJldHVybiAiU2NhbGFibGUiOworICAgICAgICBjYXNlIEFBQ09iamVjdEVSTEM6ICAgICAgICAgcmV0dXJuICJFUkxDIjsKKyAgICAgICAgY2FzZSBBQUNPYmplY3RFUlNjYWxhYmxlOiAgIHJldHVybiAiRVJTY2FsYWJsZSI7CisgICAgICAgIGNhc2UgQUFDT2JqZWN0TEQ6ICAgICAgICAgICByZXR1cm4gIkxEIjsKKyAgICAgICAgY2FzZSBBQUNPYmplY3RIRV9QUzogICAgICAgIHJldHVybiAiSEVfUFMiOworICAgICAgICBjYXNlIEFBQ09iamVjdEVMRDogICAgICAgICAgcmV0dXJuICJFTEQiOworICAgICAgICBjYXNlIEFBQ09iamVjdFhIRTogICAgICAgICAgcmV0dXJuICJYSEUiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24wID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24xID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24yID0gMHgwNDsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOExldmVsX1ZlcnNpb24zID0gMHgwODsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19WUDhMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBWUDhMZXZlbF9WZXJzaW9uMDogcmV0dXJuICJWMCI7CisgICAgICAgIGNhc2UgVlA4TGV2ZWxfVmVyc2lvbjE6IHJldHVybiAiVjEiOworICAgICAgICBjYXNlIFZQOExldmVsX1ZlcnNpb24yOiByZXR1cm4gIlYyIjsKKyAgICAgICAgY2FzZSBWUDhMZXZlbF9WZXJzaW9uMzogcmV0dXJuICJWMyI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBWUDhQcm9maWxlTWFpbiA9IDB4MDE7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfVlA4UHJvZmlsZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBWUDhQcm9maWxlTWFpbjogICAgcmV0dXJuICJNYWluIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUwID0gMHgwMTsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUxID0gMHgwMjsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUyID0gMHgwNDsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUzID0gMHgwODsKIGNvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUySERSID0gMHgxMDAwOwogY29uc3RleHByIGludDMyX3QgVlA5UHJvZmlsZTNIRFIgPSAweDIwMDA7Citjb25zdGV4cHIgaW50MzJfdCBWUDlQcm9maWxlMkhEUjEwUGx1cyA9IDB4NDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IFZQOVByb2ZpbGUzSERSMTBQbHVzID0gMHg4MDAwOworCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX1ZQOVByb2ZpbGUoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTA6ICAgICAgICAgICByZXR1cm4gIjAiOworICAgICAgICBjYXNlIFZQOVByb2ZpbGUxOiAgICAgICAgICAgcmV0dXJuICIxIjsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlMjogICAgICAgICAgIHJldHVybiAiMiI7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTM6ICAgICAgICAgICByZXR1cm4gIjMiOworICAgICAgICBjYXNlIFZQOVByb2ZpbGUySERSOiAgICAgICAgcmV0dXJuICIySERSIjsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlM0hEUjogICAgICAgIHJldHVybiAiM0hEUiI7CisgICAgICAgIGNhc2UgVlA5UHJvZmlsZTJIRFIxMFBsdXM6ICByZXR1cm4gIjJIRFJQbHVzIjsKKyAgICAgICAgY2FzZSBWUDlQcm9maWxlM0hEUjEwUGx1czogIHJldHVybiAiM0hEUlBsdXMiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CiAKIGNvbnN0ZXhwciBpbnQzMl90IFZQOUxldmVsMSAgPSAweDE7CiBjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDExID0gMHgyOwpAQCAtMTUxLDEwICszMzYsMTEyIEBACiBjb25zdGV4cHIgaW50MzJfdCBWUDlMZXZlbDYxID0gMHgxMDAwOwogY29uc3RleHByIGludDMyX3QgVlA5TGV2ZWw2MiA9IDB4MjAwMDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19WUDlMZXZlbChpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDE6ICAgICByZXR1cm4gIjEiOworICAgICAgICBjYXNlIFZQOUxldmVsMTE6ICAgIHJldHVybiAiMS4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDI6ICAgICByZXR1cm4gIjIiOworICAgICAgICBjYXNlIFZQOUxldmVsMjE6ICAgIHJldHVybiAiMi4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDM6ICAgICByZXR1cm4gIjMiOworICAgICAgICBjYXNlIFZQOUxldmVsMzE6ICAgIHJldHVybiAiMy4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDQ6ICAgICByZXR1cm4gIjQiOworICAgICAgICBjYXNlIFZQOUxldmVsNDE6ICAgIHJldHVybiAiNC4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDU6ICAgICByZXR1cm4gIjUiOworICAgICAgICBjYXNlIFZQOUxldmVsNTE6ICAgIHJldHVybiAiNS4xIjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDUyOiAgICByZXR1cm4gIjUuMiI7CisgICAgICAgIGNhc2UgVlA5TGV2ZWw2OiAgICAgcmV0dXJuICI2IjsKKyAgICAgICAgY2FzZSBWUDlMZXZlbDYxOiAgICByZXR1cm4gIjYuMSI7CisgICAgICAgIGNhc2UgVlA5TGV2ZWw2MjogICAgcmV0dXJuICI2LjIiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCitjb25zdGV4cHIgaW50MzJfdCBBVjFQcm9maWxlTWFpbjggPSAweDE7Citjb25zdGV4cHIgaW50MzJfdCBBVjFQcm9maWxlTWFpbjEwID0gMHgyOworY29uc3RleHByIGludDMyX3QgQVYxUHJvZmlsZU1haW4xMEhEUjEwID0gMHgxMDAwOworY29uc3RleHByIGludDMyX3QgQVYxUHJvZmlsZU1haW4xMEhEUjEwUGx1cyA9IDB4MjAwMDsKKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19BVjFQcm9maWxlKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIEFWMVByb2ZpbGVNYWluODogICAgICAgICAgIHJldHVybiAiTWFpbjgiOworICAgICAgICBjYXNlIEFWMVByb2ZpbGVNYWluMTA6ICAgICAgICAgIHJldHVybiAiTWFpbjEwSERSIjsKKyAgICAgICAgY2FzZSBBVjFQcm9maWxlTWFpbjEwSERSMTA6ICAgICByZXR1cm4gIk1haW4xMEhEUjEwIjsKKyAgICAgICAgY2FzZSBBVjFQcm9maWxlTWFpbjEwSERSMTBQbHVzOiByZXR1cm4gIk1haW4xMEhEUlBsdXMiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCitjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDIgID0gMHgxOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWwyMSA9IDB4MjsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsMjIgPSAweDQ7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDIzID0gMHg4OworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWwzICA9IDB4MTA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDMxID0gMHgyMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsMzIgPSAweDQwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWwzMyA9IDB4ODA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDQgID0gMHgxMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDQxID0gMHgyMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDQyID0gMHg0MDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDQzID0gMHg4MDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDUgID0gMHgxMDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw1MSA9IDB4MjAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNTIgPSAweDQwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDUzID0gMHg4MDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw2ICA9IDB4MTAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDYxID0gMHgyMDAwMDsKK2NvbnN0ZXhwciBpbnQzMl90IEFWMUxldmVsNjIgPSAweDQwMDAwOworY29uc3RleHByIGludDMyX3QgQVYxTGV2ZWw2MyA9IDB4ODAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDcgID0gMHgxMDAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDcxID0gMHgyMDAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDcyID0gMHg0MDAwMDA7Citjb25zdGV4cHIgaW50MzJfdCBBVjFMZXZlbDczID0gMHg4MDAwMDA7CisKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfQVYxTGV2ZWwoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgQVYxTGV2ZWwyOiAgICAgcmV0dXJuICIyIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDIxOiAgICByZXR1cm4gIjIuMSI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWwyMjogICAgcmV0dXJuICIyLjIiOworICAgICAgICBjYXNlIEFWMUxldmVsMjM6ICAgIHJldHVybiAiMi4zIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDM6ICAgICByZXR1cm4gIjMiOworICAgICAgICBjYXNlIEFWMUxldmVsMzE6ICAgIHJldHVybiAiMy4xIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDMyOiAgICByZXR1cm4gIjMuMiI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWwzMzogICAgcmV0dXJuICIzLjMiOworICAgICAgICBjYXNlIEFWMUxldmVsNDogICAgIHJldHVybiAiNCI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw0MTogICAgcmV0dXJuICI0LjEiOworICAgICAgICBjYXNlIEFWMUxldmVsNDI6ICAgIHJldHVybiAiNC4yIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDQzOiAgICByZXR1cm4gIjQuMyI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw1OiAgICAgcmV0dXJuICI1IjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDUxOiAgICByZXR1cm4gIjUuMSI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw1MjogICAgcmV0dXJuICI1LjIiOworICAgICAgICBjYXNlIEFWMUxldmVsNTM6ICAgIHJldHVybiAiNS4zIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDY6ICAgICByZXR1cm4gIjYiOworICAgICAgICBjYXNlIEFWMUxldmVsNjE6ICAgIHJldHVybiAiNi4xIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDYyOiAgICByZXR1cm4gIjYuMiI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw2MzogICAgcmV0dXJuICI2LjMiOworICAgICAgICBjYXNlIEFWMUxldmVsNzogICAgIHJldHVybiAiNyI7CisgICAgICAgIGNhc2UgQVYxTGV2ZWw3MTogICAgcmV0dXJuICI3LjEiOworICAgICAgICBjYXNlIEFWMUxldmVsNzI6ICAgIHJldHVybiAiNy4yIjsKKyAgICAgICAgY2FzZSBBVjFMZXZlbDczOiAgICByZXR1cm4gIjcuMyI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IEhFVkNQcm9maWxlTWFpbiAgICAgICAgPSAweDAxOwogY29uc3RleHByIGludDMyX3QgSEVWQ1Byb2ZpbGVNYWluMTAgICAgICA9IDB4MDI7CiBjb25zdGV4cHIgaW50MzJfdCBIRVZDUHJvZmlsZU1haW5TdGlsbCAgID0gMHgwNDsKIGNvbnN0ZXhwciBpbnQzMl90IEhFVkNQcm9maWxlTWFpbjEwSERSMTAgPSAweDEwMDA7Citjb25zdGV4cHIgaW50MzJfdCBIRVZDUHJvZmlsZU1haW4xMEhEUjEwUGx1cyA9IDB4MjAwMDsKKworaW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19IRVZDUHJvZmlsZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBIRVZDUHJvZmlsZU1haW46ICAgICAgICAgICAgICAgcmV0dXJuICJNYWluIjsKKyAgICAgICAgY2FzZSBIRVZDUHJvZmlsZU1haW4xMDogICAgICAgICAgICAgcmV0dXJuICJNYWluMTAiOworICAgICAgICBjYXNlIEhFVkNQcm9maWxlTWFpblN0aWxsOiAgICAgICAgICByZXR1cm4gIk1haW5TdGlsbCI7CisgICAgICAgIGNhc2UgSEVWQ1Byb2ZpbGVNYWluMTBIRFIxMDogICAgICAgIHJldHVybiAiTWFpbjEwSERSMTAiOworICAgICAgICBjYXNlIEhFVkNQcm9maWxlTWFpbjEwSERSMTBQbHVzOiAgICByZXR1cm4gIk1haW4xMEhEUjEwUGx1cyI7CisgICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQogCiBjb25zdGV4cHIgaW50MzJfdCBIRVZDTWFpblRpZXJMZXZlbDEgID0gMHgxOwogY29uc3RleHByIGludDMyX3QgSEVWQ0hpZ2hUaWVyTGV2ZWwxICA9IDB4MjsKQEAgLTE4Myw2ICs0NzAsMzggQEAKIGNvbnN0ZXhwciBpbnQzMl90IEhFVkNNYWluVGllckxldmVsNjIgPSAweDEwMDAwMDA7CiBjb25zdGV4cHIgaW50MzJfdCBIRVZDSGlnaFRpZXJMZXZlbDYyID0gMHgyMDAwMDAwOwogCitpbmxpbmUgc3RhdGljIGNvbnN0IGNoYXIgKmFzU3RyaW5nX0hFVkNUaWVyTGV2ZWwoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWwxOiAgICByZXR1cm4gIk1haW4gMSI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWwxOiAgICByZXR1cm4gIkhpZ2ggMSI7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWwyOiAgICByZXR1cm4gIk1haW4gMiI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWwyOiAgICByZXR1cm4gIkhpZ2ggMiI7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWwyMTogICByZXR1cm4gIk1haW4gMi4xIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDIxOiAgIHJldHVybiAiSGlnaCAyLjEiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsMzogICAgcmV0dXJuICJNYWluIDMiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsMzogICAgcmV0dXJuICJIaWdoIDMiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsMzE6ICAgcmV0dXJuICJNYWluIDMuMSI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWwzMTogICByZXR1cm4gIkhpZ2ggMy4xIjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDQ6ICAgIHJldHVybiAiTWFpbiA0IjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDQ6ICAgIHJldHVybiAiSGlnaCA0IjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDQxOiAgIHJldHVybiAiTWFpbiA0LjEiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsNDE6ICAgcmV0dXJuICJIaWdoIDQuMSI7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWw1OiAgICByZXR1cm4gIk1haW4gNSI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWw1OiAgICByZXR1cm4gIkhpZ2ggNSI7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWw1MTogICByZXR1cm4gIk1haW4gNS4xIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDUxOiAgIHJldHVybiAiSGlnaCA1LjEiOworICAgICAgICBjYXNlIEhFVkNNYWluVGllckxldmVsNTI6ICAgcmV0dXJuICJNYWluIDUuMiI7CisgICAgICAgIGNhc2UgSEVWQ0hpZ2hUaWVyTGV2ZWw1MjogICByZXR1cm4gIkhpZ2ggNS4yIjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDY6ICAgIHJldHVybiAiTWFpbiA2IjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDY6ICAgIHJldHVybiAiSGlnaCA2IjsKKyAgICAgICAgY2FzZSBIRVZDTWFpblRpZXJMZXZlbDYxOiAgIHJldHVybiAiTWFpbiA2LjEiOworICAgICAgICBjYXNlIEhFVkNIaWdoVGllckxldmVsNjE6ICAgcmV0dXJuICJIaWdoIDYuMSI7CisgICAgICAgIGNhc2UgSEVWQ01haW5UaWVyTGV2ZWw2MjogICByZXR1cm4gIk1haW4gNi4yIjsKKyAgICAgICAgY2FzZSBIRVZDSGlnaFRpZXJMZXZlbDYyOiAgIHJldHVybiAiSGlnaCA2LjIiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRlZjsKKyAgICB9Cit9CisKIGNvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZQZXIgPSAweDE7CiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvblByb2ZpbGVEdmF2UGVuID0gMHgyOwogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25Qcm9maWxlRHZoZURlciA9IDB4NDsKQEAgLTE5NCw2ICs1MTMsMjIgQEAKIGNvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVTdCA9IDB4MTAwOwogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlID0gMHgyMDA7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfRG9sYnlWaXNpb25Qcm9maWxlKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2YXZQZXI6IHJldHVybiAiRHZhdlBlciI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlBlbjogcmV0dXJuICJEdmF2UGVuIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmhlRGVyOiByZXR1cm4gIkR2aGVEZXIiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEZW46IHJldHVybiAiRHZoZURlbiI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0cjogcmV0dXJuICJEdmhlRHRyIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmhlU3RuOiByZXR1cm4gIkR2aGVTdG4iOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uUHJvZmlsZUR2aGVEdGg6IHJldHVybiAiRHZoZUR0aCI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZoZUR0YjogcmV0dXJuICJEdmhlRHRiIjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvblByb2ZpbGVEdmhlU3Q6ICByZXR1cm4gIkR2aGVTdCI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25Qcm9maWxlRHZhdlNlOiAgcmV0dXJuICJEdmF2U2UiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBEb2xieVZpc2lvbkxldmVsSGQyNCAgICA9IDB4MTsKIGNvbnN0ZXhwciBpbnQzMl90IERvbGJ5VmlzaW9uTGV2ZWxIZDMwICAgID0gMHgyOwogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbEZoZDI0ICAgPSAweDQ7CkBAIC0yMDQsMTAgKzUzOSwzNCBAQAogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbFVoZDQ4ICAgPSAweDgwOwogY29uc3RleHByIGludDMyX3QgRG9sYnlWaXNpb25MZXZlbFVoZDYwICAgPSAweDEwMDsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19Eb2xieVZpc2lvbkxldmVsKGludDMyX3QgaSwgY29uc3QgY2hhciAqZGVmID0gIj8/IikgeworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWxIZDI0OiAgcmV0dXJuICJIZDI0IjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsSGQzMDogIHJldHVybiAiSGQzMCI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbEZoZDI0OiByZXR1cm4gIkZoZDI0IjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsRmhkMzA6IHJldHVybiAiRmhkMzAiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWxGaGQ2MDogcmV0dXJuICJGaGQ2MCI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbFVoZDI0OiByZXR1cm4gIlVoZDI0IjsKKyAgICAgICAgY2FzZSBEb2xieVZpc2lvbkxldmVsVWhkMzA6IHJldHVybiAiVWhkMzAiOworICAgICAgICBjYXNlIERvbGJ5VmlzaW9uTGV2ZWxVaGQ0ODogcmV0dXJuICJVaGQ0OCI7CisgICAgICAgIGNhc2UgRG9sYnlWaXNpb25MZXZlbFVoZDYwOiByZXR1cm4gIlVoZDYwIjsKKyAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgaW50MzJfdCBCSVRSQVRFX01PREVfQ0JSID0gMjsKIGNvbnN0ZXhwciBpbnQzMl90IEJJVFJBVEVfTU9ERV9DUSA9IDA7CiBjb25zdGV4cHIgaW50MzJfdCBCSVRSQVRFX01PREVfVkJSID0gMTsKIAoraW5saW5lIHN0YXRpYyBjb25zdCBjaGFyICphc1N0cmluZ19CaXRyYXRlTW9kZShpbnQzMl90IGksIGNvbnN0IGNoYXIgKmRlZiA9ICI/PyIpIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBCSVRSQVRFX01PREVfQ0JSOiAgcmV0dXJuICJDQlIiOworICAgICAgICBjYXNlIEJJVFJBVEVfTU9ERV9DUTogICByZXR1cm4gIkNRIjsKKyAgICAgICAgY2FzZSBCSVRSQVRFX01PREVfVkJSOiAgcmV0dXJuICJWQlIiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICByZXR1cm4gZGVmOworICAgIH0KK30KKwogY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0MTJiaXRSR0I0NDQgICAgICAgICAgICAgPSAzOwogY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0MTZiaXRBUkdCMTU1NSAgICAgICAgICAgPSA1OwogY29uc3RleHByIGludDMyX3QgQ09MT1JfRm9ybWF0MTZiaXRBUkdCNDQ0NCAgICAgICAgICAgPSA0OwpAQCAtMjYxLDYgKzYyMCw2NCBAQAogY29uc3RleHByIGludDMyX3QgQ09MT1JfUUNPTV9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyICAgPSAweDdmYTMwYzAwOwogY29uc3RleHByIGludDMyX3QgQ09MT1JfVElfRm9ybWF0WVVWNDIwUGFja2VkU2VtaVBsYW5hciA9IDB4N2YwMDAxMDA7CiAKK2lubGluZSBzdGF0aWMgY29uc3QgY2hhciAqYXNTdHJpbmdfQ29sb3JGb3JtYXQoaW50MzJfdCBpLCBjb25zdCBjaGFyICpkZWYgPSAiPz8iKSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MTJiaXRSR0I0NDQ6ICAgICAgICAgICAgICAgcmV0dXJuICIxMmJpdFJHQjQ0NCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MTZiaXRBUkdCMTU1NTogICAgICAgICAgICAgcmV0dXJuICIxNmJpdEFSR0IxNTU1IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQxNmJpdEFSR0I0NDQ0OiAgICAgICAgICAgICByZXR1cm4gIjE2Yml0QVJHQjQ0NDQiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDE2Yml0QkdSNTY1OiAgICAgICAgICAgICAgIHJldHVybiAiMTZiaXRCR1I1NjUiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDE2Yml0UkdCNTY1OiAgICAgICAgICAgICAgIHJldHVybiAiMTZiaXRSR0I1NjUiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDE4Yml0QVJHQjE2NjU6ICAgICAgICAgICAgIHJldHVybiAiMThiaXRBUkdCMTY2NSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MThCaXRCR1I2NjY6ICAgICAgICAgICAgICAgcmV0dXJuICIxOEJpdEJHUjY2NiI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MThiaXRSR0I2NjY6ICAgICAgICAgICAgICAgcmV0dXJuICIxOGJpdFJHQjY2NiI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MTliaXRBUkdCMTY2NjogICAgICAgICAgICAgcmV0dXJuICIxOWJpdEFSR0IxNjY2IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQyNEJpdEFCR1I2NjY2OiAgICAgICAgICAgICByZXR1cm4gIjI0Qml0QUJHUjY2NjYiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDI0Yml0QVJHQjE4ODc6ICAgICAgICAgICAgIHJldHVybiAiMjRiaXRBUkdCMTg4NyI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MjRCaXRBUkdCNjY2NjogICAgICAgICAgICAgcmV0dXJuICIyNEJpdEFSR0I2NjY2IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQyNGJpdEJHUjg4ODogICAgICAgICAgICAgICByZXR1cm4gIjI0Yml0QkdSODg4IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQyNGJpdFJHQjg4ODogICAgICAgICAgICAgICByZXR1cm4gIjI0Yml0UkdCODg4IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQyNWJpdEFSR0IxODg4OiAgICAgICAgICAgICByZXR1cm4gIjI1Yml0QVJHQjE4ODgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDMyYml0QUJHUjg4ODg6ICAgICAgICAgICAgIHJldHVybiAiMzJiaXRBQkdSODg4OCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0MzJiaXRBUkdCODg4ODogICAgICAgICAgICAgcmV0dXJuICIzMmJpdEFSR0I4ODg4IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXQzMmJpdEJHUkE4ODg4OiAgICAgICAgICAgICByZXR1cm4gIjMyYml0QkdSQTg4ODgiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdDhiaXRSR0IzMzI6ICAgICAgICAgICAgICAgIHJldHVybiAiOGJpdFJHQjMzMiI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0Q2JZQ3JZOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJDYllDclkiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdENyWUNiWTogICAgICAgICAgICAgICAgICAgIHJldHVybiAiQ3JZQ2JZIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRMMTY6ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkwxNiI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0TDI6ICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJMMiI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0TDI0OiAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJMMjQiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdEwzMjogICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAiTDMyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRMNDogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkw0IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRMODogICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gIkw4IjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRNb25vY2hyb21lOiAgICAgICAgICAgICAgICByZXR1cm4gIk1vbm9jaHJvbWUiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFJhd0JheWVyMTBiaXQ6ICAgICAgICAgICAgIHJldHVybiAiUmF3QmF5ZXIxMGJpdCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UmF3QmF5ZXI4Yml0OiAgICAgICAgICAgICAgcmV0dXJuICJSYXdCYXllcjhiaXQiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFJhd0JheWVyOGJpdGNvbXByZXNzZWQ6ICAgIHJldHVybiAiUmF3QmF5ZXI4Yml0Y29tcHJlc3NlZCI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0UkdCQUZsZXhpYmxlOiAgICAgICAgICAgICAgcmV0dXJuICJSR0JBRmxleGlibGUiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFJHQkZsZXhpYmxlOiAgICAgICAgICAgICAgIHJldHVybiAiUkdCRmxleGlibGUiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFN1cmZhY2U6ICAgICAgICAgICAgICAgICAgIHJldHVybiAiU3VyZmFjZSI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WUNiWUNyOiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJZQ2JZQ3IiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlDcllDYjogICAgICAgICAgICAgICAgICAgIHJldHVybiAiWUNyWUNiIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MTFQYWNrZWRQbGFuYXI6ICAgICAgICByZXR1cm4gIllVVjQxMVBhY2tlZFBsYW5hciI7CisgICAgICAgIGNhc2UgQ09MT1JfRm9ybWF0WVVWNDExUGxhbmFyOiAgICAgICAgICAgICAgcmV0dXJuICJZVVY0MTFQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlOiAgICAgICAgICAgIHJldHVybiAiWVVWNDIwRmxleGlibGUiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBhY2tlZFBsYW5hcjogICAgICAgIHJldHVybiAiWVVWNDIwUGFja2VkUGxhbmFyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOiAgICByZXR1cm4gIllVVjQyMFBhY2tlZFNlbWlQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjogICAgICAgICAgICAgIHJldHVybiAiWVVWNDIwUGxhbmFyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjBTZW1pUGxhbmFyOiAgICAgICAgICByZXR1cm4gIllVVjQyMFNlbWlQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMkZsZXhpYmxlOiAgICAgICAgICAgIHJldHVybiAiWVVWNDIyRmxleGlibGUiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMlBhY2tlZFBsYW5hcjogICAgICAgIHJldHVybiAiWVVWNDIyUGFja2VkUGxhbmFyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjJQYWNrZWRTZW1pUGxhbmFyOiAgICByZXR1cm4gIllVVjQyMlBhY2tlZFNlbWlQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQyMlBsYW5hcjogICAgICAgICAgICAgIHJldHVybiAiWVVWNDIyUGxhbmFyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9Gb3JtYXRZVVY0MjJTZW1pUGxhbmFyOiAgICAgICAgICByZXR1cm4gIllVVjQyMlNlbWlQbGFuYXIiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQ0NEZsZXhpYmxlOiAgICAgICAgICAgIHJldHVybiAiWVVWNDQ0RmxleGlibGUiOworICAgICAgICBjYXNlIENPTE9SX0Zvcm1hdFlVVjQ0NEludGVybGVhdmVkOiAgICAgICAgIHJldHVybiAiWVVWNDQ0SW50ZXJsZWF2ZWQiOworICAgICAgICBjYXNlIENPTE9SX1FDT01fRm9ybWF0WVVWNDIwU2VtaVBsYW5hcjogICAgIHJldHVybiAiUUNPTV9ZVVY0MjBTZW1pUGxhbmFyIjsKKyAgICAgICAgY2FzZSBDT0xPUl9USV9Gb3JtYXRZVVY0MjBQYWNrZWRTZW1pUGxhbmFyOiByZXR1cm4gIlRJX1lVVjQyMFBhY2tlZFNlbWlQbGFuYXIiOworICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZWY7CisgICAgfQorfQorCiBjb25zdGV4cHIgY2hhciBGRUFUVVJFX0FkYXB0aXZlUGxheWJhY2tbXSAgICAgICA9ICJhZGFwdGl2ZS1wbGF5YmFjayI7CiBjb25zdGV4cHIgY2hhciBGRUFUVVJFX0ludHJhUmVmcmVzaFtdID0gImludHJhLXJlZnJlc2giOwogY29uc3RleHByIGNoYXIgRkVBVFVSRV9QYXJ0aWFsRnJhbWVbXSA9ICJwYXJ0aWFsLWZyYW1lIjsKQEAgLTI3MCw2ICs2ODcsNyBAQAogLy8gZnJvbSBNZWRpYUZvcm1hdC5qYXZhCiBjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19WUDhbXSA9ICJ2aWRlby94LXZuZC5vbjIudnA4IjsKIGNvbnN0ZXhwciBjaGFyIE1JTUVUWVBFX1ZJREVPX1ZQOVtdID0gInZpZGVvL3gtdm5kLm9uMi52cDkiOworY29uc3RleHByIGNoYXIgTUlNRVRZUEVfVklERU9fQVYxW10gPSAidmlkZW8vYXYwMSI7CiBjb25zdGV4cHIgY2hhciBNSU1FVFlQRV9WSURFT19BVkNbXSA9ICJ2aWRlby9hdmMiOwogY29uc3RleHByIGNoYXIgTUlNRVRZUEVfVklERU9fSEVWQ1tdID0gInZpZGVvL2hldmMiOwogY29uc3RleHByIGNoYXIgTUlNRVRZUEVfVklERU9fTVBFRzRbXSA9ICJ2aWRlby9tcDR2LWVzIjsKQEAgLTMyNyw2ICs3NDUsNyBAQAogY29uc3RleHByIGNoYXIgS0VZX0JJVFJBVEVfTU9ERVtdID0gImJpdHJhdGUtbW9kZSI7CiBjb25zdGV4cHIgY2hhciBLRVlfQ0FfU0VTU0lPTl9JRFtdID0gImNhLXNlc3Npb24taWQiOwogY29uc3RleHByIGNoYXIgS0VZX0NBX1NZU1RFTV9JRFtdID0gImNhLXN5c3RlbS1pZCI7Citjb25zdGV4cHIgY2hhciBLRVlfQ0FfUFJJVkFURV9EQVRBW10gPSAiY2EtcHJpdmF0ZS1kYXRhIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DQVBUVVJFX1JBVEVbXSA9ICJjYXB0dXJlLXJhdGUiOwogY29uc3RleHByIGNoYXIgS0VZX0NIQU5ORUxfQ09VTlRbXSA9ICJjaGFubmVsLWNvdW50IjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9DSEFOTkVMX01BU0tbXSA9ICJjaGFubmVsLW1hc2siOwpAQCAtMzM1LDYgKzc1NCw3IEBACiBjb25zdGV4cHIgY2hhciBLRVlfQ09MT1JfU1RBTkRBUkRbXSA9ICJjb2xvci1zdGFuZGFyZCI7CiBjb25zdGV4cHIgY2hhciBLRVlfQ09MT1JfVFJBTlNGRVJbXSA9ICJjb2xvci10cmFuc2ZlciI7CiBjb25zdGV4cHIgY2hhciBLRVlfQ09NUExFWElUWVtdID0gImNvbXBsZXhpdHkiOworY29uc3RleHByIGNoYXIgS0VZX0NSRUFURV9JTlBVVF9TVVJGQUNFX1NVU1BFTkRFRFtdID0gImNyZWF0ZS1pbnB1dC1idWZmZXJzLXN1c3BlbmRlZCI7CiBjb25zdGV4cHIgY2hhciBLRVlfRFVSQVRJT05bXSA9ICJkdXJhdGlvblVzIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9GRUFUVVJFX1tdID0gImZlYXR1cmUtIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMW10gPSAiZmxhYy1jb21wcmVzc2lvbi1sZXZlbCI7CkBAIC0zNDIsNiArNzYyLDcgQEAKIGNvbnN0ZXhwciBjaGFyIEtFWV9HUklEX0NPTFVNTlNbXSA9ICJncmlkLWNvbHMiOwogY29uc3RleHByIGNoYXIgS0VZX0dSSURfUk9XU1tdID0gImdyaWQtcm93cyI7CiBjb25zdGV4cHIgY2hhciBLRVlfSERSX1NUQVRJQ19JTkZPW10gPSAiaGRyLXN0YXRpYy1pbmZvIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9IRFIxMF9QTFVTX0lORk9bXSA9ICJoZHIxMC1wbHVzLWluZm8iOwogY29uc3RleHByIGNoYXIgS0VZX0hFSUdIVFtdID0gImhlaWdodCI7CiBjb25zdGV4cHIgY2hhciBLRVlfSV9GUkFNRV9JTlRFUlZBTFtdID0gImktZnJhbWUtaW50ZXJ2YWwiOwogY29uc3RleHByIGNoYXIgS0VZX0lOVFJBX1JFRlJFU0hfUEVSSU9EW10gPSAiaW50cmEtcmVmcmVzaC1wZXJpb2QiOwpAQCAtMzUzLDE0ICs3NzQsMTggQEAKIGNvbnN0ZXhwciBjaGFyIEtFWV9MQU5HVUFHRVtdID0gImxhbmd1YWdlIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9MQVRFTkNZW10gPSAibGF0ZW5jeSI7CiBjb25zdGV4cHIgY2hhciBLRVlfTEVWRUxbXSA9ICJsZXZlbCI7Citjb25zdGV4cHIgY2hhciBLRVlfTUFYX0JfRlJBTUVTW10gPSAibWF4LWJmcmFtZXMiOwogY29uc3RleHByIGNoYXIgS0VZX01BWF9CSVRfUkFURVtdID0gIm1heC1iaXRyYXRlIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9NQVhfRlBTX1RPX0VOQ09ERVJbXSA9ICJtYXgtZnBzLXRvLWVuY29kZXIiOwogY29uc3RleHByIGNoYXIgS0VZX01BWF9IRUlHSFRbXSA9ICJtYXgtaGVpZ2h0IjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9NQVhfSU5QVVRfU0laRVtdID0gIm1heC1pbnB1dC1zaXplIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSW10gPSAibWF4LXB0cy1nYXAtdG8tZW5jb2RlciI7CiBjb25zdGV4cHIgY2hhciBLRVlfTUFYX1dJRFRIW10gPSAibWF4LXdpZHRoIjsKIGNvbnN0ZXhwciBjaGFyIEtFWV9NSU1FW10gPSAibWltZSI7CiBjb25zdGV4cHIgY2hhciBLRVlfT1BFUkFUSU5HX1JBVEVbXSA9ICJvcGVyYXRpbmctcmF0ZSI7CiBjb25zdGV4cHIgY2hhciBLRVlfT1VUUFVUX1JFT1JERVJfREVQVEhbXSA9ICJvdXRwdXQtcmVvcmRlci1kZXB0aCI7CiBjb25zdGV4cHIgY2hhciBLRVlfUENNX0VOQ09ESU5HW10gPSAicGNtLWVuY29kaW5nIjsKK2NvbnN0ZXhwciBjaGFyIEtFWV9QUkVQRU5EX0hFQURFUlNfVE9fU1lOQ19GUkFNRVNbXSA9ICJwcmVwZW5kLXNwcy1wcHMtdG8taWRyLWZyYW1lcyI7CiBjb25zdGV4cHIgY2hhciBLRVlfUFJJT1JJVFlbXSA9ICJwcmlvcml0eSI7CiBjb25zdGV4cHIgY2hhciBLRVlfUFJPRklMRVtdID0gInByb2ZpbGUiOwogY29uc3RleHByIGNoYXIgS0VZX1BVU0hfQkxBTktfQlVGRkVSU19PTl9TVE9QW10gPSAicHVzaC1ibGFuay1idWZmZXJzLW9uLXNodXRkb3duIjsKQEAgLTQxMCw4ICs4MzUsMTAgQEAKIGNvbnN0ZXhwciBpbnQzMl90IElORk9fVFJZX0FHQUlOX0xBVEVSICAgICAgICA9IC0xOwogY29uc3RleHByIGludDMyX3QgVklERU9fU0NBTElOR19NT0RFX1NDQUxFX1RPX0ZJVCAgICAgICAgICAgICAgID0gMTsKIGNvbnN0ZXhwciBpbnQzMl90IFZJREVPX1NDQUxJTkdfTU9ERV9TQ0FMRV9UT19GSVRfV0lUSF9DUk9QUElORyA9IDI7Citjb25zdGV4cHIgY2hhciBQQVJBTUVURVJfS0VZX09GRlNFVF9USU1FW10gPSAidGltZS1vZmZzZXQtdXMiOwogY29uc3RleHByIGNoYXIgUEFSQU1FVEVSX0tFWV9SRVFVRVNUX1NZTkNfRlJBTUVbXSA9ICJyZXF1ZXN0LXN5bmMiOwogY29uc3RleHByIGNoYXIgUEFSQU1FVEVSX0tFWV9TVVNQRU5EW10gPSAiZHJvcC1pbnB1dC1mcmFtZXMiOworY29uc3RleHByIGNoYXIgUEFSQU1FVEVSX0tFWV9TVVNQRU5EX1RJTUVbXSA9ICJkcm9wLXN0YXJ0LXRpbWUtdXMiOwogY29uc3RleHByIGNoYXIgUEFSQU1FVEVSX0tFWV9WSURFT19CSVRSQVRFW10gPSAidmlkZW8tYml0cmF0ZSI7CiAKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3QuaAppbmRleCBlNDRiMGE0Li5lNjgxZDI1IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdC5oCkBAIC04Myw2ICs4Myw3IEBACiAgICAgfTsKIAogICAgIHN0YXRpYyBzcDxCaW5kZXJEZWF0aE9ic2VydmVyPiBzQmluZGVyRGVhdGhPYnNlcnZlcjsKKyAgICBzdGF0aWMgc3A8SUJpbmRlcj4gc01lZGlhUGxheWVyOwogCiAgICAgc3RhdGljIHNwPElNZWRpYUNvZGVjTGlzdD4gc0NvZGVjTGlzdDsKICAgICBzdGF0aWMgc3A8SU1lZGlhQ29kZWNMaXN0PiBzUmVtb3RlTGlzdDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0xpc3RXcml0ZXIuaAppbmRleCA1OWY1N2M3Li5mNTNiMjNlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0V3JpdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjTGlzdFdyaXRlci5oCkBAIC00OCw2ICs0OCwxMyBAQAogICAgICAqIGFkZGVkIGBNZWRpYUNvZGVjSW5mb2Agb2JqZWN0LgogICAgICAqLwogICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4gYWRkTWVkaWFDb2RlY0luZm8oKTsKKyAgICAvKioKKyAgICAgKiBGaW5kIGFuIGV4aXN0aW5nIGBNZWRpYUNvZGVjSW5mb2Agb2JqZWN0IGZvciBhIGNvZGVjIG5hbWUgYW5kIHJldHVybiBhCisgICAgICogYE1lZGlhQ29kZWNJbmZvV3JpdGVyYCBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBmb3VuZCBhZGRlZCBgTWVkaWFDb2RlY0luZm9gLgorICAgICAqCisgICAgICogQHJldHVybiBUaGUgYE1lZGlhQ29kZWNJbmZvV3JpdGVyYCBvYmplY3QgaWYgZm91bmQsIG9yIG51bGxwdHIgaWYgbm90IGZvdW5kLgorICAgICAqLworICAgIHN0ZDo6dW5pcXVlX3B0cjxNZWRpYUNvZGVjSW5mb1dyaXRlcj4gZmluZE1lZGlhQ29kZWNJbmZvKGNvbnN0IGNoYXIgKmNvZGVjTmFtZSk7CiBwcml2YXRlOgogICAgIE1lZGlhQ29kZWNMaXN0V3JpdGVyKCkgPSBkZWZhdWx0OwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmgKaW5kZXggNmE1YzZiNi4uNmY0OGM1ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUVycm9ycy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaApAQCAtNzAsNyArNzAsMTIgQEAKICAgICBFUlJPUl9EUk1fREVWSUNFX1JFVk9LRUQgICAgICAgICAgICAgICAgID0gRFJNX0VSUk9SX0JBU0UgLSA5LAogICAgIEVSUk9SX0RSTV9SRVNPVVJDRV9CVVNZICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDEwLAogICAgIEVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfT1VUUFVUX1BST1RFQ1RJT04gPSBEUk1fRVJST1JfQkFTRSAtIDExLAotICAgIEVSUk9SX0RSTV9MQVNUX1VTRURfRVJST1JDT0RFICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDExLAorICAgIEVSUk9SX0RSTV9JTlNVRkZJQ0lFTlRfU0VDVVJJVFkgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDEyLAorICAgIEVSUk9SX0RSTV9GUkFNRV9UT09fTEFSR0UgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDEzLAorICAgIEVSUk9SX0RSTV9SRVNPVVJDRV9DT05URU5USU9OICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDE0LAorICAgIEVSUk9SX0RSTV9TRVNTSU9OX0xPU1RfU1RBVEUgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDE1LAorICAgIEVSUk9SX0RSTV9JTlZBTElEX1NUQVRFICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDE2LAorICAgIEVSUk9SX0RSTV9MQVNUX1VTRURfRVJST1JDT0RFICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDE2LAogCiAgICAgRVJST1JfRFJNX1ZFTkRPUl9NQVggICAgICAgICAgICAgICAgICAgICA9IERSTV9FUlJPUl9CQVNFIC0gNTAwLAogICAgIEVSUk9SX0RSTV9WRU5ET1JfTUlOICAgICAgICAgICAgICAgICAgICAgPSBEUk1fRVJST1JfQkFTRSAtIDk5OSwKQEAgLTk0LDcgKzk5LDEzIEBACiAgICAgRVJST1JfQ0FTX0RFVklDRV9SRVZPS0VEICAgICAgICAgICAgICAgICA9IENBU19FUlJPUl9CQVNFIC0gOSwKICAgICBFUlJPUl9DQVNfUkVTT1VSQ0VfQlVTWSAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSAxMCwKICAgICBFUlJPUl9DQVNfSU5TVUZGSUNJRU5UX09VVFBVVF9QUk9URUNUSU9OID0gQ0FTX0VSUk9SX0JBU0UgLSAxMSwKLSAgICBFUlJPUl9DQVNfTEFTVF9VU0VEX0VSUk9SQ09ERSAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSAxMSwKKyAgICBFUlJPUl9DQVNfTkVFRF9BQ1RJVkFUSU9OICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSAxMiwKKyAgICBFUlJPUl9DQVNfTkVFRF9QQUlSSU5HICAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSAxMywKKyAgICBFUlJPUl9DQVNfTk9fQ0FSRCAgICAgICAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSAxNCwKKyAgICBFUlJPUl9DQVNfQ0FSRF9NVVRFICAgICAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSAxNSwKKyAgICBFUlJPUl9DQVNfQ0FSRF9JTlZBTElEICAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSAxNiwKKyAgICBFUlJPUl9DQVNfQkxBQ0tPVVQgICAgICAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSAxNywKKyAgICBFUlJPUl9DQVNfTEFTVF9VU0VEX0VSUk9SQ09ERSAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSAxNywKIAogICAgIEVSUk9SX0NBU19WRU5ET1JfTUFYICAgICAgICAgICAgICAgICAgICAgPSBDQVNfRVJST1JfQkFTRSAtIDUwMCwKICAgICBFUlJPUl9DQVNfVkVORE9SX01JTiAgICAgICAgICAgICAgICAgICAgID0gQ0FTX0VSUk9SX0JBU0UgLSA5OTksCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlmMThkNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3IuaApAQCAtMCwwICsxLDEwOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTUVESUFfRVhUUkFDVE9SX0hfCisKKyNkZWZpbmUgTUVESUFfRVhUUkFDVE9SX0hfCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9NZWRpYUV4dHJhY3RvclBsdWdpbkFwaS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yUGx1Z2luSGVscGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGF0YVNvdXJjZUJhc2U7CitjbGFzcyBNZXRhRGF0YUJhc2U7CitzdHJ1Y3QgTWVkaWFUcmFjazsKKworCitjbGFzcyBFeHRyYWN0b3JBbGxvY1RyYWNrZXIgeworcHVibGljOgorICAgIEV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoImV4dHJhY3RvciBhbGxvY2F0ZWQ6ICVwIiwgdGhpcyk7CisgICAgfQorICAgIHZpcnR1YWwgfkV4dHJhY3RvckFsbG9jVHJhY2tlcigpIHsKKyAgICAgICAgQUxPR0QoImV4dHJhY3RvciBmcmVlZDogJXAiLCB0aGlzKTsKKyAgICB9Cit9OworCitjbGFzcyBNZWRpYUV4dHJhY3RvcgorLy8gOiBwdWJsaWMgRXh0cmFjdG9yQWxsb2NUcmFja2VyCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3IoKTsKKyAgICB2aXJ0dWFsIHNpemVfdCBjb3VudFRyYWNrcygpID0gMDsKKyAgICB2aXJ0dWFsIE1lZGlhVHJhY2sgKmdldFRyYWNrKHNpemVfdCBpbmRleCkgPSAwOworCisgICAgZW51bSBHZXRUcmFja01ldGFEYXRhRmxhZ3MgeworICAgICAgICBrSW5jbHVkZUV4dGVuc2l2ZU1ldGFEYXRhID0gMQorICAgIH07CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRUcmFja01ldGFEYXRhKAorICAgICAgICAgICAgTWV0YURhdGFCYXNlJiBtZXRhLAorICAgICAgICAgICAgc2l6ZV90IGluZGV4LCB1aW50MzJfdCBmbGFncyA9IDApID0gMDsKKworICAgIC8vIFJldHVybiBjb250YWluZXIgc3BlY2lmaWMgbWV0YS1kYXRhLiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAgIC8vIHJldHVybnMgYW4gZW1wdHkgbWV0YWRhdGEgb2JqZWN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWV0YURhdGEoTWV0YURhdGFCYXNlJiBtZXRhKSA9IDA7CisKKyAgICBlbnVtIEZsYWdzIHsKKyAgICAgICAgQ0FOX1NFRUtfQkFDS1dBUkQgID0gMSwgIC8vIHRoZSAic2VlayAxMHNlY3MgYmFjayBidXR0b24iCisgICAgICAgIENBTl9TRUVLX0ZPUldBUkQgICA9IDIsICAvLyB0aGUgInNlZWsgMTBzZWNzIGZvcndhcmQgYnV0dG9uIgorICAgICAgICBDQU5fUEFVU0UgICAgICAgICAgPSA0LAorICAgICAgICBDQU5fU0VFSyAgICAgICAgICAgPSA4LCAgLy8gdGhlICJzZWVrIGJhciIKKyAgICB9OworCisgICAgLy8gSWYgc3ViY2xhc3NlcyBkbyBfbm90XyBvdmVycmlkZSB0aGlzLCB0aGUgZGVmYXVsdCBpcworICAgIC8vIENBTl9TRUVLX0JBQ0tXQVJEIHwgQ0FOX1NFRUtfRk9SV0FSRCB8IENBTl9TRUVLIHwgQ0FOX1BBVVNFCisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpIGNvbnN0OworCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNZWRpYUNhcyhjb25zdCB1aW50OF90KiAvKmNhc1Rva2VuKi8sIHNpemVfdCAvKnNpemUqLykgeworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQorCisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpIHsgcmV0dXJuICI8dW5zcGVjaWZpZWQ+IjsgfQorCitwcm90ZWN0ZWQ6CisgICAgTWVkaWFFeHRyYWN0b3IoKTsKKworcHJpdmF0ZToKKyAgICBNZWRpYUV4dHJhY3Rvcihjb25zdCBNZWRpYUV4dHJhY3RvciAmKTsKKyAgICBNZWRpYUV4dHJhY3RvciAmb3BlcmF0b3I9KGNvbnN0IE1lZGlhRXh0cmFjdG9yICYpOworfTsKKworY2xhc3MgTWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyIDogcHVibGljIE1lZGlhRXh0cmFjdG9yIHsKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBNZWRpYUV4dHJhY3RvckNVbndyYXBwZXIoQ01lZGlhRXh0cmFjdG9yICpwbHVnaW4pOworICAgIHZpcnR1YWwgc2l6ZV90IGNvdW50VHJhY2tzKCk7CisgICAgdmlydHVhbCBNZWRpYVRyYWNrICpnZXRUcmFjayhzaXplX3QgaW5kZXgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VHJhY2tNZXRhRGF0YShNZXRhRGF0YUJhc2UmIG1ldGEsIHNpemVfdCBpbmRleCwgdWludDMyX3QgZmxhZ3MgPSAwKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1ldGFEYXRhKE1ldGFEYXRhQmFzZSYgbWV0YSk7CisgICAgdmlydHVhbCBjb25zdCBjaGFyICogbmFtZSgpOworICAgIHZpcnR1YWwgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1lZGlhQ2FzKGNvbnN0IHVpbnQ4X3QqIGNhc1Rva2VuLCBzaXplX3Qgc2l6ZSk7Citwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3JDVW53cmFwcGVyKCk7Citwcml2YXRlOgorICAgIENNZWRpYUV4dHJhY3RvciAqcGx1Z2luOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRURJQV9FWFRSQUNUT1JfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oCmluZGV4IGZiOWY1YmQuLjJhYjk4ZTEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3RvckZhY3RvcnkuaApAQCAtMTksMTAgKzE5LDEwIEBACiAjZGVmaW5lIE1FRElBX0VYVFJBQ1RPUl9GQUNUT1JZX0hfCiAKICNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL2RsZXh0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9MaXN0Lmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtMzUsMjYgKzM1LDI1IEBACiAgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7CiAgICAgc3RhdGljIHNwPElNZWRpYUV4dHJhY3Rvcj4gQ3JlYXRlRnJvbVNlcnZpY2UoCiAgICAgICAgICAgICBjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLCBjb25zdCBjaGFyICptaW1lID0gTlVMTCk7Ci0gICAgc3RhdGljIHZvaWQgTG9hZFBsdWdpbnMoY29uc3QgOjpzdGQ6OnN0cmluZyYgYXBrUGF0aCk7CiAgICAgc3RhdGljIHN0YXR1c190IGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKyAgICBzdGF0aWMgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBnZXRTdXBwb3J0ZWRUeXBlcygpOworICAgIHN0YXRpYyB2b2lkIExvYWRFeHRyYWN0b3JzKCk7CiAKIHByaXZhdGU6CiAgICAgc3RhdGljIE11dGV4IGdQbHVnaW5NdXRleDsKLSAgICBzdGF0aWMgc3RkOjpzaGFyZWRfcHRyPExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4+IGdQbHVnaW5zOworICAgIHN0YXRpYyBzdGQ6OnNoYXJlZF9wdHI8c3RkOjpsaXN0PHNwPEV4dHJhY3RvclBsdWdpbj4+PiBnUGx1Z2luczsKICAgICBzdGF0aWMgYm9vbCBnUGx1Z2luc1JlZ2lzdGVyZWQ7CisgICAgc3RhdGljIGJvb2wgZ0lnbm9yZVZlcnNpb247CiAKLSAgICBzdGF0aWMgdm9pZCBSZWdpc3RlckV4dHJhY3RvcnNJbkFwaygKLSAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFwa1BhdGgsIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOwotICAgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRXh0cmFjdG9yc0luU3lzdGVtKAotICAgICAgICAgICAgY29uc3QgY2hhciAqbGliRGlyUGF0aCwgTGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCk7CisgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJFeHRyYWN0b3JzKAorICAgICAgICAgICAgY29uc3QgY2hhciAqbGliRGlyUGF0aCwgY29uc3QgYW5kcm9pZF9kbGV4dGluZm8qIGRsZXh0aW5mbywKKyAgICAgICAgICAgIHN0ZDo6bGlzdDxzcDxFeHRyYWN0b3JQbHVnaW4+PiAmcGx1Z2luTGlzdCk7CiAgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJFeHRyYWN0b3IoCi0gICAgICAgICAgICBjb25zdCBzcDxFeHRyYWN0b3JQbHVnaW4+ICZwbHVnaW4sIExpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOworICAgICAgICAgICAgY29uc3Qgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLCBzdGQ6Omxpc3Q8c3A8RXh0cmFjdG9yUGx1Z2luPj4gJnBsdWdpbkxpc3QpOwogCi0gICAgc3RhdGljIE1lZGlhRXh0cmFjdG9yOjpDcmVhdG9yRnVuYyBzbmlmZihEYXRhU291cmNlQmFzZSAqc291cmNlLAotICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLCBNZWRpYUV4dHJhY3Rvcjo6RnJlZU1ldGFGdW5jICpmcmVlTWV0YSwKLSAgICAgICAgICAgIHNwPEV4dHJhY3RvclBsdWdpbj4gJnBsdWdpbik7Ci0KLSAgICBzdGF0aWMgdm9pZCBVcGRhdGVFeHRyYWN0b3JzKGNvbnN0IGNoYXIgKm5ld1VwZGF0ZUFwa1BhdGgpOworICAgIHN0YXRpYyB2b2lkICpzbmlmZihjb25zdCBzcDxEYXRhU291cmNlPiAmc291cmNlLAorICAgICAgICAgICAgZmxvYXQgKmNvbmZpZGVuY2UsIHZvaWQgKiptZXRhLCBGcmVlTWV0YUZ1bmMgKmZyZWVNZXRhLAorICAgICAgICAgICAgc3A8RXh0cmFjdG9yUGx1Z2luPiAmcGx1Z2luLCB1aW50MzJfdCAqY3JlYXRvclZlcnNpb24pOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhSFRUUC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTBlNjEzLi4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFIVFRQLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDEzIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBNRURJQV9IVFRQX0hfCi0KLSNkZWZpbmUgTUVESUFfSFRUUF9IXwotCi0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BU3RyaW5nLmg+Ci0KLSNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IE1lZGlhSFRUUENvbm5lY3Rpb247Ci0KLXN0cnVjdCBNZWRpYUhUVFAgOiBwdWJsaWMgSFRUUEJhc2UgewotICAgIE1lZGlhSFRUUChjb25zdCBzcDxNZWRpYUhUVFBDb25uZWN0aW9uPiAmY29ubik7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGNvbm5lY3QoCi0gICAgICAgICAgICBjb25zdCBjaGFyICp1cmksCi0gICAgICAgICAgICBjb25zdCBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiAqaGVhZGVycywKLSAgICAgICAgICAgIG9mZjY0X3Qgb2Zmc2V0KTsKLQotICAgIHZpcnR1YWwgdm9pZCBkaXNjb25uZWN0KCk7Ci0KLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpIGNvbnN0OwotCi0gICAgdmlydHVhbCBzc2l6ZV90IHJlYWRBdChvZmY2NF90IG9mZnNldCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRTaXplKG9mZjY0X3QgKnNpemUpOwotCi0gICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOwotCi0gICAgdmlydHVhbCBzdGF0dXNfdCByZWNvbm5lY3RBdE9mZnNldChvZmY2NF90IG9mZnNldCk7Ci0KLXByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIH5NZWRpYUhUVFAoKTsKLQotICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciogbWltZSk7Ci0gICAgdmlydHVhbCBTdHJpbmc4IGdldFVyaSgpOwotICAgIHZpcnR1YWwgU3RyaW5nOCBnZXRNSU1FVHlwZSgpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHN0YXR1c190IG1Jbml0Q2hlY2s7Ci0gICAgc3A8TWVkaWFIVFRQQ29ubmVjdGlvbj4gbUhUVFBDb25uZWN0aW9uOwotCi0gICAgS2V5ZWRWZWN0b3I8U3RyaW5nOCwgU3RyaW5nOD4gbUxhc3RIZWFkZXJzOwotICAgIEFTdHJpbmcgbUxhc3RVUkk7Ci0KLSAgICBib29sIG1DYWNoZWRTaXplVmFsaWQ7Ci0gICAgb2ZmNjRfdCBtQ2FjaGVkU2l6ZTsKLQotICAgIHNwPERlY3J5cHRIYW5kbGU+IG1EZWNyeXB0SGFuZGxlOwotICAgIERybU1hbmFnZXJDbGllbnQgKm1Ecm1NYW5hZ2VyQ2xpZW50OwotCi0gICAgdm9pZCBjbGVhckRSTVN0YXRlX2woKTsKLQotICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lZGlhSFRUUCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE1FRElBX0hUVFBfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKaW5kZXggNjZmNGQ3Mi4uNjlkNmNkZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYU11eGVyLmgKQEAgLTQ5LDYgKzQ5LDcgQEAKICAgICAgICAgT1VUUFVUX0ZPUk1BVF9XRUJNICAgICAgICA9IDEsCiAgICAgICAgIE9VVFBVVF9GT1JNQVRfVEhSRUVfR1BQICAgPSAyLAogICAgICAgICBPVVRQVVRfRk9STUFUX0hFSUYgICAgICAgID0gMywKKyAgICAgICAgT1VUUFVUX0ZPUk1BVF9PR0cgICAgICAgICA9IDQsCiAgICAgICAgIE9VVFBVVF9GT1JNQVRfTElTVF9FTkQgLy8gbXVzdCBiZSBsYXN0IC0gdXNlZCB0byB2YWxpZGF0ZSBmb3JtYXQgdHlwZQogICAgIH07CiAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvTWVkaWFTb3VyY2UuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFTb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWVkaWEvbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9NZWRpYVNvdXJjZS5oCnJlbmFtZSB0byBtZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhU291cmNlLmgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFXcml0ZXIuaAppbmRleCAyYzEyYTg3Li45NzJhZTFkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZWRpYVdyaXRlci5oCkBAIC0zNSw2ICszNSwxMCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEgKnBhcmFtcyA9IE5VTEwpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3AoKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldENhcHR1cmVSYXRlKGZsb2F0IC8qIGNhcHR1cmVGcHMgKi8pIHsKKyAgICAgICAgQUxPR1coInNldENhcHR1cmVSYXRlIHVuc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBFUlJPUl9VTlNVUFBPUlRFRDsKKyAgICB9CiAKICAgICB2aXJ0dWFsIHZvaWQgc2V0TWF4RmlsZVNpemUoaW50NjRfdCBieXRlcykgeyBtTWF4RmlsZVNpemVMaW1pdEJ5dGVzID0gYnl0ZXM7IH0KICAgICB2aXJ0dWFsIHZvaWQgc2V0TWF4RmlsZUR1cmF0aW9uKGludDY0X3QgZHVyYXRpb25VcykgeyBtTWF4RmlsZUR1cmF0aW9uTGltaXRVcyA9IGR1cmF0aW9uVXM7IH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMTYwZjhkMy4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0uLi8uLi8uLi8uLi9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS9saWJtZWRpYWV4dHJhY3Rvci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1lZGlhL2xpYm1lZGlhZXh0cmFjdG9yL2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaApyZW5hbWUgdG8gbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMjAwMDAKaW5kZXggMWUxMjE5My4uMDAwMDAwMAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotLi4vLi4vLi4vLi4vbGlibWVkaWFleHRyYWN0b3IvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YUJhc2UuaApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYzJkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oCkBAIC0wLDAgKzEsMzI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBNRVRBX0RBVEFfQkFTRV9IXworCisjZGVmaW5lIE1FVEFfREFUQV9CQVNFX0hfCisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBUaGUgZm9sbG93aW5nIGtleXMgbWFwIHRvIGludDMyX3QgZGF0YSB1bmxlc3MgaW5kaWNhdGVkIG90aGVyd2lzZS4KK2VudW0geworICAgIGtLZXlNSU1FVHlwZSAgICAgICAgICA9ICdtaW1lJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5V2lkdGggICAgICAgICAgICAgPSAnd2lkdCcsICAvLyBpbnQzMl90LCBpbWFnZSBwaXhlbAorICAgIGtLZXlIZWlnaHQgICAgICAgICAgICA9ICdoZWlnJywgIC8vIGludDMyX3QsIGltYWdlIHBpeGVsCisgICAga0tleURpc3BsYXlXaWR0aCAgICAgID0gJ2RXaWQnLCAgLy8gaW50MzJfdCwgZGlzcGxheS9wcmVzZW50YXRpb24KKyAgICBrS2V5RGlzcGxheUhlaWdodCAgICAgPSAnZEhndCcsICAvLyBpbnQzMl90LCBkaXNwbGF5L3ByZXNlbnRhdGlvbgorICAgIGtLZXlTQVJXaWR0aCAgICAgICAgICA9ICdzYXJXJywgIC8vIGludDMyX3QsIHNhbXBsZUFzcGVjdFJhdGlvIHdpZHRoCisgICAga0tleVNBUkhlaWdodCAgICAgICAgID0gJ3NhckgnLCAgLy8gaW50MzJfdCwgc2FtcGxlQXNwZWN0UmF0aW8gaGVpZ2h0CisgICAga0tleVRodW1ibmFpbFdpZHRoICAgID0gJ3RoYlcnLCAgLy8gaW50MzJfdCwgdGh1bWJuYWlsIHdpZHRoCisgICAga0tleVRodW1ibmFpbEhlaWdodCAgID0gJ3RoYkgnLCAgLy8gaW50MzJfdCwgdGh1bWJuYWlsIGhlaWdodAorCisgICAgLy8gYSByZWN0YW5nbGUsIGlmIGFic2VudCBhc3N1bWVkIHRvIGJlICgwLCAwLCB3aWR0aCAtIDEsIGhlaWdodCAtIDEpCisgICAga0tleUNyb3BSZWN0ICAgICAgICAgID0gJ2Nyb3AnLAorCisgICAga0tleVJvdGF0aW9uICAgICAgICAgID0gJ3JvdEEnLCAgLy8gaW50MzJfdCAoYW5nbGUgaW4gZGVncmVlcykKKyAgICBrS2V5SUZyYW1lc0ludGVydmFsICAgPSAnaWZpdicsICAvLyBpbnQzMl90CisgICAga0tleVN0cmlkZSAgICAgICAgICAgID0gJ3N0cmQnLCAgLy8gaW50MzJfdAorICAgIGtLZXlTbGljZUhlaWdodCAgICAgICA9ICdzbGh0JywgIC8vIGludDMyX3QKKyAgICBrS2V5Q2hhbm5lbENvdW50ICAgICAgPSAnI2NobicsICAvLyBpbnQzMl90CisgICAga0tleUNoYW5uZWxNYXNrICAgICAgID0gJ2Nobm0nLCAgLy8gaW50MzJfdAorICAgIGtLZXlTYW1wbGVSYXRlICAgICAgICA9ICdzcnRlJywgIC8vIGludDMyX3QgKGF1ZGlvIHNhbXBsaW5nIHJhdGUgSHopCisgICAga0tleVBjbUVuY29kaW5nICAgICAgID0gJ1BDTWUnLCAgLy8gaW50MzJfdCAoYXVkaW8gZW5jb2RpbmcgZW51bSkKKyAgICBrS2V5RnJhbWVSYXRlICAgICAgICAgPSAnZnJtUicsICAvLyBpbnQzMl90ICh2aWRlbyBmcmFtZSByYXRlIGZwcykKKyAgICBrS2V5Qml0UmF0ZSAgICAgICAgICAgPSAnYnJ0ZScsICAvLyBpbnQzMl90IChicHMpCisgICAga0tleU1heEJpdFJhdGUgICAgICAgID0gJ214QnInLCAgLy8gaW50MzJfdCAoYnBzKQorICAgIGtLZXlCaXRzUGVyU2FtcGxlICAgICA9ICdiaXRzJywgIC8vIGludDMyX3QgKGJpdHMgcGVyIHNhbXBsZSkKKyAgICBrS2V5U3RyZWFtSGVhZGVyICAgICAgPSAnc3RIZCcsICAvLyByYXcgZGF0YQorICAgIGtLZXlFU0RTICAgICAgICAgICAgICA9ICdlc2RzJywgIC8vIHJhdyBkYXRhCisgICAga0tleUFBQ1Byb2ZpbGUgICAgICAgID0gJ2FhY3AnLCAgLy8gaW50MzJfdAorICAgIGtLZXlBVkNDICAgICAgICAgICAgICA9ICdhdmNjJywgIC8vIHJhdyBkYXRhCisgICAga0tleUhWQ0MgICAgICAgICAgICAgID0gJ2h2Y2MnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5QVYxQyAgICAgICAgICAgICAgPSAnYXYxYycsICAvLyByYXcgZGF0YQorICAgIGtLZXlUaHVtYm5haWxIVkNDICAgICA9ICd0aHZjJywgIC8vIHJhdyBkYXRhCisgICAga0tleUQyNjMgICAgICAgICAgICAgID0gJ2QyNjMnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5T3B1c0hlYWRlciAgICAgICAgPSAnb2hkcicsICAvLyByYXcgZGF0YQorICAgIGtLZXlPcHVzQ29kZWNEZWxheSAgICA9ICdvY29kJywgIC8vIHVpbnQ2NF90IChjb2RlYyBkZWxheSBpbiBucykKKyAgICBrS2V5T3B1c1NlZWtQcmVSb2xsICAgPSAnb3NwcicsICAvLyB1aW50NjRfdCAoc2VlayBwcmVyb2xsIGluIG5zKQorICAgIGtLZXlWcDlDb2RlY1ByaXZhdGUgICA9ICd2cDlwJywgIC8vIHJhdyBkYXRhICh2cDkgY3NkIGluZm9ybWF0aW9uKQorICAgIGtLZXlJc1N5bmNGcmFtZSAgICAgICA9ICdzeW5jJywgIC8vIGludDMyX3QgKGJvb2wpCisgICAga0tleUlzQ29kZWNDb25maWcgICAgID0gJ2NvbmYnLCAgLy8gaW50MzJfdCAoYm9vbCkKKyAgICBrS2V5SXNNdXhlckRhdGEgICAgICAgPSAnbXV4ZCcsICAvLyBpbnQzMl90IChib29sKQorICAgIGtLZXlUaW1lICAgICAgICAgICAgICA9ICd0aW1lJywgIC8vIGludDY0X3QgKHVzZWNzKQorICAgIGtLZXlEZWNvZGluZ1RpbWUgICAgICA9ICdkZWNUJywgIC8vIGludDY0X3QgKGRlY29kaW5nIHRpbWVzdGFtcCBpbiB1c2VjcykKKyAgICBrS2V5TlRQVGltZSAgICAgICAgICAgPSAnbnRwVCcsICAvLyB1aW50NjRfdCAobnRwLXRpbWVzdGFtcCkKKyAgICBrS2V5VGFyZ2V0VGltZSAgICAgICAgPSAndGFyVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5RHJpZnRUaW1lICAgICAgICAgPSAnZGZ0VCcsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5QW5jaG9yVGltZSAgICAgICAgPSAnYW5jVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5RHVyYXRpb24gICAgICAgICAgPSAnZHVyYScsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5UGl4ZWxGb3JtYXQgICAgICAgPSAncGl4ZicsICAvLyBpbnQzMl90CisgICAga0tleUNvbG9yRm9ybWF0ICAgICAgID0gJ2NvbGYnLCAgLy8gaW50MzJfdAorICAgIGtLZXlDb2xvclNwYWNlICAgICAgICA9ICdjb2xzJywgIC8vIGludDMyX3QKKyAgICBrS2V5UGxhdGZvcm1Qcml2YXRlICAgPSAncHJpdicsICAvLyBwb2ludGVyCisgICAga0tleURlY29kZXJDb21wb25lbnQgID0gJ2RlY0MnLCAgLy8gY3N0cmluZworICAgIGtLZXlCdWZmZXJJRCAgICAgICAgICA9ICdiZklEJywKKyAgICBrS2V5TWF4SW5wdXRTaXplICAgICAgPSAnaW5wUycsCisgICAga0tleU1heFdpZHRoICAgICAgICAgID0gJ21heFcnLAorICAgIGtLZXlNYXhIZWlnaHQgICAgICAgICA9ICdtYXhIJywKKyAgICBrS2V5VGh1bWJuYWlsVGltZSAgICAgPSAndGhiVCcsICAvLyBpbnQ2NF90ICh1c2VjcykKKyAgICBrS2V5VHJhY2tJRCAgICAgICAgICAgPSAndHJJRCcsCisgICAga0tleUVuY29kZXJEZWxheSAgICAgID0gJ2VuY2QnLCAgLy8gaW50MzJfdCAoZnJhbWVzKQorICAgIGtLZXlFbmNvZGVyUGFkZGluZyAgICA9ICdlbmNwJywgIC8vIGludDMyX3QgKGZyYW1lcykKKworICAgIGtLZXlBbGJ1bSAgICAgICAgICAgICA9ICdhbGJ1JywgIC8vIGNzdHJpbmcKKyAgICBrS2V5QXJ0aXN0ICAgICAgICAgICAgPSAnYXJ0aScsICAvLyBjc3RyaW5nCisgICAga0tleUFsYnVtQXJ0aXN0ICAgICAgID0gJ2FhcnQnLCAgLy8gY3N0cmluZworICAgIGtLZXlDb21wb3NlciAgICAgICAgICA9ICdjb21wJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5R2VucmUgICAgICAgICAgICAgPSAnZ2VucicsICAvLyBjc3RyaW5nCisgICAga0tleVRpdGxlICAgICAgICAgICAgID0gJ3RpdGwnLCAgLy8gY3N0cmluZworICAgIGtLZXlZZWFyICAgICAgICAgICAgICA9ICd5ZWFyJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5QWxidW1BcnQgICAgICAgICAgPSAnYWxiQScsICAvLyBjb21wcmVzc2VkIGltYWdlIGRhdGEKKyAgICBrS2V5QXV0aG9yICAgICAgICAgICAgPSAnYXV0aCcsICAvLyBjc3RyaW5nCisgICAga0tleUNEVHJhY2tOdW1iZXIgICAgID0gJ2NkdHInLCAgLy8gY3N0cmluZworICAgIGtLZXlEaXNjTnVtYmVyICAgICAgICA9ICdkbnVtJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5RGF0ZSAgICAgICAgICAgICAgPSAnZGF0ZScsICAvLyBjc3RyaW5nCisgICAga0tleVdyaXRlciAgICAgICAgICAgID0gJ3dyaXQnLCAgLy8gY3N0cmluZworICAgIGtLZXlDb21waWxhdGlvbiAgICAgICA9ICdjcGlsJywgIC8vIGNzdHJpbmcKKyAgICBrS2V5TG9jYXRpb24gICAgICAgICAgPSAnbG9jICcsICAvLyBjc3RyaW5nCisgICAga0tleVRpbWVTY2FsZSAgICAgICAgID0gJ3Rtc2wnLCAgLy8gaW50MzJfdAorICAgIGtLZXlDYXB0dXJlRnJhbWVyYXRlICA9ICdjYXBGJywgIC8vIGZsb2F0IChjYXB0dXJlIGZwcykKKworICAgIC8vIHZpZGVvIHByb2ZpbGUgYW5kIGxldmVsCisgICAga0tleVZpZGVvUHJvZmlsZSAgICAgID0gJ3ZwcmYnLCAgLy8gaW50MzJfdAorICAgIGtLZXlWaWRlb0xldmVsICAgICAgICA9ICd2bGV2JywgIC8vIGludDMyX3QKKworICAgIC8vIFNldCB0aGlzIGtleSB0byBlbmFibGUgYXV0aG9yaW5nIGZpbGVzIGluIDY0LWJpdCBvZmZzZXQKKyAgICBrS2V5NjRCaXRGaWxlT2Zmc2V0ICAgPSAnZm9idCcsICAvLyBpbnQzMl90IChib29sKQorICAgIGtLZXkyQnl0ZU5hbExlbmd0aCAgICA9ICcyTkFMJywgIC8vIGludDMyX3QgKGJvb2wpCisKKyAgICAvLyBJZGVudGlmeSB0aGUgZmlsZSBvdXRwdXQgZm9ybWF0IGZvciBhdXRob3JpbmcKKyAgICAvLyBQbGVhc2Ugc2VlIDxtZWRpYS9tZWRpYXJlY29yZGVyLmg+IGZvciB0aGUgc3VwcG9ydGVkCisgICAgLy8gZmlsZSBvdXRwdXQgZm9ybWF0cy4KKyAgICBrS2V5RmlsZVR5cGUgICAgICAgICAgPSAnZnR5cCcsICAvLyBpbnQzMl90CisKKyAgICAvLyBUcmFjayBhdXRob3JpbmcgcHJvZ3Jlc3Mgc3RhdHVzCisgICAgLy8ga0tleVRyYWNrVGltZVN0YXR1cyBpcyB1c2VkIHRvIHRyYWNrIHByb2dyZXNzIGluIGVsYXBzZWQgdGltZQorICAgIGtLZXlUcmFja1RpbWVTdGF0dXMgICA9ICd0a3RtJywgIC8vIGludDY0X3QKKworICAgIGtLZXlSZWFsVGltZVJlY29yZGluZyA9ICdydHJjJywgIC8vIGJvb2wgKGludDMyX3QpCisgICAga0tleU51bUJ1ZmZlcnMgICAgICAgID0gJ25iYmYnLCAgLy8gaW50MzJfdAorCisgICAgLy8gT2dnIGZpbGVzIGNhbiBiZSB0YWdnZWQgdG8gYmUgYXV0b21hdGljYWxseSBsb29waW5nLi4uCisgICAga0tleUF1dG9Mb29wICAgICAgICAgID0gJ2F1dEwnLCAgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIGtLZXlWYWxpZFNhbXBsZXMgICAgICA9ICd2YWxEJywgIC8vIGludDMyX3QKKworICAgIGtLZXlJc1VucmVhZGFibGUgICAgICA9ICd1bnJlJywgIC8vIGJvb2wgKGludDMyX3QpCisKKyAgICAvLyBBbiBpbmRpY2F0aW9uIHRoYXQgYSB2aWRlbyBidWZmZXIgaGFzIGJlZW4gcmVuZGVyZWQuCisgICAga0tleVJlbmRlcmVkICAgICAgICAgID0gJ3JlbmQnLCAgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIC8vIFRoZSBsYW5ndWFnZSBjb2RlIGZvciB0aGlzIG1lZGlhCisgICAga0tleU1lZGlhTGFuZ3VhZ2UgICAgID0gJ2xhbmcnLCAgLy8gY3N0cmluZworCisgICAgLy8gVGhlIG1hbnVmYWN0dXJlciBjb2RlIGZvciB0aGlzIG1lZGlhCisgICAga0tleU1hbnVmYWN0dXJlciAgPSAnbWFudScsICAvLyBjc3RyaW5nCisKKyAgICAvLyBUbyBzdG9yZSB0aGUgdGltZWQgdGV4dCBmb3JtYXQgZGF0YQorICAgIGtLZXlUZXh0Rm9ybWF0RGF0YSAgICA9ICd0ZXh0JywgIC8vIHJhdyBkYXRhCisKKyAgICBrS2V5UmVxdWlyZXNTZWN1cmVCdWZmZXJzID0gJ3NlY3UnLCAgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIGtLZXlJc0FEVFMgICAgICAgICAgICA9ICdhZHRzJywgIC8vIGJvb2wgKGludDMyX3QpCisgICAga0tleUFBQ0FPVCAgICAgICAgICAgID0gJ2Fhb3QnLCAgLy8gaW50MzJfdAorCisgICAgLy8gSWYgYSBNZWRpYUJ1ZmZlcidzIGRhdGEgcmVwcmVzZW50cyAoYXQgbGVhc3QgcGFydGlhbGx5KSBlbmNyeXB0ZWQKKyAgICAvLyBkYXRhLCB0aGUgZm9sbG93aW5nIGZpZWxkcyBhaWQgaW4gZGVjcnlwdGlvbi4KKyAgICAvLyBUaGUgZGF0YSBjYW4gYmUgdGhvdWdodCBvZiBhcyBwYWlycyBvZiBwbGFpbiBhbmQgZW5jcnlwdGVkIGRhdGEKKyAgICAvLyBmcmFnbWVudHMsIGkuZS4gcGxhaW4gYW5kIGVuY3J5cHRlZCBkYXRhIGFsdGVybmF0ZS4KKyAgICAvLyBUaGUgZmlyc3QgZnJhZ21lbnQgaXMgYnkgY29udmVudGlvbiBwbGFpbiBkYXRhIChpZiB0aGF0J3Mgbm90IHRoZQorICAgIC8vIGNhc2UsIHNpbXBseSBzcGVjaWZ5IHBsYWluIGZyYWdtZW50IHNpemUgb2YgMCkuCisgICAgLy8ga0tleUVuY3J5cHRlZFNpemVzIGFuZCBrS2V5UGxhaW5TaXplcyBlYWNoIG1hcCB0byBhbiBhcnJheSBvZgorICAgIC8vIHNpemVfdCB2YWx1ZXMuIFRoZSBzdW0gdG90YWwgb2YgYWxsIHNpemVfdCB2YWx1ZXMgb2YgYm90aCBhcnJheXMKKyAgICAvLyBtdXN0IGVxdWFsIHRoZSBhbW91bnQgb2YgZGF0YSAoaS5lLiBNZWRpYUJ1ZmZlcidzIHJhbmdlX2xlbmd0aCgpKS4KKyAgICAvLyBJZiBib3RoIGFycmF5cyBhcmUgcHJlc2VudCwgdGhleSBtdXN0IGJlIG9mIHRoZSBzYW1lIHNpemUuCisgICAgLy8gSWYgb25seSBlbmNyeXB0ZWQgc2l6ZXMgYXJlIHByZXNlbnQgaXQgaXMgYXNzdW1lZCB0aGF0IGFsbAorICAgIC8vIHBsYWluIHNpemVzIGFyZSAwLCBpLmUuIGFsbCBmcmFnbWVudHMgYXJlIGVuY3J5cHRlZC4KKyAgICAvLyBUbyBwcm9ncmFtbWF0aWNhbGx5IHNldCB0aGVzZSBhcnJheSwgdXNlIHRoZSBNZXRhRGF0YUJhc2U6OnNldERhdGEgQVBJLCBpLmUuCisgICAgLy8gY29uc3Qgc2l6ZV90IGVuY1NpemVzW107CisgICAgLy8gbWV0YS0+c2V0RGF0YSgKKyAgICAvLyAga0tleUVuY3J5cHRlZFNpemVzLCAwIC8qIHR5cGUgKi8sIGVuY1NpemVzLCBzaXplb2YoZW5jU2l6ZXMpKTsKKyAgICAvLyBBIHBsYWluIHNpemVzIGFycmF5IGJ5IGl0c2VsZiBtYWtlcyBubyBzZW5zZS4KKyAgICBrS2V5RW5jcnlwdGVkU2l6ZXMgICAgPSAnZW5jcicsICAvLyBzaXplX3RbXQorICAgIGtLZXlQbGFpblNpemVzICAgICAgICA9ICdwbGFpJywgIC8vIHNpemVfdFtdCisgICAga0tleUNyeXB0b0tleSAgICAgICAgID0gJ2NyeUsnLCAgLy8gdWludDhfdFsxNl0KKyAgICBrS2V5Q3J5cHRvSVYgICAgICAgICAgPSAnY3J5SScsICAvLyB1aW50OF90WzE2XQorICAgIGtLZXlDcnlwdG9Nb2RlICAgICAgICA9ICdjcnlNJywgIC8vIGludDMyX3QKKworICAgIGtLZXlDcnlwdG9EZWZhdWx0SVZTaXplID0gJ2NyeVMnLCAgLy8gaW50MzJfdAorCisgICAga0tleVBzc2ggICAgICAgICAgICAgID0gJ3Bzc2gnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5Q0FTeXN0ZW1JRCAgICAgICAgPSAnY2FpZCcsICAvLyBpbnQzMl90CisgICAga0tleUNBU2Vzc2lvbklEICAgICAgID0gJ3NlaWQnLCAgLy8gcmF3IGRhdGEKKyAgICBrS2V5Q0FQcml2YXRlRGF0YSAgICAgPSAnY2FkYycsICAvLyByYXcgZGF0YQorCisgICAga0tleUVuY3J5cHRlZEJ5dGVCbG9jayA9ICdjYmxrJywgIC8vIHVpbnQ4X3QKKyAgICBrS2V5U2tpcEJ5dGVCbG9jayAgICAgPSAnc2JsaycsICAvLyB1aW50OF90CisKKyAgICAvLyBQbGVhc2Ugc2VlIE1lZGlhRm9ybWF0LktFWV9JU19BVVRPU0VMRUNULgorICAgIGtLZXlUcmFja0lzQXV0b3NlbGVjdCA9ICdhdXRvJywgLy8gYm9vbCAoaW50MzJfdCkKKyAgICAvLyBQbGVhc2Ugc2VlIE1lZGlhRm9ybWF0LktFWV9JU19ERUZBVUxULgorICAgIGtLZXlUcmFja0lzRGVmYXVsdCAgICA9ICdkZmx0JywgLy8gYm9vbCAoaW50MzJfdCkKKyAgICAvLyBTaW1pbGFyIHRvIE1lZGlhRm9ybWF0LktFWV9JU19GT1JDRURfU1VCVElUTEUgYnV0IHBlcnRhaW5zIHRvIGF2IHRyYWNrcyBhcyB3ZWxsLgorICAgIGtLZXlUcmFja0lzRm9yY2VkICAgICA9ICdmcmNkJywgLy8gYm9vbCAoaW50MzJfdCkKKworICAgIC8vIEgyNjQgc3VwcGxlbWVudGFsIGVuaGFuY2VtZW50IGluZm9ybWF0aW9uIG9mZnNldHMvc2l6ZXMKKyAgICBrS2V5U0VJICAgICAgICAgICAgICAgPSAnc2VpICcsIC8vIHJhdyBkYXRhCisKKyAgICAvLyBNUEVHIHVzZXIgZGF0YSBvZmZzZXRzCisgICAga0tleU1wZWdVc2VyRGF0YSAgICAgID0gJ21wdWQnLCAvLyBzaXplX3RbXQorCisgICAgLy8gSERSIHJlbGF0ZWQKKyAgICBrS2V5SGRyU3RhdGljSW5mbyAgICA9ICdoZHJTJywgLy8gSERSU3RhdGljSW5mbworICAgIGtLZXlIZHIxMFBsdXNJbmZvICAgID0gJ2hkckQnLCAvLyByYXcgZGF0YQorCisgICAgLy8gY29sb3IgYXNwZWN0cworICAgIGtLZXlDb2xvclJhbmdlICAgICAgID0gJ2NSbmcnLCAvLyBpbnQzMl90LCBjb2xvciByYW5nZSwgdmFsdWUgZGVmaW5lZCBieSBDb2xvckFzcGVjdHMuUmFuZ2UKKyAgICBrS2V5Q29sb3JQcmltYXJpZXMgICA9ICdjUHJtJywgLy8gaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29sb3IgUHJpbWFyaWVzLCB2YWx1ZSBkZWZpbmVkIGJ5IENvbG9yQXNwZWN0cy5QcmltYXJpZXMKKyAgICBrS2V5VHJhbnNmZXJGdW5jdGlvbiA9ICd0RnVuJywgLy8gaW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNmZXIgRnVuY3Rpb24sIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLlRyYW5zZmVyLgorICAgIGtLZXlDb2xvck1hdHJpeCAgICAgID0gJ2NNdHgnLCAvLyBpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2xvciBNYXRyaXgsIHZhbHVlIGRlZmluZWQgYnkgQ29sb3JBc3BlY3RzLk1hdHJpeENvZWZmcy4KKyAgICBrS2V5VGVtcG9yYWxMYXllcklkICA9ICdpTHlyJywgLy8gaW50MzJfdCwgdGVtcG9yYWwgbGF5ZXItaWQuIDAtYmFzZWQgKDAgPT4gYmFzZSBsYXllcikKKyAgICBrS2V5VGVtcG9yYWxMYXllckNvdW50ID0gJ2NMeXInLCAvLyBpbnQzMl90LCBudW1iZXIgb2YgdGVtcG9yYWwgbGF5ZXJzIGVuY29kZWQKKworICAgIGtLZXlUaWxlV2lkdGggICAgICAgID0gJ3RpbFcnLCAvLyBpbnQzMl90LCBIRUlGIHRpbGUgd2lkdGgKKyAgICBrS2V5VGlsZUhlaWdodCAgICAgICA9ICd0aWxIJywgLy8gaW50MzJfdCwgSEVJRiB0aWxlIGhlaWdodAorICAgIGtLZXlHcmlkUm93cyAgICAgICAgID0gJ2dyZFInLCAvLyBpbnQzMl90LCBIRUlGIGdyaWQgcm93cworICAgIGtLZXlHcmlkQ29scyAgICAgICAgID0gJ2dyZEMnLCAvLyBpbnQzMl90LCBIRUlGIGdyaWQgY29sdW1ucworICAgIGtLZXlJY2NQcm9maWxlICAgICAgID0gJ3Byb2YnLCAvLyByYXcgZGF0YSwgSUNDIHByb2ZpbGUgZGF0YQorICAgIGtLZXlJc1ByaW1hcnlJbWFnZSAgID0gJ3ByaW0nLCAvLyBib29sIChpbnQzMl90KSwgaW1hZ2UgdHJhY2sgaXMgdGhlIHByaW1hcnkgaW1hZ2UKKyAgICBrS2V5RnJhbWVDb3VudCAgICAgICA9ICduZnJtJywgLy8gaW50MzJfdCwgdG90YWwgbnVtYmVyIG9mIGZyYW1lIGluIHZpZGVvIHRyYWNrCisgICAga0tleUV4aWZPZmZzZXQgICAgICAgPSAnZXhvZicsIC8vIGludDY0X3QsIEV4aWYgZGF0YSBvZmZzZXQKKyAgICBrS2V5RXhpZlNpemUgICAgICAgICA9ICdleHN6JywgLy8gaW50NjRfdCwgRXhpZiBkYXRhIHNpemUKKyAgICBrS2V5RXhpZlRpZmZPZmZzZXQgICA9ICd0aGRyJywgLy8gaW50MzJfdCwgaWYgPiAwLCBidWZmZXIgY29udGFpbnMgZXhpZiBkYXRhIGJsb2NrIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGlmZiBoZHIgYXQgc3BlY2lmaWVkIG9mZnNldAorICAgIGtLZXlQY21CaWdFbmRpYW4gICAgID0gJ3BjbWInLCAvLyBib29sIChpbnQzMl90KQorCisgICAgLy8gS2V5IGZvciBBTEFDIE1hZ2ljIENvb2tpZQorICAgIGtLZXlBbGFjTWFnaWNDb29raWUgID0gJ2FsbWMnLCAvLyByYXcgZGF0YQorCisgICAgLy8gQUMtNCBBdWRpb1ByZXNlbnRhdGlvbkluZm8KKyAgICBrS2V5QXVkaW9QcmVzZW50YXRpb25JbmZvID0gJ2F1ZFAnLCAgLy8gcmF3IGRhdGEKKworICAgIC8vIG9wYXF1ZSBjb2RlYyBzcGVjaWZpYyBkYXRhIGJlaW5nIHBhc3NlZCBmcm9tIGV4dHJhY3RvciB0byBjb2RlYworICAgIGtLZXlPcGFxdWVDU0QwICAgICAgID0gJ2NzZDAnLAorICAgIGtLZXlPcGFxdWVDU0QxICAgICAgID0gJ2NzZDEnLAorICAgIGtLZXlPcGFxdWVDU0QyICAgICAgID0gJ2NzZDInLAorCisgICAga0tleUhhcHRpY0NoYW5uZWxDb3VudCA9ICdoYXBDJywKK307CisKK2VudW0geworICAgIGtUeXBlRVNEUyAgICAgICAgPSAnZXNkcycsCisgICAga1R5cGVBVkNDICAgICAgICA9ICdhdmNjJywKKyAgICBrVHlwZUhWQ0MgICAgICAgID0gJ2h2Y2MnLAorICAgIGtUeXBlQVYxQyAgICAgICAgPSAnYXYxYycsCisgICAga1R5cGVEMjYzICAgICAgICA9ICdkMjYzJywKK307CisKK2VudW0geworICAgIGtDcnlwdG9Nb2RlVW5lbmNyeXB0ZWQgPSAwLAorICAgIGtDcnlwdG9Nb2RlQWVzQ3RyICAgICAgPSAxLAorICAgIGtDcnlwdG9Nb2RlQWVzQ2JjICAgICAgPSAyLAorfTsKKworY2xhc3MgUGFyY2VsOworCitjbGFzcyBNZXRhRGF0YUJhc2UgeworcHVibGljOgorICAgIE1ldGFEYXRhQmFzZSgpOworICAgIE1ldGFEYXRhQmFzZShjb25zdCBNZXRhRGF0YUJhc2UgJmZyb20pOworICAgIE1ldGFEYXRhQmFzZSYgb3BlcmF0b3IgPSAoY29uc3QgTWV0YURhdGFCYXNlICYpOworCisgICAgdmlydHVhbCB+TWV0YURhdGFCYXNlKCk7CisKKyAgICBlbnVtIFR5cGUgeworICAgICAgICBUWVBFX05PTkUgICAgID0gJ25vbmUnLAorICAgICAgICBUWVBFX0NfU1RSSU5HID0gJ2NzdHInLAorICAgICAgICBUWVBFX0lOVDMyICAgID0gJ2luMzInLAorICAgICAgICBUWVBFX0lOVDY0ICAgID0gJ2luNjQnLAorICAgICAgICBUWVBFX0ZMT0FUICAgID0gJ2Zsb2EnLAorICAgICAgICBUWVBFX1BPSU5URVIgID0gJ3B0ciAnLAorICAgICAgICBUWVBFX1JFQ1QgICAgID0gJ3JlY3QnLAorICAgIH07CisKKyAgICB2b2lkIGNsZWFyKCk7CisgICAgYm9vbCByZW1vdmUodWludDMyX3Qga2V5KTsKKworICAgIGJvb2wgc2V0Q1N0cmluZyh1aW50MzJfdCBrZXksIGNvbnN0IGNoYXIgKnZhbHVlKTsKKyAgICBib29sIHNldEludDMyKHVpbnQzMl90IGtleSwgaW50MzJfdCB2YWx1ZSk7CisgICAgYm9vbCBzZXRJbnQ2NCh1aW50MzJfdCBrZXksIGludDY0X3QgdmFsdWUpOworICAgIGJvb2wgc2V0RmxvYXQodWludDMyX3Qga2V5LCBmbG9hdCB2YWx1ZSk7CisgICAgYm9vbCBzZXRQb2ludGVyKHVpbnQzMl90IGtleSwgdm9pZCAqdmFsdWUpOworCisgICAgYm9vbCBzZXRSZWN0KAorICAgICAgICAgICAgdWludDMyX3Qga2V5LAorICAgICAgICAgICAgaW50MzJfdCBsZWZ0LCBpbnQzMl90IHRvcCwKKyAgICAgICAgICAgIGludDMyX3QgcmlnaHQsIGludDMyX3QgYm90dG9tKTsKKworICAgIGJvb2wgZmluZENTdHJpbmcodWludDMyX3Qga2V5LCBjb25zdCBjaGFyICoqdmFsdWUpIGNvbnN0OworICAgIGJvb2wgZmluZEludDMyKHVpbnQzMl90IGtleSwgaW50MzJfdCAqdmFsdWUpIGNvbnN0OworICAgIGJvb2wgZmluZEludDY0KHVpbnQzMl90IGtleSwgaW50NjRfdCAqdmFsdWUpIGNvbnN0OworICAgIGJvb2wgZmluZEZsb2F0KHVpbnQzMl90IGtleSwgZmxvYXQgKnZhbHVlKSBjb25zdDsKKyAgICBib29sIGZpbmRQb2ludGVyKHVpbnQzMl90IGtleSwgdm9pZCAqKnZhbHVlKSBjb25zdDsKKworICAgIGJvb2wgZmluZFJlY3QoCisgICAgICAgICAgICB1aW50MzJfdCBrZXksCisgICAgICAgICAgICBpbnQzMl90ICpsZWZ0LCBpbnQzMl90ICp0b3AsCisgICAgICAgICAgICBpbnQzMl90ICpyaWdodCwgaW50MzJfdCAqYm90dG9tKSBjb25zdDsKKworICAgIGJvb2wgc2V0RGF0YSh1aW50MzJfdCBrZXksIHVpbnQzMl90IHR5cGUsIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKKworICAgIGJvb2wgZmluZERhdGEodWludDMyX3Qga2V5LCB1aW50MzJfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKipkYXRhLCBzaXplX3QgKnNpemUpIGNvbnN0OworCisgICAgYm9vbCBoYXNEYXRhKHVpbnQzMl90IGtleSkgY29uc3Q7CisKKyAgICBTdHJpbmc4IHRvU3RyaW5nKCkgY29uc3Q7CisgICAgdm9pZCBkdW1wVG9Mb2coKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgQnBNZWRpYVNvdXJjZTsKKyAgICBmcmllbmQgY2xhc3MgQm5NZWRpYVNvdXJjZTsKKyAgICBmcmllbmQgY2xhc3MgQm5NZWRpYUV4dHJhY3RvcjsKKyAgICBmcmllbmQgY2xhc3MgTWV0YURhdGE7CisKKyAgICBzdHJ1Y3QgdHlwZWRfZGF0YTsKKyAgICBzdHJ1Y3QgUmVjdDsKKyAgICBzdHJ1Y3QgTWV0YURhdGFJbnRlcm5hbDsKKyAgICBNZXRhRGF0YUludGVybmFsICptSW50ZXJuYWxEYXRhOworICAgIHN0YXR1c190IHdyaXRlVG9QYXJjZWwoUGFyY2VsICZwYXJjZWwpOworICAgIHN0YXR1c190IHVwZGF0ZUZyb21QYXJjZWwoY29uc3QgUGFyY2VsICZwYXJjZWwpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBNRVRBX0RBVEFfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGFVdGlscy5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmgKaW5kZXggZDVhODA4MC4uZGNhZjI3ZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YVV0aWxzLmgKQEAgLTIwLDEzICsyMCwyNCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KIAorc3RydWN0IEFNZWRpYUZvcm1hdDsKKwogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUJ1ZmZlcjsKIGJvb2wgTWFrZUFWQ0NvZGVjU3BlY2lmaWNEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOworYm9vbCBNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoQU1lZGlhRm9ybWF0ICptZXRhLCBjb25zdCB1aW50OF90ICpkYXRhLCBzaXplX3Qgc2l6ZSk7CisKK2Jvb2wgTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKE1ldGFEYXRhQmFzZSAmbWV0YSwgY29uc3QgdWludDhfdCAqZGF0YSwgc2l6ZV90IHNpemUpOwogYm9vbCBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoTWV0YURhdGFCYXNlICZtZXRhLCB1bnNpZ25lZCBwcm9maWxlLCB1bnNpZ25lZCBzYW1wbGluZ19mcmVxX2luZGV4LAogICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24pOwogCitib29sIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YShBTWVkaWFGb3JtYXQgKm1ldGEsIHVuc2lnbmVkIHByb2ZpbGUsIHVuc2lnbmVkIHNhbXBsaW5nX2ZyZXFfaW5kZXgsCisgICAgICAgIHVuc2lnbmVkIGNoYW5uZWxfY29uZmlndXJhdGlvbik7CisKK3ZvaWQgcGFyc2VWb3JiaXNDb21tZW50KAorICAgICAgICBBTWVkaWFGb3JtYXQgKmZpbGVNZXRhLCBjb25zdCBjaGFyICpjb21tZW50LCBzaXplX3QgY29tbWVudExlbmd0aCk7CisKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gTUVUQV9EQVRBX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L05ka1V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L05ka1V0aWxzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ODg4NGEuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OZGtVdGlscy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgTkRLX1VUSUxTX0hfCi0KLSNkZWZpbmUgTkRLX1VUSUxTX0hfCi0KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgotI2luY2x1ZGUgPG1lZGlhL05ka1dyYXBwZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zcDxNZXRhRGF0YT4gY29udmVydE1lZGlhRm9ybWF0V3JhcHBlclRvTWV0YURhdGEoCi0gICAgICAgIGNvbnN0IHNwPEFNZWRpYUZvcm1hdFdyYXBwZXI+ICZmbXQpOwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIE5ES19VVElMU19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9OdU1lZGlhRXh0cmFjdG9yLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaAppbmRleCA1NGE3MDk1Li40MzA3MTEwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGxpc3Q+CiAjaW5jbHVkZSA8bWVkaWEvbWVkaWFwbGF5ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BdWRpb1ByZXNlbnRhdGlvbkluZm8uaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgpAQCAtNjQsOCArNjUsNiBAQAogCiAgICAgc3RhdHVzX3Qgc2V0TWVkaWFDYXMoY29uc3QgSEludGVyZmFjZVRva2VuICZjYXNUb2tlbik7CiAKLSAgICB2b2lkIGRpc2Nvbm5lY3QoKTsKLQogICAgIHNpemVfdCBjb3VudFRyYWNrcygpIGNvbnN0OwogICAgIHN0YXR1c190IGdldFRyYWNrRm9ybWF0KHNpemVfdCBpbmRleCwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQsIHVpbnQzMl90IGZsYWdzID0gMCkgY29uc3Q7CiAKQEAgLTk3LDYgKzk2LDggQEAKIAogICAgIGJvb2wgZ2V0Q2FjaGVkRHVyYXRpb24oaW50NjRfdCAqZHVyYXRpb25VcywgYm9vbCAqZW9zKSBjb25zdDsKIAorICAgIHN0YXR1c190IGdldEF1ZGlvUHJlc2VudGF0aW9ucyhzaXplX3QgdHJhY2tJZHgsIEF1ZGlvUHJlc2VudGF0aW9uQ29sbGVjdGlvbiAqcHJlc2VudGF0aW9ucyk7CisKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5OdU1lZGlhRXh0cmFjdG9yKCk7CiAKQEAgLTE0OCw3ICsxNDksNiBAQAogICAgICAgICAgICAgTWVkaWFTb3VyY2U6OlJlYWRPcHRpb25zOjpTZWVrTW9kZSBtb2RlID0KICAgICAgICAgICAgICAgICBNZWRpYVNvdXJjZTo6UmVhZE9wdGlvbnM6OlNFRUtfQ0xPU0VTVF9TWU5DKTsKIAotICAgIHZvaWQgcmVsZWFzZU9uZVNhbXBsZShUcmFja0luZm8gKmluZm8pOwogICAgIHZvaWQgcmVsZWFzZVRyYWNrU2FtcGxlcyhUcmFja0luZm8gKmluZm8pOwogICAgIHZvaWQgcmVsZWFzZUFsbFRyYWNrU2FtcGxlcygpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09nZ1dyaXRlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTBhMWQyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PZ2dXcml0ZXIuaApAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBPR0dfV1JJVEVSX0hfCisKKyNkZWZpbmUgT0dHX1dSSVRFUl9IXworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhV3JpdGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgorCitzdHJ1Y3QgT2dnU3RyZWFtU3RhdGU7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE9nZ1dyaXRlciA6IHB1YmxpYyBNZWRpYVdyaXRlciB7CisgICAgT2dnV3JpdGVyKGludCBmZCk7CisKKyAgICBzdGF0dXNfdCBpbml0Q2hlY2soKSBjb25zdDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU291cmNlKGNvbnN0IHNwPE1lZGlhU291cmNlPiYgc291cmNlKTsKKyAgICB2aXJ0dWFsIGJvb2wgcmVhY2hlZEVPUygpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnQoTWV0YURhdGEqIHBhcmFtcyA9IE5VTEwpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcCgpIHsgcmV0dXJuIHJlc2V0KCk7IH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IHBhdXNlKCk7CisKK3Byb3RlY3RlZDoKKyAgICB+T2dnV3JpdGVyKCk7CisKK3ByaXZhdGU6CisgICAgaW50IG1GZDsKKyAgICBib29sIG1IYXZlQWxsQ29kZWNTcGVjaWZpY0RhdGE7CisgICAgc3RhdHVzX3QgbUluaXRDaGVjazsKKyAgICBzcDxNZWRpYVNvdXJjZT4gbVNvdXJjZTsKKyAgICBib29sIG1TdGFydGVkID0gZmFsc2U7CisgICAgdm9sYXRpbGUgYm9vbCBtUGF1c2VkID0gZmFsc2U7CisgICAgdm9sYXRpbGUgYm9vbCBtUmVzdW1lZCA9IGZhbHNlOworICAgIHZvbGF0aWxlIGJvb2wgbURvbmU7CisgICAgdm9sYXRpbGUgYm9vbCBtUmVhY2hlZEVPUzsKKyAgICBwdGhyZWFkX3QgbVRocmVhZDsKKyAgICBpbnQ2NF90IG1TYW1wbGVSYXRlOworICAgIGludDY0X3QgbUVzdGltYXRlZFNpemVCeXRlczsKKyAgICBpbnQ2NF90IG1Fc3RpbWF0ZWREdXJhdGlvblVzOworCisgICAgc3RhdGljIHZvaWQqIFRocmVhZFdyYXBwZXIodm9pZCopOworICAgIHN0YXR1c190IHRocmVhZEZ1bmMoKTsKKyAgICBib29sIGV4Y2VlZHNGaWxlU2l6ZUxpbWl0KCk7CisgICAgYm9vbCBleGNlZWRzRmlsZUR1cmF0aW9uTGltaXQoKTsKKyAgICBzdGF0dXNfdCByZXNldCgpOworCisgICAgaW50MzJfdCBtQ3VycmVudFBhY2tldElkOworICAgIE9nZ1N0cmVhbVN0YXRlKiBtT3MgPSBudWxscHRyOworCisgICAgT2dnV3JpdGVyKGNvbnN0IE9nZ1dyaXRlciYpOworICAgIE9nZ1dyaXRlciYgb3BlcmF0b3I9KGNvbnN0IE9nZ1dyaXRlciYpOworCisgICAgc3RhdHVzX3Qgd3JpdGVPZ2dIZWFkZXJQYWNrZXRzKHVuc2lnbmVkIGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBPR0dfV1JJVEVSX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L09teEluZm9CdWlsZGVyLmgKaW5kZXggMjhmNjA5NC4uMTQxMGExNiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9PbXhJbmZvQnVpbGRlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvT214SW5mb0J1aWxkZXIuaApAQCAtMjMsOCArMjMsMTEgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgT214SW5mb0J1aWxkZXIgOiBwdWJsaWMgTWVkaWFDb2RlY0xpc3RCdWlsZGVyQmFzZSB7Citwcml2YXRlOgorICAgIGJvb2wgbUFsbG93U3VyZmFjZUVuY29kZXJzOyAvLyBhbGxvdyBzdXJmYWNlIGVuY29kZXJzCisKIHB1YmxpYzoKLSAgICBPbXhJbmZvQnVpbGRlcigpOworICAgIGV4cGxpY2l0IE9teEluZm9CdWlsZGVyKGJvb2wgYWxsb3dTdXJmYWNlRW5jb2RlcnMpOwogICAgIH5PbXhJbmZvQnVpbGRlcigpIG92ZXJyaWRlID0gZGVmYXVsdDsKICAgICBzdGF0dXNfdCBidWlsZE1lZGlhQ29kZWNMaXN0KE1lZGlhQ29kZWNMaXN0V3JpdGVyKiB3cml0ZXIpIG92ZXJyaWRlOwogfTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlRGF0YVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVEYXRhU291cmNlLmgKaW5kZXggZTE5MWU2YS4uNWE2OWJkNyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVEYXRhU291cmNlLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVEYXRhU291cmNlLmgKQEAgLTY2LDkgKzY2LDYgQEAKICAgICB2aXJ0dWFsIFN0cmluZzggdG9TdHJpbmcoKSAgewogICAgICAgICByZXR1cm4gbU5hbWU7CiAgICAgfQotICAgIHZpcnR1YWwgc3A8RGVjcnlwdEhhbmRsZT4gRHJtSW5pdGlhbGl6YXRpb24oY29uc3QgY2hhciAqbWltZSkgewotICAgICAgICByZXR1cm4gbVNvdXJjZS0+RHJtSW5pdGlhbGl6YXRpb24obWltZSk7Ci0gICAgfQogCiBwcml2YXRlOgogICAgIGVudW0gewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYUV4dHJhY3Rvci5oCmluZGV4IDUwOWU2NjkuLjk5MjUxMTQgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFFeHRyYWN0b3IuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhRXh0cmFjdG9yLmgKQEAgLTE4LDcgKzE4LDcgQEAKICNkZWZpbmUgUkVNT1RFX01FRElBX0VYVFJBQ1RPUl9IXwogCiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhRXh0cmFjdG9yLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUV4dHJhY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9SZW1vdGVNZWRpYVNvdXJjZS5oCmluZGV4IDFkNzIwYWYuLjAzZDM4NjkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlTWVkaWFTb3VyY2UuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1JlbW90ZU1lZGlhU291cmNlLmgKQEAgLTM3LDEyICszNywxMyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVhZCgKICAgICAgICAgICAgIE1lZGlhQnVmZmVyQmFzZSAqKmJ1ZmZlciwKICAgICAgICAgICAgIGNvbnN0IE1lZGlhU291cmNlOjpSZWFkT3B0aW9ucyAqb3B0aW9ucyA9IE5VTEwpOworICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0Tm9uYmxvY2tpbmdSZWFkKCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBwYXVzZSgpOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RvcFRpbWVVcyhpbnQ2NF90IHN0b3BUaW1lVXMpOwogCiBwcml2YXRlOgogICAgIHNwPFJlbW90ZU1lZGlhRXh0cmFjdG9yPiBtRXh0cmFjdG9yOwotICAgIE1lZGlhVHJhY2sgKm1Tb3VyY2U7CisgICAgTWVkaWFUcmFjayAqbVRyYWNrOwogICAgIHNwPFJlZkJhc2U+IG1FeHRyYWN0b3JQbHVnaW47CiAKICAgICBleHBsaWNpdCBSZW1vdGVNZWRpYVNvdXJjZSgKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1N1cmZhY2VVdGlscy5oCmluZGV4IDY4OWU0NTguLmFlNTVjNjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvU3VyZmFjZVV0aWxzLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9TdXJmYWNlVXRpbHMuaApAQCAtMTksOCArMTksMTAgQEAKICNkZWZpbmUgU1VSRkFDRV9VVElMU19IXwogCiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgogCiBzdHJ1Y3QgQU5hdGl2ZVdpbmRvdzsKK2NsYXNzIFN1cmZhY2U7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNDAsNiArNDIsMTUgQEAKIHN0YXR1c190IG5hdGl2ZVdpbmRvd0Nvbm5lY3QoQU5hdGl2ZVdpbmRvdyAqc3VyZmFjZSwgY29uc3QgY2hhciAqcmVhc29uKTsKIHN0YXR1c190IG5hdGl2ZVdpbmRvd0Rpc2Nvbm5lY3QoQU5hdGl2ZVdpbmRvdyAqc3VyZmFjZSwgY29uc3QgY2hhciAqcmVhc29uKTsKIAorLyoqCisgKiBEaXNhYmxlIGJ1ZmZlciBkcm9wcGluZyBiZWhhdmlvciBvZiBCdWZmZXJRdWV1ZSBpZiB0YXJnZXQgc2RrIG9mIGFwcGxpY2F0aW9uCisgKiBpcyBRIG9yIGxhdGVyLiBJZiB0aGUgY2FsbGVyIGlzIG5vdCBhbiBhcHAgKGUuZy4gTWVkaWFQbGF5ZXIgaW4gbWVkaWFzZXJ2ZXIpCisgKiByZXRhaW4gYnVmZmVyIGRyb3BwaW5nIGJlaGF2aW9yLgorICoKKyAqIEByZXR1cm4gTk9fRVJST1IKKyAqLworc3RhdHVzX3QgZGlzYWJsZUxlZ2FjeUJ1ZmZlckRyb3BQb3N0UShjb25zdCBzcDxTdXJmYWNlPiAmc3VyZmFjZSk7CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIAogI2VuZGlmICAvLyBTVVJGQUNFX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmgKaW5kZXggNmEyOGUwYi4uMmI5Yjc1OSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaApAQCAtMzAsNiArMzAsOCBAQAogCiBzdHJ1Y3QgQU1lc3NhZ2U7CiBzdGF0dXNfdCBjb252ZXJ0TWV0YURhdGFUb01lc3NhZ2UoCisgICAgICAgIGNvbnN0IE1ldGFEYXRhQmFzZSAqbWV0YSwgc3A8QU1lc3NhZ2U+ICpmb3JtYXQpOworc3RhdHVzX3QgY29udmVydE1ldGFEYXRhVG9NZXNzYWdlKAogICAgICAgICBjb25zdCBzcDxNZXRhRGF0YT4gJm1ldGEsIHNwPEFNZXNzYWdlPiAqZm9ybWF0KTsKIHZvaWQgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKAogICAgICAgICBjb25zdCBzcDxBTWVzc2FnZT4gJmZvcm1hdCwgc3A8TWV0YURhdGE+ICZtZXRhKTsKQEAgLTM5LDggKzQxLDYgQEAKIC8vIFRPRE86IGNvbWJpbmUgdGhpcyB3aXRoIGF2Y191dGlsczo6Z2V0TmV4dE5BTFVuaXQKIGNvbnN0IHVpbnQ4X3QgKmZpbmROZXh0TmFsU3RhcnRDb2RlKGNvbnN0IHVpbnQ4X3QgKmRhdGEsIHNpemVfdCBsZW5ndGgpOwogCi1BU3RyaW5nIE1ha2VVc2VyQWdlbnQoKTsKLQogLy8gQ29udmVydCBhIE1JTUUgdHlwZSB0byBhIEF1ZGlvU3lzdGVtOjphdWRpb19mb3JtYXQKIHN0YXR1c190IG1hcE1pbWVUb0F1ZGlvRm9ybWF0KGF1ZGlvX2Zvcm1hdF90JiBmb3JtYXQsIGNvbnN0IGNoYXIqIG1pbWUpOwogCkBAIC01MCwxMiArNTAsMTQgQEAKIC8vIFNlbmQgaW5mb3JtYXRpb24gZnJvbSBNZXRhRGF0YSB0byB0aGUgSEFMIHZpYSBBdWRpb1NpbmsKIHN0YXR1c190IHNlbmRNZXRhRGF0YVRvSGFsKHNwPE1lZGlhUGxheWVyQmFzZTo6QXVkaW9TaW5rPiYgc2luaywgY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhKTsKIAorLy8gUmV0dXJuIHxhdWRpb19vZmZsb2FkX2luZm9fdHwgZmlsbGVkIGZyb20gZ2l2ZW4gbWV0YWRhdGEKK3N0YXR1c190IGdldEF1ZGlvT2ZmbG9hZEluZm8oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAorICAgICAgICBib29sIGlzU3RyZWFtaW5nLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsIGF1ZGlvX29mZmxvYWRfaW5mb190ICppbmZvKTsKKwogLy8gQ2hlY2sgd2hldGhlciB0aGUgc3RyZWFtIGRlZmluZWQgYnkgbWV0YSBjYW4gYmUgb2ZmbG9hZGVkIHRvIGhhcmR3YXJlCiBib29sIGNhbk9mZmxvYWRTdHJlYW0oY29uc3Qgc3A8TWV0YURhdGE+JiBtZXRhLCBib29sIGhhc1ZpZGVvLAogICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdHJlYW1pbmcsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSk7CiAKLUFTdHJpbmcgdXJpRGVidWdTdHJpbmcoY29uc3QgQVN0cmluZyAmdXJpLCBib29sIGluY29nbml0byA9IGZhbHNlKTsKLQogc3RydWN0IEhMU1RpbWUgewogICAgIGludDMyX3QgbVNlcTsKICAgICBpbnQ2NF90IG1UaW1lVXM7CkBAIC03OSw3ICs4MSw2IEBACiB2b2lkIHdyaXRlVG9BTWVzc2FnZShjb25zdCBzcDxBTWVzc2FnZT4gJm1zZywgY29uc3QgQnVmZmVyaW5nU2V0dGluZ3MgJmJ1ZmZlcmluZyk7CiB2b2lkIHJlYWRGcm9tQU1lc3NhZ2UoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2csIEJ1ZmZlcmluZ1NldHRpbmdzICpidWZmZXJpbmcgLyogbm9ubnVsbCAqLyk7CiAKLUFTdHJpbmcgbmFtZUZvckZkKGludCBmZCk7CiB9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiAjZW5kaWYgIC8vIFVUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCmluZGV4IDlkOTdkZmQuLmZjZmNiZWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlci5oCkBAIC0xLDUgKzEsNSBAQAogLyoKLSAqIENvcHlyaWdodCAyMDE0LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAogICoKICAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwogICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgpAQCAtMTcsODcgKzE3LDI0IEBACiAjaWZuZGVmIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl9IXwogI2RlZmluZSBWSURFT19GUkFNRV9TQ0hFRFVMRVJfSF8KIAotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9UaW1lcnMuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIGNsYXNzIElTdXJmYWNlQ29tcG9zZXI7CiAKLXN0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyIDogcHVibGljIFJlZkJhc2Ugeworc3RydWN0IFZpZGVvRnJhbWVTY2hlZHVsZXIgOiBwdWJsaWMgVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UgewogICAgIFZpZGVvRnJhbWVTY2hlZHVsZXIoKTsKLQotICAgIC8vIChyZSlpbml0aWFsaXplIHNjaGVkdWxlcgotICAgIHZvaWQgaW5pdChmbG9hdCB2aWRlb0ZwcyA9IC0xKTsKLSAgICAvLyB1c2UgaW4gY2FzZSBvZiB2aWRlbyByZW5kZXItdGltZSBkaXNjb250aW51aXR5LCBlLmcuIHNlZWsKLSAgICB2b2lkIHJlc3RhcnQoKTsKLSAgICAvLyBnZXQgYWRqdXN0ZWQgbmFub3RpbWUgZm9yIGEgdmlkZW8gZnJhbWUgcmVuZGVyIGF0IHJlbmRlclRpbWUKLSAgICBuc2Vjc190IHNjaGVkdWxlKG5zZWNzX3QgcmVuZGVyVGltZSk7Ci0KLSAgICAvLyByZXR1cm5zIHRoZSB2c3luYyBwZXJpb2QgZm9yIHRoZSBtYWluIGRpc3BsYXkKLSAgICBuc2Vjc190IGdldFZzeW5jUGVyaW9kKCk7Ci0KLSAgICAvLyByZXR1cm5zIHRoZSBjdXJyZW50IGZyYW1lcy1wZXItc2Vjb25kLCBvciAwLmYgaWYgbm90IHByaW1lZAotICAgIGZsb2F0IGdldEZyYW1lUmF0ZSgpOwotCi0gICAgdm9pZCByZWxlYXNlKCk7Ci0KLSAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtIaXN0b3J5U2l6ZSA9IDg7CisgICAgdm9pZCByZWxlYXNlKCkgb3ZlcnJpZGU7CiAKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsIH5WaWRlb0ZyYW1lU2NoZWR1bGVyKCk7CiAKIHByaXZhdGU6Ci0gICAgc3RydWN0IFBMTCB7Ci0gICAgICAgIFBMTCgpOwotCi0gICAgICAgIC8vIHJlc2V0IFBMTCB0byBuZXcgUExMCi0gICAgICAgIHZvaWQgcmVzZXQoZmxvYXQgZnBzID0gLTEpOwotICAgICAgICAvLyBrZWVwIGN1cnJlbnQgZXN0aW1hdGUsIGJ1dCByZXN0YXJ0IHBoYXNlCi0gICAgICAgIHZvaWQgcmVzdGFydCgpOwotICAgICAgICAvLyByZXR1cm5zIHBlcmlvZCBvciAwIGlmIG5vdCB5ZXQgcHJpbWVkCi0gICAgICAgIG5zZWNzX3QgYWRkU2FtcGxlKG5zZWNzX3QgdGltZSk7Ci0gICAgICAgIG5zZWNzX3QgZ2V0UGVyaW9kKCkgY29uc3Q7Ci0KLSAgICBwcml2YXRlOgotICAgICAgICBuc2Vjc190IG1QZXJpb2Q7Ci0gICAgICAgIG5zZWNzX3QgbVBoYXNlOwotCi0gICAgICAgIGJvb2wgICAgbVByaW1lZDsgICAgICAgIC8vIGhhdmUgYW4gZXN0aW1hdGUgZm9yIHRoZSBwZXJpb2QKLSAgICAgICAgc2l6ZV90ICBtU2FtcGxlc1VzZWRGb3JQcmltaW5nOwotCi0gICAgICAgIG5zZWNzX3QgbUxhc3RUaW1lOyAgICAgIC8vIGxhc3QgaW5wdXQgdGltZQotICAgICAgICBuc2Vjc190IG1SZWZpdEF0OyAgICAgICAvLyBuZXh0IGlucHV0IHRpbWUgdG8gZml0IGF0Ci0KLSAgICAgICAgc2l6ZV90ICBtTnVtU2FtcGxlczsgICAgLy8gY2FuIGdvIHBhc3Qga0hpc3RvcnlTaXplCi0gICAgICAgIG5zZWNzX3QgbVRpbWVzW2tIaXN0b3J5U2l6ZV07Ci0KLSAgICAgICAgdm9pZCB0ZXN0KCk7Ci0gICAgICAgIC8vIHJldHVybnMgd2hldGhlciBmaXQgd2FzIHN1Y2Nlc3NmdWwKLSAgICAgICAgYm9vbCBmaXQobnNlY3NfdCBwaGFzZSwgbnNlY3NfdCBwZXJpb2QsIHNpemVfdCBudW1TYW1wbGVzLAotICAgICAgICAgICAgICAgIGludDY0X3QgKmEsIGludDY0X3QgKmIsIGludDY0X3QgKmVycik7Ci0gICAgICAgIHZvaWQgcHJpbWUoc2l6ZV90IG51bVNhbXBsZXMpOwotICAgIH07Ci0KLSAgICB2b2lkIHVwZGF0ZVZzeW5jKCk7Ci0KLSAgICBuc2Vjc190IG1Wc3luY1RpbWU7ICAgICAgICAvLyB2c3luYyB0aW1pbmcgZnJvbSBkaXNwbGF5Ci0gICAgbnNlY3NfdCBtVnN5bmNQZXJpb2Q7Ci0gICAgbnNlY3NfdCBtVnN5bmNSZWZyZXNoQXQ7ICAgLy8gbmV4dCB0aW1lIHRvIHJlZnJlc2ggdGltaW5nIGluZm8KLQotICAgIG5zZWNzX3QgbUxhc3RWc3luY1RpbWU7ICAgIC8vIGVzdGltYXRlZCB2c3luYyB0aW1lIGZvciBsYXN0IGZyYW1lCi0gICAgbnNlY3NfdCBtVGltZUNvcnJlY3Rpb247ICAgLy8gcnVubmluZyBhZGp1c3RtZW50Ci0KLSAgICBQTEwgbVBsbDsgICAgICAgICAgICAgICAgICAvLyBQTEwgZm9yIHZpZGVvIGZyYW1lIHJhdGUgYmFzZWQgb24gcmVuZGVyIHRpbWUKLQorICAgIHZvaWQgdXBkYXRlVnN5bmMoKSBvdmVycmlkZTsKICAgICBzcDxJU3VyZmFjZUNvbXBvc2VyPiBtQ29tcG9zZXI7Ci0KLSAgICBESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhWaWRlb0ZyYW1lU2NoZWR1bGVyKTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAgLy8gVklERU9fRlJBTUVfU0NIRURVTEVSX0hfCi0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlcjIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlcjIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTFiOWEwCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9WaWRlb0ZyYW1lU2NoZWR1bGVyMi5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgVklERU9fRlJBTUVfU0NIRURVTEVSXzJfSF8KKyNkZWZpbmUgVklERU9fRlJBTUVfU0NIRURVTEVSXzJfSF8KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgVnN5bmNUcmFja2VyOworc3RydWN0IENob3Jlb2dyYXBoZXJUaHJlYWQ7CisKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyMiA6IHB1YmxpYyBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSB7CisgICAgVmlkZW9GcmFtZVNjaGVkdWxlcjIoKTsKKyAgICB2b2lkIHJlbGVhc2UoKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAgIHZpcnR1YWwgflZpZGVvRnJhbWVTY2hlZHVsZXIyKCk7CisKK3ByaXZhdGU6CisgICAgdm9pZCB1cGRhdGVWc3luYygpIG92ZXJyaWRlOworCisgICAgbnNlY3NfdCBtQXBwVnN5bmNPZmZzZXQ7CisgICAgbnNlY3NfdCBtU2ZWc3luY09mZnNldDsKKyAgICBzcDxWc3luY1RyYWNrZXI+IG1Wc3luY1RyYWNrZXI7CisgICAgc3A8Q2hvcmVvZ3JhcGhlclRocmVhZD4gbUNob3Jlb2dyYXBoZXJUaHJlYWQ7CisgICAgTXV0ZXggbUxvY2s7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIFZJREVPX0ZSQU1FX1NDSEVEVUxFUl8yX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L1ZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY1ZjcxNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvVmlkZW9GcmFtZVNjaGVkdWxlckJhc2UuaApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBWSURFT19GUkFNRV9TQ0hFRFVMRVJfQkFTRV9IXworI2RlZmluZSBWSURFT19GUkFNRV9TQ0hFRFVMRVJfQkFTRV9IXworCisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0cnVjdCBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBWaWRlb0ZyYW1lU2NoZWR1bGVyQmFzZSgpOworCisgICAgLy8gKHJlKWluaXRpYWxpemUgc2NoZWR1bGVyCisgICAgdm9pZCBpbml0KGZsb2F0IHZpZGVvRnBzID0gLTEpOworICAgIC8vIHVzZSBpbiBjYXNlIG9mIHZpZGVvIHJlbmRlci10aW1lIGRpc2NvbnRpbnVpdHksIGUuZy4gc2VlaworICAgIHZvaWQgcmVzdGFydCgpOworICAgIC8vIGdldCBhZGp1c3RlZCBuYW5vdGltZSBmb3IgYSB2aWRlbyBmcmFtZSByZW5kZXIgYXQgcmVuZGVyVGltZQorICAgIG5zZWNzX3Qgc2NoZWR1bGUobnNlY3NfdCByZW5kZXJUaW1lKTsKKworICAgIC8vIHJldHVybnMgdGhlIHZzeW5jIHBlcmlvZCBmb3IgdGhlIG1haW4gZGlzcGxheQorICAgIG5zZWNzX3QgZ2V0VnN5bmNQZXJpb2QoKTsKKworICAgIC8vIHJldHVybnMgdGhlIGN1cnJlbnQgZnJhbWVzLXBlci1zZWNvbmQsIG9yIDAuZiBpZiBub3QgcHJpbWVkCisgICAgZmxvYXQgZ2V0RnJhbWVSYXRlKCk7CisKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZSgpID0gMDsKKworICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga0hpc3RvcnlTaXplID0gODsKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrTmFub3NJbjFzID0gMTAwMDAwMDAwMDsKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrRGVmYXVsdFZzeW5jUGVyaW9kID0ga05hbm9zSW4xcyAvIDYwOyAgLy8gNjBIegorICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtWc3luY1JlZnJlc2hQZXJpb2QgPSBrTmFub3NJbjFzOyAgICAgICAvLyAxIHNlYworCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VmlkZW9GcmFtZVNjaGVkdWxlckJhc2UoKTsKKworICAgIG5zZWNzX3QgbVZzeW5jVGltZTsgICAgICAgIC8vIHZzeW5jIHRpbWluZyBmcm9tIGRpc3BsYXkKKyAgICBuc2Vjc190IG1Wc3luY1BlcmlvZDsKKyAgICBuc2Vjc190IG1Wc3luY1JlZnJlc2hBdDsgICAvLyBuZXh0IHRpbWUgdG8gcmVmcmVzaCB0aW1pbmcgaW5mbworCitwcml2YXRlOgorICAgIHN0cnVjdCBQTEwgeworICAgICAgICBQTEwoKTsKKworICAgICAgICAvLyByZXNldCBQTEwgdG8gbmV3IFBMTAorICAgICAgICB2b2lkIHJlc2V0KGZsb2F0IGZwcyA9IC0xKTsKKyAgICAgICAgLy8ga2VlcCBjdXJyZW50IGVzdGltYXRlLCBidXQgcmVzdGFydCBwaGFzZQorICAgICAgICB2b2lkIHJlc3RhcnQoKTsKKyAgICAgICAgLy8gcmV0dXJucyBwZXJpb2Qgb3IgMCBpZiBub3QgeWV0IHByaW1lZAorICAgICAgICBuc2Vjc190IGFkZFNhbXBsZShuc2Vjc190IHRpbWUpOworICAgICAgICBuc2Vjc190IGdldFBlcmlvZCgpIGNvbnN0OworCisgICAgcHJpdmF0ZToKKyAgICAgICAgbnNlY3NfdCBtUGVyaW9kOworICAgICAgICBuc2Vjc190IG1QaGFzZTsKKworICAgICAgICBib29sICAgIG1QcmltZWQ7ICAgICAgICAvLyBoYXZlIGFuIGVzdGltYXRlIGZvciB0aGUgcGVyaW9kCisgICAgICAgIHNpemVfdCAgbVNhbXBsZXNVc2VkRm9yUHJpbWluZzsKKworICAgICAgICBuc2Vjc190IG1MYXN0VGltZTsgICAgICAvLyBsYXN0IGlucHV0IHRpbWUKKyAgICAgICAgbnNlY3NfdCBtUmVmaXRBdDsgICAgICAgLy8gbmV4dCBpbnB1dCB0aW1lIHRvIGZpdCBhdAorCisgICAgICAgIHNpemVfdCAgbU51bVNhbXBsZXM7ICAgIC8vIGNhbiBnbyBwYXN0IGtIaXN0b3J5U2l6ZQorICAgICAgICBuc2Vjc190IG1UaW1lc1trSGlzdG9yeVNpemVdOworCisgICAgICAgIHZvaWQgdGVzdCgpOworICAgICAgICAvLyByZXR1cm5zIHdoZXRoZXIgZml0IHdhcyBzdWNjZXNzZnVsCisgICAgICAgIGJvb2wgZml0KG5zZWNzX3QgcGhhc2UsIG5zZWNzX3QgcGVyaW9kLCBzaXplX3QgbnVtU2FtcGxlcywKKyAgICAgICAgICAgICAgICBpbnQ2NF90ICphLCBpbnQ2NF90ICpiLCBpbnQ2NF90ICplcnIpOworICAgICAgICB2b2lkIHByaW1lKHNpemVfdCBudW1TYW1wbGVzKTsKKyAgICB9OworCisgICAgdmlydHVhbCB2b2lkIHVwZGF0ZVZzeW5jKCkgPSAwOworCisgICAgbnNlY3NfdCBtTGFzdFZzeW5jVGltZTsgICAgLy8gZXN0aW1hdGVkIHZzeW5jIHRpbWUgZm9yIGxhc3QgZnJhbWUKKyAgICBuc2Vjc190IG1UaW1lQ29ycmVjdGlvbjsgICAvLyBydW5uaW5nIGFkanVzdG1lbnQKKyAgICBQTEwgbVBsbDsgICAgICAgICAgICAgICAgICAvLyBQTEwgZm9yIHZpZGVvIGZyYW1lIHJhdGUgYmFzZWQgb24gcmVuZGVyIHRpbWUKKworICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFZpZGVvRnJhbWVTY2hlZHVsZXJCYXNlKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gVklERU9fRlJBTUVfU0NIRURVTEVSX0JBU0VfSF8KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmNwcAppbmRleCA3NDUyOTAxLi4xNDgyMDcyIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuY3BwCkBAIC0yMywxMCArMjMsMTAgQEAKICNpbmNsdWRlICJFU1F1ZXVlLmgiCiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2Nhcy9uYXRpdmUvMS4wL0lEZXNjcmFtYmxlci5oPgotI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+Ci0jaW5jbHVkZSA8YmluZGVyL01lbW9yeURlYWxlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9hbGxvY2F0b3IvMS4wL0lBbGxvY2F0b3IuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hpZGwvbWVtb3J5LzEuMC9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KLSNpbmNsdWRlIDxoaWRsbWVtb3J5L0ZyYW1ld29ya1V0aWxzLmg+CisjaW5jbHVkZSA8aGlkbG1lbW9yeS9tYXBwaW5nLmg+CiAjaW5jbHVkZSA8bWVkaWEvY2FzL0Rlc2NyYW1ibGVyQVBJLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQml0UmVhZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CkBAIC00NiwxMiArNDYsMTMgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7Ci11c2luZyBoYXJkd2FyZTo6ZnJvbUhlYXA7CiB1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7CiB1c2luZyBoYXJkd2FyZTo6aGlkbF92ZWM7Ci11c2luZyBoYXJkd2FyZTo6SGlkbE1lbW9yeTsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX21lbW9yeTsKIHVzaW5nIG5hbWVzcGFjZSBoYXJkd2FyZTo6Y2FzOjpWMV8wOwogdXNpbmcgbmFtZXNwYWNlIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDsKK3R5cGVkZWYgaGlkbDo6YWxsb2NhdG9yOjpWMV8wOjpJQWxsb2NhdG9yIFRBbGxvY2F0b3I7Cit0eXBlZGVmIGhpZGw6Om1lbW9yeTo6VjFfMDo6SU1lbW9yeSBUTWVtb3J5OwogCiAvLyBJIHdhbnQgdGhlIGV4cHJlc3Npb24gInkiIGV2YWx1YXRlZCBldmVuIGlmIHZlcmJvc2UgbG9nZ2luZyBpcyBvZmYuCiAjZGVmaW5lIE1ZX0xPR1YoeCwgeSkgXApAQCAtMTE3LDE1ICsxMTgsMTIgQEAKICAgICB2b2lkIHNpZ25hbE5ld1NhbXBsZUFlc0tleShjb25zdCBzcDxBTWVzc2FnZT4gJmtleUl0ZW0pOwogCiBwcml2YXRlOgotICAgIHN0cnVjdCBTdHJlYW1JbmZvIHsKLSAgICAgICAgdW5zaWduZWQgbVR5cGU7Ci0gICAgICAgIHVuc2lnbmVkIG1QSUQ7Ci0gICAgICAgIGludDMyX3QgbUNBU3lzdGVtSWQ7Ci0gICAgfTsKIAogICAgIEFUU1BhcnNlciAqbVBhcnNlcjsKICAgICB1bnNpZ25lZCBtUHJvZ3JhbU51bWJlcjsKICAgICB1bnNpZ25lZCBtUHJvZ3JhbU1hcFBJRDsKKyAgICB1aW50MzJfdCBtUE1UVmVyc2lvbjsKKyAgICB1aW50MzJfdCBtUE1UX0NSQzsKICAgICBLZXllZFZlY3Rvcjx1bnNpZ25lZCwgc3A8U3RyZWFtPiA+IG1TdHJlYW1zOwogICAgIGJvb2wgbUZpcnN0UFRTVmFsaWQ7CiAgICAgdWludDY0X3QgbUZpcnN0UFRTOwpAQCAtMTQyLDE1ICsxNDAsMTUgQEAKIH07CiAKIHN0cnVjdCBBVFNQYXJzZXI6OlN0cmVhbSA6IHB1YmxpYyBSZWZCYXNlIHsKLSAgICBTdHJlYW0oUHJvZ3JhbSAqcHJvZ3JhbSwKLSAgICAgICAgICAgdW5zaWduZWQgZWxlbWVudGFyeVBJRCwKLSAgICAgICAgICAgdW5zaWduZWQgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgdW5zaWduZWQgUENSX1BJRCwKLSAgICAgICAgICAgaW50MzJfdCBDQV9zeXN0ZW1fSUQpOworICAgIFN0cmVhbShQcm9ncmFtICpwcm9ncmFtLCB1bnNpZ25lZCBQQ1JfUElELCBjb25zdCBTdHJlYW1JbmZvICZpbmZvKTsKIAogICAgIHVuc2lnbmVkIHR5cGUoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZTsgfQorICAgIHVuc2lnbmVkIHR5cGVFeHQoKSBjb25zdCB7IHJldHVybiBtU3RyZWFtVHlwZUV4dDsgfQogICAgIHVuc2lnbmVkIHBpZCgpIGNvbnN0IHsgcmV0dXJuIG1FbGVtZW50YXJ5UElEOyB9CiAgICAgdm9pZCBzZXRQSUQodW5zaWduZWQgcGlkKSB7IG1FbGVtZW50YXJ5UElEID0gcGlkOyB9CisgICAgdm9pZCBzZXRBdWRpb1ByZXNlbnRhdGlvbnMoQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uIGF1ZGlvUHJlc2VudGF0aW9ucykgeworICAgICAgICBtQXVkaW9QcmVzZW50YXRpb25zID0gYXVkaW9QcmVzZW50YXRpb25zOworICAgIH0KIAogICAgIHZvaWQgc2V0Q2FzSW5mbygKICAgICAgICAgICAgIGludDMyX3Qgc3lzdGVtSWQsCkBAIC0xOTQsNiArMTkyLDcgQEAKICAgICBQcm9ncmFtICptUHJvZ3JhbTsKICAgICB1bnNpZ25lZCBtRWxlbWVudGFyeVBJRDsKICAgICB1bnNpZ25lZCBtU3RyZWFtVHlwZTsKKyAgICB1bnNpZ25lZCBtU3RyZWFtVHlwZUV4dDsKICAgICB1bnNpZ25lZCBtUENSX1BJRDsKICAgICBpbnQzMl90IG1FeHBlY3RlZENvbnRpbnVpdHlDb3VudGVyOwogCkBAIC0yMTAsMTMgKzIwOSwxNiBAQAogICAgIGJvb2wgbVNjcmFtYmxlZDsKICAgICBib29sIG1TYW1wbGVFbmNyeXB0ZWQ7CiAgICAgc3A8QU1lc3NhZ2U+IG1TYW1wbGVBZXNLZXlJdGVtOwotICAgIHNwPElNZW1vcnk+IG1NZW07Ci0gICAgc3A8TWVtb3J5RGVhbGVyPiBtRGVhbGVyOwotICAgIHNwPEhpZGxNZW1vcnk+IG1IaWRsTWVtb3J5OworICAgIHNwPFRNZW1vcnk+IG1IaWRsTWVtb3J5OworICAgIHNwPFRBbGxvY2F0b3I+IG1IaWRsQWxsb2NhdG9yOwogICAgIGhhcmR3YXJlOjpjYXM6Om5hdGl2ZTo6VjFfMDo6U2hhcmVkQnVmZmVyIG1EZXNjcmFtYmxlclNyY0J1ZmZlcjsKICAgICBzcDxBQnVmZmVyPiBtRGVzY3JhbWJsZWRCdWZmZXI7CiAgICAgTGlzdDxTdWJTYW1wbGVJbmZvPiBtU3ViU2FtcGxlczsKICAgICBzcDxJRGVzY3JhbWJsZXI+IG1EZXNjcmFtYmxlcjsKKyAgICBBdWRpb1ByZXNlbnRhdGlvbkNvbGxlY3Rpb24gbUF1ZGlvUHJlc2VudGF0aW9uczsKKworICAgIC8vIFNlbmQgYXVkaW8gcHJlc2VudGF0aW9ucyBhbG9uZyB3aXRoIGFjY2VzcyB1bml0cy4KKyAgICB2b2lkIGFkZEF1ZGlvUHJlc2VudGF0aW9ucyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKTsKIAogICAgIC8vIEZsdXNoIGFjY3VtdWxhdGVkIHBheWxvYWQgaWYgbmVjZXNzYXJ5IC0tLSBpLmUuIGF0IEVPUyBvciBhdCB0aGUgc3RhcnQgb2YKICAgICAvLyBhbm90aGVyIHBheWxvYWQuIGV2ZW50IGlzIHNldCBpZiB0aGUgZmx1c2hlZCBwYXlsb2FkIGlzIFBFUyB3aXRoIGEgc3luYwpAQCAtMjk5LDYgKzMwMSw4IEBACiAgICAgOiBtUGFyc2VyKHBhcnNlciksCiAgICAgICBtUHJvZ3JhbU51bWJlcihwcm9ncmFtTnVtYmVyKSwKICAgICAgIG1Qcm9ncmFtTWFwUElEKHByb2dyYW1NYXBQSUQpLAorICAgICAgbVBNVFZlcnNpb24oMHhmZmZmZmZmZiksCisgICAgICBtUE1UX0NSQygweGZmZmZmZmZmKSwKICAgICAgIG1GaXJzdFBUU1ZhbGlkKGZhbHNlKSwKICAgICAgIG1GaXJzdFBUUygwKSwKICAgICAgIG1MYXN0UmVjb3ZlcmVkUFRTKGxhc3RSZWNvdmVyZWRQVFMpIHsKQEAgLTQ0Nyw3ICs0NTEsNyBAQAogICAgICAgICBpZiAoZGVzY3JpcHRvcl9sZW5ndGggPiBpbmZvTGVuZ3RoKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQotICAgICAgICBpZiAoZGVzY3JpcHRvcl90YWcgPT0gOSAmJiBkZXNjcmlwdG9yX2xlbmd0aCA+PSA0KSB7CisgICAgICAgIGlmIChkZXNjcmlwdG9yX3RhZyA9PSBERVNDUklQVE9SX0NBICYmIGRlc2NyaXB0b3JfbGVuZ3RoID49IDQpIHsKICAgICAgICAgICAgIGZvdW5kID0gdHJ1ZTsKICAgICAgICAgICAgIGNhRGVzY3JpcHRvci0+bVN5c3RlbUlEID0gYnItPmdldEJpdHMoMTYpOwogICAgICAgICAgICAgY2FEZXNjcmlwdG9yLT5tUElEID0gYnItPmdldEJpdHMoMTYpICYgMHgxZmZmOwpAQCAtNDg2LDcgKzQ5MCwxMyBAQAogCiAgICAgTVlfTE9HVigiICBwcm9ncmFtX251bWJlciA9ICV1IiwgYnItPmdldEJpdHMoMTYpKTsKICAgICBNWV9MT0dWKCIgIHJlc2VydmVkID0gJXUiLCBici0+Z2V0Qml0cygyKSk7Ci0gICAgTVlfTE9HVigiICB2ZXJzaW9uX251bWJlciA9ICV1IiwgYnItPmdldEJpdHMoNSkpOworICAgIGJvb2wgYXVkaW9QcmVzZW50YXRpb25zQ2hhbmdlZCA9IGZhbHNlOworICAgIHVuc2lnbmVkIHBtdFZlcnNpb24gPSBici0+Z2V0Qml0cyg1KTsKKyAgICBpZiAocG10VmVyc2lvbiAhPSBtUE1UVmVyc2lvbikgeworICAgICAgICBhdWRpb1ByZXNlbnRhdGlvbnNDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgbVBNVFZlcnNpb24gPSBwbXRWZXJzaW9uOworICAgIH0KKyAgICBNWV9MT0dWKCIgIHZlcnNpb25fbnVtYmVyID0gJXUiLCBwbXRWZXJzaW9uKTsKICAgICBNWV9MT0dWKCIgIGN1cnJlbnRfbmV4dF9pbmRpY2F0b3IgPSAldSIsIGJyLT5nZXRCaXRzKDEpKTsKICAgICBNWV9MT0dWKCIgIHNlY3Rpb25fbnVtYmVyID0gJXUiLCBici0+Z2V0Qml0cyg4KSk7CiAgICAgTVlfTE9HVigiICBsYXN0X3NlY3Rpb25fbnVtYmVyID0gJXUiLCBici0+Z2V0Qml0cyg4KSk7CkBAIC01MTMsNDMgKzUyMywxNjYgQEAKICAgICAvLyBpbmZvQnl0ZXNSZW1haW5pbmcgaXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IG1ha2UgdXAgdGhlCiAgICAgLy8gdmFyaWFibGUgbGVuZ3RoIHNlY3Rpb24gb2YgRVNfaW5mb3MuIEl0IGRvZXMgbm90IGluY2x1ZGUgdGhlCiAgICAgLy8gZmluYWwgQ1JDLgotICAgIHNpemVfdCBpbmZvQnl0ZXNSZW1haW5pbmcgPSBzZWN0aW9uX2xlbmd0aCAtIDkgLSBwcm9ncmFtX2luZm9fbGVuZ3RoIC0gNDsKKyAgICBpbnQzMl90IGluZm9CeXRlc1JlbWFpbmluZyA9IHNlY3Rpb25fbGVuZ3RoIC0gOSAtIHByb2dyYW1faW5mb19sZW5ndGggLSA0OwogCiAgICAgd2hpbGUgKGluZm9CeXRlc1JlbWFpbmluZyA+PSA1KSB7Ci0KLSAgICAgICAgdW5zaWduZWQgc3RyZWFtVHlwZSA9IGJyLT5nZXRCaXRzKDgpOwotICAgICAgICBBTE9HVigiICAgIHN0cmVhbV90eXBlID0gMHglMDJ4Iiwgc3RyZWFtVHlwZSk7Ci0KKyAgICAgICAgU3RyZWFtSW5mbyBpbmZvOworICAgICAgICBpbmZvLm1UeXBlID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgIEFMT0dWKCIgICAgc3RyZWFtX3R5cGUgPSAweCUwMngiLCBpbmZvLm1UeXBlKTsKICAgICAgICAgTVlfTE9HVigiICAgIHJlc2VydmVkID0gJXUiLCBici0+Z2V0Qml0cygzKSk7CiAKLSAgICAgICAgdW5zaWduZWQgZWxlbWVudGFyeVBJRCA9IGJyLT5nZXRCaXRzKDEzKTsKLSAgICAgICAgQUxPR1YoIiAgICBlbGVtZW50YXJ5X1BJRCA9IDB4JTA0eCIsIGVsZW1lbnRhcnlQSUQpOworICAgICAgICBpbmZvLm1QSUQgPSBici0+Z2V0Qml0cygxMyk7CisgICAgICAgIEFMT0dWKCIgICAgZWxlbWVudGFyeV9QSUQgPSAweCUwNHgiLCBpbmZvLm1QSUQpOwogCiAgICAgICAgIE1ZX0xPR1YoIiAgICByZXNlcnZlZCA9ICV1IiwgYnItPmdldEJpdHMoNCkpOwogCiAgICAgICAgIHVuc2lnbmVkIEVTX2luZm9fbGVuZ3RoID0gYnItPmdldEJpdHMoMTIpOwogICAgICAgICBBTE9HVigiICAgIEVTX2luZm9fbGVuZ3RoID0gJXUiLCBFU19pbmZvX2xlbmd0aCk7CisgICAgICAgIGluZm9CeXRlc1JlbWFpbmluZyAtPSA1ICsgRVNfaW5mb19sZW5ndGg7CiAKICAgICAgICAgQ0FEZXNjcmlwdG9yIHN0cmVhbUNBOwotICAgICAgICBib29sIGhhc1N0cmVhbUNBID0gZmluZENBRGVzY3JpcHRvcihiciwgRVNfaW5mb19sZW5ndGgsICZzdHJlYW1DQSk7CisgICAgICAgIGluZm8ubVR5cGVFeHQgPSBFWFRfREVTQ1JJUFRPUl9EVkJfUkVTRVJWRURfTUFYOworCisgICAgICAgIGluZm8ubUF1ZGlvUHJlc2VudGF0aW9ucy5jbGVhcigpOworICAgICAgICBib29sIGhhc1N0cmVhbUNBID0gZmFsc2U7CisgICAgICAgIHdoaWxlIChFU19pbmZvX2xlbmd0aCA+IDIgJiYgaW5mb0J5dGVzUmVtYWluaW5nID49IDApIHsKKyAgICAgICAgICAgIHVuc2lnbmVkIGRlc2NyaXB0b3JfdGFnID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICBBTE9HVigiICAgICAgdGFnID0gMHglMDJ4IiwgZGVzY3JpcHRvcl90YWcpOworCisgICAgICAgICAgICB1bnNpZ25lZCBkZXNjcmlwdG9yX2xlbmd0aCA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgQUxPR1YoIiAgICAgIGxlbiA9ICV1IiwgZGVzY3JpcHRvcl9sZW5ndGgpOworCisgICAgICAgICAgICBFU19pbmZvX2xlbmd0aCAtPSAyOworICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JfbGVuZ3RoID4gRVNfaW5mb19sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JfdGFnID09IERFU0NSSVBUT1JfQ0EgJiYgZGVzY3JpcHRvcl9sZW5ndGggPj0gNCkgeworICAgICAgICAgICAgICAgIGhhc1N0cmVhbUNBID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzdHJlYW1DQS5tU3lzdGVtSUQgPSBici0+Z2V0Qml0cygxNik7CisgICAgICAgICAgICAgICAgc3RyZWFtQ0EubVBJRCA9IGJyLT5nZXRCaXRzKDE2KSAmIDB4MWZmZjsKKyAgICAgICAgICAgICAgICBFU19pbmZvX2xlbmd0aCAtPSBkZXNjcmlwdG9yX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX2xlbmd0aCAtPSA0OworICAgICAgICAgICAgICAgIHN0cmVhbUNBLm1Qcml2YXRlRGF0YS5hc3NpZ24oYnItPmRhdGEoKSwgYnItPmRhdGEoKSArIGRlc2NyaXB0b3JfbGVuZ3RoKTsKKyAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoZGVzY3JpcHRvcl9sZW5ndGggKiA4KTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5mby5tVHlwZSA9PSBTVFJFQU1UWVBFX1BFU19QUklWQVRFX0RBVEEgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl90YWcgPT0gREVTQ1JJUFRPUl9EVkJfRVhURU5TSU9OICYmIGRlc2NyaXB0b3JfbGVuZ3RoID49IDEpIHsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBkZXNjVGFnRXh0ID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiAgICAgIHRhZ19leHQgPSAweCUwMngiLCBkZXNjVGFnRXh0KTsKKyAgICAgICAgICAgICAgICBFU19pbmZvX2xlbmd0aCAtPSBkZXNjcmlwdG9yX2xlbmd0aDsKKyAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX2xlbmd0aC0tOworICAgICAgICAgICAgICAgIC8vIFRoZSBBQzQgZGVzY3JpcHRvciBpcyB1c2VkIGluIHRoZSBQU0kgUE1UIHRvIGlkZW50aWZ5IHN0cmVhbXMgd2hpY2ggY2FycnkgQUM0CisgICAgICAgICAgICAgICAgLy8gYXVkaW8uCisgICAgICAgICAgICAgICAgaWYgKGRlc2NUYWdFeHQgPT0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNCkgeworICAgICAgICAgICAgICAgICAgICBpbmZvLm1UeXBlRXh0ID0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNDsKKyAgICAgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKGRlc2NyaXB0b3JfbGVuZ3RoICogOCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChkZXNjVGFnRXh0ID09IEVYVF9ERVNDUklQVE9SX0RWQl9BVURJT19QUkVTRUxFQ1RJT04gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfbGVuZ3RoID49IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRFZCIEJsdWVCb29rIEEwMzggVGFibGUgMTEwCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV9wcmVzZWxlY3Rpb25zID0gYnItPmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cygzKTsgIC8vIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBudW1fcHJlc2VsZWN0aW9uczsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCAxNikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUHJlc2VudGF0aW9uVjEgYXA7CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tUHJlc2VudGF0aW9uSWQgPSBici0+Z2V0Qml0cyg1KTsgIC8vIHByZXNlbGVjdGlvbl9pZAorCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdWRpb19yZW5kZXJpbmdfaW5kaWNhdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgYXAubU1hc3RlcmluZ0luZGljYXRpb24gPSBzdGF0aWNfY2FzdDxNYXN0ZXJpbmdJbmRpY2F0aW9uPihici0+Z2V0Qml0cygzKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tQXVkaW9EZXNjcmlwdGlvbkF2YWlsYWJsZSA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwLm1TcG9rZW5TdWJ0aXRsZXNBdmFpbGFibGUgPSAoYnItPmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhcC5tRGlhbG9ndWVFbmhhbmNlbWVudEF2YWlsYWJsZSA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbnRlcmFjdGl2aXR5X2VuYWJsZWQgPSAoYnItPmdldEJpdHMoMSkgPT0gMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBNWV9MT0dWKCIgICAgICBpbnRlcmFjdGl2aXR5X2VuYWJsZWQgPSAlZCIsIGludGVyYWN0aXZpdHlfZW5hYmxlZCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbGFuZ3VhZ2VfY29kZV9wcmVzZW50ID0gKGJyLT5nZXRCaXRzKDEpID09IDEpOworICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0ZXh0X2xhYmVsX3ByZXNlbnQgPSAoYnItPmdldEJpdHMoMSkgPT0gMSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbXVsdGlfc3RyZWFtX2luZm9fcHJlc2VudCA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnV0dXJlX2V4dGVuc2lvbiA9IChici0+Z2V0Qml0cygxKSA9PSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChsYW5ndWFnZV9jb2RlX3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCAyNCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiTm90IGVub3VnaCBkYXRhIGxlZnQgaW4gYml0cmVhZGVyISIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGxhbmd1YWdlWzRdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlWzBdID0gYnItPmdldEJpdHMoOCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFuZ3VhZ2VbMV0gPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYW5ndWFnZVsyXSA9IGJyLT5nZXRCaXRzKDgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhbmd1YWdlWzNdID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcC5tTGFuZ3VhZ2UgPSBTdHJpbmc4KGxhbmd1YWdlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBtYXBzIHRoZSBwcmVzZW50YXRpb24gaWQgdG8gdGhlIG1lc3NhZ2UgaWQgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBFWFRfREVTQ1JJUFRPUl9EVkJfTUVTU0FHRSBzbyB0aGF0IHdlIGNhbiBnZXQgdGhlIHByZXNlbnRhdGlvbiBsYWJlbC4KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0X2xhYmVsX3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG1lc3NhZ2VfaWQgPSBici0+Z2V0Qml0cyg4KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNWV9MT0dWKCIgICAgICBtZXNzYWdlX2lkID0gJXUiLCBtZXNzYWdlX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG11bHRpX3N0cmVhbV9pbmZvX3ByZXNlbnQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnItPm51bUJpdHNMZWZ0KCkgPCA4KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bV9hdXhfY29tcG9uZW50cyA9IGJyLT5nZXRCaXRzKDMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cyg1KTsgIC8vIHJlc2VydmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpIDwgKG51bV9hdXhfY29tcG9uZW50cyAqIDgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGRhdGEgbGVmdCBpbiBiaXRyZWFkZXIhIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cyhudW1fYXV4X2NvbXBvbmVudHMgKiA4KTsgIC8vIGNvbXBvbmVudF90YWcKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmdXR1cmVfZXh0ZW5zaW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpIDwgOCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoMyk7ICAvLyByZXNlcnZlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZ1dHVyZV9leHRlbnNpb25fbGVuZ3RoID0gYnItPmdldEJpdHMoNSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGJyLT5udW1CaXRzTGVmdCgpIDwgKGZ1dHVyZV9leHRlbnNpb25fbGVuZ3RoICogOCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggZGF0YSBsZWZ0IGluIGJpdHJlYWRlciEiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnItPnNraXBCaXRzKGZ1dHVyZV9leHRlbnNpb25fbGVuZ3RoICogOCk7ICAvLyBmdXR1cmVfZXh0ZW5zaW9uX2J5dGUKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGluZm8ubUF1ZGlvUHJlc2VudGF0aW9ucy5wdXNoX2JhY2soc3RkOjptb3ZlKGFwKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBici0+c2tpcEJpdHMoZGVzY3JpcHRvcl9sZW5ndGggKiA4KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEVTX2luZm9fbGVuZ3RoIC09IGRlc2NyaXB0b3JfbGVuZ3RoOworICAgICAgICAgICAgICAgIGJyLT5za2lwQml0cyhkZXNjcmlwdG9yX2xlbmd0aCAqIDgpOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIGlmIChoYXNTdHJlYW1DQSAmJiAhbVBhcnNlci0+bUNhc01hbmFnZXItPmFkZFN0cmVhbSgKLSAgICAgICAgICAgICAgICBtUHJvZ3JhbU51bWJlciwgZWxlbWVudGFyeVBJRCwgc3RyZWFtQ0EpKSB7CisgICAgICAgICAgICAgICAgbVByb2dyYW1OdW1iZXIsIGluZm8ubVBJRCwgc3RyZWFtQ0EpKSB7CiAgICAgICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOwogICAgICAgICB9Ci0gICAgICAgIFN0cmVhbUluZm8gaW5mbzsKLSAgICAgICAgaW5mby5tVHlwZSA9IHN0cmVhbVR5cGU7Ci0gICAgICAgIGluZm8ubVBJRCA9IGVsZW1lbnRhcnlQSUQ7Ci0gICAgICAgIGluZm8ubUNBU3lzdGVtSWQgPSBoYXNQcm9ncmFtQ0EgPyBwcm9ncmFtQ0EubVN5c3RlbUlEIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc1N0cmVhbUNBID8gc3RyZWFtQ0EubVN5c3RlbUlEICA6IC0xOwotICAgICAgICBpbmZvcy5wdXNoKGluZm8pOworICAgICAgICBpZiAoaGFzUHJvZ3JhbUNBKSB7CisgICAgICAgICAgICBpbmZvLm1DQURlc2NyaXB0b3IgPSBwcm9ncmFtQ0E7CisgICAgICAgIH0gZWxzZSBpZiAoaGFzU3RyZWFtQ0EpIHsKKyAgICAgICAgICAgIGluZm8ubUNBRGVzY3JpcHRvciA9IHN0cmVhbUNBOworICAgICAgICB9CiAKLSAgICAgICAgaW5mb0J5dGVzUmVtYWluaW5nIC09IDUgKyBFU19pbmZvX2xlbmd0aDsKKyAgICAgICAgaW5mb3MucHVzaChpbmZvKTsKICAgICB9CiAKICAgICBpZiAoaW5mb0J5dGVzUmVtYWluaW5nICE9IDApIHsKICAgICAgICAgQUxPR1coIlNlY3Rpb24gZGF0YSByZW1haW5zIHVuY29uc3VtZWQiKTsKICAgICB9Ci0gICAgTVlfTE9HVigiICBDUkMgPSAweCUwOHgiLCBici0+Z2V0Qml0cygzMikpOworICAgIHVuc2lnbmVkIGNyYyA9IGJyLT5nZXRCaXRzKDMyKTsKKyAgICBpZiAoY3JjICE9IG1QTVRfQ1JDKSB7CisgICAgICAgIGF1ZGlvUHJlc2VudGF0aW9uc0NoYW5nZWQgPSB0cnVlOworICAgICAgICBtUE1UX0NSQyA9IGNyYzsKKyAgICB9CisgICAgTVlfTE9HVigiICBDUkMgPSAweCUwOHgiLCBjcmMpOwogCiAgICAgYm9vbCBQSURzQ2hhbmdlZCA9IGZhbHNlOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgaW5mb3Muc2l6ZSgpOyArK2kpIHsKQEAgLTYwMSwxNiArNzM0LDE5IEBACiAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtU3RyZWFtcy5pbmRleE9mS2V5KGluZm8ubVBJRCk7CiAKICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgc3A8U3RyZWFtPiBzdHJlYW0gPSBuZXcgU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICB0aGlzLCBpbmZvLm1QSUQsIGluZm8ubVR5cGUsIFBDUl9QSUQsIGluZm8ubUNBU3lzdGVtSWQpOworICAgICAgICAgICAgc3A8U3RyZWFtPiBzdHJlYW0gPSBuZXcgU3RyZWFtKHRoaXMsIFBDUl9QSUQsIGluZm8pOwogCiAgICAgICAgICAgICBpZiAobVNhbXBsZUFlc0tleUl0ZW0gIT0gTlVMTCkgewogICAgICAgICAgICAgICAgIHN0cmVhbS0+c2lnbmFsTmV3U2FtcGxlQWVzS2V5KG1TYW1wbGVBZXNLZXlJdGVtKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaXNBZGRpbmdTY3JhbWJsZWRTdHJlYW0gfD0gaW5mby5tQ0FTeXN0ZW1JZCA+PSAwOworICAgICAgICAgICAgaXNBZGRpbmdTY3JhbWJsZWRTdHJlYW0gfD0gaW5mby5tQ0FEZXNjcmlwdG9yLm1TeXN0ZW1JRCA+PSAwOwogICAgICAgICAgICAgbVN0cmVhbXMuYWRkKGluZm8ubVBJRCwgc3RyZWFtKTsKICAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChpbmRleCA+PSAwICYmIG1TdHJlYW1zLmVkaXRWYWx1ZUF0KGluZGV4KS0+aXNBdWRpbygpCisgICAgICAgICAgICAgICAgICYmIGF1ZGlvUHJlc2VudGF0aW9uc0NoYW5nZWQpIHsKKyAgICAgICAgICAgIG1TdHJlYW1zLmVkaXRWYWx1ZUF0KGluZGV4KS0+c2V0QXVkaW9QcmVzZW50YXRpb25zKGluZm8ubUF1ZGlvUHJlc2VudGF0aW9ucyk7CisgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoaXNBZGRpbmdTY3JhbWJsZWRTdHJlYW0pIHsKQEAgLTcxNywzNCArODUzLDMzIEBACiBzdGF0aWMgY29uc3Qgc2l6ZV90IGtJbml0aWFsU3RyZWFtQnVmZmVyU2l6ZSA9IDE5MiAqIDEwMjQ7CiAKIEFUU1BhcnNlcjo6U3RyZWFtOjpTdHJlYW0oCi0gICAgICAgIFByb2dyYW0gKnByb2dyYW0sCi0gICAgICAgIHVuc2lnbmVkIGVsZW1lbnRhcnlQSUQsCi0gICAgICAgIHVuc2lnbmVkIHN0cmVhbVR5cGUsCi0gICAgICAgIHVuc2lnbmVkIFBDUl9QSUQsCi0gICAgICAgIGludDMyX3QgQ0Ffc3lzdGVtX0lEKQorICAgICAgICBQcm9ncmFtICpwcm9ncmFtLCB1bnNpZ25lZCBQQ1JfUElELCBjb25zdCBTdHJlYW1JbmZvICZpbmZvKQogICAgIDogbVByb2dyYW0ocHJvZ3JhbSksCi0gICAgICBtRWxlbWVudGFyeVBJRChlbGVtZW50YXJ5UElEKSwKLSAgICAgIG1TdHJlYW1UeXBlKHN0cmVhbVR5cGUpLAorICAgICAgbUVsZW1lbnRhcnlQSUQoaW5mby5tUElEKSwKKyAgICAgIG1TdHJlYW1UeXBlKGluZm8ubVR5cGUpLAorICAgICAgbVN0cmVhbVR5cGVFeHQoaW5mby5tVHlwZUV4dCksCiAgICAgICBtUENSX1BJRChQQ1JfUElEKSwKICAgICAgIG1FeHBlY3RlZENvbnRpbnVpdHlDb3VudGVyKC0xKSwKICAgICAgIG1QYXlsb2FkU3RhcnRlZChmYWxzZSksCiAgICAgICBtRU9TUmVhY2hlZChmYWxzZSksCiAgICAgICBtUHJldlBUUygwKSwKICAgICAgIG1RdWV1ZShOVUxMKSwKLSAgICAgIG1TY3JhbWJsZWQoQ0Ffc3lzdGVtX0lEID49IDApIHsKLQorICAgICAgbVNjcmFtYmxlZChpbmZvLm1DQURlc2NyaXB0b3IubVN5c3RlbUlEID49IDApLAorICAgICAgbUF1ZGlvUHJlc2VudGF0aW9ucyhpbmZvLm1BdWRpb1ByZXNlbnRhdGlvbnMpIHsKICAgICBtU2FtcGxlRW5jcnlwdGVkID0KICAgICAgICAgICAgIG1TdHJlYW1UeXBlID09IFNUUkVBTVRZUEVfSDI2NF9FTkNSWVBURUQgfHwKICAgICAgICAgICAgIG1TdHJlYW1UeXBlID09IFNUUkVBTVRZUEVfQUFDX0VOQ1JZUFRFRCAgfHwKICAgICAgICAgICAgIG1TdHJlYW1UeXBlID09IFNUUkVBTVRZUEVfQUMzX0VOQ1JZUFRFRDsKIAogICAgIEFMT0dWKCJuZXcgc3RyZWFtIFBJRCAweCUwMngsIHR5cGUgMHglMDJ4LCBzY3JhbWJsZWQgJWQsIFNhbXBsZUVuY3J5cHRlZDogJWQiLAotICAgICAgICAgICAgZWxlbWVudGFyeVBJRCwgc3RyZWFtVHlwZSwgbVNjcmFtYmxlZCwgbVNhbXBsZUVuY3J5cHRlZCk7CisgICAgICAgICAgICBpbmZvLm1QSUQsIGluZm8ubVR5cGUsIG1TY3JhbWJsZWQsIG1TYW1wbGVFbmNyeXB0ZWQpOwogCi0gICAgdWludDMyX3QgZmxhZ3MgPQotICAgICAgICAgICAgKGlzVmlkZW8oKSAmJiBtU2NyYW1ibGVkKSA/IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6a0ZsYWdfU2NyYW1ibGVkRGF0YSA6Ci0gICAgICAgICAgICAobVNhbXBsZUVuY3J5cHRlZCkgPyBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmtGbGFnX1NhbXBsZUVuY3J5cHRlZERhdGEgOgotICAgICAgICAgICAgMDsKKyAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgaWYgKCgoaXNWaWRlbygpIHx8IGlzQXVkaW8oKSkgJiYgbVNjcmFtYmxlZCkpIHsKKyAgICAgICAgZmxhZ3MgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmtGbGFnX1NjcmFtYmxlZERhdGE7CisgICAgfSBlbHNlIGlmIChtU2FtcGxlRW5jcnlwdGVkKSB7CisgICAgICAgIGZsYWdzID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjprRmxhZ19TYW1wbGVFbmNyeXB0ZWREYXRhOworICAgIH0KIAogICAgIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6TW9kZSBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpJTlZBTElEOwogCkBAIC03ODEsMTMgKzkxNiwyMyBAQAogICAgICAgICAgICAgbW9kZSA9IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6QUMzOwogICAgICAgICAgICAgYnJlYWs7CiAKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0VBQzM6CisgICAgICAgICAgICBtb2RlID0gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpFQUMzOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1BFU19QUklWQVRFX0RBVEE6CisgICAgICAgICAgICBpZiAobVN0cmVhbVR5cGVFeHQgPT0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNCkgeworICAgICAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OkFDNDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworCiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NRVRBREFUQToKICAgICAgICAgICAgIG1vZGUgPSBFbGVtZW50YXJ5U3RyZWFtUXVldWU6Ok1FVEFEQVRBOwogICAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dFKCJzdHJlYW0gUElEIDB4JTAyeCBoYXMgaW52YWxpZCBzdHJlYW0gdHlwZSAweCUwMngiLAotICAgICAgICAgICAgICAgICAgICBlbGVtZW50YXJ5UElELCBzdHJlYW1UeXBlKTsKKyAgICAgICAgICAgICAgICAgICAgaW5mby5tUElELCBpbmZvLm1UeXBlKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICB9CiAKQEAgLTgwNyw3ICs5NTIsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgaXNBdWRpbygpID8gTUVESUFfTUlNRVRZUEVfQVVESU9fU0NSQU1CTEVECiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE1FRElBX01JTUVUWVBFX1ZJREVPX1NDUkFNQkxFRCk7CiAgICAgICAgICAgICAvLyBmb3IgTWVkaWFFeHRyYWN0b3IuQ2FzSW5mbwotICAgICAgICAgICAgbWV0YS0+c2V0SW50MzIoa0tleUNBU3lzdGVtSUQsIENBX3N5c3RlbV9JRCk7CisgICAgICAgICAgICBjb25zdCBDQURlc2NyaXB0b3IgJmRlc2NyaXB0b3IgPSBpbmZvLm1DQURlc2NyaXB0b3I7CisgICAgICAgICAgICBtZXRhLT5zZXRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgZGVzY3JpcHRvci5tU3lzdGVtSUQpOworCisgICAgICAgICAgICBtZXRhLT5zZXREYXRhKGtLZXlDQVByaXZhdGVEYXRhLCAwLAorICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLm1Qcml2YXRlRGF0YS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IubVByaXZhdGVEYXRhLnNpemUoKSk7CisKICAgICAgICAgICAgIG1Tb3VyY2UgPSBuZXcgQW5vdGhlclBhY2tldFNvdXJjZShtZXRhKTsKICAgICAgICAgfQogICAgIH0KQEAgLTgyNywxNiArOTc4LDQzIEBACiAgICAgICAgICAgICBtQnVmZmVyID09IE5VTEwgPyAwIDogbUJ1ZmZlci0+Y2FwYWNpdHkoKSwgbmVlZGVkU2l6ZSwgbVNjcmFtYmxlZCk7CiAKICAgICBzcDxBQnVmZmVyPiBuZXdCdWZmZXIsIG5ld1NjcmFtYmxlZEJ1ZmZlcjsKLSAgICBzcDxJTWVtb3J5PiBuZXdNZW07Ci0gICAgc3A8TWVtb3J5RGVhbGVyPiBuZXdEZWFsZXI7CisgICAgc3A8VE1lbW9yeT4gbmV3TWVtOwogICAgIGlmIChtU2NyYW1ibGVkKSB7Ci0gICAgICAgIHNpemVfdCBhbGlnbm1lbnQgPSBNZW1vcnlEZWFsZXI6OmdldEFsbG9jYXRpb25BbGlnbm1lbnQoKTsKLSAgICAgICAgbmVlZGVkU2l6ZSA9IChuZWVkZWRTaXplICsgKGFsaWdubWVudCAtIDEpKSAmIH4oYWxpZ25tZW50IC0gMSk7Ci0gICAgICAgIC8vIEFsaWduIHRvIG11bHRpcGxlcyBvZiA2NEsuCi0gICAgICAgIG5lZWRlZFNpemUgPSAobmVlZGVkU2l6ZSArIDY1NTM1KSAmIH42NTUzNTsKLSAgICAgICAgbmV3RGVhbGVyID0gbmV3IE1lbW9yeURlYWxlcihuZWVkZWRTaXplLCAiQVRTUGFyc2VyIik7Ci0gICAgICAgIG5ld01lbSA9IG5ld0RlYWxlci0+YWxsb2NhdGUobmVlZGVkU2l6ZSk7Ci0gICAgICAgIG5ld1NjcmFtYmxlZEJ1ZmZlciA9IG5ldyBBQnVmZmVyKG5ld01lbS0+cG9pbnRlcigpLCBuZXdNZW0tPnNpemUoKSk7CisgICAgICAgIGlmIChtSGlkbEFsbG9jYXRvciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBtSGlkbEFsbG9jYXRvciA9IFRBbGxvY2F0b3I6OmdldFNlcnZpY2UoImFzaG1lbSIpOworICAgICAgICAgICAgaWYgKG1IaWRsQWxsb2NhdG9yID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gY2FuJ3QgZ2V0IGhpZGwgYWxsb2NhdG9yIiwgbUVsZW1lbnRhcnlQSUQpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGhpZGxfbWVtb3J5IGhpZGxNZW1Ub2tlbjsKKyAgICAgICAgYm9vbCBzdWNjZXNzOworICAgICAgICBhdXRvIHRyYW5zU3RhdHVzID0gbUhpZGxBbGxvY2F0b3ItPmFsbG9jYXRlKAorICAgICAgICAgICAgICAgIG5lZWRlZFNpemUsCisgICAgICAgICAgICAgICAgWyZzdWNjZXNzLCAmaGlkbE1lbVRva2VuXSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcywKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpZGxfbWVtb3J5IGNvbnN0JiBtKSB7CisgICAgICAgICAgICAgICAgICAgIHN1Y2Nlc3MgPSBzOworICAgICAgICAgICAgICAgICAgICBoaWRsTWVtVG9rZW4gPSBtOworICAgICAgICAgICAgICAgIH0pOworCisgICAgICAgIGlmICghdHJhbnNTdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gaGlkbCBhbGxvY2F0b3IgZmFpbGVkIGF0IHRoZSB0cmFuc3BvcnQ6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIHRyYW5zU3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzdWNjZXNzKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gaGlkbCBhbGxvY2F0b3IgZmFpbGVkIiwgbUVsZW1lbnRhcnlQSUQpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIG5ld01lbSA9IG1hcE1lbW9yeShoaWRsTWVtVG9rZW4pOworICAgICAgICBpZiAobmV3TWVtID09IG51bGxwdHIgfHwgbmV3TWVtLT5nZXRQb2ludGVyKCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIltzdHJlYW0gJWRdIGhpZGwgZmFpbGVkIHRvIG1hcCBtZW1vcnkiLCBtRWxlbWVudGFyeVBJRCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBuZXdTY3JhbWJsZWRCdWZmZXIgPSBuZXcgQUJ1ZmZlcihuZXdNZW0tPmdldFBvaW50ZXIoKSwgbmV3TWVtLT5nZXRTaXplKCkpOwogCiAgICAgICAgIGlmIChtRGVzY3JhbWJsZWRCdWZmZXIgIT0gTlVMTCkgewogICAgICAgICAgICAgbWVtY3B5KG5ld1NjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLApAQCAtODQ1LDI0ICsxMDIzLDE1IEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBuZXdTY3JhbWJsZWRCdWZmZXItPnNldFJhbmdlKDAsIDApOwogICAgICAgICB9Ci0gICAgICAgIG1NZW0gPSBuZXdNZW07Ci0gICAgICAgIG1EZWFsZXIgPSBuZXdEZWFsZXI7CisgICAgICAgIG1IaWRsTWVtb3J5ID0gbmV3TWVtOwogICAgICAgICBtRGVzY3JhbWJsZWRCdWZmZXIgPSBuZXdTY3JhbWJsZWRCdWZmZXI7CiAKLSAgICAgICAgc3NpemVfdCBvZmZzZXQ7Ci0gICAgICAgIHNpemVfdCBzaXplOwotICAgICAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IG5ld01lbS0+Z2V0TWVtb3J5KCZvZmZzZXQsICZzaXplKTsKLSAgICAgICAgaWYgKGhlYXAgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5oZWFwQmFzZSA9IGhpZGxNZW1Ub2tlbjsKKyAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLm9mZnNldCA9IDBVTEw7CisgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5zaXplID0gICh1aW50NjRfdCluZWVkZWRTaXplOwogCi0gICAgICAgIG1IaWRsTWVtb3J5ID0gZnJvbUhlYXAoaGVhcCk7Ci0gICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlci5oZWFwQmFzZSA9ICptSGlkbE1lbW9yeTsKLSAgICAgICAgbURlc2NyYW1ibGVyU3JjQnVmZmVyLm9mZnNldCA9ICh1aW50NjRfdCkgb2Zmc2V0OwotICAgICAgICBtRGVzY3JhbWJsZXJTcmNCdWZmZXIuc2l6ZSA9ICh1aW50NjRfdCkgc2l6ZTsKLQotICAgICAgICBBTE9HRCgiW3N0cmVhbSAlZF0gY3JlYXRlZCBzaGFyZWQgYnVmZmVyIGZvciBkZXNjcmFtYmxpbmcsIG9mZnNldCAlemQsIHNpemUgJXp1IiwKLSAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgb2Zmc2V0LCBzaXplKTsKKyAgICAgICAgQUxPR0QoIltzdHJlYW0gJWRdIGNyZWF0ZWQgc2hhcmVkIGJ1ZmZlciBmb3IgZGVzY3JhbWJsaW5nLCBzaXplICV6dSIsCisgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIG5lZWRlZFNpemUpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIEFsaWduIHRvIG11bHRpcGxlcyBvZiA2NEsuCiAgICAgICAgIG5lZWRlZFNpemUgPSAobmVlZGVkU2l6ZSArIDY1NTM1KSAmIH42NTUzNTsKQEAgLTk4Niw5ICsxMTU1LDEyIEBACiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9NUEVHMl9BVURJT19BRFRTOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfTFBDTV9BQzM6CiAgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9BQzM6CisgICAgICAgIGNhc2UgU1RSRUFNVFlQRV9FQUMzOgogICAgICAgICBjYXNlIFNUUkVBTVRZUEVfQUFDX0VOQ1JZUFRFRDoKICAgICAgICAgY2FzZSBTVFJFQU1UWVBFX0FDM19FTkNSWVBURUQ6CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgY2FzZSBTVFJFQU1UWVBFX1BFU19QUklWQVRFX0RBVEE6CisgICAgICAgICAgICByZXR1cm4gbVN0cmVhbVR5cGVFeHQgPT0gRVhUX0RFU0NSSVBUT1JfRFZCX0FDNDsKIAogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMTM0Nyw3ICsxNTE5LDcgQEAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgfQogCi0gICAgaWYgKG1EZXNjcmFtYmxlZEJ1ZmZlciA9PSBOVUxMIHx8IG1NZW0gPT0gTlVMTCkgeworICAgIGlmIChtRGVzY3JhbWJsZWRCdWZmZXIgPT0gTlVMTCB8fCBtSGlkbE1lbW9yeSA9PSBOVUxMKSB7CiAgICAgICAgIEFMT0dFKCJyZWNlaXZlZCBzY3JhbWJsZWQgcGFja2V0cyB3aXRob3V0IHNoYXJlZCBtZW1vcnkhIik7CiAKICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CkBAIC0xMzk1LDcgKzE1NjcsNyBAQAogICAgIC8vIFBlcmZvcm0gdGhlIDFzdCBwYXNzIGRlc2NyYW1ibGluZyBpZiBuZWVkZWQKICAgICBpZiAoZGVzY3JhbWJsZUJ5dGVzID4gMCkgewogICAgICAgICBtZW1jcHkobURlc2NyYW1ibGVkQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPmRhdGEoKSwgZGVzY3JhbWJsZUJ5dGVzKTsKLSAgICAgICAgbURlc2NyYW1ibGVkQnVmZmVyLT5zZXRSYW5nZSgwLCBkZXNjcmFtYmxlQnl0ZXMpOworICAgICAgICBtRGVzY3JhbWJsZWRCdWZmZXItPnNldFJhbmdlKDAsIG1CdWZmZXItPnNpemUoKSk7CiAKICAgICAgICAgaGlkbF92ZWM8U3ViU2FtcGxlPiBzdWJTYW1wbGVzOwogICAgICAgICBzdWJTYW1wbGVzLnJlc2l6ZShkZXNjcmFtYmxlU3ViU2FtcGxlcyk7CkBAIC0xNDEyLDEwICsxNTg0LDkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIHVpbnQ2NF90IHNyY09mZnNldCA9IDAsIGRzdE9mZnNldCA9IDA7Ci0gICAgICAgIC8vIElmIHNjcmFtYmxlZCBhdCBQRVMtbGV2ZWwsIFBFUyBoZWFkZXIgc2hvdWxkIGJlIHNraXBwZWQKKyAgICAgICAgLy8gSWYgc2NyYW1ibGVkIGF0IFBFUy1sZXZlbCwgUEVTIGhlYWRlciBpcyBpbiB0aGUgY2xlYXIKICAgICAgICAgaWYgKHBlc1NjcmFtYmxpbmdDb250cm9sICE9IDApIHsKLSAgICAgICAgICAgIHNyY09mZnNldCA9IGRzdE9mZnNldCA9IHBlc09mZnNldDsKKyAgICAgICAgICAgIHN1YlNhbXBsZXNbMF0ubnVtQnl0ZXNPZkNsZWFyRGF0YSA9IHBlc09mZnNldDsKICAgICAgICAgICAgIHN1YlNhbXBsZXNbMF0ubnVtQnl0ZXNPZkVuY3J5cHRlZERhdGEgLT0gcGVzT2Zmc2V0OwogICAgICAgICB9CiAKQEAgLTE0MzEsOSArMTYwMiw5IEBACiAgICAgICAgICAgICAgICAgKFNjcmFtYmxpbmdDb250cm9sKSBzY3RybCwKICAgICAgICAgICAgICAgICBzdWJTYW1wbGVzLAogICAgICAgICAgICAgICAgIG1EZXNjcmFtYmxlclNyY0J1ZmZlciwKLSAgICAgICAgICAgICAgICBzcmNPZmZzZXQsCisgICAgICAgICAgICAgICAgMCAvKnNyY09mZnNldCovLAogICAgICAgICAgICAgICAgIGRzdEJ1ZmZlciwKLSAgICAgICAgICAgICAgICBkc3RPZmZzZXQsCisgICAgICAgICAgICAgICAgMCAvKmRzdE9mZnNldCovLAogICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmYnl0ZXNXcml0dGVuLCAmZGV0YWlsZWRFcnJvcl0gKAogICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzIF9zdGF0dXMsIHVpbnQzMl90IF9ieXRlc1dyaXR0ZW4sCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgX2RldGFpbGVkRXJyb3IpIHsKQEAgLTE0NDIsMTcgKzE2MTMsMjkgQEAKICAgICAgICAgICAgICAgICAgICAgZGV0YWlsZWRFcnJvciA9IF9kZXRhaWxlZEVycm9yOwogICAgICAgICAgICAgICAgIH0pOwogCi0gICAgICAgIGlmICghcmV0dXJuVm9pZC5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCJbc3RyZWFtICVkXSBkZXNjcmFtYmxlIGZhaWxlZCwgdHJhbnM9JXMiLAotICAgICAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgcmV0dXJuVm9pZC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICBpZiAoIXJldHVyblZvaWQuaXNPaygpIHx8IHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICBBTE9HRSgiW3N0cmVhbSAlZF0gZGVzY3JhbWJsZSBmYWlsZWQsIHRyYW5zPSVzLCBzdGF0dXM9JWQiLAorICAgICAgICAgICAgICAgICAgICBtRWxlbWVudGFyeVBJRCwgcmV0dXJuVm9pZC5kZXNjcmlwdGlvbigpLmNfc3RyKCksIHN0YXR1cyk7CiAgICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKICAgICAgICAgfQogCiAgICAgICAgIEFMT0dWKCJbc3RyZWFtICVkXSBkZXNjcmFtYmxlIHN1Y2NlZWRlZCwgJWQgYnl0ZXMiLAogICAgICAgICAgICAgICAgIG1FbGVtZW50YXJ5UElELCBieXRlc1dyaXR0ZW4pOwotICAgICAgICBtZW1jcHkobUJ1ZmZlci0+ZGF0YSgpLCBtRGVzY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwgZGVzY3JhbWJsZUJ5dGVzKTsKKworICAgICAgICAvLyBTZXQgZGVzY3JhbWJsZUJ5dGVzIHRvIHRoZSByZXR1cm5lZCByZXN1bHQuCisgICAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIG1pZ2h0IGJlIHNtYWxsZXIgdGhhbiB0aGUgdG90YWwgbGVuZ3RoIG9mIGlucHV0IGRhdGEuCisgICAgICAgIC8vIChlZy4gd2hlbiB3ZSdyZSBkZXNjcmFtYmxpbmcgdGhlIFBFUyBoZWFkZXIgcG9ydGlvbiBvZiBhIHNlY3VyZSBzdHJlYW0sCisgICAgICAgIC8vIHRoZSBwbHVnaW4gbWlnaHQgY3V0IGl0IG9mZiByaWdodCBhZnRlciB0aGUgUEVTIGhlYWRlci4pCisgICAgICAgIGRlc2NyYW1ibGVCeXRlcyA9IGJ5dGVzV3JpdHRlbjsKICAgICB9CiAKKyAgICAvLyB8YnVmZmVyfCBwb2ludHMgdG8gdGhlIGJ1ZmZlciBmcm9tIHdoaWNoIHdlJ2QgcGFyc2UgdGhlIFBFUyBoZWFkZXIuCisgICAgLy8gV2hlbiB0aGUgb3V0cHV0IHN0cmVhbSBpcyBzY3JhbWJsZWQsIGl0IHBvaW50cyB0byBtRGVzY3JhbWJsZWRCdWZmZXIKKyAgICAvLyAodW5sZXNzIGFsbCBwYWNrZXRzIGluIHRoaXMgUEVTIGFyZSBhY3R1YWxseSBjbGVhciwgaW4gd2hpY2ggY2FzZSwKKyAgICAvLyBpdCBwb2ludHMgdG8gbUJ1ZmZlciBzaW5jZSB3ZSBuZXZlciBjb3BpZWQgaW50byBtRGVzY3JhbWJsZWRCdWZmZXIpLgorICAgIC8vIFdoZW4gdGhlIG91dHB1dCBzdHJlYW0gaXMgY2xlYXIsIGl0IHBvaW50cyB0byBtQnVmZmVyLCBhbmQgd2UnbGwKKyAgICAvLyBjb3B5IGFsbCBkZXNjcmFtYmxlZCBkYXRhIGJhY2sgdG8gbUJ1ZmZlci4KKyAgICBzcDxBQnVmZmVyPiBidWZmZXIgPSBtQnVmZmVyOwogICAgIGlmIChtUXVldWUtPmlzU2NyYW1ibGVkKCkpIHsKICAgICAgICAgLy8gUXVldWUgc3ViU2FtcGxlIGluZm8gZm9yIHNjcmFtYmxlZCBxdWV1ZQogICAgICAgICBzcDxBQnVmZmVyPiBjbGVhclNpemVzQnVmZmVyID0gbmV3IEFCdWZmZXIobVN1YlNhbXBsZXMuc2l6ZSgpICogNCk7CkBAIC0xNDY0LDggKzE2NDcsNyBAQAogICAgICAgICBmb3IgKGF1dG8gaXQgPSBtU3ViU2FtcGxlcy5iZWdpbigpOwogICAgICAgICAgICAgICAgIGl0ICE9IG1TdWJTYW1wbGVzLmVuZCgpOyBpdCsrLCBpKyspIHsKICAgICAgICAgICAgIGlmICgoaXQtPnRyYW5zcG9ydF9zY3JhbWJsaW5nX21vZGUgPT0gMAotICAgICAgICAgICAgICAgICAgICAmJiBwZXNTY3JhbWJsaW5nQ29udHJvbCA9PSAwKQotICAgICAgICAgICAgICAgICAgICB8fCBpIDwgZGVzY3JhbWJsZVN1YlNhbXBsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgJiYgcGVzU2NyYW1ibGluZ0NvbnRyb2wgPT0gMCkpIHsKICAgICAgICAgICAgICAgICBjbGVhclNpemVQdHJbaV0gPSBpdC0+c3ViU2FtcGxlU2l6ZTsKICAgICAgICAgICAgICAgICBlbmNTaXplUHRyW2ldID0gMDsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC0xNDc0LDE0ICsxNjU2LDI5IEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpc1N5bmMgfD0gaXQtPnJhbmRvbV9hY2Nlc3NfaW5kaWNhdG9yOwogICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgc2NyYW1ibGVkIGF0IFBFUy1sZXZlbCwgUEVTIGhlYWRlciBpcyBpbiB0aGUgY2xlYXIKKyAgICAgICAgaWYgKHBlc1NjcmFtYmxpbmdDb250cm9sICE9IDApIHsKKyAgICAgICAgICAgIGNsZWFyU2l6ZVB0clswXSA9IHBlc09mZnNldDsKKyAgICAgICAgICAgIGVuY1NpemVQdHJbMF0gLT0gcGVzT2Zmc2V0OworICAgICAgICB9CiAgICAgICAgIC8vIFBhc3MgdGhlIG9yaWdpbmFsIFRTIHN1YnNhbXBsZSBzaXplIG5vdy4gVGhlIFBFUyBoZWFkZXIgYWRqdXN0CiAgICAgICAgIC8vIHdpbGwgYmUgYXBwbGllZCB3aGVuIHRoZSBzY3JhbWJsZWQgQVUgaXMgZGVxdWV1ZWQuCisgICAgICAgIC8vIE5vdGUgdGhhdCBpZiBkZXNjcmFtYmxlQnl0ZXMgaXMgMCwgaXQgbWVhbnMgdGhpcyBQRVMgY29udGFpbnMgb25seQorICAgICAgICAvLyBhbGwgdHMgcGFja2V0cywgbGVhZGluZ0NsZWFyQnl0ZXMgaXMgZW50aXJlIGJ1ZmZlciBzaXplLgogICAgICAgICBtUXVldWUtPmFwcGVuZFNjcmFtYmxlZERhdGEoCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCksIHNjdHJsLAotICAgICAgICAgICAgICAgIGlzU3luYywgY2xlYXJTaXplc0J1ZmZlciwgZW5jU2l6ZXNCdWZmZXIpOworICAgICAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpLAorICAgICAgICAgICAgICAgIChkZXNjcmFtYmxlQnl0ZXMgPiAwKSA/IGRlc2NyYW1ibGVCeXRlcyA6IG1CdWZmZXItPnNpemUoKSwKKyAgICAgICAgICAgICAgICBzY3RybCwgaXNTeW5jLCBjbGVhclNpemVzQnVmZmVyLCBlbmNTaXplc0J1ZmZlcik7CisKKyAgICAgICAgaWYgKGRlc2NyYW1ibGVCeXRlcyA+IDApIHsKKyAgICAgICAgICAgIGJ1ZmZlciA9IG1EZXNjcmFtYmxlZEJ1ZmZlcjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShtQnVmZmVyLT5kYXRhKCksIG1EZXNjcmFtYmxlZEJ1ZmZlci0+ZGF0YSgpLCBkZXNjcmFtYmxlQnl0ZXMpOwogICAgIH0KIAotICAgIEFCaXRSZWFkZXIgYnIobUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOworICAgIEFCaXRSZWFkZXIgYnIoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKICAgICBzdGF0dXNfdCBlcnIgPSBwYXJzZVBFUygmYnIsIGV2ZW50KTsKIAogICAgIGlmIChlcnIgIT0gT0spIHsKQEAgLTE1MTQsNiArMTcxMSwxMyBAQAogICAgIHJldHVybiBlcnI7CiB9CiAKK3ZvaWQgQVRTUGFyc2VyOjpTdHJlYW06OmFkZEF1ZGlvUHJlc2VudGF0aW9ucyhjb25zdCBzcDxBQnVmZmVyPiAmYnVmZmVyKSB7CisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dFN0cmVhbShzdGQ6Omlvczo6b3V0KTsKKyAgICBzZXJpYWxpemVBdWRpb1ByZXNlbnRhdGlvbnMobUF1ZGlvUHJlc2VudGF0aW9ucywgJm91dFN0cmVhbSk7CisgICAgc3A8QUJ1ZmZlcj4gYXAgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkob3V0U3RyZWFtLnN0cigpLmRhdGEoKSwgb3V0U3RyZWFtLnN0cigpLnNpemUoKSk7CisgICAgYnVmZmVyLT5tZXRhKCktPnNldEJ1ZmZlcigiYXVkaW8tcHJlc2VudGF0aW9uLWluZm8iLCBhcCk7Cit9CisKIHZvaWQgQVRTUGFyc2VyOjpTdHJlYW06Om9uUGF5bG9hZERhdGEoCiAgICAgICAgIHVuc2lnbmVkIFBUU19EVFNfZmxhZ3MsIHVpbnQ2NF90IFBUUywgdWludDY0X3QgLyogRFRTICovLAogICAgICAgICB1bnNpZ25lZCBQRVNfc2NyYW1ibGluZ19jb250cm9sLApAQCAtMTU2NCw2ICsxNzY4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBtU291cmNlID0gbmV3IEFub3RoZXJQYWNrZXRTb3VyY2UobWV0YSk7CisgICAgICAgICAgICAgICAgaWYgKG1BdWRpb1ByZXNlbnRhdGlvbnMuc2l6ZSgpID4gMCkgeworICAgICAgICAgICAgICAgICAgICBhZGRBdWRpb1ByZXNlbnRhdGlvbnMoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnF1ZXVlQWNjZXNzVW5pdChhY2Nlc3NVbml0KTsKICAgICAgICAgICAgICAgICBBTE9HVigib25QYXlsb2FkRGF0YTogY3JlYXRlZCBBbm90aGVyUGFja2V0U291cmNlIFBJRCAweCUwOHggb2YgdHlwZSAweCUwMngiLAogICAgICAgICAgICAgICAgICAgICAgICAgbUVsZW1lbnRhcnlQSUQsIG1TdHJlYW1UeXBlKTsKQEAgLTE1NzYsNiArMTc4Myw5IEBACiAgICAgICAgICAgICBpZiAobVNvdXJjZS0+Z2V0Rm9ybWF0KCkgPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIG1Tb3VyY2UtPnNldEZvcm1hdChtUXVldWUtPmdldEZvcm1hdCgpKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtQXVkaW9QcmVzZW50YXRpb25zLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBhZGRBdWRpb1ByZXNlbnRhdGlvbnMoYWNjZXNzVW5pdCk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtU291cmNlLT5xdWV1ZUFjY2Vzc1VuaXQoYWNjZXNzVW5pdCk7CiAgICAgICAgIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQVRTUGFyc2VyLmgKaW5kZXggNDVjYTA2Yi4uMGZmMmQ3ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BVFNQYXJzZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FUU1BhcnNlci5oCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQXVkaW9QcmVzZW50YXRpb25JbmZvLmg+CiAjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CkBAIC0xNDIsNiArMTQzLDcgQEAKICAgICAgICAgU1RSRUFNVFlQRV9NUEVHMl9WSURFTyAgICAgICAgICA9IDB4MDIsCiAgICAgICAgIFNUUkVBTVRZUEVfTVBFRzFfQVVESU8gICAgICAgICAgPSAweDAzLAogICAgICAgICBTVFJFQU1UWVBFX01QRUcyX0FVRElPICAgICAgICAgID0gMHgwNCwKKyAgICAgICAgU1RSRUFNVFlQRV9QRVNfUFJJVkFURV9EQVRBICAgICA9IDB4MDYsCiAgICAgICAgIFNUUkVBTVRZUEVfTVBFRzJfQVVESU9fQURUUyAgICAgPSAweDBmLAogICAgICAgICBTVFJFQU1UWVBFX01QRUc0X1ZJREVPICAgICAgICAgID0gMHgxMCwKICAgICAgICAgU1RSRUFNVFlQRV9NRVRBREFUQSAgICAgICAgICAgICA9IDB4MTUsCkBAIC0xNTMsNiArMTU1LDcgQEAKICAgICAgICAgLy8gU3RyZWFtIHR5cGUgMHg4MyBpcyBub24tc3RhbmRhcmQsCiAgICAgICAgIC8vIGl0IGNvdWxkIGJlIExQQ00gb3IgVHJ1ZUhEIEFDMwogICAgICAgICBTVFJFQU1UWVBFX0xQQ01fQUMzICAgICAgICAgICAgID0gMHg4MywKKyAgICAgICAgU1RSRUFNVFlQRV9FQUMzICAgICAgICAgICAgICAgICA9IDB4ODcsCiAKICAgICAgICAgLy9TYW1wbGUgRW5jcnlwdGVkIHR5cGVzCiAgICAgICAgIFNUUkVBTVRZUEVfSDI2NF9FTkNSWVBURUQgICAgICAgPSAweERCLApAQCAtMTYwLDYgKzE2MywyMSBAQAogICAgICAgICBTVFJFQU1UWVBFX0FDM19FTkNSWVBURUQgICAgICAgID0gMHhDMSwKICAgICB9OwogCisgICAgZW51bSB7CisgICAgICAgIC8vIEZyb20gSVNPL0lFQyAxMzgxOC0xOiAyMDA3IChFKSwgVGFibGUgMi00NQorICAgICAgICBERVNDUklQVE9SX0NBICAgICAgICAgICAgICAgICAgID0gMHgwOSwKKworICAgICAgICAvLyBEVkIgQmx1ZUJvb2sgQTAzOCBUYWJsZSAxMgorICAgICAgICBERVNDUklQVE9SX0RWQl9FWFRFTlNJT04gICAgICAgID0gMHg3RiwKKyAgICB9OworCisgICAgLy8gRFZCIEJsdWVCb29rIEEwMzggVGFibGUgMTA5CisgICAgZW51bSB7CisgICAgICAgIEVYVF9ERVNDUklQVE9SX0RWQl9BQzQgICAgICAgICAgICAgICAgICA9IDB4MTUsCisgICAgICAgIEVYVF9ERVNDUklQVE9SX0RWQl9BVURJT19QUkVTRUxFQ1RJT04gICA9IDB4MTksCisgICAgICAgIEVYVF9ERVNDUklQVE9SX0RWQl9SRVNFUlZFRF9NQVggICAgICAgICA9IDB4N0YsCisgICAgfTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgfkFUU1BhcnNlcigpOwogCkBAIC0xNjksMTEgKzE4NywyMCBAQAogICAgIHN0cnVjdCBQU0lTZWN0aW9uOwogICAgIHN0cnVjdCBDYXNNYW5hZ2VyOwogICAgIHN0cnVjdCBDQURlc2NyaXB0b3IgewotICAgICAgICBpbnQzMl90IG1TeXN0ZW1JRDsKKyAgICAgICAgQ0FEZXNjcmlwdG9yKCkgOiBtUElEKDApLCBtU3lzdGVtSUQoLTEpIHt9CiAgICAgICAgIHVuc2lnbmVkIG1QSUQ7CisgICAgICAgIGludDMyX3QgbVN5c3RlbUlEOwogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBtUHJpdmF0ZURhdGE7CiAgICAgfTsKIAorICAgIHN0cnVjdCBTdHJlYW1JbmZvIHsKKyAgICAgICAgdW5zaWduZWQgbVR5cGU7CisgICAgICAgIHVuc2lnbmVkIG1UeXBlRXh0OworICAgICAgICB1bnNpZ25lZCBtUElEOworICAgICAgICBDQURlc2NyaXB0b3IgbUNBRGVzY3JpcHRvcjsKKyAgICAgICAgQXVkaW9QcmVzZW50YXRpb25Db2xsZWN0aW9uIG1BdWRpb1ByZXNlbnRhdGlvbnM7CisgICAgfTsKKwogICAgIHNwPENhc01hbmFnZXI+IG1DYXNNYW5hZ2VyOwogCiAgICAgdWludDMyX3QgbUZsYWdzOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9BbmRyb2lkLmJwCmluZGV4IGY5ZGNiYzkuLmNhYjg0MWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0FuZHJvaWQuYnAKQEAgLTI5LDEwICsyOSwxNiBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmNyeXB0byIsCi0gICAgICAgICJsaWJtZWRpYSIsCi0gICAgICAgICJsaWJoaWRsYWxsb2NhdG9ydXRpbHMiLAorICAgICAgICAibGliaGlkbG1lbW9yeSIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhcy5uYXRpdmVAMS4wIiwKICAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCisgICAgICAgICJtZWRpYV9uZGtfaGVhZGVycyIsCiAgICAgXSwKIAogICAgIHdob2xlX3N0YXRpY19saWJzOiBbCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9Bbm90aGVyUGFja2V0U291cmNlLmNwcAppbmRleCA2NmQ3ZGMxLi42MmUzYTRiIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0Fub3RoZXJQYWNrZXRTb3VyY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5jcHAKQEAgLTIyMyw5ICsyMjMsMTYgQEAKICAgICAgICAgICAgICAgICAgICAga0tleU1wZWdVc2VyRGF0YSwgMCwgbXBlZ1VzZXJEYXRhLT5kYXRhKCksIG1wZWdVc2VyRGF0YS0+c2l6ZSgpKTsKICAgICAgICAgfQogCisgICAgICAgIHNwPEFCdWZmZXI+IGFwOworICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRCdWZmZXIoImF1ZGlvLXByZXNlbnRhdGlvbi1pbmZvIiwgJmFwKSAmJiBhcCAhPSBOVUxMKSB7CisgICAgICAgICAgICBidWZtZXRhLnNldERhdGEoCisgICAgICAgICAgICAgICAgICAgIGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8sIDAsIGFwLT5kYXRhKCksIGFwLT5zaXplKCkpOworICAgICAgICB9CisKICAgICAgICAgaW50MzJfdCBjcnlwdG9Nb2RlOwogICAgICAgICBpZiAoYnVmZmVyLT5tZXRhKCktPmZpbmRJbnQzMigiY3J5cHRvTW9kZSIsICZjcnlwdG9Nb2RlKSkgewogICAgICAgICAgICAgaW50MzJfdCBjcnlwdG9LZXk7CisgICAgICAgICAgICBpbnQzMl90IHBlc09mZnNldDsKICAgICAgICAgICAgIHNwPEFCdWZmZXI+IGNsZWFyQnl0ZXNCdWZmZXIsIGVuY0J5dGVzQnVmZmVyOwogCiAgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJjcnlwdG9LZXkiLCAmY3J5cHRvS2V5KSk7CkBAIC0yMzMsNiArMjQwLDggQEAKICAgICAgICAgICAgICAgICAgICAgJiYgY2xlYXJCeXRlc0J1ZmZlciAhPSBOVUxMKTsKICAgICAgICAgICAgIENIRUNLKGJ1ZmZlci0+bWV0YSgpLT5maW5kQnVmZmVyKCJlbmNCeXRlcyIsICZlbmNCeXRlc0J1ZmZlcikKICAgICAgICAgICAgICAgICAgICAgJiYgZW5jQnl0ZXNCdWZmZXIgIT0gTlVMTCk7CisgICAgICAgICAgICBDSEVDSyhidWZmZXItPm1ldGEoKS0+ZmluZEludDMyKCJwZXNPZmZzZXQiLCAmcGVzT2Zmc2V0KQorICAgICAgICAgICAgICAgICAgICAmJiAocGVzT2Zmc2V0ID49IDApICYmIChwZXNPZmZzZXQgPCA2NTUzNikpOwogCiAgICAgICAgICAgICBidWZtZXRhLnNldEludDMyKGtLZXlDcnlwdG9Nb2RlLCBjcnlwdG9Nb2RlKTsKIApAQCAtMjQwLDYgKzI0OSwxMSBAQAogICAgICAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlDcnlwdG9JViwgMCwgYXJyYXksIDE2KTsKIAogICAgICAgICAgICAgYXJyYXlbMF0gPSAodWludDhfdCkgKGNyeXB0b0tleSAmIDB4ZmYpOworICAgICAgICAgICAgLy8gYXJyYXlbMV0gY29udGFpbnMgUEVTIGhlYWRlciBmbGFnLCB3aGljaCB3ZSBkb24ndCB1c2UuCisgICAgICAgICAgICAvLyBhcnJheVsyfjNdIGNvbnRhaW4gdGhlIFBFUyBvZmZzZXQuCisgICAgICAgICAgICBhcnJheVsyXSA9ICh1aW50OF90KSAocGVzT2Zmc2V0ICYgMHhmZik7CisgICAgICAgICAgICBhcnJheVszXSA9ICh1aW50OF90KSAoKHBlc09mZnNldCA+PiA4KSAmIDB4ZmYpOworCiAgICAgICAgICAgICBidWZtZXRhLnNldERhdGEoa0tleUNyeXB0b0tleSwgMCwgYXJyYXksIDE2KTsKIAogICAgICAgICAgICAgYnVmbWV0YS5zZXREYXRhKGtLZXlQbGFpblNpemVzLCAwLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvRVNRdWV1ZS5jcHAKaW5kZXggYzllNTE5Zi4uNWFmN2IyMyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuY3BwCkBAIC04Niw2ICs4NiwyMSBAQAogICAgIG1DYXNTZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CiB9CiAKK3N0YXRpYyBpbnQzMl90IHJlYWRWYXJpYWJsZUJpdHMoQUJpdFJlYWRlciAmYml0cywgaW50MzJfdCBuYml0cykgeworICAgIGludDMyX3QgdmFsdWUgPSAwOworICAgIGludDMyX3QgbW9yZV9iaXRzID0gMTsKKworICAgIHdoaWxlIChtb3JlX2JpdHMpIHsKKyAgICAgICAgdmFsdWUgKz0gYml0cy5nZXRCaXRzKG5iaXRzKTsKKyAgICAgICAgbW9yZV9iaXRzID0gYml0cy5nZXRCaXRzKDEpOworICAgICAgICBpZiAoIW1vcmVfYml0cykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB2YWx1ZSsrOworICAgICAgICB2YWx1ZSA8PD0gbmJpdHM7CisgICAgfQorICAgIHJldHVybiB2YWx1ZTsKK30KKwogLy8gUGFyc2UgQUMzIGhlYWRlciBhc3N1bWluZyB0aGUgY3VycmVudCBwdHIgaXMgc3RhcnQgcG9zaXRpb24gb2Ygc3luY2ZyYW1lLAogLy8gdXBkYXRlIG1ldGFkYXRhIG9ubHkgYXBwbGljYWJsZSwgYW5kIHJldHVybiB0aGUgcGF5bG9hZCBzaXplCiBzdGF0aWMgdW5zaWduZWQgcGFyc2VBQzNTeW5jRnJhbWUoCkBAIC0xOTUsOCArMjEwLDE1MyBAQAogICAgIHJldHVybiBwYXlsb2FkU2l6ZTsKIH0KIAotc3RhdGljIGJvb2wgSXNTZWVtaW5nbHlWYWxpZEFDM0hlYWRlcihjb25zdCB1aW50OF90ICpwdHIsIHNpemVfdCBzaXplKSB7Ci0gICAgcmV0dXJuIHBhcnNlQUMzU3luY0ZyYW1lKHB0ciwgc2l6ZSwgTlVMTCkgPiAwOworLy8gUGFyc2UgRUFDMyBoZWFkZXIgYXNzdW1pbmcgdGhlIGN1cnJlbnQgcHRyIGlzIHN0YXJ0IHBvc2l0aW9uIG9mIHN5bmNmcmFtZSwKKy8vIHVwZGF0ZSBtZXRhZGF0YSBvbmx5IGFwcGxpY2FibGUsIGFuZCByZXR1cm4gdGhlIHBheWxvYWQgc2l6ZQorLy8gQVRTQyBBLzUyOjIwMTIgRTIuMy4xCitzdGF0aWMgdW5zaWduZWQgcGFyc2VFQUMzU3luY0ZyYW1lKAorICAgIGNvbnN0IHVpbnQ4X3QgKnB0ciwgc2l6ZV90IHNpemUsIHNwPE1ldGFEYXRhPiAqbWV0YURhdGEpIHsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhbm5lbENvdW50VGFibGVbXSA9IHsyLCAxLCAyLCAzLCAzLCA0LCA0LCA1fTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxpbmdSYXRlVGFibGVbXSA9IHs0ODAwMCwgNDQxMDAsIDMyMDAwfTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2FtcGxpbmdSYXRlVGFibGUyW10gPSB7MjQwMDAsIDIyMDUwLCAxNjAwMH07CisKKyAgICBBQml0UmVhZGVyIGJpdHMocHRyLCBzaXplKTsKKyAgICBpZiAoYml0cy5udW1CaXRzTGVmdCgpIDwgMTYpIHsKKyAgICAgICAgQUxPR0UoIk5vdCBlbm91Z2ggYml0cyBsZWZ0IGZvciBmdXJ0aGVyIHBhcnNpbmciKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChiaXRzLmdldEJpdHMoMTYpICE9IDB4MEI3NykgeworICAgICAgICBBTE9HRSgiTm8gdmFsaWQgc3luYyB3b3JkIGluIEVBQzMgaGVhZGVyIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIHdlIHBhcnNlIHVwIHRvIGJzaWQgc28gdGhlcmUgbmVlZHMgdG8gYmUgYXQgbGVhc3QgdGhhdCBtYW55IGJpdHMKKyAgICBpZiAoYml0cy5udW1CaXRzTGVmdCgpIDwgMiArIDMgKyAxMSArIDIgKyAyICsgMyArIDEgKyA1KSB7CisgICAgICAgIEFMT0dFKCJOb3QgZW5vdWdoIGJpdHMgbGVmdCBmb3IgZnVydGhlciBwYXJzaW5nIik7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHVuc2lnbmVkIHN0cm10eXAgPSBiaXRzLmdldEJpdHMoMik7CisgICAgaWYgKHN0cm10eXAgPT0gMykgeworICAgICAgICBBTE9HRSgiSW5jb3JyZWN0IHN0cm10eXAgaW4gRUFDMyBoZWFkZXIiKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgdW5zaWduZWQgc3Vic3RyZWFtaWQgPSBiaXRzLmdldEJpdHMoMyk7CisgICAgLy8gb25seSB0aGUgZmlyc3QgaW5kZXBlbmRlbnQgc3RyZWFtIGlzIHN1cHBvcnRlZAorICAgIGlmICgoc3RybXR5cCA9PSAwIHx8IHN0cm10eXAgPT0gMikgJiYgc3Vic3RyZWFtaWQgIT0gMCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICB1bnNpZ25lZCBmcm1zaXogPSBiaXRzLmdldEJpdHMoMTEpOworICAgIHVuc2lnbmVkIGZzY29kID0gYml0cy5nZXRCaXRzKDIpOworCisgICAgdW5zaWduZWQgc2FtcGxpbmdSYXRlID0gMDsKKyAgICBpZiAoZnNjb2QgPT0gMHgzKSB7CisgICAgICAgIHVuc2lnbmVkIGZzY29kMiA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICAgICAgaWYgKGZzY29kMiA9PSAzKSB7CisgICAgICAgICAgICBBTE9HVygiSW5jb3JyZWN0IGZzY29kMiBpbiBFQUMzIGhlYWRlciIpOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgc2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlVGFibGUyW2ZzY29kMl07CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2FtcGxpbmdSYXRlID0gc2FtcGxpbmdSYXRlVGFibGVbZnNjb2RdOworICAgICAgICB1bnNpZ25lZCBudW1ibGtzY29kIF9fdW51c2VkID0gYml0cy5nZXRCaXRzKDIpOworICAgIH0KKworICAgIHVuc2lnbmVkIGFjbW9kID0gYml0cy5nZXRCaXRzKDMpOworICAgIHVuc2lnbmVkIGxmZW9uID0gYml0cy5nZXRCaXRzKDEpOworICAgIHVuc2lnbmVkIGJzaWQgPSBiaXRzLmdldEJpdHMoNSk7CisgICAgaWYgKGJzaWQgPCAxMSB8fCBic2lkID4gMTYpIHsKKyAgICAgICAgQUxPR1coIkluY29ycmVjdCBic2lkIGluIEVBQzMgaGVhZGVyLiBDb3VsZCBiZSBBQy0zIG9yIHNvbWUgdW5rbm93biBFQUMzIGZvcm1hdCIpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLyB3ZSBjdXJyZW50bHkgb25seSBzdXBwb3J0IHRoZSBmaXJzdCBpbmRlcGVuZGFudCBzdHJlYW0KKyAgICBpZiAobWV0YURhdGEgIT0gTlVMTCAmJiAoc3RybXR5cCA9PSAwIHx8IHN0cm10eXAgPT0gMikpIHsKKyAgICAgICAgdW5zaWduZWQgY2hhbm5lbENvdW50ID0gY2hhbm5lbENvdW50VGFibGVbYWNtb2RdICsgbGZlb247CisgICAgICAgIEFMT0dWKCJFQUMzIGNoYW5uZWxDb3VudCA9ICVkIiwgY2hhbm5lbENvdW50KTsKKyAgICAgICAgQUxPR1YoIkVBQzMgc2FtcGxpbmdSYXRlID0gJWQiLCBzYW1wbGluZ1JhdGUpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX0VBQzMpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0SW50MzIoa0tleUNoYW5uZWxDb3VudCwgY2hhbm5lbENvdW50KTsKKyAgICAgICAgKCptZXRhRGF0YSktPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGluZ1JhdGUpOworICAgICAgICAoKm1ldGFEYXRhKS0+c2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCAxKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBwYXlsb2FkU2l6ZSA9IGZybXNpeiArIDE7CisgICAgcGF5bG9hZFNpemUgPDw9IDE7ICAvLyBjb252ZXJ0IGZyb20gMTYtYml0IHdvcmRzIHRvIGJ5dGVzCisKKyAgICByZXR1cm4gcGF5bG9hZFNpemU7Cit9CisKKy8vIFBhcnNlIEFDNCBoZWFkZXIgYXNzdW1pbmcgdGhlIGN1cnJlbnQgcHRyIGlzIHN0YXJ0IHBvc2l0aW9uIG9mIHN5bmNmcmFtZQorLy8gYW5kIHVwZGF0ZSBmcmFtZVNpemUgYW5kIG1ldGFkYXRhLgorc3RhdGljIHN0YXR1c190IHBhcnNlQUM0U3luY0ZyYW1lKAorICAgICAgICBjb25zdCB1aW50OF90ICpwdHIsIHNpemVfdCBzaXplLCB1bnNpZ25lZCAmZnJhbWVTaXplLCBzcDxNZXRhRGF0YT4gKm1ldGFEYXRhKSB7CisgICAgLy8gRVRTSSBUUyAxMDMgMTkwLTIgVjEuMS4xICgyMDE1LTA5KSwgQW5uZXggQworICAgIC8vIFRoZSBzeW5jX3dvcmQgY2FuIGJlIGVpdGhlciAweEFDNDAgb3IgMHhBQzQxLgorICAgIHN0YXRpYyBjb25zdCBpbnQga1N5bmNXb3JkQUM0MCA9IDB4QUM0MDsKKyAgICBzdGF0aWMgY29uc3QgaW50IGtTeW5jV29yZEFDNDEgPSAweEFDNDE7CisKKyAgICBzaXplX3QgaGVhZGVyU2l6ZSA9IDA7CisgICAgQUJpdFJlYWRlciBiaXRzKHB0ciwgc2l6ZSk7CisgICAgaW50MzJfdCBzeW5jV29yZCA9IGJpdHMuZ2V0Qml0cygxNik7CisgICAgaWYgKChzeW5jV29yZCAhPSBrU3luY1dvcmRBQzQwKSAmJiAoc3luY1dvcmQgIT0ga1N5bmNXb3JkQUM0MSkpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgc3luY3dvcmQgaW4gQUM0IGhlYWRlciIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBoZWFkZXJTaXplICs9IDI7CisKKyAgICBmcmFtZVNpemUgPSBiaXRzLmdldEJpdHMoMTYpOworICAgIGhlYWRlclNpemUgKz0gMjsKKyAgICBpZiAoZnJhbWVTaXplID09IDB4RkZGRikgeworICAgICAgICBmcmFtZVNpemUgPSBiaXRzLmdldEJpdHMoMjQpOworICAgICAgICBoZWFkZXJTaXplICs9IDM7CisgICAgfQorCisgICAgaWYgKGZyYW1lU2l6ZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIGZyYW1lIHNpemUgaW4gQUM0IGhlYWRlciIpOworICAgICAgICByZXR1cm4gRVJST1JfTUFMRk9STUVEOworICAgIH0KKyAgICBmcmFtZVNpemUgKz0gaGVhZGVyU2l6ZTsKKyAgICAvLyBJZiB0aGUgc3luY193b3JkIGlzIDB4QUM0MSwgYSBjcmNfd29yZCBpcyBhbHNvIHRyYW5zbWl0dGVkLgorICAgIGlmIChzeW5jV29yZCA9PSBrU3luY1dvcmRBQzQxKSB7CisgICAgICAgIGZyYW1lU2l6ZSArPSAyOyAvLyBjcmNfd29yZAorICAgIH0KKyAgICBBTE9HVigiQUM0IGZyYW1lU2l6ZSA9ICV1IiwgZnJhbWVTaXplKTsKKworICAgIC8vIEVUU0kgVFMgMTAzIDE5MC0yIFYxLjEuMSA2LjIuMS4xCisgICAgdWludDMyX3QgYml0c3RyZWFtVmVyc2lvbiA9IGJpdHMuZ2V0Qml0cygyKTsKKyAgICBpZiAoYml0c3RyZWFtVmVyc2lvbiA9PSAzKSB7CisgICAgICAgIGJpdHN0cmVhbVZlcnNpb24gKz0gcmVhZFZhcmlhYmxlQml0cyhiaXRzLCAyKTsKKyAgICB9CisKKyAgICBiaXRzLnNraXBCaXRzKDEwKTsgLy8gU2VxdWVuY2UgQ291bnRlcgorCisgICAgdWludDMyX3QgYldhaXRGcmFtZXMgPSBiaXRzLmdldEJpdHMoMSk7CisgICAgaWYgKGJXYWl0RnJhbWVzKSB7CisgICAgICAgIHVpbnQzMl90IHdhaXRGcmFtZXMgPSBiaXRzLmdldEJpdHMoMyk7CisgICAgICAgIGlmICh3YWl0RnJhbWVzID4gMCkgeworICAgICAgICAgICAgYml0cy5za2lwQml0cygyKTsgLy8gYnJfY29kZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEVUU0kgVFMgMTAzIDE5MCBWMS4xLjEgVGFibGUgODIKKyAgICBib29sIGZzSW5kZXggPSBiaXRzLmdldEJpdHMoMSk7CisgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gZnNJbmRleCA/IDQ4MDAwIDogNDQxMDA7CisKKyAgICBpZiAobWV0YURhdGEgIT0gTlVMTCkgeworICAgICAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRBQzQgU2V0dGluZyBtRm9ybWF0Iik7CisgICAgICAgICgqbWV0YURhdGEpLT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fQUM0KTsKKyAgICAgICAgKCptZXRhRGF0YSktPnNldEludDMyKGtLZXlJc1N5bmNGcmFtZSwgMSk7CisgICAgICAgIC8vIFtGSVhNRV0gQUM0IGNoYW5uZWwgY291bnQgaXMgZGVmaW5lZCBwZXIgcHJlc2VudGF0aW9uLiBQcm92aWRlIGEgZGVmYXVsdCBjaGFubmVsIGNvdW50CisgICAgICAgIC8vIGFzIHN0ZXJlbyBmb3IgdGhlIGVudGlyZSBzdHJlYW0uCisgICAgICAgICgqbWV0YURhdGEpLT5zZXRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAyKTsKKyAgICAgICAgKCptZXRhRGF0YSktPnNldEludDMyKGtLZXlTYW1wbGVSYXRlLCBzYW1wbGluZ1JhdGUpOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXRpYyBzdGF0dXNfdCBJc1NlZW1pbmdseVZhbGlkQUM0SGVhZGVyKGNvbnN0IHVpbnQ4X3QgKnB0ciwgc2l6ZV90IHNpemUsIHVuc2lnbmVkICZmcmFtZVNpemUpIHsKKyAgICByZXR1cm4gcGFyc2VBQzRTeW5jRnJhbWUocHRyLCBzaXplLCBmcmFtZVNpemUsIE5VTEwpOwogfQogCiBzdGF0aWMgYm9vbCBJc1NlZW1pbmdseVZhbGlkQURUU0hlYWRlcigKQEAgLTI3OSw3ICs0MzksOCBAQAogICAgICAgICBBTE9HRSgiYXBwZW5kaW5nIGRhdGEgYWZ0ZXIgRU9TIik7CiAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgfQotICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgbUJ1ZmZlci0+c2l6ZSgpID09IDApIHsKKworICAgIGlmICghaXNTY3JhbWJsZWQoKSAmJiAobUJ1ZmZlciA9PSBOVUxMIHx8IG1CdWZmZXItPnNpemUoKSA9PSAwKSkgewogICAgICAgICBzd2l0Y2ggKG1Nb2RlKSB7CiAgICAgICAgICAgICBjYXNlIEgyNjQ6CiAgICAgICAgICAgICBjYXNlIE1QRUdfVklERU86CkBAIC0zOTAsMTIgKzU1MSwxOSBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBjYXNlIEFDMzoKKyAgICAgICAgICAgIGNhc2UgRUFDMzoKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICB1aW50OF90ICpwdHIgPSAodWludDhfdCAqKWRhdGE7CiAKICAgICAgICAgICAgICAgICBzc2l6ZV90IHN0YXJ0T2Zmc2V0ID0gLTE7CiAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKElzU2VlbWluZ2x5VmFsaWRBQzNIZWFkZXIoJnB0cltpXSwgc2l6ZSAtIGkpKSB7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHBheWxvYWRTaXplID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1Nb2RlID09IEFDMykgeworICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZFNpemUgPSBwYXJzZUFDM1N5bmNGcmFtZSgmcHRyW2ldLCBzaXplIC0gaSwgTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobU1vZGUgPT0gRUFDMykgeworICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZFNpemUgPSBwYXJzZUVBQzNTeW5jRnJhbWUoJnB0cltpXSwgc2l6ZSAtIGksIE5VTEwpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwYXlsb2FkU2l6ZSA+IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0ID0gaTsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC00MDYsNyArNTc0LDcgQEAKICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICBpZiAoc3RhcnRPZmZzZXQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBzb21ldGhpbmcgcmVzZW1ibGluZyBhbiBBQzMgc3luY3dvcmQgYXQgIgorICAgICAgICAgICAgICAgICAgICBBTE9HSSgiZm91bmQgc29tZXRoaW5nIHJlc2VtYmxpbmcgYW4gKEUpQUMzIHN5bmN3b3JkIGF0ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9mZnNldCAlemQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCk7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDE2LDYgKzU4NCw0MyBAQAogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICBjYXNlIEFDNDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpwdHIgPSAodWludDhfdCAqKWRhdGE7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgZnJhbWVTaXplID0gMDsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IHN0YXJ0T2Zmc2V0ID0gLTE7CisKKyAgICAgICAgICAgICAgICAvLyBBIHZhbGlkIEFDNCBzdHJlYW0gc2hvdWxkIGhhdmUgbWluaW11bSBvZiA3IGJ5dGVzIGluIGl0cyBidWZmZXIuCisgICAgICAgICAgICAgICAgLy8gKFN5bmMgaGVhZGVyIDQgYnl0ZXMgKyBBQzQgdG9jIDMgYnl0ZXMpCisgICAgICAgICAgICAgICAgaWYgKHNpemUgPCA3KSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChJc1NlZW1pbmdseVZhbGlkQUM0SGVhZGVyKCZwdHJbaV0sIHNpemUgLSBpLCBmcmFtZVNpemUpID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydE9mZnNldCA9IGk7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChzdGFydE9mZnNldCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoc3RhcnRPZmZzZXQgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBzb21ldGhpbmcgcmVzZW1ibGluZyBhbiBBQzQgc3luY3dvcmQgYXQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0ICV6ZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0T2Zmc2V0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGZyYW1lU2l6ZSAhPSBzaXplIC0gc3RhcnRPZmZzZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkFDNCBmcmFtZSBzaXplIGlzICV1IGJ5dGVzLCB3aGlsZSB0aGUgYnVmZmVyIHNpemUgaXMgJXpkIGJ5dGVzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lU2l6ZSwgc2l6ZSAtIHN0YXJ0T2Zmc2V0KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBkYXRhID0gJnB0cltzdGFydE9mZnNldF07CisgICAgICAgICAgICAgICAgc2l6ZSAtPSBzdGFydE9mZnNldDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgY2FzZSBNUEVHX0FVRElPOgogICAgICAgICAgICAgewogICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnB0ciA9ICh1aW50OF90ICopZGF0YTsKQEAgLTQ5NCw2ICs2OTksNyBAQAogCiB2b2lkIEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6YXBwZW5kU2NyYW1ibGVkRGF0YSgKICAgICAgICAgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUsCisgICAgICAgIHNpemVfdCBsZWFkaW5nQ2xlYXJCeXRlcywKICAgICAgICAgaW50MzJfdCBrZXlJZCwgYm9vbCBpc1N5bmMsCiAgICAgICAgIHNwPEFCdWZmZXI+IGNsZWFyU2l6ZXMsIHNwPEFCdWZmZXI+IGVuY1NpemVzKSB7CiAgICAgaWYgKCFpc1NjcmFtYmxlZCgpKSB7CkBAIC01MjEsNiArNzI3LDcgQEAKIAogICAgIFNjcmFtYmxlZFJhbmdlSW5mbyBzY3JhbWJsZWRJbmZvOwogICAgIHNjcmFtYmxlZEluZm8ubUxlbmd0aCA9IHNpemU7CisgICAgc2NyYW1ibGVkSW5mby5tTGVhZGluZ0NsZWFyQnl0ZXMgPSBsZWFkaW5nQ2xlYXJCeXRlczsKICAgICBzY3JhbWJsZWRJbmZvLm1LZXlJZCA9IGtleUlkOwogICAgIHNjcmFtYmxlZEluZm8ubUlzU3luYyA9IGlzU3luYzsKICAgICBzY3JhbWJsZWRJbmZvLm1DbGVhclNpemVzID0gY2xlYXJTaXplczsKQEAgLTUzMyw3ICs3NDAsNiBAQAogCiBzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVTY3JhbWJsZWRBY2Nlc3NVbml0KCkgewogICAgIHNpemVfdCBuZXh0U2NhbiA9IG1CdWZmZXItPnNpemUoKTsKLSAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKICAgICBpbnQzMl90IHBlc09mZnNldCA9IDAsIHBlc1NjcmFtYmxpbmdDb250cm9sID0gMDsKICAgICBpbnQ2NF90IHRpbWVVcyA9IGZldGNoVGltZXN0YW1wKG5leHRTY2FuLCAmcGVzT2Zmc2V0LCAmcGVzU2NyYW1ibGluZ0NvbnRyb2wpOwogICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKQEAgLTU0NCw2ICs3NTAsNyBAQAogICAgIC8vIHJldHVybiBzY3JhbWJsZWQgdW5pdAogICAgIGludDMyX3Qga2V5SWQgPSBwZXNTY3JhbWJsaW5nQ29udHJvbCwgaXNTeW5jID0gMCwgc2NyYW1ibGVkTGVuZ3RoID0gMDsKICAgICBzcDxBQnVmZmVyPiBjbGVhclNpemVzLCBlbmNTaXplczsKKyAgICBzaXplX3QgbGVhZGluZ0NsZWFyQnl0ZXM7CiAgICAgd2hpbGUgKG1TY3JhbWJsZWRSYW5nZUluZm9zLnNpemUoKSA+IG1SYW5nZUluZm9zLnNpemUoKSkgewogICAgICAgICBhdXRvIGl0ID0gbVNjcmFtYmxlZFJhbmdlSW5mb3MuYmVnaW4oKTsKICAgICAgICAgQUxPR1YoIltzdHJlYW0gJWRdIGZldGNoaW5nIHNjcmFtYmxlZCByYW5nZTogc2l6ZT0lenUiLCBtTW9kZSwgaXQtPm1MZW5ndGgpOwpAQCAtNTYxLDYgKzc2OCw3IEBACiAgICAgICAgIGNsZWFyU2l6ZXMgPSBpdC0+bUNsZWFyU2l6ZXM7CiAgICAgICAgIGVuY1NpemVzID0gaXQtPm1FbmNTaXplczsKICAgICAgICAgaXNTeW5jID0gaXQtPm1Jc1N5bmM7CisgICAgICAgIGxlYWRpbmdDbGVhckJ5dGVzID0gaXQtPm1MZWFkaW5nQ2xlYXJCeXRlczsKICAgICAgICAgbVNjcmFtYmxlZFJhbmdlSW5mb3MuZXJhc2UoaXQpOwogICAgIH0KICAgICBpZiAoc2NyYW1ibGVkTGVuZ3RoID09IDApIHsKQEAgLTU2OCwyNiArNzc2LDc0IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIC8vIHNraXAgdGhlIFBFUyBoZWFkZXIsIGFuZCBjb3B5IHRoZSByZXN0IGludG8gc2NyYW1ibGVkIGFjY2VzcyB1bml0Ci0gICAgc3A8QUJ1ZmZlcj4gc2NyYW1ibGVkQWNjZXNzVW5pdCA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgKLSAgICAgICAgICAgIG1TY3JhbWJsZWRCdWZmZXItPmRhdGEoKSArIHBlc09mZnNldCwKLSAgICAgICAgICAgIHNjcmFtYmxlZExlbmd0aCAtIHBlc09mZnNldCk7Ci0KLSAgICAvLyBmaXggdXAgZmlyc3Qgc2FtcGxlIHNpemUgYWZ0ZXIgc2tpcHBpbmcgdGhlIFBFUyBoZWFkZXIKLSAgICBpZiAocGVzT2Zmc2V0ID4gMCkgewotICAgICAgICBpbnQzMl90ICZmaXJzdENsZWFyU2l6ZSA9ICooaW50MzJfdCopY2xlYXJTaXplcy0+ZGF0YSgpOwotICAgICAgICBpbnQzMl90ICZmaXJzdEVuY1NpemUgPSAqKGludDMyX3QqKWVuY1NpemVzLT5kYXRhKCk7Ci0gICAgICAgIC8vIEN1dCBhd2F5IHRoZSBQRVMgaGVhZGVyCi0gICAgICAgIGlmIChmaXJzdENsZWFyU2l6ZSA+PSBwZXNPZmZzZXQpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgaXMgZm9yIFRTLWxldmVsIHNjcmFtYmxpbmcsIHdlIGRlc2NyYW1ibGVkIHRoZSBmaXJzdAotICAgICAgICAgICAgLy8gKG9yIGl0IHdhcyBjbGVhciB0byBiZWdpbiB3aXRoKQotICAgICAgICAgICAgZmlyc3RDbGVhclNpemUgLT0gcGVzT2Zmc2V0OwotICAgICAgICB9IGVsc2UgaWYgKGZpcnN0RW5jU2l6ZSA+PSBwZXNPZmZzZXQpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgY2FuIG9ubHkgYmUgUEVTLWxldmVsIHNjcmFtYmxpbmcKLSAgICAgICAgICAgIGZpcnN0RW5jU2l6ZSAtPSBwZXNPZmZzZXQ7Ci0gICAgICAgIH0KKyAgICAvLyBSZXRyaWV2ZSB0aGUgbGVhZGluZyBjbGVhciBieXRlcyBpbmZvLCBhbmQgdXNlIGl0IHRvIHNldCB0aGUgY2xlYXIKKyAgICAvLyByYW5nZSBvbiBtQnVmZmVyLiBOb3RlIHRoYXQgdGhlIGxlYWRpbmcgY2xlYXIgYnl0ZXMgaW5jbHVkZXMgdGhlCisgICAgLy8gUEVTIGhlYWRlciBwb3J0aW9uLCB3aGlsZSBtQnVmZmVyIGRvZXNuJ3QuCisgICAgaWYgKChpbnQzMl90KWxlYWRpbmdDbGVhckJ5dGVzID4gcGVzT2Zmc2V0KSB7CisgICAgICAgIG1CdWZmZXItPnNldFJhbmdlKDAsIGxlYWRpbmdDbGVhckJ5dGVzIC0gcGVzT2Zmc2V0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKICAgICB9CiAKKyAgICAvLyBUcnkgdG8gcGFyc2UgZm9ybWF0cywgYW5kIGlmIHVuYXZhaWxhYmxlIHNldCB1cCBhIGR1bW15IGZvcm1hdC4KKyAgICAvLyBPbmx5IHN1cHBvcnQgdGhlIGZvbGxvd2luZyBtb2RlcyBmb3Igc2NyYW1ibGVkIGNvbnRlbnQgZm9yIG5vdy4KKyAgICAvLyAod2lsbCBiZSBleHBhbmRlZCBsYXRlcikuCisgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgeworICAgICAgICBtRm9ybWF0ID0gbmV3IE1ldGFEYXRhOworICAgICAgICBzd2l0Y2ggKG1Nb2RlKSB7CisgICAgICAgICAgICBjYXNlIEgyNjQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCFNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAqbUZvcm1hdCwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJDcmVhdGluZyBkdW1teSBBVkMgZm9ybWF0IGZvciBzY3JhbWJsZWQgY29udGVudCIpOworCisgICAgICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldENTdHJpbmcoa0tleU1JTUVUeXBlLCBNRURJQV9NSU1FVFlQRV9WSURFT19BVkMpOworICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5V2lkdGgsIDEyODApOworICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SGVpZ2h0LCA3MjApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgQUFDOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGlmICghTWFrZUFBQ0NvZGVjU3BlY2lmaWNEYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgKm1Gb3JtYXQsIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiQ3JlYXRpbmcgZHVtbXkgQUFDIGZvcm1hdCBmb3Igc2NyYW1ibGVkIGNvbnRlbnQiKTsKKworICAgICAgICAgICAgICAgICAgICBNYWtlQUFDQ29kZWNTcGVjaWZpY0RhdGEoKm1Gb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSAvKnByb2ZpbGUqLywgNyAvKnNhbXBsaW5nX2ZyZXFfaW5kZXgqLywgMSAvKmNoYW5uZWxfY29uZmlnKi8pOworICAgICAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SXNBRFRTLCB0cnVlKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNhc2UgTVBFR19WSURFTzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiQ3JlYXRpbmcgZHVtbXkgTVBFRyBmb3JtYXQgZm9yIHNjcmFtYmxlZCBjb250ZW50Iik7CisKKyAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpOworICAgICAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlXaWR0aCwgMTI4MCk7CisgICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUhlaWdodCwgNzIwKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQUxPR0UoIlVua25vd24gbW9kZSBmb3Igc2NyYW1ibGVkIGNvbnRlbnQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGZvciBNZWRpYUV4dHJhY3Rvci5DYXNJbmZvCisgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlDQVN5c3RlbUlELCBtQ0FTeXN0ZW1JZCk7CisgICAgICAgIG1Gb3JtYXQtPnNldERhdGEoa0tleUNBU2Vzc2lvbklELAorICAgICAgICAgICAgICAgIDAsIG1DYXNTZXNzaW9uSWQuZGF0YSgpLCBtQ2FzU2Vzc2lvbklkLnNpemUoKSk7CisgICAgfQorCisgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgMCk7CisKKyAgICAvLyBjb3B5IGludG8gc2NyYW1ibGVkIGFjY2VzcyB1bml0CisgICAgc3A8QUJ1ZmZlcj4gc2NyYW1ibGVkQWNjZXNzVW5pdCA9IEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgKKyAgICAgICAgICAgIG1TY3JhbWJsZWRCdWZmZXItPmRhdGEoKSwgc2NyYW1ibGVkTGVuZ3RoKTsKKwogICAgIHNjcmFtYmxlZEFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CiAgICAgaWYgKGlzU3luYykgewogICAgICAgICBzY3JhbWJsZWRBY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJpc1N5bmMiLCAxKTsKQEAgLTYwMCw2ICs4NTYsNyBAQAogICAgIHNjcmFtYmxlZEFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImNyeXB0b0tleSIsIGtleUlkKTsKICAgICBzY3JhbWJsZWRBY2Nlc3NVbml0LT5tZXRhKCktPnNldEJ1ZmZlcigiY2xlYXJCeXRlcyIsIGNsZWFyU2l6ZXMpOwogICAgIHNjcmFtYmxlZEFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0QnVmZmVyKCJlbmNCeXRlcyIsIGVuY1NpemVzKTsKKyAgICBzY3JhbWJsZWRBY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDMyKCJwZXNPZmZzZXQiLCBwZXNPZmZzZXQpOwogCiAgICAgbWVtbW92ZShtU2NyYW1ibGVkQnVmZmVyLT5kYXRhKCksCiAgICAgICAgICAgICBtU2NyYW1ibGVkQnVmZmVyLT5kYXRhKCkgKyBzY3JhbWJsZWRMZW5ndGgsCkBAIC02MTQsNyArODcxLDExIEBACiB9CiAKIHNwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXQoKSB7Ci0gICAgaWYgKChtRmxhZ3MgJiBrRmxhZ19BbGlnbmVkRGF0YSkgJiYgbU1vZGUgPT0gSDI2NCAmJiAhaXNTY3JhbWJsZWQoKSkgeworICAgIGlmIChpc1NjcmFtYmxlZCgpKSB7CisgICAgICAgIHJldHVybiBkZXF1ZXVlU2NyYW1ibGVkQWNjZXNzVW5pdCgpOworICAgIH0KKworICAgIGlmICgobUZsYWdzICYga0ZsYWdfQWxpZ25lZERhdGEpICYmIG1Nb2RlID09IEgyNjQpIHsKICAgICAgICAgaWYgKG1SYW5nZUluZm9zLmVtcHR5KCkpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICB9CkBAIC02NDgsNyArOTA5LDEwIEBACiAgICAgICAgIGNhc2UgQUFDOgogICAgICAgICAgICAgcmV0dXJuIGRlcXVldWVBY2Nlc3NVbml0QUFDKCk7CiAgICAgICAgIGNhc2UgQUMzOgotICAgICAgICAgICAgcmV0dXJuIGRlcXVldWVBY2Nlc3NVbml0QUMzKCk7CisgICAgICAgIGNhc2UgRUFDMzoKKyAgICAgICAgICAgIHJldHVybiBkZXF1ZXVlQWNjZXNzVW5pdEVBQzMoKTsKKyAgICAgICAgY2FzZSBBQzQ6CisgICAgICAgICAgICByZXR1cm4gZGVxdWV1ZUFjY2Vzc1VuaXRBQzQoKTsKICAgICAgICAgY2FzZSBNUEVHX1ZJREVPOgogICAgICAgICAgICAgcmV0dXJuIGRlcXVldWVBY2Nlc3NVbml0TVBFR1ZpZGVvKCk7CiAgICAgICAgIGNhc2UgTVBFRzRfVklERU86CkBAIC02NjYsMzQgKzkzMCwzOCBAQAogICAgIH0KIH0KIAotc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdEFDMygpIHsKK3NwPEFCdWZmZXI+IEVsZW1lbnRhcnlTdHJlYW1RdWV1ZTo6ZGVxdWV1ZUFjY2Vzc1VuaXRFQUMzKCkgewogICAgIHVuc2lnbmVkIHN5bmNTdGFydFBvcyA9IDA7ICAvLyBpbiBieXRlcwogICAgIHVuc2lnbmVkIHBheWxvYWRTaXplID0gMDsKICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gbmV3IE1ldGFEYXRhOwogCi0gICAgQUxPR1YoImRlcXVldWVBY2Nlc3NVbml0X0FDM1slZF06IG1CdWZmZXIgJXAoJXp1KSIsIG1BVUluZGV4LCBtQnVmZmVyLT5kYXRhKCksIG1CdWZmZXItPnNpemUoKSk7CisgICAgQUxPR1YoImRlcXVldWVBY2Nlc3NVbml0RUFDM1slZF06IG1CdWZmZXIgJXAoJXp1KSIsIG1BVUluZGV4LAorICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOwogCiAgICAgd2hpbGUgKHRydWUpIHsKICAgICAgICAgaWYgKHN5bmNTdGFydFBvcyArIDIgPj0gbUJ1ZmZlci0+c2l6ZSgpKSB7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQogCi0gICAgICAgIHBheWxvYWRTaXplID0gcGFyc2VBQzNTeW5jRnJhbWUoCi0gICAgICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpICsgc3luY1N0YXJ0UG9zLAotICAgICAgICAgICAgICAgIG1CdWZmZXItPnNpemUoKSAtIHN5bmNTdGFydFBvcywKLSAgICAgICAgICAgICAgICAmZm9ybWF0KTsKKyAgICAgICAgdWludDhfdCAqcHRyID0gbUJ1ZmZlci0+ZGF0YSgpICsgc3luY1N0YXJ0UG9zOworICAgICAgICBzaXplX3Qgc2l6ZSA9IG1CdWZmZXItPnNpemUoKSAtIHN5bmNTdGFydFBvczsKKyAgICAgICAgaWYgKG1Nb2RlID09IEFDMykgeworICAgICAgICAgICAgcGF5bG9hZFNpemUgPSBwYXJzZUFDM1N5bmNGcmFtZShwdHIsIHNpemUsICZmb3JtYXQpOworICAgICAgICB9IGVsc2UgaWYgKG1Nb2RlID09IEVBQzMpIHsKKyAgICAgICAgICAgIHBheWxvYWRTaXplID0gcGFyc2VFQUMzU3luY0ZyYW1lKHB0ciwgc2l6ZSwgJmZvcm1hdCk7CisgICAgICAgIH0KICAgICAgICAgaWYgKHBheWxvYWRTaXplID4gMCkgewogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAotICAgICAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRfQUMzWyVkXTogc3luY1N0YXJ0UG9zICV1IHBheWxvYWRTaXplICV1IiwKKyAgICAgICAgQUxPR1YoImRlcXVldWVBY2Nlc3NVbml0RUFDM1slZF06IHN5bmNTdGFydFBvcyAldSBwYXlsb2FkU2l6ZSAldSIsCiAgICAgICAgICAgICAgICAgbUFVSW5kZXgsIHN5bmNTdGFydFBvcywgcGF5bG9hZFNpemUpOwogCiAgICAgICAgICsrc3luY1N0YXJ0UG9zOwogICAgIH0KIAogICAgIGlmIChtQnVmZmVyLT5zaXplKCkgPCBzeW5jU3RhcnRQb3MgKyBwYXlsb2FkU2l6ZSkgewotICAgICAgICBBTE9HVigiTm90IGVub3VnaCBidWZmZXIgc2l6ZSBmb3IgQUMzIik7CisgICAgICAgIEFMT0dWKCJOb3QgZW5vdWdoIGJ1ZmZlciBzaXplIGZvciBFL0FDMyIpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKQEAgLTcwMSw3ICs5NjksNiBAQAogICAgICAgICBtRm9ybWF0ID0gZm9ybWF0OwogICAgIH0KIAotCiAgICAgaW50NjRfdCB0aW1lVXMgPSBmZXRjaFRpbWVzdGFtcChzeW5jU3RhcnRQb3MgKyBwYXlsb2FkU2l6ZSk7CiAgICAgaWYgKHRpbWVVcyA8IDBsbCkgewogICAgICAgICBBTE9HRSgibmVnYXRpdmUgdGltZVVzIik7CkBAIC03MTAsNyArOTc3LDEyIEBACiAKICAgICAvLyBOb3QgZGVjcnlwdGluZyBpZiBrZXkgaW5mbyBub3QgYXZhaWxhYmxlIChlLmcuLCBzY2FubmVyL2V4dHJhY3RvciBwYXJzaW5nIHRzIGZpbGVzKQogICAgIGlmIChtU2FtcGxlRGVjcnlwdG9yICE9IE5VTEwpIHsKLSAgICAgICAgbVNhbXBsZURlY3J5cHRvci0+cHJvY2Vzc0FDMyhtQnVmZmVyLT5kYXRhKCkgKyBzeW5jU3RhcnRQb3MsIHBheWxvYWRTaXplKTsKKyAgICAgICAgaWYgKG1Nb2RlID09IEFDMykgeworICAgICAgICAgICAgbVNhbXBsZURlY3J5cHRvci0+cHJvY2Vzc0FDMyhtQnVmZmVyLT5kYXRhKCkgKyBzeW5jU3RhcnRQb3MsIHBheWxvYWRTaXplKTsKKyAgICAgICAgfSBlbHNlIGlmIChtTW9kZSA9PSBFQUMzKSB7CisgICAgICAgICAgICBBTE9HRSgiRUFDMyBBVSBpcyBlbmNyeXB0ZWQgYW5kIGRlY3J5cHRpb24gaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KICAgICB9CiAgICAgbUFVSW5kZXgrKzsKIApAQCAtNzMwLDYgKzEwMDIsNjkgQEAKICAgICByZXR1cm4gYWNjZXNzVW5pdDsKIH0KIAorc3A8QUJ1ZmZlcj4gRWxlbWVudGFyeVN0cmVhbVF1ZXVlOjpkZXF1ZXVlQWNjZXNzVW5pdEFDNCgpIHsKKyAgICB1bnNpZ25lZCBzeW5jU3RhcnRQb3MgPSAwOworICAgIHVuc2lnbmVkIHBheWxvYWRTaXplID0gMDsKKyAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gbmV3IE1ldGFEYXRhOworICAgIEFMT0dWKCJkZXF1ZXVlQWNjZXNzVW5pdF9BQzRbJWRdOiBtQnVmZmVyICVwKCV6dSkiLCBtQVVJbmRleCwgbUJ1ZmZlci0+ZGF0YSgpLCBtQnVmZmVyLT5zaXplKCkpOworCisgICAgLy8gQSB2YWxpZCBBQzQgc3RyZWFtIHNob3VsZCBoYXZlIG1pbmltdW0gb2YgNyBieXRlcyBpbiBpdHMgYnVmZmVyLgorICAgIC8vIChTeW5jIGhlYWRlciA0IGJ5dGVzICsgQUM0IHRvYyAzIGJ5dGVzKQorICAgIGlmIChtQnVmZmVyLT5zaXplKCkgPCA3KSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGlmIChzeW5jU3RhcnRQb3MgKyAyID49IG1CdWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXJzZUFDNFN5bmNGcmFtZSgKKyAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlci0+ZGF0YSgpICsgc3luY1N0YXJ0UG9zLAorICAgICAgICAgICAgICAgICAgICBtQnVmZmVyLT5zaXplKCkgLSBzeW5jU3RhcnRQb3MsCisgICAgICAgICAgICAgICAgICAgIHBheWxvYWRTaXplLAorICAgICAgICAgICAgICAgICAgICAmZm9ybWF0KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBBTE9HVigiZGVxdWV1ZUFjY2Vzc1VuaXRfQUM0WyVkXTogc3luY1N0YXJ0UG9zICV1IHBheWxvYWRTaXplICV1IiwKKyAgICAgICAgICAgICAgICBtQVVJbmRleCwgc3luY1N0YXJ0UG9zLCBwYXlsb2FkU2l6ZSk7CisKKyAgICAgICAgKytzeW5jU3RhcnRQb3M7CisgICAgfQorCisgICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplKSB7CisgICAgICAgIEFMT0dWKCJOb3QgZW5vdWdoIGJ1ZmZlciBzaXplIGZvciBBQzQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgaWYgKG1Gb3JtYXQgPT0gTlVMTCkgeworICAgICAgICBtRm9ybWF0ID0gZm9ybWF0OworICAgIH0KKworICAgIGludDY0X3QgdGltZVVzID0gZmV0Y2hUaW1lc3RhbXAoc3luY1N0YXJ0UG9zICsgcGF5bG9hZFNpemUpOworICAgIGlmICh0aW1lVXMgPCAwbGwpIHsKKyAgICAgICAgQUxPR0UoIm5lZ2F0aXZlIHRpbWVVcyIpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgbUFVSW5kZXgrKzsKKworICAgIHNwPEFCdWZmZXI+IGFjY2Vzc1VuaXQgPSBuZXcgQUJ1ZmZlcihzeW5jU3RhcnRQb3MgKyBwYXlsb2FkU2l6ZSk7CisgICAgbWVtY3B5KGFjY2Vzc1VuaXQtPmRhdGEoKSwgbUJ1ZmZlci0+ZGF0YSgpLCBzeW5jU3RhcnRQb3MgKyBwYXlsb2FkU2l6ZSk7CisKKyAgICBhY2Nlc3NVbml0LT5tZXRhKCktPnNldEludDY0KCJ0aW1lVXMiLCB0aW1lVXMpOworICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50MzIoImlzU3luYyIsIDEpOworCisgICAgbWVtbW92ZSgKKyAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSwKKyAgICAgICAgICAgIG1CdWZmZXItPmRhdGEoKSArIHN5bmNTdGFydFBvcyArIHBheWxvYWRTaXplLAorICAgICAgICAgICAgbUJ1ZmZlci0+c2l6ZSgpIC0gc3luY1N0YXJ0UG9zIC0gcGF5bG9hZFNpemUpOworCisgICAgbUJ1ZmZlci0+c2V0UmFuZ2UoMCwgbUJ1ZmZlci0+c2l6ZSgpIC0gc3luY1N0YXJ0UG9zIC0gcGF5bG9hZFNpemUpOworICAgIHJldHVybiBhY2Nlc3NVbml0OworfQorCiBzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0UENNQXVkaW8oKSB7CiAgICAgaWYgKG1CdWZmZXItPnNpemUoKSA8IDQpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC04NTEsMjUgKzExODYsMTEgQEAKICAgICAgICAgYm9vbCBwcm90ZWN0aW9uX2Fic2VudCA9IGJpdHMuZ2V0Qml0cygxKSAhPSAwOwogCiAgICAgICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHVuc2lnbmVkIHByb2ZpbGUgPSBiaXRzLmdldEJpdHMoMik7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZSA9PSAzdSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJwcm9maWxlIHNob3VsZCBub3QgYmUgMyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdW5zaWduZWQgc2FtcGxpbmdfZnJlcV9pbmRleCA9IGJpdHMuZ2V0Qml0cyg0KTsKLSAgICAgICAgICAgIGJpdHMuZ2V0Qml0cygxKTsgIC8vIHByaXZhdGVfYml0Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFubmVsX2NvbmZpZ3VyYXRpb24gPSBiaXRzLmdldEJpdHMoMyk7Ci0gICAgICAgICAgICBpZiAoY2hhbm5lbF9jb25maWd1cmF0aW9uID09IDB1KSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImNoYW5uZWxfY29uZmlnIHNob3VsZCBub3QgYmUgMCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYml0cy5za2lwQml0cygyKTsgIC8vIG9yaWdpbmFsX2NvcHksIGhvbWUKLQogICAgICAgICAgICAgbUZvcm1hdCA9IG5ldyBNZXRhRGF0YTsKLSAgICAgICAgICAgIE1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgqbUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSwgc2FtcGxpbmdfZnJlcV9pbmRleCwgY2hhbm5lbF9jb25maWd1cmF0aW9uKTsKLQotICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleUlzQURUUywgdHJ1ZSk7CisgICAgICAgICAgICBpZiAoIU1ha2VBQUNDb2RlY1NwZWNpZmljRGF0YSgKKyAgICAgICAgICAgICAgICAgICAgKm1Gb3JtYXQsIG1CdWZmZXItPmRhdGEoKSArIG9mZnNldCwgbUJ1ZmZlci0+c2l6ZSgpIC0gb2Zmc2V0KSkgeworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBpbnQzMl90IHNhbXBsZVJhdGU7CiAgICAgICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzOwpAQCAtODg0LDEyICsxMjA1LDEyIEBACiAKICAgICAgICAgICAgIEFMT0dJKCJmb3VuZCBBQUMgY29kZWMgY29uZmlnICglZCBIeiwgJWQgY2hhbm5lbHMpIiwKICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgbnVtQ2hhbm5lbHMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gcHJvZmlsZV9PYmplY3RUeXBlLCBzYW1wbGluZ19mcmVxdWVuY3lfaW5kZXgsIHByaXZhdGVfYml0cywKLSAgICAgICAgICAgIC8vIGNoYW5uZWxfY29uZmlndXJhdGlvbiwgb3JpZ2luYWxfY29weSwgaG9tZQotICAgICAgICAgICAgYml0cy5za2lwQml0cygxMik7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBwcm9maWxlX09iamVjdFR5cGUsIHNhbXBsaW5nX2ZyZXF1ZW5jeV9pbmRleCwgcHJpdmF0ZV9iaXRzLAorICAgICAgICAvLyBjaGFubmVsX2NvbmZpZ3VyYXRpb24sIG9yaWdpbmFsX2NvcHksIGhvbWUKKyAgICAgICAgYml0cy5za2lwQml0cygxMik7CisKICAgICAgICAgLy8gYWR0c192YXJpYWJsZV9oZWFkZXIKIAogICAgICAgICAvLyBjb3B5cmlnaHRfaWRlbnRpZmljYXRpb25fYml0LCBjb3B5cmlnaHRfaWRlbnRpZmljYXRpb25fc3RhcnQKQEAgLTEwMDQsMjcgKzEzMjUsNiBAQAogfQogCiBzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0SDI2NCgpIHsKLSAgICBpZiAoaXNTY3JhbWJsZWQoKSkgewotICAgICAgICBpZiAobUJ1ZmZlciA9PSBOVUxMIHx8IG1CdWZmZXItPnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgICAgfQotICAgICAgICBpZiAobUZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBtRm9ybWF0ID0gbmV3IE1ldGFEYXRhOwotICAgICAgICAgICAgaWYgKCFNYWtlQVZDQ29kZWNTcGVjaWZpY0RhdGEoKm1Gb3JtYXQsIG1CdWZmZXItPmRhdGEoKSwgbUJ1ZmZlci0+c2l6ZSgpKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJDcmVhdGluZyBkdW1teSBBVkMgZm9ybWF0IGZvciBzY3JhbWJsZWQgY29udGVudCIpOwotICAgICAgICAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0Q1N0cmluZyhrS2V5TUlNRVR5cGUsIE1FRElBX01JTUVUWVBFX1ZJREVPX0FWQyk7Ci0gICAgICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCAxMjgwKTsKLSAgICAgICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5SGVpZ2h0LCA3MjApOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gZm9yIE1lZGlhRXh0cmFjdG9yLkNhc0luZm8KLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlDQVN5c3RlbUlELCBtQ0FTeXN0ZW1JZCk7Ci0gICAgICAgICAgICBtRm9ybWF0LT5zZXREYXRhKGtLZXlDQVNlc3Npb25JRCwgMCwKLSAgICAgICAgICAgICAgICAgICAgbUNhc1Nlc3Npb25JZC5kYXRhKCksIG1DYXNTZXNzaW9uSWQuc2l6ZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGVxdWV1ZVNjcmFtYmxlZEFjY2Vzc1VuaXQoKTsKLSAgICB9Ci0KICAgICBjb25zdCB1aW50OF90ICpkYXRhID0gbUJ1ZmZlci0+ZGF0YSgpOwogCiAgICAgc2l6ZV90IHNpemUgPSBtQnVmZmVyLT5zaXplKCk7CkBAIC0xMjI2LDYgKzE1MjYsNyBAQAogICAgICAgICAgICAgICAgIGhlYWRlciwgJmZyYW1lU2l6ZSwgJnNhbXBsaW5nUmF0ZSwgJm51bUNoYW5uZWxzLAogICAgICAgICAgICAgICAgICZiaXRyYXRlLCAmbnVtU2FtcGxlcykpIHsKICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgYXVkaW8gZnJhbWUgc2l6ZSIpOworICAgICAgICBtQnVmZmVyLT5zZXRSYW5nZSgwLCAwKTsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCkBAIC0xMjUwLDYgKzE1NTEsMjIgQEAKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQogCisgICAgaWYgKG1Gb3JtYXQgIT0gTlVMTCkgeworICAgICAgICBjb25zdCBjaGFyICptaW1lOworICAgICAgICBpZiAobUZvcm1hdC0+ZmluZENTdHJpbmcoa0tleU1JTUVUeXBlLCAmbWltZSkpIHsKKyAgICAgICAgICAgIGlmICgobGF5ZXIgPT0gMSkgJiYgc3RyY21wIChtaW1lLCBNRURJQV9NSU1FVFlQRV9BVURJT19NUEVHX0xBWUVSX0kpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkF1ZGlvIGxheWVyIGlzIG5vdCBNUEVHX0xBWUVSX0kiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGxheWVyID09IDIpICYmIHN0cmNtcCAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFR19MQVlFUl9JSSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQXVkaW8gbGF5ZXIgaXMgbm90IE1QRUdfTEFZRVJfSUkiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoKGxheWVyID09IDMpICYmIHN0cmNtcCAobWltZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fTVBFRykpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQXVkaW8gbGF5ZXIgaXMgbm90IEFVRElPX01QRUciKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKwogICAgIGFjY2Vzc1VuaXQtPm1ldGEoKS0+c2V0SW50NjQoInRpbWVVcyIsIHRpbWVVcyk7CiAgICAgYWNjZXNzVW5pdC0+bWV0YSgpLT5zZXRJbnQzMigiaXNTeW5jIiwgMSk7CiAKQEAgLTEzMjQsMjUgKzE2NDEsNiBAQAogfQogCiBzcDxBQnVmZmVyPiBFbGVtZW50YXJ5U3RyZWFtUXVldWU6OmRlcXVldWVBY2Nlc3NVbml0TVBFR1ZpZGVvKCkgewotICAgIGlmIChpc1NjcmFtYmxlZCgpKSB7Ci0gICAgICAgIGlmIChtQnVmZmVyID09IE5VTEwgfHwgbUJ1ZmZlci0+c2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRm9ybWF0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dJKCJDcmVhdGluZyBkdW1teSBNUEVHIGZvcm1hdCBmb3Igc2NyYW1ibGVkIGNvbnRlbnQiKTsKLSAgICAgICAgICAgIG1Gb3JtYXQgPSBuZXcgTWV0YURhdGE7Ci0gICAgICAgICAgICBtRm9ybWF0LT5zZXRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgTUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzIpOwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0SW50MzIoa0tleVdpZHRoLCAxMjgwKTsKLSAgICAgICAgICAgIG1Gb3JtYXQtPnNldEludDMyKGtLZXlIZWlnaHQsIDcyMCk7Ci0KLSAgICAgICAgICAgIC8vIGZvciBNZWRpYUV4dHJhY3Rvci5DYXNJbmZvCi0gICAgICAgICAgICBtRm9ybWF0LT5zZXRJbnQzMihrS2V5Q0FTeXN0ZW1JRCwgbUNBU3lzdGVtSWQpOwotICAgICAgICAgICAgbUZvcm1hdC0+c2V0RGF0YShrS2V5Q0FTZXNzaW9uSUQsIDAsCi0gICAgICAgICAgICAgICAgICAgIG1DYXNTZXNzaW9uSWQuZGF0YSgpLCBtQ2FzU2Vzc2lvbklkLnNpemUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlcXVldWVTY3JhbWJsZWRBY2Nlc3NVbml0KCk7Ci0gICAgfQotCiAgICAgY29uc3QgdWludDhfdCAqZGF0YSA9IG1CdWZmZXItPmRhdGEoKTsKICAgICBzaXplX3Qgc2l6ZSA9IG1CdWZmZXItPnNpemUoKTsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9FU1F1ZXVlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaAppbmRleCBmZmNiNTAyLi4zMjI3ZjQ3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0VTUXVldWUuaApAQCAtMzgsNiArMzgsOCBAQAogICAgICAgICBIMjY0LAogICAgICAgICBBQUMsCiAgICAgICAgIEFDMywKKyAgICAgICAgRUFDMywKKyAgICAgICAgQUM0LAogICAgICAgICBNUEVHX0FVRElPLAogICAgICAgICBNUEVHX1ZJREVPLAogICAgICAgICBNUEVHNF9WSURFTywKQEAgLTU5LDYgKzYxLDcgQEAKIAogICAgIHZvaWQgYXBwZW5kU2NyYW1ibGVkRGF0YSgKICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsIHNpemVfdCBzaXplLAorICAgICAgICAgICAgc2l6ZV90IGxlYWRpbmdDbGVhckJ5dGVzLAogICAgICAgICAgICAgaW50MzJfdCBrZXlJZCwgYm9vbCBpc1N5bmMsCiAgICAgICAgICAgICBzcDxBQnVmZmVyPiBjbGVhclNpemVzLCBzcDxBQnVmZmVyPiBlbmNTaXplcyk7CiAKQEAgLTg0LDggKzg3LDggQEAKICAgICB9OwogCiAgICAgc3RydWN0IFNjcmFtYmxlZFJhbmdlSW5mbyB7Ci0gICAgICAgIC8vaW50NjRfdCBtVGltZXN0YW1wVXM7CiAgICAgICAgIHNpemVfdCBtTGVuZ3RoOworICAgICAgICBzaXplX3QgbUxlYWRpbmdDbGVhckJ5dGVzOwogICAgICAgICBpbnQzMl90IG1LZXlJZDsKICAgICAgICAgaW50MzJfdCBtSXNTeW5jOwogICAgICAgICBzcDxBQnVmZmVyPiBtQ2xlYXJTaXplczsKQEAgLTExNSw3ICsxMTgsOCBAQAogCiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRIMjY0KCk7CiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRBQUMoKTsKLSAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdEFDMygpOworICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0RUFDMygpOworICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0QUM0KCk7CiAgICAgc3A8QUJ1ZmZlcj4gZGVxdWV1ZUFjY2Vzc1VuaXRNUEVHQXVkaW8oKTsKICAgICBzcDxBQnVmZmVyPiBkZXF1ZXVlQWNjZXNzVW5pdE1QRUdWaWRlbygpOwogICAgIHNwPEFCdWZmZXI+IGRlcXVldWVBY2Nlc3NVbml0TVBFRzRWaWRlbygpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9IbHNTYW1wbGVEZWNyeXB0b3IuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy9IbHNTYW1wbGVEZWNyeXB0b3IuY3BwCmluZGV4IGUzMmY2NzYuLjdkNDQ2YWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvSGxzU2FtcGxlRGVjcnlwdG9yLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL0hsc1NhbXBsZURlY3J5cHRvci5jcHAKQEAgLTE0OSw2ICsxNDksMTEgQEAKICAgICB9CiAKICAgICAvLyBBRFRTIGhlYWRlciBpcyBpbmNsdWRlZCBpbiB0aGUgc2l6ZQorICAgIGlmIChzaXplIDwgYWR0c0hkclNpemUpIHsKKyAgICAgICAgQUxPR1YoInByb2Nlc3NBQUM6IHNpemUgKCV6dSkgPCBhZHRzSGRyU2l6ZSAoJXp1KSIsIHNpemUsIGFkdHNIZHJTaXplKTsKKyAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIxMjg0MzM5MzMiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KICAgICBzaXplX3Qgb2Zmc2V0ID0gYWR0c0hkclNpemU7CiAgICAgc2l6ZV90IHJlbWFpbmluZ0J5dGVzID0gc2l6ZSAtIGFkdHNIZHJTaXplOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNDgzMmEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvQW5kcm9pZC5icApAQCAtMCwwICsxLDcwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdHsKKyAgICBuYW1lOiAiTXBlZzJ0c1VuaXRUZXN0IiwKKyAgICBndGVzdDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIk1wZWcydHNVbml0VGVzdC5jcHAiCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhc0AxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYXMubmF0aXZlQDEuMCIsCisgICAgICAgICJhbmRyb2lkLmhpZGwudG9rZW5AMS4wLXV0aWxzIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJoaWRsbWVtb3J5IiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliYmluZGVyX25kayIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJkYXRhc291cmNlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfbWV0YWRhdGF1dGlscyIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9tcGVnMnN1cHBvcnQiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvZXh0cmFjdG9ycy8iLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC8iLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgICAgICJsaWJhdWRpb2NsaWVudF9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L0FuZHJvaWRUZXN0LnhtbCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9BbmRyb2lkVGVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMxMjk0ZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIE1wZWcydHMgdW5pdCB0ZXN0cyI+CisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXN1aXRlLXRhZyIgdmFsdWU9Ik1wZWcydHNVbml0VGVzdCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJNcGVnMnRzVW5pdFRlc3QtPi9kYXRhL2xvY2FsL3RtcC9NcGVnMnRzVW5pdFRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaC1maWxlIgorICAgICAgICAgICAga2V5PSJodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9NcGVnMnRzVW5pdFRlc3QuemlwP3VuemlwPXRydWUiCisgICAgICAgICAgICB2YWx1ZT0iL2RhdGEvbG9jYWwvdG1wL01wZWcydHNVbml0VGVzdFJlcy8iIC8+CisgICAgPC90YXJnZXRfcHJlcGFyZXI+CisKKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9Ik1wZWcydHNVbml0VGVzdCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1mbGFnIiB2YWx1ZT0iLVAgL2RhdGEvbG9jYWwvdG1wL01wZWcydHNVbml0VGVzdFJlcy8iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L01wZWcydHNVbml0VGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvTXBlZzJ0c1VuaXRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OWMyMzNiCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L01wZWcydHNVbml0VGVzdC5jcHAKQEAgLTAsMCArMSwyMzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk1wZWcydHNVbml0VGVzdCIKKworI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2luY2x1ZGUgPGRhdGFzb3VyY2UvRmlsZVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01ldGFEYXRhQmFzZS5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVV0aWxzLmg+CisKKyNpbmNsdWRlICJtcGVnMnRzL0FUU1BhcnNlci5oIgorI2luY2x1ZGUgIm1wZWcydHMvQW5vdGhlclBhY2tldFNvdXJjZS5oIgorCisjaW5jbHVkZSAiTXBlZzJ0c1VuaXRUZXN0RW52aXJvbm1lbnQuaCIKKworY29uc3RleHByIHNpemVfdCBrVFNQYWNrZXRTaXplID0gMTg4OworY29uc3RleHByIHVpbnQxNl90IGtQSURNYXNrID0gMHgxRkZGOworLy8gTWF4IHZhbHVlIG9mIFBJRCB3aGljaCBpcyBhbHNvIHVzZWQgZm9yIE51bGwgcGFja2V0cworY29uc3RleHByIHVpbnQxNl90IGtQSURNYXhWYWx1ZSA9IDgxOTE7Citjb25zdGV4cHIgdWludDhfdCBrVFNTeW5jQnl0ZSA9IDB4NDc7Citjb25zdGV4cHIgdWludDhfdCBrVmlkZW9QcmVzZW50ID0gMHgwMTsKK2NvbnN0ZXhwciB1aW50OF90IGtBdWRpb1ByZXNlbnQgPSAweDAyOworY29uc3RleHByIHVpbnQ4X3Qga01ldGFEYXRhUHJlc2VudCA9IDB4MDQ7CisKK3N0YXRpYyBNcGVnMnRzVW5pdFRlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitjbGFzcyBNcGVnMnRzVW5pdFRlc3QKKyAgICA6IHB1YmxpYyA6OnRlc3RpbmcgOjpUZXN0V2l0aFBhcmFtPAorICAgICAgICAgICAgICB0dXBsZTwvKmZpbGVOYW1lKi8gc3RyaW5nLCAvKnNvdXJjZVR5cGUqLyBjaGFyLCAvKm51bVNvdXJjZSovIHVpbnQxNl90Pj4geworICBwdWJsaWM6CisgICAgTXBlZzJ0c1VuaXRUZXN0KCkKKyAgICAgICAgOiBtSW5wdXRCdWZmZXIobnVsbHB0ciksIG1Tb3VyY2UobnVsbHB0ciksIG1GcElucHV0KG51bGxwdHIpLCBtUGFyc2VyKG51bGxwdHIpIHt9CisKKyAgICB+TXBlZzJ0c1VuaXRUZXN0KCkgeworICAgICAgICBpZiAobUlucHV0QnVmZmVyKSBmcmVlKG1JbnB1dEJ1ZmZlcik7CisgICAgICAgIGlmIChtRnBJbnB1dCkgZmNsb3NlKG1GcElucHV0KTsKKyAgICAgICAgbVNvdXJjZS5jbGVhcigpOworICAgIH0KKworICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIG1PZmZzZXQgPSAwOworICAgICAgICBtTnVtRGF0YVNvdXJjZSA9IDA7CisgICAgICAgIHR1cGxlPHN0cmluZywgY2hhciwgdWludDE2X3Q+IHBhcmFtcyA9IEdldFBhcmFtKCk7CisgICAgICAgIGNoYXIgc291cmNlVHlwZSA9IGdldDwxPihwYXJhbXMpOworICAgICAgICAvKiBtU291cmNlVHlwZSA9IDBiIHggeCB4IHggeCBNIEEgVgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8gIHwgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhRGF0YSAgYXVkaW8gIHZpZGVvICovCisgICAgICAgIG1NZWRpYVR5cGUgPSAoc291cmNlVHlwZSAmIDB4MDcpOworICAgICAgICBtTnVtRGF0YVNvdXJjZSA9IGdldDwyPihwYXJhbXMpOworICAgICAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBnZXQ8MD4ocGFyYW1zKTsKKyAgICAgICAgbUZwSW5wdXQgPSBmb3BlbihpbnB1dEZpbGUuY19zdHIoKSwgInJiIik7CisgICAgICAgIEFTU0VSVF9ORShtRnBJbnB1dCwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBvcGVuIGZpbGU6ICIgPDwgaW5wdXRGaWxlOworCisgICAgICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICAgICAgaW50OF90IGVyciA9IHN0YXQoaW5wdXRGaWxlLmNfc3RyKCksICZidWYpOworICAgICAgICBBU1NFUlRfRVEoZXJyLCAwKSA8PCAiRmFpbGVkIHRvIGdldCBpbmZvcm1hdGlvbiBmb3IgZmlsZTogIiA8PCBpbnB1dEZpbGU7CisKKyAgICAgICAgbG9uZyBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgICAgICBtVG90YWxQYWNrZXRzID0gZmlsZVNpemUgLyBrVFNQYWNrZXRTaXplOworICAgICAgICBpbnQzMl90IGZkID0gZmlsZW5vKG1GcElucHV0KTsKKyAgICAgICAgQVNTRVJUX0dFKGZkLCAwKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgaW50ZWdlciBmaWxlIGRlc2NyaXB0b3IiOworCisgICAgICAgIG1Tb3VyY2UgPSBuZXcgRmlsZVNvdXJjZShkdXAoZmQpLCAwLCBidWYuc3Rfc2l6ZSk7CisgICAgICAgIEFTU0VSVF9ORShtU291cmNlLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGdldCB0aGUgZGF0YSBzb3VyY2UhIjsKKworICAgICAgICBtUGFyc2VyID0gbmV3IEFUU1BhcnNlcigpOworICAgICAgICBBU1NFUlRfTkUobVBhcnNlciwgbnVsbHB0cikgPDwgIlVuYWJsZSB0byBjcmVhdGUgQVRTIHBhcnNlciEiOworICAgICAgICBtSW5wdXRCdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhrVFNQYWNrZXRTaXplKTsKKyAgICAgICAgQVNTRVJUX05FKG1JbnB1dEJ1ZmZlciwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIFRTIHBhY2tldCEiOworICAgIH0KKworICAgIHVpbnQ2NF90IG1PZmZzZXQ7CisgICAgdWludDY0X3QgbVRvdGFsUGFja2V0czsKKyAgICB1aW50MTZfdCBtTnVtRGF0YVNvdXJjZTsKKworICAgIGludDhfdCBtTWVkaWFUeXBlOworCisgICAgdWludDhfdCAqbUlucHV0QnVmZmVyOworICAgIHN0cmluZyBtSW5wdXRGaWxlOworICAgIHNwPERhdGFTb3VyY2U+IG1Tb3VyY2U7CisgICAgRklMRSAqbUZwSW5wdXQ7CisgICAgQVRTUGFyc2VyICptUGFyc2VyOworfTsKKworVEVTVF9QKE1wZWcydHNVbml0VGVzdCwgTWVkaWFJbmZvVGVzdCkgeworICAgIGJvb2wgdmlkZW9Gb3VuZCA9IGZhbHNlOworICAgIGJvb2wgYXVkaW9Gb3VuZCA9IGZhbHNlOworICAgIGJvb2wgbWV0YURhdGFGb3VuZCA9IGZhbHNlOworICAgIGJvb2wgc3luY1BvaW50UHJlc2VudCA9IGZhbHNlOworCisgICAgaW50MTZfdCB0b3RhbERhdGFTb3VyY2UgPSAwOworICAgIGludDMyX3QgdmFsMzIgPSAwOworICAgIHVpbnQ4X3QgbnVtRGF0YVNvdXJjZSA9IDA7CisgICAgdWludDhfdCBwYWNrZXRba1RTUGFja2V0U2l6ZV07CisgICAgc3NpemVfdCBudW1CeXRlc1JlYWQgPSAtMTsKKworICAgIEFUU1BhcnNlcjo6U3luY0V2ZW50IGV2ZW50KG1PZmZzZXQpOworICAgIHN0YXRpYyBjb25zdCBBVFNQYXJzZXI6OlNvdXJjZVR5cGUgbWVkaWFUeXBlW10gPSB7QVRTUGFyc2VyOjpWSURFTywgQVRTUGFyc2VyOjpBVURJTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFUU1BhcnNlcjo6TUVUQSwgQVRTUGFyc2VyOjpOVU1fU09VUkNFX1RZUEVTfTsKKyAgICBjb25zdCB1aW50MzJfdCBuTWVkaWFUeXBlcyA9IHNpemVvZihtZWRpYVR5cGUpIC8gc2l6ZW9mKG1lZGlhVHlwZVswXSk7CisKKyAgICB3aGlsZSAoKG51bUJ5dGVzUmVhZCA9IG1Tb3VyY2UtPnJlYWRBdChtT2Zmc2V0LCBwYWNrZXQsIGtUU1BhY2tldFNpemUpKSA9PSBrVFNQYWNrZXRTaXplKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKHBhY2tldFswXSA9PSBrVFNTeW5jQnl0ZSkgPDwgIlN5bmMgYnl0ZSBlcnJvciEiOworCisgICAgICAgIC8vIHBpZCBpcyAxMyBiaXRzCisgICAgICAgIHVpbnQxNl90IHBpZCA9IChwYWNrZXRbMV0gKyAocGFja2V0WzJdIDw8IDgpKSAmIGtQSURNYXNrOworICAgICAgICBBU1NFUlRfVFJVRShwaWQgPD0ga1BJRE1heFZhbHVlKSA8PCAiSW52YWxpZCBQSUQ6ICIgPDwgcGlkOworCisgICAgICAgIHN0YXR1c190IGVyciA9IG1QYXJzZXItPmZlZWRUU1BhY2tldChwYWNrZXQsIGtUU1BhY2tldFNpemUsICZldmVudCk7CisgICAgICAgIEFTU0VSVF9FUShlcnIsIChzdGF0dXNfdClPSykgPDwgIlVuYWJsZSB0byBmZWVkIFRTIHBhY2tldCEiOworCisgICAgICAgIG1PZmZzZXQgKz0gbnVtQnl0ZXNSZWFkOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5NZWRpYVR5cGVzOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtUGFyc2VyLT5oYXNTb3VyY2UobWVkaWFUeXBlW2ldKSkgeworICAgICAgICAgICAgICAgIHN3aXRjaCAobWVkaWFUeXBlW2ldKSB7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVRTUGFyc2VyOjpWSURFTzoKKyAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVRTUGFyc2VyOjpBVURJTzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIGNhc2UgQVRTUGFyc2VyOjpNRVRBOgorICAgICAgICAgICAgICAgICAgICAgICAgbWV0YURhdGFGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgY2FzZSBBVFNQYXJzZXI6Ok5VTV9TT1VSQ0VfVFlQRVM6CisgICAgICAgICAgICAgICAgICAgICAgICBudW1EYXRhU291cmNlID0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmICh2aWRlb0ZvdW5kICYmIGF1ZGlvRm91bmQgJiYgbWV0YURhdGFGb3VuZCAmJiAobnVtRGF0YVNvdXJjZSA9PSAzKSkgYnJlYWs7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuTWVkaWFUeXBlczsgaSsrKSB7CisgICAgICAgIEFUU1BhcnNlcjo6U291cmNlVHlwZSBjdXJyZW50TWVkaWFUeXBlID0gbWVkaWFUeXBlW2ldOworICAgICAgICBpZiAobVBhcnNlci0+aGFzU291cmNlKGN1cnJlbnRNZWRpYVR5cGUpKSB7CisgICAgICAgICAgICBpZiAoZXZlbnQuaGFzUmV0dXJuZWREYXRhKCkpIHsKKyAgICAgICAgICAgICAgICBzeW5jUG9pbnRQcmVzZW50ID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBzeW5jUGFja2V0U291cmNlID0gZXZlbnQuZ2V0TWVkaWFTb3VyY2UoKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfTkUoc3luY1BhY2tldFNvdXJjZSwgbnVsbHB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJDYW5ub3QgZ2V0IHN5bmMgc291cmNlIGZvciBtZWRpYSB0eXBlOiAiIDw8IGN1cnJlbnRNZWRpYVR5cGU7CisKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBlcnIgPSBzeW5jUGFja2V0U291cmNlLT5zdGFydCgpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShlcnIsIChzdGF0dXNfdClPSykgPDwgIkVycm9yIHJldHVybmVkIHdoaWxlIHN0YXJ0aW5nISI7CisKKyAgICAgICAgICAgICAgICBzcDxNZXRhRGF0YT4gZm9ybWF0ID0gc3luY1BhY2tldFNvdXJjZS0+Z2V0Rm9ybWF0KCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX05FKGZvcm1hdCwgbnVsbHB0cikgPDwgIlVuYWJsZSB0byBnZXQgdGhlIGZvcm1hdCBvZiB0aGUgc291cmNlIHBhY2tldCEiOworCisgICAgICAgICAgICAgICAgTWVkaWFCdWZmZXJCYXNlICpidWY7CisgICAgICAgICAgICAgICAgc3luY1BhY2tldFNvdXJjZS0+cmVhZCgmYnVmLCBudWxscHRyKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfTkUoYnVmLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIHJlYWQgc3luYyBwYWNrZXQgc291cmNlIGRhdGEiOworCisgICAgICAgICAgICAgICAgTWV0YURhdGFCYXNlICZpbk1ldGEgPSBidWYtPm1ldGFfZGF0YSgpOworICAgICAgICAgICAgICAgIGJvb2wgc3RhdHVzID0gaW5NZXRhLmZpbmRJbnQzMihrS2V5SXNTeW5jRnJhbWUsICZ2YWwzMik7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgdHJ1ZSkgPDwgIlN5bmMgZnJhbWUga2V5IGlzIG5vdCBzZXQiOworCisgICAgICAgICAgICAgICAgc3RhdHVzID0gaW5NZXRhLmZpbmRJbnQzMihrS2V5Q3J5cHRvTW9kZSwgJnZhbDMyKTsKKyAgICAgICAgICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBmYWxzZSkgPDwgIkludmFsaWQgcGFja2V0LCBmb3VuZCBzY3JhbWJsZWQgcGFja2V0cyEiOworCisgICAgICAgICAgICAgICAgZXJyID0gc3luY1BhY2tldFNvdXJjZS0+c3RvcCgpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShlcnIsIChzdGF0dXNfdClPSykgPDwgIkVycm9yIHJldHVybmVkIHdoaWxlIHN0b3BwaW5nISI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBbm90aGVyUGFja2V0U291cmNlPiBwYWNrZXRTb3VyY2UgPSBtUGFyc2VyLT5nZXRTb3VyY2UoY3VycmVudE1lZGlhVHlwZSk7CisgICAgICAgICAgICBBU1NFUlRfTkUocGFja2V0U291cmNlLCBudWxscHRyKQorICAgICAgICAgICAgICAgICAgICA8PCAiQ2Fubm90IGdldCBzb3VyY2UgZm9yIG1lZGlhIHR5cGU6ICIgPDwgY3VycmVudE1lZGlhVHlwZTsKKworICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gcGFja2V0U291cmNlLT5zdGFydCgpOworICAgICAgICAgICAgQVNTRVJUX0VRKGVyciwgKHN0YXR1c190KU9LKSA8PCAiRXJyb3IgcmV0dXJuZWQgd2hpbGUgc3RhcnRpbmchIjsKKyAgICAgICAgICAgIHNwPE1ldGFEYXRhPiBmb3JtYXQgPSBwYWNrZXRTb3VyY2UtPmdldEZvcm1hdCgpOworICAgICAgICAgICAgQVNTRVJUX05FKGZvcm1hdCwgbnVsbHB0cikgPDwgIlVuYWJsZSB0byBnZXQgdGhlIGZvcm1hdCBvZiB0aGUgcGFja2V0ISI7CisKKyAgICAgICAgICAgIGVyciA9IHBhY2tldFNvdXJjZS0+c3RvcCgpOworICAgICAgICAgICAgQVNTRVJUX0VRKGVyciwgKHN0YXR1c190KU9LKSA8PCAiRXJyb3IgcmV0dXJuZWQgd2hpbGUgc3RvcHBpbmchIjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEFTU0VSVF9FUSh2aWRlb0ZvdW5kLCBib29sKG1NZWRpYVR5cGUgJiBrVmlkZW9QcmVzZW50KSkgPDwgIk5vIFZpZGVvIHBhY2tldHMgZm91bmQhIjsKKyAgICBBU1NFUlRfRVEoYXVkaW9Gb3VuZCwgYm9vbChtTWVkaWFUeXBlICYga0F1ZGlvUHJlc2VudCkpIDw8ICJObyBBdWRpbyBwYWNrZXRzIGZvdW5kISI7CisgICAgQVNTRVJUX0VRKG1ldGFEYXRhRm91bmQsIGJvb2wobU1lZGlhVHlwZSAmIGtNZXRhRGF0YVByZXNlbnQpKSA8PCAiTm8gbWV0YSBkYXRhIGZvdW5kISI7CisKKyAgICBpZiAodmlkZW9Gb3VuZCB8fCBhdWRpb0ZvdW5kKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKHN5bmNQb2ludFByZXNlbnQpIDw8ICJObyBzeW5jIHBvaW50cyBmb3VuZCBmb3IgYXVkaW8vdmlkZW8iOworICAgIH0KKworICAgIGlmICh2aWRlb0ZvdW5kKSB0b3RhbERhdGFTb3VyY2UgKz0gMTsKKyAgICBpZiAoYXVkaW9Gb3VuZCkgdG90YWxEYXRhU291cmNlICs9IDE7CisgICAgaWYgKG1ldGFEYXRhRm91bmQpIHRvdGFsRGF0YVNvdXJjZSArPSAxOworCisgICAgQVNTRVJUX1RSVUUodG90YWxEYXRhU291cmNlID09IG1OdW1EYXRhU291cmNlKQorICAgICAgICAgICAgPDwgIkV4cGVjdGVkICIgPDwgbU51bURhdGFTb3VyY2UgPDwgIiBkYXRhIHNvdXJjZXMsIGZvdW5kICIgPDwgdG90YWxEYXRhU291cmNlOworICAgIGlmIChudW1EYXRhU291cmNlID09IDMpIHsKKyAgICAgICAgQVNTRVJUX0VRKG51bURhdGFTb3VyY2UsIG1OdW1EYXRhU291cmNlKQorICAgICAgICAgICAgICAgIDw8ICJFeHBlY3RlZCAiIDw8IG1OdW1EYXRhU291cmNlIDw8ICIgZGF0YSBzb3VyY2VzLCBmb3VuZCAiIDw8IHRvdGFsRGF0YVNvdXJjZTsKKyAgICB9Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgaW5mb1Rlc3QsIE1wZWcydHNVbml0VGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV90dXBsZSgiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzY3MDBrYnBzX2gyNjQudHMiLCAweDAxLCAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgic2VnbWVudDAwMDAwMS50cyIsIDB4MDMsIDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfNW1pbnMudHMiLCAweDAyLCAxKSkpOworCitpbnQzMl90IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgZ0VudiA9IG5ldyBNcGVnMnRzVW5pdFRlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIHVpbnQ4X3Qgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIEFMT0dWKCJNcGVnMnRzVW5pdCBUZXN0IFJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L01wZWcydHNVbml0VGVzdEVudmlyb25tZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvTXBlZzJ0c1VuaXRUZXN0RW52aXJvbm1lbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTQxZGI3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L01wZWcydHNVbml0VGVzdEVudmlyb25tZW50LmgKQEAgLTAsMCArMSw3MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19NUEVHMlRTX1VOSVRfVEVTVF9FTlZJUk9OTUVOVF9IX18KKyNkZWZpbmUgX19NUEVHMlRTX1VOSVRfVEVTVF9FTlZJUk9OTUVOVF9IX18KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgTXBlZzJ0c1VuaXRUZXN0RW52aXJvbm1lbnQgOiBwdWJsaWM6OnRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyAgcHVibGljOgorICAgIE1wZWcydHNVbml0VGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSB7fQorCisgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisgICAgdm9pZCBzZXRSZXMoY29uc3QgY2hhciAqX3JlcykgeyByZXMgPSBfcmVzOyB9CisKKyAgICBjb25zdCBzdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJpbmcgcmVzOworfTsKKworaW50IE1wZWcydHNVbml0VGVzdEVudmlyb25tZW50Ojppbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0ge3sicGF0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LCB7MCwgMCwgMCwgMH19OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiUDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ1AnOiB7CisgICAgICAgICAgICAgICAgc2V0UmVzKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdGluZCA8IGFyZ2MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBvcHRpb246ICVzXG5cbiIKKyAgICAgICAgICAgICAgICAidXNhZ2U6ICVzIDxndGVzdCBvcHRpb25zPiA8dGVzdCBvcHRpb25zPlxuXG4iCisgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKKyAgICAgICAgICAgICAgICAiLVAsIC0tcGF0aDogUmVzb3VyY2UgZmlsZXMgZGlyZWN0b3J5IGxvY2F0aW9uXG4iLAorICAgICAgICAgICAgICAgIGFyZ3Zbb3B0aW5kID86IDFdLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisjZW5kaWYgIC8vIF9fTVBFRzJUU19VTklUX1RFU1RfRU5WSVJPTk1FTlRfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9tcGVnMnRzL3Rlc3QvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzdjZTcyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvbXBlZzJ0cy90ZXN0L1JFQURNRS5tZApAQCAtMCwwICsxLDM4IEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgTXBlZzJUUyBVbml0IFRlc3QgOgorVGhlIE1wZWcyVFMgVW5pdCBUZXN0IFN1aXRlIHZhbGlkYXRlcyB0aGUgZnVuY3Rpb25hbGl0eSBvZiB0aGUgbGlicmFyaWVzIHByZXNlbnQgaW4gTXBlZzJUUy4KKworUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6CitgYGAKK21tbSBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC8KK2BgYAorCitUaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LworCitUaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCisKK1RvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgorCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvTXBlZzJ0c1VuaXRUZXN0L01wZWcydHNVbml0VGVzdCAvZGF0YS9sb2NhbC90bXAvCisKK1RvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KKworYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9NcGVnMnRzVW5pdFRlc3QvTXBlZzJ0c1VuaXRUZXN0IC9kYXRhL2xvY2FsL3RtcC8KKworVGhlIHJlc291cmNlIGZpbGUgZm9yIHRoZSB0ZXN0cyBpcyB0YWtlbiBmcm9tIFtoZXJlXShodHRwczovL3N0b3JhZ2UuZ29vZ2xlYXBpcy5jb20vYW5kcm9pZF9tZWRpYS9mcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L21wZWcydHMvdGVzdC9NcGVnMnRzVW5pdFRlc3QuemlwICkuCitEb3dubG9hZCwgdW56aXAgYW5kIHB1c2ggdGhlc2UgZmlsZXMgaW50byBkZXZpY2UgZm9yIHRlc3RpbmcuCisKK2BgYAorYWRiIHB1c2ggTXBlZzJ0c1VuaXRUZXN0UmVzLy4gL2RhdGEvbG9jYWwvdG1wLworYGBgCisKK3VzYWdlOiBNcGVnMnRzVW5pdFRlc3QgLVAgXDxwYXRoX3RvX2ZvbGRlclw+CitgYGAKK2FkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvTXBlZzJ0c1VuaXRUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9NcGVnMnRzVW5pdFRlc3RSZXMvCitgYGAKK0FsdGVybmF0aXZlbHksIHRoZSB0ZXN0IGNhbiBhbHNvIGJlIHJ1biB1c2luZyBhdGVzdCBjb21tYW5kLgorCitgYGAKK2F0ZXN0IE1wZWcydHNVbml0VGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC8xLjAvT214LmNwcAppbmRleCA0ZTJkMzk4Li5lZWY5Y2UzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXguY3BwCkBAIC0xOCw3ICsxOCw2IEBACiAjaW5jbHVkZSA8bGlzdD4KIAogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z3VpL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db3JlLmg+CiAjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfQXNTdHJpbmcuaD4KIApAQCAtMjgsNyArMjcsNiBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XT214Tm9kZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV09teE9ic2VydmVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9XR3JhcGhpY0J1ZmZlclNvdXJjZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214Lmg+CkBAIC00NSw2ICs0Myw4IEBACiBPbXg6Ok9teCgpIDoKICAgICBtTWFzdGVyKG5ldyBPTVhNYXN0ZXIoKSksCiAgICAgbVBhcnNlcigpIHsKKyAgICAodm9pZCltUGFyc2VyLnBhcnNlWG1sRmlsZXNJblNlYXJjaERpcnMoKTsKKyAgICAodm9pZCltUGFyc2VyLnBhcnNlWG1sUGF0aChtUGFyc2VyLmRlZmF1bHRQcm9maWxpbmdSZXN1bHRzWG1sUGF0aCk7CiB9CiAKIE9teDo6fk9teCgpIHsKQEAgLTEyNCwxMSArMTI0LDExIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB1aW50MzJfdCBxdWlya3MgPSAwOwogICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBxdWlyayA6IGNvZGVjLT5zZWNvbmQucXVpcmtTZXQpIHsKLSAgICAgICAgICAgICAgICBpZiAocXVpcmsgPT0gInJlcXVpcmVzLWFsbG9jYXRlLW9uLWlucHV0LXBvcnRzIikgeworICAgICAgICAgICAgICAgIGlmIChxdWlyayA9PSAicXVpcms6OnJlcXVpcmVzLWFsbG9jYXRlLW9uLWlucHV0LXBvcnRzIikgewogICAgICAgICAgICAgICAgICAgICBxdWlya3MgfD0gT01YTm9kZUluc3RhbmNlOjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uSW5wdXRQb3J0czsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHF1aXJrID09ICJyZXF1aXJlcy1hbGxvY2F0ZS1vbi1vdXRwdXQtcG9ydHMiKSB7CisgICAgICAgICAgICAgICAgaWYgKHF1aXJrID09ICJxdWlyazo6cmVxdWlyZXMtYWxsb2NhdGUtb24tb3V0cHV0LXBvcnRzIikgewogICAgICAgICAgICAgICAgICAgICBxdWlya3MgfD0gT01YTm9kZUluc3RhbmNlOjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmVxdWlyZXNBbGxvY2F0ZUJ1ZmZlck9uT3V0cHV0UG9ydHM7CiAgICAgICAgICAgICAgICAgfQpAQCAtMTQ2LDggKzE0Niw2IEBACiB9CiAKIFJldHVybjx2b2lkPiBPbXg6OmNyZWF0ZUlucHV0U3VyZmFjZShjcmVhdGVJbnB1dFN1cmZhY2VfY2IgX2hpZGxfY2IpIHsKLSAgICBzcDw6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGJ1ZmZlclByb2R1Y2VyOwotCiAgICAgc3A8T214R3JhcGhpY0J1ZmZlclNvdXJjZT4gZ3JhcGhpY0J1ZmZlclNvdXJjZSA9IG5ldyBPbXhHcmFwaGljQnVmZmVyU291cmNlKCk7CiAgICAgc3RhdHVzX3QgZXJyID0gZ3JhcGhpY0J1ZmZlclNvdXJjZS0+aW5pdENoZWNrKCk7CiAgICAgaWYgKGVyciAhPSBPSykgewpAQCAtMTU3LDEwICsxNTUsOSBAQAogICAgICAgICBfaGlkbF9jYih0b1N0YXR1cyhlcnIpLCBudWxscHRyLCBudWxscHRyKTsKICAgICAgICAgcmV0dXJuIFZvaWQoKTsKICAgICB9Ci0gICAgYnVmZmVyUHJvZHVjZXIgPSBncmFwaGljQnVmZmVyU291cmNlLT5nZXRJR3JhcGhpY0J1ZmZlclByb2R1Y2VyKCk7CiAKICAgICBfaGlkbF9jYih0b1N0YXR1cyhPSyksCi0gICAgICAgICAgICBuZXcgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXIoYnVmZmVyUHJvZHVjZXIpLAorICAgICAgICAgICAgZ3JhcGhpY0J1ZmZlclNvdXJjZS0+Z2V0SEdyYXBoaWNCdWZmZXJQcm9kdWNlcl9WMV8wKCksCiAgICAgICAgICAgICBuZXcgVFdHcmFwaGljQnVmZmVyU291cmNlKGdyYXBoaWNCdWZmZXJTb3VyY2UpKTsKICAgICByZXR1cm4gVm9pZCgpOwogfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcAppbmRleCA0NDdhZjZmLi42N2Y0NzhlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvMS4wL09teFN0b3JlLmNwcApAQCAtMTcsNiArMTcsOCBAQAogI2luY2x1ZGUgPGlvcz4KICNpbmNsdWRlIDxsaXN0PgogCisjZGVmaW5lIExPR19UQUcgIk9teFN0b3JlIgorCiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KIAogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oPgpAQCAtMzAsMTYgKzMyLDMzIEBACiBuYW1lc3BhY2UgVjFfMCB7CiBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24gewogCit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjpTdGF0dXM7Cit1c2luZyA6OmFuZHJvaWQ6OmhhcmR3YXJlOjptZWRpYTo6b214OjpWMV8wOjpJT214OworCiBPbXhTdG9yZTo6T214U3RvcmUoCisgICAgICAgIGNvbnN0IHNwPElPbXg+ICZvbXgsCiAgICAgICAgIGNvbnN0IGNoYXIqIG93bmVyLAotICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogc2VhcmNoRGlycywKLSAgICAgICAgY29uc3QgY2hhciogbWFpblhtbE5hbWUsCi0gICAgICAgIGNvbnN0IGNoYXIqIHBlcmZvcm1hbmNlWG1sTmFtZSwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZzZWFyY2hEaXJzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnhtbE5hbWVzLAogICAgICAgICBjb25zdCBjaGFyKiBwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCkgewotICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyIHBhcnNlcihzZWFyY2hEaXJzLAotICAgICAgICAgICAgbWFpblhtbE5hbWUsCi0gICAgICAgICAgICBwZXJmb3JtYW5jZVhtbE5hbWUsCi0gICAgICAgICAgICBwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCk7CisgICAgLy8gcmV0cmlldmUgbGlzdCBvZiBvbXggbm9kZXMKKyAgICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gbm9kZXM7CisgICAgaWYgKG9teCAhPSBudWxscHRyKSB7CisgICAgICAgIG9teC0+bGlzdE5vZGVzKFsmbm9kZXNdKGNvbnN0IFN0YXR1cyAmc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzxJT214OjpDb21wb25lbnRJbmZvPiAmbm9kZUxpc3QpIHsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgSU9teDo6Q29tcG9uZW50SW5mbyYgaW5mbyA6IG5vZGVMaXN0KSB7CisgICAgICAgICAgICAgICAgICAgIG5vZGVzLmVtcGxhY2UoaW5mby5tTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0pOworICAgIH0KKworICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyIHBhcnNlcjsKKyAgICBwYXJzZXIucGFyc2VYbWxGaWxlc0luU2VhcmNoRGlycyh4bWxOYW1lcywgc2VhcmNoRGlycyk7CisgICAgaWYgKHByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoICE9IG51bGxwdHIpIHsKKyAgICAgICAgcGFyc2VyLnBhcnNlWG1sUGF0aChwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCk7CisgICAgfQogICAgIG1QYXJzaW5nU3RhdHVzID0gdG9TdGF0dXMocGFyc2VyLmdldFBhcnNpbmdTdGF0dXMoKSk7CiAKICAgICBjb25zdCBhdXRvJiBzZXJ2aWNlQXR0cmlidXRlTWFwID0gcGFyc2VyLmdldFNlcnZpY2VBdHRyaWJ1dGVNYXAoKTsKQEAgLTYxLDE0ICs4MCwxOCBAQAogICAgICAgICByb2xlLnJvbGUgPSByb2xlUGFpci5maXJzdDsKICAgICAgICAgcm9sZS50eXBlID0gcm9sZVBhaXIuc2Vjb25kLnR5cGU7CiAgICAgICAgIHJvbGUuaXNFbmNvZGVyID0gcm9sZVBhaXIuc2Vjb25kLmlzRW5jb2RlcjsKLSAgICAgICAgLy8gVE9ETzogQ3VycmVudGx5LCBwcmVmZXJQbGF0Zm9ybU5vZGVzIGluZm9ybWF0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW4KLSAgICAgICAgLy8gdGhlIHhtbCBmaWxlLiBPbmNlIHdlIGhhdmUgYSB3YXkgdG8gcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uLCBpdAotICAgICAgICAvLyBzaG91bGQgYmUgcGFyc2VkIHByb3Blcmx5LgotICAgICAgICByb2xlLnByZWZlclBsYXRmb3JtTm9kZXMgPSByb2xlUGFpci5maXJzdC5jb21wYXJlKDAsIDUsICJhdWRpbyIpID09IDA7CisgICAgICAgIHJvbGUucHJlZmVyUGxhdGZvcm1Ob2RlcyA9IGZhbHNlOyAvLyBkZXByZWNhdGVkIGFuZCBpZ25vcmVkLCB1c2luZyByYW5rIGluc3RlYWQKICAgICAgICAgaGlkbF92ZWM8Tm9kZUluZm8+JiBub2RlTGlzdCA9IHJvbGUubm9kZXM7CiAgICAgICAgIG5vZGVMaXN0LnJlc2l6ZShyb2xlUGFpci5zZWNvbmQubm9kZUxpc3Quc2l6ZSgpKTsKICAgICAgICAgc2l6ZV90IGogPSAwOwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG5vZGVQYWlyIDogcm9sZVBhaXIuc2Vjb25kLm5vZGVMaXN0KSB7CisgICAgICAgICAgICBpZiAoIW5vZGVzLmNvdW50KG5vZGVQYWlyLnNlY29uZC5uYW1lKSkgeworICAgICAgICAgICAgICAgIC8vIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBPTVggaW5zdGFuY2UKKyAgICAgICAgICAgICAgICBpZiAoIXN0cm5jYXNlY21wKG5vZGVQYWlyLnNlY29uZC5uYW1lLmNfc3RyKCksICJvbXguIiwgNCkpIHsKKyAgICAgICAgICAgICAgICAgICAgTE9HKElORk8pIDw8ICJub2RlIFsiIDw8IG5vZGVQYWlyLnNlY29uZC5uYW1lLmNfc3RyKCkgPDwgIl0gbm90IGZvdW5kIGluIElPbXgiOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIE5vZGVJbmZvIG5vZGU7CiAgICAgICAgICAgICBub2RlLm5hbWUgPSBub2RlUGFpci5zZWNvbmQubmFtZTsKICAgICAgICAgICAgIG5vZGUub3duZXIgPSBvd25lcjsKQEAgLTg1LDYgKzEwOCw3IEBACiAgICAgICAgICAgICBub2RlTGlzdFtqXSA9IHN0ZDo6bW92ZShub2RlKTsKICAgICAgICAgICAgICsrajsKICAgICAgICAgfQorICAgICAgICBub2RlTGlzdC5yZXNpemUoaik7CiAgICAgICAgIG1Sb2xlTGlzdFtpXSA9IHN0ZDo6bW92ZShyb2xlKTsKICAgICAgICAgKytpOwogICAgIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAKaW5kZXggMTBiOTVkOS4uN2Q2MTJiNCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L0FuZHJvaWQuYnAKQEAgLTYsMTYgKzYsMTAgQEAKICAgICB9LAogCiAgICAgc3JjczogWwotICAgICAgICAiQldHcmFwaGljQnVmZmVyU291cmNlLmNwcCIsCiAgICAgICAgICJPTVhNYXN0ZXIuY3BwIiwKICAgICAgICAgIk9NWE5vZGVJbnN0YW5jZS5jcHAiLAogICAgICAgICAiT01YVXRpbHMuY3BwIiwKICAgICAgICAgIk9teEdyYXBoaWNCdWZmZXJTb3VyY2UuY3BwIiwKLSAgICAgICAgIlNpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwIiwKLSAgICAgICAgIlNvZnRPTVhDb21wb25lbnQuY3BwIiwKLSAgICAgICAgIlNvZnRPTVhQbHVnaW4uY3BwIiwKLSAgICAgICAgIlNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwIiwKLSAgICAgICAgIlNvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwIiwKICAgICAgICAgIjEuMC9PbXguY3BwIiwKICAgICAgICAgIjEuMC9PbXhTdG9yZS5jcHAiLAogICAgICAgICAiMS4wL1dHcmFwaGljQnVmZmVyU291cmNlLmNwcCIsCkBAIC00NCw3ICszOCw2IEBACiAgICAgICAgICJsaWJ1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlidWkiLAotICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2J1ZmZlcnF1ZXVlX2hlbHBlciIsCkBAIC01MiwxNSArNDUsMTIgQEAKICAgICAgICAgImxpYmRsIiwKICAgICAgICAgImxpYmhpZGxiYXNlIiwKICAgICAgICAgImxpYmhpZGxtZW1vcnkiLAotICAgICAgICAibGliaGlkbHRyYW5zcG9ydCIsCi0gICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLCAvLyBUT0RPKGIvNjI5MjM0NzkpOiB1c2UgaGVhZGVyIGxpYnJhcnkKICAgICAgICAgImxpYnZuZGtzdXBwb3J0IiwKICAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUubWVkaWEub214QDEuMCIsCiAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKLSAgICAgICAgImxpYm1lZGlhX29teCIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciIsCiAgICAgICAgICJsaWJ1dGlscyIsCkBAIC04MCw2ICs3MCwxMjYgQEAKICAgICAgICAgXSwKICAgICAgICAgY2ZpOiB0cnVlLAogICAgIH0sCisKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0b214IiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAiLAorICAgICAgICAiU29mdE9NWENvbXBvbmVudC5jcHAiLAorICAgICAgICAiU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAiLAorICAgICAgICAiU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJpbmNsdWRlIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibWVkaWFfcGx1Z2luX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidWkiLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICAgICAgIi1Xbm8tZG9jdW1lbnRhdGlvbiIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0b214X3BsdWdpbiIsCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlNvZnRPTVhQbHVnaW4uY3BwIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWworICAgICAgICAiaW5jbHVkZSIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJtZWRpYV9wbHVnaW5faGVhZGVycyIsCisgICAgXSwKKworICAgIGV4cG9ydF9oZWFkZXJfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3NvZnRvbXgiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVduby11bnVzZWQtcGFyYW1ldGVyIiwKKyAgICAgICAgIi1Xbm8tZG9jdW1lbnRhdGlvbiIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF9zb2Z0b214LWRlZmF1bHRzIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgIm1lZGlhX3BsdWdpbl9oZWFkZXJzIgorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHRfc29mdG9teCIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIG1pc2NfdW5kZWZpbmVkOiBbCisgICAgICAgICAgICAic2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICBdLAorICAgICAgICBjZmk6IHRydWUsCisgICAgfSwKKworICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCiB9CiAKIGNjX2xpYnJhcnlfc2hhcmVkIHsKQEAgLTExNyw2ICsyMjcsMyBAQAogICAgIGNmbGFnczogWyItV2FsbCIsICItV2Vycm9yIl0sCiB9CiAKLS8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1zdWJkaXJzID0gWyJ0ZXN0cyJdCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTMwYTQ2Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNywgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jZGVmaW5lIExPR19UQUcgIkJXR3JhcGhpY0J1ZmZlclNvdXJjZSIKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC9CV0dyYXBoaWNCdWZmZXJTb3VyY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KLSNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db21wb25lbnQuaD4KLSNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9JbmRleEV4dC5oPgotI2luY2x1ZGUgPG1lZGlhL09NWEJ1ZmZlci5oPgotI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3QgT01YX1UzMiBrUG9ydEluZGV4SW5wdXQgPSAwOwotCi1zdHJ1Y3QgQldHcmFwaGljQnVmZmVyU291cmNlOjpCV09teE5vZGVXcmFwcGVyIDogcHVibGljIElPbXhOb2RlV3JhcHBlciB7Ci0gICAgc3A8SU9NWE5vZGU+IG1PTVhOb2RlOwotCi0gICAgQldPbXhOb2RlV3JhcHBlcihjb25zdCBzcDxJT01YTm9kZT4gJm9teE5vZGUpOiBtT01YTm9kZShvbXhOb2RlKSB7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBlbXB0eUJ1ZmZlcigKLSAgICAgICAgICAgIGludDMyX3QgYnVmZmVySWQsIHVpbnQzMl90IGZsYWdzLAotICAgICAgICAgICAgY29uc3Qgc3A8R3JhcGhpY0J1ZmZlcj4gJmJ1ZmZlciwKLSAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wLCBpbnQgZmVuY2VGZCkgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gbU9NWE5vZGUtPmVtcHR5QnVmZmVyKGJ1ZmZlcklkLCBidWZmZXIsIGZsYWdzLCB0aW1lc3RhbXAsIGZlbmNlRmQpOwotICAgIH0KLQotICAgIHZpcnR1YWwgdm9pZCBkaXNwYXRjaERhdGFTcGFjZUNoYW5nZWQoCi0gICAgICAgICAgICBpbnQzMl90IGRhdGFTcGFjZSwgaW50MzJfdCBhc3BlY3RzLCBpbnQzMl90IHBpeGVsRm9ybWF0KSBvdmVycmlkZSB7Ci0gICAgICAgIG9teF9tZXNzYWdlIG1zZzsKLSAgICAgICAgbXNnLnR5cGUgPSBvbXhfbWVzc2FnZTo6RVZFTlQ7Ci0gICAgICAgIG1zZy5mZW5jZUZkID0gLTE7Ci0gICAgICAgIG1zZy51LmV2ZW50X2RhdGEuZXZlbnQgPSBPTVhfRXZlbnREYXRhU3BhY2VDaGFuZ2VkOwotICAgICAgICBtc2cudS5ldmVudF9kYXRhLmRhdGExID0gZGF0YVNwYWNlOwotICAgICAgICBtc2cudS5ldmVudF9kYXRhLmRhdGEyID0gYXNwZWN0czsKLSAgICAgICAgbXNnLnUuZXZlbnRfZGF0YS5kYXRhMyA9IHBpeGVsRm9ybWF0OwotICAgICAgICBtT01YTm9kZS0+ZGlzcGF0Y2hNZXNzYWdlKG1zZyk7Ci0gICAgfQotfTsKLQotc3RydWN0IEJXR3JhcGhpY0J1ZmZlclNvdXJjZTo6QldPTVhCdWZmZXJTb3VyY2UgOiBwdWJsaWMgQm5PTVhCdWZmZXJTb3VyY2UgewotICAgIHNwPE9teEdyYXBoaWNCdWZmZXJTb3VyY2U+IG1Tb3VyY2U7Ci0KLSAgICBCV09NWEJ1ZmZlclNvdXJjZShjb25zdCBzcDxPbXhHcmFwaGljQnVmZmVyU291cmNlPiAmc291cmNlKTogbVNvdXJjZShzb3VyY2UpIHsKLSAgICB9Ci0KLSAgICBTdGF0dXMgb25PbXhFeGVjdXRpbmcoKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBtU291cmNlLT5vbk9teEV4ZWN1dGluZygpOwotICAgIH0KLQotICAgIFN0YXR1cyBvbk9teElkbGUoKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBtU291cmNlLT5vbk9teElkbGUoKTsKLSAgICB9Ci0KLSAgICBTdGF0dXMgb25PbXhMb2FkZWQoKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBtU291cmNlLT5vbk9teExvYWRlZCgpOwotICAgIH0KLQotICAgIFN0YXR1cyBvbklucHV0QnVmZmVyQWRkZWQoaW50IGJ1ZmZlcklkKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBtU291cmNlLT5vbklucHV0QnVmZmVyQWRkZWQoYnVmZmVySWQpOwotICAgIH0KLQotICAgIFN0YXR1cyBvbklucHV0QnVmZmVyRW1wdGllZCgKLSAgICAgICAgICAgIGludCBidWZmZXJJZCwgY29uc3QgT01YRmVuY2VQYXJjZWxhYmxlJiBmZW5jZVBhcmNlbCkgb3ZlcnJpZGUgewotICAgICAgICByZXR1cm4gbVNvdXJjZS0+b25JbnB1dEJ1ZmZlckVtcHRpZWQoYnVmZmVySWQsIGZlbmNlUGFyY2VsLmdldCgpKTsKLSAgICB9Ci19OwotCi1CV0dyYXBoaWNCdWZmZXJTb3VyY2U6OkJXR3JhcGhpY0J1ZmZlclNvdXJjZSgKLSAgICAgICAgc3A8T214R3JhcGhpY0J1ZmZlclNvdXJjZT4gY29uc3QmIGJhc2UpIDoKLSAgICBtQmFzZShiYXNlKSwKLSAgICBtT01YQnVmZmVyU291cmNlKG5ldyBCV09NWEJ1ZmZlclNvdXJjZShiYXNlKSkgewotfQotCi06OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJXR3JhcGhpY0J1ZmZlclNvdXJjZTo6Y29uZmlndXJlKAotICAgICAgICBjb25zdCBzcDxJT01YTm9kZT4mIG9teE5vZGUsIGludDMyX3QgZGF0YVNwYWNlKSB7Ci0gICAgLy8gRG8gc2V0SW5wdXRTdXJmYWNlKCkgZmlyc3QsIHRoZSBub2RlIHdpbGwgdHJ5IHRvIGVuYWJsZSBtZXRhZGF0YQotICAgIC8vIG1vZGUgb24gaW5wdXQsIGFuZCBkb2VzIG5lY2Vzc2FyeSBlcnJvciBjaGVja2luZy4gSWYgdGhpcyBmYWlscywKLSAgICAvLyB3ZSBjYW4ndCB1c2UgdGhpcyBpbnB1dCBzdXJmYWNlIG9uIHRoZSBub2RlLgotICAgIHN0YXR1c190IGVyciA9IG9teE5vZGUtPnNldElucHV0U3VyZmFjZShtT01YQnVmZmVyU291cmNlKTsKLSAgICBpZiAoZXJyICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIEFMT0dFKCJVbmFibGUgdG8gc2V0IGlucHV0IHN1cmZhY2U6ICVkIiwgZXJyKTsKLSAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoZXJyKTsKLSAgICB9Ci0KLSAgICAvLyB1c2UgY29uc3VtZXIgdXNhZ2UgYml0cyBxdWVyaWVkIGZyb20gZW5jb2RlciwgYnV0IGFsd2F5cyBhZGQKLSAgICAvLyBIV19WSURFT19FTkNPREVSIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgotICAgIHVpbnQzMl90IGNvbnN1bWVyVXNhZ2U7Ci0gICAgaWYgKG9teE5vZGUtPmdldFBhcmFtZXRlcigKLSAgICAgICAgICAgIChPTVhfSU5ERVhUWVBFKU9NWF9JbmRleFBhcmFtQ29uc3VtZXJVc2FnZUJpdHMsCi0gICAgICAgICAgICAmY29uc3VtZXJVc2FnZSwgc2l6ZW9mKGNvbnN1bWVyVXNhZ2UpKSAhPSBPSykgewotICAgICAgICBjb25zdW1lclVzYWdlID0gMDsKLSAgICB9Ci0KLSAgICBPTVhfUEFSQU1fUE9SVERFRklOSVRJT05UWVBFIGRlZjsKLSAgICBJbml0T01YUGFyYW1zKCZkZWYpOwotICAgIGRlZi5uUG9ydEluZGV4ID0ga1BvcnRJbmRleElucHV0OwotCi0gICAgZXJyID0gb214Tm9kZS0+Z2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgT01YX0luZGV4UGFyYW1Qb3J0RGVmaW5pdGlvbiwgJmRlZiwgc2l6ZW9mKGRlZikpOwotICAgIGlmIChlcnIgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgcG9ydCBkZWZpbml0aW9uOiAlZCIsIGVycik7Ci0gICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKFVOS05PV05fRVJST1IpOwotICAgIH0KLQotICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1CYXNlLT5jb25maWd1cmUoCi0gICAgICAgICAgICAgIG5ldyBCV09teE5vZGVXcmFwcGVyKG9teE5vZGUpLAotICAgICAgICAgICAgICBkYXRhU3BhY2UsCi0gICAgICAgICAgICAgIGRlZi5uQnVmZmVyQ291bnRBY3R1YWwsCi0gICAgICAgICAgICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGgsCi0gICAgICAgICAgICAgIGRlZi5mb3JtYXQudmlkZW8ubkZyYW1lSGVpZ2h0LAotICAgICAgICAgICAgICBjb25zdW1lclVzYWdlKSk7Ci19Ci0KLTo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQldHcmFwaGljQnVmZmVyU291cmNlOjpzZXRTdXNwZW5kKAotICAgICAgICBib29sIHN1c3BlbmQsIGludDY0X3QgdGltZVVzKSB7Ci0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPnNldFN1c3BlbmQoc3VzcGVuZCwgdGltZVVzKSk7Ci19Ci0KLTo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQldHcmFwaGljQnVmZmVyU291cmNlOjpzZXRSZXBlYXRQcmV2aW91c0ZyYW1lRGVsYXlVcygKLSAgICAgICAgaW50NjRfdCByZXBlYXRBZnRlclVzKSB7Ci0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPnNldFJlcGVhdFByZXZpb3VzRnJhbWVEZWxheVVzKHJlcGVhdEFmdGVyVXMpKTsKLX0KLQotOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCV0dyYXBoaWNCdWZmZXJTb3VyY2U6OnNldE1heEZwcyhmbG9hdCBtYXhGcHMpIHsKLSAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtQmFzZS0+c2V0TWF4RnBzKG1heEZwcykpOwotfQotCi06OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJXR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0VGltZUxhcHNlQ29uZmlnKAotICAgICAgICBkb3VibGUgZnBzLCBkb3VibGUgY2FwdHVyZUZwcykgewotICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1CYXNlLT5zZXRUaW1lTGFwc2VDb25maWcoCi0gICAgICAgICAgICBmcHMsIGNhcHR1cmVGcHMpKTsKLX0KLQotOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCV0dyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFN0YXJ0VGltZVVzKAotICAgICAgICBpbnQ2NF90IHN0YXJ0VGltZVVzKSB7Ci0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPnNldFN0YXJ0VGltZVVzKHN0YXJ0VGltZVVzKSk7Ci19Ci0KLTo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQldHcmFwaGljQnVmZmVyU291cmNlOjpzZXRTdG9wVGltZVVzKAotICAgICAgICBpbnQ2NF90IHN0b3BUaW1lVXMpIHsKLSAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtQmFzZS0+c2V0U3RvcFRpbWVVcyhzdG9wVGltZVVzKSk7Ci19Ci0KLTo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQldHcmFwaGljQnVmZmVyU291cmNlOjpnZXRTdG9wVGltZU9mZnNldFVzKAotICAgICAgICBpbnQ2NF90ICpzdG9wVGltZU9mZnNldFVzKSB7Ci0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPmdldFN0b3BUaW1lT2Zmc2V0VXMoc3RvcFRpbWVPZmZzZXRVcykpOwotfQotCi06OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIEJXR3JhcGhpY0J1ZmZlclNvdXJjZTo6c2V0Q29sb3JBc3BlY3RzKAotICAgICAgICBpbnQzMl90IGFzcGVjdHMpIHsKLSAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChtQmFzZS0+c2V0Q29sb3JBc3BlY3RzKGFzcGVjdHMpKTsKLX0KLQotOjphbmRyb2lkOjpiaW5kZXI6OlN0YXR1cyBCV0dyYXBoaWNCdWZmZXJTb3VyY2U6OnNldFRpbWVPZmZzZXRVcygKLSAgICAgICAgaW50NjRfdCB0aW1lT2Zmc2V0c1VzKSB7Ci0gICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QobUJhc2UtPnNldFRpbWVPZmZzZXRVcyh0aW1lT2Zmc2V0c1VzKSk7Ci19Ci0KLTo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgQldHcmFwaGljQnVmZmVyU291cmNlOjpzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgewotICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKG1CYXNlLT5zaWduYWxFbmRPZklucHV0U3RyZWFtKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcAppbmRleCAwOTY3YjVmLi44YzVjYTZlIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmNwcApAQCAtMjksOCArMjksNyBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLU9NWE1hc3Rlcjo6T01YTWFzdGVyKCkKLSAgICA6IG1WZW5kb3JMaWJIYW5kbGUoTlVMTCkgeworT01YTWFzdGVyOjpPTVhNYXN0ZXIoKSB7CiAKICAgICBwaWRfdCBwaWQgPSBnZXRwaWQoKTsKICAgICBjaGFyIGZpbGVuYW1lWzIwXTsKQEAgLTUyLDQ3ICs1MSw1MiBAQAogICAgIH0KIAogICAgIGFkZFZlbmRvclBsdWdpbigpOwotICAgIGFkZFBsdWdpbihuZXcgU29mdE9NWFBsdWdpbik7CisgICAgYWRkUGxhdGZvcm1QbHVnaW4oKTsKIH0KIAogT01YTWFzdGVyOjp+T01YTWFzdGVyKCkgewogICAgIGNsZWFyUGx1Z2lucygpOwotCi0gICAgaWYgKG1WZW5kb3JMaWJIYW5kbGUgIT0gTlVMTCkgewotICAgICAgICBkbGNsb3NlKG1WZW5kb3JMaWJIYW5kbGUpOwotICAgICAgICBtVmVuZG9yTGliSGFuZGxlID0gTlVMTDsKLSAgICB9CiB9CiAKIHZvaWQgT01YTWFzdGVyOjphZGRWZW5kb3JQbHVnaW4oKSB7CiAgICAgYWRkUGx1Z2luKCJsaWJzdGFnZWZyaWdodGh3LnNvIik7CiB9CiAKLXZvaWQgT01YTWFzdGVyOjphZGRQbHVnaW4oY29uc3QgY2hhciAqbGlibmFtZSkgewotICAgIG1WZW5kb3JMaWJIYW5kbGUgPSBhbmRyb2lkX2xvYWRfc3BoYWxfbGlicmFyeShsaWJuYW1lLCBSVExEX05PVyk7Cit2b2lkIE9NWE1hc3Rlcjo6YWRkUGxhdGZvcm1QbHVnaW4oKSB7CisgICAgYWRkUGx1Z2luKCJsaWJzdGFnZWZyaWdodF9zb2Z0b214X3BsdWdpbi5zbyIpOworfQogCi0gICAgaWYgKG1WZW5kb3JMaWJIYW5kbGUgPT0gTlVMTCkgewordm9pZCBPTVhNYXN0ZXI6OmFkZFBsdWdpbihjb25zdCBjaGFyICpsaWJuYW1lKSB7CisgICAgdm9pZCAqbGliSGFuZGxlID0gYW5kcm9pZF9sb2FkX3NwaGFsX2xpYnJhcnkobGlibmFtZSwgUlRMRF9OT1cpOworCisgICAgaWYgKGxpYkhhbmRsZSA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICB0eXBlZGVmIE9NWFBsdWdpbkJhc2UgKigqQ3JlYXRlT01YUGx1Z2luRnVuYykoKTsKICAgICBDcmVhdGVPTVhQbHVnaW5GdW5jIGNyZWF0ZU9NWFBsdWdpbiA9CiAgICAgICAgIChDcmVhdGVPTVhQbHVnaW5GdW5jKWRsc3ltKAotICAgICAgICAgICAgICAgIG1WZW5kb3JMaWJIYW5kbGUsICJjcmVhdGVPTVhQbHVnaW4iKTsKKyAgICAgICAgICAgICAgICBsaWJIYW5kbGUsICJjcmVhdGVPTVhQbHVnaW4iKTsKICAgICBpZiAoIWNyZWF0ZU9NWFBsdWdpbikKICAgICAgICAgY3JlYXRlT01YUGx1Z2luID0gKENyZWF0ZU9NWFBsdWdpbkZ1bmMpZGxzeW0oCi0gICAgICAgICAgICAgICAgbVZlbmRvckxpYkhhbmRsZSwgIl9aTjdhbmRyb2lkMTVjcmVhdGVPTVhQbHVnaW5FdiIpOworICAgICAgICAgICAgICAgIGxpYkhhbmRsZSwgIl9aTjdhbmRyb2lkMTVjcmVhdGVPTVhQbHVnaW5FdiIpOwogCisgICAgT01YUGx1Z2luQmFzZSAqcGx1Z2luID0gbnVsbHB0cjsKICAgICBpZiAoY3JlYXRlT01YUGx1Z2luKSB7Ci0gICAgICAgIGFkZFBsdWdpbigoKmNyZWF0ZU9NWFBsdWdpbikoKSk7CisgICAgICAgIHBsdWdpbiA9ICgqY3JlYXRlT01YUGx1Z2luKSgpOworICAgIH0KKworICAgIGlmIChwbHVnaW4pIHsKKyAgICAgICAgbVBsdWdpbnMucHVzaF9iYWNrKHsgcGx1Z2luLCBsaWJIYW5kbGUgfSk7CisgICAgICAgIGFkZFBsdWdpbihwbHVnaW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIGFuZHJvaWRfdW5sb2FkX3NwaGFsX2xpYnJhcnkobGliSGFuZGxlKTsKICAgICB9CiB9CiAKIHZvaWQgT01YTWFzdGVyOjphZGRQbHVnaW4oT01YUGx1Z2luQmFzZSAqcGx1Z2luKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGF1dG9Mb2NrKG1Mb2NrKTsKIAotICAgIG1QbHVnaW5zLnB1c2hfYmFjayhwbHVnaW4pOwotCiAgICAgT01YX1UzMiBpbmRleCA9IDA7CiAKICAgICBjaGFyIG5hbWVbMTI4XTsKQEAgLTEyMCwyMCArMTI0LDIwIEBACiB2b2lkIE9NWE1hc3Rlcjo6Y2xlYXJQbHVnaW5zKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBhdXRvTG9jayhtTG9jayk7CiAKLSAgICB0eXBlZGVmIHZvaWQgKCpEZXN0cm95T01YUGx1Z2luRnVuYykoT01YUGx1Z2luQmFzZSopOwotICAgIERlc3Ryb3lPTVhQbHVnaW5GdW5jIGRlc3Ryb3lPTVhQbHVnaW4gPQotICAgICAgICAoRGVzdHJveU9NWFBsdWdpbkZ1bmMpZGxzeW0oCi0gICAgICAgICAgICAgICAgbVZlbmRvckxpYkhhbmRsZSwgImRlc3Ryb3lPTVhQbHVnaW4iKTsKLQogICAgIG1QbHVnaW5CeUNvbXBvbmVudE5hbWUuY2xlYXIoKTsKKyAgICBtUGx1Z2luQnlJbnN0YW5jZS5jbGVhcigpOwogCi0gICAgZm9yIChMaXN0PE9NWFBsdWdpbkJhc2UgKj46Oml0ZXJhdG9yIGl0ID0gbVBsdWdpbnMuYmVnaW4oKTsKLSAgICAgICAgICAgIGl0ICE9IG1QbHVnaW5zLmVuZCgpOyArK2l0KSB7CisgICAgdHlwZWRlZiB2b2lkICgqRGVzdHJveU9NWFBsdWdpbkZ1bmMpKE9NWFBsdWdpbkJhc2UqKTsKKyAgICBmb3IgKGNvbnN0IFBsdWdpbiAmcGx1Z2luIDogbVBsdWdpbnMpIHsKKyAgICAgICAgRGVzdHJveU9NWFBsdWdpbkZ1bmMgZGVzdHJveU9NWFBsdWdpbiA9CisgICAgICAgICAgICAoRGVzdHJveU9NWFBsdWdpbkZ1bmMpZGxzeW0oCisgICAgICAgICAgICAgICAgICAgIHBsdWdpbi5tTGliSGFuZGxlLCAiZGVzdHJveU9NWFBsdWdpbiIpOwogICAgICAgICBpZiAoZGVzdHJveU9NWFBsdWdpbikKLSAgICAgICAgICAgIGRlc3Ryb3lPTVhQbHVnaW4oKml0KTsKKyAgICAgICAgICAgIGRlc3Ryb3lPTVhQbHVnaW4ocGx1Z2luLm1PbXgpOwogICAgICAgICBlbHNlCi0gICAgICAgICAgICBkZWxldGUgKml0OwotICAgICAgICAqaXQgPSBOVUxMOworICAgICAgICAgICAgZGVsZXRlIHBsdWdpbi5tT214OworCisgICAgICAgIGFuZHJvaWRfdW5sb2FkX3NwaGFsX2xpYnJhcnkocGx1Z2luLm1MaWJIYW5kbGUpOwogICAgIH0KIAogICAgIG1QbHVnaW5zLmNsZWFyKCk7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YTm9kZUluc3RhbmNlLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCmluZGV4IGQ3YWFjZmYuLmRkYjRiYTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhOb2RlSW5zdGFuY2UuY3BwCkBAIC0zMywxMiArMzMsMTMgQEAKIAogI2luY2x1ZGUgPGJpbmRlci9JTWVtb3J5Lmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KLSNpbmNsdWRlIDxndWkvQnVmZmVyUXVldWUuaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9IYXJkd2FyZUFQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9Db2xvclV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFcnJvcnMuaD4KKyNpbmNsdWRlIDx1aS9HcmFwaGljQnVmZmVyLmg+CisjaW5jbHVkZSA8dWkvRmVuY2UuaD4KICNpbmNsdWRlIDx1dGlscy9taXNjLmg+CiAjaW5jbHVkZSA8dXRpbHMvTmF0aXZlSGFuZGxlLmg+CiAjaW5jbHVkZSA8bWVkaWEvT01YQnVmZmVyLmg+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmNwcAppbmRleCA5ZWQ0YTk5Li4xYjg0OTNhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9PTVhVdGlscy5jcHAKQEAgLTE1MCw2ICsxNTAsOCBAQAogICAgICAgICAgICAgInZpZGVvX2RlY29kZXIudnA4IiwgInZpZGVvX2VuY29kZXIudnA4IiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSwKICAgICAgICAgICAgICJ2aWRlb19kZWNvZGVyLnZwOSIsICJ2aWRlb19lbmNvZGVyLnZwOSIgfSwKKyAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9WSURFT19BVjEsCisgICAgICAgICAgICAidmlkZW9fZGVjb2Rlci5hdjEiLCAidmlkZW9fZW5jb2Rlci5hdjEiIH0sCiAgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fUkFXLAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIucmF3IiwgImF1ZGlvX2VuY29kZXIucmF3IiB9LAogICAgICAgICB7IE1FRElBX01JTUVUWVBFX1ZJREVPX0RPTEJZX1ZJU0lPTiwKQEAgLTE2NCw2ICsxNjYsMTAgQEAKICAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmFjMyIsICJhdWRpb19lbmNvZGVyLmFjMyIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9BVURJT19FQUMzLAogICAgICAgICAgICAgImF1ZGlvX2RlY29kZXIuZWFjMyIsICJhdWRpb19lbmNvZGVyLmVhYzMiIH0sCisgICAgICAgIHsgTUVESUFfTUlNRVRZUEVfQVVESU9fRUFDM19KT0MsCisgICAgICAgICAgICAiYXVkaW9fZGVjb2Rlci5lYWMzX2pvYyIsICJhdWRpb19lbmNvZGVyLmVhYzNfam9jIiB9LAorICAgICAgICB7IE1FRElBX01JTUVUWVBFX0FVRElPX0FDNCwKKyAgICAgICAgICAgICJhdWRpb19kZWNvZGVyLmFjNCIsICJhdWRpb19lbmNvZGVyLmFjNCIgfSwKICAgICAgICAgeyBNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMsCiAgICAgICAgICAgICAiaW1hZ2VfZGVjb2Rlci5oZWljIiwgImltYWdlX2VuY29kZXIuaGVpYyIgfSwKICAgICB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuY3BwCmluZGV4IDU1YWZlMDQuLmRkYjQ1OWYgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5jcHAKQEAgLTM0LDcgKzM0LDggQEAKICAgICAgIG1Mb29wZXIobmV3IEFMb29wZXIpLAogICAgICAgbUhhbmRsZXIobmV3IEFIYW5kbGVyUmVmbGVjdG9yPFNpbXBsZVNvZnRPTVhDb21wb25lbnQ+KHRoaXMpKSwKICAgICAgIG1TdGF0ZShPTVhfU3RhdGVMb2FkZWQpLAotICAgICAgbVRhcmdldFN0YXRlKE9NWF9TdGF0ZUxvYWRlZCkgeworICAgICAgbVRhcmdldFN0YXRlKE9NWF9TdGF0ZUxvYWRlZCksCisgICAgICBtRnJhbWVDb25maWcoZmFsc2UpIHsKICAgICBtTG9vcGVyLT5zZXROYW1lKG5hbWUpOwogICAgIG1Mb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CiAKQEAgLTIwNCw2ICsyMDUsMjEgQEAKICAgICB9CiB9CiAKK09NWF9FUlJPUlRZUEUgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6aW50ZXJuYWxTZXRDb25maWcoCisgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zLCBib29sICpmcmFtZUNvbmZpZykgeworICAgIHJldHVybiBPTVhfRXJyb3JVbmRlZmluZWQ7Cit9CisKK09NWF9FUlJPUlRZUEUgU2ltcGxlU29mdE9NWENvbXBvbmVudDo6c2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcykgeworICAgIGJvb2wgZnJhbWVDb25maWcgPSBtRnJhbWVDb25maWc7CisgICAgT01YX0VSUk9SVFlQRSBlcnIgPSBpbnRlcm5hbFNldENvbmZpZyhpbmRleCwgcGFyYW1zLCAmZnJhbWVDb25maWcpOworICAgIGlmIChlcnIgPT0gT01YX0Vycm9yTm9uZSkgeworICAgICAgICBtRnJhbWVDb25maWcgPSBmcmFtZUNvbmZpZzsKKyAgICB9CisgICAgcmV0dXJuIGVycjsKK30KKwogT01YX0VSUk9SVFlQRSBTaW1wbGVTb2Z0T01YQ29tcG9uZW50Ojp1c2VCdWZmZXIoCiAgICAgICAgIE9NWF9CVUZGRVJIRUFERVJUWVBFICoqaGVhZGVyLAogICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKQEAgLTMzNiw2ICszNTIsMTAgQEAKICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmJ1ZmZlcikgewogICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRFbXB0eVRoaXNCdWZmZXIsIG1IYW5kbGVyKTsKICAgICBtc2ctPnNldFBvaW50ZXIoImhlYWRlciIsIGJ1ZmZlcik7CisgICAgaWYgKG1GcmFtZUNvbmZpZykgeworICAgICAgICBtc2ctPnNldEludDMyKCJmcmFtZS1jb25maWciLCBtRnJhbWVDb25maWcpOworICAgICAgICBtRnJhbWVDb25maWcgPSBmYWxzZTsKKyAgICB9CiAgICAgbXNnLT5wb3N0KCk7CiAKICAgICByZXR1cm4gT01YX0Vycm9yTm9uZTsKQEAgLTM3OCw2ICszOTgsMTAgQEAKICAgICAgICAgewogICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKmhlYWRlcjsKICAgICAgICAgICAgIENIRUNLKG1zZy0+ZmluZFBvaW50ZXIoImhlYWRlciIsICh2b2lkICoqKSZoZWFkZXIpKTsKKyAgICAgICAgICAgIGludDMyX3QgZnJhbWVDb25maWc7CisgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJmcmFtZS1jb25maWciLCAmZnJhbWVDb25maWcpKSB7CisgICAgICAgICAgICAgICAgZnJhbWVDb25maWcgPSAwOworICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBDSEVDSyhtU3RhdGUgPT0gT01YX1N0YXRlRXhlY3V0aW5nICYmIG1UYXJnZXRTdGF0ZSA9PSBtU3RhdGUpOwogCkBAIC0zOTMsNiArNDE3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgQ0hFQ0soIWJ1ZmZlci0+bU93bmVkQnlVcyk7CiAKICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tT3duZWRCeVVzID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5tRnJhbWVDb25maWcgPSAoYm9vbClmcmFtZUNvbmZpZzsKIAogICAgICAgICAgICAgICAgICAgICBDSEVDSygobXNnVHlwZSA9PSBrV2hhdEVtcHR5VGhpc0J1ZmZlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHBvcnQtPm1EZWYuZURpciA9PSBPTVhfRGlySW5wdXQpCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdE9NWFBsdWdpbi5jcHAKaW5kZXggMWYzZThjMS4uYTcyMGJjOSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRPTVhQbHVnaW4uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0T01YUGx1Z2luLmNwcApAQCAtNzEsNiArNzEsMTYgQEAKIHN0YXRpYyBjb25zdCBzaXplX3Qga051bUNvbXBvbmVudHMgPQogICAgIHNpemVvZihrQ29tcG9uZW50cykgLyBzaXplb2Yoa0NvbXBvbmVudHNbMF0pOwogCitleHRlcm4gIkMiIE9NWFBsdWdpbkJhc2UqIGNyZWF0ZU9NWFBsdWdpbigpIHsKKyAgICBBTE9HSSgiY3JlYXRlT01YUGx1Z2luIik7CisgICAgcmV0dXJuIG5ldyBTb2Z0T01YUGx1Z2luKCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBkZXN0cm95T01YUGx1Z2luKE9NWFBsdWdpbkJhc2UqIHBsdWdpbikgeworICAgIEFMT0dJKCJkZXN0cm95T01YUGx1Z2luIik7CisgICAgZGVsZXRlIHBsdWdpbjsKK30KKwogU29mdE9NWFBsdWdpbjo6U29mdE9NWFBsdWdpbigpIHsKIH0KIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuY3BwCmluZGV4IDkzNWRjMzQuLmU4NTNkYTkgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5jcHAKQEAgLTE1NCwxMiArMTU0LDEyIEBACiAgICAgb3V0RGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBvdXRwdXRCdWZmZXJXaWR0aCgpOwogICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodCA9IG91dHB1dEJ1ZmZlckhlaWdodCgpOwogICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLmVDb2xvckZvcm1hdCA9IG1PdXRwdXRGb3JtYXQ7Ci0gICAgb3V0RGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSA9IG91dERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZVdpZHRoOwogICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCA9IG91dERlZi0+Zm9ybWF0LnZpZGVvLm5GcmFtZUhlaWdodDsKIAogICAgIGludDMyX3QgYnBwID0gKG1PdXRwdXRGb3JtYXQgPT0gT01YX0NPTE9SX0Zvcm1hdFlVVjQyMFBsYW5hcjE2KSA/IDIgOiAxOworICAgIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgPSBvdXREZWYtPmZvcm1hdC52aWRlby5uRnJhbWVXaWR0aCAqIGJwcDsKICAgICBvdXREZWYtPm5CdWZmZXJTaXplID0KLSAgICAgICAgKG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TdHJpZGUgKiBvdXREZWYtPmZvcm1hdC52aWRlby5uU2xpY2VIZWlnaHQgKiBicHAgKiAzKSAvIDI7CisgICAgICAgICAgICAob3V0RGVmLT5mb3JtYXQudmlkZW8ublN0cmlkZSAqIG91dERlZi0+Zm9ybWF0LnZpZGVvLm5TbGljZUhlaWdodCAqIDMpIC8gMjsKIAogICAgIE9NWF9QQVJBTV9QT1JUREVGSU5JVElPTlRZUEUgKmluRGVmID0gJmVkaXRQb3J0SW5mbyhrSW5wdXRQb3J0SW5kZXgpLT5tRGVmOwogICAgIGluRGVmLT5mb3JtYXQudmlkZW8ubkZyYW1lV2lkdGggPSBtV2lkdGg7CkBAIC01MDIsNyArNTAyLDggQEAKICAgICAgICAgICAgIC8vIFRoZXNlIHZhbHVlcyB3ZXJlIGNob3NlbiB0byBwcmV2ZW50IGludGVnZXIgb3ZlcmZsb3dzIGZ1cnRoZXIgZG93biB0aGUgbGluZSwgYW5kIGRvCiAgICAgICAgICAgICAvLyBub3QgaW5kaWNhdGUgc3VwcG9ydCBmb3IgMzJreDMyayB2aWRlby4KICAgICAgICAgICAgIGlmIChuZXdXaWR0aCA+IDMyNzY4IHx8IG5ld0hlaWdodCA+IDMyNzY4Ci0gICAgICAgICAgICAgICAgICAgIHx8IHZpZGVvX2RlZi0+blN0cmlkZSA+IDMyNzY4IHx8IHZpZGVvX2RlZi0+blNsaWNlSGVpZ2h0ID4gMzI3NjgpIHsKKyAgICAgICAgICAgICAgICAgICAgfHwgdmlkZW9fZGVmLT5uU3RyaWRlID4gMzI3NjggfHwgdmlkZW9fZGVmLT5uU3RyaWRlIDwgLTMyNzY4CisgICAgICAgICAgICAgICAgICAgIHx8IHZpZGVvX2RlZi0+blNsaWNlSGVpZ2h0ID4gMzI3NjgpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiYi8yMjg4NTQyMSIpOwogICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JCYWRQYXJhbWV0ZXI7CiAgICAgICAgICAgICB9CkBAIC02MDEsMTMgKzYwMiw0MCBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFzdXBwb3J0RGVzY3JpYmVIZHIxMFBsdXNJbmZvKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKG1IZHIxMFBsdXNPdXRwdXRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICBhdXRvIGl0ID0gbUhkcjEwUGx1c091dHB1dHMuYmVnaW4oKTsKKworICAgICAgICAgICAgICAgIGF1dG8gaW5mbyA9ICgqaXQpLmdldCgpOworCisgICAgICAgICAgICAgICAgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zKiBvdXRQYXJhbXMgPQorICAgICAgICAgICAgICAgICAgICAgICAgKERlc2NyaWJlSERSMTBQbHVzSW5mb1BhcmFtcyAqKXBhcmFtczsKKworICAgICAgICAgICAgICAgIG91dFBhcmFtcy0+blBhcmFtU2l6ZVVzZWQgPSBpbmZvLT5zaXplKCk7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYnVmZmVyIHByb3ZpZGVkIGJ5IHRoZSBjbGllbnQgZG9lcyBub3QgaGF2ZSBlbm91Z2gKKyAgICAgICAgICAgICAgICAvLyBzdG9yYWdlLCByZXR1cm4gdGhlIHNpemUgb25seSBhbmQgZG8gbm90IHJlbW92ZSB0aGUgcGFyYW0geWV0LgorICAgICAgICAgICAgICAgIGlmIChvdXRQYXJhbXMtPm5QYXJhbVNpemUgPj0gaW5mby0+c2l6ZSgpKSB7CisgICAgICAgICAgICAgICAgICAgIG1lbWNweShvdXRQYXJhbXMtPm5WYWx1ZSwgaW5mby0+ZGF0YSgpLCBpbmZvLT5zaXplKCkpOworICAgICAgICAgICAgICAgICAgICBtSGRyMTBQbHVzT3V0cHV0cy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuZGVyZmxvdzsKKyAgICAgICAgfQorCiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKICAgICB9CiB9CiAKLU9NWF9FUlJPUlRZUEUgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6c2V0Q29uZmlnKAotICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyl7CitPTVhfRVJST1JUWVBFIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmludGVybmFsU2V0Q29uZmlnKAorICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpewogICAgIHN3aXRjaCAoKGludClpbmRleCkgewogICAgICAgICBjYXNlIGtEZXNjcmliZUNvbG9yQXNwZWN0c0luZGV4OgogICAgICAgICB7CkBAIC02NTcsMTEgKzY4NSw1NSBAQAogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgICAgIH0KIAorICAgICAgICBjYXNlIGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleDoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCFzdXBwb3J0RGVzY3JpYmVIZHIxMFBsdXNJbmZvKCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gT01YX0Vycm9yVW5zdXBwb3J0ZWRJbmRleDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgY29uc3QgRGVzY3JpYmVIRFIxMFBsdXNJbmZvUGFyYW1zKiBpblBhcmFtcyA9CisgICAgICAgICAgICAgICAgICAgIChEZXNjcmliZUhEUjEwUGx1c0luZm9QYXJhbXMgKilwYXJhbXM7CisKKyAgICAgICAgICAgIGlmICgqZnJhbWVDb25maWcpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgcmVxdWVzdCB0byBhcHBlbmQgdG8gdGhlIGN1cnJlbnQgZnJhbWUgY29uZmlnIHNldC4KKyAgICAgICAgICAgICAgICAvLyBGb3Igbm93LCB3ZSBvbmx5IHN1cHBvcnQga0Rlc2NyaWJlSGRyMTBQbHVzSW5mb0luZGV4LCB3aGljaAorICAgICAgICAgICAgICAgIC8vIHdlIHNpbXBseSByZXBsYWNlIHdpdGggdGhlIGxhc3Qgc2V0IHZhbHVlLgorICAgICAgICAgICAgICAgIGlmIChtSGRyMTBQbHVzSW5wdXRzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgKigtLW1IZHIxMFBsdXNJbnB1dHMuZW5kKCkpID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluUGFyYW1zLT5uVmFsdWUsIGluUGFyYW1zLT5uUGFyYW1TaXplVXNlZCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIklnbm9yaW5nIGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleDogYXBwZW5kIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZnJhbWUgY29uZmlnIHdoaWxlIG5vIGZyYW1lIGNvbmZpZyBpcyBwcmVzZW50Iik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGEgZnJhbWUgY29uZmlnLCBzZXR0aW5nICpmcmFtZUNvbmZpZyB0byB0cnVlIHNvIHRoYXQKKyAgICAgICAgICAgICAgICAvLyB0aGUgY2xpZW50IG1hcmtzIHRoZSBuZXh0IHF1ZXVlZCBpbnB1dCBmcmFtZSB0byBhcHBseSBpdC4KKyAgICAgICAgICAgICAgICAqZnJhbWVDb25maWcgPSB0cnVlOworICAgICAgICAgICAgICAgIG1IZHIxMFBsdXNJbnB1dHMucHVzaF9iYWNrKEFCdWZmZXI6OkNyZWF0ZUFzQ29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGluUGFyYW1zLT5uVmFsdWUsIGluUGFyYW1zLT5uUGFyYW1TaXplVXNlZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CisgICAgICAgIH0KKwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIE9NWF9FcnJvclVuc3VwcG9ydGVkSW5kZXg7CiAgICAgfQogfQogCitzcDxBQnVmZmVyPiBTb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50OjpkZXF1ZXVlSW5wdXRGcmFtZUNvbmZpZygpIHsKKyAgICBhdXRvIGl0ID0gbUhkcjEwUGx1c0lucHV0cy5iZWdpbigpOworICAgIHNwPEFCdWZmZXI+IGluZm8gPSAqaXQ7CisgICAgbUhkcjEwUGx1c0lucHV0cy5lcmFzZShpdCk7CisgICAgcmV0dXJuIGluZm87Cit9CisKK3ZvaWQgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6cXVldWVPdXRwdXRGcmFtZUNvbmZpZyhjb25zdCBzcDxBQnVmZmVyPiAmaW5mbykgeworICAgIG1IZHIxMFBsdXNPdXRwdXRzLnB1c2hfYmFjayhpbmZvKTsKKyAgICBub3RpZnkoT01YX0V2ZW50Q29uZmlnVXBkYXRlLAorICAgICAgICAgICBrT3V0cHV0UG9ydEluZGV4LAorICAgICAgICAgICBrRGVzY3JpYmVIZHIxMFBsdXNJbmZvSW5kZXgsCisgICAgICAgICAgIE5VTEwpOworfQogCiBPTVhfRVJST1JUWVBFIFNvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQ6OmdldEV4dGVuc2lvbkluZGV4KAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBPTVhfSU5ERVhUWVBFICppbmRleCkgewpAQCAtNjc2LDYgKzc0OCwxMCBAQAogICAgICAgICAgICAgJiYgc3VwcG9ydERlc2NyaWJlSGRyU3RhdGljSW5mbygpKSB7CiAgICAgICAgICooaW50MzJfdCopaW5kZXggPSBrRGVzY3JpYmVIZHJTdGF0aWNJbmZvSW5kZXg7CiAgICAgICAgIHJldHVybiBPTVhfRXJyb3JOb25lOworICAgIH0gZWxzZSBpZiAoIXN0cmNtcChuYW1lLCAiT01YLmdvb2dsZS5hbmRyb2lkLmluZGV4LmRlc2NyaWJlSERSMTBQbHVzSW5mbyIpCisgICAgICAgICAgICAmJiBzdXBwb3J0RGVzY3JpYmVIZHIxMFBsdXNJbmZvKCkpIHsKKyAgICAgICAgKihpbnQzMl90KilpbmRleCA9IGtEZXNjcmliZUhkcjEwUGx1c0luZm9JbmRleDsKKyAgICAgICAgcmV0dXJuIE9NWF9FcnJvck5vbmU7CiAgICAgfQogCiAgICAgcmV0dXJuIFNpbXBsZVNvZnRPTVhDb21wb25lbnQ6OmdldEV4dGVuc2lvbkluZGV4KG5hbWUsIGluZGV4KTsKQEAgLTY5Myw2ICs3NjksMTAgQEAKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKK2Jvb2wgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6c3VwcG9ydERlc2NyaWJlSGRyMTBQbHVzSW5mbygpIHsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIHZvaWQgU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudDo6b25SZXNldCgpIHsKICAgICBtT3V0cHV0UG9ydFNldHRpbmdzQ2hhbmdlID0gTk9ORTsKIH0KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmNwcAppbmRleCAyZmJiYjQ0Li5kNzVhY2RhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuY3BwCkBAIC01NTksNyArNTU5LDcgQEAKICAgICAgICAgaWYgKG5hdGl2ZU1ldGEubkZlbmNlRmQgPj0gMCkgewogICAgICAgICAgICAgc3A8RmVuY2U+IGZlbmNlID0gbmV3IEZlbmNlKG5hdGl2ZU1ldGEubkZlbmNlRmQpOwogICAgICAgICAgICAgbmF0aXZlTWV0YS5uRmVuY2VGZCA9IC0xOwotICAgICAgICAgICAgc3RhdHVzX3QgZXJyID0gZmVuY2UtPndhaXQoSU9NWDo6a0ZlbmNlVGltZW91dE1zKTsKKyAgICAgICAgICAgIHN0YXR1c190IGVyciA9IGZlbmNlLT53YWl0KGtGZW5jZVRpbWVvdXRNcyk7CiAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIlRpbWVkIG91dCB3YWl0aW5nIG9uIGlucHV0IGZlbmNlIik7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL0NvbnZlcnNpb24uaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCmluZGV4IGE5ZmNlNTUuLjk2Njk2NzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvQ29udmVyc2lvbi5oCkBAIC0xNCw4ICsxNCw4IEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaWZuZGVmIEFORFJPSURfSEFSRFdBUkVfTUVESUFfT01YX1YxXzBfX0NPTlZFUlNJT05fSAotI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX09NWF9WMV8wX19DT05WRVJTSU9OX0gKKyNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9PTVhfVjFfMF9JTVBMX0NPTlZFUlNJT05fSAorI2RlZmluZSBBTkRST0lEX0hBUkRXQVJFX01FRElBX09NWF9WMV8wX0lNUExfQ09OVkVSU0lPTl9ICiAKICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8bGlzdD4KQEAgLTI5LDE1ICsyOSwxNSBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0JpbmRlci5oPgogI2luY2x1ZGUgPGJpbmRlci9TdGF0dXMuaD4KKyNpbmNsdWRlIDx1aS9CdWZmZXJRdWV1ZURlZnMuaD4KICNpbmNsdWRlIDx1aS9GZW5jZVRpbWUuaD4KICNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgotI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9PTVhGZW5jZVBhcmNlbGFibGUuaD4KICNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9vbXgvMS4wL0NvbnZlcnNpb24uaD4KICNpbmNsdWRlIDxtZWRpYS9oYXJkd2FyZS9WaWRlb0FQSS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvYnFoZWxwZXIvQ29udmVyc2lvbi5oPgogCiAjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21lbW9yeS8xLjAvSU1lbW9yeS5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lQcm9kdWNlckxpc3RlbmVyLmg+CkBAIC05OSwxNiArOTksOSBAQAogCiB0eXBlZGVmIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6SUdyYXBoaWNCdWZmZXJQcm9kdWNlcgogICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwotdHlwZWRlZiA6OmFuZHJvaWQ6OklHcmFwaGljQnVmZmVyUHJvZHVjZXIKLSAgICAgICAgQkdyYXBoaWNCdWZmZXJQcm9kdWNlcjsKIAotLy8gV2Ugd2FudCB0byB1c2UgYWxsIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbiA6OmFuZHJvaWQ6OmNvbnZlcnNpb24KLXVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmNvbnZlcnNpb247Ci0KLS8vIE5vdyBzcGVjaWZpY2FsbHkgaW5qZWN0IHRoZXNlIHR3byBmdW5jdGlvbnMgaGVyZSwgYmVjYXVzZSB3ZSdyZSBnb2luZyB0bwotLy8gZGVjbGFyZSBmdW5jdGlvbnMgd2l0aCB0aGUgc2FtZSBuYW1lIGluIHRoaXMgbmFtZXNwYWNlLgotdXNpbmcgOjphbmRyb2lkOjpjb252ZXJzaW9uOjpjb252ZXJ0VG87Ci11c2luZyA6OmFuZHJvaWQ6OmNvbnZlcnNpb246OnRvU3RhdHVzVDsKKy8vIFVzZSB0aGUgY29udmVyc2lvbiBmdW5jdGlvbnMgZnJvbSBsaWJtZWRpYV9vbXggc28gdGhhdCB3ZSBkb24ndCBuZWVkIGxpYmd1aQordXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA6OnV0aWxzOwogCiAvKioKICAqIENvbnZlcnNpb24gZnVuY3Rpb25zCkBAIC0xNDMsNTcgKzEzNiw2IEBACiAgKi8KIAogLyoqCi0gKiBcYnJpZWYgQ29udmVydCBgU3RhdHVzYCB0byBgc3RhdHVzX3RgLiBUaGlzIGlzIGZvciBsZWdhY3kgYmluZGVyIGNhbGxzLgotICoKLSAqIFxwYXJhbVtpbl0gdCBUaGUgc291cmNlIGBTdGF0dXNgLgotICogXHJldHVybiB0aGUgY29ycmVzcG9uZGluZyBgc3RhdHVzX3RgLgotICovCi0vLyBjb252ZXJ0OiBTdGF0dXMgLT4gc3RhdHVzX3QKLWlubGluZSBzdGF0dXNfdCB0b1N0YXR1c1QoU3RhdHVzIGNvbnN0JiB0KSB7Ci0gICAgc3dpdGNoICh0KSB7Ci0gICAgY2FzZSBTdGF0dXM6Ok5PX0VSUk9SOgotICAgIGNhc2UgU3RhdHVzOjpOQU1FX05PVF9GT1VORDoKLSAgICBjYXNlIFN0YXR1czo6V09VTERfQkxPQ0s6Ci0gICAgY2FzZSBTdGF0dXM6Ok5PX01FTU9SWToKLSAgICBjYXNlIFN0YXR1czo6QUxSRUFEWV9FWElTVFM6Ci0gICAgY2FzZSBTdGF0dXM6Ok5PX0lOSVQ6Ci0gICAgY2FzZSBTdGF0dXM6OkJBRF9WQUxVRToKLSAgICBjYXNlIFN0YXR1czo6REVBRF9PQkpFQ1Q6Ci0gICAgY2FzZSBTdGF0dXM6OklOVkFMSURfT1BFUkFUSU9OOgotICAgIGNhc2UgU3RhdHVzOjpUSU1FRF9PVVQ6Ci0gICAgY2FzZSBTdGF0dXM6OkVSUk9SX1VOU1VQUE9SVEVEOgotICAgIGNhc2UgU3RhdHVzOjpVTktOT1dOX0VSUk9SOgotICAgIGNhc2UgU3RhdHVzOjpSRUxFQVNFX0FMTF9CVUZGRVJTOgotICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RhdHVzX3Q+KHQpOwotICAgIGNhc2UgU3RhdHVzOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OOgotICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dXKCJVbnJlY29nbml6ZWQgc3RhdHVzIHZhbHVlOiAlIiBQUklkMzIsIHN0YXRpY19jYXN0PGludDMyX3Q+KHQpKTsKLSAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHN0YXR1c190Pih0KTsKLSAgICB9Ci19Ci0KLS8qKgotICogXGJyaWVmIENvbnZlcnQgYFJldHVybjxTdGF0dXM+YCB0byBgc3RhdHVzX3RgLiBUaGlzIGlzIGZvciBsZWdhY3kgYmluZGVyCi0gKiBjYWxscy4KLSAqCi0gKiBccGFyYW1baW5dIHQgVGhlIHNvdXJjZSBgUmV0dXJuPFN0YXR1cz5gLgotICogXHJldHVybiBUaGUgY29ycmVzcG9uZGluZyBgc3RhdHVzX3RgLgotICoKLSAqIFRoaXMgZnVuY3Rpb24gZmlyc3QgY2hlY2sgaWYgXHAgdCBoYXMgYSB0cmFuc3BvcnQgZXJyb3IuIElmIGl0IGRvZXMsIHRoZW4gdGhlCi0gKiByZXR1cm4gdmFsdWUgaXMgdGhlIHRyYW5zcG9ydCBlcnJvciBjb2RlLiBPdGhlcndpc2UsIHRoZSByZXR1cm4gdmFsdWUgaXMKLSAqIGNvbnZlcnRlZCBmcm9tIGBTdGF0dXNgIGNvbnRhaW5lZCBpbnNpZGUgXHAgdC4KLSAqCi0gKiBOb3RlOgotICogLSBUaGlzIGBTdGF0dXNgIGlzIG9teC1zcGVjaWZpYy4gSXQgaXMgZGVmaW5lZCBpbiBgdHlwZXMuaGFsYC4KLSAqIC0gVGhlIG5hbWUgb2YgdGhpcyBmdW5jdGlvbiBpcyBub3QgYGNvbnZlcnRgLgotICovCi0vLyBjb252ZXJ0OiBTdGF0dXMgLT4gc3RhdHVzX3QKLWlubGluZSBzdGF0dXNfdCB0b1N0YXR1c1QoUmV0dXJuPFN0YXR1cz4gY29uc3QmIHQpIHsKLSAgICByZXR1cm4gdC5pc09rKCkgPyB0b1N0YXR1c1Qoc3RhdGljX2Nhc3Q8U3RhdHVzPih0KSkgOiBVTktOT1dOX0VSUk9SOwotfQotCi0vKioKICAqIFxicmllZiBDb252ZXJ0IGBzdGF0dXNfdGAgdG8gYFN0YXR1c2AuCiAgKgogICogXHBhcmFtW2luXSBsIFRoZSBzb3VyY2UgYHN0YXR1c190YC4KQEAgLTIxNCw4ICsxNTYsOCBAQAogICAgIGNhc2UgVElNRURfT1VUOgogICAgIGNhc2UgRVJST1JfVU5TVVBQT1JURUQ6CiAgICAgY2FzZSBVTktOT1dOX0VSUk9SOgotICAgIGNhc2UgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UkVMRUFTRV9BTExfQlVGRkVSUzoKLSAgICBjYXNlIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OkJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT046CisgICAgY2FzZSBCdWZmZXJRdWV1ZURlZnM6OlJFTEVBU0VfQUxMX0JVRkZFUlM6CisgICAgY2FzZSBCdWZmZXJRdWV1ZURlZnM6OkJVRkZFUl9ORUVEU19SRUFMTE9DQVRJT046CiAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxTdGF0dXM+KGwpOwogICAgIGNhc2UgTk9UX0VOT1VHSF9EQVRBOgogICAgICAgICByZXR1cm4gU3RhdHVzOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OOwpAQCAtNTY3LDcgKzUwOSw4IEBACiAgICAgICAgICAgICBhbndCdWZmZXIubmF0aXZlSGFuZGxlID0gdC5uYXRpdmVIYW5kbGU7CiAgICAgICAgICAgICBhbndCdWZmZXIuYXR0ciA9IHQuYXR0ci5hbndCdWZmZXI7CiAgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBncmFwaGljQnVmZmVyID0gbmV3IEdyYXBoaWNCdWZmZXIoKTsKLSAgICAgICAgICAgIGlmICghY29udmVydFRvKGdyYXBoaWNCdWZmZXIuZ2V0KCksIGFud0J1ZmZlcikpIHsKKyAgICAgICAgICAgIGlmICghOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDo6dXRpbHM6OmNvbnZlcnRUbygKKyAgICAgICAgICAgICAgICAgICAgZ3JhcGhpY0J1ZmZlci5nZXQoKSwgYW53QnVmZmVyKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICpsID0gT01YQnVmZmVyKGdyYXBoaWNCdWZmZXIpOwpAQCAtNzUxLDQgKzY5NCw0IEBACiB9ICAvLyBuYW1lc3BhY2UgaGFyZHdhcmUKIH0gIC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKLSNlbmRpZiAgLy8gQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9PTVhfVjFfMF9fQ09OVkVSU0lPTl9ICisjZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfT01YX1YxXzBfSU1QTF9DT05WRVJTSU9OX0gKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuaAppbmRleCAwMDZkMmQ5Li4xNWQ0Njk5MSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214LzEuMC9PbXhTdG9yZS5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8aGlkbC9TdGF0dXMuaD4KIAorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9tZWRpYS9vbXgvMS4wL0lPbXhTdG9yZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oPgogCkBAIC00MywxNSArNDQsMTQgQEAKIAogc3RydWN0IE9teFN0b3JlIDogcHVibGljIElPbXhTdG9yZSB7CiAgICAgT214U3RvcmUoCisgICAgICAgICAgICBjb25zdCBzcDxJT214PiAmb214ID0gbnVsbHB0ciwKICAgICAgICAgICAgIGNvbnN0IGNoYXIqIG93bmVyID0gImRlZmF1bHQiLAotICAgICAgICAgICAgY29uc3QgY2hhciogY29uc3QqIHNlYXJjaERpcnMKLSAgICAgICAgICAgICAgICA9IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpkZWZhdWx0U2VhcmNoRGlycywKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIG1haW5YbWxOYW1lCi0gICAgICAgICAgICAgICAgPSBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdE1haW5YbWxOYW1lLAotICAgICAgICAgICAgY29uc3QgY2hhciogcGVyZm9ybWFuY2VYbWxOYW1lCi0gICAgICAgICAgICAgICAgPSBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdFBlcmZvcm1hbmNlWG1sTmFtZSwKLSAgICAgICAgICAgIGNvbnN0IGNoYXIqIHByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoCi0gICAgICAgICAgICAgICAgPSBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdFByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoKTsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmc2VhcmNoRGlycyA9CisgICAgICAgICAgICAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldERlZmF1bHRTZWFyY2hEaXJzKCksCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnhtbEZpbGVzID0KKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2V0RGVmYXVsdFhtbE5hbWVzKCksCisgICAgICAgICAgICBjb25zdCBjaGFyICp4bWxQcm9maWxpbmdSZXN1bHRzUGF0aCA9CisgICAgICAgICAgICAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRQcm9maWxpbmdSZXN1bHRzWG1sUGF0aCk7CiAKICAgICB2aXJ0dWFsIH5PbXhTdG9yZSgpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjJhNjk5Li4wMDAwMDAwCi0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9PTVhfVjFfMF9XR1JBUEhJQ0JVRkZFUlBST0RVQ0VSX0gKLSNkZWZpbmUgQU5EUk9JRF9IQVJEV0FSRV9NRURJQV9PTVhfVjFfMF9XR1JBUEhJQ0JVRkZFUlBST0RVQ0VSX0gKLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2JxaGVscGVyL1dHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIGhhcmR3YXJlIHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci1uYW1lc3BhY2Ugb214IHsKLW5hbWVzcGFjZSBWMV8wIHsKLW5hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7Ci0KLXVzaW5nIFRXR3JhcGhpY0J1ZmZlclByb2R1Y2VyID0gOjphbmRyb2lkOjpUV0dyYXBoaWNCdWZmZXJQcm9kdWNlcjwKLSAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI+OwotCi19ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KLX0gIC8vIG5hbWVzcGFjZSBWMV8wCi19ICAvLyBuYW1lc3BhY2Ugb214Ci19ICAvLyBuYW1lc3BhY2UgbWVkaWEKLX0gIC8vIG5hbWVzcGFjZSBoYXJkd2FyZQotfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotI2VuZGlmICAvLyBBTkRST0lEX0hBUkRXQVJFX01FRElBX09NWF9WMV8wX1dPTVhCVUZGRVJQUk9EVUNFUl9ICmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvQldHcmFwaGljQnVmZmVyU291cmNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlZmZmMjIuLjAwMDAwMDAKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L0JXR3JhcGhpY0J1ZmZlclNvdXJjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQldHUkFQSElDX0JVRkZFUl9TT1VSQ0VfSF8KLSNkZWZpbmUgQldHUkFQSElDX0JVRkZFUl9TT1VSQ0VfSF8KLQotI2luY2x1ZGUgPGJpbmRlci9CaW5kZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvU3RhdHVzLmg+Ci0jaW5jbHVkZSA8YW5kcm9pZC9CbkdyYXBoaWNCdWZmZXJTb3VyY2UuaD4KLSNpbmNsdWRlIDxhbmRyb2lkL0JuT01YQnVmZmVyU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSU9NWC5oPgotCi0jaW5jbHVkZSAiT214R3JhcGhpY0J1ZmZlclNvdXJjZS5oIgotI2luY2x1ZGUgIklPbXhOb2RlV3JhcHBlci5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXVzaW5nIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXM7Ci11c2luZyA6OmFuZHJvaWQ6OkJuR3JhcGhpY0J1ZmZlclNvdXJjZTsKLXVzaW5nIDo6YW5kcm9pZDo6T214R3JhcGhpY0J1ZmZlclNvdXJjZTsKLXVzaW5nIDo6YW5kcm9pZDo6SU9NWE5vZGU7Ci11c2luZyA6OmFuZHJvaWQ6OnNwOwotCi1zdHJ1Y3QgQldHcmFwaGljQnVmZmVyU291cmNlIDogcHVibGljIEJuR3JhcGhpY0J1ZmZlclNvdXJjZSB7Ci0gICAgc3RydWN0IEJXT01YQnVmZmVyU291cmNlOwotICAgIHN0cnVjdCBCV09teE5vZGVXcmFwcGVyOwotCi0gICAgc3A8T214R3JhcGhpY0J1ZmZlclNvdXJjZT4gbUJhc2U7Ci0gICAgc3A8SU9NWEJ1ZmZlclNvdXJjZT4gbU9NWEJ1ZmZlclNvdXJjZTsKLQotICAgIEJXR3JhcGhpY0J1ZmZlclNvdXJjZShzcDxPbXhHcmFwaGljQnVmZmVyU291cmNlPiBjb25zdCAmYmFzZSk7Ci0KLSAgICBTdGF0dXMgY29uZmlndXJlKAotICAgICAgICAgICAgY29uc3Qgc3A8SU9NWE5vZGU+JiBvbXhOb2RlLCBpbnQzMl90IGRhdGFTcGFjZSkgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHNldFN1c3BlbmQoYm9vbCBzdXNwZW5kLCBpbnQ2NF90IHRpbWVVcykgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHNldFJlcGVhdFByZXZpb3VzRnJhbWVEZWxheVVzKAotICAgICAgICAgICAgaW50NjRfdCByZXBlYXRBZnRlclVzKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0TWF4RnBzKGZsb2F0IG1heEZwcykgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHNldFRpbWVMYXBzZUNvbmZpZygKLSAgICAgICAgICAgIGRvdWJsZSBmcHMsIGRvdWJsZSBjYXB0dXJlRnBzKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0U3RhcnRUaW1lVXMoaW50NjRfdCBzdGFydFRpbWVVcykgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHNldFN0b3BUaW1lVXMoaW50NjRfdCBzdG9wVGltZVVzKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgZ2V0U3RvcFRpbWVPZmZzZXRVcyhpbnQ2NF90KiBzdG9wVGltZU9mZnNldFVzKSBvdmVycmlkZTsKLSAgICBTdGF0dXMgc2V0Q29sb3JBc3BlY3RzKGludDMyX3QgYXNwZWN0cykgb3ZlcnJpZGU7Ci0gICAgU3RhdHVzIHNldFRpbWVPZmZzZXRVcyhpbnQ2NF90IHRpbWVPZmZzZXRzVXMpIG92ZXJyaWRlOwotICAgIFN0YXR1cyBzaWduYWxFbmRPZklucHV0U3RyZWFtKCkgb3ZlcnJpZGU7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfSEFSRFdBUkVfTUVESUFfT01YX1YxXzBfV0dSQVBISUNCVUZGRVJTT1VSQ0VfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWE1hc3Rlci5oCmluZGV4IDg5N2YyODcuLjkzZWFlZjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9PTVhNYXN0ZXIuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YTWFzdGVyLmgKQEAgLTUyLDEzICs1MiwxNiBAQAogcHJpdmF0ZToKICAgICBjaGFyIG1Qcm9jZXNzTmFtZVsxNl07CiAgICAgTXV0ZXggbUxvY2s7Ci0gICAgTGlzdDxPTVhQbHVnaW5CYXNlICo+IG1QbHVnaW5zOworICAgIHN0cnVjdCBQbHVnaW4geworICAgICAgICBPTVhQbHVnaW5CYXNlICptT214OworICAgICAgICB2b2lkICptTGliSGFuZGxlOworICAgIH07CisgICAgTGlzdDxQbHVnaW4+IG1QbHVnaW5zOwogICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIE9NWFBsdWdpbkJhc2UgKj4gbVBsdWdpbkJ5Q29tcG9uZW50TmFtZTsKICAgICBLZXllZFZlY3RvcjxPTVhfQ09NUE9ORU5UVFlQRSAqLCBPTVhQbHVnaW5CYXNlICo+IG1QbHVnaW5CeUluc3RhbmNlOwogCi0gICAgdm9pZCAqbVZlbmRvckxpYkhhbmRsZTsKLQogICAgIHZvaWQgYWRkVmVuZG9yUGx1Z2luKCk7CisgICAgdm9pZCBhZGRQbGF0Zm9ybVBsdWdpbigpOwogICAgIHZvaWQgYWRkUGx1Z2luKGNvbnN0IGNoYXIgKmxpYm5hbWUpOwogICAgIHZvaWQgYWRkUGx1Z2luKE9NWFBsdWdpbkJhc2UgKnBsdWdpbik7CiAgICAgdm9pZCBjbGVhclBsdWdpbnMoKTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU2ltcGxlU29mdE9NWENvbXBvbmVudC5oCmluZGV4IDFkMWYyYmQuLjZiYmVkZGEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9TaW1wbGVTb2Z0T01YQ29tcG9uZW50LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NpbXBsZVNvZnRPTVhDb21wb25lbnQuaApAQCAtMjAsNiArMjAsNyBAQAogCiAjaW5jbHVkZSAiU29mdE9NWENvbXBvbmVudC5oIgogCisjaW5jbHVkZSA8YXRvbWljPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXJSZWZsZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgpAQCAtMjgsNiArMjksNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgQUxvb3BlcjsKK3N0cnVjdCBBQnVmZmVyOwogCiBzdHJ1Y3QgQ29kZWNQcm9maWxlTGV2ZWwgewogICAgIE9NWF9VMzIgbVByb2ZpbGU7CkBAIC00OSw2ICs1MSw3IEBACiAgICAgc3RydWN0IEJ1ZmZlckluZm8gewogICAgICAgICBPTVhfQlVGRkVSSEVBREVSVFlQRSAqbUhlYWRlcjsKICAgICAgICAgYm9vbCBtT3duZWRCeVVzOworICAgICAgICBib29sIG1GcmFtZUNvbmZpZzsKICAgICB9OwogCiAgICAgc3RydWN0IFBvcnRJbmZvIHsKQEAgLTc2LDYgKzc5LDkgQEAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRQYXJhbWV0ZXIoCiAgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CiAKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRDb25maWcoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpOworCiAgICAgdmlydHVhbCB2b2lkIG9uUXVldWVGaWxsZWQoT01YX1UzMiBwb3J0SW5kZXgpOwogICAgIExpc3Q8QnVmZmVySW5mbyAqPiAmZ2V0UG9ydFF1ZXVlKE9NWF9VMzIgcG9ydEluZGV4KTsKIApAQCAtMTAxLDYgKzEwNyw3IEBACiAgICAgT01YX1NUQVRFVFlQRSBtVGFyZ2V0U3RhdGU7CiAKICAgICBWZWN0b3I8UG9ydEluZm8+IG1Qb3J0czsKKyAgICBzdGQ6OmF0b21pY19ib29sIG1GcmFtZUNvbmZpZzsKIAogICAgIGJvb2wgaXNTZXRQYXJhbWV0ZXJBbGxvd2VkKAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgY29uc3QgT01YX1BUUiBwYXJhbXMpIGNvbnN0OwpAQCAtMTE0LDYgKzEyMSw5IEBACiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIHNldFBhcmFtZXRlcigKICAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKIAorICAgIHZpcnR1YWwgT01YX0VSUk9SVFlQRSBzZXRDb25maWcoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcyk7CisKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgdXNlQnVmZmVyKAogICAgICAgICAgICAgT01YX0JVRkZFUkhFQURFUlRZUEUgKipidWZmZXIsCiAgICAgICAgICAgICBPTVhfVTMyIHBvcnRJbmRleCwKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0T01YQ29tcG9uZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdE9NWENvbXBvbmVudC5oCmluZGV4IDNhYjZmODguLjc5ZjBjNzcgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0T01YQ29tcG9uZW50LmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRPTVhDb21wb25lbnQuaApAQCAtMjEsMTIgKzIxLDE1IEBACiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLQorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPE9NWF9Db21wb25lbnQuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBzdHJ1Y3QgU29mdE9NWENvbXBvbmVudCA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBlbnVtIHsKKyAgICAgICAga0ZlbmNlVGltZW91dE1zID0gMTAwMAorICAgIH07CiAgICAgU29mdE9NWENvbXBvbmVudCgKICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgICAgICBjb25zdCBPTVhfQ0FMTEJBQ0tUWVBFICpjYWxsYmFja3MsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0RlY29kZXJPTVhDb21wb25lbnQuaAppbmRleCA1NmZjNjkxLi5kN2MxNjU4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9EZWNvZGVyT01YQ29tcG9uZW50LmgKQEAgLTIwLDE0ICsyMCwxOSBAQAogCiAjaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgogCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BSGFuZGxlclJlZmxlY3Rvci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQ29sb3JVdGlscy5oPgotI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfVmlkZW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9WaWRlb0V4dC5oPgorCiAjaW5jbHVkZSA8bWVkaWEvaGFyZHdhcmUvSGFyZHdhcmVBUEkuaD4KIAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy90aHJlYWRzLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvTGlzdC5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQ4LDYgKzUzLDcgQEAKICAgICBlbnVtIHsKICAgICAgICAga0Rlc2NyaWJlQ29sb3JBc3BlY3RzSW5kZXggPSBrUHJlcGFyZUZvckFkYXB0aXZlUGxheWJhY2tJbmRleCArIDEsCiAgICAgICAgIGtEZXNjcmliZUhkclN0YXRpY0luZm9JbmRleCA9IGtQcmVwYXJlRm9yQWRhcHRpdmVQbGF5YmFja0luZGV4ICsgMiwKKyAgICAgICAga0Rlc2NyaWJlSGRyMTBQbHVzSW5mb0luZGV4ID0ga1ByZXBhcmVGb3JBZGFwdGl2ZVBsYXliYWNrSW5kZXggKyAzLAogICAgIH07CiAKICAgICBlbnVtIHsKQEAgLTY4LDggKzc0LDggQEAKICAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgZ2V0Q29uZmlnKAogICAgICAgICAgICAgT01YX0lOREVYVFlQRSBpbmRleCwgT01YX1BUUiBwYXJhbXMpOwogCi0gICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIHNldENvbmZpZygKLSAgICAgICAgICAgIE9NWF9JTkRFWFRZUEUgaW5kZXgsIGNvbnN0IE9NWF9QVFIgcGFyYW1zKTsKKyAgICB2aXJ0dWFsIE9NWF9FUlJPUlRZUEUgaW50ZXJuYWxTZXRDb25maWcoCisgICAgICAgICAgICBPTVhfSU5ERVhUWVBFIGluZGV4LCBjb25zdCBPTVhfUFRSIHBhcmFtcywgYm9vbCAqZnJhbWVDb25maWcpOwogCiAgICAgdmlydHVhbCBPTVhfRVJST1JUWVBFIGdldEV4dGVuc2lvbkluZGV4KAogICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgT01YX0lOREVYVFlQRSAqaW5kZXgpOwpAQCAtODAsNiArODYsOCBAQAogCiAgICAgdmlydHVhbCBib29sIHN1cHBvcnREZXNjcmliZUhkclN0YXRpY0luZm8oKTsKIAorICAgIHZpcnR1YWwgYm9vbCBzdXBwb3J0RGVzY3JpYmVIZHIxMFBsdXNJbmZvKCk7CisKICAgICAvLyBUaGlzIGZ1bmN0aW9uIHNldHMgYm90aCBtaW5pbXVtIGJ1ZmZlciBjb3VudCBhbmQgYWN0dWFsIGJ1ZmZlciBjb3VudCBvZgogICAgIC8vIGlucHV0IHBvcnQgdG8gYmUgfG51bUlucHV0QnVmZmVyc3wuIEl0IHdpbGwgYWxzbyBzZXQgYm90aCBtaW5pbXVtIGJ1ZmZlcgogICAgIC8vIGNvdW50IGFuZCBhY3R1YWwgYnVmZmVyIGNvdW50IG9mIG91dHB1dCBwb3J0IHRvIGJlIHxudW1PdXRwdXRCdWZmZXJzfC4KQEAgLTE2Niw2ICsxNzQsOSBAQAogICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBkdW1wIHRoZSBDb2xvckFzcGVjdHMuCiAgICAgdm9pZCBkdW1wQ29sb3JBc3BlY3RzKGNvbnN0IENvbG9yQXNwZWN0cyAmY29sb3JBc3BlY3RzKTsKIAorICAgIHNwPEFCdWZmZXI+IGRlcXVldWVJbnB1dEZyYW1lQ29uZmlnKCk7CisgICAgdm9pZCBxdWV1ZU91dHB1dEZyYW1lQ29uZmlnKGNvbnN0IHNwPEFCdWZmZXI+ICZpbmZvKTsKKwogcHJpdmF0ZToKICAgICB1aW50MzJfdCBtTWluSW5wdXRCdWZmZXJTaXplOwogICAgIHVpbnQzMl90IG1NaW5Db21wcmVzc2lvblJhdGlvOwpAQCAtMTc0LDYgKzE4NSw5IEBACiAgICAgT01YX1ZJREVPX0NPRElOR1RZUEUgbUNvZGluZ1R5cGU7CiAgICAgY29uc3QgQ29kZWNQcm9maWxlTGV2ZWwgKm1Qcm9maWxlTGV2ZWxzOwogICAgIHNpemVfdCBtTnVtUHJvZmlsZUxldmVsczsKKyAgICB0eXBlZGVmIExpc3Q8c3A8QUJ1ZmZlcj4gPiBIZHIxMFBsdXNJbmZvTGlzdDsKKyAgICBIZHIxMFBsdXNJbmZvTGlzdCBtSGRyMTBQbHVzSW5wdXRzOworICAgIEhkcjEwUGx1c0luZm9MaXN0IG1IZHIxMFBsdXNPdXRwdXRzOwogCiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU29mdFZpZGVvRGVjb2Rlck9NWENvbXBvbmVudCk7CiB9OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L29teC9Tb2Z0VmlkZW9FbmNvZGVyT01YQ29tcG9uZW50LmgKaW5kZXggMmQ2ZjMxYi4uOWNiNzJkZCAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L2luY2x1ZGUvbWVkaWEvc3RhZ2VmcmlnaHQvb214L1NvZnRWaWRlb0VuY29kZXJPTVhDb21wb25lbnQuaAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC9vbXgvU29mdFZpZGVvRW5jb2Rlck9NWENvbXBvbmVudC5oCkBAIC0xOCw3ICsxOCw5IEBACiAKICNkZWZpbmUgU09GVF9WSURFT19FTkNPREVSX09NWF9DT01QT05FTlRfSF8KIAotI2luY2x1ZGUgPG1lZGlhL0lPTVguaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9Db3JlLmg+CisjaW5jbHVkZSA8bWVkaWEvb3Blbm1heC9PTVhfVmlkZW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9vcGVubWF4L09NWF9WaWRlb0V4dC5oPgogCiAjaW5jbHVkZSAiU2ltcGxlU29mdE9NWENvbXBvbmVudC5oIgogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwCmluZGV4IGVmMzY5ODIuLmViMDE1NDMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9BbmRyb2lkLmJwCkBAIC03LDkgKzcsOSBAQAogICAgIHNoYXJlZF9saWJzOiBbCiAgICAgICAgICJsaWJzdGFnZWZyaWdodCIsCiAgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliZGF0YXNvdXJjZSIsCiAgICAgICAgICJsaWJtZWRpYSIsCiAgICAgICAgICJsaWJtZWRpYV9vbXgiLAotICAgICAgICAibGlibWVkaWFleHRyYWN0b3IiLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLApAQCAtMTksMTYgKzE5LDExIEBACiAgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAogICAgICAgICAiYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAiLAogICAgICAgICAiYW5kcm9pZC5oaWRsLm1lbW9yeUAxLjAiLAotICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIiwKLSAgICBdLAotCi0gICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0IiwKLSAgICAgICAgImZyYW1ld29ya3MvbmF0aXZlL2luY2x1ZGUvbWVkaWEvb3Blbm1heCIsCiAgICAgXSwKIAogICAgIGhlYWRlcl9saWJzOiBbCiAgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAogICAgIF0sCiAKICAgICBjZmxhZ3M6IFsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L29teC90ZXN0cy9PTVhIYXJuZXNzLmNwcAppbmRleCAxNWE3NjU1Li42ODQ4YTgzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9vbXgvdGVzdHMvT01YSGFybmVzcy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvb214L3Rlc3RzL09NWEhhcm5lc3MuY3BwCkBAIC0yNywyMyArMjcsMjEgQEAKICNpbmNsdWRlIDxiaW5kZXIvUHJvY2Vzc1N0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9EYXRhU291cmNlRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgotI2luY2x1ZGUgPG1lZGlhL01lZGlhRXh0cmFjdG9yLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9PTVhCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0RhdGFTb3VyY2VGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvSW50ZXJmYWNlVXRpbHMuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9PTVhDbGllbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9TaW1wbGVEZWNvZGluZ1NvdXJjZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvbWVkaWEvb214LzEuMC9JT214Lmg+Ci0jaW5jbHVkZSA8bWVkaWEvb214LzEuMC9XT214Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL3dpbmRvdy5oPgogCiAjZGVmaW5lIERFRkFVTFRfVElNRU9VVCAgICAgICAgIDUwMDAwMApAQCAtODIsMTIgKzgwLDEzIEBACiB9CiAKIHN0YXR1c190IEhhcm5lc3M6OmluaXRPTVgoKSB7Ci0gICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7Ci0gICAgc3A8SU9teD4gdE9teCA9IElPbXg6OmdldFNlcnZpY2UoKTsKLSAgICBpZiAodE9teCA9PSBudWxscHRyKSB7CisgICAgT01YQ2xpZW50IGNsaWVudDsKKyAgICBpZiAoY2xpZW50LmNvbm5lY3QoKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGNvbm5lY3QgdG8gT01YIHRvIGNyZWF0ZSBwZXJzaXN0ZW50IGlucHV0IHN1cmZhY2UuIik7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICBtT01YID0gbmV3IHV0aWxzOjpMV09teCh0T214KTsKKworICAgIG1PTVggPSBjbGllbnQuaW50ZXJmYWNlKCk7CiAKICAgICByZXR1cm4gbU9NWCAhPSAwID8gT0sgOiBOT19JTklUOwogfQpAQCAtMjc5LDcgKzI3OCw3IEBACiAKIHN0YXRpYyBzcDxJTWVkaWFFeHRyYWN0b3I+IENyZWF0ZUV4dHJhY3RvckZyb21VUkkoY29uc3QgY2hhciAqdXJpKSB7CiAgICAgc3A8RGF0YVNvdXJjZT4gc291cmNlID0KLSAgICAgICAgRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21VUkkoTlVMTCAvKiBodHRwU2VydmljZSAqLywgdXJpKTsKKyAgICAgICAgRGF0YVNvdXJjZUZhY3Rvcnk6OmdldEluc3RhbmNlKCktPkNyZWF0ZUZyb21VUkkoTlVMTCAvKiBodHRwU2VydmljZSAqLywgdXJpKTsKIAogICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTlVMTDsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQU1QRUc0QXVkaW9Bc3NlbWJsZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAKaW5kZXggODJhMDYzMS4uNDMwMmFlZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BTVBFRzRBdWRpb0Fzc2VtYmxlci5jcHAKQEAgLTQyMyw2ICs0MjMsMTEgQEAKICAgICAgICAgICAgIENIRUNLX0xFKG9mZnNldCArIChtT3RoZXJEYXRhTGVuQml0cyAvIDgpLCBidWZmZXItPnNpemUoKSk7CiAgICAgICAgICAgICBvZmZzZXQgKz0gbU90aGVyRGF0YUxlbkJpdHMgLyA4OwogICAgICAgICB9CisKKyAgICAgICAgaWYgKGkgPCBtTnVtU3ViRnJhbWVzICYmIG9mZnNldCA+PSBidWZmZXItPnNpemUoKSkgeworICAgICAgICAgICAgQUxPR1coIlNraXAgc3ViZnJhbWVzIGFmdGVyICVkLCB0b3RhbCAlZCIsIChpbnQpaSwgKGludCltTnVtU3ViRnJhbWVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgfQogCiAgICAgaWYgKG9mZnNldCA8IGJ1ZmZlci0+c2l6ZSgpKSB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FSVFNQQ29ubmVjdGlvbi5jcHAKaW5kZXggMDE2MTdiNi4uYmI2NmY0YyAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BUlRTUENvbm5lY3Rpb24uY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVJUU1BDb25uZWN0aW9uLmNwcApAQCAtMTksMTMgKzE5LDE2IEBACiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAKICNpbmNsdWRlICJBUlRTUENvbm5lY3Rpb24uaCIKKyNpbmNsdWRlICJOZXR3b3JrVXRpbHMuaCIKIAorI2luY2x1ZGUgPGRhdGFzb3VyY2UvSFRUUEJhc2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL2Jhc2U2NC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Gb3VuZGF0aW9uVXRpbHMuaD4KIAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CkBAIC0zMyw3ICszNiw2IEBACiAjaW5jbHVkZSA8b3BlbnNzbC9tZDUuaD4KICNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiAKLSNpbmNsdWRlICJpbmNsdWRlL0hUVFBCYXNlLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTksOCArNjEsOCBAQAogICAgIGlmIChtU29ja2V0ID49IDApIHsKICAgICAgICAgQUxPR0UoIkNvbm5lY3Rpb24gaXMgc3RpbGwgb3BlbiwgY2xvc2luZyB0aGUgc29ja2V0LiIpOwogICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7Ci0gICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQpOwogICAgICAgICB9CiAgICAgICAgIGNsb3NlKG1Tb2NrZXQpOwogICAgICAgICBtU29ja2V0ID0gLTE7CkBAIC0yMTQsOCArMjE2LDggQEAKIAogICAgIGlmIChtU3RhdGUgIT0gRElTQ09OTkVDVEVEKSB7CiAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKLSAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOworICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CiAgICAgICAgIH0KICAgICAgICAgY2xvc2UobVNvY2tldCk7CiAgICAgICAgIG1Tb2NrZXQgPSAtMTsKQEAgLTI1NCw3ICsyNTYsNyBAQAogCiAgICAgc3RydWN0IGhvc3RlbnQgKmVudCA9IGdldGhvc3RieW5hbWUoaG9zdC5jX3N0cigpKTsKICAgICBpZiAoZW50ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIlVua25vd24gaG9zdCAlcyIsIGhvc3QuY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCJVbmtub3duIGhvc3QgJXMiLCB1cmlEZWJ1Z1N0cmluZyhob3N0KS5jX3N0cigpKTsKIAogICAgICAgICByZXBseS0+c2V0SW50MzIoInJlc3VsdCIsIC1FTk9FTlQpOwogICAgICAgICByZXBseS0+cG9zdCgpOwpAQCAtMjY2LDkgKzI2OCw5IEBACiAgICAgbVNvY2tldCA9IHNvY2tldChBRl9JTkVULCBTT0NLX1NUUkVBTSwgMCk7CiAKICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCwgbVVJRCwKKyAgICAgICAgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCwgbVVJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDMyX3QpKih1aW50MzJfdCopICJSVFNQIik7Ci0gICAgICAgIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKG1Tb2NrZXQsIG1VSUQpOworICAgICAgICBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCwgbVVJRCk7CiAgICAgfQogCiAgICAgTWFrZVNvY2tldEJsb2NraW5nKG1Tb2NrZXQsIGZhbHNlKTsKQEAgLTI5Nyw4ICsyOTksOCBAQAogICAgICAgICBtU3RhdGUgPSBESVNDT05ORUNURUQ7CiAKICAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOwotICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKICAgICAgICAgfQogICAgICAgICBjbG9zZShtU29ja2V0KTsKICAgICAgICAgbVNvY2tldCA9IC0xOwpAQCAtMzE1LDggKzMxNyw4IEBACiAKIHZvaWQgQVJUU1BDb25uZWN0aW9uOjpwZXJmb3JtRGlzY29ubmVjdCgpIHsKICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKLSAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKKyAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyhtU29ja2V0KTsKKyAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsobVNvY2tldCk7CiAgICAgfQogICAgIGNsb3NlKG1Tb2NrZXQpOwogICAgIG1Tb2NrZXQgPSAtMTsKQEAgLTM4OSw4ICszOTEsOCBAQAogCiAgICAgICAgIG1TdGF0ZSA9IERJU0NPTk5FQ1RFRDsKICAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKG1Tb2NrZXQpOwotICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKKyAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcobVNvY2tldCk7CisgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhtU29ja2V0KTsKICAgICAgICAgfQogICAgICAgICBjbG9zZShtU29ja2V0KTsKICAgICAgICAgbVNvY2tldCA9IC0xOwpAQCAtOTUyLDcgKzk1NCw3IEBACiAgICAgQ0hFQ0tfR0Uoc3BhY2UyLCAwKTsKIAogICAgIG1ldGhvZC0+c2V0VG8ocmVxdWVzdCwgMCwgc3BhY2UxKTsKLSAgICB1cmwtPnNldFRvKHJlcXVlc3QsIHNwYWNlMSArIDEsIHNwYWNlMiAtIHNwYWNlMSk7CisgICAgdXJsLT5zZXRUbyhyZXF1ZXN0LCBzcGFjZTEgKyAxLCBzcGFjZTIgLSBzcGFjZTEgLSAxKTsKIH0KIAogdm9pZCBBUlRTUENvbm5lY3Rpb246OmFkZEF1dGhlbnRpY2F0aW9uKEFTdHJpbmcgKnJlcXVlc3QpIHsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FTZXNzaW9uRGVzY3JpcHRpb24uY3BwCmluZGV4IDMyNTA4NGMuLjkyNjM1NjUgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQVNlc3Npb25EZXNjcmlwdGlvbi5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BU2Vzc2lvbkRlc2NyaXB0aW9uLmNwcApAQCAtODAsNyArODAsNyBAQAogICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAKLSAgICAgICAgQUxPR0koIiVzIiwgbGluZS5jX3N0cigpKTsKKyAgICAgICAgQUxPR1YoIiVzIiwgbGluZS5jX3N0cigpKTsKIAogICAgICAgICBzd2l0Y2ggKGxpbmUuY19zdHIoKVswXSkgewogICAgICAgICAgICAgY2FzZSAndic6CkBAIC0yNjEsNyArMjYxLDcgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmIChzdHJuY21wKHZhbHVlLmNfc3RyKCksICJucHQ9IiwgNCkpIHsKKyAgICBpZiAoc3RybmNtcCh2YWx1ZS5jX3N0cigpLCAibnB0PSIsIDQpICYmIHN0cm5jbXAodmFsdWUuY19zdHIoKSwgIm5wdDoiLCA0KSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL0FuZHJvaWQuYnAKaW5kZXggNTk1MWRkZi4uYTVhODk1ZSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvQW5kcm9pZC5icApAQCAtMSw1ICsxLDUgQEAKLWNjX2xpYnJhcnlfc3RhdGljIHsKLSAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3J0c3BfZGVmYXVsdHMiLAogCiAgICAgc3JjczogWwogICAgICAgICAiQUFNUkFzc2VtYmxlci5jcHAiLApAQCAtMjEsNiArMjEsNyBAQAogCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmNyeXB0byIsCisgICAgICAgICJsaWJkYXRhc291cmNlIiwKICAgICAgICAgImxpYm1lZGlhIiwKICAgICBdLAogCkBAIC00OSw2ICs1MCwyMSBAQAogICAgIH0sCiB9CiAKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlic3RhZ2VmcmlnaHRfcnRzcCIsCisKKyAgICBzcmNzOiBbIk5ldHdvcmtVdGlscy5jcHAiXSwKKyAgICBoZWFkZXJfbGliczogWyJsaWJuZXRkX2NsaWVudF9oZWFkZXJzIl0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfcnRzcF9kZWZhdWx0cyJdLAorfQorCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYnN0YWdlZnJpZ2h0X3J0c3BfcGxheWVyMiIsCisKKyAgICBzcmNzOiBbIk5ldHdvcmtVdGlsc0ZvckFwcFByb2MuY3BwIl0sCisgICAgZGVmYXVsdHM6IFsibGlic3RhZ2VmcmlnaHRfcnRzcF9kZWZhdWx0cyJdLAorfQorCiAvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogY2NfdGVzdCB7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9NeUhhbmRsZXIuaAppbmRleCBkMTgzNTE2Li45YzMwNjIzIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL015SGFuZGxlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTXlIYW5kbGVyLmgKQEAgLTMxLDIyICszMSwyNCBAQAogI2luY2x1ZGUgIkFSVFBDb25uZWN0aW9uLmgiCiAjaW5jbHVkZSAiQVJUU1BDb25uZWN0aW9uLmgiCiAjaW5jbHVkZSAiQVNlc3Npb25EZXNjcmlwdGlvbi5oIgorI2luY2x1ZGUgIk5ldHdvcmtVdGlscy5oIgogCiAjaW5jbHVkZSA8Y3R5cGUuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogCisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9IVFRQQmFzZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTG9vcGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvVXRpbHMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Gb3VuZGF0aW9uVXRpbHMuaD4KIAogI2luY2x1ZGUgPGFycGEvaW5ldC5oPgogI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KICNpbmNsdWRlIDxuZXRkYi5oPgogCi0jaW5jbHVkZSAiSFRUUEJhc2UuaCIKIAogI2lmIExPR19OREVCVUcKICNkZWZpbmUgVU5VU0VEX1VOTEVTU19WRVJCT1NFKHgpICh2b2lkKSh4KQpAQCAtNzQsNiArNzYsOCBAQAogLy8gYSBuZXcgc2VxdWVuY2UuCiBzdGF0aWMgaW50MzJfdCBrTWF4QWxsb3dlZFN0YWxlQWNjZXNzVW5pdHMgPSAyMDsKIAorc3RhdGljIGludDY0X3Qga1RlYXJEb3duVGltZW91dFVzID0gMzAwMDAwMGxsOworCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHN0YXRpYyBib29sIEdldEF0dHJpYnV0ZShjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICprZXksIEFTdHJpbmcgKnZhbHVlKSB7CkBAIC0zNDQsOCArMzQ4LDcgQEAKIAogICAgICAgICAgICAgc3RydWN0IGhvc3RlbnQgKmVudCA9IGdldGhvc3RieW5hbWUobVNlc3Npb25Ib3N0LmNfc3RyKCkpOwogICAgICAgICAgICAgaWYgKGVudCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBsb29rIHVwIGFkZHJlc3Mgb2Ygc2Vzc2lvbiBob3N0ICclcyciLAotICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25Ib3N0LmNfc3RyKCkpOworICAgICAgICAgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gbG9vayB1cCBhZGRyZXNzIG9mIHNlc3Npb24gaG9zdCIpOwogCiAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgICAgICAgfQpAQCAtNTMwLDcgKzUzMyw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25VUkwuYXBwZW5kKEFTdHJpbmdQcmludGYoIiV1IiwgcG9ydCkpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uVVJMLmFwcGVuZChwYXRoKTsKIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dJKCJyZXdyaXR0ZW4gc2Vzc2lvbiB1cmw6ICclcyciLCBtU2Vzc2lvblVSTC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigicmV3cml0dGVuIHNlc3Npb24gdXJsOiAnJXMnIiwgbVNlc3Npb25VUkwuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiByZXBseSA9IG5ldyBBTWVzc2FnZSgnY29ubicsIHRoaXMpOwpAQCAtNzU3LDEwICs3NjAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdHJhY2stPm1Vc2luZ0ludGVybGVhdmVkVENQKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIHRhZwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVUlEVmFsaWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKHRyYWNrLT5tUlRQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayh0cmFjay0+bVJUUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlclRhZyh0cmFjay0+bVJUQ1BTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKHRyYWNrLT5tUlRDUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcodHJhY2stPm1SVFBTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayh0cmFjay0+bVJUUFNvY2tldCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcodHJhY2stPm1SVENQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsodHJhY2stPm1SVENQU29ja2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zZSh0cmFjay0+bVJUUFNvY2tldCk7CkBAIC04ODYsMTAgKzg4OSwxMCBAQAogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDbGVhciB0aGUgdGFnCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobVVJRFZhbGlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVFBTb2NrZXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW5mby0+bVJUUFNvY2tldCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSFRUUEJhc2U6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVENQU29ja2V0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIVFRQQmFzZTo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVENQU29ja2V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVFBTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVFBTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW5mby0+bVJUQ1BTb2NrZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVENQU29ja2V0KTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2UoaW5mby0+bVJUUFNvY2tldCk7CkBAIC05MzAsNiArOTMzLDE0IEBACiAgICAgICAgICAgICAgICAgcmVxdWVzdC5hcHBlbmQoIlxyXG4iKTsKIAogICAgICAgICAgICAgICAgIG1Db25uLT5zZW5kUmVxdWVzdChyZXF1ZXN0LmNfc3RyKCksIHJlcGx5KTsKKworICAgICAgICAgICAgICAgIC8vIElmIHRoZSByZXNwb25zZSBvZiB0ZWFyZG93biBoYXNuJ3QgYmVlbiByZWNlaXZlZCBpbiAzIHNlY29uZHMsCisgICAgICAgICAgICAgICAgLy8gcG9zdCAndGVhcicgbWVzc2FnZSB0byBhdm9pZCBBTlIuCisgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigicmVjb25uZWN0IiwgJnJlY29ubmVjdCkgfHwgIXJlY29ubmVjdCkgeworICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gdGVhcmRvd24gPSByZXBseS0+ZHVwKCk7CisgICAgICAgICAgICAgICAgICAgIHRlYXJkb3duLT5zZXRJbnQzMigicmVzdWx0IiwgLUVDT05OQUJPUlRFRCk7CisgICAgICAgICAgICAgICAgICAgIHRlYXJkb3duLT5wb3N0KGtUZWFyRG93blRpbWVvdXRVcyk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCkBAIC0xNjY1LDEyICsxNjc2LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICZpbmZvLT5tUlRQU29ja2V0LCAmaW5mby0+bVJUQ1BTb2NrZXQsICZydHBQb3J0KTsKIAogICAgICAgICAgICAgaWYgKG1VSURWYWxpZCkgewotICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW5mby0+bVJUUFNvY2tldCwgbVVJRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdCkqKHVpbnQzMl90KikgIlJUUF8iKTsKLSAgICAgICAgICAgICAgICBIVFRQQmFzZTo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVENQU29ja2V0LCBtVUlELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSoodWludDMyX3QqKSAiUlRQXyIpOwotICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVFBTb2NrZXQsIG1VSUQpOwotICAgICAgICAgICAgICAgIEhUVFBCYXNlOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGluZm8tPm1SVENQU29ja2V0LCBtVUlEKTsKKyAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlclRhZyhpbmZvLT5tUlRQU29ja2V0LCBtVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSoodWludDMyX3QqKSAiUlRQXyIpOworICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGluZm8tPm1SVENQU29ja2V0LCBtVUlELAorICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSoodWludDMyX3QqKSAiUlRQXyIpOworICAgICAgICAgICAgICAgIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbmZvLT5tUlRQU29ja2V0LCBtVUlEKTsKKyAgICAgICAgICAgICAgICBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW5mby0+bVJUQ1BTb2NrZXQsIG1VSUQpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICByZXF1ZXN0LmFwcGVuZCgiVHJhbnNwb3J0OiBSVFAvQVZQL1VEUDt1bmljYXN0O2NsaWVudF9wb3J0PSIpOwpAQCAtMTkxMiw3ICsxOTIzLDcgQEAKICAgICAgICAgICAgIG1MYXN0TWVkaWFUaW1lVXMgPSBtZWRpYVRpbWVVczsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChtZWRpYVRpbWVVcyA8IDApIHsKKyAgICAgICAgaWYgKG1lZGlhVGltZVVzIDwgMCAmJiAhbVNlZWthYmxlKSB7CiAgICAgICAgICAgICBBTE9HVigiZHJvcHBpbmcgZWFybHkgYWNjZXNzVW5pdC4iKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMzZiNzgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlscy5jcHAKQEAgLTAsMCArMSw1MyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmV0d29ya1V0aWxzIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSAiTmV0d29ya1V0aWxzLmgiCisjaW5jbHVkZSA8Y3V0aWxzL3F0YWd1aWQuaD4KKyNpbmNsdWRlIDxOZXRkQ2xpZW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6UmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQsIHVpZF90IHVpZCwgdWludDMyX3Qga1RhZykgeworICAgIGludCByZXMgPSBxdGFndWlkX3RhZ1NvY2tldChzb2NrZmQsIGtUYWcsIHVpZCk7CisgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdGFnZ2luZyBzb2NrZXQgJWQgZm9yIHVpZCAlZCAoTXkgVUlEPSVkKSIsIHNvY2tmZCwgdWlkLCBnZXRldWlkKCkpOworICAgIH0KK30KKworLy8gc3RhdGljCit2b2lkIE5ldHdvcmtVdGlsczo6VW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCkgeworICAgIGludCByZXMgPSBxdGFndWlkX3VudGFnU29ja2V0KHNvY2tmZCk7CisgICAgaWYgKHJlcyAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdW50YWdnaW5nIHNvY2tldCAlZCAoTXkgVUlEPSVkKSIsIHNvY2tmZCwgZ2V0ZXVpZCgpKTsKKyAgICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCwgdWlkX3QgdWlkKSB7CisgICAgc2V0TmV0d29ya0ZvclVzZXIodWlkLCBzb2NrZmQpOworfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpVblJlZ2lzdGVyU29ja2V0VXNlck1hcmsoaW50IHNvY2tmZCkgeworICAgIFJlZ2lzdGVyU29ja2V0VXNlck1hcmsoc29ja2ZkLCBnZXRldWlkKCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHMuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1ZWU0NgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvTmV0d29ya1V0aWxzLmgKQEAgLTAsMCArMSwzMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTkVUV09SS19VVElMU19IXworI2RlZmluZSBORVRXT1JLX1VUSUxTX0hfCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RydWN0IE5ldHdvcmtVdGlscyB7CisgICAgc3RhdGljIHZvaWQgUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCBzb2NrZmQsIHVpZF90IHVpZCwgdWludDMyX3Qga1RhZyk7CisgICAgc3RhdGljIHZvaWQgVW5SZWdpc3RlclNvY2tldFVzZXJUYWcoaW50IHNvY2tmZCk7CisKKyAgICBzdGF0aWMgdm9pZCBSZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQsIHVpZF90IHVpZCk7CisgICAgc3RhdGljIHZvaWQgVW5SZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCBzb2NrZmQpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBORVRXT1JLX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL05ldHdvcmtVdGlsc0ZvckFwcFByb2MuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHNGb3JBcHBQcm9jLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjIxNTljCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9OZXR3b3JrVXRpbHNGb3JBcHBQcm9jLmNwcApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOZXR3b3JrVXRpbHMiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlICJOZXR3b3JrVXRpbHMuaCIKKworLy8gTmV0d29ya1V0aWxzIGltcGxlbWVudGF0aW9uIGZvciBhcHBsaWNhdGlvbiBwcm9jZXNzLgorbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJUYWcoaW50LCB1aWRfdCwgdWludDMyX3QpIHsKKyAgICAvLyBObyBvcC4gRnJhbWV3b3JrIGFscmVhZHkgaGFuZGxlcyB0aGUgZGF0YSB1c2FnZSBiaWxsaW5nIGZvciBhcHBsaWNhdGlvbnMuCit9CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyVGFnKGludCkgeworICAgIC8vIE5vIG9wLgorfQorCisvLyBzdGF0aWMKK3ZvaWQgTmV0d29ya1V0aWxzOjpSZWdpc3RlclNvY2tldFVzZXJNYXJrKGludCwgdWlkX3QpIHsKKyAgICAvLyBObyBvcC4gRnJhbWV3b3JrIGFscmVhZHkgaGFuZGxlcyB0aGUgZGF0YSB1c2FnZSBiaWxsaW5nIGZvciBhcHBsaWNhdGlvbnMuCit9CisKKy8vIHN0YXRpYwordm9pZCBOZXR3b3JrVXRpbHM6OlVuUmVnaXN0ZXJTb2NrZXRVc2VyTWFyayhpbnQpIHsKKyAgICAvLyBObyBvcC4KK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3J0c3AvU0RQTG9hZGVyLmNwcAppbmRleCBkNDU5Y2JkLi5lMjM2MjY3IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwL1NEUExvYWRlci5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvcnRzcC9TRFBMb2FkZXIuY3BwCkBAIC0yMiwxMiArMjIsMTMgQEAKIAogI2luY2x1ZGUgIkFTZXNzaW9uRGVzY3JpcHRpb24uaCIKIAorI2luY2x1ZGUgPGRhdGFzb3VyY2UvTWVkaWFIVFRQLmg+CiAjaW5jbHVkZSA8bWVkaWEvTWVkaWFIVFRQQ29ubmVjdGlvbi5oPgogI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUhUVFAuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L1V0aWxzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvRm91bmRhdGlvblV0aWxzLmg+CiAKICNkZWZpbmUgREVGQVVMVF9TRFBfU0laRSAxMDAwMDAKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL0FuZHJvaWQuYnAKaW5kZXggYmUxMGZkYy4uYTdmOTRjMSAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQW5kcm9pZC5icAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9BbmRyb2lkLmJwCkBAIC0yNywzICsyNywyMSBAQAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCiB9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJCYXR0ZXJ5Q2hlY2tlcl90ZXN0IiwKKyAgICBzcmNzOiBbIkJhdHRlcnlDaGVja2VyX3Rlc3QuY3BwIl0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgIF0sCit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQmF0dGVyeUNoZWNrZXJfdGVzdC5jcHAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy9CYXR0ZXJ5Q2hlY2tlcl90ZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYzVlZTliCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvQmF0dGVyeUNoZWNrZXJfdGVzdC5jcHAKQEAgLTAsMCArMSwyNDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vICNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkJhdHRlcnlDaGVja2VyX3Rlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQmF0dGVyeUNoZWNrZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FEZWJ1Zy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUhhbmRsZXIuaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdGF0aWMgY29uc3QgaW50IGtCYXR0ZXJ5VGltZW91dFVzID0gMTAwMDAwMGxsOyAvLyAxIHNlY29uZHMKK3N0YXRpYyBjb25zdCBpbnQga1Rlc3RNYXJnaW5VcyA9IDUwMDAwbGw7IC8vIDUwbXMKK3N0YXRpYyBjb25zdCBpbnQga1dhaXRTdGF0dXNDaGFuZ2VVcyA9IGtCYXR0ZXJ5VGltZW91dFVzICsga1Rlc3RNYXJnaW5VczsKK3N0YXRpYyBjb25zdCBpbnQga1NwYXJzZUZyYW1lSW50ZXJ2YWxVcyA9IGtCYXR0ZXJ5VGltZW91dFVzIC0ga1Rlc3RNYXJnaW5VczsKKworY2xhc3MgQmF0dGVyeUNoZWNrZXJUZXN0SGFuZGxlciA6IHB1YmxpYyBBSGFuZGxlciB7CisgICAgZW51bSBFdmVudFR5cGUgeworICAgICAgICAvLyBFdmVudHMgc2ltdWxhdGluZyBNZWRpYUNvZGVjCisgICAgICAgIGtXaGF0U3RhcnQgPSAwLCAgICAgICAgICAgICAvLyBjb2RlYyBlbnRlcmluZyBleGVjdXRpbmcgc3RhdGUKKyAgICAgICAga1doYXRTdG9wLCAgICAgICAgICAgICAgICAgIC8vIGNvZGVjIGV4aXRpbmcgZXhlY3V0aW5nIHN0YXRlCisgICAgICAgIGtXaGF0QWN0aXZpdHksICAgICAgICAvLyBjb2RlYyBxdWV1ZSBpbnB1dCBvciBkZXF1ZXVlIG91dHB1dAorICAgICAgICBrV2hhdFJlbGVhc2VkLCAgICAgLy8gY29kZWMgcmVsZWFzZWQKKyAgICAgICAga1doYXRDaGVja3BvaW50LCAgICAgICAgLy8gdGVzdCBjaGVja3BvaW5nIHdpdGggZXhwZWN0ZWQgdmFsdWVzIG9uIE9uL09mZgorCisgICAgICAgIC8vIE1lc3NhZ2UgZm9yIGJhdHRlcnkgY2hlY2tlciBtb25pdG9yIChub3QgZm9yIHRlc3RpbmcgdGhyb3VnaCBydW5UZXN0KCkpCisgICAgICAgIGtXaGF0QmF0dGVyeUNoZWNrZXIsCisgICAgfTsKKworICAgIHN0cnVjdCBPcGVyYXRpb24geworICAgICAgICBpbnQzMl90IGV2ZW50OworICAgICAgICBpbnQ2NF90IGRlbGF5ID0gMDsKKyAgICAgICAgdWludDMyX3QgcmVwZWF0Q291bnQgPSAwOworICAgICAgICBpbnQzMl90IGV4cGVjdGVkT25Db3VudGVyID0gMDsKKyAgICAgICAgaW50MzJfdCBleHBlY3RlZE9mZkNvdW50ZXIgPSAwOworICAgIH07CisKKyAgICBzdGQ6OnZlY3RvcjxPcGVyYXRpb24+IG1PcHM7CisgICAgc3A8QmF0dGVyeUNoZWNrZXI+IG1CYXR0ZXJ5Q2hlY2tlcjsKKyAgICBpbnQzMl90IG1PbkNvdW50ZXI7CisgICAgaW50MzJfdCBtT2ZmQ291bnRlcjsKKyAgICBDb25kaXRpb24gbURvbmU7CisgICAgTXV0ZXggbUxvY2s7CisKKyAgICBCYXR0ZXJ5Q2hlY2tlclRlc3RIYW5kbGVyKCkgOiBtT25Db3VudGVyKDApLCBtT2ZmQ291bnRlcigwKSB7fQorCisgICAgdm9pZCBydW5UZXN0KGNvbnN0IHN0ZDo6dmVjdG9yPE9wZXJhdGlvbj4gJm9wcywgaW50NjRfdCB0aW1lb3V0VXMpIHsKKyAgICAgICAgbU9wcyA9IG9wczsKKworICAgICAgICBtQmF0dGVyeUNoZWNrZXIgPSBuZXcgQmF0dGVyeUNoZWNrZXIoCisgICAgICAgICAgICAgICAgbmV3IEFNZXNzYWdlKGtXaGF0QmF0dGVyeUNoZWNrZXIsIHRoaXMpLCBrQmF0dGVyeVRpbWVvdXRVcyk7CisKKyAgICAgICAgKG5ldyBBTWVzc2FnZShvcHNbMF0uZXZlbnQsIHRoaXMpKS0+cG9zdCgpOworCisgICAgICAgIC8vIHdhaXQgZm9yIGRvbmUKKyAgICAgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgICAgICBFWFBFQ1RfTkUoVElNRURfT1VULCBtRG9uZS53YWl0UmVsYXRpdmUobUxvY2ssIHRpbWVvdXRVcyAqIDEwMDBsbCkpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZyk7CisKKyAgICBmcmllbmQgY2xhc3MgQmF0dGVyeUNoZWNrZXJUZXN0OworfTsKKworY2xhc3MgQmF0dGVyeUNoZWNrZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CitwdWJsaWM6CisgICAgQmF0dGVyeUNoZWNrZXJUZXN0KCkKKyAgICAgICAgOiBtTG9vcGVyKG5ldyBBTG9vcGVyKQorICAgICAgICAsIG1IYW5kbGVyKG5ldyBCYXR0ZXJ5Q2hlY2tlclRlc3RIYW5kbGVyKCkpIHsKKyAgICAgICAgbUxvb3Blci0+c2V0TmFtZSgiQmF0dGVyQ2hlY2tlckxvb3BlciIpOworICAgICAgICBtTG9vcGVyLT5zdGFydChmYWxzZSwgZmFsc2UsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworICAgICAgICBtTG9vcGVyLT5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXIpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIHVzaW5nIEV2ZW50VHlwZSA9IEJhdHRlcnlDaGVja2VyVGVzdEhhbmRsZXI6OkV2ZW50VHlwZTsKKyAgICB1c2luZyBPcGVyYXRpb24gPSBCYXR0ZXJ5Q2hlY2tlclRlc3RIYW5kbGVyOjpPcGVyYXRpb247CisKKyAgICB2aXJ0dWFsIH5CYXR0ZXJ5Q2hlY2tlclRlc3QoKSB7CisgICAgICAgIG1Mb29wZXItPnN0b3AoKTsKKyAgICAgICAgbUxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXItPmlkKCkpOworICAgIH0KKworICAgIHZvaWQgcnVuVGVzdChjb25zdCBzdGQ6OnZlY3RvcjxPcGVyYXRpb24+ICZvcHMsIGludDY0X3QgdGltZW91dFVzKSB7CisgICAgICAgIG1IYW5kbGVyLT5ydW5UZXN0KG9wcywgdGltZW91dFVzKTsKKyAgICB9CisKKyAgICBzcDxBTG9vcGVyPiBtTG9vcGVyOworICAgIHNwPEJhdHRlcnlDaGVja2VyVGVzdEhhbmRsZXI+IG1IYW5kbGVyOworfTsKKwordm9pZCBCYXR0ZXJ5Q2hlY2tlclRlc3RIYW5kbGVyOjpvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgeworICAgIHN3aXRjaChtc2ctPndoYXQoKSkgeworICAgIGNhc2Uga1doYXRTdGFydDoKKyAgICAgICAgbUJhdHRlcnlDaGVja2VyLT5zZXRFeGVjdXRpbmcodHJ1ZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga1doYXRTdG9wOgorICAgICAgICBtQmF0dGVyeUNoZWNrZXItPnNldEV4ZWN1dGluZyhmYWxzZSk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga1doYXRBY3Rpdml0eToKKyAgICAgICAgbUJhdHRlcnlDaGVja2VyLT5vbkNvZGVjQWN0aXZpdHkoW3RoaXNdICgpIHsgbU9uQ291bnRlcisrOyB9KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrV2hhdFJlbGVhc2VkOgorICAgICAgICBtQmF0dGVyeUNoZWNrZXItPm9uQ2xpZW50UmVtb3ZlZCgpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGtXaGF0QmF0dGVyeUNoZWNrZXI6CisgICAgICAgIG1CYXR0ZXJ5Q2hlY2tlci0+b25DaGVja0JhdHRlcnlUaW1lcihtc2csIFt0aGlzXSAoKSB7IG1PZmZDb3VudGVyKys7ICB9KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrV2hhdENoZWNrcG9pbnQ6CisgICAgICAgIC8vIHZlcmlmeSBPTi9PRkYgc3RhdGUgYW5kIHRvdGFsIGV2ZW50cworICAgICAgICBFWFBFQ1RfRVEobU9uQ291bnRlciwgbU9wc1swXS5leHBlY3RlZE9uQ291bnRlcik7CisgICAgICAgIEVYUEVDVF9FUShtT2ZmQ291bnRlciwgbU9wc1swXS5leHBlY3RlZE9mZkNvdW50ZXIpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBUUkVTUEFTUygpOworICAgIH0KKyAgICBpZiAobXNnLT53aGF0KCkgIT0ga1doYXRCYXR0ZXJ5Q2hlY2tlcikgeworICAgICAgICBFWFBFQ1RfRVEobXNnLT53aGF0KCksIG1PcHNbMF0uZXZlbnQpOworICAgICAgICAvLyBwb3N0IG5leHQgbWVzc2FnZQorICAgICAgICBpZiAoIW1PcHNbMF0ucmVwZWF0Q291bnQpIHsKKyAgICAgICAgICAgIG1PcHMuZXJhc2UobU9wcy5iZWdpbigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1PcHNbMF0ucmVwZWF0Q291bnQtLTsKKyAgICAgICAgfQorICAgICAgICBpbnQ2NF90IGR1cmF0aW9uID0gbU9wc1swXS5kZWxheTsKKyAgICAgICAgaWYgKCFtT3BzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIChuZXcgQU1lc3NhZ2UobU9wc1swXS5ldmVudCwgdGhpcykpLT5wb3N0KGR1cmF0aW9uKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKKyAgICAgICAgICAgIG1Eb25lLnNpZ25hbCgpOworICAgICAgICB9CisgICAgfQorfQorCitURVNUX0YoQmF0dGVyeUNoZWNrZXJUZXN0LCB0ZXN0Tm9ybWFsT3BlcmF0aW9ucykgeworICAgIHJ1blRlc3QoeworICAgICAgICB7RXZlbnRUeXBlOjprV2hhdFN0YXJ0LCAgICAgICAgMGxsfSwKKyAgICAgICAge0V2ZW50VHlwZTo6a1doYXRDaGVja3BvaW50LCAgIDBsbCwgMCwgMCwgMH0sCisgICAgICAgIHtFdmVudFR5cGU6OmtXaGF0QWN0aXZpdHksICAgICAzMzMzM2xsfSwKKyAgICAgICAge0V2ZW50VHlwZTo6a1doYXRDaGVja3BvaW50LCAgIDBsbCwgMCwgMSwgMH0sICAgICAgICAgICAgICAgICAvLyBPTgorICAgICAgICB7RXZlbnRUeXBlOjprV2hhdEFjdGl2aXR5LCAgICAgMzMzMzNsbCwgMiprV2FpdFN0YXR1c0NoYW5nZVVzLzMzMzMzbGx9LAorICAgICAgICB7RXZlbnRUeXBlOjprV2hhdENoZWNrcG9pbnQsICAgMGxsLCAwLCAxLCAwfSwKKyAgICAgICAge0V2ZW50VHlwZTo6a1doYXRDaGVja3BvaW50LCAgIGtXYWl0U3RhdHVzQ2hhbmdlVXMsIDAsIDEsIDF9LCAvLyBPRkYKKyAgICB9LCAxMDAwMDAwMGxsKTsKK30KKworVEVTVF9GKEJhdHRlcnlDaGVja2VyVGVzdCwgdGVzdFBhdXNlUmVzdW1lKSB7CisgICAgcnVuVGVzdCh7CisgICAgICAgIHtFdmVudFR5cGU6OmtXaGF0U3RhcnQsICAgICAgICAwbGx9LAorICAgICAgICB7RXZlbnRUeXBlOjprV2hhdENoZWNrcG9pbnQsICAgMGxsLCAwLCAwLCAwfSwKKyAgICAgICAge0V2ZW50VHlwZTo6a1doYXRBY3Rpdml0eSwgICAgIDMzMzMzbGx9LAorICAgICAgICB7RXZlbnRUeXBlOjprV2hhdENoZWNrcG9pbnQsICAgMGxsLCAwLCAxLCAwfSwgICAgICAgICAgICAgICAgIC8vIE9OCisgICAgICAgIHtFdmVudFR5cGU6OmtXaGF0Q2hlY2twb2ludCwgICBrV2FpdFN0YXR1c0NoYW5nZVVzLCAwLCAxLCAxfSwgLy8gT0ZGCisgICAgICAgIHtFdmVudFR5cGU6OmtXaGF0QWN0aXZpdHksICAgICAzMzMzM2xsfSwKKyAgICAgICAge0V2ZW50VHlwZTo6a1doYXRDaGVja3BvaW50LCAgIDBsbCwgMCwgMiwgMX0sICAgICAgICAgICAgICAgICAvLyBPTgorICAgICAgICB7RXZlbnRUeXBlOjprV2hhdENoZWNrcG9pbnQsICAga1dhaXRTdGF0dXNDaGFuZ2VVcywgMCwgMiwgMn0sIC8vIE9GRgorICAgIH0sIDEwMDAwMDAwbGwpOworfQorCitURVNUX0YoQmF0dGVyeUNoZWNrZXJUZXN0LCB0ZXN0Q2xpZW50UmVtb3ZlZEFuZFJlc3RhcnQpIHsKKyAgICBydW5UZXN0KHsKKyAgICAgICAge0V2ZW50VHlwZTo6a1doYXRTdGFydCwgICAgICAgIDBsbH0sCisgICAgICAgIHtFdmVudFR5cGU6OmtXaGF0QWN0aXZpdHksICAgICAzMzMzM2xsLCBrV2FpdFN0YXR1c0NoYW5nZVVzLzMzMzMzbGx9LAorICAgICAgICB7RXZlbnRUeXBlOjprV2hhdENoZWNrcG9pbnQsICAgMGxsLCAwLCAxLCAwfSwKKworICAgICAgICAvLyBzdG9wIGV4ZWN1dGluZyBzdGF0ZSBpdHNlbGYgc2hvdWxkbid0IHRyaWdnZXIgYW55IGNhbGxzCisgICAgICAgIHtFdmVudFR5cGU6OmtXaGF0U3RvcCwgICAgICAgICAwbGx9LAorICAgICAgICB7RXZlbnRUeXBlOjprV2hhdENoZWNrcG9pbnQsICAgMGxsLCAwLCAxLCAwfSwKKworICAgICAgICAvLyByZWxlYXNlIHNob3VsZG4ndCB0cmlnZ2VyIGFueSBjYWxscyBlaXRoZXIsCisgICAgICAgIC8vIGNsaWVudCByZXNvdXJjZSB3aWxsIGJlIHJlbW92ZWQgZW50aXJlbHkKKyAgICAgICAge0V2ZW50VHlwZTo6a1doYXRSZWxlYXNlZCwgICAgIDBsbH0sCisgICAgICAgIHtFdmVudFR5cGU6OmtXaGF0Q2hlY2twb2ludCwgICAwbGwsIDAsIDEsIDB9LAorICAgICAgICB7RXZlbnRUeXBlOjprV2hhdENoZWNrcG9pbnQsICAga1dhaXRTdGF0dXNDaGFuZ2VVcywgMCwgMSwgMH0sCisKKyAgICAgICAgLy8gc3RhcnQgcHVzaGluZyBidWZmZXJzIGFnYWluLCBPbiBzaG91bGQgYmUgcmVjZWl2ZWQgd2l0aG91dCBhbnkgT2ZmCisgICAgICAgIHtFdmVudFR5cGU6OmtXaGF0U3RhcnQsICAgICAgICAwbGx9LAorICAgICAgICB7RXZlbnRUeXBlOjprV2hhdEFjdGl2aXR5LCAgICAgMzMzMzNsbH0sCisgICAgICAgIHtFdmVudFR5cGU6OmtXaGF0Q2hlY2twb2ludCwgICAwbGwsIDAsIDIsIDB9LAorCisgICAgICAgIC8vIGRvdWJsZSBjaGVjayB0aGF0IG9ubHkgbmV3IGNoZWNrZXIgbXNnIHRyaWdnZXJzIE9GRiwKKyAgICAgICAgLy8gbGVmdC1vdmVyIGNoZWNrZXIgbXNnIGZyb20gc3RhbGUgZ2VuZXJhdGUgZGlzY2FyZGVkCisgICAgICAgIHtFdmVudFR5cGU6OmtXaGF0Q2hlY2twb2ludCwgICBrV2FpdFN0YXR1c0NoYW5nZVVzLCAwLCAyLCAxfSwKKyAgICB9LCAxMDAwMDAwMGxsKTsKK30KKworVEVTVF9GKEJhdHRlcnlDaGVja2VyVGVzdCwgdGVzdEFjdGl2aXR5V2hpbGVOb3RFeGVjdXRpbmcpIHsKKyAgICBydW5UZXN0KHsKKyAgICAgICAgLy8gYWN0aXZpdHkgYmVmb3JlIHN0YXJ0IHNob3VsZG4ndCB0cmlnZ2VyCisgICAgICAgIHtFdmVudFR5cGU6OmtXaGF0QWN0aXZpdHksICAgICAwbGx9LAorICAgICAgICB7RXZlbnRUeXBlOjprV2hhdENoZWNrcG9pbnQsICAgMGxsLCAwLCAwLCAwfSwKKworICAgICAgICB7RXZlbnRUeXBlOjprV2hhdFN0YXJ0LCAgICAgICAgMGxsfSwKKyAgICAgICAge0V2ZW50VHlwZTo6a1doYXRDaGVja3BvaW50LCAgIDBsbCwgMCwgMCwgMH0sCisKKyAgICAgICAgLy8gYWN0aXZpdHkgYWZ0ZXIgc3RhcnQgYmVmb3JlIHN0b3Agc2hvdWxkIHRyaWdnZXIKKyAgICAgICAge0V2ZW50VHlwZTo6a1doYXRBY3Rpdml0eSwgICAgIDMzMzMzbGx9LAorICAgICAgICB7RXZlbnRUeXBlOjprV2hhdENoZWNrcG9pbnQsICAgMGxsLCAwLCAxLCAwfSwKKworICAgICAgICAvLyBzdG9wIGV4ZWN1dGluZyBzdGF0ZSBpdHNlbGYgc2hvdWxkbid0IHRyaWdnZXIgYW55IGNhbGxzCisgICAgICAgIHtFdmVudFR5cGU6OmtXaGF0U3RvcCwgICAgICAgICAwbGx9LAorICAgICAgICB7RXZlbnRUeXBlOjprV2hhdENoZWNrcG9pbnQsICAgMGxsLCAwLCAxLCAwfSwKKworICAgICAgICAvLyBrZWVwIHB1c2hpbmcgYW5vdGhlciAzIHNlY29uZHMgYWZ0ZXIgc3RvcCwgZXhwZWN0ZWQgdG8gT0ZGCisgICAgICAgIHtFdmVudFR5cGU6OmtXaGF0QWN0aXZpdHksICAgICAzMzMzM2xsLCBrV2FpdFN0YXR1c0NoYW5nZVVzLzMzMzMzbGx9LAorICAgICAgICB7RXZlbnRUeXBlOjprV2hhdENoZWNrcG9pbnQsICAgMGxsLCAwLCAxLCAxfSwKKyAgICB9LCAxMDAwMDAwMGxsKTsKK30KKworVEVTVF9GKEJhdHRlcnlDaGVja2VyVGVzdCwgdGVzdFNwYXJzZUFjdGl2aXR5KSB7CisgICAgcnVuVGVzdCh7CisgICAgICAgIHtFdmVudFR5cGU6OmtXaGF0U3RhcnQsICAgICAgICAwbGx9LAorICAgICAgICB7RXZlbnRUeXBlOjprV2hhdENoZWNrcG9pbnQsICAgMGxsLCAwLCAwLCAwfSwKKworICAgICAgICAvLyBhY3Rpdml0eSBhcnJpdmVzIHNwYXJzZWx5IHdpdGggaW50ZXJ2YWwgb25seSBzbGlnaHRseSBzbWFsbCB0aGFuIHRpbWVvdXQKKyAgICAgICAgLy8gc2hvdWxkIG9ubHkgdHJpZ2dlciAxIE9OCisgICAgICAgIHtFdmVudFR5cGU6OmtXaGF0QWN0aXZpdHksICAgICBrU3BhcnNlRnJhbWVJbnRlcnZhbFVzLCAyfSwKKyAgICAgICAge0V2ZW50VHlwZTo6a1doYXRDaGVja3BvaW50LCAgIDBsbCwgMCwgMSwgMH0sCisgICAgICAgIHtFdmVudFR5cGU6OmtXaGF0Q2hlY2twb2ludCwgICBrU3BhcnNlRnJhbWVJbnRlcnZhbFVzLCAwLCAxLCAwfSwKKyAgICAgICAge0V2ZW50VHlwZTo6a1doYXRDaGVja3BvaW50LCAgIGtUZXN0TWFyZ2luVXMsIDAsIDEsIDF9LCAvLyBPRkYKKyAgICB9LCAxMDAwMDAwMGxsKTsKK30KK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1OGVkMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY190ZXN0IHsKKyAgICBuYW1lOiAid3JpdGVyVGVzdCIsCisgICAgZ3Rlc3Q6IHRydWUsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJXcml0ZXJVdGlsaXR5LmNwcCIsCisgICAgICAgICJXcml0ZXJUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF93ZWJtIiwKKyAgICAgICAgImxpYmRhdGFzb3VyY2UiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJzdGFnZWZyaWdodF9lc2RzIiwKKyAgICAgICAgImxpYm9nZyIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHNhbml0aXplOiB7CisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgfSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MzE1NTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvQW5kcm9pZFRlc3QueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y29uZmlndXJhdGlvbiBkZXNjcmlwdGlvbj0iVGVzdCBtb2R1bGUgY29uZmlnIGZvciB3cml0ZXIgdGVzdHMiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJ3cml0ZXJUZXN0IiAvPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuUHVzaEZpbGVQcmVwYXJlciI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cCIgdmFsdWU9InRydWUiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icHVzaCIgdmFsdWU9IndyaXRlclRlc3QtPi9kYXRhL2xvY2FsL3RtcC93cml0ZXJUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyLnppcD91bnppcD10cnVlIgorICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC93cml0ZXJUZXN0UmVzLyIgLz4KKyAgICA8L3RhcmdldF9wcmVwYXJlcj4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuR1Rlc3QiID4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJuYXRpdmUtdGVzdC1kZXZpY2UtcGF0aCIgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcCIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJtb2R1bGUtbmFtZSIgdmFsdWU9IndyaXRlclRlc3QiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC93cml0ZXJUZXN0UmVzLyIgLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZTA3OTE3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1JFQURNRS5tZApAQCAtMCwwICsxLDMxIEBACisjIyBNZWRpYSBUZXN0aW5nICMjCistLS0KKyMjIyMgV3JpdGVyIDoKK1RoZSBXcml0ZXIgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIHdyaXRlcnMgYXZhaWxhYmxlIGluIGxpYnN0YWdlZnJpZ2h0LgorCitSdW4gdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB0aGUgdGVzdCBzdWl0ZToKK2BgYAorbW1tIGZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyLworYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCitUaGUgNjQtYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvCisKK1RvIHRlc3QgNjQtYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdDY0LgorCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0NjQvd3JpdGVyVGVzdC93cml0ZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KKworVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgorCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L3dyaXRlclRlc3Qvd3JpdGVyVGVzdCAvZGF0YS9sb2NhbC90bXAvCisKK1RoZSByZXNvdXJjZSBmaWxlIGZvciB0aGUgdGVzdHMgaXMgdGFrZW4gZnJvbSBbaGVyZV0oaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvd3JpdGVyVGVzdFJlcy56aXApLgorRG93bmxvYWQgYW5kIGV4dHJhY3QgdGhlIGZvbGRlci4gUHVzaCBhbGwgdGhlIGZpbGVzIGluIHRoaXMgZm9sZGVyIHRvIC9kYXRhL2xvY2FsL3RtcC8gb24gdGhlIGRldmljZS4KK2BgYAorYWRiIHB1c2ggd3JpdGVyVGVzdFJlcyAvZGF0YS9sb2NhbC90bXAvCitgYGAKKwordXNhZ2U6IHdyaXRlclRlc3QgLVAgXDxwYXRoX3RvX3Jlc19mb2xkZXJcPgorYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL3dyaXRlclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wLworYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyTGlzdGVuZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJMaXN0ZW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxZjBhN2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyTGlzdGVuZXIuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBXUklURVJfTElTVEVORVJfSF8KKyNkZWZpbmUgV1JJVEVSX0xJU1RFTkVSX0hfCisKKyNpbmNsdWRlIDxtdXRleD4KKworI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVJlY29yZGVyQ2xpZW50Lmg+CisjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIFdyaXRlckxpc3RlbmVyIDogcHVibGljIEJuTWVkaWFSZWNvcmRlckNsaWVudCB7CisgIHB1YmxpYzoKKyAgICBXcml0ZXJMaXN0ZW5lcigpIDogbVNpZ25hbGVkU2l6ZShmYWxzZSksIG1TaWduYWxlZER1cmF0aW9uKGZhbHNlKSB7fQorCisgICAgdmlydHVhbCB2b2lkIG5vdGlmeShpbnQzMl90IG1zZywgaW50MzJfdCBleHQxLCBpbnQzMl90IGV4dDIpIHsKKyAgICAgICAgQUxPR1YoIm1zZyA6ICVkLCBleHQxIDogJWQsIGV4dDIgOiAlZCIsIG1zZywgZXh0MSwgZXh0Mik7CisgICAgICAgIGlmIChleHQxID09IE1FRElBX1JFQ09SREVSX0lORk9fTUFYX0ZJTEVTSVpFX1JFQUNIRUQpIHsKKyAgICAgICAgICAgIG1TaWduYWxlZFNpemUgPSB0cnVlOworICAgICAgICB9IGVsc2UgaWYgKGV4dDEgPT0gTUVESUFfUkVDT1JERVJfSU5GT19NQVhfRFVSQVRJT05fUkVBQ0hFRCkgeworICAgICAgICAgICAgbVNpZ25hbGVkRHVyYXRpb24gPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgdm9sYXRpbGUgYm9vbCBtU2lnbmFsZWRTaXplOworICAgIHZvbGF0aWxlIGJvb2wgbVNpZ25hbGVkRHVyYXRpb247Cit9OworCisjZW5kaWYgIC8vIFdSSVRFUl9MSVNURU5FUl9IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclRlc3QuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYTJhYTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdC5jcHAKQEAgLTAsMCArMSw1ODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIldyaXRlclRlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCisjaW5jbHVkZSA8bWVkaWEvbWVkaWFyZWNvcmRlci5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQUFDV3JpdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvQU1SV3JpdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTVBFRzJUU1dyaXRlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01QRUc0V3JpdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvT2dnV3JpdGVyLmg+CisjaW5jbHVkZSA8d2VibS9XZWJtV3JpdGVyLmg+CisKKyNpbmNsdWRlICJXcml0ZXJUZXN0RW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJXcml0ZXJVdGlsaXR5LmgiCisKKyNkZWZpbmUgT1VUUFVUX0ZJTEVfTkFNRSAiL2RhdGEvbG9jYWwvdG1wL3dyaXRlci5vdXQiCisKK3N0YXRpYyBXcml0ZXJUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCitzdHJ1Y3QgY29uZmlnRm9ybWF0IHsKKyAgICBjaGFyIG1pbWVbMTI4XTsKKyAgICBpbnQzMl90IHdpZHRoOworICAgIGludDMyX3QgaGVpZ2h0OworICAgIGludDMyX3Qgc2FtcGxlUmF0ZTsKKyAgICBpbnQzMl90IGNoYW5uZWxDb3VudDsKK307CisKKy8vIExvb2tVcFRhYmxlIG9mIGNsaXBzIGFuZCBtZXRhZGF0YSBmb3IgY29tcG9uZW50IHRlc3RpbmcKK3N0YXRpYyBjb25zdCBzdHJ1Y3QgSW5wdXREYXRhIHsKKyAgICBjb25zdCBjaGFyICptaW1lOworICAgIHN0cmluZyBpbnB1dEZpbGU7CisgICAgc3RyaW5nIGluZm87CisgICAgaW50MzJfdCBmaXJzdFBhcmFtOworICAgIGludDMyX3Qgc2Vjb25kUGFyYW07CisgICAgYm9vbCBpc0F1ZGlvOworfSBrSW5wdXREYXRhW10gPSB7CisgICAgICAgIHtNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCAiYmJiX29wdXNfc3RlcmVvXzEyOGticHNfNDgwMDBoei5vcHVzIiwKKyAgICAgICAgICJiYmJfb3B1c19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLCA0ODAwMCwgMiwgdHJ1ZX0sCisgICAgICAgIHtNRURJQV9NSU1FVFlQRV9BVURJT19BQUMsICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouYWFjIiwKKyAgICAgICAgICJiYmJfYWFjX3N0ZXJlb18xMjhrYnBzXzQ4MDAwaHouaW5mbyIsIDQ4MDAwLCAyLCB0cnVlfSwKKyAgICAgICAge01FRElBX01JTUVUWVBFX0FVRElPX0FBQ19BRFRTLCAiTXBzXzJfYzJfZnIxX1NjMV9EYzJfMHgwM19yYXcuYWR0cyIsCisgICAgICAgICAiTXBzXzJfYzJfZnIxX1NjMV9EYzJfMHgwM19yYXcuaW5mbyIsIDQ4MDAwLCAyLCB0cnVlfSwKKyAgICAgICAge01FRElBX01JTUVUWVBFX0FVRElPX0FNUl9OQiwgInNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouYW1ybmIiLAorICAgICAgICAgInNpbmVfYW1ybmJfMWNoXzEya2Jwc184MDAwaHouaW5mbyIsIDgwMDAsIDEsIHRydWV9LAorICAgICAgICB7TUVESUFfTUlNRVRZUEVfQVVESU9fQU1SX1dCLCAiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5hbXJ3YiIsCisgICAgICAgICAiYmJiX2FtcndiXzFjaF8xNGticHNfMTYwMDBoei5pbmZvIiwgMTYwMDAsIDEsIHRydWV9LAorICAgICAgICB7TUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLCAiYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LnZvcmJpcyIsCisgICAgICAgICAiYmJiX3ZvcmJpc19zdGVyZW9fMTI4a2Jwc180ODAwMGh6LmluZm8iLCA0ODAwMCwgMiwgdHJ1ZX0sCisgICAgICAgIHtNRURJQV9NSU1FVFlQRV9BVURJT19GTEFDLCAiYmJiX2ZsYWNfc3RlcmVvXzY4MGticHNfNDgwMDBoei5mbGFjIiwKKyAgICAgICAgICJiYmJfZmxhY19zdGVyZW9fNjgwa2Jwc180ODAwMGh6LmluZm8iLCA0ODAwMCwgMiwgdHJ1ZX0sCisgICAgICAgIHtNRURJQV9NSU1FVFlQRV9WSURFT19WUDksICJiYmJfdnA5XzE3NngxNDRfMjg1a2Jwc182MGZwcy52cDkiLAorICAgICAgICAgImJiYl92cDlfMTc2eDE0NF8yODVrYnBzXzYwZnBzLmluZm8iLCAxNzYsIDE0NCwgZmFsc2V9LAorICAgICAgICB7TUVESUFfTUlNRVRZUEVfVklERU9fVlA4LCAiYmJiX3ZwOF8xNzZ4MTQ0XzI0MGticHNfNjBmcHMudnA4IiwKKyAgICAgICAgICJiYmJfdnA4XzE3NngxNDRfMjQwa2Jwc182MGZwcy5pbmZvIiwgMTc2LCAxNDQsIGZhbHNlfSwKKyAgICAgICAge01FRElBX01JTUVUWVBFX1ZJREVPX0FWQywgImJiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmgyNjQiLAorICAgICAgICAgImJiYl9hdmNfMTc2eDE0NF8zMDBrYnBzXzYwZnBzLmluZm8iLCAxNzYsIDE0NCwgZmFsc2V9LAorICAgICAgICB7TUVESUFfTUlNRVRZUEVfVklERU9fSEVWQywgImJiYl9oZXZjXzE3NngxNDRfMTc2a2Jwc182MGZwcy5oZXZjIiwKKyAgICAgICAgICJiYmJfaGV2Y18xNzZ4MTQ0XzE3NmticHNfNjBmcHMuaW5mbyIsIDE3NiwgMTQ0LCBmYWxzZX0sCisgICAgICAgIHtNRURJQV9NSU1FVFlQRV9WSURFT19BVjEsICJiYmJfYXYxXzE3Nl8xNDQuYXYxIiwgImJiYl9hdjFfMTc2XzE0NC5pbmZvIiwgMTc2LCAxNDQsIGZhbHNlfSwKKyAgICAgICAge01FRElBX01JTUVUWVBFX1ZJREVPX0gyNjMsICJiYmJfaDI2M18zNTJ4Mjg4XzMwMGticHNfMTJmcHMuaDI2MyIsCisgICAgICAgICAiYmJiX2gyNjNfMzUyeDI4OF8zMDBrYnBzXzEyZnBzLmluZm8iLCAzNTIsIDI4OCwgZmFsc2V9LAorICAgICAgICB7TUVESUFfTUlNRVRZUEVfVklERU9fTVBFRzQsICJiYmJfbXBlZzRfMzUyeDI4OF81MTJrYnBzXzMwZnBzLm00diIsCisgICAgICAgICAiYmJiX21wZWc0XzM1MngyODhfNTEya2Jwc18zMGZwcy5pbmZvIiwgMzUyLCAyODgsIGZhbHNlfSwKK307CisKK2NsYXNzIFdyaXRlclRlc3QgeworICBwdWJsaWM6CisgICAgV3JpdGVyVGVzdCgpIDogbVdyaXRlcihudWxscHRyKSwgbUZpbGVNZXRhKG51bGxwdHIpLCBtQ3VycmVudFRyYWNrKG51bGxwdHIpIHt9CisKKyAgICB+V3JpdGVyVGVzdCgpIHsKKyAgICAgICAgaWYgKG1GaWxlTWV0YSkgeworICAgICAgICAgICAgbUZpbGVNZXRhLmNsZWFyKCk7CisgICAgICAgICAgICBtRmlsZU1ldGEgPSBudWxscHRyOworICAgICAgICB9CisgICAgICAgIGlmIChtQ3VycmVudFRyYWNrKSB7CisgICAgICAgICAgICBtQ3VycmVudFRyYWNrLT5zdG9wKCk7CisgICAgICAgICAgICBtQ3VycmVudFRyYWNrLmNsZWFyKCk7CisgICAgICAgICAgICBtQ3VycmVudFRyYWNrID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAobVdyaXRlcikgeworICAgICAgICAgICAgbVdyaXRlci5jbGVhcigpOworICAgICAgICAgICAgbVdyaXRlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgbUJ1ZmZlckluZm8uY2xlYXIoKTsKKyAgICAgICAgaWYgKG1JbnB1dFN0cmVhbS5pc19vcGVuKCkpIG1JbnB1dFN0cmVhbS5jbG9zZSgpOworICAgIH0KKworICAgIHZvaWQgc2V0dXBXcml0ZXJUeXBlKHN0cmluZyB3cml0ZXJGb3JtYXQpIHsKKyAgICAgICAgbU51bUNzZHMgPSAwOworICAgICAgICBtSW5wdXRGcmFtZUlkID0gMDsKKyAgICAgICAgbVdyaXRlck5hbWUgPSB1bmtub3duX2NvbXA7CisgICAgICAgIG1EaXNhYmxlVGVzdCA9IGZhbHNlOworICAgICAgICBzdGF0aWMgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0YW5kYXJkV3JpdGVycz4gbWFwV3JpdGVyID0geworICAgICAgICAgICAgICAgIHsib2dnIiwgT0dHfSwgICAgIHsiYWFjIiwgQUFDfSwgICAgICB7ImFhY19hZHRzIiwgQUFDX0FEVFN9LCB7IndlYm0iLCBXRUJNfSwKKyAgICAgICAgICAgICAgICB7Im1wZWc0IiwgTVBFRzR9LCB7ImFtcm5iIiwgQU1SX05CfSwgeyJhbXJ3YiIsIEFNUl9XQn0sICAgICAgeyJtcGVnMlRzIiwgTVBFRzJUU319OworICAgICAgICAvLyBGaW5kIHRoZSBjb21wb25lbnQgdHlwZQorICAgICAgICBpZiAobWFwV3JpdGVyLmZpbmQod3JpdGVyRm9ybWF0KSAhPSBtYXBXcml0ZXIuZW5kKCkpIHsKKyAgICAgICAgICAgIG1Xcml0ZXJOYW1lID0gbWFwV3JpdGVyLmF0KHdyaXRlckZvcm1hdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1Xcml0ZXJOYW1lID09IHN0YW5kYXJkV3JpdGVyczo6dW5rbm93bl9jb21wKSB7CisgICAgICAgICAgICBjb3V0IDw8ICJbICAgV0FSTiAgIF0gVGVzdCBTa2lwcGVkLiBObyBzcGVjaWZpYyB3cml0ZXIgbWVudGlvbmVkXG4iOworICAgICAgICAgICAgbURpc2FibGVUZXN0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgZ2V0SW5wdXRCdWZmZXJJbmZvKHN0cmluZyBpbnB1dEZpbGVOYW1lLCBzdHJpbmcgaW5wdXRJbmZvKTsKKworICAgIGludDMyX3QgY3JlYXRlV3JpdGVyKGludDMyX3QgZmQpOworCisgICAgaW50MzJfdCBhZGRXcml0ZXJTb3VyY2UoYm9vbCBpc0F1ZGlvLCBjb25maWdGb3JtYXQgcGFyYW1zKTsKKworICAgIGVudW0gc3RhbmRhcmRXcml0ZXJzIHsKKyAgICAgICAgT0dHLAorICAgICAgICBBQUMsCisgICAgICAgIEFBQ19BRFRTLAorICAgICAgICBXRUJNLAorICAgICAgICBNUEVHNCwKKyAgICAgICAgQU1SX05CLAorICAgICAgICBBTVJfV0IsCisgICAgICAgIE1QRUcyVFMsCisgICAgICAgIHVua25vd25fY29tcCwKKyAgICB9OworCisgICAgc3RhbmRhcmRXcml0ZXJzIG1Xcml0ZXJOYW1lOworICAgIHNwPE1lZGlhV3JpdGVyPiBtV3JpdGVyOworICAgIHNwPE1ldGFEYXRhPiBtRmlsZU1ldGE7CisgICAgc3A8TWVkaWFBZGFwdGVyPiBtQ3VycmVudFRyYWNrOworCisgICAgYm9vbCBtRGlzYWJsZVRlc3Q7CisgICAgaW50MzJfdCBtTnVtQ3NkczsKKyAgICBpbnQzMl90IG1JbnB1dEZyYW1lSWQ7CisgICAgaWZzdHJlYW0gbUlucHV0U3RyZWFtOworICAgIHZlY3RvcjxCdWZmZXJJbmZvPiBtQnVmZmVySW5mbzsKK307CisKK2NsYXNzIFdyaXRlRnVuY3Rpb25hbGl0eVRlc3QgOiBwdWJsaWMgV3JpdGVyVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHBhaXI8c3RyaW5nLCBpbnQzMl90Pj4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBzZXR1cFdyaXRlclR5cGUoR2V0UGFyYW0oKS5maXJzdCk7IH0KK307CisKK3ZvaWQgV3JpdGVyVGVzdDo6Z2V0SW5wdXRCdWZmZXJJbmZvKHN0cmluZyBpbnB1dEZpbGVOYW1lLCBzdHJpbmcgaW5wdXRJbmZvKSB7CisgICAgc3RkOjppZnN0cmVhbSBlbGVJbmZvOworICAgIGVsZUluZm8ub3BlbihpbnB1dEluZm8uY19zdHIoKSk7CisgICAgQVNTRVJUX0VRKGVsZUluZm8uaXNfb3BlbigpLCB0cnVlKTsKKyAgICBpbnQzMl90IGJ5dGVzQ291bnQgPSAwOworICAgIHVpbnQzMl90IGZsYWdzID0gMDsKKyAgICBpbnQ2NF90IHRpbWVzdGFtcCA9IDA7CisgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgaWYgKCEoZWxlSW5mbyA+PiBieXRlc0NvdW50KSkgYnJlYWs7CisgICAgICAgIGVsZUluZm8gPj4gZmxhZ3M7CisgICAgICAgIGVsZUluZm8gPj4gdGltZXN0YW1wOworICAgICAgICBtQnVmZmVySW5mby5wdXNoX2JhY2soe2J5dGVzQ291bnQsIGZsYWdzLCB0aW1lc3RhbXB9KTsKKyAgICAgICAgaWYgKGZsYWdzID09IENPREVDX0NPTkZJR19GTEFHKSBtTnVtQ3NkcysrOworICAgIH0KKyAgICBlbGVJbmZvLmNsb3NlKCk7CisgICAgbUlucHV0U3RyZWFtLm9wZW4oaW5wdXRGaWxlTmFtZS5jX3N0cigpLCBzdGQ6Omlmc3RyZWFtOjpiaW5hcnkpOworICAgIEFTU0VSVF9FUShtSW5wdXRTdHJlYW0uaXNfb3BlbigpLCB0cnVlKTsKK30KKworaW50MzJfdCBXcml0ZXJUZXN0OjpjcmVhdGVXcml0ZXIoaW50MzJfdCBmZCkgeworICAgIG1GaWxlTWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBzd2l0Y2ggKG1Xcml0ZXJOYW1lKSB7CisgICAgICAgIGNhc2UgT0dHOgorICAgICAgICAgICAgbVdyaXRlciA9IG5ldyBPZ2dXcml0ZXIoZmQpOworICAgICAgICAgICAgbUZpbGVNZXRhLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG91dHB1dF9mb3JtYXQ6Ok9VVFBVVF9GT1JNQVRfT0dHKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFBQzoKKyAgICAgICAgICAgIG1Xcml0ZXIgPSBuZXcgQUFDV3JpdGVyKGZkKTsKKyAgICAgICAgICAgIG1GaWxlTWV0YS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBvdXRwdXRfZm9ybWF0OjpPVVRQVVRfRk9STUFUX0FBQ19BRElGKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFBQ19BRFRTOgorICAgICAgICAgICAgbVdyaXRlciA9IG5ldyBBQUNXcml0ZXIoZmQpOworICAgICAgICAgICAgbUZpbGVNZXRhLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG91dHB1dF9mb3JtYXQ6Ok9VVFBVVF9GT1JNQVRfQUFDX0FEVFMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV0VCTToKKyAgICAgICAgICAgIG1Xcml0ZXIgPSBuZXcgV2VibVdyaXRlcihmZCk7CisgICAgICAgICAgICBtRmlsZU1ldGEtPnNldEludDMyKGtLZXlGaWxlVHlwZSwgb3V0cHV0X2Zvcm1hdDo6T1VUUFVUX0ZPUk1BVF9XRUJNKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1QRUc0OgorICAgICAgICAgICAgbVdyaXRlciA9IG5ldyBNUEVHNFdyaXRlcihmZCk7CisgICAgICAgICAgICBtRmlsZU1ldGEtPnNldEludDMyKGtLZXlGaWxlVHlwZSwgb3V0cHV0X2Zvcm1hdDo6T1VUUFVUX0ZPUk1BVF9NUEVHXzQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQU1SX05COgorICAgICAgICAgICAgbVdyaXRlciA9IG5ldyBBTVJXcml0ZXIoZmQpOworICAgICAgICAgICAgbUZpbGVNZXRhLT5zZXRJbnQzMihrS2V5RmlsZVR5cGUsIG91dHB1dF9mb3JtYXQ6Ok9VVFBVVF9GT1JNQVRfQU1SX05CKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEFNUl9XQjoKKyAgICAgICAgICAgIG1Xcml0ZXIgPSBuZXcgQU1SV3JpdGVyKGZkKTsKKyAgICAgICAgICAgIG1GaWxlTWV0YS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBvdXRwdXRfZm9ybWF0OjpPVVRQVVRfRk9STUFUX0FNUl9XQik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNUEVHMlRTOgorICAgICAgICAgICAgbVdyaXRlciA9IG5ldyBNUEVHMlRTV3JpdGVyKGZkKTsKKyAgICAgICAgICAgIG1GaWxlTWV0YS0+c2V0SW50MzIoa0tleUZpbGVUeXBlLCBvdXRwdXRfZm9ybWF0OjpPVVRQVVRfRk9STUFUX01QRUcyVFMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChtV3JpdGVyID09IG51bGxwdHIpIHJldHVybiAtMTsKKyAgICBtRmlsZU1ldGEtPnNldEludDMyKGtLZXlSZWFsVGltZVJlY29yZGluZywgZmFsc2UpOworICAgIHJldHVybiAwOworfQorCitpbnQzMl90IFdyaXRlclRlc3Q6OmFkZFdyaXRlclNvdXJjZShib29sIGlzQXVkaW8sIGNvbmZpZ0Zvcm1hdCBwYXJhbXMpIHsKKyAgICBpZiAobUlucHV0RnJhbWVJZCkgcmV0dXJuIC0xOworICAgIHNwPEFNZXNzYWdlPiBmb3JtYXQgPSBuZXcgQU1lc3NhZ2U7CisgICAgaWYgKG1JbnB1dFN0cmVhbS5pc19vcGVuKCkpIHsKKyAgICAgICAgZm9ybWF0LT5zZXRTdHJpbmcoIm1pbWUiLCBwYXJhbXMubWltZSk7CisgICAgICAgIGlmIChpc0F1ZGlvKSB7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJjaGFubmVsLWNvdW50IiwgcGFyYW1zLmNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBmb3JtYXQtPnNldEludDMyKCJzYW1wbGUtcmF0ZSIsIHBhcmFtcy5zYW1wbGVSYXRlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoIndpZHRoIiwgcGFyYW1zLndpZHRoKTsKKyAgICAgICAgICAgIGZvcm1hdC0+c2V0SW50MzIoImhlaWdodCIsIHBhcmFtcy5oZWlnaHQpOworICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBzdGF0dXMgPQorICAgICAgICAgICAgICAgIHdyaXRlSGVhZGVyQnVmZmVycyhtSW5wdXRTdHJlYW0sIG1CdWZmZXJJbmZvLCBtSW5wdXRGcmFtZUlkLCBmb3JtYXQsIG1OdW1Dc2RzKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSAwKSByZXR1cm4gLTE7CisgICAgfQorICAgIHNwPE1ldGFEYXRhPiB0cmFja01ldGEgPSBuZXcgTWV0YURhdGE7CisgICAgY29udmVydE1lc3NhZ2VUb01ldGFEYXRhKGZvcm1hdCwgdHJhY2tNZXRhKTsKKyAgICBtQ3VycmVudFRyYWNrID0gbmV3IE1lZGlhQWRhcHRlcih0cmFja01ldGEpOworICAgIGlmIChtQ3VycmVudFRyYWNrID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIk1lZGlhQWRhcHRlciByZXR1cm5lZCBudWxscHRyIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gbVdyaXRlci0+YWRkU291cmNlKG1DdXJyZW50VHJhY2spOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgZ2V0RmlsZURldGFpbHMoc3RyaW5nICZpbnB1dEZpbGVQYXRoLCBzdHJpbmcgJmluZm8sIGNvbmZpZ0Zvcm1hdCAmcGFyYW1zLCBib29sICZpc0F1ZGlvLAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0cmVhbUluZGV4ID0gMCkgeworICAgIGlmIChzdHJlYW1JbmRleCA+PSBzaXplb2Yoa0lucHV0RGF0YSkgLyBzaXplb2Yoa0lucHV0RGF0YVswXSkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpbnB1dEZpbGVQYXRoICs9IGtJbnB1dERhdGFbc3RyZWFtSW5kZXhdLmlucHV0RmlsZTsKKyAgICBpbmZvICs9IGtJbnB1dERhdGFbc3RyZWFtSW5kZXhdLmluZm87CisgICAgc3RyY3B5KHBhcmFtcy5taW1lLCBrSW5wdXREYXRhW3N0cmVhbUluZGV4XS5taW1lKTsKKyAgICBpc0F1ZGlvID0ga0lucHV0RGF0YVtzdHJlYW1JbmRleF0uaXNBdWRpbzsKKyAgICBpZiAoaXNBdWRpbykgeworICAgICAgICBwYXJhbXMuc2FtcGxlUmF0ZSA9IGtJbnB1dERhdGFbc3RyZWFtSW5kZXhdLmZpcnN0UGFyYW07CisgICAgICAgIHBhcmFtcy5jaGFubmVsQ291bnQgPSBrSW5wdXREYXRhW3N0cmVhbUluZGV4XS5zZWNvbmRQYXJhbTsKKyAgICB9IGVsc2UgeworICAgICAgICBwYXJhbXMud2lkdGggPSBrSW5wdXREYXRhW3N0cmVhbUluZGV4XS5maXJzdFBhcmFtOworICAgICAgICBwYXJhbXMuaGVpZ2h0ID0ga0lucHV0RGF0YVtzdHJlYW1JbmRleF0uc2Vjb25kUGFyYW07CisgICAgfQorICAgIHJldHVybjsKK30KKworVEVTVF9QKFdyaXRlRnVuY3Rpb25hbGl0eVRlc3QsIENyZWF0ZVdyaXRlclRlc3QpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQUxPR1YoIlRlc3RzIHRoZSBjcmVhdGlvbiBvZiB3cml0ZXJzIik7CisKKyAgICBzdHJpbmcgb3V0cHV0RmlsZSA9IE9VVFBVVF9GSUxFX05BTUU7CisgICAgaW50MzJfdCBmZCA9CisgICAgICAgICAgICBvcGVuKG91dHB1dEZpbGUuY19zdHIoKSwgT19DUkVBVCB8IE9fTEFSR0VGSUxFIHwgT19UUlVOQyB8IE9fUkRXUiwgU19JUlVTUiB8IFNfSVdVU1IpOworICAgIEFTU0VSVF9HRShmZCwgMCkgPDwgIkZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlIHRvIGR1bXAgd3JpdGVyJ3MgZGF0YSI7CisKKyAgICAvLyBDcmVhdGluZyB3cml0ZXIgd2l0aGluIGEgdGVzdCBzY29wZS4gRGVzdHJ1Y3RvciBzaG91bGQgYmUgY2FsbGVkIHdoZW4gdGhlIHRlc3QgZW5kcworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIGNyZWF0ZVdyaXRlcihmZCkpCisgICAgICAgICAgICA8PCAiRmFpbGVkIHRvIGNyZWF0ZSB3cml0ZXIgZm9yIG91dHB1dCBmb3JtYXQ6IiA8PCBHZXRQYXJhbSgpLmZpcnN0OworfQorCitURVNUX1AoV3JpdGVGdW5jdGlvbmFsaXR5VGVzdCwgV3JpdGVyVGVzdCkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBTE9HVigiQ2hlY2tzIGlmIGZvciBhIGdpdmVuIGlucHV0LCBhIHZhbGlkIG11eGVkIGZpbGUgaGFzIGJlZW4gY3JlYXRlZCBvciBub3QiKTsKKworICAgIHN0cmluZyB3cml0ZXJGb3JtYXQgPSBHZXRQYXJhbSgpLmZpcnN0OworICAgIHN0cmluZyBvdXRwdXRGaWxlID0gT1VUUFVUX0ZJTEVfTkFNRTsKKyAgICBpbnQzMl90IGZkID0KKyAgICAgICAgICAgIG9wZW4ob3V0cHV0RmlsZS5jX3N0cigpLCBPX0NSRUFUIHwgT19MQVJHRUZJTEUgfCBPX1RSVU5DIHwgT19SRFdSLCBTX0lSVVNSIHwgU19JV1VTUik7CisgICAgQVNTRVJUX0dFKGZkLCAwKSA8PCAiRmFpbGVkIHRvIG9wZW4gb3V0cHV0IGZpbGUgdG8gZHVtcCB3cml0ZXIncyBkYXRhIjsKKworICAgIGludDMyX3Qgc3RhdHVzID0gY3JlYXRlV3JpdGVyKGZkKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIHdyaXRlciBmb3Igb3V0cHV0IGZvcm1hdDoiIDw8IHdyaXRlckZvcm1hdDsKKworICAgIHN0cmluZyBpbnB1dEZpbGUgPSBnRW52LT5nZXRSZXMoKTsKKyAgICBzdHJpbmcgaW5wdXRJbmZvID0gZ0Vudi0+Z2V0UmVzKCk7CisgICAgY29uZmlnRm9ybWF0IHBhcmFtOworICAgIGJvb2wgaXNBdWRpbzsKKyAgICBpbnQzMl90IGlucHV0RmlsZUlkeCA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIGdldEZpbGVEZXRhaWxzKGlucHV0RmlsZSwgaW5wdXRJbmZvLCBwYXJhbSwgaXNBdWRpbywgaW5wdXRGaWxlSWR4KTsKKyAgICBBU1NFUlRfTkUoaW5wdXRGaWxlLmNvbXBhcmUoZ0Vudi0+Z2V0UmVzKCkpLCAwKSA8PCAiTm8gaW5wdXQgZmlsZSBzcGVjaWZpZWQiOworCisgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoZ2V0SW5wdXRCdWZmZXJJbmZvKGlucHV0RmlsZSwgaW5wdXRJbmZvKSk7CisgICAgc3RhdHVzID0gYWRkV3JpdGVyU291cmNlKGlzQXVkaW8sIHBhcmFtKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gYWRkIHNvdXJjZSBmb3IgIiA8PCB3cml0ZXJGb3JtYXQgPDwgIldyaXRlciI7CisKKyAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdGFydChtRmlsZU1ldGEuZ2V0KCkpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cyk7CisgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW0sIG1CdWZmZXJJbmZvLCBtSW5wdXRGcmFtZUlkLCBtQ3VycmVudFRyYWNrLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlckluZm8uc2l6ZSgpKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciBmYWlsZWQiOworICAgIG1DdXJyZW50VHJhY2stPnN0b3AoKTsKKworICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgd3JpdGVyIjsKKyAgICBjbG9zZShmZCk7Cit9CisKK1RFU1RfUChXcml0ZUZ1bmN0aW9uYWxpdHlUZXN0LCBQYXVzZVdyaXRlclRlc3QpIHsKKyAgICBpZiAobURpc2FibGVUZXN0KSByZXR1cm47CisgICAgQUxPR1YoIlZhbGlkYXRlcyB0aGUgcGF1c2UoKSBhcGkgb2Ygd3JpdGVycyIpOworCisgICAgc3RyaW5nIHdyaXRlckZvcm1hdCA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgc3RyaW5nIG91dHB1dEZpbGUgPSBPVVRQVVRfRklMRV9OQU1FOworICAgIGludDMyX3QgZmQgPQorICAgICAgICAgICAgb3BlbihvdXRwdXRGaWxlLmNfc3RyKCksIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNSKTsKKyAgICBBU1NFUlRfR0UoZmQsIDApIDw8ICJGYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSB0byBkdW1wIHdyaXRlcidzIGRhdGEiOworCisgICAgaW50MzJfdCBzdGF0dXMgPSBjcmVhdGVXcml0ZXIoZmQpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBjcmVhdGUgd3JpdGVyIGZvciBvdXRwdXQgZm9ybWF0OiIgPDwgd3JpdGVyRm9ybWF0OworCisgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpOworICAgIHN0cmluZyBpbnB1dEluZm8gPSBnRW52LT5nZXRSZXMoKTsKKyAgICBjb25maWdGb3JtYXQgcGFyYW07CisgICAgYm9vbCBpc0F1ZGlvOworICAgIGludDMyX3QgaW5wdXRGaWxlSWR4ID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtLCBpc0F1ZGlvLCBpbnB1dEZpbGVJZHgpOworICAgIEFTU0VSVF9ORShpbnB1dEZpbGUuY29tcGFyZShnRW52LT5nZXRSZXMoKSksIDApIDw8ICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZCI7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dEJ1ZmZlckluZm8oaW5wdXRGaWxlLCBpbnB1dEluZm8pKTsKKyAgICBzdGF0dXMgPSBhZGRXcml0ZXJTb3VyY2UoaXNBdWRpbywgcGFyYW0pOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBhZGQgc291cmNlIGZvciAiIDw8IHdyaXRlckZvcm1hdCA8PCAiV3JpdGVyIjsKKworICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKTsKKyAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbSwgbUJ1ZmZlckluZm8sIG1JbnB1dEZyYW1lSWQsIG1DdXJyZW50VHJhY2ssIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQnVmZmVySW5mby5zaXplKCkgLyA0KTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciBmYWlsZWQiOworCisgICAgYm9vbCBpc1BhdXNlZCA9IGZhbHNlOworICAgIGlmICgobVdyaXRlck5hbWUgIT0gc3RhbmRhcmRXcml0ZXJzOjpNUEVHMlRTKSAmJiAobVdyaXRlck5hbWUgIT0gc3RhbmRhcmRXcml0ZXJzOjpNUEVHNCkpIHsKKyAgICAgICAgc3RhdHVzID0gbVdyaXRlci0+cGF1c2UoKTsKKyAgICAgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKTsKKyAgICAgICAgaXNQYXVzZWQgPSB0cnVlOworICAgIH0KKyAgICAvLyBJbiB0aGUgcGF1c2Ugc3RhdGUsIHdyaXRlcnMgc2hvdWxkbid0IHdyaXRlIGFueXRoaW5nLiBUZXN0aW5nIHRoZSB3cml0ZXJzIGZvciB0aGUgc2FtZQorICAgIGludDMyX3QgbnVtRnJhbWVzUGF1c2VkID0gbUJ1ZmZlckluZm8uc2l6ZSgpIC8gNDsKKyAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbSwgbUJ1ZmZlckluZm8sIG1JbnB1dEZyYW1lSWQsIG1DdXJyZW50VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RnJhbWVJZCwgbnVtRnJhbWVzUGF1c2VkLCBpc1BhdXNlZCk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIgZmFpbGVkIjsKKworICAgIGlmIChpc1BhdXNlZCkgeworICAgICAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdGFydChtRmlsZU1ldGEuZ2V0KCkpOworICAgICAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpOworICAgIH0KKyAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbSwgbUJ1ZmZlckluZm8sIG1JbnB1dEZyYW1lSWQsIG1DdXJyZW50VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RnJhbWVJZCwgbUJ1ZmZlckluZm8uc2l6ZSgpKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciBmYWlsZWQiOworICAgIG1DdXJyZW50VHJhY2stPnN0b3AoKTsKKworICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgd3JpdGVyIjsKKyAgICBjbG9zZShmZCk7Cit9CisKK1RFU1RfUChXcml0ZUZ1bmN0aW9uYWxpdHlUZXN0LCBNdWx0aVN0YXJ0U3RvcFBhdXNlVGVzdCkgeworICAgIC8vIFRPRE86IChiLzE0NDgyMTgwNCkKKyAgICAvLyBFbmFibGUgdGhlIHRlc3QgZm9yIE1QRTJUUyB3cml0ZXIKKyAgICBpZiAobURpc2FibGVUZXN0IHx8IG1Xcml0ZXJOYW1lID09IHN0YW5kYXJkV3JpdGVyczo6TVBFRzJUUykgcmV0dXJuOworICAgIEFMT0dWKCJUZXN0IHdyaXRlcnMgZm9yIG11bHRpcGxlIHN0YXJ0LCBzdG9wIGFuZCBwYXVzZSBjYWxscyIpOworCisgICAgc3RyaW5nIG91dHB1dEZpbGUgPSBPVVRQVVRfRklMRV9OQU1FOworICAgIGludDMyX3QgZmQgPQorICAgICAgICAgICAgb3BlbihvdXRwdXRGaWxlLmNfc3RyKCksIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNSKTsKKyAgICBBU1NFUlRfR0UoZmQsIDApIDw8ICJGYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSB0byBkdW1wIHdyaXRlcidzIGRhdGEiOworCisgICAgc3RyaW5nIHdyaXRlckZvcm1hdCA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgaW50MzJfdCBzdGF0dXMgPSBjcmVhdGVXcml0ZXIoZmQpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIChzdGF0dXNfdClPSykgPDwgIkZhaWxlZCB0byBjcmVhdGUgd3JpdGVyIGZvciBvdXRwdXQgZm9ybWF0OiIgPDwgd3JpdGVyRm9ybWF0OworCisgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpOworICAgIHN0cmluZyBpbnB1dEluZm8gPSBnRW52LT5nZXRSZXMoKTsKKyAgICBjb25maWdGb3JtYXQgcGFyYW07CisgICAgYm9vbCBpc0F1ZGlvOworICAgIGludDMyX3QgaW5wdXRGaWxlSWR4ID0gR2V0UGFyYW0oKS5zZWNvbmQ7CisgICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtLCBpc0F1ZGlvLCBpbnB1dEZpbGVJZHgpOworICAgIEFTU0VSVF9ORShpbnB1dEZpbGUuY29tcGFyZShnRW52LT5nZXRSZXMoKSksIDApIDw8ICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZCI7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dEJ1ZmZlckluZm8oaW5wdXRGaWxlLCBpbnB1dEluZm8pKTsKKyAgICBzdGF0dXMgPSBhZGRXcml0ZXJTb3VyY2UoaXNBdWRpbywgcGFyYW0pOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBhZGQgc291cmNlIGZvciAiIDw8IHdyaXRlckZvcm1hdCA8PCAiV3JpdGVyIjsKKworICAgIC8vIGZpcnN0IHN0YXJ0IHNob3VsZCBzdWNjZWVkLgorICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiQ291bGQgbm90IHN0YXJ0IHRoZSB3cml0ZXIiOworCisgICAgLy8gTXVsdGlwbGUgc3RhcnQoKSBtYXkvbWF5IG5vdCBzdWNjZWVkLgorICAgIC8vIFdyaXRlcnMgYXJlIGV4cGVjdGVkIHRvIG5vdCBjcmFzaCBvbiBtdWx0aXBsZSBzdGFydCgpIGNhbGxzLgorICAgIGZvciAoaW50MzJfdCBjb3VudCA9IDA7IGNvdW50IDwga01heENvdW50OyBjb3VudCsrKSB7CisgICAgICAgIG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7CisgICAgfQorCisgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW0sIG1CdWZmZXJJbmZvLCBtSW5wdXRGcmFtZUlkLCBtQ3VycmVudFRyYWNrLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlckluZm8uc2l6ZSgpIC8gNCk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCB3cml0ZXJGb3JtYXQgPDwgIiB3cml0ZXIgZmFpbGVkIjsKKworICAgIGZvciAoaW50MzJfdCBjb3VudCA9IDA7IGNvdW50IDwga01heENvdW50OyBjb3VudCsrKSB7CisgICAgICAgIG1Xcml0ZXItPnBhdXNlKCk7CisgICAgICAgIG1Xcml0ZXItPnN0YXJ0KG1GaWxlTWV0YS5nZXQoKSk7CisgICAgfQorCisgICAgbVdyaXRlci0+cGF1c2UoKTsKKyAgICBpbnQzMl90IG51bUZyYW1lc1BhdXNlZCA9IG1CdWZmZXJJbmZvLnNpemUoKSAvIDQ7CisgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW0sIG1CdWZmZXJJbmZvLCBtSW5wdXRGcmFtZUlkLCBtQ3VycmVudFRyYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUlucHV0RnJhbWVJZCwgbnVtRnJhbWVzUGF1c2VkLCB0cnVlKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8IHdyaXRlckZvcm1hdCA8PCAiIHdyaXRlciBmYWlsZWQiOworCisgICAgZm9yIChpbnQzMl90IGNvdW50ID0gMDsgY291bnQgPCBrTWF4Q291bnQ7IGNvdW50KyspIHsKKyAgICAgICAgbVdyaXRlci0+c3RhcnQobUZpbGVNZXRhLmdldCgpKTsKKyAgICB9CisKKyAgICBzdGF0dXMgPSBzZW5kQnVmZmVyc1RvV3JpdGVyKG1JbnB1dFN0cmVhbSwgbUJ1ZmZlckluZm8sIG1JbnB1dEZyYW1lSWQsIG1DdXJyZW50VHJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGcmFtZUlkLCBtQnVmZmVySW5mby5zaXplKCkpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIGZhaWxlZCI7CisKKyAgICBtQ3VycmVudFRyYWNrLT5zdG9wKCk7CisKKyAgICAvLyBmaXJzdCBzdG9wIHNob3VsZCBzdWNjZWVkLgorICAgIHN0YXR1cyA9IG1Xcml0ZXItPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoKHN0YXR1c190KU9LLCBzdGF0dXMpIDw8ICJGYWlsZWQgdG8gc3RvcCB0aGUgd3JpdGVyIjsKKyAgICAvLyBNdWx0aXBsZSBzdG9wKCkgbWF5L21heSBub3Qgc3VjY2VlZC4KKyAgICAvLyBXcml0ZXJzIGFyZSBleHBlY3RlZCB0byBub3QgY3Jhc2ggb24gbXVsdGlwbGUgc3RvcCgpIGNhbGxzLgorICAgIGZvciAoaW50MzJfdCBjb3VudCA9IDA7IGNvdW50IDwga01heENvdW50OyBjb3VudCsrKSB7CisgICAgICAgIG1Xcml0ZXItPnN0b3AoKTsKKyAgICB9CisgICAgY2xvc2UoZmQpOworfQorCitjbGFzcyBMaXN0ZW5lclRlc3QgOiBwdWJsaWMgV3JpdGVyVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR1cGxlPHN0cmluZyAvKiB3cml0ZXJGb3JtYXQqLywgaW50MzJfdCAvKiBpbnB1dEZpbGVJZHgqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgLyogRmlsZVNpemVMaW1pdCovLCBmbG9hdCAvKiBGaWxlRHVyYXRpb25MaW1pdCovPj4geworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICB0dXBsZTxzdHJpbmcsIGludDMyX3QsIGZsb2F0LCBmbG9hdD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICAgICAgc2V0dXBXcml0ZXJUeXBlKGdldDwwPihwYXJhbXMpKTsKKyAgICB9Cit9OworCitURVNUX1AoTGlzdGVuZXJUZXN0LCBTZXRNYXhGaWxlTGltaXRzVGVzdCkgeworICAgIGlmIChtRGlzYWJsZVRlc3QpIHJldHVybjsKKyAgICBBTE9HVigiVmFsaWRhdGVzIHdyaXRlciB3aGVuIG1heCBmaWxlIGxpbWl0cyBhcmUgc2V0Iik7CisKKyAgICB0dXBsZTxzdHJpbmcsIGludDMyX3QsIGZsb2F0LCBmbG9hdD4gcGFyYW1zID0gR2V0UGFyYW0oKTsKKyAgICBzdHJpbmcgd3JpdGVyRm9ybWF0ID0gZ2V0PDA+KHBhcmFtcyk7CisgICAgc3RyaW5nIG91dHB1dEZpbGUgPSBPVVRQVVRfRklMRV9OQU1FOworICAgIGludDMyX3QgZmQgPQorICAgICAgICAgICAgb3BlbihvdXRwdXRGaWxlLmNfc3RyKCksIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNSKTsKKyAgICBBU1NFUlRfR0UoZmQsIDApIDw8ICJGYWlsZWQgdG8gb3BlbiBvdXRwdXQgZmlsZSB0byBkdW1wIHdyaXRlcidzIGRhdGEiOworCisgICAgaW50MzJfdCBzdGF0dXMgPSBjcmVhdGVXcml0ZXIoZmQpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBjcmVhdGUgd3JpdGVyIGZvciBvdXRwdXQgZm9ybWF0OiIgPDwgd3JpdGVyRm9ybWF0OworCisgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpOworICAgIHN0cmluZyBpbnB1dEluZm8gPSBnRW52LT5nZXRSZXMoKTsKKyAgICBjb25maWdGb3JtYXQgcGFyYW07CisgICAgYm9vbCBpc0F1ZGlvOworICAgIGludDMyX3QgaW5wdXRGaWxlSWR4ID0gZ2V0PDE+KHBhcmFtcyk7CisgICAgZ2V0RmlsZURldGFpbHMoaW5wdXRGaWxlLCBpbnB1dEluZm8sIHBhcmFtLCBpc0F1ZGlvLCBpbnB1dEZpbGVJZHgpOworICAgIEFTU0VSVF9ORShpbnB1dEZpbGUuY29tcGFyZShnRW52LT5nZXRSZXMoKSksIDApIDw8ICJObyBpbnB1dCBmaWxlIHNwZWNpZmllZCI7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShnZXRJbnB1dEJ1ZmZlckluZm8oaW5wdXRGaWxlLCBpbnB1dEluZm8pKTsKKyAgICBzdGF0dXMgPSBhZGRXcml0ZXJTb3VyY2UoaXNBdWRpbywgcGFyYW0pOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgIkZhaWxlZCB0byBhZGQgc291cmNlIGZvciAiIDw8IHdyaXRlckZvcm1hdCA8PCAiV3JpdGVyIjsKKworICAgIC8vIFJlYWQgZmlsZSBwcm9wZXJ0aWVzCisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIHN0YXR1cyA9IHN0YXQoaW5wdXRGaWxlLmNfc3RyKCksICZidWYpOworICAgIEFTU0VSVF9FUSgwLCBzdGF0dXMpOworCisgICAgZmxvYXQgZmlsZVNpemVMaW1pdCA9IGdldDwyPihwYXJhbXMpOworICAgIGZsb2F0IGZpbGVEdXJhdGlvbkxpbWl0ID0gZ2V0PDM+KHBhcmFtcyk7CisgICAgaW50NjRfdCBtYXhGaWxlU2l6ZSA9IDA7CisgICAgaW50NjRfdCBtYXhGaWxlRHVyYXRpb24gPSAwOworCisgICAgc2l6ZV90IGlucHV0RmlsZVNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgICBpbnQ2NF90IGxhc3RGcmFtZVRpbWVTdGFtcFVzID0gbUJ1ZmZlckluZm9bbUJ1ZmZlckluZm8uc2l6ZSgpIC0gMV0udGltZVVzOworICAgIGlmIChmaWxlU2l6ZUxpbWl0ID4gMCkgeworICAgICAgICBtYXhGaWxlU2l6ZSA9IChpbnQ2NF90KShmaWxlU2l6ZUxpbWl0ICogaW5wdXRGaWxlU2l6ZSk7CisgICAgICAgIG1Xcml0ZXItPnNldE1heEZpbGVTaXplKG1heEZpbGVTaXplKTsKKyAgICB9CisgICAgaWYgKGZpbGVEdXJhdGlvbkxpbWl0ID4gMCkgeworICAgICAgICBtYXhGaWxlRHVyYXRpb24gPSAoaW50NjRfdCkoZmlsZUR1cmF0aW9uTGltaXQgKiBsYXN0RnJhbWVUaW1lU3RhbXBVcyk7CisgICAgICAgIG1Xcml0ZXItPnNldE1heEZpbGVEdXJhdGlvbihtYXhGaWxlRHVyYXRpb24pOworICAgIH0KKworICAgIHNwPFdyaXRlckxpc3RlbmVyPiBsaXN0ZW5lciA9IG5ldyBXcml0ZXJMaXN0ZW5lcigpOworICAgIEFTU0VSVF9ORShsaXN0ZW5lciwgbnVsbHB0cikgPDwgInVuYWJsZSB0byBhbGxvY2F0ZSBsaXN0ZW5lciI7CisKKyAgICBtV3JpdGVyLT5zZXRMaXN0ZW5lcihsaXN0ZW5lcik7CisgICAgc3RhdHVzID0gbVdyaXRlci0+c3RhcnQobUZpbGVNZXRhLmdldCgpKTsKKworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cyk7CisgICAgc3RhdHVzID0gc2VuZEJ1ZmZlcnNUb1dyaXRlcihtSW5wdXRTdHJlYW0sIG1CdWZmZXJJbmZvLCBtSW5wdXRGcmFtZUlkLCBtQ3VycmVudFRyYWNrLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUJ1ZmZlckluZm8uc2l6ZSgpLCBmYWxzZSwgbGlzdGVuZXIpOworICAgIEFTU0VSVF9FUSgoc3RhdHVzX3QpT0ssIHN0YXR1cykgPDwgd3JpdGVyRm9ybWF0IDw8ICIgd3JpdGVyIGZhaWxlZCI7CisgICAgQVNTRVJUX1RSVUUobVdyaXRlci0+cmVhY2hlZEVPUygpKSA8PCAiRU9TIG5vdCBzaWduYWxsZWQuIjsKKworICAgIG1DdXJyZW50VHJhY2stPnN0b3AoKTsKKyAgICBzdGF0dXMgPSBtV3JpdGVyLT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKChzdGF0dXNfdClPSywgc3RhdHVzKSA8PCAiRmFpbGVkIHRvIHN0b3AgdGhlIHdyaXRlciI7CisgICAgY2xvc2UoZmQpOworCisgICAgaWYgKG1heEZpbGVTaXplIDw9IDApIHsKKyAgICAgICAgQVNTRVJUX0ZBTFNFKGxpc3RlbmVyLT5tU2lnbmFsZWRTaXplKTsKKyAgICB9IGVsc2UgaWYgKG1heEZpbGVEdXJhdGlvbiA8PSAwKSB7CisgICAgICAgIEFTU0VSVF9GQUxTRShsaXN0ZW5lci0+bVNpZ25hbGVkRHVyYXRpb24pOworICAgIH0gZWxzZSBpZiAobWF4RmlsZVNpemUgPiAwICYmIG1heEZpbGVEdXJhdGlvbiA8PSAwKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGxpc3RlbmVyLT5tU2lnbmFsZWRTaXplKTsKKyAgICB9IGVsc2UgaWYgKG1heEZpbGVEdXJhdGlvbiA+IDAgJiYgbWF4RmlsZVNpemUgPD0gMCkgeworICAgICAgICBBU1NFUlRfVFJVRShsaXN0ZW5lci0+bVNpZ25hbGVkRHVyYXRpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGxpc3RlbmVyLT5tU2lnbmFsZWRTaXplIHx8IGxpc3RlbmVyLT5tU2lnbmFsZWREdXJhdGlvbik7CisgICAgfQorCisgICAgaWYgKG1heEZpbGVTaXplID4gMCkgeworICAgICAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgICAgIHN0YXR1cyA9IHN0YXQob3V0cHV0RmlsZS5jX3N0cigpLCAmYnVmKTsKKyAgICAgICAgQVNTRVJUX0VRKDAsIHN0YXR1cyk7CisgICAgICAgIEFTU0VSVF9MRShidWYuc3Rfc2l6ZSwgbWF4RmlsZVNpemUpOworICAgIH0KK30KKworLy8gVE9ETzogKGIvMTUwOTIzMzg3KQorLy8gQWRkIFdFQk0gaW5wdXQKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgTGlzdGVuZXJUZXN0QWxsLCBMaXN0ZW5lclRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoIm9nZyIsIDAsIDAuNywgMC4zKSwgbWFrZV90dXBsZSgiYWFjIiwgMSwgMC42LCAwLjcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJtcGVnNCIsIDEsIDAuNCwgMC4zKSwgbWFrZV90dXBsZSgiYW1ybmIiLCAzLCAwLjIsIDAuNiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImFtcndiIiwgNCwgMC41LCAwLjUpLCBtYWtlX3R1cGxlKCJtcGVnMlRzIiwgMSwgMC4yLCAxKSkpOworCisvLyBUT0RPOiAoYi8xNDQ0NzYxNjQpCisvLyBBZGQgQUFDX0FEVFMsIEZMQUMsIEFWMSBpbnB1dAorSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFdyaXRlclRlc3RBbGwsIFdyaXRlRnVuY3Rpb25hbGl0eVRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJvZ2ciLCAwKSwgbWFrZV9wYWlyKCJ3ZWJtIiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJhYWMiLCAxKSwgbWFrZV9wYWlyKCJtcGVnNCIsIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYW1ybmIiLCAzKSwgbWFrZV9wYWlyKCJhbXJ3YiIsIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigid2VibSIsIDUpLCBtYWtlX3BhaXIoIndlYm0iLCA3KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoIndlYm0iLCA4KSwgbWFrZV9wYWlyKCJtcGVnNCIsIDkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigibXBlZzQiLCAxMCksIG1ha2VfcGFpcigibXBlZzQiLCAxMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcGVnNCIsIDEzKSwgbWFrZV9wYWlyKCJtcGVnMlRzIiwgMSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJtcGVnMlRzIiwgOSkpKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgZ0VudiA9IG5ldyBXcml0ZXJUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBzdGF0dXMgPSBSVU5fQUxMX1RFU1RTKCk7CisgICAgICAgIEFMT0dWKCJUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclRlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclRlc3RFbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5ZTY4NmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVGVzdEVudmlyb25tZW50LmgKQEAgLTAsMCArMSw3MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19XUklURVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KKyNkZWZpbmUgX19XUklURVJfVEVTVF9FTlZJUk9OTUVOVF9IX18KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgV3JpdGVyVGVzdEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgV3JpdGVyVGVzdEVudmlyb25tZW50KCkgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC8iKSB7fQorCisgICAgLy8gUGFyc2VzIHRoZSBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisgICAgaW50IGluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpOworCisgICAgdm9pZCBzZXRSZXMoY29uc3QgY2hhciAqX3JlcykgeyByZXMgPSBfcmVzOyB9CisKKyAgICBjb25zdCBzdHJpbmcgZ2V0UmVzKCkgY29uc3QgeyByZXR1cm4gcmVzOyB9CisKKyAgcHJpdmF0ZToKKyAgICBzdHJpbmcgcmVzOworfTsKKworaW50IFdyaXRlclRlc3RFbnZpcm9ubWVudDo6aW5pdEZyb21PcHRpb25zKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIHN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIG9wdGlvbnNbXSA9IHt7InJlcyIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LCB7MCwgMCwgMCwgMH19OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiUDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ1AnOgorICAgICAgICAgICAgICAgIHNldFJlcyhvcHRhcmcpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChvcHRpbmQgPCBhcmdjKSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLAorICAgICAgICAgICAgICAgICJ1bnJlY29nbml6ZWQgb3B0aW9uOiAlc1xuXG4iCisgICAgICAgICAgICAgICAgInVzYWdlOiAlcyA8Z3Rlc3Qgb3B0aW9ucz4gPHRlc3Qgb3B0aW9ucz5cblxuIgorICAgICAgICAgICAgICAgICJ0ZXN0IG9wdGlvbnMgYXJlOlxuXG4iCisgICAgICAgICAgICAgICAgIi1QLCAtLXBhdGg6IFJlc291cmNlIGZpbGVzIGRpcmVjdG9yeSBsb2NhdGlvblxuIiwKKyAgICAgICAgICAgICAgICBhcmd2W29wdGluZCA/OiAxXSwgYXJndlswXSk7CisgICAgICAgIHJldHVybiAyOworICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmICAvLyBfX1dSSVRFUl9URVNUX0VOVklST05NRU5UX0hfXwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclV0aWxpdHkuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGVzdHMvd3JpdGVyL1dyaXRlclV0aWxpdHkuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMDQzZmUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVXRpbGl0eS5jcHAKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIldyaXRlclV0aWxpdHkiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUJ1ZmZlci5oPgorCisjaW5jbHVkZSAiV3JpdGVyVXRpbGl0eS5oIgorCitpbnQzMl90IHNlbmRCdWZmZXJzVG9Xcml0ZXIoaWZzdHJlYW0gJmlucHV0U3RyZWFtLCB2ZWN0b3I8QnVmZmVySW5mbz4gJmJ1ZmZlckluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAmaW5wdXRGcmFtZUlkLCBzcDxNZWRpYUFkYXB0ZXI+ICZjdXJyZW50VHJhY2ssIGludDMyX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmFuZ2UsIGJvb2wgaXNQYXVzZWQsIHNwPFdyaXRlckxpc3RlbmVyPiBsaXN0ZW5lcikgeworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGlmIChpbnB1dEZyYW1lSWQgPj0gKGludClidWZmZXJJbmZvLnNpemUoKSB8fCBpbnB1dEZyYW1lSWQgPj0gKG9mZnNldCArIHJhbmdlKSkgYnJlYWs7CisgICAgICAgIGlmIChsaXN0ZW5lciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBpZiAobGlzdGVuZXItPm1TaWduYWxlZER1cmF0aW9uIHx8IGxpc3RlbmVyLT5tU2lnbmFsZWRTaXplKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIk1heCBGaWxlIGxpbWl0IHJlYWNoZWQuIE5vIG1vcmUgYnVmZmVycyB3aWxsIGJlIHNlbnQgdG8gdGhlIHdyaXRlciIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaW50MzJfdCBzaXplID0gYnVmZmVySW5mb1tpbnB1dEZyYW1lSWRdLnNpemU7CisgICAgICAgIGNoYXIgKmRhdGEgPSAoY2hhciAqKW1hbGxvYyhzaXplKTsKKyAgICAgICAgaWYgKCFkYXRhKSB7CisgICAgICAgICAgICBBTE9HRSgiSW5zdWZmaWNpZW50IG1lbWVvcnkgdG8gcmVhZCBpbnB1dCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgaW5wdXRTdHJlYW0ucmVhZChkYXRhLCBzaXplKTsKKyAgICAgICAgQ0hFQ0tfRVEoaW5wdXRTdHJlYW0uZ2NvdW50KCksIHNpemUpOworCisgICAgICAgIHNwPEFCdWZmZXI+IGJ1ZmZlciA9IG5ldyBBQnVmZmVyKCh2b2lkICopZGF0YSwgc2l6ZSk7CisgICAgICAgIGlmIChidWZmZXIuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoInNlbmRCdWZmZXJzVG9Xcml0ZXIoKSBnb3QgYSBudWxscHRyIGJ1ZmZlci4iKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYnVmZmVyKTsKKworICAgICAgICAvLyBSZWxlYXNlZCBpbiBNZWRpYUFkYXB0ZXI6OnNpZ25hbEJ1ZmZlclJldHVybmVkKCkuCisgICAgICAgIG1lZGlhQnVmZmVyLT5hZGRfcmVmKCk7CisgICAgICAgIG1lZGlhQnVmZmVyLT5zZXRfcmFuZ2UoYnVmZmVyLT5vZmZzZXQoKSwgYnVmZmVyLT5zaXplKCkpOworCisgICAgICAgIE1ldGFEYXRhQmFzZSAmc2FtcGxlTWV0YURhdGEgPSBtZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgIHNhbXBsZU1ldGFEYXRhLnNldEludDY0KGtLZXlUaW1lLCBidWZmZXJJbmZvW2lucHV0RnJhbWVJZF0udGltZVVzKTsKKyAgICAgICAgLy8gSnVzdCBzZXQgdGhlIGtLZXlEZWNvZGluZ1RpbWUgYXMgdGhlIHByZXNlbnRhdGlvbiB0aW1lIGZvciBub3cuCisgICAgICAgIHNhbXBsZU1ldGFEYXRhLnNldEludDY0KGtLZXlEZWNvZGluZ1RpbWUsIGJ1ZmZlckluZm9baW5wdXRGcmFtZUlkXS50aW1lVXMpOworCisgICAgICAgIGlmIChidWZmZXJJbmZvW2lucHV0RnJhbWVJZF0uZmxhZ3MgPT0gMSkgeworICAgICAgICAgICAgc2FtcGxlTWV0YURhdGEuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCB0cnVlKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFRoaXMgcHVzaEJ1ZmZlciB3aWxsIHdhaXQgdW50aWwgdGhlIG1lZGlhQnVmZmVyIGlzIGNvbnN1bWVkLgorICAgICAgICBpbnQgc3RhdHVzID0gY3VycmVudFRyYWNrLT5wdXNoQnVmZmVyKG1lZGlhQnVmZmVyKTsKKyAgICAgICAgZnJlZShkYXRhKTsKKyAgICAgICAgaW5wdXRGcmFtZUlkKys7CisKKyAgICAgICAgaWYgKE9LICE9IHN0YXR1cykgeworICAgICAgICAgICAgaWYgKCFpc1BhdXNlZCkgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dEKCJXcml0ZXIgaXMgaW4gcGF1c2VkIHN0YXRlLiBJbnB1dCBidWZmZXJzIHdvbid0IGdldCBjb25zdW1lZCIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAwOworfQorCitpbnQzMl90IHdyaXRlSGVhZGVyQnVmZmVycyhpZnN0cmVhbSAmaW5wdXRTdHJlYW0sIHZlY3RvcjxCdWZmZXJJbmZvPiAmYnVmZmVySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgJmlucHV0RnJhbWVJZCwgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGludDMyX3QgbnVtQ3NkcykgeworICAgIGNoYXIgY3NkTmFtZVtrTWF4Q1NEU3RybGVuXTsKKyAgICBmb3IgKGludCBjc2RJZCA9IDA7IGNzZElkIDwgbnVtQ3NkczsgY3NkSWQrKykgeworICAgICAgICBpbnQzMl90IGZsYWdzID0gYnVmZmVySW5mb1tpbnB1dEZyYW1lSWRdLmZsYWdzOworICAgICAgICBpZiAoZmxhZ3MgPT0gQ09ERUNfQ09ORklHX0ZMQUcpIHsKKyAgICAgICAgICAgIGludDMyX3Qgc2l6ZSA9IGJ1ZmZlckluZm9baW5wdXRGcmFtZUlkXS5zaXplOworICAgICAgICAgICAgY2hhciAqZGF0YSA9IChjaGFyICopbWFsbG9jKHNpemUpOworICAgICAgICAgICAgaWYgKCFkYXRhKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkluc3VmZmljaWVudCBtZW1lb3J5IHRvIHJlYWQgaW5wdXQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnB1dFN0cmVhbS5yZWFkKGRhdGEsIHNpemUpOworICAgICAgICAgICAgQ0hFQ0tfRVEoaW5wdXRTdHJlYW0uZ2NvdW50KCksIHNpemUpOworCisgICAgICAgICAgICBzcDxBQnVmZmVyPiBjc2RCdWZmZXIgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoKHZvaWQgKilkYXRhLCBzaXplKTsKKyAgICAgICAgICAgIGlmIChjc2RCdWZmZXIuZ2V0KCkgPT0gbnVsbHB0ciB8fCBjc2RCdWZmZXItPmJhc2UoKSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc25wcmludGYoY3NkTmFtZSwgc2l6ZW9mKGNzZE5hbWUpLCAiY3NkLSVkIiwgY3NkSWQpOworICAgICAgICAgICAgZm9ybWF0LT5zZXRCdWZmZXIoY3NkTmFtZSwgY3NkQnVmZmVyKTsKKyAgICAgICAgICAgIGlucHV0RnJhbWVJZCsrOworICAgICAgICAgICAgZnJlZShkYXRhKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3Rlc3RzL3dyaXRlci9Xcml0ZXJVdGlsaXR5LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVXRpbGl0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMTk5NzMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90ZXN0cy93cml0ZXIvV3JpdGVyVXRpbGl0eS5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIFdSSVRFUl9VVElMSVRZX0hfCisjZGVmaW5lIFdSSVRFUl9VVElMSVRZX0hfCisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFBZGFwdGVyLmg+CisKKyNpbmNsdWRlICJXcml0ZXJMaXN0ZW5lci5oIgorCisjZGVmaW5lIENPREVDX0NPTkZJR19GTEFHIDMyCisKK2NvbnN0ZXhwciB1aW50MzJfdCBrTWF4Q1NEU3RybGVuID0gMTY7Citjb25zdGV4cHIgdWludDMyX3Qga01heENvdW50ID0gMjA7CisKK3N0cnVjdCBCdWZmZXJJbmZvIHsKKyAgICBpbnQzMl90IHNpemU7CisgICAgdWludDMyX3QgZmxhZ3M7CisgICAgaW50NjRfdCB0aW1lVXM7Cit9OworCitpbnQzMl90IHNlbmRCdWZmZXJzVG9Xcml0ZXIoaWZzdHJlYW0gJmlucHV0U3RyZWFtLCB2ZWN0b3I8QnVmZmVySW5mbz4gJmJ1ZmZlckluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCAmaW5wdXRGcmFtZUlkLCBzcDxNZWRpYUFkYXB0ZXI+ICZjdXJyZW50VHJhY2ssIGludDMyX3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmFuZ2UsIGJvb2wgaXNQYXVzZWQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxXcml0ZXJMaXN0ZW5lcj4gbGlzdGVuZXIgPSBudWxscHRyKTsKKworaW50MzJfdCB3cml0ZUhlYWRlckJ1ZmZlcnMoaWZzdHJlYW0gJmlucHV0U3RyZWFtLCB2ZWN0b3I8QnVmZmVySW5mbz4gJmJ1ZmZlckluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICZpbnB1dEZyYW1lSWQsIHNwPEFNZXNzYWdlPiAmZm9ybWF0LCBpbnQzMl90IG51bUNzZHMpOworCisjZW5kaWYgIC8vIFdSSVRFUl9VVElMSVRZX0hfCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwCmluZGV4IGE0ZTg4OWQuLjRmNGNlYjEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9BbmRyb2lkLmJwCkBAIC0yMiwzICsyMiw1IEBACiAKICAgICBzaGFyZWRfbGliczogWyJsaWJtZWRpYSJdLAogfQorCisKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zLmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC9UZXh0RGVzY3JpcHRpb25zLmNwcAppbmRleCAwODhlYWFlLi42Yzk0NzU0IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9ucy5jcHAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L1RleHREZXNjcmlwdGlvbnMuY3BwCkBAIC0zODMsNyArMzgzLDcgQEAKICAgICAgICAgdG1wRGF0YSArPSA4OwogICAgICAgICBzaXplX3QgcmVtYWluaW5nID0gc2l6ZSAtIDg7CiAKLSAgICAgICAgaWYgKHNpemUgPCBjaHVua1NpemUpIHsKKyAgICAgICAgaWYgKGNodW5rU2l6ZSA8PSA4IHx8IHNpemUgPCBjaHVua1NpemUpIHsKICAgICAgICAgICAgIHJldHVybiBPSzsKICAgICAgICAgfQogICAgICAgICBzd2l0Y2goY2h1bmtUeXBlKSB7CkBAIC00NDUsNTEgKzQ0NSw3NSBAQAogICAgICAgICAgICAgICAgICAgICB8ICoodG1wRGF0YSArIDEwKSA8PCA4IHwgKih0bXBEYXRhICsgMTEpOwogICAgICAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihyZ2JhKTsKIAorICAgICAgICAgICAgICAgIC8vIHR4M2cgYm94IGNvbnRhaW5zIGNsYXNzIEZvbnRUYWJsZUJveCgpIHdoaWNoIGV4dGVuZHMgZnRhYiBib3gKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGluZm9ybWF0aW9uIGlzIHBhcnQgb2YgdGhlIDNncHAgVGltZWQgVGV4dCBGb3JtYXQKKyAgICAgICAgICAgICAgICAvLyBTcGVjaWZpY2F0aW9uIzogMjYuMjQ1IC8gU2VjdGlvbjogNS4xNihTYW1wbGUgRGVzY3JpcHRpb24gRm9ybWF0KQorICAgICAgICAgICAgICAgIC8vIGh0dHBzOi8vd3d3LjNncHAub3JnL2Z0cC9TcGVjcy9hcmNoaXZlLzI2X3Nlcmllcy8yNi4yNDUvCisKICAgICAgICAgICAgICAgICB0bXBEYXRhICs9IDEyOwogICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSAxMjsKIAotICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCAyKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA8IDgpIHsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhUG9zID0gcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKLQotICAgICAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihLRVlfU1RSVUNUX0ZPTlRfTElTVCk7Ci0gICAgICAgICAgICAgICAgdWludDE2X3QgY291bnQgPSBVMTZfQVQodG1wRGF0YSk7Ci0gICAgICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKGNvdW50KTsKLQotICAgICAgICAgICAgICAgIHRtcERhdGEgKz0gMjsKLSAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gMjsKLQotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nIDwgMykgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm9sbCBiYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICBwYXJjZWwtPnNldERhdGFQb3NpdGlvbihkYXRhUG9zKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBPSzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBmb250IElECi0gICAgICAgICAgICAgICAgICAgIHBhcmNlbC0+d3JpdGVJbnQzMihVMTZfQVQodG1wRGF0YSkpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIGZvbnQgbmFtZSBsZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKCoodG1wRGF0YSArIDIpKTsKLQotICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuID0gKih0bXBEYXRhICsgMik7Ci0KLSAgICAgICAgICAgICAgICAgICAgdG1wRGF0YSArPSAzOwotICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gMzsKLQotICAgICAgICAgICAgICAgICAgICBpZiAocmVtYWluaW5nIDwgbGVuKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyByb2xsIGJhY2sKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmNlbC0+c2V0RGF0YVBvc2l0aW9uKGRhdGFQb3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOwotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgcGFyY2VsLT53cml0ZSh0bXBEYXRhLCBsZW4pOwotICAgICAgICAgICAgICAgICAgICB0bXBEYXRhICs9IGxlbjsKLSAgICAgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IGxlbjsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc3ViQ2h1bmtTaXplID0gVTMyX0FUKHRtcERhdGEpOworICAgICAgICAgICAgICAgIGlmKHJlbWFpbmluZyA8IHN1YkNodW5rU2l6ZSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYSAiRGlzcGFyaXR5Qm94IiBhZnRlciB0aGlzIGFjY29yZGluZyB0byB0aGUgc3BlYywgYnV0IHdlIGlnbm9yZSBpdAorICAgICAgICAgICAgICAgIHVpbnQzMl90IHN1YkNodW5rVHlwZSA9IFUzMl9BVCh0bXBEYXRhICsgNCk7CisKKyAgICAgICAgICAgICAgICBpZiAoc3ViQ2h1bmtUeXBlID09IEZPVVJDQygnZicsICd0JywgJ2EnLCAnYicpKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgdG1wRGF0YSArPSA4OworICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc3ViQ2h1bmtSZW1haW5pbmcgPSBzdWJDaHVua1NpemUgLSA4OworCisgICAgICAgICAgICAgICAgICAgIGlmKHN1YkNodW5rUmVtYWluaW5nIDwgMikgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHNpemVfdCBkYXRhUG9zID0gcGFyY2VsLT5kYXRhUG9zaXRpb24oKTsKKworICAgICAgICAgICAgICAgICAgICBwYXJjZWwtPndyaXRlSW50MzIoS0VZX1NUUlVDVF9GT05UX0xJU1QpOworICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBjb3VudCA9IFUxNl9BVCh0bXBEYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKGNvdW50KTsKKworICAgICAgICAgICAgICAgICAgICB0bXBEYXRhICs9IDI7CisgICAgICAgICAgICAgICAgICAgIHN1YkNodW5rUmVtYWluaW5nIC09IDI7CisKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3ViQ2h1bmtSZW1haW5pbmcgPCAzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm9sbCBiYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oZGF0YVBvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9udCBJRAorICAgICAgICAgICAgICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKFUxNl9BVCh0bXBEYXRhKSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvbnQgbmFtZSBsZW5ndGgKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4gPSAqKHRtcERhdGEgKyAyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgcGFyY2VsLT53cml0ZUludDMyKGxlbik7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIHRtcERhdGEgKz0gMzsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YkNodW5rUmVtYWluaW5nIC09MzsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YkNodW5rUmVtYWluaW5nIDwgbGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcm9sbCBiYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyY2VsLT5zZXREYXRhUG9zaXRpb24oZGF0YVBvcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBwYXJjZWwtPndyaXRlKHRtcERhdGEsIGxlbik7CisgICAgICAgICAgICAgICAgICAgICAgICB0bXBEYXRhICs9IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1YkNodW5rUmVtYWluaW5nIC09IGxlbjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0bXBEYXRhICs9IHN1YkNodW5rUmVtYWluaW5nOworICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gc3ViQ2h1bmtTaXplOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRtcERhdGEgKz0gc3ViQ2h1bmtTaXplOworICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gc3ViQ2h1bmtTaXplOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGRlZmF1bHQ6CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmY4ODkxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZC5icApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIlRpbWVkVGV4dFVuaXRUZXN0IiwKKyAgICBndGVzdDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlRpbWVkVGV4dFVuaXRUZXN0LmNwcCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJzdGFnZWZyaWdodF90aW1lZHRleHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV25vLW11bHRpY2hhciIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZFRlc3QueG1sIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvQW5kcm9pZFRlc3QueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5MjU3OTAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJUZXN0IG1vZHVsZSBjb25maWcgZm9yIFRpbWVkVGV4dCB1bml0IHRlc3QiPgorICAgIDxvcHRpb24gbmFtZT0idGVzdC1zdWl0ZS10YWciIHZhbHVlPSJUaW1lZFRleHRVbml0VGVzdCIgLz4KKyAgICA8dGFyZ2V0X3ByZXBhcmVyIGNsYXNzPSJjb20uYW5kcm9pZC50cmFkZWZlZC50YXJnZXRwcmVwLlB1c2hGaWxlUHJlcGFyZXIiPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImNsZWFudXAiIHZhbHVlPSJ0cnVlIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2giIHZhbHVlPSJUaW1lZFRleHRVbml0VGVzdC0+L2RhdGEvbG9jYWwvdG1wL1RpbWVkVGV4dFVuaXRUZXN0IiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9InB1c2gtZmlsZSIKKyAgICAgICAgICAgIGtleT0iaHR0cHM6Ly9zdG9yYWdlLmdvb2dsZWFwaXMuY29tL2FuZHJvaWRfbWVkaWEvZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9UaW1lZFRleHRVbml0VGVzdC56aXA/dW56aXA9dHJ1ZSIKKyAgICAgICAgICAgIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAvVGltZWRUZXh0VW5pdFRlc3RSZXMvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPHRlc3QgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRlc3R0eXBlLkdUZXN0IiA+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZGV2aWNlLXBhdGgiIHZhbHVlPSIvZGF0YS9sb2NhbC90bXAiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibW9kdWxlLW5hbWUiIHZhbHVlPSJUaW1lZFRleHRVbml0VGVzdHQiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0ibmF0aXZlLXRlc3QtZmxhZyIgdmFsdWU9Ii1QIC9kYXRhL2xvY2FsL3RtcC9UaW1lZFRleHRVbml0VGVzdFJlcy8iIC8+CisgICAgPC90ZXN0PgorPC9jb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvUkVBRE1FLm1kIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhNzc0YmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvdGVzdC9SRUFETUUubWQKQEAgLTAsMCArMSw0MCBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIFRpbWVkVGV4dCBVbml0IFRlc3QgOgorVGhlIFRpbWVkVGV4dCBVbml0IFRlc3QgU3VpdGUgdmFsaWRhdGVzIHRoZSBUZXh0RGVzY3JpcHRpb24gY2xhc3MgYXZhaWxhYmxlIGluIGxpYnN0YWdlZnJpZ2h0LgorCitSdW4gdGhlIGZvbGxvd2luZyBzdGVwcyB0byBidWlsZCB0aGUgdGVzdCBzdWl0ZToKK2BgYAorbSBUaW1lZFRleHRVbml0VGVzdAorYGBgCisKK1RoZSAzMi1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3QvCisKK1RoZSA2NC1iaXQgYmluYXJpZXMgd2lsbCBiZSBjcmVhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGF0aCA6ICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC8KKworVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCitgYGAKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9UaW1lZFRleHRVbml0VGVzdC9UaW1lZFRleHRVbml0VGVzdCAvZGF0YS9sb2NhbC90bXAvCitgYGAKKworVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgorYGBgCithZGIgcHVzaCAke09VVH0vZGF0YS9uYXRpdmV0ZXN0L1RpbWVkVGV4dFVuaXRUZXN0L1RpbWVkVGV4dFVuaXRUZXN0IC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VW5pdFRlc3QuemlwKS4KK0Rvd25sb2FkLCB1bnppcCBhbmQgcHVzaCB0aGVzZSBmaWxlcyBpbnRvIGRldmljZSBmb3IgdGVzdGluZy4KKworYGBgCithZGIgcHVzaCBUaW1lZFRleHRVbml0VGVzdFJlcy8uIC9kYXRhL2xvY2FsL3RtcC8KK2BgYAorCit1c2FnZTogVGltZWRUZXh0VW5pdFRlc3QgLVAgXDxwYXRoX3RvX2ZvbGRlclw+CitgYGAKK2FkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvVGltZWRUZXh0VW5pdFRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL1RpbWVkVGV4dFVuaXRUZXN0UmVzLworYGBgCitBbHRlcm5hdGl2ZWx5LCB0aGUgdGVzdCBjYW4gYWxzbyBiZSBydW4gdXNpbmcgYXRlc3QgY29tbWFuZC4KKworYGBgCithdGVzdCBUaW1lZFRleHRVbml0VGVzdCAtLSAtLWVuYWJsZS1tb2R1bGUtZHluYW1pYy1kb3dubG9hZD10cnVlCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFRlc3RFbnZpcm9ubWVudC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VGVzdEVudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyODBjMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFRlc3RFbnZpcm9ubWVudC5oCkBAIC0wLDAgKzEsNzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMjAgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fVElNRURURVhUX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisjZGVmaW5lIF9fVElNRURURVhUX1RFU1RfRU5WSVJPTk1FTlRfSF9fCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKK2NsYXNzIFRpbWVkVGV4dFRlc3RFbnZpcm9ubWVudCA6IHB1YmxpYyA6OnRlc3Rpbmc6OkVudmlyb25tZW50IHsKKyAgcHVibGljOgorICAgIFRpbWVkVGV4dFRlc3RFbnZpcm9ubWVudCgpIDogcmVzKCIvZGF0YS9sb2NhbC90bXAvIikge30KKworICAgIC8vIFBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50cworICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIgKl9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQorCisgIHByaXZhdGU6CisgICAgc3RyaW5nIHJlczsKK307CisKK2ludCBUaW1lZFRleHRUZXN0RW52aXJvbm1lbnQ6OmluaXRGcm9tT3B0aW9ucyhpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBzdGF0aWMgc3RydWN0IG9wdGlvbiBvcHRpb25zW10gPSB7eyJyZXMiLCByZXF1aXJlZF9hcmd1bWVudCwgMCwgJ1AnfSwgezAsIDAsIDAsIDB9fTsKKworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICAgIGludCBpbmRleCA9IDA7CisgICAgICAgIGludCBjID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgIlA6Iiwgb3B0aW9ucywgJmluZGV4KTsKKyAgICAgICAgaWYgKGMgPT0gLTEpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc3dpdGNoIChjKSB7CisgICAgICAgICAgICBjYXNlICdQJzoKKyAgICAgICAgICAgICAgICBzZXRSZXMob3B0YXJnKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAob3B0aW5kIDwgYXJnYykgeworICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICAgICAidW5yZWNvZ25pemVkIG9wdGlvbjogJXNcblxuIgorICAgICAgICAgICAgICAgICJ1c2FnZTogJXMgPGd0ZXN0IG9wdGlvbnM+IDx0ZXN0IG9wdGlvbnM+XG5cbiIKKyAgICAgICAgICAgICAgICAidGVzdCBvcHRpb25zIGFyZTpcblxuIgorICAgICAgICAgICAgICAgICItUCwgLS1wYXRoOiBSZXNvdXJjZSBmaWxlcyBkaXJlY3RvcnkgbG9jYXRpb25cbiIsCisgICAgICAgICAgICAgICAgYXJndltvcHRpbmQgPzogMV0sIGFyZ3ZbMF0pOworICAgICAgICByZXR1cm4gMjsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKyNlbmRpZiAgLy8gX19USU1FRFRFWFRfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFVuaXRUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3RpbWVkdGV4dC90ZXN0L1RpbWVkVGV4dFVuaXRUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDM3OWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvdGltZWR0ZXh0L3Rlc3QvVGltZWRUZXh0VW5pdFRlc3QuY3BwCkBAIC0wLDAgKzEsMzc3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJUaW1lZFRleHRVbml0VGVzdCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQVN0cmluZy5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQnl0ZVV0aWxzLmg+CisKKyNpbmNsdWRlICJ0aW1lZHRleHQvVGV4dERlc2NyaXB0aW9ucy5oIgorCisjaW5jbHVkZSAiVGltZWRUZXh0VGVzdEVudmlyb25tZW50LmgiCisKK2NvbnN0ZXhwciBpbnQzMl90IGtTdGFydFRpbWVNcyA9IDEwMDAwOworCitlbnVtIHsKKyAgICAvLyBUaGVzZSBrZXlzIG11c3QgYmUgaW4gc3luYyB3aXRoIHRoZSBrZXlzIGluCisgICAgLy8gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC90aW1lZHRleHQvVGV4dERlc2NyaXB0aW9ucy5oCisgICAgS0VZX0RJU1BMQVlfRkxBR1MgPSAxLAorICAgIEtFWV9TVFlMRV9GTEFHUyA9IDIsCisgICAgS0VZX0JBQ0tHUk9VTkRfQ09MT1JfUkdCQSA9IDMsCisgICAgS0VZX0hJR0hMSUdIVF9DT0xPUl9SR0JBID0gNCwKKyAgICBLRVlfU0NST0xMX0RFTEFZID0gNSwKKyAgICBLRVlfV1JBUF9URVhUID0gNiwKKyAgICBLRVlfU1RBUlRfVElNRSA9IDcsCisgICAgS0VZX1NUUlVDVF9CTElOS0lOR19URVhUX0xJU1QgPSA4LAorICAgIEtFWV9TVFJVQ1RfRk9OVF9MSVNUID0gOSwKKyAgICBLRVlfU1RSVUNUX0hJR0hMSUdIVF9MSVNUID0gMTAsCisgICAgS0VZX1NUUlVDVF9IWVBFUl9URVhUX0xJU1QgPSAxMSwKKyAgICBLRVlfU1RSVUNUX0tBUkFPS0VfTElTVCA9IDEyLAorICAgIEtFWV9TVFJVQ1RfU1RZTEVfTElTVCA9IDEzLAorICAgIEtFWV9TVFJVQ1RfVEVYVF9QT1MgPSAxNCwKKyAgICBLRVlfU1RSVUNUX0pVU1RJRklDQVRJT04gPSAxNSwKKyAgICBLRVlfU1RSVUNUX1RFWFQgPSAxNiwKKworICAgIEtFWV9HTE9CQUxfU0VUVElORyA9IDEwMSwKKyAgICBLRVlfTE9DQUxfU0VUVElORyA9IDEwMiwKKyAgICBLRVlfU1RBUlRfQ0hBUiA9IDEwMywKKyAgICBLRVlfRU5EX0NIQVIgPSAxMDQsCisgICAgS0VZX0ZPTlRfSUQgPSAxMDUsCisgICAgS0VZX0ZPTlRfU0laRSA9IDEwNiwKKyAgICBLRVlfVEVYVF9DT0xPUl9SR0JBID0gMTA3LAorfTsKKworc3RydWN0IEZvbnRJbmZvIHsKKyAgICBpbnQzMl90IGRpc3BsYXlGbGFnID0gLTE7CisgICAgaW50MzJfdCBob3Jpem9udGFsSnVzdGlmaWNhdGlvbiA9IC0xOworICAgIGludDMyX3QgdmVydGljYWxKdXN0aWZpY2F0aW9uID0gLTE7CisgICAgaW50MzJfdCByZ2JhQmFja2dyb3VuZCA9IC0xOworICAgIGludDMyX3QgbGVmdFBvcyA9IC0xOworICAgIGludDMyX3QgdG9wUG9zID0gLTE7CisgICAgaW50MzJfdCBib3R0b21Qb3MgPSAtMTsKKyAgICBpbnQzMl90IHJpZ2h0UG9zID0gLTE7CisgICAgaW50MzJfdCBzdGFydGNoYXIgPSAtMTsKKyAgICBpbnQzMl90IGVuZENoYXIgPSAtMTsKKyAgICBpbnQzMl90IGZvbnRJZCA9IC0xOworICAgIGludDMyX3QgZmFjZVN0eWxlID0gLTE7CisgICAgaW50MzJfdCBmb250U2l6ZSA9IC0xOworICAgIGludDMyX3QgcmdiYVRleHQgPSAtMTsKKyAgICBpbnQzMl90IGVudHJ5Q291bnQgPSAtMTsKK307CisKK3N0cnVjdCBGb250UmVjb3JkIHsKKyAgICBpbnQzMl90IGZvbnRJRCA9IC0xOworICAgIGludDMyX3QgZm9udE5hbWVMZW5ndGggPSAtMTsKKyAgICBjb25zdCB1aW50OF90ICpmb250ID0gbnVsbHB0cjsKK307CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitzdGF0aWMgVGltZWRUZXh0VGVzdEVudmlyb25tZW50ICpnRW52ID0gbnVsbHB0cjsKKworY2xhc3MgVGltZWRUZXh0VW5pdFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPC8qZmlsZW5hbWUqLyBzdHJpbmc+IHsKKyAgcHVibGljOgorICAgIFRpbWVkVGV4dFVuaXRUZXN0KCl7fTsKKworICAgIH5UaW1lZFRleHRVbml0VGVzdCgpIHsKKyAgICAgICAgaWYgKG1FbGVTdHJlYW0pIG1FbGVTdHJlYW0uY2xvc2UoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIG1JbnB1dEZpbGVOYW1lID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpOworICAgICAgICBtRWxlU3RyZWFtLm9wZW4obUlucHV0RmlsZU5hbWUsIGlmc3RyZWFtOjpiaW5hcnkpOworICAgICAgICBBU1NFUlRfRVEobUVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpIDw8ICJGYWlsZWQgdG8gb3BlbiAiIDw8IEdldFBhcmFtKCk7CisKKyAgICAgICAgc3RydWN0IHN0YXQgYnVmOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdGF0KG1JbnB1dEZpbGVOYW1lLmNfc3RyKCksICZidWYpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRmFpbGVkIHRvIGdldCBwcm9wZXJ0aWVzIG9mIGlucHV0IGZpbGU6ICIgPDwgR2V0UGFyYW0oKTsKKyAgICAgICAgbUZpbGVTaXplID0gYnVmLnN0X3NpemU7CisgICAgICAgIEFMT0dJKCJTaXplIG9mIHRoZSBpbnB1dCBmaWxlICVzID0gJXp1IiwgR2V0UGFyYW0oKS5jX3N0cigpLCBtRmlsZVNpemUpOworICAgIH0KKworICAgIHN0cmluZyBtSW5wdXRGaWxlTmFtZTsKKyAgICBzaXplX3QgbUZpbGVTaXplOworICAgIGlmc3RyZWFtIG1FbGVTdHJlYW07Cit9OworCitjbGFzcyBTUlREZXNjcmlwdGlvblRlc3QgOiBwdWJsaWMgVGltZWRUZXh0VW5pdFRlc3QgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBUaW1lZFRleHRVbml0VGVzdDo6U2V0VXAoKTsgfQorfTsKKworY2xhc3MgVGV4dDNHUFBEZXNjcmlwdGlvblRlc3QgOiBwdWJsaWMgVGltZWRUZXh0VW5pdFRlc3QgeworICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBUaW1lZFRleHRVbml0VGVzdDo6U2V0VXAoKTsgfQorfTsKKworVEVTVF9QKFNSVERlc2NyaXB0aW9uVGVzdCwgZXh0cmFjdFNSVERlc2NyaXB0aW9uVGVzdCkgeworICAgIGNoYXIgZGF0YVttRmlsZVNpemVdOworICAgIG1FbGVTdHJlYW0ucmVhZChkYXRhLCBzaXplb2YoZGF0YSkpOworICAgIEFTU0VSVF9FUShtRWxlU3RyZWFtLmdjb3VudCgpLCBtRmlsZVNpemUpOworCisgICAgUGFyY2VsIHBhcmNlbDsKKyAgICBpbnQzMl90IGZsYWcgPSBUZXh0RGVzY3JpcHRpb25zOjpPVVRfT0ZfQkFORF9URVhUX1NSVCB8IFRleHREZXNjcmlwdGlvbnM6OkxPQ0FMX0RFU0NSSVBUSU9OUzsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBUZXh0RGVzY3JpcHRpb25zOjpnZXRQYXJjZWxPZkRlc2NyaXB0aW9ucygoY29uc3QgdWludDhfdCAqKWRhdGEsIG1GaWxlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnLCBrU3RhcnRUaW1lTXMsICZwYXJjZWwpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJnZXRQYXJjZWxPZkRlc2NyaXB0aW9ucyByZXR1cm5lZCBlcnJvciI7CisgICAgQUxPR0koIlNpemUgb2YgdGhlIFBhcmNlbDogJXp1IiwgcGFyY2VsLmRhdGFTaXplKCkpOworICAgIEFTU0VSVF9HVChwYXJjZWwuZGF0YVNpemUoKSwgMCkgPDwgIlBhcmNlbCBpcyBlbXB0eSI7CisKKyAgICBwYXJjZWwuc2V0RGF0YVBvc2l0aW9uKDApOworICAgIGludDMyX3Qga2V5ID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShrZXksIEtFWV9MT0NBTF9TRVRUSU5HKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIGtleSI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUQVJUX1RJTUUpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgc3RhcnQgdGltZSBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGtTdGFydFRpbWVNcykgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB0aW1pbmdzIjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfU1RSVUNUX1RFWFQpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgc3RydWN0IHRleHQga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBtRmlsZVNpemUpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdGV4dCBkYXRhIjsKKyAgICBpbnQzMl90IGZpbGVTaXplID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShmaWxlU2l6ZSwgbUZpbGVTaXplKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIGZpbGUgc2l6ZSB2YWx1ZSI7CisgICAgdWludDhfdCB0bXBEYXRhW2ZpbGVTaXplXTsKKyAgICBzdGF0dXMgPSBwYXJjZWwucmVhZCgodm9pZCAqKXRtcERhdGEsIGZpbGVTaXplKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRmFpbGVkIHRvIHJlYWQgdGhlIGRhdGEgZnJvbSBwYXJjZWwiOworICAgIC8vIFRvIG1ha2Ugc3VyZSBlbmQgb2YgcGFyY2VsIGlzIHJlYWNoZWQKKyAgICBBU1NFUlRfRVEocGFyY2VsLmRhdGFBdmFpbCgpLCAwKSA8PCAiUGFyY2VsIGhhcyBzb21lIGRhdGEgbGVmdCB0byByZWFkIjsKK30KKworLy8gVGhpcyB0ZXN0IHVzZXMgdGhlIHByb3BlcnRpZXMgb2YgdHgzZyBib3ggbWVudGlvbmVkIGluIDNHUFAgVGltZWQgVGV4dCBGb3JtYXQKKy8vIFNwZWNpZmljYXRpb24jOiAyNi4yNDUgLyBTZWN0aW9uOiA1LjE2KFNhbXBsZSBEZXNjcmlwdGlvbiBGb3JtYXQpCisvLyBodHRwczovL3d3dy4zZ3BwLm9yZy9mdHAvU3BlY3MvYXJjaGl2ZS8yNl9zZXJpZXMvMjYuMjQ1LworCitURVNUX1AoVGV4dDNHUFBEZXNjcmlwdGlvblRlc3QsIFRleHQzR1BQR2xvYmFsRGVzY3JpcHRpb25UZXN0KSB7CisgICAgY2hhciBkYXRhW21GaWxlU2l6ZV07CisgICAgbUVsZVN0cmVhbS5yZWFkKGRhdGEsIHNpemVvZihkYXRhKSk7CisgICAgQVNTRVJUX0VRKG1FbGVTdHJlYW0uZ2NvdW50KCksIG1GaWxlU2l6ZSk7CisKKyAgICBjb25zdCB1aW50OF90ICp0bXBEYXRhID0gKGNvbnN0IHVpbnQ4X3QgKilkYXRhOworICAgIGludDMyX3QgcmVtYWluaW5nID0gbUZpbGVTaXplOworICAgIEZvbnRJbmZvIGZvbnRJbmZvOworICAgIHZlY3RvcjxGb250UmVjb3JkPiBmb250UmVjb3JkRW50cmllczsKKworICAgIC8vIFNraXBwaW5nIHRoZSBieXRlcyBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIHN1YmJveCh0eDNnKQorICAgIHRtcERhdGEgKz0gMTY7CisgICAgcmVtYWluaW5nIC09IDE2OworCisgICAgZm9udEluZm8uZGlzcGxheUZsYWcgPSBVMzJfQVQodG1wRGF0YSk7CisgICAgQUxPR0koIkRpc3BsYXkgZmxhZzogJWQiLCBmb250SW5mby5kaXNwbGF5RmxhZyk7CisgICAgZm9udEluZm8uaG9yaXpvbnRhbEp1c3RpZmljYXRpb24gPSB0bXBEYXRhWzRdOworICAgIEFMT0dJKCJIb3Jpem9udGFsIEp1c3RpZmljYXRpb246ICVkIiwgZm9udEluZm8uaG9yaXpvbnRhbEp1c3RpZmljYXRpb24pOworICAgIGZvbnRJbmZvLnZlcnRpY2FsSnVzdGlmaWNhdGlvbiA9IHRtcERhdGFbNV07CisgICAgQUxPR0koIlZlcnRpY2FsIEp1c3RpZmljYXRpb246ICVkIiwgZm9udEluZm8udmVydGljYWxKdXN0aWZpY2F0aW9uKTsKKyAgICBmb250SW5mby5yZ2JhQmFja2dyb3VuZCA9CisgICAgICAgICAgICAqKHRtcERhdGEgKyA2KSA8PCAyNCB8ICoodG1wRGF0YSArIDcpIDw8IDE2IHwgKih0bXBEYXRhICsgOCkgPDwgOCB8ICoodG1wRGF0YSArIDkpOworICAgIEFMT0dJKCJyZ2JhIHZhbHVlIG9mIGJhY2tncm91bmQ6ICVkIiwgZm9udEluZm8ucmdiYUJhY2tncm91bmQpOworCisgICAgdG1wRGF0YSArPSAxMDsKKyAgICByZW1haW5pbmcgLT0gMTA7CisKKyAgICBpZiAocmVtYWluaW5nID49IDgpIHsKKyAgICAgICAgZm9udEluZm8ubGVmdFBvcyA9IFUxNl9BVCh0bXBEYXRhKTsKKyAgICAgICAgQUxPR0koIkxlZnQ6ICVkIiwgZm9udEluZm8ubGVmdFBvcyk7CisgICAgICAgIGZvbnRJbmZvLnRvcFBvcyA9IFUxNl9BVCh0bXBEYXRhICsgMik7CisgICAgICAgIEFMT0dJKCJUb3A6ICVkIiwgZm9udEluZm8udG9wUG9zKTsKKyAgICAgICAgZm9udEluZm8uYm90dG9tUG9zID0gVTE2X0FUKHRtcERhdGEgKyA0KTsKKyAgICAgICAgQUxPR0koIkJvdHRvbTogJWQiLCBmb250SW5mby5ib3R0b21Qb3MpOworICAgICAgICBmb250SW5mby5yaWdodFBvcyA9IFUxNl9BVCh0bXBEYXRhICsgNik7CisgICAgICAgIEFMT0dJKCJSaWdodDogJWQiLCBmb250SW5mby5yaWdodFBvcyk7CisKKyAgICAgICAgdG1wRGF0YSArPSA4OworICAgICAgICByZW1haW5pbmcgLT0gODsKKworICAgICAgICBpZiAocmVtYWluaW5nID49IDEyKSB7CisgICAgICAgICAgICBmb250SW5mby5zdGFydGNoYXIgPSBVMTZfQVQodG1wRGF0YSk7CisgICAgICAgICAgICBBTE9HSSgiU3RhcnQgY2hhcmFjdGVyOiAlZCIsIGZvbnRJbmZvLnN0YXJ0Y2hhcik7CisgICAgICAgICAgICBmb250SW5mby5lbmRDaGFyID0gVTE2X0FUKHRtcERhdGEgKyAyKTsKKyAgICAgICAgICAgIEFMT0dJKCJFbmQgY2hhcmFjdGVyOiAlZCIsIGZvbnRJbmZvLmVuZENoYXIpOworICAgICAgICAgICAgZm9udEluZm8uZm9udElkID0gVTE2X0FUKHRtcERhdGEgKyA0KTsKKyAgICAgICAgICAgIEFMT0dJKCJWYWx1ZSBvZiBmb250IElkZW50aWZpZXI6ICVkIiwgZm9udEluZm8uZm9udElkKTsKKyAgICAgICAgICAgIGZvbnRJbmZvLmZhY2VTdHlsZSA9ICoodG1wRGF0YSArIDYpOworICAgICAgICAgICAgQUxPR0koIkZhY2Ugc3R5bGUgZmxhZyA6ICVkIiwgZm9udEluZm8uZmFjZVN0eWxlKTsKKyAgICAgICAgICAgIGZvbnRJbmZvLmZvbnRTaXplID0gKih0bXBEYXRhICsgNyk7CisgICAgICAgICAgICBBTE9HSSgiU2l6ZSBvZiB0aGUgZm9udDogJWQiLCBmb250SW5mby5mb250U2l6ZSk7CisgICAgICAgICAgICBmb250SW5mby5yZ2JhVGV4dCA9ICoodG1wRGF0YSArIDgpIDw8IDI0IHwgKih0bXBEYXRhICsgOSkgPDwgMTYgfCAqKHRtcERhdGEgKyAxMCkgPDwgOCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoodG1wRGF0YSArIDExKTsKKyAgICAgICAgICAgIEFMT0dJKCJyZ2JhIHZhbHVlIG9mIHRoZSB0ZXh0OiAlZCIsIGZvbnRJbmZvLnJnYmFUZXh0KTsKKworICAgICAgICAgICAgdG1wRGF0YSArPSAxMjsKKyAgICAgICAgICAgIHJlbWFpbmluZyAtPSAxMjsKKworICAgICAgICAgICAgaWYgKHJlbWFpbmluZyA+PSAxMCkgeworICAgICAgICAgICAgICAgIC8vIFNraXBwaW5nIHRoZSBieXRlcyBjb250YWluaW5nIGluZm9ybWF0aW9uIGFib3V0IHRoZSB0eXBlIG9mIHN1YmJveChmdGFiKQorICAgICAgICAgICAgICAgIGZvbnRJbmZvLmVudHJ5Q291bnQgPSBVMTZfQVQodG1wRGF0YSArIDgpOworICAgICAgICAgICAgICAgIEFMT0dJKCJWYWx1ZSBvZiBlbnRyeSBjb3VudDogJWQiLCBmb250SW5mby5lbnRyeUNvdW50KTsKKworICAgICAgICAgICAgICAgIHRtcERhdGEgKz0gMTA7CisgICAgICAgICAgICAgICAgcmVtYWluaW5nIC09IDEwOworCisgICAgICAgICAgICAgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZm9udEluZm8uZW50cnlDb3VudDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCAzKSBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0ZW1wRm9udElEID0gVTE2X0FUKHRtcERhdGEpOworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiRm9udCBJZDogJWQiLCB0ZW1wRm9udElEKTsKKyAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB0ZW1wRm9udE5hbWVMZW5ndGggPSAqKHRtcERhdGEgKyAyKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0koIkxlbmd0aCBvZiBmb250IG5hbWU6ICVkIiwgdGVtcEZvbnROYW1lTGVuZ3RoKTsKKworICAgICAgICAgICAgICAgICAgICB0bXBEYXRhICs9IDM7CisgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyAtPSAzOworCisgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPCB0ZW1wRm9udE5hbWVMZW5ndGgpIGJyZWFrOworICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90ICp0bXBGb250ID0gdG1wRGF0YTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqdG1wRm9udE5hbWUgPSBzdHJuZHVwKChjb25zdCBjaGFyICopdG1wRm9udCwgdGVtcEZvbnROYW1lTGVuZ3RoKTsKKyAgICAgICAgICAgICAgICAgICAgQVNTRVJUX05FKHRtcEZvbnROYW1lLCBudWxscHRyKSA8PCAiRm9udCBOYW1lIGlzIG51bGwiOworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiRm9udE5hbWUgPSAlcyIsIHRtcEZvbnROYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgZnJlZSh0bXBGb250TmFtZSk7CisgICAgICAgICAgICAgICAgICAgIHRtcERhdGEgKz0gdGVtcEZvbnROYW1lTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICByZW1haW5pbmcgLT0gdGVtcEZvbnROYW1lTGVuZ3RoOworICAgICAgICAgICAgICAgICAgICBmb250UmVjb3JkRW50cmllcy5wdXNoX2JhY2soe3RlbXBGb250SUQsIHRlbXBGb250TmFtZUxlbmd0aCwgdG1wRm9udH0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIFBhcmNlbCBwYXJjZWw7CisgICAgaW50MzJfdCBmbGFnID0gVGV4dERlc2NyaXB0aW9uczo6SU5fQkFORF9URVhUXzNHUFAgfCBUZXh0RGVzY3JpcHRpb25zOjpHTE9CQUxfREVTQ1JJUFRJT05TOworICAgIHN0YXR1c190IHN0YXR1cyA9IFRleHREZXNjcmlwdGlvbnM6OmdldFBhcmNlbE9mRGVzY3JpcHRpb25zKChjb25zdCB1aW50OF90ICopZGF0YSwgbUZpbGVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWcsIGtTdGFydFRpbWVNcywgJnBhcmNlbCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgImdldFBhcmNlbE9mRGVzY3JpcHRpb25zIHJldHVybmVkIGVycm9yIjsKKyAgICBBTE9HSSgiU2l6ZSBvZiB0aGUgUGFyY2VsOiAlenUiLCBwYXJjZWwuZGF0YVNpemUoKSk7CisgICAgQVNTRVJUX0dUKHBhcmNlbC5kYXRhU2l6ZSgpLCAwKSA8PCAiUGFyY2VsIGlzIGVtcHR5IjsKKworICAgIHBhcmNlbC5zZXREYXRhUG9zaXRpb24oMCk7CisgICAgaW50MzJfdCBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX0dMT0JBTF9TRVRUSU5HKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIGtleSI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX0RJU1BMQVlfRkxBR1MpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgRElTUExBWSBGTEFHUyBLZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLmRpc3BsYXlGbGFnKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB2YWx1ZSBvZiBkaXNwbGF5IGZsYWciOworCisgICAga2V5ID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShrZXksIEtFWV9TVFJVQ1RfSlVTVElGSUNBVElPTikgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBTVFJVQ1QgSlVTVElGSUNBVElPTiBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLmhvcml6b250YWxKdXN0aWZpY2F0aW9uKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCB2YWx1ZSBvZiBIb3Jpem9udGFsIGp1c3RpZmljYXRpb24iOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLnZlcnRpY2FsSnVzdGlmaWNhdGlvbikKKyAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2YgVmVydGljYWwganVzdGlmaWNhdGlvbiI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX0JBQ0tHUk9VTkRfQ09MT1JfUkdCQSkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBCQUNLR1JPVU5EIENPTE9SIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8ucmdiYUJhY2tncm91bmQpCisgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHJnYmEgYmFja2dyb3VuZCBjb2xvciB2YWx1ZSI7CisKKyAgICBpZiAocGFyY2VsLmRhdGFBdmFpbCgpID09IDApIHsKKyAgICAgICAgQUxPR1YoIkNvbXBsZXRlZCByZWFkaW5nIHRoZSBwYXJjZWwiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfU1RSVUNUX1RFWFRfUE9TKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIFNUUlVDVCBURVhUIFBPU0lUSU9OIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8ubGVmdFBvcykKKyAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgcmdiYSBiYWNrZ3JvdW5kIGNvbG9yIHZhbHVlIjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby50b3BQb3MpCisgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHJnYmEgYmFja2dyb3VuZCBjb2xvciB2YWx1ZSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8uYm90dG9tUG9zKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCByZ2JhIGJhY2tncm91bmQgY29sb3IgdmFsdWUiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLnJpZ2h0UG9zKQorICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCByZ2JhIGJhY2tncm91bmQgY29sb3IgdmFsdWUiOworCisgICAgaWYgKHBhcmNlbC5kYXRhQXZhaWwoKSA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJDb21wbGV0ZWQgcmVhZGluZyB0aGUgcGFyY2VsIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUUlVDVF9TVFlMRV9MSVNUKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIFNUUlVDVCBTVFlMRSBMSVNUIGtleSI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUQVJUX0NIQVIpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgU1RBUlQgQ0hBUiBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLnN0YXJ0Y2hhcikKKyAgICAgICAgICAgIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2Ygc3RhcnQgY2hhcmFjdGVyIjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfRU5EX0NIQVIpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgRU5EIENIQVIga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby5lbmRDaGFyKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIGVuZCBjaGFyYWN0ZXIiOworCisgICAga2V5ID0gcGFyY2VsLnJlYWRJbnQzMigpOworICAgIEFTU0VSVF9FUShrZXksIEtFWV9GT05UX0lEKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIEZPTlQgSUQga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby5mb250SWQpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2YgZm9udCBJZCI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUWUxFX0ZMQUdTKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIFNUWUxFIEZMQUdTIGtleSI7CisgICAgQVNTRVJUX0VRKHBhcmNlbC5yZWFkSW50MzIoKSwgZm9udEluZm8uZmFjZVN0eWxlKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIHN0eWxlIGZsYWdzIjsKKworICAgIGtleSA9IHBhcmNlbC5yZWFkSW50MzIoKTsKKyAgICBBU1NFUlRfRVEoa2V5LCBLRVlfRk9OVF9TSVpFKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIEZPTlQgU0laRSBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLmZvbnRTaXplKSA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIGZvbnQgc2l6ZSI7CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1RFWFRfQ09MT1JfUkdCQSkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBURVhUIENPTE9SIFJHQkEga2V5IjsKKyAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250SW5mby5yZ2JhVGV4dCkgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCByZ2JhIHRleHQgY29sb3IgdmFsdWUiOworCisgICAgaWYgKHBhcmNlbC5kYXRhQXZhaWwoKSA9PSAwKSB7CisgICAgICAgIEFMT0dWKCJDb21wbGV0ZWQgcmVhZGluZyB0aGUgcGFyY2VsIik7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBrZXkgPSBwYXJjZWwucmVhZEludDMyKCk7CisgICAgQVNTRVJUX0VRKGtleSwgS0VZX1NUUlVDVF9GT05UX0xJU1QpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgU1RSVUNUIEZPTlQgTElTVCBrZXkiOworICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRJbmZvLmVudHJ5Q291bnQpIDw8ICJQYXJjZWwgaGFzIGludmFsaWQgdmFsdWUgb2YgZW50cnkgY291bnQiOworICAgIEFTU0VSVF9FUShmb250SW5mby5lbnRyeUNvdW50LCBmb250UmVjb3JkRW50cmllcy5zaXplKCkpCisgICAgICAgICAgICA8PCAiQXJyYXkgc2l6ZSBkb2VzIG5vdCBtYXRjaCBleHBlY3RlZCBudW1iZXIgb2YgZW50cmllcyI7CisgICAgZm9yIChpbnQzMl90IGkgPSAwOyBpIDwgZm9udEluZm8uZW50cnlDb3VudDsgaSsrKSB7CisgICAgICAgIEFTU0VSVF9FUShwYXJjZWwucmVhZEludDMyKCksIGZvbnRSZWNvcmRFbnRyaWVzW2ldLmZvbnRJRCkKKyAgICAgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIGZvbnQgSWQiOworICAgICAgICBBU1NFUlRfRVEocGFyY2VsLnJlYWRJbnQzMigpLCBmb250UmVjb3JkRW50cmllc1tpXS5mb250TmFtZUxlbmd0aCkKKyAgICAgICAgICAgICAgICA8PCAiUGFyY2VsIGhhcyBpbnZhbGlkIHZhbHVlIG9mIGZvbnQgbmFtZSBsZW5ndGgiOworICAgICAgICB1aW50OF90IGZvbnROYW1lW2ZvbnRSZWNvcmRFbnRyaWVzW2ldLmZvbnROYW1lTGVuZ3RoXTsKKyAgICAgICAgc3RhdHVzID0gcGFyY2VsLnJlYWQoKHZvaWQgKilmb250TmFtZSwgZm9udFJlY29yZEVudHJpZXNbaV0uZm9udE5hbWVMZW5ndGgpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiRmFpbGVkIHRvIHJlYWQgdGhlIGZvbnQgbmFtZSBmcm9tIHBhcmNlbCI7CisgICAgICAgIEFTU0VSVF9FUShtZW1jbXAoZm9udE5hbWUsIGZvbnRSZWNvcmRFbnRyaWVzW2ldLmZvbnQsIGZvbnRSZWNvcmRFbnRyaWVzW2ldLmZvbnROYW1lTGVuZ3RoKSwKKyAgICAgICAgICAgICAgICAgIDApCisgICAgICAgICAgICAgICAgPDwgIlBhcmNlbCBoYXMgaW52YWxpZCBmb250IjsKKyAgICB9CisgICAgLy8gVG8gbWFrZSBzdXJlIGVuZCBvZiBwYXJjZWwgaXMgcmVhY2hlZAorICAgIEFTU0VSVF9FUShwYXJjZWwuZGF0YUF2YWlsKCksIDApIDw8ICJQYXJjZWwgaGFzIHNvbWUgZGF0YSBsZWZ0IHRvIHJlYWQiOworfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoVGltZWRUZXh0VW5pdFRlc3RBbGwsIFNSVERlc2NyaXB0aW9uVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygoInNhbXBsZVRlc3QxLnNydCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgic2FtcGxlVGVzdDIuc3J0IikpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFRpbWVkVGV4dFVuaXRUZXN0QWxsLCBUZXh0M0dQUERlc2NyaXB0aW9uVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcygoInR4M2dCb3gxIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJ0eDNnQm94MiIpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGdFbnYgPSBuZXcgVGltZWRUZXh0VGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HVigiVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vQW5kcm9pZC5icAppbmRleCAyNjZiNjExLi4yY2ViZThmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9BbmRyb2lkLmJwCkBAIC0yNyw4ICsyNywxNCBAQAogICAgIGluY2x1ZGVfZGlyczogWyJmcmFtZXdvcmtzL2F2L2luY2x1ZGUiXSwKIAogICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJkYXRhc291cmNlIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlidXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICBdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIF0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwCmluZGV4IGE1MTIwYjkuLjRkNTA0ZTAgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuY3BwCkBAIC0zMDUsNiArMzA1LDcgQEAKIH0KIAogc3A8V2VibUVsZW1lbnQ+IFdlYm1FbGVtZW50OjpBdWRpb1RyYWNrRW50cnkoCisgICAgICAgIGNvbnN0IGNoYXIgKmNvZGVjLAogICAgICAgICBpbnQgY2hhbnMsCiAgICAgICAgIGRvdWJsZSByYXRlLAogICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmLApAQCAtMzIyLDcgKzMyMyw3IEBACiAgICAgICAgICAgICB1aWQsCiAgICAgICAgICAgICBsYWNpbmcsCiAgICAgICAgICAgICBsYW5nLAotICAgICAgICAgICAgIkFfVk9SQklTIiwKKyAgICAgICAgICAgIGNvZGVjLAogICAgICAgICAgICAga0F1ZGlvVHlwZSwKICAgICAgICAgICAgIHRyYWNrRW50cnlGaWVsZHMpOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1FbGVtZW50LmgKaW5kZXggZmZiYmExYi4uYTk0YzIzZiAxMDA2NDQKLS0tIGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRWxlbWVudC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUVsZW1lbnQuaApAQCAtNTAsNiArNTAsNyBAQAogICAgIHN0YXRpYyBzcDxXZWJtRWxlbWVudD4gU2VnbWVudEluZm8odWludDY0X3Qgc2NhbGUgPSAxMDAwMDAwLCBkb3VibGUgZHVyID0gMCk7CiAKICAgICBzdGF0aWMgc3A8V2VibUVsZW1lbnQ+IEF1ZGlvVHJhY2tFbnRyeSgKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvZGVjLAogICAgICAgICAgICAgaW50IGNoYW5zLAogICAgICAgICAgICAgZG91YmxlIHJhdGUsCiAgICAgICAgICAgICBjb25zdCBzcDxBQnVmZmVyPiAmYnVmLApkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuY3BwCmluZGV4IDRiMGQ0N2MuLjUyYzMwZWMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5jcHAKQEAgLTYyLDYgKzYyLDE0IEBACiAgICAgICAgICAgICBtRGF0YSk7CiB9CiAKK3VpbnQ2NF90IFdlYm1GcmFtZTo6Z2V0QWJzVGltZWNvZGUoKSB7CisgICAgcmV0dXJuIG1BYnNUaW1lY29kZTsKK30KKwordm9pZCBXZWJtRnJhbWU6OnVwZGF0ZUFic1RpbWVjb2RlKHVpbnQ2NF90IG5ld0Fic1RpbWVjb2RlKSB7CisgICAgbUFic1RpbWVjb2RlID0gbmV3QWJzVGltZWNvZGU7Cit9CisKIGJvb2wgV2VibUZyYW1lOjpvcGVyYXRvcjwoY29uc3QgV2VibUZyYW1lICZvdGhlcikgY29uc3QgewogICAgIGlmICh0aGlzLT5tRW9zKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKZGlmZiAtLWdpdCBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmggYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZS5oCmluZGV4IGE0MTBhODcuLjQ3ZjI1MjMgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lLmgKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWUuaApAQCAtMjUsNyArMjUsNyBAQAogcHVibGljOgogICAgIGNvbnN0IGludCBtVHlwZTsKICAgICBjb25zdCBib29sIG1LZXk7Ci0gICAgY29uc3QgdWludDY0X3QgbUFic1RpbWVjb2RlOworICAgIHVpbnQ2NF90IG1BYnNUaW1lY29kZTsKICAgICBjb25zdCBzcDxBQnVmZmVyPiBtRGF0YTsKICAgICBjb25zdCBib29sIG1Fb3M7CiAKQEAgLTMzLDYgKzMzLDggQEAKICAgICBXZWJtRnJhbWUoaW50IHR5cGUsIGJvb2wga2V5LCB1aW50NjRfdCBhYnNUaW1lY29kZSwgTWVkaWFCdWZmZXJCYXNlICpidWYpOwogICAgIH5XZWJtRnJhbWUoKSB7fQogCisgICAgdWludDY0X3QgZ2V0QWJzVGltZWNvZGUoKTsKKyAgICB2b2lkIHVwZGF0ZUFic1RpbWVjb2RlKHVpbnQ2NF90IG5ld0Fic1RpbWVjb2RlKTsKICAgICBzcDxXZWJtRWxlbWVudD4gU2ltcGxlQmxvY2sodWludDY0X3QgYmFzZVRpbWVjb2RlKSBjb25zdDsKIAogICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFdlYm1GcmFtZSAmb3RoZXIpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuY3BwCmluZGV4IDRiNmY5MjguLjYzMWEyYWIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmNwcAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5jcHAKQEAgLTc4LDYgKzc4LDcgQEAKICAgICAgIG1WaWRlb0ZyYW1lcyh2aWRlb1RocmVhZC0+bVNpbmspLAogICAgICAgbUF1ZGlvRnJhbWVzKGF1ZGlvVGhyZWFkLT5tU2luayksCiAgICAgICBtQ3VlcyhjdWVzKSwKKyAgICAgIG1TdGFydE9mZnNldFRpbWVjb2RlKFVJTlQ2NF9NQVgpLAogICAgICAgbURvbmUodHJ1ZSkgewogfQogCkBAIC05Miw2ICs5Myw3IEBACiAgICAgICBtVmlkZW9GcmFtZXModmlkZW9Tb3VyY2UpLAogICAgICAgbUF1ZGlvRnJhbWVzKGF1ZGlvU291cmNlKSwKICAgICAgIG1DdWVzKGN1ZXMpLAorICAgICAgbVN0YXJ0T2Zmc2V0VGltZWNvZGUoVUlOVDY0X01BWCksCiAgICAgICBtRG9uZSh0cnVlKSB7CiB9CiAKQEAgLTIxMyw2ICsyMTUsMTEgQEAKICAgICAgICAgY29uc3Qgc3A8V2VibUZyYW1lPiBhdWRpb0ZyYW1lID0gbUF1ZGlvRnJhbWVzLnBlZWsoKTsKICAgICAgICAgQUxPR1YoImEgZnJhbWU6ICVwIiwgYXVkaW9GcmFtZS5nZXQoKSk7CiAKKyAgICAgICAgaWYgKG1TdGFydE9mZnNldFRpbWVjb2RlID09IFVJTlQ2NF9NQVgpIHsKKyAgICAgICAgICAgIG1TdGFydE9mZnNldFRpbWVjb2RlID0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjptaW4oYXVkaW9GcmFtZS0+Z2V0QWJzVGltZWNvZGUoKSwgdmlkZW9GcmFtZS0+Z2V0QWJzVGltZWNvZGUoKSk7CisgICAgICAgIH0KKwogICAgICAgICBpZiAodmlkZW9GcmFtZS0+bUVvcyAmJiBhdWRpb0ZyYW1lLT5tRW9zKSB7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMjIwLDEwICsyMjcsMTIgQEAKICAgICAgICAgaWYgKCphdWRpb0ZyYW1lIDwgKnZpZGVvRnJhbWUpIHsKICAgICAgICAgICAgIEFMT0dWKCJ0YWtlIGEgZnJhbWUiKTsKICAgICAgICAgICAgIG1BdWRpb0ZyYW1lcy50YWtlKCk7CisgICAgICAgICAgICBhdWRpb0ZyYW1lLT51cGRhdGVBYnNUaW1lY29kZShhdWRpb0ZyYW1lLT5nZXRBYnNUaW1lY29kZSgpIC0gbVN0YXJ0T2Zmc2V0VGltZWNvZGUpOwogICAgICAgICAgICAgb3V0c3RhbmRpbmdGcmFtZXMucHVzaF9iYWNrKGF1ZGlvRnJhbWUpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR1YoInRha2UgdiBmcmFtZSIpOwogICAgICAgICAgICAgbVZpZGVvRnJhbWVzLnRha2UoKTsKKyAgICAgICAgICAgIHZpZGVvRnJhbWUtPnVwZGF0ZUFic1RpbWVjb2RlKHZpZGVvRnJhbWUtPmdldEFic1RpbWVjb2RlKCkgLSBtU3RhcnRPZmZzZXRUaW1lY29kZSk7CiAgICAgICAgICAgICBvdXRzdGFuZGluZ0ZyYW1lcy5wdXNoX2JhY2sodmlkZW9GcmFtZSk7CiAgICAgICAgICAgICBpZiAodmlkZW9GcmFtZS0+bUtleSkKICAgICAgICAgICAgICAgICBudW1WaWRlb0tleUZyYW1lcysrOwpAQCAtMzUwLDcgKzM1OSw2IEBACiAgICAgICAgIGlmIChtU3RhcnRUaW1lVXMgPT0ga1VuaW5pdGlhbGl6ZWQpIHsKICAgICAgICAgICAgIG1TdGFydFRpbWVVcyA9IHRpbWVzdGFtcFVzOwogICAgICAgICB9Ci0gICAgICAgIHRpbWVzdGFtcFVzIC09IG1TdGFydFRpbWVVczsKIAogICAgICAgICBpZiAobVBhdXNlZCAmJiAhbVJlc3VtZWQpIHsKICAgICAgICAgICAgIGxhc3REdXJhdGlvblVzID0gdGltZXN0YW1wVXMgLSBsYXN0VGltZXN0YW1wVXM7CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5oIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtRnJhbWVUaHJlYWQuaAppbmRleCA3NmM5MWYxLi4yZGRlMjBhIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1GcmFtZVRocmVhZC5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibUZyYW1lVGhyZWFkLmgKQEAgLTIwLDggKzIwLDggQEAKICNpbmNsdWRlICJXZWJtRnJhbWUuaCIKICNpbmNsdWRlICJMaW5rZWRCbG9ja2luZ1F1ZXVlLmgiCiAKKyNpbmNsdWRlIDxkYXRhc291cmNlL0ZpbGVTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9NZWRpYVNvdXJjZS5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ZpbGVTb3VyY2UuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KQEAgLTgzLDYgKzgzLDcgQEAKICAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4gPiYgbVZpZGVvRnJhbWVzOwogICAgIExpbmtlZEJsb2NraW5nUXVldWU8Y29uc3Qgc3A8V2VibUZyYW1lPiA+JiBtQXVkaW9GcmFtZXM7CiAgICAgTGlzdDxzcDxXZWJtRWxlbWVudD4gPiYgbUN1ZXM7CisgICAgdWludDY0X3QgbVN0YXJ0T2Zmc2V0VGltZWNvZGU7CiAKICAgICB2b2xhdGlsZSBib29sIG1Eb25lOwogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS9XZWJtV3JpdGVyLmNwcAppbmRleCA0ZDczZWI4Li41ZWFhZGJkIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL1dlYm1Xcml0ZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vV2VibVdyaXRlci5jcHAKQEAgLTIzLDYgKzIzLDggQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRGVmcy5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQURlYnVnLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9oZXhkdW1wLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmg+CiAKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KIApAQCAtMTEyLDQ2ICsxMTQsMTA3IEBACiAvLyBzdGF0aWMKIHNwPFdlYm1FbGVtZW50PiBXZWJtV3JpdGVyOjphdWRpb1RyYWNrKGNvbnN0IHNwPE1ldGFEYXRhPiYgbWQpIHsKICAgICBpbnQzMl90IG5DaGFubmVscywgc2FtcGxlcmF0ZTsKLSAgICB1aW50MzJfdCB0eXBlOwotICAgIGNvbnN0IHZvaWQgKmhlYWRlckRhdGExOwotICAgIGNvbnN0IGNoYXIgaGVhZGVyRGF0YTJbXSA9IHsgMywgJ3YnLCAnbycsICdyJywgJ2InLCAnaScsICdzJywgNywgMCwgMCwgMCwKLSAgICAgICAgICAgICdhJywgJ24nLCAnZCcsICdyJywgJ28nLCAnaScsICdkJywgMCwgMCwgMCwgMCwgMSB9OwotICAgIGNvbnN0IHZvaWQgKmhlYWRlckRhdGEzOwotICAgIHNpemVfdCBoZWFkZXJTaXplMSwgaGVhZGVyU2l6ZTIgPSBzaXplb2YoaGVhZGVyRGF0YTIpLCBoZWFkZXJTaXplMzsKKyAgICBjb25zdCBjaGFyKiBtaW1lVHlwZTsKIAogICAgIGlmICghbWQtPmZpbmRJbnQzMihrS2V5Q2hhbm5lbENvdW50LCAmbkNoYW5uZWxzKQotICAgICAgICAgICAgfHwgIW1kLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVyYXRlKQotICAgICAgICAgICAgfHwgIW1kLT5maW5kRGF0YShrS2V5Vm9yYmlzSW5mbywgJnR5cGUsICZoZWFkZXJEYXRhMSwgJmhlYWRlclNpemUxKQotICAgICAgICAgICAgfHwgIW1kLT5maW5kRGF0YShrS2V5Vm9yYmlzQm9va3MsICZ0eXBlLCAmaGVhZGVyRGF0YTMsICZoZWFkZXJTaXplMykpIHsKKyAgICAgICAgfHwgIW1kLT5maW5kSW50MzIoa0tleVNhbXBsZVJhdGUsICZzYW1wbGVyYXRlKQorICAgICAgICB8fCAhbWQtPmZpbmRDU3RyaW5nKGtLZXlNSU1FVHlwZSwgJm1pbWVUeXBlKSkgewogICAgICAgICBBTE9HRSgiTWlzc2luZyBmb3JtYXQga2V5cyBmb3IgYXVkaW8gdHJhY2siKTsKICAgICAgICAgbWQtPmR1bXBUb0xvZygpOwogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAKLSAgICBzaXplX3QgY29kZWNQcml2YXRlU2l6ZSA9IDE7Ci0gICAgY29kZWNQcml2YXRlU2l6ZSArPSBYaXBoTGFjZUNvZGVMZW4oaGVhZGVyU2l6ZTEpOwotICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gWGlwaExhY2VDb2RlTGVuKGhlYWRlclNpemUyKTsKLSAgICBjb2RlY1ByaXZhdGVTaXplICs9IGhlYWRlclNpemUxICsgaGVhZGVyU2l6ZTIgKyBoZWFkZXJTaXplMzsKKyAgICBpbnQzMl90IGJpdHNQZXJTYW1wbGUgPSAwOworICAgIGlmICghbWQtPmZpbmRJbnQzMihrS2V5Qml0c1BlclNhbXBsZSwgJmJpdHNQZXJTYW1wbGUpKSB7CisgICAgICAgIEFMT0dWKCJrS2V5Qml0c1BlclNhbXBsZSBub3QgYXZhaWxhYmxlIik7CisgICAgfQogCi0gICAgb2ZmX3Qgb2ZmID0gMDsKLSAgICBzcDxBQnVmZmVyPiBjb2RlY1ByaXZhdGVCdWYgPSBuZXcgQUJ1ZmZlcihjb2RlY1ByaXZhdGVTaXplKTsKLSAgICB1aW50OF90ICpjb2RlY1ByaXZhdGVEYXRhID0gY29kZWNQcml2YXRlQnVmLT5kYXRhKCk7Ci0gICAgY29kZWNQcml2YXRlRGF0YVtvZmYrK10gPSAyOworICAgIGlmICghc3RybmNhc2VjbXAobWltZVR5cGUsIE1FRElBX01JTUVUWVBFX0FVRElPX09QVVMsIHN0cmxlbihNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTKSkpIHsKKyAgICAgICAgLy8gT3B1cyBpbiBXZWJNIGlzIGEgd2VsbC1rbm93biwgeWV0IHVuZGVyLWRvY3VtZW50ZWQsIGZvcm1hdC4gVGhlIGNvZGVjIHByaXZhdGUgZGF0YQorICAgICAgICAvLyBvZiB0aGUgdHJhY2sgaXMgYW4gT3B1cyBPZ2cgaGVhZGVyIChodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNzg0NSNzZWN0aW9uLTUuMSkKKyAgICAgICAgLy8gVGhlIG5hbWUgb2YgdGhlIHRyYWNrIGlzbid0IHN0YW5kYXJkaXplZCwgaXRzIHZhbHVlIHNob3VsZCBiZSAiQV9PUFVTIi4KKyAgICAgICAgT3B1c0hlYWRlciBoZWFkZXI7CisgICAgICAgIGhlYWRlci5jaGFubmVscyA9IG5DaGFubmVsczsKKyAgICAgICAgaGVhZGVyLm51bV9zdHJlYW1zID0gbkNoYW5uZWxzOworICAgICAgICBoZWFkZXIubnVtX2NvdXBsZWQgPSAwOworICAgICAgICAvLyAtIENoYW5uZWwgbWFwcGluZyBmYW1pbHkgKDggYml0cyB1bnNpZ25lZCkKKyAgICAgICAgLy8gIC0tICAwID0gb25lIHN0cmVhbTogbW9ubyBvciBMLFIgc3RlcmVvCisgICAgICAgIC8vICAtLSAgMSA9IGNoYW5uZWxzIGluIHZvcmJpcyBzcGVjIG9yZGVyOiBtb25vIG9yIEwsUiBzdGVyZW8gb3IgLi4uIG9yIEZMLEMsRlIsUkwsUlIsTEZFLCAuLi4KKyAgICAgICAgLy8gIC0tICAyLi4yNTQgPSByZXNlcnZlZCAodHJlYXQgYXMgMjU1KQorICAgICAgICAvLyAgLS0gIDI1NSA9IG5vIGRlZmluZWQgY2hhbm5lbCBtZWFuaW5nCisgICAgICAgIC8vCisgICAgICAgIC8vICBvdXIgaW1wbGVtZW50YXRpb24gZW5jb2RlczogIDAsIDEsIG9yIDI1NQorICAgICAgICBoZWFkZXIuY2hhbm5lbF9tYXBwaW5nID0gKChuQ2hhbm5lbHMgPiA4KSA/IDI1NSA6IChuQ2hhbm5lbHMgPiAyKSk7CisgICAgICAgIGhlYWRlci5nYWluX2RiID0gMDsKKyAgICAgICAgaGVhZGVyLnNraXBfc2FtcGxlcyA9IDA7CiAKLSAgICBvZmYgKz0gWGlwaExhY2VFbmMoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyU2l6ZTEpOwotICAgIG9mZiArPSBYaXBoTGFjZUVuYyhjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJTaXplMik7CisgICAgICAgIC8vIGhlYWRlcnMgYXJlIDIxLWJ5dGVzICsgc29tZXRoaW5nIGRyaXZlbiBieSBjaGFubmVsIGNvdW50CisgICAgICAgIC8vIGV4cGVjdCBudW1iZXJzIGluIHRoZSBsb3cgMzAncyBoZXJlLiBXcml0ZU9wdXNIZWFkZXIoKSB3aWxsIHRlbGwgdXMKKyAgICAgICAgLy8gaWYgdGhpbmdzIGFyZSBiYWQuCisgICAgICAgIHVuc2lnbmVkIGNoYXIgaGVhZGVyX2RhdGFbMTAwXTsKKyAgICAgICAgaW50IGhlYWRlclNpemUgPSBXcml0ZU9wdXNIZWFkZXIoaGVhZGVyLCBzYW1wbGVyYXRlLCAodWludDhfdCopaGVhZGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihoZWFkZXJfZGF0YSkpOwogCi0gICAgbWVtY3B5KGNvZGVjUHJpdmF0ZURhdGEgKyBvZmYsIGhlYWRlckRhdGExLCBoZWFkZXJTaXplMSk7Ci0gICAgb2ZmICs9IGhlYWRlclNpemUxOwotICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJEYXRhMiwgaGVhZGVyU2l6ZTIpOwotICAgIG9mZiArPSBoZWFkZXJTaXplMjsKLSAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyRGF0YTMsIGhlYWRlclNpemUzKTsKKyAgICAgICAgaWYgKGhlYWRlclNpemUgPCAwKSB7CisgICAgICAgICAgICAvLyBkaWRuJ3QgZmlsbCBvdXQgdGhhdCBoZWFkZXIgZm9yIHNvbWUgcmVhc29uCisgICAgICAgICAgICBBTE9HRSgiZmFpbGVkIHRvIGdlbmVyYXRlIE9QVVMgaGVhZGVyIik7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQogCi0gICAgc3A8V2VibUVsZW1lbnQ+IGVudHJ5ID0gV2VibUVsZW1lbnQ6OkF1ZGlvVHJhY2tFbnRyeSgKLSAgICAgICAgICAgIG5DaGFubmVscywKLSAgICAgICAgICAgIHNhbXBsZXJhdGUsCi0gICAgICAgICAgICBjb2RlY1ByaXZhdGVCdWYpOwotICAgIHJldHVybiBlbnRyeTsKKyAgICAgICAgc2l6ZV90IGNvZGVjUHJpdmF0ZVNpemUgPSAwOworICAgICAgICBjb2RlY1ByaXZhdGVTaXplICs9IGhlYWRlclNpemU7CisKKyAgICAgICAgb2ZmX3Qgb2ZmID0gMDsKKyAgICAgICAgc3A8QUJ1ZmZlcj4gY29kZWNQcml2YXRlQnVmID0gbmV3IEFCdWZmZXIoY29kZWNQcml2YXRlU2l6ZSk7CisgICAgICAgIHVpbnQ4X3QqIGNvZGVjUHJpdmF0ZURhdGEgPSBjb2RlY1ByaXZhdGVCdWYtPmRhdGEoKTsKKworICAgICAgICBtZW1jcHkoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgKHVpbnQ4X3QqKWhlYWRlcl9kYXRhLCBoZWFkZXJTaXplKTsKKyAgICAgICAgc3A8V2VibUVsZW1lbnQ+IGVudHJ5ID0gV2VibUVsZW1lbnQ6OkF1ZGlvVHJhY2tFbnRyeSgiQV9PUFVTIiwgbkNoYW5uZWxzLCBzYW1wbGVyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjUHJpdmF0ZUJ1ZiwgYml0c1BlclNhbXBsZSk7CisgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChtaW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RybGVuKE1FRElBX01JTUVUWVBFX0FVRElPX1ZPUkJJUykpKSB7CisgICAgICAgIHVpbnQzMl90IHR5cGU7CisgICAgICAgIGNvbnN0IHZvaWQgKmhlYWRlckRhdGExOworICAgICAgICBjb25zdCBjaGFyIGhlYWRlckRhdGEyW10gPSB7IDMsICd2JywgJ28nLCAncicsICdiJywgJ2knLCAncycsIDcsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgJ2EnLCAnbicsICdkJywgJ3InLCAnbycsICdpJywgJ2QnLCAwLCAwLCAwLCAwLCAxIH07CisgICAgICAgIGNvbnN0IHZvaWQgKmhlYWRlckRhdGEzOworICAgICAgICBzaXplX3QgaGVhZGVyU2l6ZTEsIGhlYWRlclNpemUyID0gc2l6ZW9mKGhlYWRlckRhdGEyKSwgaGVhZGVyU2l6ZTM7CisKKyAgICAgICAgaWYgKCFtZC0+ZmluZERhdGEoa0tleU9wYXF1ZUNTRDAsICZ0eXBlLCAmaGVhZGVyRGF0YTEsICZoZWFkZXJTaXplMSkKKyAgICAgICAgICAgIHx8ICFtZC0+ZmluZERhdGEoa0tleU9wYXF1ZUNTRDEsICZ0eXBlLCAmaGVhZGVyRGF0YTMsICZoZWFkZXJTaXplMykpIHsKKyAgICAgICAgICAgIEFMT0dFKCJNaXNzaW5nIGhlYWRlciBmb3JtYXQga2V5cyBmb3Igdm9yYmlzIHRyYWNrIik7CisgICAgICAgICAgICBtZC0+ZHVtcFRvTG9nKCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBjb2RlY1ByaXZhdGVTaXplID0gMTsKKyAgICAgICAgY29kZWNQcml2YXRlU2l6ZSArPSBYaXBoTGFjZUNvZGVMZW4oaGVhZGVyU2l6ZTEpOworICAgICAgICBjb2RlY1ByaXZhdGVTaXplICs9IFhpcGhMYWNlQ29kZUxlbihoZWFkZXJTaXplMik7CisgICAgICAgIGNvZGVjUHJpdmF0ZVNpemUgKz0gaGVhZGVyU2l6ZTEgKyBoZWFkZXJTaXplMiArIGhlYWRlclNpemUzOworCisgICAgICAgIG9mZl90IG9mZiA9IDA7CisgICAgICAgIHNwPEFCdWZmZXI+IGNvZGVjUHJpdmF0ZUJ1ZiA9IG5ldyBBQnVmZmVyKGNvZGVjUHJpdmF0ZVNpemUpOworICAgICAgICB1aW50OF90ICpjb2RlY1ByaXZhdGVEYXRhID0gY29kZWNQcml2YXRlQnVmLT5kYXRhKCk7CisgICAgICAgIGNvZGVjUHJpdmF0ZURhdGFbb2ZmKytdID0gMjsKKworICAgICAgICBvZmYgKz0gWGlwaExhY2VFbmMoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyU2l6ZTEpOworICAgICAgICBvZmYgKz0gWGlwaExhY2VFbmMoY29kZWNQcml2YXRlRGF0YSArIG9mZiwgaGVhZGVyU2l6ZTIpOworCisgICAgICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJEYXRhMSwgaGVhZGVyU2l6ZTEpOworICAgICAgICBvZmYgKz0gaGVhZGVyU2l6ZTE7CisgICAgICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJEYXRhMiwgaGVhZGVyU2l6ZTIpOworICAgICAgICBvZmYgKz0gaGVhZGVyU2l6ZTI7CisgICAgICAgIG1lbWNweShjb2RlY1ByaXZhdGVEYXRhICsgb2ZmLCBoZWFkZXJEYXRhMywgaGVhZGVyU2l6ZTMpOworCisgICAgICAgIHNwPFdlYm1FbGVtZW50PiBlbnRyeSA9IFdlYm1FbGVtZW50OjpBdWRpb1RyYWNrRW50cnkoIkFfVk9SQklTIiwgbkNoYW5uZWxzLCBzYW1wbGVyYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjUHJpdmF0ZUJ1ZiwgYml0c1BlclNhbXBsZSk7CisgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiVHJhY2sgKCVzKSBpcyBub3QgYSBzdXBwb3J0ZWQgYXVkaW8gZm9ybWF0IiwgbWltZVR5cGUpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CiB9CiAKIHNpemVfdCBXZWJtV3JpdGVyOjpudW1UcmFja3MoKSB7CkBAIC0zODIsMTYgKzQ0NSwxOCBAQAogICAgIGNvbnN0IGNoYXIgKnZwOCA9IE1FRElBX01JTUVUWVBFX1ZJREVPX1ZQODsKICAgICBjb25zdCBjaGFyICp2cDkgPSBNRURJQV9NSU1FVFlQRV9WSURFT19WUDk7CiAgICAgY29uc3QgY2hhciAqdm9yYmlzID0gTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTOworICAgIGNvbnN0IGNoYXIqIG9wdXMgPSBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTOwogCiAgICAgc2l6ZV90IHN0cmVhbUluZGV4OwogICAgIGlmICghc3RybmNhc2VjbXAobWltZSwgdnA4LCBzdHJsZW4odnA4KSkgfHwKICAgICAgICAgIXN0cm5jYXNlY21wKG1pbWUsIHZwOSwgc3RybGVuKHZwOSkpKSB7CiAgICAgICAgIHN0cmVhbUluZGV4ID0ga1ZpZGVvSW5kZXg7Ci0gICAgfSBlbHNlIGlmICghc3RybmNhc2VjbXAobWltZSwgdm9yYmlzLCBzdHJsZW4odm9yYmlzKSkpIHsKKyAgICB9IGVsc2UgaWYgKCFzdHJuY2FzZWNtcChtaW1lLCB2b3JiaXMsIHN0cmxlbih2b3JiaXMpKSB8fAorICAgICAgICAgICAgICAgIXN0cm5jYXNlY21wKG1pbWUsIG9wdXMsIHN0cmxlbihvcHVzKSkpIHsKICAgICAgICAgc3RyZWFtSW5kZXggPSBrQXVkaW9JbmRleDsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HRSgiVHJhY2sgKCVzKSBvdGhlciB0aGFuICVzLCAlcyBvciAlcyBpcyBub3Qgc3VwcG9ydGVkIiwKLSAgICAgICAgICAgICAgbWltZSwgdnA4LCB2cDksIHZvcmJpcyk7CisgICAgICAgIEFMT0dFKCJUcmFjayAoJXMpIG90aGVyIHRoYW4gJXMsICVzLCAlcywgb3IgJXMgaXMgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgIG1pbWUsIHZwOCwgdnA5LCB2b3JiaXMsIG9wdXMpOwogICAgICAgICByZXR1cm4gRVJST1JfVU5TVVBQT1JURUQ7CiAgICAgfQogCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL3Rlc3RzL0FuZHJvaWQuYnAgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4M2E0OQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDU0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogIldlYm1GcmFtZVRocmVhZFVuaXRUZXN0IiwKKyAgICBndGVzdDogdHJ1ZSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIldlYm1GcmFtZVRocmVhZFVuaXRUZXN0LmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodCIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJkYXRhc291cmNlIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0X3dlYm0iLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgY2ZpOiB0cnVlLAorICAgICAgICBtaXNjX3VuZGVmaW5lZDogWworICAgICAgICAgICAgInVuc2lnbmVkLWludGVnZXItb3ZlcmZsb3ciLAorICAgICAgICAgICAgInNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgXSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS90ZXN0cy9SRUFETUUubWQgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL3Rlc3RzL1JFQURNRS5tZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTc0ZjM0Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibS90ZXN0cy9SRUFETUUubWQKQEAgLTAsMCArMSwyNiBAQAorIyMgTWVkaWEgVGVzdGluZyAjIworLS0tCisjIyMjIFdlYm0gV3JpdGVyIFV0aWxpdHkgVGVzdHMgOgorVGhlIFdlYm0gV3JpdGVyIFV0aWxpdHkgVGVzdCBTdWl0ZSB2YWxpZGF0ZXMgdGhlIEFQSXMgYmVpbmcgdXNlZCBieSB0aGUgV2VibVdyaXRlci4KKworUnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gYnVpbGQgdGhlIHRlc3Qgc3VpdGU6CitgYGAKK21tbSBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vdGVzdHMvCitgYGAKKworVGhlIDMyLWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdC8KKworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCisjIyMjIFdlYm1GcmFtZVRocmVhZAorVG8gdGVzdCA2NC1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0NjQuCisKK2FkYiBwdXNoICR7T1VUfS9kYXRhL25hdGl2ZXRlc3Q2NC9XZWJtRnJhbWVUaHJlYWRVbml0VGVzdC9XZWJtRnJhbWVUaHJlYWRVbml0VGVzdCAvZGF0YS9sb2NhbC90bXAvCisKK1RvIHRlc3QgMzItYml0IGJpbmFyeSBwdXNoIGJpbmFyaWVzIGZyb20gbmF0aXZldGVzdC4KKworYWRiIHB1c2ggJHtPVVR9L2RhdGEvbmF0aXZldGVzdC9XZWJtRnJhbWVUaHJlYWRVbml0VGVzdC9XZWJtRnJhbWVUaHJlYWRVbml0VGVzdCAvZGF0YS9sb2NhbC90bXAvCisKK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9XZWJtRnJhbWVUaHJlYWRVbml0VGVzdAorYGBgCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL3Rlc3RzL1dlYm1GcmFtZVRocmVhZFVuaXRUZXN0LmNwcCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3dlYm0vdGVzdHMvV2VibUZyYW1lVGhyZWFkVW5pdFRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5Y2QyY2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC93ZWJtL3Rlc3RzL1dlYm1GcmFtZVRocmVhZFVuaXRUZXN0LmNwcApAQCAtMCwwICsxLDMxNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAyMCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiV2VibUZyYW1lVGhyZWFkVW5pdFRlc3QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFBZGFwdGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWV0YURhdGEuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9VdGlscy5oPgorCisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BQnVmZmVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FNZXNzYWdlLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9PcHVzSGVhZGVyLmg+CisKKyNpbmNsdWRlICJ3ZWJtL0VibWxVdGlsLmgiCisjaW5jbHVkZSAid2VibS9XZWJtQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAid2VibS9XZWJtRnJhbWVUaHJlYWQuaCIKKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2Ugd2VibTsKKworc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtWaWRlb0lkeCA9IDA7CitzdGF0aWMgY29uc3RleHByIGludDMyX3Qga0F1ZGlvSWR4ID0gMTsKK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrTWF4U3RyZWFtQ291bnQgPSAyOworCitzdGF0aWMgY29uc3RleHByIGludDMyX3Qga0NzZFNpemUgPSAzMjsKK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrRnJhbWVTaXplID0gMTI4OworCitzdGF0aWMgY29uc3RleHByIGludDMyX3Qga01heExvb3BDb3VudCA9IDIwOworc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtOdW1GcmFtZXNUb1dyaXRlID0gMzI7CitzdGF0aWMgY29uc3RleHByIGludDMyX3Qga1N5bmNGcmFtZUludGVydmFsID0gMTA7CitzdGF0aWMgY29uc3RleHByIHVpbnQ2NF90IGtEZWZhdWx0VGltZUNvZGVTY2FsZVVzID0gMTAwMDAwMDsgLyogMXNlYyAqLworCisjZGVmaW5lIE9VVFBVVF9GSUxFX05BTUUgIi9kYXRhL2xvY2FsL3RtcC93ZWJtRnJhbWVUaHJlYWRPdXRwdXQud2VibSIKKworLy8gTG9va1VwVGFibGUgb2YgY2xpcHMgYW5kIG1ldGFkYXRhIGZvciBjb21wb25lbnQgdGVzdGluZworc3RhdGljIGNvbnN0IHN0cnVjdCBJbnB1dERhdGEgeworICAgIGNvbnN0IGNoYXIgKm1pbWU7CisgICAgaW50MzJfdCBmaXJzdFBhcmFtOworICAgIGludDMyX3Qgc2Vjb25kUGFyYW07CisgICAgYm9vbCBpc0F1ZGlvOworfSBrSW5wdXREYXRhW10gPSB7CisgICAgICAgIHtNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCA0ODAwMCwgNiwgdHJ1ZX0sCisgICAgICAgIHtNRURJQV9NSU1FVFlQRV9BVURJT19WT1JCSVMsIDQ0MTAwLCAxLCB0cnVlfSwKKyAgICAgICAge01FRElBX01JTUVUWVBFX1ZJREVPX1ZQOSwgMTc2LCAxNDQsIGZhbHNlfSwKKyAgICAgICAge01FRElBX01JTUVUWVBFX1ZJREVPX1ZQOCwgMTkyMCwgMTA4MCwgZmFsc2V9LAorfTsKKworY2xhc3MgV2VibUZyYW1lVGhyZWFkVW5pdFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4geworICBwdWJsaWM6CisgICAgV2VibUZyYW1lVGhyZWFkVW5pdFRlc3QoKQorICAgICAgICA6IG1TaW5rVGhyZWFkKG51bGxwdHIpLCBtQXVkaW9UaHJlYWQobnVsbHB0ciksIG1WaWRlb1RocmVhZChudWxscHRyKSwgbVNvdXJjZXt9IHt9CisKKyAgICB+V2VibUZyYW1lVGhyZWFkVW5pdFRlc3QoKSB7CisgICAgICAgIGlmIChtU2lua1RocmVhZCkgbVNpbmtUaHJlYWQuY2xlYXIoKTsKKyAgICAgICAgaWYgKG1BdWRpb1RocmVhZCkgbUF1ZGlvVGhyZWFkLmNsZWFyKCk7CisgICAgICAgIGlmIChtVmlkZW9UaHJlYWQpIG1WaWRlb1RocmVhZC5jbGVhcigpOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIG92ZXJyaWRlIHsKKyAgICAgICAgbVNlZ21lbnREYXRhU3RhcnQgPSAwOworICAgICAgICBtRmQgPSBvcGVuKE9VVFBVVF9GSUxFX05BTUUsIE9fQ1JFQVQgfCBPX0xBUkdFRklMRSB8IE9fVFJVTkMgfCBPX1JEV1IsIFNfSVJVU1IgfCBTX0lXVVNSKTsKKyAgICAgICAgQVNTRVJUX0dFKG1GZCwgMCkgPDwgIkZhaWxlZCB0byBvcGVuIG91dHB1dCBmaWxlICIgPDwgT1VUUFVUX0ZJTEVfTkFNRTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtRmQgPj0gMCkgY2xvc2UobUZkKTsKKyAgICAgICAgZm9yIChpbnQzMl90IGlkeCA9IDA7IGlkeCA8IGtNYXhTdHJlYW1Db3VudDsgaWR4KyspIHsKKyAgICAgICAgICAgIGlmIChtU291cmNlW2lkeF0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIG1Tb3VyY2VbaWR4XS5jbGVhcigpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1WU2luay5jbGVhcigpOworICAgICAgICBtQVNpbmsuY2xlYXIoKTsKKyAgICAgICAgbUN1ZVBvaW50cy5jbGVhcigpOworICAgIH0KKworICAgIHZvaWQgYWRkVHJhY2soYm9vbCBpc0F1ZGlvLCBpbnQzMl90IGluZGV4KTsKKyAgICB2b2lkIHdyaXRlRmlsZURhdGEoaW50MzJfdCBpbnB1dEZyYW1lSWQsIGludDMyX3QgcmFuZ2UpOworCisgICAgdm9pZCBjcmVhdGVXZWJtVGhyZWFkcyhzdGQ6OmluaXRpYWxpemVyX2xpc3Q8aW50MzJfdD4gaW5kZXhMaXN0KTsKKyAgICB2b2lkIHN0YXJ0V2VibUZyYW1lVGhyZWFkcygpOworICAgIHZvaWQgc3RvcFdlYm1GcmFtZVRocmVhZHMoKTsKKworICAgIGludDMyX3QgbUZkOworICAgIHVpbnQ2NF90IG1TZWdtZW50RGF0YVN0YXJ0OworCisgICAgc3A8V2VibUZyYW1lU2lua1RocmVhZD4gbVNpbmtUaHJlYWQ7CisgICAgc3A8V2VibUZyYW1lU291cmNlVGhyZWFkPiBtQXVkaW9UaHJlYWQ7CisgICAgc3A8V2VibUZyYW1lU291cmNlVGhyZWFkPiBtVmlkZW9UaHJlYWQ7CisKKyAgICBMaXN0PHNwPFdlYm1FbGVtZW50Pj4gbUN1ZVBvaW50czsKKyAgICBzcDxNZWRpYUFkYXB0ZXI+IG1Tb3VyY2Vba01heFN0cmVhbUNvdW50XTsKKyAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4+IG1WU2luazsKKyAgICBMaW5rZWRCbG9ja2luZ1F1ZXVlPGNvbnN0IHNwPFdlYm1GcmFtZT4+IG1BU2luazsKK307CisKK3ZvaWQgd3JpdGVBdWRpb0hlYWRlckRhdGEoY29uc3Qgc3A8QU1lc3NhZ2U+ICZmb3JtYXQsIGNvbnN0IGNoYXIgKm1pbWVUeXBlKSB7CisgICAgaWYgKHN0cm5jYXNlY21wKG1pbWVUeXBlLCBNRURJQV9NSU1FVFlQRV9BVURJT19PUFVTLCBzdHJsZW4oTUVESUFfTUlNRVRZUEVfQVVESU9fT1BVUykgKyAxKSAmJgorICAgICAgICBzdHJuY2FzZWNtcChtaW1lVHlwZSwgTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTLAorICAgICAgICAgICAgICAgICAgICBzdHJsZW4oTUVESUFfTUlNRVRZUEVfQVVESU9fVk9SQklTKSArIDEpKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGZhbHNlKSA8PCAiVW5zdXBwb3J0ZWQgbWltZSB0eXBlIjsKKyAgICB9CisKKyAgICAvLyBEdW1teSBDU0QgYnVmZmVycyBmb3IgT3B1cyBhbmQgVm9yYmlzCisgICAgY2hhciBjc2RCdWZmZXJba0NzZFNpemVdOworICAgIG1lbXNldChjc2RCdWZmZXIsIDB4RkYsIHNpemVvZihjc2RCdWZmZXIpKTsKKworICAgIHNwPEFCdWZmZXI+IGNzZEJ1ZmZlcjAgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoKHZvaWQgKiljc2RCdWZmZXIsIGtDc2RTaXplKTsKKyAgICBBU1NFUlRfTkUoY3NkQnVmZmVyMC5nZXQoKSwgbnVsbHB0cikgPDwgIlVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIENTRDAgZGF0YSI7CisgICAgQVNTRVJUX05FKGNzZEJ1ZmZlcjAtPmJhc2UoKSwgbnVsbHB0cikgPDwgIkFCdWZmZXIgYmFzZSBpcyBudWxsIGZvciBDU0QwIjsKKworICAgIHNwPEFCdWZmZXI+IGNzZEJ1ZmZlcjEgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoKHZvaWQgKiljc2RCdWZmZXIsIGtDc2RTaXplKTsKKyAgICBBU1NFUlRfTkUoY3NkQnVmZmVyMS5nZXQoKSwgbnVsbHB0cikgPDwgIlVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIENTRDEgZGF0YSI7CisgICAgQVNTRVJUX05FKGNzZEJ1ZmZlcjEtPmJhc2UoKSwgbnVsbHB0cikgPDwgIkFCdWZmZXIgYmFzZSBpcyBudWxsIGZvciBDU0QxIjsKKworICAgIHNwPEFCdWZmZXI+IGNzZEJ1ZmZlcjIgPSBBQnVmZmVyOjpDcmVhdGVBc0NvcHkoKHZvaWQgKiljc2RCdWZmZXIsIGtDc2RTaXplKTsKKyAgICBBU1NFUlRfTkUoY3NkQnVmZmVyMi5nZXQoKSwgbnVsbHB0cikgPDwgIlVuYWJsZSB0byBhbGxvY2F0ZSBidWZmZXIgZm9yIENTRDIgZGF0YSI7CisgICAgQVNTRVJUX05FKGNzZEJ1ZmZlcjItPmJhc2UoKSwgbnVsbHB0cikgPDwgIkFCdWZmZXIgYmFzZSBpcyBudWxsIGZvciBDU0QyIjsKKworICAgIGZvcm1hdC0+c2V0QnVmZmVyKCJjc2QtMCIsIGNzZEJ1ZmZlcjApOworICAgIGZvcm1hdC0+c2V0QnVmZmVyKCJjc2QtMSIsIGNzZEJ1ZmZlcjEpOworICAgIGZvcm1hdC0+c2V0QnVmZmVyKCJjc2QtMiIsIGNzZEJ1ZmZlcjIpOworfQorCit2b2lkIFdlYm1GcmFtZVRocmVhZFVuaXRUZXN0OjphZGRUcmFjayhib29sIGlzQXVkaW8sIGludDMyX3QgaW5kZXgpIHsKKyAgICBBU1NFUlRfTFQoaW5kZXgsIHNpemVvZihrSW5wdXREYXRhKSAvIHNpemVvZihrSW5wdXREYXRhWzBdKSkKKyAgICAgICAgICAgIDw8ICJJbnZhbGlkIGluZGV4IGZvciBsb29wdXAgdGFibGUiOworCisgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdCA9IG5ldyBBTWVzc2FnZTsKKyAgICBmb3JtYXQtPnNldFN0cmluZygibWltZSIsIGtJbnB1dERhdGFbaW5kZXhdLm1pbWUpOworICAgIGlmICghaXNBdWRpbykgeworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJ3aWR0aCIsIGtJbnB1dERhdGFbaW5kZXhdLmZpcnN0UGFyYW0pOworICAgICAgICBmb3JtYXQtPnNldEludDMyKCJoZWlnaHQiLCBrSW5wdXREYXRhW2luZGV4XS5zZWNvbmRQYXJhbSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigic2FtcGxlLXJhdGUiLCBrSW5wdXREYXRhW2luZGV4XS5maXJzdFBhcmFtKTsKKyAgICAgICAgZm9ybWF0LT5zZXRJbnQzMigiY2hhbm5lbC1jb3VudCIsIGtJbnB1dERhdGFbaW5kZXhdLnNlY29uZFBhcmFtKTsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUod3JpdGVBdWRpb0hlYWRlckRhdGEoZm9ybWF0LCBrSW5wdXREYXRhW2luZGV4XS5taW1lKSk7CisgICAgfQorCisgICAgc3A8TWV0YURhdGE+IHRyYWNrTWV0YSA9IG5ldyBNZXRhRGF0YTsKKyAgICBjb252ZXJ0TWVzc2FnZVRvTWV0YURhdGEoZm9ybWF0LCB0cmFja01ldGEpOworCisgICAgaWYgKCFpc0F1ZGlvKSB7CisgICAgICAgIG1Tb3VyY2Vba1ZpZGVvSWR4XSA9IG5ldyBNZWRpYUFkYXB0ZXIodHJhY2tNZXRhKTsKKyAgICAgICAgQVNTRVJUX05FKG1Tb3VyY2Vba1ZpZGVvSWR4XSwgbnVsbHB0cikgPDwgIlVuYWJsZSB0byBjcmVhdGUgc291cmNlIjsKKyAgICB9IGVsc2UgeworICAgICAgICBtU291cmNlW2tBdWRpb0lkeF0gPSBuZXcgTWVkaWFBZGFwdGVyKHRyYWNrTWV0YSk7CisgICAgICAgIEFTU0VSVF9ORShtU291cmNlW2tBdWRpb0lkeF0sIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gY3JlYXRlIHNvdXJjZSI7CisgICAgfQorfQorCit2b2lkIFdlYm1GcmFtZVRocmVhZFVuaXRUZXN0OjpjcmVhdGVXZWJtVGhyZWFkcyhzdGQ6OmluaXRpYWxpemVyX2xpc3Q8aW50MzJfdD4gaW5kZXhMaXN0KSB7CisgICAgbVNpbmtUaHJlYWQgPSBuZXcgV2VibUZyYW1lU2lua1RocmVhZChtRmQsIG1TZWdtZW50RGF0YVN0YXJ0LCBtVlNpbmssIG1BU2luaywgbUN1ZVBvaW50cyk7CisgICAgQVNTRVJUX05FKG1TaW5rVGhyZWFkLCBudWxscHRyKSA8PCAiRmFpbGVkIHRvIGNyZWF0ZSBTaW5rIFRocmVhZCI7CisKKyAgICBib29sIGlzQXVkaW87CisgICAgLy8gTXVsdGlUcmFjayBpbnB1dAorICAgIGZvciAoaW50MzJfdCBpbmRleCA6IGluZGV4TGlzdCkgeworICAgICAgICBpc0F1ZGlvID0ga0lucHV0RGF0YVtpbmRleF0uaXNBdWRpbzsKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUoYWRkVHJhY2soaXNBdWRpbywgaW5kZXgpKTsKKyAgICAgICAgaWYgKCFpc0F1ZGlvKSB7CisgICAgICAgICAgICBtVmlkZW9UaHJlYWQgPSBuZXcgV2VibUZyYW1lTWVkaWFTb3VyY2VUaHJlYWQobVNvdXJjZVtrVmlkZW9JZHhdLCBrVmlkZW9UeXBlLCBtVlNpbmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRUaW1lQ29kZVNjYWxlVXMsIDAsIDAsIDEsIDApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUF1ZGlvVGhyZWFkID0gbmV3IFdlYm1GcmFtZU1lZGlhU291cmNlVGhyZWFkKG1Tb3VyY2Vba0F1ZGlvSWR4XSwga0F1ZGlvVHlwZSwgbUFTaW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtEZWZhdWx0VGltZUNvZGVTY2FsZVVzLCAwLCAwLCAxLCAwKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBUbyBoYW5kbGUgc2luZ2xlIHRyYWNrIGZpbGUKKyAgICBpZiAoIW1WaWRlb1RocmVhZCkgeworICAgICAgICBtVmlkZW9UaHJlYWQgPSBuZXcgV2VibUZyYW1lRW1wdHlTb3VyY2VUaHJlYWQoa1ZpZGVvVHlwZSwgbVZTaW5rKTsKKyAgICB9IGVsc2UgaWYgKCFtQXVkaW9UaHJlYWQpIHsKKyAgICAgICAgbUF1ZGlvVGhyZWFkID0gbmV3IFdlYm1GcmFtZUVtcHR5U291cmNlVGhyZWFkKGtBdWRpb1R5cGUsIG1BU2luayk7CisgICAgfQorICAgIEFTU0VSVF9ORShtVmlkZW9UaHJlYWQsIG51bGxwdHIpIDw8ICJGYWlsZWQgdG8gY3JlYXRlIFZpZGVvIFRocmVhZCI7CisgICAgQVNTRVJUX05FKG1BdWRpb1RocmVhZCwgbnVsbHB0cikgPDwgIkZhaWxlZCB0byBjcmVhdGUgQXVkaW8gVGhyZWFkIjsKK30KKwordm9pZCBXZWJtRnJhbWVUaHJlYWRVbml0VGVzdDo6c3RhcnRXZWJtRnJhbWVUaHJlYWRzKCkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1RocmVhZC0+c3RhcnQoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBBTUVESUFfT0spIDw8ICJGYWlsZWQgdG8gc3RhcnQgQXVkaW8gVGhyZWFkIjsKKyAgICBzdGF0dXMgPSBtVmlkZW9UaHJlYWQtPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgQU1FRElBX09LKSA8PCAiRmFpbGVkIHRvIHN0YXJ0IFZpZGVvIFRocmVhZCI7CisgICAgc3RhdHVzID0gbVNpbmtUaHJlYWQtPnN0YXJ0KCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgQU1FRElBX09LKSA8PCAiRmFpbGVkIHRvIHN0YXJ0IFNpbmsgVGhyZWFkIjsKK30KKwordm9pZCBXZWJtRnJhbWVUaHJlYWRVbml0VGVzdDo6c3RvcFdlYm1GcmFtZVRocmVhZHMoKSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvVGhyZWFkLT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgQU1FRElBX09LKSA8PCAiRmFpbGVkIHRvIHN0b3AgQXVkaW8gVGhyZWFkIjsKKyAgICBzdGF0dXMgPSBtVmlkZW9UaHJlYWQtPnN0b3AoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBBTUVESUFfT0spIDw8ICJGYWlsZWQgdG8gc3RvcCBWaWRlbyBUaHJlYWQiOworICAgIHN0YXR1cyA9IG1TaW5rVGhyZWFkLT5zdG9wKCk7CisgICAgQVNTRVJUX0VRKHN0YXR1cywgQU1FRElBX09LKSA8PCAiRmFpbGVkIHRvIHN0b3AgU2luayBUaHJlYWQiOworfQorCisvLyBXcml0ZSBkdW1teSBkYXRhIHRvIGEgZmlsZQordm9pZCBXZWJtRnJhbWVUaHJlYWRVbml0VGVzdDo6d3JpdGVGaWxlRGF0YShpbnQzMl90IGlucHV0RnJhbWVJZCwgaW50MzJfdCByYW5nZSkgeworICAgIGNoYXIgZGF0YVtrRnJhbWVTaXplXTsKKyAgICBtZW1zZXQoZGF0YSwgMHhGRiwgc2l6ZW9mKGRhdGEpKTsKKyAgICBpbnQzMl90IHN0YXR1cyA9IE9LOworICAgIGRvIHsKKyAgICAgICAgLy8gUXVldWUgZnJhbWVzIGZvciBib3RoIEEvViB0cmFja3MKKyAgICAgICAgZm9yIChpbnQzMl90IGlkeCA9IGtWaWRlb0lkeDsgaWR4IDwga01heFN0cmVhbUNvdW50OyBpZHgrKykgeworICAgICAgICAgICAgc3A8QUJ1ZmZlcj4gYnVmZmVyID0gbmV3IEFCdWZmZXIoKHZvaWQgKilkYXRhLCBrRnJhbWVTaXplKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShidWZmZXIuZ2V0KCksIG51bGxwdHIpIDw8ICJBQnVmZmVyIHJldHVybmVkIG51bGxwdHIiOworCisgICAgICAgICAgICAvLyBSZWxlYXNlZCBpbiBNZWRpYUFkYXB0ZXI6OnNpZ25hbEJ1ZmZlclJldHVybmVkKCkuCisgICAgICAgICAgICBNZWRpYUJ1ZmZlciAqbWVkaWFCdWZmZXIgPSBuZXcgTWVkaWFCdWZmZXIoYnVmZmVyKTsKKyAgICAgICAgICAgIEFTU0VSVF9ORShtZWRpYUJ1ZmZlciwgbnVsbHB0cikgPDwgIk1lZGlhQnVmZmVyIHJldHVybmVkIG51bGxwdHIiOworCisgICAgICAgICAgICBtZWRpYUJ1ZmZlci0+YWRkX3JlZigpOworICAgICAgICAgICAgbWVkaWFCdWZmZXItPnNldF9yYW5nZShidWZmZXItPm9mZnNldCgpLCBidWZmZXItPnNpemUoKSk7CisKKyAgICAgICAgICAgIE1ldGFEYXRhQmFzZSAmc2FtcGxlTWV0YURhdGEgPSBtZWRpYUJ1ZmZlci0+bWV0YV9kYXRhKCk7CisgICAgICAgICAgICBzYW1wbGVNZXRhRGF0YS5zZXRJbnQ2NChrS2V5VGltZSwgaW5wdXRGcmFtZUlkICoga0RlZmF1bHRUaW1lQ29kZVNjYWxlVXMpOworCisgICAgICAgICAgICAvLyBGb3IgYXVkaW8gY29kZWNzLCB0cmVhdCBhbGwgZnJhbWUgYXMgc3luYyBmcmFtZQorICAgICAgICAgICAgaWYgKChpZHggPT0ga0F1ZGlvSWR4KSB8fCAoaW5wdXRGcmFtZUlkICUga1N5bmNGcmFtZUludGVydmFsID09IDApKSB7CisgICAgICAgICAgICAgICAgc2FtcGxlTWV0YURhdGEuc2V0SW50MzIoa0tleUlzU3luY0ZyYW1lLCB0cnVlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVGhpcyBwdXNoQnVmZmVyIHdpbGwgd2FpdCB1bnRpbCB0aGUgbWVkaWFCdWZmZXIgaXMgY29uc3VtZWQuCisgICAgICAgICAgICBpZiAobVNvdXJjZVtpZHhdICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBtU291cmNlW2lkeF0tPnB1c2hCdWZmZXIobWVkaWFCdWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgT0spOworICAgICAgICB9CisgICAgICAgIGlucHV0RnJhbWVJZCsrOworICAgIH0gd2hpbGUgKGlucHV0RnJhbWVJZCA8IHJhbmdlKTsKK30KKworVEVTVF9QKFdlYm1GcmFtZVRocmVhZFVuaXRUZXN0LCBXcml0ZVRlc3QpIHsKKyAgICBpbnQzMl90IGluZGV4MSA9IEdldFBhcmFtKCkuZmlyc3Q7CisgICAgaW50MzJfdCBpbmRleDIgPSBHZXRQYXJhbSgpLnNlY29uZDsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShjcmVhdGVXZWJtVGhyZWFkcyh7aW5kZXgxLCBpbmRleDJ9KSk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzdGFydFdlYm1GcmFtZVRocmVhZHMoKSk7CisKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh3cml0ZUZpbGVEYXRhKDAsIGtOdW1GcmFtZXNUb1dyaXRlKSk7CisKKyAgICBpZiAobVNvdXJjZVtrQXVkaW9JZHhdKSBtU291cmNlW2tBdWRpb0lkeF0tPnN0b3AoKTsKKyAgICBpZiAobVNvdXJjZVtrVmlkZW9JZHhdKSBtU291cmNlW2tWaWRlb0lkeF0tPnN0b3AoKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHN0b3BXZWJtRnJhbWVUaHJlYWRzKCkpOworfQorCitURVNUX1AoV2VibUZyYW1lVGhyZWFkVW5pdFRlc3QsIFBhdXNlVGVzdCkgeworICAgIGludDMyX3QgaW5kZXgxID0gR2V0UGFyYW0oKS5maXJzdDsKKyAgICBpbnQzMl90IGluZGV4MiA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKGNyZWF0ZVdlYm1UaHJlYWRzKHtpbmRleDEsIGluZGV4Mn0pKTsKKworICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHN0YXJ0V2VibUZyYW1lVGhyZWFkcygpKTsKKworICAgIGludDMyX3Qgb2Zmc2V0ID0gMDsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRSh3cml0ZUZpbGVEYXRhKG9mZnNldCwga051bUZyYW1lc1RvV3JpdGUpKTsKKyAgICBvZmZzZXQgKz0ga051bUZyYW1lc1RvV3JpdGU7CisKKyAgICBmb3IgKGludCBpZHggPSAwOyBpZHggPCBrTWF4TG9vcENvdW50OyBpZHgrKykgeworICAgICAgICAvLyBwYXVzZSB0aGUgdGhyZWFkcworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9UaHJlYWQtPnBhdXNlKCk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIEFNRURJQV9PSykgPDwgIkZhaWxlZCB0byBwYXVzZSBBdWRpbyBUaHJlYWQiOworICAgICAgICBzdGF0dXMgPSBtVmlkZW9UaHJlYWQtPnBhdXNlKCk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIEFNRURJQV9PSykgPDwgIkZhaWxlZCB0byBwYXVzZSBWaWRlbyBUaHJlYWQiOworCisgICAgICAgIC8vIFVuZGVyIHBhdXNlIHN0YXRlLCBubyB3cml0ZSBzaG91bGQgaGFwcGVuCisgICAgICAgIEFTU0VSVF9OT19GQVRBTF9GQUlMVVJFKHdyaXRlRmlsZURhdGEob2Zmc2V0LCBrTnVtRnJhbWVzVG9Xcml0ZSkpOworICAgICAgICBvZmZzZXQgKz0ga051bUZyYW1lc1RvV3JpdGU7CisKKyAgICAgICAgc3RhdHVzID0gbUF1ZGlvVGhyZWFkLT5yZXN1bWUoKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgQU1FRElBX09LKSA8PCAiRmFpbGVkIHRvIHJlc3VtZSBBdWRpbyBUaHJlYWQiOworICAgICAgICBzdGF0dXMgPSBtVmlkZW9UaHJlYWQtPnJlc3VtZSgpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBBTUVESUFfT0spIDw8ICJGYWlsZWQgdG8gcmVzdW1lIFZpZGVvIFRocmVhZCI7CisKKyAgICAgICAgQVNTRVJUX05PX0ZBVEFMX0ZBSUxVUkUod3JpdGVGaWxlRGF0YShvZmZzZXQsIGtOdW1GcmFtZXNUb1dyaXRlKSk7CisgICAgICAgIG9mZnNldCArPSBrTnVtRnJhbWVzVG9Xcml0ZTsKKyAgICB9CisKKyAgICBpZiAobVNvdXJjZVtrQXVkaW9JZHhdKSBtU291cmNlW2tBdWRpb0lkeF0tPnN0b3AoKTsKKyAgICBpZiAobVNvdXJjZVtrVmlkZW9JZHhdKSBtU291cmNlW2tWaWRlb0lkeF0tPnN0b3AoKTsKKyAgICBBU1NFUlRfTk9fRkFUQUxfRkFJTFVSRShzdG9wV2VibUZyYW1lVGhyZWFkcygpKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFdlYm1GcmFtZVRocmVhZFVuaXRUZXN0QWxsLCBXZWJtRnJhbWVUaHJlYWRVbml0VGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhzdGQ6Om1ha2VfcGFpcigwLCAxKSwgc3RkOjptYWtlX3BhaXIoMCwgMiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoMCwgMyksIHN0ZDo6bWFrZV9wYWlyKDEsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKDEsIDIpLCBzdGQ6Om1ha2VfcGFpcigxLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcigyLCAzKSkpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgIEFMT0dWKCJUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvQW5kcm9pZC5icCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9BbmRyb2lkLmJwCmluZGV4IGVkMjZlNTguLjM4ZGU4MzEgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9BbmRyb2lkLmJwCkBAIC0xLDEwICsxLDE1IEBACitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXJfaGVhZGVycyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJzdGFnZWZyaWdodF94bWxwYXJzZXIiLAogICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCiAgICAgdm5kazogewogICAgICAgICBlbmFibGVkOiB0cnVlLAogICAgIH0sCi0gICAgZG91YmxlX2xvYWRhYmxlOiB0cnVlLAogCiAgICAgc3JjczogWwogICAgICAgICAiTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwIiwKQEAgLTE1LDE1ICsyMCwxMiBAQAogICAgIF0sCiAKICAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJleHBhdCIsCiAgICAgICAgICJsaWJsb2ciLAogICAgICAgICAibGlic3RhZ2VmcmlnaHRfb214X3V0aWxzIiwKICAgICBdLAogCi0gICAgaGVhZGVyX2xpYnM6IFsKLSAgICAgICAgImxpYmJhc2VfaGVhZGVycyIsCi0gICAgXSwKLQogICAgIGNmbGFnczogWwogICAgICAgICAiLVdlcnJvciIsCiAgICAgICAgICItV2FsbCIsCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwIGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmNwcAppbmRleCAyZGVjOWZhLi5hMjMyMTUwIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuY3BwCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5jcHAKQEAgLTE5LDIwICsxOSwzMyBAQAogCiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQveG1scGFyc2VyL01lZGlhQ29kZWNzWG1sUGFyc2VyLmg+CiAKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+Ci0jaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvb214L09NWFV0aWxzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxleHBhdC5oPgogCi0jaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BRGVidWcuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvT01YVXRpbHMuaD4KKworI2luY2x1ZGUgPGV4cGF0Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNjdHlwZT4KKyNpbmNsdWRlIDxzdHJpbmc+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogbmFtZXNwYWNlIHsKIAorYm9vbCBmaWxlRXhpc3RzKGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoKSB7CisgICAgc3RydWN0IHN0YXQgZmlsZVN0YXQ7CisgICAgcmV0dXJuIHN0YXQocGF0aC5jX3N0cigpLCAmZmlsZVN0YXQpID09IDAgJiYgU19JU1JFRyhmaWxlU3RhdC5zdF9tb2RlKTsKK30KKwogLyoqCiAgKiBTZWFyY2ggZm9yIGEgZmlsZSBpbiBhIGxpc3Qgb2Ygc2VhcmNoIGRpcmVjdG9yaWVzLgogICoKQEAgLTQzLDcgKzU2LDcgQEAKICAqIHNlYXJjaCBjb250aW51ZXMgdW50aWwgdGhlIGBudWxscHRyYCBlbGVtZW50IGluIGBzZWFyY2hEaXJzYCBpcyByZWFjaGVkLCBhdAogICogd2hpY2ggcG9pbnQgdGhlIGZ1bmN0aW9uIHJldHVybnMgYGZhbHNlYC4KICAqCi0gKiBccGFyYW1baW5dIHNlYXJjaERpcnMgTnVsbC10ZXJtaW5hdGVkIGFycmF5IG9mIHNlYXJjaCBwYXRocy4KKyAqIFxwYXJhbVtpbl0gc2VhcmNoRGlycyBhcnJheSBvZiBzZWFyY2ggcGF0aHMuCiAgKiBccGFyYW1baW5dIGZpbGVOYW1lIE5hbWUgb2YgdGhlIGZpbGUgdG8gc2VhcmNoLgogICogXHBhcmFtW291dF0gb3V0UGF0aCBGdWxsIHBhdGggb2YgdGhlIGZpbGUuIGBvdXRQYXRoYCB3aWxsIGhvbGQgYSB2YWxpZCBmaWxlCiAgKiBuYW1lIGlmIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBmdW5jdGlvbiBpcyBgdHJ1ZWAuCkBAIC01MSwxNCArNjQsMTMgQEAKICAqIHZhbGlkIGZpbGUgbmFtZTsgYGZhbHNlYCBvdGhlcndpc2UuCiAgKi8KIGJvb2wgZmluZEZpbGVJbkRpcnMoCi0gICAgICAgIGNvbnN0IGNoYXIqIGNvbnN0KiBzZWFyY2hEaXJzLAotICAgICAgICBjb25zdCBjaGFyICpmaWxlTmFtZSwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZzZWFyY2hEaXJzLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZmlsZU5hbWUsCiAgICAgICAgIHN0ZDo6c3RyaW5nICpvdXRQYXRoKSB7Ci0gICAgZm9yICg7ICpzZWFyY2hEaXJzICE9IG51bGxwdHI7ICsrc2VhcmNoRGlycykgewotICAgICAgICAqb3V0UGF0aCA9IHN0ZDo6c3RyaW5nKCpzZWFyY2hEaXJzKSArICIvIiArIGZpbGVOYW1lOwotICAgICAgICBzdHJ1Y3Qgc3RhdCBmaWxlU3RhdDsKLSAgICAgICAgaWYgKHN0YXQob3V0UGF0aC0+Y19zdHIoKSwgJmZpbGVTdGF0KSA9PSAwICYmCi0gICAgICAgICAgICAgICAgU19JU1JFRyhmaWxlU3RhdC5zdF9tb2RlKSkgeworICAgIGZvciAoY29uc3Qgc3RkOjpzdHJpbmcgJnNlYXJjaERpciA6IHNlYXJjaERpcnMpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgcGF0aCA9IHNlYXJjaERpciArICIvIiArIGZpbGVOYW1lOworICAgICAgICBpZiAoZmlsZUV4aXN0cyhwYXRoKSkgeworICAgICAgICAgICAgKm91dFBhdGggPSBwYXRoOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CkBAIC04NCwxMjMgKzk2LDQ1MiBAQAogYm9vbCBwYXJzZUJvb2xlYW4oY29uc3QgY2hhciogcykgewogICAgIHJldHVybiBzdHJpRXEocywgInkiKSB8fAogICAgICAgICAgICAgc3RyaUVxKHMsICJ5ZXMiKSB8fAorICAgICAgICAgICAgc3RyaUVxKHMsICJlbmFibGVkIikgfHwKICAgICAgICAgICAgIHN0cmlFcShzLCAidCIpIHx8CiAgICAgICAgICAgICBzdHJpRXEocywgInRydWUiKSB8fAogICAgICAgICAgICAgc3RyaUVxKHMsICIxIik7CiB9CiAKLXN0YXR1c190IGxpbWl0Rm91bmRNaXNzaW5nQXR0cihjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyICphdHRyLCBib29sIGZvdW5kID0gdHJ1ZSkgewotICAgIEFMT0dFKCJsaW1pdCAnJXMnIHdpdGggJXMnJXMnIGF0dHJpYnV0ZSIsIG5hbWUsCi0gICAgICAgICAgICAoZm91bmQgPyAiIiA6ICJubyAiKSwgYXR0cik7Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKKworc3RhdHVzX3QgY29tYmluZVN0YXR1cyhzdGF0dXNfdCBhLCBzdGF0dXNfdCBiKSB7CisgICAgaWYgKGEgPT0gTk9fSU5JVCkgeworICAgICAgICByZXR1cm4gYjsKKyAgICB9IGVsc2UgaWYgKChhID09IE9LICYmIChiID09IE5BTUVfTk9UX0ZPVU5EIHx8IGIgPT0gQUxSRUFEWV9FWElTVFMgfHwgYiA9PSBOT19JTklUKSkKKyAgICAgICAgICAgIHx8IChiID09IE9LICYmIChhID09IE5BTUVfTk9UX0ZPVU5EIHx8IGEgPT0gQUxSRUFEWV9FWElTVFMpKSkgeworICAgICAgICAvLyBpZ25vcmUgTkFNRV9OT1RfRk9VTkQgYW5kIEFMUkVBRFlfRVhJU1QgZXJyb3JzIGFzIGxvbmcgYXMgdGhlIG90aGVyIGVycm9yIGlzIE9LCisgICAgICAgIC8vIGFsc28gaGFuZGxlIE9LICsgTk9fSU5JVCBoZXJlCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBwcmVmZXIgdGhlIGZpcnN0IGVycm9yIHJlc3VsdAorICAgICAgICByZXR1cm4gYSA/IDogYjsKKyAgICB9CiB9CiAKLXN0YXR1c190IGxpbWl0RXJyb3IoY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciAqbXNnKSB7Ci0gICAgQUxPR0UoImxpbWl0ICclcycgJXMiLCBuYW1lLCBtc2cpOwotICAgIHJldHVybiBCQURfVkFMVUU7CitNZWRpYUNvZGVjc1htbFBhcnNlcjo6U3RyaW5nU2V0IHBhcnNlQ29tbWFTZXBhcmF0ZWRTdHJpbmdTZXQoY29uc3QgY2hhciAqcykgeworICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpTdHJpbmdTZXQgcmVzdWx0OworICAgIGZvciAoY29uc3QgY2hhciAqcHRyID0gcyA/IDogIiI7ICpwdHI7ICkgeworICAgICAgICBjb25zdCBjaGFyICplbmQgPSBzdHJjaHJudWwocHRyLCAnLCcpOworICAgICAgICBpZiAocHRyICE9IGVuZCkgeyAvLyBza2lwIGVtcHR5IHZhbHVlcworICAgICAgICAgICAgcmVzdWx0LmVtcGxhY2UocHRyLCBlbmQgLSBwdHIpOworICAgICAgICB9CisgICAgICAgIHB0ciA9IGVuZCArICgnXDAnICE9ICplbmQpOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0dXNfdCBsaW1pdEludmFsaWRBdHRyKGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IGNoYXIqIGF0dHIsIGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gICAgQUxPR0UoImxpbWl0ICclcycgd2l0aCBpbnZhbGlkICclcycgYXR0cmlidXRlICglcykiLCBuYW1lLAotICAgICAgICAgICAgYXR0ciwgdmFsdWUpOwotICAgIHJldHVybiBCQURfVkFMVUU7CisjZGVmaW5lIFBMT0dEKG1zZywgLi4uKSBcCisgICAgICAgIEFMT0dEKG1zZyAiIGF0IGxpbmUgJXp1IG9mICVzIiwgIyNfX1ZBX0FSR1NfXywgXAorICAgICAgICAgICAgICAgIChzaXplX3QpOjpYTUxfR2V0Q3VycmVudExpbmVOdW1iZXIobVBhcnNlci5nZXQoKSksIG1QYXRoLmNfc3RyKCkpOworCit9ICAvLyB1bm5hbWVkIG5hbWVzcGFjZQorCitzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldERlZmF1bHRYbWxOYW1lcygpIHsKKyAgICBzdGF0aWMgY29uc3RleHByIGNoYXIgY29uc3QqIHByZWZpeGVzW10gPSB7CisgICAgICAgICAgICAibWVkaWFfY29kZWNzIiwKKyAgICAgICAgICAgICJtZWRpYV9jb2RlY3NfcGVyZm9ybWFuY2UiCisgICAgICAgIH07CisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiB2YXJpYW50cyA9IHsKKyAgICAgICAgICAgIGFuZHJvaWQ6OmJhc2U6OkdldFByb3BlcnR5KCJyby5tZWRpYS54bWxfdmFyaWFudC5jb2RlY3MiLCAiIiksCisgICAgICAgICAgICBhbmRyb2lkOjpiYXNlOjpHZXRQcm9wZXJ0eSgicm8ubWVkaWEueG1sX3ZhcmlhbnQuY29kZWNzX3BlcmZvcm1hbmNlIiwgIiIpCisgICAgICAgIH07CisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBuYW1lcyA9IHsKKyAgICAgICAgICAgIHByZWZpeGVzWzBdICsgdmFyaWFudHNbMF0gKyAiLnhtbCIsCisgICAgICAgICAgICBwcmVmaXhlc1sxXSArIHZhcmlhbnRzWzFdICsgIi54bWwiCisgICAgICAgIH07CisgICAgcmV0dXJuIG5hbWVzOwogfQogCi19OyAvLyB1bm5hbWVkIG5hbWVzcGFjZQogCi1jb25zdGV4cHIgY2hhciBjb25zdCogTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRTZWFyY2hEaXJzW107Ci1jb25zdGV4cHIgY2hhciBjb25zdCogTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRNYWluWG1sTmFtZTsKLWNvbnN0ZXhwciBjaGFyIGNvbnN0KiBNZWRpYUNvZGVjc1htbFBhcnNlcjo6ZGVmYXVsdFBlcmZvcm1hbmNlWG1sTmFtZTsKK3N0cnVjdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbCB7CisgICAgLy8gc3RhdHVzICsgZXJyb3IgbWVzc2FnZQorICAgIHN0cnVjdCBSZXN1bHQgeworICAgIHByaXZhdGU6CisgICAgICAgIHN0YXR1c190IG1TdGF0dXM7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1FcnJvcjsKKworICAgIHB1YmxpYzoKKyAgICAgICAgUmVzdWx0KHN0YXR1c190IHMsIHN0ZDo6c3RyaW5nIGVycm9yID0gIiIpCisgICAgICAgICAgICA6IG1TdGF0dXMocyksCisgICAgICAgICAgICAgIG1FcnJvcihlcnJvcikgeworICAgICAgICAgICAgaWYgKGVycm9yLmVtcHR5KCkgJiYgcykgeworICAgICAgICAgICAgICAgIG1FcnJvciA9ICJGYWlsZWQgKCIgKyBzdGQ6OnN0cmluZyhhc1N0cmluZyhzKSkgKyAiKSI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgb3BlcmF0b3Igc3RhdHVzX3QoKSBjb25zdCB7IHJldHVybiBtU3RhdHVzOyB9CisgICAgICAgIHN0ZDo6c3RyaW5nIGVycm9yKCkgY29uc3QgeyByZXR1cm4gbUVycm9yOyB9CisgICAgfTsKKworCisgICAgLy8gUGFyc2VkIGRhdGEKKyAgICBzdHJ1Y3QgRGF0YSB7CisgICAgICAgIC8vIFNlcnZpY2UgYXR0cmlidXRlcworICAgICAgICBBdHRyaWJ1dGVNYXAgbVNlcnZpY2VBdHRyaWJ1dGVNYXA7CisgICAgICAgIENvZGVjTWFwIG1Db2RlY01hcDsKKyAgICAgICAgUmVzdWx0IGFkZEdsb2JhbChzdGQ6OnN0cmluZyBrZXksIHN0ZDo6c3RyaW5nIHZhbHVlLCBib29sIHVwZGF0aW5nKTsKKyAgICB9OworCisgICAgZW51bSBTZWN0aW9uIHsKKyAgICAgICAgU0VDVElPTl9UT1BMRVZFTCwKKyAgICAgICAgU0VDVElPTl9TRVRUSU5HUywKKyAgICAgICAgU0VDVElPTl9ERUNPREVSUywKKyAgICAgICAgU0VDVElPTl9ERUNPREVSLAorICAgICAgICBTRUNUSU9OX0RFQ09ERVJfVFlQRSwKKyAgICAgICAgU0VDVElPTl9FTkNPREVSUywKKyAgICAgICAgU0VDVElPTl9FTkNPREVSLAorICAgICAgICBTRUNUSU9OX0VOQ09ERVJfVFlQRSwKKyAgICAgICAgU0VDVElPTl9JTkNMVURFLAorICAgICAgICBTRUNUSU9OX1ZBUklBTlQsCisgICAgICAgIFNFQ1RJT05fVU5LTk9XTiwKKyAgICB9OworCisgICAgLy8gWE1MIHBhcnNpbmcgc3RhdGUKKyAgICBzdHJ1Y3QgU3RhdGUgeworICAgIHByaXZhdGU6CisgICAgICAgIERhdGEgKm1EYXRhOworCisgICAgICAgIC8vIGN1cnJlbnQgY29kZWMgYW5kL29yIHR5cGUsIHBsdXMgd2hldGhlciB3ZSBhcmUgdXBkYXRpbmcKKyAgICAgICAgc3RydWN0IENvZGVjQW5kVHlwZSB7CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBtTmFtZTsKKyAgICAgICAgICAgIENvZGVjTWFwOjppdGVyYXRvciBtQ29kZWM7CisgICAgICAgICAgICBUeXBlTWFwOjppdGVyYXRvciBtVHlwZTsKKyAgICAgICAgICAgIGJvb2wgbVVwZGF0aW5nOworICAgICAgICB9OworCisgICAgICAgIC8vIHVzaW5nIHZlY3RvcnMgYXMgd2UgbmVlZCB0byByZXNldCB0aGVpciBzaXplcworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbUluY2x1ZGVTdGFjazsKKyAgICAgICAgc3RkOjp2ZWN0b3I8U2VjdGlvbj4gbVNlY3Rpb25TdGFjazsKKyAgICAgICAgc3RkOjp2ZWN0b3I8U3RyaW5nU2V0PiBtVmFyaWFudHNTdGFjazsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Q29kZWNBbmRUeXBlPiBtQ3VycmVudDsKKworICAgIHB1YmxpYzoKKyAgICAgICAgU3RhdGUoRGF0YSAqZGF0YSk7CisKKyAgICAgICAgRGF0YSAmZGF0YSgpIHsgcmV0dXJuICptRGF0YTsgfQorCisgICAgICAgIC8vIHVzZWQgdG8gcmVzdG9yZSBwYXJzaW5nIHN0YXRlIGF0IFhNTCBpbmNsdWRlIGJvdW5kYXJpZXMsIGluIGNhc2UgcGFyc2luZyB0aGUgaW5jbHVkZWQKKyAgICAgICAgLy8gZmlsZSBmYWlscy4KKyAgICAgICAgc3RydWN0IFJlc3RvcmVQb2ludCB7CisgICAgICAgICAgICBzaXplX3QgbnVtSW5jbHVkZXM7CisgICAgICAgICAgICBzaXplX3QgbnVtU2VjdGlvbnM7CisgICAgICAgICAgICBzaXplX3QgbnVtVmFyaWFudFNldHM7CisgICAgICAgICAgICBzaXplX3QgbnVtQ29kZWNBbmRUeXBlczsKKyAgICAgICAgfTsKKworICAgICAgICAvLyBtZXRob2QgbWFuaXB1bGF0aW5nIHJlc3RvcmUgcG9pbnRzIChhbGwgc3RhdGUgc3RhY2tzKQorICAgICAgICBSZXN0b3JlUG9pbnQgY3JlYXRlUmVzdG9yZVBvaW50KCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIHsKKyAgICAgICAgICAgICAgICBtSW5jbHVkZVN0YWNrLnNpemUoKSwgbVNlY3Rpb25TdGFjay5zaXplKCksIG1WYXJpYW50c1N0YWNrLnNpemUoKSwgbUN1cnJlbnQuc2l6ZSgpCisgICAgICAgICAgICB9OworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZXN0b3JlKFJlc3RvcmVQb2ludCBycCkgeworICAgICAgICAgICAgQ0hFQ0tfR0UobUluY2x1ZGVTdGFjay5zaXplKCksIHJwLm51bUluY2x1ZGVzKTsKKyAgICAgICAgICAgIENIRUNLX0dFKG1TZWN0aW9uU3RhY2suc2l6ZSgpLCBycC5udW1TZWN0aW9ucyk7CisgICAgICAgICAgICBDSEVDS19HRShtVmFyaWFudHNTdGFjay5zaXplKCksIHJwLm51bVZhcmlhbnRTZXRzKTsKKyAgICAgICAgICAgIENIRUNLX0dFKG1DdXJyZW50LnNpemUoKSwgcnAubnVtQ29kZWNBbmRUeXBlcyk7CisKKyAgICAgICAgICAgIG1JbmNsdWRlU3RhY2sucmVzaXplKHJwLm51bUluY2x1ZGVzKTsKKyAgICAgICAgICAgIG1TZWN0aW9uU3RhY2sucmVzaXplKHJwLm51bVNlY3Rpb25zKTsKKyAgICAgICAgICAgIG1WYXJpYW50c1N0YWNrLnJlc2l6ZShycC5udW1WYXJpYW50U2V0cyk7CisgICAgICAgICAgICBtQ3VycmVudC5yZXNpemUocnAubnVtQ29kZWNBbmRUeXBlcyk7CisgICAgICAgIH0KKworICAgICAgICAvLyBtZXRob2RzIG1hbmlwdWxhdGluZyB0aGUgaW5jbHVkZSBzdGFjaworICAgICAgICBSZXN1bHQgZW50ZXJJbmNsdWRlKGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoKTsKKyAgICAgICAgdm9pZCBleGl0SW5jbHVkZSgpIHsKKyAgICAgICAgICAgIG1JbmNsdWRlU3RhY2sucG9wX2JhY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIG1ldGhvZHMgbWFuaXB1bGF0aW5nIHRoZSBjb2RlYy90eXBlIHN0YWNrL3N0YXRlCisgICAgICAgIGJvb2wgaW5Db2RlYygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiAhbUN1cnJlbnQuZW1wdHkoKSAmJiBtQ3VycmVudC5iYWNrKCkubUNvZGVjICE9IG1EYXRhLT5tQ29kZWNNYXAuZW5kKCk7CisgICAgICAgIH0KKworICAgICAgICBib29sIGluVHlwZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBpbkNvZGVjKCkKKyAgICAgICAgICAgICAgICAgICAgJiYgbUN1cnJlbnQuYmFjaygpLm1UeXBlICE9IG1DdXJyZW50LmJhY2soKS5tQ29kZWMtPnNlY29uZC50eXBlTWFwLmVuZCgpOworICAgICAgICB9CisKKyAgICAgICAgUmVzdWx0IGVudGVyTWVkaWFDb2RlYyhib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnR5cGUsIGJvb2wgdXBkYXRlKTsKKyAgICAgICAgUmVzdWx0IGVudGVyVHlwZShjb25zdCBjaGFyICpuYW1lLCBib29sIHVwZGF0ZSk7CisgICAgICAgIHZvaWQgZXhpdENvZGVjT3JUeXBlKCkgeworICAgICAgICAgICAgbUN1cnJlbnQucG9wX2JhY2soKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGNhbiBvbmx5IGJlIGNhbGxlZCB3aGVuIGluQ29kZWMoKQorICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Q29kZWNQcm9wZXJ0aWVzICZjb2RlYygpIHsKKyAgICAgICAgICAgIHJldHVybiBtQ3VycmVudC5iYWNrKCkubUNvZGVjLT5zZWNvbmQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gaW5Db2RlYygpCisgICAgICAgIHN0ZDo6c3RyaW5nIGNvZGVjTmFtZSgpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtQ3VycmVudC5iYWNrKCkubU5hbWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2FuIG9ubHkgYmUgY2FsbGVkIHdoZW4gaW5Db2RlYygpCisgICAgICAgIGJvb2wgdXBkYXRpbmcoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbUN1cnJlbnQuYmFjaygpLm1VcGRhdGluZzsKKyAgICAgICAgfQorICAgICAgICAvLyBjYW4gb25seSBiZSBjYWxsZWQgd2hlbiBpblR5cGUoKQorICAgICAgICBNZWRpYUNvZGVjc1htbFBhcnNlcjo6QXR0cmlidXRlTWFwICZ0eXBlKCkgeworICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50LmJhY2soKS5tVHlwZS0+c2Vjb25kOworICAgICAgICB9CisKKyAgICAgICAgLy8gbWV0aG9kcyBtYW5pcHVsYXRpbmcgdGhlIHNlY3Rpb24gc3RhY2sKKyAgICAgICAgU2VjdGlvbiBzZWN0aW9uKCkgY29uc3QgeworICAgICAgICAgICAgcmV0dXJuIG1TZWN0aW9uU3RhY2suYmFjaygpOworICAgICAgICB9CisgICAgICAgIFNlY3Rpb24gbGFzdE5vbkluY2x1ZGVTZWN0aW9uKCkgY29uc3Q7CisgICAgICAgIHZvaWQgZW50ZXJTZWN0aW9uKFNlY3Rpb24gcykgeworICAgICAgICAgICAgbVNlY3Rpb25TdGFjay5wdXNoX2JhY2socyk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBleGl0U2VjdGlvbigpIHsKKyAgICAgICAgICAgIG1TZWN0aW9uU3RhY2sucG9wX2JhY2soKTsKKyAgICAgICAgICAgIENIRUNLKCFtU2VjdGlvblN0YWNrLmVtcHR5KCkpOworICAgICAgICB9CisKKyAgICAgICAgLy8gbWV0aG9kcyBtYW5pcHVsYXRpbmcgdGhlIHZhcmlhbnRzIHN0YWNrCisgICAgICAgIFN0cmluZ1NldCB2YXJpYW50cygpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtVmFyaWFudHNTdGFjay5iYWNrKCk7CisgICAgICAgIH0KKyAgICAgICAgdm9pZCBlbnRlclZhcmlhbnRzKFN0cmluZ1NldCB2YXJpYW50cykgeworICAgICAgICAgICAgbVZhcmlhbnRzU3RhY2sucHVzaF9iYWNrKHZhcmlhbnRzKTsKKyAgICAgICAgfQorICAgICAgICB2b2lkIGV4aXRWYXJpYW50cygpIHsKKyAgICAgICAgICAgIG1WYXJpYW50c1N0YWNrLnBvcF9iYWNrKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyB1dGlsaXR5IG1ldGhvZHMKKworICAgICAgICAvLyB1cGRhdGVzIHJhbmssIGRvbWFpbnMsIHZhcmlhbnRzIGFuZCBlbmFibGVkbmVzcyBvbiB0aGUgY3VycmVudCBjb2RlYy90eXBlCisgICAgICAgIFJlc3VsdCB1cGRhdGVDb2RlYygKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpyYW5rLCBTdHJpbmdTZXQgZG9tYWlucywgU3RyaW5nU2V0IHZhcmlhbnRzLCBjb25zdCBjaGFyICplbmFibGVkKTsKKyAgICAgICAgLy8gYWRkcyBhIGtleS12YWx1ZSBhdHRyaWJ1dGUgZGV0YWlsIHRvIHRoZSBjdXJyZW50IHR5cGUgb2YgdGhlIGN1cnJlbnQgY29kZWMKKyAgICAgICAgdm9pZCBhZGREZXRhaWwoY29uc3Qgc3RkOjpzdHJpbmcgJmtleSwgY29uc3Qgc3RkOjpzdHJpbmcgJnZhbHVlKTsKKyAgICB9OworCisgICAgLyoqIFhNTCBQYXJzZXIgKHN0YXRlKSAqLworICAgIHN0cnVjdCBQYXJzZXIgeworICAgICAgICBTdGF0ZSAqbVN0YXRlOworCisgICAgICAgIFBhcnNlcihTdGF0ZSAqc3RhdGUsIHN0ZDo6c3RyaW5nIHBhdGgpOworCisgICAgICAgIC8vIGtlZXAgdHJhY2sgb2YgdGhlIHBhcnNlciBzdGF0ZQorICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8WE1MX1BhcnNlclN0cnVjdD4gbVBhcnNlcjsKKyAgICAgICAgc3RkOjpzdHJpbmcgbVBhdGg7CisgICAgICAgIHN0ZDo6c3RyaW5nIG1IcmVmQmFzZTsKKyAgICAgICAgc3RhdHVzX3QgbVN0YXR1czsKKworICAgICAgICB2b2lkIHBhcnNlWG1sRmlsZSgpOworCisgICAgICAgIC8vIFhNTCBwYXJzZXIgY2FsbGJhY2tzCisgICAgICAgIHN0YXRpYyB2b2lkIFN0YXJ0RWxlbWVudEhhbmRsZXJXcmFwcGVyKHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpOworICAgICAgICBzdGF0aWMgdm9pZCBFbmRFbGVtZW50SGFuZGxlcldyYXBwZXIodm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUpOworCisgICAgICAgIHZvaWQgc3RhcnRFbGVtZW50SGFuZGxlcihjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpOworICAgICAgICB2b2lkIGVuZEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUpOworCisgICAgICAgIHZvaWQgdXBkYXRlU3RhdHVzKHN0YXR1c190IHN0YXR1cyk7CisgICAgICAgIHZvaWQgbG9nQW55RXJyb3JzKGNvbnN0IFJlc3VsdCAmc3RhdHVzKSBjb25zdDsKKyAgICAgICAgc3RhdHVzX3QgZ2V0U3RhdHVzKCkgY29uc3QgeyByZXR1cm4gbVN0YXR1czsgfQorCisgICAgICAgIHN0YXR1c190IGFkZEFsaWFzKGNvbnN0IGNoYXIgKiphdHRycyk7CisgICAgICAgIHN0YXR1c190IGFkZEZlYXR1cmUoY29uc3QgY2hhciAqKmF0dHJzKTsKKyAgICAgICAgc3RhdHVzX3QgYWRkTGltaXQoY29uc3QgY2hhciAqKmF0dHJzKTsKKyAgICAgICAgc3RhdHVzX3QgYWRkUXVpcmsoY29uc3QgY2hhciAqKmF0dHJzLCBjb25zdCBjaGFyICpwcmVmaXggPSBudWxscHRyKTsKKyAgICAgICAgc3RhdHVzX3QgYWRkU2V0dGluZyhjb25zdCBjaGFyICoqYXR0cnMsIGNvbnN0IGNoYXIgKnByZWZpeCA9IG51bGxwdHIpOworICAgICAgICBzdGF0dXNfdCBlbnRlck1lZGlhQ29kZWMoY29uc3QgY2hhciAqKmF0dHJzLCBib29sIGVuY29kZXIpOworICAgICAgICBzdGF0dXNfdCBlbnRlclR5cGUoY29uc3QgY2hhciAqKmF0dHJzKTsKKyAgICAgICAgc3RhdHVzX3QgaW5jbHVkZVhtbEZpbGUoY29uc3QgY2hhciAqKmF0dHJzKTsKKyAgICAgICAgc3RhdHVzX3QgbGltaXRWYXJpYW50cyhjb25zdCBjaGFyICoqYXR0cnMpOworCisgICAgICAgIHN0YXR1c190IHVwZGF0ZU1lZGlhQ29kZWMoCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcmFuaywgY29uc3QgU3RyaW5nU2V0ICZkb21haW4sIGNvbnN0IFN0cmluZ1NldCAmdmFyaWFudHMsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZW5hYmxlZCk7CisgICAgfTsKKworICAgIHN0YXR1c190IHBhcnNlWG1sRmlsZXNJblNlYXJjaERpcnMoCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmZmlsZU5hbWVzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJnNlYXJjaERpcnMpOworCisgICAgc3RhdHVzX3QgcGFyc2VYbWxQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoKTsKKworICAgIC8vIENvbXB1dGVkIGxvbmdlc3QgY29tbW9uIHByZWZpeAorICAgIERhdGEgbURhdGE7CisgICAgU3RhdGUgbVN0YXRlOworCisgICAgLy8gUm9sZSBtYXAKKyAgICBtdXRhYmxlIHN0ZDo6c3RyaW5nIG1Db21tb25QcmVmaXg7CisgICAgbXV0YWJsZSBSb2xlTWFwIG1Sb2xlTWFwOworICAgIG11dGFibGUgc3RkOjptdXRleCBtTG9jazsKKworICAgIHN0YXR1c190IG1QYXJzaW5nU3RhdHVzOworCisgICAgSW1wbCgpCisgICAgICAgIDogbVN0YXRlKCZtRGF0YSksCisgICAgICAgICAgbVBhcnNpbmdTdGF0dXMoTk9fSU5JVCkgeworICAgIH0KKworICAgIHZvaWQgZ2VuZXJhdGVSb2xlTWFwKCkgY29uc3Q7CisgICAgdm9pZCBnZW5lcmF0ZUNvbW1vblByZWZpeCgpIGNvbnN0OworCisgICAgY29uc3QgQXR0cmlidXRlTWFwJiBnZXRTZXJ2aWNlQXR0cmlidXRlTWFwKCkgY29uc3QgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gZ3VhcmQobUxvY2spOworICAgICAgICByZXR1cm4gbURhdGEubVNlcnZpY2VBdHRyaWJ1dGVNYXA7CisgICAgfQorCisgICAgY29uc3QgQ29kZWNNYXAmIGdldENvZGVjTWFwKCkgY29uc3QgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gZ3VhcmQobUxvY2spOworICAgICAgICByZXR1cm4gbURhdGEubUNvZGVjTWFwOworICAgIH0KKworICAgIGNvbnN0IFJvbGVNYXAmIGdldFJvbGVNYXAoKSBjb25zdDsKKyAgICBjb25zdCBjaGFyKiBnZXRDb21tb25QcmVmaXgoKSBjb25zdDsKKworICAgIHN0YXR1c190IGdldFBhcnNpbmdTdGF0dXMoKSBjb25zdCB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBndWFyZChtTG9jayk7CisgICAgICAgIHJldHVybiBtUGFyc2luZ1N0YXR1czsKKyAgICB9Cit9OworCiBjb25zdGV4cHIgY2hhciBjb25zdCogTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmRlZmF1bHRQcm9maWxpbmdSZXN1bHRzWG1sUGF0aDsKIAotTWVkaWFDb2RlY3NYbWxQYXJzZXI6Ok1lZGlhQ29kZWNzWG1sUGFyc2VyKAotICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogc2VhcmNoRGlycywKLSAgICAgICAgY29uc3QgY2hhciogbWFpblhtbE5hbWUsCi0gICAgICAgIGNvbnN0IGNoYXIqIHBlcmZvcm1hbmNlWG1sTmFtZSwKLSAgICAgICAgY29uc3QgY2hhciogcHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpIDoKLSAgICBtUGFyc2luZ1N0YXR1cyhOT19JTklUKSwKLSAgICBtVXBkYXRlKGZhbHNlKSwKLSAgICBtQ29kZWNDb3VudGVyKDApIHsKLSAgICBzdGQ6OnN0cmluZyBwYXRoOwotICAgIGlmIChmaW5kRmlsZUluRGlycyhzZWFyY2hEaXJzLCBtYWluWG1sTmFtZSwgJnBhdGgpKSB7Ci0gICAgICAgIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKHBhdGguY19zdHIoKSwgZmFsc2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIEFMT0dFKCJDYW5ub3QgZmluZCAlcyIsIG1haW5YbWxOYW1lKTsKLSAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBOQU1FX05PVF9GT1VORDsKLSAgICB9Ci0gICAgaWYgKGZpbmRGaWxlSW5EaXJzKHNlYXJjaERpcnMsIHBlcmZvcm1hbmNlWG1sTmFtZSwgJnBhdGgpKSB7Ci0gICAgICAgIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKHBhdGguY19zdHIoKSwgdHJ1ZSk7Ci0gICAgfQotICAgIGlmIChwcm9maWxpbmdSZXN1bHRzWG1sUGF0aCAhPSBudWxscHRyKSB7Ci0gICAgICAgIHBhcnNlVG9wTGV2ZWxYTUxGaWxlKHByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoLCB0cnVlKTsKLSAgICB9CitNZWRpYUNvZGVjc1htbFBhcnNlcjo6TWVkaWFDb2RlY3NYbWxQYXJzZXIoKQorICAgIDogbUltcGwobmV3IEltcGwoKSkgewogfQogCi1ib29sIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpwYXJzZVRvcExldmVsWE1MRmlsZSgKLSAgICAgICAgY29uc3QgY2hhciAqY29kZWNzX3htbCwKLSAgICAgICAgYm9vbCBpZ25vcmVfZXJyb3JzKSB7Ci0gICAgLy8gZ2V0IGhyZWZfYmFzZQotICAgIGNvbnN0IGNoYXIgKmhyZWZfYmFzZV9lbmQgPSBzdHJyY2hyKGNvZGVjc194bWwsICcvJyk7Ci0gICAgaWYgKGhyZWZfYmFzZV9lbmQgIT0gbnVsbHB0cikgewotICAgICAgICBtSHJlZkJhc2UgPSBzdGQ6OnN0cmluZyhjb2RlY3NfeG1sLCBocmVmX2Jhc2VfZW5kIC0gY29kZWNzX3htbCArIDEpOwotICAgIH0KK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpwYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmZpbGVOYW1lcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZzZWFyY2hEaXJzKSB7CisgICAgcmV0dXJuIG1JbXBsLT5wYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKGZpbGVOYW1lcywgc2VhcmNoRGlycyk7Cit9CiAKLSAgICBtUGFyc2luZ1N0YXR1cyA9IE9LOyAvLyBrZWVwaW5nIHRoaXMgaGVyZSBmb3Igc2FmZXR5Ci0gICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9UT1BMRVZFTDsKK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpwYXJzZVhtbFBhdGgoY29uc3Qgc3RkOjpzdHJpbmcgJnBhdGgpIHsKKyAgICByZXR1cm4gbUltcGwtPnBhcnNlWG1sUGF0aChwYXRoKTsKK30KIAotICAgIHBhcnNlWE1MRmlsZShjb2RlY3NfeG1sKTsKLQotICAgIGlmIChtUGFyc2luZ1N0YXR1cyAhPSBPSykgewotICAgICAgICBBTE9HVygicGFyc2VUb3BMZXZlbFhNTEZpbGUoJXMpIGZhaWxlZCIsIGNvZGVjc194bWwpOwotICAgICAgICBpZiAoaWdub3JlX2Vycm9ycykgewotICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBPSzsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpwYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmZpbGVOYW1lcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZzZWFyY2hEaXJzKSB7CisgICAgc3RhdHVzX3QgcmVzID0gTk9fSU5JVDsKKyAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nIGZpbGVOYW1lIDogZmlsZU5hbWVzKSB7CisgICAgICAgIHN0YXR1c190IGVyciA9IE5PX0lOSVQ7CisgICAgICAgIHN0ZDo6c3RyaW5nIHBhdGg7CisgICAgICAgIGlmIChmaW5kRmlsZUluRGlycyhzZWFyY2hEaXJzLCBmaWxlTmFtZSwgJnBhdGgpKSB7CisgICAgICAgICAgICBlcnIgPSBwYXJzZVhtbFBhdGgocGF0aCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRCgiQ2Fubm90IGZpbmQgJXMiLCBwYXRoLmNfc3RyKCkpOwogICAgICAgICB9Ci0gICAgICAgIG1Db2RlY01hcC5jbGVhcigpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHJlcyA9IGNvbWJpbmVTdGF0dXMocmVzLCBlcnIpOwogICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6cGFyc2VYbWxQYXRoKGNvbnN0IHN0ZDo6c3RyaW5nICZwYXRoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGd1YXJkKG1Mb2NrKTsKKyAgICBpZiAoIWZpbGVFeGlzdHMocGF0aCkpIHsKKyAgICAgICAgQUxPR0QoIkNhbm5vdCBmaW5kICVzIiwgcGF0aC5jX3N0cigpKTsKKyAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBjb21iaW5lU3RhdHVzKG1QYXJzaW5nU3RhdHVzLCBOQU1FX05PVF9GT1VORCk7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICAvLyBzYXZlIHN0YXRlIChldmVuIHRob3VnaCB3ZSBzaG91bGQgYWx3YXlzIGJlIGF0IHRvcGxldmVsIGhlcmUpCisgICAgU3RhdGU6OlJlc3RvcmVQb2ludCBycCA9IG1TdGF0ZS5jcmVhdGVSZXN0b3JlUG9pbnQoKTsKKyAgICBQYXJzZXIgcGFyc2VyKCZtU3RhdGUsIHBhdGgpOworICAgIHBhcnNlci5wYXJzZVhtbEZpbGUoKTsKKyAgICBtU3RhdGUucmVzdG9yZShycCk7CisKKyAgICBpZiAocGFyc2VyLmdldFN0YXR1cygpICE9IE9LKSB7CisgICAgICAgIEFMT0dEKCJwYXJzZVhtbFBhdGgoJXMpIGZhaWxlZCB3aXRoICVzIiwgcGF0aC5jX3N0cigpLCBhc1N0cmluZyhwYXJzZXIuZ2V0U3RhdHVzKCkpKTsKKyAgICB9CisgICAgbVBhcnNpbmdTdGF0dXMgPSBjb21iaW5lU3RhdHVzKG1QYXJzaW5nU3RhdHVzLCBwYXJzZXIuZ2V0U3RhdHVzKCkpOworICAgIHJldHVybiBwYXJzZXIuZ2V0U3RhdHVzKCk7CiB9CiAKIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjp+TWVkaWFDb2RlY3NYbWxQYXJzZXIoKSB7CiB9CiAKLXZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OnBhcnNlWE1MRmlsZShjb25zdCBjaGFyICpwYXRoKSB7CitNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6U3RhdGU6OlN0YXRlKE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpEYXRhICpkYXRhKQorICAgIDogbURhdGEoZGF0YSkgeworICAgIG1TZWN0aW9uU3RhY2suZW1wbGFjZV9iYWNrKFNFQ1RJT05fVE9QTEVWRUwpOworfQorCitNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6U2VjdGlvbgorTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlN0YXRlOjpsYXN0Tm9uSW5jbHVkZVNlY3Rpb24oKSBjb25zdCB7CisgICAgZm9yIChhdXRvIGl0ID0gbVNlY3Rpb25TdGFjay5lbmQoKTsgaXQgIT0gbVNlY3Rpb25TdGFjay5iZWdpbigpOyAtLWl0KSB7CisgICAgICAgIGlmIChpdFstMV0gIT0gU0VDVElPTl9JTkNMVURFKSB7CisgICAgICAgICAgICByZXR1cm4gaXRbLTFdOworICAgICAgICB9CisgICAgfQorICAgIFRSRVNQQVNTKCJtdXN0IGhhdmUgbm9uLWluY2x1ZGUgc2VjdGlvbiIpOworfQorCit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpQYXJzZXI6OnVwZGF0ZVN0YXR1cyhzdGF0dXNfdCBzdGF0dXMpIHsKKyAgICBtU3RhdHVzID0gY29tYmluZVN0YXR1cyhtU3RhdHVzLCBzdGF0dXMpOworfQorCit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpQYXJzZXI6OmxvZ0FueUVycm9ycyhjb25zdCBSZXN1bHQgJnN0YXR1cykgY29uc3QgeworICAgIGlmIChzdGF0dXMpIHsKKyAgICAgICAgaWYgKHN0YXR1cy5lcnJvcigpLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIFBMT0dEKCJlcnJvciAlcyIsIGFzU3RyaW5nKChzdGF0dXNfdClzdGF0dXMpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFBMT0dEKCIlcyIsIHN0YXR1cy5lcnJvcigpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorfQorCitNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjpQYXJzZXIoU3RhdGUgKnN0YXRlLCBzdGQ6OnN0cmluZyBwYXRoKQorICAgIDogbVN0YXRlKHN0YXRlKSwKKyAgICAgIG1QYXRoKHBhdGgpLAorICAgICAgbVN0YXR1cyhOT19JTklUKSB7CisgICAgLy8gZGV0ZXJtaW5lIGhyZWZfYmFzZQorICAgIHN0ZDo6c3RyaW5nOjpzaXplX3R5cGUgZW5kID0gcGF0aC5yZmluZCgiLyIpOworICAgIGlmIChlbmQgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsKKyAgICAgICAgbUhyZWZCYXNlID0gcGF0aC5zdWJzdHIoMCwgZW5kICsgMSk7CisgICAgfQorfQorCit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpQYXJzZXI6OnBhcnNlWG1sRmlsZSgpIHsKKyAgICBjb25zdCBjaGFyICpwYXRoID0gbVBhdGguY19zdHIoKTsKKyAgICBBTE9HRCgicGFyc2luZyAlcy4uLiIsIHBhdGgpOwogICAgIEZJTEUgKmZpbGUgPSBmb3BlbihwYXRoLCAiciIpOwogCiAgICAgaWYgKGZpbGUgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HVygidW5hYmxlIHRvIG9wZW4gbWVkaWEgY29kZWNzIGNvbmZpZ3VyYXRpb24geG1sIGZpbGU6ICVzIiwgcGF0aCk7Ci0gICAgICAgIG1QYXJzaW5nU3RhdHVzID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgIEFMT0dEKCJ1bmFibGUgdG8gb3BlbiBtZWRpYSBjb2RlY3MgY29uZmlndXJhdGlvbiB4bWwgZmlsZTogJXMiLCBwYXRoKTsKKyAgICAgICAgbVN0YXR1cyA9IE5BTUVfTk9UX0ZPVU5EOwogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgWE1MX1BhcnNlciBwYXJzZXIgPSA6OlhNTF9QYXJzZXJDcmVhdGUobnVsbHB0cik7Ci0gICAgTE9HX0ZBVEFMX0lGKHBhcnNlciA9PSBudWxscHRyLCAiWE1MX01lZGlhQ29kZWNzWG1sUGFyc2VyQ3JlYXRlKCkgZmFpbGVkLiIpOworICAgIG1QYXJzZXIgPSBzdGQ6OnNoYXJlZF9wdHI8WE1MX1BhcnNlclN0cnVjdD4oCisgICAgICAgIDo6WE1MX1BhcnNlckNyZWF0ZShudWxscHRyKSwKKyAgICAgICAgW10oWE1MX1BhcnNlclN0cnVjdCAqcGFyc2VyKSB7IDo6WE1MX1BhcnNlckZyZWUocGFyc2VyKTsgfSk7CisgICAgTE9HX0ZBVEFMX0lGKCFtUGFyc2VyLCAiWE1MX01lZGlhQ29kZWNzWG1sUGFyc2VyQ3JlYXRlKCkgZmFpbGVkLiIpOwogCi0gICAgOjpYTUxfU2V0VXNlckRhdGEocGFyc2VyLCB0aGlzKTsKLSAgICA6OlhNTF9TZXRFbGVtZW50SGFuZGxlcigKLSAgICAgICAgICAgIHBhcnNlciwgU3RhcnRFbGVtZW50SGFuZGxlcldyYXBwZXIsIEVuZEVsZW1lbnRIYW5kbGVyV3JhcHBlcik7CisgICAgOjpYTUxfU2V0VXNlckRhdGEobVBhcnNlci5nZXQoKSwgdGhpcyk7CisgICAgOjpYTUxfU2V0RWxlbWVudEhhbmRsZXIobVBhcnNlci5nZXQoKSwgU3RhcnRFbGVtZW50SGFuZGxlcldyYXBwZXIsIEVuZEVsZW1lbnRIYW5kbGVyV3JhcHBlcik7CiAKICAgICBzdGF0aWMgY29uc3RleHByIGludCBCVUZGX1NJWkUgPSA1MTI7Ci0gICAgd2hpbGUgKG1QYXJzaW5nU3RhdHVzID09IE9LKSB7Ci0gICAgICAgIHZvaWQgKmJ1ZmYgPSA6OlhNTF9HZXRCdWZmZXIocGFyc2VyLCBCVUZGX1NJWkUpOworICAgIC8vIHVwZGF0ZVN0YXR1cyhPSyk7CisgICAgaWYgKG1TdGF0dXMgPT0gTk9fSU5JVCkgeworICAgICAgICBtU3RhdHVzID0gT0s7CisgICAgfQorICAgIHdoaWxlIChtU3RhdHVzID09IE9LKSB7CisgICAgICAgIHZvaWQgKmJ1ZmYgPSA6OlhNTF9HZXRCdWZmZXIobVBhcnNlci5nZXQoKSwgQlVGRl9TSVpFKTsKICAgICAgICAgaWYgKGJ1ZmYgPT0gbnVsbHB0cikgewotICAgICAgICAgICAgQUxPR0UoImZhaWxlZCBpbiBjYWxsIHRvIFhNTF9HZXRCdWZmZXIoKSIpOwotICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgQUxPR0QoImZhaWxlZCBpbiBjYWxsIHRvIFhNTF9HZXRCdWZmZXIoKSIpOworICAgICAgICAgICAgbVN0YXR1cyA9IFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGludCBieXRlc19yZWFkID0gOjpmcmVhZChidWZmLCAxLCBCVUZGX1NJWkUsIGZpbGUpOwogICAgICAgICBpZiAoYnl0ZXNfcmVhZCA8IDApIHsKLSAgICAgICAgICAgIEFMT0dFKCJmYWlsZWQgaW4gY2FsbCB0byByZWFkIik7Ci0gICAgICAgICAgICBtUGFyc2luZ1N0YXR1cyA9IEVSUk9SX0lPOworICAgICAgICAgICAgQUxPR0QoImZhaWxlZCBpbiBjYWxsIHRvIHJlYWQiKTsKKyAgICAgICAgICAgIG1TdGF0dXMgPSBFUlJPUl9JTzsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgWE1MX1N0YXR1cyBzdGF0dXMgPSA6OlhNTF9QYXJzZUJ1ZmZlcihwYXJzZXIsIGJ5dGVzX3JlYWQsIGJ5dGVzX3JlYWQgPT0gMCk7CisgICAgICAgIFhNTF9TdGF0dXMgc3RhdHVzID0gOjpYTUxfUGFyc2VCdWZmZXIobVBhcnNlci5nZXQoKSwgYnl0ZXNfcmVhZCwgYnl0ZXNfcmVhZCA9PSAwKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBYTUxfU1RBVFVTX09LKSB7Ci0gICAgICAgICAgICBBTE9HRSgibWFsZm9ybWVkICglcykiLCA6OlhNTF9FcnJvclN0cmluZyg6OlhNTF9HZXRFcnJvckNvZGUocGFyc2VyKSkpOwotICAgICAgICAgICAgbVBhcnNpbmdTdGF0dXMgPSBFUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICBQTE9HRCgibWFsZm9ybWVkICglcykiLCA6OlhNTF9FcnJvclN0cmluZyg6OlhNTF9HZXRFcnJvckNvZGUobVBhcnNlci5nZXQoKSkpKTsKKyAgICAgICAgICAgIG1TdGF0dXMgPSBFUlJPUl9NQUxGT1JNRUQ7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCkBAIC0yMDksMzkgKzU1MCw0NyBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgOjpYTUxfUGFyc2VyRnJlZShwYXJzZXIpOworICAgIG1QYXJzZXIucmVzZXQoKTsKIAogICAgIGZjbG9zZShmaWxlKTsKICAgICBmaWxlID0gbnVsbHB0cjsKIH0KIAogLy8gc3RhdGljCi12b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpTdGFydEVsZW1lbnRIYW5kbGVyV3JhcHBlcigKK3ZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcjo6U3RhcnRFbGVtZW50SGFuZGxlcldyYXBwZXIoCiAgICAgICAgIHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpIHsKLSAgICBzdGF0aWNfY2FzdDxNZWRpYUNvZGVjc1htbFBhcnNlcio+KG1lKS0+c3RhcnRFbGVtZW50SGFuZGxlcihuYW1lLCBhdHRycyk7CisgICAgc3RhdGljX2Nhc3Q8TWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcio+KG1lKS0+c3RhcnRFbGVtZW50SGFuZGxlcihuYW1lLCBhdHRycyk7CiB9CiAKIC8vIHN0YXRpYwotdm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6RW5kRWxlbWVudEhhbmRsZXJXcmFwcGVyKHZvaWQgKm1lLCBjb25zdCBjaGFyICpuYW1lKSB7Ci0gICAgc3RhdGljX2Nhc3Q8TWVkaWFDb2RlY3NYbWxQYXJzZXIqPihtZSktPmVuZEVsZW1lbnRIYW5kbGVyKG5hbWUpOwordm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjpFbmRFbGVtZW50SGFuZGxlcldyYXBwZXIodm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICBzdGF0aWNfY2FzdDxNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyKj4obWUpLT5lbmRFbGVtZW50SGFuZGxlcihuYW1lKTsKIH0KIAotc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmluY2x1ZGVYTUxGaWxlKGNvbnN0IGNoYXIgKiphdHRycykgeworc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcjo6aW5jbHVkZVhtbEZpbGUoY29uc3QgY2hhciAqKmF0dHJzKSB7CiAgICAgY29uc3QgY2hhciAqaHJlZiA9IG51bGxwdHI7CiAgICAgc2l6ZV90IGkgPSAwOwogICAgIHdoaWxlIChhdHRyc1tpXSAhPSBudWxscHRyKSB7Ci0gICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgImhyZWYiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBocmVmID0gYXR0cnNbaV07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiaW5jbHVkZVhNTEZpbGU6IHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOworICAgICAgICBDSEVDSygoaSAmIDEpID09IDApOworICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIFBMT0dEKCJJbmNsdWRlOiBhdHRyaWJ1dGUgJyVzJyBpcyBudWxsIiwgYXR0cnNbaV0pOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgImhyZWYiKSkgeworICAgICAgICAgICAgaHJlZiA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQTE9HRCgiSW5jbHVkZTogaWdub3JpbmcgdW5yZWNvZ25pemVkIGF0dHJpYnV0ZSAnJXMnIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgKytpOworICAgICAgICB9CiAgICAgICAgICsraTsKICAgICB9CiAKKyAgICBpZiAoaHJlZiA9PSBudWxscHRyKSB7CisgICAgICAgIFBMT0dEKCJJbmNsdWRlIHdpdGggbm8gJ2hyZWYnIGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIC8vIEZvciBzZWN1cml0eSByZWFzb25zIGFuZCBmb3Igc2ltcGxpY2l0eSwgZmlsZSBuYW1lcyBjYW4gb25seSBjb250YWluCiAgICAgLy8gW2EtekEtWjAtOV8uXSBhbmQgbXVzdCBzdGFydCB3aXRoICBtZWRpYV9jb2RlY3NfIGFuZCBlbmQgd2l0aCAueG1sCiAgICAgZm9yIChpID0gMDsgaHJlZltpXSAhPSAnXDAnOyBpKyspIHsKQEAgLTI1MSw3NCArNjAwLDExNCBAQAogICAgICAgICAgICAgICAgIChocmVmW2ldID49ICdhJyAmJiBocmVmW2ldIDw9ICd6JykpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIEFMT0dFKCJpbnZhbGlkIGluY2x1ZGUgZmlsZSBuYW1lOiAlcyIsIGhyZWYpOworICAgICAgICBQTE9HRCgiaW52YWxpZCBpbmNsdWRlIGZpbGUgbmFtZTogJXMiLCBocmVmKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKICAgICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IGhyZWY7CiAgICAgaWYgKGZpbGVuYW1lLmNvbXBhcmUoMCwgMTMsICJtZWRpYV9jb2RlY3NfIikgIT0gMCB8fAogICAgICAgICAgICAgZmlsZW5hbWUuY29tcGFyZShmaWxlbmFtZS5zaXplKCkgLSA0LCA0LCAiLnhtbCIpICE9IDApIHsKLSAgICAgICAgQUxPR0UoImludmFsaWQgaW5jbHVkZSBmaWxlIG5hbWU6ICVzIiwgaHJlZik7CisgICAgICAgIFBMT0dEKCJpbnZhbGlkIGluY2x1ZGUgZmlsZSBuYW1lOiAlcyIsIGhyZWYpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBmaWxlbmFtZS5pbnNlcnQoMCwgbUhyZWZCYXNlKTsKIAotICAgIHN0YXR1c190IG9sZFBhcnNpbmdTdGF0dXMgPSBtUGFyc2luZ1N0YXR1czsKKyAgICBSZXN1bHQgcmVzID0gbVN0YXRlLT5lbnRlckluY2x1ZGUoZmlsZW5hbWUpOworICAgIGlmIChyZXMpIHsKKyAgICAgICAgbG9nQW55RXJyb3JzKHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQogCi0gICAgcGFyc2VYTUxGaWxlKGZpbGVuYW1lLmNfc3RyKCkpOwotCi0gICAgc3RhdHVzX3QgbmV3UGFyc2luZ1N0YXR1cyA9IG1QYXJzaW5nU3RhdHVzOwotICAgIG1QYXJzaW5nU3RhdHVzID0gb2xkUGFyc2luZ1N0YXR1czsKLSAgICByZXR1cm4gbmV3UGFyc2luZ1N0YXR1czsKKyAgICAvLyBzYXZlIHN0YXRlIHNvIHRoYXQgd2UgY2FuIHJlc3VtZSBldmVuIGlmIFhNTCBwYXJzaW5nIG9mIHRoZSBpbmNsdWRlZCBmaWxlIGZhaWxlZCBtaWR3YXkKKyAgICBTdGF0ZTo6UmVzdG9yZVBvaW50IHJwID0gbVN0YXRlLT5jcmVhdGVSZXN0b3JlUG9pbnQoKTsKKyAgICBQYXJzZXIgcGFyc2VyKG1TdGF0ZSwgZmlsZW5hbWUpOworICAgIHBhcnNlci5wYXJzZVhtbEZpbGUoKTsKKyAgICBtU3RhdGUtPnJlc3RvcmUocnApOworICAgIG1TdGF0ZS0+ZXhpdEluY2x1ZGUoKTsKKyAgICByZXR1cm4gcGFyc2VyLmdldFN0YXR1cygpOwogfQogCi12b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpzdGFydEVsZW1lbnRIYW5kbGVyKAorTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlJlc3VsdAorTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlN0YXRlOjplbnRlckluY2x1ZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmZpbGVOYW1lKSB7CisgICAgaWYgKHN0ZDo6ZmluZChtSW5jbHVkZVN0YWNrLmJlZ2luKCksIG1JbmNsdWRlU3RhY2suZW5kKCksIGZpbGVOYW1lKQorICAgICAgICAgICAgIT0gbUluY2x1ZGVTdGFjay5lbmQoKSkgeworICAgICAgICByZXR1cm4geyBCQURfVkFMVUUsICJyZWN1cnNpdmUgaW5jbHVkZSBjaGFpbiIgfTsKKyAgICB9CisgICAgbUluY2x1ZGVTdGFjay5lbXBsYWNlX2JhY2soZmlsZU5hbWUpOworICAgIHJldHVybiBPSzsKK30KKwordm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjpzdGFydEVsZW1lbnRIYW5kbGVyKAogICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqYXR0cnMpIHsKICAgICBib29sIGluVHlwZSA9IHRydWU7CisgICAgUmVzdWx0IGVyciA9IE5PX0lOSVQ7CiAKKyAgICBTZWN0aW9uIHNlY3Rpb24gPSBtU3RhdGUtPnNlY3Rpb24oKTsKKworICAgIC8vIGhhbmRsZSBpbmNsdWRlIGF0IGFueSBsZXZlbAogICAgIGlmIChzdHJFcShuYW1lLCAiSW5jbHVkZSIpKSB7Ci0gICAgICAgIGlmIChpbmNsdWRlWE1MRmlsZShhdHRycykgPT0gT0spIHsKLSAgICAgICAgICAgIG1TZWN0aW9uU3RhY2sucHVzaF9iYWNrKG1DdXJyZW50U2VjdGlvbik7Ci0gICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPSBTRUNUSU9OX0lOQ0xVREU7Ci0gICAgICAgIH0KKyAgICAgICAgbVN0YXRlLT5lbnRlclNlY3Rpb24oU0VDVElPTl9JTkNMVURFKTsKKyAgICAgICAgdXBkYXRlU3RhdHVzKGluY2x1ZGVYbWxGaWxlKGF0dHJzKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBzd2l0Y2ggKG1DdXJyZW50U2VjdGlvbikgeworICAgIC8vIGhhbmRsZSBpbmNsdWRlIHNlY3Rpb24gKHRvcCBsZXZlbCkKKyAgICBpZiAoc2VjdGlvbiA9PSBTRUNUSU9OX0lOQ0xVREUpIHsKKyAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJJbmNsdWRlZCIpKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgLy8gaW1pdGF0ZSBwcmlvciBsZXZlbAorICAgICAgICBzZWN0aW9uID0gbVN0YXRlLT5sYXN0Tm9uSW5jbHVkZVNlY3Rpb24oKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHNlY3Rpb24pIHsKICAgICAgICAgY2FzZSBTRUNUSU9OX1RPUExFVkVMOgogICAgICAgICB7CisgICAgICAgICAgICBTZWN0aW9uIG5leHRTZWN0aW9uOwogICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJEZWNvZGVycyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9ERUNPREVSUzsKKyAgICAgICAgICAgICAgICBuZXh0U2VjdGlvbiA9IFNFQ1RJT05fREVDT0RFUlM7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJFbmNvZGVycyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9FTkNPREVSUzsKKyAgICAgICAgICAgICAgICBuZXh0U2VjdGlvbiA9IFNFQ1RJT05fRU5DT0RFUlM7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJTZXR0aW5ncyIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9TRVRUSU5HUzsKKyAgICAgICAgICAgICAgICBuZXh0U2VjdGlvbiA9IFNFQ1RJT05fU0VUVElOR1M7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJNZWRpYUNvZGVjcyIpIHx8IHN0ckVxKG5hbWUsICJJbmNsdWRlZCIpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgbVN0YXRlLT5lbnRlclNlY3Rpb24obmV4dFNlY3Rpb24pOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBTRUNUSU9OX1NFVFRJTkdTOgogICAgICAgICB7CiAgICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIlNldHRpbmciKSkgewotICAgICAgICAgICAgICAgICh2b2lkKWFkZFNldHRpbmdGcm9tQXR0cmlidXRlcyhhdHRycyk7CisgICAgICAgICAgICAgICAgZXJyID0gYWRkU2V0dGluZyhhdHRycyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJWYXJpYW50IikpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBhZGRTZXR0aW5nKGF0dHJzLCAidmFyaWFudC0iKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIkRvbWFpbiIpKSB7CisgICAgICAgICAgICAgICAgZXJyID0gYWRkU2V0dGluZyhhdHRycywgImRvbWFpbi0iKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhlcnIpOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVJTOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIk1lZGlhQ29kZWMiKSkgewotICAgICAgICAgICAgICAgICh2b2lkKWFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlcyhmYWxzZSAvKiBlbmNvZGVyICovLCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTZWN0aW9uID0gU0VDVElPTl9ERUNPREVSOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQogICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUlM6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiTWVkaWFDb2RlYyIpKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzKHRydWUgLyogZW5jb2RlciAqLywgYXR0cnMpOwotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fRU5DT0RFUjsKKyAgICAgICAgICAgICAgICBlcnIgPSBlbnRlck1lZGlhQ29kZWMoYXR0cnMsIHNlY3Rpb24gPT0gU0VDVElPTl9FTkNPREVSUyk7CisgICAgICAgICAgICAgICAgdXBkYXRlU3RhdHVzKGVycik7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBPSykgeyAvLyBza2lwIHRoaXMgZWxlbWVudCBvbiBlcnJvcgorICAgICAgICAgICAgICAgICAgICBtU3RhdGUtPmVudGVyU2VjdGlvbihTRUNUSU9OX1VOS05PV04pOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZS0+ZW50ZXJWYXJpYW50cyhtU3RhdGUtPmNvZGVjKCkudmFyaWFudFNldCk7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZS0+ZW50ZXJTZWN0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY3Rpb24gPT0gU0VDVElPTl9ERUNPREVSUyA/IFNFQ1RJT05fREVDT0RFUiA6IFNFQ1RJT05fRU5DT0RFUik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0zMjcsMTMgKzcxNiwyMCBAQAogICAgICAgICBjYXNlIFNFQ1RJT05fRU5DT0RFUjoKICAgICAgICAgewogICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJRdWlyayIpKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpYWRkUXVpcmsoYXR0cnMpOworICAgICAgICAgICAgICAgIGVyciA9IGFkZFF1aXJrKGF0dHJzLCAicXVpcms6OiIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiQXR0cmlidXRlIikpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBhZGRRdWlyayhhdHRycywgImF0dHJpYnV0ZTo6Iik7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJBbGlhcyIpKSB7CisgICAgICAgICAgICAgICAgZXJyID0gYWRkQWxpYXMoYXR0cnMpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiVHlwZSIpKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpYWRkVHlwZUZyb21BdHRyaWJ1dGVzKGF0dHJzLAotICAgICAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0VOQ09ERVIpKTsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0RFQ09ERVIgPwotICAgICAgICAgICAgICAgICAgICAgICAgU0VDVElPTl9ERUNPREVSX1RZUEUgOiBTRUNUSU9OX0VOQ09ERVJfVFlQRSk7CisgICAgICAgICAgICAgICAgZXJyID0gZW50ZXJUeXBlKGF0dHJzKTsKKyAgICAgICAgICAgICAgICBpZiAoZXJyICE9IE9LKSB7IC8vIHNraXAgdGhpcyBlbGVtZW50IG9uIGVycm9yCisgICAgICAgICAgICAgICAgICAgIG1TdGF0ZS0+ZW50ZXJTZWN0aW9uKFNFQ1RJT05fVU5LTk9XTik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRlLT5lbnRlclNlY3Rpb24oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiA9PSBTRUNUSU9OX0RFQ09ERVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gU0VDVElPTl9ERUNPREVSX1RZUEUgOiBTRUNUSU9OX0VOQ09ERVJfVFlQRSk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIGluVHlwZSA9IGZhbHNlOwpAQCAtMzQxLDg5ICs3MzcsMTAyIEBACiAKICAgICAgICAgY2FzZSBTRUNUSU9OX0RFQ09ERVJfVFlQRToKICAgICAgICAgY2FzZSBTRUNUSU9OX0VOQ09ERVJfVFlQRToKKyAgICAgICAgY2FzZSBTRUNUSU9OX1ZBUklBTlQ6CiAgICAgICAgIHsKICAgICAgICAgICAgIC8vIGlnbm9yZSBsaW1pdHMgYW5kIGZlYXR1cmVzIHNwZWNpZmllZCBvdXRzaWRlIG9mIHR5cGUKLSAgICAgICAgICAgIGJvb2wgb3V0c2lkZSA9ICFpblR5cGUgJiYKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUeXBlID09IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmVuZCgpOwotICAgICAgICAgICAgaWYgKG91dHNpZGUgJiYKLSAgICAgICAgICAgICAgICAgICAgKHN0ckVxKG5hbWUsICJMaW1pdCIpIHx8IHN0ckVxKG5hbWUsICJGZWF0dXJlIikpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImlnbm9yaW5nICVzIHNwZWNpZmllZCBvdXRzaWRlIG9mIGEgVHlwZSIsIG5hbWUpOworICAgICAgICAgICAgaWYgKCFtU3RhdGUtPmluVHlwZSgpCisgICAgICAgICAgICAgICAgICAgICYmIChzdHJFcShuYW1lLCAiTGltaXQiKSB8fCBzdHJFcShuYW1lLCAiRmVhdHVyZSIpIHx8IHN0ckVxKG5hbWUsICJWYXJpYW50IikpKSB7CisgICAgICAgICAgICAgICAgUExPR0QoImlnbm9yaW5nICVzIHNwZWNpZmllZCBvdXRzaWRlIG9mIGEgVHlwZSIsIG5hbWUpOworICAgICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEobmFtZSwgIkxpbWl0IikpIHsKLSAgICAgICAgICAgICAgICAodm9pZClhZGRMaW1pdChhdHRycyk7CisgICAgICAgICAgICAgICAgZXJyID0gYWRkTGltaXQoYXR0cnMpOwogICAgICAgICAgICAgfSBlbHNlIGlmIChzdHJFcShuYW1lLCAiRmVhdHVyZSIpKSB7Ci0gICAgICAgICAgICAgICAgKHZvaWQpYWRkRmVhdHVyZShhdHRycyk7CisgICAgICAgICAgICAgICAgZXJyID0gYWRkRmVhdHVyZShhdHRycyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKG5hbWUsICJWYXJpYW50IikgJiYgc2VjdGlvbiAhPSBTRUNUSU9OX1ZBUklBTlQpIHsKKyAgICAgICAgICAgICAgICBlcnIgPSBsaW1pdFZhcmlhbnRzKGF0dHJzKTsKKyAgICAgICAgICAgICAgICBtU3RhdGUtPmVudGVyU2VjdGlvbihlcnIgPT0gT0sgPyBTRUNUSU9OX1ZBUklBTlQgOiBTRUNUSU9OX1VOS05PV04pOworICAgICAgICAgICAgfSBlbHNlIGlmIChpblR5cGUKKyAgICAgICAgICAgICAgICAgICAgJiYgKHN0ckVxKG5hbWUsICJBbGlhcyIpIHx8IHN0ckVxKG5hbWUsICJBdHRyaWJ1dGUiKSB8fCBzdHJFcShuYW1lLCAiUXVpcmsiKSkpIHsKKyAgICAgICAgICAgICAgICBQTE9HRCgiaWdub3JpbmcgJXMgc3BlY2lmaWVkIG5vdCBkaXJlY3RseSBpbiBhIE1lZGlhQ29kZWMiLCBuYW1lKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgaWYgKGVyciA9PSBOT19JTklUKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIHVwZGF0ZVN0YXR1cyhlcnIpOworICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KIAorICAgIGlmIChzZWN0aW9uICE9IFNFQ1RJT05fVU5LTk9XTikgeworICAgICAgICBQTE9HRCgiSWdub3JpbmcgdW5yZWNvZ25pemVkIHRhZyA8JXM+IiwgbmFtZSk7CisgICAgfQorICAgIG1TdGF0ZS0+ZW50ZXJTZWN0aW9uKFNFQ1RJT05fVU5LTk9XTik7CiB9CiAKLXZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmVuZEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgICBzd2l0Y2ggKG1DdXJyZW50U2VjdGlvbikgewordm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjplbmRFbGVtZW50SGFuZGxlcihjb25zdCBjaGFyICpuYW1lKSB7CisgICAgLy8gWE1MUGFyc2VyIGhhbmRsZXMgdGFnIG1hdGNoaW5nLCBzbyB3ZSByZWFsbHkganVzdCBuZWVkIHRvIGhhbmRsZSB0aGUgc2VjdGlvbiBzdGF0ZSBoZXJlCisgICAgU2VjdGlvbiBzZWN0aW9uID0gbVN0YXRlLT5zZWN0aW9uKCk7CisgICAgc3dpdGNoIChzZWN0aW9uKSB7CisgICAgICAgIGNhc2UgU0VDVElPTl9JTkNMVURFOgorICAgICAgICB7CisgICAgICAgICAgICAvLyB0aGlzIGNvdWxkIGFsc28gYmUgYW55IG9mOiBJbmNsdWRlZCwgTWVkaWFDb2RlY3MKKyAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiSW5jbHVkZSIpKSB7CisgICAgICAgICAgICAgICAgbVN0YXRlLT5leGl0U2VjdGlvbigpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKICAgICAgICAgY2FzZSBTRUNUSU9OX1NFVFRJTkdTOgogICAgICAgICB7CisgICAgICAgICAgICAvLyB0aGlzIGNvdWxkIGFsc28gYmUgYW55IG9mOiBEb21haW4sIFZhcmlhbnQsIFNldHRpbmcKICAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiU2V0dGluZ3MiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7CisgICAgICAgICAgICAgICAgbVN0YXRlLT5leGl0U2VjdGlvbigpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KIAogICAgICAgICBjYXNlIFNFQ1RJT05fREVDT0RFUlM6Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiRGVjb2RlcnMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCiAgICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSUzoKKyAgICAgICAgY2FzZSBTRUNUSU9OX1VOS05PV046CiAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiRW5jb2RlcnMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fVE9QTEVWRUw7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBtU3RhdGUtPmV4aXRTZWN0aW9uKCk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSX1RZUEU6CiAgICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSX1RZUEU6CiAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIHRoaXMgY291bGQgYWxzbyBiZSBhbnkgb2Y6IEFsaWFzLCBMaW1pdCwgRmVhdHVyZQogICAgICAgICAgICAgaWYgKHN0ckVxKG5hbWUsICJUeXBlIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFNlY3Rpb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgKG1DdXJyZW50U2VjdGlvbiA9PSBTRUNUSU9OX0RFQ09ERVJfVFlQRSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBTRUNUSU9OX0RFQ09ERVIgOiBTRUNUSU9OX0VOQ09ERVIpOwotCi0gICAgICAgICAgICAgICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCk7CisgICAgICAgICAgICAgICAgbVN0YXRlLT5leGl0U2VjdGlvbigpOworICAgICAgICAgICAgICAgIG1TdGF0ZS0+ZXhpdENvZGVjT3JUeXBlKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogCiAgICAgICAgIGNhc2UgU0VDVElPTl9ERUNPREVSOgotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIk1lZGlhQ29kZWMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fREVDT0RFUlM7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnROYW1lLmNsZWFyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCiAgICAgICAgIGNhc2UgU0VDVElPTl9FTkNPREVSOgogICAgICAgICB7CisgICAgICAgICAgICAvLyB0aGlzIGNvdWxkIGFsc28gYmUgYW55IG9mOiBBbGlhcywgTGltaXQsIFF1aXJrLCBWYXJpYW50CiAgICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIk1lZGlhQ29kZWMiKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IFNFQ1RJT05fRU5DT0RFUlM7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnROYW1lLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgbVN0YXRlLT5leGl0U2VjdGlvbigpOworICAgICAgICAgICAgICAgIG1TdGF0ZS0+ZXhpdENvZGVjT3JUeXBlKCk7CisgICAgICAgICAgICAgICAgbVN0YXRlLT5leGl0VmFyaWFudHMoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKLSAgICAgICAgY2FzZSBTRUNUSU9OX0lOQ0xVREU6CisgICAgICAgIGNhc2UgU0VDVElPTl9WQVJJQU5UOgogICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc3RyRXEobmFtZSwgIkluY2x1ZGUiKSAmJiAobVNlY3Rpb25TdGFjay5zaXplKCkgPiAwKSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50U2VjdGlvbiA9IG1TZWN0aW9uU3RhY2suYmFjaygpOwotICAgICAgICAgICAgICAgIG1TZWN0aW9uU3RhY2sucG9wX2JhY2soKTsKKyAgICAgICAgICAgIC8vIHRoaXMgY291bGQgYWxzbyBiZSBhbnkgb2Y6IEFsaWFzLCBMaW1pdCwgUXVpcmsKKyAgICAgICAgICAgIGlmIChzdHJFcShuYW1lLCAiVmFyaWFudCIpKSB7CisgICAgICAgICAgICAgICAgbVN0YXRlLT5leGl0U2VjdGlvbigpOworICAgICAgICAgICAgICAgIG1TdGF0ZS0+ZXhpdFZhcmlhbnRzKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KQEAgLTQzMSwyNDMgKzg0MCwzMDIgQEAKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwogICAgIH0KLQogfQogCi1zdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBudWxscHRyOwotICAgIGNvbnN0IGNoYXIgKnZhbHVlID0gbnVsbHB0cjsKLSAgICBjb25zdCBjaGFyICp1cGRhdGUgPSBudWxscHRyOworc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcjo6YWRkU2V0dGluZyhjb25zdCBjaGFyICoqYXR0cnMsIGNvbnN0IGNoYXIgKnByZWZpeCkgeworICAgIGNvbnN0IGNoYXIgKmFfbmFtZSA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciAqYV92YWx1ZSA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciAqYV91cGRhdGUgPSBudWxscHRyOworICAgIGJvb2wgaXNCb29sZWFuID0gZmFsc2U7CiAKICAgICBzaXplX3QgaSA9IDA7CiAgICAgd2hpbGUgKGF0dHJzW2ldICE9IG51bGxwdHIpIHsKLSAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogbmFtZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpXTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInZhbHVlIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzOiB2YWx1ZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbHVlID0gYXR0cnNbaV07Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ1cGRhdGUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IHVwZGF0ZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2ldOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImFkZFNldHRpbmdGcm9tQXR0cmlidXRlczogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7CisgICAgICAgIENIRUNLKChpICYgMSkgPT0gMCk7CisgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgUExPR0QoIlNldHRpbmc6IGF0dHJpYnV0ZSAnJXMnIGlzIG51bGwiLCBhdHRyc1tpXSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7CisgICAgICAgICAgICBhX25hbWUgPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidmFsdWUiKSB8fCBzdHJFcShhdHRyc1tpXSwgImVuYWJsZWQiKSkgeworICAgICAgICAgICAgaWYgKGFfdmFsdWUpIHsKKyAgICAgICAgICAgICAgICBQTE9HRCgiU2V0dGluZzogcmVkdW5kYW50IGF0dHJpYnV0ZSAnJXMnIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpc0Jvb2xlYW4gPSBzdHJFcShhdHRyc1tpXSwgImVuYWJsZWQiKTsKKyAgICAgICAgICAgIGFfdmFsdWUgPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidXBkYXRlIikpIHsKKyAgICAgICAgICAgIGFfdXBkYXRlID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFBMT0dEKCJTZXR0aW5nOiBpZ25vcmluZyB1bnJlY29nbml6ZWQgYXR0cmlidXRlICclcyciLCBhdHRyc1tpXSk7CisgICAgICAgICAgICArK2k7CisgICAgICAgIH0KICAgICAgICAgKytpOwogICAgIH0KIAotICAgIGlmIChuYW1lID09IG51bGxwdHIgfHwgdmFsdWUgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzOiBuYW1lIG9yIHZhbHVlIHVuc3BlY2lmaWVkIik7CisgICAgaWYgKGFfbmFtZSA9PSBudWxscHRyIHx8IGFfdmFsdWUgPT0gbnVsbHB0cikgeworICAgICAgICBQTE9HRCgiU2V0dGluZyB3aXRoIG5vICduYW1lJyBvciAndmFsdWUnIGF0dHJpYnV0ZSIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIC8vIEJvb2xlYW4gdmFsdWVzIGFyZSBjb252ZXJ0ZWQgdG8gIjAiIG9yICIxIi4KLSAgICBpZiAoc3RySGFzUHJlZml4KG5hbWUsICJzdXBwb3J0cy0iKSkgewotICAgICAgICB2YWx1ZSA9IHBhcnNlQm9vbGVhbih2YWx1ZSkgPyAiMSIgOiAiMCI7CisgICAgaWYgKHN0ckhhc1ByZWZpeChhX25hbWUsICJzdXBwb3J0cy0iKSB8fCBpc0Jvb2xlYW4pIHsKKyAgICAgICAgYV92YWx1ZSA9IHBhcnNlQm9vbGVhbihhX3ZhbHVlKSA/ICIxIiA6ICIwIjsKICAgICB9CiAKLSAgICBtVXBkYXRlID0gKHVwZGF0ZSAhPSBudWxscHRyKSAmJiBwYXJzZUJvb2xlYW4odXBkYXRlKTsKLSAgICBhdXRvIGF0dHJpYnV0ZSA9IG1TZXJ2aWNlQXR0cmlidXRlTWFwLmZpbmQobmFtZSk7CisgICAgYm9vbCB1cGRhdGUgPSAoYV91cGRhdGUgIT0gbnVsbHB0cikgJiYgcGFyc2VCb29sZWFuKGFfdXBkYXRlKTsKKyAgICBSZXN1bHQgcmVzID0gbVN0YXRlLT5kYXRhKCkuYWRkR2xvYmFsKHN0ZDo6c3RyaW5nKHByZWZpeCA/IDogIiIpICsgYV9uYW1lLCBhX3ZhbHVlLCB1cGRhdGUpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgUExPR0QoIlNldHRpbmc6ICVzIiwgcmVzLmVycm9yKCkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKK01lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpSZXN1bHQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OkRhdGE6OmFkZEdsb2JhbCgKKyAgICAgICAgc3RkOjpzdHJpbmcga2V5LCBzdGQ6OnN0cmluZyB2YWx1ZSwgYm9vbCB1cGRhdGluZykgeworICAgIGF1dG8gYXR0cmlidXRlID0gbVNlcnZpY2VBdHRyaWJ1dGVNYXAuZmluZChrZXkpOwogICAgIGlmIChhdHRyaWJ1dGUgPT0gbVNlcnZpY2VBdHRyaWJ1dGVNYXAuZW5kKCkpIHsgLy8gTmV3IGF0dHJpYnV0ZSBuYW1lCi0gICAgICAgIGlmIChtVXBkYXRlKSB7Ci0gICAgICAgICAgICBBTE9HRSgiYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzOiB1cGRhdGluZyBub24tZXhpc3Rpbmcgc2V0dGluZyIpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgaWYgKHVwZGF0aW5nKSB7CisgICAgICAgICAgICByZXR1cm4geyBOQU1FX05PVF9GT1VORCwgImNhbm5vdCB1cGRhdGUgbm9uLWV4aXN0aW5nIHNldHRpbmciIH07CiAgICAgICAgIH0KLSAgICAgICAgbVNlcnZpY2VBdHRyaWJ1dGVNYXAuaW5zZXJ0KEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSkpOworICAgICAgICBtU2VydmljZUF0dHJpYnV0ZU1hcC5pbnNlcnQoQXR0cmlidXRlKGtleSwgdmFsdWUpKTsKICAgICB9IGVsc2UgeyAvLyBFeGlzdGluZyBhdHRyaWJ1dGUgbmFtZQotICAgICAgICBpZiAoIW1VcGRhdGUpIHsKLSAgICAgICAgICAgIEFMT0dFKCJhZGRTZXR0aW5nRnJvbUF0dHJpYnV0ZXM6IGFkZGluZyBleGlzdGluZyBzZXR0aW5nIik7Ci0gICAgICAgIH0KICAgICAgICAgYXR0cmlidXRlLT5zZWNvbmQgPSB2YWx1ZTsKKyAgICAgICAgaWYgKCF1cGRhdGluZykgeworICAgICAgICAgICAgcmV0dXJuIHsgQUxSRUFEWV9FWElTVFMsICJ1cGRhdGluZyBleGlzdGluZyBzZXR0aW5nIiB9OworICAgICAgICB9CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6YWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzKAotICAgICAgICBib29sIGVuY29kZXIsIGNvbnN0IGNoYXIgKiphdHRycykgewotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBudWxscHRyOwotICAgIGNvbnN0IGNoYXIgKnR5cGUgPSBudWxscHRyOwotICAgIGNvbnN0IGNoYXIgKnVwZGF0ZSA9IG51bGxwdHI7CitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjplbnRlck1lZGlhQ29kZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKiphdHRycywgYm9vbCBlbmNvZGVyKSB7CisgICAgY29uc3QgY2hhciAqYV9uYW1lID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyICphX3R5cGUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKmFfdXBkYXRlID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyICphX3JhbmsgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKmFfZG9tYWluID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyICphX3ZhcmlhbnQgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKmFfZW5hYmxlZCA9IG51bGxwdHI7CiAKICAgICBzaXplX3QgaSA9IDA7CiAgICAgd2hpbGUgKGF0dHJzW2ldICE9IG51bGxwdHIpIHsKLSAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogbmFtZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpXTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInR5cGUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IHR5cGUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0eXBlID0gYXR0cnNbaV07Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ1cGRhdGUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IHVwZGF0ZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZSA9IGF0dHJzW2ldOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImFkZE1lZGlhQ29kZWNGcm9tQXR0cmlidXRlczogdW5yZWNvZ25pemVkIGF0dHJpYnV0ZTogJXMiLCBhdHRyc1tpXSk7CisgICAgICAgIENIRUNLKChpICYgMSkgPT0gMCk7CisgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgUExPR0QoIk1lZGlhQ29kZWM6IGF0dHJpYnV0ZSAnJXMnIGlzIG51bGwiLCBhdHRyc1tpXSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7CisgICAgICAgICAgICBhX25hbWUgPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidHlwZSIpKSB7CisgICAgICAgICAgICBhX3R5cGUgPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidXBkYXRlIikpIHsKKyAgICAgICAgICAgIGFfdXBkYXRlID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInJhbmsiKSkgeworICAgICAgICAgICAgYV9yYW5rID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgImRvbWFpbiIpKSB7CisgICAgICAgICAgICBhX2RvbWFpbiA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ2YXJpYW50IikpIHsKKyAgICAgICAgICAgIGFfdmFyaWFudCA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJlbmFibGVkIikpIHsKKyAgICAgICAgICAgIGFfZW5hYmxlZCA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQTE9HRCgiTWVkaWFDb2RlYzogaWdub3JpbmcgdW5yZWNvZ25pemVkIGF0dHJpYnV0ZSAnJXMnIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgKytpOworICAgICAgICB9CiAgICAgICAgICsraTsKICAgICB9CiAKLSAgICBpZiAobmFtZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IG5hbWUgbm90IGZvdW5kIik7CisgICAgaWYgKGFfbmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIFBMT0dEKCJNZWRpYUNvZGVjIHdpdGggbm8gJ25hbWUnIGF0dHJpYnV0ZSIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIG1VcGRhdGUgPSAodXBkYXRlICE9IG51bGxwdHIpICYmIHBhcnNlQm9vbGVhbih1cGRhdGUpOwotICAgIG1DdXJyZW50Q29kZWMgPSBtQ29kZWNNYXAuZmluZChuYW1lKTsKLSAgICBpZiAobUN1cnJlbnRDb2RlYyA9PSBtQ29kZWNNYXAuZW5kKCkpIHsgLy8gTmV3IGNvZGVjIG5hbWUKLSAgICAgICAgaWYgKG1VcGRhdGUpIHsKLSAgICAgICAgICAgIEFMT0dXKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IGNhbm5vdCB1cGRhdGUgIgotICAgICAgICAgICAgICAgICAgIm5vbi1leGlzdGluZyBjb2RlYyBcIiVzXCIuIiwgbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGJvb2wgdXBkYXRlID0gKGFfdXBkYXRlICE9IG51bGxwdHIpICYmIHBhcnNlQm9vbGVhbihhX3VwZGF0ZSk7CisgICAgaWYgKGFfZG9tYWluICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gZGlzYWJsZSBjb2RlY3Mgd2l0aCBkb21haW4gYnkgZGVmYXVsdCAodW5sZXNzIHVwZGF0aW5nKQorICAgICAgICBpZiAoIWFfZW5hYmxlZCAmJiAhdXBkYXRlKSB7CisgICAgICAgICAgICBhX2VuYWJsZWQgPSAiZmFsc2UiOworICAgICAgICB9CisgICAgfQorCisgICAgUmVzdWx0IHJlcyA9IG1TdGF0ZS0+ZW50ZXJNZWRpYUNvZGVjKGVuY29kZXIsIGFfbmFtZSwgYV90eXBlLCB1cGRhdGUpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgbG9nQW55RXJyb3JzKHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmV0dXJuIHVwZGF0ZU1lZGlhQ29kZWMoCisgICAgICAgICAgICBhX3JhbmssIHBhcnNlQ29tbWFTZXBhcmF0ZWRTdHJpbmdTZXQoYV9kb21haW4pLAorICAgICAgICAgICAgcGFyc2VDb21tYVNlcGFyYXRlZFN0cmluZ1NldChhX3ZhcmlhbnQpLCBhX2VuYWJsZWQpOworfQorCitNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UmVzdWx0CitNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6U3RhdGU6OmVudGVyTWVkaWFDb2RlYygKKyAgICAgICAgYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp0eXBlLCBib29sIHVwZGF0aW5nKSB7CisgICAgLy8gc3RvcmUgbmFtZSBldmVuIGluIGNhc2Ugb2YgYW4gZXJyb3IKKyAgICBDb2RlY01hcDo6aXRlcmF0b3IgY29kZWNJdCA9IG1EYXRhLT5tQ29kZWNNYXAuZmluZChuYW1lKTsKKyAgICBUeXBlTWFwOjppdGVyYXRvciB0eXBlSXQ7CisgICAgaWYgKGNvZGVjSXQgPT0gbURhdGEtPm1Db2RlY01hcC5lbmQoKSkgeyAvLyBOZXcgY29kZWMgbmFtZQorICAgICAgICBpZiAodXBkYXRpbmcpIHsKKyAgICAgICAgICAgIHJldHVybiB7IE5BTUVfTk9UX0ZPVU5ELCAiTWVkaWFDb2RlYzogY2Fubm90IHVwZGF0ZSBub24tZXhpc3RpbmcgY29kZWMiIH07CiAgICAgICAgIH0KICAgICAgICAgLy8gQ3JlYXRlIGEgbmV3IGNvZGVjIGluIG1Db2RlY01hcAotICAgICAgICBtQ3VycmVudENvZGVjID0gbUNvZGVjTWFwLmluc2VydCgKLSAgICAgICAgICAgICAgICBDb2RlYyhuYW1lLCBDb2RlY1Byb3BlcnRpZXMoKSkpLmZpcnN0OworICAgICAgICBjb2RlY0l0ID0gbURhdGEtPm1Db2RlY01hcC5pbnNlcnQoQ29kZWMobmFtZSwgQ29kZWNQcm9wZXJ0aWVzKCkpKS5maXJzdDsKICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuaW5zZXJ0KAotICAgICAgICAgICAgICAgICAgICBUeXBlKHR5cGUsIEF0dHJpYnV0ZU1hcCgpKSkuZmlyc3Q7CisgICAgICAgICAgICB0eXBlSXQgPSBjb2RlY0l0LT5zZWNvbmQudHlwZU1hcC5pbnNlcnQoVHlwZSh0eXBlLCBBdHRyaWJ1dGVNYXAoKSkpLmZpcnN0OwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCk7CisgICAgICAgICAgICB0eXBlSXQgPSBjb2RlY0l0LT5zZWNvbmQudHlwZU1hcC5lbmQoKTsKICAgICAgICAgfQotICAgICAgICBtQ3VycmVudENvZGVjLT5zZWNvbmQuaXNFbmNvZGVyID0gZW5jb2RlcjsKLSAgICAgICAgbUN1cnJlbnRDb2RlYy0+c2Vjb25kLm9yZGVyID0gbUNvZGVjQ291bnRlcisrOworICAgICAgICBjb2RlY0l0LT5zZWNvbmQuaXNFbmNvZGVyID0gZW5jb2RlcjsKKyAgICAgICAgY29kZWNJdC0+c2Vjb25kLm9yZGVyID0gbURhdGEtPm1Db2RlY01hcC5zaXplKCk7CiAgICAgfSBlbHNlIHsgLy8gRXhpc3RpbmcgY29kZWMgbmFtZQotICAgICAgICBpZiAoIW1VcGRhdGUpIHsKLSAgICAgICAgICAgIEFMT0dXKCJhZGRNZWRpYUNvZGVjRnJvbUF0dHJpYnV0ZXM6IHRyeWluZyB0byBhZGQgIgotICAgICAgICAgICAgICAgICAgImV4aXN0aW5nIGNvZGVjIFwiJXNcIiIsIG5hbWUpOwotICAgICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOworICAgICAgICBpZiAoIXVwZGF0aW5nKSB7CisgICAgICAgICAgICByZXR1cm4geyBBTFJFQURZX0VYSVNUUywgIk1lZGlhQ29kZWM6IGNhbm5vdCBhZGQgZXhpc3RpbmcgY29kZWMiIH07CiAgICAgICAgIH0KICAgICAgICAgaWYgKHR5cGUgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZmluZCh0eXBlKTsKLSAgICAgICAgICAgIGlmIChtQ3VycmVudFR5cGUgPT0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBjYW5ub3QgdXBkYXRlICIKLSAgICAgICAgICAgICAgICAgICAgICAibm9uLWV4aXN0aW5nIHR5cGUgXCIlc1wiIGZvciBjb2RlYyBcIiVzXCIiLAotICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIHR5cGVJdCA9IGNvZGVjSXQtPnNlY29uZC50eXBlTWFwLmZpbmQodHlwZSk7CisgICAgICAgICAgICBpZiAodHlwZUl0ID09IGNvZGVjSXQtPnNlY29uZC50eXBlTWFwLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHsgTkFNRV9OT1RfRk9VTkQsICJNZWRpYUNvZGVjOiBjYW5ub3QgdXBkYXRlIG5vbi1leGlzdGluZyB0eXBlIGZvciBjb2RlYyIgfTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIGhhcHBlbiBvbmx5IHdoZW4gdGhlIGNvZGVjIGhhcyBhdCBtb3N0IG9uZSB0eXBlLgotICAgICAgICAgICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuYmVnaW4oKTsKLSAgICAgICAgICAgIGlmIChtQ3VycmVudFR5cGUgPT0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzOiBjYW5ub3QgdXBkYXRlICIKLSAgICAgICAgICAgICAgICAgICAgICAiY29kZWMgXCIlc1wiIHdpdGhvdXQgdHlwZSBzcGVjaWZpZWQiLCBuYW1lKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgdHlwZUl0ID0gY29kZWNJdC0+c2Vjb25kLnR5cGVNYXAuYmVnaW4oKTsKKyAgICAgICAgICAgIGlmICh0eXBlSXQgPT0gY29kZWNJdC0+c2Vjb25kLnR5cGVNYXAuZW5kKCkKKyAgICAgICAgICAgICAgICAgICAgfHwgY29kZWNJdC0+c2Vjb25kLnR5cGVNYXAuc2l6ZSgpICE9IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4geyBCQURfVkFMVUUsICJNZWRpYUNvZGVjOiBjYW5ub3QgdXBkYXRlIGNvZGVjIHdpdGhvdXQgdHlwZSBzcGVjaWZpZWQiIH07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KKyAgICBtQ3VycmVudC5lbXBsYWNlX2JhY2soQ29kZWNBbmRUeXBle25hbWUsIGNvZGVjSXQsIHR5cGVJdCwgdXBkYXRpbmd9KTsKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRRdWlyayhjb25zdCBjaGFyICoqYXR0cnMpIHsKLSAgICBpZiAobUN1cnJlbnRDb2RlYyA9PSBtQ29kZWNNYXAuZW5kKCkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpQYXJzZXI6OnVwZGF0ZU1lZGlhQ29kZWMoCisgICAgICAgIGNvbnN0IGNoYXIgKnJhbmssIGNvbnN0IFN0cmluZ1NldCAmZG9tYWlucywgY29uc3QgU3RyaW5nU2V0ICZ2YXJpYW50cywKKyAgICAgICAgY29uc3QgY2hhciAqZW5hYmxlZCkgeworICAgIENIRUNLKG1TdGF0ZS0+aW5Db2RlYygpKTsKKyAgICBDb2RlY1Byb3BlcnRpZXMgJmNvZGVjID0gbVN0YXRlLT5jb2RlYygpOworCisgICAgaWYgKHJhbmsgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRF9JRighY29kZWMucmFuay5lbXB0eSgpICYmIGNvZGVjLnJhbmsgIT0gcmFuaywKKyAgICAgICAgICAgICAgICAiY29kZWMgJyVzJyByYW5rIGNoYW5nZWQgZnJvbSAnJXMnIHRvICclcyciLAorICAgICAgICAgICAgICAgIG1TdGF0ZS0+Y29kZWNOYW1lKCkuY19zdHIoKSwgY29kZWMucmFuay5jX3N0cigpLCByYW5rKTsKKyAgICAgICAgY29kZWMucmFuayA9IHJhbms7CiAgICAgfQogCi0gICAgY29uc3QgY2hhciAqbmFtZSA9IG51bGxwdHI7CisgICAgY29kZWMudmFyaWFudFNldCA9IHZhcmlhbnRzOworCisgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmZG9tYWluIDogZG9tYWlucykgeworICAgICAgICBpZiAoZG9tYWluLnNpemUoKSAmJiBkb21haW4uYXQoMCkgPT0gJyEnKSB7CisgICAgICAgICAgICBjb2RlYy5kb21haW5TZXQuZXJhc2UoZG9tYWluLnN1YnN0cigxKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb2RlYy5kb21haW5TZXQuZW1wbGFjZShkb21haW4pOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGVuYWJsZWQgIT0gbnVsbHB0cikgeworICAgICAgICBpZiAocGFyc2VCb29sZWFuKGVuYWJsZWQpKSB7CisgICAgICAgICAgICBjb2RlYy5xdWlya1NldC5lcmFzZSgiYXR0cmlidXRlOjpkaXNhYmxlZCIpOworICAgICAgICAgICAgQUxPR0QoImVuYWJsaW5nICVzIiwgbVN0YXRlLT5jb2RlY05hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvZGVjLnF1aXJrU2V0LmVtcGxhY2UoImF0dHJpYnV0ZTo6ZGlzYWJsZWQiKTsKKyAgICAgICAgICAgIEFMT0dEKCJkaXNhYmxpbmcgJXMiLCBtU3RhdGUtPmNvZGVjTmFtZSgpLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcjo6YWRkUXVpcmsoY29uc3QgY2hhciAqKmF0dHJzLCBjb25zdCBjaGFyICpwcmVmaXgpIHsKKyAgICBDSEVDSyhtU3RhdGUtPmluQ29kZWMoKSk7CisgICAgY29uc3QgY2hhciAqYV9uYW1lID0gbnVsbHB0cjsKIAogICAgIHNpemVfdCBpID0gMDsKICAgICB3aGlsZSAoYXR0cnNbaV0gIT0gbnVsbHB0cikgewotICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkUXVpcms6IG5hbWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuYW1lID0gYXR0cnNbaV07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HRSgiYWRkUXVpcms6IHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOworICAgICAgICBDSEVDSygoaSAmIDEpID09IDApOworICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIFBMT0dEKCJRdWlyazogYXR0cmlidXRlICclcycgaXMgbnVsbCIsIGF0dHJzW2ldKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKKyAgICAgICAgICAgIGFfbmFtZSA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQTE9HRCgiUXVpcms6IGlnbm9yaW5nIHVucmVjb2duaXplZCBhdHRyaWJ1dGUgJyVzJyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQogICAgICAgICArK2k7CiAgICAgfQogCi0gICAgaWYgKG5hbWUgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiYWRkUXVpcms6IG5hbWUgbm90IGZvdW5kIik7CisgICAgaWYgKGFfbmFtZSA9PSBudWxscHRyKSB7CisgICAgICAgIFBMT0dEKCJRdWlyayB3aXRoIG5vICduYW1lJyBhdHRyaWJ1dGUiKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBtQ3VycmVudENvZGVjLT5zZWNvbmQucXVpcmtTZXQuZW1wbGFjZShuYW1lKTsKKyAgICBzdGQ6OnN0cmluZyBrZXkgPSBzdGQ6OnN0cmluZyhwcmVmaXggPyA6ICIiKSArIGFfbmFtZTsKKyAgICBtU3RhdGUtPmNvZGVjKCkucXVpcmtTZXQuZW1wbGFjZShrZXkpOworICAgIEFMT0dWKCJhZGRpbmcgJXMgdG8gJXMiLCBrZXkuY19zdHIoKSwgbVN0YXRlLT5jb2RlY05hbWUoKS5jX3N0cigpKTsKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRUeXBlRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzLCBib29sIGVuY29kZXIpIHsKLSAgICBpZiAobUN1cnJlbnRDb2RlYyA9PSBtQ29kZWNNYXAuZW5kKCkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9CitzdGF0dXNfdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6UGFyc2VyOjplbnRlclR5cGUoY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgQ0hFQ0sobVN0YXRlLT5pbkNvZGVjKCkpOwogCi0gICAgY29uc3QgY2hhciAqbmFtZSA9IG51bGxwdHI7Ci0gICAgY29uc3QgY2hhciAqdXBkYXRlID0gbnVsbHB0cjsKKyAgICBjb25zdCBjaGFyICphX25hbWUgPSBudWxscHRyOworICAgIGNvbnN0IGNoYXIgKmFfdXBkYXRlID0gbnVsbHB0cjsKIAogICAgIHNpemVfdCBpID0gMDsKICAgICB3aGlsZSAoYXR0cnNbaV0gIT0gbnVsbHB0cikgeworICAgICAgICBDSEVDSygoaSAmIDEpID09IDApOworICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIFBMT0dEKCJUeXBlOiBhdHRyaWJ1dGUgJyVzJyBpcyBudWxsIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IG5hbWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBuYW1lID0gYXR0cnNbaV07CisgICAgICAgICAgICBhX25hbWUgPSBhdHRyc1srK2ldOwogICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidXBkYXRlIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkVHlwZUZyb21BdHRyaWJ1dGVzOiB1cGRhdGUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1cGRhdGUgPSBhdHRyc1tpXTsKKyAgICAgICAgICAgIGFfdXBkYXRlID0gYXR0cnNbKytpXTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIFBMT0dEKCJUeXBlOiBpZ25vcmluZyB1bnJlY29nbml6ZWQgYXR0cmlidXRlICclcyciLCBhdHRyc1tpXSk7CisgICAgICAgICAgICArK2k7CiAgICAgICAgIH0KICAgICAgICAgKytpOwogICAgIH0KIAotICAgIGlmIChuYW1lID09IG51bGxwdHIpIHsKKyAgICBpZiAoYV9uYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgUExPR0QoIlR5cGUgd2l0aCBubyAnbmFtZScgYXR0cmlidXRlIik7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgbUN1cnJlbnRDb2RlYy0+c2Vjb25kLmlzRW5jb2RlciA9IGVuY29kZXI7Ci0gICAgbUN1cnJlbnRUeXBlID0gbUN1cnJlbnRDb2RlYy0+c2Vjb25kLnR5cGVNYXAuZmluZChuYW1lKTsKLSAgICBpZiAoIW1VcGRhdGUpIHsKLSAgICAgICAgaWYgKG1DdXJyZW50VHlwZSAhPSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKSkgewotICAgICAgICAgICAgQUxPR1coImFkZFR5cGVGcm9tQXR0cmlidXRlczogdHJ5aW5nIHRvIHVwZGF0ZSAiCi0gICAgICAgICAgICAgICAgICAiZXhpc3RpbmcgdHlwZSBcIiVzXCIiLCBuYW1lKTsKLSAgICAgICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKKyAgICBib29sIHVwZGF0ZSA9IChhX3VwZGF0ZSAhPSBudWxscHRyKSAmJiBwYXJzZUJvb2xlYW4oYV91cGRhdGUpOworICAgIHJldHVybiBtU3RhdGUtPmVudGVyVHlwZShhX25hbWUsIHVwZGF0ZSk7Cit9CisKK01lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpSZXN1bHQKK01lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpTdGF0ZTo6ZW50ZXJUeXBlKGNvbnN0IGNoYXIgKm5hbWUsIGJvb2wgdXBkYXRlKSB7CisgICAgdXBkYXRlID0gdXBkYXRlIHx8IHVwZGF0aW5nKCk7IC8vIGhhbmRsZSBwYXJlbnQKKworICAgIENvZGVjTWFwOjppdGVyYXRvciBjb2RlY0l0ID0gbUN1cnJlbnQuYmFjaygpLm1Db2RlYzsKKyAgICBUeXBlTWFwOjppdGVyYXRvciB0eXBlSXQgPSBjb2RlY0l0LT5zZWNvbmQudHlwZU1hcC5maW5kKG5hbWUpOworICAgIGlmICghdXBkYXRlKSB7CisgICAgICAgIGlmICh0eXBlSXQgIT0gY29kZWNJdC0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiB7IEFMUkVBRFlfRVhJU1RTLCAidHJ5aW5nIHRvIHVwZGF0ZSBleGlzdGluZyB0eXBlICciICsgc3RkOjpzdHJpbmcobmFtZSkgKyAiJyIgfTsKICAgICAgICAgfQotICAgICAgICBtQ3VycmVudFR5cGUgPSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5pbnNlcnQoCi0gICAgICAgICAgICAgICAgVHlwZShuYW1lLCBBdHRyaWJ1dGVNYXAoKSkpLmZpcnN0OwotICAgIH0gZWxzZSBpZiAobUN1cnJlbnRUeXBlID09IG1DdXJyZW50Q29kZWMtPnNlY29uZC50eXBlTWFwLmVuZCgpKSB7Ci0gICAgICAgIEFMT0dFKCJhZGRUeXBlRnJvbUF0dHJpYnV0ZXM6IHVwZGF0aW5nIG5vbi1leGlzdGluZyB0eXBlIik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIHR5cGVJdCA9IGNvZGVjSXQtPnNlY29uZC50eXBlTWFwLmluc2VydChUeXBlKG5hbWUsIEF0dHJpYnV0ZU1hcCgpKSkuZmlyc3Q7CisgICAgfSBlbHNlIGlmICh0eXBlSXQgPT0gY29kZWNJdC0+c2Vjb25kLnR5cGVNYXAuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIHsgTkFNRV9OT1RfRk9VTkQsICJhZGRUeXBlOiB1cGRhdGluZyBub24tZXhpc3RpbmcgdHlwZSIgfTsKICAgICB9CisgICAgbUN1cnJlbnQucHVzaF9iYWNrKHsgY29kZWNOYW1lKCksIGNvZGVjSXQsIHR5cGVJdCwgdXBkYXRlIH0pOworICAgIENIRUNLKGluVHlwZSgpKTsKICAgICByZXR1cm4gT0s7CiB9CiAKLXN0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjphZGRMaW1pdChjb25zdCBjaGFyICoqYXR0cnMpIHsKLSAgICBpZiAobUN1cnJlbnRDb2RlYyA9PSBtQ29kZWNNYXAuZW5kKCkpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgaWYgKG1DdXJyZW50VHlwZSA9PSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLQorc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcjo6YWRkTGltaXQoY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgQ0hFQ0sobVN0YXRlLT5pblR5cGUoKSk7CiAgICAgY29uc3QgY2hhciogYV9uYW1lID0gbnVsbHB0cjsKICAgICBjb25zdCBjaGFyKiBhX2RlZmF1bHQgPSBudWxscHRyOwogICAgIGNvbnN0IGNoYXIqIGFfaW4gPSBudWxscHRyOwpAQCAtNjgwLDY5ICsxMTQ4LDM5IEBACiAKICAgICBzaXplX3QgaSA9IDA7CiAgICAgd2hpbGUgKGF0dHJzW2ldICE9IG51bGxwdHIpIHsKLSAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZExpbWl0OiBuYW1lIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYV9uYW1lID0gYXR0cnNbaV07Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJkZWZhdWx0IikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IGRlZmF1bHQgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhX2RlZmF1bHQgPSBhdHRyc1tpXTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgImluIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IGluIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYV9pbiA9IGF0dHJzW2ldOwotICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAibWF4IikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IG1heCBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFfbWF4ID0gYXR0cnNbaV07Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJtaW4iKSkgewotICAgICAgICAgICAgaWYgKGF0dHJzWysraV0gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIEFMT0dFKCJhZGRMaW1pdDogbWluIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYV9taW4gPSBhdHRyc1tpXTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInJhbmdlIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IHJhbmdlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYV9yYW5nZSA9IGF0dHJzW2ldOwotICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAicmFuZ2VzIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IHJhbmdlcyBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFfcmFuZ2VzID0gYXR0cnNbaV07Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJzY2FsZSIpKSB7Ci0gICAgICAgICAgICBpZiAoYXR0cnNbKytpXSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImFkZExpbWl0OiBzY2FsZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFfc2NhbGUgPSBhdHRyc1tpXTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInZhbHVlIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkTGltaXQ6IHZhbHVlIGlzIG51bGwiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYV92YWx1ZSA9IGF0dHJzW2ldOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImFkZExpbWl0OiB1bnJlY29nbml6ZWQgbGltaXQ6ICVzIiwgYXR0cnNbaV0pOworICAgICAgICBDSEVDSygoaSAmIDEpID09IDApOworICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIFBMT0dEKCJMaW1pdDogYXR0cmlidXRlICclcycgaXMgbnVsbCIsIGF0dHJzW2ldKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KKworICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKKyAgICAgICAgICAgIGFfbmFtZSA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJkZWZhdWx0IikpIHsKKyAgICAgICAgICAgIGFfZGVmYXVsdCA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJpbiIpKSB7CisgICAgICAgICAgICBhX2luID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgIm1heCIpKSB7CisgICAgICAgICAgICBhX21heCA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJtaW4iKSkgeworICAgICAgICAgICAgYV9taW4gPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAicmFuZ2UiKSkgeworICAgICAgICAgICAgYV9yYW5nZSA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJyYW5nZXMiKSkgeworICAgICAgICAgICAgYV9yYW5nZXMgPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAic2NhbGUiKSkgeworICAgICAgICAgICAgYV9zY2FsZSA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJ2YWx1ZSIpKSB7CisgICAgICAgICAgICBhX3ZhbHVlID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFBMT0dEKCJMaW1pdDogaWdub3JpbmcgdW5yZWNvZ25pemVkIGxpbWl0OiAlcyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQogICAgICAgICArK2k7CiAgICAgfQogCiAgICAgaWYgKGFfbmFtZSA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCJsaW1pdCB3aXRoIG5vICduYW1lJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgUExPR0QoIkxpbWl0IHdpdGggbm8gJ25hbWUnIGF0dHJpYnV0ZSIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtNzUwLDggKzExODgsNTAgQEAKICAgICAvLyBtZWFzdXJlZC1mcmFtZS1yYXRlLCBtZWFzdXJlZC1ibG9ja3MtcGVyLXNlY29uZDogcmFuZ2UKICAgICAvLyBxdWFsaXR5OiByYW5nZSArIGRlZmF1bHQgKyBbc2NhbGVdCiAgICAgLy8gY29tcGxleGl0eTogcmFuZ2UgKyBkZWZhdWx0Ci0gICAgc3RkOjpzdHJpbmcgcmFuZ2U7Ci0gICAgaWYgKHN0ckVxKGFfbmFtZSwgImFzcGVjdC1yYXRpbyIpIHx8CisgICAgc3RkOjpzdHJpbmcga2V5ID0gYV9uYW1lLCB2YWx1ZTsKKworICAgIC8vIGRvbid0IGFsbG93IHNwZWNpZnlpbmcgbW9yZSB0aGFuIG9uZSBvZiB2YWx1ZSwgcmFuZ2Ugb3IgbWluL21heAorICAgIGlmICgoYV92YWx1ZSAhPSBudWxscHRyKSArIChhX3JhbmdlICE9IG51bGxwdHIpICsgKGFfcmFuZ2VzICE9IG51bGxwdHIpCisgICAgICAgICAgICArIChhX21pbiAhPSBudWxscHRyIHx8IGFfbWF4ICE9IG51bGxwdHIpID4gMSkgeworICAgICAgICBQTE9HRCgiTGltaXQgJyVzJyBoYXMgbXVsdGlwbGUgJ21pbicvJ21heCcsICdyYW5nZScsICdyYW5nZXMnIG9yICd2YWx1ZScgYXR0cmlidXRlcyIsCisgICAgICAgICAgICAgICAgYV9uYW1lKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBNaW4vbWF4IGxpbWl0cyAob25seSBjb250YWluaW5nIG1pbiBvciBtYXggYXR0cmlidXRlKQorICAgIC8vCisgICAgLy8gQ3VycmVudCAibWF4IiBsaW1pdHMgYXJlICJjaGFubmVsLWNvdW50IiwgImNvbmN1cnJlbnQtaW5zdGFuY2VzIi4KKyAgICAvLyBUaGVyZSBhcmUgbm8gY3VycmVudCAibWluIiBsaW1pdHMKKyAgICAvLworICAgIC8vIFJhbmdlIGxpbWl0cy4gInJhbmdlIiBpcyBzcGVjaWZpZWQgaW4gZXhhY3RseSBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtczoKKyAgICAvLyAxKSBtaW4tbWF4CisgICAgLy8gMikgdmFsdWUtdmFsdWUKKyAgICAvLyAzKSByYW5nZQorICAgIC8vCisgICAgLy8gQ3VycmVudCByYW5nZSBsaW1pdHMgYXJlICJhc3BlY3QtcmF0aW8iLCAiYml0cmF0ZSIsICJibG9jay1jb3VudCIsICJibG9ja3MtcGVyLXNlY29uZCIsCisgICAgLy8gImNvbXBsZXhpdHkiLCAiZnJhbWUtcmF0ZSIsICJxdWFsaXR5IiwgInNpemUiLCAibWVhc3VyZWQtYmxvY2tzLXBlci1zZWNvbmQiLAorICAgIC8vICJwZXJmb3JtYW5jZS1wb2ludC0qIiwgIm1lYXN1cmVkLWZyYW1lLXJhdGUtKiIKKyAgICAvLworICAgIC8vIE90aGVyIGxpbWl0cyAoY29udGFpbmluZyBvbmx5IHZhbHVlIG9yIHJhbmdlcykKKyAgICAvLworICAgIC8vIEN1cnJlbnQgcmFuZ2VzIGxpbWl0IGlzICJzYW1wbGUtcmF0ZSIKKyAgICBpZiAoKGFfbWluICE9IG51bGxwdHIpIF4gKGFfbWF4ICE9IG51bGxwdHIpKSB7CisgICAgICAgIC8vIG1pbi9tYXggbGltaXQKKyAgICAgICAgaWYgKGFfbWF4ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGtleSA9ICJtYXgtIiArIGtleTsKKyAgICAgICAgICAgIHZhbHVlID0gYV9tYXg7CisgICAgICAgIH0gZWxzZSBpZiAoYV9taW4gIT0gbnVsbHB0cikgeworICAgICAgICAgICAga2V5ID0gIm1pbi0iICsga2V5OworICAgICAgICAgICAgdmFsdWUgPSBhX21pbjsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYV9taW4gIT0gbnVsbHB0ciAmJiBhX21heCAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIG1pbi1tYXgKKyAgICAgICAga2V5ICs9ICItcmFuZ2UiOworICAgICAgICB2YWx1ZSA9IGFfbWluICsgc3RkOjpzdHJpbmcoIi0iKSArIGFfbWF4OworICAgIH0gZWxzZSBpZiAoYV92YWx1ZSAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIHZhbHVlLXZhbHVlIG9yIHZhbHVlCisgICAgICAgIHZhbHVlID0gYV92YWx1ZTsKKyAgICAgICAgaWYgKHN0ckVxKGFfbmFtZSwgImFzcGVjdC1yYXRpbyIpIHx8CiAgICAgICAgICAgICBzdHJFcShhX25hbWUsICJiaXRyYXRlIikgfHwKICAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgImJsb2NrLWNvdW50IikgfHwKICAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgImJsb2Nrcy1wZXItc2Vjb25kIikgfHwKQEAgLTc2MCwyMjIgKzEyNDAsMjAxIEBACiAgICAgICAgICAgICBzdHJFcShhX25hbWUsICJxdWFsaXR5IikgfHwKICAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgInNpemUiKSB8fAogICAgICAgICAgICAgc3RyRXEoYV9uYW1lLCAibWVhc3VyZWQtYmxvY2tzLXBlci1zZWNvbmQiKSB8fAorICAgICAgICAgICAgc3RySGFzUHJlZml4KGFfbmFtZSwgInBlcmZvcm1hbmNlLXBvaW50LSIpIHx8CiAgICAgICAgICAgICBzdHJIYXNQcmVmaXgoYV9uYW1lLCAibWVhc3VyZWQtZnJhbWUtcmF0ZS0iKSkgewotICAgICAgICAvLyAicmFuZ2UiIGlzIHNwZWNpZmllZCBpbiBleGFjdGx5IG9uZSBvZiB0aGUgZm9sbG93aW5nIGZvcm1zOgotICAgICAgICAvLyAxKSBtaW4tbWF4Ci0gICAgICAgIC8vIDIpIHZhbHVlLXZhbHVlCi0gICAgICAgIC8vIDMpIHJhbmdlCi0gICAgICAgIGlmIChhX21pbiAhPSBudWxscHRyICYmIGFfbWF4ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIC8vIG1pbi1tYXgKLSAgICAgICAgICAgIGlmIChhX3JhbmdlICE9IG51bGxwdHIgfHwgYV92YWx1ZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IoYV9uYW1lLCAiaGFzICdtaW4nIGFuZCAnbWF4JyBhcyB3ZWxsIGFzICdyYW5nZScgb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgIid2YWx1ZScgYXR0cmlidXRlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmFuZ2UgPSBhX21pbjsKLSAgICAgICAgICAgIHJhbmdlICs9ICctJzsKLSAgICAgICAgICAgIHJhbmdlICs9IGFfbWF4OwotICAgICAgICB9IGVsc2UgaWYgKGFfbWluICE9IG51bGxwdHIgfHwgYV9tYXggIT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0RXJyb3IoYV9uYW1lLCAiaGFzIG9ubHkgJ21pbicgb3IgJ21heCcgYXR0cmlidXRlIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoYV92YWx1ZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAvLyB2YWx1ZS12YWx1ZQotICAgICAgICAgICAgaWYgKGFfcmFuZ2UgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEVycm9yKGFfbmFtZSwgImhhcyBib3RoICdyYW5nZScgYW5kICd2YWx1ZScgYXR0cmlidXRlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmFuZ2UgPSBhX3ZhbHVlOwotICAgICAgICAgICAgcmFuZ2UgKz0gJy0nOwotICAgICAgICAgICAgcmFuZ2UgKz0gYV92YWx1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChhX3JhbmdlID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEVycm9yKGFfbmFtZSwgIndpdGggbm8gJ3JhbmdlJywgJ3ZhbHVlJyBvciAnbWluJy8nbWF4JyBhdHRyaWJ1dGVzIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyByYW5nZQotICAgICAgICAgICAgcmFuZ2UgPSBhX3JhbmdlOworICAgICAgICAgICAga2V5ICs9ICItcmFuZ2UiOworICAgICAgICAgICAgdmFsdWUgKz0gc3RkOjpzdHJpbmcoIi0iKSArIGFfdmFsdWU7CiAgICAgICAgIH0KLQotICAgICAgICAvLyAiYXNwZWN0LXJhdGlvIiByZXF1aXJlcyBzb21lIHNwZWNpYWwgdHJlYXRtZW50LgotICAgICAgICBpZiAoc3RyRXEoYV9uYW1lLCAiYXNwZWN0LXJhdGlvIikpIHsKLSAgICAgICAgICAgIC8vICJhc3BlY3QtcmF0aW8iIG11c3QgaGF2ZSAiaW4iLgotICAgICAgICAgICAgaWYgKGFfaW4gPT0gbnVsbHB0cikgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAiaW4iLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyAiaW4iIG11c3QgYmUgZWl0aGVyICJwaXhlbHMiIG9yICJibG9ja3MiLgotICAgICAgICAgICAgaWYgKCFzdHJFcShhX2luLCAicGl4ZWxzIikgJiYgIXN0ckVxKGFfaW4sICJibG9ja3MiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEludmFsaWRBdHRyKGFfbmFtZSwgImluIiwgYV9pbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBuYW1lIHdpbGwgYmUgInBpeGVsLWFzcGVjdC1yYXRpby1yYW5nZSIgb3IKLSAgICAgICAgICAgIC8vICJibG9jay1hc3BlY3QtcmF0aW8tcmFuZ2UiLgotICAgICAgICAgICAgbUN1cnJlbnRUeXBlLT5zZWNvbmRbCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKGFfaW4pLnN1YnN0cigwLCBzdHJsZW4oYV9pbikgLSAxKSArCi0gICAgICAgICAgICAgICAgICAgICItYXNwZWN0LXJhdGlvLXJhbmdlIl0gPSByYW5nZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEZvciBldmVyeXRoaW5nIGVsc2UgKGFwYXJ0IGZyb20gImFzcGVjdC1yYXRpbyIpLCBzaW1wbHkgYXBwZW5kCi0gICAgICAgICAgICAvLyAiLXJhbmdlIiB0byB0aGUgbmFtZSBmb3IgdGhlIHJhbmdlLXR5cGUgcHJvcGVydHkuCi0gICAgICAgICAgICBtQ3VycmVudFR5cGUtPnNlY29uZFtzdGQ6OnN0cmluZyhhX25hbWUpICsgIi1yYW5nZSJdID0gcmFuZ2U7Ci0KLSAgICAgICAgICAgIC8vIE9ubHkgInF1YWxpdHkiIG1heSBoYXZlICJzY2FsZSIuCi0gICAgICAgICAgICBpZiAoIXN0ckVxKGFfbmFtZSwgInF1YWxpdHkiKSAmJiBhX3NjYWxlICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgInNjYWxlIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGFfbmFtZSwgInF1YWxpdHkiKSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIG9mICJxdWFsaXR5LXNjYWxlIiBpcyAibGluZWFyIi4KLSAgICAgICAgICAgICAgICBtQ3VycmVudFR5cGUtPnNlY29uZFsicXVhbGl0eS1zY2FsZSJdID0gYV9zY2FsZSA9PSBudWxscHRyID8KLSAgICAgICAgICAgICAgICAgICAgICAgICJsaW5lYXIiIDogYV9zY2FsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gInF1YWxpdHkiIGFuZCAiY29tcGxleGl0eSIgbXVzdCBoYXZlICJkZWZhdWx0Ii4KLSAgICAgICAgICAgIC8vIE90aGVyIGxpbWl0cyBtdXN0IG5vdCBoYXZlICJkZWZhdWx0Ii4KLSAgICAgICAgICAgIGlmIChzdHJFcShhX25hbWUsICJxdWFsaXR5IikgfHwgc3RyRXEoYV9uYW1lLCAiY29tcGxleGl0eSIpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGFfZGVmYXVsdCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAiZGVmYXVsdCIsIGZhbHNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gbmFtZSB3aWxsIGJlICJxdWFsaXR5LWRlZmF1bHQiIG9yICJjb21wbGV4aXR5LWRlZmF1bHQiLgotICAgICAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kW3N0ZDo6c3RyaW5nKGFfbmFtZSkgKyAiLWRlZmF1bHQiXSA9IGFfZGVmYXVsdDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYV9kZWZhdWx0ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgImRlZmF1bHQiLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoYV9yYW5nZSAhPSBudWxscHRyKSB7CisgICAgICAgIC8vIHJhbmdlCisgICAgICAgIGtleSArPSAiLXJhbmdlIjsKKyAgICAgICAgdmFsdWUgPSBhX3JhbmdlOworICAgIH0gZWxzZSBpZiAoYV9yYW5nZXMgIT0gbnVsbHB0cikgeworICAgICAgICAvLyByYW5nZXMKKyAgICAgICAga2V5ICs9ICItcmFuZ2VzIjsKKyAgICAgICAgdmFsdWUgPSBhX3JhbmdlczsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAoYV9kZWZhdWx0ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAiZGVmYXVsdCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhX2luICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAiaW4iKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYV9zY2FsZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgInNjYWxlIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFfcmFuZ2UgIT0gbnVsbHB0cikgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJyYW5nZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhX21pbiAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgIm1pbiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFfbWF4ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIC8vICJtYXgiIG11c3QgZXhpc3QgaWYgYW5kIG9ubHkgaWYgbmFtZSBpcyAiY2hhbm5lbC1jb3VudCIgb3IKLSAgICAgICAgICAgIC8vICJjb25jdXJyZW50LWluc3RhbmNlcyIuCi0gICAgICAgICAgICAvLyAibWluIiBpcyBub3QgbmNlc3NhcnkuCi0gICAgICAgICAgICBpZiAoc3RyRXEoYV9uYW1lLCAiY2hhbm5lbC1jb3VudCIpIHx8Ci0gICAgICAgICAgICAgICAgICAgIHN0ckVxKGFfbmFtZSwgImNvbmN1cnJlbnQtaW5zdGFuY2VzIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFR5cGUtPnNlY29uZFtzdGQ6OnN0cmluZygibWF4LSIpICsgYV9uYW1lXSA9IGFfbWF4OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgIm1heCIsIGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhX25hbWUsICJjaGFubmVsLWNvdW50IikgfHwKLSAgICAgICAgICAgICAgICBzdHJFcShhX25hbWUsICJjb25jdXJyZW50LWluc3RhbmNlcyIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgIm1heCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGFfcmFuZ2VzICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIC8vICJyYW5nZXMiIG11c3QgZXhpc3QgaWYgYW5kIG9ubHkgaWYgbmFtZSBpcyAic2FtcGxlLXJhdGUiLgotICAgICAgICAgICAgaWYgKHN0ckVxKGFfbmFtZSwgInNhbXBsZS1yYXRlIikpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudFR5cGUtPnNlY29uZFsic2FtcGxlLXJhdGUtcmFuZ2VzIl0gPSBhX3JhbmdlczsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJyYW5nZXMiLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYV9uYW1lLCAic2FtcGxlLXJhdGUiKSkgewotICAgICAgICAgICAgcmV0dXJuIGxpbWl0Rm91bmRNaXNzaW5nQXR0cihhX25hbWUsICJyYW5nZXMiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChhX3ZhbHVlICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIC8vICJ2YWx1ZSIgbXVzdCBleGlzdCBpZiBhbmQgb25seSBpZiBuYW1lIGlzICJhbGlnbm1lbnQiIG9yCi0gICAgICAgICAgICAvLyAiYmxvY2stc2l6ZSIuCi0gICAgICAgICAgICBpZiAoc3RyRXEoYV9uYW1lLCAiYWxpZ25tZW50IikgfHwgc3RyRXEoYV9uYW1lLCAiYmxvY2stc2l6ZSIpKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRUeXBlLT5zZWNvbmRbYV9uYW1lXSA9IGFfdmFsdWU7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBsaW1pdEZvdW5kTWlzc2luZ0F0dHIoYV9uYW1lLCAidmFsdWUiLCBmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYV9uYW1lLCAiYWxpZ25tZW50IikgfHwgc3RyRXEoYV9uYW1lLCAiYmxvY2stc2l6ZSIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbGltaXRGb3VuZE1pc3NpbmdBdHRyKGFfbmFtZSwgInZhbHVlIiwgZmFsc2UpOwotICAgICAgICB9Ci0KKyAgICAgICAgUExPR0QoIkxpbWl0ICclcycgd2l0aCBubyAncmFuZ2UnLCAndmFsdWUnIG9yICdtaW4nLydtYXgnIGF0dHJpYnV0ZXMiLCBhX25hbWUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAorICAgIC8vIGhhbmRsZSAnaW4nIGF0dHJpYnV0ZSAtIHRoaXMgY2hhbmdlcyB0aGUga2V5CisgICAgaWYgKGFfaW4gIT0gbnVsbHB0cikgeworICAgICAgICAvLyBDdXJyZW50bHkgImFzcGVjdC1yYXRpbyIgdXNlcyBpbiBhdHRyaWJ1dGUKKyAgICAgICAgY29uc3Qgc2l6ZV90IGFfaW5fbGVuID0gc3RybGVuKGFfaW4pOworICAgICAgICBrZXkgPSBzdGQ6OnN0cmluZyhhX2luLCBhX2luX2xlbiAtIGFfaW5bYV9pbl9sZW5dID09ICdzJykgKyAnLScgKyBrZXk7CisgICAgfQorCisgICAgLy8gaGFuZGxlICdzY2FsZScgYXR0cmlidXRlIC0gdGhpcyBhZGRzIGEgbmV3IGRldGFpbAorICAgIGlmIChhX3NjYWxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVN0YXRlLT5hZGREZXRhaWwoYV9uYW1lICsgc3RkOjpzdHJpbmcoIi1zY2FsZSIpLCBhX3NjYWxlKTsKKyAgICB9IGVsc2UgaWYgKHN0ckVxKGFfbmFtZSwgInF1YWxpdHkiKSkgeworICAgICAgICAvLyBUaGUgZGVmYXVsdCB2YWx1ZSBvZiAicXVhbGl0eS1zY2FsZSIgaXMgImxpbmVhciIgZXZlbiBpZiB1bnNwZWNpZmllZC4KKyAgICAgICAgbVN0YXRlLT5hZGREZXRhaWwoYV9uYW1lICsgc3RkOjpzdHJpbmcoIi1zY2FsZSIpLCAibGluZWFyIik7CisgICAgfQorCisgICAgLy8gaGFuZGxlICdkZWZhdWx0JyBhdHRyaWJ1dGUgLSB0aGlzIGFkZHMgYSBuZXcgZGV0YWlsCisgICAgaWYgKGFfZGVmYXVsdCAhPSBudWxscHRyKSB7CisgICAgICAgIG1TdGF0ZS0+YWRkRGV0YWlsKGFfbmFtZSArIHN0ZDo6c3RyaW5nKCItZGVmYXVsdCIpLCBhX2RlZmF1bHQpOworICAgIH0KKworICAgIG1TdGF0ZS0+YWRkRGV0YWlsKGtleSwgdmFsdWUpOwogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmFkZEZlYXR1cmUoY29uc3QgY2hhciAqKmF0dHJzKSB7Ci0gICAgaWYgKG1DdXJyZW50Q29kZWMgPT0gbUNvZGVjTWFwLmVuZCgpKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Cit2b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpTdGF0ZTo6YWRkRGV0YWlsKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAma2V5LCBjb25zdCBzdGQ6OnN0cmluZyAmdmFsdWUpIHsKKyAgICBDSEVDSyhpblR5cGUoKSk7CisgICAgQUxPR1YoImxpbWl0OiAlcyA9ICVzIiwga2V5LmNfc3RyKCksIHZhbHVlLmNfc3RyKCkpOworICAgIGNvbnN0IFN0cmluZ1NldCAmdmFyaWFudHMgPSBtVmFyaWFudHNTdGFjay5iYWNrKCk7CisgICAgaWYgKHZhcmlhbnRzLmVtcHR5KCkpIHsKKyAgICAgICAgdHlwZSgpW2tleV0gPSB2YWx1ZTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGNvbnN0IHN0ZDo6c3RyaW5nICZ2YXJpYW50IDogdmFyaWFudHMpIHsKKyAgICAgICAgICAgIHR5cGUoKVt2YXJpYW50ICsgIjo6OiIgKyBrZXldID0gdmFsdWU7CisgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKG1DdXJyZW50VHlwZSA9PSBtQ3VycmVudENvZGVjLT5zZWNvbmQudHlwZU1hcC5lbmQoKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcjo6bGltaXRWYXJpYW50cyhjb25zdCBjaGFyICoqYXR0cnMpIHsKKyAgICBjb25zdCBjaGFyKiBhX25hbWUgPSBudWxscHRyOwogCiAgICAgc2l6ZV90IGkgPSAwOwotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBudWxscHRyOworICAgIHdoaWxlIChhdHRyc1tpXSAhPSBudWxscHRyKSB7CisgICAgICAgIENIRUNLKChpICYgMSkgPT0gMCk7CisgICAgICAgIGlmIChhdHRyc1tpICsgMV0gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgUExPR0QoIlZhcmlhbnQ6IGF0dHJpYnV0ZSAnJXMnIGlzIG51bGwiLCBhdHRyc1tpXSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgeworICAgICAgICAgICAgYV9uYW1lID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIFBMT0dEKCJWYXJpYW50OiBpZ25vcmluZyB1bnJlY29nbml6ZWQgYXR0cmlidXRlOiAlcyIsIGF0dHJzW2ldKTsKKyAgICAgICAgICAgICsraTsKKyAgICAgICAgfQorICAgICAgICArK2k7CisgICAgfQorCisgICAgaWYgKGFfbmFtZSA9PSBudWxscHRyIHx8ICphX25hbWUgPT0gJ1wwJykgeworICAgICAgICBQTE9HRCgiVmFyaWFudCB3aXRoIG5vIG9yIGVtcHR5ICduYW1lJyBhdHRyaWJ1dGUiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBTdHJpbmdTZXQgdmFyaWFudHM7CisgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmdmFyaWFudCA6IHBhcnNlQ29tbWFTZXBhcmF0ZWRTdHJpbmdTZXQoYV9uYW1lKSkgeworICAgICAgICBpZiAobVN0YXRlLT52YXJpYW50cygpLmNvdW50KHZhcmlhbnQpKSB7CisgICAgICAgICAgICB2YXJpYW50cy5lbXBsYWNlKHZhcmlhbnQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUExPR0QoIlZhcmlhbnQ6IHZhcmlhbnQgJyVzJyBub3QgaW4gcGFyZW50IHZhcmlhbnRzIiwgdmFyaWFudC5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgbVN0YXRlLT5lbnRlclZhcmlhbnRzKHZhcmlhbnRzKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpJbXBsOjpQYXJzZXI6OmFkZEZlYXR1cmUoY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgQ0hFQ0sobVN0YXRlLT5pblR5cGUoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGNvbnN0IGNoYXIgKmFfbmFtZSA9IG51bGxwdHI7CiAgICAgaW50MzJfdCBvcHRpb25hbCA9IC0xOwogICAgIGludDMyX3QgcmVxdWlyZWQgPSAtMTsKLSAgICBjb25zdCBjaGFyICp2YWx1ZSA9IG51bGxwdHI7CisgICAgY29uc3QgY2hhciAqYV92YWx1ZSA9IG51bGxwdHI7CiAKICAgICB3aGlsZSAoYXR0cnNbaV0gIT0gbnVsbHB0cikgewotICAgICAgICBpZiAoc3RyRXEoYXR0cnNbaV0sICJuYW1lIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogbmFtZSBpcyBudWxsIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5hbWUgPSBhdHRyc1tpXTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgIm9wdGlvbmFsIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogb3B0aW9uYWwgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvcHRpb25hbCA9IHBhcnNlQm9vbGVhbihhdHRyc1tpXSkgPyAxIDogMDsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInJlcXVpcmVkIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogcmVxdWlyZWQgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXF1aXJlZCA9IHBhcnNlQm9vbGVhbihhdHRyc1tpXSkgPyAxIDogMDsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgInZhbHVlIikpIHsKLSAgICAgICAgICAgIGlmIChhdHRyc1srK2ldID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiYWRkRmVhdHVyZTogdmFsdWUgaXMgbnVsbCIpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YWx1ZSA9IGF0dHJzW2ldOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoImFkZEZlYXR1cmU6IHVucmVjb2duaXplZCBhdHRyaWJ1dGU6ICVzIiwgYXR0cnNbaV0pOworICAgICAgICBDSEVDSygoaSAmIDEpID09IDApOworICAgICAgICBpZiAoYXR0cnNbaSArIDFdID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIFBMT0dEKCJGZWF0dXJlOiBhdHRyaWJ1dGUgJyVzJyBpcyBudWxsIiwgYXR0cnNbaV0pOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChzdHJFcShhdHRyc1tpXSwgIm5hbWUiKSkgeworICAgICAgICAgICAgYV9uYW1lID0gYXR0cnNbKytpXTsKKyAgICAgICAgfSBlbHNlIGlmIChzdHJFcShhdHRyc1tpXSwgIm9wdGlvbmFsIikpIHsKKyAgICAgICAgICAgIG9wdGlvbmFsID0gcGFyc2VCb29sZWFuKGF0dHJzWysraV0pID8gMSA6IDA7CisgICAgICAgIH0gZWxzZSBpZiAoc3RyRXEoYXR0cnNbaV0sICJyZXF1aXJlZCIpKSB7CisgICAgICAgICAgICByZXF1aXJlZCA9IHBhcnNlQm9vbGVhbihhdHRyc1srK2ldKSA/IDEgOiAwOworICAgICAgICB9IGVsc2UgaWYgKHN0ckVxKGF0dHJzW2ldLCAidmFsdWUiKSkgeworICAgICAgICAgICAgYV92YWx1ZSA9IGF0dHJzWysraV07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBQTE9HRCgiRmVhdHVyZTogaWdub3JpbmcgdW5yZWNvZ25pemVkIGF0dHJpYnV0ZSAnJXMnIiwgYXR0cnNbaV0pOworICAgICAgICAgICAgKytpOworICAgICAgICB9CiAgICAgICAgICsraTsKICAgICB9CiAKICAgICAvLyBFdmVyeSBmZWF0dXJlIG11c3QgaGF2ZSBhIG5hbWUuCi0gICAgaWYgKG5hbWUgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiZmVhdHVyZSB3aXRoIG5vICduYW1lJyBhdHRyaWJ1dGUiKTsKKyAgICBpZiAoYV9uYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgUExPR0QoIkZlYXR1cmUgd2l0aCBubyAnbmFtZScgYXR0cmlidXRlIik7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgaWYgKChvcHRpb25hbCAhPSAtMSkgfHwgKHJlcXVpcmVkICE9IC0xKSkgewotICAgICAgICBpZiAob3B0aW9uYWwgPT0gcmVxdWlyZWQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJmZWF0dXJlICclcycgaXMgYm90aC9uZWl0aGVyIG9wdGlvbmFsIGFuZCByZXF1aXJlZCIsIG5hbWUpOworICAgIGlmIChhX3ZhbHVlICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG9wdGlvbmFsICE9IC0xIHx8IHJlcXVpcmVkICE9IC0xKSB7CisgICAgICAgICAgICBQTE9HRCgiRmVhdHVyZSAnJXMnIGhhcyBib3RoIHZhbHVlIGFuZCBvcHRpb25hbC9yZXF1aXJlZCBhdHRyaWJ1dGVzIiwgYV9uYW1lKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKChvcHRpb25hbCA9PSAxKSB8fCAocmVxdWlyZWQgPT0gMSkpIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoImZlYXR1cmUgJyVzJyBjYW5ub3QgaGF2ZSBleHRyYSAndmFsdWUnIiwgbmFtZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DdXJyZW50VHlwZS0+c2Vjb25kW3N0ZDo6c3RyaW5nKCJmZWF0dXJlLSIpICsgbmFtZV0gPQotICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCA9PSAxID8gIjAiIDogIjEiOwotICAgICAgICAgICAgcmV0dXJuIE9LOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChvcHRpb25hbCA9PSByZXF1aXJlZCAmJiBvcHRpb25hbCAhPSAtMSkgeworICAgICAgICAgICAgUExPR0QoIkZlYXR1cmUgJyVzJyBpcyBib3RoL25laXRoZXIgb3B0aW9uYWwgYW5kIHJlcXVpcmVkIiwgYV9uYW1lKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KKyAgICAgICAgYV92YWx1ZSA9IChyZXF1aXJlZCA9PSAxIHx8IG9wdGlvbmFsID09IDApID8gIjEiIDogIjAiOwogICAgIH0KLSAgICBtQ3VycmVudFR5cGUtPnNlY29uZFtzdGQ6OnN0cmluZygiZmVhdHVyZS0iKSArIG5hbWVdID0gdmFsdWUgPT0gbnVsbHB0ciA/Ci0gICAgICAgICAgICAiMCIgOiB2YWx1ZTsKKworICAgIG1TdGF0ZS0+YWRkRGV0YWlsKHN0ZDo6c3RyaW5nKCJmZWF0dXJlLSIpICsgYV9uYW1lLCBhX3ZhbHVlID8gOiAiMCIpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OlBhcnNlcjo6YWRkQWxpYXMoY29uc3QgY2hhciAqKmF0dHJzKSB7CisgICAgQ0hFQ0sobVN0YXRlLT5pbkNvZGVjKCkpOworICAgIHNpemVfdCBpID0gMDsKKyAgICBjb25zdCBjaGFyICphX25hbWUgPSBudWxscHRyOworCisgICAgd2hpbGUgKGF0dHJzW2ldICE9IG51bGxwdHIpIHsKKyAgICAgICAgQ0hFQ0soKGkgJiAxKSA9PSAwKTsKKyAgICAgICAgaWYgKGF0dHJzW2kgKyAxXSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBQTE9HRCgiQWxpYXM6IGF0dHJpYnV0ZSAnJXMnIGlzIG51bGwiLCBhdHRyc1tpXSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHN0ckVxKGF0dHJzW2ldLCAibmFtZSIpKSB7CisgICAgICAgICAgICBhX25hbWUgPSBhdHRyc1srK2ldOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgUExPR0QoIkFsaWFzOiBpZ25vcmluZyB1bnJlY29nbml6ZWQgYXR0cmlidXRlICclcyciLCBhdHRyc1tpXSk7CisgICAgICAgICAgICArK2k7CisgICAgICAgIH0KKyAgICAgICAgKytpOworICAgIH0KKworICAgIC8vIEV2ZXJ5IGZlYXR1cmUgbXVzdCBoYXZlIGEgbmFtZS4KKyAgICBpZiAoYV9uYW1lID09IG51bGxwdHIpIHsKKyAgICAgICAgUExPR0QoIkFsaWFzIHdpdGggbm8gJ25hbWUnIGF0dHJpYnV0ZSIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1TdGF0ZS0+Y29kZWMoKS5hbGlhc2VzLmVtcGxhY2VfYmFjayhhX25hbWUpOwogICAgIHJldHVybiBPSzsKIH0KIAogY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkF0dHJpYnV0ZU1hcCYKLSAgICAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldFNlcnZpY2VBdHRyaWJ1dGVNYXAoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TZXJ2aWNlQXR0cmlidXRlTWFwOworTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldFNlcnZpY2VBdHRyaWJ1dGVNYXAoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRTZXJ2aWNlQXR0cmlidXRlTWFwKCk7CiB9CiAKIGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpDb2RlY01hcCYKLSAgICAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldENvZGVjTWFwKCkgY29uc3QgewotICAgIHJldHVybiBtQ29kZWNNYXA7CitNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2V0Q29kZWNNYXAoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRDb2RlY01hcCgpOwogfQogCiBjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6Um9sZU1hcCYKLSAgICAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldFJvbGVNYXAoKSBjb25zdCB7CitNZWRpYUNvZGVjc1htbFBhcnNlcjo6Z2V0Um9sZU1hcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gbUltcGwtPmdldFJvbGVNYXAoKTsKK30KKworY29uc3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OlJvbGVNYXAmCitNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6Z2V0Um9sZU1hcCgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gZ3VhcmQobUxvY2spOwogICAgIGlmIChtUm9sZU1hcC5lbXB0eSgpKSB7CiAgICAgICAgIGdlbmVyYXRlUm9sZU1hcCgpOwogICAgIH0KQEAgLTk4Myw2ICsxNDQyLDExIEBACiB9CiAKIGNvbnN0IGNoYXIqIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpnZXRDb21tb25QcmVmaXgoKSBjb25zdCB7CisgICAgcmV0dXJuIG1JbXBsLT5nZXRDb21tb25QcmVmaXgoKTsKK30KKworY29uc3QgY2hhciogTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OmdldENvbW1vblByZWZpeCgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gZ3VhcmQobUxvY2spOwogICAgIGlmIChtQ29tbW9uUHJlZml4LmVtcHR5KCkpIHsKICAgICAgICAgZ2VuZXJhdGVDb21tb25QcmVmaXgoKTsKICAgICB9CkBAIC05OTAsMTQgKzE0NTQsMTggQEAKIH0KIAogc3RhdHVzX3QgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdldFBhcnNpbmdTdGF0dXMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1QYXJzaW5nU3RhdHVzOworICAgIHJldHVybiBtSW1wbC0+Z2V0UGFyc2luZ1N0YXR1cygpOwogfQogCi12b2lkIE1lZGlhQ29kZWNzWG1sUGFyc2VyOjpnZW5lcmF0ZVJvbGVNYXAoKSBjb25zdCB7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBjb2RlYyA6IG1Db2RlY01hcCkgewotICAgICAgICBjb25zdCBhdXRvJiBjb2RlY05hbWUgPSBjb2RlYy5maXJzdDsKK3ZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OkltcGw6OmdlbmVyYXRlUm9sZU1hcCgpIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGNvZGVjIDogbURhdGEubUNvZGVjTWFwKSB7CisgICAgICAgIGNvbnN0IGF1dG8gJmNvZGVjTmFtZSA9IGNvZGVjLmZpcnN0OworICAgICAgICBpZiAoY29kZWNOYW1lID09ICI8ZHVtbXk+IikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KICAgICAgICAgYm9vbCBpc0VuY29kZXIgPSBjb2RlYy5zZWNvbmQuaXNFbmNvZGVyOwogICAgICAgICBzaXplX3Qgb3JkZXIgPSBjb2RlYy5zZWNvbmQub3JkZXI7CisgICAgICAgIHN0ZDo6c3RyaW5nIHJhbmsgPSBjb2RlYy5zZWNvbmQucmFuazsKICAgICAgICAgY29uc3QgYXV0byYgdHlwZU1hcCA9IGNvZGVjLnNlY29uZC50eXBlTWFwOwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHR5cGUgOiB0eXBlTWFwKSB7CiAgICAgICAgICAgICBjb25zdCBhdXRvJiB0eXBlTmFtZSA9IHR5cGUuZmlyc3Q7CkBAIC0xMDQxLDI1ICsxNTA5LDM1IEBACiAKICAgICAgICAgICAgIE5vZGVJbmZvIG5vZGVJbmZvOwogICAgICAgICAgICAgbm9kZUluZm8ubmFtZSA9IGNvZGVjTmFtZTsKKyAgICAgICAgICAgIC8vIE5PVEU6IG5vIGFsaWFzZXMgYXJlIGV4cG9zZWQgaW4gcm9sZSBpbmZvCisgICAgICAgICAgICAvLyBhdHRyaWJ1dGUgcXVpcmtzIGFyZSBleHBvc2VkIGFzIG5vZGUgYXR0cmlidXRlcwogICAgICAgICAgICAgbm9kZUluZm8uYXR0cmlidXRlTGlzdC5yZXNlcnZlKHR5cGVBdHRyaWJ1dGVNYXAuc2l6ZSgpKTsKICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgYXR0cmlidXRlIDogdHlwZUF0dHJpYnV0ZU1hcCkgewogICAgICAgICAgICAgICAgIG5vZGVJbmZvLmF0dHJpYnV0ZUxpc3QucHVzaF9iYWNrKAogICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRle2F0dHJpYnV0ZS5maXJzdCwgYXR0cmlidXRlLnNlY29uZH0pOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChjb25zdCBzdGQ6OnN0cmluZyAmcXVpcmsgOiBjb2RlYy5zZWNvbmQucXVpcmtTZXQpIHsKKyAgICAgICAgICAgICAgICBpZiAoc3RySGFzUHJlZml4KHF1aXJrLmNfc3RyKCksICJhdHRyaWJ1dGU6OiIpKSB7CisgICAgICAgICAgICAgICAgICAgIG5vZGVJbmZvLmF0dHJpYnV0ZUxpc3QucHVzaF9iYWNrKEF0dHJpYnV0ZXtxdWlyaywgInByZXNlbnQifSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFyYW5rLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBub2RlSW5mby5hdHRyaWJ1dGVMaXN0LnB1c2hfYmFjayhBdHRyaWJ1dGV7InJhbmsiLCByYW5rfSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBub2RlTGlzdC0+aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKAogICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUob3JkZXIpLCBzdGQ6Om1vdmUobm9kZUluZm8pKSk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXZvaWQgTWVkaWFDb2RlY3NYbWxQYXJzZXI6OmdlbmVyYXRlQ29tbW9uUHJlZml4KCkgY29uc3QgewotICAgIGlmIChtQ29kZWNNYXAuZW1wdHkoKSkgewordm9pZCBNZWRpYUNvZGVjc1htbFBhcnNlcjo6SW1wbDo6Z2VuZXJhdGVDb21tb25QcmVmaXgoKSBjb25zdCB7CisgICAgaWYgKG1EYXRhLm1Db2RlY01hcC5lbXB0eSgpKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgYXV0byBpID0gbUNvZGVjTWFwLmNiZWdpbigpOworICAgIGF1dG8gaSA9IG1EYXRhLm1Db2RlY01hcC5jYmVnaW4oKTsKICAgICBhdXRvIGZpcnN0ID0gaS0+Zmlyc3QuY2JlZ2luKCk7CiAgICAgYXV0byBsYXN0ID0gaS0+Zmlyc3QuY2VuZCgpOwotICAgIGZvciAoKytpOyBpICE9IG1Db2RlY01hcC5jZW5kKCk7ICsraSkgeworICAgIGZvciAoKytpOyBpICE9IG1EYXRhLm1Db2RlY01hcC5jZW5kKCk7ICsraSkgewogICAgICAgICBsYXN0ID0gc3RkOjptaXNtYXRjaCgKICAgICAgICAgICAgICAgICBmaXJzdCwgbGFzdCwgaS0+Zmlyc3QuY2JlZ2luKCksIGktPmZpcnN0LmNlbmQoKSkuZmlyc3Q7CiAgICAgfQpAQCAtMTA2Nyw0ICsxNTQ1LDMgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvYXBpL2N1cnJlbnQudHh0IGIvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL2FwaS9jdXJyZW50LnR4dAppbmRleCBmN2Y0YzM2Li4xNmM4YWY4IDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvYXBpL2N1cnJlbnQudHh0CisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9hcGkvY3VycmVudC50eHQKQEAgLTY4LDE2ICs2OCwyNiBAQAogICBwdWJsaWMgY2xhc3MgTWVkaWFDb2RlYyB7CiAgICAgY3RvciBwdWJsaWMgTWVkaWFDb2RlYygpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLkFsaWFzPiBnZXRBbGlhc19vcHRpb25hbCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLlF1aXJrPiBnZXRBdHRyaWJ1dGVfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXREb21haW4oKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRFbmFibGVkKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5jb2RlY3MuRmVhdHVyZT4gZ2V0RmVhdHVyZV9vcHRpb25hbCgpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLkxpbWl0PiBnZXRMaW1pdF9vcHRpb25hbCgpOwogICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKICAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5RdWlyaz4gZ2V0UXVpcmtfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRSYW5rKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpOwogICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLlR5cGU+IGdldFR5cGVfb3B0aW9uYWwoKTsKICAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRVcGRhdGUoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRWYXJpYW50KCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5jb2RlY3MuVmFyaWFudD4gZ2V0VmFyaWFudF9vcHRpb25hbCgpOworICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXREb21haW4oU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0RW5hYmxlZChTdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFJhbmsoU3RyaW5nKTsKICAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRVcGRhdGUoU3RyaW5nKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0VmFyaWFudChTdHJpbmcpOwogICB9CiAKICAgcHVibGljIGNsYXNzIE1lZGlhQ29kZWNzIHsKQEAgLTkxLDE0ICsxMDEsMTggQEAKICAgcHVibGljIGNsYXNzIFF1aXJrIHsKICAgICBjdG9yIHB1YmxpYyBRdWlyaygpOwogICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXRWYWx1ZSgpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFZhbHVlKFN0cmluZyk7CiAgIH0KIAogICBwdWJsaWMgY2xhc3MgU2V0dGluZyB7CiAgICAgY3RvciBwdWJsaWMgU2V0dGluZygpOworICAgIG1ldGhvZCBwdWJsaWMgU3RyaW5nIGdldEVuYWJsZWQoKTsKICAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXROYW1lKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0VXBkYXRlKCk7CiAgICAgbWV0aG9kIHB1YmxpYyBTdHJpbmcgZ2V0VmFsdWUoKTsKKyAgICBtZXRob2QgcHVibGljIHZvaWQgc2V0RW5hYmxlZChTdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyk7CiAgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldFVwZGF0ZShTdHJpbmcpOwogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRWYWx1ZShTdHJpbmcpOwpAQCAtMTA2LDcgKzEyMCw5IEBACiAKICAgcHVibGljIGNsYXNzIFNldHRpbmdzIHsKICAgICBjdG9yIHB1YmxpYyBTZXR0aW5ncygpOwotICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLlNldHRpbmc+IGdldFNldHRpbmcoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5TZXR0aW5nPiBnZXREb21haW5fb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5TZXR0aW5nPiBnZXRTZXR0aW5nX29wdGlvbmFsKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5jb2RlY3MuU2V0dGluZz4gZ2V0VmFyaWFudF9vcHRpb25hbCgpOwogICB9CiAKICAgcHVibGljIGNsYXNzIFR5cGUgewpAQCAtMTIwLDYgKzEzNiwxNyBAQAogICAgIG1ldGhvZCBwdWJsaWMgdm9pZCBzZXRVcGRhdGUoU3RyaW5nKTsKICAgfQogCisgIHB1YmxpYyBjbGFzcyBWYXJpYW50IHsKKyAgICBjdG9yIHB1YmxpYyBWYXJpYW50KCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5jb2RlY3MuQWxpYXM+IGdldEFsaWFzX29wdGlvbmFsKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5jb2RlY3MuUXVpcms+IGdldEF0dHJpYnV0ZV9vcHRpb25hbCgpOworICAgIG1ldGhvZCBwdWJsaWMgamF2YS51dGlsLkxpc3Q8bWVkaWEuY29kZWNzLkZlYXR1cmU+IGdldEZlYXR1cmVfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIGphdmEudXRpbC5MaXN0PG1lZGlhLmNvZGVjcy5MaW1pdD4gZ2V0TGltaXRfb3B0aW9uYWwoKTsKKyAgICBtZXRob2QgcHVibGljIFN0cmluZyBnZXROYW1lKCk7CisgICAgbWV0aG9kIHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxtZWRpYS5jb2RlY3MuUXVpcms+IGdldFF1aXJrX29wdGlvbmFsKCk7CisgICAgbWV0aG9kIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nKTsKKyAgfQorCiAgIHB1YmxpYyBjbGFzcyBYbWxQYXJzZXIgewogICAgIGN0b3IgcHVibGljIFhtbFBhcnNlcigpOwogICAgIG1ldGhvZCBwdWJsaWMgc3RhdGljIG1lZGlhLmNvZGVjcy5JbmNsdWRlZCByZWFkSW5jbHVkZWQoamF2YS5pby5JbnB1dFN0cmVhbSkgdGhyb3dzIGphdmF4LnhtbC5kYXRhdHlwZS5EYXRhdHlwZUNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIGphdmEuaW8uSU9FeGNlcHRpb24sIG9yZy54bWxwdWxsLnYxLlhtbFB1bGxQYXJzZXJFeGNlcHRpb247CmRpZmYgLS1naXQgYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvaW5jbHVkZS9tZWRpYS9zdGFnZWZyaWdodC94bWxwYXJzZXIvTWVkaWFDb2RlY3NYbWxQYXJzZXIuaCBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oCmluZGV4IGNjNjllNTIuLmUyMjQ0NTIgMTAwNjQ0Ci0tLSBhL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oCisrKyBiL21lZGlhL2xpYnN0YWdlZnJpZ2h0L3htbHBhcnNlci9pbmNsdWRlL21lZGlhL3N0YWdlZnJpZ2h0L3htbHBhcnNlci9NZWRpYUNvZGVjc1htbFBhcnNlci5oCkBAIC0xOSwzNCArMTksMzUgQEAKIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KIAotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogCitzdHJ1Y3QgWE1MX1BhcnNlclN0cnVjdDsgLy8gZnJvbSBleHBhdCBsaWJyYXJ5CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogY2xhc3MgTWVkaWFDb2RlY3NYbWxQYXJzZXIgewogcHVibGljOgogCi0gICAgLy8gVHJlYmxpemVkIG1lZGlhIGNvZGVjIGxpc3Qgd2lsbCBiZSBsb2NhdGVkIGluIC9vZG0vZXRjIG9yIC92ZW5kb3IvZXRjLgotICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBjb25zdCogZGVmYXVsdFNlYXJjaERpcnNbXSA9Ci0gICAgICAgICAgICB7Ii9vZG0vZXRjIiwgIi92ZW5kb3IvZXRjIiwgIi9ldGMiLCBudWxscHRyfTsKLSAgICBzdGF0aWMgY29uc3RleHByIGNoYXIgY29uc3QqIGRlZmF1bHRNYWluWG1sTmFtZSA9Ci0gICAgICAgICAgICAibWVkaWFfY29kZWNzLnhtbCI7Ci0gICAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIGNvbnN0KiBkZWZhdWx0UGVyZm9ybWFuY2VYbWxOYW1lID0KLSAgICAgICAgICAgICJtZWRpYV9jb2RlY3NfcGVyZm9ybWFuY2UueG1sIjsKKyAgICAvLyBUcmVibGl6ZWQgbWVkaWEgY29kZWMgbGlzdCB3aWxsIGJlIGxvY2F0ZWQgaW4gL3Byb2R1Y3QvZXRjLCAvb2RtL2V0YyBvcgorICAgIC8vIC92ZW5kb3IvZXRjLgorICAgIHN0YXRpYyBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZ2V0RGVmYXVsdFNlYXJjaERpcnMoKSB7CisgICAgICAgIHJldHVybiB7ICIvcHJvZHVjdC9ldGMiLAorICAgICAgICAgICAgICAgICAiL29kbS9ldGMiLAorICAgICAgICAgICAgICAgICAiL3ZlbmRvci9ldGMiLAorICAgICAgICAgICAgICAgICAiL3N5c3RlbS9ldGMiIH07CisgICAgfQorCisgICAgc3RhdGljIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBnZXREZWZhdWx0WG1sTmFtZXMoKTsKKwogICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBjb25zdCogZGVmYXVsdFByb2ZpbGluZ1Jlc3VsdHNYbWxQYXRoID0KICAgICAgICAgICAgICIvZGF0YS9taXNjL21lZGlhL21lZGlhX2NvZGVjc19wcm9maWxpbmdfcmVzdWx0cy54bWwiOwogCi0gICAgTWVkaWFDb2RlY3NYbWxQYXJzZXIoCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBjb25zdCogc2VhcmNoRGlycyA9IGRlZmF1bHRTZWFyY2hEaXJzLAotICAgICAgICAgICAgY29uc3QgY2hhciogbWFpblhtbE5hbWUgPSBkZWZhdWx0TWFpblhtbE5hbWUsCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBwZXJmb3JtYW5jZVhtbE5hbWUgPSBkZWZhdWx0UGVyZm9ybWFuY2VYbWxOYW1lLAotICAgICAgICAgICAgY29uc3QgY2hhciogcHJvZmlsaW5nUmVzdWx0c1htbFBhdGggPSBkZWZhdWx0UHJvZmlsaW5nUmVzdWx0c1htbFBhdGgpOworICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyKCk7CiAgICAgfk1lZGlhQ29kZWNzWG1sUGFyc2VyKCk7CiAKICAgICB0eXBlZGVmIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IEF0dHJpYnV0ZTsKQEAgLTU1LDcgKzU2LDcgQEAKICAgICB0eXBlZGVmIHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgQXR0cmlidXRlTWFwPiBUeXBlOwogICAgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEF0dHJpYnV0ZU1hcD4gVHlwZU1hcDsKIAotICAgIHR5cGVkZWYgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IFF1aXJrU2V0OworICAgIHR5cGVkZWYgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+IFN0cmluZ1NldDsKIAogICAgIC8qKgogICAgICAqIFByb3BlcnRpZXMgb2YgYSBjb2RlYyAobm9kZSkKQEAgLTYzLDggKzY0LDEyIEBACiAgICAgc3RydWN0IENvZGVjUHJvcGVydGllcyB7CiAgICAgICAgIGJvb2wgaXNFbmNvZGVyOyAgICAvLy88IFdoZXRoZXIgdGhpcyBjb2RlYyBpcyBhbiBlbmNvZGVyIG9yIGEgZGVjb2RlcgogICAgICAgICBzaXplX3Qgb3JkZXI7ICAgICAgLy8vPCBPcmRlciBvZiBhcHBlYXJhbmNlIGluIHRoZSBmaWxlIChzdGFydGluZyBmcm9tIDApCi0gICAgICAgIFF1aXJrU2V0IHF1aXJrU2V0OyAvLy88IFNldCBvZiBxdWlya3MgcmVxdWVzdGVkIGJ5IHRoaXMgY29kZWMKKyAgICAgICAgU3RyaW5nU2V0IHF1aXJrU2V0OyAvLy88IFNldCBvZiBxdWlya3MgcmVxdWVzdGVkIGJ5IHRoaXMgY29kZWMKKyAgICAgICAgU3RyaW5nU2V0IGRvbWFpblNldDsgLy8vPCBTZXQgb2YgZG9tYWlucyB0aGlzIGNvZGVjIGlzIGluCisgICAgICAgIFN0cmluZ1NldCB2YXJpYW50U2V0OyAvLy88IFNldCBvZiB2YXJpYW50cyB0aGlzIGNvZGVjIGlzIGVuYWJsZWQgb24KICAgICAgICAgVHlwZU1hcCB0eXBlTWFwOyAgIC8vLzwgTWFwIG9mIHR5cGVzIHN1cHBvcnRlZCBieSB0aGlzIGNvZGVjCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBhbGlhc2VzOyAvLy88IE5hbWUgYWxpYXNlcyBmb3IgdGhpcyBjb2RlYworICAgICAgICBzdGQ6OnN0cmluZyByYW5rOyAgLy8vPCBSYW5rIG9mIHRoaXMgY29kZWMuIFRoaXMgaXMgYSBudW1lcmljIHN0cmluZy4KICAgICB9OwogCiAgICAgdHlwZWRlZiBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIENvZGVjUHJvcGVydGllcz4gQ29kZWM7CkBAIC03Niw2ICs4MSw3IEBACiAgICAgc3RydWN0IE5vZGVJbmZvIHsKICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZTsKICAgICAgICAgc3RkOjp2ZWN0b3I8QXR0cmlidXRlPiBhdHRyaWJ1dGVMaXN0OworICAgICAgICAvLyBub3RlOiBhbGlhc2VzIGFyZSBub3QgZXhwb3NlZCBoZXJlIGFzIHRoZXkgYXJlIG5vdCBwYXJ0IG9mIHRoZSByb2xlIG1hcAogICAgIH07CiAKICAgICAvKioKQEAgLTExNiw2OSArMTIyLDMxIEBACiAKICAgICBzdGF0dXNfdCBnZXRQYXJzaW5nU3RhdHVzKCkgY29uc3Q7CiAKKyAgICAvKioKKyAgICAgKiBQYXJzZSB0b3AgbGV2ZWwgWE1MIGZpbGVzIGZyb20gYSBncm91cCBvZiBzZWFyY2ggZGlyZWN0b3JpZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW0geG1sRmlsZXMgb3JkZXJlZCBsaXN0IG9mIFhNTCBmaWxlIG5hbWVzIChubyBwYXRocykKKyAgICAgKiBAcGFyYW0gc2VhcmNoRGlycyBvcmRlcmVkIGxpc3Qgb2YgcGF0aHMgdG8gY29uc2lkZXIKKyAgICAgKgorICAgICAqIEByZXR1cm4gcGFyc2luZyBzdGF0dXMKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBwYXJzZVhtbEZpbGVzSW5TZWFyY2hEaXJzKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZ4bWxGaWxlcyA9IGdldERlZmF1bHRYbWxOYW1lcygpLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZzZWFyY2hEaXJzID0gZ2V0RGVmYXVsdFNlYXJjaERpcnMoKSk7CisKKworICAgIC8qKgorICAgICAqIFBhcnNlIGEgdG9wIGxldmVsIFhNTCBmaWxlLgorICAgICAqCisgICAgICogQHBhcmFtIHBhdGggWE1MIGZpbGUgcGF0aAorICAgICAqCisgICAgICogQHJldHVybiBwYXJzaW5nIHN0YXR1cworICAgICAqLworICAgIHN0YXR1c190IHBhcnNlWG1sUGF0aChjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCk7CisKIHByaXZhdGU6Ci0gICAgZW51bSBTZWN0aW9uIHsKLSAgICAgICAgU0VDVElPTl9UT1BMRVZFTCwKLSAgICAgICAgU0VDVElPTl9TRVRUSU5HUywKLSAgICAgICAgU0VDVElPTl9ERUNPREVSUywKLSAgICAgICAgU0VDVElPTl9ERUNPREVSLAotICAgICAgICBTRUNUSU9OX0RFQ09ERVJfVFlQRSwKLSAgICAgICAgU0VDVElPTl9FTkNPREVSUywKLSAgICAgICAgU0VDVElPTl9FTkNPREVSLAotICAgICAgICBTRUNUSU9OX0VOQ09ERVJfVFlQRSwKLSAgICAgICAgU0VDVElPTl9JTkNMVURFLAotICAgIH07Ci0KLSAgICBzdGF0dXNfdCBtUGFyc2luZ1N0YXR1czsKLSAgICBTZWN0aW9uIG1DdXJyZW50U2VjdGlvbjsKLSAgICBib29sIG1VcGRhdGU7Ci0gICAgc3RkOjp2ZWN0b3I8U2VjdGlvbj4gbVNlY3Rpb25TdGFjazsKLSAgICBzdGQ6OnN0cmluZyBtSHJlZkJhc2U7Ci0KLSAgICAvLyBTZXJ2aWNlIGF0dHJpYnV0ZXMKLSAgICBBdHRyaWJ1dGVNYXAgbVNlcnZpY2VBdHRyaWJ1dGVNYXA7Ci0KLSAgICAvLyBDb2RlYyBhdHRyaWJ1dGVzCi0gICAgc3RkOjpzdHJpbmcgbUN1cnJlbnROYW1lOwotICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBtQ29kZWNTZXQ7Ci0gICAgQ29kZWMgbUNvZGVjTGlzdFRlbXBbMjA0OF07Ci0gICAgQ29kZWNNYXAgbUNvZGVjTWFwOwotICAgIHNpemVfdCBtQ29kZWNDb3VudGVyOwotICAgIENvZGVjTWFwOjppdGVyYXRvciBtQ3VycmVudENvZGVjOwotICAgIFR5cGVNYXA6Oml0ZXJhdG9yIG1DdXJyZW50VHlwZTsKLQotICAgIC8vIFJvbGUgbWFwCi0gICAgbXV0YWJsZSBSb2xlTWFwIG1Sb2xlTWFwOwotCi0gICAgLy8gQ29tcHV0ZWQgbG9uZ2VzdCBjb21tb24gcHJlZml4Ci0gICAgbXV0YWJsZSBzdGQ6OnN0cmluZyBtQ29tbW9uUHJlZml4OwotCi0gICAgYm9vbCBwYXJzZVRvcExldmVsWE1MRmlsZShjb25zdCBjaGFyICpwYXRoLCBib29sIGlnbm9yZV9lcnJvcnMgPSBmYWxzZSk7Ci0KLSAgICB2b2lkIHBhcnNlWE1MRmlsZShjb25zdCBjaGFyICpwYXRoKTsKLQotICAgIHN0YXRpYyB2b2lkIFN0YXJ0RWxlbWVudEhhbmRsZXJXcmFwcGVyKAotICAgICAgICAgICAgdm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycyk7Ci0KLSAgICBzdGF0aWMgdm9pZCBFbmRFbGVtZW50SGFuZGxlcldyYXBwZXIodm9pZCAqbWUsIGNvbnN0IGNoYXIgKm5hbWUpOwotCi0gICAgdm9pZCBzdGFydEVsZW1lbnRIYW5kbGVyKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKiphdHRycyk7Ci0gICAgdm9pZCBlbmRFbGVtZW50SGFuZGxlcihjb25zdCBjaGFyICpuYW1lKTsKLQotICAgIHN0YXR1c190IGluY2x1ZGVYTUxGaWxlKGNvbnN0IGNoYXIgKiphdHRycyk7Ci0gICAgc3RhdHVzX3QgYWRkU2V0dGluZ0Zyb21BdHRyaWJ1dGVzKGNvbnN0IGNoYXIgKiphdHRycyk7Ci0gICAgc3RhdHVzX3QgYWRkTWVkaWFDb2RlY0Zyb21BdHRyaWJ1dGVzKGJvb2wgZW5jb2RlciwgY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICB2b2lkIGFkZE1lZGlhQ29kZWMoYm9vbCBlbmNvZGVyLCBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgY29uc3QgY2hhciAqdHlwZSA9IG51bGxwdHIpOwotCi0gICAgc3RhdHVzX3QgYWRkUXVpcmsoY29uc3QgY2hhciAqKmF0dHJzKTsKLSAgICBzdGF0dXNfdCBhZGRUeXBlRnJvbUF0dHJpYnV0ZXMoY29uc3QgY2hhciAqKmF0dHJzLCBib29sIGVuY29kZXIpOwotICAgIHN0YXR1c190IGFkZExpbWl0KGNvbnN0IGNoYXIgKiphdHRycyk7Ci0gICAgc3RhdHVzX3QgYWRkRmVhdHVyZShjb25zdCBjaGFyICoqYXR0cnMpOwotICAgIHZvaWQgYWRkVHlwZShjb25zdCBjaGFyICpuYW1lKTsKLQotICAgIHZvaWQgZ2VuZXJhdGVSb2xlTWFwKCkgY29uc3Q7Ci0gICAgdm9pZCBnZW5lcmF0ZUNvbW1vblByZWZpeCgpIGNvbnN0OworICAgIHN0cnVjdCBJbXBsOworICAgIHN0ZDo6c2hhcmVkX3B0cjxJbXBsPiBtSW1wbDsKIAogICAgIE1lZGlhQ29kZWNzWG1sUGFyc2VyKGNvbnN0IE1lZGlhQ29kZWNzWG1sUGFyc2VyJikgPSBkZWxldGU7CiAgICAgTWVkaWFDb2RlY3NYbWxQYXJzZXImIG9wZXJhdG9yPShjb25zdCBNZWRpYUNvZGVjc1htbFBhcnNlciYpID0gZGVsZXRlOwpAQCAtMTg3LDQgKzE1NSwzIEBACiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCiAKICNlbmRpZiAvLyBNRURJQV9TVEFHRUZSSUdIVF9YTUxQQVJTRVJfSF8KLQpkaWZmIC0tZ2l0IGEvbWVkaWEvbGlic3RhZ2VmcmlnaHQveG1scGFyc2VyL21lZGlhX2NvZGVjcy54c2QgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvbWVkaWFfY29kZWNzLnhzZAppbmRleCA3NzE5M2EyLi4zYjU2ODFmIDEwMDY0NAotLS0gYS9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvbWVkaWFfY29kZWNzLnhzZAorKysgYi9tZWRpYS9saWJzdGFnZWZyaWdodC94bWxwYXJzZXIvbWVkaWFfY29kZWNzLnhzZApAQCAtNDksMjQgKzQ5LDMzIEBACiAgICAgICAgIDwveHM6c2VxdWVuY2U+CiAgICAgPC94czpjb21wbGV4VHlwZT4KICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iU2V0dGluZ3MiPgotICAgICAgICA8eHM6c2VxdWVuY2U+Ci0gICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJTZXR0aW5nIiB0eXBlPSJTZXR0aW5nIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgotICAgICAgICA8L3hzOnNlcXVlbmNlPgorICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iU2V0dGluZyIgdHlwZT0iU2V0dGluZyIvPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVmFyaWFudCIgdHlwZT0iU2V0dGluZyIvPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRG9tYWluIiB0eXBlPSJTZXR0aW5nIi8+CisgICAgICAgIDwveHM6Y2hvaWNlPgogICAgIDwveHM6Y29tcGxleFR5cGU+CiAgICAgPHhzOmNvbXBsZXhUeXBlIG5hbWU9Ik1lZGlhQ29kZWMiPgogICAgICAgICA8eHM6Y2hvaWNlIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiPgogICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iUXVpcmsiIHR5cGU9IlF1aXJrIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBdHRyaWJ1dGUiIHR5cGU9IlF1aXJrIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CiAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJUeXBlIiB0eXBlPSJUeXBlIiBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+CiAgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJBbGlhcyIgdHlwZT0iQWxpYXMiIG1pbk9jY3Vycz0iMCIgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiLz4KICAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkxpbWl0IiB0eXBlPSJMaW1pdCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgogICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iRmVhdHVyZSIgdHlwZT0iRmVhdHVyZSIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iVmFyaWFudCIgdHlwZT0iVmFyaWFudCIgbWluT2NjdXJzPSIwIiBtYXhPY2N1cnM9InVuYm91bmRlZCIvPgogICAgICAgICA8L3hzOmNob2ljZT4KICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJuYW1lIiB0eXBlPSJ4czpzdHJpbmciLz4KICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ0eXBlIiB0eXBlPSJ4czpzdHJpbmciLz4KICAgICAgICAgPHhzOmF0dHJpYnV0ZSBuYW1lPSJ1cGRhdGUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InJhbmsiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImRvbWFpbiIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFyaWFudCIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0iZW5hYmxlZCIgdHlwZT0ieHM6c3RyaW5nIi8+CiAgICAgPC94czpjb21wbGV4VHlwZT4KICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iUXVpcmsiPgogICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9Im5hbWUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciLz4KICAgICA8L3hzOmNvbXBsZXhUeXBlPgogICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJUeXBlIj4KICAgICAgICAgPHhzOnNlcXVlbmNlPgpAQCAtOTcsOSArMTA2LDIwIEBACiAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0icmVxdWlyZWQiIHR5cGU9InhzOnN0cmluZyIvPgogICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InZhbHVlIiB0eXBlPSJ4czpzdHJpbmciLz4KICAgICA8L3hzOmNvbXBsZXhUeXBlPgorICAgIDx4czpjb21wbGV4VHlwZSBuYW1lPSJWYXJpYW50Ij4KKyAgICAgICAgPHhzOmNob2ljZSBtaW5PY2N1cnM9IjAiIG1heE9jY3Vycz0idW5ib3VuZGVkIj4KKyAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IlF1aXJrIiB0eXBlPSJRdWlyayIvPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQXR0cmlidXRlIiB0eXBlPSJRdWlyayIvPgorICAgICAgICAgICAgPHhzOmVsZW1lbnQgbmFtZT0iQWxpYXMiIHR5cGU9IkFsaWFzIi8+CisgICAgICAgICAgICA8eHM6ZWxlbWVudCBuYW1lPSJMaW1pdCIgdHlwZT0iTGltaXQiLz4KKyAgICAgICAgICAgIDx4czplbGVtZW50IG5hbWU9IkZlYXR1cmUiIHR5cGU9IkZlYXR1cmUiLz4KKyAgICAgICAgPC94czpjaG9pY2U+CisgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+CisgICAgPC94czpjb21wbGV4VHlwZT4KICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iU2V0dGluZyI+CiAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0ibmFtZSIgdHlwZT0ieHM6c3RyaW5nIi8+CiAgICAgICAgIDx4czphdHRyaWJ1dGUgbmFtZT0idmFsdWUiIHR5cGU9InhzOnN0cmluZyIvPgorICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9ImVuYWJsZWQiIHR5cGU9InhzOnN0cmluZyIvPgogICAgICAgICA8eHM6YXR0cmlidXRlIG5hbWU9InVwZGF0ZSIgdHlwZT0ieHM6c3RyaW5nIi8+CiAgICAgPC94czpjb21wbGV4VHlwZT4KICAgICA8eHM6Y29tcGxleFR5cGUgbmFtZT0iSW5jbHVkZSI+CmRpZmYgLS1naXQgYS9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLmJwIGIvbWVkaWEvbWVkaWFzZXJ2ZXIvQW5kcm9pZC5icAppbmRleCAxODZmOWVhLi5hOTY4ODkwIDEwMDY0NAotLS0gYS9tZWRpYS9tZWRpYXNlcnZlci9BbmRyb2lkLmJwCisrKyBiL21lZGlhL21lZGlhc2VydmVyL0FuZHJvaWQuYnAKQEAgLTMzLDYgKzMzLDcgQEAKICAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIiLAogICAgIF0sCiAKKyAgICAvLyBiYWNrIHRvIDMyLWJpdCwgYi8xMjY1MDI2MTMKICAgICBjb21waWxlX211bHRpbGliOiAiMzIiLAogCiAgICAgaW5pdF9yYzogWyJtZWRpYXNlcnZlci5yYyJdLApAQCAtNDIsNCArNDMsNSBAQAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCiAKKyAgICB2aW50Zl9mcmFnbWVudHM6IFsibWFuaWZlc3RfbWVkaWFfYzJfc29mdHdhcmUueG1sIl0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS9tZWRpYXNlcnZlci9tYW5pZmVzdF9tZWRpYV9jMl9zb2Z0d2FyZS54bWwgYi9tZWRpYS9tZWRpYXNlcnZlci9tYW5pZmVzdF9tZWRpYV9jMl9zb2Z0d2FyZS54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE5NjMzNgotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL21lZGlhc2VydmVyL21hbmlmZXN0X21lZGlhX2MyX3NvZnR3YXJlLnhtbApAQCAtMCwwICsxLDExIEBACis8bWFuaWZlc3QgdmVyc2lvbj0iMS4wIiB0eXBlPSJmcmFtZXdvcmsiPgorICAgIDxoYWw+CisgICAgICAgIDxuYW1lPmFuZHJvaWQuaGFyZHdhcmUubWVkaWEuYzI8L25hbWU+CisgICAgICAgIDx0cmFuc3BvcnQ+aHdiaW5kZXI8L3RyYW5zcG9ydD4KKyAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgorICAgICAgICA8aW50ZXJmYWNlPgorICAgICAgICAgICAgPG5hbWU+SUNvbXBvbmVudFN0b3JlPC9uYW1lPgorICAgICAgICAgICAgPGluc3RhbmNlPnNvZnR3YXJlPC9pbnN0YW5jZT4KKyAgICAgICAgPC9pbnRlcmZhY2U+CisgICAgPC9oYWw+Cis8L21hbmlmZXN0PgpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL0FuZHJvaWQuYnAgYi9tZWRpYS9tdHAvQW5kcm9pZC5icAppbmRleCAyY2Y5YjgyLi42NmEzMTM5IDEwMDY0NAotLS0gYS9tZWRpYS9tdHAvQW5kcm9pZC5icAorKysgYi9tZWRpYS9tdHAvQW5kcm9pZC5icApAQCAtNTQsNiArNTQsMyBAQAogICAgIF0sCiB9CiAKLXN1YmRpcnMgPSBbCi0gICAgInRlc3RzIiwKLV0KZGlmZiAtLWdpdCBhL21lZGlhL210cC9JTXRwSGFuZGxlLmggYi9tZWRpYS9tdHAvSU10cEhhbmRsZS5oCmluZGV4IGZkMTRiMTguLjA0MzVlODIgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9JTXRwSGFuZGxlLmgKKysrIGIvbWVkaWEvbXRwL0lNdHBIYW5kbGUuaApAQCAtMTYsNyArMTYsNyBAQAogI2lmbmRlZiBfSU1UUF9IQU5ETEVfSAogI2RlZmluZSBfSU1UUF9IQU5ETEVfSAogCi0jaW5jbHVkZSA8bGludXgvdXNiL2ZfbXRwLmg+CisjaW5jbHVkZSAiZl9tdHAuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwRmZzSGFuZGxlLmNwcCBiL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwCmluZGV4IGYyNWZjNzEuLmJkNmE2YzYgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwCisrKyBiL21lZGlhL210cC9NdHBGZnNIYW5kbGUuY3BwCkBAIC00Nyw2ICs0Nyw5IEBACiBjb25zdGV4cHIgdW5zaWduZWQgTUFYX0ZJTEVfQ0hVTktfU0laRSA9IEFJT19CVUZTX01BWCAqIEFJT19CVUZfTEVOOwogCiBjb25zdGV4cHIgdWludDMyX3QgTUFYX01UUF9GSUxFX1NJWkUgPSAweEZGRkZGRkZGOworLy8gTm90ZTogUE9MTF9USU1FT1VUX01TID0gMCBtZWFucyByZXR1cm4gaW1tZWRpYXRlbHkgaS5lLiBubyBzbGVlcC4KKy8vIEFuZCB0aGlzIHdpbGwgY2F1c2UgaGlnaCBDUFUgdXNhZ2UuCitjb25zdGV4cHIgaW50MzJfdCBQT0xMX1RJTUVPVVRfTVMgPSA1MDA7CiAKIHN0cnVjdCB0aW1lc3BlYyBaRVJPX1RJTUVPVVQgPSB7IDAsIDAgfTsKIApAQCAtMjEyLDcgKzIxNSw2IEBACiAgICAgdWludDE2X3QgdmFsdWUgPSBzZXR1cC0+d1ZhbHVlOwogICAgIHN0ZDo6dmVjdG9yPGNoYXI+IGJ1ZjsKICAgICBidWYucmVzaXplKGxlbmd0aCk7Ci0gICAgaW50IHJldCA9IDA7CiAKICAgICBpZiAoISh0eXBlICYgVVNCX0RJUl9JTikpIHsKICAgICAgICAgaWYgKDo6cmVhZChtQ29udHJvbCwgYnVmLmRhdGEoKSwgbGVuZ3RoKSAhPSBsZW5ndGgpIHsKQEAgLTIyNSw4ICsyMjcsOCBAQAogICAgICAgICBjYXNlIE1UUF9SRVFfUkVTRVQ6CiAgICAgICAgIGNhc2UgTVRQX1JFUV9DQU5DRUw6CiAgICAgICAgICAgICBlcnJubyA9IEVDQU5DRUxFRDsKLSAgICAgICAgICAgIHJldCA9IC0xOwotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIC8vICAgIGJyZWFrOwogICAgICAgICBjYXNlIE1UUF9SRVFfR0VUX0RFVklDRV9TVEFUVVM6CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmIChsZW5ndGggPCBzaXplb2Yoc3RydWN0IG10cF9kZXZpY2Vfc3RhdHVzKSArIDQpIHsKQEAgLTMwNiw3ICszMDgsNyBAQAogICAgIGludCBlcnJvciA9IDA7CiAKICAgICB3aGlsZSAobnVtX2V2ZW50cyA8IG1pbl9ldmVudHMpIHsKLSAgICAgICAgaWYgKHBvbGwobVBvbGxGZHMsIDIsIDApID09IC0xKSB7CisgICAgICAgIGlmIChwb2xsKG1Qb2xsRmRzLCAyLCBQT0xMX1RJTUVPVVRfTVMpID09IC0xKSB7CiAgICAgICAgICAgICBQTE9HKEVSUk9SKSA8PCAiTXRwIGVycm9yIGR1cmluZyBwb2xsKCkiOwogICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICB9CmRpZmYgLS1naXQgYS9tZWRpYS9tdHAvTXRwU2VydmVyLmNwcCBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCmluZGV4IGNjZGRkNmUuLmEyOTE5MzkgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCisrKyBiL21lZGlhL210cC9NdHBTZXJ2ZXIuY3BwCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSAiTXRwU2VydmVyLmgiCiAjaW5jbHVkZSAiTXRwU3RvcmFnZS5oIgogI2luY2x1ZGUgIk10cFN0cmluZ0J1ZmZlci5oIgorI2luY2x1ZGUgImFuZHJvaWQtYmFzZS9zdHJpbmdzLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtOTksNiArMTAwLDcgQEAKICAgICBNVFBfRVZFTlRfU1RPUkVfQURERUQsCiAgICAgTVRQX0VWRU5UX1NUT1JFX1JFTU9WRUQsCiAgICAgTVRQX0VWRU5UX0RFVklDRV9QUk9QX0NIQU5HRUQsCisgICAgTVRQX0VWRU5UX09CSkVDVF9JTkZPX0NIQU5HRUQsCiB9OwogCiBNdHBTZXJ2ZXI6Ok10cFNlcnZlcihJTXRwRGF0YWJhc2UqIGRhdGFiYXNlLCBpbnQgY29udHJvbEZkLCBib29sIHB0cCwKQEAgLTI1OSw2ICsyNjEsMTEgQEAKICAgICBzZW5kRXZlbnQoTVRQX0VWRU5UX09CSkVDVF9SRU1PVkVELCBoYW5kbGUpOwogfQogCit2b2lkIE10cFNlcnZlcjo6c2VuZE9iamVjdEluZm9DaGFuZ2VkKE10cE9iamVjdEhhbmRsZSBoYW5kbGUpIHsKKyAgICBBTE9HVigic2VuZE9iamVjdEluZm9DaGFuZ2VkICVkXG4iLCBoYW5kbGUpOworICAgIHNlbmRFdmVudChNVFBfRVZFTlRfT0JKRUNUX0lORk9fQ0hBTkdFRCwgaGFuZGxlKTsKK30KKwogdm9pZCBNdHBTZXJ2ZXI6OnNlbmRTdG9yZUFkZGVkKE10cFN0b3JhZ2VJRCBpZCkgewogICAgIEFMT0dWKCJzZW5kU3RvcmVBZGRlZCAlMDhYXG4iLCBpZCk7CiAgICAgc2VuZEV2ZW50KE1UUF9FVkVOVF9TVE9SRV9BRERFRCwgaWQpOwpAQCAtNDQyLDYgKzQ0OSw5IEBACiAgICAgICAgICAgICBicmVhazsKICAgICB9CiAKKyAgICBpZiAocmVzcG9uc2UgIT0gTVRQX1JFU1BPTlNFX09LKQorICAgICAgQUxPR1coIltNVFBdIGdvdCByZXNwb25zZSAweCVYIGluIGNvbW1hbmQgJXMgKCV4KSIsIHJlc3BvbnNlLAorICAgICAgICAgICAgTXRwRGVidWc6OmdldE9wZXJhdGlvbkNvZGVOYW1lKG9wZXJhdGlvbiksIG9wZXJhdGlvbik7CiAgICAgaWYgKHJlc3BvbnNlID09IE1UUF9SRVNQT05TRV9UUkFOU0FDVElPTl9DQU5DRUxMRUQpCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICBtUmVzcG9uc2Uuc2V0UmVzcG9uc2VDb2RlKHJlc3BvbnNlKTsKQEAgLTY1Miw4ICs2NjIsOCBAQAogICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSQU1FVEVSOwogICAgIE10cE9iamVjdEhhbmRsZSBoYW5kbGUgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMSk7CiAgICAgTXRwT2JqZWN0UHJvcGVydHkgcHJvcGVydHkgPSBtUmVxdWVzdC5nZXRQYXJhbWV0ZXIoMik7Ci0gICAgQUxPR1YoIkdldE9iamVjdFByb3BWYWx1ZSAlZCAlc1xuIiwgaGFuZGxlLAotICAgICAgICAgICAgTXRwRGVidWc6OmdldE9iamVjdFByb3BDb2RlTmFtZShwcm9wZXJ0eSkpOworICAgIEFMT0dWKCJHZXRPYmplY3RQcm9wVmFsdWUgJWQgJXMgKDB4JTA0WClcbiIsIGhhbmRsZSwKKyAgICAgICAgICBNdHBEZWJ1Zzo6Z2V0T2JqZWN0UHJvcENvZGVOYW1lKHByb3BlcnR5KSwgcHJvcGVydHkpOwogCiAgICAgcmV0dXJuIG1EYXRhYmFzZS0+Z2V0T2JqZWN0UHJvcGVydHlWYWx1ZShoYW5kbGUsIHByb3BlcnR5LCBtRGF0YSk7CiB9CkBAIC05NDYsNyArOTU2LDEzIEBACiAgICAgaWYgKCFtRGF0YS5nZXRTdHJpbmcobW9kaWZpZWQpKSByZXR1cm4gTVRQX1JFU1BPTlNFX0lOVkFMSURfUEFSQU1FVEVSOyAgICAgLy8gZGF0ZSBtb2RpZmllZAogICAgIC8vIGtleXdvcmRzIGZvbGxvdwogCi0gICAgQUxPR1YoIm5hbWU6ICVzIGZvcm1hdDogJTA0WFxuIiwgKGNvbnN0IGNoYXIgKiluYW1lLCBmb3JtYXQpOworICAgIGludCB0eXBlID0gc3RvcmFnZS0+Z2V0VHlwZSgpOworICAgIGlmICh0eXBlID09IE1UUF9TVE9SQUdFX1JFTU9WQUJMRV9SQU0pIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgc3RyID0gYW5kcm9pZDo6YmFzZTo6VHJpbSgoY29uc3QgY2hhciopbmFtZSk7CisgICAgICAgIG5hbWUuc2V0KHN0ci5jX3N0cigpKTsKKyAgICB9CisgICAgQUxPR1YoIm5hbWU6ICVzIGZvcm1hdDogMHglMDRYICglcylcbiIsIChjb25zdCBjaGFyKiluYW1lLCBmb3JtYXQsCisgICAgICAgICAgTXRwRGVidWc6OmdldEZvcm1hdENvZGVOYW1lKGZvcm1hdCkpOwogICAgIHRpbWVfdCBtb2RpZmllZFRpbWU7CiAgICAgaWYgKCFwYXJzZURhdGVUaW1lKG1vZGlmaWVkLCBtb2RpZmllZFRpbWUpKQogICAgICAgICBtb2RpZmllZFRpbWUgPSAwOwpAQCAtOTY3LDkgKzk4MywxMCBAQAogICAgICAgICAgICAgcmV0dXJuIE1UUF9SRVNQT05TRV9PQkpFQ1RfVE9PX0xBUkdFOwogICAgIH0KIAotICAgIEFMT0dEKCJwYXRoOiAlcyBwYXJlbnQ6ICVkIHN0b3JhZ2VJRDogJTA4WCIsIChjb25zdCBjaGFyKilwYXRoLCBwYXJlbnQsIHN0b3JhZ2VJRCk7CisgICAgQUxPR1YoInBhdGg6ICVzIHBhcmVudDogJWQgc3RvcmFnZUlEOiAlMDhYIiwgKGNvbnN0IGNoYXIqKXBhdGgsIHBhcmVudCwgc3RvcmFnZUlEKTsKICAgICBNdHBPYmplY3RIYW5kbGUgaGFuZGxlID0gbURhdGFiYXNlLT5iZWdpblNlbmRPYmplY3QoKGNvbnN0IGNoYXIqKXBhdGgsIGZvcm1hdCwKICAgICAgICAgICAgIHBhcmVudCwgc3RvcmFnZUlEKTsKKyAgICBBTE9HRCgiaGFuZGxlOiAlZCwgcGFyZW50OiAlZCwgc3RvcmFnZUlEOiAlMDhYIiwgaGFuZGxlLCBwYXJlbnQsIHN0b3JhZ2VJRCk7CiAgICAgaWYgKGhhbmRsZSA9PSBrSW52YWxpZE9iamVjdEhhbmRsZSkgewogICAgICAgICByZXR1cm4gTVRQX1JFU1BPTlNFX0dFTkVSQUxfRVJST1I7CiAgICAgfQpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL010cFNlcnZlci5oIGIvbWVkaWEvbXRwL010cFNlcnZlci5oCmluZGV4IGY2OTM5ZDcuLjFmODc5OWYgMTAwNjQ0Ci0tLSBhL21lZGlhL210cC9NdHBTZXJ2ZXIuaAorKysgYi9tZWRpYS9tdHAvTXRwU2VydmVyLmgKQEAgLTExNSw2ICsxMTUsNyBAQAogCiAgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kT2JqZWN0QWRkZWQoTXRwT2JqZWN0SGFuZGxlIGhhbmRsZSk7CiAgICAgdm9pZCAgICAgICAgICAgICAgICBzZW5kT2JqZWN0UmVtb3ZlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKKyAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRPYmplY3RJbmZvQ2hhbmdlZChNdHBPYmplY3RIYW5kbGUgaGFuZGxlKTsKICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmREZXZpY2VQcm9wZXJ0eUNoYW5nZWQoTXRwRGV2aWNlUHJvcGVydHkgcHJvcGVydHkpOwogCiBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvbWVkaWEvbXRwL2ZfbXRwLmggYi9tZWRpYS9tdHAvZl9tdHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmVjNzcxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvbXRwL2ZfbXRwLmgKQEAgLTAsMCArMSw0MyBAQAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKioqCisgKioqICAgVGhpcyBoZWFkZXIgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGZyb20gYSBMaW51eCBrZXJuZWwgaGVhZGVyCisgKioqICAgb2YgdGhlIHNhbWUgbmFtZSwgdG8gbWFrZSBpbmZvcm1hdGlvbiBuZWNlc3NhcnkgZm9yIHVzZXJzcGFjZSB0bworICoqKiAgIGNhbGwgaW50byB0aGUga2VybmVsIGF2YWlsYWJsZSB0byBsaWJjLiAgSXQgY29udGFpbnMgb25seSBjb25zdGFudHMsCisgKioqICAgc3RydWN0dXJlcywgYW5kIG1hY3JvcyBnZW5lcmF0ZWQgZnJvbSB0aGUgb3JpZ2luYWwgaGVhZGVyLCBhbmQgdGh1cywKKyAqKiogICBjb250YWlucyBubyBjb3B5cmlnaHRhYmxlIGluZm9ybWF0aW9uLgorICoqKgorICoqKiAgIFRvIGVkaXQgdGhlIGNvbnRlbnQgb2YgdGhpcyBoZWFkZXIsIG1vZGlmeSB0aGUgY29ycmVzcG9uZGluZworICoqKiAgIHNvdXJjZSBmaWxlIChlLmcuIHVuZGVyIGV4dGVybmFsL2tlcm5lbC1oZWFkZXJzL29yaWdpbmFsLykgdGhlbgorICoqKiAgIHJ1biBiaW9uaWMvbGliYy9rZXJuZWwvdG9vbHMvdXBkYXRlX2FsbC5weQorICoqKgorICoqKiAgIEFueSBtYW51YWwgY2hhbmdlIGhlcmUgd2lsbCBiZSBsb3N0IHRoZSBuZXh0IHRpbWUgdGhpcyBzY3JpcHQgd2lsbAorICoqKiAgIGJlIHJ1bi4gWW91J3ZlIGJlZW4gd2FybmVkIQorICoqKgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2lmbmRlZiBfVUFQSV9MSU5VWF9VU0JfRl9NVFBfSAorI2RlZmluZSBfVUFQSV9MSU5VWF9VU0JfRl9NVFBfSAorI2luY2x1ZGUgPGxpbnV4L2lvY3RsLmg+CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKy8qIFdBUk5JTkc6IERPIE5PVCBFRElULCBBVVRPLUdFTkVSQVRFRCBDT0RFIC0gU0VFIFRPUCBGT1IgSU5TVFJVQ1RJT05TICovCitzdHJ1Y3QgbXRwX2ZpbGVfcmFuZ2UgeworICBpbnQgZmQ7CisgIGxvZmZfdCBvZmZzZXQ7CisgIGludDY0X3QgbGVuZ3RoOworLyogV0FSTklORzogRE8gTk9UIEVESVQsIEFVVE8tR0VORVJBVEVEIENPREUgLSBTRUUgVE9QIEZPUiBJTlNUUlVDVElPTlMgKi8KKyAgdWludDE2X3QgY29tbWFuZDsKKyAgdWludDMyX3QgdHJhbnNhY3Rpb25faWQ7Cit9Oworc3RydWN0IG10cF9ldmVudCB7CisvKiBXQVJOSU5HOiBETyBOT1QgRURJVCwgQVVUTy1HRU5FUkFURUQgQ09ERSAtIFNFRSBUT1AgRk9SIElOU1RSVUNUSU9OUyAqLworICBzaXplX3QgbGVuZ3RoOworICB2b2lkICogZGF0YTsKK307CisjZGVmaW5lIE1UUF9TRU5EX0ZJTEUgX0lPVygnTScsIDAsIHN0cnVjdCBtdHBfZmlsZV9yYW5nZSkKKy8qIFdBUk5JTkc6IERPIE5PVCBFRElULCBBVVRPLUdFTkVSQVRFRCBDT0RFIC0gU0VFIFRPUCBGT1IgSU5TVFJVQ1RJT05TICovCisjZGVmaW5lIE1UUF9SRUNFSVZFX0ZJTEUgX0lPVygnTScsIDEsIHN0cnVjdCBtdHBfZmlsZV9yYW5nZSkKKyNkZWZpbmUgTVRQX1NFTkRfRVZFTlQgX0lPVygnTScsIDMsIHN0cnVjdCBtdHBfZXZlbnQpCisjZGVmaW5lIE1UUF9TRU5EX0ZJTEVfV0lUSF9IRUFERVIgX0lPVygnTScsIDQsIHN0cnVjdCBtdHBfZmlsZV9yYW5nZSkKKyNlbmRpZgorLyogV0FSTklORzogRE8gTk9UIEVESVQsIEFVVE8tR0VORVJBVEVEIENPREUgLSBTRUUgVE9QIEZPUiBJTlNUUlVDVElPTlMgKi8KZGlmZiAtLWdpdCBhL21lZGlhL25kay9BbmRyb2lkLmJwIGIvbWVkaWEvbmRrL0FuZHJvaWQuYnAKaW5kZXggZjIzZGE5YS4uMjRjYWQ0ZCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL0FuZHJvaWQuYnAKKysrIGIvbWVkaWEvbmRrL0FuZHJvaWQuYnAKQEAgLTMxLDYgKzMxLDEzIEBACiAgICAgbGljZW5zZTogIk5PVElDRSIsCiB9CiAKKy8vIGZvciB1c2Ugd2l0aCBoZWFkZXJfbGlicworY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibWVkaWFfbmRrX2hlYWRlcnMiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0KK30KKwogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJtZWRpYW5kayIsCiAKQEAgLTQ3LDcgKzU0LDYgQEAKICAgICBdLAogCiAgICAgaW5jbHVkZV9kaXJzOiBbCi0gICAgICAgICJiaW9uaWMvbGliYy9wcml2YXRlIiwKICAgICAgICAgImZyYW1ld29ya3MvYmFzZS9jb3JlL2puaSIsCiAgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAogICAgICAgICAic3lzdGVtL21lZGlhL2NhbWVyYS9pbmNsdWRlIiwKQEAgLTU1LDcgKzYxLDYgQEAKIAogICAgIGNmbGFnczogWwogICAgICAgICAiLURFWFBPUlQ9X19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eShcImRlZmF1bHRcIikpKSIsCi0KICAgICAgICAgIi1XZXJyb3IiLAogICAgICAgICAiLVdhbGwiLAogICAgIF0sCkBAIC02NCwxNCArNjksMjEgQEAKICAgICAgICAgImxpYmdyYWxsb2N1c2FnZSIsCiAgICAgXSwKIAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYWRybV9oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAogICAgICAgICAibGliYW5kcm9pZF9ydW50aW1lX2xhenkiLAorICAgICAgICAibGliYmFzZSIsCiAgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliZGF0YXNvdXJjZSIsCiAgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYWRybSIsCiAgICAgICAgICJsaWJtZWRpYV9vbXgiLAogICAgICAgICAibGlibWVkaWFfam5pX3V0aWxzIiwKLSAgICAgICAgImxpYm1lZGlhZHJtIiwKLSAgICAgICAgImxpYm1lZGlhZXh0cmFjdG9yIiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKICAgICAgICAgImxpYnN0YWdlZnJpZ2h0X2ZvdW5kYXRpb24iLAogICAgICAgICAibGlibG9nIiwKQEAgLTc5LDE4ICs5MSwxOCBAQAogICAgICAgICAibGliY3V0aWxzIiwKICAgICAgICAgImxpYm5hdGl2ZXdpbmRvdyIsCiAgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliaGlkbGJhc2UiLAogICAgICAgICAibGliZ3VpIiwKICAgICAgICAgImxpYnVpIiwKLSAgICBdLAotCi0gICAgcmVxdWlyZWQ6IFsKLSAgICAgICAgLy8gbGlibWVkaWFuZGsgbWF5IGJlIHVzZWQgYnkgSmF2YSBhbmQgbm9uLUphdmEgdGhpbmdzLiBXaGVuIGxvd2VyLWxldmVsIHRoaW5ncyB1c2UgaXQsCi0gICAgICAgIC8vIHRoZXkgc2hvdWxkbid0IGhhdmUgdG8gdGFrZSBvbiB0aGUgY29zdCBvZiBsb2FkaW5nIGxpYmFuZHJvaWRfcnVudGltZS4KLSAgICAgICAgImxpYmFuZHJvaWRfcnVudGltZSIsCisgICAgICAgICJsaWJtZWRpYW5ka191dGlscyIsCiAgICAgXSwKIAogICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAogCisgICAgZXhwb3J0X3NoYXJlZF9saWJfaGVhZGVyczogWworICAgICAgICAibGliZ3VpIiwKKyAgICBdLAorCiAgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKICAgICAgICAgcGRrOiB7CiAgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKQEAgLTEwMSwxNCArMTEzLDcyIEBACiAgICAgICAgIHN5bWJvbF9maWxlOiAibGlibWVkaWFuZGsubWFwLnR4dCIsCiAgICAgICAgIHZlcnNpb25zOiBbIjI5Il0sCiAgICAgfSwKLQotICAgIC8vIEJ1ZzogaHR0cDovL2IvMTI0NTIyOTk1IGxpYm1lZGlhbmRrIGhhcyBsaW5rZXIgZXJyb3JzIHdoZW4gYnVpbHQgd2l0aAotICAgIC8vIGNvdmVyYWdlCi0gICAgbmF0aXZlX2NvdmVyYWdlOiBmYWxzZSwKIH0KIAogbGxuZGtfbGlicmFyeSB7CiAgICAgbmFtZTogImxpYm1lZGlhbmRrIiwKICAgICBzeW1ib2xfZmlsZTogImxpYm1lZGlhbmRrLm1hcC50eHQiLAotICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiaW5jbHVkZSJdLAorICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnkgeworICAgIG5hbWU6ICJsaWJtZWRpYW5ka191dGlscyIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJOZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3MuY3BwIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsvaW5jbHVkZSIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImluY2x1ZGUiLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICBdLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCIsCisgICAgc3JjczogWyJ0ZXN0cy9BSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LmNwcCJdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGlibWVkaWFuZGsiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJuYXRpdmV3aW5kb3ciLAorICAgICAgICAibGliZ3VpIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnVpIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmdyYXBoaWNzLmJ1ZmZlcnF1ZXVlQDEuMCIsCisgICAgXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1EX19BTkRST0lEX1ZOREtfXyIsCisgICAgXSwKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbmRrLyIsCisgICAgXSwKIH0KZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtJbWFnZS5jcHAgYi9tZWRpYS9uZGsvTmRrSW1hZ2UuY3BwCmluZGV4IDE4ODNmNjMuLjExNDViN2IgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtJbWFnZS5jcHAKKysrIGIvbWVkaWEvbmRrL05ka0ltYWdlLmNwcApAQCAtMzUsNiArMzUsNyBAQAogICAgICAgICBpbnQ2NF90IHRpbWVzdGFtcCwgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgbnVtUGxhbmVzKSA6CiAgICAgICAgIG1SZWFkZXIocmVhZGVyKSwgbUZvcm1hdChmb3JtYXQpLCBtVXNhZ2UodXNhZ2UpLCBtQnVmZmVyKGJ1ZmZlciksIG1Mb2NrZWRCdWZmZXIobnVsbHB0ciksCiAgICAgICAgIG1UaW1lc3RhbXAodGltZXN0YW1wKSwgbVdpZHRoKHdpZHRoKSwgbUhlaWdodChoZWlnaHQpLCBtTnVtUGxhbmVzKG51bVBsYW5lcykgeworICAgIExPR19GQVRBTF9JRihyZWFkZXIgPT0gbnVsbHB0ciwgIkFJbWFnZVJlYWRlciBzaG91bGRuJ3QgYmUgbnVsbCB3aGlsZSBjcmVhdGluZyBBSW1hZ2UiKTsKIH0KIAogQUltYWdlOjp+QUltYWdlKCkgewpAQCAtNTcsMTQgKzU4LDkgQEAKICAgICBpZiAobUlzQ2xvc2VkKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgc3A8QUltYWdlUmVhZGVyPiByZWFkZXIgPSBtUmVhZGVyLnByb21vdGUoKTsKLSAgICBpZiAocmVhZGVyICE9IG51bGxwdHIpIHsKLSAgICAgICAgcmVhZGVyLT5yZWxlYXNlSW1hZ2VMb2NrZWQodGhpcywgcmVsZWFzZUZlbmNlRmQpOwotICAgIH0gZWxzZSBpZiAobUJ1ZmZlciAhPSBudWxscHRyKSB7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzOiBwYXJlbnQgQUltYWdlUmVhZGVyIGNsb3NlZCB3aXRob3V0IHJlbGVhc2luZyBpbWFnZSAlcCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB0aGlzKTsKKyAgICBpZiAoIW1SZWFkZXItPm1Jc0Nsb3NlZCkgeworICAgICAgICBtUmVhZGVyLT5yZWxlYXNlSW1hZ2VMb2NrZWQodGhpcywgcmVsZWFzZUZlbmNlRmQpOwogICAgIH0KLQogICAgIC8vIFNob3VsZCBoYXZlIGJlZW4gc2V0IHRvIG51bGxwdHIgaW4gcmVsZWFzZUltYWdlTG9ja2VkCiAgICAgLy8gU2V0IHRvIG51bGxwdHIgaGVyZSBmb3IgZXh0cmEgc2FmZXR5IG9ubHkKICAgICBtQnVmZmVyID0gbnVsbHB0cjsKQEAgLTgzLDIyICs3OSwxMiBAQAogCiB2b2lkCiBBSW1hZ2U6OmxvY2tSZWFkZXIoKSBjb25zdCB7Ci0gICAgc3A8QUltYWdlUmVhZGVyPiByZWFkZXIgPSBtUmVhZGVyLnByb21vdGUoKTsKLSAgICBpZiAocmVhZGVyID09IG51bGxwdHIpIHsKLSAgICAgICAgLy8gUmVhZGVyIGhhcyBiZWVuIGNsb3NlZAotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHJlYWRlci0+bUxvY2subG9jaygpOworICAgIG1SZWFkZXItPm1Mb2NrLmxvY2soKTsKIH0KIAogdm9pZAogQUltYWdlOjp1bmxvY2tSZWFkZXIoKSBjb25zdCB7Ci0gICAgc3A8QUltYWdlUmVhZGVyPiByZWFkZXIgPSBtUmVhZGVyLnByb21vdGUoKTsKLSAgICBpZiAocmVhZGVyID09IG51bGxwdHIpIHsKLSAgICAgICAgLy8gUmVhZGVyIGhhcyBiZWVuIGNsb3NlZAotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIHJlYWRlci0+bUxvY2sudW5sb2NrKCk7CisgICAgbVJlYWRlci0+bUxvY2sudW5sb2NrKCk7CiB9CiAKIG1lZGlhX3N0YXR1c190CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrSW1hZ2VQcml2LmggYi9tZWRpYS9uZGsvTmRrSW1hZ2VQcml2LmgKaW5kZXggZTBmMTZkYS4uMGU4Y2JjYiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka0ltYWdlUHJpdi5oCisrKyBiL21lZGlhL25kay9OZGtJbWFnZVByaXYuaApAQCAtNzIsNyArNzIsNyBAQAogICAgIHVpbnQzMl90IGdldEpwZWdTaXplKCkgY29uc3Q7CiAKICAgICAvLyBXaGVuIHJlYWRlciBpcyBjbG9zZSwgQUltYWdlIHdpbGwgb25seSBhY2NlcHQgY2xvc2UgQVBJIGNhbGwKLSAgICB3cDxBSW1hZ2VSZWFkZXI+ICAgICAgICAgICBtUmVhZGVyOworICAgIGNvbnN0IHNwPEFJbWFnZVJlYWRlcj4gICAgIG1SZWFkZXI7CiAgICAgY29uc3QgaW50MzJfdCAgICAgICAgICAgICAgbUZvcm1hdDsKICAgICBjb25zdCB1aW50NjRfdCAgICAgICAgICAgICBtVXNhZ2U7ICAvLyBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfKiBmbGFncy4KICAgICBCdWZmZXJJdGVtKiAgICAgICAgICAgICAgICBtQnVmZmVyOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcCBiL21lZGlhL25kay9OZGtJbWFnZVJlYWRlci5jcHAKaW5kZXggOWQwMGRmNi4uYzBjZWIzZCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXIuY3BwCkBAIC0yMSw2ICsyMSw3IEBACiAKICNpbmNsdWRlICJOZGtJbWFnZVByaXYuaCIKICNpbmNsdWRlICJOZGtJbWFnZVJlYWRlclByaXYuaCIKKyNpbmNsdWRlIDxwcml2YXRlL21lZGlhL05ka0ltYWdlLmg+CiAKICNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0yOCw2ICsyOSw3IEBACiAjaW5jbHVkZSA8dWkvUHVibGljRm9ybWF0Lmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkL0FIYXJkd2FyZUJ1ZmZlckhlbHBlcnMuaD4KICNpbmNsdWRlIDxncmFsbG9jdXNhZ2UvR3JhbGxvY1VzYWdlQ29udmVyc2lvbi5oPgorI2luY2x1ZGUgPGd1aS9idWZmZXJxdWV1ZS8xLjAvV0dyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApAQCAtNDMsNiArNDUsMTAgQEAKIGNvbnN0IGNoYXIqIEFJbWFnZVJlYWRlcjo6a0NvbnRleHRLZXkgICAgPSAiQ29udGV4dCI7CiBjb25zdCBjaGFyKiBBSW1hZ2VSZWFkZXI6OmtHcmFwaGljQnVmZmVyS2V5ID0gIkdyYXBoaWNCdWZmZXIiOwogCitzdGF0aWMgY29uc3RleHByIGludCBrV2luZG93SGFsVG9rZW5TaXplTWF4ID0gMjU2OworCitzdGF0aWMgbmF0aXZlX2hhbmRsZV90ICpjb252ZXJ0SGFsVG9rZW5Ub05hdGl2ZUhhbmRsZShjb25zdCBIYWxUb2tlbiAmaGFsVG9rZW4pOworCiBib29sCiBBSW1hZ2VSZWFkZXI6OmlzU3VwcG9ydGVkRm9ybWF0QW5kVXNhZ2UoaW50MzJfdCBmb3JtYXQsIHVpbnQ2NF90IHVzYWdlKSB7CiAgICAgLy8gQ2hlY2sgd2hldGhlciB1c2FnZSBoYXMgZWl0aGVyIENQVV9SRUFEX09GVEVOIG9yIENQVV9SRUFEIHNldC4gTm90ZSB0aGF0IGNoZWNrIGFnYWluc3QKQEAgLTU4LDExICs2NCwxNSBAQAogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODg6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9KUEVHOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkFXMTY6CisgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SQVdfREVQVEg6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SQVdfUFJJVkFURToKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JBVzEwOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkFXMTI6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSDE2OgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEhfUE9JTlRfQ0xPVUQ6CisgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ZODoKKyAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0hFSUM6CisgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9ERVBUSF9KUEVHOgogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9QUklWQVRFOgogICAgICAgICAgICAgLy8gRm9yIHByaXZhdGUgZm9ybWF0LCBjcHUgdXNhZ2UgaXMgcHJvaGliaXRlZC4KQEAgLTg0LDExICs5NCwxNSBAQAogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkdCQV9GUDE2OgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfSlBFRzoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JBVzE2OgorICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkFXX0RFUFRIOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUkFXX1BSSVZBVEU6CiAgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9SQVcxMDoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX1JBVzEyOgogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEgxNjoKICAgICAgICAgY2FzZSBBSU1BR0VfRk9STUFUX0RFUFRIX1BPSU5UX0NMT1VEOgorICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfWTg6CisgICAgICAgIGNhc2UgQUlNQUdFX0ZPUk1BVF9IRUlDOgorICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfREVQVEhfSlBFRzoKICAgICAgICAgICAgIHJldHVybiAxOwogICAgICAgICBjYXNlIEFJTUFHRV9GT1JNQVRfUFJJVkFURToKICAgICAgICAgICAgIHJldHVybiAwOwpAQCAtOTksMTIgKzExMywxMiBAQAogCiB2b2lkCiBBSW1hZ2VSZWFkZXI6OkZyYW1lTGlzdGVuZXI6Om9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgLyppdGVtKi8pIHsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIHNwPEFJbWFnZVJlYWRlcj4gcmVhZGVyID0gbVJlYWRlci5wcm9tb3RlKCk7CiAgICAgaWYgKHJlYWRlciA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dXKCJBIGZyYW1lIGlzIGF2YWlsYWJsZSBhZnRlciBBSW1hZ2VSZWFkZXIgY2xvc2VkISIpOwogICAgICAgICByZXR1cm47IC8vIHJlYWRlciBoYXMgYmVlbiBjbG9zZWQKICAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBpZiAobUxpc3RlbmVyLm9uSW1hZ2VBdmFpbGFibGUgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm47IC8vIE5vIGNhbGxiYWNrIHJlZ2lzdGVyZWQKICAgICB9CkBAIC0xMjksMTIgKzE0MywxMiBAQAogCiB2b2lkCiBBSW1hZ2VSZWFkZXI6OkJ1ZmZlclJlbW92ZWRMaXN0ZW5lcjo6b25CdWZmZXJGcmVlZChjb25zdCB3cDxHcmFwaGljQnVmZmVyPiYgZ3JhcGhpY0J1ZmZlcikgewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgc3A8QUltYWdlUmVhZGVyPiByZWFkZXIgPSBtUmVhZGVyLnByb21vdGUoKTsKICAgICBpZiAocmVhZGVyID09IG51bGxwdHIpIHsKICAgICAgICAgQUxPR1coIkEgZnJhbWUgaXMgYXZhaWxhYmxlIGFmdGVyIEFJbWFnZVJlYWRlciBjbG9zZWQhIik7CiAgICAgICAgIHJldHVybjsgLy8gcmVhZGVyIGhhcyBiZWVuIGNsb3NlZAogICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIGlmIChtTGlzdGVuZXIub25CdWZmZXJSZW1vdmVkID09IG51bGxwdHIpIHsKICAgICAgICAgcmV0dXJuOyAvLyBObyBjYWxsYmFjayByZWdpc3RlcmVkCiAgICAgfQpAQCAtMjU4LDYgKzI3MiwxMSBAQAogICAgICAgbUZyYW1lTGlzdGVuZXIobmV3IEZyYW1lTGlzdGVuZXIodGhpcykpLAogICAgICAgbUJ1ZmZlclJlbW92ZWRMaXN0ZW5lcihuZXcgQnVmZmVyUmVtb3ZlZExpc3RlbmVyKHRoaXMpKSB7fQogCitBSW1hZ2VSZWFkZXI6On5BSW1hZ2VSZWFkZXIoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBMT0dfRkFUQUxfSUYoIkFJbWFnZVJlYWRlciBub3QgY2xvc2VkIGJlZm9yZSBkZXN0cnVjdGlvbiIsIG1Jc0Nsb3NlZCAhPSB0cnVlKTsKK30KKwogbWVkaWFfc3RhdHVzX3QKIEFJbWFnZVJlYWRlcjo6aW5pdCgpIHsKICAgICBQdWJsaWNGb3JtYXQgcHVibGljRm9ybWF0ID0gc3RhdGljX2Nhc3Q8UHVibGljRm9ybWF0PihtRm9ybWF0KTsKQEAgLTMwMSw2ICszMjAsOSBAQAogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCBCdWZmZXJJdGVtQ29uc3VtZXIgYnVmZmVyIGRhdGFTcGFjZSIpOwogICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CiAgICAgfQorICAgIGlmIChtVXNhZ2UgJiBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfUFJPVEVDVEVEX0NPTlRFTlQpIHsKKyAgICAgICAgZ2JDb25zdW1lci0+c2V0Q29uc3VtZXJJc1Byb3RlY3RlZCh0cnVlKTsKKyAgICB9CiAKICAgICBtU3VyZmFjZSA9IG5ldyBTdXJmYWNlKG1Qcm9kdWNlciwgLypjb250cm9sbGVkQnlBcHAqL3RydWUpOwogICAgIGlmIChtU3VyZmFjZSA9PSBudWxscHRyKSB7CkBAIC0zMzAsOCArMzUyLDEyIEBACiAgICAgcmV0dXJuIEFNRURJQV9PSzsKIH0KIAotQUltYWdlUmVhZGVyOjp+QUltYWdlUmVhZGVyKCkgewordm9pZCBBSW1hZ2VSZWFkZXI6OmNsb3NlKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1Jc0Nsb3NlZCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1Jc0Nsb3NlZCA9IHRydWU7CiAgICAgQUltYWdlUmVhZGVyX0ltYWdlTGlzdGVuZXIgbnVsbExpc3RlbmVyID0ge251bGxwdHIsIG51bGxwdHJ9OwogICAgIHNldEltYWdlTGlzdGVuZXJMb2NrZWQoJm51bGxMaXN0ZW5lcik7CiAKQEAgLTM1MCw4ICszNzYsMTAgQEAKICAgICAgICAgICAgICAgaXQgIT0gbUFjcXVpcmVkSW1hZ2VzLmVuZCgpOyBpdCsrKSB7CiAgICAgICAgIEFJbWFnZSogaW1hZ2UgPSAqaXQ7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChpbWFnZS0+bUxvY2spOwotICAgICAgICByZWxlYXNlSW1hZ2VMb2NrZWQoaW1hZ2UsIC8qcmVsZWFzZUZlbmNlRmQqLy0xKTsKKyAgICAgICAgLy8gRG8gbm90IGFsdGVyIG1BY3F1aXJlZEltYWdlcyB3aGlsZSB3ZSBhcmUgaXRlcmF0aW5nIG9uIGl0CisgICAgICAgIHJlbGVhc2VJbWFnZUxvY2tlZChpbWFnZSwgLypyZWxlYXNlRmVuY2VGZCovLTEsIC8qY2xlYXJDYWNoZSovZmFsc2UpOwogICAgIH0KKyAgICBtQWNxdWlyZWRJbWFnZXMuY2xlYXIoKTsKIAogICAgIC8vIERlbGV0ZSBCdWZmZXIgSXRlbXMKICAgICBmb3IgKGF1dG8gaXQgPSBtQnVmZmVycy5iZWdpbigpOwpAQCAtMzYzLDYgKzM5MSwxNSBAQAogICAgICAgICBtQnVmZmVySXRlbUNvbnN1bWVyLT5hYmFuZG9uKCk7CiAgICAgICAgIG1CdWZmZXJJdGVtQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIobnVsbHB0cik7CiAgICAgfQorCisgICAgaWYgKG1XaW5kb3dIYW5kbGUgIT0gbnVsbHB0cikgeworICAgICAgICBpbnQgc2l6ZSA9IG1XaW5kb3dIYW5kbGUtPmRhdGFbMF07CisgICAgICAgIGhpZGxfdmVjPHVpbnQ4X3Q+IGhhbFRva2VuOworICAgICAgICBoYWxUb2tlbi5zZXRUb0V4dGVybmFsKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KCZtV2luZG93SGFuZGxlLT5kYXRhWzFdKSwgc2l6ZSk7CisgICAgICAgIGRlbGV0ZUhhbFRva2VuKGhhbFRva2VuKTsKKyAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUobVdpbmRvd0hhbmRsZSk7CisgICAgfQogfQogCiBtZWRpYV9zdGF0dXNfdApAQCAtNDgxLDcgKzUxOCw3IEBACiB9CiAKIHZvaWQKLUFJbWFnZVJlYWRlcjo6cmVsZWFzZUltYWdlTG9ja2VkKEFJbWFnZSogaW1hZ2UsIGludCByZWxlYXNlRmVuY2VGZCkgeworQUltYWdlUmVhZGVyOjpyZWxlYXNlSW1hZ2VMb2NrZWQoQUltYWdlKiBpbWFnZSwgaW50IHJlbGVhc2VGZW5jZUZkLCBib29sIGNsZWFyQ2FjaGUpIHsKICAgICBCdWZmZXJJdGVtKiBidWZmZXIgPSBpbWFnZS0+bUJ1ZmZlcjsKICAgICBpZiAoYnVmZmVyID09IG51bGxwdHIpIHsKICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgYnV0IGlzIG5vdCBmYXRhbApAQCAtNTA1LDYgKzU0MiwxMCBAQAogICAgIGltYWdlLT5tTG9ja2VkQnVmZmVyID0gbnVsbHB0cjsKICAgICBpbWFnZS0+bUlzQ2xvc2VkID0gdHJ1ZTsKIAorICAgIGlmICghY2xlYXJDYWNoZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgYm9vbCBmb3VuZCA9IGZhbHNlOwogICAgIC8vIGNsZWFudXAgYWNxdWlyZWQgaW1hZ2UgbGlzdAogICAgIGZvciAoYXV0byBpdCA9IG1BY3F1aXJlZEltYWdlcy5iZWdpbigpOwpAQCAtNTIyLDYgKzU2MywyNSBAQAogICAgIH0KIH0KIAorbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyOjpnZXRXaW5kb3dOYXRpdmVIYW5kbGUobmF0aXZlX2hhbmRsZSAqKmhhbmRsZSkgeworICAgIGlmIChtV2luZG93SGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgKmhhbmRsZSA9IG1XaW5kb3dIYW5kbGU7CisgICAgICAgIHJldHVybiBBTUVESUFfT0s7CisgICAgfQorICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGhnYnAgPQorICAgICAgICBuZXcgVFdHcmFwaGljQnVmZmVyUHJvZHVjZXI8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4obVByb2R1Y2VyKTsKKyAgICBIYWxUb2tlbiBoYWxUb2tlbjsKKyAgICBpZiAoIWNyZWF0ZUhhbFRva2VuKGhnYnAsICZoYWxUb2tlbikpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgIH0KKyAgICBtV2luZG93SGFuZGxlID0gY29udmVydEhhbFRva2VuVG9OYXRpdmVIYW5kbGUoaGFsVG9rZW4pOworICAgIGlmICghbVdpbmRvd0hhbmRsZSkgeworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047CisgICAgfQorICAgICpoYW5kbGUgPSBtV2luZG93SGFuZGxlOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKIGludAogQUltYWdlUmVhZGVyOjpnZXRCdWZmZXJXaWR0aChCdWZmZXJJdGVtKiBidWZmZXIpIHsKICAgICBpZiAoYnVmZmVyID09IE5VTEwpIHJldHVybiAtMTsKQEAgLTU4NSw2ICs2NDUsMzMgQEAKICAgICB9CiB9CiAKK3N0YXRpYyBuYXRpdmVfaGFuZGxlX3QgKmNvbnZlcnRIYWxUb2tlblRvTmF0aXZlSGFuZGxlKAorICAgICAgICBjb25zdCBIYWxUb2tlbiAmaGFsVG9rZW4pIHsKKyAgICAvLyBXZSBhdHRlbXB0IHRvIHN0b3JlIGhhbFRva2VuIGluIHRoZSBpbnRzIG9mIHRoZSBuYXRpdmVfaGFuZGxlX3QgYWZ0ZXIgaXRzCisgICAgLy8gc2l6ZS4gVGhlIGZpcnN0IGludCBzdG9yZXMgdGhlIHNpemUgb2YgdGhlIHRva2VuLiBXZSBzdG9yZSB0aGlzIGluIGFuIGludAorICAgIC8vIHRvIGF2b2lkIGFsaWdubWVudCBpc3N1ZXMgd2hlcmUgc2l6ZV90IGFuZCBpbnQgZG8gbm90IGhhdmUgdGhlIHNhbWUKKyAgICAvLyBhbGlnbm1lbnQuCisgICAgc2l6ZV90IG5oRGF0YUJ5dGVTaXplID0gaGFsVG9rZW4uc2l6ZSgpOworICAgIGlmIChuaERhdGFCeXRlU2l6ZSA+IGtXaW5kb3dIYWxUb2tlblNpemVNYXgpIHsKKyAgICAgICAgLy8gVGhlIHNpemUgb2YgdGhlIHRva2VuIGlzbid0IHJlYXNvbmFibGUuLgorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc2l6ZV90IG51bUludHMgPSBjZWlsKG5oRGF0YUJ5dGVTaXplIC8gc2l6ZW9mKGludCkpICsgMTsKKworICAgIC8vIFdlIGRvbid0IGNoZWNrIGZvciBvdmVyZmxvdywgd2hldGhlciBudW1JbnRzIGNhbiBmaXQgaW4gYW4gaW50LCBzaW5jZSB3ZQorICAgIC8vIGV4cGVjdCBrV2luZG93SGFsVG9rZW5TaXplTWF4IHRvIGJlIGEgcmVhc29uYWJsZSBsaW1pdC4KKyAgICAvLyBjcmVhdGUgYSBuYXRpdmVfaGFuZGxlX3Qgd2l0aCAwIG51bUZkcyBhbmQgbnVtSW50cyBudW1iZXIgb2YgaW50cy4KKyAgICBuYXRpdmVfaGFuZGxlX3QgKm5oID0KKyAgICAgICAgbmF0aXZlX2hhbmRsZV9jcmVhdGUoMCwgbnVtSW50cyk7CisgICAgaWYgKCFuaCkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgLy8gU3RvcmUgdGhlIHNpemUgb2YgdGhlIHRva2VuIGluIHRoZSBmaXJzdCBpbnQuCisgICAgbmgtPmRhdGFbMF0gPSBuaERhdGFCeXRlU2l6ZTsKKyAgICBtZW1jcHkoJihuaC0+ZGF0YVsxXSksIGhhbFRva2VuLmRhdGEoKSwgbmhEYXRhQnl0ZVNpemUpOworICAgIHJldHVybiBuaDsKK30KKwogRVhQT1JUCiBtZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfbmV3KAogICAgICAgICBpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwgaW50MzJfdCBmb3JtYXQsIGludDMyX3QgbWF4SW1hZ2VzLApAQCAtNTk0LDYgKzY4MSwxOSBAQAogICAgICAgICAgICAgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBBSEFSRFdBUkVCVUZGRVJfVVNBR0VfQ1BVX1JFQURfT0ZURU4sIG1heEltYWdlcywgcmVhZGVyKTsKIH0KIAorZXh0ZXJuICJDIiB7CisKK0VYUE9SVAorbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZSgKKyAgICAgICAgQUltYWdlUmVhZGVyICpyZWFkZXIsIC8qb3V0Ki9uYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpIHsKKyAgICBpZiAocmVhZGVyID09IG51bGxwdHIgfHwgaGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgcmV0dXJuIHJlYWRlci0+Z2V0V2luZG93TmF0aXZlSGFuZGxlKGhhbmRsZSk7Cit9CisKK30gLy9leHRlcm4gIkMiCisKIEVYUE9SVAogbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX25ld1dpdGhVc2FnZSgKICAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGludDMyX3QgZm9ybWF0LCB1aW50NjRfdCB1c2FnZSwKQEAgLTY1MCw2ICs3NTAsNyBAQAogdm9pZCBBSW1hZ2VSZWFkZXJfZGVsZXRlKEFJbWFnZVJlYWRlciogcmVhZGVyKSB7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKICAgICBpZiAocmVhZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmVhZGVyLT5jbG9zZSgpOwogICAgICAgICByZWFkZXItPmRlY1N0cm9uZygodm9pZCopIEFJbWFnZVJlYWRlcl9kZWxldGUpOwogICAgIH0KICAgICByZXR1cm47CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXJQcml2LmggYi9tZWRpYS9uZGsvTmRrSW1hZ2VSZWFkZXJQcml2LmgKaW5kZXggYmVkOGEyMS4uMDc3OWE3MSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka0ltYWdlUmVhZGVyUHJpdi5oCisrKyBiL21lZGlhL25kay9OZGtJbWFnZVJlYWRlclByaXYuaApAQCAtNjksMTEgKzY5LDE0IEBACiAgICAgbWVkaWFfc3RhdHVzX3QgYWNxdWlyZU5leHRJbWFnZSgvKm91dCovQUltYWdlKiogaW1hZ2UsIC8qb3V0Ki9pbnQqIGZlbmNlRmQpOwogICAgIG1lZGlhX3N0YXR1c190IGFjcXVpcmVMYXRlc3RJbWFnZSgvKm91dCovQUltYWdlKiogaW1hZ2UsIC8qb3V0Ki9pbnQqIGZlbmNlRmQpOwogCisgICAgbWVkaWFfc3RhdHVzX3QgZ2V0V2luZG93TmF0aXZlSGFuZGxlKC8qb3V0Ki9uYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworCiAgICAgQU5hdGl2ZVdpbmRvdyogZ2V0V2luZG93KCkgICAgY29uc3QgeyByZXR1cm4gbVdpbmRvdy5nZXQoKTsgfTsKICAgICBpbnQzMl90ICAgICAgICBnZXRXaWR0aCgpICAgICBjb25zdCB7IHJldHVybiBtV2lkdGg7IH07CiAgICAgaW50MzJfdCAgICAgICAgZ2V0SGVpZ2h0KCkgICAgY29uc3QgeyByZXR1cm4gbUhlaWdodDsgfTsKICAgICBpbnQzMl90ICAgICAgICBnZXRGb3JtYXQoKSAgICBjb25zdCB7IHJldHVybiBtRm9ybWF0OyB9OwogICAgIGludDMyX3QgICAgICAgIGdldE1heEltYWdlcygpIGNvbnN0IHsgcmV0dXJuIG1NYXhJbWFnZXM7IH07CisgICAgdm9pZCAgICAgICAgICAgY2xvc2UoKTsKIAogICBwcml2YXRlOgogCkBAIC04Niw3ICs4OSw3IEBACiAgICAgbWVkaWFfc3RhdHVzX3QgYWNxdWlyZUltYWdlTG9ja2VkKC8qb3V0Ki9BSW1hZ2UqKiBpbWFnZSwgLypvdXQqL2ludCogZmVuY2VGZCk7CiAKICAgICAvLyBDYWxsZWQgYnkgQUltYWdlL35BSW1hZ2VSZWFkZXIgdG8gY2xvc2UgaW1hZ2UuIENhbGxlciBpcyByZXNwb25zaWJsZSB0byBncmFiIEFJbWFnZTo6bUxvY2sKLSAgICB2b2lkIHJlbGVhc2VJbWFnZUxvY2tlZChBSW1hZ2UqIGltYWdlLCBpbnQgcmVsZWFzZUZlbmNlRmQpOworICAgIHZvaWQgcmVsZWFzZUltYWdlTG9ja2VkKEFJbWFnZSogaW1hZ2UsIGludCByZWxlYXNlRmVuY2VGZCwgYm9vbCBjbGVhckNhY2hlID0gdHJ1ZSk7CiAKICAgICBzdGF0aWMgaW50IGdldEJ1ZmZlcldpZHRoKEJ1ZmZlckl0ZW0qIGJ1ZmZlcik7CiAgICAgc3RhdGljIGludCBnZXRCdWZmZXJIZWlnaHQoQnVmZmVySXRlbSogYnVmZmVyKTsKQEAgLTEzMiw3ICsxMzUsNyBAQAogCiAgICAgICBwcml2YXRlOgogICAgICAgICBBSW1hZ2VSZWFkZXJfSW1hZ2VMaXN0ZW5lciBtTGlzdGVuZXIgPSB7bnVsbHB0ciwgbnVsbHB0cn07Ci0gICAgICAgIHdwPEFJbWFnZVJlYWRlcj4gICAgICAgICAgIG1SZWFkZXI7CisgICAgICAgIGNvbnN0IHdwPEFJbWFnZVJlYWRlcj4gICAgIG1SZWFkZXI7CiAgICAgICAgIE11dGV4ICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrOwogICAgIH07CiAgICAgc3A8RnJhbWVMaXN0ZW5lcj4gbUZyYW1lTGlzdGVuZXI7CkBAIC0xNDcsNyArMTUwLDcgQEAKIAogICAgICAgIHByaXZhdGU6CiAgICAgICAgIEFJbWFnZVJlYWRlcl9CdWZmZXJSZW1vdmVkTGlzdGVuZXIgbUxpc3RlbmVyID0ge251bGxwdHIsIG51bGxwdHJ9OwotICAgICAgICB3cDxBSW1hZ2VSZWFkZXI+ICAgICAgICAgICBtUmVhZGVyOworICAgICAgICBjb25zdCB3cDxBSW1hZ2VSZWFkZXI+ICAgICBtUmVhZGVyOwogICAgICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKICAgICB9OwogICAgIHNwPEJ1ZmZlclJlbW92ZWRMaXN0ZW5lcj4gbUJ1ZmZlclJlbW92ZWRMaXN0ZW5lcjsKQEAgLTE2MCw4ICsxNjMsMTAgQEAKICAgICBzcDxTdXJmYWNlPiAgICAgICAgICAgICAgICBtU3VyZmFjZTsKICAgICBzcDxCdWZmZXJJdGVtQ29uc3VtZXI+ICAgICBtQnVmZmVySXRlbUNvbnN1bWVyOwogICAgIHNwPEFOYXRpdmVXaW5kb3c+ICAgICAgICAgIG1XaW5kb3c7CisgICAgbmF0aXZlX2hhbmRsZV90KiAgICAgICAgICAgbVdpbmRvd0hhbmRsZSA9IG51bGxwdHI7CiAKICAgICBMaXN0PEFJbWFnZSo+ICAgICAgICAgICAgICBtQWNxdWlyZWRJbWFnZXM7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgbUlzQ2xvc2VkID0gZmFsc2U7CiAKICAgICBNdXRleCAgICAgICAgICAgICAgICAgICAgICBtTG9jazsKIH07CmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFDb2RlYy5jcHAKaW5kZXggNDIyODVmOC4uYWYyMWE5OSAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhQ29kZWMuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUNvZGVjLmNwcApAQCAtMjEsOCArMjEsOCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDb2RlYy5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KICNpbmNsdWRlICJOZGtNZWRpYUNyeXB0b1ByaXYuaCIKLSNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KQEAgLTIyMSw3ICsyMjEsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0ICphTWVkaWFGb3JtYXQgPSBBTWVkaWFGb3JtYXRfZnJvbU1zZygmZm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUgZm9ybWF0IGlzIE1lZGlhQ29kZWMncyBpbnRlcm5hbCBjb3B5IG9mIG91dHB1dCBmb3JtYXQuCisgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIGEgY29weSBzaW5jZSB0aGUgY2xpZW50IG1pZ2h0IG1vZGlmeSBpdC4KKyAgICAgICAgICAgICAgICAgICAgIHNwPEFNZXNzYWdlPiBjb3B5OworICAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgY29weSA9IGZvcm1hdC0+ZHVwKCk7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXQgKmFNZWRpYUZvcm1hdCA9IEFNZWRpYUZvcm1hdF9mcm9tTXNnKCZjb3B5KTsKIAogICAgICAgICAgICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Db2RlYy0+bUFzeW5jQ2FsbGJhY2tMb2NrKTsKICAgICAgICAgICAgICAgICAgICAgIGlmIChtQ29kZWMtPm1Bc3luY0NhbGxiYWNrVXNlckRhdGEgIT0gTlVMTApAQCAtMjQ0LDggKzI1MCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX0VSUk9SOiBlcnIgaXMgZXhwZWN0ZWQuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJhY3Rpb24iLCAmYWN0aW9uQ29kZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfRVJST1I6IGFjdGlvbiBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImFjdGlvbkNvZGUiLCAmYWN0aW9uQ29kZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfRVJST1I6IGFjdGlvbkNvZGUgaXMgZXhwZWN0ZWQuIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICBtc2ctPmZpbmRTdHJpbmcoImRldGFpbCIsICZkZXRhaWwpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvLmNwcCBiL21lZGlhL25kay9OZGtNZWRpYUNyeXB0by5jcHAKaW5kZXggMDBkNDUyMC4uNzkyZmMwMCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFDcnlwdG8uY3BwCkBAIC0yMCwxNSArMjAsMTUgQEAKIAogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhQ3J5cHRvLmg+CiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFDb2RlYy5oPgotI2luY2x1ZGUgIk5ka01lZGlhRm9ybWF0UHJpdi5oIgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogCiAKICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvSUNyeXB0by5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYURybVNlcnZpY2UuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vSU1lZGlhRHJtU2VydmljZS5oPgogI2luY2x1ZGUgPGFuZHJvaWRfdXRpbF9CaW5kZXIuaD4KIAogI2luY2x1ZGUgPGpuaS5oPgpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvUHJpdi5oIGIvbWVkaWEvbmRrL05ka01lZGlhQ3J5cHRvUHJpdi5oCmluZGV4IDE0ZWE5MjguLjg2NjRkOTUgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUNyeXB0b1ByaXYuaAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFDcnlwdG9Qcml2LmgKQEAgLTMwLDcgKzMwLDcgQEAKIAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KLSNpbmNsdWRlIDxtZWRpYS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vSUNyeXB0by5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZS5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlLmNwcAppbmRleCA5ZDAwZTVlLi5jMWQ0Njg2IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlLmNwcAorKysgYi9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlLmNwcApAQCAtMjMsMTYgKzIzLDIxIEBACiAjaW5jbHVkZSA8am5pLmg+CiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAKLSNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YW5kcm9pZF9ydW50aW1lL0FuZHJvaWRSdW50aW1lLmg+CisjaW5jbHVkZSA8YW5kcm9pZF91dGlsX0JpbmRlci5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorI2luY2x1ZGUgPGRhdGFzb3VyY2UvRGF0YVNvdXJjZUZhY3RvcnkuaD4KKyNpbmNsdWRlIDxkYXRhc291cmNlL0hUVFBCYXNlLmg+CisjaW5jbHVkZSA8ZGF0YXNvdXJjZS9OdUNhY2hlZFNvdXJjZTIuaD4KKyNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9JbnRlcmZhY2VVdGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KIAotI2luY2x1ZGUgIi4uLy4uL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUvSFRUUEJhc2UuaCIKLSNpbmNsdWRlICIuLi8uLi9saWJzdGFnZWZyaWdodC9pbmNsdWRlL051Q2FjaGVkU291cmNlMi5oIgorI2luY2x1ZGUgIk5ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaCIKKwogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIApAQCAtNDEsMTQgKzQ2LDIwIEBACiAgICAgQU1lZGlhRGF0YVNvdXJjZVJlYWRBdCByZWFkQXQ7CiAgICAgQU1lZGlhRGF0YVNvdXJjZUdldFNpemUgZ2V0U2l6ZTsKICAgICBBTWVkaWFEYXRhU291cmNlQ2xvc2UgY2xvc2U7CisgICAgQU1lZGlhRGF0YVNvdXJjZUdldEF2YWlsYWJsZVNpemUgZ2V0QXZhaWxhYmxlU2l6ZTsKKyAgICBzcDxEYXRhU291cmNlPiBtSW1wbDsKKyAgICB1aW50MzJfdCBtRmxhZ3M7CiB9OwogCiBOZGtEYXRhU291cmNlOjpOZGtEYXRhU291cmNlKEFNZWRpYURhdGFTb3VyY2UgKmRhdGFTb3VyY2UpCiAgICAgOiBtRGF0YVNvdXJjZShBTWVkaWFEYXRhU291cmNlX25ldygpKSB7Ci0gICAgICBBTWVkaWFEYXRhU291cmNlX3NldFJlYWRBdChtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+cmVhZEF0KTsKLSAgICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0U2l6ZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Z2V0U2l6ZSk7Ci0gICAgICBBTWVkaWFEYXRhU291cmNlX3NldENsb3NlKG1EYXRhU291cmNlLCBkYXRhU291cmNlLT5jbG9zZSk7Ci0gICAgICBBTWVkaWFEYXRhU291cmNlX3NldFVzZXJkYXRhKG1EYXRhU291cmNlLCBkYXRhU291cmNlLT51c2VyZGF0YSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQobURhdGFTb3VyY2UsIGRhdGFTb3VyY2UtPnJlYWRBdCk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRTaXplKG1EYXRhU291cmNlLCBkYXRhU291cmNlLT5nZXRTaXplKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldENsb3NlKG1EYXRhU291cmNlLCBkYXRhU291cmNlLT5jbG9zZSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+dXNlcmRhdGEpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0QXZhaWxhYmxlU2l6ZShtRGF0YVNvdXJjZSwgZGF0YVNvdXJjZS0+Z2V0QXZhaWxhYmxlU2l6ZSk7CisgICAgbURhdGFTb3VyY2UtPm1JbXBsID0gZGF0YVNvdXJjZS0+bUltcGw7CisgICAgbURhdGFTb3VyY2UtPm1GbGFncyA9IGRhdGFTb3VyY2UtPm1GbGFnczsKIH0KIAogTmRrRGF0YVNvdXJjZTo6fk5ka0RhdGFTb3VyY2UoKSB7CkBAIC01OSw5ICs3MCwxMyBAQAogICAgIHJldHVybiBPSzsKIH0KIAordWludDMyX3QgTmRrRGF0YVNvdXJjZTo6ZmxhZ3MoKSB7CisgICAgcmV0dXJuIG1EYXRhU291cmNlLT5tRmxhZ3M7Cit9CisKIHNzaXplX3QgTmRrRGF0YVNvdXJjZTo6cmVhZEF0KG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICpkYXRhLCBzaXplX3Qgc2l6ZSkgewogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKLSAgICBpZiAobURhdGFTb3VyY2UtPmdldFNpemUgPT0gTlVMTCB8fCBtRGF0YVNvdXJjZS0+dXNlcmRhdGEgPT0gTlVMTCkgeworICAgIGlmIChtRGF0YVNvdXJjZS0+cmVhZEF0ID09IE5VTEwgfHwgbURhdGFTb3VyY2UtPnVzZXJkYXRhID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIC0xOwogICAgIH0KICAgICByZXR1cm4gbURhdGFTb3VyY2UtPnJlYWRBdChtRGF0YVNvdXJjZS0+dXNlcmRhdGEsIG9mZnNldCwgZGF0YSwgc2l6ZSk7CkBAIC05Miw2ICsxMDcsNzUgQEAKICAgICB9CiB9CiAKK3N0YXR1c190IE5ka0RhdGFTb3VyY2U6OmdldEF2YWlsYWJsZVNpemUob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgKnNpemVwdHIpIHsKKyAgICBvZmY2NF90IHNpemUgPSAtMTsKKyAgICBpZiAobURhdGFTb3VyY2UtPmdldEF2YWlsYWJsZVNpemUgIT0gTlVMTAorICAgICAgICAgICAgJiYgbURhdGFTb3VyY2UtPnVzZXJkYXRhICE9IE5VTEwKKyAgICAgICAgICAgICYmIHNpemVwdHIgIT0gTlVMTCkgeworICAgICAgICBzaXplID0gbURhdGFTb3VyY2UtPmdldEF2YWlsYWJsZVNpemUobURhdGFTb3VyY2UtPnVzZXJkYXRhLCBvZmZzZXQpOworICAgICAgICAqc2l6ZXB0ciA9IHNpemU7CisgICAgfQorICAgIHJldHVybiBzaXplID49IDAgPyBPSyA6IFVOS05PV05fRVJST1I7Cit9CisKK3N0YXRpYyBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlRnJvbUphdmFPYmooSk5JRW52ICplbnYsIGpvYmplY3Qgb2JqKSB7CisgICAgaWYgKG9iaiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8SU1lZGlhSFRUUFNlcnZpY2U+KGliaW5kZXJGb3JKYXZhT2JqZWN0KGVudiwgb2JqKSk7Cit9CisKK3N0YXRpYyBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlVGVtcGxhdGUoCisgICAgICAgIEpOSUVudiAqZW52LAorICAgICAgICBjb25zdCBjaGFyICp1cmksCisgICAgICAgIGNvbnN0IGNoYXIgKmNsYXp6LAorICAgICAgICBjb25zdCBjaGFyICptZXRob2QsCisgICAgICAgIGNvbnN0IGNoYXIgKnNpZ25hdHVyZSkgeworICAgIGpvYmplY3Qgc2VydmljZSA9IE5VTEw7CisgICAgaWYgKGVudiA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJodHRwIHNlcnZpY2UgbXVzdCBiZSBjcmVhdGVkIGZyb20gSmF2YSB0aHJlYWQiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgamNsYXNzIG1lZGlhaHR0cGNsYXNzID0gZW52LT5GaW5kQ2xhc3MoY2xhenopOworICAgIGlmIChtZWRpYWh0dHBjbGFzcyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJjYW4ndCBmaW5kIE1lZGlhKDIpSHR0cFNlcnZpY2UiKTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBqbWV0aG9kSUQgbWVkaWFIdHRwQ3JlYXRlTWV0aG9kID0gZW52LT5HZXRTdGF0aWNNZXRob2RJRChtZWRpYWh0dHBjbGFzcywgbWV0aG9kLCBzaWduYXR1cmUpOworICAgIGlmIChtZWRpYUh0dHBDcmVhdGVNZXRob2QgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiY2FuJ3QgZmluZCBtZXRob2QiKTsKKyAgICAgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBqc3RyaW5nIGp1cmkgPSBlbnYtPk5ld1N0cmluZ1VURih1cmkpOworCisgICAgc2VydmljZSA9IGVudi0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZChtZWRpYWh0dHBjbGFzcywgbWVkaWFIdHRwQ3JlYXRlTWV0aG9kLCBqdXJpKTsKKyAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGp1cmkpOworCisgICAgZW52LT5FeGNlcHRpb25DbGVhcigpOworICAgIHNwPE1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlID0gY3JlYXRlTWVkaWFIdHRwU2VydmljZUZyb21KYXZhT2JqKGVudiwgc2VydmljZSk7CisgICAgcmV0dXJuIGh0dHBTZXJ2aWNlOworCit9CisKK3NwPE1lZGlhSFRUUFNlcnZpY2U+IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2UoY29uc3QgY2hhciAqdXJpKSB7CisKKyAgICBKTklFbnYgKmVudjsKKyAgICBjb25zdCBjaGFyICpjbGF6eiwgKm1ldGhvZCwgKnNpZ25hdHVyZTsKKworICAgIGVudiA9IEFuZHJvaWRSdW50aW1lOjpnZXRKTklFbnYoKTsKKyAgICBjbGF6eiA9ICJhbmRyb2lkL21lZGlhL01lZGlhSFRUUFNlcnZpY2UiOworICAgIG1ldGhvZCA9ICJjcmVhdGVIdHRwU2VydmljZUJpbmRlcklmTmVjZXNzYXJ5IjsKKyAgICBzaWduYXR1cmUgPSAiKExqYXZhL2xhbmcvU3RyaW5nOylMYW5kcm9pZC9vcy9JQmluZGVyOyI7CisKKyAgICByZXR1cm4gY3JlYXRlTWVkaWFIdHRwU2VydmljZVRlbXBsYXRlKGVudiwgdXJpLCBjbGF6eiwgbWV0aG9kLCBzaWduYXR1cmUpOworCit9CisKIGV4dGVybiAiQyIgewogCiBFWFBPUlQKQEAgLTEwNSw2ICsxODksMzIgQEAKIH0KIAogRVhQT1JUCitBTWVkaWFEYXRhU291cmNlKiBBTWVkaWFEYXRhU291cmNlX25ld1VyaSgKKyAgICAgICAgY29uc3QgY2hhciAqdXJpLAorICAgICAgICBpbnQgbnVtaGVhZGVycywKKyAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICprZXlfdmFsdWVzKSB7CisKKyAgICBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBzZXJ2aWNlID0gY3JlYXRlTWVkaWFIdHRwU2VydmljZSh1cmkpOworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGhlYWRlcnM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1oZWFkZXJzOyArK2kpIHsKKyAgICAgICAgU3RyaW5nOCBrZXk4KGtleV92YWx1ZXNbaSAqIDJdKTsKKyAgICAgICAgU3RyaW5nOCB2YWx1ZTgoa2V5X3ZhbHVlc1tpICogMiArIDFdKTsKKyAgICAgICAgaGVhZGVycy5hZGQoa2V5OCwgdmFsdWU4KTsKKyAgICB9CisKKyAgICBzcDxEYXRhU291cmNlPiBzb3VyY2UgPSBEYXRhU291cmNlRmFjdG9yeTo6Z2V0SW5zdGFuY2UoKS0+Q3JlYXRlRnJvbVVSSShzZXJ2aWNlLCB1cmksICZoZWFkZXJzKTsKKyAgICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkFNZWRpYURhdGFTb3VyY2VfbmV3VXJpIHNvdXJjZSBpcyBudWxsIik7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBBTE9HSSgiQU1lZGlhRGF0YVNvdXJjZV9uZXdVcmkgc291cmNlICVzIGZsYWdzICV1Iiwgc291cmNlLT50b1N0cmluZygpLmNfc3RyKCksIHNvdXJjZS0+ZmxhZ3MoKSk7CisgICAgQU1lZGlhRGF0YVNvdXJjZSogYVNvdXJjZSA9IGNvbnZlcnREYXRhU291cmNlVG9BTWVkaWFEYXRhU291cmNlKHNvdXJjZSk7CisgICAgYVNvdXJjZS0+bUltcGwgPSBzb3VyY2U7CisgICAgYVNvdXJjZS0+bUZsYWdzID0gc291cmNlLT5mbGFncygpOworICAgIHJldHVybiBhU291cmNlOworfQorCitFWFBPUlQKIHZvaWQgQU1lZGlhRGF0YVNvdXJjZV9kZWxldGUoQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSkgewogICAgIEFMT0dWKCJkdG9yIik7CiAgICAgaWYgKG1Tb3VyY2UgIT0gTlVMTCkgewpAQCAtMTMyLDUgKzI0MiwxNiBAQAogICAgIG1Tb3VyY2UtPmNsb3NlID0gY2xvc2U7CiB9CiAKK0VYUE9SVAordm9pZCBBTWVkaWFEYXRhU291cmNlX2Nsb3NlKEFNZWRpYURhdGFTb3VyY2UgKm1Tb3VyY2UpIHsKKyAgICByZXR1cm4gbVNvdXJjZS0+Y2xvc2UobVNvdXJjZS0+dXNlcmRhdGEpOworfQorCitFWFBPUlQKK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRBdmFpbGFibGVTaXplKEFNZWRpYURhdGFTb3VyY2UgKm1Tb3VyY2UsCisgICAgICAgIEFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplIGdldEF2YWlsYWJsZVNpemUpIHsKKyAgICBtU291cmNlLT5nZXRBdmFpbGFibGVTaXplID0gZ2V0QXZhaWxhYmxlU2l6ZTsKK30KKwogfSAvLyBleHRlcm4gIkMiCiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3MuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZhNTdkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3MuY3BwCkBAIC0wLDAgKzEsNTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzIgorCisjaW5jbHVkZSAiTmRrTWVkaWFEYXRhU291cmNlQ2FsbGJhY2tzUHJpdi5oIgorI2luY2x1ZGUgPG1lZGlhL0RhdGFTb3VyY2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3NzaXplX3QgRGF0YVNvdXJjZV9nZXRTaXplKHZvaWQgKnVzZXJkYXRhKSB7CisgICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7CisgICAgb2ZmNjRfdCBzaXplID0gLTE7CisgICAgc291cmNlLT5nZXRTaXplKCZzaXplKTsKKyAgICByZXR1cm4gc2l6ZTsKK30KKworc3NpemVfdCBEYXRhU291cmNlX3JlYWRBdCh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQsIHZvaWQgKiBidWYsIHNpemVfdCBzaXplKSB7CisgICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7CisgICAgcmV0dXJuIHNvdXJjZS0+cmVhZEF0KG9mZnNldCwgYnVmLCBzaXplKTsKK30KKwordm9pZCBEYXRhU291cmNlX2Nsb3NlKHZvaWQgKnVzZXJkYXRhKSB7CisgICAgRGF0YVNvdXJjZSAqc291cmNlID0gc3RhdGljX2Nhc3Q8RGF0YVNvdXJjZSAqPih1c2VyZGF0YSk7CisgICAgc291cmNlLT5jbG9zZSgpOworfQorCitzc2l6ZV90IERhdGFTb3VyY2VfZ2V0QXZhaWxhYmxlU2l6ZSh2b2lkICp1c2VyZGF0YSwgb2ZmNjRfdCBvZmZzZXQpIHsKKyAgICBvZmY2NF90IHNpemUgPSAtMTsKKyAgICBEYXRhU291cmNlICpzb3VyY2UgPSBzdGF0aWNfY2FzdDxEYXRhU291cmNlICo+KHVzZXJkYXRhKTsKKyAgICBzb3VyY2UtPmdldEF2YWlsYWJsZVNpemUob2Zmc2V0LCAmc2l6ZSk7CisgICAgcmV0dXJuICBzaXplOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZUNhbGxiYWNrc1ByaXYuaCBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3NQcml2LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjUwMzMwNQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VDYWxsYmFja3NQcml2LmgKQEAgLTAsMCArMSw1MSBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBX01FRElBX0RBVEFfU09VUkNFX0NBTExCQUNLU19ICisKKyNkZWZpbmUgQV9NRURJQV9EQVRBX1NPVVJDRV9DQUxMQkFDS1NfSAorCisjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXJyb3IuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzc2l6ZV90IERhdGFTb3VyY2VfZ2V0U2l6ZSh2b2lkICp1c2VyZGF0YSk7CisKK3NzaXplX3QgRGF0YVNvdXJjZV9yZWFkQXQodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0LCB2b2lkICogYnVmLCBzaXplX3Qgc2l6ZSk7CisKK3ZvaWQgRGF0YVNvdXJjZV9jbG9zZSh2b2lkICp1c2VyZGF0YSk7CisKK3NzaXplX3QgRGF0YVNvdXJjZV9nZXRBdmFpbGFibGVTaXplKHZvaWQgKnVzZXJkYXRhLCBvZmY2NF90IG9mZnNldCk7CisKK3N0YXRpYyBpbmxpbmUgQU1lZGlhRGF0YVNvdXJjZSogY29udmVydERhdGFTb3VyY2VUb0FNZWRpYURhdGFTb3VyY2UoY29uc3Qgc3A8RGF0YVNvdXJjZT4gJnNvdXJjZSkgeworICAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgQU1lZGlhRGF0YVNvdXJjZSAqbVNvdXJjZSA9IEFNZWRpYURhdGFTb3VyY2VfbmV3KCk7CisgICAgQU1lZGlhRGF0YVNvdXJjZV9zZXRVc2VyZGF0YShtU291cmNlLCBzb3VyY2UuZ2V0KCkpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0KG1Tb3VyY2UsIERhdGFTb3VyY2VfcmVhZEF0KTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldEdldFNpemUobVNvdXJjZSwgRGF0YVNvdXJjZV9nZXRTaXplKTsKKyAgICBBTWVkaWFEYXRhU291cmNlX3NldENsb3NlKG1Tb3VyY2UsIERhdGFTb3VyY2VfY2xvc2UpOworICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0QXZhaWxhYmxlU2l6ZShtU291cmNlLCBEYXRhU291cmNlX2dldEF2YWlsYWJsZVNpemUpOworICAgIHJldHVybiBtU291cmNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFfTUVESUFfREFUQV9TT1VSQ0VfQ0FMTEJBQ0tTX0gKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VQcml2LmggYi9tZWRpYS9uZGsvTmRrTWVkaWFEYXRhU291cmNlUHJpdi5oCmluZGV4IGVhOWM4NjUuLmRkY2Q3ZGEgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYURhdGFTb3VyY2VQcml2LmgKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRGF0YVNvdXJjZVByaXYuaApAQCAtMzIsNiArMzIsNyBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvRGF0YVNvdXJjZS5oPgorI2luY2x1ZGUgPG1lZGlhL01lZGlhSFRUUFNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaD4KICNpbmNsdWRlIDx1dGlscy9NdXRleC5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KQEAgLTQzLDExICs0NCwxMyBAQAogICAgIE5ka0RhdGFTb3VyY2UoQU1lZGlhRGF0YVNvdXJjZSAqKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkgY29uc3Q7CisgICAgdmlydHVhbCB1aW50MzJfdCBmbGFncygpOwogICAgIHZpcnR1YWwgc3NpemVfdCByZWFkQXQob2ZmNjRfdCBvZmZzZXQsIHZvaWQgKmRhdGEsIHNpemVfdCBzaXplKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFNpemUob2ZmNjRfdCAqKTsKICAgICB2aXJ0dWFsIFN0cmluZzggdG9TdHJpbmcoKTsKICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0TUlNRVR5cGUoKSBjb25zdDsKICAgICB2aXJ0dWFsIHZvaWQgY2xvc2UoKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF2YWlsYWJsZVNpemUob2ZmNjRfdCBvZmZzZXQsIG9mZjY0X3QgKnNpemUpOwogCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+TmRrRGF0YVNvdXJjZSgpOwpAQCAtNTksNSArNjIsNyBAQAogCiB9OwogCitzcDxNZWRpYUhUVFBTZXJ2aWNlPiBjcmVhdGVNZWRpYUh0dHBTZXJ2aWNlKGNvbnN0IGNoYXIgKnVyaSk7CisKICNlbmRpZiAvLyBfTkRLX01FRElBX0RBVEFTT1VSQ0VfUFJJVl9ICiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFEcm0uY3BwCmluZGV4IGI2ZWExODMuLjg0MjIxNmMgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYURybS5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRHJtLmNwcApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBMT0dfVEFHICJOZGtNZWRpYURybSIKIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CiAKICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYURybS5oPgogCkBAIC0yNiwxMiArMjcsMTQgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0lEcm0uaD4KLSNpbmNsdWRlIDxtZWRpYS9JRHJtQ2xpZW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNvbnRyb2xsZXIuaD4KKyNpbmNsdWRlIDxtZWRpYWRybS9JRHJtLmg+CisjaW5jbHVkZSA8bWVkaWFkcm0vSURybUNsaWVudC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXJyb3JzLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgotI2luY2x1ZGUgPG1lZGlhL0lNZWRpYURybVNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNyeXB0by5oPgorI2luY2x1ZGUgPG1lZGlhZHJtL0lNZWRpYURybVNlcnZpY2UuaD4KIAogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKQEAgLTg2LDcgKzg5LDcgQEAKIH07CiAKIHZvaWQgRHJtTGlzdGVuZXI6Om5vdGlmeShEcm1QbHVnaW46OkV2ZW50VHlwZSBldmVudFR5cGUsIGludCBleHRyYSwgY29uc3QgUGFyY2VsICpvYmopIHsKLSAgICBpZiAoIW1FdmVudExpc3RlbmVyICYmICFtRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyICYmICFtS2V5c0NoYW5nZUxpc3RlbmVyKSB7CisgICAgaWYgKCFtRXZlbnRMaXN0ZW5lciB8fCAhbUV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lciB8fCAhbUtleXNDaGFuZ2VMaXN0ZW5lcikgewogICAgICAgICBBTE9HRSgiTm8gbGlzdGVuZXJzIGFyZSBzcGVjaWZpZWQiKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTIzMSw2ICsyMzQsMzkgQEAKICAgICByZXR1cm4gcmVzdWx0OwogfQogCitzdGF0aWMgYm9vbCBTaG91bGRHZXRBcHBQYWNrYWdlTmFtZSh2b2lkKSB7CisgICAgLy8gQ2hlY2sgd2hhdCB0aGlzIGRldmljZSdzIGZpcnN0IEFQSSBsZXZlbCB3YXMuCisgICAgaW50MzJfdCBmaXJzdEFwaUxldmVsID0gYW5kcm9pZDo6YmFzZTo6R2V0SW50UHJvcGVydHk8aW50MzJfdD4oInJvLnByb2R1Y3QuZmlyc3RfYXBpX2xldmVsIiwgMCk7CisgICAgaWYgKGZpcnN0QXBpTGV2ZWwgPT0gMCkgeworICAgICAgICAvLyBGaXJzdCBBUEkgTGV2ZWwgaXMgMCBvbiBmYWN0b3J5IFJPTXMsIGJ1dCB3ZSBjYW4gYXNzdW1lIHRoZSBjdXJyZW50IFNESworICAgICAgICAvLyB2ZXJzaW9uIGlzIHRoZSBmaXJzdCBpZiBpdCdzIGEgZmFjdG9yeSBST00uCisgICAgICAgIGZpcnN0QXBpTGV2ZWwgPSBhbmRyb2lkOjpiYXNlOjpHZXRJbnRQcm9wZXJ0eTxpbnQzMl90Pigicm8uYnVpbGQudmVyc2lvbi5zZGsiLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIGZpcnN0QXBpTGV2ZWwgPj0gMjk7ICAvLyBBbmRyb2lkIFEKK30KKworc3RhdGljIHN0YXR1c190IEdldEFwcFBhY2thZ2VOYW1lKFN0cmluZzggKnBhY2thZ2VOYW1lKSB7CisgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzZXJ2aWNlTWFuYWdlciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOworICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNlcnZpY2VNYW5hZ2VyLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJwZXJtaXNzaW9uIikpOworCisgICAgc3A8SVBlcm1pc3Npb25Db250cm9sbGVyPiBwZXJtaXNzaW9uQ29udG9sID0gaW50ZXJmYWNlX2Nhc3Q8SVBlcm1pc3Npb25Db250cm9sbGVyPihiaW5kZXIpOworICAgIGlmIChwZXJtaXNzaW9uQ29udG9sID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBnZXQgcGVybWlzc2lvbiBzZXJ2aWNlIik7CisgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIFZlY3RvcjxTdHJpbmcxNj4gcGFja2FnZXM7CisgICAgcGVybWlzc2lvbkNvbnRvbC0+Z2V0UGFja2FnZXNGb3JVaWQoZ2V0dWlkKCksIHBhY2thZ2VzKTsKKworICAgIGlmIChwYWNrYWdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBnZXQgcGFja2FnZSBuYW1lIGZvciBjdXJyZW50IFVJRCIpOworICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKKyAgICB9CisKKyAgICAqcGFja2FnZU5hbWUgPSBTdHJpbmc4KHBhY2thZ2VzWzBdKTsKKyAgICByZXR1cm4gT0s7Cit9CisKIHN0YXRpYyBzcDxJRHJtPiBDcmVhdGVEcm0oKSB7CiAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwogICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IHNtLT5nZXRTZXJ2aWNlKFN0cmluZzE2KCJtZWRpYS5kcm0iKSk7CkBAIC0yNTUsOCArMjkxLDE2IEBACiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIFN0cmluZzggbnVsbFBhY2thZ2VOYW1lOwotICAgIHN0YXR1c190IGVyciA9IGRybS0+Y3JlYXRlUGx1Z2luKHV1aWQsIG51bGxQYWNrYWdlTmFtZSk7CisgICAgU3RyaW5nOCBwYWNrYWdlTmFtZTsKKyAgICBpZiAoU2hvdWxkR2V0QXBwUGFja2FnZU5hbWUoKSkgeworICAgICAgICBzdGF0dXNfdCBlcnIgPSBHZXRBcHBQYWNrYWdlTmFtZSgmcGFja2FnZU5hbWUpOworCisgICAgICAgIGlmIChlcnIgIT0gT0spIHsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gZHJtLT5jcmVhdGVQbHVnaW4odXVpZCwgcGFja2FnZU5hbWUpOwogCiAgICAgaWYgKGVyciAhPSBPSykgewogICAgICAgICByZXR1cm4gTlVMTDsKQEAgLTI3NCw3ICszMTgsMTAgQEAKICAgICB9CiAKICAgICBTdHJpbmc4IG1pbWVTdHIgPSBtaW1lVHlwZSA/IFN0cmluZzgobWltZVR5cGUpIDogU3RyaW5nOCgiIik7Ci0gICAgcmV0dXJuIGRybS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVN0cik7CisgICAgYm9vbCBpc1N1cHBvcnRlZCA9IGZhbHNlOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRybS0+aXNDcnlwdG9TY2hlbWVTdXBwb3J0ZWQodXVpZCwgbWltZVN0ciwKKyAgICAgICAgICAgIERybVBsdWdpbjo6a1NlY3VyaXR5TGV2ZWxVbmtub3duLCAmaXNTdXBwb3J0ZWQpOworICAgIHJldHVybiAoc3RhdHVzID09IE9LKSAmJiBpc1N1cHBvcnRlZDsKIH0KIAogRVhQT1JUCkBAIC00MzAsNiArNDc3LDcgQEAKICAgICB9CiAgICAgU3RyaW5nOCBkZWZhdWx0VXJsOwogICAgIERybVBsdWdpbjo6S2V5UmVxdWVzdFR5cGUga2V5UmVxdWVzdFR5cGU7CisgICAgbU9iai0+bUtleVJlcXVlc3QuY2xlYXIoKTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtT2JqLT5tRHJtLT5nZXRLZXlSZXF1ZXN0KCppdGVyLCBtZEluaXQsIFN0cmluZzgobWltZVR5cGUpLAogICAgICAgICAgICAgbWRLZXlUeXBlLCBtZE9wdGlvbmFsUGFyYW1ldGVycywgbU9iai0+bUtleVJlcXVlc3QsIGRlZmF1bHRVcmwsCiAgICAgICAgICAgICAma2V5UmVxdWVzdFR5cGUpOwpAQCAtNjk3LDcgKzc0NSw3IEBACiAgICAgVmVjdG9yPHVpbnQ4X3Q+IGJ5dGVBcnJheTsKICAgICBieXRlQXJyYXkuYXBwZW5kQXJyYXkodmFsdWUsIHZhbHVlU2l6ZSk7CiAKLSAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKG1PYmotPm1Ecm0tPmdldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzgocHJvcGVydHlOYW1lKSwKKyAgICByZXR1cm4gdHJhbnNsYXRlU3RhdHVzKG1PYmotPm1Ecm0tPnNldFByb3BlcnR5Qnl0ZUFycmF5KFN0cmluZzgocHJvcGVydHlOYW1lKSwKICAgICAgICAgICAgICAgICAgICAgYnl0ZUFycmF5KSk7CiB9CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFFeHRyYWN0b3IuY3BwCmluZGV4IGFjODM3YTMuLjBkYTA3NDAgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9OZGtNZWRpYUV4dHJhY3Rvci5jcHAKKysrIGIvbWVkaWEvbmRrL05ka01lZGlhRXh0cmFjdG9yLmNwcApAQCAtMjAsOCArMjAsOSBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvclByaXYuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KICNpbmNsdWRlICJOZGtNZWRpYURhdGFTb3VyY2VQcml2LmgiCi0jaW5jbHVkZSAiTmRrTWVkaWFGb3JtYXRQcml2LmgiCiAKIAogI2luY2x1ZGUgPGludHR5cGVzLmg+CkBAIC0zMywzMSArMzQsMjkgQEAKICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZXRhRGF0YS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L051TWVkaWFFeHRyYWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgotI2luY2x1ZGUgPGFuZHJvaWRfcnVudGltZS9BbmRyb2lkUnVudGltZS5oPgogI2luY2x1ZGUgPGFuZHJvaWRfdXRpbF9CaW5kZXIuaD4KIAogI2luY2x1ZGUgPGpuaS5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotc3RhdGljIG1lZGlhX3N0YXR1c190IHRyYW5zbGF0ZV9lcnJvcihzdGF0dXNfdCBlcnIpIHsKLSAgICBpZiAoZXJyID09IE9LKSB7Ci0gICAgICAgIHJldHVybiBBTUVESUFfT0s7Ci0gICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfRU5EX09GX1NUUkVBTSkgewotICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX0VORF9PRl9TVFJFQU07Ci0gICAgfSBlbHNlIGlmIChlcnIgPT0gRVJST1JfSU8pIHsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTzsKLSAgICB9Ci0KLSAgICBBTE9HRSgic2YgZXJyb3IgY29kZTogJWQiLCBlcnIpOwotICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5LTk9XTjsKLX0KLQogc3RydWN0IEFNZWRpYUV4dHJhY3RvciB7CiAgICAgc3A8TnVNZWRpYUV4dHJhY3Rvcj4gbUltcGw7CiAgICAgc3A8QUJ1ZmZlcj4gbVBzc2hCdWY7CiB9OwogCitzcDxBQnVmZmVyPiBVMzJBcnJheVRvU2l6ZUJ1ZihzaXplX3QgbnVtU3ViU2FtcGxlcywgdWludDMyX3QgKmRhdGEpIHsKKyAgICBpZiAobnVtU3ViU2FtcGxlcyA+ICBTSVpFX01BWCAvIHNpemVvZihzaXplX3QpKSB7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzcDxBQnVmZmVyPiBzaXplYnVmID0gbmV3IEFCdWZmZXIobnVtU3ViU2FtcGxlcyAqIHNpemVvZihzaXplX3QpKTsKKyAgICBzaXplX3QgKnNpemVzID0gKHNpemVfdCAqKXNpemVidWYtPmRhdGEoKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgc2l6ZXMgIT0gTlVMTCAmJiBpIDwgbnVtU3ViU2FtcGxlczsgaSsrKSB7CisgICAgICAgIHNpemVzW2ldID0gZGF0YVtpXTsKKyAgICB9CisgICAgcmV0dXJuIHNpemVidWY7Cit9CisKIGV4dGVybiAiQyIgewogCiBFWFBPUlQKQEAgLTgyLDQ3ICs4MSwzNSBAQAogICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IobURhdGEtPm1JbXBsLT5zZXREYXRhU291cmNlKGZkLCBvZmZzZXQsIGxlbmd0aCkpOwogfQogCittZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZVdpdGhIZWFkZXJzKEFNZWRpYUV4dHJhY3RvciAqbURhdGEsCisgICAgICAgIGNvbnN0IGNoYXIgKnVyaSwKKyAgICAgICAgaW50IG51bWhlYWRlcnMsCisgICAgICAgIGNvbnN0IGNoYXIgKiBjb25zdCAqa2V5cywKKyAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICp2YWx1ZXMpIHsKKworICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVzKSIsIHVyaSk7CisKKyAgICBzcDxNZWRpYUhUVFBTZXJ2aWNlPiBodHRwU2VydmljZSA9IGNyZWF0ZU1lZGlhSHR0cFNlcnZpY2UodXJpKTsKKyAgICBpZiAoaHR0cFNlcnZpY2UgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiY2FuJ3QgY3JlYXRlIGh0dHAgc2VydmljZSIpOworICAgICAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOU1VQUE9SVEVEOworICAgIH0KKworICAgIEtleWVkVmVjdG9yPFN0cmluZzgsIFN0cmluZzg+IGhlYWRlcnM7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1oZWFkZXJzOyArK2kpIHsKKyAgICAgICAgU3RyaW5nOCBrZXk4KGtleXNbaV0pOworICAgICAgICBTdHJpbmc4IHZhbHVlOCh2YWx1ZXNbaV0pOworICAgICAgICBoZWFkZXJzLmFkZChrZXk4LCB2YWx1ZTgpOworICAgIH0KKworICAgIHN0YXR1c190IGVycjsKKyAgICBlcnIgPSBtRGF0YS0+bUltcGwtPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIHVyaSwgbnVtaGVhZGVycyA+IDAgPyAmaGVhZGVycyA6IE5VTEwpOworICAgIHJldHVybiB0cmFuc2xhdGVfZXJyb3IoZXJyKTsKK30KKwogRVhQT1JUCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZShBTWVkaWFFeHRyYWN0b3IgKm1EYXRhLCBjb25zdCBjaGFyICpsb2NhdGlvbikgewotICAgIEFMT0dWKCJzZXREYXRhU291cmNlKCVzKSIsIGxvY2F0aW9uKTsKLSAgICAvLyBUT0RPOiBhZGQgaGVhZGVyIHN1cHBvcnQKLQotICAgIEpOSUVudiAqZW52ID0gQW5kcm9pZFJ1bnRpbWU6OmdldEpOSUVudigpOwotICAgIGpvYmplY3Qgc2VydmljZSA9IE5VTEw7Ci0gICAgaWYgKGVudiA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJzZXREYXRhU291cmNlKHBhdGgpIG11c3QgYmUgY2FsbGVkIGZyb20gSmF2YSB0aHJlYWQiKTsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9VTlNVUFBPUlRFRDsKLSAgICB9Ci0KLSAgICBqY2xhc3MgbWVkaWFodHRwY2xhc3MgPSBlbnYtPkZpbmRDbGFzcygiYW5kcm9pZC9tZWRpYS9NZWRpYUhUVFBTZXJ2aWNlIik7Ci0gICAgaWYgKG1lZGlhaHR0cGNsYXNzID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoImNhbid0IGZpbmQgTWVkaWFIdHRwU2VydmljZSIpOwotICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7Ci0gICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAgam1ldGhvZElEIG1lZGlhSHR0cENyZWF0ZU1ldGhvZCA9IGVudi0+R2V0U3RhdGljTWV0aG9kSUQobWVkaWFodHRwY2xhc3MsCi0gICAgICAgICAgICAiY3JlYXRlSHR0cFNlcnZpY2VCaW5kZXJJZk5lY2Vzc2FyeSIsICIoTGphdmEvbGFuZy9TdHJpbmc7KUxhbmRyb2lkL29zL0lCaW5kZXI7Iik7Ci0gICAgaWYgKG1lZGlhSHR0cENyZWF0ZU1ldGhvZCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJjYW4ndCBmaW5kIG1ldGhvZCIpOwotICAgICAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7Ci0gICAgICAgIHJldHVybiBBTUVESUFfRVJST1JfVU5TVVBQT1JURUQ7Ci0gICAgfQotCi0gICAganN0cmluZyBqbG9jID0gZW52LT5OZXdTdHJpbmdVVEYobG9jYXRpb24pOwotCi0gICAgc2VydmljZSA9IGVudi0+Q2FsbFN0YXRpY09iamVjdE1ldGhvZChtZWRpYWh0dHBjbGFzcywgbWVkaWFIdHRwQ3JlYXRlTWV0aG9kLCBqbG9jKTsKLSAgICBlbnYtPkRlbGV0ZUxvY2FsUmVmKGpsb2MpOwotCi0gICAgc3A8SU1lZGlhSFRUUFNlcnZpY2U+IGh0dHBTZXJ2aWNlOwotICAgIGlmIChzZXJ2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gaWJpbmRlckZvckphdmFPYmplY3QoZW52LCBzZXJ2aWNlKTsKLSAgICAgICAgaHR0cFNlcnZpY2UgPSBpbnRlcmZhY2VfY2FzdDxJTWVkaWFIVFRQU2VydmljZT4oYmluZGVyKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBlcnIgPSBtRGF0YS0+bUltcGwtPnNldERhdGFTb3VyY2UoaHR0cFNlcnZpY2UsIGxvY2F0aW9uLCBOVUxMKTsKLSAgICBlbnYtPkV4Y2VwdGlvbkNsZWFyKCk7Ci0gICAgcmV0dXJuIHRyYW5zbGF0ZV9lcnJvcihlcnIpOworICAgIHJldHVybiBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZVdpdGhIZWFkZXJzKG1EYXRhLCBsb2NhdGlvbiwgMCwgTlVMTCwgTlVMTCk7CiB9CiAKIEVYUE9SVApAQCAtMzYzLDcgKzM1MCw3IEBACiAgICAgaWYgKCFtZXRhLT5maW5kRGF0YShrS2V5RW5jcnlwdGVkU2l6ZXMsICZ0eXBlLCAmY3J5cHRlZGRhdGEsICZjcnlwdGVkc2l6ZSkpIHsKICAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgfQotICAgIHNpemVfdCBudW1TdWJTYW1wbGVzID0gY3J5cHRlZHNpemUgLyBzaXplb2Yoc2l6ZV90KTsKKyAgICBzaXplX3QgbnVtU3ViU2FtcGxlcyA9IGNyeXB0ZWRzaXplIC8gc2l6ZW9mKHVpbnQzMl90KTsKIAogICAgIGNvbnN0IHZvaWQgKmNsZWFyZGF0YTsKICAgICBzaXplX3QgY2xlYXJzaXplOwpAQCAtMzk3LDYgKzM4NCwxNiBAQAogICAgICAgICBtb2RlID0gQ3J5cHRvUGx1Z2luOjprTW9kZV9BRVNfQ1RSOwogICAgIH0KIAorICAgIGlmIChzaXplb2YodWludDMyX3QpICE9IHNpemVvZihzaXplX3QpKSB7CisgICAgICAgIHNwPEFCdWZmZXI+IGNsZWFyYnVmICAgPSBVMzJBcnJheVRvU2l6ZUJ1ZihudW1TdWJTYW1wbGVzLCAodWludDMyX3QgKiljbGVhcmRhdGEpOworICAgICAgICBzcDxBQnVmZmVyPiBjcnlwdGVkYnVmID0gVTMyQXJyYXlUb1NpemVCdWYobnVtU3ViU2FtcGxlcywgKHVpbnQzMl90ICopY3J5cHRlZGRhdGEpOworICAgICAgICBjbGVhcmRhdGEgICA9IGNsZWFyYnVmICAgID09IE5VTEwgPyBOVUxMIDogY2xlYXJidWYtPmRhdGEoKTsKKyAgICAgICAgY3J5cHRlZGRhdGEgPSBjcnlwdGVkZGF0YSA9PSBOVUxMID8gTlVMTCA6IGNyeXB0ZWRidWYtPmRhdGEoKTsKKyAgICAgICAgaWYoY3J5cHRlZGRhdGEgPT0gTlVMTCB8fCBjbGVhcmRhdGEgPT0gTlVMTCkgeworICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gQU1lZGlhQ29kZWNDcnlwdG9JbmZvX25ldygKICAgICAgICAgICAgIG51bVN1YlNhbXBsZXMsCiAgICAgICAgICAgICAodWludDhfdCopIGtleSwKQEAgLTQ3Miw2ICs0NjksMTYgQEAKICAgICAgICAgbWV0YS0+c2V0QnVmZmVyKEFNRURJQUZPUk1BVF9LRVlfTVBFR19VU0VSX0RBVEEsIG1wZWdVc2VyRGF0YSk7CiAgICAgfQogCisgICAgY29uc3Qgdm9pZCAqYXVkaW9QcmVzZW50YXRpb25zUG9pbnRlcjsKKyAgICBzaXplX3QgYXVkaW9QcmVzZW50YXRpb25zTGVuZ3RoOworICAgIGlmIChzYW1wbGVNZXRhLT5maW5kRGF0YSgKKyAgICAgICAgICAgIGtLZXlBdWRpb1ByZXNlbnRhdGlvbkluZm8sICZkYXRhVHlwZSwKKyAgICAgICAgICAgICZhdWRpb1ByZXNlbnRhdGlvbnNQb2ludGVyLCAmYXVkaW9QcmVzZW50YXRpb25zTGVuZ3RoKSkgeworICAgICAgICBzcDxBQnVmZmVyPiBhdWRpb1ByZXNlbnRhdGlvbnNEYXRhID0gQUJ1ZmZlcjo6Q3JlYXRlQXNDb3B5KAorICAgICAgICAgICAgICAgIGF1ZGlvUHJlc2VudGF0aW9uc1BvaW50ZXIsIGF1ZGlvUHJlc2VudGF0aW9uc0xlbmd0aCk7CisgICAgICAgIG1ldGEtPnNldEJ1ZmZlcihBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9JTkZPLCBhdWRpb1ByZXNlbnRhdGlvbnNEYXRhKTsKKyAgICB9CisKICAgICByZXR1cm4gQU1FRElBX09LOwogfQogCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwIGIvbWVkaWEvbmRrL05ka01lZGlhRm9ybWF0LmNwcAppbmRleCAyMDcwN2NjLi41MTEzOGM4IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXQuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdC5jcHAKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFGb3JtYXQuaD4KKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUZvcm1hdFByaXYuaD4KIAogI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KQEAgLTMxLDMxICszMiw4IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1zdHJ1Y3QgQU1lZGlhRm9ybWF0IHsKLSAgICBzcDxBTWVzc2FnZT4gbUZvcm1hdDsKLSAgICBTdHJpbmc4IG1EZWJ1ZzsKLSAgICBLZXllZFZlY3RvcjxTdHJpbmc4LCBTdHJpbmc4PiBtU3RyaW5nQ2FjaGU7Ci19OwotCiBleHRlcm4gIkMiIHsKIAotLy8gcHJpdmF0ZSBmdW5jdGlvbnMgZm9yIGNvbnZlcnNpb24gdG8vZnJvbSBBTWVzc2FnZQotQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyhjb25zdCB2b2lkKiBkYXRhKSB7Ci0gICAgQUxPR1YoInByaXZhdGUgY3RvciIpOwotICAgIEFNZWRpYUZvcm1hdCogbURhdGEgPSBuZXcgQU1lZGlhRm9ybWF0KCk7Ci0gICAgbURhdGEtPm1Gb3JtYXQgPSAqKChzcDxBTWVzc2FnZT4qKWRhdGEpOwotICAgIGlmIChtRGF0YS0+bUZvcm1hdCA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dXKCJnb3QgTlVMTCBmb3JtYXQiKTsKLSAgICAgICAgbURhdGEtPm1Gb3JtYXQgPSBuZXcgQU1lc3NhZ2U7Ci0gICAgfQotICAgIHJldHVybiBtRGF0YTsKLX0KLQotdm9pZCBBTWVkaWFGb3JtYXRfZ2V0Rm9ybWF0KGNvbnN0IEFNZWRpYUZvcm1hdCogbURhdGEsIHZvaWQqIGRlc3QpIHsKLSAgICAqKChzcDxBTWVzc2FnZT4qKWRlc3QpID0gbURhdGEtPm1Gb3JtYXQ7Ci19Ci0KLQogLyoKICAqIHB1YmxpYyBmdW5jdGlvbiBmb2xsb3cKICAqLwpAQCAtNzMsNiArNTEsMjEgQEAKICAgICByZXR1cm4gQU1FRElBX09LOwogfQogCitFWFBPUlQKK3ZvaWQgQU1lZGlhRm9ybWF0X2NsZWFyKEFNZWRpYUZvcm1hdCAqZm9ybWF0KSB7CisgICAgZm9ybWF0LT5tRm9ybWF0LT5jbGVhcigpOworfQorCitFWFBPUlQKK21lZGlhX3N0YXR1c190IEFNZWRpYUZvcm1hdF9jb3B5KEFNZWRpYUZvcm1hdCAqdG8sIEFNZWRpYUZvcm1hdCAqZnJvbSkgeworICAgIGlmICghdG8gfHwgIWZyb20pIHsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUjsKKyAgICB9CisgICAgdG8tPm1Gb3JtYXQtPmNsZWFyKCk7CisgICAgdG8tPm1Gb3JtYXQtPmV4dGVuZChmcm9tLT5tRm9ybWF0KTsKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCiAKIEVYUE9SVAogY29uc3QgY2hhciogQU1lZGlhRm9ybWF0X3RvU3RyaW5nKEFNZWRpYUZvcm1hdCAqbURhdGEpIHsKQEAgLTI1NSw3ICsyNDgsNyBAQAogfQogCiBFWFBPUlQKLXZvaWQgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciogbmFtZSwgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKK3ZvaWQgQU1lZGlhRm9ybWF0X3NldEJ1ZmZlcihBTWVkaWFGb3JtYXQqIGZvcm1hdCwgY29uc3QgY2hhciogbmFtZSwgY29uc3Qgdm9pZCogZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICAvLyB0aGUgQUJ1ZmZlcih2b2lkKiwgc2l6ZV90KSBjb25zdHJ1Y3RvciBkb2Vzbid0IHRha2Ugb3duZXJzaGlwIG9mIHRoZSBkYXRhLCBzbyBjcmVhdGUKICAgICAvLyBhIG5ldyBidWZmZXIgYW5kIGNvcHkgdGhlIGRhdGEgaW50byBpdAogICAgIHNwPEFCdWZmZXI+IGJ1ZiA9IG5ldyBBQnVmZmVyKHNpemUpOwpAQCAtMjc0LDY1ICsyNjcsMTI0IEBACiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfTUFYX09VVFBVVF9DSEFOTkVMX0NPVU5UID0gImFhYy1tYXgtb3V0cHV0LWNoYW5uZWxfY291bnQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX1BST0ZJTEUgPSAiYWFjLXByb2ZpbGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX1NCUl9NT0RFID0gImFhYy1zYnItbW9kZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTSA9ICJhbGJ1bSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCA9ICJhbGJ1bWFydCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVElTVCA9ICJhbGJ1bWFydGlzdCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BUlRJU1QgPSAiYXJ0aXN0IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9JTkZPID0gImF1ZGlvLXByZXNlbnRhdGlvbi1pbmZvIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9QUkVTRU5UQVRJT05fSUQgPQorICAgICAgICAiYXVkaW8tcHJlc2VudGF0aW9uLXByZXNlbnRhdGlvbi1pZCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVURJT19QUkVTRU5UQVRJT05fUFJPR1JBTV9JRCA9ICJhdWRpby1wcmVzZW50YXRpb24tcHJvZ3JhbS1pZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVURJT19TRVNTSU9OX0lEID0gImF1ZGlvLXNlc3Npb24taWQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVUSE9SID0gImF1dGhvciI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9CSVRSQVRFX01PREUgPSAiYml0cmF0ZS1tb2RlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFID0gImJpdHJhdGUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFID0gImJpdHMtcGVyLXNhbXBsZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DQVBUVVJFX1JBVEUgPSAiY2FwdHVyZS1yYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVIgPSAiY2R0cmFja251bSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5UID0gImNoYW5uZWwtY291bnQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9NQVNLID0gImNoYW5uZWwtbWFzayI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQgPSAiY29sb3ItZm9ybWF0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1JBTkdFID0gImNvbG9yLXJhbmdlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1NUQU5EQVJEID0gImNvbG9yLXN0YW5kYXJkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSID0gImNvbG9yLXRyYW5zZmVyIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTVBJTEFUSU9OID0gImNvbXBpbGF0aW9uIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTVBMRVhJVFkgPSAiY29tcGxleGl0eSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DT01QT1NFUiA9ICJjb21wb3NlciI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUkVBVEVfSU5QVVRfU1VSRkFDRV9TVVNQRU5ERUQgPSAiY3JlYXRlLWlucHV0LWJ1ZmZlcnMtc3VzcGVuZGVkIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUgPSAiY3J5cHRvLWRlZmF1bHQtaXYtc2l6ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX0JZVEVfQkxPQ0sgPSAiY3J5cHRvLWVuY3J5cHRlZC1ieXRlLWJsb2NrIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfU0laRVMgPSAiY3J5cHRvLWVuY3J5cHRlZC1zaXplcyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVYgPSAiY3J5cHRvLWl2IjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVkgPSAiY3J5cHRvLWtleSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSA9ICJjcnlwdG8tbW9kZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVMgPSAiY3J5cHRvLXBsYWluLXNpemVzIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0sgPSAiY3J5cHRvLXNraXAtYnl0ZS1ibG9jayI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0QgPSAiY3NkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8wID0gImNzZC0wIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8xID0gImNzZC0xIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF8yID0gImNzZC0yIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NTRF9BVkMgPSAiY3NkLWF2YyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQyA9ICJjc2QtaGV2YyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9EMjYzID0gImQyNjMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfREFURSA9ICJkYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVIgPSAiZGlzY251bSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0NST1AgPSAiY3JvcCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX0hFSUdIVCA9ICJkaXNwbGF5LWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ESVNQTEFZX1dJRFRIID0gImRpc3BsYXktd2lkdGgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRFVSQVRJT04gPSAiZHVyYXRpb25VcyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZID0gImVuY29kZXItZGVsYXkiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HID0gImVuY29kZXItcGFkZGluZyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FU0RTID0gImVzZHMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9PRkZTRVQgPSAiZXhpZi1vZmZzZXQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9TSVpFID0gImV4aWYtc2l6ZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMID0gImZsYWMtY29tcHJlc3Npb24tbGV2ZWwiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfQ09VTlQgPSAiZnJhbWUtY291bnQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSA9ICJmcmFtZS1yYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0dFTlJFID0gImdlbnJlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0dSSURfQ09MVU1OUyA9ICJncmlkLWNvbHMiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9ST1dTID0gImdyaWQtcm93cyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9IQVBUSUNfQ0hBTk5FTF9DT1VOVCA9ICJoYXB0aWMtY2hhbm5lbC1jb3VudCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9IRFJfU1RBVElDX0lORk8gPSAiaGRyLXN0YXRpYy1pbmZvIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hEUjEwX1BMVVNfSU5GTyA9ICJoZHIxMC1wbHVzLWluZm8iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hUID0gImhlaWdodCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JQ0NfUFJPRklMRSA9ICJpY2MtcHJvZmlsZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JTlRSQV9SRUZSRVNIX1BFUklPRCA9ICJpbnRyYS1yZWZyZXNoLXBlcmlvZCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19BRFRTID0gImlzLWFkdHMiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfQVVUT1NFTEVDVCA9ICJpcy1hdXRvc2VsZWN0IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX0RFRkFVTFQgPSAiaXMtZGVmYXVsdCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JU19GT1JDRURfU1VCVElUTEUgPSAiaXMtZm9yY2VkLXN1YnRpdGxlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUUgPSAiaXMtc3luYy1mcmFtZSI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JX0ZSQU1FX0lOVEVSVkFMID0gImktZnJhbWUtaW50ZXJ2YWwiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEFOR1VBR0UgPSAibGFuZ3VhZ2UiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTEFURU5DWSA9ICJsYXRlbmN5IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xFVkVMID0gImxldmVsIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xPQ0FUSU9OID0gImxvY2F0aW9uIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xPT1AgPSAibG9vcCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9MWVJJQ0lTVCA9ICJseXJpY2lzdCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQU5VRkFDVFVSRVIgPSAibWFudWZhY3R1cmVyIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9CSVRfUkFURSA9ICJtYXgtYml0cmF0ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfRlBTX1RPX0VOQ09ERVIgPSAibWF4LWZwcy10by1lbmNvZGVyIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9IRUlHSFQgPSAibWF4LWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRSA9ICJtYXgtaW5wdXQtc2l6ZSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSID0gIm1heC1wdHMtZ2FwLXRvLWVuY29kZXIiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX1dJRFRIID0gIm1heC13aWR0aCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NSU1FID0gIm1pbWUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFR19VU0VSX0RBVEEgPSAibXBlZy11c2VyLWRhdGEiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTVBFRzJfU1RSRUFNX0hFQURFUiA9ICJtcGVnMi1zdHJlYW0taGVhZGVyIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX09QRVJBVElOR19SQVRFID0gIm9wZXJhdGluZy1yYXRlIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BDTV9FTkNPRElORyA9ICJwY20tZW5jb2RpbmciOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFJJT1JJVFkgPSAicHJpb3JpdHkiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSA9ICJwcm9maWxlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BDTV9CSUdfRU5ESUFOID0gInBjbS1iaWctZW5kaWFuIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1BTU0ggPSAicHNzaCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUCA9ICJwdXNoLWJsYW5rLWJ1ZmZlcnMtb24tc2h1dGRvd24iOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSID0gInJlcGVhdC1wcmV2aW91cy1mcmFtZS1hZnRlciI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTiA9ICJyb3RhdGlvbi1kZWdyZWVzIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFID0gInNhbXBsZS1yYXRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NBUl9IRUlHSFQgPSAic2FyLWhlaWdodCI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TQVJfV0lEVEggPSAic2FyLXdpZHRoIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1NFSSA9ICJzZWkiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0xJQ0VfSEVJR0hUID0gInNsaWNlLWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9TVFJJREUgPSAic3RyaWRlIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RBUkdFVF9USU1FID0gInRhcmdldC10aW1lIjsKK0VYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0NPVU5UID0gInRlbXBvcmFsLWxheWVyLWNvdW50IjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0lEID0gInRlbXBvcmFsLWxheWVyLWlkIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSSU5HID0gInRzLXNjaGVtYSI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9URVhUX0ZPUk1BVF9EQVRBID0gInRleHQtZm9ybWF0LWRhdGEiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0NTRF9IRVZDID0gInRodW1ibmFpbC1jc2QtaGV2YyI7CitFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USFVNQk5BSUxfSEVJR0hUID0gInRodW1ibmFpbC1oZWlnaHQiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUgPSAidGh1bWJuYWlsLXRpbWUiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1dJRFRIID0gInRodW1ibmFpbC13aWR0aCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USUxFX0hFSUdIVCA9ICJ0aWxlLWhlaWdodCI7CiBFWFBPUlQgY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9USUxFX1dJRFRIID0gInRpbGUtd2lkdGgiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElNRV9VUyA9ICJ0aW1lVXMiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElUTEUgPSAidGl0bGUiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQgPSAidHJhY2staWQiOwogRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSU5ERVggPSAidHJhY2staW5kZXgiOworRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVkFMSURfU0FNUExFUyA9ICJ2YWxpZC1zYW1wbGVzIjsKIEVYUE9SVCBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1dJRFRIID0gIndpZHRoIjsKLQorRVhQT1JUIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfWUVBUiA9ICJ5ZWFyIjsKIAogfSAvLyBleHRlcm4gIkMiCiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdFByaXYuaCBiL21lZGlhL25kay9OZGtNZWRpYUZvcm1hdFByaXYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzZhNjU2My4uMDAwMDAwMAotLS0gYS9tZWRpYS9uZGsvTmRrTWVkaWFGb3JtYXRQcml2LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE0IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIFRoaXMgZmlsZSBkZWZpbmVzIGFuIE5ESyBBUEkuCi0gKiBEbyBub3QgcmVtb3ZlIG1ldGhvZHMuCi0gKiBEbyBub3QgY2hhbmdlIG1ldGhvZCBzaWduYXR1cmVzLgotICogRG8gbm90IGNoYW5nZSB0aGUgdmFsdWUgb2YgY29uc3RhbnRzLgotICogRG8gbm90IGNoYW5nZSB0aGUgc2l6ZSBvZiBhbnkgb2YgdGhlIGNsYXNzZXMgZGVmaW5lZCBpbiBoZXJlLgotICogRG8gbm90IHJlZmVyZW5jZSB0eXBlcyB0aGF0IGFyZSBub3QgcGFydCBvZiB0aGUgTkRLLgotICogRG8gbm90ICNpbmNsdWRlIGZpbGVzIHRoYXQgYXJlbid0IHBhcnQgb2YgdGhlIE5ESy4KLSAqLwotCi0jaWZuZGVmIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAotI2RlZmluZSBfTkRLX01FRElBX0ZPUk1BVF9QUklWX0gKLQotI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0Lmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotQU1lZGlhRm9ybWF0KiBBTWVkaWFGb3JtYXRfZnJvbU1zZyh2b2lkKik7Ci12b2lkIEFNZWRpYUZvcm1hdF9nZXRGb3JtYXQoY29uc3QgQU1lZGlhRm9ybWF0KiBtRGF0YSwgdm9pZCogZGVzdCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAvLyBleHRlcm4gIkMiCi0jZW5kaWYKLQotI2VuZGlmIC8vIF9OREtfTUVESUFfRk9STUFUX1BSSVZfSAotCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAgYi9tZWRpYS9uZGsvTmRrTWVkaWFNdXhlci5jcHAKaW5kZXggNDRjYWZiMi4uZDE5OTJiZiAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL05ka01lZGlhTXV4ZXIuY3BwCisrKyBiL21lZGlhL25kay9OZGtNZWRpYU11eGVyLmNwcApAQCAtMjAsNyArMjAsOCBAQAogCiAjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFNdXhlci5oPgogI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhQ29kZWMuaD4KLSNpbmNsdWRlICJOZGtNZWRpYUZvcm1hdFByaXYuaCIKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUVycm9yUHJpdi5oPgorI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRm9ybWF0UHJpdi5oPgogCiAKICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KQEAgLTM1LDE0ICszNiw2IEBACiAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOwogCi1zdGF0aWMgbWVkaWFfc3RhdHVzX3QgdHJhbnNsYXRlX2Vycm9yKHN0YXR1c190IGVycikgewotICAgIGlmIChlcnIgPT0gT0spIHsKLSAgICAgICAgcmV0dXJuIEFNRURJQV9PSzsKLSAgICB9Ci0gICAgQUxPR0UoInNmIGVycm9yIGNvZGU6ICVkIiwgZXJyKTsKLSAgICByZXR1cm4gQU1FRElBX0VSUk9SX1VOS05PV047Ci19Ci0KIHN0cnVjdCBBTWVkaWFNdXhlciB7CiAgICAgc3A8TWVkaWFNdXhlcj4gbUltcGw7CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9PV05FUlMgYi9tZWRpYS9uZGsvT1dORVJTCmluZGV4IDExZTgzNDAuLjlkYzQ0MWUgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9PV05FUlMKKysrIGIvbWVkaWEvbmRrL09XTkVSUwpAQCAtMSw1ICsxLDMgQEAKIG1hcmNvbmVAZ29vZ2xlLmNvbQogIyBGb3IgQUltYWdlL0FJbWFnZVJlYWRlcgotZXRhbHZhbGFAZ29vZ2xlLmNvbQoteWluY2hpYXllaEBnb29nbGUuY29tCi16aGlqdW5oZUBnb29nbGUuY29tCitpbmNsdWRlIHBsYXRmb3JtL2ZyYW1ld29ya3MvYXY6L2NhbWVyYS9PV05FUlMKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZS5oCmluZGV4IGY5MzYxMTguLjYyYjg2MjQgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2UuaApAQCAtNDk5LDcgKzQ5OSw1MSBAQAogICAgICAqIDxwPldoZW4gYW4ge0BsaW5rIEFJbWFnZX0gb2YgdGhpcyBmb3JtYXQgaXMgb2J0YWluZWQgZnJvbSBhbiB7QGxpbmsgQUltYWdlUmVhZGVyfSBvcgogICAgICAqIHtAbGluayBBSW1hZ2VfZ2V0TnVtYmVyT2ZQbGFuZXMoKX0gbWV0aG9kIHdpbGwgcmV0dXJuIHplcm8uPC9wPgogICAgICAqLwotICAgIEFJTUFHRV9GT1JNQVRfUFJJVkFURSAgICAgICAgICAgPSAweDIyCisgICAgQUlNQUdFX0ZPUk1BVF9QUklWQVRFICAgICAgICAgICA9IDB4MjIsCisKKyAgICAvKioKKyAgICAgKiBBbmRyb2lkIFk4IGZvcm1hdC4KKyAgICAgKgorICAgICAqIDxwPlk4IGlzIGEgcGxhbmFyIGZvcm1hdCBjb21wcmlzZWQgb2YgYSBXeEggWSBwbGFuZSBvbmx5LCB3aXRoIGVhY2ggcGl4ZWwKKyAgICAgKiBiZWluZyByZXByZXNlbnRlZCBieSA4IGJpdHMuPC9wPgorICAgICAqCisgICAgICogPHA+VGhpcyBmb3JtYXQgYXNzdW1lcworICAgICAqIDx1bD4KKyAgICAgKiA8bGk+YW4gZXZlbiB3aWR0aDwvbGk+CisgICAgICogPGxpPmFuIGV2ZW4gaGVpZ2h0PC9saT4KKyAgICAgKiA8bGk+YSBob3Jpem9udGFsIHN0cmlkZSBtdWx0aXBsZSBvZiAxNiBwaXhlbHM8L2xpPgorICAgICAqIDwvdWw+CisgICAgICogPC9wPgorICAgICAqCisgICAgICogPHByZT4gc2l6ZSA9IHN0cmlkZSAqIGhlaWdodCA8L3ByZT4KKyAgICAgKgorICAgICAqIDxwPkZvciBleGFtcGxlLCB0aGUge0BsaW5rIEFJbWFnZX0gb2JqZWN0IGNhbiBwcm92aWRlIGRhdGEKKyAgICAgKiBpbiB0aGlzIGZvcm1hdCBmcm9tIGEge0BsaW5rIEFDYW1lcmFEZXZpY2V9IChpZiBzdXBwb3J0ZWQpIHRocm91Z2ggYQorICAgICAqIHtAbGluayBBSW1hZ2VSZWFkZXJ9IG9iamVjdC4gVGhlIG51bWJlciBvZiBwbGFuZXMgcmV0dXJuZWQgYnkKKyAgICAgKiB7QGxpbmsgQUltYWdlX2dldE51bWJlck9mUGxhbmVzfSB3aWxsIGFsd2F5cyBiZSAxLiBUaGUgcGl4ZWwgc3RyaWRlIHJldHVybmVkIGJ5CisgICAgICoge0BsaW5rIEFJbWFnZV9nZXRQbGFuZVBpeGVsU3RyaWRlfSB3aWxsIGFsd2F5cyBiZSAxLCBhbmQgdGhlCisgICAgICoge0BsaW5rIEFJbWFnZV9nZXRQbGFuZVJvd1N0cmlkZX0gZGVzY3JpYmVkIHRoZSB2ZXJ0aWNhbCBuZWlnaGJvcmluZyBwaXhlbCBkaXN0YW5jZQorICAgICAqIChpbiBieXRlcykgYmV0d2VlbiBhZGphY2VudCByb3dzLjwvcD4KKyAgICAgKgorICAgICAqLworICAgIEFJTUFHRV9GT1JNQVRfWTggPSAweDIwMjAzODU5LAorCisgICAgLyoqCisgICAgICogQ29tcHJlc3NlZCBIRUlDIGZvcm1hdC4KKyAgICAgKgorICAgICAqIDxwPlRoaXMgZm9ybWF0IGRlZmluZXMgdGhlIEhFSUMgYnJhbmQgb2YgSGlnaCBFZmZpY2llbmN5IEltYWdlIEZpbGUKKyAgICAgKiBGb3JtYXQgYXMgZGVzY3JpYmVkIGluIElTTy9JRUMgMjMwMDgtMTIuPC9wPgorICAgICAqLworICAgIEFJTUFHRV9GT1JNQVRfSEVJQyA9IDB4NDg0NTQ5NDYsCisKKyAgICAvKioKKyAgICAgKiBEZXB0aCBhdWdtZW50ZWQgY29tcHJlc3NlZCBKUEVHIGZvcm1hdC4KKyAgICAgKgorICAgICAqIDxwPkpQRUcgY29tcHJlc3NlZCBtYWluIGltYWdlIGFsb25nIHdpdGggWE1QIGVtYmVkZGVkIGRlcHRoIG1ldGFkYXRhCisgICAgICogZm9sbG93aW5nIElTTyAxNjY4NC0xOjIwMTEoRSkuPC9wPgorICAgICAqLworICAgIEFJTUFHRV9GT1JNQVRfREVQVEhfSlBFRyA9IDB4Njk2NTY5NjMsCisKIH07CiAKIC8qKgpAQCAtNTI2LDYgKzU3MCw4IEBACiAgKiByZXR1cm4ge0BsaW5rIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVH0uIEFwcGxpY2F0aW9uIHN0aWxsIG5lZWRzIHRvIGNhbGwgdGhpcyBtZXRob2Qgb24gdGhvc2UKICAqIHtAbGluayBBSW1hZ2V9IG9iamVjdHMgdG8gZnVsbHkgZGVsZXRlIHRoZSB7QGxpbmsgQUltYWdlfSBvYmplY3QgZnJvbSBtZW1vcnkuPC9wPgogICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjQuCisgKgogICogQHBhcmFtIGltYWdlIFRoZSB7QGxpbmsgQUltYWdlfSB0byBiZSBkZWxldGVkLgogICovCiB2b2lkIEFJbWFnZV9kZWxldGUoQUltYWdlKiBpbWFnZSkgX19JTlRST0RVQ0VEX0lOKDI0KTsKQEAgLTUzMyw2ICs1NzksOCBAQAogLyoqCiAgKiBRdWVyeSB0aGUgd2lkdGggb2YgdGhlIGlucHV0IHtAbGluayBBSW1hZ2V9LgogICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjQuCisgKgogICogQHBhcmFtIGltYWdlIHRoZSB7QGxpbmsgQUltYWdlfSBvZiBpbnRlcmVzdC4KICAqIEBwYXJhbSB3aWR0aCB0aGUgd2lkdGggb2YgdGhlIGltYWdlIHdpbGwgYmUgZmlsbGVkIGhlcmUgaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWVkcy4KICAqCkBAIC01NDcsNiArNTk1LDggQEAKIC8qKgogICogUXVlcnkgdGhlIGhlaWdodCBvZiB0aGUgaW5wdXQge0BsaW5rIEFJbWFnZX0uCiAgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNC4KKyAqCiAgKiBAcGFyYW0gaW1hZ2UgdGhlIHtAbGluayBBSW1hZ2V9IG9mIGludGVyZXN0LgogICogQHBhcmFtIGhlaWdodCB0aGUgaGVpZ2h0IG9mIHRoZSBpbWFnZSB3aWxsIGJlIGZpbGxlZCBoZXJlIGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVlZHMuCiAgKgpAQCAtNTYzLDYgKzYxMyw4IEBACiAgKgogICogPHA+VGhlIGZvcm1hdCB2YWx1ZSB3aWxsIGJlIG9uZSBvZiBBSU1BR0VfRk9STUFUXyogZW51bSB2YWx1ZS48L3A+CiAgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNC4KKyAqCiAgKiBAcGFyYW0gaW1hZ2UgdGhlIHtAbGluayBBSW1hZ2V9IG9mIGludGVyZXN0LgogICogQHBhcmFtIGZvcm1hdCB0aGUgZm9ybWF0IG9mIHRoZSBpbWFnZSB3aWxsIGJlIGZpbGxlZCBoZXJlIGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVlZHMuCiAgKgpAQCAtNTgwLDYgKzYzMiw4IEBACiAgKiA8cD5UaGUgY3JvcCByZWN0YW5nbGUgc3BlY2lmaWVzIHRoZSByZWdpb24gb2YgdmFsaWQgcGl4ZWxzIGluIHRoZSBpbWFnZSwgdXNpbmcgY29vcmRpbmF0ZXMgaW4gdGhlCiAgKiBsYXJnZXN0LXJlc29sdXRpb24gcGxhbmUuPC9wPgogICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjQuCisgKgogICogQHBhcmFtIGltYWdlIHRoZSB7QGxpbmsgQUltYWdlfSBvZiBpbnRlcmVzdC4KICAqIEBwYXJhbSByZWN0IHRoZSBjcm9wcGVkIHJlY3RhbmdsZSBvZiB0aGUgaW1hZ2Ugd2lsbCBiZSBmaWxsZWQgaGVyZSBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZWRzLgogICoKQEAgLTYwNCw2ICs2NTgsOCBAQAogICoge0BsaW5rIEFDYW1lcmFDYXB0dXJlU2Vzc2lvbl9jYXB0dXJlQ2FsbGJhY2tzI29uQ2FwdHVyZUNvbXBsZXRlZH0gY2FsbGJhY2suCiAgKiA8L3A+CiAgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNC4KKyAqCiAgKiBAcGFyYW0gaW1hZ2UgdGhlIHtAbGluayBBSW1hZ2V9IG9mIGludGVyZXN0LgogICogQHBhcmFtIHRpbWVzdGFtcE5zIHRoZSB0aW1lc3RhbXAgb2YgdGhlIGltYWdlIHdpbGwgYmUgZmlsbGVkIGhlcmUgaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWVkcy4KICAqCkBAIC02MjEsNiArNjc3LDggQEAKICAqIDxwPlRoZSBudW1iZXIgb2YgcGxhbmUgb2YgYW4ge0BsaW5rIEFJbWFnZX0gaXMgZGV0ZXJtaW5lZCBieSBpdHMgZm9ybWF0LCB3aGljaCBjYW4gYmUgcXVlcmllZCBieQogICoge0BsaW5rIEFJbWFnZV9nZXRGb3JtYXR9IG1ldGhvZC48L3A+CiAgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNC4KKyAqCiAgKiBAcGFyYW0gaW1hZ2UgdGhlIHtAbGluayBBSW1hZ2V9IG9mIGludGVyZXN0LgogICogQHBhcmFtIG51bVBsYW5lcyB0aGUgbnVtYmVyIG9mIHBsYW5lcyBvZiB0aGUgaW1hZ2Ugd2lsbCBiZSBmaWxsZWQgaGVyZSBpZiB0aGUgbWV0aG9kIGNhbGwKICAqICAgICAgICAgc3VjY2VlZWRzLgpAQCAtNjQzLDYgKzcwMSw4IEBACiAgKiBiZWluZyByZXR1cm5lZC4KICAqIEZvciBmb3JtYXRzIHdoZXJlIHBpeGVsIHN0cmlkZSBpcyB3ZWxsIGRlZmluZWQsIHRoZSBwaXhlbCBzdHJpZGUgaXMgYWx3YXlzIGdyZWF0ZXIgdGhhbiAwLjwvcD4KICAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI0LgorICoKICAqIEBwYXJhbSBpbWFnZSB0aGUge0BsaW5rIEFJbWFnZX0gb2YgaW50ZXJlc3QuCiAgKiBAcGFyYW0gcGxhbmVJZHggdGhlIGluZGV4IG9mIHRoZSBwbGFuZS4gTXVzdCBiZSBsZXNzIHRoYW4gdGhlIG51bWJlciBvZiBwbGFuZXMgb2YgaW5wdXQgaW1hZ2UuCiAgKiBAcGFyYW0gcGl4ZWxTdHJpZGUgdGhlIHBpeGVsIHN0cmlkZSBvZiB0aGUgaW1hZ2Ugd2lsbCBiZSBmaWxsZWQgaGVyZSBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZWRzLgpAQCAtNjcwLDYgKzczMCw4IEBACiAgKiBiZWluZyByZXR1cm5lZC4KICAqIEZvciBmb3JtYXRzIHdoZXJlIHJvdyBzdHJpZGUgaXMgd2VsbCBkZWZpbmVkLCB0aGUgcm93IHN0cmlkZSBpcyBhbHdheXMgZ3JlYXRlciB0aGFuIDAuPC9wPgogICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjQuCisgKgogICogQHBhcmFtIGltYWdlIHRoZSB7QGxpbmsgQUltYWdlfSBvZiBpbnRlcmVzdC4KICAqIEBwYXJhbSBwbGFuZUlkeCB0aGUgaW5kZXggb2YgdGhlIHBsYW5lLiBNdXN0IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHBsYW5lcyBvZiBpbnB1dCBpbWFnZS4KICAqIEBwYXJhbSByb3dTdHJpZGUgdGhlIHJvdyBzdHJpZGUgb2YgdGhlIGltYWdlIHdpbGwgYmUgZmlsbGVkIGhlcmUgaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWVkcy4KQEAgLTY5NSw2ICs3NTcsOCBAQAogICogcG9pbnRlciBmcm9tIHByZXZpb3VzIEFJbWFnZV9nZXRQbGFuZURhdGEgY2FsbCBiZWNvbWVzIGludmFsaWQuIERvIE5PVCB1c2UgaXQgYWZ0ZXIgdGhlCiAgKiB7QGxpbmsgQUltYWdlfSBvciB0aGUgcGFyZW50IHtAbGluayBBSW1hZ2VSZWFkZXJ9IGlzIGRlbGV0ZWQuPC9wPgogICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjQuCisgKgogICogQHBhcmFtIGltYWdlIHRoZSB7QGxpbmsgQUltYWdlfSBvZiBpbnRlcmVzdC4KICAqIEBwYXJhbSBwbGFuZUlkeCB0aGUgaW5kZXggb2YgdGhlIHBsYW5lLiBNdXN0IGJlIGxlc3MgdGhhbiB0aGUgbnVtYmVyIG9mIHBsYW5lcyBvZiBpbnB1dCBpbWFnZS4KICAqIEBwYXJhbSBkYXRhIHRoZSBkYXRhIHBvaW50ZXIgb2YgdGhlIGltYWdlIHdpbGwgYmUgZmlsbGVkIGhlcmUgaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWVkcy4KQEAgLTcyNSw2ICs3ODksOCBAQAogICogc2lnbmFsIHRoZSByZWxlYXNlIG9mIHRoZSBoYXJkd2FyZSBidWZmZXIgYmFjayB0byB0aGUge0BsaW5rIEFJbWFnZVJlYWRlcn0ncyBxdWV1ZSB1c2luZwogICogcmVsZWFzZUZlbmNlRmQuPC9wPgogICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjYuCisgKgogICogQHBhcmFtIGltYWdlIFRoZSB7QGxpbmsgQUltYWdlfSB0byBiZSBkZWxldGVkLgogICogQHBhcmFtIHJlbGVhc2VGZW5jZUZkIEEgc3luYyBmZW5jZSBmZCBkZWZpbmVkIGluIHtAbGluayBzeW5jLmh9LCB3aGljaCBzaWduYWxzIHRoZSByZWxlYXNlIG9mCiAgKiAgICAgICAgIHVuZGVybHlpbmcge0BsaW5rIEFIYXJkd2FyZUJ1ZmZlcn0uCkBAIC03NTAsNiArODE2LDggQEAKICAqIHtAbGluayBBSW1hZ2VSZWFkZXJfc2V0QnVmZmVyUmVtb3ZlZExpc3RlbmVyfSB0byBiZSBub3RpZmllZCB3aGVuIHRoZSBidWZmZXIgaXMgbm8gbG9uZ2VyIHVzZWQKICAqIGJ5IHtAbGluayBBSW1hZ2VSZWFkZXJ9LjwvcD4KICAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI2LgorICoKICAqIEBwYXJhbSBpbWFnZSB0aGUge0BsaW5rIEFJbWFnZX0gb2YgaW50ZXJlc3QuCiAgKiBAcGFyYW0gb3V0QnVmZmVyIFRoZSBtZW1vcnkgYXJlYSBwb2ludGVkIHRvIGJ5IGJ1ZmZlciB3aWxsIGNvbnRhaW4gdGhlIGFjcXVpcmVkIEFIYXJkd2FyZUJ1ZmZlcgogICogICAgICAgICBoYW5kbGUuCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrSW1hZ2VSZWFkZXIuaAppbmRleCA2OGRlMTc2Li42MDBmZmM5IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtJbWFnZVJlYWRlci5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka0ltYWdlUmVhZGVyLmgKQEAgLTM3LDYgKzM3LDkgQEAKICNkZWZpbmUgX05ES19JTUFHRV9SRUFERVJfSAogCiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CisjaWZkZWYgX19BTkRST0lEX1ZOREtfXworI2luY2x1ZGUgPGN1dGlscy9uYXRpdmVfaGFuZGxlLmg+CisjZW5kaWYKIAogI2luY2x1ZGUgPGFuZHJvaWQvbmF0aXZlX3dpbmRvdy5oPgogI2luY2x1ZGUgIk5ka01lZGlhRXJyb3IuaCIKQEAgLTY0LDYgKzY3LDggQEAKICAqIFRoZSB2YWxpZCBzaXplcyBhbmQgZm9ybWF0cyBkZXBlbmQgb24gdGhlIHNvdXJjZSBvZiB0aGUgaW1hZ2UgZGF0YS4KICAqIDwvcD4KICAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI0LgorICoKICAqIEBwYXJhbSB3aWR0aCBUaGUgZGVmYXVsdCB3aWR0aCBpbiBwaXhlbHMgb2YgdGhlIEltYWdlcyB0aGF0IHRoaXMgcmVhZGVyIHdpbGwgcHJvZHVjZS4KICAqIEBwYXJhbSBoZWlnaHQgVGhlIGRlZmF1bHQgaGVpZ2h0IGluIHBpeGVscyBvZiB0aGUgSW1hZ2VzIHRoYXQgdGhpcyByZWFkZXIgd2lsbCBwcm9kdWNlLgogICogQHBhcmFtIGZvcm1hdCBUaGUgZm9ybWF0IG9mIHRoZSBJbWFnZSB0aGF0IHRoaXMgcmVhZGVyIHdpbGwgcHJvZHVjZS4gVGhpcyBtdXN0IGJlIG9uZSBvZiB0aGUKQEAgLTk4LDYgKzEwMyw4IEBACiAgKiBtYWtpbmcgYW55IG9mIGRhdGEgcG9pbnRlcnMgb2J0YWluZWQgZnJvbSB7QGxpbmsgQUltYWdlX2dldFBsYW5lRGF0YX0gaW52YWxpZC4gRG8gTk9UIGFjY2VzcwogICogdGhlIHJlYWRlciBvYmplY3Qgb3IgYW55IG9mIHRob3NlIGRhdGEgcG9pbnRlcnMgYWZ0ZXIgdGhpcyBtZXRob2QgcmV0dXJucy48L3A+CiAgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNC4KKyAqCiAgKiBAcGFyYW0gcmVhZGVyIFRoZSBpbWFnZSByZWFkZXIgdG8gYmUgZGVsZXRlZC4KICAqLwogdm9pZCBBSW1hZ2VSZWFkZXJfZGVsZXRlKEFJbWFnZVJlYWRlciogcmVhZGVyKSBfX0lOVFJPRFVDRURfSU4oMjQpOwpAQCAtMTA1LDYgKzExMiw4IEBACiAvKioKICAqIEdldCBhIHtAbGluayBBTmF0aXZlV2luZG93fSB0aGF0IGNhbiBiZSB1c2VkIHRvIHByb2R1Y2Uge0BsaW5rIEFJbWFnZX0gZm9yIHRoaXMgaW1hZ2UgcmVhZGVyLgogICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjQuCisgKgogICogQHBhcmFtIHJlYWRlciBUaGUgaW1hZ2UgcmVhZGVyIG9mIGludGVyZXN0LgogICogQHBhcmFtIHdpbmRvdyBUaGUgb3V0cHV0IHtAbGluayBBTmF0aXZlV2luZG93fSB3aWxsIGJlIGZpbGxlZCBoZXJlIGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy4KICAqICAgICAgICAgICAgICAgIFRoZSB7QGxpbmsgQU5hdGl2ZVdpbmRvd30gaXMgbWFuYWdlZCBieSB0aGlzIGltYWdlIHJlYWRlci4gRG8gTk9UIGNhbGwKQEAgLTEyMyw2ICsxMzIsOCBAQAogICoge0BsaW5rIEFOYXRpdmVXaW5kb3d9LiBJZiBzbywgdGhlIGFjdHVhbCB3aWR0aCBvZiB0aGUgaW1hZ2VzIGNhbiBiZSBmb3VuZCB1c2luZwogICoge0BsaW5rIEFJbWFnZV9nZXRXaWR0aH0uPC9wPgogICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjQuCisgKgogICogQHBhcmFtIHJlYWRlciBUaGUgaW1hZ2UgcmVhZGVyIG9mIGludGVyZXN0LgogICogQHBhcmFtIHdpZHRoIHRoZSBkZWZhdWx0IHdpZHRoIG9mIHRoZSByZWFkZXIgd2lsbCBiZSBmaWxsZWQgaGVyZSBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZWRzLgogICoKQEAgLTEzOSw2ICsxNTAsOCBAQAogICoge0BsaW5rIEFOYXRpdmVXaW5kb3d9LiBJZiBzbywgdGhlIGFjdHVhbCBoZWlnaHQgb2YgdGhlIGltYWdlcyBjYW4gYmUgZm91bmQgdXNpbmcKICAqIHtAbGluayBBSW1hZ2VfZ2V0SGVpZ2h0fS48L3A+CiAgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNC4KKyAqCiAgKiBAcGFyYW0gcmVhZGVyIFRoZSBpbWFnZSByZWFkZXIgb2YgaW50ZXJlc3QuCiAgKiBAcGFyYW0gaGVpZ2h0IHRoZSBkZWZhdWx0IGhlaWdodCBvZiB0aGUgcmVhZGVyIHdpbGwgYmUgZmlsbGVkIGhlcmUgaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWVkcy4KICAqCkBAIC0xNTEsNiArMTY0LDggQEAKIC8qKgogICogUXVlcnkgdGhlIGZvcm1hdCBvZiB0aGUge0BsaW5rIEFJbWFnZX0gZ2VuZXJhdGVkIGJ5IHRoaXMgcmVhZGVyLgogICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjQuCisgKgogICogQHBhcmFtIHJlYWRlciBUaGUgaW1hZ2UgcmVhZGVyIG9mIGludGVyZXN0LgogICogQHBhcmFtIGZvcm1hdCB0aGUgZnJvbWF0IG9mIHRoZSByZWFkZXIgd2lsbCBiZSBmaWxsZWQgaGVyZSBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZWRzLiBUaGUKICAqICAgICAgICAgICAgICAgIHZhbHVlIHdpbGwgYmUgb25lIG9mIHRoZSBBSU1BR0VfRk9STUFUXyogZW51bSB2YWx1ZSBkZWZpZW5kIGluIHtAbGluayBOZGtJbWFnZS5ofS4KQEAgLTE2NCw2ICsxNzksOCBAQAogLyoqCiAgKiBRdWVyeSB0aGUgbWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudGx5IGFjcXVpcmVkIHtAbGluayBBSW1hZ2V9cyBvZiB0aGlzIHJlYWRlci4KICAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI0LgorICoKICAqIEBwYXJhbSByZWFkZXIgVGhlIGltYWdlIHJlYWRlciBvZiBpbnRlcmVzdC4KICAqIEBwYXJhbSBtYXhJbWFnZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnRseSBhY3F1aXJlZCBpbWFnZXMgb2YgdGhlIHJlYWRlciB3aWxsIGJlIGZpbGxlZAogICogICAgICAgICAgICAgICAgaGVyZSBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZWRzLgpAQCAtMTk0LDYgKzIxMSw4IEBACiAgKiB7QGxpbmsgQUltYWdlX2RlbGV0ZX0uCiAgKiA8L3A+CiAgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNC4KKyAqCiAgKiBAcGFyYW0gcmVhZGVyIFRoZSBpbWFnZSByZWFkZXIgb2YgaW50ZXJlc3QuCiAgKiBAcGFyYW0gaW1hZ2UgdGhlIGFjcXVpcmVkIHtAbGluayBBSW1hZ2V9IHdpbGwgYmUgZmlsbGVkIGhlcmUgaWYgdGhlIG1ldGhvZCBjYWxsIHN1Y2NlZWVkcy4KICAqCkBAIC0yMTEsNyArMjMwLDYgQEAKIG1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlKEFJbWFnZVJlYWRlciogcmVhZGVyLCAvKm91dCovQUltYWdlKiogaW1hZ2UpIF9fSU5UUk9EVUNFRF9JTigyNCk7CiAKIC8qKgotCiAgKiBBY3F1aXJlIHRoZSBsYXRlc3Qge0BsaW5rIEFJbWFnZX0gZnJvbSB0aGUgaW1hZ2UgcmVhZGVyJ3MgcXVldWUsIGRyb3BwaW5nIG9sZGVyIGltYWdlcy4KICAqCiAgKiA8cD4KQEAgLTIzOCw2ICsyNTYsOCBAQAogICoge0BsaW5rIEFJbWFnZV9kZWxldGV9LgogICogPC9wPgogICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjQuCisgKgogICogQHBhcmFtIHJlYWRlciBUaGUgaW1hZ2UgcmVhZGVyIG9mIGludGVyZXN0LgogICogQHBhcmFtIGltYWdlIHRoZSBhY3F1aXJlZCB7QGxpbmsgQUltYWdlfSB3aWxsIGJlIGZpbGxlZCBoZXJlIGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVlZHMuCiAgKgpAQCAtMjg3LDYgKzMwNyw4IEBACiAgKgogICogQ2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHJlcGxhY2UgcHJldmlvdXNseSByZWdpc3RlcmVkIGxpc3RlbmVycy4KICAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI0LgorICoKICAqIEBwYXJhbSByZWFkZXIgVGhlIGltYWdlIHJlYWRlciBvZiBpbnRlcmVzdC4KICAqIEBwYXJhbSBsaXN0ZW5lciBUaGUge0BsaW5rIEFJbWFnZVJlYWRlcl9JbWFnZUxpc3RlbmVyfSB0byBiZSByZWdpc3RlcmVkLiBTZXQgdGhpcyB0byBOVUxMIGlmCiAgKiAgICAgICAgICAgICAgICAgdGhlIGFwcGxpY2F0aW9uIG5vIGxvbmdlciBuZWVkcyB0byBsaXN0ZW4gdG8gbmV3IGltYWdlcy4KQEAgLTM1Myw2ICszNzUsOSBAQAogICogICB7QGxpbmsgQUhBUkRXQVJFQlVGRkVSX1VTQUdFX0dQVV9TQU1QTEVEX0lNQUdFfSwgb3IgY29tYmluZWQ8L3RkPgogICogPC90cj4KICAqIDwvdGFibGU+CisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KKyAqCiAgKiBAcmV0dXJuIDx1bD4KICAqICAgICAgICAgPGxpPntAbGluayBBTUVESUFfT0t9IGlmIHRoZSBtZXRob2QgY2FsbCBzdWNjZWVkcy48L2xpPgogICogICAgICAgICA8bGk+e0BsaW5rIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUn0gaWYgcmVhZGVyIGlzIE5VTEwsIG9yIG9uZSBvciBtb3JlIG9mIHdpZHRoLApAQCAtMzc0LDYgKzM5OSw4IEBACiAgKiBhZGRpdGlvbmFsIHBhcmFtZXRlciBmb3IgdGhlIHN5bmMgZmVuY2UuIEFsbCBvdGhlciBwYXJhbWV0ZXJzIGFuZCB0aGUgcmV0dXJuIHZhbHVlcyBhcmUKICAqIGlkZW50aWNhbCB0byB0aG9zZSBwYXNzZWQgdG8ge0BsaW5rIEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlfS48L3A+CiAgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KKyAqCiAgKiBAcGFyYW0gYWNxdWlyZUZlbmNlRmQgQSBzeW5jIGZlbmNlIGZkIGRlZmluZWQgaW4ge0BsaW5rIHN5bmMuaH0sIHdoaWNoIGlzIHVzZWQgdG8gc2lnbmFsIHdoZW4gdGhlCiAgKiAgICAgICAgIGJ1ZmZlciBpcyByZWFkeSB0byBjb25zdW1lLiBXaGVuIHN5bmNocm9uaXphdGlvbiBmZW5jZSBpcyBub3QgbmVlZGVkLCBmZW5jZSB3aWxsIGJlIHNldAogICogICAgICAgICB0byAtMSBhbmQgdGhlIHtAbGluayBBSW1hZ2V9IHJldHVybmVkIGlzIHJlYWR5IGZvciB1c2UgaW1tZWRpYXRlbHkuIE90aGVyd2lzZSwgdXNlciBzaGFsbApAQCAtMzk0LDYgKzQyMSw4IEBACiAgKiBhZGRpdGlvbmFsIHBhcmFtZXRlciBmb3IgdGhlIHN5bmMgZmVuY2UuIEFsbCBvdGhlciBwYXJhbWV0ZXJzIGFuZCB0aGUgcmV0dXJuIHZhbHVlcyBhcmUKICAqIGlkZW50aWNhbCB0byB0aG9zZSBwYXNzZWQgdG8ge0BsaW5rIEFJbWFnZVJlYWRlcl9hY3F1aXJlTGF0ZXN0SW1hZ2V9LjwvcD4KICAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI2LgorICoKICAqIEBwYXJhbSBhY3F1aXJlRmVuY2VGZCBBIHN5bmMgZmVuY2UgZmQgZGVmaW5lZCBpbiB7QGxpbmsgc3luYy5ofSwgd2hpY2ggaXMgdXNlZCB0byBzaWduYWwgd2hlbiB0aGUKICAqICAgICAgICAgYnVmZmVyIGlzIHJlYWR5IHRvIGNvbnN1bWUuIFdoZW4gc3luY2hyb25pemF0aW9uIGZlbmNlIGlzIG5vdCBuZWVkZWQsIGZlbmNlIHdpbGwgYmUgc2V0CiAgKiAgICAgICAgIHRvIC0xIGFuZCB0aGUge0BsaW5rIEFJbWFnZX0gcmV0dXJuZWQgaXMgcmVhZHkgZm9yIHVzZSBpbW1lZGlhdGVseS4gT3RoZXJ3aXNlLCB1c2VyIHNoYWxsCkBAIC00MDUsNiArNDM0LDcgQEAKICAqLwogbWVkaWFfc3RhdHVzX3QgQUltYWdlUmVhZGVyX2FjcXVpcmVMYXRlc3RJbWFnZUFzeW5jKAogICAgICAgICBBSW1hZ2VSZWFkZXIqIHJlYWRlciwgLypvdXQqL0FJbWFnZSoqIGltYWdlLCAvKm91dCovaW50KiBhY3F1aXJlRmVuY2VGZCkgX19JTlRST0RVQ0VEX0lOKDI2KTsKKwogLyoqCiAgKiBTaWduYXR1cmUgb2YgdGhlIGNhbGxiYWNrIHdoaWNoIGlzIGNhbGxlZCB3aGVuIHtAbGluayBBSW1hZ2VSZWFkZXJ9IGlzIGFib3V0IHRvIHJlbW92ZSBhIGJ1ZmZlci4KICAqCkBAIC00NDgsNiArNDc4LDggQEAKICAqCiAgKiA8cD5Ob3RlIHRoYXQgY2FsbGluZyB0aGlzIG1ldGhvZCB3aWxsIHJlcGxhY2UgcHJldmlvdXNseSByZWdpc3RlcmVkIGxpc3RlbmVycy48L3A+CiAgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KKyAqCiAgKiBAcGFyYW0gcmVhZGVyIFRoZSBpbWFnZSByZWFkZXIgb2YgaW50ZXJlc3QuCiAgKiBAcGFyYW0gbGlzdGVuZXIgdGhlIHtAbGluayBBSW1hZ2VSZWFkZXJfQnVmZmVyUmVtb3ZlZExpc3RlbmVyfSB0byBiZSByZWdpc3RlcmVkLiBTZXQgdGhpcyB0bwogICogTlVMTCBpZiBhcHBsaWNhdGlvbiBubyBsb25nZXIgbmVlZHMgdG8gbGlzdGVuIHRvIGJ1ZmZlciByZW1vdmVkIGV2ZW50cy4KQEAgLTQ2MSw2ICs0OTMsMjMgQEAKIG1lZGlhX3N0YXR1c190IEFJbWFnZVJlYWRlcl9zZXRCdWZmZXJSZW1vdmVkTGlzdGVuZXIoCiAgICAgICAgIEFJbWFnZVJlYWRlciogcmVhZGVyLCBBSW1hZ2VSZWFkZXJfQnVmZmVyUmVtb3ZlZExpc3RlbmVyKiBsaXN0ZW5lcikgX19JTlRST0RVQ0VEX0lOKDI2KTsKIAorI2lmZGVmIF9fQU5EUk9JRF9WTkRLX18KKy8qCisgKiBHZXQgdGhlIG5hdGl2ZV9oYW5kbGVfdCBjb3JyZXNwb25kaW5nIHRvIHRoZSBBTmF0aXZlV2luZG93IG93bmVkIGJ5IHRoZQorICogQUltYWdlUmVhZGVyIHByb3ZpZGVkLgorICoKKyAqIEBwYXJhbSByZWFkZXIgVGhlIGltYWdlIHJlYWRlciBvZiBpbnRlcmVzdC4KKyAqIEBwYXJhbSBoYW5kbGUgVGhlIG91dHB1dCBuYXRpdmVfaGFuZGxlX3QuIFRoaXMgbmF0aXZlIGhhbmRsZSBpcyBvd25lZCBieQorICogICAgICAgICAgICAgICB0aGlzIGltYWdlIHJlYWRlci4KKyAqCisgKiBAcmV0dXJuIEFNRURJQV9PSyBpZiB0aGUgbWV0aG9kIGNhbGwgc3VjY2VlZHMuCisgKiAgICAgICAgIEFNRURJQV9FUlJPUl9JTlZBTElEX1BBUkFNRVRFUiBpZiByZWFkZXIgb3IgaGFuZGxlIGFyZSBOVUxMLgorICogICAgICAgICBBTUVESUFfRVJST1JfVU5LTk9XTiBpZiBzb21lIG90aGVyIGVycm9yIGlzIGVuY291bnRlcmVkLgorICovCittZWRpYV9zdGF0dXNfdCBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93TmF0aXZlSGFuZGxlKAorICAgIEFJbWFnZVJlYWRlciAqcmVhZGVyLCAvKiBvdXQgKi9uYXRpdmVfaGFuZGxlX3QgKipoYW5kbGUpOworI2VuZGlmCisKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjYgKi8KIAogX19FTkRfREVDTFMKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ29kZWMuaAppbmRleCBiM2VlODUzLi44ZmI2YTg3IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNvZGVjLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDb2RlYy5oCkBAIC0xMjcsMjcgKzEyNywzNyBAQAogICogQ3JlYXRlIGNvZGVjIGJ5IG5hbWUuIFVzZSB0aGlzIGlmIHlvdSBrbm93IHRoZSBleGFjdCBjb2RlYyB5b3Ugd2FudCB0byB1c2UuCiAgKiBXaGVuIGNvbmZpZ3VyaW5nLCB5b3Ugd2lsbCBuZWVkIHRvIHNwZWNpZnkgd2hldGhlciB0byB1c2UgdGhlIGNvZGVjIGFzIGFuCiAgKiBlbmNvZGVyIG9yIGRlY29kZXIuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogQU1lZGlhQ29kZWMqIEFNZWRpYUNvZGVjX2NyZWF0ZUNvZGVjQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogQ3JlYXRlIGNvZGVjIGJ5IG1pbWUgdHlwZS4gTW9zdCBhcHBsaWNhdGlvbnMgd2lsbCB1c2UgdGhpcywgc3BlY2lmeWluZyBhCiAgKiBtaW1lIHR5cGUgb2J0YWluZWQgZnJvbSBtZWRpYSBleHRyYWN0b3IuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogQU1lZGlhQ29kZWMqIEFNZWRpYUNvZGVjX2NyZWF0ZURlY29kZXJCeVR5cGUoY29uc3QgY2hhciAqbWltZV90eXBlKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIENyZWF0ZSBlbmNvZGVyIGJ5IG5hbWUuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogQU1lZGlhQ29kZWMqIEFNZWRpYUNvZGVjX2NyZWF0ZUVuY29kZXJCeVR5cGUoY29uc3QgY2hhciAqbWltZV90eXBlKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKLSAqIGRlbGV0ZSB0aGUgY29kZWMgYW5kIGZyZWUgaXRzIHJlc291cmNlcworICogRGVsZXRlIHRoZSBjb2RlYyBhbmQgZnJlZSBpdHMgcmVzb3VyY2VzLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX2RlbGV0ZShBTWVkaWFDb2RlYyopIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogQ29uZmlndXJlIHRoZSBjb2RlYy4gRm9yIGRlY29kaW5nIHlvdSB3b3VsZCB0eXBpY2FsbHkgZ2V0IHRoZSBmb3JtYXQgZnJvbSBhbiBleHRyYWN0b3IuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfY29uZmlndXJlKAogICAgICAgICBBTWVkaWFDb2RlYyosCkBAIC0xNTksMjkgKzE2OSwzOSBAQAogLyoqCiAgKiBTdGFydCB0aGUgY29kZWMuIEEgY29kZWMgbXVzdCBiZSBjb25maWd1cmVkIGJlZm9yZSBpdCBjYW4gYmUgc3RhcnRlZCwgYW5kIG11c3QgYmUgc3RhcnRlZAogICogYmVmb3JlIGJ1ZmZlcnMgY2FuIGJlIHNlbnQgdG8gaXQuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc3RhcnQoQU1lZGlhQ29kZWMqKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFN0b3AgdGhlIGNvZGVjLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3N0b3AoQU1lZGlhQ29kZWMqKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKgogICogRmx1c2ggdGhlIGNvZGVjJ3MgaW5wdXQgYW5kIG91dHB1dC4gQWxsIGluZGljZXMgcHJldmlvdXNseSByZXR1cm5lZCBmcm9tIGNhbGxzIHRvCiAgKiBBTWVkaWFDb2RlY19kZXF1ZXVlSW5wdXRCdWZmZXIgYW5kIEFNZWRpYUNvZGVjX2RlcXVldWVPdXRwdXRCdWZmZXIgYmVjb21lIGludmFsaWQuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfZmx1c2goQU1lZGlhQ29kZWMqKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIEdldCBhbiBpbnB1dCBidWZmZXIuIFRoZSBzcGVjaWZpZWQgYnVmZmVyIGluZGV4IG11c3QgaGF2ZSBiZWVuIHByZXZpb3VzbHkgb2J0YWluZWQgZnJvbQogICogZGVxdWV1ZUlucHV0QnVmZmVyLCBhbmQgbm90IHlldCBxdWV1ZWQuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogdWludDhfdCogQU1lZGlhQ29kZWNfZ2V0SW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBzaXplX3QgaWR4LCBzaXplX3QgKm91dF9zaXplKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIEdldCBhbiBvdXRwdXQgYnVmZmVyLiBUaGUgc3BlY2lmaWVkIGJ1ZmZlciBpbmRleCBtdXN0IGhhdmUgYmVlbiBwcmV2aW91c2x5IG9idGFpbmVkIGZyb20KICAqIGRlcXVldWVPdXRwdXRCdWZmZXIsIGFuZCBub3QgeWV0IHF1ZXVlZC4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiB1aW50OF90KiBBTWVkaWFDb2RlY19nZXRPdXRwdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBzaXplX3QgaWR4LCBzaXplX3QgKm91dF9zaXplKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCkBAIC0xODksNiArMjA5LDggQEAKICAqIEdldCB0aGUgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGlucHV0IGJ1ZmZlci4gQW4gYXBwIHdpbGwgdHlwaWNhbGx5IHVzZSB0aGlzIHdpdGgKICAqIGdldElucHV0QnVmZmVyKCkgdG8gZ2V0IGEgcG9pbnRlciB0byB0aGUgYnVmZmVyLCB0aGVuIGNvcHkgdGhlIGRhdGEgdG8gYmUgZW5jb2RlZCBvciBkZWNvZGVkCiAgKiBpbnRvIHRoZSBidWZmZXIgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhlIGNvZGVjLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIHNzaXplX3QgQU1lZGlhQ29kZWNfZGVxdWV1ZUlucHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwgaW50NjRfdCB0aW1lb3V0VXMpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKQEAgLTIxOCw2ICsyNDAsOCBAQAogCiAvKioKICAqIFNlbmQgdGhlIHNwZWNpZmllZCBidWZmZXIgdG8gdGhlIGNvZGVjIGZvciBwcm9jZXNzaW5nLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3F1ZXVlSW5wdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBzaXplX3QgaWR4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfb2ZmX3RfY29tcGF0IG9mZnNldCwgc2l6ZV90IHNpemUsCkBAIC0yMjUsNiArMjQ5LDggQEAKIAogLyoqCiAgKiBTZW5kIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHRvIHRoZSBjb2RlYyBmb3IgcHJvY2Vzc2luZy4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19xdWV1ZVNlY3VyZUlucHV0QnVmZmVyKEFNZWRpYUNvZGVjKiwgc2l6ZV90IGlkeCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX29mZl90X2NvbXBhdCBvZmZzZXQsCkBAIC0yMzUsMTUgKzI2MSwyNiBAQAogCiAvKioKICAqIEdldCB0aGUgaW5kZXggb2YgdGhlIG5leHQgYXZhaWxhYmxlIGJ1ZmZlciBvZiBwcm9jZXNzZWQgZGF0YS4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiBzc2l6ZV90IEFNZWRpYUNvZGVjX2RlcXVldWVPdXRwdXRCdWZmZXIoQU1lZGlhQ29kZWMqLCBBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmluZm8sCiAgICAgICAgIGludDY0X3QgdGltZW91dFVzKSBfX0lOVFJPRFVDRURfSU4oMjEpOworCisvKioKKyAqIFJldHVybnMgdGhlIGZvcm1hdCBvZiB0aGUgY29kZWMncyBvdXRwdXQuCisgKiBUaGUgY2FsbGVyIG11c3QgZnJlZSB0aGUgcmV0dXJuZWQgZm9ybWF0LgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCisgKi8KIEFNZWRpYUZvcm1hdCogQU1lZGlhQ29kZWNfZ2V0T3V0cHV0Rm9ybWF0KEFNZWRpYUNvZGVjKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBJZiB5b3UgYXJlIGRvbmUgd2l0aCBhIGJ1ZmZlciwgdXNlIHRoaXMgY2FsbCB0byByZXR1cm4gdGhlIGJ1ZmZlciB0bwogICogdGhlIGNvZGVjLiBJZiB5b3UgcHJldmlvdXNseSBzcGVjaWZpZWQgYSBzdXJmYWNlIHdoZW4gY29uZmlndXJpbmcgdGhpcwogICogdmlkZW8gZGVjb2RlciB5b3UgY2FuIG9wdGlvbmFsbHkgcmVuZGVyIHRoZSBidWZmZXIuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfcmVsZWFzZU91dHB1dEJ1ZmZlcihBTWVkaWFDb2RlYyosIHNpemVfdCBpZHgsIGJvb2wgcmVuZGVyKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCkBAIC0yNTYsNiArMjkzLDggQEAKICAqICB0byBJbWFnZVJlYWRlciAoc29mdHdhcmUgcmVhZGFibGUpIG91dHB1dC4KICAqCiAgKiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIEphdmEgZG9jdW1lbnRhdGlvbiBmb3IgTWVkaWFDb2RlYy5zZXRPdXRwdXRTdXJmYWNlLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3NldE91dHB1dFN1cmZhY2UoQU1lZGlhQ29kZWMqLCBBTmF0aXZlV2luZG93KiBzdXJmYWNlKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCkBAIC0yNjYsNiArMzA1LDggQEAKICAqIHRoaXMgY2FsbCB3aWxsIHNpbXBseSByZXR1cm4gdGhlIGJ1ZmZlciB0byB0aGUgY29kZWMuCiAgKgogICogRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBKYXZhIGRvY3VtZW50YXRpb24gZm9yIE1lZGlhQ29kZWMucmVsZWFzZU91dHB1dEJ1ZmZlci4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19yZWxlYXNlT3V0cHV0QnVmZmVyQXRUaW1lKAogICAgICAgICBBTWVkaWFDb2RlYyAqbURhdGEsIHNpemVfdCBpZHgsIGludDY0X3QgdGltZXN0YW1wTnMpIF9fSU5UUk9EVUNFRF9JTigyMSk7CkBAIC0yODIsNiArMzIzLDggQEAKICAqIEFOYXRpdmVXaW5kb3dfcmVsZWFzZSgpIHdoZW4gZG9uZS4KICAqCiAgKiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIEphdmEgZG9jdW1lbnRhdGlvbiBmb3IgTWVkaWFDb2RlYy5jcmVhdGVJbnB1dFN1cmZhY2UuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfY3JlYXRlSW5wdXRTdXJmYWNlKAogICAgICAgICBBTWVkaWFDb2RlYyAqbURhdGEsIEFOYXRpdmVXaW5kb3cgKipzdXJmYWNlKSBfX0lOVFJPRFVDRURfSU4oMjYpOwpAQCAtMjk4LDYgKzM0MSw4IEBACiAgKiBBTmF0aXZlV2luZG93X3JlbGVhc2UoKSB3aGVuIGRvbmUuCiAgKgogICogRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBKYXZhIGRvY3VtZW50YXRpb24gZm9yIE1lZGlhQ29kZWMuY3JlYXRlUGVyc2lzdGVudElucHV0U3VyZmFjZS4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI2LgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19jcmVhdGVQZXJzaXN0ZW50SW5wdXRTdXJmYWNlKAogICAgICAgICBBTmF0aXZlV2luZG93ICoqc3VyZmFjZSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKQEAgLTMxMSw2ICszNTYsOCBAQAogICogQU1lZGlhQ29kZWNfY29uZmlndXJlKC4uKTsgYW5kIGJlZm9yZSBBTWVkaWFDb2RlY19zdGFydCgpIGhhcyBiZWVuIGNhbGxlZC4KICAqCiAgKiBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIEphdmEgZG9jdW1lbnRhdGlvbiBmb3IgTWVkaWFDb2RlYy5zZXRJbnB1dFN1cmZhY2UuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc2V0SW5wdXRTdXJmYWNlKAogICAgICAgICBBTWVkaWFDb2RlYyAqbURhdGEsIEFOYXRpdmVXaW5kb3cgKnN1cmZhY2UpIF9fSU5UUk9EVUNFRF9JTigyNik7CkBAIC0zMjIsNiArMzY5LDggQEAKICAqIGFmdGVyIEFNZWRpYUNvZGVjX3N0YXJ0KCkgaGFzIGJlZW4gY2FsbGVkLgogICoKICAqIE5PVEU6IFNvbWUgb2YgdGhlc2UgcGFyYW1ldGVyIGNoYW5nZXMgbWF5IHNpbGVudGx5IGZhaWwgdG8gYXBwbHkuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyNi4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNfc2V0UGFyYW1ldGVycygKICAgICAgICAgQU1lZGlhQ29kZWMgKm1EYXRhLCBjb25zdCBBTWVkaWFGb3JtYXQqIHBhcmFtcykgX19JTlRST0RVQ0VEX0lOKDI2KTsKQEAgLTMzOSw2ICszODgsOCBAQAogICogUmV0dXJucyBBTUVESUFfT0sgd2hlbiBjb21wbGV0ZWQgc3VjY2VzZnVsbHkuCiAgKgogICogRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBKYXZhIGRvY3VtZW50YXRpb24gZm9yIE1lZGlhQ29kZWMuc2lnbmFsRW5kT2ZJbnB1dFN0cmVhbS4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI2LgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY19zaWduYWxFbmRPZklucHV0U3RyZWFtKEFNZWRpYUNvZGVjICptRGF0YSkgX19JTlRST0RVQ0VEX0lOKDI2KTsKIApAQCAtMzQ5LDYgKzQwMCw5IEBACiAvKioKICAqIEdldCBmb3JtYXQgb2YgdGhlIGJ1ZmZlci4gVGhlIHNwZWNpZmllZCBidWZmZXIgaW5kZXggbXVzdCBoYXZlIGJlZW4gcHJldmlvdXNseSBvYnRhaW5lZCBmcm9tCiAgKiBkZXF1ZXVlT3V0cHV0QnVmZmVyLgorICogVGhlIGNhbGxlciBtdXN0IGZyZWUgdGhlIHJldHVybmVkIGZvcm1hdC4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI4LgogICovCiBBTWVkaWFGb3JtYXQqIEFNZWRpYUNvZGVjX2dldEJ1ZmZlckZvcm1hdChBTWVkaWFDb2RlYyosIHNpemVfdCBpbmRleCkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIApAQCAtMzU2LDExICs0MTAsMTUgQEAKICAqIEdldCB0aGUgY29tcG9uZW50IG5hbWUuIElmIHRoZSBjb2RlYyB3YXMgY3JlYXRlZCBieSBjcmVhdGVEZWNvZGVyQnlUeXBlCiAgKiBvciBjcmVhdGVFbmNvZGVyQnlUeXBlLCB3aGF0IGNvbXBvbmVudCBpcyBjaG9zZW4gaXMgbm90IGtub3duIGJlZm9yZWhhbmQuCiAgKiBDYWxsZXIgc2hhbGwgY2FsbCBBTWVkaWFDb2RlY19yZWxlYXNlTmFtZSB0byBmcmVlIHRoZSByZXR1cm5lZCBwb2ludGVyLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjguCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX2dldE5hbWUoQU1lZGlhQ29kZWMqLCBjaGFyKiogb3V0X25hbWUpIF9fSU5UUk9EVUNFRF9JTigyOCk7CiAKIC8qKgogICogRnJlZSB0aGUgbWVtb3J5IHBvaW50ZWQgYnkgbmFtZSB3aGljaCBpcyByZXR1cm5lZCBieSBBTWVkaWFDb2RlY19nZXROYW1lLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjguCiAgKi8KIHZvaWQgQU1lZGlhQ29kZWNfcmVsZWFzZU5hbWUoQU1lZGlhQ29kZWMqLCBjaGFyKiBuYW1lKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCkBAIC0zODIsNiArNDQwLDggQEAKICAqIEFsbCBjYWxsYmFja3MgYXJlIGZpcmVkIG9uIG9uZSBOREsgaW50ZXJuYWwgdGhyZWFkLgogICogQU1lZGlhQ29kZWNfc2V0QXN5bmNOb3RpZnlDYWxsYmFjayBzaG91bGQgbm90IGJlIGNhbGxlZCBvbiB0aGUgY2FsbGJhY2sgdGhyZWFkLgogICogTm8gaGVhdnkgZHV0eSB0YXNrIHNob3VsZCBiZSBwZXJmb3JtZWQgb24gY2FsbGJhY2sgdGhyZWFkLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjguCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3NldEFzeW5jTm90aWZ5Q2FsbGJhY2soCiAgICAgICAgIEFNZWRpYUNvZGVjKiwKQEAgLTM5MCw2ICs0NTAsOCBAQAogCiAvKioKICAqIFJlbGVhc2UgdGhlIGNyeXB0byBpZiBhcHBsaWNhYmxlLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjguCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjX3JlbGVhc2VDcnlwdG8oQU1lZGlhQ29kZWMqKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCkBAIC0zOTcsMTIgKzQ1OSwxNyBAQAogICogQ2FsbCB0aGlzIGFmdGVyIEFNZWRpYUNvZGVjX2NvbmZpZ3VyZSgpIHJldHVybnMgc3VjY2Vzc2Z1bGx5IHRvIGdldCB0aGUgaW5wdXQKICAqIGZvcm1hdCBhY2NlcHRlZCBieSB0aGUgY29kZWMuIERvIHRoaXMgdG8gZGV0ZXJtaW5lIHdoYXQgb3B0aW9uYWwgY29uZmlndXJhdGlvbgogICogcGFyYW1ldGVycyB3ZXJlIHN1cHBvcnRlZCBieSB0aGUgY29kZWMuCisgKiBUaGUgY2FsbGVyIG11c3QgZnJlZSB0aGUgcmV0dXJuZWQgZm9ybWF0LgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjguCiAgKi8KIEFNZWRpYUZvcm1hdCogQU1lZGlhQ29kZWNfZ2V0SW5wdXRGb3JtYXQoQU1lZGlhQ29kZWMqKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCiAvKioKICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29kZWMgY2Fubm90IHByb2NlZWQgZnVydGhlciwgYnV0IGNhbiBiZSByZWNvdmVyZWQgYnkgc3RvcHBpbmcsCiAgKiBjb25maWd1cmluZywgYW5kIHN0YXJ0aW5nIGFnYWluLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjguCiAgKi8KIGJvb2wgQU1lZGlhQ29kZWNBY3Rpb25Db2RlX2lzUmVjb3ZlcmFibGUoaW50MzJfdCBhY3Rpb25Db2RlKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCkBAIC00MTAsNiArNDc3LDggQEAKICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29kZWMgZXJyb3IgaXMgYSB0cmFuc2llbnQgaXNzdWUsIHBlcmhhcHMgZHVlIHRvCiAgKiByZXNvdXJjZSBjb25zdHJhaW50cywgYW5kIHRoYXQgdGhlIG1ldGhvZCAob3IgZW5jb2RpbmcvZGVjb2RpbmcpIG1heSBiZQogICogcmV0cmllZCBhdCBhIGxhdGVyIHRpbWUuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyOC4KICAqLwogYm9vbCBBTWVkaWFDb2RlY0FjdGlvbkNvZGVfaXNUcmFuc2llbnQoaW50MzJfdCBhY3Rpb25Db2RlKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCkBAIC00NDAsNiArNTA5LDggQEAKICAqIG51bUJ5dGVzT2ZDbGVhckRhdGEgY2FuIGJlIG51bGwgdG8gaW5kaWNhdGUgdGhhdCBhbGwgZGF0YSBpcyBlbmNyeXB0ZWQuCiAgKiBUaGlzIGluZm9ybWF0aW9uIGVuY2Fwc3VsYXRlcyBwZXItc2FtcGxlIG1ldGFkYXRhIGFzIG91dGxpbmVkIGluCiAgKiBJU08vSUVDIEZESVMgMjMwMDEtNzoyMDExICJDb21tb24gZW5jcnlwdGlvbiBpbiBJU08gYmFzZSBtZWRpYSBmaWxlIGZvcm1hdCBmaWxlcyIuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogQU1lZGlhQ29kZWNDcnlwdG9JbmZvICpBTWVkaWFDb2RlY0NyeXB0b0luZm9fbmV3KAogICAgICAgICBpbnQgbnVtc3Vic2FtcGxlcywKQEAgLTQ1MCwxMyArNTIxLDE3IEBACiAgICAgICAgIHNpemVfdCAqZW5jcnlwdGVkYnl0ZXMpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgotICogZGVsZXRlIGFuIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyBjcmVhdGVkIHByZXZpb3VzbHkgd2l0aCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fbmV3LCBvcgotICogb2J0YWluZWQgZnJvbSBBTWVkaWFFeHRyYWN0b3IKKyAqIERlbGV0ZSBhbiBBTWVkaWFDb2RlY0NyeXB0b0luZm8gY3JlYXRlZCBwcmV2aW91c2x5IHdpdGggQU1lZGlhQ29kZWNDcnlwdG9JbmZvX25ldywgb3IKKyAqIG9idGFpbmVkIGZyb20gQU1lZGlhRXh0cmFjdG9yLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19kZWxldGUoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCi0gKiBTZXQgdGhlIGNyeXB0byBwYXR0ZXJuIG9uIGFuIEFNZWRpYUNyeXB0b0luZm8gb2JqZWN0CisgKiBTZXQgdGhlIGNyeXB0byBwYXR0ZXJuIG9uIGFuIEFNZWRpYUNyeXB0b0luZm8gb2JqZWN0LgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIHZvaWQgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX3NldFBhdHRlcm4oCiAgICAgICAgIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqaW5mbywKQEAgLTQ2NCwzMiArNTM5LDQ0IEBACiAKIC8qKgogICogVGhlIG51bWJlciBvZiBzdWJzYW1wbGVzIHRoYXQgbWFrZSB1cCB0aGUgYnVmZmVyJ3MgY29udGVudHMuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogc2l6ZV90IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXROdW1TdWJTYW1wbGVzKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyopIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgotICogQSAxNi1ieXRlIG9wYXF1ZSBrZXkKKyAqIEEgMTYtYnl0ZSBvcGFxdWUga2V5LgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYUNvZGVjQ3J5cHRvSW5mb19nZXRLZXkoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiwgdWludDhfdCAqZHN0KSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKLSAqIEEgMTYtYnl0ZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IKKyAqIEEgMTYtYnl0ZSBpbml0aWFsaXphdGlvbiB2ZWN0b3IuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2dldElWKEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyosIHVpbnQ4X3QgKmRzdCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBUaGUgdHlwZSBvZiBlbmNyeXB0aW9uIHRoYXQgaGFzIGJlZW4gYXBwbGllZCwKICAqIG9uZSBvZiBBTUVESUFDT0RFQ1JZUFRPSU5GT19NT0RFX0NMRUFSIG9yIEFNRURJQUNPREVDUllQVE9JTkZPX01PREVfQUVTX0NUUi4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiBjcnlwdG9pbmZvX21vZGVfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0TW9kZShBTWVkaWFDb2RlY0NyeXB0b0luZm8qKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFRoZSBudW1iZXIgb2YgbGVhZGluZyB1bmVuY3J5cHRlZCBieXRlcyBpbiBlYWNoIHN1YnNhbXBsZS4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0Q2xlYXJCeXRlcyhBTWVkaWFDb2RlY0NyeXB0b0luZm8qLCBzaXplX3QgKmRzdCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBUaGUgbnVtYmVyIG9mIHRyYWlsaW5nIGVuY3J5cHRlZCBieXRlcyBpbiBlYWNoIHN1YnNhbXBsZS4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFDb2RlY0NyeXB0b0luZm9fZ2V0RW5jcnlwdGVkQnl0ZXMoQU1lZGlhQ29kZWNDcnlwdG9JbmZvKiwgc2l6ZV90ICpkc3QpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ3J5cHRvLmggYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUNyeXB0by5oCmluZGV4IGJjZGY5YTAuLjNmYTA3YzcgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhQ3J5cHRvLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFDcnlwdG8uaApAQCAtNDksMTIgKzQ5LDI0IEBACiAKICNpZiBfX0FORFJPSURfQVBJX18gPj0gMjEKIAorLyoqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgorICovCiBib29sIEFNZWRpYUNyeXB0b19pc0NyeXB0b1NjaGVtZVN1cHBvcnRlZChjb25zdCBBTWVkaWFVVUlEIHV1aWQpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKKy8qKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KKyAqLwogYm9vbCBBTWVkaWFDcnlwdG9fcmVxdWlyZXNTZWN1cmVEZWNvZGVyQ29tcG9uZW50KGNvbnN0IGNoYXIgKm1pbWUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKKy8qKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KKyAqLwogQU1lZGlhQ3J5cHRvKiBBTWVkaWFDcnlwdG9fbmV3KGNvbnN0IEFNZWRpYVVVSUQgdXVpZCwgY29uc3Qgdm9pZCAqaW5pdERhdGEsIHNpemVfdCBpbml0RGF0YVNpemUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKKy8qKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KKyAqLwogdm9pZCBBTWVkaWFDcnlwdG9fZGVsZXRlKEFNZWRpYUNyeXB0byogY3J5cHRvKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDIxICovCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURhdGFTb3VyY2UuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCmluZGV4IGVhNWJhMGMuLjA1NzdkZjIgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRGF0YVNvdXJjZS5oCkBAIC00MywxNCArNDMsOSBAQAogLyoKICAqIEFNZWRpYURhdGFTb3VyY2UncyBjYWxsYmFja3Mgd2lsbCBiZSBpbnZva2VkIG9uIGFuIGltcGxlbWVudGF0aW9uLWRlZmluZWQgdGhyZWFkCiAgKiBvciB0aHJlYWQgcG9vbC4gTm8gZ3VhcmFudGVlcyBhcmUgcHJvdmlkZWQgYWJvdXQgd2hpY2ggdGhyZWFkKHMpIHdpbGwgYmUgdXNlZCBmb3IKLSAqIGNhbGxiYWNrcy4gSG93ZXZlciwgaXQgaXMgZ3VhcmFudGVlZCB0aGF0IEFNZWRpYURhdGFTb3VyY2UncyBjYWxsYmFja3Mgd2lsbCBvbmx5Ci0gKiBldmVyIGJlIGludm9rZWQgYnkgYSBzaW5nbGUgdGhyZWFkIGF0IGEgdGltZS4KLSAqCi0gKiBUaGVyZSB3aWxsIGJlIGEgdGhyZWFkIHN5bmNocm9uaXphdGlvbiBwb2ludCBiZXR3ZWVuIGVhY2ggY2FsbCB0byBlbnN1cmUgdGhhdAotICogbW9kaWZpY2F0aW9ucyB0byB0aGUgc3RhdGUgb2YgeW91ciBBTWVkaWFEYXRhU291cmNlIGFyZSB2aXNpYmxlIHRvIGZ1dHVyZQotICogY2FsbHMuIFRoaXMgbWVhbnMgeW91IGRvbid0IG5lZWQgdG8gZG8geW91ciBvd24gc3luY2hyb25pemF0aW9uIHVubGVzcyB5b3UncmUKLSAqIG1vZGlmeWluZyB0aGUgQU1lZGlhRGF0YVNvdXJjZSBmcm9tIGFub3RoZXIgdGhyZWFkIHdoaWxlIGl0J3MgYmVpbmcgdXNlZCBieSB0aGUKLSAqIGZyYW1ld29yay4KKyAqIGNhbGxiYWNrcy4gRm9yIGV4YW1wbGUsIHxjbG9zZXwgY2FuIGJlIGludm9rZWQgZnJvbSBhIGRpZmZlcmVudCB0aHJlYWQgdGhhbiB0aGUKKyAqIHRocmVhZCBpbnZva2luZyB8cmVhZEF0fC4gQXMgc3VjaCwgdGhlIEltcGxlbWVudGF0aW9ucyBvZiBBTWVkaWFEYXRhU291cmNlIGNhbGxiYWNrcworICogbXVzdCBiZSB0aHJlYWRzYWZlLgogICovCiAKIC8qKgpAQCAtNzQsMjYgKzY5LDc1IEBACiB0eXBlZGVmIHNzaXplX3QgKCpBTWVkaWFEYXRhU291cmNlR2V0U2l6ZSkodm9pZCAqdXNlcmRhdGEpOwogCiAvKioKLSAqIENhbGxlZCB0byBjbG9zZSB0aGUgZGF0YSBzb3VyY2UgYW5kIHJlbGVhc2UgYXNzb2NpYXRlZCByZXNvdXJjZXMuCi0gKiBUaGUgTkRLIG1lZGlhIGZyYW1ld29yayBndWFyYW50ZWVzIHRoYXQgYWZ0ZXIgfGNsb3NlfCBpcyBjYWxsZWQKLSAqIG5vIGZ1dHVyZSBjYWxsYmFja3Mgd2lsbCBiZSBpbnZva2VkIG9uIHRoZSBkYXRhIHNvdXJjZS4KKyAqIENhbGxlZCB0byBjbG9zZSB0aGUgZGF0YSBzb3VyY2UsIHVuYmxvY2sgcmVhZHMsIGFuZCByZWxlYXNlIGFzc29jaWF0ZWQKKyAqIHJlc291cmNlcy4KKyAqCisgKiBUaGUgTkRLIG1lZGlhIGZyYW1ld29yayBndWFyYW50ZWVzIHRoYXQgYWZ0ZXIgdGhlIGZpcnN0IHxjbG9zZXwgaXMKKyAqIGNhbGxlZCwgbm8gZnV0dXJlIGNhbGxiYWNrcyB3aWxsIGJlIGludm9rZWQgb24gdGhlIGRhdGEgc291cmNlIGV4Y2VwdAorICogZm9yIHxjbG9zZXwgaXRzZWxmLgorICoKKyAqIENsb3NpbmcgYSBkYXRhIHNvdXJjZSBhbGxvd3MgcmVhZEF0IGNhbGxzIHRoYXQgd2VyZSBibG9ja2VkIHdhaXRpbmcKKyAqIGZvciBJL08gZGF0YSB0byByZXR1cm4gcHJvbXB0bHkuCisgKgorICogV2hlbiB1c2luZyBBTWVkaWFEYXRhU291cmNlIGFzIGlucHV0IHRvIEFNZWRpYUV4dHJhY3RvciwgY2xvc2luZworICogaGFzIHRoZSBlZmZlY3Qgb2YgdW5ibG9ja2luZyBzbG93IHJlYWRzIGluc2lkZSBvZiBzZXREYXRhU291cmNlCisgKiBhbmQgcmVhZFNhbXBsZURhdGEuCiAgKi8KIHR5cGVkZWYgdm9pZCAoKkFNZWRpYURhdGFTb3VyY2VDbG9zZSkodm9pZCAqdXNlcmRhdGEpOwogCiAvKioKICAqIENyZWF0ZSBuZXcgbWVkaWEgZGF0YSBzb3VyY2UuIFJldHVybnMgTlVMTCBpZiBtZW1vcnkgYWxsb2NhdGlvbgogICogZm9yIHRoZSBuZXcgZGF0YSBzb3VyY2Ugb2JqZWN0IGZhaWxzLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjguCiAgKi8KIEFNZWRpYURhdGFTb3VyY2UqIEFNZWRpYURhdGFTb3VyY2VfbmV3KCkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQorCisvKioKKyAqIENhbGxlZCB0byBnZXQgYW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IGNhbiBiZSByZWFkIGZyb20gdGhpcyBkYXRhIHNvdXJjZQorICogc3RhcnRpbmcgYXQgfG9mZnNldHwgd2l0aG91dCBibG9ja2luZyBmb3IgSS9PLgorICoKKyAqIFJldHVybiAtMSB3aGVuIHN1Y2ggYW4gZXN0aW1hdGUgaXMgbm90IHBvc3NpYmxlLgorICovCit0eXBlZGVmIHNzaXplX3QgKCpBTWVkaWFEYXRhU291cmNlR2V0QXZhaWxhYmxlU2l6ZSkodm9pZCAqdXNlcmRhdGEsIG9mZjY0X3Qgb2Zmc2V0KTsKKworLyoqCisgKiBDcmVhdGUgbmV3IG1lZGlhIGRhdGEgc291cmNlLiBSZXR1cm5zIE5VTEwgaWYgbWVtb3J5IGFsbG9jYXRpb24KKyAqIGZvciB0aGUgbmV3IGRhdGEgc291cmNlIG9iamVjdCBmYWlscy4KKyAqCisgKiBTZXQgdGhlIHx1cml8IGZyb20gd2hpY2ggdGhlIGRhdGEgc291cmNlIHdpbGwgcmVhZCwKKyAqIHBsdXMgYWRkaXRpb25hbCBodHRwIGhlYWRlcnMgd2hlbiBpbml0aWF0aW5nIHRoZSByZXF1ZXN0LgorICoKKyAqIEhlYWRlcnMgd2lsbCBjb250YWluIGNvcnJlc3BvbmRpbmcgaXRlbXMgZnJvbSB8a2V5X3ZhbHVlc3wKKyAqIGluIHRoZSBmb2xsb3dpbmcgZmFzaGlvbjoKKyAqCisgKiBrZXlfdmFsdWVzWzBdOmtleV92YWx1ZXNbMV0KKyAqIGtleV92YWx1ZXNbMl06a2V5X3ZhbHVlc1szXQorICogLi4uCisgKiBrZXlfdmFsdWVzWyhudW1oZWFkZXJzIC0gMSkgKiAyXTprZXlfdmFsdWVzWyhudW1oZWFkZXJzIC0gMSkgKiAyICsgMV0KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI5LgorICovCitBTWVkaWFEYXRhU291cmNlKiBBTWVkaWFEYXRhU291cmNlX25ld1VyaShjb25zdCBjaGFyICp1cmksCisgICAgICAgIGludCBudW1oZWFkZXJzLAorICAgICAgICBjb25zdCBjaGFyICogY29uc3QgKmtleV92YWx1ZXMpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNlbmRpZiAgLypfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KKwogLyoqCiAgKiBEZWxldGUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgbWVkaWEgZGF0YSBzb3VyY2UuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyOC4KICAqLwogdm9pZCBBTWVkaWFEYXRhU291cmNlX2RlbGV0ZShBTWVkaWFEYXRhU291cmNlKikgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAogLyoqCiAgKiBTZXQgYW4gdXNlciBwcm92aWRlZCBvcGFxdWUgaGFuZGxlLiBUaGlzIG9wYXF1ZSBoYW5kbGUgaXMgcGFzc2VkIGFzCiAgKiB0aGUgZmlyc3QgYXJndW1lbnQgdG8gdGhlIGRhdGEgc291cmNlIGNhbGxiYWNrcy4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI4LgogICovCiB2b2lkIEFNZWRpYURhdGFTb3VyY2Vfc2V0VXNlcmRhdGEoCiAgICAgICAgIEFNZWRpYURhdGFTb3VyY2UqLCB2b2lkICp1c2VyZGF0YSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKQEAgLTEwOCw2ICsxNTIsOCBAQAogICoKICAqIFBsZWFzZSByZWZlciB0byB0aGUgZGVmaW5pdGlvbiBvZiBBTWVkaWFEYXRhU291cmNlUmVhZEF0IGZvcgogICogYWRkaXRpb25hbCBkZXRhaWxzLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjguCiAgKi8KIHZvaWQgQU1lZGlhRGF0YVNvdXJjZV9zZXRSZWFkQXQoCiAgICAgICAgIEFNZWRpYURhdGFTb3VyY2UqLApAQCAtMTE5LDYgKzE2NSw4IEBACiAgKgogICogUGxlYXNlIHJlZmVyIHRvIHRoZSBkZWZpbml0aW9uIG9mIEFNZWRpYURhdGFTb3VyY2VHZXRTaXplIGZvcgogICogYWRkaXRpb25hbCBkZXRhaWxzLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjguCiAgKi8KIHZvaWQgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRTaXplKAogICAgICAgICBBTWVkaWFEYXRhU291cmNlKiwKQEAgLTEzMCw2ICsxNzgsOCBAQAogICoKICAqIFBsZWFzZSByZWZlciB0byB0aGUgZGVmaW5pdGlvbiBvZiBBTWVkaWFEYXRhU291cmNlQ2xvc2UgZm9yCiAgKiBhZGRpdGlvbmFsIGRldGFpbHMuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyOC4KICAqLwogdm9pZCBBTWVkaWFEYXRhU291cmNlX3NldENsb3NlKAogICAgICAgICBBTWVkaWFEYXRhU291cmNlKiwKQEAgLTEzNyw2ICsxODcsMzQgQEAKIAogI2VuZGlmICAvKl9fQU5EUk9JRF9BUElfXyA+PSAyOCAqLwogCisjaWYgX19BTkRST0lEX0FQSV9fID49IDI5CisKKy8qKgorICogQ2xvc2UgdGhlIGRhdGEgc291cmNlLCB1bmJsb2NrIHJlYWRzLCBhbmQgcmVsZWFzZSBhc3NvY2lhdGVkIHJlc291cmNlcy4KKyAqCisgKiBQbGVhc2UgcmVmZXIgdG8gdGhlIGRlZmluaXRpb24gb2YgQU1lZGlhRGF0YVNvdXJjZUNsb3NlIGZvcgorICogYWRkaXRpb25hbCBkZXRhaWxzLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjkuCisgKi8KK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9jbG9zZShBTWVkaWFEYXRhU291cmNlKikgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBTZXQgYSBjdXN0b20gY2FsbGJhY2sgZm9yIHN1cHBseWluZyB0aGUgZXN0aW1hdGVkIG51bWJlciBvZiBieXRlcworICogdGhhdCBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgZGF0YSBzb3VyY2Ugc3RhcnRpbmcgYXQgYW4gb2Zmc2V0IHdpdGhvdXQKKyAqIGJsb2NraW5nIGZvciBJL08uCisgKgorICogUGxlYXNlIHJlZmVyIHRvIHRoZSBkZWZpbml0aW9uIG9mIEFNZWRpYURhdGFTb3VyY2VHZXRBdmFpbGFibGVTaXplCisgKiBmb3IgYWRkaXRpb25hbCBkZXRhaWxzLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjkuCisgKi8KK3ZvaWQgQU1lZGlhRGF0YVNvdXJjZV9zZXRHZXRBdmFpbGFibGVTaXplKAorICAgICAgICBBTWVkaWFEYXRhU291cmNlKiwKKyAgICAgICAgQU1lZGlhRGF0YVNvdXJjZUdldEF2YWlsYWJsZVNpemUpIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKKyNlbmRpZiAgLypfX0FORFJPSURfQVBJX18gPj0gMjkgKi8KKwogX19FTkRfREVDTFMKIAogI2VuZGlmIC8vIF9OREtfTUVESUFfREFUQVNPVVJDRV9ICmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURybS5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFEcm0uaAppbmRleCAyZTQzOGQ5Li4zMWY1YzdkIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYURybS5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRHJtLmgKQEAgLTE3NCw0MSArMTc0LDUzIEBACiAgKiB1dWlkIGlkZW50aWZpZXMgdGhlIHVuaXZlcnNhbCB1bmlxdWUgSUQgb2YgdGhlIGNyeXB0byBzY2hlbWUuIHV1aWQgbXVzdCBiZSAxNiBieXRlcy4KICAqIG1pbWVUeXBlIGlzIHRoZSBNSU1FIHR5cGUgb2YgdGhlIG1lZGlhIGNvbnRhaW5lciwgZS5nLiAidmlkZW8vbXA0Ii4gIElmIG1pbWVUeXBlCiAgKiBpcyBub3Qga25vd24gb3IgcmVxdWlyZWQsIGl0IGNhbiBiZSBwcm92aWRlZCBhcyBOVUxMLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIGJvb2wgQU1lZGlhRHJtX2lzQ3J5cHRvU2NoZW1lU3VwcG9ydGVkKGNvbnN0IHVpbnQ4X3QgKnV1aWQsCiAgICAgICAgIGNvbnN0IGNoYXIgKm1pbWVUeXBlKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKLSAqIENyZWF0ZSBhIE1lZGlhRHJtIGluc3RhbmNlIGZyb20gYSBVVUlECisgKiBDcmVhdGUgYSBNZWRpYURybSBpbnN0YW5jZSBmcm9tIGEgVVVJRC4KICAqIHV1aWQgaWRlbnRpZmllcyB0aGUgdW5pdmVyc2FsIHVuaXF1ZSBJRCBvZiB0aGUgY3J5cHRvIHNjaGVtZS4gdXVpZCBtdXN0IGJlIDE2IGJ5dGVzLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIEFNZWRpYURybSogQU1lZGlhRHJtX2NyZWF0ZUJ5VVVJRChjb25zdCB1aW50OF90ICp1dWlkKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKLSAqIFJlbGVhc2UgYSBNZWRpYURybSBvYmplY3QKKyAqIFJlbGVhc2UgYSBNZWRpYURybSBvYmplY3QuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogdm9pZCBBTWVkaWFEcm1fcmVsZWFzZShBTWVkaWFEcm0gKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCi0gKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiBhbiBldmVudCBvY2N1cnMKKyAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGFuIGV2ZW50IG9jY3Vycy4KICAqCi0gKiBsaXN0ZW5lciBpcyB0aGUgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGludm9rZWQgb24gZXZlbnQKKyAqIGxpc3RlbmVyIGlzIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiBldmVudC4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0T25FdmVudExpc3RlbmVyKEFNZWRpYURybSAqLAogICAgICAgICBBTWVkaWFEcm1FdmVudExpc3RlbmVyIGxpc3RlbmVyKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKLSAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGFuIGV4cGlyYXRpb24gdXBkYXRlIGV2ZW50IG9jY3VycworICogUmVnaXN0ZXIgYSBjYWxsYmFjayB0byBiZSBpbnZva2VkIHdoZW4gYW4gZXhwaXJhdGlvbiB1cGRhdGUgZXZlbnQgb2NjdXJzLgogICoKLSAqIGxpc3RlbmVyIGlzIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiBldmVudAorICogbGlzdGVuZXIgaXMgdGhlIGNhbGxiYWNrIHRoYXQgd2lsbCBiZSBpbnZva2VkIG9uIGV2ZW50LgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjkuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9zZXRPbkV4cGlyYXRpb25VcGRhdGVMaXN0ZW5lcihBTWVkaWFEcm0gKiwKICAgICAgICAgQU1lZGlhRHJtRXhwaXJhdGlvblVwZGF0ZUxpc3RlbmVyIGxpc3RlbmVyKSBfX0lOVFJPRFVDRURfSU4oMjkpOwogCiAvKioKLSAqIFJlZ2lzdGVyIGEgY2FsbGJhY2sgdG8gYmUgaW52b2tlZCB3aGVuIGEga2V5IHN0YXR1cyBjaGFuZ2UgZXZlbnQgb2NjdXJzCisgKiBSZWdpc3RlciBhIGNhbGxiYWNrIHRvIGJlIGludm9rZWQgd2hlbiBhIGtleSBzdGF0dXMgY2hhbmdlIGV2ZW50IG9jY3Vycy4KICAqCi0gKiBsaXN0ZW5lciBpcyB0aGUgY2FsbGJhY2sgdGhhdCB3aWxsIGJlIGludm9rZWQgb24gZXZlbnQKKyAqIGxpc3RlbmVyIGlzIHRoZSBjYWxsYmFjayB0aGF0IHdpbGwgYmUgaW52b2tlZCBvbiBldmVudC4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI5LgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2V0T25LZXlzQ2hhbmdlTGlzdGVuZXIoQU1lZGlhRHJtICosCiAgICAgICAgIEFNZWRpYURybUtleXNDaGFuZ2VMaXN0ZW5lciBsaXN0ZW5lcikgX19JTlRST0RVQ0VEX0lOKDI5KTsKQEAgLTIxNiw4ICsyMjgsMTAgQEAKIC8qKgogICogT3BlbiBhIG5ldyBzZXNzaW9uIHdpdGggdGhlIE1lZGlhRHJtIG9iamVjdC4gIEEgc2Vzc2lvbiBJRCBpcyByZXR1cm5lZC4KICAqCi0gKiByZXR1cm5zIE1FRElBRFJNX05PVF9QUk9WSVNJT05FRF9FUlJPUiBpZiBwcm92aXNpb25pbmcgaXMgbmVlZGVkCi0gKiByZXR1cm5zIE1FRElBRFJNX1JFU09VUkNFX0JVU1lfRVJST1IgaWYgcmVxdWlyZWQgcmVzb3VyY2VzIGFyZSBpbiB1c2UKKyAqIFJldHVybnMgTUVESUFEUk1fTk9UX1BST1ZJU0lPTkVEX0VSUk9SIGlmIHByb3Zpc2lvbmluZyBpcyBuZWVkZWQuCisgKiBSZXR1cm5zIE1FRElBRFJNX1JFU09VUkNFX0JVU1lfRVJST1IgaWYgcmVxdWlyZWQgcmVzb3VyY2VzIGFyZSBpbiB1c2UuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX29wZW5TZXNzaW9uKEFNZWRpYURybSAqLAogICAgICAgICBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKQEAgLTIyNSw2ICsyMzksOCBAQAogLyoqCiAgKiBDbG9zZSBhIHNlc3Npb24gb24gdGhlIE1lZGlhRHJtIG9iamVjdCB0aGF0IHdhcyBwcmV2aW91c2x5IG9wZW5lZAogICogd2l0aCBBTWVkaWFEcm1fb3BlblNlc3Npb24uCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2Nsb3NlU2Vzc2lvbihBTWVkaWFEcm0gKiwKICAgICAgICAgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQpIF9fSU5UUk9EVUNFRF9JTigyMSk7CkBAIC0yNzIsOSArMjg4LDExIEBACiAgKiAgICAgICBNZWRpYURybSBvYmplY3QgaXMgcmVsZWFzZWQuCiAgKiAgIDIuIGtleVJlcXVlc3RTaXplIHdpbGwgYmUgc2V0IHRvIHRoZSBzaXplIG9mIHRoZSByZXF1ZXN0CiAgKgotICogcmV0dXJucyBNRURJQURSTV9OT1RfUFJPVklTSU9ORURfRVJST1IgaWYgcmVwcm92aXNpb25pbmcgaXMgbmVlZGVkLCBkdWUgdG8gYQorICogUmV0dXJucyBNRURJQURSTV9OT1RfUFJPVklTSU9ORURfRVJST1IgaWYgcmVwcm92aXNpb25pbmcgaXMgbmVlZGVkLCBkdWUgdG8gYQogICogcHJvYmxlbSB3aXRoIHRoZSBkZXZpY2UgY2VydGlmaWNhdGUuCi0qLworICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCisgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRLZXlSZXF1ZXN0KEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TY29wZSAqc2NvcGUsCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmluaXQsIHNpemVfdCBpbml0U2l6ZSwgY29uc3QgY2hhciAqbWltZVR5cGUsIEFNZWRpYURybUtleVR5cGUga2V5VHlwZSwKICAgICAgICAgY29uc3QgQU1lZGlhRHJtS2V5VmFsdWUgKm9wdGlvbmFsUGFyYW1ldGVycywgc2l6ZV90IG51bU9wdGlvbmFsUGFyYW1ldGVycywKQEAgLTI5NSw4ICszMTMsOSBAQAogICoKICAqIHJlc3BvbnNlIHBvaW50cyB0byB0aGUgb3BhcXVlIHJlc3BvbnNlIGZyb20gdGhlIHNlcnZlcgogICogcmVzcG9uc2VTaXplIHNob3VsZCBiZSBzZXQgdG8gdGhlIHNpemUgb2YgdGhlIHJlc3BvbnNlIGluIGJ5dGVzCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwotCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcHJvdmlkZUtleVJlc3BvbnNlKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TY29wZSAqc2NvcGUsCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJlc3BvbnNlLCBzaXplX3QgcmVzcG9uc2VTaXplLAogICAgICAgICBBTWVkaWFEcm1LZXlTZXRJZCAqa2V5U2V0SWQpIF9fSU5UUk9EVUNFRF9JTigyMSk7CkBAIC0zMDUsOCArMzI0LDEwIEBACiAgKiBSZXN0b3JlIHBlcnNpc3RlZCBvZmZsaW5lIGtleXMgaW50byBhIG5ldyBzZXNzaW9uLiAga2V5U2V0SWQgaWRlbnRpZmllcyB0aGUKICAqIGtleXMgdG8gbG9hZCwgb2J0YWluZWQgZnJvbSBhIHByaW9yIGNhbGwgdG8gQU1lZGlhRHJtX3Byb3ZpZGVLZXlSZXNwb25zZS4KICAqCi0gKiBzZXNzaW9uSWQgaXMgdGhlIHNlc3Npb24gSUQgZm9yIHRoZSBEUk0gc2Vzc2lvbgotICoga2V5U2V0SWQgaWRlbnRpZmllcyB0aGUgc2F2ZWQga2V5IHNldCB0byByZXN0b3JlCisgKiBzZXNzaW9uSWQgaXMgdGhlIHNlc3Npb24gSUQgZm9yIHRoZSBEUk0gc2Vzc2lvbi4KKyAqIGtleVNldElkIGlkZW50aWZpZXMgdGhlIHNhdmVkIGtleSBzZXQgdG8gcmVzdG9yZS4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcmVzdG9yZUtleXMoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAogICAgICAgICBjb25zdCBBTWVkaWFEcm1LZXlTZXRJZCAqa2V5U2V0SWQpIF9fSU5UUk9EVUNFRF9JTigyMSk7CkBAIC0zMTQsNyArMzM1LDkgQEAKIC8qKgogICogUmVtb3ZlIHRoZSBjdXJyZW50IGtleXMgZnJvbSBhIHNlc3Npb24uCiAgKgotICoga2V5U2V0SWQgaWRlbnRpZmllcyBrZXlzIHRvIHJlbW92ZQorICoga2V5U2V0SWQgaWRlbnRpZmllcyBrZXlzIHRvIHJlbW92ZS4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcmVtb3ZlS2V5cyhBTWVkaWFEcm0gKiwKICAgICAgICAgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICprZXlTZXRJZCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKQEAgLTMzMSw2ICszNTQsOCBAQAogICogdG8gdGhlIG51bWJlciBvZiBlbnRyaWVzIHdyaXR0ZW4gdG8gdGhlIGFycmF5LiAgSWYgdGhlIG51bWJlciBvZiB7a2V5LCB2YWx1ZX0gcGFpcnMKICAqIHRvIGJlIHJldHVybmVkIGlzIGdyZWF0ZXIgdGhhbiAqbnVtUGFpcnMsIE1FRElBRFJNX1NIT1JUX0JVRkZFUiB3aWxsIGJlIHJldHVybmVkCiAgKiBhbmQgbnVtUGFpcnMgd2lsbCBiZSBzZXQgdG8gdGhlIG51bWJlciBvZiBwYWlycyBhdmFpbGFibGUuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3F1ZXJ5S2V5U3RhdHVzKEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKICAgICAgICAgQU1lZGlhRHJtS2V5VmFsdWUgKmtleVZhbHVlUGFpcnMsIHNpemVfdCAqbnVtUGFpcnMpIF9fSU5UUk9EVUNFRF9JTigyMSk7CkBAIC0zNTAsNiArMzc1LDggQEAKICAqICAgIDMuIHNlcnZlclVybCB3aWxsIHJlZmVyZW5jZSBhIE5VTEwgdGVybWluYXRlZCBzdHJpbmcgY29udGFpbmluZyB0aGUgVVJMCiAgKiAgICAgICB0aGUgcHJvdmlzaW9uaW5nIHJlcXVlc3Qgc2hvdWxkIGJlIHNlbnQgdG8uICBJdCB3aWxsIHJlbWFpbiBhY2Nlc3NpYmxlIHVudGlsCiAgKiAgICAgICB0aGUgbmV4dCBjYWxsIHRvIGdldFByb3Zpc2lvblJlcXVlc3QuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldFByb3Zpc2lvblJlcXVlc3QoQU1lZGlhRHJtICosIGNvbnN0IHVpbnQ4X3QgKipwcm92aXNpb25SZXF1ZXN0LAogICAgICAgICBzaXplX3QgKnByb3Zpc2lvblJlcXVlc3RTaXplLCBjb25zdCBjaGFyICoqc2VydmVyVXJsKSBfX0lOVFJPRFVDRURfSU4oMjEpOwpAQCAtMzYzLDggKzM5MCwxMCBAQAogICogICBEUk0gZW5naW5lIHBsdWdpbi4KICAqIHJlc3BvbnNlU2l6ZSBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBwcm92aXNpb25pbmcgcmVzcG9uc2UgaW4gYnl0ZXMuCiAgKgotICogcmV0dXJucyBNRURJQURSTV9ERVZJQ0VfUkVWT0tFRF9FUlJPUiBpZiB0aGUgcmVzcG9uc2UgaW5kaWNhdGVzIHRoYXQgdGhlCisgKiBSZXR1cm5zIE1FRElBRFJNX0RFVklDRV9SRVZPS0VEX0VSUk9SIGlmIHRoZSByZXNwb25zZSBpbmRpY2F0ZXMgdGhhdCB0aGUKICAqIHNlcnZlciByZWplY3RlZCB0aGUgcmVxdWVzdAorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9wcm92aWRlUHJvdmlzaW9uUmVzcG9uc2UoQU1lZGlhRHJtICosCiAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKnJlc3BvbnNlLCBzaXplX3QgcmVzcG9uc2VTaXplKSBfX0lOVFJPRFVDRURfSU4oMjEpOwpAQCAtMzkwLDYgKzQxOSw4IEBACiAgKiBJZiAqbnVtU2VjdXJlU3RvcHMgaXMgdG9vIHNtYWxsIGZvciB0aGUgbnVtYmVyIG9mIHNlY3VyZSBzdG9wcyBhdmFpbGFibGUsCiAgKiBNRURJQURSTV9TSE9SVF9CVUZGRVIgd2lsbCBiZSByZXR1cm5lZCBhbmQgKm51bVNlY3VyZVN0b3BzIHdpbGwgYmUgc2V0IHRvIHRoZQogICogbnVtYmVyIHJlcXVpcmVkLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRTZWN1cmVTdG9wcyhBTWVkaWFEcm0gKiwKICAgICAgICAgQU1lZGlhRHJtU2VjdXJlU3RvcCAqc2VjdXJlU3RvcHMsIHNpemVfdCAqbnVtU2VjdXJlU3RvcHMpIF9fSU5UUk9EVUNFRF9JTigyMSk7CkBAIC0zOTksNiArNDMwLDggQEAKICAqIHRoZSBtZXNzYWdlLCByZW1vdmUgdGhlIFNlY3VyZVN0b3BzIGlkZW50aWZpZWQgaW4gdGhlIHJlc3BvbnNlLgogICoKICAqIHNzUmVsZWFzZSBpcyB0aGUgc2VydmVyIHJlc3BvbnNlIGluZGljYXRpbmcgd2hpY2ggc2VjdXJlIHN0b3BzIHRvIHJlbGVhc2UKKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fcmVsZWFzZVNlY3VyZVN0b3BzKEFNZWRpYURybSAqLAogICAgICAgICBjb25zdCBBTWVkaWFEcm1TZWN1cmVTdG9wICpzc1JlbGVhc2UpIF9fSU5UUk9EVUNFRF9JTigyMSk7CkBAIC00MzIsNiArNDY1LDggQEAKICAqIE9uIHJldHVybiwgcHJvcGVydHlWYWx1ZSB3aWxsIGJlIHNldCB0byBwb2ludCB0byB0aGUgcHJvcGVydHkgdmFsdWUuICBUaGUKICAqIG1lbW9yeSB0aGF0IHRoZSB2YWx1ZSByZXNpZGVzIGluIGlzIG93bmVkIGJ5IHRoZSBOREsgTWVkaWFEcm0gQVBJIGFuZAogICogd2lsbCByZW1haW4gdmFsaWQgdW50aWwgdGhlIG5leHQgY2FsbCB0byBBTWVkaWFEcm1fZ2V0UHJvcGVydHlTdHJpbmcuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2dldFByb3BlcnR5U3RyaW5nKEFNZWRpYURybSAqLCBjb25zdCBjaGFyICpwcm9wZXJ0eU5hbWUsCiAgICAgICAgIGNvbnN0IGNoYXIgKipwcm9wZXJ0eVZhbHVlKSBfX0lOVFJPRFVDRURfSU4oMjEpOwpAQCAtNDQ3LDE4ICs0ODIsMjQgQEAKICAqIE9uIHJldHVybiwgKnByb3BlcnR5VmFsdWUgd2lsbCBiZSBzZXQgdG8gcG9pbnQgdG8gdGhlIHByb3BlcnR5IHZhbHVlLiAgVGhlCiAgKiBtZW1vcnkgdGhhdCB0aGUgdmFsdWUgcmVzaWRlcyBpbiBpcyBvd25lZCBieSB0aGUgTkRLIE1lZGlhRHJtIEFQSSBhbmQKICAqIHdpbGwgcmVtYWluIHZhbGlkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gQU1lZGlhRHJtX2dldFByb3BlcnR5Qnl0ZUFycmF5LgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9nZXRQcm9wZXJ0eUJ5dGVBcnJheShBTWVkaWFEcm0gKiwgY29uc3QgY2hhciAqcHJvcGVydHlOYW1lLAogICAgICAgICBBTWVkaWFEcm1CeXRlQXJyYXkgKnByb3BlcnR5VmFsdWUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgogICogU2V0IGEgRFJNIGVuZ2luZSBwbHVnaW4gU3RyaW5nIHByb3BlcnR5IHZhbHVlLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9zZXRQcm9wZXJ0eVN0cmluZyhBTWVkaWFEcm0gKiwgY29uc3QgY2hhciAqcHJvcGVydHlOYW1lLAogICAgICAgICBjb25zdCBjaGFyICp2YWx1ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBTZXQgYSBEUk0gZW5naW5lIHBsdWdpbiBieXRlIGFycmF5IHByb3BlcnR5IHZhbHVlLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9zZXRQcm9wZXJ0eUJ5dGVBcnJheShBTWVkaWFEcm0gKiwgY29uc3QgY2hhciAqcHJvcGVydHlOYW1lLAogICAgICAgICBjb25zdCB1aW50OF90ICp2YWx1ZSwgc2l6ZV90IHZhbHVlU2l6ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKQEAgLTQ4Nyw2ICs1MjgsOCBAQAogICogZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIGFjY2VwdCBkYXRhU2l6ZSBieXRlcy4gVGhlIGtleQogICogdG8gdXNlIGlzIGlkZW50aWZpZWQgYnkgdGhlIDE2IGJ5dGUga2V5SWQuICBUaGUga2V5IG11c3QgaGF2ZSBiZWVuIGxvYWRlZCBpbnRvCiAgKiB0aGUgc2Vzc2lvbiB1c2luZyBwcm92aWRlS2V5UmVzcG9uc2UuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX2VuY3J5cHQoQU1lZGlhRHJtICosIGNvbnN0IEFNZWRpYURybVNlc3Npb25JZCAqc2Vzc2lvbklkLAogICAgICAgICBjb25zdCBjaGFyICpjaXBoZXJBbGdvcml0aG0sIHVpbnQ4X3QgKmtleUlkLCB1aW50OF90ICppdiwKQEAgLTQ5OCw2ICs1NDEsOCBAQAogICogZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIGFjY2VwdCBkYXRhU2l6ZSBieXRlcy4gIFRoZSBrZXkKICAqIHRvIHVzZSBpcyBpZGVudGlmaWVkIGJ5IHRoZSAxNiBieXRlIGtleUlkLiAgVGhlIGtleSBtdXN0IGhhdmUgYmVlbiBsb2FkZWQgaW50bwogICogdGhlIHNlc3Npb24gdXNpbmcgcHJvdmlkZUtleVJlc3BvbnNlLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYURybV9kZWNyeXB0KEFNZWRpYURybSAqLCBjb25zdCBBTWVkaWFEcm1TZXNzaW9uSWQgKnNlc3Npb25JZCwKICAgICAgICAgY29uc3QgY2hhciAqY2lwaGVyQWxnb3JpdGhtLCB1aW50OF90ICprZXlJZCwgdWludDhfdCAqaXYsCkBAIC01MTEsNiArNTU2LDggQEAKICAqICpzaWduYXR1cmVTaXplIGlzIHNldCB0byB0aGUgYnVmZmVyIHNpemUgcmVxdWlyZWQuICBUaGUga2V5IHRvIHVzZSBpcyBpZGVudGlmaWVkCiAgKiBieSB0aGUgMTYgYnl0ZSBrZXlJZC4gIFRoZSBrZXkgbXVzdCBoYXZlIGJlZW4gbG9hZGVkIGludG8gdGhlIHNlc3Npb24gdXNpbmcKICAqIHByb3ZpZGVLZXlSZXNwb25zZS4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFEcm1fc2lnbihBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCiAgICAgICAgIGNvbnN0IGNoYXIgKm1hY0FsZ29yaXRobSwgdWludDhfdCAqa2V5SWQsIHVpbnQ4X3QgKm1lc3NhZ2UsIHNpemVfdCBtZXNzYWdlU2l6ZSwKQEAgLTUyMiw2ICs1NjksOCBAQAogICogaWYgdGhlIHNpZ25hdHVyZSBtYXRjaGVzLCBvdGhlcndpc2UgTUVEQUlEUk1fVkVSSUZZX0ZBSUxFRCBpcyByZXR1cm5lZC4gVGhlIGtleSB0bwogICogdXNlIGlzIGlkZW50aWZpZWQgYnkgdGhlIDE2IGJ5dGUga2V5SWQuICBUaGUga2V5IG11c3QgaGF2ZSBiZWVuIGxvYWRlZCBpbnRvIHRoZQogICogc2Vzc2lvbiB1c2luZyBwcm92aWRlS2V5UmVzcG9uc2UuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRHJtX3ZlcmlmeShBTWVkaWFEcm0gKiwgY29uc3QgQU1lZGlhRHJtU2Vzc2lvbklkICpzZXNzaW9uSWQsCiAgICAgICAgIGNvbnN0IGNoYXIgKm1hY0FsZ29yaXRobSwgdWludDhfdCAqa2V5SWQsIGNvbnN0IHVpbnQ4X3QgKm1lc3NhZ2UsIHNpemVfdCBtZXNzYWdlU2l6ZSwKZGlmZiAtLWdpdCBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3IuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXJyb3IuaAppbmRleCA3NWY0NjA1Li4yYmUxZDZlIDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUVycm9yLmgKKysrIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFcnJvci5oCkBAIC02Myw2ICs2Myw3IEBACiAgICAgQU1FRElBX0VSUk9SX0lOVkFMSURfT1BFUkFUSU9OICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gNSwKICAgICBBTUVESUFfRVJST1JfRU5EX09GX1NUUkVBTSAgICAgICAgID0gQU1FRElBX0VSUk9SX0JBU0UgLSA2LAogICAgIEFNRURJQV9FUlJPUl9JTyAgICAgICAgICAgICAgICAgICAgPSBBTUVESUFfRVJST1JfQkFTRSAtIDcsCisgICAgQU1FRElBX0VSUk9SX1dPVUxEX0JMT0NLICAgICAgICAgICA9IEFNRURJQV9FUlJPUl9CQVNFIC0gOCwKIAogICAgIEFNRURJQV9EUk1fRVJST1JfQkFTRSAgICAgICAgICAgICAgPSAtMjAwMDAsCiAgICAgQU1FRElBX0RSTV9OT1RfUFJPVklTSU9ORUQgICAgICAgICA9IEFNRURJQV9EUk1fRVJST1JfQkFTRSAtIDEsCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFFeHRyYWN0b3IuaAppbmRleCA2YTE3OTZmLi4xNDMxOWM0IDEwMDY0NAotLS0gYS9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUV4dHJhY3Rvci5oCisrKyBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRXh0cmFjdG9yLmgKQEAgLTUyLDMyICs1Miw0MSBAQAogI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQogCiAvKioKLSAqIENyZWF0ZSBuZXcgbWVkaWEgZXh0cmFjdG9yCisgKiBDcmVhdGUgbmV3IG1lZGlhIGV4dHJhY3Rvci4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiBBTWVkaWFFeHRyYWN0b3IqIEFNZWRpYUV4dHJhY3Rvcl9uZXcoKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKLSAqIERlbGV0ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBtZWRpYSBleHRyYWN0b3IKKyAqIERlbGV0ZSBhIHByZXZpb3VzbHkgY3JlYXRlZCBtZWRpYSBleHRyYWN0b3IuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX2RlbGV0ZShBTWVkaWFFeHRyYWN0b3IqKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKLSAqICBTZXQgdGhlIGZpbGUgZGVzY3JpcHRvciBmcm9tIHdoaWNoIHRoZSBleHRyYWN0b3Igd2lsbCByZWFkLgorICogU2V0IHRoZSBmaWxlIGRlc2NyaXB0b3IgZnJvbSB3aGljaCB0aGUgZXh0cmFjdG9yIHdpbGwgcmVhZC4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkKEFNZWRpYUV4dHJhY3RvciosIGludCBmZCwgb2ZmNjRfdCBvZmZzZXQsCiAgICAgICAgIG9mZjY0X3QgbGVuZ3RoKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFNldCB0aGUgVVJJIGZyb20gd2hpY2ggdGhlIGV4dHJhY3RvciB3aWxsIHJlYWQuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2UoQU1lZGlhRXh0cmFjdG9yKiwKICAgICAgICAgY29uc3QgY2hhciAqbG9jYXRpb24pIF9fSU5UUk9EVUNFRF9JTigyMSk7Ci0gICAgICAgIC8vIFRPRE8gc3VwcG9ydCBoZWFkZXJzCiAKICNpZiBfX0FORFJPSURfQVBJX18gPj0gMjgKIAogLyoqCiAgKiBTZXQgdGhlIGN1c3RvbSBkYXRhIHNvdXJjZSBpbXBsZW1lbnRhdGlvbiBmcm9tIHdoaWNoIHRoZSBleHRyYWN0b3Igd2lsbCByZWFkLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjguCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlQ3VzdG9tKEFNZWRpYUV4dHJhY3RvciosCiAgICAgICAgIEFNZWRpYURhdGFTb3VyY2UgKnNyYykgX19JTlRST0RVQ0VEX0lOKDI4KTsKQEAgLTg2LDExICs5NSwxNSBAQAogCiAvKioKICAqIFJldHVybiB0aGUgbnVtYmVyIG9mIHRyYWNrcyBpbiB0aGUgcHJldmlvdXNseSBzcGVjaWZpZWQgbWVkaWEgZmlsZQorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIHNpemVfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0VHJhY2tDb3VudChBTWVkaWFFeHRyYWN0b3IqKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFJldHVybiB0aGUgZm9ybWF0IG9mIHRoZSBzcGVjaWZpZWQgdHJhY2suIFRoZSBjYWxsZXIgbXVzdCBmcmVlIHRoZSByZXR1cm5lZCBmb3JtYXQKKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiBBTWVkaWFGb3JtYXQqIEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0Zvcm1hdChBTWVkaWFFeHRyYWN0b3IqLCBzaXplX3QgaWR4KSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCkBAIC05OSw0MSArMTEyLDU1IEBACiAgKiBnZXRTYW1wbGVUaW1lIG9ubHkgcmV0cmlldmUgaW5mb3JtYXRpb24gZm9yIHRoZSBzdWJzZXQgb2YgdHJhY2tzIHNlbGVjdGVkLgogICogU2VsZWN0aW5nIHRoZSBzYW1lIHRyYWNrIG11bHRpcGxlIHRpbWVzIGhhcyBubyBlZmZlY3QsIHRoZSB0cmFjayBpcwogICogb25seSBzZWxlY3RlZCBvbmNlLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYUV4dHJhY3Rvcl9zZWxlY3RUcmFjayhBTWVkaWFFeHRyYWN0b3IqLCBzaXplX3QgaWR4KSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFVuc2VsZWN0IHRoZSBzcGVjaWZpZWQgdHJhY2suIFN1YnNlcXVlbnQgY2FsbHMgdG8gcmVhZFNhbXBsZURhdGEsIGdldFNhbXBsZVRyYWNrSW5kZXggYW5kCi0gKiBnZXRTYW1wbGVUaW1lIG9ubHkgcmV0cmlldmUgaW5mb3JtYXRpb24gZm9yIHRoZSBzdWJzZXQgb2YgdHJhY2tzIHNlbGVjdGVkLi4KKyAqIGdldFNhbXBsZVRpbWUgb25seSByZXRyaWV2ZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHN1YnNldCBvZiB0cmFja3Mgc2VsZWN0ZWQuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRXh0cmFjdG9yX3Vuc2VsZWN0VHJhY2soQU1lZGlhRXh0cmFjdG9yKiwgc2l6ZV90IGlkeCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBSZWFkIHRoZSBjdXJyZW50IHNhbXBsZS4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiBzc2l6ZV90IEFNZWRpYUV4dHJhY3Rvcl9yZWFkU2FtcGxlRGF0YShBTWVkaWFFeHRyYWN0b3IqLAogICAgICAgICB1aW50OF90ICpidWZmZXIsIHNpemVfdCBjYXBhY2l0eSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBSZWFkIHRoZSBjdXJyZW50IHNhbXBsZSdzIGZsYWdzLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIHVpbnQzMl90IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVGbGFncyhBTWVkaWFFeHRyYWN0b3IqKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFJldHVybnMgdGhlIHRyYWNrIGluZGV4IHRoZSBjdXJyZW50IHNhbXBsZSBvcmlnaW5hdGVzIGZyb20gKG9yIC0xCiAgKiBpZiBubyBtb3JlIHNhbXBsZXMgYXJlIGF2YWlsYWJsZSkKKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiBpbnQgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRyYWNrSW5kZXgoQU1lZGlhRXh0cmFjdG9yKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBSZXR1cm5zIHRoZSBjdXJyZW50IHNhbXBsZSdzIHByZXNlbnRhdGlvbiB0aW1lIGluIG1pY3Jvc2Vjb25kcy4KICAqIG9yIC0xIGlmIG5vIG1vcmUgc2FtcGxlcyBhcmUgYXZhaWxhYmxlLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIGludDY0X3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVRpbWUoQU1lZGlhRXh0cmFjdG9yKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAogLyoqCiAgKiBBZHZhbmNlIHRvIHRoZSBuZXh0IHNhbXBsZS4gUmV0dXJucyBmYWxzZSBpZiBubyBtb3JlIHNhbXBsZSBkYXRhCiAgKiBpcyBhdmFpbGFibGUgKGVuZCBvZiBzdHJlYW0pLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIGJvb2wgQU1lZGlhRXh0cmFjdG9yX2FkdmFuY2UoQU1lZGlhRXh0cmFjdG9yKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIApAQCAtMTQ0LDcgKzE3MSw3IEBACiB9IFNlZWtNb2RlOwogCiAvKioKLSAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3Jfc2Vla1RvKEFNZWRpYUV4dHJhY3RvciosCiAgICAgICAgIGludDY0X3Qgc2Vla1Bvc1VzLCBTZWVrTW9kZSBtb2RlKSBfX0lOVFJPRFVDRURfSU4oMjEpOwpAQCAtMTY4LDEwICsxOTUsMTQgQEAKIAogLyoqCiAgKiBHZXQgdGhlIFBTU0ggaW5mbyBpZiBwcmVzZW50LgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIFBzc2hJbmZvKiBBTWVkaWFFeHRyYWN0b3JfZ2V0UHNzaEluZm8oQU1lZGlhRXh0cmFjdG9yKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAotCisvKioKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCisgKi8KIEFNZWRpYUNvZGVjQ3J5cHRvSW5mbyAqQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZUNyeXB0b0luZm8oQU1lZGlhRXh0cmFjdG9yICopIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIGVudW0gewpAQCAtMTg3LDYgKzIxOCw4IEBACiAgKgogICogVGhpcyBmdW5jdGlvbiB3aWxsIGFsd2F5cyByZXR1cm4gYSBmb3JtYXQ7IGhvd2V2ZXIsIHRoZSBmb3JtYXQgY291bGQgYmUgZW1wdHkKICAqIChubyBrZXktdmFsdWUgcGFpcnMpIGlmIHRoZSBtZWRpYSBjb250YWluZXIgZG9lcyBub3QgcHJvdmlkZSBmb3JtYXQgaW5mb3JtYXRpb24uCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyOC4KICAqLwogQU1lZGlhRm9ybWF0KiBBTWVkaWFFeHRyYWN0b3JfZ2V0RmlsZUZvcm1hdChBTWVkaWFFeHRyYWN0b3IqKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCkBAIC0xOTksNiArMjMyLDcgQEAKICAqIHVpbnQ4X3QgKmJ1ZiA9IG5ldyB1aW50OF90W3NhbXBsZVNpemVdOwogICogQU1lZGlhRXh0cmFjdG9yX3JlYWRTYW1wbGVEYXRhKGV4LCBidWYsIHNhbXBsZVNpemUpOwogICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjguCiAgKi8KIHNzaXplX3QgQU1lZGlhRXh0cmFjdG9yX2dldFNhbXBsZVNpemUoQU1lZGlhRXh0cmFjdG9yKikgX19JTlRST0RVQ0VEX0lOKDI4KTsKIApAQCAtMjEyLDYgKzI0Niw4IEBACiAgKiBSZXR1cm5zIC0xIHdoZW4gdGhlIGV4dHJhY3RvciBpcyBub3QgcmVhZGluZyBmcm9tIGEgbmV0d29yayBkYXRhIHNvdXJjZSwgb3Igd2hlbiB0aGUKICAqIGNhY2hlZCBkdXJhdGlvbiBjYW5ub3QgYmUgY2FsY3VsYXRlZCAoYml0cmF0ZSwgZHVyYXRpb24sIGFuZCBmaWxlIHNpemUgaW5mb3JtYXRpb24KICAqIG5vdCBhdmFpbGFibGUpLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjguCiAgKi8KIGludDY0X3QgQU1lZGlhRXh0cmFjdG9yX2dldENhY2hlZER1cmF0aW9uKEFNZWRpYUV4dHJhY3RvciAqKSBfX0lOVFJPRFVDRURfSU4oMjgpOwogCkBAIC0yMjMsNiArMjU5LDggQEAKICAqIFJldHVybnMgQU1FRElBX09LIG9uIHN1Y2Nlc3Mgb3IgQU1FRElBX0VSUk9SXyogdG8gaW5kaWNhdGUgZmFpbHVyZSByZWFzb24uCiAgKiBFeGlzdGluZyBrZXktdmFsdWUgcGFpcnMgaW4gfGZtdHwgd291bGQgYmUgcmVtb3ZlZCBpZiB0aGlzIEFQSSByZXR1cm5zIEFNRURJQV9PSy4KICAqIFRoZSBjb250ZW50cyBvZiB8Zm10fCBpcyB1bmRlZmluZWQgaWYgdGhpcyBBUEkgcmV0dXJucyBBTUVESUFfRVJST1JfKi4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI4LgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlRm9ybWF0KEFNZWRpYUV4dHJhY3RvciAqZXgsCiAgICAgICAgIEFNZWRpYUZvcm1hdCAqZm10KSBfX0lOVFJPRFVDRURfSU4oMjgpOwpkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaCBiL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhRm9ybWF0LmgKaW5kZXggNWY3ODA0ZC4uNDFjMjM3OCAxMDA2NDQKLS0tIGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFGb3JtYXQuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYUZvcm1hdC5oCkBAIC00OCw0OCArNDgsODIgQEAKIAogI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQogCisvKioKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCisgKi8KIEFNZWRpYUZvcm1hdCAqQU1lZGlhRm9ybWF0X25ldygpIF9fSU5UUk9EVUNFRF9JTigyMSk7CisKKy8qKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KKyAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhRm9ybWF0X2RlbGV0ZShBTWVkaWFGb3JtYXQqKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIEh1bWFuIHJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmb3JtYXQuIFRoZSByZXR1cm5lZCBzdHJpbmcgaXMgb3duZWQgYnkgdGhlIGZvcm1hdCwKICAqIGFuZCByZW1haW5zIHZhbGlkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gdG9TdHJpbmcsIG9yIHVudGlsIHRoZSBmb3JtYXQgaXMgZGVsZXRlZC4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiBjb25zdCBjaGFyKiBBTWVkaWFGb3JtYXRfdG9TdHJpbmcoQU1lZGlhRm9ybWF0KikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIAorLyoqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgorICovCiBib29sIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCBpbnQzMl90ICpvdXQpIF9fSU5UUk9EVUNFRF9JTigyMSk7CisvKioKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCisgKi8KIGJvb2wgQU1lZGlhRm9ybWF0X2dldEludDY0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsIGludDY0X3QgKm91dCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKKy8qKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KKyAqLwogYm9vbCBBTWVkaWFGb3JtYXRfZ2V0RmxvYXQoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciAqbmFtZSwgZmxvYXQgKm91dCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKKy8qKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KKyAqLwogYm9vbCBBTWVkaWFGb3JtYXRfZ2V0U2l6ZShBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgKm91dCkgX19JTlRST0RVQ0VEX0lOKDIxKTsKIC8qKgogICogVGhlIHJldHVybmVkIGRhdGEgaXMgb3duZWQgYnkgdGhlIGZvcm1hdCBhbmQgcmVtYWlucyB2YWxpZCBhcyBsb25nIGFzIHRoZSBuYW1lZCBlbnRyeQogICogaXMgcGFydCBvZiB0aGUgZm9ybWF0LgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIGJvb2wgQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCB2b2lkKiogZGF0YSwgc2l6ZV90ICpzaXplKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogLyoqCiAgKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIG93bmVkIGJ5IHRoZSBmb3JtYXQsIGFuZCByZW1haW5zIHZhbGlkIHVudGlsIHRoZSBuZXh0IGNhbGwgdG8gZ2V0U3RyaW5nLAogICogb3IgdW50aWwgdGhlIGZvcm1hdCBpcyBkZWxldGVkLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIGJvb2wgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICoqb3V0KSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAKKy8qKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KKyAqLwogdm9pZCBBTWVkaWFGb3JtYXRfc2V0SW50MzIoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgaW50MzJfdCB2YWx1ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKKy8qKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KKyAqLwogdm9pZCBBTWVkaWFGb3JtYXRfc2V0SW50NjQoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgaW50NjRfdCB2YWx1ZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKKy8qKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KKyAqLwogdm9pZCBBTWVkaWFGb3JtYXRfc2V0RmxvYXQoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgZmxvYXQgdmFsdWUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAvKioKICAqIFRoZSBwcm92aWRlZCBzdHJpbmcgaXMgY29waWVkIGludG8gdGhlIGZvcm1hdC4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiB2b2lkIEFNZWRpYUZvcm1hdF9zZXRTdHJpbmcoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgY29uc3QgY2hhciogdmFsdWUpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAvKioKICAqIFRoZSBwcm92aWRlZCBkYXRhIGlzIGNvcGllZCBpbnRvIHRoZSBmb3JtYXQuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwotdm9pZCBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSBfX0lOVFJPRFVDRURfSU4oMjEpOwordm9pZCBBTWVkaWFGb3JtYXRfc2V0QnVmZmVyKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIGNvbnN0IHZvaWQqIGRhdGEsIHNpemVfdCBzaXplKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAKLQotLyoqCi0gKiBYWFggc2hvdWxkIHRoZXNlIGJlIGludHMvZW51bXMgdGhhdCB3ZSBsb29rIHVwIGluIGEgdGFibGUgYXMgbmVlZGVkPwotICovCiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BQUNfRFJDX0FUVEVOVUFUSU9OX0ZBQ1RPUiBfX0lOVFJPRFVDRURfSU4oMjgpOwogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUFDX0RSQ19CT09TVF9GQUNUT1IgX19JTlRST0RVQ0VEX0lOKDI4KTsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FBQ19EUkNfSEVBVllfQ09NUFJFU1NJT04gX19JTlRST0RVQ0VEX0lOKDI4KTsKQEAgLTE1NiwyMCArMTkwLDExMCBAQAogZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQgX19JTlRST0RVQ0VEX0lOKDI4KTsKIGV4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RSQUNLX0lOREVYIF9fSU5UUk9EVUNFRF9JTigyOCk7CiBleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9XSURUSCBfX0lOVFJPRFVDRURfSU4oMjEpOwotCiAjZW5kaWYgLyogX19BTkRST0lEX0FQSV9fID49IDIxICovCiAKICNpZiBfX0FORFJPSURfQVBJX18gPj0gMjgKKy8qKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyOC4KKyAqLwogYm9vbCBBTWVkaWFGb3JtYXRfZ2V0RG91YmxlKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsIGRvdWJsZSAqb3V0KSBfX0lOVFJPRFVDRURfSU4oMjgpOworLyoqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI4LgorICovCiBib29sIEFNZWRpYUZvcm1hdF9nZXRSZWN0KEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIgKm5hbWUsCiAgICAgICAgIGludDMyX3QgKmxlZnQsIGludDMyX3QgKnRvcCwgaW50MzJfdCAqcmlnaHQsIGludDMyX3QgKmJvdHRvbSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKIAorLyoqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI4LgorICovCiB2b2lkIEFNZWRpYUZvcm1hdF9zZXREb3VibGUoQU1lZGlhRm9ybWF0KiwgY29uc3QgY2hhciogbmFtZSwgZG91YmxlIHZhbHVlKSBfX0lOVFJPRFVDRURfSU4oMjgpOworLyoqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI4LgorICovCiB2b2lkIEFNZWRpYUZvcm1hdF9zZXRTaXplKEFNZWRpYUZvcm1hdCosIGNvbnN0IGNoYXIqIG5hbWUsIHNpemVfdCB2YWx1ZSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKKy8qKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyOC4KKyAqLwogdm9pZCBBTWVkaWFGb3JtYXRfc2V0UmVjdChBTWVkaWFGb3JtYXQqLCBjb25zdCBjaGFyKiBuYW1lLAogICAgICAgICBpbnQzMl90IGxlZnQsIGludDMyX3QgdG9wLCBpbnQzMl90IHJpZ2h0LCBpbnQzMl90IGJvdHRvbSkgX19JTlRST0RVQ0VEX0lOKDI4KTsKICNlbmRpZiAvKiBfX0FORFJPSURfQVBJX18gPj0gMjggKi8KIAorI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyOQorLyoqCisgKiBSZW1vdmUgYWxsIGtleS92YWx1ZSBwYWlycyBmcm9tIHRoZSBnaXZlbiBBTWVkaWFGb3JtYXQuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyOS4KKyAqLwordm9pZCBBTWVkaWFGb3JtYXRfY2xlYXIoQU1lZGlhRm9ybWF0KikgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworLyoqCisgKiBDb3B5IG9uZSBBTWVkaWFGb3JtYXQgdG8gYW5vdGhlci4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDI5LgorICovCittZWRpYV9zdGF0dXNfdCBBTWVkaWFGb3JtYXRfY29weShBTWVkaWFGb3JtYXQgKnRvLCBBTWVkaWFGb3JtYXQgKmZyb20pIF9fSU5UUk9EVUNFRF9JTigyOSk7CisKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FMQlVNIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1QgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FSVElTVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk8gX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9QUkVTRU5UQVRJT05fSUQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1BSRVNFTlRBVElPTl9QUk9HUkFNX0lEIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9BVVRIT1IgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0JJVFNfUEVSX1NBTVBMRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ0RUUkFDS05VTUJFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ09NUElMQVRJT04gX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NPTVBPU0VSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUkVBVEVfSU5QVVRfU1VSRkFDRV9TVVNQRU5ERUQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19ERUZBVUxUX0lWX1NJWkUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19FTkNSWVBURURfQllURV9CTE9DSyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9TSVpFUyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0lWIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fS0VZIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fTU9ERSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX1BMQUlOX1NJWkVTIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DUllQVE9fU0tJUF9CWVRFX0JMT0NLIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfQVZDIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9DU0RfSEVWQyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRDI2MyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfREFURSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRElTQ05VTUJFUiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9ERUxBWSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRU5DT0RFUl9QQURESU5HIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FU0RTIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9FWElGX09GRlNFVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfRVhJRl9TSVpFIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9GUkFNRV9DT1VOVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfR0VOUkUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0hBUFRJQ19DSEFOTkVMX0NPVU5UIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9JQ0NfUFJPRklMRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfSVNfU1lOQ19GUkFNRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTE9DQVRJT04gX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xPT1AgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX0xZUklDSVNUIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQU5VRkFDVFVSRVIgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX01BWF9CSVRfUkFURSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfTUFYX0ZQU19UT19FTkNPREVSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NQVhfUFRTX0dBUF9UT19FTkNPREVSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9NUEVHMl9TVFJFQU1fSEVBREVSIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9QQ01fQklHX0VORElBTiBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfUFNTSCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FSX0hFSUdIVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfU0FSX1dJRFRIIF9fSU5UUk9EVUNFRF9JTigyOSk7CitleHRlcm4gY29uc3QgY2hhciogQU1FRElBRk9STUFUX0tFWV9UQVJHRVRfVElNRSBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJfQ09VTlQgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RFWFRfRk9STUFUX0RBVEEgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9DU0RfSEVWQyBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0hFSUdIVCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9XSURUSCBfX0lOVFJPRFVDRURfSU4oMjkpOworZXh0ZXJuIGNvbnN0IGNoYXIqIEFNRURJQUZPUk1BVF9LRVlfVElUTEUgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVMgX19JTlRST0RVQ0VEX0lOKDI5KTsKK2V4dGVybiBjb25zdCBjaGFyKiBBTUVESUFGT1JNQVRfS0VZX1lFQVIgX19JTlRST0RVQ0VEX0lOKDI5KTsKKworI2VuZGlmIC8qIF9fQU5EUk9JRF9BUElfXyA+PSAyOSAqLworCiBfX0VORF9ERUNMUwogCiAjZW5kaWYgLy8gX05ES19NRURJQV9GT1JNQVRfSApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFNdXhlci5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvbWVkaWEvTmRrTWVkaWFNdXhlci5oCmluZGV4IDczOTM4NjcuLjNmZGVlYTQgMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9pbmNsdWRlL21lZGlhL05ka01lZGlhTXV4ZXIuaAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9tZWRpYS9OZGtNZWRpYU11eGVyLmgKQEAgLTU2LDEyICs1NiwxNiBAQAogI2lmIF9fQU5EUk9JRF9BUElfXyA+PSAyMQogCiAvKioKLSAqIENyZWF0ZSBuZXcgbWVkaWEgbXV4ZXIKKyAqIENyZWF0ZSBuZXcgbWVkaWEgbXV4ZXIuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogQU1lZGlhTXV4ZXIqIEFNZWRpYU11eGVyX25ldyhpbnQgZmQsIE91dHB1dEZvcm1hdCBmb3JtYXQpIF9fSU5UUk9EVUNFRF9JTigyMSk7CiAKIC8qKgotICogRGVsZXRlIGEgcHJldmlvdXNseSBjcmVhdGVkIG1lZGlhIG11eGVyCisgKiBEZWxldGUgYSBwcmV2aW91c2x5IGNyZWF0ZWQgbWVkaWEgbXV4ZXIuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfZGVsZXRlKEFNZWRpYU11eGVyKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIApAQCAtNzUsNiArNzksOCBAQAogICogQm90aCB2YWx1ZXMgYXJlIHNwZWNpZmllZCBpbiBkZWdyZWVzLgogICogTGF0aXR1ZGUgbXVzdCBiZSBpbiB0aGUgcmFuZ2UgWy05MCwgOTBdLgogICogTG9uZ2l0dWRlIG11c3QgYmUgaW4gdGhlIHJhbmdlIFstMTgwLCAxODBdLgorICoKKyAqIEF2YWlsYWJsZSBzaW5jZSBBUEkgbGV2ZWwgMjEuCiAgKi8KIG1lZGlhX3N0YXR1c190IEFNZWRpYU11eGVyX3NldExvY2F0aW9uKEFNZWRpYU11eGVyKiwKICAgICAgICAgZmxvYXQgbGF0aXR1ZGUsIGZsb2F0IGxvbmdpdHVkZSkgX19JTlRST0RVQ0VEX0lOKDIxKTsKQEAgLTkwLDYgKzk2LDggQEAKICAqIGR1cmluZyBwbGF5YmFjay4KICAqIFRoZSBhbmdsZSBpcyBzcGVjaWZpZWQgaW4gZGVncmVlcywgY2xvY2t3aXNlLgogICogVGhlIHN1cHBvcnRlZCBhbmdsZXMgYXJlIDAsIDkwLCAxODAsIGFuZCAyNzAgZGVncmVlcy4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zZXRPcmllbnRhdGlvbkhpbnQoQU1lZGlhTXV4ZXIqLCBpbnQgZGVncmVlcykgX19JTlRST0RVQ0VEX0lOKDIxKTsKIApAQCAtOTcsMTggKzEwNSwyNCBAQAogICogQWRkcyBhIHRyYWNrIHdpdGggdGhlIHNwZWNpZmllZCBmb3JtYXQuCiAgKiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV3IHRyYWNrIG9yIGEgbmVnYXRpdmUgdmFsdWUgaW4gY2FzZSBvZiBmYWlsdXJlLAogICogd2hpY2ggY2FuIGJlIGludGVycHJldGVkIGFzIGEgbWVkaWFfc3RhdHVzX3QuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogc3NpemVfdCBBTWVkaWFNdXhlcl9hZGRUcmFjayhBTWVkaWFNdXhlciosIGNvbnN0IEFNZWRpYUZvcm1hdCogZm9ybWF0KSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFN0YXJ0IHRoZSBtdXhlci4gU2hvdWxkIGJlIGNhbGxlZCBhZnRlciBBTWVkaWFNdXhlcl9hZGRUcmFjayBhbmQKICAqIGJlZm9yZSBBTWVkaWFNdXhlcl93cml0ZVNhbXBsZURhdGEuCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfc3RhcnQoQU1lZGlhTXV4ZXIqKSBfX0lOVFJPRFVDRURfSU4oMjEpOwogCiAvKioKICAqIFN0b3BzIHRoZSBtdXhlci4KICAqIE9uY2UgdGhlIG11eGVyIHN0b3BzLCBpdCBjYW4gbm90IGJlIHJlc3RhcnRlZC4KKyAqCisgKiBBdmFpbGFibGUgc2luY2UgQVBJIGxldmVsIDIxLgogICovCiBtZWRpYV9zdGF0dXNfdCBBTWVkaWFNdXhlcl9zdG9wKEFNZWRpYU11eGVyKikgX19JTlRST0RVQ0VEX0lOKDIxKTsKIApAQCAtMTE4LDYgKzEzMiw4IEBACiAgKiB0aGUgcmlnaHQgdHJhY2tzLiBBbHNvLCBpdCBuZWVkcyB0byBtYWtlIHN1cmUgdGhlIHNhbXBsZXMgZm9yIGVhY2ggdHJhY2sKICAqIGFyZSB3cml0dGVuIGluIGNocm9ub2xvZ2ljYWwgb3JkZXIgKGUuZy4gaW4gdGhlIG9yZGVyIHRoZXkgYXJlIHByb3ZpZGVkCiAgKiBieSB0aGUgZW5jb2Rlci4pCisgKgorICogQXZhaWxhYmxlIHNpbmNlIEFQSSBsZXZlbCAyMS4KICAqLwogbWVkaWFfc3RhdHVzX3QgQU1lZGlhTXV4ZXJfd3JpdGVTYW1wbGVEYXRhKEFNZWRpYU11eGVyICptdXhlciwKICAgICAgICAgc2l6ZV90IHRyYWNrSWR4LCBjb25zdCB1aW50OF90ICpkYXRhLApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9OZGtJbWFnZS5oIGIvbWVkaWEvbmRrL2luY2x1ZGUvcHJpdmF0ZS9tZWRpYS9OZGtJbWFnZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzNjhhNTYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvaW5jbHVkZS9wcml2YXRlL21lZGlhL05ka0ltYWdlLmgKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX1BSSVZBVEVfTUVESUFfTkRLSU1BR0VfSF8KKyNkZWZpbmUgX1BSSVZBVEVfTUVESUFfTkRLSU1BR0VfSF8KKy8vIEZvcm1hdHMgbm90IGxpc3RlZCBpbiB0aGUgcHVibGljIEFQSSwgYnV0IHN0aWxsIGF2YWlsYWJsZSB0byBBSW1hZ2VSZWFkZXIKK2VudW0gQUlNQUdFX1BSSVZBVEVfRk9STUFUUyB7CisgICAgLyoqCisgICAgICogVW5wcm9jZXNzZWQgaW1wbGVtZW50YXRpb24tZGVwZW5kZW50IHJhdworICAgICAqIGRlcHRoIG1lYXN1cmVtZW50cywgb3BhcXVlIHdpdGggMTYgYml0CisgICAgICogc2FtcGxlcy4KKyAgICAgKgorICAgICAqLworCisgICAgQUlNQUdFX0ZPUk1BVF9SQVdfREVQVEggPSAweDEwMDIsCit9OworI2VuZGlmIC8vIF9QUklWQVRFX01FRElBX05ES0lNQUdFCmRpZmYgLS1naXQgYS9tZWRpYS9uZGsvbGlibWVkaWFuZGsubWFwLnR4dCBiL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CmluZGV4IGRlZWNiNjMuLjc1MzE1NzggMTAwNjQ0Ci0tLSBhL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CisrKyBiL21lZGlhL25kay9saWJtZWRpYW5kay5tYXAudHh0CkBAIC00LDYgKzQsNyBAQAogICAgIEFJbWFnZVJlYWRlcl9hY3F1aXJlTGF0ZXN0SW1hZ2VBc3luYzsgIyBpbnRyb2R1Y2VkPTI2CiAgICAgQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2U7ICMgaW50cm9kdWNlZD0yNAogICAgIEFJbWFnZVJlYWRlcl9hY3F1aXJlTmV4dEltYWdlQXN5bmM7ICMgaW50cm9kdWNlZD0yNgorICAgIEFJbWFnZVJlYWRlcl9nZXRXaW5kb3dOYXRpdmVIYW5kbGU7ICMgbGxuZGsKICAgICBBSW1hZ2VSZWFkZXJfZGVsZXRlOyAjIGludHJvZHVjZWQ9MjQKICAgICBBSW1hZ2VSZWFkZXJfZ2V0Rm9ybWF0OyAjIGludHJvZHVjZWQ9MjQKICAgICBBSW1hZ2VSZWFkZXJfZ2V0SGVpZ2h0OyAjIGludHJvZHVjZWQ9MjQKQEAgLTM0LDY0ICszNSwxMjAgQEAKICAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19NQVhfT1VUUFVUX0NIQU5ORUxfQ09VTlQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0FBQ19QUk9GSUxFOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9BQUNfU0JSX01PREU7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FMQlVNOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9BTEJVTUFSVDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQUxCVU1BUlRJU1Q7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FSVElTVDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQVVESU9fUFJFU0VOVEFUSU9OX0lORk87ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0FVRElPX1NFU1NJT05fSUQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0FVVEhPUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfQklUUkFURV9NT0RFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9CSVRfUkFURTsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfQklUU19QRVJfU0FNUExFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9DQVBUVVJFX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NEVFJBQ0tOVU1CRVI7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQ7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfTUFTSzsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFUOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9SQU5HRTsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfU1RBTkRBUkQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0NPTE9SX1RSQU5TRkVSOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9DT01QSUxBVElPTjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfQ09NUExFWElUWTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ09NUE9TRVI7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSRUFURV9JTlBVVF9TVVJGQUNFX1NVU1BFTkRFRDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0RFRkFVTFRfSVZfU0laRTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1JZUFRPX0VOQ1JZUFRFRF9CWVRFX0JMT0NLOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fRU5DUllQVEVEX1NJWkVTOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fSVY7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19LRVk7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19NT0RFOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9DUllQVE9fUExBSU5fU0laRVM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0NSWVBUT19TS0lQX0JZVEVfQkxPQ0s7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEXzA7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0NTRF8xOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9DU0RfMjsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0FWQzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfQ1NEX0hFVkM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0QyNjM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0RBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0RJU0NOVU1CRVI7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfQ1JPUDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfRElTUExBWV9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0RJU1BMQVlfV0lEVEg7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0RVUkFUSU9OOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX0RFTEFZOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9FTkNPREVSX1BBRERJTkc7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0VTRFM7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0VYSUZfT0ZGU0VUOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9FWElGX1NJWkU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX0NPVU5UOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9GTEFDX0NPTVBSRVNTSU9OX0xFVkVMOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9HRU5SRTsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfR1JJRF9DT0xVTU5TOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9HUklEX1JPV1M7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX0hBUFRJQ19DSEFOTkVMX0NPVU5UOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9IRFJfU1RBVElDX0lORk87ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVDsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfSUNDX1BST0ZJTEU7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0lOVFJBX1JFRlJFU0hfUEVSSU9EOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9JU19BRFRTOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9JU19BVVRPU0VMRUNUOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9JU19ERUZBVUxUOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9JU19GT1JDRURfU1VCVElUTEU7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX0lTX1NZTkNfRlJBTUU7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX0lfRlJBTUVfSU5URVJWQUw7ICMgdmFyIGludHJvZHVjZWQ9MjEKICAgICBBTUVESUFGT1JNQVRfS0VZX0xBTkdVQUdFOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9MQVRFTkNZOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9MRVZFTDsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfTE9DQVRJT047ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0xPT1A7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX0xZUklDSVNUOyAjIHZhciBpbnRyb2R1Y2VkPTI5CisgICAgQU1FRElBRk9STUFUX0tFWV9NQU5VRkFDVFVSRVI7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX01BWF9CSVRfUkFURTsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX0ZQU19UT19FTkNPREVSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9NQVhfSU5QVVRfU0laRTsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX1BUU19HQVBfVE9fRU5DT0RFUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfTUFYX1dJRFRIOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9NSU1FOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9NUEVHX1VTRVJfREFUQTsgIyB2YXIgaW50cm9kdWNlZD0yOAorICAgIEFNRURJQUZPUk1BVF9LRVlfTVBFRzJfU1RSRUFNX0hFQURFUjsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfT1BFUkFUSU5HX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX1BDTV9CSUdfRU5ESUFOOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9QQ01fRU5DT0RJTkc7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1BSSU9SSVRZOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFOyAjIHZhciBpbnRyb2R1Y2VkPTI4CisgICAgQU1FRElBRk9STUFUX0tFWV9QU1NIOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9QVVNIX0JMQU5LX0JVRkZFUlNfT05fU1RPUDsgIyB2YXIgaW50cm9kdWNlZD0yMQogICAgIEFNRURJQUZPUk1BVF9LRVlfUkVQRUFUX1BSRVZJT1VTX0ZSQU1FX0FGVEVSOyAjIHZhciBpbnRyb2R1Y2VkPTIxCiAgICAgQU1FRElBRk9STUFUX0tFWV9ST1RBVElPTjsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEU7ICMgdmFyIGludHJvZHVjZWQ9MjEKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NBUl9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1NBUl9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yOQogICAgIEFNRURJQUZPUk1BVF9LRVlfU0VJOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9TTElDRV9IRUlHSFQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1NUUklERTsgIyB2YXIgaW50cm9kdWNlZD0yMQorICAgIEFNRURJQUZPUk1BVF9LRVlfVEFSR0VUX1RJTUU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RFTVBPUkFMX0xBWUVSX0NPVU5UOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1FRElBRk9STUFUX0tFWV9URU1QT1JBTF9MQVlFUl9JRDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVEVNUE9SQUxfTEFZRVJJTkc7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RFWFRfRk9STUFUX0RBVEE7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9DU0RfSEVWQzsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX0hFSUdIVDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfVEhVTUJOQUlMX1RJTUU7ICMgdmFyIGludHJvZHVjZWQ9MjkKKyAgICBBTUVESUFGT1JNQVRfS0VZX1RIVU1CTkFJTF9XSURUSDsgIyB2YXIgaW50cm9kdWNlZD0yOQorICAgIEFNRURJQUZPUk1BVF9LRVlfVElUTEU7ICMgdmFyIGludHJvZHVjZWQ9MjgKICAgICBBTUVESUFGT1JNQVRfS0VZX1RJTEVfSEVJR0hUOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9USUxFX1dJRFRIOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9USU1FX1VTOyAjIHZhciBpbnRyb2R1Y2VkPTI4CiAgICAgQU1FRElBRk9STUFUX0tFWV9UUkFDS19JTkRFWDsgIyB2YXIgaW50cm9kdWNlZD0yOAogICAgIEFNRURJQUZPUk1BVF9LRVlfVFJBQ0tfSUQ7ICMgdmFyIGludHJvZHVjZWQ9MjgKKyAgICBBTUVESUFGT1JNQVRfS0VZX1ZBTElEX1NBTVBMRVM7ICMgdmFyIGludHJvZHVjZWQ9MjkKICAgICBBTUVESUFGT1JNQVRfS0VZX1dJRFRIOyAjIHZhciBpbnRyb2R1Y2VkPTIxCisgICAgQU1FRElBRk9STUFUX0tFWV9ZRUFSOyAjIHZhciBpbnRyb2R1Y2VkPTI5CiAgICAgQU1lZGlhQ29kZWNBY3Rpb25Db2RlX2lzUmVjb3ZlcmFibGU7ICMgaW50cm9kdWNlZD0yOAogICAgIEFNZWRpYUNvZGVjQWN0aW9uQ29kZV9pc1RyYW5zaWVudDsgIyBpbnRyb2R1Y2VkPTI4CiAgICAgQU1lZGlhQ29kZWNDcnlwdG9JbmZvX2RlbGV0ZTsKQEAgLTE0Miw2ICsxOTksOSBAQAogICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0U2l6ZTsgICMgaW50cm9kdWNlZD0yOAogICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0UmVhZEF0OyAgICMgaW50cm9kdWNlZD0yOAogICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0VXNlcmRhdGE7ICMgaW50cm9kdWNlZD0yOAorICAgIEFNZWRpYURhdGFTb3VyY2VfbmV3VXJpOyAgICAgICMgaW50cm9kdWNlZD0yOQorICAgIEFNZWRpYURhdGFTb3VyY2VfY2xvc2U7ICAgICAgICMgaW50cm9kdWNlZD0yOQorICAgIEFNZWRpYURhdGFTb3VyY2Vfc2V0R2V0QXZhaWxhYmxlU2l6ZTsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQU1lZGlhRHJtX2Nsb3NlU2Vzc2lvbjsKICAgICBBTWVkaWFEcm1fY3JlYXRlQnlVVUlEOwogICAgIEFNZWRpYURybV9kZWNyeXB0OwpAQCAtMTg4LDYgKzI0OCw4IEBACiAgICAgQU1lZGlhRXh0cmFjdG9yX3NldERhdGFTb3VyY2VDdXN0b207ICMgaW50cm9kdWNlZD0yOAogICAgIEFNZWRpYUV4dHJhY3Rvcl9zZXREYXRhU291cmNlRmQ7CiAgICAgQU1lZGlhRXh0cmFjdG9yX3Vuc2VsZWN0VHJhY2s7CisgICAgQU1lZGlhRm9ybWF0X2NsZWFyOyAjIGludHJvZHVjZWQ9MjkKKyAgICBBTWVkaWFGb3JtYXRfY29weTsgIyBpbnRyb2R1Y2VkPTI5CiAgICAgQU1lZGlhRm9ybWF0X2RlbGV0ZTsKICAgICBBTWVkaWFGb3JtYXRfZ2V0QnVmZmVyOwogICAgIEFNZWRpYUZvcm1hdF9nZXREb3VibGU7ICMgaW50cm9kdWNlZD0yOApkaWZmIC0tZ2l0IGEvbWVkaWEvbmRrL3Rlc3RzL0FJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QuY3BwIGIvbWVkaWEvbmRrL3Rlc3RzL0FJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNjUwNjQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS9uZGsvdGVzdHMvQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdC5jcHAKQEAgLTAsMCArMSwyMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPG1lZGlhL05ka0ltYWdlUmVhZGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrSW1hZ2UuaD4KKyNpbmNsdWRlIDxwcml2YXRlL21lZGlhL05ka0ltYWdlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oPgorI2luY2x1ZGUgPGd1aS9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzEuMC9IMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxOZGtJbWFnZVJlYWRlclByaXYuaD4KKyNpbmNsdWRlIDx2bmRrL2hhcmR3YXJlX2J1ZmZlci5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit1c2luZyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyID0gaGFyZHdhcmU6OmdyYXBoaWNzOjpidWZmZXJxdWV1ZTo6VjFfMDo6CisgICAgICAgIElHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjp1dGlsczo6SDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgYWltZzo6QUltYWdlUmVhZGVyX2dldEhHQlBGcm9tSGFuZGxlOworCit0eXBlZGVmIElHcmFwaGljQnVmZmVyUHJvZHVjZXI6OlF1ZXVlQnVmZmVySW5wdXQgUXVldWVCdWZmZXJJbnB1dDsKK3R5cGVkZWYgSUdyYXBoaWNCdWZmZXJQcm9kdWNlcjo6UXVldWVCdWZmZXJPdXRwdXQgUXVldWVCdWZmZXJPdXRwdXQ7CisKK3N0YXRpYyBjb25zdGV4cHIgdWludDY0X3Qga0ltYWdlQnVmZmVyVXNhZ2UgPQorICAgIEFIQVJEV0FSRUJVRkZFUl9VU0FHRV9DUFVfV1JJVEVfT0ZURU47CitzdGF0aWMgY29uc3RleHByIGludCBrSW1hZ2VXaWR0aCA9IDY0MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtJbWFnZUhlaWdodCA9IDQ4MDsKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtJbWFnZUZvcm1hdCA9IEFJTUFHRV9GT1JNQVRfUkdCQV84ODg4Oworc3RhdGljIGNvbnN0ZXhwciBpbnQga01heEltYWdlcyA9IDE7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50NjRfdCBrUXVldWVCdWZmZXJJbnB1dFRpbWVTdGFtcCA9IDEzODQ4ODg2MTE7CitzdGF0aWMgY29uc3RleHByIGJvb2wga1F1ZXVlQnVmZmVySW5wdXRJc0F1dG9UaW1lU3RhbXAgPSBmYWxzZTsKK3N0YXRpYyBjb25zdGV4cHIgYW5kcm9pZF9kYXRhc3BhY2Uga1F1ZXVlQnVmZmVySW5wdXREYXRhc3BhY2UgPSBIQUxfREFUQVNQQUNFX1VOS05PV047CitzdGF0aWMgY29uc3QgUmVjdCBrUXVldWVCdWZmZXJJbnB1dFJlY3QgPSBSZWN0KGtJbWFnZVdpZHRoLCBrSW1hZ2VIZWlnaHQpOworc3RhdGljIGNvbnN0ZXhwciBpbnQga1F1ZXVlQnVmZmVySW5wdXRTY2FsaW5nTW9kZSA9IDA7CitzdGF0aWMgY29uc3RleHByIGludCBrUXVldWVCdWZmZXJJbnB1dFRyYW5zZm9ybSA9IDA7CitzdGF0aWMgY29uc3Qgc3A8RmVuY2U+IGtRdWV1ZUJ1ZmZlcklucHV0RmVuY2UgPSBGZW5jZTo6Tk9fRkVOQ0U7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50IGtPbkltYWdlQXZhaWxhYmxlV2FpdFVzID0gMTAwICogMTAwMDsKKworY2xhc3MgQUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworICAgcHVibGljOgorICAgIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7CisgICAgICAgIEFJbWFnZVJlYWRlcl9uZXdXaXRoVXNhZ2Uoa0ltYWdlV2lkdGgsIGtJbWFnZUhlaWdodCwga0ltYWdlRm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtJbWFnZUJ1ZmZlclVzYWdlICwga01heEltYWdlcywgJmltYWdlUmVhZGVyXyk7CisgICAgICAgIG1lZGlhX3N0YXR1c190IHJldCA9IEFNRURJQV9FUlJPUl9VTktOT1dOOworICAgICAgICBBU1NFUlRfTkUoaW1hZ2VSZWFkZXJfLCBudWxscHRyKTsKKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX3NldEltYWdlTGlzdGVuZXIoaW1hZ2VSZWFkZXJfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VSZWFkZXJBdmFpbGFibGVDYl8pOworICAgICAgICBBU1NFUlRfRVEocmV0LCBBTUVESUFfT0spOworICAgICAgICByZXQgPSBBSW1hZ2VSZWFkZXJfc2V0QnVmZmVyUmVtb3ZlZExpc3RlbmVyKGltYWdlUmVhZGVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW1hZ2VSZWFkZXJEZXRhY2hlZENiXyk7CisgICAgICAgIEFTU0VSVF9FUShyZXQsIEFNRURJQV9PSyk7CisgICAgfQorICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChpbWFnZVJlYWRlcl8pIHsKKyAgICAgICAgICAgIEFJbWFnZVJlYWRlcl9kZWxldGUoaW1hZ2VSZWFkZXJfKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHZvaWQgSGFuZGxlSW1hZ2VBdmFpbGFibGUoKSB7CisgICAgICAgIEFJbWFnZSAqb3V0SW1hZ2UgPSBudWxscHRyOworICAgICAgICBtZWRpYV9zdGF0dXNfdCByZXQgPSBBTUVESUFfT0s7CisgICAgICAgIGF1dG8gaW1hZ2VEZWxldGVyID0gW10oQUltYWdlICppbWcpIHsgQUltYWdlX2RlbGV0ZShpbWcpOyB9OworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QUltYWdlLCBkZWNsdHlwZShpbWFnZURlbGV0ZXIpPiBpbWcobnVsbHB0ciwgaW1hZ2VEZWxldGVyKTsKKworICAgICAgICAvLyBUZXN0IHRoYXQgdGhlIGltYWdlIGNhbiBiZSBhY3F1aXJlZC4KKyAgICAgICAgcmV0ID0gQUltYWdlUmVhZGVyX2FjcXVpcmVOZXh0SW1hZ2UoaW1hZ2VSZWFkZXJfLCAmb3V0SW1hZ2UpOworICAgICAgICBBU1NFUlRfRVEocmV0LCBBTUVESUFfT0spOworICAgICAgICBpbWcucmVzZXQob3V0SW1hZ2UpOworICAgICAgICBBU1NFUlRfTkUoaW1nLCBudWxscHRyKTsKKworICAgICAgICAvLyBUZXN0IHRoYXQgd2UgY2FuIGdldCBhIGhhbmRsZSB0byB0aGUgaW1hZ2UncyBoYXJkd2FyZSBidWZmZXIgYW5kIGEKKyAgICAgICAgLy8gbmF0aXZlIGhhbmRsZSB0byBpdC4KKyAgICAgICAgQUhhcmR3YXJlQnVmZmVyICpoYXJkd2FyZUJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHJldCA9IEFJbWFnZV9nZXRIYXJkd2FyZUJ1ZmZlcihpbWcuZ2V0KCksICZoYXJkd2FyZUJ1ZmZlcik7CisgICAgICAgIEFTU0VSVF9FUShyZXQsIEFNRURJQV9PSyk7CisgICAgICAgIEFTU0VSVF9ORShoYXJkd2FyZUJ1ZmZlciwgbnVsbHB0cik7CisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqbmggPSBBSGFyZHdhcmVCdWZmZXJfZ2V0TmF0aXZlSGFuZGxlKGhhcmR3YXJlQnVmZmVyKTsKKyAgICAgICAgQVNTRVJUX05FKG5oLCBudWxscHRyKTsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKGltYWdlQXZhaWxhYmxlTXV0ZXhfKTsKKyAgICAgICAgaW1hZ2VBdmFpbGFibGVfID0gdHJ1ZTsKKyAgICAgICAgaW1hZ2VDb25kVmFyXy5ub3RpZnlfb25lKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgb25JbWFnZUF2YWlsYWJsZSh2b2lkICpjb250ZXh0LCBBSW1hZ2VSZWFkZXIgKnJlYWRlcikgeworICAgICAgICAodm9pZClyZWFkZXI7CisgICAgICAgIEFJbWFnZVJlYWRlcldpbmRvd0hhbmRsZVRlc3QgKnRoaXNDb250ZXh0ID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QUltYWdlUmVhZGVyV2luZG93SGFuZGxlVGVzdCAqPihjb250ZXh0KTsKKyAgICAgICAgdGhpc0NvbnRleHQtPkhhbmRsZUltYWdlQXZhaWxhYmxlKCk7CisgICAgfQorCisgICAgc3RhdGljIHZvaWQgb25CdWZmZXJSZW1vdmVkKHZvaWQgKiwgQUltYWdlUmVhZGVyICosIEFIYXJkd2FyZUJ1ZmZlciAqKSB7CisgICAgfQorCisgICAgQUltYWdlUmVhZGVyICppbWFnZVJlYWRlcl8gPSBudWxscHRyOworICAgIEFJbWFnZVJlYWRlcl9JbWFnZUxpc3RlbmVyIGltYWdlUmVhZGVyQXZhaWxhYmxlQ2Jfe3RoaXMsIG9uSW1hZ2VBdmFpbGFibGV9OworICAgIEFJbWFnZVJlYWRlcl9CdWZmZXJSZW1vdmVkTGlzdGVuZXIgaW1hZ2VSZWFkZXJEZXRhY2hlZENiX3t0aGlzLCBvbkJ1ZmZlclJlbW92ZWR9OworICAgIHN0ZDo6bXV0ZXggaW1hZ2VBdmFpbGFibGVNdXRleF87CisgICAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgaW1hZ2VDb25kVmFyXzsKKyAgICBib29sIGltYWdlQXZhaWxhYmxlXyA9IGZhbHNlOworfTsKKworc3RhdGljIHZvaWQgZmlsbFJHQkE4QnVmZmVyKHVpbnQ4X3QqIGJ1ZiwgaW50IHcsIGludCBoLCBpbnQgc3RyaWRlKSB7CisgICAgY29uc3Qgc2l6ZV90IFBJWEVMX1NJWkUgPSA0OworICAgIGZvciAoaW50IHggPSAwOyB4IDwgdzsgeCsrKSB7CisgICAgICAgIGZvciAoaW50IHkgPSAwOyB5IDwgaDsgeSsrKSB7CisgICAgICAgICAgICBvZmZfdCBvZmZzZXQgPSAoeSAqIHN0cmlkZSArIHgpICogUElYRUxfU0laRTsKKyAgICAgICAgICAgIGZvciAoaW50IGMgPSAwOyBjIDwgNDsgYysrKSB7CisgICAgICAgICAgICAgICAgaW50IHBhcml0eVggPSAoeCAvICgxIDw8IChjKzIpKSkgJiAxOworICAgICAgICAgICAgICAgIGludCBwYXJpdHlZID0gKHkgLyAoMSA8PCAoYysyKSkpICYgMTsKKyAgICAgICAgICAgICAgICBidWZbb2Zmc2V0ICsgY10gPSAocGFyaXR5WCBeIHBhcml0eVkpID8gMjMxIDogMzU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK1RFU1RfRihBSW1hZ2VSZWFkZXJXaW5kb3dIYW5kbGVUZXN0LCBDcmVhdGVXaW5kb3dOYXRpdmVIYW5kbGUpIHsKKyAgICAvLyBDaGVjayB0aGF0IHdlIGNhbiBjcmVhdGUgYSBuYXRpdmVfaGFuZGxlX3QgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgICAvLyBBSW1hZ2VSZWFkZXIuCisgICAgbmF0aXZlX2hhbmRsZV90ICpuaCA9IG51bGxwdHI7CisgICAgQUltYWdlUmVhZGVyX2dldFdpbmRvd05hdGl2ZUhhbmRsZShpbWFnZVJlYWRlcl8sICZuaCk7CisgICAgQVNTRVJUX05FKG5oLCBudWxscHRyKTsKKworICAgIC8vIENoZWNrIHRoYXQgdGhlcmUgYXJlIG9ubHkgaW50cyBpbiB0aGUgaGFuZGxlLgorICAgIEFTU0VSVF9FUShuaC0+bnVtRmRzLCAwKTsKKyAgICBBU1NFUlRfTkUobmgtPm51bUludHMsIDApOworCisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgSEdCUCBjYW4gYmUgcmV0cmlldmVkIGZyb20gdGhlIGhhbmRsZS4KKyAgICBzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBoZ2JwID0gIEFJbWFnZVJlYWRlcl9nZXRIR0JQRnJvbUhhbmRsZShuaCk7CisgICAgQVNTRVJUX05FKGhnYnAsIG51bGxwdHIpOworICAgIHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGlnYnAgPSBuZXcgSDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyKGhnYnApOworICAgIGludCBkZXF1ZXVlZFNsb3QgPSAtMTsKKyAgICBzcDxGZW5jZT4gZGVxdWV1ZWRGZW5jZTsKKyAgICBJR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpRdWV1ZUJ1ZmZlck91dHB1dCBvdXRwdXQ7CisgICAgQVNTRVJUX0VRKE9LLCBpZ2JwLT5jb25uZWN0KG51bGxwdHIsIE5BVElWRV9XSU5ET1dfQVBJX0NQVSwgZmFsc2UsICZvdXRwdXQpKTsKKworICAgIC8vIFRlc3QgdGhhdCB3ZSBjYW4gZGVxdWV1ZSBhIGJ1ZmZlci4KKyAgICBBU1NFUlRfRVEoT0ssCisgICAgICAgICAgICAgIH5JR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpCVUZGRVJfTkVFRFNfUkVBTExPQ0FUSU9OICYKKyAgICAgICAgICAgICAgICAgICAgICAoaWdicC0+ZGVxdWV1ZUJ1ZmZlcigmZGVxdWV1ZWRTbG90LCAmZGVxdWV1ZWRGZW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSW1hZ2VXaWR0aCwga0ltYWdlSGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtJbWFnZUZvcm1hdCwga0ltYWdlQnVmZmVyVXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgbnVsbHB0cikpKTsKKyAgICBFWFBFQ1RfTEUoMCwgZGVxdWV1ZWRTbG90KTsKKyAgICBFWFBFQ1RfR1QoQnVmZmVyUXVldWU6Ok5VTV9CVUZGRVJfU0xPVFMsIGRlcXVldWVkU2xvdCk7CisKKyAgICBzcDxHcmFwaGljQnVmZmVyPiBkZXF1ZXVlZEJ1ZmZlcjsKKyAgICBpZ2JwLT5yZXF1ZXN0QnVmZmVyKGRlcXVldWVkU2xvdCwgJmRlcXVldWVkQnVmZmVyKTsKKyAgICB1aW50OF90KiBpbWcgPSBudWxscHRyOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgZGVxdWV1ZWRCdWZmZXItPmxvY2soa0ltYWdlQnVmZmVyVXNhZ2UsICh2b2lkKiopKCZpbWcpKSk7CisKKyAgICAvLyBXcml0ZSBpbiBzb21lIGR1bW15IGltYWdlIGRhdGEuCisgICAgZmlsbFJHQkE4QnVmZmVyKGltZywgZGVxdWV1ZWRCdWZmZXItPmdldFdpZHRoKCksIGRlcXVldWVkQnVmZmVyLT5nZXRIZWlnaHQoKSwKKyAgICAgICAgICAgICAgICAgICAgZGVxdWV1ZWRCdWZmZXItPmdldFN0cmlkZSgpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIGRlcXVldWVkQnVmZmVyLT51bmxvY2soKSk7CisgICAgUXVldWVCdWZmZXJJbnB1dCBxdWV1ZUJ1ZmZlcklucHV0KGtRdWV1ZUJ1ZmZlcklucHV0VGltZVN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUXVldWVCdWZmZXJJbnB1dElzQXV0b1RpbWVTdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1F1ZXVlQnVmZmVySW5wdXREYXRhc3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtRdWV1ZUJ1ZmZlcklucHV0UmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1F1ZXVlQnVmZmVySW5wdXRTY2FsaW5nTW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1F1ZXVlQnVmZmVySW5wdXRUcmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtRdWV1ZUJ1ZmZlcklucHV0RmVuY2UpOworICAgIFF1ZXVlQnVmZmVyT3V0cHV0IHF1ZXVlQnVmZmVyT3V0cHV0OworICAgIEFTU0VSVF9FUShPSywgaWdicC0+cXVldWVCdWZmZXIoZGVxdWV1ZWRTbG90LCBxdWV1ZUJ1ZmZlcklucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnF1ZXVlQnVmZmVyT3V0cHV0KSk7CisgICAgLy8gd2FpdCB1bnRpbCB0aGUgb25JbWFnZUF2YWlsYWJsZSBjYWxsYmFjayBpcyBjYWxsZWQsIG9yIHRpbWVvdXQgY29tcGxldGVzLgorICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhpbWFnZUF2YWlsYWJsZU11dGV4Xyk7CisgICAgaW1hZ2VDb25kVmFyXy53YWl0X2Zvcihsb2NrLCBzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzKGtPbkltYWdlQXZhaWxhYmxlV2FpdFVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFt0aGlzXXsgcmV0dXJuIHRoaXMtPmltYWdlQXZhaWxhYmxlXzt9KTsKKyAgICBFWFBFQ1RfVFJVRShpbWFnZUF2YWlsYWJsZV8pIDw8ICAiVGltZWQgb3V0IHdhaXRpbmcgZm9yIGltYWdlIGRhdGEgdG8gYmUgaGFuZGxlZCFcbiI7Cit9CisKK2NsYXNzIEFJbWFnZVJlYWRlclByaXZhdGVGb3JtYXRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgIHB1YmxpYzoKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeworICAgICAgICBhdXRvIHN0YXR1cyA9IEFJbWFnZVJlYWRlcl9uZXcoa0ltYWdlV2lkdGgsIGtJbWFnZUhlaWdodCwgQUlNQUdFX0ZPUk1BVF9SQVdfREVQVEgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrTWF4SW1hZ2VzLCAmaW1nUmVhZGVyKTsKKyAgICAgICAgRVhQRUNUX1RSVUUoc3RhdHVzID09IEFNRURJQV9PSyk7CisgICAgfQorCisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKGltZ1JlYWRlcikgeworICAgICAgICAgICAgQUltYWdlUmVhZGVyX2RlbGV0ZShpbWdSZWFkZXIpOworICAgICAgICB9CisgICAgfQorICAgIEFJbWFnZVJlYWRlciAqaW1nUmVhZGVyID0gbnVsbHB0cjsKK307CisKK1RFU1RfRihBSW1hZ2VSZWFkZXJQcml2YXRlRm9ybWF0VGVzdCwgQ3JlYXRlVGVzdCkgeworICAgIEVYUEVDVF9UUlVFKGltZ1JlYWRlciAhPSBudWxscHRyKTsKK30KKworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrLy5jbGFuZy1mb3JtYXQgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvLmNsYW5nLWZvcm1hdApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjFlMzU1Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrLy5jbGFuZy1mb3JtYXQKQEAgLTAsMCArMSwxMyBAQAorQmFzZWRPblN0eWxlOiBHb29nbGUKK1N0YW5kYXJkOiBDcHAxMQorQWNjZXNzTW9kaWZpZXJPZmZzZXQ6IC0yCitBbGxvd1Nob3J0RnVuY3Rpb25zT25BU2luZ2xlTGluZTogSW5saW5lCitDb2x1bW5MaW1pdDogMTAwCitDb21tZW50UHJhZ21hczogTk9MSU5UOi4qCitEZXJpdmVQb2ludGVyQWxpZ25tZW50OiBmYWxzZQorSW5jbHVkZUJsb2NrczogUHJlc2VydmUKK0luZGVudFdpZHRoOiA0CitDb250aW51YXRpb25JbmRlbnRXaWR0aDogOAorUG9pbnRlckFsaWdubWVudDogUmlnaHQKK1RhYldpZHRoOiA0CitVc2VUYWI6IE5ldmVyCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvQW5kcm9pZC5icCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNDA4ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvQW5kcm9pZC5icApAQCAtMCwwICsxLDIxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworc3ViZGlycyA9IFsKKyAgICAic3JjIiwKKyAgICAidGVzdHMiLAorICAgICJNZWRpYUJlbmNobWFya1Rlc3QiLAorXQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9BbmRyb2lkLmJwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4MGQ5YTUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2FuZHJvaWRfdGVzdCB7CisgICAgbmFtZTogIk1lZGlhQmVuY2htYXJrVGVzdCIsCisKKyAgICBkZWZhdWx0czogWworICAgICAgICAiTWVkaWFCZW5jaG1hcmstZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICAvLyBJbmNsdWRlIGFsbCB0aGUgdGVzdCBjb2RlCisgICAgc3JjczogWyJzcmMvYW5kcm9pZFRlc3QvKiovKi5qYXZhIl0sCisKKyAgICByZXNvdXJjZV9kaXJzOiBbInJlcyJdLAorCisgICAgbGliczogWworICAgICAgICAiYW5kcm9pZC50ZXN0LnJ1bm5lciIsCisgICAgICAgICJhbmRyb2lkLnRlc3QuYmFzZSIsCisgICAgXSwKKworICAgIGpuaV9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19qbmkiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliTWVkaWFCZW5jaG1hcmsiLAorICAgICAgICAianVuaXQiLAorICAgICAgICAiYW5kcm9pZHgudGVzdC5ydW5uZXIiLAorICAgIF0sCit9CisKK2FuZHJvaWRfbGlicmFyeSB7CisgICAgbmFtZTogImxpYk1lZGlhQmVuY2htYXJrIiwKKworICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJNZWRpYUJlbmNobWFyay1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIC8vIEluY2x1ZGUgYWxsIHRoZSBsaWJyYXJpZXMKKyAgICBzcmNzOiBbInNyYy9tYWluLyoqLyouamF2YSJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImFuZHJvaWR4LnRlc3QuY29yZSIsCisgICAgXSwKK30KKworamF2YV9kZWZhdWx0cyB7CisgICAgbmFtZTogIk1lZGlhQmVuY2htYXJrLWRlZmF1bHRzIiwKKworICAgIHNka192ZXJzaW9uOiAic3lzdGVtX2N1cnJlbnQiLAorICAgIG1pbl9zZGtfdmVyc2lvbjogIjI4IiwKKyAgICB0YXJnZXRfc2RrX3ZlcnNpb246ICIyOSIsCit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L0FuZHJvaWRNYW5pZmVzdC54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhOTkxNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3QvQW5kcm9pZE1hbmlmZXN0LnhtbApAQCAtMCwwICsxLDM0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgorPCEtLQorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKKyAgICB4bWxuczp0b29scz0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vdG9vbHMiCisgICAgcGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrIj4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLlJFQURfRVhURVJOQUxfU1RPUkFHRSIgLz4KKyAgICA8dXNlcy1wZXJtaXNzaW9uIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC5wZXJtaXNzaW9uLldSSVRFX0VYVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5SRUFEX0lOVEVSTkFMX1NUT1JBR0UiIC8+CisgICAgPHVzZXMtcGVybWlzc2lvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9JTlRFUk5BTF9TVE9SQUdFIiAvPgorCisgICAgPGFwcGxpY2F0aW9uCisgICAgICAgIHRvb2xzOmlnbm9yZT0iQWxsb3dCYWNrdXAsR29vZ2xlQXBwSW5kZXhpbmdXYXJuaW5nLE1pc3NpbmdBcHBsaWNhdGlvbkljb24iCisgICAgICAgIHRvb2xzOnJlbW92ZT0iYW5kcm9pZDphcHBDb21wb25lbnRGYWN0b3J5Ij4KKyAgICA8L2FwcGxpY2F0aW9uPgorCisgICAgPGluc3RydW1lbnRhdGlvbiBhbmRyb2lkOm5hbWU9ImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICAgICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrIgorICAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQmVuY2htYXJrIE1lZGlhIFRlc3QiLz4KKzwvbWFuaWZlc3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9BbmRyb2lkVGVzdC54bWwgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L0FuZHJvaWRUZXN0LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODkwNjYxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9BbmRyb2lkVGVzdC54bWwKQEAgLTAsMCArMSwzNCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxjb25maWd1cmF0aW9uIGRlc2NyaXB0aW9uPSJSdW5zIE1lZGlhIEJlbmNobWFyayBUZXN0cyI+CisgICAgPHRhcmdldF9wcmVwYXJlciBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGFyZ2V0cHJlcC5QdXNoRmlsZVByZXBhcmVyIj4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJjbGVhbnVwIiB2YWx1ZT0idHJ1ZSIgLz4KKyAgICAgICAgPG9wdGlvbiBuYW1lPSJwdXNoLWZpbGUiCisgICAgICAgICAgICBrZXk9Imh0dHBzOi8vc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hbmRyb2lkX21lZGlhL2ZyYW1ld29ya3MvYXYvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrLnppcD91bnppcD10cnVlIgorICAgICAgICAgICAgdmFsdWU9Ii9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorICAgIDx0YXJnZXRfcHJlcGFyZXIgY2xhc3M9ImNvbS5hbmRyb2lkLnRyYWRlZmVkLnRhcmdldHByZXAuVGVzdEFwcEluc3RhbGxTZXR1cCI+CisgICAgICAgIDxvcHRpb24gbmFtZT0iY2xlYW51cC1hcGtzIiB2YWx1ZT0iZmFsc2UiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0idGVzdC1maWxlLW5hbWUiIHZhbHVlPSJNZWRpYUJlbmNobWFya1Rlc3QuYXBrIiAvPgorICAgIDwvdGFyZ2V0X3ByZXBhcmVyPgorCisgICAgPG9wdGlvbiBuYW1lPSJ0ZXN0LXRhZyIgdmFsdWU9Ik1lZGlhQmVuY2htYXJrVGVzdCIgLz4KKyAgICA8dGVzdCBjbGFzcz0iY29tLmFuZHJvaWQudHJhZGVmZWQudGVzdHR5cGUuQW5kcm9pZEpVbml0VGVzdCIgPgorICAgICAgICA8b3B0aW9uIG5hbWU9InBhY2thZ2UiIHZhbHVlPSJjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsiIC8+CisgICAgICAgIDxvcHRpb24gbmFtZT0icnVubmVyIiB2YWx1ZT0iYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyIiAvPgorICAgICAgICA8b3B0aW9uIG5hbWU9ImhpZGRlbi1hcGktY2hlY2tzIiB2YWx1ZT0iZmFsc2UiLz4KKyAgICA8L3Rlc3Q+Cis8L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L2J1aWxkLmdyYWRsZSBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3QvYnVpbGQuZ3JhZGxlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyYWVlMWEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L2J1aWxkLmdyYWRsZQpAQCAtMCwwICsxLDc2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworYnVpbGRzY3JpcHQgeworICAgIHJlcG9zaXRvcmllcyB7CisgICAgICAgIGdvb2dsZSgpCisgICAgICAgIGpjZW50ZXIoKQorICAgIH0KKyAgICBkZXBlbmRlbmNpZXMgeworICAgICAgICBjbGFzc3BhdGggJ2NvbS5hbmRyb2lkLnRvb2xzLmJ1aWxkOmdyYWRsZTozLjUuMCcKKyAgICB9Cit9CisKK2FwcGx5IHBsdWdpbjogJ2NvbS5hbmRyb2lkLmFwcGxpY2F0aW9uJworCithbmRyb2lkIHsKKyAgICBjb21waWxlU2RrVmVyc2lvbiAyOQorICAgIGRlZmF1bHRDb25maWcgeworICAgICAgICBhcHBsaWNhdGlvbklkICJjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsiCisgICAgICAgIG1pblNka1ZlcnNpb24gMjgKKyAgICAgICAgdGFyZ2V0U2RrVmVyc2lvbiAyOQorICAgICAgICB2ZXJzaW9uQ29kZSAxCisgICAgICAgIHZlcnNpb25OYW1lICIxLjAiCisgICAgICAgIHRlc3RJbnN0cnVtZW50YXRpb25SdW5uZXIgImFuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lciIKKyAgICB9CisgICAgc291cmNlU2V0cyB7CisgICAgICAgIG1haW4geworICAgICAgICAgICAgamF2YS5zcmNEaXJzICdzcmMvbWFpbi9qYXZhJworICAgICAgICAgICAgcmVzLnNyY0RpcnMgJ3JlcycKKyAgICAgICAgICAgIG1hbmlmZXN0LnNyY0ZpbGUgJ0FuZHJvaWRNYW5pZmVzdC54bWwnCisgICAgICAgIH0KKyAgICAgICAgYW5kcm9pZFRlc3QgeworICAgICAgICAgICAgamF2YS5zcmNEaXJzICAnc3JjL2FuZHJvaWRUZXN0L2phdmEnCisgICAgICAgICAgICByZXMuc3JjRGlycyAncmVzJworICAgICAgICAgICAgbWFuaWZlc3Quc3JjRmlsZSAnQW5kcm9pZE1hbmlmZXN0LnhtbCcKKyAgICAgICAgfQorICAgIH0KKyAgICBidWlsZFR5cGVzIHsKKyAgICAgICAgcmVsZWFzZSB7CisgICAgICAgICAgICBtaW5pZnlFbmFibGVkIGZhbHNlCisgICAgICAgICAgICBwcm9ndWFyZEZpbGVzIGdldERlZmF1bHRQcm9ndWFyZEZpbGUoJ3Byb2d1YXJkLWFuZHJvaWQudHh0JyksICdwcm9ndWFyZC1ydWxlcy5wcm8nCisgICAgICAgIH0KKyAgICB9CisgICAgZXh0ZXJuYWxOYXRpdmVCdWlsZCB7CisgICAgICAgIGNtYWtlIHsKKyAgICAgICAgICAgIHBhdGggInNyYy9tYWluL2NwcC9DTWFrZUxpc3RzLnR4dCIKKyAgICAgICAgICAgIHZlcnNpb24gIjMuMTAuMiIKKyAgICAgICAgfQorICAgIH0KK30KKworcmVwb3NpdG9yaWVzIHsKKyAgICBnb29nbGUoKQorICAgIGpjZW50ZXIoKQorfQorCitkZXBlbmRlbmNpZXMgeworICAgIGltcGxlbWVudGF0aW9uIGZpbGVUcmVlKGRpcjogJ2xpYnMnLCBpbmNsdWRlOiBbJyouamFyJ10pCisgICAgaW1wbGVtZW50YXRpb24gJ2FuZHJvaWR4LmFwcGNvbXBhdDphcHBjb21wYXQ6MS4xLjAnCisgICAgdGVzdEltcGxlbWVudGF0aW9uICdqdW5pdDpqdW5pdDo0LjEyJworICAgIGFuZHJvaWRUZXN0SW1wbGVtZW50YXRpb24gJ2FuZHJvaWR4LnRlc3Q6cnVubmVyOjEuMi4wJworICAgIGFuZHJvaWRUZXN0SW1wbGVtZW50YXRpb24gJ2FuZHJvaWR4LnRlc3QuZXh0Omp1bml0OjEuMS4xJworfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3QvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3QvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGRiY2NjCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCkBAIC0wLDAgKzEsNCBAQAorPHJlc291cmNlcz4KKyAgICA8c3RyaW5nIG5hbWU9ImlucHV0X2ZpbGVfcGF0aCI+L2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy88L3N0cmluZz4KKyAgICA8c3RyaW5nIG5hbWU9Im91dHB1dF9maWxlX3BhdGgiPi9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9vdXRwdXQvPC9zdHJpbmc+Cis8L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL2FuZHJvaWRUZXN0L2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL3Rlc3RzL0RlY29kZXJUZXN0LmphdmEgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9hbmRyb2lkVGVzdC9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay90ZXN0cy9EZWNvZGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmZDcwYTMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9hbmRyb2lkVGVzdC9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay90ZXN0cy9EZWNvZGVyVGVzdC5qYXZhCkBAIC0wLDAgKzEsMjIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsudGVzdHM7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgYW5kcm9pZHgudGVzdC5wbGF0Zm9ybS5hcHAuSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnk7CisKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsuUjsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsubGlicmFyeS5Db2RlY1V0aWxzOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay5saWJyYXJ5LkRlY29kZXI7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLmxpYnJhcnkuRXh0cmFjdG9yOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay5saWJyYXJ5Lk5hdGl2ZTsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsubGlicmFyeS5TdGF0czsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CitpbXBvcnQgamF2YS5uaW8uZmlsZS5GaWxlczsKK2ltcG9ydCBqYXZhLm5pby5maWxlLlBhdGhzOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CitpbXBvcnQgamF2YS51dGlsLkFycmF5czsKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOworCitAUnVuV2l0aChQYXJhbWV0ZXJpemVkLmNsYXNzKQorcHVibGljIGNsYXNzIERlY29kZXJUZXN0IHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBDb250ZXh0IG1Db250ZXh0ID0KKyAgICAgICAgICAgIEluc3RydW1lbnRhdGlvblJlZ2lzdHJ5LmdldEluc3RydW1lbnRhdGlvbigpLmdldFRhcmdldENvbnRleHQoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbUlucHV0RmlsZVBhdGggPSBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcuaW5wdXRfZmlsZV9wYXRoKTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbU91dHB1dEZpbGVQYXRoID0gbUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLm91dHB1dF9maWxlX3BhdGgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtU3RhdHNGaWxlID0KKyAgICAgICAgICAgIG1Db250ZXh0LmdldEV4dGVybmFsRmlsZXNEaXIobnVsbCkgKyAiL0RlY29kZXIuIiArIFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpICsgIi5jc3YiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRGVjb2RlclRlc3QiOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgUEVSX1RFU1RfVElNRU9VVF9NUyA9IDYwMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFdSSVRFX09VVFBVVCA9IGZhbHNlOworICAgIHByaXZhdGUgU3RyaW5nIG1JbnB1dEZpbGU7CisgICAgcHJpdmF0ZSBib29sZWFuIG1Bc3luY01vZGU7CisKKyAgICBwdWJsaWMgRGVjb2RlclRlc3QoU3RyaW5nIGlucHV0RmlsZSwgYm9vbGVhbiBhc3luY01vZGUpIHsKKyAgICAgICAgdGhpcy5tSW5wdXRGaWxlID0gaW5wdXRGaWxlOworICAgICAgICB0aGlzLm1Bc3luY01vZGUgPSBhc3luY01vZGU7CisgICAgfQorCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gaW5wdXQoKSB7CisgICAgICAgIHJldHVybiBBcnJheXMuYXNMaXN0KG5ldyBPYmplY3RbXVtdeworICAgICAgICAgICAgICAgIC8vQXVkaW8gU3luYyBUZXN0CisgICAgICAgICAgICAgICAgeyJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19hYWNfMzBzZWMubXA0IiwgZmFsc2V9LAorICAgICAgICAgICAgICAgIHsiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjLm1wMyIsIGZhbHNlfSwKKyAgICAgICAgICAgICAgICB7ImJiYl84MDAwaHpfMWNoXzhrYnBzX2Ftcm5iXzMwc2VjLjNncCIsIGZhbHNlfSwKKyAgICAgICAgICAgICAgICB7ImJiYl8xNjAwMGh6XzFjaF85a2Jwc19hbXJ3Yl8zMHNlYy4zZ3AiLCBmYWxzZX0sCisgICAgICAgICAgICAgICAgeyJiYmJfNDQxMDBoel8yY2hfODBrYnBzX3ZvcmJpc18zMHNlYy53ZWJtIiwgZmFsc2V9LAorICAgICAgICAgICAgICAgIHsiYmJiXzQ0MTAwaHpfMmNoXzYwMGticHNfZmxhY18zMHNlYy5tcDQiLCBmYWxzZX0sCisgICAgICAgICAgICAgICAgeyJiYmJfNDgwMDBoel8yY2hfMTAwa2Jwc19vcHVzXzMwc2VjLndlYm0iLCBmYWxzZX0sCisgICAgICAgICAgICAgICAgLy8gQXVkaW8gQXN5bmMgVGVzdAorICAgICAgICAgICAgICAgIHsiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfYWFjXzMwc2VjLm1wNCIsIHRydWV9LAorICAgICAgICAgICAgICAgIHsiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzMwc2VjLm1wMyIsIHRydWV9LAorICAgICAgICAgICAgICAgIHsiYmJiXzgwMDBoel8xY2hfOGticHNfYW1ybmJfMzBzZWMuM2dwIiwgdHJ1ZX0sCisgICAgICAgICAgICAgICAgeyJiYmJfMTYwMDBoel8xY2hfOWticHNfYW1yd2JfMzBzZWMuM2dwIiwgdHJ1ZX0sCisgICAgICAgICAgICAgICAgeyJiYmJfNDQxMDBoel8yY2hfODBrYnBzX3ZvcmJpc18zMHNlYy53ZWJtIiwgdHJ1ZX0sCisgICAgICAgICAgICAgICAgeyJiYmJfNDQxMDBoel8yY2hfNjAwa2Jwc19mbGFjXzMwc2VjLm1wNCIsIHRydWV9LAorICAgICAgICAgICAgICAgIHsiYmJiXzQ4MDAwaHpfMmNoXzEwMGticHNfb3B1c18zMHNlYy53ZWJtIiwgdHJ1ZX0sCisgICAgICAgICAgICAgICAgLy8gVmlkZW8gU3luYyBUZXN0CisgICAgICAgICAgICAgICAgeyJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfdnA5LndlYm0iLCBmYWxzZX0sCisgICAgICAgICAgICAgICAgeyJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfdnA4LndlYm0iLCBmYWxzZX0sCisgICAgICAgICAgICAgICAgeyJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfYXYxLndlYm0iLCBmYWxzZX0sCisgICAgICAgICAgICAgICAgeyJjcm93ZF8xOTIweDEwODBfMjVmcHNfNzMwMGticHNfbXBlZzIubXA0IiwgZmFsc2V9LAorICAgICAgICAgICAgICAgIHsiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzYwMDBrYnBzX21wZWc0Lm1wNCIsIGZhbHNlfSwKKyAgICAgICAgICAgICAgICB7ImNyb3dkXzM1MngyODhfMjVmcHNfNjAwMGticHNfaDI2My4zZ3AiLCBmYWxzZX0sCisgICAgICAgICAgICAgICAgeyJjcm93ZF8xOTIweDEwODBfMjVmcHNfNjcwMGticHNfaDI2NC50cyIsIGZhbHNlfSwKKyAgICAgICAgICAgICAgICB7ImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc19oMjY1Lm1rdiIsIGZhbHNlfSwKKyAgICAgICAgICAgICAgICAvLyBWaWRlbyBBc3luYyBUZXN0CisgICAgICAgICAgICAgICAgeyJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfdnA5LndlYm0iLCB0cnVlfSwKKyAgICAgICAgICAgICAgICB7ImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc192cDgud2VibSIsIHRydWV9LAorICAgICAgICAgICAgICAgIHsiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2F2MS53ZWJtIiwgdHJ1ZX0sCisgICAgICAgICAgICAgICAgeyJjcm93ZF8xOTIweDEwODBfMjVmcHNfNzMwMGticHNfbXBlZzIubXA0IiwgdHJ1ZX0sCisgICAgICAgICAgICAgICAgeyJjcm93ZF8xOTIweDEwODBfMjVmcHNfNjAwMGticHNfbXBlZzQubXA0IiwgdHJ1ZX0sCisgICAgICAgICAgICAgICAgeyJjcm93ZF8zNTJ4Mjg4XzI1ZnBzXzYwMDBrYnBzX2gyNjMuM2dwIiwgdHJ1ZX0sCisgICAgICAgICAgICAgICAgeyJjcm93ZF8xOTIweDEwODBfMjVmcHNfNjcwMGticHNfaDI2NC50cyIsIHRydWV9LAorICAgICAgICAgICAgICAgIHsiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2gyNjUubWt2IiwgdHJ1ZX19KTsKKyAgICB9CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVTdGF0c0hlYWRlclRvRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0YXRzIG1TdGF0cyA9IG5ldyBTdGF0cygpOworICAgICAgICBib29sZWFuIHN0YXR1cyA9IG1TdGF0cy53cml0ZVN0YXRzSGVhZGVyKG1TdGF0c0ZpbGUpOworICAgICAgICBhc3NlcnRUcnVlKCJVbmFibGUgdG8gb3BlbiBzdGF0cyBmaWxlIGZvciB3cml0aW5nISIsIHN0YXR1cyk7CisgICAgICAgIExvZy5kKFRBRywgIlNhdmluZyBCZW5jaG1hcmsgcmVzdWx0cyBpbjogIiArIG1TdGF0c0ZpbGUpOworICAgIH0KKworICAgIEBUZXN0KHRpbWVvdXQgPSBQRVJfVEVTVF9USU1FT1VUX01TKQorICAgIHB1YmxpYyB2b2lkIHRlc3REZWNvZGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBpbnB1dEZpbGUgPSBuZXcgRmlsZShtSW5wdXRGaWxlUGF0aCArIG1JbnB1dEZpbGUpOworICAgICAgICBhc3NlcnRUcnVlKCJDYW5ub3QgZmluZCAiICsgbUlucHV0RmlsZSArICIgaW4gZGlyZWN0b3J5ICIgKyBtSW5wdXRGaWxlUGF0aCwKKyAgICAgICAgICAgICAgICBpbnB1dEZpbGUuZXhpc3RzKCkpOworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlsZUlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShpbnB1dEZpbGUpOworICAgICAgICBGaWxlRGVzY3JpcHRvciBmaWxlRGVzY3JpcHRvciA9IGZpbGVJbnB1dC5nZXRGRCgpOworICAgICAgICBFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IEV4dHJhY3RvcigpOworICAgICAgICBpbnQgdHJhY2tDb3VudCA9IGV4dHJhY3Rvci5zZXRVcEV4dHJhY3RvcihmaWxlRGVzY3JpcHRvcik7CisgICAgICAgIGFzc2VydFRydWUoIkV4dHJhY3Rpb24gZmFpbGVkLiBObyB0cmFja3MgZm9yIGZpbGU6ICIgKyBtSW5wdXRGaWxlLCAodHJhY2tDb3VudCA+IDApKTsKKyAgICAgICAgQXJyYXlMaXN0PEJ5dGVCdWZmZXI+IGlucHV0QnVmZmVyID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIEFycmF5TGlzdDxNZWRpYUNvZGVjLkJ1ZmZlckluZm8+IGZyYW1lSW5mbyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKGludCBjdXJyZW50VHJhY2sgPSAwOyBjdXJyZW50VHJhY2sgPCB0cmFja0NvdW50OyBjdXJyZW50VHJhY2srKykgeworICAgICAgICAgICAgZXh0cmFjdG9yLnNlbGVjdEV4dHJhY3RvclRyYWNrKGN1cnJlbnRUcmFjayk7CisgICAgICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSBleHRyYWN0b3IuZ2V0Rm9ybWF0KGN1cnJlbnRUcmFjayk7CisgICAgICAgICAgICBTdHJpbmcgbWltZSA9IGZvcm1hdC5nZXRTdHJpbmcoTWVkaWFGb3JtYXQuS0VZX01JTUUpOworICAgICAgICAgICAgQXJyYXlMaXN0PFN0cmluZz4gbWVkaWFDb2RlY3MgPSBDb2RlY1V0aWxzLnNlbGVjdENvZGVjcyhtaW1lLCBmYWxzZSk7CisgICAgICAgICAgICBhc3NlcnRUcnVlKCJObyBzdWl0YWJsZSBjb2RlY3MgZm91bmQgZm9yIGZpbGU6ICIgKyBtSW5wdXRGaWxlICsgIiB0cmFjayA6ICIgKworICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHJhY2sgKyAiIG1pbWU6ICIgKyBtaW1lLCAobWVkaWFDb2RlY3Muc2l6ZSgpID4gMCkpOworCisgICAgICAgICAgICAvLyBHZXQgc2FtcGxlcyBmcm9tIGV4dHJhY3RvcgorICAgICAgICAgICAgaW50IHNhbXBsZVNpemU7CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgc2FtcGxlU2l6ZSA9IGV4dHJhY3Rvci5nZXRGcmFtZVNhbXBsZSgpOworICAgICAgICAgICAgICAgIE1lZGlhQ29kZWMuQnVmZmVySW5mbyBidWZJbmZvID0gbmV3IE1lZGlhQ29kZWMuQnVmZmVySW5mbygpOworICAgICAgICAgICAgICAgIE1lZGlhQ29kZWMuQnVmZmVySW5mbyBpbmZvID0gZXh0cmFjdG9yLmdldEJ1ZmZlckluZm8oKTsKKyAgICAgICAgICAgICAgICBCeXRlQnVmZmVyIGRhdGFCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGluZm8uc2l6ZSk7CisgICAgICAgICAgICAgICAgZGF0YUJ1ZmZlci5wdXQoZXh0cmFjdG9yLmdldEZyYW1lQnVmZmVyKCkuYXJyYXkoKSwgMCwgaW5mby5zaXplKTsKKyAgICAgICAgICAgICAgICBidWZJbmZvLnNldChpbmZvLm9mZnNldCwgaW5mby5zaXplLCBpbmZvLnByZXNlbnRhdGlvblRpbWVVcywgaW5mby5mbGFncyk7CisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIuYWRkKGRhdGFCdWZmZXIpOworICAgICAgICAgICAgICAgIGZyYW1lSW5mby5hZGQoYnVmSW5mbyk7CisgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIkV4dHJhY3RlZCBidWZJbmZvOiBmbGFnID0gIiArIGJ1ZkluZm8uZmxhZ3MgKyAiIHRpbWVzdGFtcCA9ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZkluZm8ucHJlc2VudGF0aW9uVGltZVVzICsgIiBzaXplID0gIiArIGJ1ZkluZm8uc2l6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSB3aGlsZSAoc2FtcGxlU2l6ZSA+IDApOworICAgICAgICAgICAgZm9yIChTdHJpbmcgY29kZWNOYW1lIDogbWVkaWFDb2RlY3MpIHsKKyAgICAgICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGRlY29kZU91dHB1dFN0cmVhbSA9IG51bGw7CisgICAgICAgICAgICAgICAgaWYgKFdSSVRFX09VVFBVVCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIVBhdGhzLmdldChtT3V0cHV0RmlsZVBhdGgpLnRvRmlsZSgpLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBGaWxlcy5jcmVhdGVEaXJlY3RvcmllcyhQYXRocy5nZXQobU91dHB1dEZpbGVQYXRoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgRmlsZSBvdXRGaWxlID0gbmV3IEZpbGUobU91dHB1dEZpbGVQYXRoICsgImRlY29kZXIub3V0Iik7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdXRGaWxlLmV4aXN0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCIgVW5hYmxlIHRvIGRlbGV0ZSBleGlzdGluZyBmaWxlIiArIG91dEZpbGUudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RmlsZS5kZWxldGUoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5hYmxlIHRvIGNyZWF0ZSBmaWxlOiAiICsgb3V0RmlsZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dEZpbGUuY3JlYXRlTmV3RmlsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZGVjb2RlT3V0cHV0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0RmlsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIERlY29kZXIgZGVjb2RlciA9IG5ldyBEZWNvZGVyKCk7CisgICAgICAgICAgICAgICAgZGVjb2Rlci5zZXR1cERlY29kZXIoZGVjb2RlT3V0cHV0U3RyZWFtKTsKKyAgICAgICAgICAgICAgICBpbnQgc3RhdHVzID0gZGVjb2Rlci5kZWNvZGUoaW5wdXRCdWZmZXIsIGZyYW1lSW5mbywgbUFzeW5jTW9kZSwgZm9ybWF0LCBjb2RlY05hbWUpOworICAgICAgICAgICAgICAgIGRlY29kZXIuZGVJbml0Q29kZWMoKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkRlY29kZXIgcmV0dXJuZWQgZXJyb3IgIiArIHN0YXR1cyArICIgZm9yIGZpbGU6ICIgKyBtSW5wdXRGaWxlICsKKyAgICAgICAgICAgICAgICAgICAgICAgICIgd2l0aCBjb2RlYzogIiArIGNvZGVjTmFtZSwgMCwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLmR1bXBTdGF0aXN0aWNzKG1JbnB1dEZpbGUsIGNvZGVjTmFtZSwgKG1Bc3luY01vZGUgPyAiYXN5bmMiIDogInN5bmMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3Rvci5nZXRDbGlwRHVyYXRpb24oKSwgbVN0YXRzRmlsZSk7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRGVjb2RpbmcgU3VjY2Vzc2Z1bCBmb3IgZmlsZTogIiArIG1JbnB1dEZpbGUgKyAiIHdpdGggY29kZWM6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgY29kZWNOYW1lKTsKKyAgICAgICAgICAgICAgICBkZWNvZGVyLnJlc2V0RGVjb2RlcigpOworICAgICAgICAgICAgICAgIGlmIChkZWNvZGVPdXRwdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBkZWNvZGVPdXRwdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBleHRyYWN0b3IudW5zZWxlY3RFeHRyYWN0b3JUcmFjayhjdXJyZW50VHJhY2spOworICAgICAgICAgICAgaW5wdXRCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgICAgIGZyYW1lSW5mby5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGV4dHJhY3Rvci5kZWluaXRFeHRyYWN0b3IoKTsKKyAgICAgICAgZmlsZUlucHV0LmNsb3NlKCk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0TmF0aXZlRGVjb2RlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgaW5wdXRGaWxlID0gbmV3IEZpbGUobUlucHV0RmlsZVBhdGggKyBtSW5wdXRGaWxlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2Fubm90IGZpbmQgIiArIG1JbnB1dEZpbGUgKyAiIGluIGRpcmVjdG9yeSAiICsgbUlucHV0RmlsZVBhdGgsCisgICAgICAgICAgICAgICAgaW5wdXRGaWxlLmV4aXN0cygpKTsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpbGVJbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5wdXRGaWxlKTsKKyAgICAgICAgRmlsZURlc2NyaXB0b3IgZmlsZURlc2NyaXB0b3IgPSBmaWxlSW5wdXQuZ2V0RkQoKTsKKyAgICAgICAgRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBFeHRyYWN0b3IoKTsKKyAgICAgICAgaW50IHRyYWNrQ291bnQgPSBleHRyYWN0b3Iuc2V0VXBFeHRyYWN0b3IoZmlsZURlc2NyaXB0b3IpOworICAgICAgICBhc3NlcnRUcnVlKCJFeHRyYWN0aW9uIGZhaWxlZC4gTm8gdHJhY2tzIGZvciBmaWxlOiAiLCB0cmFja0NvdW50ID4gMCk7CisgICAgICAgIGZvciAoaW50IGN1cnJlbnRUcmFjayA9IDA7IGN1cnJlbnRUcmFjayA8IHRyYWNrQ291bnQ7IGN1cnJlbnRUcmFjaysrKSB7CisgICAgICAgICAgICBleHRyYWN0b3Iuc2VsZWN0RXh0cmFjdG9yVHJhY2soY3VycmVudFRyYWNrKTsKKyAgICAgICAgICAgIE1lZGlhRm9ybWF0IGZvcm1hdCA9IGV4dHJhY3Rvci5nZXRGb3JtYXQoY3VycmVudFRyYWNrKTsKKyAgICAgICAgICAgIFN0cmluZyBtaW1lID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSk7CisgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBtZWRpYUNvZGVjcyA9IENvZGVjVXRpbHMuc2VsZWN0Q29kZWNzKG1pbWUsIGZhbHNlKTsKKyAgICAgICAgICAgIGZvciAoU3RyaW5nIGNvZGVjTmFtZSA6IG1lZGlhQ29kZWNzKSB7CisgICAgICAgICAgICAgICAgTG9nLmkoIlRlc3Q6ICVzXG4iLCBtSW5wdXRGaWxlKTsKKyAgICAgICAgICAgICAgICBOYXRpdmUgbmF0aXZlRGVjb2RlciA9IG5ldyBOYXRpdmUoKTsKKyAgICAgICAgICAgICAgICBpbnQgc3RhdHVzID0gbmF0aXZlRGVjb2Rlci5EZWNvZGUoCisgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGaWxlUGF0aCwgbUlucHV0RmlsZSwgbVN0YXRzRmlsZSwgY29kZWNOYW1lLCBtQXN5bmNNb2RlKTsKKyAgICAgICAgICAgICAgICBhc3NlcnRFcXVhbHMoIkRlY29kZXIgcmV0dXJuZWQgZXJyb3IgIiArIHN0YXR1cyArICIgZm9yIGZpbGU6ICIgKyBtSW5wdXRGaWxlLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmaWxlSW5wdXQuY2xvc2UoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9hbmRyb2lkVGVzdC9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay90ZXN0cy9FbmNvZGVyVGVzdC5qYXZhIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvYW5kcm9pZFRlc3QvamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvdGVzdHMvRW5jb2RlclRlc3QuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OGUxNDIyCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvYW5kcm9pZFRlc3QvamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvdGVzdHMvRW5jb2RlclRlc3QuamF2YQpAQCAtMCwwICsxLDMwOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLnRlc3RzOworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7CisKK2ltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjSW5mby5Db2RlY0NhcGFiaWxpdGllcy5DT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnBsYXRmb3JtLmFwcC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay5SOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay5saWJyYXJ5LkNvZGVjVXRpbHM7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLmxpYnJhcnkuRGVjb2RlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsubGlicmFyeS5FbmNvZGVyOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay5saWJyYXJ5LkV4dHJhY3RvcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsubGlicmFyeS5OYXRpdmU7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLmxpYnJhcnkuU3RhdHM7CisKK2ltcG9ydCBvcmcuanVuaXQuQmVmb3JlQ2xhc3M7CitpbXBvcnQgb3JnLmp1bml0LlRlc3Q7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lci5SdW5XaXRoOworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXJzLlBhcmFtZXRlcml6ZWQ7CisKK2ltcG9ydCBqYXZhLmlvLkZpbGU7CitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLkZpbGVJbnB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVPdXRwdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworCitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOworaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CisKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgRW5jb2RlclRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIENvbnRleHQgbUNvbnRleHQgPQorICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtSW5wdXRGaWxlUGF0aCA9IG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5pbnB1dF9maWxlX3BhdGgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtT3V0cHV0RmlsZVBhdGggPSBtQ29udGV4dC5nZXRTdHJpbmcoUi5zdHJpbmcub3V0cHV0X2ZpbGVfcGF0aCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1TdGF0c0ZpbGUgPQorICAgICAgICAgICAgbUNvbnRleHQuZ2V0RXh0ZXJuYWxGaWxlc0RpcihudWxsKSArICIvRW5jb2Rlci4iICsgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCkgKyAiLmNzdiI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJFbmNvZGVyVGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBQRVJfVEVTVF9USU1FT1VUX01TID0gMTIwMDAwOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIFdSSVRFX09VVFBVVCA9IGZhbHNlOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkNPREVfREVGQVVMVF9GUkFNRV9SQVRFID0gMjU7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOQ09ERV9ERUZBVUxUX0JJVF9SQVRFID0gODAwMDAwMCAvKiA4IE1icHMgKi87CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOQ09ERV9NSU5fQklUX1JBVEUgPSA2MDAwMDAgLyogNjAwIEticHMgKi87CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOQ09ERV9ERUZBVUxUX0FVRElPX0JJVF9SQVRFID0gMTI4MDAwIC8qIDEyOCBLYnBzICovOworICAgIHByaXZhdGUgU3RyaW5nIG1JbnB1dEZpbGU7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPE9iamVjdFtdPiBpbnB1dEZpbGVzKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXXsKKyAgICAgICAgICAgICAgICAvLyBBdWRpbyBUZXN0CisgICAgICAgICAgICAgICAgeyJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19hYWNfMzBzZWMubXA0In0sCisgICAgICAgICAgICAgICAgeyJiYmJfODAwMGh6XzFjaF84a2Jwc19hbXJuYl8zMHNlYy4zZ3AifSwKKyAgICAgICAgICAgICAgICB7ImJiYl8xNjAwMGh6XzFjaF85a2Jwc19hbXJ3Yl8zMHNlYy4zZ3AifSwKKyAgICAgICAgICAgICAgICB7ImJiYl80NDEwMGh6XzJjaF82MDBrYnBzX2ZsYWNfMzBzZWMubXA0In0sCisgICAgICAgICAgICAgICAgeyJiYmJfNDgwMDBoel8yY2hfMTAwa2Jwc19vcHVzXzMwc2VjLndlYm0ifSwKKyAgICAgICAgICAgICAgICAvLyBWaWRlbyBUZXN0CisgICAgICAgICAgICAgICAgeyJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfdnA4LndlYm0ifSwKKyAgICAgICAgICAgICAgICB7ImNyb3dkXzE5MjB4MTA4MF8yNWZwc182NzAwa2Jwc19oMjY0LnRzIn0sCisgICAgICAgICAgICAgICAgeyJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfaDI2NS5ta3YifSwKKyAgICAgICAgICAgICAgICB7ImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc192cDkud2VibSJ9LAorICAgICAgICAgICAgICAgIHsiY3Jvd2RfMTc2eDE0NF8yNWZwc182MDAwa2Jwc19tcGVnNC5tcDQifSwKKyAgICAgICAgICAgICAgICB7ImNyb3dkXzE3NngxNDRfMjVmcHNfNjAwMGticHNfaDI2My4zZ3AifX0pOworICAgIH0KKworICAgIHB1YmxpYyBFbmNvZGVyVGVzdChTdHJpbmcgaW5wdXRGaWxlTmFtZSkgeworICAgICAgICB0aGlzLm1JbnB1dEZpbGUgPSBpbnB1dEZpbGVOYW1lOworICAgIH0KKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVN0YXRzSGVhZGVyVG9GaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RhdHMgbVN0YXRzID0gbmV3IFN0YXRzKCk7CisgICAgICAgIGJvb2xlYW4gc3RhdHVzID0gbVN0YXRzLndyaXRlU3RhdHNIZWFkZXIobVN0YXRzRmlsZSk7CisgICAgICAgIGFzc2VydFRydWUoIlVuYWJsZSB0byBvcGVuIHN0YXRzIGZpbGUgZm9yIHdyaXRpbmchIiwgc3RhdHVzKTsKKyAgICAgICAgTG9nLmQoVEFHLCAiU2F2aW5nIEJlbmNobWFyayByZXN1bHRzIGluOiAiICsgbVN0YXRzRmlsZSk7CisgICAgfQorCisgICAgQFRlc3QodGltZW91dCA9IFBFUl9URVNUX1RJTUVPVVRfTVMpCisgICAgcHVibGljIHZvaWQgdGVzdEVuY29kZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKKyAgICAgICAgaW50IHN0YXR1czsKKyAgICAgICAgaW50IGZyYW1lU2l6ZTsKKyAgICAgICAgLy9QYXJhbWV0ZXJzIGZvciB2aWRlbworICAgICAgICBpbnQgd2lkdGggPSAwOworICAgICAgICBpbnQgaGVpZ2h0ID0gMDsKKyAgICAgICAgaW50IHByb2ZpbGUgPSAwOworICAgICAgICBpbnQgbGV2ZWwgPSAwOworICAgICAgICBpbnQgZnJhbWVSYXRlID0gMDsKKworICAgICAgICAvL1BhcmFtZXRlcnMgZm9yIGF1ZGlvCisgICAgICAgIGludCBiaXRSYXRlID0gMDsKKyAgICAgICAgaW50IHNhbXBsZVJhdGUgPSAwOworICAgICAgICBpbnQgbnVtQ2hhbm5lbHMgPSAwOworICAgICAgICBGaWxlIGlucHV0RmlsZSA9IG5ldyBGaWxlKG1JbnB1dEZpbGVQYXRoICsgbUlucHV0RmlsZSk7CisgICAgICAgIGFzc2VydFRydWUoIkNhbm5vdCBmaW5kICIgKyBtSW5wdXRGaWxlICsgIiBpbiBkaXJlY3RvcnkgIiArIG1JbnB1dEZpbGVQYXRoLAorICAgICAgICAgICAgICAgIGlucHV0RmlsZS5leGlzdHMoKSk7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaWxlSW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGlucHV0RmlsZSk7CisgICAgICAgIEZpbGVEZXNjcmlwdG9yIGZpbGVEZXNjcmlwdG9yID0gZmlsZUlucHV0LmdldEZEKCk7CisgICAgICAgIEV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRXh0cmFjdG9yKCk7CisgICAgICAgIGludCB0cmFja0NvdW50ID0gZXh0cmFjdG9yLnNldFVwRXh0cmFjdG9yKGZpbGVEZXNjcmlwdG9yKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiRXh0cmFjdGlvbiBmYWlsZWQuIE5vIHRyYWNrcyBmb3IgZmlsZTogIiArIG1JbnB1dEZpbGUsICh0cmFja0NvdW50ID4gMCkpOworICAgICAgICBBcnJheUxpc3Q8Qnl0ZUJ1ZmZlcj4gaW5wdXRCdWZmZXIgPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgQXJyYXlMaXN0PE1lZGlhQ29kZWMuQnVmZmVySW5mbz4gZnJhbWVJbmZvID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIGZvciAoaW50IGN1cnJlbnRUcmFjayA9IDA7IGN1cnJlbnRUcmFjayA8IHRyYWNrQ291bnQ7IGN1cnJlbnRUcmFjaysrKSB7CisgICAgICAgICAgICBpbnQgY29sb3JGb3JtYXQgPSBDT0xPUl9Gb3JtYXRZVVY0MjBGbGV4aWJsZTsKKyAgICAgICAgICAgIGV4dHJhY3Rvci5zZWxlY3RFeHRyYWN0b3JUcmFjayhjdXJyZW50VHJhY2spOworICAgICAgICAgICAgTWVkaWFGb3JtYXQgZm9ybWF0ID0gZXh0cmFjdG9yLmdldEZvcm1hdChjdXJyZW50VHJhY2spOworICAgICAgICAgICAgLy8gR2V0IHNhbXBsZXMgZnJvbSBleHRyYWN0b3IKKyAgICAgICAgICAgIGludCBzYW1wbGVTaXplOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIHNhbXBsZVNpemUgPSBleHRyYWN0b3IuZ2V0RnJhbWVTYW1wbGUoKTsKKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjLkJ1ZmZlckluZm8gYnVmSW5mbyA9IG5ldyBNZWRpYUNvZGVjLkJ1ZmZlckluZm8oKTsKKyAgICAgICAgICAgICAgICBNZWRpYUNvZGVjLkJ1ZmZlckluZm8gaW5mbyA9IGV4dHJhY3Rvci5nZXRCdWZmZXJJbmZvKCk7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciBkYXRhQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShpbmZvLnNpemUpOworICAgICAgICAgICAgICAgIGRhdGFCdWZmZXIucHV0KGV4dHJhY3Rvci5nZXRGcmFtZUJ1ZmZlcigpLmFycmF5KCksIDAsIGluZm8uc2l6ZSk7CisgICAgICAgICAgICAgICAgYnVmSW5mby5zZXQoaW5mby5vZmZzZXQsIGluZm8uc2l6ZSwgaW5mby5wcmVzZW50YXRpb25UaW1lVXMsIGluZm8uZmxhZ3MpOworICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLmFkZChkYXRhQnVmZmVyKTsKKyAgICAgICAgICAgICAgICBmcmFtZUluZm8uYWRkKGJ1ZkluZm8pOworICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJFeHRyYWN0ZWQgYnVmSW5mbzogZmxhZyA9ICIgKyBidWZJbmZvLmZsYWdzICsgIiB0aW1lc3RhbXAgPSAiICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZJbmZvLnByZXNlbnRhdGlvblRpbWVVcyArICIgc2l6ZSA9ICIgKyBidWZJbmZvLnNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gd2hpbGUgKHNhbXBsZVNpemUgPiAwKTsKKyAgICAgICAgICAgIGludCB0aWQgPSBhbmRyb2lkLm9zLlByb2Nlc3MubXlUaWQoKTsKKyAgICAgICAgICAgIEZpbGUgZGVjb2RlZEZpbGUgPSBuZXcgRmlsZShtQ29udGV4dC5nZXRGaWxlc0RpcigpICsgIi9kZWNvZGVyXyIgKyB0aWQgKyAiLm91dCIpOworICAgICAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBkZWNvZGVPdXRwdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShkZWNvZGVkRmlsZSk7CisgICAgICAgICAgICBEZWNvZGVyIGRlY29kZXIgPSBuZXcgRGVjb2RlcigpOworICAgICAgICAgICAgZGVjb2Rlci5zZXR1cERlY29kZXIoZGVjb2RlT3V0cHV0U3RyZWFtKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGRlY29kZXIuZGVjb2RlKGlucHV0QnVmZmVyLCBmcmFtZUluZm8sIGZhbHNlLCBmb3JtYXQsICIiKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiRGVjb2RlciByZXR1cm5lZCBlcnJvciAiICsgc3RhdHVzICsgIiBmb3IgZmlsZTogIiArIG1JbnB1dEZpbGUsIDAsCisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyk7CisgICAgICAgICAgICBNZWRpYUZvcm1hdCBkZWNvZGVyRm9ybWF0ID0gZGVjb2Rlci5nZXRGb3JtYXQoKTsKKyAgICAgICAgICAgIGRlY29kZXIuZGVJbml0Q29kZWMoKTsKKyAgICAgICAgICAgIGV4dHJhY3Rvci51bnNlbGVjdEV4dHJhY3RvclRyYWNrKGN1cnJlbnRUcmFjayk7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlci5jbGVhcigpOworICAgICAgICAgICAgZnJhbWVJbmZvLmNsZWFyKCk7CisgICAgICAgICAgICBpZiAoZGVjb2RlT3V0cHV0U3RyZWFtICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICBkZWNvZGVPdXRwdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFN0cmluZyBtaW1lID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSk7CisgICAgICAgICAgICBBcnJheUxpc3Q8U3RyaW5nPiBtZWRpYUNvZGVjcyA9IENvZGVjVXRpbHMuc2VsZWN0Q29kZWNzKG1pbWUsIHRydWUpOworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiTm8gc3VpdGFibGUgY29kZWNzIGZvdW5kIGZvciBmaWxlOiAiICsgbUlucHV0RmlsZSArICIgdHJhY2sgOiAiICsKKyAgICAgICAgICAgICAgICAgICAgY3VycmVudFRyYWNrICsgIiBtaW1lOiAiICsgbWltZSwgKG1lZGlhQ29kZWNzLnNpemUoKSA+IDApKTsKKyAgICAgICAgICAgIEJvb2xlYW5bXSBlbmNvZGVNb2RlID0ge3RydWUsIGZhbHNlfTsKKyAgICAgICAgICAgIC8qIEVuY29kaW5nIHRoZSBkZWNvZGVyJ3Mgb3V0cHV0ICovCisgICAgICAgICAgICBmb3IgKEJvb2xlYW4gYXN5bmNNb2RlIDogZW5jb2RlTW9kZSkgeworICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGNvZGVjTmFtZSA6IG1lZGlhQ29kZWNzKSB7CisgICAgICAgICAgICAgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gZW5jb2RlT3V0cHV0U3RyZWFtID0gbnVsbDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKFdSSVRFX09VVFBVVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBvdXRFbmNvZGVGaWxlID0gbmV3IEZpbGUobU91dHB1dEZpbGVQYXRoICsgImVuY29kZXIub3V0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAob3V0RW5jb2RlRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIiBVbmFibGUgdG8gZGVsZXRlIGV4aXN0aW5nIGZpbGUiICsgb3V0RW5jb2RlRmlsZS50b1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0RW5jb2RlRmlsZS5kZWxldGUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCJVbmFibGUgdG8gY3JlYXRlIGZpbGUgdG8gd3JpdGUgZW5jb2RlciBvdXRwdXQ6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRFbmNvZGVGaWxlLnRvU3RyaW5nKCksIG91dEVuY29kZUZpbGUuY3JlYXRlTmV3RmlsZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZU91dHB1dFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKG91dEVuY29kZUZpbGUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEZpbGUgcmF3RmlsZSA9IG5ldyBGaWxlKG1Db250ZXh0LmdldEZpbGVzRGlyKCkgKyAiL2RlY29kZXJfIiArIHRpZCArICIub3V0Iik7CisgICAgICAgICAgICAgICAgICAgIGFzc2VydFRydWUoIkNhbm5vdCBvcGVuIGZpbGUgdG8gd3JpdGUgZGVjb2RlZCBvdXRwdXQiLCByYXdGaWxlLmV4aXN0cygpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJQYXRoIG9mIGRlY29kZWQgaW5wdXQgZmlsZTogIiArIHJhd0ZpbGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgRmlsZUlucHV0U3RyZWFtIGVsZVN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0ocmF3RmlsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChtaW1lLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA9IGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9XSURUSCk7CisgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSEVJR0hUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQuY29udGFpbnNLZXkoTWVkaWFGb3JtYXQuS0VZX0ZSQU1FX1JBVEUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVSYXRlID0gZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0ZSQU1FX1JBVEUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChmcmFtZVJhdGUgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lUmF0ZSA9IEVOQ09ERV9ERUZBVUxUX0ZSQU1FX1JBVEU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0LmNvbnRhaW5zS2V5KE1lZGlhRm9ybWF0LktFWV9CSVRfUkFURSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRSYXRlID0gZm9ybWF0LmdldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0JJVF9SQVRFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYml0UmF0ZSA8PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1pbWUuY29udGFpbnMoInZpZGVvLzNncHAiKSB8fCBtaW1lLmNvbnRhaW5zKCJ2aWRlby9tcDR2LWVzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0UmF0ZSA9IEVOQ09ERV9NSU5fQklUX1JBVEU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0UmF0ZSA9IEVOQ09ERV9ERUZBVUxUX0JJVF9SQVRFOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQuY29udGFpbnNLZXkoTWVkaWFGb3JtYXQuS0VZX1BST0ZJTEUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSA9IGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9QUk9GSUxFKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXQuY29udGFpbnNLZXkoTWVkaWFGb3JtYXQuS0VZX1BST0ZJTEUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWwgPSBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfTEVWRUwpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlY29kZXJGb3JtYXQuY29udGFpbnNLZXkoTWVkaWFGb3JtYXQuS0VZX0NPTE9SX0ZPUk1BVCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xvckZvcm1hdCA9IGRlY29kZXJGb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQ09MT1JfRk9STUFUKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUgPSBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfU0FNUExFX1JBVEUpOworICAgICAgICAgICAgICAgICAgICAgICAgbnVtQ2hhbm5lbHMgPSBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQ0hBTk5FTF9DT1VOVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZGVjb2RlckZvcm1hdC5jb250YWluc0tleShNZWRpYUZvcm1hdC5LRVlfQklUX1JBVEUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYml0UmF0ZSA9IGRlY29kZXJGb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQklUX1JBVEUpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBiaXRSYXRlID0gRU5DT0RFX0RFRkFVTFRfQVVESU9fQklUX1JBVEU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLypTZXR1cCBFbmNvZGUgRm9ybWF0Ki8KKyAgICAgICAgICAgICAgICAgICAgTWVkaWFGb3JtYXQgZW5jb2RlRm9ybWF0OworICAgICAgICAgICAgICAgICAgICBpZiAobWltZS5zdGFydHNXaXRoKCJ2aWRlby8iKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplID0gd2lkdGggKiBoZWlnaHQgKiAzIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZUZvcm1hdCA9IE1lZGlhRm9ybWF0LmNyZWF0ZVZpZGVvRm9ybWF0KG1pbWUsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0ZSQU1FX1JBVEUsIGZyYW1lUmF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQklUX1JBVEUsIGJpdFJhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX1BST0ZJTEUsIHByb2ZpbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlRm9ybWF0LnNldEludGVnZXIoTWVkaWFGb3JtYXQuS0VZX0xFVkVMLCBsZXZlbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSV9GUkFNRV9JTlRFUlZBTCwgMSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfTUFYX0lOUFVUX1NJWkUsIGZyYW1lU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQ09MT1JfRk9STUFULCBjb2xvckZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQgPSBNZWRpYUZvcm1hdC5jcmVhdGVBdWRpb0Zvcm1hdChtaW1lLCBzYW1wbGVSYXRlLCBudW1DaGFubmVscyk7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVGb3JtYXQuc2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfQklUX1JBVEUsIGJpdFJhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplID0gNDA5NjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBFbmNvZGVyIGVuY29kZXIgPSBuZXcgRW5jb2RlcigpOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLnNldHVwRW5jb2RlcihlbmNvZGVPdXRwdXRTdHJlYW0sIGVsZVN0cmVhbSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGVuY29kZXIuZW5jb2RlKGNvZGVjTmFtZSwgZW5jb2RlRm9ybWF0LCBtaW1lLCBmcmFtZVJhdGUsIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplLCBhc3luY01vZGUpOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLmRlSW5pdEVuY29kZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjTmFtZSArICIgZW5jb2RlciByZXR1cm5lZCBlcnJvciAiICsgc3RhdHVzICsgIiBmb3IgIiArICJmaWxlOiIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAiICsgbUlucHV0RmlsZSwgMCwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgZW5jb2Rlci5kdW1wU3RhdGlzdGljcyhtSW5wdXRGaWxlLCBjb2RlY05hbWUsIChhc3luY01vZGUgPyAiYXN5bmMiIDogInN5bmMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0b3IuZ2V0Q2xpcER1cmF0aW9uKCksIG1TdGF0c0ZpbGUpOworICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJFbmNvZGluZyBjb21wbGV0ZSBmb3IgZmlsZTogIiArIG1JbnB1dEZpbGUgKyAiIHdpdGggY29kZWM6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjTmFtZSArICIgZm9yIGFTeW5jTW9kZSA9ICIgKyBhc3luY01vZGUpOworICAgICAgICAgICAgICAgICAgICBlbmNvZGVyLnJlc2V0RW5jb2RlcigpOworICAgICAgICAgICAgICAgICAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGVuY29kZU91dHB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVPdXRwdXRTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgLy9DbGVhbnVwIHRlbXBvcmFyeSBpbnB1dCBmaWxlCisgICAgICAgICAgICBpZiAoZGVjb2RlZEZpbGUuZXhpc3RzKCkpIHsKKyAgICAgICAgICAgICAgICBhc3NlcnRUcnVlKCIgVW5hYmxlIHRvIGRlbGV0ZSBkZWNvZGVkIGZpbGUiICsgZGVjb2RlZEZpbGUudG9TdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZWRGaWxlLmRlbGV0ZSgpKTsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJTdWNjZXNzZnVsbHkgZGVsZXRlZCBkZWNvZGVkIGZpbGUiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBleHRyYWN0b3IuZGVpbml0RXh0cmFjdG9yKCk7CisgICAgICAgIGZpbGVJbnB1dC5jbG9zZSgpOworICAgIH0KKworICAgIEBUZXN0KHRpbWVvdXQgPSBQRVJfVEVTVF9USU1FT1VUX01TKQorICAgIHB1YmxpYyB2b2lkIHRlc3ROYXRpdmVFbmNvZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgaW5wdXRGaWxlID0gbmV3IEZpbGUobUlucHV0RmlsZVBhdGggKyBtSW5wdXRGaWxlKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2Fubm90IGZpbmQgIiArIG1JbnB1dEZpbGUgKyAiIGluIGRpcmVjdG9yeSAiICsgbUlucHV0RmlsZVBhdGgsCisgICAgICAgICAgICAgICAgaW5wdXRGaWxlLmV4aXN0cygpKTsKKyAgICAgICAgaW50IHRpZCA9IGFuZHJvaWQub3MuUHJvY2Vzcy5teVRpZCgpOworICAgICAgICBmaW5hbCBTdHJpbmcgbURlY29kZWRGaWxlID0gbUNvbnRleHQuZ2V0RmlsZXNEaXIoKSArICIvZGVjb2Rlcl8iICsgdGlkICsgIi5vdXQiOworICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlsZUlucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShpbnB1dEZpbGUpOworICAgICAgICBGaWxlRGVzY3JpcHRvciBmaWxlRGVzY3JpcHRvciA9IGZpbGVJbnB1dC5nZXRGRCgpOworICAgICAgICBFeHRyYWN0b3IgZXh0cmFjdG9yID0gbmV3IEV4dHJhY3RvcigpOworICAgICAgICBpbnQgdHJhY2tDb3VudCA9IGV4dHJhY3Rvci5zZXRVcEV4dHJhY3RvcihmaWxlRGVzY3JpcHRvcik7CisgICAgICAgIGFzc2VydFRydWUoIkV4dHJhY3Rpb24gZmFpbGVkLiBObyB0cmFja3MgZm9yIGZpbGU6ICIsIHRyYWNrQ291bnQgPiAwKTsKKyAgICAgICAgZm9yIChpbnQgY3VycmVudFRyYWNrID0gMDsgY3VycmVudFRyYWNrIDwgdHJhY2tDb3VudDsgY3VycmVudFRyYWNrKyspIHsKKyAgICAgICAgICAgIGV4dHJhY3Rvci5zZWxlY3RFeHRyYWN0b3JUcmFjayhjdXJyZW50VHJhY2spOworICAgICAgICAgICAgTWVkaWFGb3JtYXQgZm9ybWF0ID0gZXh0cmFjdG9yLmdldEZvcm1hdChjdXJyZW50VHJhY2spOworICAgICAgICAgICAgU3RyaW5nIG1pbWUgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FKTsKKyAgICAgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IG1lZGlhQ29kZWNzID0gQ29kZWNVdGlscy5zZWxlY3RDb2RlY3MobWltZSwgdHJ1ZSk7CisgICAgICAgICAgICAvLyBFbmNvZGluZyB0aGUgZGVjb2RlcidzIG91dHB1dAorICAgICAgICAgICAgZm9yIChTdHJpbmcgY29kZWNOYW1lIDogbWVkaWFDb2RlY3MpIHsKKyAgICAgICAgICAgICAgICBOYXRpdmUgbmF0aXZlRW5jb2RlciA9IG5ldyBOYXRpdmUoKTsKKyAgICAgICAgICAgICAgICBpbnQgc3RhdHVzID0gbmF0aXZlRW5jb2RlcgorICAgICAgICAgICAgICAgICAgICAgICAgLkVuY29kZShtSW5wdXRGaWxlUGF0aCwgbUlucHV0RmlsZSwgbURlY29kZWRGaWxlLCBtU3RhdHNGaWxlLCBjb2RlY05hbWUpOworICAgICAgICAgICAgICAgIGFzc2VydEVxdWFscygKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVjTmFtZSArICIgZW5jb2RlciByZXR1cm5lZCBlcnJvciAiICsgc3RhdHVzICsgIiBmb3IgIiArICJmaWxlOiIgKyAiICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5wdXRGaWxlLCAwLCBzdGF0dXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEZpbGUgZGVjb2RlZEZpbGUgPSBuZXcgRmlsZShtRGVjb2RlZEZpbGUpOworICAgICAgICAvLyBDbGVhbnVwIHRlbXBvcmFyeSBpbnB1dCBmaWxlCisgICAgICAgIGlmIChkZWNvZGVkRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5hYmxlIHRvIGRlbGV0ZSAtICIgKyBtRGVjb2RlZEZpbGUsIGRlY29kZWRGaWxlLmRlbGV0ZSgpKTsKKyAgICAgICAgICAgIExvZy5pKFRBRywgIlN1Y2Nlc3NmdWxseSBkZWxldGVkIC0gIiArIG1EZWNvZGVkRmlsZSk7CisgICAgICAgIH0KKyAgICAgICAgZmlsZUlucHV0LmNsb3NlKCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvYW5kcm9pZFRlc3QvamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvdGVzdHMvRXh0cmFjdG9yVGVzdC5qYXZhIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvYW5kcm9pZFRlc3QvamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvdGVzdHMvRXh0cmFjdG9yVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkMDI2YzEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9hbmRyb2lkVGVzdC9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay90ZXN0cy9FeHRyYWN0b3JUZXN0LmphdmEKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0czsKKworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay5SOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay5saWJyYXJ5LkV4dHJhY3RvcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsubGlicmFyeS5OYXRpdmU7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLmxpYnJhcnkuU3RhdHM7CisKK2ltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OworaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnBsYXRmb3JtLmFwcC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworaW1wb3J0IG9yZy5qdW5pdC5CZWZvcmVDbGFzczsKK2ltcG9ydCBvcmcuanVuaXQuVGVzdDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7CitpbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuUGFyYW1ldGVyaXplZDsKKworaW1wb3J0IGphdmEuaW8uRmlsZTsKK2ltcG9ydCBqYXZhLmlvLkZpbGVEZXNjcmlwdG9yOworaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CisKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRUcnVlOworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKKworaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7CisKK0BSdW5XaXRoKFBhcmFtZXRlcml6ZWQuY2xhc3MpCitwdWJsaWMgY2xhc3MgRXh0cmFjdG9yVGVzdCB7CisgICAgcHJpdmF0ZSBzdGF0aWMgQ29udGV4dCBtQ29udGV4dCA9CisgICAgICAgICAgICBJbnN0cnVtZW50YXRpb25SZWdpc3RyeS5nZXRJbnN0cnVtZW50YXRpb24oKS5nZXRUYXJnZXRDb250ZXh0KCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1JbnB1dEZpbGVQYXRoID0gbUNvbnRleHQuZ2V0U3RyaW5nKFIuc3RyaW5nLmlucHV0X2ZpbGVfcGF0aCk7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIG1TdGF0c0ZpbGUgPSBtQ29udGV4dC5nZXRFeHRlcm5hbEZpbGVzRGlyKG51bGwpICsgIi9FeHRyYWN0b3IuIgorICAgICAgICAgICAgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIuY3N2IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIkV4dHJhY3RvclRlc3QiOworICAgIHByaXZhdGUgU3RyaW5nIG1JbnB1dEZpbGVOYW1lOworICAgIHByaXZhdGUgaW50IG1UcmFja0lkOworCisgICAgQFBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycworICAgIHB1YmxpYyBzdGF0aWMgQ29sbGVjdGlvbjxPYmplY3RbXT4gaW5wdXRGaWxlcygpIHsKKyAgICAgICAgcmV0dXJuIEFycmF5cy5hc0xpc3QobmV3IE9iamVjdFtdW117LyogUGFyYW1ldGVyczogZmlsZW5hbWUsIHRyYWNrSWQqLworICAgICAgICAgICAgICAgIHsiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzYwMDBrYnBzX21wZWc0Lm1wNCIsIDB9LAorICAgICAgICAgICAgICAgIHsiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzY3MDBrYnBzX2gyNjQudHMiLCAwfSwKKyAgICAgICAgICAgICAgICB7ImNyb3dkXzE5MjB4MTA4MF8yNWZwc183MzAwa2Jwc19tcGVnMi5tcDQiLCAwfSwKKyAgICAgICAgICAgICAgICB7ImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc19hdjEud2VibSIsIDB9LAorICAgICAgICAgICAgICAgIHsiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2gyNjUubWt2IiwgMH0sCisgICAgICAgICAgICAgICAgeyJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfdnA4LndlYm0iLCAwfSwKKyAgICAgICAgICAgICAgICB7ImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX2FhY181bWlucy5tcDQiLCAwfSwKKyAgICAgICAgICAgICAgICB7ImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM181bWlucy5tcDMiLCAwfSwKKyAgICAgICAgICAgICAgICB7ImJiYl80NDEwMGh6XzJjaF82MDBrYnBzX2ZsYWNfNW1pbnMuZmxhYyIsIDB9LAorICAgICAgICAgICAgICAgIHsiYmJiXzgwMDBoel8xY2hfOGticHNfYW1ybmJfNW1pbnMuM2dwIiwgMH0sCisgICAgICAgICAgICAgICAgeyJiYmJfMTYwMDBoel8xY2hfOWticHNfYW1yd2JfNW1pbnMuM2dwIiwgMH0sCisgICAgICAgICAgICAgICAgeyJiYmJfNDQxMDBoel8yY2hfODBrYnBzX3ZvcmJpc181bWlucy53ZWJtIiwgMH0sCisgICAgICAgICAgICAgICAgeyJiYmJfNDgwMDBoel8yY2hfMTAwa2Jwc19vcHVzXzVtaW5zLndlYm0iLCAwfX0pOworICAgIH0KKworICAgIHB1YmxpYyBFeHRyYWN0b3JUZXN0KFN0cmluZyBmaWxlbmFtZSwgaW50IHRyYWNrKSB7CisgICAgICAgIHRoaXMubUlucHV0RmlsZU5hbWUgPSBmaWxlbmFtZTsKKyAgICAgICAgdGhpcy5tVHJhY2tJZCA9IHRyYWNrOworICAgIH0KKworICAgIEBCZWZvcmVDbGFzcworICAgIHB1YmxpYyBzdGF0aWMgdm9pZCB3cml0ZVN0YXRzSGVhZGVyVG9GaWxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RhdHMgbVN0YXRzID0gbmV3IFN0YXRzKCk7CisgICAgICAgIGJvb2xlYW4gc3RhdHVzID0gbVN0YXRzLndyaXRlU3RhdHNIZWFkZXIobVN0YXRzRmlsZSk7CisgICAgICAgIGFzc2VydFRydWUoIlVuYWJsZSB0byBvcGVuIHN0YXRzIGZpbGUgZm9yIHdyaXRpbmchIiwgc3RhdHVzKTsKKyAgICAgICAgTG9nLmQoVEFHLCAiU2F2aW5nIEJlbmNobWFyayByZXN1bHRzIGluOiAiICsgbVN0YXRzRmlsZSk7CisgICAgfQorCisgICAgQFRlc3QKKyAgICBwdWJsaWMgdm9pZCB0ZXN0RXh0cmFjdG9yKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBpbnB1dEZpbGUgPSBuZXcgRmlsZShtSW5wdXRGaWxlUGF0aCArIG1JbnB1dEZpbGVOYW1lKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2Fubm90IGZpbmQgIiArIG1JbnB1dEZpbGVOYW1lICsgIiBpbiBkaXJlY3RvcnkgIiArIG1JbnB1dEZpbGVQYXRoLAorICAgICAgICAgICAgICAgIGlucHV0RmlsZS5leGlzdHMoKSk7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaWxlSW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGlucHV0RmlsZSk7CisgICAgICAgIEZpbGVEZXNjcmlwdG9yIGZpbGVEZXNjcmlwdG9yID0gZmlsZUlucHV0LmdldEZEKCk7CisgICAgICAgIEV4dHJhY3RvciBleHRyYWN0b3IgPSBuZXcgRXh0cmFjdG9yKCk7CisgICAgICAgIGV4dHJhY3Rvci5zZXRVcEV4dHJhY3RvcihmaWxlRGVzY3JpcHRvcik7CisgICAgICAgIE1lZGlhRm9ybWF0IGZvcm1hdCA9IGV4dHJhY3Rvci5nZXRGb3JtYXQobVRyYWNrSWQpOworICAgICAgICBTdHJpbmcgbWltZSA9IGZvcm1hdC5nZXRTdHJpbmcoTWVkaWFGb3JtYXQuS0VZX01JTUUpOworICAgICAgICBpbnQgc3RhdHVzID0gZXh0cmFjdG9yLmV4dHJhY3RTYW1wbGUobVRyYWNrSWQpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkV4dHJhY3Rpb24gZmFpbGVkIGZvciAiICsgbUlucHV0RmlsZU5hbWUsIDAsIHN0YXR1cyk7CisgICAgICAgIExvZy5pKFRBRywgIkV4dHJhY3RlZCAiICsgbUlucHV0RmlsZU5hbWUgKyAiIHN1Y2Nlc3NmdWxseS4iKTsKKyAgICAgICAgZXh0cmFjdG9yLmRlaW5pdEV4dHJhY3RvcigpOworICAgICAgICBleHRyYWN0b3IuZHVtcFN0YXRpc3RpY3MobUlucHV0RmlsZU5hbWUsIG1pbWUsIG1TdGF0c0ZpbGUpOworICAgICAgICBmaWxlSW5wdXQuY2xvc2UoKTsKKyAgICB9CisKKyAgICBAVGVzdAorICAgIHB1YmxpYyB2b2lkIHRlc3ROYXRpdmVFeHRyYWN0b3IoKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBOYXRpdmUgbmF0aXZlRXh0cmFjdG9yID0gbmV3IE5hdGl2ZSgpOworICAgICAgICBGaWxlIGlucHV0RmlsZSA9IG5ldyBGaWxlKG1JbnB1dEZpbGVQYXRoICsgbUlucHV0RmlsZU5hbWUpOworICAgICAgICBhc3NlcnRUcnVlKCJDYW5ub3QgZmluZCAiICsgbUlucHV0RmlsZU5hbWUgKyAiIGluIGRpcmVjdG9yeSAiICsgbUlucHV0RmlsZVBhdGgsCisgICAgICAgICAgICAgICAgaW5wdXRGaWxlLmV4aXN0cygpKTsKKyAgICAgICAgRmlsZUlucHV0U3RyZWFtIGZpbGVJbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaW5wdXRGaWxlKTsKKyAgICAgICAgaW50IHN0YXR1cyA9IG5hdGl2ZUV4dHJhY3Rvci5FeHRyYWN0KG1JbnB1dEZpbGVQYXRoLCBtSW5wdXRGaWxlTmFtZSwgbVN0YXRzRmlsZSk7CisgICAgICAgIGZpbGVJbnB1dC5jbG9zZSgpOworICAgICAgICBhc3NlcnRFcXVhbHMoIkV4dHJhY3Rpb24gZmFpbGVkIGZvciAiICsgbUlucHV0RmlsZU5hbWUsIDAsIHN0YXR1cyk7CisgICAgICAgIExvZy5pKFRBRywgIkV4dHJhY3RlZCAiICsgbUlucHV0RmlsZU5hbWUgKyAiIHN1Y2Nlc3NmdWxseS4iKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9hbmRyb2lkVGVzdC9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay90ZXN0cy9NdXhlclRlc3QuamF2YSBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL2FuZHJvaWRUZXN0L2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL3Rlc3RzL011eGVyVGVzdC5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxYmE5NTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9hbmRyb2lkVGVzdC9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay90ZXN0cy9NdXhlclRlc3QuamF2YQpAQCAtMCwwICsxLDE4MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0czsKKworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay5SOworaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay5saWJyYXJ5LkV4dHJhY3RvcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsubGlicmFyeS5NdXhlcjsKK2ltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsubGlicmFyeS5OYXRpdmU7CitpbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLmxpYnJhcnkuU3RhdHM7CisKK2ltcG9ydCBhbmRyb2lkeC50ZXN0LnBsYXRmb3JtLmFwcC5JbnN0cnVtZW50YXRpb25SZWdpc3RyeTsKKworaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlYzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNdXhlcjsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgb3JnLmp1bml0LkJlZm9yZUNsYXNzOworaW1wb3J0IG9yZy5qdW5pdC5UZXN0OworaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVuV2l0aDsKK2ltcG9ydCBvcmcuanVuaXQucnVubmVycy5QYXJhbWV0ZXJpemVkOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworaW1wb3J0IGphdmEudXRpbC5BcnJheXM7CitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247CitpbXBvcnQgamF2YS51dGlsLkhhc2h0YWJsZTsKK2ltcG9ydCBqYXZhLnV0aWwuTWFwOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKK2ltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRFcXVhbHM7CitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0Tm90RXF1YWxzOworCitpbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0VHJ1ZTsKKworQFJ1bldpdGgoUGFyYW1ldGVyaXplZC5jbGFzcykKK3B1YmxpYyBjbGFzcyBNdXhlclRlc3QgeworICAgIHByaXZhdGUgc3RhdGljIENvbnRleHQgbUNvbnRleHQgPQorICAgICAgICAgICAgSW5zdHJ1bWVudGF0aW9uUmVnaXN0cnkuZ2V0SW5zdHJ1bWVudGF0aW9uKCkuZ2V0VGFyZ2V0Q29udGV4dCgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtSW5wdXRGaWxlUGF0aCA9IG1Db250ZXh0LmdldFN0cmluZyhSLnN0cmluZy5pbnB1dF9maWxlX3BhdGgpOworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBtU3RhdHNGaWxlID0KKyAgICAgICAgICAgIG1Db250ZXh0LmdldEV4dGVybmFsRmlsZXNEaXIobnVsbCkgKyAiL011eGVyLiIgKyBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSArICIuY3N2IjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk11eGVyVGVzdCI7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTWFwPFN0cmluZywgSW50ZWdlcj4gbU1hcEZvcm1hdCA9IG5ldyBIYXNodGFibGU8U3RyaW5nLCBJbnRlZ2VyPigpIHsKKyAgICAgICAgeworICAgICAgICAgICAgcHV0KCJtcDQiLCBNZWRpYU11eGVyLk91dHB1dEZvcm1hdC5NVVhFUl9PVVRQVVRfTVBFR180KTsKKyAgICAgICAgICAgIHB1dCgid2VibSIsIE1lZGlhTXV4ZXIuT3V0cHV0Rm9ybWF0Lk1VWEVSX09VVFBVVF9XRUJNKTsKKyAgICAgICAgICAgIHB1dCgiM2dwcCIsIE1lZGlhTXV4ZXIuT3V0cHV0Rm9ybWF0Lk1VWEVSX09VVFBVVF8zR1BQKTsKKyAgICAgICAgICAgIHB1dCgib2dnIiwgTWVkaWFNdXhlci5PdXRwdXRGb3JtYXQuTVVYRVJfT1VUUFVUX09HRyk7CisgICAgICAgIH0KKyAgICB9OworICAgIHByaXZhdGUgU3RyaW5nIG1JbnB1dEZpbGVOYW1lOworICAgIHByaXZhdGUgU3RyaW5nIG1Gb3JtYXQ7CisKKyAgICBAUGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzCisgICAgcHVibGljIHN0YXRpYyBDb2xsZWN0aW9uPE9iamVjdFtdPiBpbnB1dEZpbGVzKCkgeworICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdChuZXcgT2JqZWN0W11bXXsKKyAgICAgICAgICAgICAgICAvKiBQYXJhbWV0ZXJzOiBmaWxlbmFtZSwgZm9ybWF0ICovCisgICAgICAgICAgICAgICAgeyJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfdnA4LndlYm0iLCAid2VibSJ9LAorICAgICAgICAgICAgICAgIHsiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX3ZwOS53ZWJtIiwgIndlYm0ifSwKKyAgICAgICAgICAgICAgICB7ImNyb3dkXzE5MjB4MTA4MF8yNWZwc182MDAwa2Jwc19tcGVnNC5tcDQiLCAibXA0In0sCisgICAgICAgICAgICAgICAgeyJjcm93ZF8zNTJ4Mjg4XzI1ZnBzXzYwMDBrYnBzX2gyNjMuM2dwIiwgIm1wNCJ9LAorICAgICAgICAgICAgICAgIHsiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzY3MDBrYnBzX2gyNjQudHMiLCAibXA0In0sCisgICAgICAgICAgICAgICAgeyJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfaDI2NS5ta3YiLCAibXA0In0sCisgICAgICAgICAgICAgICAgeyJjcm93ZF8xOTIweDEwODBfMjVmcHNfNjAwMGticHNfbXBlZzQubXA0IiwgIjNncHAifSwKKyAgICAgICAgICAgICAgICB7ImNyb3dkXzM1MngyODhfMjVmcHNfNjAwMGticHNfaDI2My4zZ3AiLCAiM2dwcCJ9LAorICAgICAgICAgICAgICAgIHsiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzY3MDBrYnBzX2gyNjQudHMiLCAiM2dwcCJ9LAorICAgICAgICAgICAgICAgIHsiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2gyNjUubWt2IiwgIjNncHAifSwKKyAgICAgICAgICAgICAgICB7ImJiYl80ODAwMGh6XzJjaF8xMDBrYnBzX29wdXNfNW1pbnMud2VibSIsICJvZ2cifSwKKyAgICAgICAgICAgICAgICB7ImJiYl80NDEwMGh6XzJjaF84MGticHNfdm9yYmlzXzVtaW5zLndlYm0iLCAid2VibSJ9LAorICAgICAgICAgICAgICAgIHsiYmJiXzQ4MDAwaHpfMmNoXzEwMGticHNfb3B1c181bWlucy53ZWJtIiwgIndlYm0ifSwKKyAgICAgICAgICAgICAgICB7ImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX2FhY181bWlucy5tcDQiLCAibXA0In0sCisgICAgICAgICAgICAgICAgeyJiYmJfODAwMGh6XzFjaF84a2Jwc19hbXJuYl81bWlucy4zZ3AiLCAibXA0In0sCisgICAgICAgICAgICAgICAgeyJiYmJfMTYwMDBoel8xY2hfOWticHNfYW1yd2JfNW1pbnMuM2dwIiwgIm1wNCJ9LAorICAgICAgICAgICAgICAgIHsiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfYWFjXzVtaW5zLm1wNCIsICIzZ3BwIn0sCisgICAgICAgICAgICAgICAgeyJiYmJfODAwMGh6XzFjaF84a2Jwc19hbXJuYl81bWlucy4zZ3AiLCAiM2dwcCJ9LAorICAgICAgICAgICAgICAgIHsiYmJiXzE2MDAwaHpfMWNoXzlrYnBzX2FtcndiXzVtaW5zLjNncCIsICIzZ3BwIn19KTsKKyAgICB9CisKKyAgICBwdWJsaWMgTXV4ZXJUZXN0KFN0cmluZyBmaWxlbmFtZSwgU3RyaW5nIG91dHB1dEZvcm1hdCkgeworICAgICAgICB0aGlzLm1JbnB1dEZpbGVOYW1lID0gZmlsZW5hbWU7CisgICAgICAgIHRoaXMubUZvcm1hdCA9IG91dHB1dEZvcm1hdDsKKyAgICB9CisKKyAgICBAQmVmb3JlQ2xhc3MKKyAgICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVTdGF0c0hlYWRlclRvRmlsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0YXRzIG1TdGF0cyA9IG5ldyBTdGF0cygpOworICAgICAgICBib29sZWFuIHN0YXR1cyA9IG1TdGF0cy53cml0ZVN0YXRzSGVhZGVyKG1TdGF0c0ZpbGUpOworICAgICAgICBhc3NlcnRUcnVlKCJVbmFibGUgdG8gb3BlbiBzdGF0cyBmaWxlIGZvciB3cml0aW5nISIsIHN0YXR1cyk7CisgICAgICAgIExvZy5kKFRBRywgIlNhdmluZyBCZW5jaG1hcmsgcmVzdWx0cyBpbjogIiArIG1TdGF0c0ZpbGUpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE11eGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgRmlsZSBpbnB1dEZpbGUgPSBuZXcgRmlsZShtSW5wdXRGaWxlUGF0aCArIG1JbnB1dEZpbGVOYW1lKTsKKyAgICAgICAgYXNzZXJ0VHJ1ZSgiQ2Fubm90IGZpbmQgIiArIG1JbnB1dEZpbGVOYW1lICsgIiBpbiBkaXJlY3RvcnkgIiArIG1JbnB1dEZpbGVQYXRoLAorICAgICAgICAgICAgICAgIGlucHV0RmlsZS5leGlzdHMoKSk7CisgICAgICAgIEZpbGVJbnB1dFN0cmVhbSBmaWxlSW5wdXQgPSBuZXcgRmlsZUlucHV0U3RyZWFtKGlucHV0RmlsZSk7CisgICAgICAgIEZpbGVEZXNjcmlwdG9yIGZpbGVEZXNjcmlwdG9yID0gZmlsZUlucHV0LmdldEZEKCk7CisgICAgICAgIEFycmF5TGlzdDxCeXRlQnVmZmVyPiBpbnB1dEJ1ZmZlciA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBBcnJheUxpc3Q8TWVkaWFDb2RlYy5CdWZmZXJJbmZvPiBpbnB1dEJ1ZmZlckluZm8gPSBuZXcgQXJyYXlMaXN0PD4oKTsKKyAgICAgICAgRXh0cmFjdG9yIGV4dHJhY3RvciA9IG5ldyBFeHRyYWN0b3IoKTsKKyAgICAgICAgaW50IHRyYWNrQ291bnQgPSBleHRyYWN0b3Iuc2V0VXBFeHRyYWN0b3IoZmlsZURlc2NyaXB0b3IpOworICAgICAgICBmb3IgKGludCBjdXJyZW50VHJhY2sgPSAwOyBjdXJyZW50VHJhY2sgPCB0cmFja0NvdW50OyBjdXJyZW50VHJhY2srKykgeworICAgICAgICAgICAgZXh0cmFjdG9yLnNlbGVjdEV4dHJhY3RvclRyYWNrKGN1cnJlbnRUcmFjayk7CisgICAgICAgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICAgICAgICAgIGludCBzYW1wbGVTaXplID0gZXh0cmFjdG9yLmdldEZyYW1lU2FtcGxlKCk7CisgICAgICAgICAgICAgICAgTWVkaWFDb2RlYy5CdWZmZXJJbmZvIGJ1ZmZlckluZm8gPSBleHRyYWN0b3IuZ2V0QnVmZmVySW5mbygpOworICAgICAgICAgICAgICAgIE1lZGlhQ29kZWMuQnVmZmVySW5mbyB0ZW1wQnVmZmVySW5mbyA9IG5ldyBNZWRpYUNvZGVjLkJ1ZmZlckluZm8oKTsKKyAgICAgICAgICAgICAgICB0ZW1wQnVmZmVySW5mbworICAgICAgICAgICAgICAgICAgICAgICAgLnNldChidWZmZXJJbmZvLm9mZnNldCwgYnVmZmVySW5mby5zaXplLCBidWZmZXJJbmZvLnByZXNlbnRhdGlvblRpbWVVcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVySW5mby5mbGFncyk7CisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXJJbmZvLmFkZCh0ZW1wQnVmZmVySW5mbyk7CisgICAgICAgICAgICAgICAgQnl0ZUJ1ZmZlciB0ZW1wU2FtcGxlQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSh0ZW1wQnVmZmVySW5mby5zaXplKTsKKyAgICAgICAgICAgICAgICB0ZW1wU2FtcGxlQnVmZmVyLnB1dChleHRyYWN0b3IuZ2V0RnJhbWVCdWZmZXIoKS5hcnJheSgpLCAwLCBidWZmZXJJbmZvLnNpemUpOworICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLmFkZCh0ZW1wU2FtcGxlQnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAoc2FtcGxlU2l6ZSA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgTWVkaWFGb3JtYXQgZm9ybWF0ID0gZXh0cmFjdG9yLmdldEZvcm1hdChjdXJyZW50VHJhY2spOworICAgICAgICAgICAgaW50IG91dHB1dEZvcm1hdCA9IG1NYXBGb3JtYXQuZ2V0T3JEZWZhdWx0KG1Gb3JtYXQsIC0xKTsKKyAgICAgICAgICAgIGFzc2VydE5vdEVxdWFscygiVGVzdCBmYWlsZWQgZm9yICIgKyBtSW5wdXRGaWxlTmFtZSArICIuIFJldHVybmVkIGludmFsaWQgIiArCisgICAgICAgICAgICAgICAgICAgICJvdXRwdXQgZm9ybWF0IGZvciBnaXZlbiAiICsgbUZvcm1hdCArICIgZm9ybWF0LiIsIC0xLCBvdXRwdXRGb3JtYXQpOworICAgICAgICAgICAgTXV4ZXIgbXV4ZXIgPSBuZXcgTXV4ZXIoKTsKKyAgICAgICAgICAgIGludCB0cmFja0luZGV4ID0gbXV4ZXIuc2V0VXBNdXhlcihtQ29udGV4dCwgb3V0cHV0Rm9ybWF0LCBmb3JtYXQpOworICAgICAgICAgICAgaW50IHN0YXR1cyA9IG11eGVyLm11eCh0cmFja0luZGV4LCBpbnB1dEJ1ZmZlciwgaW5wdXRCdWZmZXJJbmZvKTsKKyAgICAgICAgICAgIGFzc2VydEVxdWFscygiQ2Fubm90IHBlcmZvcm0gd3JpdGUgb3BlcmF0aW9uIGZvciAiICsgbUlucHV0RmlsZU5hbWUsIDAsIHN0YXR1cyk7CisgICAgICAgICAgICBMb2cuaShUQUcsICJNdXhlZCAiICsgbUlucHV0RmlsZU5hbWUgKyAiIHN1Y2Nlc3NmdWxseS4iKTsKKyAgICAgICAgICAgIG11eGVyLmRlSW5pdE11eGVyKCk7CisgICAgICAgICAgICBtdXhlci5kdW1wU3RhdGlzdGljcyhtSW5wdXRGaWxlTmFtZSwgbUZvcm1hdCwgZXh0cmFjdG9yLmdldENsaXBEdXJhdGlvbigpLCBtU3RhdHNGaWxlKTsKKyAgICAgICAgICAgIG11eGVyLnJlc2V0TXV4ZXIoKTsKKyAgICAgICAgICAgIGV4dHJhY3Rvci51bnNlbGVjdEV4dHJhY3RvclRyYWNrKGN1cnJlbnRUcmFjayk7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlckluZm8uY2xlYXIoKTsKKyAgICAgICAgICAgIGlucHV0QnVmZmVyLmNsZWFyKCk7CisKKyAgICAgICAgfQorICAgICAgICBleHRyYWN0b3IuZGVpbml0RXh0cmFjdG9yKCk7CisgICAgICAgIGZpbGVJbnB1dC5jbG9zZSgpOworICAgIH0KKworICAgIEBUZXN0CisgICAgcHVibGljIHZvaWQgdGVzdE5hdGl2ZU11eGVyKCkgeworICAgICAgICBOYXRpdmUgbmF0aXZlTXV4ZXIgPSBuZXcgTmF0aXZlKCk7CisgICAgICAgIEZpbGUgaW5wdXRGaWxlID0gbmV3IEZpbGUobUlucHV0RmlsZVBhdGggKyBtSW5wdXRGaWxlTmFtZSk7CisgICAgICAgIGFzc2VydFRydWUoIkNhbm5vdCBmaW5kICIgKyBtSW5wdXRGaWxlTmFtZSArICIgaW4gZGlyZWN0b3J5ICIgKyBtSW5wdXRGaWxlUGF0aCwKKyAgICAgICAgICAgICAgICBpbnB1dEZpbGUuZXhpc3RzKCkpOworICAgICAgICBpbnQgdGlkID0gYW5kcm9pZC5vcy5Qcm9jZXNzLm15VGlkKCk7CisgICAgICAgIFN0cmluZyBtTXV4T3V0cHV0RmlsZSA9IChtQ29udGV4dC5nZXRGaWxlc0RpcigpICsgIi9tdXhfIiArIHRpZCArICIub3V0Iik7CisgICAgICAgIGludCBzdGF0dXMgPSBuYXRpdmVNdXhlci5NdXgoCisgICAgICAgICAgICAgICAgbUlucHV0RmlsZVBhdGgsIG1JbnB1dEZpbGVOYW1lLCBtTXV4T3V0cHV0RmlsZSwgbVN0YXRzRmlsZSwgbUZvcm1hdCk7CisgICAgICAgIGFzc2VydEVxdWFscygiQ2Fubm90IHBlcmZvcm0gd3JpdGUgb3BlcmF0aW9uIGZvciAiICsgbUlucHV0RmlsZU5hbWUsIDAsIHN0YXR1cyk7CisgICAgICAgIExvZy5pKFRBRywgIk11eGVkICIgKyBtSW5wdXRGaWxlTmFtZSArICIgc3VjY2Vzc2Z1bGx5LiIpOworICAgICAgICBGaWxlIG11eGVkRmlsZSA9IG5ldyBGaWxlKG1NdXhPdXRwdXRGaWxlKTsKKyAgICAgICAgLy8gQ2xlYW51cCB0ZW1wb3Jhcnkgb3V0cHV0IGZpbGUKKyAgICAgICAgaWYgKG11eGVkRmlsZS5leGlzdHMoKSkgeworICAgICAgICAgICAgYXNzZXJ0VHJ1ZSgiVW5hYmxlIHRvIGRlbGV0ZSIgKyBtTXV4T3V0cHV0RmlsZSArICIgZmlsZS4iLAorICAgICAgICAgICAgICAgICAgICBtdXhlZEZpbGUuZGVsZXRlKCkpOworICAgICAgICB9CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9jcHAvQW5kcm9pZC5icCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U1ZTRjOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMyBAQAorY2NfdGVzdF9saWJyYXJ5IHsKKyAgICBuYW1lOiAibGlibWVkaWFiZW5jaG1hcmtfam5pIiwKKyAgICBzZGtfdmVyc2lvbjogImN1cnJlbnQiLAorCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX2NvbW1vbi1kZWZhdWx0cyIsCisgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIk5hdGl2ZUV4dHJhY3Rvci5jcHAiLAorICAgICAgICAiTmF0aXZlTXV4ZXIuY3BwIiwKKyAgICAgICAgIk5hdGl2ZUVuY29kZXIuY3BwIiwKKyAgICAgICAgIk5hdGl2ZURlY29kZXIuY3BwIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19jb21tb24iLAorICAgICAgICAibGlibWVkaWFiZW5jaG1hcmtfZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX211eGVyIiwKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX2RlY29kZXIiLAorICAgICAgICAibGlibWVkaWFiZW5jaG1hcmtfZW5jb2RlciIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL0NNYWtlTGlzdHMudHh0IGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9jcHAvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgyMzg4MwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNDQgQEAKKyMKKyMgQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90CisjIHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mCisjIHRoZSBMaWNlbnNlIGF0CisjCisjIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQKKyMgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiBTZWUgdGhlCisjIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zIHVuZGVyCisjIHRoZSBMaWNlbnNlLgorIworCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMy40LjEpCisKK3NldChuYXRpdmVfc291cmNlX3BhdGggIi4uLy4uLy4uLy4uL3NyYy9uYXRpdmUiKQorc2V0KENNQUtFX0NYWF9GTEFHUyAiJHtDTUFLRV9DWFhfRkxBR1N9IC1XYWxsIC1XZXJyb3IiKQorCithZGRfbGlicmFyeSgKKyAgbWVkaWFiZW5jaG1hcmtfam5pIFNIQVJFRAorICBOYXRpdmVFeHRyYWN0b3IuY3BwCisgIE5hdGl2ZU11eGVyLmNwcAorICBOYXRpdmVEZWNvZGVyLmNwcAorICBOYXRpdmVFbmNvZGVyLmNwcAorICAke25hdGl2ZV9zb3VyY2VfcGF0aH0vY29tbW9uL0JlbmNobWFya0NvbW1vbi5jcHAKKyAgJHtuYXRpdmVfc291cmNlX3BhdGh9L2NvbW1vbi9TdGF0cy5jcHAKKyAgJHtuYXRpdmVfc291cmNlX3BhdGh9L2NvbW1vbi91dGlscy9UaW1lcnMuY3BwCisgICR7bmF0aXZlX3NvdXJjZV9wYXRofS9leHRyYWN0b3IvRXh0cmFjdG9yLmNwcAorICAke25hdGl2ZV9zb3VyY2VfcGF0aH0vbXV4ZXIvTXV4ZXIuY3BwCisgICR7bmF0aXZlX3NvdXJjZV9wYXRofS9kZWNvZGVyL0RlY29kZXIuY3BwCisgICR7bmF0aXZlX3NvdXJjZV9wYXRofS9lbmNvZGVyL0VuY29kZXIuY3BwKQorCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7bmF0aXZlX3NvdXJjZV9wYXRofS9jb21tb24pCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7bmF0aXZlX3NvdXJjZV9wYXRofS9leHRyYWN0b3IpCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7bmF0aXZlX3NvdXJjZV9wYXRofS9tdXhlcikKK2luY2x1ZGVfZGlyZWN0b3JpZXMoJHtuYXRpdmVfc291cmNlX3BhdGh9L2RlY29kZXIpCitpbmNsdWRlX2RpcmVjdG9yaWVzKCR7bmF0aXZlX3NvdXJjZV9wYXRofS9lbmNvZGVyKQorCitmaW5kX2xpYnJhcnkobG9nLWxpYiBsb2cpCisKK3RhcmdldF9saW5rX2xpYnJhcmllcyhtZWRpYWJlbmNobWFya19qbmkgbWVkaWFuZGsgJHtsb2ctbGlifSkKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL05hdGl2ZURlY29kZXIuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9jcHAvTmF0aXZlRGVjb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQzYmM5ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL05hdGl2ZURlY29kZXIuY3BwCkBAIC0wLDAgKzEsMTMwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJOYXRpdmVEZWNvZGVyIgorCisjaW5jbHVkZSA8am5pLmg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorCisjaW5jbHVkZSAiRGVjb2Rlci5oIgorCitleHRlcm4gIkMiIEpOSUVYUE9SVCBpbnQgSk5JQ0FMTCBKYXZhX2NvbV9hbmRyb2lkX21lZGlhX2JlbmNobWFya19saWJyYXJ5X05hdGl2ZV9EZWNvZGUoCisgICAgICAgIEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpzdHJpbmcgakZpbGVQYXRoLCBqc3RyaW5nIGpGaWxlTmFtZSwganN0cmluZyBqU3RhdHNGaWxlLAorICAgICAgICBqc3RyaW5nIGpDb2RlY05hbWUsIGpib29sZWFuIGFzeW5jTW9kZSkgeworICAgIGNvbnN0IGNoYXIgKmZpbGVQYXRoID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqRmlsZVBhdGgsIG51bGxwdHIpOworICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqRmlsZU5hbWUsIG51bGxwdHIpOworICAgIHN0cmluZyBzRmlsZVBhdGggPSBzdHJpbmcoZmlsZVBhdGgpICsgc3RyaW5nKGZpbGVOYW1lKTsKKyAgICBVTlVTRUQodGhpeik7CisgICAgRklMRSAqaW5wdXRGcCA9IGZvcGVuKHNGaWxlUGF0aC5jX3N0cigpLCAicmIiKTsKKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqRmlsZU5hbWUsIGZpbGVOYW1lKTsKKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqRmlsZVBhdGgsIGZpbGVQYXRoKTsKKyAgICBpZiAoIWlucHV0RnApIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBvcGVuIGlucHV0IGZpbGUgZm9yIHJlYWRpbmciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIERlY29kZXIgKmRlY29kZXIgPSBuZXcgRGVjb2RlcigpOworICAgIEV4dHJhY3RvciAqZXh0cmFjdG9yID0gZGVjb2Rlci0+Z2V0RXh0cmFjdG9yKCk7CisgICAgaWYgKCFleHRyYWN0b3IpIHsKKyAgICAgICAgQUxPR0UoIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIFJlYWQgZmlsZSBwcm9wZXJ0aWVzCisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIHN0YXQoc0ZpbGVQYXRoLmNfc3RyKCksICZidWYpOworICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgIGlmIChmaWxlU2l6ZSA+IGtNYXhCdWZmZXJTaXplKSB7CisgICAgICAgIEFMT0dFKCJGaWxlIHNpemUgZ3JlYXRlciB0aGFuIG1heGltdW0gYnVmZmVyIHNpemUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpbnQzMl90IGZkID0gZmlsZW5vKGlucHV0RnApOworICAgIGludDMyX3QgdHJhY2tDb3VudCA9IGV4dHJhY3Rvci0+aW5pdEV4dHJhY3RvcihmZCwgZmlsZVNpemUpOworICAgIGlmICh0cmFja0NvdW50IDw9IDApIHsKKyAgICAgICAgQUxPR0UoImluaXRFeHRyYWN0b3IgZmFpbGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgZm9yIChpbnQgY3VyVHJhY2sgPSAwOyBjdXJUcmFjayA8IHRyYWNrQ291bnQ7IGN1clRyYWNrKyspIHsKKyAgICAgICAgaW50MzJfdCBzdGF0dXMgPSBleHRyYWN0b3ItPnNldHVwVHJhY2tGb3JtYXQoY3VyVHJhY2spOworICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJUcmFjayBGb3JtYXQgaW52YWxpZCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCAqaW5wdXRCdWZmZXIgPSAodWludDhfdCAqKSBtYWxsb2MoZmlsZVNpemUpOworICAgICAgICBpZiAoIWlucHV0QnVmZmVyKSB7CisgICAgICAgICAgICBBTE9HRSgiSW5zdWZmaWNpZW50IG1lbW9yeSIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgdmVjdG9yPEFNZWRpYUNvZGVjQnVmZmVySW5mbz4gZnJhbWVJbmZvOworICAgICAgICBBTWVkaWFDb2RlY0J1ZmZlckluZm8gaW5mbzsKKyAgICAgICAgdWludDMyX3QgaW5wdXRCdWZmZXJPZmZzZXQgPSAwOworCisgICAgICAgIC8vIEdldCBmcmFtZSBkYXRhCisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBleHRyYWN0b3ItPmdldEZyYW1lU2FtcGxlKGluZm8pOworICAgICAgICAgICAgaWYgKHN0YXR1cyB8fCAhaW5mby5zaXplKSBicmVhazsKKyAgICAgICAgICAgIC8vIGNvcHkgdGhlIG1ldGEgZGF0YSBhbmQgYnVmZmVyIHRvIGJlIHBhc3NlZCB0byBkZWNvZGVyCisgICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXJPZmZzZXQgKyBpbmZvLnNpemUgPiBrTWF4QnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJNZW1vcnkgYWxsb2NhdGVkIG5vdCBzdWZmaWNpZW50Iik7CisgICAgICAgICAgICAgICAgZnJlZShpbnB1dEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KGlucHV0QnVmZmVyICsgaW5wdXRCdWZmZXJPZmZzZXQsIGV4dHJhY3Rvci0+Z2V0RnJhbWVCdWYoKSwgaW5mby5zaXplKTsKKyAgICAgICAgICAgIGZyYW1lSW5mby5wdXNoX2JhY2soaW5mbyk7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlck9mZnNldCArPSBpbmZvLnNpemU7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBjaGFyICpjb2RlY05hbWUgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpDb2RlY05hbWUsIG51bGxwdHIpOworICAgICAgICBzdHJpbmcgc0NvZGVjTmFtZSA9IHN0cmluZyhjb2RlY05hbWUpOworICAgICAgICBkZWNvZGVyLT5zZXR1cERlY29kZXIoKTsKKyAgICAgICAgc3RhdHVzID0gZGVjb2Rlci0+ZGVjb2RlKGlucHV0QnVmZmVyLCBmcmFtZUluZm8sIHNDb2RlY05hbWUsIGFzeW5jTW9kZSk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiRGVjb2RlIHJldHVybmVkIGVycm9yIik7CisgICAgICAgICAgICBmcmVlKGlucHV0QnVmZmVyKTsKKyAgICAgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpDb2RlY05hbWUsIGNvZGVjTmFtZSk7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgZGVjb2Rlci0+ZGVJbml0Q29kZWMoKTsKKyAgICAgICAgY29uc3QgY2hhciAqaW5wdXRSZWZlcmVuY2UgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpGaWxlTmFtZSwgbnVsbHB0cik7CisgICAgICAgIGNvbnN0IGNoYXIgKnN0YXRzRmlsZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoalN0YXRzRmlsZSwgbnVsbHB0cik7CisgICAgICAgIHN0cmluZyBzSW5wdXRSZWZlcmVuY2UgPSBzdHJpbmcoaW5wdXRSZWZlcmVuY2UpOworICAgICAgICBkZWNvZGVyLT5kdW1wU3RhdGlzdGljcyhzSW5wdXRSZWZlcmVuY2UsIHNDb2RlY05hbWUsIChhc3luY01vZGUgPyAiYXN5bmMiIDogInN5bmMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHNGaWxlKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoakNvZGVjTmFtZSwgY29kZWNOYW1lKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoalN0YXRzRmlsZSwgc3RhdHNGaWxlKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoakZpbGVOYW1lLCBpbnB1dFJlZmVyZW5jZSk7CisgICAgICAgIGlmIChpbnB1dEJ1ZmZlcikgeworICAgICAgICAgICAgZnJlZShpbnB1dEJ1ZmZlcik7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgZGVjb2Rlci0+cmVzZXREZWNvZGVyKCk7CisgICAgfQorICAgIGlmIChpbnB1dEZwKSB7CisgICAgICAgIGZjbG9zZShpbnB1dEZwKTsKKyAgICAgICAgaW5wdXRGcCA9IG51bGxwdHI7CisgICAgfQorICAgIGV4dHJhY3Rvci0+ZGVJbml0RXh0cmFjdG9yKCk7CisgICAgZGVsZXRlIGRlY29kZXI7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2NwcC9OYXRpdmVFbmNvZGVyLmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL05hdGl2ZUVuY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNzdjOGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2NwcC9OYXRpdmVFbmNvZGVyLmNwcApAQCAtMCwwICsxLDIxOCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmF0aXZlRW5jb2RlciIKKworI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisKKyNpbmNsdWRlICJEZWNvZGVyLmgiCisjaW5jbHVkZSAiRW5jb2Rlci5oIgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKworY29uc3RleHByIGludDMyX3QgRU5DT0RFX0RFRkFVTFRfRlJBTUVfUkFURSA9IDI1OworY29uc3RleHByIGludDMyX3QgRU5DT0RFX0RFRkFVTFRfQVVESU9fQklUX1JBVEUgPSAxMjgwMDAgLyogMTI4IEticHMgKi87Citjb25zdGV4cHIgaW50MzJfdCBFTkNPREVfREVGQVVMVF9CSVRfUkFURSA9IDgwMDAwMDAgLyogOCBNYnBzICovOworY29uc3RleHByIGludDMyX3QgRU5DT0RFX01JTl9CSVRfUkFURSA9IDYwMDAwMCAvKiA2MDAgS2JwcyAqLzsKKworZXh0ZXJuICJDIiBKTklFWFBPUlQgaW50IEpOSUNBTEwgSmF2YV9jb21fYW5kcm9pZF9tZWRpYV9iZW5jaG1hcmtfbGlicmFyeV9OYXRpdmVfRW5jb2RlKAorICAgICAgICBKTklFbnYgKmVudiwgam9iamVjdCB0aGl6LCBqc3RyaW5nIGpGaWxlUGF0aCwganN0cmluZyBqRmlsZU5hbWUsIGpzdHJpbmcgak91dEZpbGVQYXRoLAorICAgICAgICBqc3RyaW5nIGpTdGF0c0ZpbGUsIGpzdHJpbmcgakNvZGVjTmFtZSkgeworICAgIGNvbnN0IGNoYXIgKmZpbGVQYXRoID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqRmlsZVBhdGgsIG51bGxwdHIpOworICAgIGNvbnN0IGNoYXIgKmZpbGVOYW1lID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqRmlsZU5hbWUsIG51bGxwdHIpOworICAgIHN0cmluZyBzRmlsZVBhdGggPSBzdHJpbmcoZmlsZVBhdGgpICsgc3RyaW5nKGZpbGVOYW1lKTsKKyAgICBVTlVTRUQodGhpeik7CisgICAgRklMRSAqaW5wdXRGcCA9IGZvcGVuKHNGaWxlUGF0aC5jX3N0cigpLCAicmIiKTsKKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqRmlsZU5hbWUsIGZpbGVOYW1lKTsKKyAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqRmlsZVBhdGgsIGZpbGVQYXRoKTsKKyAgICBpZiAoIWlucHV0RnApIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBvcGVuIGlucHV0IGZpbGUgZm9yIHJlYWRpbmciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIERlY29kZXIgKmRlY29kZXIgPSBuZXcgRGVjb2RlcigpOworICAgIEV4dHJhY3RvciAqZXh0cmFjdG9yID0gZGVjb2Rlci0+Z2V0RXh0cmFjdG9yKCk7CisgICAgaWYgKCFleHRyYWN0b3IpIHsKKyAgICAgICAgQUxPR0UoIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vIFJlYWQgZmlsZSBwcm9wZXJ0aWVzCisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIHN0YXQoc0ZpbGVQYXRoLmNfc3RyKCksICZidWYpOworICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgIGlmIChmaWxlU2l6ZSA+IGtNYXhCdWZmZXJTaXplKSB7CisgICAgICAgIEFMT0dFKCJGaWxlIHNpemUgZ3JlYXRlciB0aGFuIG1heGltdW0gYnVmZmVyIHNpemUiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBpbnQzMl90IGZkID0gZmlsZW5vKGlucHV0RnApOworICAgIGludDMyX3QgdHJhY2tDb3VudCA9IGV4dHJhY3Rvci0+aW5pdEV4dHJhY3RvcihmZCwgZmlsZVNpemUpOworICAgIGlmICh0cmFja0NvdW50IDw9IDApIHsKKyAgICAgICAgQUxPR0UoImluaXRFeHRyYWN0b3IgZmFpbGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBmb3IgKGludCBjdXJUcmFjayA9IDA7IGN1clRyYWNrIDwgdHJhY2tDb3VudDsgY3VyVHJhY2srKykgeworICAgICAgICBpbnQzMl90IHN0YXR1cyA9IGV4dHJhY3Rvci0+c2V0dXBUcmFja0Zvcm1hdChjdXJUcmFjayk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIlRyYWNrIEZvcm1hdCBpbnZhbGlkIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgdWludDhfdCAqaW5wdXRCdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhmaWxlU2l6ZSk7CisgICAgICAgIGlmICghaW5wdXRCdWZmZXIpIHsKKyAgICAgICAgICAgIEFMT0dFKCJJbnN1ZmZpY2llbnQgbWVtb3J5Iik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgdmVjdG9yPEFNZWRpYUNvZGVjQnVmZmVySW5mbz4gZnJhbWVJbmZvOworICAgICAgICBBTWVkaWFDb2RlY0J1ZmZlckluZm8gaW5mbzsKKyAgICAgICAgdWludDMyX3QgaW5wdXRCdWZmZXJPZmZzZXQgPSAwOworCisgICAgICAgIC8vIEdldCBmcmFtZSBkYXRhCisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBleHRyYWN0b3ItPmdldEZyYW1lU2FtcGxlKGluZm8pOworICAgICAgICAgICAgaWYgKHN0YXR1cyB8fCAhaW5mby5zaXplKSBicmVhazsKKyAgICAgICAgICAgIC8vIGNvcHkgdGhlIG1ldGEgZGF0YSBhbmQgYnVmZmVyIHRvIGJlIHBhc3NlZCB0byBkZWNvZGVyCisgICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXJPZmZzZXQgKyBpbmZvLnNpemUgPiBrTWF4QnVmZmVyU2l6ZSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJNZW1vcnkgYWxsb2NhdGVkIG5vdCBzdWZmaWNpZW50Iik7CisgICAgICAgICAgICAgICAgZnJlZShpbnB1dEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbWVtY3B5KGlucHV0QnVmZmVyICsgaW5wdXRCdWZmZXJPZmZzZXQsIGV4dHJhY3Rvci0+Z2V0RnJhbWVCdWYoKSwgaW5mby5zaXplKTsKKyAgICAgICAgICAgIGZyYW1lSW5mby5wdXNoX2JhY2soaW5mbyk7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlck9mZnNldCArPSBpbmZvLnNpemU7CisgICAgICAgIH0KKyAgICAgICAgc3RyaW5nIGRlY05hbWUgPSAiIjsKKyAgICAgICAgY29uc3QgY2hhciAqb3V0cHV0RmlsZVBhdGggPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpPdXRGaWxlUGF0aCwgbnVsbHB0cik7CisgICAgICAgIEZJTEUgKm91dEZwID0gZm9wZW4ob3V0cHV0RmlsZVBhdGgsICJ3YiIpOworICAgICAgICBpZiAob3V0RnAgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzIC0gRmlsZSBmYWlsZWQgdG8gb3BlbiBmb3Igd3JpdGluZyEiLCBvdXRwdXRGaWxlUGF0aCk7CisgICAgICAgICAgICBmcmVlKGlucHV0QnVmZmVyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBkZWNvZGVyLT5zZXR1cERlY29kZXIoKTsKKyAgICAgICAgc3RhdHVzID0gZGVjb2Rlci0+ZGVjb2RlKGlucHV0QnVmZmVyLCBmcmFtZUluZm8sIGRlY05hbWUsIGZhbHNlIC8qYXN5bmNNb2RlICovLCBvdXRGcCk7CisgICAgICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgICAgICBBTE9HRSgiRGVjb2RlIHJldHVybmVkIGVycm9yIik7CisgICAgICAgICAgICBmcmVlKGlucHV0QnVmZmVyKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZGVjb2RlckZvcm1hdCA9IGRlY29kZXItPmdldEZvcm1hdCgpOworICAgICAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCA9IGV4dHJhY3Rvci0+Z2V0Rm9ybWF0KCk7CisgICAgICAgIGlmIChpbnB1dEJ1ZmZlcikgeworICAgICAgICAgICAgZnJlZShpbnB1dEJ1ZmZlcik7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgY2hhciAqbWltZSA9IG51bGxwdHI7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKKyAgICAgICAgaWYgKCFtaW1lKSB7CisgICAgICAgICAgICBBTE9HRSgiRXJyb3IgaW4gQU1lZGlhRm9ybWF0X2dldFN0cmluZyIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGlmc3RyZWFtIGVsZVN0cmVhbTsKKyAgICAgICAgZWxlU3RyZWFtLm9wZW4ob3V0cHV0RmlsZVBhdGgsIGlmc3RyZWFtOjpiaW5hcnkgfCBpZnN0cmVhbTo6YXRlKTsKKyAgICAgICAgaWYgKCFlbGVTdHJlYW0uaXNfb3BlbigpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMgLSBGaWxlIGZhaWxlZCB0byBvcGVuIGZvciByZWFkaW5nISIsIG91dHB1dEZpbGVQYXRoKTsKKyAgICAgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpPdXRGaWxlUGF0aCwgb3V0cHV0RmlsZVBhdGgpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGNvbnN0IGNoYXIgKmNvZGVjTmFtZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoakNvZGVjTmFtZSwgTlVMTCk7CisgICAgICAgIGNvbnN0IGNoYXIgKmlucHV0UmVmZXJlbmNlID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqRmlsZU5hbWUsIG51bGxwdHIpOworICAgICAgICBzdHJpbmcgc0NvZGVjTmFtZSA9IHN0cmluZyhjb2RlY05hbWUpOworICAgICAgICBzdHJpbmcgc0lucHV0UmVmZXJlbmNlID0gc3RyaW5nKGlucHV0UmVmZXJlbmNlKTsKKworICAgICAgICBib29sIGFzeW5jTW9kZVsyXSA9IHt0cnVlLCBmYWxzZX07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7CisgICAgICAgICAgICBzaXplX3QgZWxlU2l6ZSA9IGVsZVN0cmVhbS50ZWxsZygpOworICAgICAgICAgICAgZWxlU3RyZWFtLnNlZWtnKDAsIGlmc3RyZWFtOjpiZWcpOworCisgICAgICAgICAgICAvLyBHZXQgZW5jb2RlciBwYXJhbXMKKyAgICAgICAgICAgIGVuY1BhcmFtZXRlciBlbmNQYXJhbXM7CisgICAgICAgICAgICBpZiAoIXN0cm5jbXAobWltZSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9XSURUSCwgJmVuY1BhcmFtcy53aWR0aCk7CisgICAgICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9IRUlHSFQsICZlbmNQYXJhbXMuaGVpZ2h0KTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUsICZlbmNQYXJhbXMuZnJhbWVSYXRlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCAmZW5jUGFyYW1zLmJpdHJhdGUpOworICAgICAgICAgICAgICAgIGlmIChlbmNQYXJhbXMuYml0cmF0ZSA8PSAwIHx8IGVuY1BhcmFtcy5mcmFtZVJhdGUgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICBlbmNQYXJhbXMuZnJhbWVSYXRlID0gRU5DT0RFX0RFRkFVTFRfRlJBTUVfUkFURTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHJjbXAobWltZSwgInZpZGVvLzNncHAiKSB8fCAhc3RyY21wKG1pbWUsICJ2aWRlby9tcDR2LWVzIikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY1BhcmFtcy5iaXRyYXRlID0gRU5DT0RFX01JTl9CSVRfUkFURSAvKiA2MDAgS2JwcyAqLzsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuY1BhcmFtcy5iaXRyYXRlID0gRU5DT0RFX0RFRkFVTFRfQklUX1JBVEUgLyogOCBNYnBzICovOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfUFJPRklMRSwgJmVuY1BhcmFtcy5wcm9maWxlKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0xFVkVMLCAmZW5jUGFyYW1zLmxldmVsKTsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZGVjb2RlckZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DT0xPUl9GT1JNQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNQYXJhbXMuY29sb3JGb3JtYXQpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLCAmZW5jUGFyYW1zLnNhbXBsZVJhdGUpOworICAgICAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuY1BhcmFtcy5udW1DaGFubmVscyk7CisgICAgICAgICAgICAgICAgZW5jUGFyYW1zLmJpdHJhdGUgPSBFTkNPREVfREVGQVVMVF9BVURJT19CSVRfUkFURTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEVuY29kZXIgKmVuY29kZXIgPSBuZXcgRW5jb2RlcigpOworICAgICAgICAgICAgZW5jb2Rlci0+c2V0dXBFbmNvZGVyKCk7CisgICAgICAgICAgICBzdGF0dXMgPSBlbmNvZGVyLT5lbmNvZGUoc0NvZGVjTmFtZSwgZWxlU3RyZWFtLCBlbGVTaXplLCBhc3luY01vZGVbaV0sIGVuY1BhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciAqKW1pbWUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRW5jb2RlciByZXR1cm5lZCBlcnJvciIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCJFbmNvZGluZyBjb21wbGV0ZSB3aXRoIGNvZGVjICVzIGZvciBhc3luY01vZGUgPSAlZCIsIHNDb2RlY05hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgIGFzeW5jTW9kZVtpXSk7CisgICAgICAgICAgICBlbmNvZGVyLT5kZUluaXRDb2RlYygpOworICAgICAgICAgICAgY29uc3QgY2hhciAqc3RhdHNGaWxlID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqU3RhdHNGaWxlLCBudWxscHRyKTsKKyAgICAgICAgICAgIGVuY29kZXItPmR1bXBTdGF0aXN0aWNzKHNJbnB1dFJlZmVyZW5jZSwgZXh0cmFjdG9yLT5nZXRDbGlwRHVyYXRpb24oKSwgc0NvZGVjTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhc3luY01vZGVbaV0gPyAiYXN5bmMiIDogInN5bmMiKSwgc3RhdHNGaWxlKTsKKyAgICAgICAgICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpTdGF0c0ZpbGUsIHN0YXRzRmlsZSk7CisgICAgICAgICAgICBlbmNvZGVyLT5yZXNldEVuY29kZXIoKTsKKyAgICAgICAgICAgIGRlbGV0ZSBlbmNvZGVyOworICAgICAgICAgICAgZW5jb2RlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgZWxlU3RyZWFtLmNsb3NlKCk7CisgICAgICAgIGlmIChvdXRGcCkgeworICAgICAgICAgICAgZmNsb3NlKG91dEZwKTsKKyAgICAgICAgICAgIG91dEZwID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqRmlsZU5hbWUsIGlucHV0UmVmZXJlbmNlKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoakNvZGVjTmFtZSwgY29kZWNOYW1lKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoak91dEZpbGVQYXRoLCBvdXRwdXRGaWxlUGF0aCk7CisgICAgICAgIGlmIChmb3JtYXQpIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZm9ybWF0KTsKKyAgICAgICAgICAgIGZvcm1hdCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRlY29kZXJGb3JtYXQpIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZGVjb2RlckZvcm1hdCk7CisgICAgICAgICAgICBkZWNvZGVyRm9ybWF0ID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBkZWNvZGVyLT5kZUluaXRDb2RlYygpOworICAgICAgICBkZWNvZGVyLT5yZXNldERlY29kZXIoKTsKKyAgICB9CisgICAgaWYgKGlucHV0RnApIHsKKyAgICAgICAgZmNsb3NlKGlucHV0RnApOworICAgICAgICBpbnB1dEZwID0gbnVsbHB0cjsKKyAgICB9CisgICAgZXh0cmFjdG9yLT5kZUluaXRFeHRyYWN0b3IoKTsKKyAgICBkZWxldGUgZGVjb2RlcjsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL05hdGl2ZUV4dHJhY3Rvci5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2NwcC9OYXRpdmVFeHRyYWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3NjI3NjAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2NwcC9OYXRpdmVFeHRyYWN0b3IuY3BwCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIk5hdGl2ZUV4dHJhY3RvciIKKworI2luY2x1ZGUgPGpuaS5oPgorI2luY2x1ZGUgPGZzdHJlYW0+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlICJFeHRyYWN0b3IuaCIKKworZXh0ZXJuICJDIiBKTklFWFBPUlQgaW50MzJfdCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfbWVkaWFfYmVuY2htYXJrX2xpYnJhcnlfTmF0aXZlX0V4dHJhY3QoCisgICAgICAgIEpOSUVudiAqZW52LCBqb2JqZWN0IHRoaXosIGpzdHJpbmcgaklucHV0RmlsZVBhdGgsIGpzdHJpbmcgaklucHV0RmlsZU5hbWUsCisgICAgICAgIGpzdHJpbmcgalN0YXRzRmlsZSkgeworICAgIFVOVVNFRCh0aGl6KTsKKyAgICBjb25zdCBjaGFyICppbnB1dEZpbGVQYXRoID0gZW52LT5HZXRTdHJpbmdVVEZDaGFycyhqSW5wdXRGaWxlUGF0aCwgbnVsbHB0cik7CisgICAgY29uc3QgY2hhciAqaW5wdXRGaWxlTmFtZSA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoaklucHV0RmlsZU5hbWUsIG51bGxwdHIpOworICAgIHN0cmluZyBzRmlsZVBhdGggPSBzdHJpbmcoaW5wdXRGaWxlUGF0aCkgKyBzdHJpbmcoaW5wdXRGaWxlTmFtZSk7CisgICAgRklMRSAqaW5wdXRGcCA9IGZvcGVuKHNGaWxlUGF0aC5jX3N0cigpLCAicmIiKTsKKworICAgIC8vIFJlYWQgZmlsZSBwcm9wZXJ0aWVzCisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIHN0YXQoc0ZpbGVQYXRoLmNfc3RyKCksICZidWYpOworICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgIGludDMyX3QgZmQgPSBmaWxlbm8oaW5wdXRGcCk7CisKKyAgICBFeHRyYWN0b3IgKmV4dHJhY3RPYmogPSBuZXcgRXh0cmFjdG9yKCk7CisgICAgaW50MzJfdCB0cmFja0NvdW50ID0gZXh0cmFjdE9iai0+aW5pdEV4dHJhY3RvcigobG9uZykgZmQsIGZpbGVTaXplKTsKKyAgICBpZiAodHJhY2tDb3VudCA8PSAwKSB7CisgICAgICAgIEFMT0dFKCJpbml0RXh0cmFjdG9yIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaW50MzJfdCB0cmFja0lEID0gMDsKKyAgICBjb25zdCBjaGFyICptaW1lID0gbnVsbHB0cjsKKyAgICBpbnQzMl90IHN0YXR1cyA9IGV4dHJhY3RPYmotPmV4dHJhY3QodHJhY2tJRCk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHsKKyAgICAgICAgQUxPR0UoIkV4dHJhY3Rpb24gZmFpbGVkIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBpZiAoaW5wdXRGcCkgeworICAgICAgICBmY2xvc2UoaW5wdXRGcCk7CisgICAgICAgIGlucHV0RnAgPSBudWxscHRyOworICAgIH0KKyAgICBzdGF0dXMgPSBleHRyYWN0T2JqLT5zZXR1cFRyYWNrRm9ybWF0KHRyYWNrSUQpOworICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0ID0gZXh0cmFjdE9iai0+Z2V0Rm9ybWF0KCk7CisgICAgaWYgKCFmb3JtYXQpIHsKKyAgICAgICAgQUxPR0UoImZvcm1hdCBpcyBudWxsISIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKKyAgICBpZiAoIW1pbWUpIHsKKyAgICAgICAgQUxPR0UoIm1pbWUgaXMgbnVsbCEiKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBleHRyYWN0T2JqLT5kZUluaXRFeHRyYWN0b3IoKTsKKyAgICBjb25zdCBjaGFyICpzdGF0c0ZpbGUgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpTdGF0c0ZpbGUsIG51bGxwdHIpOworICAgIGV4dHJhY3RPYmotPmR1bXBTdGF0aXN0aWNzKHN0cmluZyhpbnB1dEZpbGVOYW1lKSwgc3RyaW5nKG1pbWUpLCBzdGF0c0ZpbGUpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpTdGF0c0ZpbGUsIHN0YXRzRmlsZSk7CisgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoaklucHV0RmlsZVBhdGgsIGlucHV0RmlsZVBhdGgpOworICAgIGVudi0+UmVsZWFzZVN0cmluZ1VURkNoYXJzKGpJbnB1dEZpbGVOYW1lLCBpbnB1dEZpbGVOYW1lKTsKKworICAgIGRlbGV0ZSBleHRyYWN0T2JqOworICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2NwcC9OYXRpdmVNdXhlci5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2NwcC9OYXRpdmVNdXhlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTVlZjViOAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vY3BwL05hdGl2ZU11eGVyLmNwcApAQCAtMCwwICsxLDE4NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiTmF0aXZlTXV4ZXIiCisKKyNpbmNsdWRlIDxqbmkuaD4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSAiTXV4ZXIuaCIKKworTVVYRVJfT1VUUFVUX1QgZ2V0TXV4ZXJPdXRGb3JtYXQoY29uc3QgY2hhciAqZm10KTsKKworZXh0ZXJuICJDIiBKTklFWFBPUlQgaW50MzJfdCBKTklDQUxMIEphdmFfY29tX2FuZHJvaWRfbWVkaWFfYmVuY2htYXJrX2xpYnJhcnlfTmF0aXZlX011eCgKKyAgICAgICAgSk5JRW52ICplbnYsIGpvYmplY3QgdGhpeiwganN0cmluZyBqSW5wdXRGaWxlUGF0aCwganN0cmluZyBqSW5wdXRGaWxlTmFtZSwKKyAgICAgICAganN0cmluZyBqT3V0cHV0RmlsZVBhdGgsIGpzdHJpbmcgalN0YXRzRmlsZSwganN0cmluZyBqRm9ybWF0KSB7CisgICAgVU5VU0VEKHRoaXopOworICAgIEFMT0dWKCJNdXggdGhlIHNhbXBsZXMgZ2l2ZW4gYnkgZXh0cmFjdG9yIik7CisgICAgY29uc3QgY2hhciAqaW5wdXRGaWxlUGF0aCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoaklucHV0RmlsZVBhdGgsIG51bGxwdHIpOworICAgIGNvbnN0IGNoYXIgKmlucHV0RmlsZU5hbWUgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpJbnB1dEZpbGVOYW1lLCBudWxscHRyKTsKKyAgICBzdHJpbmcgc0lucHV0RmlsZSA9IHN0cmluZyhpbnB1dEZpbGVQYXRoKSArIHN0cmluZyhpbnB1dEZpbGVOYW1lKTsKKyAgICBGSUxFICppbnB1dEZwID0gZm9wZW4oc0lucHV0RmlsZS5jX3N0cigpLCAicmIiKTsKKyAgICBpZiAoIWlucHV0RnApIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBvcGVuIGlucHV0IGZpbGUgZm9yIHJlYWRpbmciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIGNvbnN0IGNoYXIgKmZtdCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoakZvcm1hdCwgbnVsbHB0cik7CisgICAgTVVYRVJfT1VUUFVUX1Qgb3V0cHV0Rm9ybWF0ID0gZ2V0TXV4ZXJPdXRGb3JtYXQoZm10KTsKKyAgICBpZiAob3V0cHV0Rm9ybWF0ID09IE1VWEVSX09VVFBVVF9GT1JNQVRfSU5WQUxJRCkgeworICAgICAgICBBTE9HRSgib3V0cHV0IGZvcm1hdCBpcyBNVVhFUl9PVVRQVVRfRk9STUFUX0lOVkFMSUQiKTsKKyAgICAgICAgcmV0dXJuIE1VWEVSX09VVFBVVF9GT1JNQVRfSU5WQUxJRDsKKyAgICB9CisKKyAgICBNdXhlciAqbXV4ZXJPYmogPSBuZXcgTXV4ZXIoKTsKKyAgICBFeHRyYWN0b3IgKmV4dHJhY3RvciA9IG11eGVyT2JqLT5nZXRFeHRyYWN0b3IoKTsKKyAgICBpZiAoIWV4dHJhY3RvcikgeworICAgICAgICBBTE9HRSgiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8gUmVhZCBmaWxlIHByb3BlcnRpZXMKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgc3RhdChzSW5wdXRGaWxlLmNfc3RyKCksICZidWYpOworICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgIGludDMyX3QgZmQgPSBmaWxlbm8oaW5wdXRGcCk7CisKKyAgICBpbnQzMl90IHRyYWNrQ291bnQgPSBleHRyYWN0b3ItPmluaXRFeHRyYWN0b3IoZmQsIGZpbGVTaXplKTsKKyAgICBpZiAodHJhY2tDb3VudCA8PSAwKSB7CisgICAgICAgIEFMT0dFKCJpbml0RXh0cmFjdG9yIGZhaWxlZCIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgZm9yIChpbnQgY3VyVHJhY2sgPSAwOyBjdXJUcmFjayA8IHRyYWNrQ291bnQ7IGN1clRyYWNrKyspIHsKKyAgICAgICAgaW50MzJfdCBzdGF0dXMgPSBleHRyYWN0b3ItPnNldHVwVHJhY2tGb3JtYXQoY3VyVHJhY2spOworICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJUcmFjayBGb3JtYXQgaW52YWxpZCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgdWludDhfdCAqaW5wdXRCdWZmZXIgPSAodWludDhfdCAqKSBtYWxsb2MoZmlsZVNpemUpOworICAgICAgICBpZiAoIWlucHV0QnVmZmVyKSB7CisgICAgICAgICAgICBBTE9HRSgiQWxsb2NhdGlvbiBGYWlsZWQiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICB2ZWN0b3I8QU1lZGlhQ29kZWNCdWZmZXJJbmZvPiBmcmFtZUluZm9zOworICAgICAgICBBTWVkaWFDb2RlY0J1ZmZlckluZm8gaW5mbzsKKyAgICAgICAgdWludDMyX3QgaW5wdXRCdWZmZXJPZmZzZXQgPSAwOworCisgICAgICAgIC8vIEdldCBGcmFtZSBEYXRhCisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBleHRyYWN0b3ItPmdldEZyYW1lU2FtcGxlKGluZm8pOworICAgICAgICAgICAgaWYgKHN0YXR1cyB8fCAhaW5mby5zaXplKSBicmVhazsKKyAgICAgICAgICAgIC8vIGNvcHkgdGhlIG1ldGEgZGF0YSBhbmQgYnVmZmVyIHRvIGJlIHBhc3NlZCB0byBtdXhlcgorICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyT2Zmc2V0ICsgaW5mby5zaXplID4gZmlsZVNpemUpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiTWVtb3J5IGFsbG9jYXRlZCBub3Qgc3VmZmljaWVudCIpOworICAgICAgICAgICAgICAgIGlmIChpbnB1dEJ1ZmZlcikgeworICAgICAgICAgICAgICAgICAgICBmcmVlKGlucHV0QnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkoaW5wdXRCdWZmZXIgKyBpbnB1dEJ1ZmZlck9mZnNldCwgZXh0cmFjdG9yLT5nZXRGcmFtZUJ1ZigpLAorICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4oaW5mby5zaXplKSk7CisgICAgICAgICAgICBpbmZvLm9mZnNldCA9IGlucHV0QnVmZmVyT2Zmc2V0OworICAgICAgICAgICAgZnJhbWVJbmZvcy5wdXNoX2JhY2soaW5mbyk7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlck9mZnNldCArPSBpbmZvLnNpemU7CisgICAgICAgIH0KKworICAgICAgICBjb25zdCBjaGFyICpvdXRwdXRGaWxlUGF0aCA9IGVudi0+R2V0U3RyaW5nVVRGQ2hhcnMoak91dHB1dEZpbGVQYXRoLCBudWxscHRyKTsKKyAgICAgICAgRklMRSAqb3V0cHV0RnAgPSBmb3BlbigoKHN0cmluZykgb3V0cHV0RmlsZVBhdGgpLmNfc3RyKCksICJ3K2IiKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoak91dHB1dEZpbGVQYXRoLCBvdXRwdXRGaWxlUGF0aCk7CisKKyAgICAgICAgaWYgKCFvdXRwdXRGcCkgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBvcGVuIG91dHB1dCBmaWxlIGZvciB3cml0aW5nIik7CisgICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBmcmVlKGlucHV0QnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaW50MzJfdCBvdXRGZCA9IGZpbGVubyhvdXRwdXRGcCk7CisKKyAgICAgICAgc3RhdHVzID0gbXV4ZXJPYmotPmluaXRNdXhlcihvdXRGZCwgKE1VWEVSX09VVFBVVF9UKSBvdXRwdXRGb3JtYXQpOworICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJpbml0TXV4ZXIgZmFpbGVkIik7CisgICAgICAgICAgICBpZiAoaW5wdXRCdWZmZXIpIHsKKyAgICAgICAgICAgICAgICBmcmVlKGlucHV0QnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICBzdGF0dXMgPSBtdXhlck9iai0+bXV4KGlucHV0QnVmZmVyLCBmcmFtZUluZm9zKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICBBTE9HRSgiTXV4IGZhaWxlZCIpOworICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVyKSB7CisgICAgICAgICAgICAgICAgZnJlZShpbnB1dEJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaW5wdXRCdWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG11eGVyT2JqLT5kZUluaXRNdXhlcigpOworICAgICAgICBjb25zdCBjaGFyICpzdGF0c0ZpbGUgPSBlbnYtPkdldFN0cmluZ1VURkNoYXJzKGpTdGF0c0ZpbGUsIG51bGxwdHIpOworICAgICAgICBzdHJpbmcgbXV4Rm9ybWF0KGZtdCk7CisgICAgICAgIG11eGVyT2JqLT5kdW1wU3RhdGlzdGljcyhzdHJpbmcoaW5wdXRGaWxlTmFtZSksIG11eEZvcm1hdCwgc3RhdHNGaWxlKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoalN0YXRzRmlsZSwgc3RhdHNGaWxlKTsKKyAgICAgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoaklucHV0RmlsZVBhdGgsIGlucHV0RmlsZVBhdGgpOworICAgICAgICBlbnYtPlJlbGVhc2VTdHJpbmdVVEZDaGFycyhqSW5wdXRGaWxlTmFtZSwgaW5wdXRGaWxlTmFtZSk7CisKKyAgICAgICAgaWYgKGlucHV0QnVmZmVyKSB7CisgICAgICAgICAgICBmcmVlKGlucHV0QnVmZmVyKTsKKyAgICAgICAgICAgIGlucHV0QnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBpZiAob3V0cHV0RnApIHsKKyAgICAgICAgICAgIGZjbG9zZShvdXRwdXRGcCk7CisgICAgICAgICAgICBvdXRwdXRGcCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgbXV4ZXJPYmotPnJlc2V0TXV4ZXIoKTsKKyAgICB9CisgICAgaWYgKGlucHV0RnApIHsKKyAgICAgICAgZmNsb3NlKGlucHV0RnApOworICAgICAgICBpbnB1dEZwID0gbnVsbHB0cjsKKyAgICB9CisgICAgZW52LT5SZWxlYXNlU3RyaW5nVVRGQ2hhcnMoakZvcm1hdCwgZm10KTsKKyAgICBleHRyYWN0b3ItPmRlSW5pdEV4dHJhY3RvcigpOworICAgIGRlbGV0ZSBtdXhlck9iajsKKworICAgIHJldHVybiAwOworfQorCitNVVhFUl9PVVRQVVRfVCBnZXRNdXhlck91dEZvcm1hdChjb25zdCBjaGFyICpmbXQpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RydWN0IHsKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZTsKKyAgICAgICAgaW50IHZhbHVlOworICAgIH0ga0Zvcm1hdE1hcHNbXSA9IHt7Im1wNCIsICBNVVhFUl9PVVRQVVRfRk9STUFUX01QRUdfNH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsid2VibSIsIE1VWEVSX09VVFBVVF9GT1JNQVRfV0VCTX0sCisgICAgICAgICAgICAgICAgICAgICAgIHsiM2dwcCIsIE1VWEVSX09VVFBVVF9GT1JNQVRfM0dQUH0sCisgICAgICAgICAgICAgICAgICAgICAgIHsib2dnIiwgIE1VWEVSX09VVFBVVF9GT1JNQVRfT0dHfX07CisKKyAgICBpbnQzMl90IG11eE91dHB1dEZvcm1hdCA9IE1VWEVSX09VVFBVVF9GT1JNQVRfSU5WQUxJRDsKKyAgICBmb3IgKGF1dG8ga0Zvcm1hdE1hcCA6IGtGb3JtYXRNYXBzKSB7CisgICAgICAgIGlmICghc3RyY21wKGZtdCwga0Zvcm1hdE1hcC5uYW1lKSkgeworICAgICAgICAgICAgbXV4T3V0cHV0Rm9ybWF0ID0ga0Zvcm1hdE1hcC52YWx1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAoTVVYRVJfT1VUUFVUX1QpIG11eE91dHB1dEZvcm1hdDsKK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvbGlicmFyeS9Db2RlY1V0aWxzLmphdmEgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvQ29kZWNVdGlscy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4MDM1YzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvQ29kZWNVdGlscy5qYXZhCkBAIC0wLDAgKzEsMzkgQEAKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLmxpYnJhcnk7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWNJbmZvOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlY0xpc3Q7CitpbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKKworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK3B1YmxpYyBjbGFzcyBDb2RlY1V0aWxzIHsKKyAgICBwcml2YXRlIENvZGVjVXRpbHMoKSB7fQorCisgICAgLyoqCisgICAgICogUXVlcmllcyB0aGUgTWVkaWFDb2RlY0xpc3QgYW5kIHJldHVybnMgY29kZWMgbmFtZXMgb2Ygc3VwcG9ydGVkIGNvZGVjcy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBtaW1lVHlwZSAgTWltZSB0eXBlIG9mIGlucHV0CisgICAgICogQHBhcmFtIGlzRW5jb2RlciBTcGVjaWZpZXMgZW5jb2RlciBvciBkZWNvZGVyCisgICAgICogQHJldHVybiBBcnJheUxpc3Qgb2YgY29kZWMgbmFtZXMKKyAgICAgKi8KKyAgICBwdWJsaWMgc3RhdGljIEFycmF5TGlzdDxTdHJpbmc+IHNlbGVjdENvZGVjcyhTdHJpbmcgbWltZVR5cGUsIGJvb2xlYW4gaXNFbmNvZGVyKSB7CisgICAgICAgIE1lZGlhQ29kZWNMaXN0IGNvZGVjTGlzdCA9IG5ldyBNZWRpYUNvZGVjTGlzdChNZWRpYUNvZGVjTGlzdC5SRUdVTEFSX0NPREVDUyk7CisgICAgICAgIE1lZGlhQ29kZWNJbmZvW10gY29kZWNJbmZvcyA9IGNvZGVjTGlzdC5nZXRDb2RlY0luZm9zKCk7CisgICAgICAgIEFycmF5TGlzdDxTdHJpbmc+IHN1cHBvcnRlZENvZGVjcyA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBmb3IgKE1lZGlhQ29kZWNJbmZvIGNvZGVjSW5mbyA6IGNvZGVjSW5mb3MpIHsKKyAgICAgICAgICAgIGlmIChpc0VuY29kZXIgIT0gY29kZWNJbmZvLmlzRW5jb2RlcigpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoQnVpbGQuVkVSU0lPTi5TREtfSU5UID49IEJ1aWxkLlZFUlNJT05fQ09ERVMuUSAmJiBjb2RlY0luZm8uaXNBbGlhcygpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmdbXSB0eXBlcyA9IGNvZGVjSW5mby5nZXRTdXBwb3J0ZWRUeXBlcygpOworICAgICAgICAgICAgZm9yIChTdHJpbmcgdHlwZSA6IHR5cGVzKSB7CisgICAgICAgICAgICAgICAgaWYgKHR5cGUuZXF1YWxzSWdub3JlQ2FzZShtaW1lVHlwZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkQ29kZWNzLmFkZChjb2RlY0luZm8uZ2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHN1cHBvcnRlZENvZGVjczsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvRGVjb2Rlci5qYXZhIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay9saWJyYXJ5L0RlY29kZXIuamF2YQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmZlZTMzCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay9saWJyYXJ5L0RlY29kZXIuamF2YQpAQCAtMCwwICsxLDMxMiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLmxpYnJhcnk7CisKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWM7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjLkJ1ZmZlckluZm87CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworCitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKK2ltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OworCitwdWJsaWMgY2xhc3MgRGVjb2RlciB7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJEZWNvZGVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtRdWV1ZURlcXVldWVUaW1lb3V0VXMgPSAxMDAwOworCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBNZWRpYUNvZGVjIG1Db2RlYzsKKyAgICBwcml2YXRlIEFycmF5TGlzdDxCdWZmZXJJbmZvPiBtSW5wdXRCdWZmZXJJbmZvOworICAgIHByaXZhdGUgU3RhdHMgbVN0YXRzOworCisgICAgcHJpdmF0ZSBib29sZWFuIG1TYXdJbnB1dEVPUzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVNhd091dHB1dEVPUzsKKyAgICBwcml2YXRlIGJvb2xlYW4gbVNpZ25hbGxlZEVycm9yOworCisgICAgcHJpdmF0ZSBpbnQgbU51bU91dHB1dEZyYW1lOworICAgIHByaXZhdGUgaW50IG1JbmRleDsKKworICAgIHByaXZhdGUgQXJyYXlMaXN0PEJ5dGVCdWZmZXI+IG1JbnB1dEJ1ZmZlcjsKKyAgICBwcml2YXRlIEZpbGVPdXRwdXRTdHJlYW0gbU91dHB1dFN0cmVhbTsKKworICAgIHB1YmxpYyBEZWNvZGVyKCkgeyBtU3RhdHMgPSBuZXcgU3RhdHMoKTsgfQorCisgICAgLyoqCisgICAgICogU2V0dXAgb2YgZGVjb2RlcgorICAgICAqCisgICAgICogQHBhcmFtIG91dHB1dFN0cmVhbSBXaWxsIGR1bXAgdGhlIG91dHB1dCBpbiB0aGlzIHN0cmVhbSBpZiBub3QgbnVsbC4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXR1cERlY29kZXIoRmlsZU91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgICAgIG1PdXRwdXRTdHJlYW0gPSBvdXRwdXRTdHJlYW07CisgICAgfQorCisgICAgcHJpdmF0ZSBNZWRpYUNvZGVjIGNyZWF0ZUNvZGVjKFN0cmluZyBjb2RlY05hbWUsIE1lZGlhRm9ybWF0IGZvcm1hdCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIG1pbWUgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FKTsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1lZGlhQ29kZWMgY29kZWM7CisgICAgICAgICAgICBpZiAoY29kZWNOYW1lLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkZpbGUgbWltZSB0eXBlOiAiICsgbWltZSk7CisgICAgICAgICAgICAgICAgaWYgKG1pbWUgIT0gbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBjb2RlYyA9IE1lZGlhQ29kZWMuY3JlYXRlRGVjb2RlckJ5VHlwZShtaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRGVjb2RlciBjcmVhdGVkIGZvciBtaW1lIHR5cGUgIiArIG1pbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29kZWM7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiTWltZSB0eXBlIGlzIG51bGwsIHBsZWFzZSBzcGVjaWZ5IGEgbWltZSB0eXBlIHRvIGNyZWF0ZSBkZWNvZGVyIik7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29kZWMgPSBNZWRpYUNvZGVjLmNyZWF0ZUJ5Q29kZWNOYW1lKGNvZGVjTmFtZSk7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRGVjb2RlciBjcmVhdGVkIHdpdGggY29kZWMgbmFtZTogIiArIGNvZGVjTmFtZSArICIgbWltZTogIiArIG1pbWUpOworICAgICAgICAgICAgICAgIHJldHVybiBjb2RlYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7CisgICAgICAgICAgICBleC5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIExvZy5lKFRBRywgIkZhaWxlZCB0byBjcmVhdGUgZGVjb2RlciBmb3IgIiArIGNvZGVjTmFtZSArICIgbWltZToiICsgbWltZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIERlY29kZXMgdGhlIGdpdmVuIGlucHV0IGJ1ZmZlciwKKyAgICAgKiBwcm92aWRlZCB2YWxpZCBsaXN0IG9mIGJ1ZmZlciBpbmZvIGFuZCBmb3JtYXQgYXJlIHBhc3NlZCBhcyBpbnB1dHMuCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5wdXRCdWZmZXIgICAgIERlY29kZSB0aGUgcHJvdmlkZWQgbGlzdCBvZiBCeXRlQnVmZmVycworICAgICAqIEBwYXJhbSBpbnB1dEJ1ZmZlckluZm8gTGlzdCBvZiBidWZmZXIgaW5mbyBjb3JyZXNwb25kaW5nIHRvIHByb3ZpZGVkIGlucHV0IGJ1ZmZlcnMKKyAgICAgKiBAcGFyYW0gYXN5bmNNb2RlICAgICAgIFdpbGwgcnVuIG9uIGFzeW5jIGltcGxlbWVudGF0aW9uIGlmIHRydWUKKyAgICAgKiBAcGFyYW0gZm9ybWF0ICAgICAgICAgIEZvciBjcmVhdGluZyB0aGUgZGVjb2RlciBpZiBjb2RlYyBuYW1lIGlzIGVtcHR5IGFuZCBjb25maWd1cmluZyBpdAorICAgICAqIEBwYXJhbSBjb2RlY05hbWUgICAgICAgV2lsbCBjcmVhdGUgdGhlIGRlY29kZXIgd2l0aCBjb2RlY05hbWUKKyAgICAgKiBAcmV0dXJuIDAgaWYgZGVjb2RlIHdhcyBzdWNjZXNzZnVsICwgLTEgZm9yIGZhaWwsIC0yIGZvciBkZWNvZGVyIG5vdCBjcmVhdGVkCisgICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGUgY29kZWMgY2Fubm90IGJlIGNyZWF0ZWQuCisgICAgICovCisgICAgcHVibGljIGludCBkZWNvZGUoQE5vbk51bGwgQXJyYXlMaXN0PEJ5dGVCdWZmZXI+IGlucHV0QnVmZmVyLAorICAgICAgICAgICAgQE5vbk51bGwgQXJyYXlMaXN0PEJ1ZmZlckluZm8+IGlucHV0QnVmZmVySW5mbywgZmluYWwgYm9vbGVhbiBhc3luY01vZGUsCisgICAgICAgICAgICBATm9uTnVsbCBNZWRpYUZvcm1hdCBmb3JtYXQsIFN0cmluZyBjb2RlY05hbWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIG1JbnB1dEJ1ZmZlciA9IG5ldyBBcnJheUxpc3Q8PihpbnB1dEJ1ZmZlci5zaXplKCkpOworICAgICAgICBtSW5wdXRCdWZmZXIuYWRkQWxsKGlucHV0QnVmZmVyKTsKKyAgICAgICAgbUlucHV0QnVmZmVySW5mbyA9IG5ldyBBcnJheUxpc3Q8PihpbnB1dEJ1ZmZlckluZm8uc2l6ZSgpKTsKKyAgICAgICAgbUlucHV0QnVmZmVySW5mby5hZGRBbGwoaW5wdXRCdWZmZXJJbmZvKTsKKyAgICAgICAgbVNhd0lucHV0RU9TID0gZmFsc2U7CisgICAgICAgIG1TYXdPdXRwdXRFT1MgPSBmYWxzZTsKKyAgICAgICAgbU51bU91dHB1dEZyYW1lID0gMDsKKyAgICAgICAgbUluZGV4ID0gMDsKKyAgICAgICAgbG9uZyBzVGltZSA9IG1TdGF0cy5nZXRDdXJUaW1lKCk7CisgICAgICAgIG1Db2RlYyA9IGNyZWF0ZUNvZGVjKGNvZGVjTmFtZSwgZm9ybWF0KTsKKyAgICAgICAgaWYgKG1Db2RlYyA9PSBudWxsKSB7CisgICAgICAgICAgICByZXR1cm4gLTI7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGFzeW5jTW9kZSkgeworICAgICAgICAgICAgbUNvZGVjLnNldENhbGxiYWNrKG5ldyBNZWRpYUNvZGVjLkNhbGxiYWNrKCkgeworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uSW5wdXRCdWZmZXJBdmFpbGFibGUoCisgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBNZWRpYUNvZGVjIG1lZGlhQ29kZWMsIGludCBpbnB1dEJ1ZmZlcklkKSB7CisgICAgICAgICAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtU3RhdHMuYWRkSW5wdXRUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBvbklucHV0QXZhaWxhYmxlKGlucHV0QnVmZmVySWQsIG1lZGlhQ29kZWMpOworICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEBPdmVycmlkZQorICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uT3V0cHV0QnVmZmVyQXZhaWxhYmxlKEBOb25OdWxsIE1lZGlhQ29kZWMgbWVkaWFDb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvdXRwdXRCdWZmZXJJZCwgQE5vbk51bGwgTWVkaWFDb2RlYy5CdWZmZXJJbmZvIGJ1ZmZlckluZm8pIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLmFkZE91dHB1dFRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgb25PdXRwdXRBdmFpbGFibGUobWVkaWFDb2RlYywgb3V0cHV0QnVmZmVySWQsIGJ1ZmZlckluZm8pOworICAgICAgICAgICAgICAgICAgICBpZiAobVNhd091dHB1dEVPUykgeworICAgICAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeyBtTG9jay5ub3RpZnkoKTsgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25PdXRwdXRGb3JtYXRDaGFuZ2VkKAorICAgICAgICAgICAgICAgICAgICAgICAgQE5vbk51bGwgTWVkaWFDb2RlYyBtZWRpYUNvZGVjLCBATm9uTnVsbCBNZWRpYUZvcm1hdCBmb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiT3V0cHV0IGZvcm1hdCBjaGFuZ2VkLiBGb3JtYXQ6ICIgKyBmb3JtYXQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIE1lZGlhQ29kZWMgbWVkaWFDb2RlYywgQE5vbk51bGwgTWVkaWFDb2RlYy5Db2RlY0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIkNvZGVjIEVycm9yOiAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeyBtTG9jay5ub3RpZnkoKTsgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworICAgICAgICB9CisgICAgICAgIGludCBpc0VuY29kZXIgPSAwOworICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgIExvZy5kKFRBRywgIk1lZGlhIEZvcm1hdCA6ICIgKyBmb3JtYXQudG9TdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICAgICAgbUNvZGVjLmNvbmZpZ3VyZShmb3JtYXQsIG51bGwsIG51bGwsIGlzRW5jb2Rlcik7CisgICAgICAgIG1Db2RlYy5zdGFydCgpOworICAgICAgICBMb2cuaShUQUcsICJDb2RlYyBzdGFydGVkICIpOworICAgICAgICBsb25nIGVUaW1lID0gbVN0YXRzLmdldEN1clRpbWUoKTsKKyAgICAgICAgbVN0YXRzLnNldEluaXRUaW1lKG1TdGF0cy5nZXRUaW1lRGlmZihzVGltZSwgZVRpbWUpKTsKKyAgICAgICAgbVN0YXRzLnNldFN0YXJ0VGltZSgpOworICAgICAgICBpZiAoYXN5bmNNb2RlKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsgbUxvY2sud2FpdCgpOyB9CisgICAgICAgICAgICAgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBjYXRjaCAoSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB3aGlsZSAoIW1TYXdPdXRwdXRFT1MgJiYgIW1TaWduYWxsZWRFcnJvcikgeworICAgICAgICAgICAgICAgIC8qIFF1ZXVlIGlucHV0IGRhdGEgKi8KKyAgICAgICAgICAgICAgICBpZiAoIW1TYXdJbnB1dEVPUykgeworICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXRCdWZmZXJJZCA9IG1Db2RlYy5kZXF1ZXVlSW5wdXRCdWZmZXIoa1F1ZXVlRGVxdWV1ZVRpbWVvdXRVcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dEJ1ZmZlcklkIDwgMCAmJiBpbnB1dEJ1ZmZlcklkICE9IE1lZGlhQ29kZWMuSU5GT19UUllfQUdBSU5fTEFURVIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lZGlhQ29kZWMuZGVxdWV1ZUlucHV0QnVmZmVyICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgcmV0dXJuZWQgaW52YWxpZCBpbmRleCA6ICIgKyBpbnB1dEJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtU3RhdHMuYWRkSW5wdXRUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgIG9uSW5wdXRBdmFpbGFibGUoaW5wdXRCdWZmZXJJZCwgbUNvZGVjKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogRGVxdWV1ZSBvdXRwdXQgZGF0YSAqLworICAgICAgICAgICAgICAgIEJ1ZmZlckluZm8gb3V0cHV0QnVmZmVySW5mbyA9IG5ldyBCdWZmZXJJbmZvKCk7CisgICAgICAgICAgICAgICAgaW50IG91dHB1dEJ1ZmZlcklkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy5kZXF1ZXVlT3V0cHV0QnVmZmVyKG91dHB1dEJ1ZmZlckluZm8sIGtRdWV1ZURlcXVldWVUaW1lb3V0VXMpOworICAgICAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXJJZCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlcklkID09IE1lZGlhQ29kZWMuSU5GT19PVVRQVVRfRk9STUFUX0NIQU5HRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhRm9ybWF0IG91dEZvcm1hdCA9IG1Db2RlYy5nZXRPdXRwdXRGb3JtYXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIk91dHB1dCBmb3JtYXQgY2hhbmdlZC4gRm9ybWF0OiAiICsgb3V0Rm9ybWF0LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG91dHB1dEJ1ZmZlcklkID09IE1lZGlhQ29kZWMuSU5GT19PVVRQVVRfQlVGRkVSU19DSEFOR0VEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJJZ25vcmluZyBkZXByZWNhdGVkIGZsYWc6IElORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRCIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG91dHB1dEJ1ZmZlcklkICE9IE1lZGlhQ29kZWMuSU5GT19UUllfQUdBSU5fTEFURVIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1lZGlhQ29kZWMuZGVxdWV1ZU91dHB1dEJ1ZmZlciIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgcmV0dXJuZWQgaW52YWxpZCBpbmRleCAiICsgb3V0cHV0QnVmZmVySWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgbVN0YXRzLmFkZE91dHB1dFRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJEZXF1ZXVlIE8vUCBidWZmZXIgd2l0aCBCdWZmZXJJRCAiICsgb3V0cHV0QnVmZmVySWQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG9uT3V0cHV0QXZhaWxhYmxlKG1Db2RlYywgb3V0cHV0QnVmZmVySWQsIG91dHB1dEJ1ZmZlckluZm8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtSW5wdXRCdWZmZXIuY2xlYXIoKTsKKyAgICAgICAgbUlucHV0QnVmZmVySW5mby5jbGVhcigpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTdG9wcyB0aGUgY29kZWMgYW5kIHJlbGVhc2VzIGNvZGVjIHJlc291cmNlcy4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkZUluaXRDb2RlYygpIHsKKyAgICAgICAgbG9uZyBzVGltZSA9IG1TdGF0cy5nZXRDdXJUaW1lKCk7CisgICAgICAgIGlmIChtQ29kZWMgIT0gbnVsbCkgeworICAgICAgICAgICAgbUNvZGVjLnN0b3AoKTsKKyAgICAgICAgICAgIG1Db2RlYy5yZWxlYXNlKCk7CisgICAgICAgICAgICBtQ29kZWMgPSBudWxsOworICAgICAgICB9CisgICAgICAgIGxvbmcgZVRpbWUgPSBtU3RhdHMuZ2V0Q3VyVGltZSgpOworICAgICAgICBtU3RhdHMuc2V0RGVJbml0VGltZShtU3RhdHMuZ2V0VGltZURpZmYoc1RpbWUsIGVUaW1lKSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogUHJpbnRzIG91dCB0aGUgc3RhdGlzdGljcyBpbiB0aGUgaW5mb3JtYXRpb24gbG9nCisgICAgICoKKyAgICAgKiBAcGFyYW0gaW5wdXRSZWZlcmVuY2UgVGhlIG9wZXJhdGlvbiBiZWluZyBwZXJmb3JtZWQsIGluIHRoaXMgY2FzZSBkZWNvZGUKKyAgICAgKiBAcGFyYW0gY29tcG9uZW50TmFtZSAgTmFtZSBvZiB0aGUgY29tcG9uZW50L2NvZGVjCisgICAgICogQHBhcmFtIG1vZGUgICAgICAgICAgIFRoZSBvcGVyYXRpbmcgbW9kZTogU3luYy9Bc3luYworICAgICAqIEBwYXJhbSBkdXJhdGlvblVzICAgICBEdXJhdGlvbiBvZiB0aGUgY2xpcCBpbiBtaWNyb3NlY29uZHMKKyAgICAgKiBAcGFyYW0gc3RhdHNGaWxlICAgICAgVGhlIG91dHB1dCBmaWxlIHdoZXJlIHRoZSBzdGF0cyBkYXRhIGlzIHdyaXR0ZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkdW1wU3RhdGlzdGljcyhTdHJpbmcgaW5wdXRSZWZlcmVuY2UsIFN0cmluZyBjb21wb25lbnROYW1lLCBTdHJpbmcgbW9kZSwKKyAgICAgICAgICAgIGxvbmcgZHVyYXRpb25VcywgU3RyaW5nIHN0YXRzRmlsZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgU3RyaW5nIG9wZXJhdGlvbiA9ICJkZWNvZGUiOworICAgICAgICBtU3RhdHMuZHVtcFN0YXRpc3RpY3MoCisgICAgICAgICAgICAgICAgaW5wdXRSZWZlcmVuY2UsIG9wZXJhdGlvbiwgY29tcG9uZW50TmFtZSwgbW9kZSwgZHVyYXRpb25Vcywgc3RhdHNGaWxlKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIHN0YXRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXREZWNvZGVyKCkgeyBtU3RhdHMucmVzZXQoKTsgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZm9ybWF0IG9mIHRoZSBvdXRwdXQgYnVmZmVycworICAgICAqLworICAgIHB1YmxpYyBNZWRpYUZvcm1hdCBnZXRGb3JtYXQoKSB7CisgICAgICAgIHJldHVybiBtQ29kZWMuZ2V0T3V0cHV0Rm9ybWF0KCk7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uSW5wdXRBdmFpbGFibGUoaW50IGlucHV0QnVmZmVySWQsIE1lZGlhQ29kZWMgbWVkaWFDb2RlYykgeworICAgICAgICBpZiAoKGlucHV0QnVmZmVySWQgPj0gMCkgJiYgIW1TYXdJbnB1dEVPUykgeworICAgICAgICAgICAgQnl0ZUJ1ZmZlciBpbnB1dENvZGVjQnVmZmVyID0gbWVkaWFDb2RlYy5nZXRJbnB1dEJ1ZmZlcihpbnB1dEJ1ZmZlcklkKTsKKyAgICAgICAgICAgIEJ1ZmZlckluZm8gYnVmSW5mbyA9IG1JbnB1dEJ1ZmZlckluZm8uZ2V0KG1JbmRleCk7CisgICAgICAgICAgICBpbnB1dENvZGVjQnVmZmVyLnB1dChtSW5wdXRCdWZmZXIuZ2V0KG1JbmRleCkuYXJyYXkoKSk7CisgICAgICAgICAgICBtSW5kZXgrKzsKKyAgICAgICAgICAgIG1TYXdJbnB1dEVPUyA9IChidWZJbmZvLmZsYWdzICYgTWVkaWFDb2RlYy5CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworICAgICAgICAgICAgaWYgKG1TYXdJbnB1dEVPUykgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlNhdyBpbnB1dCBFT1MiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdGF0cy5hZGRGcmFtZVNpemUoYnVmSW5mby5zaXplKTsKKyAgICAgICAgICAgIG1lZGlhQ29kZWMucXVldWVJbnB1dEJ1ZmZlcihpbnB1dEJ1ZmZlcklkLCBidWZJbmZvLm9mZnNldCwgYnVmSW5mby5zaXplLAorICAgICAgICAgICAgICAgICAgICBidWZJbmZvLnByZXNlbnRhdGlvblRpbWVVcywgYnVmSW5mby5mbGFncyk7CisgICAgICAgICAgICBpZiAoREVCVUcpIHsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAiQ29kZWMgSW5wdXQ6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiZmxhZyA9ICIgKyBidWZJbmZvLmZsYWdzICsgIiB0aW1lc3RhbXAgPSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgYnVmSW5mby5wcmVzZW50YXRpb25UaW1lVXMgKyAiIHNpemUgPSAiICsgYnVmSW5mby5zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbk91dHB1dEF2YWlsYWJsZSgKKyAgICAgICAgICAgIE1lZGlhQ29kZWMgbWVkaWFDb2RlYywgaW50IG91dHB1dEJ1ZmZlcklkLCBCdWZmZXJJbmZvIG91dHB1dEJ1ZmZlckluZm8pIHsKKyAgICAgICAgaWYgKG1TYXdPdXRwdXRFT1MgfHwgb3V0cHV0QnVmZmVySWQgPCAwKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbU51bU91dHB1dEZyYW1lKys7CisgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgTG9nLmQoVEFHLAorICAgICAgICAgICAgICAgICAgICAiSW4gT3V0cHV0QnVmZmVyQXZhaWxhYmxlICwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIG91dHB1dCBmcmFtZSBudW1iZXIgPSAiICsgbU51bU91dHB1dEZyYW1lKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobU91dHB1dFN0cmVhbSAhPSBudWxsKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIEJ5dGVCdWZmZXIgb3V0cHV0QnVmZmVyID0gbWVkaWFDb2RlYy5nZXRPdXRwdXRCdWZmZXIob3V0cHV0QnVmZmVySWQpOworICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlc091dHB1dCA9IG5ldyBieXRlW291dHB1dEJ1ZmZlci5yZW1haW5pbmcoKV07CisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLmdldChieXRlc091dHB1dCk7CisgICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbS53cml0ZShieXRlc091dHB1dCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJFcnJvciBEdW1waW5nIEZpbGU6IEV4Y2VwdGlvbiAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBtZWRpYUNvZGVjLnJlbGVhc2VPdXRwdXRCdWZmZXIob3V0cHV0QnVmZmVySWQsIGZhbHNlKTsKKyAgICAgICAgbVNhd091dHB1dEVPUyA9IChvdXRwdXRCdWZmZXJJbmZvLmZsYWdzICYgTWVkaWFDb2RlYy5CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworICAgICAgICBpZiAobVNhd091dHB1dEVPUykgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiU2F3IG91dHB1dCBFT1MiKTsKKyAgICAgICAgfQorICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvbGlicmFyeS9FbmNvZGVyLmphdmEgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvRW5jb2Rlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1NGNkOGUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvRW5jb2Rlci5qYXZhCkBAIC0wLDAgKzEsMzY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsubGlicmFyeTsKKworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb2RlYzsKK2ltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29kZWMuQ29kZWNFeGNlcHRpb247CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgYW5kcm9pZHguYW5ub3RhdGlvbi5Ob25OdWxsOworCitpbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKKworcHVibGljIGNsYXNzIEVuY29kZXIgeworICAgIC8vIENoYW5nZSBpbiBBVURJT19FTkNPREVfREVGQVVMVF9NQVhfSU5QVVRfU0laRSBzaG91bGQgYWxzbyBiZSB0YWtlbiB0bworICAgIC8vIGtEZWZhdWx0QXVkaW9FbmNvZGVGcmFtZVNpemUgcHJlc2VudCBpbiBCZW5jaG1hcmtDb21tb24uaAorICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBVURJT19FTkNPREVfREVGQVVMVF9NQVhfSU5QVVRfU0laRSA9IDQwOTY7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJFbmNvZGVyIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gZmFsc2U7CisgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IGtRdWV1ZURlcXVldWVUaW1lb3V0VXMgPSAxMDAwOworCisgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbUxvY2sgPSBuZXcgT2JqZWN0KCk7CisgICAgcHJpdmF0ZSBNZWRpYUNvZGVjIG1Db2RlYzsKKyAgICBwcml2YXRlIFN0cmluZyBtTWltZTsKKyAgICBwcml2YXRlIFN0YXRzIG1TdGF0czsKKworICAgIHByaXZhdGUgaW50IG1PZmZzZXQ7CisgICAgcHJpdmF0ZSBpbnQgbUZyYW1lU2l6ZTsKKyAgICBwcml2YXRlIGludCBtTnVtSW5wdXRGcmFtZTsKKyAgICBwcml2YXRlIGludCBtTnVtRnJhbWVzOworICAgIHByaXZhdGUgaW50IG1GcmFtZVJhdGU7CisgICAgcHJpdmF0ZSBpbnQgbVNhbXBsZVJhdGU7CisgICAgcHJpdmF0ZSBsb25nIG1JbnB1dEJ1ZmZlclNpemU7CisKKyAgICBwcml2YXRlIGJvb2xlYW4gbVNhd0lucHV0RU9TOworICAgIHByaXZhdGUgYm9vbGVhbiBtU2F3T3V0cHV0RU9TOworICAgIHByaXZhdGUgYm9vbGVhbiBtU2lnbmFsbGVkRXJyb3I7CisKKyAgICBwcml2YXRlIEZpbGVJbnB1dFN0cmVhbSBtSW5wdXRTdHJlYW07CisgICAgcHJpdmF0ZSBGaWxlT3V0cHV0U3RyZWFtIG1PdXRwdXRTdHJlYW07CisKKyAgICBwdWJsaWMgRW5jb2RlcigpIHsKKyAgICAgICAgbVN0YXRzID0gbmV3IFN0YXRzKCk7CisgICAgICAgIG1OdW1JbnB1dEZyYW1lID0gMDsKKyAgICAgICAgbVNhd0lucHV0RU9TID0gZmFsc2U7CisgICAgICAgIG1TYXdPdXRwdXRFT1MgPSBmYWxzZTsKKyAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gZmFsc2U7CisgICAgfQorCisgICAgLyoqCisgICAgICogU2V0dXAgb2YgZW5jb2RlcgorICAgICAqCisgICAgICogQHBhcmFtIGVuY29kZXJPdXRwdXRTdHJlYW0gV2lsbCBkdW1wIHRoZSBlbmNvZGVyIG91dHB1dCBpbiB0aGlzIHN0cmVhbSBpZiBub3QgbnVsbC4KKyAgICAgKiBAcGFyYW0gZmlsZUlucHV0U3RyZWFtICAgICBXaWxsIHJlYWQgdGhlIGRlY29kZWQgb3V0cHV0IGZyb20gdGhpcyBzdHJlYW0KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBzZXR1cEVuY29kZXIoRmlsZU91dHB1dFN0cmVhbSBlbmNvZGVyT3V0cHV0U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlSW5wdXRTdHJlYW0gZmlsZUlucHV0U3RyZWFtKSB7CisgICAgICAgIHRoaXMubUlucHV0U3RyZWFtID0gZmlsZUlucHV0U3RyZWFtOworICAgICAgICB0aGlzLm1PdXRwdXRTdHJlYW0gPSBlbmNvZGVyT3V0cHV0U3RyZWFtOworICAgIH0KKworICAgIHByaXZhdGUgTWVkaWFDb2RlYyBjcmVhdGVDb2RlYyhTdHJpbmcgY29kZWNOYW1lLCBTdHJpbmcgbWltZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgdHJ5IHsKKyAgICAgICAgICAgIE1lZGlhQ29kZWMgY29kZWM7CisgICAgICAgICAgICBpZiAoY29kZWNOYW1lLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIk1pbWUgdHlwZTogIiArIG1pbWUpOworICAgICAgICAgICAgICAgIGlmIChtaW1lICE9IG51bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgY29kZWMgPSBNZWRpYUNvZGVjLmNyZWF0ZUVuY29kZXJCeVR5cGUobWltZSk7CisgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkVuY29kZXIgY3JlYXRlZCBmb3IgbWltZSB0eXBlICIgKyBtaW1lKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGVjOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIk1pbWUgdHlwZSBpcyBudWxsLCBwbGVhc2Ugc3BlY2lmeSBhIG1pbWUgdHlwZSB0byBjcmVhdGUgZW5jb2RlciIpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvZGVjID0gTWVkaWFDb2RlYy5jcmVhdGVCeUNvZGVjTmFtZShjb2RlY05hbWUpOworICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkVuY29kZXIgY3JlYXRlZCB3aXRoIGNvZGVjIG5hbWU6ICIgKyBjb2RlY05hbWUgKyAiIGFuZCBtaW1lOiAiICsgbWltZSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGVjOworICAgICAgICAgICAgfQorICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXgpIHsKKyAgICAgICAgICAgIGV4LnByaW50U3RhY2tUcmFjZSgpOworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIGNyZWF0ZSBlbmNvZGVyIGZvciAiICsgY29kZWNOYW1lICsgIiBtaW1lOiAiICsgbWltZSk7CisgICAgICAgICAgICByZXR1cm4gbnVsbDsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIEVuY29kZXMgdGhlIGdpdmVuIHJhdyBpbnB1dCBmaWxlIGFuZCBtZWFzdXJlcyB0aGUgcGVyZm9ybWFuY2Ugb2YgZW5jb2RlIG9wZXJhdGlvbiwKKyAgICAgKiBwcm92aWRlZCBhIHZhbGlkIGxpc3Qgb2YgcGFyYW1ldGVycyBhcmUgcGFzc2VkIGFzIGlucHV0cy4KKyAgICAgKgorICAgICAqIEBwYXJhbSBjb2RlY05hbWUgICAgV2lsbCBjcmVhdGUgdGhlIGVuY29kZXIgd2l0aCBjb2RlY05hbWUKKyAgICAgKiBAcGFyYW0gbWltZSAgICAgICAgIEZvciBjcmVhdGluZyBlbmNvZGUgZm9ybWF0CisgICAgICogQHBhcmFtIGVuY29kZUZvcm1hdCBGb3JtYXQgb2YgdGhlIG91dHB1dCBkYXRhCisgICAgICogQHBhcmFtIGZyYW1lU2l6ZSAgICBTaXplIG9mIHRoZSBmcmFtZQorICAgICAqIEBwYXJhbSBhc3luY01vZGUgICAgV2lsbCBydW4gb24gYXN5bmMgaW1wbGVtZW50YXRpb24gaWYgdHJ1ZQorICAgICAqIEByZXR1cm4gMCBpZiBlbmNvZGUgd2FzIHN1Y2Nlc3NmdWwgLCAtMSBmb3IgZmFpbCwgLTIgZm9yIGVuY29kZXIgbm90IGNyZWF0ZWQKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIHRoZSBjb2RlYyBjYW5ub3QgYmUgY3JlYXRlZC4KKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IGVuY29kZShTdHJpbmcgY29kZWNOYW1lLCBNZWRpYUZvcm1hdCBlbmNvZGVGb3JtYXQsIFN0cmluZyBtaW1lLCBpbnQgZnJhbWVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVSYXRlLCBpbnQgZnJhbWVTaXplLCBib29sZWFuIGFzeW5jTW9kZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKKyAgICAgICAgbUlucHV0QnVmZmVyU2l6ZSA9IG1JbnB1dFN0cmVhbS5nZXRDaGFubmVsKCkuc2l6ZSgpOworICAgICAgICBtTWltZSA9IG1pbWU7CisgICAgICAgIG1PZmZzZXQgPSAwOworICAgICAgICBtRnJhbWVSYXRlID0gZnJhbWVSYXRlOworICAgICAgICBtU2FtcGxlUmF0ZSA9IHNhbXBsZVJhdGU7CisgICAgICAgIGxvbmcgc1RpbWUgPSBtU3RhdHMuZ2V0Q3VyVGltZSgpOworICAgICAgICBtQ29kZWMgPSBjcmVhdGVDb2RlYyhjb2RlY05hbWUsIG1pbWUpOworICAgICAgICBpZiAobUNvZGVjID09IG51bGwpIHsKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgfQorICAgICAgICAvKkNvbmZpZ3VyZSBDb2RlYyovCisgICAgICAgIHRyeSB7CisgICAgICAgICAgICBtQ29kZWMuY29uZmlndXJlKGVuY29kZUZvcm1hdCwgbnVsbCwgbnVsbCwgTWVkaWFDb2RlYy5DT05GSUdVUkVfRkxBR19FTkNPREUpOworICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gfCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gfCBNZWRpYUNvZGVjLkNyeXB0b0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJGYWlsZWQgdG8gY29uZmlndXJlICIgKyBtQ29kZWMuZ2V0TmFtZSgpICsgIiBlbmNvZGVyLiIpOworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHJldHVybiAtMjsKKyAgICAgICAgfQorICAgICAgICBpZiAobU1pbWUuc3RhcnRzV2l0aCgidmlkZW8vIikpIHsKKyAgICAgICAgICAgIG1GcmFtZVNpemUgPSBmcmFtZVNpemU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpbnQgbWF4SW5wdXRTaXplID0gQVVESU9fRU5DT0RFX0RFRkFVTFRfTUFYX0lOUFVUX1NJWkU7CisgICAgICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSBtQ29kZWMuZ2V0SW5wdXRGb3JtYXQoKTsKKyAgICAgICAgICAgIGlmIChmb3JtYXQuY29udGFpbnNLZXkoTWVkaWFGb3JtYXQuS0VZX01BWF9JTlBVVF9TSVpFKSkgeworICAgICAgICAgICAgICAgIG1heElucHV0U2l6ZSA9IGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9NQVhfSU5QVVRfU0laRSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtRnJhbWVTaXplID0gZnJhbWVTaXplOworICAgICAgICAgICAgaWYgKG1GcmFtZVNpemUgPiBtYXhJbnB1dFNpemUgJiYgbWF4SW5wdXRTaXplID4gMCkgeworICAgICAgICAgICAgICAgIG1GcmFtZVNpemUgPSBtYXhJbnB1dFNpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbU51bUZyYW1lcyA9IChpbnQpICgobUlucHV0QnVmZmVyU2l6ZSArIG1GcmFtZVNpemUgLSAxKSAvIG1GcmFtZVNpemUpOworICAgICAgICBpZiAoYXN5bmNNb2RlKSB7CisgICAgICAgICAgICBtQ29kZWMuc2V0Q2FsbGJhY2sobmV3IE1lZGlhQ29kZWMuQ2FsbGJhY2soKSB7CisgICAgICAgICAgICAgICAgQE92ZXJyaWRlCisgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JbnB1dEJ1ZmZlckF2YWlsYWJsZShATm9uTnVsbCBNZWRpYUNvZGVjIG1lZGlhQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5wdXRCdWZmZXJJZCkgeworICAgICAgICAgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgICAgICAgICAgbVN0YXRzLmFkZElucHV0VGltZSgpOworICAgICAgICAgICAgICAgICAgICAgICAgb25JbnB1dEF2YWlsYWJsZShtZWRpYUNvZGVjLCBpbnB1dEJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbk91dHB1dEJ1ZmZlckF2YWlsYWJsZShATm9uTnVsbCBNZWRpYUNvZGVjIG1lZGlhQ29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG91dHB1dEJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBOb25OdWxsIE1lZGlhQ29kZWMuQnVmZmVySW5mbyBidWZmZXJJbmZvKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5hZGRPdXRwdXRUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgIG9uT3V0cHV0QXZhaWxhYmxlKG1lZGlhQ29kZWMsIG91dHB1dEJ1ZmZlcklkLCBidWZmZXJJbmZvKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1TYXdPdXRwdXRFT1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIlNhdyBvdXRwdXQgRU9TIik7CisgICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7IG1Mb2NrLm5vdGlmeSgpOyB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKEBOb25OdWxsIE1lZGlhQ29kZWMgbWVkaWFDb2RlYywgQE5vbk51bGwgQ29kZWNFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb2RlYyBFcnJvcjogIiArIGUudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsgbUxvY2subm90aWZ5KCk7IH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKKyAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbk91dHB1dEZvcm1hdENoYW5nZWQoQE5vbk51bGwgTWVkaWFDb2RlYyBtZWRpYUNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBATm9uTnVsbCBNZWRpYUZvcm1hdCBmb3JtYXQpIHsKKyAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiT3V0cHV0IGZvcm1hdCBjaGFuZ2VkLiBGb3JtYXQ6ICIgKyBmb3JtYXQudG9TdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSk7CisgICAgICAgIH0KKyAgICAgICAgbUNvZGVjLnN0YXJ0KCk7CisgICAgICAgIGxvbmcgZVRpbWUgPSBtU3RhdHMuZ2V0Q3VyVGltZSgpOworICAgICAgICBtU3RhdHMuc2V0SW5pdFRpbWUobVN0YXRzLmdldFRpbWVEaWZmKHNUaW1lLCBlVGltZSkpOworICAgICAgICBtU3RhdHMuc2V0U3RhcnRUaW1lKCk7CisgICAgICAgIGlmIChhc3luY01vZGUpIHsKKyAgICAgICAgICAgIHRyeSB7CisgICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgeyBtTG9jay53YWl0KCk7IH0KKyAgICAgICAgICAgICAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGNhdGNoIChJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHdoaWxlICghbVNhd091dHB1dEVPUyAmJiAhbVNpZ25hbGxlZEVycm9yKSB7CisgICAgICAgICAgICAgICAgLyogUXVldWUgaW5wdXQgZGF0YSAqLworICAgICAgICAgICAgICAgIGlmICghbVNhd0lucHV0RU9TKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBpbnB1dEJ1ZmZlcklkID0gbUNvZGVjLmRlcXVldWVJbnB1dEJ1ZmZlcihrUXVldWVEZXF1ZXVlVGltZW91dFVzKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlucHV0QnVmZmVySWQgPCAwICYmIGlucHV0QnVmZmVySWQgIT0gTWVkaWFDb2RlYy5JTkZPX1RSWV9BR0FJTl9MQVRFUikgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiTWVkaWFDb2RlYy5kZXF1ZXVlSW5wdXRCdWZmZXIgIiArICJyZXR1cm5lZCBpbnZhbGlkIGluZGV4IDogIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVySWQpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5hZGRJbnB1dFRpbWUoKTsKKyAgICAgICAgICAgICAgICAgICAgb25JbnB1dEF2YWlsYWJsZShtQ29kZWMsIGlucHV0QnVmZmVySWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBEZXF1ZXVlIG91dHB1dCBkYXRhICovCisgICAgICAgICAgICAgICAgTWVkaWFDb2RlYy5CdWZmZXJJbmZvIG91dHB1dEJ1ZmZlckluZm8gPSBuZXcgTWVkaWFDb2RlYy5CdWZmZXJJbmZvKCk7CisgICAgICAgICAgICAgICAgaW50IG91dHB1dEJ1ZmZlcklkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1Db2RlYy5kZXF1ZXVlT3V0cHV0QnVmZmVyKG91dHB1dEJ1ZmZlckluZm8sIGtRdWV1ZURlcXVldWVUaW1lb3V0VXMpOworICAgICAgICAgICAgICAgIGlmIChvdXRwdXRCdWZmZXJJZCA8IDApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dEJ1ZmZlcklkID09IE1lZGlhQ29kZWMuSU5GT19PVVRQVVRfRk9STUFUX0NIQU5HRUQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhRm9ybWF0IG91dEZvcm1hdCA9IG1Db2RlYy5nZXRPdXRwdXRGb3JtYXQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIk91dHB1dCBmb3JtYXQgY2hhbmdlZC4gRm9ybWF0OiAiICsgb3V0Rm9ybWF0LnRvU3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKG91dHB1dEJ1ZmZlcklkICE9IE1lZGlhQ29kZWMuSU5GT19UUllfQUdBSU5fTEFURVIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgIk1lZGlhQ29kZWMuZGVxdWV1ZU91dHB1dEJ1ZmZlciIgKyAiIHJldHVybmVkIGludmFsaWQgaW5kZXggIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy5hZGRPdXRwdXRUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgeworICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRGVxdWV1ZSBPL1AgYnVmZmVyIHdpdGggQnVmZmVySUQgIiArIG91dHB1dEJ1ZmZlcklkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBvbk91dHB1dEF2YWlsYWJsZShtQ29kZWMsIG91dHB1dEJ1ZmZlcklkLCBvdXRwdXRCdWZmZXJJbmZvKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcHJpdmF0ZSB2b2lkIG9uT3V0cHV0QXZhaWxhYmxlKE1lZGlhQ29kZWMgbWVkaWFDb2RlYywgaW50IG91dHB1dEJ1ZmZlcklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvZGVjLkJ1ZmZlckluZm8gb3V0cHV0QnVmZmVySW5mbykgeworICAgICAgICBpZiAobVNhd091dHB1dEVPUyB8fCBvdXRwdXRCdWZmZXJJZCA8IDApIHsKKyAgICAgICAgICAgIGlmIChtU2F3T3V0cHV0RU9TKSB7CisgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiU2F3IG91dHB1dCBFT1MiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBCeXRlQnVmZmVyIG91dHB1dEJ1ZmZlciA9IG1lZGlhQ29kZWMuZ2V0T3V0cHV0QnVmZmVyKG91dHB1dEJ1ZmZlcklkKTsKKyAgICAgICAgaWYgKG1PdXRwdXRTdHJlYW0gIT0gbnVsbCkgeworICAgICAgICAgICAgdHJ5IHsKKworICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlc091dHB1dCA9IG5ldyBieXRlW291dHB1dEJ1ZmZlci5yZW1haW5pbmcoKV07CisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVyLmdldChieXRlc091dHB1dCk7CisgICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbS53cml0ZShieXRlc091dHB1dCk7CisgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7CisgICAgICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJFcnJvciBEdW1waW5nIEZpbGU6IEV4Y2VwdGlvbiAiICsgZS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbVN0YXRzLmFkZEZyYW1lU2l6ZShvdXRwdXRCdWZmZXIucmVtYWluaW5nKCkpOworICAgICAgICBtZWRpYUNvZGVjLnJlbGVhc2VPdXRwdXRCdWZmZXIob3V0cHV0QnVmZmVySWQsIGZhbHNlKTsKKyAgICAgICAgbVNhd091dHB1dEVPUyA9IChvdXRwdXRCdWZmZXJJbmZvLmZsYWdzICYgTWVkaWFDb2RlYy5CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNKSAhPSAwOworICAgIH0KKworICAgIHByaXZhdGUgdm9pZCBvbklucHV0QXZhaWxhYmxlKE1lZGlhQ29kZWMgbWVkaWFDb2RlYywgaW50IGlucHV0QnVmZmVySWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIGlmIChtU2F3SW5wdXRFT1MgfHwgaW5wdXRCdWZmZXJJZCA8IDApIHsKKyAgICAgICAgICAgIGlmIChtU2F3SW5wdXRFT1MpIHsKKyAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJTYXcgaW5wdXQgRU9TIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlclNpemUgPCBtT2Zmc2V0KSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJPdXQgb2YgYm91bmQgYWNjZXNzIG9mIGlucHV0IGJ1ZmZlciIpOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBCeXRlQnVmZmVyIGlucHV0QnVmZmVyID0gbUNvZGVjLmdldElucHV0QnVmZmVyKGlucHV0QnVmZmVySWQpOworICAgICAgICBpZiAoaW5wdXRCdWZmZXIgPT0gbnVsbCkgeworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpbnQgYnVmU2l6ZSA9IGlucHV0QnVmZmVyLmNhcGFjaXR5KCk7CisgICAgICAgIGludCBieXRlc1RvUmVhZCA9IG1GcmFtZVNpemU7CisgICAgICAgIGlmIChtSW5wdXRCdWZmZXJTaXplIC0gbU9mZnNldCA8IG1GcmFtZVNpemUpIHsKKyAgICAgICAgICAgIGJ5dGVzVG9SZWFkID0gKGludCkgKG1JbnB1dEJ1ZmZlclNpemUgLSBtT2Zmc2V0KTsKKyAgICAgICAgfQorICAgICAgICAvL2IvMTQ4NjU1Mjc1IC0gVXBkYXRlIEZyYW1lIHNpemUsIGFzIEZvcm1hdCB2YWx1ZSBtYXkgbm90IGJlIHZhbGlkCisgICAgICAgIGlmIChidWZTaXplIDwgYnl0ZXNUb1JlYWQpIHsKKyAgICAgICAgICAgIGlmKG1OdW1JbnB1dEZyYW1lID09IDApIHsKKyAgICAgICAgICAgICAgICBtRnJhbWVTaXplID0gYnVmU2l6ZTsKKyAgICAgICAgICAgICAgICBieXRlc1RvUmVhZCA9IGJ1ZlNpemU7CisgICAgICAgICAgICAgICAgbU51bUZyYW1lcyA9IChpbnQpICgobUlucHV0QnVmZmVyU2l6ZSArIG1GcmFtZVNpemUgLSAxKSAvIG1GcmFtZVNpemUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGJ5dGVbXSBpbnB1dEFycmF5ID0gbmV3IGJ5dGVbYnl0ZXNUb1JlYWRdOworICAgICAgICBtSW5wdXRTdHJlYW0ucmVhZChpbnB1dEFycmF5LCAwLCBieXRlc1RvUmVhZCk7CisgICAgICAgIGlucHV0QnVmZmVyLnB1dChpbnB1dEFycmF5KTsKKyAgICAgICAgaW50IGZsYWcgPSAwOworICAgICAgICBpZiAobU51bUlucHV0RnJhbWUgPj0gbU51bUZyYW1lcyAtIDEgfHwgYnl0ZXNUb1JlYWQgPT0gMCkgeworICAgICAgICAgICAgTG9nLmkoVEFHLCAiU2VuZGluZyBFT1Mgb24gaW5wdXQgbGFzdCBmcmFtZSIpOworICAgICAgICAgICAgbVNhd0lucHV0RU9TID0gdHJ1ZTsKKyAgICAgICAgICAgIGZsYWcgPSBNZWRpYUNvZGVjLkJVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgIH0KKyAgICAgICAgaW50IHByZXNlbnRhdGlvblRpbWVVczsKKyAgICAgICAgaWYgKG1NaW1lLnN0YXJ0c1dpdGgoInZpZGVvLyIpKSB7CisgICAgICAgICAgICBwcmVzZW50YXRpb25UaW1lVXMgPSBtTnVtSW5wdXRGcmFtZSAqICgxMDAwMDAwIC8gbUZyYW1lUmF0ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwcmVzZW50YXRpb25UaW1lVXMgPSBtTnVtSW5wdXRGcmFtZSAqIG1GcmFtZVNpemUgKiAxMDAwMDAwIC8gbVNhbXBsZVJhdGU7CisgICAgICAgIH0KKyAgICAgICAgbWVkaWFDb2RlYy5xdWV1ZUlucHV0QnVmZmVyKGlucHV0QnVmZmVySWQsIDAsIGJ5dGVzVG9SZWFkLCBwcmVzZW50YXRpb25UaW1lVXMsIGZsYWcpOworICAgICAgICBtTnVtSW5wdXRGcmFtZSsrOworICAgICAgICBtT2Zmc2V0ICs9IGJ5dGVzVG9SZWFkOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3BzIHRoZSBjb2RlYyBhbmQgcmVsZWFzZXMgY29kZWMgcmVzb3VyY2VzLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlSW5pdEVuY29kZXIoKSB7CisgICAgICAgIGxvbmcgc1RpbWUgPSBtU3RhdHMuZ2V0Q3VyVGltZSgpOworICAgICAgICBpZiAobUNvZGVjICE9IG51bGwpIHsKKyAgICAgICAgICAgIG1Db2RlYy5zdG9wKCk7CisgICAgICAgICAgICBtQ29kZWMucmVsZWFzZSgpOworICAgICAgICAgICAgbUNvZGVjID0gbnVsbDsKKyAgICAgICAgfQorICAgICAgICBsb25nIGVUaW1lID0gbVN0YXRzLmdldEN1clRpbWUoKTsKKyAgICAgICAgbVN0YXRzLnNldERlSW5pdFRpbWUobVN0YXRzLmdldFRpbWVEaWZmKHNUaW1lLCBlVGltZSkpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFByaW50cyBvdXQgdGhlIHN0YXRpc3RpY3MgaW4gdGhlIGluZm9ybWF0aW9uIGxvZworICAgICAqCisgICAgICogQHBhcmFtIGlucHV0UmVmZXJlbmNlIFRoZSBvcGVyYXRpb24gYmVpbmcgcGVyZm9ybWVkLCBpbiB0aGlzIGNhc2UgZGVjb2RlCisgICAgICogQHBhcmFtIGNvbXBvbmVudE5hbWUgIE5hbWUgb2YgdGhlIGNvbXBvbmVudC9jb2RlYworICAgICAqIEBwYXJhbSBtb2RlICAgICAgICAgICBUaGUgb3BlcmF0aW5nIG1vZGU6IFN5bmMvQXN5bmMKKyAgICAgKiBAcGFyYW0gZHVyYXRpb25VcyAgICAgRHVyYXRpb24gb2YgdGhlIGNsaXAgaW4gbWljcm9zZWNvbmRzCisgICAgICogQHBhcmFtIHN0YXRzRmlsZSAgICAgIFRoZSBvdXRwdXQgZmlsZSB3aGVyZSB0aGUgc3RhdHMgZGF0YSBpcyB3cml0dGVuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZHVtcFN0YXRpc3RpY3MoU3RyaW5nIGlucHV0UmVmZXJlbmNlLCBTdHJpbmcgY29tcG9uZW50TmFtZSwgU3RyaW5nIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkdXJhdGlvblVzLCBTdHJpbmcgc3RhdHNGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgb3BlcmF0aW9uID0gImVuY29kZSI7CisgICAgICAgIG1TdGF0cy5kdW1wU3RhdGlzdGljcygKKyAgICAgICAgICAgICAgICBpbnB1dFJlZmVyZW5jZSwgb3BlcmF0aW9uLCBjb21wb25lbnROYW1lLCBtb2RlLCBkdXJhdGlvblVzLCBzdGF0c0ZpbGUpOworICAgIH0KKworICAgIC8qKgorICAgICAqIFJlc2V0cyB0aGUgc3RhdHMKKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCByZXNldEVuY29kZXIoKSB7CisgICAgICAgIG1PZmZzZXQgPSAwOworICAgICAgICBtSW5wdXRCdWZmZXJTaXplID0gMDsKKyAgICAgICAgbU51bUlucHV0RnJhbWUgPSAwOworICAgICAgICBtU2F3SW5wdXRFT1MgPSBmYWxzZTsKKyAgICAgICAgbVNhd091dHB1dEVPUyA9IGZhbHNlOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSBmYWxzZTsKKyAgICAgICAgbVN0YXRzLnJlc2V0KCk7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay9saWJyYXJ5L0V4dHJhY3Rvci5qYXZhIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL01lZGlhQmVuY2htYXJrVGVzdC9zcmMvbWFpbi9qYXZhL2NvbS9hbmRyb2lkL21lZGlhL2JlbmNobWFyay9saWJyYXJ5L0V4dHJhY3Rvci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMDI0ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvRXh0cmFjdG9yLmphdmEKQEAgLTAsMCArMSwxNzggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay5saWJyYXJ5OworCitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFFeHRyYWN0b3I7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUZvcm1hdDsKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5GaWxlRGVzY3JpcHRvcjsKK2ltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOworaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7CisKK3B1YmxpYyBjbGFzcyBFeHRyYWN0b3IgeworICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiRXh0cmFjdG9yIjsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQga01heEJ1ZlNpemUgPSAxMDI0ICogMTAyNCAqIDE2OworICAgIHByaXZhdGUgTWVkaWFFeHRyYWN0b3IgbUV4dHJhY3RvcjsKKyAgICBwcml2YXRlIEJ5dGVCdWZmZXIgbUZyYW1lQnVmZmVyOworICAgIHByaXZhdGUgTWVkaWFDb2RlYy5CdWZmZXJJbmZvIG1CdWZmZXJJbmZvOworICAgIHByaXZhdGUgU3RhdHMgbVN0YXRzOworICAgIHByaXZhdGUgbG9uZyBtRHVyYXRpb25VczsKKworICAgIHB1YmxpYyBFeHRyYWN0b3IoKSB7CisgICAgICAgIG1GcmFtZUJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoa01heEJ1ZlNpemUpOworICAgICAgICBtQnVmZmVySW5mbyA9IG5ldyBNZWRpYUNvZGVjLkJ1ZmZlckluZm8oKTsKKyAgICAgICAgbVN0YXRzID0gbmV3IFN0YXRzKCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQ3JlYXRlcyBhIE1lZGlhIEV4dHJhY3RvciBhbmQgc2V0cyBkYXRhIHNvdXJjZShGaWxlRGVzY3JpcHRvcil0byB1c2UKKyAgICAgKgorICAgICAqIEBwYXJhbSBmaWxlRGVzY3JpcHRvciBGaWxlRGVzY3JpcHRvciBmb3IgdGhlIGZpbGUgd2hpY2ggaXMgdG8gYmUgZXh0cmFjdGVkCisgICAgICogQHJldHVybiBUcmFja0NvdW50IG9mIHRoZSBzYW1wbGUKKyAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIElmIEZpbGVEZXNjcmlwdG9yIGlzIG51bGwKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNldFVwRXh0cmFjdG9yKEZpbGVEZXNjcmlwdG9yIGZpbGVEZXNjcmlwdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBsb25nIHNUaW1lID0gbVN0YXRzLmdldEN1clRpbWUoKTsKKyAgICAgICAgbUV4dHJhY3RvciA9IG5ldyBNZWRpYUV4dHJhY3RvcigpOworICAgICAgICBtRXh0cmFjdG9yLnNldERhdGFTb3VyY2UoZmlsZURlc2NyaXB0b3IpOworICAgICAgICBsb25nIGVUaW1lID0gbVN0YXRzLmdldEN1clRpbWUoKTsKKyAgICAgICAgbG9uZyB0aW1lVGFrZW4gPSBtU3RhdHMuZ2V0VGltZURpZmYoc1RpbWUsIGVUaW1lKTsKKyAgICAgICAgbVN0YXRzLnNldEluaXRUaW1lKHRpbWVUYWtlbik7CisgICAgICAgIHJldHVybiBtRXh0cmFjdG9yLmdldFRyYWNrQ291bnQoKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSB0cmFjayBmb3JtYXQgb2YgdGhlIHNwZWNpZmllZCBpbmRleAorICAgICAqCisgICAgICogQHBhcmFtIHRyYWNrSUQgSW5kZXggb2YgdGhlIHRyYWNrCisgICAgICogQHJldHVybiBGb3JtYXQgb2YgdGhlIHRyYWNrCisgICAgICovCisgICAgcHVibGljIE1lZGlhRm9ybWF0IGdldEZvcm1hdChpbnQgdHJhY2tJRCkgeyByZXR1cm4gbUV4dHJhY3Rvci5nZXRUcmFja0Zvcm1hdCh0cmFja0lEKTsgfQorCisgICAgLyoqCisgICAgICogUmV0dXJucyB0aGUgZXh0cmFjdGVkIGJ1ZmZlciBmb3IgdGhlIGlucHV0IGNsaXAKKyAgICAgKi8KKyAgICBwdWJsaWMgQnl0ZUJ1ZmZlciBnZXRGcmFtZUJ1ZmZlcigpIHsgcmV0dXJuIHRoaXMubUZyYW1lQnVmZmVyOyB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBpbmZvcm1hdGlvbiBvZiBidWZmZXIgcmVsYXRlZCB0byBzYW1wbGUKKyAgICAgKi8KKyAgICBwdWJsaWMgTWVkaWFDb2RlYy5CdWZmZXJJbmZvIGdldEJ1ZmZlckluZm8oKSB7IHJldHVybiB0aGlzLm1CdWZmZXJJbmZvOyB9CisKKyAgICAvKioKKyAgICAgKiBSZXR1cm5zIHRoZSBkdXJhdGlvbiBvZiB0aGUgc2FtcGxlCisgICAgICovCisgICAgcHVibGljIGxvbmcgZ2V0Q2xpcER1cmF0aW9uKCkgeyByZXR1cm4gdGhpcy5tRHVyYXRpb25VczsgfQorCisgICAgLyoqCisgICAgICogUmV0cmlldmUgdGhlIGN1cnJlbnQgc2FtcGxlIGFuZCBzdG9yZSBpdCBpbiB0aGUgYnl0ZSBidWZmZXIKKyAgICAgKiBBbHNvLCBzZXRzIHRoZSBpbmZvcm1hdGlvbiByZWxhdGVkIHRvIGV4dHJhY3RlZCBzYW1wbGUgYW5kIHN0b3JlIGl0IGluIGJ1ZmZlciBpbmZvCisgICAgICoKKyAgICAgKiBAcmV0dXJuIFNhbXBsZSBzaXplIG9mIHRoZSBleHRyYWN0ZWQgc2FtcGxlCisgICAgICovCisgICAgcHVibGljIGludCBnZXRGcmFtZVNhbXBsZSgpIHsKKyAgICAgICAgaW50IHNhbXBsZVNpemUgPSBtRXh0cmFjdG9yLnJlYWRTYW1wbGVEYXRhKG1GcmFtZUJ1ZmZlciwgMCk7CisgICAgICAgIGlmIChzYW1wbGVTaXplIDwgMCkgeworICAgICAgICAgICAgbUJ1ZmZlckluZm8uZmxhZ3MgPSBNZWRpYUNvZGVjLkJVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU07CisgICAgICAgICAgICBtQnVmZmVySW5mby5zaXplID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1CdWZmZXJJbmZvLnNpemUgPSBzYW1wbGVTaXplOworICAgICAgICAgICAgbUJ1ZmZlckluZm8ub2Zmc2V0ID0gMDsKKyAgICAgICAgICAgIG1CdWZmZXJJbmZvLmZsYWdzID0gbUV4dHJhY3Rvci5nZXRTYW1wbGVGbGFncygpOworICAgICAgICAgICAgbUJ1ZmZlckluZm8ucHJlc2VudGF0aW9uVGltZVVzID0gbUV4dHJhY3Rvci5nZXRTYW1wbGVUaW1lKCk7CisgICAgICAgICAgICBtRXh0cmFjdG9yLmFkdmFuY2UoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gc2FtcGxlU2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBTZXR1cCB0aGUgdHJhY2sgZm9ybWF0IGFuZCBnZXQgdGhlIGR1cmF0aW9uIG9mIHRoZSBzYW1wbGUKKyAgICAgKiBUcmFjayBpcyBzZWxlY3RlZCBoZXJlIGZvciBleHRyYWN0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhY2tJZCBUcmFjayBpbmRleCB0byBiZSBzZWxlY3RlZAorICAgICAqIEByZXR1cm4gMCBmb3IgdmFsaWQgdHJhY2ssIG90aGVyd2lzZSAtMQorICAgICAqLworICAgIHB1YmxpYyBpbnQgc2VsZWN0RXh0cmFjdG9yVHJhY2soaW50IHRyYWNrSWQpIHsKKyAgICAgICAgTWVkaWFGb3JtYXQgdHJhY2tGb3JtYXQgPSBtRXh0cmFjdG9yLmdldFRyYWNrRm9ybWF0KHRyYWNrSWQpOworICAgICAgICBtRHVyYXRpb25VcyA9IHRyYWNrRm9ybWF0LmdldExvbmcoTWVkaWFGb3JtYXQuS0VZX0RVUkFUSU9OKTsKKyAgICAgICAgaWYgKG1EdXJhdGlvblVzIDwgMCkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCBDbGlwIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgbUV4dHJhY3Rvci5zZWxlY3RUcmFjayh0cmFja0lkKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogVW5zZWxlY3QgdGhlIHRyYWNrCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhY2tJZCBUcmFjayBJbmRleCB0byBiZSB1bnNlbGVjdGVkCisgICAgICovCisgICAgcHVibGljIHZvaWQgdW5zZWxlY3RFeHRyYWN0b3JUcmFjayhpbnQgdHJhY2tJZCkgeyBtRXh0cmFjdG9yLnVuc2VsZWN0VHJhY2sodHJhY2tJZCk7IH0KKworICAgIC8qKgorICAgICAqIEZyZWUgdXAgdGhlIHJlc291cmNlcworICAgICAqLworICAgIHB1YmxpYyB2b2lkIGRlaW5pdEV4dHJhY3RvcigpIHsKKyAgICAgICAgbG9uZyBzVGltZSA9IG1TdGF0cy5nZXRDdXJUaW1lKCk7CisgICAgICAgIG1FeHRyYWN0b3IucmVsZWFzZSgpOworICAgICAgICBsb25nIGVUaW1lID0gbVN0YXRzLmdldEN1clRpbWUoKTsKKyAgICAgICAgbG9uZyB0aW1lVGFrZW4gPSBtU3RhdHMuZ2V0VGltZURpZmYoc1RpbWUsIGVUaW1lKTsKKyAgICAgICAgbVN0YXRzLnNldERlSW5pdFRpbWUodGltZVRha2VuKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBQZXJmb3JtcyBleHRyYWN0IG9wZXJhdGlvbgorICAgICAqCisgICAgICogQHBhcmFtIGN1cnJlbnRUcmFjayBUcmFjayBpbmRleCB0byBiZSBleHRyYWN0ZWQKKyAgICAgKiBAcmV0dXJuIFN0YXR1cyBhcyAwIGlmIGV4dHJhY3Rpb24gaXMgc3VjY2Vzc2Z1bCwgLTEgb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGludCBleHRyYWN0U2FtcGxlKGludCBjdXJyZW50VHJhY2spIHsKKyAgICAgICAgaW50IHN0YXR1czsKKyAgICAgICAgc3RhdHVzID0gc2VsZWN0RXh0cmFjdG9yVHJhY2soY3VycmVudFRyYWNrKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSAtMSkgeworICAgICAgICAgICAgTG9nLmUoVEFHLCAiRmFpbGVkIHRvIHNlbGVjdCB0cmFjayIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIG1TdGF0cy5zZXRTdGFydFRpbWUoKTsKKyAgICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgICAgIGludCByZWFkU2FtcGxlU2l6ZSA9IGdldEZyYW1lU2FtcGxlKCk7CisgICAgICAgICAgICBpZiAocmVhZFNhbXBsZVNpemUgPD0gMCkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbVN0YXRzLmFkZE91dHB1dFRpbWUoKTsKKyAgICAgICAgICAgIG1TdGF0cy5hZGRGcmFtZVNpemUocmVhZFNhbXBsZVNpemUpOworICAgICAgICB9CisgICAgICAgIHVuc2VsZWN0RXh0cmFjdG9yVHJhY2soY3VycmVudFRyYWNrKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIGJlbmNobWFyayBsb2dzIGZvciB0aGUgZ2l2ZW4gaW5wdXQgZmlsZQorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0UmVmZXJlbmNlIE5hbWUgb2YgdGhlIGlucHV0IGZpbGUKKyAgICAgKiBAcGFyYW0gbWltZVR5cGUgICAgICAgTWltZSB0eXBlIG9mIHRoZSBtdXhlZCBmaWxlCisgICAgICogQHBhcmFtIHN0YXRzRmlsZSAgICAgIFRoZSBvdXRwdXQgZmlsZSB3aGVyZSB0aGUgc3RhdHMgZGF0YSBpcyB3cml0dGVuCisgICAgICovCisgICAgcHVibGljIHZvaWQgZHVtcFN0YXRpc3RpY3MoU3RyaW5nIGlucHV0UmVmZXJlbmNlLCBTdHJpbmcgbWltZVR5cGUsIFN0cmluZyBzdGF0c0ZpbGUpCisgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBTdHJpbmcgb3BlcmF0aW9uID0gImV4dHJhY3QiOworICAgICAgICBtU3RhdHMuZHVtcFN0YXRpc3RpY3MoaW5wdXRSZWZlcmVuY2UsIG9wZXJhdGlvbiwgbWltZVR5cGUsICIiLCBtRHVyYXRpb25Vcywgc3RhdHNGaWxlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvTXV4ZXIuamF2YSBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvbGlicmFyeS9NdXhlci5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0MGI1MzkKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvTXV4ZXIuamF2YQpAQCAtMCwwICsxLDExMyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCitwYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay5saWJyYXJ5OworCitpbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvZGVjOworaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7CitpbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU11eGVyOworCitpbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKK2ltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOworaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7CisKK3B1YmxpYyBjbGFzcyBNdXhlciB7CisgICAgcHJpdmF0ZSBTdGF0cyBtU3RhdHM7CisgICAgcHJpdmF0ZSBNZWRpYU11eGVyIG1NdXhlcjsKKworICAgIC8qKgorICAgICAqIENyZWF0ZXMgYSBNZWRpYSBNdXhlciBmb3IgdGhlIHNwZWNpZmllZCBwYXRoCisgICAgICoKKyAgICAgKiBAcGFyYW0gY29udGV4dCAgICAgIEFwcCBjb250ZXh0IHRvIHNwZWNpZnkgdGhlIG91dHB1dCBmaWxlIHBhdGgKKyAgICAgKiBAcGFyYW0gb3V0cHV0Rm9ybWF0IEZvcm1hdCBvZiB0aGUgb3V0cHV0IG1lZGlhIGZpbGUKKyAgICAgKiBAcGFyYW0gdHJhY2tGb3JtYXQgIEZvcm1hdCBvZiB0aGUgY3VycmVudCB0cmFjaworICAgICAqIEByZXR1cm4gUmV0dXJucyB0aGUgdHJhY2sgaW5kZXggb2YgdGhlIG5ld2x5IGFkZGVkIHRyYWNrLCAtMSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBwdWJsaWMgaW50IHNldFVwTXV4ZXIoQ29udGV4dCBjb250ZXh0LCBpbnQgb3V0cHV0Rm9ybWF0LCBNZWRpYUZvcm1hdCB0cmFja0Zvcm1hdCkgeworICAgICAgICB0cnkgeworICAgICAgICAgICAgbVN0YXRzID0gbmV3IFN0YXRzKCk7CisgICAgICAgICAgICBsb25nIHNUaW1lID0gbVN0YXRzLmdldEN1clRpbWUoKTsKKyAgICAgICAgICAgIG1NdXhlciA9IG5ldyBNZWRpYU11eGVyKGNvbnRleHQuZ2V0RmlsZXNEaXIoKS5nZXRQYXRoKCkgKyAiL211eC5vdXQuIiwgb3V0cHV0Rm9ybWF0KTsKKyAgICAgICAgICAgIGludCB0cmFja0luZGV4ID0gbU11eGVyLmFkZFRyYWNrKHRyYWNrRm9ybWF0KTsKKyAgICAgICAgICAgIG1NdXhlci5zdGFydCgpOworICAgICAgICAgICAgbG9uZyBlVGltZSA9IG1TdGF0cy5nZXRDdXJUaW1lKCk7CisgICAgICAgICAgICBsb25nIHRpbWVUYWtlbiA9IG1TdGF0cy5nZXRUaW1lRGlmZihzVGltZSwgZVRpbWUpOworICAgICAgICAgICAgbVN0YXRzLnNldEluaXRUaW1lKHRpbWVUYWtlbik7CisgICAgICAgICAgICByZXR1cm4gdHJhY2tJbmRleDsKKyAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHwgSU9FeGNlcHRpb24gZSkgeworICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qKgorICAgICAqIFBlcmZvcm1zIHRoZSBNdXggb3BlcmF0aW9uCisgICAgICoKKyAgICAgKiBAcGFyYW0gdHJhY2tJbmRleCAgICAgICAgICAgVHJhY2sgaW5kZXggb2YgdGhlIHNhbXBsZQorICAgICAqIEBwYXJhbSBpbnB1dEV4dHJhY3RlZEJ1ZmZlciBCdWZmZXIgY29udGFpbmluZyBlbmNvZGVkIHNhbXBsZXMKKyAgICAgKiBAcGFyYW0gaW5wdXRCdWZmZXJJbmZvICAgICAgQnVmZmVyIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlc2Ugc2FtcGxlcworICAgICAqIEByZXR1cm4gUmV0dXJucyBTdGF0dXMgYXMgMCBpZiB3cml0ZSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCwgLTEgb3RoZXJ3aXNlCisgICAgICovCisgICAgcHVibGljIGludCBtdXgoaW50IHRyYWNrSW5kZXgsIEFycmF5TGlzdDxCeXRlQnVmZmVyPiBpbnB1dEV4dHJhY3RlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICBBcnJheUxpc3Q8TWVkaWFDb2RlYy5CdWZmZXJJbmZvPiBpbnB1dEJ1ZmZlckluZm8pIHsKKyAgICAgICAgbVN0YXRzLnNldFN0YXJ0VGltZSgpOworICAgICAgICBmb3IgKGludCBzYW1wbGVDb3VudCA9IDA7IHNhbXBsZUNvdW50IDwgaW5wdXRFeHRyYWN0ZWRCdWZmZXIuc2l6ZSgpOyBzYW1wbGVDb3VudCsrKSB7CisgICAgICAgICAgICB0cnkgeworICAgICAgICAgICAgICAgIG1NdXhlci53cml0ZVNhbXBsZURhdGEodHJhY2tJbmRleCwgaW5wdXRFeHRyYWN0ZWRCdWZmZXIuZ2V0KHNhbXBsZUNvdW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0QnVmZmVySW5mby5nZXQoc2FtcGxlQ291bnQpKTsKKyAgICAgICAgICAgICAgICBtU3RhdHMuYWRkT3V0cHV0VGltZSgpOworICAgICAgICAgICAgICAgIG1TdGF0cy5hZGRGcmFtZVNpemUoaW5wdXRCdWZmZXJJbmZvLmdldChzYW1wbGVDb3VudCkuc2l6ZSk7CisgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gfCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgeworICAgICAgICAgICAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8qKgorICAgICAqIFN0b3BzIHRoZSBtdXhlciBhbmQgZnJlZSB1cCB0aGUgcmVzb3VyY2VzCisgICAgICovCisgICAgcHVibGljIHZvaWQgZGVJbml0TXV4ZXIoKSB7CisgICAgICAgIGxvbmcgc1RpbWUgPSBtU3RhdHMuZ2V0Q3VyVGltZSgpOworICAgICAgICBtTXV4ZXIuc3RvcCgpOworICAgICAgICBtTXV4ZXIucmVsZWFzZSgpOworICAgICAgICBsb25nIGVUaW1lID0gbVN0YXRzLmdldEN1clRpbWUoKTsKKyAgICAgICAgbG9uZyB0aW1lVGFrZW4gPSBtU3RhdHMuZ2V0VGltZURpZmYoc1RpbWUsIGVUaW1lKTsKKyAgICAgICAgbVN0YXRzLnNldERlSW5pdFRpbWUodGltZVRha2VuKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBSZXNldHMgdGhlIHN0YXRzCisgICAgICovCisgICAgcHVibGljIHZvaWQgcmVzZXRNdXhlcigpIHsKKyAgICAgICAgbVN0YXRzLnJlc2V0KCk7CisgICAgfQorCisgICAgLyoqCisgICAgICogV3JpdGUgdGhlIGJlbmNobWFyayBsb2dzIGZvciB0aGUgZ2l2ZW4gaW5wdXQgZmlsZQorICAgICAqCisgICAgICogQHBhcmFtIGlucHV0UmVmZXJlbmNlIE5hbWUgb2YgdGhlIGlucHV0IGZpbGUKKyAgICAgKiBAcGFyYW0gbXV4Rm9ybWF0ICAgICAgRm9ybWF0IG9mIHRoZSBtdXhlZCBvdXRwdXQKKyAgICAgKiBAcGFyYW0gY2xpcER1cmF0aW9uICAgRHVyYXRpb24gb2YgdGhlIGdpdmVuIGlucHV0UmVmZXJlbmNlIGZpbGUKKyAgICAgKiBAcGFyYW0gc3RhdHNGaWxlICAgICAgVGhlIG91dHB1dCBmaWxlIHdoZXJlIHRoZSBzdGF0cyBkYXRhIGlzIHdyaXR0ZW4KKyAgICAgKi8KKyAgICBwdWJsaWMgdm9pZCBkdW1wU3RhdGlzdGljcyhTdHJpbmcgaW5wdXRSZWZlcmVuY2UsIFN0cmluZyBtdXhGb3JtYXQsIGxvbmcgY2xpcER1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdGF0c0ZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIFN0cmluZyBvcGVyYXRpb24gPSAibXV4IjsKKyAgICAgICAgbVN0YXRzLmR1bXBTdGF0aXN0aWNzKGlucHV0UmVmZXJlbmNlLCBvcGVyYXRpb24sIG11eEZvcm1hdCwgIiIsIGNsaXBEdXJhdGlvbiwgc3RhdHNGaWxlKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvTmF0aXZlLmphdmEgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvTmF0aXZlLmphdmEKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhiNjA4YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvbGlicmFyeS9OYXRpdmUuamF2YQpAQCAtMCwwICsxLDMyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsubGlicmFyeTsKKworcHVibGljIGNsYXNzIE5hdGl2ZSB7CisgICAgc3RhdGljIHsgU3lzdGVtLmxvYWRMaWJyYXJ5KCJtZWRpYWJlbmNobWFya19qbmkiKTsgfQorCisgICAgcHVibGljIG5hdGl2ZSBpbnQgRXh0cmFjdChTdHJpbmcgaW5wdXRGaWxlUGF0aCwgU3RyaW5nIGlucHV0RmlsZU5hbWUsIFN0cmluZyBzdGF0c0ZpbGUpOworCisgICAgcHVibGljIG5hdGl2ZSBpbnQgTXV4KFN0cmluZyBpbnB1dEZpbGVQYXRoLCBTdHJpbmcgaW5wdXRGaWxlTmFtZSwgU3RyaW5nIG91dHB1dEZpbGVQYXRoLAorICAgICAgICAgICAgU3RyaW5nIHN0YXRzRmlsZSwgU3RyaW5nIGZvcm1hdCk7CisKKyAgICBwdWJsaWMgbmF0aXZlIGludCBEZWNvZGUoU3RyaW5nIGlucHV0RmlsZVBhdGgsIFN0cmluZyBpbnB1dEZpbGVOYW1lLCBTdHJpbmcgc3RhdHNGaWxlLAorICAgICAgICAgICAgU3RyaW5nIGNvZGVjTmFtZSwgYm9vbGVhbiBhc3luY01vZGUpOworCisgICAgcHVibGljIG5hdGl2ZSBpbnQgRW5jb2RlKFN0cmluZyBpbnB1dEZpbGVQYXRoLCBTdHJpbmcgaW5wdXRGaWxlTmFtZSwgU3RyaW5nIG91dHB1dEZpbGVQYXRoLAorICAgICAgICAgICAgU3RyaW5nIHN0YXRzRmlsZSwgU3RyaW5nIGNvZGVjTmFtZSk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvU3RhdHMuamF2YSBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9NZWRpYUJlbmNobWFya1Rlc3Qvc3JjL21haW4vamF2YS9jb20vYW5kcm9pZC9tZWRpYS9iZW5jaG1hcmsvbGlicmFyeS9TdGF0cy5qYXZhCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyNDVhM2EKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvTWVkaWFCZW5jaG1hcmtUZXN0L3NyYy9tYWluL2phdmEvY29tL2FuZHJvaWQvbWVkaWEvYmVuY2htYXJrL2xpYnJhcnkvU3RhdHMuamF2YQpAQCAtMCwwICsxLDE3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK3BhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLmxpYnJhcnk7CisKK2ltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOworCitpbXBvcnQgamF2YS5pby5GaWxlOworaW1wb3J0IGphdmEuaW8uRmlsZURlc2NyaXB0b3I7CitpbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOworaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247CitpbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKKworLyoqCisgKiBNZWFzdXJlcyBQZXJmb3JtYW5jZS4KKyAqLworcHVibGljIGNsYXNzIFN0YXRzIHsKKyAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN0YXRzIjsKKyAgICBwcml2YXRlIGxvbmcgbUluaXRUaW1lTnM7CisgICAgcHJpdmF0ZSBsb25nIG1EZUluaXRUaW1lTnM7CisgICAgcHJpdmF0ZSBsb25nIG1TdGFydFRpbWVOczsKKyAgICBwcml2YXRlIEFycmF5TGlzdDxJbnRlZ2VyPiBtRnJhbWVTaXplczsKKyAgICBwcml2YXRlIEFycmF5TGlzdDxMb25nPiBtSW5wdXRUaW1lcjsKKyAgICBwcml2YXRlIEFycmF5TGlzdDxMb25nPiBtT3V0cHV0VGltZXI7CisKKyAgICBwdWJsaWMgU3RhdHMoKSB7CisgICAgICAgIG1GcmFtZVNpemVzID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIG1JbnB1dFRpbWVyID0gbmV3IEFycmF5TGlzdDw+KCk7CisgICAgICAgIG1PdXRwdXRUaW1lciA9IG5ldyBBcnJheUxpc3Q8PigpOworICAgICAgICBtSW5pdFRpbWVOcyA9IDA7CisgICAgICAgIG1EZUluaXRUaW1lTnMgPSAwOworICAgIH0KKworICAgIHB1YmxpYyBsb25nIGdldEN1clRpbWUoKSB7IHJldHVybiBTeXN0ZW0ubmFub1RpbWUoKTsgfQorCisgICAgcHVibGljIHZvaWQgc2V0SW5pdFRpbWUobG9uZyBpbml0VGltZSkgeyBtSW5pdFRpbWVOcyA9IGluaXRUaW1lOyB9CisKKyAgICBwdWJsaWMgdm9pZCBzZXREZUluaXRUaW1lKGxvbmcgZGVJbml0VGltZSkgeyBtRGVJbml0VGltZU5zID0gZGVJbml0VGltZTsgfQorCisgICAgcHVibGljIHZvaWQgc2V0U3RhcnRUaW1lKCkgeyBtU3RhcnRUaW1lTnMgPSBTeXN0ZW0ubmFub1RpbWUoKTsgfQorCisgICAgcHVibGljIHZvaWQgYWRkRnJhbWVTaXplKGludCBzaXplKSB7IG1GcmFtZVNpemVzLmFkZChzaXplKTsgfQorCisgICAgcHVibGljIHZvaWQgYWRkSW5wdXRUaW1lKCkgeyBtSW5wdXRUaW1lci5hZGQoU3lzdGVtLm5hbm9UaW1lKCkpOyB9CisKKyAgICBwdWJsaWMgdm9pZCBhZGRPdXRwdXRUaW1lKCkgeyBtT3V0cHV0VGltZXIuYWRkKFN5c3RlbS5uYW5vVGltZSgpKTsgfQorCisgICAgcHVibGljIHZvaWQgcmVzZXQoKSB7CisgICAgICAgIGlmIChtRnJhbWVTaXplcy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgbUZyYW1lU2l6ZXMuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtSW5wdXRUaW1lci5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgbUlucHV0VGltZXIuY2xlYXIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChtT3V0cHV0VGltZXIuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIG1PdXRwdXRUaW1lci5jbGVhcigpOworICAgICAgICB9CisgICAgfQorCisgICAgcHVibGljIGxvbmcgZ2V0SW5pdFRpbWUoKSB7IHJldHVybiBtSW5pdFRpbWVOczsgfQorCisgICAgcHVibGljIGxvbmcgZ2V0RGVJbml0VGltZSgpIHsgcmV0dXJuIG1EZUluaXRUaW1lTnM7IH0KKworICAgIHB1YmxpYyBsb25nIGdldFRpbWVEaWZmKGxvbmcgc1RpbWUsIGxvbmcgZVRpbWUpIHsgcmV0dXJuIChlVGltZSAtIHNUaW1lKTsgfQorCisgICAgcHJpdmF0ZSBsb25nIGdldFRvdGFsVGltZSgpIHsKKyAgICAgICAgaWYgKG1PdXRwdXRUaW1lci5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIGxvbmcgbGFzdFRpbWUgPSBtT3V0cHV0VGltZXIuZ2V0KG1PdXRwdXRUaW1lci5zaXplKCkgLSAxKTsKKyAgICAgICAgcmV0dXJuIGxhc3RUaW1lIC0gbVN0YXJ0VGltZU5zOworICAgIH0KKworICAgIHByaXZhdGUgbG9uZyBnZXRUb3RhbFNpemUoKSB7CisgICAgICAgIGxvbmcgdG90YWxTaXplID0gMDsKKyAgICAgICAgZm9yIChsb25nIHNpemUgOiBtRnJhbWVTaXplcykgeworICAgICAgICAgICAgdG90YWxTaXplICs9IHNpemU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRvdGFsU2l6ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBXcml0ZXMgdGhlIHN0YXRzIGhlYWRlciB0byBhIGZpbGUKKyAgICAgKiA8cD4KKyAgICAgKiBccGFyYW0gc3RhdHNGaWxlICAgIGZpbGUgd2hlcmUgdGhlIHN0YXRzIGRhdGEgaXMgdG8gYmUgd3JpdHRlbgorICAgICAqKi8KKyAgICBwdWJsaWMgYm9vbGVhbiB3cml0ZVN0YXRzSGVhZGVyKFN0cmluZyBzdGF0c0ZpbGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7CisgICAgICAgIEZpbGUgb3V0cHV0RmlsZSA9IG5ldyBGaWxlKHN0YXRzRmlsZSk7CisgICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0cHV0RmlsZSwgdHJ1ZSk7CisgICAgICAgIGlmICghb3V0cHV0RmlsZS5leGlzdHMoKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgU3RyaW5nIHN0YXRzSGVhZGVyID0KKyAgICAgICAgICAgICAgICAiY3VycmVudFRpbWUsIGZpbGVOYW1lLCBvcGVyYXRpb24sIGNvbXBvbmVudE5hbWUsIE5ESy9TREssIHN5bmMvYXN5bmMsIHNldHVwVGltZSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiZGVzdHJveVRpbWUsIG1pbmltdW1UaW1lLCBtYXhpbXVtVGltZSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAiYXZlcmFnZVRpbWUsIHRpbWVUb1Byb2Nlc3MxU2VjQ29udGVudCwgdG90YWxCeXRlc1Byb2Nlc3NlZFBlclNlYywgIgorICAgICAgICAgICAgICAgICAgICAgICAgKyAidGltZVRvRmlyc3RGcmFtZSwgdG90YWxTaXplSW5CeXRlcywgdG90YWxUaW1lXG4iOworICAgICAgICBvdXQud3JpdGUoc3RhdHNIZWFkZXIuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIG91dC5jbG9zZSgpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBEdW1wcyB0aGUgc3RhdHMgb2YgdGhlIG9wZXJhdGlvbiBmb3IgYSBnaXZlbiBpbnB1dCBtZWRpYS4KKyAgICAgKiA8cD4KKyAgICAgKiBccGFyYW0gaW5wdXRSZWZlcmVuY2UgaW5wdXQgbWVkaWEKKyAgICAgKiBccGFyYW0gb3BlcmF0aW9uICAgICAgZGVzY3JpYmVzIHRoZSBvcGVyYXRpb24gcGVyZm9ybWVkIG9uIHRoZSBpbnB1dCBtZWRpYQorICAgICAqIChpLmUuIGV4dHJhY3QvbXV4L2RlY29kZS9lbmNvZGUpCisgICAgICogXHBhcmFtIGNvbXBvbmVudE5hbWUgIG5hbWUgb2YgdGhlIGNvZGVjL211eEZvcm1hdC9taW1lCisgICAgICogXHBhcmFtIG1vZGUgICAgICAgICAgIHRoZSBvcGVyYXRpbmcgbW9kZTogc3luYy9hc3luYy4KKyAgICAgKiBccGFyYW0gZHVyYXRpb25VcyAgICAgaXMgYSBkdXJhdGlvbiBvZiB0aGUgaW5wdXQgbWVkaWEgaW4gbWljcm9zZWNvbmRzLgorICAgICAqIFxwYXJhbSBzdGF0c0ZpbGUgICAgICB0aGUgZmlsZSB3aGVyZSB0aGUgc3RhdHMgZGF0YSBpcyB0byBiZSB3cml0dGVuLgorICAgICAqLworICAgIHB1YmxpYyB2b2lkIGR1bXBTdGF0aXN0aWNzKFN0cmluZyBpbnB1dFJlZmVyZW5jZSwgU3RyaW5nIG9wZXJhdGlvbiwgU3RyaW5nIGNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICBTdHJpbmcgbW9kZSwgbG9uZyBkdXJhdGlvblVzLCBTdHJpbmcgc3RhdHNGaWxlKSB0aHJvd3MgSU9FeGNlcHRpb24geworICAgICAgICBpZiAobU91dHB1dFRpbWVyLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICBMb2cuZShUQUcsICJObyBvdXRwdXQgcHJvZHVjZWQiKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBsb25nIHRvdGFsVGltZVRha2VuTnMgPSBnZXRUb3RhbFRpbWUoKTsKKyAgICAgICAgbG9uZyB0aW1lVGFrZW5QZXJTZWMgPSAodG90YWxUaW1lVGFrZW5OcyAqIDEwMDAwMDApIC8gZHVyYXRpb25VczsKKyAgICAgICAgbG9uZyB0aW1lVG9GaXJzdEZyYW1lTnMgPSBtT3V0cHV0VGltZXIuZ2V0KDApIC0gbVN0YXJ0VGltZU5zOworICAgICAgICBsb25nIHNpemUgPSBnZXRUb3RhbFNpemUoKTsKKyAgICAgICAgLy8gZ2V0IG1pbiBhbmQgbWF4IG91dHB1dCBpbnRlcnZhbHMuCisgICAgICAgIGxvbmcgaW50ZXJ2YWxOczsKKyAgICAgICAgbG9uZyBtaW5UaW1lVGFrZW5OcyA9IExvbmcuTUFYX1ZBTFVFOworICAgICAgICBsb25nIG1heFRpbWVUYWtlbk5zID0gMDsKKyAgICAgICAgbG9uZyBwcmV2SW50ZXJ2YWxOcyA9IG1TdGFydFRpbWVOczsKKyAgICAgICAgZm9yIChpbnQgaWR4ID0gMDsgaWR4IDwgbU91dHB1dFRpbWVyLnNpemUoKSAtIDE7IGlkeCsrKSB7CisgICAgICAgICAgICBpbnRlcnZhbE5zID0gbU91dHB1dFRpbWVyLmdldChpZHgpIC0gcHJldkludGVydmFsTnM7CisgICAgICAgICAgICBwcmV2SW50ZXJ2YWxOcyA9IG1PdXRwdXRUaW1lci5nZXQoaWR4KTsKKyAgICAgICAgICAgIGlmIChtaW5UaW1lVGFrZW5OcyA+IGludGVydmFsTnMpIHsKKyAgICAgICAgICAgICAgICBtaW5UaW1lVGFrZW5OcyA9IGludGVydmFsTnM7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1heFRpbWVUYWtlbk5zIDwgaW50ZXJ2YWxOcykgeworICAgICAgICAgICAgICAgIG1heFRpbWVUYWtlbk5zID0gaW50ZXJ2YWxOczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIFdyaXRlIHRoZSBzdGF0cyByb3cgZGF0YSB0byBmaWxlCisgICAgICAgIFN0cmluZyByb3dEYXRhID0gIiI7CisgICAgICAgIHJvd0RhdGEgKz0gU3lzdGVtLm5hbm9UaW1lKCkgKyAiLCAiOworICAgICAgICByb3dEYXRhICs9IGlucHV0UmVmZXJlbmNlICsgIiwgIjsKKyAgICAgICAgcm93RGF0YSArPSBvcGVyYXRpb24gKyAiLCAiOworICAgICAgICByb3dEYXRhICs9IGNvbXBvbmVudE5hbWUgKyAiLCAiOworICAgICAgICByb3dEYXRhICs9ICJTREssICI7CisgICAgICAgIHJvd0RhdGEgKz0gbW9kZSArICIsICI7CisgICAgICAgIHJvd0RhdGEgKz0gbUluaXRUaW1lTnMgKyAiLCAiOworICAgICAgICByb3dEYXRhICs9IG1EZUluaXRUaW1lTnMgKyAiLCAiOworICAgICAgICByb3dEYXRhICs9IG1pblRpbWVUYWtlbk5zICsgIiwgIjsKKyAgICAgICAgcm93RGF0YSArPSBtYXhUaW1lVGFrZW5OcyArICIsICI7CisgICAgICAgIHJvd0RhdGEgKz0gdG90YWxUaW1lVGFrZW5OcyAvIG1PdXRwdXRUaW1lci5zaXplKCkgKyAiLCAiOworICAgICAgICByb3dEYXRhICs9IHRpbWVUYWtlblBlclNlYyArICIsICI7CisgICAgICAgIHJvd0RhdGEgKz0gKHNpemUgKiAxMDAwMDAwMDAwKSAvIHRvdGFsVGltZVRha2VuTnMgKyAiLCAiOworICAgICAgICByb3dEYXRhICs9IHRpbWVUb0ZpcnN0RnJhbWVOcyArICIsICI7CisgICAgICAgIHJvd0RhdGEgKz0gc2l6ZSArICIsICI7CisgICAgICAgIHJvd0RhdGEgKz0gdG90YWxUaW1lVGFrZW5OcyArICJcbiI7CisKKyAgICAgICAgRmlsZSBvdXRwdXRGaWxlID0gbmV3IEZpbGUoc3RhdHNGaWxlKTsKKyAgICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXRwdXRGaWxlLCB0cnVlKTsKKyAgICAgICAgYXNzZXJ0IG91dHB1dEZpbGUuZXhpc3RzKCkgOiAiRmFpbGVkIHRvIG9wZW4gdGhlIHN0YXRzIGZpbGUgZm9yIHdyaXRpbmchIjsKKyAgICAgICAgb3V0LndyaXRlKHJvd0RhdGEuZ2V0Qnl0ZXMoKSk7CisgICAgICAgIG91dC5jbG9zZSgpOworICAgIH0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9SRUFETUUubWQgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvUkVBRE1FLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1ZmJlNmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvUkVBRE1FLm1kCkBAIC0wLDAgKzEsMTU2IEBACisjIEJlbmNobWFyayB0ZXN0cworCitCZW5jaG1hcmsgYXBwIGFuYWx5c2VzIHRoZSB0aW1lIHRha2VuIGJ5IE1lZGlhQ29kZWMsIE1lZGlhRXh0cmFjdG9yIGFuZCBNZWRpYU11eGVyIGZvciBnaXZlbiBzZXQgb2YgaW5wdXRzLiBJdCBpcyB1c2VkIHRvIGJlbmNobWFyayB0aGVzZSBtb2R1bGVzIG9uIGFuZHJvaWQgZGV2aWNlcy4KK0JlbmNobWFyayByZXN1bHRzIGFyZSBlbWl0dGVkIHRvIGxvZ2NhdC4KKworVGhpcyBwYWdlIGRlc2NyaWJlcyBzdGVwcyB0byBydW4gdGhlIE5ESyBhbmQgU0RLIGxheWVyIHRlc3QuCisKK1J1biB0aGUgZm9sbG93aW5nIHN0ZXBzIHRvIGJ1aWxkIHRoZSB0ZXN0IHN1aXRlOgorYGBgCittbW0gZnJhbWV3b3Jrcy9hdi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvCitgYGAKKworIyBOREsKKworVG8gcnVuIHRoZSB0ZXN0IHN1aXRlIGZvciBtZWFzdXJpbmcgcGVyZm9ybWFuY2Ugb2YgdGhlIG5hdGl2ZSBsYXllciwgZm9sbG93IHRoZSBmb2xsb3dpbmcgc3RlcHM6CisKK1RoZSBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJE9VVC9kYXRhL25hdGl2ZXRlc3Q2NC8KKworYWRiIHB1c2ggJE9VVC9kYXRhL25hdGl2ZXRlc3Q2NC8qIC9kYXRhL2xvY2FsL3RtcC8KKworRWcuIGFkYiBwdXNoICRPVVQvZGF0YS9uYXRpdmV0ZXN0NjQvZXh0cmFjdG9yVGVzdC9leHRyYWN0b3JUZXN0IC9kYXRhL2xvY2FsL3RtcC8KKworVG8gcnVuIHRoZSBiaW5hcnksIGZvbGxvdyB0aGUgY29tbWFuZHMgbWVudGlvbmVkIGJlbG93IHVuZGVyIGVhY2ggbW9kdWxlLgorCitUaGUgcmVzb3VyY2UgZmlsZSBmb3IgdGhlIHRlc3RzIGlzIHRha2VuIGZyb20gW2hlcmVdKGh0dHBzOi8vZHJpdmUuZ29vZ2xlLmNvbS9vcGVuP2lkPTFnaE1yMTdCQko3bjBwcWJtN29SRWlUTl9NTmVtSlVxeSkKKworRG93bmxvYWQgdGhlIE1lZGlhQmVuY2htYXJrLnppcCBmaWxlLCB1bnppcCBhbmQgcHVzaCBpdCB0byAvZGF0YS9sb2NhbC90bXAvIG9uIHRoZSBkZXZpY2UuCisKK2BgYAordW56aXAgTWVkaWFCZW5jaG1hcmsuemlwCithZGIgcHVzaCBNZWRpYUJlbmNobWFyayAvZGF0YS9sb2NhbC90bXAKK2BgYAorCisjIyBFeHRyYWN0b3IKKworVGhlIHRlc3QgZXh0cmFjdHMgZWxlbWVudGFyeSBzdHJlYW0gYW5kIGJlbmNobWFya3MgdGhlIGV4dHJhY3RvcnMgYXZhaWxhYmxlIGluIE5ESy4KKworVGhlIHJlc291cmNlIGZpbGVzIGFyZSBhc3N1bWVkIHRvIGJlIGF0IC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvLiBZb3UgY2FuIHVzZSBhIGRpZmZlcmVudCBsb2NhdGlvbiwgYnV0IHlvdSBoYXZlIHRvIG1vZGlmeSB0aGUgcmVzdCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIHRvIHJlcGxhY2UgL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy8gd2l0aCB3aGVyZXZlciB5b3UgY2hvc2UgdG8gcHV0IHRoZSBmaWxlcy4KKworVGhlIHBhdGggdG8gdGhlc2UgZmlsZXMgb24gdGhlIGRldmljZSBpcyByZXF1aXJlZCB0byBiZSBnaXZlbiBmb3IgdGhlIHRlc3QuCisKK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9leHRyYWN0b3JUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvCitgYGAKKworIyMgRGVjb2RlcgorCitUaGUgdGVzdCBkZWNvZGVzIGlucHV0IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgZGVjb2RlcnMgYXZhaWxhYmxlIGluIE5ESy4KKworU2V0dXAgc3RlcHMgYXJlIHNhbWUgYXMgZXh0cmFjdG9yLgorCitgYGAKK2FkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvZGVjb2RlclRlc3QgLVAgL2RhdGEvbG9jYWwvdG1wL01lZGlhQmVuY2htYXJrL3Jlcy8KK2BgYAorCisjIyBNdXhlcgorCitUaGUgdGVzdCBtdXhlcyBlbGVtZW50YXJ5IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgbXV4ZXJzIGF2YWlsYWJsZSBpbiBOREsuCisKK1NldHVwIHN0ZXBzIGFyZSBzYW1lIGFzIGV4dHJhY3Rvci4KKworYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL211eGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLworYGBgCisKKyMjIEVuY29kZXIKKworVGhlIHRlc3QgZW5jb2RlcyBpbnB1dCBzdHJlYW0gYW5kIGJlbmNobWFya3MgdGhlIGVuY29kZXJzIGF2YWlsYWJsZSBpbiBOREsuCisKK1NldHVwIHN0ZXBzIGFyZSBzYW1lIGFzIGV4dHJhY3Rvci4KKworYGBgCithZGIgc2hlbGwgL2RhdGEvbG9jYWwvdG1wL2VuY29kZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvCitgYGAKKworIyBTREsKKworVG8gcnVuIHRoZSB0ZXN0IHN1aXRlIGZvciBtZWFzdXJpbmcgcGVyZm9ybWFuY2Ugb2YgdGhlIFNESyBBUElzLCBmb2xsb3cgdGhlIGZvbGxvd2luZyBzdGVwczoKKworVGhlIGFwayB3aWxsIGJlIGNyZWF0ZWQgYXQgdGhlIGZvbGxvd2luZyBwYXRoOgorJE9VVC90ZXN0Y2FzZXMvTWVkaWFCZW5jaG1hcmtUZXN0L2FybTY0LworCitUbyBnZXQgdGhlIHJlc29yY2UgZmlsZXMgZm9yIHRoZSB0ZXN0IGZvbGxvdyBpbnN0cnVjdGlvbnMgZ2l2ZW4gaW4gW05ES10oI05ESykKKworRm9yIGluc3RhbGxpbmcgdGhlIGFwaywgcnVuIHRoZSBjb21tYW5kOgorYGBgCithZGIgaW5zdGFsbCAtZiAtciAkT1VUL3Rlc3RjYXNlcy9NZWRpYUJlbmNobWFya1Rlc3QvYXJtNjQvTWVkaWFCZW5jaG1hcmtUZXN0LmFwaworYGBgCisKK0ZvciBydW5uaW5nIGFsbCB0aGUgdGVzdHMsIHJ1biB0aGUgY29tbWFuZDoKK2BgYAorYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgLXIgLWUgcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsudGVzdHMgY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrL2FuZHJvaWR4LnRlc3QucnVubmVyLkFuZHJvaWRKVW5pdFJ1bm5lcgorYGBgCisKKyMjIEV4dHJhY3RvcgorCitUaGUgdGVzdCBleHRyYWN0cyBlbGVtZW50YXJ5IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgZXh0cmFjdG9ycyBhdmFpbGFibGUgaW4gU0RLLgorYGBgCithZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyAtciAtZSBjbGFzcyAnY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLnRlc3RzLkV4dHJhY3RvclRlc3QnIGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay9hbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIKK2BgYAorCisjIyBEZWNvZGVyCisKK1RoZSB0ZXN0IGRlY29kZXMgaW5wdXQgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBkZWNvZGVycyBhdmFpbGFibGUgaW4gU0RLLgorYGBgCithZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyAtciAtZSBjbGFzcyAnY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLnRlc3RzLkRlY29kZXJUZXN0JyBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsvYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyCitgYGAKKworIyMgTXV4ZXIKKworVGhlIHRlc3QgbXV4ZXMgZWxlbWVudGFyeSBzdHJlYW0gYW5kIGJlbmNobWFya3MgZGlmZmVyZW50IHdyaXRlcnMgYXZhaWxhYmxlIGluIFNESy4KK2BgYAorYWRiIHNoZWxsIGFtIGluc3RydW1lbnQgLXcgLXIgLWUgY2xhc3MgJ2NvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay50ZXN0cy5NdXhlclRlc3QnIGNvbS5hbmRyb2lkLm1lZGlhLmJlbmNobWFyay9hbmRyb2lkeC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIKK2BgYAorCisjIyBFbmNvZGVyCisKK1RoZSB0ZXN0IGVuY29kZXMgaW5wdXQgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBlbmNvZGVycyBhdmFpbGFibGUgaW4gU0RLLgorYGBgCithZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyAtciAtZSBjbGFzcyAnY29tLmFuZHJvaWQubWVkaWEuYmVuY2htYXJrLnRlc3RzLkVuY29kZXJUZXN0JyBjb20uYW5kcm9pZC5tZWRpYS5iZW5jaG1hcmsvYW5kcm9pZHgudGVzdC5ydW5uZXIuQW5kcm9pZEpVbml0UnVubmVyCitgYGAKKworIyBDb2RlYzIKK1RvIHJ1biB0aGUgdGVzdCBzdWl0ZSBmb3IgbWVhc3VyaW5nIHBlcmZvcm1hbmNlIG9mIHRoZSBjb2RlYzIgbGF5ZXIsIGZvbGxvdyB0aGUgZm9sbG93aW5nIHN0ZXBzOgorCitUaGUgMzItYml0IGJpbmFyaWVzIHdpbGwgYmUgY3JlYXRlZCBpbiB0aGUgZm9sbG93aW5nIHBhdGggOiAke09VVH0vZGF0YS9uYXRpdmV0ZXN0LworVGhlIDY0LWJpdCBiaW5hcmllcyB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGZvbGxvd2luZyBwYXRoIDogJHtPVVR9L2RhdGEvbmF0aXZldGVzdDY0LworCitUbyB0ZXN0IDY0LWJpdCBiaW5hcnkgcHVzaCBiaW5hcmllcyBmcm9tIG5hdGl2ZXRlc3Q2NC4KK2FkYiBwdXNoICQoT1VUKS9kYXRhL25hdGl2ZXRlc3Q2NC8qIC9kYXRhL2xvY2FsL3RtcC8KK0VnLiBhZGIgcHVzaCAkKE9VVCkvZGF0YS9uYXRpdmV0ZXN0NjQvQzJEZWNvZGVyVGVzdC9DMkRlY29kZXJUZXN0IC9kYXRhL2xvY2FsL3RtcC8KKworVG8gdGVzdCAzMi1iaXQgYmluYXJ5IHB1c2ggYmluYXJpZXMgZnJvbSBuYXRpdmV0ZXN0LgorYWRiIHB1c2ggJChPVVQpL2RhdGEvbmF0aXZldGVzdC8qIC9kYXRhL2xvY2FsL3RtcC8KK0VnLiBhZGIgcHVzaCAkKE9VVCkvZGF0YS9uYXRpdmV0ZXN0L0MyRGVjb2RlclRlc3QvQzJEZWNvZGVyVGVzdCAvZGF0YS9sb2NhbC90bXAvCisKK1RvIGdldCB0aGUgcmVzb3VyY2UgZmlsZXMgZm9yIHRoZSB0ZXN0IGZvbGxvdyBpbnN0cnVjdGlvbnMgZ2l2ZW4gaW4gW05ES10oI05ESykKKworIyMgQzIgRGVjb2RlcgorCitUaGUgdGVzdCBkZWNvZGVzIGlucHV0IHN0cmVhbSBhbmQgYmVuY2htYXJrcyB0aGUgY29kZWMyIGRlY29kZXJzIGF2YWlsYWJsZSBpbiBkZXZpY2UuCisKK1NldHVwIHN0ZXBzIGFyZSBzYW1lIGFzIFtleHRyYWN0b3JdKCNleHRyYWN0b3IpLgorCitgYGAKK2FkYiBzaGVsbCAvZGF0YS9sb2NhbC90bXAvQzJEZWNvZGVyVGVzdCAtUCAvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzLworYGBgCisjIyBDMiBFbmNvZGVyCisKK1RoZSB0ZXN0IGVuY29kZXMgaW5wdXQgc3RyZWFtIGFuZCBiZW5jaG1hcmtzIHRoZSBjb2RlYzIgZW5jb2RlcnMgYXZhaWxhYmxlIGluIGRldmljZS4KKworU2V0dXAgc3RlcHMgYXJlIHNhbWUgYXMgW2V4dHJhY3Rvcl0oI2V4dHJhY3RvcikuCisKK2BgYAorYWRiIHNoZWxsIC9kYXRhL2xvY2FsL3RtcC9DMkVuY29kZXJUZXN0IC1QIC9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvCitgYGAKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi9BbmRyb2lkLmJwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvY29tbW9uL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQzODlkYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJtZWRpYWJlbmNobWFya19jb21tb24iLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJtZWRpYWJlbmNobWFyay1kZWZhdWx0cyIsCisgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkJlbmNobWFya0NvbW1vbi5jcHAiLAorICAgICAgICAiU3RhdHMuY3BwIiwKKyAgICAgICAgInV0aWxzL1RpbWVycy5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKKworICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJtZWRpYWJlbmNobWFya19jb21tb24tZGVmYXVsdHMiLAorCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX2NvbW1vbiIsCisgICAgXSwKK30KKworY2NfZGVmYXVsdHMgeworICAgIG5hbWU6ICJsaWJtZWRpYWJlbmNobWFyay1kZWZhdWx0cyIsCisgICAgc2RrX3ZlcnNpb246ICJjdXJyZW50IiwKKyAgICBzdGw6ICJjKytfc2hhcmVkIiwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYW5kayIsCisgICAgICAgICJsaWJsb2ciLAorICAgIF0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlibWVkaWFiZW5jaG1hcmtfY29kZWMyX2NvbW1vbiIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX2NvZGVjMl9jb21tb24tZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJCZW5jaG1hcmtDMkNvbW1vbi5jcHAiLAorICAgICAgICAiQmVuY2htYXJrQ29tbW9uLmNwcCIsCisgICAgICAgICJTdGF0cy5jcHAiLAorICAgICAgICAidXRpbHMvVGltZXJzLmNwcCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorCisgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAorfQorCitjY19kZWZhdWx0cyB7CisgICAgbmFtZTogImxpYm1lZGlhYmVuY2htYXJrX2NvZGVjMl9jb21tb24tZGVmYXVsdHMiLAorCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYmNvZGVjMi1oaWRsLWNsaWVudC1kZWZhdWx0cyIsCisgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9jb2RlYzIvaGlkbC9jbGllbnQvaW5jbHVkZSIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJjb2RlYzJfY2xpZW50IiwKKyAgICAgICAgImxpYm1lZGlhbmRrIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKK30KKworLy8gcHVibGljIGRlcGVuZGVuY3kgZm9yIG5hdGl2ZSBpbXBsZW1lbnRhdGlvbgorLy8gdG8gYmUgdXNlZCBieSBjb2RlIHVuZGVyIG1lZGlhL2JlbmNobWFyay8qIG9ubHkKK2NjX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAibGlibWVkaWFiZW5jaG1hcmtfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorCisgICAgc2FuaXRpemU6IHsKKyAgICAgICAgbWlzY191bmRlZmluZWQ6IFsKKyAgICAgICAgICAgICJ1bnNpZ25lZC1pbnRlZ2VyLW92ZXJmbG93IiwKKyAgICAgICAgICAgICJzaWduZWQtaW50ZWdlci1vdmVyZmxvdyIsCisgICAgICAgIF0sCisgICAgICAgIGNmaTogdHJ1ZSwKKyAgICB9LAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvY29tbW9uL0JlbmNobWFya0MyQ29tbW9uLmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi9CZW5jaG1hcmtDMkNvbW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA5ZjQ2OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi9CZW5jaG1hcmtDMkNvbW1vbi5jcHAKQEAgLTAsMCArMSwxMTMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkJlbmNobWFya0MyQ29tbW9uIgorCisjaW5jbHVkZSAiQmVuY2htYXJrQzJDb21tb24uaCIKKworaW50MzJfdCBCZW5jaG1hcmtDMkNvbW1vbjo6c2V0dXBDb2RlYzIoKSB7CisgICAgQUxPR1YoIkluICVzIiwgX19mdW5jX18pOworICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKCJkZWZhdWx0Iik7CisgICAgaWYgKCFtQ2xpZW50KSB7CisgICAgICAgIG1DbGllbnQgPSBhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNyZWF0ZUZyb21TZXJ2aWNlKCJzb2Z0d2FyZSIpOworICAgIH0KKyAgICBpZiAoIW1DbGllbnQpIHJldHVybiAtMTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvclN0b3JlPiBzdG9yZSA9IGFuZHJvaWQ6OkdldENvZGVjMlBsYXRmb3JtQWxsb2NhdG9yU3RvcmUoKTsKKyAgICBpZiAoIXN0b3JlKSByZXR1cm4gLTE7CisKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBzdG9yZS0+ZmV0Y2hBbGxvY2F0b3IoQzJBbGxvY2F0b3JTdG9yZTo6REVGQVVMVF9MSU5FQVIsICZtTGluZWFyQWxsb2NhdG9yKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSByZXR1cm4gc3RhdHVzOworCisgICAgbUxpbmVhclBvb2wgPSBzdGQ6Om1ha2Vfc2hhcmVkPEMyUG9vbGVkQmxvY2tQb29sPihtTGluZWFyQWxsb2NhdG9yLCBtQmxvY2tQb29sSWQrKyk7CisgICAgaWYgKCFtTGluZWFyUG9vbCkgcmV0dXJuIC0xOworCisgICAgc3RhdHVzID0gc3RvcmUtPmZldGNoQWxsb2NhdG9yKEMyQWxsb2NhdG9yU3RvcmU6OkRFRkFVTFRfR1JBUEhJQywgJm1HcmFwaGljQWxsb2NhdG9yKTsKKyAgICBpZiAoc3RhdHVzICE9IEMyX09LKSByZXR1cm4gc3RhdHVzOworCisgICAgbUdyYXBoaWNQb29sID0gc3RkOjptYWtlX3NoYXJlZDxDMlBvb2xlZEJsb2NrUG9vbD4obUdyYXBoaWNBbGxvY2F0b3IsIG1CbG9ja1Bvb2xJZCsrKTsKKyAgICBpZiAoIW1HcmFwaGljUG9vbCkgcmV0dXJuIC0xOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfSU5QVVRfQlVGRkVSUzsgKytpKSB7CisgICAgICAgIG1Xb3JrUXVldWUuZW1wbGFjZV9iYWNrKG5ldyBDMldvcmspOworICAgIH0KKyAgICBpZiAoIW1TdGF0cykgbVN0YXRzID0gbmV3IFN0YXRzKCk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2ZWN0b3I8c3RyaW5nPiBCZW5jaG1hcmtDMkNvbW1vbjo6Z2V0U3VwcG9ydGVkQ29tcG9uZW50TGlzdChib29sIGlzRW5jb2RlcikgeworICAgIC8vIEdldCBMaXN0IG9mIGNvbXBvbmVudHMgZnJvbSBhbGwga25vd24gc2VydmljZXMKKyAgICB2ZWN0b3I8c3RyaW5nPiBjb2RlY0xpc3Q7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QzJDb21wb25lbnQ6OlRyYWl0cz4gbGlzdFRyYWl0cyA9IG1DbGllbnQtPkxpc3RDb21wb25lbnRzKCk7CisgICAgaWYgKGxpc3RUcmFpdHMuc2l6ZSgpID09IDApCisgICAgICAgIEFMT0dFKCJDb21wb25lbnRJbmZvIGxpc3QgZW1wdHkuIik7CisgICAgZWxzZSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGlzdFRyYWl0cy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgaWYgKGlzRW5jb2RlciAmJiBDMkNvbXBvbmVudDo6S0lORF9FTkNPREVSID09IGxpc3RUcmFpdHNbaV0ua2luZCkgeworICAgICAgICAgICAgICAgIGNvZGVjTGlzdC5wdXNoX2JhY2sobGlzdFRyYWl0c1tpXS5uYW1lKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzRW5jb2RlciAmJiBDMkNvbXBvbmVudDo6S0lORF9ERUNPREVSID09IGxpc3RUcmFpdHNbaV0ua2luZCkgeworICAgICAgICAgICAgICAgIGNvZGVjTGlzdC5wdXNoX2JhY2sobGlzdFRyYWl0c1tpXS5uYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY29kZWNMaXN0OworfQorCit2b2lkIEJlbmNobWFya0MyQ29tbW9uOjp3YWl0T25JbnB1dENvbnN1bXB0aW9uKCkgeworICAgIHR5cGVkZWYgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBVTG9jazsKKyAgICB1aW50MzJfdCBxdWV1ZVNpemU7CisgICAgdWludDMyX3QgbWF4UmV0cnkgPSAwOworICAgIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgcXVldWVTaXplID0gbVdvcmtRdWV1ZS5zaXplKCk7CisgICAgfQorICAgIHdoaWxlICgobWF4UmV0cnkgPCBNQVhfUkVUUlkpICYmIChxdWV1ZVNpemUgPCBNQVhfSU5QVVRfQlVGRkVSUykpIHsKKyAgICAgICAgVUxvY2sgbChtUXVldWVMb2NrKTsKKyAgICAgICAgaWYgKHF1ZXVlU2l6ZSAhPSBtV29ya1F1ZXVlLnNpemUoKSkgeworICAgICAgICAgICAgcXVldWVTaXplID0gbVdvcmtRdWV1ZS5zaXplKCk7CisgICAgICAgICAgICBtYXhSZXRyeSA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgVElNRV9PVVQpOworICAgICAgICAgICAgbWF4UmV0cnkrKzsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBCZW5jaG1hcmtDMkNvbW1vbjo6aGFuZGxlV29ya0RvbmUoc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmd29ya0l0ZW1zKSB7CisgICAgQUxPR1YoIkluICVzIiwgX19mdW5jX18pOworICAgIG1TdGF0cy0+YWRkT3V0cHV0VGltZSgpOworICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPEMyV29yaz4gJndvcmsgOiB3b3JrSXRlbXMpIHsKKyAgICAgICAgaWYgKCF3b3JrLT53b3JrbGV0cy5lbXB0eSgpKSB7CisgICAgICAgICAgICBpZiAod29yay0+d29ya2xldHMuZnJvbnQoKS0+b3V0cHV0LmZsYWdzICE9IEMyRnJhbWVEYXRhOjpGTEFHX0lOQ09NUExFVEUpIHsKKyAgICAgICAgICAgICAgICBtRW9zID0gKHdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5mbGFncyAmIEMyRnJhbWVEYXRhOjpGTEFHX0VORF9PRl9TVFJFQU0pICE9CisgICAgICAgICAgICAgICAgICAgICAgIDA7CisgICAgICAgICAgICAgICAgQUxPR1YoIldvcmtEb25lOiBmcmFtZUlEIHJlY2VpdmVkICVkICwgbUVvcyA6ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAoaW50KXdvcmstPndvcmtsZXRzLmZyb250KCktPm91dHB1dC5vcmRpbmFsLmZyYW1lSW5kZXgucGVla3UoKSwgbUVvcyk7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5jbGVhcigpOworICAgICAgICAgICAgICAgIHdvcmstPndvcmtsZXRzLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgICAgICAgICAgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgICAgICAgICAgICAgIG1RdWV1ZUNvbmRpdGlvbi5ub3RpZnlfYWxsKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9jb21tb24vQmVuY2htYXJrQzJDb21tb24uaCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi9CZW5jaG1hcmtDMkNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2Nzc1OGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9jb21tb24vQmVuY2htYXJrQzJDb21tb24uaApAQCAtMCwwICsxLDE0MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19CRU5DSE1BUktfQzJfQ09NTU9OX0hfXworI2RlZmluZSBfX0JFTkNITUFSS19DMl9DT01NT05fSF9fCisKKyNpbmNsdWRlICJjb2RlYzIvaGlkbC9jbGllbnQuaCIKKworI2luY2x1ZGUgPEMyQ29tcG9uZW50Lmg+CisjaW5jbHVkZSA8QzJDb25maWcuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKworI2luY2x1ZGUgPEMyQWxsb2NhdG9ySW9uLmg+CisjaW5jbHVkZSA8QzJCdWZmZXIuaD4KKyNpbmNsdWRlIDxDMkJ1ZmZlclByaXYuaD4KKworI2luY2x1ZGUgIkJlbmNobWFya0NvbW1vbi5oIgorCisjZGVmaW5lIE1BWF9SRVRSWSAyMAorI2RlZmluZSBUSU1FX09VVCA0MDBtcworI2RlZmluZSBNQVhfSU5QVVRfQlVGRkVSUyA4CisKK3VzaW5nIGFuZHJvaWQ6OkMyQWxsb2NhdG9ySW9uOworCitjbGFzcyBMaW5lYXJCdWZmZXIgOiBwdWJsaWMgQzJCdWZmZXIgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgTGluZWFyQnVmZmVyKGNvbnN0IHN0ZDo6c2hhcmVkX3B0cjxDMkxpbmVhckJsb2NrPiAmYmxvY2spCisgICAgICAgIDogQzJCdWZmZXIoe2Jsb2NrLT5zaGFyZShibG9jay0+b2Zmc2V0KCksIGJsb2NrLT5zaXplKCksIDo6QzJGZW5jZSgpKX0pIHt9CisKKyAgICBleHBsaWNpdCBMaW5lYXJCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+ICZibG9jaywgc2l6ZV90IHNpemUpCisgICAgICAgIDogQzJCdWZmZXIoe2Jsb2NrLT5zaGFyZShibG9jay0+b2Zmc2V0KCksIHNpemUsIDo6QzJGZW5jZSgpKX0pIHt9Cit9OworCitjbGFzcyBHcmFwaGljQnVmZmVyIDogcHVibGljIEMyQnVmZmVyIHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IEdyYXBoaWNCdWZmZXIoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPEMyR3JhcGhpY0Jsb2NrPiAmYmxvY2spCisgICAgICAgIDogQzJCdWZmZXIoe2Jsb2NrLT5zaGFyZShDMlJlY3QoYmxvY2stPndpZHRoKCksIGJsb2NrLT5oZWlnaHQoKSksIDo6QzJGZW5jZSgpKX0pIHt9Cit9OworCisvKioKKyAqIEhhbmRsZSBDYWxsYmFjayBmdW5jdGlvbnMgb25Xb3JrRG9uZSgpLCBvblRyaXBwZWQoKSwKKyAqIG9uRXJyb3IoKSwgb25EZWF0aCgpLCBvbkZyYW1lc1JlbmRlcmVkKCkgZm9yIEMyIENvbXBvbmVudHMKKyAqLworc3RydWN0IENvZGVjTGlzdGVuZXIgOiBwdWJsaWMgYW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpMaXN0ZW5lciB7CisgIHB1YmxpYzoKKyAgICBDb2RlY0xpc3RlbmVyKAorICAgICAgICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJndvcmtJdGVtcyk+IGZuID0gbnVsbHB0cikKKyAgICAgICAgOiBjYWxsQmFjayhmbikge30KKyAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrRG9uZShjb25zdCBzdGQ6OndlYWtfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiAmY29tcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZ3b3JrSXRlbXMpIG92ZXJyaWRlIHsKKyAgICAgICAgQUxPR1YoIm9uV29ya0RvbmUgY2FsbGVkIik7CisgICAgICAgICh2b2lkKWNvbXA7CisgICAgICAgIGlmIChjYWxsQmFjaykgY2FsbEJhY2sod29ya0l0ZW1zKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25UcmlwcGVkKAorICAgICAgICAgICAgY29uc3Qgc3RkOjp3ZWFrX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXAsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gJnNldHRpbmdSZXN1bHRzKSBvdmVycmlkZSB7CisgICAgICAgICh2b2lkKWNvbXA7CisgICAgICAgICh2b2lkKXNldHRpbmdSZXN1bHRzOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yKGNvbnN0IHN0ZDo6d2Vha19wdHI8YW5kcm9pZDo6Q29kZWMyQ2xpZW50OjpDb21wb25lbnQ+ICZjb21wLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGVycm9yQ29kZSkgb3ZlcnJpZGUgeworICAgICAgICAodm9pZCljb21wOworICAgICAgICBBTE9HVigib25FcnJvciBjYWxsZWQiKTsKKyAgICAgICAgaWYgKGVycm9yQ29kZSAhPSAwKSBBTE9HRSgiRXJyb3IgOiAldSIsIGVycm9yQ29kZSk7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG9uRGVhdGgoY29uc3Qgc3RkOjp3ZWFrX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6OkNvbXBvbmVudD4gJmNvbXApIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpY29tcDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25JbnB1dEJ1ZmZlckRvbmUodWludDY0X3QgZnJhbWVJbmRleCwgc2l6ZV90IGFycmF5SW5kZXgpIG92ZXJyaWRlIHsKKyAgICAgICAgKHZvaWQpZnJhbWVJbmRleDsKKyAgICAgICAgKHZvaWQpYXJyYXlJbmRleDsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgb25GcmFtZVJlbmRlcmVkKHVpbnQ2NF90IGJ1ZmZlclF1ZXVlSWQsIGludDMyX3Qgc2xvdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lc3RhbXBOcykgb3ZlcnJpZGUgeworICAgICAgICAodm9pZClidWZmZXJRdWV1ZUlkOworICAgICAgICAodm9pZClzbG90SWQ7CisgICAgICAgICh2b2lkKXRpbWVzdGFtcE5zOworICAgIH0KKworICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+ICZ3b3JrSXRlbXMpPiBjYWxsQmFjazsKK307CisKK2NsYXNzIEJlbmNobWFya0MyQ29tbW9uIHsKKyAgcHVibGljOgorICAgIEJlbmNobWFya0MyQ29tbW9uKCkKKyAgICAgICAgOiBtRW9zKGZhbHNlKSwKKyAgICAgICAgICBtU3RhdHMobnVsbHB0ciksCisgICAgICAgICAgbUNsaWVudChudWxscHRyKSwKKyAgICAgICAgICBtQmxvY2tQb29sSWQoMCksCisgICAgICAgICAgbUxpbmVhclBvb2wobnVsbHB0ciksCisgICAgICAgICAgbUdyYXBoaWNQb29sKG51bGxwdHIpLAorICAgICAgICAgIG1MaW5lYXJBbGxvY2F0b3IobnVsbHB0ciksCisgICAgICAgICAgbUdyYXBoaWNBbGxvY2F0b3IobnVsbHB0cikge30KKworICAgIGludDMyX3Qgc2V0dXBDb2RlYzIoKTsKKworICAgIHZlY3RvcjxzdHJpbmc+IGdldFN1cHBvcnRlZENvbXBvbmVudExpc3QoYm9vbCBpc0VuY29kZXIpOworCisgICAgdm9pZCB3YWl0T25JbnB1dENvbnN1bXB0aW9uKCk7CisKKyAgICAvLyBjYWxsYmFjayBmdW5jdGlvbiB0byBwcm9jZXNzIG9uV29ya0RvbmUgcmVjZWl2ZWQgYnkgTGlzdGVuZXIKKyAgICB2b2lkIGhhbmRsZVdvcmtEb25lKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJndvcmtJdGVtcyk7CisKKyAgICBib29sIG1Fb3M7CisgIHByb3RlY3RlZDoKKyAgICBTdGF0cyAqbVN0YXRzOworCisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudD4gbUNsaWVudDsKKworICAgIEMyQmxvY2tQb29sOjpsb2NhbF9pZF90IG1CbG9ja1Bvb2xJZDsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJCbG9ja1Bvb2w+IG1MaW5lYXJQb29sOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkJsb2NrUG9vbD4gbUdyYXBoaWNQb29sOworICAgIHN0ZDo6c2hhcmVkX3B0cjxDMkFsbG9jYXRvcj4gbUxpbmVhckFsbG9jYXRvcjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8QzJBbGxvY2F0b3I+IG1HcmFwaGljQWxsb2NhdG9yOworCisgICAgc3RkOjptdXRleCBtUXVldWVMb2NrOworICAgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZUNvbmRpdGlvbjsKKyAgICBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPEMyV29yaz4+IG1Xb3JrUXVldWU7Cit9OworCisjZW5kaWYgIC8vIF9fQkVOQ0hNQVJLX0MyX0NPTU1PTl9IX18KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi9CZW5jaG1hcmtDb21tb24uY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvY29tbW9uL0JlbmNobWFya0NvbW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I0OWI4ZQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi9CZW5jaG1hcmtDb21tb24uY3BwCkBAIC0wLDAgKzEsMTAzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJCZW5jaG1hcmtDb21tb24iCisKKyNpbmNsdWRlICJCZW5jaG1hcmtDb21tb24uaCIKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKwordm9pZCBDYWxsQmFja0hhbmRsZTo6aW9UaHJlYWQoKSB7CisgICAgQUxPR1YoIkluICVzIG1Jc0RvbmUgOiAlZCwgbVNhd0Vycm9yIDogJWQgIiwgX19mdW5jX18sIG1Jc0RvbmUsIG1TYXdFcnJvcik7CisgICAgd2hpbGUgKCFtSXNEb25lICYmICFtU2F3RXJyb3IpIHsKKyAgICAgICAgYXV0byB0YXNrID0gbUlPUXVldWUucG9wKCk7CisgICAgICAgIHRhc2soKTsKKyAgICB9Cit9CisKK3ZvaWQgT25JbnB1dEF2YWlsYWJsZUNCKEFNZWRpYUNvZGVjICpjb2RlYywgdm9pZCAqdXNlcmRhdGEsIGludDMyX3QgaW5kZXgpIHsKKyAgICBBTE9HVigiT25JbnB1dEF2YWlsYWJsZUNCOiBpbmRleCglZCkiLCBpbmRleCk7CisgICAgQ2FsbEJhY2tIYW5kbGUgKnNlbGYgPSAoQ2FsbEJhY2tIYW5kbGUgKil1c2VyZGF0YTsKKyAgICBzZWxmLT5nZXRTdGF0cygpLT5hZGRJbnB1dFRpbWUoKTsKKyAgICBzZWxmLT5tSU9RdWV1ZS5wdXNoKFtzZWxmLCBjb2RlYywgaW5kZXhdKCkgeyBzZWxmLT5vbklucHV0QXZhaWxhYmxlKGNvZGVjLCBpbmRleCk7IH0pOworfQorCit2b2lkIE9uT3V0cHV0QXZhaWxhYmxlQ0IoQU1lZGlhQ29kZWMgKmNvZGVjLCB2b2lkICp1c2VyZGF0YSwgaW50MzJfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmJ1ZmZlckluZm8pIHsKKyAgICBBTE9HVigiT25PdXRwdXRBdmFpbGFibGVDQjogaW5kZXgoJWQpLCAoJWQsICVkLCAlbGxkLCAweCV4KSIsIGluZGV4LCBidWZmZXJJbmZvLT5vZmZzZXQsCisgICAgICAgICAgYnVmZmVySW5mby0+c2l6ZSwgKGxvbmcgbG9uZylidWZmZXJJbmZvLT5wcmVzZW50YXRpb25UaW1lVXMsIGJ1ZmZlckluZm8tPmZsYWdzKTsKKyAgICBDYWxsQmFja0hhbmRsZSAqc2VsZiA9IChDYWxsQmFja0hhbmRsZSAqKXVzZXJkYXRhOworICAgIHNlbGYtPmdldFN0YXRzKCktPmFkZE91dHB1dFRpbWUoKTsKKyAgICBBTWVkaWFDb2RlY0J1ZmZlckluZm8gYnVmZmVySW5mb0NvcHkgPSAqYnVmZmVySW5mbzsKKyAgICBzZWxmLT5tSU9RdWV1ZS5wdXNoKFtzZWxmLCBjb2RlYywgaW5kZXgsIGJ1ZmZlckluZm9Db3B5XSgpIHsKKyAgICAgICAgQU1lZGlhQ29kZWNCdWZmZXJJbmZvIGJjID0gYnVmZmVySW5mb0NvcHk7CisgICAgICAgIHNlbGYtPm9uT3V0cHV0QXZhaWxhYmxlKGNvZGVjLCBpbmRleCwgJmJjKTsKKyAgICB9KTsKK30KKwordm9pZCBPbkZvcm1hdENoYW5nZWRDQihBTWVkaWFDb2RlYyAqY29kZWMsIHZvaWQgKnVzZXJkYXRhLCBBTWVkaWFGb3JtYXQgKmZvcm1hdCkgeworICAgIEFMT0dWKCJPbkZvcm1hdENoYW5nZWRDQjogZm9ybWF0KCVzKSIsIEFNZWRpYUZvcm1hdF90b1N0cmluZyhmb3JtYXQpKTsKKyAgICBDYWxsQmFja0hhbmRsZSAqc2VsZiA9IChDYWxsQmFja0hhbmRsZSAqKXVzZXJkYXRhOworICAgIHNlbGYtPm1JT1F1ZXVlLnB1c2goW3NlbGYsIGNvZGVjLCBmb3JtYXRdKCkgeyBzZWxmLT5vbkZvcm1hdENoYW5nZWQoY29kZWMsIGZvcm1hdCk7IH0pOworfQorCit2b2lkIE9uRXJyb3JDQihBTWVkaWFDb2RlYyAqY29kZWMsIHZvaWQgKnVzZXJkYXRhLCBtZWRpYV9zdGF0dXNfdCBlcnIsIGludDMyX3QgYWN0aW9uQ29kZSwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldGFpbCkgeworICAgICh2b2lkKWNvZGVjOworICAgIEFMT0dFKCJPbkVycm9yQ0I6IGVyciglZCksIGFjdGlvbkNvZGUoJWQpLCBkZXRhaWwoJXMpIiwgZXJyLCBhY3Rpb25Db2RlLCBkZXRhaWwpOworICAgIENhbGxCYWNrSGFuZGxlICpzZWxmID0gKENhbGxCYWNrSGFuZGxlICopdXNlcmRhdGE7CisgICAgc2VsZi0+bVNhd0Vycm9yID0gdHJ1ZTsKKyAgICBzZWxmLT5tSU9RdWV1ZS5wdXNoKFtzZWxmLCBjb2RlYywgZXJyXSgpIHsgc2VsZi0+b25FcnJvcihjb2RlYywgZXJyKTsgfSk7Cit9CisKK0FNZWRpYUNvZGVjICpjcmVhdGVNZWRpYUNvZGVjKEFNZWRpYUZvcm1hdCAqZm9ybWF0LCBjb25zdCBjaGFyICptaW1lLCBzdHJpbmcgY29kZWNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0VuY29kZXIpIHsKKyAgICBBTE9HVigiSW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgaWYgKCFtaW1lKSB7CisgICAgICAgIEFMT0dFKCJQbGVhc2Ugc3BlY2lmeSBhIG1pbWUgdHlwZSB0byBjcmVhdGUgY29kZWMiKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgQU1lZGlhQ29kZWMgKmNvZGVjOworICAgIGlmICghY29kZWNOYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgY29kZWMgPSBBTWVkaWFDb2RlY19jcmVhdGVDb2RlY0J5TmFtZShjb2RlY05hbWUuY19zdHIoKSk7CisgICAgICAgIGlmICghY29kZWMpIHsKKyAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gY3JlYXRlIGNvZGVjIGJ5IG5hbWU6ICVzIiwgY29kZWNOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoaXNFbmNvZGVyKSB7CisgICAgICAgICAgICBjb2RlYyA9IEFNZWRpYUNvZGVjX2NyZWF0ZUVuY29kZXJCeVR5cGUobWltZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb2RlYyA9IEFNZWRpYUNvZGVjX2NyZWF0ZURlY29kZXJCeVR5cGUobWltZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFjb2RlYykgeworICAgICAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBjcmVhdGUgY29kZWMgYnkgbWltZTogJXMiLCBtaW1lKTsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9CisgICAgfQorCisgICAgLyogQ29uZmlndXJlIGNvZGVjIHdpdGggdGhlIGdpdmVuIGZvcm1hdCovCisgICAgY29uc3QgY2hhciAqcyA9IEFNZWRpYUZvcm1hdF90b1N0cmluZyhmb3JtYXQpOworICAgIEFMT0dJKCJJbnB1dCBmb3JtYXQ6ICVzXG4iLCBzKTsKKworICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUNvZGVjX2NvbmZpZ3VyZShjb2RlYywgZm9ybWF0LCBudWxscHRyLCBudWxscHRyLCBpc0VuY29kZXIpOworICAgIGlmIChzdGF0dXMgIT0gQU1FRElBX09LKSB7CisgICAgICAgIEFMT0dFKCJBTWVkaWFDb2RlY19jb25maWd1cmUgZmFpbGVkICVkIiwgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBjb2RlYzsKK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi9CZW5jaG1hcmtDb21tb24uaCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi9CZW5jaG1hcmtDb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGE4YzllCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvY29tbW9uL0JlbmNobWFya0NvbW1vbi5oCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0JFTkNITUFSS19DT01NT05fSF9fCisjZGVmaW5lIF9fQkVOQ0hNQVJLX0NPTU1PTl9IX18KKworI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDx0aHJlYWQ+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisKKyNpbmNsdWRlIDxtZWRpYS9OZGtNZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFFcnJvci5oPgorCisjaW5jbHVkZSAiU3RhdHMuaCIKKyNkZWZpbmUgVU5VU0VEKHgpICh2b2lkKSh4KQorCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCitjb25zdGV4cHIgdWludDMyX3Qga1F1ZXVlRGVxdWV1ZVRpbWVvdXRVcyA9IDEwMDA7Citjb25zdGV4cHIgdWludDMyX3Qga01heENTRFN0cmxlbiA9IDE2OworY29uc3RleHByIHVpbnQzMl90IGtNYXhCdWZmZXJTaXplID0gMTAyNCAqIDEwMjQgKiAxNjsKKy8vIENoYW5nZSBpbiBrRGVmYXVsdEF1ZGlvRW5jb2RlRnJhbWVTaXplIHNob3VsZCBhbHNvIGJlIHRha2VuIHRvCisvLyBBVURJT19FTkNPREVfREVGQVVMVF9NQVhfSU5QVVRfU0laRSBwcmVzZW50IGluIEVuY29kZXIuamF2YQorY29uc3RleHByIHVpbnQzMl90IGtEZWZhdWx0QXVkaW9FbmNvZGVGcmFtZVNpemUgPSA0MDk2OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIENhbGxCYWNrUXVldWUgeworICBwdWJsaWM6CisgICAgQ2FsbEJhY2tRdWV1ZSgpIHt9CisgICAgfkNhbGxCYWNrUXVldWUoKSB7fQorCisgICAgdm9pZCBwdXNoKFQgZWxlbSkgeworICAgICAgICBib29sIG5lZWRzTm90aWZ5ID0gZmFsc2U7CisgICAgICAgIHsKKyAgICAgICAgICAgIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgICAgIG5lZWRzTm90aWZ5ID0gbVF1ZXVlLmVtcHR5KCk7CisgICAgICAgICAgICBtUXVldWUucHVzaChtb3ZlKGVsZW0pKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobmVlZHNOb3RpZnkpIG1RdWV1ZU5vdEVtcHR5Q29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICB9CisKKyAgICBUIHBvcCgpIHsKKyAgICAgICAgdW5pcXVlX2xvY2s8bXV0ZXg+IGxvY2sobU11dGV4KTsKKyAgICAgICAgaWYgKG1RdWV1ZS5lbXB0eSgpKSB7CisgICAgICAgICAgICBtUXVldWVOb3RFbXB0eUNvbmRpdGlvbi53YWl0KGxvY2ssIFt0aGlzXSgpIHsgcmV0dXJuICFtUXVldWUuZW1wdHkoKTsgfSk7CisgICAgICAgIH0KKyAgICAgICAgYXV0byByZXN1bHQgPSBtUXVldWUuZnJvbnQoKTsKKyAgICAgICAgbVF1ZXVlLnBvcCgpOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICBwcml2YXRlOgorICAgIG11dGV4IG1NdXRleDsKKyAgICBxdWV1ZTxUPiBtUXVldWU7CisgICAgY29uZGl0aW9uX3ZhcmlhYmxlIG1RdWV1ZU5vdEVtcHR5Q29uZGl0aW9uOworfTsKKworY2xhc3MgQ2FsbEJhY2tIYW5kbGUgeworICBwdWJsaWM6CisgICAgQ2FsbEJhY2tIYW5kbGUoKSA6IG1TYXdFcnJvcihmYWxzZSksIG1Jc0RvbmUoZmFsc2UpLCBtU3RhdHMobnVsbHB0cikgeworICAgICAgICBtU3RhdHMgPSBuZXcgU3RhdHMoKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIH5DYWxsQmFja0hhbmRsZSgpIHsKKyAgICAgICAgaWYgKG1JT1RocmVhZC5qb2luYWJsZSgpKSBtSU9UaHJlYWQuam9pbigpOworICAgICAgICBpZiAobVN0YXRzKSBkZWxldGUgbVN0YXRzOworICAgIH0KKworICAgIHZvaWQgaW9UaHJlYWQoKTsKKworICAgIC8vIEltcGxlbWVudGF0aW9uIGluIGNoaWxkIGNsYXNzIChEZWNvZGVyL0VuY29kZXIpCisgICAgdmlydHVhbCB2b2lkIG9uSW5wdXRBdmFpbGFibGUoQU1lZGlhQ29kZWMgKmNvZGVjLCBpbnQzMl90IGluZGV4KSB7CisgICAgICAgICh2b2lkKWNvZGVjOworICAgICAgICAodm9pZClpbmRleDsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIG9uRm9ybWF0Q2hhbmdlZChBTWVkaWFDb2RlYyAqY29kZWMsIEFNZWRpYUZvcm1hdCAqZm9ybWF0KSB7CisgICAgICAgICh2b2lkKWNvZGVjOworICAgICAgICAodm9pZClmb3JtYXQ7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBvbkVycm9yKEFNZWRpYUNvZGVjICpjb2RlYywgbWVkaWFfc3RhdHVzX3QgZXJyKSB7CisgICAgICAgICh2b2lkKWNvZGVjOworICAgICAgICAodm9pZCllcnI7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBvbk91dHB1dEF2YWlsYWJsZShBTWVkaWFDb2RlYyAqY29kZWMsIGludDMyX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNZWRpYUNvZGVjQnVmZmVySW5mbyAqYnVmZmVySW5mbykgeworICAgICAgICAodm9pZCljb2RlYzsKKyAgICAgICAgKHZvaWQpaW5kZXg7CisgICAgICAgICh2b2lkKWJ1ZmZlckluZm87CisgICAgfQorCisgICAgU3RhdHMgKmdldFN0YXRzKCkgeyByZXR1cm4gbVN0YXRzOyB9CisKKyAgICAvLyBLZWVwIGEgcXVldWUgb2YgYWxsIGZ1bmN0aW9uIGNhbGxiYWNrcy4KKyAgICB0eXBlZGVmIGZ1bmN0aW9uPHZvaWQoKT4gSU9UYXNrOworICAgIENhbGxCYWNrUXVldWU8SU9UYXNrPiBtSU9RdWV1ZTsKKyAgICB0aHJlYWQgbUlPVGhyZWFkOworICAgIGJvb2wgbVNhd0Vycm9yOworICAgIGJvb2wgbUlzRG9uZTsKKworICBwcm90ZWN0ZWQ6CisgICAgU3RhdHMgKm1TdGF0czsKK307CisKKy8vIEFzeW5jIEFQSSdzIGNhbGxiYWNrCit2b2lkIE9uSW5wdXRBdmFpbGFibGVDQihBTWVkaWFDb2RlYyAqY29kZWMsIHZvaWQgKnVzZXJkYXRhLCBpbnQzMl90IGluZGV4KTsKKwordm9pZCBPbk91dHB1dEF2YWlsYWJsZUNCKEFNZWRpYUNvZGVjICpjb2RlYywgdm9pZCAqdXNlcmRhdGEsIGludDMyX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhQ29kZWNCdWZmZXJJbmZvICpidWZmZXJJbmZvKTsKKwordm9pZCBPbkZvcm1hdENoYW5nZWRDQihBTWVkaWFDb2RlYyAqY29kZWMsIHZvaWQgKnVzZXJkYXRhLCBBTWVkaWFGb3JtYXQgKmZvcm1hdCk7CisKK3ZvaWQgT25FcnJvckNCKEFNZWRpYUNvZGVjICpjb2RlYywgdm9pZCAqIC8qIHVzZXJkYXRhICovLCBtZWRpYV9zdGF0dXNfdCBlcnIsIGludDMyX3QgYWN0aW9uQ29kZSwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldGFpbCk7CisKKy8vIFV0aWxpdHkgdG8gY3JlYXRlIGFuZCBjb25maWd1cmUgQU1lZGlhQ29kZWMKK0FNZWRpYUNvZGVjICpjcmVhdGVNZWRpYUNvZGVjKEFNZWRpYUZvcm1hdCAqZm9ybWF0LCBjb25zdCBjaGFyICptaW1lLCBzdHJpbmcgY29kZWNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0VuY29kZXIpOworCisjZW5kaWYgIC8vIF9fQkVOQ0hNQVJLX0NPTU1PTl9IX18KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi9TdGF0cy5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9jb21tb24vU3RhdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZGUxMjUKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9jb21tb24vU3RhdHMuY3BwCkBAIC0wLDAgKzEsODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIlN0YXRzIgorCisjaW5jbHVkZSA8Y3RpbWU+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KKworI2luY2x1ZGUgIlN0YXRzLmgiCisKKy8qKgorICogRHVtcHMgdGhlIHN0YXRzIG9mIHRoZSBvcGVyYXRpb24gZm9yIGEgZ2l2ZW4gaW5wdXQgbWVkaWEuCisgKgorICogXHBhcmFtIG9wZXJhdGlvbiAgICAgIGRlc2NyaWJlcyB0aGUgb3BlcmF0aW9uIHBlcmZvcm1lZCBvbiB0aGUgaW5wdXQgbWVkaWEKKyAqICAgICAgICAgICAgICAgICAgICAgICAoaS5lLiBleHRyYWN0L211eC9kZWNvZGUvZW5jb2RlKQorICogXHBhcmFtIGlucHV0UmVmZXJlbmNlIGlucHV0IG1lZGlhCisgKiBccGFyYW0gZHVyYXRpb25VcyAgICAgaXMgYSBkdXJhdGlvbiBvZiB0aGUgaW5wdXQgbWVkaWEgaW4gbWljcm9zZWNvbmRzLgorICogXHBhcmFtIGNvbXBvbmVudE5hbWUgIGRlc2NyaWJlcyB0aGUgY29kZWNOYW1lL211eEZvcm1hdC9taW1lVHlwZS4KKyAqIFxwYXJhbSBtb2RlICAgICAgICAgICB0aGUgb3BlcmF0aW5nIG1vZGU6IHN5bmMvYXN5bmMuCisgKiBccGFyYW0gc3RhdHNGaWxlICAgICAgdGhlIGZpbGUgd2hlcmUgdGhlIHN0YXRzIGRhdGEgaXMgdG8gYmUgd3JpdHRlbi4KKyAqLwordm9pZCBTdGF0czo6ZHVtcFN0YXRpc3RpY3Moc3RyaW5nIG9wZXJhdGlvbiwgc3RyaW5nIGlucHV0UmVmZXJlbmNlLCBpbnQ2NF90IGR1cmF0aW9uVXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29tcG9uZW50TmFtZSwgc3RyaW5nIG1vZGUsIHN0cmluZyBzdGF0c0ZpbGUpIHsKKyAgICBBTE9HVigiSW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgaWYgKCFtT3V0cHV0VGltZXIuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCJObyBvdXRwdXQgcHJvZHVjZWQiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBuc2Vjc190IHRvdGFsVGltZVRha2VuTnMgPSBnZXRUb3RhbFRpbWUoKTsKKyAgICBuc2Vjc190IHRpbWVUYWtlblBlclNlYyA9ICh0b3RhbFRpbWVUYWtlbk5zICogMTAwMDAwMCkgLyBkdXJhdGlvblVzOworICAgIG5zZWNzX3QgdGltZVRvRmlyc3RGcmFtZU5zID0gKm1PdXRwdXRUaW1lci5iZWdpbigpIC0gbVN0YXJ0VGltZU5zOworICAgIGludDMyX3Qgc2l6ZSA9IHN0ZDo6YWNjdW11bGF0ZShtRnJhbWVTaXplcy5iZWdpbigpLCBtRnJhbWVTaXplcy5lbmQoKSwgMCk7CisgICAgLy8gZ2V0IG1pbiBhbmQgbWF4IG91dHB1dCBpbnRlcnZhbHMuCisgICAgbnNlY3NfdCBpbnRlcnZhbE5zOworICAgIG5zZWNzX3QgbWluVGltZVRha2VuTnMgPSBJTlQ2NF9NQVg7CisgICAgbnNlY3NfdCBtYXhUaW1lVGFrZW5OcyA9IDA7CisgICAgbnNlY3NfdCBwcmV2SW50ZXJ2YWxOcyA9IG1TdGFydFRpbWVOczsKKyAgICBmb3IgKGludDMyX3QgaWR4ID0gMDsgaWR4IDwgbU91dHB1dFRpbWVyLnNpemUoKSAtIDE7IGlkeCsrKSB7CisgICAgICAgIGludGVydmFsTnMgPSBtT3V0cHV0VGltZXIuYXQoaWR4KSAtIHByZXZJbnRlcnZhbE5zOworICAgICAgICBwcmV2SW50ZXJ2YWxOcyA9IG1PdXRwdXRUaW1lci5hdChpZHgpOworICAgICAgICBpZiAobWluVGltZVRha2VuTnMgPiBpbnRlcnZhbE5zKSBtaW5UaW1lVGFrZW5OcyA9IGludGVydmFsTnM7CisgICAgICAgIGVsc2UgaWYgKG1heFRpbWVUYWtlbk5zIDwgaW50ZXJ2YWxOcykgbWF4VGltZVRha2VuTnMgPSBpbnRlcnZhbE5zOworICAgIH0KKworICAgIC8vIFdyaXRlIHRoZSBzdGF0cyBkYXRhIHRvIGZpbGUuCisgICAgaW50NjRfdCBkYXRhU2l6ZSA9IHNpemU7CisgICAgaW50NjRfdCBieXRlc1BlclNlYyA9ICgoaW50NjRfdClkYXRhU2l6ZSAqIDEwMDAwMDAwMDApIC8gdG90YWxUaW1lVGFrZW5OczsKKyAgICBzdHJpbmcgcm93RGF0YSA9ICIiOworICAgIHJvd0RhdGEuYXBwZW5kKHRvX3N0cmluZyhzeXN0ZW1UaW1lKENMT0NLX01PTk9UT05JQykpICsgIiwgIik7CisgICAgcm93RGF0YS5hcHBlbmQoaW5wdXRSZWZlcmVuY2UgKyAiLCAiKTsKKyAgICByb3dEYXRhLmFwcGVuZChvcGVyYXRpb24gKyAiLCAiKTsKKyAgICByb3dEYXRhLmFwcGVuZChjb21wb25lbnROYW1lICsgIiwgIik7CisgICAgcm93RGF0YS5hcHBlbmQoIk5ESywgIik7CisgICAgcm93RGF0YS5hcHBlbmQobW9kZSArICIsICIpOworICAgIHJvd0RhdGEuYXBwZW5kKHRvX3N0cmluZyhtSW5pdFRpbWVOcykgKyAiLCAiKTsKKyAgICByb3dEYXRhLmFwcGVuZCh0b19zdHJpbmcobURlSW5pdFRpbWVOcykgKyAiLCAiKTsKKyAgICByb3dEYXRhLmFwcGVuZCh0b19zdHJpbmcobWluVGltZVRha2VuTnMpICsgIiwgIik7CisgICAgcm93RGF0YS5hcHBlbmQodG9fc3RyaW5nKG1heFRpbWVUYWtlbk5zKSArICIsICIpOworICAgIHJvd0RhdGEuYXBwZW5kKHRvX3N0cmluZyh0b3RhbFRpbWVUYWtlbk5zIC8gbU91dHB1dFRpbWVyLnNpemUoKSkgKyAiLCAiKTsKKyAgICByb3dEYXRhLmFwcGVuZCh0b19zdHJpbmcodGltZVRha2VuUGVyU2VjKSArICIsICIpOworICAgIHJvd0RhdGEuYXBwZW5kKHRvX3N0cmluZyhieXRlc1BlclNlYykgKyAiLCAiKTsKKyAgICByb3dEYXRhLmFwcGVuZCh0b19zdHJpbmcodGltZVRvRmlyc3RGcmFtZU5zKSArICIsICIpOworICAgIHJvd0RhdGEuYXBwZW5kKHRvX3N0cmluZyhzaXplKSArICIsIik7CisgICAgcm93RGF0YS5hcHBlbmQodG9fc3RyaW5nKHRvdGFsVGltZVRha2VuTnMpICsgIixcbiIpOworCisgICAgb2ZzdHJlYW0gb3V0KHN0YXRzRmlsZSwgaW9zOjpvdXQgfCBpb3M6OmFwcCk7CisgICAgaWYob3V0LmJhZCgpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gb3BlbiBzdGF0cyBmaWxlIGZvciB3cml0aW5nISIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG91dCA8PCByb3dEYXRhOworICAgIG91dC5jbG9zZSgpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvY29tbW9uL1N0YXRzLmggYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9jb21tb24vU3RhdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGU0YjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvY29tbW9uL1N0YXRzLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fU1RBVFNfSF9fCisjZGVmaW5lIF9fU1RBVFNfSF9fCisKKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisKKyNpZm5kZWYgQUxPRworI2RlZmluZSBBTE9HKHByaW9yaXR5LCB0YWcsIC4uLikgKCh2b2lkKV9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF8jI3ByaW9yaXR5LCB0YWcsIF9fVkFfQVJHU19fKSkKKworI2RlZmluZSBBTE9HSSguLi4pIEFMT0coTE9HX0lORk8sIExPR19UQUcsIF9fVkFfQVJHU19fKQorI2RlZmluZSBBTE9HRSguLi4pIEFMT0coTE9HX0VSUk9SLCBMT0dfVEFHLCBfX1ZBX0FSR1NfXykKKyNkZWZpbmUgQUxPR0QoLi4uKSBBTE9HKExPR19ERUJVRywgTE9HX1RBRywgX19WQV9BUkdTX18pCisjZGVmaW5lIEFMT0dXKC4uLikgQUxPRyhMT0dfV0FSTiwgTE9HX1RBRywgX19WQV9BUkdTX18pCisKKyNpZm5kZWYgTE9HX05ERUJVRworI2RlZmluZSBMT0dfTkRFQlVHIDEKKyNlbmRpZgorCisjaWYgTE9HX05ERUJVRworI2RlZmluZSBBTE9HVihjb25kLCAuLi4pICAgKCh2b2lkKTApCisjZWxzZQorI2RlZmluZSBBTE9HViguLi4pIEFMT0coTE9HX1ZFUkJPU0UsIExPR19UQUcsIF9fVkFfQVJHU19fKQorI2VuZGlmCisjZW5kaWYgIC8vIEFMT0cKKworI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG51bWVyaWM+CisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBJbmNsdWRlIGxvY2FsIGNvcHkgb2YgVGltZXJzIHRha2VuIGZyb20gc3lzdGVtL2NvcmUvbGlidXRpbHMKKyNpbmNsdWRlICJ1dGlscy9UaW1lcnMuaCIKKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgU3RhdHMgeworICBwdWJsaWM6CisgICAgU3RhdHMoKSB7CisgICAgICAgIG1Jbml0VGltZU5zID0gMDsKKyAgICAgICAgbURlSW5pdFRpbWVOcyA9IDA7CisgICAgfQorCisgICAgflN0YXRzKCkgeworICAgICAgICByZXNldCgpOworICAgIH0KKworICBwcml2YXRlOgorICAgIG5zZWNzX3QgbUluaXRUaW1lTnM7CisgICAgbnNlY3NfdCBtRGVJbml0VGltZU5zOworICAgIG5zZWNzX3QgbVN0YXJ0VGltZU5zOworICAgIHN0ZDo6dmVjdG9yPGludDMyX3Q+IG1GcmFtZVNpemVzOworICAgIHN0ZDo6dmVjdG9yPG5zZWNzX3Q+IG1JbnB1dFRpbWVyOworICAgIHN0ZDo6dmVjdG9yPG5zZWNzX3Q+IG1PdXRwdXRUaW1lcjsKKworICBwdWJsaWM6CisgICAgbnNlY3NfdCBnZXRDdXJUaW1lKCkgeyByZXR1cm4gc3lzdGVtVGltZShDTE9DS19NT05PVE9OSUMpOyB9CisKKyAgICB2b2lkIHNldEluaXRUaW1lKG5zZWNzX3QgaW5pdFRpbWUpIHsgbUluaXRUaW1lTnMgPSBpbml0VGltZTsgfQorCisgICAgdm9pZCBzZXREZUluaXRUaW1lKG5zZWNzX3QgZGVJbml0VGltZSkgeyBtRGVJbml0VGltZU5zID0gZGVJbml0VGltZTsgfQorCisgICAgdm9pZCBzZXRTdGFydFRpbWUoKSB7IG1TdGFydFRpbWVOcyA9IHN5c3RlbVRpbWUoQ0xPQ0tfTU9OT1RPTklDKTsgfQorCisgICAgdm9pZCBhZGRGcmFtZVNpemUoaW50MzJfdCBzaXplKSB7IG1GcmFtZVNpemVzLnB1c2hfYmFjayhzaXplKTsgfQorCisgICAgdm9pZCBhZGRJbnB1dFRpbWUoKSB7IG1JbnB1dFRpbWVyLnB1c2hfYmFjayhzeXN0ZW1UaW1lKENMT0NLX01PTk9UT05JQykpOyB9CisKKyAgICB2b2lkIGFkZE91dHB1dFRpbWUoKSB7IG1PdXRwdXRUaW1lci5wdXNoX2JhY2soc3lzdGVtVGltZShDTE9DS19NT05PVE9OSUMpKTsgfQorCisgICAgdm9pZCByZXNldCgpIHsKKyAgICAgICAgaWYgKCFtRnJhbWVTaXplcy5lbXB0eSgpKSBtRnJhbWVTaXplcy5jbGVhcigpOworICAgICAgICBpZiAoIW1JbnB1dFRpbWVyLmVtcHR5KCkpIG1JbnB1dFRpbWVyLmNsZWFyKCk7CisgICAgICAgIGlmICghbU91dHB1dFRpbWVyLmVtcHR5KCkpIG1PdXRwdXRUaW1lci5jbGVhcigpOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPG5zZWNzX3Q+IGdldE91dHB1dFRpbWVyKCkgeyByZXR1cm4gbU91dHB1dFRpbWVyOyB9CisKKyAgICBuc2Vjc190IGdldEluaXRUaW1lKCkgeyByZXR1cm4gbUluaXRUaW1lTnM7IH0KKworICAgIG5zZWNzX3QgZ2V0RGVJbml0VGltZSgpIHsgcmV0dXJuIG1EZUluaXRUaW1lTnM7IH0KKworICAgIG5zZWNzX3QgZ2V0VGltZURpZmYobnNlY3NfdCBzVGltZSwgbnNlY3NfdCBlVGltZSkgeyByZXR1cm4gKGVUaW1lIC0gc1RpbWUpOyB9CisKKyAgICBuc2Vjc190IGdldFRvdGFsVGltZSgpIHsKKyAgICAgICAgaWYgKG1PdXRwdXRUaW1lci5lbXB0eSgpKSByZXR1cm4gLTE7CisgICAgICAgIHJldHVybiAoKihtT3V0cHV0VGltZXIuZW5kKCkgLSAxKSAtIG1TdGFydFRpbWVOcyk7CisgICAgfQorCisgICAgdm9pZCBkdW1wU3RhdGlzdGljcyhzdHJpbmcgb3BlcmF0aW9uLCBzdHJpbmcgaW5wdXRSZWZlcmVuY2UsIGludDY0X3QgZHVhcmF0aW9uVXMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgY29kZWNOYW1lID0gIiIsIHN0cmluZyBtb2RlID0gIiIsIHN0cmluZyBzdGF0c0ZpbGUgPSAiIik7Cit9OworCisjZW5kaWYgIC8vIF9fU1RBVFNfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9jb21tb24vdXRpbHMvVGltZXJzLmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi91dGlscy9UaW1lcnMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhY2JkYjMKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9jb21tb24vdXRpbHMvVGltZXJzLmNwcApAQCAtMCwwICsxLDYyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDA1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8KKy8vIFRpbWVyIGZ1bmN0aW9ucy4KKy8vCisKKyNkZWZpbmUgTE9HX1RBRyAiVGltZXJzIgorCisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dGltZS5oPgorCisjaW5jbHVkZSAiVGltZXJzLmgiCisKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQorbnNlY3NfdCBzeXN0ZW1UaW1lKGludCBjbG9jaykgeworICAgIHN0YXRpYyBjb25zdCBjbG9ja2lkX3QgY2xvY2tzW10gPSB7Q0xPQ0tfUkVBTFRJTUUsIENMT0NLX01PTk9UT05JQywgQ0xPQ0tfUFJPQ0VTU19DUFVUSU1FX0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0xPQ0tfVEhSRUFEX0NQVVRJTUVfSUQsIENMT0NLX0JPT1RUSU1FfTsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdDsKKyAgICB0LnR2X3NlYyA9IHQudHZfbnNlYyA9IDA7CisgICAgY2xvY2tfZ2V0dGltZShjbG9ja3NbY2xvY2tdLCAmdCk7CisgICAgcmV0dXJuIG5zZWNzX3QodC50dl9zZWMpICogMTAwMDAwMDAwMExMICsgdC50dl9uc2VjOworfQorI2Vsc2UKK25zZWNzX3Qgc3lzdGVtVGltZShpbnQgLypjbG9jayovKSB7CisgICAgLy8gQ2xvY2sgc3VwcG9ydCB2YXJpZXMgd2lkZWx5IGFjcm9zcyBob3N0cy4gTWFjIE9TIGRvZXNuJ3Qgc3VwcG9ydAorICAgIC8vIHBvc2l4IGNsb2Nrcywgb2xkZXIgZ2xpYmNzIGRvbid0IHN1cHBvcnQgQ0xPQ0tfQk9PVFRJTUUgYW5kIFdpbmRvd3MKKyAgICAvLyBpcyB3aW5kb3dzLgorICAgIHN0cnVjdCB0aW1ldmFsIHQ7CisgICAgdC50dl9zZWMgPSB0LnR2X3VzZWMgPSAwOworICAgIGdldHRpbWVvZmRheSgmdCwgTlVMTCk7CisgICAgcmV0dXJuIG5zZWNzX3QodC50dl9zZWMpICogMTAwMDAwMDAwMExMICsgbnNlY3NfdCh0LnR2X3VzZWMpICogMTAwMExMOworfQorI2VuZGlmCisKK2ludCB0b01pbGxpc2Vjb25kVGltZW91dERlbGF5KG5zZWNzX3QgcmVmZXJlbmNlVGltZSwgbnNlY3NfdCB0aW1lb3V0VGltZSkgeworICAgIG5zZWNzX3QgdGltZW91dERlbGF5TWlsbGlzOworICAgIGlmICh0aW1lb3V0VGltZSA+IHJlZmVyZW5jZVRpbWUpIHsKKyAgICAgICAgdWludDY0X3QgdGltZW91dERlbGF5ID0gdWludDY0X3QodGltZW91dFRpbWUgLSByZWZlcmVuY2VUaW1lKTsKKyAgICAgICAgaWYgKHRpbWVvdXREZWxheSA+IHVpbnQ2NF90KChJTlRfTUFYIC0gMSkgKiAxMDAwMDAwTEwpKSB7CisgICAgICAgICAgICB0aW1lb3V0RGVsYXlNaWxsaXMgPSAtMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRpbWVvdXREZWxheU1pbGxpcyA9ICh0aW1lb3V0RGVsYXkgKyA5OTk5OTlMTCkgLyAxMDAwMDAwTEw7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB0aW1lb3V0RGVsYXlNaWxsaXMgPSAwOworICAgIH0KKyAgICByZXR1cm4gKGludCl0aW1lb3V0RGVsYXlNaWxsaXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9jb21tb24vdXRpbHMvVGltZXJzLmggYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9jb21tb24vdXRpbHMvVGltZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDY0M2RjZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2NvbW1vbi91dGlscy9UaW1lcnMuaApAQCAtMCwwICsxLDExOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAwNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vCisvLyBUaW1lciBmdW5jdGlvbnMuCisvLworCisjaWZuZGVmIF9MSUJTX1VUSUxTX1RJTUVSU19ICisjZGVmaW5lIF9MSUJTX1VUSUxTX1RJTUVSU19ICisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEMgQVBJCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKwordHlwZWRlZiBpbnQ2NF90IG5zZWNzX3Q7ICAvLyBuYW5vLXNlY29uZHMKKworc3RhdGljIGlubGluZSBuc2Vjc190IHNlY29uZHNfdG9fbmFub3NlY29uZHMobnNlY3NfdCBzZWNzKSB7CisgICAgcmV0dXJuIHNlY3MgKiAxMDAwMDAwMDAwOworfQorCitzdGF0aWMgaW5saW5lIG5zZWNzX3QgbWlsbGlzZWNvbmRzX3RvX25hbm9zZWNvbmRzKG5zZWNzX3Qgc2VjcykgeworICAgIHJldHVybiBzZWNzICogMTAwMDAwMDsKK30KKworc3RhdGljIGlubGluZSBuc2Vjc190IG1pY3Jvc2Vjb25kc190b19uYW5vc2Vjb25kcyhuc2Vjc190IHNlY3MpIHsKKyAgICByZXR1cm4gc2VjcyAqIDEwMDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgbnNlY3NfdCBuYW5vc2Vjb25kc190b19zZWNvbmRzKG5zZWNzX3Qgc2VjcykgeworICAgIHJldHVybiBzZWNzIC8gMTAwMDAwMDAwMDsKK30KKworc3RhdGljIGlubGluZSBuc2Vjc190IG5hbm9zZWNvbmRzX3RvX21pbGxpc2Vjb25kcyhuc2Vjc190IHNlY3MpIHsKKyAgICByZXR1cm4gc2VjcyAvIDEwMDAwMDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgbnNlY3NfdCBuYW5vc2Vjb25kc190b19taWNyb3NlY29uZHMobnNlY3NfdCBzZWNzKSB7CisgICAgcmV0dXJuIHNlY3MgLyAxMDAwOworfQorCitzdGF0aWMgaW5saW5lIG5zZWNzX3QgczJucyhuc2Vjc190IHYpIHsKKyAgICByZXR1cm4gc2Vjb25kc190b19uYW5vc2Vjb25kcyh2KTsKK30KK3N0YXRpYyBpbmxpbmUgbnNlY3NfdCBtczJucyhuc2Vjc190IHYpIHsKKyAgICByZXR1cm4gbWlsbGlzZWNvbmRzX3RvX25hbm9zZWNvbmRzKHYpOworfQorc3RhdGljIGlubGluZSBuc2Vjc190IHVzMm5zKG5zZWNzX3QgdikgeworICAgIHJldHVybiBtaWNyb3NlY29uZHNfdG9fbmFub3NlY29uZHModik7Cit9CitzdGF0aWMgaW5saW5lIG5zZWNzX3QgbnMycyhuc2Vjc190IHYpIHsKKyAgICByZXR1cm4gbmFub3NlY29uZHNfdG9fc2Vjb25kcyh2KTsKK30KK3N0YXRpYyBpbmxpbmUgbnNlY3NfdCBuczJtcyhuc2Vjc190IHYpIHsKKyAgICByZXR1cm4gbmFub3NlY29uZHNfdG9fbWlsbGlzZWNvbmRzKHYpOworfQorc3RhdGljIGlubGluZSBuc2Vjc190IG5zMnVzKG5zZWNzX3QgdikgeworICAgIHJldHVybiBuYW5vc2Vjb25kc190b19taWNyb3NlY29uZHModik7Cit9CisKK3N0YXRpYyBpbmxpbmUgbnNlY3NfdCBzZWNvbmRzKG5zZWNzX3QgdikgeworICAgIHJldHVybiBzMm5zKHYpOworfQorc3RhdGljIGlubGluZSBuc2Vjc190IG1pbGxpc2Vjb25kcyhuc2Vjc190IHYpIHsKKyAgICByZXR1cm4gbXMybnModik7Cit9CitzdGF0aWMgaW5saW5lIG5zZWNzX3QgbWljcm9zZWNvbmRzKG5zZWNzX3QgdikgeworICAgIHJldHVybiB1czJucyh2KTsKK30KKworZW51bSB7CisgICAgU1lTVEVNX1RJTUVfUkVBTFRJTUUgPSAwLCAgIC8vIHN5c3RlbS13aWRlIHJlYWx0aW1lIGNsb2NrCisgICAgU1lTVEVNX1RJTUVfTU9OT1RPTklDID0gMSwgIC8vIG1vbm90b25pYyB0aW1lIHNpbmNlIHVuc3BlY2lmaWVkIHN0YXJ0aW5nIHBvaW50CisgICAgU1lTVEVNX1RJTUVfUFJPQ0VTUyA9IDIsICAgIC8vIGhpZ2gtcmVzb2x1dGlvbiBwZXItcHJvY2VzcyBjbG9jaworICAgIFNZU1RFTV9USU1FX1RIUkVBRCA9IDMsICAgICAvLyBoaWdoLXJlc29sdXRpb24gcGVyLXRocmVhZCBjbG9jaworICAgIFNZU1RFTV9USU1FX0JPT1RUSU1FID0gNCAgICAvLyBzYW1lIGFzIFNZU1RFTV9USU1FX01PTk9UT05JQywgYnV0IGluY2x1ZGluZyBDUFUgc3VzcGVuZCB0aW1lCit9OworCisvLyByZXR1cm4gdGhlIHN5c3RlbS10aW1lIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIGNsb2NrCisjaWZkZWYgX19jcGx1c3BsdXMKK25zZWNzX3Qgc3lzdGVtVGltZShpbnQgY2xvY2sgPSBTWVNURU1fVElNRV9NT05PVE9OSUMpOworI2Vsc2UKK25zZWNzX3Qgc3lzdGVtVGltZShpbnQgY2xvY2spOworI2VuZGlmICAvLyBkZWYgX19jcGx1c3BsdXMKKworLyoqCisgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmV0d2VlbiB0aGUgcmVmZXJlbmNlIHRpbWUgYW5kIHRoZSB0aW1lb3V0IHRpbWUuCisgKiBJZiB0aGUgdGltZW91dCBpcyBpbiB0aGUgcGFzdCByZWxhdGl2ZSB0byB0aGUgcmVmZXJlbmNlIHRpbWUsIHJldHVybnMgMC4KKyAqIElmIHRoZSB0aW1lb3V0IGlzIG1vcmUgdGhhbiBJTlRfTUFYIG1pbGxpc2Vjb25kcyBpbiB0aGUgZnV0dXJlIHJlbGF0aXZlIHRvIHRoZSByZWZlcmVuY2UgdGltZSwKKyAqIHN1Y2ggYXMgd2hlbiB0aW1lb3V0VGltZSA9PSBMTE9OR19NQVgsIHJldHVybnMgLTEgdG8gaW5kaWNhdGUgYW4gaW5maW5pdGUgdGltZW91dCBkZWxheS4KKyAqIE90aGVyd2lzZSwgcmV0dXJucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSByZWZlcmVuY2UgdGltZSBhbmQgdGltZW91dCB0aW1lCisgKiByb3VuZGVkIHVwIHRvIHRoZSBuZXh0IG1pbGxpc2Vjb25kLgorICovCitpbnQgdG9NaWxsaXNlY29uZFRpbWVvdXREZWxheShuc2Vjc190IHJlZmVyZW5jZVRpbWUsIG5zZWNzX3QgdGltZW91dFRpbWUpOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gIC8vIGV4dGVybiAiQyIKKyNlbmRpZgorCisjZW5kaWYgIC8vIF9MSUJTX1VUSUxTX1RJTUVSU19ICmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9kZWNvZGVyL0FuZHJvaWQuYnAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9kZWNvZGVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc5MWMxMQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2RlY29kZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJtZWRpYWJlbmNobWFya19kZWNvZGVyIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGlibWVkaWFiZW5jaG1hcmtfY29tbW9uLWRlZmF1bHRzIiwKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJEZWNvZGVyLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGlibWVkaWFiZW5jaG1hcmtfZXh0cmFjdG9yIl0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKKworICAgIGxkZmxhZ3M6IFsiLVdsLC1Cc3ltYm9saWMiXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJtZWRpYWJlbmNobWFya19jb2RlYzJfZGVjb2RlciIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX2NvZGVjMl9jb21tb24tZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbCisgICAgICAgICJDMkRlY29kZXIuY3BwIiwKKyAgICAgICAgIkRlY29kZXIuY3BwIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX2NvZGVjMl9jb21tb24iLAorICAgICAgICAibGlibWVkaWFiZW5jaG1hcmtfY29kZWMyX2V4dHJhY3RvciIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorCisgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdLAorfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9DMkRlY29kZXIuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9DMkRlY29kZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNTRmMmYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9kZWNvZGVyL0MyRGVjb2Rlci5jcHAKQEAgLTAsMCArMSwxNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkMyRGVjb2RlciIKKworI2luY2x1ZGUgIkMyRGVjb2Rlci5oIgorCitpbnQzMl90IEMyRGVjb2Rlcjo6Y3JlYXRlQ29kZWMyQ29tcG9uZW50KHN0cmluZyBjb21wTmFtZSwgQU1lZGlhRm9ybWF0ICpmb3JtYXQpIHsKKyAgICBBTE9HVigiSW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgbUxpc3RlbmVyLnJlc2V0KG5ldyBDb2RlY0xpc3RlbmVyKAorICAgICAgICAgICAgW3RoaXNdKHN0ZDo6bGlzdDxzdGQ6OnVuaXF1ZV9wdHI8QzJXb3JrPj4gJndvcmtJdGVtcykgeyBoYW5kbGVXb3JrRG9uZSh3b3JrSXRlbXMpOyB9KSk7CisgICAgaWYgKCFtTGlzdGVuZXIpIHJldHVybiAtMTsKKworICAgIGNvbnN0IGNoYXIgKm1pbWUgPSBudWxscHRyOworICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKKyAgICBpZiAoIW1pbWUpIHsKKyAgICAgICAgQUxPR0UoIkVycm9yIGluIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmciKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICAvLyBDb25maWd1cmUgdGhlIHBsdWdpbiB3aXRoIElucHV0IHByb3BlcnRpZXMKKyAgICBzdGQ6OnZlY3RvcjxDMlBhcmFtICo+IGNvbmZpZ1BhcmFtOworICAgIGlmICghc3RybmNtcChtaW1lLCAiYXVkaW8vIiwgNikpIHsKKyAgICAgICAgaW50MzJfdCBzYW1wbGVSYXRlLCBudW1DaGFubmVsczsKKyAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgJnNhbXBsZVJhdGUpOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0NIQU5ORUxfQ09VTlQsICZudW1DaGFubmVscyk7CisgICAgICAgIEMyU3RyZWFtU2FtcGxlUmF0ZUluZm86Om91dHB1dCBzYW1wbGVSYXRlSW5mbygwdSwgc2FtcGxlUmF0ZSk7CisgICAgICAgIEMyU3RyZWFtQ2hhbm5lbENvdW50SW5mbzo6b3V0cHV0IGNoYW5uZWxDb3VudEluZm8oMHUsIG51bUNoYW5uZWxzKTsKKyAgICAgICAgY29uZmlnUGFyYW0ucHVzaF9iYWNrKCZzYW1wbGVSYXRlSW5mbyk7CisgICAgICAgIGNvbmZpZ1BhcmFtLnB1c2hfYmFjaygmY2hhbm5lbENvdW50SW5mbyk7CisKKyAgICB9IGVsc2UgeworICAgICAgICBpbnQzMl90IHdpZHRoLCBoZWlnaHQ7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsICZ3aWR0aCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCAmaGVpZ2h0KTsKKyAgICAgICAgQzJTdHJlYW1QaWN0dXJlU2l6ZUluZm86OmlucHV0IGlucHV0U2l6ZSgwdSwgd2lkdGgsIGhlaWdodCk7CisgICAgICAgIGNvbmZpZ1BhcmFtLnB1c2hfYmFjaygmaW5wdXRTaXplKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IHNUaW1lID0gbVN0YXRzLT5nZXRDdXJUaW1lKCk7CisgICAgbUNvbXBvbmVudCA9IG1DbGllbnQtPkNyZWF0ZUNvbXBvbmVudEJ5TmFtZShjb21wTmFtZS5jX3N0cigpLCBtTGlzdGVuZXIsICZtQ2xpZW50KTsKKyAgICBpZiAobUNvbXBvbmVudCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJDcmVhdGUgY29tcG9uZW50IGZhaWxlZCBmb3IgJXMiLCBjb21wTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QzJTZXR0aW5nUmVzdWx0Pj4gZmFpbHVyZXM7CisgICAgaW50MzJfdCBzdGF0dXMgPSBtQ29tcG9uZW50LT5jb25maWcoY29uZmlnUGFyYW0sIEMyX0RPTlRfQkxPQ0ssICZmYWlsdXJlcyk7CisgICAgaWYgKGZhaWx1cmVzLnNpemUoKSAhPSAwKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIENvbmZpZ3VyYXRpb24iKTsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIHN0YXR1cyB8PSBtQ29tcG9uZW50LT5zdGFydCgpOworICAgIGludDY0X3QgZVRpbWUgPSBtU3RhdHMtPmdldEN1clRpbWUoKTsKKyAgICBpbnQ2NF90IHRpbWVUYWtlbiA9IG1TdGF0cy0+Z2V0VGltZURpZmYoc1RpbWUsIGVUaW1lKTsKKyAgICBtU3RhdHMtPnNldEluaXRUaW1lKHRpbWVUYWtlbik7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworaW50MzJfdCBDMkRlY29kZXI6OmRlY29kZUZyYW1lcyh1aW50OF90ICppbnB1dEJ1ZmZlciwgdmVjdG9yPEFNZWRpYUNvZGVjQnVmZmVySW5mbz4gJmZyYW1lSW5mbykgeworICAgIEFMT0dWKCJJbiAlcyIsIF9fZnVuY19fKTsKKyAgICB0eXBlZGVmIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gVUxvY2s7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQzJfT0s7CisgICAgbVN0YXRzLT5zZXRTdGFydFRpbWUoKTsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBpZiAobU51bUlucHV0RnJhbWUgPT0gZnJhbWVJbmZvLnNpemUoKSkgYnJlYWs7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgICAgIHsKKyAgICAgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgICAgICBpZiAobVdvcmtRdWV1ZS5lbXB0eSgpKSBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgTUFYX1JFVFJZICogVElNRV9PVVQpOworICAgICAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMtPmFkZElucHV0VGltZSgpOworICAgICAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvdXQgPDwgIldhaXQgZm9yIGdlbmVyYXRpbmcgQzJXb3JrIGV4Y2VlZGVkIHRpbWVvdXQiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgZmxhZ3MgPSBmcmFtZUluZm9bbU51bUlucHV0RnJhbWVdLmZsYWdzOworICAgICAgICBpZiAoZmxhZ3MgPT0gQU1FRElBQ09ERUNfQlVGRkVSX0ZMQUdfQ09ERUNfQ09ORklHKSB7CisgICAgICAgICAgICBmbGFncyA9IEMyRnJhbWVEYXRhOjpGTEFHX0NPREVDX0NPTkZJRzsKKyAgICAgICAgfQorICAgICAgICBpZiAobU51bUlucHV0RnJhbWUgPT0gKGZyYW1lSW5mby5zaXplKCkgLSAxKSkgeworICAgICAgICAgICAgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSBmcmFtZUluZm9bbU51bUlucHV0RnJhbWVdLnByZXNlbnRhdGlvblRpbWVVczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC5mcmFtZUluZGV4ID0gbU51bUlucHV0RnJhbWU7CisgICAgICAgIHdvcmstPmlucHV0LmJ1ZmZlcnMuY2xlYXIoKTsKKyAgICAgICAgaW50IHNpemUgPSBmcmFtZUluZm9bbU51bUlucHV0RnJhbWVdLnNpemU7CisgICAgICAgIGludCBhbGlnbmVkU2l6ZSA9IEFMSUdOKHNpemUsIFBBR0VfU0laRSk7CisgICAgICAgIGlmIChzaXplKSB7CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJMaW5lYXJCbG9jaz4gYmxvY2s7CisgICAgICAgICAgICBzdGF0dXMgPSBtTGluZWFyUG9vbC0+ZmV0Y2hMaW5lYXJCbG9jaygKKyAgICAgICAgICAgICAgICAgICAgYWxpZ25lZFNpemUsIHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSwgJmJsb2NrKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gQzJfT0sgfHwgYmxvY2sgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGNvdXQgPDwgIkMyTGluZWFyQmxvY2s6Om1hcCgpIGZhaWxlZCA6ICIgPDwgc3RhdHVzIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgQzJXcml0ZVZpZXcgdmlldyA9IGJsb2NrLT5tYXAoKS5nZXQoKTsKKyAgICAgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICBjb3V0IDw8ICJDMkxpbmVhckJsb2NrOjptYXAoKSBmYWlsZWQgOiAiIDw8IHZpZXcuZXJyb3IoKSA8PCBlbmRsOworICAgICAgICAgICAgICAgIHJldHVybiB2aWV3LmVycm9yKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtZW1jcHkodmlldy5iYXNlKCksIGlucHV0QnVmZmVyICsgbU9mZnNldCwgc2l6ZSk7CisgICAgICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmVtcGxhY2VfYmFjayhuZXcgTGluZWFyQnVmZmVyKGJsb2NrLCBzaXplKSk7CisgICAgICAgICAgICBtU3RhdHMtPmFkZEZyYW1lU2l6ZShzaXplKTsKKyAgICAgICAgfQorICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgIC8vIHF1ZXVlKCkgaW52b2tlcyBwcm9jZXNzKCkgZnVuY3Rpb24gb2YgQzIgUGx1Z2luLgorICAgICAgICBzdGF0dXMgPSBtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpOworICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgicXVldWUgZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJGcmFtZSAjJWQgc2l6ZSA9ICVkIHF1ZXVlZCIsIG1OdW1JbnB1dEZyYW1lLCBzaXplKTsKKyAgICAgICAgbU51bUlucHV0RnJhbWUrKzsKKyAgICAgICAgbU9mZnNldCArPSBzaXplOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEMyRGVjb2Rlcjo6ZGVJbml0Q29kZWMoKSB7CisgICAgQUxPR1YoIkluICVzIiwgX19mdW5jX18pOworICAgIGlmICghbUNvbXBvbmVudCkgcmV0dXJuOworCisgICAgaW50NjRfdCBzVGltZSA9IG1TdGF0cy0+Z2V0Q3VyVGltZSgpOworICAgIG1Db21wb25lbnQtPnN0b3AoKTsKKyAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgbUNvbXBvbmVudCA9IG51bGxwdHI7CisgICAgaW50NjRfdCBlVGltZSA9IG1TdGF0cy0+Z2V0Q3VyVGltZSgpOworICAgIGludDY0X3QgdGltZVRha2VuID0gbVN0YXRzLT5nZXRUaW1lRGlmZihzVGltZSwgZVRpbWUpOworICAgIG1TdGF0cy0+c2V0RGVJbml0VGltZSh0aW1lVGFrZW4pOworfQorCit2b2lkIEMyRGVjb2Rlcjo6ZHVtcFN0YXRpc3RpY3Moc3RyaW5nIGlucHV0UmVmZXJlbmNlLCBpbnQ2NF90IGR1cmF0aW9uVXMsIHN0cmluZyBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdGF0c0ZpbGUpIHsKKyAgICBzdHJpbmcgb3BlcmF0aW9uID0gImMyZGVjb2RlIjsKKyAgICBzdHJpbmcgbW9kZSA9ICJhc3luYyI7CisgICAgbVN0YXRzLT5kdW1wU3RhdGlzdGljcyhvcGVyYXRpb24sIGlucHV0UmVmZXJlbmNlLCBkdXJhdGlvblVzLCBjb21wb25lbnROYW1lLCBtb2RlLCBzdGF0c0ZpbGUpOworfQorCit2b2lkIEMyRGVjb2Rlcjo6cmVzZXREZWNvZGVyKCkgeworICAgIG1PZmZzZXQgPSAwOworICAgIG1OdW1JbnB1dEZyYW1lID0gMDsKKyAgICBpZiAobVN0YXRzKSBtU3RhdHMtPnJlc2V0KCk7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9kZWNvZGVyL0MyRGVjb2Rlci5oIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9DMkRlY29kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMmUxZjYxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9DMkRlY29kZXIuaApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0MyX0RFQ09ERVJfSF9fCisjZGVmaW5lIF9fQzJfREVDT0RFUl9IX18KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlICJCZW5jaG1hcmtDMkNvbW1vbi5oIgorCisjZGVmaW5lIEFMSUdOKF9zeiwgX2FsaWduKSAoKChfc3opICsgKChfYWxpZ24pIC0gMSkpICYgfigoX2FsaWduKSAtIDEpKQorCitjbGFzcyBDMkRlY29kZXIgOiBwdWJsaWMgQmVuY2htYXJrQzJDb21tb24geworICBwdWJsaWM6CisgICAgQzJEZWNvZGVyKCkgOiBtT2Zmc2V0KDApLCBtTnVtSW5wdXRGcmFtZSgwKSwgbUNvbXBvbmVudChudWxscHRyKSB7fQorCisgICAgaW50MzJfdCBjcmVhdGVDb2RlYzJDb21wb25lbnQoc3RyaW5nIGNvZGVjTmFtZSwgQU1lZGlhRm9ybWF0ICpmb3JtYXQpOworCisgICAgaW50MzJfdCBkZWNvZGVGcmFtZXModWludDhfdCAqaW5wdXRCdWZmZXIsIHZlY3RvcjxBTWVkaWFDb2RlY0J1ZmZlckluZm8+ICZmcmFtZUluZm8pOworCisgICAgdm9pZCBkZUluaXRDb2RlYygpOworCisgICAgdm9pZCBkdW1wU3RhdGlzdGljcyhzdHJpbmcgaW5wdXRSZWZlcmVuY2UsIGludDY0X3QgZHVyYXRpb25Vcywgc3RyaW5nIGNvbXBvbmVudE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgc3RhdHNGaWxlKTsKKworICAgIHZvaWQgcmVzZXREZWNvZGVyKCk7CisKKyAgcHJpdmF0ZToKKyAgICBpbnQzMl90IG1PZmZzZXQ7CisgICAgaW50MzJfdCBtTnVtSW5wdXRGcmFtZTsKKyAgICB2ZWN0b3I8QU1lZGlhQ29kZWNCdWZmZXJJbmZvPiBtRnJhbWVNZXRhRGF0YTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworfTsKKworI2VuZGlmICAvLyBfX0MyX0RFQ09ERVJfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9kZWNvZGVyL0RlY29kZXIuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9EZWNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTBmM2UxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9EZWNvZGVyLmNwcApAQCAtMCwwICsxLDI1NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiZGVjb2RlciIKKworI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAiRGVjb2Rlci5oIgorCit0dXBsZTxzc2l6ZV90LCB1aW50MzJfdCwgaW50NjRfdD4gcmVhZFNhbXBsZURhdGEodWludDhfdCAqaW5wdXRCdWZmZXIsIGludDMyX3QgJm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8QU1lZGlhQ29kZWNCdWZmZXJJbmZvPiAmZnJhbWVJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiwgaW50MzJfdCBmcmFtZUlELCBzaXplX3QgYnVmU2l6ZSkgeworICAgIEFMT0dWKCJJbiAlcyIsIF9fZnVuY19fKTsKKyAgICBpZiAoZnJhbWVJRCA9PSAoaW50MzJfdClmcmFtZUluZm8uc2l6ZSgpKSB7CisgICAgICAgIHJldHVybiBtYWtlX3R1cGxlKDAsIEFNRURJQUNPREVDX0JVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU0sIDApOworICAgIH0KKyAgICB1aW50MzJfdCBmbGFncyA9IGZyYW1lSW5mb1tmcmFtZUlEXS5mbGFnczsKKyAgICBpbnQ2NF90IHRpbWVzdGFtcCA9IGZyYW1lSW5mb1tmcmFtZUlEXS5wcmVzZW50YXRpb25UaW1lVXM7CisgICAgc3NpemVfdCBieXRlc0NvdW50ID0gZnJhbWVJbmZvW2ZyYW1lSURdLnNpemU7CisgICAgaWYgKGJ1ZlNpemUgPCBieXRlc0NvdW50KSB7CisgICAgICAgIEFMT0dFKCJFcnJvciA6IEJ1ZmZlciBzaXplIGlzIGluc3VmZmljaWVudCB0byByZWFkIHNhbXBsZSIpOworICAgICAgICByZXR1cm4gbWFrZV90dXBsZSgwLCBBTUVESUFfRVJST1JfTUFMRk9STUVELCAwKTsKKyAgICB9CisKKyAgICBtZW1jcHkoYnVmLCBpbnB1dEJ1ZmZlciArIG9mZnNldCwgYnl0ZXNDb3VudCk7CisgICAgb2Zmc2V0ICs9IGJ5dGVzQ291bnQ7CisgICAgcmV0dXJuIG1ha2VfdHVwbGUoYnl0ZXNDb3VudCwgZmxhZ3MsIHRpbWVzdGFtcCk7Cit9CisKK3ZvaWQgRGVjb2Rlcjo6b25JbnB1dEF2YWlsYWJsZShBTWVkaWFDb2RlYyAqbWVkaWFDb2RlYywgaW50MzJfdCBidWZJZHgpIHsKKyAgICBBTE9HVigiSW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgaWYgKG1lZGlhQ29kZWMgPT0gbUNvZGVjICYmIG1lZGlhQ29kZWMpIHsKKyAgICAgICAgaWYgKG1TYXdJbnB1dEVPUyB8fCBidWZJZHggPCAwKSByZXR1cm47CisgICAgICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKKyAgICAgICAgICAgIENhbGxCYWNrSGFuZGxlOjptU2F3RXJyb3IgPSB0cnVlOworICAgICAgICAgICAgbURlY29kZXJEb25lQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBidWZTaXplOworICAgICAgICB1aW50OF90ICpidWYgPSBBTWVkaWFDb2RlY19nZXRJbnB1dEJ1ZmZlcihtQ29kZWMsIGJ1ZklkeCwgJmJ1ZlNpemUpOworICAgICAgICBpZiAoIWJ1ZikgeworICAgICAgICAgICAgbUVycm9yQ29kZSA9IEFNRURJQV9FUlJPUl9JTzsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICBtRGVjb2RlckRvbmVDb25kaXRpb24ubm90aWZ5X29uZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgc3NpemVfdCBieXRlc1JlYWQgPSAwOworICAgICAgICB1aW50MzJfdCBmbGFnID0gMDsKKyAgICAgICAgaW50NjRfdCBwcmVzZW50YXRpb25UaW1lVXMgPSAwOworICAgICAgICB0aWUoYnl0ZXNSZWFkLCBmbGFnLCBwcmVzZW50YXRpb25UaW1lVXMpID0KKyAgICAgICAgICAgICAgICByZWFkU2FtcGxlRGF0YShtSW5wdXRCdWZmZXIsIG1PZmZzZXQsIG1GcmFtZU1ldGFEYXRhLCBidWYsIG1OdW1JbnB1dEZyYW1lLCBidWZTaXplKTsKKyAgICAgICAgaWYgKGZsYWcgPT0gQU1FRElBX0VSUk9SX01BTEZPUk1FRCkgeworICAgICAgICAgICAgbUVycm9yQ29kZSA9IChtZWRpYV9zdGF0dXNfdClmbGFnOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIG1EZWNvZGVyRG9uZUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICBpZiAoZmxhZyA9PSBBTUVESUFDT0RFQ19CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNKSBtU2F3SW5wdXRFT1MgPSB0cnVlOworICAgICAgICBBTE9HVigiJXMgYnl0ZXNSZWFkIDogJXpkIHByZXNlbnRhdGlvblRpbWVVcyA6ICUiIFBSSWQ2NCAiIG1TYXdJbnB1dEVPUyA6ICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICBieXRlc1JlYWQsIHByZXNlbnRhdGlvblRpbWVVcywgbVNhd0lucHV0RU9TID8gIlRSVUUiIDogIkZBTFNFIik7CisKKyAgICAgICAgbWVkaWFfc3RhdHVzX3Qgc3RhdHVzID0gQU1lZGlhQ29kZWNfcXVldWVJbnB1dEJ1ZmZlcihtQ29kZWMsIGJ1ZklkeCwgMCAvKiBvZmZzZXQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZXNSZWFkLCBwcmVzZW50YXRpb25UaW1lVXMsIGZsYWcpOworICAgICAgICBpZiAoQU1FRElBX09LICE9IHN0YXR1cykgeworICAgICAgICAgICAgbUVycm9yQ29kZSA9IHN0YXR1czsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICBtRGVjb2RlckRvbmVDb25kaXRpb24ubm90aWZ5X29uZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1TdGF0cy0+YWRkRnJhbWVTaXplKGJ5dGVzUmVhZCk7CisgICAgICAgIG1OdW1JbnB1dEZyYW1lKys7CisgICAgfQorfQorCit2b2lkIERlY29kZXI6Om9uT3V0cHV0QXZhaWxhYmxlKEFNZWRpYUNvZGVjICptZWRpYUNvZGVjLCBpbnQzMl90IGJ1ZklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhQ29kZWNCdWZmZXJJbmZvICpidWZmZXJJbmZvKSB7CisgICAgQUxPR1YoIkluICVzIiwgX19mdW5jX18pOworICAgIGlmIChtZWRpYUNvZGVjID09IG1Db2RlYyAmJiBtZWRpYUNvZGVjKSB7CisgICAgICAgIGlmIChtU2F3T3V0cHV0RU9TIHx8IGJ1ZklkeCA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgeworICAgICAgICAgICAgQ2FsbEJhY2tIYW5kbGU6Om1TYXdFcnJvciA9IHRydWU7CisgICAgICAgICAgICBtRGVjb2RlckRvbmVDb25kaXRpb24ubm90aWZ5X29uZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1PdXRGcCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzaXplX3QgYnVmU2l6ZTsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmJ1ZiA9IEFNZWRpYUNvZGVjX2dldE91dHB1dEJ1ZmZlcihtQ29kZWMsIGJ1ZklkeCwgJmJ1ZlNpemUpOworICAgICAgICAgICAgaWYgKGJ1ZikgeworICAgICAgICAgICAgICAgIGZ3cml0ZShidWYsIHNpemVvZihjaGFyKSwgYnVmZmVySW5mby0+c2l6ZSwgbU91dEZwKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiYnl0ZXMgd3JpdHRlbiBpbnRvIGZpbGUgICVkXG4iLCBidWZmZXJJbmZvLT5zaXplKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIEFNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXIobUNvZGVjLCBidWZJZHgsIGZhbHNlKTsKKyAgICAgICAgbVNhd091dHB1dEVPUyA9ICgwICE9IChidWZmZXJJbmZvLT5mbGFncyAmIEFNRURJQUNPREVDX0JVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU0pKTsKKyAgICAgICAgbU51bU91dHB1dEZyYW1lKys7CisgICAgICAgIEFMT0dWKCIlcyBpbmRleCA6ICVkICBtU2F3T3V0cHV0RU9TIDogJXMgY291bnQgOiAldSIsIF9fRlVOQ1RJT05fXywgYnVmSWR4LAorICAgICAgICAgICAgICBtU2F3T3V0cHV0RU9TID8gIlRSVUUiIDogIkZBTFNFIiwgbU51bU91dHB1dEZyYW1lKTsKKworICAgICAgICBpZiAobVNhd091dHB1dEVPUykgeworICAgICAgICAgICAgQ2FsbEJhY2tIYW5kbGU6Om1Jc0RvbmUgPSB0cnVlOworICAgICAgICAgICAgbURlY29kZXJEb25lQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBEZWNvZGVyOjpvbkZvcm1hdENoYW5nZWQoQU1lZGlhQ29kZWMgKm1lZGlhQ29kZWMsIEFNZWRpYUZvcm1hdCAqZm9ybWF0KSB7CisgICAgQUxPR1YoIkluICVzIiwgX19mdW5jX18pOworICAgIGlmIChtZWRpYUNvZGVjID09IG1Db2RlYyAmJiBtZWRpYUNvZGVjKSB7CisgICAgICAgIEFMT0dWKCIlcyB7ICVzIH0iLCBfX0ZVTkNUSU9OX18sIEFNZWRpYUZvcm1hdF90b1N0cmluZyhmb3JtYXQpKTsKKyAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKKyAgICB9Cit9CisKK3ZvaWQgRGVjb2Rlcjo6b25FcnJvcihBTWVkaWFDb2RlYyAqbWVkaWFDb2RlYywgbWVkaWFfc3RhdHVzX3QgZXJyKSB7CisgICAgQUxPR1YoIkluICVzIiwgX19mdW5jX18pOworICAgIGlmIChtZWRpYUNvZGVjID09IG1Db2RlYyAmJiBtZWRpYUNvZGVjKSB7CisgICAgICAgIEFMT0dFKCJSZWNlaXZlZCBFcnJvciAlZCIsIGVycik7CisgICAgICAgIG1FcnJvckNvZGUgPSBlcnI7CisgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgIG1EZWNvZGVyRG9uZUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7CisgICAgfQorfQorCit2b2lkIERlY29kZXI6OnNldHVwRGVjb2RlcigpIHsKKyAgICBpZiAoIW1Gb3JtYXQpIG1Gb3JtYXQgPSBtRXh0cmFjdG9yLT5nZXRGb3JtYXQoKTsKK30KKworQU1lZGlhRm9ybWF0ICpEZWNvZGVyOjpnZXRGb3JtYXQoKSB7CisgICAgQUxPR1YoIkluICVzIiwgX19mdW5jX18pOworICAgIHJldHVybiBBTWVkaWFDb2RlY19nZXRPdXRwdXRGb3JtYXQobUNvZGVjKTsKK30KKworaW50MzJfdCBEZWNvZGVyOjpkZWNvZGUodWludDhfdCAqaW5wdXRCdWZmZXIsIHZlY3RvcjxBTWVkaWFDb2RlY0J1ZmZlckluZm8+ICZmcmFtZUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgJmNvZGVjTmFtZSwgYm9vbCBhc3luY01vZGUsIEZJTEUgKm91dEZwKSB7CisgICAgQUxPR1YoIkluICVzIiwgX19mdW5jX18pOworICAgIG1JbnB1dEJ1ZmZlciA9IGlucHV0QnVmZmVyOworICAgIG1GcmFtZU1ldGFEYXRhID0gZnJhbWVJbmZvOworICAgIG1PZmZzZXQgPSAwOworICAgIG1PdXRGcCA9IG91dEZwOworCisgICAgY29uc3QgY2hhciAqbWltZSA9IG51bGxwdHI7CisgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKKyAgICBpZiAoIW1pbWUpIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisKKyAgICBpbnQ2NF90IHNUaW1lID0gbVN0YXRzLT5nZXRDdXJUaW1lKCk7CisgICAgbUNvZGVjID0gY3JlYXRlTWVkaWFDb2RlYyhtRm9ybWF0LCBtaW1lLCBjb2RlY05hbWUsIGZhbHNlIC8qaXNFbmNvZGVyKi8pOworICAgIGlmICghbUNvZGVjKSByZXR1cm4gQU1FRElBX0VSUk9SX0lOVkFMSURfT0JKRUNUOworCisgICAgaWYgKGFzeW5jTW9kZSkgeworICAgICAgICBBTWVkaWFDb2RlY09uQXN5bmNOb3RpZnlDYWxsYmFjayBhQ0IgPSB7T25JbnB1dEF2YWlsYWJsZUNCLCBPbk91dHB1dEF2YWlsYWJsZUNCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT25Gb3JtYXRDaGFuZ2VkQ0IsIE9uRXJyb3JDQn07CisgICAgICAgIEFNZWRpYUNvZGVjX3NldEFzeW5jTm90aWZ5Q2FsbGJhY2sobUNvZGVjLCBhQ0IsIHRoaXMpOworCisgICAgICAgIG1JT1RocmVhZCA9IHRocmVhZCgmQ2FsbEJhY2tIYW5kbGU6OmlvVGhyZWFkLCB0aGlzKTsKKyAgICB9CisKKyAgICBBTWVkaWFDb2RlY19zdGFydChtQ29kZWMpOworICAgIGludDY0X3QgZVRpbWUgPSBtU3RhdHMtPmdldEN1clRpbWUoKTsKKyAgICBpbnQ2NF90IHRpbWVUYWtlbiA9IG1TdGF0cy0+Z2V0VGltZURpZmYoc1RpbWUsIGVUaW1lKTsKKyAgICBtU3RhdHMtPnNldEluaXRUaW1lKHRpbWVUYWtlbik7CisKKyAgICBtU3RhdHMtPnNldFN0YXJ0VGltZSgpOworICAgIGlmICghYXN5bmNNb2RlKSB7CisgICAgICAgIHdoaWxlICghbVNhd091dHB1dEVPUyAmJiAhbVNpZ25hbGxlZEVycm9yKSB7CisgICAgICAgICAgICAvKiBRdWV1ZSBpbnB1dCBkYXRhICovCisgICAgICAgICAgICBpZiAoIW1TYXdJbnB1dEVPUykgeworICAgICAgICAgICAgICAgIHNzaXplX3QgaW5JZHggPSBBTWVkaWFDb2RlY19kZXF1ZXVlSW5wdXRCdWZmZXIobUNvZGVjLCBrUXVldWVEZXF1ZXVlVGltZW91dFVzKTsKKyAgICAgICAgICAgICAgICBpZiAoaW5JZHggPCAwICYmIGluSWR4ICE9IEFNRURJQUNPREVDX0lORk9fVFJZX0FHQUlOX0xBVEVSKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJBTWVkaWFDb2RlY19kZXF1ZXVlSW5wdXRCdWZmZXIgcmV0dXJuZWQgaW52YWxpZCBpbmRleCAlemRcbiIsIGluSWR4KTsKKyAgICAgICAgICAgICAgICAgICAgbUVycm9yQ29kZSA9IChtZWRpYV9zdGF0dXNfdClpbklkeDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1FcnJvckNvZGU7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpbklkeCA+PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1TdGF0cy0+YWRkSW5wdXRUaW1lKCk7CisgICAgICAgICAgICAgICAgICAgIG9uSW5wdXRBdmFpbGFibGUobUNvZGVjLCBpbklkeCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBEZXF1ZXVlIG91dHB1dCBkYXRhICovCisgICAgICAgICAgICBBTWVkaWFDb2RlY0J1ZmZlckluZm8gaW5mbzsKKyAgICAgICAgICAgIHNzaXplX3Qgb3V0SWR4ID0gQU1lZGlhQ29kZWNfZGVxdWV1ZU91dHB1dEJ1ZmZlcihtQ29kZWMsICZpbmZvLCBrUXVldWVEZXF1ZXVlVGltZW91dFVzKTsKKyAgICAgICAgICAgIGlmIChvdXRJZHggPT0gQU1FRElBQ09ERUNfSU5GT19PVVRQVVRfRk9STUFUX0NIQU5HRUQpIHsKKyAgICAgICAgICAgICAgICBtRm9ybWF0ID0gQU1lZGlhQ29kZWNfZ2V0T3V0cHV0Rm9ybWF0KG1Db2RlYyk7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqcyA9IEFNZWRpYUZvcm1hdF90b1N0cmluZyhtRm9ybWF0KTsKKyAgICAgICAgICAgICAgICBBTE9HSSgiT3V0cHV0IGZvcm1hdDogJXNcbiIsIHMpOworICAgICAgICAgICAgfSBlbHNlIGlmIChvdXRJZHggPj0gMCkgeworICAgICAgICAgICAgICAgIG1TdGF0cy0+YWRkT3V0cHV0VGltZSgpOworICAgICAgICAgICAgICAgIG9uT3V0cHV0QXZhaWxhYmxlKG1Db2RlYywgb3V0SWR4LCAmaW5mbyk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCEob3V0SWR4ID09IEFNRURJQUNPREVDX0lORk9fVFJZX0FHQUlOX0xBVEVSIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0SWR4ID09IEFNRURJQUNPREVDX0lORk9fT1VUUFVUX0JVRkZFUlNfQ0hBTkdFRCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQU1lZGlhQ29kZWNfZGVxdWV1ZU91dHB1dEJ1ZmZlciByZXR1cm5lZCBpbnZhbGlkIGluZGV4ICV6ZFxuIiwgb3V0SWR4KTsKKyAgICAgICAgICAgICAgICBtRXJyb3JDb2RlID0gKG1lZGlhX3N0YXR1c190KW91dElkeDsKKyAgICAgICAgICAgICAgICByZXR1cm4gbUVycm9yQ29kZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHVuaXF1ZV9sb2NrPG11dGV4PiBsb2NrKG1NdXRleCk7CisgICAgICAgIG1EZWNvZGVyRG9uZUNvbmRpdGlvbi53YWl0KGxvY2ssIFt0aGlzXSgpIHsgcmV0dXJuIChtU2F3T3V0cHV0RU9TIHx8IG1TaWduYWxsZWRFcnJvcik7IH0pOworICAgIH0KKyAgICBpZiAobVNpZ25hbGxlZEVycm9yKSB7CisgICAgICAgIEFMT0dFKCJSZWNlaXZlZCBFcnJvciB3aGlsZSBEZWNvZGluZyIpOworICAgICAgICByZXR1cm4gbUVycm9yQ29kZTsKKyAgICB9CisKKyAgICBpZiAoY29kZWNOYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgY2hhciAqZGVjTmFtZTsKKyAgICAgICAgQU1lZGlhQ29kZWNfZ2V0TmFtZShtQ29kZWMsICZkZWNOYW1lKTsKKyAgICAgICAgY29kZWNOYW1lLmFzc2lnbihkZWNOYW1lKTsKKyAgICAgICAgQU1lZGlhQ29kZWNfcmVsZWFzZU5hbWUobUNvZGVjLCBkZWNOYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIEFNRURJQV9PSzsKK30KKwordm9pZCBEZWNvZGVyOjpkZUluaXRDb2RlYygpIHsKKyAgICBpZiAobUZvcm1hdCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1Gb3JtYXQpOworICAgICAgICBtRm9ybWF0ID0gbnVsbHB0cjsKKyAgICB9CisgICAgaWYgKCFtQ29kZWMpIHJldHVybjsKKyAgICBpbnQ2NF90IHNUaW1lID0gbVN0YXRzLT5nZXRDdXJUaW1lKCk7CisgICAgQU1lZGlhQ29kZWNfc3RvcChtQ29kZWMpOworICAgIEFNZWRpYUNvZGVjX2RlbGV0ZShtQ29kZWMpOworICAgIGludDY0X3QgZVRpbWUgPSBtU3RhdHMtPmdldEN1clRpbWUoKTsKKyAgICBpbnQ2NF90IHRpbWVUYWtlbiA9IG1TdGF0cy0+Z2V0VGltZURpZmYoc1RpbWUsIGVUaW1lKTsKKyAgICBtU3RhdHMtPnNldERlSW5pdFRpbWUodGltZVRha2VuKTsKK30KKwordm9pZCBEZWNvZGVyOjpkdW1wU3RhdGlzdGljcyhzdHJpbmcgaW5wdXRSZWZlcmVuY2UsIHN0cmluZyBjb21wb25lbnROYW1lLCBzdHJpbmcgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0YXRzRmlsZSkgeworICAgIGludDY0X3QgZHVyYXRpb25VcyA9IG1FeHRyYWN0b3ItPmdldENsaXBEdXJhdGlvbigpOworICAgIHN0cmluZyBvcGVyYXRpb24gPSAiZGVjb2RlIjsKKyAgICBtU3RhdHMtPmR1bXBTdGF0aXN0aWNzKG9wZXJhdGlvbiwgaW5wdXRSZWZlcmVuY2UsIGR1cmF0aW9uVXMsIGNvbXBvbmVudE5hbWUsIG1vZGUsIHN0YXRzRmlsZSk7Cit9CisKK3ZvaWQgRGVjb2Rlcjo6cmVzZXREZWNvZGVyKCkgeworICAgIGlmIChtU3RhdHMpIG1TdGF0cy0+cmVzZXQoKTsKKyAgICBpZiAobUlucHV0QnVmZmVyKSBtSW5wdXRCdWZmZXIgPSBudWxscHRyOworICAgIGlmICghbUZyYW1lTWV0YURhdGEuZW1wdHkoKSkgbUZyYW1lTWV0YURhdGEuY2xlYXIoKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2RlY29kZXIvRGVjb2Rlci5oIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZGVjb2Rlci9EZWNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYxOWNiNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2RlY29kZXIvRGVjb2Rlci5oCkBAIC0wLDAgKzEsMTA4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX0RFQ09ERVJfSF9fCisjZGVmaW5lIF9fREVDT0RFUl9IX18KKworI2luY2x1ZGUgPGNocm9ubz4KKyNpbmNsdWRlIDxjb25kaXRpb25fdmFyaWFibGU+CisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8cXVldWU+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSAiQmVuY2htYXJrQ29tbW9uLmgiCisjaW5jbHVkZSAiRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAiU3RhdHMuaCIKKworY2xhc3MgRGVjb2RlciA6IHB1YmxpYyBDYWxsQmFja0hhbmRsZSB7CisgIHB1YmxpYzoKKyAgICBEZWNvZGVyKCkKKyAgICAgICAgOiBtQ29kZWMobnVsbHB0ciksCisgICAgICAgICAgbUZvcm1hdChudWxscHRyKSwKKyAgICAgICAgICBtRXh0cmFjdG9yKG51bGxwdHIpLAorICAgICAgICAgIG1OdW1JbnB1dEZyYW1lKDApLAorICAgICAgICAgIG1OdW1PdXRwdXRGcmFtZSgwKSwKKyAgICAgICAgICBtU2F3SW5wdXRFT1MoZmFsc2UpLAorICAgICAgICAgIG1TYXdPdXRwdXRFT1MoZmFsc2UpLAorICAgICAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCisgICAgICAgICAgbUVycm9yQ29kZShBTUVESUFfT0spLAorICAgICAgICAgIG1JbnB1dEJ1ZmZlcihudWxscHRyKSwKKyAgICAgICAgICBtT3V0RnAobnVsbHB0cikgeworICAgICAgICBtRXh0cmFjdG9yID0gbmV3IEV4dHJhY3RvcigpOworICAgIH0KKworICAgIHZpcnR1YWwgfkRlY29kZXIoKSB7CisgICAgICAgIGlmIChtRXh0cmFjdG9yKSBkZWxldGUgbUV4dHJhY3RvcjsKKyAgICB9CisKKyAgICBFeHRyYWN0b3IgKmdldEV4dHJhY3RvcigpIHsgcmV0dXJuIG1FeHRyYWN0b3I7IH0KKworICAgIC8vIERlY29kZXIgcmVsYXRlZCB1dGlsaXRpZXMKKyAgICB2b2lkIHNldHVwRGVjb2RlcigpOworCisgICAgdm9pZCBkZUluaXRDb2RlYygpOworCisgICAgdm9pZCByZXNldERlY29kZXIoKTsKKworICAgIEFNZWRpYUZvcm1hdCAqZ2V0Rm9ybWF0KCk7CisKKyAgICAvLyBBc3luYyBjYWxsYmFjayBBUElzCisgICAgdm9pZCBvbklucHV0QXZhaWxhYmxlKEFNZWRpYUNvZGVjICpjb2RlYywgaW50MzJfdCBpbmRleCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIG9uRm9ybWF0Q2hhbmdlZChBTWVkaWFDb2RlYyAqY29kZWMsIEFNZWRpYUZvcm1hdCAqZm9ybWF0KSBvdmVycmlkZTsKKworICAgIHZvaWQgb25FcnJvcihBTWVkaWFDb2RlYyAqbWVkaWFDb2RlYywgbWVkaWFfc3RhdHVzX3QgZXJyKSBvdmVycmlkZTsKKworICAgIHZvaWQgb25PdXRwdXRBdmFpbGFibGUoQU1lZGlhQ29kZWMgKmNvZGVjLCBpbnQzMl90IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhQ29kZWNCdWZmZXJJbmZvICpidWZmZXJJbmZvKSBvdmVycmlkZTsKKworICAgIC8vIFByb2Nlc3MgdGhlIGZyYW1lcyBhbmQgZ2l2ZSBkZWNvZGVkIG91dHB1dAorICAgIGludDMyX3QgZGVjb2RlKHVpbnQ4X3QgKmlucHV0QnVmZmVyLCB2ZWN0b3I8QU1lZGlhQ29kZWNCdWZmZXJJbmZvPiAmZnJhbWVJbmZvLAorICAgICAgICAgICAgICAgICAgIHN0cmluZyAmY29kZWNOYW1lLCBib29sIGFzeW5jTW9kZSwgRklMRSAqb3V0RnAgPSBudWxscHRyKTsKKworICAgIHZvaWQgZHVtcFN0YXRpc3RpY3Moc3RyaW5nIGlucHV0UmVmZXJlbmNlLCBzdHJpbmcgY29tcG9uZW50TmFtZSA9ICIiLCBzdHJpbmcgbW9kZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0YXRzRmlsZSA9ICIiKTsKKworICBwcml2YXRlOgorICAgIEFNZWRpYUNvZGVjICptQ29kZWM7CisgICAgQU1lZGlhRm9ybWF0ICptRm9ybWF0OworCisgICAgRXh0cmFjdG9yICptRXh0cmFjdG9yOworCisgICAgaW50MzJfdCBtTnVtSW5wdXRGcmFtZTsKKyAgICBpbnQzMl90IG1OdW1PdXRwdXRGcmFtZTsKKworICAgIGJvb2wgbVNhd0lucHV0RU9TOworICAgIGJvb2wgbVNhd091dHB1dEVPUzsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBtZWRpYV9zdGF0dXNfdCBtRXJyb3JDb2RlOworCisgICAgaW50MzJfdCBtT2Zmc2V0OworICAgIHVpbnQ4X3QgKm1JbnB1dEJ1ZmZlcjsKKyAgICB2ZWN0b3I8QU1lZGlhQ29kZWNCdWZmZXJJbmZvPiBtRnJhbWVNZXRhRGF0YTsKKyAgICBGSUxFICptT3V0RnA7CisKKyAgICAvKiBBc3luY2hyb25vdXMgbG9ja3MgKi8KKyAgICBtdXRleCBtTXV0ZXg7CisgICAgY29uZGl0aW9uX3ZhcmlhYmxlIG1EZWNvZGVyRG9uZUNvbmRpdGlvbjsKK307CisKKy8vIFJlYWQgaW5wdXQgc2FtcGxlcwordHVwbGU8c3NpemVfdCwgdWludDMyX3QsIGludDY0X3Q+IHJlYWRTYW1wbGVEYXRhKHVpbnQ4X3QgKmlucHV0QnVmZmVyLCBpbnQzMl90ICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPEFNZWRpYUNvZGVjQnVmZmVySW5mbz4gJmZyYW1lU2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCAqYnVmLCBpbnQzMl90IGZyYW1lSUQsIHNpemVfdCBidWZTaXplKTsKKworI2VuZGlmICAvLyBfX0RFQ09ERVJfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0FuZHJvaWQuYnAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGRlNzgyMwotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJtZWRpYWJlbmNobWFya19lbmNvZGVyIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGlibWVkaWFiZW5jaG1hcmtfY29tbW9uLWRlZmF1bHRzIiwKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJFbmNvZGVyLmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX2V4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19kZWNvZGVyIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlibWVkaWFiZW5jaG1hcmtfY29kZWMyX2VuY29kZXIiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19jb2RlYzJfY29tbW9uLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJDMkVuY29kZXIuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibWVkaWFiZW5jaG1hcmtfY29kZWMyX2NvbW1vbiIsCisgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19jb2RlYzJfZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX2NvZGVjMl9kZWNvZGVyIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0MyRW5jb2Rlci5jcHAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0MyRW5jb2Rlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE1MGQ0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvQzJFbmNvZGVyLmNwcApAQCAtMCwwICsxLDI2NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiQzJFbmNvZGVyIgorCisjaW5jbHVkZSAiQzJFbmNvZGVyLmgiCisKK2ludDMyX3QgQzJFbmNvZGVyOjpjcmVhdGVDb2RlYzJDb21wb25lbnQoc3RyaW5nIGNvbXBOYW1lLCBBTWVkaWFGb3JtYXQgKmZvcm1hdCkgeworICAgIEFMT0dWKCJJbiAlcyIsIF9fZnVuY19fKTsKKyAgICBtTGlzdGVuZXIucmVzZXQobmV3IENvZGVjTGlzdGVuZXIoCisgICAgICAgICAgICBbdGhpc10oc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiAmd29ya0l0ZW1zKSB7IGhhbmRsZVdvcmtEb25lKHdvcmtJdGVtcyk7IH0pKTsKKyAgICBpZiAoIW1MaXN0ZW5lcikgcmV0dXJuIC0xOworCisgICAgY29uc3QgY2hhciAqbWltZSA9IG51bGxwdHI7CisgICAgQU1lZGlhRm9ybWF0X2dldFN0cmluZyhmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgJm1pbWUpOworICAgIGlmICghbWltZSkgeworICAgICAgICBBTE9HRSgiRXJyb3IgaW4gQU1lZGlhRm9ybWF0X2dldFN0cmluZyIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIC8vIENvbmZpZ3VyZSB0aGUgcGx1Z2luIHdpdGggSW5wdXQgcHJvcGVydGllcworICAgIHN0ZDo6dmVjdG9yPEMyUGFyYW0gKj4gY29uZmlnUGFyYW07CisgICAgaWYgKCFzdHJuY21wKG1pbWUsICJhdWRpby8iLCA2KSkgeworICAgICAgICBtSXNBdWRpb0VuY29kZXIgPSB0cnVlOworICAgICAgICBpbnQzMl90IG51bUNoYW5uZWxzOworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfU0FNUExFX1JBVEUsICZtU2FtcGxlUmF0ZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCJBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFIG5vdCBzZXQiKTsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgJm51bUNoYW5uZWxzKSkgeworICAgICAgICAgICAgQUxPR0UoIkFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCBub3Qgc2V0Iik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgQzJTdHJlYW1TYW1wbGVSYXRlSW5mbzo6aW5wdXQgc2FtcGxlUmF0ZUluZm8oMHUsIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgQzJTdHJlYW1DaGFubmVsQ291bnRJbmZvOjppbnB1dCBjaGFubmVsQ291bnRJbmZvKDB1LCBudW1DaGFubmVscyk7CisgICAgICAgIGNvbmZpZ1BhcmFtLnB1c2hfYmFjaygmc2FtcGxlUmF0ZUluZm8pOworICAgICAgICBjb25maWdQYXJhbS5wdXNoX2JhY2soJmNoYW5uZWxDb3VudEluZm8pOworICAgIH0gZWxzZSB7CisgICAgICAgIG1Jc0F1ZGlvRW5jb2RlciA9IGZhbHNlOworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsICZtV2lkdGgpKSB7CisgICAgICAgICAgICBBTE9HRSgiQU1FRElBRk9STUFUX0tFWV9XSURUSCBub3Qgc2V0Iik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0hFSUdIVCwgJm1IZWlnaHQpKSB7CisgICAgICAgICAgICBBTE9HRSgiQU1FRElBRk9STUFUX0tFWV9IRUlHSFQgbm90IHNldCIpOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIEMyU3RyZWFtUGljdHVyZVNpemVJbmZvOjppbnB1dCBpbnB1dFNpemUoMHUsIG1XaWR0aCwgbUhlaWdodCk7CisgICAgICAgIGNvbmZpZ1BhcmFtLnB1c2hfYmFjaygmaW5wdXRTaXplKTsKKworICAgICAgICBpZiAoIUFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfRlJBTUVfUkFURSwgJm1GcmFtZVJhdGUpIHx8CisgICAgICAgICAgICAobUZyYW1lUmF0ZSA8PSAwKSkgeworICAgICAgICAgICAgbUZyYW1lUmF0ZSA9IEtEZWZhdWx0RnJhbWVSYXRlOworICAgICAgICB9CisgICAgfQorCisgICAgaW50NjRfdCBzVGltZSA9IG1TdGF0cy0+Z2V0Q3VyVGltZSgpOworICAgIG1Db21wb25lbnQgPSBtQ2xpZW50LT5DcmVhdGVDb21wb25lbnRCeU5hbWUoY29tcE5hbWUuY19zdHIoKSwgbUxpc3RlbmVyLCAmbUNsaWVudCk7CisgICAgaWYgKG1Db21wb25lbnQgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQ3JlYXRlIGNvbXBvbmVudCBmYWlsZWQgZm9yICVzIiwgY29tcE5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyU2V0dGluZ1Jlc3VsdD4+IGZhaWx1cmVzOworICAgIGludDMyX3Qgc3RhdHVzID0gbUNvbXBvbmVudC0+Y29uZmlnKGNvbmZpZ1BhcmFtLCBDMl9ET05UX0JMT0NLLCAmZmFpbHVyZXMpOworICAgIGlmIChmYWlsdXJlcy5zaXplKCkgIT0gMCkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCBDb25maWd1cmF0aW9uIik7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBzdGF0dXMgfD0gbUNvbXBvbmVudC0+c3RhcnQoKTsKKyAgICBpbnQ2NF90IGVUaW1lID0gbVN0YXRzLT5nZXRDdXJUaW1lKCk7CisgICAgaW50NjRfdCB0aW1lVGFrZW4gPSBtU3RhdHMtPmdldFRpbWVEaWZmKHNUaW1lLCBlVGltZSk7CisgICAgbVN0YXRzLT5zZXRJbml0VGltZSh0aW1lVGFrZW4pOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKKy8vIEluIGVuY29kZXIgY29tcG9uZW50cywgZmV0Y2ggdGhlIHNpemUgb2YgaW5wdXQgYnVmZmVyIGFsbG9jYXRlZAoraW50MzJfdCBDMkVuY29kZXI6OmdldElucHV0TWF4QnVmU2l6ZSgpIHsKKyAgICBpbnQzMl90IGJpdFN0cmVhbUluZm9bMV0gPSB7MH07CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEMyUGFyYW0+PiBpblBhcmFtczsKKyAgICBjMl9zdGF0dXNfdCBzdGF0dXMgPSBtQ29tcG9uZW50LT5xdWVyeSh7fSwge0MyU3RyZWFtTWF4QnVmZmVyU2l6ZUluZm86OmlucHV0OjpQQVJBTV9UWVBFfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMl9ET05UX0JMT0NLLCAmaW5QYXJhbXMpOworICAgIGlmIChzdGF0dXMgIT0gQzJfT0sgJiYgaW5QYXJhbXMuc2l6ZSgpID09IDApIHsKKyAgICAgICAgQUxPR0UoIlF1ZXJ5IE1heEJ1ZmZlclNpemVJbmZvIGZhaWxlZCA9PiAlZCIsIHN0YXR1cyk7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc2l6ZV90IG9mZnNldCA9IHNpemVvZihDMlBhcmFtKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpblBhcmFtcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgQzJQYXJhbSAqcGFyYW0gPSBpblBhcmFtc1tpXS5nZXQoKTsKKyAgICAgICAgICAgIGJpdFN0cmVhbUluZm9baV0gPSAqKGludDMyX3QgKikoKHVpbnQ4X3QgKilwYXJhbSArIG9mZnNldCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUlucHV0TWF4QnVmU2l6ZSA9IGJpdFN0cmVhbUluZm9bMF07CisgICAgaWYgKG1JbnB1dE1heEJ1ZlNpemUgPCAwKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIG1JbnB1dE1heEJ1ZlNpemUgJWRcbiIsIG1JbnB1dE1heEJ1ZlNpemUpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKK2ludDMyX3QgQzJFbmNvZGVyOjplbmNvZGVGcmFtZXMoaWZzdHJlYW0gJmVsZVN0cmVhbSwgc2l6ZV90IGlucHV0QnVmZmVyU2l6ZSkgeworICAgIEFMT0dWKCJJbiAlcyIsIF9fZnVuY19fKTsKKyAgICBpbnQzMl90IGZyYW1lU2l6ZSA9IDA7CisgICAgaWYgKCFtSXNBdWRpb0VuY29kZXIpIHsKKyAgICAgICAgZnJhbWVTaXplID0gbVdpZHRoICogbUhlaWdodCAqIDMgLyAyOworICAgIH0gZWxzZSB7CisgICAgICAgIGZyYW1lU2l6ZSA9IERFRkFVTFRfQVVESU9fRlJBTUVfU0laRTsKKyAgICAgICAgaWYgKGdldElucHV0TWF4QnVmU2l6ZSgpICE9IDApIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGZyYW1lU2l6ZSA+IG1JbnB1dE1heEJ1ZlNpemUpIHsKKyAgICAgICAgICAgIGZyYW1lU2l6ZSA9IG1JbnB1dE1heEJ1ZlNpemU7CisgICAgICAgIH0KKyAgICB9CisgICAgaW50MzJfdCBudW1GcmFtZXMgPSAoaW5wdXRCdWZmZXJTaXplICsgZnJhbWVTaXplIC0gMSkgLyBmcmFtZVNpemU7CisgICAgLy8gVGVtcG9yYXJ5IGJ1ZmZlciB0byByZWFkIGRhdGEgZnJvbSB0aGUgaW5wdXQgZmlsZQorICAgIGNoYXIgKmRhdGEgPSAoY2hhciAqKW1hbGxvYyhmcmFtZVNpemUpOworICAgIGlmICghZGF0YSkgeworICAgICAgICBBTE9HRSgiSW5zdWZmaWNpZW50IG1lbW9yeSB0byByZWFkIGZyb20gaW5wdXQgZmlsZSIpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgdHlwZWRlZiBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IFVMb2NrOworICAgIHVpbnQ2NF90IHByZXNlbnRhdGlvblRpbWVVcyA9IDA7CisgICAgc2l6ZV90IG9mZnNldCA9IDA7CisgICAgYzJfc3RhdHVzX3Qgc3RhdHVzID0gQzJfT0s7CisKKyAgICBtU3RhdHMtPnNldFN0YXJ0VGltZSgpOworICAgIHdoaWxlIChudW1GcmFtZXMgPiAwKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+IHdvcms7CisgICAgICAgIC8vIFByZXBhcmUgQzJXb3JrCisgICAgICAgIHsKKyAgICAgICAgICAgIFVMb2NrIGwobVF1ZXVlTG9jayk7CisgICAgICAgICAgICBpZiAobVdvcmtRdWV1ZS5lbXB0eSgpKSBtUXVldWVDb25kaXRpb24ud2FpdF9mb3IobCwgTUFYX1JFVFJZICogVElNRV9PVVQpOworICAgICAgICAgICAgaWYgKCFtV29ya1F1ZXVlLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMtPmFkZElucHV0VGltZSgpOworICAgICAgICAgICAgICAgIHdvcmsuc3dhcChtV29ya1F1ZXVlLmZyb250KCkpOworICAgICAgICAgICAgICAgIG1Xb3JrUXVldWUucG9wX2Zyb250KCk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvdXQgPDwgIldhaXQgZm9yIGdlbmVyYXRpbmcgQzJXb3JrIGV4Y2VlZGVkIHRpbWVvdXQiIDw8IGVuZGw7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1Jc0F1ZGlvRW5jb2RlcikgeworICAgICAgICAgICAgcHJlc2VudGF0aW9uVGltZVVzID0gbU51bUlucHV0RnJhbWUgKiBmcmFtZVNpemUgKiAoMTAwMDAwMCAvIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvblRpbWVVcyA9IG1OdW1JbnB1dEZyYW1lICogKDEwMDAwMDAgLyBtRnJhbWVSYXRlKTsKKyAgICAgICAgfQorICAgICAgICB1aW50MzJfdCBmbGFncyA9IDA7CisgICAgICAgIGlmIChudW1GcmFtZXMgPT0gMSkgZmxhZ3MgfD0gQzJGcmFtZURhdGE6OkZMQUdfRU5EX09GX1NUUkVBTTsKKworICAgICAgICB3b3JrLT5pbnB1dC5mbGFncyA9IChDMkZyYW1lRGF0YTo6ZmxhZ3NfdClmbGFnczsKKyAgICAgICAgd29yay0+aW5wdXQub3JkaW5hbC50aW1lc3RhbXAgPSBwcmVzZW50YXRpb25UaW1lVXM7CisgICAgICAgIHdvcmstPmlucHV0Lm9yZGluYWwuZnJhbWVJbmRleCA9IG1OdW1JbnB1dEZyYW1lOworICAgICAgICB3b3JrLT5pbnB1dC5idWZmZXJzLmNsZWFyKCk7CisKKyAgICAgICAgaWYgKGlucHV0QnVmZmVyU2l6ZSAtIG9mZnNldCA8IGZyYW1lU2l6ZSkgeworICAgICAgICAgICAgZnJhbWVTaXplID0gaW5wdXRCdWZmZXJTaXplIC0gb2Zmc2V0OworICAgICAgICB9CisgICAgICAgIGVsZVN0cmVhbS5yZWFkKGRhdGEsIGZyYW1lU2l6ZSk7CisgICAgICAgIGlmIChlbGVTdHJlYW0uZ2NvdW50KCkgIT0gZnJhbWVTaXplKSB7CisgICAgICAgICAgICBBTE9HRSgicmVhZCgpIGZyb20gZmlsZSBmYWlsZWQuIEluY29ycmVjdCBieXRlcyByZWFkIik7CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgb2Zmc2V0ICs9IGZyYW1lU2l6ZTsKKworICAgICAgICBpZiAoZnJhbWVTaXplKSB7CisgICAgICAgICAgICBpZiAobUlzQXVkaW9FbmNvZGVyKSB7CisgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPEMyTGluZWFyQmxvY2s+IGJsb2NrOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IG1MaW5lYXJQb29sLT5mZXRjaExpbmVhckJsb2NrKAorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVTaXplLCB7QzJNZW1vcnlVc2FnZTo6Q1BVX1JFQUQsIEMyTWVtb3J5VXNhZ2U6OkNQVV9XUklURX0sICZibG9jayk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBDMl9PSyB8fCAhYmxvY2spIHsKKyAgICAgICAgICAgICAgICAgICAgY291dCA8PCAiZmV0Y2hMaW5lYXJCbG9jayBmYWlsZWQgOiAiIDw8IHN0YXR1cyA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDMldyaXRlVmlldyB2aWV3ID0gYmxvY2stPm1hcCgpLmdldCgpOworICAgICAgICAgICAgICAgIGlmICh2aWV3LmVycm9yKCkgIT0gQzJfT0spIHsKKyAgICAgICAgICAgICAgICAgICAgY291dCA8PCAiQzJMaW5lYXJCbG9jazo6bWFwKCkgZmFpbGVkIDogIiA8PCB2aWV3LmVycm9yKCkgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBtZW1jcHkodmlldy5iYXNlKCksIGRhdGEsIGZyYW1lU2l6ZSk7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IExpbmVhckJ1ZmZlcihibG9jaykpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8QzJHcmFwaGljQmxvY2s+IGJsb2NrOworICAgICAgICAgICAgICAgIHN0YXR1cyA9IG1HcmFwaGljUG9vbC0+ZmV0Y2hHcmFwaGljQmxvY2soCisgICAgICAgICAgICAgICAgICAgICAgICBtV2lkdGgsIG1IZWlnaHQsIEhBTF9QSVhFTF9GT1JNQVRfWVYxMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHtDMk1lbW9yeVVzYWdlOjpDUFVfUkVBRCwgQzJNZW1vcnlVc2FnZTo6Q1BVX1dSSVRFfSwgJmJsb2NrKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LIHx8ICFibG9jaykgeworICAgICAgICAgICAgICAgICAgICBjb3V0IDw8ICJmZXRjaEdyYXBoaWNCbG9jayBmYWlsZWQgOiAiIDw8IHN0YXR1cyA8PCBlbmRsOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBDMkdyYXBoaWNWaWV3IHZpZXcgPSBibG9jay0+bWFwKCkuZ2V0KCk7CisgICAgICAgICAgICAgICAgaWYgKHZpZXcuZXJyb3IoKSAhPSBDMl9PSykgeworICAgICAgICAgICAgICAgICAgICBjb3V0IDw8ICJDMkdyYXBoaWNCbG9jazo6bWFwKCkgZmFpbGVkIDogIiA8PCB2aWV3LmVycm9yKCkgPDwgZW5kbDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZpZXcuZXJyb3IoKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICB1aW50OF90ICpwWSA9IHZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9ZXTsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpwVSA9IHZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9VXTsKKyAgICAgICAgICAgICAgICB1aW50OF90ICpwViA9IHZpZXcuZGF0YSgpW0MyUGxhbmFyTGF5b3V0OjpQTEFORV9WXTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocFksIGRhdGEsIG1XaWR0aCAqIG1IZWlnaHQpOworICAgICAgICAgICAgICAgIG1lbWNweShwVSwgZGF0YSArIG1XaWR0aCAqIG1IZWlnaHQsIChtV2lkdGggKiBtSGVpZ2h0ID4+IDIpKTsKKyAgICAgICAgICAgICAgICBtZW1jcHkocFYsIGRhdGEgKyAobVdpZHRoICogbUhlaWdodCAqIDUgPj4gMiksIG1XaWR0aCAqIG1IZWlnaHQgPj4gMik7CisgICAgICAgICAgICAgICAgd29yay0+aW5wdXQuYnVmZmVycy5lbXBsYWNlX2JhY2sobmV3IEdyYXBoaWNCdWZmZXIoYmxvY2spKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1TdGF0cy0+YWRkRnJhbWVTaXplKGZyYW1lU2l6ZSk7CisgICAgICAgIH0KKworICAgICAgICB3b3JrLT53b3JrbGV0cy5jbGVhcigpOworICAgICAgICB3b3JrLT53b3JrbGV0cy5lbXBsYWNlX2JhY2sobmV3IEMyV29ya2xldCk7CisKKyAgICAgICAgc3RkOjpsaXN0PHN0ZDo6dW5pcXVlX3B0cjxDMldvcms+PiBpdGVtczsKKyAgICAgICAgaXRlbXMucHVzaF9iYWNrKHN0ZDo6bW92ZSh3b3JrKSk7CisgICAgICAgIC8vIHF1ZXVlKCkgaW52b2tlcyBwcm9jZXNzKCkgZnVuY3Rpb24gb2YgQzIgUGx1Z2luLgorICAgICAgICBzdGF0dXMgPSBtQ29tcG9uZW50LT5xdWV1ZSgmaXRlbXMpOworICAgICAgICBpZiAoc3RhdHVzICE9IEMyX09LKSB7CisgICAgICAgICAgICBBTE9HRSgicXVldWUgZmFpbGVkIik7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJGcmFtZSAjJWQgc2l6ZSA9ICVkIHF1ZXVlZCIsIG1OdW1JbnB1dEZyYW1lLCBmcmFtZVNpemUpOworICAgICAgICBudW1GcmFtZXMtLTsKKyAgICAgICAgbU51bUlucHV0RnJhbWUrKzsKKyAgICB9CisgICAgZnJlZShkYXRhKTsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEMyRW5jb2Rlcjo6ZGVJbml0Q29kZWMoKSB7CisgICAgQUxPR1YoIkluICVzIiwgX19mdW5jX18pOworICAgIGlmICghbUNvbXBvbmVudCkgcmV0dXJuOworCisgICAgaW50NjRfdCBzVGltZSA9IG1TdGF0cy0+Z2V0Q3VyVGltZSgpOworICAgIG1Db21wb25lbnQtPnN0b3AoKTsKKyAgICBtQ29tcG9uZW50LT5yZWxlYXNlKCk7CisgICAgbUNvbXBvbmVudCA9IG51bGxwdHI7CisgICAgaW50NjRfdCBlVGltZSA9IG1TdGF0cy0+Z2V0Q3VyVGltZSgpOworICAgIGludDY0X3QgdGltZVRha2VuID0gbVN0YXRzLT5nZXRUaW1lRGlmZihzVGltZSwgZVRpbWUpOworICAgIG1TdGF0cy0+c2V0RGVJbml0VGltZSh0aW1lVGFrZW4pOworfQorCit2b2lkIEMyRW5jb2Rlcjo6ZHVtcFN0YXRpc3RpY3Moc3RyaW5nIGlucHV0UmVmZXJlbmNlLCBpbnQ2NF90IGR1cmF0aW9uVXMsIHN0cmluZyBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBzdGF0c0ZpbGUpIHsKKyAgICBzdHJpbmcgb3BlcmF0aW9uID0gImMyZW5jb2RlIjsKKyAgICBzdHJpbmcgbW9kZSA9ICJhc3luYyI7CisgICAgbVN0YXRzLT5kdW1wU3RhdGlzdGljcyhvcGVyYXRpb24sIGlucHV0UmVmZXJlbmNlLCBkdXJhdGlvblVzLCBjb21wb25lbnROYW1lLCBtb2RlLCBzdGF0c0ZpbGUpOworfQorCit2b2lkIEMyRW5jb2Rlcjo6cmVzZXRFbmNvZGVyKCkgeworICAgIG1Jc0F1ZGlvRW5jb2RlciA9IGZhbHNlOworICAgIG1OdW1JbnB1dEZyYW1lID0gMDsKKyAgICBtRW9zID0gZmFsc2U7CisgICAgaWYgKG1TdGF0cykgbVN0YXRzLT5yZXNldCgpOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9DMkVuY29kZXIuaCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvQzJFbmNvZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2EwMjFmNAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvQzJFbmNvZGVyLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19DMl9FTkNPREVSX0hfXworI2RlZmluZSBfX0MyX0VOQ09ERVJfSF9fCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSAiQmVuY2htYXJrQzJDb21tb24uaCIKKworI2RlZmluZSBERUZBVUxUX0FVRElPX0ZSQU1FX1NJWkUgNDA5NgorCitjb25zdGV4cHIgaW50MzJfdCBLRGVmYXVsdEZyYW1lUmF0ZSA9IDI1OworCitjbGFzcyBDMkVuY29kZXIgOiBwdWJsaWMgQmVuY2htYXJrQzJDb21tb24geworICBwdWJsaWM6CisgICAgQzJFbmNvZGVyKCkKKyAgICAgICAgOiBtSXNBdWRpb0VuY29kZXIoZmFsc2UpLAorICAgICAgICAgIG1XaWR0aCgwKSwKKyAgICAgICAgICBtSGVpZ2h0KDApLAorICAgICAgICAgIG1OdW1JbnB1dEZyYW1lKDApLAorICAgICAgICAgIG1Db21wb25lbnQobnVsbHB0cikge30KKworICAgIGludDMyX3QgY3JlYXRlQ29kZWMyQ29tcG9uZW50KHN0cmluZyBjb2RlY05hbWUsIEFNZWRpYUZvcm1hdCAqZm9ybWF0KTsKKworICAgIGludDMyX3QgZW5jb2RlRnJhbWVzKGlmc3RyZWFtICZlbGVTdHJlYW0sIHNpemVfdCBpbnB1dEJ1ZmZlclNpemUpOworCisgICAgaW50MzJfdCBnZXRJbnB1dE1heEJ1ZlNpemUoKTsKKworICAgIHZvaWQgZGVJbml0Q29kZWMoKTsKKworICAgIHZvaWQgZHVtcFN0YXRpc3RpY3Moc3RyaW5nIGlucHV0UmVmZXJlbmNlLCBpbnQ2NF90IGR1cmF0aW9uVXMsIHN0cmluZyBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0YXRzRmlsZSk7CisKKyAgICB2b2lkIHJlc2V0RW5jb2RlcigpOworCisgIHByaXZhdGU6CisgICAgYm9vbCBtSXNBdWRpb0VuY29kZXI7CisKKyAgICBpbnQzMl90IG1XaWR0aDsKKyAgICBpbnQzMl90IG1IZWlnaHQ7CisgICAgaW50MzJfdCBtRnJhbWVSYXRlOworICAgIGludDMyX3QgbVNhbXBsZVJhdGU7CisKKyAgICBpbnQzMl90IG1OdW1JbnB1dEZyYW1lOworICAgIGludDMyX3QgbUlucHV0TWF4QnVmU2l6ZTsKKworICAgIHN0ZDo6c2hhcmVkX3B0cjxhbmRyb2lkOjpDb2RlYzJDbGllbnQ6Okxpc3RlbmVyPiBtTGlzdGVuZXI7CisgICAgc3RkOjpzaGFyZWRfcHRyPGFuZHJvaWQ6OkNvZGVjMkNsaWVudDo6Q29tcG9uZW50PiBtQ29tcG9uZW50OworfTsKKworI2VuZGlmICAvLyBfX0MyX0VOQ09ERVJfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0VuY29kZXIuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9FbmNvZGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmZiMWI5Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZW5jb2Rlci9FbmNvZGVyLmNwcApAQCAtMCwwICsxLDMwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiZW5jb2RlciIKKworI2luY2x1ZGUgPGZzdHJlYW0+CisKKyNpbmNsdWRlICJFbmNvZGVyLmgiCisKK3ZvaWQgRW5jb2Rlcjo6b25JbnB1dEF2YWlsYWJsZShBTWVkaWFDb2RlYyAqbWVkaWFDb2RlYywgaW50MzJfdCBidWZJZHgpIHsKKyAgICBBTE9HVigiSW4gJXMiLCBfX2Z1bmNfXyk7CisgICAgaWYgKG1lZGlhQ29kZWMgPT0gbUNvZGVjICYmIG1lZGlhQ29kZWMpIHsKKyAgICAgICAgaWYgKG1TYXdJbnB1dEVPUyB8fCBidWZJZHggPCAwKSByZXR1cm47CisgICAgICAgIGlmIChtU2lnbmFsbGVkRXJyb3IpIHsKKyAgICAgICAgICAgIENhbGxCYWNrSGFuZGxlOjptU2F3RXJyb3IgPSB0cnVlOworICAgICAgICAgICAgbUVuY29kZXJEb25lQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorCisgICAgICAgIHNpemVfdCBidWZTaXplID0gMDsKKyAgICAgICAgY2hhciAqYnVmID0gKGNoYXIgKilBTWVkaWFDb2RlY19nZXRJbnB1dEJ1ZmZlcihtQ29kZWMsIGJ1ZklkeCwgJmJ1ZlNpemUpOworICAgICAgICBpZiAoIWJ1ZikgeworICAgICAgICAgICAgbUVycm9yQ29kZSA9IEFNRURJQV9FUlJPUl9JTzsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICBtRW5jb2RlckRvbmVDb25kaXRpb24ubm90aWZ5X29uZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlclNpemUgPCBtT2Zmc2V0KSB7CisgICAgICAgICAgICBBTE9HRSgiT3V0IG9mIGJvdW5kIGFjY2VzcyBvZiBpbnB1dCBidWZmZXJcbiIpOworICAgICAgICAgICAgbUVycm9yQ29kZSA9IEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICAgICAgbUVuY29kZXJEb25lQ29uZGl0aW9uLm5vdGlmeV9vbmUoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBzaXplX3QgYnl0ZXNUb1JlYWQgPSBtUGFyYW1zLmZyYW1lU2l6ZTsKKyAgICAgICAgaWYgKG1JbnB1dEJ1ZmZlclNpemUgLSBtT2Zmc2V0IDwgbVBhcmFtcy5mcmFtZVNpemUpIHsKKyAgICAgICAgICAgIGJ5dGVzVG9SZWFkID0gbUlucHV0QnVmZmVyU2l6ZSAtIG1PZmZzZXQ7CisgICAgICAgIH0KKyAgICAgICAgLy9iLzE0ODY1NTI3NSAtIFVwZGF0ZSBGcmFtZSBzaXplLCBhcyBGb3JtYXQgdmFsdWUgbWF5IG5vdCBiZSB2YWxpZAorICAgICAgICBpZiAoYnVmU2l6ZSA8IGJ5dGVzVG9SZWFkKSB7CisgICAgICAgICAgICBpZihtTnVtSW5wdXRGcmFtZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgbVBhcmFtcy5mcmFtZVNpemUgPSBidWZTaXplOworICAgICAgICAgICAgICAgIGJ5dGVzVG9SZWFkID0gYnVmU2l6ZTsKKyAgICAgICAgICAgICAgICBtUGFyYW1zLm51bUZyYW1lcyA9IChtSW5wdXRCdWZmZXJTaXplICsgbVBhcmFtcy5mcmFtZVNpemUgLSAxKSAvIG1QYXJhbXMuZnJhbWVTaXplOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiYnl0ZXMgdG8gcmVhZCAlenUgYnVmU2l6ZSAlenUgXG4iLCBieXRlc1RvUmVhZCwgYnVmU2l6ZSk7CisgICAgICAgICAgICAgICAgbUVycm9yQ29kZSA9IEFNRURJQV9FUlJPUl9NQUxGT1JNRUQ7CisgICAgICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBtRW5jb2RlckRvbmVDb25kaXRpb24ubm90aWZ5X29uZSgpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoYnl0ZXNUb1JlYWQgPCBtUGFyYW1zLmZyYW1lU2l6ZSAmJiBtTnVtSW5wdXRGcmFtZSA8IG1QYXJhbXMubnVtRnJhbWVzIC0gMSkgeworICAgICAgICAgICAgQUxPR0UoIlBhcnRpYWwgZnJhbWUgYXQgZnJhbWVJRCAlZCBieXRlc1RvUmVhZCAlenUgZnJhbWVTaXplICVkIHRvdGFsIG51bUZyYW1lcyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIG1OdW1JbnB1dEZyYW1lLCBieXRlc1RvUmVhZCwgbVBhcmFtcy5mcmFtZVNpemUsIG1QYXJhbXMubnVtRnJhbWVzKTsKKyAgICAgICAgICAgIG1FcnJvckNvZGUgPSBBTUVESUFfRVJST1JfTUFMRk9STUVEOworICAgICAgICAgICAgbVNpZ25hbGxlZEVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIG1FbmNvZGVyRG9uZUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgbUVsZVN0cmVhbS0+cmVhZChidWYsIGJ5dGVzVG9SZWFkKTsKKyAgICAgICAgc2l6ZV90IGJ5dGVzZ2NvdW50ID0gbUVsZVN0cmVhbS0+Z2NvdW50KCk7CisgICAgICAgIGlmIChieXRlc2djb3VudCAhPSBieXRlc1RvUmVhZCkgeworICAgICAgICAgICAgQUxPR0UoImJ5dGVzIHRvIHJlYWQgJXp1IGFjdHVhbCBieXRlcyByZWFkICV6dSBcbiIsIGJ5dGVzVG9SZWFkLCBieXRlc2djb3VudCk7CisgICAgICAgICAgICBtRXJyb3JDb2RlID0gQU1FRElBX0VSUk9SX01BTEZPUk1FRDsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICBtRW5jb2RlckRvbmVDb25kaXRpb24ubm90aWZ5X29uZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgdWludDMyX3QgZmxhZyA9IDA7CisgICAgICAgIGlmIChtTnVtSW5wdXRGcmFtZSA9PSBtUGFyYW1zLm51bUZyYW1lcyAtIDEgfHwgYnl0ZXNUb1JlYWQgPT0gMCkgeworICAgICAgICAgICAgQUxPR0QoIlNlbmRpbmcgRU9TIG9uIGlucHV0IExhc3QgZnJhbWVcbiIpOworICAgICAgICAgICAgZmxhZyB8PSBBTUVESUFDT0RFQ19CVUZGRVJfRkxBR19FTkRfT0ZfU1RSRUFNOworICAgICAgICB9CisKKyAgICAgICAgdWludDY0X3QgcHJlc2VudGF0aW9uVGltZVVzOworICAgICAgICBpZiAoIXN0cm5jbXAobU1pbWUsICJ2aWRlby8iLCA2KSkgeworICAgICAgICAgICAgcHJlc2VudGF0aW9uVGltZVVzID0gbU51bUlucHV0RnJhbWUgKiAoMTAwMDAwMCAvIG1QYXJhbXMuZnJhbWVSYXRlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHByZXNlbnRhdGlvblRpbWVVcyA9CisgICAgICAgICAgICAgICAgICAgICh1aW50NjRfdCltTnVtSW5wdXRGcmFtZSAqIG1QYXJhbXMuZnJhbWVTaXplICogMTAwMDAwMCAvIG1QYXJhbXMuc2FtcGxlUmF0ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChmbGFnID09IEFNRURJQUNPREVDX0JVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU0pIG1TYXdJbnB1dEVPUyA9IHRydWU7CisgICAgICAgIEFMT0dWKCIlcyBieXRlc1JlYWQgOiAlemQgcHJlc2VudGF0aW9uVGltZVVzIDogJSIgUFJJdTY0ICIgbVNhd0lucHV0RU9TIDogJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIGJ5dGVzVG9SZWFkLCBwcmVzZW50YXRpb25UaW1lVXMsIG1TYXdJbnB1dEVPUyA/ICJUUlVFIiA6ICJGQUxTRSIpOworCisgICAgICAgIG1lZGlhX3N0YXR1c190IHN0YXR1cyA9IEFNZWRpYUNvZGVjX3F1ZXVlSW5wdXRCdWZmZXIobUNvZGVjLCBidWZJZHgsIDAgLyogb2Zmc2V0ICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ5dGVzVG9SZWFkLCBwcmVzZW50YXRpb25UaW1lVXMsIGZsYWcpOworICAgICAgICBpZiAoQU1FRElBX09LICE9IHN0YXR1cykgeworICAgICAgICAgICAgbUVycm9yQ29kZSA9IHN0YXR1czsKKyAgICAgICAgICAgIG1TaWduYWxsZWRFcnJvciA9IHRydWU7CisgICAgICAgICAgICBtRW5jb2RlckRvbmVDb25kaXRpb24ubm90aWZ5X29uZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIG1OdW1JbnB1dEZyYW1lKys7CisgICAgICAgIG1PZmZzZXQgKz0gYnl0ZXNUb1JlYWQ7CisgICAgfQorfQorCit2b2lkIEVuY29kZXI6Om9uT3V0cHV0QXZhaWxhYmxlKEFNZWRpYUNvZGVjICptZWRpYUNvZGVjLCBpbnQzMl90IGJ1ZklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU1lZGlhQ29kZWNCdWZmZXJJbmZvICpidWZmZXJJbmZvKSB7CisgICAgQUxPR1YoIkluICVzIiwgX19mdW5jX18pOworICAgIGlmIChtZWRpYUNvZGVjID09IG1Db2RlYyAmJiBtZWRpYUNvZGVjKSB7CisgICAgICAgIGlmIChtU2F3T3V0cHV0RU9TIHx8IGJ1ZklkeCA8IDApIHJldHVybjsKKyAgICAgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgeworICAgICAgICAgICAgQ2FsbEJhY2tIYW5kbGU6Om1TYXdFcnJvciA9IHRydWU7CisgICAgICAgICAgICBtRW5jb2RlckRvbmVDb25kaXRpb24ubm90aWZ5X29uZSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgbVN0YXRzLT5hZGRGcmFtZVNpemUoYnVmZmVySW5mby0+c2l6ZSk7CisgICAgICAgIEFNZWRpYUNvZGVjX3JlbGVhc2VPdXRwdXRCdWZmZXIobUNvZGVjLCBidWZJZHgsIGZhbHNlKTsKKyAgICAgICAgbVNhd091dHB1dEVPUyA9ICgwICE9IChidWZmZXJJbmZvLT5mbGFncyAmIEFNRURJQUNPREVDX0JVRkZFUl9GTEFHX0VORF9PRl9TVFJFQU0pKTsKKyAgICAgICAgbU51bU91dHB1dEZyYW1lKys7CisgICAgICAgIEFMT0dWKCIlcyBpbmRleCA6ICVkICBtU2F3T3V0cHV0RU9TIDogJXMgY291bnQgOiAldSIsIF9fRlVOQ1RJT05fXywgYnVmSWR4LAorICAgICAgICAgICAgICBtU2F3T3V0cHV0RU9TID8gIlRSVUUiIDogIkZBTFNFIiwgbU51bU91dHB1dEZyYW1lKTsKKyAgICAgICAgaWYgKG1TYXdPdXRwdXRFT1MpIHsKKyAgICAgICAgICAgIENhbGxCYWNrSGFuZGxlOjptSXNEb25lID0gdHJ1ZTsKKyAgICAgICAgICAgIG1FbmNvZGVyRG9uZUNvbmRpdGlvbi5ub3RpZnlfb25lKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRW5jb2Rlcjo6b25Gb3JtYXRDaGFuZ2VkKEFNZWRpYUNvZGVjICptZWRpYUNvZGVjLCBBTWVkaWFGb3JtYXQgKmZvcm1hdCkgeworICAgIEFMT0dWKCJJbiAlcyIsIF9fZnVuY19fKTsKKyAgICBpZiAobWVkaWFDb2RlYyA9PSBtQ29kZWMgJiYgbWVkaWFDb2RlYykgeworICAgICAgICBBTE9HVigiJXMgeyAlcyB9IiwgX19GVU5DVElPTl9fLCBBTWVkaWFGb3JtYXRfdG9TdHJpbmcoZm9ybWF0KSk7CisgICAgICAgIG1Gb3JtYXQgPSBmb3JtYXQ7CisgICAgfQorfQorCit2b2lkIEVuY29kZXI6Om9uRXJyb3IoQU1lZGlhQ29kZWMgKm1lZGlhQ29kZWMsIG1lZGlhX3N0YXR1c190IGVycikgeworICAgIEFMT0dWKCJJbiAlcyIsIF9fZnVuY19fKTsKKyAgICBpZiAobWVkaWFDb2RlYyA9PSBtQ29kZWMgJiYgbWVkaWFDb2RlYykgeworICAgICAgICBBTE9HRSgiUmVjZWl2ZWQgRXJyb3IgJWQiLCBlcnIpOworICAgICAgICBtRXJyb3JDb2RlID0gZXJyOworICAgICAgICBtU2lnbmFsbGVkRXJyb3IgPSB0cnVlOworICAgICAgICBtRW5jb2RlckRvbmVDb25kaXRpb24ubm90aWZ5X29uZSgpOworICAgIH0KK30KKwordm9pZCBFbmNvZGVyOjpzZXR1cEVuY29kZXIoKSB7CisgICAgaWYgKCFtRm9ybWF0KSBtRm9ybWF0ID0gQU1lZGlhRm9ybWF0X25ldygpOworfQorCit2b2lkIEVuY29kZXI6OmRlSW5pdENvZGVjKCkgeworICAgIGlmIChtRm9ybWF0KSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobUZvcm1hdCk7CisgICAgICAgIG1Gb3JtYXQgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAoIW1Db2RlYykgcmV0dXJuOworICAgIGludDY0X3Qgc1RpbWUgPSBtU3RhdHMtPmdldEN1clRpbWUoKTsKKyAgICBBTWVkaWFDb2RlY19zdG9wKG1Db2RlYyk7CisgICAgQU1lZGlhQ29kZWNfZGVsZXRlKG1Db2RlYyk7CisgICAgaW50NjRfdCBlVGltZSA9IG1TdGF0cy0+Z2V0Q3VyVGltZSgpOworICAgIGludDY0X3QgdGltZVRha2VuID0gbVN0YXRzLT5nZXRUaW1lRGlmZihzVGltZSwgZVRpbWUpOworICAgIG1TdGF0cy0+c2V0RGVJbml0VGltZSh0aW1lVGFrZW4pOworfQorCit2b2lkIEVuY29kZXI6OnJlc2V0RW5jb2RlcigpIHsKKyAgICBpZiAobVN0YXRzKSBtU3RhdHMtPnJlc2V0KCk7CisgICAgaWYgKG1FbGVTdHJlYW0pIG1FbGVTdHJlYW0gPSBudWxscHRyOworICAgIGlmIChtTWltZSkgbU1pbWUgPSBudWxscHRyOworICAgIG1JbnB1dEJ1ZmZlclNpemUgPSAwOworICAgIG1lbXNldCgmbVBhcmFtcywgMCwgc2l6ZW9mIG1QYXJhbXMpOworfQorCit2b2lkIEVuY29kZXI6OmR1bXBTdGF0aXN0aWNzKHN0cmluZyBpbnB1dFJlZmVyZW5jZSwgaW50NjRfdCBkdXJhdGlvblVzLCBzdHJpbmcgY29tcG9uZW50TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIG1vZGUsIHN0cmluZyBzdGF0c0ZpbGUpIHsKKyAgICBzdHJpbmcgb3BlcmF0aW9uID0gImVuY29kZSI7CisgICAgbVN0YXRzLT5kdW1wU3RhdGlzdGljcyhvcGVyYXRpb24sIGlucHV0UmVmZXJlbmNlLCBkdXJhdGlvblVzLCBjb21wb25lbnROYW1lLCBtb2RlLCBzdGF0c0ZpbGUpOworfQorCitpbnQzMl90IEVuY29kZXI6OmVuY29kZShzdHJpbmcgJmNvZGVjTmFtZSwgaWZzdHJlYW0gJmVsZVN0cmVhbSwgc2l6ZV90IGVsZVNpemUsIGJvb2wgYXN5bmNNb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgZW5jUGFyYW1ldGVyIGVuY1BhcmFtcywgY2hhciAqbWltZSkgeworICAgIEFMT0dWKCJJbiAlcyIsIF9fZnVuY19fKTsKKyAgICBtRWxlU3RyZWFtID0gJmVsZVN0cmVhbTsKKyAgICBtSW5wdXRCdWZmZXJTaXplID0gZWxlU2l6ZTsKKyAgICBtUGFyYW1zID0gZW5jUGFyYW1zOworICAgIG1PZmZzZXQgPSAwOworICAgIG1NaW1lID0gbWltZTsKKyAgICBBTWVkaWFGb3JtYXRfc2V0U3RyaW5nKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUlNRSwgbU1pbWUpOworCisgICAgLy8gU2V0IEZvcm1hdAorICAgIGlmICghc3RybmNtcChtTWltZSwgInZpZGVvLyIsIDYpKSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1dJRFRILCBtUGFyYW1zLndpZHRoKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCBtUGFyYW1zLmhlaWdodCk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0ZSQU1FX1JBVEUsIG1QYXJhbXMuZnJhbWVSYXRlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQklUX1JBVEUsIG1QYXJhbXMuYml0cmF0ZSk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0lfRlJBTUVfSU5URVJWQUwsIDEpOworICAgICAgICBpZiAobVBhcmFtcy5wcm9maWxlICYmIG1QYXJhbXMubGV2ZWwpIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1BST0ZJTEUsIG1QYXJhbXMucHJvZmlsZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9MRVZFTCwgbVBhcmFtcy5sZXZlbCk7CisgICAgICAgIH0KKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ09MT1JfRk9STUFULCBtUGFyYW1zLmNvbG9yRm9ybWF0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTWVkaWFGb3JtYXRfc2V0SW50MzIobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9TQU1QTEVfUkFURSwgbVBhcmFtcy5zYW1wbGVSYXRlKTsKKyAgICAgICAgQU1lZGlhRm9ybWF0X3NldEludDMyKG1Gb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfQ0hBTk5FTF9DT1VOVCwgbVBhcmFtcy5udW1DaGFubmVscyk7CisgICAgICAgIEFNZWRpYUZvcm1hdF9zZXRJbnQzMihtRm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCBtUGFyYW1zLmJpdHJhdGUpOworICAgIH0KKyAgICBjb25zdCBjaGFyICpzID0gQU1lZGlhRm9ybWF0X3RvU3RyaW5nKG1Gb3JtYXQpOworICAgIEFMT0dJKCJJbnB1dCBmb3JtYXQ6ICVzXG4iLCBzKTsKKworICAgIGludDY0X3Qgc1RpbWUgPSBtU3RhdHMtPmdldEN1clRpbWUoKTsKKyAgICBtQ29kZWMgPSBjcmVhdGVNZWRpYUNvZGVjKG1Gb3JtYXQsIG1NaW1lLCBjb2RlY05hbWUsIHRydWUgLyppc0VuY29kZXIqLyk7CisgICAgaWYgKCFtQ29kZWMpIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisgICAgaW50NjRfdCBlVGltZSA9IG1TdGF0cy0+Z2V0Q3VyVGltZSgpOworICAgIGludDY0X3QgdGltZVRha2VuID0gbVN0YXRzLT5nZXRUaW1lRGlmZihzVGltZSwgZVRpbWUpOworCisgICAgaWYgKCFzdHJuY21wKG1NaW1lLCAidmlkZW8vIiwgNikpIHsKKyAgICAgICAgbVBhcmFtcy5mcmFtZVNpemUgPSBtUGFyYW1zLndpZHRoICogbVBhcmFtcy5oZWlnaHQgKiAzIC8gMjsKKyAgICB9IGVsc2UgeworICAgICAgICBtUGFyYW1zLmZyYW1lU2l6ZSA9IGtEZWZhdWx0QXVkaW9FbmNvZGVGcmFtZVNpemU7CisgICAgICAgIC8vIEdldCBtSW5wdXRNYXhCdWZTaXplCisgICAgICAgIEFNZWRpYUZvcm1hdCAqaW5wdXRGb3JtYXQgPSBBTWVkaWFDb2RlY19nZXRJbnB1dEZvcm1hdChtQ29kZWMpOworICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoaW5wdXRGb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfTUFYX0lOUFVUX1NJWkUsICZtUGFyYW1zLm1heEZyYW1lU2l6ZSk7CisgICAgICAgIGlmIChtUGFyYW1zLm1heEZyYW1lU2l6ZSA8IDApIHsKKyAgICAgICAgICAgIG1QYXJhbXMubWF4RnJhbWVTaXplID0ga0RlZmF1bHRBdWRpb0VuY29kZUZyYW1lU2l6ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobVBhcmFtcy5mcmFtZVNpemUgPiBtUGFyYW1zLm1heEZyYW1lU2l6ZSkgeworICAgICAgICAgICAgbVBhcmFtcy5mcmFtZVNpemUgPSBtUGFyYW1zLm1heEZyYW1lU2l6ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtUGFyYW1zLm51bUZyYW1lcyA9IChtSW5wdXRCdWZmZXJTaXplICsgbVBhcmFtcy5mcmFtZVNpemUgLSAxKSAvIG1QYXJhbXMuZnJhbWVTaXplOworCisgICAgc1RpbWUgPSBtU3RhdHMtPmdldEN1clRpbWUoKTsKKyAgICBpZiAoYXN5bmNNb2RlKSB7CisgICAgICAgIEFNZWRpYUNvZGVjT25Bc3luY05vdGlmeUNhbGxiYWNrIGFDQiA9IHtPbklucHV0QXZhaWxhYmxlQ0IsIE9uT3V0cHV0QXZhaWxhYmxlQ0IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbkZvcm1hdENoYW5nZWRDQiwgT25FcnJvckNCfTsKKyAgICAgICAgQU1lZGlhQ29kZWNfc2V0QXN5bmNOb3RpZnlDYWxsYmFjayhtQ29kZWMsIGFDQiwgdGhpcyk7CisgICAgICAgIG1JT1RocmVhZCA9IHRocmVhZCgmQ2FsbEJhY2tIYW5kbGU6OmlvVGhyZWFkLCB0aGlzKTsKKyAgICB9CisgICAgQU1lZGlhQ29kZWNfc3RhcnQobUNvZGVjKTsKKyAgICBlVGltZSA9IG1TdGF0cy0+Z2V0Q3VyVGltZSgpOworICAgIHRpbWVUYWtlbiArPSBtU3RhdHMtPmdldFRpbWVEaWZmKHNUaW1lLCBlVGltZSk7CisgICAgbVN0YXRzLT5zZXRJbml0VGltZSh0aW1lVGFrZW4pOworCisgICAgbVN0YXRzLT5zZXRTdGFydFRpbWUoKTsKKyAgICBpZiAoIWFzeW5jTW9kZSkgeworICAgICAgICB3aGlsZSAoIW1TYXdPdXRwdXRFT1MgJiYgIW1TaWduYWxsZWRFcnJvcikgeworICAgICAgICAgICAgLy8gUXVldWUgaW5wdXQgZGF0YQorICAgICAgICAgICAgaWYgKCFtU2F3SW5wdXRFT1MpIHsKKyAgICAgICAgICAgICAgICBzc2l6ZV90IGluSWR4ID0gQU1lZGlhQ29kZWNfZGVxdWV1ZUlucHV0QnVmZmVyKG1Db2RlYywga1F1ZXVlRGVxdWV1ZVRpbWVvdXRVcyk7CisgICAgICAgICAgICAgICAgaWYgKGluSWR4IDwgMCAmJiBpbklkeCAhPSBBTUVESUFDT0RFQ19JTkZPX1RSWV9BR0FJTl9MQVRFUikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQU1lZGlhQ29kZWNfZGVxdWV1ZUlucHV0QnVmZmVyIHJldHVybmVkIGludmFsaWQgaW5kZXggJXpkXG4iLCBpbklkeCk7CisgICAgICAgICAgICAgICAgICAgIG1FcnJvckNvZGUgPSAobWVkaWFfc3RhdHVzX3QpaW5JZHg7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtRXJyb3JDb2RlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoaW5JZHggPj0gMCkgeworICAgICAgICAgICAgICAgICAgICBtU3RhdHMtPmFkZElucHV0VGltZSgpOworICAgICAgICAgICAgICAgICAgICBvbklucHV0QXZhaWxhYmxlKG1Db2RlYywgaW5JZHgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gRGVxdWV1ZSBvdXRwdXQgZGF0YQorICAgICAgICAgICAgQU1lZGlhQ29kZWNCdWZmZXJJbmZvIGluZm87CisgICAgICAgICAgICBzc2l6ZV90IG91dElkeCA9IEFNZWRpYUNvZGVjX2RlcXVldWVPdXRwdXRCdWZmZXIobUNvZGVjLCAmaW5mbywga1F1ZXVlRGVxdWV1ZVRpbWVvdXRVcyk7CisgICAgICAgICAgICBpZiAob3V0SWR4ID09IEFNRURJQUNPREVDX0lORk9fT1VUUFVUX0ZPUk1BVF9DSEFOR0VEKSB7CisgICAgICAgICAgICAgICAgbUZvcm1hdCA9IEFNZWRpYUNvZGVjX2dldE91dHB1dEZvcm1hdChtQ29kZWMpOworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnMgPSBBTWVkaWFGb3JtYXRfdG9TdHJpbmcobUZvcm1hdCk7CisgICAgICAgICAgICAgICAgQUxPR0koIk91dHB1dCBmb3JtYXQ6ICVzXG4iLCBzKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAob3V0SWR4ID49IDApIHsKKyAgICAgICAgICAgICAgICBtU3RhdHMtPmFkZE91dHB1dFRpbWUoKTsKKyAgICAgICAgICAgICAgICBvbk91dHB1dEF2YWlsYWJsZShtQ29kZWMsIG91dElkeCwgJmluZm8pOworICAgICAgICAgICAgfSBlbHNlIGlmICghKG91dElkeCA9PSBBTUVESUFDT0RFQ19JTkZPX1RSWV9BR0FJTl9MQVRFUiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIG91dElkeCA9PSBBTUVESUFDT0RFQ19JTkZPX09VVFBVVF9CVUZGRVJTX0NIQU5HRUQpKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkFNZWRpYUNvZGVjX2RlcXVldWVPdXRwdXRCdWZmZXIgcmV0dXJuZWQgaW52YWxpZCBpbmRleCAlemRcbiIsIG91dElkeCk7CisgICAgICAgICAgICAgICAgbUVycm9yQ29kZSA9IChtZWRpYV9zdGF0dXNfdClvdXRJZHg7CisgICAgICAgICAgICAgICAgcmV0dXJuIG1FcnJvckNvZGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB1bmlxdWVfbG9jazxtdXRleD4gbG9jayhtTXV0ZXgpOworICAgICAgICBtRW5jb2RlckRvbmVDb25kaXRpb24ud2FpdChsb2NrLCBbdGhpc10oKSB7IHJldHVybiAobVNhd091dHB1dEVPUyB8fCBtU2lnbmFsbGVkRXJyb3IpOyB9KTsKKyAgICB9CisgICAgaWYgKG1TaWduYWxsZWRFcnJvcikgeworICAgICAgICBBTE9HRSgiUmVjZWl2ZWQgRXJyb3Igd2hpbGUgRW5jb2RpbmciKTsKKyAgICAgICAgcmV0dXJuIG1FcnJvckNvZGU7CisgICAgfQorCisgICAgaWYgKGNvZGVjTmFtZS5lbXB0eSgpKSB7CisgICAgICAgIGNoYXIgKmVuY05hbWU7CisgICAgICAgIEFNZWRpYUNvZGVjX2dldE5hbWUobUNvZGVjLCAmZW5jTmFtZSk7CisgICAgICAgIGNvZGVjTmFtZS5hc3NpZ24oZW5jTmFtZSk7CisgICAgICAgIEFNZWRpYUNvZGVjX3JlbGVhc2VOYW1lKG1Db2RlYywgZW5jTmFtZSk7CisgICAgfQorICAgIHJldHVybiBBTUVESUFfT0s7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0VuY29kZXIuaCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2VuY29kZXIvRW5jb2Rlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhZDE0MmIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9lbmNvZGVyL0VuY29kZXIuaApAQCAtMCwwICsxLDEwNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19FTkNPREVSX0hfXworI2RlZmluZSBfX0VOQ09ERVJfSF9fCisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHF1ZXVlPgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgIm1lZGlhL05ka0ltYWdlLmgiCisjaW5jbHVkZSAiQmVuY2htYXJrQ29tbW9uLmgiCisjaW5jbHVkZSAiU3RhdHMuaCIKKworCitzdHJ1Y3QgZW5jUGFyYW1ldGVyIHsKKyAgICBpbnQzMl90IGJpdHJhdGUgPSAtMTsKKyAgICBpbnQzMl90IG51bUZyYW1lcyA9IC0xOworICAgIGludDMyX3QgZnJhbWVTaXplID0gLTE7CisgICAgaW50MzJfdCBzYW1wbGVSYXRlID0gMDsKKyAgICBpbnQzMl90IG51bUNoYW5uZWxzID0gMDsKKyAgICBpbnQzMl90IG1heEZyYW1lU2l6ZSA9IC0xOworICAgIGludDMyX3Qgd2lkdGggPSAwOworICAgIGludDMyX3QgaGVpZ2h0ID0gMDsKKyAgICBpbnQzMl90IGZyYW1lUmF0ZSA9IC0xOworICAgIGludDMyX3QgcHJvZmlsZSA9IDA7CisgICAgaW50MzJfdCBsZXZlbCA9IDA7CisgICAgaW50MzJfdCBjb2xvckZvcm1hdCA9IEFJTUFHRV9GT1JNQVRfWVVWXzQyMF84ODg7Cit9OworCitjbGFzcyBFbmNvZGVyIDogcHVibGljIENhbGxCYWNrSGFuZGxlIHsKKyAgcHVibGljOgorICAgIEVuY29kZXIoKQorICAgICAgICA6IG1Db2RlYyhudWxscHRyKSwKKyAgICAgICAgICBtRm9ybWF0KG51bGxwdHIpLAorICAgICAgICAgIG1OdW1JbnB1dEZyYW1lKDApLAorICAgICAgICAgIG1OdW1PdXRwdXRGcmFtZSgwKSwKKyAgICAgICAgICBtU2F3SW5wdXRFT1MoZmFsc2UpLAorICAgICAgICAgIG1TYXdPdXRwdXRFT1MoZmFsc2UpLAorICAgICAgICAgIG1TaWduYWxsZWRFcnJvcihmYWxzZSksCisgICAgICAgICAgbUVycm9yQ29kZShBTUVESUFfT0spIHt9CisKKyAgICB2aXJ0dWFsIH5FbmNvZGVyKCkge30KKworICAgIC8vIEVuY29kZXIgcmVsYXRlZCB1dGlsaXRpZXMKKyAgICB2b2lkIHNldHVwRW5jb2RlcigpOworCisgICAgdm9pZCBkZUluaXRDb2RlYygpOworCisgICAgdm9pZCByZXNldEVuY29kZXIoKTsKKworICAgIC8vIEFzeW5jIGNhbGxiYWNrIEFQSXMKKyAgICB2b2lkIG9uSW5wdXRBdmFpbGFibGUoQU1lZGlhQ29kZWMgKmNvZGVjLCBpbnQzMl90IGluZGV4KSBvdmVycmlkZTsKKworICAgIHZvaWQgb25Gb3JtYXRDaGFuZ2VkKEFNZWRpYUNvZGVjICpjb2RlYywgQU1lZGlhRm9ybWF0ICpmb3JtYXQpIG92ZXJyaWRlOworCisgICAgdm9pZCBvbkVycm9yKEFNZWRpYUNvZGVjICptZWRpYUNvZGVjLCBtZWRpYV9zdGF0dXNfdCBlcnIpIG92ZXJyaWRlOworCisgICAgdm9pZCBvbk91dHB1dEF2YWlsYWJsZShBTWVkaWFDb2RlYyAqY29kZWMsIGludDMyX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBTWVkaWFDb2RlY0J1ZmZlckluZm8gKmJ1ZmZlckluZm8pIG92ZXJyaWRlOworCisgICAgLy8gUHJvY2VzcyB0aGUgZnJhbWVzIGFuZCBnaXZlIGVuY29kZWQgb3V0cHV0CisgICAgaW50MzJfdCBlbmNvZGUoc3RkOjpzdHJpbmcgJmNvZGVjTmFtZSwgc3RkOjppZnN0cmVhbSAmZWxlU3RyZWFtLCBzaXplX3QgZWxlU2l6ZSwgYm9vbCBhc3luY01vZGUsCisgICAgICAgICAgICAgICAgICAgZW5jUGFyYW1ldGVyIGVuY1BhcmFtcywgY2hhciAqbWltZSk7CisKKyAgICB2b2lkIGR1bXBTdGF0aXN0aWNzKHN0cmluZyBpbnB1dFJlZmVyZW5jZSwgaW50NjRfdCBkdXJhdGlvblVzLCBzdHJpbmcgY29kZWNOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbW9kZSA9ICIiLCBzdHJpbmcgc3RhdHNGaWxlID0gIiIpOworCisgIHByaXZhdGU6CisgICAgQU1lZGlhQ29kZWMgKm1Db2RlYzsKKyAgICBBTWVkaWFGb3JtYXQgKm1Gb3JtYXQ7CisKKyAgICBpbnQzMl90IG1OdW1JbnB1dEZyYW1lOworICAgIGludDMyX3QgbU51bU91dHB1dEZyYW1lOworICAgIGJvb2wgbVNhd0lucHV0RU9TOworICAgIGJvb2wgbVNhd091dHB1dEVPUzsKKyAgICBib29sIG1TaWduYWxsZWRFcnJvcjsKKyAgICBtZWRpYV9zdGF0dXNfdCBtRXJyb3JDb2RlOworCisgICAgY2hhciAqbU1pbWU7CisgICAgaW50MzJfdCBtT2Zmc2V0OworICAgIHN0ZDo6aWZzdHJlYW0gKm1FbGVTdHJlYW07CisgICAgc2l6ZV90IG1JbnB1dEJ1ZmZlclNpemU7CisgICAgZW5jUGFyYW1ldGVyIG1QYXJhbXM7CisKKyAgICAvLyBBc3luY2hyb25vdXMgbG9ja3MKKyAgICBzdGQ6Om11dGV4IG1NdXRleDsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtRW5jb2RlckRvbmVDb25kaXRpb247Cit9OworI2VuZGlmICAvLyBfX0VOQ09ERVJfSF9fCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9leHRyYWN0b3IvQW5kcm9pZC5icCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2V4dHJhY3Rvci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZDk0NzYKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9leHRyYWN0b3IvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJtZWRpYWJlbmNobWFya19leHRyYWN0b3IiLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19jb21tb24tZGVmYXVsdHMiLAorICAgICAgICAibGlibWVkaWFiZW5jaG1hcmtfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkV4dHJhY3Rvci5jcHAiXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorCisgICAgbGRmbGFnczogWyItV2wsLUJzeW1ib2xpYyJdCit9CisKK2NjX2xpYnJhcnlfc3RhdGljIHsKKyAgICBuYW1lOiAibGlibWVkaWFiZW5jaG1hcmtfY29kZWMyX2V4dHJhY3RvciIsCisgICAgZGVmYXVsdHM6IFsKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX2NvZGVjMl9jb21tb24tZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkV4dHJhY3Rvci5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19jb2RlYzJfY29tbW9uIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2V4dHJhY3Rvci9FeHRyYWN0b3IuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZXh0cmFjdG9yL0V4dHJhY3Rvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjBiYjNiOQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2V4dHJhY3Rvci9FeHRyYWN0b3IuY3BwCkBAIC0wLDAgKzEsMTM1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJleHRyYWN0b3IiCisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgIkV4dHJhY3Rvci5oIgorCitpbnQzMl90IEV4dHJhY3Rvcjo6aW5pdEV4dHJhY3RvcihpbnQzMl90IGZkLCBzaXplX3QgZmlsZVNpemUpIHsKKyAgICBtU3RhdHMgPSBuZXcgU3RhdHMoKTsKKworICAgIG1GcmFtZUJ1ZiA9ICh1aW50OF90ICopY2FsbG9jKGtNYXhCdWZmZXJTaXplLCBzaXplb2YodWludDhfdCkpOworICAgIGlmICghbUZyYW1lQnVmKSByZXR1cm4gLTE7CisKKyAgICBpbnQ2NF90IHNUaW1lID0gbVN0YXRzLT5nZXRDdXJUaW1lKCk7CisKKyAgICBtRXh0cmFjdG9yID0gQU1lZGlhRXh0cmFjdG9yX25ldygpOworICAgIGlmICghbUV4dHJhY3RvcikgcmV0dXJuIEFNRURJQUNPREVDX0VSUk9SX0lOU1VGRklDSUVOVF9SRVNPVVJDRTsKKyAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBBTWVkaWFFeHRyYWN0b3Jfc2V0RGF0YVNvdXJjZUZkKG1FeHRyYWN0b3IsIGZkLCAwLCBmaWxlU2l6ZSk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHJldHVybiBzdGF0dXM7CisKKyAgICBpbnQ2NF90IGVUaW1lID0gbVN0YXRzLT5nZXRDdXJUaW1lKCk7CisgICAgaW50NjRfdCB0aW1lVGFrZW4gPSBtU3RhdHMtPmdldFRpbWVEaWZmKHNUaW1lLCBlVGltZSk7CisgICAgbVN0YXRzLT5zZXRJbml0VGltZSh0aW1lVGFrZW4pOworCisgICAgcmV0dXJuIEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0NvdW50KG1FeHRyYWN0b3IpOworfQorCit2b2lkICpFeHRyYWN0b3I6OmdldENTRFNhbXBsZShBTWVkaWFDb2RlY0J1ZmZlckluZm8gJmZyYW1lSW5mbywgaW50MzJfdCBjc2RJbmRleCkgeworICAgIGNoYXIgY3NkTmFtZVtrTWF4Q1NEU3RybGVuXTsKKyAgICB2b2lkICpjc2RCdWZmZXIgPSBudWxscHRyOworICAgIGZyYW1lSW5mby5wcmVzZW50YXRpb25UaW1lVXMgPSAwOworICAgIGZyYW1lSW5mby5mbGFncyA9IEFNRURJQUNPREVDX0JVRkZFUl9GTEFHX0NPREVDX0NPTkZJRzsKKyAgICBzbnByaW50Zihjc2ROYW1lLCBzaXplb2YoY3NkTmFtZSksICJjc2QtJWQiLCBjc2RJbmRleCk7CisKKyAgICBzaXplX3Qgc2l6ZTsKKyAgICBib29sIGNzZEZvdW5kID0gQU1lZGlhRm9ybWF0X2dldEJ1ZmZlcihtRm9ybWF0LCBjc2ROYW1lLCAmY3NkQnVmZmVyLCAmc2l6ZSk7CisgICAgaWYgKCFjc2RGb3VuZCkgcmV0dXJuIG51bGxwdHI7CisgICAgZnJhbWVJbmZvLnNpemUgPSAoaW50MzJfdClzaXplOworICAgIG1TdGF0cy0+YWRkRnJhbWVTaXplKGZyYW1lSW5mby5zaXplKTsKKworICAgIHJldHVybiBjc2RCdWZmZXI7Cit9CisKK2ludDMyX3QgRXh0cmFjdG9yOjpnZXRGcmFtZVNhbXBsZShBTWVkaWFDb2RlY0J1ZmZlckluZm8gJmZyYW1lSW5mbykgeworICAgIGludDMyX3Qgc2l6ZSA9IEFNZWRpYUV4dHJhY3Rvcl9yZWFkU2FtcGxlRGF0YShtRXh0cmFjdG9yLCBtRnJhbWVCdWYsIGtNYXhCdWZmZXJTaXplKTsKKyAgICBpZiAoc2l6ZSA8IDApIHJldHVybiAtMTsKKworICAgIGZyYW1lSW5mby5mbGFncyA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRTYW1wbGVGbGFncyhtRXh0cmFjdG9yKTsKKyAgICBmcmFtZUluZm8uc2l6ZSA9IHNpemU7CisgICAgbVN0YXRzLT5hZGRGcmFtZVNpemUoZnJhbWVJbmZvLnNpemUpOworICAgIGZyYW1lSW5mby5wcmVzZW50YXRpb25UaW1lVXMgPSBBTWVkaWFFeHRyYWN0b3JfZ2V0U2FtcGxlVGltZShtRXh0cmFjdG9yKTsKKyAgICBBTWVkaWFFeHRyYWN0b3JfYWR2YW5jZShtRXh0cmFjdG9yKTsKKworICAgIHJldHVybiAwOworfQorCitpbnQzMl90IEV4dHJhY3Rvcjo6c2V0dXBUcmFja0Zvcm1hdChpbnQzMl90IHRyYWNrSWQpIHsKKyAgICBBTWVkaWFFeHRyYWN0b3Jfc2VsZWN0VHJhY2sobUV4dHJhY3RvciwgdHJhY2tJZCk7CisgICAgbUZvcm1hdCA9IEFNZWRpYUV4dHJhY3Rvcl9nZXRUcmFja0Zvcm1hdChtRXh0cmFjdG9yLCB0cmFja0lkKTsKKyAgICBpZiAoIW1Gb3JtYXQpIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisKKyAgICBib29sIGR1cmF0aW9uRm91bmQgPSBBTWVkaWFGb3JtYXRfZ2V0SW50NjQobUZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9EVVJBVElPTiwgJm1EdXJhdGlvblVzKTsKKyAgICBpZiAoIWR1cmF0aW9uRm91bmQpIHJldHVybiBBTUVESUFfRVJST1JfSU5WQUxJRF9PQkpFQ1Q7CisKKyAgICByZXR1cm4gQU1FRElBX09LOworfQorCitpbnQzMl90IEV4dHJhY3Rvcjo6ZXh0cmFjdChpbnQzMl90IHRyYWNrSWQpIHsKKyAgICBpbnQzMl90IHN0YXR1cyA9IHNldHVwVHJhY2tGb3JtYXQodHJhY2tJZCk7CisgICAgaWYgKHN0YXR1cyAhPSBBTUVESUFfT0spIHJldHVybiBzdGF0dXM7CisKKyAgICBpbnQzMl90IGlkeCA9IDA7CisgICAgQU1lZGlhQ29kZWNCdWZmZXJJbmZvIGZyYW1lSW5mbzsKKyAgICB3aGlsZSAoMSkgeworICAgICAgICBtZW1zZXQoJmZyYW1lSW5mbywgMCwgc2l6ZW9mKEFNZWRpYUNvZGVjQnVmZmVySW5mbykpOworICAgICAgICB2b2lkICpjc2RCdWZmZXIgPSBnZXRDU0RTYW1wbGUoZnJhbWVJbmZvLCBpZHgpOworICAgICAgICBpZiAoIWNzZEJ1ZmZlciB8fCAhZnJhbWVJbmZvLnNpemUpIGJyZWFrOworICAgICAgICBpZHgrKzsKKyAgICB9CisKKyAgICBtU3RhdHMtPnNldFN0YXJ0VGltZSgpOworICAgIHdoaWxlICgxKSB7CisgICAgICAgIGludDMyX3Qgc3RhdHVzID0gZ2V0RnJhbWVTYW1wbGUoZnJhbWVJbmZvKTsKKyAgICAgICAgaWYgKHN0YXR1cyB8fCAhZnJhbWVJbmZvLnNpemUpIGJyZWFrOworICAgICAgICBtU3RhdHMtPmFkZE91dHB1dFRpbWUoKTsKKyAgICB9CisKKyAgICBpZiAobUZvcm1hdCkgeworICAgICAgICBBTWVkaWFGb3JtYXRfZGVsZXRlKG1Gb3JtYXQpOworICAgICAgICBtRm9ybWF0ID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBBTWVkaWFFeHRyYWN0b3JfdW5zZWxlY3RUcmFjayhtRXh0cmFjdG9yLCB0cmFja0lkKTsKKworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK3ZvaWQgRXh0cmFjdG9yOjpkdW1wU3RhdGlzdGljcyhzdHJpbmcgaW5wdXRSZWZlcmVuY2UsIHN0cmluZyBjb21wb25lbnROYW1lLCBzdHJpbmcgc3RhdHNGaWxlKSB7CisgICAgc3RyaW5nIG9wZXJhdGlvbiA9ICJleHRyYWN0IjsKKyAgICBtU3RhdHMtPmR1bXBTdGF0aXN0aWNzKG9wZXJhdGlvbiwgaW5wdXRSZWZlcmVuY2UsIG1EdXJhdGlvblVzLCBjb21wb25lbnROYW1lLCAiIiwgc3RhdHNGaWxlKTsKK30KKwordm9pZCBFeHRyYWN0b3I6OmRlSW5pdEV4dHJhY3RvcigpIHsKKyAgICBpZiAobUZyYW1lQnVmKSB7CisgICAgICAgIGZyZWUobUZyYW1lQnVmKTsKKyAgICAgICAgbUZyYW1lQnVmID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpbnQ2NF90IHNUaW1lID0gbVN0YXRzLT5nZXRDdXJUaW1lKCk7CisgICAgaWYgKG1FeHRyYWN0b3IpIHsKKyAgICAgICAgLy8gVE9ETzogKGIvMTQwMTI4NTA1KSBNdWx0aXBsZSBjYWxscyByZXN1bHQgaW4gRG9TLgorICAgICAgICAvLyBVbmNvbW1lbnQgY2FsbCB0byBBTWVkaWFFeHRyYWN0b3JfZGVsZXRlKCkgb25jZSB0aGlzIGlzIHJlc29sdmVkCisgICAgICAgIC8vIEFNZWRpYUV4dHJhY3Rvcl9kZWxldGUobUV4dHJhY3Rvcik7CisgICAgICAgIG1FeHRyYWN0b3IgPSBudWxscHRyOworICAgIH0KKyAgICBpbnQ2NF90IGVUaW1lID0gbVN0YXRzLT5nZXRDdXJUaW1lKCk7CisgICAgaW50NjRfdCBkZUluaXRUaW1lID0gbVN0YXRzLT5nZXRUaW1lRGlmZihzVGltZSwgZVRpbWUpOworICAgIG1TdGF0cy0+c2V0RGVJbml0VGltZShkZUluaXRUaW1lKTsKK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2V4dHJhY3Rvci9FeHRyYWN0b3IuaCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL2V4dHJhY3Rvci9FeHRyYWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjk0ZmM3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvZXh0cmFjdG9yL0V4dHJhY3Rvci5oCkBAIC0wLDAgKzEsNjYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIF9fRVhUUkFDVE9SX0hfXworI2RlZmluZSBfX0VYVFJBQ1RPUl9IX18KKworI2luY2x1ZGUgPG1lZGlhL05ka01lZGlhRXh0cmFjdG9yLmg+CisKKyNpbmNsdWRlICJCZW5jaG1hcmtDb21tb24uaCIKKyNpbmNsdWRlICJTdGF0cy5oIgorCitjbGFzcyBFeHRyYWN0b3IgeworICBwdWJsaWM6CisgICAgRXh0cmFjdG9yKCkKKyAgICAgICAgOiBtRm9ybWF0KG51bGxwdHIpLAorICAgICAgICAgIG1FeHRyYWN0b3IobnVsbHB0ciksCisgICAgICAgICAgbVN0YXRzKG51bGxwdHIpLAorICAgICAgICAgIG1GcmFtZUJ1ZntudWxscHRyfSwKKyAgICAgICAgICBtRHVyYXRpb25Vc3swfSB7fQorCisgICAgfkV4dHJhY3RvcigpIHsKKyAgICAgICAgaWYgKG1TdGF0cykgZGVsZXRlIG1TdGF0czsKKyAgICB9CisKKyAgICBpbnQzMl90IGluaXRFeHRyYWN0b3IoaW50MzJfdCBmZCwgc2l6ZV90IGZpbGVTaXplKTsKKworICAgIGludDMyX3Qgc2V0dXBUcmFja0Zvcm1hdChpbnQzMl90IHRyYWNrSWQpOworCisgICAgdm9pZCAqZ2V0Q1NEU2FtcGxlKEFNZWRpYUNvZGVjQnVmZmVySW5mbyAmZnJhbWVJbmZvLCBpbnQzMl90IGNzZEluZGV4KTsKKworICAgIGludDMyX3QgZ2V0RnJhbWVTYW1wbGUoQU1lZGlhQ29kZWNCdWZmZXJJbmZvICZmcmFtZUluZm8pOworCisgICAgaW50MzJfdCBleHRyYWN0KGludDMyX3QgdHJhY2tJZCk7CisKKyAgICB2b2lkIGR1bXBTdGF0aXN0aWNzKHN0cmluZyBpbnB1dFJlZmVyZW5jZSwgc3RyaW5nIGNvbXBvbmVudE5hbWUgPSAiIiwgc3RyaW5nIHN0YXRzRmlsZSA9ICIiKTsKKworICAgIHZvaWQgZGVJbml0RXh0cmFjdG9yKCk7CisKKyAgICBBTWVkaWFGb3JtYXQgKmdldEZvcm1hdCgpIHsgcmV0dXJuIG1Gb3JtYXQ7IH0KKworICAgIHVpbnQ4X3QgKmdldEZyYW1lQnVmKCkgeyByZXR1cm4gbUZyYW1lQnVmOyB9CisKKyAgICBpbnQ2NF90IGdldENsaXBEdXJhdGlvbigpIHsgcmV0dXJuIG1EdXJhdGlvblVzOyB9CisKKyAgcHJpdmF0ZToKKyAgICBBTWVkaWFGb3JtYXQgKm1Gb3JtYXQ7CisgICAgQU1lZGlhRXh0cmFjdG9yICptRXh0cmFjdG9yOworICAgIFN0YXRzICptU3RhdHM7CisgICAgdWludDhfdCAqbUZyYW1lQnVmOworICAgIGludDY0X3QgbUR1cmF0aW9uVXM7Cit9OworCisjZW5kaWYgIC8vIF9fRVhUUkFDVE9SX0hfXwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL211eGVyL0FuZHJvaWQuYnAgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9tdXhlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2NjlkNGEKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9tdXhlci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYm1lZGlhYmVuY2htYXJrX211eGVyIiwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGlibWVkaWFiZW5jaG1hcmtfY29tbW9uLWRlZmF1bHRzIiwKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJNdXhlci5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYm1lZGlhYmVuY2htYXJrX2V4dHJhY3RvciJdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCisKKyAgICBsZGZsYWdzOiBbIi1XbCwtQnN5bWJvbGljIl0KK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL211eGVyL011eGVyLmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay9zcmMvbmF0aXZlL211eGVyL011eGVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTE1MGNhCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvbXV4ZXIvTXV4ZXIuY3BwCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIm11eGVyIgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKworI2luY2x1ZGUgIk11eGVyLmgiCisKK2ludDMyX3QgTXV4ZXI6OmluaXRNdXhlcihpbnQzMl90IGZkLCBNVVhFUl9PVVRQVVRfVCBvdXRwdXRGb3JtYXQpIHsKKyAgICBpZiAoIW1Gb3JtYXQpIG1Gb3JtYXQgPSBtRXh0cmFjdG9yLT5nZXRGb3JtYXQoKTsKKyAgICBpZiAoIW1TdGF0cykgbVN0YXRzID0gbmV3IFN0YXRzKCk7CisKKyAgICBpbnQ2NF90IHNUaW1lID0gbVN0YXRzLT5nZXRDdXJUaW1lKCk7CisgICAgbU11eGVyID0gQU1lZGlhTXV4ZXJfbmV3KGZkLCAoT3V0cHV0Rm9ybWF0KW91dHB1dEZvcm1hdCk7CisgICAgaWYgKCFtTXV4ZXIpIHsKKyAgICAgICAgQUxPR1YoIlVuYWJsZSB0byBjcmVhdGUgbXV4ZXIiKTsKKyAgICAgICAgcmV0dXJuIEFNRURJQV9FUlJPUl9JTlZBTElEX09CSkVDVDsKKyAgICB9CisgICAgLyoKKyAgICAgKiBBTWVkaWFNdXhlcl9hZGRUcmFjayByZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV3IHRyYWNrIG9yIGEgbmVnYXRpdmUgdmFsdWUKKyAgICAgKiBpbiBjYXNlIG9mIGZhaWx1cmUsIHdoaWNoIGNhbiBiZSBpbnRlcnByZXRlZCBhcyBhIG1lZGlhX3N0YXR1c190LgorICAgICAqLworICAgIHNzaXplX3QgaW5kZXggPSBBTWVkaWFNdXhlcl9hZGRUcmFjayhtTXV4ZXIsIG1Gb3JtYXQpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1YoIkZvcm1hdCBub3Qgc3VwcG9ydGVkIik7CisgICAgICAgIHJldHVybiBpbmRleDsKKyAgICB9CisgICAgQU1lZGlhTXV4ZXJfc3RhcnQobU11eGVyKTsKKyAgICBpbnQ2NF90IGVUaW1lID0gbVN0YXRzLT5nZXRDdXJUaW1lKCk7CisgICAgaW50NjRfdCB0aW1lVGFrZW4gPSBtU3RhdHMtPmdldFRpbWVEaWZmKHNUaW1lLCBlVGltZSk7CisgICAgbVN0YXRzLT5zZXRJbml0VGltZSh0aW1lVGFrZW4pOworICAgIHJldHVybiBBTUVESUFfT0s7Cit9CisKK3ZvaWQgTXV4ZXI6OmRlSW5pdE11eGVyKCkgeworICAgIGlmIChtRm9ybWF0KSB7CisgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUobUZvcm1hdCk7CisgICAgICAgIG1Gb3JtYXQgPSBudWxscHRyOworICAgIH0KKyAgICBpZiAoIW1NdXhlcikgcmV0dXJuOworICAgIGludDY0X3Qgc1RpbWUgPSBtU3RhdHMtPmdldEN1clRpbWUoKTsKKyAgICBBTWVkaWFNdXhlcl9zdG9wKG1NdXhlcik7CisgICAgQU1lZGlhTXV4ZXJfZGVsZXRlKG1NdXhlcik7CisgICAgaW50NjRfdCBlVGltZSA9IG1TdGF0cy0+Z2V0Q3VyVGltZSgpOworICAgIGludDY0X3QgdGltZVRha2VuID0gbVN0YXRzLT5nZXRUaW1lRGlmZihzVGltZSwgZVRpbWUpOworICAgIG1TdGF0cy0+c2V0RGVJbml0VGltZSh0aW1lVGFrZW4pOworfQorCit2b2lkIE11eGVyOjpyZXNldE11eGVyKCkgeworICAgIGlmIChtU3RhdHMpIG1TdGF0cy0+cmVzZXQoKTsKK30KKwordm9pZCBNdXhlcjo6ZHVtcFN0YXRpc3RpY3Moc3RyaW5nIGlucHV0UmVmZXJlbmNlLCBzdHJpbmcgY29tcG9uZW50TmFtZSwgc3RyaW5nIHN0YXRzRmlsZSkgeworICAgIHN0cmluZyBvcGVyYXRpb24gPSAibXV4IjsKKyAgICBtU3RhdHMtPmR1bXBTdGF0aXN0aWNzKG9wZXJhdGlvbiwgaW5wdXRSZWZlcmVuY2UsIG1FeHRyYWN0b3ItPmdldENsaXBEdXJhdGlvbigpLCBjb21wb25lbnROYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsIHN0YXRzRmlsZSk7Cit9CisKK2ludDMyX3QgTXV4ZXI6Om11eCh1aW50OF90ICppbnB1dEJ1ZmZlciwgdmVjdG9yPEFNZWRpYUNvZGVjQnVmZmVySW5mbz4gJmZyYW1lSW5mb3MpIHsKKyAgICAvLyBNdXggZnJhbWUgZGF0YQorICAgIHNpemVfdCBmcmFtZUlkeCA9IDA7CisgICAgbVN0YXRzLT5zZXRTdGFydFRpbWUoKTsKKyAgICB3aGlsZSAoZnJhbWVJZHggPCBmcmFtZUluZm9zLnNpemUoKSkgeworICAgICAgICBBTWVkaWFDb2RlY0J1ZmZlckluZm8gaW5mbyA9IGZyYW1lSW5mb3MuYXQoZnJhbWVJZHgpOworICAgICAgICBtZWRpYV9zdGF0dXNfdCBzdGF0dXMgPSBBTWVkaWFNdXhlcl93cml0ZVNhbXBsZURhdGEobU11eGVyLCAwLCBpbnB1dEJ1ZmZlciwgJmluZm8pOworICAgICAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJFcnJvciBpbiBBTWVkaWFNdXhlcl93cml0ZVNhbXBsZURhdGEiKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKyAgICAgICAgbVN0YXRzLT5hZGRPdXRwdXRUaW1lKCk7CisgICAgICAgIG1TdGF0cy0+YWRkRnJhbWVTaXplKGluZm8uc2l6ZSk7CisgICAgICAgIGZyYW1lSWR4Kys7CisgICAgfQorICAgIHJldHVybiBBTUVESUFfT0s7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvc3JjL25hdGl2ZS9tdXhlci9NdXhlci5oIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvbXV4ZXIvTXV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjBmZGFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3NyYy9uYXRpdmUvbXV4ZXIvTXV4ZXIuaApAQCAtMCwwICsxLDYzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBfX01VWEVSX0hfXworI2RlZmluZSBfX01VWEVSX0hfXworCisjaW5jbHVkZSA8bWVkaWEvTmRrTWVkaWFNdXhlci5oPgorCisjaW5jbHVkZSAiQmVuY2htYXJrQ29tbW9uLmgiCisjaW5jbHVkZSAiU3RhdHMuaCIKKyNpbmNsdWRlICJFeHRyYWN0b3IuaCIKKwordHlwZWRlZiBlbnVtIHsKKyAgICBNVVhFUl9PVVRQVVRfRk9STUFUX01QRUdfNCA9IDAsCisgICAgTVVYRVJfT1VUUFVUX0ZPUk1BVF9XRUJNID0gMSwKKyAgICBNVVhFUl9PVVRQVVRfRk9STUFUXzNHUFAgPSAyLAorICAgIE1VWEVSX09VVFBVVF9GT1JNQVRfT0dHID0gNCwKKyAgICBNVVhFUl9PVVRQVVRfRk9STUFUX0lOVkFMSUQgPSA1LAorfSBNVVhFUl9PVVRQVVRfVDsKKworY2xhc3MgTXV4ZXIgeworICBwdWJsaWM6CisgICAgTXV4ZXIoKSA6IG1Gb3JtYXQobnVsbHB0ciksIG1NdXhlcihudWxscHRyKSwgbVN0YXRzKG51bGxwdHIpIHsgbUV4dHJhY3RvciA9IG5ldyBFeHRyYWN0b3IoKTsgfQorCisgICAgdmlydHVhbCB+TXV4ZXIoKSB7CisgICAgICAgIGlmIChtU3RhdHMpIGRlbGV0ZSBtU3RhdHM7CisgICAgICAgIGlmIChtRXh0cmFjdG9yKSBkZWxldGUgbUV4dHJhY3RvcjsKKyAgICB9CisKKyAgICBTdGF0cyAqZ2V0U3RhdHMoKSB7IHJldHVybiBtU3RhdHM7IH0KKyAgICBFeHRyYWN0b3IgKmdldEV4dHJhY3RvcigpIHsgcmV0dXJuIG1FeHRyYWN0b3I7IH0KKworICAgIC8qIE11eGVyIHJlbGF0ZWQgdXRpbGl0aWVzICovCisgICAgaW50MzJfdCBpbml0TXV4ZXIoaW50MzJfdCBmZCwgTVVYRVJfT1VUUFVUX1Qgb3V0cHV0Rm9ybWF0KTsKKyAgICB2b2lkIGRlSW5pdE11eGVyKCk7CisgICAgdm9pZCByZXNldE11eGVyKCk7CisKKyAgICAvKiBQcm9jZXNzIHRoZSBmcmFtZXMgYW5kIGdpdmUgTXV4ZWQgb3V0cHV0ICovCisgICAgaW50MzJfdCBtdXgodWludDhfdCAqaW5wdXRCdWZmZXIsIHZlY3RvcjxBTWVkaWFDb2RlY0J1ZmZlckluZm8+ICZmcmFtZVNpemVzKTsKKworICAgIHZvaWQgZHVtcFN0YXRpc3RpY3Moc3RyaW5nIGlucHV0UmVmZXJlbmNlLCBzdHJpbmcgY29kZWNOYW1lID0gIiIsIHN0cmluZyBzdGF0c0ZpbGUgPSAiIik7CisKKyAgcHJpdmF0ZToKKyAgICBBTWVkaWFGb3JtYXQgKm1Gb3JtYXQ7CisgICAgQU1lZGlhTXV4ZXIgKm1NdXhlcjsKKyAgICBFeHRyYWN0b3IgKm1FeHRyYWN0b3I7CisgICAgU3RhdHMgKm1TdGF0czsKK307CisKKyNlbmRpZiAgLy8gX19NVVhFUl9IX18KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9BbmRyb2lkLmJwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ2ZmE0YQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTExIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworY2NfdGVzdCB7CisgICAgbmFtZTogImV4dHJhY3RvclRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19jb21tb24tZGVmYXVsdHMiLAorICAgICAgICAibGlibWVkaWFiZW5jaG1hcmtfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkV4dHJhY3RvclRlc3QuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJtZWRpYWJlbmNobWFya19leHRyYWN0b3IiXQorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiZGVjb2RlclRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19jb21tb24tZGVmYXVsdHMiLAorICAgICAgICAibGlibWVkaWFiZW5jaG1hcmtfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkRlY29kZXJUZXN0LmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX2V4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19kZWNvZGVyIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAibXV4ZXJUZXN0IiwKKyAgICBndGVzdDogdHJ1ZSwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGlibWVkaWFiZW5jaG1hcmtfY29tbW9uLWRlZmF1bHRzIiwKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX3NvZnRfc2FuaXRpemVfYWxsLWRlZmF1bHRzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJNdXhlclRlc3QuY3BwIl0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGlibWVkaWFiZW5jaG1hcmtfZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX211eGVyIiwKKyAgICBdLAorfQorCitjY190ZXN0IHsKKyAgICBuYW1lOiAiZW5jb2RlclRlc3QiLAorICAgIGd0ZXN0OiB0cnVlLAorICAgIGRlZmF1bHRzOiBbCisgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19jb21tb24tZGVmYXVsdHMiLAorICAgICAgICAibGlibWVkaWFiZW5jaG1hcmtfc29mdF9zYW5pdGl6ZV9hbGwtZGVmYXVsdHMiLAorICAgIF0sCisKKyAgICBzcmNzOiBbIkVuY29kZXJUZXN0LmNwcCJdLAorCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX2V4dHJhY3RvciIsCisgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19kZWNvZGVyIiwKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX2VuY29kZXIiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJDMkRlY29kZXJUZXN0IiwKKyAgICBndGVzdDogdHJ1ZSwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGlibWVkaWFiZW5jaG1hcmtfY29kZWMyX2NvbW1vbi1kZWZhdWx0cyIsCisgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19zb2Z0X3Nhbml0aXplX2FsbC1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJEZWNvZGVyVGVzdC5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19jb2RlYzJfZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX2NvZGVjMl9jb21tb24iLAorICAgICAgICAibGlibWVkaWFiZW5jaG1hcmtfY29kZWMyX2RlY29kZXIiLAorICAgIF0sCit9CisKK2NjX3Rlc3QgeworICAgIG5hbWU6ICJDMkVuY29kZXJUZXN0IiwKKyAgICBndGVzdDogdHJ1ZSwKKyAgICBkZWZhdWx0czogWworICAgICAgICAibGlibWVkaWFiZW5jaG1hcmtfY29kZWMyX2NvbW1vbi1kZWZhdWx0cyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiQzJFbmNvZGVyVGVzdC5jcHAiXSwKKworICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJtZWRpYWJlbmNobWFya19jb2RlYzJfZXh0cmFjdG9yIiwKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX2NvZGVjMl9kZWNvZGVyIiwKKyAgICAgICAgImxpYm1lZGlhYmVuY2htYXJrX2NvZGVjMl9jb21tb24iLAorICAgICAgICAibGlibWVkaWFiZW5jaG1hcmtfY29kZWMyX2VuY29kZXIiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQmVuY2htYXJrVGVzdEVudmlyb25tZW50LmggYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvQmVuY2htYXJrVGVzdEVudmlyb25tZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGVkYjA0OAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9CZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQuaApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgX19CRU5DSE1BUktfVEVTVF9FTlZJUk9OTUVOVF9IX18KKyNkZWZpbmUgX19CRU5DSE1BUktfVEVTVF9FTlZJUk9OTUVOVF9IX18KKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlIDxnZXRvcHQuaD4KKwordXNpbmcgbmFtZXNwYWNlIHN0ZDsKKworY2xhc3MgQmVuY2htYXJrVGVzdEVudmlyb25tZW50IDogcHVibGljIDo6dGVzdGluZzo6RW52aXJvbm1lbnQgeworICBwdWJsaWM6CisgICAgQmVuY2htYXJrVGVzdEVudmlyb25tZW50KCkKKyAgICAgICAgOiByZXMoIi9kYXRhL2xvY2FsL3RtcC9NZWRpYUJlbmNobWFyay9yZXMvIiksCisgICAgICAgICAgc3RhdHNGaWxlKCIvZGF0YS9sb2NhbC90bXAvTWVkaWFCZW5jaG1hcmsvcmVzL3N0YXRzLmNzdiIpIHt9CisKKyAgICAvLyBQYXJzZXMgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudAorICAgIGludCBpbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KTsKKworICAgIHZvaWQgc2V0UmVzKGNvbnN0IGNoYXIgKl9yZXMpIHsgcmVzID0gX3JlczsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFJlcygpIGNvbnN0IHsgcmV0dXJuIHJlczsgfQorCisgICAgdm9pZCBzZXRTdGF0c0ZpbGUoY29uc3Qgc3RyaW5nIG1vZHVsZSkgeyBzdGF0c0ZpbGUgPSBnZXRSZXMoKSArIG1vZHVsZTsgfQorCisgICAgY29uc3Qgc3RyaW5nIGdldFN0YXRzRmlsZSgpIGNvbnN0IHsgcmV0dXJuIHN0YXRzRmlsZTsgfQorCisgICAgYm9vbCB3cml0ZVN0YXRzSGVhZGVyKCk7CisKKyAgcHJpdmF0ZToKKyAgICBzdHJpbmcgcmVzOworICAgIHN0cmluZyBzdGF0c0ZpbGU7Cit9OworCitpbnQgQmVuY2htYXJrVGVzdEVudmlyb25tZW50Ojppbml0RnJvbU9wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgc3RhdGljIHN0cnVjdCBvcHRpb24gb3B0aW9uc1tdID0ge3sicGF0aCIsIHJlcXVpcmVkX2FyZ3VtZW50LCAwLCAnUCd9LCB7MCwgMCwgMCwgMH19OworCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaW50IGluZGV4ID0gMDsKKyAgICAgICAgaW50IGMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiUDoiLCBvcHRpb25zLCAmaW5kZXgpOworICAgICAgICBpZiAoYyA9PSAtMSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBzd2l0Y2ggKGMpIHsKKyAgICAgICAgICAgIGNhc2UgJ1AnOiB7CisgICAgICAgICAgICAgICAgc2V0UmVzKG9wdGFyZyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG9wdGluZCA8IGFyZ2MpIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsCisgICAgICAgICAgICAgICAgInVucmVjb2duaXplZCBvcHRpb246ICVzXG5cbiIKKyAgICAgICAgICAgICAgICAidXNhZ2U6ICVzIDxndGVzdCBvcHRpb25zPiA8dGVzdCBvcHRpb25zPlxuXG4iCisgICAgICAgICAgICAgICAgInRlc3Qgb3B0aW9ucyBhcmU6XG5cbiIKKyAgICAgICAgICAgICAgICAiLVAsIC0tcGF0aDogUmVzb3VyY2UgZmlsZXMgZGlyZWN0b3J5IGxvY2F0aW9uXG4iLAorICAgICAgICAgICAgICAgIGFyZ3Zbb3B0aW5kID86IDFdLCBhcmd2WzBdKTsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisvKioKKyAqIFdyaXRlcyB0aGUgc3RhdHMgaGVhZGVyIHRvIGEgZmlsZQorICogPHA+CisgKiBccGFyYW0gc3RhdHNGaWxlICAgIGZpbGUgd2hlcmUgdGhlIHN0YXRzIGRhdGEgaXMgdG8gYmUgd3JpdHRlbgorICoqLworYm9vbCBCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQ6OndyaXRlU3RhdHNIZWFkZXIoKSB7CisgICAgY2hhciBzdGF0c0hlYWRlcltdID0KKyAgICAgICAgImN1cnJlbnRUaW1lLCBmaWxlTmFtZSwgb3BlcmF0aW9uLCBjb21wb25lbnROYW1lLCBOREsvU0RLLCBzeW5jL2FzeW5jLCBzZXR1cFRpbWUsICIKKyAgICAgICAgImRlc3Ryb3lUaW1lLCBtaW5pbXVtVGltZSwgbWF4aW11bVRpbWUsIGF2ZXJhZ2VUaW1lLCB0aW1lVG9Qcm9jZXNzMVNlY0NvbnRlbnQsICIKKyAgICAgICAgInRvdGFsQnl0ZXNQcm9jZXNzZWRQZXJTZWMsIHRpbWVUb0ZpcnN0RnJhbWUsIHRvdGFsU2l6ZUluQnl0ZXMsIHRvdGFsVGltZVxuIjsKKyAgICBGSUxFICpmcFN0YXRzID0gZm9wZW4oc3RhdHNGaWxlLmNfc3RyKCksICJ3Iik7CisgICAgaWYoIWZwU3RhdHMpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbnQzMl90IG51bUJ5dGVzID0gZndyaXRlKHN0YXRzSGVhZGVyLCBzaXplb2YoY2hhciksIHNpemVvZihzdGF0c0hlYWRlciksIGZwU3RhdHMpOworICAgIGZjbG9zZShmcFN0YXRzKTsKKyAgICBpZihudW1CeXRlcyAhPSBzaXplb2Yoc3RhdHNIZWFkZXIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKyNlbmRpZiAgLy8gX19CRU5DSE1BUktfVEVTVF9FTlZJUk9OTUVOVF9IX18KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9DMkRlY29kZXJUZXN0LmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9DMkRlY29kZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWRjYmMxCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0MyRGVjb2RlclRlc3QuY3BwCkBAIC0wLDAgKzEsMTg5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkRlY29kZXJUZXN0IgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlICJCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJDMkRlY29kZXIuaCIKKyNpbmNsdWRlICJFeHRyYWN0b3IuaCIKKworc3RhdGljIEJlbmNobWFya1Rlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK2NsYXNzIEMyRGVjb2RlclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHBhaXI8c3RyaW5nLCBzdHJpbmc+PiB7CisgIHB1YmxpYzoKKyAgICBDMkRlY29kZXJUZXN0KCkgOiBtRGVjb2RlcihudWxscHRyKSB7fQorCisgICAgfkMyRGVjb2RlclRlc3QoKSB7CisgICAgICAgIGlmICghbUNvZGVjTGlzdC5lbXB0eSgpKSB7CisgICAgICAgICAgICBtQ29kZWNMaXN0LmNsZWFyKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1EZWNvZGVyKSB7CisgICAgICAgICAgICBkZWxldGUgbURlY29kZXI7CisgICAgICAgICAgICBtRGVjb2RlciA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSBvdmVycmlkZSB7IHNldHVwQzJEZWNvZGVyVGVzdCgpOyB9CisKKyAgICB2b2lkIHNldHVwQzJEZWNvZGVyVGVzdCgpOworCisgICAgdmVjdG9yPHN0cmluZz4gbUNvZGVjTGlzdDsKKyAgICBDMkRlY29kZXIgKm1EZWNvZGVyOworfTsKKwordm9pZCBDMkRlY29kZXJUZXN0OjpzZXR1cEMyRGVjb2RlclRlc3QoKSB7CisgICAgbURlY29kZXIgPSBuZXcgQzJEZWNvZGVyKCk7CisgICAgQVNTRVJUX05FKG1EZWNvZGVyLCBudWxscHRyKSA8PCAiQzJEZWNvZGVyIGNyZWF0aW9uIGZhaWxlZCI7CisKKyAgICBpbnQzMl90IHN0YXR1cyA9IG1EZWNvZGVyLT5zZXR1cENvZGVjMigpOworICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJDb2RlYzIgc2V0dXAgZmFpbGVkIjsKKworICAgIG1Db2RlY0xpc3QgPSBtRGVjb2Rlci0+Z2V0U3VwcG9ydGVkQ29tcG9uZW50TGlzdChmYWxzZSAvKiBpc0VuY29kZXIqLyk7CisgICAgQVNTRVJUX0dUKG1Db2RlY0xpc3Quc2l6ZSgpLCAwKSA8PCAiQ29kZWMyIGNsaWVudCBkaWRuJ3QgcmVjb2duaXNlIGFueSBjb21wb25lbnQiOworfQorCitURVNUX1AoQzJEZWNvZGVyVGVzdCwgQ29kZWMyRGVjb2RlKSB7CisgICAgQUxPR1YoIkRlY29kZSB0aGUgc2FtcGxlcyBnaXZlbiBieSBleHRyYWN0b3IgdXNpbmcgY29kZWMyIik7CisgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgR2V0UGFyYW0oKS5maXJzdDsKKyAgICBGSUxFICppbnB1dEZwID0gZm9wZW4oaW5wdXRGaWxlLmNfc3RyKCksICJyYiIpOworICAgIEFTU0VSVF9ORShpbnB1dEZwLCBudWxscHRyKSA8PCAiVW5hYmxlIHRvIG9wZW4gIiA8PCBpbnB1dEZpbGUgPDwgIiBmaWxlIGZvciByZWFkaW5nIjsKKworICAgIEV4dHJhY3RvciAqZXh0cmFjdG9yID0gbmV3IEV4dHJhY3RvcigpOworICAgIEFTU0VSVF9ORShleHRyYWN0b3IsIG51bGxwdHIpIDw8ICJFeHRyYWN0b3IgY3JlYXRpb24gZmFpbGVkIjsKKworICAgIC8vIFJlYWQgZmlsZSBwcm9wZXJ0aWVzCisgICAgc3RydWN0IHN0YXQgYnVmOworICAgIHN0YXQoaW5wdXRGaWxlLmNfc3RyKCksICZidWYpOworICAgIHNpemVfdCBmaWxlU2l6ZSA9IGJ1Zi5zdF9zaXplOworICAgIGludDMyX3QgZmQgPSBmaWxlbm8oaW5wdXRGcCk7CisKKyAgICBBU1NFUlRfTEUoZmlsZVNpemUsIGtNYXhCdWZmZXJTaXplKQorICAgICAgICAgICAgPDwgIklucHV0IGZpbGUgc2l6ZSBpcyBncmVhdGVyIHRoYW4gdGhlIHRocmVzaG9sZCBtZW1vcnkgZGVkaWNhdGVkIHRvIHRoZSB0ZXN0IjsKKworICAgIGludDMyX3QgdHJhY2tDb3VudCA9IGV4dHJhY3Rvci0+aW5pdEV4dHJhY3RvcihmZCwgZmlsZVNpemUpOworICAgIEFTU0VSVF9HVCh0cmFja0NvdW50LCAwKSA8PCAiaW5pdEV4dHJhY3RvciBmYWlsZWQiOworCisgICAgZm9yIChpbnQzMl90IGN1clRyYWNrID0gMDsgY3VyVHJhY2sgPCB0cmFja0NvdW50OyBjdXJUcmFjaysrKSB7CisgICAgICAgIGludDMyX3Qgc3RhdHVzID0gZXh0cmFjdG9yLT5zZXR1cFRyYWNrRm9ybWF0KGN1clRyYWNrKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlRyYWNrIEZvcm1hdCBpbnZhbGlkIjsKKworICAgICAgICB1aW50OF90ICppbnB1dEJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKGZpbGVTaXplKTsKKyAgICAgICAgQVNTRVJUX05FKGlucHV0QnVmZmVyLCBudWxscHRyKSA8PCAiSW5zdWZmaWNpZW50IG1lbW9yeSI7CisKKyAgICAgICAgdmVjdG9yPEFNZWRpYUNvZGVjQnVmZmVySW5mbz4gZnJhbWVJbmZvOworICAgICAgICBBTWVkaWFDb2RlY0J1ZmZlckluZm8gaW5mbzsKKyAgICAgICAgdWludDMyX3QgaW5wdXRCdWZmZXJPZmZzZXQgPSAwOworICAgICAgICBpbnQzMl90IGlkeCA9IDA7CisKKyAgICAgICAgLy8gR2V0IENTRCBkYXRhCisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICB2b2lkICpjc2RCdWZmZXIgPSBleHRyYWN0b3ItPmdldENTRFNhbXBsZShpbmZvLCBpZHgpOworICAgICAgICAgICAgaWYgKCFjc2RCdWZmZXIgfHwgIWluZm8uc2l6ZSkgYnJlYWs7CisgICAgICAgICAgICAvLyBjb3B5IHRoZSBtZXRhIGRhdGEgYW5kIGJ1ZmZlciB0byBiZSBwYXNzZWQgdG8gZGVjb2RlcgorICAgICAgICAgICAgQVNTRVJUX0xFKGlucHV0QnVmZmVyT2Zmc2V0ICsgaW5mby5zaXplLCBmaWxlU2l6ZSkgPDwgIk1lbW9yeSBhbGxvY2F0ZWQgbm90IHN1ZmZpY2llbnQiOworCisgICAgICAgICAgICBtZW1jcHkoaW5wdXRCdWZmZXIgKyBpbnB1dEJ1ZmZlck9mZnNldCwgY3NkQnVmZmVyLCBpbmZvLnNpemUpOworICAgICAgICAgICAgZnJhbWVJbmZvLnB1c2hfYmFjayhpbmZvKTsKKyAgICAgICAgICAgIGlucHV0QnVmZmVyT2Zmc2V0ICs9IGluZm8uc2l6ZTsKKyAgICAgICAgICAgIGlkeCsrOworICAgICAgICB9CisKKyAgICAgICAgLy8gR2V0IGZyYW1lIGRhdGEKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGV4dHJhY3Rvci0+Z2V0RnJhbWVTYW1wbGUoaW5mbyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzIHx8ICFpbmZvLnNpemUpIGJyZWFrOworICAgICAgICAgICAgLy8gY29weSB0aGUgbWV0YSBkYXRhIGFuZCBidWZmZXIgdG8gYmUgcGFzc2VkIHRvIGRlY29kZXIKKyAgICAgICAgICAgIEFTU0VSVF9MRShpbnB1dEJ1ZmZlck9mZnNldCArIGluZm8uc2l6ZSwgZmlsZVNpemUpIDw8ICJNZW1vcnkgYWxsb2NhdGVkIG5vdCBzdWZmaWNpZW50IjsKKworICAgICAgICAgICAgbWVtY3B5KGlucHV0QnVmZmVyICsgaW5wdXRCdWZmZXJPZmZzZXQsIGV4dHJhY3Rvci0+Z2V0RnJhbWVCdWYoKSwgaW5mby5zaXplKTsKKyAgICAgICAgICAgIGZyYW1lSW5mby5wdXNoX2JhY2soaW5mbyk7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlck9mZnNldCArPSBpbmZvLnNpemU7CisgICAgICAgIH0KKworICAgICAgICBBTWVkaWFGb3JtYXQgKmZvcm1hdCA9IGV4dHJhY3Rvci0+Z2V0Rm9ybWF0KCk7CisgICAgICAgIC8vIERlY29kZSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtIGZvciBhbGwgQzIgY29kZWNzIHN1cHBvcnRlZCBieSBkZXZpY2UKKyAgICAgICAgZm9yIChzdHJpbmcgY29kZWNOYW1lIDogbUNvZGVjTGlzdCkgeworICAgICAgICAgICAgaWYgKGNvZGVjTmFtZS5maW5kKEdldFBhcmFtKCkuc2Vjb25kKSAhPSBzdHJpbmc6Om5wb3MgJiYKKyAgICAgICAgICAgICAgICBjb2RlY05hbWUuZmluZCgic2VjdXJlIikgPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gbURlY29kZXItPmNyZWF0ZUNvZGVjMkNvbXBvbmVudChjb2RlY05hbWUsIGZvcm1hdCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkNyZWF0ZSBjb21wb25lbnQgZmFpbGVkIGZvciAiIDw8IGNvZGVjTmFtZTsKKworICAgICAgICAgICAgICAgIC8vIFNlbmQgdGhlIGlucHV0cyB0byBDMiBEZWNvZGVyIGFuZCB3YWl0IHRpbGwgYWxsIGJ1ZmZlcnMgYXJlIHJldHVybmVkLgorICAgICAgICAgICAgICAgIHN0YXR1cyA9IG1EZWNvZGVyLT5kZWNvZGVGcmFtZXMoaW5wdXRCdWZmZXIsIGZyYW1lSW5mbyk7CisgICAgICAgICAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkRlY29kZXIgZmFpbGVkIGZvciAiIDw8IGNvZGVjTmFtZTsKKworICAgICAgICAgICAgICAgIG1EZWNvZGVyLT53YWl0T25JbnB1dENvbnN1bXB0aW9uKCk7CisgICAgICAgICAgICAgICAgQVNTRVJUX1RSVUUobURlY29kZXItPm1Fb3MpIDw8ICJUZXN0IEZhaWxlZC4gRGlkbid0IHJlY2VpdmUgRU9TIFxuIjsKKworICAgICAgICAgICAgICAgIG1EZWNvZGVyLT5kZUluaXRDb2RlYygpOworICAgICAgICAgICAgICAgIGludDY0X3QgZHVyYXRpb25VcyA9IGV4dHJhY3Rvci0+Z2V0Q2xpcER1cmF0aW9uKCk7CisgICAgICAgICAgICAgICAgQUxPR1YoImNvZGVjIDogJXMiLCBjb2RlY05hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgbURlY29kZXItPmR1bXBTdGF0aXN0aWNzKEdldFBhcmFtKCkuZmlyc3QsIGR1cmF0aW9uVXMsIGNvZGVjTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ0Vudi0+Z2V0U3RhdHNGaWxlKCkpOworICAgICAgICAgICAgICAgIG1EZWNvZGVyLT5yZXNldERlY29kZXIoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBmcmVlKGlucHV0QnVmZmVyKTsKKyAgICAgICAgZmNsb3NlKGlucHV0RnApOworICAgICAgICBleHRyYWN0b3ItPmRlSW5pdEV4dHJhY3RvcigpOworICAgICAgICBkZWxldGUgZXh0cmFjdG9yOworICAgICAgICBkZWxldGUgbURlY29kZXI7CisgICAgICAgIG1EZWNvZGVyID0gbnVsbHB0cjsKKyAgICB9Cit9CisKKy8vIFRPRE86IChiLzE0MDU0OTU5NikKKy8vIEFkZCB3YXYgZmlsZXMKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgQXVkaW9EZWNvZGVyVGVzdCwgQzJEZWNvZGVyVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19hYWNfMzBzZWMubXA0IiwgImFhYyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX21wM18zMHNlYy5tcDMiLCAibXAzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzgwMDBoel8xY2hfOGticHNfYW1ybmJfMzBzZWMuM2dwIiwgImFtcm5iIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzE2MDAwaHpfMWNoXzlrYnBzX2FtcndiXzMwc2VjLjNncCIsICJhbXJuYiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF84MGticHNfdm9yYmlzXzMwc2VjLndlYm0iLCAidm9yYmlzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzYwMGticHNfZmxhY18zMHNlYy5tcDQiLCAiZmxhYyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80ODAwMGh6XzJjaF8xMDBrYnBzX29wdXNfMzBzZWMud2VibSIsICJvcHVzIikpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBWaWRlb0RlY29kZXJUZXN0LCBDMkRlY29kZXJUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc192cDkud2VibSIsICJ2cDkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfdnA4LndlYm0iLCAidnA4IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2F2MS53ZWJtIiwgImF2MSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImNyb3dkXzE5MjB4MTA4MF8yNWZwc183MzAwa2Jwc19tcGVnMi5tcDQiLCAibXBlZzIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNjAwMGticHNfbXBlZzQubXA0IiwgIm1wZWc0IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiY3Jvd2RfMzUyeDI4OF8yNWZwc182MDAwa2Jwc19oMjYzLjNncCIsICJoMjYzIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzY3MDBrYnBzX2gyNjQudHMiLCAiYXZjIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2gyNjUubWt2IiwgImhldmMiKSkpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpIHsKKyAgICBnRW52ID0gbmV3IEJlbmNobWFya1Rlc3RFbnZpcm9ubWVudCgpOworICAgIDo6dGVzdGluZzo6QWRkR2xvYmFsVGVzdEVudmlyb25tZW50KGdFbnYpOworICAgIDo6dGVzdGluZzo6SW5pdEdvb2dsZVRlc3QoJmFyZ2MsIGFyZ3YpOworICAgIGludCBzdGF0dXMgPSBnRW52LT5pbml0RnJvbU9wdGlvbnMoYXJnYywgYXJndik7CisgICAgaWYgKHN0YXR1cyA9PSAwKSB7CisgICAgICAgIGdFbnYtPnNldFN0YXRzRmlsZSgiQzJEZWNvZGVyLmNzdiIpOworICAgICAgICBzdGF0dXMgPSBnRW52LT53cml0ZVN0YXRzSGVhZGVyKCk7CisgICAgICAgIEFMT0dWKCJTdGF0cyBmaWxlID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR1YoIkMyIERlY29kZXIgVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KZGlmZiAtLWdpdCBhL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9DMkVuY29kZXJUZXN0LmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9DMkVuY29kZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMThkODU2Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0MyRW5jb2RlclRlc3QuY3BwCkBAIC0wLDAgKzEsMTkxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJDMkVuY29kZXJUZXN0IgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlICJCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJDMkVuY29kZXIuaCIKKyNpbmNsdWRlICJEZWNvZGVyLmgiCisKK3N0YXRpYyBCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCitjbGFzcyBDMkVuY29kZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxwYWlyPHN0cmluZywgc3RyaW5nPj4geworICBwdWJsaWM6CisgICAgQzJFbmNvZGVyVGVzdCgpIDogbUVuY29kZXIobnVsbHB0cikge30KKworICAgIH5DMkVuY29kZXJUZXN0KCkgeworICAgICAgICBpZiAoIW1Db2RlY0xpc3QuZW1wdHkoKSkgeworICAgICAgICAgICAgbUNvZGVjTGlzdC5jbGVhcigpOworICAgICAgICB9CisgICAgICAgIGlmIChtRW5jb2RlcikgeworICAgICAgICAgICAgZGVsZXRlIG1FbmNvZGVyOworICAgICAgICAgICAgbUVuY29kZXIgPSBudWxscHRyOworICAgICAgICB9CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIFNldFVwKCkgb3ZlcnJpZGUgeyBzZXR1cEMyRW5jb2RlclRlc3QoKTsgfQorCisgICAgdm9pZCBzZXR1cEMyRW5jb2RlclRlc3QoKTsKKworICAgIHZlY3RvcjxzdHJpbmc+IG1Db2RlY0xpc3Q7CisgICAgQzJFbmNvZGVyICptRW5jb2RlcjsKK307CisKK3ZvaWQgQzJFbmNvZGVyVGVzdDo6c2V0dXBDMkVuY29kZXJUZXN0KCkgeworICAgIG1FbmNvZGVyID0gbmV3IEMyRW5jb2RlcigpOworICAgIEFTU0VSVF9ORShtRW5jb2RlciwgbnVsbHB0cikgPDwgIkMyRW5jb2RlciBjcmVhdGlvbiBmYWlsZWQiOworCisgICAgaW50MzJfdCBzdGF0dXMgPSBtRW5jb2Rlci0+c2V0dXBDb2RlYzIoKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiQ29kZWMyIHNldHVwIGZhaWxlZCI7CisKKyAgICBtQ29kZWNMaXN0ID0gbUVuY29kZXItPmdldFN1cHBvcnRlZENvbXBvbmVudExpc3QodHJ1ZSAvKiBpc0VuY29kZXIqLyk7CisgICAgQVNTRVJUX0dUKG1Db2RlY0xpc3Quc2l6ZSgpLCAwKSA8PCAiQ29kZWMyIGNsaWVudCBkaWRuJ3QgcmVjb2duaXNlIGFueSBjb21wb25lbnQiOworfQorCitURVNUX1AoQzJFbmNvZGVyVGVzdCwgQ29kZWMyRW5jb2RlKSB7CisgICAgQUxPR1YoIkVuY29kZXMgdGhlIGlucHV0IHVzaW5nIGNvZGVjMiBmcmFtZXdvcmsiKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpLmZpcnN0OworICAgIEZJTEUgKmlucHV0RnAgPSBmb3BlbihpbnB1dEZpbGUuY19zdHIoKSwgInJiIik7CisgICAgQVNTRVJUX05FKGlucHV0RnAsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gb3BlbiBpbnB1dCBmaWxlIGZvciByZWFkaW5nIjsKKworICAgIERlY29kZXIgKmRlY29kZXIgPSBuZXcgRGVjb2RlcigpOworICAgIEFTU0VSVF9ORShkZWNvZGVyLCBudWxscHRyKSA8PCAiRGVjb2RlciBjcmVhdGlvbiBmYWlsZWQiOworCisgICAgRXh0cmFjdG9yICpleHRyYWN0b3IgPSBkZWNvZGVyLT5nZXRFeHRyYWN0b3IoKTsKKyAgICBBU1NFUlRfTkUoZXh0cmFjdG9yLCBudWxscHRyKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCI7CisKKyAgICAvLyBSZWFkIGZpbGUgcHJvcGVydGllcworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICBzdGF0KGlucHV0RmlsZS5jX3N0cigpLCAmYnVmKTsKKyAgICBzaXplX3QgZmlsZVNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgICBpbnQzMl90IGZkID0gZmlsZW5vKGlucHV0RnApOworCisgICAgQVNTRVJUX0xFKGZpbGVTaXplLCBrTWF4QnVmZmVyU2l6ZSkKKyAgICAgICAgICAgIDw8ICJJbnB1dCBmaWxlIHNpemUgaXMgZ3JlYXRlciB0aGFuIHRoZSB0aHJlc2hvbGQgbWVtb3J5IGRlZGljYXRlZCB0byB0aGUgdGVzdCI7CisKKyAgICBpbnQzMl90IHRyYWNrQ291bnQgPSBleHRyYWN0b3ItPmluaXRFeHRyYWN0b3IoZmQsIGZpbGVTaXplKTsKKyAgICBBU1NFUlRfR1QodHJhY2tDb3VudCwgMCkgPDwgImluaXRFeHRyYWN0b3IgZmFpbGVkIjsKKworICAgIGZvciAoaW50IGN1clRyYWNrID0gMDsgY3VyVHJhY2sgPCB0cmFja0NvdW50OyBjdXJUcmFjaysrKSB7CisgICAgICAgIGludDMyX3Qgc3RhdHVzID0gZXh0cmFjdG9yLT5zZXR1cFRyYWNrRm9ybWF0KGN1clRyYWNrKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIlRyYWNrIEZvcm1hdCBpbnZhbGlkIjsKKworICAgICAgICB1aW50OF90ICppbnB1dEJ1ZmZlciA9ICh1aW50OF90ICopbWFsbG9jKGZpbGVTaXplKTsKKyAgICAgICAgQVNTRVJUX05FKGlucHV0QnVmZmVyLCBudWxscHRyKSA8PCAiSW5zdWZmaWNpZW50IG1lbW9yeSI7CisKKyAgICAgICAgdmVjdG9yPEFNZWRpYUNvZGVjQnVmZmVySW5mbz4gZnJhbWVJbmZvOworICAgICAgICBBTWVkaWFDb2RlY0J1ZmZlckluZm8gaW5mbzsKKyAgICAgICAgdWludDMyX3QgaW5wdXRCdWZmZXJPZmZzZXQgPSAwOworCisgICAgICAgIC8vIEdldCBmcmFtZSBkYXRhCisgICAgICAgIHdoaWxlICgxKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBleHRyYWN0b3ItPmdldEZyYW1lU2FtcGxlKGluZm8pOworICAgICAgICAgICAgaWYgKHN0YXR1cyB8fCAhaW5mby5zaXplKSBicmVhazsKKyAgICAgICAgICAgIC8vIGNvcHkgdGhlIG1ldGEgZGF0YSBhbmQgYnVmZmVyIHRvIGJlIHBhc3NlZCB0byBkZWNvZGVyCisgICAgICAgICAgICBBU1NFUlRfTEUoaW5wdXRCdWZmZXJPZmZzZXQgKyBpbmZvLnNpemUsIGZpbGVTaXplKSA8PCAiTWVtb3J5IGFsbG9jYXRlZCBub3Qgc3VmZmljaWVudCI7CisKKyAgICAgICAgICAgIG1lbWNweShpbnB1dEJ1ZmZlciArIGlucHV0QnVmZmVyT2Zmc2V0LCBleHRyYWN0b3ItPmdldEZyYW1lQnVmKCksIGluZm8uc2l6ZSk7CisgICAgICAgICAgICBmcmFtZUluZm8ucHVzaF9iYWNrKGluZm8pOworICAgICAgICAgICAgaW5wdXRCdWZmZXJPZmZzZXQgKz0gaW5mby5zaXplOworICAgICAgICB9CisKKyAgICAgICAgc3RyaW5nIGRlY05hbWUgPSAiIjsKKyAgICAgICAgc3RyaW5nIG91dHB1dEZpbGVOYW1lID0gIi9kYXRhL2xvY2FsL3RtcC9kZWNvZGUub3V0IjsKKyAgICAgICAgRklMRSAqb3V0RnAgPSBmb3BlbihvdXRwdXRGaWxlTmFtZS5jX3N0cigpLCAid2IiKTsKKyAgICAgICAgQVNTRVJUX05FKG91dEZwLCBudWxscHRyKSA8PCAiVW5hYmxlIHRvIG9wZW4gb3V0cHV0IGZpbGUiIDw8IG91dHB1dEZpbGVOYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiBmb3IgZHVtcGluZyBkZWNvZGVyJ3Mgb3V0cHV0IjsKKworICAgICAgICBkZWNvZGVyLT5zZXR1cERlY29kZXIoKTsKKyAgICAgICAgc3RhdHVzID0gZGVjb2Rlci0+ZGVjb2RlKGlucHV0QnVmZmVyLCBmcmFtZUluZm8sIGRlY05hbWUsIGZhbHNlIC8qYXN5bmNNb2RlICovLCBvdXRGcCk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIEFNRURJQV9PSykgPDwgIkRlY29kZSByZXR1cm5lZCBlcnJvciA6ICIgPDwgc3RhdHVzOworCisgICAgICAgIC8vIEVuY29kZSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtIGZvciBhbGwgQzIgY29kZWNzIHN1cHBvcnRlZCBieSBkZXZpY2UKKyAgICAgICAgQU1lZGlhRm9ybWF0ICpmb3JtYXQgPSBleHRyYWN0b3ItPmdldEZvcm1hdCgpOworICAgICAgICBpZnN0cmVhbSBlbGVTdHJlYW07CisgICAgICAgIGVsZVN0cmVhbS5vcGVuKG91dHB1dEZpbGVOYW1lLmNfc3RyKCksIGlmc3RyZWFtOjpiaW5hcnkgfCBpZnN0cmVhbTo6YXRlKTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpIDw8IG91dHB1dEZpbGVOYW1lLmNfc3RyKCkgPDwgIiAtIGZpbGUgbm90IGZvdW5kIjsKKyAgICAgICAgc2l6ZV90IGVsZVNpemUgPSBlbGVTdHJlYW0udGVsbGcoKTsKKworICAgICAgICBmb3IgKHN0cmluZyBjb2RlY05hbWUgOiBtQ29kZWNMaXN0KSB7CisgICAgICAgICAgICBpZiAoY29kZWNOYW1lLmZpbmQoR2V0UGFyYW0oKS5zZWNvbmQpICE9IHN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgICAgIHN0YXR1cyA9IG1FbmNvZGVyLT5jcmVhdGVDb2RlYzJDb21wb25lbnQoY29kZWNOYW1lLCBmb3JtYXQpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJDcmVhdGUgY29tcG9uZW50IGZhaWxlZCBmb3IgIiA8PCBjb2RlY05hbWU7CisKKyAgICAgICAgICAgICAgICAvLyBTZW5kIHRoZSBpbnB1dHMgdG8gQzIgRW5jb2RlciBhbmQgd2FpdCB0aWxsIGFsbCBidWZmZXJzIGFyZSByZXR1cm5lZC4KKyAgICAgICAgICAgICAgICBlbGVTdHJlYW0uc2Vla2coMCwgaWZzdHJlYW06OmJlZyk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gbUVuY29kZXItPmVuY29kZUZyYW1lcyhlbGVTdHJlYW0sIGVsZVNpemUpOworICAgICAgICAgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJFbmNvZGVyIGZhaWxlZCBmb3IgIiA8PCBjb2RlY05hbWU7CisKKyAgICAgICAgICAgICAgICBtRW5jb2Rlci0+d2FpdE9uSW5wdXRDb25zdW1wdGlvbigpOworICAgICAgICAgICAgICAgIEFTU0VSVF9UUlVFKG1FbmNvZGVyLT5tRW9zKSA8PCAiVGVzdCBGYWlsZWQuIERpZG4ndCByZWNlaXZlIEVPUyBcbiI7CisKKyAgICAgICAgICAgICAgICBtRW5jb2Rlci0+ZGVJbml0Q29kZWMoKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGR1cmF0aW9uVXMgPSBleHRyYWN0b3ItPmdldENsaXBEdXJhdGlvbigpOworICAgICAgICAgICAgICAgIEFMT0dWKCJjb2RlYyA6ICVzIiwgY29kZWNOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIG1FbmNvZGVyLT5kdW1wU3RhdGlzdGljcyhHZXRQYXJhbSgpLmZpcnN0LCBkdXJhdGlvblVzLCBjb2RlY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdFbnYtPmdldFN0YXRzRmlsZSgpKTsKKyAgICAgICAgICAgICAgICBtRW5jb2Rlci0+cmVzZXRFbmNvZGVyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBEZXN0cm95IHRoZSBkZWNvZGVyIGZvciB0aGUgZ2l2ZW4gaW5wdXQKKyAgICAgICAgZGVjb2Rlci0+ZGVJbml0Q29kZWMoKTsKKyAgICAgICAgZGVjb2Rlci0+cmVzZXREZWNvZGVyKCk7CisgICAgICAgIGZyZWUoaW5wdXRCdWZmZXIpOworICAgIH0KKyAgICBmY2xvc2UoaW5wdXRGcCk7CisgICAgZXh0cmFjdG9yLT5kZUluaXRFeHRyYWN0b3IoKTsKKyAgICBkZWxldGUgZGVjb2RlcjsKKyAgICBkZWxldGUgbUVuY29kZXI7CisgICAgbUVuY29kZXIgPSBudWxscHRyOworfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIEF1ZGlvRW5jb2RlclRlc3QsIEMyRW5jb2RlclRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfYWFjXzMwc2VjLm1wNCIsICJhYWMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfODAwMGh6XzFjaF84a2Jwc19hbXJuYl8zMHNlYy4zZ3AiLCAiYW1ybmIiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMTYwMDBoel8xY2hfOWticHNfYW1yd2JfMzBzZWMuM2dwIiwgImFtcndiIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzYwMGticHNfZmxhY18zMHNlYy5tcDQiLCAiZmxhYyIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80ODAwMGh6XzJjaF8xMDBrYnBzX29wdXNfMzBzZWMud2VibSIsICJvcHVzIikpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBWaWRlb0VuY29kZXJUZXN0LCBDMkVuY29kZXJUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc192cDkud2VibSIsICJ2cDkiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfdnA4LndlYm0iLCAidnA4IiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiY3Jvd2RfMTc2eDE0NF8yNWZwc182MDAwa2Jwc19tcGVnNC5tcDQiLCAibXBlZzQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJjcm93ZF8xNzZ4MTQ0XzI1ZnBzXzYwMDBrYnBzX2gyNjMuM2dwIiwgImgyNjMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNjcwMGticHNfaDI2NC50cyIsICJhdmMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfaDI2NS5ta3YiLCAiaGV2YyIpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGdFbnYgPSBuZXcgQmVuY2htYXJrVGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgZ0Vudi0+c2V0U3RhdHNGaWxlKCJDMkVuY29kZXIuY3N2Iik7CisgICAgICAgIHN0YXR1cyA9IGdFbnYtPndyaXRlU3RhdHNIZWFkZXIoKTsKKyAgICAgICAgQUxPR1YoIlN0YXRzIGZpbGUgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HVigiQzIgRW5jb2RlciBUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0RlY29kZXJUZXN0LmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9EZWNvZGVyVGVzdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFlZjAyYQotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9EZWNvZGVyVGVzdC5jcHAKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgImRlY29kZXJUZXN0IgorCisjaW5jbHVkZSA8ZnN0cmVhbT4KKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlICJCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJEZWNvZGVyLmgiCisKK3N0YXRpYyBCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQgKmdFbnYgPSBudWxscHRyOworCitjbGFzcyBEZWNvZGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08dHVwbGU8c3RyaW5nLCBzdHJpbmcsIGJvb2w+PiB7fTsKKworVEVTVF9QKERlY29kZXJUZXN0LCBEZWNvZGUpIHsKKyAgICBBTE9HVigiRGVjb2RlIHRoZSBzYW1wbGVzIGdpdmVuIGJ5IGV4dHJhY3RvciIpOworICAgIHR1cGxlPHN0cmluZyAvKiBJbnB1dEZpbGUgKi8sIHN0cmluZyAvKiBDb2RlY05hbWUgKi8sIGJvb2wgLyogYXN5bmNNb2RlICovPiBwYXJhbXMgPSBHZXRQYXJhbSgpOworCisgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDA+KHBhcmFtcyk7CisgICAgRklMRSAqaW5wdXRGcCA9IGZvcGVuKGlucHV0RmlsZS5jX3N0cigpLCAicmIiKTsKKyAgICBBU1NFUlRfTkUoaW5wdXRGcCwgbnVsbHB0cikgPDwgIlVuYWJsZSB0byBvcGVuICIgPDwgaW5wdXRGaWxlIDw8ICIgZmlsZSBmb3IgcmVhZGluZyI7CisKKyAgICBEZWNvZGVyICpkZWNvZGVyID0gbmV3IERlY29kZXIoKTsKKyAgICBBU1NFUlRfTkUoZGVjb2RlciwgbnVsbHB0cikgPDwgIkRlY29kZXIgY3JlYXRpb24gZmFpbGVkIjsKKworICAgIEV4dHJhY3RvciAqZXh0cmFjdG9yID0gZGVjb2Rlci0+Z2V0RXh0cmFjdG9yKCk7CisgICAgQVNTRVJUX05FKGV4dHJhY3RvciwgbnVsbHB0cikgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQiOworCisgICAgLy8gUmVhZCBmaWxlIHByb3BlcnRpZXMKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgc3RhdChpbnB1dEZpbGUuY19zdHIoKSwgJmJ1Zik7CisgICAgc2l6ZV90IGZpbGVTaXplID0gYnVmLnN0X3NpemU7CisgICAgaW50MzJfdCBmZCA9IGZpbGVubyhpbnB1dEZwKTsKKworICAgIGludDMyX3QgdHJhY2tDb3VudCA9IGV4dHJhY3Rvci0+aW5pdEV4dHJhY3RvcihmZCwgZmlsZVNpemUpOworICAgIEFTU0VSVF9HVCh0cmFja0NvdW50LCAwKSA8PCAiaW5pdEV4dHJhY3RvciBmYWlsZWQiOworCisgICAgZm9yIChpbnQgY3VyVHJhY2sgPSAwOyBjdXJUcmFjayA8IHRyYWNrQ291bnQ7IGN1clRyYWNrKyspIHsKKyAgICAgICAgaW50MzJfdCBzdGF0dXMgPSBleHRyYWN0b3ItPnNldHVwVHJhY2tGb3JtYXQoY3VyVHJhY2spOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCAwKSA8PCAiVHJhY2sgRm9ybWF0IGludmFsaWQiOworCisgICAgICAgIHVpbnQ4X3QgKmlucHV0QnVmZmVyID0gKHVpbnQ4X3QgKiltYWxsb2Moa01heEJ1ZmZlclNpemUpOworICAgICAgICBBU1NFUlRfTkUoaW5wdXRCdWZmZXIsIG51bGxwdHIpIDw8ICJJbnN1ZmZpY2llbnQgbWVtb3J5IjsKKworICAgICAgICB2ZWN0b3I8QU1lZGlhQ29kZWNCdWZmZXJJbmZvPiBmcmFtZUluZm87CisgICAgICAgIEFNZWRpYUNvZGVjQnVmZmVySW5mbyBpbmZvOworICAgICAgICB1aW50MzJfdCBpbnB1dEJ1ZmZlck9mZnNldCA9IDA7CisKKyAgICAgICAgLy8gR2V0IGZyYW1lIGRhdGEKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGV4dHJhY3Rvci0+Z2V0RnJhbWVTYW1wbGUoaW5mbyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzIHx8ICFpbmZvLnNpemUpIGJyZWFrOworICAgICAgICAgICAgLy8gY29weSB0aGUgbWV0YSBkYXRhIGFuZCBidWZmZXIgdG8gYmUgcGFzc2VkIHRvIGRlY29kZXIKKyAgICAgICAgICAgIEFTU0VSVF9MRShpbnB1dEJ1ZmZlck9mZnNldCArIGluZm8uc2l6ZSwga01heEJ1ZmZlclNpemUpCisgICAgICAgICAgICAgICAgICAgIDw8ICJNZW1vcnkgYWxsb2NhdGVkIG5vdCBzdWZmaWNpZW50IjsKKworICAgICAgICAgICAgbWVtY3B5KGlucHV0QnVmZmVyICsgaW5wdXRCdWZmZXJPZmZzZXQsIGV4dHJhY3Rvci0+Z2V0RnJhbWVCdWYoKSwgaW5mby5zaXplKTsKKyAgICAgICAgICAgIGZyYW1lSW5mby5wdXNoX2JhY2soaW5mbyk7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlck9mZnNldCArPSBpbmZvLnNpemU7CisgICAgICAgIH0KKworICAgICAgICBzdHJpbmcgY29kZWNOYW1lID0gZ2V0PDE+KHBhcmFtcyk7CisgICAgICAgIGJvb2wgYXN5bmNNb2RlID0gZ2V0PDI+KHBhcmFtcyk7CisgICAgICAgIGRlY29kZXItPnNldHVwRGVjb2RlcigpOworICAgICAgICBzdGF0dXMgPSBkZWNvZGVyLT5kZWNvZGUoaW5wdXRCdWZmZXIsIGZyYW1lSW5mbywgY29kZWNOYW1lLCBhc3luY01vZGUpOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBBTUVESUFfT0spIDw8ICJEZWNvZGVyIGZhaWxlZCBmb3IgIiA8PCBjb2RlY05hbWU7CisKKyAgICAgICAgZGVjb2Rlci0+ZGVJbml0Q29kZWMoKTsKKyAgICAgICAgQUxPR1YoImNvZGVjIDogJXMiLCBjb2RlY05hbWUuY19zdHIoKSk7CisgICAgICAgIHN0cmluZyBpbnB1dFJlZmVyZW5jZSA9IGdldDwwPihwYXJhbXMpOworICAgICAgICBkZWNvZGVyLT5kdW1wU3RhdGlzdGljcyhpbnB1dFJlZmVyZW5jZSwgY29kZWNOYW1lLCAoYXN5bmNNb2RlID8gImFzeW5jIiA6ICJzeW5jIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdFbnYtPmdldFN0YXRzRmlsZSgpKTsKKyAgICAgICAgZnJlZShpbnB1dEJ1ZmZlcik7CisgICAgICAgIGRlY29kZXItPnJlc2V0RGVjb2RlcigpOworICAgIH0KKyAgICBmY2xvc2UoaW5wdXRGcCk7CisgICAgZXh0cmFjdG9yLT5kZUluaXRFeHRyYWN0b3IoKTsKKyAgICBkZWxldGUgZGVjb2RlcjsKK30KKworLy8gVE9ETzogKGIvMTQwNTQ5NTk2KQorLy8gQWRkIHdhdiBmaWxlcworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBBdWRpb0RlY29kZXJTeW5jVGVzdCwgRGVjb2RlclRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX2FhY18zMHNlYy5tcDQiLCAiIiwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWMubXAzIiwgIiIsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYmJiXzgwMDBoel8xY2hfOGticHNfYW1ybmJfMzBzZWMuM2dwIiwgIiIsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYmJiXzE2MDAwaHpfMWNoXzlrYnBzX2FtcndiXzMwc2VjLjNncCIsICIiLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImJiYl80NDEwMGh6XzJjaF84MGticHNfdm9yYmlzXzMwc2VjLndlYm0iLCAiIiwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfNDQxMDBoel8yY2hfNjAwa2Jwc19mbGFjXzMwc2VjLm1wNCIsICIiLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImJiYl80ODAwMGh6XzJjaF8xMDBrYnBzX29wdXNfMzBzZWMud2VibSIsICIiLCBmYWxzZSkpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBBdWRpb0RlY29kZXJBc3luY1Rlc3QsIERlY29kZXJUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3R1cGxlKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19hYWNfMzBzZWMubXA0IiwgIiIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19tcDNfMzBzZWMubXAzIiwgIiIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfODAwMGh6XzFjaF84a2Jwc19hbXJuYl8zMHNlYy4zZ3AiLCAiIiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImJiYl8xNjAwMGh6XzFjaF85a2Jwc19hbXJ3Yl8zMHNlYy4zZ3AiLCAiIiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImJiYl80NDEwMGh6XzJjaF84MGticHNfdm9yYmlzXzMwc2VjLndlYm0iLCAiIiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImJiYl80NDEwMGh6XzJjaF82MDBrYnBzX2ZsYWNfMzBzZWMubXA0IiwgIiIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJiYmJfNDgwMDBoel8yY2hfMTAwa2Jwc19vcHVzXzMwc2VjLndlYm0iLCAiIiwgdHJ1ZSkpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFZpZGVEZWNvZGVyU3luY1Rlc3QsIERlY29kZXJUZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGFyZHdhcmUgY29kZWNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfdnA5LndlYm0iLCAiIiwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX3ZwOC53ZWJtIiwgIiIsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc19hdjEud2VibSIsICIiLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNzMwMGticHNfbXBlZzIubXA0IiwgIiIsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MF8yNWZwc182MDAwa2Jwc19tcGVnNC5tcDQiLCAiIiwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMzUyeDI4OF8yNWZwc182MDAwa2Jwc19oMjYzLjNncCIsICIiLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNjcwMGticHNfaDI2NC50cyIsICIiLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfaDI2NS5ta3YiLCAiIiwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU29mdHdhcmUgY29kZWNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfdnA5LndlYm0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYzIuYW5kcm9pZC52cDkuZGVjb2RlciIsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc192cDgud2VibSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjMi5hbmRyb2lkLnZwOC5kZWNvZGVyIiwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2F2MS53ZWJtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImMyLmFuZHJvaWQuYXYxLmRlY29kZXIiLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNzMwMGticHNfbXBlZzIubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImMyLmFuZHJvaWQubXBlZzIuZGVjb2RlciIsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MF8yNWZwc182MDAwa2Jwc19tcGVnNC5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYzIuYW5kcm9pZC5tcGVnNC5kZWNvZGVyIiwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMzUyeDI4OF8yNWZwc182MDAwa2Jwc19oMjYzLjNncCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjMi5hbmRyb2lkLmgyNjMuZGVjb2RlciIsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MF8yNWZwc182NzAwa2Jwc19oMjY0LnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfaDI2NS5ta3YiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYzIuYW5kcm9pZC5oZXZjLmRlY29kZXIiLCBmYWxzZSkpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFZpZGVvRGVjb2RlckFzeW5jVGVzdCwgRGVjb2RlclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYXJkd2FyZSBjb2RlY3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc192cDkud2VibSIsICIiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc192cDgud2VibSIsICIiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc19hdjEud2VibSIsICIiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MF8yNWZwc183MzAwa2Jwc19tcGVnMi5tcDQiLCAiIiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNjAwMGticHNfbXBlZzQubXA0IiwgIiIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMzUyeDI4OF8yNWZwc182MDAwa2Jwc19oMjYzLjNncCIsICIiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MF8yNWZwc182NzAwa2Jwc19oMjY0LnRzIiwgIiIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2gyNjUubWt2IiwgIiIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU29mdHdhcmUgY29kZWNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfdnA5LndlYm0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYzIuYW5kcm9pZC52cDkuZGVjb2RlciIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX3ZwOC53ZWJtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImMyLmFuZHJvaWQudnA4LmRlY29kZXIiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc19hdjEud2VibSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjMi5hbmRyb2lkLmF2MS5kZWNvZGVyIiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNzMwMGticHNfbXBlZzIubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImMyLmFuZHJvaWQubXBlZzIuZGVjb2RlciIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzYwMDBrYnBzX21wZWc0Lm1wNCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjMi5hbmRyb2lkLm1wZWc0LmRlY29kZXIiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzM1MngyODhfMjVmcHNfNjAwMGticHNfaDI2My4zZ3AiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYzIuYW5kcm9pZC5oMjYzLmRlY29kZXIiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MF8yNWZwc182NzAwa2Jwc19oMjY0LnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImMyLmFuZHJvaWQuYXZjLmRlY29kZXIiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc19oMjY1Lm1rdiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjMi5hbmRyb2lkLmhldmMuZGVjb2RlciIsIHRydWUpKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGdFbnYgPSBuZXcgQmVuY2htYXJrVGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgZ0Vudi0+c2V0U3RhdHNGaWxlKCJEZWNvZGVyLmNzdiIpOworICAgICAgICBzdGF0dXMgPSBnRW52LT53cml0ZVN0YXRzSGVhZGVyKCk7CisgICAgICAgIEFMT0dWKCJTdGF0cyBmaWxlID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR1YoIkRlY29kZXIgVGVzdCByZXN1bHQgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRW5jb2RlclRlc3QuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0VuY29kZXJUZXN0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWFjODQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0VuY29kZXJUZXN0LmNwcApAQCAtMCwwICsxLDIyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiZW5jb2RlclRlc3QiCisKKyNpbmNsdWRlIDxmc3RyZWFtPgorCisjaW5jbHVkZSAiQmVuY2htYXJrVGVzdEVudmlyb25tZW50LmgiCisjaW5jbHVkZSAiRGVjb2Rlci5oIgorI2luY2x1ZGUgIkVuY29kZXIuaCIKKworc3RhdGljIEJlbmNobWFya1Rlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK2NsYXNzIEVuY29kZXJUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTx0dXBsZTxzdHJpbmcsIHN0cmluZywgYm9vbD4+IHt9OworCitURVNUX1AoRW5jb2RlclRlc3QsIEVuY29kZSkgeworICAgIEFMT0dEKCJFbmNvZGUgdGVzdCBmb3IgYWxsIGNvZGVjcyIpOworICAgIHR1cGxlPHN0cmluZyAvKiBJbnB1dEZpbGUgKi8sIHN0cmluZyAvKiBDb2RlY05hbWUgKi8sIGJvb2wgLyogYXN5bmNNb2RlICovPiBwYXJhbXMgPSBHZXRQYXJhbSgpOworCisgICAgc3RyaW5nIGlucHV0RmlsZSA9IGdFbnYtPmdldFJlcygpICsgZ2V0PDA+KHBhcmFtcyk7CisgICAgRklMRSAqaW5wdXRGcCA9IGZvcGVuKGlucHV0RmlsZS5jX3N0cigpLCAicmIiKTsKKyAgICBBU1NFUlRfTkUoaW5wdXRGcCwgbnVsbHB0cikgPDwgIlVuYWJsZSB0byBvcGVuICIgPDwgaW5wdXRGaWxlIDw8ICIgZmlsZSBmb3IgcmVhZGluZyI7CisKKyAgICBEZWNvZGVyICpkZWNvZGVyID0gbmV3IERlY29kZXIoKTsKKyAgICBBU1NFUlRfTkUoZGVjb2RlciwgbnVsbHB0cikgPDwgIkRlY29kZXIgY3JlYXRpb24gZmFpbGVkIjsKKworICAgIEV4dHJhY3RvciAqZXh0cmFjdG9yID0gZGVjb2Rlci0+Z2V0RXh0cmFjdG9yKCk7CisgICAgQVNTRVJUX05FKGV4dHJhY3RvciwgbnVsbHB0cikgPDwgIkV4dHJhY3RvciBjcmVhdGlvbiBmYWlsZWQiOworCisgICAgLy8gUmVhZCBmaWxlIHByb3BlcnRpZXMKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgc3RhdChpbnB1dEZpbGUuY19zdHIoKSwgJmJ1Zik7CisgICAgc2l6ZV90IGZpbGVTaXplID0gYnVmLnN0X3NpemU7CisgICAgaW50MzJfdCBmZCA9IGZpbGVubyhpbnB1dEZwKTsKKworICAgIGludDMyX3QgdHJhY2tDb3VudCA9IGV4dHJhY3Rvci0+aW5pdEV4dHJhY3RvcihmZCwgZmlsZVNpemUpOworICAgIEFTU0VSVF9HVCh0cmFja0NvdW50LCAwKSA8PCAiaW5pdEV4dHJhY3RvciBmYWlsZWQiOworCisgICAgRW5jb2RlciAqZW5jb2RlciA9IG5ldyBFbmNvZGVyKCk7CisgICAgQVNTRVJUX05FKGVuY29kZXIsIG51bGxwdHIpIDw8ICJEZWNvZGVyIGNyZWF0aW9uIGZhaWxlZCI7CisKKyAgICBmb3IgKGludCBjdXJUcmFjayA9IDA7IGN1clRyYWNrIDwgdHJhY2tDb3VudDsgY3VyVHJhY2srKykgeworICAgICAgICBpbnQzMl90IHN0YXR1cyA9IGV4dHJhY3Rvci0+c2V0dXBUcmFja0Zvcm1hdChjdXJUcmFjayk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJUcmFjayBGb3JtYXQgaW52YWxpZCI7CisKKyAgICAgICAgdWludDhfdCAqaW5wdXRCdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhrTWF4QnVmZmVyU2l6ZSk7CisgICAgICAgIEFTU0VSVF9ORShpbnB1dEJ1ZmZlciwgbnVsbHB0cikgPDwgIkluc3VmZmljaWVudCBtZW1vcnkiOworCisgICAgICAgIHZlY3RvcjxBTWVkaWFDb2RlY0J1ZmZlckluZm8+IGZyYW1lSW5mbzsKKyAgICAgICAgQU1lZGlhQ29kZWNCdWZmZXJJbmZvIGluZm87CisgICAgICAgIHVpbnQzMl90IGlucHV0QnVmZmVyT2Zmc2V0ID0gMDsKKworICAgICAgICAvLyBHZXQgZnJhbWUgZGF0YQorICAgICAgICB3aGlsZSAoMSkgeworICAgICAgICAgICAgc3RhdHVzID0gZXh0cmFjdG9yLT5nZXRGcmFtZVNhbXBsZShpbmZvKTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgfHwgIWluZm8uc2l6ZSkgYnJlYWs7CisgICAgICAgICAgICAvLyBjb3B5IHRoZSBtZXRhIGRhdGEgYW5kIGJ1ZmZlciB0byBiZSBwYXNzZWQgdG8gZGVjb2RlcgorICAgICAgICAgICAgQVNTRVJUX0xFKGlucHV0QnVmZmVyT2Zmc2V0ICsgaW5mby5zaXplLCBrTWF4QnVmZmVyU2l6ZSkKKyAgICAgICAgICAgICAgICAgICAgPDwgIk1lbW9yeSBhbGxvY2F0ZWQgbm90IHN1ZmZpY2llbnQiOworCisgICAgICAgICAgICBtZW1jcHkoaW5wdXRCdWZmZXIgKyBpbnB1dEJ1ZmZlck9mZnNldCwgZXh0cmFjdG9yLT5nZXRGcmFtZUJ1ZigpLCBpbmZvLnNpemUpOworICAgICAgICAgICAgZnJhbWVJbmZvLnB1c2hfYmFjayhpbmZvKTsKKyAgICAgICAgICAgIGlucHV0QnVmZmVyT2Zmc2V0ICs9IGluZm8uc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIHN0cmluZyBkZWNOYW1lID0gIiI7CisgICAgICAgIHN0cmluZyBvdXRwdXRGaWxlTmFtZSA9ICIvZGF0YS9sb2NhbC90bXAvZGVjb2RlLm91dCI7CisgICAgICAgIEZJTEUgKm91dEZwID0gZm9wZW4ob3V0cHV0RmlsZU5hbWUuY19zdHIoKSwgIndiIik7CisgICAgICAgIEFTU0VSVF9ORShvdXRGcCwgbnVsbHB0cikgPDwgIlVuYWJsZSB0byBvcGVuIG91dHB1dCBmaWxlIiA8PCBvdXRwdXRGaWxlTmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgZm9yIGR1bXBpbmcgZGVjb2RlcidzIG91dHB1dCI7CisKKyAgICAgICAgZGVjb2Rlci0+c2V0dXBEZWNvZGVyKCk7CisgICAgICAgIHN0YXR1cyA9IGRlY29kZXItPmRlY29kZShpbnB1dEJ1ZmZlciwgZnJhbWVJbmZvLCBkZWNOYW1lLCBmYWxzZSAvKmFzeW5jTW9kZSAqLywgb3V0RnApOworICAgICAgICBBU1NFUlRfRVEoc3RhdHVzLCBBTUVESUFfT0spIDw8ICJEZWNvZGUgcmV0dXJuZWQgZXJyb3IgOiAiIDw8IHN0YXR1czsKKworICAgICAgICBpZnN0cmVhbSBlbGVTdHJlYW07CisgICAgICAgIGVsZVN0cmVhbS5vcGVuKG91dHB1dEZpbGVOYW1lLmNfc3RyKCksIGlmc3RyZWFtOjpiaW5hcnkgfCBpZnN0cmVhbTo6YXRlKTsKKyAgICAgICAgQVNTRVJUX0VRKGVsZVN0cmVhbS5pc19vcGVuKCksIHRydWUpIDw8IG91dHB1dEZpbGVOYW1lLmNfc3RyKCkgPDwgIiAtIGZpbGUgbm90IGZvdW5kIjsKKyAgICAgICAgc2l6ZV90IGVsZVNpemUgPSBlbGVTdHJlYW0udGVsbGcoKTsKKyAgICAgICAgZWxlU3RyZWFtLnNlZWtnKDAsIGlmc3RyZWFtOjpiZWcpOworCisgICAgICAgIEFNZWRpYUZvcm1hdCAqZm9ybWF0ID0gZXh0cmFjdG9yLT5nZXRGb3JtYXQoKTsKKyAgICAgICAgY29uc3QgY2hhciAqbWltZSA9IG51bGxwdHI7CisgICAgICAgIEFNZWRpYUZvcm1hdF9nZXRTdHJpbmcoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX01JTUUsICZtaW1lKTsKKyAgICAgICAgQVNTRVJUX05FKG1pbWUsIG51bGxwdHIpIDw8ICJJbnZhbGlkIG1pbWUgdHlwZSI7CisKKyAgICAgICAgLy8gR2V0IGVuY29kZXIgcGFyYW1zCisgICAgICAgIGVuY1BhcmFtZXRlciBlbmNQYXJhbXM7CisgICAgICAgIGlmICghc3RybmNtcChtaW1lLCAidmlkZW8vIiwgNikpIHsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfV0lEVEgsICZlbmNQYXJhbXMud2lkdGgpKTsKKyAgICAgICAgICAgIEFTU0VSVF9UUlVFKEFNZWRpYUZvcm1hdF9nZXRJbnQzMihmb3JtYXQsIEFNRURJQUZPUk1BVF9LRVlfSEVJR0hULCAmZW5jUGFyYW1zLmhlaWdodCkpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9GUkFNRV9SQVRFLCAmZW5jUGFyYW1zLmZyYW1lUmF0ZSk7CisgICAgICAgICAgICBBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX0JJVF9SQVRFLCAmZW5jUGFyYW1zLmJpdHJhdGUpOworICAgICAgICAgICAgaWYgKGVuY1BhcmFtcy5iaXRyYXRlIDw9IDAgfHwgZW5jUGFyYW1zLmZyYW1lUmF0ZSA8PSAwKSB7CisgICAgICAgICAgICAgICAgZW5jUGFyYW1zLmZyYW1lUmF0ZSA9IDI1OworICAgICAgICAgICAgICAgIGlmICghc3RyY21wKG1pbWUsICJ2aWRlby8zZ3BwIikgfHwgIXN0cmNtcChtaW1lLCAidmlkZW8vbXA0di1lcyIpKSB7CisgICAgICAgICAgICAgICAgICAgIGVuY1BhcmFtcy5iaXRyYXRlID0gNjAwMDAwIC8qIDYwMCBLYnBzICovOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGVuY1BhcmFtcy5iaXRyYXRlID0gODAwMDAwMCAvKiA4IE1icHMgKi87CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9QUk9GSUxFLCAmZW5jUGFyYW1zLnByb2ZpbGUpOworICAgICAgICAgICAgQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9MRVZFTCwgJmVuY1BhcmFtcy5sZXZlbCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBU1NFUlRfVFJVRShBTWVkaWFGb3JtYXRfZ2V0SW50MzIoZm9ybWF0LCBBTUVESUFGT1JNQVRfS0VZX1NBTVBMRV9SQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNQYXJhbXMuc2FtcGxlUmF0ZSkpOworICAgICAgICAgICAgQVNTRVJUX1RSVUUoQU1lZGlhRm9ybWF0X2dldEludDMyKGZvcm1hdCwgQU1FRElBRk9STUFUX0tFWV9DSEFOTkVMX0NPVU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZlbmNQYXJhbXMubnVtQ2hhbm5lbHMpKTsKKyAgICAgICAgICAgIGVuY1BhcmFtcy5iaXRyYXRlID0KKyAgICAgICAgICAgICAgICAgICAgZW5jUGFyYW1zLnNhbXBsZVJhdGUgKiBlbmNQYXJhbXMubnVtQ2hhbm5lbHMgKiAxNiAvKiBiaXRzUGVyU2FtcGxlICovOworICAgICAgICB9CisKKyAgICAgICAgZW5jb2Rlci0+c2V0dXBFbmNvZGVyKCk7CisgICAgICAgIHN0cmluZyBjb2RlY05hbWUgPSBnZXQ8MT4ocGFyYW1zKTsKKyAgICAgICAgYm9vbCBhc3luY01vZGUgPSBnZXQ8Mj4ocGFyYW1zKTsKKyAgICAgICAgc3RhdHVzID0gZW5jb2Rlci0+ZW5jb2RlKGNvZGVjTmFtZSwgZWxlU3RyZWFtLCBlbGVTaXplLCBhc3luY01vZGUsIGVuY1BhcmFtcywgKGNoYXIgKiltaW1lKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIkVuY29kZXIgZmFpbGVkIGZvciAiIDw8IGNvZGVjTmFtZTsKKworICAgICAgICBlbmNvZGVyLT5kZUluaXRDb2RlYygpOworICAgICAgICBBTE9HVigiY29kZWMgOiAlcyIsIGNvZGVjTmFtZS5jX3N0cigpKTsKKyAgICAgICAgc3RyaW5nIGlucHV0UmVmZXJlbmNlID0gZ2V0PDA+KHBhcmFtcyk7CisgICAgICAgIGVuY29kZXItPmR1bXBTdGF0aXN0aWNzKGlucHV0UmVmZXJlbmNlLCBleHRyYWN0b3ItPmdldENsaXBEdXJhdGlvbigpLCBjb2RlY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhc3luY01vZGUgPyAiYXN5bmMiIDogInN5bmMiKSwgZ0Vudi0+Z2V0U3RhdHNGaWxlKCkpOworICAgICAgICBlbGVTdHJlYW0uY2xvc2UoKTsKKyAgICAgICAgaWYgKG91dEZwKSBmY2xvc2Uob3V0RnApOworCisgICAgICAgIGlmIChmb3JtYXQpIHsKKyAgICAgICAgICAgIEFNZWRpYUZvcm1hdF9kZWxldGUoZm9ybWF0KTsKKyAgICAgICAgICAgIGZvcm1hdCA9IG51bGxwdHI7CisgICAgICAgIH0KKyAgICAgICAgZW5jb2Rlci0+cmVzZXRFbmNvZGVyKCk7CisgICAgICAgIGRlY29kZXItPmRlSW5pdENvZGVjKCk7CisgICAgICAgIGZyZWUoaW5wdXRCdWZmZXIpOworICAgICAgICBkZWNvZGVyLT5yZXNldERlY29kZXIoKTsKKyAgICB9CisgICAgZGVsZXRlIGVuY29kZXI7CisgICAgZmNsb3NlKGlucHV0RnApOworICAgIGV4dHJhY3Rvci0+ZGVJbml0RXh0cmFjdG9yKCk7CisgICAgZGVsZXRlIGRlY29kZXI7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfU1VJVEVfUCgKKyAgICAgICAgQXVkaW9FbmNvZGVyU3luY1Rlc3QsIEVuY29kZXJUZXN0LAorICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3R1cGxlKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19hYWNfMzBzZWMubXA0IiwgIiIsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYmJiXzgwMDBoel8xY2hfOGticHNfYW1ybmJfMzBzZWMuM2dwIiwgIiIsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYmJiXzE2MDAwaHpfMWNoXzlrYnBzX2FtcndiXzMwc2VjLjNncCIsICIiLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImJiYl80NDEwMGh6XzJjaF82MDBrYnBzX2ZsYWNfMzBzZWMubXA0IiwgIiIsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYmJiXzQ4MDAwaHpfMmNoXzEwMGticHNfb3B1c18zMHNlYy53ZWJtIiwgIiIsIGZhbHNlKSkpOworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoCisgICAgICAgIEF1ZGlvRW5jb2RlckFzeW5jVGVzdCwgRW5jb2RlclRlc3QsCisgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzKG1ha2VfdHVwbGUoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX2FhY18zMHNlYy5tcDQiLCAiIiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImJiYl84MDAwaHpfMWNoXzhrYnBzX2Ftcm5iXzMwc2VjLjNncCIsICIiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYmJiXzE2MDAwaHpfMWNoXzlrYnBzX2FtcndiXzMwc2VjLjNncCIsICIiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiYmJiXzQ0MTAwaHpfMmNoXzYwMGticHNfZmxhY18zMHNlYy5tcDQiLCAiIiwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImJiYl80ODAwMGh6XzJjaF8xMDBrYnBzX29wdXNfMzBzZWMud2VibSIsICIiLCB0cnVlKSkpOworCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoVmlkZUVuY29kZXJTeW5jVGVzdCwgRW5jb2RlclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYXJkd2FyZSBjb2RlY3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc192cDgud2VibSIsICIiLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNjcwMGticHNfaDI2NC50cyIsICIiLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfaDI2NS5ta3YiLCAiIiwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU29mdHdhcmUgY29kZWNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfdnA5LndlYm0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYzIuYW5kcm9pZC52cDkuZW5jb2RlciIsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc192cDgud2VibSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjMi5hbmRyb2lkLnZwOC5lbmNvZGVyIiwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTc2eDE0NF8yNWZwc182MDAwa2Jwc19tcGVnNC5tcDQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYzIuYW5kcm9pZC5tcGVnNC5lbmNvZGVyIiwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTc2eDE0NF8yNWZwc182MDAwa2Jwc19oMjYzLjNncCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjMi5hbmRyb2lkLmgyNjMuZW5jb2RlciIsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MF8yNWZwc182NzAwa2Jwc19oMjY0LnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImMyLmFuZHJvaWQuYXZjLmVuY29kZXIiLCBmYWxzZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfaDI2NS5ta3YiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYzIuYW5kcm9pZC5oZXZjLmVuY29kZXIiLCBmYWxzZSkpKTsKKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKFZpZGVvRW5jb2RlckFzeW5jVGVzdCwgRW5jb2RlclRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBIYXJkd2FyZSBjb2RlY3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc192cDgud2VibSIsICIiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzE5MjB4MTA4MF8yNWZwc182NzAwa2Jwc19oMjY0LnRzIiwgIiIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2gyNjUubWt2IiwgIiIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gU29mdHdhcmUgY29kZWNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3R1cGxlKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfdnA5LndlYm0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYzIuYW5kcm9pZC52cDkuZW5jb2RlciIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX3ZwOC53ZWJtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImMyLmFuZHJvaWQudnA4LmVuY29kZXIiLCB0cnVlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfdHVwbGUoImNyb3dkXzE3NngxNDRfMjVmcHNfNjAwMGticHNfbXBlZzQubXA0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImMyLmFuZHJvaWQubXBlZzQuZW5jb2RlciIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTc2eDE0NF8yNWZwc182MDAwa2Jwc19oMjYzLjNncCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjMi5hbmRyb2lkLmgyNjMuZW5jb2RlciIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzY3MDBrYnBzX2gyNjQudHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYzIuYW5kcm9pZC5hdmMuZW5jb2RlciIsIHRydWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV90dXBsZSgiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2gyNjUubWt2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImMyLmFuZHJvaWQuaGV2Yy5lbmNvZGVyIiwgdHJ1ZSkpKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgZ0VudiA9IG5ldyBCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBnRW52LT5zZXRTdGF0c0ZpbGUoIkVuY29kZXIuY3N2Iik7CisgICAgICAgIHN0YXR1cyA9IGdFbnYtPndyaXRlU3RhdHNIZWFkZXIoKTsKKyAgICAgICAgQUxPR1YoIlN0YXRzIGZpbGUgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HVigiRW5jb2RlciBUZXN0IHJlc3VsdCA9ICVkXG4iLCBzdGF0dXMpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQpkaWZmIC0tZ2l0IGEvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0V4dHJhY3RvclRlc3QuY3BwIGIvbWVkaWEvdGVzdHMvYmVuY2htYXJrL3Rlc3RzL0V4dHJhY3RvclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxNGQxNWIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvRXh0cmFjdG9yVGVzdC5jcHAKQEAgLTAsMCArMSw4OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiZXh0cmFjdG9yVGVzdCIKKworI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CisKKyNpbmNsdWRlICJCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJFeHRyYWN0b3IuaCIKKworc3RhdGljIEJlbmNobWFya1Rlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK2NsYXNzIEV4dHJhY3RvclRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPHBhaXI8c3RyaW5nLCBpbnQzMl90Pj4ge307CisKK1RFU1RfUChFeHRyYWN0b3JUZXN0LCBFeHRyYWN0KSB7CisgICAgRXh0cmFjdG9yICpleHRyYWN0T2JqID0gbmV3IEV4dHJhY3RvcigpOworICAgIEFTU0VSVF9ORShleHRyYWN0T2JqLCBudWxscHRyKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCI7CisKKyAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpLmZpcnN0OworICAgIEZJTEUgKmlucHV0RnAgPSBmb3BlbihpbnB1dEZpbGUuY19zdHIoKSwgInJiIik7CisgICAgQVNTRVJUX05FKGlucHV0RnAsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gb3BlbiAiIDw8IGlucHV0RmlsZSA8PCAiIGZpbGUgZm9yIHJlYWRpbmciOworCisgICAgLy8gUmVhZCBmaWxlIHByb3BlcnRpZXMKKyAgICBzdHJ1Y3Qgc3RhdCBidWY7CisgICAgc3RhdChpbnB1dEZpbGUuY19zdHIoKSwgJmJ1Zik7CisgICAgc2l6ZV90IGZpbGVTaXplID0gYnVmLnN0X3NpemU7CisgICAgaW50MzJfdCBmZCA9IGZpbGVubyhpbnB1dEZwKTsKKworICAgIGludDMyX3QgdHJhY2tDb3VudCA9IGV4dHJhY3RPYmotPmluaXRFeHRyYWN0b3IoZmQsIGZpbGVTaXplKTsKKyAgICBBU1NFUlRfR1QodHJhY2tDb3VudCwgMCkgPDwgImluaXRFeHRyYWN0b3IgZmFpbGVkIjsKKworICAgIGludDMyX3QgdHJhY2tJRCA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIGludDMyX3Qgc3RhdHVzID0gZXh0cmFjdE9iai0+ZXh0cmFjdCh0cmFja0lEKTsKKyAgICBBU1NFUlRfRVEoc3RhdHVzLCBBTUVESUFfT0spIDw8ICJFeHRyYWN0aW9uIGZhaWxlZCBcbiI7CisKKyAgICBleHRyYWN0T2JqLT5kZUluaXRFeHRyYWN0b3IoKTsKKyAgICBleHRyYWN0T2JqLT5kdW1wU3RhdGlzdGljcyhHZXRQYXJhbSgpLmZpcnN0LCAiIiwgZ0Vudi0+Z2V0U3RhdHNGaWxlKCkpOworCisgICAgZmNsb3NlKGlucHV0RnApOworICAgIGRlbGV0ZSBleHRyYWN0T2JqOworfQorCitJTlNUQU5USUFURV9URVNUX1NVSVRFX1AoRXh0cmFjdG9yVGVzdEFsbCwgRXh0cmFjdG9yVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlcyhtYWtlX3BhaXIoImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc192cDkud2VibSIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzYwMDBrYnBzX2gyNjMuM2dwIiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNjAwMGticHNfbXBlZzQubXA0IiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNjcwMGticHNfaDI2NC50cyIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzczMDBrYnBzX21wZWcyLm1wNCIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2F2MS53ZWJtIiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfaDI2NS5ta3YiLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc192cDgud2VibSIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfYWFjXzVtaW5zLm1wNCIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzEyOGticHNfbXAzXzVtaW5zLm1wMyIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzYwMGticHNfZmxhY181bWlucy5mbGFjIiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfODAwMGh6XzFjaF84a2Jwc19hbXJuYl81bWlucy4zZ3AiLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl8xNjAwMGh6XzFjaF85a2Jwc19hbXJ3Yl81bWlucy4zZ3AiLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF84MGticHNfdm9yYmlzXzVtaW5zLndlYm0iLCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80ODAwMGh6XzJjaF8xMDBrYnBzX29wdXNfNW1pbnMud2VibSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApKSk7CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikgeworICAgIGdFbnYgPSBuZXcgQmVuY2htYXJrVGVzdEVudmlyb25tZW50KCk7CisgICAgOjp0ZXN0aW5nOjpBZGRHbG9iYWxUZXN0RW52aXJvbm1lbnQoZ0Vudik7CisgICAgOjp0ZXN0aW5nOjpJbml0R29vZ2xlVGVzdCgmYXJnYywgYXJndik7CisgICAgaW50IHN0YXR1cyA9IGdFbnYtPmluaXRGcm9tT3B0aW9ucyhhcmdjLCBhcmd2KTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyAgICAgICAgZ0Vudi0+c2V0U3RhdHNGaWxlKCJFeHRyYWN0b3IuY3N2Iik7CisgICAgICAgIHN0YXR1cyA9IGdFbnYtPndyaXRlU3RhdHNIZWFkZXIoKTsKKyAgICAgICAgQUxPR1YoIlN0YXRzIGZpbGUgPSAlZFxuIiwgc3RhdHVzKTsKKyAgICAgICAgc3RhdHVzID0gUlVOX0FMTF9URVNUUygpOworICAgICAgICBBTE9HVigiRXh0cmFjdG9yIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvTXV4ZXJUZXN0LmNwcCBiL21lZGlhL3Rlc3RzL2JlbmNobWFyay90ZXN0cy9NdXhlclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5MTY0NGIKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS90ZXN0cy9iZW5jaG1hcmsvdGVzdHMvTXV4ZXJUZXN0LmNwcApAQCAtMCwwICsxLDE2MSBAQAorCisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJtdXhlclRlc3QiCisKKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorCisjaW5jbHVkZSAiQmVuY2htYXJrVGVzdEVudmlyb25tZW50LmgiCisjaW5jbHVkZSAiTXV4ZXIuaCIKKworI2RlZmluZSBPVVRQVVRfRklMRV9OQU1FICIvZGF0YS9sb2NhbC90bXAvbXV4Lm91dCIKKworc3RhdGljIEJlbmNobWFya1Rlc3RFbnZpcm9ubWVudCAqZ0VudiA9IG51bGxwdHI7CisKK2NsYXNzIE11eGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08cGFpcjxzdHJpbmcsIHN0cmluZz4+IHt9OworCitzdGF0aWMgTVVYRVJfT1VUUFVUX1QgZ2V0TXV4ZXJPdXRGb3JtYXQoc3RyaW5nIGZtdCkgeworICAgIHN0YXRpYyBjb25zdCBzdHJ1Y3QgeworICAgICAgICBzdHJpbmcgbmFtZTsKKyAgICAgICAgTVVYRVJfT1VUUFVUX1QgdmFsdWU7CisgICAgfSBrRm9ybWF0TWFwc1tdID0ge3sibXA0IiwgTVVYRVJfT1VUUFVUX0ZPUk1BVF9NUEVHXzR9LAorICAgICAgICAgICAgICAgICAgICAgICB7IndlYm0iLCBNVVhFUl9PVVRQVVRfRk9STUFUX1dFQk19LAorICAgICAgICAgICAgICAgICAgICAgICB7IjNncHAiLCBNVVhFUl9PVVRQVVRfRk9STUFUXzNHUFB9LAorICAgICAgICAgICAgICAgICAgICAgICB7Im9nZyIsIE1VWEVSX09VVFBVVF9GT1JNQVRfT0dHfX07CisKKyAgICBNVVhFUl9PVVRQVVRfVCBmb3JtYXQgPSBNVVhFUl9PVVRQVVRfRk9STUFUX0lOVkFMSUQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplb2Yoa0Zvcm1hdE1hcHMpIC8gc2l6ZW9mKGtGb3JtYXRNYXBzWzBdKTsgKytpKSB7CisgICAgICAgIGlmICghZm10LmNvbXBhcmUoa0Zvcm1hdE1hcHNbaV0ubmFtZSkpIHsKKyAgICAgICAgICAgIGZvcm1hdCA9IGtGb3JtYXRNYXBzW2ldLnZhbHVlOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZvcm1hdDsKK30KKworVEVTVF9QKE11eGVyVGVzdCwgTXV4KSB7CisgICAgQUxPR1YoIk11eCB0aGUgc2FtcGxlcyBnaXZlbiBieSBleHRyYWN0b3IiKTsKKyAgICBzdHJpbmcgaW5wdXRGaWxlID0gZ0Vudi0+Z2V0UmVzKCkgKyBHZXRQYXJhbSgpLmZpcnN0OworICAgIEZJTEUgKmlucHV0RnAgPSBmb3BlbihpbnB1dEZpbGUuY19zdHIoKSwgInJiIik7CisgICAgQVNTRVJUX05FKGlucHV0RnAsIG51bGxwdHIpIDw8ICJVbmFibGUgdG8gb3BlbiAiIDw8IGlucHV0RmlsZSA8PCAiIGZpbGUgZm9yIHJlYWRpbmciOworCisgICAgc3RyaW5nIGZtdCA9IEdldFBhcmFtKCkuc2Vjb25kOworICAgIE1VWEVSX09VVFBVVF9UIG91dHB1dEZvcm1hdCA9IGdldE11eGVyT3V0Rm9ybWF0KGZtdCk7CisgICAgQVNTRVJUX05FKG91dHB1dEZvcm1hdCwgTVVYRVJfT1VUUFVUX0ZPUk1BVF9JTlZBTElEKSA8PCAiSW52YWxpZCBtdXhlciBvdXRwdXQgZm9ybWF0IjsKKworICAgIE11eGVyICptdXhlck9iaiA9IG5ldyBNdXhlcigpOworICAgIEFTU0VSVF9ORShtdXhlck9iaiwgbnVsbHB0cikgPDwgIk11eGVyIGNyZWF0aW9uIGZhaWxlZCI7CisKKyAgICBFeHRyYWN0b3IgKmV4dHJhY3RvciA9IG11eGVyT2JqLT5nZXRFeHRyYWN0b3IoKTsKKyAgICBBU1NFUlRfTkUoZXh0cmFjdG9yLCBudWxscHRyKSA8PCAiRXh0cmFjdG9yIGNyZWF0aW9uIGZhaWxlZCI7CisKKyAgICAvLyBSZWFkIGZpbGUgcHJvcGVydGllcworICAgIHN0cnVjdCBzdGF0IGJ1ZjsKKyAgICBzdGF0KGlucHV0RmlsZS5jX3N0cigpLCAmYnVmKTsKKyAgICBzaXplX3QgZmlsZVNpemUgPSBidWYuc3Rfc2l6ZTsKKyAgICBpbnQzMl90IGZkID0gZmlsZW5vKGlucHV0RnApOworCisgICAgaW50MzJfdCB0cmFja0NvdW50ID0gZXh0cmFjdG9yLT5pbml0RXh0cmFjdG9yKGZkLCBmaWxlU2l6ZSk7CisgICAgQVNTRVJUX0dUKHRyYWNrQ291bnQsIDApIDw8ICJpbml0RXh0cmFjdG9yIGZhaWxlZCI7CisKKyAgICBmb3IgKGludCBjdXJUcmFjayA9IDA7IGN1clRyYWNrIDwgdHJhY2tDb3VudDsgY3VyVHJhY2srKykgeworICAgICAgICBpbnQzMl90IHN0YXR1cyA9IGV4dHJhY3Rvci0+c2V0dXBUcmFja0Zvcm1hdChjdXJUcmFjayk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJUcmFjayBGb3JtYXQgaW52YWxpZCI7CisKKyAgICAgICAgdWludDhfdCAqaW5wdXRCdWZmZXIgPSAodWludDhfdCAqKW1hbGxvYyhrTWF4QnVmZmVyU2l6ZSk7CisgICAgICAgIEFTU0VSVF9ORShpbnB1dEJ1ZmZlciwgbnVsbHB0cikgPDwgIkluc3VmZmljaWVudCBtZW1vcnkiOworCisgICAgICAgIC8vIEFNZWRpYUNvZGVjQnVmZmVySW5mbyA6IDxzaXplIG9mIGZyYW1lPiA8ZmxhZ3M+IDxwcmVzZW50YXRpb25UaW1lVXM+IDxvZmZzZXQ+CisgICAgICAgIHZlY3RvcjxBTWVkaWFDb2RlY0J1ZmZlckluZm8+IGZyYW1lSW5mb3M7CisgICAgICAgIEFNZWRpYUNvZGVjQnVmZmVySW5mbyBpbmZvOworICAgICAgICB1aW50MzJfdCBpbnB1dEJ1ZmZlck9mZnNldCA9IDA7CisKKyAgICAgICAgLy8gR2V0IEZyYW1lIERhdGEKKyAgICAgICAgd2hpbGUgKDEpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IGV4dHJhY3Rvci0+Z2V0RnJhbWVTYW1wbGUoaW5mbyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzIHx8ICFpbmZvLnNpemUpIGJyZWFrOworICAgICAgICAgICAgLy8gY29weSB0aGUgbWV0YSBkYXRhIGFuZCBidWZmZXIgdG8gYmUgcGFzc2VkIHRvIG11eGVyCisgICAgICAgICAgICBBU1NFUlRfTEUoaW5wdXRCdWZmZXJPZmZzZXQgKyBpbmZvLnNpemUsIGtNYXhCdWZmZXJTaXplKQorICAgICAgICAgICAgICAgICAgICA8PCAiTWVtb3J5IGFsbG9jYXRlZCBub3Qgc3VmZmljaWVudCI7CisKKyAgICAgICAgICAgIG1lbWNweShpbnB1dEJ1ZmZlciArIGlucHV0QnVmZmVyT2Zmc2V0LCBleHRyYWN0b3ItPmdldEZyYW1lQnVmKCksIGluZm8uc2l6ZSk7CisgICAgICAgICAgICBpbmZvLm9mZnNldCA9IGlucHV0QnVmZmVyT2Zmc2V0OworICAgICAgICAgICAgZnJhbWVJbmZvcy5wdXNoX2JhY2soaW5mbyk7CisgICAgICAgICAgICBpbnB1dEJ1ZmZlck9mZnNldCArPSBpbmZvLnNpemU7CisgICAgICAgIH0KKworICAgICAgICBzdHJpbmcgb3V0cHV0RmlsZU5hbWUgPSBPVVRQVVRfRklMRV9OQU1FOworICAgICAgICBGSUxFICpvdXRwdXRGcCA9IGZvcGVuKG91dHB1dEZpbGVOYW1lLmNfc3RyKCksICJ3K2IiKTsKKyAgICAgICAgQVNTRVJUX05FKG91dHB1dEZwLCBudWxscHRyKQorICAgICAgICAgICAgICAgIDw8ICJVbmFibGUgdG8gb3BlbiBvdXRwdXQgZmlsZSIgPDwgb3V0cHV0RmlsZU5hbWUgPDwgIiBmb3Igd3JpdGluZyI7CisKKyAgICAgICAgaW50MzJfdCBmZCA9IGZpbGVubyhvdXRwdXRGcCk7CisgICAgICAgIHN0YXR1cyA9IG11eGVyT2JqLT5pbml0TXV4ZXIoZmQsIG91dHB1dEZvcm1hdCk7CisgICAgICAgIEFTU0VSVF9FUShzdGF0dXMsIDApIDw8ICJpbml0TXV4ZXIgZmFpbGVkIjsKKworICAgICAgICBzdGF0dXMgPSBtdXhlck9iai0+bXV4KGlucHV0QnVmZmVyLCBmcmFtZUluZm9zKTsKKyAgICAgICAgQVNTRVJUX0VRKHN0YXR1cywgMCkgPDwgIk11eCBmYWlsZWQiOworCisgICAgICAgIG11eGVyT2JqLT5kZUluaXRNdXhlcigpOworICAgICAgICBtdXhlck9iai0+ZHVtcFN0YXRpc3RpY3MoR2V0UGFyYW0oKS5maXJzdCArICIuIiArIGZtdC5jX3N0cigpLCBmbXQsIGdFbnYtPmdldFN0YXRzRmlsZSgpKTsKKyAgICAgICAgZnJlZShpbnB1dEJ1ZmZlcik7CisgICAgICAgIGZjbG9zZShvdXRwdXRGcCk7CisgICAgICAgIG11eGVyT2JqLT5yZXNldE11eGVyKCk7CisgICAgfQorICAgIGZjbG9zZShpbnB1dEZwKTsKKyAgICBleHRyYWN0b3ItPmRlSW5pdEV4dHJhY3RvcigpOworICAgIGRlbGV0ZSBtdXhlck9iajsKK30KKworSU5TVEFOVElBVEVfVEVTVF9TVUlURV9QKAorICAgICAgICBNdXhlclRlc3RBbGwsIE11eGVyVGVzdCwKKyAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXMobWFrZV9wYWlyKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNDAwMGticHNfdnA4LndlYm0iLCAid2VibSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc192cDkud2VibSIsICJ3ZWJtIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzYwMDBrYnBzX21wZWc0Lm1wNCIsICJtcDQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJjcm93ZF8zNTJ4Mjg4XzI1ZnBzXzYwMDBrYnBzX2gyNjMuM2dwIiwgIm1wNCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImNyb3dkXzE5MjB4MTA4MF8yNWZwc182NzAwa2Jwc19oMjY0LnRzIiwgIm1wNCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImNyb3dkXzE5MjB4MTA4MF8yNWZwc180MDAwa2Jwc19oMjY1Lm1rdiIsICJtcDQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNjAwMGticHNfbXBlZzQubXA0IiwgIjNncHAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJjcm93ZF8zNTJ4Mjg4XzI1ZnBzXzYwMDBrYnBzX2gyNjMuM2dwIiwgIjNncHAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJjcm93ZF8xOTIweDEwODBfMjVmcHNfNjcwMGticHNfaDI2NC50cyIsICIzZ3BwIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiY3Jvd2RfMTkyMHgxMDgwXzI1ZnBzXzQwMDBrYnBzX2gyNjUubWt2IiwgIjNncHAiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDgwMDBoel8yY2hfMTAwa2Jwc19vcHVzXzVtaW5zLndlYm0iLCAib2dnIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ0MTAwaHpfMmNoXzgwa2Jwc192b3JiaXNfNW1pbnMud2VibSIsICJ3ZWJtIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzQ4MDAwaHpfMmNoXzEwMGticHNfb3B1c181bWlucy53ZWJtIiwgIndlYm0iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfNDQxMDBoel8yY2hfMTI4a2Jwc19hYWNfNW1pbnMubXA0IiwgIm1wNCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl84MDAwaHpfMWNoXzhrYnBzX2Ftcm5iXzVtaW5zLjNncCIsICJtcDQiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbWFrZV9wYWlyKCJiYmJfMTYwMDBoel8xY2hfOWticHNfYW1yd2JfNW1pbnMuM2dwIiwgIm1wNCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl80NDEwMGh6XzJjaF8xMjhrYnBzX2FhY181bWlucy5tcDQiLCAiM2dwcCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoImJiYl84MDAwaHpfMWNoXzhrYnBzX2Ftcm5iXzVtaW5zLjNncCIsICIzZ3BwIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcigiYmJiXzE2MDAwaHpfMWNoXzlrYnBzX2FtcndiXzVtaW5zLjNncCIsICIzZ3BwIikpKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgZ0VudiA9IG5ldyBCZW5jaG1hcmtUZXN0RW52aXJvbm1lbnQoKTsKKyAgICA6OnRlc3Rpbmc6OkFkZEdsb2JhbFRlc3RFbnZpcm9ubWVudChnRW52KTsKKyAgICA6OnRlc3Rpbmc6OkluaXRHb29nbGVUZXN0KCZhcmdjLCBhcmd2KTsKKyAgICBpbnQgc3RhdHVzID0gZ0Vudi0+aW5pdEZyb21PcHRpb25zKGFyZ2MsIGFyZ3YpOworICAgIGlmIChzdGF0dXMgPT0gMCkgeworICAgICAgICBnRW52LT5zZXRTdGF0c0ZpbGUoIk11eGVyLmNzdiIpOworICAgICAgICBzdGF0dXMgPSBnRW52LT53cml0ZVN0YXRzSGVhZGVyKCk7CisgICAgICAgIEFMT0dWKCJTdGF0cyBmaWxlID0gJWRcbiIsIHN0YXR1cyk7CisgICAgICAgIHN0YXR1cyA9IFJVTl9BTExfVEVTVFMoKTsKKyAgICAgICAgQUxPR1YoIk11eGVyIFRlc3QgcmVzdWx0ID0gJWRcbiIsIHN0YXR1cyk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5jcHAgYi9tZWRpYS91dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDk3YzM0MAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmNwcApAQCAtMCwwICsxLDUyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPGNtYXRoPgorCisjaW5jbHVkZSA8bWVkaWF1dGlscy9BSW1hZ2VSZWFkZXJVdGlscy5oPgorI2luY2x1ZGUgPGhpZGwvSHlicmlkSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaW1nIHsKKwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOworCitzdGF0aWMgc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gY29udmVydE5hdGl2ZUhhbmRsZVRvSEdCUCAoCisgICAgICAgIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKSB7CisgICAgLy8gUmVhZCB0aGUgc2l6ZSBvZiB0aGUgaGFsVG9rZW4gdmVjPHVpbnQ4X3Q+CisgICAgaGlkbF92ZWM8dWludDhfdD4gaGFsVG9rZW47CisgICAgaGFsVG9rZW4uc2V0VG9FeHRlcm5hbCgKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OF90ICo+KGNvbnN0X2Nhc3Q8aW50ICo+KCYoaGFuZGxlLT5kYXRhWzFdKSkpLAorICAgICAgICBoYW5kbGUtPmRhdGFbMF0pOworICAgIHNwPEhHcmFwaGljQnVmZmVyUHJvZHVjZXI+IGhnYnAgPQorICAgICAgICBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyOjpjYXN0RnJvbShyZXRyaWV2ZUhhbEludGVyZmFjZShoYWxUb2tlbikpOworICAgIHJldHVybiBoZ2JwOworfQorCitzcDxIR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBBSW1hZ2VSZWFkZXJfZ2V0SEdCUEZyb21IYW5kbGUoCisgICAgY29uc3QgbmF0aXZlX2hhbmRsZV90ICpoYW5kbGUpIHsKKyAgICBpZiAoaGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGlmIChoYW5kbGUtPm51bUZkcyAhPSAwICB8fAorICAgICAgICBoYW5kbGUtPm51bUludHMgPCBzdGQ6OmNlaWwoc2l6ZW9mKHNpemVfdCkgLyBzaXplb2YoaW50KSkpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBjb252ZXJ0TmF0aXZlSGFuZGxlVG9IR0JQKGhhbmRsZSk7Cit9CisKK30gLy9uYW1lc3BhY2UgYWltZworfSAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9BbmRyb2lkLmJwIGIvbWVkaWEvdXRpbHMvQW5kcm9pZC5icAppbmRleCBhNGFhZGUzLi41MDQ3YjE5IDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9BbmRyb2lkLmJwCisrKyBiL21lZGlhL3V0aWxzL0FuZHJvaWQuYnAKQEAgLTE2LDMyICsxNiw0NSBAQAogICAgIG5hbWU6ICJsaWJtZWRpYXV0aWxzIiwKIAogICAgIHNyY3M6IFsKKyAgICAgICAgIkFJbWFnZVJlYWRlclV0aWxzLmNwcCIsCiAgICAgICAgICJCYXR0ZXJ5Tm90aWZpZXIuY3BwIiwKICAgICAgICAgIklTY2hlZHVsaW5nUG9saWN5U2VydmljZS5jcHAiLAogICAgICAgICAiTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAiLAogICAgICAgICAiUHJvY2Vzc0luZm8uY3BwIiwKICAgICAgICAgIlNjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmNwcCIsCisgICAgICAgICJTZXJ2aWNlVXRpbGl0aWVzLmNwcCIsCisgICAgICAgICJUaW1lQ2hlY2suY3BwIiwKICAgICBdLAogICAgIHN0YXRpY19saWJzOiBbCiAgICAgICAgICJsaWJjX21hbGxvY19kZWJ1Z19iYWNrdHJhY2UiLAogICAgIF0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAogICAgICAgICAibGlibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuZ3JhcGhpY3MuYnVmZmVycXVldWVAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC50b2tlbkAxLjAtdXRpbHMiLAogICAgIF0sCiAKKyAgICBsb2d0YWdzOiBbIkV2ZW50TG9nVGFncy5sb2d0YWdzIl0sCisKICAgICBjZmxhZ3M6IFsKICAgICAgICAgIi1XYWxsIiwKICAgICAgICAgIi1XZXh0cmEiLAogICAgICAgICAiLVdlcnJvciIsCiAgICAgXSwKIAotICAgIGluY2x1ZGVfZGlyczogWwotICAgICAgICAvLyBGb3IgYW5kcm9pZF9tYWxsb3B0IGRlZmluaXRpb25zLgotICAgICAgICAiYmlvbmljL2xpYmMvcHJpdmF0ZSIKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAiYmlvbmljX2xpYmNfcGxhdGZvcm1faGVhZGVycyIsCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKICAgICBdLAogCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgIC8vIEZvciBERUJVR0dFUl9TSUdOQUwKKyAgICAgICAgInN5c3RlbS9jb3JlL2RlYnVnZ2VyZC9pbmNsdWRlIiwKKyAgICBdLAogICAgIGxvY2FsX2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiAgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCiB9CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9FdmVudExvZ1RhZ3MubG9ndGFncyBiL21lZGlhL3V0aWxzL0V2ZW50TG9nVGFncy5sb2d0YWdzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3ZjBlYTgKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9FdmVudExvZ1RhZ3MubG9ndGFncwpAQCAtMCwwICsxLDQxIEBACisjIFRoZSBlbnRyaWVzIGluIHRoaXMgZmlsZSBtYXAgYSBzcGFyc2Ugc2V0IG9mIGxvZyB0YWcgbnVtYmVycyB0byB0YWcgbmFtZXMuCisjIFRoaXMgaXMgaW5zdGFsbGVkIG9uIHRoZSBkZXZpY2UsIGluIC9zeXN0ZW0vZXRjLCBhbmQgcGFyc2VkIGJ5IGxvZ2NhdC4KKyMKKyMgVGFnIG51bWJlcnMgYXJlIGRlY2ltYWwgaW50ZWdlcnMsIGZyb20gMCB0byAyXjMxLiAgKExldCdzIGxlYXZlIHRoZQorIyBuZWdhdGl2ZSB2YWx1ZXMgYWxvbmUgZm9yIG5vdy4pCisjCisjIFRhZyBuYW1lcyBhcmUgb25lIG9yIG1vcmUgQVNDSUkgbGV0dGVycyBhbmQgbnVtYmVycyBvciB1bmRlcnNjb3JlcywgaS5lLgorIyAiW0EtWl1bYS16XVswLTldXyIuICBEbyBub3QgaW5jbHVkZSBzcGFjZXMgb3IgcHVuY3R1YXRpb24gKHRoZSBmb3JtZXIKKyMgaW1wYWN0cyBsb2cgcmVhZGFiaWxpdHksIHRoZSBsYXR0ZXIgbWFrZXMgcmVnZXggc2VhcmNoZXMgbW9yZSBhbm5veWluZykuCisjCisjIFRhZyBudW1iZXJzIGFuZCBuYW1lcyBhcmUgc2VwYXJhdGVkIGJ5IHdoaXRlc3BhY2UuICBCbGFuayBsaW5lcyBhbmQgbGluZXMKKyMgc3RhcnRpbmcgd2l0aCAnIycgYXJlIGlnbm9yZWQuCisjCisjIE9wdGlvbmFsbHksIGFmdGVyIHRoZSB0YWcgbmFtZXMgY2FuIGJlIHB1dCBhIGRlc2NyaXB0aW9uIGZvciB0aGUgdmFsdWUocykKKyMgb2YgdGhlIHRhZy4gRGVzY3JpcHRpb24gYXJlIGluIHRoZSBmb3JtYXQKKyMgICAgKDxuYW1lPnxkYXRhIHR5cGVbfGRhdGEgdW5pdF0pCisjIE11bHRpcGxlIHZhbHVlcyBhcmUgc2VwYXJhdGVkIGJ5IGNvbW1hcy4KKyMKKyMgVGhlIGRhdGEgdHlwZSBpcyBhIG51bWJlciBmcm9tIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgorIyAxOiBpbnQKKyMgMjogbG9uZworIyAzOiBzdHJpbmcKKyMgNDogbGlzdAorIworIyBUaGUgZGF0YSB1bml0IGlzIGEgbnVtYmVyIHRha2VuIGZyb20gdGhlIGZvbGxvd2luZyBsaXN0OgorIyAxOiBOdW1iZXIgb2Ygb2JqZWN0cworIyAyOiBOdW1iZXIgb2YgYnl0ZXMKKyMgMzogTnVtYmVyIG9mIG1pbGxpc2Vjb25kcworIyA0OiBOdW1iZXIgb2YgYWxsb2NhdGlvbnMKKyMgNTogSWQKKyMgNjogUGVyY2VudAorIyBEZWZhdWx0IHZhbHVlIGZvciBkYXRhIG9mIHR5cGUgaW50L2xvbmcgaXMgMiAoYnl0ZXMpLgorIworIyBTZWUgc3lzdGVtL2NvcmUvbG9nY2F0L2V2ZW50LmxvZ3RhZ3MgZm9yIHRoZSBtYXN0ZXIgY29weSBvZiB0aGUgdGFncy4KKworIyA2MTAwMCAtIDYxMTk5IHJlc2VydmVkIGZvciBhdWRpb3NlcnZlcgorCis2MTAwMCBhdWRpb3NlcnZlcl9iaW5kZXJfdGltZW91dCAoY29tbWFuZHwzKQorCisjIE5PVEUgLSB0aGUgcmFuZ2UgMTAwMDAwMC0yMDAwMDAwIGlzIHJlc2VydmVkIGZvciBwYXJ0bmVycyBhbmQgb3RoZXJzIHdobworIyB3YW50IHRvIGRlZmluZSB0aGVpciBvd24gbG9nIHRhZ3Mgd2l0aG91dCBjb25mbGljdGluZyB3aXRoIHRoZSBjb3JlIHBsYXRmb3JtLgpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvTWVtb3J5TGVha1RyYWNrVXRpbC5jcHAgYi9tZWRpYS91dGlscy9NZW1vcnlMZWFrVHJhY2tVdGlsLmNwcAppbmRleCAyOTg4YjUyLi42MTY2ODU5IDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9NZW1vcnlMZWFrVHJhY2tVdGlsLmNwcAorKysgYi9tZWRpYS91dGlscy9NZW1vcnlMZWFrVHJhY2tVdGlsLmNwcApAQCAtMjIsNyArMjIsNyBAQAogI2luY2x1ZGUgIm1lZGlhL01lbW9yeUxlYWtUcmFja1V0aWwuaCIKICNpbmNsdWRlIDxzc3RyZWFtPgogCi0jaW5jbHVkZSA8YmlvbmljX21hbGxvYy5oPgorI2luY2x1ZGUgPGJpb25pYy9tYWxsb2MuaD4KIAogLyoKICAqIFRoZSBjb2RlIGhlcmUgb3JpZ2luYWxseSByZXNpZGVkIGluIE1lZGlhUGxheWVyU2VydmljZS5jcHAKZGlmZiAtLWdpdCBhL21lZGlhL3V0aWxzL1Byb2Nlc3NJbmZvLmNwcCBiL21lZGlhL3V0aWxzL1Byb2Nlc3NJbmZvLmNwcAppbmRleCAyN2YxYTc5Li4xMTNlNGE3IDEwMDY0NAotLS0gYS9tZWRpYS91dGlscy9Qcm9jZXNzSW5mby5jcHAKKysrIGIvbWVkaWEvdXRpbHMvUHJvY2Vzc0luZm8uY3BwCkBAIC0yMyw2ICsyMyw3IEBACiAjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lQcm9jZXNzSW5mb1NlcnZpY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVNlcnZpY2VNYW5hZ2VyLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtNTUsOCArNTYsOSBAQAogCiBib29sIFByb2Nlc3NJbmZvOjppc1ZhbGlkUGlkKGludCBwaWQpIHsKICAgICBpbnQgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKICAgICAvLyBUcnVzdCBpdCBpZiB0aGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBzYW1lIHByb2Nlc3Mgb3RoZXJ3aXNlIHBpZCBoYXMgdG8gbWF0Y2ggdGhlIGNhbGxpbmcgcGlkLgotICAgIHJldHVybiAoY2FsbGluZ1BpZCA9PSBnZXRwaWQoKSkgfHwgKGNhbGxpbmdQaWQgPT0gcGlkKTsKKyAgICByZXR1cm4gKGNhbGxpbmdQaWQgPT0gZ2V0cGlkKCkpIHx8IChjYWxsaW5nUGlkID09IHBpZCkgfHwgKGNhbGxpbmdVaWQgPT0gQUlEX01FRElBKTsKIH0KIAogUHJvY2Vzc0luZm86On5Qcm9jZXNzSW5mbygpIHt9CmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmNwcCBiL21lZGlhL3V0aWxzL1NlcnZpY2VVdGlsaXRpZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NjE0NzAKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmNwcApAQCAtMCwwICsxLDMyNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiU2VydmljZVV0aWxpdGllcyIKKworI2luY2x1ZGUgPGJpbmRlci9BcHBPcHNNYW5hZ2VyLmg+CisjaW5jbHVkZSA8YmluZGVyL0lQQ1RocmVhZFN0YXRlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGJpbmRlci9QZXJtaXNzaW9uQ2FjaGUuaD4KKyNpbmNsdWRlICJtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaCIKKworI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworLyogV2hlbiBwZXJmb3JtaW5nIHBlcm1pc3Npb24gY2hlY2tzIHdlIGRvIG5vdCB1c2UgcGVybWlzc2lvbiBjYWNoZSBmb3IKKyAqIHJ1bnRpbWUgcGVybWlzc2lvbnMgKHByb3RlY3Rpb24gbGV2ZWwgZGFuZ2Vyb3VzKSBhcyB0aGV5IG1heSBjaGFuZ2UgYXQKKyAqIHJ1bnRpbWUuIEFsbCBvdGhlciBwZXJtaXNzaW9ucyAocHJvdGVjdGlvbiBsZXZlbCBub3JtYWwgYW5kIGRhbmdlcm91cykKKyAqIGNhbiBiZSBjYWNoZWQgYXMgdGhleSBuZXZlciBjaGFuZ2UuIE9mIGNvdXJzZSBhbGwgcGVybWlzc2lvbiBjaGVja2VkCisgKiBoZXJlIGFyZSBwbGF0Zm9ybSBkZWZpbmVkLgorICovCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworc3RhdGljIGNvbnN0IFN0cmluZzE2IHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKCJhbmRyb2lkLnBlcm1pc3Npb24uUkVDT1JEX0FVRElPIik7CitzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeVBob25lU3RhdGUoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfUEhPTkVfU1RBVEUiKTsKK3N0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5QXVkaW9Sb3V0aW5nKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKKworc3RhdGljIFN0cmluZzE2IHJlc29sdmVDYWxsaW5nUGFja2FnZShQZXJtaXNzaW9uQ29udHJvbGxlciYgcGVybWlzc2lvbkNvbnRyb2xsZXIsCisgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCB1aWRfdCB1aWQpIHsKKyAgICBpZiAob3BQYWNrYWdlTmFtZS5zaXplKCkgPiAwKSB7CisgICAgICAgIHJldHVybiBvcFBhY2thZ2VOYW1lOworICAgIH0KKyAgICAvLyBJbiBzb21lIGNhc2VzIHRoZSBjYWxsaW5nIGNvZGUgaGFzIG5vIGFjY2VzcyB0byB0aGUgcGFja2FnZSBpdCBydW5zIHVuZGVyLgorICAgIC8vIEZvciBleGFtcGxlLCBjb2RlIHVzaW5nIHRoZSB3aWxoZWxtIGZyYW1ld29yaydzIE9wZW5TTC1FUyBBUElzLiBJbiB0aGlzCisgICAgLy8gY2FzZSB3ZSB3aWxsIGdldCB0aGUgcGFja2FnZXMgZm9yIHRoZSBjYWxsaW5nIFVJRCBhbmQgcGljayB0aGUgZmlyc3Qgb25lCisgICAgLy8gZm9yIGF0dHJpYnV0aW5nIHRoZSBhcHAgb3AuIFRoaXMgd2lsbCB3b3JrIGNvcnJlY3RseSBmb3IgcnVudGltZSBwZXJtaXNzaW9ucworICAgIC8vIGFzIGZvciBsZWdhY3kgYXBwcyB3ZSB3aWxsIHRvZ2dsZSB0aGUgYXBwIG9wIGZvciBhbGwgcGFja2FnZXMgaW4gdGhlIFVJRC4KKyAgICAvLyBUaGUgY2F2ZWF0IGlzIHRoYXQgdGhlIG9wZXJhdGlvbiBtYXkgYmUgYXR0cmlidXRlZCB0byB0aGUgd3JvbmcgcGFja2FnZSBhbmQKKyAgICAvLyBzdGF0cyBiYXNlZCBvbiBhcHAgb3BzIG1heSBiZSBzbGlnaHRseSBvZmYuCisgICAgVmVjdG9yPFN0cmluZzE2PiBwYWNrYWdlczsKKyAgICBwZXJtaXNzaW9uQ29udHJvbGxlci5nZXRQYWNrYWdlc0ZvclVpZCh1aWQsIHBhY2thZ2VzKTsKKyAgICBpZiAocGFja2FnZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCJObyBwYWNrYWdlcyBmb3IgdWlkICVkIiwgdWlkKTsKKyAgICAgICAgcmV0dXJuIG9wUGFja2FnZU5hbWU7IC8vIGVtcHR5IHN0cmluZworICAgIH0KKyAgICByZXR1cm4gcGFja2FnZXNbMF07Cit9CisKK3N0YXRpYyBib29sIGNoZWNrUmVjb3JkaW5nSW50ZXJuYWwoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwKKyAgICAgICAgdWlkX3QgdWlkLCBib29sIHN0YXJ0KSB7CisgICAgLy8gT2theSB0byBub3QgdHJhY2sgaW4gYXBwIG9wcyBhcyBhdWRpbyBzZXJ2ZXIgaXMgdXMgYW5kIGlmCisgICAgLy8gZGV2aWNlIGlzIHJvb3RlZCBzZWN1cml0eSBtb2RlbCBpcyBjb25zaWRlcmVkIGNvbXByb21pc2VkLgorICAgIC8vIHN5c3RlbV9zZXJ2ZXIgbG9zZXMgaXRzIFJFQ09SRF9BVURJTyBwZXJtaXNzaW9uIHdoZW4gYSBzZWNvbmRhcnkKKyAgICAvLyB1c2VyIGlzIGFjdGl2ZSwgYnV0IGl0IGlzIGEgY29yZSBzeXN0ZW0gc2VydmljZSBzbyBsZXQgaXQgdGhyb3VnaC4KKyAgICAvLyBUT0RPKGIvMTQxMjEwMTIwKTogVXNlck1hbmFnZXIuRElTQUxMT1dfUkVDT1JEX0FVRElPIHNob3VsZCBub3QgYWZmZWN0IHN5c3RlbSB1c2VyIDAKKyAgICBpZiAoaXNBdWRpb1NlcnZlck9yU3lzdGVtU2VydmVyT3JSb290VWlkKHVpZCkpIHJldHVybiB0cnVlOworCisgICAgLy8gV2Ugc3BlY2lmeSBhIHBpZCBhbmQgdWlkIGhlcmUgYXMgbWVkaWFzZXJ2ZXIgKGFrYSBNZWRpYVJlY29yZGVyIG9yIFN0YWdlRnJpZ2h0UmVjb3JkZXIpCisgICAgLy8gbWF5IG9wZW4gYSByZWNvcmQgdHJhY2sgb24gYmVoYWxmIG9mIGEgY2xpZW50LiAgTm90ZSB0aGF0IHBpZCBtYXkgYmUgYSB0aWQuCisgICAgLy8gSU1QT1JUQU5UOiBET04nVCBVU0UgUGVybWlzc2lvbkNhY2hlIC0gUlVOVElNRSBQRVJNSVNTSU9OUyBDSEFOR0UuCisgICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGVybWlzc2lvbkNvbnRyb2xsZXI7CisgICAgY29uc3QgYm9vbCBvayA9IHBlcm1pc3Npb25Db250cm9sbGVyLmNoZWNrUGVybWlzc2lvbihzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbywgcGlkLCB1aWQpOworICAgIGlmICghb2spIHsKKyAgICAgICAgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgJXMiLCBTdHJpbmc4KHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFN0cmluZzE2IHJlc29sdmVkT3BQYWNrYWdlTmFtZSA9IHJlc29sdmVDYWxsaW5nUGFja2FnZSgKKyAgICAgICAgICAgIHBlcm1pc3Npb25Db250cm9sbGVyLCBvcFBhY2thZ2VOYW1lLCB1aWQpOworICAgIGlmIChyZXNvbHZlZE9wUGFja2FnZU5hbWUuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEFwcE9wc01hbmFnZXIgYXBwT3BzOworICAgIGNvbnN0IGludDMyX3Qgb3AgPSBhcHBPcHMucGVybWlzc2lvblRvT3BDb2RlKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKTsKKyAgICBpZiAoc3RhcnQpIHsKKyAgICAgICAgaWYgKGFwcE9wcy5zdGFydE9wTm9UaHJvdyhvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUsIC8qc3RhcnRJZk1vZGVEZWZhdWx0Ki8gZmFsc2UpCisgICAgICAgICAgICAgICAgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7CisgICAgICAgICAgICBBTE9HRSgiUmVxdWVzdCBkZW5pZWQgYnkgYXBwIG9wOiAlZCIsIG9wKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhcHBPcHMuY2hlY2tPcChvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUpICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgeworICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3QgZGVuaWVkIGJ5IGFwcCBvcDogJWQiLCBvcCk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCByZWNvcmRpbmdBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgIHJldHVybiBjaGVja1JlY29yZGluZ0ludGVybmFsKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkLCAvKnN0YXJ0Ki8gZmFsc2UpOworfQorCitib29sIHN0YXJ0UmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgICByZXR1cm4gY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgLypzdGFydCovIHRydWUpOworfQorCit2b2lkIGZpbmlzaFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKSB7CisgICAgLy8gT2theSB0byBub3QgdHJhY2sgaW4gYXBwIG9wcyBhcyBhdWRpbyBzZXJ2ZXIgaXMgdXMgYW5kIGlmCisgICAgLy8gZGV2aWNlIGlzIHJvb3RlZCBzZWN1cml0eSBtb2RlbCBpcyBjb25zaWRlcmVkIGNvbXByb21pc2VkLgorICAgIGlmIChpc0F1ZGlvU2VydmVyT3JSb290VWlkKHVpZCkpIHJldHVybjsKKworICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBlcm1pc3Npb25Db250cm9sbGVyOworICAgIFN0cmluZzE2IHJlc29sdmVkT3BQYWNrYWdlTmFtZSA9IHJlc29sdmVDYWxsaW5nUGFja2FnZSgKKyAgICAgICAgICAgIHBlcm1pc3Npb25Db250cm9sbGVyLCBvcFBhY2thZ2VOYW1lLCB1aWQpOworICAgIGlmIChyZXNvbHZlZE9wUGFja2FnZU5hbWUuc2l6ZSgpID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEFwcE9wc01hbmFnZXIgYXBwT3BzOworICAgIGNvbnN0IGludDMyX3Qgb3AgPSBhcHBPcHMucGVybWlzc2lvblRvT3BDb2RlKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKTsKKyAgICBhcHBPcHMuZmluaXNoT3Aob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lKTsKK30KKworYm9vbCBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7CisgICAgaWYgKGlzQXVkaW9TZXJ2ZXJPclJvb3RVaWQodWlkKSkgcmV0dXJuIHRydWU7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYXB0dXJlQXVkaW9PdXRwdXQoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX09VVFBVVCIpOworICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzQ2FwdHVyZUF1ZGlvT3V0cHV0LCBwaWQsIHVpZCk7CisgICAgaWYgKCFvaykgQUxPR1YoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fT1VUUFVUIik7CisgICAgcmV0dXJuIG9rOworfQorCitib29sIGNhcHR1cmVNZWRpYU91dHB1dEFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdFVpZCh1aWQpKSByZXR1cm4gdHJ1ZTsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVNZWRpYU91dHB1dCgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfTUVESUFfT1VUUFVUIik7CisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNDYXB0dXJlTWVkaWFPdXRwdXQsIHBpZCwgdWlkKTsKKyAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9NRURJQV9PVVRQVVQiKTsKKyAgICByZXR1cm4gb2s7Cit9CisKK2Jvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgeworICAgIC8vIENBUFRVUkVfQVVESU9fSE9UV09SRCBwZXJtaXNzaW9uIGltcGxpZXMgUkVDT1JEX0FVRElPIHBlcm1pc3Npb24KKyAgICBib29sIG9rID0gcmVjb3JkaW5nQWxsb3dlZChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCk7CisKKyAgICBpZiAob2spIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNDYXB0dXJlSG90d29yZEFsbG93ZWQoImFuZHJvaWQucGVybWlzc2lvbi5DQVBUVVJFX0FVRElPX0hPVFdPUkQiKTsKKyAgICAgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICAgICAgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzQ2FwdHVyZUhvdHdvcmRBbGxvd2VkLCBwaWQsIHVpZCk7CisgICAgfQorICAgIGlmICghb2spIEFMT0dWKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7CisgICAgcmV0dXJuIG9rOworfQorCitib29sIHNldHRpbmdzQWxsb3dlZCgpIHsKKyAgICAvLyBnaXZlbiB0aGlzIGlzIGEgcGVybWlzc2lvbiBjaGVjaywgY291bGQgdGhpcyBiZSBpc0F1ZGlvU2VydmVyT3JSb290VWlkKCk/CisgICAgaWYgKGlzQXVkaW9TZXJ2ZXJVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgcmV0dXJuIHRydWU7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNBdWRpb1NldHRpbmdzKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIik7CisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNBdWRpb1NldHRpbmdzKTsKKyAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1NFVFRJTkdTIik7CisgICAgcmV0dXJuIG9rOworfQorCitib29sIG1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSB7CisgICAgLy8gSU1QT1JUQU5UOiBVc2UgUGVybWlzc2lvbkNhY2hlIC0gbm90IGEgcnVudGltZSBwZXJtaXNzaW9uIGFuZCBtYXkgbm90IGNoYW5nZS4KKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNNb2RpZnlBdWRpb1JvdXRpbmcpOworICAgIGlmICghb2spIEFMT0dFKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0FVRElPX1JPVVRJTkciKTsKKyAgICByZXR1cm4gb2s7Cit9CisKK2Jvb2wgbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoKSB7CisgICAgcmV0dXJuIG1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKAorICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7Cit9CisKK2Jvb2wgbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICBpZiAoaXNBdWRpb1NlcnZlclVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSByZXR1cm4gdHJ1ZTsKKworICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoCisgICAgICAgICAgICAiYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9ERUZBVUxUX0FVRElPX0VGRkVDVFMiKTsKKyAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgorICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzTW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQsIHBpZCwgdWlkKTsKKyAgICBBTE9HRV9JRighb2ssICIlcygpOiBhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX0RFRkFVTFRfQVVESU9fRUZGRUNUUyBkZW5pZWQgZm9yIHVpZCAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgdWlkKTsKKyAgICByZXR1cm4gb2s7Cit9CisKK2Jvb2wgZHVtcEFsbG93ZWQoKSB7CisgICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNEdW1wKCJhbmRyb2lkLnBlcm1pc3Npb24uRFVNUCIpOworICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCisgICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzRHVtcCk7CisgICAgLy8gY29udmVudGlvbiBpcyBmb3IgY2FsbGVyIHRvIGR1bXAgYW4gZXJyb3IgbWVzc2FnZSB0byBmZCBpbnN0ZWFkIG9mIGxvZ2dpbmcgaGVyZQorICAgIC8vaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKTsKKyAgICByZXR1cm4gb2s7Cit9CisKK2Jvb2wgbW9kaWZ5UGhvbmVTdGF0ZUFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc01vZGlmeVBob25lU3RhdGUsIHBpZCwgdWlkKTsKKyAgICBBTE9HRV9JRighb2ssICJSZXF1ZXN0IHJlcXVpcmVzICVzIiwgU3RyaW5nOChzTW9kaWZ5UGhvbmVTdGF0ZSkuY19zdHIoKSk7CisgICAgcmV0dXJuIG9rOworfQorCisvLyBwcml2aWxlZ2VkIGJlaGF2aW9yIG5lZWRlZCBieSBEaWFsZXIsIFNldHRpbmdzLCBTZXR1cFdpemFyZCBhbmQgQ2VsbEJyb2FkY2FzdFJlY2VpdmVyCitib29sIGJ5cGFzc0ludGVycnVwdGlvblBvbGljeUFsbG93ZWQocGlkX3QgcGlkLCB1aWRfdCB1aWQpIHsKKyAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc1dyaXRlU2VjdXJlU2V0dGluZ3MoImFuZHJvaWQucGVybWlzc2lvbi5XUklURV9TRUNVUkVfU0VUVElOR1MiKTsKKyAgICBib29sIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja1Blcm1pc3Npb24oc01vZGlmeVBob25lU3RhdGUsIHBpZCwgdWlkKQorICAgICAgICB8fCBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrUGVybWlzc2lvbihzV3JpdGVTZWN1cmVTZXR0aW5ncywgcGlkLCB1aWQpCisgICAgICAgIHx8IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNNb2RpZnlBdWRpb1JvdXRpbmcsIHBpZCwgdWlkKTsKKyAgICBBTE9HRV9JRighb2ssICJSZXF1ZXN0IHJlcXVpcmVzICVzIG9yICVzIiwKKyAgICAgICAgICAgICBTdHJpbmc4KHNNb2RpZnlQaG9uZVN0YXRlKS5jX3N0cigpLCBTdHJpbmc4KHNXcml0ZVNlY3VyZVNldHRpbmdzKS5jX3N0cigpKTsKKyAgICByZXR1cm4gb2s7Cit9CisKK3N0YXR1c190IGNoZWNrSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSkKK3sKKyAgICBpZiAoaU1lbW9yeSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlcyBjaGVjayBmYWlsZWQ6IE5VTEwgSU1lbW9yeSBwb2ludGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxJTWVtb3J5SGVhcD4gaGVhcCA9IGlNZW1vcnktPmdldE1lbW9yeSgpOworICAgIGlmIChoZWFwID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzIGNoZWNrIGZhaWxlZDogTlVMTCBoZWFwIHBvaW50ZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG9mZl90IHNpemUgPSBsc2VlayhoZWFwLT5nZXRIZWFwSUQoKSwgMCwgU0VFS19FTkQpOworICAgIGxzZWVrKGhlYXAtPmdldEhlYXBJRCgpLCAwLCBTRUVLX1NFVCk7CisKKyAgICBpZiAoaU1lbW9yeS0+cG9pbnRlcigpID09IE5VTEwgfHwgc2l6ZSA8IChvZmZfdClpTWVtb3J5LT5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNoZWNrIGZhaWxlZDogcG9pbnRlciAlcCBzaXplICV6dSBmZCBzaXplICV1IiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpTWVtb3J5LT5wb2ludGVyKCksIGlNZW1vcnktPnNpemUoKSwgKHVpbnQzMl90KXNpemUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3A8Y29udGVudDo6cG06OklQYWNrYWdlTWFuYWdlck5hdGl2ZT4gTWVkaWFQYWNrYWdlTWFuYWdlcjo6cmV0cmVpdmVQYWNrYWdlTWFuYWdlcigpIHsKKyAgICBjb25zdCBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7CisgICAgaWYgKHNtID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBmYWlsZWQgdG8gcmV0cmlldmUgZGVmYXVsdFNlcnZpY2VNYW5hZ2VyIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3A8SUJpbmRlcj4gcGFja2FnZU1hbmFnZXIgPSBzbS0+Y2hlY2tTZXJ2aWNlKFN0cmluZzE2KG5hdGl2ZVBhY2thZ2VNYW5hZ2VyTmFtZSkpOworICAgIGlmIChwYWNrYWdlTWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dXKCIlczogZmFpbGVkIHRvIHJldHJpZXZlIG5hdGl2ZSBwYWNrYWdlIG1hbmFnZXIiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gaW50ZXJmYWNlX2Nhc3Q8Y29udGVudDo6cG06OklQYWNrYWdlTWFuYWdlck5hdGl2ZT4ocGFja2FnZU1hbmFnZXIpOworfQorCitzdGQ6Om9wdGlvbmFsPGJvb2w+IE1lZGlhUGFja2FnZU1hbmFnZXI6OmRvSXNBbGxvd2VkKHVpZF90IHVpZCkgeworICAgIGlmIChtUGFja2FnZU1hbmFnZXIgPT0gbnVsbHB0cikgeworICAgICAgICAvKiogQ2FuIG5vdCBmZXRjaCBwYWNrYWdlIG1hbmFnZXIgYXQgY29uc3RydWN0aW9uIGl0IG1heSBub3QgeWV0IGJlIHJlZ2lzdGVyZWQuICovCisgICAgICAgIG1QYWNrYWdlTWFuYWdlciA9IHJldHJlaXZlUGFja2FnZU1hbmFnZXIoKTsKKyAgICAgICAgaWYgKG1QYWNrYWdlTWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IFBsYXliYWNrIGNhcHR1cmUgaXMgZGVuaWVkIGFzIHBhY2thZ2UgbWFuYWdlciBpcyBub3QgcmVhY2hhYmxlIiwgX19mdW5jX18pOworICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwYWNrYWdlTmFtZXM7CisgICAgYXV0byBzdGF0dXMgPSBtUGFja2FnZU1hbmFnZXItPmdldE5hbWVzRm9yVWlkcyh7KGludDMyX3QpdWlkfSwgJnBhY2thZ2VOYW1lcyk7CisgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIEFMT0dXKCIlczogUGxheWJhY2sgY2FwdHVyZSBpcyBkZW5pZWQgZm9yIHVpZCAldSBhcyB0aGUgcGFja2FnZSBuYW1lcyBjb3VsZCBub3QgYmUgIgorICAgICAgICAgICAgICAicmV0cmlldmVkIGZyb20gdGhlIHBhY2thZ2UgbWFuYWdlcjogJXMiLCBfX2Z1bmNfXywgdWlkLCBzdGF0dXMudG9TdHJpbmc4KCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBzdGQ6Om51bGxvcHQ7CisgICAgfQorICAgIGlmIChwYWNrYWdlTmFtZXMuZW1wdHkoKSkgeworICAgICAgICBBTE9HVygiJXM6IFBsYXliYWNrIGNhcHR1cmUgZm9yIHVpZCAldSBpcyBkZW5pZWQgYXMgbm8gcGFja2FnZSBuYW1lIGNvdWxkIGJlIHJldHJpZXZlZCAiCisgICAgICAgICAgICAgICJmcm9tIHRoZSBwYWNrYWdlIG1hbmFnZXI6ICVzIiwgX19mdW5jX18sIHVpZCwgc3RhdHVzLnRvU3RyaW5nOCgpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gc3RkOjpudWxsb3B0OworICAgIH0KKyAgICBzdGQ6OnZlY3Rvcjxib29sPiBpc0FsbG93ZWQ7CisgICAgc3RhdHVzID0gbVBhY2thZ2VNYW5hZ2VyLT5pc0F1ZGlvUGxheWJhY2tDYXB0dXJlQWxsb3dlZChwYWNrYWdlTmFtZXMsICZpc0FsbG93ZWQpOworICAgIGlmICghc3RhdHVzLmlzT2soKSkgeworICAgICAgICBBTE9HVygiJXM6IFBsYXliYWNrIGNhcHR1cmUgaXMgZGVuaWVkIGZvciB1aWQgJXUgYXMgdGhlIG1hbmlmZXN0IHByb3BlcnR5IGNvdWxkIG5vdCBiZSAiCisgICAgICAgICAgICAgICJyZXRyaWV2ZWQgZnJvbSB0aGUgcGFja2FnZSBtYW5hZ2VyOiAlcyIsIF9fZnVuY19fLCB1aWQsIHN0YXR1cy50b1N0cmluZzgoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKKyAgICB9CisgICAgaWYgKHBhY2thZ2VOYW1lcy5zaXplKCkgIT0gaXNBbGxvd2VkLnNpemUoKSkgeworICAgICAgICBBTE9HVygiJXM6IFBsYXliYWNrIGNhcHR1cmUgaXMgZGVuaWVkIGZvciB1aWQgJXUgYXMgdGhlIHBhY2thZ2UgbWFuYWdlciByZXR1cm5lZCBpbmNvaGVyZW50IgorICAgICAgICAgICAgICAiIHJlc3BvbnNlIHNpemU6ICV6dSAhPSAlenUiLCBfX2Z1bmNfXywgdWlkLCBwYWNrYWdlTmFtZXMuc2l6ZSgpLCBpc0FsbG93ZWQuc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVsbG9wdDsKKyAgICB9CisKKyAgICAvLyBaaXAgdG9nZXRoZXIgcGFja2FnZU5hbWVzIGFuZCBpc0FsbG93ZWQgZm9yIGRlYnVnIGxvZ3MKKyAgICBQYWNrYWdlcyYgcGFja2FnZXMgPSBtRGVidWdMb2dbdWlkXTsKKyAgICBwYWNrYWdlcy5yZXNpemUocGFja2FnZU5hbWVzLnNpemUoKSk7IC8vIFJldXNlIGFsbCBvYmplY3RzCisgICAgc3RkOjp0cmFuc2Zvcm0oYmVnaW4ocGFja2FnZU5hbWVzKSwgZW5kKHBhY2thZ2VOYW1lcyksIGJlZ2luKGlzQWxsb3dlZCksCisgICAgICAgICAgICAgICAgICAgYmVnaW4ocGFja2FnZXMpLCBbXSAoYXV0byYgbmFtZSwgYm9vbCBpc0FsbG93ZWQpIC0+IFBhY2thZ2UgeworICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4ge3N0ZDo6bW92ZShuYW1lKSwgaXNBbGxvd2VkfTsKKyAgICAgICAgICAgICAgICAgICB9KTsKKworICAgIC8vIE9ubHkgYWxsb3cgcGxheWJhY2sgcmVjb3JkIGlmIGFsbCBwYWNrYWdlcyBpbiB0aGlzIFVJRCBhbGxvdyBpdAorICAgIGJvb2wgcGxheWJhY2tDYXB0dXJlQWxsb3dlZCA9IHN0ZDo6YWxsX29mKGJlZ2luKGlzQWxsb3dlZCksIGVuZChpc0FsbG93ZWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXShib29sIGIpIHsgcmV0dXJuIGI7IH0pOworCisgICAgcmV0dXJuIHBsYXliYWNrQ2FwdHVyZUFsbG93ZWQ7Cit9CisKK3ZvaWQgTWVkaWFQYWNrYWdlTWFuYWdlcjo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0IHsKKyAgICBkcHJpbnRmKGZkLCAiJSpzQWxsb3cgcGxheWJhY2sgY2FwdHVyZSBsb2c6XG4iLCBzcGFjZXMsICIiKTsKKyAgICBpZiAobVBhY2thZ2VNYW5hZ2VyID09IG51bGxwdHIpIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiUqc05vIHBhY2thZ2UgbWFuYWdlclxuIiwgc3BhY2VzICsgMiwgIiIpOworICAgIH0KKyAgICBkcHJpbnRmKGZkLCAiJSpzUGFja2FnZSBtYW5hZ2VyIGVycm9yczogJXVcbiIsIHNwYWNlcyArIDIsICIiLCBtUGFja2FnZU1hbmFnZXJFcnJvcnMpOworCisgICAgZm9yIChjb25zdCBhdXRvJiB1aWRDYWNoZSA6IG1EZWJ1Z0xvZykgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhY2thZ2UgOiBzdGQ6OmdldDxQYWNrYWdlcz4odWlkQ2FjaGUpKSB7CisgICAgICAgICAgICBkcHJpbnRmKGZkLCAiJSpzLSB1aWQ9JTV1LCBhbGxvd1BsYXliYWNrQ2FwdHVyZT0lcywgcGFja2FnZU5hbWU9JXNcbiIsIHNwYWNlcyArIDIsICIiLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmdldDxjb25zdCB1aWRfdD4odWlkQ2FjaGUpLAorICAgICAgICAgICAgICAgICAgICBwYWNrYWdlLnBsYXliYWNrQ2FwdHVyZUFsbG93ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwKKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZS5uYW1lLmNfc3RyKCkpOworICAgICAgICB9CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9UaW1lQ2hlY2suY3BwIGIvbWVkaWEvdXRpbHMvVGltZUNoZWNrLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OWQ3NGRlCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvVGltZUNoZWNrLmNwcApAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiVGltZUNoZWNrIgorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9UaW1lQ2hlY2suaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL0V2ZW50TG9nLmg+CisjaW5jbHVkZSAiZGVidWdnZXJkL2hhbmRsZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBBdWRpbyBIQUwgc2VydmVyIHBpZHMgdmVjdG9yIHVzZWQgdG8gZ2VuZXJhdGUgYXVkaW8gSEFMIHByb2Nlc3NlcyB0b21ic3RvbmUKKy8vIHdoZW4gYXVkaW9zZXJ2ZXIgd2F0Y2hkb2cgdHJpZ2dlcnMuCisvLyBXZSB1c2UgYSBsb2NrbGVzcyBzdG9yYWdlIHRvIGF2b2lkIHBvdGVudGlhbCBkZWFkbG9ja3MgaW4gdGhlIGNvbnRleHQgb2Ygd2F0Y2hkb2cKKy8vIHRyaWdnZXIuCisvLyBQcm90ZWN0aW9uIGFnYWluIHNpbXVsdGFuZW91cyB3cml0ZXMgaXMgbm90IG5lZWRlZCBnaXZlbiBvbmUgdXBkYXRlIHRha2VzIHBsYWNlCisvLyBkdXJpbmcgQXVkaW9GbGluZ2VyIGNvbnN0cnVjdGlvbiBhbmQgb3RoZXIgY29tZXMgbmVjZXNzYXJpbHkgbGF0ZXIgb25jZSB0aGUgSUF1ZGlvRmxpbmdlcgorLy8gaW50ZXJmYWNlIGlzIGF2YWlsYWJsZS4KKy8vIFRoZSB1c2Ugb2YgYW4gYXRvbWljIGluZGV4IGp1c3QgZ3VhcmFudGllcyB0aGF0IGN1cnJlbnQgdmVjdG9yIGlzIGZ1bGx5IGluaXRpYWxpemVkCisvLyB3aGVuIHJlYWQuCisvKiBzdGF0aWMgKi8KK3ZvaWQgVGltZUNoZWNrOjphY2Nlc3NBdWRpb0hhbFBpZHMoc3RkOjp2ZWN0b3I8cGlkX3Q+KiBwaWRzLCBib29sIHVwZGF0ZSkgeworICAgIHN0YXRpYyBjb25zdGV4cHIgaW50IGtOdW1BdWRpb0hhbFBpZHNWZWN0b3JzID0gMzsKKyAgICBzdGF0aWMgc3RkOjp2ZWN0b3I8cGlkX3Q+IGF1ZGlvSGFsUGlkc1trTnVtQXVkaW9IYWxQaWRzVmVjdG9yc107CisgICAgc3RhdGljIHN0ZDo6YXRvbWljPGludD4gY3VyQXVkaW9IYWxQaWRzID0gMDsKKworICAgIGlmICh1cGRhdGUpIHsKKyAgICAgICAgYXVkaW9IYWxQaWRzWyhjdXJBdWRpb0hhbFBpZHMgKyAxKSAlIGtOdW1BdWRpb0hhbFBpZHNWZWN0b3JzXSA9ICpwaWRzOworICAgICAgICBjdXJBdWRpb0hhbFBpZHMrKzsKKyAgICB9IGVsc2UgeworICAgICAgICAqcGlkcyA9IGF1ZGlvSGFsUGlkc1tjdXJBdWRpb0hhbFBpZHNdOworICAgIH0KK30KKworLyogc3RhdGljICovCit2b2lkIFRpbWVDaGVjazo6c2V0QXVkaW9IYWxQaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHBpZF90PiYgcGlkcykgeworICAgIGFjY2Vzc0F1ZGlvSGFsUGlkcygmKGNvbnN0X2Nhc3Q8c3RkOjp2ZWN0b3I8cGlkX3Q+Jj4ocGlkcykpLCB0cnVlKTsKK30KKworLyogc3RhdGljICovCitzdGQ6OnZlY3RvcjxwaWRfdD4gVGltZUNoZWNrOjpnZXRBdWRpb0hhbFBpZHMoKSB7CisgICAgc3RkOjp2ZWN0b3I8cGlkX3Q+IHBpZHM7CisgICAgYWNjZXNzQXVkaW9IYWxQaWRzKCZwaWRzLCBmYWxzZSk7CisgICAgcmV0dXJuIHBpZHM7Cit9CisKKy8qIHN0YXRpYyAqLworc3A8VGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ+IFRpbWVDaGVjazo6Z2V0VGltZUNoZWNrVGhyZWFkKCkKK3sKKyAgICBzdGF0aWMgc3A8VGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ+IHNUaW1lQ2hlY2tUaHJlYWQgPSBuZXcgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQoKTsKKyAgICByZXR1cm4gc1RpbWVDaGVja1RocmVhZDsKK30KKworVGltZUNoZWNrOjpUaW1lQ2hlY2soY29uc3QgY2hhciAqdGFnLCB1aW50MzJfdCB0aW1lb3V0TXMpCisgICAgOiBtRW5kVGltZU5zKGdldFRpbWVDaGVja1RocmVhZCgpLT5zdGFydE1vbml0b3JpbmcodGFnLCB0aW1lb3V0TXMpKQoreworfQorCitUaW1lQ2hlY2s6On5UaW1lQ2hlY2soKSB7CisgICAgZ2V0VGltZUNoZWNrVGhyZWFkKCktPnN0b3BNb25pdG9yaW5nKG1FbmRUaW1lTnMpOworfQorCitUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6flRpbWVDaGVja1RocmVhZCgpCit7CisgICAgQXV0b011dGV4IF9sKG1NdXRleCk7CisgICAgcmVxdWVzdEV4aXQoKTsKKyAgICBtTW9uaXRvclJlcXVlc3RzLmNsZWFyKCk7CisgICAgbUNvbmQuc2lnbmFsKCk7Cit9CisKK25zZWNzX3QgVGltZUNoZWNrOjpUaW1lQ2hlY2tUaHJlYWQ6OnN0YXJ0TW9uaXRvcmluZyhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTXV0ZXgpOworICAgIG5zZWNzX3QgZW5kVGltZU5zID0gc3lzdGVtVGltZSgpICsgbWlsbGlzZWNvbmRzKHRpbWVvdXRNcyk7CisgICAgZm9yICg7IG1Nb25pdG9yUmVxdWVzdHMuaW5kZXhPZktleShlbmRUaW1lTnMpID49IDA7ICsrZW5kVGltZU5zKTsKKyAgICBtTW9uaXRvclJlcXVlc3RzLmFkZChlbmRUaW1lTnMsIHRhZyk7CisgICAgbUNvbmQuc2lnbmFsKCk7CisgICAgcmV0dXJuIGVuZFRpbWVOczsKK30KKwordm9pZCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6c3RvcE1vbml0b3JpbmcobnNlY3NfdCBlbmRUaW1lTnMpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobU11dGV4KTsKKyAgICBtTW9uaXRvclJlcXVlc3RzLnJlbW92ZUl0ZW0oZW5kVGltZU5zKTsKKyAgICBtQ29uZC5zaWduYWwoKTsKK30KKworYm9vbCBUaW1lQ2hlY2s6OlRpbWVDaGVja1RocmVhZDo6dGhyZWFkTG9vcCgpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gVElNRURfT1VUOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IF9sKG1NdXRleCk7CisKKyAgICAgICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIG5zZWNzX3QgZW5kVGltZU5zID0gSU5UNjRfTUFYOworICAgICAgICBjb25zdCBjaGFyICp0YWcgPSAiPHVuc3BlY2lmaWVkPiI7CisgICAgICAgIC8vIEtleWVkVmVjdG9yIG1Nb25pdG9yUmVxdWVzdHMgaXMgb3JkZXJlZCBzbyB0YWtlIGZpcnN0IGVudHJ5IGFzIG5leHQgdGltZW91dAorICAgICAgICBpZiAobU1vbml0b3JSZXF1ZXN0cy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgZW5kVGltZU5zID0gbU1vbml0b3JSZXF1ZXN0cy5rZXlBdCgwKTsKKyAgICAgICAgICAgIHRhZyA9IG1Nb25pdG9yUmVxdWVzdHMudmFsdWVBdCgwKTsKKyAgICAgICAgfQorCisgICAgICAgIGNvbnN0IG5zZWNzX3Qgd2FpdFRpbWVOcyA9IGVuZFRpbWVOcyAtIHN5c3RlbVRpbWUoKTsKKyAgICAgICAgaWYgKHdhaXRUaW1lTnMgPiAwKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBtQ29uZC53YWl0UmVsYXRpdmUobU11dGV4LCB3YWl0VGltZU5zKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAvLyBHZW5lcmF0ZSBhdWRpbyBIQUwgcHJvY2Vzc2VzIHRvbWJzdG9uZXMgYW5kIGFsbG93IHRpbWUgdG8gY29tcGxldGUKKyAgICAgICAgICAgIC8vIGJlZm9yZSBmb3JjaW5nIHJlc3RhcnQKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHBpZF90PiBwaWRzID0gZ2V0QXVkaW9IYWxQaWRzKCk7CisgICAgICAgICAgICBpZiAocGlkcy5zaXplKCkgIT0gMCkgeworICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGlkIDogcGlkcykgeworICAgICAgICAgICAgICAgICAgICBBTE9HSSgicmVxdWVzdGluZyB0b21ic3RvbmUgZm9yIHBpZDogJWQiLCBwaWQpOworICAgICAgICAgICAgICAgICAgICBzaWdxdWV1ZShwaWQsIERFQlVHR0VSX1NJR05BTCwgey5zaXZhbF9pbnQgPSAwfSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHNsZWVwKDEpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HSSgiTm8gSEFMIHByb2Nlc3MgcGlkIGF2YWlsYWJsZSwgc2tpcHBpbmcgdG9tYnN0b25lcyIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgTE9HX0VWRU5UX1NUUklORyhMT0dUQUdfQVVESU9fQklOREVSX1RJTUVPVVQsIHRhZyk7CisgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJUaW1lQ2hlY2sgdGltZW91dCBmb3IgJXMiLCB0YWcpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmggYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOWJkZTFmCi0tLSAvZGV2L251bGwKKysrIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL0FJbWFnZVJlYWRlclV0aWxzLmgKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQUlNQUdFX1JFQURFUl9VVElMU19ICisjZGVmaW5lIEFJTUFHRV9SRUFERVJfVVRJTFNfSAorCisjaW5jbHVkZSA8Y3V0aWxzL25hdGl2ZV9oYW5kbGUuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2dyYXBoaWNzL2J1ZmZlcnF1ZXVlLzEuMC9JR3JhcGhpY0J1ZmZlclByb2R1Y2VyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhaW1nIHsKKwordXNpbmcgSEdyYXBoaWNCdWZmZXJQcm9kdWNlciA9IGhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7CisKKy8vIFJldHJpZXZlcyBIR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5hdGl2ZV9oYW5kbGVfdAorLy8gcHJvdmlkZWQgKHRoaXMgbmF0aXZlIGhhbmRsZSBNVVNUIGhhdmUgYmVlbiBvYnRhaW5lZCBieSBBSW1hZ2VSZWFkZXJfZ2V0V2luZG93TmF0aXZlSGFuZGxlKCkpLgorc3A8SEdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gQUltYWdlUmVhZGVyX2dldEhHQlBGcm9tSGFuZGxlKGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCAqaGFuZGxlKTsKKworfS8vIG5hbWVzcGFjZSBhaW1nCit9Ly8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vQUlNQUdFX1JFQURFUl9VVElMU19ICmRpZmYgLS1naXQgYS9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvRXZlbnRMb2cuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9FdmVudExvZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1M2QzYmQKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvRXZlbnRMb2cuaApAQCAtMCwwICsxLDI4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpZm5kZWYgQU5EUk9JRF9BVURJT19FVkVOVF9MT0dfSF8KKyNkZWZpbmUgQU5EUk9JRF9BVURJT19FVkVOVF9MT0dfSF8KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBrZWVwIHZhbHVlcyBpbiBzeW5jIHdpdGggZnJhbWV3b3Jrcy9hdi9tZWRpYS91dGlscy9FdmVudExvZ1RhZ3MubG9ndGFncworZW51bSB7CisgIExPR1RBR19BVURJT19CSU5ERVJfVElNRU9VVCA9IDYxMDAwLAorfTsKKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmICAvLyBBTkRST0lEX0FVRElPX0VWRU5UX0xPR19IXwpkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaCBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU3NjhiZAotLS0gL2Rldi9udWxsCisrKyBiL21lZGlhL3V0aWxzL2luY2x1ZGUvbWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfTUVESUFVVElMU19TRVJWSUNFVVRJTElUSUVTX0gKKyNkZWZpbmUgQU5EUk9JRF9NRURJQVVUSUxTX1NFUlZJQ0VVVElMSVRJRVNfSAorCisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2NvbnRlbnQvcG0vSVBhY2thZ2VNYW5hZ2VyTmF0aXZlLmg+CisjaW5jbHVkZSA8YmluZGVyL0lNZW1vcnkuaD4KKyNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNvbnRyb2xsZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8b3B0aW9uYWw+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBBdWRpbyBwZXJtaXNzaW9uIHV0aWxpdGllcworCisvLyBVc2VkIGZvciBjYWxscyB0aGF0IHNob3VsZCBvcmlnaW5hdGUgZnJvbSBzeXN0ZW0gc2VydmljZXMuCisvLyBXZSBhbGxvdyB0aGF0IHNvbWUgc2VydmljZXMgbWlnaHQgaGF2ZSBzZXBhcmF0ZSBwcm9jZXNzZXMgdG8KKy8vIGhhbmRsZSBtdWx0aXBsZSB1c2VycywgZS5nLiB1MTBfc3lzdGVtLCB1MTBfYmx1ZXRvb3RoLCB1MTBfcmFkaW8uCitzdGF0aWMgaW5saW5lIGJvb2wgaXNTZXJ2aWNlVWlkKHVpZF90IHVpZCkgeworICAgIHJldHVybiBtdWx0aXVzZXJfZ2V0X2FwcF9pZCh1aWQpIDwgQUlEX0FQUF9TVEFSVDsKK30KKworLy8gVXNlZCBmb3IgY2FsbHMgdGhhdCBzaG91bGQgb3JpZ2luYXRlIGZyb20gYXVkaW9zZXJ2ZXIuCitzdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1NlcnZlclVpZCh1aWRfdCB1aWQpIHsKKyAgICByZXR1cm4gdWlkID09IEFJRF9BVURJT1NFUlZFUjsKK30KKworLy8gVXNlZCBmb3Igc29tZSBwZXJtaXNzaW9uIGNoZWNrcy4KKy8vIEFJRF9ST09UIGlzIE9LIGZvciBjb21tYW5kLWxpbmUgdGVzdHMuICBOYXRpdmUgYXVkaW9zZXJ2ZXIgYWx3YXlzIE9LLgorc3RhdGljIGlubGluZSBib29sIGlzQXVkaW9TZXJ2ZXJPclJvb3RVaWQodWlkX3QgdWlkKSB7CisgICAgcmV0dXJuIHVpZCA9PSBBSURfQVVESU9TRVJWRVIgfHwgdWlkID09IEFJRF9ST09UOworfQorCisvLyBVc2VkIGZvciBjYWxscyB0aGF0IHNob3VsZCBjb21lIGZyb20gc3lzdGVtIHNlcnZlciBvciBpbnRlcm5hbC4KKy8vIE5vdGU6IHN5c3RlbSBzZXJ2ZXIgaXMgbXVsdGlwcm9jZXNzIGZvciBtdWx0aXBsZSB1c2Vycy4gIGF1ZGlvc2VydmVyIGlzIG5vdC4KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0F1ZGlvU2VydmVyT3JTeXN0ZW1TZXJ2ZXJVaWQodWlkX3QgdWlkKSB7CisgICAgcmV0dXJuIG11bHRpdXNlcl9nZXRfYXBwX2lkKHVpZCkgPT0gQUlEX1NZU1RFTSB8fCB1aWQgPT0gQUlEX0FVRElPU0VSVkVSOworfQorCisvLyB1c2VkIGZvciBjYWxscyB0aGF0IHNob3VsZCBjb21lIGZyb20gc3lzdGVtX3NlcnZlciBvciBhdWRpb19zZXJ2ZXIgYW5kCisvLyBpbmNsdWRlIEFJRF9ST09UIGZvciBjb21tYW5kLWxpbmUgdGVzdHMuCitzdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1NlcnZlck9yU3lzdGVtU2VydmVyT3JSb290VWlkKHVpZF90IHVpZCkgeworICAgIHJldHVybiBtdWx0aXVzZXJfZ2V0X2FwcF9pZCh1aWQpID09IEFJRF9TWVNURU0gfHwgdWlkID09IEFJRF9BVURJT1NFUlZFUiB8fCB1aWQgPT0gQUlEX1JPT1Q7Cit9CisKKy8vIE1lZGlhc2VydmVyIG1heSBmb3J3YXJkIHRoZSBjbGllbnQgUElEIGFuZCBVSUQgYXMgcGFydCBvZiBhIGJpbmRlciBpbnRlcmZhY2UgY2FsbDsKKy8vIG90aGVyd2lzZSB0aGUgY2FsbGluZyBVSUQgbXVzdCBiZSBlcXVhbCB0byB0aGUgY2xpZW50IFVJRC4KK3N0YXRpYyBpbmxpbmUgYm9vbCBpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZCh1aWRfdCB1aWQpIHsKKyAgICBzd2l0Y2ggKHVpZCkgeworICAgIGNhc2UgQUlEX01FRElBOgorICAgIGNhc2UgQUlEX0FVRElPU0VSVkVSOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorfQorCitib29sIHJlY29yZGluZ0FsbG93ZWQoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKK2Jvb2wgc3RhcnRSZWNvcmRpbmcoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsIHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKK3ZvaWQgZmluaXNoUmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCB1aWRfdCB1aWQpOworYm9vbCBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKK2Jvb2wgY2FwdHVyZU1lZGlhT3V0cHV0QWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Citib29sIGNhcHR1cmVIb3R3b3JkQWxsb3dlZChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgcGlkX3QgcGlkLCB1aWRfdCB1aWQpOworYm9vbCBzZXR0aW5nc0FsbG93ZWQoKTsKK2Jvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpOworYm9vbCBtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZCgpOworYm9vbCBtb2RpZnlEZWZhdWx0QXVkaW9FZmZlY3RzQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Citib29sIGR1bXBBbGxvd2VkKCk7Citib29sIG1vZGlmeVBob25lU3RhdGVBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKK2Jvb2wgYnlwYXNzSW50ZXJydXB0aW9uUG9saWN5QWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7CisKK3N0YXR1c190IGNoZWNrSU1lbW9yeShjb25zdCBzcDxJTWVtb3J5PiYgaU1lbW9yeSk7CisKK2NsYXNzIE1lZGlhUGFja2FnZU1hbmFnZXIgeworcHVibGljOgorICAgIC8qKiBRdWVyeSB0aGUgUGFja2FnZU1hbmFnZXIgdG8gY2hlY2sgaWYgYWxsIGFwcHMgb2YgYW4gVUlEIGFsbG93IHBsYXliYWNrIGNhcHR1cmUuICovCisgICAgYm9vbCBhbGxvd1BsYXliYWNrQ2FwdHVyZSh1aWRfdCB1aWQpIHsKKyAgICAgICAgYXV0byByZXN1bHQgPSBkb0lzQWxsb3dlZCh1aWQpOworICAgICAgICBpZiAoIXJlc3VsdCkgeworICAgICAgICAgICAgbVBhY2thZ2VNYW5hZ2VyRXJyb3JzKys7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJlc3VsdC52YWx1ZV9vcihmYWxzZSk7CisgICAgfQorICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMgPSAwKSBjb25zdDsKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyKiBuYXRpdmVQYWNrYWdlTWFuYWdlck5hbWUgPSAicGFja2FnZV9uYXRpdmUiOworICAgIHN0ZDo6b3B0aW9uYWw8Ym9vbD4gZG9Jc0FsbG93ZWQodWlkX3QgdWlkKTsKKyAgICBzcDxjb250ZW50OjpwbTo6SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPiByZXRyZWl2ZVBhY2thZ2VNYW5hZ2VyKCk7CisgICAgc3A8Y29udGVudDo6cG06OklQYWNrYWdlTWFuYWdlck5hdGl2ZT4gbVBhY2thZ2VNYW5hZ2VyOyAvLyBUbyBjaGVjayBhcHBzIG1hbmlmZXN0CisgICAgdWludF90IG1QYWNrYWdlTWFuYWdlckVycm9ycyA9IDA7CisgICAgc3RydWN0IFBhY2thZ2UgeworICAgICAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgICAgICBib29sIHBsYXliYWNrQ2FwdHVyZUFsbG93ZWQgPSBmYWxzZTsKKyAgICB9OworICAgIHVzaW5nIFBhY2thZ2VzID0gc3RkOjp2ZWN0b3I8UGFja2FnZT47CisgICAgc3RkOjptYXA8dWlkX3QsIFBhY2thZ2VzPiBtRGVidWdMb2c7Cit9OworfQorCisjZW5kaWYgLy8gQU5EUk9JRF9NRURJQVVUSUxTX1NFUlZJQ0VVVElMSVRJRVNfSApkaWZmIC0tZ2l0IGEvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1RpbWVDaGVjay5oIGIvbWVkaWEvdXRpbHMvaW5jbHVkZS9tZWRpYXV0aWxzL1RpbWVDaGVjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYTZkN2MKLS0tIC9kZXYvbnVsbAorKysgYi9tZWRpYS91dGlscy9pbmNsdWRlL21lZGlhdXRpbHMvVGltZUNoZWNrLmgKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKworI2lmbmRlZiBBTkRST0lEX1RJTUVfQ0hFQ0tfSAorI2RlZmluZSBBTkRST0lEX1RJTUVfQ0hFQ0tfSAorCisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9UaHJlYWQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gQSBjbGFzcyBtb25pdG9yaW5nIGV4ZWN1dGlvbiB0aW1lIGZvciBhIGNvZGUgYmxvY2sgKHNjb3BlZCB2YXJpYWJsZSkgYW5kIGNhdXNpbmcgYW4gYXNzZXJ0CisvLyBpZiBpdCBleGNlZWRzIGEgY2VydGFpbiB0aW1lCisKK2NsYXNzIFRpbWVDaGVjayB7CitwdWJsaWM6CisKKyAgICAvLyBUaGUgZGVmYXVsdCB0aW1lb3V0IGlzIGNob3NlbiB0byBiZSBsZXNzIHRoYW4gc3lzdGVtIHNlcnZlciB3YXRjaGRvZyB0aW1lb3V0CisgICAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBrRGVmYXVsdFRpbWVPdXRNcyA9IDUwMDA7CisKKyAgICAgICAgICAgIFRpbWVDaGVjayhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcyA9IGtEZWZhdWx0VGltZU91dE1zKTsKKyAgICAgICAgICAgIH5UaW1lQ2hlY2soKTsKKyAgICBzdGF0aWMgIHZvaWQgc2V0QXVkaW9IYWxQaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHBpZF90PiYgcGlkcyk7CisgICAgc3RhdGljICBzdGQ6OnZlY3RvcjxwaWRfdD4gZ2V0QXVkaW9IYWxQaWRzKCk7CisKK3ByaXZhdGU6CisKKyAgICBjbGFzcyBUaW1lQ2hlY2tUaHJlYWQgOiBwdWJsaWMgVGhyZWFkIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaW1lQ2hlY2tUaHJlYWQoKSB7fQorICAgICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5UaW1lQ2hlY2tUaHJlYWQoKSBvdmVycmlkZTsKKworICAgICAgICAgICAgICAgIG5zZWNzX3QgICAgIHN0YXJ0TW9uaXRvcmluZyhjb25zdCBjaGFyICp0YWcsIHVpbnQzMl90IHRpbWVvdXRNcyk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RvcE1vbml0b3JpbmcobnNlY3NfdCBlbmRUaW1lTnMpOworCisgICAgcHJpdmF0ZToKKworICAgICAgICAgICAgICAgIC8vIFJlZkJhc2UKKyAgICAgICAgdmlydHVhbCB2b2lkICAgICAgICBvbkZpcnN0UmVmKCkgb3ZlcnJpZGUgeyBydW4oIlRpbWVDaGVja1RocmVhZCIsIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7IH0KKworICAgICAgICAgICAgICAgIC8vIFRocmVhZAorICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIHRocmVhZExvb3AoKSBvdmVycmlkZTsKKworICAgICAgICAgICAgICAgIENvbmRpdGlvbiAgICAgICAgICAgbUNvbmQ7CisgICAgICAgICAgICAgICAgTXV0ZXggICAgICAgICAgICAgICBtTXV0ZXg7CisgICAgICAgICAgICAgICAgLy8gdXNpbmcgdGhlIGVuZCB0aW1lIGluIG5zIGFzIGtleSBpcyBPSyBnaXZlbiB0aGUgcmlzayBpcyBsb3cgdGhhdCB0d28gZW50cmllcworICAgICAgICAgICAgICAgIC8vIGFyZSBhZGRlZCBpbiBzdWNoIGEgd2F5IHRoYXQgPGFkZCB0aW1lPiArIDx0aW1lb3V0PiBhcmUgdGhlIHNhbWUgZm9yIGJvdGguCisgICAgICAgICAgICAgICAgS2V5ZWRWZWN0b3I8IG5zZWNzX3QsIGNvbnN0IGNoYXIqPiAgbU1vbml0b3JSZXF1ZXN0czsKKyAgICB9OworCisgICAgc3RhdGljIHNwPFRpbWVDaGVja1RocmVhZD4gZ2V0VGltZUNoZWNrVGhyZWFkKCk7CisgICAgc3RhdGljIHZvaWQgYWNjZXNzQXVkaW9IYWxQaWRzKHN0ZDo6dmVjdG9yPHBpZF90PiogcGlkcywgYm9vbCB1cGRhdGUpOworCisgICAgY29uc3QgICAgICAgICAgIG5zZWNzX3QgbUVuZFRpbWVOczsKK307CisKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9USU1FX0NIRUNLX0gKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkLm1rIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlZjlkYzUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0jCi0jIENvcHlyaWdodCAyMDE3IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0jCi0KLSMgVGhpcyBwYWNrYWdlIGlzIGV4Y2x1ZGVkIGZyb20gYnVpbGQgZm9yIG5vdyBzaW5jZSBBUElzIHVzaW5nIHRoaXMgYXBrIGJlY2FtZSBoaWRkZW4uCi0jCi0jTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotI2lmbmVxICgkKFRBUkdFVF9CVUlMRF9QREspLHRydWUpICMgQnVpbGQgTWVkaWFDb21wb25lbnRzIG9ubHkgaWYgdGhpcyBpcyBub3QgYSBQREsgYnVpbGQuICBNZWRpYUNvbXBvbmVudHMgd29uJ3QKLSMjIGJ1aWxkIGluIFBESyBidWlsZHMgYmVjYXVzZSBmcmFtZXdvcmtzL2Jhc2UvY29yZS9qYXZhIGlzIG5vdCBhdmFpbGFibGUgYnV0Ci0jIyBJTWVkaWFTZXNzaW9uMi5haWRsIGFuZCBJTWVkaWFDb250cm9sbGVyMi5haWRsIGFyZSB1c2luZyBjbGFzc2VzIGZyb20KLSMjIGZyYW1ld29ya3MvYmFzZS9jb3JlL2phdmEuCi0jCi0jaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0jCi0jTE9DQUxfUEFDS0FHRV9OQU1FIDo9IE1lZGlhQ29tcG9uZW50cwotI0xPQ0FMX01PRFVMRV9PV05FUiA6PSBnb29nbGUKLSMKLSMjIFRPRE86IGNyZWF0ZSBhIHNlcGFyYXRlIGtleSBmb3IgdGhpcyBwYWNrYWdlLgotI0xPQ0FMX0NFUlRJRklDQVRFIDo9IHBsYXRmb3JtCi0jCi0jIyBUT0RPOiBVc2UgU3lzdGVtIFNESyBvbmNlIHB1YmxpYyBBUElzIGFyZSBhcHByb3ZlZAotIyMgTE9DQUxfU0RLX1ZFUlNJT04gOj0gc3lzdGVtX2N1cnJlbnQKLSNMT0NBTF9QUklWQVRFX1BMQVRGT1JNX0FQSVMgOj0gdHJ1ZQotIwotI0xPQ0FMX1NSQ19GSUxFUyA6PSBcCi0jICAgICQoY2FsbCBhbGwtamF2YS1maWxlcy11bmRlciwgc3JjKSBcCi0jICAgICQoY2FsbCBhbGwtSWFpZGwtZmlsZXMtdW5kZXIsIHNyYykKLSMKLSNMT0NBTF9QUk9HVUFSRF9GTEFHX0ZJTEVTIDo9IHByb2d1YXJkLmNmZwotIwotI0xPQ0FMX01VTFRJTElCIDo9IGZpcnN0Ci0jCi0jTE9DQUxfSkFWQV9MSUJSQVJJRVMgKz0gYW5kcm9pZC1zdXBwb3J0LWFubm90YXRpb25zCi0jCi0jIyBUbyBlbWJlZCBuYXRpdmUgbGlicmFyaWVzIGluIHBhY2thZ2UsIHVuY29tbWVudCB0aGUgbGluZXMgYmVsb3cuCi0jI0xPQ0FMX01PRFVMRV9UQUdTIDo9IHNhbXBsZXMKLSMjTE9DQUxfSk5JX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotIyMgICAgbGliYWFjZXh0cmFjdG9yIFwKLSMjICAgIGxpYmFtcmV4dHJhY3RvciBcCi0jIyAgICBsaWJmbGFjZXh0cmFjdG9yIFwKLSMjICAgIGxpYm1pZGlleHRyYWN0b3IgXAotIyMgICAgbGlibWt2ZXh0cmFjdG9yIFwKLSMjICAgIGxpYm1wM2V4dHJhY3RvciBcCi0jIyAgICBsaWJtcDRleHRyYWN0b3IgXAotIyMgICAgbGlibXBlZzJleHRyYWN0b3IgXAotIyMgICAgbGlib2dnZXh0cmFjdG9yIFwKLSMjICAgIGxpYndhdmV4dHJhY3RvciBcCi0jCi0jIyBUT0RPOiBSZW1vdmUgZGVwZW5kZW5jeSB3aXRoIG90aGVyIHN1cHBvcnQgbGlicmFyaWVzLgotI0xPQ0FMX1NUQVRJQ19BTkRST0lEX0xJQlJBUklFUyArPSBcCi0jICAgIGFuZHJvaWQtc3VwcG9ydC12NCBcCi0jICAgIGFuZHJvaWQtc3VwcG9ydC12Ny1hcHBjb21wYXQgXAotIyAgICBhbmRyb2lkLXN1cHBvcnQtdjctcGFsZXR0ZQotI0xPQ0FMX1VTRV9BQVBUMiA6PSB0cnVlCi0jCi0jaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCi0jCi0jZW5kaWYgICMgaWZuZXEgKCQoVEFSR0VUX0JVSUxEX1BESyksdHJ1ZSkKLSMKLSNpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGZkY2ExLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxtYW5pZmVzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgcGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEudXBkYXRlIgotICAgIGFuZHJvaWQ6dmVyc2lvbkNvZGU9IjEiCi0gICAgYW5kcm9pZDp2ZXJzaW9uTmFtZT0iMS4wIiA+Ci0KLSAgICA8YXBwbGljYXRpb24KLSAgICAgICAgYW5kcm9pZDpsYWJlbD0iTWVkaWEgQ29tcG9uZW50cyBVcGRhdGUiCi0gICAgICAgIGFuZHJvaWQ6bXVsdGlBcmNoPSJ0cnVlIgotICAgICAgICBhbmRyb2lkOmFsbG93QmFja3VwPSJmYWxzZSIKLSAgICAgICAgYW5kcm9pZDpoYXNDb2RlPSJmYWxzZSIKLSAgICAgICAgYW5kcm9pZDpleHRyYWN0TmF0aXZlTGlicz0iZmFsc2UiPgotICAgIDwvYXBwbGljYXRpb24+Ci0KLTwvbWFuaWZlc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcHJvZ3VhcmQuY2ZnIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Byb2d1YXJkLmNmZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiZjczMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcHJvZ3VhcmQuY2ZnCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotIwotIyBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIwotCi0jIEtlZXAgZW50cnkgcG9pbnQgZm9yIHVwZGF0YWJsZSBKYXZhIGNsYXNzZXMKLS1rZWVwIHB1YmxpYyBjbGFzcyBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpRmFjdG9yeSB7Ci0gICBwdWJsaWMgc3RhdGljIGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlGYWN0b3J5IGluaXRpYWxpemUoYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbyk7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2ZkNTFmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2M4MjUyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjhkZGVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYTljZDc1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTkyYWQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjcwN2VhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzMyZDAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzQ1ZWUzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMWQzNDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkNmI2NWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9kaXNhYmxlZC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNTRmNjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY4ZmViZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbWVkaWFfc3VidGl0bGVfZW5hYmxlZC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGFkMzA1ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3ZmRlNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3MzlkZjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4YzM0NGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhMDM0MjAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDcyM2U0NTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0MGMyNWEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhZmRiOWMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODQ2YzEwOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLWhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMzYmY0ODQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtaGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM5MTFiNWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1oZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5NGVkNTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZjdlMGMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NTU4YTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwYTFhODQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OWFlZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wYXVzZV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MDY4ZWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljYzc3N2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyMDg3OTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2FkMmM5Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAwMmFiNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3VidGl0bGVfZGlzYWJsZWQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2Rpc2FibGVkLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM1NGY2MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbWVkaWFfc3VidGl0bGVfZGlzYWJsZWQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21lZGlhX3N1YnRpdGxlX2VuYWJsZWQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjhmZWJlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tZWRpYV9zdWJ0aXRsZV9lbmFibGVkLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDQ2ZWE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDc5MGM2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzQwMWRjMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI0ZDU4Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2NiYjc3Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2NjOTg0NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDIyNjE3ZTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGNlZmVmM2MuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YTAwNDdjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUtbWRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2E1ZDZhMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS1tZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODEzNDMxMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLW1kcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWM4OTlmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Nzc4ZTAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfYXVkaW90cmFja19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTkyZmM1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzg4NGU2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjBhYzY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTIxMDRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTVjMDYyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTJkNDk1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfcGxheV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyMzkzMzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViYzVhNmMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tZWRpYV9zdG9wX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZkZDIxNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI3YmRjZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2ZlNTc2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTVkNmFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhYWRmYTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNWZlMGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVjNDhhNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxZTkxMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTQyMThhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjMwZmFiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ3YWE5MDMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZTJmMjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTc4NzFlMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM1N2Y2My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDQxYjAxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGJiNjk0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZTEwMTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjMzUyYzMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA1MzJlOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2YmEzMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmEzYjVmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZDRiYjIyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxNTYxMjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI0MTdhOWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzExX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJmNjMzZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmE1MTgxMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTZhNTNjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzA1ZGNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwZTRlYTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJjNjcyNGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWUzYjQxMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYxOGFiZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZTgxMTMzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODBiMTkxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4YWJhM2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhMzRkNWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk5NTdiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVkMzg0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMThfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGM2Mjk3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOGFiNjg0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZTdmNzUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTNjYTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNhZWNkZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWI4ZDBiNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MDBiZTNjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTRmMWJmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMThiNDYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YzJjMDAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThmYWU0NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0YzI4OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWY5MzI3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNWUxZjY5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNmZhZmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMmJkODcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjczYTFmOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhjMTA2OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjJiODAzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGZiYTAyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1N2YyZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4ZjU0NzguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk5NWFmMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzUwYjdmMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMzBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZGQyMTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2JkY2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdmZTU3Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGE1ZDZhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWFkZmEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjVmZTBiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA1YzQ4YTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MWU5MTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0MjE4YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIzMGZhYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkN2FhOTAzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2UyZjI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3ODcxZTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNTdmNjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0MWIwMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiYjY5NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOGUxMDEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzM1MmMzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNTMyZTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNmJhMzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWJhM2I1Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0YmIyMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzU3MGY0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWE0MDNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NDRiZmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3ZDYwNDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUwZDU1OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNiYzQ4ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGQ4ZjhlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OGI5MGU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMjM0YTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3ZDQ1MmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgxY2Y1YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkMDhiNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZmViM2YxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFlOGIzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiMGZjMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyYTE2YWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM1OThjYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODQ2ZDE2ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDcwNDU1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTZkYjEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmMzgyOGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFhY2NjNzMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM4Y2VkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQwMWI5ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTMxZGQzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWY3OGU0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YzJjZGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU3YzViZWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNhZDBkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWZhNTkyMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNjg3ZTI1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzA2ZGI4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwMjI1YmEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5Njk3ZGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM3ZWMyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4NDBiZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDQ1ZTNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzM3YzY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZGQyMTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiN2JkY2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGRjMTMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTQ2MTdjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmIzMDc3My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA1ZDdkNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIzOGQ1OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTQwMzQ5ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGY2N2M0NjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdmY2ViZjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBlYTMyYTdhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZDYyY2EzNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMzEzMTI1Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXhoZHBpL2ljX3ZvbF90eXBlX3R2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMTMxZTFiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19hdWRpb3RyYWNrX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTk0NmEyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2F1ZGlvdHJhY2tfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfZGlhbG9nX2Nsb3NlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODVlODdmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19kaWFsb2dfY2xvc2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWI0NDAxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX2RpYWxvZ19jbG9zZV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wYXVzZV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWE3ZTAzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfcGF1c2VfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzYzNTM4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BhdXNlX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzQ1YzNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tZWRpYV9wbGF5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGEzYmE1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3BsYXlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAzNWNhMTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21lZGlhX3N0b3BfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhYzE4M2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbWVkaWFfc3RvcF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGRiNjc5ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFjNjA1MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDgzOTE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2MzY2FmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNDQ0Y2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiZDYzNzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiZDFkYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJlNzEwOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOWY1OTZiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjMyZTFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NjhlMDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkMjBkZDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJlMzllNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWVkYzE1Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGFlYmFmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWE2YTRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDdfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0YjkxY2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZjY2ZjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTFlYTM0Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUyZGUwNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjFhYTIxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MzRiY2MwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2NjZiMzUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0NWE4ZmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRlYjEzMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRhMmI2MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjgwYWE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTVlZmU0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMGNjMzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2YWU2ZmMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjg4MTZjOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQ0MjkzMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGQ1YjdmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDNhMGZlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjMmE2NTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZGViYzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlNzhhNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2EzZjk5MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2ZhZDllLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmRkOGQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MGZkNWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMGI1YzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlMWVmMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE3MTBkNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjFjMDgwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzRhYTIxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5YTZiMzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZThmZTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTdiODQwZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYyNDA1MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWMxOGMxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTk3NTNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmMjkxYjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjMWM2MTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjUwNGE3MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdlMGE2MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2IxZjNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI4X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YzU1MWVjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzODY2N2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYjgxODMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg5M2YxOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1ZTE1Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYjY3OWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxYzYwNTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA4MzkxNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzNjM2NhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzQ0NGNmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDJfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmQ2Mzc3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkYmQxZGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wM19saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyZTcxMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDlmNTk2Yi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzMmUxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNTY4ZTA0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDVfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZDIwZGQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA1X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiZTM5ZTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZGMxNWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzhhZWJhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjVhNmE0Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wN19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGI5MWNlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDhfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NWY2NmY5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA4X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxZWEzNGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MmRlMDQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIxYWEyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTM0YmNjMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmZmYTAxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTFfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmY3ZTU3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzExX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2YWM0ZGMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyYTg2ZjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMwMTA5MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM5NmYwZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xM19saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTkwMDFiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTRfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjcxNTgxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE0X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlOTYyMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmNjk1MDAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDdlMWJkNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlOGYxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjMyZTk1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWQ1ZDJlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2MGQ1MjcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3NjFhZTEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGFhM2Y4NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdkMTY2Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmU1MjdlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZWIyYThlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMzdhZjUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMV9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzZjMxZWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBkOWY1Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4ZWI3Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NmEwZTE0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjNfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQyNWUxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIzX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNzZlMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUwMmYxZWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVmZGNkZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlOWI4MTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjZfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI5ZTQ0My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI2X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ5Y2E4OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yN19kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmM3NWQ1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2JkMjdjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlYmIwYWMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNTE0YWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjlfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGU3ZmU1Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI5X2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZiMmMxMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fY29ubmVjdGluZ18zMF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZGI2NzllLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2RhcmsucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWM2MDUxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRiMjEyMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWNlN2UzYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZGlzYWJsZWRfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4NjAxY2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX21yX2J1dHRvbl9kaXNjb25uZWN0ZWRfbGlnaHQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM0OTI4ZDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY19tcl9idXR0b25fZ3JleS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MmZkNzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGYxNzFhOGMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9kYXJrLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2RhcmsucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjOGNiNmNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2dyb3VwX2xpZ2h0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5Yzg4NjNkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfc3BlYWtlcl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTMzNTAzOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHhoZHBpL2ljX3ZvbF90eXBlX3R2X2RhcmsucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGE2YTQ4NTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfZGFyay5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4aGRwaS9pY192b2xfdHlwZV90dl9saWdodC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDRjYTY3ODcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eGhkcGkvaWNfdm9sX3R5cGVfdHZfbGlnaHQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAwLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMzA1ZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAwLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OTM5NWQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDIucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzBhNzI4Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDIucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAzLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZjBmNTMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzAzLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmE4MGQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDUucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA1LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVjMzkzOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDUucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA2LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmMDI1MzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTIyOGY0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wNy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDgucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0Mjc3ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMDgucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA5LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8wOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NjViZmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzA5LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxN2M1ZDZiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTEucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzExLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJmNGFkNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEyLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMzA2NDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzEyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMy5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOTkzMjRlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTQucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg2MThmMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfY29sbGFwc2VfMTQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE1LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9jb2xsYXBzZV8xNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMGQ3NzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2NvbGxhcHNlXzE1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDAucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhMGQ3NzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAxLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDEucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGI0ZTUwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDEucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMi5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAyLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJiNWYwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzAyLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDMucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMy5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwNWM3NTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wMy5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA0LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDQucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTVjN2ZhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDQucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA1LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmMyODdlNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA1LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDYucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViN2QwY2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA3LnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDcucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NWZhNzJiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTY1MGVlYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzA4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMDkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZmNDQzNTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8wOS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEwLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTAucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTg3N2MzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTAucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMS5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzExLnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyN2YwYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzExLnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTIucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxYjE5YmIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xMi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzEzLnBuZyBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTMucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjU5MjFlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTMucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNC5wbmcgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzE0LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRiNzZiMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfZ3JvdXBfZXhwYW5kXzE0LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUteHh4aGRwaS9pY19ncm91cF9leHBhbmRfMTUucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNS5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMzA1ZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX2dyb3VwX2V4cGFuZF8xNS5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS14eHhoZHBpL2ljX21yX2J1dHRvbl9ncmV5LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRhOTUyNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlLXh4eGhkcGkvaWNfbXJfYnV0dG9uX2dyZXkucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9jdXN0b21fcHJvZ3Jlc3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9jdXN0b21fcHJvZ3Jlc3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NzMxYTZlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxsYXllci1saXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIgPgotICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2JhY2tncm91bmQiPgotICAgICAgICA8c2hhcGUgYW5kcm9pZDpzaGFwZT0icmVjdGFuZ2xlIiA+Ci0gICAgICAgICAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iIzI2MDAwMDAwIiAvPgotICAgICAgICA8L3NoYXBlPgotICAgIDwvaXRlbT4KLSAgICA8aXRlbSBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9zZWNvbmRhcnlQcm9ncmVzcyI+Ci0gICAgICAgIDxjbGlwPgotICAgICAgICAgICAgPHNoYXBlIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSIgPgotICAgICAgICAgICAgICAgIDxzb2xpZCBhbmRyb2lkOmNvbG9yPSIjNUNmZmZmZmYiIC8+Ci0gICAgICAgICAgICA8L3NoYXBlPgotICAgICAgICA8L2NsaXA+Ci0gICAgPC9pdGVtPgotICAgIDxpdGVtIGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL3Byb2dyZXNzIj4KLSAgICAgICAgPGNsaXA+Ci0gICAgICAgICAgICA8c2hhcGUgYW5kcm9pZDpzaGFwZT0icmVjdGFuZ2xlIiA+Ci0gICAgICAgICAgICAgICAgPHNvbGlkIGFuZHJvaWQ6Y29sb3I9IiNmZmZmZmYiIC8+Ci0gICAgICAgICAgICA8L3NoYXBlPgotICAgICAgICA8L2NsaXA+Ci0gICAgPC9pdGVtPgotPC9sYXllci1saXN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzX3RodW1iLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvY3VzdG9tX3Byb2dyZXNzX3RodW1iLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEzNTk3MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2N1c3RvbV9wcm9ncmVzc190aHVtYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6c2hhcGU9Im92YWwiID4KLSAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iI2ZmZmZmZiIgLz4KLSAgICA8c2l6ZQotICAgICAgICBhbmRyb2lkOmhlaWdodD0iQGRpbWVuL21jdjJfY3VzdG9tX3Byb2dyZXNzX3RodW1iX3NpemUiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc190aHVtYl9zaXplIiAvPgotPC9zaGFwZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Fycm93X2JhY2sueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hcnJvd19iYWNrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI1ZjcxZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Fycm93X2JhY2sueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTIwLDExSDcuODNsNS41OSwtNS41OUwxMiw0bC04LDggOCw4IDEuNDEsLTEuNDFMNy44MywxM0gyMHYtMnoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXNwZWN0X3JhdGlvLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfYXNwZWN0X3JhdGlvLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYyMjhlNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2FzcGVjdF9yYXRpby54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTksMTJoLTJ2M2gtM3YyaDV2LTV6TTcsOWgzTDEwLDdMNSw3djVoMkw3LDl6TTIxLDNMMywzYy0xLjEsMCAtMiwwLjkgLTIsMnYxNGMwLDEuMSAwLjksMiAyLDJoMThjMS4xLDAgMiwtMC45IDIsLTJMMjMsNWMwLC0xLjEgLTAuOSwtMiAtMiwtMnpNMjEsMTkuMDFMMywxOS4wMUwzLDQuOTloMTh2MTQuMDJ6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2F1ZGlvdHJhY2sueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19hdWRpb3RyYWNrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjdjMTJiNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2F1ZGlvdHJhY2sueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTEyLDN2OS4yOGMtMC40NywtMC4xNyAtMC45NywtMC4yOCAtMS41LC0wLjI4QzguMDEsMTIgNiwxNC4wMSA2LDE2LjVTOC4wMSwyMSAxMC41LDIxYzIuMzEsMCA0LjIsLTEuNzUgNC40NSwtNEgxNVY2aDRWM2gtN3oiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGVjay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZWNrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJmNzIwYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZWNrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAgMGgyNHYyNEgweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTkgMTYuMkw0LjggMTJsLTEuNCAxLjRMOSAxOSAyMSA3bC0xLjQtMS40TDkgMTYuMnoiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZXZyb25fbGVmdC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2NoZXZyb25fbGVmdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzMzZkMTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX2xlZnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE1LjQxLDcuNDFMMTQsNmwtNiw2IDYsNiAxLjQxLC0xLjQxTDEwLjgzLDEyeiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX3JpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiMmNlMDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19jaGV2cm9uX3JpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMCw2TDguNTksNy40MSAxMy4xNywxMmwtNC41OCw0LjU5TDEwLDE4bDYsLTZ6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19kZWZhdWx0X2FsYnVtX2ltYWdlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNlZTY0My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjUxMmRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSI1MTJkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjUxMiIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSI1MTIiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiM2MTYxNjEiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0gMCAwIEggNTEyIFYgNTEyIEggMCBWIDAgWiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iIzUyNTI1MiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTI1NiwxNTF2MTIzLjE0Yy02Ljg4LTQuMDItMTQuODItNi40OC0yMy4zMy02LjQ4IGMtMjUuNzgsMC00Ni42NywyMC44OC00Ni42Nyw0Ni42N2MwLDI1Ljc4LDIwLjg4LDQ2LjY3LDQ2LjY3LDQ2LjY3czQ2LjY3LTIwLjg4LDQ2LjY3LTQ2LjY3VjE5Ny42N0gzMjZWMTUxSDI1NnoiIC8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZm9yd2FyZF8zMC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2ZvcndhcmRfMzAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWZkZjE2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZm9yd2FyZF8zMC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMiArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPGdyb3VwPgotICAgICAgICA8Y2xpcC1wYXRoIGFuZHJvaWQ6cGF0aERhdGE9Ik0yNCwyNEgwVjBoMjR2MjR6IE0gMCwwIiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik05LjYgMTMuNWguNGMuMiAwIC40LC0uMS41LC0uMnMuMiwtLjIuMiwtLjR2LS4ycy0uMSwtLjEsLS4xLC0uMiwtLjEsLS4xLC0uMiwtLjFoLS41cy0uMS4xLC0uMi4xLC0uMS4xLC0uMS4ydi4yaC0xYzAsLS4yIDAsLS4zLjEsLS41cy4yLC0uMy4zLC0uNC4zLC0uMi40LC0uMi40LC0uMS41LC0uMWMuMiAwIC40IDAgLjYuMXMuMy4xLjUuMi4yLjIuMy40LjEuMy4xLjV2LjNzLS4xLjIsLS4xLjMsLS4xLjIsLS4yLjIsLS4yLjEsLS4zLjJjLjIuMS40LjIuNS40cy4yLjQuMi42YzAgLjIgMCAuNCwtLjEuNXMtLjIuMywtLjMuNCwtLjMuMiwtLjUuMiwtLjQuMSwtLjYuMWMtLjIgMCwtLjQgMCwtLjUsLS4xcy0uMywtLjEsLS41LC0uMiwtLjIsLS4yLC0uMywtLjQsLS4xLC0uNCwtLjEsLS42aC44di4ycy4xLjEuMS4yLjEuMS4yLjFoLjVzLjEsLS4xLjIsLS4xLjEsLS4xLjEsLS4ydi0uNXMtLjEsLS4xLC0uMSwtLjIsLS4xLC0uMSwtLjIsLS4xaC0uNnYtLjd6bTUuNy43YzAgLjMgMCAuNiwtLjEuOGwtLjMuNnMtLjMuMywtLjUuMywtLjQuMSwtLjYuMSwtLjQgMCwtLjYsLS4xLC0uMywtLjIsLS41LC0uMywtLjIsLS4zLC0uMywtLjYsLS4xLC0uNSwtLjEsLS44di0uN2MwLC0uMyAwLC0uNi4xLC0uOGwuMywtLjZzLjMsLS4zLjUsLS4zLjQsLS4xLjYsLS4xLjQgMCAuNi4xLjMuMi41LjMuMi4zLjMuNi4xLjUuMS44di43em0tLjksLS44di0uNXMtLjEsLS4yLC0uMSwtLjMsLS4xLC0uMSwtLjIsLS4yLC0uMiwtLjEsLS4zLC0uMSwtLjIgMCwtLjMuMWwtLjIuMnMtLjEuMiwtLjEuM3Yycy4xLjIuMS4zLjEuMS4yLjIuMi4xLjMuMS4yIDAgLjMsLS4xbC4yLC0uMnMuMSwtLjIuMSwtLjN2LTEuNXpNNCAxM2MwIDQuNCAzLjYgOCA4IDhzOCwtMy42IDgsLThoLTJjMCAzLjMsLTIuNyA2LC02IDZzLTYsLTIuNywtNiwtNiAyLjcsLTYgNiwtNnY0bDUsLTUsLTUsLTV2NGMtNC40IDAsLTggMy42LC04IDh6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotICAgIDwvZ3JvdXA+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2Z1bGxzY3JlZW4ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YjRmNmJjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNNywxNEw1LDE0djVoNXYtMkw3LDE3di0zek01LDEwaDJMNyw3aDNMMTAsNUw1LDV2NXpNMTcsMTdoLTN2Mmg1di01aC0ydjN6TTE0LDV2MmgzdjNoMkwxOSw1aC01eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mdWxsc2NyZWVuX2V4aXQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19mdWxsc2NyZWVuX2V4aXQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYzIwNGUyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfZnVsbHNjcmVlbl9leGl0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik01LDE2aDN2M2gydi01TDUsMTR2MnpNOCw4TDUsOHYyaDVMMTAsNUw4LDV2M3pNMTQsMTloMnYtM2gzdi0yaC01djV6TTE2LDhMMTYsNWgtMnY1aDVMMTksOGgtM3oiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGVscC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hlbHAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZDFkNzVkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGVscC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wIDBoMjR2MjRIMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiAyQzYuNDggMiAyIDYuNDggMiAxMnM0LjQ4IDEwIDEwIDEwIDEwLTQuNDggMTAtMTBTMTcuNTIgMiAxMiAyem0xCi0xN2gtMnYtMmgydjJ6bTIuMDctNy43NWwtLjkgLjkyIEMxMy40NSAxMi45IDEzIDEzLjUgMTMgMTVoLTJ2LS41YzAtMS4xIC40NSAtMi4xCi0xLjE3LTIuODNsMS4yNC0xLjI2Yy4zNy0uMzYgLjU5IC0uODYgLjU5IC0xLjQxIDAtMS4xLS45LTItMi0ycy0yIC45LTIgMkg4YzAtMi4yMQotMS43OS00IDQtNHM0IDEuNzkgNCA0YzAgLjg4LS4zNiAxLjY4LS45MyAyLjI1eiIgLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGlnaF9xdWFsaXR5LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfaGlnaF9xdWFsaXR5LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjc2ZTIyZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2hpZ2hfcXVhbGl0eS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMzRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMzRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wIDBoMjR2MjRIMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOSA0SDVjLTEuMTEgMC0yIDAuOS0yIDJ2MTJjMCAxLjEgMC44OSAyIDIgMmgxNGMxLjEgMCAyLTAuOSAyLTJWNmMwLTEuMS0wLjktMi0yLTJ6bS04IDExSDkuNXYtMmgtMnYySDZWOWgxLjV2Mi41aDJWOUgxMXY2em03LTFjMCAwLjU1LTAuNDUgMS0xIDFoLTAuNzV2MS41aC0xLjVWMTVIMTRjLTAuNTUgMC0xLTAuNDUtMS0xdi00YzAtMC41NSAwLjQ1IC0xIDEtMWgzYzAuNTUgMCAxIDAuNDUgMSAxdjR6bS0zLjUtMC41aDJ2LTNoLTJ2M3oiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2xhdW5jaC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX2xhdW5jaC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3YWY2YWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19sYXVuY2gueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LDE5SDVWNWg3VjNINWMtMS4xMSwwIC0yLDAuOSAtMiwydjE0YzAsMS4xIDAuODksMiAyLDJoMTRjMS4xLDAgMiwtMC45IDIsLTJ2LTdoLTJ2N3pNMTQsM3YyaDMuNTlsLTkuODMsOS44MyAxLjQxLDEuNDFMMTksNi40MVYxMGgyVjNoLTd6Ii8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX211dGUueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19tdXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTYwYWFlYy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX211dGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE2LjUsMTJjMCwtMS43NyAtMS4wMiwtMy4yOSAtMi41LC00LjAzdjIuMjFsMi40NSwyLjQ1YzAuMDMsLTAuMiAwLjA1LC0wLjQxIDAuMDUsLTAuNjN6TTE5LDEyYzAsMC45NCAtMC4yLDEuODIgLTAuNTQsMi42NGwxLjUxLDEuNTFDMjAuNjMsMTQuOTEgMjEsMTMuNSAyMSwxMmMwLC00LjI4IC0yLjk5LC03Ljg2IC03LC04Ljc3djIuMDZjMi44OSwwLjg2IDUsMy41NCA1LDYuNzF6TTQuMjcsM0wzLDQuMjcgNy43Myw5TDMsOXY2aDRsNSw1di02LjczbDQuMjUsNC4yNWMtMC42NywwLjUyIC0xLjQyLDAuOTMgLTIuMjUsMS4xOHYyLjA2YzEuMzgsLTAuMzEgMi42MywtMC45NSAzLjY5LC0xLjgxTDE5LjczLDIxIDIxLDE5LjczbC05LC05TDQuMjcsM3pNMTIsNEw5LjkxLDYuMDkgMTIsOC4xOEwxMiw0eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczYmUyMjguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiwyQzYuNDgsMiAyLDYuNDggMiwxMnM0LjQ4LDEwIDEwLDEwIDEwLC00LjQ4IDEwLC0xMFMxNy41MiwyIDEyLDJ6TTExLDE2TDksMTZMOSw4aDJ2OHpNMTUsMTZoLTJMMTMsOGgydjh6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3BsYXlfY2lyY2xlX2ZpbGxlZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3BsYXlfY2lyY2xlX2ZpbGxlZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkMzlkZWYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19wbGF5X2NpcmNsZV9maWxsZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTEyLDJDNi40OCwyIDIsNi40OCAyLDEyczQuNDgsMTAgMTAsMTAgMTAsLTQuNDggMTAsLTEwUzE3LjUyLDIgMTIsMnpNMTAsMTYuNXYtOWw2LDQuNSAtNiw0LjV6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotPC92ZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3JlcGxheV9jaXJjbGVfZmlsbGVkLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmVwbGF5X2NpcmNsZV9maWxsZWQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTZkNWQ5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmVwbGF5X2NpcmNsZV9maWxsZWQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgYW5kcm9pZDpoZWlnaHQ9IjQwZHAiCi0gICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNCI+Ci0KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMCwwaDI0djI0SDBWMHoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbFR5cGU9ImV2ZW5PZGQiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiwyQzYuNDgsMiwyLDYuNDgsMiwxMmMwLDUuNTIsNC40OCwxMCwxMCwxMGM1LjUyLDAsMTAtNC40OCwxMC0xMAotQzIyLDYuNDgsMTcuNTIsMiwxMiwyegotTTE4LDEyYzAsMy4zMS0yLjY5LDYtNiw2Yy0zLjMxLDAtNi0yLjY5LTYtNmgyYzAsMi4yMSwxLjc5LDQsNCw0czQtMS43OSw0LTRzLTEuNzktNC00LTR2M0w4LDdsNC00djMKLUMxNS4zMSw2LDE4LDguNjksMTgsMTJ6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXdpbmRfMTAueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19yZXdpbmRfMTAueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTU4NmI0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfcmV3aW5kXzEwLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEyICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSI0MGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iNDBkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8Z3JvdXA+Ci0gICAgICAgIDxjbGlwLXBhdGggYW5kcm9pZDpwYXRoRGF0YT0iTTAsMGgyNHYyNEgwVjB6IE0gMCwwIiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xMiA1VjFMNyA2bDUgNVY3YzMuMyAwIDYgMi43IDYgNnMtMi43IDYsLTYgNiwtNiwtMi43LC02LC02SDRjMCA0LjQgMy42IDggOCA4czgsLTMuNiA4LC04LC0zLjYsLTgsLTgsLTh6bS0xLjEgMTFIMTB2LTMuM0w5IDEzdi0uN2wxLjgsLS42aC4xVjE2em00LjMsLTEuOGMwIC4zIDAgLjYsLS4xLjhsLS4zLjZzLS4zLjMsLS41LjMsLS40LjEsLS42LjEsLS40IDAsLS42LC0uMSwtLjMsLS4yLC0uNSwtLjMsLS4yLC0uMywtLjMsLS42LC0uMSwtLjUsLS4xLC0uOHYtLjdjMCwtLjMgMCwtLjYuMSwtLjhsLjMsLS42cy4zLC0uMy41LC0uMy40LC0uMS42LC0uMS40IDAgLjYuMWMuMi4xLjMuMi41LjNzLjIuMy4zLjYuMS41LjEuOHYuN3ptLS45LC0uOHYtLjVzLS4xLC0uMiwtLjEsLS4zLC0uMSwtLjEsLS4yLC0uMiwtLjIsLS4xLC0uMywtLjEsLS4yIDAsLS4zLjFsLS4yLjJzLS4xLjIsLS4xLjN2MnMuMS4yLjEuMy4xLjEuMi4yLjIuMS4zLjEuMiAwIC4zLC0uMWwuMiwtLjJzLjEsLS4yLjEsLS4zdi0xLjV6IgotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIvPgotICAgIDwvZ3JvdXA+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2QueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlY2I2ZDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDBoMjR2MjRIMFYweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LDNINUMzLjg5LDMsMywzLjksMyw1djE0YzAsMS4xLDAuODksMiwyLDJoMTRjMS4xLDAsMi0wLjksMi0yVjVDMjEsMy45LDIwLjEsMywxOSwzegotTTEzLDloNGMwLjU1LDAsMSwwLjQ1LDEsMXY0IGMwLDAuNTUtMC40NSwxLTEsMWgtNFY5egotTTkuNSwxMy41di0xSDdjLTAuNTUsMC0xLTAuNDUtMS0xVjEwYzAtMC41NSwwLjQ1LTEsMS0xaDNjMC41NSwwLDEsMC40NSwxLDF2MUg5LjV2LTAuNWgtMnYxSDEwCi1jMC41NSwwLDEsMC40NSwxLDFWMTRjMCwwLjU1LTAuNDUsMS0xLDFIN2MtMC41NSwwLTEtMC40NS0xLTF2LTFoMS41djAuNUg5LjV6Ci1NMTQuNSwxMy41aDJ2LTNoLTJWMTMuNXoiIC8+Ci08L3ZlY3Rvcj4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3NldHRpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2V0dGluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNTllY2MxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2V0dGluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDpoZWlnaHQ9IjI0ZHAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQuMCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQuMCI+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LjQzLDEyLjk4YzAuMDQsLTAuMzIgMC4wNywtMC42NCAwLjA3LC0wLjk4cy0wLjAzLC0wLjY2IC0wLjA3LC0wLjk4bDIuMTEsLTEuNjVjMC4xOSwtMC4xNSAwLjI0LC0wLjQyIDAuMTIsLTAuNjRsLTIsLTMuNDZjLTAuMTIsLTAuMjIgLTAuMzksLTAuMyAtMC42MSwtMC4yMmwtMi40OSwxYy0wLjUyLC0wLjQgLTEuMDgsLTAuNzMgLTEuNjksLTAuOThsLTAuMzgsLTIuNjVDMTQuNDYsMi4xOCAxNC4yNSwyIDE0LDJoLTRjLTAuMjUsMCAtMC40NiwwLjE4IC0wLjQ5LDAuNDJsLTAuMzgsMi42NWMtMC42MSwwLjI1IC0xLjE3LDAuNTkgLTEuNjksMC45OGwtMi40OSwtMWMtMC4yMywtMC4wOSAtMC40OSwwIC0wLjYxLDAuMjJsLTIsMy40NmMtMC4xMywwLjIyIC0wLjA3LDAuNDkgMC4xMiwwLjY0bDIuMTEsMS42NWMtMC4wNCwwLjMyIC0wLjA3LDAuNjUgLTAuMDcsMC45OHMwLjAzLDAuNjYgMC4wNywwLjk4bC0yLjExLDEuNjVjLTAuMTksMC4xNSAtMC4yNCwwLjQyIC0wLjEyLDAuNjRsMiwzLjQ2YzAuMTIsMC4yMiAwLjM5LDAuMyAwLjYxLDAuMjJsMi40OSwtMWMwLjUyLDAuNCAxLjA4LDAuNzMgMS42OSwwLjk4bDAuMzgsMi42NWMwLjAzLDAuMjQgMC4yNCwwLjQyIDAuNDksMC40Mmg0YzAuMjUsMCAwLjQ2LC0wLjE4IDAuNDksLTAuNDJsMC4zOCwtMi42NWMwLjYxLC0wLjI1IDEuMTcsLTAuNTkgMS42OSwtMC45OGwyLjQ5LDFjMC4yMywwLjA5IDAuNDksMCAwLjYxLC0wLjIybDIsLTMuNDZjMC4xMiwtMC4yMiAwLjA3LC0wLjQ5IC0wLjEyLC0wLjY0bC0yLjExLC0xLjY1ek0xMiwxNS41Yy0xLjkzLDAgLTMuNSwtMS41NyAtMy41LC0zLjVzMS41NywtMy41IDMuNSwtMy41IDMuNSwxLjU3IDMuNSwzLjUgLTEuNTcsMy41IC0zLjUsMy41eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX25leHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX25leHQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWYyODEyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9uZXh0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik02LDE4bDguNSwtNkw2LDZ2MTJ6TTE2LDZ2MTJoMlY2aC0yeiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc2tpcF9wcmV2aW91cy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZGEzMTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6d2lkdGg9IjQwZHAiCi0gICAgICAgIGFuZHJvaWQ6aGVpZ2h0PSI0MGRwIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0LjAiCi0gICAgICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0LjAiPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik02LDZoMnYxMkw2LDE4ek05LjUsMTJsOC41LDZMMTgsNnoiCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIi8+Ci08L3ZlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc3VidGl0bGVfb2ZmLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfc3VidGl0bGVfb2ZmLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBhNzI3YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29mZi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPHZlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDp3aWR0aD0iMjRkcCIKLSAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICBhbmRyb2lkOnZpZXdwb3J0V2lkdGg9IjI0IgotICAgIGFuZHJvaWQ6dmlld3BvcnRIZWlnaHQ9IjI0Ij4KLQotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0wLDBoMjR2MjRIMFYweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5LjUsNS41djEzaC0xNXYtMTNIMTkuNXogTTE5LDRINUMzLjg5LDQsMyw0LjksMyw2djEyYzAsMS4xLDAuODksMiwyLDJoMTRjMS4xLDAsMi0wLjksMi0yVjZDMjEsNC45LDIwLjEsNCwxOSw0TDE5LDR6IiAvPgotICAgIDxwYXRoCi0gICAgICAgIGFuZHJvaWQ6ZmlsbENvbG9yPSIjRkZGRkZGIgotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMTEsMTFIOS41di0wLjVoLTJ2M2gyVjEzSDExdjFjMCwwLjU1LTAuNDUsMS0xLDFIN2MtMC41NSwwLTEtMC40NS0xLTF2LTRjMC0wLjU1LDAuNDUtMSwxLTFoM2MwLjU1LDAsMSwwLjQ1LDEsMVYxMXoiIC8+Ci0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiCi0gICAgICAgIGFuZHJvaWQ6cGF0aERhdGE9Ik0xOCwxMWgtMS41di0wLjVoLTJ2M2gyVjEzSDE4djFjMCwwLjU1LTAuNDUsMS0xLDFoLTNjLTAuNTUsMC0xLTAuNDUtMS0xdi00YzAtMC41NSwwLjQ1LTEsMS0xaDNjMC41NSwwLDEsMC40NSwxLDFWMTF6IiAvPgotPC92ZWN0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9pY19zdWJ0aXRsZV9vbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29uLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M5MWMwNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3N1YnRpdGxlX29uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08dmVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgIGFuZHJvaWQ6aGVpZ2h0PSIyNGRwIgotICAgIGFuZHJvaWQ6dmlld3BvcnRXaWR0aD0iMjQiCi0gICAgYW5kcm9pZDp2aWV3cG9ydEhlaWdodD0iMjQiPgotCi0gICAgPHBhdGgKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTAgMGgyNHYyNEgweiIgLz4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOmZpbGxDb2xvcj0iI0ZGRkZGRiIKLSAgICAgICAgYW5kcm9pZDpwYXRoRGF0YT0iTTE5IDRINWMtMS4xMSAwLTIgMC45LTIgMnYxMmMwIDEuMSAwLjg5IDIgMiAyaDE0YzEuMSAwIDItMC45IDItMlY2YzAtMS4xLTAuOS0yLTItMnptLTggN0g5LjV2LTAuNWgtMnYzaDJWMTNIMTF2MWMwIDAuNTUtMC40NSAxLTEgMUg3Yy0wLjU1IDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUgMC40NSAtMSAxLTFoM2MwLjU1IDAgMSAwLjQ1IDEgMXYxem03IDBoLTEuNXYtMC41aC0ydjNoMlYxM0gxOHYxYzAgMC41NS0wLjQ1IDEtMSAxaC0zYy0wLjU1IDAtMS0wLjQ1LTEtMXYtNGMwLTAuNTUgMC40NSAtMSAxLTFoM2MwLjU1IDAgMSAwLjQ1IDEgMXYxeiIgLz4KLTwvdmVjdG9yPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfdW5tdXRlLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvaWNfdW5tdXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRmYjJiOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL2ljX3VubXV0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLTx2ZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOndpZHRoPSIyNGRwIgotICAgICAgICBhbmRyb2lkOmhlaWdodD0iMjRkcCIKLSAgICAgICAgYW5kcm9pZDp2aWV3cG9ydFdpZHRoPSIyNC4wIgotICAgICAgICBhbmRyb2lkOnZpZXdwb3J0SGVpZ2h0PSIyNC4wIj4KLSAgICA8cGF0aAotICAgICAgICBhbmRyb2lkOnBhdGhEYXRhPSJNMyw5djZoNGw1LDVMMTIsNEw3LDlMMyw5ek0xNi41LDEyYzAsLTEuNzcgLTEuMDIsLTMuMjkgLTIuNSwtNC4wM3Y4LjA1YzEuNDgsLTAuNzMgMi41LC0yLjI1IDIuNSwtNC4wMnpNMTQsMy4yM3YyLjA2YzIuODksMC44NiA1LDMuNTQgNSw2Ljcxcy0yLjExLDUuODUgLTUsNi43MXYyLjA2YzQuMDEsLTAuOTEgNywtNC40OSA3LC04Ljc3cy0yLjk5LC03Ljg2IC03LC04Ljc3eiIKLSAgICAgICAgYW5kcm9pZDpmaWxsQ29sb3I9IiNGRkZGRkYiLz4KLTwvdmVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTBmZjEzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2Nvbm5lY3RlZF9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0Ci0gICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJ0cnVlIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8zMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmNmYzdmZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YW5pbWF0aW9uLWxpc3QKLSAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9uZXNob3Q9InRydWUiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzAzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8wN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMDhfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzA5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzEyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMTdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzE4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8xOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzIxX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzI3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RlZF8yOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0ZWRfMjlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGVkXzMwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19kYXJrLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTVhZjdiMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YW5pbWF0aW9uLWxpc3QKLSAgICAgICAgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9uZXNob3Q9ImZhbHNlIj4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAxX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDNfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA0X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDZfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA3X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDlfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEwX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTJfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEzX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTVfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE2X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMThfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE5X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjFfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIyX2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjRfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI1X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjdfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI4X2RhcmsiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9kYXJrIiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMzBfZGFyayIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci08L2FuaW1hdGlvbi1saXN0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTNiNDE3MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0aW5nX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPGFuaW1hdGlvbi1saXN0Ci0gICAgICAgIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgYW5kcm9pZDpvbmVzaG90PSJmYWxzZSI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDFfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wMl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzAzX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDRfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wNV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA2X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMDdfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18wOF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzA5X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTBfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xMV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzEyX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTNfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xNF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE1X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTZfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18xN19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzE4X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMTlfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yMF9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzIxX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjJfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yM19saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI0X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjVfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yNl9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzI3X2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Nvbm5lY3RpbmdfMjhfbGlnaHQiIGFuZHJvaWQ6ZHVyYXRpb249IjQyIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fY29ubmVjdGluZ18yOV9saWdodCIgYW5kcm9pZDpkdXJhdGlvbj0iNDIiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9jb25uZWN0aW5nXzMwX2xpZ2h0IiBhbmRyb2lkOmR1cmF0aW9uPSI0MiIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9kYXJrLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjFkZmFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2RhcmsueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2NoZWNrZWQ9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGVkX2RhcmsiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2FibGU9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19kYXJrIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tcl9idXR0b25fZGlzY29ubmVjdGVkX2RhcmsiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21yX2J1dHRvbl9kaXNhYmxlZF9kYXJrIiAvPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2xpZ2h0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfYnV0dG9uX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQzZDg0ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2J1dHRvbl9saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6c3RhdGVfY2hlY2tlZD0idHJ1ZSIgYW5kcm9pZDpzdGF0ZV9lbmFibGVkPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL21yX2J1dHRvbl9jb25uZWN0ZWRfbGlnaHQiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpzdGF0ZV9jaGVja2FibGU9InRydWUiIGFuZHJvaWQ6c3RhdGVfZW5hYmxlZD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9tcl9idXR0b25fY29ubmVjdGluZ19saWdodCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOnN0YXRlX2VuYWJsZWQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9saWdodCIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2FibGVkX2xpZ2h0IiAvPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfZGFyay54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4OGM4YzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19kaWFsb2dfY2xvc2VfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkNTBlMGYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfY2xvc2VfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19kaWFsb2dfY2xvc2VfbGlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmFscGhhPSIwLjg3IiAvPgotICAgIDwvaXRlbT4KLQotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYmM3ZWNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0gVGhpcyBpcyB0aGUgY29weSBvZiBAZHJhd2FibGUvYWJjX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2RhcmsgZXhjZXB0IGZvciBpbnNldAotICAgICB3aGljaCBpbmNsdWRlcyB1bm5lY2Vzc2FyeSBwYWRkaW5nLiAtLT4KLTxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSI+Ci0gICAgPGNvcm5lcnMgYW5kcm9pZDpyYWRpdXM9IjJkcCIgLz4KLSAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iQGNvbG9yL2JhY2tncm91bmRfZmxvYXRpbmdfbWF0ZXJpYWxfZGFyayIgLz4KLTwvc2hhcGU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9kaWFsb2dfbWF0ZXJpYWxfYmFja2dyb3VuZF9saWdodC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzFiMjM1YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2RpYWxvZ19tYXRlcmlhbF9iYWNrZ3JvdW5kX2xpZ2h0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLSBUaGlzIGlzIHRoZSBjb3B5IG9mIEBkcmF3YWJsZS9hYmNfZGlhbG9nX21hdGVyaWFsX2JhY2tncm91bmRfbGlnaHQgZXhjZXB0IGZvciBpbnNldAotICAgICB3aGljaCBpbmNsdWRlcyB1bm5lY2Vzc2FyeSBwYWRkaW5nLiAtLT4KLTxzaGFwZSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSI+Ci0gICAgPGNvcm5lcnMgYW5kcm9pZDpyYWRpdXM9IjJkcCIgLz4KLSAgICA8c29saWQgYW5kcm9pZDpjb2xvcj0iQGNvbG9yL2JhY2tncm91bmRfZmxvYXRpbmdfbWF0ZXJpYWxfbGlnaHQiIC8+Ci08L3NoYXBlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfZ3JvdXBfY29sbGFwc2UueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9jb2xsYXBzZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNzJiYzguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9jb2xsYXBzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxhbmltYXRpb24tbGlzdCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgIGFuZHJvaWQ6b25lc2hvdD0idHJ1ZSI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzAwIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDEiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wMiIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzAzIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDQiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wNSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA2IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMDciIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8wOCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzA5IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTAiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xMSIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzEyIiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLSAgICA8aXRlbSBhbmRyb2lkOmRyYXdhYmxlPSJAZHJhd2FibGUvaWNfZ3JvdXBfY29sbGFwc2VfMTMiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9jb2xsYXBzZV8xNCIgYW5kcm9pZDpkdXJhdGlvbj0iMTMiIC8+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2dyb3VwX2NvbGxhcHNlXzE1IiBhbmRyb2lkOmR1cmF0aW9uPSIxMyIgLz4KLTwvYW5pbWF0aW9uLWxpc3Q+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2dyb3VwX2V4cGFuZC54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX2dyb3VwX2V4cGFuZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiM2ZkYjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9ncm91cF9leHBhbmQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08YW5pbWF0aW9uLWxpc3QgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgICAgICBhbmRyb2lkOm9uZXNob3Q9InRydWUiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDAiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDEiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDIiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDMiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDQiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDUiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDYiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDciIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDgiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMDkiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTAiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTEiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTIiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTMiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTQiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19ncm91cF9leHBhbmRfMTUiIGFuZHJvaWQ6ZHVyYXRpb249IjEzIiAvPgotPC9hbmltYXRpb24tbGlzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfZGFyay54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BhdXNlX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjIxOGE3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfZGFyay54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtIGFuZHJvaWQ6ZHJhd2FibGU9IkBkcmF3YWJsZS9pY19tZWRpYV9wYXVzZV9kYXJrIiAvPgotPC9zZWxlY3Rvcj4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGF1c2VfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJkZDFmMDIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxzZWxlY3RvciB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiPgotICAgIDxpdGVtPgotICAgICAgICA8Yml0bWFwCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX21lZGlhX3BhdXNlX2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDQ1YTMzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21lZGlhX3BsYXlfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9wbGF5X2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjFmYjdhNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3BsYXlfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19tZWRpYV9wbGF5X2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTEwOGE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX21lZGlhX3N0b3BfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjJjNmNlOC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19tZWRpYV9zdG9wX2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2RhcmsueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2RhcmsueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGY0ZmQ2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHNlbGVjdG9yIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCI+Ci0gICAgPGl0ZW0gYW5kcm9pZDpkcmF3YWJsZT0iQGRyYXdhYmxlL2ljX2F1ZGlvdHJhY2tfZGFyayIgLz4KLTwvc2VsZWN0b3I+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfbGlnaHQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9kcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM5ZGJjMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2RyYXdhYmxlL21yX3ZvbF90eXBlX2F1ZGlvdHJhY2tfbGlnaHQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2VsZWN0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIj4KLSAgICA8aXRlbT4KLSAgICAgICAgPGJpdG1hcAotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19hdWRpb3RyYWNrX2xpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDphbHBoYT0iMC44NyIgLz4KLSAgICA8L2l0ZW0+Ci08L3NlbGVjdG9yPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfZmFzdF9vdXRfc2xvd19pbi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9mYXN0X291dF9zbG93X2luLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmI2YTE3MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2ludGVycG9sYXRvci9tcl9mYXN0X291dF9zbG93X2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICAtLT4KLQotPHBhdGhJbnRlcnBvbGF0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6Y29udHJvbFgxPSIwLjQiCi0gICAgYW5kcm9pZDpjb250cm9sWTE9IjAiCi0gICAgYW5kcm9pZDpjb250cm9sWDI9IjAuMiIKLSAgICBhbmRyb2lkOmNvbnRyb2xZMj0iMSIvPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfbGluZWFyX291dF9zbG93X2luLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvaW50ZXJwb2xhdG9yL21yX2xpbmVhcl9vdXRfc2xvd19pbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwYmYyOTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9pbnRlcnBvbGF0b3IvbXJfbGluZWFyX291dF9zbG93X2luLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tCi0gIH4gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICB+Ci0gIH4gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIH4geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICB+IFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICB+Ci0gIH4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAgfgotICB+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgfiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICB+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICB+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgfiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZQotICAtLT4KLQotPHBhdGhJbnRlcnBvbGF0b3IgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6Y29udHJvbFgxPSIwIgotICAgIGFuZHJvaWQ6Y29udHJvbFkxPSIwIgotICAgIGFuZHJvaWQ6Y29udHJvbFgyPSIwLjIiCi0gICAgYW5kcm9pZDpjb250cm9sWTI9IjEiLz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX211c2ljLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX211c2ljLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0ZDM2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9tdXNpYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgPFZpZXcKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIwZHAiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dlaWdodD0iMC4yNSIvPgotCi0gICAgPEltYWdlVmlldwotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FsYnVtIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIwLjUiCi0gICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRDZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZSIgLz4KLQotICAgIDxWaWV3Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIgotICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjAuMjUiLz4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3NldHRpbmdzX2xpc3RfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU2ZGNhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3NldHRpbmdzX2xpc3RfaXRlbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ibGFja19vcGFjaXR5XzcwIj4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ljb24iCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjhkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tYWluX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc190ZXh0X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX21haW5fdGV4dF9zaXplIi8+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N1Yl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9iZWxvdz0iQGlkL21haW5fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZV9vcGFjaXR5XzcwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3Nfc3ViX3RleHRfc2l6ZSIvPgotICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KLQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZW1iZWRkZWRfc3ViX3NldHRpbmdzX2xpc3RfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk0N2E3Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JsYWNrX29wYWNpdHlfNzAiPgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2hlY2siCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW49IjhkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpzcmM9IkBkcmF3YWJsZS9pY19jaGVjayIvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjJkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9lbWJlZGRlZF9zZXR0aW5nc19tYWluX3RleHRfc2l6ZSIvPgotICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9lbWJlZGRlZF90cmFuc3BvcnRfY29udHJvbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhM2E1OTU3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2VtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSJAZGltZW4vbWN2Ml90cmFuc3BvcnRfY29udHJvbHNfcGFkZGluZyIKLSAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iQGRpbWVuL21jdjJfdHJhbnNwb3J0X2NvbnRyb2xzX3BhZGRpbmciCi0gICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJ2aXNpYmxlIj4KLQotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL3ByZXYiIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QcmV2aW91cyIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9yZXciIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcGF1c2UiIHN0eWxlPSJAc3R5bGUvRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QYXVzZSIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9mZndkIiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uRmZ3ZCIgLz4KLSAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9uZXh0IiBzdHlsZT0iQHN0eWxlL0VtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCIgLz4KLTwvTGluZWFyTGF5b3V0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfbGFuZHNjYXBlX211c2ljLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfbGFuZHNjYXBlX211c2ljLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNlNzA1OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX2xhbmRzY2FwZV9tdXNpYy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaW5lYXJMYXlvdXQgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSIjQjMwMEZGMDAiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXVzaWNfaW1hZ2UiCi0gICAgICAgIHN0eWxlPSJAc3R5bGUvRnVsbE11c2ljTGFuZHNjYXBlLkltYWdlIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FsYnVtIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfbGFuZHNjYXBlX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfbGFuZHNjYXBlX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOnNyYz0iQGRyYXdhYmxlL2ljX2RlZmF1bHRfYWxidW1faW1hZ2UiLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXNpY190ZXh0IgotICAgICAgICBzdHlsZT0iQHN0eWxlL0Z1bGxNdXNpY0xhbmRzY2FwZS5UZXh0Ij4KLQotICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbWN2Ml9tdXNpY190aXRsZV91bmtub3duX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIyMHNwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U3R5bGU9ImJvbGQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0ZGRkZGRiIgLz4KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FydGlzdCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9tY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxNnNwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNCQkJCQkIiIC8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3BvcnRyYWl0X211c2ljLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfcG9ydHJhaXRfbXVzaWMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWYxYmIzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfcG9ydHJhaXRfbXVzaWMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tdXNpY19pbWFnZSIKLSAgICAgICAgc3R5bGU9IkBzdHlsZS9GdWxsTXVzaWNQb3J0cmFpdC5JbWFnZSI+Ci0KLSAgICAgICAgPEltYWdlVmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hbGJ1bSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJAZGltZW4vbWN2Ml9mdWxsX2FsYnVtX2ltYWdlX3BvcnRyYWl0X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfZGVmYXVsdF9hbGJ1bV9pbWFnZSIvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL211c2ljX3RleHQiCi0gICAgICAgIHN0eWxlPSJAc3R5bGUvRnVsbE11c2ljUG9ydHJhaXQuVGV4dCI+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2Z1bGxfYWxidW1faW1hZ2VfcG9ydHJhaXRfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMjBzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFN0eWxlPSJib2xkIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkYiIC8+Ci0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hcnRpc3QiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9hbGJ1bV9pbWFnZV9wb3J0cmFpdF9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbWN2Ml9tdXNpY19hcnRpc3RfdW5rbm93bl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTZzcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjQkJCQkJCIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTJlYTVlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYmxhY2tfb3BhY2l0eV83MCI+Ci0KLSAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIj4KLQotICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2ljb24iCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI4ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIvPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCI+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21haW5fdGV4dCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfdGV4dF9oZWlnaHQiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSJAY29sb3Ivd2hpdGUiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX21haW5fdGV4dF9zaXplIi8+Ci0KLSAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3N1Yl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc190ZXh0X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2JlbG93PSJAaWQvbWFpbl90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyZHAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iQGNvbG9yL3doaXRlX29wYWNpdHlfNzAiCi0gICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX3N1Yl90ZXh0X3NpemUiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDkxMjhkMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9mdWxsX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQiCi0gICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBjb2xvci9ibGFja19vcGFjaXR5XzcwIj4KLQotICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCIKLSAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgIDxJbWFnZVZpZXcKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2hlY2siCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc19pY29uX3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaWNvbl9zaXplIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luPSI4ZHAiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSJAZHJhd2FibGUvaWNfY2hlY2siLz4KLSAgICA8L0xpbmVhckxheW91dD4KLQotICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfaGVpZ2h0IgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotCi0gICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90ZXh0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZnVsbF9zZXR0aW5nc190ZXh0X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMmRwIgotICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IkBjb2xvci93aGl0ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IkBkaW1lbi9tY3YyX2Z1bGxfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiLz4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF90cmFuc3BvcnRfY29udHJvbHMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvZnVsbF90cmFuc3BvcnRfY29udHJvbHMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTE0Nzg1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L2Z1bGxfdHJhbnNwb3J0X2NvbnRyb2xzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDMxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9Im1hdGNoX3BhcmVudCIKLSAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IkBkaW1lbi9tY3YyX3RyYW5zcG9ydF9jb250cm9sc19wYWRkaW5nIgotICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSJAZGltZW4vbWN2Ml90cmFuc3BvcnRfY29udHJvbHNfcGFkZGluZyIKLSAgICBhbmRyb2lkOnZpc2liaWxpdHk9InZpc2libGUiPgotCi0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcHJldiIgc3R5bGU9IkBzdHlsZS9GdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUHJldmlvdXMiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcmV3IiBzdHlsZT0iQHN0eWxlL0Z1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcGF1c2UiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlBhdXNlIiAvPgotICAgIDxJbWFnZUJ1dHRvbiBhbmRyb2lkOmlkPSJAK2lkL2Zmd2QiIHN0eWxlPSJAc3R5bGUvRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLkZmd2QiIC8+Ci0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbmV4dCIgc3R5bGU9IkBzdHlsZS9GdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCIgLz4KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWVkaWFfY29udHJvbGxlci54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tZWRpYV9jb250cm9sbGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDY1OGYwNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tZWRpYV9jb250cm9sbGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTcgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgIGFuZHJvaWQ6bGF5b3V0RGlyZWN0aW9uPSJsdHIiPgotCi0gICAgPFJlbGF0aXZlTGF5b3V0Ci0gICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGl0bGVfYmFyIgotICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9IkBsYXlvdXQvdGl0bGVfYmFyX2dyYWRpZW50IgotICAgICAgICBzdHlsZT0iQHN0eWxlL1RpdGxlQmFyIj4KLQotICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX2Jhcl9sZWZ0IgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudExlZnQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2JhY2siCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFN0YXJ0PSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjVkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJ2aXNpYmxlIgotICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGl0bGVCYXJCdXR0b24uQmFjayIvPgotCi0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX3RleHQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDplbGxpcHNpemU9ImVuZCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvUmlnaHRPZj0iQGlkL2JhY2siCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDptYXhMaW5lcz0iMSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSI1ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSI1ZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dFNpemU9IjE1c3AiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkZGRiIvPgotICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpdGxlX2Jhcl9yaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRSaWdodD0idHJ1ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCI+Ci0KLSAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX2V4dGVybmFsX2xpbmsiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjbGlja2FibGU9InRydWUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFJpZ2h0PSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2NlbnRlclZlcnRpY2FsPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjVkaXAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEwZGlwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIj4KLQotICAgICAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX3RleHQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjVkaXAiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dD0iQHN0cmluZy9NZWRpYUNvbnRyb2xWaWV3Ml9hZF90ZXh0IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMHNwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRDb2xvcj0iI0ZGRkZGRkZGIiAvPgotCi0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYWRfbGF1bmNoIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvVGl0bGVCYXJCdXR0b24uTGF1bmNoIiAvPgotICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgICAgIDx2aWV3IGNsYXNzPSJjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlQnV0dG9uIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY2FzdCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaXRsZUJhckJ1dHRvbiIgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2NlbnRlcl92aWV3IgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjBkcCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiPgotICAgIDwvTGluZWFyTGF5b3V0PgotCi0gICAgPExpbmVhckxheW91dAotICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21pbmltYWxfZXh0cmFfdmlldyIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0icmlnaHQiPgotCi0gICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9mdWxsc2NyZWVuIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJyaWdodCIKLSAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLkZ1bGxTY3JlZW4iIC8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSI+Ci0KLSAgICAgICAgPFNlZWtCYXIKLSAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvcHJvZ3Jlc3MiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfdGh1bWJfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21jdjJfc2Vla19iYXJfZGVzYyIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZz0iMGRwIgotICAgICAgICAgICAgYW5kcm9pZDptYXhIZWlnaHQ9IkBkaW1lbi9tY3YyX2N1c3RvbV9wcm9ncmVzc19tYXhfc2l6ZSIKLSAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSJAZGltZW4vbWN2Ml9jdXN0b21fcHJvZ3Jlc3NfbWF4X3NpemUiCi0gICAgICAgICAgICBhbmRyb2lkOmVsZXZhdGlvbj0iMTBkcCIvPgotCi0gICAgICAgIDxWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3Byb2dyZXNzX2J1ZmZlciIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tY3YyX2J1ZmZlcl92aWV3X2hlaWdodCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50Qm90dG9tPSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSJAY29sb3IvYm90dG9tX2Jhcl9iYWNrZ3JvdW5kIgotICAgICAgICAgICAgYW5kcm9pZDplbGV2YXRpb249IjBkcCIvPgotICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci0KLSAgICA8UmVsYXRpdmVMYXlvdXQKLSAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ib3R0b21fYmFyIgotICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjQ0ZHAiCi0gICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iQGNvbG9yL2JvdHRvbV9iYXJfYmFja2dyb3VuZCI+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ib3R0b21fYmFyX2xlZnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJtYXRjaF9wYXJlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOmxheW91dF9hbGlnblBhcmVudFN0YXJ0PSJ0cnVlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiPgotCi0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2FkX3NraXBfdGltZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQ9IjRkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRTaXplPSIxMnNwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dENvbG9yPSIjRkZGRkZGIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aW1lIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfdG9SaWdodE9mPSJAaWQvYm90dG9tX2Jhcl9sZWZ0IgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTBkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMGRwIgotICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXIiID4KLQotICAgICAgICAgICAgPFRleHRWaWV3Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC90aW1lX2N1cnJlbnQiCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaW1lVGV4dC5DdXJyZW50Ii8+Ci0gICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3RpbWVfaW50ZXJwdW5jdCIKLSAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL1RpbWVUZXh0LkludGVycHVuY3QiLz4KLSAgICAgICAgICAgIDxUZXh0VmlldwotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdGltZV9lbmQiCi0gICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9UaW1lVGV4dC5FbmQiLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLSAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9ib3R0b21fYmFyX3JpZ2h0IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfYWxpZ25QYXJlbnRFbmQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9InJpZ2h0Ij4KLQotICAgICAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvYmFzaWNfY29udHJvbHMiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIiA+Ci0KLSAgICAgICAgICAgICAgICA8VGV4dFZpZXcKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9hZF9yZW1haW5pbmciCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0U2l6ZT0iMTJzcCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0Q29sb3I9IiNGRkZGRkYiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLQotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL211dGUiCi0gICAgICAgICAgICAgICAgICAgIHN0eWxlPSJAc3R5bGUvQm90dG9tQmFyQnV0dG9uLk11dGUiIC8+Ci0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvc3VidGl0bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRDZW50ZXIiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uQ0MiIC8+Ci0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZnVsbHNjcmVlbiIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uRnVsbFNjcmVlbiIvPgotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL292ZXJmbG93X3JpZ2h0IgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5PdmVyZmxvd1JpZ2h0Ii8+Ci0gICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLQotICAgICAgICAgICAgPExpbmVhckxheW91dAotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvZXh0cmFfY29udHJvbHMiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCI+Ci0KLSAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvY3VzdG9tX2J1dHRvbnMiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IiAvPgotCi0gICAgICAgICAgICAgICAgPEltYWdlQnV0dG9uCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvdmlkZW9fcXVhbGl0eSIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9IkBzdHlsZS9Cb3R0b21CYXJCdXR0b24uVmlkZW9RdWFsaXR5IiAvPgotICAgICAgICAgICAgICAgIDxJbWFnZUJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL3NldHRpbmdzIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5TZXR0aW5ncyIgLz4KLSAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9vdmVyZmxvd19sZWZ0IgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iQHN0eWxlL0JvdHRvbUJhckJ1dHRvbi5PdmVyZmxvd0xlZnQiLz4KLSAgICAgICAgICAgIDwvTGluZWFyTGF5b3V0PgotICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICA8L1JlbGF0aXZlTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9taW5pbWFsX3RyYW5zcG9ydF9jb250cm9scy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9taW5pbWFsX3RyYW5zcG9ydF9jb250cm9scy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMGM4MGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbWluaW1hbF90cmFuc3BvcnRfY29udHJvbHMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICBhbmRyb2lkOmxheW91dF93aWR0aD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0ibWF0Y2hfcGFyZW50IgotICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiPgotCi0gICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvcGF1c2UiIHN0eWxlPSJAc3R5bGUvTWluaW1hbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uIiAvPgotPC9MaW5lYXJMYXlvdXQ+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9kaWFsb2cueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9kaWFsb2cueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTg5ZTE2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2Nob29zZXJfZGlhbG9nLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPExpbmVhckxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIj4KLSAgICA8VGV4dFZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9jaG9vc2VyX3RpdGxlIgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIyNGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnRleHQ9IkBzdHJpbmcvbXJfY2hvb3Nlcl90aXRsZSIKLSAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICAgICAgICBhbmRyb2lkOmVsbGlwc2l6ZT0iZW5kIgotICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuVGl0bGUiIC8+Ci0gICAgPExpc3RWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2hvb3Nlcl9saXN0IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmRpdmlkZXI9IkBhbmRyb2lkOmNvbG9yL3RyYW5zcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmRpdmlkZXJIZWlnaHQ9IjBkcCIgLz4KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkBhbmRyb2lkOmlkL2VtcHR5IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjQwZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIgotICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjkwZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjE2ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxNmRwIgotICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiPgotICAgICAgICA8VGV4dFZpZXcgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0PSJAc3RyaW5nL21yX2Nob29zZXJfc2VhcmNoaW5nIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiIC8+Ci0gICAgICAgIDxQcm9ncmVzc0JhciBhbmRyb2lkOmxheW91dF93aWR0aD0iMTUwZHAiCi0gICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlciIKLSAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aW5kZXRlcm1pbmF0ZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgIHN0eWxlPSI/YW5kcm9pZDphdHRyL3Byb2dyZXNzQmFyU3R5bGVIb3Jpem9udGFsIiAvPgotICAgIDwvTGluZWFyTGF5b3V0PgotPC9MaW5lYXJMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2xpc3RfaXRlbS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jaG9vc2VyX2xpc3RfaXRlbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ODg3OWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY2hvb3Nlcl9saXN0X2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IjU2ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ0xlZnQ9IjI0ZHAiCi0gICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIyNGRwIgotICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIgPgotCi0gICAgPEltYWdlVmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfcm91dGVfaWNvbiIKLSAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIyNGRwIgotICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNGRwIgotICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luUmlnaHQ9IjI0ZHAiIC8+Ci0KLSAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSIxZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIgPgotCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfcm91dGVfbmFtZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMzJkcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlByaW1hcnlUZXh0IiAvPgotCi0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2Nob29zZXJfcm91dGVfZGVzYyIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJtYXJxdWVlIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlNlY29uZGFyeVRleHQiIC8+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci0KLTwvTGluZWFyTGF5b3V0PgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvbXJfY29udHJvbGxlcl9tYXRlcmlhbF9kaWFsb2dfYi54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX21hdGVyaWFsX2RpYWxvZ19iLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjMwNDQ3MS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX21hdGVyaWFsX2RpYWxvZ19iLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxGcmFtZUxheW91dCB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDppZD0iQCtpZC9tcl9leHBhbmRhYmxlX2FyZWEiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iZmlsbF9wYXJlbnQiPgotICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9kaWFsb2dfYXJlYSIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iY2VudGVyIgotICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL2NvbG9yQmFja2dyb3VuZEZsb2F0aW5nIj4KLSAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX3RpdGxlX2JhciIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMmRwIgotICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIgPgotICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfbmFtZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iMGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iNzJkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6ZWxsaXBzaXplPSJlbmQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp0ZXh0QXBwZWFyYW5jZT0iQHN0eWxlL1RleHRBcHBlYXJhbmNlLk1lZGlhUm91dGVyLlRpdGxlIiAvPgotICAgICAgICAgICAgPEltYWdlQnV0dG9uIGFuZHJvaWQ6aWQ9IkAraWQvbXJfY2xvc2UiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbj0iQHN0cmluZy9tcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSI/YXR0ci9tZWRpYVJvdXRlQ2xvc2VEcmF3YWJsZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmJhY2tncm91bmQ9Ij9hbmRyb2lkOmF0dHIvc2VsZWN0YWJsZUl0ZW1CYWNrZ3JvdW5kQm9yZGVybGVzcyIgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX2N1c3RvbV9jb250cm9sIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0gICAgICAgIDxGcmFtZUxheW91dCBhbmRyb2lkOmlkPSJAK2lkL21yX2RlZmF1bHRfY29udHJvbCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ij4KLSAgICAgICAgICAgIDxJbWFnZVZpZXcgYW5kcm9pZDppZD0iQCtpZC9tcl9hcnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6YWRqdXN0Vmlld0JvdW5kcz0idHJ1ZSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnNjYWxlVHlwZT0iZml0WFkiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpiYWNrZ3JvdW5kPSI/YW5kcm9pZDphdHRyL2NvbG9yUHJpbWFyeSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9ncmF2aXR5PSJ0b3AiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDp2aXNpYmlsaXR5PSJnb25lIiAvPgotICAgICAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0idmVydGljYWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfZ3Jhdml0eT0iYm90dG9tIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3BsaXRNb3Rpb25FdmVudHM9ImZhbHNlIj4KLSAgICAgICAgICAgICAgICA8TGluZWFyTGF5b3V0IGFuZHJvaWQ6aWQ9IkAraWQvbXJfbWVkaWFfbWFpbl9jb250cm9sIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nVG9wPSIxNmRwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjE2ZHAiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2dyYXZpdHk9ImJvdHRvbSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDp0aGVtZT0iP2F0dHIvbWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+Ci0gICAgICAgICAgICAgICAgICAgIDxSZWxhdGl2ZUxheW91dAotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tcl9wbGF5YmFja19jb250cm9sIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJob3Jpem9udGFsIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMjRkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1JpZ2h0PSIxMmRwIiA+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8SW1hZ2VCdXR0b24gYW5kcm9pZDppZD0iQCtpZC9tcl9jb250cm9sX3BsYXliYWNrX2N0cmwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5MZWZ0PSIxMmRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50UmlnaHQ9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfY2VudGVyVmVydGljYWw9InRydWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb249IkBzdHJpbmcvbXJfY29udHJvbGxlcl9wbGF5IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9zZWxlY3RhYmxlSXRlbUJhY2tncm91bmRCb3JkZXJsZXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQgYW5kcm9pZDppZD0iQCtpZC9tcl9jb250cm9sX3RpdGxlX2NvbnRhaW5lciIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOm9yaWVudGF0aW9uPSJ2ZXJ0aWNhbCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3RvTGVmdE9mPSJAaWQvbXJfY29udHJvbF9wbGF5YmFja19jdHJsIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2FsaWduUGFyZW50TGVmdD0idHJ1ZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9jZW50ZXJWZXJ0aWNhbD0idHJ1ZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPFRleHRWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF90aXRsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dGV4dEFwcGVhcmFuY2U9IkBzdHlsZS9UZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5QcmltYXJ5VGV4dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX2NvbnRyb2xfc3VidGl0bGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuU2Vjb25kYXJ5VGV4dCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpzaW5nbGVMaW5lPSJ0cnVlIiAvPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDwvUmVsYXRpdmVMYXlvdXQ+Ci0gICAgICAgICAgICAgICAgICAgIDxWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfY29udHJvbF9kaXZpZGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDxMaW5lYXJMYXlvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX2NvbnRyb2wiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI0OGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpncmF2aXR5PSJjZW50ZXJfdmVydGljYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjEyZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnNwbGl0TW90aW9uRXZlbnRzPSJmYWxzZSI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8SW1hZ2VWaWV3Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IjI0ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSIyNGRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSI/YXR0ci9tZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Z3Jhdml0eT0iY2VudGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJjZW50ZXIiLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS0gU2luY2UgZGlhbG9nJ3MgdG9wIGxheW91dCBtcl9leHBhbmRhYmxlX2FyZWEgaXMgY2xpY2thYmxlLCBpdCBwcm9wYWdhdGVzIHByZXNzZWQgc3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gaXRzIG5vbi1jbGlja2FibGUgY2hpbGRyZW4uIFNwZWNpZnkgYW5kcm9pZDpjbGlja2FibGU9InRydWUiIHRvIHByZXZlbnQgdm9sdW1lIHNsaWRlcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIGhhdmluZyBmYWxzZSBwcmVzc2VkIHN0YXRlLiAtLT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlVm9sdW1lU2xpZGVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9tcl92b2x1bWVfc2xpZGVyIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptaW5IZWlnaHQ9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDptYXhIZWlnaHQ9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2VpZ2h0PSIxIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y2xpY2thYmxlPSJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgLz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL21yX2dyb3VwX2V4cGFuZF9jb2xsYXBzZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iNDhkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IjQ4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nPSIxMmRwIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6YmFja2dyb3VuZD0iP2FuZHJvaWQ6YXR0ci9zZWxlY3RhYmxlSXRlbUJhY2tncm91bmRCb3JkZXJsZXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iZ29uZSIvPgotICAgICAgICAgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgICAgICAgICA8L0xpbmVhckxheW91dD4KLSAgICAgICAgICAgICAgICA8Y29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuT3ZlcmxheUxpc3RWaWV3Ci0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX2dyb3VwX2xpc3QiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6cGFkZGluZ1RvcD0iQGRpbWVuL21yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfcGFkZGluZ190b3AiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2Nyb2xsYmFyU3R5bGU9Im91dHNpZGVPdmVybGF5IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmNsaXBUb1BhZGRpbmc9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnZpc2liaWxpdHk9ImdvbmUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3BsaXRNb3Rpb25FdmVudHM9ImZhbHNlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOnRoZW1lPSI/YXR0ci9tZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5IiAvPgotICAgICAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgICAgIDwvRnJhbWVMYXlvdXQ+Ci0gICAgICAgIDxTY3JvbGxWaWV3Ci0gICAgICAgICAgICBhbmRyb2lkOmlkPSJAK2lkL2J1dHRvblBhbmVsIgotICAgICAgICAgICAgc3R5bGU9Ij9hdHRyL2J1dHRvbkJhclN0eWxlIgotICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgYW5kcm9pZDpmaWxsVmlld3BvcnQ9InRydWUiCi0gICAgICAgICAgICBhbmRyb2lkOnNjcm9sbEluZGljYXRvcnM9InRvcHxib3R0b20iPgotICAgICAgICAgICAgPGFuZHJvaWQuc3VwcG9ydC52Ny53aWRnZXQuQnV0dG9uQmFyTGF5b3V0Ci0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9Im1hdGNoX3BhcmVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImJvdHRvbSIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dERpcmVjdGlvbj0ibG9jYWxlIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249Imhvcml6b250YWwiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nQm90dG9tPSI0ZHAiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nTGVmdD0iMTJkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdSaWdodD0iMTJkcCIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdUb3A9IjRkcCI+Ci0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9idXR0b24zIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9idXR0b25CYXJOZXV0cmFsQnV0dG9uU3R5bGUiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0id3JhcF9jb250ZW50Ii8+Ci0gICAgICAgICAgICAgICAgPGFuZHJvaWQuc3VwcG9ydC52NC53aWRnZXQuU3BhY2UKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQCtpZC9zcGFjZXIiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSIwZHAiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iMGRwIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93ZWlnaHQ9IjEiCi0gICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6dmlzaWJpbGl0eT0iaW52aXNpYmxlIi8+Ci0gICAgICAgICAgICAgICAgPEJ1dHRvbgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmlkPSJAYW5kcm9pZDppZC9idXR0b24yIgotICAgICAgICAgICAgICAgICAgICBzdHlsZT0iP2FuZHJvaWQ6YXR0ci9idXR0b25CYXJOZWdhdGl2ZUJ1dHRvblN0eWxlIgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCIvPgotICAgICAgICAgICAgICAgIDxCdXR0b24KLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDppZD0iQGFuZHJvaWQ6aWQvYnV0dG9uMSIKLSAgICAgICAgICAgICAgICAgICAgc3R5bGU9Ij9hbmRyb2lkOmF0dHIvYnV0dG9uQmFyUG9zaXRpdmVCdXR0b25TdHlsZSIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IndyYXBfY29udGVudCIKLSAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiLz4KLSAgICAgICAgICAgIDwvYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5CdXR0b25CYXJMYXlvdXQ+Ci0gICAgICAgIDwvU2Nyb2xsVmlldz4KLSAgICA8L0xpbmVhckxheW91dD4KLTwvRnJhbWVMYXlvdXQ+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC9tcl9jb250cm9sbGVyX3ZvbHVtZV9pdGVtLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2NvbnRyb2xsZXJfdm9sdW1lX2l0ZW0ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODkwNThiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L21yX2NvbnRyb2xsZXJfdm9sdW1lX2l0ZW0ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08TGluZWFyTGF5b3V0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9ImZpbGxfcGFyZW50IgotICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IndyYXBfY29udGVudCI+Ci0gICAgPExpbmVhckxheW91dCBhbmRyb2lkOmlkPSJAK2lkL3ZvbHVtZV9pdGVtX2NvbnRhaW5lciIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X3dpZHRoPSJmaWxsX3BhcmVudCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9oZWlnaHQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdMZWZ0PSIyNGRwIgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpwYWRkaW5nUmlnaHQ9IjYwZHAiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnBhZGRpbmdCb3R0b209IjhkcCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6b3JpZW50YXRpb249InZlcnRpY2FsIiA+Ci0gICAgICAgIDxUZXh0VmlldyBhbmRyb2lkOmlkPSJAK2lkL21yX25hbWUiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0id3JhcF9jb250ZW50IgotICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICBhbmRyb2lkOnRleHRBcHBlYXJhbmNlPSJAc3R5bGUvVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuU2Vjb25kYXJ5VGV4dCIKLSAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2luZ2xlTGluZT0idHJ1ZSIgLz4KLSAgICAgICAgPExpbmVhckxheW91dCBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSJ3cmFwX2NvbnRlbnQiCi0gICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpvcmllbnRhdGlvbj0iaG9yaXpvbnRhbCIKLSAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmdyYXZpdHk9ImNlbnRlcl92ZXJ0aWNhbCI+Ci0gICAgICAgICAgICA8SW1hZ2VWaWV3IGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX2l0ZW1faWNvbiIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faWNvbl9zaXplIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9oZWlnaHQ9IkBkaW1lbi9tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faWNvbl9zaXplIgotICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF9tYXJnaW5Ub3A9IjhkcCIKLSAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfbWFyZ2luQm90dG9tPSI4ZHAiCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c2NhbGVUeXBlPSJmaXRDZW50ZXIiCi0gICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQ6c3JjPSI/YXR0ci9tZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIiAvPgotICAgICAgICAgICAgPGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6aWQ9IkAraWQvbXJfdm9sdW1lX3NsaWRlciIKLSAgICAgICAgICAgICAgICBhbmRyb2lkOmxheW91dF93aWR0aD0iZmlsbF9wYXJlbnQiCi0gICAgICAgICAgICAgICAgYW5kcm9pZDpsYXlvdXRfaGVpZ2h0PSI0MGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWluSGVpZ2h0PSI0MGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6bWF4SGVpZ2h0PSI0MGRwIgotICAgICAgICAgICAgICAgIGFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uPSJAc3RyaW5nL21yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgLz4KLSAgICAgICAgPC9MaW5lYXJMYXlvdXQ+Ci0gICAgPC9MaW5lYXJMYXlvdXQ+Ci08L0xpbmVhckxheW91dD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvbGF5b3V0L3NldHRpbmdzX2xpc3QueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvc2V0dGluZ3NfbGlzdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMzA1MzguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvc2V0dGluZ3NfbGlzdC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxMaXN0VmlldyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgYW5kcm9pZDpsYXlvdXRfd2lkdGg9IkBkaW1lbi9tY3YyX2VtYmVkZGVkX3NldHRpbmdzX3dpZHRoIgotICAgIGFuZHJvaWQ6bGF5b3V0X2hlaWdodD0iQGRpbWVuL21jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0IgotICAgIGFuZHJvaWQ6ZGl2aWRlcj0iQG51bGwiCi0gICAgYW5kcm9pZDpkaXZpZGVySGVpZ2h0PSIwZHAiPgotPC9MaXN0Vmlldz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC90aXRsZV9iYXJfZ3JhZGllbnQueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy9sYXlvdXQvdGl0bGVfYmFyX2dyYWRpZW50LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWIxZmM2ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL2xheW91dC90aXRsZV9iYXJfZ3JhZGllbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08c2hhcGUgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIGFuZHJvaWQ6c2hhcGU9InJlY3RhbmdsZSI+Ci0gICAgPGdyYWRpZW50Ci0gICAgICAgIGFuZHJvaWQ6c3RhcnRDb2xvcj0iQGNvbG9yL3RpdGxlX2Jhcl9ncmFkaWVudF9zdGFydCIKLSAgICAgICAgYW5kcm9pZDplbmRDb2xvcj0iQGNvbG9yL3RpdGxlX2Jhcl9ncmFkaWVudF9lbmQiCi0gICAgICAgIGFuZHJvaWQ6YW5nbGU9Ii0yNzAiIC8+Ci08L3NoYXBlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWFmL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3MjMwYWQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYWYvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3RlbHNlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJUb2VzdGVsbGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0LWtub3BwaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJVaXRzYWFpLWtub3BwaWUuIE9udGtvcHBlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVWl0c2FhaS1rbm9wcGllLiBLb3BwZWwgdGFucyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJVaXRzYWFpLWtub3BwaWUuIEdla29wcGVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlNhYWkgdWl0IG5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iVmluZCB0YW5zIHRvZXN0ZWxsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPbnRrb3BwZWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJIb3Ugb3AgdWl0c2FhaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTWFhayB0b2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJTcGVlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iTGFhdCB3YWciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVm91IHVpdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVm91IGluIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1rdW5zd2VyayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWVnbHllciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iR2VlbiBtZWRpYSBpcyBnZWtpZXMgbmllIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJHZWVuIGlubGlndGluZyBiZXNraWtiYWFyIG5pZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2FhaSB0YW5zIHNrZXJtIHVpdCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYW0vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzlhMTkwMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hbS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLhiLXhiK3hi5PhibUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4YiY4Yij4Yiq4Yur4YuO4Ym9Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4YuoQ2FzdCDhiqDhi53hiKvhiK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IOGKoOGLneGIq+GIreGNoiDhjI3hipXhipnhipDhibUg4Ymw4YmL4Yit4Yyn4YiNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IOGKoOGLneGIq+GIrSDhiaDhiJvhjIjhipPhipjhibUg4YiL4YutIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3Qg4Yqg4Yud4Yir4Yit4Y2iIOGJsOGMiOGKk+GKneGJt+GIjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IOGKoOGLteGIreGMjSDhi4jhi7AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLhiJjhiKPhiKrhi6vhi47hib3hipUg4Ymg4Yib4YyN4YqY4Ym1IOGIi+GLrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLhjI3hipXhipnhipDhibUg4Yqg4YmL4Yit4YylIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQ2FzdCDhiJvhi7XhiKjhjI0g4Yqg4YmB4YidIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLhi53hjIsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLhiqDhjKvhi43hibUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuGIiOGKoOGNjeGJsyDhiqDhiYHhiJ0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLhiqDhiYHhiJ0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLhiqDhiLXhjYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuGIsOGJpeGIteGJpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuGLqOGKoOGIjeGJoOGInSDhiLXhipAt4Yyl4Ymg4YmlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGJsOGKleGIuOGIq+GJs+GJvSDhi6jhi7XhiJ3hjYUg4YiY4YmG4Yyj4Yyg4Yiq4YurIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLhiJ3hipXhiJ0g4Yib4YiF4Yuw4Yio4YiY4Yio4YyDIOGKoOGIjeGJsOGImOGIqOGMoOGInSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4Yid4YqV4YidIOGImOGIqOGMgyDhiqDhi63hjIjhip3hiJ0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGIm+GLqyDhjIjhjL3hipUg4Ymg4YiY4YuN4Yiw4Yu1IOGIi+GLrSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhmYjk3ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLYp9mE2YbYuNin2YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i2KfZhNij2KzZh9iy2KkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLYstixINin2YTYpdix2LPYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i2LLYsSDYp9mE2KXYsdiz2KfZhC4g2KrZhSDZgti32Lkg2KfZhNin2KrYtdin2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Itiy2LEg2KfZhNil2LHYs9in2YQuINis2KfYsdmNINin2YTYp9iq2LXYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Itiy2LEg2KfZhNil2LHYs9in2YQuINiq2YUg2KfZhNin2KrYtdin2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i2KXYsdiz2KfZhCDYpdmE2YkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLYrNin2LHZjSDYp9mE2KjYrdirINi52YYg2KPYrNmH2LLYqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLZgti32Lkg2KfZhNin2KrYtdin2YQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLYpdmK2YLYp9mBINin2YTYpdix2LPYp9mEIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLYpdi62YTYp9mCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i2KrYtNi62YrZhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i2KXZitmC2KfZgSDZhdik2YLYqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Itil2YrZgtin2YEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLYqtmI2LPZiti5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLYqti12LrZitixIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i2LXZiNix2Kkg2KfZhNij2YTYqNmI2YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i2LTYsdmK2Lcg2KrZhdix2YrYsSDZhdiz2KrZiNmJINin2YTYtdmI2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItmE2YUg2YrYqtmFINin2K7YqtmK2KfYsSDYo9mKINmI2LPYp9im2LciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItmE2Kcg2KrYqtmI2YHYsSDYo9mKINmF2LnZhNmI2YXYp9iqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLYrNin2LHZjSDYpdix2LPYp9mEINin2YTYtNin2LTYqSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYXovc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hei9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjNjBhYi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1hei9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQ2loYXpsYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJZYXnEsW0gZMO8eW3JmXNpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iWWF5xLFtIGTDvHltyZlzaS4gQmHEn2xhbnTEsSBryZlzaWxkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iWWF5xLFtIGTDvHltyZlzaS4gUW/Fn3VsdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iWWF5xLFtIGTDvHltyZlzaS4gUW/Fn3VsZHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQnVyYSB5YXnEsW1sYXnEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJDaWhhemxhciBheHRhcsSxbMSxciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJCYcSfbGFudMSxbsSxIGvJmXNpbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IllhecSxbcSxIGRheWFuZMSxcsSxbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iUWFwYWTEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJPeW5hZMSxbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iRHVyZHVydW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEYXlhbmTEsXLEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJHZW5pxZ9syZluZGlyaW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlnEscSfY2FtbGHFn2TEsXLEsW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJvbSBpbmPJmXPJmW7JmXRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlPJmXMgaMmZcm1pIGRpeWlyY8mZeWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ikhlw6cgYmlyIG1lZGlhIHNlw6dpbG3JmXlpYiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4ixo9sw6dhdGFuIG3JmWx1bWF0IHlveGR1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRWtyYW4geWF5xLFtbGFuxLFyIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iK3NyK0xhdG4vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iK3NyK0xhdG4vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNWJkNmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYitzcitMYXRuL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJVcmXEkWFqaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkR1Z21lIFByZWJhY2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJEdWdtZSBQcmViYWNpLiBWZXphIGplIHByZWtpbnV0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iRHVnbWUgUHJlYmFjaS4gUG92ZXp1amUgc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iRHVnbWUgUHJlYmFjaS4gUG92ZXphbiBqZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcmViYWN1aiBuYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlByb25hbGHFvmVuamUgdXJlxJFhamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iUHJla2luaSB2ZXp1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmF1c3RhdmkgcHJlYmFjaXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXR2b3JpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHVzdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXppcmFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmF1c3RhdmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQcm/FoWlyaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2t1cGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPbW90IGFsYnVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJLbGl6YcSNIHphIGphxI1pbnUgenZ1a2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbWEgaXphYnJhbmloIG1lZGlqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmlzdSBkb3N0dXBuZSBuaWtha3ZlIGluZm9ybWFjaWplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQcmViYWN1amUgc2UgZWtyYW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJlL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjMzkxYzEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYmUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHRltGB0YLRjdC80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0J/RgNGL0LvQsNC00YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGL0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQmtC90L7Qv9C60LAg0YLRgNCw0L3RgdC70Y/RhtGL0ZYuINCQ0LTQutC70Y7Rh9Cw0L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRi9GWLiDQhtC00LfQtSDQv9Cw0LTQutC70Y7Rh9GN0L3QvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0YvRli4g0J/QsNC00LrQu9GO0YfQsNC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0KLRgNCw0L3RgdC70ZbRgNCw0LLQsNGG0Ywg0L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCf0L7RiNGD0Log0L/RgNGL0LvQsNC0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCQ0LTQu9GD0YfRi9GG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQodC/0YvQvdGW0YbRjCDRgtGA0LDQvdGB0LvRj9GG0YvRjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNC60YDRi9GG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQn9GA0LDQudCz0YDQsNGG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0YDRi9C/0YvQvdGW0YbRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCh0L/Ri9C90ZbRhtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0KDQsNC30LPQsNGA0L3Rg9GG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCX0LPQsNGA0L3Rg9GG0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQktC+0LrQu9Cw0LTQutCwINCw0LvRjNCx0L7QvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCf0LDRntC30YPQvdC+0Log0LPRg9GH0L3QsNGB0YbRliI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JzQtdC00YvRj9GE0LDQudC7INC90LUg0LLRi9Cx0YDQsNC90YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCG0L3RhNCw0YDQvNCw0YbRi9GPINCw0LTRgdGD0YLQvdGW0YfQsNC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQrdC60YDQsNC9INGC0YDQsNC90YHQu9GP0YbRi9GWIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1iZy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjcxMmQ0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJnL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0LjRgdGC0LXQvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCj0YHRgtGA0L7QudGB0YLQstCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JHRg9GC0L7QvSDQt9CwINC/0YDQtdC00LDQstCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUuINCS0YDRitC30LrQsNGC0LAg0LUg0L/RgNC10LrRgNCw0YLQtdC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCR0YPRgtC+0L0g0LfQsCDQv9GA0LXQtNCw0LLQsNC90LUuINCh0LLRitGA0LfQstCwINGB0LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JHRg9GC0L7QvSDQt9CwINC/0YDQtdC00LDQstCw0L3QtS4g0KPRgdGC0LDQvdC+0LLQtdC90LAg0LUg0LLRgNGK0LfQutCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCf0YDQtdC00LDQstCw0L3QtSDQutGK0LwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQotGK0YDRgdGP0YIg0YHQtSDRg9GB0YLRgNC+0LnRgdGC0LLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQn9GA0LXQutGA0LDRgtGP0LLQsNC90LUg0L3QsCDQstGA0YrQt9C60LDRgtCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0KHQv9C40YDQsNC90LUg0L3QsCDQv9GA0LXQtNCw0LLQsNC90LXRgtC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0YLQstCw0YDRj9C90LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQn9GD0YHQutCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/QvtGB0YLQsNCy0Y/QvdC1INC90LAg0L/QsNGD0LfQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCh0L/QuNGA0LDQvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0KDQsNC30LPRitCy0LDQvdC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQodCy0LjQstCw0L3QtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCe0LHQu9C+0LbQutCwINC90LAg0LDQu9Cx0YPQvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCf0LvRitC30LPQsNGHINC30LAg0YHQuNC70LDRgtCwINC90LAg0LfQstGD0LrQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0J3Rj9C80LAg0LjQt9Cx0YDQsNC90LAg0LzRg9C70YLQuNC80LXQtNC40Y8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCd0Y/QvNCwINC90LDQu9C40YfQvdCwINC40L3RhNC+0YDQvNCw0YbQuNGPIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQldC60YDQsNC90YrRgiDRgdC1INC/0YDQtdC00LDQstCwIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ibi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJuL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYmY1OTMyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWJuL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCmuOCmv+CmuOCnjeCmn+Cnh+CmriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpqHgpr/gpq3gpr7gpofgprjgppfgp4HgprLgpr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCmleCmvuCmuOCnjeCmnyDgppXgprDgpr7gprAg4Kas4KeL4Kak4Ka+4Kau4Ke3IOCmuOCmguCmr+Cni+CmlyDgpqzgpr/gpprgp43gppvgpr/gpqjgp43gpqgg4Ka54Kav4Ka84KeH4Kab4KeHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmruCntyDgprjgpoLgpq/gp4vgppcg4KaV4Kaw4Ka+IOCmueCmmuCnjeCmm+CnhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+4KawIOCmrOCni+CmpOCmvuCmruCntyDgprjgpoLgpq/gp4HgppXgp43gpqQg4Ka54Kav4Ka84KeH4Kab4KeHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCmj+CmpOCnhyDgppXgpr7gprjgp43gpp8g4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4Kah4Ka/4Kat4Ka+4KaH4Ka44KaX4KeB4Kay4Ka/4KaV4KeHIOCmluCni+CmgeCmnOCmviDgprngpprgp43gppvgp4ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Ka44KaC4Kav4KeL4KaXIOCmrOCmv+CmmuCnjeCmm+Cmv+CmqOCnjeCmqCDgppXgprDgp4HgpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+IOCmrOCmqOCnjeCmpyDgppXgprDgp4HgpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCmrOCmqOCnjeCmpyDgppXgprDgp4HgpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgpprgpr7gprLgpr7gpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCmrOCmv+CmsOCmvuCmriDgpqbgpr/gpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpqXgpr7gpq7gpr7gpqgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgpqzgpqHgprwg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgprjgppngp43gppXgp4Hgpprgpr/gpqQg4KaV4Kaw4KeB4KaoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KaF4KeN4Kav4Ka+4Kay4Kas4Ka+4KauIOCmtuCniOCmsuCmvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgpq3gprLgpr/gpongpq4g4Ka44KeN4Kay4Ka+4KaH4Kah4Ka+4KawIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgppXgp4vgpqjgp4sg4Kau4Ka/4Kah4Ka/4Kav4Ka84Ka+IOCmqOCmv+CmsOCnjeCmrOCmvuCmmuCmqCDgppXgprDgpr4g4Ka54Kav4Ka84Kao4Ka/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgppXgp4vgpqjgp4sg4Kak4Kal4KeN4KavIOCmieCmquCmsuCmrOCnjeCmpyDgpqjgp4fgpociPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCmuOCnjeCmleCnjeCmsOCngOCmqCDgppXgpr7gprjgp43gpp8g4KaV4Kaw4Ka+IOCmueCmmuCnjeCmm+CnhyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtYnMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1icy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzExYzc0Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1icy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVXJlxJFhamkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJEdWdtZSB6YSBlbWl0aXJhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iRHVnbWUgemEgZW1pdGlyYW5qZS4gVmV6YSBqZSBwcmVraW51dGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkR1Z21lIHphIGVtaXRpcmFuamUuIFBvdmV6aXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkR1Z21lIHphIGVtaXRpcmFuamUuIFBvdmV6YW5vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkVtaXRpcmFuamUgbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJUcmHFvmVuamUgdXJlxJFhamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iUHJla2luaSB2ZXp1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmF1c3RhdmkgcHJlYmFjaXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXR2b3JpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWNpcmFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXV6aXJhaiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlphdXN0YXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUHJvxaFpcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNrdXBpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iT21vdCBhbGJ1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iS2xpemHEjSB6YSBqYcSNaW51IHp2dWthIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWplZGFuIG1lZGlqIG5pamUgb2RhYnJhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVtYSBkb3N0dXBuaWggaW5mb3JtYWNpamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlByZWJhY3VqZSBzZSBla3JhbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtY2Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY4NWFjZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXVzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w7MgZFwnZW1ldHJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w7MgRW1ldC4gRGVzY29ubmVjdGF0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w7MgRW1ldC4gU1wnZXN0w6AgY29ubmVjdGFudC4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w7MgRW1ldC4gQ29ubmVjdGF0LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWV0IGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJTXCdlc3RhbiBjZXJjYW50IGRpc3Bvc2l0aXVzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2Nvbm5lY3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQXR1cmEgbFwnZW1pc3Npw7MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlRhbmNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWVpeCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUG9zYSBlbiBwYXVzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkF0dXJhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRGVzcGxlZ2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlcGxlZ2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJJbWF0Z2UgZGUgbFwnw6BsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkNvbnRyb2wgbGxpc2NhbnQgZGUgdm9sdW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIHNcJ2hhIHNlbGVjY2lvbmF0IGNhcCBmaXR4ZXIgbXVsdGltw6hkaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGhpIGhhIGluZm9ybWFjacOzIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVtaXNzacOzIGRlIHBhbnRhbGxhIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1jcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOWE4OTIwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWNzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iWmHFmcOtemVuw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJUbGHEjcOtdGtvIG9kZXPDrWzDoW7DrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IlRsYcSNw610a28gb2Rlc8OtbMOhbsOtLiBPZHBvamVubyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVGxhxI3DrXRrbyBvZGVzw61sw6Fuw60uIFDFmWlwb2pvdsOhbsOtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlRsYcSNw610a28gb2Rlc8OtbMOhbsOtLiBQxZlpcG9qZW5vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+Ik9kZXPDrWxhdCBkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkhsZWTDoW7DrSB6YcWZw616ZW7DrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPZHBvaml0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmFzdGF2aXQgb2Rlc8OtbMOhbsOtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJaYXbFmcOtdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlDFmWVocsOhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUG96YXN0YXZpdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Ilphc3Rhdml0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUm96YmFsaXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNiYWxpdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Ik9iYWwgYWxiYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJQb3N1dm7DrWsgaGxhc2l0b3N0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVieWxhIHZ5YnLDoW5hIMW+w6FkbsOhIG3DqWRpYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmVqc291IGvCoGRpc3BvemljaSDFvsOhZG7DqSBpbmZvcm1hY2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Ik9kZXPDrWzDoW7DrSBvYnNhaHUgb2JyYXpvdmt5Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZTdhNzkwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWRhL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJFbmhlZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1rbmFwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdC1rbmFwLiBGb3JiaW5kZWxzZW4gZXIgYWZicnVkdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdC1rbmFwLiBPcHJldHRlciBmb3JiaW5kZWxzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LWtuYXAuIFRpbHNsdXR0ZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0aWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kZXIgZW5oZWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJBZmJyeWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wIG1lZCBhdCBjYXN0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTHVrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iQWZzcGlsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJTw6Z0IHDDpSBwYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJVZHZpZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iU2tqdWwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWdyYWZpayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJMeWRzdHlya2Vza3lkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkluZ2VuIG1lZGllciBlciBtYXJrZXJldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iRGVyIGVyIGluZ2VuIHRpbGfDpm5nZWxpZ2Ugb3BseXNuaW5nZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNrw6ZybWVuIGNhc3RlcyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZGUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjZiZjU3Yy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1kZS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iR2Vyw6R0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtU3ltYm9sIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iU3RyZWFtaW5nLVNjaGFsdGZsw6RjaGUuIE5pY2h0IHZlcmJ1bmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iU3RyZWFtaW5nLVNjaGFsdGZsw6RjaGUuIFZlcmJpbmR1bmcgd2lyZCBoZXJnZXN0ZWxsdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJTdHJlYW1pbmctU2NoYWx0ZmzDpGNoZS4gVmVyYnVuZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlN0cmVhbWVuIGF1ZiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkdlcsOkdGUgd2VyZGVuIGdlc3VjaHQuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlZlcmJpbmR1bmcgdHJlbm5lbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0cmVhbWluZyBiZWVuZGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJTY2hsaWXDn2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iV2llZGVyZ2ViZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNpZXJlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkJlZW5kZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJNYXhpbWllcmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJNaW5pbWllcmVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1jb3ZlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJTY2hpZWJlcmVnbGVyIGbDvHIgZGllIExhdXRzdMOkcmtlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJLZWluZSBNZWRpZW4gYXVzZ2V3w6RobHQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IktlaW5lIEluZm9ybWF0aW9uZW4gdmVyZsO8Z2JhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQmlsZHNjaGlybSB3aXJkIGdlc3RyZWFtdC4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MmY2OWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZWwvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4izqPPjc+Dz4TOt868zrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4izqPPhc+DzrrOtc+Fzq3PgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Is6azr/Phc68z4DOryBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4izprOv8+FzrzPgM6vIM68zrXPhM6szrTOv8+DzrfPgi4gzpHPgM6/z4PPhc69zrTOrc64zrfOus61Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLOms6/z4XOvM+Azq8gzrzOtc+EzqzOtM6/z4POty4gzqPPjc69zrTOtc+Dzrcgz4POtSDOtc6+zq3Ou865zr7OtyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLOms6/z4XOvM+Azq8gzrzOtc+EzqzOtM6/z4POt8+CLiDOo8+Fzr3OtM6tzrjOt866zrUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4izpzOtc+EzqzOtM6/z4POtyDPg861Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4izpXPjc+BzrXPg863IM+Dz4XPg866zrXPhc+Ozr0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4izpHPgM6/z4PPjc69zrTOtc+DzrciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLOlM65zrHOus6/z4DOriDOvM61z4TOrM60zr/Pg863z4IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Is6azrvOtc6vz4POuc68zr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLOkc69zrHPgM6xz4HOsc6zz4nOs86uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLOoM6xz43Pg863Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4izpTOuc6xzrrOv8+Azq4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLOkc69zqzPgM+Ez4XOvs63Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLOo8+NzrzPgM+Ez4XOvs63Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4izpXOvs+Oz4bPhc67zrvOvyDOrM67zrzPgM6/z4XOvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLOoc+FzrjOvM65z4PPhM65zrrPjCDOrc69z4TOsc+DzrfPgiDOrs+Hzr/PhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4izpTOtc69IM6tz4fOv8+Fzr0gzrXPgM65zrvOtc6zzrXOryDOvM6tz4POsSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4izpTOtc69IM+Fz4DOrM+Bz4fOv8+Fzr0gzrTOuc6xzrjOrc+DzrnOvM61z4Igz4DOu863z4HOv8+Gzr/Pgc6vzrXPgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4izpzOtc+EzqzOtM6/z4POtyDOv864z4zOvc63z4IiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJBVS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJBVS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzZjIxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yQVUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IGJ1dHRvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3QgYnV0dG9uLiBDb25uZWN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkZpbmRpbmcgZGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEaXNjb25uZWN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBjYXN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDbG9zZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBsYXkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29sbGFwc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lIHNsaWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gbWVkaWEgc2VsZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGluZm8gYXZhaWxhYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJDYXN0aW5nIHNjcmVlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckNBL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckNBL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDNmMjE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJDQS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QgYnV0dG9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdCBidXR0b24uIENvbm5lY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iRmluZGluZyBkZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRpc2Nvbm5lY3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdG9wIGNhc3RpbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNsb3NlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUGxheSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdG9wIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJDb2xsYXBzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtIGFydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJWb2x1bWUgc2xpZGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBtZWRpYSBzZWxlY3RlZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTm8gaW5mbyBhdmFpbGFibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkNhc3Rpbmcgc2NyZWVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1yR0Ivc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkM2YyMTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tckdCL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEZXZpY2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdCBidXR0b24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJDYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0IGJ1dHRvbi4gQ29ubmVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkNhc3QgdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJGaW5kaW5nIGRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGlzY29ubmVjdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3AgY2FzdGluZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2xvc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQbGF5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJFeHBhbmQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbGxhcHNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW0gYXJ0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZSBzbGlkZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vIG1lZGlhIHNlbGVjdGVkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJObyBpbmZvIGF2YWlsYWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGluZyBzY3JlZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJJTi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJJTi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGQzZjIxOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lbi1ySU4vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRldmljZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IGJ1dHRvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QgYnV0dG9uLiBEaXNjb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3QgYnV0dG9uLiBDb25uZWN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QgYnV0dG9uLiBDb25uZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdCB0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkZpbmRpbmcgZGV2aWNlcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEaXNjb25uZWN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU3RvcCBjYXN0aW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJDbG9zZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBsYXkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3RvcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29sbGFwc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iVm9sdW1lIHNsaWRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gbWVkaWEgc2VsZWN0ZWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGluZm8gYXZhaWxhYmxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJDYXN0aW5nIHNjcmVlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tclhDL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZW4tclhDL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODcwMDdlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVuLXJYQy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI/igI7igI7igI7igI7igI/igI/igI7igI7igI/igI7igI/igI7igI7igI/igI7igI7igI7igI/igI/igI/igI7igI7igI/igI7igI7igI7igI7igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI/igI/igI7igI/igI7igI/igI/igI/igI/igI7igI7igI7igI/igI5TeXN0ZW3igI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCORGV2aWNlc+KAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjuKAj+KAj+KAjuKAj+KAj+KAj+KAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjkNhc3QgYnV0dG9u4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCOQ2FzdCBidXR0b24uIERpc2Nvbm5lY3RlZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCOQ2FzdCBidXR0b24uIENvbm5lY3RpbmfigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCP4oCOQ2FzdCBidXR0b24uIENvbm5lY3RlZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI7igI/igI/igI/igI7igI/igI/igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI7igI/igI/igI7igI/igI7igI/igI/igI/igI7igI/igI/igI7igI/igI/igI/igI/igI7igI7igI/igI/igI/igI7igI7igI/igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI7igI/igI/igI7igI5DYXN0IHRv4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCORmluZGluZyBkZXZpY2Vz4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjuKAj+KAj+KAjuKAjuKAjuKAj+KAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAj+KAjuKAj+KAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjkRpc2Nvbm5lY3TigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI7igI/igI/igI/igI7igI/igI/igI7igI/igI/igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI/igI/igI7igI/igI/igI/igI7igI/igI7igI/igI/igI/igI7igI7igI7igI/igI7igI7igI/igI/igI/igI/igI7igI7igI7igI/igI7igI/igI/igI/igI7igI/igI/igI/igI7igI/igI7igI5TdG9wIGNhc3RpbmfigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjkNsb3Nl4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCOUGxheeKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCO4oCOUGF1c2XigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI7igI7igI/igI7igI/igI7igI7igI7igI/igI/igI7igI/igI/igI7igI7igI/igI7igI/igI/igI7igI/igI7igI7igI7igI7igI/igI7igI/igI/igI7igI/igI7igI7igI7igI7igI/igI/igI7igI/igI/igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI/igI/igI/igI7igI/igI/igI/igI7igI7igI7igI/igI/igI5TdG9w4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCP4oCO4oCP4oCO4oCP4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCORXhwYW5k4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI/igI/igI/igI/igI/igI/igI7igI/igI7igI/igI7igI7igI/igI7igI7igI/igI/igI/igI/igI7igI/igI/igI7igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI/igI7igI7igI/igI7igI7igI/igI/igI7igI/igI7igI/igI/igI/igI/igI/igI7igI7igI7igI/igI/igI/igI/igI7igI5Db2xsYXBzZeKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAj+KAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAj+KAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAjuKAj+KAjuKAj+KAjuKAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAjuKAjuKAjuKAjuKAj+KAjkFsYnVtIGFydOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI7igI/igI7igI7igI7igI7igI7igI/igI/igI7igI7igI7igI/igI/igI7igI/igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI7igI7igI/igI7igI/igI/igI/igI/igI7igI/igI7igI/igI7igI7igI7igI/igI/igI/igI/igI/igI7igI7igI7igI7igI/igI7igI/igI7igI/igI7igI/igI/igI7igI/igI5Wb2x1bWUgc2xpZGVy4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLigI7igI/igI7igI7igI7igI7igI7igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI7igI/igI7igI7igI7igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI/igI/igI7igI/igI7igI/igI/igI7igI/igI/igI/igI7igI7igI7igI7igI7igI/igI7igI/igI7igI7igI7igI/igI7igI/igI/igI/igI/igI/igI/igI/igI/igI7igI7igI7igI/igI7igI/igI/igI7igI7igI/igI7igI7igI/igI/igI/igI7igI7igI/igI7igI7igI/igI/igI7igI/igI7igI/igI/igI7igI/igI5ObyBtZWRpYSBzZWxlY3RlZOKAjuKAj+KAjuKAjuKAj+KAjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCP4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCO4oCP4oCP4oCP4oCO4oCP4oCP4oCO4oCP4oCO4oCO4oCO4oCO4oCO4oCP4oCO4oCO4oCP4oCO4oCO4oCP4oCP4oCO4oCP4oCP4oCP4oCP4oCO4oCO4oCO4oCP4oCP4oCO4oCO4oCOTm8gaW5mbyBhdmFpbGFibGXigI7igI/igI7igI7igI/igI4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAj+KAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAjuKAjuKAj+KAjuKAjuKAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAjuKAjuKAj+KAjuKAj+KAj+KAjuKAj+KAj+KAj+KAj+KAj+KAjuKAjuKAjuKAjuKAj+KAj+KAj+KAj+KAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAjuKAj+KAj+KAjuKAj+KAj+KAjuKAjuKAjuKAjuKAjuKAj+KAj+KAjkNhc3Rpbmcgc2NyZWVu4oCO4oCP4oCO4oCO4oCP4oCOIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1lcy1yVVMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ0MWVhZDEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMtclVTL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQm90w7NuIHBhcmEgdHJhbnNtaXRpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIgKGRlc2NvbmVjdGFkbykiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIgKGNvbmVjdGFuZG8pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOzbiBwYXJhIHRyYW5zbWl0aXIgKGNvbmVjdGFkbykiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtaXRpciBhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQnVzY2FuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iRGV0ZW5lciBsYSB0cmFuc21pc2nDs24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNlcnJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkRldGVuZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJNb3N0cmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJPY3VsdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hZ2VuIGRlbCDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbCBkZXNsaXphbnRlIGRlbCB2b2x1bWVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJObyBzZSBzZWxlY2Npb27DsyBuaW5nw7puIGNvbnRlbmlkbyBtdWx0aW1lZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJTaW4gaW5mb3JtYWNpw7NuIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlRyYW5zbWl0aWVuZG8gcGFudGFsbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWVzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmNDMwMDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJEaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCb3TDs24gZGUgZW52aWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w7NuIGRlIGVudmlhci4gRGVzY29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3TDs24gZGUgZW52aWFyLiBDb25lY3RhbmRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJvdMOzbiBkZSBlbnZpYXIuIENvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbnZpYXIgYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkJ1c2NhbmRvIGRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZXNjb25lY3RhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkRldGVuZXIgZW52w61vIGRlIGNvbnRlbmlkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQ2VycmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdWNpciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEZXRlbmVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTW9zdHJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iT2N1bHRhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlBvcnRhZGEgZGVsIMOhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sIGRlc2xpemFudGUgZGUgdm9sdW1lbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTm8gc2UgaGEgc2VsZWNjaW9uYWRvIG5pbmfDum4gbWVkaW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5vIGhheSBpbmZvcm1hY2nDs24gZGlzcG9uaWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRW52aWFuZG8gcGFudGFsbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV0L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXQvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MzIzNWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXQvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU8O8c3RlZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iU2VhZG1lZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IsOcbGVrYW5kZW51cHAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLDnGxla2FuZGVudXBwLiDDnGhlbmR1cyBvbiBrYXRrZXN0YXR1ZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iw5xsZWthbmRlbnVwcC4gw5xoZW5kYW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iw5xsZWthbmRlbnVwcC4gw5xoZW5kYXR1ZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLDnGxla2FuZG1pbmUgc2VhZG1lc3NlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iU2VhZG1ldGUgb3RzaW1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iS2F0a2VzdGEgw7xoZW5kdXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJQZWF0YSDDvGxla2FuZG1pbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlN1bGdlbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkVzaXRhbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGVhdGFtaW5lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iUGVhdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJMYWllbmRhbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQWhlbmRhbWluZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtaSBrdWp1bmR1cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJIZWxpdHVnZXZ1c2UgbGl1Z3VyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJNZWVkaWF0IHBvbGUgdmFsaXR1ZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iVGVhdmUgcHV1ZHViIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFa3JhYW5pa3V2YSDDvGxla2FuZG1pbmUiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWV1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXUvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYTE5ZTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZXUvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJHYWlsdWFrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iSWdvcnJpIGJvdG9pYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+Iklnb3J0emVrbyBib3RvaWEuIERlc2tvbmVrdGF0dXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJJZ29ydHpla28gYm90b2lhLiBLb25la3RhdHplbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJJZ29ydHpla28gYm90b2lhLiBLb25la3RhdHV0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJJZ29ycmkgaG9uYToiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJHYWlsdWFrIGJpbGF0emVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2tvbmVrdGF0dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlV0emkgaWdvcnR6ZWFyaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iSXR4aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkVycmVwcm9kdXppdHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhdHUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJHZWxkaXR1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iWmFiYWxkdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVG9sZXN0dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtYXJlbiBhemFsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJCb2x1bWVuYXJlbiBncmFkdWF0emFpbGVhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJFeiBkYSBoYXV0YXR1IG11bHRpbWVkaWEtZWR1a2lyaWsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkV6IGRhZ28gaW5mb3JtYXppb3JpayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUGFudGFpbGEgaWdvcnR6ZW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZhL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNmM3NzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmEvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i2LPbjNiz2KrZhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLYr9iz2Krar9in2YfigIzZh9inIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i2K/aqdmF2Ycg2KfYsdiz2KfZhCDZhdit2KrZiNinIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i2K/aqdmF2Ycg2YHYsdiz2KrYp9iv2YYuINin2LHYqtio2KfYtyDZgti32Lkg2LTYryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i2K/aqdmF2Ycg2YHYsdiz2KrYp9iv2YYuINiv2LHYrdin2YQg2YXYsdiq2KjYt+KAjNiz2KfYstuMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Itiv2qnZhdmHINmB2LHYs9iq2KfYr9mGLiDZhdix2KrYqNi3INi02K8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i2KfYsdiz2KfZhCDZhdit2KrZiNinINio2YciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLZvtuM2K/YpyDaqdix2K/ZhiDYr9iz2Krar9in2YfigIzZh9inIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItmC2LfYuSDYp9ix2KrYqNin2LciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLYqtmI2YLZgSDYp9ix2LPYp9mEINmF2K3YqtmI2KciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+Itio2LPYqtmGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i2b7Yrti0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLZhdqp2KsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLYqtmI2YLZgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Itio2LLYsdqvINqp2LHYr9mGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLaqdmI2obaqSDaqdix2K/ZhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Iti52qnYsyDYsdmI24wg2KzZhNivINii2YTYqNmI2YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i2YTYutiy2YbYr9mHINmF24zYstin2YYg2LXYr9inIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLYsdiz2KfZhtmHINin2YbYqtiu2KfYqCDZhti02K/ZhyDYp9iz2KoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Itin2LfZhNin2LnYp9iqINiv2LEg2K/Ys9iq2LHYsyDZhtuM2LPYqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i2K/Ysdit2KfZhCDZgdix2LPYqtin2K/ZhiDYtdmB2K3ZhyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZmkvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1maS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY4MzQzNS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1maS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJKw6RyamVzdGVsbcOkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkxhaXR0ZWV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1wYWluaWtlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdC1wYWluaWtlLiBZaHRleXMga2F0a2Fpc3R1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LXBhaW5pa2UuIFloZGlzdGV0w6TDpG4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQ2FzdC1wYWluaWtlLiBZaGRpc3RldHR5Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlN1b3JhdG9pc3RvbiBrb2hkZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkV0c2l0w6TDpG4gbGFpdHRlaXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkthdGthaXNlIHlodGV5cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkxvcGV0YSBzdW9yYXRvaXN0byI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iU3VsamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJUb2lzdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Iktlc2tleXTDpCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlB5c8OkeXTDpCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkxhYWplbm5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJUaWl2aXN0w6QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bWluIGthbnNpa3V2YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLDhMOkbmVudm9pbWFra3V1ZGVuIGxpdWt1c8Okw6RkaW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkVpIHZhbGl0dHVhIG1lZGlhYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IlRpZXRvamEgZWkgb2xlIHNhYXRhdmlsbGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlN1b3JhdG9pc3RldGFhbiBuw6R5dHTDtsOkIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mci1yQ0Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1mci1yQ0Evc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Zjk4NGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnItckNBL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqG1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkFwcGFyZWlscyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdXRvbiBEaWZmdXNlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJvdXRvbiBEaWZmdXNlci4gRMOpY29ubmVjdMOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJCb3V0b24gRGlmZnVzZXIuIENvbm5leGlvbiBlbiBjb3Vyc+KApiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3V0b24gRGlmZnVzZXIuIENvbm5lY3TDqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJEaWZmdXNlciBzdXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJSZWNoZXJjaGUgZFwnYXBwYXJlaWxzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlNlIGTDqWNvbm5lY3RlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkFycsOqdGVyIGxhIGRpZmZ1c2lvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRmVybWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTGlyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSW50ZXJyb21wcmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBcnLDqnRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkTDqXZlbG9wcGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSw6lkdWlyZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkltYWdlIGRlIGxcJ2FsYnVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkN1cnNldXIgZGUgcsOpZ2xhZ2UgZHUgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJBdWN1biBtw6lkaWEgc8OpbGVjdGlvbm7DqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iQXVjdW5lIGluZm9ybWF0aW9uIGRpc3BvbmlibGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkRpZmZ1c2lvbiBkZSBsXCfDqWNyYW4gZW4gY291cnMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWZyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyYzMxMmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZnIvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU3lzdMOobWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQXBwYXJlaWxzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iSWPDtG5lIENhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJJY8O0bmUgQ2FzdC4gRMOpY29ubmVjdMOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJJY8O0bmUgQ2FzdC4gQ29ubmV4aW9u4oCmIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ikljw7RuZSBDYXN0LiBDb25uZWN0w6kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdGVyIHN1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlJlY2hlcmNoZSBkXCdhcHBhcmVpbHPigKYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRMOpY29ubmVjdGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iQXJyw6p0ZXIgbGEgZGlmZnVzaW9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJGZXJtZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJMZWN0dXJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkFycsOqdGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRMOpdmVsb3BwZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlLDqWR1aXJlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hZ2UgZGUgbFwnYWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ3Vyc2V1ciBkZSB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IkF1Y3VuIG3DqWRpYSBzw6lsZWN0aW9ubsOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJBdWN1bmUgaW5mb3JtYXRpb24gZGlzcG9uaWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRGlmZnVzaW9uIGRlIGxcJ8OpY3JhbiBlbiBjb3Vyc+KApiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ2wvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1nbC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWIyYzM1NC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1nbC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOzbiBkZSBlbWl0aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCb3TDs24gZGUgZW1pdGlyLiBEZXNjb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOzbiBkZSBlbWl0aXIuIENvbmVjdGFuZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w7NuIGRlIGVtaXRpci4gQ29uZWN0YWRvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IkVtaXRpciBhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQnVzY2FuZG8gZGlzcG9zaXRpdm9zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkRlc2NvbmVjdGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iRGV0ZXIgZW1pc2nDs24iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlBlY2hhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHVjZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJEZXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkFtcGxpYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNvbnRyYWVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iUG9ydGFkYSBkbyDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbCBkZXNwcmF6YWJsZSBkbyB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5vbiBzZSBzZWxlY2Npb25hcm9uIHJlY3Vyc29zIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOb24gaGFpIGluZm9ybWFjacOzbiBkaXNwb8OxaWJsZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRW1pc2nDs24gZGUgcGFudGFsbGEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWd1L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ3Uvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZDVmM2YuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtZ3Uvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Kq44Kq/4Kq44KuN4Kqf4KquIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCqieCqquCqleCqsOCqo+CriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4sg4Kqs4Kqf4KqoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCriyDgqqzgqp/gqqguIOCqoeCqv+CquOCrjeCqleCqqOCrh+CqleCrjeCqnyDgqpXgqrDgq43gqq/gq4HgqoIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCqleCqvuCquOCrjeCqnyDgqpXgqrDgq4sg4Kqs4Kqf4KqoLiDgqpXgqqjgq4fgqpXgq43gqp8g4Kql4KqIIOCqsOCqueCrjeCqr+CrgeCqgiDgqpvgq4ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCriyDgqqzgqp/gqqguIOCqleCqqOCrh+CqleCrjeCqnyDgqqXgqq/gq4HgqoIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KqG4Kqo4Kq+IOCqquCqsCDgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4KqJ4Kqq4KqV4Kqw4Kqj4KuLIOCqtuCri+Cqp+CrgCDgqrDgqrngq43gqq/gqr7gqoIg4Kqb4KuA4KqPIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCqoeCqv+CquOCrjeCqleCqqOCrh+CqleCrjeCqnyDgqpXgqrDgq4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgqpXgqr7gqrjgq43gqp8g4KqV4Kqw4Kq14Kq+4Kqo4KuB4KqCIOCqsOCri+CqleCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4Kqs4KqC4KqnIOCqleCqsOCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCqmuCqsuCqvuCqteCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Kql4KuL4Kqt4Kq+4Kq14KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Kqw4KuL4KqV4KuLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4Kq14Kq/4Kq44KuN4Kqk4KuD4KqkIOCqleCqsOCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Kq44KqC4KqV4KuB4Kqa4Kq/4KqkIOCqleCqsOCriyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCqhuCqsuCrjeCqrOCqriDgqpXgqrLgqr4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4Kq14KuJ4Kqy4KuN4Kqv4KuB4KquIOCquOCrjeCqsuCqvuCqh+CqoeCqsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4KqV4KuL4KqIIOCqruCrgOCqoeCqv+Cqr+CqviDgqqrgqrjgqoLgqqYg4KqV4Kqw4KuH4KqyIOCqqOCqpeCrgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KqV4KuL4KqIIOCqruCqvuCqueCqv+CqpOCrgCDgqongqqrgqrLgqqzgq43gqqcg4Kqo4Kql4KuAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgqrjgq43gqpXgq43gqrDgq4Dgqqjgqqjgq4cg4KqV4Kq+4Kq44KuN4KqfIOCqleCqsOCrgCDgqrDgqrngq43gqq/gqr7gqoIg4Kqb4KuHIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oaS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhpL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTUyYTU5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWhpL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCkuOCkv+CkuOCljeCkn+CkriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpKHgpL/gpLXgpL7gpIfgpLgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KWH4KSCIOCkrOCkn+CkqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCkleCkvuCkuOCljeCknyDgpJXgpLDgpYfgpIIg4KSs4KSf4KSoLiDgpKHgpL/gpLjgpJXgpKjgpYfgpJXgpY3gpJ8g4KS54KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KWH4KSCIOCkrOCkn+CkqC4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkueCliyDgpLDgpLngpL4g4KS54KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCkleCkvuCkuOCljeCknyDgpJXgpLDgpYfgpIIg4KSs4KSf4KSoLiDgpJXgpKjgpYfgpJXgpY3gpJ8g4KS54KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuCkh+CkuCDgpKrgpLAg4KSV4KS+4KS44KWN4oCN4KSfIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCkoeCkv+CkteCkvuCkh+CkuCDgpKLgpYLgpILgpKIg4KSw4KS54KS+IOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgpKHgpL/gpLjgpJXgpKjgpYfgpJXgpY3gpJ8g4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KSV4KS+4KS44KWN4KSfIOCkleCksOCkqOCkviDgpKzgpILgpKYg4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgpKzgpILgpKYg4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4KSa4KSy4KS+4KSP4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgpLDgpYvgpJXgpYfgpIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpKzgpILgpKYg4KSV4KSw4KWH4KSCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4KS14KS/4KS44KWN4KSk4KS+4KSwIOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4KSb4KWL4KSf4KS+IOCkleCksOClh+CkgiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuCkj+CksuCljeCkrOCkriDgpIbgpLDgpY3gpJ8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4KS14KWJ4KSy4KWN4KSv4KWC4KSuIOCkuOCljeCksuCkvuCkh+CkoeCksCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4KSV4KWL4KSIIOCkruClgOCkoeCkv+Ckr+CkviDgpJrgpK/gpKjgpL/gpKQg4KSo4KS54KWA4KSCIOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4KSV4KWL4KSIIOCknOCkvuCkqOCkleCkvuCksOClgCDgpK7gpYzgpJzgpYLgpKYg4KSo4KS54KWA4KSCIOCkueCliCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4KS44KWN4KSV4KWN4KSw4KWA4KSoIOCkleCkvuCkuOCljeCknyDgpLngpYsg4KSw4KS54KWAIOCkueCliCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M0M2VlNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTdXN0YXYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVXJlxJFhamkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJHdW1iIHphIGVtaXRpcmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJHdW1iIHphIGVtaXRpcmFuamUuIFZlemEgcHJla2ludXRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJHdW1iIHphIGVtaXRpcmFuamUuIFBvdmV6aXZhbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ikd1bWIgemEgZW1pdGlyYW5qZS4gUG92ZXphbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJFbWl0aXJhbmplIG5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iVHJhxb5lbmplIHVyZcSRYWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlByZWtpbmkgdmV6dSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlphdXN0YXZpIGVtaXRpcmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphdHZhcmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJSZXByb2R1a2NpamEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXppcmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXVzdGF2aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlByb8WhaXJpdmFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNhxb5pbWFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJOYXNsb3ZuaWNhIGFsYnVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJLbGl6YcSNIHphIGdsYXNub8SHdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmlqZSBvZGFicmFuIG5pamVkYW4gbWVkaWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkluZm9ybWFjaWplIG5pc3UgZG9zdHVwbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkVtaXRpcmFuamUgemFzbG9uYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaHUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1odS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTM2YmRmZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1odS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJSZW5kc3plciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJFc3prw7Z6w7ZrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iw4F0a8O8bGTDqXMgZ29tYiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IsOBdGvDvGxkw6lzIGdvbWIuIEthcGNzb2xhdCBib250dmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IsOBdGvDvGxkw6lzIGdvbWIuIENzYXRsYWtvesOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLDgXRrw7xsZMOpcyBnb21iLiBDc2F0bGFrb3p0YXR2YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLDgXRrw7xsZMOpcyBpZGUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJFc3prw7Z6w7ZrIGtlcmVzw6lzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJMZXbDoWxhc3p0w6FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iw4F0a8O8bGTDqXMgbGXDoWxsw610w6FzYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iQmV6w6Fyw6FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTGVqw6F0c3rDoXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlN6w7xuZXRlbHRldMOpcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+Ikxlw6FsbMOtdMOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IktpYm9udMOhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iw5Zzc3plY3N1a8OhcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkxlbWV6Ym9yw610w7MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSGFuZ2VyxZFzemFiw6FseXrDsyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmluY3MgbcOpZGlhIGtpdsOhbGFzenR2YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmluY3MgaW5mb3Jtw6FjacOzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJLw6lwZXJuecWRdGFydGFsb20gw6F0a8O8bGTDqXNlIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1oeS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh5L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZWM4MmI3Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWh5L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItWA1aHVtNWh1a/VodaA1aMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i1Y3VodaA1oTVpdaAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i1YDVpdW81aHWgNWx1aHVr9W01aHVtiDVr9W41bPVodWvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i1YDVpdW81aHWgNWx1aHVr9W01aHVtiDVr9W41bPVodWvOiDVjdWh1oDWhNW2INWh1bbVu9Wh1b/VvtWh1a4g1aciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItWA1aXVvNWh1oDVsdWh1a/VtNWh1bYg1a/VuNWz1aHVrzog1Y3VodaA1oTVqCDVr9Wh1brVodWv1oHVvtW41oLVtCDVpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLVgNWl1bzVodaA1bHVodWv1bTVodW2INWv1bjVs9Wh1a86INWN1aHWgNaE1agg1a/VodW61aHVr9aB1b7VodWuINWnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItS41bbVv9aA1aXWhCDVvdWh1oDWhNWoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i1Y3VodaA1oTVpdaA1asg1bjWgNW41bbVuNaC1bQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i1LHVttW71aHVv9Wl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLUtNWh1aTVodaA1aXWgdW21aXVrCDVsNWl1bzVodaA1bHVodWv1bjWgtW01agiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItWT1aHVr9Wl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLVhtW+1aHVo9Wh1oDVr9Wl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItS01aHVpNWh1oAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLUtNWh1aTVodaA1aXWgdW21aXVrCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItS41bbVpNWh1oDVsdWh1a/VpdWsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLUv9W41a7Vr9Wl1awiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLUsdWs1aLVuNW01asg1bfVodW61avVryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLVgdWh1bXVttWrINW41oLVqtWj1bbVuNaC1anVtdWh1bYg1a/VodaA1aPVodW+1bjWgNWr1bkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItWE1aXVpNWr1aEg1obVodW11azVpdaAINW51aXVtiDVqNW21b/WgNW+1aXVrCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i1Y/VpdWy1aXVr9W41oLVqdW11bjWgtW21bbVpdaA1agg1bDVodW91aHVttWl1azVqyDVudWl1bYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItS31a/WgNWh1bbVqCDVsNWl1bzVodaA1bHVodWv1b7VuNaC1bQg1aciPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWluL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiMjc1MmUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaW4vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlBlcmFuZ2thdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlRvbWJvbCBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVG9tYm9sIENhc3QuIFRlcnB1dHVzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJUb21ib2wgQ2FzdC4gTWVuZ2h1YnVuZ2thbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJUb21ib2wgQ2FzdC4gVGVyaHVidW5nIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlRyYW5zbWlzaWthbiBrZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Ik1lbmNhcmkgcGVyYW5na2F0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlB1dHVza2FuIHNhbWJ1bmdhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkhlbnRpa2FuIGNhc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlR1dHVwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHV0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkplZGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJCZXJoZW50aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ikx1YXNrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkNpdXRrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJTYW1wdWwgYWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQmlsYWggZ2VzZXIgdm9sdW1lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJUaWRhayBhZGEgbWVkaWEgeWFuZyBkaXBpbGloIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJUaWRhayBhZGEgaW5mbyB5YW5nIHRlcnNlZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJUcmFuc21pc2kgbGF5YXIiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWlzL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXMvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZhMzVlYTYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXMvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iS2VyZmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVMOma2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLDmnRzZW5kaW5nYXJobmFwcHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iw5p0c2VuZGluZ2FyaG5hcHB1ci4gQWZ0ZW5ndCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iw5p0c2VuZGluZ2FyaG5hcHB1ci4gVGVuZ2lzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLDmnRzZW5kaW5nYXJobmFwcHVyLiBUZW5ndCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJTZW5kYSDDunQgw60iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMZWl0YcOwIGHDsCB0w6ZranVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkFmdGVuZ2phc3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdMO2w7B2YSDDunRzZW5kaW5ndSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTG9rYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlNwaWxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJIbMOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iU3TDtsOwdmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJTdMOma2thIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJNaW5ua2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJQbMO2dHV1bXNsYWciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSGxqw7PDsHN0eXJrc3NsZcOwaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iRW5naW5uIG1pw7BpbGwgdmFsaW5uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJFbmdhciB1cHBsw71zaW5nYXIgw60gYm/DsGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlNrasOhciBzZW5kdXIgw7p0Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTZlM2FjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWl0L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlNpc3RlbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG9zaXRpdmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJQdWxzYW50ZSBUcmFzbWV0dGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJQdWxzYW50ZSBUcmFzbWV0dGkuIERpc2Nvbm5lc3NvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJQdWxzYW50ZSBUcmFzbWV0dGkuIENvbm5lc3Npb25lIGluIGNvcnNvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlB1bHNhbnRlIFRyYXNtZXR0aS4gQ29ubmVzc28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhc21ldHRpIGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJSaWNlcmNhIGRpIGRpc3Bvc2l0aXZpIGluIGNvcnNvIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlNjb2xsZWdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSW50ZXJyb21waSB0cmFzbWlzc2lvbmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkNoaXVkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJpcHJvZHVjaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJJbnRlcnJvbXBpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXNwYW5kaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iQ29tcHJpbWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJDb3BlcnRpbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iRGlzcG9zaXRpdm8gZGkgc2NvcnJpbWVudG8gZGVsIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVzc3VuIGNvbnRlbnV0byBtdWx0aW1lZGlhbGUgc2VsZXppb25hdG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lc3N1bmEgaW5mb3JtYXppb25lIGRpc3BvbmliaWxlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJUcmFzbWlzc2lvbmUgZGVsbG8gc2NoZXJtbyBpbiBjb3JzbyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtaXcvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjUyYjBjZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1pdy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLXntei16jXm9eqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Itee15vXqdeZ16jXmdedIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0LiDXnteg15XXqtenIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLigI/XnNeX16bXnyDXlNek16LXnNeqIENhc3QuINee16rXl9eR16giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4oCP15zXl9em158g15TXpNei15zXqiBDYXN0LiDXnteX15XXkdeoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IteU16LXkdeo15Qg15DXnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Itee15fXpNepINee15vXqdeZ16jXmdedIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Iteg16rXpyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IteU16TXodenINeQ16og15TXlNei15HXqNeUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLXodeS15XXqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IteU16TXotecIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLXlNep15TXlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IteU16TXodenIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i15TXqNeX15EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Iteb15XXldelIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i16LXmNeZ16TXqiDXkNec15HXldedIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Itee15fXldeV158g16LXldem157XlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i15zXkCDXoNeR15fXqNeUINee15PXmdeUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLXkNeZ158g157XmdeT16Ig15bXnteZ158iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IteU16LXkdeo16og157XodeaINee16rXkdem16LXqiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtamEvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTE0OTcyNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1qYS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLjgrfjgrnjg4bjg6AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i56uv5pyrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i44Kt44Oj44K544OI44Ki44Kk44Kz44OzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i44Kt44Oj44K544OIIOOCouOCpOOCs+ODs+OAguaOpee2muino+mZpOa4iOOBvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i44Kt44Oj44K544OIIOOCouOCpOOCs+ODs+OAguaOpee2muS4rSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLjgq3jg6Pjgrnjg4gg44Ki44Kk44Kz44Oz44CC5o6l57aa5riI44G/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuOCreODo+OCueODiOOBmeOCi+ODh+ODkOOCpOOCuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuerr+acq+OCkuaknOe0ouOBl+OBpuOBhOOBvuOBmSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLmjqXntprjgpLop6PpmaQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLjgq3jg6Pjgrnjg4jjgpLlgZzmraIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IumWieOBmOOCiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuWGjeeUnyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i5LiA5pmC5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i5bGV6ZaLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLmipjjgorjgZ/jgZ/jgoAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLjgqLjg6vjg5Djg6DjgqLjg7zjg4giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i6Z+z6YeP44K544Op44Kk44OA44O8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLjg6Hjg4fjgqPjgqLjgYzpgbjmip7jgZXjgozjgabjgYTjgb7jgZvjgpMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuaDheWgseOBjOOBguOCiuOBvuOBm+OCkyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i55S76Z2i44KS44Kt44Oj44K544OI44GX44Gm44GE44G+44GZIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWthL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGEwODFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWthL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuGDoeGDmOGDoeGDouGDlOGDm+GDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLhg5vhg53hg6zhg6fhg53hg5Hhg5jhg5rhg53hg5Hhg5Thg5Hhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5jhg6Eg4YOm4YOY4YOa4YOQ4YOZ4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDpuGDmOGDmuGDkOGDmeGDmC4g4YOS4YOQ4YOX4YOY4YOo4YOj4YOa4YOYIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5jhg6Eg4YOm4YOY4YOa4YOQ4YOZ4YOYLiDhg5vhg5jhg5vhg5Phg5jhg5zhg5Dhg6Dhg5Thg53hg5Hhg6Eg4YOT4YOQ4YOZ4YOQ4YOV4YOo4YOY4YOg4YOU4YOR4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuGDouGDoOGDkOGDnOGDoeGDmuGDmOGDoOGDlOGDkeGDmOGDoSDhg6bhg5jhg5rhg5Dhg5nhg5guIOGDk+GDkOGDmeGDkOGDleGDqOGDmOGDoOGDlOGDkeGDo+GDmuGDmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLhg6Lhg6Dhg5Dhg5zhg6Hhg5rhg5jhg6Dhg5Thg5Hhg5A6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4YOb4YOd4YOs4YOn4YOd4YOR4YOY4YOa4YOd4YOR4YOU4YOR4YOY4YOhIOGDm+GDneGDq+GDmOGDlOGDkeGDkC4uLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLhg5nhg5Dhg5Xhg6jhg5jhg6Dhg5jhg6Eg4YOS4YOQ4YOs4YOn4YOV4YOU4YOi4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4YOi4YOg4YOQ4YOc4YOh4YOa4YOY4YOg4YOU4YOR4YOY4YOhIOGDqOGDlOGDrOGDp+GDleGDlOGDouGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4YOT4YOQ4YOu4YOj4YOg4YOV4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4YOT4YOQ4YOZ4YOV4YOg4YOQIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLhg57hg5Dhg6Phg5bhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLhg6jhg5Thg6zhg6fhg5Xhg5Thg6Lhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLhg5Lhg5Dhg6jhg5rhg5AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuGDqeGDkOGDmeGDlOGDquGDleGDkCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuGDkOGDmuGDkeGDneGDm+GDmOGDoSDhg5Lhg5Dhg6Dhg5Thg5nhg5Dhg5zhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4YOu4YOb4YOY4YOhIOGDoeGDmuGDkOGDmOGDk+GDlOGDoOGDmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4YOb4YOU4YOT4YOY4YOQIOGDkOGDoOGDqeGDlOGDo+GDmuGDmCDhg5Dhg6Ag4YOQ4YOg4YOY4YOhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLhg5jhg5zhg6Thg53hg6Dhg5vhg5Dhg6rhg5jhg5Ag4YOQ4YOgIOGDkOGDoOGDmOGDoSDhg67hg5Thg5rhg5vhg5jhg6Hhg5Dhg6zhg5Xhg5Phg53hg5vhg5giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGDm+GDmOGDm+GDk+GDmOGDnOGDkOGDoOGDlOGDneGDkeGDoSDhg5Thg5nhg6Dhg5Dhg5zhg5jhg6Eg4YOS4YOQ4YOT4YOQ4YOq4YOU4YOb4YOQIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ray9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtrL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NGRjYmIzLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtrL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCW0q/QudC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItKa0rHRgNGL0LvSk9GL0LvQsNGAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0KLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YMg0YLSr9C50LzQtdGB0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJcItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGDXCIg0YLSr9C50LzQtdGB0ZYuINCQ0LbRi9GA0LDRgtGD0LvRiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iXCLQotGA0LDQvdGB0LvRj9GG0LjRj9C70LDRg1wiINGC0q/QudC80LXRgdGWLiDSmtC+0YHRi9C70YPQtNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ilwi0KLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YNcIiDRgtKv0LnQvNC10YHRli4g0prQvtGB0YvQu9C00YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0JrQtdC70LXRgdGW0LPQtSDRgtGA0LDQvdGB0LvRj9GG0LjRj9C70LDRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItKa0rHRgNGL0LvSk9GL0LvQsNGA0LTRiyDRgtCw0LHRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQkNC20YvRgNCw0YLRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCi0YDQsNC90YHQu9GP0YbQuNGP0LvQsNGD0LTRiyDRgtC+0pvRgtCw0YLRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JbQsNCx0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQntC50L3QsNGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCa0ZbQtNGW0YDRgtGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i0KLQvtKb0YLQsNGC0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQltCw0Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCW0LjRjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCQ0LvRjNCx0L7QvCDRiNC10LHQtdGA0ZYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0JTRi9Cx0YvRgSDQtNC10qPQs9C10LnRltC90ZbSoyDQttKv0LPRltGA0YLQutGW0YHRliI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JXRiNCx0ZbRgCDRgtCw0YHRg9GI0Ysg0YLQsNKj0LTQsNC70LzQsNKT0LDQvSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0prQvtC7INC20LXRgtGW0LzQtNGWINCw0pvQv9Cw0YDQsNGCINC20L7SmyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0K3QutGA0LDQvdC00Ysg0YLRgNCw0L3RgdC70Y/RhtC40Y/Qu9Cw0YMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWttL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta20vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU0NDc4MGUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta20vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Z6U4Z+S4Z6a4Z6W4Z+Q4Z6T4Z+S4Z6SIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuGep+GelOGegOGemuGejuGfjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuGelOGfiuGevOGej+Geu+GehOGegeGetuGenyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuGegeGetuGen+GelOGfiuGevOGej+Geu+GehOGfliDhnpThnrbhnpPhnoDhnrbhno/hn4vhnpXhn5Lhno/hnrbhnoXhn4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuGegeGetuGen+GelOGfiuGevOGej+Geu+GehOGfliDhnoDhn4bhnpbhnrvhnoThnpfhn5LhnofhnrbhnpThn4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4Z6B4Z624Z6f4Z6U4Z+K4Z684Z6P4Z674Z6E4Z+WIOGelOGetuGek+Gel+GfkuGeh+GetuGelOGfi+GeoOGevuGemSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLhnpThnonhn5LhnofhnrzhnpPhnpHhn4UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLhnoDhn4bhnpbhnrvhnoThnp/hn5Lhnpzhn4LhnoThnprhnoDhnqfhnpThnoDhnprhno7hn40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4Z6V4Z+S4Z6K4Z624Z6F4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4Z6I4Z6U4Z+L4Z6X4Z+S4Z6H4Z624Z6U4Z+LIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLhnpThnrfhnpEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLhnoXhnrbhnoDhn4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuGeleGfkuGeouGetuGegCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuGeiOGelOGfiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuGeluGehOGfkuGemuGeuOGegCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Z6U4Z6E4Z+S4Z6a4Z694Z6YIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4Z6f4Z+S4Z6T4Z624Z6K4Z+D4Z6f4Z634Z6b4Z+S4Z6U4Z+I4Z6i4Z624Z6b4Z+L4Z6U4Z+K4Z674Z6YIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuGemuGelOGetuGemuGegOGemOGfkuGemuGet+Gej+Gen+GfhuGeoeGfgeGehCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4Z6C4Z+S4Z6Y4Z624Z6T4Z6A4Z624Z6a4Z6H4Z+S4Z6a4Z6+4Z6f4Z6Y4Z+B4Z6M4Z+A4Z6R4Z+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLhnpjhnrfhnpPhnpjhnrbhnpPhnpbhn5Dhno/hn4zhnpjhnrbhnpPhnpHhn4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuGegOGfhuGeluGeu+GehOGegeGetuGen+GeouGfgeGegOGfkuGemuGehOGfiyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta24vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDIzN2ZkZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1rbi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgsrjgsr/gsrjgs43gsp/gsoIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4LK44LK+4LKn4LKo4LKX4LKz4LOBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4LKs4LK/4LKk4LON4LKk4LKw4LK/4LK44LOBIOCyrOCyn+CyqOCzjeKAjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgSDgsqzgsp/gsqjgs43igIwuIOCyuOCyguCyquCysOCzjeCylSDgspXgsqHgsr/gsqTgspfgs4rgsrPgsr/gsrjgsrLgsr7gspfgsr/gsqbgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgSDgsqzgsp/gsqjgs43igIwuIOCyuOCyguCyquCysOCzjeCyleCyv+CyuOCysuCyvuCyl+CzgeCypOCzjeCypOCyv+CypuCzhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgs4Eg4LKs4LKf4LKo4LON4oCMLiDgsrjgsoLgsqrgsrDgs43gspXgsr/gsqTgspfgs4rgsoLgsqHgsr/gsqbgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LKH4LKm4LKV4LON4LKV4LOGIOCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCyvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCyuOCyvuCyp+CyqOCyl+Cys+CyqOCzjeCyqOCzgSDgsrngs4HgsqHgs4HgspXgsrLgsr7gspfgs4HgsqTgs43gsqTgsr/gsqbgs4YiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LK44LKC4LKq4LKw4LON4LKVIOCyleCyoeCyv+CypOCyl+CziuCys+Cyv+CyuOCzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCyrOCyv+CypOCzjeCypOCysOCyv+CyuOCzgeCyteCyv+CyleCzhiDgsqjgsr/gsrLgs43gsrLgsr/gsrjgsr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCyruCzgeCymuCzjeCymuCzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCyquCzjeCysuCzhyDgsq7gsr7gsqHgsr8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCyteCyv+CysOCyvuCyriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCyqOCyv+CysuCzjeCysuCyv+CyuOCyvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCyteCyv+CyuOCzjeCypOCysOCyv+CyuOCzgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4LK44LKC4LKV4LOB4LKa4LK/4LK44LOBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4LKG4LKy4LON4LKs4LKu4LONIOCyleCysuCzhiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgsrXgsr7gsrLgs43gsq/gs4Lgsq7gs40g4LK44LON4LKy4LOI4LKh4LKw4LONIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgsq/gsr7gsrXgs4Hgsqbgs4cg4LKu4LK+4LKn4LON4LKv4LKuIOCyhuCyr+CzjeCyleCzhuCyruCyvuCyoeCysuCyvuCyl+Cyv+CysuCzjeCysiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4LKv4LK+4LK14LOB4LKm4LOHIOCyruCyvuCyueCyv+CypOCyvyDgsrLgsq3gs43gsq/gsrXgsr/gsrLgs43gsrIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCyquCysOCypuCzhuCyr+CyqOCzjeCyqOCzgSDgsqzgsr/gsqTgs43gsqTgsrDgsr/gsrjgsrLgsr7gspfgs4HgsqTgs43gsqTgsr/gsqbgs4YiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWtvL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlODkzYTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta28vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i7Iuc7Iqk7YWcIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Iuq4sOq4sCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuyghOyGoSDrsoTtirwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLsoITshqEg67KE7Yq8LiDsl7DqsrAg7ZW07KCc65CoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLsoITshqEg67KE7Yq8LiDsl7DqsrAg7KSRIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuyghOyGoSDrsoTtirwuIOyXsOqysOuQqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLsoITshqHtlaAg6riw6riwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i6riw6riw66W8IOywvuuKlCDspJEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i7Jew6rKwIO2VtOygnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuyghOyGoSDspJHsp4AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuuLq+q4sCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuyerOyDnSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i7J287Iuc7KSR7KeAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i7KSR7KeAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i7Y687LmY6riwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLsoJHquLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLslajrspTslYTtirgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i67O866WoIOyKrOudvOydtOuNlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i7ISg7YOd7ZWcIOuvuOuUlOyWtCDsl4bsnYwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuygleuztOqwgCDsl4bsirXri4jri6QuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLtmZTrqbQg7KCE7IahIOykkSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMta3kvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1reS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTc4MTNhZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1reS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQotGD0YLRg9C8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCi0q/Qt9C806nQutGC06nRgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGD0YMg0LHQsNGB0LrRi9GH0YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRg9GDINCx0LDRgdC60YvRh9GLLiDQotKv0LfQvNOp0Log0LDQttGL0YDQsNC/INGC0YPRgNCw0YIuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQotGL0YjQutGLINGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDRg9GDINCx0LDRgdC60YvRh9GLLiDQotKv0LfQvNOp0Log0YLRg9GC0LDRiNGD0YPQtNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGD0YMg0LHQsNGB0LrRi9GH0YsuINCi0q/Qt9C806nQuiDRgtGD0YLQsNGI0YvQvyDRgtGD0YDQsNGCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCi06nQvNOp0L3QutKv0LPTqSDRh9GL0LPQsNGA0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+ItCi0q/Qt9C806nQutGC06nRgCDQuNC30LTQtdC70q/Sr9C006kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JDQttGL0YDQsNGC0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCi0YvRiNC6INGN0LrRgNCw0L3Qs9CwINGH0YvQs9Cw0YDQvdGDINGC0L7QutGC0L7RgtGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCW0LDQsdGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQntC50L3QvtGC0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0KLRi9C90LTRi9GA0YPRgyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCi0L7QutGC0L7RgtGD0YMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQltCw0LnRi9C/INC606nRgNGB06nRgtKv0q8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCW0YvQudGL0YjRgtGL0YDRg9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0JDQu9GM0LHQvtC8INC80YPQutCw0LHQsNGB0YsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0q7QvdC00q8g0LrQsNGC0YPRg9C70LDRgtGD0YPRh9GDINGB0YvQtNGL0YDQvNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQkdC40YAg0LTQsCDQvNC10LTQuNCwINGE0LDQudC7INGC0LDQvdC00LDQu9Cz0LDQvSDQttC+0LoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCt0Ycg0LzQsNCw0LvRi9C80LDRgiDQttC+0LoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCi0YvRiNC60Ysg0Y3QutGA0LDQvdCz0LAg0YfRi9Cz0LDRgNGL0LvRg9GD0LTQsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbGFuZC9kaW1lbnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbGFuZC9kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWYxZTFkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxhbmQvZGltZW5zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8IS0tIE1lZGlhUm91dGVDb250cm9sbGVyJ3Mgdm9sdW1lIGdyb3VwIGxpc3QgLS0+Ci0gICAgPGVhdC1jb21tZW50IC8+Ci0gICAgPCEtLSBNYXhpbXVtIGhlaWdodCBvZiB2b2x1bWUgZ3JvdXAgbGlzdC4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfbWF4X2hlaWdodCI+MTMyZHA8L2RpbWVuPgotICAgIDwhLS0gSGVpZ2h0IG9mIHZvbHVtZSBncm91cCBpdGVtLiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2hlaWdodCI+NjFkcDwvZGltZW4+Ci0gICAgPCEtLSBTaXplIG9mIGFuIGl0ZW0ncyBpY29uLiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSI+MThkcDwvZGltZW4+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWxvL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbG8vc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNzM3ZGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbG8vc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Lql4Lqw4Lqa4Lq74LqaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuC6reC6uOC6m+C6sOC6geC6reC6mSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuC6m+C6uOC7iOC6oeKAi+C6hOC6suKAi+C6quKAi+C6l+C7jCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuC6m+C6uOC7iOC6oeC6quC6u+C7iOC6h+C6quC6seC6meC6jeC6suC6mS4g4LqV4Lqx4LqU4LqB4Lqy4LqZ4LuA4LqK4Lq34LuI4Lqt4Lqh4LqV4LuN4LuI4LuB4Lql4LuJ4LqnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgupvgurjgu4jguqHguqrgurvgu4jguofguqrgurHgupnguo3gurLgupkuIOC6geC6s+C6peC6seC6h+C7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgupvgurjgu4jguqHguqrgurvgu4jguofguqrgurHgupnguo3gurLgupkuIOC7gOC6iuC6t+C7iOC6reC6oeC6leC7jeC7iOC7geC6peC7ieC6pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLguqrgurvgu4jguofguqrgurHgupnguo3gurLgupnguqvgurIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLguoHgurPguqXgurHguofigIvguorguq3guoHigIvguqvgurLigIvguq3gurjigIvgupvgurDigIvguoHguq3gupkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LqV4Lqx4LqU4LqB4Lqy4LqZ4LuA4LqK4Lq34LuI4Lqt4Lqh4LqV4LuN4LuIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4Lqi4Lq44LqU4LqB4Lqy4LqZ4Lqq4Lq74LuI4LqH4Lqq4Lqx4LqZ4LqN4Lqy4LqZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgupvgurTgupQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLguqvgurzgurTgu4ngupkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuC6ouC6uOC6lOC6iuC6u+C7iOC6p+C6hOC6suC6pyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuC6ouC6uOC6lCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC6guC6sOC6q+C6jeC6suC6jSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4Lqr4LqN4LuN4LuJ4Lql4Lq74LqHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4Luc4LuJ4Lqy4Lqb4Lq74LqB4Lqt4Lqw4Lql4Lqw4Lqa4LuN4LuJ4LqyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuC6leC6u+C6p+C6m+C6seC6muC6peC6sOC6lOC6seC6muC6quC6veC6hyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4Lqa4LuN4LuI4oCL4LuE4LqU4LuJ4oCL4LuA4Lql4Lq34Lqt4LqB4oCL4Lqh4Lq14oCL4LuA4LqU4LqN4oCL4LuD4LqU4oCL4LuE4Lqn4LuJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLguprgu43gu4jigIvguqHgurXigIvguoLgu43gu4nigIvguqHgurngupkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuC6geC6suC6meC6quC6u+C7iOC6h+C6nuC6suC6muC7nOC7ieC6suC6iOC7jSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHQvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sdC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYwMzZkMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1sdC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IsSucmVuZ2luaWFpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iUGVyZGF2aW1vIG15Z3R1a2FzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iUGVyZGF2aW1vIG15Z3R1a2FzLiBBdHNpanVuZ3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJQZXJkYXZpbW8gbXlndHVrYXMuIFByaXNpanVuZ2lhbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iUGVyZGF2aW1vIG15Z3R1a2FzLiBQcmlzaWp1bmd0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQZXJkdW90aSDEryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlJhbmRhbWkgxK9yZW5naW5pYWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQXRqdW5ndGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJTdXN0YWJkeXRpIHBlcmRhdmltxIUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlXFvmRhcnl0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkxlaXN0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUHJpc3RhYmR5dGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJTdXN0YWJkeXRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iScWhc2tsZWlzdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlN1dHJhdWt0aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtbyB2aXLFoWVsaXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iR2Fyc3VtbyDFoWxpYXXFvmlrbGlzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOZXBhc2lyaW5rdGEgam9raWEgbWVkaWphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJJbmZvcm1hY2lqYSBuZXBhc2lla2lhbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlBlcmR1b2RhbWFzIGVrcmFuYXMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLWx2L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHYvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NDA2M2UuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbHYvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdMSTbWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iSWVyxKtjZXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJBcHJhaWRlcyBwb2dhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQXByYWlkZXMgcG9nYS4gU2F2aWVub2p1bXMgcMSBcnRyYXVrdHMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkFwcmFpZGVzIHBvZ2EuIE5vdGllayBzYXZpZW5vanVtYSBpenZlaWRlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkFwcmFpZGVzIHBvZ2EuIFNhdmllbm9qdW1zIGl6dmVpZG90cyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJBcHJhaWTEq8WhYW5hIHV6IGllcsSrY2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJOb3RpZWsgaWVyxKvEjXUgbWVrbMSTxaFhbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iQXR2aWVub3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJBcHR1csSTdCBhcHJhaWRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJBaXp2xJNydCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkF0c2thxYZvdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iQXB0dXLEk3QiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBcHR1csSTdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Ikl6dsSTcnN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJTYWvEvGF1dCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkFsYnVtYSB2xIFjacWGxaEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU2thxLx1bWEgc2zEq2RuaXMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5hdiBhdGxhc8SrdGkgbXVsdGl2aWRlcyBmYWlsaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTmF2IHBpZWVqYW1hIGluZm9ybcSBY2lqYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iTm90aWVrIGVrcsSBbmEgYXByYWlkZSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbWsvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tay9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTJkZWUzNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tay9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i0KPRgNC10LTQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCa0L7Qv9GH0LXRgtC+INC30LAgQ2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCa0L7Qv9GH0LUg0LfQsCBDYXN0LiDQmNGB0LrQu9GD0YfQtdC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L7Qv9GH0LUg0LfQsCBDYXN0LiDQodC1INC/0L7QstGA0LfRg9Cy0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JrQvtC/0YfQtSDQt9CwIENhc3QuINCf0L7QstGA0LfQsNC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0JXQvNC40YLRg9Cy0LDRmCDQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0KHQtSDQsdCw0YDQsNCw0YIg0YPRgNC10LTQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQmNGB0LrQu9GD0YfQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ItCh0L7Qv9GA0Lgg0LPQviDQtdC80LjRgtGD0LLQsNGa0LXRgtC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0YLQstC+0YDQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCg0LXQv9GA0L7QtNGD0YbQuNGA0LDRmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/QsNGD0LfQuNGA0LDRmCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCh0L7Qv9GA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQn9GA0L7RiNC40YDQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0KHQvtCx0LXRgNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0JrQvtGA0LjRhtCwINC90LAg0LDQu9Cx0YPQvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLQm9C40LfQs9Cw0Ycg0LfQsCDRmNCw0YfQuNC90LAg0L3QsCDQt9Cy0YPQuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0J3QtSDRgdC1INC40LfQsdGA0LDQvdC4INC80LXQtNC40YPQvNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndC10LzQsCDQtNC+0YHRgtCw0L/QvdC4INC40L3RhNC+0YDQvNCw0YbQuNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQldC60YDQsNC90L7RgiDRgdC1INC10LzQuNGC0YPQstCwIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1sL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDkxNGI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1sL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuC0uOC0v+C0uOC1jeC0seC1jeC0seC0giI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgtIngtKrgtJXgtLDgtKPgtJngtY3gtJngtb4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgtJ/gtL7gtKrgtY3gtKrgtYHgtJrgtYbgtK/gtY3gtK/gtYHgtJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtY0g4LSs4LSf4LWN4LSf4LW6LiDgtLXgtL/gtJrgtY3gtJvgtYfgtKbgtL/gtJrgtY3gtJrgtYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuC0leC0vuC0uOC1jeC0seC1jeC0seC1jSDgtKzgtJ/gtY3gtJ/gtbouIOC0leC0o+C0leC1jeKAjOC0seC1jeC0seC1geC0muC1huC0r+C1jeC0r+C1geC0qOC1jeC0qOC1gSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgtJXgtL7gtLjgtY3gtLHgtY3gtLHgtY0g4LSs4LSf4LWN4LSf4LW6LiDgtJXgtKPgtJXgtY3gtLHgtY3gtLHgtYHgtJrgtYbgtK/gtY3gtKTgtYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LSH4LSk4LS/4LSy4LWH4LSV4LWN4LSV4LWNIOC0leC0vuC0uOC1jeC0seC1jeC0seC1geC0muC1huC0r+C1jeC0r+C1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuC0ieC0quC0leC0sOC0o+C0meC1jeC0meC1viDgtJXgtKPgtY3gtJ/gtYbgtKTgtY3gtKTgtYHgtKjgtY3gtKjgtYEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4LS14LS/4LSa4LWN4LSb4LWH4LSm4LS/4LSV4LWN4LSV4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWB4LSa4LWG4LSv4LWN4LSv4LW9IOC0qOC0v+C1vOC0pOC1jeC0pOC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4LSF4LS14LS44LS+4LSo4LS/4LSq4LWN4LSq4LS/4LSV4LWN4LSV4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4LSq4LWN4LSy4LWHIOC0muC1huC0r+C1jeC0r+C1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4LSk4LW94LSV4LWN4LSV4LS+4LSy4LSCIOC0qOC0v+C1vOC0pOC1jeC0pOC1giI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuC0qOC0v+C0sOC1jeKAjeC0pOC1jeC0pOC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC0teC0v+C0leC0uOC0v+C0quC1jeC0quC0v+C0leC1jeC0leC1geC0lSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4LSa4LWB4LSw4LWB4LSV4LWN4LSV4LWB4LSVIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4LSG4LW94LSs4LSCIOC0huC1vOC0n+C1jeC0n+C1jSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgtLXgtYvgtLPgtL/gtK/gtIIg4LS44LWN4LSy4LWI4LSh4LW8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgtK7gtYDgtKHgtL/gtK/gtK/gtYrgtKjgtY3gtKjgtYHgtIIg4LSk4LS/4LSw4LSe4LWN4LSe4LWG4LSf4LWB4LSk4LWN4LSk4LS/4LSf4LWN4LSf4LS/4LSy4LWN4LSyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgtLXgtL/gtLXgtLDgtJngtY3gtJngtLPgtYrgtKjgtY3gtKjgtYHgtIIg4LSy4LSt4LWN4LSv4LSu4LSy4LWN4LSyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgtLjgtY3igIzgtJXgtY3gtLDgtYDgtbsg4LSV4LS+4LS44LWN4LSx4LWN4LSx4LWB4LSa4LWG4LSv4LWN4LSv4LWB4LSo4LWN4LSo4LWBIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tbi9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1uL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjg3YzkyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1uL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+ItCh0LjRgdGC0LXQvCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQotOp0YXTqdOp0YDTqdC80LbSr9Kv0LQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLQlNCw0LzQttGD0YPQu9Cw0YUg0YLQvtCy0YfQu9GD0YPRgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCU0LDQvNC20YPRg9C70LDRhSDRgtC+0LLRh9C70YPRg9GALiDQodCw0LvRgdCw0L0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCU0LDQvNC20YPRg9C70LDRhSDRgtC+0LLRh9C70YPRg9GALiDQpdC+0LvQsdC+0LYg0LHQsNC50L3QsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLQlNCw0LzQttGD0YPQu9Cw0YUg0YLQvtCy0YfQu9GD0YPRgC4g0KXQvtC70LHQvtCz0LTRgdC+0L0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0JTQsNC80LbRg9GD0LvQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0KLTqdGF06nTqdGA06nQvNC2INGF0LDQudC2INCx0LDQudC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0KHQsNC70LPQsNGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0JTQsNC80LbRg9GD0LvQsNGF0YvQsyDQt9C+0LPRgdC+0L7RhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0KXQsNCw0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQotC+0LPQu9GD0YPQu9Cw0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCi0q/RgCDQt9C+0LPRgdC+0L7RhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+ItCX0L7Qs9GB0L7QvtGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0JTRjdC70LPRjdGFIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQpdGD0YDQsNCw0YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQptC+0LzQs9C40LnQvSDQt9GD0YDQsNCzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCU0YPRg9C90Ysg0YLSr9Cy0YjQuNC9INGC0LDQsNGA0YPRg9C70LDQs9GHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLQr9C80LDRgCDRhyDQvNC10LTQuNCwINGB0L7QvdCz0L7QvtCz0q/QuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i0JzRjdC00Y3RjdC70Y3QuyDQsdCw0LnRhdCz0q/QuSDQsdCw0LnQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQlNGN0LvQs9GN0YbQuNC50LMg0LTQsNC80LbRg9GD0LvQtiDQsdCw0LnQvdCwIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tci9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1yL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmZiZWJiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW1yL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCkuOCkv+CkuOCljeCkn+CkriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpKHgpL/gpLXgpY3gpLngpL7gpIfgpLjgpYfgpLgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgpJXgpL7gpLjgpY3gpJ8g4KSs4KSf4KSjIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+Ckoy4g4KSh4KS/4KS44KWN4KSV4KSo4KWH4KSV4KWN4KSfIOCkleClh+CksuClhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+Ckoy4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkleCksOCkpCDgpIbgpLngpYciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4KSV4KS+4KS44KWN4KSfIOCkrOCkn+Ckoy4g4KSV4KSo4KWH4KSV4KWN4KSfIOCkleClh+CksuClhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLgpK/gpL7gpLXgpLAg4KSV4KS+4KS44KWN4KSfIOCkleCksOCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCkoeCkv+CkteCljeCkueCkvuCkh+CkuOClh+CkuCDgpLbgpYvgpKfgpKQg4KSG4KS54KWHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCkoeCkv+CkuOCljeKAjeCkleCkqOClh+CkleCljeKAjeCknyDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgpJXgpL7gpLjgpY3gpJ8g4KSV4KSw4KSj4KWHIOCkpeCkvuCkguCkrOCkteCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i4KSs4KSC4KSmIOCkleCksOCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCkquCljeCksuClhyDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IuCkteCkv+CksOCkvuCkriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuCkpeCkvuCkguCkrOCkviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCkteCkv+CkuOCljeCkpOClg+CkpCDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCkuOCkguCkleClgeCkmuCkv+CkpCDgpJXgpLDgpL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgpIXgpLLgpY3gpKzgpK4g4KSV4KSy4KS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCkteCljeCkueClieCksuCljeCkr+ClguCkriDgpLjgpY3gpLLgpL7gpK/gpKHgpLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCkruClgOCkoeCkv+Ckr+CkviDgpKjgpL/gpLXgpKHgpLLgpL4g4KSo4KS+4KS54KWAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgpJXgpYvgpKPgpKTgpYDgpLngpYAg4KSu4KS+4KS54KS/4KSk4KWAIOCkieCkquCksuCkrOCljeCkpyDgpKjgpL7gpLngpYAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCkuOCljeCkleCljeCksOClgOCkqCDgpJXgpL7gpLjgpY3igI3gpJ8g4KSV4KSw4KSkIOCkhuCkueClhyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXMvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tcy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDg1ZTQ4MC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1tcy9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iUGVyYW50aSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJ1dGFuZyBIYW50YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCdXRhbmcgaGFudGFyLiBTYW1idW5nYW4gZGlwdXR1c2thbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQnV0YW5nIGhhbnRhci4gTWVueWFtYnVuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCdXRhbmcgaGFudGFyLiBEaXNhbWJ1bmdrYW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iSGFudGFyIGtlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTWVuY2FyaSBwZXJhbnRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlB1dHVza2FuIHNhbWJ1bmdhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IkJlcmhlbnRpIG1lbmdoYW50YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlR1dHVwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iTWFpbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSmVkYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkJlcmhlbnRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iS2VtYmFuZ2thbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUnVudHVoa2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iU2VuaSBhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJQZWx1bmN1ciBrZWxhbnRhbmdhbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iVGlhZGEgbWVkaWEgZGlwaWxpaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iTWFrbHVtYXQgdGlkYWsgdGVyc2VkaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Ik1lbmdoYW50YXIgc2tyaW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW15L3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXkvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4M2Q4MDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbXkvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4YCF4YCU4YCF4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuGAheGAgOGAuuGAleGAheGAueGAheGAiuGAuuGAuOGAmeGAu+GArOGAuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuGAgOGArOGAheGAuuGAkOGAuuGAnOGAr+GAleGAuuGAm+GAlOGAuiDhgIHhgJzhgK/hgJDhgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLhgIDhgKzhgIXhgLrhgIHhgJzhgK/hgJDhgLrhgYsg4YCB4YC74YCt4YCQ4YC64YCG4YCA4YC64YCZ4YCR4YCs4YC44YCV4YCrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLhgIDhgKzhgIXhgLrhgIHhgJzhgK/hgJDhgLrhgYsg4YCB4YC74YCt4YCQ4YC64YCG4YCA4YC64YCU4YCx4YCe4YCK4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuGAgOGArOGAheGAuuGAgeGAnOGAr+GAkOGAuuGBiyDhgIHhgLvhgK3hgJDhgLrhgIbhgIDhgLrhgJHhgKzhgLjhgJ7hgIrhgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4YCA4YCs4YCF4YC64YCc4YCv4YCV4YC64YCb4YCU4YC6IOGAheGAgOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuGAheGAgOGAuuGAleGAheGAueGAheGAiuGAuuGAuOGAmeGAu+GArOGAuCDhgJvhgL7hgKzhgJbhgL3hgLHhgIHhgLzhgIThgLrhgLgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4YCG4YCA4YC64YCe4YC94YCa4YC64YCZ4YC+4YCvIOGAluGAvOGAkOGAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuGAgOGArOGAheGAuuGAnOGAr+GAleGAuuGAgeGAvOGAhOGAuuGAuCDhgJvhgJXhgLrhgJvhgJThgLoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuGAleGAreGAkOGAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuGAluGAveGAhOGAt+GAuuGAm+GAlOGAuiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4YCB4YCP4YCb4YCV4YC64YCb4YCU4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4YCb4YCV4YC64YCb4YCU4YC6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4YCW4YC84YCU4YC34YC64YCB4YC74YCb4YCU4YC64YGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLhgIHhgLHhgKvhgIDhgLrhgJ7hgK3hgJnhgLrhgLjhgJvhgJThgLouLi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLhgKHhgJrhgLrhgJzhgLrhgJjhgJnhgLrhgJXhgK/hgLYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4YCh4YCe4YC24YCh4YCQ4YCt4YCv4YC44YCh4YCA4YC74YCa4YC64YCB4YC74YCt4YCU4YC64YCe4YCK4YC34YC6IOGAhuGAnOGAreGAr+GAgOGAuuGAkuGAqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i4YCZ4YCK4YC64YCe4YCK4YC34YC64YCZ4YCu4YCS4YCu4YCZ4YC+IOGAmeGAm+GAveGAseGAuOGAgeGAu+GAmuGAuuGAkeGArOGAuOGAleGAqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4YCh4YCB4YC74YCA4YC64YCh4YCc4YCA4YC6IOGAmeGAm+GAm+GAvuGAreGAlOGAreGAr+GAhOGAuuGAleGAqyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4YCQ4YCK4YC64YC44YCW4YC84YCQ4YC64YCb4YCx4YC4IOGAmeGAu+GAgOGAuuGAlOGAvuGArOGAleGAvOGAhOGAuiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtbmIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGY3NjRjOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uYi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRW5oZXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3QtaWtvbmV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQ2FzdC1rbmFwcGVuLiBGcmFrb2JsZXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkNhc3Qta25hcHBlbi4gS29ibGVyIHRpbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJDYXN0LWtuYXBwZW4uIFRpbGtvYmxldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0IHRpbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlPDuGtlciBldHRlciBlbmhldGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IktvYmxlIGZyYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlN0b3BwIGNhc3RpbmdlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTHVrayI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlNwaWxsIGF2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJTZXR0IHDDpSBwYXVzZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3BwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iVXR2aWQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNranVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1ncmFmaWtrIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkdsaWRlYnJ5dGVyIGZvciB2b2x1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iRHUgaGFyIGlra2UgdmFsZ3Qgbm9lbiBtZWRpZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkluZ2VuIGluZm9ybWFzam9uIGVyIHRpbGdqZW5nZWxpZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iQ2FzdGVyIHNramVybWVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1uZS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5lL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNmMyZTFhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5lL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCkquCljeCksOCko+CkvuCksuClgCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgpIngpKrgpJXgpLDgpKPgpLngpLDgpYIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJDYXN0IOCkrOCkn+CkqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qg4KSs4KSf4KSo4KWkIOCknOCkoeCkvuCkqCDgpLXgpL/gpJrgpY3gpJvgpYfgpKYg4KSt4KSv4KWLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0IOCkrOCkn+CkqOClpCDgpJzgpKHgpL7gpKgg4KS54KWB4KSB4KSm4KWIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3Qg4KSs4KSf4KSo4KWkIOCknOCkoeCkvuCkqCDgpK3gpK/gpYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KSv4KS44KSu4KS+IENhc3Qg4KSX4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4KSv4KSo4KWN4KSk4KWN4KSw4KS54KSw4KWCIOCkquCkpOCljeCkpOCkviDgpLLgpJfgpL7gpIngpIHgpKbgpYgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4KS14KS/4KSa4KWN4KSb4KWH4KSmIOCkl+CksOCljeCkqOClgeCkueCli+CkuOCljSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+ImNhc3Rpbmcg4KSw4KWL4KSV4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgpKzgpKjgpY3gpKYg4KSX4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4KSs4KSc4KS+4KSJ4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgpLDgpYvgpJXgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLgpLDgpYvgpJXgpY3gpKjgpYHgpLngpYvgpLjgpY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLgpLXgpL/gpLjgpY3gpKTgpL7gpLAg4KSX4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgpLjgpILgpJXgpY3gpLfgpL/gpKrgpY3gpKQg4KSq4KS+4KSw4KWN4KSo4KWB4KS54KWL4KS44KWNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4KSP4KSy4KWN4KSs4KSuIOCkhuCksOCljeCknyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgpK3gpYvgpLLgpY3gpK/gpYHgpK7gpJXgpYsg4KS44KWN4KSy4KS+4KSH4KSh4KSwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgpJXgpYHgpKjgpYgg4KSu4KS/4KSh4KS/4KSv4KS+IOCkmuCkr+CkqCDgpK3gpI/gpJXgpYsg4KSb4KWI4KSoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgpJzgpL7gpKjgpJXgpL7gpLDgpYAg4KSJ4KSq4KSy4KSs4KWN4KSnIOCkm+CliOCkqCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4KS44KWN4KSV4KWN4KSw4KS/4KSoIGNhc3Qg4KSX4KSw4KWN4KSm4KWIIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ubC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWRmNjJkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLW5sL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQXBwYXJhdGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQ2FzdC1pY29vbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3QtaWNvb24uIFZlcmJpbmRpbmcgdmVyYnJva2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LWljb29uLiBWZXJiaW5kaW5nIG1ha2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3QtaWNvb24uIFZlcmJvbmRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJDYXN0ZW4gbmFhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkFwcGFyYXRlbiB6b2VrZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iTG9za29wcGVsZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJDYXN0ZW4gc3RvcHBlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iU2x1aXRlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IkFmc3BlbGVuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJPbmRlcmJyZWtlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlN0b3BwZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJVaXR2b3V3ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlNhbWVudm91d2VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxidW1ob2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHVtZXNjaHVpZnJlZ2VsYWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJHZWVuIG1lZGlhIGdlc2VsZWN0ZWVyZCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iR2VlbiBpbmZvcm1hdGllIGJlc2NoaWtiYWFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTY2hlcm0gY2FzdGVuIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wYS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXBhL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjVkZjcxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXBhL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IuCouOCov+CouOCon+CoriI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLgqKHgqL/gqLXgqL7gqIjgqLjgqL7gqIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLgqJXgqL7gqLjgqJ8g4Kis4Kif4KioIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4KiV4Ki+4Ki44KifIOCorOCon+CoqOClpCDgqKHgqL/gqLjgqJXgqKjgqYjgqJXgqJ8g4KiV4KmA4Kik4Ki+IOCol+Cov+CohiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4KiV4Ki+4Ki44KifIOCorOCon+CoqOClpCDgqJXgqKjgqYjgqJXgqJ8g4KiV4KmA4Kik4Ki+IOConOCoviDgqLDgqL/gqLngqL4g4Ki54KmIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuColeCovuCouOConyDgqKzgqJ/gqKjgpaQg4KiV4Kio4KmI4KiV4KifIOColeCpgOCopOCoviDgqJfgqL/gqIYiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4KiP4Kil4KmHIOColeCovuCouOConyDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgqKHgqYDgqLXgqL7gqIjgqLjgqL7gqIIg4Kio4KmC4KmwIOCosuCpseCoreCov+CohiDgqJzgqL4g4Kiw4Ki/4Ki54Ki+IOCoueCpiCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgqKHgqL/gqLjgqJXgqKjgqYjgqJXgqJ8g4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4KiV4Ki+4Ki44KifIOColeCosOCoqOCoviDgqKzgqbDgqKYg4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgqKzgqbDgqKYg4KiV4Kiw4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i4Kiq4Kiy4KmHIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Kiw4KmL4KiV4KmLIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Kis4Kmw4KimIOColeCosOCpiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCoteCov+CouOCopOCovuCosCDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuCorOCpsOCopiDgqJXgqLDgqYsiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgqJDgqLLgqKzgqK4g4KiG4Kiw4KifIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCoteCpjOCosuCor+CpguCoriDgqLjgqLLgqL7gqIjgqKHgqLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuColeCpi+CoiCDgqLXgqYAg4Kiu4KmA4Kih4KmA4KiGIOCoqOCoueCpgOCogiDgqJrgqYHgqKPgqL/gqIYg4KiX4Ki/4KiGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgqJXgqYvgqIgg4Kic4Ki+4Kij4KiV4Ki+4Kiw4KmAIOCoieCoquCosuCorOCopyDgqKjgqLngqYDgqIIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IuCouOColeCpjeCosOCpgOCoqCDgqJzgqYvgqZwg4Kiw4Ki/4Ki54Ki+IOCoueCpiCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcGwvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc5MmE2ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wbC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iVXJ6xIVkemVuaWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJQcnp5Y2lzayBDYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iUHJ6eWNpc2sgUHJ6ZcWbbGlqIGVrcmFuLiBSb3rFgsSFY3pvbm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IlByenljaXNrIFByemXFm2xpaiBla3Jhbi4gxYHEhWN6xJkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iUHJ6eWNpc2sgUHJ6ZcWbbGlqIGVrcmFuLiBQb8WCxIVjem9ubyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcnplc3nFgmFqIG5hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iWm5hamRvd2FuaWUgdXJ6xIVkemXFhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJPZMWCxIVjeiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IlphdHJ6eW1haiBwcnplc3nFgmFuaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphbWtuaWoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJPZHR3w7NyeiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iV3N0cnp5bWFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iWmF0cnp5bWFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUm96d2nFhCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iWndpxYQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPa8WCYWRrYSBhbGJ1bXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU3V3YWsgZ8WCb8Wbbm/Fm2NpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaWUgd3licmFubyBtdWx0aW1lZGnDs3ciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkJyYWsgaW5mb3JtYWNqaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUHJ6ZXN5xYJhbSBla3JhbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtckJSL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtckJSL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0M2M2MTlkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJCUi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOjbyBUcmFuc21pdGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBEZXNjb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gQ29uZWN0YW5kbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIENvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pdGlyIHBhcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMb2NhbGl6YW5kbyBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzY29uZWN0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJJbnRlcnJvbXBlciB0cmFuc21pc3PDo28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlY2hhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHV6aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlBhcmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlY29saGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQXJ0ZSBkbyDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbGUgZGVzbGl6YW50ZSBkZSB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbmh1bWEgbcOtZGlhIHNlbGVjaW9uYWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZW5odW1hIGluZm9ybWHDp8OjbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhbnNtaXRpbmRvIGEgdGVsYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQtclBUL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjBhNjFkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXB0LXJQVC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOjbyBUcmFuc21pdGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w6NvIFRyYW5zbWl0aXIuIERlc2xpZ2FkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQm90w6NvIFRyYW5zbWl0aXIuIEEgbGlnYXIuLi4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQm90w6NvIFRyYW5zbWl0aXIuIExpZ2FkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pdGlyIHBhcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJBIGxvY2FsaXphciBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzYXNzb2NpYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJQYXJhciBhIHRyYW5zbWlzc8OjbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRmVjaGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUmVwcm9kdXppciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iSW50ZXJyb21wZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJQYXJhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkV4cGFuZGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJSZWR1emlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iSW1hZ2VtIGRvIMOhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJDb250cm9sbyBkZSBkZXNsaXplIGRvIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTmVuaHVtIHN1cG9ydGUgbXVsdGltw6lkaWEgc2VsZWNpb25hZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+Ik5lbmh1bWEgaW5mb3JtYcOnw6NvIGRpc3BvbsOtdmVsIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJBIHRyYW5zbWl0aXIgbyBlY3LDoyI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcHQvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjNjE5ZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1wdC9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1hIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IkRpc3Bvc2l0aXZvcyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkJvdMOjbyBUcmFuc21pdGlyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQm90w6NvIFwiVHJhbnNtaXRpclwiLiBEZXNjb25lY3RhZG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJvdMOjbyBcIlRyYW5zbWl0aXJcIi4gQ29uZWN0YW5kbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJCb3TDo28gXCJUcmFuc21pdGlyXCIuIENvbmVjdGFkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJUcmFuc21pdGlyIHBhcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJMb2NhbGl6YW5kbyBkaXNwb3NpdGl2b3MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iRGVzY29uZWN0YXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJJbnRlcnJvbXBlciB0cmFuc21pc3PDo28iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IkZlY2hhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlcHJvZHV6aXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlBhdXNhciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlBhcmFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXhwYW5kaXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlJlY29saGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQXJ0ZSBkbyDDoWxidW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iQ29udHJvbGUgZGVzbGl6YW50ZSBkZSB2b2x1bWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5lbmh1bWEgbcOtZGlhIHNlbGVjaW9uYWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOZW5odW1hIGluZm9ybWHDp8OjbyBkaXNwb27DrXZlbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iVHJhbnNtaXRpbmRvIGEgdGVsYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcm8vc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmViYjJmNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1yby9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRGlzcG96aXRpdmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJCdXRvbnVsIGRlIHByb2llY8ibaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJCdXRvbnVsIGRlIHByb2llY8ibaWUuIERlY29uZWN0YXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJ1dG9udWwgZGUgcHJvaWVjyJtpZS4gU2UgY29uZWN0ZWF6xIMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQnV0b251bCBkZSBwcm9pZWPIm2llLiBDb25lY3RhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcm9pZWN0YcibaSBwZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlNlIGNhdXTEgyBkaXNwb3ppdGl2ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJEZWNvbmVjdGHIm2ktdsSDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iTnUgbWFpIHByb2llY3RhyJtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLDjm5jaGlkZcibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlJlZGHIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IsOObnRyZXJ1cGXIm2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJPcHJpyJtpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iRXh0aW5kZcibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iUmVzdHLDom5nZcibaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IkdyYWZpY2EgYWxidW11bHVpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IkdsaXNvciBwZW50cnUgdm9sdW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pY2l1biBmaciZaWVyIG1lZGlhIHNlbGVjdGF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOdSBzdW50IGRpc3BvbmliaWxlIGluZm9ybWHIm2lpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJTZSBwcm9pZWN0ZWF6xIMgZWNyYW51bCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtcnUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2M0NjJkMi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1ydS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQo9GB0YLRgNC+0LnRgdGC0LLQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuC4g0KPRgdGC0YDQvtC50YHRgtCy0L4g0L7RgtC60LvRjtGH0LXQvdC+LiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbQuNC4LiDQo9GB0YLRgNC+0LnRgdGC0LLQviDQv9C+0LTQutC70Y7Rh9Cw0LXRgtGB0Y8uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0LjQuC4g0KPRgdGC0YDQvtC50YHRgtCy0L4g0L/QvtC00LrQu9GO0YfQtdC90L4uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+ItCS0YvQsdC10YDQuNGC0LUg0YPRgdGC0YDQvtC50YHRgtCy0L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQn9C+0LjRgdC6INGD0YHRgtGA0L7QudGB0YLQsuKApiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLQntGC0LrQu9GO0YfQuNGC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQn9GA0LXQutGA0LDRgtC40YLRjCDRgtGA0LDQvdGB0LvRj9GG0LjRjiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i0JfQsNC60YDRi9GC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLQktC+0YHQv9GA0L7QuNC30LLQtdGB0YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i0J/RgNC40L7RgdGC0LDQvdC+0LLQuNGC0YwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQntGB0YLQsNC90L7QstC40YLRjCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+ItCg0LDQt9Cy0LXRgNC90YPRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLQodCy0LXRgNC90YPRgtGMIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i0J7QsdC70L7QttC60LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0KDQtdCz0YPQu9GP0YLQvtGAINCz0YDQvtC80LrQvtGB0YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JzQtdC00LjQsNGE0LDQudC7INC90LUg0LLRi9Cx0YDQsNC9Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQlNCw0L3QvdGL0YUg0L3QtdGCIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLQn9C+0LTQutC70Y7Rh9C10L3QuNC1INC6INGD0LTQsNC70LXQvdC90L7QvNGDINC80L7QvdC40YLQvtGA0YMiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNpL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2kvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NWNlNTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2kvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4La04Lav4LeK4Law4Lat4LeS4La6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuC2i+C2tOC3j+C2guC2nCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuC3gOC3kuC2muC3j+C3gSDgtrbgt5zgtq3gt4rgtq3gtrgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgt4Dgt5Lgtprgt4/gt4Eg4La24Lec4Lat4LeK4Lat4La4LiDgt4Dgt5Lgt4PgtrHgt4rgtrDgt5Ig4Laa4La74LaxIOC2veC2r+C3kyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i4LeA4LeS4Laa4LeP4LeBIOC2tuC3nOC2reC3iuC2reC2uCDgt4Pgtrjgt4rgtrbgtrHgt4rgtrAg4Laa4La74La44LeS4Lax4LeKIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuC3gOC3kuC2muC3j+C3gSDgtrbgt5zgtq3gt4rgtq3gtrgg4LeD4La44LeK4La24Lax4LeK4LawIOC2muC2u+C2sSDgtr3gtq/gt5MiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LeA4LeS4Laa4LeP4LeB4La6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i4LaL4La04LeP4LaC4LacIOC3g+C3meC3gOC3k+C2uCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLgt4Dgt5Lgt4PgtrHgt4rgtrDgt5Ig4Laa4La74Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i4LeA4LeS4Laa4LeP4LeBIOC2muC3kuC2u+C3k+C2uCDgtrHgtq3gtrsg4Laa4La74Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgt4Dgt4PgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgtrDgt4/gt4DgtrHgtrog4Laa4La74Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgt4Dgt5Lgtrvgt4/gtrgg4Lac4Lax4LeK4LeA4Lax4LeK4LaxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Lax4Lat4La7IOC2muC2u+C2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuC2r+C3kuC2nCDgt4Tgtrvgt5LgtrHgt4rgtrEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuC3hOC2muC3lOC3heC2seC3iuC2sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuC2h+C2veC3iuC2tuC2uCDgtprgtr3gt4/gt4AiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LeE4LasIOC2tOC2u+C3kuC2uOC3jyDgt4Pgt4rgtr3gtrrgt5LgtqngtrvgtroiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuC2uOC3j+C2sOC3iuKAjeC2uuC2uiDgtq3gt53gtrvgt48g4Lax4LeQ4LatIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgtr3gtrbgt48g4Lac4LatIOC3hOC3kOC2muC3kiDgtq3gt5zgtrvgtq3gt5Tgtrvgt5Qg4Lax4Lec4La44LeQ4LatIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLgt4Dgt5Lgtprgt4/gt4Eg4Lat4LeS4La74La6Ijwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zay9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNThhYTExLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNrL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3TDqW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iWmFyaWFkZW5pYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IlRsYcSNaWRsbyBwcmVub3N1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iVGxhxI1pZGxvIHByZW5vc3UuIE9kcG9qZW7DqSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iVGxhxI1pZGxvIHByZW5vc3UuIFByaXDDoWphIHNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlRsYcSNaWRsbyBwcmVub3N1LiBQcmlwb2plbsOpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlByZW5vcyBkbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkjEvmFkYWrDuiBzYSB6YXJpYWRlbmlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+Ik9kcG9qacWlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWmFzdGF2acWlIHByZW7DocWhYW5pZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iWmF2cmllxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJQcmVocmHFpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUG96YXN0YXZpxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJaYXN0YXZpxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJSb3piYWxpxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlpiYWxpxaUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJPYnLDoXpvayBhbGJ1bXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iUG9zw7p2YcSNIGhsYXNpdG9zdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ik5pZSBzw7ogdnlicmFuw6kgxb5pYWRuZSBtw6lkacOhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOaWUgc8O6IGvCoGRpc3BvesOtY2lpIMW+aWFkbmUgaW5mb3Jtw6FjaWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IlByZW7DocWhYSBzYSBvYnJhem92a2EiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNsL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjYTRjZTQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc2wvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4iU2lzdGVtIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Ik5hcHJhdmUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJHdW1iIHphIHByZWR2YWphbmplIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iR3VtYiB6YSBwcmVkdmFqYW5qZS4gUG92ZXphdmEgamUgcHJla2luamVuYS4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Ikd1bWIgemEgcHJlZHZhamFuamUuIFZ6cG9zdGF2bGphbmplIHBvdmV6YXZlLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJHdW1iIHphIHByZWR2YWphbmplLiBQb3ZlemF2YSBqZSB2enBvc3RhdmxqZW5hLiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiJQcmVkdmFqYW5qZSBwcmVrOiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iklza2FuamUgbmFwcmF2Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlByZWtpbmkgcG92ZXphdm8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJVc3RhdmkgcHJlZHZhamFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlphcHJpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iUHJlZHZhamFuamUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IlphdXN0YXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iVXN0YXZpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iUmF6xaFpcmkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IlN0cm5pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iTmFzbG92bmljYSBhbGJ1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iRHJzbmlrIHphIGdsYXNub3N0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOaSBpemJyYW5lIHByZWRzdGF2bm9zdGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IlBvZGF0a2kgbmlzbyBuYSB2b2xqbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iUHJlZHZhamFuamUgemFzbG9uYSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Evc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zcS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2ZTExMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zcS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW1pIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlBhamlzamV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQnV0b25pIGkgdHJhbnNtZXRpbWl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iQnV0b25pIGkgdHJhbnNtZXRpbWl0LiBKZSBpIHNoa8OrcHV0dXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IkJ1dG9uaSBpIHRyYW5zbWV0aW1pdC4gUG8gbGlkaGV0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkJ1dG9uaSBpIHRyYW5zbWV0aW1pdC4gSmUgaSBsaWRodXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJhbnNtZXRvIHRlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iUG8ga8OrcmtvbiBwYWppc2plIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IlNoa8OrcHV0ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ik5kYWxvIHRyYW5zbWV0aW1pbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iTWJ5bGwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJMdWFqIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJQYXV6w6siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJOZGFsbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlpnamVyb2plIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJQYWxvc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJLb3BlcnRpbmEgZSBhbGJ1bWl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlJyw6tzaHFpdMOrc2kgaSB2b2x1bWl0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJOdWsgdSB6Z2pvZGggYXNuasOrIG1lZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJOdWsgamVwZXQgYXNuasOrIGluZm9ybWFjaW9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJQbyB0cmFuc21ldG9uIGVrcmFuaW4iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXNyL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Ivc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhYWJhZDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Ivc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i0KHQuNGB0YLQtdC8Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+ItCj0YDQtdGS0LDRmNC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JTRg9Cz0LzQtSDQn9GA0LXQsdCw0YbQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+ItCU0YPQs9C80LUg0J/RgNC10LHQsNGG0LguINCS0LXQt9CwINGY0LUg0L/RgNC10LrQuNC90YPRgtCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLQlNGD0LPQvNC1INCf0YDQtdCx0LDRhtC4LiDQn9C+0LLQtdC30YPRmNC1INGB0LUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JTRg9Cz0LzQtSDQn9GA0LXQsdCw0YbQuC4g0J/QvtCy0LXQt9Cw0L0g0ZjQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLQn9GA0LXQsdCw0YbRg9GYINC90LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLQn9GA0L7QvdCw0LvQsNC20LXRmtC1INGD0YDQtdGS0LDRmNCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+ItCf0YDQtdC60LjQvdC4INCy0LXQt9GDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i0JfQsNGD0YHRgtCw0LLQuCDQv9GA0LXQsdCw0YbQuNCy0LDRmtC1Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLQl9Cw0YLQstC+0YDQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+ItCf0YPRgdGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0LDRg9C30LjRgNCw0ZgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQl9Cw0YPRgdGC0LDQstC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i0J/RgNC+0YjQuNGA0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+ItCh0LrRg9C/0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLQntC80L7RgiDQsNC70LHRg9C80LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i0JrQu9C40LfQsNGHINC30LAg0ZjQsNGH0LjQvdGDINC30LLRg9C60LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+ItCd0LXQvNCwINC40LfQsNCx0YDQsNC90LjRhSDQvNC10LTQuNGY0LAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+ItCd0LjRgdGDINC00L7RgdGC0YPQv9C90LUg0L3QuNC60LDQutCy0LUg0LjQvdGE0L7RgNC80LDRhtC40ZjQtSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i0J/RgNC10LHQsNGG0YPRmNC1INGB0LUg0LXQutGA0LDQvSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3Yvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E3ZDNlMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTeXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iRW5oZXRlciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IkNhc3Qta25hcHBlbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkNhc3Qta25hcHBlbi4gRnLDpW5rb3BwbGFkIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJDYXN0LWtuYXBwZW4uIEFuc2x1dGVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IkNhc3Qta25hcHBlbi4gQW5zbHV0ZW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iQ2FzdGEgdGlsbCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IkxldGFyIGVmdGVyIGVuaGV0ZXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iS29wcGxhIGZyw6VuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iU2x1dGEgY2FzdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IlN0w6RuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlNwZWxhIHVwcCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iUGF1c2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJBdmJyeXQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJVdMO2a2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IktvbXByaW1lcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJTa2l2b21zbGFnIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlZvbHltcmVnbGFnZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iSW5nYSBtZWRpYSBoYXIgdmFsdHMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkRldCBmaW5ucyBpbmdlbiBpbmZvcm1hdGlvbiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iU2vDpHJtZW4gY2FzdGFzIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTYyY2IxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3L3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Ik1mdW1vIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IlZpZmFhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iS2l0dWZlIGNoYSBrdXR1bWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJLaXR1ZmUgY2hhIGt1dHVtYS4gS2ltZW9uZG9sZXdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJLaXR1ZmUgY2hhIGt1dHVtYS4gS2luYXVuZ2FuaXNoYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiJLaXR1ZmUgY2hhIGt1dHVtYS4gS2ltZXVuZ2FuaXNod2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHVtYSBrd2VueWUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJJbmF0YWZ1dGEgdmlmYWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iT25kb2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJBY2hhIGt1dHVtYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iRnVuZ2EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJDaGV6YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iU2l0aXNoYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IlNpbWFtaXNoYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IlBhbnVhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJLdW5qYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IlNhbmFhIHlhIGFsYmFtdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJLaXRlbGV6aSBjaGEgc2F1dGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Ikhha3VuYSBtYXVkaHVpIHlhbGl5b2NoYWd1bGl3YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iSGFrdW5hIG1hZWxlem8geWFsaXlvcGF0aWthbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IkluYXR1bWEgc2tyaW5pIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdzYwMGRwL2RpbWVucy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy1zdzYwMGRwL2RpbWVucy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNDIzNDguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c2MDBkcC9kaW1lbnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDwhLS0gVGhlIHBsYXRmb3JtJ3MgZGVzaXJlZCBmaXhlZCB3aWR0aCBmb3IgYSBkaWFsb2cgYWxvbmcgdGhlIG1ham9yIGF4aXMKLSAgICAgICAgICh0aGUgc2NyZWVuIGlzIGluIGxhbmRzY2FwZSkuIFRoaXMgbWF5IGJlIGVpdGhlciBhIGZyYWN0aW9uIG9yIGEgZGltZW5zaW9uLi0tPgotICAgIDxpdGVtIHR5cGU9ImRpbWVuIiBuYW1lPSJtcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWFqb3IiPjYwJTwvaXRlbT4KLSAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtaW5vciBheGlzCi0gICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBwb3J0cmFpdCkuIFRoaXMgbWF5IGJlIGVpdGhlciBhIGZyYWN0aW9uIG9yIGEgZGltZW5zaW9uLi0tPgotICAgIDxpdGVtIHR5cGU9ImRpbWVuIiBuYW1lPSJtcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWlub3IiPjkwJTwvaXRlbT4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c3MjBkcC9kaW1lbnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtc3c3MjBkcC9kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MzRhYjhkLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXN3NzIwZHAvZGltZW5zLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtYWpvciBheGlzCi0gICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBsYW5kc2NhcGUpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yIj41MCU8L2l0ZW0+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWlub3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gcG9ydHJhaXQpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8aXRlbSB0eXBlPSJkaW1lbiIgbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21pbm9yIj43MCU8L2l0ZW0+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRhL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGEvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxOTc4ZjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGEvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4K6a4K6/4K644K+N4K6f4K6u4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuCumuCuvuCupOCuqeCumeCvjeCuleCus+CvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuCupOCuv+CusOCviOCur+Cuv+Cun+CvgSDgrqrgrp/gr43grp/grqngr40iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgroXgrqngr4Hgrqrgr43grqrgr4HgrqTgrrLgr40g4K6q4K+K4K6k4K+N4K6k4K6+4K6p4K+NLiDgrqTgr4HgrqPgr43grp/grr/grpXgr43grpXgrqrgr43grqrgrp/gr43grp/grqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuCuheCuqeCvgeCuquCvjeCuquCvgeCupOCusuCvjSDgrqrgr4rgrqTgr43grqTgrr7grqngr40uIOCuh+Cuo+CviOCuleCvjeCuleCuv+CuseCupOCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLgroXgrqngr4Hgrqrgr43grqrgr4HgrqTgrrLgr40g4K6q4K+K4K6k4K+N4K6k4K6+4K6p4K+NLiDgrofgrqPgr4jgrpXgr43grpXgrqrgr43grqrgrp/gr43grp/grqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4K6H4K6k4K6x4K+N4K6V4K+BIOCuheCuqeCvgeCuquCvjeCuquCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuCumuCuvuCupOCuqeCumeCvjeCuleCus+CviOCupOCvjSDgrqTgr4fgrp/gr4HgrpXgrr/grrHgrqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i4K6k4K+K4K6f4K6w4K+N4K6q4K+I4K6k4K+NIOCupOCvgeCuo+CvjeCun+CuvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuCuheCuqeCvgeCuquCvjeCuquCvgeCuteCupOCviCDgrqjgrr/grrHgr4HgrqTgr43grqTgr4EiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuCuruCvguCun+CvgeCuruCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuCuh+Cur+CuleCvjeCuleCvgeCuruCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4K6H4K6f4K+I4K6o4K6/4K6x4K+B4K6k4K+N4K6k4K+B4K6u4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4K6o4K6/4K6x4K+B4K6k4K+N4K6k4K+B4K614K6k4K6x4K+N4K6V4K6+4K6pIOCuquCviuCupOCvjeCupOCuvuCuqeCvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuCuteCuv+CusOCuv+CuteCuvuCuleCvjeCuleCvgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i4K6a4K+B4K6w4K+B4K6V4K+N4K6V4K+BIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4K6G4K6y4K+N4K6q4K6u4K+NIOCuhuCusOCvjeCun+CvjSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLgrpLgrrLgrr/grq/grrPgrrXgr4Eg4K644K+N4K6y4K+I4K6f4K6w4K+NIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLgrq7gr4Dgrp/grr/grq/grr4g4K6O4K6k4K+B4K614K+B4K6u4K+NIOCupOCvh+CusOCvjeCuqOCvjeCupOCvhuCun+CvgeCuleCvjeCuleCuquCvjeCuquCun+CuteCuv+CusuCvjeCusuCviCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i4K6k4K6V4K614K6y4K+NIOCujuCupOCvgeCuteCvgeCuruCuv+CusuCvjeCusuCviCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4K6k4K6/4K6w4K+I4K6v4K+IIOCuheCuqeCvgeCuquCvjeCuquCvgeCuleCuv+CuseCvgOCusOCvjeCuleCus+CvjSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ZS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2QzMTJlMy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ZS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLgsLjgsL/gsLjgsY3gsJ/gsK7gsY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i4LCq4LCw4LC/4LCV4LCw4LC+4LCy4LGBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i4LCq4LGN4LCw4LC44LC+4LCw4LCCIOCwmuCxh+Cwr+CwvyDgsKzgsJ/gsKjgsY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLgsKrgsY3gsLDgsLjgsL7gsLAg4LCs4LCf4LCo4LGNLiDgsKHgsL/gsLjgsY3igIzgsJXgsKjgsYbgsJXgsY3gsJ/gsY0g4LCa4LGH4LCv4LCs4LCh4LC/4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLgsKrgsY3gsLDgsLjgsL7gsLAg4LCs4LCf4LCo4LGNLiDgsJXgsKjgsYbgsJXgsY3gsJ/gsY0g4LCa4LGH4LC44LGN4LCk4LGL4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuCwquCxjeCwsOCwuOCwvuCwsCDgsKzgsJ/gsKjgsY0uIOCwleCwqOCxhuCwleCxjeCwn+CxjSDgsJrgsYfgsK/gsKzgsKHgsL/gsILgsKbgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i4LCm4LGA4LCo4LC/4LCV4LC/IOCwquCxjeCwsOCwuOCwvuCwsOCwgiDgsJrgsYfgsK/gsILgsKHgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLgsKrgsLDgsL/gsJXgsLDgsL7gsLLgsKjgsYEg4LCV4LCo4LGB4LCX4LGK4LCC4LCf4LGL4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuCwoeCwv+CwuOCxjeKAjOCwleCwqOCxhuCwleCxjeCwn+CxjSDgsJrgsYfgsK/gsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLgsKrgsY3gsLDgsLjgsL7gsLDgsL7gsKjgsY3gsKjgsL8g4LCG4LCq4LC/4LC14LGH4LCv4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLgsK7gsYLgsLjgsL/gsLXgsYfgsLjgsY3gsKTgsYHgsILgsKbgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLgsKrgsY3gsLLgsYcg4LCa4LGH4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLgsKrgsL7gsJzgsY0g4LCa4LGH4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4LCG4LCq4LC/4LC14LGH4LCv4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4LC14LC/4LC44LGN4LCk4LCw4LC/4LCC4LCq4LCc4LGH4LC44LGN4LCk4LGB4LCC4LCm4LC/Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLgsJXgsYHgsKbgsL/gsLjgsY3gsKTgsYHgsILgsKbgsL8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLgsIbgsLLgsY3gsKzgsK7gsY0g4LCG4LCw4LGN4LCf4LGNIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IuCwteCwvuCwsuCxjeCwr+CxguCwruCxjSDgsLjgsY3gsLLgsK/gsL/gsKHgsLDgsY0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuCwruCxgOCwoeCwv+Cwr+CwviDgsI/gsKbgsYAg4LCO4LCC4LCa4LGB4LCV4LGL4LCs4LCh4LCy4LGH4LCm4LGBIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLgsLjgsK7gsL7gsJrgsL7gsLDgsIIg4LCF4LCC4LCm4LGB4LCs4LC+4LCf4LGB4LCy4LGLIOCwsuCxh+CwpuCxgSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LC44LGN4LCV4LGN4LCw4LGA4LCo4LGN4oCM4LCo4LGBIOCwquCxjeCwsOCwuOCwvuCwsOCwgiDgsJrgsYfgsLjgsY3gsKTgsYvgsILgsKbgsL8iPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRoL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGgvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmYThhZTUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdGgvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i4Lij4Liw4Lia4LiaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+IuC4reC4uOC4m+C4geC4o+C4k+C5jCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuC4m+C4uOC5iOC4oSBcIuC5geC4hOC4quC4leC5jFwiIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i4Lib4Li44LmI4LihIFwi4LmB4LiE4Liq4LiV4LmMXCIg4Lii4LiB4LmA4Lil4Li04LiB4LiB4Liy4Lij4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4LitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLguJvguLjguYjguKEgXCLguYHguITguKrguJXguYxcIiDguIHguLPguKXguLHguIfguYDguIrguLfguYjguK3guKHguJXguYjguK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i4Lib4Li44LmI4LihIFwi4LmB4LiE4Liq4LiV4LmMXCIg4LmA4LiK4Li34LmI4Lit4Lih4LiV4LmI4Lit4LmB4Lil4LmJ4LinIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuC5geC4hOC4quC4leC5jOC5hOC4m+C4ouC4seC4hyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IuC4geC4s+C4peC4seC4h+C4hOC5ieC4meC4q+C4suC4reC4uOC4m+C4geC4o+C4k+C5jCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLguKLguIHguYDguKXguLTguIHguIHguLLguKPguYDguIrguLfguYjguK3guKHguJXguYjguK0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLguKvguKLguLjguJTguYHguITguKrguJXguYwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuC4m+C4tOC4lCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuC5gOC4peC5iOC4mSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i4Lir4Lii4Li44LiU4LiK4Lix4LmI4Lin4LiE4Lij4Liy4LinIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i4Lir4Lii4Li44LiUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i4LiC4Lii4Liy4LiiIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLguKLguLjguJoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLguJvguIHguK3guLHguKXguJrguLHguYnguKEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i4LmB4LiW4Lia4LmA4Lil4Li34LmI4Lit4LiZ4Lib4Lij4Lix4Lia4Lij4Liw4LiU4Lix4Lia4LmA4Liq4Li14Lii4LiHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLguYTguKHguYjguYTguJTguYnguYDguKXguLfguK3guIHguKrguLfguYjguK3guYTguKfguYkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuC5hOC4oeC5iOC4oeC4teC4guC5ieC4reC4oeC4ueC4pSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i4LiB4Liz4Lil4Lix4LiH4LmB4LiE4Liq4LiV4LmM4Lir4LiZ4LmJ4Liy4LiI4LitIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10bC9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRsL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOGJlM2QwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXRsL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+IlN5c3RlbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJNZ2EgRGV2aWNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iQnV0dG9uIG5hIEktY2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IkJ1dHRvbiBuYSBJLWNhc3QuIE5hZGlza29uZWt0YSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iQnV0dG9uIG5hIEktY2FzdC4gS3Vtb2tvbmVrdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iQnV0dG9uIG5hIEktY2FzdC4gTmFrYWtvbmVrdGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iSS1jYXN0IHNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iTmFnaGFoYW5hcCBuZyBtZ2EgZGV2aWNlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IklkaXNrb25la3RhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iSWhpbnRvIGFuZyBwYWctY2FzdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4iSXNhcmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJJLXBsYXkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+IkktcGF1c2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJJaGludG8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJQYWxhd2FraW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkktY29sbGFwc2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJ1bSBhcnQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iU2xpZGVyIG5nIHZvbHVtZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iV2FsYW5nIHBpbmlsaW5nIG1lZGlhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJXYWxhbmcgYXZhaWxhYmxlIG5hIGltcG9ybWFzeW9uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJLaW5hLWNhc3QgYW5nIHNjcmVlbiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdHIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVmNjM5Mi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy10ci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJTaXN0ZW0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4iQ2loYXpsYXIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJZYXnEsW5sYSBkw7zEn21lc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJZYXnEsW5sYSBkw7zEn21lc2kuIEJhxJ9sYW50xLEga2VzaWxkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iWWF5xLFubGEgZMO8xJ9tZXNpLiBCYcSfbGFuxLF5b3IiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4iWWF5xLFubGEgZMO8xJ9tZXNpLiBCYcSfbGFuZMSxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IsWedXJheWEgeWF5xLFubGE6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4iQ2loYXpsYXIgYnVsdW51eW9yIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IkJhxJ9sYW50xLF5xLEga2VzIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iWWF5xLFuxLEgZHVyZHVyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJLYXBhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+Ik95bmF0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJEdXJha2xhdCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IkR1cmR1ciI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IkdlbmnFn2xldCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iRGFyYWx0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4iQWxiw7xtIGthcGHEn8SxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+IlNlcyBkw7x6ZXlpIGtheWTEsXJtYSDDp3VidcSfdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTWVkeWEgc2XDp2lsbWVkaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4iQmlsZ2kgeW9rIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiJFa3JhbiB5YXnEsW5sYW7EsXlvciI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdWsvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ay9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNkMzY1ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ay9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLQodC40YHRgtC10LzQsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLQn9GA0LjRgdGC0YDQvtGXIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRltGXIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRltGXLiDQktGW0LTigJnRlNC00L3QsNC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+ItCa0L3QvtC/0LrQsCDRgtGA0LDQvdGB0LvRj9GG0ZbRly4g0J/RltC04oCZ0ZTQtNC90LDQvdC90Y8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i0JrQvdC+0L/QutCwINGC0YDQsNC90YHQu9GP0YbRltGXLiDQn9GW0LTigJnRlNC00L3QsNC90L4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i0KLRgNCw0L3RgdC70Y7QstCw0YLQuCDQvdCwIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i0J/QvtGI0YPQuiDQv9GA0LjRgdGC0YDQvtGX0LIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i0JLRltC00LrQu9GO0YfQuNGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLQn9GA0LjQv9C40L3QuNGC0Lgg0YLRgNCw0L3RgdC70Y/RhtGW0Y4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+ItCX0LDQutGA0LjRgtC4Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i0JLRltC00YLQstC+0YDQuNGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+ItCf0YDQuNC30YPQv9C40L3QuNGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLQn9GA0LjQv9C40L3QuNGC0LgiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLQoNC+0LfQs9C+0YDQvdGD0YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i0JfQs9C+0YDQvdGD0YLQuCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+ItCe0LHQutC70LDQtNC40L3QutCwINCw0LvRjNCx0L7QvNGDIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+ItCf0L7QstC30YPQvdC+0Log0LPRg9GH0L3QvtGB0YLRliI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i0JzQtdC00ZbQsC3RhNCw0LnQuyDQvdC1INCy0LjQsdGA0LDQvdC+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLQndC10LzQsNGUINC00LDQvdC40YUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+ItCi0YDQsNC90YHQu9GP0YbRltGPINC10LrRgNCw0L3QsCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXIvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ci9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjMyYzU5OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ci9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLYs9iz2bnZhSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLYotmE2KfYqiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Itqp2KfYs9m5INqp2LHZhtuSINqp2Kcg2KjZudmGIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i2qnYp9iz2bkg2qnYsdmG25Ig2qnYpyDYqNm52YbblCDYutuM2LEg2YXZhtiz2YTaqSDbgduSIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLaqdin2LPZuSDaqdix2YbbkiDaqdinINio2bnZhtuUINmF2YbYs9mE2qkg24HZiCDYsduB2Kcg24HbkiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLaqdin2LPZuSDaqdix2YbbkiDaqdinINio2bnZhtuUINmF2YbYs9mE2qkg24HbkiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLYp9izINmF24zauiDaqdin2LPZuSDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Itii2YTYp9iqINiq2YTYp9i0INuB2Ygg2LHbgduSINuB24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLYutuM2LEg2YXZhtiz2YTaqSDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Itqp2KfYs9m5INqp2LHZhtinINio2YbYryDaqdix24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i2KjZhtivINqp2LHbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i2obZhNin2KbbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLZhdmI2YLZiNmBINqp2LHbjNq6Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i2LHZiNqp24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+Itm+2r7bjNmE2KfYptuM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+Itiz2qnbjNqR24zauiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+Itin2YTYqNmFINii2LHZuSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLZiNin2YTbjNmI2YUg2LPZhNin2KbbjNqI2LEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Itqp2YjYptuMINmF24zaiNuM2Kcg2YXZhtiq2K7YqCDZhtuB24zauiDbgduSIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLaqdmI2KbbjCDZhdi52YTZiNmF2KfYqiDYr9iz2KrbjNin2Kgg2YbbgduM2roiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Itiz2qnYsduM2YYg2qnYp9iz2bkg24HZiCDYsduB24wg24HbkiI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtdXovc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ei9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBhMDgxNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy11ei9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJUaXppbSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJRdXJpbG1hbGFyIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4iVHJhbnNsYXRzaXlhIHR1Z21hc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiJUcmFuc2xhdHNpeWEgdHVnbWFzaS4gVXppbGRpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiJUcmFuc2xhdHNpeWEgdHVnbWFzaS4gVWxhbm1vcWRhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IlRyYW5zbGF0c2l5YSB0dWdtYXNpLiBVbGFuZGkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iUXV5aWRhZ2lnYSB0cmFuc2xhdHNpeWEgcWlsaXNoOiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+IlF1cmlsbWFsYXJuaSB0b3Bpc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iVWxhbmlzaG5pIHV6aXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4iVHJhbnNsYXRzaXlhbmkgdG/igJh4dGF0aXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJZb3Bpc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiJCb3NobGFzaCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4iVG/igJh4dGF0aWIgdHVyaXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4iVG/igJh4dGF0aXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iWW95aXNoIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiJZaWfigJhpc2giPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJBbGJvbSBtdXFvdmFzaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJUb3Z1c2ggYmFsYW5kbGlnaSBzbGF5ZGVyaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4iTXVsdGltZWRpYSB0YW5sYW1hZ2FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJIZWNoIHFhbmRheSBtYeKAmWx1bW90IHlv4oCYcSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4iRWtyYW5uaSB0cmFuc2xhdHNpeWEgcWlsaXNoIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy12aS9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXZpL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDk4Y2NhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXZpL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Ikjhu4cgdGjhu5FuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJUaGnhur90IGLhu4siPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiJOw7p0IHRydXnhu4FuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iTsO6dCB0cnV54buBbi4gxJDDoyBuZ+G6r3Qga+G6v3QgbuG7kWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+Ik7DunQgdHJ1eeG7gW4uIMSQYW5nIGvhur90IG7hu5FpIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Ik7DunQgdHJ1eeG7gW4uIMSQw6Mga+G6v3QgbuG7kWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4iVHJ1eeG7gW4gdOG7m2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLEkGFuZyB0w6xtIHRoaeG6v3QgYuG7iyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiJOZ+G6r3Qga+G6v3QgbuG7kWkiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiJE4burbmcgdHJ1eeG7gW4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IsSQw7NuZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IlBow6F0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiJU4bqhbSBk4burbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJE4burbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiJN4bufIHLhu5luZyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4iVGh1IGfhu41uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i4bqibmggYsOsYSBhbGJ1bSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiJUaGFuaCB0csaw4bujdCDDom0gbMaw4bujbmciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+Iktow7RuZyBjw7MgcGjGsMahbmcgdGnhu4duIG7DoG8gxJHGsOG7o2MgY2jhu41uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiJLaMO0bmcgY8OzIHRow7RuZyB0aW4gbsOgbyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4ixJBhbmcgdHJ1eeG7gW4gbcOgbiBow6xuaCI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckNOL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTIyZDAxLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJDTi9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiLns7vnu58iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUiIG1zZ2lkPSI3NDk4MTEyOTA3NTI0OTc3MzExIj4i6K6+5aSHIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfYnV0dG9uX2NvbnRlbnRfZGVzY3JpcHRpb24iIG1zZ2lkPSIzNjk4Mzc4MDg1OTAxNDY2MTI5Ij4i5oqV5bCE5oyJ6ZKuIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4i5oqV5bCE5oyJ6ZKu44CC5bey5pat5byA6L+e5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGluZyIgbXNnaWQ9IjIxODc2NDI3NjUwOTE4NzM4MzQiPiLmipXlsITmjInpkq7jgILmraPlnKjov57mjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0ZWQiIG1zZ2lkPSI1MDg4NDI3NzcxNzg4NjQ4MDg1Ij4i5oqV5bCE5oyJ6ZKu44CC5bey6L+e5o6lIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IuaKleWwhOWIsCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIiBtc2dpZD0iNjM0OTkwMDU3OTUwNzUyMTk1NiI+Iuato+WcqOafpeaJvuiuvuWkhyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCIgbXNnaWQ9IjEyMjcyNjQ4ODk0MTI5ODk1ODAiPiLmlq3lvIDov57mjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3BfY2FzdGluZyIgbXNnaWQ9Ijg4NTc4ODY3OTQwODY1ODMyMjYiPiLlgZzmraLmipXlsIQiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nsb3NlX2Rlc2NyaXB0aW9uIiBtc2dpZD0iNzMzMzg2MjMxMjQ4MDU4MzI2MCI+IuWFs+mXrSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGxheSIgbXNnaWQ9IjY4MzYzNDU2NTk2OTk4NzQ1OCI+IuaSreaUviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfcGF1c2UiIG1zZ2lkPSI1NDUxODg0NDM1NTEwOTA1NDA2Ij4i5pqC5YGcIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wIiBtc2dpZD0iNzM1ODc0NjQxOTIxNDI1MTIzIj4i5YGc5q2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4i5bGV5byAIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCIgbXNnaWQ9Ijc5MjQ4MDkwNTY5MDQyNDA5MjYiPiLmlLbotbciPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiLkuJPovpHlsIHpnaIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4i6Z+z6YeP5ruR5Z2XIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiLmnKrpgInmi6nku7vkvZXlqpLkvZMiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IuayoeacieS7u+S9leebuOWFs+S/oeaBryI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4iIG1zZ2lkPSI0ODY4NDU3OTU3MTUxMTI0ODY3Ij4i5q2j5Zyo5oqV5bCE5bGP5bmVIjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1ySEsvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1ySEsvc3RyaW5ncy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NmU1YzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtemgtckhLL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gLS0+Ci0KLTxyZXNvdXJjZXMgeG1sbnM6YW5kcm9pZD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy9hbmRyb2lkIgotICAgIHhtbG5zOnhsaWZmPSJ1cm46b2FzaXM6bmFtZXM6dGM6eGxpZmY6ZG9jdW1lbnQ6MS4yIj4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3N5c3RlbV9yb3V0ZV9uYW1lIiBtc2dpZD0iNTQ0MTUyOTg1MTQ4MTE3NjgxNyI+Iuezu+e1sSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiLoo53nva4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiIgbXNnaWQ9IjM2OTgzNzgwODU5MDE0NjYxMjkiPiLmipXmlL7mjInpiJUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9kaXNjb25uZWN0ZWQiIG1zZ2lkPSI4MTYzMDU0OTA0Mjc4MTkyNDAiPiLmipXmlL7mjInpiJXjgILlt7Lop6PpmaTpgKPmjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIiBtc2dpZD0iMjE4NzY0Mjc2NTA5MTg3MzgzNCI+IuaKleaUvuaMiemIleOAguato+WcqOmAo+aOpSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCIgbXNnaWQ9IjUwODg0Mjc3NzE3ODg2NDgwODUiPiLmipXmlL7mjInpiJXjgILlt7LpgKPmjqUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3RpdGxlIiBtc2dpZD0iNDE0MzAxOTQxNTQ2MTM1OTkwIj4i5oqV5pS+6IezIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl9zZWFyY2hpbmciIG1zZ2lkPSI2MzQ5OTAwNTc5NTA3NTIxOTU2Ij4i5q2j5Zyo5bCL5om+6KOd572uIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0IiBtc2dpZD0iMTIyNzI2NDg4OTQxMjk4OTU4MCI+IuS4reaWt+mAo+e3miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+IuWBnOatouaKleaUviI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY2xvc2VfZGVzY3JpcHRpb24iIG1zZ2lkPSI3MzMzODYyMzEyNDgwNTgzMjYwIj4i6Zec6ZaJIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4i5pKt5pS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSIgbXNnaWQ9IjU0NTE4ODQ0MzU1MTA5MDU0MDYiPiLmmqvlgZwiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiLlgZzmraIiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2V4cGFuZF9ncm91cCIgbXNnaWQ9IjgwNjI0MjcwMjI3NDQyNjY5MDciPiLlsZXplosiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IuaUtuWQiCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0IiBtc2dpZD0iNjQyMjgwMTg0MzU0MDU0MzU4NSI+IuWwiOi8r+WwgemdoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciIgbXNnaWQ9IjIzNjE3ODU5OTIyMTE4NDE3MDkiPiLpn7Pph4/mu5Hmob8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIiBtc2dpZD0iNjU0NzEzMDM2MDM0OTE4MjM4MSI+IuWwmuacqumBuOaTh+WqkumrlCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9faW5mb19hdmFpbGFibGUiIG1zZ2lkPSI1NTg1NDE4NDcxNzQxMTQyOTI0Ij4i5rKS5pyJ6Kmz57Sw6LOH5paZIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jYXN0aW5nX3NjcmVlbiIgbXNnaWQ9IjQ4Njg0NTc5NTcxNTExMjQ4NjciPiLmraPlnKjmipXmlL7onqLluZUiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzLXpoLXJUVy9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmNhZmRlMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16aC1yVFcvc3RyaW5ncy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLSAgQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAtLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfc3lzdGVtX3JvdXRlX25hbWUiIG1zZ2lkPSI1NDQxNTI5ODUxNDgxMTc2ODE3Ij4i57O757WxIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfdXNlcl9yb3V0ZV9jYXRlZ29yeV9uYW1lIiBtc2dpZD0iNzQ5ODExMjkwNzUyNDk3NzMxMSI+Iuijnee9riI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+IuaKleaUvuaMiemIlSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Rpc2Nvbm5lY3RlZCIgbXNnaWQ9IjgxNjMwNTQ5MDQyNzgxOTI0MCI+IuaKleaUvuaMiemIle+8m+W3suS4reaWt+mAo+e3miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4i5oqV5pS+5oyJ6YiV77yb6YCj57ea5LitIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+IuaKleaUvuaMiemIle+8m+W3sumAo+e3miI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiIG1zZ2lkPSI0MTQzMDE5NDE1NDYxMzU5OTAiPiLmipXmlL7liLAiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiLmraPlnKjlsIvmib7oo53nva4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4i5Lit5pa36YCj57eaIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciIG1zZ2lkPSI4ODU3ODg2Nzk0MDg2NTgzMjI2Ij4i5YGc5q2i5oqV5pS+Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiLpl5zplokiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiIG1zZ2lkPSI2ODM2MzQ1NjU5Njk5ODc0NTgiPiLmkq3mlL4iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Iuaaq+WBnCI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcCIgbXNnaWQ9IjczNTg3NDY0MTkyMTQyNTEyMyI+IuWBnOatoiI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIiBtc2dpZD0iODA2MjQyNzAyMjc0NDI2NjkwNyI+IuWxlemWiyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfY29sbGFwc2VfZ3JvdXAiIG1zZ2lkPSI3OTI0ODA5MDU2OTA0MjQwOTI2Ij4i5pS25ZCIIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9hbGJ1bV9hcnQiIG1zZ2lkPSI2NDIyODAxODQzNTQwNTQzNTg1Ij4i5bCI6Lyv5bCB6Z2iIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfc2xpZGVyIiBtc2dpZD0iMjM2MTc4NTk5MjIxMTg0MTcwOSI+Iumfs+mHj+a7keahvyI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfbm9fbWVkaWFfc2VsZWN0ZWQiIG1zZ2lkPSI2NTQ3MTMwMzYwMzQ5MTgyMzgxIj4i5pyq6YG45Y+W5Lu75L2V5aqS6auUIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSIgbXNnaWQ9IjU1ODU0MTg0NzE3NDExNDI5MjQiPiLmspLmnInlj6/nlKjnmoTos4foqIoiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+Iuato+WcqOaKleaUvuieouW5lSI8L3N0cmluZz4KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMtenUvc3RyaW5ncy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16dS9zdHJpbmdzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTEwN2M0My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy16dS9zdHJpbmdzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tICBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPgotCi08cmVzb3VyY2VzIHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICB4bWxuczp4bGlmZj0idXJuOm9hc2lzOm5hbWVzOnRjOnhsaWZmOmRvY3VtZW50OjEuMiI+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSIgbXNnaWQ9IjU0NDE1Mjk4NTE0ODExNzY4MTciPiJJc2lzdGltdSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSIgbXNnaWQ9Ijc0OTgxMTI5MDc1MjQ5NzczMTEiPiJBbWFkaXZheWlzaSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2J1dHRvbl9jb250ZW50X2Rlc2NyaXB0aW9uIiBtc2dpZD0iMzY5ODM3ODA4NTkwMTQ2NjEyOSI+Iklua2lub2JobyB5ZS1DYXN0Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIiBtc2dpZD0iODE2MzA1NDkwNDI3ODE5MjQwIj4iSW5raW5vYmhvIHlva3VzYWthemEuIEt1bnFhbnl1bGl3ZSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RpbmciIG1zZ2lkPSIyMTg3NjQyNzY1MDkxODczODM0Ij4iSW5raW5vYmhvIHlva3VzYWthemEuIEt1eWF4aHVueXdhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fY29ubmVjdGVkIiBtc2dpZD0iNTA4ODQyNzc3MTc4ODY0ODA4NSI+Iklua2lub2JobyB5b2t1c2FrYXphLiBLdXhodW55aXdlIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2hvb3Nlcl90aXRsZSIgbXNnaWQ9IjQxNDMwMTk0MTU0NjEzNTk5MCI+IlNha2F6YSBrdS0iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jaG9vc2VyX3NlYXJjaGluZyIgbXNnaWQ9IjYzNDk5MDA1Nzk1MDc1MjE5NTYiPiJJdGhvbGEgYW1hZGl2YXlpc2kiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Rpc2Nvbm5lY3QiIG1zZ2lkPSIxMjI3MjY0ODg5NDEyOTg5NTgwIj4iTnFhbXVsYSI8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfc3RvcF9jYXN0aW5nIiBtc2dpZD0iODg1Nzg4Njc5NDA4NjU4MzIyNiI+Ik1pc2EgdWt1c2FrYXphIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiIgbXNnaWQ9IjczMzM4NjIzMTI0ODA1ODMyNjAiPiJWYWxhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wbGF5IiBtc2dpZD0iNjgzNjM0NTY1OTY5OTg3NDU4Ij4iRGxhbGEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BhdXNlIiBtc2dpZD0iNTQ1MTg4NDQzNTUxMDkwNTQwNiI+Ik1pc2EgaXNpa2hhc2hhbmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiIG1zZ2lkPSI3MzU4NzQ2NDE5MjE0MjUxMjMiPiJNaXNhIjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXAiIG1zZ2lkPSI4MDYyNDI3MDIyNzQ0MjY2OTA3Ij4iTndlYmEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwIiBtc2dpZD0iNzkyNDgwOTA1NjkwNDI0MDkyNiI+IkdvcWEiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2FsYnVtX2FydCIgbXNnaWQ9IjY0MjI4MDE4NDM1NDA1NDM1ODUiPiJVYnVjaWtvIGJlLWFsYmhhbXUiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9zbGlkZXIiIG1zZ2lkPSIyMzYxNzg1OTkyMjExODQxNzA5Ij4iSXNpbGF5aWRhIHNldm9sdW11Ijwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19tZWRpYV9zZWxlY3RlZCIgbXNnaWQ9IjY1NDcxMzAzNjAzNDkxODIzODEiPiJBeWlraG8gaW1pZGl5YSBla2hldGhpd2UiPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlIiBtc2dpZD0iNTU4NTQxODQ3MTc0MTE0MjkyNCI+IkFsdWtobyB1bHdhemkgb2x1dGhvbGFrYWxheW8iPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIiBtc2dpZD0iNDg2ODQ1Nzk1NzE1MTEyNDg2NyI+IklzaWtyaW5pIHNva3VzYWthemEiPC9zdHJpbmc+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2FycmF5cy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9hcnJheXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTg3MzIwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2FycmF5cy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPGludGVnZXItYXJyYXkgbmFtZT0ic3BlZWRfbXVsdGlwbGllZF9ieV8xMDAiPgotICAgICAgICA8aXRlbT4yNTwvaXRlbT4KLSAgICAgICAgPGl0ZW0+NTA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjc1PC9pdGVtPgotICAgICAgICA8aXRlbT4xMDA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjEyNTwvaXRlbT4KLSAgICAgICAgPGl0ZW0+MTUwPC9pdGVtPgotICAgICAgICA8aXRlbT4yMDA8L2l0ZW0+Ci0gICAgPC9pbnRlZ2VyLWFycmF5PgotPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvYXR0cnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvYXR0cnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzcyODViLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2F0dHJzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLSAgICA8ZGVjbGFyZS1zdHlsZWFibGUgbmFtZT0iTWVkaWFSb3V0ZUJ1dHRvbiI+Ci0gICAgICAgIDwhLS0gVGhpcyBkcmF3YWJsZSBpcyBhIHN0YXRlIGxpc3Qgd2hlcmUgdGhlICJjaGVja2VkIiBzdGF0ZQotICAgICAgICAgICAgIGluZGljYXRlcyBhY3RpdmUgbWVkaWEgcm91dGluZy4gIENoZWNrYWJsZSBpbmRpY2F0ZXMgY29ubmVjdGluZwotICAgICAgICAgICAgIGFuZCBub24tY2hlY2tlZCAvIG5vbi1jaGVja2FibGUgaW5kaWNhdGVzCi0gICAgICAgICAgICAgdGhhdCBtZWRpYSBpcyBwbGF5aW5nIHRvIHRoZSBsb2NhbCBkZXZpY2Ugb25seS4gLS0+Ci0gICAgICAgIDxhdHRyIG5hbWU9ImV4dGVybmFsUm91dGVFbmFibGVkRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgICAgICA8IS0tIFRpbnQgdG8gYXBwbHkgdG8gdGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiAtLT4KLSAgICAgICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUJ1dHRvblRpbnQiIGZvcm1hdD0iY29sb3IiIC8+Ci0KLSAgICAgICAgPGF0dHIgbmFtZT0iYW5kcm9pZDptaW5XaWR0aCIgLz4KLSAgICAgICAgPGF0dHIgbmFtZT0iYW5kcm9pZDptaW5IZWlnaHQiIC8+Ci0gICAgPC9kZWNsYXJlLXN0eWxlYWJsZT4KLQotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVCdXR0b25TdHlsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUNsb3NlRHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVQbGF5RHJhd2FibGUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotICAgIDxhdHRyIG5hbWU9Im1lZGlhUm91dGVQYXVzZURyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlU3RvcERyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlRGVmYXVsdEljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVR2SWNvbkRyYXdhYmxlIiBmb3JtYXQ9InJlZmVyZW5jZSIgLz4KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJHcm91cEljb25EcmF3YWJsZSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0gICAgPGF0dHIgbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSIgZm9ybWF0PSJyZWZlcmVuY2UiIC8+Ci0KLSAgICA8YXR0ciBuYW1lPSJtZWRpYVJvdXRlVGhlbWUiIGZvcm1hdD0icmVmZXJlbmNlIiAvPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9jb2xvcnMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvY29sb3JzLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTdiYzI5OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9jb2xvcnMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cmVzb3VyY2VzPgotICAgIDxjb2xvciBuYW1lPSJncmF5Ij4jODA4MDgwPC9jb2xvcj4KLSAgICA8Y29sb3IgbmFtZT0id2hpdGUiPiNmZmZmZmY8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJ3aGl0ZV9vcGFjaXR5XzcwIj4jQjNmZmZmZmY8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJibGFja19vcGFjaXR5XzcwIj4jQjMwMDAwMDA8L2NvbG9yPgotICAgIDxjb2xvciBuYW1lPSJ0aXRsZV9iYXJfZ3JhZGllbnRfc3RhcnQiPiM1MDAwMDAwMDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9InRpdGxlX2Jhcl9ncmFkaWVudF9lbmQiPiMwMDAwMDAwMDwvY29sb3I+Ci0gICAgPGNvbG9yIG5hbWU9ImJvdHRvbV9iYXJfYmFja2dyb3VuZCI+IzQwMjAyMDIwPC9jb2xvcj4KLTwvcmVzb3VyY2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2RpbWVucy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9kaW1lbnMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZDdiMDIyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL2RpbWVucy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLSBEaWFsb2cgc2l6ZSAtLT4KLSAgICA8ZWF0LWNvbW1lbnQgLz4KLSAgICA8IS0tIFRoZSBwbGF0Zm9ybSdzIGRlc2lyZWQgZml4ZWQgd2lkdGggZm9yIGEgZGlhbG9nIGFsb25nIHRoZSBtYWpvciBheGlzCi0gICAgICAgICAodGhlIHNjcmVlbiBpcyBpbiBsYW5kc2NhcGUpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yIj4zMjBkcDwvZGltZW4+Ci0gICAgPCEtLSBUaGUgcGxhdGZvcm0ncyBkZXNpcmVkIGZpeGVkIHdpZHRoIGZvciBhIGRpYWxvZyBhbG9uZyB0aGUgbWlub3IgYXhpcwotICAgICAgICAgKHRoZSBzY3JlZW4gaXMgaW4gcG9ydHJhaXQpLiBUaGlzIG1heSBiZSBlaXRoZXIgYSBmcmFjdGlvbiBvciBhIGRpbWVuc2lvbi4tLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21pbm9yIj4zMjBkcDwvZGltZW4+Ci0KLSAgICA8IS0tIE1lZGlhUm91dGVDb250cm9sbGVyJ3Mgdm9sdW1lIGdyb3VwIGxpc3QgLS0+Ci0gICAgPGVhdC1jb21tZW50IC8+Ci0gICAgPCEtLSBNYXhpbXVtIGhlaWdodCBvZiB2b2x1bWUgZ3JvdXAgbGlzdC4gLS0+Ci0gICAgPGRpbWVuIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfbWF4X2hlaWdodCI+Mjg4ZHA8L2RpbWVuPgotICAgIDwhLS0gSGVpZ2h0IG9mIHZvbHVtZSBncm91cCBpdGVtLiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2hlaWdodCI+NjhkcDwvZGltZW4+Ci0gICAgPCEtLSBTaXplIG9mIGFuIGl0ZW0ncyBpY29uLiAtLT4KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9pdGVtX2ljb25fc2l6ZSI+MjRkcDwvZGltZW4+Ci0KLSAgICA8ZGltZW4gbmFtZT0ibXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9wYWRkaW5nX3RvcCI+MTZkcDwvZGltZW4+Ci0gICAgPCEtLSBHcm91cCBsaXN0IGV4cGFuZC9jb2xsYXBzZSBhbmltYXRpb24gZHVyYXRpb24uIC0tPgotICAgIDxpbnRlZ2VyIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfYW5pbWF0aW9uX2R1cmF0aW9uX21zIj40MDA8L2ludGVnZXI+Ci0gICAgPCEtLSBHcm91cCBsaXN0IGZhZGUgaW4gYW5pbWF0aW9uIGR1cmF0aW9uLiAtLT4KLSAgICA8aW50ZWdlciBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2ZhZGVfaW5fZHVyYXRpb25fbXMiPjQwMDwvaW50ZWdlcj4KLSAgICA8IS0tIEdyb3VwIGxpc3QgZmFkZSBvdXQgYW5pbWF0aW9uIGR1cmF0aW9uLiAtLT4KLSAgICA8aW50ZWdlciBuYW1lPSJtcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2ZhZGVfb3V0X2R1cmF0aW9uX21zIj4yMDA8L2ludGVnZXI+Ci0KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc193aWR0aCI+MTUwZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX2hlaWdodCI+MzZkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaWNvbl9zaXplIj4yMGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9lbWJlZGRlZF9zZXR0aW5nc190ZXh0X2hlaWdodCI+MThkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiPjEyc3A8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2VtYmVkZGVkX3NldHRpbmdzX3N1Yl90ZXh0X3NpemUiPjEwc3A8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3Nfd2lkdGgiPjIyNWRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX3NldHRpbmdzX2hlaWdodCI+NTRkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9zZXR0aW5nc19pY29uX3NpemUiPjMwZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3NfdGV4dF9oZWlnaHQiPjI3ZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3NfbWFpbl90ZXh0X3NpemUiPjE2c3A8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2Z1bGxfc2V0dGluZ3Nfc3ViX3RleHRfc2l6ZSI+MTNzcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfc2V0dGluZ3Nfb2Zmc2V0Ij44ZHA8L2RpbWVuPgotCi0gICAgPGRpbWVuIG5hbWU9Im1jdjJfdHJhbnNwb3J0X2NvbnRyb2xzX3BhZGRpbmciPjRkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfcGF1c2VfaWNvbl9zaXplIj4zNmRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9mdWxsX2ljb25fc2l6ZSI+MjhkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZW1iZWRkZWRfaWNvbl9zaXplIj4yNGRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9taW5pbWFsX2ljb25fc2l6ZSI+MjRkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfaWNvbl9tYXJnaW4iPjEwZHA8L2RpbWVuPgotCi0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9hbGJ1bV9pbWFnZV9wb3J0cmFpdF9zaXplIj4yMzJkcDwvZGltZW4+Ci0gICAgPGRpbWVuIG5hbWU9Im1jdjJfZnVsbF9hbGJ1bV9pbWFnZV9sYW5kc2NhcGVfc2l6ZSI+MTc2ZHA8L2RpbWVuPgotCi0gICAgPGRpbWVuIG5hbWU9Im1jdjJfY3VzdG9tX3Byb2dyZXNzX21heF9zaXplIj4yZHA8L2RpbWVuPgotICAgIDxkaW1lbiBuYW1lPSJtY3YyX2N1c3RvbV9wcm9ncmVzc190aHVtYl9zaXplIj4xMmRwPC9kaW1lbj4KLSAgICA8ZGltZW4gbmFtZT0ibWN2Ml9idWZmZXJfdmlld19oZWlnaHQiPjVkcDwvZGltZW4+Ci0gICAgPCEtLSBUT0RPOiBhZGp1c3QgYm90dG9tIGJhciB2aWV3IC0tPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHJpbmdzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTk3YTNiLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0cmluZ3MueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcyB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gICAgeG1sbnM6eGxpZmY9InVybjpvYXNpczpuYW1lczp0Yzp4bGlmZjpkb2N1bWVudDoxLjIiPgotCi0gICAgPCEtLSBOYW1lIGZvciB0aGUgZGVmYXVsdCBzeXN0ZW0gcm91dGUgcHJpb3IgdG8gSmVsbHliZWFuLiBbQ0hBUiBMSU1JVD0zMF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9zeXN0ZW1fcm91dGVfbmFtZSI+U3lzdGVtPC9zdHJpbmc+Ci0KLSAgICA8IS0tIE5hbWUgZm9yIHRoZSB1c2VyIHJvdXRlIGNhdGVnb3J5IGNyZWF0ZWQgd2hlbiBwdWJsaXNoaW5nIHJvdXRlcyB0byB0aGUgc3lzdGVtIGluIEplbGx5YmVhbiBhbmQgYWJvdmUuIFtDSEFSIExJTUlUPTMwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX3VzZXJfcm91dGVfY2F0ZWdvcnlfbmFtZSI+RGV2aWNlczwvc3RyaW5nPgotCi0gICAgPCEtLSBTdHJpbmcgdG8gYmUgc2hvd24gYXMgYSB0b29sdGlwIG9mIE1lZGlhUm91dGVCdXR0b24KLSAgICAgICAgQ2FzdCBpcyB0aGUgc3RhbmRhcmQgYW5kcm9pZCB2ZXJiIGZvciBzZW5kaW5nIGNvbnRlbnQgdG8gYSByZW1vdGUgZGV2aWNlLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbiI+Q2FzdCBidXR0b248L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBvZiBhIE1lZGlhUm91dGVCdXR0b24gZm9yIGFjY2Vzc2liaWxpdHkgc3VwcG9ydCB3aGVuIG5vIHJlbW90ZSBkZXZpY2UgaXMgY29ubmVjdGVkLgotICAgICAgICBDYXN0IGlzIHRoZSBzdGFuZGFyZCBhbmRyb2lkIHZlcmIgZm9yIHNlbmRpbmcgY29udGVudCB0byBhIHJlbW90ZSBkZXZpY2UuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkIj5DYXN0IGJ1dHRvbi4gRGlzY29ubmVjdGVkPC9zdHJpbmc+Ci0KLSAgICA8IS0tIENvbnRlbnQgZGVzY3JpcHRpb24gb2YgYSBNZWRpYVJvdXRlQnV0dG9uIGZvciBhY2Nlc3NpYmlsaXR5IHN1cHBvcnQgd2hpbGUgY29ubmVjdGluZyB0byBhIHJlbW90ZSBkZXZpY2UuCi0gICAgICAgIENhc3QgaXMgdGhlIHN0YW5kYXJkIGFuZHJvaWQgdmVyYiBmb3Igc2VuZGluZyBjb250ZW50IHRvIGEgcmVtb3RlIGRldmljZS4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jYXN0X2J1dHRvbl9jb25uZWN0aW5nIj5DYXN0IGJ1dHRvbi4gQ29ubmVjdGluZzwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIG9mIGEgTWVkaWFSb3V0ZUJ1dHRvbiBmb3IgYWNjZXNzaWJpbGl0eSBzdXBwb3J0IHdoZW4gYSByZW1vdGUgZGV2aWNlIGlzIGNvbm5lY3RlZC4KLSAgICAgICAgQ2FzdCBpcyB0aGUgc3RhbmRhcmQgYW5kcm9pZCB2ZXJiIGZvciBzZW5kaW5nIGNvbnRlbnQgdG8gYSByZW1vdGUgZGV2aWNlLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZCI+Q2FzdCBidXR0b24uIENvbm5lY3RlZDwvc3RyaW5nPgotCi0gICAgPCEtLSBUaXRsZSBvZiB0aGUgbWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cuIFtDSEFSIExJTUlUPTMwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfdGl0bGUiPkNhc3QgdG88L3N0cmluZz4KLQotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCB0byBzaG93IHdoZW4gbm8gZGV2aWNlcyBoYXZlIGJlZW4gZm91bmQuIFtDSEFSIExJTUlUPTUwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2Nob29zZXJfc2VhcmNoaW5nIj5GaW5kaW5nIGRldmljZXM8L3N0cmluZz4KLQotICAgIDwhLS0gQnV0dG9uIHRvIGRpc2Nvbm5lY3QgZnJvbSBhIG1lZGlhIHJvdXRlLiAgW0NIQVIgTElNSVQ9MzBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9kaXNjb25uZWN0Ij5EaXNjb25uZWN0PC9zdHJpbmc+Ci0KLSAgICA8IS0tIEJ1dHRvbiB0byBzdG9wIHBsYXliYWNrIGFuZCBkaXNjb25uZWN0IGZyb20gYSBtZWRpYSByb3V0ZS4gW0NIQVIgTElNSVQ9MzBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmciPlN0b3AgY2FzdGluZzwvc3RyaW5nPgotCi0gICAgPCEtLSBDb250ZW50IGRlc2NyaXB0aW9uIGZvciBhY2Nlc3NpYmlsaXR5IChub3Qgc2hvd24gb24gdGhlIHNjcmVlbik6IGRpYWxvZyBjbG9zZSBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jbG9zZV9kZXNjcmlwdGlvbiI+Q2xvc2U8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBtZWRpYSBwbGF5IGJ1dHRvbi4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3BsYXkiPlBsYXk8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBtZWRpYSBwYXVzZSBidXR0b24uIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9wYXVzZSI+UGF1c2U8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBtZWRpYSBzdG9wIGJ1dHRvbi4gW0NIQVIgTElNSVQ9Tk9ORV0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX3N0b3AiPlN0b3A8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBncm91cCBleHBhbmQgYnV0dG9uLiBQcmVzc2luZyBidXR0b24gc2hvd3MgZ3JvdXAgbWVtYmVycyBvZiBhIHNlbGVjdGVkIHJvdXRlIGdyb3VwLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfZXhwYW5kX2dyb3VwIj5FeHBhbmQ8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBncm91cCBjb2xsYXBzZSBidXR0b24uIFByZXNzaW5nIGJ1dHRvbiBoaWRlcyBncm91cCBtZW1iZXJzIG9mIGEgc2VsZWN0ZWQgcm91dGUgZ3JvdXAuIFtDSEFSIExJTUlUPU5PTkVdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9jb2xsYXBzZV9ncm91cCI+Q29sbGFwc2U8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiBhbGJ1bSBhcnQgYnV0dG9uLiBDbGlja2luZyBvbiB0aGUgYWxidW0gYXJ0IHRha2VzIHVzZXIgdG8gYSBwcmVkZWZpbmVkIGFjdGl2aXR5IHBlciBtZWRpYSBhcHAuIFtDSEFSIExJTUlUPTUwXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfYWxidW1fYXJ0Ij5BbGJ1bSBhcnQ8L3N0cmluZz4KLQotICAgIDwhLS0gQ29udGVudCBkZXNjcmlwdGlvbiBmb3IgYWNjZXNzaWJpbGl0eSAobm90IHNob3duIG9uIHRoZSBzY3JlZW4pOiB2b2x1bWUgc2xpZGVyLiBbQ0hBUiBMSU1JVD1OT05FXSAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1yX2NvbnRyb2xsZXJfdm9sdW1lX3NsaWRlciI+Vm9sdW1lIHNsaWRlcjwvc3RyaW5nPgotCi0gICAgPCEtLSBQbGFjZWhvbGRlciB0ZXh0IHRvIHNob3cgd2hlbiBubyBtZWRpYSBoYXZlIGJlZW4gc2VsZWN0ZWQgZm9yIHBsYXliYWNrLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkIj5ObyBtZWRpYSBzZWxlY3RlZDwvc3RyaW5nPgotCi0gICAgPCEtLSBQbGFjZWhvbGRlciB0ZXh0IHRvIHNob3cgd2hlbiBubyB0aXRsZS9kZXNjcmlwdGlvbiBoYXZlIGJlZW4gZm91bmQgZm9yIGEgZ2l2ZW4gc29uZy92aWRlby4gW0NIQVIgTElNSVQ9NTBdIC0tPgotICAgIDxzdHJpbmcgbmFtZT0ibXJfY29udHJvbGxlcl9ub19pbmZvX2F2YWlsYWJsZSI+Tm8gaW5mbyBhdmFpbGFibGU8L3N0cmluZz4KLQotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgaXMgY3VycmVudGx5IGNhc3Rpbmcgc2NyZWVuLiBbQ0hBUiBMSU1JVD01MF0gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtcl9jb250cm9sbGVyX2Nhc3Rpbmdfc2NyZWVuIj5DYXN0aW5nIHNjcmVlbjwvc3RyaW5nPgotCi0gICAgPCEtLSBUZXh0IGZvciBlcnJvciBhbGVydCB3aGVuIGEgdmlkZW8gY29udGFpbmVyIGlzIG5vdCB2YWxpZCBmb3IgcHJvZ3Jlc3NpdmUgZG93bmxvYWQvcGxheWJhY2suIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iVmlkZW9WaWV3Ml9lcnJvcl90ZXh0X2ludmFsaWRfcHJvZ3Jlc3NpdmVfcGxheWJhY2siPlRoaXMgdmlkZW8gaXNuXCd0IHZhbGlkIGZvciBzdHJlYW1pbmcgdG8gdGhpcyBkZXZpY2UuPC9zdHJpbmc+Ci0gICAgPCEtLSBUZXh0IGZvciBlcnJvciBhbGVydCB3aGVuIGEgdmlkZW8gY2Fubm90IGJlIHBsYXllZC4gSXQgY2FuIGJlIHVzZWQgYnkgYW55IGFwcC4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJWaWRlb1ZpZXcyX2Vycm9yX3RleHRfdW5rbm93biI+Q2FuXCd0IHBsYXkgdGhpcyB2aWRlby48L3N0cmluZz4KLSAgICA8IS0tIEJ1dHRvbiB0byBjbG9zZSBlcnJvciBhbGVydCB3aGVuIGEgdmlkZW8gY2Fubm90IGJlIHBsYXllZC4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJWaWRlb1ZpZXcyX2Vycm9yX2J1dHRvbiI+T0s8L3N0cmluZz4KLQotICAgIDwhLS0gVGV4dCBmb3IgZGlzcGxheWluZyBhZCBza2lwIHdhaXQgdGltZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hZF9za2lwX3dhaXRfdGltZSI+Ci0gICAgICAgIFlvdSBjYW4gc2tpcCBBZCBpbiA8eGxpZmY6ZyBpZD0id2FpdF90aW1lIiBleGFtcGxlPSI1Ij4lMSRkPC94bGlmZjpnPnMKLSAgICA8L3N0cmluZz4KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgYWQgdG90YWwgcmVtYWluaW5nIHRpbWUuIC0tPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYWRfcmVtYWluaW5nX3RpbWUiPgotICAgICAgICBBZCDCtyA8eGxpZmY6ZyBpZD0icmVtYWluaW5nX3RpbWUiIGV4YW1wbGU9IjE6MTUiPiUxJHM8L3hsaWZmOmc+IHJlbWFpbmluZwotICAgIDwvc3RyaW5nPgotICAgIDwhLS0gUGxhY2Vob2xkZXIgdGV4dCBpbmRpY2F0aW5nIHRoYXQgdGhlIHVzZXIgY2FuIHByZXNzIHRoZSBidXR0b24gdG8gZ28gdG8gYW4gZXh0ZXJuYWwgd2Vic2l0ZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9hZF90ZXh0Ij5WaXNpdCBBZHZlcnRpc2VyPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9zdWJ0aXRsZV90ZXh0Ij5DbG9zZWQgY2FwdGlvbjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfc3VidGl0bGVfb2ZmX3RleHQiPk9mZjwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfdGV4dCI+QXVkaW8gdHJhY2s8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX25vbmVfdGV4dCI+Tm9uZTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfdmlkZW9fcXVhbGl0eV90ZXh0Ij5WaWRlbyBxdWFsaXR5PC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml92aWRlb19xdWFsaXR5X2F1dG9fdGV4dCI+QXV0bzwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfaGVscF90ZXh0Ij5IZWxwICZhbXA7IGZlZWRiYWNrPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJNZWRpYUNvbnRyb2xWaWV3Ml9wbGF5YmFja19zcGVlZF90ZXh0Ij5QbGF5YmFjayBzcGVlZDwvc3RyaW5nPgotICAgIDxzdHJpbmctYXJyYXkgbmFtZT0iTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRzIj4KLSAgICAgICAgPGl0ZW0+MC4yNXg8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjAuNXg8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjAuNzV4PC9pdGVtPgotICAgICAgICA8aXRlbT5Ob3JtYWw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtPjEuMjV4PC9pdGVtPgotICAgICAgICA8aXRlbT4xLjV4PC9pdGVtPgotICAgICAgICA8aXRlbT4yeDwvaXRlbT4KLSAgICA8L3N0cmluZy1hcnJheT4KLSAgICA8IS0tIFBsYWNlaG9sZGVyIHRleHQgZm9yIGRpc3BsYXlpbmcgdGltZS4gVXNlZCB0byBjYWxjdWxhdGUgd2hpY2ggc2l6ZSBsYXlvdXQgdG8gdXNlLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3RpbWVfcGxhY2Vob2xkZXIiPjAwOjAwOjAwPC9zdHJpbmc+Ci0KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgc3VidGl0bGUgdHJhY2sgbnVtYmVyLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX3RyYWNrX251bWJlcl90ZXh0Ij4KLSAgICAgICAgVHJhY2sgPHhsaWZmOmcgaWQ9InRyYWNrX251bWJlciIgZXhhbXBsZT0iMSI+JTEkczwveGxpZmY6Zz4KLSAgICA8L3N0cmluZz4KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgYXVkaW8gdHJhY2sgbnVtYmVyLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Ik1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX251bWJlcl90ZXh0Ij4KLSAgICAgICAgVHJhY2sgPHhsaWZmOmcgaWQ9ImF1ZGlvX251bWJlciIgZXhhbXBsZT0iMSI+JTEkczwveGxpZmY6Zz4KLSAgICA8L3N0cmluZz4KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgdW5rbm93biBzb25nIHRpdGxlLiAtLT4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0Ij5Tb25nIHRpdGxlIHVua25vd248L3N0cmluZz4KLSAgICA8IS0tIFRleHQgZm9yIGRpc3BsYXlpbmcgdW5rbm93biBhcnRpc3QgbmFtZS4gLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX211c2ljX2FydGlzdF91bmtub3duX3RleHQiPkFydGlzdCB1bmtub3duPC9zdHJpbmc+Ci0KLSAgICA8IS0tQ29udGVudCBEZXNjcmlwdGlvbnMgLS0+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX2JhY2tfYnV0dG9uX2Rlc2MiPkJhY2s8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfb3ZlcmZsb3dfbGVmdF9idXR0b25fZGVzYyI+U2VlIG1vcmUgYnV0dG9uczwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9vdmVyZmxvd19yaWdodF9idXR0b25fZGVzYyI+QmFjayB0byBwcmV2aW91cyBidXR0b24gbGlzdDwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9zZWVrX2Jhcl9kZXNjIj5QbGF5YmFjayBwcm9ncmVzczwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9zZXR0aW5nc19idXR0b25fZGVzYyI+U2V0dGluZ3M8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfdmlkZW9fcXVhbGl0eV9idXR0b25fZGVzYyI+VmlkZW8gUXVhbGl0eSBTZWxlY3Rpb248L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfY2NfaXNfb24iPlN1YnRpdGxlIGlzIG9uLiBDbGljayB0byBoaWRlIGl0Ljwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9jY19pc19vZmYiPlN1YnRpdGxlIGlzIG9mZi4gQ2xpY2sgdG8gc2hvdyBpdC48L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcmVwbGF5X2J1dHRvbl9kZXNjIj5SZXBsYXk8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcGxheV9idXR0b25fZGVzYyI+UGxheTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9wYXVzZV9idXR0b25fZGVzYyI+UGF1c2U8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcHJldmlvdXNfYnV0dG9uX2Rlc2MiPlByZXZpb3VzIG1lZGlhPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX25leHRfYnV0dG9uX2Rlc2MiPk5leHQgbWVkaWE8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfcmV3aW5kX2J1dHRvbl9kZXNjIj5SZXdpbmQgYnkgMTAgc2Vjb25kczwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9mZndkX2J1dHRvbl9kZXNjIj5HbyBmb3J3YXJkIGJ5IDMwIHNlY29uZHM8L3N0cmluZz4KLSAgICA8c3RyaW5nIG5hbWU9Im1jdjJfbGF1bmNoX2J1dHRvbl9kZXNjIj5MYXVuY2ggTGluazwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml9tdXRlZF9idXR0b25fZGVzYyI+TXV0ZWQuIENsaWNrIHRvIHVubXV0ZTwvc3RyaW5nPgotICAgIDxzdHJpbmcgbmFtZT0ibWN2Ml91bm11dGVkX2J1dHRvbl9kZXNjIj5DbGljayB0byBNdXRlPC9zdHJpbmc+Ci0gICAgPHN0cmluZyBuYW1lPSJtY3YyX2Z1bGxfc2NyZWVuX2J1dHRvbl9kZXNjIj5GdWxsIHNjcmVlbjwvc3RyaW5nPgotPC9yZXNvdXJjZXM+CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZS54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViOWE4ZWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3R5bGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08cmVzb3VyY2VzPgotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW4iPkBkaW1lbi9tY3YyX2ljb25fbWFyZ2luPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjYWxlVHlwZSI+Zml0WFk8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uUHJldmlvdXMiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3NraXBfcHJldmlvdXM8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wcmV2aW91c19idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5OZXh0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19za2lwX25leHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9mdWxsX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9uZXh0X2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlBhdXNlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19wYXVzZV9jaXJjbGVfZmlsbGVkPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wYXVzZV9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5GZndkIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19mb3J3YXJkXzMwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZnVsbF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfZmZ3ZF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkZ1bGxUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5SZXciPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3Jld2luZF8xMDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2Z1bGxfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3Jld2luZF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9tYXJnaW4iPkBkaW1lbi9tY3YyX2ljb25fbWFyZ2luPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNjYWxlVHlwZSI+Zml0WFk8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlByZXZpb3VzIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19za2lwX3ByZXZpb3VzPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9wcmV2aW91c19idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkVtYmVkZGVkVHJhbnNwb3J0Q29udHJvbHNCdXR0b24uTmV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfc2tpcF9uZXh0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9uZXh0X2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRW1iZWRkZWRUcmFuc3BvcnRDb250cm9sc0J1dHRvbi5QYXVzZSI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5AZGltZW4vbWN2Ml9wYXVzZV9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcGF1c2VfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLkZmd2QiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2ZvcndhcmRfMzA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5AZGltZW4vbWN2Ml9lbWJlZGRlZF9pY29uX3NpemU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2Zmd2RfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJFbWJlZGRlZFRyYW5zcG9ydENvbnRyb2xzQnV0dG9uLlJldyI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfcmV3aW5kXzEwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9yZXdpbmRfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJNaW5pbWFsVHJhbnNwb3J0Q29udHJvbHNCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfcGF1c2VfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX3BhdXNlX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luIj5AZGltZW4vbWN2Ml9pY29uX21hcmdpbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY2FsZVR5cGUiPmZpdFhZPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX3BhdXNlX2NpcmNsZV9maWxsZWQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfcGF1c2VfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhciI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj5tYXRjaF9wYXJlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+NDZkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nU3RhcnQiPjVkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpwYWRkaW5nRW5kIj41ZHA8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhckJ1dHRvbiI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6YmFja2dyb3VuZCI+QG51bGw8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj4zNmRwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPjM2ZHA8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhckJ1dHRvbi5CYWNrIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19hcnJvd19iYWNrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX2JhY2tfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaXRsZUJhckJ1dHRvbi5MYXVuY2giPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2xhdW5jaDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9sYXVuY2hfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaW1lVGV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dpZHRoIj53cmFwX2NvbnRlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+d3JhcF9jb250ZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdTdGFydCI+NGRwPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnBhZGRpbmdFbmQiPjRkcDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0U3R5bGUiPmJvbGQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dFNpemUiPjE0c3A8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGltZVRleHQuQ3VycmVudCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivd2hpdGU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dCI+QHN0cmluZy9NZWRpYUNvbnRyb2xWaWV3Ml90aW1lX3BsYWNlaG9sZGVyPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGltZVRleHQuSW50ZXJwdW5jdCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivd2hpdGVfb3BhY2l0eV83MDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Ij7CtzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRpbWVUZXh0LkVuZCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6dGV4dENvbG9yIj5AY29sb3Ivd2hpdGVfb3BhY2l0eV83MDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp0ZXh0Ij5Ac3RyaW5nL01lZGlhQ29udHJvbFZpZXcyX3RpbWVfcGxhY2Vob2xkZXI8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmJhY2tncm91bmQiPkBudWxsPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+QGRpbWVuL21jdjJfZW1iZWRkZWRfaWNvbl9zaXplPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF9oZWlnaHQiPkBkaW1lbi9tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfbWFyZ2luIj5AZGltZW4vbWN2Ml9pY29uX21hcmdpbjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJfaG9yaXpvbnRhbDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzY2FsZVR5cGUiPmZpdFhZPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLkNDIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19zdWJ0aXRsZV9vZmY8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfY2NfaXNfb2ZmPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLkZ1bGxTY3JlZW4iPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2Z1bGxzY3JlZW48L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfZnVsbF9zY3JlZW5fYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJCb3R0b21CYXJCdXR0b24uT3ZlcmZsb3dSaWdodCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6c3JjIj5AZHJhd2FibGUvaWNfY2hldnJvbl9yaWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9vdmVyZmxvd19yaWdodF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5PdmVyZmxvd0xlZnQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOnNyYyI+QGRyYXdhYmxlL2ljX2NoZXZyb25fbGVmdDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9vdmVyZmxvd19sZWZ0X2J1dHRvbl9kZXNjPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iQm90dG9tQmFyQnV0dG9uLlNldHRpbmdzIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19zZXR0aW5nczwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpjb250ZW50RGVzY3JpcHRpb24iPkBzdHJpbmcvbWN2Ml9zZXR0aW5nc19idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5NdXRlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY191bm11dGU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Y29udGVudERlc2NyaXB0aW9uIj5Ac3RyaW5nL21jdjJfdW5tdXRlZF9idXR0b25fZGVzYzwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IkJvdHRvbUJhckJ1dHRvbi5WaWRlb1F1YWxpdHkiPgotICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpzcmMiPkBkcmF3YWJsZS9pY19oaWdoX3F1YWxpdHk8L2l0ZW0+Ci0gICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmNvbnRlbnREZXNjcmlwdGlvbiI+QHN0cmluZy9tY3YyX3ZpZGVvX3F1YWxpdHlfYnV0dG9uX2Rlc2M8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNQb3J0cmFpdCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+MGRwPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljUG9ydHJhaXQuSW1hZ2UiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+bWF0Y2hfcGFyZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93ZWlnaHQiPjAuNjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXI8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNQb3J0cmFpdC5UZXh0Ij4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2lkdGgiPm1hdGNoX3BhcmVudDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfd2VpZ2h0Ij4wLjQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+dG9wfGNlbnRlcjwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpvcmllbnRhdGlvbiI+dmVydGljYWw8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNMYW5kc2NhcGUiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93aWR0aCI+MGRwPC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLSAgICA8c3R5bGUgbmFtZT0iRnVsbE11c2ljTGFuZHNjYXBlLkltYWdlIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpsYXlvdXRfaGVpZ2h0Ij5tYXRjaF9wYXJlbnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X3dlaWdodCI+MC4zNTwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDpncmF2aXR5Ij5jZW50ZXJ8cmlnaHQ8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJGdWxsTXVzaWNMYW5kc2NhcGUuVGV4dCI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X2hlaWdodCI+bWF0Y2hfcGFyZW50PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOmxheW91dF93ZWlnaHQiPjAuNjU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6bGF5b3V0X21hcmdpbkxlZnQiPjI0ZHA8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6Z3Jhdml0eSI+Y2VudGVyfGxlZnQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImFuZHJvaWQ6b3JpZW50YXRpb24iPnZlcnRpY2FsPC9pdGVtPgotICAgIDwvc3R5bGU+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0eWxlcy54bWwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvcmVzL3ZhbHVlcy9zdHlsZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGU2OTAwLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N0eWxlcy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLSBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0KLSAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxyZXNvdXJjZXM+Ci0gICAgPHN0eWxlIG5hbWU9IldpZGdldC5NZWRpYVJvdXRlci5NZWRpYVJvdXRlQnV0dG9uIgotICAgICAgICAgICAgcGFyZW50PSJXaWRnZXQuQXBwQ29tcGF0LkFjdGlvbkJ1dHRvbiI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImV4dGVybmFsUm91dGVFbmFibGVkRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9idXR0b25fZGFyazwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IldpZGdldC5NZWRpYVJvdXRlci5MaWdodC5NZWRpYVJvdXRlQnV0dG9uIgotICAgICAgICAgICAgcGFyZW50PSJXaWRnZXQuQXBwQ29tcGF0LkxpZ2h0LkFjdGlvbkJ1dHRvbiI+Ci0gICAgICAgIDxpdGVtIG5hbWU9ImV4dGVybmFsUm91dGVFbmFibGVkRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9idXR0b25fbGlnaHQ8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUZXh0QXBwZWFyYW5jZS5NZWRpYVJvdXRlci5UaXRsZSIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5BcHBDb21wYXQuVGl0bGUiIC8+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuUHJpbWFyeVRleHQiIHBhcmVudD0iVGV4dEFwcGVhcmFuY2UuQXBwQ29tcGF0LlN1YmhlYWQiIC8+Ci0KLSAgICA8c3R5bGUgbmFtZT0iVGV4dEFwcGVhcmFuY2UuTWVkaWFSb3V0ZXIuU2Vjb25kYXJ5VGV4dCIgcGFyZW50PSJUZXh0QXBwZWFyYW5jZS5BcHBDb21wYXQuQm9keTEiIC8+Ci08L3Jlc291cmNlcz4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3N5bWJvbHMueG1sIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3ltYm9scy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMGU4YzYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvc3ltYm9scy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPCEtLQotLyogQ29weXJpZ2h0IDIwMTcsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSoqCi0qKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotKioKLSoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoqCi0qKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0qKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0qKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0qKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCi0tLT4KLTxyZXNvdXJjZXM+Ci0gICAgPCEtLWphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJjYyIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9ImZmd2QiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJtZWRpYWNvbnRyb2xsZXJfcHJvZ3Jlc3MiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJuZXh0IiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0icGF1c2UiIC8+Ci0gICAgPGphdmEtc3ltYm9sIHR5cGU9ImlkIiBuYW1lPSJwcmV2IiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0icmV3IiAvPgotICAgIDxqYXZhLXN5bWJvbCB0eXBlPSJpZCIgbmFtZT0idGltZSIgLz4KLSAgICA8amF2YS1zeW1ib2wgdHlwZT0iaWQiIG5hbWU9InRpbWVfY3VycmVudCIgLy0tPgotPC9yZXNvdXJjZXM+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9yZXMvdmFsdWVzL3RoZW1lcy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5YTc1NGIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Jlcy92YWx1ZXMvdGhlbWVzLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08IS0tIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLQotICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHJlc291cmNlcz4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZS5NZWRpYVJvdXRlciIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLk1hdGVyaWFsIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0iYW5kcm9pZDp3aW5kb3dOb1RpdGxlIj50cnVlPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQnV0dG9uU3R5bGUiPkBzdHlsZS9XaWRnZXQuTWVkaWFSb3V0ZXIuTWVkaWFSb3V0ZUJ1dHRvbjwvaXRlbT4KLQotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ2xvc2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX2RpYWxvZ19jbG9zZV9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGxheV9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGF1c2VEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BhdXNlX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVTdG9wRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9zdG9wX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiPkBkcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2Rhcms8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVEZWZhdWx0SWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfbXJfYnV0dG9uX2Rpc2Nvbm5lY3RlZF9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlVHZJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV90dl9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3NwZWFrZXJfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJHcm91cEljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX3ZvbF90eXBlX3NwZWFrZXJfZ3JvdXBfZGFyazwvaXRlbT4KLQotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij5AbnVsbDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRoZW1lLk1lZGlhUm91dGVyLkxpZ2h0Q29udHJvbFBhbmVsIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZUNvbnRyb2xQYW5lbFRoZW1lT3ZlcmxheSI+QHN0eWxlL1RoZW1lT3ZlcmxheS5NZWRpYVJvdXRlci5MaWdodDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRoZW1lLk1lZGlhUm91dGVyLkxpZ2h0IiBwYXJlbnQ9ImFuZHJvaWQ6VGhlbWUuTWF0ZXJpYWwuTGlnaHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJhbmRyb2lkOndpbmRvd05vVGl0bGUiPnRydWU8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVCdXR0b25TdHlsZSI+QHN0eWxlL1dpZGdldC5NZWRpYVJvdXRlci5MaWdodC5NZWRpYVJvdXRlQnV0dG9uPC9pdGVtPgotCi0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVDbG9zZURyYXdhYmxlIj5AZHJhd2FibGUvbXJfZGlhbG9nX2Nsb3NlX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGxheV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiPkBkcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlRGVmYXVsdEljb25EcmF3YWJsZSI+QGRyYXdhYmxlL2ljX21yX2J1dHRvbl9ncmV5PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlVHZJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV90dl9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVNwZWFrZXJJY29uRHJhd2FibGUiPkBkcmF3YWJsZS9pY192b2xfdHlwZV9zcGVha2VyX2xpZ2h0PC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3BlYWtlckdyb3VwSWNvbkRyYXdhYmxlIj5AZHJhd2FibGUvaWNfdm9sX3R5cGVfc3BlYWtlcl9ncm91cF9saWdodDwvaXRlbT4KLQotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij5AbnVsbDwvaXRlbT4KLSAgICA8L3N0eWxlPgotCi0gICAgPHN0eWxlIG5hbWU9IlRoZW1lLk1lZGlhUm91dGVyLkxpZ2h0LkRhcmtDb250cm9sUGFuZWwiPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQ29udHJvbFBhbmVsVGhlbWVPdmVybGF5Ij5Ac3R5bGUvVGhlbWVPdmVybGF5Lk1lZGlhUm91dGVyLkRhcms8L2l0ZW0+Ci0gICAgPC9zdHlsZT4KLQotICAgIDxzdHlsZSBuYW1lPSJUaGVtZU92ZXJsYXkuTWVkaWFSb3V0ZXIuRGFyayIgcGFyZW50PSJhbmRyb2lkOlRoZW1lLk1hdGVyaWFsIj4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBsYXlEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3BsYXlfZGFyazwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlU3RvcERyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfc3RvcF9kYXJrPC9pdGVtPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlQXVkaW9UcmFja0RyYXdhYmxlIj5AZHJhd2FibGUvbXJfdm9sX3R5cGVfYXVkaW90cmFja19kYXJrPC9pdGVtPgotCi0gICAgPC9zdHlsZT4KLSAgICA8c3R5bGUgbmFtZT0iVGhlbWVPdmVybGF5Lk1lZGlhUm91dGVyLkxpZ2h0IiBwYXJlbnQ9ImFuZHJvaWQ6VGhlbWUuTWF0ZXJpYWwuTGlnaHQiPgotICAgICAgICA8aXRlbSBuYW1lPSJtZWRpYVJvdXRlUGxheURyYXdhYmxlIj5AZHJhd2FibGUvbXJfbWVkaWFfcGxheV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVBhdXNlRHJhd2FibGUiPkBkcmF3YWJsZS9tcl9tZWRpYV9wYXVzZV9saWdodDwvaXRlbT4KLSAgICAgICAgPGl0ZW0gbmFtZT0ibWVkaWFSb3V0ZVN0b3BEcmF3YWJsZSI+QGRyYXdhYmxlL21yX21lZGlhX3N0b3BfbGlnaHQ8L2l0ZW0+Ci0gICAgICAgIDxpdGVtIG5hbWU9Im1lZGlhUm91dGVBdWRpb1RyYWNrRHJhd2FibGUiPkBkcmF3YWJsZS9tcl92b2xfdHlwZV9hdWRpb3RyYWNrX2xpZ2h0PC9pdGVtPgotICAgIDwvc3R5bGU+Ci0KLTwvcmVzb3VyY2VzPgpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3J1bmN0cy5zaCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9ydW5jdHMuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxYjFhMWUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3J1bmN0cy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0jIS9iaW4vYmFzaAotIyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jIFVzYWdlICcuIHJ1bmN0cy5zaCcKLQotZnVuY3Rpb24gX3J1bnRlc3RfY3RzX21lZGlhY29tcG9uZW50X3VzYWdlKCkgewotICBlY2hvICdydW50ZXN0LWN0cy1NZWRpYUNvbXBvbmVudHMgW29wdGlvbl06IEJ1aWxkLCBmbGFzaCBkZXZpY2UsJwotICBlY2hvICcgICAgICAgICAgICAgIGFuZCBydW4gc3Vic2V0IG9mIEN0c01lZGlhVGVzdENhc2VzIHRoYXQgTWVkaWFDb21wb25lbnRzIGNvdmVycy4nCi0gIGVjaG8gJyAgICAgICAgICAqV2FybmluZyogVGhpcyBieXBhc3NlcyBDVFMgc2V0dXAgKGUuZy4gZG93bmxvYWQgbWVkaWEgY29udGVudHMgZnJvbSBzZXJ2ZXIpJwotICBlY2hvICcgICAgICAgICAgRm9yIHJ1bm5pbmcgQ1RTIGluIG9mZmljaWFsIHdheSwgdXNlIGF0ZXN0IG9yIGN0cy10cmFkZWZlZCAnCi0gIGVjaG8gJyAgICAgLWh8LS1oZWxwOiBUaGlzIGhlbHAnCi0gIGVjaG8gJyAgICAgLS1za2lwOiBTa2lwIGJ1aWxkIGFuZCBmbGFzaC4gSnVzdCByZXJ1bi10ZXN0cycKLSAgZWNobyAnICAgICAtLW1pbjogT25seSByZWJ1aWxkIHRlc3RzIGFuZCB1cGRhdGFibGUgbGlicmFyeS4nCi0gIGVjaG8gJyAgICAgLS10ZXN0OiBPbmx5IHJlYnVpbGQgdGVzdHMnCi0gIGVjaG8gJyAgICAgLXMgW2RldmljZV9pZF06IFNwZWNpZnkgYSBkZXZpY2UgbmFtZSB0byBydW4gdGVzdCBhZ2FpbnN0LicKLSAgZWNobyAnICAgICAgICAgICAgICAgICAgICAgWW91IGNhbiBkZWZpbmUgJHtBREJIT1NUfSBpbnN0ZWFkLicKLSAgZWNobyAnICAgICAtciBbY291bnRdOiBSZXBlYXQgdGVzdHMgZm9yIGdpdmVuIGNvdW50LiBJdCB3aWxsIHN0b3Agd2hlbiBmYWlscy4nCi0gIGVjaG8gJyAgICAgLS1pZ25vcmU6IEtlZXAgcmVwZWF0aW5nIHRlc3RzIGV2ZW4gd2hlbiBpdCBmYWlscy4nCi0gIGVjaG8gJyAgICAgLXQgW3Rlc3RdOiBPbmx5IHJ1biB0aGUgc3BlY2lmaWMgdGVzdC4gQ2FuIGJlIGVpdGhlciBhIGNsYXNzIG9yIGEgbWV0aG9kLicKLX0KLQotZnVuY3Rpb24gcnVudGVzdC1jdHMtTWVkaWFDb21wb25lbnRzKCkgewotICAjIEVkaXQgaGVyZSBpZiB5b3Ugd2FudCB0byBzdXBwb3J0IG90aGVyIHRlc3RzLgotICAjIExpc3QgdXAgbGlicyBhbmQgYXBrcyBpbiB0aGUgbWVkaWFfYXBpIG5lZWRlZCBmb3IgdGVzdHMsIGFuZCBwbGFjZSB0ZXN0IHRhcmdldCBhdCB0aGUgbGFzdC4KLSAgbG9jYWwgVEVTVF9QQUNLQUdFX0RJUj0oImZyYW1ld29ya3MvYXYvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3Rlc3QiKQotICBsb2NhbCBURVNUX1BBQ0tBR0U9KCJhbmRyb2lkLm1lZGlhLmN0cyIpCi0gIGxvY2FsIEJVSUxEX1RBUkdFVFM9KCJNZWRpYUNvbXBvbmVudHMiICJDdHNNZWRpYVRlc3RDYXNlcyIpCi0gICMgRG9uJ3QgaW5jbHVkZSBNZWRpYUNvbXBvbmVudHMgLS0gaWYgd2Ugc2ltcGx5IGluc3RhbGwgaXQsIHN5c3RlbSBzZXJ2ZXIKLSAgIyB3b3VsZG4ndCB1c2UgdGhlIGluc3RhbGxlZCBvbmUuCi0gIGxvY2FsIElOU1RBTExfVEFSR0VUUz0oIkN0c01lZGlhVGVzdENhc2VzIikKLSAgbG9jYWwgVEVTVF9SVU5ORVI9ImFuZHJvaWQuc3VwcG9ydC50ZXN0LnJ1bm5lci5BbmRyb2lkSlVuaXRSdW5uZXIiCi0gIGxvY2FsIERFUEVOREVOQ0lFUz0oIm1vY2tpdG8tdGFyZ2V0LW1pbnVzLWp1bml0NCIgImFuZHJvaWQtc3VwcG9ydC10ZXN0IiAiY29tcGF0aWJpbGl0eS1kZXZpY2UtdXRpbCIpCi0gIGxvY2FsIERFRkFVTFRfVEVTVF9UQVJHRVQ9IiIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9ImFuZHJvaWQubWVkaWEuY3RzLk1lZGlhQnJvd3NlcjJUZXN0IgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhQ29udHJvbGxlcjJUZXN0IgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhTWV0YWRhdGEyVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYVNlc3Npb24yVGVzdCIKLSAgREVGQVVMVF9URVNUX1RBUkdFVCs9IixhbmRyb2lkLm1lZGlhLmN0cy5NZWRpYVNlc3Npb24yX1Blcm1pc3Npb25UZXN0IgotICBERUZBVUxUX1RFU1RfVEFSR0VUKz0iLGFuZHJvaWQubWVkaWEuY3RzLk1lZGlhU2Vzc2lvbk1hbmFnZXJfTWVkaWFTZXNzaW9uMlRlc3QiCi0gIERFRkFVTFRfVEVTVF9UQVJHRVQrPSIsYW5kcm9pZC5tZWRpYS5jdHMuU2Vzc2lvblRva2VuMlRlc3QiCi0gIGlmIFtbIC16ICIke0FORFJPSURfQlVJTERfVE9QfSIgXV07IHRoZW4KLSAgICBlY2hvICJOZWVkcyB0byBsdW5jaCBhIHRhcmdldCBmaXJzdCIKLSAgICByZXR1cm4KLSAgZmkKLQotICBsb2NhbCBvbGRfcGF0aD0ke09MRFBXRH0KLSAgd2hpbGUgdHJ1ZTsgZG8KLSAgICBsb2NhbCBPUFRJT05fU0tJUD0iZmFsc2UiCi0gICAgbG9jYWwgT1BUSU9OX01JTj0iZmFsc2UiCi0gICAgbG9jYWwgT1BUSU9OX1RFU1Q9ImZhbHNlIgotICAgIGxvY2FsIE9QVElPTl9SRVBFQVRfQ09VTlQ9IjEiCi0gICAgbG9jYWwgT1BUSU9OX0lHTk9SRT0iZmFsc2UiCi0gICAgbG9jYWwgT1BUSU9OX1RFU1RfVEFSR0VUPSIke0RFRkFVTFRfVEVTVF9UQVJHRVR9IgotICAgIGxvY2FsIGFkYmhvc3RfbG9jYWwKLSAgICB3aGlsZSAoKCAiJCMiICkpOyBkbwotICAgICAgY2FzZSAiJHsxfSIgaW4KLSAgICAgICAgLWh8LS1oZWxwKQotICAgICAgICAgIF9ydW50ZXN0X2N0c19tZWRpYWNvbXBvbmVudF91c2FnZQotICAgICAgICAgIHJldHVybgotICAgICAgICAgIDs7Ci0gICAgICAgIC0tc2tpcCkKLSAgICAgICAgICBPUFRJT05fU0tJUD0idHJ1ZSIKLSAgICAgICAgICA7OwotICAgICAgICAtLW1pbikKLSAgICAgICAgICBPUFRJT05fTUlOPSJ0cnVlIgotICAgICAgICAgIDs7Ci0gICAgICAgIC0tdGVzdCkKLSAgICAgICAgICBPUFRJT05fVEVTVD0idHJ1ZSIKLSAgICAgICAgICA7OwotICAgICAgICAtcykKLSAgICAgICAgICBzaGlmdAotICAgICAgICAgIGFkYmhvc3RfbG9jYWw9JHsxfQotICAgICAgICAgIDs7Ci0gICAgICAgIC1yKQotICAgICAgICAgIHNoaWZ0Ci0gICAgICAgICAgT1BUSU9OX1JFUEVBVF9DT1VOVD0iJHsxfSIKLSAgICAgICAgICA7OwotICAgICAgICAtLWlnbm9yZSkKLSAgICAgICAgICBPUFRJT05fSUdOT1JFPSJ0cnVlIgotICAgICAgICAgIDs7Ci0gICAgICAgIC10KQotICAgICAgICAgIHNoaWZ0Ci0gICAgICAgICAgT1BUSU9OX1RFU1RfVEFSR0VUPSIkezF9IgotICAgICAgZXNhYwotICAgICAgc2hpZnQKLSAgICBkb25lCi0KLSAgICAjIEJ1aWxkIGFkYiBjb21tYW5kLgotICAgIGxvY2FsIGFkYgotICAgIGlmIFtbIC16ICIke2FkYmhvc3RfbG9jYWx9IiBdXTsgdGhlbgotICAgICAgYWRiaG9zdF9sb2NhbD0ke0FEQkhPU1R9Ci0gICAgZmkKLSAgICBpZiBbWyAteiAiJHthZGJob3N0X2xvY2FsfSIgXV07IHRoZW4KLSAgICAgIGxvY2FsIGRldmljZV9jb3VudD0kKGFkYiBkZXZpY2VzIHwgc2VkICcvXltbOnNwYWNlOl1dKiQvZCcgfCB3YyAtbCkKLSAgICAgIGlmIFtbICIke2RldmljZV9jb3VudH0iICE9ICIyIiBdXTsgdGhlbgotICAgICAgICBlY2hvICJUb28gbWFueSBkZXZpY2VzLiBTcGVjaWZ5IGEgZGV2aWNlLiIgJiYgYnJlYWsKLSAgICAgIGZpCi0gICAgICBhZGI9ImFkYiIKLSAgICBlbHNlCi0gICAgICBhZGI9ImFkYiAtcyAke2FkYmhvc3RfbG9jYWx9IgotICAgIGZpCi0KLSAgICBsb2NhbCB0YXJnZXRfZGlyPSIke0FORFJPSURfQlVJTERfVE9QfS8ke1RFU1RfUEFDS0FHRV9ESVJ9IgotICAgICNsb2NhbCBURVNUX1BBQ0tBR0U9JChzZWQgLW4gJ3MvXi4qXGJwYWNrYWdlXGI9IlwoW2EtejAtOVwuXSpcKSIuKiQvXDEvcCcgJHt0YXJnZXRfZGlyfS9BbmRyb2lkTWFuaWZlc3QueG1sKQotCi0gICAgaWYgW1sgIiR7T1BUSU9OX1NLSVB9IiAhPSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICMgQnVpbGQgZGVwZW5kZW5jaWVzIGlmIG5lZWRlZC4KLSAgICAgIGxvY2FsIGRlcGVuZGVuY3kKLSAgICAgIGxvY2FsIGJ1aWxkX2RlcGVuZGVuY3k9IiIKLSAgICAgIGZvciBkZXBlbmRlbmN5IGluICR7REVQRU5ERU5DSUVTW0BdfTsgZG8KLSAgICAgICAgaWYgW1sgIiR7ZGVwZW5kZW5jeX0iID09ICJvdXQvIiogXV07IHRoZW4KLSAgICAgICAgICBpZiBbWyAhIC1mICR7QU5EUk9JRF9CVUlMRF9UT1B9LyR7ZGVwZW5kZW5jeX0gXV07IHRoZW4KLSAgICAgICAgICAgIGJ1aWxkX2RlcGVuZGVuY3k9InRydWUiCi0gICAgICAgICAgICBicmVhawotICAgICAgICAgIGZpCi0gICAgICAgIGVsc2UKLSAgICAgICAgICBpZiBbWyAiJChmaW5kICR7T1VUfSAtbmFtZSAke2RlcGVuZGVuY3l9X2ludGVybWVkaWF0ZXMgfCB3YyAtbCkiID09ICIwIiBdXTsgdGhlbgotICAgICAgICAgICAgYnVpbGRfZGVwZW5kZW5jeT0idHJ1ZSIKLSAgICAgICAgICAgIGJyZWFrCi0gICAgICAgICAgZmkKLSAgICAgICAgZmkKLSAgICAgIGRvbmUKLSAgICAgIGlmIFtbICIke2J1aWxkX2RlcGVuZGVuY3l9IiA9PSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICAgZWNobyAiQnVpbGRpbmcgZGVwZW5kZW5jaWVzLiBXaWxsIG9ubHkgcHJpbnQgc3RkZXJyLiIKLSAgICAgICAgbSAke0RFUEVOREVOQ0lFU1tAXX0gLWogPiAvZGV2L251bGwKLSAgICAgIGZpCi0KLSAgICAgICMgQnVpbGQgdGVzdCBhcGsgYW5kIHJlcXVpcmVkIGFway4KLSAgICAgIGxvY2FsIGJ1aWxkX3RhcmdldHMKLSAgICAgIGlmIFtbICIke09QVElPTl9URVNUfSIgPT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAgIGJ1aWxkX3RhcmdldHM9IiR7SU5TVEFMTF9UQVJHRVRTW0BdfSIKLSAgICAgIGVsaWYgW1sgIiR7T1BUSU9OX01JTn0iID09ICJ0cnVlIiBdXTsgdGhlbgotICAgICAgICBidWlsZF90YXJnZXRzPSIke0JVSUxEX1RBUkdFVFNbQF19IgotICAgICAgZWxzZQotICAgICAgICBidWlsZF90YXJnZXRzPSIke0JVSUxEX1RBUkdFVFNbQF19IGRyb2lkIgotICAgICAgZmkKLSAgICAgIG0gJHtidWlsZF90YXJnZXRzfSAtaiB8fCBicmVhawotCi0gICAgICBpZiBbWyAiJHtPUFRJT05fVEVTVH0iICE9ICJ0cnVlIiBdXTsgdGhlbgotICAgICAgICAjIEZsYXNoIG9ubHkgd2hlbiBuZWVkZWQKLSAgICAgICAgbG9jYWwgZGV2aWNlX2J1aWxkX3R5cGU9IiQoJHthZGJ9IHNoZWxsIGdldHByb3Agcm8uYnVpbGQudHlwZSkiCi0gICAgICAgIGlmIFtbICIke2RldmljZV9idWlsZF90eXBlfSIgPT0gInVzZXIiIF1dOyB0aGVuCi0gICAgICAgICAgIyBVc2VyIGJ1aWxkLiBDYW5ub3QgYWRiIHN5bmMKLSAgICAgICAgICAke2FkYn0gcmVib290IGJvb3Rsb2FkZXIKLSAgICAgICAgICBmYXN0Ym9vdCBmbGFzaGFsbAotICAgICAgICBlbHNlCi0gICAgICAgICAgJHthZGJ9IHJvb3QKLSAgICAgICAgICBsb2NhbCBkZXZpY2VfdmVyaXR5X21vZGU9IiQoJHthZGJ9IHNoZWxsIGdldHByb3Agcm8uYm9vdC52ZXJpdHltb2RlKSIKLSAgICAgICAgICBpZiBbWyAiJHtkZXZpY2VfdmVyaXR5X21vZGV9IiAhPSAiZGlzYWJsZWQiIF1dOyB0aGVuCi0gICAgICAgICAgICAke2FkYn0gZGlzYWJsZS12ZXJpdHkKLSAgICAgICAgICAgICR7YWRifSByZWJvb3QKLSAgICAgICAgICAgICR7YWRifSB3YWl0LWZvci1kZXZpY2UgfHwgYnJlYWsKLSAgICAgICAgICAgICR7YWRifSByb290Ci0gICAgICAgICAgZmkKLSAgICAgICAgICAke2FkYn0gcmVtb3VudAotICAgICAgICAgICR7YWRifSBzaGVsbCBzdG9wCi0gICAgICAgICAgJHthZGJ9IHNoZWxsIHNldHByb3AgbG9nLnRhZy5NZWRpYVNlc3Npb25TZXJ2aWNlIERFQlVHCi0gICAgICAgICAgJHthZGJ9IHN5bmMKLSAgICAgICAgICAke2FkYn0gc2hlbGwgc3RhcnQKLSAgICAgICAgZmkKLSAgICAgICAgJHthZGJ9IHdhaXQtZm9yLWRldmljZSB8fCBicmVhawotICAgICAgICAjIEVuc3VyZSBwYWNrYWdlIG1hbmFnZXIgaXMgbG9hZGVkLgotICAgICAgICAjIFRPRE8oamFld2FuKTogRmluZCBiZXR0ZXIgd2F5IHRvIHdhaXQKLSAgICAgICAgc2xlZXAgMTUKLSAgICAgIGZpCi0KLSAgICAgICMgSW5zdGFsbCBhcGtzCi0gICAgICBsb2NhbCBpbnN0YWxsX2ZhaWxlZD0iZmFsc2UiCi0gICAgICBmb3IgdGFyZ2V0IGluICR7SU5TVEFMTF9UQVJHRVRTW0BdfTsgZG8KLSAgICAgICAgbG9jYWwgYXBrX3BhdGg9JChmaW5kICR7T1VUfS9zeXN0ZW0gJHtPVVR9L2RhdGEgLW5hbWUgJHt0YXJnZXR9LmFwaykKLSAgICAgICAgbG9jYWwgYXBrX251bT0kKGZpbmQgJHtPVVR9L3N5c3RlbSAke09VVH0vZGF0YSAtbmFtZSAke3RhcmdldH0uYXBrIHwgd2MgLWwpCi0gICAgICAgIGlmIFtbICIke2Fwa19udW19IiAhPSAiMSIgXV07IHRoZW4KLSAgICAgICAgICBlY2hvICJDYW5ub3QgbG9jYXRlIGEgJHt0YXJnZXR9LmFway4gRm91bmQgJHthcGtfbnVtfSBhcGtzIiAmJiBicmVhawotICAgICAgICBmaQotICAgICAgICBlY2hvICJJbnN0YWxsaW5nICR7dGFyZ2V0fS5hcGsuIHBhdGg9JHthcGtfcGF0aH0iCi0gICAgICAgICR7YWRifSBpbnN0YWxsIC1yICR7YXBrX3BhdGh9Ci0gICAgICAgIGlmIFtbICIkez99IiAhPSAiMCIgXV07IHRoZW4KLSAgICAgICAgICBpbnN0YWxsX2ZhaWxlZD0idHJ1ZSIKLSAgICAgICAgICBicmVhawotICAgICAgICBmaQotICAgICAgZG9uZQotICAgICAgaWYgW1sgIiR7aW5zdGFsbF9mYWlsZWR9IiA9PSAidHJ1ZSIgXV07IHRoZW4KLSAgICAgICAgZWNobyAiRmFpbGVkIHRvIGluc3RhbGwuIFRlc3Qgd291bGRuJ3QgcnVuLiIKLSAgICAgICAgYnJlYWsKLSAgICAgIGZpCi0gICAgZmkKLQotICAgIGxvY2FsIHRlc3RfdGFyZ2V0PSIiCi0gICAgaWYgW1sgLW4gIiR7T1BUSU9OX1RFU1RfVEFSR0VUfSIgXV07IHRoZW4KLSAgICAgIHRlc3RfdGFyZ2V0PSItZSBjbGFzcyAke09QVElPTl9URVNUX1RBUkdFVH0iCi0gICAgZmkKLQotICAgIGxvY2FsIGkKLSAgICBsb2NhbCB0bXBmaWxlPSQodGVtcGZpbGUpCi0gICAgZm9yICgoaT0xOyBpIDw9ICR7T1BUSU9OX1JFUEVBVF9DT1VOVH07IGkrKykpOyBkbwotICAgICAgZWNobyAiUnVuIHRlc3QgJHtpfS8ke09QVElPTl9SRVBFQVRfQ09VTlR9IgotICAgICAgJHthZGJ9IHNoZWxsIGFtIGluc3RydW1lbnQgJHt0ZXN0X3RhcmdldH0gLXcgJHtURVNUX1BBQ0tBR0V9LyR7VEVTVF9SVU5ORVJ9ID4mICR7dG1wZmlsZX0KLSAgICAgIGNhdCAke3RtcGZpbGV9Ci0gICAgICBpZiBbWyAiJHtPUFRJT05fSUdOT1JFfSIgIT0gInRydWUiIF1dOyB0aGVuCi0gICAgICAgIGlmIFtbIC1uICIkKGdyZXAgJHt0bXBmaWxlfSAtZSAnRkFJTFVSRVx8Y3Jhc2hlZCcpIiBdXTsgdGhlbgotICAgICAgICAgICMgYW0gaW5zdHJ1bWVudCBkb2Vzbid0IHJldHVybiBlcnJvciBjb2RlIHNvIG5lZWQgdG8gZ3JlcCByZXN1bHQgbWVzc2FnZSBpbnN0ZWFkCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgZmkKLSAgICAgIGZpCi0gICAgZG9uZQotICAgIHJtICR7dG1wZmlsZX0KLSAgICBicmVhawotICBkb25lCi19Ci0KLWVjaG8gIkZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGFkZGVkIHRvIHlvdXIgZW52aXJvbm1lbnQ6IgotX3J1bnRlc3RfY3RzX21lZGlhY29tcG9uZW50X3VzYWdlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYUNvbnRyb2xsZXIyLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYUNvbnRyb2xsZXIyLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0ODhiNzAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFDb250cm9sbGVyMi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLklNZWRpYVNlc3Npb24yOwotCi0vKioKLSAqIEludGVyZmFjZSBmcm9tIE1lZGlhU2Vzc2lvbjIgdG8gTWVkaWFDb250cm9sbGVyMi4KLSAqIDxwPgotICogS2VlcCB0aGlzIGludGVyZmFjZSBvbmV3YXkuIE90aGVyd2lzZSBhIG1hbGljaW91cyBhcHAgbWF5IGltcGxlbWVudCBmYWtlIHZlcnNpb24gb2YgdGhpcywKLSAqIGFuZCBob2xkcyBjYWxscyBmcm9tIHNlc3Npb24gdG8gbWFrZSBzZXNzaW9uIG93bmVyKHMpIGZyb3plbi4KLSAqLwotLy8gVE9ETyhqYWV3YW4pOiAoUG9zdCBQKSBIYW5kbGUgd2hlbiB0aGUgcGxheWxpc3QgYmVjb21lcyB0b28gaHVnZS4KLS8vICAgICAgICAgICAgICAgTm90ZSB0aGF0IFBhcmNlbGxlZFNsaWNlTGlzdCBpc24ndCBhIGdvb2QgaWRlYSBmb3IgdGhlIHB1cnBvc2UuIChzZWU6IGIvMzc0OTM2NzcpCi1vbmV3YXkgaW50ZXJmYWNlIElNZWRpYUNvbnRyb2xsZXIyIHsKLSAgICB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSk7Ci0gICAgdm9pZCBvblBvc2l0aW9uQ2hhbmdlZChsb25nIGV2ZW50VGltZU1zLCBsb25nIHBvc2l0aW9uTXMpOwotICAgIHZvaWQgb25QbGF5YmFja1NwZWVkQ2hhbmdlZChmbG9hdCBzcGVlZCk7Ci0gICAgdm9pZCBvbkJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkKGxvbmcgYnVmZmVyZWRQb3NpdGlvbk1zKTsKLSAgICB2b2lkIG9uUGxheWxpc3RDaGFuZ2VkKGluIExpc3Q8QnVuZGxlPiBwbGF5bGlzdCwgaW4gQnVuZGxlIG1ldGFkYXRhKTsKLSAgICB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoaW4gQnVuZGxlIG1ldGFkYXRhKTsKLSAgICB2b2lkIG9uUGxheWJhY2tJbmZvQ2hhbmdlZChpbiBCdW5kbGUgcGxheWJhY2tJbmZvKTsKLSAgICB2b2lkIG9uUmVwZWF0TW9kZUNoYW5nZWQoaW50IHJlcGVhdE1vZGUpOwotICAgIHZvaWQgb25TaHVmZmxlTW9kZUNoYW5nZWQoaW50IHNodWZmbGVNb2RlKTsKLSAgICB2b2lkIG9uRXJyb3IoaW50IGVycm9yQ29kZSwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGVkKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIsIGluIEJ1bmRsZSBjb21tYW5kR3JvdXAsCi0gICAgICAgICAgICBpbnQgcGxheWVyU3RhdGUsIGxvbmcgcG9zaXRpb25FdmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zLCBmbG9hdCBwbGF5YmFja1NwZWVkLAotICAgICAgICAgICAgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMsIGluIEJ1bmRsZSBwbGF5YmFja0luZm8sIGludCByZXBlYXRNb2RlLCBpbnQgc2h1ZmZsZU1vZGUsCi0gICAgICAgICAgICBpbiBMaXN0PEJ1bmRsZT4gcGxheWxpc3QsIGluIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5KTsKLSAgICB2b2lkIG9uRGlzY29ubmVjdGVkKCk7Ci0KLSAgICB2b2lkIG9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChpbiBMaXN0PEJ1bmRsZT4gY29tbWFuZEJ1dHRvbmxpc3QpOwotICAgIHZvaWQgb25BbGxvd2VkQ29tbWFuZHNDaGFuZ2VkKGluIEJ1bmRsZSBjb21tYW5kcyk7Ci0KLSAgICB2b2lkIG9uQ3VzdG9tQ29tbWFuZChpbiBCdW5kbGUgY29tbWFuZCwgaW4gQnVuZGxlIGFyZ3MsIGluIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKTsKLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBCcm93c2VyIHNlcGNpZmljCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIHZvaWQgb25HZXRMaWJyYXJ5Um9vdERvbmUoaW4gQnVuZGxlIHJvb3RIaW50cywgU3RyaW5nIHJvb3RNZWRpYUlkLCBpbiBCdW5kbGUgcm9vdEV4dHJhKTsKLSAgICB2b2lkIG9uR2V0SXRlbURvbmUoU3RyaW5nIG1lZGlhSWQsIGluIEJ1bmRsZSByZXN1bHQpOwotICAgIHZvaWQgb25DaGlsZHJlbkNoYW5nZWQoU3RyaW5nIHJvb3RNZWRpYUlkLCBpbnQgaXRlbUNvdW50LCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIG9uR2V0Q2hpbGRyZW5Eb25lKFN0cmluZyBwYXJlbnRJZCwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgaW4gTGlzdDxCdW5kbGU+IHJlc3VsdCwKLSAgICAgICAgICAgIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgb25TZWFyY2hSZXN1bHRDaGFuZ2VkKFN0cmluZyBxdWVyeSwgaW50IGl0ZW1Db3VudCwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBvbkdldFNlYXJjaFJlc3VsdERvbmUoU3RyaW5nIHF1ZXJ5LCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLCBpbiBMaXN0PEJ1bmRsZT4gcmVzdWx0LAotICAgICAgICAgICAgaW4gQnVuZGxlIGV4dHJhcyk7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYVNlc3Npb24yLmFpZGwgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL0lNZWRpYVNlc3Npb24yLmFpZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2NDQ2N2QuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9JTWVkaWFTZXNzaW9uMi5haWRsCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuUmVzdWx0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuSU1lZGlhQ29udHJvbGxlcjI7Ci0KLS8qKgotICogSW50ZXJmYWNlIGZyb20gTWVkaWFDb250cm9sbGVyMiB0byBNZWRpYVNlc3Npb24yLgotICogPHA+Ci0gKiBLZWVwIHRoaXMgaW50ZXJmYWNlIG9uZXdheS4gT3RoZXJ3aXNlIGEgbWFsaWNpb3VzIGFwcCBtYXkgaW1wbGVtZW50IGZha2UgdmVyc2lvbiBvZiB0aGlzLAotICogYW5kIGhvbGRzIGNhbGxzIGZyb20gc2Vzc2lvbiB0byBtYWtlIHNlc3Npb24gb3duZXIocykgZnJvemVuLgotICovCi0gLy8gVE9ETyhqYWV3YW4pOiAoUG9zdCBQKSBIYW5kbGUgd2hlbiB0aGUgcGxheWxpc3QgYmVjb21lcyB0b28gaHVnZS4KLSAvLyAgICAgICAgICAgICAgIE5vdGUgdGhhdCBQYXJjZWxsZWRTbGljZUxpc3QgaXNuJ3QgYSBnb29kIGlkZWEgZm9yIHRoZSBwdXJwb3NlLiAoc2VlOiBiLzM3NDkzNjc3KQotb25ld2F5IGludGVyZmFjZSBJTWVkaWFTZXNzaW9uMiB7Ci0gICAgLy8gVE9ETyhqYWV3YW4pOiBhZGQgb25Db21tYW5kKCkgdG8gc2VuZCBwcml2YXRlIGNvbW1hbmQKLQotICAgIC8vIFRPRE8oamFld2FuKTogKFBvc3QgUCkgV2UgbWF5IGNvbnNpZGVyIHRvIGFkZCBhbm90aGVyIGJpbmRlciBqdXN0IGZvciB0aGUgY29ubmVjdGlvbgotICAgIC8vICAgICAgICAgICAgICAgbm90IHRvIGV4cG9zZSBvdGhlciBtZXRob2RzIHRvIHRoZSBjb250cm9sbGVyIHdob3NlIGNvbm5lY3Rpb24gd2Fzbid0IGFjY2VwdGVkLgotICAgIC8vICAgICAgICAgICAgICAgQnV0IHRoaXMgd291bGQgYmUgZW5vdWdoIGZvciBub3cgYmVjYXVzZSBpdCdzIHRoZSBzYW1lIGFzIGV4aXN0aW5nCi0gICAgLy8gICAgICAgICAgICAgICBNZWRpYUJyb3dzZXIgYW5kIE1lZGlhQnJvd3NlclNlcnZpY2UuCi0gICAgdm9pZCBjb25uZWN0KElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIGNhbGxpbmdQYWNrYWdlKTsKLSAgICB2b2lkIHJlbGVhc2UoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKTsKLQotICAgIHZvaWQgc2V0Vm9sdW1lVG8oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgdmFsdWUsIGludCBmbGFncyk7Ci0gICAgdm9pZCBhZGp1c3RWb2x1bWUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgZGlyZWN0aW9uLCBpbnQgZmxhZ3MpOwotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIHNlbmQgY29tbWFuZAotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICB2b2lkIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsCi0gICAgICAgICAgICBpbnQgY29tbWFuZENvZGUsIGluIEJ1bmRsZSBhcmdzKTsKLSAgICB2b2lkIHNlbmRDdXN0b21Db21tYW5kKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIGNvbW1hbmQsIGluIEJ1bmRsZSBhcmdzLAotICAgICAgICAgICAgaW4gUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpOwotCi0gICAgdm9pZCBwcmVwYXJlRnJvbVVyaShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGluIFVyaSB1cmksIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgcHJlcGFyZUZyb21TZWFyY2goSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcXVlcnksIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgcHJlcGFyZUZyb21NZWRpYUlkKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIG1lZGlhSWQsIGluIEJ1bmRsZSBleHRyYXMpOwotICAgIHZvaWQgcGxheUZyb21VcmkoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBVcmkgdXJpLCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHBsYXlGcm9tU2VhcmNoKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHBsYXlGcm9tTWVkaWFJZChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHNldFJhdGluZyhJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBtZWRpYUlkLCBpbiBCdW5kbGUgcmF0aW5nKTsKLQotICAgIHZvaWQgc2V0UGxheWxpc3QoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBMaXN0PEJ1bmRsZT4gcGxheWxpc3QsIGluIEJ1bmRsZSBtZXRhZGF0YSk7Ci0gICAgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIG1ldGFkYXRhKTsKLSAgICB2b2lkIGFkZFBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBpbmRleCwgaW4gQnVuZGxlIG1lZGlhSXRlbSk7Ci0gICAgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbiBCdW5kbGUgbWVkaWFJdGVtKTsKLSAgICB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgaW5kZXgsIGluIEJ1bmRsZSBtZWRpYUl0ZW0pOwotICAgIHZvaWQgc2tpcFRvUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIG1lZGlhSXRlbSk7Ci0gICAgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKTsKLSAgICB2b2lkIHNraXBUb05leHRJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcik7Ci0gICAgdm9pZCBzZXRSZXBlYXRNb2RlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW50IHJlcGVhdE1vZGUpOwotICAgIHZvaWQgc2V0U2h1ZmZsZU1vZGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgc2h1ZmZsZU1vZGUpOwotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGxpYnJhcnkgc2VydmljZSBzcGVjaWZpYwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICB2b2lkIGdldExpYnJhcnlSb290KElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgaW4gQnVuZGxlIHJvb3RIaW50cyk7Ci0gICAgdm9pZCBnZXRJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIG1lZGlhSWQpOwotICAgIHZvaWQgZ2V0Q2hpbGRyZW4oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCi0gICAgICAgICAgICBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHNlYXJjaChJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBxdWVyeSwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCBnZXRTZWFyY2hSZXN1bHQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCi0gICAgICAgICAgICBpbiBCdW5kbGUgZXh0cmFzKTsKLSAgICB2b2lkIHN1YnNjcmliZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBwYXJlbnRJZCwgaW4gQnVuZGxlIGV4dHJhcyk7Ci0gICAgdm9pZCB1bnN1YnNjcmliZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIFN0cmluZyBwYXJlbnRJZCk7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQnJvd3NlcjJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQnJvd3NlcjJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5MDkwOTkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUJyb3dzZXIySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQnJvd3NlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIyLkJyb3dzZXJDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUJyb3dzZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUJyb3dzZXIySW1wbCBleHRlbmRzIE1lZGlhQ29udHJvbGxlcjJJbXBsIGltcGxlbWVudHMgTWVkaWFCcm93c2VyMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFCcm93c2VyMiI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBjaGFuZ2UuCi0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhQnJvd3NlcjIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFCcm93c2VyMi5Ccm93c2VyQ2FsbGJhY2sgbUNhbGxiYWNrOwotCi0gICAgcHVibGljIE1lZGlhQnJvd3NlcjJJbXBsKENvbnRleHQgY29udGV4dCwgTWVkaWFCcm93c2VyMiBpbnN0YW5jZSwgU2Vzc2lvblRva2VuMiB0b2tlbiwKLSAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yLCBCcm93c2VyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgaW5zdGFuY2UsIHRva2VuLCBleGVjdXRvciwgY2FsbGJhY2spOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlIE1lZGlhQnJvd3NlcjIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiAoTWVkaWFCcm93c2VyMikgc3VwZXIuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRMaWJyYXJ5Um9vdF9pbXBsKEJ1bmRsZSByb290SGludHMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLmdldExpYnJhcnlSb290KGdldENvbnRyb2xsZXJTdHViKCksIHJvb3RIaW50cyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdWJzY3JpYmVfaW1wbChTdHJpbmcgcGFyZW50SWQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc3Vic2NyaWJlKGdldENvbnRyb2xsZXJTdHViKCksIHBhcmVudElkLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdW5zdWJzY3JpYmVfaW1wbChTdHJpbmcgcGFyZW50SWQpIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVyKCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIudW5zdWJzY3JpYmUoZ2V0Q29udHJvbGxlclN0dWIoKSwgcGFyZW50SWQpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0SXRlbV9pbXBsKFN0cmluZyBtZWRpYUlkKSB7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5nZXRJdGVtKGdldENvbnRyb2xsZXJTdHViKCksIG1lZGlhSWQpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0Q2hpbGRyZW5faW1wbChTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhcmVudElkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2VTaXplIDwgMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTmVpdGhlciBwYWdlIG5vciBwYWdlU2l6ZSBzaG91bGQgYmUgbGVzcyB0aGFuIDEiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5nZXRDaGlsZHJlbihnZXRDb250cm9sbGVyU3R1YigpLCBwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlIGRpc2Nvbm5lY3QuCi0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZWFyY2hfaW1wbChTdHJpbmcgcXVlcnksIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicXVlcnkgc2hvdWxkbid0IGJlIGVtcHR5Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcigpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNlYXJjaChnZXRDb250cm9sbGVyU3R1YigpLCBxdWVyeSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgZGlzY29ubmVjdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldFNlYXJjaFJlc3VsdF9pbXBsKFN0cmluZyBxdWVyeSwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocGFnZSA8IDEgfHwgcGFnZVNpemUgPCAxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJOZWl0aGVyIHBhZ2Ugbm9yIHBhZ2VTaXplIHNob3VsZCBiZSBsZXNzIHRoYW4gMSIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5nZXRTZWFyY2hSZXN1bHQoZ2V0Q29udHJvbGxlclN0dWIoKSwgcXVlcnksIHBhZ2UsIHBhZ2VTaXplLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBkaXNjb25uZWN0LgotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25HZXRMaWJyYXJ5Um9vdERvbmUoCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgcm9vdEhpbnRzLCBmaW5hbCBTdHJpbmcgcm9vdE1lZGlhSWQsIGZpbmFsIEJ1bmRsZSByb290RXh0cmEpIHsKLSAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uR2V0TGlicmFyeVJvb3REb25lKGdldEluc3RhbmNlKCksIHJvb3RIaW50cywgcm9vdE1lZGlhSWQsIHJvb3RFeHRyYSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uR2V0SXRlbURvbmUoU3RyaW5nIG1lZGlhSWQsIE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25HZXRJdGVtRG9uZShnZXRJbnN0YW5jZSgpLCBtZWRpYUlkLCBpdGVtKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25HZXRDaGlsZHJlbkRvbmUoU3RyaW5nIHBhcmVudElkLCBpbnQgcGFnZSwgaW50IHBhZ2VTaXplLCBMaXN0PE1lZGlhSXRlbTI+IHJlc3VsdCwKLSAgICAgICAgICAgIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uR2V0Q2hpbGRyZW5Eb25lKGdldEluc3RhbmNlKCksIHBhcmVudElkLCBwYWdlLCBwYWdlU2l6ZSwgcmVzdWx0LCBleHRyYXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBvblNlYXJjaFJlc3VsdENoYW5nZWQoU3RyaW5nIHF1ZXJ5LCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblNlYXJjaFJlc3VsdENoYW5nZWQoZ2V0SW5zdGFuY2UoKSwgcXVlcnksIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgb25HZXRTZWFyY2hSZXN1bHREb25lKFN0cmluZyBxdWVyeSwgaW50IHBhZ2UsIGludCBwYWdlU2l6ZSwgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQsCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkdldFNlYXJjaFJlc3VsdERvbmUoZ2V0SW5zdGFuY2UoKSwgcXVlcnksIHBhZ2UsIHBhZ2VTaXplLCByZXN1bHQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9uQ2hpbGRyZW5DaGFuZ2VkKGZpbmFsIFN0cmluZyBwYXJlbnRJZCwgaW50IGl0ZW1Db3VudCwgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBnZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25DaGlsZHJlbkNoYW5nZWQoZ2V0SW5zdGFuY2UoKSwgcGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUNvbnRyb2xsZXIySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUNvbnRyb2xsZXIySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDkzNjVhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VUX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0FERF9JVEVNOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfUkVNT1ZFX0lURU07Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9SRVBMQUNFX0lURU07Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVDsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9MSVNUX01FVEFEQVRBOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1JFUEVBVF9NT0RFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX1NIVUZGTEVfTU9ERTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX01FRElBX0lEOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fU0VBUkNIOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fVVJJOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fTUVESUFfSUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9TRUFSQ0g7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9VUkk7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LlNlcnZpY2VDb25uZWN0aW9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjIuQ29udHJvbGxlckNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQuUmVwZWF0TW9kZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWxpc3RBZ2VudC5TaHVmZmxlTW9kZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29tbWFuZEJ1dHRvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kR3JvdXAyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUNvbnRyb2xsZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlVzZXJIYW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUNvbnRyb2xsZXIySW1wbCBpbXBsZW1lbnRzIE1lZGlhQ29udHJvbGxlcjJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYUNvbnRyb2xsZXIyIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBDaGFuZ2UKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFDb250cm9sbGVyMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUNvbnRyb2xsZXIyU3R1YiBtQ29udHJvbGxlclN0dWI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uVG9rZW4yIG1Ub2tlbjsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRyb2xsZXJDYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgcHJpdmF0ZSBmaW5hbCBFeGVjdXRvciBtQ2FsbGJhY2tFeGVjdXRvcjsKLSAgICBwcml2YXRlIGZpbmFsIElCaW5kZXIuRGVhdGhSZWNpcGllbnQgbURlYXRoUmVjaXBpZW50OwotCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgU2Vzc2lvblNlcnZpY2VDb25uZWN0aW9uIG1TZXJ2aWNlQ29ubmVjdGlvbjsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc1JlbGVhc2VkOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIExpc3Q8TWVkaWFJdGVtMj4gbVBsYXlsaXN0OwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGEyIG1QbGF5bGlzdE1ldGFkYXRhOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIEBSZXBlYXRNb2RlIGludCBtUmVwZWF0TW9kZTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBAU2h1ZmZsZU1vZGUgaW50IG1TaHVmZmxlTW9kZTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBpbnQgbVBsYXllclN0YXRlOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGxvbmcgbVBvc2l0aW9uRXZlbnRUaW1lTXM7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgbG9uZyBtUG9zaXRpb25NczsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmbG9hdCBtUGxheWJhY2tTcGVlZDsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBsb25nIG1CdWZmZXJlZFBvc2l0aW9uTXM7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgUGxheWJhY2tJbmZvIG1QbGF5YmFja0luZm87Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgUGVuZGluZ0ludGVudCBtU2Vzc2lvbkFjdGl2aXR5OwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIFNlc3Npb25Db21tYW5kR3JvdXAyIG1BbGxvd2VkQ29tbWFuZHM7Ci0KLSAgICAvLyBBc3NpZ25tZW50IHNob3VsZCBiZSB1c2VkIHdpdGggdGhlIGxvY2sgaG9sZCwgYnV0IHNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIHRvIHByZXZlbnQKLSAgICAvLyBwb3RlbnRpYWwgZGVhZGxvY2suCi0gICAgLy8gUG9zdGZpeCAtQmluZGVyIGlzIGFkZGVkIHRvIGV4cGxpY2l0bHkgc2hvdyB0aGF0IGl0J3MgcG90ZW50aWFsbHkgcmVtb3RlIHByb2Nlc3MgY2FsbC4KLSAgICAvLyBUZWNobmljYWxseSAtSW50ZXJmYWNlIGlzIG1vcmUgY29ycmVjdCwgYnV0IGl0IG1heSBtaXNyZWFkIHRoYXQgaXQncyBpbnRlcmZhY2UgKHZzIGNsYXNzKQotICAgIC8vIHNvIGxldCdzIGtlZXAgdGhpcyBwb3N0Zml4IHVudGlsIHdlIGZpbmQgYmV0dGVyIHBvc3RmaXguCi0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgdm9sYXRpbGUgSU1lZGlhU2Vzc2lvbjIgbVNlc3Npb25CaW5kZXI7Ci0KLSAgICAvLyBUT0RPKGphZXdhbik6IFJlcXVpcmUgc2Vzc2lvbiBhY3RpdmVuZXNzIGNoYW5nZWQgbGlzdGVuZXIsIGJlY2F1c2UgY29udHJvbGxlciBjYW4gYmUKLSAgICAvLyAgICAgICAgICAgICAgIGF2YWlsYWJsZSB3aGVuIHRoZSBzZXNzaW9uJ3MgcGxheWVyIGlzIG51bGwuCi0gICAgcHVibGljIE1lZGlhQ29udHJvbGxlcjJJbXBsKENvbnRleHQgY29udGV4dCwgTWVkaWFDb250cm9sbGVyMiBpbnN0YW5jZSwgU2Vzc2lvblRva2VuMiB0b2tlbiwKLSAgICAgICAgICAgIEV4ZWN1dG9yIGV4ZWN1dG9yLCBDb250cm9sbGVyQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbnRleHQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAodG9rZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidG9rZW4gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXhlY3V0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXhlY3V0b3Igc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgIG1Db250cm9sbGVyU3R1YiA9IG5ldyBNZWRpYUNvbnRyb2xsZXIyU3R1Yih0aGlzKTsKLSAgICAgICAgbVRva2VuID0gdG9rZW47Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvciA9IGV4ZWN1dG9yOwotICAgICAgICBtRGVhdGhSZWNpcGllbnQgPSAoKSAtPiB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UuY2xvc2UoKTsKLSAgICAgICAgfTsKLQotICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgaW5pdGlhbGl6ZSgpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBNb3JlIHNhbml0eSBjaGVja3MuCi0gICAgICAgIGlmIChtVG9rZW4uZ2V0VHlwZSgpID09IFNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OKSB7Ci0gICAgICAgICAgICAvLyBTZXNzaW9uCi0gICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICAgICAgY29ubmVjdFRvU2Vzc2lvbihTZXNzaW9uVG9rZW4ySW1wbC5mcm9tKG1Ub2tlbikuZ2V0U2Vzc2lvbkJpbmRlcigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFNlc3Npb24gc2VydmljZQotICAgICAgICAgICAgaWYgKFByb2Nlc3MubXlVaWQoKSA9PSBQcm9jZXNzLlNZU1RFTV9VSUQpIHsKLSAgICAgICAgICAgICAgICAvLyBJdCdzIHN5c3RlbSBzZXJ2ZXIgKE1lZGlhU2Vzc2lvblNlcnZpY2UpIHRoYXQgd2FudHMgdG8gbW9uaXRvciBzZXNzaW9uLgotICAgICAgICAgICAgICAgIC8vIERvbid0IGJpbmQgaWYgYWJsZS4uCi0gICAgICAgICAgICAgICAgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gU2Vzc2lvblRva2VuMkltcGwuZnJvbShtVG9rZW4pLmdldFNlc3Npb25CaW5kZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGJpbmRlciBpbiB0aGUgc2Vzc2lvbiB0b2tlbiBpbnN0ZWFkIG9mIGJpbmQgYnkgaXRzIG93bi4KLSAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIHNlcnZlciB3aWxsIGhvbGRzIHRoZSBiaW5kaW5nIHRvIHRoZSBzZXJ2aWNlICpmb3JldmVyKiBhbmQgc2VydmljZQotICAgICAgICAgICAgICAgICAgICAvLyB3aWxsIG5ldmVyIHN0b3AuCi0gICAgICAgICAgICAgICAgICAgIG1TZXJ2aWNlQ29ubmVjdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3RUb1Nlc3Npb24oU2Vzc2lvblRva2VuMkltcGwuZnJvbShtVG9rZW4pLmdldFNlc3Npb25CaW5kZXIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBoYXBwZW4gb25seSB3aGVuIHN5c3RlbSBzZXJ2ZXIgd2FudHMgdG8gZGlzcGF0Y2ggbWVkaWEga2V5IGV2ZW50cyB0bwotICAgICAgICAgICAgICAgICAgICAvLyBhIGRlYWQgc2VydmljZS4KLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU3lzdGVtIHNlcnZlciBiaW5kcyB0byBhIHNlc3Npb24gc2VydmljZS4gU2hvdWxkIHVuYmluZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHVzZS4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBuZXcgU2Vzc2lvblNlcnZpY2VDb25uZWN0aW9uKCk7Ci0gICAgICAgICAgICBjb25uZWN0VG9TZXJ2aWNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY29ubmVjdFRvU2VydmljZSgpIHsKLSAgICAgICAgLy8gU2VydmljZS4gTmVlZHMgdG8gZ2V0IGZyZXNoIGJpbmRlciB3aGVuZXZlciBjb25uZWN0aW9uIGlzIG5lZWRlZC4KLSAgICAgICAgU2Vzc2lvblRva2VuMkltcGwgaW1wbCA9IFNlc3Npb25Ub2tlbjJJbXBsLmZyb20obVRva2VuKTsKLSAgICAgICAgZmluYWwgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UpOwotICAgICAgICBpbnRlbnQuc2V0Q2xhc3NOYW1lKG1Ub2tlbi5nZXRQYWNrYWdlTmFtZSgpLCBpbXBsLmdldFNlcnZpY2VOYW1lKCkpOwotCi0gICAgICAgIC8vIFVzZSBiaW5kU2VydmljZSgpIGluc3RlYWQgb2Ygc3RhcnRGb3JlZ3JvdW5kU2VydmljZSgpIHRvIHN0YXJ0IHNlc3Npb24gc2VydmljZSBmb3IgdGhyZWUKLSAgICAgICAgLy8gcmVhc29ucy4KLSAgICAgICAgLy8gMS4gUHJldmVudCBzZXNzaW9uIHNlcnZpY2Ugb3duZXIncyBzdG9wU2VsZigpIGZyb20gZGVzdHJveWluZyBzZXJ2aWNlLgotICAgICAgICAvLyAgICBXaXRoIHRoZSBzdGFydEZvcmVncm91bmRTZXJ2aWNlKCksIHNlcnZpY2UncyBjYWxsIG9mIHN0b3BTZWxmKCkgd2lsbCB0cmlnZ2VyIGltbWVkaWF0ZQotICAgICAgICAvLyAgICBvbkRlc3Ryb3koKSBjYWxscyBvbiB0aGUgbWFpbiB0aHJlYWQgZXZlbiB3aGVuIG9uQ29ubmVjdCgpIGlzIHJ1bm5pbmcgaW4gYW5vdGhlcgotICAgICAgICAvLyAgICB0aHJlYWQuCi0gICAgICAgIC8vIDIuIE1pbmltaXplIEFQSXMgZm9yIGRldmVsb3BlcnMgdG8gdGFrZSBjYXJlIGFib3V0LgotICAgICAgICAvLyAgICBXaXRoIGJpbmRTZXJ2aWNlKCksIGRldmVsb3BlcnMgb25seSBuZWVkIHRvIHRha2UgY2FyZSBhYm91dCBTZXJ2aWNlLm9uQmluZCgpCi0gICAgICAgIC8vICAgIGJ1dCBTZXJ2aWNlLm9uU3RhcnRDb21tYW5kKCkgc2hvdWxkIGJlIGFsc28gdGFrZW4gY2FyZSBhYm91dCB3aXRoIHRoZQotICAgICAgICAvLyAgICBzdGFydEZvcmVncm91bmRTZXJ2aWNlKCkuCi0gICAgICAgIC8vIDMuIEZ1dHVyZSBzdXBwb3J0IGZvciBVSS1sZXNzIHBsYXliYWNrCi0gICAgICAgIC8vICAgIElmIGEgc2VydmljZSB3YW50cyB0byBrZWVwIHJ1bm5pbmcsIGl0IHNob3VsZCBiZSBlaXRoZXIgZm9yZWdyb3VuZCBzZXJ2aWNlIG9yCi0gICAgICAgIC8vICAgIGJvdW5kZWQgc2VydmljZS4gQnV0IHRoZXJlIGhhZCBiZWVuIHJlcXVlc3QgZm9yIHRoZSBmZWF0dXJlIGZvciBzeXN0ZW0gYXBwcwotICAgICAgICAvLyAgICBhbmQgdXNpbmcgYmluZFNlcnZpY2UoKSB3aWxsIGJlIGJldHRlciBmaXQgd2l0aCBpdC4KLSAgICAgICAgYm9vbGVhbiByZXN1bHQ7Ci0gICAgICAgIGlmIChQcm9jZXNzLm15VWlkKCkgPT0gUHJvY2Vzcy5TWVNURU1fVUlEKSB7Ci0gICAgICAgICAgICAvLyBVc2UgYmluZFNlcnZpY2VBc1VzZXIoKSBmb3IgYmluZGluZyBmcm9tIHN5c3RlbSBzZXJ2aWNlIHRvIGF2b2lkIGZvbGxvd2luZyB3YXJuaW5nLgotICAgICAgICAgICAgLy8gQ29udGV4dEltcGw6IENhbGxpbmcgYSBtZXRob2QgaW4gdGhlIHN5c3RlbSBwcm9jZXNzIHdpdGhvdXQgYSBxdWFsaWZpZWQgdXNlcgotICAgICAgICAgICAgcmVzdWx0ID0gbUNvbnRleHQuYmluZFNlcnZpY2VBc1VzZXIoaW50ZW50LCBtU2VydmljZUNvbm5lY3Rpb24sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSwKLSAgICAgICAgICAgICAgICAgICAgVXNlckhhbmRsZS5nZXRVc2VySGFuZGxlRm9yVWlkKG1Ub2tlbi5nZXRVaWQoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0ID0gbUNvbnRleHQuYmluZFNlcnZpY2UoaW50ZW50LCBtU2VydmljZUNvbm5lY3Rpb24sIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFyZXN1bHQpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgImJpbmQgdG8gIiArIG1Ub2tlbiArICIgZmFpbGVkIik7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgImJpbmQgdG8gIiArIG1Ub2tlbiArICIgc3VjY2VzcyIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNvbm5lY3RUb1Nlc3Npb24oSU1lZGlhU2Vzc2lvbjIgc2Vzc2lvbkJpbmRlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2Vzc2lvbkJpbmRlci5jb25uZWN0KG1Db250cm9sbGVyU3R1YiwgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gY2FsbCBjb25uZWN0aW9uIHJlcXVlc3QuIEZyYW1ld29yayB3aWxsIHJldHJ5IgotICAgICAgICAgICAgICAgICAgICArICIgYXV0b21hdGljYWxseSIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xvc2VfaW1wbCgpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJyZWxlYXNlIGZyb20gIiArIG1Ub2tlbik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobUlzUmVsZWFzZWQpIHsKLSAgICAgICAgICAgICAgICAvLyBQcmV2ZW50IHJlLWVudGVyYW5jZSBmcm9tIHRoZSBDb250cm9sbGVyQ2FsbGJhY2sub25EaXNjb25uZWN0ZWQoKQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Jc1JlbGVhc2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGlmIChtU2VydmljZUNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Db250ZXh0LnVuYmluZFNlcnZpY2UobVNlcnZpY2VDb25uZWN0aW9uKTsKLSAgICAgICAgICAgICAgICBtU2VydmljZUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IG51bGw7Ci0gICAgICAgICAgICBtQ29udHJvbGxlclN0dWIuZGVzdHJveSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuYXNCaW5kZXIoKS51bmxpbmtUb0RlYXRoKG1EZWF0aFJlY2lwaWVudCwgMCk7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnJlbGVhc2UobUNvbnRyb2xsZXJTdHViKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8tb3AuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25EaXNjb25uZWN0ZWQobUluc3RhbmNlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgSU1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbkJpbmRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uQmluZGVyOwotICAgIH0KLQotICAgIE1lZGlhQ29udHJvbGxlcjJTdHViIGdldENvbnRyb2xsZXJTdHViKCkgewotICAgICAgICByZXR1cm4gbUNvbnRyb2xsZXJTdHViOwotICAgIH0KLQotICAgIEV4ZWN1dG9yIGdldENhbGxiYWNrRXhlY3V0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtQ2FsbGJhY2tFeGVjdXRvcjsKLSAgICB9Ci0KLSAgICBDb250ZXh0IGdldENvbnRleHQoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udGV4dDsKLSAgICB9Ci0KLSAgICBNZWRpYUNvbnRyb2xsZXIyIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgIH0KLQotICAgIC8vIFJldHVybnMgc2Vzc2lvbiBiaW5kZXIgaWYgdGhlIGNvbnRyb2xsZXIgY2FuIHNlbmQgdGhlIGNvbW1hbmQuCi0gICAgSU1lZGlhU2Vzc2lvbjIgZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShpbnQgY29tbWFuZENvZGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFtQWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZENvZGUpKSB7Ci0gICAgICAgICAgICAgICAgLy8gQ2Fubm90IHNlbmQgYmVjYXVzZSBpc24ndCBhbGxvd2VkIHRvLgotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgaXNuJ3QgYWxsb3dlZCB0byBjYWxsIGNvbW1hbmQsIGNvbW1hbmRDb2RlPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgY29tbWFuZENvZGUpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogU2hvdWxkIHdlIGRvIHRoaXMgd2l0aCB0aGUgbG9jayBob2xkPwotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBDYW5ub3Qgc2VuZCBiZWNhdXNlIGRpc2Nvbm5lY3RlZC4KLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXMgZGlzY29ubmVjdGVkIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJpbmRlcjsKLSAgICB9Ci0KLSAgICAvLyBSZXR1cm5zIHNlc3Npb24gYmluZGVyIGlmIHRoZSBjb250cm9sbGVyIGNhbiBzZW5kIHRoZSBjb21tYW5kLgotICAgIElNZWRpYVNlc3Npb24yIGdldFNlc3Npb25CaW5kZXJJZkFibGUoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFtQWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgdG8gY2FsbCBjb21tYW5kLCBjb21tYW5kPSIgKyBjb21tYW5kKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFNob3VsZCB3ZSBkbyB0aGlzIHdpdGggdGhlIGxvY2sgaG9sZD8KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gQ2Fubm90IHNlbmQgYmVjYXVzZSBkaXNjb25uZWN0ZWQuCi0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzIGRpc2Nvbm5lY3RlZCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiaW5kZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjIgZ2V0U2Vzc2lvblRva2VuX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtVG9rZW47Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0ZWRfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIHJldHVybiBiaW5kZXIgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5X2ltcGwoKSB7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BMQVkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBhdXNlX2ltcGwoKSB7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BBVVNFKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wX2ltcGwoKSB7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1NUT1ApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb1BsYXlsaXN0SXRlbV9pbXBsKE1lZGlhSXRlbTIgaXRlbSkgewotICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpdGVtIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gbVNlc3Npb25CaW5kZXI7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2tpcFRvUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNraXBUb1ByZXZpb3VzSXRlbShtQ29udHJvbGxlclN0dWIpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbV9pbXBsKCkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5za2lwVG9OZXh0SXRlbShtQ29udHJvbGxlclN0dWIpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKGludCBjb21tYW5kQ29kZSkgewotICAgICAgICBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoY29tbWFuZENvZGUsIG51bGwpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoaW50IGNvbW1hbmRDb2RlLCBCdW5kbGUgYXJncykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBtU2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5zZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQobUNvbnRyb2xsZXJTdHViLCBjb21tYW5kQ29kZSwgYXJncyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBQZW5kaW5nSW50ZW50IGdldFNlc3Npb25BY3Rpdml0eV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25BY3Rpdml0eTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWb2x1bWVUb19pbXBsKGludCB2YWx1ZSwgaW50IGZsYWdzKSB7Ci0gICAgICAgIC8vIFRPRE8oaGRtb29uKTogc2FuaXR5IGNoZWNrCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFVF9WT0xVTUUpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFZvbHVtZVRvKG1Db250cm9sbGVyU3R1YiwgdmFsdWUsIGZsYWdzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRqdXN0Vm9sdW1lX2ltcGwoaW50IGRpcmVjdGlvbiwgaW50IGZsYWdzKSB7Ci0gICAgICAgIC8vIFRPRE8oaGRtb29uKTogc2FuaXR5IGNoZWNrCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFVF9WT0xVTUUpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLmFkanVzdFZvbHVtZShtQ29udHJvbGxlclN0dWIsIGRpcmVjdGlvbiwgZmxhZ3MpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbVVyaV9pbXBsKFVyaSB1cmksIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fVVJJKTsKLSAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ1cmkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnByZXBhcmVGcm9tVXJpKG1Db250cm9sbGVyU3R1YiwgdXJpLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tU2VhcmNoX2ltcGwoU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoCi0gICAgICAgICAgICAgICAgQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX1NFQVJDSCk7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5IHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucHJlcGFyZUZyb21TZWFyY2gobUNvbnRyb2xsZXJTdHViLCBxdWVyeSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlRnJvbU1lZGlhSWRfaW1wbChTdHJpbmcgbWVkaWFJZCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAotICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9NRURJQV9JRCk7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnByZXBhcmVGcm9tTWVkaWFJZChtQ29udHJvbGxlclN0dWIsIG1lZGlhSWQsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheUZyb21VcmlfaW1wbChVcmkgdXJpLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1VSSSk7Ci0gICAgICAgIGlmICh1cmkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigidXJpIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wbGF5RnJvbVVyaShtQ29udHJvbGxlclN0dWIsIHVyaSwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5RnJvbVNlYXJjaF9pbXBsKFN0cmluZyBxdWVyeSwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9TRUFSQ0gpOwotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJxdWVyeSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnBsYXlGcm9tU2VhcmNoKG1Db250cm9sbGVyU3R1YiwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogSGFuZGxlLgotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheUZyb21NZWRpYUlkX2ltcGwoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZSgKLSAgICAgICAgICAgICAgICBDT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fTUVESUFfSUQpOwotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5wbGF5RnJvbU1lZGlhSWQobUNvbnRyb2xsZXJTdHViLCBtZWRpYUlkLCBleHRyYXMpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZS4KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJhdGluZ19pbXBsKFN0cmluZyBtZWRpYUlkLCBSYXRpbmcyIHJhdGluZykgewotICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZWRpYUlkIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJhdGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyYXRpbmcgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IG1TZXNzaW9uQmluZGVyOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFJhdGluZyhtQ29udHJvbGxlclN0dWIsIG1lZGlhSWQsIHJhdGluZy50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZW5kQ3VzdG9tQ29tbWFuZF9pbXBsKFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncywgUmVzdWx0UmVjZWl2ZXIgY2IpIHsKLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoY29tbWFuZCk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2VuZEN1c3RvbUNvbW1hbmQobUNvbnRyb2xsZXJTdHViLCBjb21tYW5kLnRvQnVuZGxlKCksIGFyZ3MsIGNiKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3RfaW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5bGlzdDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFBsYXlsaXN0X2ltcGwoTGlzdDxNZWRpYUl0ZW0yPiBsaXN0LCBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsaXN0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgSU1lZGlhU2Vzc2lvbjIgYmluZGVyID0gZ2V0U2Vzc2lvbkJpbmRlcklmQWJsZShDT01NQU5EX0NPREVfUExBWUxJU1RfU0VUX0xJU1QpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8QnVuZGxlPiBidW5kbGVMaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBidW5kbGVMaXN0LmFkZChsaXN0LmdldChpKS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS50b0J1bmRsZSgpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIuc2V0UGxheWxpc3QobUNvbnRyb2xsZXJTdHViLCBidW5kbGVMaXN0LCBtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBjb25uZWN0IHRvIHRoZSBzZXJ2aWNlIG9yIHRoZSBzZXNzaW9uIGlzIGdvbmUiLCBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIlNlc3Npb24gaXNuJ3QgYWN0aXZlIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBnZXRQbGF5bGlzdE1ldGFkYXRhX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWxpc3RNZXRhZGF0YTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXlsaXN0TWV0YWRhdGFfaW1wbChNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKAotICAgICAgICAgICAgICAgIENPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVF9NRVRBREFUQSk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgQnVuZGxlIG1ldGFkYXRhQnVuZGxlID0gKG1ldGFkYXRhID09IG51bGwpID8gbnVsbCA6IG1ldGFkYXRhLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci51cGRhdGVQbGF5bGlzdE1ldGFkYXRhKG1Db250cm9sbGVyU3R1YiwgbWV0YWRhdGFCdW5kbGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlX2ltcGwoKSB7Ci0gICAgICAgIHNlbmRUcmFuc3BvcnRDb250cm9sQ29tbWFuZChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BSRVBBUkUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGZhc3RGb3J3YXJkX2ltcGwoKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogSW1wbGVtZW50IHRoaXMuIE5vdGUgdGhhdCBmYXN0IGZvcndhcmQgaXNuJ3QgYSB0cmFuc3BvcnQgY29tbWFuZCBhbnltb3JlCi0gICAgICAgIC8vc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKE1lZGlhU2Vzc2lvbjIuQ09NTUFORF9DT0RFX1NFU1NJT05fRkFTVF9GT1JXQVJEKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXdpbmRfaW1wbCgpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBJbXBsZW1lbnQgdGhpcy4gTm90ZSB0aGF0IHJld2luZCBpc24ndCBhIHRyYW5zcG9ydCBjb21tYW5kIGFueW1vcmUKLSAgICAgICAgLy9zZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoTWVkaWFTZXNzaW9uMi5DT01NQU5EX0NPREVfU0VTU0lPTl9SRVdJTkQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlZWtUb19pbXBsKGxvbmcgcG9zKSB7Ci0gICAgICAgIGlmIChwb3MgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwb3NpdGlvbiBzaG91bGRuJ3QgYmUgbmVnYXRpdmUiKTsKLSAgICAgICAgfQotICAgICAgICBCdW5kbGUgYXJncyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgYXJncy5wdXRMb25nKE1lZGlhU2Vzc2lvbjJTdHViLkFSR1VNRU5UX0tFWV9QT1NJVElPTiwgcG9zKTsKLSAgICAgICAgc2VuZFRyYW5zcG9ydENvbnRyb2xDb21tYW5kKFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfU0VFS19UTywgYXJncyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGxheWxpc3RJdGVtX2ltcGwoaW50IGluZGV4LCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaW5kZXggc2hvdWxkbid0IGJlIG5lZ2F0aXZlIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoQ09NTUFORF9DT0RFX1BMQVlMSVNUX0FERF9JVEVNKTsKLSAgICAgICAgaWYgKGJpbmRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIGJpbmRlci5hZGRQbGF5bGlzdEl0ZW0obUNvbnRyb2xsZXJTdHViLCBpbmRleCwgaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtX2ltcGwoTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9SRU1PVkVfSVRFTSk7Ci0gICAgICAgIGlmIChiaW5kZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBiaW5kZXIucmVtb3ZlUGxheWxpc3RJdGVtKG1Db250cm9sbGVyU3R1YiwgaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9SRVBMQUNFX0lURU0pOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnJlcGxhY2VQbGF5bGlzdEl0ZW0obUNvbnRyb2xsZXJTdHViLCBpbmRleCwgaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVNodWZmbGVNb2RlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlX2ltcGwoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIGZpbmFsIElNZWRpYVNlc3Npb24yIGJpbmRlciA9IGdldFNlc3Npb25CaW5kZXJJZkFibGUoCi0gICAgICAgICAgICAgICAgQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9TSFVGRkxFX01PREUpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFNodWZmbGVNb2RlKG1Db250cm9sbGVyU3R1Yiwgc2h1ZmZsZU1vZGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgY29ubmVjdCB0byB0aGUgc2VydmljZSBvciB0aGUgc2Vzc2lvbiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJTZXNzaW9uIGlzbid0IGFjdGl2ZSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1SZXBlYXRNb2RlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGVfaW1wbChpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBiaW5kZXIgPSBnZXRTZXNzaW9uQmluZGVySWZBYmxlKENPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfUkVQRUFUX01PREUpOwotICAgICAgICBpZiAoYmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgYmluZGVyLnNldFJlcGVhdE1vZGUobUNvbnRyb2xsZXJTdHViLCByZXBlYXRNb2RlKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IGNvbm5lY3QgdG8gdGhlIHNlcnZpY2Ugb3IgdGhlIHNlc3Npb24gaXMgZ29uZSIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBpc24ndCBhY3RpdmUiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFBsYXliYWNrSW5mbyBnZXRQbGF5YmFja0luZm9faW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5YmFja0luZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFBsYXllclN0YXRlX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWVyU3RhdGU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50UG9zaXRpb25faW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbG9uZyB0aW1lRGlmZiA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpIC0gbVBvc2l0aW9uRXZlbnRUaW1lTXM7Ci0gICAgICAgICAgICBsb25nIGV4cGVjdGVkUG9zaXRpb24gPSBtUG9zaXRpb25NcyArIChsb25nKSAobVBsYXliYWNrU3BlZWQgKiB0aW1lRGlmZik7Ci0gICAgICAgICAgICByZXR1cm4gTWF0aC5tYXgoMCwgZXhwZWN0ZWRQb3NpdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0UGxheWJhY2tTcGVlZF9pbXBsKCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrU3BlZWQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRCdWZmZXJlZFBvc2l0aW9uX2ltcGwoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtQnVmZmVyZWRQb3NpdGlvbk1zOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhSXRlbTIgZ2V0Q3VycmVudE1lZGlhSXRlbV9pbXBsKCkgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hQbGF5ZXJTdGF0ZUNoYW5nZXMoZmluYWwgaW50IHN0YXRlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1QbGF5ZXJTdGF0ZSA9IHN0YXRlOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXllclN0YXRlQ2hhbmdlZChtSW5zdGFuY2UsIHN0YXRlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBSZW5hbWUgdG8gc2VlayBjb21wbGV0ZWQKLSAgICB2b2lkIHB1c2hQb3NpdGlvbkNoYW5nZXMoZmluYWwgbG9uZyBldmVudFRpbWVNcywgZmluYWwgbG9uZyBwb3NpdGlvbk1zKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1Qb3NpdGlvbkV2ZW50VGltZU1zID0gZXZlbnRUaW1lTXM7Ci0gICAgICAgICAgICBtUG9zaXRpb25NcyA9IHBvc2l0aW9uTXM7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrLm9uU2Vla0NvbXBsZXRlZChtSW5zdGFuY2UsIHBvc2l0aW9uTXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hQbGF5YmFja1NwZWVkQ2hhbmdlcyhmaW5hbCBmbG9hdCBzcGVlZCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWJhY2tTcGVlZCA9IHNwZWVkOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXliYWNrU3BlZWRDaGFuZ2VkKG1JbnN0YW5jZSwgc3BlZWQpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hCdWZmZXJlZFBvc2l0aW9uQ2hhbmdlcyhmaW5hbCBsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcykgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtQnVmZmVyZWRQb3NpdGlvbk1zID0gYnVmZmVyZWRQb3NpdGlvbk1zOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogRml4IHRoaXMgLS0gaXQncyBub3cgYnVmZmVyZWQgc3RhdGUKLSAgICAgICAgICAgIC8vbUNhbGxiYWNrLm9uQnVmZmVyZWRQb3NpdGlvbkNoYW5nZWQobUluc3RhbmNlLCBidWZmZXJlZFBvc2l0aW9uTXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hQbGF5YmFja0luZm9DaGFuZ2VzKGZpbmFsIFBsYXliYWNrSW5mbyBpbmZvKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1QbGF5YmFja0luZm8gPSBpbmZvOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXliYWNrSW5mb0NoYW5nZWQobUluc3RhbmNlLCBpbmZvKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUGxheWxpc3RDaGFuZ2VzKGZpbmFsIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QsIGZpbmFsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1QbGF5bGlzdCA9IHBsYXlsaXN0OwotICAgICAgICAgICAgbVBsYXlsaXN0TWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmICghbUluc3RhbmNlLmlzQ29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWQobUluc3RhbmNlLCBwbGF5bGlzdCwgbWV0YWRhdGEpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hQbGF5bGlzdE1ldGFkYXRhQ2hhbmdlcyhNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtUGxheWxpc3RNZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1JbnN0YW5jZSwgbWV0YWRhdGEpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHB1c2hTaHVmZmxlTW9kZUNoYW5nZXMoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1TaHVmZmxlTW9kZSA9IHNodWZmbGVNb2RlOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHNodWZmbGVNb2RlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgdm9pZCBwdXNoUmVwZWF0TW9kZUNoYW5nZXMoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbVJlcGVhdE1vZGUgPSByZXBlYXRNb2RlOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgaWYgKCFtSW5zdGFuY2UuaXNDb25uZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkKG1JbnN0YW5jZSwgcmVwZWF0TW9kZSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgcHVzaEVycm9yKGludCBlcnJvckNvZGUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoIW1JbnN0YW5jZS5pc0Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrLm9uRXJyb3IobUluc3RhbmNlLCBlcnJvckNvZGUsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vIFNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrLgotICAgIHZvaWQgb25Db25uZWN0ZWROb3RMb2NrZWQoSU1lZGlhU2Vzc2lvbjIgc2Vzc2lvbkJpbmRlciwKLSAgICAgICAgICAgIGZpbmFsIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcywKLSAgICAgICAgICAgIGZpbmFsIGludCBwbGF5ZXJTdGF0ZSwKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgcG9zaXRpb25FdmVudFRpbWVNcywKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgcG9zaXRpb25NcywKLSAgICAgICAgICAgIGZpbmFsIGZsb2F0IHBsYXliYWNrU3BlZWQsCi0gICAgICAgICAgICBmaW5hbCBsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcywKLSAgICAgICAgICAgIGZpbmFsIFBsYXliYWNrSW5mbyBpbmZvLAotICAgICAgICAgICAgZmluYWwgaW50IHJlcGVhdE1vZGUsCi0gICAgICAgICAgICBmaW5hbCBpbnQgc2h1ZmZsZU1vZGUsCi0gICAgICAgICAgICBmaW5hbCBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0LAotICAgICAgICAgICAgZmluYWwgUGVuZGluZ0ludGVudCBzZXNzaW9uQWN0aXZpdHkpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvbkNvbm5lY3RlZE5vdExvY2tlZCBzZXNzaW9uQmluZGVyPSIgKyBzZXNzaW9uQmluZGVyCi0gICAgICAgICAgICAgICAgICAgICsgIiwgYWxsb3dlZENvbW1hbmRzPSIgKyBhbGxvd2VkQ29tbWFuZHMpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gY2xvc2UgPSBmYWxzZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uQmluZGVyID09IG51bGwgfHwgYWxsb3dlZENvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBDb25uZWN0aW9uIHJlamVjdGVkLgotICAgICAgICAgICAgICAgIGNsb3NlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc1JlbGVhc2VkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1TZXNzaW9uQmluZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiQ2Fubm90IGJlIG5vdGlmaWVkIGFib3V0IHRoZSBjb25uZWN0aW9uIHJlc3VsdCBtYW55IHRpbWVzLiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgUHJvYmFibHkgYSBidWcgb3IgbWFsaWNpb3VzIGFwcC4iKTsKLSAgICAgICAgICAgICAgICAgICAgY2xvc2UgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BbGxvd2VkQ29tbWFuZHMgPSBhbGxvd2VkQ29tbWFuZHM7Ci0gICAgICAgICAgICAgICAgbVBsYXllclN0YXRlID0gcGxheWVyU3RhdGU7Ci0gICAgICAgICAgICAgICAgbVBvc2l0aW9uRXZlbnRUaW1lTXMgPSBwb3NpdGlvbkV2ZW50VGltZU1zOwotICAgICAgICAgICAgICAgIG1Qb3NpdGlvbk1zID0gcG9zaXRpb25NczsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tTcGVlZCA9IHBsYXliYWNrU3BlZWQ7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlcmVkUG9zaXRpb25NcyA9IGJ1ZmZlcmVkUG9zaXRpb25NczsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvID0gaW5mbzsKLSAgICAgICAgICAgICAgICBtUmVwZWF0TW9kZSA9IHJlcGVhdE1vZGU7Ci0gICAgICAgICAgICAgICAgbVNodWZmbGVNb2RlID0gc2h1ZmZsZU1vZGU7Ci0gICAgICAgICAgICAgICAgbVBsYXlsaXN0ID0gcGxheWxpc3Q7Ci0gICAgICAgICAgICAgICAgbVNlc3Npb25BY3Rpdml0eSA9IHNlc3Npb25BY3Rpdml0eTsKLSAgICAgICAgICAgICAgICBtU2Vzc2lvbkJpbmRlciA9IHNlc3Npb25CaW5kZXI7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSW1wbGVtZW50YXRpb24gZm9yIHRoZSBsb2NhbCBiaW5kZXIgaXMgbm8tb3AsCi0gICAgICAgICAgICAgICAgICAgIC8vIHNvIGNhbiBiZSB1c2VkIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgZGVhZGxvY2suCi0gICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uQmluZGVyLmFzQmluZGVyKCkubGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50LCAwKTsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNlc3Npb24gZGllZCB0b28gZWFybHkuIiwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2xvc2UgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBLZWVwIGNvbW1hbmRzIHRvIHByZXZlbnRzIGlsbGVnYWwgQVBJIGNhbGxzLgotICAgICAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgLy8gTm90ZTogV2UgbWF5IHRyaWdnZXIgQ29udHJvbGxlckNhbGxiYWNrcyB3aXRoIHRoZSBpbml0aWFsIHZhbHVlcwotICAgICAgICAgICAgICAgIC8vIEJ1dCBpdCdzIGhhcmQgdG8gZGVmaW5lIHRoZSBvcmRlciBvZiB0aGUgY29udHJvbGxlciBjYWxsYmFja3MKLSAgICAgICAgICAgICAgICAvLyBPbmx5IG5vdGlmeSBhYm91dCB0aGUKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2sub25Db25uZWN0ZWQobUluc3RhbmNlLCBhbGxvd2VkQ29tbWFuZHMpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICBpZiAoY2xvc2UpIHsKLSAgICAgICAgICAgICAgICAvLyBUcmljayB0byBjYWxsIHJlbGVhc2UoKSB3aXRob3V0IGhvbGRpbmcgdGhlIGxvY2ssIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrCi0gICAgICAgICAgICAgICAgLy8gd2l0aCB0aGUgZGV2ZWxvcGVyJ3MgY3VzdG9tIGxvY2sgd2l0aGluIHRoZSBDb250cm9sbGVyQ2FsbGJhY2sub25EaXNjb25uZWN0ZWQoKS4KLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuY2xvc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgb25DdXN0b21Db21tYW5kKGZpbmFsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBmaW5hbCBCdW5kbGUgYXJncywKLSAgICAgICAgICAgIGZpbmFsIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25DdXN0b21Db21tYW5kIGNtZD0iICsgY29tbWFuZCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IERvdWJsZSBjaGVjayBpZiB0aGUgY29udHJvbGxlciBleGlzdHMuCi0gICAgICAgICAgICBtQ2FsbGJhY2sub25DdXN0b21Db21tYW5kKG1JbnN0YW5jZSwgY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZChmaW5hbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBjb21tYW5kcykgewotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvci5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQobUluc3RhbmNlLCBjb21tYW5kcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHZvaWQgb25DdXN0b21MYXlvdXRDaGFuZ2VkKGZpbmFsIExpc3Q8Q29tbWFuZEJ1dHRvbj4gbGF5b3V0KSB7Ci0gICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChtSW5zdGFuY2UsIGxheW91dCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vIFRoaXMgd2lsbCBiZSBjYWxsZWQgb24gdGhlIG1haW4gdGhyZWFkLgotICAgIHByaXZhdGUgY2xhc3MgU2Vzc2lvblNlcnZpY2VDb25uZWN0aW9uIGltcGxlbWVudHMgU2VydmljZUNvbm5lY3Rpb24gewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlQ29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSwgSUJpbmRlciBzZXJ2aWNlKSB7Ci0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgaXQncyBhbHdheXMgbWFpbi10aHJlYWQuCi0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblNlcnZpY2VDb25uZWN0ZWQgIiArIG5hbWUgKyAiICIgKyB0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFNhbml0eSBjaGVjawotICAgICAgICAgICAgaWYgKCFtVG9rZW4uZ2V0UGFja2FnZU5hbWUoKS5lcXVhbHMobmFtZS5nZXRQYWNrYWdlTmFtZSgpKSkgewotICAgICAgICAgICAgICAgIExvZy53dGYoVEFHLCBuYW1lICsgIiB3YXMgY29ubmVjdGVkLCBidXQgZXhwZWN0ZWQgcGtnPSIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgbVRva2VuLmdldFBhY2thZ2VOYW1lKCkgKyAiIHdpdGggaWQ9IiArIG1Ub2tlbi5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBJTWVkaWFTZXNzaW9uMiBzZXNzaW9uQmluZGVyID0gSU1lZGlhU2Vzc2lvbjIuU3R1Yi5hc0ludGVyZmFjZShzZXJ2aWNlKTsKLSAgICAgICAgICAgIGNvbm5lY3RUb1Nlc3Npb24oc2Vzc2lvbkJpbmRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZXJ2aWNlRGlzY29ubmVjdGVkKENvbXBvbmVudE5hbWUgbmFtZSkgewotICAgICAgICAgICAgLy8gVGVtcG9yYWwgbG9zZSBvZiB0aGUgYmluZGluZyBiZWNhdXNlIG9mIHRoZSBzZXJ2aWNlIGNyYXNoLiBTeXN0ZW0gd2lsbCBhdXRvbWF0aWNhbGx5Ci0gICAgICAgICAgICAvLyByZWJpbmQsIHNvIGp1c3Qgbm8tb3AuCi0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJlYWxseT8gRWl0aGVyIGRpc2Nvbm5lY3QgY2xlYW5seSBvcgotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiU2Vzc2lvbiBzZXJ2aWNlICIgKyBuYW1lICsgIiBpcyBkaXNjb25uZWN0ZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25CaW5kaW5nRGllZChDb21wb25lbnROYW1lIG5hbWUpIHsKLSAgICAgICAgICAgIC8vIFBlcm1hbmVudCBsb3NlIG9mIHRoZSBiaW5kaW5nIGJlY2F1c2Ugb2YgdGhlIHNlcnZpY2UgcGFja2FnZSB1cGRhdGUgb3IgcmVtb3ZlZC4KLSAgICAgICAgICAgIC8vIFRoaXMgU2Vzc2lvblNlcnZpY2VSZWNvcmQgd2lsbCBiZSByZW1vdmVkIGFjY29yZGluZ2x5LCBidXQgZm9yZ2V0IHNlc3Npb24gYmluZGVyIGhlcmUKLSAgICAgICAgICAgIC8vIGZvciBzdXJlLgotICAgICAgICAgICAgbUluc3RhbmNlLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBsYXliYWNrSW5mb0ltcGwgaW1wbGVtZW50cyBQbGF5YmFja0luZm9Qcm92aWRlciB7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19UWVBFID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5wbGF5YmFja190eXBlIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05UUk9MX1RZUEUgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnBsYXliYWNraW5mb19pbXBsLmNvbnRyb2xfdHlwZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUFYX1ZPTFVNRSA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEucGxheWJhY2tpbmZvX2ltcGwubWF4X3ZvbHVtZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ1VSUkVOVF9WT0xVTUUgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLnBsYXliYWNraW5mb19pbXBsLmN1cnJlbnRfdm9sdW1lIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BVURJT19BVFRSSUJVVEVTID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5wbGF5YmFja2luZm9faW1wbC5hdWRpb19hdHRycyI7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQbGF5YmFja0luZm8gbUluc3RhbmNlOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1QbGF5YmFja1R5cGU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1Db250cm9sVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1heFZvbHVtZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbUN1cnJlbnRWb2x1bWU7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQXVkaW9BdHRyaWJ1dGVzIG1BdWRpb0F0dHJzOwotCi0gICAgICAgIHByaXZhdGUgUGxheWJhY2tJbmZvSW1wbChpbnQgcGxheWJhY2tUeXBlLCBBdWRpb0F0dHJpYnV0ZXMgYXR0cnMsIGludCBjb250cm9sVHlwZSwKLSAgICAgICAgICAgICAgICBpbnQgbWF4LCBpbnQgY3VycmVudCkgewotICAgICAgICAgICAgbVBsYXliYWNrVHlwZSA9IHBsYXliYWNrVHlwZTsKLSAgICAgICAgICAgIG1BdWRpb0F0dHJzID0gYXR0cnM7Ci0gICAgICAgICAgICBtQ29udHJvbFR5cGUgPSBjb250cm9sVHlwZTsKLSAgICAgICAgICAgIG1NYXhWb2x1bWUgPSBtYXg7Ci0gICAgICAgICAgICBtQ3VycmVudFZvbHVtZSA9IGN1cnJlbnQ7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBuZXcgUGxheWJhY2tJbmZvKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tUeXBlX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQXVkaW9BdHRyaWJ1dGVzIGdldEF1ZGlvQXR0cmlidXRlc19pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1BdWRpb0F0dHJzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q29udHJvbFR5cGVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbFR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRNYXhWb2x1bWVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWF4Vm9sdW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0Q3VycmVudFZvbHVtZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1DdXJyZW50Vm9sdW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgUGxheWJhY2tJbmZvIGdldEluc3RhbmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEJ1bmRsZSB0b0J1bmRsZSgpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0SW50KEtFWV9QTEFZQkFDS19UWVBFLCBtUGxheWJhY2tUeXBlKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0NPTlRST0xfVFlQRSwgbUNvbnRyb2xUeXBlKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX01BWF9WT0xVTUUsIG1NYXhWb2x1bWUpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEludChLRVlfQ1VSUkVOVF9WT0xVTUUsIG1DdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRQYXJjZWxhYmxlKEtFWV9BVURJT19BVFRSSUJVVEVTLCBtQXVkaW9BdHRycyk7Ci0gICAgICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIFBsYXliYWNrSW5mbyBjcmVhdGVQbGF5YmFja0luZm8oaW50IHBsYXliYWNrVHlwZSwgQXVkaW9BdHRyaWJ1dGVzIGF0dHJzLAotICAgICAgICAgICAgICAgIGludCBjb250cm9sVHlwZSwgaW50IG1heCwgaW50IGN1cnJlbnQpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUGxheWJhY2tJbmZvSW1wbChwbGF5YmFja1R5cGUsIGF0dHJzLCBjb250cm9sVHlwZSwgbWF4LCBjdXJyZW50KQotICAgICAgICAgICAgICAgICAgICAuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHN0YXRpYyBQbGF5YmFja0luZm8gZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgICAgICBpZiAoYnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIGludCB2b2x1bWVUeXBlID0gYnVuZGxlLmdldEludChLRVlfUExBWUJBQ0tfVFlQRSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdm9sdW1lQ29udHJvbCA9IGJ1bmRsZS5nZXRJbnQoS0VZX0NPTlRST0xfVFlQRSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbWF4Vm9sdW1lID0gYnVuZGxlLmdldEludChLRVlfTUFYX1ZPTFVNRSk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY3VycmVudFZvbHVtZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX0NVUlJFTlRfVk9MVU1FKTsKLSAgICAgICAgICAgIGZpbmFsIEF1ZGlvQXR0cmlidXRlcyBhdHRycyA9IGJ1bmRsZS5nZXRQYXJjZWxhYmxlKEtFWV9BVURJT19BVFRSSUJVVEVTKTsKLQotICAgICAgICAgICAgcmV0dXJuIGNyZWF0ZVBsYXliYWNrSW5mbyh2b2x1bWVUeXBlLCBhdHRycywgdm9sdW1lQ29udHJvbCwgbWF4Vm9sdW1lLCBjdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMlN0dWIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFDb250cm9sbGVyMlN0dWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNmYzVkZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhQ29udHJvbGxlcjJTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db21tYW5kQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmRHcm91cDI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRCdXR0b25JbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUNvbnRyb2xsZXIyU3R1YiBleHRlbmRzIElNZWRpYUNvbnRyb2xsZXIyLlN0dWIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFDb250cm9sbGVyMlN0dWIiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBUT0RPKGphZXdhbik6IENoYW5nZQotCi0gICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhQ29udHJvbGxlcjJJbXBsPiBtQ29udHJvbGxlcjsKLQotICAgIE1lZGlhQ29udHJvbGxlcjJTdHViKE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgbUNvbnRyb2xsZXIgPSBuZXcgV2Vha1JlZmVyZW5jZTw+KGNvbnRyb2xsZXIpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFDb250cm9sbGVyMkltcGwgZ2V0Q29udHJvbGxlcigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyID0gbUNvbnRyb2xsZXIuZ2V0KCk7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkNvbnRyb2xsZXIgaXMgcmVsZWFzZWQiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udHJvbGxlcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhQnJvd3NlcjJJbXBsIGdldEJyb3dzZXIoKSB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgaW5zdGFuY2VvZiBNZWRpYUJyb3dzZXIySW1wbCkgewotICAgICAgICAgICAgcmV0dXJuIChNZWRpYUJyb3dzZXIySW1wbCkgY29udHJvbGxlcjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBkZXN0cm95KCkgewotICAgICAgICBtQ29udHJvbGxlci5jbGVhcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKGludCBzdGF0ZSkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFBsYXllclN0YXRlQ2hhbmdlcyhzdGF0ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Qb3NpdGlvbkNoYW5nZWQobG9uZyBldmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV2ZW50VGltZU1zIDwgMCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25Qb3NpdGlvbkNoYW5nZWQoKTogSWdub3JpbmcgbmVnYXRpdmUgZXZlbnRUaW1lTXMiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocG9zaXRpb25NcyA8IDApIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uUG9zaXRpb25DaGFuZ2VkKCk6IElnbm9yaW5nIG5lZ2F0aXZlIHBvc2l0aW9uTXMiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hQb3NpdGlvbkNoYW5nZXMoZXZlbnRUaW1lTXMsIHBvc2l0aW9uTXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheWJhY2tTcGVlZENoYW5nZWQoZmxvYXQgc3BlZWQpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5YmFja1NwZWVkQ2hhbmdlcyhzcGVlZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZChsb25nIGJ1ZmZlcmVkUG9zaXRpb25NcykgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChidWZmZXJlZFBvc2l0aW9uTXMgPCAwKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkKCk6IElnbm9yaW5nIG5lZ2F0aXZlIGJ1ZmZlcmVkUG9zaXRpb25NcyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaEJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VzKGJ1ZmZlcmVkUG9zaXRpb25Ncyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25QbGF5bGlzdENoYW5nZWQoTGlzdDxCdW5kbGU+IHBsYXlsaXN0QnVuZGxlLCBCdW5kbGUgbWV0YWRhdGFCdW5kbGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAocGxheWxpc3RCdW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25QbGF5bGlzdENoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBwbGF5bGlzdCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIGZvciAoQnVuZGxlIGJ1bmRsZSA6IHBsYXlsaXN0QnVuZGxlKSB7Ci0gICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0yLmZyb21CdW5kbGUoYnVuZGxlKTsKLSAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJvblBsYXlsaXN0Q2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIGl0ZW0gaW4gcGxheWxpc3QiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcGxheWxpc3QuYWRkKGl0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhID0gTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFBsYXlsaXN0Q2hhbmdlcyhwbGF5bGlzdCwgbWV0YWRhdGEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoQnVuZGxlIG1ldGFkYXRhQnVuZGxlKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEgPSBNZWRpYU1ldGFkYXRhMi5mcm9tQnVuZGxlKG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgY29udHJvbGxlci5wdXNoUGxheWxpc3RNZXRhZGF0YUNoYW5nZXMobWV0YWRhdGEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUmVwZWF0TW9kZUNoYW5nZWQoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hSZXBlYXRNb2RlQ2hhbmdlcyhyZXBlYXRNb2RlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBsYXliYWNrSW5mb0NoYW5nZWQoQnVuZGxlIHBsYXliYWNrSW5mbykgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUGxheWJhY2tJbmZvQ2hhbmdlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm8gaW5mbyA9IFBsYXliYWNrSW5mb0ltcGwuZnJvbUJ1bmRsZShwbGF5YmFja0luZm8pOwotICAgICAgICBpZiAoaW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvblBsYXliYWNrSW5mb0NoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBwbGF5YmFja0luZm8iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLnB1c2hQbGF5YmFja0luZm9DaGFuZ2VzKGluZm8pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBmaW5hbCBNZWRpYUNvbnRyb2xsZXIySW1wbCBjb250cm9sbGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgY29udHJvbGxlciA9IGdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIucHVzaFNodWZmbGVNb2RlQ2hhbmdlcyhzaHVmZmxlTW9kZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25FcnJvcihpbnQgZXJyb3JDb2RlLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5wdXNoRXJyb3IoZXJyb3JDb2RlLCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ29ubmVjdGVkKElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIsIEJ1bmRsZSBjb21tYW5kR3JvdXAsCi0gICAgICAgICAgICBpbnQgcGxheWVyU3RhdGUsIGxvbmcgcG9zaXRpb25FdmVudFRpbWVNcywgbG9uZyBwb3NpdGlvbk1zLCBmbG9hdCBwbGF5YmFja1NwZWVkLAotICAgICAgICAgICAgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMsIEJ1bmRsZSBwbGF5YmFja0luZm8sIGludCBzaHVmZmxlTW9kZSwgaW50IHJlcGVhdE1vZGUsCi0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gaXRlbUJ1bmRsZUxpc3QsIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5KSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlci5nZXQoKTsKLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Db25uZWN0ZWQgYWZ0ZXIgTWVkaWFDb250cm9sbGVyMi5jbG9zZSgpIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gY29udHJvbGxlci5nZXRDb250ZXh0KCk7Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gaXRlbUxpc3QgPSBudWxsOwotICAgICAgICBpZiAoaXRlbUJ1bmRsZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgaXRlbUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUJ1bmRsZUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0yLmZyb21CdW5kbGUoaXRlbUJ1bmRsZUxpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGl0ZW1MaXN0LmFkZChpdGVtKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5vbkNvbm5lY3RlZE5vdExvY2tlZChzZXNzaW9uQmluZGVyLAotICAgICAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyLmZyb21CdW5kbGUoY29tbWFuZEdyb3VwKSwKLSAgICAgICAgICAgICAgICBwbGF5ZXJTdGF0ZSwgcG9zaXRpb25FdmVudFRpbWVNcywgcG9zaXRpb25NcywgcGxheWJhY2tTcGVlZCwgYnVmZmVyZWRQb3NpdGlvbk1zLAotICAgICAgICAgICAgICAgIFBsYXliYWNrSW5mb0ltcGwuZnJvbUJ1bmRsZShwbGF5YmFja0luZm8pLCByZXBlYXRNb2RlLCBzaHVmZmxlTW9kZSwKLSAgICAgICAgICAgICAgICBpdGVtTGlzdCwgc2Vzc2lvbkFjdGl2aXR5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRpc2Nvbm5lY3RlZCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFDb250cm9sbGVyMkltcGwgY29udHJvbGxlciA9IG1Db250cm9sbGVyLmdldCgpOwotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvbkRpc2Nvbm5lY3RlZCBhZnRlciBNZWRpYUNvbnRyb2xsZXIyLmNsb3NlKCkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBjb250cm9sbGVyLmdldEluc3RhbmNlKCkuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkN1c3RvbUxheW91dENoYW5nZWQoTGlzdDxCdW5kbGU+IGNvbW1hbmRCdXR0b25saXN0KSB7Ci0gICAgICAgIGlmIChjb21tYW5kQnV0dG9ubGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJvbkN1c3RvbUxheW91dENoYW5nZWQoKTogSWdub3JpbmcgbnVsbCBjb21tYW5kQnV0dG9ubGlzdCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgTGlzdDxDb21tYW5kQnV0dG9uPiBsYXlvdXQgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb21tYW5kQnV0dG9ubGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgQ29tbWFuZEJ1dHRvbiBidXR0b24gPSBDb21tYW5kQnV0dG9uSW1wbC5mcm9tQnVuZGxlKGNvbW1hbmRCdXR0b25saXN0LmdldChpKSk7Ci0gICAgICAgICAgICBpZiAoYnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBsYXlvdXQuYWRkKGJ1dHRvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5vbkN1c3RvbUxheW91dENoYW5nZWQobGF5b3V0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoQnVuZGxlIGNvbW1hbmRzQnVuZGxlKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBSZXZpc2l0IGhlcmUuIENvdWxkIGJlIGEgYnVnCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZHMgPSBTZXNzaW9uQ29tbWFuZEdyb3VwMi5mcm9tQnVuZGxlKGNvbW1hbmRzQnVuZGxlKTsKLSAgICAgICAgaWYgKGNvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uQWxsb3dlZENvbW1hbmRzQ2hhbmdlZCgpOiBJZ25vcmluZyBudWxsIGNvbW1hbmRzIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgY29udHJvbGxlci5vbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoY29tbWFuZHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ3VzdG9tQ29tbWFuZChCdW5kbGUgY29tbWFuZEJ1bmRsZSwgQnVuZGxlIGFyZ3MsIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhQ29udHJvbGxlcjJJbXBsIGNvbnRyb2xsZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBjb250cm9sbGVyID0gZ2V0Q29udHJvbGxlcigpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAiRG9uJ3QgZmFpbCBzaWxlbnRseSBoZXJlLiBIaWdobHkgbGlrZWx5IGEgYnVnIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgPSBTZXNzaW9uQ29tbWFuZDIuZnJvbUJ1bmRsZShjb21tYW5kQnVuZGxlKTsKLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25DdXN0b21Db21tYW5kKCk6IElnbm9yaW5nIG51bGwgY29tbWFuZCIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRyb2xsZXIub25DdXN0b21Db21tYW5kKGNvbW1hbmQsIGFyZ3MsIHJlY2VpdmVyKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIE1lZGlhQnJvd3NlciBzcGVjaWZpYwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25HZXRMaWJyYXJ5Um9vdERvbmUoQnVuZGxlIHJvb3RIaW50cywgU3RyaW5nIHJvb3RNZWRpYUlkLCBCdW5kbGUgcm9vdEV4dHJhKQotICAgICAgICAgICAgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJyb3dzZXIub25HZXRMaWJyYXJ5Um9vdERvbmUocm9vdEhpbnRzLCByb290TWVkaWFJZCwgcm9vdEV4dHJhKTsKLSAgICB9Ci0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uR2V0SXRlbURvbmUoU3RyaW5nIG1lZGlhSWQsIEJ1bmRsZSBpdGVtQnVuZGxlKSB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uR2V0SXRlbURvbmUoKTogSWdub3JpbmcgbnVsbCBtZWRpYUlkIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uR2V0SXRlbURvbmUobWVkaWFJZCwgTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGl0ZW1CdW5kbGUpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkdldENoaWxkcmVuRG9uZShTdHJpbmcgcGFyZW50SWQsIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCi0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gaXRlbUJ1bmRsZUxpc3QsIEJ1bmRsZSBleHRyYXMpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uR2V0Q2hpbGRyZW5Eb25lKCk6IElnbm9yaW5nIG51bGwgcGFyZW50SWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQgPSBudWxsOwotICAgICAgICBpZiAoaXRlbUJ1bmRsZUxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKEJ1bmRsZSBidW5kbGUgOiBpdGVtQnVuZGxlTGlzdCkgewotICAgICAgICAgICAgICAgIHJlc3VsdC5hZGQoTWVkaWFJdGVtMi5mcm9tQnVuZGxlKGJ1bmRsZSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyb3dzZXIub25HZXRDaGlsZHJlbkRvbmUocGFyZW50SWQsIHBhZ2UsIHBhZ2VTaXplLCByZXN1bHQsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZWFyY2hSZXN1bHRDaGFuZ2VkKFN0cmluZyBxdWVyeSwgaW50IGl0ZW1Db3VudCwgQnVuZGxlIGV4dHJhcykKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25TZWFyY2hSZXN1bHRDaGFuZ2VkKCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uU2VhcmNoUmVzdWx0Q2hhbmdlZChxdWVyeSwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uR2V0U2VhcmNoUmVzdWx0RG9uZShTdHJpbmcgcXVlcnksIGludCBwYWdlLCBpbnQgcGFnZVNpemUsCi0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gaXRlbUJ1bmRsZUxpc3QsIEJ1bmRsZSBleHRyYXMpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgTG9nLncoVEFHLCAib25HZXRTZWFyY2hSZXN1bHREb25lKCk6IElnbm9yaW5nIGVtcHR5IHF1ZXJ5Iik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFCcm93c2VyMkltcGwgYnJvd3NlcjsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGJyb3dzZXIgPSBnZXRCcm93c2VyKCk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJEb24ndCBmYWlsIHNpbGVudGx5IGhlcmUuIEhpZ2hseSBsaWtlbHkgYSBidWciKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoYnJvd3NlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJldmlzaXQgaGVyZS4gQ291bGQgYmUgYSBidWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0ID0gbnVsbDsKLSAgICAgICAgaWYgKGl0ZW1CdW5kbGVMaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChCdW5kbGUgYnVuZGxlIDogaXRlbUJ1bmRsZUxpc3QpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQuYWRkKE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShidW5kbGUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicm93c2VyLm9uR2V0U2VhcmNoUmVzdWx0RG9uZShxdWVyeSwgcGFnZSwgcGFnZVNpemUsIHJlc3VsdCwgZXh0cmFzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNoaWxkcmVuQ2hhbmdlZChTdHJpbmcgcGFyZW50SWQsIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIm9uQ2hpbGRyZW5DaGFuZ2VkKCk6IElnbm9yaW5nIG51bGwgcGFyZW50SWQiKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYUJyb3dzZXIySW1wbCBicm93c2VyOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYnJvd3NlciA9IGdldEJyb3dzZXIoKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgIkRvbid0IGZhaWwgc2lsZW50bHkgaGVyZS4gSGlnaGx5IGxpa2VseSBhIGJ1ZyIpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChicm93c2VyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmV2aXNpdCBoZXJlLiBDb3VsZCBiZSBhIGJ1ZwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGJyb3dzZXIub25DaGlsZHJlbkNoYW5nZWQocGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhSXRlbTJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhSXRlbTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMGEwZjEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYUl0ZW0ySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yLkZMQUdfQlJPV1NBQkxFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTIuRkxBR19QTEFZQUJMRTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTIuQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTIuRmxhZ3M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUl0ZW0yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLQotaW1wb3J0IGphdmEudXRpbC5VVUlEOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFJdGVtMkltcGwgaW1wbGVtZW50cyBNZWRpYUl0ZW0yUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSUQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYWl0ZW0yLmlkIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0ZMQUdTID0gImFuZHJvaWQubWVkaWEubWVkaWFpdGVtMi5mbGFncyI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NRVRBREFUQSA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhaXRlbTIubWV0YWRhdGEiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVVVJRCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhaXRlbTIudXVpZCI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhSXRlbTIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1JZDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtRmxhZ3M7Ci0gICAgcHJpdmF0ZSBmaW5hbCBVVUlEIG1VVUlEOwotICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YTIgbU1ldGFkYXRhOwotICAgIHByaXZhdGUgRGF0YVNvdXJjZURlc2MgbURhdGFTb3VyY2VEZXNjOwotCi0gICAgLy8gRnJvbSB0aGUgcHVibGljIEFQSQotICAgIHB1YmxpYyBNZWRpYUl0ZW0ySW1wbChATm9uTnVsbCBTdHJpbmcgbWVkaWFJZCwgQE51bGxhYmxlIERhdGFTb3VyY2VEZXNjIGRzZCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSwgQEZsYWdzIGludCBmbGFncykgewotICAgICAgICB0aGlzKG1lZGlhSWQsIGRzZCwgbWV0YWRhdGEsIGZsYWdzLCBudWxsKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhSXRlbTJJbXBsKEBOb25OdWxsIFN0cmluZyBtZWRpYUlkLCBATnVsbGFibGUgRGF0YVNvdXJjZURlc2MgZHNkLAotICAgICAgICAgICAgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhLCBARmxhZ3MgaW50IGZsYWdzLCBATnVsbGFibGUgVVVJRCB1dWlkKSB7Ci0gICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobWV0YWRhdGEgIT0gbnVsbCAmJiAhVGV4dFV0aWxzLmVxdWFscyhtZWRpYUlkLCBtZXRhZGF0YS5nZXRNZWRpYUlkKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXRhZGF0YSdzIGlkIHNob3VsZCBiZSBtYXRjaGVkIHdpdGggdGhlIG1lZGlhaWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1JZCA9IG1lZGlhSWQ7Ci0gICAgICAgIG1EYXRhU291cmNlRGVzYyA9IGRzZDsKLSAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgIG1GbGFncyA9IGZsYWdzOwotICAgICAgICBtVVVJRCA9ICh1dWlkID09IG51bGwpID8gVVVJRC5yYW5kb21VVUlEKCkgOiB1dWlkOwotCi0gICAgICAgIG1JbnN0YW5jZSA9IG5ldyBNZWRpYUl0ZW0yKHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgTWVkaWFJdGVtMikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBNZWRpYUl0ZW0yIG90aGVyID0gKE1lZGlhSXRlbTIpIG9iajsKLSAgICAgICAgcmV0dXJuIG1VVUlELmVxdWFscygoKE1lZGlhSXRlbTJJbXBsKSBvdGhlci5nZXRQcm92aWRlcigpKS5tVVVJRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoaXMgb2JqZWN0IGFzIGEgYnVuZGxlIHRvIHNoYXJlIGJldHdlZW4gcHJvY2Vzc2VzLgotICAgICAqCi0gICAgICogQHJldHVybiBhIG5ldyBidW5kbGUgaW5zdGFuY2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7Ci0gICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX0lELCBtSWQpOwotICAgICAgICBidW5kbGUucHV0SW50KEtFWV9GTEFHUywgbUZsYWdzKTsKLSAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidW5kbGUucHV0QnVuZGxlKEtFWV9NRVRBREFUQSwgbU1ldGFkYXRhLnRvQnVuZGxlKCkpOwotICAgICAgICB9Ci0gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX1VVSUQsIG1VVUlELnRvU3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIE1lZGlhSXRlbTIgZnJvbSB0aGUge0BsaW5rIEJ1bmRsZX0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUgd2hpY2ggd2FzIHB1Ymxpc2hlZCBieSB7QGxpbmsgTWVkaWFJdGVtMiN0b0J1bmRsZSgpfS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIE1lZGlhSXRlbTIKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhSXRlbTIgZnJvbUJ1bmRsZV9pbXBsKEBOb25OdWxsIEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBTdHJpbmcgdXVpZFN0cmluZyA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX1VVSUQpOwotICAgICAgICByZXR1cm4gZnJvbUJ1bmRsZShidW5kbGUsIFVVSUQuZnJvbVN0cmluZyh1dWlkU3RyaW5nKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIGEgTWVkaWFJdGVtMiBmcm9tIHRoZSB7QGxpbmsgQnVuZGxlfSB3aXRoIHRoZSBzcGVjaWZpZWQge0BsaW5rIFVVSUR9LgotICAgICAqIElmIHtAbGluayBVVUlEfQotICAgICAqIGNhbiBiZSBudWxsIGZvciBjcmVhdGluZyBuZXcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUgd2hpY2ggd2FzIHB1Ymxpc2hlZCBieSB7QGxpbmsgTWVkaWFJdGVtMiN0b0J1bmRsZSgpfS4KLSAgICAgKiBAcGFyYW0gdXVpZCBBIHtAbGluayBVVUlEfSB0byBvdmVycmlkZS4gQ2FuIGJlIHtAbGluayBudWxsfSBmb3Igb3ZlcnJpZGUuCi0gICAgICogQHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBNZWRpYUl0ZW0yCi0gICAgICovCi0gICAgc3RhdGljIE1lZGlhSXRlbTIgZnJvbUJ1bmRsZShATm9uTnVsbCBCdW5kbGUgYnVuZGxlLCBATnVsbGFibGUgVVVJRCB1dWlkKSB7Ci0gICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgU3RyaW5nIGlkID0gYnVuZGxlLmdldFN0cmluZyhLRVlfSUQpOwotICAgICAgICBmaW5hbCBCdW5kbGUgbWV0YWRhdGFCdW5kbGUgPSBidW5kbGUuZ2V0QnVuZGxlKEtFWV9NRVRBREFUQSk7Ci0gICAgICAgIGZpbmFsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhID0gTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YUJ1bmRsZSk7Ci0gICAgICAgIGZpbmFsIGludCBmbGFncyA9IGJ1bmRsZS5nZXRJbnQoS0VZX0ZMQUdTKTsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0ySW1wbChpZCwgbnVsbCwgbWV0YWRhdGEsIGZsYWdzLCB1dWlkKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFJdGVtMiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigiTWVkaWFJdGVtMnsiKTsKLSAgICAgICAgc2IuYXBwZW5kKCJtRmxhZ3M9IikuYXBwZW5kKG1GbGFncyk7Ci0gICAgICAgIHNiLmFwcGVuZCgiLCBtTWV0YWRhdGE9IikuYXBwZW5kKG1NZXRhZGF0YSk7Ci0gICAgICAgIHNiLmFwcGVuZCgnfScpOwotICAgICAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQEZsYWdzIGludCBnZXRGbGFnc19pbXBsKCkgewotICAgICAgICByZXR1cm4gbUZsYWdzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzQnJvd3NhYmxlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiAobUZsYWdzICYgRkxBR19CUk9XU0FCTEUpICE9IDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNQbGF5YWJsZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gKG1GbGFncyAmIEZMQUdfUExBWUFCTEUpICE9IDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWV0YWRhdGFfaW1wbChATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKG1ldGFkYXRhICE9IG51bGwgJiYgIVRleHRVdGlscy5lcXVhbHMobUlkLCBtZXRhZGF0YS5nZXRNZWRpYUlkKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJtZXRhZGF0YSdzIGlkIHNob3VsZCBiZSBtYXRjaGVkIHdpdGggdGhlIG1lZGlhSWQiKTsKLSAgICAgICAgfQotICAgICAgICBtTWV0YWRhdGEgPSBtZXRhZGF0YTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIGdldE1ldGFkYXRhX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtTWV0YWRhdGE7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOb25OdWxsIFN0cmluZyBnZXRNZWRpYUlkX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtSWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBnZXREYXRhU291cmNlRGVzY19pbXBsKCkgewotICAgICAgICByZXR1cm4gbURhdGFTb3VyY2VEZXNjOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlckltcGwgaW1wbGVtZW50cyBNZWRpYUl0ZW0yUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBCdWlsZGVyIG1JbnN0YW5jZTsKLSAgICAgICAgcHJpdmF0ZSBARmxhZ3MgaW50IG1GbGFnczsKLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgbU1lZGlhSWQ7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YTIgbU1ldGFkYXRhOwotICAgICAgICBwcml2YXRlIERhdGFTb3VyY2VEZXNjIG1EYXRhU291cmNlRGVzYzsKLQotICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoQnVpbGRlciBpbnN0YW5jZSwgaW50IGZsYWdzKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1GbGFncyA9IGZsYWdzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1lZGlhSWRfaW1wbChATnVsbGFibGUgU3RyaW5nIG1lZGlhSWQpIHsKLSAgICAgICAgICAgIG1NZWRpYUlkID0gbWVkaWFJZDsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TWV0YWRhdGFfaW1wbChATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXREYXRhU291cmNlRGVzY19pbXBsKEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBkYXRhU291cmNlRGVzYykgewotICAgICAgICAgICAgbURhdGFTb3VyY2VEZXNjID0gZGF0YVNvdXJjZURlc2M7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBNZWRpYUl0ZW0yIGJ1aWxkX2ltcGwoKSB7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSAobU1ldGFkYXRhICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgID8gbU1ldGFkYXRhLmdldFN0cmluZyhNZWRpYU1ldGFkYXRhMi5NRVRBREFUQV9LRVlfTUVESUFfSUQpIDogbnVsbDsKLSAgICAgICAgICAgIGlmIChpZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gIFRPRE8oamFld2FuKTogRG91YmxlIGNoZWNrIGlmIGl0cyBzdWZmaWNpZW50IChlLmcuIFVzZSBVVUlEIGluc3RlYWQ/KQotICAgICAgICAgICAgICAgIGlkID0gKG1NZWRpYUlkICE9IG51bGwpID8gbU1lZGlhSWQgOiB0b1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0ySW1wbChpZCwgbURhdGFTb3VyY2VEZXNjLCBtTWV0YWRhdGEsIG1GbGFncykuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjM0Y2Q0Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLkxpYnJhcnlSb290OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTIuTWVkaWFMaWJyYXJ5U2Vzc2lvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb24uQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb24uTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29udHJvbGxlckluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFMaWJyYXJ5U2VydmljZTJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMkltcGwuQnVpbGRlckJhc2VJbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwgZXh0ZW5kcyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwgaW1wbGVtZW50cwotICAgICAgICBNZWRpYUxpYnJhcnlTZXJ2aWNlMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvblNlcnZpY2UyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIE1lZGlhTGlicmFyeVNlc3Npb24gbUxpYnJhcnlTZXNzaW9uOwotCi0gICAgcHVibGljIE1lZGlhTGlicmFyeVNlcnZpY2UySW1wbChNZWRpYUxpYnJhcnlTZXJ2aWNlMiBpbnN0YW5jZSkgewotICAgICAgICBzdXBlcihpbnN0YW5jZSk7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uQ3JlYXRlX2ltcGwoKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlX2ltcGwoKTsKLQotICAgICAgICAvLyBFZmZlY3RpdmVseSBmaW5hbAotICAgICAgICBNZWRpYVNlc3Npb24yIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGlmICghKHNlc3Npb24gaW5zdGFuY2VvZiBNZWRpYUxpYnJhcnlTZXNzaW9uKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIE1lZGlhTGlicmFyeVNlc3Npb24sIGJ1dCByZXR1cm5lZCBNZWRpYVNlc3Npb24yIik7Ci0gICAgICAgIH0KLSAgICAgICAgbUxpYnJhcnlTZXNzaW9uID0gKE1lZGlhTGlicmFyeVNlc3Npb24pIGdldFNlc3Npb24oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBpbnQgZ2V0U2Vzc2lvblR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBTZXNzaW9uVG9rZW4yLlRZUEVfTElCUkFSWV9TRVJWSUNFOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwgZXh0ZW5kcyBNZWRpYVNlc3Npb24ySW1wbAotICAgICAgICAgICAgaW1wbGVtZW50cyBNZWRpYUxpYnJhcnlTZXNzaW9uUHJvdmlkZXIgewotICAgICAgICBwdWJsaWMgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwoQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIFN0cmluZyBpZCwgTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyLAotICAgICAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5LCBFeGVjdXRvciBjYWxsYmFja0V4ZWN1dG9yLAotICAgICAgICAgICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgcGxheWVyLCBpZCwgcGxheWxpc3RBZ2VudCwgdm9sdW1lUHJvdmlkZXIsIHNlc3Npb25BY3Rpdml0eSwKLSAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2tFeGVjdXRvciwgY2FsbGJhY2spOwotICAgICAgICAgICAgLy8gRG9uJ3QgcHV0IGFueSBleHRyYSBpbml0aWFsaXphdGlvbiBoZXJlLiBIZXJlJ3MgdGhlIHJlYXNvbi4KLSAgICAgICAgICAgIC8vIFN5c3RlbSBzZXJ2aWNlIHdpbGwgcmVjb2duaXplIHRoaXMgc2Vzc2lvbiBpbnNpZGUgb2YgdGhlIHN1cGVyIGNvbnN0cnVjdG9yIGFuZCB3b3VsZAotICAgICAgICAgICAgLy8gY29ubmVjdCB0byB0aGlzIHNlc3Npb24gYXNzdW1pbmcgdGhhdCBpbml0aWFsaXphdGlvbiBpcyBmaW5pc2hlZC4gSG93ZXZlciwgaWYgYW55Ci0gICAgICAgICAgICAvLyBpbml0aWFsaXphdGlvbiBsb2dpYyBpcyBoZXJlLCBjYWxscyBmcm9tIHRoZSBzZXJ2ZXIgd291bGQgZmFpbC4KLSAgICAgICAgICAgIC8vIHNlZTogTWVkaWFTZXNzaW9uMlN0dWIjY29ubmVjdCgpCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgTWVkaWFMaWJyYXJ5U2Vzc2lvbiBjcmVhdGVJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFMaWJyYXJ5U2Vzc2lvbih0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBNZWRpYUxpYnJhcnlTZXNzaW9uIGdldEluc3RhbmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIChNZWRpYUxpYnJhcnlTZXNzaW9uKSBzdXBlci5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBnZXRDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIHJldHVybiAoTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrKSBzdXBlci5nZXRDYWxsYmFjaygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZF9pbXBsKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFN0cmluZyBwYXJlbnRJZCwKLSAgICAgICAgICAgICAgICBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0U2Vzc2lvblN0dWIoKS5ub3RpZnlDaGlsZHJlbkNoYW5nZWROb3RMb2NrZWQoY29udHJvbGxlciwgcGFyZW50SWQsIGl0ZW1Db3VudCwKLSAgICAgICAgICAgICAgICAgICAgZXh0cmFzKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWRfaW1wbChTdHJpbmcgcGFyZW50SWQsIGludCBpdGVtQ291bnQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGFyZW50SWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdldFNlc3Npb25TdHViKCkubm90aWZ5Q2hpbGRyZW5DaGFuZ2VkTm90TG9ja2VkKHBhcmVudElkLCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbm90aWZ5U2VhcmNoUmVzdWx0Q2hhbmdlZF9pbXBsKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFN0cmluZyBxdWVyeSwKLSAgICAgICAgICAgICAgICBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBlbnN1cmVDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInF1ZXJ5IHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZ2V0U2Vzc2lvblN0dWIoKS5ub3RpZnlTZWFyY2hSZXN1bHRDaGFuZ2VkKGNvbnRyb2xsZXIsIHF1ZXJ5LCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXJJbXBsCi0gICAgICAgICAgICBleHRlbmRzIEJ1aWxkZXJCYXNlSW1wbDxNZWRpYUxpYnJhcnlTZXNzaW9uLCBNZWRpYUxpYnJhcnlTZXNzaW9uQ2FsbGJhY2s+IHsKLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKE1lZGlhTGlicmFyeVNlcnZpY2UyIHNlcnZpY2UsIEJ1aWxkZXIgaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICBzdXBlcihzZXJ2aWNlKTsKLSAgICAgICAgICAgIHNldFNlc3Npb25DYWxsYmFja19pbXBsKGNhbGxiYWNrRXhlY3V0b3IsIGNhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTWVkaWFMaWJyYXJ5U2Vzc2lvbiBidWlsZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbChtQ29udGV4dCwgbVBsYXllciwgbUlkLCBtUGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgICAgICAgICAgbVZvbHVtZVByb3ZpZGVyLCBtU2Vzc2lvbkFjdGl2aXR5LCBtQ2FsbGJhY2tFeGVjdXRvciwgbUNhbGxiYWNrKS5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBMaWJyYXJ5Um9vdEltcGwgaW1wbGVtZW50cyBMaWJyYXJ5Um9vdFByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBMaWJyYXJ5Um9vdCBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Sb290SWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1FeHRyYXM7Ci0KLSAgICAgICAgcHVibGljIExpYnJhcnlSb290SW1wbChMaWJyYXJ5Um9vdCBpbnN0YW5jZSwgU3RyaW5nIHJvb3RJZCwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgaWYgKHJvb3RJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm9vdElkIHNob3VsZG4ndCBiZSBudWxsLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtUm9vdElkID0gcm9vdElkOwotICAgICAgICAgICAgbUV4dHJhcyA9IGV4dHJhczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFJvb3RJZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb290SWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXNfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0cmFzOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFNZXRhZGF0YTJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMWM1MzIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYU1ldGFkYXRhMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuKjsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkJpdG1hcDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuQml0bWFwS2V5OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTIuQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyLkxvbmdLZXk7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi5SYXRpbmdLZXk7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMi5UZXh0S2V5OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYU1ldGFkYXRhMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIE1lZGlhTWV0YWRhdGEySW1wbCBpbXBsZW1lbnRzIE1lZGlhTWV0YWRhdGEyUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFNZXRhZGF0YTIiOwotCi0gICAgc3RhdGljIGZpbmFsIGludCBNRVRBREFUQV9UWVBFX0xPTkcgPSAwOwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTUVUQURBVEFfVFlQRV9URVhUID0gMTsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfQklUTUFQID0gMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfUkFUSU5HID0gMzsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1FVEFEQVRBX1RZUEVfRkxPQVQgPSA0OwotICAgIHN0YXRpYyBmaW5hbCBBcnJheU1hcDxTdHJpbmcsIEludGVnZXI+IE1FVEFEQVRBX0tFWVNfVFlQRTsKLQotICAgIHN0YXRpYyB7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRSA9IG5ldyBBcnJheU1hcDxTdHJpbmcsIEludGVnZXI+KCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1RJVExFLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BUlRJU1QsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RVUkFUSU9OLCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVVUSE9SLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9XUklURVIsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0NPTVBPU0VSLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9DT01QSUxBVElPTiwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfREFURSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfWUVBUiwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfR0VOUkUsIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX1RSQUNLX05VTUJFUiwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfTlVNX1RSQUNLUywgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTQ19OVU1CRVIsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FMQlVNX0FSVElTVCwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfQVJULCBNRVRBREFUQV9UWVBFX0JJVE1BUCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FSVF9VUkksIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0FMQlVNX0FSVCwgTUVUQURBVEFfVFlQRV9CSVRNQVApOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BTEJVTV9BUlRfVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9VU0VSX1JBVElORywgTUVUQURBVEFfVFlQRV9SQVRJTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9SQVRJTkcsIE1FVEFEQVRBX1RZUEVfUkFUSU5HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9USVRMRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9TVUJUSVRMRSwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9ERVNDUklQVElPTiwgTUVUQURBVEFfVFlQRV9URVhUKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfRElTUExBWV9JQ09OLCBNRVRBREFUQV9UWVBFX0JJVE1BUCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTl9VUkksIE1FVEFEQVRBX1RZUEVfVEVYVCk7Ci0gICAgICAgIE1FVEFEQVRBX0tFWVNfVFlQRS5wdXQoTUVUQURBVEFfS0VZX01FRElBX0lELCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9CVF9GT0xERVJfVFlQRSwgTUVUQURBVEFfVFlQRV9MT05HKTsKLSAgICAgICAgTUVUQURBVEFfS0VZU19UWVBFLnB1dChNRVRBREFUQV9LRVlfTUVESUFfVVJJLCBNRVRBREFUQV9UWVBFX1RFWFQpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9BRFZFUlRJU0VNRU5ULCBNRVRBREFUQV9UWVBFX0xPTkcpOwotICAgICAgICBNRVRBREFUQV9LRVlTX1RZUEUucHV0KE1FVEFEQVRBX0tFWV9ET1dOTE9BRF9TVEFUVVMsIE1FVEFEQVRBX1RZUEVfTE9ORyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQFRleHRLZXkKLSAgICBTdHJpbmdbXSBQUkVGRVJSRURfREVTQ1JJUFRJT05fT1JERVIgPSB7Ci0gICAgICAgICAgICBNRVRBREFUQV9LRVlfVElUTEUsCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQVJUSVNULAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FMQlVNX0FSVElTVCwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9XUklURVIsCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQVVUSE9SLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0NPTVBPU0VSCi0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEBCaXRtYXBLZXkKLSAgICBTdHJpbmdbXSBQUkVGRVJSRURfQklUTUFQX09SREVSID0gewotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0RJU1BMQVlfSUNPTiwKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9BUlQsCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU1fQVJUCi0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEBUZXh0S2V5Ci0gICAgU3RyaW5nW10gUFJFRkVSUkVEX1VSSV9PUkRFUiA9IHsKLSAgICAgICAgICAgIE1FVEFEQVRBX0tFWV9ESVNQTEFZX0lDT05fVVJJLAotICAgICAgICAgICAgTUVUQURBVEFfS0VZX0FSVF9VUkksCi0gICAgICAgICAgICBNRVRBREFUQV9LRVlfQUxCVU1fQVJUX1VSSQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhTWV0YWRhdGEyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEySW1wbChCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIG1JbnN0YW5jZSA9IG5ldyBNZWRpYU1ldGFkYXRhMih0aGlzKTsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXlfaW1wbChTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuY29udGFpbnNLZXkoa2V5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldFRleHRfaW1wbChAVGV4dEtleSBTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Q2hhclNlcXVlbmNlKGtleSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBTdHJpbmcgZ2V0TWVkaWFJZF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmdldFN0cmluZyhNRVRBREFUQV9LRVlfTUVESUFfSUQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0U3RyaW5nX2ltcGwoQFRleHRLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gbUJ1bmRsZS5nZXRDaGFyU2VxdWVuY2Uoa2V5KTsKLSAgICAgICAgaWYgKHRleHQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIHRleHQudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRMb25nX2ltcGwoQExvbmdLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoa2V5LCAwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBnZXRSYXRpbmdfaW1wbChAUmF0aW5nS2V5IFN0cmluZyBrZXkpIHsKLSAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEFkZCBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Ci0gICAgICAgIFJhdGluZzIgcmF0aW5nID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHJhdGluZyA9IFJhdGluZzIuZnJvbUJ1bmRsZShtQnVuZGxlLmdldEJ1bmRsZShrZXkpKTsKLSAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSwgdmFsdWUgd2FzIG5vdCBhIHJhdGluZwotICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIHJldHJpZXZlIGEga2V5IGFzIFJhdGluZy4iLCBlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmF0aW5nOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmbG9hdCBnZXRGbG9hdF9pbXBsKEBGbG9hdEtleSBTdHJpbmcga2V5KSB7Ci0gICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0RmxvYXQoa2V5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQml0bWFwIGdldEJpdG1hcF9pbXBsKEBCaXRtYXBLZXkgU3RyaW5nIGtleSkgewotICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIEJpdG1hcCBibXAgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgYm1wID0gbUJ1bmRsZS5nZXRQYXJjZWxhYmxlKGtleSk7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBpZ25vcmUsIHZhbHVlIHdhcyBub3QgYSBiaXRtYXAKLSAgICAgICAgICAgIExvZy53KFRBRywgIkZhaWxlZCB0byByZXRyaWV2ZSBhIGtleSBhcyBCaXRtYXAuIiwgZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJtcDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhc19pbXBsKCkgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0QnVuZGxlKE1FVEFEQVRBX0tFWV9FWFRSQVMpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gaWdub3JlLCB2YWx1ZSB3YXMgbm90IGFuIGJ1bmRsZQotICAgICAgICAgICAgTG9nLncoVEFHLCAiRmFpbGVkIHRvIHJldHJpZXZlIGFuIGV4dHJhIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBzaXplX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLnNpemUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2V0PFN0cmluZz4ga2V5U2V0X2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmtleVNldCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYU1ldGFkYXRhMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gKGJ1bmRsZSA9PSBudWxsKSA/IG51bGwgOiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsKGJ1bmRsZSkuZ2V0SW5zdGFuY2UoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgTWVkaWFNZXRhZGF0YTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIE1lZGlhTWV0YWRhdGEyLkJ1aWxkZXIgbUluc3RhbmNlOwotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotCi0gICAgICAgIHB1YmxpYyBCdWlsZGVySW1wbChNZWRpYU1ldGFkYXRhMi5CdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBpbnN0YW5jZSwgTWVkaWFNZXRhZGF0YTIgc291cmNlKSB7Ci0gICAgICAgICAgICBpZiAoc291cmNlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzb3VyY2Ugc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoc291cmNlLnRvQnVuZGxlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKGludCBtYXhCaXRtYXBTaXplKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBuZXcgTWVkaWFNZXRhZGF0YTIuQnVpbGRlcih0aGlzKTsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0KLSAgICAgICAgICAgIGZvciAoU3RyaW5nIGtleSA6IG1CdW5kbGUua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBtQnVuZGxlLmdldChrZXkpOwotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJpdG1hcCkgewotICAgICAgICAgICAgICAgICAgICBCaXRtYXAgYm1wID0gKEJpdG1hcCkgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChibXAuZ2V0SGVpZ2h0KCkgPiBtYXhCaXRtYXBTaXplIHx8IGJtcC5nZXRXaWR0aCgpID4gbWF4Qml0bWFwU2l6ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnB1dEJpdG1hcChrZXksIHNjYWxlQml0bWFwKGJtcCwgbWF4Qml0bWFwU2l6ZSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dFRleHRfaW1wbChAVGV4dEtleSBTdHJpbmcga2V5LCBDaGFyU2VxdWVuY2UgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX1RFWFQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIENoYXJTZXF1ZW5jZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0Q2hhclNlcXVlbmNlKGtleSwgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRTdHJpbmdfaW1wbChAVGV4dEtleSBTdHJpbmcga2V5LCBTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX1RFWFQpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIFN0cmluZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0Q2hhclNlcXVlbmNlKGtleSwgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVpbGRlciBwdXRMb25nX2ltcGwoQExvbmdLZXkgU3RyaW5nIGtleSwgbG9uZyB2YWx1ZSkgewotICAgICAgICAgICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigia2V5IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmNvbnRhaW5zS2V5KGtleSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoTUVUQURBVEFfS0VZU19UWVBFLmdldChrZXkpICE9IE1FVEFEQVRBX1RZUEVfTE9ORykgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaGUgIiArIGtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBrZXkgY2Fubm90IGJlIHVzZWQgdG8gcHV0IGEgbG9uZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0UmF0aW5nX2ltcGwoQFJhdGluZ0tleSBTdHJpbmcga2V5LCBSYXRpbmcyIHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9SQVRJTkcpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIFJhdGluZyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKGtleSwgdmFsdWUudG9CdW5kbGUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHB1dEJpdG1hcF9pbXBsKEBCaXRtYXBLZXkgU3RyaW5nIGtleSwgQml0bWFwIHZhbHVlKSB7Ci0gICAgICAgICAgICBpZiAoa2V5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJrZXkgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuY29udGFpbnNLZXkoa2V5KSkgewotICAgICAgICAgICAgICAgIGlmIChNRVRBREFUQV9LRVlTX1RZUEUuZ2V0KGtleSkgIT0gTUVUQURBVEFfVFlQRV9CSVRNQVApIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGhlICIgKyBrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIga2V5IGNhbm5vdCBiZSB1c2VkIHRvIHB1dCBhIEJpdG1hcCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0UGFyY2VsYWJsZShrZXksIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgcHV0RmxvYXRfaW1wbChARmxvYXRLZXkgU3RyaW5nIGtleSwgZmxvYXQgdmFsdWUpIHsKLSAgICAgICAgICAgIGlmIChrZXkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImtleSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5jb250YWluc0tleShrZXkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1FVEFEQVRBX0tFWVNfVFlQRS5nZXQoa2V5KSAhPSBNRVRBREFUQV9UWVBFX0ZMT0FUKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRoZSAiICsga2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGtleSBjYW5ub3QgYmUgdXNlZCB0byBwdXQgYSBmbG9hdCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1CdW5kbGUucHV0RmxvYXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4dHJhc19pbXBsKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKE1FVEFEQVRBX0tFWV9FWFRSQVMsIGJ1bmRsZSk7Ci0gICAgICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMiBidWlsZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYU1ldGFkYXRhMkltcGwobUJ1bmRsZSkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgQml0bWFwIHNjYWxlQml0bWFwKEJpdG1hcCBibXAsIGludCBtYXhTaXplKSB7Ci0gICAgICAgICAgICBmbG9hdCBtYXhTaXplRiA9IG1heFNpemU7Ci0gICAgICAgICAgICBmbG9hdCB3aWR0aFNjYWxlID0gbWF4U2l6ZUYgLyBibXAuZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgIGZsb2F0IGhlaWdodFNjYWxlID0gbWF4U2l6ZUYgLyBibXAuZ2V0SGVpZ2h0KCk7Ci0gICAgICAgICAgICBmbG9hdCBzY2FsZSA9IE1hdGgubWluKHdpZHRoU2NhbGUsIGhlaWdodFNjYWxlKTsKLSAgICAgICAgICAgIGludCBoZWlnaHQgPSAoaW50KSAoYm1wLmdldEhlaWdodCgpICogc2NhbGUpOwotICAgICAgICAgICAgaW50IHdpZHRoID0gKGludCkgKGJtcC5nZXRXaWR0aCgpICogc2NhbGUpOwotICAgICAgICAgICAgcmV0dXJuIEJpdG1hcC5jcmVhdGVTY2FsZWRCaXRtYXAoYm1wLCB3aWR0aCwgaGVpZ2h0LCB0cnVlKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVBsYXlsaXN0QWdlbnRJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWxpc3RBZ2VudEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGZkNGUxYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhUGxheWxpc3RBZ2VudEltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLkNhbGxiYWNrRXhlY3V0b3I7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFNZXRhZGF0YTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQuUGxheWxpc3RFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhUGxheWxpc3RBZ2VudFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BcnJheU1hcDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuR3VhcmRlZEJ5OwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYVBsYXlsaXN0QWdlbnRJbXBsIGltcGxlbWVudHMgTWVkaWFQbGF5bGlzdEFnZW50UHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFQbGF5bGlzdEFnZW50IjsKLQotICAgIHByaXZhdGUgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IG1JbnN0YW5jZTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IG1DYWxsYmFja3MgPSBuZXcgQXJyYXlNYXA8PigpOwotCi0gICAgcHVibGljIE1lZGlhUGxheWxpc3RBZ2VudEltcGwoTWVkaWFQbGF5bGlzdEFnZW50IGluc3RhbmNlKSB7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrX2ltcGwoCi0gICAgICAgICAgICBATm9uTnVsbCBAQ2FsbGJhY2tFeGVjdXRvciBFeGVjdXRvciBleGVjdXRvciwgQE5vbk51bGwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChleGVjdXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJleGVjdXRvciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1DYWxsYmFja3MuZ2V0KGNhbGxiYWNrKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiY2FsbGJhY2sgaXMgYWxyZWFkeSBhZGRlZC4gSWdub3JpbmcuIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNhbGxiYWNrcy5wdXQoY2FsbGJhY2ssIGV4ZWN1dG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2tfaW1wbCgKLSAgICAgICAgICAgIEBOb25OdWxsIFBsYXlsaXN0RXZlbnRDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tzLnJlbW92ZShjYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCBub3RpZnlQbGF5bGlzdENoYW5nZWRfaW1wbCgpIHsKLSAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCk7Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3Q9IG1JbnN0YW5jZS5nZXRQbGF5bGlzdCgpOwotICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSA9IG1JbnN0YW5jZS5nZXRQbGF5bGlzdE1ldGFkYXRhKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2sgPSBjYWxsYmFja3Mua2V5QXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IGNhbGxiYWNrcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBjYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLCBwbGF5bGlzdCwgbWV0YWRhdGEpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkX2ltcGwoKSB7Ci0gICAgICAgIEFycmF5TWFwPFBsYXlsaXN0RXZlbnRDYWxsYmFjaywgRXhlY3V0b3I+IGNhbGxiYWNrcyA9IGdldENhbGxiYWNrcygpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNhbGxiYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIGNhbGxiYWNrID0gY2FsbGJhY2tzLmtleUF0KGkpOwotICAgICAgICAgICAgZmluYWwgRXhlY3V0b3IgZXhlY3V0b3IgPSBjYWxsYmFja3MudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGV4ZWN1dG9yLmV4ZWN1dGUoKCkgLT4gY2FsbGJhY2sub25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0UGxheWxpc3RNZXRhZGF0YSgpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBwdWJsaWMgdm9pZCBub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWRfaW1wbCgpIHsKLSAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2sgPSBjYWxsYmFja3Mua2V5QXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IGNhbGxiYWNrcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBjYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLCBtSW5zdGFuY2UuZ2V0U2h1ZmZsZU1vZGUoKSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgZmluYWwgcHVibGljIHZvaWQgbm90aWZ5UmVwZWF0TW9kZUNoYW5nZWRfaW1wbCgpIHsKLSAgICAgICAgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gY2FsbGJhY2tzID0gZ2V0Q2FsbGJhY2tzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgY2FsbGJhY2sgPSBjYWxsYmFja3Mua2V5QXQoaSk7Ci0gICAgICAgICAgICBmaW5hbCBFeGVjdXRvciBleGVjdXRvciA9IGNhbGxiYWNrcy52YWx1ZUF0KGkpOwotICAgICAgICAgICAgZXhlY3V0b3IuZXhlY3V0ZSgoKSAtPiBjYWxsYmFjay5vblJlcGVhdE1vZGVDaGFuZ2VkKAotICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UsIG1JbnN0YW5jZS5nZXRSZXBlYXRNb2RlKCkpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgTGlzdDxNZWRpYUl0ZW0yPiBnZXRQbGF5bGlzdF9pbXBsKCkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdF9pbXBsKEBOb25OdWxsIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgZ2V0UGxheWxpc3RNZXRhZGF0YV9pbXBsKCkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhX2ltcGwoQE51bGxhYmxlIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYWRkUGxheWxpc3RJdGVtX2ltcGwoaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZXBsYWNlUGxheWxpc3RJdGVtX2ltcGwoaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW1faW1wbCgpIHsKLSAgICAgICAgLy8gZW1wdHkgaW1wbGVtZW50YXRpb24KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbV9pbXBsKCkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0TW9kZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmVwZWF0TW9kZV9pbXBsKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZV9pbXBsKCkgewotICAgICAgICAvLyBlbXB0eSBpbXBsZW1lbnRhdGlvbgotICAgICAgICByZXR1cm4gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlX2ltcGwoaW50IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgIC8vIGVtcHR5IGltcGxlbWVudGF0aW9uCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBOdWxsYWJsZSBNZWRpYUl0ZW0yIGdldE1lZGlhSXRlbV9pbXBsKEBOb25OdWxsIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICBpZiAoZHNkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRzZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gaXRlbUxpc3QgPSBtSW5zdGFuY2UuZ2V0UGxheWxpc3QoKTsKLSAgICAgICAgaWYgKGl0ZW1MaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbUxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IGl0ZW1MaXN0LmdldChpKTsKLSAgICAgICAgICAgIGlmIChpdGVtICE9IG51bGwgJiYgaXRlbS5nZXREYXRhU291cmNlRGVzYygpID09IGRzZCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpdGVtOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgQXJyYXlNYXA8UGxheWxpc3RFdmVudENhbGxiYWNrLCBFeGVjdXRvcj4gZ2V0Q2FsbGJhY2tzKCkgewotICAgICAgICBBcnJheU1hcDxQbGF5bGlzdEV2ZW50Q2FsbGJhY2ssIEV4ZWN1dG9yPiBjYWxsYmFja3MgPSBuZXcgQXJyYXlNYXA8PigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBjYWxsYmFja3MucHV0QWxsKG1DYWxsYmFja3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjYWxsYmFja3M7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb24ySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb24ySW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWM2MDQyLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMkltcGwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfQ1VTVE9NOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9MSUJSQVJZX1NFUlZJQ0U7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5UWVBFX1NFU1NJT047Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5UWVBFX1NFU1NJT05fU0VSVklDRTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5SZXNvbHZlSW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvRm9jdXNSZXF1ZXN0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuRGF0YVNvdXJjZURlc2M7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMi5QbGF5YmFja0luZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyQmFzZS5QbGF5ZXJFdmVudENhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllclN0YXRlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50LlBsYXlsaXN0RXZlbnRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkJ1aWxkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbW1hbmRCdXR0b247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uQ29tbWFuZEdyb3VwMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuQ29udHJvbGxlckluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLk9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLlNlc3Npb25DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb24yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuUGFyY2VsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlByb2Nlc3M7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZXN1bHRSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5HdWFyZGVkQnk7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBNZWRpYVNlc3Npb24ySW1wbCBpbXBsZW1lbnRzIE1lZGlhU2Vzc2lvbjJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVNlc3Npb24yIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsvL0xvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb24yIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUlkOwotICAgIHByaXZhdGUgZmluYWwgRXhlY3V0b3IgbUNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXNzaW9uQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgIHByaXZhdGUgZmluYWwgTWVkaWFTZXNzaW9uMlN0dWIgbVNlc3Npb25TdHViOwotICAgIHByaXZhdGUgZmluYWwgU2Vzc2lvblRva2VuMiBtU2Vzc2lvblRva2VuOwotICAgIHByaXZhdGUgZmluYWwgQXVkaW9NYW5hZ2VyIG1BdWRpb01hbmFnZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQZW5kaW5nSW50ZW50IG1TZXNzaW9uQWN0aXZpdHk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQbGF5ZXJFdmVudENhbGxiYWNrIG1QbGF5ZXJFdmVudENhbGxiYWNrOwotICAgIHByaXZhdGUgZmluYWwgUGxheWxpc3RFdmVudENhbGxiYWNrIG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2s7Ci0KLSAgICAvLyBtUGxheWVyIGlzIHNldCB0byBudWxsIHdoZW4gdGhlIHNlc3Npb24gaXMgY2xvc2VkLCBhbmQgd2Ugc2hvdWxkbid0IHRocm93IGFuIGV4Y2VwdGlvbgotICAgIC8vIG5vciBsZWF2ZSBsb2cgYWx3YXlzIGZvciB1c2luZyBtUGxheWVyIHdoZW4gaXQncyBudWxsLiBIZXJlJ3MgdGhlIHJlYXNvbi4KLSAgICAvLyBXaGVuIGEgTWVkaWFTZXNzaW9uMiBpcyBjbG9zZWQsIHRoZXJlIGNvdWxkIGJlIGEgcGVuZGVkIG9wZXJhdGlvbiBpbiB0aGUgc2Vzc2lvbiBjYWxsYmFjawotICAgIC8vIGV4ZWN1dG9yIHRoYXQgbWF5IHdhbnQgdG8gYWNjZXNzIHRoZSBwbGF5ZXIuIEhlcmUncyB0aGUgc2FtcGxlIGNvZGUgc25pcHBldCBmb3IgdGhhdC4KLSAgICAvLwotICAgIC8vICAgcHVibGljIHZvaWQgb25Gb28oKSB7Ci0gICAgLy8gICAgIGlmIChtUGxheWVyID09IG51bGwpIHJldHVybjsgLy8gZmlyc3QgY2hlY2sKLSAgICAvLyAgICAgbVNlc3Npb25DYWxsYmFja0V4ZWN1dG9yLmV4ZWN1dG9yKCgpIC0+IHsKLSAgICAvLyAgICAgICAvLyBFcnJvci4gU2Vzc2lvbiBtYXkgYmUgY2xvc2VkIGFuZCBtUGxheWVyIGNhbiBiZSBudWxsIGhlcmUuCi0gICAgLy8gICAgICAgbVBsYXllci5mb28oKTsKLSAgICAvLyAgICAgfSk7Ci0gICAgLy8gICB9Ci0gICAgLy8KLSAgICAvLyBCeSBhZGRpbmcgcHJvdGVjdGl2ZSBjb2RlLCB3ZSBjYW4gYWxzbyBwcm90ZWN0IEFQSXMgZnJvbSBiZWluZyBjYWxsZWQgYWZ0ZXIgdGhlIGNsb3NlKCkKLSAgICAvLwotICAgIC8vIFRPRE8oamFld2FuKTogU2hvdWxkIHdlIHB1dCB2b2xhdGlsZSBoZXJlPwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE1lZGlhUGxheWVyQmFzZSBtUGxheWVyOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE1lZGlhUGxheWxpc3RBZ2VudCBtUGxheWxpc3RBZ2VudDsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBTZXNzaW9uUGxheWxpc3RBZ2VudCBtU2Vzc2lvblBsYXlsaXN0QWdlbnQ7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgVm9sdW1lUHJvdmlkZXIyIG1Wb2x1bWVQcm92aWRlcjsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBQbGF5YmFja0luZm8gbVBsYXliYWNrSW5mbzsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIG1Ec21IZWxwZXI7Ci0KLSAgICAvKioKLSAgICAgKiBDYW4gYmUgb25seSBjYWxsZWQgYnkgdGhlIHtAbGluayBCdWlsZGVyI2J1aWxkKCl9LgotICAgICAqIEBwYXJhbSBjb250ZXh0Ci0gICAgICogQHBhcmFtIHBsYXllcgotICAgICAqIEBwYXJhbSBpZAotICAgICAqIEBwYXJhbSBwbGF5bGlzdEFnZW50Ci0gICAgICogQHBhcmFtIHZvbHVtZVByb3ZpZGVyCi0gICAgICogQHBhcmFtIHNlc3Npb25BY3Rpdml0eQotICAgICAqIEBwYXJhbSBjYWxsYmFja0V4ZWN1dG9yCi0gICAgICogQHBhcmFtIGNhbGxiYWNrCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbjJJbXBsKENvbnRleHQgY29udGV4dCwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciwgU3RyaW5nIGlkLAotICAgICAgICAgICAgTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlciwKLSAgICAgICAgICAgIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5LAotICAgICAgICAgICAgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwgU2Vzc2lvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogS2VlcCBvdGhlciBwYXJhbXMuCi0gICAgICAgIG1JbnN0YW5jZSA9IGNyZWF0ZUluc3RhbmNlKCk7Ci0KLSAgICAgICAgLy8gQXJndW1lbnQgY2hlY2tzIGFyZSBkb25lIGJ5IGJ1aWxkZXIgYWxyZWFkeS4KLSAgICAgICAgLy8gSW5pdGlhbGl6ZSBmaW5hbHMgZmlyc3QuCi0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICBtQ2FsbGJhY2tFeGVjdXRvciA9IGNhbGxiYWNrRXhlY3V0b3I7Ci0gICAgICAgIG1TZXNzaW9uQWN0aXZpdHkgPSBzZXNzaW9uQWN0aXZpdHk7Ci0gICAgICAgIG1TZXNzaW9uU3R1YiA9IG5ldyBNZWRpYVNlc3Npb24yU3R1Yih0aGlzKTsKLSAgICAgICAgbUF1ZGlvTWFuYWdlciA9IChBdWRpb01hbmFnZXIpIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFVRElPX1NFUlZJQ0UpOwotICAgICAgICBtUGxheWVyRXZlbnRDYWxsYmFjayA9IG5ldyBNeVBsYXllckV2ZW50Q2FsbGJhY2sodGhpcyk7Ci0gICAgICAgIG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2sgPSBuZXcgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sodGhpcyk7Ci0KLSAgICAgICAgLy8gSW5mZXIgdHlwZSBmcm9tIHRoZSBpZCBhbmQgcGFja2FnZSBuYW1lLgotICAgICAgICBTdHJpbmcgbGlicmFyeVNlcnZpY2UgPSBnZXRTZXJ2aWNlTmFtZShjb250ZXh0LCBNZWRpYUxpYnJhcnlTZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwgaWQpOwotICAgICAgICBTdHJpbmcgc2Vzc2lvblNlcnZpY2UgPSBnZXRTZXJ2aWNlTmFtZShjb250ZXh0LCBNZWRpYVNlc3Npb25TZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwgaWQpOwotICAgICAgICBpZiAoc2Vzc2lvblNlcnZpY2UgIT0gbnVsbCAmJiBsaWJyYXJ5U2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBbWJpZ3VvdXMgc2Vzc2lvbiB0eXBlLiBNdWx0aXBsZSIKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNlc3Npb24gc2VydmljZXMgZGVmaW5lIHRoZSBzYW1lIGlkPSIgKyBpZCk7Ci0gICAgICAgIH0gZWxzZSBpZiAobGlicmFyeVNlcnZpY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgbVNlc3Npb25Ub2tlbiA9IG5ldyBTZXNzaW9uVG9rZW4ySW1wbChQcm9jZXNzLm15VWlkKCksIFRZUEVfTElCUkFSWV9TRVJWSUNFLAotICAgICAgICAgICAgICAgICAgICBtQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpLCBsaWJyYXJ5U2VydmljZSwgaWQsIG1TZXNzaW9uU3R1YikuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfSBlbHNlIGlmIChzZXNzaW9uU2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvblRva2VuID0gbmV3IFNlc3Npb25Ub2tlbjJJbXBsKFByb2Nlc3MubXlVaWQoKSwgVFlQRV9TRVNTSU9OX1NFUlZJQ0UsCi0gICAgICAgICAgICAgICAgICAgIG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCksIHNlc3Npb25TZXJ2aWNlLCBpZCwgbVNlc3Npb25TdHViKS5nZXRJbnN0YW5jZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVNlc3Npb25Ub2tlbiA9IG5ldyBTZXNzaW9uVG9rZW4ySW1wbChQcm9jZXNzLm15VWlkKCksIFRZUEVfU0VTU0lPTiwKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSwgbnVsbCwgaWQsIG1TZXNzaW9uU3R1YikuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHVwZGF0ZVBsYXllcihwbGF5ZXIsIHBsYXlsaXN0QWdlbnQsIHZvbHVtZVByb3ZpZGVyKTsKLQotICAgICAgICAvLyBBc2sgc2VydmVyIGZvciB0aGUgc2FuaXR5IGNoZWNrLCBhbmQgc3RhcnRzCi0gICAgICAgIC8vIFNhbml0eSBjaGVjayBmb3IgbWFraW5nIHNlc3Npb24gSUQgdW5pcXVlICdwZXIgcGFja2FnZScgY2Fubm90IGJlIGRvbmUgaW4gaGVyZS4KLSAgICAgICAgLy8gU2VydmVyIGNhbiBvbmx5IGtub3cgaWYgdGhlIHBhY2thZ2UgaGFzIGFub3RoZXIgcHJvY2VzcyBhbmQgaGFzIGFub3RoZXIgc2Vzc2lvbiB3aXRoIHRoZQotICAgICAgICAvLyBzYW1lIGlkLiBOb3RlIHRoYXQgJ0lEIGlzIHVuaXF1ZSBwZXIgcGFja2FnZScgaXMgaW1wb3J0YW50IGZvciBjb250cm9sbGVyIHRvIGRpc3Rpbmd1aXNoCi0gICAgICAgIC8vIGEgc2Vzc2lvbiBpbiBhbm90aGVyIHBhY2thZ2UuCi0gICAgICAgIE1lZGlhU2Vzc2lvbk1hbmFnZXIgbWFuYWdlciA9Ci0gICAgICAgICAgICAgICAgKE1lZGlhU2Vzc2lvbk1hbmFnZXIpIG1Db250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5NRURJQV9TRVNTSU9OX1NFUlZJQ0UpOwotICAgICAgICBpZiAoIW1hbmFnZXIuY3JlYXRlU2Vzc2lvbjIobVNlc3Npb25Ub2tlbikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlNlc3Npb24gd2l0aCB0aGUgc2FtZSBpZCBpcyBhbHJlYWR5IHVzZWQgYnkiCi0gICAgICAgICAgICAgICAgICAgICsgIiBhbm90aGVyIHByb2Nlc3MuIFVzZSBNZWRpYUNvbnRyb2xsZXIyIGluc3RlYWQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBNZWRpYVNlc3Npb24yIGNyZWF0ZUluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjIodGhpcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNlcnZpY2VOYW1lKENvbnRleHQgY29udGV4dCwgU3RyaW5nIHNlcnZpY2VBY3Rpb24sIFN0cmluZyBpZCkgewotICAgICAgICBQYWNrYWdlTWFuYWdlciBtYW5hZ2VyID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpOwotICAgICAgICBJbnRlbnQgc2VydmljZUludGVudCA9IG5ldyBJbnRlbnQoc2VydmljZUFjdGlvbik7Ci0gICAgICAgIHNlcnZpY2VJbnRlbnQuc2V0UGFja2FnZShjb250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICBMaXN0PFJlc29sdmVJbmZvPiBzZXJ2aWNlcyA9IG1hbmFnZXIucXVlcnlJbnRlbnRTZXJ2aWNlcyhzZXJ2aWNlSW50ZW50LAotICAgICAgICAgICAgICAgIFBhY2thZ2VNYW5hZ2VyLkdFVF9NRVRBX0RBVEEpOwotICAgICAgICBTdHJpbmcgc2VydmljZU5hbWUgPSBudWxsOwotICAgICAgICBpZiAoc2VydmljZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFN0cmluZyBzZXJ2aWNlSWQgPSBTZXNzaW9uVG9rZW4ySW1wbC5nZXRTZXNzaW9uSWQoc2VydmljZXMuZ2V0KGkpKTsKLSAgICAgICAgICAgICAgICBpZiAoc2VydmljZUlkICE9IG51bGwgJiYgVGV4dFV0aWxzLmVxdWFscyhpZCwgc2VydmljZUlkKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VydmljZXMuZ2V0KGkpLnNlcnZpY2VJbmZvID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2aWNlTmFtZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJBbWJpZ3VvdXMgc2Vzc2lvbiB0eXBlLiBNdWx0aXBsZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHNlc3Npb24gc2VydmljZXMgZGVmaW5lIHRoZSBzYW1lIGlkPSIgKyBpZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VydmljZU5hbWUgPSBzZXJ2aWNlcy5nZXQoaSkuc2VydmljZUluZm8ubmFtZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlcnZpY2VOYW1lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXllcl9pbXBsKEBOb25OdWxsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LAotICAgICAgICAgICAgVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyKSB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICBpZiAocGxheWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVBsYXllcihwbGF5ZXIsIHBsYXlsaXN0QWdlbnQsIHZvbHVtZVByb3ZpZGVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWVyKE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCwKLSAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlcikgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2Ugb2xkUGxheWVyOwotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgb2xkQWdlbnQ7Ci0gICAgICAgIGZpbmFsIFBsYXliYWNrSW5mbyBpbmZvID0gY3JlYXRlUGxheWJhY2tJbmZvKHZvbHVtZVByb3ZpZGVyLCBwbGF5ZXIuZ2V0QXVkaW9BdHRyaWJ1dGVzKCkpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBvbGRQbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICAgICAgb2xkQWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7Ci0gICAgICAgICAgICBpZiAoYWdlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudCA9IG5ldyBTZXNzaW9uUGxheWxpc3RBZ2VudCh0aGlzLCBtUGxheWVyKTsKLSAgICAgICAgICAgICAgICBpZiAobURzbUhlbHBlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudC5zZXRPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKG1Ec21IZWxwZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBhZ2VudCA9IG1TZXNzaW9uUGxheWxpc3RBZ2VudDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QbGF5bGlzdEFnZW50ID0gYWdlbnQ7Ci0gICAgICAgICAgICBtVm9sdW1lUHJvdmlkZXIgPSB2b2x1bWVQcm92aWRlcjsKLSAgICAgICAgICAgIG1QbGF5YmFja0luZm8gPSBpbmZvOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gb2xkUGxheWVyKSB7Ci0gICAgICAgICAgICBwbGF5ZXIucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKG1DYWxsYmFja0V4ZWN1dG9yLCBtUGxheWVyRXZlbnRDYWxsYmFjayk7Ci0gICAgICAgICAgICBpZiAob2xkUGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBXYXJuaW5nOiBQb29ybHkgaW1wbGVtZW50IHBsYXllciBtYXkgaWdub3JlIHRoaXMKLSAgICAgICAgICAgICAgICBvbGRQbGF5ZXIudW5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobVBsYXllckV2ZW50Q2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChhZ2VudCAhPSBvbGRBZ2VudCkgewotICAgICAgICAgICAgYWdlbnQucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2sobUNhbGxiYWNrRXhlY3V0b3IsIG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2spOwotICAgICAgICAgICAgaWYgKG9sZEFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBXYXJuaW5nOiBQb29ybHkgaW1wbGVtZW50IHBsYXllciBtYXkgaWdub3JlIHRoaXMKLSAgICAgICAgICAgICAgICBvbGRBZ2VudC51bnJlZ2lzdGVyUGxheWxpc3RFdmVudENhbGxiYWNrKG1QbGF5bGlzdEV2ZW50Q2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG9sZFBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UGxheWJhY2tJbmZvQ2hhbmdlZChpbmZvKTsKLSAgICAgICAgICAgIG5vdGlmeVBsYXllclVwZGF0ZWROb3RMb2NrZWQob2xkUGxheWVyKTsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IFJlcGVhdCB0aGUgc2FtZSB0aGluZyBmb3IgdGhlIHBsYXlsaXN0IGFnZW50LgotICAgIH0KLQotICAgIHByaXZhdGUgUGxheWJhY2tJbmZvIGNyZWF0ZVBsYXliYWNrSW5mbyhWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIsIEF1ZGlvQXR0cmlidXRlcyBhdHRycykgewotICAgICAgICBQbGF5YmFja0luZm8gaW5mbzsKLSAgICAgICAgaWYgKHZvbHVtZVByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIGludCBzdHJlYW07Ci0gICAgICAgICAgICBpZiAoYXR0cnMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IGF0dHJzLmdldFZvbHVtZUNvbnRyb2xTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBpZiAoc3RyZWFtID09IEF1ZGlvTWFuYWdlci5VU0VfREVGQVVMVF9TVFJFQU1fVFlQRSkgewotICAgICAgICAgICAgICAgICAgICAvLyBJdCBtYXkgaGFwcGVuIGlmIHRoZSBBdWRpb0F0dHJpYnV0ZXMgZG9lc24ndCBoYXZlIHVzYWdlLgotICAgICAgICAgICAgICAgICAgICAvLyBDaGFuZ2UgaXQgdG8gdGhlIFNUUkVBTV9NVVNJQyBiZWNhdXNlIGl0J3Mgbm90IHN1cHBvcnRlZCBieSBhdWRpbyBtYW5hZ2VyCi0gICAgICAgICAgICAgICAgICAgIC8vIGZvciBxdWVyeWluZyB2b2x1bWUgbGV2ZWwuCi0gICAgICAgICAgICAgICAgICAgIHN0cmVhbSA9IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5mbyA9IE1lZGlhQ29udHJvbGxlcjJJbXBsLlBsYXliYWNrSW5mb0ltcGwuY3JlYXRlUGxheWJhY2tJbmZvKAotICAgICAgICAgICAgICAgICAgICBQbGF5YmFja0luZm8uUExBWUJBQ0tfVFlQRV9MT0NBTCwKLSAgICAgICAgICAgICAgICAgICAgYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuaXNWb2x1bWVGaXhlZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBWb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfRklYRUQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFZvbHVtZVByb3ZpZGVyMi5WT0xVTUVfQ09OVFJPTF9BQlNPTFVURSwKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1NYXhWb2x1bWUoc3RyZWFtKSwKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5nZXRTdHJlYW1Wb2x1bWUoc3RyZWFtKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpbmZvID0gTWVkaWFDb250cm9sbGVyMkltcGwuUGxheWJhY2tJbmZvSW1wbC5jcmVhdGVQbGF5YmFja0luZm8oCi0gICAgICAgICAgICAgICAgICAgIFBsYXliYWNrSW5mby5QTEFZQkFDS19UWVBFX1JFTU9URSAvKiBDb250cm9sVHlwZSAqLywKLSAgICAgICAgICAgICAgICAgICAgYXR0cnMsCi0gICAgICAgICAgICAgICAgICAgIHZvbHVtZVByb3ZpZGVyLmdldENvbnRyb2xUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgIHZvbHVtZVByb3ZpZGVyLmdldE1heFZvbHVtZSgpLAotICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5nZXRDdXJyZW50Vm9sdW1lKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbmZvOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsb3NlX2ltcGwoKSB7Ci0gICAgICAgIC8vIFN0b3Agc3lzdGVtIHNlcnZpY2UgZnJvbSBsaXN0ZW5pbmcgdGhpcyBzZXNzaW9uIGZpcnN0LgotICAgICAgICBNZWRpYVNlc3Npb25NYW5hZ2VyIG1hbmFnZXIgPQotICAgICAgICAgICAgICAgIChNZWRpYVNlc3Npb25NYW5hZ2VyKSBtQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuTUVESUFfU0VTU0lPTl9TRVJWSUNFKTsKLSAgICAgICAgbWFuYWdlci5kZXN0cm95U2Vzc2lvbjIobVNlc3Npb25Ub2tlbik7Ci0KLSAgICAgICAgaWYgKG1TZXNzaW9uU3R1YiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJzZXNzaW9uIGlzIG5vdyB1bmF2YWlsYWJsZSwgaWQ9IiArIG1JZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBJbnZhbGlkYXRlIHByZXZpb3VzbHkgcHVibGlzaGVkIHNlc3Npb24gc3R1Yi4KLSAgICAgICAgICAgIG1TZXNzaW9uU3R1Yi5kZXN0cm95Tm90TG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllcjsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50OwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICAgICAgbVBsYXllciA9IG51bGw7Ci0gICAgICAgICAgICBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICAgICAgbVBsYXlsaXN0QWdlbnQgPSBudWxsOwotICAgICAgICAgICAgbVNlc3Npb25QbGF5bGlzdEFnZW50ID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBpZiAocGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHBsYXllci51bnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhtUGxheWVyRXZlbnRDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnVucmVnaXN0ZXJQbGF5bGlzdEV2ZW50Q2FsbGJhY2sobVBsYXlsaXN0RXZlbnRDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFQbGF5ZXJCYXNlIGdldFBsYXllcl9pbXBsKCkgewotICAgICAgICByZXR1cm4gZ2V0UGxheWVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhUGxheWxpc3RBZ2VudCBnZXRQbGF5bGlzdEFnZW50X2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtUGxheWxpc3RBZ2VudDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVm9sdW1lUHJvdmlkZXIyIGdldFZvbHVtZVByb3ZpZGVyX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtVm9sdW1lUHJvdmlkZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjIgZ2V0VG9rZW5faW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uVG9rZW47Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8Q29udHJvbGxlckluZm8+IGdldENvbm5lY3RlZENvbnRyb2xsZXJzX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvblN0dWIuZ2V0Q29udHJvbGxlcnMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0ZvY3VzUmVxdWVzdF9pbXBsKEF1ZGlvRm9jdXNSZXF1ZXN0IGFmcikgewotICAgICAgICAvLyBpbXBsZW1lbnQKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwbGF5X2ltcGwoKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnBsYXkoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBhdXNlX2ltcGwoKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnBhdXNlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdG9wX2ltcGwoKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnJlc2V0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2tpcFRvUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2tpcFRvUHJldmlvdXNJdGVtX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbV9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDdXN0b21MYXlvdXRfaW1wbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgQE5vbk51bGwgTGlzdDxDb21tYW5kQnV0dG9uPiBsYXlvdXQpIHsKLSAgICAgICAgZW5zdXJlQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGxheW91dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsYXlvdXQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5Q3VzdG9tTGF5b3V0Tm90TG9ja2VkKGNvbnRyb2xsZXIsIGxheW91dCk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudCBmb2xsb3dzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEFsbG93ZWRDb21tYW5kc19pbXBsKEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsCi0gICAgICAgICAgICBATm9uTnVsbCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBjb21tYW5kcykgewotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbW1hbmRzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmRzIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlc3Npb25TdHViLnNldEFsbG93ZWRDb21tYW5kcyhjb250cm9sbGVyLCBjb21tYW5kcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmRfaW1wbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIEJ1bmRsZSBhcmdzLCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICBpZiAoY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250cm9sbGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5zZW5kQ3VzdG9tQ29tbWFuZChjb250cm9sbGVyLCBjb21tYW5kLCBhcmdzLCByZWNlaXZlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmRfaW1wbChATm9uTnVsbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCwgQnVuZGxlIGFyZ3MpIHsKLSAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5zZW5kQ3VzdG9tQ29tbWFuZChjb21tYW5kLCBhcmdzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdF9pbXBsKEBOb25OdWxsIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibGlzdCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5zZXRQbGF5bGlzdChsaXN0LCBtZXRhZGF0YSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhX2ltcGwoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC51cGRhdGVQbGF5bGlzdE1ldGFkYXRhKG1ldGFkYXRhKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZFBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LmFkZFBsYXlsaXN0SXRlbShpbmRleCwgaXRlbSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW1faW1wbChATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWxpc3RBZ2VudCBhZ2VudCA9IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBpZiAoYWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgYWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbV9pbXBsKGludCBpbmRleCwgQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImluZGV4IHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFnZW50LnJlcGxhY2VQbGF5bGlzdEl0ZW0oaW5kZXgsIGl0ZW0pOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3RfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0UGxheWxpc3QoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTIgZ2V0UGxheWxpc3RNZXRhZGF0YV9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhZ2VudC5nZXRQbGF5bGlzdE1ldGFkYXRhKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhSXRlbTIgZ2V0Q3VycmVudFBsYXlsaXN0SXRlbV9pbXBsKCkgewotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEltcGxlbWVudAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGVfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gYWdlbnQuZ2V0UmVwZWF0TW9kZSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlX2ltcGwoaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5zZXRSZXBlYXRNb2RlKHJlcGVhdE1vZGUpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRTaHVmZmxlTW9kZV9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBtUGxheWxpc3RBZ2VudDsKLSAgICAgICAgaWYgKGFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBhZ2VudC5nZXRTaHVmZmxlTW9kZSgpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U2h1ZmZsZU1vZGVfaW1wbChpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5bGlzdEFnZW50IGFnZW50ID0gbVBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIGlmIChhZ2VudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBhZ2VudC5zZXRTaHVmZmxlTW9kZShzaHVmZmxlTW9kZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwcmVwYXJlX2ltcGwoKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnByZXBhcmUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlZWtUb19pbXBsKGxvbmcgcG9zKSB7Ci0gICAgICAgIGVuc3VyZUNhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcGxheWVyLnNlZWtUbyhwb3MpOwotICAgICAgICB9IGVsc2UgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJBUEkgY2FsbHMgYWZ0ZXIgdGhlIGNsb3NlKCkiLCBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEBQbGF5ZXJTdGF0ZSBpbnQgZ2V0UGxheWVyU3RhdGVfaW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXIuZ2V0UGxheWVyU3RhdGUoKTsKLSAgICAgICAgfSBlbHNlIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiQVBJIGNhbGxzIGFmdGVyIHRoZSBjbG9zZSgpIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gTWVkaWFQbGF5ZXJCYXNlLlBMQVlFUl9TVEFURV9FUlJPUjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50UG9zaXRpb25faW1wbCgpIHsKLSAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllciA9IG1QbGF5ZXI7Ci0gICAgICAgIGlmIChwbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG1QbGF5ZXIuZ2V0Q3VycmVudFBvc2l0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWVyQmFzZS5VTktOT1dOX1RJTUU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgZ2V0QnVmZmVyZWRQb3NpdGlvbl9pbXBsKCkgewotICAgICAgICBmaW5hbCBNZWRpYVBsYXllckJhc2UgcGxheWVyID0gbVBsYXllcjsKLSAgICAgICAgaWYgKHBsYXllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXllci5nZXRCdWZmZXJlZFBvc2l0aW9uKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIkFQSSBjYWxscyBhZnRlciB0aGUgY2xvc2UoKSIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIE1lZGlhUGxheWVyQmFzZS5VTktOT1dOX1RJTUU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgbm90aWZ5RXJyb3JfaW1wbChpbnQgZXJyb3JDb2RlLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG1TZXNzaW9uU3R1Yi5ub3RpZnlFcnJvcihlcnJvckNvZGUsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcl9pbXBsKEBOb25OdWxsIE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgaGVscGVyKSB7Ci0gICAgICAgIGlmIChoZWxwZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaGVscGVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbURzbUhlbHBlciA9IGhlbHBlcjsKLSAgICAgICAgICAgIGlmIChtU2Vzc2lvblBsYXlsaXN0QWdlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZXNzaW9uUGxheWxpc3RBZ2VudC5zZXRPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKGhlbHBlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbGVhck9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXJfaW1wbCgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbURzbUhlbHBlciA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobVNlc3Npb25QbGF5bGlzdEFnZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2Vzc2lvblBsYXlsaXN0QWdlbnQuY2xlYXJPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBQcm90ZWN0ZWQgb3IgcHJpdmF0ZSBtZXRob2RzCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICAvLyBFbmZvcmNlcyBkZXZlbG9wZXJzIHRvIGNhbGwgYWxsIHRoZSBtZXRob2RzIG9uIHRoZSBpbml0aWFsbHkgZ2l2ZW4gdGhyZWFkCi0gICAgLy8gYmVjYXVzZSBjYWxscyBmcm9tIHRoZSBNZWRpYUNvbnRyb2xsZXIyIHdpbGwgYmUgcnVuIG9uIHRoZSB0aHJlYWQuCi0gICAgLy8gVE9ETyhqYWV3YW4pOiBTaG91bGQgd2UgYWxsb3cgY2FsbHMgZnJvbSB0aGUgbXVsdGlwbGUgdGhyZWFkPwotICAgIC8vICAgICAgICAgICAgICAgSSBwcmVmZXIgdGhpcyB3YXkgYmVjYXVzZSBhbGxvd2luZyBtdWx0aXBsZSB0aHJlYWQgbWF5IGNhc2UgdHJpY2t5IGlzc3VlIGxpa2UKLSAgICAvLyAgICAgICAgICAgICAgIGIvNjM0NDYzNjAuIElmIHRoZSB7QGxpbmsgI3NldFBsYXllcigpfSB3aXRoIHtAY29kZSBudWxsfSBjYW4gYmUgY2FsbGVkIGZyb20KLSAgICAvLyAgICAgICAgICAgICAgIGFub3RoZXIgdGhyZWFkLCB0cmFuc3BvcnQgY29udHJvbHMgY2FuIGJlIGNhbGxlZCBhZnRlciB0aGF0LgotICAgIC8vICAgICAgICAgICAgICAgVGhhdCdzIGJhc2ljYWxseSB0aGUgZGV2ZWxvcGVyJ3MgbWlzdGFrZSwgYnV0IHRoZXkgY2Fubm90IHVuZGVyc3RhbmQgd2hhdCdzCi0gICAgLy8gICAgICAgICAgICAgICBoYXBwZW5pbmcgYmVoaW5kIHVudGlsIHdlIHRlbGwgdGhlbSBzby4KLSAgICAvLyAgICAgICAgICAgICAgIElmIGVuZm9yY2luZyBjYWxsbGluZyB0aHJlYWQgZG9lc24ndCBsb29rIGdvb2QsIHdlIGNhbiBhbHRlcm5hdGl2ZWx5IHBpY2sKLSAgICAvLyAgICAgICAgICAgICAgIDEuIEFsbG93IGNhbGxzIGZyb20gcmFuZG9tIHRocmVhZHMgZm9yIGFsbCBtZXRob2RzLgotICAgIC8vICAgICAgICAgICAgICAgMi4gQWxsb3cgY2FsbHMgZnJvbSByYW5kb20gdGhyZWFkcyBmb3IgYWxsIG1ldGhvZHMsIGV4Y2VwdCBmb3IgdGhlCi0gICAgLy8gICAgICAgICAgICAgICAgICB7QGxpbmsgI3NldFBsYXllcigpfS4KLSAgICB2b2lkIGVuc3VyZUNhbGxpbmdUaHJlYWQoKSB7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogVW5jb21tZW50IG9yIHJlbW92ZQotICAgICAgICAvKgotICAgICAgICBpZiAobUhhbmRsZXIuZ2V0TG9vcGVyKCkgIT0gTG9vcGVyLm15TG9vcGVyKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJ1biB0aGlzIG9uIHRoZSBnaXZlbiB0aHJlYWQiKTsKLSAgICAgICAgfSovCi0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGlmIChwbGF5bGlzdEFnZW50ICE9IG1QbGF5bGlzdEFnZW50KSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgY2FsbHMgZnJvbSB0aGUgb2xkIGFnZW50LgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIGxpc3QsIG1ldGFkYXRhKTsKLSAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXlsaXN0Q2hhbmdlZE5vdExvY2tlZChsaXN0LCBtZXRhZGF0YSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkT25FeGVjdXRvcihNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGlmIChwbGF5bGlzdEFnZW50ICE9IG1QbGF5bGlzdEFnZW50KSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmUgY2FsbHMgZnJvbSB0aGUgb2xkIGFnZW50LgotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1DYWxsYmFjay5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1JbnN0YW5jZSwgcGxheWxpc3RBZ2VudCwgbWV0YWRhdGEpOwotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWROb3RMb2NrZWQobWV0YWRhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlSZXBlYXRNb2RlQ2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICBpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBpZiAocGxheWxpc3RBZ2VudCAhPSBtUGxheWxpc3RBZ2VudCkgewotICAgICAgICAgICAgLy8gSWdub3JlIGNhbGxzIGZyb20gdGhlIG9sZCBhZ2VudC4KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtQ2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZChtSW5zdGFuY2UsIHBsYXlsaXN0QWdlbnQsIHJlcGVhdE1vZGUpOwotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UmVwZWF0TW9kZUNoYW5nZWROb3RMb2NrZWQocmVwZWF0TW9kZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZE9uRXhlY3V0b3IoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICBpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgaWYgKHBsYXlsaXN0QWdlbnQgIT0gbVBsYXlsaXN0QWdlbnQpIHsKLSAgICAgICAgICAgIC8vIElnbm9yZSBjYWxscyBmcm9tIHRoZSBvbGQgYWdlbnQuCi0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgbUNhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkKG1JbnN0YW5jZSwgcGxheWxpc3RBZ2VudCwgc2h1ZmZsZU1vZGUpOwotICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkTm90TG9ja2VkKHNodWZmbGVNb2RlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5UGxheWVyVXBkYXRlZE5vdExvY2tlZChNZWRpYVBsYXllckJhc2Ugb2xkUGxheWVyKSB7Ci0gICAgICAgIGZpbmFsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIgPSBtUGxheWVyOwotICAgICAgICAvLyBUT0RPKGphZXdhbik6IChDYW4gYmUgcG9zdC1QKSBGaW5kIGJldHRlciB3YXkgZm9yIHBsYXllci5nZXRQbGF5ZXJTdGF0ZSgpIC8vCi0gICAgICAgIC8vICAgICAgICAgICAgICAgSW4gdGhlb3J5LCBTZXNzaW9uLmdldFhYWCgpIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgUGxheWVyLmdldFhYWCgpCi0gICAgICAgIC8vICAgICAgICAgICAgICAgYW5kIHdlIHNob3VsZCBub3RpZnkgaW5mb3JtYXRpb24gb2YgdGhlIHNlc3Npb24uZ2V0WFhYKCkgaW5zdGVhZCBvZgotICAgICAgICAvLyAgICAgICAgICAgICAgIHBsYXllci5nZXRYWFgoKQotICAgICAgICAvLyBOb3RpZnkgdG8gY29udHJvbGxlcnMgYXMgd2VsbC4KLSAgICAgICAgZmluYWwgaW50IHN0YXRlID0gcGxheWVyLmdldFBsYXllclN0YXRlKCk7Ci0gICAgICAgIGlmIChzdGF0ZSAhPSBvbGRQbGF5ZXIuZ2V0UGxheWVyU3RhdGUoKSkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBsYXllclN0YXRlQ2hhbmdlZE5vdExvY2tlZChzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBsb25nIGN1cnJlbnRUaW1lTXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgZmluYWwgbG9uZyBwb3NpdGlvbiA9IHBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKTsKLSAgICAgICAgaWYgKHBvc2l0aW9uICE9IG9sZFBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKSkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeVBvc2l0aW9uQ2hhbmdlZE5vdExvY2tlZChjdXJyZW50VGltZU1zLCBwb3NpdGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBmbG9hdCBzcGVlZCA9IHBsYXllci5nZXRQbGF5YmFja1NwZWVkKCk7Ci0gICAgICAgIGlmIChzcGVlZCAhPSBvbGRQbGF5ZXIuZ2V0UGxheWJhY2tTcGVlZCgpKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvblN0dWIubm90aWZ5UGxheWJhY2tTcGVlZENoYW5nZWROb3RMb2NrZWQoc3BlZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uID0gcGxheWVyLmdldEJ1ZmZlcmVkUG9zaXRpb24oKTsKLSAgICAgICAgaWYgKGJ1ZmZlcmVkUG9zaXRpb24gIT0gb2xkUGxheWVyLmdldEJ1ZmZlcmVkUG9zaXRpb24oKSkgewotICAgICAgICAgICAgbVNlc3Npb25TdHViLm5vdGlmeUJ1ZmZlcmVkUG9zaXRpb25DaGFuZ2VkTm90TG9ja2VkKGJ1ZmZlcmVkUG9zaXRpb24pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQ29udGV4dCBnZXRDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gbUNvbnRleHQ7Ci0gICAgfQotCi0gICAgTWVkaWFTZXNzaW9uMiBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBNZWRpYVBsYXllckJhc2UgZ2V0UGxheWVyKCkgewotICAgICAgICByZXR1cm4gbVBsYXllcjsKLSAgICB9Ci0KLSAgICBNZWRpYVBsYXlsaXN0QWdlbnQgZ2V0UGxheWxpc3RBZ2VudCgpIHsKLSAgICAgICAgcmV0dXJuIG1QbGF5bGlzdEFnZW50OwotICAgIH0KLQotICAgIEV4ZWN1dG9yIGdldENhbGxiYWNrRXhlY3V0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtQ2FsbGJhY2tFeGVjdXRvcjsKLSAgICB9Ci0KLSAgICBTZXNzaW9uQ2FsbGJhY2sgZ2V0Q2FsbGJhY2soKSB7Ci0gICAgICAgIHJldHVybiBtQ2FsbGJhY2s7Ci0gICAgfQotCi0gICAgTWVkaWFTZXNzaW9uMlN0dWIgZ2V0U2Vzc2lvblN0dWIoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvblN0dWI7Ci0gICAgfQotCi0gICAgVm9sdW1lUHJvdmlkZXIyIGdldFZvbHVtZVByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbVZvbHVtZVByb3ZpZGVyOwotICAgIH0KLQotICAgIFBsYXliYWNrSW5mbyBnZXRQbGF5YmFja0luZm8oKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tJbmZvOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgUGVuZGluZ0ludGVudCBnZXRTZXNzaW9uQWN0aXZpdHkoKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbkFjdGl2aXR5OwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE15UGxheWVyRXZlbnRDYWxsYmFjayBleHRlbmRzIFBsYXllckV2ZW50Q2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFTZXNzaW9uMkltcGw+IG1TZXNzaW9uOwotCi0gICAgICAgIHByaXZhdGUgTXlQbGF5ZXJFdmVudENhbGxiYWNrKE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24pIHsKLSAgICAgICAgICAgIG1TZXNzaW9uID0gbmV3IFdlYWtSZWZlcmVuY2U8PihzZXNzaW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgbXBiLCBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsIHx8IGRzZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gZ2V0TWVkaWFJdGVtKHNlc3Npb24sIGRzZCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkN1cnJlbnRNZWRpYUl0ZW1DaGFuZ2VkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBpdGVtKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIChqYWV3YW4pOiBOb3RpZnkgY29udHJvbGxlcnMgdGhyb3VnaCBhcHByb3ByaWF0ZSBjYWxsYmFjay4gKGIvNzQ1MDU5MzYpCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbk1lZGlhUHJlcGFyZWQoTWVkaWFQbGF5ZXJCYXNlIG1wYiwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCB8fCBkc2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2tFeGVjdXRvcigpLmV4ZWN1dGUoKCkgLT4gewotICAgICAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IGdldE1lZGlhSXRlbShzZXNzaW9uLCBkc2QpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25NZWRpYVByZXBhcmVkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBpdGVtKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIChqYWV3YW4pOiBOb3RpZnkgY29udHJvbGxlcnMgdGhyb3VnaCBhcHByb3ByaWF0ZSBjYWxsYmFjay4gKGIvNzQ1MDU5MzYpCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgbXBiLCBpbnQgc3RhdGUpIHsKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uUGxheWVyU3RhdGVDaGFuZ2VkKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgbXBiLCBzdGF0ZSk7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRTZXNzaW9uU3R1YigpLm5vdGlmeVBsYXllclN0YXRlQ2hhbmdlZE5vdExvY2tlZChzdGF0ZSk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkJ1ZmZlcmluZ1N0YXRlQ2hhbmdlZChNZWRpYVBsYXllckJhc2UgbXBiLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCBzdGF0ZSkgewotICAgICAgICAgICAgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgZHNkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBnZXRNZWRpYUl0ZW0oc2Vzc2lvbiwgZHNkKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uQnVmZmVyaW5nU3RhdGVDaGFuZ2VkKAotICAgICAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBtcGIsIGl0ZW0sIHN0YXRlKTsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIChqYWV3YW4pOiBOb3RpZnkgY29udHJvbGxlcnMgdGhyb3VnaCBhcHByb3ByaWF0ZSBjYWxsYmFjay4gKGIvNzQ1MDU5MzYpCi0gICAgICAgICAgICB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMkltcGwgZ2V0U2Vzc2lvbigpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgJiYgREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGlzIGNsb3NlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2Vzc2lvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgTWVkaWFJdGVtMiBnZXRNZWRpYUl0ZW0oTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICBNZWRpYVBsYXlsaXN0QWdlbnQgYWdlbnQgPSBzZXNzaW9uLmdldFBsYXlsaXN0QWdlbnQoKTsKLSAgICAgICAgICAgIGlmIChhZ2VudCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlNlc3Npb24gaXMgY2xvc2VkIiwgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBhZ2VudC5nZXRNZWRpYUl0ZW0oZHNkKTsKLSAgICAgICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ291bGQgbm90IGZpbmQgbWF0Y2hpbmcgaXRlbSBmb3IgZHNkPSIgKyBkc2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE5vU3VjaEVsZW1lbnRFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGl0ZW07Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayBleHRlbmRzIFBsYXlsaXN0RXZlbnRDYWxsYmFjayB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYVNlc3Npb24ySW1wbD4gbVNlc3Npb247Ci0KLSAgICAgICAgcHJpdmF0ZSBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayhNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uKSB7Ci0gICAgICAgICAgICBtU2Vzc2lvbiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oc2Vzc2lvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5bGlzdENoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCwKLSAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24ubm90aWZ5UGxheWxpc3RDaGFuZ2VkT25FeGVjdXRvcihwbGF5bGlzdEFnZW50LCBsaXN0LCBtZXRhZGF0YSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwKLSAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24ubm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWRPbkV4ZWN1dG9yKHBsYXlsaXN0QWdlbnQsIG1ldGFkYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJlcGVhdE1vZGVDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24ubm90aWZ5UmVwZWF0TW9kZUNoYW5nZWRPbkV4ZWN1dG9yKHBsYXlsaXN0QWdlbnQsIHJlcGVhdE1vZGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2h1ZmZsZU1vZGVDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBpbnQgc2h1ZmZsZU1vZGUpIHsKLSAgICAgICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBtU2Vzc2lvbi5nZXQoKTsKLSAgICAgICAgICAgIGlmIChzZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLm5vdGlmeVNodWZmbGVNb2RlQ2hhbmdlZE9uRXhlY3V0b3IocGxheWxpc3RBZ2VudCwgc2h1ZmZsZU1vZGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBDb21tYW5kSW1wbCBpbXBsZW1lbnRzIENvbW1hbmRQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORF9DT0RFCi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kLmNvbW1hbmRfY29kZSI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORF9DVVNUT01fQ09NTUFORAotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZC5jdXN0b21fY29tbWFuZCI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORF9FWFRSQVMKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmQuZXh0cmFzIjsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Db21tYW5kMiBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1Db21tYW5kQ29kZTsKLSAgICAgICAgLy8gTm9ubnVsbCBpZiBpdCdzIGN1c3RvbSBjb21tYW5kCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1DdXN0b21Db21tYW5kOwotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtRXh0cmFzOwotCi0gICAgICAgIHB1YmxpYyBDb21tYW5kSW1wbChTZXNzaW9uQ29tbWFuZDIgaW5zdGFuY2UsIGludCBjb21tYW5kQ29kZSkgewotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtQ29tbWFuZENvZGUgPSBjb21tYW5kQ29kZTsKLSAgICAgICAgICAgIG1DdXN0b21Db21tYW5kID0gbnVsbDsKLSAgICAgICAgICAgIG1FeHRyYXMgPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbW1hbmRJbXBsKFNlc3Npb25Db21tYW5kMiBpbnN0YW5jZSwgQE5vbk51bGwgU3RyaW5nIGFjdGlvbiwKLSAgICAgICAgICAgICAgICBATnVsbGFibGUgQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgaWYgKGFjdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYWN0aW9uIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIG1Db21tYW5kQ29kZSA9IENPTU1BTkRfQ09ERV9DVVNUT007Ci0gICAgICAgICAgICBtQ3VzdG9tQ29tbWFuZCA9IGFjdGlvbjsKLSAgICAgICAgICAgIG1FeHRyYXMgPSBleHRyYXM7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb21tYW5kQ29kZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db21tYW5kQ29kZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQE51bGxhYmxlIFN0cmluZyBnZXRDdXN0b21Db21tYW5kX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUN1c3RvbUNvbW1hbmQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZSBCdW5kbGUgZ2V0RXh0cmFzX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUV4dHJhczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIGEgbmV3IEJ1bmRsZSBpbnN0YW5jZSBmcm9tIHRoZSBDb21tYW5kCi0gICAgICAgICAqLwotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgewotICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX0NPTU1BTkRfQ09ERSwgbUNvbW1hbmRDb2RlKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX0NPTU1BTkRfQ1VTVE9NX0NPTU1BTkQsIG1DdXN0b21Db21tYW5kKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRCdW5kbGUoS0VZX0NPTU1BTkRfRVhUUkFTLCBtRXh0cmFzKTsKLSAgICAgICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBhIG5ldyBDb21tYW5kIGluc3RhbmNlIGZyb20gdGhlIEJ1bmRsZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBTZXNzaW9uQ29tbWFuZDIgZnJvbUJ1bmRsZV9pbXBsKEBOb25OdWxsIEJ1bmRsZSBjb21tYW5kKSB7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY29tbWFuZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IGNvZGUgPSBjb21tYW5kLmdldEludChLRVlfQ09NTUFORF9DT0RFKTsKLSAgICAgICAgICAgIGlmIChjb2RlICE9IENPTU1BTkRfQ09ERV9DVVNUT00pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFNlc3Npb25Db21tYW5kMihjb2RlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGN1c3RvbUNvbW1hbmQgPSBjb21tYW5kLmdldFN0cmluZyhLRVlfQ09NTUFORF9DVVNUT01fQ09NTUFORCk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1c3RvbUNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uQ29tbWFuZDIoY3VzdG9tQ29tbWFuZCwgY29tbWFuZC5nZXRCdW5kbGUoS0VZX0NPTU1BTkRfRVhUUkFTKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzX2ltcGwoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQ29tbWFuZEltcGwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29tbWFuZEltcGwgb3RoZXIgPSAoQ29tbWFuZEltcGwpIG9iajsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogQ29tcGFyZSBDb21tYW5kcyB3aXRoIHRoZSBnZW5lcmF0ZWQgVVVJRCwgYXMgd2UncmUgZG9pbmcgZm9yIHRoZSBNSTIuCi0gICAgICAgICAgICByZXR1cm4gbUNvbW1hbmRDb2RlID09IG90aGVyLm1Db21tYW5kQ29kZQotICAgICAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuZXF1YWxzKG1DdXN0b21Db21tYW5kLCBvdGhlci5tQ3VzdG9tQ29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgewotICAgICAgICAgICAgZmluYWwgaW50IHByaW1lID0gMzE7Ci0gICAgICAgICAgICByZXR1cm4gKChtQ3VzdG9tQ29tbWFuZCAhPSBudWxsKQotICAgICAgICAgICAgICAgICAgICA/IG1DdXN0b21Db21tYW5kLmhhc2hDb2RlKCkgOiAwKSAqIHByaW1lICsgbUNvbW1hbmRDb2RlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwcmVzZW50IHNldCBvZiB7QGxpbmsgU2Vzc2lvbkNvbW1hbmQyfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbW1hbmRHcm91cEltcGwgaW1wbGVtZW50cyBDb21tYW5kR3JvdXBQcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NTUFORFMgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLm1lZGlhc2Vzc2lvbjIuY29tbWFuZGdyb3VwLmNvbW1hbmRzIjsKLQotICAgICAgICAvLyBQcmVmaXggZm9yIGFsbCBjb21tYW5kIGNvZGVzCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQ09NTUFORF9DT0RFID0gIkNPTU1BTkRfQ09ERV8iOwotCi0gICAgICAgIC8vIFByZWZpeCBmb3IgY29tbWFuZCBjb2RlcyB0aGF0IHdpbGwgYmUgc2VudCBkaXJlY3RseSB0byB0aGUgTWVkaWFQbGF5ZXJCYXNlCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQ09NTUFORF9DT0RFX1BMQVlCQUNLID0gIkNPTU1BTkRfQ09ERV9QTEFZQkFDS18iOwotCi0gICAgICAgIC8vIFByZWZpeCBmb3IgY29tbWFuZCBjb2RlcyB0aGF0IHdpbGwgYmUgc2VudCBkaXJlY3RseSB0byB0aGUgTWVkaWFQbGF5bGlzdEFnZW50Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBQUkVGSVhfQ09NTUFORF9DT0RFX1BMQVlMSVNUID0gIkNPTU1BTkRfQ09ERV9QTEFZTElTVF8iOwotCi0gICAgICAgIHByaXZhdGUgU2V0PFNlc3Npb25Db21tYW5kMj4gbUNvbW1hbmRzID0gbmV3IEhhc2hTZXQ8PigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Db21tYW5kR3JvdXAyIG1JbnN0YW5jZTsKLQotICAgICAgICBwdWJsaWMgQ29tbWFuZEdyb3VwSW1wbChTZXNzaW9uQ29tbWFuZEdyb3VwMiBpbnN0YW5jZSwgT2JqZWN0IG90aGVyKSB7Ci0gICAgICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgICAgIGlmIChvdGhlciAhPSBudWxsICYmIG90aGVyIGluc3RhbmNlb2YgQ29tbWFuZEdyb3VwSW1wbCkgewotICAgICAgICAgICAgICAgIG1Db21tYW5kcy5hZGRBbGwoKChDb21tYW5kR3JvdXBJbXBsKSBvdGhlcikubUNvbW1hbmRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBDb21tYW5kR3JvdXBJbXBsKCkgewotICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IFNlc3Npb25Db21tYW5kR3JvdXAyKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGFkZENvbW1hbmRfaW1wbChATm9uTnVsbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgewotICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Db21tYW5kcy5hZGQoY29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYWRkQWxsUHJlZGVmaW5lZENvbW1hbmRzX2ltcGwoKSB7Ci0gICAgICAgICAgICBhZGRDb21tYW5kc1dpdGhQcmVmaXgoUFJFRklYX0NPTU1BTkRfQ09ERSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFkZEFsbFBsYXliYWNrQ29tbWFuZHMoKSB7Ci0gICAgICAgICAgICBhZGRDb21tYW5kc1dpdGhQcmVmaXgoUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZQkFDSyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGFkZEFsbFBsYXlsaXN0Q29tbWFuZHMoKSB7Ci0gICAgICAgICAgICBhZGRDb21tYW5kc1dpdGhQcmVmaXgoUFJFRklYX0NPTU1BTkRfQ09ERV9QTEFZTElTVCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgYWRkQ29tbWFuZHNXaXRoUHJlZml4KFN0cmluZyBwcmVmaXgpIHsKLSAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogKENhbiBiZSBwb3N0LVApOiBEb24ndCB1c2UgcmVmbGVjdGlvbiBmb3IgdGhpcyBwdXJwb3NlLgotICAgICAgICAgICAgZmluYWwgRmllbGRbXSBmaWVsZHMgPSBNZWRpYVNlc3Npb24yLmNsYXNzLmdldEZpZWxkcygpOwotICAgICAgICAgICAgaWYgKGZpZWxkcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGZpZWxkc1tpXS5nZXROYW1lKCkuc3RhcnRzV2l0aChwcmVmaXgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db21tYW5kcy5hZGQobmV3IFNlc3Npb25Db21tYW5kMihmaWVsZHNbaV0uZ2V0SW50KG51bGwpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJVbmV4cGVjdGVkICIgKyBmaWVsZHNbaV0gKyAiIGluIE1lZGlhU2Vzc2lvbjIiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmVDb21tYW5kX2ltcGwoQE5vbk51bGwgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQpIHsKLSAgICAgICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29tbWFuZHMucmVtb3ZlKGNvbW1hbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc0NvbW1hbmRfaW1wbChATm9uTnVsbCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgewotICAgICAgICAgICAgaWYgKGNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtQ29tbWFuZHMuY29udGFpbnMoY29tbWFuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaGFzQ29tbWFuZF9pbXBsKGludCBjb2RlKSB7Ci0gICAgICAgICAgICBpZiAoY29kZSA9PSBDT01NQU5EX0NPREVfQ1VTVE9NKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVXNlIGhhc0NvbW1hbmQoQ29tbWFuZCkgZm9yIGN1c3RvbSBjb21tYW5kIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKFNlc3Npb25Db21tYW5kMiBjb21tYW5kIDogbUNvbW1hbmRzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQuZ2V0Q29tbWFuZENvZGUoKSA9PSBjb2RlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU2V0PFNlc3Npb25Db21tYW5kMj4gZ2V0Q29tbWFuZHNfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRDb21tYW5kcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNldDxTZXNzaW9uQ29tbWFuZDI+IGdldENvbW1hbmRzKCkgewotICAgICAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChtQ29tbWFuZHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEByZXR1cm4gbmV3IGJ1bmRsZSBmcm9tIHRoZSBDb21tYW5kR3JvdXAKLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQnVuZGxlIHRvQnVuZGxlX2ltcGwoKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8QnVuZGxlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgICAgICBmb3IgKFNlc3Npb25Db21tYW5kMiBjb21tYW5kIDogbUNvbW1hbmRzKSB7Ci0gICAgICAgICAgICAgICAgbGlzdC5hZGQoY29tbWFuZC50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBidW5kbGUucHV0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfQ09NTUFORFMsIGxpc3QpOwotICAgICAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAcmV0dXJuIG5ldyBpbnN0YW5jZSBvZiBDb21tYW5kR3JvdXAgZnJvbSB0aGUgYnVuZGxlCi0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIEBOdWxsYWJsZSBTZXNzaW9uQ29tbWFuZEdyb3VwMiBmcm9tQnVuZGxlX2ltcGwoQnVuZGxlIGNvbW1hbmRzKSB7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdDxQYXJjZWxhYmxlPiBsaXN0ID0gY29tbWFuZHMuZ2V0UGFyY2VsYWJsZUFycmF5TGlzdChLRVlfQ09NTUFORFMpOwotICAgICAgICAgICAgaWYgKGxpc3QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgY29tbWFuZEdyb3VwID0gbmV3IFNlc3Npb25Db21tYW5kR3JvdXAyKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBQYXJjZWxhYmxlIHBhcmNlbGFibGUgPSBsaXN0LmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoIShwYXJjZWxhYmxlIGluc3RhbmNlb2YgQnVuZGxlKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQnVuZGxlIGNvbW1hbmRCdW5kbGUgPSAoQnVuZGxlKSBwYXJjZWxhYmxlOwotICAgICAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMiBjb21tYW5kID0gU2Vzc2lvbkNvbW1hbmQyLmZyb21CdW5kbGUoY29tbWFuZEJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGNvbW1hbmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb21tYW5kR3JvdXAuYWRkQ29tbWFuZChjb21tYW5kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29tbWFuZEdyb3VwOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBDb250cm9sbGVySW5mb0ltcGwgaW1wbGVtZW50cyBDb250cm9sbGVySW5mb1Byb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb250cm9sbGVySW5mbyBtSW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IG1VaWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1QYWNrYWdlTmFtZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Jc1RydXN0ZWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgbUNvbnRyb2xsZXJCaW5kZXI7Ci0KLSAgICAgICAgcHVibGljIENvbnRyb2xsZXJJbmZvSW1wbChDb250ZXh0IGNvbnRleHQsIENvbnRyb2xsZXJJbmZvIGluc3RhbmNlLCBpbnQgdWlkLAotICAgICAgICAgICAgICAgIGludCBwaWQsIEBOb25OdWxsIFN0cmluZyBwYWNrYWdlTmFtZSwgQE5vbk51bGwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwYWNrYWdlTmFtZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwYWNrYWdlTmFtZSBzaG91bGRuJ3QgYmUgZW1wdHkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICBtVWlkID0gdWlkOwotICAgICAgICAgICAgbVBhY2thZ2VOYW1lID0gcGFja2FnZU5hbWU7Ci0gICAgICAgICAgICBtQ29udHJvbGxlckJpbmRlciA9IGNhbGxiYWNrOwotICAgICAgICAgICAgTWVkaWFTZXNzaW9uTWFuYWdlciBtYW5hZ2VyID0KLSAgICAgICAgICAgICAgICAgIChNZWRpYVNlc3Npb25NYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5NRURJQV9TRVNTSU9OX1NFUlZJQ0UpOwotICAgICAgICAgICAgLy8gQXNrIHNlcnZlciB3aGV0aGVyIHRoZSBjb250cm9sbGVyIGlzIHRydXN0ZWQuCi0gICAgICAgICAgICAvLyBBcHAgY2Fubm90IGtub3cgdGhpcyBiZWNhdXNlIGFwcHMgY2Fubm90IHF1ZXJ5IGVuYWJsZWQgbm90aWZpY2F0aW9uIGxpc3RlbmVyIGZvcgotICAgICAgICAgICAgLy8gYW5vdGhlciBwYWNrYWdlLCBidXQgc3lzdGVtIHNlcnZlciBjYW4gZG8uCi0gICAgICAgICAgICBtSXNUcnVzdGVkID0gbWFuYWdlci5pc1RydXN0ZWRGb3JNZWRpYUNvbnRyb2woCi0gICAgICAgICAgICAgICAgICAgIG5ldyBNZWRpYVNlc3Npb25NYW5hZ2VyLlJlbW90ZVVzZXJJbmZvKHBhY2thZ2VOYW1lLCBwaWQsIHVpZCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWVfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGFja2FnZU5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRVaWRfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVWlkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzVHJ1c3RlZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Jc1RydXN0ZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBoYXNoQ29kZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzX2ltcGwoT2JqZWN0IG9iaikgewotICAgICAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgQ29udHJvbGxlckluZm8pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGVxdWFscygoKENvbnRyb2xsZXJJbmZvKSBvYmopLmdldFByb3ZpZGVyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiAiQ29udHJvbGxlckluZm8ge3BrZz0iICsgbVBhY2thZ2VOYW1lICsgIiwgdWlkPSIgKyBtVWlkICsgIiwgdHJ1c3RlZD0iCi0gICAgICAgICAgICAgICAgICAgICsgbUlzVHJ1c3RlZCArICJ9IjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIENvbnRyb2xsZXJJbmZvSW1wbCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb250cm9sbGVySW5mb0ltcGwgb3RoZXIgPSAoQ29udHJvbGxlckluZm9JbXBsKSBvYmo7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xsZXJCaW5kZXIuYXNCaW5kZXIoKS5lcXVhbHMob3RoZXIubUNvbnRyb2xsZXJCaW5kZXIuYXNCaW5kZXIoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDb250cm9sbGVySW5mbyBnZXRJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgIH0KLQotICAgICAgICBJQmluZGVyIGdldElkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyLmFzQmluZGVyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBJTWVkaWFDb250cm9sbGVyMiBnZXRDb250cm9sbGVyQmluZGVyKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVyQmluZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIENvbnRyb2xsZXJJbmZvSW1wbCBmcm9tKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgICAgIHJldHVybiAoQ29udHJvbGxlckluZm9JbXBsKSBjb250cm9sbGVyLmdldFByb3ZpZGVyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIENvbW1hbmRCdXR0b25JbXBsIGltcGxlbWVudHMgQ29tbWFuZEJ1dHRvblByb3ZpZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT01NQU5ECi0gICAgICAgICAgICAgICAgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYV9zZXNzaW9uMi5jb21tYW5kX2J1dHRvbi5jb21tYW5kIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9JQ09OX1JFU19JRAotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uaWNvbl9yZXNfaWQiOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RJU1BMQVlfTkFNRQotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uZGlzcGxheV9uYW1lIjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9FWFRSQVMKLSAgICAgICAgICAgICAgICA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmNvbW1hbmRfYnV0dG9uLmV4dHJhcyI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRU5BQkxFRAotICAgICAgICAgICAgICAgID0gImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIuY29tbWFuZF9idXR0b24uZW5hYmxlZCI7Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDb21tYW5kQnV0dG9uIG1JbnN0YW5jZTsKLSAgICAgICAgcHJpdmF0ZSBTZXNzaW9uQ29tbWFuZDIgbUNvbW1hbmQ7Ci0gICAgICAgIHByaXZhdGUgaW50IG1JY29uUmVzSWQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1EaXNwbGF5TmFtZTsKLSAgICAgICAgcHJpdmF0ZSBCdW5kbGUgbUV4dHJhczsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOwotCi0gICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uSW1wbChATnVsbGFibGUgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIGludCBpY29uUmVzSWQsCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIFN0cmluZyBkaXNwbGF5TmFtZSwgQnVuZGxlIGV4dHJhcywgYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgICAgICBtQ29tbWFuZCA9IGNvbW1hbmQ7Ci0gICAgICAgICAgICBtSWNvblJlc0lkID0gaWNvblJlc0lkOwotICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0gICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOwotICAgICAgICAgICAgbUVuYWJsZWQgPSBlbmFibGVkOwotICAgICAgICAgICAgbUluc3RhbmNlID0gbmV3IENvbW1hbmRCdXR0b24odGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEBOdWxsYWJsZQotICAgICAgICBTZXNzaW9uQ29tbWFuZDIgZ2V0Q29tbWFuZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db21tYW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0SWNvblJlc0lkX2ltcGwoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUljb25SZXNJZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQE51bGxhYmxlIFN0cmluZyBnZXREaXNwbGF5TmFtZV9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQE51bGxhYmxlIEJ1bmRsZSBnZXRFeHRyYXNfaW1wbCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0cmFzOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1FbmFibGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE5vbk51bGwgQnVuZGxlIHRvQnVuZGxlKCkgewotICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRCdW5kbGUoS0VZX0NPTU1BTkQsIG1Db21tYW5kLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEludChLRVlfSUNPTl9SRVNfSUQsIG1JY29uUmVzSWQpOwotICAgICAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfRElTUExBWV9OQU1FLCBtRGlzcGxheU5hbWUpOwotICAgICAgICAgICAgYnVuZGxlLnB1dEJ1bmRsZShLRVlfRVhUUkFTLCBtRXh0cmFzKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRCb29sZWFuKEtFWV9FTkFCTEVELCBtRW5hYmxlZCk7Ci0gICAgICAgICAgICByZXR1cm4gYnVuZGxlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3RhdGljIEBOdWxsYWJsZSBDb21tYW5kQnV0dG9uIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICAgICAgaWYgKGJ1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBDb21tYW5kQnV0dG9uLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0Q29tbWFuZChTZXNzaW9uQ29tbWFuZDIuZnJvbUJ1bmRsZShidW5kbGUuZ2V0QnVuZGxlKEtFWV9DT01NQU5EKSkpOwotICAgICAgICAgICAgYnVpbGRlci5zZXRJY29uUmVzSWQoYnVuZGxlLmdldEludChLRVlfSUNPTl9SRVNfSUQsIDApKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0RGlzcGxheU5hbWUoYnVuZGxlLmdldFN0cmluZyhLRVlfRElTUExBWV9OQU1FKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldEV4dHJhcyhidW5kbGUuZ2V0QnVuZGxlKEtFWV9FWFRSQVMpKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0RW5hYmxlZChidW5kbGUuZ2V0Qm9vbGVhbihLRVlfRU5BQkxFRCkpOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBNYWxmb3JtZWQgb3IgdmVyc2lvbiBtaXNtYXRjaC4gUmV0dXJuIG51bGwgZm9yIG5vdy4KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgQ29tbWFuZEJ1dHRvbn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXJJbXBsIGltcGxlbWVudHMgQ29tbWFuZEJ1dHRvblByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlciB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIENvbW1hbmRCdXR0b24uQnVpbGRlciBtSW5zdGFuY2U7Ci0gICAgICAgICAgICBwcml2YXRlIFNlc3Npb25Db21tYW5kMiBtQ29tbWFuZDsKLSAgICAgICAgICAgIHByaXZhdGUgaW50IG1JY29uUmVzSWQ7Ci0gICAgICAgICAgICBwcml2YXRlIFN0cmluZyBtRGlzcGxheU5hbWU7Ci0gICAgICAgICAgICBwcml2YXRlIEJ1bmRsZSBtRXh0cmFzOwotICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1FbmFibGVkOwotCi0gICAgICAgICAgICBwdWJsaWMgQnVpbGRlckltcGwoQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgICAgICAgICAgbUluc3RhbmNlID0gaW5zdGFuY2U7Ci0gICAgICAgICAgICAgICAgbUVuYWJsZWQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBDb21tYW5kQnV0dG9uLkJ1aWxkZXIgc2V0Q29tbWFuZF9pbXBsKFNlc3Npb25Db21tYW5kMiBjb21tYW5kKSB7Ci0gICAgICAgICAgICAgICAgbUNvbW1hbmQgPSBjb21tYW5kOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24uQnVpbGRlciBzZXRJY29uUmVzSWRfaW1wbChpbnQgcmVzSWQpIHsKLSAgICAgICAgICAgICAgICBtSWNvblJlc0lkID0gcmVzSWQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldERpc3BsYXlOYW1lX2ltcGwoU3RyaW5nIGRpc3BsYXlOYW1lKSB7Ci0gICAgICAgICAgICAgICAgbURpc3BsYXlOYW1lID0gZGlzcGxheU5hbWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldEVuYWJsZWRfaW1wbChib29sZWFuIGVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBtRW5hYmxlZCA9IGVuYWJsZWQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIHNldEV4dHJhc19pbXBsKEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgICAgICBtRXh0cmFzID0gZXh0cmFzOwotICAgICAgICAgICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIENvbW1hbmRCdXR0b24gYnVpbGRfaW1wbCgpIHsKLSAgICAgICAgICAgICAgICBpZiAobUVuYWJsZWQgJiYgbUNvbW1hbmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJFbmFibGVkIGJ1dHRvbiBuZWVkcyBDb21tYW5kIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBmb3IgY29udHJvbGxlciB0byBpbnZva2UgdGhlIGNvbW1hbmQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1Db21tYW5kICE9IG51bGwgJiYgbUNvbW1hbmQuZ2V0Q29tbWFuZENvZGUoKSA9PSBDT01NQU5EX0NPREVfQ1VTVE9NCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAobUljb25SZXNJZCA9PSAwIHx8IFRleHRVdGlscy5pc0VtcHR5KG1EaXNwbGF5TmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkN1c3RvbSBjb21tYW5kcyBuZWVkcyBpY29uIGFuZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgYW5kIG5hbWUgdG8gZGlzcGxheSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbW1hbmRCdXR0b25JbXBsKG1Db21tYW5kLCBtSWNvblJlc0lkLCBtRGlzcGxheU5hbWUsIG1FeHRyYXMsIG1FbmFibGVkKQotICAgICAgICAgICAgICAgICAgICAgICAgLm1JbnN0YW5jZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQnVpbGRlckJhc2VJbXBsPFQgZXh0ZW5kcyBNZWRpYVNlc3Npb24yLCBDIGV4dGVuZHMgU2Vzc2lvbkNhbGxiYWNrPgotICAgICAgICAgICAgaW1wbGVtZW50cyBCdWlsZGVyQmFzZVByb3ZpZGVyPFQsIEM+IHsKLSAgICAgICAgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICAgICAgTWVkaWFQbGF5ZXJCYXNlIG1QbGF5ZXI7Ci0gICAgICAgIFN0cmluZyBtSWQ7Ci0gICAgICAgIEV4ZWN1dG9yIG1DYWxsYmFja0V4ZWN1dG9yOwotICAgICAgICBDIG1DYWxsYmFjazsKLSAgICAgICAgTWVkaWFQbGF5bGlzdEFnZW50IG1QbGF5bGlzdEFnZW50OwotICAgICAgICBWb2x1bWVQcm92aWRlcjIgbVZvbHVtZVByb3ZpZGVyOwotICAgICAgICBQZW5kaW5nSW50ZW50IG1TZXNzaW9uQWN0aXZpdHk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENvbnN0cnVjdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY29udGV4dCBhIGNvbnRleHQKLSAgICAgICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IHBhcmFtZXRlciBpcyBudWxsLCBvciB0aGUgcGxheWVyIGlzIGEKLSAgICAgICAgICogICAgICB7QGxpbmsgTWVkaWFTZXNzaW9uMn0gb3Ige0BsaW5rIE1lZGlhQ29udHJvbGxlcjJ9LgotICAgICAgICAgKi8KLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBBbHNvIG5lZWQgZXhlY3V0b3IKLSAgICAgICAgcHVibGljIEJ1aWxkZXJCYXNlSW1wbChATm9uTnVsbCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIGlmIChjb250ZXh0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgICAgICAgICAvLyBFbnN1cmUgbm9uLW51bGwKLSAgICAgICAgICAgIG1JZCA9ICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFBsYXllcl9pbXBsKEBOb25OdWxsIE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIpIHsKLSAgICAgICAgICAgIGlmIChwbGF5ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBsYXllciA9IHBsYXllcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdEFnZW50X2ltcGwoQE5vbk51bGwgTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQpIHsKLSAgICAgICAgICAgIGlmIChwbGF5bGlzdEFnZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJwbGF5bGlzdEFnZW50IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUGxheWxpc3RBZ2VudCA9IHBsYXlsaXN0QWdlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lUHJvdmlkZXJfaW1wbChWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIpIHsKLSAgICAgICAgICAgIG1Wb2x1bWVQcm92aWRlciA9IHZvbHVtZVByb3ZpZGVyOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25BY3Rpdml0eV9pbXBsKFBlbmRpbmdJbnRlbnQgcGkpIHsKLSAgICAgICAgICAgIG1TZXNzaW9uQWN0aXZpdHkgPSBwaTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRJZF9pbXBsKEBOb25OdWxsIFN0cmluZyBpZCkgewotICAgICAgICAgICAgaWYgKGlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJpZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2Vzc2lvbkNhbGxiYWNrX2ltcGwoQE5vbk51bGwgRXhlY3V0b3IgZXhlY3V0b3IsIEBOb25OdWxsIEMgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChleGVjdXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZXhlY3V0b3Igc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DYWxsYmFja0V4ZWN1dG9yID0gZXhlY3V0b3I7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgVCBidWlsZF9pbXBsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVySW1wbCBleHRlbmRzIEJ1aWxkZXJCYXNlSW1wbDxNZWRpYVNlc3Npb24yLCBTZXNzaW9uQ2FsbGJhY2s+IHsKLSAgICAgICAgcHVibGljIEJ1aWxkZXJJbXBsKENvbnRleHQgY29udGV4dCwgQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvbjIgYnVpbGRfaW1wbCgpIHsKLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2tFeGVjdXRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrRXhlY3V0b3IgPSBtQ29udGV4dC5nZXRNYWluRXhlY3V0b3IoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtQ2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFjayA9IG5ldyBTZXNzaW9uQ2FsbGJhY2soKSB7fTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwobUNvbnRleHQsIG1QbGF5ZXIsIG1JZCwgbVBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVQcm92aWRlciwgbVNlc3Npb25BY3Rpdml0eSwgbUNhbGxiYWNrRXhlY3V0b3IsIG1DYWxsYmFjaykuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMlN0dWIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvTWVkaWFTZXNzaW9uMlN0dWIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM2NTdkNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvbjJTdHViLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5MaWJyYXJ5Um9vdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmQyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db21tYW5kQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU2Vzc2lvbkNvbW1hbmRHcm91cDI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLkNvbnRyb2xsZXJJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuUmF0aW5nMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMjsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5EZWFkT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkd1YXJkZWRCeTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5TWFwOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTJJbXBsLk1lZGlhTGlicmFyeVNlc3Npb25JbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRCdXR0b25JbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRHcm91cEltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMkltcGwuQ29udHJvbGxlckluZm9JbXBsOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotcHVibGljIGNsYXNzIE1lZGlhU2Vzc2lvbjJTdHViIGV4dGVuZHMgSU1lZGlhU2Vzc2lvbjIuU3R1YiB7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0tFWV9QT1NJVElPTiA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmtleV9wb3NpdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBBUkdVTUVOVF9LRVlfSVRFTV9JTkRFWCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhX3Nlc3Npb24yLmtleV9pdGVtX2luZGV4IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0tFWV9QTEFZTElTVF9QQVJBTVMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEubWVkaWFfc2Vzc2lvbjIua2V5X3BsYXlsaXN0X3BhcmFtcyI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhU2Vzc2lvbjJTdHViIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gdHJ1ZTsgLy8gVE9ETyhqYWV3YW4pOiBSZW5hbWUuCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTcGFyc2VBcnJheTxTZXNzaW9uQ29tbWFuZDI+IHNDb21tYW5kc0Zvck9uQ29tbWFuZFJlcXVlc3QgPQotICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PD4oKTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxNZWRpYVNlc3Npb24ySW1wbD4gbVNlc3Npb247Ci0KLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheU1hcDxJQmluZGVyLCBDb250cm9sbGVySW5mbz4gbUNvbnRyb2xsZXJzID0gbmV3IEFycmF5TWFwPD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmaW5hbCBTZXQ8SUJpbmRlcj4gbUNvbm5lY3RpbmdDb250cm9sbGVycyA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheU1hcDxDb250cm9sbGVySW5mbywgU2Vzc2lvbkNvbW1hbmRHcm91cDI+IG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwID0KLSAgICAgICAgICAgIG5ldyBBcnJheU1hcDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlNYXA8Q29udHJvbGxlckluZm8sIFNldDxTdHJpbmc+PiBtU3Vic2NyaXB0aW9ucyA9IG5ldyBBcnJheU1hcDw+KCk7Ci0KLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uMlN0dWIoTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbikgewotICAgICAgICBtU2Vzc2lvbiA9IG5ldyBXZWFrUmVmZXJlbmNlPD4oc2Vzc2lvbik7Ci0KLSAgICAgICAgc3luY2hyb25pemVkIChzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0KSB7Ci0gICAgICAgICAgICBpZiAoc0NvbW1hbmRzRm9yT25Db21tYW5kUmVxdWVzdC5zaXplKCkgPT0gMCkgewotICAgICAgICAgICAgICAgIENvbW1hbmRHcm91cEltcGwgZ3JvdXAgPSBuZXcgQ29tbWFuZEdyb3VwSW1wbCgpOwotICAgICAgICAgICAgICAgIGdyb3VwLmFkZEFsbFBsYXliYWNrQ29tbWFuZHMoKTsKLSAgICAgICAgICAgICAgICBncm91cC5hZGRBbGxQbGF5bGlzdENvbW1hbmRzKCk7Ci0gICAgICAgICAgICAgICAgU2V0PFNlc3Npb25Db21tYW5kMj4gY29tbWFuZHMgPSBncm91cC5nZXRDb21tYW5kcygpOwotICAgICAgICAgICAgICAgIGZvciAoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgOiBjb21tYW5kcykgewotICAgICAgICAgICAgICAgICAgICBzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0LmFwcGVuZChjb21tYW5kLmdldENvbW1hbmRDb2RlKCksIGNvbW1hbmQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGRlc3Ryb3lOb3RMb2NrZWQoKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8Q29udHJvbGxlckluZm8+IGxpc3Q7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1TZXNzaW9uLmNsZWFyKCk7Ci0gICAgICAgICAgICBsaXN0ID0gZ2V0Q29udHJvbGxlcnMoKTsKLSAgICAgICAgICAgIG1Db250cm9sbGVycy5jbGVhcigpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgSU1lZGlhQ29udHJvbGxlcjIgY29udHJvbGxlckJpbmRlciA9Ci0gICAgICAgICAgICAgICAgICAgICgoQ29udHJvbGxlckluZm9JbXBsKSBsaXN0LmdldChpKS5nZXRQcm92aWRlcigpKS5nZXRDb250cm9sbGVyQmluZGVyKCk7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIFNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIGhvbGQgdG8gcHJldmVudCBwb3RlbnRpYWwgZGVhZGxvY2suCi0gICAgICAgICAgICAgICAgY29udHJvbGxlckJpbmRlci5vbkRpc2Nvbm5lY3RlZCgpOwotICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAvLyBDb250cm9sbGVyIGlzIGdvbmUuIFNob3VsZCBiZSBmaW5lIGJlY2F1c2Ugd2UncmUgZGVzdHJveWluZy4KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uMkltcGwgZ2V0U2Vzc2lvbigpIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IG1TZXNzaW9uLmdldCgpOwotICAgICAgICBpZiAoc2Vzc2lvbiA9PSBudWxsICYmIERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJTZXNzaW9uIGlzIGNsb3NlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNlc3Npb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbCBnZXRMaWJyYXJ5U2Vzc2lvbigpIHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gewotICAgICAgICBmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uID0gZ2V0U2Vzc2lvbigpOwotICAgICAgICBpZiAoIShzZXNzaW9uIGluc3RhbmNlb2YgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiU2Vzc2lvbiBpc24ndCBhIGxpYnJhcnkgc2Vzc2lvbiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwpIHNlc3Npb247Ci0gICAgfQotCi0gICAgLy8gR2V0IGNvbnRyb2xsZXIgaWYgdGhlIGNvbW1hbmQgZnJvbSBjYWxsZXIgdG8gc2Vzc2lvbiBpcyBhYmxlIHRvIGJlIGhhbmRsZWQuCi0gICAgcHJpdmF0ZSBDb250cm9sbGVySW5mbyBnZXRDb250cm9sbGVySWZBYmxlKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVySW5mbyA9IG1Db250cm9sbGVycy5nZXQoY2FsbGVyLmFzQmluZGVyKCkpOwotICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXJJbmZvID09IG51bGwgJiYgREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb250cm9sbGVyIGlzIGRpc2Nvbm5lY3RlZCIsIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29udHJvbGxlckluZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBHZXQgY29udHJvbGxlciBpZiB0aGUgY29tbWFuZCBmcm9tIGNhbGxlciB0byBzZXNzaW9uIGlzIGFibGUgdG8gYmUgaGFuZGxlZC4KLSAgICBwcml2YXRlIENvbnRyb2xsZXJJbmZvIGdldENvbnRyb2xsZXJJZkFibGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgY29tbWFuZENvZGUpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlckluZm8gPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcik7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlckluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmRHcm91cDIgYWxsb3dlZENvbW1hbmRzID0gbUFsbG93ZWRDb21tYW5kR3JvdXBNYXAuZ2V0KGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgd2l0aCBudWxsIGFsbG93ZWQgY29tbWFuZHMuIElnbm9yaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmRDb2RlKSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgZm9yIGNvbW1hbmQgIiArIGNvbW1hbmRDb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29udHJvbGxlckluZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBHZXQgY29udHJvbGxlciBpZiB0aGUgY29tbWFuZCBmcm9tIGNhbGxlciB0byBzZXNzaW9uIGlzIGFibGUgdG8gYmUgaGFuZGxlZC4KLSAgICBwcml2YXRlIENvbnRyb2xsZXJJbmZvIGdldENvbnRyb2xsZXJJZkFibGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIgY29tbWFuZCkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVySW5mbyA9IGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVySW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBTZXNzaW9uQ29tbWFuZEdyb3VwMiBhbGxvd2VkQ29tbWFuZHMgPSBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5nZXQoY29udHJvbGxlckluZm8pOwotICAgICAgICAgICAgaWYgKGFsbG93ZWRDb21tYW5kcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ29udHJvbGxlciB3aXRoIG51bGwgYWxsb3dlZCBjb21tYW5kcy4gSWdub3JpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghYWxsb3dlZENvbW1hbmRzLmhhc0NvbW1hbmQoY29tbWFuZCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29udHJvbGxlciBpc24ndCBhbGxvd2VkIGZvciBjb21tYW5kICIgKyBjb21tYW5kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29udHJvbGxlckluZm87Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSZXR1cm4gYmluZGVyIGlmIHRoZSBzZXNzaW9uIGlzIGFibGUgdG8gc2VuZCBhIGNvbW1hbmQgdG8gdGhlIGNvbnRyb2xsZXIuCi0gICAgcHJpdmF0ZSBJTWVkaWFDb250cm9sbGVyMiBnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgaWYgKGdldFNlc3Npb24oKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBnZXRTZXNzaW9uKCkgYWxyZWFkeSBsb2dnZWQgaWYgc2Vzc2lvbiBpcyBjbG9zZWQuCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mb0ltcGwgaW1wbCA9IENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXIpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRyb2xsZXJzLmdldChpbXBsLmdldElkKCkpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgfHwgbUNvbm5lY3RpbmdDb250cm9sbGVycy5jb250YWlucyhpbXBsLmdldElkKCkpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGltcGwuZ2V0Q29udHJvbGxlckJpbmRlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjb250cm9sbGVyICsgIiBpc24ndCBjb25uZWN0ZWQgbm9yIGNvbm5lY3RpbmciLAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gUmV0dXJuIGJpbmRlciBpZiB0aGUgc2Vzc2lvbiBpcyBhYmxlIHRvIHNlbmQgYSBjb21tYW5kIHRvIHRoZSBjb250cm9sbGVyLgotICAgIHByaXZhdGUgSU1lZGlhQ29udHJvbGxlcjIgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgaW50IGNvbW1hbmRDb2RlKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcyA9IG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwLmdldChjb250cm9sbGVyKTsKLSAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNvbnRyb2xsZXIgd2l0aCBudWxsIGFsbG93ZWQgY29tbWFuZHMuIElnbm9yaW5nIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIWFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKGNvbW1hbmRDb2RlKSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJDb250cm9sbGVyIGlzbid0IGFsbG93ZWQgZm9yIGNvbW1hbmQgIiArIGNvbW1hbmRDb2RlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVyKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkNvbW1hbmQoQE5vbk51bGwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgY29tbWFuZENvZGUsCi0gICAgICAgICAgICBATm9uTnVsbCBTZXNzaW9uUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciA9IGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyLCBjb21tYW5kQ29kZSk7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlcklmQWJsZShjYWxsZXIsIGNvbW1hbmRDb2RlKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQgPSBzQ29tbWFuZHNGb3JPbkNvbW1hbmRSZXF1ZXN0LmdldChjb21tYW5kQ29kZSk7Ci0gICAgICAgICAgICBpZiAoY29tbWFuZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBhY2NlcHRlZCA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkNvbW1hbmRSZXF1ZXN0KHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIGNvbW1hbmQpOwotICAgICAgICAgICAgICAgIGlmICghYWNjZXB0ZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRG9uJ3QgcnVuIHJlamVjdGVkIGNvbW1hbmQuCi0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQ29tbWFuZCAoY29kZT0iICsgY29tbWFuZENvZGUgKyAiKSBmcm9tICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBjb250cm9sbGVyICsgIiB3YXMgcmVqZWN0ZWQgYnkgIiArIHNlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBydW5uYWJsZS5ydW4oc2Vzc2lvbiwgY29udHJvbGxlcik7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkJyb3dzZXJDb21tYW5kKEBOb25OdWxsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwKLSAgICAgICAgICAgIEBOb25OdWxsIExpYnJhcnlTZXNzaW9uUnVubmFibGUgcnVubmFibGUpIHsKLSAgICAgICAgZmluYWwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkltcGwgc2Vzc2lvbiA9IGdldExpYnJhcnlTZXNzaW9uKCk7Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogQ29uc2lkZXIgY29tbWFuZCBjb2RlCi0gICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcik7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IENvbnNpZGVyIGNvbW1hbmQgY29kZQotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJJZkFibGUoY2FsbGVyKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcnVubmFibGUucnVuKHNlc3Npb24sIGNvbnRyb2xsZXIpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLQotICAgIHByaXZhdGUgdm9pZCBub3RpZnlBbGwoaW50IGNvbW1hbmRDb2RlLCBATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBMaXN0PENvbnRyb2xsZXJJbmZvPiBjb250cm9sbGVycyA9IGdldENvbnRyb2xsZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbGxlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXJzLmdldChpKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVycy5nZXQoaSksIGNvbW1hbmRDb2RlKSwgcnVubmFibGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIG5vdGlmeUFsbChATm9uTnVsbCBOb3RpZnlSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICBMaXN0PENvbnRyb2xsZXJJbmZvPiBjb250cm9sbGVycyA9IGdldENvbnRyb2xsZXJzKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY29udHJvbGxlcnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXJzLmdldChpKSwKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVycy5nZXQoaSkpLCBydW5uYWJsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5KEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXIsIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlciksIHJ1bm5hYmxlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbm90aWZ5KEBOb25OdWxsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIGludCBjb21tYW5kQ29kZSwKLSAgICAgICAgICAgIEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIG5vdGlmeUludGVybmFsKGNvbnRyb2xsZXIsIGdldENvbnRyb2xsZXJCaW5kZXJJZkFibGUoY29udHJvbGxlciwgY29tbWFuZENvZGUpLCBydW5uYWJsZSk7Ci0gICAgfQotCi0gICAgLy8gRG8gbm90IGNhbGwgdGhpcyBBUEkgZGlyZWN0bHkuIFVzZSBub3RpZnkoKSBpbnN0ZWFkLgotICAgIHByaXZhdGUgdm9pZCBub3RpZnlJbnRlcm5hbChATm9uTnVsbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyLAotICAgICAgICAgICAgQE5vbk51bGwgSU1lZGlhQ29udHJvbGxlcjIgaUNvbnRyb2xsZXIsIEBOb25OdWxsIE5vdGlmeVJ1bm5hYmxlIHJ1bm5hYmxlKSB7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwgfHwgaUNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBydW5uYWJsZS5ydW4oY29udHJvbGxlciwgaUNvbnRyb2xsZXIpOwotICAgICAgICB9IGNhdGNoIChEZWFkT2JqZWN0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY29udHJvbGxlci50b1N0cmluZygpICsgIiBpcyBnb25lIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBvbkNvbnRyb2xsZXJDbG9zZWQoaUNvbnRyb2xsZXIpOwotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gQ3VycmVudGx5IGl0J3MgVHJhbnNhY3Rpb25Ub29MYXJnZUV4Y2VwdGlvbiBvciBEZWFkU3lzdGVtRXhjZXB0aW9uLgotICAgICAgICAgICAgLy8gV2UnZCBiZXR0ZXIgdG8gbGVhdmUgbG9nIGZvciB0aG9zZSBjYXNlcyBiZWNhdXNlCi0gICAgICAgICAgICAvLyAgIC0gVHJhbnNhY3Rpb25Ub29MYXJnZUV4Y2VwdGlvbiBtZWFucyB0aGF0IHdlIG1heSBuZWVkIHRvIGZpeCBvdXIgY29kZS4KLSAgICAgICAgICAgIC8vICAgICAoZS5nLiBhZGQgcGFnaW5hdGlvbiBvciBzcGVjaWFsIHdheSB0byBkZWxpdmVyIEJpdG1hcCkKLSAgICAgICAgICAgIC8vICAgLSBEZWFkU3lzdGVtRXhjZXB0aW9uIG1lYW5zIHRoYXQgZXJyb3JzIGFyb3VuZCBpdCBjYW4gYmUgaWdub3JlZC4KLSAgICAgICAgICAgIExvZy53KFRBRywgIkV4Y2VwdGlvbiBpbiAiICsgY29udHJvbGxlci50b1N0cmluZygpLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBvbkNvbnRyb2xsZXJDbG9zZWQoSU1lZGlhQ29udHJvbGxlcjIgaUNvbnRyb2xsZXIpIHsKLSAgICAgICAgQ29udHJvbGxlckluZm8gY29udHJvbGxlcjsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgY29udHJvbGxlciA9IG1Db250cm9sbGVycy5yZW1vdmUoaUNvbnRyb2xsZXIuYXNCaW5kZXIoKSk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJyZWxlYXNpbmcgIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVN1YnNjcmlwdGlvbnMucmVtb3ZlKGNvbnRyb2xsZXIpOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIHNlc3Npb24gPSBnZXRTZXNzaW9uKCk7Ci0gICAgICAgIGlmIChzZXNzaW9uID09IG51bGwgfHwgY29udHJvbGxlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc2Vzc2lvbi5nZXRDYWxsYmFja0V4ZWN1dG9yKCkuZXhlY3V0ZSgoKSAtPiB7Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25EaXNjb25uZWN0ZWQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEFJREwgbWV0aG9kcyBmb3Igc2Vzc2lvbiBvdmVycmlkZXMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY29ubmVjdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBjYWxsaW5nUGFja2FnZSkKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIENvbnRleHQgY29udGV4dCA9IHNlc3Npb24uZ2V0Q29udGV4dCgpOwotICAgICAgICBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVySW5mbyA9IG5ldyBDb250cm9sbGVySW5mbyhjb250ZXh0LAotICAgICAgICAgICAgICAgIEJpbmRlci5nZXRDYWxsaW5nVWlkKCksIEJpbmRlci5nZXRDYWxsaW5nUGlkKCksIGNhbGxpbmdQYWNrYWdlLCBjYWxsZXIpOwotICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmIChnZXRTZXNzaW9uKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAvLyBLZWVwIGNvbm5lY3RpbmcgY29udHJvbGxlcnMuCi0gICAgICAgICAgICAgICAgLy8gVGhpcyBoZWxwcyBzZXNzaW9ucyB0byBjYWxsIEFQSXMgaW4gdGhlIG9uQ29ubmVjdCgpIChlLmcuIHNldEN1c3RvbUxheW91dCgpKQotICAgICAgICAgICAgICAgIC8vIGluc3RlYWQgb2YgcGVuZGluZyB0aGVtLgotICAgICAgICAgICAgICAgIG1Db25uZWN0aW5nQ29udHJvbGxlcnMuYWRkKENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXJJbmZvKS5nZXRJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGFsbG93ZWRDb21tYW5kcyA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkNvbm5lY3QoCi0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwgY29udHJvbGxlckluZm8pOwotICAgICAgICAgICAgLy8gRG9uJ3QgcmVqZWN0IGNvbm5lY3Rpb24gZm9yIHRoZSByZXF1ZXN0IGZyb20gdHJ1c3RlZCBhcHAuCi0gICAgICAgICAgICAvLyBPdGhlcndpc2Ugc2VydmVyIHdpbGwgZmFpbCB0byByZXRyaWV2ZSBzZXNzaW9uJ3MgaW5mb3JtYXRpb24gdG8gZGlzcGF0Y2gKLSAgICAgICAgICAgIC8vIG1lZGlhIGtleXMgdG8uCi0gICAgICAgICAgICBib29sZWFuIGFjY2VwdCA9IGFsbG93ZWRDb21tYW5kcyAhPSBudWxsIHx8IGNvbnRyb2xsZXJJbmZvLmlzVHJ1c3RlZCgpOwotICAgICAgICAgICAgaWYgKGFjY2VwdCkgewotICAgICAgICAgICAgICAgIENvbnRyb2xsZXJJbmZvSW1wbCBjb250cm9sbGVySW1wbCA9IENvbnRyb2xsZXJJbmZvSW1wbC5mcm9tKGNvbnRyb2xsZXJJbmZvKTsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiQWNjZXB0aW5nIGNvbm5lY3Rpb24sIGNvbnRyb2xsZXJJbmZvPSIgKyBjb250cm9sbGVySW5mbwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhbGxvd2VkQ29tbWFuZHM9IiArIGFsbG93ZWRDb21tYW5kcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhbGxvd2VkQ29tbWFuZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBGb3IgdHJ1c3RlZCBhcHBzLCBzZW5kIG5vbi1udWxsIGFsbG93ZWQgY29tbWFuZHMgdG8ga2VlcCBjb25uZWN0aW9uLgotICAgICAgICAgICAgICAgICAgICBhbGxvd2VkQ29tbWFuZHMgPSBuZXcgU2Vzc2lvbkNvbW1hbmRHcm91cDIoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGluZ0NvbnRyb2xsZXJzLnJlbW92ZShjb250cm9sbGVySW1wbC5nZXRJZCgpKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJzLnB1dChjb250cm9sbGVySW1wbC5nZXRJZCgpLCAgY29udHJvbGxlckluZm8pOwotICAgICAgICAgICAgICAgICAgICBtQWxsb3dlZENvbW1hbmRHcm91cE1hcC5wdXQoY29udHJvbGxlckluZm8sIGFsbG93ZWRDb21tYW5kcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIElmIGNvbm5lY3Rpb24gaXMgYWNjZXB0ZWQsIG5vdGlmeSB0aGUgY3VycmVudCBzdGF0ZSB0byB0aGUgY29udHJvbGxlci4KLSAgICAgICAgICAgICAgICAvLyBJdCdzIG5lZWRlZCBiZWNhdXNlIHdlIGNhbm5vdCBjYWxsIHN5bmNocm9ub3VzIGNhbGxzIGJldHdlZW4gc2Vzc2lvbi9jb250cm9sbGVyLgotICAgICAgICAgICAgICAgIC8vIE5vdGU6IFdlJ3JlIGRvaW5nIHRoaXMgYWZ0ZXIgdGhlIG9uQ29ubmVjdGlvbkNoYW5nZWQoKSwgYnV0IHRoZXJlJ3Mgbm8gZ3VhcmFudGVlCi0gICAgICAgICAgICAgICAgLy8gICAgICAgdGhhdCBldmVudHMgaGVyZSBhcmUgbm90aWZpZWQgYWZ0ZXIgdGhlIG9uQ29ubmVjdGVkKCkgYmVjYXVzZQotICAgICAgICAgICAgICAgIC8vICAgICAgIElNZWRpYUNvbnRyb2xsZXIyIGlzIG9uZXdheSAoaS5lLiBhc3luYyBjYWxsKSBhbmQgU3R1YiB3aWxsCi0gICAgICAgICAgICAgICAgLy8gICAgICAgdXNlIHRocmVhZCBwb2xsIGZvciBpbmNvbWluZyBjYWxscy4KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgcGxheWVyU3RhdGUgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0UGxheWVyU3RhdGUoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uRXZlbnRUaW1lTXMgPSBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHBvc2l0aW9uTXMgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0Q3VycmVudFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgZmxvYXQgcGxheWJhY2tTcGVlZCA9IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRQbGF5YmFja1NwZWVkKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgbG9uZyBidWZmZXJlZFBvc2l0aW9uTXMgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0QnVmZmVyZWRQb3NpdGlvbigpOwotICAgICAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBwbGF5YmFja0luZm9CdW5kbGUgPSAoKE1lZGlhQ29udHJvbGxlcjJJbXBsLlBsYXliYWNrSW5mb0ltcGwpCi0gICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldFBsYXliYWNrSW5mbygpLmdldFByb3ZpZGVyKCkpLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcGVhdE1vZGUgPSBzZXNzaW9uLmdldEluc3RhbmNlKCkuZ2V0UmVwZWF0TW9kZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBzaHVmZmxlTW9kZSA9IHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5nZXRTaHVmZmxlTW9kZSgpOwotICAgICAgICAgICAgICAgIGZpbmFsIFBlbmRpbmdJbnRlbnQgc2Vzc2lvbkFjdGl2aXR5ID0gc2Vzc2lvbi5nZXRTZXNzaW9uQWN0aXZpdHkoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93ZWRDb21tYW5kcy5oYXNDb21tYW5kKFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfR0VUX0xJU1QpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLmdldFBsYXlsaXN0KCkgOiBudWxsOwotICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8QnVuZGxlPiBwbGF5bGlzdEJ1bmRsZTsKLSAgICAgICAgICAgICAgICBpZiAocGxheWxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBwbGF5bGlzdEJ1bmRsZSA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IEZpbmQgYSB3YXkgdG8gYXZvaWQgY29uY3VycmVudCBtb2RpZmljYXRpb24gZXhjZXB0aW9uLgotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBsYXlsaXN0LnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYUl0ZW0yIGl0ZW0gPSBwbGF5bGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQnVuZGxlIGl0ZW1CdW5kbGUgPSBpdGVtLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW1CdW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5bGlzdEJ1bmRsZS5hZGQoaXRlbUJ1bmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGxheWxpc3RCdW5kbGUgPSBudWxsOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIERvdWJsZSBjaGVjayBpZiBzZXNzaW9uIGlzIHN0aWxsIHRoZXJlLCBiZWNhdXNlIGNsb3NlKCkgY2FuIGJlIGNhbGxlZCBpbiBhbm90aGVyCi0gICAgICAgICAgICAgICAgLy8gdGhyZWFkLgotICAgICAgICAgICAgICAgIGlmIChnZXRTZXNzaW9uKCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxlci5vbkNvbm5lY3RlZChNZWRpYVNlc3Npb24yU3R1Yi50aGlzLCBhbGxvd2VkQ29tbWFuZHMudG9CdW5kbGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGF5ZXJTdGF0ZSwgcG9zaXRpb25FdmVudFRpbWVNcywgcG9zaXRpb25NcywgcGxheWJhY2tTcGVlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJlZFBvc2l0aW9uTXMsIHBsYXliYWNrSW5mb0J1bmRsZSwgcmVwZWF0TW9kZSwgc2h1ZmZsZU1vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWxpc3RCdW5kbGUsIHNlc3Npb25BY3Rpdml0eSk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoUmVtb3RlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ29udHJvbGxlciBtYXkgYmUgZGllZCBwcmVtYXR1cmVseS4KLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBIYW5kbGUgaGVyZS4KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3RpbmdDb250cm9sbGVycy5yZW1vdmUoQ29udHJvbGxlckluZm9JbXBsLmZyb20oY29udHJvbGxlckluZm8pLmdldElkKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVqZWN0aW5nIGNvbm5lY3Rpb24sIGNvbnRyb2xsZXJJbmZvPSIgKyBjb250cm9sbGVySW5mbyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxlci5vbkRpc2Nvbm5lY3RlZCgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbnRyb2xsZXIgbWF5IGJlIGRpZWQgcHJlbWF0dXJlbHkuCi0gICAgICAgICAgICAgICAgICAgIC8vIE5vdCBhbiBpc3N1ZSBiZWNhdXNlIHdlJ2xsIGlnbm9yZSBpdCBhbnl3YXkuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQ29udHJvbGxlckNsb3NlZChjYWxsZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZVRvKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgaW50IHZhbHVlLCBmaW5hbCBpbnQgZmxhZ3MpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VUX1ZPTFVNRSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBWb2x1bWVQcm92aWRlcjIgdm9sdW1lUHJvdmlkZXIgPSBzZXNzaW9uLmdldFZvbHVtZVByb3ZpZGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh2b2x1bWVQcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPKGphZXdhbik6IFNldCBsb2NhbCBzdHJlYW0gdm9sdW1lCi0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVQcm92aWRlci5vblNldFZvbHVtZVRvKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkanVzdFZvbHVtZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBkaXJlY3Rpb24sIGludCBmbGFncykKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVRfVk9MVU1FLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIFZvbHVtZVByb3ZpZGVyMiB2b2x1bWVQcm92aWRlciA9IHNlc3Npb24uZ2V0Vm9sdW1lUHJvdmlkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZvbHVtZVByb3ZpZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogQWRqdXN0IGxvY2FsIHN0cmVhbSB2b2x1bWUKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVByb3ZpZGVyLm9uQWRqdXN0Vm9sdW1lKGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZW5kVHJhbnNwb3J0Q29udHJvbENvbW1hbmQoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLAotICAgICAgICAgICAgaW50IGNvbW1hbmRDb2RlLCBCdW5kbGUgYXJncykgdGhyb3dzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBjb21tYW5kQ29kZSwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIHN3aXRjaCAoY29tbWFuZENvZGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfUExBWToKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnBsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1BBVVNFOgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkucGF1c2UoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlCQUNLX1NUT1A6Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZQkFDS19QUkVQQVJFOgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkucHJlcGFyZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUJBQ0tfU0VFS19UTzoKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNlZWtUbyhhcmdzLmdldExvbmcoQVJHVU1FTlRfS0VZX1BPU0lUSU9OKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE8oamFld2FuKTogUmVzZW5kIHVua25vd24gKG5ldykgY29tbWFuZHMgdGhyb3VnaCB0aGUgY3VzdG9tIGNvbW1hbmQuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgQnVuZGxlIGNvbW1hbmRCdW5kbGUsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgYXJncywgZmluYWwgUmVzdWx0UmVjZWl2ZXIgcmVjZWl2ZXIpIHsKLSAgICAgICAgZmluYWwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbiA9IGdldFNlc3Npb24oKTsKLSAgICAgICAgaWYgKHNlc3Npb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kID0gU2Vzc2lvbkNvbW1hbmQyLmZyb21CdW5kbGUoY29tbWFuZEJ1bmRsZSk7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIExvZy53KFRBRywgInNlbmRDdXN0b21Db21tYW5kKCk6IElnbm9yaW5nIG51bGwgY29tbWFuZCBmcm9tICIKLSAgICAgICAgICAgICAgICAgICAgKyBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlcikpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIgPSBnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlciwgY29tbWFuZCk7Ci0gICAgICAgIGlmIChjb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrRXhlY3V0b3IoKS5leGVjdXRlKCgpIC0+IHsKLSAgICAgICAgICAgIGlmIChnZXRDb250cm9sbGVySWZBYmxlKGNhbGxlciwgY29tbWFuZCkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkN1c3RvbUNvbW1hbmQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBjb21tYW5kLCBhcmdzLCByZWNlaXZlcik7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tVXJpKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgVXJpIHVyaSwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BSRVBBUkVfRlJPTV9VUkksCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwcmVwYXJlRnJvbVVyaSgpOiBJZ25vcmluZyBudWxsIHVyaSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QcmVwYXJlRnJvbVVyaShzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHByZXBhcmVGcm9tU2VhcmNoKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHF1ZXJ5LAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUFJFUEFSRV9GUk9NX1NFQVJDSCwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwcmVwYXJlRnJvbVNlYXJjaCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QcmVwYXJlRnJvbVNlYXJjaChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcHJlcGFyZUZyb21NZWRpYUlkKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QUkVQQVJFX0ZST01fTUVESUFfSUQsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwcmVwYXJlRnJvbU1lZGlhSWQoKTogSWdub3JpbmcgbnVsbCBtZWRpYUlkIGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblByZXBhcmVGcm9tTWVkaWFJZChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIG1lZGlhSWQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tVXJpKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgVXJpIHVyaSwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9TRVNTSU9OX1BMQVlfRlJPTV9VUkksCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwbGF5RnJvbVVyaSgpOiBJZ25vcmluZyBudWxsIHVyaSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QbGF5RnJvbVVyaShzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIHVyaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYXMpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHBsYXlGcm9tU2VhcmNoKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHF1ZXJ5LAotICAgICAgICAgICAgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1NFU1NJT05fUExBWV9GUk9NX1NFQVJDSCwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocXVlcnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJwbGF5RnJvbVNlYXJjaCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QbGF5RnJvbVNlYXJjaChzZXNzaW9uLmdldEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcXVlcnksIGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcGxheUZyb21NZWRpYUlkKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9QTEFZX0ZST01fTUVESUFfSUQsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1lZGlhSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAicGxheUZyb21NZWRpYUlkKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25QbGF5RnJvbU1lZGlhSWQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhSWQsIGV4dHJhcyk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0UmF0aW5nKGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIG1lZGlhSWQsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgcmF0aW5nQnVuZGxlKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfU0VTU0lPTl9TRVRfUkFUSU5HLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUlkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNldFJhdGluZygpOiBJZ25vcmluZyBudWxsIG1lZGlhSWQgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGluZ0J1bmRsZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRSYXRpbmcoKTogSWdub3JpbmcgbnVsbCByYXRpbmdCdW5kbGUgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgUmF0aW5nMiByYXRpbmcgPSBSYXRpbmcyLmZyb21CdW5kbGUocmF0aW5nQnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJhdGluZyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmF0aW5nQnVuZGxlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRSYXRpbmcoKTogSWdub3JpbmcgbnVsbCByYXRpbmcgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vblNldFJhdGluZyhzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIG1lZGlhSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF0aW5nKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIExpc3Q8QnVuZGxlPiBwbGF5bGlzdCwKLSAgICAgICAgICAgIGZpbmFsIEJ1bmRsZSBtZXRhZGF0YSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9MSVNULCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKHBsYXlsaXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzZXRQbGF5bGlzdCgpOiBJZ25vcmluZyBudWxsIHBsYXlsaXN0IGZyb20gIiArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gbGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbGF5bGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIC8vIFJlY3JlYXRlcyBVVUlEIGluIHRoZSBwbGF5bGlzdAotICAgICAgICAgICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IE1lZGlhSXRlbTJJbXBsLmZyb21CdW5kbGUocGxheWxpc3QuZ2V0KGkpLCBudWxsKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKGl0ZW0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5zZXRQbGF5bGlzdChsaXN0LCBNZWRpYU1ldGFkYXRhMi5mcm9tQnVuZGxlKG1ldGFkYXRhKSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXlsaXN0TWV0YWRhdGEoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBCdW5kbGUgbWV0YWRhdGEpIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9TRVRfTElTVF9NRVRBREFUQSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnVwZGF0ZVBsYXlsaXN0TWV0YWRhdGEoTWVkaWFNZXRhZGF0YTIuZnJvbUJ1bmRsZShtZXRhZGF0YSkpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRQbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgaW5kZXgsIEJ1bmRsZSBtZWRpYUl0ZW0pIHsKLSAgICAgICAgb25Db21tYW5kKGNhbGxlciwgU2Vzc2lvbkNvbW1hbmQyLkNPTU1BTkRfQ09ERV9QTEFZTElTVF9BRERfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICAvLyBSZXNldHMgdGhlIFVVSUQgZnJvbSB0aGUgaW5jb21pbmcgbWVkaWEgaWQsIHNvIGNvbnRyb2xsZXIgbWF5IHJldXNlIGEgbWVkaWEKLSAgICAgICAgICAgICAgICAgICAgLy8gaXRlbSBtdWx0aXBsZSB0aW1lcyBmb3IgYWRkUGxheWxpc3RJdGVtLgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuYWRkUGxheWxpc3RJdGVtKGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhSXRlbTJJbXBsLmZyb21CdW5kbGUobWVkaWFJdGVtLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlUGxheWxpc3RJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgQnVuZGxlIG1lZGlhSXRlbSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1JFTU9WRV9JVEVNLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBNZWRpYUl0ZW0yIGl0ZW0gPSBNZWRpYUl0ZW0yLmZyb21CdW5kbGUobWVkaWFJdGVtKTsKLSAgICAgICAgICAgIC8vIE5vdGU6IE1lZGlhSXRlbTIgaGFzIGhpZGRlbiBVVUlEIHRvIGlkZW50aWZ5IGl0IGFjcm9zcyB0aGUgcHJvY2Vzc2VzLgotICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnJlbW92ZVBsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVwbGFjZVBsYXlsaXN0SXRlbShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBpbmRleCwgQnVuZGxlIG1lZGlhSXRlbSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1JFUExBQ0VfSVRFTSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICAvLyBSZXNldHMgdGhlIFVVSUQgZnJvbSB0aGUgaW5jb21pbmcgbWVkaWEgaWQsIHNvIGNvbnRyb2xsZXIgbWF5IHJldXNlIGEgbWVkaWEKLSAgICAgICAgICAgICAgICAgICAgLy8gaXRlbSBtdWx0aXBsZSB0aW1lcyBmb3IgcmVwbGFjZVBsYXlsaXN0SXRlbS4KLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnJlcGxhY2VQbGF5bGlzdEl0ZW0oaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFJdGVtMkltcGwuZnJvbUJ1bmRsZShtZWRpYUl0ZW0sIG51bGwpKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBCdW5kbGUgbWVkaWFJdGVtKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0tJUF9UT19QTEFZTElTVF9JVEVNLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtZWRpYUl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2tpcFRvUGxheWxpc3RJdGVtKCk6IElnbm9yaW5nIG51bGwgbWVkaWFJdGVtIGZyb20gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IE1lZGlhSXRlbTIgaGFzIGhpZGRlbiBVVUlEIHRvIGlkZW50aWZ5IGl0IGFjcm9zcyB0aGUgcHJvY2Vzc2VzLgotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2tpcFRvUGxheWxpc3RJdGVtKE1lZGlhSXRlbTIuZnJvbUJ1bmRsZShtZWRpYUl0ZW0pKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW0oSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyKSB7Ci0gICAgICAgIG9uQ29tbWFuZChjYWxsZXIsIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfU0tJUF9QUkVWX0lURU0sCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNraXBUb1ByZXZpb3VzSXRlbSgpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNraXBUb05leHRJdGVtKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlcikgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NLSVBfTkVYVF9JVEVNLAotICAgICAgICAgICAgICAgIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIHNlc3Npb24uZ2V0SW5zdGFuY2UoKS5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdE1vZGUoSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBpbnQgcmVwZWF0TW9kZSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9SRVBFQVRfTU9ERSwKLSAgICAgICAgICAgICAgICAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmdldEluc3RhbmNlKCkuc2V0UmVwZWF0TW9kZShyZXBlYXRNb2RlKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTaHVmZmxlTW9kZShJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBvbkNvbW1hbmQoY2FsbGVyLCBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX1NFVF9TSFVGRkxFX01PREUsCi0gICAgICAgICAgICAgICAgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICAgICAgc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLnNldFNodWZmbGVNb2RlKHNodWZmbGVNb2RlKTsKLSAgICAgICAgICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gQUlETCBtZXRob2RzIGZvciBMaWJyYXJ5U2Vzc2lvbiBvdmVycmlkZXMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRMaWJyYXJ5Um9vdChmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIEJ1bmRsZSByb290SGludHMpCi0gICAgICAgICAgICB0aHJvd3MgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgZmluYWwgTGlicmFyeVJvb3Qgcm9vdCA9IHNlc3Npb24uZ2V0Q2FsbGJhY2soKS5vbkdldExpYnJhcnlSb290KHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgcm9vdEhpbnRzKTsKLSAgICAgICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uR2V0TGlicmFyeVJvb3REb25lKHJvb3RIaW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvb3QgPT0gbnVsbCA/IG51bGwgOiByb290LmdldFJvb3RJZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgcm9vdCA9PSBudWxsID8gbnVsbCA6IHJvb3QuZ2V0RXh0cmFzKCkpOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGdldEl0ZW0oZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgbWVkaWFJZCkKLSAgICAgICAgICAgIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAobWVkaWFJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm1lZGlhSWQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmluYWwgTWVkaWFJdGVtMiByZXN1bHQgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25HZXRJdGVtKHNlc3Npb24uZ2V0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlciwgbWVkaWFJZCk7Ci0gICAgICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkdldEl0ZW1Eb25lKG1lZGlhSWQsIHJlc3VsdCA9PSBudWxsID8gbnVsbCA6IHJlc3VsdC50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBnZXRDaGlsZHJlbihmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBwYXJlbnRJZCwKLSAgICAgICAgICAgIGZpbmFsIGludCBwYWdlLCBmaW5hbCBpbnQgcGFnZVNpemUsIGZpbmFsIEJ1bmRsZSBleHRyYXMpIHRocm93cyBSdW50aW1lRXhjZXB0aW9uIHsKLSAgICAgICAgb25Ccm93c2VyQ29tbWFuZChjYWxsZXIsIChzZXNzaW9uLCBjb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAocGFyZW50SWQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJwYXJlbnRJZCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocGFnZSA8IDEgfHwgcGFnZVNpemUgPCAxKSB7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIk5laXRoZXIgcGFnZSBub3IgcGFnZVNpemUgc2hvdWxkIGJlIGxlc3MgdGhhbiAxIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcmVzdWx0ID0gc2Vzc2lvbi5nZXRDYWxsYmFjaygpLm9uR2V0Q2hpbGRyZW4oc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIGV4dHJhcyk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LnNpemUoKSA+IHBhZ2VTaXplKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib25HZXRDaGlsZHJlbigpIHNob3VsZG4ndCByZXR1cm4gbWVkaWEgaXRlbXMgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAibW9yZSB0aGFuIHBhZ2VTaXplLiByZXN1bHQuc2l6ZSgpPSIgKyByZXN1bHQuc2l6ZSgpICsgIiBwYWdlU2l6ZT0iCi0gICAgICAgICAgICAgICAgICAgICAgICArIHBhZ2VTaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpbmFsIExpc3Q8QnVuZGxlPiBidW5kbGVMaXN0OwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgIGZvciAoTWVkaWFJdGVtMiBpdGVtIDogcmVzdWx0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QuYWRkKGl0ZW0gPT0gbnVsbCA/IG51bGwgOiBpdGVtLnRvQnVuZGxlKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub3RpZnkoY29udHJvbGxlciwgKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkdldENoaWxkcmVuRG9uZShwYXJlbnRJZCwgcGFnZSwgcGFnZVNpemUsIGJ1bmRsZUxpc3QsIGV4dHJhcyk7Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2VhcmNoKElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgU3RyaW5nIHF1ZXJ5LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHF1ZXJ5KSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNlYXJjaCgpOiBJZ25vcmluZyBlbXB0eSBxdWVyeSBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25TZWFyY2goc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLCBjb250cm9sbGVyLCBxdWVyeSwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZ2V0U2VhcmNoUmVzdWx0KGZpbmFsIElNZWRpYUNvbnRyb2xsZXIyIGNhbGxlciwgZmluYWwgU3RyaW5nIHF1ZXJ5LAotICAgICAgICAgICAgZmluYWwgaW50IHBhZ2UsIGZpbmFsIGludCBwYWdlU2l6ZSwgZmluYWwgQnVuZGxlIGV4dHJhcykgewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShxdWVyeSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJnZXRTZWFyY2hSZXN1bHQoKTogSWdub3JpbmcgZW1wdHkgcXVlcnkgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBhZ2UgPCAxIHx8IHBhZ2VTaXplIDwgMSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgImdldFNlYXJjaFJlc3VsdCgpOiBJZ25vcmluZyBuZWdhdGl2ZSBwYWdlIC8gcGFnZVNpemUuIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiIHBhZ2U9IiArIHBhZ2UgKyAiIHBhZ2VTaXplPSIgKyBwYWdlU2l6ZSArICIgZnJvbSAiICsgY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiByZXN1bHQgPSBzZXNzaW9uLmdldENhbGxiYWNrKCkub25HZXRTZWFyY2hSZXN1bHQoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBxdWVyeSwgcGFnZSwgcGFnZVNpemUsIGV4dHJhcyk7Ci0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0LnNpemUoKSA+IHBhZ2VTaXplKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigib25HZXRTZWFyY2hSZXN1bHQoKSBzaG91bGRuJ3QgcmV0dXJuIG1lZGlhICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIml0ZW1zIG1vcmUgdGhhbiBwYWdlU2l6ZS4gcmVzdWx0LnNpemUoKT0iICsgcmVzdWx0LnNpemUoKSArICIgcGFnZVNpemU9IgotICAgICAgICAgICAgICAgICAgICAgICAgKyBwYWdlU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PEJ1bmRsZT4gYnVuZGxlTGlzdDsKLSAgICAgICAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICBmb3IgKE1lZGlhSXRlbTIgaXRlbSA6IHJlc3VsdCkgewotICAgICAgICAgICAgICAgICAgICBidW5kbGVMaXN0LmFkZChpdGVtID09IG51bGwgPyBudWxsIDogaXRlbS50b0J1bmRsZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25HZXRTZWFyY2hSZXN1bHREb25lKHF1ZXJ5LCBwYWdlLCBwYWdlU2l6ZSwgYnVuZGxlTGlzdCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0pOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdWJzY3JpYmUoZmluYWwgSU1lZGlhQ29udHJvbGxlcjIgY2FsbGVyLCBmaW5hbCBTdHJpbmcgcGFyZW50SWQsCi0gICAgICAgICAgICBmaW5hbCBCdW5kbGUgb3B0aW9uKSB7Ci0gICAgICAgIG9uQnJvd3NlckNvbW1hbmQoY2FsbGVyLCAoc2Vzc2lvbiwgY29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKHBhcmVudElkID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJzdWJzY3JpYmUoKTogSWdub3JpbmcgbnVsbCBwYXJlbnRJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25TdWJzY3JpYmUoc2Vzc2lvbi5nZXRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLCBwYXJlbnRJZCwgb3B0aW9uKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICBTZXQ8U3RyaW5nPiBzdWJzY3JpcHRpb24gPSBtU3Vic2NyaXB0aW9ucy5nZXQoY29udHJvbGxlcik7Ci0gICAgICAgICAgICAgICAgaWYgKHN1YnNjcmlwdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbiA9IG5ldyBIYXNoU2V0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnNjcmlwdGlvbnMucHV0KGNvbnRyb2xsZXIsIHN1YnNjcmlwdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN1YnNjcmlwdGlvbi5hZGQocGFyZW50SWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1bnN1YnNjcmliZShmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBjYWxsZXIsIGZpbmFsIFN0cmluZyBwYXJlbnRJZCkgewotICAgICAgICBvbkJyb3dzZXJDb21tYW5kKGNhbGxlciwgKHNlc3Npb24sIGNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChwYXJlbnRJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAidW5zdWJzY3JpYmUoKTogSWdub3JpbmcgbnVsbCBwYXJlbnRJZCBmcm9tICIgKyBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXNzaW9uLmdldENhbGxiYWNrKCkub25VbnN1YnNjcmliZShzZXNzaW9uLmdldEluc3RhbmNlKCksIGNvbnRyb2xsZXIsIHBhcmVudElkKTsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICBtU3Vic2NyaXB0aW9ucy5yZW1vdmUoY29udHJvbGxlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBBUElzIGZvciBNZWRpYVNlc3Npb24ySW1wbAotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIC8vIFRPRE8oamFld2FuKTogKENhbiBiZSBQb3N0LVApIE5lZWQgYSB3YXkgdG8gZ2V0IGNvbnRyb2xsZXIgd2l0aCBwZXJtaXNzaW9ucwotICAgIHB1YmxpYyBMaXN0PENvbnRyb2xsZXJJbmZvPiBnZXRDb250cm9sbGVycygpIHsKLSAgICAgICAgQXJyYXlMaXN0PENvbnRyb2xsZXJJbmZvPiBjb250cm9sbGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Db250cm9sbGVycy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXJzLmFkZChtQ29udHJvbGxlcnMudmFsdWVBdChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJzOwotICAgIH0KLQotICAgIC8vIFNob3VsZCBiZSB1c2VkIHdpdGhvdXQgYSBsb2NrIHRvIHByZXZlbnQgcG90ZW50aWFsIGRlYWRsb2NrLgotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBsYXllclN0YXRlQ2hhbmdlZE5vdExvY2tlZChpbnQgc3RhdGUpIHsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5ZXJTdGF0ZUNoYW5nZWQoc3RhdGUpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPKGphZXdhbik6IFJlbmFtZQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVBvc2l0aW9uQ2hhbmdlZE5vdExvY2tlZChsb25nIGV2ZW50VGltZU1zLCBsb25nIHBvc2l0aW9uTXMpIHsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25Qb3NpdGlvbkNoYW5nZWQoZXZlbnRUaW1lTXMsIHBvc2l0aW9uTXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlQbGF5YmFja1NwZWVkQ2hhbmdlZE5vdExvY2tlZChmbG9hdCBzcGVlZCkgewotICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXliYWNrU3BlZWRDaGFuZ2VkKHNwZWVkKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5QnVmZmVyZWRQb3NpdGlvbkNoYW5nZWROb3RMb2NrZWQobG9uZyBidWZmZXJlZFBvc2l0aW9uTXMpIHsKLSAgICAgICAgbm90aWZ5QWxsKChjb250cm9sbGVyLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25CdWZmZXJlZFBvc2l0aW9uQ2hhbmdlZChidWZmZXJlZFBvc2l0aW9uTXMpOwotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDdXN0b21MYXlvdXROb3RMb2NrZWQoQ29udHJvbGxlckluZm8gY29udHJvbGxlciwgTGlzdDxDb21tYW5kQnV0dG9uPiBsYXlvdXQpIHsKLSAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBMaXN0PEJ1bmRsZT4gbGF5b3V0QnVuZGxlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsYXlvdXQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gKChDb21tYW5kQnV0dG9uSW1wbCkgbGF5b3V0LmdldChpKS5nZXRQcm92aWRlcigpKS50b0J1bmRsZSgpOwotICAgICAgICAgICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBsYXlvdXRCdW5kbGVzLmFkZChidW5kbGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQ3VzdG9tTGF5b3V0Q2hhbmdlZChsYXlvdXRCdW5kbGVzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWxpc3RDaGFuZ2VkTm90TG9ja2VkKExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QsIE1lZGlhTWV0YWRhdGEyIG1ldGFkYXRhKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8QnVuZGxlPiBidW5kbGVMaXN0OwotICAgICAgICBpZiAocGxheWxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgYnVuZGxlTGlzdCA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwbGF5bGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChwbGF5bGlzdC5nZXQoaSkgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBCdW5kbGUgYnVuZGxlID0gcGxheWxpc3QuZ2V0KGkpLnRvQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChidW5kbGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYnVuZGxlTGlzdC5hZGQoYnVuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ1bmRsZUxpc3QgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIEJ1bmRsZSBtZXRhZGF0YUJ1bmRsZSA9IChtZXRhZGF0YSA9PSBudWxsKSA/IG51bGwgOiBtZXRhZGF0YS50b0J1bmRsZSgpOwotICAgICAgICBub3RpZnlBbGwoKGNvbnRyb2xsZXIsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlckJpbmRlcklmQWJsZShjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICBTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0dFVF9MSVNUKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25QbGF5bGlzdENoYW5nZWQoYnVuZGxlTGlzdCwgbWV0YWRhdGFCdW5kbGUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChnZXRDb250cm9sbGVyQmluZGVySWZBYmxlKGNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgICAgIFNlc3Npb25Db21tYW5kMi5DT01NQU5EX0NPREVfUExBWUxJU1RfR0VUX0xJU1RfTUVUQURBVEEpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkKG1ldGFkYXRhQnVuZGxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWROb3RMb2NrZWQoTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgZmluYWwgQnVuZGxlIG1ldGFkYXRhQnVuZGxlID0gKG1ldGFkYXRhID09IG51bGwpID8gbnVsbCA6IG1ldGFkYXRhLnRvQnVuZGxlKCk7Ci0gICAgICAgIG5vdGlmeUFsbChTZXNzaW9uQ29tbWFuZDIuQ09NTUFORF9DT0RFX1BMQVlMSVNUX0dFVF9MSVNUX01FVEFEQVRBLAotICAgICAgICAgICAgICAgICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICAgICAgICAgIGlDb250cm9sbGVyLm9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQobWV0YWRhdGFCdW5kbGUpOwotICAgICAgICAgICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeVJlcGVhdE1vZGVDaGFuZ2VkTm90TG9ja2VkKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25SZXBlYXRNb2RlQ2hhbmdlZChyZXBlYXRNb2RlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5U2h1ZmZsZU1vZGVDaGFuZ2VkTm90TG9ja2VkKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBub3RpZnlBbGwoKHVudXNlZCwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkKHNodWZmbGVNb2RlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5UGxheWJhY2tJbmZvQ2hhbmdlZChNZWRpYUNvbnRyb2xsZXIyLlBsYXliYWNrSW5mbyBwbGF5YmFja0luZm8pIHsKLSAgICAgICAgZmluYWwgQnVuZGxlIHBsYXliYWNrSW5mb0J1bmRsZSA9Ci0gICAgICAgICAgICAgICAgKChNZWRpYUNvbnRyb2xsZXIySW1wbC5QbGF5YmFja0luZm9JbXBsKSBwbGF5YmFja0luZm8uZ2V0UHJvdmlkZXIoKSkudG9CdW5kbGUoKTsKLSAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vblBsYXliYWNrSW5mb0NoYW5nZWQocGxheWJhY2tJbmZvQnVuZGxlKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QWxsb3dlZENvbW1hbmRzKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFNlc3Npb25Db21tYW5kR3JvdXAyIGNvbW1hbmRzKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIG1BbGxvd2VkQ29tbWFuZEdyb3VwTWFwLnB1dChjb250cm9sbGVyLCBjb21tYW5kcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkFsbG93ZWRDb21tYW5kc0NoYW5nZWQoY29tbWFuZHMudG9CdW5kbGUoKSk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNlbmRDdXN0b21Db21tYW5kKENvbnRyb2xsZXJJbmZvIGNvbnRyb2xsZXIsIFNlc3Npb25Db21tYW5kMiBjb21tYW5kLCBCdW5kbGUgYXJncywKLSAgICAgICAgICAgIFJlc3VsdFJlY2VpdmVyIHJlY2VpdmVyKSB7Ci0gICAgICAgIGlmIChyZWNlaXZlciAhPSBudWxsICYmIGNvbnRyb2xsZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29udHJvbGxlciBzaG91bGRuJ3QgYmUgbnVsbCBpZiByZXN1bHQgcmVjZWl2ZXIgaXMiCi0gICAgICAgICAgICAgICAgICAgICsgIiBzcGVjaWZpZWQiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY29tbWFuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21tYW5kIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5KGNvbnRyb2xsZXIsICh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBCdW5kbGUgY29tbWFuZEJ1bmRsZSA9IGNvbW1hbmQudG9CdW5kbGUoKTsKLSAgICAgICAgICAgIGlDb250cm9sbGVyLm9uQ3VzdG9tQ29tbWFuZChjb21tYW5kQnVuZGxlLCBhcmdzLCBudWxsKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2VuZEN1c3RvbUNvbW1hbmQoU2Vzc2lvbkNvbW1hbmQyIGNvbW1hbmQsIEJ1bmRsZSBhcmdzKSB7Ci0gICAgICAgIGlmIChjb21tYW5kID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvbW1hbmQgc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBCdW5kbGUgY29tbWFuZEJ1bmRsZSA9IGNvbW1hbmQudG9CdW5kbGUoKTsKLSAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkN1c3RvbUNvbW1hbmQoY29tbWFuZEJ1bmRsZSwgYXJncywgbnVsbCk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUVycm9yKGludCBlcnJvckNvZGUsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgbm90aWZ5QWxsKCh1bnVzZWQsIGlDb250cm9sbGVyKSAtPiB7Ci0gICAgICAgICAgICBpQ29udHJvbGxlci5vbkVycm9yKGVycm9yQ29kZSwgZXh0cmFzKTsKLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIEFQSXMgZm9yIE1lZGlhTGlicmFyeVNlc3Npb25JbXBsCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgcHVibGljIHZvaWQgbm90aWZ5U2VhcmNoUmVzdWx0Q2hhbmdlZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcXVlcnksIGludCBpdGVtQ291bnQsCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaUNvbnRyb2xsZXIub25TZWFyY2hSZXN1bHRDaGFuZ2VkKHF1ZXJ5LCBpdGVtQ291bnQsIGV4dHJhcyk7Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG5vdGlmeUNoaWxkcmVuQ2hhbmdlZE5vdExvY2tlZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcGFyZW50SWQsCi0gICAgICAgICAgICBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG5vdGlmeShjb250cm9sbGVyLCAodW51c2VkLCBpQ29udHJvbGxlcikgLT4gewotICAgICAgICAgICAgaWYgKGlzU3Vic2NyaWJlZChjb250cm9sbGVyLCBwYXJlbnRJZCkpIHsKLSAgICAgICAgICAgICAgICBpQ29udHJvbGxlci5vbkNoaWxkcmVuQ2hhbmdlZChwYXJlbnRJZCwgaXRlbUNvdW50LCBleHRyYXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBub3RpZnlDaGlsZHJlbkNoYW5nZWROb3RMb2NrZWQoU3RyaW5nIHBhcmVudElkLCBpbnQgaXRlbUNvdW50LCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIG5vdGlmeUFsbCgoY29udHJvbGxlciwgaUNvbnRyb2xsZXIpIC0+IHsKLSAgICAgICAgICAgIGlmIChpc1N1YnNjcmliZWQoY29udHJvbGxlciwgcGFyZW50SWQpKSB7Ci0gICAgICAgICAgICAgICAgaUNvbnRyb2xsZXIub25DaGlsZHJlbkNoYW5nZWQocGFyZW50SWQsIGl0ZW1Db3VudCwgZXh0cmFzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzU3Vic2NyaWJlZChDb250cm9sbGVySW5mbyBjb250cm9sbGVyLCBTdHJpbmcgcGFyZW50SWQpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgU2V0PFN0cmluZz4gc3Vic2NyaXB0aW9ucyA9IG1TdWJzY3JpcHRpb25zLmdldChjb250cm9sbGVyKTsKLSAgICAgICAgICAgIGlmIChzdWJzY3JpcHRpb25zID09IG51bGwgfHwgIXN1YnNjcmlwdGlvbnMuY29udGFpbnMocGFyZW50SWQpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgICAvLyBNaXNjCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQEZ1bmN0aW9uYWxJbnRlcmZhY2UKLSAgICBwcml2YXRlIGludGVyZmFjZSBTZXNzaW9uUnVubmFibGUgewotICAgICAgICB2b2lkIHJ1bihmaW5hbCBNZWRpYVNlc3Npb24ySW1wbCBzZXNzaW9uLCBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBARnVuY3Rpb25hbEludGVyZmFjZQotICAgIHByaXZhdGUgaW50ZXJmYWNlIExpYnJhcnlTZXNzaW9uUnVubmFibGUgewotICAgICAgICB2b2lkIHJ1bihmaW5hbCBNZWRpYUxpYnJhcnlTZXNzaW9uSW1wbCBzZXNzaW9uLCBmaW5hbCBDb250cm9sbGVySW5mbyBjb250cm9sbGVyKTsKLSAgICB9Ci0KLSAgICBARnVuY3Rpb25hbEludGVyZmFjZQotICAgIHByaXZhdGUgaW50ZXJmYWNlIE5vdGlmeVJ1bm5hYmxlIHsKLSAgICAgICAgdm9pZCBydW4oZmluYWwgQ29udHJvbGxlckluZm8gY29udHJvbGxlciwKLSAgICAgICAgICAgICAgICBmaW5hbCBJTWVkaWFDb250cm9sbGVyMiBpQ29udHJvbGxlcikgdGhyb3dzIFJlbW90ZUV4Y2VwdGlvbjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvblNlcnZpY2UySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9NZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzZWI2NS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL01lZGlhU2Vzc2lvblNlcnZpY2UySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5jb250ZW50LkNvbnRleHQuTk9USUZJQ0FUSU9OX1NFUlZJQ0U7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5Ob3RpZmljYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uTWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllckV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMi5NZWRpYU5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRva2VuVHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYVNlc3Npb25TZXJ2aWNlMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQub3MuSUJpbmRlcjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5HdWFyZGVkQnk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotLy8gVE9ETyhqYWV3YW4pOiBOZWVkIGEgdGVzdCBmb3Igc2Vzc2lvbiBzZXJ2aWNlIGl0c2VsZi4KLXB1YmxpYyBjbGFzcyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwgaW1wbGVtZW50cyBNZWRpYVNlc3Npb25TZXJ2aWNlMlByb3ZpZGVyIHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTVBTZXNzaW9uU2VydmljZSI7IC8vIHRvIG1lZXQgMjMgY2hhciBsaW1pdCBpbiBMb2cgdGFnCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFRPRE8oamFld2FuKTogQ2hhbmdlIHRoaXMuIChiLzc0MDk0NjExKQotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVNlc3Npb25TZXJ2aWNlMiBtSW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQbGF5ZXJFdmVudENhbGxiYWNrIG1DYWxsYmFjayA9IG5ldyBTZXNzaW9uU2VydmljZUV2ZW50Q2FsbGJhY2soKTsKLQotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG1Mb2NrID0gbmV3IE9iamVjdCgpOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIE5vdGlmaWNhdGlvbk1hbmFnZXIgbU5vdGlmaWNhdGlvbk1hbmFnZXI7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgSW50ZW50IG1TdGFydFNlbGZJbnRlbnQ7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzUnVubmluZ0ZvcmVncm91bmQ7Ci0gICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24yIG1TZXNzaW9uOwotCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbChNZWRpYVNlc3Npb25TZXJ2aWNlMiBpbnN0YW5jZSkgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIk1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbCgiICsgaW5zdGFuY2UgKyAiKSIpOwotICAgICAgICB9Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yIGdldFNlc3Npb25faW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIGdldFNlc3Npb24oKTsKLSAgICB9Ci0KLSAgICBNZWRpYVNlc3Npb24yIGdldFNlc3Npb24oKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBtU2Vzc2lvbjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU5vdGlmaWNhdGlvbiBvblVwZGF0ZU5vdGlmaWNhdGlvbl9pbXBsKCkgewotICAgICAgICAvLyBQcm92aWRlIGRlZmF1bHQgbm90aWZpY2F0aW9uIFVJIGxhdGVyLgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkNyZWF0ZV9pbXBsKCkgewotICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlciA9IChOb3RpZmljYXRpb25NYW5hZ2VyKSBtSW5zdGFuY2UuZ2V0U3lzdGVtU2VydmljZSgKLSAgICAgICAgICAgICAgICBOT1RJRklDQVRJT05fU0VSVklDRSk7Ci0gICAgICAgIG1TdGFydFNlbGZJbnRlbnQgPSBuZXcgSW50ZW50KG1JbnN0YW5jZSwgbUluc3RhbmNlLmdldENsYXNzKCkpOwotCi0gICAgICAgIFNlc3Npb25Ub2tlbjIgdG9rZW4gPSBuZXcgU2Vzc2lvblRva2VuMihtSW5zdGFuY2UsIG1JbnN0YW5jZS5nZXRQYWNrYWdlTmFtZSgpLAotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgICAgIGlmICh0b2tlbi5nZXRUeXBlKCkgIT0gZ2V0U2Vzc2lvblR5cGUoKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkV4cGVjdGVkIHNlc3Npb24gc2VydmljZSwgYnV0IHdhcyAiICsgdG9rZW4uZ2V0VHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICBtU2Vzc2lvbiA9IG1JbnN0YW5jZS5vbkNyZWF0ZVNlc3Npb24odG9rZW4uZ2V0SWQoKSk7Ci0gICAgICAgIGlmIChtU2Vzc2lvbiA9PSBudWxsIHx8ICF0b2tlbi5nZXRJZCgpLmVxdWFscyhtU2Vzc2lvbi5nZXRUb2tlbigpLmdldElkKCkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXhwZWN0ZWQgc2Vzc2lvbiB3aXRoIGlkICIgKyB0b2tlbi5nZXRJZCgpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgYnV0IGdvdCAiICsgbVNlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIC8vIFRPRE8oamFld2FuKTogVW5jb21tZW50IGhlcmUuCi0gICAgICAgIC8vIG1TZXNzaW9uLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjayhtQ2FsbGJhY2ssIG1TZXNzaW9uLmdldEV4ZWN1dG9yKCkpOwotICAgIH0KLQotICAgIEBUb2tlblR5cGUgaW50IGdldFNlc3Npb25UeXBlKCkgewotICAgICAgICByZXR1cm4gU2Vzc2lvblRva2VuMi5UWVBFX1NFU1NJT05fU0VSVklDRTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSUJpbmRlciBvbkJpbmRfaW1wbChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGlmIChNZWRpYVNlc3Npb25TZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRS5lcXVhbHMoaW50ZW50LmdldEFjdGlvbigpKSkgewotICAgICAgICAgICAgcmV0dXJuICgoTWVkaWFTZXNzaW9uMkltcGwpIG1TZXNzaW9uLmdldFByb3ZpZGVyKCkpLmdldFNlc3Npb25TdHViKCkuYXNCaW5kZXIoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTm90aWZpY2F0aW9uKGludCBwbGF5ZXJTdGF0ZSkgewotICAgICAgICBNZWRpYU5vdGlmaWNhdGlvbiBtZWRpYU5vdGlmaWNhdGlvbiA9IG1JbnN0YW5jZS5vblVwZGF0ZU5vdGlmaWNhdGlvbigpOwotICAgICAgICBpZiAobWVkaWFOb3RpZmljYXRpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHN3aXRjaChwbGF5ZXJTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXllckJhc2UuUExBWUVSX1NUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgaWYgKCFtSXNSdW5uaW5nRm9yZWdyb3VuZCkgewotICAgICAgICAgICAgICAgICAgICBtSXNSdW5uaW5nRm9yZWdyb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5zdGFydEZvcmVncm91bmRTZXJ2aWNlKG1TdGFydFNlbGZJbnRlbnQpOwotICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc3RhcnRGb3JlZ3JvdW5kKG1lZGlhTm90aWZpY2F0aW9uLmdldE5vdGlmaWNhdGlvbklkKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFOb3RpZmljYXRpb24uZ2V0Tm90aWZpY2F0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXllckJhc2UuUExBWUVSX1NUQVRFX0lETEU6Ci0gICAgICAgICAgICBjYXNlIE1lZGlhUGxheWVyQmFzZS5QTEFZRVJfU1RBVEVfRVJST1I6Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc1J1bm5pbmdGb3JlZ3JvdW5kKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Jc1J1bm5pbmdGb3JlZ3JvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5zdG9wRm9yZWdyb3VuZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtTm90aWZpY2F0aW9uTWFuYWdlci5ub3RpZnkobWVkaWFOb3RpZmljYXRpb24uZ2V0Tm90aWZpY2F0aW9uSWQoKSwKLSAgICAgICAgICAgICAgICBtZWRpYU5vdGlmaWNhdGlvbi5nZXROb3RpZmljYXRpb24oKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBTZXNzaW9uU2VydmljZUV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBQbGF5ZXJFdmVudENhbGxiYWNrIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWVyU3RhdGVDaGFuZ2VkKE1lZGlhUGxheWVyQmFzZSBwbGF5ZXIsIGludCBzdGF0ZSkgewotICAgICAgICAgICAgLy8gVE9ETzogSW1wbGVtZW50IHRoaXMKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgTWVkaWFOb3RpZmljYXRpb25JbXBsIGltcGxlbWVudHMgTWVkaWFOb3RpZmljYXRpb25Qcm92aWRlciB7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Ob3RpZmljYXRpb25JZDsKLSAgICAgICAgcHJpdmF0ZSBOb3RpZmljYXRpb24gbU5vdGlmaWNhdGlvbjsKLQotICAgICAgICBwdWJsaWMgTWVkaWFOb3RpZmljYXRpb25JbXBsKE1lZGlhTm90aWZpY2F0aW9uIGluc3RhbmNlLCBpbnQgbm90aWZpY2F0aW9uSWQsCi0gICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uIG5vdGlmaWNhdGlvbikgewotICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbiA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigibm90aWZpY2F0aW9uIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTm90aWZpY2F0aW9uSWQgPSBub3RpZmljYXRpb25JZDsKLSAgICAgICAgICAgIG1Ob3RpZmljYXRpb24gPSBub3RpZmljYXRpb247Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXROb3RpZmljYXRpb25JZF9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Ob3RpZmljYXRpb25JZDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTm90aWZpY2F0aW9uIGdldE5vdGlmaWNhdGlvbl9pbXBsKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Ob3RpZmljYXRpb247Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JhdGluZzJJbXBsLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JhdGluZzJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1NTgxMjkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9SYXRpbmcySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5SYXRpbmcyLio7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5SYXRpbmcyLlN0eWxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlJhdGluZzJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS51dGlsLk9iamVjdHM7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBSYXRpbmcySW1wbCBpbXBsZW1lbnRzIFJhdGluZzJQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJSYXRpbmcyIjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1RZTEUgPSAiYW5kcm9pZC5tZWRpYS5yYXRpbmcyLnN0eWxlIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZBTFVFID0gImFuZHJvaWQubWVkaWEucmF0aW5nMi52YWx1ZSI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIHN0YXRpYyBmbG9hdCBSQVRJTkdfTk9UX1JBVEVEID0gLTEuMGY7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJhdGluZzIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1SYXRpbmdTdHlsZTsKLSAgICBwcml2YXRlIGZpbmFsIGZsb2F0IG1SYXRpbmdWYWx1ZTsKLQotICAgIHByaXZhdGUgUmF0aW5nMkltcGwoQFN0eWxlIGludCByYXRpbmdTdHlsZSwgZmxvYXQgcmF0aW5nKSB7Ci0gICAgICAgIG1SYXRpbmdTdHlsZSA9IHJhdGluZ1N0eWxlOwotICAgICAgICBtUmF0aW5nVmFsdWUgPSByYXRpbmc7Ci0gICAgICAgIG1JbnN0YW5jZSA9IG5ldyBSYXRpbmcyKHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmdfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuICJSYXRpbmcyOnN0eWxlPSIgKyBtUmF0aW5nU3R5bGUgKyAiIHJhdGluZz0iCi0gICAgICAgICAgICAgICAgKyAobVJhdGluZ1ZhbHVlIDwgMC4wZiA/ICJ1bnJhdGVkIiA6IFN0cmluZy52YWx1ZU9mKG1SYXRpbmdWYWx1ZSkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgUmF0aW5nMikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBSYXRpbmcySW1wbCBvdGhlciA9IChSYXRpbmcySW1wbCkgKChSYXRpbmcyKSBvYmopLmdldFByb3ZpZGVyKCk7Ci0gICAgICAgIHJldHVybiBtUmF0aW5nU3R5bGUgPT0gb3RoZXIubVJhdGluZ1N0eWxlCi0gICAgICAgICAgICAgICAgJiYgbVJhdGluZ1ZhbHVlID09IG90aGVyLm1SYXRpbmdWYWx1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBPYmplY3RzLmhhc2gobVJhdGluZ1N0eWxlLCBtUmF0aW5nVmFsdWUpOwotICAgIH0KLQotICAgIFJhdGluZzIgZ2V0SW5zdGFuY2UoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIGZyb21CdW5kbGVfaW1wbChCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChidW5kbGUuZ2V0SW50KEtFWV9TVFlMRSksIGJ1bmRsZS5nZXRGbG9hdChLRVlfVkFMVUUpKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBCdW5kbGUgdG9CdW5kbGVfaW1wbCgpIHsKLSAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgYnVuZGxlLnB1dEludChLRVlfU1RZTEUsIG1SYXRpbmdTdHlsZSk7Ci0gICAgICAgIGJ1bmRsZS5wdXRGbG9hdChLRVlfVkFMVUUsIG1SYXRpbmdWYWx1ZSk7Ci0gICAgICAgIHJldHVybiBidW5kbGU7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIG5ld1VucmF0ZWRSYXRpbmdfaW1wbChAU3R5bGUgaW50IHJhdGluZ1N0eWxlKSB7Ci0gICAgICAgIHN3aXRjaChyYXRpbmdTdHlsZSkgewotICAgICAgICAgICAgY2FzZSBSQVRJTkdfSEVBUlQ6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR19USFVNQl9VUF9ET1dOOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfM19TVEFSUzoKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR181X1NUQVJTOgotICAgICAgICAgICAgY2FzZSBSQVRJTkdfUEVSQ0VOVEFHRToKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJhdGluZzJJbXBsKHJhdGluZ1N0eWxlLCBSQVRJTkdfTk9UX1JBVEVEKS5nZXRJbnN0YW5jZSgpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdIZWFydFJhdGluZ19pbXBsKGJvb2xlYW4gaGFzSGVhcnQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChSQVRJTkdfSEVBUlQsIGhhc0hlYXJ0ID8gMS4wZiA6IDAuMGYpLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIG5ld1RodW1iUmF0aW5nX2ltcGwoYm9vbGVhbiB0aHVtYklzVXApIHsKLSAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChSQVRJTkdfVEhVTUJfVVBfRE9XTiwgdGh1bWJJc1VwID8gMS4wZiA6IDAuMGYpLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBSYXRpbmcyIG5ld1N0YXJSYXRpbmdfaW1wbChpbnQgc3RhclJhdGluZ1N0eWxlLCBmbG9hdCBzdGFyUmF0aW5nKSB7Ci0gICAgICAgIGZsb2F0IG1heFJhdGluZyA9IFJBVElOR19OT1RfUkFURUQ7Ci0gICAgICAgIHN3aXRjaChzdGFyUmF0aW5nU3R5bGUpIHsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzNfU1RBUlM6Ci0gICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gMy4wZjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6Ci0gICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gNC4wZjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzVfU1RBUlM6Ci0gICAgICAgICAgICAgICAgbWF4UmF0aW5nID0gNS4wZjsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiSW52YWxpZCByYXRpbmcgc3R5bGUgKCIgKyBzdGFyUmF0aW5nU3R5bGUgKyAiKSBmb3IgYSBzdGFyIHJhdGluZyIpOwotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmICgoc3RhclJhdGluZyA8IDAuMGYpIHx8IChzdGFyUmF0aW5nID4gbWF4UmF0aW5nKSkgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiVHJ5aW5nIHRvIHNldCBvdXQgb2YgcmFuZ2Ugc3Rhci1iYXNlZCByYXRpbmciKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgUmF0aW5nMkltcGwoc3RhclJhdGluZ1N0eWxlLCBzdGFyUmF0aW5nKS5nZXRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmF0aW5nMiBuZXdQZXJjZW50YWdlUmF0aW5nX2ltcGwoZmxvYXQgcGVyY2VudCkgewotICAgICAgICBpZiAoKHBlcmNlbnQgPCAwLjBmKSB8fCAocGVyY2VudCA+IDEwMC4wZikpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkludmFsaWQgcGVyY2VudGFnZS1iYXNlZCByYXRpbmcgdmFsdWUiKTsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBSYXRpbmcySW1wbChSQVRJTkdfUEVSQ0VOVEFHRSwgcGVyY2VudCkuZ2V0SW5zdGFuY2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzUmF0ZWRfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1SYXRpbmdWYWx1ZSA+PSAwLjBmOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0UmF0aW5nU3R5bGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1SYXRpbmdTdHlsZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNIZWFydF9pbXBsKCkgewotICAgICAgICBpZiAobVJhdGluZ1N0eWxlICE9IFJBVElOR19IRUFSVCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChtUmF0aW5nVmFsdWUgPT0gMS4wZik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1RodW1iVXBfaW1wbCgpIHsKLSAgICAgICAgaWYgKG1SYXRpbmdTdHlsZSAhPSBSQVRJTkdfVEhVTUJfVVBfRE9XTikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIChtUmF0aW5nVmFsdWUgPT0gMS4wZik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0U3RhclJhdGluZ19pbXBsKCkgewotICAgICAgICBzd2l0Y2ggKG1SYXRpbmdTdHlsZSkgewotICAgICAgICAgICAgY2FzZSBSQVRJTkdfM19TVEFSUzoKLSAgICAgICAgICAgIGNhc2UgUkFUSU5HXzRfU1RBUlM6Ci0gICAgICAgICAgICBjYXNlIFJBVElOR181X1NUQVJTOgotICAgICAgICAgICAgICAgIGlmIChtSW5zdGFuY2UuaXNSYXRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtUmF0aW5nVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gLTEuMGY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmxvYXQgZ2V0UGVyY2VudFJhdGluZ19pbXBsKCkgewotICAgICAgICBpZiAoKG1SYXRpbmdTdHlsZSAhPSBSQVRJTkdfUEVSQ0VOVEFHRSkgfHwgIW1JbnN0YW5jZS5pc1JhdGVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiAtMS4wZjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBtUmF0aW5nVmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JvdXRlUGxheWVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1JvdXRlUGxheWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0NTBkMzQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Sb3V0ZVBsYXllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGU7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhSXRlbVN0YXR1czsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFTZXNzaW9uU3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuUmVtb3RlUGxheWJhY2tDbGllbnQ7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5SZW1vdGVQbGF5YmFja0NsaWVudC5JdGVtQWN0aW9uQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5SZW1vdGVQbGF5YmFja0NsaWVudC5TZXNzaW9uQWN0aW9uQ2FsbGJhY2s7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5SZW1vdGVQbGF5YmFja0NsaWVudC5TdGF0dXNDYWxsYmFjazsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLUBSZXF1aXJlc0FwaShhcGkgPSBCdWlsZC5WRVJTSU9OX0NPREVTLkxPTExJUE9QKQotcHVibGljIGNsYXNzIFJvdXRlUGxheWVyIGV4dGVuZHMgTWVkaWFTZXNzaW9uLkNhbGxiYWNrIHsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgUExBWUJBQ0tfQUNUSU9OUyA9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BBVVNFCi0gICAgICAgICAgICB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BMQVkgfCBQbGF5YmFja1N0YXRlLkFDVElPTl9TRUVLX1RPCi0gICAgICAgICAgICB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX0ZBU1RfRk9SV0FSRCB8IFBsYXliYWNrU3RhdGUuQUNUSU9OX1JFV0lORDsKLQotICAgIHByaXZhdGUgUmVtb3RlUGxheWJhY2tDbGllbnQgbUNsaWVudDsKLSAgICBwcml2YXRlIFN0cmluZyBtU2Vzc2lvbklkOwotICAgIHByaXZhdGUgU3RyaW5nIG1JdGVtSWQ7Ci0gICAgcHJpdmF0ZSBQbGF5ZXJFdmVudENhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHByaXZhdGUgU3RhdHVzQ2FsbGJhY2sgbVN0YXR1c0NhbGxiYWNrID0gbmV3IFN0YXR1c0NhbGxiYWNrKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU3RhdHVzQ2hhbmdlZChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgdXBkYXRlSXRlbVN0YXR1cyhpdGVtSWQsIGl0ZW1TdGF0dXMpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBSb3V0ZVBsYXllcihDb250ZXh0IGNvbnRleHQsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICBtQ2xpZW50ID0gbmV3IFJlbW90ZVBsYXliYWNrQ2xpZW50KGNvbnRleHQsIHJvdXRlKTsKLSAgICAgICAgbUNsaWVudC5zZXRTdGF0dXNDYWxsYmFjayhtU3RhdHVzQ2FsbGJhY2spOwotICAgICAgICBtQ2xpZW50LnN0YXJ0U2Vzc2lvbihudWxsLCBuZXcgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uUGxheSgpIHsKLSAgICAgICAgbUNsaWVudC5yZXN1bWUobnVsbCwgbmV3IFNlc3Npb25BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU2Vzc2lvblN0YXR1cyhzZXNzaW9uSWQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgewotICAgICAgICBtQ2xpZW50LnBhdXNlKG51bGwsIG5ldyBTZXNzaW9uQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZWVrVG8obG9uZyBwb3MpIHsKLSAgICAgICAgbUNsaWVudC5zZWVrKG1JdGVtSWQsIHBvcywgbnVsbCwgbmV3IEl0ZW1BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVJdGVtU3RhdHVzKGl0ZW1JZCwgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgbUNsaWVudC5zdG9wKG51bGwsIG5ldyBTZXNzaW9uQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGxheWVyRXZlbnRDYWxsYmFjayhQbGF5ZXJFdmVudENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIG9wZW5WaWRlbyhEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgbUNsaWVudC5wbGF5KGRzZC5nZXRVcmkoKSwgInZpZGVvL21wNCIsIG51bGwsIDAsIG51bGwsIG5ldyBJdGVtQWN0aW9uQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVTZXNzaW9uU3RhdHVzKHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlSXRlbVN0YXR1cyhpdGVtSWQsIGl0ZW1TdGF0dXMpOwotICAgICAgICAgICAgICAgIHBsYXlJbnRlcm5hbChkc2QuZ2V0VXJpKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotICAgICAgICBpZiAobUNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ2xpZW50LnJlbGVhc2UoKTsKLSAgICAgICAgICAgIG1DbGllbnQgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbGxiYWNrID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwbGF5SW50ZXJuYWwoVXJpIHVyaSkgewotICAgICAgICBtQ2xpZW50LnBsYXkodXJpLCAidmlkZW8vbXA0IiwgbnVsbCwgMCwgbnVsbCwgbmV3IEl0ZW1BY3Rpb25DYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzLAotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICAgICAgICAgIHVwZGF0ZVNlc3Npb25TdGF0dXMoc2Vzc2lvbklkLCBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVJdGVtU3RhdHVzKGl0ZW1JZCwgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTZXNzaW9uU3RhdHVzKFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgIG1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUl0ZW1TdGF0dXMoU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgbUl0ZW1JZCA9IGl0ZW1JZDsKLSAgICAgICAgaWYgKGl0ZW1TdGF0dXMgPT0gbnVsbCB8fCBtQ2FsbGJhY2sgPT0gbnVsbCkgcmV0dXJuOwotICAgICAgICBtQ2FsbGJhY2sub25QbGF5ZXJTdGF0ZUNoYW5nZWQoaXRlbVN0YXR1cyk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBQbGF5ZXJFdmVudENhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5ZXJTdGF0ZUNoYW5nZWQoTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM1NzBhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllckV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yLk9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkFycmF5TWFwOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuYW5ub3RhdGlvbnMuR3VhcmRlZEJ5OwotaW1wb3J0IGNvbS5hbmRyb2lkLmludGVybmFsLmFubm90YXRpb25zLlZpc2libGVGb3JUZXN0aW5nOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaHJlYWRMb2NhbFJhbmRvbTsKLQotcHVibGljIGNsYXNzIFNlc3Npb25QbGF5bGlzdEFnZW50IGV4dGVuZHMgTWVkaWFQbGF5bGlzdEFnZW50IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlNlc3Npb25QbGF5bGlzdEFnZW50IjsKLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBzdGF0aWMgZmluYWwgaW50IEVORF9PRl9QTEFZTElTVCA9IC0xOwotICAgIEBWaXNpYmxlRm9yVGVzdGluZwotICAgIHN0YXRpYyBmaW5hbCBpbnQgTk9fVkFMSURfSVRFTVMgPSAtMjsKLQotICAgIHByaXZhdGUgZmluYWwgUGxheUl0ZW0gbUVvcFBsYXlJdGVtID0gbmV3IFBsYXlJdGVtKEVORF9PRl9QTEFZTElTVCwgbnVsbCk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtTG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvbjJJbXBsIG1TZXNzaW9uSW1wbDsKLSAgICBwcml2YXRlIGZpbmFsIE15UGxheWVyRXZlbnRDYWxsYmFjayBtUGxheWVyQ2FsbGJhY2s7Ci0KLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYVBsYXllckJhc2UgbVBsYXllcjsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIG1Ec21IZWxwZXI7Ci0gICAgLy8gVE9ETzogQ2hlY2sgaWYgaGF2aW5nIHRoZSBzYW1lIGl0ZW0gaXMgb2theSAoYi83NDA5MDc0MSkKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVkaWFJdGVtMj4gbVBsYXlsaXN0ID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgQXJyYXlMaXN0PE1lZGlhSXRlbTI+IG1TaHVmZmxlZExpc3QgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNYXA8TWVkaWFJdGVtMiwgRGF0YVNvdXJjZURlc2M+IG1JdGVtRHNkTWFwID0gbmV3IEFycmF5TWFwPD4oKTsKLSAgICBAR3VhcmRlZEJ5KCJtTG9jayIpCi0gICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhMiBtTWV0YWRhdGE7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgaW50IG1SZXBlYXRNb2RlOwotICAgIEBHdWFyZGVkQnkoIm1Mb2NrIikKLSAgICBwcml2YXRlIGludCBtU2h1ZmZsZU1vZGU7Ci0gICAgQEd1YXJkZWRCeSgibUxvY2siKQotICAgIHByaXZhdGUgUGxheUl0ZW0gbUN1cnJlbnQ7Ci0KLSAgICAvLyBDYWxsZWQgb24gc2Vzc2lvbiBjYWxsYmFjayBleGVjdXRvci4KLSAgICBwcml2YXRlIGNsYXNzIE15UGxheWVyRXZlbnRDYWxsYmFjayBleHRlbmRzIFBsYXllckV2ZW50Q2FsbGJhY2sgewotICAgICAgICBwdWJsaWMgdm9pZCBvbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZChATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgbXBiLAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgIGlmIChtUGxheWVyICE9IG1wYikgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICBpZiAoZHNkID09IG51bGwgJiYgbUN1cnJlbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKG1DdXJyZW50LnNodWZmbGVkSWR4LCAxKTsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBjbGFzcyBQbGF5SXRlbSB7Ci0gICAgICAgIGludCBzaHVmZmxlZElkeDsKLSAgICAgICAgRGF0YVNvdXJjZURlc2MgZHNkOwotICAgICAgICBNZWRpYUl0ZW0yIG1lZGlhSXRlbTsKLQotICAgICAgICBQbGF5SXRlbShpbnQgc2h1ZmZsZWRJZHgpIHsKLSAgICAgICAgICAgIHRoaXMoc2h1ZmZsZWRJZHgsIG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgUGxheUl0ZW0oaW50IHNodWZmbGVkSWR4LCBEYXRhU291cmNlRGVzYyBkc2QpIHsKLSAgICAgICAgICAgIHRoaXMuc2h1ZmZsZWRJZHggPSBzaHVmZmxlZElkeDsKLSAgICAgICAgICAgIGlmIChzaHVmZmxlZElkeCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tZWRpYUl0ZW0gPSBtU2h1ZmZsZWRMaXN0LmdldChzaHVmZmxlZElkeCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRzZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHNkID0gcmV0cmlldmVEYXRhU291cmNlRGVzY0xvY2tlZCh0aGlzLm1lZGlhSXRlbSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmRzZCA9IGRzZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgICAgICBpZiAodGhpcyA9PSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZWRpYUl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkc2QgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzaHVmZmxlZElkeCA+PSBtU2h1ZmZsZWRMaXN0LnNpemUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtZWRpYUl0ZW0gIT0gbVNodWZmbGVkTGlzdC5nZXQoc2h1ZmZsZWRJZHgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1lZGlhSXRlbS5nZXREYXRhU291cmNlRGVzYygpICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgIW1lZGlhSXRlbS5nZXREYXRhU291cmNlRGVzYygpLmVxdWFscyhkc2QpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU2Vzc2lvblBsYXlsaXN0QWdlbnQoQE5vbk51bGwgTWVkaWFTZXNzaW9uMkltcGwgc2Vzc2lvbkltcGwsCi0gICAgICAgICAgICBATm9uTnVsbCBNZWRpYVBsYXllckJhc2UgcGxheWVyKSB7Ci0gICAgICAgIGlmIChzZXNzaW9uSW1wbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZXNzaW9uSW1wbCBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChwbGF5ZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicGxheWVyIHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgbVNlc3Npb25JbXBsID0gc2Vzc2lvbkltcGw7Ci0gICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7Ci0gICAgICAgIG1QbGF5ZXJDYWxsYmFjayA9IG5ldyBNeVBsYXllckV2ZW50Q2FsbGJhY2soKTsKLSAgICAgICAgbVBsYXllci5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobVNlc3Npb25JbXBsLmdldENhbGxiYWNrRXhlY3V0b3IoKSwgbVBsYXllckNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5ZXIoQE5vbk51bGwgTWVkaWFQbGF5ZXJCYXNlIHBsYXllcikgewotICAgICAgICBpZiAocGxheWVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBsYXllciBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChwbGF5ZXIgPT0gbVBsYXllcikgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1QbGF5ZXIudW5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2sobVBsYXllckNhbGxiYWNrKTsKLSAgICAgICAgICAgIG1QbGF5ZXIgPSBwbGF5ZXI7Ci0gICAgICAgICAgICBtUGxheWVyLnJlZ2lzdGVyUGxheWVyRXZlbnRDYWxsYmFjaygKLSAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JbXBsLmdldENhbGxiYWNrRXhlY3V0b3IoKSwgbVBsYXllckNhbGxiYWNrKTsKLSAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIoT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBoZWxwZXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbURzbUhlbHBlciA9IGhlbHBlcjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNsZWFyT25EYXRhU291cmNlTWlzc2luZ0hlbHBlcigpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgbURzbUhlbHBlciA9IG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQE51bGxhYmxlIExpc3Q8TWVkaWFJdGVtMj4gZ2V0UGxheWxpc3QoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG1QbGF5bGlzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5bGlzdChATm9uTnVsbCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsIEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJsaXN0IHNob3VsZG4ndCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBtSXRlbURzZE1hcC5jbGVhcigpOwotCi0gICAgICAgICAgICBtUGxheWxpc3QuY2xlYXIoKTsKLSAgICAgICAgICAgIG1QbGF5bGlzdC5hZGRBbGwobGlzdCk7Ci0gICAgICAgICAgICBhcHBseVNodWZmbGVNb2RlTG9ja2VkKCk7Ci0KLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChFTkRfT0ZfUExBWUxJU1QsIDEpOwotICAgICAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBATnVsbGFibGUgTWVkaWFNZXRhZGF0YTIgZ2V0UGxheWxpc3RNZXRhZGF0YSgpIHsKLSAgICAgICAgcmV0dXJuIG1NZXRhZGF0YTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB1cGRhdGVQbGF5bGlzdE1ldGFkYXRhKEBOdWxsYWJsZSBNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobWV0YWRhdGEgPT0gbU1ldGFkYXRhKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5UGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGRQbGF5bGlzdEl0ZW0oaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGluZGV4ID0gY2xhbXAoaW5kZXgsIG1QbGF5bGlzdC5zaXplKCkpOwotICAgICAgICAgICAgaW50IHNodWZmbGVkSWR4ID0gaW5kZXg7Ci0gICAgICAgICAgICBtUGxheWxpc3QuYWRkKGluZGV4LCBpdGVtKTsKLSAgICAgICAgICAgIGlmIChtU2h1ZmZsZU1vZGUgPT0gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgbVNodWZmbGVkTGlzdC5hZGQoaW5kZXgsIGl0ZW0pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGl0ZW0gaW4gcmFuZG9tIHBvc2l0aW9uIG9mIG1TaHVmZmxlZExpc3QuCi0gICAgICAgICAgICAgICAgc2h1ZmZsZWRJZHggPSBUaHJlYWRMb2NhbFJhbmRvbS5jdXJyZW50KCkubmV4dEludChtU2h1ZmZsZWRMaXN0LnNpemUoKSArIDEpOwotICAgICAgICAgICAgICAgIG1TaHVmZmxlZExpc3QuYWRkKHNodWZmbGVkSWR4LCBpdGVtKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKEVORF9PRl9QTEFZTElTVCwgMSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBub3RpZnlQbGF5bGlzdENoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmVQbGF5bGlzdEl0ZW0oQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAoIW1QbGF5bGlzdC5yZW1vdmUoaXRlbSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtU2h1ZmZsZWRMaXN0LnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgIG1JdGVtRHNkTWFwLnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgICB9Ci0gICAgICAgIG5vdGlmeVBsYXlsaXN0Q2hhbmdlZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcGxhY2VQbGF5bGlzdEl0ZW0oaW50IGluZGV4LCBATm9uTnVsbCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbSBzaG91bGRuJ3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmIChtUGxheWxpc3Quc2l6ZSgpIDw9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbmRleCA9IGNsYW1wKGluZGV4LCBtUGxheWxpc3Quc2l6ZSgpIC0gMSk7Ci0gICAgICAgICAgICBpbnQgc2h1ZmZsZWRJZHggPSBtU2h1ZmZsZWRMaXN0LmluZGV4T2YobVBsYXlsaXN0LmdldChpbmRleCkpOwotICAgICAgICAgICAgbUl0ZW1Ec2RNYXAucmVtb3ZlKG1TaHVmZmxlZExpc3QuZ2V0KHNodWZmbGVkSWR4KSk7Ci0gICAgICAgICAgICBtU2h1ZmZsZWRMaXN0LnNldChzaHVmZmxlZElkeCwgaXRlbSk7Ci0gICAgICAgICAgICBtUGxheWxpc3Quc2V0KGluZGV4LCBpdGVtKTsKLSAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkpIHsKLSAgICAgICAgICAgICAgICBtQ3VycmVudCA9IGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKEVORF9PRl9QTEFZTElTVCwgMSk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBub3RpZnlQbGF5bGlzdENoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QbGF5bGlzdEl0ZW0oQE5vbk51bGwgTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIGlmIChpdGVtID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW0gc2hvdWxkbid0IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAoIWhhc1ZhbGlkSXRlbSgpIHx8IGl0ZW0uZXF1YWxzKG1DdXJyZW50Lm1lZGlhSXRlbSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc2h1ZmZsZWRJZHggPSBtU2h1ZmZsZWRMaXN0LmluZGV4T2YoaXRlbSk7Ci0gICAgICAgICAgICBpZiAoc2h1ZmZsZWRJZHggPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUN1cnJlbnQgPSBuZXcgUGxheUl0ZW0oc2h1ZmZsZWRJZHgpOwotICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9QcmV2aW91c0l0ZW0oKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobUxvY2spIHsKLSAgICAgICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQbGF5SXRlbSBwcmV2ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobUN1cnJlbnQuc2h1ZmZsZWRJZHgsIC0xKTsKLSAgICAgICAgICAgIGlmIChwcmV2ICE9IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gcHJldjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVwZGF0ZUN1cnJlbnRJZk5lZWRlZExvY2tlZCgpOwotICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBza2lwVG9OZXh0SXRlbSgpIHsKLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKCFoYXNWYWxpZEl0ZW0oKSB8fCBtQ3VycmVudCA9PSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBQbGF5SXRlbSBuZXh0ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQobUN1cnJlbnQuc2h1ZmZsZWRJZHgsIDEpOwotICAgICAgICAgICAgaWYgKG5leHQgIT0gbUVvcFBsYXlJdGVtKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBuZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdE1vZGUoKSB7Ci0gICAgICAgIHJldHVybiBtUmVwZWF0TW9kZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRNb2RlKGludCByZXBlYXRNb2RlKSB7Ci0gICAgICAgIGlmIChyZXBlYXRNb2RlIDwgTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUKLSAgICAgICAgICAgICAgICB8fCByZXBlYXRNb2RlID4gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3luY2hyb25pemVkIChtTG9jaykgewotICAgICAgICAgICAgaWYgKG1SZXBlYXRNb2RlID09IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUmVwZWF0TW9kZSA9IHJlcGVhdE1vZGU7Ci0gICAgICAgICAgICBzd2l0Y2ggKHJlcGVhdE1vZGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkU6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudCAhPSBudWxsICYmIG1DdXJyZW50ICE9IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVBsYXllci5sb29wQ3VycmVudCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9BTEw6Ci0gICAgICAgICAgICAgICAgY2FzZSBNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfR1JPVVA6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudCA9PSBtRW9wUGxheUl0ZW0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJyZW50ID0gZ2V0TmV4dFZhbGlkUGxheUl0ZW1Mb2NrZWQoRU5EX09GX1BMQVlMSVNULCAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBwYXNzIHRocm91Z2gKLSAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FOgotICAgICAgICAgICAgICAgICAgICBtUGxheWVyLmxvb3BDdXJyZW50KGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbm90aWZ5UmVwZWF0TW9kZUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFNodWZmbGVNb2RlKCkgewotICAgICAgICByZXR1cm4gbVNodWZmbGVNb2RlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFNodWZmbGVNb2RlKGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICBpZiAoc2h1ZmZsZU1vZGUgPCBNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX05PTkUKLSAgICAgICAgICAgICAgICB8fCBzaHVmZmxlTW9kZSA+IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1Mb2NrKSB7Ci0gICAgICAgICAgICBpZiAobVNodWZmbGVNb2RlID09IHNodWZmbGVNb2RlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNodWZmbGVNb2RlID0gc2h1ZmZsZU1vZGU7Ci0gICAgICAgICAgICBhcHBseVNodWZmbGVNb2RlTG9ja2VkKCk7Ci0gICAgICAgICAgICB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKTsKLSAgICAgICAgfQotICAgICAgICBub3RpZnlTaHVmZmxlTW9kZUNoYW5nZWQoKTsKLSAgICB9Ci0KLSAgICBAVmlzaWJsZUZvclRlc3RpbmcKLSAgICBpbnQgZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIGhhc1ZhbGlkSXRlbSgpID8gbUN1cnJlbnQuc2h1ZmZsZWRJZHggOiBOT19WQUxJRF9JVEVNUzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzVmFsaWRJdGVtKCkgewotICAgICAgICByZXR1cm4gbUN1cnJlbnQgIT0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERhdGFTb3VyY2VEZXNjIHJldHJpZXZlRGF0YVNvdXJjZURlc2NMb2NrZWQoTWVkaWFJdGVtMiBpdGVtKSB7Ci0gICAgICAgIERhdGFTb3VyY2VEZXNjIGRzZCA9IGl0ZW0uZ2V0RGF0YVNvdXJjZURlc2MoKTsKLSAgICAgICAgaWYgKGRzZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSXRlbURzZE1hcC5wdXQoaXRlbSwgZHNkKTsKLSAgICAgICAgICAgIHJldHVybiBkc2Q7Ci0gICAgICAgIH0KLSAgICAgICAgZHNkID0gbUl0ZW1Ec2RNYXAuZ2V0KGl0ZW0pOwotICAgICAgICBpZiAoZHNkICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBkc2Q7Ci0gICAgICAgIH0KLSAgICAgICAgT25EYXRhU291cmNlTWlzc2luZ0hlbHBlciBoZWxwZXIgPSBtRHNtSGVscGVyOwotICAgICAgICBpZiAoaGVscGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IERvIG5vdCBjYWxsIG9uRGF0YVNvdXJjZU1pc3Npbmcgd2l0aCB0aGUgbG9jayAoYi83NDA5MDc0MSkuCi0gICAgICAgICAgICBkc2QgPSBoZWxwZXIub25EYXRhU291cmNlTWlzc2luZyhtU2Vzc2lvbkltcGwuZ2V0SW5zdGFuY2UoKSwgaXRlbSk7Ci0gICAgICAgICAgICBpZiAoZHNkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtSXRlbURzZE1hcC5wdXQoaXRlbSwgZHNkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZHNkOwotICAgIH0KLQotICAgIC8vIFRPRE86IGNvbnNpZGVyIHRvIGNhbGwgdXBkYXRlQ3VycmVudElmTmVlZGVkTG9ja2VkIGluc2lkZSAoYi83NDA5MDc0MSkKLSAgICBwcml2YXRlIFBsYXlJdGVtIGdldE5leHRWYWxpZFBsYXlJdGVtTG9ja2VkKGludCBjdXJTaHVmZmxlZElkeCwgaW50IGRpcmVjdGlvbikgewotICAgICAgICBpbnQgc2l6ZSA9IG1QbGF5bGlzdC5zaXplKCk7Ci0gICAgICAgIGlmIChjdXJTaHVmZmxlZElkeCA9PSBFTkRfT0ZfUExBWUxJU1QpIHsKLSAgICAgICAgICAgIGN1clNodWZmbGVkSWR4ID0gKGRpcmVjdGlvbiA+IDApID8gLTEgOiBzaXplOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBjdXJTaHVmZmxlZElkeCArPSBkaXJlY3Rpb247Ci0gICAgICAgICAgICBpZiAoY3VyU2h1ZmZsZWRJZHggPCAwIHx8IGN1clNodWZmbGVkSWR4ID49IG1QbGF5bGlzdC5zaXplKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAobVJlcGVhdE1vZGUgPT0gUkVQRUFUX01PREVfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGkgPT0gc2l6ZSAtIDEpID8gbnVsbCA6IG1Fb3BQbGF5SXRlbTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjdXJTaHVmZmxlZElkeCA9IGN1clNodWZmbGVkSWR4IDwgMCA/IG1QbGF5bGlzdC5zaXplKCkgLSAxIDogMDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBEYXRhU291cmNlRGVzYyBkc2QgPSByZXRyaWV2ZURhdGFTb3VyY2VEZXNjTG9ja2VkKG1TaHVmZmxlZExpc3QuZ2V0KGN1clNodWZmbGVkSWR4KSk7Ci0gICAgICAgICAgICBpZiAoZHNkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBsYXlJdGVtKGN1clNodWZmbGVkSWR4LCBkc2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDdXJyZW50SWZOZWVkZWRMb2NrZWQoKSB7Ci0gICAgICAgIGlmICghaGFzVmFsaWRJdGVtKCkgfHwgbUN1cnJlbnQuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHNodWZmbGVkSWR4ID0gbVNodWZmbGVkTGlzdC5pbmRleE9mKG1DdXJyZW50Lm1lZGlhSXRlbSk7Ci0gICAgICAgIGlmIChzaHVmZmxlZElkeCA+PSAwKSB7Ci0gICAgICAgICAgICAvLyBBZGRlZCBhbiBpdGVtLgotICAgICAgICAgICAgbUN1cnJlbnQuc2h1ZmZsZWRJZHggPSBzaHVmZmxlZElkeDsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQ3VycmVudC5zaHVmZmxlZElkeCA+PSBtU2h1ZmZsZWRMaXN0LnNpemUoKSkgewotICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChtU2h1ZmZsZWRMaXN0LnNpemUoKSAtIDEsIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUN1cnJlbnQubWVkaWFJdGVtID0gbVNodWZmbGVkTGlzdC5nZXQobUN1cnJlbnQuc2h1ZmZsZWRJZHgpOwotICAgICAgICAgICAgaWYgKHJldHJpZXZlRGF0YVNvdXJjZURlc2NMb2NrZWQobUN1cnJlbnQubWVkaWFJdGVtKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnQgPSBnZXROZXh0VmFsaWRQbGF5SXRlbUxvY2tlZChtQ3VycmVudC5zaHVmZmxlZElkeCwgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlUGxheWVyRGF0YVNvdXJjZUxvY2tlZCgpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXllckRhdGFTb3VyY2VMb2NrZWQoKSB7Ci0gICAgICAgIGlmIChtQ3VycmVudCA9PSBudWxsIHx8IG1DdXJyZW50ID09IG1Fb3BQbGF5SXRlbSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUGxheWVyLmdldEN1cnJlbnREYXRhU291cmNlKCkgIT0gbUN1cnJlbnQuZHNkKSB7Ci0gICAgICAgICAgICBtUGxheWVyLnNldERhdGFTb3VyY2UobUN1cnJlbnQuZHNkKTsKLSAgICAgICAgICAgIG1QbGF5ZXIubG9vcEN1cnJlbnQobVJlcGVhdE1vZGUgPT0gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX09ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVE9ETzogQ2FsbCBzZXROZXh0RGF0YVNvdXJjZSAoYi83NDA5MDc0MSkKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXBwbHlTaHVmZmxlTW9kZUxvY2tlZCgpIHsKLSAgICAgICAgbVNodWZmbGVkTGlzdC5jbGVhcigpOwotICAgICAgICBtU2h1ZmZsZWRMaXN0LmFkZEFsbChtUGxheWxpc3QpOwotICAgICAgICBpZiAobVNodWZmbGVNb2RlID09IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfQUxMCi0gICAgICAgICAgICAgICAgfHwgbVNodWZmbGVNb2RlID09IE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVApIHsKLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNodWZmbGUobVNodWZmbGVkTGlzdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDbGFtcHMgdmFsdWUgdG8gWzAsIHNpemVdCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNsYW1wKGludCB2YWx1ZSwgaW50IHNpemUpIHsKLSAgICAgICAgaWYgKHZhbHVlIDwgMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuICh2YWx1ZSA+IHNpemUpID8gc2l6ZSA6IHZhbHVlOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblRva2VuMkltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblRva2VuMkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTVjZjhjNC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25Ub2tlbjJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjIuVFlQRV9TRVNTSU9OX1NFUlZJQ0U7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuU2Vzc2lvblRva2VuMi5UWVBFX0xJQlJBUllfU0VSVklDRTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlBhY2thZ2VNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5QYWNrYWdlTWFuYWdlci5OYW1lTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yLlRva2VuVHlwZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5TZXNzaW9uVG9rZW4yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotcHVibGljIGNsYXNzIFNlc3Npb25Ub2tlbjJJbXBsIGltcGxlbWVudHMgU2Vzc2lvblRva2VuMlByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1VJRCA9ICJhbmRyb2lkLm1lZGlhLnRva2VuLnVpZCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9UWVBFID0gImFuZHJvaWQubWVkaWEudG9rZW4udHlwZSI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QQUNLQUdFX05BTUUgPSAiYW5kcm9pZC5tZWRpYS50b2tlbi5wYWNrYWdlX25hbWUiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VSVklDRV9OQU1FID0gImFuZHJvaWQubWVkaWEudG9rZW4uc2VydmljZV9uYW1lIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lEID0gImFuZHJvaWQubWVkaWEudG9rZW4uaWQiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VTU0lPTl9CSU5ERVIgPSAiYW5kcm9pZC5tZWRpYS50b2tlbi5zZXNzaW9uX2JpbmRlciI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFNlc3Npb25Ub2tlbjIgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgaW50IG1VaWQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBAVG9rZW5UeXBlIGludCBtVHlwZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtUGFja2FnZU5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVNlcnZpY2VOYW1lOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1JZDsKLSAgICBwcml2YXRlIGZpbmFsIElNZWRpYVNlc3Npb24yIG1TZXNzaW9uQmluZGVyOwotCi0gICAgLyoqCi0gICAgICogUHVibGljIGNvbnN0cnVjdG9yIGZvciB0aGUgbGVnYWN5IHN1cHBvcnQgKGkuZS4gYnJvd3NlciBjYW4gdHJ5IGNvbm5lY3RpbmcgdG8gYW55IGJyb3dzZXIKLSAgICAgKiBzZXJ2aWNlIGlmIGl0IGtub3dzIHRoZSBzZXJ2aWNlIG5hbWUpCi0gICAgICovCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjJJbXBsKENvbnRleHQgY29udGV4dCwgU2Vzc2lvblRva2VuMiBpbnN0YW5jZSwKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lLCBpbnQgdWlkKSB7Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShwYWNrYWdlTmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInBhY2thZ2VOYW1lIHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChUZXh0VXRpbHMuaXNFbXB0eShzZXJ2aWNlTmFtZSkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlcnZpY2VOYW1lIHNob3VsZG4ndCBiZSBlbXB0eSIpOwotICAgICAgICB9Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICAvLyBDYWxjdWxhdGUgdWlkIGlmIGl0J3Mgbm90IHNwZWNpZmllZC4KLSAgICAgICAgZmluYWwgUGFja2FnZU1hbmFnZXIgbWFuYWdlciA9IGNvbnRleHQuZ2V0UGFja2FnZU1hbmFnZXIoKTsKLSAgICAgICAgaWYgKHVpZCA8IDApIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdWlkID0gbWFuYWdlci5nZXRQYWNrYWdlVWlkKHBhY2thZ2VOYW1lLCAwKTsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5hbWVOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ2Fubm90IGZpbmQgcGFja2FnZSAiICsgcGFja2FnZU5hbWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1VaWQgPSB1aWQ7Ci0KLSAgICAgICAgLy8gSW5mZXIgaWQgYW5kIHR5cGUgZnJvbSBwYWNrYWdlIG5hbWUgYW5kIHNlcnZpY2UgbmFtZQotICAgICAgICAvLyBUT0RPKGphZXdhbik6IEhhbmRsZSBtdWx0aS11c2VyLgotICAgICAgICBTdHJpbmcgaWQgPSBnZXRTZXNzaW9uSWRGcm9tU2VydmljZShtYW5hZ2VyLCBNZWRpYUxpYnJhcnlTZXJ2aWNlMi5TRVJWSUNFX0lOVEVSRkFDRSwKLSAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUpOwotICAgICAgICBpZiAoaWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgICAgICBtVHlwZSA9IFRZUEVfTElCUkFSWV9TRVJWSUNFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gcmV0cnkgd2l0aCBzZXNzaW9uIHNlcnZpY2UKLSAgICAgICAgICAgIG1JZCA9IGdldFNlc3Npb25JZEZyb21TZXJ2aWNlKG1hbmFnZXIsIE1lZGlhU2Vzc2lvblNlcnZpY2UyLlNFUlZJQ0VfSU5URVJGQUNFLAotICAgICAgICAgICAgICAgICAgICBwYWNrYWdlTmFtZSwgc2VydmljZU5hbWUpOwotICAgICAgICAgICAgbVR5cGUgPSBUWVBFX1NFU1NJT05fU0VSVklDRTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlcnZpY2UgIiArIHNlcnZpY2VOYW1lICsgIiBkb2Vzbid0IGltcGxlbWVudCIKLSAgICAgICAgICAgICAgICAgICAgKyAiIHNlc3Npb24gc2VydmljZSBub3IgbGlicmFyeSBzZXJ2aWNlLiBVc2Ugc2VydmljZSdzIGZ1bGwgbmFtZS4iKTsKLSAgICAgICAgfQotICAgICAgICBtUGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLSAgICAgICAgbVNlcnZpY2VOYW1lID0gc2VydmljZU5hbWU7Ci0gICAgICAgIG1TZXNzaW9uQmluZGVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICBTZXNzaW9uVG9rZW4ySW1wbChpbnQgdWlkLCBpbnQgdHlwZSwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgc2VydmljZU5hbWUsIFN0cmluZyBpZCwKLSAgICAgICAgICAgIElNZWRpYVNlc3Npb24yIHNlc3Npb25CaW5kZXIpIHsKLSAgICAgICAgLy8gVE9ETyhqYWV3YW4pOiBBZGQgc2FuaXR5IGNoZWNrIChiLzczODYzODY1KQotICAgICAgICBtVWlkID0gdWlkOwotICAgICAgICBtVHlwZSA9IHR5cGU7Ci0gICAgICAgIG1QYWNrYWdlTmFtZSA9IHBhY2thZ2VOYW1lOwotICAgICAgICBtU2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKLSAgICAgICAgbUlkID0gaWQ7Ci0gICAgICAgIG1TZXNzaW9uQmluZGVyID0gc2Vzc2lvbkJpbmRlcjsKLSAgICAgICAgbUluc3RhbmNlID0gbmV3IFNlc3Npb25Ub2tlbjIodGhpcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFNlc3Npb25JZEZyb21TZXJ2aWNlKFBhY2thZ2VNYW5hZ2VyIG1hbmFnZXIsIFN0cmluZyBzZXJ2aWNlSW50ZXJmYWNlLAotICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgc2VydmljZU5hbWUpIHsKLSAgICAgICAgSW50ZW50IHNlcnZpY2VJbnRlbnQgPSBuZXcgSW50ZW50KHNlcnZpY2VJbnRlcmZhY2UpOwotICAgICAgICBzZXJ2aWNlSW50ZW50LnNldFBhY2thZ2UocGFja2FnZU5hbWUpOwotICAgICAgICAvLyBVc2UgcXVlcnlJbnRlbnRTZXJ2aWNlcyB0byBmaW5kIHNlcnZpY2VzIHdpdGggTWVkaWFMaWJyYXJ5U2VydmljZTIuU0VSVklDRV9JTlRFUkZBQ0UuCi0gICAgICAgIC8vIFdlIGNhbm5vdCB1c2UgcmVzb2x2ZVNlcnZpY2Ugd2l0aCBpbnRlbnQgc3BlY2lmaWVkIGNsYXNzIG5hbWUsIGJlY2F1c2UgcmVzb2x2ZVNlcnZpY2UKLSAgICAgICAgLy8gaWdub3JlcyBhY3Rpb25zIGlmIEludGVudC5zZXRDbGFzc05hbWUoKSBpcyBzcGVjaWZpZWQuCi0gICAgICAgIExpc3Q8UmVzb2x2ZUluZm8+IGxpc3QgPSBtYW5hZ2VyLnF1ZXJ5SW50ZW50U2VydmljZXMoCi0gICAgICAgICAgICAgICAgc2VydmljZUludGVudCwgUGFja2FnZU1hbmFnZXIuR0VUX01FVEFfREFUQSk7Ci0gICAgICAgIGlmIChsaXN0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdC5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIFJlc29sdmVJbmZvIHJlc29sdmVJbmZvID0gbGlzdC5nZXQoaSk7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc29sdmVJbmZvID09IG51bGwgfHwgcmVzb2x2ZUluZm8uc2VydmljZUluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5lcXVhbHMocmVzb2x2ZUluZm8uc2VydmljZUluZm8ubmFtZSwgc2VydmljZU5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBnZXRTZXNzaW9uSWQocmVzb2x2ZUluZm8pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBnZXRTZXNzaW9uSWQoUmVzb2x2ZUluZm8gcmVzb2x2ZUluZm8pIHsKLSAgICAgICAgaWYgKHJlc29sdmVJbmZvID09IG51bGwgfHwgcmVzb2x2ZUluZm8uc2VydmljZUluZm8gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSBpZiAocmVzb2x2ZUluZm8uc2VydmljZUluZm8ubWV0YURhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIHJlc29sdmVJbmZvLnNlcnZpY2VJbmZvLm1ldGFEYXRhLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFTZXNzaW9uU2VydmljZTIuU0VSVklDRV9NRVRBX0RBVEEsICIiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldEluc3RhbmNlKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1QYWNrYWdlTmFtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFVpZF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVVpZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldElkX2ltcCgpIHsKLSAgICAgICAgcmV0dXJuIG1JZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFR5cGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1UeXBlOwotICAgIH0KLQotICAgIFN0cmluZyBnZXRTZXJ2aWNlTmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXJ2aWNlTmFtZTsKLSAgICB9Ci0KLSAgICBJTWVkaWFTZXNzaW9uMiBnZXRTZXNzaW9uQmluZGVyKCkgewotICAgICAgICByZXR1cm4gbVNlc3Npb25CaW5kZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBTZXNzaW9uVG9rZW4yIGZyb21CdW5kbGVfaW1wbChCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIGlmIChidW5kbGUgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgaW50IHVpZCA9IGJ1bmRsZS5nZXRJbnQoS0VZX1VJRCk7Ci0gICAgICAgIGZpbmFsIEBUb2tlblR5cGUgaW50IHR5cGUgPSBidW5kbGUuZ2V0SW50KEtFWV9UWVBFLCAtMSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBwYWNrYWdlTmFtZSA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX1BBQ0tBR0VfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBzZXJ2aWNlTmFtZSA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX1NFUlZJQ0VfTkFNRSk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IGJ1bmRsZS5nZXRTdHJpbmcoS0VZX0lEKTsKLSAgICAgICAgZmluYWwgSUJpbmRlciBzZXNzaW9uQmluZGVyID0gYnVuZGxlLmdldEJpbmRlcihLRVlfU0VTU0lPTl9CSU5ERVIpOwotCi0gICAgICAgIC8vIFNhbml0eSBjaGVjay4KLSAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFRZUEVfU0VTU0lPTjoKLSAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbkJpbmRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVuZXhwZWN0ZWQgc2Vzc2lvbkJpbmRlciBmb3Igc2Vzc2lvbiwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiIGJpbmRlcj0iICsgc2Vzc2lvbkJpbmRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBUWVBFX1NFU1NJT05fU0VSVklDRToKLSAgICAgICAgICAgIGNhc2UgVFlQRV9MSUJSQVJZX1NFUlZJQ0U6Ci0gICAgICAgICAgICAgICAgaWYgKFRleHRVdGlscy5pc0VtcHR5KHNlcnZpY2VOYW1lKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJTZXNzaW9uIHNlcnZpY2UgbmVlZHMgc2VydmljZSBuYW1lIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIHR5cGUiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkocGFja2FnZU5hbWUpIHx8IGlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlBhY2thZ2UgbmFtZSBub3IgSUQgY2Fubm90IGJlIG51bGwuIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBTZXNzaW9uVG9rZW4ySW1wbCh1aWQsIHR5cGUsIHBhY2thZ2VOYW1lLCBzZXJ2aWNlTmFtZSwgaWQsCi0gICAgICAgICAgICAgICAgc2Vzc2lvbkJpbmRlciAhPSBudWxsID8gSU1lZGlhU2Vzc2lvbjIuU3R1Yi5hc0ludGVyZmFjZShzZXNzaW9uQmluZGVyKSA6IG51bGwpCi0gICAgICAgICAgICAgICAgLmdldEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1bmRsZSB0b0J1bmRsZV9pbXBsKCkgewotICAgICAgICBCdW5kbGUgYnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICBidW5kbGUucHV0SW50KEtFWV9VSUQsIG1VaWQpOwotICAgICAgICBidW5kbGUucHV0U3RyaW5nKEtFWV9QQUNLQUdFX05BTUUsIG1QYWNrYWdlTmFtZSk7Ci0gICAgICAgIGJ1bmRsZS5wdXRTdHJpbmcoS0VZX1NFUlZJQ0VfTkFNRSwgbVNlcnZpY2VOYW1lKTsKLSAgICAgICAgYnVuZGxlLnB1dFN0cmluZyhLRVlfSUQsIG1JZCk7Ci0gICAgICAgIGJ1bmRsZS5wdXRJbnQoS0VZX1RZUEUsIG1UeXBlKTsKLSAgICAgICAgYnVuZGxlLnB1dEJpbmRlcihLRVlfU0VTU0lPTl9CSU5ERVIsCi0gICAgICAgICAgICAgICAgbVNlc3Npb25CaW5kZXIgIT0gbnVsbCA/IG1TZXNzaW9uQmluZGVyLmFzQmluZGVyKCkgOiBudWxsKTsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlX2ltcGwoKSB7Ci0gICAgICAgIGZpbmFsIGludCBwcmltZSA9IDMxOwotICAgICAgICByZXR1cm4gbVR5cGUKLSAgICAgICAgICAgICAgICArIHByaW1lICogKG1VaWQKLSAgICAgICAgICAgICAgICArIHByaW1lICogKG1QYWNrYWdlTmFtZS5oYXNoQ29kZSgpCi0gICAgICAgICAgICAgICAgKyBwcmltZSAqIChtSWQuaGFzaENvZGUoKQotICAgICAgICAgICAgICAgICsgcHJpbWUgKiAobVNlcnZpY2VOYW1lICE9IG51bGwgPyBtU2VydmljZU5hbWUuaGFzaENvZGUoKSA6IDApKSkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFsc19pbXBsKE9iamVjdCBvYmopIHsKLSAgICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgU2Vzc2lvblRva2VuMikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBTZXNzaW9uVG9rZW4ySW1wbCBvdGhlciA9IGZyb20oKFNlc3Npb25Ub2tlbjIpIG9iaik7Ci0gICAgICAgIHJldHVybiBtVWlkID09IG90aGVyLm1VaWQKLSAgICAgICAgICAgICAgICAmJiBUZXh0VXRpbHMuZXF1YWxzKG1QYWNrYWdlTmFtZSwgb3RoZXIubVBhY2thZ2VOYW1lKQotICAgICAgICAgICAgICAgICYmIFRleHRVdGlscy5lcXVhbHMobVNlcnZpY2VOYW1lLCBvdGhlci5tU2VydmljZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgVGV4dFV0aWxzLmVxdWFscyhtSWQsIG90aGVyLm1JZCkKLSAgICAgICAgICAgICAgICAmJiBtVHlwZSA9PSBvdGhlci5tVHlwZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiAiU2Vzc2lvblRva2VuIHtwa2c9IiArIG1QYWNrYWdlTmFtZSArICIgaWQ9IiArIG1JZCArICIgdHlwZT0iICsgbVR5cGUKLSAgICAgICAgICAgICAgICArICIgc2VydmljZT0iICsgbVNlcnZpY2VOYW1lICsgIiBiaW5kZXI9IiArIG1TZXNzaW9uQmluZGVyICsgIn0iOwotICAgIH0KLQotICAgIHN0YXRpYyBTZXNzaW9uVG9rZW4ySW1wbCBmcm9tKFNlc3Npb25Ub2tlbjIgdG9rZW4pIHsKLSAgICAgICAgcmV0dXJuICgoU2Vzc2lvblRva2VuMkltcGwpIHRva2VuLmdldFByb3ZpZGVyKCkpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvVm9sdW1lUHJvdmlkZXIySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Wb2x1bWVQcm92aWRlcjJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmMjJlMWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9Wb2x1bWVQcm92aWRlcjJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLm1lZGlhLlZvbHVtZVByb3ZpZGVyMi5WT0xVTUVfQ09OVFJPTF9BQlNPTFVURTsKLWltcG9ydCBzdGF0aWMgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjIuVk9MVU1FX0NPTlRST0xfRklYRUQ7Ci1pbXBvcnQgc3RhdGljIGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyLlZPTFVNRV9DT05UUk9MX1JFTEFUSVZFOwotCi1pbXBvcnQgYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVm9sdW1lUHJvdmlkZXIyUHJvdmlkZXI7Ci0KLXB1YmxpYyBjbGFzcyBWb2x1bWVQcm92aWRlcjJJbXBsIGltcGxlbWVudHMgVm9sdW1lUHJvdmlkZXIyUHJvdmlkZXIgewotICAgIHByaXZhdGUgZmluYWwgVm9sdW1lUHJvdmlkZXIyIG1JbnN0YW5jZTsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtQ29udHJvbFR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbU1heFZvbHVtZTsKLQotICAgIHByaXZhdGUgaW50IG1DdXJyZW50Vm9sdW1lOwotICAgIHByaXZhdGUgQ2FsbGJhY2sgbUNhbGxiYWNrOwotCi0gICAgcHVibGljIFZvbHVtZVByb3ZpZGVyMkltcGwoVm9sdW1lUHJvdmlkZXIyIGluc3RhbmNlLAotICAgICAgICAgICAgQFZvbHVtZVByb3ZpZGVyMi5Db250cm9sVHlwZSBpbnQgY29udHJvbFR5cGUsIGludCBtYXhWb2x1bWUsIGludCBjdXJyZW50Vm9sdW1lKSB7Ci0gICAgICAgIGlmIChjb250cm9sVHlwZSAhPSBWT0xVTUVfQ09OVFJPTF9GSVhFRCAmJiBjb250cm9sVHlwZSAhPSBWT0xVTUVfQ09OVFJPTF9SRUxBVElWRQotICAgICAgICAgICAgICAgICYmIGNvbnRyb2xUeXBlICE9IFZPTFVNRV9DT05UUk9MX0FCU09MVVRFKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ3cm9uZyBjb250cm9sVHlwZSAiICsgY29udHJvbFR5cGUpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtYXhWb2x1bWUgPCAwIHx8IGN1cnJlbnRWb2x1bWUgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJ2b2x1bWUgc2hvdWxkbid0IGJlIG5lZ2F0aXZlIgotICAgICAgICAgICAgICAgICAgICArICIsIG1heFZvbHVtZT0iICsgbWF4Vm9sdW1lICsgIiwgY3VycmVudFZvbHVtZT0iICsgY3VycmVudFZvbHVtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGN1cnJlbnRWb2x1bWUgPiBtYXhWb2x1bWUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImN1cnJlbnRWb2x1bWUgc2hvdWxkbid0IGJlIGdyZWF0ZXIgdGhhbiBtYXhWb2x1bWUiCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbWF4Vm9sdW1lPSIgKyBtYXhWb2x1bWUgKyAiLCBjdXJyZW50Vm9sdW1lPSIgKyBjdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgfQotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICAgICAgbUNvbnRyb2xUeXBlID0gY29udHJvbFR5cGU7Ci0gICAgICAgIG1NYXhWb2x1bWUgPSBtYXhWb2x1bWU7Ci0gICAgICAgIG1DdXJyZW50Vm9sdW1lID0gY3VycmVudFZvbHVtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldENvbnRyb2xUeXBlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQ29udHJvbFR5cGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRNYXhWb2x1bWVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1NYXhWb2x1bWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRDdXJyZW50Vm9sdW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtQ3VycmVudFZvbHVtZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDdXJyZW50Vm9sdW1lX2ltcGwoaW50IGN1cnJlbnRWb2x1bWUpIHsKLSAgICAgICAgaWYgKGN1cnJlbnRWb2x1bWUgPCAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjdXJyZW50Vm9sdW1lIHNob3VsZG4ndCBiZSBuZWdhdGl2ZSIKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjdXJyZW50Vm9sdW1lPSIgKyBjdXJyZW50Vm9sdW1lKTsKLSAgICAgICAgfQotICAgICAgICBtQ3VycmVudFZvbHVtZSA9IGN1cnJlbnRWb2x1bWU7Ci0gICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uVm9sdW1lQ2hhbmdlZChtSW5zdGFuY2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRvIHJlY2VpdmUgdm9sdW1lIGNoYW5nZXMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Q2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGlzdGVucyBmb3IgY2hhbmdlcyB0byB0aGUgdm9sdW1lLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQ2FsbGJhY2sgewotICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBvblZvbHVtZUNoYW5nZWQoVm9sdW1lUHJvdmlkZXIyIHZvbHVtZVByb3ZpZGVyKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL0Nsb3NlZENhcHRpb25SZW5kZXJlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9DbG9zZWRDYXB0aW9uUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmY3ZWVjOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL0Nsb3NlZENhcHRpb25SZW5kZXJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUwMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Db2xvcjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlBhaW50OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlNwYW5uYWJsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFBhaW50OwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5DaGFyYWN0ZXJTdHlsZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuc3R5bGUuU3R5bGVTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5VbmRlcmxpbmVTcGFuOwotaW1wb3J0IGFuZHJvaWQudGV4dC5zdHlsZS5VcGRhdGVBcHBlYXJhbmNlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuR3Jhdml0eTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkNhcHRpb25pbmdNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkNhcHRpb25pbmdNYW5hZ2VyLkNhcHRpb25TdHlsZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5DYXB0aW9uaW5nTWFuYWdlci5DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGluZWFyTGF5b3V0OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLS8vIE5vdGU6IFRoaXMgaXMgZm9ya2VkIGZyb20gYW5kcm9pZC5tZWRpYS5DbG9zZWRDYXB0aW9uUmVuZGVyZXIgc2luY2UgUAotcHVibGljIGNsYXNzIENsb3NlZENhcHRpb25SZW5kZXJlciBleHRlbmRzIFN1YnRpdGxlQ29udHJvbGxlci5SZW5kZXJlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgQ2VhNjA4Q0NXaWRnZXQgbUNDV2lkZ2V0OwotCi0gICAgcHVibGljIENsb3NlZENhcHRpb25SZW5kZXJlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHN1cHBvcnRzKE1lZGlhRm9ybWF0IGZvcm1hdCkgewotICAgICAgICBpZiAoZm9ybWF0LmNvbnRhaW5zS2V5KE1lZGlhRm9ybWF0LktFWV9NSU1FKSkgewotICAgICAgICAgICAgU3RyaW5nIG1pbWVUeXBlID0gZm9ybWF0LmdldFN0cmluZyhNZWRpYUZvcm1hdC5LRVlfTUlNRSk7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFGb3JtYXQuTUlNRVRZUEVfVEVYVF9DRUFfNjA4LmVxdWFscyhtaW1lVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdWJ0aXRsZVRyYWNrIGNyZWF0ZVRyYWNrKE1lZGlhRm9ybWF0IGZvcm1hdCkgewotICAgICAgICBTdHJpbmcgbWltZVR5cGUgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9NSU1FKTsKLSAgICAgICAgaWYgKE1lZGlhRm9ybWF0Lk1JTUVUWVBFX1RFWFRfQ0VBXzYwOC5lcXVhbHMobWltZVR5cGUpKSB7Ci0gICAgICAgICAgICBpZiAobUNDV2lkZ2V0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ0NXaWRnZXQgPSBuZXcgQ2VhNjA4Q0NXaWRnZXQobUNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBDZWE2MDhDYXB0aW9uVHJhY2sobUNDV2lkZ2V0LCBmb3JtYXQpOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJObyBtYXRjaGluZyBmb3JtYXQ6ICIgKyBmb3JtYXQudG9TdHJpbmcoKSk7Ci0gICAgfQotfQotCi1jbGFzcyBDZWE2MDhDYXB0aW9uVHJhY2sgZXh0ZW5kcyBTdWJ0aXRsZVRyYWNrIHsKLSAgICBwcml2YXRlIGZpbmFsIENlYTYwOENDUGFyc2VyIG1DQ1BhcnNlcjsKLSAgICBwcml2YXRlIGZpbmFsIENlYTYwOENDV2lkZ2V0IG1SZW5kZXJpbmdXaWRnZXQ7Ci0KLSAgICBDZWE2MDhDYXB0aW9uVHJhY2soQ2VhNjA4Q0NXaWRnZXQgcmVuZGVyaW5nV2lkZ2V0LCBNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgc3VwZXIoZm9ybWF0KTsKLQotICAgICAgICBtUmVuZGVyaW5nV2lkZ2V0ID0gcmVuZGVyaW5nV2lkZ2V0OwotICAgICAgICBtQ0NQYXJzZXIgPSBuZXcgQ2VhNjA4Q0NQYXJzZXIobVJlbmRlcmluZ1dpZGdldCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EYXRhKGJ5dGVbXSBkYXRhLCBib29sZWFuIGVvcywgbG9uZyBydW5JRCkgewotICAgICAgICBtQ0NQYXJzZXIucGFyc2UoZGF0YSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJlbmRlcmluZ1dpZGdldCBnZXRSZW5kZXJpbmdXaWRnZXQoKSB7Ci0gICAgICAgIHJldHVybiBtUmVuZGVyaW5nV2lkZ2V0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVZpZXcoVmVjdG9yPEN1ZT4gYWN0aXZlQ3VlcykgewotICAgICAgICAvLyBPdmVycmlkaW5nIHdpdGggTk8tT1AsIENDIHJlbmRlcmluZyBieS1wYXNzZXMgdGhpcwotICAgIH0KLX0KLQotLyoqCi0gKiBBYnN0cmFjdCB3aWRnZXQgY2xhc3MgdG8gcmVuZGVyIGEgY2xvc2VkIGNhcHRpb24gdHJhY2suCi0gKi8KLWFic3RyYWN0IGNsYXNzIENsb3NlZENhcHRpb25XaWRnZXQgZXh0ZW5kcyBWaWV3R3JvdXAgaW1wbGVtZW50cyBTdWJ0aXRsZVRyYWNrLlJlbmRlcmluZ1dpZGdldCB7Ci0KLSAgICBpbnRlcmZhY2UgQ2xvc2VkQ2FwdGlvbkxheW91dCB7Ci0gICAgICAgIHZvaWQgc2V0Q2FwdGlvblN0eWxlKENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUpOwotICAgICAgICB2b2lkIHNldEZvbnRTY2FsZShmbG9hdCBzY2FsZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2FwdGlvblN0eWxlIERFRkFVTFRfQ0FQVElPTl9TVFlMRSA9IENhcHRpb25TdHlsZS5ERUZBVUxUOwotCi0gICAgLyoqIENhcHRpb25pbmcgbWFuYWdlciwgdXNlZCB0byBvYnRhaW4gYW5kIHRyYWNrIGNhcHRpb24gcHJvcGVydGllcy4gKi8KLSAgICBwcml2YXRlIGZpbmFsIENhcHRpb25pbmdNYW5hZ2VyIG1NYW5hZ2VyOwotCi0gICAgLyoqIEN1cnJlbnQgY2FwdGlvbiBzdHlsZS4gKi8KLSAgICBwcm90ZWN0ZWQgQ2FwdGlvblN0eWxlIG1DYXB0aW9uU3R5bGU7Ci0KLSAgICAvKiogQ2FsbGJhY2sgZm9yIHJlbmRlcmluZyBjaGFuZ2VzLiAqLwotICAgIHByb3RlY3RlZCBPbkNoYW5nZWRMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLSAgICAvKiogQ29uY3JldGUgbGF5b3V0IG9mIENDLiAqLwotICAgIHByb3RlY3RlZCBDbG9zZWRDYXB0aW9uTGF5b3V0IG1DbG9zZWRDYXB0aW9uTGF5b3V0OwotCi0gICAgLyoqIFdoZXRoZXIgYSBjYXB0aW9uIHN0eWxlIGNoYW5nZSBsaXN0ZW5lciBpcyByZWdpc3RlcmVkLiAqLwotICAgIHByaXZhdGUgYm9vbGVhbiBtSGFzQ2hhbmdlTGlzdGVuZXI7Ci0KLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbldpZGdldChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbldpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbldpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2xvc2VkQ2FwdGlvbldpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwKLSAgICAgICAgICAgIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7Ci0KLSAgICAgICAgLy8gQ2Fubm90IHJlbmRlciB0ZXh0IG92ZXIgdmlkZW8gd2hlbiBsYXllciB0eXBlIGlzIGhhcmR3YXJlLgotICAgICAgICBzZXRMYXllclR5cGUoVmlldy5MQVlFUl9UWVBFX1NPRlRXQVJFLCBudWxsKTsKLQotICAgICAgICBtTWFuYWdlciA9IChDYXB0aW9uaW5nTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuQ0FQVElPTklOR19TRVJWSUNFKTsKLSAgICAgICAgbUNhcHRpb25TdHlsZSA9IERFRkFVTFRfQ0FQVElPTl9TVFlMRS5hcHBseVN0eWxlKG1NYW5hZ2VyLmdldFVzZXJTdHlsZSgpKTsKLQotICAgICAgICBtQ2xvc2VkQ2FwdGlvbkxheW91dCA9IGNyZWF0ZUNhcHRpb25MYXlvdXQoY29udGV4dCk7Ci0gICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0LnNldENhcHRpb25TdHlsZShtQ2FwdGlvblN0eWxlKTsKLSAgICAgICAgbUNsb3NlZENhcHRpb25MYXlvdXQuc2V0Rm9udFNjYWxlKG1NYW5hZ2VyLmdldEZvbnRTY2FsZSgpKTsKLSAgICAgICAgYWRkVmlldygoVmlld0dyb3VwKSBtQ2xvc2VkQ2FwdGlvbkxheW91dCwgTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCwKLSAgICAgICAgICAgICAgICBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLQotICAgICAgICByZXF1ZXN0TGF5b3V0KCk7Ci0gICAgfQotCi0gICAgcHVibGljIGFic3RyYWN0IENsb3NlZENhcHRpb25MYXlvdXQgY3JlYXRlQ2FwdGlvbkxheW91dChDb250ZXh0IGNvbnRleHQpOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25DaGFuZ2VkTGlzdGVuZXIoT25DaGFuZ2VkTGlzdGVuZXIgbGlzdGVuZXIpIHsKLSAgICAgICAgbUxpc3RlbmVyID0gbGlzdGVuZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgZmluYWwgaW50IHdpZHRoU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyh3aWR0aCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0gICAgICAgIGZpbmFsIGludCBoZWlnaHRTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKGhlaWdodCwgTWVhc3VyZVNwZWMuRVhBQ1RMWSk7Ci0KLSAgICAgICAgbWVhc3VyZSh3aWR0aFNwZWMsIGhlaWdodFNwZWMpOwotICAgICAgICBsYXlvdXQoMCwgMCwgd2lkdGgsIGhlaWdodCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaWJsZShib29sZWFuIHZpc2libGUpIHsKLSAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgIHNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1hbmFnZUNoYW5nZUxpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLQotICAgICAgICBtYW5hZ2VDaGFuZ2VMaXN0ZW5lcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotCi0gICAgICAgIG1hbmFnZUNoYW5nZUxpc3RlbmVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgc3VwZXIub25NZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICAgICAgKChWaWV3R3JvdXApIG1DbG9zZWRDYXB0aW9uTGF5b3V0KS5tZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsLCBpbnQgdCwgaW50IHIsIGludCBiKSB7Ci0gICAgICAgICgoVmlld0dyb3VwKSBtQ2xvc2VkQ2FwdGlvbkxheW91dCkubGF5b3V0KGwsIHQsIHIsIGIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIE1hbmFnZXMgd2hldGhlciB0aGlzIHJlbmRlcmVyIGlzIGxpc3RlbmluZyBmb3IgY2FwdGlvbiBzdHlsZSBjaGFuZ2VzLgotICAgICAqLwotICAgIHByaXZhdGUgZmluYWwgQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyIG1DYXB0aW9uaW5nTGlzdGVuZXIgPSBuZXcgQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Vc2VyU3R5bGVDaGFuZ2VkKENhcHRpb25TdHlsZSB1c2VyU3R5bGUpIHsKLSAgICAgICAgICAgIG1DYXB0aW9uU3R5bGUgPSBERUZBVUxUX0NBUFRJT05fU1RZTEUuYXBwbHlTdHlsZSh1c2VyU3R5bGUpOwotICAgICAgICAgICAgbUNsb3NlZENhcHRpb25MYXlvdXQuc2V0Q2FwdGlvblN0eWxlKG1DYXB0aW9uU3R5bGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRm9udFNjYWxlQ2hhbmdlZChmbG9hdCBmb250U2NhbGUpIHsKLSAgICAgICAgICAgIG1DbG9zZWRDYXB0aW9uTGF5b3V0LnNldEZvbnRTY2FsZShmb250U2NhbGUpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgdm9pZCBtYW5hZ2VDaGFuZ2VMaXN0ZW5lcigpIHsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBuZWVkc0xpc3RlbmVyID0gaXNBdHRhY2hlZFRvV2luZG93KCkgJiYgZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRTsKLSAgICAgICAgaWYgKG1IYXNDaGFuZ2VMaXN0ZW5lciAhPSBuZWVkc0xpc3RlbmVyKSB7Ci0gICAgICAgICAgICBtSGFzQ2hhbmdlTGlzdGVuZXIgPSBuZWVkc0xpc3RlbmVyOwotCi0gICAgICAgICAgICBpZiAobmVlZHNMaXN0ZW5lcikgewotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmFkZENhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcihtQ2FwdGlvbmluZ0xpc3RlbmVyKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU1hbmFnZXIucmVtb3ZlQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKG1DYXB0aW9uaW5nTGlzdGVuZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioKLSAqIENDUGFyc2VyIHByb2Nlc3NlcyBDRUEtNjA4IGNsb3NlZCBjYXB0aW9uIGRhdGEuCi0gKgotICogSXQgY2FsbHMgYmFjayBpbnRvIE9uRGlzcGxheUNoYW5nZWRMaXN0ZW5lciB1cG9uCi0gKiBkaXNwbGF5IGNoYW5nZSB3aXRoIHN0eWxlZCB0ZXh0IGZvciByZW5kZXJpbmcuCi0gKgotICovCi1jbGFzcyBDZWE2MDhDQ1BhcnNlciB7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1JPV1MgPSAxNTsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNQVhfQ09MUyA9IDMyOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDZWE2MDhDQ1BhcnNlciI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEID0gLTE7Ci0KLSAgICAvLyBFSUEtQ0VBLTYwODogVGFibGUgNzAgLSBDb250cm9sIENvZGVzCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJDTCA9IDB4MjA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJTICA9IDB4MjE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFPRiA9IDB4MjI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEFPTiA9IDB4MjM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFUiA9IDB4MjQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVMiA9IDB4MjU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVMyA9IDB4MjY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJVNCA9IDB4Mjc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPTiA9IDB4Mjg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJEQyA9IDB4Mjk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRSICA9IDB4MmE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJURCA9IDB4MmI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVETSA9IDB4MmM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IENSICA9IDB4MmQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVOTSA9IDB4MmU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEVPQyA9IDB4MmY7Ci0KLSAgICAvLyBUcmFuc3BhcmVudCBTcGFjZQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXIgVFMgPSAnXHUwMEEwJzsKLQotICAgIC8vIENhcHRpb25pbmcgTW9kZXMKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9VTktOT1dOID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9QQUlOVF9PTiA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfUk9MTF9VUCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1PREVfUE9QX09OID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTU9ERV9URVhUID0gNDsKLQotICAgIHByaXZhdGUgZmluYWwgRGlzcGxheUxpc3RlbmVyIG1MaXN0ZW5lcjsKLQotICAgIHByaXZhdGUgaW50IG1Nb2RlID0gTU9ERV9QQUlOVF9PTjsKLSAgICBwcml2YXRlIGludCBtUm9sbFVwU2l6ZSA9IDQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZDdHJsQ29kZSA9IElOVkFMSUQ7Ci0KLSAgICBwcml2YXRlIENDTWVtb3J5IG1EaXNwbGF5ID0gbmV3IENDTWVtb3J5KCk7Ci0gICAgcHJpdmF0ZSBDQ01lbW9yeSBtTm9uRGlzcGxheSA9IG5ldyBDQ01lbW9yeSgpOwotICAgIHByaXZhdGUgQ0NNZW1vcnkgbVRleHRNZW0gPSBuZXcgQ0NNZW1vcnkoKTsKLQotICAgIENlYTYwOENDUGFyc2VyKERpc3BsYXlMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBwYXJzZShieXRlW10gZGF0YSkgewotICAgICAgICBDQ0RhdGFbXSBjY0RhdGEgPSBDQ0RhdGEuZnJvbUJ5dGVBcnJheShkYXRhKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNjRGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjY0RhdGFbaV0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChoYW5kbGVDdHJsQ29kZShjY0RhdGFbaV0pCi0gICAgICAgICAgICAgICAgICAgIHx8IGhhbmRsZVRhYk9mZnNldHMoY2NEYXRhW2ldKQotICAgICAgICAgICAgICAgICAgICB8fCBoYW5kbGVQQUNDb2RlKGNjRGF0YVtpXSkKLSAgICAgICAgICAgICAgICAgICAgfHwgaGFuZGxlTWlkUm93Q29kZShjY0RhdGFbaV0pKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGhhbmRsZURpc3BsYXlhYmxlQ2hhcnMoY2NEYXRhW2ldKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludGVyZmFjZSBEaXNwbGF5TGlzdGVuZXIgewotICAgICAgICB2b2lkIG9uRGlzcGxheUNoYW5nZWQoU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltdIHN0eWxlZFRleHRzKTsKLSAgICAgICAgQ2FwdGlvblN0eWxlIGdldENhcHRpb25TdHlsZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgQ0NNZW1vcnkgZ2V0TWVtb3J5KCkgewotICAgICAgICAvLyBnZXQgdGhlIENDIG1lbW9yeSB0byBvcGVyYXRlIG9uIGZvciBjdXJyZW50IG1vZGUKLSAgICAgICAgc3dpdGNoIChtTW9kZSkgewotICAgICAgICBjYXNlIE1PREVfUE9QX09OOgotICAgICAgICAgICAgcmV0dXJuIG1Ob25EaXNwbGF5OwotICAgICAgICBjYXNlIE1PREVfVEVYVDoKLSAgICAgICAgICAgIC8vIFRPRE8oY2h6KTogc3VwcG9ydCBvbmx5IGNhcHRpb24gbW9kZSBmb3Igbm93LAotICAgICAgICAgICAgLy8gaW4gdGV4dCBtb2RlLCBkdW1wIGV2ZXJ5dGhpbmcgdG8gdGV4dCBtZW0uCi0gICAgICAgICAgICByZXR1cm4gbVRleHRNZW07Ci0gICAgICAgIGNhc2UgTU9ERV9QQUlOVF9PTjoKLSAgICAgICAgY2FzZSBNT0RFX1JPTExfVVA6Ci0gICAgICAgICAgICByZXR1cm4gbURpc3BsYXk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJ1bnJlY29naW5pemVkIG1vZGU6ICIgKyBtTW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1EaXNwbGF5OwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVEaXNwbGF5YWJsZUNoYXJzKENDRGF0YSBjY0RhdGEpIHsKLSAgICAgICAgaWYgKCFjY0RhdGEuaXNEaXNwbGF5YWJsZUNoYXIoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gRXh0ZW5kZWQgY2hhciBpbmNsdWRlcyAxIGF1dG9tYXRpYyBiYWNrc3BhY2UKLSAgICAgICAgaWYgKGNjRGF0YS5pc0V4dGVuZGVkQ2hhcigpKSB7Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS5icygpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2V0TWVtb3J5KCkud3JpdGVUZXh0KGNjRGF0YS5nZXREaXNwbGF5VGV4dCgpKTsKLQotICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9QQUlOVF9PTiB8fCBtTW9kZSA9PSBNT0RFX1JPTExfVVApIHsKLSAgICAgICAgICAgIHVwZGF0ZURpc3BsYXkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVNaWRSb3dDb2RlKENDRGF0YSBjY0RhdGEpIHsKLSAgICAgICAgU3R5bGVDb2RlIG0gPSBjY0RhdGEuZ2V0TWlkUm93KCk7Ci0gICAgICAgIGlmIChtICE9IG51bGwpIHsKLSAgICAgICAgICAgIGdldE1lbW9yeSgpLndyaXRlTWlkUm93Q29kZShtKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFuZGxlUEFDQ29kZShDQ0RhdGEgY2NEYXRhKSB7Ci0gICAgICAgIFBBQyBwYWMgPSBjY0RhdGEuZ2V0UEFDKCk7Ci0KLSAgICAgICAgaWYgKHBhYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9ST0xMX1VQKSB7Ci0gICAgICAgICAgICAgICAgZ2V0TWVtb3J5KCkubW92ZUJhc2VsaW5lVG8ocGFjLmdldFJvdygpLCBtUm9sbFVwU2l6ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRNZW1vcnkoKS53cml0ZVBBQyhwYWMpOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGhhbmRsZVRhYk9mZnNldHMoQ0NEYXRhIGNjRGF0YSkgewotICAgICAgICBpbnQgdGFicyA9IGNjRGF0YS5nZXRUYWJPZmZzZXQoKTsKLQotICAgICAgICBpZiAodGFicyA+IDApIHsKLSAgICAgICAgICAgIGdldE1lbW9yeSgpLnRhYih0YWJzKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBoYW5kbGVDdHJsQ29kZShDQ0RhdGEgY2NEYXRhKSB7Ci0gICAgICAgIGludCBjdHJsQ29kZSA9IGNjRGF0YS5nZXRDdHJsQ29kZSgpOwotCi0gICAgICAgIGlmIChtUHJldkN0cmxDb2RlICE9IElOVkFMSUQgJiYgbVByZXZDdHJsQ29kZSA9PSBjdHJsQ29kZSkgewotICAgICAgICAgICAgLy8gZGlzY2FyZCBkb3VibGUgY3RybCBjb2RlcyAoYnV0IGlmIHRoZXJlJ3MgYSAzcmQgb25lLCB3ZSBzdGlsbCB0YWtlIHRoYXQpCi0gICAgICAgICAgICBtUHJldkN0cmxDb2RlID0gSU5WQUxJRDsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgc3dpdGNoKGN0cmxDb2RlKSB7Ci0gICAgICAgIGNhc2UgUkNMOgotICAgICAgICAgICAgLy8gc2VsZWN0IHBvcC1vbiBzdHlsZQotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1BPUF9PTjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJTOgotICAgICAgICAgICAgZ2V0TWVtb3J5KCkuYnMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIERFUjoKLSAgICAgICAgICAgIGdldE1lbW9yeSgpLmRlcigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlUyOgotICAgICAgICBjYXNlIFJVMzoKLSAgICAgICAgY2FzZSBSVTQ6Ci0gICAgICAgICAgICBtUm9sbFVwU2l6ZSA9IChjdHJsQ29kZSAtIDB4MjMpOwotICAgICAgICAgICAgLy8gZXJhc2UgbWVtb3J5IGlmIGN1cnJlbnRseSBpbiBvdGhlciBzdHlsZQotICAgICAgICAgICAgaWYgKG1Nb2RlICE9IE1PREVfUk9MTF9VUCkgewotICAgICAgICAgICAgICAgIG1EaXNwbGF5LmVyYXNlKCk7Ci0gICAgICAgICAgICAgICAgbU5vbkRpc3BsYXkuZXJhc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIHNlbGVjdCByb2xsLXVwIHN0eWxlCi0gICAgICAgICAgICBtTW9kZSA9IE1PREVfUk9MTF9VUDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZPTjoKLSAgICAgICAgICAgIExvZy5pKFRBRywgIkZsYXNoIE9uIik7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSREM6Ci0gICAgICAgICAgICAvLyBzZWxlY3QgcGFpbnQtb24gc3R5bGUKLSAgICAgICAgICAgIG1Nb2RlID0gTU9ERV9QQUlOVF9PTjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFRSOgotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1RFWFQ7Ci0gICAgICAgICAgICBtVGV4dE1lbS5lcmFzZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUlREOgotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1RFWFQ7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBFRE06Ci0gICAgICAgICAgICAvLyBlcmFzZSBkaXNwbGF5IG1lbW9yeQotICAgICAgICAgICAgbURpc3BsYXkuZXJhc2UoKTsKLSAgICAgICAgICAgIHVwZGF0ZURpc3BsYXkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENSOgotICAgICAgICAgICAgaWYgKG1Nb2RlID09IE1PREVfUk9MTF9VUCkgewotICAgICAgICAgICAgICAgIGdldE1lbW9yeSgpLnJvbGxVcChtUm9sbFVwU2l6ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGdldE1lbW9yeSgpLmNyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobU1vZGUgPT0gTU9ERV9ST0xMX1VQKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlRGlzcGxheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRU5NOgotICAgICAgICAgICAgLy8gZXJhc2Ugbm9uLWRpc3BsYXkgbWVtb3J5Ci0gICAgICAgICAgICBtTm9uRGlzcGxheS5lcmFzZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRU9DOgotICAgICAgICAgICAgLy8gc3dhcCBkaXNwbGF5L25vbi1kaXNwbGF5IG1lbW9yeQotICAgICAgICAgICAgc3dhcE1lbW9yeSgpOwotICAgICAgICAgICAgLy8gc3dpdGNoIHRvIHBvcC1vbiBzdHlsZQotICAgICAgICAgICAgbU1vZGUgPSBNT0RFX1BPUF9PTjsKLSAgICAgICAgICAgIHVwZGF0ZURpc3BsYXkoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIElOVkFMSUQ6Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBtUHJldkN0cmxDb2RlID0gSU5WQUxJRDsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIG1QcmV2Q3RybENvZGUgPSBjdHJsQ29kZTsKLQotICAgICAgICAvLyBoYW5kbGVkCi0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVEaXNwbGF5KCkgewotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIENhcHRpb25TdHlsZSBjYXB0aW9uU3R5bGUgPSBtTGlzdGVuZXIuZ2V0Q2FwdGlvblN0eWxlKCk7Ci0gICAgICAgICAgICBtTGlzdGVuZXIub25EaXNwbGF5Q2hhbmdlZChtRGlzcGxheS5nZXRTdHlsZWRUZXh0KGNhcHRpb25TdHlsZSkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHN3YXBNZW1vcnkoKSB7Ci0gICAgICAgIENDTWVtb3J5IHRlbXAgPSBtRGlzcGxheTsKLSAgICAgICAgbURpc3BsYXkgPSBtTm9uRGlzcGxheTsKLSAgICAgICAgbU5vbkRpc3BsYXkgPSB0ZW1wOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFN0eWxlQ29kZSB7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfV0hJVEUgPSAwOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX0dSRUVOID0gMTsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9CTFVFID0gMjsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9DWUFOID0gMzsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDT0xPUl9SRUQgPSA0OwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX1lFTExPVyA9IDU7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfTUFHRU5UQSA9IDY7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfSU5WQUxJRCA9IDc7Ci0KLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBTVFlMRV9JVEFMSUNTICAgPSAweDAwMDAwMDAxOwotICAgICAgICBzdGF0aWMgZmluYWwgaW50IFNUWUxFX1VOREVSTElORSA9IDB4MDAwMDAwMDI7Ci0KLSAgICAgICAgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1Db2xvck1hcCA9IHsKLSAgICAgICAgICAgICJXSElURSIsICJHUkVFTiIsICJCTFVFIiwgIkNZQU4iLCAiUkVEIiwgIllFTExPVyIsICJNQUdFTlRBIiwgIklOVkFMSUQiCi0gICAgICAgIH07Ci0KLSAgICAgICAgZmluYWwgaW50IG1TdHlsZTsKLSAgICAgICAgZmluYWwgaW50IG1Db2xvcjsKLQotICAgICAgICBzdGF0aWMgU3R5bGVDb2RlIGZyb21CeXRlKGJ5dGUgZGF0YTIpIHsKLSAgICAgICAgICAgIGludCBzdHlsZSA9IDA7Ci0gICAgICAgICAgICBpbnQgY29sb3IgPSAoZGF0YTIgPj4gMSkgJiAweDc7Ci0KLSAgICAgICAgICAgIGlmICgoZGF0YTIgJiAweDEpICE9IDApIHsKLSAgICAgICAgICAgICAgICBzdHlsZSB8PSBTVFlMRV9VTkRFUkxJTkU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChjb2xvciA9PSBDT0xPUl9JTlZBTElEKSB7Ci0gICAgICAgICAgICAgICAgLy8gV0hJVEUgSVRBTElDUwotICAgICAgICAgICAgICAgIGNvbG9yID0gQ09MT1JfV0hJVEU7Ci0gICAgICAgICAgICAgICAgc3R5bGUgfD0gU1RZTEVfSVRBTElDUzsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHlsZUNvZGUoc3R5bGUsIGNvbG9yKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0eWxlQ29kZShpbnQgc3R5bGUsIGludCBjb2xvcikgewotICAgICAgICAgICAgbVN0eWxlID0gc3R5bGU7Ci0gICAgICAgICAgICBtQ29sb3IgPSBjb2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNJdGFsaWNzKCkgewotICAgICAgICAgICAgcmV0dXJuIChtU3R5bGUgJiBTVFlMRV9JVEFMSUNTKSAhPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc1VuZGVybGluZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAobVN0eWxlICYgU1RZTEVfVU5ERVJMSU5FKSAhPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldENvbG9yKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzdHIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgc3RyLmFwcGVuZCgieyIpOwotICAgICAgICAgICAgc3RyLmFwcGVuZChtQ29sb3JNYXBbbUNvbG9yXSk7Ci0gICAgICAgICAgICBpZiAoKG1TdHlsZSAmIFNUWUxFX0lUQUxJQ1MpICE9IDApIHsKLSAgICAgICAgICAgICAgICBzdHIuYXBwZW5kKCIsIElUQUxJQ1MiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgobVN0eWxlICYgU1RZTEVfVU5ERVJMSU5FKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3RyLmFwcGVuZCgiLCBVTkRFUkxJTkUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0ci5hcHBlbmQoIn0iKTsKLQotICAgICAgICAgICAgcmV0dXJuIHN0ci50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUEFDIGV4dGVuZHMgU3R5bGVDb2RlIHsKLSAgICAgICAgZmluYWwgaW50IG1Sb3c7Ci0gICAgICAgIGZpbmFsIGludCBtQ29sOwotCi0gICAgICAgIHN0YXRpYyBQQUMgZnJvbUJ5dGVzKGJ5dGUgZGF0YTEsIGJ5dGUgZGF0YTIpIHsKLSAgICAgICAgICAgIGludFtdIHJvd1RhYmxlID0gezExLCAxLCAzLCAxMiwgMTQsIDUsIDcsIDl9OwotICAgICAgICAgICAgaW50IHJvdyA9IHJvd1RhYmxlW2RhdGExICYgMHgwN10gKyAoKGRhdGEyICYgMHgyMCkgPj4gNSk7Ci0gICAgICAgICAgICBpbnQgc3R5bGUgPSAwOwotICAgICAgICAgICAgaWYgKChkYXRhMiAmIDEpICE9IDApIHsKLSAgICAgICAgICAgICAgICBzdHlsZSB8PSBTVFlMRV9VTkRFUkxJTkU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGRhdGEyICYgMHgxMCkgIT0gMCkgewotICAgICAgICAgICAgICAgIC8vIGluZGVudCBjb2RlCi0gICAgICAgICAgICAgICAgaW50IGluZGVudCA9IChkYXRhMiA+PiAxKSAmIDB4NzsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBBQyhyb3csIGluZGVudCAqIDQsIHN0eWxlLCBDT0xPUl9XSElURSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHN0eWxlIGNvZGUKLSAgICAgICAgICAgICAgICBpbnQgY29sb3IgPSAoZGF0YTIgPj4gMSkgJiAweDc7Ci0KLSAgICAgICAgICAgICAgICBpZiAoY29sb3IgPT0gQ09MT1JfSU5WQUxJRCkgewotICAgICAgICAgICAgICAgICAgICAvLyBXSElURSBJVEFMSUNTCi0gICAgICAgICAgICAgICAgICAgIGNvbG9yID0gQ09MT1JfV0hJVEU7Ci0gICAgICAgICAgICAgICAgICAgIHN0eWxlIHw9IFNUWUxFX0lUQUxJQ1M7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUEFDKHJvdywgLTEsIHN0eWxlLCBjb2xvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBQQUMoaW50IHJvdywgaW50IGNvbCwgaW50IHN0eWxlLCBpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIHN1cGVyKHN0eWxlLCBjb2xvcik7Ci0gICAgICAgICAgICBtUm93ID0gcm93OwotICAgICAgICAgICAgbUNvbCA9IGNvbDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNJbmRlbnRQQUMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKG1Db2wgPj0gMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0Um93KCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3c7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgZ2V0Q29sKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db2w7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJ7JWQsICVkfSwgJXMiLAotICAgICAgICAgICAgICAgICAgICBtUm93LCBtQ29sLCBzdXBlci50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIE11dGFibGUgdmVyc2lvbiBvZiBCYWNrZ3JvdW5kU3BhbiB0byBmYWNpbGl0YXRlIHRleHQgcmVuZGVyaW5nIHdpdGggZWRnZSBzdHlsZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNdXRhYmxlQmFja2dyb3VuZENvbG9yU3BhbiBleHRlbmRzIENoYXJhY3RlclN0eWxlCi0gICAgICAgICAgICBpbXBsZW1lbnRzIFVwZGF0ZUFwcGVhcmFuY2UgewotICAgICAgICBwcml2YXRlIGludCBtQ29sb3I7Ci0KLSAgICAgICAgcHVibGljIE11dGFibGVCYWNrZ3JvdW5kQ29sb3JTcGFuKGludCBjb2xvcikgewotICAgICAgICAgICAgbUNvbG9yID0gY29sb3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRCYWNrZ3JvdW5kQ29sb3IoaW50IGNvbG9yKSB7Ci0gICAgICAgICAgICBtQ29sb3IgPSBjb2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0QmFja2dyb3VuZENvbG9yKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db2xvcjsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCB1cGRhdGVEcmF3U3RhdGUoVGV4dFBhaW50IGRzKSB7Ci0gICAgICAgICAgICBkcy5iZ0NvbG9yID0gbUNvbG9yOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyogQ0NMaW5lQnVpbGRlciBrZWVwcyB0cmFjayBvZiBkaXNwbGF5YWJsZSBjaGFycywgYXMgd2VsbCBhcwotICAgICAqIE1pZFJvdyBzdHlsZXMgYW5kIFBBQ3MsIGZvciBhIHNpbmdsZSBsaW5lIG9mIENDIG1lbW9yeS4KLSAgICAgKgotICAgICAqIEl0IGdlbmVyYXRlcyBzdHlsZWQgdGV4dCB2aWEgZ2V0U3R5bGVkVGV4dCgpIG1ldGhvZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBDQ0xpbmVCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWlsZGVyIG1EaXNwbGF5Q2hhcnM7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3R5bGVDb2RlW10gbU1pZFJvd1N0eWxlczsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHlsZUNvZGVbXSBtUEFDU3R5bGVzOwotCi0gICAgICAgIENDTGluZUJ1aWxkZXIoU3RyaW5nIHN0cikgewotICAgICAgICAgICAgbURpc3BsYXlDaGFycyA9IG5ldyBTdHJpbmdCdWlsZGVyKHN0cik7Ci0gICAgICAgICAgICBtTWlkUm93U3R5bGVzID0gbmV3IFN0eWxlQ29kZVttRGlzcGxheUNoYXJzLmxlbmd0aCgpXTsKLSAgICAgICAgICAgIG1QQUNTdHlsZXMgPSBuZXcgU3R5bGVDb2RlW21EaXNwbGF5Q2hhcnMubGVuZ3RoKCldOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRDaGFyQXQoaW50IGluZGV4LCBjaGFyIGNoKSB7Ci0gICAgICAgICAgICBtRGlzcGxheUNoYXJzLnNldENoYXJBdChpbmRleCwgY2gpOwotICAgICAgICAgICAgbU1pZFJvd1N0eWxlc1tpbmRleF0gPSBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBzZXRNaWRSb3dBdChpbnQgaW5kZXgsIFN0eWxlQ29kZSBtKSB7Ci0gICAgICAgICAgICBtRGlzcGxheUNoYXJzLnNldENoYXJBdChpbmRleCwgJyAnKTsKLSAgICAgICAgICAgIG1NaWRSb3dTdHlsZXNbaW5kZXhdID0gbTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2V0UEFDQXQoaW50IGluZGV4LCBQQUMgcGFjKSB7Ci0gICAgICAgICAgICBtUEFDU3R5bGVzW2luZGV4XSA9IHBhYzsKLSAgICAgICAgfQotCi0gICAgICAgIGNoYXIgY2hhckF0KGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5Q2hhcnMuY2hhckF0KGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBsZW5ndGgoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURpc3BsYXlDaGFycy5sZW5ndGgoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgYXBwbHlTdHlsZVNwYW4oCi0gICAgICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBzdHlsZWRUZXh0LAotICAgICAgICAgICAgICAgIFN0eWxlQ29kZSBzLCBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgICAgICAgICAgIGlmIChzLmlzSXRhbGljcygpKSB7Ci0gICAgICAgICAgICAgICAgc3R5bGVkVGV4dC5zZXRTcGFuKAotICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0eWxlU3BhbihhbmRyb2lkLmdyYXBoaWNzLlR5cGVmYWNlLklUQUxJQyksCi0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCwgZW5kLCBTcGFubmFibGUuU1BBTl9FWENMVVNJVkVfRVhDTFVTSVZFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChzLmlzVW5kZXJsaW5lKCkpIHsKLSAgICAgICAgICAgICAgICBzdHlsZWRUZXh0LnNldFNwYW4oCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgVW5kZXJsaW5lU3BhbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQsIGVuZCwgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyIGdldFN0eWxlZFRleHQoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSkgewotICAgICAgICAgICAgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlciBzdHlsZWRUZXh0ID0gbmV3IFNwYW5uYWJsZVN0cmluZ0J1aWxkZXIobURpc3BsYXlDaGFycyk7Ci0gICAgICAgICAgICBpbnQgc3RhcnQgPSAtMSwgbmV4dCA9IDA7Ci0gICAgICAgICAgICBpbnQgc3R5bGVTdGFydCA9IC0xOwotICAgICAgICAgICAgU3R5bGVDb2RlIGN1clN0eWxlID0gbnVsbDsKLSAgICAgICAgICAgIHdoaWxlIChuZXh0IDwgbURpc3BsYXlDaGFycy5sZW5ndGgoKSkgewotICAgICAgICAgICAgICAgIFN0eWxlQ29kZSBuZXdTdHlsZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKG1NaWRSb3dTdHlsZXNbbmV4dF0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAvLyBhcHBseSBtaWQtcm93IHN0eWxlIGNoYW5nZQotICAgICAgICAgICAgICAgICAgICBuZXdTdHlsZSA9IG1NaWRSb3dTdHlsZXNbbmV4dF07Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtUEFDU3R5bGVzW25leHRdICE9IG51bGwKLSAgICAgICAgICAgICAgICAgICAgJiYgKHN0eWxlU3RhcnQgPCAwIHx8IHN0YXJ0IDwgMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gYXBwbHkgUEFDIHN0eWxlIGNoYW5nZSwgb25seSBpZjoKLSAgICAgICAgICAgICAgICAgICAgLy8gMS4gbm8gc3R5bGUgc2V0LCBvcgotICAgICAgICAgICAgICAgICAgICAvLyAyLiBzdHlsZSBzZXQsIGJ1dCBwcmV2IGNoYXIgaXMgbm9uZS1kaXNwbGF5YWJsZQotICAgICAgICAgICAgICAgICAgICBuZXdTdHlsZSA9IG1QQUNTdHlsZXNbbmV4dF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChuZXdTdHlsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1clN0eWxlID0gbmV3U3R5bGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVN0YXJ0ID49IDAgJiYgc3RhcnQgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlTdHlsZVNwYW4oc3R5bGVkVGV4dCwgbmV3U3R5bGUsIHN0eWxlU3RhcnQsIG5leHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN0eWxlU3RhcnQgPSBuZXh0OwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChtRGlzcGxheUNoYXJzLmNoYXJBdChuZXh0KSAhPSBUUykgewotICAgICAgICAgICAgICAgICAgICBpZiAoc3RhcnQgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IG5leHQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHN0YXJ0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IGV4cGFuZGVkU3RhcnQgPSBtRGlzcGxheUNoYXJzLmNoYXJBdChzdGFydCkgPT0gJyAnID8gc3RhcnQgOiBzdGFydCAtIDE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBleHBhbmRlZEVuZCA9IG1EaXNwbGF5Q2hhcnMuY2hhckF0KG5leHQgLSAxKSA9PSAnICcgPyBuZXh0IDogbmV4dCArIDE7Ci0gICAgICAgICAgICAgICAgICAgIHN0eWxlZFRleHQuc2V0U3BhbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTXV0YWJsZUJhY2tncm91bmRDb2xvclNwYW4oY2FwdGlvblN0eWxlLmJhY2tncm91bmRDb2xvciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWRTdGFydCwgZXhwYW5kZWRFbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3Bhbm5hYmxlLlNQQU5fRVhDTFVTSVZFX0VYQ0xVU0lWRSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZVN0YXJ0ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3R5bGVTcGFuKHN0eWxlZFRleHQsIGN1clN0eWxlLCBzdHlsZVN0YXJ0LCBleHBhbmRlZEVuZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbmV4dCsrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gc3R5bGVkVGV4dDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogQ0NNZW1vcnkgbW9kZWxzIGEgY29uc29sZS1zdHlsZSBkaXNwbGF5LgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDTWVtb3J5IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbUJsYW5rTGluZTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBDQ0xpbmVCdWlsZGVyW10gbUxpbmVzID0gbmV3IENDTGluZUJ1aWxkZXJbTUFYX1JPV1MgKyAyXTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVJvdzsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbDsKLQotICAgICAgICBDQ01lbW9yeSgpIHsKLSAgICAgICAgICAgIGNoYXJbXSBibGFuayA9IG5ldyBjaGFyW01BWF9DT0xTICsgMl07Ci0gICAgICAgICAgICBBcnJheXMuZmlsbChibGFuaywgVFMpOwotICAgICAgICAgICAgbUJsYW5rTGluZSA9IG5ldyBTdHJpbmcoYmxhbmspOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBlcmFzZSgpIHsKLSAgICAgICAgICAgIC8vIGVyYXNlIGFsbCBsaW5lcwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtTGluZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJvdyA9IE1BWF9ST1dTOwotICAgICAgICAgICAgbUNvbCA9IDE7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGRlcigpIHsKLSAgICAgICAgICAgIGlmIChtTGluZXNbbVJvd10gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbUNvbDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtTGluZXNbbVJvd10uY2hhckF0KGkpICE9IFRTKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBqID0gbUNvbDsgaiA8IG1MaW5lc1ttUm93XS5sZW5ndGgoKTsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxpbmVzW2pdLnNldENoYXJBdChqLCBUUyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUxpbmVzW21Sb3ddID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdGFiKGludCB0YWJzKSB7Ci0gICAgICAgICAgICBtb3ZlQ3Vyc29yQnlDb2wodGFicyk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGJzKCkgewotICAgICAgICAgICAgbW92ZUN1cnNvckJ5Q29sKC0xKTsKLSAgICAgICAgICAgIGlmIChtTGluZXNbbVJvd10gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1MaW5lc1ttUm93XS5zZXRDaGFyQXQobUNvbCwgVFMpOwotICAgICAgICAgICAgICAgIGlmIChtQ29sID09IE1BWF9DT0xTIC0gMSkgewotICAgICAgICAgICAgICAgICAgICAvLyBTcGVjIHJlY29tbWVuZGF0aW9uOgotICAgICAgICAgICAgICAgICAgICAvLyBpZiBjdXJzb3Igd2FzIGF0IGNvbCAzMiwgbW92ZSBjdXJzb3IKLSAgICAgICAgICAgICAgICAgICAgLy8gYmFjayB0byBjb2wgMzEgYW5kIGVyYXNlIGJvdGggY29sIDMxJjMyCi0gICAgICAgICAgICAgICAgICAgIG1MaW5lc1ttUm93XS5zZXRDaGFyQXQoTUFYX0NPTFMsIFRTKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIGNyKCkgewotICAgICAgICAgICAgbW92ZUN1cnNvclRvKG1Sb3cgKyAxLCAxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgcm9sbFVwKGludCB3aW5kb3dTaXplKSB7Ci0gICAgICAgICAgICBpbnQgaTsKLSAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbVJvdyAtIHdpbmRvd1NpemU7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lc1tpXSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgc3RhcnRSb3cgPSBtUm93IC0gd2luZG93U2l6ZSArIDE7Ci0gICAgICAgICAgICBpZiAoc3RhcnRSb3cgPCAxKSB7Ci0gICAgICAgICAgICAgICAgc3RhcnRSb3cgPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gc3RhcnRSb3c7IGkgPCBtUm93OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBtTGluZXNbaSArIDFdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gbVJvdzsgaSA8IG1MaW5lcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIC8vIGNsZWFyIGJhc2Ugcm93Ci0gICAgICAgICAgICAgICAgbUxpbmVzW2ldID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gY29sIDEsIGluIGNhc2UgUEFDIGlzIG5vdCBzZW50Ci0gICAgICAgICAgICBtQ29sID0gMTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVUZXh0KFN0cmluZyB0ZXh0KSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRleHQubGVuZ3RoKCk7IGkrKykgewotICAgICAgICAgICAgICAgIGdldExpbmVCdWZmZXIobVJvdykuc2V0Q2hhckF0KG1Db2wsIHRleHQuY2hhckF0KGkpKTsKLSAgICAgICAgICAgICAgICBtb3ZlQ3Vyc29yQnlDb2woMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHdyaXRlTWlkUm93Q29kZShTdHlsZUNvZGUgbSkgewotICAgICAgICAgICAgZ2V0TGluZUJ1ZmZlcihtUm93KS5zZXRNaWRSb3dBdChtQ29sLCBtKTsKLSAgICAgICAgICAgIG1vdmVDdXJzb3JCeUNvbCgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgd3JpdGVQQUMoUEFDIHBhYykgewotICAgICAgICAgICAgaWYgKHBhYy5pc0luZGVudFBBQygpKSB7Ci0gICAgICAgICAgICAgICAgbW92ZUN1cnNvclRvKHBhYy5nZXRSb3coKSwgcGFjLmdldENvbCgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbW92ZUN1cnNvclRvKHBhYy5nZXRSb3coKSwgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZXRMaW5lQnVmZmVyKG1Sb3cpLnNldFBBQ0F0KG1Db2wsIHBhYyk7Ci0gICAgICAgIH0KLQotICAgICAgICBTcGFubmFibGVTdHJpbmdCdWlsZGVyW10gZ2V0U3R5bGVkVGV4dChDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlKSB7Ci0gICAgICAgICAgICBBcnJheUxpc3Q8U3Bhbm5hYmxlU3RyaW5nQnVpbGRlcj4gcm93cyA9IG5ldyBBcnJheUxpc3Q8PihNQVhfUk9XUyk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8PSBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgcm93cy5hZGQobUxpbmVzW2ldICE9IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgbUxpbmVzW2ldLmdldFN0eWxlZFRleHQoY2FwdGlvblN0eWxlKSA6IG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHJvd3MudG9BcnJheShuZXcgU3Bhbm5hYmxlU3RyaW5nQnVpbGRlcltNQVhfUk9XU10pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgaW50IGNsYW1wKGludCB4LCBpbnQgbWluLCBpbnQgbWF4KSB7Ci0gICAgICAgICAgICByZXR1cm4geCA8IG1pbiA/IG1pbiA6ICh4ID4gbWF4ID8gbWF4IDogeCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgbW92ZUN1cnNvclRvKGludCByb3csIGludCBjb2wpIHsKLSAgICAgICAgICAgIG1Sb3cgPSBjbGFtcChyb3csIDEsIE1BWF9ST1dTKTsKLSAgICAgICAgICAgIG1Db2wgPSBjbGFtcChjb2wsIDEsIE1BWF9DT0xTKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBtb3ZlQ3Vyc29yVG9Sb3coaW50IHJvdykgewotICAgICAgICAgICAgbVJvdyA9IGNsYW1wKHJvdywgMSwgTUFYX1JPV1MpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1vdmVDdXJzb3JCeUNvbChpbnQgY29sKSB7Ci0gICAgICAgICAgICBtQ29sID0gY2xhbXAobUNvbCArIGNvbCwgMSwgTUFYX0NPTFMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIG1vdmVCYXNlbGluZVRvKGludCBiYXNlUm93LCBpbnQgd2luZG93U2l6ZSkgewotICAgICAgICAgICAgaWYgKG1Sb3cgPT0gYmFzZVJvdykgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBhY3R1YWxXaW5kb3dTaXplID0gd2luZG93U2l6ZTsKLSAgICAgICAgICAgIGlmIChiYXNlUm93IDwgYWN0dWFsV2luZG93U2l6ZSkgewotICAgICAgICAgICAgICAgIGFjdHVhbFdpbmRvd1NpemUgPSBiYXNlUm93OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Sb3cgPCBhY3R1YWxXaW5kb3dTaXplKSB7Ci0gICAgICAgICAgICAgICAgYWN0dWFsV2luZG93U2l6ZSA9IG1Sb3c7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBpOwotICAgICAgICAgICAgaWYgKGJhc2VSb3cgPCBtUm93KSB7Ci0gICAgICAgICAgICAgICAgLy8gY29weSBmcm9tIGJvdHRvbSB0byB0b3Agcm93Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gYWN0dWFsV2luZG93U2l6ZSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MaW5lc1tiYXNlUm93IC0gaV0gPSBtTGluZXNbbVJvdyAtIGldOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gY29weSBmcm9tIHRvcCB0byBib3R0b20gcm93Ci0gICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IGFjdHVhbFdpbmRvd1NpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBtTGluZXNbYmFzZVJvdyAtIGldID0gbUxpbmVzW21Sb3cgLSBpXTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjbGVhciByZXN0IG9mIHRoZSByb3dzCi0gICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDw9IGJhc2VSb3cgLSB3aW5kb3dTaXplOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpID0gYmFzZVJvdyArIDE7IGkgPCBtTGluZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbaV0gPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBDQ0xpbmVCdWlsZGVyIGdldExpbmVCdWZmZXIoaW50IHJvdykgewotICAgICAgICAgICAgaWYgKG1MaW5lc1tyb3ddID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtTGluZXNbcm93XSA9IG5ldyBDQ0xpbmVCdWlsZGVyKG1CbGFua0xpbmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1MaW5lc1tyb3ddOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBDQ0RhdGEgcGFyc2VzIHRoZSByYXcgQ0MgYnl0ZSBwYWlyIGludG8gZGlzcGxheWFibGUgY2hhcnMsCi0gICAgICogbWlzYyBjb250cm9sIGNvZGVzLCBNaWQtUm93IG9yIFByZWFtYmxlIEFkZHJlc3MgQ29kZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0NEYXRhIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBieXRlIG1UeXBlOwotICAgICAgICBwcml2YXRlIGZpbmFsIGJ5dGUgbURhdGExOwotICAgICAgICBwcml2YXRlIGZpbmFsIGJ5dGUgbURhdGEyOwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1DdHJsQ29kZU1hcCA9IHsKLSAgICAgICAgICAgICJSQ0wiLCAiQlMiICwgIkFPRiIsICJBT04iLAotICAgICAgICAgICAgIkRFUiIsICJSVTIiLCAiUlUzIiwgIlJVNCIsCi0gICAgICAgICAgICAiRk9OIiwgIlJEQyIsICJUUiIgLCAiUlREIiwKLSAgICAgICAgICAgICJFRE0iLCAiQ1IiICwgIkVOTSIsICJFT0MiLAotICAgICAgICB9OwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1TcGVjaWFsQ2hhck1hcCA9IHsKLSAgICAgICAgICAgICJcdTAwQUUiLAotICAgICAgICAgICAgIlx1MDBCMCIsCi0gICAgICAgICAgICAiXHUwMEJEIiwKLSAgICAgICAgICAgICJcdTAwQkYiLAotICAgICAgICAgICAgIlx1MjEyMiIsCi0gICAgICAgICAgICAiXHUwMEEyIiwKLSAgICAgICAgICAgICJcdTAwQTMiLAotICAgICAgICAgICAgIlx1MjY2QSIsIC8vIEVpZ2h0aCBub3RlCi0gICAgICAgICAgICAiXHUwMEUwIiwKLSAgICAgICAgICAgICJcdTAwQTAiLCAvLyBUcmFuc3BhcmVudCBzcGFjZQotICAgICAgICAgICAgIlx1MDBFOCIsCi0gICAgICAgICAgICAiXHUwMEUyIiwKLSAgICAgICAgICAgICJcdTAwRUEiLAotICAgICAgICAgICAgIlx1MDBFRSIsCi0gICAgICAgICAgICAiXHUwMEY0IiwKLSAgICAgICAgICAgICJcdTAwRkIiLAotICAgICAgICB9OwotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIG1TcGFuaXNoQ2hhck1hcCA9IHsKLSAgICAgICAgICAgIC8vIFNwYW5pc2ggYW5kIG1pc2MgY2hhcnMKLSAgICAgICAgICAgICJcdTAwQzEiLCAvLyBBCi0gICAgICAgICAgICAiXHUwMEM5IiwgLy8gRQotICAgICAgICAgICAgIlx1MDBEMyIsIC8vIEkKLSAgICAgICAgICAgICJcdTAwREEiLCAvLyBPCi0gICAgICAgICAgICAiXHUwMERDIiwgLy8gVQotICAgICAgICAgICAgIlx1MDBGQyIsIC8vIHUKLSAgICAgICAgICAgICJcdTIwMTgiLCAvLyBvcGVuaW5nIHNpbmdsZSBxdW90ZQotICAgICAgICAgICAgIlx1MDBBMSIsIC8vIGludmVydGVkIGV4Y2xhbWF0aW9uIG1hcmsKLSAgICAgICAgICAgICIqIiwKLSAgICAgICAgICAgICInIiwKLSAgICAgICAgICAgICJcdTIwMTQiLCAvLyBlbSBkYXNoCi0gICAgICAgICAgICAiXHUwMEE5IiwgLy8gQ29weXJpZ2h0Ci0gICAgICAgICAgICAiXHUyMTIwIiwgLy8gU2VydmljZW1hcmsKLSAgICAgICAgICAgICJcdTIwMjIiLCAvLyByb3VuZCBidWxsZXQKLSAgICAgICAgICAgICJcdTIwMUMiLCAvLyBvcGVuaW5nIGRvdWJsZSBxdW90ZQotICAgICAgICAgICAgIlx1MjAxRCIsIC8vIGNsb3NpbmcgZG91YmxlIHF1b3RlCi0gICAgICAgICAgICAvLyBGcmVuY2gKLSAgICAgICAgICAgICJcdTAwQzAiLAotICAgICAgICAgICAgIlx1MDBDMiIsCi0gICAgICAgICAgICAiXHUwMEM3IiwKLSAgICAgICAgICAgICJcdTAwQzgiLAotICAgICAgICAgICAgIlx1MDBDQSIsCi0gICAgICAgICAgICAiXHUwMENCIiwKLSAgICAgICAgICAgICJcdTAwRUIiLAotICAgICAgICAgICAgIlx1MDBDRSIsCi0gICAgICAgICAgICAiXHUwMENGIiwKLSAgICAgICAgICAgICJcdTAwRUYiLAotICAgICAgICAgICAgIlx1MDBENCIsCi0gICAgICAgICAgICAiXHUwMEQ5IiwKLSAgICAgICAgICAgICJcdTAwRjkiLAotICAgICAgICAgICAgIlx1MDBEQiIsCi0gICAgICAgICAgICAiXHUwMEFCIiwKLSAgICAgICAgICAgICJcdTAwQkIiCi0gICAgICAgIH07Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gbVByb3R1Z3Vlc2VDaGFyTWFwID0gewotICAgICAgICAgICAgLy8gUG9ydHVndWVzZQotICAgICAgICAgICAgIlx1MDBDMyIsCi0gICAgICAgICAgICAiXHUwMEUzIiwKLSAgICAgICAgICAgICJcdTAwQ0QiLAotICAgICAgICAgICAgIlx1MDBDQyIsCi0gICAgICAgICAgICAiXHUwMEVDIiwKLSAgICAgICAgICAgICJcdTAwRDIiLAotICAgICAgICAgICAgIlx1MDBGMiIsCi0gICAgICAgICAgICAiXHUwMEQ1IiwKLSAgICAgICAgICAgICJcdTAwRjUiLAotICAgICAgICAgICAgInsiLAotICAgICAgICAgICAgIn0iLAotICAgICAgICAgICAgIlxcIiwKLSAgICAgICAgICAgICJeIiwKLSAgICAgICAgICAgICJfIiwKLSAgICAgICAgICAgICJ8IiwKLSAgICAgICAgICAgICJ+IiwKLSAgICAgICAgICAgIC8vIEdlcm1hbiBhbmQgbWlzYyBjaGFycwotICAgICAgICAgICAgIlx1MDBDNCIsCi0gICAgICAgICAgICAiXHUwMEU0IiwKLSAgICAgICAgICAgICJcdTAwRDYiLAotICAgICAgICAgICAgIlx1MDBGNiIsCi0gICAgICAgICAgICAiXHUwMERGIiwKLSAgICAgICAgICAgICJcdTAwQTUiLAotICAgICAgICAgICAgIlx1MDBBNCIsCi0gICAgICAgICAgICAiXHUyNTAyIiwgLy8gdmVydGljYWwgYmFyCi0gICAgICAgICAgICAiXHUwMEM1IiwKLSAgICAgICAgICAgICJcdTAwRTUiLAotICAgICAgICAgICAgIlx1MDBEOCIsCi0gICAgICAgICAgICAiXHUwMEY4IiwKLSAgICAgICAgICAgICJcdTI1MEMiLCAvLyB0b3AtbGVmdCBjb3JuZXIKLSAgICAgICAgICAgICJcdTI1MTAiLCAvLyB0b3AtcmlnaHQgY29ybmVyCi0gICAgICAgICAgICAiXHUyNTE0IiwgLy8gbG93ZXItbGVmdCBjb3JuZXIKLSAgICAgICAgICAgICJcdTI1MTgiLCAvLyBsb3dlci1yaWdodCBjb3JuZXIKLSAgICAgICAgfTsKLQotICAgICAgICBzdGF0aWMgQ0NEYXRhW10gZnJvbUJ5dGVBcnJheShieXRlW10gZGF0YSkgewotICAgICAgICAgICAgQ0NEYXRhW10gY2NEYXRhID0gbmV3IENDRGF0YVtkYXRhLmxlbmd0aCAvIDNdOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNjRGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgIGNjRGF0YVtpXSA9IG5ldyBDQ0RhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhW2kgKiAzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbaSAqIDMgKyAxXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFbaSAqIDMgKyAyXSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBjY0RhdGE7Ci0gICAgICAgIH0KLQotICAgICAgICBDQ0RhdGEoYnl0ZSB0eXBlLCBieXRlIGRhdGExLCBieXRlIGRhdGEyKSB7Ci0gICAgICAgICAgICBtVHlwZSA9IHR5cGU7Ci0gICAgICAgICAgICBtRGF0YTEgPSBkYXRhMTsKLSAgICAgICAgICAgIG1EYXRhMiA9IGRhdGEyOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IGdldEN0cmxDb2RlKCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxNCB8fCBtRGF0YTEgPT0gMHgxYykKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4MmYpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbURhdGEyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIElOVkFMSUQ7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHlsZUNvZGUgZ2V0TWlkUm93KCkgewotICAgICAgICAgICAgLy8gb25seSBzdXBwb3J0IHN0YW5kYXJkIE1pZC1yb3cgY29kZXMsIGlnbm9yZQotICAgICAgICAgICAgLy8gb3B0aW9uYWwgYmFja2dyb3VuZC9mb3JlZ3JvdW5kIG1pZC1yb3cgY29kZXMKLSAgICAgICAgICAgIGlmICgobURhdGExID09IDB4MTEgfHwgbURhdGExID09IDB4MTkpCi0gICAgICAgICAgICAgICAgICAgICYmIG1EYXRhMiA+PSAweDIwICYmIG1EYXRhMiA8PSAweDJmKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0eWxlQ29kZS5mcm9tQnl0ZShtRGF0YTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBQQUMgZ2V0UEFDKCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgJiAweDcwKSA9PSAweDEwCi0gICAgICAgICAgICAgICAgICAgICYmIChtRGF0YTIgJiAweDQwKSA9PSAweDQwCi0gICAgICAgICAgICAgICAgICAgICYmICgobURhdGExICYgMHgwNykgIT0gMCB8fCAobURhdGEyICYgMHgyMCkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gUEFDLmZyb21CeXRlcyhtRGF0YTEsIG1EYXRhMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBnZXRUYWJPZmZzZXQoKSB7Ci0gICAgICAgICAgICBpZiAoKG1EYXRhMSA9PSAweDE3IHx8IG1EYXRhMSA9PSAweDFmKQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgyMSAmJiBtRGF0YTIgPD0gMHgyMykgewotICAgICAgICAgICAgICAgIHJldHVybiBtRGF0YTIgJiAweDM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIGJvb2xlYW4gaXNEaXNwbGF5YWJsZUNoYXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gaXNCYXNpY0NoYXIoKSB8fCBpc1NwZWNpYWxDaGFyKCkgfHwgaXNFeHRlbmRlZENoYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFN0cmluZyBnZXREaXNwbGF5VGV4dCgpIHsKLSAgICAgICAgICAgIFN0cmluZyBzdHIgPSBnZXRCYXNpY0NoYXJzKCk7Ci0KLSAgICAgICAgICAgIGlmIChzdHIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN0ciA9ICBnZXRTcGVjaWFsQ2hhcigpOwotCi0gICAgICAgICAgICAgICAgaWYgKHN0ciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0ciA9IGdldEV4dGVuZGVkQ2hhcigpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIHN0cjsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGN0cmxDb2RlVG9TdHJpbmcoaW50IGN0cmxDb2RlKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUN0cmxDb2RlTWFwW2N0cmxDb2RlIC0gMHgyMF07Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNCYXNpY0NoYXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURhdGExID49IDB4MjAgJiYgbURhdGExIDw9IDB4N2Y7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNTcGVjaWFsQ2hhcigpIHsKLSAgICAgICAgICAgIHJldHVybiAoKG1EYXRhMSA9PSAweDExIHx8IG1EYXRhMSA9PSAweDE5KQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgzMCAmJiBtRGF0YTIgPD0gMHgzZik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gaXNFeHRlbmRlZENoYXIoKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChtRGF0YTEgPT0gMHgxMiB8fCBtRGF0YTEgPT0gMHgxQQotICAgICAgICAgICAgICAgICAgICB8fCBtRGF0YTEgPT0gMHgxMyB8fCBtRGF0YTEgPT0gMHgxQikKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4M2YpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBjaGFyIGdldEJhc2ljQ2hhcihieXRlIGRhdGEpIHsKLSAgICAgICAgICAgIGNoYXIgYzsKLSAgICAgICAgICAgIC8vIHJlcGxhY2UgdGhlIG5vbi1BU0NJSSBvbmVzCi0gICAgICAgICAgICBzd2l0Y2ggKGRhdGEpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDB4MkE6IGMgPSAnXHUwMEUxJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDVDOiBjID0gJ1x1MDBFOSc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg1RTogYyA9ICdcdTAwRUQnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4NUY6IGMgPSAnXHUwMEYzJzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDYwOiBjID0gJ1x1MDBGQSc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg3QjogYyA9ICdcdTAwRTcnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4N0M6IGMgPSAnXHUwMEY3JzsgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAweDdEOiBjID0gJ1x1MDBEMSc7IGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgMHg3RTogYyA9ICdcdTAwRjEnOyBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDB4N0Y6IGMgPSAnXHUyNTg4JzsgYnJlYWs7IC8vIEZ1bGwgYmxvY2sKLSAgICAgICAgICAgICAgICBkZWZhdWx0OiBjID0gKGNoYXIpIGRhdGE7IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGM7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRCYXNpY0NoYXJzKCkgewotICAgICAgICAgICAgaWYgKG1EYXRhMSA+PSAweDIwICYmIG1EYXRhMSA8PSAweDdmKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoMik7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoZ2V0QmFzaWNDaGFyKG1EYXRhMSkpOwotICAgICAgICAgICAgICAgIGlmIChtRGF0YTIgPj0gMHgyMCAmJiBtRGF0YTIgPD0gMHg3ZikgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChnZXRCYXNpY0NoYXIobURhdGEyKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBidWlsZGVyLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0U3BlY2lhbENoYXIoKSB7Ci0gICAgICAgICAgICBpZiAoKG1EYXRhMSA9PSAweDExIHx8IG1EYXRhMSA9PSAweDE5KQotICAgICAgICAgICAgICAgICAgICAmJiBtRGF0YTIgPj0gMHgzMCAmJiBtRGF0YTIgPD0gMHgzZikgewotICAgICAgICAgICAgICAgIHJldHVybiBtU3BlY2lhbENoYXJNYXBbbURhdGEyIC0gMHgzMF07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgZ2V0RXh0ZW5kZWRDaGFyKCkgewotICAgICAgICAgICAgaWYgKChtRGF0YTEgPT0gMHgxMiB8fCBtRGF0YTEgPT0gMHgxQSkKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4M2YpewotICAgICAgICAgICAgICAgIC8vIDEgU3BhbmlzaC9GcmVuY2ggY2hhcgotICAgICAgICAgICAgICAgIHJldHVybiBtU3BhbmlzaENoYXJNYXBbbURhdGEyIC0gMHgyMF07Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKChtRGF0YTEgPT0gMHgxMyB8fCBtRGF0YTEgPT0gMHgxQikKLSAgICAgICAgICAgICAgICAgICAgJiYgbURhdGEyID49IDB4MjAgJiYgbURhdGEyIDw9IDB4M2YpewotICAgICAgICAgICAgICAgIC8vIDEgUG9ydHVndWVzZS9HZXJtYW4vRGFuaXNoIGNoYXIKLSAgICAgICAgICAgICAgICByZXR1cm4gbVByb3R1Z3Vlc2VDaGFyTWFwW21EYXRhMiAtIDB4MjBdOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nIHN0cjsKLQotICAgICAgICAgICAgaWYgKG1EYXRhMSA8IDB4MTAgJiYgbURhdGEyIDwgMHgxMCkgewotICAgICAgICAgICAgICAgIC8vIE51bGwgUGFkLCBpZ25vcmUKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXU51bGw6ICUwMnggJTAyeCIsIG1UeXBlLCBtRGF0YTEsIG1EYXRhMik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludCBjdHJsQ29kZSA9IGdldEN0cmxDb2RlKCk7Ci0gICAgICAgICAgICBpZiAoY3RybENvZGUgIT0gSU5WQUxJRCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdJXMiLCBtVHlwZSwgY3RybENvZGVUb1N0cmluZyhjdHJsQ29kZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgdGFiT2Zmc2V0ID0gZ2V0VGFiT2Zmc2V0KCk7Ci0gICAgICAgICAgICBpZiAodGFiT2Zmc2V0ID4gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCJbJWRdVGFiJWQiLCBtVHlwZSwgdGFiT2Zmc2V0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgUEFDIHBhYyA9IGdldFBBQygpOwotICAgICAgICAgICAgaWYgKHBhYyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1QQUM6ICVzIiwgbVR5cGUsIHBhYy50b1N0cmluZygpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgU3R5bGVDb2RlIG0gPSBnZXRNaWRSb3coKTsKLSAgICAgICAgICAgIGlmIChtICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiWyVkXU1pZC1yb3c6ICVzIiwgbVR5cGUsIG0udG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChpc0Rpc3BsYXlhYmxlQ2hhcigpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1EaXNwbGF5YWJsZTogJXMgKCUwMnggJTAyeCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgbVR5cGUsIGdldERpc3BsYXlUZXh0KCksIG1EYXRhMSwgbURhdGEyKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlslZF1JbnZhbGlkOiAlMDJ4ICUwMngiLCBtVHlwZSwgbURhdGExLCBtRGF0YTIpOwotICAgICAgICB9Ci0gICAgfQotfQotCi0vKioKLSAqIFdpZGdldCBjYXBhYmxlIG9mIHJlbmRlcmluZyBDRUEtNjA4IGNsb3NlZCBjYXB0aW9ucy4KLSAqLwotY2xhc3MgQ2VhNjA4Q0NXaWRnZXQgZXh0ZW5kcyBDbG9zZWRDYXB0aW9uV2lkZ2V0IGltcGxlbWVudHMgQ2VhNjA4Q0NQYXJzZXIuRGlzcGxheUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBSZWN0IG1UZXh0Qm91bmRzID0gbmV3IFJlY3QoKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgbUR1bW15VGV4dCA9ICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0IjsKLQotICAgIHB1YmxpYyBDZWE2MDhDQ1dpZGdldChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQ2VhNjA4Q0NXaWRnZXQoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIENlYTYwOENDV2lkZ2V0KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGUpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGUsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBDZWE2MDhDQ1dpZGdldChDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwKLSAgICAgICAgICAgIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCBkZWZTdHlsZVJlcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENsb3NlZENhcHRpb25MYXlvdXQgY3JlYXRlQ2FwdGlvbkxheW91dChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDQ0xheW91dChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRpc3BsYXlDaGFuZ2VkKFNwYW5uYWJsZVN0cmluZ0J1aWxkZXJbXSBzdHlsZWRUZXh0cykgewotICAgICAgICAoKENDTGF5b3V0KSBtQ2xvc2VkQ2FwdGlvbkxheW91dCkudXBkYXRlKHN0eWxlZFRleHRzKTsKLQotICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1MaXN0ZW5lci5vbkNoYW5nZWQodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2FwdGlvblN0eWxlIGdldENhcHRpb25TdHlsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1DYXB0aW9uU3R5bGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQ0NMaW5lQm94IGV4dGVuZHMgVGV4dFZpZXcgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBGT05UX1BBRERJTkdfUkFUSU8gPSAwLjc1ZjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRURHRV9PVVRMSU5FX1JBVElPID0gMC4xZjsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgRURHRV9TSEFET1dfUkFUSU8gPSAwLjA1ZjsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtT3V0bGluZVdpZHRoOwotICAgICAgICBwcml2YXRlIGZsb2F0IG1TaGFkb3dSYWRpdXM7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbVNoYWRvd09mZnNldDsKLQotICAgICAgICBwcml2YXRlIGludCBtVGV4dENvbG9yID0gQ29sb3IuV0hJVEU7Ci0gICAgICAgIHByaXZhdGUgaW50IG1CZ0NvbG9yID0gQ29sb3IuQkxBQ0s7Ci0gICAgICAgIHByaXZhdGUgaW50IG1FZGdlVHlwZSA9IENhcHRpb25TdHlsZS5FREdFX1RZUEVfTk9ORTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUVkZ2VDb2xvciA9IENvbG9yLlRSQU5TUEFSRU5UOwotCi0gICAgICAgIENDTGluZUJveChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICAgICAgc2V0R3Jhdml0eShHcmF2aXR5LkNFTlRFUik7Ci0gICAgICAgICAgICBzZXRCYWNrZ3JvdW5kQ29sb3IoQ29sb3IuVFJBTlNQQVJFTlQpOwotICAgICAgICAgICAgc2V0VGV4dENvbG9yKENvbG9yLldISVRFKTsKLSAgICAgICAgICAgIHNldFR5cGVmYWNlKFR5cGVmYWNlLk1PTk9TUEFDRSk7Ci0gICAgICAgICAgICBzZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLQotICAgICAgICAgICAgZmluYWwgUmVzb3VyY2VzIHJlcyA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKTsKLQotICAgICAgICAgICAgLy8gZ2V0IHRoZSBkZWZhdWx0ICh3aWxsIGJlIHVwZGF0ZWQgbGF0ZXIgZHVyaW5nIG1lYXN1cmUpCi0gICAgICAgICAgICBtT3V0bGluZVdpZHRoID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5kaW1lbi5zdWJ0aXRsZV9vdXRsaW5lX3dpZHRoKTsKLSAgICAgICAgICAgIG1TaGFkb3dSYWRpdXMgPSByZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgICAgICBjb20uYW5kcm9pZC5pbnRlcm5hbC5SLmRpbWVuLnN1YnRpdGxlX3NoYWRvd19yYWRpdXMpOwotICAgICAgICAgICAgbVNoYWRvd09mZnNldCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgICAgIGNvbS5hbmRyb2lkLmludGVybmFsLlIuZGltZW4uc3VidGl0bGVfc2hhZG93X29mZnNldCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNldENhcHRpb25TdHlsZShDYXB0aW9uU3R5bGUgY2FwdGlvblN0eWxlKSB7Ci0gICAgICAgICAgICBtVGV4dENvbG9yID0gY2FwdGlvblN0eWxlLmZvcmVncm91bmRDb2xvcjsKLSAgICAgICAgICAgIG1CZ0NvbG9yID0gY2FwdGlvblN0eWxlLmJhY2tncm91bmRDb2xvcjsKLSAgICAgICAgICAgIG1FZGdlVHlwZSA9IGNhcHRpb25TdHlsZS5lZGdlVHlwZTsKLSAgICAgICAgICAgIG1FZGdlQ29sb3IgPSBjYXB0aW9uU3R5bGUuZWRnZUNvbG9yOwotCi0gICAgICAgICAgICBzZXRUZXh0Q29sb3IobVRleHRDb2xvcik7Ci0gICAgICAgICAgICBpZiAobUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfRFJPUF9TSEFET1cpIHsKLSAgICAgICAgICAgICAgICBzZXRTaGFkb3dMYXllcihtU2hhZG93UmFkaXVzLCBtU2hhZG93T2Zmc2V0LCBtU2hhZG93T2Zmc2V0LCBtRWRnZUNvbG9yKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0U2hhZG93TGF5ZXIoMCwgMCwgMCwgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgICAgIGZsb2F0IGZvbnRTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZShoZWlnaHRNZWFzdXJlU3BlYykgKiBGT05UX1BBRERJTkdfUkFUSU87Ci0gICAgICAgICAgICBzZXRUZXh0U2l6ZShUeXBlZFZhbHVlLkNPTVBMRVhfVU5JVF9QWCwgZm9udFNpemUpOwotCi0gICAgICAgICAgICBtT3V0bGluZVdpZHRoID0gRURHRV9PVVRMSU5FX1JBVElPICogZm9udFNpemUgKyAxLjBmOwotICAgICAgICAgICAgbVNoYWRvd1JhZGl1cyA9IEVER0VfU0hBRE9XX1JBVElPICogZm9udFNpemUgKyAxLjBmOzsKLSAgICAgICAgICAgIG1TaGFkb3dPZmZzZXQgPSBtU2hhZG93UmFkaXVzOwotCi0gICAgICAgICAgICAvLyBzZXQgZm9udCBzY2FsZSBpbiB0aGUgWCBkaXJlY3Rpb24gdG8gbWF0Y2ggdGhlIHJlcXVpcmVkIHdpZHRoCi0gICAgICAgICAgICBzZXRTY2FsZVgoMS4wZik7Ci0gICAgICAgICAgICBnZXRQYWludCgpLmdldFRleHRCb3VuZHMobUR1bW15VGV4dCwgMCwgbUR1bW15VGV4dC5sZW5ndGgoKSwgbVRleHRCb3VuZHMpOwotICAgICAgICAgICAgZmxvYXQgYWN0dWFsVGV4dFdpZHRoID0gbVRleHRCb3VuZHMud2lkdGgoKTsKLSAgICAgICAgICAgIGZsb2F0IHJlcXVpcmVkVGV4dFdpZHRoID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKLSAgICAgICAgICAgIHNldFNjYWxlWChyZXF1aXJlZFRleHRXaWR0aCAvIGFjdHVhbFRleHRXaWR0aCk7Ci0KLSAgICAgICAgICAgIHN1cGVyLm9uTWVhc3VyZSh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgb25EcmF3KENhbnZhcyBjKSB7Ci0gICAgICAgICAgICBpZiAobUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfVU5TUEVDSUZJRUQKLSAgICAgICAgICAgICAgICAgICAgfHwgbUVkZ2VUeXBlID09IENhcHRpb25TdHlsZS5FREdFX1RZUEVfTk9ORQotICAgICAgICAgICAgICAgICAgICB8fCBtRWRnZVR5cGUgPT0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9EUk9QX1NIQURPVykgewotICAgICAgICAgICAgICAgIC8vIHRoZXNlIGVkZ2Ugc3R5bGVzIGRvbid0IHJlcXVpcmUgYSBzZWNvbmQgcGFzcwotICAgICAgICAgICAgICAgIHN1cGVyLm9uRHJhdyhjKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtRWRnZVR5cGUgPT0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9PVVRMSU5FKSB7Ci0gICAgICAgICAgICAgICAgZHJhd0VkZ2VPdXRsaW5lKGMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBSYWlzZWQgb3IgZGVwcmVzc2VkCi0gICAgICAgICAgICAgICAgZHJhd0VkZ2VSYWlzZWRPckRlcHJlc3NlZChjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBkcmF3RWRnZU91dGxpbmUoQ2FudmFzIGMpIHsKLSAgICAgICAgICAgIFRleHRQYWludCB0ZXh0UGFpbnQgPSBnZXRQYWludCgpOwotCi0gICAgICAgICAgICBQYWludC5TdHlsZSBwcmV2aW91c1N0eWxlID0gdGV4dFBhaW50LmdldFN0eWxlKCk7Ci0gICAgICAgICAgICBQYWludC5Kb2luIHByZXZpb3VzSm9pbiA9IHRleHRQYWludC5nZXRTdHJva2VKb2luKCk7Ci0gICAgICAgICAgICBmbG9hdCBwcmV2aW91c1dpZHRoID0gdGV4dFBhaW50LmdldFN0cm9rZVdpZHRoKCk7Ci0KLSAgICAgICAgICAgIHNldFRleHRDb2xvcihtRWRnZUNvbG9yKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5GSUxMX0FORF9TVFJPS0UpOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0cm9rZUpvaW4oUGFpbnQuSm9pbi5ST1VORCk7Ci0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3Ryb2tlV2lkdGgobU91dGxpbmVXaWR0aCk7Ci0KLSAgICAgICAgICAgIC8vIERyYXcgb3V0bGluZSBhbmQgYmFja2dyb3VuZCBvbmx5LgotICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOwotCi0gICAgICAgICAgICAvLyBSZXN0b3JlIG9yaWdpbmFsIHNldHRpbmdzLgotICAgICAgICAgICAgc2V0VGV4dENvbG9yKG1UZXh0Q29sb3IpOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0eWxlKHByZXZpb3VzU3R5bGUpOwotICAgICAgICAgICAgdGV4dFBhaW50LnNldFN0cm9rZUpvaW4ocHJldmlvdXNKb2luKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHJva2VXaWR0aChwcmV2aW91c1dpZHRoKTsKLQotICAgICAgICAgICAgLy8gUmVtb3ZlIHRoZSBiYWNrZ3JvdW5kLgotICAgICAgICAgICAgc2V0QmFja2dyb3VuZFNwYW5zKENvbG9yLlRSQU5TUEFSRU5UKTsKLSAgICAgICAgICAgIC8vIERyYXcgZm9yZWdyb3VuZCBvbmx5LgotICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOwotICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgYmFja2dyb3VuZC4KLSAgICAgICAgICAgIHNldEJhY2tncm91bmRTcGFucyhtQmdDb2xvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgZHJhd0VkZ2VSYWlzZWRPckRlcHJlc3NlZChDYW52YXMgYykgewotICAgICAgICAgICAgVGV4dFBhaW50IHRleHRQYWludCA9IGdldFBhaW50KCk7Ci0KLSAgICAgICAgICAgIFBhaW50LlN0eWxlIHByZXZpb3VzU3R5bGUgPSB0ZXh0UGFpbnQuZ2V0U3R5bGUoKTsKLSAgICAgICAgICAgIHRleHRQYWludC5zZXRTdHlsZShQYWludC5TdHlsZS5GSUxMKTsKLQotICAgICAgICAgICAgZmluYWwgYm9vbGVhbiByYWlzZWQgPSBtRWRnZVR5cGUgPT0gQ2FwdGlvblN0eWxlLkVER0VfVFlQRV9SQUlTRUQ7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY29sb3JVcCA9IHJhaXNlZCA/IENvbG9yLldISVRFIDogbUVkZ2VDb2xvcjsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb2xvckRvd24gPSByYWlzZWQgPyBtRWRnZUNvbG9yIDogQ29sb3IuV0hJVEU7Ci0gICAgICAgICAgICBmaW5hbCBmbG9hdCBvZmZzZXQgPSBtU2hhZG93UmFkaXVzIC8gMmY7Ci0KLSAgICAgICAgICAgIC8vIERyYXcgYmFja2dyb3VuZCBhbmQgdGV4dCB3aXRoIHNoYWRvdyB1cAotICAgICAgICAgICAgc2V0U2hhZG93TGF5ZXIobVNoYWRvd1JhZGl1cywgLW9mZnNldCwgLW9mZnNldCwgY29sb3JVcCk7Ci0gICAgICAgICAgICBzdXBlci5vbkRyYXcoYyk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSB0aGUgYmFja2dyb3VuZC4KLSAgICAgICAgICAgIHNldEJhY2tncm91bmRTcGFucyhDb2xvci5UUkFOU1BBUkVOVCk7Ci0KLSAgICAgICAgICAgIC8vIERyYXcgdGV4dCB3aXRoIHNoYWRvdyBkb3duCi0gICAgICAgICAgICBzZXRTaGFkb3dMYXllcihtU2hhZG93UmFkaXVzLCArb2Zmc2V0LCArb2Zmc2V0LCBjb2xvckRvd24pOwotICAgICAgICAgICAgc3VwZXIub25EcmF3KGMpOwotCi0gICAgICAgICAgICAvLyBSZXN0b3JlIHNldHRpbmdzCi0gICAgICAgICAgICB0ZXh0UGFpbnQuc2V0U3R5bGUocHJldmlvdXNTdHlsZSk7Ci0KLSAgICAgICAgICAgIC8vIFJlc3RvcmUgdGhlIGJhY2tncm91bmQuCi0gICAgICAgICAgICBzZXRCYWNrZ3JvdW5kU3BhbnMobUJnQ29sb3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldEJhY2tncm91bmRTcGFucyhpbnQgY29sb3IpIHsKLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSB0ZXh0ID0gZ2V0VGV4dCgpOwotICAgICAgICAgICAgaWYgKHRleHQgaW5zdGFuY2VvZiBTcGFubmFibGUpIHsKLSAgICAgICAgICAgICAgICBTcGFubmFibGUgc3Bhbm5hYmxlID0gKFNwYW5uYWJsZSkgdGV4dDsKLSAgICAgICAgICAgICAgICBDZWE2MDhDQ1BhcnNlci5NdXRhYmxlQmFja2dyb3VuZENvbG9yU3BhbltdIGJnU3BhbnMgPSBzcGFubmFibGUuZ2V0U3BhbnMoCi0gICAgICAgICAgICAgICAgICAgICAgICAwLCBzcGFubmFibGUubGVuZ3RoKCksIENlYTYwOENDUGFyc2VyLk11dGFibGVCYWNrZ3JvdW5kQ29sb3JTcGFuLmNsYXNzKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJnU3BhbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgYmdTcGFuc1tpXS5zZXRCYWNrZ3JvdW5kQ29sb3IoY29sb3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIENDTGF5b3V0IGV4dGVuZHMgTGluZWFyTGF5b3V0IGltcGxlbWVudHMgQ2xvc2VkQ2FwdGlvbkxheW91dCB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNQVhfUk9XUyA9IENlYTYwOENDUGFyc2VyLk1BWF9ST1dTOwotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBTQUZFX0FSRUFfUkFUSU8gPSAwLjlmOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgQ0NMaW5lQm94W10gbUxpbmVCb3hlcyA9IG5ldyBDQ0xpbmVCb3hbTUFYX1JPV1NdOwotCi0gICAgICAgIENDTGF5b3V0KENvbnRleHQgY29udGV4dCkgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBzZXRHcmF2aXR5KEdyYXZpdHkuU1RBUlQpOwotICAgICAgICAgICAgc2V0T3JpZW50YXRpb24oTGluZWFyTGF5b3V0LlZFUlRJQ0FMKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTUFYX1JPV1M7IGkrKykgewotICAgICAgICAgICAgICAgIG1MaW5lQm94ZXNbaV0gPSBuZXcgQ0NMaW5lQm94KGdldENvbnRleHQoKSk7Ci0gICAgICAgICAgICAgICAgYWRkVmlldyhtTGluZUJveGVzW2ldLCBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5ULCBMYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRDYXB0aW9uU3R5bGUoQ2FwdGlvblN0eWxlIGNhcHRpb25TdHlsZSkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5zZXRDYXB0aW9uU3R5bGUoY2FwdGlvblN0eWxlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRGb250U2NhbGUoZmxvYXQgZm9udFNjYWxlKSB7Ci0gICAgICAgICAgICAvLyBJZ25vcmVzIHRoZSBmb250IHNjYWxlIGNoYW5nZXMgb2YgdGhlIHN5c3RlbSB3aWRlIENDIHByZWZlcmVuY2UuCi0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHVwZGF0ZShTcGFubmFibGVTdHJpbmdCdWlsZGVyW10gdGV4dEJ1ZmZlcikgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHRleHRCdWZmZXJbaV0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLnNldFRleHQodGV4dEJ1ZmZlcltpXSwgVGV4dFZpZXcuQnVmZmVyVHlwZS5TUEFOTkFCTEUpOwotICAgICAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLnNldFZpc2liaWxpdHkoVmlldy5JTlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICAgICAgc3VwZXIub25NZWFzdXJlKHdpZHRoTWVhc3VyZVNwZWMsIGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICAgICAgaW50IHNhZmVXaWR0aCA9IGdldE1lYXN1cmVkV2lkdGgoKTsKLSAgICAgICAgICAgIGludCBzYWZlSGVpZ2h0ID0gZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLQotICAgICAgICAgICAgLy8gQ0VBLTYwOCBhc3N1bWVzIDQ6MyB2aWRlbwotICAgICAgICAgICAgaWYgKHNhZmVXaWR0aCAqIDMgPj0gc2FmZUhlaWdodCAqIDQpIHsKLSAgICAgICAgICAgICAgICBzYWZlV2lkdGggPSBzYWZlSGVpZ2h0ICogNCAvIDM7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHNhZmVIZWlnaHQgPSBzYWZlV2lkdGggKiAzIC8gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNhZmVXaWR0aCAqPSBTQUZFX0FSRUFfUkFUSU87Ci0gICAgICAgICAgICBzYWZlSGVpZ2h0ICo9IFNBRkVfQVJFQV9SQVRJTzsKLQotICAgICAgICAgICAgaW50IGxpbmVIZWlnaHQgPSBzYWZlSGVpZ2h0IC8gTUFYX1JPV1M7Ci0gICAgICAgICAgICBpbnQgbGluZUhlaWdodE1lYXN1cmVTcGVjID0gTWVhc3VyZVNwZWMubWFrZU1lYXN1cmVTcGVjKAotICAgICAgICAgICAgICAgICAgICBsaW5lSGVpZ2h0LCBNZWFzdXJlU3BlYy5FWEFDVExZKTsKLSAgICAgICAgICAgIGludCBsaW5lV2lkdGhNZWFzdXJlU3BlYyA9IE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygKLSAgICAgICAgICAgICAgICAgICAgc2FmZVdpZHRoLCBNZWFzdXJlU3BlYy5FWEFDVExZKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBNQVhfUk9XUzsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUxpbmVCb3hlc1tpXS5tZWFzdXJlKGxpbmVXaWR0aE1lYXN1cmVTcGVjLCBsaW5lSGVpZ2h0TWVhc3VyZVNwZWMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uTGF5b3V0KGJvb2xlYW4gY2hhbmdlZCwgaW50IGwsIGludCB0LCBpbnQgciwgaW50IGIpIHsKLSAgICAgICAgICAgIC8vIHNhZmUgY2FwdGlvbiBhcmVhCi0gICAgICAgICAgICBpbnQgdmlld1BvcnRXaWR0aCA9IHIgLSBsOwotICAgICAgICAgICAgaW50IHZpZXdQb3J0SGVpZ2h0ID0gYiAtIHQ7Ci0gICAgICAgICAgICBpbnQgc2FmZVdpZHRoLCBzYWZlSGVpZ2h0OwotICAgICAgICAgICAgLy8gQ0VBLTYwOCBhc3N1bWVzIDQ6MyB2aWRlbwotICAgICAgICAgICAgaWYgKHZpZXdQb3J0V2lkdGggKiAzID49IHZpZXdQb3J0SGVpZ2h0ICogNCkgewotICAgICAgICAgICAgICAgIHNhZmVXaWR0aCA9IHZpZXdQb3J0SGVpZ2h0ICogNCAvIDM7Ci0gICAgICAgICAgICAgICAgc2FmZUhlaWdodCA9IHZpZXdQb3J0SGVpZ2h0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzYWZlV2lkdGggPSB2aWV3UG9ydFdpZHRoOwotICAgICAgICAgICAgICAgIHNhZmVIZWlnaHQgPSB2aWV3UG9ydFdpZHRoICogMyAvIDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYWZlV2lkdGggKj0gU0FGRV9BUkVBX1JBVElPOwotICAgICAgICAgICAgc2FmZUhlaWdodCAqPSBTQUZFX0FSRUFfUkFUSU87Ci0gICAgICAgICAgICBpbnQgbGVmdCA9ICh2aWV3UG9ydFdpZHRoIC0gc2FmZVdpZHRoKSAvIDI7Ci0gICAgICAgICAgICBpbnQgdG9wID0gKHZpZXdQb3J0SGVpZ2h0IC0gc2FmZUhlaWdodCkgLyAyOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IE1BWF9ST1dTOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtTGluZUJveGVzW2ldLmxheW91dCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQsCi0gICAgICAgICAgICAgICAgICAgICAgICB0b3AgKyBzYWZlSGVpZ2h0ICogaSAvIE1BWF9ST1dTLAotICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCArIHNhZmVXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRvcCArIHNhZmVIZWlnaHQgKiAoaSArIDEpIC8gTUFYX1JPV1MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9NZWRpYVRpbWVQcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9NZWRpYVRpbWVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjM2ZDdmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvTWVkaWFUaW1lUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGU7Ci0KLS8vIE5vdGU6IFRoaXMgaXMganVzdCBjb3BpZWQgZnJvbSBhbmRyb2lkLm1lZGlhLk1lZGlhVGltZVByb3ZpZGVyLgotcHVibGljIGludGVyZmFjZSBNZWRpYVRpbWVQcm92aWRlciB7Ci0gICAgLy8gd2UgZG8gbm90IGFsbG93IG5lZ2F0aXZlIG1lZGlhIHRpbWUKLSAgICAvKioKLSAgICAgKiBQcmVzZW50YXRpb24gdGltZSB2YWx1ZSBpZiBubyB0aW1lZCBldmVudCBub3RpZmljYXRpb24gaXMgcmVxdWVzdGVkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgbG9uZyBOT19USU1FID0gLTE7Ci0KLSAgICAvKioKLSAgICAgKiBDYW5jZWxzIGFsbCBwcmV2aW91cyBub3RpZmljYXRpb24gcmVxdWVzdCBmcm9tIHRoaXMgbGlzdGVuZXIgaWYgYW55LiAgSXQKLSAgICAgKiByZWdpc3RlcnMgdGhlIGxpc3RlbmVyIHRvIGdldCBzZWVrIGFuZCBzdG9wIG5vdGlmaWNhdGlvbnMuICBJZiB0aW1lVXMgaXMKLSAgICAgKiBub3QgbmVnYXRpdmUsIGl0IGFsc28gcmVnaXN0ZXJzIHRoZSBsaXN0ZW5lciBmb3IgYSB0aW1lZCBldmVudAotICAgICAqIG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBwcmVzZW50YXRpb24gdGltZSByZWFjaGVzIChiZWNvbWVzIGdyZWF0ZXIpIHRoYW4KLSAgICAgKiB0aGUgdmFsdWUgc3BlY2lmaWVkLiAgVGhpcyBoYXBwZW5zIGltbWVkaWF0ZWx5IGlmIHRoZSBjdXJyZW50IG1lZGlhIHRpbWUKLSAgICAgKiBpcyBsYXJnZXIgdGhhbiBvciBlcXVhbCB0byB0aW1lVXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdGltZVVzIHByZXNlbnRhdGlvbiB0aW1lIHRvIGdldCB0aW1lZCBldmVudCBjYWxsYmFjayBhdCAob3IKLSAgICAgKiAgICAgICAgICAgICAgIHtAbGluayAjTk9fVElNRX0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbm90aWZ5QXQobG9uZyB0aW1lVXMsIE9uTWVkaWFUaW1lTGlzdGVuZXIgbGlzdGVuZXIpOwotCi0gICAgLyoqCi0gICAgICogQ2FuY2VscyBhbGwgcHJldmlvdXMgbm90aWZpY2F0aW9uIHJlcXVlc3QgZnJvbSB0aGlzIGxpc3RlbmVyIGlmIGFueS4gIEl0Ci0gICAgICogcmVnaXN0ZXJzIHRoZSBsaXN0ZW5lciB0byBnZXQgc2VlayBhbmQgc3RvcCBub3RpZmljYXRpb25zLiAgSWYgdGhlIG1lZGlhCi0gICAgICogaXMgc3RvcHBlZCwgdGhlIGxpc3RlbmVyIHdpbGwgaW1tZWRpYXRlbHkgcmVjZWl2ZSBhIHN0b3Agbm90aWZpY2F0aW9uLgotICAgICAqIE90aGVyd2lzZSwgaXQgd2lsbCByZWNlaXZlIGEgdGltZWQgZXZlbnQgbm90aWZpY2F0b24uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2NoZWR1bGVVcGRhdGUoT25NZWRpYVRpbWVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBDYW5jZWxzIGFsbCBwcmV2aW91cyBub3RpZmljYXRpb24gcmVxdWVzdCBmcm9tIHRoaXMgbGlzdGVuZXIgaWYgYW55LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGNhbmNlbE5vdGlmaWNhdGlvbnMoT25NZWRpYVRpbWVMaXN0ZW5lciBsaXN0ZW5lcik7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGN1cnJlbnQgcHJlc2VudGF0aW9uIHRpbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJlY2lzZSAgIFdoZXRoZXIgZ2V0dGluZyBhIHByZWNpc2UgdGltZSBpcyBpbXBvcnRhbnQuIFRoaXMgaXMKLSAgICAgKiAgICAgICAgICAgICAgICAgIG1vcmUgY29zdGx5LgotICAgICAqIEBwYXJhbSBtb25vdG9uaWMgV2hldGhlciByZXR1cm5lZCB0aW1lIHNob3VsZCBiZSBtb25vdG9uaWM6IHRoYXQgaXMsCi0gICAgICogICAgICAgICAgICAgICAgICBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGxhc3QgcmV0dXJuZWQgdGltZS4gIERvbid0Ci0gICAgICogICAgICAgICAgICAgICAgICBhbHdheXMgc2V0IHRoaXMgdG8gdHJ1ZS4gIEUuZy4gdGhpcyBoYXMgdW5kZXNpcmVkCi0gICAgICogICAgICAgICAgICAgICAgICBjb25zZXF1ZW5jZXMgaWYgdGhlIG1lZGlhIGlzIHNlZWtlZCBiZXR3ZWVuIGNhbGxzLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZSBtZWRpYSBpcyBub3QgaW5pdGlhbGl6ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRDdXJyZW50VGltZVVzKGJvb2xlYW4gcHJlY2lzZSwgYm9vbGVhbiBtb25vdG9uaWMpCi0gICAgICAgICAgICB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uOwotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgT25NZWRpYVRpbWVMaXN0ZW5lciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgcmVnaXN0ZXJlZCB0aW1lIHdhcyByZWFjaGVkIG5hdHVyYWxseS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHRpbWVVcyBjdXJyZW50IG1lZGlhIHRpbWUKLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25UaW1lZEV2ZW50KGxvbmcgdGltZVVzKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIG1lZGlhIHRpbWUgY2hhbmdlZCBkdWUgdG8gc2Vla2luZy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHRpbWVVcyBjdXJyZW50IG1lZGlhIHRpbWUKLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25TZWVrKGxvbmcgdGltZVVzKTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHBsYXliYWNrIHN0b3BwZWQuICBUaGlzIGlzIG5vdCBjYWxsZWQgb24gcGF1c2UsIG9ubHkKLSAgICAgICAgICogb24gZnVsbCBzdG9wLCBhdCB3aGljaCBwb2ludCB0aGVyZSBpcyBubyBmdXJ0aGVyIGN1cnJlbnQgbWVkaWEgdGltZS4KLSAgICAgICAgICovCi0gICAgICAgIHZvaWQgb25TdG9wKCk7Ci0gICAgfQotfQotCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL1N1YnRpdGxlQ29udHJvbGxlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZUNvbnRyb2xsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRkNTVkNy4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3N1YnRpdGxlL1N1YnRpdGxlQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhRm9ybWF0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyLlRyYWNrSW5mbzsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkNhcHRpb25pbmdNYW5hZ2VyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVUcmFjay5SZW5kZXJpbmdXaWRnZXQ7Ci0KLS8vIE5vdGU6IFRoaXMgaXMgZm9ya2VkIGZyb20gYW5kcm9pZC5tZWRpYS5TdWJ0aXRsZUNvbnRyb2xsZXIgc2luY2UgUAotLyoqCi0gKiBUaGUgc3VidGl0bGUgY29udHJvbGxlciBwcm92aWRlcyB0aGUgYXJjaGl0ZWN0dXJlIHRvIGRpc3BsYXkgc3VidGl0bGVzIGZvciBhCi0gKiBtZWRpYSBzb3VyY2UuICBJdCBhbGxvd3Mgc3BlY2lmeWluZyB3aGljaCB0cmFja3MgdG8gZGlzcGxheSwgb24gd2hpY2ggYW5jaG9yCi0gKiB0byBkaXNwbGF5IHRoZW0sIGFuZCBhbHNvIGFsbG93cyBhZGRpbmcgZXh0ZXJuYWwsIG91dC1vZi1iYW5kIHN1YnRpdGxlIHRyYWNrcy4KLSAqLwotcHVibGljIGNsYXNzIFN1YnRpdGxlQ29udHJvbGxlciB7Ci0gICAgcHJpdmF0ZSBNZWRpYVRpbWVQcm92aWRlciBtVGltZVByb3ZpZGVyOwotICAgIHByaXZhdGUgVmVjdG9yPFJlbmRlcmVyPiBtUmVuZGVyZXJzOwotICAgIHByaXZhdGUgVmVjdG9yPFN1YnRpdGxlVHJhY2s+IG1UcmFja3M7Ci0gICAgcHJpdmF0ZSBTdWJ0aXRsZVRyYWNrIG1TZWxlY3RlZFRyYWNrOwotICAgIHByaXZhdGUgYm9vbGVhbiBtU2hvd2luZzsKLSAgICBwcml2YXRlIENhcHRpb25pbmdNYW5hZ2VyIG1DYXB0aW9uaW5nTWFuYWdlcjsKLSAgICBwcml2YXRlIEhhbmRsZXIgbUhhbmRsZXI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9TSE9XID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9ISURFID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgV0hBVF9TRUxFQ1RfVFJBQ0sgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSEFUX1NFTEVDVF9ERUZBVUxUX1RSQUNLID0gNDsKLQotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlci5DYWxsYmFjayBtQ2FsbGJhY2sgPSBuZXcgSGFuZGxlci5DYWxsYmFjaygpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgIGNhc2UgV0hBVF9TSE9XOgotICAgICAgICAgICAgICAgIGRvU2hvdygpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgY2FzZSBXSEFUX0hJREU6Ci0gICAgICAgICAgICAgICAgZG9IaWRlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlIFdIQVRfU0VMRUNUX1RSQUNLOgotICAgICAgICAgICAgICAgIGRvU2VsZWN0VHJhY2soKFN1YnRpdGxlVHJhY2spbXNnLm9iaik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICBjYXNlIFdIQVRfU0VMRUNUX0RFRkFVTFRfVFJBQ0s6Ci0gICAgICAgICAgICAgICAgZG9TZWxlY3REZWZhdWx0VHJhY2soKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgQ2FwdGlvbmluZ01hbmFnZXIuQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyIG1DYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIgPQotICAgICAgICBuZXcgQ2FwdGlvbmluZ01hbmFnZXIuQ2FwdGlvbmluZ0NoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVuYWJsZWRDaGFuZ2VkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICAgICAgICAgIHNlbGVjdERlZmF1bHRUcmFjaygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uTG9jYWxlQ2hhbmdlZChMb2NhbGUgbG9jYWxlKSB7Ci0gICAgICAgICAgICAgICAgc2VsZWN0RGVmYXVsdFRyYWNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVDb250cm9sbGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwsIG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBzdWJ0aXRsZSBjb250cm9sbGVyIGZvciBhIG1lZGlhIHBsYXliYWNrIG9iamVjdCB0aGF0IGltcGxlbWVudHMKLSAgICAgKiB0aGUgTWVkaWFUaW1lUHJvdmlkZXIgaW50ZXJmYWNlLgotICAgICAqCi0gICAgICogQHBhcmFtIHRpbWVQcm92aWRlcgotICAgICAqLwotICAgIHB1YmxpYyBTdWJ0aXRsZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICBNZWRpYVRpbWVQcm92aWRlciB0aW1lUHJvdmlkZXIsCi0gICAgICAgICAgICBMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtVGltZVByb3ZpZGVyID0gdGltZVByb3ZpZGVyOwotICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLQotICAgICAgICBtUmVuZGVyZXJzID0gbmV3IFZlY3RvcjxSZW5kZXJlcj4oKTsKLSAgICAgICAgbVNob3dpbmcgPSBmYWxzZTsKLSAgICAgICAgbVRyYWNrcyA9IG5ldyBWZWN0b3I8U3VidGl0bGVUcmFjaz4oKTsKLSAgICAgICAgbUNhcHRpb25pbmdNYW5hZ2VyID0KLSAgICAgICAgICAgIChDYXB0aW9uaW5nTWFuYWdlciljb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5DQVBUSU9OSU5HX1NFUlZJQ0UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGZpbmFsaXplKCkgdGhyb3dzIFRocm93YWJsZSB7Ci0gICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlci5yZW1vdmVDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgbUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgYXZhaWxhYmxlIHN1YnRpdGxlIHRyYWNrcyBmb3IgdGhpcyBtZWRpYS4gVGhlc2UgaW5jbHVkZQotICAgICAqIHRoZSB0cmFja3MgZm91bmQgYnkge0BsaW5rIE1lZGlhUGxheWVyfSBhcyB3ZWxsIGFzIGFueSB0cmFja3MgYWRkZWQKLSAgICAgKiBtYW51YWxseSB2aWEge0BsaW5rICNhZGRUcmFja30uCi0gICAgICovCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2tbXSBnZXRUcmFja3MoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtVHJhY2tzKSB7Ci0gICAgICAgICAgICBTdWJ0aXRsZVRyYWNrW10gdHJhY2tzID0gbmV3IFN1YnRpdGxlVHJhY2tbbVRyYWNrcy5zaXplKCldOwotICAgICAgICAgICAgbVRyYWNrcy50b0FycmF5KHRyYWNrcyk7Ci0gICAgICAgICAgICByZXR1cm4gdHJhY2tzOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHN1YnRpdGxlIHRyYWNrCi0gICAgICovCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2sgZ2V0U2VsZWN0ZWRUcmFjaygpIHsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RlZFRyYWNrOwotICAgIH0KLQotICAgIHByaXZhdGUgUmVuZGVyaW5nV2lkZ2V0IGdldFJlbmRlcmluZ1dpZGdldCgpIHsKLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtU2VsZWN0ZWRUcmFjay5nZXRSZW5kZXJpbmdXaWRnZXQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWxlY3RzIGEgc3VidGl0bGUgdHJhY2suICBBcyBhIHJlc3VsdCwgdGhpcyB0cmFjayB3aWxsIHJlY2VpdmUKLSAgICAgKiBpbi1iYW5kIGRhdGEgZnJvbSB0aGUge0BsaW5rIE1lZGlhUGxheWVyfS4gIEhvd2V2ZXIsIHRoaXMgZG9lcwotICAgICAqIG5vdCBjaGFuZ2UgdGhlIHN1YnRpdGxlIHZpc2liaWxpdHkuCi0gICAgICoKLSAgICAgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIChVSSkgdGhyZWFkLiB7QHNlZSAjQW5jaG9yLmdldFN1YnRpdGxlTG9vcGVyfQotICAgICAqCi0gICAgICogQHBhcmFtIHRyYWNrIFRoZSBzdWJ0aXRsZSB0cmFjayB0byBzZWxlY3QuICBUaGlzIG11c3QgYmUgb25lIG9mIHRoZQotICAgICAqICAgICAgICAgICAgICB0cmFja3MgaW4ge0BsaW5rICNnZXRUcmFja3N9LgotICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgdHJhY2sgd2FzIHN1Y2Nlc3NmdWxseSBzZWxlY3RlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBzZWxlY3RUcmFjayhTdWJ0aXRsZVRyYWNrIHRyYWNrKSB7Ci0gICAgICAgIGlmICh0cmFjayAhPSBudWxsICYmICFtVHJhY2tzLmNvbnRhaW5zKHRyYWNrKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvY2Vzc09uQW5jaG9yKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoV0hBVF9TRUxFQ1RfVFJBQ0ssIHRyYWNrKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1NlbGVjdFRyYWNrKFN1YnRpdGxlVHJhY2sgdHJhY2spIHsKLSAgICAgICAgbVRyYWNrSXNFeHBsaWNpdCA9IHRydWU7Ci0gICAgICAgIGlmIChtU2VsZWN0ZWRUcmFjayA9PSB0cmFjaykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLmhpZGUoKTsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNldFRpbWVQcm92aWRlcihudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1TZWxlY3RlZFRyYWNrID0gdHJhY2s7Ci0gICAgICAgIGlmIChtQW5jaG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1BbmNob3Iuc2V0U3VidGl0bGVXaWRnZXQoZ2V0UmVuZGVyaW5nV2lkZ2V0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNldFRpbWVQcm92aWRlcihtVGltZVByb3ZpZGVyKTsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNob3coKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbUxpc3RlbmVyLm9uU3VidGl0bGVUcmFja1NlbGVjdGVkKHRyYWNrKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gdGhlIGRlZmF1bHQgc3VidGl0bGUgdHJhY2sgYmFzZWQgb24gc3lzdGVtIHByZWZlcmVuY2VzLCBvciBudWxsLAotICAgICAqIGlmIG5vIHN1Y2ggdHJhY2sgZXhpc3RzIGluIHRoaXMgbWFuYWdlci4KLSAgICAgKgotICAgICAqIFN1cHBvcnRzIEhMUy1mbGFnczogQVVUT1NFTEVDVCwgRk9SQ0VEICYgREVGQVVMVC4KLSAgICAgKgotICAgICAqIDEuIElmIGNhcHRpb25pbmcgaXMgZGlzYWJsZWQsIG9ubHkgY29uc2lkZXIgRk9SQ0VEIHRyYWNrcy4gT3RoZXJ3aXNlLAotICAgICAqIGNvbnNpZGVyIGFsbCB0cmFja3MsIGJ1dCBwcmVmZXIgbm9uLUZPUkNFRCBvbmVzLgotICAgICAqIDIuIElmIHVzZXIgc2VsZWN0ZWQgIkRlZmF1bHQiIGNhcHRpb24gbGFuZ3VhZ2U6Ci0gICAgICogICBhLiBJZiB0aGVyZSBpcyBhIGNvbnNpZGVyZWQgdHJhY2sgd2l0aCBERUZBVUxUPXllcywgcmV0dXJucyB0aGF0IHRyYWNrCi0gICAgICogICAgICAoZmF2b3IgdGhlIGZpcnN0IG9uZSBpbiB0aGUgY3VycmVudCBsYW5ndWFnZSBpZiB0aGVyZSBhcmUgbW9yZSB0aGFuCi0gICAgICogICAgICBvbmUgZGVmYXVsdCB0cmFja3MsIG9yIHRoZSBmaXJzdCBpbiBnZW5lcmFsIGlmIG5vbmUgb2YgdGhlbSBhcmUgaW4KLSAgICAgKiAgICAgIHRoZSBjdXJyZW50IGxhbmd1YWdlKS4KLSAgICAgKiAgIGIuIE90aGVyd2lzZSwgaWYgdGhlcmUgaXMgYSB0cmFjayB3aXRoIEFVVE9TRUxFQ1Q9eWVzIGluIHRoZSBjdXJyZW50Ci0gICAgICogICAgICBsYW5ndWFnZSwgcmV0dXJuIHRoYXQgb25lLgotICAgICAqICAgYy4gSWYgdGhlcmUgYXJlIG5vIGRlZmF1bHQgdHJhY2tzLCBhbmQgbm8gYXV0b3NlbGVjdGFibGUgdHJhY2tzIGluIHRoZQotICAgICAqICAgICAgY3VycmVudCBsYW5ndWFnZSwgcmV0dXJuIG51bGwuCi0gICAgICogMy4gSWYgdGhlcmUgaXMgYSB0cmFjayB3aXRoIHRoZSBjYXB0aW9uIGxhbmd1YWdlLCBzZWxlY3QgdGhhdCBvbmUuICBQcmVmZXIKLSAgICAgKiB0aGUgb25lIHdpdGggQVVUT1NFTEVDVD1uby4KLSAgICAgKgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgdGhlc2UgZmxhZ3MgYXJlIERFRkFVTFQ9bm8sIEFVVE9TRUxFQ1Q9eWVzCi0gICAgICogYW5kIEZPUkNFRD1uby4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3VidGl0bGVUcmFjayBnZXREZWZhdWx0VHJhY2soKSB7Ci0gICAgICAgIFN1YnRpdGxlVHJhY2sgYmVzdFRyYWNrID0gbnVsbDsKLSAgICAgICAgaW50IGJlc3RTY29yZSA9IC0xOwotCi0gICAgICAgIExvY2FsZSBzZWxlY3RlZExvY2FsZSA9IG1DYXB0aW9uaW5nTWFuYWdlci5nZXRMb2NhbGUoKTsKLSAgICAgICAgTG9jYWxlIGxvY2FsZSA9IHNlbGVjdGVkTG9jYWxlOwotICAgICAgICBpZiAobG9jYWxlID09IG51bGwpIHsKLSAgICAgICAgICAgIGxvY2FsZSA9IExvY2FsZS5nZXREZWZhdWx0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbGVhbiBzZWxlY3RGb3JjZWQgPSAhbUNhcHRpb25pbmdNYW5hZ2VyLmlzRW5hYmxlZCgpOwotCi0gICAgICAgIHN5bmNocm9uaXplZChtVHJhY2tzKSB7Ci0gICAgICAgICAgICBmb3IgKFN1YnRpdGxlVHJhY2sgdHJhY2s6IG1UcmFja3MpIHsKLSAgICAgICAgICAgICAgICBNZWRpYUZvcm1hdCBmb3JtYXQgPSB0cmFjay5nZXRGb3JtYXQoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbGFuZ3VhZ2UgPSBmb3JtYXQuZ2V0U3RyaW5nKE1lZGlhRm9ybWF0LktFWV9MQU5HVUFHRSk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBmb3JjZWQgPQotICAgICAgICAgICAgICAgICAgICBmb3JtYXQuZ2V0SW50ZWdlcihNZWRpYUZvcm1hdC5LRVlfSVNfRk9SQ0VEX1NVQlRJVExFLCAwKSAhPSAwOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gYXV0b3NlbGVjdCA9Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9JU19BVVRPU0VMRUNULCAxKSAhPSAwOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNfZGVmYXVsdCA9Ci0gICAgICAgICAgICAgICAgICAgIGZvcm1hdC5nZXRJbnRlZ2VyKE1lZGlhRm9ybWF0LktFWV9JU19ERUZBVUxULCAwKSAhPSAwOwotCi0gICAgICAgICAgICAgICAgYm9vbGVhbiBsYW5ndWFnZU1hdGNoZXMgPQotICAgICAgICAgICAgICAgICAgICAobG9jYWxlID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgbG9jYWxlLmdldExhbmd1YWdlKCkuZXF1YWxzKCIiKSB8fAotICAgICAgICAgICAgICAgICAgICBsb2NhbGUuZ2V0SVNPM0xhbmd1YWdlKCkuZXF1YWxzKGxhbmd1YWdlKSB8fAotICAgICAgICAgICAgICAgICAgICBsb2NhbGUuZ2V0TGFuZ3VhZ2UoKS5lcXVhbHMobGFuZ3VhZ2UpKTsKLSAgICAgICAgICAgICAgICAvLyBpc19kZWZhdWx0IGlzIG1lYW5pbmdsZXNzIHVubGVzcyBjYXB0aW9uIGxhbmd1YWdlIGlzICdkZWZhdWx0JwotICAgICAgICAgICAgICAgIGludCBzY29yZSA9IChmb3JjZWQgPyAwIDogOCkgKwotICAgICAgICAgICAgICAgICAgICAoKChzZWxlY3RlZExvY2FsZSA9PSBudWxsKSAmJiBpc19kZWZhdWx0KSA/IDQgOiAwKSArCi0gICAgICAgICAgICAgICAgICAgIChhdXRvc2VsZWN0ID8gMCA6IDIpICsgKGxhbmd1YWdlTWF0Y2hlcyA/IDEgOiAwKTsKLQotICAgICAgICAgICAgICAgIGlmIChzZWxlY3RGb3JjZWQgJiYgIWZvcmNlZCkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyB3ZSB0cmVhdCBudWxsIGxvY2FsZS9sYW5ndWFnZSBhcyBtYXRjaGluZyBhbnkgbGFuZ3VhZ2UKLSAgICAgICAgICAgICAgICBpZiAoKHNlbGVjdGVkTG9jYWxlID09IG51bGwgJiYgaXNfZGVmYXVsdCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKGxhbmd1YWdlTWF0Y2hlcyAmJgotICAgICAgICAgICAgICAgICAgICAgKGF1dG9zZWxlY3QgfHwgZm9yY2VkIHx8IHNlbGVjdGVkTG9jYWxlICE9IG51bGwpKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2NvcmUgPiBiZXN0U2NvcmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RTY29yZSA9IHNjb3JlOwotICAgICAgICAgICAgICAgICAgICAgICAgYmVzdFRyYWNrID0gdHJhY2s7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGJlc3RUcmFjazsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbVRyYWNrSXNFeHBsaWNpdCA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSBmYWxzZTsKLQotICAgIC8qKiBzaG91bGQgYmUgY2FsbGVkIGZyb20gYW5jaG9yIHRocmVhZCAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdERlZmF1bHRUcmFjaygpIHsKLSAgICAgICAgcHJvY2Vzc09uQW5jaG9yKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoV0hBVF9TRUxFQ1RfREVGQVVMVF9UUkFDSykpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1NlbGVjdERlZmF1bHRUcmFjaygpIHsKLSAgICAgICAgaWYgKG1UcmFja0lzRXhwbGljaXQpIHsKLSAgICAgICAgICAgIC8vIElmIHRyYWNrIHNlbGVjdGlvbiBpcyBleHBsaWNpdCwgYnV0IHZpc2liaWxpdHkKLSAgICAgICAgICAgIC8vIGlzIG5vdCwgaXQgZmFsbHMgYmFjayB0byB0aGUgY2FwdGlvbmluZyBzZXR0aW5nCi0gICAgICAgICAgICBpZiAoIW1WaXNpYmlsaXR5SXNFeHBsaWNpdCkgewotICAgICAgICAgICAgICAgIGlmIChtQ2FwdGlvbmluZ01hbmFnZXIuaXNFbmFibGVkKCkgfHwKLSAgICAgICAgICAgICAgICAgICAgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwgJiYKLSAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLmdldEZvcm1hdCgpLmdldEludGVnZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFGb3JtYXQuS0VZX0lTX0ZPUkNFRF9TVUJUSVRMRSwgMCkgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICAgICAgc2hvdygpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAobVNlbGVjdGVkVHJhY2sgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgbVNlbGVjdGVkVHJhY2suZ2V0VHJhY2tUeXBlKCkgPT0gVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfU1VCVElUTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgaGlkZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtVmlzaWJpbGl0eUlzRXhwbGljaXQgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIGNhbiBoYXZlIGEgZGVmYXVsdCAoZm9yY2VkKSB0cmFjayBldmVuIGlmIGNhcHRpb25pbmcKLSAgICAgICAgLy8gaXMgbm90IGVuYWJsZWQuICBUaGlzIGlzIGhhbmRsZWQgYnkgZ2V0RGVmYXVsdFRyYWNrKCkuCi0gICAgICAgIC8vIFNob3cgdGhpcyB0cmFjayB1bmxlc3Mgc3VidGl0bGVzIHdlcmUgZXhwbGljaXRseSBoaWRkZW4uCi0gICAgICAgIFN1YnRpdGxlVHJhY2sgdHJhY2sgPSBnZXREZWZhdWx0VHJhY2soKTsKLSAgICAgICAgaWYgKHRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNlbGVjdFRyYWNrKHRyYWNrKTsKLSAgICAgICAgICAgIG1UcmFja0lzRXhwbGljaXQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmICghbVZpc2liaWxpdHlJc0V4cGxpY2l0KSB7Ci0gICAgICAgICAgICAgICAgc2hvdygpOwotICAgICAgICAgICAgICAgIG1WaXNpYmlsaXR5SXNFeHBsaWNpdCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqIG11c3QgYmUgY2FsbGVkIGZyb20gYW5jaG9yIHRocmVhZCAqLwotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICBjaGVja0FuY2hvckxvb3BlcigpOwotICAgICAgICBoaWRlKCk7Ci0gICAgICAgIHNlbGVjdFRyYWNrKG51bGwpOwotICAgICAgICBtVHJhY2tzLmNsZWFyKCk7Ci0gICAgICAgIG1UcmFja0lzRXhwbGljaXQgPSBmYWxzZTsKLSAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gZmFsc2U7Ci0gICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlci5yZW1vdmVDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgbUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG5ldywgZXh0ZXJuYWwgc3VidGl0bGUgdHJhY2sgdG8gdGhlIG1hbmFnZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZm9ybWF0IHRoZSBmb3JtYXQgb2YgdGhlIHRyYWNrIHRoYXQgd2lsbCBpbmNsdWRlIGF0IGxlYXN0Ci0gICAgICogICAgICAgICAgICAgICB0aGUgTUlNRSB0eXBlIHtAbGluayBNZWRpYUZvcm1hdEBLRVlfTUlNRX0uCi0gICAgICogQHJldHVybiB0aGUgY3JlYXRlZCB7QGxpbmsgU3VidGl0bGVUcmFja30gb2JqZWN0Ci0gICAgICovCi0gICAgcHVibGljIFN1YnRpdGxlVHJhY2sgYWRkVHJhY2soTWVkaWFGb3JtYXQgZm9ybWF0KSB7Ci0gICAgICAgIHN5bmNocm9uaXplZChtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICBmb3IgKFJlbmRlcmVyIHJlbmRlcmVyOiBtUmVuZGVyZXJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlbmRlcmVyLnN1cHBvcnRzKGZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICAgICAgU3VidGl0bGVUcmFjayB0cmFjayA9IHJlbmRlcmVyLmNyZWF0ZVRyYWNrKGZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0cmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzeW5jaHJvbml6ZWQobVRyYWNrcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtVHJhY2tzLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYXB0aW9uaW5nTWFuYWdlci5hZGRDYXB0aW9uaW5nQ2hhbmdlTGlzdGVuZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhcHRpb25pbmdDaGFuZ2VMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UcmFja3MuYWRkKHRyYWNrKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cmFjazsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IHRoZSBzZWxlY3RlZCAob3IgZGVmYXVsdCkgc3VidGl0bGUgdHJhY2suCi0gICAgICoKLSAgICAgKiBTaG91bGQgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIChVSSkgdGhyZWFkLiB7QHNlZSAjQW5jaG9yLmdldFN1YnRpdGxlTG9vcGVyfQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNob3coKSB7Ci0gICAgICAgIHByb2Nlc3NPbkFuY2hvcihtSGFuZGxlci5vYnRhaW5NZXNzYWdlKFdIQVRfU0hPVykpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb1Nob3coKSB7Ci0gICAgICAgIG1TaG93aW5nID0gdHJ1ZTsKLSAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gdHJ1ZTsKLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLnNob3coKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhpZGUgdGhlIHNlbGVjdGVkIChvciBkZWZhdWx0KSBzdWJ0aXRsZSB0cmFjay4KLSAgICAgKgotICAgICAqIFNob3VsZCBiZSBjYWxsZWQgZnJvbSB0aGUgYW5jaG9yJ3MgKFVJKSB0aHJlYWQuIHtAc2VlICNBbmNob3IuZ2V0U3VidGl0bGVMb29wZXJ9Ci0gICAgICovCi0gICAgcHVibGljIHZvaWQgaGlkZSgpIHsKLSAgICAgICAgcHJvY2Vzc09uQW5jaG9yKG1IYW5kbGVyLm9idGFpbk1lc3NhZ2UoV0hBVF9ISURFKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvSGlkZSgpIHsKLSAgICAgICAgbVZpc2liaWxpdHlJc0V4cGxpY2l0ID0gdHJ1ZTsKLSAgICAgICAgaWYgKG1TZWxlY3RlZFRyYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZFRyYWNrLmhpZGUoKTsKLSAgICAgICAgfQotICAgICAgICBtU2hvd2luZyA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBmb3Igc3VwcG9ydGluZyBhIHNpbmdsZSBvciBtdWx0aXBsZSBzdWJ0aXRsZSB0eXBlcyBpbiB7QGxpbmsKLSAgICAgKiBNZWRpYVBsYXllcn0uCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBSZW5kZXJlciB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgYnkge0BsaW5rIE1lZGlhUGxheWVyfSdzIHtAbGluayBTdWJ0aXRsZUNvbnRyb2xsZXJ9IHdoZW4gYSBuZXcKLSAgICAgICAgICogc3VidGl0bGUgdHJhY2sgaXMgZGV0ZWN0ZWQsIHRvIHNlZSBpZiBpdCBzaG91bGQgdXNlIHRoaXMgb2JqZWN0IHRvCi0gICAgICAgICAqIHBhcnNlIGFuZCBkaXNwbGF5IHRoaXMgc3VidGl0bGUgdHJhY2suCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBmb3JtYXQgdGhlIGZvcm1hdCBvZiB0aGUgdHJhY2sgdGhhdCB3aWxsIGluY2x1ZGUgYXQgbGVhc3QKLSAgICAgICAgICogICAgICAgICAgICAgICB0aGUgTUlNRSB0eXBlIHtAbGluayBNZWRpYUZvcm1hdEBLRVlfTUlNRX0uCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgdHJhY2sgZm9ybWF0IGlzIHN1cHBvcnRlZCBieSB0aGlzCi0gICAgICAgICAqIHJlbmRlcmVyCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBzdXBwb3J0cyhNZWRpYUZvcm1hdCBmb3JtYXQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgYnkge0BsaW5rIE1lZGlhUGxheWVyfSdzIHtAbGluayBTdWJ0aXRsZUNvbnRyb2xsZXJ9IGZvciBlYWNoCi0gICAgICAgICAqIHN1YnRpdGxlIHRyYWNrIHRoYXQgd2FzIGRldGVjdGVkIGFuZCBpcyBzdXBwb3J0ZWQgYnkgdGhpcyBvYmplY3QgdG8KLSAgICAgICAgICogY3JlYXRlIGEge0BsaW5rIFN1YnRpdGxlVHJhY2t9IG9iamVjdC4gIFRoaXMgb2JqZWN0IHdpbGwgYmUgY3JlYXRlZAotICAgICAgICAgKiBmb3IgZWFjaCB0cmFjayB0aGF0IHdhcyBmb3VuZC4gIElmIHRoZSB0cmFjayBpcyBzZWxlY3RlZCBmb3IgZGlzcGxheSwKLSAgICAgICAgICogdGhpcyBvYmplY3Qgd2lsbCBiZSB1c2VkIHRvIHBhcnNlIGFuZCBkaXNwbGF5IHRoZSB0cmFjayBkYXRhLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZm9ybWF0IHRoZSBmb3JtYXQgb2YgdGhlIHRyYWNrIHRoYXQgd2lsbCBpbmNsdWRlIGF0IGxlYXN0Ci0gICAgICAgICAqICAgICAgICAgICAgICAgdGhlIE1JTUUgdHlwZSB7QGxpbmsgTWVkaWFGb3JtYXRAS0VZX01JTUV9LgotICAgICAgICAgKiBAcmV0dXJuIGEge0BsaW5rIFN1YnRpdGxlVHJhY2t9IG9iamVjdCB0aGF0IHdpbGwgYmUgdXNlZCB0byBwYXJzZQotICAgICAgICAgKiBhbmQgcmVuZGVyIHRoZSBzdWJ0aXRsZSB0cmFjay4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBTdWJ0aXRsZVRyYWNrIGNyZWF0ZVRyYWNrKE1lZGlhRm9ybWF0IGZvcm1hdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkIHN1cHBvcnQgZm9yIGEgc3VidGl0bGUgZm9ybWF0IGluIHtAbGluayBNZWRpYVBsYXllcn0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVuZGVyZXIgYSB7QGxpbmsgU3VidGl0bGVDb250cm9sbGVyLlJlbmRlcmVyfSBvYmplY3QgdGhhdCBhZGRzCi0gICAgICogICAgICAgICAgICAgICAgIHN1cHBvcnQgZm9yIGEgc3VidGl0bGUgZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZ2lzdGVyUmVuZGVyZXIoUmVuZGVyZXIgcmVuZGVyZXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1SZW5kZXJlcnMpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gaG93IHRvIGdldCBhdmFpbGFibGUgcmVuZGVyZXJzIGluIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgIGlmICghbVJlbmRlcmVycy5jb250YWlucyhyZW5kZXJlcikpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPIHNob3VsZCBhZGRlZCByZW5kZXJlcnMgb3ZlcnJpZGUgZXhpc3Rpbmcgb25lcyAodG8gYWxsb3cgcmVwbGFjaW5nPykKLSAgICAgICAgICAgICAgICBtUmVuZGVyZXJzLmFkZChyZW5kZXJlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNSZW5kZXJlckZvcihNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgc3luY2hyb25pemVkKG1SZW5kZXJlcnMpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gaG93IHRvIGdldCBhdmFpbGFibGUgcmVuZGVyZXJzIGluIHRoZSBzeXN0ZW0KLSAgICAgICAgICAgIGZvciAoUmVuZGVyZXIgcmVuZGVyZXI6IG1SZW5kZXJlcnMpIHsKLSAgICAgICAgICAgICAgICBpZiAocmVuZGVyZXIuc3VwcG9ydHMoZm9ybWF0KSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdWJ0aXRsZSBhbmNob3IsIGFuIG9iamVjdCB0aGF0IGlzIGFibGUgdG8gZGlzcGxheSBhIHN1YnRpdGxlIHJlbmRlcmVyLAotICAgICAqIGUuZy4gYSBWaWRlb1ZpZXcuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBBbmNob3IgewotICAgICAgICAvKioKLSAgICAgICAgICogQW5jaG9yIHNob3VsZCB1c2UgdGhlIHN1cHBsaWVkIHN1YnRpdGxlIHJlbmRlcmluZyB3aWRnZXQsIG9yCi0gICAgICAgICAqIG5vbmUgaWYgaXQgaXMgbnVsbC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldFN1YnRpdGxlV2lkZ2V0KFJlbmRlcmluZ1dpZGdldCBzdWJ0aXRsZVdpZGdldCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFuY2hvcnMgcHJvdmlkZSB0aGUgbG9vcGVyIG9uIHdoaWNoIGFsbCB0cmFjayB2aXNpYmlsaXR5IGNoYW5nZXMKLSAgICAgICAgICogKHRyYWNrLnNob3cvaGlkZSwgc2V0U3VidGl0bGVXaWRnZXQpIHdpbGwgdGFrZSBwbGFjZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBMb29wZXIgZ2V0U3VidGl0bGVMb29wZXIoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEFuY2hvciBtQW5jaG9yOwotCi0gICAgLyoqCi0gICAgICogIGNhbGxlZCBmcm9tIGFuY2hvcidzIGxvb3BlciAoaWYgYW55LCBib3RoIHdoZW4gdW5zZXR0aW5nIGFuZAotICAgICAqICBzZXR0aW5nKQotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEFuY2hvcihBbmNob3IgYW5jaG9yKSB7Ci0gICAgICAgIGlmIChtQW5jaG9yID09IGFuY2hvcikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1BbmNob3IgIT0gbnVsbCkgewotICAgICAgICAgICAgY2hlY2tBbmNob3JMb29wZXIoKTsKLSAgICAgICAgICAgIG1BbmNob3Iuc2V0U3VidGl0bGVXaWRnZXQobnVsbCk7Ci0gICAgICAgIH0KLSAgICAgICAgbUFuY2hvciA9IGFuY2hvcjsKLSAgICAgICAgbUhhbmRsZXIgPSBudWxsOwotICAgICAgICBpZiAobUFuY2hvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKG1BbmNob3IuZ2V0U3VidGl0bGVMb29wZXIoKSwgbUNhbGxiYWNrKTsKLSAgICAgICAgICAgIGNoZWNrQW5jaG9yTG9vcGVyKCk7Ci0gICAgICAgICAgICBtQW5jaG9yLnNldFN1YnRpdGxlV2lkZ2V0KGdldFJlbmRlcmluZ1dpZGdldCgpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0FuY2hvckxvb3BlcigpIHsKLSAgICAgICAgYXNzZXJ0IG1IYW5kbGVyICE9IG51bGwgOiAiU2hvdWxkIGhhdmUgYSBsb29wZXIgYWxyZWFkeSI7Ci0gICAgICAgIGFzc2VydCBMb29wZXIubXlMb29wZXIoKSA9PSBtSGFuZGxlci5nZXRMb29wZXIoKQotICAgICAgICAgICAgICAgIDogIk11c3QgYmUgY2FsbGVkIGZyb20gdGhlIGFuY2hvcidzIGxvb3BlciI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByb2Nlc3NPbkFuY2hvcihNZXNzYWdlIG0pIHsKLSAgICAgICAgYXNzZXJ0IG1IYW5kbGVyICE9IG51bGwgOiAiU2hvdWxkIGhhdmUgYSBsb29wZXIgYWxyZWFkeSI7Ci0gICAgICAgIGlmIChMb29wZXIubXlMb29wZXIoKSA9PSBtSGFuZGxlci5nZXRMb29wZXIoKSkgewotICAgICAgICAgICAgbUhhbmRsZXIuZGlzcGF0Y2hNZXNzYWdlKG0pOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUhhbmRsZXIuc2VuZE1lc3NhZ2UobSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIExpc3RlbmVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgc3VidGl0bGUgdHJhY2sgaGFzIGJlZW4gc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB0cmFjayBzZWxlY3RlZCBzdWJ0aXRsZSB0cmFjayBvciBudWxsCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblN1YnRpdGxlVHJhY2tTZWxlY3RlZChTdWJ0aXRsZVRyYWNrIHRyYWNrKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3RlbmVyIG1MaXN0ZW5lcjsKLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvc3VidGl0bGUvU3VidGl0bGVUcmFjay5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZVRyYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOTA2NGEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS9zdWJ0aXRsZS9TdWJ0aXRsZVRyYWNrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZTsKLQotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFGb3JtYXQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjIuVHJhY2tJbmZvOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuU3VidGl0bGVEYXRhOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb25nU3BhcnNlQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNvcnRlZE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi0vLyBOb3RlOiBUaGlzIGlzIGZvcmtlZCBmcm9tIGFuZHJvaWQubWVkaWEuU3VidGl0bGVUcmFjayBzaW5jZSBQCi0vKioKLSAqIEEgc3VidGl0bGUgdHJhY2sgYWJzdHJhY3QgYmFzZSBjbGFzcyB0aGF0IGlzIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIGFuZCBkaXNwbGF5aW5nCi0gKiBhbiBpbnN0YW5jZSBvZiBhIHBhcnRpY3VsYXIgdHlwZSBvZiBzdWJ0aXRsZS4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIFN1YnRpdGxlVHJhY2sgaW1wbGVtZW50cyBNZWRpYVRpbWVQcm92aWRlci5Pbk1lZGlhVGltZUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlN1YnRpdGxlVHJhY2siOwotICAgIHByaXZhdGUgbG9uZyBtTGFzdFVwZGF0ZVRpbWVNczsKLSAgICBwcml2YXRlIGxvbmcgbUxhc3RUaW1lTXM7Ci0KLSAgICBwcml2YXRlIFJ1bm5hYmxlIG1SdW5uYWJsZTsKLQotICAgIGZpbmFsIHByaXZhdGUgTG9uZ1NwYXJzZUFycmF5PFJ1bj4gbVJ1bnNCeUVuZFRpbWUgPSBuZXcgTG9uZ1NwYXJzZUFycmF5PFJ1bj4oKTsKLSAgICBmaW5hbCBwcml2YXRlIExvbmdTcGFyc2VBcnJheTxSdW4+IG1SdW5zQnlJRCA9IG5ldyBMb25nU3BhcnNlQXJyYXk8UnVuPigpOwotCi0gICAgcHJpdmF0ZSBDdWVMaXN0IG1DdWVzOwotICAgIGZpbmFsIHByaXZhdGUgVmVjdG9yPEN1ZT4gbUFjdGl2ZUN1ZXMgPSBuZXcgVmVjdG9yPEN1ZT4oKTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtVmlzaWJsZTsKLQotICAgIHB1YmxpYyBib29sZWFuIERFQlVHID0gZmFsc2U7Ci0KLSAgICBwcm90ZWN0ZWQgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7Ci0KLSAgICBwcml2YXRlIE1lZGlhRm9ybWF0IG1Gb3JtYXQ7Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVUcmFjayhNZWRpYUZvcm1hdCBmb3JtYXQpIHsKLSAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgbUN1ZXMgPSBuZXcgQ3VlTGlzdCgpOwotICAgICAgICBjbGVhckFjdGl2ZUN1ZXMoKTsKLSAgICAgICAgbUxhc3RUaW1lTXMgPSAtMTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgTWVkaWFGb3JtYXQgZ2V0Rm9ybWF0KCkgewotICAgICAgICByZXR1cm4gbUZvcm1hdDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGxvbmcgbU5leHRTY2hlZHVsZWRUaW1lTXMgPSAtMTsKLQotICAgIHB1YmxpYyB2b2lkIG9uRGF0YShTdWJ0aXRsZURhdGEgZGF0YSkgewotICAgICAgICBsb25nIHJ1bklEID0gZGF0YS5nZXRTdGFydFRpbWVVcygpICsgMTsKLSAgICAgICAgb25EYXRhKGRhdGEuZ2V0RGF0YSgpLCB0cnVlIC8qIGVvcyAqLywgcnVuSUQpOwotICAgICAgICBzZXRSdW5EaXNjYXJkVGltZU1zKAotICAgICAgICAgICAgICAgIHJ1bklELAotICAgICAgICAgICAgICAgIChkYXRhLmdldFN0YXJ0VGltZVVzKCkgKyBkYXRhLmdldER1cmF0aW9uVXMoKSkgLyAxMDAwKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB0aGVyZSBpcyBpbnB1dCBkYXRhIGZvciB0aGUgc3VidGl0bGUgdHJhY2suICBUaGUKLSAgICAgKiBjb21wbGV0ZSBzdWJ0aXRsZSBmb3IgYSB0cmFjayBjYW4gaW5jbHVkZSBtdWx0aXBsZSB3aG9sZSB1bml0cwotICAgICAqIChydW5zKS4gIEVhY2ggb2YgdGhlc2UgdW5pdHMgY2FuIGhhdmUgbXVsdGlwbGUgc2VjdGlvbnMuICBUaGUKLSAgICAgKiBjb250ZW50cyBvZiBhIHJ1biBhcmUgc3VibWl0dGVkIGluIHNlcXVlbnRpYWwgb3JkZXIsIHdpdGggZW9zCi0gICAgICogaW5kaWNhdGluZyB0aGUgbGFzdCBzZWN0aW9uIG9mIHRoZSBydW4uICBDYWxscyBmcm9tIGRpZmZlcmVudAotICAgICAqIHJ1bnMgbXVzdCBub3QgYmUgaW50ZXJtaXhlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkYXRhIHN1YnRpdGxlIGRhdGEgYnl0ZSBidWZmZXIKLSAgICAgKiBAcGFyYW0gZW9zIHRydWUgaWYgdGhpcyBpcyB0aGUgbGFzdCBzZWN0aW9uIG9mIHRoZSBydW4uCi0gICAgICogQHBhcmFtIHJ1bklEIG1vc3RseS11bmlxdWUgSUQgZm9yIHRoaXMgcnVuIG9mIGRhdGEuICBTdWJ0aXRsZSBjdWVzCi0gICAgICogICAgICAgICAgICAgIHdpdGggcnVuSUQgb2YgMCBhcmUgZGlzY2FyZGVkIGltbWVkaWF0ZWx5IGFmdGVyCi0gICAgICogICAgICAgICAgICAgIGRpc3BsYXkuICBDdWVzIHdpdGggcnVuSUQgb2YgfjAgYXJlIGRpc2NhcmRlZAotICAgICAqICAgICAgICAgICAgICBvbmx5IGF0IHRoZSBkZWxldGlvbiBvZiB0aGUgdHJhY2sgb2JqZWN0LiAgQ3VlcwotICAgICAqICAgICAgICAgICAgICB3aXRoIG90aGVyIHJ1bklELXMgYXJlIGRpc2NhcmRlZCBhdCB0aGUgZW5kIG9mIHRoZQotICAgICAqICAgICAgICAgICAgICBydW4sIHdoaWNoIGRlZmF1bHRzIHRvIHRoZSBsYXRlc3QgdGltZXN0YW1wIG9mCi0gICAgICogICAgICAgICAgICAgIGFueSBvZiBpdHMgY3VlcyAod2l0aCB0aGlzIHJ1bklEKS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCBvbkRhdGEoYnl0ZVtdIGRhdGEsIGJvb2xlYW4gZW9zLCBsb25nIHJ1bklEKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIGFkZGluZyB0aGUgc3VidGl0bGUgcmVuZGVyaW5nIHdpZGdldCB0byB0aGUgdmlldyBoaWVyYXJjaHksCi0gICAgICogYXMgd2VsbCBhcyB3aGVuIHNob3dpbmcgb3IgaGlkaW5nIHRoZSBzdWJ0aXRsZSB0cmFjaywgb3Igd2hlbiB0aGUgdmlkZW8KLSAgICAgKiBzdXJmYWNlIHBvc2l0aW9uIGhhcyBjaGFuZ2VkLgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUgd2lkZ2V0IHRoYXQgcmVuZGVycyB0aGlzIHN1YnRpdGxlIHRyYWNrLiBGb3IgbW9zdCByZW5kZXJlcnMKLSAgICAgKiAgICAgICAgIHRoZXJlIHNob3VsZCBiZSBhIHNpbmdsZSBzaGFyZWQgaW5zdGFuY2UgdGhhdCBpcyB1c2VkIGZvciBhbGwKLSAgICAgKiAgICAgICAgIHRyYWNrcyBzdXBwb3J0ZWQgYnkgdGhhdCByZW5kZXJlciwgYXMgYXQgbW9zdCBvbmUgc3VidGl0bGUgdHJhY2sKLSAgICAgKiAgICAgICAgIGlzIHZpc2libGUgYXQgb25lIHRpbWUuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFJlbmRlcmluZ1dpZGdldCBnZXRSZW5kZXJpbmdXaWRnZXQoKTsKLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBhY3RpdmUgY3VlcyBoYXZlIGNoYW5nZWQsIGFuZCB0aGUgY29udGVudHMgb2YgdGhlIHN1YnRpdGxlCi0gICAgICogdmlldyBzaG91bGQgYmUgdXBkYXRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB1cGRhdGVWaWV3KFZlY3RvcjxDdWU+IGFjdGl2ZUN1ZXMpOwotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCB2b2lkIHVwZGF0ZUFjdGl2ZUN1ZXMoYm9vbGVhbiByZWJ1aWxkLCBsb25nIHRpbWVNcykgewotICAgICAgICAvLyBvdXQtb2Ytb3JkZXIgdGltZXMgbWVhbiBzZWVraW5nIG9yIG5ldyBhY3RpdmUgY3VlcyBiZWluZyBhZGRlZAotICAgICAgICAvLyAoZHVyaW5nIHRoZWlyIG93biB0aW1lc3BhbikKLSAgICAgICAgaWYgKHJlYnVpbGQgfHwgbUxhc3RVcGRhdGVUaW1lTXMgPiB0aW1lTXMpIHsKLSAgICAgICAgICAgIGNsZWFyQWN0aXZlQ3VlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgZm9yKEl0ZXJhdG9yPFBhaXI8TG9uZywgQ3VlPiA+IGl0ID0KLSAgICAgICAgICAgICAgICBtQ3Vlcy5lbnRyaWVzQmV0d2VlbihtTGFzdFVwZGF0ZVRpbWVNcywgdGltZU1zKS5pdGVyYXRvcigpOyBpdC5oYXNOZXh0KCk7ICkgewotICAgICAgICAgICAgUGFpcjxMb25nLCBDdWU+IGV2ZW50ID0gaXQubmV4dCgpOwotICAgICAgICAgICAgQ3VlIGN1ZSA9IGV2ZW50LnNlY29uZDsKLQotICAgICAgICAgICAgaWYgKGN1ZS5tRW5kVGltZU1zID09IGV2ZW50LmZpcnN0KSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHBhc3QgY3VlcwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAiUmVtb3ZpbmcgIiArIGN1ZSk7Ci0gICAgICAgICAgICAgICAgbUFjdGl2ZUN1ZXMucmVtb3ZlKGN1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ZS5tUnVuSUQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGN1ZS5tU3RhcnRUaW1lTXMgPT0gZXZlbnQuZmlyc3QpIHsKLSAgICAgICAgICAgICAgICAvLyBhZGQgbmV3IGN1ZXMKLSAgICAgICAgICAgICAgICAvLyBUUklDS1k6IHRoaXMgd2lsbCBoYXBwZW4gaW4gc3RhcnQgb3JkZXIKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkFkZGluZyAiICsgY3VlKTsKLSAgICAgICAgICAgICAgICBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBjdWUub25UaW1lKHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1BY3RpdmVDdWVzLmFkZChjdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjdWUubUlubmVyVGltZXNNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gY3VlIGlzIG1vZGlmaWVkCi0gICAgICAgICAgICAgICAgY3VlLm9uVGltZSh0aW1lTXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyogY29tcGxldGUgYW55IHJ1bnMgKi8KLSAgICAgICAgd2hpbGUgKG1SdW5zQnlFbmRUaW1lLnNpemUoKSA+IDAgJiYKLSAgICAgICAgICAgICAgIG1SdW5zQnlFbmRUaW1lLmtleUF0KDApIDw9IHRpbWVNcykgewotICAgICAgICAgICAgcmVtb3ZlUnVuc0J5RW5kVGltZUluZGV4KDApOyAvLyByZW1vdmVzIGVsZW1lbnQKLSAgICAgICAgfQotICAgICAgICBtTGFzdFVwZGF0ZVRpbWVNcyA9IHRpbWVNczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcmVtb3ZlUnVuc0J5RW5kVGltZUluZGV4KGludCBpeCkgewotICAgICAgICBSdW4gcnVuID0gbVJ1bnNCeUVuZFRpbWUudmFsdWVBdChpeCk7Ci0gICAgICAgIHdoaWxlIChydW4gIT0gbnVsbCkgewotICAgICAgICAgICAgQ3VlIGN1ZSA9IHJ1bi5tRmlyc3RDdWU7Ci0gICAgICAgICAgICB3aGlsZSAoY3VlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ3Vlcy5yZW1vdmUoY3VlKTsKLSAgICAgICAgICAgICAgICBDdWUgbmV4dEN1ZSA9IGN1ZS5tTmV4dEluUnVuOwotICAgICAgICAgICAgICAgIGN1ZS5tTmV4dEluUnVuID0gbnVsbDsKLSAgICAgICAgICAgICAgICBjdWUgPSBuZXh0Q3VlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVJ1bnNCeUlELnJlbW92ZShydW4ubVJ1bklEKTsKLSAgICAgICAgICAgIFJ1biBuZXh0UnVuID0gcnVuLm1OZXh0UnVuQXRFbmRUaW1lTXM7Ci0gICAgICAgICAgICBydW4ubVByZXZSdW5BdEVuZFRpbWVNcyA9IG51bGw7Ci0gICAgICAgICAgICBydW4ubU5leHRSdW5BdEVuZFRpbWVNcyA9IG51bGw7Ci0gICAgICAgICAgICBydW4gPSBuZXh0UnVuOwotICAgICAgICB9Ci0gICAgICAgIG1SdW5zQnlFbmRUaW1lLnJlbW92ZUF0KGl4KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBmaW5hbGl6ZSgpIHRocm93cyBUaHJvd2FibGUgewotICAgICAgICAvKiByZW1vdmUgYWxsIGN1ZXMgKHVudGFuZ2xlIGFsbCBjcm9zcy1saW5rcykgKi8KLSAgICAgICAgaW50IHNpemUgPSBtUnVuc0J5RW5kVGltZS5zaXplKCk7Ci0gICAgICAgIGZvcihpbnQgaXggPSBzaXplIC0gMTsgaXggPj0gMDsgaXgtLSkgewotICAgICAgICAgICAgcmVtb3ZlUnVuc0J5RW5kVGltZUluZGV4KGl4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHN1cGVyLmZpbmFsaXplKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCB0YWtlVGltZShsb25nIHRpbWVNcykgewotICAgICAgICBtTGFzdFRpbWVNcyA9IHRpbWVNczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3luY2hyb25pemVkIHZvaWQgY2xlYXJBY3RpdmVDdWVzKCkgewotICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgIkNsZWFyaW5nICIgKyBtQWN0aXZlQ3Vlcy5zaXplKCkgKyAiIGFjdGl2ZSBjdWVzIik7Ci0gICAgICAgIG1BY3RpdmVDdWVzLmNsZWFyKCk7Ci0gICAgICAgIG1MYXN0VXBkYXRlVGltZU1zID0gLTE7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2NoZWR1bGVUaW1lZEV2ZW50cygpIHsKLSAgICAgICAgLyogZ2V0IHRpbWVzIGZvciB0aGUgbmV4dCBldmVudCAqLwotICAgICAgICBpZiAobVRpbWVQcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTmV4dFNjaGVkdWxlZFRpbWVNcyA9IG1DdWVzLm5leHRUaW1lQWZ0ZXIobUxhc3RUaW1lTXMpOwotICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJzY2hlZCBAIiArIG1OZXh0U2NoZWR1bGVkVGltZU1zICsgIiBhZnRlciAiICsgbUxhc3RUaW1lTXMpOwotICAgICAgICAgICAgbVRpbWVQcm92aWRlci5ub3RpZnlBdCgKLSAgICAgICAgICAgICAgICAgICAgbU5leHRTY2hlZHVsZWRUaW1lTXMgPj0gMCA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAobU5leHRTY2hlZHVsZWRUaW1lTXMgKiAxMDAwKSA6IE1lZGlhVGltZVByb3ZpZGVyLk5PX1RJTUUsCi0gICAgICAgICAgICAgICAgICAgIHRoaXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25UaW1lZEV2ZW50KGxvbmcgdGltZVVzKSB7Ci0gICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAib25UaW1lZEV2ZW50ICIgKyB0aW1lVXMpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGxvbmcgdGltZU1zID0gdGltZVVzIC8gMTAwMDsKLSAgICAgICAgICAgIHVwZGF0ZUFjdGl2ZUN1ZXMoZmFsc2UsIHRpbWVNcyk7Ci0gICAgICAgICAgICB0YWtlVGltZSh0aW1lTXMpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVZpZXcobUFjdGl2ZUN1ZXMpOwotICAgICAgICBzY2hlZHVsZVRpbWVkRXZlbnRzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TZWVrKGxvbmcgdGltZVVzKSB7Ci0gICAgICAgIGlmIChERUJVRykgTG9nLmQoVEFHLCAib25TZWVrICIgKyB0aW1lVXMpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICAgIGxvbmcgdGltZU1zID0gdGltZVVzIC8gMTAwMDsKLSAgICAgICAgICAgIHVwZGF0ZUFjdGl2ZUN1ZXModHJ1ZSwgdGltZU1zKTsKLSAgICAgICAgICAgIHRha2VUaW1lKHRpbWVNcyk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlVmlldyhtQWN0aXZlQ3Vlcyk7Ci0gICAgICAgIHNjaGVkdWxlVGltZWRFdmVudHMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJvblN0b3AiKTsKLSAgICAgICAgICAgIGNsZWFyQWN0aXZlQ3VlcygpOwotICAgICAgICAgICAgbUxhc3RUaW1lTXMgPSAtMTsKLSAgICAgICAgfQotICAgICAgICB1cGRhdGVWaWV3KG1BY3RpdmVDdWVzKTsKLSAgICAgICAgbU5leHRTY2hlZHVsZWRUaW1lTXMgPSAtMTsKLSAgICAgICAgbVRpbWVQcm92aWRlci5ub3RpZnlBdChNZWRpYVRpbWVQcm92aWRlci5OT19USU1FLCB0aGlzKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgTWVkaWFUaW1lUHJvdmlkZXIgbVRpbWVQcm92aWRlcjsKLQotICAgIHB1YmxpYyB2b2lkIHNob3coKSB7Ci0gICAgICAgIGlmIChtVmlzaWJsZSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVZpc2libGUgPSB0cnVlOwotICAgICAgICBSZW5kZXJpbmdXaWRnZXQgcmVuZGVyaW5nV2lkZ2V0ID0gZ2V0UmVuZGVyaW5nV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChyZW5kZXJpbmdXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVuZGVyaW5nV2lkZ2V0LnNldFZpc2libGUodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRpbWVQcm92aWRlci5zY2hlZHVsZVVwZGF0ZSh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGhpZGUoKSB7Ci0gICAgICAgIGlmICghbVZpc2libGUpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIuY2FuY2VsTm90aWZpY2F0aW9ucyh0aGlzKTsKLSAgICAgICAgfQotICAgICAgICBSZW5kZXJpbmdXaWRnZXQgcmVuZGVyaW5nV2lkZ2V0ID0gZ2V0UmVuZGVyaW5nV2lkZ2V0KCk7Ci0gICAgICAgIGlmIChyZW5kZXJpbmdXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgcmVuZGVyaW5nV2lkZ2V0LnNldFZpc2libGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIG1WaXNpYmxlID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHN5bmNocm9uaXplZCBib29sZWFuIGFkZEN1ZShDdWUgY3VlKSB7Ci0gICAgICAgIG1DdWVzLmFkZChjdWUpOwotCi0gICAgICAgIGlmIChjdWUubVJ1bklEICE9IDApIHsKLSAgICAgICAgICAgIFJ1biBydW4gPSBtUnVuc0J5SUQuZ2V0KGN1ZS5tUnVuSUQpOwotICAgICAgICAgICAgaWYgKHJ1biA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcnVuID0gbmV3IFJ1bigpOwotICAgICAgICAgICAgICAgIG1SdW5zQnlJRC5wdXQoY3VlLm1SdW5JRCwgcnVuKTsKLSAgICAgICAgICAgICAgICBydW4ubUVuZFRpbWVNcyA9IGN1ZS5tRW5kVGltZU1zOwotICAgICAgICAgICAgfSBlbHNlIGlmIChydW4ubUVuZFRpbWVNcyA8IGN1ZS5tRW5kVGltZU1zKSB7Ci0gICAgICAgICAgICAgICAgcnVuLm1FbmRUaW1lTXMgPSBjdWUubUVuZFRpbWVNczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gbGluay11cCBjdWVzIGluIHRoZSBzYW1lIHJ1bgotICAgICAgICAgICAgY3VlLm1OZXh0SW5SdW4gPSBydW4ubUZpcnN0Q3VlOwotICAgICAgICAgICAgcnVuLm1GaXJzdEN1ZSA9IGN1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGlmIGEgY3VlIGlzIGFkZGVkIHRoYXQgc2hvdWxkIGJlIHZpc2libGUsIG5lZWQgdG8gcmVmcmVzaCB2aWV3Ci0gICAgICAgIGxvbmcgbm93TXMgPSAtMTsKLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBub3dNcyA9IG1UaW1lUHJvdmlkZXIuZ2V0Q3VycmVudFRpbWVVcygKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIHByZWNpc2UgKi8sIHRydWUgLyogbW9ub3RvbmljICovKSAvIDEwMDA7Ci0gICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIC8vIGhhbmRsZSBhcyBpdCB3ZSBhcmUgbm90IHBsYXlpbmcKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChERUJVRykgTG9nLnYoVEFHLCAibVZpc2libGU9IiArIG1WaXNpYmxlICsgIiwgIiArCi0gICAgICAgICAgICAgICAgY3VlLm1TdGFydFRpbWVNcyArICIgPD0gIiArIG5vd01zICsgIiwgIiArCi0gICAgICAgICAgICAgICAgY3VlLm1FbmRUaW1lTXMgKyAiID49ICIgKyBtTGFzdFRpbWVNcyk7Ci0KLSAgICAgICAgaWYgKG1WaXNpYmxlICYmCi0gICAgICAgICAgICAgICAgY3VlLm1TdGFydFRpbWVNcyA8PSBub3dNcyAmJgotICAgICAgICAgICAgICAgIC8vIHdlIGRvbid0IHRydXN0IG5vd01zLCBzbyBjaGVjayBhbnkgY3VlIHNpbmNlIGxhc3QgY2FsbGJhY2sKLSAgICAgICAgICAgICAgICBjdWUubUVuZFRpbWVNcyA+PSBtTGFzdFRpbWVNcykgewotICAgICAgICAgICAgaWYgKG1SdW5uYWJsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1SdW5uYWJsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmaW5hbCBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gdGhpczsKLSAgICAgICAgICAgIGZpbmFsIGxvbmcgdGhlbk1zID0gbm93TXM7Ci0gICAgICAgICAgICBtUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAvLyBldmVuIHdpdGggc3luY2hyb25pemVkLCBpdCBpcyBwb3NzaWJsZSB0aGF0IHdlIGFyZSBnb2luZwotICAgICAgICAgICAgICAgICAgICAvLyB0byBkbyBtdWx0aXBsZSB1cGRhdGVzIGFzIHRoZSBydW5uYWJsZSBjb3VsZCBiZSBhbHJlYWR5Ci0gICAgICAgICAgICAgICAgICAgIC8vIHJ1bm5pbmcuCi0gICAgICAgICAgICAgICAgICAgIHN5bmNocm9uaXplZCAodHJhY2spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SdW5uYWJsZSA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVBY3RpdmVDdWVzKHRydWUsIHRoZW5Ncyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVWaWV3KG1BY3RpdmVDdWVzKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAvLyBkZWxheSB1cGRhdGUgc28gd2UgZG9uJ3QgdXBkYXRlIHZpZXcgb24gZXZlcnkgY3VlLiAgVE9ETyB3aHkgMTA/Ci0gICAgICAgICAgICBpZiAobUhhbmRsZXIucG9zdERlbGF5ZWQobVJ1bm5hYmxlLCAxMCAvKiBkZWxheSAqLykpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgInNjaGVkdWxpbmcgdXBkYXRlIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgTG9nLncoVEFHLCAiZmFpbGVkIHRvIHNjaGVkdWxlIHN1YnRpdGxlIHZpZXcgdXBkYXRlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtVmlzaWJsZSAmJgotICAgICAgICAgICAgICAgIGN1ZS5tRW5kVGltZU1zID49IG1MYXN0VGltZU1zICYmCi0gICAgICAgICAgICAgICAgKGN1ZS5tU3RhcnRUaW1lTXMgPCBtTmV4dFNjaGVkdWxlZFRpbWVNcyB8fAotICAgICAgICAgICAgICAgICBtTmV4dFNjaGVkdWxlZFRpbWVNcyA8IDApKSB7Ci0gICAgICAgICAgICBzY2hlZHVsZVRpbWVkRXZlbnRzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHNldFRpbWVQcm92aWRlcihNZWRpYVRpbWVQcm92aWRlciB0aW1lUHJvdmlkZXIpIHsKLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgPT0gdGltZVByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1UaW1lUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVRpbWVQcm92aWRlci5jYW5jZWxOb3RpZmljYXRpb25zKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIG1UaW1lUHJvdmlkZXIgPSB0aW1lUHJvdmlkZXI7Ci0gICAgICAgIGlmIChtVGltZVByb3ZpZGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1UaW1lUHJvdmlkZXIuc2NoZWR1bGVVcGRhdGUodGhpcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLQotICAgIHN0YXRpYyBjbGFzcyBDdWVMaXN0IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJDdWVMaXN0IjsKLSAgICAgICAgLy8gc2ltcGxpc3RpYywgaW5lZmZpY2llbnQgaW1wbGVtZW50YXRpb24KLSAgICAgICAgcHJpdmF0ZSBTb3J0ZWRNYXA8TG9uZywgVmVjdG9yPEN1ZT4gPiBtQ3VlczsKLSAgICAgICAgcHVibGljIGJvb2xlYW4gREVCVUcgPSBmYWxzZTsKLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gYWRkRXZlbnQoQ3VlIGN1ZSwgbG9uZyB0aW1lTXMpIHsKLSAgICAgICAgICAgIFZlY3RvcjxDdWU+IGN1ZXMgPSBtQ3Vlcy5nZXQodGltZU1zKTsKLSAgICAgICAgICAgIGlmIChjdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjdWVzID0gbmV3IFZlY3RvcjxDdWU+KDIpOwotICAgICAgICAgICAgICAgIG1DdWVzLnB1dCh0aW1lTXMsIGN1ZXMpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChjdWVzLmNvbnRhaW5zKGN1ZSkpIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3QgZHVwbGljYXRlIGN1ZXMKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGN1ZXMuYWRkKGN1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCByZW1vdmVFdmVudChDdWUgY3VlLCBsb25nIHRpbWVNcykgewotICAgICAgICAgICAgVmVjdG9yPEN1ZT4gY3VlcyA9IG1DdWVzLmdldCh0aW1lTXMpOwotICAgICAgICAgICAgaWYgKGN1ZXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGN1ZXMucmVtb3ZlKGN1ZSk7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ZXMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbUN1ZXMucmVtb3ZlKHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgYWRkKEN1ZSBjdWUpIHsKLSAgICAgICAgICAgIC8vIGlnbm9yZSBub24tcG9zaXRpdmUtZHVyYXRpb24gY3VlcwotICAgICAgICAgICAgaWYgKGN1ZS5tU3RhcnRUaW1lTXMgPj0gY3VlLm1FbmRUaW1lTXMpCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotCi0gICAgICAgICAgICBpZiAoIWFkZEV2ZW50KGN1ZSwgY3VlLm1TdGFydFRpbWVNcykpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGxvbmcgbGFzdFRpbWVNcyA9IGN1ZS5tU3RhcnRUaW1lTXM7Ci0gICAgICAgICAgICBpZiAoY3VlLm1Jbm5lclRpbWVzTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAobG9uZyB0aW1lTXM6IGN1ZS5tSW5uZXJUaW1lc01zKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0aW1lTXMgPiBsYXN0VGltZU1zICYmIHRpbWVNcyA8IGN1ZS5tRW5kVGltZU1zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhZGRFdmVudChjdWUsIHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBsYXN0VGltZU1zID0gdGltZU1zOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZGRFdmVudChjdWUsIGN1ZS5tRW5kVGltZU1zKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZShDdWUgY3VlKSB7Ci0gICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIGN1ZS5tU3RhcnRUaW1lTXMpOwotICAgICAgICAgICAgaWYgKGN1ZS5tSW5uZXJUaW1lc01zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBmb3IgKGxvbmcgdGltZU1zOiBjdWUubUlubmVyVGltZXNNcykgewotICAgICAgICAgICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVtb3ZlRXZlbnQoY3VlLCBjdWUubUVuZFRpbWVNcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSXRlcmFibGU8UGFpcjxMb25nLCBDdWU+PiBlbnRyaWVzQmV0d2VlbigKLSAgICAgICAgICAgICAgICBmaW5hbCBsb25nIGxhc3RUaW1lTXMsIGZpbmFsIGxvbmcgdGltZU1zKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEl0ZXJhYmxlPFBhaXI8TG9uZywgQ3VlPiA+KCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyBJdGVyYXRvcjxQYWlyPExvbmcsIEN1ZT4gPiBpdGVyYXRvcigpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSBMb2cuZChUQUcsICJzbGljZSAoIiArIGxhc3RUaW1lTXMgKyAiLCAiICsgdGltZU1zICsgIl09Iik7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVudHJ5SXRlcmF0b3IoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdWVzLnN1Yk1hcChsYXN0VGltZU1zICsgMSwgdGltZU1zICsgMSkpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEVudHJ5SXRlcmF0b3IobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGxvbmcgbmV4dFRpbWVBZnRlcihsb25nIHRpbWVNcykgewotICAgICAgICAgICAgU29ydGVkTWFwPExvbmcsIFZlY3RvcjxDdWU+PiB0YWlsID0gbnVsbDsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgdGFpbCA9IG1DdWVzLnRhaWxNYXAodGltZU1zICsgMSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRhaWwgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGFpbC5maXJzdEtleSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfSBjYXRjaChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBjbGFzcyBFbnRyeUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8UGFpcjxMb25nLCBDdWU+ID4gewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICAgICAgICAgIHJldHVybiAhbURvbmU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFBhaXI8TG9uZywgQ3VlPiBuZXh0KCkgewotICAgICAgICAgICAgICAgIGlmIChtRG9uZSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1MYXN0RW50cnkgPSBuZXcgUGFpcjxMb25nLCBDdWU+KAotICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRUaW1lTXMsIG1MaXN0SXRlcmF0b3IubmV4dCgpKTsKLSAgICAgICAgICAgICAgICBtTGFzdExpc3RJdGVyYXRvciA9IG1MaXN0SXRlcmF0b3I7Ci0gICAgICAgICAgICAgICAgaWYgKCFtTGlzdEl0ZXJhdG9yLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICBuZXh0S2V5KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBtTGFzdEVudHJ5OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgICAgICAgICAvLyBvbmx5IGFsbG93IHJlbW92aW5nIGVuZCB0YWdzCi0gICAgICAgICAgICAgICAgaWYgKG1MYXN0TGlzdEl0ZXJhdG9yID09IG51bGwgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0RW50cnkuc2Vjb25kLm1FbmRUaW1lTXMgIT0gbUxhc3RFbnRyeS5maXJzdCkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCIiKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgZW5kLWN1ZQotICAgICAgICAgICAgICAgIG1MYXN0TGlzdEl0ZXJhdG9yLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgIG1MYXN0TGlzdEl0ZXJhdG9yID0gbnVsbDsKLSAgICAgICAgICAgICAgICBpZiAobUN1ZXMuZ2V0KG1MYXN0RW50cnkuZmlyc3QpLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdWVzLnJlbW92ZShtTGFzdEVudHJ5LmZpcnN0KTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyByZW1vdmUgcmVzdCBvZiB0aGUgY3VlcwotICAgICAgICAgICAgICAgIEN1ZSBjdWUgPSBtTGFzdEVudHJ5LnNlY29uZDsKLSAgICAgICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIGN1ZS5tU3RhcnRUaW1lTXMpOwotICAgICAgICAgICAgICAgIGlmIChjdWUubUlubmVyVGltZXNNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAobG9uZyB0aW1lTXM6IGN1ZS5tSW5uZXJUaW1lc01zKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVFdmVudChjdWUsIHRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBFbnRyeUl0ZXJhdG9yKFNvcnRlZE1hcDxMb25nLCBWZWN0b3I8Q3VlPiA+IGN1ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIExvZy52KFRBRywgY3VlcyArICIiKTsKLSAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3VlcyA9IGN1ZXM7Ci0gICAgICAgICAgICAgICAgbUxhc3RMaXN0SXRlcmF0b3IgPSBudWxsOwotICAgICAgICAgICAgICAgIG5leHRLZXkoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIG5leHRLZXkoKSB7Ci0gICAgICAgICAgICAgICAgZG8gewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1SZW1haW5pbmdDdWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigiIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRpbWVNcyA9IG1SZW1haW5pbmdDdWVzLmZpcnN0S2V5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTGlzdEl0ZXJhdG9yID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3Vlcy5nZXQobUN1cnJlbnRUaW1lTXMpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZW1haW5pbmdDdWVzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlbWFpbmluZ0N1ZXMudGFpbE1hcChtQ3VycmVudFRpbWVNcyArIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVtYWluaW5nQ3VlcyA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtRG9uZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Eb25lID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZW1haW5pbmdDdWVzID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1MaXN0SXRlcmF0b3IgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoIW1MaXN0SXRlcmF0b3IuaGFzTmV4dCgpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBsb25nIG1DdXJyZW50VGltZU1zOwotICAgICAgICAgICAgcHJpdmF0ZSBJdGVyYXRvcjxDdWU+IG1MaXN0SXRlcmF0b3I7Ci0gICAgICAgICAgICBwcml2YXRlIGJvb2xlYW4gbURvbmU7Ci0gICAgICAgICAgICBwcml2YXRlIFNvcnRlZE1hcDxMb25nLCBWZWN0b3I8Q3VlPiA+IG1SZW1haW5pbmdDdWVzOwotICAgICAgICAgICAgcHJpdmF0ZSBJdGVyYXRvcjxDdWU+IG1MYXN0TGlzdEl0ZXJhdG9yOwotICAgICAgICAgICAgcHJpdmF0ZSBQYWlyPExvbmcsQ3VlPiBtTGFzdEVudHJ5OwotICAgICAgICB9Ci0KLSAgICAgICAgQ3VlTGlzdCgpIHsKLSAgICAgICAgICAgIG1DdWVzID0gbmV3IFRyZWVNYXA8TG9uZywgVmVjdG9yPEN1ZT4+KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEN1ZSB7Ci0gICAgICAgIHB1YmxpYyBsb25nIG1TdGFydFRpbWVNczsKLSAgICAgICAgcHVibGljIGxvbmcgbUVuZFRpbWVNczsKLSAgICAgICAgcHVibGljIGxvbmdbXSBtSW5uZXJUaW1lc01zOwotICAgICAgICBwdWJsaWMgbG9uZyBtUnVuSUQ7Ci0KLSAgICAgICAgcHVibGljIEN1ZSBtTmV4dEluUnVuOwotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVGltZShsb25nIHRpbWVNcykgeyB9Ci0gICAgfQotCi0gICAgLyoqIHVwZGF0ZSBtUnVuc0J5RW5kVGltZSAod2l0aCBkZWZhdWx0IGVuZCB0aW1lKSAqLwotICAgIHByb3RlY3RlZCB2b2lkIGZpbmlzaGVkUnVuKGxvbmcgcnVuSUQpIHsKLSAgICAgICAgaWYgKHJ1bklEICE9IDAgJiYgcnVuSUQgIT0gfjApIHsKLSAgICAgICAgICAgIFJ1biBydW4gPSBtUnVuc0J5SUQuZ2V0KHJ1bklEKTsKLSAgICAgICAgICAgIGlmIChydW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJ1bi5zdG9yZUJ5RW5kVGltZU1zKG1SdW5zQnlFbmRUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiB1cGRhdGUgbVJ1bnNCeUVuZFRpbWUgd2l0aCBnaXZlbiBlbmQgdGltZSAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJ1bkRpc2NhcmRUaW1lTXMobG9uZyBydW5JRCwgbG9uZyB0aW1lTXMpIHsKLSAgICAgICAgaWYgKHJ1bklEICE9IDAgJiYgcnVuSUQgIT0gfjApIHsKLSAgICAgICAgICAgIFJ1biBydW4gPSBtUnVuc0J5SUQuZ2V0KHJ1bklEKTsKLSAgICAgICAgICAgIGlmIChydW4gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJ1bi5tRW5kVGltZU1zID0gdGltZU1zOwotICAgICAgICAgICAgICAgIHJ1bi5zdG9yZUJ5RW5kVGltZU1zKG1SdW5zQnlFbmRUaW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKiB3aGV0aGVyIHRoaXMgaXMgYSB0ZXh0IHRyYWNrIHdobyBmaXJlcyBldmVudHMgaW5zdGVhZCBnZXR0aW5nIHJlbmRlcmVkICovCi0gICAgcHVibGljIGludCBnZXRUcmFja1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBnZXRSZW5kZXJpbmdXaWRnZXQoKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgPyBUcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9USU1FRFRFWFQKLSAgICAgICAgICAgICAgICA6IFRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1NVQlRJVExFOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUnVuIHsKLSAgICAgICAgcHVibGljIEN1ZSBtRmlyc3RDdWU7Ci0gICAgICAgIHB1YmxpYyBSdW4gbU5leHRSdW5BdEVuZFRpbWVNczsKLSAgICAgICAgcHVibGljIFJ1biBtUHJldlJ1bkF0RW5kVGltZU1zOwotICAgICAgICBwdWJsaWMgbG9uZyBtRW5kVGltZU1zID0gLTE7Ci0gICAgICAgIHB1YmxpYyBsb25nIG1SdW5JRCA9IDA7Ci0gICAgICAgIHByaXZhdGUgbG9uZyBtU3RvcmVkRW5kVGltZU1zID0gLTE7Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc3RvcmVCeUVuZFRpbWVNcyhMb25nU3BhcnNlQXJyYXk8UnVuPiBydW5zQnlFbmRUaW1lKSB7Ci0gICAgICAgICAgICAvLyByZW1vdmUgb2xkIHZhbHVlIGlmIGFueQotICAgICAgICAgICAgaW50IGl4ID0gcnVuc0J5RW5kVGltZS5pbmRleE9mS2V5KG1TdG9yZWRFbmRUaW1lTXMpOwotICAgICAgICAgICAgaWYgKGl4ID49IDApIHsKLSAgICAgICAgICAgICAgICBpZiAobVByZXZSdW5BdEVuZFRpbWVNcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzc2VydCh0aGlzID09IHJ1bnNCeUVuZFRpbWUudmFsdWVBdChpeCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAobU5leHRSdW5BdEVuZFRpbWVNcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBydW5zQnlFbmRUaW1lLnJlbW92ZUF0KGl4KTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnNCeUVuZFRpbWUuc2V0VmFsdWVBdChpeCwgbU5leHRSdW5BdEVuZFRpbWVNcyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVtb3ZlQXRFbmRUaW1lTXMoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYWRkIG5ldyB2YWx1ZQotICAgICAgICAgICAgaWYgKG1FbmRUaW1lTXMgPj0gMCkgewotICAgICAgICAgICAgICAgIG1QcmV2UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgICAgIG1OZXh0UnVuQXRFbmRUaW1lTXMgPSBydW5zQnlFbmRUaW1lLmdldChtRW5kVGltZU1zKTsKLSAgICAgICAgICAgICAgICBpZiAobU5leHRSdW5BdEVuZFRpbWVNcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1OZXh0UnVuQXRFbmRUaW1lTXMubVByZXZSdW5BdEVuZFRpbWVNcyA9IHRoaXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJ1bnNCeUVuZFRpbWUucHV0KG1FbmRUaW1lTXMsIHRoaXMpOwotICAgICAgICAgICAgICAgIG1TdG9yZWRFbmRUaW1lTXMgPSBtRW5kVGltZU1zOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlQXRFbmRUaW1lTXMoKSB7Ci0gICAgICAgICAgICBSdW4gcHJldiA9IG1QcmV2UnVuQXRFbmRUaW1lTXM7Ci0KLSAgICAgICAgICAgIGlmIChtUHJldlJ1bkF0RW5kVGltZU1zICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUHJldlJ1bkF0RW5kVGltZU1zLm1OZXh0UnVuQXRFbmRUaW1lTXMgPSBtTmV4dFJ1bkF0RW5kVGltZU1zOwotICAgICAgICAgICAgICAgIG1QcmV2UnVuQXRFbmRUaW1lTXMgPSBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1OZXh0UnVuQXRFbmRUaW1lTXMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1OZXh0UnVuQXRFbmRUaW1lTXMubVByZXZSdW5BdEVuZFRpbWVNcyA9IHByZXY7Ci0gICAgICAgICAgICAgICAgbU5leHRSdW5BdEVuZFRpbWVNcyA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2UgZm9yIHJlbmRlcmluZyBzdWJ0aXRsZXMgb250byBhIENhbnZhcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFJlbmRlcmluZ1dpZGdldCB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB3aWRnZXQncyBjYWxsYmFjaywgd2hpY2ggaXMgdXNlZCB0byBzZW5kIHVwZGF0ZXMgd2hlbiB0aGUKLSAgICAgICAgICogcmVuZGVyZWQgZGF0YSBoYXMgY2hhbmdlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIHVwZGF0ZSBjYWxsYmFjawotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0T25DaGFuZ2VkTGlzdGVuZXIoT25DaGFuZ2VkTGlzdGVuZXIgY2FsbGJhY2spOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB3aWRnZXQncyBzaXplLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gd2lkdGggd2lkdGggaW4gcGl4ZWxzCi0gICAgICAgICAqIEBwYXJhbSBoZWlnaHQgaGVpZ2h0IGluIHBpeGVscwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U2l6ZShpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIHdpZGdldCBzaG91bGQgZHJhdyBzdWJ0aXRsZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2aXNpYmxlIHRydWUgaWYgc3VidGl0bGVzIHNob3VsZCBiZSBkcmF3biwgZmFsc2Ugb3RoZXJ3aXNlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBzZXRWaXNpYmxlKGJvb2xlYW4gdmlzaWJsZSk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlbmRlcnMgc3VidGl0bGVzIG9udG8gYSB7QGxpbmsgQ2FudmFzfS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGMgY2FudmFzIG9uIHdoaWNoIHRvIHJlbmRlciBzdWJ0aXRsZXMKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIGRyYXcoQ2FudmFzIGMpOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgd2lkZ2V0IGlzIGF0dGFjaGVkIHRvIGEgd2luZG93LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSB3aWRnZXQgaXMgZGV0YWNoZWQgZnJvbSBhIHdpbmRvdy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxiYWNrIHVzZWQgdG8gc2VuZCB1cGRhdGVzIGFib3V0IGNoYW5nZXMgdG8gcmVuZGVyaW5nIGRhdGEuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50ZXJmYWNlIE9uQ2hhbmdlZExpc3RlbmVyIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlbmRlcmluZyBkYXRhIGhhcyBjaGFuZ2VkLgotICAgICAgICAgICAgICoKLSAgICAgICAgICAgICAqIEBwYXJhbSByZW5kZXJpbmdXaWRnZXQgdGhlIHdpZGdldCB3aG9zZSBkYXRhIGhhcyBjaGFuZ2VkCi0gICAgICAgICAgICAgKi8KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2hhbmdlZChSZW5kZXJpbmdXaWRnZXQgcmVuZGVyaW5nV2lkZ2V0KTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvdXBkYXRlL0FwaUZhY3RvcnkuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvdXBkYXRlL0FwaUZhY3RvcnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDdiZTU0OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlGYWN0b3J5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuTm90aWZpY2F0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BcHBsaWNhdGlvbkluZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUJyb3dzZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFCcm93c2VyMi5Ccm93c2VyQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFDb250cm9sbGVyMi5Db250cm9sbGVyQ2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUl0ZW0yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFMaWJyYXJ5U2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5MaWJyYXJ5Um9vdDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UyLk1lZGlhTGlicmFyeVNlc3Npb247Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMi5NZWRpYUxpYnJhcnlTZXNzaW9uLk1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5bGlzdEFnZW50OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Db21tYW5kR3JvdXAyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5Db250cm9sbGVySW5mbzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjIuU2Vzc2lvbkNhbGxiYWNrOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uU2VydmljZTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb25TZXJ2aWNlMi5NZWRpYU5vdGlmaWNhdGlvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlJhdGluZzI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuVm9sdW1lUHJvdmlkZXIyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhQnJvd3NlcjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUNvbnRyb2xWaWV3MlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhQ29udHJvbGxlcjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5NZWRpYUl0ZW0yUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFMaWJyYXJ5U2VydmljZTJQcm92aWRlci5MaWJyYXJ5Um9vdFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhTWV0YWRhdGEyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFQbGF5bGlzdEFnZW50UHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uMlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvbjJQcm92aWRlci5CdWlsZGVyQmFzZVByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvbjJQcm92aWRlci5Db21tYW5kQnV0dG9uUHJvdmlkZXIuQnVpbGRlclByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLk1lZGlhU2Vzc2lvblNlcnZpY2UyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlci5NZWRpYU5vdGlmaWNhdGlvblByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlNlc3Npb25Ub2tlbjJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5TdGF0aWNQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWRlb1ZpZXcyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlld0dyb3VwUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVm9sdW1lUHJvdmlkZXIyUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JSW50ZXJmYWNlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sVmlldzI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVmlkZW9WaWV3MjsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLklNZWRpYUNvbnRyb2xsZXIyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhQnJvd3NlcjJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhQ29udHJvbGxlcjJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhTGlicmFyeVNlcnZpY2UySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYUxpYnJhcnlTZXJ2aWNlMkltcGwuTGlicmFyeVJvb3RJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnRJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvbjJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLk1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5SYXRpbmcySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5TZXNzaW9uVG9rZW4ySW1wbDsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5Wb2x1bWVQcm92aWRlcjJJbXBsOwotaW1wb3J0IGNvbS5hbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xWaWV3MkltcGw7Ci1pbXBvcnQgY29tLmFuZHJvaWQud2lkZ2V0LlZpZGVvVmlldzJJbXBsOwotCi1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBBcGlGYWN0b3J5IGltcGxlbWVudHMgU3RhdGljUHJvdmlkZXIgewotICAgIHByaXZhdGUgQXBpRmFjdG9yeSgpIHsgfQotCi0gICAgcHVibGljIHN0YXRpYyBTdGF0aWNQcm92aWRlciBpbml0aWFsaXplKEFwcGxpY2F0aW9uSW5mbyB1cGRhdGFibGVJbmZvKSB7Ci0gICAgICAgIEFwaUhlbHBlci5pbml0aWFsaXplKHVwZGF0YWJsZUluZm8pOwotICAgICAgICByZXR1cm4gbmV3IEFwaUZhY3RvcnkoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFDb250cm9sbGVyMlByb3ZpZGVyIGNyZWF0ZU1lZGlhQ29udHJvbGxlcjIoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIE1lZGlhQ29udHJvbGxlcjIgaW5zdGFuY2UsIFNlc3Npb25Ub2tlbjIgdG9rZW4sCi0gICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgQ29udHJvbGxlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFDb250cm9sbGVyMkltcGwoY29udGV4dCwgaW5zdGFuY2UsIHRva2VuLCBleGVjdXRvciwgY2FsbGJhY2spOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUJyb3dzZXIyUHJvdmlkZXIgY3JlYXRlTWVkaWFCcm93c2VyMihDb250ZXh0IGNvbnRleHQsIE1lZGlhQnJvd3NlcjIgaW5zdGFuY2UsCi0gICAgICAgICAgICBTZXNzaW9uVG9rZW4yIHRva2VuLCBFeGVjdXRvciBleGVjdXRvciwgQnJvd3NlckNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFCcm93c2VyMkltcGwoY29udGV4dCwgaW5zdGFuY2UsIHRva2VuLCBleGVjdXRvciwgY2FsbGJhY2spOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29tbWFuZFByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb21tYW5kKAotICAgICAgICAgICAgU2Vzc2lvbkNvbW1hbmQyIGluc3RhbmNlLCBpbnQgY29tbWFuZENvZGUsIFN0cmluZyBhY3Rpb24sIEJ1bmRsZSBleHRyYSkgewotICAgICAgICBpZiAoYWN0aW9uID09IG51bGwgJiYgZXh0cmEgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kSW1wbChpbnN0YW5jZSwgY29tbWFuZENvZGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEltcGwoaW5zdGFuY2UsIGFjdGlvbiwgZXh0cmEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uQ29tbWFuZDIgZnJvbUJ1bmRsZV9NZWRpYVNlc3Npb24yQ29tbWFuZChCdW5kbGUgY29tbWFuZCkgewotICAgICAgICByZXR1cm4gTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEltcGwuZnJvbUJ1bmRsZV9pbXBsKGNvbW1hbmQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVNlc3Npb24yUHJvdmlkZXIuQ29tbWFuZEdyb3VwUHJvdmlkZXIgY3JlYXRlTWVkaWFTZXNzaW9uMkNvbW1hbmRHcm91cCgKLSAgICAgICAgICAgIFNlc3Npb25Db21tYW5kR3JvdXAyIGluc3RhbmNlLCBTZXNzaW9uQ29tbWFuZEdyb3VwMiBvdGhlcikgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkNvbW1hbmRHcm91cEltcGwoaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgKG90aGVyID09IG51bGwpID8gbnVsbCA6IG90aGVyLmdldFByb3ZpZGVyKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uQ29tbWFuZEdyb3VwMiBmcm9tQnVuZGxlX01lZGlhU2Vzc2lvbjJDb21tYW5kR3JvdXAoQnVuZGxlIGNvbW1hbmRzKSB7Ci0gICAgICAgIHJldHVybiBNZWRpYVNlc3Npb24ySW1wbC5Db21tYW5kR3JvdXBJbXBsLmZyb21CdW5kbGVfaW1wbChjb21tYW5kcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbjJQcm92aWRlci5Db250cm9sbGVySW5mb1Byb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb250cm9sbGVySW5mbygKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQ29udHJvbGxlckluZm8gaW5zdGFuY2UsIGludCB1aWQsIGludCBwaWQsIFN0cmluZyBwYWNrYWdlTmFtZSwKLSAgICAgICAgICAgIElJbnRlcmZhY2UgY2FsbGJhY2spIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb24ySW1wbC5Db250cm9sbGVySW5mb0ltcGwoY29udGV4dCwKLSAgICAgICAgICAgICAgICBpbnN0YW5jZSwgdWlkLCBwaWQsIHBhY2thZ2VOYW1lLCAoSU1lZGlhQ29udHJvbGxlcjIpIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclByb3ZpZGVyIGNyZWF0ZU1lZGlhU2Vzc2lvbjJDb21tYW5kQnV0dG9uQnVpbGRlcigKLSAgICAgICAgICAgIE1lZGlhU2Vzc2lvbjIuQ29tbWFuZEJ1dHRvbi5CdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uMkltcGwuQ29tbWFuZEJ1dHRvbkltcGwuQnVpbGRlckltcGwoaW5zdGFuY2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBCdWlsZGVyQmFzZVByb3ZpZGVyPE1lZGlhU2Vzc2lvbjIsIFNlc3Npb25DYWxsYmFjaz4gY3JlYXRlTWVkaWFTZXNzaW9uMkJ1aWxkZXIoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIE1lZGlhU2Vzc2lvbjIuQnVpbGRlciBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvbjJJbXBsLkJ1aWxkZXJJbXBsKGNvbnRleHQsIGluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlciBjcmVhdGVNZWRpYVNlc3Npb25TZXJ2aWNlMihNZWRpYVNlc3Npb25TZXJ2aWNlMiBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhU2Vzc2lvblNlcnZpY2UySW1wbChpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTm90aWZpY2F0aW9uUHJvdmlkZXIgY3JlYXRlTWVkaWFTZXNzaW9uU2VydmljZTJNZWRpYU5vdGlmaWNhdGlvbigKLSAgICAgICAgICAgIE1lZGlhTm90aWZpY2F0aW9uIGluc3RhbmNlLCBpbnQgbm90aWZpY2F0aW9uSWQsIE5vdGlmaWNhdGlvbiBub3RpZmljYXRpb24pIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVNlc3Npb25TZXJ2aWNlMkltcGwuTWVkaWFOb3RpZmljYXRpb25JbXBsKAotICAgICAgICAgICAgICAgIGluc3RhbmNlLCBub3RpZmljYXRpb25JZCwgbm90aWZpY2F0aW9uKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFTZXNzaW9uU2VydmljZTJQcm92aWRlciBjcmVhdGVNZWRpYUxpYnJhcnlTZXJ2aWNlMihNZWRpYUxpYnJhcnlTZXJ2aWNlMiBpbnN0YW5jZSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhTGlicmFyeVNlcnZpY2UySW1wbChpbnN0YW5jZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJCYXNlUHJvdmlkZXI8TWVkaWFMaWJyYXJ5U2Vzc2lvbiwgTWVkaWFMaWJyYXJ5U2Vzc2lvbkNhbGxiYWNrPgotICAgICAgICBjcmVhdGVNZWRpYUxpYnJhcnlTZXJ2aWNlMkJ1aWxkZXIoTWVkaWFMaWJyYXJ5U2VydmljZTIgc2VydmljZSwKLSAgICAgICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb24uQnVpbGRlciBpbnN0YW5jZSwgRXhlY3V0b3IgY2FsbGJhY2tFeGVjdXRvciwKLSAgICAgICAgICAgIE1lZGlhTGlicmFyeVNlc3Npb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhTGlicmFyeVNlcnZpY2UySW1wbC5CdWlsZGVySW1wbChzZXJ2aWNlLCBpbnN0YW5jZSwgY2FsbGJhY2tFeGVjdXRvciwKLSAgICAgICAgICAgICAgICBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpYnJhcnlSb290UHJvdmlkZXIgY3JlYXRlTWVkaWFMaWJyYXJ5U2VydmljZTJMaWJyYXJ5Um9vdCgKLSAgICAgICAgICAgIExpYnJhcnlSb290IGluc3RhbmNlLCBTdHJpbmcgcm9vdElkLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTGlicmFyeVJvb3RJbXBsKGluc3RhbmNlLCByb290SWQsIGV4dHJhcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhQ29udHJvbFZpZXcyUHJvdmlkZXIgY3JlYXRlTWVkaWFDb250cm9sVmlldzIoTWVkaWFDb250cm9sVmlldzIgaW5zdGFuY2UsCi0gICAgICAgICAgICBWaWV3R3JvdXBQcm92aWRlciBzdXBlclByb3ZpZGVyLCBWaWV3R3JvdXBQcm92aWRlciBwcml2YXRlUHJvdmlkZXIsCi0gICAgICAgICAgICBATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyLCBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUNvbnRyb2xWaWV3MkltcGwoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZpZGVvVmlldzJQcm92aWRlciBjcmVhdGVWaWRlb1ZpZXcyKAotICAgICAgICAgICAgVmlkZW9WaWV3MiBpbnN0YW5jZSwgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyLAotICAgICAgICAgICAgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVmlkZW9WaWV3MkltcGwoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlc3Npb25Ub2tlbjJQcm92aWRlciBjcmVhdGVTZXNzaW9uVG9rZW4yKENvbnRleHQgY29udGV4dCwgU2Vzc2lvblRva2VuMiBpbnN0YW5jZSwKLSAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIHNlcnZpY2VOYW1lLCBpbnQgdWlkKSB7Ci0gICAgICAgIHJldHVybiBuZXcgU2Vzc2lvblRva2VuMkltcGwoY29udGV4dCwgaW5zdGFuY2UsIHBhY2thZ2VOYW1lLCBzZXJ2aWNlTmFtZSwgdWlkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU2Vzc2lvblRva2VuMiBmcm9tQnVuZGxlX1Nlc3Npb25Ub2tlbjIoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gU2Vzc2lvblRva2VuMkltcGwuZnJvbUJ1bmRsZV9pbXBsKGJ1bmRsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhSXRlbTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgY3JlYXRlTWVkaWFJdGVtMkJ1aWxkZXIoTWVkaWFJdGVtMi5CdWlsZGVyIGluc3RhbmNlLAotICAgICAgICAgICAgaW50IGZsYWdzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFJdGVtMkltcGwuQnVpbGRlckltcGwoaW5zdGFuY2UsIGZsYWdzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFJdGVtMiBmcm9tQnVuZGxlX01lZGlhSXRlbTIoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gTWVkaWFJdGVtMkltcGwuZnJvbUJ1bmRsZV9pbXBsKGJ1bmRsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZvbHVtZVByb3ZpZGVyMlByb3ZpZGVyIGNyZWF0ZVZvbHVtZVByb3ZpZGVyMihWb2x1bWVQcm92aWRlcjIgaW5zdGFuY2UsIGludCBjb250cm9sVHlwZSwKLSAgICAgICAgICAgIGludCBtYXhWb2x1bWUsIGludCBjdXJyZW50Vm9sdW1lKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVm9sdW1lUHJvdmlkZXIySW1wbChpbnN0YW5jZSwgY29udHJvbFR5cGUsIG1heFZvbHVtZSwgY3VycmVudFZvbHVtZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGZyb21CdW5kbGVfTWVkaWFNZXRhZGF0YTIoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gTWVkaWFNZXRhZGF0YTJJbXBsLmZyb21CdW5kbGVfaW1wbChidW5kbGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYU1ldGFkYXRhMlByb3ZpZGVyLkJ1aWxkZXJQcm92aWRlciBjcmVhdGVNZWRpYU1ldGFkYXRhMkJ1aWxkZXIoCi0gICAgICAgICAgICBNZWRpYU1ldGFkYXRhMi5CdWlsZGVyIGluc3RhbmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVkaWFNZXRhZGF0YTJQcm92aWRlci5CdWlsZGVyUHJvdmlkZXIgY3JlYXRlTWVkaWFNZXRhZGF0YTJCdWlsZGVyKAotICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIuQnVpbGRlciBpbnN0YW5jZSwgTWVkaWFNZXRhZGF0YTIgc291cmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFNZXRhZGF0YTJJbXBsLkJ1aWxkZXJJbXBsKGluc3RhbmNlLCBzb3VyY2UpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIGZyb21CdW5kbGVfUmF0aW5nMihCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBSYXRpbmcySW1wbC5mcm9tQnVuZGxlX2ltcGwoYnVuZGxlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBuZXdVbnJhdGVkUmF0aW5nX1JhdGluZzIoaW50IHJhdGluZ1N0eWxlKSB7Ci0gICAgICAgIHJldHVybiBSYXRpbmcySW1wbC5uZXdVbnJhdGVkUmF0aW5nX2ltcGwocmF0aW5nU3R5bGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIG5ld0hlYXJ0UmF0aW5nX1JhdGluZzIoYm9vbGVhbiBoYXNIZWFydCkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3SGVhcnRSYXRpbmdfaW1wbChoYXNIZWFydCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFJhdGluZzIgbmV3VGh1bWJSYXRpbmdfUmF0aW5nMihib29sZWFuIHRodW1iSXNVcCkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3VGh1bWJSYXRpbmdfaW1wbCh0aHVtYklzVXApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSYXRpbmcyIG5ld1N0YXJSYXRpbmdfUmF0aW5nMihpbnQgc3RhclJhdGluZ1N0eWxlLCBmbG9hdCBzdGFyUmF0aW5nKSB7Ci0gICAgICAgIHJldHVybiBSYXRpbmcySW1wbC5uZXdTdGFyUmF0aW5nX2ltcGwoc3RhclJhdGluZ1N0eWxlLCBzdGFyUmF0aW5nKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUmF0aW5nMiBuZXdQZXJjZW50YWdlUmF0aW5nX1JhdGluZzIoZmxvYXQgcGVyY2VudCkgewotICAgICAgICByZXR1cm4gUmF0aW5nMkltcGwubmV3UGVyY2VudGFnZVJhdGluZ19pbXBsKHBlcmNlbnQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYVBsYXlsaXN0QWdlbnRQcm92aWRlciBjcmVhdGVNZWRpYVBsYXlsaXN0QWdlbnQoTWVkaWFQbGF5bGlzdEFnZW50IGluc3RhbmNlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFQbGF5bGlzdEFnZW50SW1wbChpbnN0YW5jZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9tZWRpYS91cGRhdGUvQXBpSGVscGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ4YmI0OC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL3VwZGF0ZS9BcGlIZWxwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLkFwcGxpY2F0aW9uSW5mbzsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzLlRoZW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuWG1sUmVzb3VyY2VQYXJzZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uR3VhcmRlZEJ5OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC53aWRnZXQuU3BhY2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY3LndpZGdldC5CdXR0b25CYXJMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuTGF5b3V0SW5mbGF0ZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVCdXR0b247Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk1lZGlhUm91dGVWb2x1bWVTbGlkZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHAuT3ZlcmxheUxpc3RWaWV3OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgQXBpSGVscGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBBcHBsaWNhdGlvbkluZm8gc1VwZGF0YWJsZUluZm87Ci0KLSAgICBAR3VhcmRlZEJ5KCJ0aGlzIikKLSAgICBwcml2YXRlIHN0YXRpYyBUaGVtZSBzTGliVGhlbWU7Ci0KLSAgICBwcml2YXRlIEFwaUhlbHBlcigpIHsgfQotCi0gICAgc3RhdGljIHZvaWQgaW5pdGlhbGl6ZShBcHBsaWNhdGlvbkluZm8gdXBkYXRhYmxlSW5mbykgewotICAgICAgICBpZiAoc1VwZGF0YWJsZUluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiaW5pdGlhbGl6ZSBzaG91bGQgb25seSBiZSBjYWxsZWQgb25jZSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgc1VwZGF0YWJsZUluZm8gPSB1cGRhdGFibGVJbmZvOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVzb3VyY2VzIGdldExpYlJlc291cmNlcyhDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGdldExpYlRoZW1lKGNvbnRleHQpLmdldFJlc291cmNlcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVGhlbWUgZ2V0TGliVGhlbWUoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGlmIChzTGliVGhlbWUgIT0gbnVsbCkgcmV0dXJuIHNMaWJUaGVtZTsKLQotICAgICAgICByZXR1cm4gZ2V0TGliVGhlbWVTeW5jaHJvbml6ZWQoY29udGV4dCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUaGVtZSBnZXRMaWJUaGVtZShDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZUlkKSB7Ci0gICAgICAgIFRoZW1lIHRoZW1lID0gZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLm5ld1RoZW1lKCk7Ci0gICAgICAgIHRoZW1lLmFwcGx5U3R5bGUodGhlbWVJZCwgdHJ1ZSk7Ci0gICAgICAgIHJldHVybiB0aGVtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIExheW91dEluZmxhdGVyIGdldExheW91dEluZmxhdGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gZ2V0TGF5b3V0SW5mbGF0ZXIoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBMYXlvdXRJbmZsYXRlciBnZXRMYXlvdXRJbmZsYXRlcihDb250ZXh0IGNvbnRleHQsIFRoZW1lIHRoZW1lKSB7Ci0gICAgICAgIGlmICh0aGVtZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGVtZSA9IGdldExpYlRoZW1lKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETyAoYi83Mjk3NTk3Nik6IEF2b2lkIHRvIHVzZSBDb250ZXh0VGhlbWVXcmFwcGVyIHdpdGggYXBwIGNvbnRleHQgYW5kIGxpYiB0aGVtZS4KLSAgICAgICAgTGF5b3V0SW5mbGF0ZXIgbGF5b3V0SW5mbGF0ZXIgPSBMYXlvdXRJbmZsYXRlci5mcm9tKGNvbnRleHQpLmNsb25lSW5Db250ZXh0KAotICAgICAgICAgICAgICAgIG5ldyBDb250ZXh0VGhlbWVXcmFwcGVyKGNvbnRleHQsIHRoZW1lKSk7Ci0gICAgICAgIGxheW91dEluZmxhdGVyLnNldEZhY3RvcnkyKG5ldyBMYXlvdXRJbmZsYXRlci5GYWN0b3J5MigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIFZpZXcgb25DcmVhdGVWaWV3KAotICAgICAgICAgICAgICAgICAgICBWaWV3IHBhcmVudCwgU3RyaW5nIG5hbWUsIENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgICAgICAgICAgaWYgKE1lZGlhUm91dGVCdXR0b24uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVCdXR0b24oY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoTWVkaWFSb3V0ZVZvbHVtZVNsaWRlci5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24uY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChPdmVybGF5TGlzdFZpZXcuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IE92ZXJsYXlMaXN0Vmlldyhjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChCdXR0b25CYXJMYXlvdXQuY2xhc3MuZ2V0Q2Fub25pY2FsTmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEJ1dHRvbkJhckxheW91dChjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChTcGFjZS5jbGFzcy5nZXRDYW5vbmljYWxOYW1lKCkuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXcgU3BhY2UoY29udGV4dCwgYXR0cnMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgVmlldyBvbkNyZWF0ZVZpZXcoU3RyaW5nIG5hbWUsIENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG9uQ3JlYXRlVmlldyhudWxsLCBuYW1lLCBjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICByZXR1cm4gbGF5b3V0SW5mbGF0ZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBWaWV3IGluZmxhdGVMaWJMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBpbnQgbGliUmVzSWQpIHsKLSAgICAgICAgcmV0dXJuIGluZmxhdGVMaWJMYXlvdXQoY29udGV4dCwgZ2V0TGliVGhlbWUoY29udGV4dCksIGxpYlJlc0lkLCBudWxsLCBmYWxzZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBWaWV3IGluZmxhdGVMaWJMYXlvdXQoQ29udGV4dCBjb250ZXh0LCBUaGVtZSB0aGVtZSwgaW50IGxpYlJlc0lkKSB7Ci0gICAgICAgIHJldHVybiBpbmZsYXRlTGliTGF5b3V0KGNvbnRleHQsIHRoZW1lLCBsaWJSZXNJZCwgbnVsbCwgZmFsc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgVmlldyBpbmZsYXRlTGliTGF5b3V0KENvbnRleHQgY29udGV4dCwgVGhlbWUgdGhlbWUsIGludCBsaWJSZXNJZCwKLSAgICAgICAgICAgIEBOdWxsYWJsZSBWaWV3R3JvdXAgcm9vdCwgYm9vbGVhbiBhdHRhY2hUb1Jvb3QpIHsKLSAgICAgICAgdHJ5IChYbWxSZXNvdXJjZVBhcnNlciBwYXJzZXIgPSBnZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0TGF5b3V0KGxpYlJlc0lkKSkgewotICAgICAgICAgICAgcmV0dXJuIGdldExheW91dEluZmxhdGVyKGNvbnRleHQsIHRoZW1lKS5pbmZsYXRlKHBhcnNlciwgcm9vdCwgYXR0YWNoVG9Sb290KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHN5bmNocm9uaXplZCBUaGVtZSBnZXRMaWJUaGVtZVN5bmNocm9uaXplZChDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKHNMaWJUaGVtZSAhPSBudWxsKSByZXR1cm4gc0xpYlRoZW1lOwotCi0gICAgICAgIGlmIChzVXBkYXRhYmxlSW5mbyA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJpbml0aWFsaXplIGhhc24ndCBiZWVuIGNhbGxlZCB5ZXQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gc0xpYlRoZW1lID0gY29udGV4dC5nZXRQYWNrYWdlTWFuYWdlcigpCi0gICAgICAgICAgICAgICAgICAgIC5nZXRSZXNvdXJjZXNGb3JBcHBsaWNhdGlvbihzVXBkYXRhYmxlSW5mbykubmV3VGhlbWUoKTsKLSAgICAgICAgfSBjYXRjaCAoTmFtZU5vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwaTI0L21lZGlhL01lZGlhUm91dGVyQXBpMjQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcGkyNC9tZWRpYS9NZWRpYVJvdXRlckFwaTI0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNDZhZjYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwaTI0L21lZGlhL01lZGlhUm91dGVyQXBpMjQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotLy8gQEBSZXF1aXJlc0FwaSgyNCkKLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVyQXBpMjQgewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0RGV2aWNlVHlwZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXREZXZpY2VUeXBlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVBY3Rpb25Qcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDNlOGQ0Ny4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVBY3Rpb25Qcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTm9uTnVsbDsKLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uTnVsbGFibGU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnZpZXcuQWN0aW9uUHJvdmlkZXI7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlcjsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLQotLyoqCi0gKiBUaGUgbWVkaWEgcm91dGUgYWN0aW9uIHByb3ZpZGVyIGRpc3BsYXlzIGEge0BsaW5rIE1lZGlhUm91dGVCdXR0b24gbWVkaWEgcm91dGUgYnV0dG9ufQotICogaW4gdGhlIGFwcGxpY2F0aW9uJ3Mge0BsaW5rIEFjdGlvbkJhcn0gdG8gYWxsb3cgdGhlIHVzZXIgdG8gc2VsZWN0IHJvdXRlcyBhbmQKLSAqIHRvIGNvbnRyb2wgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4KLSAqIDxwPgotICogVGhlIGFwcGxpY2F0aW9uIG11c3Qgc3BlY2lmeSB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQKLSAqIHRvIHNlbGVjdCBieSBzcGVjaWZ5aW5nIGEge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3Rvcn0gd2l0aCB0aGUKLSAqIHtAbGluayAjc2V0Um91dGVTZWxlY3Rvcn0gbWV0aG9kLgotICogPC9wPjxwPgotICogUmVmZXIgdG8ge0BsaW5rIE1lZGlhUm91dGVCdXR0b259IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBidXR0b24gdGhhdCB3aWxsCi0gKiBhcHBlYXIgaW4gdGhlIGFjdGlvbiBiYXIgbWVudS4gIE5vdGUgdGhhdCBpbnN0ZWFkIG9mIGRpc2FibGluZyB0aGUgYnV0dG9uCi0gKiB3aGVuIG5vIHJvdXRlcyBhcmUgYXZhaWxhYmxlLCB0aGUgYWN0aW9uIHByb3ZpZGVyIHdpbGwgaW5zdGVhZCBtYWtlIHRoZQotICogbWVudSBpdGVtIGludmlzaWJsZS4gIEluIHRoaXMgd2F5LCB0aGUgYnV0dG9uIHdpbGwgb25seSBiZSB2aXNpYmxlIHdoZW4gaXQKLSAqIGlzIHBvc3NpYmxlIGZvciB0aGUgdXNlciB0byBkaXNjb3ZlciBhbmQgc2VsZWN0IGEgbWF0Y2hpbmcgcm91dGUuCi0gKiA8L3A+Ci0gKgotICogPGgzPlByZXJlcXVpc2l0ZXM8L2gzPgotICogPHA+Ci0gKiBUbyB1c2UgdGhlIG1lZGlhIHJvdXRlIGFjdGlvbiBwcm92aWRlciwgdGhlIGFjdGl2aXR5IG11c3QgYmUgYSBzdWJjbGFzcyBvZgotICoge0BsaW5rIEFwcENvbXBhdEFjdGl2aXR5fSBmcm9tIHRoZSA8Y29kZT5hbmRyb2lkLnN1cHBvcnQudjcuYXBwY29tcGF0PC9jb2RlPgotICogc3VwcG9ydCBsaWJyYXJ5LiAgUmVmZXIgdG8gc3VwcG9ydCBsaWJyYXJ5IGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCi0gKiA8L3A+Ci0gKgotICogPGgzPkV4YW1wbGU8L2gzPgotICogPHA+Ci0gKiA8L3A+PHA+Ci0gKiBUaGUgYXBwbGljYXRpb24gc2hvdWxkIGRlZmluZSBhIG1lbnUgcmVzb3VyY2UgdG8gaW5jbHVkZSB0aGUgcHJvdmlkZXIgaW4gdGhlCi0gKiBhY3Rpb24gYmFyIG9wdGlvbnMgbWVudS4gIE5vdGUgdGhhdCB0aGUgc3VwcG9ydCBsaWJyYXJ5IGFjdGlvbiBiYXIgdXNlcyBhdHRyaWJ1dGVzCi0gKiB0aGF0IGFyZSBkZWZpbmVkIGluIHRoZSBhcHBsaWNhdGlvbidzIHJlc291cmNlIG5hbWVzcGFjZSByYXRoZXIgdGhhbiB0aGUgZnJhbWV3b3JrJ3MKLSAqIHJlc291cmNlIG5hbWVzcGFjZSB0byBjb25maWd1cmUgZWFjaCBpdGVtLgotICogPC9wPjxwcmU+Ci0gKiAmbHQ7bWVudSB4bWxuczphbmRyb2lkPSJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiCi0gKiAgICAgICAgIHhtbG5zOmFwcD0iaHR0cDovL3NjaGVtYXMuYW5kcm9pZC5jb20vYXBrL3Jlcy1hdXRvIj4KLSAqICAgICAmbHQ7aXRlbSBhbmRyb2lkOmlkPSJAK2lkL21lZGlhX3JvdXRlX21lbnVfaXRlbSIKLSAqICAgICAgICAgYW5kcm9pZDp0aXRsZT0iQHN0cmluZy9tZWRpYV9yb3V0ZV9tZW51X3RpdGxlIgotICogICAgICAgICBhcHA6c2hvd0FzQWN0aW9uPSJhbHdheXMiCi0gKiAgICAgICAgIGFwcDphY3Rpb25Qcm92aWRlckNsYXNzPSJhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciIvPgotICogJmx0Oy9tZW51PgotICogPC9wcmU+PHA+Ci0gKiBUaGVuIGNvbmZpZ3VyZSB0aGUgbWVudSBhbmQgc2V0IHRoZSByb3V0ZSBzZWxlY3RvciBmb3IgdGhlIGNob29zZXIuCi0gKiA8L3A+PHByZT4KLSAqIHB1YmxpYyBjbGFzcyBNeUFjdGl2aXR5IGV4dGVuZHMgQXBwQ29tcGF0QWN0aXZpdHkgewotICogICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAqICAgICBwcml2YXRlIE1lZGlhUm91dGVyLkNhbGxiYWNrIG1DYWxsYmFjazsKLSAqICAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3I7Ci0gKgotICogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAqICAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLSAqCi0gKiAgICAgICAgIG1Sb3V0ZXIgPSBNZWRpYXJvdXRlci5nZXRJbnN0YW5jZSh0aGlzKTsKLSAqICAgICAgICAgbVNlbGVjdG9yID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCkKLSAqICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKQotICogICAgICAgICAgICAgICAgIC5hZGRDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSykKLSAqICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAqICAgICAgICAgbUNhbGxiYWNrID0gbmV3IE15Q2FsbGJhY2soKTsKLSAqICAgICB9Ci0gKgotICogICAgIC8vIEFkZCB0aGUgY2FsbGJhY2sgb24gc3RhcnQgdG8gdGVsbCB0aGUgbWVkaWEgcm91dGVyIHdoYXQga2luZHMgb2Ygcm91dGVzCi0gKiAgICAgLy8gdGhlIGFwcGxpY2F0aW9uIGlzIGludGVyZXN0ZWQgaW4gc28gdGhhdCBpdCBjYW4gdHJ5IHRvIGRpc2NvdmVyIHN1aXRhYmxlIG9uZXMuCi0gKiAgICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKLSAqICAgICAgICAgc3VwZXIub25TdGFydCgpOwotICoKLSAqICAgICAgICAgbWVkaWFSb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssCi0gKiAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSk7Ci0gKgotICogICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtZWRpYVJvdXRlci51cGRhdGVTZWxlY3RlZFJvdXRlKG1TZWxlY3Rvcik7Ci0gKiAgICAgICAgIC8vIGRvIHNvbWV0aGluZyB3aXRoIHRoZSByb3V0ZS4uLgotICogICAgIH0KLSAqCi0gKiAgICAgLy8gUmVtb3ZlIHRoZSBzZWxlY3RvciBvbiBzdG9wIHRvIHRlbGwgdGhlIG1lZGlhIHJvdXRlciB0aGF0IGl0IG5vIGxvbmdlcgotICogICAgIC8vIG5lZWRzIHRvIGludmVzdCBlZmZvcnQgdHJ5aW5nIHRvIGRpc2NvdmVyIHJvdXRlcyBvZiB0aGVzZSBraW5kcyBmb3Igbm93LgotICogICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAqICAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gKgotICogICAgICAgICBtZWRpYVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICogICAgIH0KLSAqCi0gKiAgICAgcHVibGljIGJvb2xlYW4gb25DcmVhdGVPcHRpb25zTWVudShNZW51IG1lbnUpIHsKLSAqICAgICAgICAgc3VwZXIub25DcmVhdGVPcHRpb25zTWVudShtZW51KTsKLSAqCi0gKiAgICAgICAgIGdldE1lbnVJbmZsYXRlcigpLmluZmxhdGUoUi5tZW51LnNhbXBsZV9tZWRpYV9yb3V0ZXJfbWVudSwgbWVudSk7Ci0gKgotICogICAgICAgICBNZW51SXRlbSBtZWRpYVJvdXRlTWVudUl0ZW0gPSBtZW51LmZpbmRJdGVtKFIuaWQubWVkaWFfcm91dGVfbWVudV9pdGVtKTsKLSAqICAgICAgICAgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIG1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciA9Ci0gKiAgICAgICAgICAgICAgICAgKE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcilNZW51SXRlbUNvbXBhdC5nZXRBY3Rpb25Qcm92aWRlcihtZWRpYVJvdXRlTWVudUl0ZW0pOwotICogICAgICAgICBtZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIuc2V0Um91dGVTZWxlY3RvcihtU2VsZWN0b3IpOwotICogICAgICAgICByZXR1cm4gdHJ1ZTsKLSAqICAgICB9Ci0gKgotICogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTXlDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAqICAgICAgICAgLy8gSW1wbGVtZW50IGNhbGxiYWNrIG1ldGhvZHMgYXMgbmVlZGVkLgotICogICAgIH0KLSAqIH0KLSAqIDwvcHJlPgotICoKLSAqIEBzZWUgI3NldFJvdXRlU2VsZWN0b3IKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBleHRlbmRzIEFjdGlvblByb3ZpZGVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlckNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IG1EaWFsb2dGYWN0b3J5ID0gTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkuZ2V0RGVmYXVsdCgpOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZUJ1dHRvbiBtQnV0dG9uOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgYWN0aW9uIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogQHBhcmFtIGNvbnRleHQgVGhlIGNvbnRleHQuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCk7Ci0KLSAgICAgICAgbVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGNvbnRleHQpOwotICAgICAgICBtQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXJDYWxsYmFjayh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4KLSAgICAgKiBzZWxlY3QgdXNpbmcgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IsIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIC8vIEZJWE1FOiBXZSBjdXJyZW50bHkgaGF2ZSBubyB3YXkgb2Yga25vd2luZyB3aGV0aGVyIHRoZSBhY3Rpb24gcHJvdmlkZXIKLSAgICAgICAgICAgIC8vIGlzIHN0aWxsIG5lZWRlZCBieSB0aGUgVUkuICBVbmZvcnR1bmF0ZWx5IHRoaXMgbWVhbnMgdGhlIGFjdGlvbiBwcm92aWRlcgotICAgICAgICAgICAgLy8gbWF5IGxlYWsgY2FsbGJhY2tzIHVudGlsIGdhcmJhZ2UgY29sbGVjdGlvbiBvY2N1cnMuICBUaGlzIG1heSByZXN1bHQgaW4KLSAgICAgICAgICAgIC8vIG1lZGlhIHJvdXRlIHByb3ZpZGVycyBkb2luZyBtb3JlIHdvcmsgdGhhbiBuZWNlc3NhcnkgaW4gdGhlIHNob3J0IHRlcm0KLSAgICAgICAgICAgIC8vIHdoaWxlIHRyeWluZyB0byBkaXNjb3ZlciByb3V0ZXMgdGhhdCBhcmUgbm8gbG9uZ2VyIG9mIGludGVyZXN0IHRvIHRoZQotICAgICAgICAgICAgLy8gYXBwbGljYXRpb24uICBUbyBzb2x2ZSB0aGlzIHByb2JsZW0sIHRoZSBhY3Rpb24gcHJvdmlkZXIgd2lsbCBuZWVkIHNvbWUKLSAgICAgICAgICAgIC8vIGluZGljYXRpb24gZnJvbSB0aGUgZnJhbWV3b3JrIHRoYXQgaXQgaXMgYmVpbmcgZGVzdHJveWVkLgotICAgICAgICAgICAgaWYgKCFtU2VsZWN0b3IuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFzZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKHNlbGVjdG9yLCBtQ2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLQotICAgICAgICAgICAgaWYgKG1CdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1CdXR0b24uc2V0Um91dGVTZWxlY3RvcihzZWxlY3Rvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSB0byB1c2Ugd2hlbiBzaG93aW5nIHRoZSByb3V0ZSBjaG9vc2VyCi0gICAgICogb3IgY29udHJvbGxlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBkaWFsb2cgZmFjdG9yeSwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBnZXREaWFsb2dGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gbURpYWxvZ0ZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgdG8gdXNlIHdoZW4gc2hvd2luZyB0aGUgcm91dGUgY2hvb3NlcgotICAgICAqIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGRpYWxvZyBmYWN0b3J5LCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpYWxvZ0ZhY3RvcnkoQE5vbk51bGwgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmYWN0b3J5IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtRGlhbG9nRmFjdG9yeSAhPSBmYWN0b3J5KSB7Ci0gICAgICAgICAgICBtRGlhbG9nRmFjdG9yeSA9IGZhY3Rvcnk7Ci0KLSAgICAgICAgICAgIGlmIChtQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQnV0dG9uLnNldERpYWxvZ0ZhY3RvcnkoZmFjdG9yeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBhc3NvY2lhdGVkIG1lZGlhIHJvdXRlIGJ1dHRvbiwgb3IgbnVsbCBpZiBpdCBoYXMgbm90IHlldCBiZWVuIGNyZWF0ZWQuCi0gICAgICovCi0gICAgQE51bGxhYmxlCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24gZ2V0TWVkaWFSb3V0ZUJ1dHRvbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdXR0b247Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiBpcyBiZWluZyBjcmVhdGVkLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgYnV0dG9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUJ1dHRvbiBvbkNyZWF0ZU1lZGlhUm91dGVCdXR0b24oKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUJ1dHRvbihnZXRDb250ZXh0KCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJkZXByZWNhdGlvbiIpCi0gICAgcHVibGljIFZpZXcgb25DcmVhdGVBY3Rpb25WaWV3KCkgewotICAgICAgICBpZiAobUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJvbkNyZWF0ZUFjdGlvblZpZXc6IHRoaXMgQWN0aW9uUHJvdmlkZXIgaXMgYWxyZWFkeSBhc3NvY2lhdGVkICIgKwotICAgICAgICAgICAgICAgICAgICAid2l0aCBhIG1lbnUgaXRlbS4gRG9uJ3QgcmV1c2UgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIGluc3RhbmNlcyEgIiArCi0gICAgICAgICAgICAgICAgICAgICJBYmFuZG9uaW5nIHRoZSBvbGQgbWVudSBpdGVtLi4uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBtQnV0dG9uID0gb25DcmVhdGVNZWRpYVJvdXRlQnV0dG9uKCk7Ci0gICAgICAgIG1CdXR0b24uc2V0Q2hlYXRTaGVldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgIG1CdXR0b24uc2V0Um91dGVTZWxlY3RvcihtU2VsZWN0b3IpOwotICAgICAgICBtQnV0dG9uLnNldERpYWxvZ0ZhY3RvcnkobURpYWxvZ0ZhY3RvcnkpOwotICAgICAgICBtQnV0dG9uLnNldExheW91dFBhcmFtcyhuZXcgVmlld0dyb3VwLkxheW91dFBhcmFtcygKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCwKLSAgICAgICAgICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkpOwotICAgICAgICByZXR1cm4gbUJ1dHRvbjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblBlcmZvcm1EZWZhdWx0QWN0aW9uKCkgewotICAgICAgICBpZiAobUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJ1dHRvbi5zaG93RGlhbG9nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG92ZXJyaWRlc0l0ZW1WaXNpYmlsaXR5KCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1Zpc2libGUoKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGVyLmlzUm91dGVBdmFpbGFibGUobVNlbGVjdG9yLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkFWQUlMQUJJTElUWV9GTEFHX0lHTk9SRV9ERUZBVUxUX1JPVVRFKTsKLSAgICB9Ci0KLSAgICB2b2lkIHJlZnJlc2hSb3V0ZSgpIHsKLSAgICAgICAgcmVmcmVzaFZpc2liaWxpdHkoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8TWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyPiBtUHJvdmlkZXJXZWFrOwotCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlckNhbGxiYWNrKE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlciBwcm92aWRlcikgewotICAgICAgICAgICAgbVByb3ZpZGVyV2VhayA9IG5ldyBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVBY3Rpb25Qcm92aWRlcj4ocHJvdmlkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZShyb3V0ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUocm91dGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKHJvdXRlcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgcmVmcmVzaFJvdXRlKE1lZGlhUm91dGVyIHJvdXRlcikgewotICAgICAgICAgICAgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyIHByb3ZpZGVyID0gbVByb3ZpZGVyV2Vhay5nZXQoKTsKLSAgICAgICAgICAgIGlmIChwcm92aWRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcHJvdmlkZXIucmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJvdXRlci5yZW1vdmVDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUJ1dHRvbi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQnV0dG9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZThhNjMuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQnV0dG9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYXBwLkFjdGl2aXR5OwotaW1wb3J0IGFuZHJvaWQuYXBwLkZyYWdtZW50TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dFdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db2xvclN0YXRlTGlzdDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlJlc291cmNlczsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLlR5cGVkQXJyYXk7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5BbmltYXRpb25EcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQub3MuQXN5bmNUYXNrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5ncmFwaGljcy5kcmF3YWJsZS5EcmF3YWJsZUNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjcud2lkZ2V0LlRvb2x0aXBDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuU291bmRFZmZlY3RDb25zdGFudHM7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci0KLS8qKgotICogVGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiBhbGxvd3MgdGhlIHVzZXIgdG8gc2VsZWN0IHJvdXRlcyBhbmQgdG8gY29udHJvbCB0aGUKLSAqIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4KLSAqIDxwPgotICogVGhlIGFwcGxpY2F0aW9uIG11c3Qgc3BlY2lmeSB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIHVzZXIgc2hvdWxkIGJlIGFsbG93ZWQKLSAqIHRvIHNlbGVjdCBieSBzcGVjaWZ5aW5nIGEge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3Rvcn0gd2l0aCB0aGUKLSAqIHtAbGluayAjc2V0Um91dGVTZWxlY3Rvcn0gbWV0aG9kLgotICogPC9wPjxwPgotICogV2hlbiB0aGUgZGVmYXVsdCByb3V0ZSBpcyBzZWxlY3RlZCBvciB3aGVuIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUgZG9lcyBub3QKLSAqIG1hdGNoIHRoZSB7QGxpbmsgI2dldFJvdXRlU2VsZWN0b3IoKSBzZWxlY3Rvcn0sIHRoZSBidXR0b24gd2lsbCBhcHBlYXIgaW4KLSAqIGFuIGluYWN0aXZlIHN0YXRlIGluZGljYXRpbmcgdGhhdCB0aGUgYXBwbGljYXRpb24gaXMgbm90IGNvbm5lY3RlZCB0byBhCi0gKiByb3V0ZSBvZiB0aGUga2luZCB0aGF0IGl0IHdhbnRzIHRvIHVzZS4gIENsaWNraW5nIG9uIHRoZSBidXR0b24gb3BlbnMKLSAqIGEge0BsaW5rIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nfSB0byBhbGxvdyB0aGUgdXNlciB0byBzZWxlY3QgYSByb3V0ZS4KLSAqIElmIG5vIG5vbi1kZWZhdWx0IHJvdXRlcyBtYXRjaCB0aGUgc2VsZWN0b3IgYW5kIGl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgYW4gYWN0aXZlCi0gKiBzY2FuIHRvIGRpc2NvdmVyIGFueSBtYXRjaGluZyByb3V0ZXMsIHRoZW4gdGhlIGJ1dHRvbiBpcyBkaXNhYmxlZCBhbmQgY2Fubm90Ci0gKiBiZSBjbGlja2VkLgotICogPC9wPjxwPgotICogV2hlbiBhIG5vbi1kZWZhdWx0IHJvdXRlIGlzIHNlbGVjdGVkIHRoYXQgbWF0Y2hlcyB0aGUgc2VsZWN0b3IsIHRoZSBidXR0b24gd2lsbAotICogYXBwZWFyIGluIGFuIGFjdGl2ZSBzdGF0ZSBpbmRpY2F0aW5nIHRoYXQgdGhlIGFwcGxpY2F0aW9uIGlzIGNvbm5lY3RlZAotICogdG8gYSByb3V0ZSBvZiB0aGUga2luZCB0aGF0IGl0IHdhbnRzIHRvIHVzZS4gIFRoZSBidXR0b24gbWF5IGFsc28gYXBwZWFyCi0gKiBpbiBhbiBpbnRlcm1lZGlhcnkgY29ubmVjdGluZyBzdGF0ZSBpZiB0aGUgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZwotICogdG8gdGhlIGRlc3RpbmF0aW9uIGJ1dCBoYXMgbm90IHlldCBjb21wbGV0ZWQgZG9pbmcgc28uICBJbiBlaXRoZXIgY2FzZSwgY2xpY2tpbmcKLSAqIG9uIHRoZSBidXR0b24gb3BlbnMgYSB7QGxpbmsgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2d9IHRvIGFsbG93IHRoZSB1c2VyCi0gKiB0byBjb250cm9sIG9yIGRpc2Nvbm5lY3QgZnJvbSB0aGUgY3VycmVudCByb3V0ZS4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+UHJlcmVxdWlzaXRlczwvaDM+Ci0gKiA8cD4KLSAqIFRvIHVzZSB0aGUgbWVkaWEgcm91dGUgYnV0dG9uLCB0aGUgYWN0aXZpdHkgbXVzdCBiZSBhIHN1YmNsYXNzIG9mCi0gKiB7QGxpbmsgRnJhZ21lbnRBY3Rpdml0eX0gZnJvbSB0aGUgPGNvZGU+YW5kcm9pZC5zdXBwb3J0LnY0PC9jb2RlPgotICogc3VwcG9ydCBsaWJyYXJ5LiAgUmVmZXIgdG8gc3VwcG9ydCBsaWJyYXJ5IGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHMuCi0gKiA8L3A+Ci0gKgotICogQHNlZSBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIKLSAqIEBzZWUgI3NldFJvdXRlU2VsZWN0b3IKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVCdXR0b24gZXh0ZW5kcyBWaWV3IHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVCdXR0b24iOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENIT09TRVJfRlJBR01FTlRfVEFHID0KLSAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWFyb3V0ZXI6TWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudCI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIENPTlRST0xMRVJfRlJBR01FTlRfVEFHID0KLSAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWFyb3V0ZXI6TWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlckNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICBwcml2YXRlIGludCBtUm91dGVDYWxsYmFja0ZsYWdzOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgbURpYWxvZ0ZhY3RvcnkgPSBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5nZXREZWZhdWx0KCk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUF0dGFjaGVkVG9XaW5kb3c7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTcGFyc2VBcnJheTxEcmF3YWJsZS5Db25zdGFudFN0YXRlPiBzUmVtb3RlSW5kaWNhdG9yQ2FjaGUgPQotICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PD4oMik7Ci0gICAgcHJpdmF0ZSBSZW1vdGVJbmRpY2F0b3JMb2FkZXIgbVJlbW90ZUluZGljYXRvckxvYWRlcjsKLSAgICBwcml2YXRlIERyYXdhYmxlIG1SZW1vdGVJbmRpY2F0b3I7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1SZW1vdGVBY3RpdmU7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0Nvbm5lY3Rpbmc7Ci0KLSAgICBwcml2YXRlIENvbG9yU3RhdGVMaXN0IG1CdXR0b25UaW50OwotICAgIHByaXZhdGUgaW50IG1NaW5XaWR0aDsKLSAgICBwcml2YXRlIGludCBtTWluSGVpZ2h0OwotCi0gICAgLy8gVGhlIGNoZWNrZWQgc3RhdGUgaXMgdXNlZCB3aGVuIGNvbm5lY3RlZCB0byBhIHJlbW90ZSByb3V0ZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBDSEVDS0VEX1NUQVRFX1NFVCA9IHsKLSAgICAgICAgYW5kcm9pZC5SLmF0dHIuc3RhdGVfY2hlY2tlZAotICAgIH07Ci0KLSAgICAvLyBUaGUgY2hlY2thYmxlIHN0YXRlIGlzIHVzZWQgd2hpbGUgY29ubmVjdGluZyB0byBhIHJlbW90ZSByb3V0ZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBDSEVDS0FCTEVfU1RBVEVfU0VUID0gewotICAgICAgICBhbmRyb2lkLlIuYXR0ci5zdGF0ZV9jaGVja2FibGUKLSAgICB9OwotCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24oQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24oQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgUi5hdHRyLm1lZGlhUm91dGVCdXR0b25TdHlsZSk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVCdXR0b24oQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKLSAgICAgICAgc3VwZXIoTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5jcmVhdGVUaGVtZWRCdXR0b25Db250ZXh0KGNvbnRleHQpLCBhdHRycywgZGVmU3R5bGVBdHRyKTsKLSAgICAgICAgY29udGV4dCA9IGdldENvbnRleHQoKTsKLQotICAgICAgICBtUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UoY29udGV4dCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlckNhbGxiYWNrKCk7Ci0KLSAgICAgICAgUmVzb3VyY2VzLlRoZW1lIHRoZW1lID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5uZXdUaGVtZSgpOwotICAgICAgICB0aGVtZS5hcHBseVN0eWxlKE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSwgdHJ1ZSk7Ci0gICAgICAgIFR5cGVkQXJyYXkgYSA9IHRoZW1lLm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoYXR0cnMsCi0gICAgICAgICAgICAgICAgUi5zdHlsZWFibGUuTWVkaWFSb3V0ZUJ1dHRvbiwgZGVmU3R5bGVBdHRyLCAwKTsKLQotICAgICAgICBtQnV0dG9uVGludCA9IGEuZ2V0Q29sb3JTdGF0ZUxpc3QoUi5zdHlsZWFibGUuTWVkaWFSb3V0ZUJ1dHRvbl9tZWRpYVJvdXRlQnV0dG9uVGludCk7Ci0gICAgICAgIG1NaW5XaWR0aCA9IGEuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKAotICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b25fYW5kcm9pZF9taW5XaWR0aCwgMCk7Ci0gICAgICAgIG1NaW5IZWlnaHQgPSBhLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLnN0eWxlYWJsZS5NZWRpYVJvdXRlQnV0dG9uX2FuZHJvaWRfbWluSGVpZ2h0LCAwKTsKLSAgICAgICAgaW50IHJlbW90ZUluZGljYXRvclJlc0lkID0gYS5nZXRSZXNvdXJjZUlkKAotICAgICAgICAgICAgICAgIFIuc3R5bGVhYmxlLk1lZGlhUm91dGVCdXR0b25fZXh0ZXJuYWxSb3V0ZUVuYWJsZWREcmF3YWJsZSwgMCk7Ci0gICAgICAgIGEucmVjeWNsZSgpOwotCi0gICAgICAgIGlmIChyZW1vdGVJbmRpY2F0b3JSZXNJZCAhPSAwKSB7Ci0gICAgICAgICAgICBEcmF3YWJsZS5Db25zdGFudFN0YXRlIHJlbW90ZUluZGljYXRvclN0YXRlID0KLSAgICAgICAgICAgICAgICAgICAgc1JlbW90ZUluZGljYXRvckNhY2hlLmdldChyZW1vdGVJbmRpY2F0b3JSZXNJZCk7Ci0gICAgICAgICAgICBpZiAocmVtb3RlSW5kaWNhdG9yU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNldFJlbW90ZUluZGljYXRvckRyYXdhYmxlKHJlbW90ZUluZGljYXRvclN0YXRlLm5ld0RyYXdhYmxlKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yTG9hZGVyID0gbmV3IFJlbW90ZUluZGljYXRvckxvYWRlcihyZW1vdGVJbmRpY2F0b3JSZXNJZCk7Ci0gICAgICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvckxvYWRlci5leGVjdXRlT25FeGVjdXRvcihBc3luY1Rhc2suVEhSRUFEX1BPT0xfRVhFQ1VUT1IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdXBkYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgIHNldENsaWNrYWJsZSh0cnVlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4KLSAgICAgKiBzZWxlY3QgdXNpbmcgdGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgc2V0Um91dGVTZWxlY3RvcihzZWxlY3RvciwgMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuCi0gICAgICogc2VsZWN0IHVzaW5nIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IuCi0gICAgICogQHBhcmFtIGZsYWdzIEZsYWdzIHRvIGNvbnRyb2wgdGhlIGJlaGF2aW9yIG9mIHRoZSBjYWxsYmFjay4gTWF5IGJlIHplcm8gb3IgYSBjb21iaW5hdGlvbiBvZgotICAgICAqICAgICAgICAgICAgICB7QGxpbmsgI01lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTn0gYW5kCi0gICAgICogICAgICAgICAgICAgIHtAbGluayAjTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UU30uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIGludCBmbGFncykgewotICAgICAgICBpZiAobVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikgJiYgbVJvdXRlQ2FsbGJhY2tGbGFncyA9PSBmbGFncykgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsIHx8IHNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgIG1Sb3V0ZUNhbGxiYWNrRmxhZ3MgPSBmbGFnczsKLQotICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2soc2VsZWN0b3IsIG1DYWxsYmFjaywgZmxhZ3MpOwotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSB0byB1c2Ugd2hlbiBzaG93aW5nIHRoZSByb3V0ZSBjaG9vc2VyCi0gICAgICogb3IgY29udHJvbGxlciBkaWFsb2cuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBkaWFsb2cgZmFjdG9yeSwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlhbG9nRmFjdG9yeSBnZXREaWFsb2dGYWN0b3J5KCkgewotICAgICAgICByZXR1cm4gbURpYWxvZ0ZhY3Rvcnk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgZGlhbG9nIGZhY3RvcnkgdG8gdXNlIHdoZW4gc2hvd2luZyB0aGUgcm91dGUgY2hvb3NlcgotICAgICAqIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqCi0gICAgICogQHBhcmFtIGZhY3RvcnkgVGhlIGRpYWxvZyBmYWN0b3J5LCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldERpYWxvZ0ZhY3RvcnkoQE5vbk51bGwgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZmFjdG9yeSkgewotICAgICAgICBpZiAoZmFjdG9yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmYWN0b3J5IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1EaWFsb2dGYWN0b3J5ID0gZmFjdG9yeTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG93IHRoZSByb3V0ZSBjaG9vc2VyIG9yIGNvbnRyb2xsZXIgZGlhbG9nLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBkZWZhdWx0IHJvdXRlIGlzIHNlbGVjdGVkIG9yIGlmIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUgZG9lcwotICAgICAqIG5vdCBtYXRjaCB0aGUge0BsaW5rICNnZXRSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yfSwgdGhlbiBzaG93cyB0aGUgcm91dGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICogT3RoZXJ3aXNlLCBzaG93cyB0aGUgcm91dGUgY29udHJvbGxlciBkaWFsb2cgdG8gb2ZmZXIgdGhlIHVzZXIKLSAgICAgKiBhIGNob2ljZSB0byBkaXNjb25uZWN0IGZyb20gdGhlIHJvdXRlIG9yIHBlcmZvcm0gb3RoZXIgY29udHJvbCBhY3Rpb25zCi0gICAgICogc3VjaCBhcyBzZXR0aW5nIHRoZSByb3V0ZSdzIHZvbHVtZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIGFwcGxpY2F0aW9uIGNhbiBjdXN0b21pemUgdGhlIGRpYWxvZ3MgYnkgY2FsbGluZyB7QGxpbmsgI3NldERpYWxvZ0ZhY3Rvcnl9Ci0gICAgICogdG8gcHJvdmlkZSBhIGN1c3RvbWl6ZWQgZGlhbG9nIGZhY3RvcnkuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZSBkaWFsb2cgd2FzIGFjdHVhbGx5IHNob3duLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlIGFjdGl2aXR5IGlzIG5vdCBhIHN1YmNsYXNzIG9mCi0gICAgICoge0BsaW5rIEZyYWdtZW50QWN0aXZpdHl9LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHNob3dEaWFsb2coKSB7Ci0gICAgICAgIGlmICghbUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIEZyYWdtZW50TWFuYWdlciBmbSA9IGdldEFjdGl2aXR5KCkuZ2V0RnJhZ21lbnRNYW5hZ2VyKCk7Ci0gICAgICAgIGlmIChmbSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGUgYWN0aXZpdHkgbXVzdCBiZSBhIHN1YmNsYXNzIG9mIEZyYWdtZW50QWN0aXZpdHkiKTsKLSAgICAgICAgfQotCi0gICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Sb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICBpZiAocm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSB8fCAhcm91dGUubWF0Y2hlc1NlbGVjdG9yKG1TZWxlY3RvcikpIHsKLSAgICAgICAgICAgIGlmIChmbS5maW5kRnJhZ21lbnRCeVRhZyhDSE9PU0VSX0ZSQUdNRU5UX1RBRykgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgInNob3dEaWFsb2coKTogUm91dGUgY2hvb3NlciBkaWFsb2cgYWxyZWFkeSBzaG93aW5nISIpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQgZiA9Ci0gICAgICAgICAgICAgICAgICAgIG1EaWFsb2dGYWN0b3J5Lm9uQ3JlYXRlQ2hvb3NlckRpYWxvZ0ZyYWdtZW50KCk7Ci0gICAgICAgICAgICBmLnNldFJvdXRlU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAgICAgICAgICAgIGYuc2hvdyhmbSwgQ0hPT1NFUl9GUkFHTUVOVF9UQUcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZtLmZpbmRGcmFnbWVudEJ5VGFnKENPTlRST0xMRVJfRlJBR01FTlRfVEFHKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2hvd0RpYWxvZygpOiBSb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBhbHJlYWR5IHNob3dpbmchIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCBmID0KLSAgICAgICAgICAgICAgICAgICAgbURpYWxvZ0ZhY3Rvcnkub25DcmVhdGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKTsKLSAgICAgICAgICAgIGYuc2hvdyhmbSwgQ09OVFJPTExFUl9GUkFHTUVOVF9UQUcpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotCi0gICAgcHJpdmF0ZSBBY3Rpdml0eSBnZXRBY3Rpdml0eSgpIHsKLSAgICAgICAgLy8gR3Jvc3Mgd2F5IG9mIHVud3JhcHBpbmcgdGhlIEFjdGl2aXR5IHNvIHdlIGNhbiBnZXQgdGhlIEZyYWdtZW50TWFuYWdlcgotICAgICAgICBDb250ZXh0IGNvbnRleHQgPSBnZXRDb250ZXh0KCk7Ci0gICAgICAgIHdoaWxlIChjb250ZXh0IGluc3RhbmNlb2YgQ29udGV4dFdyYXBwZXIpIHsKLSAgICAgICAgICAgIGlmIChjb250ZXh0IGluc3RhbmNlb2YgQWN0aXZpdHkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKEFjdGl2aXR5KWNvbnRleHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjb250ZXh0ID0gKChDb250ZXh0V3JhcHBlciljb250ZXh0KS5nZXRCYXNlQ29udGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0byBlbmFibGUgc2hvd2luZyBhIHRvYXN0IHdpdGggdGhlIGNvbnRlbnQgZGVzY3JpcHRvciBvZiB0aGUKLSAgICAgKiBidXR0b24gd2hlbiB0aGUgYnV0dG9uIGlzIGxvbmcgcHJlc3NlZC4KLSAgICAgKi8KLSAgICB2b2lkIHNldENoZWF0U2hlZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIFRvb2x0aXBDb21wYXQuc2V0VG9vbHRpcFRleHQodGhpcywgZW5hYmxlCi0gICAgICAgICAgICAgICAgPyBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGdldENvbnRleHQoKSkKLSAgICAgICAgICAgICAgICAgICAgLmdldFN0cmluZyhSLnN0cmluZy5tcl9idXR0b25fY29udGVudF9kZXNjcmlwdGlvbikKLSAgICAgICAgICAgICAgICA6IG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHBlcmZvcm1DbGljaygpIHsKLSAgICAgICAgLy8gU2VuZCB0aGUgYXBwcm9wcmlhdGUgYWNjZXNzaWJpbGl0eSBldmVudHMgYW5kIGNhbGwgbGlzdGVuZXJzCi0gICAgICAgIGJvb2xlYW4gaGFuZGxlZCA9IHN1cGVyLnBlcmZvcm1DbGljaygpOwotICAgICAgICBpZiAoIWhhbmRsZWQpIHsKLSAgICAgICAgICAgIHBsYXlTb3VuZEVmZmVjdChTb3VuZEVmZmVjdENvbnN0YW50cy5DTElDSyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNob3dEaWFsb2coKSB8fCBoYW5kbGVkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBpbnRbXSBvbkNyZWF0ZURyYXdhYmxlU3RhdGUoaW50IGV4dHJhU3BhY2UpIHsKLSAgICAgICAgZmluYWwgaW50W10gZHJhd2FibGVTdGF0ZSA9IHN1cGVyLm9uQ3JlYXRlRHJhd2FibGVTdGF0ZShleHRyYVNwYWNlICsgMSk7Ci0KLSAgICAgICAgLy8gVGVjaG5pY2FsbHkgd2Ugc2hvdWxkIGJlIGhhbmRsaW5nIHRoaXMgbW9yZSBjb21wbGV0ZWx5LCBidXQgdGhlc2UKLSAgICAgICAgLy8gYXJlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgaGVyZS4gQ2hlY2thYmxlIGlzIHVzZWQgdG8gZXhwcmVzcyB0aGUgY29ubmVjdGluZwotICAgICAgICAvLyBkcmF3YWJsZSBzdGF0ZSBhbmQgaXQncyBtdXR1YWxseSBleGNsdXNpdmUgd2l0aCBjaGVjayBmb3IgdGhlIHB1cnBvc2VzCi0gICAgICAgIC8vIG9mIHN0YXRlIHNlbGVjdGlvbiBoZXJlLgotICAgICAgICBpZiAobUlzQ29ubmVjdGluZykgewotICAgICAgICAgICAgbWVyZ2VEcmF3YWJsZVN0YXRlcyhkcmF3YWJsZVN0YXRlLCBDSEVDS0FCTEVfU1RBVEVfU0VUKTsKLSAgICAgICAgfSBlbHNlIGlmIChtUmVtb3RlQWN0aXZlKSB7Ci0gICAgICAgICAgICBtZXJnZURyYXdhYmxlU3RhdGVzKGRyYXdhYmxlU3RhdGUsIENIRUNLRURfU1RBVEVfU0VUKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZHJhd2FibGVTdGF0ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBkcmF3YWJsZVN0YXRlQ2hhbmdlZCgpIHsKLSAgICAgICAgc3VwZXIuZHJhd2FibGVTdGF0ZUNoYW5nZWQoKTsKLQotICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRbXSBteURyYXdhYmxlU3RhdGUgPSBnZXREcmF3YWJsZVN0YXRlKCk7Ci0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLnNldFN0YXRlKG15RHJhd2FibGVTdGF0ZSk7Ci0gICAgICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgZHJhd2FibGUgdG8gdXNlIGFzIHRoZSByZW1vdGUgcm91dGUgaW5kaWNhdG9yLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlbW90ZUluZGljYXRvckRyYXdhYmxlKERyYXdhYmxlIGQpIHsKLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3JMb2FkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvckxvYWRlci5jYW5jZWwoZmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5zZXRDYWxsYmFjayhudWxsKTsKLSAgICAgICAgICAgIHVuc2NoZWR1bGVEcmF3YWJsZShtUmVtb3RlSW5kaWNhdG9yKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobUJ1dHRvblRpbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGQgPSBEcmF3YWJsZUNvbXBhdC53cmFwKGQubXV0YXRlKCkpOwotICAgICAgICAgICAgICAgIERyYXdhYmxlQ29tcGF0LnNldFRpbnRMaXN0KGQsIG1CdXR0b25UaW50KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGQuc2V0Q2FsbGJhY2sodGhpcyk7Ci0gICAgICAgICAgICBkLnNldFN0YXRlKGdldERyYXdhYmxlU3RhdGUoKSk7Ci0gICAgICAgICAgICBkLnNldFZpc2libGUoZ2V0VmlzaWJpbGl0eSgpID09IFZJU0lCTEUsIGZhbHNlKTsKLSAgICAgICAgfQotICAgICAgICBtUmVtb3RlSW5kaWNhdG9yID0gZDsKLQotICAgICAgICByZWZyZXNoRHJhd2FibGVTdGF0ZSgpOwotICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cgJiYgbVJlbW90ZUluZGljYXRvciAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgbVJlbW90ZUluZGljYXRvci5nZXRDdXJyZW50KCkgaW5zdGFuY2VvZiBBbmltYXRpb25EcmF3YWJsZSkgewotICAgICAgICAgICAgQW5pbWF0aW9uRHJhd2FibGUgY3VyRHJhd2FibGUgPSAoQW5pbWF0aW9uRHJhd2FibGUpIG1SZW1vdGVJbmRpY2F0b3IuZ2V0Q3VycmVudCgpOwotICAgICAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWN1ckRyYXdhYmxlLmlzUnVubmluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVtb3RlQWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1ckRyYXdhYmxlLmlzUnVubmluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnN0b3AoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY3VyRHJhd2FibGUuc2VsZWN0RHJhd2FibGUoY3VyRHJhd2FibGUuZ2V0TnVtYmVyT2ZGcmFtZXMoKSAtIDEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gdmVyaWZ5RHJhd2FibGUoRHJhd2FibGUgd2hvKSB7Ci0gICAgICAgIHJldHVybiBzdXBlci52ZXJpZnlEcmF3YWJsZSh3aG8pIHx8IHdobyA9PSBtUmVtb3RlSW5kaWNhdG9yOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGp1bXBEcmF3YWJsZXNUb0N1cnJlbnRTdGF0ZSgpIHsKLSAgICAgICAgLy8gV2UgY2FuJ3QgY2FsbCBzdXBlciB0byBoYW5kbGUgdGhlIGJhY2tncm91bmQgc28gd2UgZG8gaXQgb3Vyc2VsdmVzLgotICAgICAgICAvL3N1cGVyLmp1bXBEcmF3YWJsZXNUb0N1cnJlbnRTdGF0ZSgpOwotICAgICAgICBpZiAoZ2V0QmFja2dyb3VuZCgpICE9IG51bGwpIHsKLSAgICAgICAgICAgIERyYXdhYmxlQ29tcGF0Lmp1bXBUb0N1cnJlbnRTdGF0ZShnZXRCYWNrZ3JvdW5kKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSGFuZGxlIG91ciBvd24gcmVtb3RlIGluZGljYXRvci4KLSAgICAgICAgaWYgKG1SZW1vdGVJbmRpY2F0b3IgIT0gbnVsbCkgewotICAgICAgICAgICAgRHJhd2FibGVDb21wYXQuanVtcFRvQ3VycmVudFN0YXRlKG1SZW1vdGVJbmRpY2F0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlzaWJpbGl0eShpbnQgdmlzaWJpbGl0eSkgewotICAgICAgICBzdXBlci5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotCi0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3Iuc2V0VmlzaWJsZShnZXRWaXNpYmlsaXR5KCkgPT0gVklTSUJMRSwgZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLQotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IHRydWU7Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywgbVJvdXRlQ2FsbGJhY2tGbGFncyk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7Ci0gICAgICAgIG1BdHRhY2hlZFRvV2luZG93ID0gZmFsc2U7Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgc3VwZXIub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbk1lYXN1cmUoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICBmaW5hbCBpbnQgd2lkdGhTaXplID0gTWVhc3VyZVNwZWMuZ2V0U2l6ZSh3aWR0aE1lYXN1cmVTcGVjKTsKLSAgICAgICAgZmluYWwgaW50IGhlaWdodFNpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICAgICAgZmluYWwgaW50IHdpZHRoTW9kZSA9IE1lYXN1cmVTcGVjLmdldE1vZGUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgIGZpbmFsIGludCBoZWlnaHRNb2RlID0gTWVhc3VyZVNwZWMuZ2V0TW9kZShoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgZmluYWwgaW50IHdpZHRoID0gTWF0aC5tYXgobU1pbldpZHRoLCBtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwgPwotICAgICAgICAgICAgICAgIG1SZW1vdGVJbmRpY2F0b3IuZ2V0SW50cmluc2ljV2lkdGgoKSArIGdldFBhZGRpbmdMZWZ0KCkgKyBnZXRQYWRkaW5nUmlnaHQoKSA6IDApOwotICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gTWF0aC5tYXgobU1pbkhlaWdodCwgbVJlbW90ZUluZGljYXRvciAhPSBudWxsID8KLSAgICAgICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLmdldEludHJpbnNpY0hlaWdodCgpICsgZ2V0UGFkZGluZ1RvcCgpICsgZ2V0UGFkZGluZ0JvdHRvbSgpIDogMCk7Ci0KLSAgICAgICAgaW50IG1lYXN1cmVkV2lkdGg7Ci0gICAgICAgIHN3aXRjaCAod2lkdGhNb2RlKSB7Ci0gICAgICAgICAgICBjYXNlIE1lYXN1cmVTcGVjLkVYQUNUTFk6Ci0gICAgICAgICAgICAgICAgbWVhc3VyZWRXaWR0aCA9IHdpZHRoU2l6ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuQVRfTU9TVDoKLSAgICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoID0gTWF0aC5taW4od2lkdGhTaXplLCB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRDoKLSAgICAgICAgICAgICAgICBtZWFzdXJlZFdpZHRoID0gd2lkdGg7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbWVhc3VyZWRIZWlnaHQ7Ci0gICAgICAgIHN3aXRjaCAoaGVpZ2h0TW9kZSkgewotICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5FWEFDVExZOgotICAgICAgICAgICAgICAgIG1lYXN1cmVkSGVpZ2h0ID0gaGVpZ2h0U2l6ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVhc3VyZVNwZWMuQVRfTU9TVDoKLSAgICAgICAgICAgICAgICBtZWFzdXJlZEhlaWdodCA9IE1hdGgubWluKGhlaWdodFNpemUsIGhlaWdodCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgY2FzZSBNZWFzdXJlU3BlYy5VTlNQRUNJRklFRDoKLSAgICAgICAgICAgICAgICBtZWFzdXJlZEhlaWdodCA9IGhlaWdodDsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKG1lYXN1cmVkV2lkdGgsIG1lYXN1cmVkSGVpZ2h0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKLQotICAgICAgICBpZiAobVJlbW90ZUluZGljYXRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgbGVmdCA9IGdldFBhZGRpbmdMZWZ0KCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcmlnaHQgPSBnZXRXaWR0aCgpIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgdG9wID0gZ2V0UGFkZGluZ1RvcCgpOwotICAgICAgICAgICAgZmluYWwgaW50IGJvdHRvbSA9IGdldEhlaWdodCgpIC0gZ2V0UGFkZGluZ0JvdHRvbSgpOwotCi0gICAgICAgICAgICBmaW5hbCBpbnQgZHJhd1dpZHRoID0gbVJlbW90ZUluZGljYXRvci5nZXRJbnRyaW5zaWNXaWR0aCgpOwotICAgICAgICAgICAgZmluYWwgaW50IGRyYXdIZWlnaHQgPSBtUmVtb3RlSW5kaWNhdG9yLmdldEludHJpbnNpY0hlaWdodCgpOwotICAgICAgICAgICAgZmluYWwgaW50IGRyYXdMZWZ0ID0gbGVmdCArIChyaWdodCAtIGxlZnQgLSBkcmF3V2lkdGgpIC8gMjsKLSAgICAgICAgICAgIGZpbmFsIGludCBkcmF3VG9wID0gdG9wICsgKGJvdHRvbSAtIHRvcCAtIGRyYXdIZWlnaHQpIC8gMjsKLQotICAgICAgICAgICAgbVJlbW90ZUluZGljYXRvci5zZXRCb3VuZHMoZHJhd0xlZnQsIGRyYXdUb3AsCi0gICAgICAgICAgICAgICAgICAgIGRyYXdMZWZ0ICsgZHJhd1dpZHRoLCBkcmF3VG9wICsgZHJhd0hlaWdodCk7Ci0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yLmRyYXcoY2FudmFzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgcmVmcmVzaFJvdXRlKCkgewotICAgICAgICBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtUm91dGVyLmdldFNlbGVjdGVkUm91dGUoKTsKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc1JlbW90ZSA9ICFyb3V0ZS5pc0RlZmF1bHRPckJsdWV0b290aCgpICYmIHJvdXRlLm1hdGNoZXNTZWxlY3RvcihtU2VsZWN0b3IpOwotICAgICAgICBmaW5hbCBib29sZWFuIGlzQ29ubmVjdGluZyA9IGlzUmVtb3RlICYmIHJvdXRlLmlzQ29ubmVjdGluZygpOwotICAgICAgICBib29sZWFuIG5lZWRzUmVmcmVzaCA9IGZhbHNlOwotICAgICAgICBpZiAobVJlbW90ZUFjdGl2ZSAhPSBpc1JlbW90ZSkgewotICAgICAgICAgICAgbVJlbW90ZUFjdGl2ZSA9IGlzUmVtb3RlOwotICAgICAgICAgICAgbmVlZHNSZWZyZXNoID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlzQ29ubmVjdGluZyAhPSBpc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgIG1Jc0Nvbm5lY3RpbmcgPSBpc0Nvbm5lY3Rpbmc7Ci0gICAgICAgICAgICBuZWVkc1JlZnJlc2ggPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG5lZWRzUmVmcmVzaCkgewotICAgICAgICAgICAgdXBkYXRlQ29udGVudERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgICByZWZyZXNoRHJhd2FibGVTdGF0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtQXR0YWNoZWRUb1dpbmRvdykgewotICAgICAgICAgICAgc2V0RW5hYmxlZChtUm91dGVyLmlzUm91dGVBdmFpbGFibGUobVNlbGVjdG9yLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5BVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURSkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUmVtb3RlSW5kaWNhdG9yICE9IG51bGwKLSAgICAgICAgICAgICAgICAmJiBtUmVtb3RlSW5kaWNhdG9yLmdldEN1cnJlbnQoKSBpbnN0YW5jZW9mIEFuaW1hdGlvbkRyYXdhYmxlKSB7Ci0gICAgICAgICAgICBBbmltYXRpb25EcmF3YWJsZSBjdXJEcmF3YWJsZSA9IChBbmltYXRpb25EcmF3YWJsZSkgbVJlbW90ZUluZGljYXRvci5nZXRDdXJyZW50KCk7Ci0gICAgICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgICAgICBpZiAoKG5lZWRzUmVmcmVzaCB8fCBpc0Nvbm5lY3RpbmcpICYmICFjdXJEcmF3YWJsZS5pc1J1bm5pbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zdGFydCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNSZW1vdGUgJiYgIWlzQ29ubmVjdGluZykgewotICAgICAgICAgICAgICAgIC8vIFdoZW4gdGhlIHJvdXRlIGlzIGFscmVhZHkgY29ubmVjdGVkIGJlZm9yZSB0aGUgdmlldyBpcyBhdHRhY2hlZCwgc2hvdyB0aGUgbGFzdAotICAgICAgICAgICAgICAgIC8vIGZyYW1lIG9mIHRoZSBjb25uZWN0ZWQgYW5pbWF0aW9uIGltbWVkaWF0ZWx5LgotICAgICAgICAgICAgICAgIGlmIChjdXJEcmF3YWJsZS5pc1J1bm5pbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBjdXJEcmF3YWJsZS5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1ckRyYXdhYmxlLnNlbGVjdERyYXdhYmxlKGN1ckRyYXdhYmxlLmdldE51bWJlck9mRnJhbWVzKCkgLSAxKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVDb250ZW50RGVzY3JpcHRpb24oKSB7Ci0gICAgICAgIGludCByZXNJZDsKLSAgICAgICAgaWYgKG1Jc0Nvbm5lY3RpbmcpIHsKLSAgICAgICAgICAgIHJlc0lkID0gUi5zdHJpbmcubXJfY2FzdF9idXR0b25fY29ubmVjdGluZzsKLSAgICAgICAgfSBlbHNlIGlmIChtUmVtb3RlQWN0aXZlKSB7Ci0gICAgICAgICAgICByZXNJZCA9IFIuc3RyaW5nLm1yX2Nhc3RfYnV0dG9uX2Nvbm5lY3RlZDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc0lkID0gUi5zdHJpbmcubXJfY2FzdF9idXR0b25fZGlzY29ubmVjdGVkOwotICAgICAgICB9Ci0gICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGdldENvbnRleHQoKSkuZ2V0U3RyaW5nKHJlc0lkKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZXIuQ2FsbGJhY2sgewotICAgICAgICBNZWRpYVJvdXRlckNhbGxiYWNrKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHByb3ZpZGVyKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlckNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Qcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBSZW1vdGVJbmRpY2F0b3JMb2FkZXIgZXh0ZW5kcyBBc3luY1Rhc2s8Vm9pZCwgVm9pZCwgRHJhd2FibGU+IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbVJlc0lkOwotCi0gICAgICAgIFJlbW90ZUluZGljYXRvckxvYWRlcihpbnQgcmVzSWQpIHsKLSAgICAgICAgICAgIG1SZXNJZCA9IHJlc0lkOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBEcmF3YWJsZSBkb0luQmFja2dyb3VuZChWb2lkLi4uIHBhcmFtcykgewotICAgICAgICAgICAgcmV0dXJuIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoZ2V0Q29udGV4dCgpKS5nZXREcmF3YWJsZShtUmVzSWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUG9zdEV4ZWN1dGUoRHJhd2FibGUgcmVtb3RlSW5kaWNhdG9yKSB7Ci0gICAgICAgICAgICBjYWNoZUFuZFJlc2V0KHJlbW90ZUluZGljYXRvcik7Ci0gICAgICAgICAgICBzZXRSZW1vdGVJbmRpY2F0b3JEcmF3YWJsZShyZW1vdGVJbmRpY2F0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uQ2FuY2VsbGVkKERyYXdhYmxlIHJlbW90ZUluZGljYXRvcikgewotICAgICAgICAgICAgY2FjaGVBbmRSZXNldChyZW1vdGVJbmRpY2F0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIGNhY2hlQW5kUmVzZXQoRHJhd2FibGUgcmVtb3RlSW5kaWNhdG9yKSB7Ci0gICAgICAgICAgICBpZiAocmVtb3RlSW5kaWNhdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzUmVtb3RlSW5kaWNhdG9yQ2FjaGUucHV0KG1SZXNJZCwgcmVtb3RlSW5kaWNhdG9yLmdldENvbnN0YW50U3RhdGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtUmVtb3RlSW5kaWNhdG9yTG9hZGVyID0gbnVsbDsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FjNjRkOS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5DT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQub3MuU3lzdGVtQ2xvY2s7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5BcHBDb21wYXREaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC50ZXh0LlRleHRVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5Db250ZXh0VGhlbWVXcmFwcGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5HcmF2aXR5OwotaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFkYXB0ZXJWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5JbWFnZVZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuVGV4dFZpZXc7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVNlbGVjdG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBmb3Ige0BsaW5rIE1lZGlhUm91dGVyfS4KLSAqIDxwPgotICogVGhpcyBkaWFsb2cgYWxsb3dzIHRoZSB1c2VyIHRvIGNob29zZSBhIHJvdXRlIHRoYXQgbWF0Y2hlcyBhIGdpdmVuIHNlbGVjdG9yLgotICogPC9wPgotICoKLSAqIEBzZWUgTWVkaWFSb3V0ZUJ1dHRvbgotICogQHNlZSBNZWRpYVJvdXRlQWN0aW9uUHJvdmlkZXIKLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nIGV4dGVuZHMgRGlhbG9nIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyI7Ci0KLSAgICAvLyBEbyBub3QgdXBkYXRlIHRoZSByb3V0ZSBsaXN0IGltbWVkaWF0ZWx5IHRvIGF2b2lkIHVubmF0dXJhbCBkaWFsb2cgY2hhbmdlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgVVBEQVRFX1JPVVRFU19ERUxBWV9NUyA9IDMwMEw7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNU0dfVVBEQVRFX1JPVVRFUyA9IDE7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlckNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlVmlldzsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtUm91dGVzOwotICAgIHByaXZhdGUgUm91dGVBZGFwdGVyIG1BZGFwdGVyOwotICAgIHByaXZhdGUgTGlzdFZpZXcgbUxpc3RWaWV3OwotICAgIHByaXZhdGUgYm9vbGVhbiBtQXR0YWNoZWRUb1dpbmRvdzsKLSAgICBwcml2YXRlIGxvbmcgbUxhc3RVcGRhdGVUaW1lOwotICAgIHByaXZhdGUgZmluYWwgSGFuZGxlciBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobWVzc2FnZS53aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBNU0dfVVBEQVRFX1JPVVRFUzoKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlUm91dGVzKChMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4pIG1lc3NhZ2Uub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyhDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZSkgewotICAgICAgICAvLyBUT0RPIChiLzcyOTc1OTc2KTogQXZvaWQgdG8gdXNlIENvbnRleHRUaGVtZVdyYXBwZXIgd2l0aCBhcHAgY29udGV4dCBhbmQgbGliIHRoZW1lLgotICAgICAgICBzdXBlcihuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpKSwgdGhlbWUpOwotICAgICAgICBjb250ZXh0ID0gZ2V0Q29udGV4dCgpOwotCi0gICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgICAgbUNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyQ2FsbGJhY2soKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdGhhdCB0aGUgdXNlciBjYW4gc2VsZWN0LgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2VsZWN0b3IsIG5ldmVyIG51bGwuCi0gICAgICovCi0gICAgQE5vbk51bGwKLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3I7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuIHNlbGVjdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IsIG11c3Qgbm90IGJlIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotCi0gICAgICAgICAgICBpZiAobUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhzZWxlY3RvciwgbUNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVmcmVzaFJvdXRlcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIGZpbHRlciB0aGUgc2V0IG9mIHJvdXRlcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpdGVyYXRlcyBvdmVyIGFsbCByb3V0ZXMgaW4gdGhlIHByb3ZpZGVkIGxpc3QgYW5kCi0gICAgICogcmVtb3ZlcyB0aG9zZSBmb3Igd2hpY2gge0BsaW5rICNvbkZpbHRlclJvdXRlfSByZXR1cm5zIGZhbHNlLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb3V0ZXMgVGhlIGxpc3Qgb2Ygcm91dGVzIHRvIGZpbHRlciBpbi1wbGFjZSwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkZpbHRlclJvdXRlcyhATm9uTnVsbCBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSByb3V0ZXMuc2l6ZSgpOyBpLS0gPiAwOyApIHsKLSAgICAgICAgICAgIGlmICghb25GaWx0ZXJSb3V0ZShyb3V0ZXMuZ2V0KGkpKSkgewotICAgICAgICAgICAgICAgIHJvdXRlcy5yZW1vdmUoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbGlzdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHRydWUgZm9yIGVuYWJsZWQgbm9uLWRlZmF1bHQgcm91dGVzIHRoYXQKLSAgICAgKiBtYXRjaCB0aGUgc2VsZWN0b3IuICBTdWJjbGFzc2VzIGNhbiBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBmaWx0ZXIgcm91dGVzCi0gICAgICogZGlmZmVyZW50bHkuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0byBjb25zaWRlciwgbmV2ZXIgbnVsbC4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgY2hvb3NlciBkaWFsb2cuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gb25GaWx0ZXJSb3V0ZShATm9uTnVsbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgcmV0dXJuICFyb3V0ZS5pc0RlZmF1bHRPckJsdWV0b290aCgpICYmIHJvdXRlLmlzRW5hYmxlZCgpCi0gICAgICAgICAgICAgICAgJiYgcm91dGUubWF0Y2hlc1NlbGVjdG9yKG1TZWxlY3Rvcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGUoQ2hhclNlcXVlbmNlIHRpdGxlKSB7Ci0gICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VGl0bGUoaW50IHRpdGxlSWQpIHsKLSAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KHRpdGxlSWQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgc3VwZXIub25DcmVhdGUoc2F2ZWRJbnN0YW5jZVN0YXRlKTsKLQotICAgICAgICBzZXRDb250ZW50VmlldyhBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChnZXRDb250ZXh0KCksIEFwaUhlbHBlci5nZXRMaWJUaGVtZShnZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGdldENvbnRleHQoKSkpLAotICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1yX2Nob29zZXJfZGlhbG9nKSk7Ci0KLSAgICAgICAgbVJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBtQWRhcHRlciA9IG5ldyBSb3V0ZUFkYXB0ZXIoZ2V0Q29udGV4dCgpLCBtUm91dGVzKTsKLSAgICAgICAgbUxpc3RWaWV3ID0gKExpc3RWaWV3KWZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfbGlzdCk7Ci0gICAgICAgIG1MaXN0Vmlldy5zZXRBZGFwdGVyKG1BZGFwdGVyKTsKLSAgICAgICAgbUxpc3RWaWV3LnNldE9uSXRlbUNsaWNrTGlzdGVuZXIobUFkYXB0ZXIpOwotICAgICAgICBtTGlzdFZpZXcuc2V0RW1wdHlWaWV3KGZpbmRWaWV3QnlJZChhbmRyb2lkLlIuaWQuZW1wdHkpKTsKLSAgICAgICAgbVRpdGxlVmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfdGl0bGUpOwotCi0gICAgICAgIHVwZGF0ZUxheW91dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBkaWFsb2cuIEFsc28gY2FsbGVkIHdoZW4gY29uZmlndXJhdGlvbiBjaGFuZ2VzLgotICAgICAqLwotICAgIHZvaWQgdXBkYXRlTGF5b3V0KCkgewotICAgICAgICBnZXRXaW5kb3coKS5zZXRMYXlvdXQoTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXREaWFsb2dXaWR0aChnZXRDb250ZXh0KCkpLAotICAgICAgICAgICAgICAgIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMuV1JBUF9DT05URU5UKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7Ci0gICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvdygpOwotCi0gICAgICAgIG1BdHRhY2hlZFRvV2luZG93ID0gdHJ1ZTsKLSAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhtU2VsZWN0b3IsIG1DYWxsYmFjaywgTWVkaWFSb3V0ZXIuQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOKTsKLSAgICAgICAgcmVmcmVzaFJvdXRlcygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IGZhbHNlOwotICAgICAgICBtUm91dGVyLnJlbW92ZUNhbGxiYWNrKG1DYWxsYmFjayk7Ci0gICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19VUERBVEVfUk9VVEVTKTsKLQotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZnJlc2hlcyB0aGUgbGlzdCBvZiByb3V0ZXMgdGhhdCBhcmUgc2hvd24gaW4gdGhlIGNob29zZXIgZGlhbG9nLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlZnJlc2hSb3V0ZXMoKSB7Ci0gICAgICAgIGlmIChtQXR0YWNoZWRUb1dpbmRvdykgewotICAgICAgICAgICAgQXJyYXlMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzID0gbmV3IEFycmF5TGlzdDw+KG1Sb3V0ZXIuZ2V0Um91dGVzKCkpOwotICAgICAgICAgICAgb25GaWx0ZXJSb3V0ZXMocm91dGVzKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnNvcnQocm91dGVzLCBSb3V0ZUNvbXBhcmF0b3Iuc0luc3RhbmNlKTsKLSAgICAgICAgICAgIGlmIChTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKSAtIG1MYXN0VXBkYXRlVGltZSA+PSBVUERBVEVfUk9VVEVTX0RFTEFZX01TKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUm91dGVzKHJvdXRlcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1IYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKE1TR19VUERBVEVfUk9VVEVTKTsKLSAgICAgICAgICAgICAgICBtSGFuZGxlci5zZW5kTWVzc2FnZUF0VGltZShtSGFuZGxlci5vYnRhaW5NZXNzYWdlKE1TR19VUERBVEVfUk9VVEVTLCByb3V0ZXMpLAotICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RVcGRhdGVUaW1lICsgVVBEQVRFX1JPVVRFU19ERUxBWV9NUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZVJvdXRlcyhMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzKSB7Ci0gICAgICAgIG1MYXN0VXBkYXRlVGltZSA9IFN5c3RlbUNsb2NrLnVwdGltZU1pbGxpcygpOwotICAgICAgICBtUm91dGVzLmNsZWFyKCk7Ci0gICAgICAgIG1Sb3V0ZXMuYWRkQWxsKHJvdXRlcyk7Ci0gICAgICAgIG1BZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBSb3V0ZUFkYXB0ZXIgZXh0ZW5kcyBBcnJheUFkYXB0ZXI8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPgotICAgICAgICAgICAgaW1wbGVtZW50cyBMaXN0Vmlldy5Pbkl0ZW1DbGlja0xpc3RlbmVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEcmF3YWJsZSBtRGVmYXVsdEljb247Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbVR2SWNvbjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBEcmF3YWJsZSBtU3BlYWtlckljb247Ci0gICAgICAgIHByaXZhdGUgZmluYWwgRHJhd2FibGUgbVNwZWFrZXJHcm91cEljb247Ci0KLSAgICAgICAgcHVibGljIFJvdXRlQWRhcHRlcihDb250ZXh0IGNvbnRleHQsIExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiByb3V0ZXMpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIDAsIHJvdXRlcyk7Ci0KLSAgICAgICAgICAgIFR5cGVkQXJyYXkgc3R5bGVkQXR0cmlidXRlcyA9IEFwaUhlbHBlci5nZXRMaWJUaGVtZShjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpLm9idGFpblN0eWxlZEF0dHJpYnV0ZXMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IGludFtdIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5hdHRyLm1lZGlhUm91dGVEZWZhdWx0SWNvbkRyYXdhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmF0dHIubWVkaWFSb3V0ZVR2SWNvbkRyYXdhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSLmF0dHIubWVkaWFSb3V0ZVNwZWFrZXJJY29uRHJhd2FibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuYXR0ci5tZWRpYVJvdXRlU3BlYWtlckdyb3VwSWNvbkRyYXdhYmxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0KLSAgICAgICAgICAgIG1EZWZhdWx0SWNvbiA9IHN0eWxlZEF0dHJpYnV0ZXMuZ2V0RHJhd2FibGUoMCk7Ci0gICAgICAgICAgICBtVHZJY29uID0gc3R5bGVkQXR0cmlidXRlcy5nZXREcmF3YWJsZSgxKTsKLSAgICAgICAgICAgIG1TcGVha2VySWNvbiA9IHN0eWxlZEF0dHJpYnV0ZXMuZ2V0RHJhd2FibGUoMik7Ci0gICAgICAgICAgICBtU3BlYWtlckdyb3VwSWNvbiA9IHN0eWxlZEF0dHJpYnV0ZXMuZ2V0RHJhd2FibGUoMyk7Ci0gICAgICAgICAgICBzdHlsZWRBdHRyaWJ1dGVzLnJlY3ljbGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhcmVBbGxJdGVtc0VuYWJsZWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGdldEl0ZW0ocG9zaXRpb24pLmlzRW5hYmxlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBWaWV3IHZpZXcgPSBjb252ZXJ0VmlldzsKLSAgICAgICAgICAgIGlmICh2aWV3ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2aWV3ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQoZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlRoZW1lKGdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXRSb3V0ZXJUaGVtZUlkKGdldENvbnRleHQoKSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQubXJfY2hvb3Nlcl9saXN0X2l0ZW0sIHBhcmVudCwgZmFsc2UpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBnZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIFRleHRWaWV3IHRleHQxID0gKFRleHRWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfcm91dGVfbmFtZSk7Ci0gICAgICAgICAgICBUZXh0VmlldyB0ZXh0MiA9IChUZXh0Vmlldykgdmlldy5maW5kVmlld0J5SWQoUi5pZC5tcl9jaG9vc2VyX3JvdXRlX2Rlc2MpOwotICAgICAgICAgICAgdGV4dDEuc2V0VGV4dChyb3V0ZS5nZXROYW1lKCkpOwotICAgICAgICAgICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gcm91dGUuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaXNDb25uZWN0ZWRPckNvbm5lY3RpbmcgPQotICAgICAgICAgICAgICAgICAgICByb3V0ZS5nZXRDb25uZWN0aW9uU3RhdGUoKSA9PSBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHJvdXRlLmdldENvbm5lY3Rpb25TdGF0ZSgpID09IENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORzsKLSAgICAgICAgICAgIGlmIChpc0Nvbm5lY3RlZE9yQ29ubmVjdGluZyAmJiAhVGV4dFV0aWxzLmlzRW1wdHkoZGVzY3JpcHRpb24pKSB7Ci0gICAgICAgICAgICAgICAgdGV4dDEuc2V0R3Jhdml0eShHcmF2aXR5LkJPVFRPTSk7Ci0gICAgICAgICAgICAgICAgdGV4dDIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIHRleHQyLnNldFRleHQoZGVzY3JpcHRpb24pOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0ZXh0MS5zZXRHcmF2aXR5KEdyYXZpdHkuQ0VOVEVSX1ZFUlRJQ0FMKTsKLSAgICAgICAgICAgICAgICB0ZXh0Mi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgdGV4dDIuc2V0VGV4dCgiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2aWV3LnNldEVuYWJsZWQocm91dGUuaXNFbmFibGVkKCkpOwotCi0gICAgICAgICAgICBJbWFnZVZpZXcgaWNvblZpZXcgPSAoSW1hZ2VWaWV3KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLm1yX2Nob29zZXJfcm91dGVfaWNvbik7Ci0gICAgICAgICAgICBpZiAoaWNvblZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGljb25WaWV3LnNldEltYWdlRHJhd2FibGUoZ2V0SWNvbkRyYXdhYmxlKHJvdXRlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdmlldzsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBnZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5pc0VuYWJsZWQoKSkgewotICAgICAgICAgICAgICAgIHJvdXRlLnNlbGVjdCgpOwotICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgRHJhd2FibGUgZ2V0SWNvbkRyYXdhYmxlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgVXJpIGljb25VcmkgPSByb3V0ZS5nZXRJY29uVXJpKCk7Ci0gICAgICAgICAgICBpZiAoaWNvblVyaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gaXMgPSBnZXRDb250ZXh0KCkuZ2V0Q29udGVudFJlc29sdmVyKCkub3BlbklucHV0U3RyZWFtKGljb25VcmkpOwotICAgICAgICAgICAgICAgICAgICBEcmF3YWJsZSBkcmF3YWJsZSA9IERyYXdhYmxlLmNyZWF0ZUZyb21TdHJlYW0oaXMsIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZHJhd2FibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRyYXdhYmxlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJGYWlsZWQgdG8gbG9hZCAiICsgaWNvblVyaSwgZSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZhbGxzIGJhY2suCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGdldERlZmF1bHRJY29uRHJhd2FibGUocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBEcmF3YWJsZSBnZXREZWZhdWx0SWNvbkRyYXdhYmxlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgLy8gSWYgdGhlIHR5cGUgb2YgdGhlIHJlY2VpdmVyIGRldmljZSBpcyBzcGVjaWZpZWQsIHVzZSBpdC4KLSAgICAgICAgICAgIHN3aXRjaCAocm91dGUuZ2V0RGV2aWNlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLkRFVklDRV9UWVBFX1RWOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVR2SWNvbjsKLSAgICAgICAgICAgICAgICBjYXNlIE1lZGlhUm91dGVyLlJvdXRlSW5mby5ERVZJQ0VfVFlQRV9TUEVBS0VSOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVNwZWFrZXJJY29uOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBPdGhlcndpc2UsIG1ha2UgdGhlIGJlc3QgZ3Vlc3MgYmFzZWQgb24gb3RoZXIgcm91dGUgaW5mb3JtYXRpb24uCi0gICAgICAgICAgICBpZiAocm91dGUgaW5zdGFuY2VvZiBNZWRpYVJvdXRlci5Sb3V0ZUdyb3VwKSB7Ci0gICAgICAgICAgICAgICAgLy8gT25seSBzcGVha2VycyBjYW4gYmUgZ3JvdXBlZCBmb3Igbm93LgotICAgICAgICAgICAgICAgIHJldHVybiBtU3BlYWtlckdyb3VwSWNvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtRGVmYXVsdEljb247Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlci5DYWxsYmFjayB7Ci0gICAgICAgIE1lZGlhUm91dGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIHJlZnJlc2hSb3V0ZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBpbmZvKSB7Ci0gICAgICAgICAgICByZWZyZXNoUm91dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gaW5mbykgewotICAgICAgICAgICAgcmVmcmVzaFJvdXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgZGlzbWlzcygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlQ29tcGFyYXRvciBpbXBsZW1lbnRzIENvbXBhcmF0b3I8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgUm91dGVDb21wYXJhdG9yIHNJbnN0YW5jZSA9IG5ldyBSb3V0ZUNvbXBhcmF0b3IoKTsKLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBjb21wYXJlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyBsaHMsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByaHMpIHsKLSAgICAgICAgICAgIHJldHVybiBsaHMuZ2V0TmFtZSgpLmNvbXBhcmVUb0lnbm9yZUNhc2UocmhzLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NWU2YjI5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuRGlhbG9nRnJhZ21lbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5Db25maWd1cmF0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci0KLS8qKgotICogTWVkaWEgcm91dGUgY2hvb3NlciBkaWFsb2cgZnJhZ21lbnQuCi0gKiA8cD4KLSAqIENyZWF0ZXMgYSB7QGxpbmsgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2d9LiAgVGhlIGFwcGxpY2F0aW9uIG1heSBzdWJjbGFzcwotICogdGhpcyBkaWFsb2cgZnJhZ21lbnQgdG8gY3VzdG9taXplIHRoZSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQgZXh0ZW5kcyBEaWFsb2dGcmFnbWVudCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfU0VMRUNUT1IgPSAic2VsZWN0b3IiOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZyBtRGlhbG9nOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBjaG9vc2VyIGRpYWxvZyBmcmFnbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBBbGwgc3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzIG11c3QgYWxzbyBwb3NzZXNzIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQoKSB7Ci0gICAgICAgIHNldENhbmNlbGFibGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRoYXQgdGhlIHVzZXIgY2FuIHNlbGVjdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHNlbGVjdG9yLCBuZXZlciBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZ2V0Um91dGVTZWxlY3RvcigpIHsKLSAgICAgICAgZW5zdXJlUm91dGVTZWxlY3RvcigpOwotICAgICAgICByZXR1cm4gbVNlbGVjdG9yOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSb3V0ZVNlbGVjdG9yKCkgewotICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gZ2V0QXJndW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAoYXJncyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLmZyb21CdW5kbGUoYXJncy5nZXRCdW5kbGUoQVJHVU1FTlRfU0VMRUNUT1IpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtU2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGZvciBmaWx0ZXJpbmcgdGhlIHJvdXRlcyB0aGF0IHRoZSB1c2VyIGNhbiBzZWxlY3QuCi0gICAgICogVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmcmFnbWVudCBpcyBhZGRlZC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gc2V0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBlbnN1cmVSb3V0ZVNlbGVjdG9yKCk7Ci0gICAgICAgIGlmICghbVNlbGVjdG9yLmVxdWFscyhzZWxlY3RvcikpIHsKLSAgICAgICAgICAgIG1TZWxlY3RvciA9IHNlbGVjdG9yOwotCi0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOwotICAgICAgICAgICAgaWYgKGFyZ3MgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFyZ3MgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhcmdzLnB1dEJ1bmRsZShBUkdVTUVOVF9TRUxFQ1RPUiwgc2VsZWN0b3IuYXNCdW5kbGUoKSk7Ci0gICAgICAgICAgICBzZXRBcmd1bWVudHMoYXJncyk7Ci0KLSAgICAgICAgICAgIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nIGRpYWxvZyA9IChNZWRpYVJvdXRlQ2hvb3NlckRpYWxvZylnZXREaWFsb2coKTsKLSAgICAgICAgICAgIGlmIChkaWFsb2cgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGRpYWxvZy5zZXRSb3V0ZVNlbGVjdG9yKHNlbGVjdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjaG9vc2VyIGRpYWxvZyBpcyBiZWluZyBjcmVhdGVkLgotICAgICAqIDxwPgotICAgICAqIFN1YmNsYXNzZXMgbWF5IG92ZXJyaWRlIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB0aGUgZGlhbG9nLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2cgb25DcmVhdGVDaG9vc2VyRGlhbG9nKAotICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0LCBCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2coY29udGV4dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIERpYWxvZyBvbkNyZWF0ZURpYWxvZyhCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIG1EaWFsb2cgPSBvbkNyZWF0ZUNob29zZXJEaWFsb2coZ2V0Q29udGV4dCgpLCBzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBtRGlhbG9nLnNldFJvdXRlU2VsZWN0b3IoZ2V0Um91dGVTZWxlY3RvcigpKTsKLSAgICAgICAgcmV0dXJuIG1EaWFsb2c7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7Ci0gICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1EaWFsb2cudXBkYXRlTGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2MGNmY2EuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgc3RhdGljIGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGVDb21wYXQuQUNUSU9OX1BBVVNFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9QTEFZOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9QTEFZX1BBVVNFOwotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5QbGF5YmFja1N0YXRlQ29tcGF0LkFDVElPTl9TVE9QOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuQWxlcnREaWFsb2c7Ci1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwRmFjdG9yeTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlJlY3Q7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLm5ldC5Vcmk7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Bc3luY1Rhc2s7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5SZW1vdGVFeGNlcHRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuTWVkaWFEZXNjcmlwdGlvbkNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuTWVkaWFNZXRhZGF0YUNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXJDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0Lm1lZGlhLnNlc3Npb24uTWVkaWFTZXNzaW9uQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5zZXNzaW9uLlBsYXliYWNrU3RhdGVDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuT2JqZWN0c0NvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudENvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjcuZ3JhcGhpY3MuUGFsZXR0ZTsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkNvbnRleHRUaGVtZVdyYXBwZXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LktleUV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5MYXlvdXRJbmZsYXRlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldy5NZWFzdXJlU3BlYzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3VHJlZU9ic2VydmVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlFdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYWNjZXNzaWJpbGl0eS5BY2Nlc3NpYmlsaXR5TWFuYWdlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uQWxwaGFBbmltYXRpb247Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb247Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25TZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LmFuaW1hdGlvbi5BbmltYXRpb25VdGlsczsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLlRyYW5zZm9ybWF0aW9uOwotaW1wb3J0IGFuZHJvaWQudmlldy5hbmltYXRpb24uVHJhbnNsYXRlQW5pbWF0aW9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5CdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VCdXR0b247Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuSW1hZ2VWaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkxpbmVhckxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5SZWxhdGl2ZUxheW91dDsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVTZWxlY3RvcjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwLk92ZXJsYXlMaXN0Vmlldy5PdmVybGF5T2JqZWN0OwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuY29uY3VycmVudC5UaW1lVW5pdDsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGltcGxlbWVudHMgdGhlIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIGZvciB7QGxpbmsgTWVkaWFSb3V0ZXJ9LgotICogPHA+Ci0gKiBUaGlzIGRpYWxvZyBhbGxvd3MgdGhlIHVzZXIgdG8gY29udHJvbCBvciBkaXNjb25uZWN0IGZyb20gdGhlIGN1cnJlbnRseSBzZWxlY3RlZCByb3V0ZS4KLSAqIDwvcD4KLSAqCi0gKiBAc2VlIE1lZGlhUm91dGVCdXR0b24KLSAqIEBzZWUgTWVkaWFSb3V0ZUFjdGlvblByb3ZpZGVyCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyBleHRlbmRzIEFsZXJ0RGlhbG9nIHsKLSAgICAvLyBUYWdzIHNob3VsZCBiZSBsZXNzIHRoYW4gMjQgY2hhcmFjdGVycyBsb25nIChzZWUgZG9jcyBmb3IgYW5kcm9pZC51dGlsLkxvZy5pc0xvZ2dhYmxlKCkpCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZUN0cmxEaWFsb2ciOwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotCi0gICAgLy8gVGltZSB0byB3YWl0IGJlZm9yZSB1cGRhdGluZyB0aGUgdm9sdW1lIHdoZW4gdGhlIHVzZXIgbGV0cyBnbyBvZiB0aGUgc2VlayBiYXIKLSAgICAvLyB0byBhbGxvdyB0aGUgcm91dGUgcHJvdmlkZXIgdGltZSB0byBwcm9wYWdhdGUgdGhlIGNoYW5nZSBhbmQgcHVibGlzaCBhIG5ldwotICAgIC8vIHJvdXRlIGRlc2NyaXB0b3IuCi0gICAgc3RhdGljIGZpbmFsIGludCBWT0xVTUVfVVBEQVRFX0RFTEFZX01JTExJUyA9IDUwMDsKLSAgICBzdGF0aWMgZmluYWwgaW50IENPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVMgPSAoaW50KSBUaW1lVW5pdC5TRUNPTkRTLnRvTWlsbGlzKDMwTCk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVUVE9OX05FVVRSQUxfUkVTX0lEID0gYW5kcm9pZC5SLmlkLmJ1dHRvbjM7Ci0gICAgc3RhdGljIGZpbmFsIGludCBCVVRUT05fRElTQ09OTkVDVF9SRVNfSUQgPSBhbmRyb2lkLlIuaWQuYnV0dG9uMjsKLSAgICBzdGF0aWMgZmluYWwgaW50IEJVVFRPTl9TVE9QX1JFU19JRCA9IGFuZHJvaWQuUi5pZC5idXR0b24xOwotCi0gICAgZmluYWwgTWVkaWFSb3V0ZXIgbVJvdXRlcjsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyQ2FsbGJhY2sgbUNhbGxiYWNrOwotICAgIGZpbmFsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBtUm91dGU7Ci0KLSAgICBDb250ZXh0IG1Db250ZXh0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtQ3JlYXRlZDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUF0dGFjaGVkVG9XaW5kb3c7Ci0KLSAgICBwcml2YXRlIGludCBtRGlhbG9nQ29udGVudFdpZHRoOwotCi0gICAgcHJpdmF0ZSBWaWV3IG1DdXN0b21Db250cm9sVmlldzsKLQotICAgIHByaXZhdGUgQnV0dG9uIG1EaXNjb25uZWN0QnV0dG9uOwotICAgIHByaXZhdGUgQnV0dG9uIG1TdG9wQ2FzdGluZ0J1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1QbGF5YmFja0NvbnRyb2xCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtQ2xvc2VCdXR0b247Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24gbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b247Ci0KLSAgICBwcml2YXRlIEZyYW1lTGF5b3V0IG1FeHBhbmRhYmxlQXJlYUxheW91dDsKLSAgICBwcml2YXRlIExpbmVhckxheW91dCBtRGlhbG9nQXJlYUxheW91dDsKLSAgICBGcmFtZUxheW91dCBtRGVmYXVsdENvbnRyb2xMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBGcmFtZUxheW91dCBtQ3VzdG9tQ29udHJvbExheW91dDsKLSAgICBwcml2YXRlIEltYWdlVmlldyBtQXJ0VmlldzsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1UaXRsZVZpZXc7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtU3VidGl0bGVWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVJvdXRlTmFtZVRleHRWaWV3OwotCi0gICAgcHJpdmF0ZSBib29sZWFuIG1Wb2x1bWVDb250cm9sRW5hYmxlZCA9IHRydWU7Ci0gICAgLy8gTGF5b3V0IGZvciBtZWRpYSBjb250cm9sbGVycyBpbmNsdWRpbmcgcGxheS9wYXVzZSBidXR0b24gYW5kIHRoZSBtYWluIHZvbHVtZSBzbGlkZXIuCi0gICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQ7Ci0gICAgcHJpdmF0ZSBSZWxhdGl2ZUxheW91dCBtUGxheWJhY2tDb250cm9sTGF5b3V0OwotICAgIHByaXZhdGUgTGluZWFyTGF5b3V0IG1Wb2x1bWVDb250cm9sTGF5b3V0OwotICAgIHByaXZhdGUgVmlldyBtRGl2aWRlclZpZXc7Ci0KLSAgICBPdmVybGF5TGlzdFZpZXcgbVZvbHVtZUdyb3VwTGlzdDsKLSAgICBWb2x1bWVHcm91cEFkYXB0ZXIgbVZvbHVtZUdyb3VwQWRhcHRlcjsKLSAgICBwcml2YXRlIExpc3Q8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtR3JvdXBNZW1iZXJSb3V0ZXM7Ci0gICAgU2V0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQ7Ci0gICAgcHJpdmF0ZSBTZXQ8TWVkaWFSb3V0ZXIuUm91dGVJbmZvPiBtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkOwotICAgIFNldDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG1Hcm91cE1lbWJlclJvdXRlc0FuaW1hdGluZ1dpdGhCaXRtYXA7Ci0gICAgU2Vla0JhciBtVm9sdW1lU2xpZGVyOwotICAgIFZvbHVtZUNoYW5nZUxpc3RlbmVyIG1Wb2x1bWVDaGFuZ2VMaXN0ZW5lcjsKLSAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkOwotICAgIHByaXZhdGUgaW50IG1Wb2x1bWVHcm91cExpc3RJdGVtSWNvblNpemU7Ci0gICAgcHJpdmF0ZSBpbnQgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVZvbHVtZUdyb3VwTGlzdE1heEhlaWdodDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBtVm9sdW1lR3JvdXBMaXN0UGFkZGluZ1RvcDsKLSAgICBNYXA8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBTZWVrQmFyPiBtVm9sdW1lU2xpZGVyTWFwOwotCi0gICAgTWVkaWFDb250cm9sbGVyQ29tcGF0IG1NZWRpYUNvbnRyb2xsZXI7Ci0gICAgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2sgbUNvbnRyb2xsZXJDYWxsYmFjazsKLSAgICBQbGF5YmFja1N0YXRlQ29tcGF0IG1TdGF0ZTsKLSAgICBNZWRpYURlc2NyaXB0aW9uQ29tcGF0IG1EZXNjcmlwdGlvbjsKLQotICAgIEZldGNoQXJ0VGFzayBtRmV0Y2hBcnRUYXNrOwotICAgIEJpdG1hcCBtQXJ0SWNvbkJpdG1hcDsKLSAgICBVcmkgbUFydEljb25Vcmk7Ci0gICAgYm9vbGVhbiBtQXJ0SWNvbklzTG9hZGVkOwotICAgIEJpdG1hcCBtQXJ0SWNvbkxvYWRlZEJpdG1hcDsKLSAgICBpbnQgbUFydEljb25CYWNrZ3JvdW5kQ29sb3I7Ci0KLSAgICBib29sZWFuIG1IYXNQZW5kaW5nVXBkYXRlOwotICAgIGJvb2xlYW4gbVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQ7Ci0KLSAgICBib29sZWFuIG1Jc0dyb3VwRXhwYW5kZWQ7Ci0gICAgYm9vbGVhbiBtSXNHcm91cExpc3RBbmltYXRpbmc7Ci0gICAgYm9vbGVhbiBtSXNHcm91cExpc3RBbmltYXRpb25QZW5kaW5nOwotICAgIGludCBtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25NczsKLSAgICBwcml2YXRlIGludCBtR3JvdXBMaXN0RmFkZUluRHVyYXRpb25NczsKLSAgICBwcml2YXRlIGludCBtR3JvdXBMaXN0RmFkZU91dER1cmF0aW9uTXM7Ci0KLSAgICBwcml2YXRlIEludGVycG9sYXRvciBtSW50ZXJwb2xhdG9yOwotICAgIHByaXZhdGUgSW50ZXJwb2xhdG9yIG1MaW5lYXJPdXRTbG93SW5JbnRlcnBvbGF0b3I7Ci0gICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUZhc3RPdXRTbG93SW5JbnRlcnBvbGF0b3I7Ci0gICAgcHJpdmF0ZSBJbnRlcnBvbGF0b3IgbUFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yOwotCi0gICAgZmluYWwgQWNjZXNzaWJpbGl0eU1hbmFnZXIgbUFjY2Vzc2liaWxpdHlNYW5hZ2VyOwotCi0gICAgUnVubmFibGUgbUdyb3VwTGlzdEZhZGVJbkFuaW1hdGlvbiA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIHN0YXJ0R3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHVibGljIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nKENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyhDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZSkgewotICAgICAgICAvLyBUT0RPIChiLzcyOTc1OTc2KTogQXZvaWQgdG8gdXNlIENvbnRleHRUaGVtZVdyYXBwZXIgd2l0aCBhcHAgY29udGV4dCBhbmQgbGliIHRoZW1lLgotICAgICAgICBzdXBlcihuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBBcGlIZWxwZXIuZ2V0TGliVGhlbWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldFJvdXRlclRoZW1lSWQoY29udGV4dCkpKSwgdGhlbWUpOwotICAgICAgICBtQ29udGV4dCA9IGdldENvbnRleHQoKTsKLQotICAgICAgICBtQ29udHJvbGxlckNhbGxiYWNrID0gbmV3IE1lZGlhQ29udHJvbGxlckNhbGxiYWNrKCk7Ci0gICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShtQ29udGV4dCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IG5ldyBNZWRpYVJvdXRlckNhbGxiYWNrKCk7Ci0gICAgICAgIG1Sb3V0ZSA9IG1Sb3V0ZXIuZ2V0U2VsZWN0ZWRSb3V0ZSgpOwotICAgICAgICBzZXRNZWRpYVNlc3Npb24obVJvdXRlci5nZXRNZWRpYVNlc3Npb25Ub2tlbigpKTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdFBhZGRpbmdUb3AgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfcGFkZGluZ190b3ApOwotICAgICAgICBtQWNjZXNzaWJpbGl0eU1hbmFnZXIgPQotICAgICAgICAgICAgICAgIChBY2Nlc3NpYmlsaXR5TWFuYWdlcikgbUNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFDQ0VTU0lCSUxJVFlfU0VSVklDRSk7Ci0gICAgICAgIG1MaW5lYXJPdXRTbG93SW5JbnRlcnBvbGF0b3IgPSBBbmltYXRpb25VdGlscy5sb2FkSW50ZXJwb2xhdG9yKAotICAgICAgICAgICAgICAgIG1Db250ZXh0LCBhbmRyb2lkLlIuaW50ZXJwb2xhdG9yLmxpbmVhcl9vdXRfc2xvd19pbik7Ci0gICAgICAgIG1GYXN0T3V0U2xvd0luSW50ZXJwb2xhdG9yID0gQW5pbWF0aW9uVXRpbHMubG9hZEludGVycG9sYXRvcigKLSAgICAgICAgICAgICAgICBtQ29udGV4dCwgYW5kcm9pZC5SLmludGVycG9sYXRvci5mYXN0X291dF9zbG93X2luKTsKLSAgICAgICAgbUFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yID0gbmV3IEFjY2VsZXJhdGVEZWNlbGVyYXRlSW50ZXJwb2xhdG9yKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcm91dGUgdGhhdCB0aGlzIGRpYWxvZyBpcyBjb250cm9sbGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIGdldFJvdXRlKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZXIuUm91dGVHcm91cCBnZXRHcm91cCgpIHsKLSAgICAgICAgaWYgKG1Sb3V0ZSBpbnN0YW5jZW9mIE1lZGlhUm91dGVyLlJvdXRlR3JvdXApIHsKLSAgICAgICAgICAgIHJldHVybiAoTWVkaWFSb3V0ZXIuUm91dGVHcm91cCkgbVJvdXRlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIHRoZSBzdWJjbGFzcyBhbiBvcHBvcnR1bml0eSB0byBjcmVhdGUgYSB2aWV3IHRoYXQgd2lsbCByZXBsYWNlIHRoZSBkZWZhdWx0IG1lZGlhCi0gICAgICogY29udHJvbHMgZm9yIHRoZSBjdXJyZW50bHkgcGxheWluZyBjb250ZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHNhdmVkSW5zdGFuY2VTdGF0ZSBUaGUgZGlhbG9nJ3Mgc2F2ZWQgaW5zdGFuY2Ugc3RhdGUuCi0gICAgICogQHJldHVybiBUaGUgbWVkaWEgY29udHJvbCB2aWV3LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIFZpZXcgb25DcmVhdGVNZWRpYUNvbnRyb2xWaWV3KEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgY29udHJvbCB2aWV3IHRoYXQgd2FzIGNyZWF0ZWQgYnkge0BsaW5rICNvbkNyZWF0ZU1lZGlhQ29udHJvbFZpZXcoQnVuZGxlKX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSBjb250cm9sIHZpZXcsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgVmlldyBnZXRNZWRpYUNvbnRyb2xWaWV3KCkgewotICAgICAgICByZXR1cm4gbUN1c3RvbUNvbnRyb2xWaWV3OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0byBlbmFibGUgdGhlIHZvbHVtZSBzbGlkZXIgYW5kIHZvbHVtZSBjb250cm9sIHVzaW5nIHRoZSB2b2x1bWUga2V5cwotICAgICAqIHdoZW4gdGhlIHJvdXRlIHN1cHBvcnRzIGl0LgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IHZhbHVlIGlzIHRydWUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFZvbHVtZUNvbnRyb2xFbmFibGVkKGJvb2xlYW4gZW5hYmxlKSB7Ci0gICAgICAgIGlmIChtVm9sdW1lQ29udHJvbEVuYWJsZWQgIT0gZW5hYmxlKSB7Ci0gICAgICAgICAgICBtVm9sdW1lQ29udHJvbEVuYWJsZWQgPSBlbmFibGU7Ci0gICAgICAgICAgICBpZiAobUNyZWF0ZWQpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRvIGVuYWJsZSB0aGUgdm9sdW1lIHNsaWRlciBhbmQgdm9sdW1lIGNvbnRyb2wgdXNpbmcgdGhlIHZvbHVtZSBrZXlzCi0gICAgICogd2hlbiB0aGUgcm91dGUgc3VwcG9ydHMgaXQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWb2x1bWVDb250cm9sRW5hYmxlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Wb2x1bWVDb250cm9sRW5hYmxlZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIHNlc3Npb24gdG8gdXNlIGZvciBtZXRhZGF0YSBhbmQgdHJhbnNwb3J0IGNvbnRyb2xzLiBUaGUgZGlhbG9nCi0gICAgICogd2lsbCBsaXN0ZW4gdG8gY2hhbmdlcyBvbiB0aGlzIHNlc3Npb24gYW5kIHVwZGF0ZSB0aGUgVUkgYXV0b21hdGljYWxseSBpbgotICAgICAqIHJlc3BvbnNlIHRvIGNoYW5nZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2Vzc2lvblRva2VuIFRoZSB0b2tlbiBmb3IgdGhlIHNlc3Npb24gdG8gdXNlLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRNZWRpYVNlc3Npb24oTWVkaWFTZXNzaW9uQ29tcGF0LlRva2VuIHNlc3Npb25Ub2tlbikgewotICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLnVucmVnaXN0ZXJDYWxsYmFjayhtQ29udHJvbGxlckNhbGxiYWNrKTsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIgPSBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZXNzaW9uVG9rZW4gPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmICghbUF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICB0cnkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlciA9IG5ldyBNZWRpYUNvbnRyb2xsZXJDb21wYXQobUNvbnRleHQsIHNlc3Npb25Ub2tlbik7Ci0gICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJFcnJvciBjcmVhdGluZyBtZWRpYSBjb250cm9sbGVyIGluIHNldE1lZGlhU2Vzc2lvbi4iLCBlKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLnJlZ2lzdGVyQ2FsbGJhY2sobUNvbnRyb2xsZXJDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgTWVkaWFNZXRhZGF0YUNvbXBhdCBtZXRhZGF0YSA9IG1NZWRpYUNvbnRyb2xsZXIgPT0gbnVsbCA/IG51bGwKLSAgICAgICAgICAgICAgICA6IG1NZWRpYUNvbnRyb2xsZXIuZ2V0TWV0YWRhdGEoKTsKLSAgICAgICAgbURlc2NyaXB0aW9uID0gbWV0YWRhdGEgPT0gbnVsbCA/IG51bGwgOiBtZXRhZGF0YS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICBtU3RhdGUgPSBtTWVkaWFDb250cm9sbGVyID09IG51bGwgPyBudWxsIDogbU1lZGlhQ29udHJvbGxlci5nZXRQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgIHVwZGF0ZUFydEljb25JZk5lZWRlZCgpOwotICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHNlc3Npb24gdG8gdXNlIGZvciBtZXRhZGF0YSBhbmQgdHJhbnNwb3J0IGNvbnRyb2xzLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgdG9rZW4gZm9yIHRoZSBzZXNzaW9uIHRvIHVzZSBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBnZXRNZWRpYVNlc3Npb24oKSB7Ci0gICAgICAgIHJldHVybiBtTWVkaWFDb250cm9sbGVyID09IG51bGwgPyBudWxsIDogbU1lZGlhQ29udHJvbGxlci5nZXRTZXNzaW9uVG9rZW4oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkNyZWF0ZShCdW5kbGUgc2F2ZWRJbnN0YW5jZVN0YXRlKSB7Ci0gICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0KLSAgICAgICAgZ2V0V2luZG93KCkuc2V0QmFja2dyb3VuZERyYXdhYmxlUmVzb3VyY2UoYW5kcm9pZC5SLmNvbG9yLnRyYW5zcGFyZW50KTsKLQotICAgICAgICBzZXRDb250ZW50VmlldyhBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtQ29udGV4dCwKLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliVGhlbWUobUNvbnRleHQsIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0Um91dGVyVGhlbWVJZChtQ29udGV4dCkpLAotICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1yX2NvbnRyb2xsZXJfbWF0ZXJpYWxfZGlhbG9nX2IpKTsKLQotICAgICAgICAvLyBSZW1vdmUgdGhlIG5ldXRyYWwgYnV0dG9uLgotICAgICAgICBmaW5kVmlld0J5SWQoQlVUVE9OX05FVVRSQUxfUkVTX0lEKS5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0KLSAgICAgICAgQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBDbGlja0xpc3RlbmVyKCk7Ci0KLSAgICAgICAgbUV4cGFuZGFibGVBcmVhTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfZXhwYW5kYWJsZV9hcmVhKTsKLSAgICAgICAgbUV4cGFuZGFibGVBcmVhTGF5b3V0LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgZGlzbWlzcygpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgbURpYWxvZ0FyZWFMYXlvdXQgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9kaWFsb2dfYXJlYSk7Ci0gICAgICAgIG1EaWFsb2dBcmVhTGF5b3V0LnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgLy8gRWF0IHVuaGFuZGxlZCB0b3VjaCBldmVudHMuCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBpbnQgY29sb3IgPSBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldEJ1dHRvblRleHRDb2xvcihtQ29udGV4dCk7Ci0gICAgICAgIG1EaXNjb25uZWN0QnV0dG9uID0gZmluZFZpZXdCeUlkKEJVVFRPTl9ESVNDT05ORUNUX1JFU19JRCk7Ci0gICAgICAgIG1EaXNjb25uZWN0QnV0dG9uLnNldFRleHQoCi0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0U3RyaW5nKFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfZGlzY29ubmVjdCkpOwotICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbi5zZXRUZXh0Q29sb3IoY29sb3IpOwotICAgICAgICBtRGlzY29ubmVjdEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotCi0gICAgICAgIG1TdG9wQ2FzdGluZ0J1dHRvbiA9IGZpbmRWaWV3QnlJZChCVVRUT05fU1RPUF9SRVNfSUQpOwotICAgICAgICBtU3RvcENhc3RpbmdCdXR0b24uc2V0VGV4dCgKLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoUi5zdHJpbmcubXJfY29udHJvbGxlcl9zdG9wX2Nhc3RpbmcpKTsKLSAgICAgICAgbVN0b3BDYXN0aW5nQnV0dG9uLnNldFRleHRDb2xvcihjb2xvcik7Ci0gICAgICAgIG1TdG9wQ2FzdGluZ0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotCi0gICAgICAgIG1Sb3V0ZU5hbWVUZXh0VmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX25hbWUpOwotICAgICAgICBtQ2xvc2VCdXR0b24gPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jbG9zZSk7Ci0gICAgICAgIG1DbG9zZUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICBtQ3VzdG9tQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2N1c3RvbV9jb250cm9sKTsKLSAgICAgICAgbURlZmF1bHRDb250cm9sTGF5b3V0ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfZGVmYXVsdF9jb250cm9sKTsKLQotICAgICAgICAvLyBTdGFydCB0aGUgc2Vzc2lvbiBhY3Rpdml0eSB3aGVuIGEgY29udGVudCBpdGVtIChhbGJ1bSBhcnQsIHRpdGxlIG9yIHN1YnRpdGxlKSBpcyBjbGlja2VkLgotICAgICAgICBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBvbkNsaWNrTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBQZW5kaW5nSW50ZW50IHBpID0gbU1lZGlhQ29udHJvbGxlci5nZXRTZXNzaW9uQWN0aXZpdHkoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBpICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGkuc2VuZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKFBlbmRpbmdJbnRlbnQuQ2FuY2VsZWRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5lKFRBRywgcGkgKyAiIHdhcyBub3Qgc2VudCwgaXQgaGFkIGJlZW4gY2FuY2VsZWQuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgICAgIG1BcnRWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfYXJ0KTsKLSAgICAgICAgbUFydFZpZXcuc2V0T25DbGlja0xpc3RlbmVyKG9uQ2xpY2tMaXN0ZW5lcik7Ci0gICAgICAgIGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfdGl0bGVfY29udGFpbmVyKS5zZXRPbkNsaWNrTGlzdGVuZXIob25DbGlja0xpc3RlbmVyKTsKLQotICAgICAgICBtTWVkaWFNYWluQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX21lZGlhX21haW5fY29udHJvbCk7Ci0gICAgICAgIG1EaXZpZGVyVmlldyA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfZGl2aWRlcik7Ci0KLSAgICAgICAgbVBsYXliYWNrQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3BsYXliYWNrX2NvbnRyb2wpOwotICAgICAgICBtVGl0bGVWaWV3ID0gZmluZFZpZXdCeUlkKFIuaWQubXJfY29udHJvbF90aXRsZSk7Ci0gICAgICAgIG1TdWJ0aXRsZVZpZXcgPSBmaW5kVmlld0J5SWQoUi5pZC5tcl9jb250cm9sX3N1YnRpdGxlKTsKLSAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbiA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX2NvbnRyb2xfcGxheWJhY2tfY3RybCk7Ci0gICAgICAgIG1QbGF5YmFja0NvbnRyb2xCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKGxpc3RlbmVyKTsKLQotICAgICAgICBtVm9sdW1lQ29udHJvbExheW91dCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9jb250cm9sKTsKLSAgICAgICAgbVZvbHVtZUNvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICBtVm9sdW1lU2xpZGVyID0gZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX3NsaWRlcik7Ci0gICAgICAgIG1Wb2x1bWVTbGlkZXIuc2V0VGFnKG1Sb3V0ZSk7Ci0gICAgICAgIG1Wb2x1bWVDaGFuZ2VMaXN0ZW5lciA9IG5ldyBWb2x1bWVDaGFuZ2VMaXN0ZW5lcigpOwotICAgICAgICBtVm9sdW1lU2xpZGVyLnNldE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKG1Wb2x1bWVDaGFuZ2VMaXN0ZW5lcik7Ci0KLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdCA9IGZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9ncm91cF9saXN0KTsKLSAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+KCk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIgPSBuZXcgVm9sdW1lR3JvdXBBZGFwdGVyKG1Wb2x1bWVHcm91cExpc3QuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcyk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0QWRhcHRlcihtVm9sdW1lR3JvdXBBZGFwdGVyKTsKLSAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzQW5pbWF0aW5nV2l0aEJpdG1hcCA9IG5ldyBIYXNoU2V0PD4oKTsKLQotICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLnNldE1lZGlhQ29udHJvbHNCYWNrZ3JvdW5kQ29sb3IobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQsIG1Wb2x1bWVHcm91cExpc3QsIGdldEdyb3VwKCkgIT0gbnVsbCk7Ci0gICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuc2V0Vm9sdW1lU2xpZGVyQ29sb3IobUNvbnRleHQsCi0gICAgICAgICAgICAgICAgKE1lZGlhUm91dGVWb2x1bWVTbGlkZXIpIG1Wb2x1bWVTbGlkZXIsIG1NZWRpYU1haW5Db250cm9sTGF5b3V0KTsKLSAgICAgICAgbVZvbHVtZVNsaWRlck1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgbVZvbHVtZVNsaWRlck1hcC5wdXQobVJvdXRlLCBtVm9sdW1lU2xpZGVyKTsKLQotICAgICAgICBtR3JvdXBFeHBhbmRDb2xsYXBzZUJ1dHRvbiA9Ci0gICAgICAgICAgICAgICAgZmluZFZpZXdCeUlkKFIuaWQubXJfZ3JvdXBfZXhwYW5kX2NvbGxhcHNlKTsKLSAgICAgICAgbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgICAgICBtSXNHcm91cEV4cGFuZGVkID0gIW1Jc0dyb3VwRXhwYW5kZWQ7Ci0gICAgICAgICAgICAgICAgaWYgKG1Jc0dyb3VwRXhwYW5kZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxvYWRJbnRlcnBvbGF0b3IoKTsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRIZWlnaHQodHJ1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBsb2FkSW50ZXJwb2xhdG9yKCk7Ci0gICAgICAgIG1Hcm91cExpc3RBbmltYXRpb25EdXJhdGlvbk1zID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtQ29udGV4dCkuZ2V0SW50ZWdlcigKLSAgICAgICAgICAgICAgICBSLmludGVnZXIubXJfY29udHJvbGxlcl92b2x1bWVfZ3JvdXBfbGlzdF9hbmltYXRpb25fZHVyYXRpb25fbXMpOwotICAgICAgICBtR3JvdXBMaXN0RmFkZUluRHVyYXRpb25NcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldEludGVnZXIoCi0gICAgICAgICAgICAgICAgUi5pbnRlZ2VyLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfZmFkZV9pbl9kdXJhdGlvbl9tcyk7Ci0gICAgICAgIG1Hcm91cExpc3RGYWRlT3V0RHVyYXRpb25NcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldEludGVnZXIoCi0gICAgICAgICAgICAgICAgUi5pbnRlZ2VyLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfZmFkZV9vdXRfZHVyYXRpb25fbXMpOwotCi0gICAgICAgIG1DdXN0b21Db250cm9sVmlldyA9IG9uQ3JlYXRlTWVkaWFDb250cm9sVmlldyhzYXZlZEluc3RhbmNlU3RhdGUpOwotICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1DdXN0b21Db250cm9sTGF5b3V0LmFkZFZpZXcobUN1c3RvbUNvbnRyb2xWaWV3KTsKLSAgICAgICAgICAgIG1DdXN0b21Db250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfQotICAgICAgICBtQ3JlYXRlZCA9IHRydWU7Ci0gICAgICAgIHVwZGF0ZUxheW91dCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHdpZHRoIG9mIHRoZSBkaWFsb2cuIEFsc28gY2FsbGVkIHdoZW4gY29uZmlndXJhdGlvbiBjaGFuZ2VzLgotICAgICAqLwotICAgIHZvaWQgdXBkYXRlTGF5b3V0KCkgewotICAgICAgICBpbnQgd2lkdGggPSBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldERpYWxvZ1dpZHRoKG1Db250ZXh0KTsKLSAgICAgICAgZ2V0V2luZG93KCkuc2V0TGF5b3V0KHdpZHRoLCBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zLldSQVBfQ09OVEVOVCk7Ci0KLSAgICAgICAgVmlldyBkZWNvclZpZXcgPSBnZXRXaW5kb3coKS5nZXREZWNvclZpZXcoKTsKLSAgICAgICAgbURpYWxvZ0NvbnRlbnRXaWR0aCA9IHdpZHRoIC0gZGVjb3JWaWV3LmdldFBhZGRpbmdMZWZ0KCkgLSBkZWNvclZpZXcuZ2V0UGFkZGluZ1JpZ2h0KCk7Ci0KLSAgICAgICAgUmVzb3VyY2VzIHJlcyA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplID0gcmVzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1yX2NvbnRyb2xsZXJfdm9sdW1lX2dyb3VwX2xpc3RfaXRlbV9pY29uX3NpemUpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X2l0ZW1faGVpZ2h0KTsKLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdE1heEhlaWdodCA9IHJlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tcl9jb250cm9sbGVyX3ZvbHVtZV9ncm91cF9saXN0X21heF9oZWlnaHQpOwotCi0gICAgICAgIC8vIEZldGNoIGFydCBpY29ucyBhZ2FpbiBmb3IgbGF5b3V0IGNoYW5nZXMgdG8gcmVzaXplIGl0IGFjY29yZGluZ2x5Ci0gICAgICAgIG1BcnRJY29uQml0bWFwID0gbnVsbDsKLSAgICAgICAgbUFydEljb25VcmkgPSBudWxsOwotICAgICAgICB1cGRhdGVBcnRJY29uSWZOZWVkZWQoKTsKLSAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3coKSB7Ci0gICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvdygpOwotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IHRydWU7Ci0KLSAgICAgICAgbVJvdXRlci5hZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFksIG1DYWxsYmFjaywKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTKTsKLSAgICAgICAgc2V0TWVkaWFTZXNzaW9uKG1Sb3V0ZXIuZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EZXRhY2hlZEZyb21XaW5kb3coKSB7Ci0gICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgc2V0TWVkaWFTZXNzaW9uKG51bGwpOwotICAgICAgICBtQXR0YWNoZWRUb1dpbmRvdyA9IGZhbHNlOwotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uS2V5RG93bihpbnQga2V5Q29kZSwgS2V5RXZlbnQgZXZlbnQpIHsKLSAgICAgICAgaWYgKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfRE9XTgotICAgICAgICAgICAgICAgIHx8IGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfVVApIHsKLSAgICAgICAgICAgIG1Sb3V0ZS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGtleUNvZGUgPT0gS2V5RXZlbnQuS0VZQ09ERV9WT0xVTUVfRE9XTiA/IC0xIDogMSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc3VwZXIub25LZXlEb3duKGtleUNvZGUsIGV2ZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvbktleVVwKGludCBrZXlDb2RlLCBLZXlFdmVudCBldmVudCkgewotICAgICAgICBpZiAoa2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9ET1dOCi0gICAgICAgICAgICAgICAgfHwga2V5Q29kZSA9PSBLZXlFdmVudC5LRVlDT0RFX1ZPTFVNRV9VUCkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLm9uS2V5VXAoa2V5Q29kZSwgZXZlbnQpOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlKGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICAvLyBEZWZlciBkaWFsb2cgdXBkYXRlcyBpZiBhIHVzZXIgaXMgYWRqdXN0aW5nIGEgdm9sdW1lIGluIHRoZSBsaXN0Ci0gICAgICAgIGlmIChtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgIT0gbnVsbCkgewotICAgICAgICAgICAgbUhhc1BlbmRpbmdVcGRhdGUgPSB0cnVlOwotICAgICAgICAgICAgbVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQgfD0gYW5pbWF0ZTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtSGFzUGVuZGluZ1VwZGF0ZSA9IGZhbHNlOwotICAgICAgICBtUGVuZGluZ1VwZGF0ZUFuaW1hdGlvbk5lZWRlZCA9IGZhbHNlOwotICAgICAgICBpZiAoIW1Sb3V0ZS5pc1NlbGVjdGVkKCkgfHwgbVJvdXRlLmlzRGVmYXVsdE9yQmx1ZXRvb3RoKCkpIHsKLSAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW1DcmVhdGVkKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtUm91dGVOYW1lVGV4dFZpZXcuc2V0VGV4dChtUm91dGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgbURpc2Nvbm5lY3RCdXR0b24uc2V0VmlzaWJpbGl0eShtUm91dGUuY2FuRGlzY29ubmVjdCgpID8gVmlldy5WSVNJQkxFIDogVmlldy5HT05FKTsKLSAgICAgICAgaWYgKG1DdXN0b21Db250cm9sVmlldyA9PSBudWxsICYmIG1BcnRJY29uSXNMb2FkZWQpIHsKLSAgICAgICAgICAgIGlmIChpc0JpdG1hcFJlY3ljbGVkKG1BcnRJY29uTG9hZGVkQml0bWFwKSkgewotICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbid0IHNldCBhcnR3b3JrIGltYWdlIHdpdGggcmVjeWNsZWQgYml0bWFwOiAiICsgbUFydEljb25Mb2FkZWRCaXRtYXApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtQXJ0Vmlldy5zZXRJbWFnZUJpdG1hcChtQXJ0SWNvbkxvYWRlZEJpdG1hcCk7Ci0gICAgICAgICAgICAgICAgbUFydFZpZXcuc2V0QmFja2dyb3VuZENvbG9yKG1BcnRJY29uQmFja2dyb3VuZENvbG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsZWFyTG9hZGVkQml0bWFwKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlVm9sdW1lQ29udHJvbExheW91dCgpOwotICAgICAgICB1cGRhdGVQbGF5YmFja0NvbnRyb2xMYXlvdXQoKTsKLSAgICAgICAgdXBkYXRlTGF5b3V0SGVpZ2h0KGFuaW1hdGUpOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc0JpdG1hcFJlY3ljbGVkKEJpdG1hcCBiaXRtYXApIHsKLSAgICAgICAgcmV0dXJuIGJpdG1hcCAhPSBudWxsICYmIGJpdG1hcC5pc1JlY3ljbGVkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSB7Ci0gICAgICAgIHJldHVybiBtQ3VzdG9tQ29udHJvbFZpZXcgPT0gbnVsbCAmJiAobURlc2NyaXB0aW9uICE9IG51bGwgfHwgbVN0YXRlICE9IG51bGwpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGhlaWdodCBvZiBtYWluIG1lZGlhIGNvbnRyb2xsZXIgd2hpY2ggaW5jbHVkZXMgcGxheWJhY2sgY29udHJvbCBhbmQgbWFzdGVyCi0gICAgICogdm9sdW1lIGNvbnRyb2wuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnQgZ2V0TWFpbkNvbnRyb2xsZXJIZWlnaHQoYm9vbGVhbiBzaG93UGxheWJhY2tDb250cm9sKSB7Ci0gICAgICAgIGludCBoZWlnaHQgPSAwOwotICAgICAgICBpZiAoc2hvd1BsYXliYWNrQ29udHJvbCB8fCBtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICBoZWlnaHQgKz0gbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuZ2V0UGFkZGluZ1RvcCgpCi0gICAgICAgICAgICAgICAgICAgICsgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuZ2V0UGFkZGluZ0JvdHRvbSgpOwotICAgICAgICAgICAgaWYgKHNob3dQbGF5YmFja0NvbnRyb2wpIHsKLSAgICAgICAgICAgICAgICBoZWlnaHQgKz0gIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ICs9IG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2hvd1BsYXliYWNrQ29udHJvbCAmJiBtVm9sdW1lQ29udHJvbExheW91dC5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgaGVpZ2h0ICs9IG1EaXZpZGVyVmlldy5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBoZWlnaHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZU1lZGlhQ29udHJvbFZpc2liaWxpdHkoYm9vbGVhbiBjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KSB7Ci0gICAgICAgIC8vIFRPRE86IFVwZGF0ZSB0aGUgdG9wIGFuZCBib3R0b20gcGFkZGluZyBvZiB0aGUgY29udHJvbCBsYXlvdXQgYWNjb3JkaW5nIHRvIHRoZSBkaXNwbGF5Ci0gICAgICAgIC8vIGhlaWdodC4KLSAgICAgICAgbURpdmlkZXJWaWV3LnNldFZpc2liaWxpdHkoKG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUKLSAgICAgICAgICAgICAgICAmJiBjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgICAgIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoKG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUKLSAgICAgICAgICAgICAgICAmJiAhY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCkgPyBWaWV3LkdPTkUgOiBWaWV3LlZJU0lCTEUpOwotICAgIH0KLQotICAgIHZvaWQgdXBkYXRlTGF5b3V0SGVpZ2h0KGZpbmFsIGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICAvLyBXZSBuZWVkIHRvIGRlZmVyIHRoZSB1cGRhdGUgdW50aWwgdGhlIGZpcnN0IGxheW91dCBoYXMgb2NjdXJyZWQsIGFzIHdlIGRvbid0IHlldCBrbm93IHRoZQotICAgICAgICAvLyBvdmVyYWxsIHZpc2libGUgZGlzcGxheSBzaXplIGluIHdoaWNoIHRoZSB3aW5kb3cgdGhpcyB2aWV3IGlzIGF0dGFjaGVkIHRvIGhhcyBiZWVuCi0gICAgICAgIC8vIHBvc2l0aW9uZWQgaW4uCi0gICAgICAgIG1EZWZhdWx0Q29udHJvbExheW91dC5yZXF1ZXN0TGF5b3V0KCk7Ci0gICAgICAgIFZpZXdUcmVlT2JzZXJ2ZXIgb2JzZXJ2ZXIgPSBtRGVmYXVsdENvbnRyb2xMYXlvdXQuZ2V0Vmlld1RyZWVPYnNlcnZlcigpOwotICAgICAgICBvYnNlcnZlci5hZGRPbkdsb2JhbExheW91dExpc3RlbmVyKG5ldyBWaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2xvYmFsTGF5b3V0KCkgewotICAgICAgICAgICAgICAgIG1EZWZhdWx0Q29udHJvbExheW91dC5nZXRWaWV3VHJlZU9ic2VydmVyKCkucmVtb3ZlR2xvYmFsT25MYXlvdXRMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgICAgICBpZiAobUlzR3JvdXBMaXN0QW5pbWF0aW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Jc0dyb3VwTGlzdEFuaW1hdGlvblBlbmRpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZUxheW91dEhlaWdodEludGVybmFsKGFuaW1hdGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXBkYXRlcyB0aGUgaGVpZ2h0IG9mIHZpZXdzIGFuZCBoaWRlIGFydHdvcmsgb3IgbWV0YWRhdGEgaWYgc3BhY2UgaXMgbGltaXRlZC4KLSAgICAgKi8KLSAgICB2b2lkIHVwZGF0ZUxheW91dEhlaWdodEludGVybmFsKGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICAvLyBNZWFzdXJlIHRoZSBzaXplIG9mIHdpZGdldHMgYW5kIGdldCB0aGUgaGVpZ2h0IG9mIG1haW4gY29tcG9uZW50cy4KLSAgICAgICAgaW50IG9sZEhlaWdodCA9IGdldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCk7Ci0gICAgICAgIHNldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCwgVmlld0dyb3VwLkxheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOwotICAgICAgICB1cGRhdGVNZWRpYUNvbnRyb2xWaXNpYmlsaXR5KGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSk7Ci0gICAgICAgIFZpZXcgZGVjb3JWaWV3ID0gZ2V0V2luZG93KCkuZ2V0RGVjb3JWaWV3KCk7Ci0gICAgICAgIGRlY29yVmlldy5tZWFzdXJlKAotICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYyhnZXRXaW5kb3coKS5nZXRBdHRyaWJ1dGVzKCkud2lkdGgsIE1lYXN1cmVTcGVjLkVYQUNUTFkpLAotICAgICAgICAgICAgICAgIE1lYXN1cmVTcGVjLlVOU1BFQ0lGSUVEKTsKLSAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1NZWRpYU1haW5Db250cm9sTGF5b3V0LCBvbGRIZWlnaHQpOwotICAgICAgICBpbnQgYXJ0Vmlld0hlaWdodCA9IDA7Ci0gICAgICAgIGlmIChtQ3VzdG9tQ29udHJvbFZpZXcgPT0gbnVsbCAmJiBtQXJ0Vmlldy5nZXREcmF3YWJsZSgpIGluc3RhbmNlb2YgQml0bWFwRHJhd2FibGUpIHsKLSAgICAgICAgICAgIEJpdG1hcCBhcnQgPSAoKEJpdG1hcERyYXdhYmxlKSBtQXJ0Vmlldy5nZXREcmF3YWJsZSgpKS5nZXRCaXRtYXAoKTsKLSAgICAgICAgICAgIGlmIChhcnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFydFZpZXdIZWlnaHQgPSBnZXREZXNpcmVkQXJ0SGVpZ2h0KGFydC5nZXRXaWR0aCgpLCBhcnQuZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgIG1BcnRWaWV3LnNldFNjYWxlVHlwZShhcnQuZ2V0V2lkdGgoKSA+PSBhcnQuZ2V0SGVpZ2h0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgID8gSW1hZ2VWaWV3LlNjYWxlVHlwZS5GSVRfWFkgOiBJbWFnZVZpZXcuU2NhbGVUeXBlLkZJVF9DRU5URVIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludCBtYWluQ29udHJvbGxlckhlaWdodCA9IGdldE1haW5Db250cm9sbGVySGVpZ2h0KGNhblNob3dQbGF5YmFja0NvbnRyb2xMYXlvdXQoKSk7Ci0gICAgICAgIGludCB2b2x1bWVHcm91cExpc3RDb3VudCA9IG1Hcm91cE1lbWJlclJvdXRlcy5zaXplKCk7Ci0gICAgICAgIC8vIFNjYWxlIGRvd24gdm9sdW1lIGdyb3VwIGxpc3QgaXRlbXMgaW4gbGFuZHNjYXBlIG1vZGUuCi0gICAgICAgIGludCBleHBhbmRlZEdyb3VwTGlzdEhlaWdodCA9IGdldEdyb3VwKCkgPT0gbnVsbCA/IDAgOgotICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0ICogZ2V0R3JvdXAoKS5nZXRSb3V0ZXMoKS5zaXplKCk7Ci0gICAgICAgIGlmICh2b2x1bWVHcm91cExpc3RDb3VudCA+IDApIHsKLSAgICAgICAgICAgIGV4cGFuZGVkR3JvdXBMaXN0SGVpZ2h0ICs9IG1Wb2x1bWVHcm91cExpc3RQYWRkaW5nVG9wOwotICAgICAgICB9Ci0gICAgICAgIGV4cGFuZGVkR3JvdXBMaXN0SGVpZ2h0ID0gTWF0aC5taW4oZXhwYW5kZWRHcm91cExpc3RIZWlnaHQsIG1Wb2x1bWVHcm91cExpc3RNYXhIZWlnaHQpOwotICAgICAgICBpbnQgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCA9IG1Jc0dyb3VwRXhwYW5kZWQgPyBleHBhbmRlZEdyb3VwTGlzdEhlaWdodCA6IDA7Ci0KLSAgICAgICAgaW50IGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID0KLSAgICAgICAgICAgICAgICBNYXRoLm1heChhcnRWaWV3SGVpZ2h0LCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0KSArIG1haW5Db250cm9sbGVySGVpZ2h0OwotICAgICAgICBSZWN0IHZpc2libGVSZWN0ID0gbmV3IFJlY3QoKTsKLSAgICAgICAgZGVjb3JWaWV3LmdldFdpbmRvd1Zpc2libGVEaXNwbGF5RnJhbWUodmlzaWJsZVJlY3QpOwotICAgICAgICAvLyBIZWlnaHQgb2Ygbm9uLWNvbnRyb2wgdmlld3MgaW4gZGVjb3Igdmlldy4KLSAgICAgICAgLy8gVGhpcyBpbmNsdWRlcyB0aXRsZSBiYXIsIGJ1dHRvbiBiYXIsIGFuZCBkaWFsb2cncyB2ZXJ0aWNhbCBwYWRkaW5nIHdoaWNoIHNob3VsZCBiZQotICAgICAgICAvLyBhbHdheXMgc2hvd24uCi0gICAgICAgIGludCBub25Db250cm9sVmlld0hlaWdodCA9IG1EaWFsb2dBcmVhTGF5b3V0LmdldE1lYXN1cmVkSGVpZ2h0KCkKLSAgICAgICAgICAgICAgICAtIG1EZWZhdWx0Q29udHJvbExheW91dC5nZXRNZWFzdXJlZEhlaWdodCgpOwotICAgICAgICAvLyBNYXhpbXVtIGFsbG93ZWQgaGVpZ2h0IGZvciBjb250cm9scyB0byBmaXQgc2NyZWVuLgotICAgICAgICBpbnQgbWF4aW11bUNvbnRyb2xWaWV3SGVpZ2h0ID0gdmlzaWJsZVJlY3QuaGVpZ2h0KCkgLSBub25Db250cm9sVmlld0hlaWdodDsKLQotICAgICAgICAvLyBTaG93IGFydHdvcmsgaWYgaXQgZml0cyB0aGUgc2NyZWVuLgotICAgICAgICBpZiAobUN1c3RvbUNvbnRyb2xWaWV3ID09IG51bGwgJiYgYXJ0Vmlld0hlaWdodCA+IDAKLSAgICAgICAgICAgICAgICAmJiBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA8PSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpIHsKLSAgICAgICAgICAgIG1BcnRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIHNldExheW91dEhlaWdodChtQXJ0VmlldywgYXJ0Vmlld0hlaWdodCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZ2V0TGF5b3V0SGVpZ2h0KG1Wb2x1bWVHcm91cExpc3QpICsgbU1lZGlhTWFpbkNvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKQotICAgICAgICAgICAgICAgICAgICA+PSBtRGVmYXVsdENvbnRyb2xMYXlvdXQuZ2V0TWVhc3VyZWRIZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIG1BcnRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFydFZpZXdIZWlnaHQgPSAwOwotICAgICAgICAgICAgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPSB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0ICsgbWFpbkNvbnRyb2xsZXJIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2hvdyB0aGUgcGxheWJhY2sgY29udHJvbCBpZiBpdCBmaXRzIHRoZSBzY3JlZW4uCi0gICAgICAgIGlmIChjYW5TaG93UGxheWJhY2tDb250cm9sTGF5b3V0KCkKLSAgICAgICAgICAgICAgICAmJiBkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA8PSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpIHsKLSAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgdXBkYXRlTWVkaWFDb250cm9sVmlzaWJpbGl0eShtUGxheWJhY2tDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpOwotICAgICAgICBtYWluQ29udHJvbGxlckhlaWdodCA9IGdldE1haW5Db250cm9sbGVySGVpZ2h0KAotICAgICAgICAgICAgICAgIG1QbGF5YmFja0NvbnRyb2xMYXlvdXQuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0ID0KLSAgICAgICAgICAgICAgICBNYXRoLm1heChhcnRWaWV3SGVpZ2h0LCB2aXNpYmxlR3JvdXBMaXN0SGVpZ2h0KSArIG1haW5Db250cm9sbGVySGVpZ2h0OwotCi0gICAgICAgIC8vIExpbWl0IHRoZSB2b2x1bWUgZ3JvdXAgbGlzdCBoZWlnaHQgdG8gZml0IHRoZSBzY3JlZW4uCi0gICAgICAgIGlmIChkZXNpcmVkQ29udHJvbExheW91dEhlaWdodCA+IG1heGltdW1Db250cm9sVmlld0hlaWdodCkgewotICAgICAgICAgICAgdmlzaWJsZUdyb3VwTGlzdEhlaWdodCAtPSAoZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgLSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQpOwotICAgICAgICAgICAgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQgPSBtYXhpbXVtQ29udHJvbFZpZXdIZWlnaHQ7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVXBkYXRlIHRoZSBsYXlvdXRzIHdpdGggdGhlIGNvbXB1dGVkIGhlaWdodHMuCi0gICAgICAgIG1NZWRpYU1haW5Db250cm9sTGF5b3V0LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3QuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgbURlZmF1bHRDb250cm9sTGF5b3V0LmNsZWFyQW5pbWF0aW9uKCk7Ci0gICAgICAgIGlmIChhbmltYXRlKSB7Ci0gICAgICAgICAgICBhbmltYXRlTGF5b3V0SGVpZ2h0KG1NZWRpYU1haW5Db250cm9sTGF5b3V0LCBtYWluQ29udHJvbGxlckhlaWdodCk7Ci0gICAgICAgICAgICBhbmltYXRlTGF5b3V0SGVpZ2h0KG1Wb2x1bWVHcm91cExpc3QsIHZpc2libGVHcm91cExpc3RIZWlnaHQpOwotICAgICAgICAgICAgYW5pbWF0ZUxheW91dEhlaWdodChtRGVmYXVsdENvbnRyb2xMYXlvdXQsIGRlc2lyZWRDb250cm9sTGF5b3V0SGVpZ2h0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldExheW91dEhlaWdodChtTWVkaWFNYWluQ29udHJvbExheW91dCwgbWFpbkNvbnRyb2xsZXJIZWlnaHQpOwotICAgICAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1Wb2x1bWVHcm91cExpc3QsIHZpc2libGVHcm91cExpc3RIZWlnaHQpOwotICAgICAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KG1EZWZhdWx0Q29udHJvbExheW91dCwgZGVzaXJlZENvbnRyb2xMYXlvdXRIZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIE1heGltaXplIHRoZSB3aW5kb3cgc2l6ZSB3aXRoIGEgdHJhbnNwYXJlbnQgbGF5b3V0IGluIGFkdmFuY2UgZm9yIHNtb290aCBhbmltYXRpb24uCi0gICAgICAgIHNldExheW91dEhlaWdodChtRXhwYW5kYWJsZUFyZWFMYXlvdXQsIHZpc2libGVSZWN0LmhlaWdodCgpKTsKLSAgICAgICAgcmVidWlsZFZvbHVtZUdyb3VwTGlzdChhbmltYXRlKTsKLSAgICB9Ci0KLSAgICB2b2lkIHVwZGF0ZVZvbHVtZUdyb3VwSXRlbUhlaWdodChWaWV3IGl0ZW0pIHsKLSAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIGl0ZW0uZmluZFZpZXdCeUlkKFIuaWQudm9sdW1lX2l0ZW1fY29udGFpbmVyKTsKLSAgICAgICAgc2V0TGF5b3V0SGVpZ2h0KGNvbnRhaW5lciwgbVZvbHVtZUdyb3VwTGlzdEl0ZW1IZWlnaHQpOwotICAgICAgICBWaWV3IGljb24gPSBpdGVtLmZpbmRWaWV3QnlJZChSLmlkLm1yX3ZvbHVtZV9pdGVtX2ljb24pOwotICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwID0gaWNvbi5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgbHAud2lkdGggPSBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplOwotICAgICAgICBscC5oZWlnaHQgPSBtVm9sdW1lR3JvdXBMaXN0SXRlbUljb25TaXplOwotICAgICAgICBpY29uLnNldExheW91dFBhcmFtcyhscCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFuaW1hdGVMYXlvdXRIZWlnaHQoZmluYWwgVmlldyB2aWV3LCBpbnQgdGFyZ2V0SGVpZ2h0KSB7Ci0gICAgICAgIGZpbmFsIGludCBzdGFydFZhbHVlID0gZ2V0TGF5b3V0SGVpZ2h0KHZpZXcpOwotICAgICAgICBmaW5hbCBpbnQgZW5kVmFsdWUgPSB0YXJnZXRIZWlnaHQ7Ci0gICAgICAgIEFuaW1hdGlvbiBhbmltID0gbmV3IEFuaW1hdGlvbigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHJvdGVjdGVkIHZvaWQgYXBwbHlUcmFuc2Zvcm1hdGlvbihmbG9hdCBpbnRlcnBvbGF0ZWRUaW1lLCBUcmFuc2Zvcm1hdGlvbiB0KSB7Ci0gICAgICAgICAgICAgICAgaW50IGhlaWdodCA9IHN0YXJ0VmFsdWUgLSAoaW50KSAoKHN0YXJ0VmFsdWUgLSBlbmRWYWx1ZSkgKiBpbnRlcnBvbGF0ZWRUaW1lKTsKLSAgICAgICAgICAgICAgICBzZXRMYXlvdXRIZWlnaHQodmlldywgaGVpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICAgICAgYW5pbS5zZXREdXJhdGlvbihtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25Ncyk7Ci0gICAgICAgIGlmIChhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAyMSkgewotICAgICAgICAgICAgYW5pbS5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgdmlldy5zdGFydEFuaW1hdGlvbihhbmltKTsKLSAgICB9Ci0KLSAgICB2b2lkIGxvYWRJbnRlcnBvbGF0b3IoKSB7Ci0gICAgICAgIG1JbnRlcnBvbGF0b3IgPQotICAgICAgICAgICAgICAgIG1Jc0dyb3VwRXhwYW5kZWQgPyBtTGluZWFyT3V0U2xvd0luSW50ZXJwb2xhdG9yIDogbUZhc3RPdXRTbG93SW5JbnRlcnBvbGF0b3I7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVZvbHVtZUNvbnRyb2xMYXlvdXQoKSB7Ci0gICAgICAgIGlmIChpc1ZvbHVtZUNvbnRyb2xBdmFpbGFibGUobVJvdXRlKSkgewotICAgICAgICAgICAgaWYgKG1Wb2x1bWVDb250cm9sTGF5b3V0LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LkdPTkUpIHsKLSAgICAgICAgICAgICAgICBtVm9sdW1lQ29udHJvbExheW91dC5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlci5zZXRNYXgobVJvdXRlLmdldFZvbHVtZU1heCgpKTsKLSAgICAgICAgICAgICAgICBtVm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKG1Sb3V0ZS5nZXRWb2x1bWUoKSk7Ci0gICAgICAgICAgICAgICAgbUdyb3VwRXhwYW5kQ29sbGFwc2VCdXR0b24uc2V0VmlzaWJpbGl0eShnZXRHcm91cCgpID09IG51bGwgPyBWaWV3LkdPTkUKLSAgICAgICAgICAgICAgICAgICAgICAgIDogVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Wb2x1bWVDb250cm9sTGF5b3V0LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCByZWJ1aWxkVm9sdW1lR3JvdXBMaXN0KGJvb2xlYW4gYW5pbWF0ZSkgewotICAgICAgICBMaXN0PE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gcm91dGVzID0gZ2V0R3JvdXAoKSA9PSBudWxsID8gbnVsbCA6IGdldEdyb3VwKCkuZ2V0Um91dGVzKCk7Ci0gICAgICAgIGlmIChyb3V0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzLmNsZWFyKCk7Ci0gICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5saXN0VW5vcmRlcmVkRXF1YWxzKG1Hcm91cE1lbWJlclJvdXRlcywgcm91dGVzKSkgewotICAgICAgICAgICAgbVZvbHVtZUdyb3VwQWRhcHRlci5ub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgSGFzaE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIFJlY3Q+IHByZXZpb3VzUm91dGVCb3VuZE1hcCA9IGFuaW1hdGUKLSAgICAgICAgICAgICAgICAgICAgPyBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldEl0ZW1Cb3VuZE1hcChtVm9sdW1lR3JvdXBMaXN0LCBtVm9sdW1lR3JvdXBBZGFwdGVyKQotICAgICAgICAgICAgICAgICAgICA6IG51bGw7Ci0gICAgICAgICAgICBIYXNoTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgQml0bWFwRHJhd2FibGU+IHByZXZpb3VzUm91dGVCaXRtYXBNYXAgPSBhbmltYXRlCi0gICAgICAgICAgICAgICAgICAgID8gTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXRJdGVtQml0bWFwTWFwKG1Db250ZXh0LCBtVm9sdW1lR3JvdXBMaXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIpIDogbnVsbDsKLSAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkID0KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5nZXRJdGVtc0FkZGVkKG1Hcm91cE1lbWJlclJvdXRlcywgcm91dGVzKTsKLSAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQgPSBNZWRpYVJvdXRlRGlhbG9nSGVscGVyLmdldEl0ZW1zUmVtb3ZlZChtR3JvdXBNZW1iZXJSb3V0ZXMsCi0gICAgICAgICAgICAgICAgICAgIHJvdXRlcyk7Ci0gICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXMuYWRkQWxsKDAsIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkKTsKLSAgICAgICAgICAgIG1Hcm91cE1lbWJlclJvdXRlcy5yZW1vdmVBbGwobUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCk7Ci0gICAgICAgICAgICBtVm9sdW1lR3JvdXBBZGFwdGVyLm5vdGlmeURhdGFTZXRDaGFuZ2VkKCk7Ci0gICAgICAgICAgICBpZiAoYW5pbWF0ZSAmJiBtSXNHcm91cEV4cGFuZGVkCi0gICAgICAgICAgICAgICAgICAgICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLnNpemUoKSArIG1Hcm91cE1lbWJlclJvdXRlc1JlbW92ZWQuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIGFuaW1hdGVHcm91cExpc3RJdGVtcyhwcmV2aW91c1JvdXRlQm91bmRNYXAsIHByZXZpb3VzUm91dGVCaXRtYXBNYXApOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYW5pbWF0ZUdyb3VwTGlzdEl0ZW1zKGZpbmFsIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIFJlY3Q+IHByZXZpb3VzUm91dGVCb3VuZE1hcCwKLSAgICAgICAgICAgIGZpbmFsIE1hcDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8sIEJpdG1hcERyYXdhYmxlPiBwcmV2aW91c1JvdXRlQml0bWFwTWFwKSB7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3QucmVxdWVzdExheW91dCgpOwotICAgICAgICBtSXNHcm91cExpc3RBbmltYXRpbmcgPSB0cnVlOwotICAgICAgICBWaWV3VHJlZU9ic2VydmVyIG9ic2VydmVyID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRWaWV3VHJlZU9ic2VydmVyKCk7Ci0gICAgICAgIG9ic2VydmVyLmFkZE9uR2xvYmFsTGF5b3V0TGlzdGVuZXIobmV3IFZpZXdUcmVlT2JzZXJ2ZXIuT25HbG9iYWxMYXlvdXRMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25HbG9iYWxMYXlvdXQoKSB7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5nZXRWaWV3VHJlZU9ic2VydmVyKCkucmVtb3ZlR2xvYmFsT25MYXlvdXRMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgICAgICAgICBhbmltYXRlR3JvdXBMaXN0SXRlbXNJbnRlcm5hbChwcmV2aW91c1JvdXRlQm91bmRNYXAsIHByZXZpb3VzUm91dGVCaXRtYXBNYXApOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIGFuaW1hdGVHcm91cExpc3RJdGVtc0ludGVybmFsKAotICAgICAgICAgICAgTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgUmVjdD4gcHJldmlvdXNSb3V0ZUJvdW5kTWFwLAotICAgICAgICAgICAgTWFwPE1lZGlhUm91dGVyLlJvdXRlSW5mbywgQml0bWFwRHJhd2FibGU+IHByZXZpb3VzUm91dGVCaXRtYXBNYXApIHsKLSAgICAgICAgaWYgKG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkID09IG51bGwgfHwgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGdyb3VwU2l6ZURlbHRhID0gbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuc2l6ZSgpIC0gbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZC5zaXplKCk7Ci0gICAgICAgIGJvb2xlYW4gbGlzdGVuZXJSZWdpc3RlcmVkID0gZmFsc2U7Ci0gICAgICAgIEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0aW9uIGFuaW1hdGlvbikgewotICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc3RhcnRBbmltYXRpb25BbGwoKTsKLSAgICAgICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnBvc3REZWxheWVkKG1Hcm91cExpc3RGYWRlSW5BbmltYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25Ncyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25SZXBlYXQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9Ci0gICAgICAgIH07Ci0KLSAgICAgICAgLy8gQW5pbWF0ZSB2aXNpYmxlIGl0ZW1zIGZyb20gcHJldmlvdXMgcG9zaXRpb25zIHRvIGN1cnJlbnQgcG9zaXRpb25zIGV4Y2VwdCByb3V0ZXMgYWRkZWQKLSAgICAgICAgLy8ganVzdCBiZWZvcmUuIEFkZGVkIHJvdXRlcyB3aWxsIHJlbWFpbiBoaWRkZW4gdW50aWwgdHJhbnNsYXRlIGFuaW1hdGlvbiBmaW5pc2hlcy4KLSAgICAgICAgaW50IGZpcnN0ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0ICsgaTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Wb2x1bWVHcm91cEFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBSZWN0IHByZXZpb3VzQm91bmRzID0gcHJldmlvdXNSb3V0ZUJvdW5kTWFwLmdldChyb3V0ZSk7Ci0gICAgICAgICAgICBpbnQgY3VycmVudFRvcCA9IHZpZXcuZ2V0VG9wKCk7Ci0gICAgICAgICAgICBpbnQgcHJldmlvdXNUb3AgPSBwcmV2aW91c0JvdW5kcyAhPSBudWxsID8gcHJldmlvdXNCb3VuZHMudG9wCi0gICAgICAgICAgICAgICAgICAgIDogKGN1cnJlbnRUb3AgKyBtVm9sdW1lR3JvdXBMaXN0SXRlbUhlaWdodCAqIGdyb3VwU2l6ZURlbHRhKTsKLSAgICAgICAgICAgIEFuaW1hdGlvblNldCBhbmltU2V0ID0gbmV3IEFuaW1hdGlvblNldCh0cnVlKTsKLSAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCAhPSBudWxsICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgIHByZXZpb3VzVG9wID0gY3VycmVudFRvcDsKLSAgICAgICAgICAgICAgICBBbmltYXRpb24gYWxwaGFBbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKDAuMGYsIDAuMGYpOwotICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXREdXJhdGlvbihtR3JvdXBMaXN0RmFkZUluRHVyYXRpb25Ncyk7Ci0gICAgICAgICAgICAgICAgYW5pbVNldC5hZGRBbmltYXRpb24oYWxwaGFBbmltKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFuaW1hdGlvbiB0cmFuc2xhdGlvbkFuaW0gPSBuZXcgVHJhbnNsYXRlQW5pbWF0aW9uKDAsIDAsIHByZXZpb3VzVG9wIC0gY3VycmVudFRvcCwgMCk7Ci0gICAgICAgICAgICB0cmFuc2xhdGlvbkFuaW0uc2V0RHVyYXRpb24obUdyb3VwTGlzdEFuaW1hdGlvbkR1cmF0aW9uTXMpOwotICAgICAgICAgICAgYW5pbVNldC5hZGRBbmltYXRpb24odHJhbnNsYXRpb25BbmltKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0RmlsbEFmdGVyKHRydWUpOwotICAgICAgICAgICAgYW5pbVNldC5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0SW50ZXJwb2xhdG9yKG1JbnRlcnBvbGF0b3IpOwotICAgICAgICAgICAgaWYgKCFsaXN0ZW5lclJlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lclJlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIGFuaW1TZXQuc2V0QW5pbWF0aW9uTGlzdGVuZXIobGlzdGVuZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmlldy5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICAgICAgdmlldy5zdGFydEFuaW1hdGlvbihhbmltU2V0KTsKLSAgICAgICAgICAgIHByZXZpb3VzUm91dGVCb3VuZE1hcC5yZW1vdmUocm91dGUpOwotICAgICAgICAgICAgcHJldmlvdXNSb3V0ZUJpdG1hcE1hcC5yZW1vdmUocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSWYgYSBtZW1iZXIgcm91dGUgZG9lc24ndCBleGlzdCBhbnkgbG9uZ2VyLCBpdCBjYW4gYmUgZWl0aGVyIHJlbW92ZWQgb3IgbW92ZWQgb3V0IG9mIHRoZQotICAgICAgICAvLyBMaXN0VmlldyBsYXlvdXQgYm91bmRhcnkuIEluIHRoaXMgY2FzZSwgdXNlIHRoZSBwcmV2aW91c2x5IGNhcHR1cmVkIGJpdG1hcHMgZm9yCi0gICAgICAgIC8vIGFuaW1hdGlvbi4KLSAgICAgICAgZm9yIChNYXAuRW50cnk8TWVkaWFSb3V0ZXIuUm91dGVJbmZvLCBCaXRtYXBEcmF3YWJsZT4gaXRlbQotICAgICAgICAgICAgICAgIDogcHJldmlvdXNSb3V0ZUJpdG1hcE1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBpdGVtLmdldEtleSgpOwotICAgICAgICAgICAgZmluYWwgQml0bWFwRHJhd2FibGUgYml0bWFwID0gaXRlbS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgZmluYWwgUmVjdCBib3VuZHMgPSBwcmV2aW91c1JvdXRlQm91bmRNYXAuZ2V0KHJvdXRlKTsKLSAgICAgICAgICAgIE92ZXJsYXlPYmplY3Qgb2JqZWN0ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNSZW1vdmVkLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBPdmVybGF5T2JqZWN0KGJpdG1hcCwgYm91bmRzKS5zZXRBbHBoYUFuaW1hdGlvbigxLjBmLCAwLjBmKQotICAgICAgICAgICAgICAgICAgICAgICAgLnNldER1cmF0aW9uKG1Hcm91cExpc3RGYWRlT3V0RHVyYXRpb25NcykKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGludCBkZWx0YVkgPSBncm91cFNpemVEZWx0YSAqIG1Wb2x1bWVHcm91cExpc3RJdGVtSGVpZ2h0OwotICAgICAgICAgICAgICAgIG9iamVjdCA9IG5ldyBPdmVybGF5T2JqZWN0KGJpdG1hcCwgYm91bmRzKS5zZXRUcmFuc2xhdGVZQW5pbWF0aW9uKGRlbHRhWSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREdXJhdGlvbihtR3JvdXBMaXN0QW5pbWF0aW9uRHVyYXRpb25NcykKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRJbnRlcnBvbGF0b3IobUludGVycG9sYXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXRBbmltYXRpb25FbmRMaXN0ZW5lcihuZXcgT3ZlcmxheU9iamVjdC5PbkFuaW1hdGlvbkVuZExpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uRW5kKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwLnJlbW92ZShyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cEFkYXB0ZXIubm90aWZ5RGF0YVNldENoYW5nZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwLmFkZChyb3V0ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LmFkZE92ZXJsYXlPYmplY3Qob2JqZWN0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc3RhcnRHcm91cExpc3RGYWRlSW5BbmltYXRpb24oKSB7Ci0gICAgICAgIGNsZWFyR3JvdXBMaXN0QW5pbWF0aW9uKHRydWUpOwotICAgICAgICBtVm9sdW1lR3JvdXBMaXN0LnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgVmlld1RyZWVPYnNlcnZlciBvYnNlcnZlciA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpOwotICAgICAgICBvYnNlcnZlci5hZGRPbkdsb2JhbExheW91dExpc3RlbmVyKG5ldyBWaWV3VHJlZU9ic2VydmVyLk9uR2xvYmFsTGF5b3V0TGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uR2xvYmFsTGF5b3V0KCkgewotICAgICAgICAgICAgICAgIG1Wb2x1bWVHcm91cExpc3QuZ2V0Vmlld1RyZWVPYnNlcnZlcigpLnJlbW92ZUdsb2JhbE9uTGF5b3V0TGlzdGVuZXIodGhpcyk7Ci0gICAgICAgICAgICAgICAgc3RhcnRHcm91cExpc3RGYWRlSW5BbmltYXRpb25JbnRlcm5hbCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIHN0YXJ0R3JvdXBMaXN0RmFkZUluQW5pbWF0aW9uSW50ZXJuYWwoKSB7Ci0gICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCAhPSBudWxsICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICBmYWRlSW5BZGRlZFJvdXRlcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmluaXNoQW5pbWF0aW9uKHRydWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBmaW5pc2hBbmltYXRpb24oYm9vbGVhbiBhbmltYXRlKSB7Ci0gICAgICAgIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkID0gbnVsbDsKLSAgICAgICAgbUdyb3VwTWVtYmVyUm91dGVzUmVtb3ZlZCA9IG51bGw7Ci0gICAgICAgIG1Jc0dyb3VwTGlzdEFuaW1hdGluZyA9IGZhbHNlOwotICAgICAgICBpZiAobUlzR3JvdXBMaXN0QW5pbWF0aW9uUGVuZGluZykgewotICAgICAgICAgICAgbUlzR3JvdXBMaXN0QW5pbWF0aW9uUGVuZGluZyA9IGZhbHNlOwotICAgICAgICAgICAgdXBkYXRlTGF5b3V0SGVpZ2h0KGFuaW1hdGUpOwotICAgICAgICB9Ci0gICAgICAgIG1Wb2x1bWVHcm91cExpc3Quc2V0RW5hYmxlZCh0cnVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmFkZUluQWRkZWRSb3V0ZXMoKSB7Ci0gICAgICAgIEFuaW1hdGlvbi5BbmltYXRpb25MaXN0ZW5lciBsaXN0ZW5lciA9IG5ldyBBbmltYXRpb24uQW5pbWF0aW9uTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQW5pbWF0aW9uU3RhcnQoQW5pbWF0aW9uIGFuaW1hdGlvbikgeyB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25BbmltYXRpb25FbmQoQW5pbWF0aW9uIGFuaW1hdGlvbikgewotICAgICAgICAgICAgICAgIGZpbmlzaEFuaW1hdGlvbih0cnVlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvblJlcGVhdChBbmltYXRpb24gYW5pbWF0aW9uKSB7IH0KLSAgICAgICAgfTsKLSAgICAgICAgYm9vbGVhbiBsaXN0ZW5lclJlZ2lzdGVyZWQgPSBmYWxzZTsKLSAgICAgICAgaW50IGZpcnN0ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0ICsgaTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Wb2x1bWVHcm91cEFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAobUdyb3VwTWVtYmVyUm91dGVzQWRkZWQuY29udGFpbnMocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgQW5pbWF0aW9uIGFscGhhQW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbigwLjBmLCAxLjBmKTsKLSAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RHVyYXRpb24obUdyb3VwTGlzdEZhZGVJbkR1cmF0aW9uTXMpOwotICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RmlsbEFmdGVyKHRydWUpOwotICAgICAgICAgICAgICAgIGlmICghbGlzdGVuZXJSZWdpc3RlcmVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGxpc3RlbmVyUmVnaXN0ZXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRBbmltYXRpb25MaXN0ZW5lcihsaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHZpZXcuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgICAgICAgICB2aWV3LnN0YXJ0QW5pbWF0aW9uKGFscGhhQW5pbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGNsZWFyR3JvdXBMaXN0QW5pbWF0aW9uKGJvb2xlYW4gZXhjZXB0QWRkZWRSb3V0ZXMpIHsKLSAgICAgICAgaW50IGZpcnN0ID0gbVZvbHVtZUdyb3VwTGlzdC5nZXRGaXJzdFZpc2libGVQb3NpdGlvbigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRDb3VudCgpOyArK2kpIHsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IG1Wb2x1bWVHcm91cExpc3QuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGludCBwb3NpdGlvbiA9IGZpcnN0ICsgaTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSA9IG1Wb2x1bWVHcm91cEFkYXB0ZXIuZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAoZXhjZXB0QWRkZWRSb3V0ZXMgJiYgbUdyb3VwTWVtYmVyUm91dGVzQWRkZWQgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZC5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExpbmVhckxheW91dCBjb250YWluZXIgPSAoTGluZWFyTGF5b3V0KSB2aWV3LmZpbmRWaWV3QnlJZChSLmlkLnZvbHVtZV9pdGVtX2NvbnRhaW5lcik7Ci0gICAgICAgICAgICBjb250YWluZXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgQW5pbWF0aW9uU2V0IGFuaW1TZXQgPSBuZXcgQW5pbWF0aW9uU2V0KHRydWUpOwotICAgICAgICAgICAgQW5pbWF0aW9uIGFscGhhQW5pbSA9IG5ldyBBbHBoYUFuaW1hdGlvbigxLjBmLCAxLjBmKTsKLSAgICAgICAgICAgIGFscGhhQW5pbS5zZXREdXJhdGlvbigwKTsKLSAgICAgICAgICAgIGFuaW1TZXQuYWRkQW5pbWF0aW9uKGFscGhhQW5pbSk7Ci0gICAgICAgICAgICBBbmltYXRpb24gdHJhbnNsYXRpb25BbmltID0gbmV3IFRyYW5zbGF0ZUFuaW1hdGlvbigwLCAwLCAwLCAwKTsKLSAgICAgICAgICAgIHRyYW5zbGF0aW9uQW5pbS5zZXREdXJhdGlvbigwKTsKLSAgICAgICAgICAgIGFuaW1TZXQuc2V0RmlsbEFmdGVyKHRydWUpOwotICAgICAgICAgICAgYW5pbVNldC5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgIHZpZXcuY2xlYXJBbmltYXRpb24oKTsKLSAgICAgICAgICAgIHZpZXcuc3RhcnRBbmltYXRpb24oYW5pbVNldCk7Ci0gICAgICAgIH0KLSAgICAgICAgbVZvbHVtZUdyb3VwTGlzdC5zdG9wQW5pbWF0aW9uQWxsKCk7Ci0gICAgICAgIGlmICghZXhjZXB0QWRkZWRSb3V0ZXMpIHsKLSAgICAgICAgICAgIGZpbmlzaEFuaW1hdGlvbihmYWxzZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWJhY2tDb250cm9sTGF5b3V0KCkgewotICAgICAgICBpZiAoY2FuU2hvd1BsYXliYWNrQ29udHJvbExheW91dCgpKSB7Ci0gICAgICAgICAgICBDaGFyU2VxdWVuY2UgdGl0bGUgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0VGl0bGUoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzVGl0bGUgPSAhVGV4dFV0aWxzLmlzRW1wdHkodGl0bGUpOwotCi0gICAgICAgICAgICBDaGFyU2VxdWVuY2Ugc3VidGl0bGUgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0U3VidGl0bGUoKTsKLSAgICAgICAgICAgIGJvb2xlYW4gaGFzU3VidGl0bGUgPSAhVGV4dFV0aWxzLmlzRW1wdHkoc3VidGl0bGUpOwotCi0gICAgICAgICAgICBib29sZWFuIHNob3dUaXRsZSA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbGVhbiBzaG93U3VidGl0bGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChtUm91dGUuZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkKLSAgICAgICAgICAgICAgICAgICAgIT0gTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBSRVNFTlRBVElPTl9ESVNQTEFZX0lEX05PTkUpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgdXNlciBpcyBjdXJyZW50bHkgY2FzdGluZyBzY3JlZW4uCi0gICAgICAgICAgICAgICAgbVRpdGxlVmlldy5zZXRUZXh0KEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfY2FzdGluZ19zY3JlZW4pKTsKLSAgICAgICAgICAgICAgICBzaG93VGl0bGUgPSB0cnVlOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtU3RhdGUgPT0gbnVsbCB8fCBtU3RhdGUuZ2V0U3RhdGUoKSA9PSBQbGF5YmFja1N0YXRlQ29tcGF0LlNUQVRFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAvLyBTaG93ICJObyBtZWRpYSBzZWxlY3RlZCIgYXMgd2UgZG9uJ3QgeWV0IGtub3cgdGhlIHBsYXliYWNrIHN0YXRlLgotICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5tcl9jb250cm9sbGVyX25vX21lZGlhX3NlbGVjdGVkKSk7Ci0gICAgICAgICAgICAgICAgc2hvd1RpdGxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWhhc1RpdGxlICYmICFoYXNTdWJ0aXRsZSkgewotICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dChBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1Db250ZXh0KS5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICBSLnN0cmluZy5tcl9jb250cm9sbGVyX25vX2luZm9fYXZhaWxhYmxlKSk7Ci0gICAgICAgICAgICAgICAgc2hvd1RpdGxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaWYgKGhhc1RpdGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VGV4dCh0aXRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIHNob3dUaXRsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChoYXNTdWJ0aXRsZSkgewotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVWaWV3LnNldFRleHQoc3VidGl0bGUpOwotICAgICAgICAgICAgICAgICAgICBzaG93U3VidGl0bGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VmlzaWJpbGl0eShzaG93VGl0bGUgPyBWaWV3LlZJU0lCTEUgOiBWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KHNob3dTdWJ0aXRsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0KLSAgICAgICAgICAgIGlmIChtU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQbGF5aW5nID0gbVN0YXRlLmdldFN0YXRlKCkgPT0gUGxheWJhY2tTdGF0ZUNvbXBhdC5TVEFURV9CVUZGRVJJTkcKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1TdGF0ZS5nZXRTdGF0ZSgpID09IFBsYXliYWNrU3RhdGVDb21wYXQuU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgICAgICBDb250ZXh0IHBsYXliYWNrQ29udHJvbEJ1dHRvbkNvbnRleHQgPSBtUGxheWJhY2tDb250cm9sQnV0dG9uLmdldENvbnRleHQoKTsKLSAgICAgICAgICAgICAgICBib29sZWFuIHZpc2libGUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGludCBpY29uRHJhd2FibGVBdHRyID0gMDsKLSAgICAgICAgICAgICAgICBpbnQgaWNvbkRlc2NSZXNJZCA9IDA7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUGxheWluZyAmJiBpc1BhdXNlQWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRyYXdhYmxlQXR0ciA9IFIuYXR0ci5tZWRpYVJvdXRlUGF1c2VEcmF3YWJsZTsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRlc2NSZXNJZCA9IFIuc3RyaW5nLm1yX2NvbnRyb2xsZXJfcGF1c2U7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1BsYXlpbmcgJiYgaXNTdG9wQWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWNvbkRyYXdhYmxlQXR0ciA9IFIuYXR0ci5tZWRpYVJvdXRlU3RvcERyYXdhYmxlOwotICAgICAgICAgICAgICAgICAgICBpY29uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9zdG9wOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzUGxheWluZyAmJiBpc1BsYXlBY3Rpb25TdXBwb3J0ZWQoKSkgewotICAgICAgICAgICAgICAgICAgICBpY29uRHJhd2FibGVBdHRyID0gUi5hdHRyLm1lZGlhUm91dGVQbGF5RHJhd2FibGU7Ci0gICAgICAgICAgICAgICAgICAgIGljb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3BsYXk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdmlzaWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGxheWJhY2tDb250cm9sQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJsZSA/IFZpZXcuVklTSUJMRSA6IFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgaWYgKHZpc2libGUpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5zZXRJbWFnZVJlc291cmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0VGhlbWVSZXNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrQ29udHJvbEJ1dHRvbkNvbnRleHQsIGljb25EcmF3YWJsZUF0dHIpKTsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrQ29udHJvbEJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWJhY2tDb250cm9sQnV0dG9uQ29udGV4dC5nZXRSZXNvdXJjZXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFRleHQoaWNvbkRlc2NSZXNJZCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBpc1BsYXlBY3Rpb25TdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiAobVN0YXRlLmdldEFjdGlvbnMoKSAmIChBQ1RJT05fUExBWSB8IEFDVElPTl9QTEFZX1BBVVNFKSkgIT0gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNQYXVzZUFjdGlvblN1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIChtU3RhdGUuZ2V0QWN0aW9ucygpICYgKEFDVElPTl9QQVVTRSB8IEFDVElPTl9QTEFZX1BBVVNFKSkgIT0gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNTdG9wQWN0aW9uU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gKG1TdGF0ZS5nZXRBY3Rpb25zKCkgJiBBQ1RJT05fU1RPUCkgIT0gMDsKLSAgICB9Ci0KLSAgICBib29sZWFuIGlzVm9sdW1lQ29udHJvbEF2YWlsYWJsZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgcmV0dXJuIG1Wb2x1bWVDb250cm9sRW5hYmxlZCAmJiByb3V0ZS5nZXRWb2x1bWVIYW5kbGluZygpCi0gICAgICAgICAgICAgICAgPT0gTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBpbnQgZ2V0TGF5b3V0SGVpZ2h0KFZpZXcgdmlldykgewotICAgICAgICByZXR1cm4gdmlldy5nZXRMYXlvdXRQYXJhbXMoKS5oZWlnaHQ7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2V0TGF5b3V0SGVpZ2h0KFZpZXcgdmlldywgaW50IGhlaWdodCkgewotICAgICAgICBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGxwID0gdmlldy5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgbHAuaGVpZ2h0ID0gaGVpZ2h0OwotICAgICAgICB2aWV3LnNldExheW91dFBhcmFtcyhscCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB1cmlFcXVhbHMoVXJpIHVyaTEsIFVyaSB1cmkyKSB7Ci0gICAgICAgIGlmICh1cmkxICE9IG51bGwgJiYgdXJpMS5lcXVhbHModXJpMikpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgaWYgKHVyaTEgPT0gbnVsbCAmJiB1cmkyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGRlc2lyZWQgYXJ0IGhlaWdodCB0byBmaXQgaW50byBjb250cm9sbGVyIGRpYWxvZy4KLSAgICAgKi8KLSAgICBpbnQgZ2V0RGVzaXJlZEFydEhlaWdodChpbnQgb3JpZ2luYWxXaWR0aCwgaW50IG9yaWdpbmFsSGVpZ2h0KSB7Ci0gICAgICAgIGlmIChvcmlnaW5hbFdpZHRoID49IG9yaWdpbmFsSGVpZ2h0KSB7Ci0gICAgICAgICAgICAvLyBGb3IgbGFuZHNjYXBlIGFydCwgZml0IHdpZHRoIHRvIGRpYWxvZyB3aWR0aC4KLSAgICAgICAgICAgIHJldHVybiAoaW50KSAoKGZsb2F0KSBtRGlhbG9nQ29udGVudFdpZHRoICogb3JpZ2luYWxIZWlnaHQgLyBvcmlnaW5hbFdpZHRoICsgMC41Zik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gRm9yIHBvcnRyYWl0IGFydCwgZml0IGhlaWdodCB0byAxNjo5IHJhdGlvIGNhc2UncyBoZWlnaHQuCi0gICAgICAgIHJldHVybiAoaW50KSAoKGZsb2F0KSBtRGlhbG9nQ29udGVudFdpZHRoICogOSAvIDE2ICsgMC41Zik7Ci0gICAgfQotCi0gICAgdm9pZCB1cGRhdGVBcnRJY29uSWZOZWVkZWQoKSB7Ci0gICAgICAgIGlmIChtQ3VzdG9tQ29udHJvbFZpZXcgIT0gbnVsbCB8fCAhaXNJY29uQ2hhbmdlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1GZXRjaEFydFRhc2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbUZldGNoQXJ0VGFzay5jYW5jZWwodHJ1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUZldGNoQXJ0VGFzayA9IG5ldyBGZXRjaEFydFRhc2soKTsKLSAgICAgICAgbUZldGNoQXJ0VGFzay5leGVjdXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2xlYXIgdGhlIGJpdG1hcCBsb2FkZWQgYnkgRmV0Y2hBcnRUYXNrLiBXaWxsIGJlIGNhbGxlZCBhZnRlciB0aGUgbG9hZGVkIGJpdG1hcHMgYXJlIGFwcGxpZWQKLSAgICAgKiB0byBhcnR3b3JrLCBvciBubyBsb25nZXIgdmFsaWQuCi0gICAgICovCi0gICAgdm9pZCBjbGVhckxvYWRlZEJpdG1hcCgpIHsKLSAgICAgICAgbUFydEljb25Jc0xvYWRlZCA9IGZhbHNlOwotICAgICAgICBtQXJ0SWNvbkxvYWRlZEJpdG1hcCA9IG51bGw7Ci0gICAgICAgIG1BcnRJY29uQmFja2dyb3VuZENvbG9yID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHdoZXRoZXIgYSBuZXcgYXJ0IGltYWdlIGlzIGRpZmZlcmVudCBmcm9tIGFuIG9yaWdpbmFsIGFydCBpbWFnZS4gQ29tcGFyZXMKLSAgICAgKiBCaXRtYXAgb2JqZWN0cyBmaXJzdCwgYW5kIHRoZW4gY29tcGFyZXMgVVJJcyBvbmx5IGlmIGJpdG1hcCBpcyB1bmNoYW5nZWQgd2l0aAotICAgICAqIGEgbnVsbCB2YWx1ZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gaXNJY29uQ2hhbmdlZCgpIHsKLSAgICAgICAgQml0bWFwIG5ld0JpdG1hcCA9IG1EZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IG1EZXNjcmlwdGlvbi5nZXRJY29uQml0bWFwKCk7Ci0gICAgICAgIFVyaSBuZXdVcmkgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0SWNvblVyaSgpOwotICAgICAgICBCaXRtYXAgb2xkQml0bWFwID0gbUZldGNoQXJ0VGFzayA9PSBudWxsID8gbUFydEljb25CaXRtYXAgOiBtRmV0Y2hBcnRUYXNrLmdldEljb25CaXRtYXAoKTsKLSAgICAgICAgVXJpIG9sZFVyaSA9IG1GZXRjaEFydFRhc2sgPT0gbnVsbCA/IG1BcnRJY29uVXJpIDogbUZldGNoQXJ0VGFzay5nZXRJY29uVXJpKCk7Ci0gICAgICAgIGlmIChvbGRCaXRtYXAgIT0gbmV3Qml0bWFwKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmIChvbGRCaXRtYXAgPT0gbnVsbCAmJiAhdXJpRXF1YWxzKG9sZFVyaSwgbmV3VXJpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgICAgTWVkaWFSb3V0ZXJDYWxsYmFjaygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVW5zZWxlY3RlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgdXBkYXRlKGZhbHNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgdXBkYXRlKHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBTZWVrQmFyIHZvbHVtZVNsaWRlciA9IG1Wb2x1bWVTbGlkZXJNYXAuZ2V0KHJvdXRlKTsKLSAgICAgICAgICAgIGludCB2b2x1bWUgPSByb3V0ZS5nZXRWb2x1bWUoKTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uUm91dGVWb2x1bWVDaGFuZ2VkKCksIHJvdXRlLmdldFZvbHVtZToiICsgdm9sdW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh2b2x1bWVTbGlkZXIgIT0gbnVsbCAmJiBtUm91dGVJblZvbHVtZVNsaWRlclRvdWNoZWQgIT0gcm91dGUpIHsKLSAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0UHJvZ3Jlc3Modm9sdW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYUNvbnRyb2xsZXJDb21wYXQuQ2FsbGJhY2sgewotICAgICAgICBNZWRpYUNvbnRyb2xsZXJDYWxsYmFjaygpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlc3Npb25EZXN0cm95ZWQoKSB7Ci0gICAgICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci51bnJlZ2lzdGVyQ2FsbGJhY2sobUNvbnRyb2xsZXJDYWxsYmFjayk7Ci0gICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5YmFja1N0YXRlQ2hhbmdlZChQbGF5YmFja1N0YXRlQ29tcGF0IHN0YXRlKSB7Ci0gICAgICAgICAgICBtU3RhdGUgPSBzdGF0ZTsKLSAgICAgICAgICAgIHVwZGF0ZShmYWxzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25NZXRhZGF0YUNoYW5nZWQoTWVkaWFNZXRhZGF0YUNvbXBhdCBtZXRhZGF0YSkgewotICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gbWV0YWRhdGEgPT0gbnVsbCA/IG51bGwgOiBtZXRhZGF0YS5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgdXBkYXRlQXJ0SWNvbklmTmVlZGVkKCk7Ci0gICAgICAgICAgICB1cGRhdGUoZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDbGlja0xpc3RlbmVyIGltcGxlbWVudHMgVmlldy5PbkNsaWNrTGlzdGVuZXIgewotICAgICAgICBDbGlja0xpc3RlbmVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBpbnQgaWQgPSB2LmdldElkKCk7Ci0gICAgICAgICAgICBpZiAoaWQgPT0gQlVUVE9OX1NUT1BfUkVTX0lEIHx8IGlkID09IEJVVFRPTl9ESVNDT05ORUNUX1JFU19JRCkgewotICAgICAgICAgICAgICAgIGlmIChtUm91dGUuaXNTZWxlY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXIudW5zZWxlY3QoaWQgPT0gQlVUVE9OX1NUT1BfUkVTX0lEID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fU1RPUFBFRCA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gUi5pZC5tcl9jb250cm9sX3BsYXliYWNrX2N0cmwpIHsKLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhQ29udHJvbGxlciAhPSBudWxsICYmIG1TdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNQbGF5aW5nID0gbVN0YXRlLmdldFN0YXRlKCkgPT0gUGxheWJhY2tTdGF0ZUNvbXBhdC5TVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgICAgICAgICBpbnQgYWN0aW9uRGVzY1Jlc0lkID0gMDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzUGxheWluZyAmJiBpc1BhdXNlQWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wYXVzZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9wYXVzZTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChpc1BsYXlpbmcgJiYgaXNTdG9wQWN0aW9uU3VwcG9ydGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5zdG9wKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb25EZXNjUmVzSWQgPSBSLnN0cmluZy5tcl9jb250cm9sbGVyX3N0b3A7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzUGxheWluZyAmJiBpc1BsYXlBY3Rpb25TdXBwb3J0ZWQoKSl7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aW9uRGVzY1Jlc0lkID0gUi5zdHJpbmcubXJfY29udHJvbGxlcl9wbGF5OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIEFubm91bmNlIHRoZSBhY3Rpb24gZm9yIGFjY2Vzc2liaWxpdHkuCi0gICAgICAgICAgICAgICAgICAgIGlmIChtQWNjZXNzaWJpbGl0eU1hbmFnZXIgIT0gbnVsbCAmJiBtQWNjZXNzaWJpbGl0eU1hbmFnZXIuaXNFbmFibGVkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhY3Rpb25EZXNjUmVzSWQgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50IGV2ZW50ID0gQWNjZXNzaWJpbGl0eUV2ZW50Lm9idGFpbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWNjZXNzaWJpbGl0eUV2ZW50Q29tcGF0LlRZUEVfQU5OT1VOQ0VNRU5UKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LnNldFBhY2thZ2VOYW1lKG1Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQuc2V0Q2xhc3NOYW1lKGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmdldFRleHQoKS5hZGQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMobUNvbnRleHQpLmdldFN0cmluZyhhY3Rpb25EZXNjUmVzSWQpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlci5zZW5kQWNjZXNzaWJpbGl0eUV2ZW50KGV2ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAoaWQgPT0gUi5pZC5tcl9jbG9zZSkgewotICAgICAgICAgICAgICAgIGRpc21pc3MoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgVm9sdW1lQ2hhbmdlTGlzdGVuZXIgaW1wbGVtZW50cyBTZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtU3RvcFRyYWNraW5nVG91Y2ggPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICBpZiAobVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlSW5Wb2x1bWVTbGlkZXJUb3VjaGVkID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1IYXNQZW5kaW5nVXBkYXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGUobVBlbmRpbmdVcGRhdGVBbmltYXRpb25OZWVkZWQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIFZvbHVtZUNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RhcnRUcmFja2luZ1RvdWNoKFNlZWtCYXIgc2Vla0JhcikgewotICAgICAgICAgICAgaWYgKG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlci5yZW1vdmVDYWxsYmFja3MobVN0b3BUcmFja2luZ1RvdWNoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Sb3V0ZUluVm9sdW1lU2xpZGVyVG91Y2hlZCA9IChNZWRpYVJvdXRlci5Sb3V0ZUluZm8pIHNlZWtCYXIuZ2V0VGFnKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TdG9wVHJhY2tpbmdUb3VjaChTZWVrQmFyIHNlZWtCYXIpIHsKLSAgICAgICAgICAgIC8vIERlZmVyIHJlc2V0dGluZyBtVm9sdW1lU2xpZGVyVG91Y2hlZCB0byBhbGxvdyB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIKLSAgICAgICAgICAgIC8vIGEgbGl0dGxlIHRpbWUgdG8gc2V0dGxlIGludG8gaXRzIG5ldyBzdGF0ZSBhbmQgcHVibGlzaCB0aGUgZmluYWwKLSAgICAgICAgICAgIC8vIHZvbHVtZSB1cGRhdGUuCi0gICAgICAgICAgICBtVm9sdW1lU2xpZGVyLnBvc3REZWxheWVkKG1TdG9wVHJhY2tpbmdUb3VjaCwgVk9MVU1FX1VQREFURV9ERUxBWV9NSUxMSVMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvZ3Jlc3NDaGFuZ2VkKFNlZWtCYXIgc2Vla0JhciwgaW50IHByb2dyZXNzLCBib29sZWFuIGZyb21Vc2VyKSB7Ci0gICAgICAgICAgICBpZiAoZnJvbVVzZXIpIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSAoTWVkaWFSb3V0ZXIuUm91dGVJbmZvKSBzZWVrQmFyLmdldFRhZygpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblByb2dyZXNzQ2hhbmdlZCgpOiBjYWxsaW5nICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJNZWRpYVJvdXRlci5Sb3V0ZUluZm8ucmVxdWVzdFNldFZvbHVtZSgiICsgcHJvZ3Jlc3MgKyAiKSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByb3V0ZS5yZXF1ZXN0U2V0Vm9sdW1lKHByb2dyZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgVm9sdW1lR3JvdXBBZGFwdGVyIGV4dGVuZHMgQXJyYXlBZGFwdGVyPE1lZGlhUm91dGVyLlJvdXRlSW5mbz4gewotICAgICAgICBmaW5hbCBmbG9hdCBtRGlzYWJsZWRBbHBoYTsKLQotICAgICAgICBwdWJsaWMgVm9sdW1lR3JvdXBBZGFwdGVyKENvbnRleHQgY29udGV4dCwgTGlzdDxNZWRpYVJvdXRlci5Sb3V0ZUluZm8+IG9iamVjdHMpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIDAsIG9iamVjdHMpOwotICAgICAgICAgICAgbURpc2FibGVkQWxwaGEgPSBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldERpc2FibGVkQWxwaGEoY29udGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNFbmFibGVkKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoZmluYWwgaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgcGFyZW50KSB7Ci0gICAgICAgICAgICBWaWV3IHYgPSBjb252ZXJ0VmlldzsKLSAgICAgICAgICAgIGlmICh2ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB2ID0gTGF5b3V0SW5mbGF0ZXIuZnJvbShwYXJlbnQuZ2V0Q29udGV4dCgpKS5pbmZsYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQubXJfY29udHJvbGxlcl92b2x1bWVfaXRlbSwgcGFyZW50LCBmYWxzZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHVwZGF0ZVZvbHVtZUdyb3VwSXRlbUhlaWdodCh2KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gZ2V0SXRlbShwb3NpdGlvbik7Ci0gICAgICAgICAgICBpZiAocm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNFbmFibGVkID0gcm91dGUuaXNFbmFibGVkKCk7Ci0KLSAgICAgICAgICAgICAgICBUZXh0VmlldyByb3V0ZU5hbWUgPSAoVGV4dFZpZXcpIHYuZmluZFZpZXdCeUlkKFIuaWQubXJfbmFtZSk7Ci0gICAgICAgICAgICAgICAgcm91dGVOYW1lLnNldEVuYWJsZWQoaXNFbmFibGVkKTsKLSAgICAgICAgICAgICAgICByb3V0ZU5hbWUuc2V0VGV4dChyb3V0ZS5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlciB2b2x1bWVTbGlkZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgKE1lZGlhUm91dGVWb2x1bWVTbGlkZXIpIHYuZmluZFZpZXdCeUlkKFIuaWQubXJfdm9sdW1lX3NsaWRlcik7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5zZXRWb2x1bWVTbGlkZXJDb2xvcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5nZXRDb250ZXh0KCksIHZvbHVtZVNsaWRlciwgbVZvbHVtZUdyb3VwTGlzdCk7Ci0gICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFRhZyhyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgbVZvbHVtZVNsaWRlck1hcC5wdXQocm91dGUsIHZvbHVtZVNsaWRlcik7Ci0gICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldEhpZGVUaHVtYighaXNFbmFibGVkKTsKLSAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0RW5hYmxlZChpc0VuYWJsZWQpOwotICAgICAgICAgICAgICAgIGlmIChpc0VuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzVm9sdW1lQ29udHJvbEF2YWlsYWJsZShyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRNYXgocm91dGUuZ2V0Vm9sdW1lTWF4KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKHJvdXRlLmdldFZvbHVtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZVNsaWRlci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcihtVm9sdW1lQ2hhbmdlTGlzdGVuZXIpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldE1heCgxMDApOwotICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lU2xpZGVyLnNldFByb2dyZXNzKDEwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVTbGlkZXIuc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBJbWFnZVZpZXcgdm9sdW1lSXRlbUljb24gPQotICAgICAgICAgICAgICAgICAgICAgICAgKEltYWdlVmlldykgdi5maW5kVmlld0J5SWQoUi5pZC5tcl92b2x1bWVfaXRlbV9pY29uKTsKLSAgICAgICAgICAgICAgICB2b2x1bWVJdGVtSWNvbi5zZXRBbHBoYShpc0VuYWJsZWQgPyAweEZGIDogKGludCkgKDB4RkYgKiBtRGlzYWJsZWRBbHBoYSkpOwotCi0gICAgICAgICAgICAgICAgLy8gSWYgb3ZlcmxheSBiaXRtYXAgZXhpc3RzLCByZWFsIHZpZXcgc2hvdWxkIHJlbWFpbiBoaWRkZW4gdW50aWwKLSAgICAgICAgICAgICAgICAvLyB0aGUgYW5pbWF0aW9uIGVuZHMuCi0gICAgICAgICAgICAgICAgTGluZWFyTGF5b3V0IGNvbnRhaW5lciA9IChMaW5lYXJMYXlvdXQpIHYuZmluZFZpZXdCeUlkKFIuaWQudm9sdW1lX2l0ZW1fY29udGFpbmVyKTsKLSAgICAgICAgICAgICAgICBjb250YWluZXIuc2V0VmlzaWJpbGl0eShtR3JvdXBNZW1iZXJSb3V0ZXNBbmltYXRpbmdXaXRoQml0bWFwLmNvbnRhaW5zKHJvdXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgPyBWaWV3LklOVklTSUJMRSA6IFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSb3V0ZXMgd2hpY2ggYXJlIGJlaW5nIGFkZGVkIHdpbGwgYmUgaW52aXNpYmxlIHVudGlsIGFuaW1hdGlvbiBlbmRzLgotICAgICAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJSb3V0ZXNBZGRlZCAhPSBudWxsICYmIG1Hcm91cE1lbWJlclJvdXRlc0FkZGVkLmNvbnRhaW5zKHJvdXRlKSkgewotICAgICAgICAgICAgICAgICAgICBBbmltYXRpb24gYWxwaGFBbmltID0gbmV3IEFscGhhQW5pbWF0aW9uKDAuMGYsIDAuMGYpOwotICAgICAgICAgICAgICAgICAgICBhbHBoYUFuaW0uc2V0RHVyYXRpb24oMCk7Ci0gICAgICAgICAgICAgICAgICAgIGFscGhhQW5pbS5zZXRGaWxsRW5hYmxlZCh0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgYWxwaGFBbmltLnNldEZpbGxBZnRlcih0cnVlKTsKLSAgICAgICAgICAgICAgICAgICAgdi5jbGVhckFuaW1hdGlvbigpOwotICAgICAgICAgICAgICAgICAgICB2LnN0YXJ0QW5pbWF0aW9uKGFscGhhQW5pbSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEZldGNoQXJ0VGFzayBleHRlbmRzIEFzeW5jVGFzazxWb2lkLCBWb2lkLCBCaXRtYXA+IHsKLSAgICAgICAgLy8gU2hvdyBhbmltYXRpb24gb25seSB3aGVuIGZldGNoaW5nIHRha2VzIGEgbG9uZyB0aW1lLgotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIFNIT1dfQU5JTV9USU1FX1RIUkVTSE9MRF9NSUxMSVMgPSAxMjBMOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgQml0bWFwIG1JY29uQml0bWFwOwotICAgICAgICBwcml2YXRlIGZpbmFsIFVyaSBtSWNvblVyaTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUJhY2tncm91bmRDb2xvcjsKLSAgICAgICAgcHJpdmF0ZSBsb25nIG1TdGFydFRpbWVNaWxsaXM7Ci0KLSAgICAgICAgRmV0Y2hBcnRUYXNrKCkgewotICAgICAgICAgICAgQml0bWFwIGJpdG1hcCA9IG1EZXNjcmlwdGlvbiA9PSBudWxsID8gbnVsbCA6IG1EZXNjcmlwdGlvbi5nZXRJY29uQml0bWFwKCk7Ci0gICAgICAgICAgICBpZiAoaXNCaXRtYXBSZWN5Y2xlZChiaXRtYXApKSB7Ci0gICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2FuJ3QgZmV0Y2ggdGhlIGdpdmVuIGFydCBiaXRtYXAgYmVjYXVzZSBpdCdzIGFscmVhZHkgcmVjeWNsZWQuIik7Ci0gICAgICAgICAgICAgICAgYml0bWFwID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1JY29uQml0bWFwID0gYml0bWFwOwotICAgICAgICAgICAgbUljb25VcmkgPSBtRGVzY3JpcHRpb24gPT0gbnVsbCA/IG51bGwgOiBtRGVzY3JpcHRpb24uZ2V0SWNvblVyaSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEJpdG1hcCBnZXRJY29uQml0bWFwKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JY29uQml0bWFwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFVyaSBnZXRJY29uVXJpKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JY29uVXJpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIG9uUHJlRXhlY3V0ZSgpIHsKLSAgICAgICAgICAgIG1TdGFydFRpbWVNaWxsaXMgPSBTeXN0ZW1DbG9jay51cHRpbWVNaWxsaXMoKTsKLSAgICAgICAgICAgIGNsZWFyTG9hZGVkQml0bWFwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIEJpdG1hcCBkb0luQmFja2dyb3VuZChWb2lkLi4uIGFyZykgewotICAgICAgICAgICAgQml0bWFwIGFydCA9IG51bGw7Ci0gICAgICAgICAgICBpZiAobUljb25CaXRtYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGFydCA9IG1JY29uQml0bWFwOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtSWNvblVyaSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICBpZiAoKHN0cmVhbSA9IG9wZW5JbnB1dFN0cmVhbUJ5U2NoZW1lKG1JY29uVXJpKSkgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9wZW46ICIgKyBtSWNvblVyaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBRdWVyeSBhcnQgc2l6ZS4KLSAgICAgICAgICAgICAgICAgICAgQml0bWFwRmFjdG9yeS5PcHRpb25zIG9wdGlvbnMgPSBuZXcgQml0bWFwRmFjdG9yeS5PcHRpb25zKCk7Ci0gICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuaW5KdXN0RGVjb2RlQm91bmRzID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgQml0bWFwRmFjdG9yeS5kZWNvZGVTdHJlYW0oc3RyZWFtLCBudWxsLCBvcHRpb25zKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMub3V0V2lkdGggPT0gMCB8fCBvcHRpb25zLm91dEhlaWdodCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBSZXdpbmQgdGhlIHN0cmVhbSBpbiBvcmRlciB0byByZXN0YXJ0IGFydCBkZWNvZGluZy4KLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbS5yZXNldCgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBGYWlsZWQgdG8gcmV3aW5kIHRoZSBzdHJlYW0sIHRyeSB0byByZW9wZW4gaXQuCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RyZWFtID0gb3BlbklucHV0U3RyZWFtQnlTY2hlbWUobUljb25VcmkpKSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9wZW46ICIgKyBtSWNvblVyaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIHJlcXVpcmVkIHNpemUgdG8gZGVjb2RlIHRoZSBhcnQgYW5kIHBvc3NpYmx5IHJlc2l6ZSBpdC4KLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5pbkp1c3REZWNvZGVCb3VuZHMgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJlcUhlaWdodCA9IGdldERlc2lyZWRBcnRIZWlnaHQob3B0aW9ucy5vdXRXaWR0aCwgb3B0aW9ucy5vdXRIZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICBpbnQgcmF0aW8gPSBvcHRpb25zLm91dEhlaWdodCAvIHJlcUhlaWdodDsKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9ucy5pblNhbXBsZVNpemUgPSBNYXRoLm1heCgxLCBJbnRlZ2VyLmhpZ2hlc3RPbmVCaXQocmF0aW8pKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGlzQ2FuY2VsbGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFydCA9IEJpdG1hcEZhY3RvcnkuZGVjb2RlU3RyZWFtKHN0cmVhbSwgbnVsbCwgb3B0aW9ucyk7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIlVuYWJsZSB0byBvcGVuOiAiICsgbUljb25VcmksIGUpOwotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpc0JpdG1hcFJlY3ljbGVkKGFydCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW4ndCB1c2UgcmVjeWNsZWQgYml0bWFwOiAiICsgYXJ0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhcnQgIT0gbnVsbCAmJiBhcnQuZ2V0V2lkdGgoKSA8IGFydC5nZXRIZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIC8vIFBvcnRyYWl0IGFydCByZXF1aXJlcyBkb21pbmFudCBjb2xvciBhcyBiYWNrZ3JvdW5kIGNvbG9yLgotICAgICAgICAgICAgICAgIFBhbGV0dGUgcGFsZXR0ZSA9IG5ldyBQYWxldHRlLkJ1aWxkZXIoYXJ0KS5tYXhpbXVtQ29sb3JDb3VudCgxKS5nZW5lcmF0ZSgpOwotICAgICAgICAgICAgICAgIG1CYWNrZ3JvdW5kQ29sb3IgPSBwYWxldHRlLmdldFN3YXRjaGVzKCkuaXNFbXB0eSgpCi0gICAgICAgICAgICAgICAgICAgICAgICA/IDAgOiBwYWxldHRlLmdldFN3YXRjaGVzKCkuZ2V0KDApLmdldFJnYigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGFydDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvblBvc3RFeGVjdXRlKEJpdG1hcCBhcnQpIHsKLSAgICAgICAgICAgIG1GZXRjaEFydFRhc2sgPSBudWxsOwotICAgICAgICAgICAgaWYgKCFPYmplY3RzQ29tcGF0LmVxdWFscyhtQXJ0SWNvbkJpdG1hcCwgbUljb25CaXRtYXApCi0gICAgICAgICAgICAgICAgICAgIHx8ICFPYmplY3RzQ29tcGF0LmVxdWFscyhtQXJ0SWNvblVyaSwgbUljb25VcmkpKSB7Ci0gICAgICAgICAgICAgICAgbUFydEljb25CaXRtYXAgPSBtSWNvbkJpdG1hcDsKLSAgICAgICAgICAgICAgICBtQXJ0SWNvbkxvYWRlZEJpdG1hcCA9IGFydDsKLSAgICAgICAgICAgICAgICBtQXJ0SWNvblVyaSA9IG1JY29uVXJpOwotICAgICAgICAgICAgICAgIG1BcnRJY29uQmFja2dyb3VuZENvbG9yID0gbUJhY2tncm91bmRDb2xvcjsKLSAgICAgICAgICAgICAgICBtQXJ0SWNvbklzTG9hZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBsb25nIGVsYXBzZWRUaW1lTWlsbGlzID0gU3lzdGVtQ2xvY2sudXB0aW1lTWlsbGlzKCkgLSBtU3RhcnRUaW1lTWlsbGlzOwotICAgICAgICAgICAgICAgIC8vIExvYWRlZCBiaXRtYXAgd2lsbCBiZSBhcHBsaWVkIG9uIHRoZSBuZXh0IHVwZGF0ZQotICAgICAgICAgICAgICAgIHVwZGF0ZShlbGFwc2VkVGltZU1pbGxpcyA+IFNIT1dfQU5JTV9USU1FX1RIUkVTSE9MRF9NSUxMSVMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBvcGVuSW5wdXRTdHJlYW1CeVNjaGVtZShVcmkgdXJpKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgU3RyaW5nIHNjaGVtZSA9IHVyaS5nZXRTY2hlbWUoKS50b0xvd2VyQ2FzZSgpOwotICAgICAgICAgICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChDb250ZW50UmVzb2x2ZXIuU0NIRU1FX0FORFJPSURfUkVTT1VSQ0UuZXF1YWxzKHNjaGVtZSkKLSAgICAgICAgICAgICAgICAgICAgfHwgQ29udGVudFJlc29sdmVyLlNDSEVNRV9DT05URU5ULmVxdWFscyhzY2hlbWUpCi0gICAgICAgICAgICAgICAgICAgIHx8IENvbnRlbnRSZXNvbHZlci5TQ0hFTUVfRklMRS5lcXVhbHMoc2NoZW1lKSkgewotICAgICAgICAgICAgICAgIHN0cmVhbSA9IG1Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpLm9wZW5JbnB1dFN0cmVhbSh1cmkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBVUkwgdXJsID0gbmV3IFVSTCh1cmkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgVVJMQ29ubmVjdGlvbiBjb25uID0gdXJsLm9wZW5Db25uZWN0aW9uKCk7Ci0gICAgICAgICAgICAgICAgY29ubi5zZXRDb25uZWN0VGltZW91dChDT05ORUNUSU9OX1RJTUVPVVRfTUlMTElTKTsKLSAgICAgICAgICAgICAgICBjb25uLnNldFJlYWRUaW1lb3V0KENPTk5FQ1RJT05fVElNRU9VVF9NSUxMSVMpOwotICAgICAgICAgICAgICAgIHN0cmVhbSA9IGNvbm4uZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAoc3RyZWFtID09IG51bGwpID8gbnVsbCA6IG5ldyBCdWZmZXJlZElucHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTVkNzRmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLkRpYWxvZzsKLWltcG9ydCBhbmRyb2lkLmFwcC5EaWFsb2dGcmFnbWVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucmVzLkNvbmZpZ3VyYXRpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLS8qKgotICogTWVkaWEgcm91dGUgY29udHJvbGxlciBkaWFsb2cgZnJhZ21lbnQuCi0gKiA8cD4KLSAqIENyZWF0ZXMgYSB7QGxpbmsgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2d9LiAgVGhlIGFwcGxpY2F0aW9uIG1heSBzdWJjbGFzcwotICogdGhpcyBkaWFsb2cgZnJhZ21lbnQgdG8gY3VzdG9taXplIHRoZSBtZWRpYSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZy4KLSAqIDwvcD4KLSAqLwotcHVibGljIGNsYXNzIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQgZXh0ZW5kcyBEaWFsb2dGcmFnbWVudCB7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyBtRGlhbG9nOwotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBjb250cm9sbGVyIGRpYWxvZyBmcmFnbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBBbGwgc3ViY2xhc3NlcyBvZiB0aGlzIGNsYXNzIG11c3QgYWxzbyBwb3NzZXNzIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKSB7Ci0gICAgICAgIHNldENhbmNlbGFibGUodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gdGhlIGNvbnRyb2xsZXIgZGlhbG9nIGlzIGJlaW5nIGNyZWF0ZWQuCi0gICAgICogPHA+Ci0gICAgICogU3ViY2xhc3NlcyBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIHRoZSBkaWFsb2cuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyBvbkNyZWF0ZUNvbnRyb2xsZXJEaWFsb2coCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlQ29udHJvbGxlckRpYWxvZyhjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRGlhbG9nIG9uQ3JlYXRlRGlhbG9nKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgICAgbURpYWxvZyA9IG9uQ3JlYXRlQ29udHJvbGxlckRpYWxvZyhnZXRDb250ZXh0KCksIHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICAgIHJldHVybiBtRGlhbG9nOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgc3VwZXIub25TdG9wKCk7Ci0gICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1EaWFsb2cuY2xlYXJHcm91cExpc3RBbmltYXRpb24oZmFsc2UpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25Db25maWd1cmF0aW9uQ2hhbmdlZChDb25maWd1cmF0aW9uIG5ld0NvbmZpZykgewotICAgICAgICBzdXBlci5vbkNvbmZpZ3VyYXRpb25DaGFuZ2VkKG5ld0NvbmZpZyk7Ci0gICAgICAgIGlmIChtRGlhbG9nICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1EaWFsb2cudXBkYXRlTGF5b3V0KCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaWFsb2dGYWN0b3J5LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVEaWFsb2dGYWN0b3J5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5ZWFmMzkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nRmFjdG9yeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci0KLS8qKgotICogVGhlIG1lZGlhIHJvdXRlIGRpYWxvZyBmYWN0b3J5IGlzIHJlc3BvbnNpYmxlIGZvciBjcmVhdGluZyB0aGUgbWVkaWEgcm91dGUKLSAqIGNob29zZXIgYW5kIGNvbnRyb2xsZXIgZGlhbG9ncyBhcyBuZWVkZWQuCi0gKiA8cD4KLSAqIFRoZSBhcHBsaWNhdGlvbiBjYW4gY3VzdG9taXplIHRoZSBkaWFsb2dzIGJ5IHByb3ZpZGluZyBhIHN1YmNsYXNzIG9mIHRoZQotICogZGlhbG9nIGZhY3RvcnkgdG8gdGhlIHtAbGluayBNZWRpYVJvdXRlQnV0dG9ufSB1c2luZyB0aGUKLSAqIHtAbGluayBNZWRpYVJvdXRlQnV0dG9uI3NldERpYWxvZ0ZhY3Rvcnkgc2V0RGlhbG9nRmFjdG9yeX0gbWV0aG9kLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5IHNEZWZhdWx0ID0gbmV3IE1lZGlhUm91dGVEaWFsb2dGYWN0b3J5KCk7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgZGVmYXVsdCBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGVmYXVsdCBmYWN0b3J5IGluc3RhbmNlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGVmYXVsdCBtZWRpYSByb3V0ZSBkaWFsb2cgZmFjdG9yeSwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZURpYWxvZ0ZhY3RvcnkgZ2V0RGVmYXVsdCgpIHsKLSAgICAgICAgcmV0dXJuIHNEZWZhdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjaG9vc2VyIGRpYWxvZyBpcyBiZWluZyBvcGVuZWQgYW5kIGl0IGlzIHRpbWUgdG8gY3JlYXRlIHRoZSBmcmFnbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYSBjdXN0b21pemVkIGZyYWdtZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nIGZyYWdtZW50LCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQgb25DcmVhdGVDaG9vc2VyRGlhbG9nRnJhZ21lbnQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNob29zZXJEaWFsb2dGcmFnbWVudCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCB3aGVuIHRoZSBjb250cm9sbGVyIGRpYWxvZyBpcyBiZWluZyBvcGVuZWQgYW5kIGl0IGlzIHRpbWUgdG8gY3JlYXRlIHRoZSBmcmFnbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBjcmVhdGUgYSBjdXN0b21pemVkIGZyYWdtZW50LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIGNvbnRyb2xsZXIgZGlhbG9nIGZyYWdtZW50LCBtdXN0IG5vdCBiZSBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIE1lZGlhUm91dGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQgb25DcmVhdGVDb250cm9sbGVyRGlhbG9nRnJhZ21lbnQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZUNvbnRyb2xsZXJEaWFsb2dGcmFnbWVudCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpYWxvZ0hlbHBlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYWJmN2IuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlhbG9nSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQml0bWFwOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUmVjdDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkJpdG1hcERyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5EaXNwbGF5TWV0cmljczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkFycmF5QWRhcHRlcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5BcGlIZWxwZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLlI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi1maW5hbCBjbGFzcyBNZWRpYVJvdXRlRGlhbG9nSGVscGVyIHsKLSAgICAvKioKLSAgICAgKiBUaGUgZnJhbWV3b3JrIHNob3VsZCBzZXQgdGhlIGRpYWxvZyB3aWR0aCBwcm9wZXJseSwgYnV0IHNvbWVob3cgaXQgZG9lc24ndCB3b3JrLCBoZW5jZQotICAgICAqIGR1cGxpY2F0aW5nIGEgc2ltaWxhciBsb2dpYyBoZXJlIHRvIGRldGVybWluZSB0aGUgYXBwcm9wcmlhdGUgZGlhbG9nIHdpZHRoLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldERpYWxvZ1dpZHRoKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBEaXNwbGF5TWV0cmljcyBtZXRyaWNzID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXREaXNwbGF5TWV0cmljcygpOwotICAgICAgICBib29sZWFuIGlzUG9ydHJhaXQgPSBtZXRyaWNzLndpZHRoUGl4ZWxzIDwgbWV0cmljcy5oZWlnaHRQaXhlbHM7Ci0KLSAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7Ci0gICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0VmFsdWUoaXNQb3J0cmFpdAotICAgICAgICAgICAgICAgID8gUi5kaW1lbi5tcl9kaWFsb2dfZml4ZWRfd2lkdGhfbWlub3IKLSAgICAgICAgICAgICAgICA6IFIuZGltZW4ubXJfZGlhbG9nX2ZpeGVkX3dpZHRoX21ham9yLCB2YWx1ZSwgdHJ1ZSk7Ci0gICAgICAgIGlmICh2YWx1ZS50eXBlID09IFR5cGVkVmFsdWUuVFlQRV9ESU1FTlNJT04pIHsKLSAgICAgICAgICAgIHJldHVybiAoaW50KSB2YWx1ZS5nZXREaW1lbnNpb24obWV0cmljcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUudHlwZSA9PSBUeXBlZFZhbHVlLlRZUEVfRlJBQ1RJT04pIHsKLSAgICAgICAgICAgIHJldHVybiAoaW50KSB2YWx1ZS5nZXRGcmFjdGlvbihtZXRyaWNzLndpZHRoUGl4ZWxzLCBtZXRyaWNzLndpZHRoUGl4ZWxzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIGxpc3RzIHJlZ2FyZGxlc3Mgb2Ygb3JkZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdDEgQSBsaXN0Ci0gICAgICogQHBhcmFtIGxpc3QyIEEgbGlzdCB0byBiZSBjb21wYXJlZCB3aXRoIHtAY29kZSBsaXN0MX0KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgdHdvIGxpc3RzIGhhdmUgZXhhY3RseSBzYW1lIGl0ZW1zIHJlZ2FyZGxlc3Mgb2Ygb3JkZXIsIGZhbHNlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxFPiBib29sZWFuIGxpc3RVbm9yZGVyZWRFcXVhbHMoTGlzdDxFPiBsaXN0MSwgTGlzdDxFPiBsaXN0MikgewotICAgICAgICBIYXNoU2V0PEU+IHNldDEgPSBuZXcgSGFzaFNldDw+KGxpc3QxKTsKLSAgICAgICAgSGFzaFNldDxFPiBzZXQyID0gbmV3IEhhc2hTZXQ8PihsaXN0Mik7Ci0gICAgICAgIHJldHVybiBzZXQxLmVxdWFscyhzZXQyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb21wYXJlcyB0d28gbGlzdHMgYW5kIHJldHVybnMgYSBzZXQgb2YgaXRlbXMgd2hpY2ggZXhpc3QKLSAgICAgKiBhZnRlci1saXN0IGJ1dCBiZWZvcmUtbGlzdCwgd2hpY2ggbWVhbnMgbmV3bHkgYWRkZWQgaXRlbXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmVmb3JlIEEgbGlzdAotICAgICAqIEBwYXJhbSBhZnRlciBBIGxpc3QgdG8gYmUgY29tcGFyZWQgd2l0aCB7QGNvZGUgYmVmb3JlfQotICAgICAqIEByZXR1cm4gQSBzZXQgb2YgaXRlbXMgd2hpY2ggY29udGFpbnMgbmV3bHkgYWRkZWQgaXRlbXMgd2hpbGUKLSAgICAgKiBjb21wYXJpbmcge0Bjb2RlIGFmdGVyfSB0byB7QGNvZGUgYmVmb3JlfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxFPiBTZXQ8RT4gZ2V0SXRlbXNBZGRlZChMaXN0PEU+IGJlZm9yZSwgTGlzdDxFPiBhZnRlcikgewotICAgICAgICBIYXNoU2V0PEU+IHNldCA9IG5ldyBIYXNoU2V0PD4oYWZ0ZXIpOwotICAgICAgICBzZXQucmVtb3ZlQWxsKGJlZm9yZSk7Ci0gICAgICAgIHJldHVybiBzZXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIGxpc3RzIGFuZCByZXR1cm5zIGEgc2V0IG9mIGl0ZW1zIHdoaWNoIGV4aXN0Ci0gICAgICogYmVmb3JlLWxpc3QgYnV0IGFmdGVyLWxpc3QsIHdoaWNoIG1lYW5zIHJlbW92ZWQgaXRlbXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYmVmb3JlIEEgbGlzdAotICAgICAqIEBwYXJhbSBhZnRlciBBIGxpc3QgdG8gYmUgY29tcGFyZWQgd2l0aCB7QGNvZGUgYmVmb3JlfQotICAgICAqIEByZXR1cm4gQSBzZXQgb2YgaXRlbXMgd2hpY2ggY29udGFpbnMgcmVtb3ZlZCBpdGVtcyB3aGlsZQotICAgICAqIGNvbXBhcmluZyB7QGNvZGUgYWZ0ZXJ9IHRvIHtAY29kZSBiZWZvcmV9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPEU+IFNldDxFPiBnZXRJdGVtc1JlbW92ZWQoTGlzdDxFPiBiZWZvcmUsIExpc3Q8RT4gYWZ0ZXIpIHsKLSAgICAgICAgSGFzaFNldDxFPiBzZXQgPSBuZXcgSGFzaFNldDw+KGJlZm9yZSk7Ci0gICAgICAgIHNldC5yZW1vdmVBbGwoYWZ0ZXIpOwotICAgICAgICByZXR1cm4gc2V0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhbiBpdGVtLVJlY3QgbWFwIHdoaWNoIGluZGljYXRlcyB3aGVyZSBtZW1iZXIKLSAgICAgKiBpdGVtcyBhcmUgbG9jYXRlZCBpbiB0aGUgZ2l2ZW4gTGlzdFZpZXcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbGlzdFZpZXcgQSBsaXN0IHZpZXcKLSAgICAgKiBAcGFyYW0gYWRhcHRlciBBbiBhcnJheSBhZGFwdGVyIHdoaWNoIGNvbnRhaW5zIGFuIGFycmF5IG9mIGl0ZW1zLgotICAgICAqIEByZXR1cm4gQSBtYXAgb2YgaXRlbXMgYW5kIGJvdW5kcyBvZiB0aGVpciB2aWV3cyBsb2NhdGVkIGluIHRoZSBnaXZlbiBsaXN0IHZpZXcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8RT4gSGFzaE1hcDxFLCBSZWN0PiBnZXRJdGVtQm91bmRNYXAoTGlzdFZpZXcgbGlzdFZpZXcsCi0gICAgICAgICAgICBBcnJheUFkYXB0ZXI8RT4gYWRhcHRlcikgewotICAgICAgICBIYXNoTWFwPEUsIFJlY3Q+IGl0ZW1Cb3VuZE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgaW50IGZpcnN0VmlzaWJsZVBvc2l0aW9uID0gbGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Vmlldy5nZXRDaGlsZENvdW50KCk7ICsraSkgewotICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZmlyc3RWaXNpYmxlUG9zaXRpb24gKyBpOwotICAgICAgICAgICAgRSBpdGVtID0gYWRhcHRlci5nZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IGxpc3RWaWV3LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpdGVtQm91bmRNYXAucHV0KGl0ZW0sCi0gICAgICAgICAgICAgICAgICAgIG5ldyBSZWN0KHZpZXcuZ2V0TGVmdCgpLCB2aWV3LmdldFRvcCgpLCB2aWV3LmdldFJpZ2h0KCksIHZpZXcuZ2V0Qm90dG9tKCkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXRlbUJvdW5kTWFwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdlbmVyYXRlcyBhbiBpdGVtLUJpdG1hcERyYXdhYmxlIG1hcCB3aGljaCBzdG9yZXMgc25hcHNob3RzCi0gICAgICogb2YgbWVtYmVyIGl0ZW1zIGluIHRoZSBnaXZlbiBMaXN0Vmlldy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IEEgY29udGV4dAotICAgICAqIEBwYXJhbSBsaXN0VmlldyBBIGxpc3QgdmlldwotICAgICAqIEBwYXJhbSBhZGFwdGVyIEFuIGFycmF5IGFkYXB0ZXIgd2hpY2ggY29udGFpbnMgYW4gYXJyYXkgb2YgaXRlbXMuCi0gICAgICogQHJldHVybiBBIG1hcCBvZiBpdGVtcyBhbmQgc25hcHNob3RzIG9mIHRoZWlyIHZpZXdzIGluIHRoZSBnaXZlbiBsaXN0IHZpZXcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8RT4gSGFzaE1hcDxFLCBCaXRtYXBEcmF3YWJsZT4gZ2V0SXRlbUJpdG1hcE1hcChDb250ZXh0IGNvbnRleHQsCi0gICAgICAgICAgICBMaXN0VmlldyBsaXN0VmlldywgQXJyYXlBZGFwdGVyPEU+IGFkYXB0ZXIpIHsKLSAgICAgICAgSGFzaE1hcDxFLCBCaXRtYXBEcmF3YWJsZT4gaXRlbUJpdG1hcE1hcCA9IG5ldyBIYXNoTWFwPD4oKTsKLSAgICAgICAgaW50IGZpcnN0VmlzaWJsZVBvc2l0aW9uID0gbGlzdFZpZXcuZ2V0Rmlyc3RWaXNpYmxlUG9zaXRpb24oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0Vmlldy5nZXRDaGlsZENvdW50KCk7ICsraSkgewotICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gZmlyc3RWaXNpYmxlUG9zaXRpb24gKyBpOwotICAgICAgICAgICAgRSBpdGVtID0gYWRhcHRlci5nZXRJdGVtKHBvc2l0aW9uKTsKLSAgICAgICAgICAgIFZpZXcgdmlldyA9IGxpc3RWaWV3LmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpdGVtQml0bWFwTWFwLnB1dChpdGVtLCBnZXRWaWV3Qml0bWFwKGNvbnRleHQsIHZpZXcpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaXRlbUJpdG1hcE1hcDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBCaXRtYXBEcmF3YWJsZSBnZXRWaWV3Qml0bWFwKENvbnRleHQgY29udGV4dCwgVmlldyB2aWV3KSB7Ci0gICAgICAgIEJpdG1hcCBiaXRtYXAgPSBCaXRtYXAuY3JlYXRlQml0bWFwKHZpZXcuZ2V0V2lkdGgoKSwgdmlldy5nZXRIZWlnaHQoKSwKLSAgICAgICAgICAgICAgICBCaXRtYXAuQ29uZmlnLkFSR0JfODg4OCk7Ci0gICAgICAgIENhbnZhcyBjYW52YXMgPSBuZXcgQ2FudmFzKGJpdG1hcCk7Ci0gICAgICAgIHZpZXcuZHJhdyhjYW52YXMpOwotICAgICAgICByZXR1cm4gbmV3IEJpdG1hcERyYXdhYmxlKGNvbnRleHQuZ2V0UmVzb3VyY2VzKCksIGJpdG1hcCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZWUxMTguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmFwcC5GcmFnbWVudDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci0KLS8qKgotICogTWVkaWEgcm91dGUgZGlzY292ZXJ5IGZyYWdtZW50LgotICogPHA+Ci0gKiBUaGlzIGZyYWdtZW50IHRha2VzIGNhcmUgb2YgcmVnaXN0ZXJpbmcgYSBjYWxsYmFjayBmb3IgbWVkaWEgcm91dGUgZGlzY292ZXJ5Ci0gKiBkdXJpbmcgdGhlIHtAbGluayBGcmFnbWVudCNvblN0YXJ0IG9uU3RhcnQoKX0gcGhhc2UKLSAqIGFuZCByZW1vdmluZyBpdCBkdXJpbmcgdGhlIHtAbGluayBGcmFnbWVudCNvblN0b3Agb25TdG9wKCl9IHBoYXNlLgotICogPC9wPjxwPgotICogVGhlIGFwcGxpY2F0aW9uIG11c3Qgc3VwcGx5IGEgcm91dGUgc2VsZWN0b3IgdG8gc3BlY2lmeSB0aGUga2luZHMgb2Ygcm91dGVzCi0gKiB0byBkaXNjb3Zlci4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgYWxzbyBvdmVycmlkZSB7QGxpbmsgI29uQ3JlYXRlQ2FsbGJhY2t9IHRvCi0gKiBwcm92aWRlIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXJ9IGNhbGxiYWNrIHRvIHJlZ2lzdGVyLgotICogPC9wPjxwPgotICogTm90ZSB0aGF0IHRoZSBkaXNjb3ZlcnkgY2FsbGJhY2sgbWFrZXMgdGhlIGFwcGxpY2F0aW9uIGJlIGNvbm5lY3RlZCB3aXRoIGFsbCB0aGUKLSAqIHtAbGluayBhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlc30KLSAqIHdoaWxlIGl0IGlzIHJlZ2lzdGVyZWQuCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQgZXh0ZW5kcyBGcmFnbWVudCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgQVJHVU1FTlRfU0VMRUNUT1IgPSAic2VsZWN0b3IiOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVyLkNhbGxiYWNrIG1DYWxsYmFjazsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQoKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGVyIGluc3RhbmNlLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlciBnZXRNZWRpYVJvdXRlcigpIHsKLSAgICAgICAgZW5zdXJlUm91dGVyKCk7Ci0gICAgICAgIHJldHVybiBtUm91dGVyOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSb3V0ZXIoKSB7Ci0gICAgICAgIGlmIChtUm91dGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShnZXRDb250ZXh0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgbWVkaWEgcm91dGUgc2VsZWN0b3IgZm9yIGZpbHRlcmluZyB0aGUgcm91dGVzIHRvIGJlIGRpc2NvdmVyZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzZWxlY3RvciwgbmV2ZXIgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGdldFJvdXRlU2VsZWN0b3IoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlU2VsZWN0b3IoKTsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3RvciBmb3IgZmlsdGVyaW5nIHRoZSByb3V0ZXMgdG8gYmUgZGlzY292ZXJlZC4KLSAgICAgKiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgdGhlIGZyYWdtZW50IGlzIGFkZGVkLgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIFRoZSBzZWxlY3RvciB0byBzZXQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Um91dGVTZWxlY3RvcihNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVuc3VyZVJvdXRlU2VsZWN0b3IoKTsKLSAgICAgICAgaWYgKCFtU2VsZWN0b3IuZXF1YWxzKHNlbGVjdG9yKSkgewotICAgICAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0KLSAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gZ2V0QXJndW1lbnRzKCk7Ci0gICAgICAgICAgICBpZiAoYXJncyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYXJncyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFyZ3MucHV0QnVuZGxlKEFSR1VNRU5UX1NFTEVDVE9SLCBzZWxlY3Rvci5hc0J1bmRsZSgpKTsKLSAgICAgICAgICAgIHNldEFyZ3VtZW50cyhhcmdzKTsKLQotICAgICAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlci5yZW1vdmVDYWxsYmFjayhtQ2FsbGJhY2spOwotICAgICAgICAgICAgICAgIG1Sb3V0ZXIuYWRkQ2FsbGJhY2sobVNlbGVjdG9yLCBtQ2FsbGJhY2ssIG9uUHJlcGFyZUNhbGxiYWNrRmxhZ3MoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlUm91dGVTZWxlY3RvcigpIHsKLSAgICAgICAgaWYgKG1TZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICBCdW5kbGUgYXJncyA9IGdldEFyZ3VtZW50cygpOwotICAgICAgICAgICAgaWYgKGFyZ3MgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RvciA9IE1lZGlhUm91dGVTZWxlY3Rvci5mcm9tQnVuZGxlKGFyZ3MuZ2V0QnVuZGxlKEFSR1VNRU5UX1NFTEVDVE9SKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgdG8gY3JlYXRlIHRoZSB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVyLkNhbGxiYWNrIGNhbGxiYWNrfQotICAgICAqIHRoYXQgd2lsbCBiZSByZWdpc3RlcmVkLgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZWZhdWx0IGNhbGxiYWNrIGRvZXMgbm90aGluZy4gIFRoZSBhcHBsaWNhdGlvbiBtYXkgb3ZlcnJpZGUgdGhpcyBtZXRob2QgdG8KLSAgICAgKiBzdXBwbHkgaXRzIG93biBjYWxsYmFjay4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgY2FsbGJhY2ssIG9yIG51bGwgaWYgbm8gY2FsbGJhY2sgc2hvdWxkIGJlIHJlZ2lzdGVyZWQuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVyLkNhbGxiYWNrIG9uQ3JlYXRlQ2FsbGJhY2soKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZXIuQ2FsbGJhY2soKSB7IH07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIHByZXBhcmUgdGhlIGNhbGxiYWNrIGZsYWdzIHRoYXQgd2lsbCBiZSB1c2VkIHdoZW4gdGhlCi0gICAgICoge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayBjYWxsYmFja30gaXMgcmVnaXN0ZXJlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBkZXNpcmVkIGNhbGxiYWNrIGZsYWdzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgb25QcmVwYXJlQ2FsbGJhY2tGbGFncygpIHsKLSAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdGFydCgpIHsKLSAgICAgICAgc3VwZXIub25TdGFydCgpOwotCi0gICAgICAgIGVuc3VyZVJvdXRlU2VsZWN0b3IoKTsKLSAgICAgICAgZW5zdXJlUm91dGVyKCk7Ci0gICAgICAgIG1DYWxsYmFjayA9IG9uQ3JlYXRlQ2FsbGJhY2soKTsKLSAgICAgICAgaWYgKG1DYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLCBvblByZXBhcmVDYWxsYmFja0ZsYWdzKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdG9wKCkgewotICAgICAgICBpZiAobUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Sb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBzdXBlci5vblN0b3AoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEwYTk1YS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ29sb3JGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb3J0ZXJEdWZmOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZkNvbG9yRmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQW5pbWF0aW9uRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LmNvbnRlbnQuQ29udGV4dENvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLQotLyoqCi0gKiBDaGV2cm9uL0NhcmV0IGJ1dHRvbiB0byBleHBhbmQvY29sbGFwc2UgZ3JvdXAgdm9sdW1lIGxpc3Qgd2l0aCBhbmltYXRpb24uCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24gZXh0ZW5kcyBJbWFnZUJ1dHRvbiB7Ci0gICAgZmluYWwgQW5pbWF0aW9uRHJhd2FibGUgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlOwotICAgIGZpbmFsIEFuaW1hdGlvbkRyYXdhYmxlIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlOwotICAgIGZpbmFsIFN0cmluZyBtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbjsKLSAgICBmaW5hbCBTdHJpbmcgbUNvbGxhcHNlR3JvdXBEZXNjcmlwdGlvbjsKLSAgICBib29sZWFuIG1Jc0dyb3VwRXhwYW5kZWQ7Ci0gICAgT25DbGlja0xpc3RlbmVyIG1MaXN0ZW5lcjsKLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlRXhwYW5kQ29sbGFwc2VCdXR0b24oQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhUm91dGVFeHBhbmRDb2xsYXBzZUJ1dHRvbihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICB0aGlzKGNvbnRleHQsIGF0dHJzLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZUV4cGFuZENvbGxhcHNlQnV0dG9uKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIpOwotICAgICAgICBtRXhwYW5kQW5pbWF0aW9uRHJhd2FibGUgPSAoQW5pbWF0aW9uRHJhd2FibGUpCi0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXREcmF3YWJsZShSLmRyYXdhYmxlLm1yX2dyb3VwX2V4cGFuZCk7Ci0gICAgICAgIG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlID0gKEFuaW1hdGlvbkRyYXdhYmxlKQotICAgICAgICAgICAgICAgIEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCkuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5tcl9ncm91cF9jb2xsYXBzZSk7Ci0KLSAgICAgICAgQ29sb3JGaWx0ZXIgZmlsdGVyID0gbmV3IFBvcnRlckR1ZmZDb2xvckZpbHRlcigKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlclRoZW1lSGVscGVyLmdldENvbnRyb2xsZXJDb2xvcihjb250ZXh0LCBkZWZTdHlsZUF0dHIpLAotICAgICAgICAgICAgICAgIFBvcnRlckR1ZmYuTW9kZS5TUkNfSU4pOwotICAgICAgICBtRXhwYW5kQW5pbWF0aW9uRHJhd2FibGUuc2V0Q29sb3JGaWx0ZXIoZmlsdGVyKTsKLSAgICAgICAgbUNvbGxhcHNlQW5pbWF0aW9uRHJhd2FibGUuc2V0Q29sb3JGaWx0ZXIoZmlsdGVyKTsKLQotICAgICAgICBtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgICAgICAgQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhjb250ZXh0KS5nZXRTdHJpbmcoUi5zdHJpbmcubXJfY29udHJvbGxlcl9leHBhbmRfZ3JvdXApOwotICAgICAgICBtQ29sbGFwc2VHcm91cERlc2NyaXB0aW9uID0KLSAgICAgICAgICAgICAgICBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKGNvbnRleHQpLmdldFN0cmluZyhSLnN0cmluZy5tcl9jb250cm9sbGVyX2NvbGxhcHNlX2dyb3VwKTsKLQotICAgICAgICBzZXRJbWFnZURyYXdhYmxlKG1FeHBhbmRBbmltYXRpb25EcmF3YWJsZS5nZXRGcmFtZSgwKSk7Ci0gICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihtRXhwYW5kR3JvdXBEZXNjcmlwdGlvbik7Ci0KLSAgICAgICAgc3VwZXIuc2V0T25DbGlja0xpc3RlbmVyKG5ldyBPbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2aWV3KSB7Ci0gICAgICAgICAgICAgICAgbUlzR3JvdXBFeHBhbmRlZCA9ICFtSXNHcm91cEV4cGFuZGVkOwotICAgICAgICAgICAgICAgIGlmIChtSXNHcm91cEV4cGFuZGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNldEltYWdlRHJhd2FibGUobUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgbUV4cGFuZEFuaW1hdGlvbkRyYXdhYmxlLnN0YXJ0KCk7Ci0gICAgICAgICAgICAgICAgICAgIHNldENvbnRlbnREZXNjcmlwdGlvbihtQ29sbGFwc2VHcm91cERlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBzZXRJbWFnZURyYXdhYmxlKG1Db2xsYXBzZUFuaW1hdGlvbkRyYXdhYmxlKTsKLSAgICAgICAgICAgICAgICAgICAgbUNvbGxhcHNlQW5pbWF0aW9uRHJhd2FibGUuc3RhcnQoKTsKLSAgICAgICAgICAgICAgICAgICAgc2V0Q29udGVudERlc2NyaXB0aW9uKG1FeHBhbmRHcm91cERlc2NyaXB0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1MaXN0ZW5lci5vbkNsaWNrKHZpZXcpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0T25DbGlja0xpc3RlbmVyKE9uQ2xpY2tMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvYXBwL01lZGlhUm91dGVWb2x1bWVTbGlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZVZvbHVtZVNsaWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDVkMjBlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZVZvbHVtZVNsaWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5hcHA7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9ydGVyRHVmZjsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyOwotCi0vKioKLSAqIFZvbHVtZSBzbGlkZXIgd2l0aCBzaG93aW5nLCBoaWRpbmcsIGFuZCBhcHBseWluZyBhbHBoYSBzdXBwb3J0cyB0byB0aGUgdGh1bWIuCi0gKi8KLXB1YmxpYyBjbGFzcyBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyIGV4dGVuZHMgU2Vla0JhciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJNZWRpYVJvdXRlVm9sdW1lU2xpZGVyIjsKLQotICAgIHByaXZhdGUgZmluYWwgZmxvYXQgbURpc2FibGVkQWxwaGE7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbUhpZGVUaHVtYjsKLSAgICBwcml2YXRlIERyYXdhYmxlIG1UaHVtYjsKLSAgICBwcml2YXRlIGludCBtQ29sb3I7Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBudWxsKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVkaWFSb3V0ZVZvbHVtZVNsaWRlcihDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycykgewotICAgICAgICBzdXBlcihjb250ZXh0LCBhdHRycyk7Ci0gICAgICAgIG1EaXNhYmxlZEFscGhhID0gTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5nZXREaXNhYmxlZEFscGhhKGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZWRpYVJvdXRlVm9sdW1lU2xpZGVyKENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIpOwotICAgICAgICBtRGlzYWJsZWRBbHBoYSA9IE1lZGlhUm91dGVyVGhlbWVIZWxwZXIuZ2V0RGlzYWJsZWRBbHBoYShjb250ZXh0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgdm9pZCBkcmF3YWJsZVN0YXRlQ2hhbmdlZCgpIHsKLSAgICAgICAgc3VwZXIuZHJhd2FibGVTdGF0ZUNoYW5nZWQoKTsKLSAgICAgICAgaW50IGFscGhhID0gaXNFbmFibGVkKCkgPyAweEZGIDogKGludCkgKDB4RkYgKiBtRGlzYWJsZWRBbHBoYSk7Ci0KLSAgICAgICAgLy8gVGhlIHRodW1iIGRyYXdhYmxlIGlzIGEgY29sbGVjdGlvbiBvZiBkcmF3YWJsZXMgYW5kIGl0cyBjdXJyZW50IGRyYXdhYmxlcyBhcmUgY2hhbmdlZCBwZXIKLSAgICAgICAgLy8gc3RhdGUuIEFwcGx5IHRoZSBjb2xvciBmaWx0ZXIgYW5kIGFscGhhIG9uIGV2ZXJ5IHN0YXRlIGNoYW5nZS4KLSAgICAgICAgaWYgKG1UaHVtYiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtVGh1bWIuc2V0Q29sb3JGaWx0ZXIobUNvbG9yLCBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKTsKLSAgICAgICAgICAgIG1UaHVtYi5zZXRBbHBoYShhbHBoYSk7Ci0gICAgICAgIH0KLQotICAgICAgICBnZXRQcm9ncmVzc0RyYXdhYmxlKCkuc2V0Q29sb3JGaWx0ZXIobUNvbG9yLCBQb3J0ZXJEdWZmLk1vZGUuU1JDX0lOKTsKLSAgICAgICAgZ2V0UHJvZ3Jlc3NEcmF3YWJsZSgpLnNldEFscGhhKGFscGhhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRUaHVtYihEcmF3YWJsZSB0aHVtYikgewotICAgICAgICBtVGh1bWIgPSB0aHVtYjsKLSAgICAgICAgc3VwZXIuc2V0VGh1bWIobUhpZGVUaHVtYiA/IG51bGwgOiBtVGh1bWIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgd2hldGhlciB0byBzaG93IG9yIGhpZGUgdGh1bWIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0SGlkZVRodW1iKGJvb2xlYW4gaGlkZVRodW1iKSB7Ci0gICAgICAgIGlmIChtSGlkZVRodW1iID09IGhpZGVUaHVtYikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1IaWRlVGh1bWIgPSBoaWRlVGh1bWI7Ci0gICAgICAgIHN1cGVyLnNldFRodW1iKG1IaWRlVGh1bWIgPyBudWxsIDogbVRodW1iKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSB2b2x1bWUgc2xpZGVyIGNvbG9yLiBUaGUgY2hhbmdlIHRha2VzIGVmZmVjdCBuZXh0IHRpbWUgZHJhd2FibGUgc3RhdGUgaXMgY2hhbmdlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgY29sb3IgY2Fubm90IGJlIHRyYW5zbHVjZW50LCBvdGhlcndpc2UgdGhlIHVuZGVybHlpbmcgcHJvZ3Jlc3MgYmFyIHdpbGwgYmUgc2VlbiB0aHJvdWdoCi0gICAgICogdGhlIHRodW1iLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRDb2xvcihpbnQgY29sb3IpIHsKLSAgICAgICAgaWYgKG1Db2xvciA9PSBjb2xvcikgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChDb2xvci5hbHBoYShjb2xvcikgIT0gMHhGRikgewotICAgICAgICAgICAgTG9nLmUoVEFHLCAiVm9sdW1lIHNsaWRlciBjb2xvciBjYW5ub3QgYmUgdHJhbnNsdWNlbnQ6ICMiICsgSW50ZWdlci50b0hleFN0cmluZyhjb2xvcikpOwotICAgICAgICB9Ci0gICAgICAgIG1Db2xvciA9IGNvbG9yOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvTWVkaWFSb3V0ZXJUaGVtZUhlbHBlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlclRoZW1lSGVscGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZjA0MmYuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9NZWRpYVJvdXRlclRoZW1lSGVscGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuVHlwZWRBcnJheTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLkNvbG9yOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLkludERlZjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQuZ3JhcGhpY3MuQ29sb3JVdGlsczsKLWltcG9ydCBhbmRyb2lkLnV0aWwuVHlwZWRWYWx1ZTsKLWltcG9ydCBhbmRyb2lkLnZpZXcuQ29udGV4dFRoZW1lV3JhcHBlcjsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLQotZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJUaGVtZUhlbHBlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZmxvYXQgTUlOX0NPTlRSQVNUID0gMy4wZjsKLQotICAgIEBJbnREZWYoe0NPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCwgQ09MT1JfV0hJVEVfT05fREFSS19CQUNLR1JPVU5EfSkKLSAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgcHJpdmF0ZSBAaW50ZXJmYWNlIENvbnRyb2xsZXJDb2xvclR5cGUge30KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EID0gMHhERTAwMDAwMDsgLyogT3BhY2l0eSBvZiA4NyUgKi8KLSAgICBzdGF0aWMgZmluYWwgaW50IENPTE9SX1dISVRFX09OX0RBUktfQkFDS0dST1VORCA9IENvbG9yLldISVRFOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlclRoZW1lSGVscGVyKCkgewotICAgIH0KLQotICAgIHN0YXRpYyBDb250ZXh0IGNyZWF0ZVRoZW1lZEJ1dHRvbkNvbnRleHQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIC8vIEFwcGx5IGJhc2UgTWVkaWEgUm91dGVyIHRoZW1lLgotICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgZ2V0Um91dGVyVGhlbWVJZChjb250ZXh0KSk7Ci0KLSAgICAgICAgLy8gQXBwbHkgY3VzdG9tIE1lZGlhIFJvdXRlciB0aGVtZS4KLSAgICAgICAgaW50IHN0eWxlID0gZ2V0VGhlbWVSZXNvdXJjZShjb250ZXh0LCBSLmF0dHIubWVkaWFSb3V0ZVRoZW1lKTsKLSAgICAgICAgaWYgKHN0eWxlICE9IDApIHsKLSAgICAgICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBzdHlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gY29udGV4dDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIFRoZSBmb2xsb3dpbmcgdHdvIG1ldGhvZHMgYXJlIHRvIGJlIHVzZWQgaW4gY29uanVuY3Rpb24uIFRoZXkgc2hvdWxkIGJlIHVzZWQgdG8gcHJlcGFyZQotICAgICAqIHRoZSBjb250ZXh0IGFuZCB0aGVtZSBmb3IgYSBzdXBlciBjbGFzcyBjb25zdHJ1Y3RvciAodGhlIGxhdHRlciBtZXRob2QgcmVsaWVzIG9uIHRoZQotICAgICAqIGZvcm1lciBtZXRob2QgdG8gcHJvcGVybHkgcHJlcGFyZSB0aGUgY29udGV4dCk6Ci0gICAgICogICBzdXBlcihjb250ZXh0ID0gY3JlYXRlVGhlbWVkRGlhbG9nQ29udGV4dChjb250ZXh0LCB0aGVtZSksCi0gICAgICogICAgICAgICAgIGNyZWF0ZVRoZW1lZERpYWxvZ1N0eWxlKGNvbnRleHQpKTsKLSAgICAgKgotICAgICAqIEl0IHdpbGwgYXBwbHkgdGhlbWUgaW4gdGhlIGZvbGxvd2luZyBvcmRlciAoc3R5bGUgbG9va3VwcyB3aWxsIGJlIGRvbmUgaW4gcmV2ZXJzZSk6Ci0gICAgICogICAxKSBDdXJyZW50IHRoZW1lCi0gICAgICogICAyKSBTdXBwbGllZCB0aGVtZQotICAgICAqICAgMykgQmFzZSBNZWRpYSBSb3V0ZXIgdGhlbWUKLSAgICAgKiAgIDQpIEN1c3RvbSBNZWRpYSBSb3V0ZXIgdGhlbWUsIGlmIHByb3ZpZGVkCi0gICAgICovCi0gICAgc3RhdGljIENvbnRleHQgY3JlYXRlVGhlbWVkRGlhbG9nQ29udGV4dChDb250ZXh0IGNvbnRleHQsIGludCB0aGVtZSwgYm9vbGVhbiBhbGVydERpYWxvZykgewotICAgICAgICAvLyAxKSBDdXJyZW50IHRoZW1lIGlzIGFscmVhZHkgYXBwbGllZCB0byB0aGUgY29udGV4dAotCi0gICAgICAgIC8vIDIpIElmIG5vIHRoZW1lIGlzIHN1cHBsaWVkLCBsb29rIGl0IHVwIGZyb20gdGhlIGNvbnRleHQgKGRpYWxvZ1RoZW1lL2FsZXJ0RGlhbG9nVGhlbWUpCi0gICAgICAgIGlmICh0aGVtZSA9PSAwKSB7Ci0gICAgICAgICAgICB0aGVtZSA9IGdldFRoZW1lUmVzb3VyY2UoY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIWFsZXJ0RGlhbG9nID8gYW5kcm9pZC5SLmF0dHIuZGlhbG9nVGhlbWUgOiBhbmRyb2lkLlIuYXR0ci5hbGVydERpYWxvZ1RoZW1lKTsKLSAgICAgICAgfQotICAgICAgICAvLyAgICBBcHBseSBpdAotICAgICAgICBjb250ZXh0ID0gbmV3IENvbnRleHRUaGVtZVdyYXBwZXIoY29udGV4dCwgdGhlbWUpOwotCi0gICAgICAgIC8vIDMpIElmIGEgY3VzdG9tIE1lZGlhIFJvdXRlciB0aGVtZSBpcyBwcm92aWRlZCB0aGVuIGFwcGx5IHRoZSBiYXNlIHRoZW1lCi0gICAgICAgIGlmIChnZXRUaGVtZVJlc291cmNlKGNvbnRleHQsIFIuYXR0ci5tZWRpYVJvdXRlVGhlbWUpICE9IDApIHsKLSAgICAgICAgICAgIGNvbnRleHQgPSBuZXcgQ29udGV4dFRoZW1lV3JhcHBlcihjb250ZXh0LCBnZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBjb250ZXh0OwotICAgIH0KLSAgICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBwcmV2aW91cyBtZXRob2QuCi0gICAgc3RhdGljIGludCBjcmVhdGVUaGVtZWREaWFsb2dTdHlsZShDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgLy8gNCkgQXBwbHkgdGhlIGN1c3RvbSBNZWRpYSBSb3V0ZXIgdGhlbWUKLSAgICAgICAgaW50IHRoZW1lID0gZ2V0VGhlbWVSZXNvdXJjZShjb250ZXh0LCBSLmF0dHIubWVkaWFSb3V0ZVRoZW1lKTsKLSAgICAgICAgaWYgKHRoZW1lID09IDApIHsKLSAgICAgICAgICAgIC8vIDMpIE5vIGN1c3RvbSBNZWRpYVJvdXRlciB0aGVtZSB3YXMgcHJvdmlkZWQgc28gYXBwbHkgdGhlIGJhc2UgdGhlbWUgaW5zdGVhZAotICAgICAgICAgICAgdGhlbWUgPSBnZXRSb3V0ZXJUaGVtZUlkKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRoZW1lOwotICAgIH0KLSAgICAvLyBFTkQuIFByZXZpb3VzIHR3byBtZXRob2RzIHNob3VsZCBiZSB1c2VkIGluIGNvbmp1bmN0aW9uLgotCi0gICAgc3RhdGljIGludCBnZXRUaGVtZVJlc291cmNlKENvbnRleHQgY29udGV4dCwgaW50IGF0dHIpIHsKLSAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldFRoZW1lKCkucmVzb2x2ZUF0dHJpYnV0ZShhdHRyLCB2YWx1ZSwgdHJ1ZSkgPyB2YWx1ZS5yZXNvdXJjZUlkIDogMDsKLSAgICB9Ci0KLSAgICBzdGF0aWMgZmxvYXQgZ2V0RGlzYWJsZWRBbHBoYShDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgVHlwZWRWYWx1ZSB2YWx1ZSA9IG5ldyBUeXBlZFZhbHVlKCk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LmdldFRoZW1lKCkucmVzb2x2ZUF0dHJpYnV0ZShhbmRyb2lkLlIuYXR0ci5kaXNhYmxlZEFscGhhLCB2YWx1ZSwgdHJ1ZSkKLSAgICAgICAgICAgICAgICA/IHZhbHVlLmdldEZsb2F0KCkgOiAwLjVmOwotICAgIH0KLQotICAgIHN0YXRpYyBAQ29udHJvbGxlckNvbG9yVHlwZSBpbnQgZ2V0Q29udHJvbGxlckNvbG9yKENvbnRleHQgY29udGV4dCwgaW50IHN0eWxlKSB7Ci0gICAgICAgIGludCBwcmltYXJ5Q29sb3IgPSBnZXRUaGVtZUNvbG9yKGNvbnRleHQsIHN0eWxlLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnkpOwotICAgICAgICBpZiAocHJpbWFyeUNvbG9yID09IDApIHsKLSAgICAgICAgICAgIHByaW1hcnlDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgc3R5bGUsIGFuZHJvaWQuUi5hdHRyLmNvbG9yUHJpbWFyeSk7Ci0gICAgICAgICAgICBpZiAocHJpbWFyeUNvbG9yID09IDApIHsKLSAgICAgICAgICAgICAgICBwcmltYXJ5Q29sb3IgPSAweEZGMDAwMDAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChDb2xvclV0aWxzLmNhbGN1bGF0ZUNvbnRyYXN0KENPTE9SX1dISVRFX09OX0RBUktfQkFDS0dST1VORCwgcHJpbWFyeUNvbG9yKQotICAgICAgICAgICAgICAgID49IE1JTl9DT05UUkFTVCkgewotICAgICAgICAgICAgcmV0dXJuIENPTE9SX1dISVRFX09OX0RBUktfQkFDS0dST1VORDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EOwotICAgIH0KLQotICAgIHN0YXRpYyBpbnQgZ2V0QnV0dG9uVGV4dENvbG9yKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpbnQgcHJpbWFyeUNvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCAwLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnkpOwotICAgICAgICBpbnQgYmFja2dyb3VuZENvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCAwLCBhbmRyb2lkLlIuYXR0ci5jb2xvckJhY2tncm91bmQpOwotCi0gICAgICAgIGlmIChDb2xvclV0aWxzLmNhbGN1bGF0ZUNvbnRyYXN0KHByaW1hcnlDb2xvciwgYmFja2dyb3VuZENvbG9yKSA8IE1JTl9DT05UUkFTVCkgewotICAgICAgICAgICAgLy8gRGVmYXVsdCB0byBjb2xvckFjY2VudCBpZiB0aGUgY29udHJhc3QgcmF0aW8gaXMgbG93LgotICAgICAgICAgICAgcmV0dXJuIGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JBY2NlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBwcmltYXJ5Q29sb3I7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2V0TWVkaWFDb250cm9sc0JhY2tncm91bmRDb2xvcigKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgVmlldyBtYWluQ29udHJvbHMsIFZpZXcgZ3JvdXBDb250cm9scywgYm9vbGVhbiBoYXNHcm91cCkgewotICAgICAgICBpbnQgcHJpbWFyeUNvbG9yID0gZ2V0VGhlbWVDb2xvcihjb250ZXh0LCAwLCBhbmRyb2lkLlIuYXR0ci5jb2xvclByaW1hcnkpOwotICAgICAgICBpbnQgcHJpbWFyeURhcmtDb2xvciA9IGdldFRoZW1lQ29sb3IoY29udGV4dCwgMCwgYW5kcm9pZC5SLmF0dHIuY29sb3JQcmltYXJ5RGFyayk7Ci0gICAgICAgIGlmIChoYXNHcm91cCAmJiBnZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgMCkgPT0gQ09MT1JfREFSS19PTl9MSUdIVF9CQUNLR1JPVU5EKSB7Ci0gICAgICAgICAgICAvLyBJbnN0ZWFkIG9mIHNob3dpbmcgZGFyayBjb250cm9scyBpbiBhIHBvc3NpYmx5IGRhcmsgKGkuZS4gdGhlIHByaW1hcnkgZGFyayksIG1vZGVsCi0gICAgICAgICAgICAvLyB0aGUgd2hpdGUgZGlhbG9nIGFuZCB1c2UgdGhlIHByaW1hcnkgY29sb3IgZm9yIHRoZSBncm91cCBjb250cm9scy4KLSAgICAgICAgICAgIHByaW1hcnlEYXJrQ29sb3IgPSBwcmltYXJ5Q29sb3I7Ci0gICAgICAgICAgICBwcmltYXJ5Q29sb3IgPSBDb2xvci5XSElURTsKLSAgICAgICAgfQotICAgICAgICBtYWluQ29udHJvbHMuc2V0QmFja2dyb3VuZENvbG9yKHByaW1hcnlDb2xvcik7Ci0gICAgICAgIGdyb3VwQ29udHJvbHMuc2V0QmFja2dyb3VuZENvbG9yKHByaW1hcnlEYXJrQ29sb3IpOwotICAgICAgICAvLyBBbHNvIHN0b3JlIHRoZSBiYWNrZ3JvdW5kIGNvbG9ycyB0byB0aGUgdmlldyB0YWdzLiBUaGV5IGFyZSB1c2VkIGluCi0gICAgICAgIC8vIHNldFZvbHVtZVNsaWRlckNvbG9yKCkgYmVsb3cuCi0gICAgICAgIG1haW5Db250cm9scy5zZXRUYWcocHJpbWFyeUNvbG9yKTsKLSAgICAgICAgZ3JvdXBDb250cm9scy5zZXRUYWcocHJpbWFyeURhcmtDb2xvcik7Ci0gICAgfQotCi0gICAgc3RhdGljIHZvaWQgc2V0Vm9sdW1lU2xpZGVyQ29sb3IoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIE1lZGlhUm91dGVWb2x1bWVTbGlkZXIgdm9sdW1lU2xpZGVyLCBWaWV3IGJhY2tncm91bmRWaWV3KSB7Ci0gICAgICAgIGludCBjb250cm9sbGVyQ29sb3IgPSBnZXRDb250cm9sbGVyQ29sb3IoY29udGV4dCwgMCk7Ci0gICAgICAgIGlmIChDb2xvci5hbHBoYShjb250cm9sbGVyQ29sb3IpICE9IDB4RkYpIHsKLSAgICAgICAgICAgIC8vIENvbXBvc2l0ZSB3aXRoIHRoZSBiYWNrZ3JvdW5kIGluIG9yZGVyIG5vdCB0byBzaG93IHRoZSB1bmRlcmx5aW5nIHByb2dyZXNzIGJhcgotICAgICAgICAgICAgLy8gdGhyb3VnaCB0aGUgdGh1bWIuCi0gICAgICAgICAgICBpbnQgYmFja2dyb3VuZENvbG9yID0gKGludCkgYmFja2dyb3VuZFZpZXcuZ2V0VGFnKCk7Ci0gICAgICAgICAgICBjb250cm9sbGVyQ29sb3IgPSBDb2xvclV0aWxzLmNvbXBvc2l0ZUNvbG9ycyhjb250cm9sbGVyQ29sb3IsIGJhY2tncm91bmRDb2xvcik7Ci0gICAgICAgIH0KLSAgICAgICAgdm9sdW1lU2xpZGVyLnNldENvbG9yKGNvbnRyb2xsZXJDb2xvcik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc0xpZ2h0VGhlbWUoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFR5cGVkVmFsdWUgdmFsdWUgPSBuZXcgVHlwZWRWYWx1ZSgpOwotICAgICAgICAvLyBUT0RPKHN1bmdzb28pOiBTd2l0Y2ggdG8gY29tLmFuZHJvaWQuaW50ZXJuYWwuUi5hdHRyLmlzTGlnaHRUaGVtZQotICAgICAgICByZXR1cm4gY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoYW5kcm9pZC5zdXBwb3J0LnY3LmFwcGNvbXBhdC5SLmF0dHIuaXNMaWdodFRoZW1lLAotICAgICAgICAgICAgICAgIHZhbHVlLCB0cnVlKSAmJiB2YWx1ZS5kYXRhICE9IDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IGdldFRoZW1lQ29sb3IoQ29udGV4dCBjb250ZXh0LCBpbnQgc3R5bGUsIGludCBhdHRyKSB7Ci0gICAgICAgIGlmIChzdHlsZSAhPSAwKSB7Ci0gICAgICAgICAgICBpbnRbXSBhdHRycyA9IHsgYXR0ciB9OwotICAgICAgICAgICAgVHlwZWRBcnJheSB0YSA9IGNvbnRleHQub2J0YWluU3R5bGVkQXR0cmlidXRlcyhzdHlsZSwgYXR0cnMpOwotICAgICAgICAgICAgaW50IGNvbG9yID0gdGEuZ2V0Q29sb3IoMCwgMCk7Ci0gICAgICAgICAgICB0YS5yZWN5Y2xlKCk7Ci0gICAgICAgICAgICBpZiAoY29sb3IgIT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBjb2xvcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBUeXBlZFZhbHVlIHZhbHVlID0gbmV3IFR5cGVkVmFsdWUoKTsKLSAgICAgICAgY29udGV4dC5nZXRUaGVtZSgpLnJlc29sdmVBdHRyaWJ1dGUoYXR0ciwgdmFsdWUsIHRydWUpOwotICAgICAgICBpZiAodmFsdWUucmVzb3VyY2VJZCAhPSAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gY29udGV4dC5nZXRSZXNvdXJjZXMoKS5nZXRDb2xvcih2YWx1ZS5yZXNvdXJjZUlkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWUuZGF0YTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgaW50IGdldFJvdXRlclRoZW1lSWQoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIGludCB0aGVtZUlkOwotICAgICAgICBpZiAoaXNMaWdodFRoZW1lKGNvbnRleHQpKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0Q29udHJvbGxlckNvbG9yKGNvbnRleHQsIDApID09IENPTE9SX0RBUktfT05fTElHSFRfQkFDS0dST1VORCkgewotICAgICAgICAgICAgICAgIHRoZW1lSWQgPSBSLnN0eWxlLlRoZW1lX01lZGlhUm91dGVyX0xpZ2h0OwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aGVtZUlkID0gUi5zdHlsZS5UaGVtZV9NZWRpYVJvdXRlcl9MaWdodF9EYXJrQ29udHJvbFBhbmVsOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGdldENvbnRyb2xsZXJDb2xvcihjb250ZXh0LCAwKSA9PSBDT0xPUl9EQVJLX09OX0xJR0hUX0JBQ0tHUk9VTkQpIHsKLSAgICAgICAgICAgICAgICB0aGVtZUlkID0gUi5zdHlsZS5UaGVtZV9NZWRpYVJvdXRlcl9MaWdodENvbnRyb2xQYW5lbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhlbWVJZCA9IFIuc3R5bGUuVGhlbWVfTWVkaWFSb3V0ZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoZW1lSWQ7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9PdmVybGF5TGlzdFZpZXcuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9hcHAvT3ZlcmxheUxpc3RWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMGRlZTIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2FwcC9PdmVybGF5TGlzdFZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIuYXBwOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5DYW52YXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuQml0bWFwRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuYW5pbWF0aW9uLkludGVycG9sYXRvcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaXN0VmlldzsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEEgTGlzdFZpZXcgd2hpY2ggaGFzIGFuIGFkZGl0aW9uYWwgb3ZlcmxheSBsYXllci4ge0BsaW5rIEJpdG1hcERyYXdhYmxlfQotICogY2FuIGJlIGFkZGVkIHRvIHRoZSBsYXllciBhbmQgY2FuIGJlIGFuaW1hdGVkLgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgT3ZlcmxheUxpc3RWaWV3IGV4dGVuZHMgTGlzdFZpZXcgewotICAgIHByaXZhdGUgZmluYWwgTGlzdDxPdmVybGF5T2JqZWN0PiBtT3ZlcmxheU9iamVjdHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgIHB1YmxpYyBPdmVybGF5TGlzdFZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgIH0KLQotICAgIHB1YmxpYyBPdmVybGF5TGlzdFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBPdmVybGF5TGlzdFZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0cik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhbiBvYmplY3QgdG8gdGhlIG92ZXJsYXkgbGF5ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb2JqZWN0IEFuIG9iamVjdCB0byBiZSBhZGRlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRPdmVybGF5T2JqZWN0KE92ZXJsYXlPYmplY3Qgb2JqZWN0KSB7Ci0gICAgICAgIG1PdmVybGF5T2JqZWN0cy5hZGQob2JqZWN0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdGFydHMgYWxsIGFuaW1hdGlvbnMgb2Ygb2JqZWN0cyBpbiB0aGUgb3ZlcmxheSBsYXllci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydEFuaW1hdGlvbkFsbCgpIHsKLSAgICAgICAgZm9yIChPdmVybGF5T2JqZWN0IG9iamVjdCA6IG1PdmVybGF5T2JqZWN0cykgewotICAgICAgICAgICAgaWYgKCFvYmplY3QuaXNBbmltYXRpb25TdGFydGVkKCkpIHsKLSAgICAgICAgICAgICAgICBvYmplY3Quc3RhcnRBbmltYXRpb24oZ2V0RHJhd2luZ1RpbWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTdG9wcyBhbGwgYW5pbWF0aW9ucyBvZiBvYmplY3RzIGluIHRoZSBvdmVybGF5IGxheWVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN0b3BBbmltYXRpb25BbGwoKSB7Ci0gICAgICAgIGZvciAoT3ZlcmxheU9iamVjdCBvYmplY3QgOiBtT3ZlcmxheU9iamVjdHMpIHsKLSAgICAgICAgICAgIG9iamVjdC5zdG9wQW5pbWF0aW9uKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRyYXcoQ2FudmFzIGNhbnZhcykgewotICAgICAgICBzdXBlci5vbkRyYXcoY2FudmFzKTsKLSAgICAgICAgaWYgKG1PdmVybGF5T2JqZWN0cy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICBJdGVyYXRvcjxPdmVybGF5T2JqZWN0PiBpdCA9IG1PdmVybGF5T2JqZWN0cy5pdGVyYXRvcigpOwotICAgICAgICAgICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgIE92ZXJsYXlPYmplY3Qgb2JqZWN0ID0gaXQubmV4dCgpOwotICAgICAgICAgICAgICAgIEJpdG1hcERyYXdhYmxlIGJpdG1hcCA9IG9iamVjdC5nZXRCaXRtYXBEcmF3YWJsZSgpOwotICAgICAgICAgICAgICAgIGlmIChiaXRtYXAgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBiaXRtYXAuZHJhdyhjYW52YXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW9iamVjdC51cGRhdGUoZ2V0RHJhd2luZ1RpbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYW4gb2JqZWN0IHRvIGJlIHNob3duIGluIHRoZSBvdmVybGF5IGxheWVyLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgT3ZlcmxheU9iamVjdCB7Ci0gICAgICAgIHByaXZhdGUgQml0bWFwRHJhd2FibGUgbUJpdG1hcDsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtQ3VycmVudEFscGhhID0gMS4wZjsKLSAgICAgICAgcHJpdmF0ZSBSZWN0IG1DdXJyZW50Qm91bmRzOwotICAgICAgICBwcml2YXRlIEludGVycG9sYXRvciBtSW50ZXJwb2xhdG9yOwotICAgICAgICBwcml2YXRlIGxvbmcgbUR1cmF0aW9uOwotICAgICAgICBwcml2YXRlIFJlY3QgbVN0YXJ0UmVjdDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbURlbHRhWTsKLSAgICAgICAgcHJpdmF0ZSBmbG9hdCBtU3RhcnRBbHBoYSA9IDEuMGY7Ci0gICAgICAgIHByaXZhdGUgZmxvYXQgbUVuZEFscGhhID0gMS4wZjsKLSAgICAgICAgcHJpdmF0ZSBsb25nIG1TdGFydFRpbWU7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBbmltYXRpb25TdGFydGVkOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUlzQW5pbWF0aW9uRW5kZWQ7Ci0gICAgICAgIHByaXZhdGUgT25BbmltYXRpb25FbmRMaXN0ZW5lciBtTGlzdGVuZXI7Ci0KLSAgICAgICAgcHVibGljIE92ZXJsYXlPYmplY3QoQml0bWFwRHJhd2FibGUgYml0bWFwLCBSZWN0IHN0YXJ0UmVjdCkgewotICAgICAgICAgICAgbUJpdG1hcCA9IGJpdG1hcDsKLSAgICAgICAgICAgIG1TdGFydFJlY3QgPSBzdGFydFJlY3Q7Ci0gICAgICAgICAgICBtQ3VycmVudEJvdW5kcyA9IG5ldyBSZWN0KHN0YXJ0UmVjdCk7Ci0gICAgICAgICAgICBpZiAobUJpdG1hcCAhPSBudWxsICYmIG1DdXJyZW50Qm91bmRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQml0bWFwLnNldEFscGhhKChpbnQpIChtQ3VycmVudEFscGhhICogMjU1KSk7Ci0gICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRCb3VuZHMobUN1cnJlbnRCb3VuZHMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdGhlIGJpdG1hcCB0aGF0IHRoaXMgb2JqZWN0IHJlcHJlc2VudHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gQml0bWFwRHJhd2FibGUgdGhhdCB0aGlzIG9iamVjdCBoYXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQml0bWFwRHJhd2FibGUgZ2V0Qml0bWFwRHJhd2FibGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJpdG1hcDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSBzdGFydGVkIHN0YXR1cyBvZiB0aGUgYW5pbWF0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIGFuaW1hdGlvbiBoYXMgc3RhcnRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNBbmltYXRpb25TdGFydGVkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Jc0FuaW1hdGlvblN0YXJ0ZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhbmltYXRpb24gZm9yIHZhcnlpbmcgYWxwaGEuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzdGFydEFscGhhIFN0YXJ0aW5nIGFscGhhIHZhbHVlIGZvciB0aGUgYW5pbWF0aW9uLCB3aGVyZSAxLjAgbWVhbnMKLSAgICAgICAgICogZnVsbHkgb3BhcXVlIGFuZCAwLjAgbWVhbnMgZnVsbHkgdHJhbnNwYXJlbnQuCi0gICAgICAgICAqIEBwYXJhbSBlbmRBbHBoYSBFbmRpbmcgYWxwaGEgdmFsdWUgZm9yIHRoZSBhbmltYXRpb24uCi0gICAgICAgICAqIEByZXR1cm4gVGhpcyBPdmVybGF5T2JqZWN0IHRvIGFsbG93IGZvciBjaGFpbmluZyBvZiBjYWxscy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPdmVybGF5T2JqZWN0IHNldEFscGhhQW5pbWF0aW9uKGZsb2F0IHN0YXJ0QWxwaGEsIGZsb2F0IGVuZEFscGhhKSB7Ci0gICAgICAgICAgICBtU3RhcnRBbHBoYSA9IHN0YXJ0QWxwaGE7Ci0gICAgICAgICAgICBtRW5kQWxwaGEgPSBlbmRBbHBoYTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYW5pbWF0aW9uIGZvciBtb3Zpbmcgb2JqZWN0cyB2ZXJ0aWNhbGx5LgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGVsdGFZIERpc3RhbmNlIHRvIG1vdmUgaW4gcGl4ZWxzLgotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRUcmFuc2xhdGVZQW5pbWF0aW9uKGludCBkZWx0YVkpIHsKLSAgICAgICAgICAgIG1EZWx0YVkgPSBkZWx0YVk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGhvdyBsb25nIHRoZSBhbmltYXRpb24gd2lsbCBsYXN0LgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZHVyYXRpb24gRHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzCi0gICAgICAgICAqIEByZXR1cm4gVGhpcyBPdmVybGF5T2JqZWN0IHRvIGFsbG93IGZvciBjaGFpbmluZyBvZiBjYWxscy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBPdmVybGF5T2JqZWN0IHNldER1cmF0aW9uKGxvbmcgZHVyYXRpb24pIHsKLSAgICAgICAgICAgIG1EdXJhdGlvbiA9IGR1cmF0aW9uOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgYWNjZWxlcmF0aW9uIGN1cnZlIGZvciB0aGlzIGFuaW1hdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGludGVycG9sYXRvciBUaGUgaW50ZXJwb2xhdG9yIHdoaWNoIGRlZmluZXMgdGhlIGFjY2VsZXJhdGlvbiBjdXJ2ZQotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRJbnRlcnBvbGF0b3IoSW50ZXJwb2xhdG9yIGludGVycG9sYXRvcikgewotICAgICAgICAgICAgbUludGVycG9sYXRvciA9IGludGVycG9sYXRvcjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJpbmRzIGFuIGFuaW1hdGlvbiBlbmQgbGlzdGVuZXIgdG8gdGhlIGFuaW1hdGlvbi4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGxpc3RlbmVyIHRoZSBhbmltYXRpb24gZW5kIGxpc3RlbmVyIHRvIGJlIG5vdGlmaWVkLgotICAgICAgICAgKiBAcmV0dXJuIFRoaXMgT3ZlcmxheU9iamVjdCB0byBhbGxvdyBmb3IgY2hhaW5pbmcgb2YgY2FsbHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgT3ZlcmxheU9iamVjdCBzZXRBbmltYXRpb25FbmRMaXN0ZW5lcihPbkFuaW1hdGlvbkVuZExpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFN0YXJ0cyB0aGUgYW5pbWF0aW9uIGFuZCBzZXRzIHRoZSBzdGFydCB0aW1lLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc3RhcnRUaW1lIFN0YXJ0IHRpbWUgdG8gYmUgc2V0IGluIE1pbGxpcwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RhcnRBbmltYXRpb24obG9uZyBzdGFydFRpbWUpIHsKLSAgICAgICAgICAgIG1TdGFydFRpbWUgPSBzdGFydFRpbWU7Ci0gICAgICAgICAgICBtSXNBbmltYXRpb25TdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTdG9wcyB0aGUgYW5pbWF0aW9uLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc3RvcEFuaW1hdGlvbigpIHsKLSAgICAgICAgICAgIG1Jc0FuaW1hdGlvblN0YXJ0ZWQgPSB0cnVlOwotICAgICAgICAgICAgbUlzQW5pbWF0aW9uRW5kZWQgPSB0cnVlOwotICAgICAgICAgICAgaWYgKG1MaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uQW5pbWF0aW9uRW5kKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsY3VsYXRlcyBhbmQgdXBkYXRlcyBjdXJyZW50IGJvdW5kcyBhbmQgYWxwaGEgdmFsdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBjdXJyZW50VGltZSBDdXJyZW50IHRpbWUuaW4gbWlsbGlzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiB1cGRhdGUobG9uZyBjdXJyZW50VGltZSkgewotICAgICAgICAgICAgaWYgKG1Jc0FuaW1hdGlvbkVuZGVkKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmxvYXQgbm9ybWFsaXplZFRpbWUgPSAoY3VycmVudFRpbWUgLSBtU3RhcnRUaW1lKSAvIChmbG9hdCkgbUR1cmF0aW9uOwotICAgICAgICAgICAgbm9ybWFsaXplZFRpbWUgPSBNYXRoLm1heCgwLjBmLCBNYXRoLm1pbigxLjBmLCBub3JtYWxpemVkVGltZSkpOwotICAgICAgICAgICAgaWYgKCFtSXNBbmltYXRpb25TdGFydGVkKSB7Ci0gICAgICAgICAgICAgICAgbm9ybWFsaXplZFRpbWUgPSAwLjBmOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmxvYXQgaW50ZXJwb2xhdGVkVGltZSA9IChtSW50ZXJwb2xhdG9yID09IG51bGwpID8gbm9ybWFsaXplZFRpbWUKLSAgICAgICAgICAgICAgICAgICAgOiBtSW50ZXJwb2xhdG9yLmdldEludGVycG9sYXRpb24obm9ybWFsaXplZFRpbWUpOwotICAgICAgICAgICAgaW50IGRlbHRhWSA9IChpbnQpIChtRGVsdGFZICogaW50ZXJwb2xhdGVkVGltZSk7Ci0gICAgICAgICAgICBtQ3VycmVudEJvdW5kcy50b3AgPSBtU3RhcnRSZWN0LnRvcCArIGRlbHRhWTsKLSAgICAgICAgICAgIG1DdXJyZW50Qm91bmRzLmJvdHRvbSA9IG1TdGFydFJlY3QuYm90dG9tICsgZGVsdGFZOwotICAgICAgICAgICAgbUN1cnJlbnRBbHBoYSA9IG1TdGFydEFscGhhICsgKG1FbmRBbHBoYSAtIG1TdGFydEFscGhhKSAqIGludGVycG9sYXRlZFRpbWU7Ci0gICAgICAgICAgICBpZiAobUJpdG1hcCAhPSBudWxsICYmIG1DdXJyZW50Qm91bmRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQml0bWFwLnNldEFscGhhKChpbnQpIChtQ3VycmVudEFscGhhICogMjU1KSk7Ci0gICAgICAgICAgICAgICAgbUJpdG1hcC5zZXRCb3VuZHMobUN1cnJlbnRCb3VuZHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1Jc0FuaW1hdGlvblN0YXJ0ZWQgJiYgbm9ybWFsaXplZFRpbWUgPj0gMS4wZikgewotICAgICAgICAgICAgICAgIG1Jc0FuaW1hdGlvbkVuZGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBpZiAobUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUxpc3RlbmVyLm9uQW5pbWF0aW9uRW5kKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuICFtSXNBbmltYXRpb25FbmRlZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBbiBhbmltYXRpb24gbGlzdGVuZXIgdGhhdCByZWNlaXZlcyBub3RpZmljYXRpb25zIHdoZW4gdGhlIGFuaW1hdGlvbiBlbmRzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludGVyZmFjZSBPbkFuaW1hdGlvbkVuZExpc3RlbmVyIHsKLSAgICAgICAgICAgIC8qKgotICAgICAgICAgICAgICogTm90aWZpZXMgdGhlIGVuZCBvZiB0aGUgYW5pbWF0aW9uLgotICAgICAgICAgICAgICovCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFuaW1hdGlvbkVuZCgpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjEvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9qZWxseWJlYW4tbXIxL01lZGlhUm91dGVySmVsbHliZWFuTXIxLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NTM5YmQuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjEvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmhhcmR3YXJlLmRpc3BsYXkuRGlzcGxheU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuRGlzcGxheTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotCi0vLyBAQFJlcXVpcmVzQXBpKDE3KQotZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEiOwotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlQ2FsbGJhY2soQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcmV0dXJuIG5ldyBDYWxsYmFja1Byb3h5PENhbGxiYWNrPihjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBSb3V0ZUluZm8gewotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNFbmFibGVkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmlzRW5hYmxlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBEaXNwbGF5IGdldFByZXNlbnRhdGlvbkRpc3BsYXkoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAvLyBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5nZXRQcmVzZW50YXRpb25EaXNwbGF5KCkgd2FzCi0gICAgICAgICAgICAvLyBhZGRlZCBpbiBBUEkgMTcuIEhvd2V2ZXIsIHNvbWUgZmFjdG9yeSByZWxlYXNlcyBvZiBKQiBNUjEgbWlzc2VkIGl0LgotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXJyb3IgZXgpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgZ2V0IHByZXNlbnRhdGlvbiBkaXNwbGF5IGZvciB0aGUgcm91dGUuIiwgZXgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVySmVsbHliZWFuLkNhbGxiYWNrIHsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV29ya2Fyb3VuZCB0aGUgZmFjdCB0aGF0IHRoZSB2ZXJzaW9uIG9mIE1lZGlhUm91dGVyLmFkZENhbGxiYWNrKCkgdGhhdCBhY2NlcHRzIGEKLSAgICAgKiBmbGFnIHRvIHBlcmZvcm0gYW4gYWN0aXZlIHNjYW4gZG9lcyBub3QgZXhpc3QgaW4gSkIgTVIxIHNvIHdlIG5lZWQgdG8gZm9yY2UKLSAgICAgKiB3aWZpIGRpc3BsYXkgc2NhbnMgZGlyZWN0bHkgdGhyb3VnaCB0aGUgRGlzcGxheU1hbmFnZXIuCi0gICAgICogRG8gbm90IHVzZSBvbiBKQiBNUjIgYW5kIGFib3ZlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQWN0aXZlU2Nhbldvcmthcm91bmQgaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0gICAgICAgIC8vIFRpbWUgYmV0d2VlbiB3aWZpIGRpc3BsYXkgc2NhbnMgd2hlbiBhY3RpdmVseSBzY2FubmluZyBpbiBtaWxsaXNlY29uZHMuCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXSUZJX0RJU1BMQVlfU0NBTl9JTlRFUlZBTCA9IDE1MDAwOwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgRGlzcGxheU1hbmFnZXIgbURpc3BsYXlNYW5hZ2VyOwotICAgICAgICBwcml2YXRlIGZpbmFsIEhhbmRsZXIgbUhhbmRsZXI7Ci0gICAgICAgIHByaXZhdGUgTWV0aG9kIG1TY2FuV2lmaURpc3BsYXlzTWV0aG9kOwotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5czsKLQotICAgICAgICBwdWJsaWMgQWN0aXZlU2Nhbldvcmthcm91bmQoQ29udGV4dCBjb250ZXh0LCBIYW5kbGVyIGhhbmRsZXIpIHsKLSAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgIT0gMTcpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbURpc3BsYXlNYW5hZ2VyID0gKERpc3BsYXlNYW5hZ2VyKSBjb250ZXh0LmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5ESVNQTEFZX1NFUlZJQ0UpOwotICAgICAgICAgICAgbUhhbmRsZXIgPSBoYW5kbGVyOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2NhbldpZmlEaXNwbGF5c01ldGhvZCA9IERpc3BsYXlNYW5hZ2VyLmNsYXNzLmdldE1ldGhvZCgic2NhbldpZmlEaXNwbGF5cyIpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBY3RpdmVTY2FuUm91dGVUeXBlcyhpbnQgcm91dGVUeXBlcykgewotICAgICAgICAgICAgLy8gT24gSkIgTVIxLCB0aGVyZSBpcyBubyBBUEkgdG8gc2NhbiB3aWZpIGRpc3BsYXkgcm91dGVzLgotICAgICAgICAgICAgLy8gSW5zdGVhZCB3ZSBtdXN0IG1ha2UgYSBkaXJlY3QgY2FsbCBpbnRvIHRoZSBEaXNwbGF5TWFuYWdlciB0byBzY2FuCi0gICAgICAgICAgICAvLyB3aWZpIGRpc3BsYXlzIG9uIHRoaXMgdmVyc2lvbiBidXQgb25seSB3aGVuIGxpdmUgdmlkZW8gcm91dGVzIGFyZSByZXF1ZXN0ZWQuCi0gICAgICAgICAgICAvLyBTZWUgYWxzbyB0aGUgSmVsbHliZWFuTXIySW1wbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZC4KLSAgICAgICAgICAgIC8vIFRoaXMgd2FzIGZpeGVkIGluIEpCIE1SMiBieSBhZGRpbmcgYSBuZXcgb3ZlcmxvYWQgb2YgYWRkQ2FsbGJhY2soKSB0bwotICAgICAgICAgICAgLy8gZW5hYmxlIGFjdGl2ZSBzY2FubmluZyBvbiByZXF1ZXN0LgotICAgICAgICAgICAgaWYgKChyb3V0ZVR5cGVzICYgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX1ZJREVPKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cykgewotICAgICAgICAgICAgICAgICAgICBpZiAobVNjYW5XaWZpRGlzcGxheXNNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZWx5U2Nhbm5pbmdXaWZpRGlzcGxheXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgbUhhbmRsZXIucG9zdCh0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBzY2FuIGZvciB3aWZpIGRpc3BsYXlzIGJlY2F1c2UgdGhlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiRGlzcGxheU1hbmFnZXIuc2NhbldpZmlEaXNwbGF5cygpIG1ldGhvZCBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm5vdCBhdmFpbGFibGUgb24gdGhpcyBkZXZpY2UuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cykgewotICAgICAgICAgICAgICAgICAgICBtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cyA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICBtSGFuZGxlci5yZW1vdmVDYWxsYmFja3ModGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGlmIChtQWN0aXZlbHlTY2FubmluZ1dpZmlEaXNwbGF5cykgewotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TY2FuV2lmaURpc3BsYXlzTWV0aG9kLmludm9rZShtRGlzcGxheU1hbmFnZXIpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IHNjYW4gZm9yIHdpZmkgZGlzcGxheXMuIiwgZXgpOwotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiQ2Fubm90IHNjYW4gZm9yIHdpZmkgZGlzcGxheXMuIiwgZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtSGFuZGxlci5wb3N0RGVsYXllZCh0aGlzLCBXSUZJX0RJU1BMQVlfU0NBTl9JTlRFUlZBTCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXb3JrYXJvdW5kIHRoZSBmYWN0IHRoYXQgdGhlIGlzQ29ubmVjdGluZygpIG1ldGhvZCBkb2VzIG5vdCBleGlzdCBpbiBKQiBNUjEuCi0gICAgICogRG8gbm90IHVzZSBvbiBKQiBNUjIgYW5kIGFib3ZlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgSXNDb25uZWN0aW5nV29ya2Fyb3VuZCB7Ci0gICAgICAgIHByaXZhdGUgTWV0aG9kIG1HZXRTdGF0dXNDb2RlTWV0aG9kOwotICAgICAgICBwcml2YXRlIGludCBtU3RhdHVzQ29ubmVjdGluZzsKLQotICAgICAgICBwdWJsaWMgSXNDb25uZWN0aW5nV29ya2Fyb3VuZCgpIHsKLSAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgIT0gMTcpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBGaWVsZCBzdGF0dXNDb25uZWN0aW5nRmllbGQgPQotICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8uY2xhc3MuZ2V0RmllbGQoIlNUQVRVU19DT05ORUNUSU5HIik7Ci0gICAgICAgICAgICAgICAgbVN0YXR1c0Nvbm5lY3RpbmcgPSBzdGF0dXNDb25uZWN0aW5nRmllbGQuZ2V0SW50KG51bGwpOwotICAgICAgICAgICAgICAgIG1HZXRTdGF0dXNDb2RlTWV0aG9kID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvLmNsYXNzLmdldE1ldGhvZCgiZ2V0U3RhdHVzQ29kZSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoRmllbGRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNDb25uZWN0aW5nKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPQotICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmo7Ci0KLSAgICAgICAgICAgIGlmIChtR2V0U3RhdHVzQ29kZU1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHN0YXR1c0NvZGUgPSAoSW50ZWdlciltR2V0U3RhdHVzQ29kZU1ldGhvZC5pbnZva2Uocm91dGUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzQ29kZSA9PSBtU3RhdHVzQ29ubmVjdGluZzsKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQXNzdW1lIG5vdCBjb25uZWN0aW5nLgotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIENhbGxiYWNrUHJveHk8VCBleHRlbmRzIENhbGxiYWNrPgotICAgICAgICAgICAgZXh0ZW5kcyBNZWRpYVJvdXRlckplbGx5YmVhbi5DYWxsYmFja1Byb3h5PFQ+IHsKLSAgICAgICAgcHVibGljIENhbGxiYWNrUHJveHkoVCBjYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY2FsbGJhY2spOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChyb3V0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMi9NZWRpYVJvdXRlckplbGx5YmVhbk1yMi5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi1tcjIvTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTEwMzU0OS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuLW1yMi9NZWRpYVJvdXRlckplbGx5YmVhbk1yMi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi0vLyBAQFJlcXVpcmVzQXBpKDE4KQotZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIgewotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldERlZmF1bHRSb3V0ZShPYmplY3Qgcm91dGVyT2JqKSB7Ci0gICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5nZXREZWZhdWx0Um91dGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkQ2FsbGJhY2soT2JqZWN0IHJvdXRlck9iaiwgaW50IHR5cGVzLCBPYmplY3QgY2FsbGJhY2tPYmosIGludCBmbGFncykgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5hZGRDYWxsYmFjayh0eXBlcywKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayljYWxsYmFja09iaiwgZmxhZ3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyBDaGFyU2VxdWVuY2UgZ2V0RGVzY3JpcHRpb24oT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0RGVzY3JpcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0Nvbm5lY3RpbmcoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuaXNDb25uZWN0aW5nKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFVzZXJSb3V0ZUluZm8gewotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0RGVzY3JpcHRpb24oT2JqZWN0IHJvdXRlT2JqLCBDaGFyU2VxdWVuY2UgZGVzY3JpcHRpb24pIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXREZXNjcmlwdGlvbihkZXNjcmlwdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuL01lZGlhUm91dGVySmVsbHliZWFuLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvamVsbHliZWFuL01lZGlhUm91dGVySmVsbHliZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiYjU5YjguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL2plbGx5YmVhbi9NZWRpYVJvdXRlckplbGx5YmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuZHJhd2FibGUuRHJhd2FibGU7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLy8gQEBSZXF1aXJlc0FwaSgxNikKLWZpbmFsIGNsYXNzIE1lZGlhUm91dGVySmVsbHliZWFuIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVySmVsbHliZWFuIjsKLQotICAgIC8vIGFuZHJvaWQubWVkaWEuQXVkaW9TeXN0ZW0uREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCA9IDB4ODA7Ci0gICAgLy8gYW5kcm9pZC5tZWRpYS5BdWRpb1N5c3RlbS5ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVMgPSAweDEwMDsKLSAgICAvLyBhbmRyb2lkLm1lZGlhLkF1ZGlvU3lzdGVtLkRFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUiA9IDB4MjAwOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9PVVRfQkxVRVRPT1RIID0gMHg4MCB8IDB4MTAwIHwgMHgyMDA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBST1VURV9UWVBFX0xJVkVfQVVESU8gPSAweDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUk9VVEVfVFlQRV9MSVZFX1ZJREVPID0gMHgyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJPVVRFX1RZUEVfVVNFUiA9IDB4MDA4MDAwMDA7Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBTExfUk9VVEVfVFlQRVMgPQotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX0FVRElPCi0gICAgICAgICAgICB8IE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfTElWRV9WSURFTwotICAgICAgICAgICAgfCBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX1VTRVI7Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRNZWRpYVJvdXRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0Lk1FRElBX1JPVVRFUl9TRVJWSUNFKTsKLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncyh7ICJyYXd0eXBlcyIsICJ1bmNoZWNrZWQiIH0pCi0gICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFJvdXRlcyhPYmplY3Qgcm91dGVyT2JqKSB7Ci0gICAgICAgIGZpbmFsIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyID0gKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqOwotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXIuZ2V0Um91dGVDb3VudCgpOwotICAgICAgICBMaXN0IG91dCA9IG5ldyBBcnJheUxpc3QoY291bnQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIG91dC5hZGQocm91dGVyLmdldFJvdXRlQXQoaSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvdXQ7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyAicmF3dHlwZXMiLCAidW5jaGVja2VkIiB9KQotICAgIHB1YmxpYyBzdGF0aWMgTGlzdCBnZXRDYXRlZ29yaWVzKE9iamVjdCByb3V0ZXJPYmopIHsKLSAgICAgICAgZmluYWwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIgPSAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmo7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IHJvdXRlci5nZXRDYXRlZ29yeUNvdW50KCk7Ci0gICAgICAgIExpc3Qgb3V0ID0gbmV3IEFycmF5TGlzdChjb3VudCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgb3V0LmFkZChyb3V0ZXIuZ2V0Q2F0ZWdvcnlBdChpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIE9iamVjdCBnZXRTZWxlY3RlZFJvdXRlKE9iamVjdCByb3V0ZXJPYmosIGludCB0eXBlKSB7Ci0gICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5nZXRTZWxlY3RlZFJvdXRlKHR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZWxlY3RSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZXMsIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5zZWxlY3RSb3V0ZSh0eXBlcywKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBhZGRDYWxsYmFjayhPYmplY3Qgcm91dGVyT2JqLCBpbnQgdHlwZXMsIE9iamVjdCBjYWxsYmFja09iaikgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5hZGRDYWxsYmFjayh0eXBlcywKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayljYWxsYmFja09iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZUNhbGxiYWNrKE9iamVjdCByb3V0ZXJPYmosIE9iamVjdCBjYWxsYmFja09iaikgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5yZW1vdmVDYWxsYmFjaygKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5DYWxsYmFjayljYWxsYmFja09iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBPYmplY3QgY3JlYXRlUm91dGVDYXRlZ29yeShPYmplY3Qgcm91dGVyT2JqLAotICAgICAgICAgICAgU3RyaW5nIG5hbWUsIGJvb2xlYW4gaXNHcm91cGFibGUpIHsKLSAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLmNyZWF0ZVJvdXRlQ2F0ZWdvcnkobmFtZSwgaXNHcm91cGFibGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVVzZXJSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBPYmplY3QgY2F0ZWdvcnlPYmopIHsKLSAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlcilyb3V0ZXJPYmopLmNyZWF0ZVVzZXJSb3V0ZSgKLSAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUNhdGVnb3J5KWNhdGVnb3J5T2JqKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgYWRkVXNlclJvdXRlKE9iamVjdCByb3V0ZXJPYmosIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIpcm91dGVyT2JqKS5hZGRVc2VyUm91dGUoCi0gICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIHJlbW92ZVVzZXJSb3V0ZShPYmplY3Qgcm91dGVyT2JqLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iaikucmVtb3ZlVXNlclJvdXRlKAotICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZUNhbGxiYWNrKENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQ2FsbGJhY2tQcm94eTxDYWxsYmFjaz4oY2FsbGJhY2spOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGNyZWF0ZVZvbHVtZUNhbGxiYWNrKFZvbHVtZUNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHJldHVybiBuZXcgVm9sdW1lQ2FsbGJhY2tQcm94eTxWb2x1bWVDYWxsYmFjaz4oY2FsbGJhY2spOwotICAgIH0KLQotICAgIHN0YXRpYyBib29sZWFuIGNoZWNrUm91dGVkVG9CbHVldG9vdGgoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBBdWRpb01hbmFnZXIgYXVkaW9NYW5hZ2VyID0gKEF1ZGlvTWFuYWdlcikgY29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICBDb250ZXh0LkFVRElPX1NFUlZJQ0UpOwotICAgICAgICAgICAgTWV0aG9kIG1ldGhvZCA9IGF1ZGlvTWFuYWdlci5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAiZ2V0RGV2aWNlc0ZvclN0cmVhbSIsIGludC5jbGFzcyk7Ci0gICAgICAgICAgICBpbnQgZGV2aWNlID0gKEludGVnZXIpIG1ldGhvZC5pbnZva2UoYXVkaW9NYW5hZ2VyLCBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDKTsKLSAgICAgICAgICAgIHJldHVybiAoZGV2aWNlICYgREVWSUNFX09VVF9CTFVFVE9PVEgpICE9IDA7Ci0gICAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldE5hbWUoT2JqZWN0IHJvdXRlT2JqLCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXROYW1lKGNvbnRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBDaGFyU2VxdWVuY2UgZ2V0U3RhdHVzKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFN0YXR1cygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0U3VwcG9ydGVkVHlwZXMoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0U3VwcG9ydGVkVHlwZXMoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldENhdGVnb3J5KE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldENhdGVnb3J5KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIERyYXdhYmxlIGdldEljb25EcmF3YWJsZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRJY29uRHJhd2FibGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFBsYXliYWNrVHlwZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRQbGF5YmFja1R5cGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IGdldFBsYXliYWNrU3RyZWFtKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFBsYXliYWNrU3RyZWFtKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWb2x1bWUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0Vm9sdW1lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWb2x1bWVNYXgoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbylyb3V0ZU9iaikuZ2V0Vm9sdW1lTWF4KCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBnZXRWb2x1bWVIYW5kbGluZyhPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5nZXRWb2x1bWVIYW5kbGluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBPYmplY3QgZ2V0VGFnKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldFRhZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFRhZyhPYmplY3Qgcm91dGVPYmosIE9iamVjdCB0YWcpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLnNldFRhZyh0YWcpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHJlcXVlc3RTZXRWb2x1bWUoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqKS5yZXF1ZXN0U2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgcmVxdWVzdFVwZGF0ZVZvbHVtZShPYmplY3Qgcm91dGVPYmosIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLnJlcXVlc3RVcGRhdGVWb2x1bWUoZGlyZWN0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgT2JqZWN0IGdldEdyb3VwKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgcmV0dXJuICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8pcm91dGVPYmopLmdldEdyb3VwKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHcm91cChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIHJldHVybiByb3V0ZU9iaiBpbnN0YW5jZW9mIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVHcm91cDsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVHcm91cCB7Ci0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKLSAgICAgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldEdyb3VwZWRSb3V0ZXMoT2JqZWN0IGdyb3VwT2JqKSB7Ci0gICAgICAgICAgICBmaW5hbCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXAgZ3JvdXAgPQotICAgICAgICAgICAgICAgICAgICAoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUdyb3VwKWdyb3VwT2JqOwotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gZ3JvdXAuZ2V0Um91dGVDb3VudCgpOwotICAgICAgICAgICAgTGlzdCBvdXQgPSBuZXcgQXJyYXlMaXN0KGNvdW50KTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIG91dC5hZGQoZ3JvdXAuZ2V0Um91dGVBdChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gb3V0OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBVc2VyUm91dGVJbmZvIHsKLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldE5hbWUoT2JqZWN0IHJvdXRlT2JqLCBDaGFyU2VxdWVuY2UgbmFtZSkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldE5hbWUobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0U3RhdHVzKE9iamVjdCByb3V0ZU9iaiwgQ2hhclNlcXVlbmNlIHN0YXR1cykgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFN0YXR1cyhzdGF0dXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldEljb25EcmF3YWJsZShPYmplY3Qgcm91dGVPYmosIERyYXdhYmxlIGljb24pIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRJY29uRHJhd2FibGUoaWNvbik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGxheWJhY2tUeXBlKE9iamVjdCByb3V0ZU9iaiwgaW50IHR5cGUpIHsKLSAgICAgICAgICAgICgoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Vc2VyUm91dGVJbmZvKXJvdXRlT2JqKS5zZXRQbGF5YmFja1R5cGUodHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGxheWJhY2tTdHJlYW0oT2JqZWN0IHJvdXRlT2JqLCBpbnQgc3RyZWFtKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0UGxheWJhY2tTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRWb2x1bWUoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0Vm9sdW1lTWF4KE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZU1heCkgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFZvbHVtZU1heCh2b2x1bWVNYXgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZvbHVtZUhhbmRsaW5nKE9iamVjdCByb3V0ZU9iaiwgaW50IHZvbHVtZUhhbmRsaW5nKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0Vm9sdW1lSGFuZGxpbmcodm9sdW1lSGFuZGxpbmcpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIHNldFZvbHVtZUNhbGxiYWNrKE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IHZvbHVtZUNhbGxiYWNrT2JqKSB7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVXNlclJvdXRlSW5mbylyb3V0ZU9iaikuc2V0Vm9sdW1lQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlZvbHVtZUNhbGxiYWNrKXZvbHVtZUNhbGxiYWNrT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRSZW1vdGVDb250cm9sQ2xpZW50KE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IHJjY09iaikgewotICAgICAgICAgICAgKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlVzZXJSb3V0ZUluZm8pcm91dGVPYmopLnNldFJlbW90ZUNvbnRyb2xDbGllbnQoCi0gICAgICAgICAgICAgICAgICAgIChhbmRyb2lkLm1lZGlhLlJlbW90ZUNvbnRyb2xDbGllbnQpcmNjT2JqKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUm91dGVDYXRlZ29yeSB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgQ2hhclNlcXVlbmNlIGdldE5hbWUoT2JqZWN0IGNhdGVnb3J5T2JqLCBDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIHJldHVybiAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVDYXRlZ29yeSljYXRlZ29yeU9iaikuZ2V0TmFtZShjb250ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsgInJhd3R5cGVzIiwgInVuY2hlY2tlZCIgfSkKLSAgICAgICAgcHVibGljIHN0YXRpYyBMaXN0IGdldFJvdXRlcyhPYmplY3QgY2F0ZWdvcnlPYmopIHsKLSAgICAgICAgICAgIEFycmF5TGlzdCBvdXQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAoKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVDYXRlZ29yeSljYXRlZ29yeU9iaikuZ2V0Um91dGVzKG91dCk7Ci0gICAgICAgICAgICByZXR1cm4gb3V0OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgZ2V0U3VwcG9ydGVkVHlwZXMoT2JqZWN0IGNhdGVnb3J5T2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmdldFN1cHBvcnRlZFR5cGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNHcm91cGFibGUoT2JqZWN0IGNhdGVnb3J5T2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gKChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlQ2F0ZWdvcnkpY2F0ZWdvcnlPYmopLmlzR3JvdXBhYmxlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBDYWxsYmFjayB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChpbnQgdHlwZSwgT2JqZWN0IHJvdXRlT2JqKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoaW50IHR5cGUsIE9iamVjdCByb3V0ZU9iaik7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVBZGRlZChPYmplY3Qgcm91dGVPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUmVtb3ZlZChPYmplY3Qgcm91dGVPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQ2hhbmdlZChPYmplY3Qgcm91dGVPYmopOwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlR3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaiwgaW50IGluZGV4KTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuZ3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaik7Ci0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVWb2x1bWVDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaik7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgVm9sdW1lQ2FsbGJhY2sgewotICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKTsKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IGRpcmVjdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV29ya2Fyb3VuZCBmb3IgbGltaXRhdGlvbnMgb2Ygc2VsZWN0Um91dGUoKSBvbiBKQiBhbmQgSkIgTVIxLgotICAgICAqIERvIG5vdCB1c2Ugb24gSkIgTVIyIGFuZCBhYm92ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNlbGVjdFJvdXRlV29ya2Fyb3VuZCB7Ci0gICAgICAgIHByaXZhdGUgTWV0aG9kIG1TZWxlY3RSb3V0ZUludE1ldGhvZDsKLQotICAgICAgICBwdWJsaWMgU2VsZWN0Um91dGVXb3JrYXJvdW5kKCkgewotICAgICAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA8IDE2IHx8IEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+IDE3KSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RSb3V0ZUludE1ldGhvZCA9IGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuY2xhc3MuZ2V0TWV0aG9kKAotICAgICAgICAgICAgICAgICAgICAgICAgInNlbGVjdFJvdXRlSW50IiwgaW50LmNsYXNzLCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mby5jbGFzcyk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHNlbGVjdFJvdXRlKE9iamVjdCByb3V0ZXJPYmosIGludCB0eXBlcywgT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciA9IChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iajsKLSAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0KLSAgICAgICAgICAgICAgICAgICAgKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvKXJvdXRlT2JqOwotCi0gICAgICAgICAgICBpbnQgcm91dGVUeXBlcyA9IHJvdXRlLmdldFN1cHBvcnRlZFR5cGVzKCk7Ci0gICAgICAgICAgICBpZiAoKHJvdXRlVHlwZXMgJiBST1VURV9UWVBFX1VTRVIpID09IDApIHsKLSAgICAgICAgICAgICAgICAvLyBIYW5kbGUgbm9uLXVzZXIgcm91dGVzLgotICAgICAgICAgICAgICAgIC8vIE9uIEpCIGFuZCBKQiBNUjEsIHRoZSBzZWxlY3RSb3V0ZSgpIEFQSSBvbmx5IHN1cHBvcnRzIHByb2dyYW1tYXRpY2FsbHkKLSAgICAgICAgICAgICAgICAvLyBzZWxlY3RpbmcgdXNlciByb3V0ZXMuICBTbyBpbnN0ZWFkIHdlIHJlbHkgb24gdGhlIGhpZGRlbiBzZWxlY3RSb3V0ZUludCgpCi0gICAgICAgICAgICAgICAgLy8gbWV0aG9kIG9uIHRoZXNlIHZlcnNpb25zIG9mIHRoZSBwbGF0Zm9ybS4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGxpbWl0YXRpb24gd2FzIHJlbW92ZWQgaW4gSkIgTVIyLgotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0Um91dGVJbnRNZXRob2QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdFJvdXRlSW50TWV0aG9kLmludm9rZShyb3V0ZXIsIHR5cGVzLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47IC8vIHN1Y2Nlc3MhCi0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBwcm9ncmFtbWF0aWNhbGx5IHNlbGVjdCBub24tdXNlciByb3V0ZS4gICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiTWVkaWEgcm91dGluZyBtYXkgbm90IHdvcmsuIiwgZXgpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJDYW5ub3QgcHJvZ3JhbW1hdGljYWxseSBzZWxlY3Qgbm9uLXVzZXIgcm91dGUuICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIk1lZGlhIHJvdXRpbmcgbWF5IG5vdCB3b3JrLiIsIGV4KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkNhbm5vdCBwcm9ncmFtbWF0aWNhbGx5IHNlbGVjdCBub24tdXNlciByb3V0ZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiYmVjYXVzZSB0aGUgcGxhdGZvcm0gaXMgbWlzc2luZyB0aGUgc2VsZWN0Um91dGVJbnQoKSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAibWV0aG9kLiAgTWVkaWEgcm91dGluZyBtYXkgbm90IHdvcmsuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBEZWZhdWx0IGhhbmRsaW5nLgotICAgICAgICAgICAgcm91dGVyLnNlbGVjdFJvdXRlKHR5cGVzLCByb3V0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBXb3JrYXJvdW5kIHRoZSBmYWN0IHRoYXQgdGhlIGdldERlZmF1bHRSb3V0ZSgpIG1ldGhvZCBkb2VzIG5vdCBleGlzdCBpbiBKQiBhbmQgSkIgTVIxLgotICAgICAqIERvIG5vdCB1c2Ugb24gSkIgTVIyIGFuZCBhYm92ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQgewotICAgICAgICBwcml2YXRlIE1ldGhvZCBtR2V0U3lzdGVtQXVkaW9Sb3V0ZU1ldGhvZDsKLQotICAgICAgICBwdWJsaWMgR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCgpIHsKLSAgICAgICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPCAxNiB8fCBCdWlsZC5WRVJTSU9OLlNES19JTlQgPiAxNykgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtR2V0U3lzdGVtQXVkaW9Sb3V0ZU1ldGhvZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLmNsYXNzLmdldE1ldGhvZCgiZ2V0U3lzdGVtQXVkaW9Sb3V0ZSIpOwotICAgICAgICAgICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldERlZmF1bHRSb3V0ZShPYmplY3Qgcm91dGVyT2JqKSB7Ci0gICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciA9IChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyKXJvdXRlck9iajsKLQotICAgICAgICAgICAgaWYgKG1HZXRTeXN0ZW1BdWRpb1JvdXRlTWV0aG9kICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUdldFN5c3RlbUF1ZGlvUm91dGVNZXRob2QuaW52b2tlKHJvdXRlcik7Ci0gICAgICAgICAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIENvdWxkIG5vdCBmaW5kIHRoZSBtZXRob2Qgb3IgaXQgZG9lcyBub3Qgd29yay4KLSAgICAgICAgICAgIC8vIFJldHVybiB0aGUgZmlyc3Qgcm91dGUgYW5kIGhvcGUgZm9yIHRoZSBiZXN0LgotICAgICAgICAgICAgcmV0dXJuIHJvdXRlci5nZXRSb3V0ZUF0KDApOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIGNsYXNzIENhbGxiYWNrUHJveHk8VCBleHRlbmRzIENhbGxiYWNrPgotICAgICAgICAgICAgZXh0ZW5kcyBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIFQgbUNhbGxiYWNrOwotCi0gICAgICAgIHB1YmxpYyBDYWxsYmFja1Byb3h5KFQgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVTZWxlY3RlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBpbnQgdHlwZSwgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlU2VsZWN0ZWQodHlwZSwgcm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGludCB0eXBlLCBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uUm91dGVVbnNlbGVjdGVkKHR5cGUsIHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlQWRkZWQocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZVJlbW92ZWQocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZUNoYW5nZWQocm91dGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVHcm91cGVkKGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIgcm91dGVyLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVHcm91cCBncm91cCwgaW50IGluZGV4KSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2sub25Sb3V0ZUdyb3VwZWQocm91dGUsIGdyb3VwLCBpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuZ3JvdXBlZChhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyIHJvdXRlciwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVyLlJvdXRlR3JvdXAgZ3JvdXApIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlVW5ncm91cGVkKHJvdXRlLCBncm91cCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVZvbHVtZUNoYW5nZWQoYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlciByb3V0ZXIsCi0gICAgICAgICAgICAgICAgYW5kcm9pZC5tZWRpYS5NZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblJvdXRlVm9sdW1lQ2hhbmdlZChyb3V0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgVm9sdW1lQ2FsbGJhY2tQcm94eTxUIGV4dGVuZHMgVm9sdW1lQ2FsbGJhY2s+Ci0gICAgICAgICAgICBleHRlbmRzIGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuVm9sdW1lQ2FsbGJhY2sgewotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgVCBtQ2FsbGJhY2s7Ci0KLSAgICAgICAgcHVibGljIFZvbHVtZUNhbGxiYWNrUHJveHkoVCBjYWxsYmFjaykgewotICAgICAgICAgICAgbUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblZvbHVtZVNldFJlcXVlc3Qocm91dGUsIHZvbHVtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgIG1DYWxsYmFjay5vblZvbHVtZVVwZGF0ZVJlcXVlc3Qocm91dGUsIGRpcmVjdGlvbik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFDb250cm9sSW50ZW50LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFDb250cm9sSW50ZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkOWU3NzcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhQ29udHJvbEludGVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotCi0vKioKLSAqIENvbnN0YW50cyBmb3IgbWVkaWEgY29udHJvbCBpbnRlbnRzLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGRlY2xhcmVzIGEgc2V0IG9mIHN0YW5kYXJkIG1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXMgYW5kIGFjdGlvbnMgdGhhdAotICogYXBwbGljYXRpb25zIGNhbiB1c2UgdG8gaWRlbnRpZnkgdGhlIGNhcGFiaWxpdGllcyBvZiBtZWRpYSByb3V0ZXMgYW5kIGNvbnRyb2wgdGhlbS4KLSAqIDwvcD4KLSAqCi0gKiA8aDM+TWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcmllczwvaDM+Ci0gKiA8cD4KLSAqIE1lZGlhIGNvbnRyb2wgaW50ZW50IGNhdGVnb3JpZXMgc3BlY2lmeSBtZWFucyBieSB3aGljaCBhcHBsaWNhdGlvbnMgY2FuCi0gKiBzZW5kIG1lZGlhIHRvIHRoZSBkZXN0aW5hdGlvbiBvZiBhIG1lZGlhIHJvdXRlLiAgQ2F0ZWdvcmllcyBhcmUgc29tZXRpbWVzIHJlZmVycmVkCi0gKiB0byBhcyBkZXNjcmliaW5nICJ0eXBlcyIgb3IgImtpbmRzIiBvZiByb3V0ZXMuCi0gKiA8L3A+PHA+Ci0gKiBGb3IgZXhhbXBsZSwgaWYgYSByb3V0ZSBzdXBwb3J0cyB0aGUge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrIGNhdGVnb3J5fSwKLSAqIHRoZW4gYW4gYXBwbGljYXRpb24gY2FuIGFzayBpdCB0byBwbGF5IG1lZGlhIHJlbW90ZWx5IGJ5IHNlbmRpbmcgYQotICoge0BsaW5rICNBQ1RJT05fUExBWSBwbGF5fSBvciB7QGxpbmsgI0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGludGVudCB3aXRoIHRoZSBVcmkgb2YgdGhlCi0gKiBtZWRpYSBjb250ZW50IHRvIHBsYXkuICBTdWNoIGEgcm91dGUgbWF5IHRoZW4gYmUgcmVmZXJyZWQgdG8gYXMKLSAqIGEgInJlbW90ZSBwbGF5YmFjayByb3V0ZSIgYmVjYXVzZSBpdCBzdXBwb3J0cyByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMuICBJdCBpcyBjb21tb24KLSAqIGZvciBhIHJvdXRlIHRvIHN1cHBvcnQgbXVsdGlwbGUgY2F0ZWdvcmllcyBvZiByZXF1ZXN0cyBhdCB0aGUgc2FtZSB0aW1lLCBzdWNoIGFzCi0gKiBsaXZlIGF1ZGlvIGFuZCBsaXZlIHZpZGVvLgotICogPC9wPjxwPgotICogVGhlIGZvbGxvd2luZyBzdGFuZGFyZCByb3V0ZSBjYXRlZ29yaWVzIGFyZSBkZWZpbmVkLgotICogPC9wPjx1bD4KLSAqIDxsaT57QGxpbmsgI0NBVEVHT1JZX0xJVkVfQVVESU8gTGl2ZSBhdWRpb306IFRoZSByb3V0ZSBzdXBwb3J0cyBzdHJlYW1pbmcgbGl2ZSBhdWRpbwotICogZnJvbSB0aGUgZGV2aWNlIHRvIHRoZSBkZXN0aW5hdGlvbi4gIExpdmUgYXVkaW8gcm91dGVzIGluY2x1ZGUgbG9jYWwgc3BlYWtlcnMKLSAqIGFuZCBCbHVldG9vdGggaGVhZHNldHMuCi0gKiA8bGk+e0BsaW5rICNDQVRFR09SWV9MSVZFX1ZJREVPIExpdmUgdmlkZW99OiBUaGUgcm91dGUgc3VwcG9ydHMgc3RyZWFtaW5nIGxpdmUgdmlkZW8KLSAqIGZyb20gdGhlIGRldmljZSB0byB0aGUgZGVzdGluYXRpb24uICBMaXZlIHZpZGVvIHJvdXRlcyBpbmNsdWRlIGxvY2FsIGRpc3BsYXlzCi0gKiBhbmQgd2lyZWxlc3MgZGlzcGxheXMgdGhhdCBzdXBwb3J0IG1pcnJvcmluZyBhbmQKLSAqIHtAbGluayBhbmRyb2lkLmFwcC5QcmVzZW50YXRpb24gcHJlc2VudGF0aW9uc30uICBMaXZlIHZpZGVvIHJvdXRlcyB0eXBpY2FsbHkgYWxzbwotICogc3VwcG9ydCBsaXZlIGF1ZGlvIGNhcGFiaWxpdGllcy4KLSAqIDxsaT57QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyBSZW1vdGUgcGxheWJhY2t9OiBUaGUgcm91dGUgc3VwcG9ydHMgc2VuZGluZwotICogcmVtb3RlIHBsYXliYWNrIHJlcXVlc3RzIGZvciBtZWRpYSBjb250ZW50IHRvIHRoZSBkZXN0aW5hdGlvbi4gIFRoZSBjb250ZW50IHRvIGJlCi0gKiBwbGF5ZWQgaXMgaWRlbnRpZmllZCBieSBhIFVyaSBhbmQgbWltZS10eXBlLgotICogPC91bD48cD4KLSAqIE1lZGlhIHJvdXRlIHByb3ZpZGVycyBtYXkgZGVmaW5lIGN1c3RvbSBtZWRpYSBjb250cm9sIGludGVudCBjYXRlZ29yaWVzIG9mIHRoZWlyIG93biBpbgotICogYWRkaXRpb24gdG8gdGhlIHN0YW5kYXJkIG9uZXMuICBDdXN0b20gY2F0ZWdvcmllcyBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGEgdmFyaWV0eQotICogb2YgZmVhdHVyZXMgdG8gYXBwbGljYXRpb25zIHRoYXQgcmVjb2duaXplIGFuZCBrbm93IGhvdyB0byB1c2UgdGhlbS4gIEZvciBleGFtcGxlLAotICogYSBtZWRpYSByb3V0ZSBwcm92aWRlciBtaWdodCBkZWZpbmUgYSBjdXN0b20gY2F0ZWdvcnkgdG8gaW5kaWNhdGUgdGhhdCBpdHMgcm91dGVzCi0gKiBzdXBwb3J0IGEgc3BlY2lhbCBkZXZpY2Utc3BlY2lmaWMgY29udHJvbCBpbnRlcmZhY2UgaW4gYWRkaXRpb24gdG8gb3RoZXIKLSAqIHN0YW5kYXJkIGZlYXR1cmVzLgotICogPC9wPjxwPgotICogQXBwbGljYXRpb25zIGNhbiBkZXRlcm1pbmUgd2hpY2ggY2F0ZWdvcmllcyBhIHJvdXRlIHN1cHBvcnRzIGJ5IHVzaW5nIHRoZQotICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnl9Ci0gKiBvciB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI2dldENvbnRyb2xGaWx0ZXJzIE1lZGlhUm91dGVyLlJvdXRlSW5mby5nZXRDb250cm9sRmlsdGVyc30KLSAqIG1ldGhvZHMuICBBcHBsaWNhdGlvbnMgY2FuIGFsc28gc3BlY2lmeSB0aGUgdHlwZXMgb2Ygcm91dGVzIHRoYXQgdGhleSB3YW50IHRvIHVzZSBieQotICogY3JlYXRpbmcge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBtZWRpYSByb3V0ZSBzZWxlY3RvcnN9IHRoYXQgY29udGFpbiB0aGUgZGVzaXJlZAotICogY2F0ZWdvcmllcyBhbmQgYXJlIHVzZWQgdG8gZmlsdGVyIHJvdXRlcyBpbiBzZXZlcmFsIHBhcnRzIG9mIHRoZSBtZWRpYSByb3V0ZXIgQVBJLgotICogPC9wPgotICoKLSAqIDxoMz5NZWRpYSBjb250cm9sIGludGVudCBhY3Rpb25zPC9oMz4KLSAqIDxwPgotICogTWVkaWEgY29udHJvbCBpbnRlbnQgYWN0aW9ucyBzcGVjaWZ5IHBhcnRpY3VsYXIgZnVuY3Rpb25zIHRoYXQgYXBwbGljYXRpb25zCi0gKiBjYW4gYXNrIHRoZSBkZXN0aW5hdGlvbiBvZiBhIG1lZGlhIHJvdXRlIHRvIHBlcmZvcm0uICBNZWRpYSByb3V0ZSBjb250cm9sIHJlcXVlc3RzCi0gKiB0YWtlIHRoZSBmb3JtIG9mIGludGVudHMgaW4gYSBzaW1pbGFyIG1hbm5lciB0byBvdGhlciBpbnRlbnRzIHVzZWQgdG8gc3RhcnQgYWN0aXZpdGllcwotICogb3Igc2VuZCBicm9hZGNhc3RzLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCBtZWRpYSBjb250cm9sIGludGVudHMgYXJlIGRpcmVjdGVkIHRvCi0gKiByb3V0ZXMgcmF0aGVyIHRoYW4gYWN0aXZpdHkgb3IgYnJvYWRjYXN0IHJlY2VpdmVyIGNvbXBvbmVudHMuCi0gKiA8L3A+PHA+Ci0gKiBFYWNoIG1lZGlhIHJvdXRlIGNvbnRyb2wgaW50ZW50IHNwZWNpZmllcyBhbiBhY3Rpb24sIGEgY2F0ZWdvcnkgYW5kIHNvbWUgbnVtYmVyIG9mIHBhcmFtZXRlcnMKLSAqIHRoYXQgYXJlIHN1cHBsaWVkIGFzIGV4dHJhcy4gIEFwcGxpY2F0aW9ucyBzZW5kIG1lZGlhIGNvbnRyb2wgcmVxdWVzdHMgdG8gcm91dGVzIHVzaW5nIHRoZQotICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QgTWVkaWFSb3V0ZXIuUm91dGVJbmZvLnNlbmRDb250cm9sUmVxdWVzdH0KLSAqIG1ldGhvZCBhbmQgcmVjZWl2ZSByZXN1bHRzIHZpYSBhIGNhbGxiYWNrLgotICogPC9wPjxwPgotICogQWxsIG1lZGlhIGNvbnRyb2wgaW50ZW50IGFjdGlvbnMgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcmllcwotICogdGhhdCBzdXBwb3J0IHRoZW0uICBUaHVzIG9ubHkgcmVtb3RlIHBsYXliYWNrIHJvdXRlcyBtYXkgcGVyZm9ybSByZW1vdGUgcGxheWJhY2sgYWN0aW9ucy4KLSAqIFRoZSBkb2N1bWVudGF0aW9uIG9mIGVhY2ggYWN0aW9uIHNwZWNpZmllcyB0aGUgY2F0ZWdvcnkgdG8gd2hpY2ggdGhlIGFjdGlvbiBiZWxvbmdzLAotICogdGhlIHBhcmFtZXRlcnMgaXQgcmVxdWlyZXMsIGFuZCB0aGUgcmVzdWx0cyBpdCByZXR1cm5zLgotICogPC9wPgotICoKLSAqIDxoMz5MaXZlIGF1ZGlvIGFuZCBsaXZlIHZpZGVvIHJvdXRlczwvaDM+Ci0gKiA8cD4KLSAqIHtAbGluayAjQ0FURUdPUllfTElWRV9BVURJTyBMaXZlIGF1ZGlvfSBhbmQge0BsaW5rICNDQVRFR09SWV9MSVZFX1ZJREVPIGxpdmUgdmlkZW99Ci0gKiByb3V0ZXMgcHJlc2VudCBtZWRpYSB1c2luZyBzdGFuZGFyZCBzeXN0ZW0gaW50ZXJmYWNlcyBzdWNoIGFzIGF1ZGlvIHN0cmVhbXMsCi0gKiB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uIHByZXNlbnRhdGlvbnN9IG9yIGRpc3BsYXkgbWlycm9yaW5nLiAgVGhlc2Ugcm91dGVzIGFyZQotICogdGhlIGVhc2llc3QgdG8gdXNlIGJlY2F1c2UgYXBwbGljYXRpb25zIHNpbXBseSByZW5kZXIgY29udGVudCBsb2NhbGx5IG9uIHRoZSBkZXZpY2UKLSAqIGFuZCB0aGUgc3lzdGVtIHN0cmVhbXMgaXQgdG8gdGhlIHJvdXRlIGRlc3RpbmF0aW9uIGF1dG9tYXRpY2FsbHkuCi0gKiA8L3A+PHA+Ci0gKiBJbiBtb3N0IGNhc2VzLCBhcHBsaWNhdGlvbnMgY2FuIHN0cmVhbSBjb250ZW50IHRvIGxpdmUgYXVkaW8gYW5kIGxpdmUgdmlkZW8gcm91dGVzIGluCi0gKiB0aGUgc2FtZSB3YXkgdGhleSB3b3VsZCBwbGF5IHRoZSBjb250ZW50IGxvY2FsbHkgd2l0aG91dCBhbnkgbW9kaWZpY2F0aW9uLiAgSG93ZXZlciwKLSAqIGFwcGxpY2F0aW9ucyBtYXkgYWxzbyBiZSBhYmxlIHRvIHRha2UgYWR2YW50YWdlIG9mIG1vcmUgc29waGlzdGljYXRlZCBmZWF0dXJlcyBzdWNoCi0gKiBhcyBzZWNvbmQtc2NyZWVuIHByZXNlbnRhdGlvbiBBUElzIHRoYXQgYXJlIHBhcnRpY3VsYXIgdG8gdGhlc2Ugcm91dGVzLgotICogPC9wPgotICoKLSAqIDxoMz5SZW1vdGUgcGxheWJhY2sgcm91dGVzPC9oMz4KLSAqIDxwPgotICoge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgUmVtb3RlIHBsYXliYWNrfSByb3V0ZXMgcHJlc2VudCBtZWRpYSByZW1vdGVseQotICogYnkgcGxheWluZyBjb250ZW50IGZyb20gYSBVcmkuCi0gKiBUaGVzZSByb3V0ZXMgZGVzdGluYXRpb25zIHRha2UgcmVzcG9uc2liaWxpdHkgZm9yIGZldGNoaW5nIGFuZCByZW5kZXJpbmcgY29udGVudAotICogb24gdGhlaXIgb3duLiAgQXBwbGljYXRpb25zIGRvIG5vdCByZW5kZXIgdGhlIGNvbnRlbnQgdGhlbXNlbHZlczsgaW5zdGVhZCwgYXBwbGljYXRpb25zCi0gKiBzZW5kIGNvbnRyb2wgcmVxdWVzdHMgdG8gaW5pdGlhdGUgcGxheSwgcGF1c2UsIHJlc3VtZSwgb3Igc3RvcCBtZWRpYSBpdGVtcyBhbmQgcmVjZWl2ZQotICogc3RhdHVzIHVwZGF0ZXMgYXMgdGhleSBjaGFuZ2Ugc3RhdGUuCi0gKiA8L3A+Ci0gKgotICogPGg0PlNlc3Npb25zPC9oND4KLSAqIDxwPgotICogRWFjaCByZW1vdGUgbWVkaWEgcGxheWJhY2sgYWN0aW9uIGlzIGNvbmR1Y3RlZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGEgc2Vzc2lvbi4KLSAqIFNlc3Npb25zIGFyZSB1c2VkIHRvIHByZXZlbnQgYXBwbGljYXRpb25zIGZyb20gYWNjaWRlbnRhbGx5IGludGVyZmVyaW5nIHdpdGggb25lCi0gKiBhbm90aGVyIGJlY2F1c2UgYXQgbW9zdCBvbmUgc2Vzc2lvbiBjYW4gYmUgdmFsaWQgYXQgYSB0aW1lLgotICogPC9wPjxwPgotICogQSBzZXNzaW9uIGNhbiBiZSBjcmVhdGVkIHVzaW5nIHRoZSB7QGxpbmsgI0FDVElPTl9TVEFSVF9TRVNTSU9OIHN0YXJ0IHNlc3Npb24gYWN0aW9ufQotICogYW5kIHRlcm1pbmF0ZWQgdXNpbmcgdGhlIHtAbGluayAjQUNUSU9OX0VORF9TRVNTSU9OIGVuZCBzZXNzaW9uIGFjdGlvbn0gd2hlbiB0aGUKLSAqIHJvdXRlIHByb3ZpZGVzIGV4cGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudCBmZWF0dXJlcy4KLSAqIDwvcD48cD4KLSAqIEV4cGxpY2l0IHNlc3Npb24gbWFuYWdlbWVudCB3YXMgYWRkZWQgaW4gYSBsYXRlciByZXZpc2lvbiBvZiB0aGUgcHJvdG9jb2wgc28gbm90Ci0gKiBhbGwgcm91dGVzIHN1cHBvcnQgaXQuICBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBleHBsaWNpdCBzZXNzaW9uIG1hbmFnZW1lbnQKLSAqIHRoZW4gaW1wbGljaXQgc2Vzc2lvbiBtYW5hZ2VtZW50IG1heSBzdGlsbCBiZSB1c2VkLiAgSW1wbGljaXQgc2Vzc2lvbiBtYW5hZ2VtZW50Ci0gKiByZWxpZXMgb24gdGhlIHVzZSBvZiB0aGUge0BsaW5rICNBQ1RJT05fUExBWSBwbGF5fSBhbmQge0BsaW5rICNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfQotICogYWN0aW9ucyB3aGljaCBoYXZlIHRoZSBzaWRlLWVmZmVjdCBvZiBjcmVhdGluZyBhIG5ldyBzZXNzaW9uIGlmIG5vbmUgaXMgcHJvdmlkZWQKLSAqIGFzIGFyZ3VtZW50LgotICogPC9wPjxwPgotICogV2hlbiBhIG5ldyBzZXNzaW9uIGlzIGNyZWF0ZWQsIHRoZSBwcmV2aW91cyBzZXNzaW9uIGlzIGludmFsaWRhdGVkIGFuZCBhbnkgb25nb2luZwotICogbWVkaWEgcGxheWJhY2sgaXMgc3RvcHBlZCBiZWZvcmUgdGhlIHJlcXVlc3RlZCBhY3Rpb24gaXMgcGVyZm9ybWVkLiAgQW55IGF0dGVtcHQKLSAqIHRvIHVzZSBhbiBpbnZhbGlkYXRlZCBzZXNzaW9uIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgKFByb3RvY29sIGltcGxlbWVudGF0aW9ucwotICogYXJlIGVuY291cmFnZWQgdG8gYWdncmVzc2l2ZWx5IGRpc2NhcmQgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIGludmFsaWRhdGVkIHNlc3Npb25zCi0gKiBzaW5jZSBpdCBpcyBubyBsb25nZXIgb2YgdXNlLikKLSAqIDwvcD48cD4KLSAqIEVhY2ggc2Vzc2lvbiBpcyBpZGVudGlmaWVkIGJ5IGEgdW5pcXVlIHNlc3Npb24gaWQgdGhhdCBtYXkgYmUgdXNlZCB0byBjb250cm9sCi0gKiB0aGUgc2Vzc2lvbiB1c2luZyBhY3Rpb25zIHN1Y2ggYXMgcGF1c2UsIHJlc3VtZSwgc3RvcCBhbmQgZW5kIHNlc3Npb24uCi0gKiA8L3A+Ci0gKgotICogPGg0Pk1lZGlhIGl0ZW1zPC9oND4KLSAqIDxwPgotICogRWFjaCBzdWNjZXNzZnVsIHtAbGluayAjQUNUSU9OX1BMQVkgcGxheX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBhY3Rpb24KLSAqIHJldHVybnMgYSB1bmlxdWUgbWVkaWEgaXRlbSBpZCB0aGF0IGFuIGFwcGxpY2F0aW9uIGNhbiB1c2UgdG8gbW9uaXRvciBhbmQgY29udHJvbAotICogcGxheWJhY2suICBUaGUgbWVkaWEgaXRlbSBpZCBtYXkgYmUgcGFzc2VkIHRvIG90aGVyIGFjdGlvbnMgc3VjaCBhcwotICoge0BsaW5rICNBQ1RJT05fU0VFSyBzZWVrfSBvciB7QGxpbmsgI0FDVElPTl9HRVRfU1RBVFVTIGdldCBzdGF0dXN9LiAgSXQgd2lsbCBhbHNvIGFwcGVhcgotICogYXMgYSBwYXJhbWV0ZXIgaW4gc3RhdHVzIHVwZGF0ZSBicm9hZGNhc3RzIHRvIGlkZW50aWZ5IHRoZSBhc3NvY2lhdGVkIHBsYXliYWNrIHJlcXVlc3QuCi0gKiA8L3A+PHA+Ci0gKiBFYWNoIG1lZGlhIGl0ZW0gaXMgc2NvcGVkIHRvIHRoZSBzZXNzaW9uIGluIHdoaWNoIGl0IHdhcyBjcmVhdGVkLiAgVGhlcmVmb3JlIG1lZGlhIGl0ZW0KLSAqIGlkcyBhcmUgb25seSBldmVyIHVzZWQgdG9nZXRoZXIgd2l0aCBzZXNzaW9uIGlkcy4gIE1lZGlhIGl0ZW0gaWRzIGFyZSBtZWFuaW5nbGVzcwotICogb24gdGhlaXIgb3duLiAgV2hlbiB0aGUgc2Vzc2lvbiBpcyBpbnZhbGlkYXRlZCwgYWxsIG9mIGl0cyBtZWRpYSBpdGVtcyBhcmUgYWxzbwotICogaW52YWxpZGF0ZWQuCi0gKiA8L3A+Ci0gKgotICogPGg0PlRoZSBwbGF5YmFjayBxdWV1ZTwvaDQ+Ci0gKiA8cD4KLSAqIEVhY2ggc2Vzc2lvbiBoYXMgaXRzIG93biBwbGF5YmFjayBxdWV1ZSB0aGF0IGNvbnNpc3RzIG9mIHRoZSBtZWRpYSBpdGVtcyB0aGF0Ci0gKiBhcmUgcGVuZGluZywgcGxheWluZywgYnVmZmVyaW5nIG9yIHBhdXNlZC4gIEl0ZW1zIGFyZSBhZGRlZCB0byB0aGUgcXVldWUgd2hlbgotICogYSBwbGF5YmFjayByZXF1ZXN0IGlzIGlzc3VlZC4gIEl0ZW1zIGFyZSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIHdoZW4gdGhleSBhcmUgbm8KLSAqIGxvbmdlciBlbGlnaWJsZSBmb3IgcGxheWJhY2sgKGVudGVyIHRlcm1pbmFsIHN0YXRlcykuCi0gKiA8L3A+PHA+Ci0gKiBBcyBkZXNjcmliZWQgaW4gdGhlIHtAbGluayBNZWRpYUl0ZW1TdGF0dXN9IGNsYXNzLCBtZWRpYSBpdGVtcyBpbml0aWFsbHkKLSAqIHN0YXJ0IGluIGEgcGVuZGluZyBzdGF0ZSwgdHJhbnNpdGlvbiB0byB0aGUgcGxheWluZyAob3IgYnVmZmVyaW5nIG9yIHBhdXNlZCkgc3RhdGUKLSAqIGR1cmluZyBwbGF5YmFjaywgYW5kIGVuZCBpbiBhIGZpbmlzaGVkLCBjYW5jZWxlZCwgaW52YWxpZGF0ZWQgb3IgZXJyb3Igc3RhdGUuCi0gKiBPbmNlIHRoZSBjdXJyZW50IGl0ZW0gZW50ZXJzIGEgdGVybWluYWwgc3RhdGUsIHBsYXliYWNrIHByb2NlZWRzIG9uIHRvIHRoZQotICogbmV4dCBpdGVtLgotICogPC9wPjxwPgotICogVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBkZXRlcm1pbmUgd2hldGhlciB0aGUgcm91dGUgc3VwcG9ydHMgcXVldWluZyBieSBjaGVja2luZwotICogd2hldGhlciB0aGUge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gYWN0aW9uIGlzIGRlY2xhcmVkIGluIHRoZSByb3V0ZSdzIGNvbnRyb2wgZmlsdGVyCi0gKiB1c2luZyB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3N1cHBvcnRzQ29udHJvbFJlcXVlc3QgUm91dGVJbmZvLnN1cHBvcnRzQ29udHJvbFJlcXVlc3R9LgotICogPC9wPjxwPgotICogSWYgdGhlIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IGFjdGlvbiBpcyBzdXBwb3J0ZWQgYnkgdGhlIHJvdXRlLCB0aGVuIHRoZSByb3V0ZSBwcm9taXNlcwotICogdG8gYWxsb3cgYXQgbGVhc3QgdHdvIGl0ZW1zIChwb3NzaWJseSBtb3JlKSB0byBiZSBlbnF1ZXVlZCBhdCBhIHRpbWUuICBFbnF1ZXVlZCBpdGVtcyBwbGF5Ci0gKiBiYWNrIHRvIGJhY2sgb25lIGFmdGVyIHRoZSBvdGhlciBhcyB0aGUgcHJldmlvdXMgaXRlbSBjb21wbGV0ZXMuICBJZGVhbGx5IHRoZXJlIHNob3VsZAotICogYmUgbm8gYXVkaWJsZSBwYXVzZSBiZXR3ZWVuIGl0ZW1zIGZvciBzdGFuZGFyZCBhdWRpbyBjb250ZW50IHR5cGVzLgotICogPC9wPjxwPgotICogSWYgdGhlIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IGFjdGlvbiBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoZSByb3V0ZSwgdGhlbiB0aGUgcXVldWUKLSAqIGVmZmVjdGl2ZWx5IGNvbnRhaW5zIGF0IG1vc3Qgb25lIGl0ZW0gYXQgYSB0aW1lLiAgRWFjaCBwbGF5IGFjdGlvbiBoYXMgdGhlIGVmZmVjdCBvZgotICogY2xlYXJpbmcgdGhlIHF1ZXVlIGFuZCByZXNldHRpbmcgaXRzIHN0YXRlIGJlZm9yZSB0aGUgbmV4dCBpdGVtIGlzIHBsYXllZC4KLSAqIDwvcD4KLSAqCi0gKiA8aDQ+SW1wYWN0IG9mIHBhdXNlLCByZXN1bWUsIHN0b3AgYW5kIHBsYXkgYWN0aW9ucyBvbiB0aGUgcGxheWJhY2sgcXVldWU8L2g0PgotICogPHA+Ci0gKiBUaGUgcGF1c2UsIHJlc3VtZSBhbmQgc3RvcCBhY3Rpb25zIGFmZmVjdCB0aGUgc2Vzc2lvbidzIHdob2xlIHF1ZXVlLiAgUGF1c2UgY2F1c2VzCi0gKiB0aGUgcGxheWJhY2sgcXVldWUgdG8gYmUgc3VzcGVuZGVkIG5vIG1hdHRlciB3aGljaCBpdGVtIGlzIGN1cnJlbnRseSBwbGF5aW5nLgotICogUmVzdW1lIHJldmVyc2VzIHRoZSBlZmZlY3RzIG9mIHBhdXNlLiAgU3RvcCBjbGVhcnMgdGhlIHF1ZXVlIGFuZCBhbHNvIHJlc2V0cwotICogdGhlIHBhdXNlIGZsYWcganVzdCBsaWtlIHJlc3VtZS4KLSAqIDwvcD48cD4KLSAqIEFzIGRlc2NyaWJlZCBlYXJsaWVyLCB0aGUgcGxheSBhY3Rpb24gaGFzIHRoZSBlZmZlY3Qgb2YgY2xlYXJpbmcgdGhlIHF1ZXVlCi0gKiBhbmQgY29tcGxldGVseSByZXNldHRpbmcgaXRzIHN0YXRlIChsaWtlIHRoZSBzdG9wIGFjdGlvbikgdGhlbiBlbnF1ZXVpbmcgYQotICogbmV3IG1lZGlhIGl0ZW0gdG8gYmUgcGxheWVkIGltbWVkaWF0ZWx5LiAgUGxheSBpcyB0aGVyZWZvcmUgZXF1aXZhbGVudAotICogdG8gc3RvcCBmb2xsb3dlZCBieSBhbiBhY3Rpb24gdG8gZW5xdWV1ZSBhbiBpdGVtLgotICogPC9wPjxwPgotICogVGhlIHBsYXkgYWN0aW9uIGlzIGFsc28gc3BlY2lhbCBpbiB0aGF0IGl0IGNhbiBiZSB1c2VkIHRvIGNyZWF0ZSBuZXcgc2Vzc2lvbnMuCi0gKiBBbiBhcHBsaWNhdGlvbiB3aXRoIHNpbXBsZSBuZWVkcyBtYXkgZmluZCB0aGF0IGl0IG9ubHkgbmVlZHMgdG8gdXNlIHBsYXkKLSAqIChhbmQgb2NjYXNpb25hbGx5IHN0b3ApIHRvIGNvbnRyb2wgcGxheWJhY2suCi0gKiA8L3A+Ci0gKgotICogPGg0PlJlc29sdmluZyBjb25mbGljdHMgYmV0d2VlbiBhcHBsaWNhdGlvbnM8L2g0PgotICogPHA+Ci0gKiBXaGVuIGFuIGFwcGxpY2F0aW9uIGhhcyBhIHZhbGlkIHNlc3Npb24sIGl0IGlzIGVzc2VudGlhbGx5IGluIGNvbnRyb2wgb2YgcmVtb3RlIHBsYXliYWNrCi0gKiBvbiB0aGUgcm91dGUuICBObyBvdGhlciBhcHBsaWNhdGlvbiBjYW4gdmlldyBvciBtb2RpZnkgdGhlIHJlbW90ZSBwbGF5YmFjayBzdGF0ZQotICogb2YgdGhhdCBhcHBsaWNhdGlvbidzIHNlc3Npb24gd2l0aG91dCBrbm93aW5nIGl0cyBpZC4KLSAqIDwvcD48cD4KLSAqIEhvd2V2ZXIsIG90aGVyIGFwcGxpY2F0aW9ucyBjYW4gcGVyZm9ybSBhY3Rpb25zIHRoYXQgaGF2ZSB0aGUgZWZmZWN0IG9mIHN0b3BwaW5nCi0gKiBwbGF5YmFjayBhbmQgaW52YWxpZGF0aW5nIHRoZSBjdXJyZW50IHNlc3Npb24uICBXaGVuIHRoaXMgb2NjdXJzLCB0aGUgZm9ybWVyIGFwcGxpY2F0aW9uCi0gKiB3aWxsIGJlIGluZm9ybWVkIHRoYXQgaXQgaGFzIGxvc3QgY29udHJvbCBieSB3YXkgb2YgaW5kaXZpZHVhbCBtZWRpYSBpdGVtIHN0YXR1cwotICogdXBkYXRlIGJyb2FkY2FzdHMgdGhhdCBpbmRpY2F0ZSB0aGF0IGl0cyBxdWV1ZWQgbWVkaWEgaXRlbXMgaGF2ZSBiZWNvbWUKLSAqIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQgaW52YWxpZGF0ZWR9LiAgVGhpcyBicm9hZGNhc3QKLSAqIGltcGxpZXMgdGhhdCBwbGF5YmFjayB3YXMgdGVybWluYXRlZCBhYm5vcm1hbGx5IGJ5IGFuIGV4dGVybmFsIGNhdXNlLgotICogPC9wPjxwPgotICogQXBwbGljYXRpb25zIHNob3VsZCBoYW5kbGUgY29uZmxpY3RzIGNvbnNlcnZhdGl2ZWx5IHRvIGFsbG93IG90aGVyIGFwcGxpY2F0aW9ucyB0bwotICogc21vb3RobHkgYXNzdW1lIGNvbnRyb2wgb3ZlciB0aGUgcm91dGUuICBXaGVuIGEgY29uZmxpY3Qgb2NjdXJzLCB0aGUgY3VycmVudGx5IHBsYXlpbmcKLSAqIGFwcGxpY2F0aW9uIHNob3VsZCByZWxlYXNlIGl0cyBzZXNzaW9uIGFuZCBhbGxvdyB0aGUgbmV3IGFwcGxpY2F0aW9uIHRvIHVzZSB0aGUKLSAqIHJvdXRlIHVudGlsIHN1Y2ggdGltZSBhcyB0aGUgdXNlciBpbnRlcnZlbmVzIHRvIHRha2Ugb3ZlciB0aGUgcm91dGUgYWdhaW4gYW5kIGJlZ2luCi0gKiBhIG5ldyBwbGF5YmFjayBzZXNzaW9uLgotICogPC9wPgotICoKLSAqIDxoND5CYXNpYyBhY3Rpb25zPC9oND4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBiYXNpYyBhY3Rpb25zIG11c3QgYmUgc3VwcG9ydGVkIChhbGwgb3Igbm90aGluZykgYnkgYWxsIHJlbW90ZQotICogcGxheWJhY2sgcm91dGVzLiAgVGhlc2UgYWN0aW9ucyBmb3JtIHRoZSBiYXNpcyBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sCi0gKiBhbmQgYXJlIHJlcXVpcmVkIGluIGFsbCBpbXBsZW1lbnRhdGlvbnMuCi0gKiA8L3A+PHVsPgotICogPGxpPntAbGluayAjQUNUSU9OX1BMQVkgUGxheX06IFN0YXJ0cyBwbGF5aW5nIGNvbnRlbnQgc3BlY2lmaWVkIGJ5IGEgZ2l2ZW4gVXJpCi0gKiBhbmQgcmV0dXJucyBhIG5ldyBtZWRpYSBpdGVtIGlkIHRvIGRlc2NyaWJlIHRoZSByZXF1ZXN0LiAgSW1wbGljaXRseSBjcmVhdGVzIGEgbmV3Ci0gKiBzZXNzaW9uIGlmIG5vIHNlc3Npb24gaWQgd2FzIHNwZWNpZmllZCBhcyBhIHBhcmFtZXRlci4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9TRUVLIFNlZWt9OiBTZXRzIHRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIG9mIGEgc3BlY2lmaWMgbWVkaWEgaXRlbS4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9HRVRfU1RBVFVTIEdldCBzdGF0dXN9OiBHZXRzIHRoZSBzdGF0dXMgb2YgYSBtZWRpYSBpdGVtCi0gKiBpbmNsdWRpbmcgdGhlIGl0ZW0ncyBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIGFuZCBwcm9ncmVzcy4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9QQVVTRSBQYXVzZX06IFBhdXNlcyBwbGF5YmFjayBvZiB0aGUgcXVldWUuCi0gKiA8bGk+e0BsaW5rICNBQ1RJT05fUkVTVU1FIFJlc3VtZX06IFJlc3VtZXMgcGxheWJhY2sgb2YgdGhlIHF1ZXVlLgotICogPGxpPntAbGluayAjQUNUSU9OX1NUT1AgU3RvcH06IFN0b3BzIHBsYXliYWNrLCBjbGVhcnMgdGhlIHF1ZXVlLCBhbmQgcmVzZXRzIHRoZQotICogcGF1c2Ugc3RhdGUuCi0gKiA8L3VsPgotICoKLSAqIDxoND5RdWV1ZSBhY3Rpb25zPC9oND4KLSAqIDxwPgotICogVGhlIGZvbGxvd2luZyBxdWV1ZSBhY3Rpb25zIG11c3QgYmUgc3VwcG9ydGVkIChhbGwgb3Igbm90aGluZykgYnkgcmVtb3RlCi0gKiBwbGF5YmFjayByb3V0ZXMgdGhhdCBvZmZlciBvcHRpb25hbCBxdWV1aW5nIGNhcGFiaWxpdGllcy4KLSAqIDwvcD48dWw+Ci0gKiA8bGk+e0BsaW5rICNBQ1RJT05fRU5RVUVVRSBFbnF1ZXVlfTogRW5xdWV1ZXMgY29udGVudCBzcGVjaWZpZWQgYnkgYSBnaXZlbiBVcmkKLSAqIGFuZCByZXR1cm5zIGEgbmV3IG1lZGlhIGl0ZW0gaWQgdG8gZGVzY3JpYmUgdGhlIHJlcXVlc3QuICBJbXBsaWNpdGx5IGNyZWF0ZXMgYSBuZXcKLSAqIHNlc3Npb24gaWYgbm8gc2Vzc2lvbiBpZCB3YXMgc3BlY2lmaWVkIGFzIGEgcGFyYW1ldGVyLgotICogPGxpPntAbGluayAjQUNUSU9OX1JFTU9WRSBSZW1vdmV9OiBSZW1vdmVzIGEgc3BlY2lmaWVkIG1lZGlhIGl0ZW0gZnJvbSB0aGUgcXVldWUuCi0gKiA8L3VsPgotICoKLSAqIDxoND5TZXNzaW9uIGFjdGlvbnM8L2g0PgotICogPHA+Ci0gKiBUaGUgZm9sbG93aW5nIHNlc3Npb24gYWN0aW9ucyBtdXN0IGJlIHN1cHBvcnRlZCAoYWxsIG9yIG5vdGhpbmcpIGJ5IHJlbW90ZQotICogcGxheWJhY2sgcm91dGVzIHRoYXQgb2ZmZXIgb3B0aW9uYWwgc2Vzc2lvbiBtYW5hZ2VtZW50IGNhcGFiaWxpdGllcy4KLSAqIDwvcD48dWw+Ci0gKiA8bGk+e0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTiBTdGFydCBzZXNzaW9ufTogU3RhcnRzIGEgbmV3IHNlc3Npb24gZXhwbGljaXRseS4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMgR2V0IHNlc3Npb24gc3RhdHVzfTogR2V0cyB0aGUgc3RhdHVzIG9mIGEgc2Vzc2lvbi4KLSAqIDxsaT57QGxpbmsgI0FDVElPTl9FTkRfU0VTU0lPTiBFbmQgc2Vzc2lvbn06IEVuZHMgYSBzZXNzaW9uIGV4cGxpY2l0bHkuCi0gKiA8L3VsPgotICoKLSAqIDxoND5JbXBsZW1lbnRhdGlvbiBub3RlPC9oND4KLSAqIDxwPgotICogSW1wbGVtZW50YXRpb25zIG9mIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wgbXVzdCBpbXBsZW1lbnQgPGVtPmFsbDwvZW0+IG9mIHRoZQotICogZG9jdW1lbnRlZCBhY3Rpb25zLCBwYXJhbWV0ZXJzIGFuZCByZXN1bHRzLiAgTm90ZSB0aGF0IHRoZSBkb2N1bWVudGF0aW9uIGlzIHdyaXR0ZW4gZnJvbQotICogdGhlIHBlcnNwZWN0aXZlIG9mIGEgY2xpZW50IG9mIHRoZSBwcm90b2NvbC4gIEluIHBhcnRpY3VsYXIsIHdoZW5ldmVyIGEgcGFyYW1ldGVyCi0gKiBpcyBkZXNjcmliZWQgYXMgYmVpbmcgIm9wdGlvbmFsIiwgaXQgaXMgb25seSBmcm9tIHRoZSBwZXJzcGVjdGl2ZSBvZiB0aGUgY2xpZW50LgotICogQ29tcGxpYW50IG1lZGlhIHJvdXRlIHByb3ZpZGVyIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIHByb3RvY29sIG11c3Qgc3VwcG9ydCBhbGwKLSAqIG9mIHRoZSBmZWF0dXJlcyBkZXNjcmliZWQgaGVyZWluLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFDb250cm9sSW50ZW50IHsKLSAgICAvKiBSb3V0ZSBjYXRlZ29yaWVzLiAqLwotCi0gICAgLyoqCi0gICAgICogTWVkaWEgY29udHJvbCBjYXRlZ29yeTogTGl2ZSBhdWRpby4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHJvdXRlIHRoYXQgc3VwcG9ydHMgbGl2ZSBhdWRpbyByb3V0aW5nIHdpbGwgYWxsb3cgdGhlIG1lZGlhIGF1ZGlvIHN0cmVhbQotICAgICAqIHRvIGJlIHNlbnQgdG8gc3VwcG9ydGVkIGRlc3RpbmF0aW9ucy4gIFRoaXMgY2FuIGluY2x1ZGUgaW50ZXJuYWwgc3BlYWtlcnMgb3IKLSAgICAgKiBhdWRpbyBqYWNrcyBvbiB0aGUgZGV2aWNlIGl0c2VsZiwgQTJEUCBkZXZpY2VzLCBhbmQgbW9yZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogV2hlbiBhIGxpdmUgYXVkaW8gcm91dGUgaXMgc2VsZWN0ZWQsIGF1ZGlvIHJvdXRpbmcgaXMgdHJhbnNwYXJlbnQgdG8gdGhlIGFwcGxpY2F0aW9uLgotICAgICAqIEFsbCBhdWRpbyBwbGF5ZWQgb24gdGhlIG1lZGlhIHN0cmVhbSB3aWxsIGJlIHJvdXRlZCB0byB0aGUgc2VsZWN0ZWQgZGVzdGluYXRpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlZmVyIHRvIHRoZSBjbGFzcyBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzIGFib3V0IGxpdmUgYXVkaW8gcm91dGVzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDQVRFR09SWV9MSVZFX0FVRElPID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmNhdGVnb3J5LkxJVkVfQVVESU8iOwotCi0gICAgLyoqCi0gICAgICogTWVkaWEgY29udHJvbCBjYXRlZ29yeTogTGl2ZSB2aWRlby4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHJvdXRlIHRoYXQgc3VwcG9ydHMgbGl2ZSB2aWRlbyByb3V0aW5nIHdpbGwgYWxsb3cgYSBtaXJyb3JlZCB2ZXJzaW9uCi0gICAgICogb2YgdGhlIGRldmljZSdzIHByaW1hcnkgZGlzcGxheSBvciBhIGN1c3RvbWl6ZWQKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uIFByZXNlbnRhdGlvbn0gdG8gYmUgc2VudCB0byBzdXBwb3J0ZWQKLSAgICAgKiBkZXN0aW5hdGlvbnMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW4gYSBsaXZlIHZpZGVvIHJvdXRlIGlzIHNlbGVjdGVkLCBhdWRpbyBhbmQgdmlkZW8gcm91dGluZyBpcyB0cmFuc3BhcmVudAotICAgICAqIHRvIHRoZSBhcHBsaWNhdGlvbi4gIEJ5IGRlZmF1bHQsIGF1ZGlvIGFuZCB2aWRlbyBpcyByb3V0ZWQgdG8gdGhlIHNlbGVjdGVkCi0gICAgICogZGVzdGluYXRpb24uICBGb3IgY2VydGFpbiBsaXZlIHZpZGVvIHJvdXRlcywgdGhlIGFwcGxpY2F0aW9uIG1heSBhbHNvIHVzZSBhCi0gICAgICoge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbiBQcmVzZW50YXRpb259IHRvIHJlcGxhY2UgdGhlIG1pcnJvcmVkIHZpZXcKLSAgICAgKiBvbiB0aGUgZXh0ZXJuYWwgZGlzcGxheSB3aXRoIGRpZmZlcmVudCBjb250ZW50LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB0aGUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBhYm91dCBsaXZlIHZpZGVvIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNnZXRQcmVzZW50YXRpb25EaXNwbGF5KCkKLSAgICAgKiBAc2VlIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX0xJVkVfVklERU8gPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuY2F0ZWdvcnkuTElWRV9WSURFTyI7Ci0KLSAgICAvKioKLSAgICAgKiBNZWRpYSBjb250cm9sIGNhdGVnb3J5OiBSZW1vdGUgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogQSByb3V0ZSB0aGF0IHN1cHBvcnRzIHJlbW90ZSBwbGF5YmFjayByb3V0aW5nIHdpbGwgYWxsb3cgYW4gYXBwbGljYXRpb24gdG8gc2VuZAotICAgICAqIHJlcXVlc3RzIHRvIHBsYXkgY29udGVudCByZW1vdGVseSB0byBzdXBwb3J0ZWQgZGVzdGluYXRpb25zLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgcm91dGVzIGRlc3RpbmF0aW9ucyBvcGVyYXRlIGluZGVwZW5kZW50bHkgb2YgdGhlIGxvY2FsIGRldmljZS4KLSAgICAgKiBXaGVuIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIGlzIHNlbGVjdGVkLCB0aGUgYXBwbGljYXRpb24gY2FuIGNvbnRyb2wgdGhlIGNvbnRlbnQKLSAgICAgKiBwbGF5aW5nIG9uIHRoZSBkZXN0aW5hdGlvbiBieSBzZW5kaW5nIG1lZGlhIGNvbnRyb2wgYWN0aW9ucyB0byB0aGUgcm91dGUuCi0gICAgICogVGhlIGFwcGxpY2F0aW9uIG1heSBhbHNvIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMgZnJvbSB0aGUgcm91dGUgcmVnYXJkaW5nCi0gICAgICogcmVtb3RlIHBsYXliYWNrLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBSZWZlciB0byB0aGUgY2xhc3MgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyBhYm91dCByZW1vdGUgcGxheWJhY2sgcm91dGVzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuY2F0ZWdvcnkuUkVNT1RFX1BMQVlCQUNLIjsKLQotICAgIC8qIFJlbW90ZSBwbGF5YmFjayBhY3Rpb25zIHRoYXQgYWZmZWN0IGluZGl2aWR1YWwgaXRlbXMuICovCi0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFBsYXkgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHN0YXJ0IHBsYXlpbmcgY29udGVudCB3aXRoCi0gICAgICogdGhlIHtAbGluayBVcml9IHNwZWNpZmllZCBpbiB0aGUge0BsaW5rIEludGVudH0ncyB7QGxpbmsgSW50ZW50I2dldERhdGEoKSBkYXRhIHVyaX0uCi0gICAgICogVGhlIGFjdGlvbiByZXR1cm5zIGEgbWVkaWEgc2Vzc2lvbiBpZCBhbmQgbWVkaWEgaXRlbSBpZCB3aGljaCBjYW4gYmUgdXNlZAotICAgICAqIHRvIGNvbnRyb2wgcGxheWJhY2sgdXNpbmcgb3RoZXIgcmVtb3RlIHBsYXliYWNrIGFjdGlvbnMuCi0gICAgICogPC9wPjxwPgotICAgICAqIE9uY2UgaW5pdGlhdGVkLCBwbGF5YmFjayBvZiB0aGUgc3BlY2lmaWVkIGNvbnRlbnQgd2lsbCBiZSBtYW5hZ2VkIGluZGVwZW5kZW50bHkKLSAgICAgKiBieSB0aGUgZGVzdGluYXRpb24uICBUaGUgYXBwbGljYXRpb24gd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIGFzIHRoZSBzdGF0ZQotICAgICAqIG9mIHRoZSBtZWRpYSBpdGVtIGNoYW5nZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHRoZSBkYXRhIHVyaSBzcGVjaWZpZXMgYW4gSFRUUCBvciBIVFRQUyBzY2hlbWUsIHRoZW4gdGhlIGRlc3RpbmF0aW9uIGlzCi0gICAgICogcmVzcG9uc2libGUgZm9yIGZvbGxvd2luZyBIVFRQIHJlZGlyZWN0cyB0byBhIHJlYXNvbmFibGUgZGVwdGggb2YgYXQgbGVhc3QgMwotICAgICAqIGxldmVscyBhcyBtaWdodCB0eXBpY2FsbHkgYmUgaGFuZGxlZCBieSBhIHdlYiBicm93c2VyLiAgSWYgYW4gSFRUUCBlcnJvcgotICAgICAqIG9jY3VycywgdGhlbiB0aGUgZGVzdGluYXRpb24gc2hvdWxkIHNlbmQgYSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzIHN0YXR1cyB1cGRhdGV9Ci0gICAgICogYmFjayB0byB0aGUgY2xpZW50IGluZGljYXRpbmcgdGhlIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMjUExBWUJBQ0tfU1RBVEVfRVJST1IgZXJyb3J9Ci0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNnZXRQbGF5YmFja1N0YXRlKCkgcGxheWJhY2sgc3RhdGV9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5PbmUgaXRlbSBhdCBhIHRpbWU8L2gzPgotICAgICAqIDxwPgotICAgICAqIEVhY2ggc3VjY2Vzc2Z1bCBwbGF5IGFjdGlvbiA8ZW0+cmVwbGFjZXM8L2VtPiB0aGUgcHJldmlvdXMgcGxheSBhY3Rpb24uCi0gICAgICogSWYgYW4gaXRlbSBpcyBhbHJlYWR5IHBsYXlpbmcsIHRoZW4gaXQgaXMgY2FuY2VsZWQsIHRoZSBzZXNzaW9uJ3MgcGxheWJhY2sgcXVldWUKLSAgICAgKiBpcyBjbGVhcmVkIGFuZCB0aGUgbmV3IGl0ZW0gYmVnaW5zIHBsYXlpbmcgaW1tZWRpYXRlbHkgKHJlZ2FyZGxlc3Mgb2YKLSAgICAgKiB3aGV0aGVyIHRoZSBwcmV2aW91c2x5IHBsYXlpbmcgaXRlbSBoYWQgYmVlbiBwYXVzZWQpLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGF5IGlzIHRoZXJlZm9yZSBlcXVpdmFsZW50IHRvIHtAbGluayAjQUNUSU9OX1NUT1Agc3RvcH0gZm9sbG93ZWQgYnkgYW4gYWN0aW9uCi0gICAgICogdG8gZW5xdWV1ZSBhIG5ldyBtZWRpYSBpdGVtIHRvIGJlIHBsYXllZCBpbW1lZGlhdGVseS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+U2Vzc2lvbnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgcmVxdWVzdCBoYXMgdGhlIGVmZmVjdCBvZiBpbXBsaWNpdGx5IGNyZWF0aW5nIGEgbWVkaWEgc2Vzc2lvbiB3aGVuZXZlciB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbiBkb2VzIG5vdCBzcGVjaWZ5IHRoZSB7QGxpbmsgI0VYVFJBX1NFU1NJT05fSUQgc2Vzc2lvbiBpZH0gcGFyYW1ldGVyLgotICAgICAqIEJlY2F1c2UgdGhlcmUgY2FuIG9ubHkgYmUgYXQgbW9zdCBvbmUgdmFsaWQgc2Vzc2lvbiBhdCBhIHRpbWUsIGNyZWF0aW5nIGEgbmV3IHNlc3Npb24KLSAgICAgKiBoYXMgdGhlIHNpZGUtZWZmZWN0IG9mIGludmFsaWRhdGluZyBhbnkgZXhpc3Rpbmcgc2Vzc2lvbnMgYW5kIHRoZWlyIG1lZGlhIGl0ZW1zLAotICAgICAqIHRoZW4gaGFuZGxpbmcgdGhlIHBsYXliYWNrIHJlcXVlc3Qgd2l0aCBhIG5ldyBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiB0aGUgYXBwbGljYXRpb24gc3BlY2lmaWVzIGFuIGludmFsaWQgc2Vzc2lvbiBpZCwgdGhlbiBhbiBlcnJvciBpcyByZXR1cm5lZC4KLSAgICAgKiBXaGVuIHRoaXMgaGFwcGVucywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBhc3N1bWUgdGhhdCBpdHMgc2Vzc2lvbgotICAgICAqIGlzIG5vIGxvbmdlciB2YWxpZC4gIFRvIG9idGFpbiBhIG5ldyBzZXNzaW9uLCB0aGUgYXBwbGljYXRpb24gbWF5IHRyeSBhZ2FpbgotICAgICAqIGFuZCBvbWl0IHRoZSBzZXNzaW9uIGlkIHBhcmFtZXRlci4gIEhvd2V2ZXIsIHRoZSBhcHBsaWNhdGlvbiBzaG91bGQKLSAgICAgKiBvbmx5IHJldHJ5IHJlcXVlc3RzIGR1ZSB0byBhbiBleHBsaWNpdCBhY3Rpb24gcGVyZm9ybWVkIGJ5IHRoZSB1c2VyLAotICAgICAqIHN1Y2ggYXMgdGhlIHVzZXIgY2xpY2tpbmcgb24gYSAicGxheSIgYnV0dG9uIGluIHRoZSBVSSwgc2luY2UgYW5vdGhlcgotICAgICAqIGFwcGxpY2F0aW9uIG1heSBiZSB0cnlpbmcgdG8gdGFrZSBjb250cm9sIG9mIHRoZSByb3V0ZSBhbmQgdGhlIGZvcm1lcgotICAgICAqIGFwcGxpY2F0aW9uIHNob3VsZCB0cnkgdG8gc3RheSBvdXQgb2YgaXRzIHdheS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gc2Vzc2lvbnMsIHF1ZXVlcyBhbmQgbWVkaWEgaXRlbXMsIHBsZWFzZSByZWZlciB0byB0aGUKLSAgICAgKiBjbGFzcyBkb2N1bWVudGF0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlCi0gICAgICogc2Vzc2lvbiB0byB3aGljaCB0aGUgcGxheWJhY2sgcmVxdWVzdCBiZWxvbmdzLiAgSWYgb21pdHRlZCwgYSBuZXcgc2Vzc2lvbgotICAgICAqIGlzIGNyZWF0ZWQgaW1wbGljaXRseS4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0NPTlRFTlRfUE9TSVRJT059IDxlbT4ob3B0aW9uYWwpPC9lbT46IFNwZWNpZmllcyB0aGUgaW5pdGlhbAotICAgICAqIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gYXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyBmcm9tCi0gICAgICogdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX01FVEFEQVRBfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgbWV0YWRhdGEgYXNzb2NpYXRlZAotICAgICAqIHdpdGggdGhlIGNvbnRlbnQgc3VjaCBhcyB0aGUgdGl0bGUgb2YgYSBzb25nLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUn0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIGEKLSAgICAgKiB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEgYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzCi0gICAgICogYWJvdXQgdGhlIG1lZGlhIGl0ZW0uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlCi0gICAgICogc2Vzc2lvbiB0aGF0IHdhcyBhZmZlY3RlZCBieSB0aGUgcmVxdWVzdC4gIFRoaXMgd2lsbCBiZSBhIG5ldyBzZXNzaW9uIGluCi0gICAgICogdGhlIGNhc2Ugd2hlcmUgbm8gc2Vzc2lvbiBpZCB3YXMgc3VwcGxpZWQgYXMgYSBwYXJhbWV0ZXIuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9JRH0gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyBhbiBvcGFxdWUgc3RyaW5nIGlkZW50aWZpZXIKLSAgICAgKiB0byB1c2UgdG8gcmVmZXIgdG8gdGhlIG1lZGlhIGl0ZW0gaW4gc3Vic2VxdWVudCByZXF1ZXN0cyBzdWNoIGFzCi0gICAgICoge0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVU30uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGluaXRpYWwgc3RhdHVzIG9mCi0gICAgICogdGhlIG5ldyBtZWRpYSBpdGVtLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+U3RhdHVzIHVwZGF0ZXM8L2gzPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjbGllbnQgc3VwcGxpZXMgYW4KLSAgICAgKiB7QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiBpdGVtIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJ9Ci0gICAgICogdGhlbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgc3RhdHVzIHVwZGF0ZXMgdG8gdGhlIHJlY2VpdmVyCi0gICAgICogd2hlbiBzaWduaWZpY2FudCBtZWRpYSBpdGVtIHN0YXRlIGNoYW5nZXMgb2NjdXIgc3VjaCBhcyB3aGVuIHBsYXliYWNrIHN0YXJ0cyBvcgotICAgICAqIHN0b3BzLiAgVGhlIHJlY2VpdmVyIHdpbGwgbm90IGJlIGludm9rZWQgZm9yIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gY2hhbmdlcy4KLSAgICAgKiBUaGUgYXBwbGljYXRpb24gbWF5IHJldHJpZXZlIHRoZSBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uIHdoZW4gbmVjZXNzYXJ5Ci0gICAgICogdXNpbmcgdGhlIHtAbGluayAjQUNUSU9OX0dFVF9TVEFUVVN9IHJlcXVlc3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlZmVyIHRvIHtAbGluayBNZWRpYUl0ZW1TdGF0dXN9IGZvciBkZXRhaWxzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgYSBzZXNzaW9uIGlkIHdhcyBwcm92aWRlZCBidXQgaXMgdW5rbm93biBvcgotICAgICAqIG5vIGxvbmdlciB2YWxpZCwgaWYgdGhlIGl0ZW0gVXJpIG9yIGNvbnRlbnQgdHlwZSBpcyBub3Qgc3VwcG9ydGVkLCBvciBpZgotICAgICAqIGFueSBvdGhlciBhcmd1bWVudHMgYXJlIGludmFsaWQuCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkV4YW1wbGU8L2gzPgotICAgICAqIDxwcmU+Ci0gICAgICogTWVkaWFSb3V0ZXIgbWVkaWFSb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAgICAgKiBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtZWRpYVJvdXRlci5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgICogSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKTsKLSAgICAgKiBpbnRlbnQuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyk7Ci0gICAgICogaW50ZW50LnNldERhdGFBbmRUeXBlKCJodHRwOi8vZXhhbXBsZS5jb20vdmlkZW9zL21vdmllLm1wNCIsICJ2aWRlby9tcDQiKTsKLSAgICAgKiBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sUmVxdWVzdChpbnRlbnQpKSB7Ci0gICAgICogICAgIE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjaygpIHsKLSAgICAgKiAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7Ci0gICAgICogICAgICAgICAgICAgLy8gVGhlIHJlcXVlc3Qgc3VjY2VlZGVkLgotICAgICAqICAgICAgICAgICAgIC8vIFBsYXliYWNrIG1heSBiZSBjb250cm9sbGVkIHVzaW5nIHRoZSByZXR1cm5lZCBzZXNzaW9uIGFuZCBpdGVtIGlkLgotICAgICAqICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWQgPSBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCk7Ci0gICAgICogICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCA9IGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0lEKTsKLSAgICAgKiAgICAgICAgICAgICBNZWRpYUl0ZW1TdGF0dXMgc3RhdHVzID0gTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGUoZGF0YS5nZXRCdW5kbGUoCi0gICAgICogICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9TVEFUVVMpKTsKLSAgICAgKiAgICAgICAgICAgICAvLyAuLi4KLSAgICAgKiAgICAgICAgIH0KLSAgICAgKgotICAgICAqICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgbWVzc2FnZSwgQnVuZGxlIGRhdGEpIHsKLSAgICAgKiAgICAgICAgICAgICAvLyBBbiBlcnJvciBvY2N1cnJlZCEKLSAgICAgKiAgICAgICAgIH0KLSAgICAgKiAgICAgfTsKLSAgICAgKiAgICAgcm91dGUuc2VuZENvbnRyb2xSZXF1ZXN0KGludGVudCwgY2FsbGJhY2spOwotICAgICAqIH08L3ByZT4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TVEFUVVMKLSAgICAgKiBAc2VlICNBQ1RJT05fUEFVU0UKLSAgICAgKiBAc2VlICNBQ1RJT05fUkVTVU1FCi0gICAgICogQHNlZSAjQUNUSU9OX1NUT1AKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fUExBWSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uUExBWSI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IEVucXVldWUgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gd29ya3MganVzdCBsaWtlIHtAbGluayAjQUNUSU9OX1BMQVkgcGxheX0gZXhjZXB0IHRoYXQgaXQgZG9lcwotICAgICAqIG5vdCBjbGVhciB0aGUgcXVldWUgb3IgcmVzZXQgdGhlIHBhdXNlIHN0YXRlIHdoZW4gaXQgZW5xdWV1ZXMgdGhlCi0gICAgICogbmV3IG1lZGlhIGl0ZW0gaW50byB0aGUgc2Vzc2lvbidzIHBsYXliYWNrIHF1ZXVlLiAgVGhpcyBhY3Rpb24gb25seQotICAgICAqIGVucXVldWVzIGEgbWVkaWEgaXRlbSB3aXRoIG5vIG90aGVyIHNpZGUtZWZmZWN0cyBvbiB0aGUgcXVldWUuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHRoZSBxdWV1ZSBpcyBjdXJyZW50bHkgZW1wdHkgYW5kIHRoZW4gdGhlIGl0ZW0gd2lsbCBwbGF5IGltbWVkaWF0ZWx5Ci0gICAgICogKGFzc3VtaW5nIHRoZSBxdWV1ZSBpcyBub3QgcGF1c2VkKS4gIE90aGVyd2lzZSwgdGhlIGl0ZW0gd2lsbCBwbGF5Ci0gICAgICogYWZ0ZXIgYWxsIGVhcmxpZXIgaXRlbXMgaW4gdGhlIHF1ZXVlIGhhdmUgZmluaXNoZWQgb3IgYmVlbiByZW1vdmVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgZW5xdWV1ZSBhY3Rpb24gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIG5ldyBzZXNzaW9ucyBqdXN0IGxpa2UgcGxheS4KLSAgICAgKiBJdHMgcGFyYW1ldGVycyBhbmQgcmVzdWx0cyBhcmUgYWxzbyB0aGUgc2FtZS4gIE9ubHkgdGhlIHF1ZXVpbmcgYmVoYXZpb3IKLSAgICAgKiBpcyBkaWZmZXJlbnQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1BMQVkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fRU5RVUVVRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uRU5RVUVVRSI7Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFNlZWsgbWVkaWEgaXRlbSB0byBhIG5ldyBwbGF5YmFjayBwb3NpdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIG1vZGlmeSB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbgotICAgICAqIG9mIHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gb25seSBhZmZlY3RzIHRoZSBwbGF5YmFjayBwb3NpdGlvbiBvZiB0aGUgbWVkaWEgaXRlbTsgbm90IGl0cyBwbGF5YmFjayBzdGF0ZS4KLSAgICAgKiBJZiB0aGUgcGxheWJhY2sgcXVldWUgaXMgcGF1c2VkLCB0aGVuIHNlZWtpbmcgc2V0cyB0aGUgcG9zaXRpb24gYnV0IHRoZSBpdGVtCi0gICAgICogcmVtYWlucyBwYXVzZWQuICBMaWtld2lzZSBpZiB0aGUgaXRlbSBpcyBwbGF5aW5nLCB0aGVuIHNlZWtpbmcgd2lsbCBjYXVzZSBwbGF5YmFjawotICAgICAqIHRvIGp1bXAgdG8gdGhlIG5ldyBwb3NpdGlvbiBhbmQgY29udGludWUgcGxheWluZyBmcm9tIHRoYXQgcG9pbnQuICBJZiB0aGUgaXRlbSBoYXMKLSAgICAgKiBub3QgeWV0IHN0YXJ0ZWQgcGxheWluZywgdGhlbiB0aGUgbmV3IHBsYXliYWNrIHBvc2l0aW9uIGlzIHJlbWVtYmVyZWQgYnkgdGhlCi0gICAgICogcXVldWUgYW5kIHVzZWQgYXMgdGhlIGl0ZW0ncyBpbml0aWFsIGNvbnRlbnQgcG9zaXRpb24gd2hlbiBwbGF5YmFjayBldmVudHVhbGx5IGJlZ2lucy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgc3VjY2Vzc2Z1bCwgdGhlIG1lZGlhIGl0ZW0ncyBwbGF5YmFjayBwb3NpdGlvbiBpcyBjaGFuZ2VkLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KLSAgICAgKiB0byB3aGljaCB0aGUgbWVkaWEgaXRlbSBiZWxvbmdzLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVkaWEgaXRlbSBpZCBvZgotICAgICAqIHRoZSBtZWRpYSBpdGVtIHRvIHNlZWsuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG5ldwotICAgICAqIGNvbnRlbnQgcG9zaXRpb24gZm9yIHBsYXliYWNrIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbQotICAgICAqIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbnRlbnQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBuZXcgc3RhdHVzIG9mCi0gICAgICogdGhlIG1lZGlhIGl0ZW0uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgb3IgbWVkaWEgaXRlbSBpZCBhcmUgdW5rbm93bgotICAgICAqIG9yIG5vIGxvbmdlciB2YWxpZCwgaWYgdGhlIGNvbnRlbnQgcG9zaXRpb24gaXMgaW52YWxpZCwgb3IgaWYgdGhlIG1lZGlhIGl0ZW0KLSAgICAgKiBpcyBpbiBhIHRlcm1pbmFsIHN0YXRlLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TRUVLID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5TRUVLIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogR2V0IG1lZGlhIGl0ZW0gcGxheWJhY2sgc3RhdHVzCi0gICAgICogYW5kIHByb2dyZXNzIGluZm9ybWF0aW9uLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHByb3ZpZGUgdXBkYXRlZCBwbGF5YmFjayBzdGF0dXMgYW5kIHByb2dyZXNzCi0gICAgICogaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNwZWNpZmllZCBtZWRpYSBpdGVtLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YgdGhlIHNlc3Npb24KLSAgICAgKiB0byB3aGljaCB0aGUgbWVkaWEgaXRlbSBiZWxvbmdzLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVkaWEgaXRlbSBpZCBvZgotICAgICAqIHRoZSBtZWRpYSBpdGVtIHRvIHF1ZXJ5LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgY3VycmVudCBzdGF0dXMgb2YKLSAgICAgKiB0aGUgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPkVycm9yczwvaDM+Ci0gICAgICogPHA+Ci0gICAgICogVGhpcyBhY3Rpb24gcmV0dXJucyBhbiBlcnJvciBpZiB0aGUgc2Vzc2lvbiBpZCBvciBtZWRpYSBpdGVtIGlkIGFyZSB1bmtub3duCi0gICAgICogb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0VYVFJBX0lURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9HRVRfU1RBVFVTID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5HRVRfU1RBVFVTIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogUmVtb3ZlIG1lZGlhIGl0ZW0gZnJvbSBzZXNzaW9uJ3MgcXVldWUuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHJvdXRlcyB0aGF0IHN1cHBvcnQge0BsaW5rICNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0sgcmVtb3RlIHBsYXliYWNrfQotICAgICAqIG1lZGlhIGNvbnRyb2wuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgYWN0aW9uIGFza3MgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gcmVtb3ZlIHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbQotICAgICAqIGZyb20gdGhlIHNlc3Npb24ncyBwbGF5YmFjayBxdWV1ZS4gIElmIHRoZSBjdXJyZW50IGl0ZW0gaXMgcmVtb3ZlZCwgdGhlbgotICAgICAqIHBsYXliYWNrIHdpbGwgcHJvY2VlZCB0byB0aGUgbmV4dCBtZWRpYSBpdGVtIChhc3N1bWluZyB0aGUgcXVldWUgaGFzIG5vdCBiZWVuCi0gICAgICogcGF1c2VkKS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gZG9lcyBub3QgYWZmZWN0IHRoZSBwYXVzZSBzdGF0ZSBvZiB0aGUgcXVldWUuICBJZiB0aGUgcXVldWUgd2FzIHBhdXNlZAotICAgICAqIHRoZW4gaXQgcmVtYWlucyBwYXVzZWQgKGV2ZW4gaWYgaXQgaXMgbm93IGVtcHR5KSB1bnRpbCBhIHJlc3VtZSwgc3RvcCBvciBwbGF5Ci0gICAgICogYWN0aW9uIGlzIGlzc3VlZCB0aGF0IGNhdXNlcyB0aGUgcGF1c2Ugc3RhdGUgdG8gYmUgY2xlYXJlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggdGhlIG1lZGlhIGl0ZW0gYmVsb25ncy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lZGlhIGl0ZW0gaWQgb2YKLSAgICAgKiB0aGUgbWVkaWEgaXRlbSB0byByZW1vdmUuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX0lURU1fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBuZXcgc3RhdHVzIG9mCi0gICAgICogdGhlIG1lZGlhIGl0ZW0uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgb3IgbWVkaWEgaXRlbSBpZCBhcmUgdW5rbm93bgotICAgICAqIG9yIG5vIGxvbmdlciB2YWxpZCwgb3IgaWYgdGhlIG1lZGlhIGl0ZW0gaXMgaW4gYSB0ZXJtaW5hbCBzdGF0ZSAoYW5kIHRoZXJlZm9yZQotICAgICAqIG5vIGxvbmdlciBpbiB0aGUgcXVldWUpLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9SRU1PVkUgPSAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuYWN0aW9uLlJFTU9WRSI7Ci0KLSAgICAvKiBSZW1vdGUgcGxheWJhY2sgYWN0aW9ucyB0aGF0IGFmZmVjdCB0aGUgd2hvbGUgcGxheWJhY2sgcXVldWUuICovCi0KLSAgICAvKioKLSAgICAgKiBSZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBhY3Rpb246IFBhdXNlIG1lZGlhIHBsYXliYWNrLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgdGhlIHBsYXliYWNrIHF1ZXVlIG9mIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbiB0byBiZSBwYXVzZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUgc2Vzc2lvbgotICAgICAqIHdob3NlIHBsYXliYWNrIHF1ZXVlIGlzIHRvIGJlIHBhdXNlZC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgaXMgdW5rbm93biBvciBubyBsb25nZXIgdmFsaWQuCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICogQHNlZSAjQUNUSU9OX1JFU1VNRQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9QQVVTRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uUEFVU0UiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBSZXN1bWUgbWVkaWEgcGxheWJhY2sgKHVucGF1c2UpLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgdGhlIHBsYXliYWNrIHF1ZXVlIG9mIHRoZSBzcGVjaWZpZWQgc2Vzc2lvbiB0byBiZSByZXN1bWVkLgotICAgICAqIFJldmVyc2VzIHRoZSBlZmZlY3RzIG9mIHtAbGluayAjQUNUSU9OX1BBVVNFfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogd2hvc2UgcGxheWJhY2sgcXVldWUgaXMgdG8gYmUgcmVzdW1lZC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4ob3B0aW9uYWwsIG9sZCBpbXBsZW1lbnRhdGlvbnMgbWF5Ci0gICAgICogb21pdCB0aGlzIGtleSk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5FcnJvcnM8L2gzPgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYWN0aW9uIHJldHVybnMgYW4gZXJyb3IgaWYgdGhlIHNlc3Npb24gaWQgaXMgdW5rbm93biBvciBubyBsb25nZXIgdmFsaWQuCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICogQHNlZSAjQUNUSU9OX1BBVVNFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1JFU1VNRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uUkVTVU1FIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogU3RvcCBtZWRpYSBwbGF5YmFjayAoY2xlYXIgcXVldWUgYW5kIHVucGF1c2UpLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBjYXVzZXMgYSByZW1vdGUgcGxheWJhY2sgcm91dGUgdG8gc3RvcCBwbGF5YmFjaywgY2FuY2VsIGFuZCByZW1vdmUKLSAgICAgKiBhbGwgbWVkaWEgaXRlbXMgZnJvbSB0aGUgc2Vzc2lvbidzIG1lZGlhIGl0ZW0gcXVldWUgYW5kLCByZXNldCB0aGUgcXVldWUncwotICAgICAqIHBhdXNlIHN0YXRlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiBzdWNjZXNzZnVsLCB0aGUgc3RhdHVzIG9mIGFsbCBtZWRpYSBpdGVtcyBpbiB0aGUgcXVldWUgaXMgc2V0IHRvCi0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNQTEFZQkFDS19TVEFURV9DQU5DRUxFRCBjYW5jZWxlZH0gYW5kIGEgc3RhdHVzIHVwZGF0ZSBpcyBzZW50Ci0gICAgICogdG8gdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzIGluZGljYXRpbmcgdGhlIG5ldyBzdGF0dXMgb2YgZWFjaCBpdGVtLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5SZXF1ZXN0IHBhcmFtZXRlcnM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKLSAgICAgKiB0aGUgc2Vzc2lvbiB3aG9zZSBwbGF5YmFjayBxdWV1ZSBpcyB0byBiZSBzdG9wcGVkIChjbGVhcmVkIGFuZCB1bnBhdXNlZCkuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KG9wdGlvbmFsLCBvbGQgaW1wbGVtZW50YXRpb25zIG1heQotICAgICAqIG9taXQgdGhpcyBrZXkpPC9lbT46IFNwZWNpZmllcyB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVE9QID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5TVE9QIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogU3RhcnQgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIGludmFsaWRhdGUgdGhlIGN1cnJlbnQgc2Vzc2lvbgotICAgICAqIGFuZCBzdGFydCBhIG5ldyBzZXNzaW9uLiAgVGhlIG5ldyBzZXNzaW9uIGluaXRpYWxseSBoYXMgYW4gZW1wdHkgcXVldWUuCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHN1Y2Nlc3NmdWwsIHRoZSBzdGF0dXMgb2YgYWxsIG1lZGlhIGl0ZW1zIGluIHRoZSBwcmV2aW91cyBzZXNzaW9uJ3MgcXVldWUgaXMgc2V0IHRvCi0gICAgICoge0BsaW5rIE1lZGlhSXRlbVN0YXR1cyNQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRCBpbnZhbGlkYXRlZH0gYW5kIGEgc3RhdHVzIHVwZGF0ZQotICAgICAqIGlzIHNlbnQgdG8gdGhlIGFwcHJvcHJpYXRlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJzIGluZGljYXRpbmcgdGhlIG5ldyBzdGF0dXMKLSAgICAgKiBvZiBlYWNoIGl0ZW0uICBUaGUgcHJldmlvdXMgc2Vzc2lvbiBiZWNvbWVzIG5vIGxvbmdlciB2YWxpZCBhbmQgdGhlIG5ldyBzZXNzaW9uCi0gICAgICogdGFrZXMgY29udHJvbCBvZiB0aGUgcm91dGUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUn0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIGEKLSAgICAgKiB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEgYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzCi0gICAgICogYWJvdXQgdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfTUVTU0FHRV9SRUNFSVZFUn0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIGEKLSAgICAgKiB7QGxpbmsgUGVuZGluZ0ludGVudH0gZm9yIGEgYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIG1lc3NhZ2VzIGZyb20KLSAgICAgKiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihhbHdheXMgcmV0dXJuZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUKLSAgICAgKiBzZXNzaW9uIHRoYXQgd2FzIHN0YXJ0ZWQgYnkgdGhlIHJlcXVlc3QuICBUaGlzIHdpbGwgYWx3YXlzIGJlIGEgYnJhbmQgbmV3IHNlc3Npb24KLSAgICAgKiBkaXN0aW5jdCBmcm9tIGFueSBvdGhlciBwcmV2aW91c2x5IGNyZWF0ZWQgc2Vzc2lvbnMuCi0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlCi0gICAgICogc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+U3RhdHVzIHVwZGF0ZXM8L2gzPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjbGllbnQgc3VwcGxpZXMgYQotICAgICAqIHtAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXJ9Ci0gICAgICogdGhlbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgcmVzcG9uc2libGUgZm9yIHNlbmRpbmcgc3RhdHVzIHVwZGF0ZXMgdG8gdGhlIHJlY2VpdmVyCi0gICAgICogd2hlbiBzaWduaWZpY2FudCBtZWRpYSBzZXNzaW9uIHN0YXRlIGNoYW5nZXMgb2NjdXIgc3VjaCBhcyB3aGVuIHRoZSBzZXNzaW9uJ3MKLSAgICAgKiBxdWV1ZSBpcyBwYXVzZWQgb3IgcmVzdW1lZCBvciB3aGVuIHRoZSBzZXNzaW9uIGlzIHRlcm1pbmF0ZWQgb3IgaW52YWxpZGF0ZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFJlZmVyIHRvIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXN9IGZvciBkZXRhaWxzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5DdXN0b20gbWVzc2FnZXM8L2gzPgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSBjbGllbnQgc3VwcGxpZXMgYSB7QGxpbmsgI0VYVFJBX01FU1NBR0VfUkVDRUlWRVIgbWVzc2FnZSByZWNlaXZlcn0KLSAgICAgKiB0aGVuIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBpcyByZXNwb25zaWJsZSBmb3Igc2VuZGluZyBtZXNzYWdlcyB0byB0aGUgcmVjZWl2ZXIKLSAgICAgKiB3aGVuIHRoZSBzZXNzaW9uIGhhcyBhbnkgbWVzc2FnZXMgdG8gc2VuZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUmVmZXIgdG8ge0BsaW5rICNFWFRSQV9NRVNTQUdFfSBmb3IgZGV0YWlscy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGNvdWxkIG5vdCBiZSBjcmVhdGVkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9TVEFSVF9TRVNTSU9OID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5TVEFSVF9TRVNTSU9OIjsKLQotICAgIC8qKgotICAgICAqIFJlbW90ZSBwbGF5YmFjayBtZWRpYSBjb250cm9sIGFjdGlvbjogR2V0IG1lZGlhIHNlc3Npb24gc3RhdHVzIGluZm9ybWF0aW9uLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCByb3V0ZXMgdGhhdCBzdXBwb3J0IHtAbGluayAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLIHJlbW90ZSBwbGF5YmFja30KLSAgICAgKiBtZWRpYSBjb250cm9sLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIHByb3ZpZGUgdXBkYXRlZCBzdGF0dXMgaW5mb3JtYXRpb24KLSAgICAgKiBhYm91dCB0aGUgc3BlY2lmaWVkIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZiB0aGUKLSAgICAgKiBzZXNzaW9uIHdob3NlIHN0YXR1cyBpcyB0byBiZSByZXRyaWV2ZWQuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxoMz5SZXN1bHQgZGF0YTwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fU1RBVFVTfSA8ZW0+KGFsd2F5cyByZXR1cm5lZCk8L2VtPjogU3BlY2lmaWVzIHRoZQotICAgICAqIGN1cnJlbnQgc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIDwvcD48dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfRVJST1JfQ09ERX0gPGVtPihvcHRpb25hbCk8L2VtPjogU3BlY2lmaWVzIHRoZSBjYXVzZSBvZiB0aGUgZXJyb3IuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI3NlbmRDb250cm9sUmVxdWVzdAotICAgICAqIEBzZWUgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSwotICAgICAqIEBzZWUgI0VYVFJBX1NFU1NJT05fU1RBVFVTX1VQREFURV9SRUNFSVZFUgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5HRVRfU0VTU0lPTl9TVEFUVVMiOwotCi0gICAgLyoqCi0gICAgICogUmVtb3RlIHBsYXliYWNrIG1lZGlhIGNvbnRyb2wgYWN0aW9uOiBFbmQgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGggcm91dGVzIHRoYXQgc3VwcG9ydCB7QGxpbmsgI0NBVEVHT1JZX1JFTU9URV9QTEFZQkFDSyByZW1vdGUgcGxheWJhY2t9Ci0gICAgICogbWVkaWEgY29udHJvbC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBhY3Rpb24gY2F1c2VzIGEgcmVtb3RlIHBsYXliYWNrIHJvdXRlIHRvIGVuZCB0aGUgc3BlY2lmaWVkIHNlc3Npb24uCi0gICAgICogVGhlIHNlc3Npb24gYmVjb21lcyBubyBsb25nZXIgdmFsaWQgYW5kIHRoZSByb3V0ZSBjZWFzZXMgdG8gYmUgdW5kZXIgY29udHJvbAotICAgICAqIG9mIHRoZSBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJZiBzdWNjZXNzZnVsLCB0aGUgc3RhdHVzIG9mIHRoZSBzZXNzaW9uIGlzIHNldCB0bwotICAgICAqIHtAbGluayBNZWRpYVNlc3Npb25TdGF0dXMjU0VTU0lPTl9TVEFURV9FTkRFRH0gYW5kIGEgc3RhdHVzIHVwZGF0ZSBpcyBzZW50IHRvCi0gICAgICogdGhlIHNlc3Npb24ncyBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBZGRpdGlvbmFsbHksIHRoZSBzdGF0dXMgb2YgYWxsIG1lZGlhIGl0ZW1zIGluIHRoZSBxdWV1ZSBpcyBzZXQgdG8KLSAgICAgKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI1BMQVlCQUNLX1NUQVRFX0NBTkNFTEVEIGNhbmNlbGVkfSBhbmQgYSBzdGF0dXMgdXBkYXRlIGlzIHNlbnQKLSAgICAgKiB0byB0aGUgYXBwcm9wcmlhdGUgc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnMgaW5kaWNhdGluZyB0aGUgbmV3IHN0YXR1cyBvZiBlYWNoIGl0ZW0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPlJlcXVlc3QgcGFyYW1ldGVyczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZgotICAgICAqIHRoZSBzZXNzaW9uIHRvIGVuZC4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogPGgzPlJlc3VsdCBkYXRhPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVN9IDxlbT4oYWx3YXlzIHJldHVybmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlCi0gICAgICogc3RhdHVzIG9mIHRoZSBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiByZXR1cm5zIGFuIGVycm9yIGlmIHRoZSBzZXNzaW9uIGlkIGlzIHVua25vd24gb3Igbm8gbG9uZ2VyIHZhbGlkLgotICAgICAqIEluIG90aGVyIHdvcmRzLCBpdCBpcyBhbiBlcnJvciB0byBhdHRlbXB0IHRvIGVuZCBhIHNlc3Npb24gb3RoZXIgdGhhbiB0aGUKLSAgICAgKiBjdXJyZW50IHNlc3Npb24uCi0gICAgICogPC9wPjx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9FUlJPUl9DT0RFfSA8ZW0+KG9wdGlvbmFsKTwvZW0+OiBTcGVjaWZpZXMgdGhlIGNhdXNlIG9mIHRoZSBlcnJvci4KLSAgICAgKiA8L3VsPgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICogQHNlZSAjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX0VORF9TRVNTSU9OID0gImFuZHJvaWQubWVkaWEuaW50ZW50LmFjdGlvbi5FTkRfU0VTU0lPTiI7Ci0KLSAgICAvKioKLSAgICAgKiBDdXN0b20gbWVkaWEgY29udHJvbCBhY3Rpb246IFNlbmQge0BsaW5rICNFWFRSQV9NRVNTQUdFfS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGFjdGlvbiBhc2tzIGEgcm91dGUgdG8gaGFuZGxlIGEgbWVzc2FnZSBkZXNjcmliZWQgYnkgRVhUUkFfTUVTU0FHRS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVxdWVzdCBwYXJhbWV0ZXJzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mIHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggd2lsbCBoYW5kbGUgdGhpcyBtZXNzYWdlLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX01FU1NBR0V9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVzc2FnZSB0byBzZW5kLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8aDM+UmVzdWx0IGRhdGE8L2gzPgotICAgICAqIEFueSBtZXNzYWdlcyBkZWZpbmVkIGJ5IGVhY2ggbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICoKLSAgICAgKiA8aDM+RXJyb3JzPC9oMz4KLSAgICAgKiBBbnkgZXJyb3IgbWVzc2FnZXMgZGVmaW5lZCBieSBlYWNoIG1lZGlhIHJvdXRlIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jc2VuZENvbnRyb2xSZXF1ZXN0Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX1NFTkRfTUVTU0FHRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5hY3Rpb24uU0VORF9NRVNTQUdFIjsKLQotICAgIC8qIEV4dHJhcyBhbmQgcmVsYXRlZCBjb25zdGFudHMuICovCi0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIHNlc3Npb24gaWQuCi0gICAgICogPHA+Ci0gICAgICogQW4gb3BhcXVlIHVuaXF1ZSBpZGVudGlmaWVyIHRoYXQgaWRlbnRpZmllcyB0aGUgcmVtb3RlIHBsYXliYWNrIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFVzZWQgd2l0aCB2YXJpb3VzIGFjdGlvbnMgdG8gc3BlY2lmeSB0aGUgaWQgb2YgdGhlIG1lZGlhIHNlc3Npb24gdG8gYmUgY29udHJvbGxlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIGlkZW50aWZ5Ci0gICAgICogdGhlIHNlc3Npb24gdG8gd2hpY2ggdGhlIGl0ZW0gaW4gcXVlc3Rpb24gYmVsb25ncy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIGlkZW50aWZ5Ci0gICAgICogdGhlIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHVuaXF1ZSBzdHJpbmcgdmFsdWUgZ2VuZXJhdGVkIGJ5IHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlcgotICAgICAqIHRvIHJlcHJlc2VudCBvbmUgcGFydGljdWxhciBtZWRpYSBzZXNzaW9uLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqIEBzZWUgI0FDVElPTl9QQVVTRQotICAgICAqIEBzZWUgI0FDVElPTl9SRVNVTUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RPUAotICAgICAqIEBzZWUgI0FDVElPTl9TVEFSVF9TRVNTSU9OCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUwotICAgICAqIEBzZWUgI0FDVElPTl9FTkRfU0VTU0lPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NFU1NJT05fSUQgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLlNFU1NJT05fSUQiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBzZXNzaW9uIHN0YXR1cy4KLSAgICAgKiA8cD4KLSAgICAgKiBSZXR1cm5lZCBhcyBhIHJlc3VsdCBmcm9tIG1lZGlhIHNlc3Npb24gYWN0aW9ucyBzdWNoIGFzIHtAbGluayAjQUNUSU9OX1NUQVJUX1NFU1NJT059LAotICAgICAqIHtAbGluayAjQUNUSU9OX1BBVVNFfSwgYW5kIHtAbGluayAjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVU30KLSAgICAgKiB0byBkZXNjcmliZSB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIHByb3ZpZGUKLSAgICAgKiB1cGRhdGVkIHN0YXR1cyBpbmZvcm1hdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBkYXRhIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCBpbnRvCi0gICAgICogYSB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzfSBvYmplY3QgdXNpbmcKLSAgICAgKiB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzI2Zyb21CdW5kbGUgTWVkaWFTZXNzaW9uU3RhdHVzLmZyb21CdW5kbGV9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqIEBzZWUgI0FDVElPTl9QQVVTRQotICAgICAqIEBzZWUgI0FDVElPTl9SRVNVTUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RPUAotICAgICAqIEBzZWUgI0FDVElPTl9TVEFSVF9TRVNTSU9OCi0gICAgICogQHNlZSAjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUwotICAgICAqIEBzZWUgI0FDVElPTl9FTkRfU0VTU0lPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1NFU1NJT05fU1RBVFVTID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5TRVNTSU9OX1NUQVRVUyI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIHNlc3Npb24gc3RhdHVzIHVwZGF0ZSByZWNlaXZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fU1RBUlRfU0VTU0lPTn0gdG8gc3BlY2lmeSBhIHtAbGluayBQZW5kaW5nSW50ZW50fSBmb3IgYQotICAgICAqIGJyb2FkY2FzdCByZWNlaXZlciB0aGF0IHdpbGwgcmVjZWl2ZSBzdGF0dXMgdXBkYXRlcyBhYm91dCB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogV2hlbmV2ZXIgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbiBjaGFuZ2VzLCB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgd2lsbAotICAgICAqIHNlbmQgYSBicm9hZGNhc3QgdG8gdGhlIHBlbmRpbmcgaW50ZW50IHdpdGggZXh0cmFzIHRoYXQgaWRlbnRpZnkgdGhlIHNlc3Npb24KLSAgICAgKiBpZCBhbmQgaXRzIHVwZGF0ZWQgc3RhdHVzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkJyb2FkY2FzdCBleHRyYXM8L2gzPgotICAgICAqIDx1bD4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIHNlc3Npb24gaWQgb2YKLSAgICAgKiB0aGUgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlCi0gICAgICogc2Vzc2lvbiBhcyBhIGJ1bmRsZSB0aGF0IGNhbiBiZSBkZWNvZGVkIGludG8gYSB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzfSBvYmplY3QuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9TVEFSVF9TRVNTSU9OCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBtZXNzYWdlIHJlY2VpdmVyLgotICAgICAqIDxwPgotICAgICAqIFVzZWQgd2l0aCB7QGxpbmsgI0FDVElPTl9TVEFSVF9TRVNTSU9OfSB0byBzcGVjaWZ5IGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhCi0gICAgICogYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIG1lc3NhZ2VzIGZyb20gdGhlIG1lZGlhIHNlc3Npb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW4gdGhlIG1lZGlhIHNlc3Npb24gaGFzIGEgbWVzc2FnZSB0byBzZW5kLCB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgd2lsbAotICAgICAqIHNlbmQgYSBicm9hZGNhc3QgdG8gdGhlIHBlbmRpbmcgaW50ZW50IHdpdGggZXh0cmFzIHRoYXQgaWRlbnRpZnkgdGhlIHNlc3Npb24KLSAgICAgKiBpZCBhbmQgaXRzIG1lc3NhZ2UuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBQZW5kaW5nSW50ZW50fS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+QnJvYWRjYXN0IGV4dHJhczwvaDM+Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX1NFU1NJT05fSUR9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgc2Vzc2lvbiBpZCBvZgotICAgICAqIHRoZSBzZXNzaW9uLgotICAgICAqIDxsaT57QGxpbmsgI0VYVFJBX01FU1NBR0V9IDxlbT4ocmVxdWlyZWQpPC9lbT46IFNwZWNpZmllcyB0aGUgbWVzc2FnZSBmcm9tCi0gICAgICogdGhlIHNlc3Npb24gYXMgYSBidW5kbGUgb2JqZWN0LgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fU1RBUlRfU0VTU0lPTgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX01FU1NBR0VfUkVDRUlWRVIgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLk1FU1NBR0VfUkVDRUlWRVIiOwotCi0gICAgLyoqCi0gICAgICogQnVuZGxlIGV4dHJhOiBNZWRpYSBpdGVtIGlkLgotICAgICAqIDxwPgotICAgICAqIEFuIG9wYXF1ZSB1bmlxdWUgaWRlbnRpZmllciByZXR1cm5lZCBhcyBhIHJlc3VsdCBmcm9tIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yCi0gICAgICoge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdGhhdCByZXByZXNlbnRzIHRoZSBtZWRpYSBpdGVtIHRoYXQgd2FzIGNyZWF0ZWQgYnkgdGhlCi0gICAgICogcGxheWJhY2sgcmVxdWVzdC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVXNlZCB3aXRoIHZhcmlvdXMgYWN0aW9ucyB0byBzcGVjaWZ5IHRoZSBpZCBvZiB0aGUgbWVkaWEgaXRlbSB0byBiZSBjb250cm9sbGVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBJbmNsdWRlZCBpbiBicm9hZGNhc3QgaW50ZW50cyBzZW50IHRvCi0gICAgICoge0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIGlkZW50aWZ5Ci0gICAgICogdGhlIGl0ZW0gaW4gcXVlc3Rpb24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHVuaXF1ZSBzdHJpbmcgdmFsdWUgZ2VuZXJhdGVkIGJ5IHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlcgotICAgICAqIHRvIHJlcHJlc2VudCBvbmUgcGFydGljdWxhciBtZWRpYSBpdGVtLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU0VFSwotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU1RBVFVTCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9JRCA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5pbnRlbnQuZXh0cmEuSVRFTV9JRCI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIGl0ZW0gc3RhdHVzLgotICAgICAqIDxwPgotICAgICAqIFJldHVybmVkIGFzIGEgcmVzdWx0IGZyb20gbWVkaWEgaXRlbSBhY3Rpb25zIHN1Y2ggYXMge0BsaW5rICNBQ1RJT05fUExBWX0sCi0gICAgICoge0BsaW5rICNBQ1RJT05fRU5RVUVVRX0sIHtAbGluayAjQUNUSU9OX1NFRUt9LCBhbmQge0BsaW5rICNBQ1RJT05fR0VUX1NUQVRVU30KLSAgICAgKiB0byBkZXNjcmliZSB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgbWVkaWEgaXRlbS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW5jbHVkZWQgaW4gYnJvYWRjYXN0IGludGVudHMgc2VudCB0bwotICAgICAqIHtAbGluayAjRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlcnN9IHRvIHByb3ZpZGUKLSAgICAgKiB1cGRhdGVkIHN0YXR1cyBpbmZvcm1hdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfSBvZiBkYXRhIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCBpbnRvCi0gICAgICogYSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzfSBvYmplY3QgdXNpbmcKLSAgICAgKiB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzI2Zyb21CdW5kbGUgTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGV9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKiBAc2VlICNBQ1RJT05fU0VFSwotICAgICAqIEBzZWUgI0FDVElPTl9HRVRfU1RBVFVTCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9TVEFUVVMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLklURU1fU1RBVFVTIjsKLQotICAgIC8qKgotICAgICAqIExvbmcgZXh0cmE6IE1lZGlhIGl0ZW0gY29udGVudCBwb3NpdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fUExBWX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdG8gc3BlY2lmeSB0aGUKLSAgICAgKiBzdGFydGluZyBwbGF5YmFjayBwb3NpdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1NFRUt9IHRvIHNldCBhIG5ldyBwbGF5YmFjayBwb3NpdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZW50LgotICAgICAqIDxwPgotICAgICAqCi0gICAgICogQHNlZSAjQUNUSU9OX1BMQVkKLSAgICAgKiBAc2VlICNBQ1RJT05fRU5RVUVVRQotICAgICAqIEBzZWUgI0FDVElPTl9TRUVLCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX1BPU0lUSU9OIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogTWVkaWEgaXRlbSBtZXRhZGF0YS4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fUExBWX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdG8gc3BlY2lmeSBtZXRhZGF0YQotICAgICAqIGFzc29jaWF0ZWQgd2l0aCB0aGUgY29udGVudCBvZiBhIG1lZGlhIGl0ZW0uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHtAbGluayBhbmRyb2lkLm9zLkJ1bmRsZX0gb2YgbWV0YWRhdGEga2V5LXZhbHVlIHBhaXJzIGFzIGRlZmluZWQKLSAgICAgKiBpbiB7QGxpbmsgTWVkaWFJdGVtTWV0YWRhdGF9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JVEVNX01FVEFEQVRBID0KLSAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5JVEVNX01FVEFEQVRBIjsKLQotICAgIC8qKgotICAgICAqIEJ1bmRsZSBleHRyYTogSFRUUCByZXF1ZXN0IGhlYWRlcnMuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1BMQVl9IG9yIHtAbGluayAjQUNUSU9OX0VOUVVFVUV9IHRvIHNwZWNpZnkgSFRUUCByZXF1ZXN0Ci0gICAgICogaGVhZGVycyB0byBiZSBpbmNsdWRlZCB3aGVuIGZldGNoaW5nIHRvIHRoZSBjb250ZW50IGluZGljYXRlZCBieSB0aGUgbWVkaWEKLSAgICAgKiBpdGVtJ3MgZGF0YSBVcmkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgZXh0cmEgbWF5IGJlIHVzZWQgdG8gcHJvdmlkZSBhdXRoZW50aWNhdGlvbiB0b2tlbnMgYW5kIG90aGVyCi0gICAgICogcGFyYW1ldGVycyB0byB0aGUgc2VydmVyIHNlcGFyYXRlbHkgZnJvbSB0aGUgbWVkaWEgaXRlbSdzIGRhdGEgVXJpLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IG9mIHN0cmluZyBiYXNlZCBrZXktdmFsdWUgcGFpcnMKLSAgICAgKiB0aGF0IGRlc2NyaWJlIHRoZSBIVFRQIHJlcXVlc3QgaGVhZGVycy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAc2VlICNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI0FDVElPTl9FTlFVRVVFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSVRFTV9IVFRQX0hFQURFUlMgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLkhUVFBfSEVBREVSUyI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lZGlhIGl0ZW0gc3RhdHVzIHVwZGF0ZSByZWNlaXZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIHdpdGgge0BsaW5rICNBQ1RJT05fUExBWX0gb3Ige0BsaW5rICNBQ1RJT05fRU5RVUVVRX0gdG8gc3BlY2lmeQotICAgICAqIGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9IGZvciBhCi0gICAgICogYnJvYWRjYXN0IHJlY2VpdmVyIHRoYXQgd2lsbCByZWNlaXZlIHN0YXR1cyB1cGRhdGVzIGFib3V0IGEgcGFydGljdWxhcgotICAgICAqIG1lZGlhIGl0ZW0uCi0gICAgICogPC9wPjxwPgotICAgICAqIFdoZW5ldmVyIHRoZSBzdGF0dXMgb2YgdGhlIG1lZGlhIGl0ZW0gY2hhbmdlcywgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpbGwKLSAgICAgKiBzZW5kIGEgYnJvYWRjYXN0IHRvIHRoZSBwZW5kaW5nIGludGVudCB3aXRoIGV4dHJhcyB0aGF0IGlkZW50aWZ5IHRoZSBzZXNzaW9uCi0gICAgICogdG8gd2hpY2ggdGhlIGl0ZW0gYmVsb25ncywgdGhlIHNlc3Npb24gc3RhdHVzLCB0aGUgaXRlbSdzIGlkCi0gICAgICogYW5kIHRoZSBpdGVtJ3MgdXBkYXRlZCBzdGF0dXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSBzYW1lIHBlbmRpbmcgaW50ZW50IGFuZCBicm9hZGNhc3QgcmVjZWl2ZXIgbWF5IGJlIHNoYXJlZCBieSBhbnkgbnVtYmVyIG9mCi0gICAgICogbWVkaWEgaXRlbXMgc2luY2UgdGhlIGJyb2FkY2FzdCBpbnRlbnQgaW5jbHVkZXMgdGhlIG1lZGlhIHNlc3Npb24gaWQKLSAgICAgKiBhbmQgbWVkaWEgaXRlbSBpZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIFBlbmRpbmdJbnRlbnR9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIDxoMz5Ccm9hZGNhc3QgZXh0cmFzPC9oMz4KLSAgICAgKiA8dWw+Ci0gICAgICogPGxpPntAbGluayAjRVhUUkFfU0VTU0lPTl9JRH0gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzZXNzaW9uIGlkIG9mCi0gICAgICogdGhlIHNlc3Npb24gdG8gd2hpY2ggdGhlIGl0ZW0gaW4gcXVlc3Rpb24gYmVsb25ncy4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9TRVNTSU9OX1NUQVRVU30gPGVtPihvcHRpb25hbCwgb2xkIGltcGxlbWVudGF0aW9ucyBtYXkKLSAgICAgKiBvbWl0IHRoaXMga2V5KTwvZW0+OiBTcGVjaWZpZXMgdGhlIHN0YXR1cyBvZiB0aGUgbWVkaWEgc2Vzc2lvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX0lEfSA8ZW0+KHJlcXVpcmVkKTwvZW0+OiBTcGVjaWZpZXMgdGhlIG1lZGlhIGl0ZW0gaWQgb2YgdGhlCi0gICAgICogbWVkaWEgaXRlbSBpbiBxdWVzdGlvbi4KLSAgICAgKiA8bGk+e0BsaW5rICNFWFRSQV9JVEVNX1NUQVRVU30gPGVtPihyZXF1aXJlZCk8L2VtPjogU3BlY2lmaWVzIHRoZSBzdGF0dXMgb2YgdGhlCi0gICAgICogaXRlbSBhcyBhIGJ1bmRsZSB0aGF0IGNhbiBiZSBkZWNvZGVkIGludG8gYSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzfSBvYmplY3QuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIEBzZWUgI0FDVElPTl9QTEFZCi0gICAgICogQHNlZSAjQUNUSU9OX0VOUVVFVUUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuaW50ZW50LmV4dHJhLklURU1fU1RBVFVTX1VQREFURV9SRUNFSVZFUiI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IE1lc3NhZ2UuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIHtAbGluayAjQUNUSU9OX1NFTkRfTUVTU0FHRX0sIGFuZCBpbmNsdWRlZCBpbiBicm9hZGNhc3QgaW50ZW50cyBzZW50IHRvCi0gICAgICoge0BsaW5rICNFWFRSQV9NRVNTQUdFX1JFQ0VJVkVSIG1lc3NhZ2UgcmVjZWl2ZXJzfSB0byBkZXNjcmliZSBhIG1lc3NhZ2UgYmV0d2VlbiBhCi0gICAgICogc2Vzc2lvbiBhbmQgYSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEge0BsaW5rIGFuZHJvaWQub3MuQnVuZGxlfS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfTUVTU0FHRSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5NRVNTQUdFIjsKLQotICAgIC8qKgotICAgICAqIEludGVnZXIgZXh0cmE6IEVycm9yIGNvZGUuCi0gICAgICogPHA+Ci0gICAgICogVXNlZCB3aXRoIGFsbCBtZWRpYSBjb250cm9sIHJlcXVlc3RzIHRvIGRlc2NyaWJlIHRoZSBjYXVzZSBvZiBhbiBlcnJvci4KLSAgICAgKiBUaGlzIGV4dHJhIG1heSBiZSBvbWl0dGVkIHdoZW4gdGhlIGVycm9yIGlzIHVua25vd24uCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBvbmUgb2Y6IHtAbGluayAjRVJST1JfVU5LTk9XTn0sIHtAbGluayAjRVJST1JfVU5TVVBQT1JURURfT1BFUkFUSU9OfSwKLSAgICAgKiB7QGxpbmsgI0VSUk9SX0lOVkFMSURfU0VTU0lPTl9JRH0sIHtAbGluayAjRVJST1JfSU5WQUxJRF9JVEVNX0lEfS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfRVJST1JfQ09ERSA9ICJhbmRyb2lkLm1lZGlhLmludGVudC5leHRyYS5FUlJPUl9DT0RFIjsKLQotICAgIC8qKgotICAgICAqIEVycm9yIGNvZGU6IEFuIHVua25vd24gZXJyb3Igb2NjdXJyZWQuCi0gICAgICoKLSAgICAgKiBAc2VlICNFWFRSQV9FUlJPUl9DT0RFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfVU5LTk9XTiA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBFcnJvciBjb2RlOiBUaGUgb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQuCi0gICAgICoKLSAgICAgKiBAc2VlICNFWFRSQV9FUlJPUl9DT0RFCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRVJST1JfVU5TVVBQT1JURURfT1BFUkFUSU9OID0gMTsKLQotICAgIC8qKgotICAgICAqIEVycm9yIGNvZGU6IFRoZSBzZXNzaW9uIGlkIHNwZWNpZmllZCBpbiB0aGUgcmVxdWVzdCB3YXMgaW52YWxpZC4KLSAgICAgKgotICAgICAqIEBzZWUgI0VYVFJBX0VSUk9SX0NPREUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBFUlJPUl9JTlZBTElEX1NFU1NJT05fSUQgPSAyOwotCi0gICAgLyoqCi0gICAgICogRXJyb3IgY29kZTogVGhlIGl0ZW0gaWQgc3BlY2lmaWVkIGluIHRoZSByZXF1ZXN0IHdhcyBpbnZhbGlkLgotICAgICAqCi0gICAgICogQHNlZSAjRVhUUkFfRVJST1JfQ09ERQotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVSUk9SX0lOVkFMSURfSVRFTV9JRCA9IDM7Ci0KLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbEludGVudCgpIHsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtTWV0YWRhdGEuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1NZXRhZGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTJkZGI2Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYUl0ZW1NZXRhZGF0YS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotCi0vKioKLSAqIENvbnN0YW50cyBmb3Igc3BlY2lmeWluZyBtZXRhZGF0YSBhYm91dCBhIG1lZGlhIGl0ZW0gYXMgYSB7QGxpbmsgQnVuZGxlfS4KLSAqIDxwPgotICogVGhpcyBjbGFzcyBpcyBwYXJ0IG9mIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wgZGVzY3JpYmVkIGJ5IHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBNZWRpYUNvbnRyb2xJbnRlbnR9IGNsYXNzLgotICogPC9wPjxwPgotICogTWVkaWEgaXRlbSBtZXRhZGF0YSBpcyBkZXNjcmliZWQgYXMgYSBidW5kbGUgb2Yga2V5L3ZhbHVlIHBhaXJzIGFzIGRlZmluZWQKLSAqIGluIHRoaXMgY2xhc3MuICBUaGUgZG9jdW1lbnRhdGlvbiBzcGVjaWZpZXMgdGhlIHR5cGUgb2YgdmFsdWUgYXNzb2NpYXRlZAotICogd2l0aCBlYWNoIGtleS4KLSAqIDwvcD48cD4KLSAqIEFuIGFwcGxpY2F0aW9uIG1heSBzcGVjaWZ5IGFkZGl0aW9uYWwgY3VzdG9tIG1ldGFkYXRhIGtleXMgYnV0IHRoZXJlIGlzIG5vIGd1YXJhbnRlZQotICogdGhhdCB0aGV5IHdpbGwgYmUgcmVjb2duaXplZCBieSB0aGUgZGVzdGluYXRpb24uCi0gKiA8L3A+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYUl0ZW1NZXRhZGF0YSB7Ci0gICAgLyoKLSAgICAgKiBOb3RlOiBNZWRpYU1ldGFkYXRhUmV0cmlldmVyIGFsc28gZGVmaW5lcyBhIGNvbGxlY3Rpb24gb2YgbWV0YWRhdGEga2V5cyB0aGF0IGNhbiBiZQotICAgICAqIHJldHJpZXZlZCBmcm9tIGEgY29udGVudCBzdHJlYW0gYWx0aG91Z2ggdGhlIHJlcHJlc2VudGF0aW9uIGlzIHNvbWV3aGF0IGRpZmZlcmVudCBoZXJlCi0gICAgICogc2luY2Ugd2UgYXJlIHNlbmRpbmcgdGhlIGRhdGEgdG8gYSByZW1vdGUgZW5kcG9pbnQuCi0gICAgICovCi0KLSAgICBwcml2YXRlIE1lZGlhSXRlbU1ldGFkYXRhKCkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IEFsYnVtIGFydGlzdCBuYW1lLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBzdWl0YWJsZSBmb3IgZGlzcGxheS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0FMQlVNX0FSVElTVCA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFMQlVNX0FSVElTVCI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBBbGJ1bSB0aXRsZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BTEJVTV9USVRMRSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLkFMQlVNX1RJVExFIjsKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IEFydHdvcmsgVXJpLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIHN0cmluZyBVUkkgZm9yIGFuIGltYWdlIGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZWRpYSBpdGVtLAotICAgICAqIHN1Y2ggYXMgYWxidW0gb3IgY292ZXIgYXJ0LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVJUV09SS19VUkkgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BUlRXT1JLX1VSSSI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBBcnRpc3QgbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BUlRJU1QgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5BUlRJU1QiOwotCi0gICAgLyoqCi0gICAgICogU3RyaW5nIGtleTogQXV0aG9yIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQVVUSE9SID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuQVVUSE9SIjsKLQotICAgIC8qKgotICAgICAqIFN0cmluZyBrZXk6IENvbXBvc2VyIG5hbWUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGEgc3RyaW5nIHN1aXRhYmxlIGZvciBkaXNwbGF5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09NUE9TRVIgPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5DT01QT1NFUiI7Ci0KLSAgICAvKioKLSAgICAgKiBTdHJpbmcga2V5OiBUcmFjayB0aXRsZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBzdHJpbmcgc3VpdGFibGUgZm9yIGRpc3BsYXkuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9USVRMRSA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLlRJVExFIjsKLQotICAgIC8qKgotICAgICAqIEludGVnZXIga2V5OiBZZWFyIG9mIHB1YmxpY2F0aW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyIHllYXIgbnVtYmVyLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfWUVBUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLllFQVIiOwotCi0gICAgLyoqCi0gICAgICogSW50ZWdlciBrZXk6IFRyYWNrIG51bWJlciAoc3VjaCBhcyBhIHRyYWNrIG9uIGEgQ0QpLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIG9uZS1iYXNlZCBpbnRlZ2VyIHRyYWNrIG51bWJlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1RSQUNLX05VTUJFUiA9ICJhbmRyb2lkLm1lZGlhLm1ldGFkYXRhLlRSQUNLX05VTUJFUiI7Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlZ2VyIGtleTogRGlzYyBudW1iZXIgd2l0aGluIGEgY29sbGVjdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSBvbmUtYmFzZWQgaW50ZWdlciBkaXNjIG51bWJlci4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RJU0NfTlVNQkVSID0gImFuZHJvaWQubWVkaWEubWV0YWRhdGEuRElTQ19OVU1CRVIiOwotCi0gICAgLyoqCi0gICAgICogTG9uZyBrZXk6IEl0ZW0gcGxheWJhY2sgZHVyYXRpb24gaW4gbWlsbGlzZWNvbmRzLgotICAgICAqIDxwPgotICAgICAqIFRoZSB2YWx1ZSBpcyBhIDxjb2RlPmxvbmc8L2NvZGU+IG51bWJlciBvZiBtaWxsaXNlY29uZHMuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSBkdXJhdGlvbiBtZXRhZGF0YSBpcyBvbmx5IGEgaGludCB0byBlbmFibGUgYSByZW1vdGUgbWVkaWEgcGxheWVyIHRvCi0gICAgICogZ3Vlc3MgdGhlIGR1cmF0aW9uIG9mIHRoZSBjb250ZW50IGJlZm9yZSBpdCBhY3R1YWxseSBvcGVucyB0aGUgbWVkaWEgc3RyZWFtLgotICAgICAqIFRoZSByZW1vdGUgbWVkaWEgcGxheWVyIHNob3VsZCBzdGlsbCBkZXRlcm1pbmUgdGhlIGFjdHVhbCBjb250ZW50IGR1cmF0aW9uIGZyb20KLSAgICAgKiB0aGUgbWVkaWEgc3RyZWFtIGl0c2VsZiBpbmRlcGVuZGVudCBvZiB0aGUgdmFsdWUgdGhhdCBtYXkgYmUgc3BlY2lmaWVkIGJ5IHRoaXMga2V5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRFVSQVRJT04gPSAiYW5kcm9pZC5tZWRpYS5tZXRhZGF0YS5EVVJBVElPTiI7Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtU3RhdHVzLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFJdGVtU3RhdHVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZWEyZDUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhSXRlbVN0YXR1cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYXBwLlBlbmRpbmdJbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5TeXN0ZW1DbG9jazsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5UaW1lVXRpbHM7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBwbGF5YmFjayBzdGF0dXMgb2YgYSBtZWRpYSBpdGVtLgotICogPHA+Ci0gKiBUaGlzIGNsYXNzIGlzIHBhcnQgb2YgdGhlIHJlbW90ZSBwbGF5YmFjayBwcm90b2NvbCBkZXNjcmliZWQgYnkgdGhlCi0gKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IE1lZGlhQ29udHJvbEludGVudH0gY2xhc3MuCi0gKiA8L3A+PHA+Ci0gKiBBcyBhIG1lZGlhIGl0ZW0gaXMgcGxheWVkLCBpdCB0cmFuc2l0aW9ucyB0aHJvdWdoIGEgc2VxdWVuY2Ugb2Ygc3RhdGVzIGluY2x1ZGluZzoKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEVORElORyBwZW5kaW5nfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9CVUZGRVJJTkcgYnVmZmVyaW5nfSwKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUExBWUlORyBwbGF5aW5nfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9QQVVTRUQgcGF1c2VkfSwKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRklOSVNIRUQgZmluaXNoZWR9LCB7QGxpbmsgI1BMQVlCQUNLX1NUQVRFX0NBTkNFTEVEIGNhbmNlbGVkfSwKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUQgaW52YWxpZGF0ZWR9LCBhbmQKLSAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRVJST1IgZXJyb3J9LiAgUmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gb2YgZWFjaCBzdGF0ZQotICogZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGl0cyBtZWFuaW5nLgotICogPC9wPjxwPgotICogV2hpbGUgdGhlIGl0ZW0gaXMgcGxheWluZywgdGhlIHBsYXliYWNrIHN0YXR1cyBtYXkgYWxzbyBpbmNsdWRlIHByb2dyZXNzIGluZm9ybWF0aW9uCi0gKiBhYm91dCB0aGUge0BsaW5rICNnZXRDb250ZW50UG9zaXRpb24gY29udGVudCBwb3NpdGlvbn0gYW5kCi0gKiB7QGxpbmsgI2dldENvbnRlbnREdXJhdGlvbiBjb250ZW50IGR1cmF0aW9ufSBhbHRob3VnaCBub3QgYWxsIHJvdXRlIGRlc3RpbmF0aW9ucwotICogd2lsbCByZXBvcnQgaXQuCi0gKiA8L3A+PHA+Ci0gKiBUbyBtb25pdG9yIHBsYXliYWNrIHN0YXR1cywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBzdXBwbHkgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0gdG8gdXNlIGFzIHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9JVEVNX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgaXRlbSBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyfQotICogZm9yIGEgZ2l2ZW4ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5YmFjayByZXF1ZXN0fS4gIE5vdGUgdGhhdAotICogdGhlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIgd2lsbCBvbmx5IGJlIGludm9rZWQgZm9yIG1ham9yIHN0YXR1cyBjaGFuZ2VzIHN1Y2ggYXMgYQotICogdHJhbnNpdGlvbiBmcm9tIHBsYXlpbmcgdG8gZmluaXNoZWQuCi0gKiA8L3A+PHAgY2xhc3M9Im5vdGUiPgotICogVGhlIHN0YXR1cyB1cGRhdGUgcmVjZWl2ZXIgd2lsbCBub3QgYmUgaW52b2tlZCBmb3IgbWlub3IgcHJvZ3Jlc3MgdXBkYXRlcyBzdWNoIGFzCi0gKiBjaGFuZ2VzIHRvIHBsYXliYWNrIHBvc2l0aW9uIG9yIGR1cmF0aW9uLiAgSWYgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIG1vbml0b3IKLSAqIHBsYXliYWNrIHByb2dyZXNzLCB0aGVuIGl0IG11c3QgdXNlIHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUyBnZXQgc3RhdHVzIHJlcXVlc3R9IHRvIHBvbGwgZm9yIGNoYW5nZXMKLSAqIHBlcmlvZGljYWxseSBhbmQgZXN0aW1hdGUgdGhlIHBsYXliYWNrIHBvc2l0aW9uIHdoaWxlIHBsYXlpbmcuICBOb3RlIHRoYXQgdGhlcmUgbWF5Ci0gKiBiZSBhIHNpZ25pZmljYW50IHBvd2VyIGltcGFjdCB0byBwb2xsaW5nIHNvIHRoZSBhcHBsaWNhdGlvbiBpcyBhZHZpc2VkIG9ubHkKLSAqIHRvIHBvbGwgd2hlbiB0aGUgc2NyZWVuIGlzIG9uIGFuZCBuZXZlciBtb3JlIHRoYW4gYWJvdXQgb25jZSBldmVyeSA1IHNlY29uZHMgb3Igc28uCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkIHVzaW5nIGEge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFJdGVtU3RhdHVzIHsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9USU1FU1RBTVAgPSAidGltZXN0YW1wIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19TVEFURSA9ICJwbGF5YmFja1N0YXRlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05URU5UX1BPU0lUSU9OID0gImNvbnRlbnRQb3NpdGlvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ09OVEVOVF9EVVJBVElPTiA9ICJjb250ZW50RHVyYXRpb24iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0VYVFJBUyA9ICJleHRyYXMiOwotCi0gICAgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGVuZGluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBoYXMgbm90IHlldCBzdGFydGVkIHBsYXliYWNrIGJ1dCB3aWxsIGJlIHBsYXllZCBldmVudHVhbGx5LgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9QRU5ESU5HID0gMDsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBQbGF5aW5nLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpdGVtIGlzIGN1cnJlbnRseSBwbGF5aW5nLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9QTEFZSU5HID0gMTsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBQYXVzZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgcGxheWJhY2sgb2YgdGhlIG1lZGlhIGl0ZW0gaGFzIGJlZW4gcGF1c2VkLiAgUGxheWJhY2sgY2FuIGJlCi0gICAgICogcmVzdW1lZCB1c2luZyB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FIHJlc3VtZX0gYWN0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9QQVVTRUQgPSAyOwotCi0gICAgLyoqCi0gICAgICogUGxheWJhY2sgc3RhdGU6IEJ1ZmZlcmluZyBvciBzZWVraW5nIHRvIGEgbmV3IHBvc2l0aW9uLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBpdGVtIGhhcyBiZWVuIHRlbXBvcmFyaWx5IGludGVycnVwdGVkCi0gICAgICogdG8gZmV0Y2ggbW9yZSBjb250ZW50LiAgUGxheWJhY2sgd2lsbCBjb250aW51ZSBhdXRvbWF0aWNhbGx5Ci0gICAgICogd2hlbiBlbm91Z2ggY29udGVudCBoYXMgYmVlbiBidWZmZXJlZC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HID0gMzsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBGaW5pc2hlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSBwbGF5ZWQgdG8gdGhlIGVuZCBvZiB0aGUgY29udGVudCBhbmQgZmluaXNoZWQgbm9ybWFsbHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIEEgZmluaXNoZWQgbWVkaWEgaXRlbSBjYW5ub3QgYmUgcmVzdW1lZC4gIFRvIHBsYXkgdGhlIGNvbnRlbnQgYWdhaW4sIHRoZSBhcHBsaWNhdGlvbgotICAgICAqIG11c3Qgc2VuZCBhIG5ldyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIHBsYXl9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSBhY3Rpb24uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUQVRFX0ZJTklTSEVEID0gNDsKLQotICAgIC8qKgotICAgICAqIFBsYXliYWNrIHN0YXRlOiBDYW5jZWxlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgaXRlbSB3YXMgZXhwbGljaXRseSByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIGJ5IHRoZQotICAgICAqIGFwcGxpY2F0aW9uLiAgSXRlbXMgbWF5IGJlIGNhbmNlbGVkIGFuZCByZW1vdmVkIGZyb20gdGhlIHF1ZXVlIHVzaW5nCi0gICAgICogdGhlIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFTU9WRSByZW1vdmV9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUCBzdG9wfSBhY3Rpb24gb3IgYnkgaXNzdWluZwotICAgICAqIGFub3RoZXIge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBhY3Rpb24gdGhhdCBoYXMgdGhlCi0gICAgICogc2lkZS1lZmZlY3Qgb2YgY2xlYXJpbmcgdGhlIHF1ZXVlLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBIGNhbmNlbGVkIG1lZGlhIGl0ZW0gY2Fubm90IGJlIHJlc3VtZWQuICBUbyBwbGF5IHRoZSBjb250ZW50IGFnYWluLCB0aGUKLSAgICAgKiBhcHBsaWNhdGlvbiBtdXN0IHNlbmQgYSBuZXcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBvcgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9DQU5DRUxFRCA9IDU7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogSW52YWxpZGF0ZWQuCi0gICAgICogPHA+Ci0gICAgICogSW5kaWNhdGVzIHRoYXQgdGhlIG1lZGlhIGl0ZW0gd2FzIGludmFsaWRhdGVkIHBlcm1hbmVudGx5IGFuZCBpbnZvbHVudGFyaWx5LgotICAgICAqIFRoaXMgc3RhdGUgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBtZWRpYSBpdGVtIHdhcyBpbnZhbGlkYXRlZCBhbmQgcmVtb3ZlZAotICAgICAqIGZyb20gdGhlIHF1ZXVlIGJlY2F1c2UgdGhlIHNlc3Npb24gdG8gd2hpY2ggaXQgYmVsb25ncyB3YXMgaW52YWxpZGF0ZWQKLSAgICAgKiAodHlwaWNhbGx5IGJ5IGFub3RoZXIgYXBwbGljYXRpb24gdGFraW5nIGNvbnRyb2wgb2YgdGhlIHJvdXRlKS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogV2hlbiBpbnZhbGlkYXRpb24gb2NjdXJzLCB0aGUgYXBwbGljYXRpb24gc2hvdWxkIGdlbmVyYWxseSB3YWl0IGZvciB0aGUgdXNlcgotICAgICAqIHRvIHBlcmZvcm0gYW4gZXhwbGljaXQgYWN0aW9uLCBzdWNoIGFzIGNsaWNraW5nIG9uIGEgcGxheSBidXR0b24gaW4gdGhlIFVJLAotICAgICAqIGJlZm9yZSBjcmVhdGluZyBhIG5ldyBtZWRpYSBzZXNzaW9uIHRvIGF2b2lkIHVubmVjZXNzYXJpbHkgaW50ZXJydXB0aW5nCi0gICAgICogYW5vdGhlciBhcHBsaWNhdGlvbiB0aGF0IG1heSBoYXZlIGp1c3Qgc3RhcnRlZCB1c2luZyB0aGUgcm91dGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFuIGludmFsaWRhdGVkIG1lZGlhIGl0ZW0gY2Fubm90IGJlIHJlc3VtZWQuICBUbyBwbGF5IHRoZSBjb250ZW50IGFnYWluLCB0aGUgYXBwbGljYXRpb24KLSAgICAgKiBtdXN0IHNlbmQgYSBuZXcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWSBwbGF5fSBvcgotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUgZW5xdWV1ZX0gYWN0aW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRCA9IDY7Ci0KLSAgICAvKioKLSAgICAgKiBQbGF5YmFjayBzdGF0ZTogUGxheWJhY2sgaGFsdGVkIG9yIGFib3J0ZWQgZHVlIHRvIGFuIGVycm9yLgotICAgICAqIDxwPgotICAgICAqIEV4YW1wbGVzIG9mIGVycm9ycyBhcmUgbm8gbmV0d29yayBjb25uZWN0aXZpdHkgd2hlbiBhdHRlbXB0aW5nIHRvIHJldHJpZXZlIGNvbnRlbnQKLSAgICAgKiBmcm9tIGEgc2VydmVyLCBvciBleHBpcmVkIHVzZXIgY3JlZGVudGlhbHMgd2hlbiB0cnlpbmcgdG8gcGxheSBzdWJzY3JpcHRpb24tYmFzZWQKLSAgICAgKiBjb250ZW50LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBBIG1lZGlhIGl0ZW0gaW4gdGhlIGVycm9yIHN0YXRlIGNhbm5vdCBiZSByZXN1bWVkLiAgVG8gcGxheSB0aGUgY29udGVudCBhZ2FpbiwKLSAgICAgKiB0aGUgYXBwbGljYXRpb24gbXVzdCBzZW5kIGEgbmV3IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIGVucXVldWV9IGFjdGlvbi4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfU1RBVEVfRVJST1IgPSA3OwotCi0gICAgLyoqCi0gICAgICogSW50ZWdlciBleHRyYTogSFRUUCBzdGF0dXMgY29kZS4KLSAgICAgKiA8cD4KLSAgICAgKiBTcGVjaWZpZXMgdGhlIEhUVFAgc3RhdHVzIGNvZGUgdGhhdCB3YXMgZW5jb3VudGVyZWQgd2hlbiB0aGUgY29udGVudAotICAgICAqIHdhcyByZXF1ZXN0ZWQgYWZ0ZXIgYWxsIHJlZGlyZWN0cyB3ZXJlIGZvbGxvd2VkLiAgVGhpcyBrZXkgb25seSBuZWVkcyB0bwotICAgICAqIHNwZWNpZmllZCB3aGVuIHRoZSBjb250ZW50IHVyaSB1c2VzIHRoZSBIVFRQIG9yIEhUVFBTIHNjaGVtZSBhbmQgYW4gZXJyb3IKLSAgICAgKiBvY2N1cnJlZC4gIFRoaXMga2V5IG1heSBiZSBvbWl0dGVkIGlmIHRoZSBjb250ZW50IHdhcyBhYmxlIHRvIGJlIHBsYXllZAotICAgICAqIHN1Y2Nlc3NmdWxseTsgdGhlcmUgaXMgbm8gbmVlZCB0byByZXBvcnQgYSAyMDAgKE9LKSBzdGF0dXMgY29kZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHZhbHVlIGlzIGFuIGludGVnZXIgSFRUUCBzdGF0dXMgY29kZSwgc3VjaCBhcyA0MDEgKFVuYXV0aG9yaXplZCksCi0gICAgICogNDA0IChOb3QgRm91bmQpLCBvciA1MDAgKFNlcnZlciBFcnJvciksIG9yIDAgaWYgbm9uZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfSFRUUF9TVEFUVVNfQ09ERSA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5zdGF0dXMuZXh0cmEuSFRUUF9TVEFUVVNfQ09ERSI7Ci0KLSAgICAvKioKLSAgICAgKiBCdW5kbGUgZXh0cmE6IEhUVFAgcmVzcG9uc2UgaGVhZGVycy4KLSAgICAgKiA8cD4KLSAgICAgKiBTcGVjaWZpZXMgdGhlIEhUVFAgcmVzcG9uc2UgaGVhZGVycyB0aGF0IHdlcmUgcmV0dXJuZWQgd2hlbiB0aGUgY29udGVudCB3YXMKLSAgICAgKiByZXF1ZXN0ZWQgZnJvbSB0aGUgbmV0d29yay4gIFRoZSBoZWFkZXJzIG1heSBpbmNsdWRlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICAgKiBhYm91dCB0aGUgY29udGVudCBvciBhbnkgZXJyb3JzIGNvbmRpdGlvbnMgdGhhdCB3ZXJlIGVuY291bnRlcmVkIHdoaWxlCi0gICAgICogdHJ5aW5nIHRvIGZldGNoIHRoZSBjb250ZW50LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgdmFsdWUgaXMgYSB7QGxpbmsgYW5kcm9pZC5vcy5CdW5kbGV9IG9mIHN0cmluZyBiYXNlZCBrZXktdmFsdWUgcGFpcnMKLSAgICAgKiB0aGF0IGRlc2NyaWJlIHRoZSBIVFRQIHJlc3BvbnNlIGhlYWRlcnMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX0hUVFBfUkVTUE9OU0VfSEVBREVSUyA9Ci0gICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5zdGF0dXMuZXh0cmEuSFRUUF9SRVNQT05TRV9IRUFERVJTIjsKLQotICAgIE1lZGlhSXRlbVN0YXR1cyhCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCi0gICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHN0YXR1cyB0aW1lc3RhbXAgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWUoKX0gdGltZSBiYXNlLgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldFRpbWVzdGFtcCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhLRVlfVElNRVNUQU1QKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwbGF5YmFjayBzdGF0ZSBvZiB0aGUgbWVkaWEgaXRlbS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHBsYXliYWNrIHN0YXRlLiAgT25lIG9mIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfUEVORElOR30sCi0gICAgICoge0BsaW5rICNQTEFZQkFDS19TVEFURV9QTEFZSU5HfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9QQVVTRUR9LAotICAgICAqIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HfSwge0BsaW5rICNQTEFZQkFDS19TVEFURV9GSU5JU0hFRH0sCi0gICAgICoge0BsaW5rICNQTEFZQkFDS19TVEFURV9DQU5DRUxFRH0sIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfSU5WQUxJREFURUR9LAotICAgICAqIG9yIHtAbGluayAjUExBWUJBQ0tfU1RBVEVfRVJST1J9LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tTdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9QTEFZQkFDS19TVEFURSwgUExBWUJBQ0tfU1RBVEVfRVJST1IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gYXMgYSBsb25nIGludGVnZXIgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcwotICAgICAqIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgY29udGVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnQgcGxheWJhY2sgcG9zaXRpb24gaW4gbWlsbGlzZWNvbmRzLCBvciAtMSBpZiB1bmtub3duLgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldENvbnRlbnRQb3NpdGlvbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhLRVlfQ09OVEVOVF9QT1NJVElPTiwgLTEpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRvdGFsIGR1cmF0aW9uIG9mIHRoZSBjb250ZW50IHRvIGJlIHBsYXllZCBhcyBhIGxvbmcgaW50ZWdlciBudW1iZXIgb2YKLSAgICAgKiBtaWxsaXNlY29uZHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50IGR1cmF0aW9uIGluIG1pbGxpc2Vjb25kcywgb3IgLTEgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXRDb250ZW50RHVyYXRpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldExvbmcoS0VZX0NPTlRFTlRfRFVSQVRJT04sIC0xKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyBzdGF0dXMgb2JqZWN0LgotICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIk1lZGlhSXRlbVN0YXR1c3sgIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoInRpbWVzdGFtcD0iKTsKLSAgICAgICAgVGltZVV0aWxzLmZvcm1hdER1cmF0aW9uKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpIC0gZ2V0VGltZXN0YW1wKCksIHJlc3VsdCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiBtcyBhZ28iKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBwbGF5YmFja1N0YXRlPSIpLmFwcGVuZChwbGF5YmFja1N0YXRlVG9TdHJpbmcoZ2V0UGxheWJhY2tTdGF0ZSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29udGVudFBvc2l0aW9uPSIpLmFwcGVuZChnZXRDb250ZW50UG9zaXRpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgY29udGVudER1cmF0aW9uPSIpLmFwcGVuZChnZXRDb250ZW50RHVyYXRpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgZXh0cmFzPSIpLmFwcGVuZChnZXRFeHRyYXMoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgcGxheWJhY2tTdGF0ZVRvU3RyaW5nKGludCBwbGF5YmFja1N0YXRlKSB7Ci0gICAgICAgIHN3aXRjaCAocGxheWJhY2tTdGF0ZSkgewotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9QRU5ESU5HOgotICAgICAgICAgICAgICAgIHJldHVybiAicGVuZGluZyI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0JVRkZFUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gImJ1ZmZlcmluZyI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJwbGF5aW5nIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgICAgIHJldHVybiAicGF1c2VkIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfRklOSVNIRUQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJmaW5pc2hlZCI7Ci0gICAgICAgICAgICBjYXNlIFBMQVlCQUNLX1NUQVRFX0NBTkNFTEVEOgotICAgICAgICAgICAgICAgIHJldHVybiAiY2FuY2VsZWQiOwotICAgICAgICAgICAgY2FzZSBQTEFZQkFDS19TVEFURV9JTlZBTElEQVRFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWRhdGVkIjsKLSAgICAgICAgICAgIGNhc2UgUExBWUJBQ0tfU1RBVEVfRVJST1I6Ci0gICAgICAgICAgICAgICAgcmV0dXJuICJlcnJvciI7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIEludGVnZXIudG9TdHJpbmcocGxheWJhY2tTdGF0ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFJdGVtU3RhdHVzIGZyb21CdW5kbGUoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFJdGVtU3RhdHVzKGJ1bmRsZSkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYUl0ZW1TdGF0dXMgbWVkaWEgaXRlbSBzdGF0dXMgb2JqZWN0c30uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIGl0ZW0gc3RhdHVzIGJ1aWxkZXIgdXNpbmcgdGhlIGN1cnJlbnQgdGltZSBhcyB0aGUKLSAgICAgICAgICogcmVmZXJlbmNlIHRpbWVzdGFtcC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHBsYXliYWNrU3RhdGUgVGhlIGl0ZW0gcGxheWJhY2sgc3RhdGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihpbnQgcGxheWJhY2tTdGF0ZSkgewotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIHNldFRpbWVzdGFtcChTeXN0ZW1DbG9jay5lbGFwc2VkUmVhbHRpbWUoKSk7Ci0gICAgICAgICAgICBzZXRQbGF5YmFja1N0YXRlKHBsYXliYWNrU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBpdGVtIHN0YXR1cyBidWlsZGVyIHdob3NlIGluaXRpYWwgY29udGVudHMgYXJlCi0gICAgICAgICAqIGNvcGllZCBmcm9tIGFuIGV4aXN0aW5nIHN0YXR1cy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhSXRlbVN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN0YXR1cyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKHN0YXR1cy5tQnVuZGxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB0aW1lc3RhbXAgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0dXMgaW5mb3JtYXRpb24gaW4KLSAgICAgICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFRpbWVzdGFtcChsb25nIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKEtFWV9USU1FU1RBTVAsIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBwbGF5YmFjayBzdGF0ZSBvZiB0aGUgbWVkaWEgaXRlbS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBsYXliYWNrU3RhdGUoaW50IHBsYXliYWNrU3RhdGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9QTEFZQkFDS19TVEFURSwgcGxheWJhY2tTdGF0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBjb250ZW50IHBsYXliYWNrIHBvc2l0aW9uIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlciBvZiBtaWxsaXNlY29uZHMKLSAgICAgICAgICogZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjb250ZW50LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29udGVudFBvc2l0aW9uKGxvbmcgcG9zaXRpb25NaWxsaXNlY29uZHMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0TG9uZyhLRVlfQ09OVEVOVF9QT1NJVElPTiwgcG9zaXRpb25NaWxsaXNlY29uZHMpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdG90YWwgZHVyYXRpb24gb2YgdGhlIGNvbnRlbnQgdG8gYmUgcGxheWVkIGFzIGEgbG9uZyBpbnRlZ2VyIG51bWJlcgotICAgICAgICAgKiBvZiBtaWxsaXNlY29uZHMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDb250ZW50RHVyYXRpb24obG9uZyBkdXJhdGlvbk1pbGxpc2Vjb25kcykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKEtFWV9DT05URU5UX0RVUkFUSU9OLCBkdXJhdGlvbk1pbGxpc2Vjb25kcyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyBzdGF0dXMgb2JqZWN0LgotICAgICAgICAgKiBUaGUgZXh0cmFzIHdpbGwgYmUgaWdub3JlZCBieSB0aGUgbWVkaWEgcm91dGVyIGJ1dCB0aGV5IG1heSBiZSB1c2VkCi0gICAgICAgICAqIGJ5IGFwcGxpY2F0aW9ucy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEV4dHJhcyhCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJ1bmRsZShLRVlfRVhUUkFTLCBleHRyYXMpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQnVpbGRzIHRoZSB7QGxpbmsgTWVkaWFJdGVtU3RhdHVzIG1lZGlhIGl0ZW0gc3RhdHVzIG9iamVjdH0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWVkaWFJdGVtU3RhdHVzIGJ1aWxkKCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW1TdGF0dXMobUJ1bmRsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURlc2NyaXB0b3IuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlRGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmM4NGZjLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRTZW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQudGV4dC5UZXh0VXRpbHM7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgcHJvcGVydGllcyBvZiBhIHJvdXRlLgotICogPHA+Ci0gKiBFYWNoIHJvdXRlIGlzIHVuaXF1ZWx5IGlkZW50aWZpZWQgYnkgYW4gb3BhcXVlIGlkIHN0cmluZy4gIFRoaXMgdG9rZW4KLSAqIG1heSB0YWtlIGFueSBmb3JtIGFzIGxvbmcgYXMgaXQgaXMgdW5pcXVlIHdpdGhpbiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkIHVzaW5nIGEge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZURlc2NyaXB0b3IgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0lEID0gImlkIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9HUk9VUF9NRU1CRVJfSURTID0gImdyb3VwTWVtYmVySWRzIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9OQU1FID0gIm5hbWUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFU0NSSVBUSU9OID0gInN0YXR1cyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfSUNPTl9VUkkgPSAiaWNvblVyaSI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRU5BQkxFRCA9ICJlbmFibGVkIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05ORUNUSU5HID0gImNvbm5lY3RpbmciOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTk5FQ1RJT05fU1RBVEUgPSAiY29ubmVjdGlvblN0YXRlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9DT05UUk9MX0ZJTFRFUlMgPSAiY29udHJvbEZpbHRlcnMiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BMQVlCQUNLX1RZUEUgPSAicGxheWJhY2tUeXBlIjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9QTEFZQkFDS19TVFJFQU0gPSAicGxheWJhY2tTdHJlYW0iOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0RFVklDRV9UWVBFID0gImRldmljZVR5cGUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZPTFVNRSA9ICJ2b2x1bWUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1ZPTFVNRV9NQVggPSAidm9sdW1lTWF4IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9WT0xVTUVfSEFORExJTkcgPSAidm9sdW1lSGFuZGxpbmciOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1BSRVNFTlRBVElPTl9ESVNQTEFZX0lEID0gInByZXNlbnRhdGlvbkRpc3BsYXlJZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVhUUkFTID0gImV4dHJhcyI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQ0FOX0RJU0NPTk5FQ1QgPSAiY2FuRGlzY29ubmVjdCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VUVElOR1NfSU5URU5UID0gInNldHRpbmdzSW50ZW50IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9NSU5fQ0xJRU5UX1ZFUlNJT04gPSAibWluQ2xpZW50VmVyc2lvbiI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfTUFYX0NMSUVOVF9WRVJTSU9OID0gIm1heENsaWVudFZlcnNpb24iOwotCi0gICAgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0gICAgTGlzdDxJbnRlbnRGaWx0ZXI+IG1Db250cm9sRmlsdGVyczsKLQotICAgIE1lZGlhUm91dGVEZXNjcmlwdG9yKEJ1bmRsZSBidW5kbGUsIExpc3Q8SW50ZW50RmlsdGVyPiBjb250cm9sRmlsdGVycykgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgICAgICBtQ29udHJvbEZpbHRlcnMgPSBjb250cm9sRmlsdGVyczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSByb3V0ZSBpZCBhc3NvY2lhdGVkIHdpdGggYSByb3V0ZSBkZXNjcmlwdG9yIGZ1bmN0aW9ucyBhcyBhIHN0YWJsZQotICAgICAqIGlkZW50aWZpZXIgZm9yIHRoZSByb3V0ZSBhbmQgbXVzdCBiZSB1bmlxdWUgYW1vbmcgYWxsIHJvdXRlcyBvZmZlcmVkCi0gICAgICogYnkgdGhlIHByb3ZpZGVyLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldElkKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRTdHJpbmcoS0VZX0lEKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBncm91cCBtZW1iZXIgaWRzIG9mIHRoZSByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBBIHJvdXRlIGRlc2NyaXB0b3IgdGhhdCBoYXMgb25lIG9yIG1vcmUgZ3JvdXAgbWVtYmVyIHJvdXRlIGlkcwotICAgICAqIHJlcHJlc2VudHMgYSByb3V0ZSBncm91cC4gQSBtZW1iZXIgcm91dGUgbWF5IGJlbG9uZyB0byBhbm90aGVyIGdyb3VwLgotICAgICAqIDwvcD4KLSAgICAgKiBAaGlkZQotICAgICAqLwotICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRHcm91cE1lbWJlcklkcygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0U3RyaW5nQXJyYXlMaXN0KEtFWV9HUk9VUF9NRU1CRVJfSURTKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGUgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJvdXRlIG5hbWUgaWRlbnRpZmllcyB0aGUgZGVzdGluYXRpb24gcmVwcmVzZW50ZWQgYnkgdGhlIHJvdXRlLgotICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgbmFtZSwgYW4gYWxpYXMsIG9yIGRldmljZSBzZXJpYWwgbnVtYmVyLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldFN0cmluZyhLRVlfTkFNRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdXNlci12aXNpYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcm91dGUgZGVzY3JpcHRpb24gZGVzY3JpYmVzIHRoZSBraW5kIG9mIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KLSAgICAgKiBJdCBtYXkgYmUgYSB1c2VyLXN1cHBsaWVkIHN0cmluZywgYSBtb2RlbCBudW1iZXIgb3IgYnJhbmQgb2YgZGV2aWNlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRTdHJpbmcoS0VZX0RFU0NSSVBUSU9OKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpY29uIHdpbGwgYmUgdXNlZCBpbiBwaWNrZXIgVUlzIGlmIGF2YWlsYWJsZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIFVyaSBnZXRJY29uVXJpKCkgewotICAgICAgICBTdHJpbmcgaWNvblVyaSA9IG1CdW5kbGUuZ2V0U3RyaW5nKEtFWV9JQ09OX1VSSSk7Ci0gICAgICAgIHJldHVybiBpY29uVXJpID09IG51bGwgPyBudWxsIDogVXJpLnBhcnNlKGljb25VcmkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciB0aGUgcm91dGUgaXMgZW5hYmxlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VuYWJsZWQoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJvb2xlYW4oS0VZX0VOQUJMRUQsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciB0aGUgcm91dGUgaXMgY29ubmVjdGluZy4KLSAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNnZXRDb25uZWN0aW9uU3RhdGV9IGluc3RlYWQKLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGluZygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfQ09OTkVDVElORywgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgdGhlIHJvdXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGlzIHJvdXRlOgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUR9LAotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HfSwgb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENvbm5lY3Rpb25TdGF0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9DT05ORUNUSU9OX1NUQVRFLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mby5DT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBjYW4gYmUgZGlzY29ubmVjdGVkIHdpdGhvdXQgc3RvcHBpbmcgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJvdXRlIGNhbiBub3JtYWxseSBiZSBkaXNjb25uZWN0ZWQgd2l0aG91dCBzdG9wcGluZyBwbGF5YmFjayB3aGVuCi0gICAgICogdGhlIGRlc3RpbmF0aW9uIGRldmljZSBvbiB0aGUgcm91dGUgaXMgY29ubmVjdGVkIHRvIHR3byBvciBtb3JlIHNvdXJjZQotICAgICAqIGRldmljZXMuIFRoZSByb3V0ZSBwcm92aWRlciBzaG91bGQgdXBkYXRlIHRoZSByb3V0ZSBpbW1lZGlhdGVseSB3aGVuIHRoZQotICAgICAqIG51bWJlciBvZiBjb25uZWN0ZWQgZGV2aWNlcyBjaGFuZ2VzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUbyBzcGVjaWZ5IHRoYXQgdGhlIHJvdXRlIHNob3VsZCBkaXNjb25uZWN0IHdpdGhvdXQgc3RvcHBpbmcgdXNlCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyI3Vuc2VsZWN0KGludCl9IHdpdGgKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRH0uCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGNhbkRpc2Nvbm5lY3RBbmRLZWVwUGxheWluZygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfQ0FOX0RJU0NPTk5FQ1QsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGFuIHtAbGluayBJbnRlbnRTZW5kZXJ9IGZvciBzdGFydGluZyBhIHNldHRpbmdzIGFjdGl2aXR5IGZvciB0aGlzCi0gICAgICogcm91dGUuIFRoZSBhY3Rpdml0eSBtYXkgaGF2ZSBzcGVjaWZpYyByb3V0ZSBzZXR0aW5ncyBvciBnZW5lcmFsIHNldHRpbmdzCi0gICAgICogZm9yIHRoZSBjb25uZWN0ZWQgZGV2aWNlIG9yIHJvdXRlIHByb3ZpZGVyLgotICAgICAqCi0gICAgICogQHJldHVybiBBbiB7QGxpbmsgSW50ZW50U2VuZGVyfSB0byBzdGFydCBhIHNldHRpbmdzIGFjdGl2aXR5LgotICAgICAqLwotICAgIHB1YmxpYyBJbnRlbnRTZW5kZXIgZ2V0U2V0dGluZ3NBY3Rpdml0eSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0UGFyY2VsYWJsZShLRVlfU0VUVElOR1NfSU5URU5UKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSByb3V0ZSdzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9IGZpbHRlcnMuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8SW50ZW50RmlsdGVyPiBnZXRDb250cm9sRmlsdGVycygpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbEZpbHRlcnMoKTsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sRmlsdGVyczsKLSAgICB9Ci0KLSAgICB2b2lkIGVuc3VyZUNvbnRyb2xGaWx0ZXJzKCkgewotICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgIG1Db250cm9sRmlsdGVycyA9IG1CdW5kbGUuPEludGVudEZpbHRlcj5nZXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9DT05UUk9MX0ZJTFRFUlMpOwotICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzID0gQ29sbGVjdGlvbnMuPEludGVudEZpbHRlcj5lbXB0eUxpc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHR5cGUgb2YgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHBsYXliYWNrIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlOgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVFlQRV9MT0NBTH0gb3IKLSAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1RZUEVfUkVNT1RFfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFBsYXliYWNrVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9QTEFZQkFDS19UWVBFLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8uUExBWUJBQ0tfVFlQRV9SRU1PVEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgcGxheWJhY2sgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0UGxheWJhY2tTdHJlYW0oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfUExBWUJBQ0tfU1RSRUFNLCAtMSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlOgotICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jREVWSUNFX1RZUEVfVFZ9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNERVZJQ0VfVFlQRV9TUEVBS0VSfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldERldmljZVR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfREVWSUNFX1RZUEUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgY3VycmVudCB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZvbHVtZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9WT0xVTUUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgbWF4aW11bSB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFZvbHVtZU1heCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0SW50KEtFWV9WT0xVTUVfTUFYKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IGhvdyB2b2x1bWUgaXMgaGFuZGxlZCBvbiB0aGUgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIEhvdyB2b2x1bWUgaXMgaGFuZGxlZCBvbiB0aGUgcm91dGU6Ci0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfRklYRUR9IG9yCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Vm9sdW1lSGFuZGxpbmcoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfVk9MVU1FX0hBTkRMSU5HLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfRklYRUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgaWQsIG9yIC0xIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludCgKLSAgICAgICAgICAgICAgICBLRVlfUFJFU0VOVEFUSU9OX0RJU1BMQVlfSUQsIE1lZGlhUm91dGVyLlJvdXRlSW5mby5QUkVTRU5UQVRJT05fRElTUExBWV9JRF9OT05FKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgYnVuZGxlIG9mIGV4dHJhcyBmb3IgdGhpcyByb3V0ZSBkZXNjcmlwdG9yLgotICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBnZXRFeHRyYXMoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEJ1bmRsZShLRVlfRVhUUkFTKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtaW5pbXVtIGNsaWVudCB2ZXJzaW9uIHJlcXVpcmVkIGZvciB0aGlzIHJvdXRlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICBwdWJsaWMgaW50IGdldE1pbkNsaWVudFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfTUlOX0NMSUVOVF9WRVJTSU9OLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9WRVJTSU9OX1NUQVJUKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtYXhpbXVtIGNsaWVudCB2ZXJzaW9uIHJlcXVpcmVkIGZvciB0aGlzIHJvdXRlLgotICAgICAqIEBoaWRlCi0gICAgICovCi0gICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICBwdWJsaWMgaW50IGdldE1heENsaWVudFZlcnNpb24oKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlLmdldEludChLRVlfTUFYX0NMSUVOVF9WRVJTSU9OLCBJbnRlZ2VyLk1BWF9WQUxVRSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBkZXNjcmlwdG9yIGhhcyBhbGwgb2YgdGhlIHJlcXVpcmVkIGZpZWxkcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkKCkgewotICAgICAgICBlbnN1cmVDb250cm9sRmlsdGVycygpOwotICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZ2V0SWQoKSkKLSAgICAgICAgICAgICAgICB8fCBUZXh0VXRpbHMuaXNFbXB0eShnZXROYW1lKCkpCi0gICAgICAgICAgICAgICAgfHwgbUNvbnRyb2xGaWx0ZXJzLmNvbnRhaW5zKG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYVJvdXRlRGVzY3JpcHRvcnsgIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoImlkPSIpLmFwcGVuZChnZXRJZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBncm91cE1lbWJlcklkcz0iKS5hcHBlbmQoZ2V0R3JvdXBNZW1iZXJJZHMoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbmFtZT0iKS5hcHBlbmQoZ2V0TmFtZSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBkZXNjcmlwdGlvbj0iKS5hcHBlbmQoZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaWNvblVyaT0iKS5hcHBlbmQoZ2V0SWNvblVyaSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc0VuYWJsZWQ9IikuYXBwZW5kKGlzRW5hYmxlZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc0Nvbm5lY3Rpbmc9IikuYXBwZW5kKGlzQ29ubmVjdGluZygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjb25uZWN0aW9uU3RhdGU9IikuYXBwZW5kKGdldENvbm5lY3Rpb25TdGF0ZSgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBjb250cm9sRmlsdGVycz0iKS5hcHBlbmQoQXJyYXlzLnRvU3RyaW5nKGdldENvbnRyb2xGaWx0ZXJzKCkudG9BcnJheSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcGxheWJhY2tUeXBlPSIpLmFwcGVuZChnZXRQbGF5YmFja1R5cGUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgcGxheWJhY2tTdHJlYW09IikuYXBwZW5kKGdldFBsYXliYWNrU3RyZWFtKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGRldmljZVR5cGU9IikuYXBwZW5kKGdldERldmljZVR5cGUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdm9sdW1lPSIpLmFwcGVuZChnZXRWb2x1bWUoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdm9sdW1lTWF4PSIpLmFwcGVuZChnZXRWb2x1bWVNYXgoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgdm9sdW1lSGFuZGxpbmc9IikuYXBwZW5kKGdldFZvbHVtZUhhbmRsaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHByZXNlbnRhdGlvbkRpc3BsYXlJZD0iKS5hcHBlbmQoZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGV4dHJhcz0iKS5hcHBlbmQoZ2V0RXh0cmFzKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGlzVmFsaWQ9IikuYXBwZW5kKGlzVmFsaWQoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgbWluQ2xpZW50VmVyc2lvbj0iKS5hcHBlbmQoZ2V0TWluQ2xpZW50VmVyc2lvbigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBtYXhDbGllbnRWZXJzaW9uPSIpLmFwcGVuZChnZXRNYXhDbGllbnRWZXJzaW9uKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZURlc2NyaXB0b3IgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvcihidW5kbGUsIG51bGwpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbWVkaWEgcm91dGUgZGVzY3JpcHRvcnN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0gICAgICAgIHByaXZhdGUgQXJyYXlMaXN0PFN0cmluZz4gbUdyb3VwTWVtYmVySWRzOwotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IG1Db250cm9sRmlsdGVyczsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIGRlc2NyaXB0b3IgYnVpbGRlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGlkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdXNlci12aXNpYmxlIG5hbWUgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoU3RyaW5nIGlkLCBTdHJpbmcgbmFtZSkgewotICAgICAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIHNldElkKGlkKTsKLSAgICAgICAgICAgIHNldE5hbWUobmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIGRlc2NyaXB0b3IgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBkZXNjcmlwdG9yLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoTWVkaWFSb3V0ZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImRlc2NyaXB0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZShkZXNjcmlwdG9yLm1CdW5kbGUpOwotCi0gICAgICAgICAgICBkZXNjcmlwdG9yLmVuc3VyZUNvbnRyb2xGaWx0ZXJzKCk7Ci0gICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3IubUNvbnRyb2xGaWx0ZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8SW50ZW50RmlsdGVyPihkZXNjcmlwdG9yLm1Db250cm9sRmlsdGVycyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByb3V0ZSBpZCBhc3NvY2lhdGVkIHdpdGggYSByb3V0ZSBkZXNjcmlwdG9yIGZ1bmN0aW9ucyBhcyBhIHN0YWJsZQotICAgICAgICAgKiBpZGVudGlmaWVyIGZvciB0aGUgcm91dGUgYW5kIG11c3QgYmUgdW5pcXVlIGFtb25nIGFsbCByb3V0ZXMgb2ZmZXJlZAotICAgICAgICAgKiBieSB0aGUgcHJvdmlkZXIuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldElkKFN0cmluZyBpZCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoS0VZX0lELCBpZCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEgZ3JvdXAgbWVtYmVyIGlkIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIEEgcm91dGUgZGVzY3JpcHRvciB0aGF0IGhhcyBvbmUgb3IgbW9yZSBncm91cCBtZW1iZXIgcm91dGUgaWRzCi0gICAgICAgICAqIHJlcHJlc2VudHMgYSByb3V0ZSBncm91cC4gQSBtZW1iZXIgcm91dGUgbWF5IGJlbG9uZyB0byBhbm90aGVyIGdyb3VwLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqIEBoaWRlCi0gICAgICAgICAqLwotICAgICAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRHcm91cE1lbWJlcklkKFN0cmluZyBncm91cE1lbWJlcklkKSB7Ci0gICAgICAgICAgICBpZiAoVGV4dFV0aWxzLmlzRW1wdHkoZ3JvdXBNZW1iZXJJZCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJncm91cE1lbWJlcklkIG11c3Qgbm90IGJlIGVtcHR5Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJJZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1Hcm91cE1lbWJlcklkcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFtR3JvdXBNZW1iZXJJZHMuY29udGFpbnMoZ3JvdXBNZW1iZXJJZCkpIHsKLSAgICAgICAgICAgICAgICBtR3JvdXBNZW1iZXJJZHMuYWRkKGdyb3VwTWVtYmVySWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIGxpc3Qgb2YgZ3JvdXAgbWVtYmVyIGlkcyBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBBIHJvdXRlIGRlc2NyaXB0b3IgdGhhdCBoYXMgb25lIG9yIG1vcmUgZ3JvdXAgbWVtYmVyIHJvdXRlIGlkcwotICAgICAgICAgKiByZXByZXNlbnRzIGEgcm91dGUgZ3JvdXAuIEEgbWVtYmVyIHJvdXRlIG1heSBiZWxvbmcgdG8gYW5vdGhlciBncm91cC4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkR3JvdXBNZW1iZXJJZHMoQ29sbGVjdGlvbjxTdHJpbmc+IGdyb3VwTWVtYmVySWRzKSB7Ci0gICAgICAgICAgICBpZiAoZ3JvdXBNZW1iZXJJZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImdyb3VwTWVtYmVySWRzIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFncm91cE1lbWJlcklkcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBncm91cE1lbWJlcklkIDogZ3JvdXBNZW1iZXJJZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkR3JvdXBNZW1iZXJJZChncm91cE1lbWJlcklkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB1c2VyLXZpc2libGUgbmFtZSBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcm91dGUgbmFtZSBpZGVudGlmaWVzIHRoZSBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgbmFtZSwgYW4gYWxpYXMsIG9yIGRldmljZSBzZXJpYWwgbnVtYmVyLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXROYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dFN0cmluZyhLRVlfTkFNRSwgbmFtZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB1c2VyLXZpc2libGUgZGVzY3JpcHRpb24gb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJvdXRlIGRlc2NyaXB0aW9uIGRlc2NyaWJlcyB0aGUga2luZCBvZiBkZXN0aW5hdGlvbiByZXByZXNlbnRlZCBieSB0aGUgcm91dGUuCi0gICAgICAgICAqIEl0IG1heSBiZSBhIHVzZXItc3VwcGxpZWQgc3RyaW5nLCBhIG1vZGVsIG51bWJlciBvciBicmFuZCBvZiBkZXZpY2UuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERlc2NyaXB0aW9uKFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRTdHJpbmcoS0VZX0RFU0NSSVBUSU9OLCBkZXNjcmlwdGlvbik7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIGljb24gd2lsbCBiZSB1c2VkIGluIHBpY2tlciBVSXMgaWYgYXZhaWxhYmxlLgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoZSBVUkkgbXVzdCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyBmb3JtYXRzOgotICAgICAgICAgKiA8dWw+Ci0gICAgICAgICAqIDxsaT5jb250ZW50ICh7QGxpbmsgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlciNTQ0hFTUVfQ09OVEVOVH0pPC9saT4KLSAgICAgICAgICogPGxpPmFuZHJvaWQucmVzb3VyY2UgKHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI1NDSEVNRV9BTkRST0lEX1JFU09VUkNFfSkKLSAgICAgICAgICogPC9saT4KLSAgICAgICAgICogPGxpPmZpbGUgKHtAbGluayBhbmRyb2lkLmNvbnRlbnQuQ29udGVudFJlc29sdmVyI1NDSEVNRV9GSUxFfSk8L2xpPgotICAgICAgICAgKiA8L3VsPgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRJY29uVXJpKFVyaSBpY29uVXJpKSB7Ci0gICAgICAgICAgICBpZiAoaWNvblVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaWNvblVyaSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dFN0cmluZyhLRVlfSUNPTl9VUkksIGljb25VcmkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHdoZXRoZXIgdGhlIHJvdXRlIGlzIGVuYWJsZWQuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBEaXNhYmxlZCByb3V0ZXMgcmVwcmVzZW50IHJvdXRlcyB0aGF0IGEgcm91dGUgcHJvdmlkZXIga25vd3MgYWJvdXQsIHN1Y2ggYXMgcGFpcmVkCi0gICAgICAgICAqIFdpZmkgRGlzcGxheSByZWNlaXZlcnMsIGJ1dCB0aGF0IGFyZSBub3QgY3VycmVudGx5IGF2YWlsYWJsZSBmb3IgdXNlLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFbmFibGVkKGJvb2xlYW4gZW5hYmxlZCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9FTkFCTEVELCBlbmFibGVkKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgd2hldGhlciB0aGUgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZyBhbmQgaXMgbm90IHlldAotICAgICAgICAgKiByZWFkeSBmb3IgdXNlLgotICAgICAgICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNzZXRDb25uZWN0aW9uU3RhdGV9IGluc3RlYWQuCi0gICAgICAgICAqLwotICAgICAgICBARGVwcmVjYXRlZAotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDb25uZWN0aW5nKGJvb2xlYW4gY29ubmVjdGluZykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9DT05ORUNUSU5HLCBjb25uZWN0aW5nKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgY29ubmVjdGlvbiBzdGF0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNvbm5lY3Rpb25TdGF0ZSBUaGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGUgcm91dGU6Ci0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUR9LAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElOR30sIG9yCi0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jQ09OTkVDVElPTl9TVEFURV9DT05ORUNURUR9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Q29ubmVjdGlvblN0YXRlKGludCBjb25uZWN0aW9uU3RhdGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9DT05ORUNUSU9OX1NUQVRFLCBjb25uZWN0aW9uU3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSByb3V0ZSBjYW4gYmUgZGlzY29ubmVjdGVkIHdpdGhvdXQgc3RvcHBpbmcgcGxheWJhY2suCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRDYW5EaXNjb25uZWN0KGJvb2xlYW4gY2FuRGlzY29ubmVjdCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCb29sZWFuKEtFWV9DQU5fRElTQ09OTkVDVCwgY2FuRGlzY29ubmVjdCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIGFuIGludGVudCBzZW5kZXIgZm9yIGxhdW5jaGluZyB0aGUgc2V0dGluZ3MgYWN0aXZpdHkgZm9yIHRoaXMKLSAgICAgICAgICogcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRTZXR0aW5nc0FjdGl2aXR5KEludGVudFNlbmRlciBpcykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRQYXJjZWxhYmxlKEtFWV9TRVRUSU5HU19JTlRFTlQsIGlzKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fSBmaWx0ZXIgZm9yIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENvbnRyb2xGaWx0ZXIoSW50ZW50RmlsdGVyIGZpbHRlcikgewotICAgICAgICAgICAgaWYgKGZpbHRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZmlsdGVyIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzID0gbmV3IEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW1Db250cm9sRmlsdGVycy5jb250YWlucyhmaWx0ZXIpKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xGaWx0ZXJzLmFkZChmaWx0ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGludGVudH0gZmlsdGVycyBmb3IgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ29udHJvbEZpbHRlcnMoQ29sbGVjdGlvbjxJbnRlbnRGaWx0ZXI+IGZpbHRlcnMpIHsKLSAgICAgICAgICAgIGlmIChmaWx0ZXJzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJmaWx0ZXJzIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFmaWx0ZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoSW50ZW50RmlsdGVyIGZpbHRlciA6IGZpbHRlcnMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkQ29udHJvbEZpbHRlcihmaWx0ZXIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgcGxheWJhY2sgdHlwZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHBsYXliYWNrVHlwZSBUaGUgcGxheWJhY2sgdHlwZSBvZiB0aGUgcm91dGU6Ci0gICAgICAgICAqIHtAbGluayBNZWRpYVJvdXRlci5Sb3V0ZUluZm8jUExBWUJBQ0tfVFlQRV9MT0NBTH0gb3IKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19UWVBFX1JFTU9URX0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRQbGF5YmFja1R5cGUoaW50IHBsYXliYWNrVHlwZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1BMQVlCQUNLX1RZUEUsIHBsYXliYWNrVHlwZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIHBsYXliYWNrIHN0cmVhbS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFBsYXliYWNrU3RyZWFtKGludCBwbGF5YmFja1N0cmVhbSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX1BMQVlCQUNLX1NUUkVBTSwgcGxheWJhY2tTdHJlYW0pOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyByZWNlaXZlciBkZXZpY2UgdHlwZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRldmljZVR5cGUgVGhlIHJlY2VpdmUgZGV2aWNlIHR5cGUgb2YgdGhlIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0RFVklDRV9UWVBFX1RWfSBvcgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI0RFVklDRV9UWVBFX1NQRUFLRVJ9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RGV2aWNlVHlwZShpbnQgZGV2aWNlVHlwZSkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX0RFVklDRV9UWVBFLCBkZXZpY2VUeXBlKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIHJvdXRlJ3MgY3VycmVudCB2b2x1bWUsIG9yIDAgaWYgdW5rbm93bi4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFZvbHVtZShpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfVk9MVU1FLCB2b2x1bWUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyBtYXhpbXVtIHZvbHVtZSwgb3IgMCBpZiB1bmtub3duLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Vm9sdW1lTWF4KGludCB2b2x1bWVNYXgpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9WT0xVTUVfTUFYLCB2b2x1bWVNYXgpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB0aGUgcm91dGUncyB2b2x1bWUgaGFuZGxpbmcuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2b2x1bWVIYW5kbGluZyBob3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlOgotICAgICAgICAgKiB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvI1BMQVlCQUNLX1ZPTFVNRV9GSVhFRH0gb3IKLSAgICAgICAgICoge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlSW5mbyNQTEFZQkFDS19WT0xVTUVfVkFSSUFCTEV9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0Vm9sdW1lSGFuZGxpbmcoaW50IHZvbHVtZUhhbmRsaW5nKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEludChLRVlfVk9MVU1FX0hBTkRMSU5HLCB2b2x1bWVIYW5kbGluZyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIHByZXNlbnRhdGlvbiBkaXNwbGF5IGlkLCBvciAtMSBpZiBub25lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKGludCBwcmVzZW50YXRpb25EaXNwbGF5SWQpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9QUkVTRU5UQVRJT05fRElTUExBWV9JRCwgcHJlc2VudGF0aW9uRGlzcGxheUlkKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgYSBidW5kbGUgb2YgZXh0cmFzIGZvciB0aGlzIHJvdXRlIGRlc2NyaXB0b3IuCi0gICAgICAgICAqIFRoZSBleHRyYXMgd2lsbCBiZSBpZ25vcmVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgYnV0IHRoZXkgbWF5IGJlIHVzZWQKLSAgICAgICAgICogYnkgYXBwbGljYXRpb25zLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0RXh0cmFzKEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKEtFWV9FWFRSQVMsIGV4dHJhcyk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIG1pbmltdW0gY2xpZW50IHZlcnNpb24uCi0gICAgICAgICAqIEEgcm91dGVyIHdob3NlIHZlcnNpb24gaXMgbG93ZXIgdGhhbiB0aGlzIHdpbGwgbm90IGJlIGFibGUgdG8gY29ubmVjdCB0byB0aGlzIHJvdXRlLgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0TWluQ2xpZW50VmVyc2lvbihpbnQgbWluVmVyc2lvbikgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRJbnQoS0VZX01JTl9DTElFTlRfVkVSU0lPTiwgbWluVmVyc2lvbik7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSByb3V0ZSdzIG1heGltdW0gY2xpZW50IHZlcnNpb24uCi0gICAgICAgICAqIEEgcm91dGVyIHdob3NlIHZlcnNpb24gaXMgaGlnaGVyIHRoYW4gdGhpcyB3aWxsIG5vdCBiZSBhYmxlIHRvIGNvbm5lY3QgdG8gdGhpcyByb3V0ZS4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldE1heENsaWVudFZlcnNpb24oaW50IG1heFZlcnNpb24pIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9NQVhfQ0xJRU5UX1ZFUlNJT04sIG1heFZlcnNpb24pOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQnVpbGRzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbWVkaWEgcm91dGUgZGVzY3JpcHRvcn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZURlc2NyaXB0b3IgYnVpbGQoKSB7Ci0gICAgICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQnVuZGxlLnB1dFBhcmNlbGFibGVBcnJheUxpc3QoS0VZX0NPTlRST0xfRklMVEVSUywgbUNvbnRyb2xGaWx0ZXJzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtR3JvdXBNZW1iZXJJZHMgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1CdW5kbGUucHV0U3RyaW5nQXJyYXlMaXN0KEtFWV9HUk9VUF9NRU1CRVJfSURTLCBtR3JvdXBNZW1iZXJJZHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvcihtQnVuZGxlLCBtQ29udHJvbEZpbHRlcnMpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM5NjI3Zi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdCB0aGUgbWVkaWEgcm91dGVyIHdvdWxkIGxpa2UgdG8gZGlzY292ZXIKLSAqIGFuZCB3aGV0aGVyIHRvIHBlcmZvcm0gYWN0aXZlIHNjYW5uaW5nLgotICogPHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VMRUNUT1IgPSAic2VsZWN0b3IiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfQUNUSVZFX1NDQU4gPSAiYWN0aXZlU2NhbiI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVNlbGVjdG9yIG1TZWxlY3RvcjsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgcm91dGUgc2VsZWN0b3IgdGhhdCBzcGVjaWZpZXMgdGhlIGtpbmRzIG9mIHJvdXRlcyB0byBkaXNjb3Zlci4KLSAgICAgKiBAcGFyYW0gYWN0aXZlU2NhbiBUcnVlIGlmIGFjdGl2ZSBzY2FubmluZyBzaG91bGQgYmUgcGVyZm9ybWVkLgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIGJvb2xlYW4gYWN0aXZlU2NhbikgewotICAgICAgICBpZiAoc2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgbVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgIG1CdW5kbGUucHV0QnVuZGxlKEtFWV9TRUxFQ1RPUiwgc2VsZWN0b3IuYXNCdW5kbGUoKSk7Ci0gICAgICAgIG1CdW5kbGUucHV0Qm9vbGVhbihLRVlfQUNUSVZFX1NDQU4sIGFjdGl2ZVNjYW4pOwotICAgIH0KLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QoQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICBtQnVuZGxlID0gYnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHJvdXRlIHNlbGVjdG9yIHRoYXQgc3BlY2lmaWVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdG8gZGlzY292ZXIuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVTZWxlY3RvciBnZXRTZWxlY3RvcigpIHsKLSAgICAgICAgZW5zdXJlU2VsZWN0b3IoKTsKLSAgICAgICAgcmV0dXJuIG1TZWxlY3RvcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZW5zdXJlU2VsZWN0b3IoKSB7Ci0gICAgICAgIGlmIChtU2VsZWN0b3IgPT0gbnVsbCkgewotICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLmZyb21CdW5kbGUobUJ1bmRsZS5nZXRCdW5kbGUoS0VZX1NFTEVDVE9SKSk7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0b3IgPSBNZWRpYVJvdXRlU2VsZWN0b3IuRU1QVFk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgYWN0aXZlIHNjYW5uaW5nIHNob3VsZCBiZSBwZXJmb3JtZWQuCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzQWN0aXZlU2NhbigpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0Qm9vbGVhbihLRVlfQUNUSVZFX1NDQU4pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGlzY292ZXJ5IHJlcXVlc3QgaGFzIGFsbCBvZiB0aGUgcmVxdWlyZWQgZmllbGRzLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIGVuc3VyZVNlbGVjdG9yKCk7Ci0gICAgICAgIHJldHVybiBtU2VsZWN0b3IuaXNWYWxpZCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBvdGhlciA9IChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdClvOwotICAgICAgICAgICAgcmV0dXJuIGdldFNlbGVjdG9yKCkuZXF1YWxzKG90aGVyLmdldFNlbGVjdG9yKCkpCi0gICAgICAgICAgICAgICAgICAgICYmIGlzQWN0aXZlU2NhbigpID09IG90aGVyLmlzQWN0aXZlU2NhbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gZ2V0U2VsZWN0b3IoKS5oYXNoQ29kZSgpIF4gKGlzQWN0aXZlU2NhbigpID8gMSA6IDApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiRGlzY292ZXJ5UmVxdWVzdHsgc2VsZWN0b3I9IikuYXBwZW5kKGdldFNlbGVjdG9yKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIGFjdGl2ZVNjYW49IikuYXBwZW5kKGlzQWN0aXZlU2NhbigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBpc1ZhbGlkPSIpLmFwcGVuZChpc1ZhbGlkKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIgfSIpOwotICAgICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydHMgdGhpcyBvYmplY3QgdG8gYSBidW5kbGUgZm9yIHNlcmlhbGl6YXRpb24uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjb250ZW50cyBvZiB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGFzIGEgYnVuZGxlLgotICAgICAqLwotICAgIHB1YmxpYyBCdW5kbGUgYXNCdW5kbGUoKSB7Ci0gICAgICAgIHJldHVybiBtQnVuZGxlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4gaW5zdGFuY2UgZnJvbSBhIGJ1bmRsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidW5kbGUgVGhlIGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEByZXR1cm4gVGhlIG5ldyBpbnN0YW5jZSwgb3IgbnVsbCBpZiB0aGUgYnVuZGxlIHdhcyBudWxsLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdChidW5kbGUpIDogbnVsbDsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxYTJlMWEuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29tcG9uZW50TmFtZTsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NhZ2U7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuT2JqZWN0c0NvbXBhdDsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjazsKLQotLyoqCi0gKiBNZWRpYSByb3V0ZSBwcm92aWRlcnMgYXJlIHVzZWQgdG8gcHVibGlzaCBhZGRpdGlvbmFsIG1lZGlhIHJvdXRlcyBmb3IKLSAqIHVzZSB3aXRoaW4gYW4gYXBwbGljYXRpb24uICBNZWRpYSByb3V0ZSBwcm92aWRlcnMgbWF5IGFsc28gYmUgZGVjbGFyZWQKLSAqIGFzIGEgc2VydmljZSB0byBwdWJsaXNoIGFkZGl0aW9uYWwgbWVkaWEgcm91dGVzIHRvIGFsbCBhcHBsaWNhdGlvbnMKLSAqIGluIHRoZSBzeXN0ZW0uCi0gKiA8cD4KLSAqIFRoZSBwdXJwb3NlIG9mIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgaXMgdG8gZGlzY292ZXIgbWVkaWEgcm91dGVzIHRoYXQgc2F0aXNmeQotICogdGhlIGNyaXRlcmlhIHNwZWNpZmllZCBieSB0aGUgY3VycmVudCB7QGxpbmsgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3R9IGFuZCBwdWJsaXNoIGEKLSAqIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yfSB3aXRoIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggcm91dGUgYnkgY2FsbGluZwotICoge0BsaW5rICNzZXREZXNjcmlwdG9yfSB0byBub3RpZnkgdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkIHtAbGluayBDYWxsYmFja30uCi0gKiA8L3A+PHA+Ci0gKiBUaGUgcHJvdmlkZXIgc2hvdWxkIHdhdGNoIGZvciBjaGFuZ2VzIHRvIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdCBieSBpbXBsZW1lbnRpbmcKLSAqIHtAbGluayAjb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZH0gYW5kIHVwZGF0aW5nIHRoZSBzZXQgb2Ygcm91dGVzIHRoYXQgaXQgaXMKLSAqIGF0dGVtcHRpbmcgdG8gZGlzY292ZXIuICBJdCBzaG91bGQgYWxzbyBoYW5kbGUgcm91dGUgY29udHJvbCByZXF1ZXN0cyBzdWNoCi0gKiBhcyB2b2x1bWUgY2hhbmdlcyBvciB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50c30KLSAqIGJ5IGltcGxlbWVudGluZyB7QGxpbmsgI29uQ3JlYXRlUm91dGVDb250cm9sbGVyfSB0byByZXR1cm4gYSB7QGxpbmsgUm91dGVDb250cm9sbGVyfQotICogZm9yIGEgcGFydGljdWxhciByb3V0ZS4KLSAqIDwvcD48cD4KLSAqIEEgbWVkaWEgcm91dGUgcHJvdmlkZXIgbWF5IGJlIHVzZWQgcHJpdmF0ZWx5IHdpdGhpbiB0aGUgc2NvcGUgb2YgYSBzaW5nbGUKLSAqIGFwcGxpY2F0aW9uIHByb2Nlc3MgYnkgY2FsbGluZyB7QGxpbmsgTWVkaWFSb3V0ZXIjYWRkUHJvdmlkZXIgTWVkaWFSb3V0ZXIuYWRkUHJvdmlkZXJ9Ci0gKiB0byBhZGQgaXQgdG8gdGhlIGxvY2FsIHtAbGluayBNZWRpYVJvdXRlcn0uICBBIG1lZGlhIHJvdXRlIHByb3ZpZGVyIG1heSBhbHNvIGJlIG1hZGUKLSAqIGF2YWlsYWJsZSBnbG9iYWxseSB0byBhbGwgYXBwbGljYXRpb25zIGJ5IHJlZ2lzdGVyaW5nIGEge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2V9Ci0gKiBpbiB0aGUgcHJvdmlkZXIncyBtYW5pZmVzdC4gIFdoZW4gdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGlzIHJlZ2lzdGVyZWQKLSAqIGFzIGEgc2VydmljZSwgYWxsIGFwcGxpY2F0aW9ucyB0aGF0IHVzZSB0aGUgbWVkaWEgcm91dGVyIEFQSSB3aWxsIGJlIGFibGUgdG8KLSAqIGRpc2NvdmVyIGFuZCB1c2VkIHRoZSBwcm92aWRlcidzIHJvdXRlcyB3aXRob3V0IGhhdmluZyB0byBpbnN0YWxsIGFueXRoaW5nIGVsc2UuCi0gKiA8L3A+PHA+Ci0gKiBUaGlzIG9iamVjdCBtdXN0IG9ubHkgYmUgYWNjZXNzZWQgb24gdGhlIG1haW4gdGhyZWFkLgotICogPC9wPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVkaWFSb3V0ZVByb3ZpZGVyIHsKLSAgICBzdGF0aWMgZmluYWwgaW50IE1TR19ERUxJVkVSX0RFU0NSSVBUT1JfQ0hBTkdFRCA9IDE7Ci0gICAgc3RhdGljIGZpbmFsIGludCBNU0dfREVMSVZFUl9ESVNDT1ZFUllfUkVRVUVTVF9DSEFOR0VEID0gMjsKLQotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyTWV0YWRhdGEgbU1ldGFkYXRhOwotICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJIYW5kbGVyIG1IYW5kbGVyID0gbmV3IFByb3ZpZGVySGFuZGxlcigpOwotCi0gICAgcHJpdmF0ZSBDYWxsYmFjayBtQ2FsbGJhY2s7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1EaXNjb3ZlcnlSZXF1ZXN0OwotICAgIHByaXZhdGUgYm9vbGVhbiBtUGVuZGluZ0Rpc2NvdmVyeVJlcXVlc3RDaGFuZ2U7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgbURlc2NyaXB0b3I7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZXh0IFRoZSBjb250ZXh0LgotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIoQE5vbk51bGwgQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgTWVkaWFSb3V0ZVByb3ZpZGVyKENvbnRleHQgY29udGV4dCwgUHJvdmlkZXJNZXRhZGF0YSBtZXRhZGF0YSkgewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG1Db250ZXh0ID0gY29udGV4dDsKLSAgICAgICAgaWYgKG1ldGFkYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG5ldyBQcm92aWRlck1ldGFkYXRhKG5ldyBDb21wb25lbnROYW1lKGNvbnRleHQsIGdldENsYXNzKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgY29udGV4dCBvZiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIENvbnRleHQgZ2V0Q29udGV4dCgpIHsKLSAgICAgICAgcmV0dXJuIG1Db250ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHByb3ZpZGVyJ3MgaGFuZGxlciB3aGljaCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIG1haW4gdGhyZWFkLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBIYW5kbGVyIGdldEhhbmRsZXIoKSB7Ci0gICAgICAgIHJldHVybiBtSGFuZGxlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHNvbWUgbWV0YWRhdGEgYWJvdXQgdGhlIHByb3ZpZGVyJ3MgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIFByb3ZpZGVyTWV0YWRhdGEgZ2V0TWV0YWRhdGEoKSB7Ci0gICAgICAgIHJldHVybiBtTWV0YWRhdGE7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSBwcm92aWRlcidzIGRlc2NyaXB0b3IgY2hhbmdlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gdXNlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0Q2FsbGJhY2soQE51bGxhYmxlIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIE1lZGlhUm91dGVyLmNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50IGRpc2NvdmVyeSByZXF1ZXN0IHdoaWNoIGluZm9ybXMgdGhlIHByb3ZpZGVyIGFib3V0IHRoZQotICAgICAqIGtpbmRzIG9mIHJvdXRlcyB0byBkaXNjb3ZlciBhbmQgd2hldGhlciB0byBwZXJmb3JtIGFjdGl2ZSBzY2FubmluZy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGN1cnJlbnQgZGlzY292ZXJ5IHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gZGlzY292ZXJ5IGlzIG5lZWRlZCBhdCB0aGlzIHRpbWUuCi0gICAgICoKLSAgICAgKiBAc2VlICNvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkCi0gICAgICovCi0gICAgQE51bGxhYmxlCi0gICAgcHVibGljIGZpbmFsIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IGdldERpc2NvdmVyeVJlcXVlc3QoKSB7Ci0gICAgICAgIHJldHVybiBtRGlzY292ZXJ5UmVxdWVzdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgZGlzY292ZXJ5IHJlcXVlc3QgdG8gaW5mb3JtIHRoZSBwcm92aWRlciBhYm91dCB0aGUga2luZHMgb2YKLSAgICAgKiByb3V0ZXMgdGhhdCBpdHMgY2xpZW50cyB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyIGFuZCB3aGV0aGVyIHRvIHBlcmZvcm0gYWN0aXZlIHNjYW5uaW5nLgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIGRpc2NvdmVyeSByZXF1ZXN0LCBvciBudWxsIGlmIG5vIGRpc2NvdmVyeSBpcyBuZWVkZWQgYXQgdGhpcyB0aW1lLgotICAgICAqCi0gICAgICogQHNlZSAjb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZAotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHNldERpc2NvdmVyeVJlcXVlc3QoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICBNZWRpYVJvdXRlci5jaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoT2JqZWN0c0NvbXBhdC5lcXVhbHMobURpc2NvdmVyeVJlcXVlc3QsIHJlcXVlc3QpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtRGlzY292ZXJ5UmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgICAgIGlmICghbVBlbmRpbmdEaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlKSB7Ci0gICAgICAgICAgICBtUGVuZGluZ0Rpc2NvdmVyeVJlcXVlc3RDaGFuZ2UgPSB0cnVlOwotICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfREVMSVZFUl9ESVNDT1ZFUllfUkVRVUVTVF9DSEFOR0VEKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgZGVsaXZlckRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKCkgewotICAgICAgICBtUGVuZGluZ0Rpc2NvdmVyeVJlcXVlc3RDaGFuZ2UgPSBmYWxzZTsKLSAgICAgICAgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChtRGlzY292ZXJ5UmVxdWVzdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgd2hlbiB0aGUge0BsaW5rIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IGRpc2NvdmVyeSByZXF1ZXN0fQotICAgICAqIGhhcyBjaGFuZ2VkLgotICAgICAqIDxwPgotICAgICAqIFdoZW5ldmVyIGFuIGFwcGxpY2F0aW9ucyBjYWxscyB7QGxpbmsgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2t9IHRvIHJlZ2lzdGVyCi0gICAgICogYSBjYWxsYmFjaywgaXQgYWxzbyBwcm92aWRlcyBhIHNlbGVjdG9yIHRvIHNwZWNpZnkgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0Ci0gICAgICogaXQgaXMgaW50ZXJlc3RlZCBpbi4gIFRoZSBtZWRpYSByb3V0ZXIgY29tYmluZXMgYWxsIG9mIHRoZXNlIHNlbGVjdG9ycyB0b2dldGhlcgotICAgICAqIHRvIGdlbmVyYXRlIGEge0BsaW5rIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0fSBhbmQgbm90aWZpZXMgZWFjaCBwcm92aWRlciB3aGVuIGEgY2hhbmdlCi0gICAgICogb2NjdXJzIGJ5IGNhbGxpbmcge0BsaW5rICNzZXREaXNjb3ZlcnlSZXF1ZXN0fSB3aGljaCBwb3N0cyBhIG1lc3NhZ2UgdG8gaW52b2tlCi0gICAgICogdGhpcyBtZXRob2QgYXN5bmNocm9ub3VzbHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSBwcm92aWRlciBzaG91bGQgZXhhbWluZSB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3JpZXN9Ci0gICAgICogaW4gdGhlIGRpc2NvdmVyeSByZXF1ZXN0J3Mge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3Rvcn0gdG8gZGV0ZXJtaW5lIHdoYXQKLSAgICAgKiBraW5kcyBvZiByb3V0ZXMgaXQgc2hvdWxkIHRyeSB0byBkaXNjb3ZlciBhbmQgd2hldGhlciBpdCBzaG91bGQgcGVyZm9ybSBhY3RpdmUKLSAgICAgKiBvciBwYXNzaXZlIHNjYW5zLiAgSW4gbWFueSBjYXNlcywgdGhlIHByb3ZpZGVyIG1heSBiZSBhYmxlIHRvIHNhdmUgcG93ZXIgYnkKLSAgICAgKiBkZXRlcm1pbmluZyB0aGF0IHRoZSBzZWxlY3RvciBkb2VzIG5vdCBjb250YWluIGFueSBjYXRlZ29yaWVzIHRoYXQgaXQgc3VwcG9ydHMKLSAgICAgKiBhbmQgaXQgY2FuIHRoZXJlZm9yZSBhdm9pZCBwZXJmb3JtaW5nIGFueSBzY2FucyBhdCBhbGwuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHJlcXVlc3QgVGhlIG5ldyBkaXNjb3ZlcnkgcmVxdWVzdCwgb3IgbnVsbCBpZiBubyBkaXNjb3ZlcnkgaXMgbmVlZGVkIGF0IHRoaXMgdGltZS4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKEBOdWxsYWJsZSBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgcHJvdmlkZXIncyBkZXNjcmlwdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoZSBkZXNjcmlwdG9yIGRlc2NyaWJlcyB0aGUgc3RhdGUgb2YgdGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGFuZAotICAgICAqIHRoZSByb3V0ZXMgdGhhdCBpdCBwdWJsaXNoZXMuICBXYXRjaCBmb3IgY2hhbmdlcyB0byB0aGUgZGVzY3JpcHRvcgotICAgICAqIGJ5IHJlZ2lzdGVyaW5nIGEge0BsaW5rIENhbGxiYWNrIGNhbGxiYWNrfSB3aXRoIHtAbGluayAjc2V0Q2FsbGJhY2t9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEBzZWUgQ2FsbGJhY2sjb25EZXNjcmlwdG9yQ2hhbmdlZAotICAgICAqLwotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBmaW5hbCBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHJldHVybiBtRGVzY3JpcHRvcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBwcm92aWRlcidzIGRlc2NyaXB0b3IuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHByb3ZpZGVyIG11c3QgY2FsbCB0aGlzIG1ldGhvZCB0byBub3RpZnkgdGhlIGN1cnJlbnRseSByZWdpc3RlcmVkCi0gICAgICoge0BsaW5rIENhbGxiYWNrIGNhbGxiYWNrfSBhYm91dCB0aGUgY2hhbmdlIHRvIHRoZSBwcm92aWRlcidzIGRlc2NyaXB0b3IuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGRlc2NyaXB0b3IgVGhlIHVwZGF0ZWQgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHNlZSBDYWxsYmFjayNvbkRlc2NyaXB0b3JDaGFuZ2VkCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIHZvaWQgc2V0RGVzY3JpcHRvcihATnVsbGFibGUgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIE1lZGlhUm91dGVyLmNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChtRGVzY3JpcHRvciAhPSBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBtRGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICBpZiAoIW1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZSkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUhhbmRsZXIuc2VuZEVtcHR5TWVzc2FnZShNU0dfREVMSVZFUl9ERVNDUklQVE9SX0NIQU5HRUQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBkZWxpdmVyRGVzY3JpcHRvckNoYW5nZWQoKSB7Ci0gICAgICAgIG1QZW5kaW5nRGVzY3JpcHRvckNoYW5nZSA9IGZhbHNlOwotCi0gICAgICAgIGlmIChtQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgbUNhbGxiYWNrLm9uRGVzY3JpcHRvckNoYW5nZWQodGhpcywgbURlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgdG8gb2J0YWluIGEgcm91dGUgY29udHJvbGxlciBmb3IgYSBwYXJ0aWN1bGFyIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIFRoZSBtZWRpYSByb3V0ZXIgd2lsbCBpbnZva2UgdGhlIHtAbGluayBSb3V0ZUNvbnRyb2xsZXIjb25SZWxlYXNlfSBtZXRob2Qgb2YgdGhlIHJvdXRlCi0gICAgICogY29udHJvbGxlciB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQgdG8gYWxsb3cgaXQgdG8gZnJlZSBpdHMgcmVzb3VyY2VzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb3V0ZUlkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgotICAgICAqIEByZXR1cm4gVGhlIHJvdXRlIGNvbnRyb2xsZXIuICBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCByb3V0ZSBvciBpZiB0aGUgcm91dGUKLSAgICAgKiBjYW5ub3QgYmUgY29udHJvbGxlZCB1c2luZyB0aGUgcm91dGUgY29udHJvbGxlciBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgQE51bGxhYmxlCi0gICAgcHVibGljIFJvdXRlQ29udHJvbGxlciBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihATm9uTnVsbCBTdHJpbmcgcm91dGVJZCkgewotICAgICAgICBpZiAocm91dGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUlkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgdG8gb2J0YWluIGEgcm91dGUgY29udHJvbGxlciBmb3IgYSBwYXJ0aWN1bGFyIHJvdXRlIHdoaWNoIGlzIGEKLSAgICAgKiBtZW1iZXIgb2Yge0BsaW5rIE1lZGlhUm91dGVyLlJvdXRlR3JvdXB9LgotICAgICAqIDxwPgotICAgICAqIFRoZSBtZWRpYSByb3V0ZXIgd2lsbCBpbnZva2UgdGhlIHtAbGluayBSb3V0ZUNvbnRyb2xsZXIjb25SZWxlYXNlfSBtZXRob2Qgb2YgdGhlIHJvdXRlCi0gICAgICogY29udHJvbGxlciB3aGVuIGl0IGlzIG5vIGxvbmdlciBuZWVkZWQgdG8gYWxsb3cgaXQgdG8gZnJlZSBpdHMgcmVzb3VyY2VzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByb3V0ZUlkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIG1lbWJlciByb3V0ZS4KLSAgICAgKiBAcGFyYW0gcm91dGVHcm91cElkIFRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlIGdyb3VwLgotICAgICAqIEByZXR1cm4gVGhlIHJvdXRlIGNvbnRyb2xsZXIuICBSZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCByb3V0ZSBvciBpZiB0aGUgcm91dGUKLSAgICAgKiBjYW5ub3QgYmUgY29udHJvbGxlZCB1c2luZyB0aGUgcm91dGUgY29udHJvbGxlciBpbnRlcmZhY2UuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgIEBOdWxsYWJsZQotICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoQE5vbk51bGwgU3RyaW5nIHJvdXRlSWQsCi0gICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgcm91dGVHcm91cElkKSB7Ci0gICAgICAgIGlmIChyb3V0ZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlSWQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocm91dGVHcm91cElkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlR3JvdXBJZCBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBvbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBEZXNjcmliZXMgcHJvcGVydGllcyBvZiB0aGUgcm91dGUgcHJvdmlkZXIncyBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFByb3ZpZGVyTWV0YWRhdGEgewotICAgICAgICBwcml2YXRlIGZpbmFsIENvbXBvbmVudE5hbWUgbUNvbXBvbmVudE5hbWU7Ci0KLSAgICAgICAgUHJvdmlkZXJNZXRhZGF0YShDb21wb25lbnROYW1lIGNvbXBvbmVudE5hbWUpIHsKLSAgICAgICAgICAgIGlmIChjb21wb25lbnROYW1lID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb21wb25lbnROYW1lIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Db21wb25lbnROYW1lID0gY29tcG9uZW50TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIHBhY2thZ2UgbmFtZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZU5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbXBvbmVudE5hbWUuZ2V0UGFja2FnZU5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBwcm92aWRlcidzIGNvbXBvbmVudCBuYW1lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIENvbXBvbmVudE5hbWUgZ2V0Q29tcG9uZW50TmFtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29tcG9uZW50TmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuICJQcm92aWRlck1ldGFkYXRheyBjb21wb25lbnROYW1lPSIKLSAgICAgICAgICAgICAgICAgICAgKyBtQ29tcG9uZW50TmFtZS5mbGF0dGVuVG9TaG9ydFN0cmluZygpICsgIiB9IjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIGNvbnRyb2wgb3ZlciBhIHBhcnRpY3VsYXIgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIG1lZGlhIHJvdXRlciBvYnRhaW5zIGEgcm91dGUgY29udHJvbGxlciBmb3IgYSByb3V0ZSB3aGVuZXZlciBpdCBuZWVkcwotICAgICAqIHRvIGNvbnRyb2wgYSByb3V0ZS4gIFdoZW4gYSByb3V0ZSBpcyBzZWxlY3RlZCwgdGhlIG1lZGlhIHJvdXRlciBpbnZva2VzCi0gICAgICogdGhlIHtAbGluayAjb25TZWxlY3R9IG1ldGhvZCBvZiBpdHMgcm91dGUgY29udHJvbGxlci4gIFdoaWxlIHNlbGVjdGVkLAotICAgICAqIHRoZSBtZWRpYSByb3V0ZXIgbWF5IGNhbGwgb3RoZXIgbWV0aG9kcyBvZiB0aGUgcm91dGUgY29udHJvbGxlciB0bwotICAgICAqIHJlcXVlc3QgdGhhdCBpdCBwZXJmb3JtIGNlcnRhaW4gYWN0aW9ucyB0byB0aGUgcm91dGUuICBXaGVuIGEgcm91dGUgaXMKLSAgICAgKiB1bnNlbGVjdGVkLCB0aGUgbWVkaWEgcm91dGVyIGludm9rZXMgdGhlIHtAbGluayAjb25VbnNlbGVjdH0gbWV0aG9kIG9mIGl0cwotICAgICAqIHJvdXRlIGNvbnRyb2xsZXIuICBXaGVuIHRoZSBtZWRpYSByb3V0ZSBubyBsb25nZXIgbmVlZHMgdGhlIHJvdXRlIGNvbnRyb2xsZXIKLSAgICAgKiBpdCB3aWxsIGludm9rZSB0aGUge0BsaW5rICNvblJlbGVhc2V9IG1ldGhvZCB0byBhbGxvdyB0aGUgcm91dGUgY29udHJvbGxlcgotICAgICAqIHRvIGZyZWUgaXRzIHJlc291cmNlcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlcmUgbWF5IGJlIG11bHRpcGxlIHJvdXRlIGNvbnRyb2xsZXJzIHNpbXVsdGFuZW91c2x5IGFjdGl2ZSBmb3IgdGhlCi0gICAgICogc2FtZSByb3V0ZS4gIEVhY2ggcm91dGUgY29udHJvbGxlciB3aWxsIGJlIHJlbGVhc2VkIHNlcGFyYXRlbHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFsbCBvcGVyYXRpb25zIG9uIHRoZSByb3V0ZSBjb250cm9sbGVyIGFyZSBhc3luY2hyb25vdXMgYW5kCi0gICAgICogcmVzdWx0cyBhcmUgY29tbXVuaWNhdGVkIHZpYSBjYWxsYmFja3MuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgUm91dGVDb250cm9sbGVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlbGVhc2VzIHRoZSByb3V0ZSBjb250cm9sbGVyLCBhbGxvd2luZyBpdCB0byBmcmVlIGl0cyByZXNvdXJjZXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJlbGVhc2UoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2VsZWN0cyB0aGUgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblNlbGVjdCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVbnNlbGVjdHMgdGhlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25VbnNlbGVjdCgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBVbnNlbGVjdHMgdGhlIHJvdXRlIGFuZCBwcm92aWRlcyBhIHJlYXNvbi4gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24KLSAgICAgICAgICogY2FsbHMge0BsaW5rICNvblVuc2VsZWN0KCl9LgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJlYXNvbiBwcm92aWRlZCB3aWxsIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotICAgICAgICAgKiA8dWw+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1VOS05PV059PC9saT4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1NUT1BQRUR9PC9saT4KLSAgICAgICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRH08L2xpPgotICAgICAgICAgKiA8L3VsPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gZm9yIHVuc2VsZWN0aW5nIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVW5zZWxlY3QoaW50IHJlYXNvbikgewotICAgICAgICAgICAgb25VbnNlbGVjdCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcXVlc3RzIHRvIHNldCB0aGUgdm9sdW1lIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHZvbHVtZSBUaGUgbmV3IHZvbHVtZSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIHtAbGluayBNZWRpYVJvdXRlRGVzY3JpcHRvciNnZXRWb2x1bWVNYXh9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcXVlc3RzIGFuIGluY3JlbWVudGFsIHZvbHVtZSB1cGRhdGUgZm9yIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRlbHRhIFRoZSBkZWx0YSB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdm9sdW1lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25VcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUGVyZm9ybXMgYSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IHJlcXVlc3QKLSAgICAgICAgICogYXN5bmNocm9ub3VzbHkgb24gYmVoYWxmIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGludGVudCBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9LgotICAgICAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSB7QGxpbmsgQ29udHJvbFJlcXVlc3RDYWxsYmFja30gdG8gaW52b2tlIHdpdGggdGhlIHJlc3VsdAotICAgICAgICAgKiBvZiB0aGUgcmVxdWVzdCwgb3IgbnVsbCBpZiBubyByZXN1bHQgaXMgcmVxdWlyZWQuCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY29udHJvbGxlciBpbnRlbmRzIHRvIGhhbmRsZSB0aGUgcmVxdWVzdCBhbmQgd2lsbAotICAgICAgICAgKiBpbnZva2UgdGhlIGNhbGxiYWNrIHdoZW4gZmluaXNoZWQuICBGYWxzZSBpZiB0aGUgY29udHJvbGxlciB3aWxsIG5vdAotICAgICAgICAgKiBoYW5kbGUgdGhlIHJlcXVlc3QgYW5kIHdpbGwgbm90IGludm9rZSB0aGUgY2FsbGJhY2suCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRyb2xSZXF1ZXN0KEludGVudCBpbnRlbnQsIEBOdWxsYWJsZSBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsYmFjayB3aGljaCBpcyBpbnZva2VkIHdoZW4gcm91dGUgaW5mb3JtYXRpb24gYmVjb21lcyBhdmFpbGFibGUgb3IgY2hhbmdlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIENhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGluZm9ybWF0aW9uIGFib3V0IGEgcm91dGUgcHJvdmlkZXIgYW5kIGl0cyByb3V0ZXMgY2hhbmdlcy4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHByb3ZpZGVyIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciB0aGF0IGNoYW5nZWQsIG5ldmVyIG51bGwuCi0gICAgICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yIFRoZSBuZXcgbWVkaWEgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25EZXNjcmlwdG9yQ2hhbmdlZChATm9uTnVsbCBNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm92aWRlckhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgUHJvdmlkZXJIYW5kbGVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIE1TR19ERUxJVkVSX0RFU0NSSVBUT1JfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgZGVsaXZlckRlc2NyaXB0b3JDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgTVNHX0RFTElWRVJfRElTQ09WRVJZX1JFUVVFU1RfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgZGVsaXZlckRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMWNlMDkuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIERlc2NyaWJlcyB0aGUgc3RhdGUgb2YgYSBtZWRpYSByb3V0ZSBwcm92aWRlciBhbmQgdGhlIHJvdXRlcyB0aGF0IGl0IHB1Ymxpc2hlcy4KLSAqIDxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUk9VVEVTID0gInJvdXRlcyI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgIHByaXZhdGUgTGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gbVJvdXRlczsKLQotICAgIHByaXZhdGUgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvcihCdW5kbGUgYnVuZGxlLCBMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZXMpIHsKLSAgICAgICAgbUJ1bmRsZSA9IGJ1bmRsZTsKLSAgICAgICAgbVJvdXRlcyA9IHJvdXRlczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBsaXN0IG9mIGFsbCByb3V0ZXMgdGhhdCB0aGlzIHByb3ZpZGVyIGhhcyBwdWJsaXNoZWQuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IGdldFJvdXRlcygpIHsKLSAgICAgICAgZW5zdXJlUm91dGVzKCk7Ci0gICAgICAgIHJldHVybiBtUm91dGVzOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVSb3V0ZXMoKSB7Ci0gICAgICAgIGlmIChtUm91dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIEFycmF5TGlzdDxCdW5kbGU+IHJvdXRlQnVuZGxlcyA9IG1CdW5kbGUuPEJ1bmRsZT5nZXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9ST1VURVMpOwotICAgICAgICAgICAgaWYgKHJvdXRlQnVuZGxlcyA9PSBudWxsIHx8IHJvdXRlQnVuZGxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gQ29sbGVjdGlvbnMuPE1lZGlhUm91dGVEZXNjcmlwdG9yPmVtcHR5TGlzdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZUJ1bmRsZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPihjb3VudCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXMuYWRkKE1lZGlhUm91dGVEZXNjcmlwdG9yLmZyb21CdW5kbGUocm91dGVCdW5kbGVzLmdldChpKSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciBhbmQgYWxsIG9mIHRoZSByb3V0ZXMgdGhhdAotICAgICAqIGl0IGNvbnRhaW5zIGhhdmUgYWxsIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyB2ZXJpZmljYXRpb24gaXMgZGVlcC4gIElmIHRoZSBwcm92aWRlciBkZXNjcmlwdG9yIGlzIGtub3duIHRvIGJlCi0gICAgICogdmFsaWQgdGhlbiBpdCBpcyBub3QgbmVjZXNzYXJ5IHRvIGNhbGwge0BsaW5rICNpc1ZhbGlkfSBvbiBlYWNoIG9mIGl0cyByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzVmFsaWQoKSB7Ci0gICAgICAgIGVuc3VyZVJvdXRlcygpOwotICAgICAgICBmaW5hbCBpbnQgcm91dGVDb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvdXRlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgPSBtUm91dGVzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBudWxsIHx8ICFyb3V0ZS5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yeyAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgicm91dGVzPSIpLmFwcGVuZCgKLSAgICAgICAgICAgICAgICBBcnJheXMudG9TdHJpbmcoZ2V0Um91dGVzKCkudG9BcnJheSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgaXNWYWxpZD0iKS5hcHBlbmQoaXNWYWxpZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZnJvbUJ1bmRsZShCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIHJldHVybiBidW5kbGUgIT0gbnVsbCA/IG5ldyBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yKGJ1bmRsZSwgbnVsbCkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3JzfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gbVJvdXRlczsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhbiBlbXB0eSBtZWRpYSByb3V0ZSBwcm92aWRlciBkZXNjcmlwdG9yIGJ1aWxkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcigpIHsKLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBkZXNjcmlwdG9yLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiZGVzY3JpcHRvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKGRlc2NyaXB0b3IubUJ1bmRsZSk7Ci0KLSAgICAgICAgICAgIGRlc2NyaXB0b3IuZW5zdXJlUm91dGVzKCk7Ci0gICAgICAgICAgICBpZiAoIWRlc2NyaXB0b3IubVJvdXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4oZGVzY3JpcHRvci5tUm91dGVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRSb3V0ZShNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZSkgewotICAgICAgICAgICAgaWYgKHJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtUm91dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDxNZWRpYVJvdXRlRGVzY3JpcHRvcj4oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVJvdXRlcy5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZSBkZXNjcmlwdG9yIGFscmVhZHkgYWRkZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Sb3V0ZXMuYWRkKHJvdXRlKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgYSBsaXN0IG9mIHJvdXRlcy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZFJvdXRlcyhDb2xsZWN0aW9uPE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZXMpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlcyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICghcm91dGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgOiByb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkUm91dGUocm91dGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFNldHMgdGhlIGxpc3Qgb2Ygcm91dGVzLgotICAgICAgICAgKi8KLSAgICAgICAgQnVpbGRlciBzZXRSb3V0ZXMoQ29sbGVjdGlvbjxNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcm91dGVzKSB7Ci0gICAgICAgICAgICBpZiAocm91dGVzID09IG51bGwgfHwgcm91dGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSBudWxsOwotICAgICAgICAgICAgICAgIG1CdW5kbGUucmVtb3ZlKEtFWV9ST1VURVMpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUm91dGVzID0gbmV3IEFycmF5TGlzdDw+KHJvdXRlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBCdWlsZHMgdGhlIHtAbGluayBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3J9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgYnVpbGQoKSB7Ci0gICAgICAgICAgICBpZiAobVJvdXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgQXJyYXlMaXN0PEJ1bmRsZT4gcm91dGVCdW5kbGVzID0gbmV3IEFycmF5TGlzdDxCdW5kbGU+KGNvdW50KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgcm91dGVCdW5kbGVzLmFkZChtUm91dGVzLmdldChpKS5hc0J1bmRsZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUJ1bmRsZS5wdXRQYXJjZWxhYmxlQXJyYXlMaXN0KEtFWV9ST1VURVMsIHJvdXRlQnVuZGxlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IobUJ1bmRsZSwgbVJvdXRlcyk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJlOTM0My4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2VuZ2VyOwotCi0vKioKLSAqIERlZmluZXMgdGhlIGNvbW11bmljYXRpb24gcHJvdG9jb2wgZm9yIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2VzLgotICovCi1hYnN0cmFjdCBjbGFzcyBNZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbCB7Ci0gICAgLyoqCi0gICAgICogVGhlIHtAbGluayBJbnRlbnR9IHRoYXQgbXVzdCBiZSBkZWNsYXJlZCBhcyBoYW5kbGVkIGJ5IHRoZSBzZXJ2aWNlLgotICAgICAqIFB1dCB0aGlzIGluIHlvdXIgbWFuaWZlc3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9JTlRFUkZBQ0UgPQotICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSI7Ci0KLSAgICAvKgotICAgICAqIE1lc3NhZ2VzIHNlbnQgZnJvbSB0aGUgY2xpZW50IHRvIHRoZSBzZXJ2aWNlLgotICAgICAqIERPIE5PVCBSRU5VTUJFUiBUSEVTRSEKLSAgICAgKi8KLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFJlZ2lzdGVyIGNsaWVudC4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IGNsaWVudCB2ZXJzaW9uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19SRUdJU1RFUiA9IDE7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBVbnJlZ2lzdGVyIGNsaWVudC4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfVU5SRUdJU1RFUiA9IDI7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBDcmVhdGUgcm91dGUgY29udHJvbGxlci4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKLSAgICAgKiAtIENMSUVOVF9EQVRBX1JPVVRFX0lEIDogcm91dGUgaWQgc3RyaW5nCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUiA9IDM7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBSZWxlYXNlIHJvdXRlIGNvbnRyb2xsZXIuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19SRUxFQVNFX1JPVVRFX0NPTlRST0xMRVIgPSA0OwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogU2VsZWN0IHJvdXRlLgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfU0VMRUNUX1JPVVRFID0gNTsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFVuc2VsZWN0IHJvdXRlLgotICAgICAqIC0gcmVwbHlUbyA6IGNsaWVudCBtZXNzZW5nZXIKLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICogLSBhcmcyICAgIDogcm91dGUgY29udHJvbGxlciBpZAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEUgPSA2OwotCi0gICAgLyoqIChjbGllbnQgdjEpCi0gICAgICogU2V0IHJvdXRlIHZvbHVtZS4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gYXJnMiAgICA6IHJvdXRlIGNvbnRyb2xsZXIgaWQKLSAgICAgKiAtIENMSUVOVF9EQVRBX1ZPTFVNRSA6IHZvbHVtZSBpbnRlZ2VyCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19TRVRfUk9VVEVfVk9MVU1FID0gNzsKLQotICAgIC8qKiAoY2xpZW50IHYxKQotICAgICAqIFVwZGF0ZSByb3V0ZSB2b2x1bWUuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICogLSBDTElFTlRfREFUQV9WT0xVTUUgOiB2b2x1bWUgZGVsdGEgaW50ZWdlcgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRSA9IDg7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBSb3V0ZSBjb250cm9sIHJlcXVlc3QuCi0gICAgICogLSByZXBseVRvIDogY2xpZW50IG1lc3NlbmdlcgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiByb3V0ZSBjb250cm9sbGVyIGlkCi0gICAgICogLSBvYmogICAgIDogbWVkaWEgY29udHJvbCBpbnRlbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVCA9IDk7Ci0KLSAgICAvKiogKGNsaWVudCB2MSkKLSAgICAgKiBTZXRzIHRoZSBkaXNjb3ZlcnkgcmVxdWVzdC4KLSAgICAgKiAtIHJlcGx5VG8gOiBjbGllbnQgbWVzc2VuZ2VyCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gb2JqICAgICA6IGRpc2NvdmVyeSByZXF1ZXN0IGJ1bmRsZSwgb3IgbnVsbCBpZiBub25lCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ0xJRU5UX01TR19TRVRfRElTQ09WRVJZX1JFUVVFU1QgPSAxMDsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9EQVRBX1JPVVRFX0lEID0gInJvdXRlSWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIENMSUVOVF9EQVRBX1JPVVRFX0xJQlJBUllfR1JPVVAgPSAicm91dGVHcm91cElkIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfREFUQV9WT0xVTUUgPSAidm9sdW1lIjsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDTElFTlRfREFUQV9VTlNFTEVDVF9SRUFTT04gPSAidW5zZWxlY3RSZWFzb24iOwotCi0gICAgLyoKLSAgICAgKiBNZXNzYWdlcyBzZW50IGZyb20gdGhlIHNlcnZpY2UgdG8gdGhlIGNsaWVudC4KLSAgICAgKiBETyBOT1QgUkVOVU1CRVIgVEhFU0UhCi0gICAgICovCi0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogR2VuZXJpYyBmYWlsdXJlIHNlbnQgaW4gcmVzcG9uc2UgdG8gYW55IHVucmVjb2duaXplZCBvciBtYWxmb3JtZWQgcmVxdWVzdC4KLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFID0gMDsKLQotICAgIC8qKiAoc2VydmljZSB2MSkKLSAgICAgKiBHZW5lcmljIGZhaWx1cmUgc2VudCBpbiByZXNwb25zZSB0byBhIHN1Y2Nlc3NmdWwgbWVzc2FnZS4KLSAgICAgKiAtIGFyZzEgICAgOiByZXF1ZXN0IGlkCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfR0VORVJJQ19TVUNDRVNTID0gMTsKLQotICAgIC8qKiAoc2VydmljZSB2MSkKLSAgICAgKiBSZWdpc3RyYXRpb24gc3VjY2VlZGVkLgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIGFyZzIgICAgOiBzZXJ2ZXIgdmVyc2lvbgotICAgICAqIC0gb2JqICAgICA6IHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYnVuZGxlLCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfUkVHSVNURVJFRCA9IDI7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogUm91dGUgY29udHJvbCByZXF1ZXN0IHN1Y2Nlc3MgcmVzdWx0LgotICAgICAqIC0gYXJnMSAgICA6IHJlcXVlc3QgaWQKLSAgICAgKiAtIG9iaiAgICAgOiByZXN1bHQgZGF0YSBidW5kbGUsIG9yIG51bGwKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVEID0gMzsKLQotICAgIC8qKiAoc2VydmljZSB2MSkKLSAgICAgKiBSb3V0ZSBjb250cm9sIHJlcXVlc3QgZmFpbHVyZSByZXN1bHQuCi0gICAgICogLSBhcmcxICAgIDogcmVxdWVzdCBpZAotICAgICAqIC0gb2JqICAgICA6IHJlc3VsdCBkYXRhIGJ1bmRsZSwgb3IgbnVsbAotICAgICAqIC0gU0VSVklDRV9EQVRBX0VSUk9SOiBlcnJvciBtZXNzYWdlCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRCA9IDQ7Ci0KLSAgICAvKiogKHNlcnZpY2UgdjEpCi0gICAgICogUm91dGUgcHJvdmlkZXIgZGVzY3JpcHRvciBjaGFuZ2VkLiAgKHVuc29saWNpdGVkIGV2ZW50KQotICAgICAqIC0gYXJnMSAgICA6IHJlc2VydmVkICgwKQotICAgICAqIC0gb2JqICAgICA6IHJvdXRlIHByb3ZpZGVyIGRlc2NyaXB0b3IgYnVuZGxlLCBvciBudWxsCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9NU0dfREVTQ1JJUFRPUl9DSEFOR0VEID0gNTsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFNFUlZJQ0VfREFUQV9FUlJPUiA9ICJlcnJvciI7Ci0KLSAgICAvKgotICAgICAqIFJlY29nbml6ZWQgY2xpZW50IHZlcnNpb24gbnVtYmVycy4gIChSZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4pCi0gICAgICogRE8gTk9UIFJFTlVNQkVSIFRIRVNFIQotICAgICAqLwotCi0gICAgLyoqCi0gICAgICogVGhlIGNsaWVudCB2ZXJzaW9uIHVzZWQgZnJvbSB0aGUgYmVnaW5uaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9WRVJTSU9OXzEgPSAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGNsaWVudCB2ZXJzaW9uIHVzZWQgZnJvbSBzdXBwb3J0IGxpYnJhcnkgdjI0LjEuMC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDTElFTlRfVkVSU0lPTl8yID0gMjsKLQotICAgIC8qKgotICAgICAqIFRoZSBjdXJyZW50IGNsaWVudCB2ZXJzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9WRVJTSU9OX0NVUlJFTlQgPSBDTElFTlRfVkVSU0lPTl8yOwotCi0gICAgLyoKLSAgICAgKiBSZWNvZ25pemVkIHNlcnZlciB2ZXJzaW9uIG51bWJlcnMuICAoUmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuKQotICAgICAqIERPIE5PVCBSRU5VTUJFUiBUSEVTRSEKLSAgICAgKi8KLQotICAgIC8qKgotICAgICAqIFRoZSBzZXJ2aWNlIHZlcnNpb24gdXNlZCBmcm9tIHRoZSBiZWdpbm5pbmcuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgU0VSVklDRV9WRVJTSU9OXzEgPSAxOwotCi0gICAgLyoqCi0gICAgICogVGhlIGN1cnJlbnQgc2VydmljZSB2ZXJzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFNFUlZJQ0VfVkVSU0lPTl9DVVJSRU5UID0gU0VSVklDRV9WRVJTSU9OXzE7Ci0KLSAgICBzdGF0aWMgZmluYWwgaW50IENMSUVOVF9WRVJTSU9OX1NUQVJUID0gQ0xJRU5UX1ZFUlNJT05fMTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWVzc2VuZ2VyIG9iamVjdCBpcyB2YWxpZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgbWVzc2VuZ2VyIGNvbnN0cnVjdG9yIGFuZCB1bnBhcmNlbGluZyBjb2RlIGRvZXMgbm90IGNoZWNrIHdoZXRoZXIgdGhlCi0gICAgICogcHJvdmlkZWQgSUJpbmRlciBpcyBhIHZhbGlkIElNZXNzZW5nZXIgb2JqZWN0LiAgQXMgYSByZXN1bHQsIGl0J3MgcG9zc2libGUKLSAgICAgKiBmb3IgYSBwZWVyIHRvIHNlbmQgYW4gaW52YWxpZCBJQmluZGVyIHRoYXQgd2lsbCByZXN1bHQgaW4gY3Jhc2hlcyBkb3duc3RyZWFtLgotICAgICAqIFRoaXMgbWV0aG9kIGNoZWNrcyB0aGF0IHRoZSBtZXNzZW5nZXIgaXMgaW4gYSB2YWxpZCBzdGF0ZS4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRSZW1vdGVNZXNzZW5nZXIoTWVzc2VuZ2VyIG1lc3NlbmdlcikgewotICAgICAgICB0cnkgewotICAgICAgICAgICAgcmV0dXJuIG1lc3NlbmdlciAhPSBudWxsICYmIG1lc3Nlbmdlci5nZXRCaW5kZXIoKSAhPSBudWxsOwotICAgICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gSWYgdGhlIG1lc3NlbmdlciB3YXMgY29uc3RydWN0ZWQgd2l0aCBhIGJpbmRlciBpbnRlcmZhY2Ugb3RoZXIgdGhhbgotICAgICAgICAgICAgLy8gSU1lc3NlbmdlciB0aGVuIHRoZSBjYWxsIHRvIGdldEJpbmRlcigpIHdpbGwgY3Jhc2ggd2l0aCBhbiBOUEUuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZS5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVQcm92aWRlclNlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDNjZGUxMC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9EQVRBX1JPVVRFX0lEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfREFUQV9ST1VURV9MSUJSQVJZX0dST1VQOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfREFUQV9VTlNFTEVDVF9SRUFTT047Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX0RBVEFfVk9MVU1FOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX0NSRUFURV9ST1VURV9DT05UUk9MTEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9NU0dfUkVHSVNURVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1JPVVRFX0NPTlRST0xfUkVRVUVTVDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1NFTEVDVF9ST1VURTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19TRVRfRElTQ09WRVJZX1JFUVVFU1Q7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1VOUkVHSVNURVI7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfVU5TRUxFQ1RfUk9VVEU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfVkVSU0lPTl8xOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfREFUQV9FUlJPUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX1NVQ0NFRURFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfREVTQ1JJUFRPUl9DSEFOR0VEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19HRU5FUklDX0ZBSUxVUkU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUzsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX01TR19SRUdJU1RFUkVEOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfVkVSU0lPTl9DVVJSRU5UOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLmlzVmFsaWRSZW1vdGVNZXNzZW5nZXI7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5TZXJ2aWNlOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5EZWFkT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyLkRlYXRoUmVjaXBpZW50OwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5WaXNpYmxlRm9yVGVzdGluZzsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5PYmplY3RzQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlNwYXJzZUFycmF5OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZXMuCi0gKiA8cD4KLSAqIEEgbWVkaWEgcm91dGVyIHdpbGwgYmluZCB0byBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlcyB3aGVuIGEgY2FsbGJhY2sgaXMgYWRkZWQgdmlhCi0gKiB7QGxpbmsgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBNZWRpYVJvdXRlci5DYWxsYmFjaywgaW50KX0gd2l0aCBhIGRpc2NvdmVyeQotICogZmxhZzoge0BsaW5rIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9LAotICoge0BsaW5rIE1lZGlhUm91dGVyI0NBTExCQUNLX0ZMQUdfRk9SQ0VfRElTQ09WRVJZfSwgb3IKLSAqIHtAbGluayBNZWRpYVJvdXRlciNDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU59LCBhbmQgd2lsbCB1bmJpbmQgd2hlbiB0aGUgY2FsbGJhY2sKLSAqIGlzIHJlbW92ZWQgdmlhIHtAbGluayBNZWRpYVJvdXRlciNyZW1vdmVDYWxsYmFjayhNZWRpYVJvdXRlci5DYWxsYmFjayl9LgotICogPC9wPjxwPgotICogVG8gaW1wbGVtZW50IHlvdXIgb3duIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UsIGV4dGVuZCB0aGlzIGNsYXNzIGFuZAotICogb3ZlcnJpZGUgdGhlIHtAbGluayAjb25DcmVhdGVNZWRpYVJvdXRlUHJvdmlkZXJ9IG1ldGhvZCB0byByZXR1cm4gYW4KLSAqIGluc3RhbmNlIG9mIHlvdXIge0BsaW5rIE1lZGlhUm91dGVQcm92aWRlcn0uCi0gKiA8L3A+PHA+Ci0gKiBEZWNsYXJlIHlvdXIgbWVkaWEgcm91dGUgcHJvdmlkZXIgc2VydmljZSBpbiB5b3VyIGFwcGxpY2F0aW9uIG1hbmlmZXN0Ci0gKiBsaWtlIHRoaXM6Ci0gKiA8L3A+Ci0gKiA8cHJlPgotICogICAmbHQ7c2VydmljZSBhbmRyb2lkOm5hbWU9Ii5NeU1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UiCi0gKiAgICAgICAgICAgYW5kcm9pZDpsYWJlbD0iQHN0cmluZy9teV9tZWRpYV9yb3V0ZV9wcm92aWRlcl9zZXJ2aWNlIj4KLSAqICAgICAgICZsdDtpbnRlbnQtZmlsdGVyPgotICogICAgICAgICAgICZsdDthY3Rpb24gYW5kcm9pZDpuYW1lPSJhbmRyb2lkLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UiIC8+Ci0gKiAgICAgICAmbHQ7L2ludGVudC1maWx0ZXI+Ci0gKiAgICZsdDsvc2VydmljZT4KLSAqIDwvcHJlPgotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBleHRlbmRzIFNlcnZpY2UgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVQcm92aWRlclNydiI7IC8vIG1heC4gMjMgY2hhcnMKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PENsaWVudFJlY29yZD4gbUNsaWVudHMgPSBuZXcgQXJyYXlMaXN0PENsaWVudFJlY29yZD4oKTsKLSAgICBwcml2YXRlIGZpbmFsIFJlY2VpdmVIYW5kbGVyIG1SZWNlaXZlSGFuZGxlcjsKLSAgICBwcml2YXRlIGZpbmFsIE1lc3NlbmdlciBtUmVjZWl2ZU1lc3NlbmdlcjsKLSAgICBmaW5hbCBQcml2YXRlSGFuZGxlciBtUHJpdmF0ZUhhbmRsZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlckNhbGxiYWNrIG1Qcm92aWRlckNhbGxiYWNrOwotCi0gICAgTWVkaWFSb3V0ZVByb3ZpZGVyIG1Qcm92aWRlcjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1Db21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0OwotCi0gICAgLyoqCi0gICAgICogVGhlIHtAbGluayBJbnRlbnR9IHRoYXQgbXVzdCBiZSBkZWNsYXJlZCBhcyBoYW5kbGVkIGJ5IHRoZSBzZXJ2aWNlLgotICAgICAqIFB1dCB0aGlzIGluIHlvdXIgbWFuaWZlc3QuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgU0VSVklDRV9JTlRFUkZBQ0UgPSBNZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX0lOVEVSRkFDRTsKLQotICAgIC8qCi0gICAgICogUHJpdmF0ZSBtZXNzYWdlcyB1c2VkIGludGVybmFsbHkuICAoWWVzLCB5b3UgY2FuIHJlbnVtYmVyIHRoZXNlLikKLSAgICAgKi8KLQotICAgIHN0YXRpYyBmaW5hbCBpbnQgUFJJVkFURV9NU0dfQ0xJRU5UX0RJRUQgPSAxOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UuCi0gICAgICovCi0gICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2UoKSB7Ci0gICAgICAgIG1SZWNlaXZlSGFuZGxlciA9IG5ldyBSZWNlaXZlSGFuZGxlcih0aGlzKTsKLSAgICAgICAgbVJlY2VpdmVNZXNzZW5nZXIgPSBuZXcgTWVzc2VuZ2VyKG1SZWNlaXZlSGFuZGxlcik7Ci0gICAgICAgIG1Qcml2YXRlSGFuZGxlciA9IG5ldyBQcml2YXRlSGFuZGxlcigpOwotICAgICAgICBtUHJvdmlkZXJDYWxsYmFjayA9IG5ldyBQcm92aWRlckNhbGxiYWNrKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBzeXN0ZW0gd2hlbiBpdCBpcyB0aW1lIHRvIGNyZWF0ZSB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBvZmZlcmVkIGJ5IHRoaXMgc2VydmljZSwgb3IgbnVsbCBpZgotICAgICAqIHRoaXMgc2VydmljZSBoYXMgZGVjaWRlZCBub3QgdG8gb2ZmZXIgYSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgTWVkaWFSb3V0ZVByb3ZpZGVyIG9uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlciBvZmZlcmVkIGJ5IHRoaXMgc2VydmljZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIG1lZGlhIHJvdXRlIHByb3ZpZGVyIG9mZmVyZWQgYnkgdGhpcyBzZXJ2aWNlLCBvciBudWxsIGlmCi0gICAgICogaXQgaGFzIG5vdCB5ZXQgYmVlbiBjcmVhdGVkLgotICAgICAqCi0gICAgICogQHNlZSAjb25DcmVhdGVNZWRpYVJvdXRlUHJvdmlkZXIoKQotICAgICAqLwotICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIgZ2V0TWVkaWFSb3V0ZVByb3ZpZGVyKCkgewotICAgICAgICByZXR1cm4gbVByb3ZpZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJQmluZGVyIG9uQmluZChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGlmIChpbnRlbnQuZ2V0QWN0aW9uKCkuZXF1YWxzKFNFUlZJQ0VfSU5URVJGQUNFKSkgewotICAgICAgICAgICAgaWYgKG1Qcm92aWRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0gb25DcmVhdGVNZWRpYVJvdXRlUHJvdmlkZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAocHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcHJvdmlkZXJQYWNrYWdlID0gcHJvdmlkZXIuZ2V0TWV0YWRhdGEoKS5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoIXByb3ZpZGVyUGFja2FnZS5lcXVhbHMoZ2V0UGFja2FnZU5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIm9uQ3JlYXRlTWVkaWFSb3V0ZVByb3ZpZGVyKCkgcmV0dXJuZWQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICJhIHByb3ZpZGVyIHdob3NlIHBhY2thZ2UgbmFtZSBkb2VzIG5vdCBtYXRjaCB0aGUgcGFja2FnZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm5hbWUgb2YgdGhlIHNlcnZpY2UuICBBIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UgY2FuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAib25seSBleHBvcnQgaXRzIG93biBtZWRpYSByb3V0ZSBwcm92aWRlcnMuICAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIlByb3ZpZGVyIHBhY2thZ2UgbmFtZTogIiArIHByb3ZpZGVyUGFja2FnZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIuICBTZXJ2aWNlIHBhY2thZ2UgbmFtZTogIiArIGdldFBhY2thZ2VOYW1lKCkgKyAiLiIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1Qcm92aWRlciA9IHByb3ZpZGVyOwotICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXIuc2V0Q2FsbGJhY2sobVByb3ZpZGVyQ2FsbGJhY2spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtUmVjZWl2ZU1lc3Nlbmdlci5nZXRCaW5kZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblVuYmluZChJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGlmIChtUHJvdmlkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVByb3ZpZGVyLnNldENhbGxiYWNrKG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5vblVuYmluZChpbnRlbnQpOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25SZWdpc3RlckNsaWVudChNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLCBpbnQgdmVyc2lvbikgewotICAgICAgICBpZiAodmVyc2lvbiA+PSBDTElFTlRfVkVSU0lPTl8xKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IG5ldyBDbGllbnRSZWNvcmQobWVzc2VuZ2VyLCB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICBpZiAoY2xpZW50LnJlZ2lzdGVyKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNsaWVudHMuYWRkKGNsaWVudCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSZWdpc3RlcmVkLCB2ZXJzaW9uPSIgKyB2ZXJzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAocmVxdWVzdElkICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG1Qcm92aWRlci5nZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzZW5kUmVwbHkobWVzc2VuZ2VyLCBTRVJWSUNFX01TR19SRUdJU1RFUkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIFNFUlZJQ0VfVkVSU0lPTl9DVVJSRU5ULAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVEZXNjcmlwdG9yQnVuZGxlRm9yQ2xpZW50VmVyc2lvbihkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5tVmVyc2lvbiksIG51bGwpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblVucmVnaXN0ZXJDbGllbnQoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCkgewotICAgICAgICBpbnQgaW5kZXggPSBmaW5kQ2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gbUNsaWVudHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogVW5yZWdpc3RlcmVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjbGllbnQuZGlzcG9zZSgpOwotICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQmluZGVyRGllZChNZXNzZW5nZXIgbWVzc2VuZ2VyKSB7Ci0gICAgICAgIGludCBpbmRleCA9IGZpbmRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBtQ2xpZW50cy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBCaW5kZXIgZGllZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2xpZW50LmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGJvb2xlYW4gb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQsIFN0cmluZyByb3V0ZUlkLCBTdHJpbmcgcm91dGVHcm91cElkKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoY2xpZW50LmNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkLCByb3V0ZUdyb3VwSWQsIGNvbnRyb2xsZXJJZCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSBjb250cm9sbGVyIGNyZWF0ZWQsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCByb3V0ZUlkPSIgKyByb3V0ZUlkICsgIiwgcm91dGVHcm91cElkPSIgKyByb3V0ZUdyb3VwSWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uUmVsZWFzZVJvdXRlQ29udHJvbGxlcihNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICBDbGllbnRSZWNvcmQgY2xpZW50ID0gZ2V0Q2xpZW50KG1lc3Nlbmdlcik7Ci0gICAgICAgIGlmIChjbGllbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNsaWVudC5yZWxlYXNlUm91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBSb3V0ZSBjb250cm9sbGVyIHJlbGVhc2VkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzZW5kR2VuZXJpY1N1Y2Nlc3MobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sZWFuIG9uU2VsZWN0Um91dGUoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCwKLSAgICAgICAgICAgIGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgQ2xpZW50UmVjb3JkIGNsaWVudCA9IGdldENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICBpZiAoY2xpZW50ICE9IG51bGwpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9Ci0gICAgICAgICAgICAgICAgICAgIGNsaWVudC5nZXRSb3V0ZUNvbnRyb2xsZXIoY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uU2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgc2VsZWN0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25VbnNlbGVjdFJvdXRlKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQgY29udHJvbGxlcklkLCBpbnQgcmVhc29uKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVuc2VsZWN0KHJlYXNvbik7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgdW5zZWxlY3RlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBvblNldFJvdXRlVm9sdW1lKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBpbnQgY29udHJvbGxlcklkLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIHZvbHVtZSBjaGFuZ2VkIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29udHJvbGxlcklkPSIgKyBjb250cm9sbGVySWQgKyAiLCB2b2x1bWU9IiArIHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25VcGRhdGVSb3V0ZVZvbHVtZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLAotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCwgaW50IGRlbHRhKSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVwZGF0ZVZvbHVtZShkZWx0YSk7Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgdm9sdW1lIHVwZGF0ZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCArICIsIGRlbHRhPSIgKyBkZWx0YSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNlbmRHZW5lcmljU3VjY2VzcyhtZXNzZW5nZXIsIHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25Sb3V0ZUNvbnRyb2xSZXF1ZXN0KGZpbmFsIE1lc3NlbmdlciBtZXNzZW5nZXIsIGZpbmFsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBmaW5hbCBpbnQgY29udHJvbGxlcklkLCBmaW5hbCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgIGZpbmFsIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICBjbGllbnQuZ2V0Um91dGVDb250cm9sbGVyKGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjayA9IG51bGw7Ci0gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gbmV3IE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbCByZXF1ZXN0IHN1Y2NlZWRlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGNvbnRyb2xsZXJJZD0iICsgY29udHJvbGxlcklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpbnRlbnQ9IiArIGludGVudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgZGF0YT0iICsgZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaW5kQ2xpZW50KG1lc3NlbmdlcikgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZW5kUmVwbHkobWVzc2VuZ2VyLCBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgMCwgZGF0YSwgbnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFJvdXRlIGNvbnRyb2wgcmVxdWVzdCBmYWlsZWQiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaW50ZW50PSIgKyBpbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGVycm9yPSIgKyBlcnJvciArICIsIGRhdGE9IiArIGRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmluZENsaWVudChtZXNzZW5nZXIpID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGVycm9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBidW5kbGUgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidW5kbGUucHV0U3RyaW5nKFNFUlZJQ0VfREFUQV9FUlJPUiwgZXJyb3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCAwLCBkYXRhLCBidW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdElkLCAwLCBkYXRhLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvbnRyb2xsZXIub25Db250cm9sUmVxdWVzdChpbnRlbnQsIGNhbGxiYWNrKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgY2xpZW50ICsgIjogUm91dGUgY29udHJvbCByZXF1ZXN0IGRlbGl2ZXJlZCIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBjb250cm9sbGVySWQ9IiArIGNvbnRyb2xsZXJJZCArICIsIGludGVudD0iICsgaW50ZW50KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGJvb2xlYW4gb25TZXREaXNjb3ZlcnlSZXF1ZXN0KE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCByZXF1ZXN0SWQsCi0gICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBnZXRDbGllbnQobWVzc2VuZ2VyKTsKLSAgICAgICAgaWYgKGNsaWVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBib29sZWFuIGFjdHVhbGx5Q2hhbmdlZCA9IGNsaWVudC5zZXREaXNjb3ZlcnlSZXF1ZXN0KHJlcXVlc3QpOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCBjbGllbnQgKyAiOiBTZXQgZGlzY292ZXJ5IHJlcXVlc3QsIHJlcXVlc3Q9IiArIHJlcXVlc3QKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgYWN0dWFsbHlDaGFuZ2VkPSIgKyBhY3R1YWxseUNoYW5nZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgY29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdD0iICsgbUNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2VuZEdlbmVyaWNTdWNjZXNzKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2b2lkIHNlbmREZXNjcmlwdG9yQ2hhbmdlZChNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNsaWVudHMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBtQ2xpZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICBzZW5kUmVwbHkoY2xpZW50Lm1NZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRCwgMCwgMCwKLSAgICAgICAgICAgICAgICAgICAgY3JlYXRlRGVzY3JpcHRvckJ1bmRsZUZvckNsaWVudFZlcnNpb24oZGVzY3JpcHRvciwgY2xpZW50Lm1WZXJzaW9uKSwgbnVsbCk7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIGNsaWVudCArICI6IFNlbnQgZGVzY3JpcHRvciBjaGFuZ2UgZXZlbnQsIGRlc2NyaXB0b3I9IiArIGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQFZpc2libGVGb3JUZXN0aW5nCi0gICAgc3RhdGljIEJ1bmRsZSBjcmVhdGVEZXNjcmlwdG9yQnVuZGxlRm9yQ2xpZW50VmVyc2lvbihNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICBpbnQgY2xpZW50VmVyc2lvbikgewotICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlcihkZXNjcmlwdG9yKTsKLSAgICAgICAgYnVpbGRlci5zZXRSb3V0ZXMobnVsbCk7Ci0gICAgICAgIGZvciAoTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgOiBkZXNjcmlwdG9yLmdldFJvdXRlcygpKSB7Ci0gICAgICAgICAgICBpZiAoY2xpZW50VmVyc2lvbiA+PSByb3V0ZS5nZXRNaW5DbGllbnRWZXJzaW9uKCkKLSAgICAgICAgICAgICAgICAgICAgJiYgY2xpZW50VmVyc2lvbiA8PSByb3V0ZS5nZXRNYXhDbGllbnRWZXJzaW9uKCkpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFkZFJvdXRlKHJvdXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpLmFzQnVuZGxlKCk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiB1cGRhdGVDb21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0KCkgewotICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCBjb21wb3NpdGUgPSBudWxsOwotICAgICAgICBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlciBzZWxlY3RvckJ1aWxkZXIgPSBudWxsOwotICAgICAgICBib29sZWFuIGFjdGl2ZVNjYW4gPSBmYWxzZTsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNsaWVudHMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QgPSBtQ2xpZW50cy5nZXQoaSkubURpc2NvdmVyeVJlcXVlc3Q7Ci0gICAgICAgICAgICBpZiAocmVxdWVzdCAhPSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmICghcmVxdWVzdC5nZXRTZWxlY3RvcigpLmlzRW1wdHkoKSB8fCByZXF1ZXN0LmlzQWN0aXZlU2NhbigpKSkgewotICAgICAgICAgICAgICAgIGFjdGl2ZVNjYW4gfD0gcmVxdWVzdC5pc0FjdGl2ZVNjYW4oKTsKLSAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29tcG9zaXRlID0gcmVxdWVzdDsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoc2VsZWN0b3JCdWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdG9yQnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcihjb21wb3NpdGUuZ2V0U2VsZWN0b3IoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0b3JCdWlsZGVyLmFkZFNlbGVjdG9yKHJlcXVlc3QuZ2V0U2VsZWN0b3IoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3RvckJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgY29tcG9zaXRlID0gbmV3IE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KHNlbGVjdG9yQnVpbGRlci5idWlsZCgpLCBhY3RpdmVTY2FuKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIU9iamVjdHNDb21wYXQuZXF1YWxzKG1Db21wb3NpdGVEaXNjb3ZlcnlSZXF1ZXN0LCBjb21wb3NpdGUpKSB7Ci0gICAgICAgICAgICBtQ29tcG9zaXRlRGlzY292ZXJ5UmVxdWVzdCA9IGNvbXBvc2l0ZTsKLSAgICAgICAgICAgIG1Qcm92aWRlci5zZXREaXNjb3ZlcnlSZXF1ZXN0KGNvbXBvc2l0ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBDbGllbnRSZWNvcmQgZ2V0Q2xpZW50KE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKLSAgICAgICAgaW50IGluZGV4ID0gZmluZENsaWVudChtZXNzZW5nZXIpOwotICAgICAgICByZXR1cm4gaW5kZXggPj0gMCA/IG1DbGllbnRzLmdldChpbmRleCkgOiBudWxsOwotICAgIH0KLQotICAgIGludCBmaW5kQ2xpZW50KE1lc3NlbmdlciBtZXNzZW5nZXIpIHsKLSAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbUNsaWVudHMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIENsaWVudFJlY29yZCBjbGllbnQgPSBtQ2xpZW50cy5nZXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2xpZW50Lmhhc01lc3NlbmdlcihtZXNzZW5nZXIpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNlbmRHZW5lcmljRmFpbHVyZShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkKSB7Ci0gICAgICAgIGlmIChyZXF1ZXN0SWQgIT0gMCkgewotICAgICAgICAgICAgc2VuZFJlcGx5KG1lc3NlbmdlciwgU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFLCByZXF1ZXN0SWQsIDAsIG51bGwsIG51bGwpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZW5kR2VuZXJpY1N1Y2Nlc3MoTWVzc2VuZ2VyIG1lc3NlbmdlciwgaW50IHJlcXVlc3RJZCkgewotICAgICAgICBpZiAocmVxdWVzdElkICE9IDApIHsKLSAgICAgICAgICAgIHNlbmRSZXBseShtZXNzZW5nZXIsIFNFUlZJQ0VfTVNHX0dFTkVSSUNfU1VDQ0VTUywgcmVxdWVzdElkLCAwLCBudWxsLCBudWxsKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB2b2lkIHNlbmRSZXBseShNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgd2hhdCwKLSAgICAgICAgICAgIGludCByZXF1ZXN0SWQsIGludCBhcmcsIE9iamVjdCBvYmosIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oKTsKLSAgICAgICAgbXNnLndoYXQgPSB3aGF0OwotICAgICAgICBtc2cuYXJnMSA9IHJlcXVlc3RJZDsKLSAgICAgICAgbXNnLmFyZzIgPSBhcmc7Ci0gICAgICAgIG1zZy5vYmogPSBvYmo7Ci0gICAgICAgIG1zZy5zZXREYXRhKGRhdGEpOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgbWVzc2VuZ2VyLnNlbmQobXNnKTsKLSAgICAgICAgfSBjYXRjaCAoRGVhZE9iamVjdEV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgLy8gVGhlIGNsaWVudCBkaWVkLgotICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgIExvZy5lKFRBRywgIkNvdWxkIG5vdCBzZW5kIG1lc3NhZ2UgdG8gIiArIGdldENsaWVudElkKG1lc3NlbmdlciksIGV4KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyBTdHJpbmcgZ2V0Q2xpZW50SWQoTWVzc2VuZ2VyIG1lc3NlbmdlcikgewotICAgICAgICByZXR1cm4gIkNsaWVudCBjb25uZWN0aW9uICIgKyBtZXNzZW5nZXIuZ2V0QmluZGVyKCkudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFByaXZhdGVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIFByaXZhdGVIYW5kbGVyKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIHN3aXRjaCAobXNnLndoYXQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFBSSVZBVEVfTVNHX0NMSUVOVF9ESUVEOgotICAgICAgICAgICAgICAgICAgICBvbkJpbmRlckRpZWQoKE1lc3Nlbmdlciltc2cub2JqKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGNsYXNzIFByb3ZpZGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVJvdXRlUHJvdmlkZXIuQ2FsbGJhY2sgewotICAgICAgICBQcm92aWRlckNhbGxiYWNrKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRGVzY3JpcHRvckNoYW5nZWQoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgc2VuZERlc2NyaXB0b3JDaGFuZ2VkKGRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDbGllbnRSZWNvcmQgaW1wbGVtZW50cyBEZWF0aFJlY2lwaWVudCB7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBNZXNzZW5nZXIgbU1lc3NlbmdlcjsKLSAgICAgICAgcHVibGljIGZpbmFsIGludCBtVmVyc2lvbjsKLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IG1EaXNjb3ZlcnlSZXF1ZXN0OwotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3BhcnNlQXJyYXk8TWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlcj4gbUNvbnRyb2xsZXJzID0KLSAgICAgICAgICAgICAgICBuZXcgU3BhcnNlQXJyYXk8TWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlcj4oKTsKLQotICAgICAgICBwdWJsaWMgQ2xpZW50UmVjb3JkKE1lc3NlbmdlciBtZXNzZW5nZXIsIGludCB2ZXJzaW9uKSB7Ci0gICAgICAgICAgICBtTWVzc2VuZ2VyID0gbWVzc2VuZ2VyOwotICAgICAgICAgICAgbVZlcnNpb24gPSB2ZXJzaW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXIoKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIG1NZXNzZW5nZXIuZ2V0QmluZGVyKCkubGlua1RvRGVhdGgodGhpcywgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBiaW5kZXJEaWVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgaW50IGNvdW50ID0gbUNvbnRyb2xsZXJzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy52YWx1ZUF0KGkpLm9uUmVsZWFzZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbUNvbnRyb2xsZXJzLmNsZWFyKCk7Ci0KLSAgICAgICAgICAgIG1NZXNzZW5nZXIuZ2V0QmluZGVyKCkudW5saW5rVG9EZWF0aCh0aGlzLCAwKTsKLQotICAgICAgICAgICAgc2V0RGlzY292ZXJ5UmVxdWVzdChudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGhhc01lc3NlbmdlcihNZXNzZW5nZXIgb3RoZXIpIHsKLSAgICAgICAgICAgIHJldHVybiBtTWVzc2VuZ2VyLmdldEJpbmRlcigpID09IG90aGVyLmdldEJpbmRlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gY3JlYXRlUm91dGVDb250cm9sbGVyKFN0cmluZyByb3V0ZUlkLCBTdHJpbmcgcm91dGVHcm91cElkLAotICAgICAgICAgICAgICAgIGludCBjb250cm9sbGVySWQpIHsKLSAgICAgICAgICAgIGlmIChtQ29udHJvbGxlcnMuaW5kZXhPZktleShjb250cm9sbGVySWQpIDwgMCkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IHJvdXRlR3JvdXBJZCA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICAgICA/IG1Qcm92aWRlci5vbkNyZWF0ZVJvdXRlQ29udHJvbGxlcihyb3V0ZUlkKQotICAgICAgICAgICAgICAgICAgICAgICAgOiBtUHJvdmlkZXIub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIocm91dGVJZCwgcm91dGVHcm91cElkKTsKLSAgICAgICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250cm9sbGVycy5wdXQoY29udHJvbGxlcklkLCBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVsZWFzZVJvdXRlQ29udHJvbGxlcihpbnQgY29udHJvbGxlcklkKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBtQ29udHJvbGxlcnMuZ2V0KGNvbnRyb2xsZXJJZCk7Ci0gICAgICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJzLnJlbW92ZShjb250cm9sbGVySWQpOwotICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlciBnZXRSb3V0ZUNvbnRyb2xsZXIoaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sbGVycy5nZXQoY29udHJvbGxlcklkKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHNldERpc2NvdmVyeVJlcXVlc3QoTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgcmVxdWVzdCkgewotICAgICAgICAgICAgaWYgKCFPYmplY3RzQ29tcGF0LmVxdWFscyhtRGlzY292ZXJ5UmVxdWVzdCwgcmVxdWVzdCkpIHsKLSAgICAgICAgICAgICAgICBtRGlzY292ZXJ5UmVxdWVzdCA9IHJlcXVlc3Q7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0ZUNvbXBvc2l0ZURpc2NvdmVyeVJlcXVlc3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJ1bnMgb24gYSBiaW5kZXIgdGhyZWFkLgotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgYmluZGVyRGllZCgpIHsKLSAgICAgICAgICAgIG1Qcml2YXRlSGFuZGxlci5vYnRhaW5NZXNzYWdlKFBSSVZBVEVfTVNHX0NMSUVOVF9ESUVELCBtTWVzc2VuZ2VyKS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgcmV0dXJuIGdldENsaWVudElkKG1NZXNzZW5nZXIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlciB0aGF0IHJlY2VpdmVzIG1lc3NhZ2VzIGZyb20gY2xpZW50cy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlubmVyIGNsYXNzIGlzIHN0YXRpYyBhbmQgb25seSByZXRhaW5zIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIHNlcnZpY2UKLSAgICAgKiB0byBwcmV2ZW50IHRoZSBzZXJ2aWNlIGZyb20gYmVpbmcgbGVha2VkIGluIGNhc2Ugb25lIG9mIHRoZSBjbGllbnRzIGlzIGhvbGRpbmcgYW4KLSAgICAgKiBhY3RpdmUgcmVmZXJlbmNlIHRvIHRoZSBzZXJ2ZXIncyBtZXNzZW5nZXIuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgaGFuZGxlciBzaG91bGQgbm90IGJlIHVzZWQgdG8gaGFuZGxlIGFueSBtZXNzYWdlcyBvdGhlciB0aGFuIHRob3NlCi0gICAgICogdGhhdCBjb21lIGZyb20gdGhlIGNsaWVudC4KLSAgICAgKiA8L3A+Ci0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVjZWl2ZUhhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVQcm92aWRlclNlcnZpY2U+IG1TZXJ2aWNlUmVmOwotCi0gICAgICAgIHB1YmxpYyBSZWNlaXZlSGFuZGxlcihNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlIHNlcnZpY2UpIHsKLSAgICAgICAgICAgIG1TZXJ2aWNlUmVmID0gbmV3IFdlYWtSZWZlcmVuY2U8TWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZT4oc2VydmljZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgZmluYWwgTWVzc2VuZ2VyIG1lc3NlbmdlciA9IG1zZy5yZXBseVRvOwotICAgICAgICAgICAgaWYgKGlzVmFsaWRSZW1vdGVNZXNzZW5nZXIobWVzc2VuZ2VyKSkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aGF0ID0gbXNnLndoYXQ7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcXVlc3RJZCA9IG1zZy5hcmcxOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBhcmcgPSBtc2cuYXJnMjsKLSAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqID0gbXNnLm9iajsKLSAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgZGF0YSA9IG1zZy5wZWVrRGF0YSgpOwotICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc01lc3NhZ2Uod2hhdCwgbWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgb2JqLCBkYXRhKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgZ2V0Q2xpZW50SWQobWVzc2VuZ2VyKSArICI6IE1lc3NhZ2UgZmFpbGVkLCB3aGF0PSIgKyB3aGF0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgcmVxdWVzdElkPSIgKyByZXF1ZXN0SWQgKyAiLCBhcmc9IiArIGFyZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIG9iaj0iICsgb2JqICsgIiwgZGF0YT0iICsgZGF0YSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2VuZEdlbmVyaWNGYWlsdXJlKG1lc3NlbmdlciwgcmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJJZ25vcmluZyBtZXNzYWdlIHdpdGhvdXQgdmFsaWQgcmVwbHkgbWVzc2VuZ2VyLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBwcm9jZXNzTWVzc2FnZShpbnQgd2hhdCwKLSAgICAgICAgICAgICAgICBNZXNzZW5nZXIgbWVzc2VuZ2VyLCBpbnQgcmVxdWVzdElkLCBpbnQgYXJnLCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyU2VydmljZSBzZXJ2aWNlID0gbVNlcnZpY2VSZWYuZ2V0KCk7Ci0gICAgICAgICAgICBpZiAoc2VydmljZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19SRUdJU1RFUjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uUmVnaXN0ZXJDbGllbnQobWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSBDTElFTlRfTVNHX1VOUkVHSVNURVI6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblVucmVnaXN0ZXJDbGllbnQobWVzc2VuZ2VyLCByZXF1ZXN0SWQpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUjogewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHJvdXRlSWQgPSBkYXRhLmdldFN0cmluZyhDTElFTlRfREFUQV9ST1VURV9JRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcm91dGVHcm91cElkID0gZGF0YS5nZXRTdHJpbmcoQ0xJRU5UX0RBVEFfUk9VVEVfTElCUkFSWV9HUk9VUCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocm91dGVJZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzZW5nZXIsIHJlcXVlc3RJZCwgYXJnLCByb3V0ZUlkLCByb3V0ZUdyb3VwSWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfUkVMRUFTRV9ST1VURV9DT05UUk9MTEVSOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25SZWxlYXNlUm91dGVDb250cm9sbGVyKG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblNlbGVjdFJvdXRlKG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcpOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19VTlNFTEVDVF9ST1VURToKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCByZWFzb24gPSBkYXRhID09IG51bGwgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGRhdGEuZ2V0SW50KENMSUVOVF9EQVRBX1VOU0VMRUNUX1JFQVNPTiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTik7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblVuc2VsZWN0Um91dGUobWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgcmVhc29uKTsKLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfU0VUX1JPVVRFX1ZPTFVNRTogewotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZvbHVtZSA9IGRhdGEuZ2V0SW50KENMSUVOVF9EQVRBX1ZPTFVNRSwgLTEpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZvbHVtZSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlcnZpY2Uub25TZXRSb3V0ZVZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19VUERBVEVfUk9VVEVfVk9MVU1FOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEgPSBkYXRhLmdldEludChDTElFTlRfREFUQV9WT0xVTUUsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRlbHRhICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VydmljZS5vblVwZGF0ZVJvdXRlVm9sdW1lKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2VuZ2VyLCByZXF1ZXN0SWQsIGFyZywgZGVsdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBjYXNlIENMSUVOVF9NU0dfUk9VVEVfQ09OVFJPTF9SRVFVRVNUOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiBpbnN0YW5jZW9mIEludGVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uUm91dGVDb250cm9sUmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLCBhcmcsIChJbnRlbnQpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ0xJRU5UX01TR19TRVRfRElTQ09WRVJZX1JFUVVFU1Q6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0LmZyb21CdW5kbGUoKEJ1bmRsZSlvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJ2aWNlLm9uU2V0RGlzY292ZXJ5UmVxdWVzdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NlbmdlciwgcmVxdWVzdElkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCAhPSBudWxsICYmIHJlcXVlc3QuaXNWYWxpZCgpID8gcmVxdWVzdCA6IG51bGwpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVTZWxlY3Rvci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL01lZGlhUm91dGVTZWxlY3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NjY5YjE5Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlU2VsZWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIGNhcGFiaWxpdGllcyBvZiByb3V0ZXMgdGhhdCBhcHBsaWNhdGlvbnMgd291bGQgbGlrZSB0byBkaXNjb3ZlciBhbmQgdXNlLgotICogPHA+Ci0gKiBUaGlzIG9iamVjdCBpcyBpbW11dGFibGUgb25jZSBjcmVhdGVkIHVzaW5nIGEge0BsaW5rIEJ1aWxkZXJ9IGluc3RhbmNlLgotICogPC9wPgotICoKLSAqIDxoMz5FeGFtcGxlPC9oMz4KLSAqIDxwcmU+Ci0gKiBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3JCdWlsZGVyID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCkKLSAqICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTykKLSAqICAgICAgICAgLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKQotICogICAgICAgICAuYnVpbGQoKTsKLSAqCi0gKiBNZWRpYVJvdXRlciByb3V0ZXIgPSBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZShjb250ZXh0KTsKLSAqIHJvdXRlci5hZGRDYWxsYmFjayhzZWxlY3RvciwgY2FsbGJhY2ssIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkpOwotICogPC9wcmU+Ci0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNZWRpYVJvdXRlU2VsZWN0b3IgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX0NPTlRST0xfQ0FURUdPUklFUyA9ICJjb250cm9sQ2F0ZWdvcmllcyI7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEJ1bmRsZSBtQnVuZGxlOwotICAgIExpc3Q8U3RyaW5nPiBtQ29udHJvbENhdGVnb3JpZXM7Ci0KLSAgICAvKioKLSAgICAgKiBBbiBlbXB0eSBtZWRpYSByb3V0ZSBzZWxlY3RvciB0aGF0IHdpbGwgbm90IG1hdGNoIGFueSByb3V0ZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBNZWRpYVJvdXRlU2VsZWN0b3IgRU1QVFkgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yKG5ldyBCdW5kbGUoKSwgbnVsbCk7Ci0KLSAgICBNZWRpYVJvdXRlU2VsZWN0b3IoQnVuZGxlIGJ1bmRsZSwgTGlzdDxTdHJpbmc+IGNvbnRyb2xDYXRlZ29yaWVzKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcyA9IGNvbnRyb2xDYXRlZ29yaWVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3JpZXN9IGluIHRoZSBzZWxlY3Rvci4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGxpc3Qgb2YgY2F0ZWdvcmllcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgTGlzdDxTdHJpbmc+IGdldENvbnRyb2xDYXRlZ29yaWVzKCkgewotICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzOwotICAgIH0KLQotICAgIHZvaWQgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKSB7Ci0gICAgICAgIGlmIChtQ29udHJvbENhdGVnb3JpZXMgPT0gbnVsbCkgewotICAgICAgICAgICAgbUNvbnRyb2xDYXRlZ29yaWVzID0gbUJ1bmRsZS5nZXRTdHJpbmdBcnJheUxpc3QoS0VZX0NPTlRST0xfQ0FURUdPUklFUyk7Ci0gICAgICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzID09IG51bGwgfHwgbUNvbnRyb2xDYXRlZ29yaWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcyA9IENvbGxlY3Rpb25zLjxTdHJpbmc+ZW1wdHlMaXN0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlbGVjdG9yIGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgY2F0ZWdvcnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgVGhlIGNhdGVnb3J5IHRvIGNoZWNrLgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgY2F0ZWdvcnkgaXMgcHJlc2VudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb250cm9sQ2F0ZWdvcnkoU3RyaW5nIGNhdGVnb3J5KSB7Ci0gICAgICAgIGlmIChjYXRlZ29yeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgZmluYWwgaW50IGNhdGVnb3J5Q291bnQgPSBtQ29udHJvbENhdGVnb3JpZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYXRlZ29yeUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzLmdldChpKS5lcXVhbHMoY2F0ZWdvcnkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBtYXRjaGVzIGF0IGxlYXN0IG9uZSBvZiB0aGUgc3BlY2lmaWVkIGNvbnRyb2wgZmlsdGVycy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWx0ZXJzIFRoZSBsaXN0IG9mIGNvbnRyb2wgZmlsdGVycyB0byBjb25zaWRlci4KLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgYSBtYXRjaCBpcyBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBtYXRjaGVzQ29udHJvbEZpbHRlcnMoTGlzdDxJbnRlbnRGaWx0ZXI+IGZpbHRlcnMpIHsKLSAgICAgICAgaWYgKGZpbHRlcnMgIT0gbnVsbCkgewotICAgICAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIGZpbmFsIGludCBjYXRlZ29yeUNvdW50ID0gbUNvbnRyb2xDYXRlZ29yaWVzLnNpemUoKTsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeUNvdW50ICE9IDApIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmlsdGVyQ291bnQgPSBmaWx0ZXJzLnNpemUoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbHRlckNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgSW50ZW50RmlsdGVyIGZpbHRlciA9IGZpbHRlcnMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZmlsdGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY2F0ZWdvcnlDb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpbHRlci5oYXNDYXRlZ29yeShtQ29udHJvbENhdGVnb3JpZXMuZ2V0KGopKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNlbGVjdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUgY2FwYWJpbGl0aWVzIGRlc2NyaWJlZAotICAgICAqIGJ5IHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRvIGJlIGV4YW1pbmVkLgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHNlbGVjdG9yIGNvbnRhaW5zIGFsbCBvZiB0aGUgY2FwYWJpbGl0aWVzIGRlc2NyaWJlZAotICAgICAqIGJ5IHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICAgICAgc2VsZWN0b3IuZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIHJldHVybiBtQ29udHJvbENhdGVnb3JpZXMuY29udGFpbnNBbGwoc2VsZWN0b3IubUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBkb2VzIG5vdCBzcGVjaWZ5IGFueSBjYXBhYmlsaXRpZXMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgcmV0dXJuIG1Db250cm9sQ2F0ZWdvcmllcy5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzZWxlY3RvciBoYXMgYWxsIG9mIHRoZSByZXF1aXJlZCBmaWVsZHMuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNWYWxpZCgpIHsKLSAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcy5jb250YWlucyhudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBpZiAobyBpbnN0YW5jZW9mIE1lZGlhUm91dGVTZWxlY3RvcikgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yIG90aGVyID0gKE1lZGlhUm91dGVTZWxlY3RvcilvOwotICAgICAgICAgICAgZW5zdXJlQ29udHJvbENhdGVnb3JpZXMoKTsKLSAgICAgICAgICAgIG90aGVyLmVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzLmVxdWFscyhvdGhlci5tQ29udHJvbENhdGVnb3JpZXMpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBlbnN1cmVDb250cm9sQ2F0ZWdvcmllcygpOwotICAgICAgICByZXR1cm4gbUNvbnRyb2xDYXRlZ29yaWVzLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJNZWRpYVJvdXRlU2VsZWN0b3J7ICIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCJjb250cm9sQ2F0ZWdvcmllcz0iKS5hcHBlbmQoCi0gICAgICAgICAgICAgICAgQXJyYXlzLnRvU3RyaW5nKGdldENvbnRyb2xDYXRlZ29yaWVzKCkudG9BcnJheSgpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiB9Iik7Ci0gICAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyB0aGlzIG9iamVjdCB0byBhIGJ1bmRsZSBmb3Igc2VyaWFsaXphdGlvbi4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIHRoZSBvYmplY3QgcmVwcmVzZW50ZWQgYXMgYSBidW5kbGUuCi0gICAgICovCi0gICAgcHVibGljIEJ1bmRsZSBhc0J1bmRsZSgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiBpbnN0YW5jZSBmcm9tIGEgYnVuZGxlLgotICAgICAqCi0gICAgICogQHBhcmFtIGJ1bmRsZSBUaGUgYnVuZGxlLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHJldHVybiBUaGUgbmV3IGluc3RhbmNlLCBvciBudWxsIGlmIHRoZSBidW5kbGUgd2FzIG51bGwuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBNZWRpYVJvdXRlU2VsZWN0b3IgZnJvbUJ1bmRsZShATnVsbGFibGUgQnVuZGxlIGJ1bmRsZSkgewotICAgICAgICByZXR1cm4gYnVuZGxlICE9IG51bGwgPyBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yKGJ1bmRsZSwgbnVsbCkgOiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkZXIgZm9yIHtAbGluayBNZWRpYVJvdXRlU2VsZWN0b3IgbWVkaWEgcm91dGUgc2VsZWN0b3JzfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewotICAgICAgICBwcml2YXRlIEFycmF5TGlzdDxTdHJpbmc+IG1Db250cm9sQ2F0ZWdvcmllczsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhbiBlbXB0eSBtZWRpYSByb3V0ZSBzZWxlY3RvciBidWlsZGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ3JlYXRlcyBhIG1lZGlhIHJvdXRlIHNlbGVjdG9yIGRlc2NyaXB0b3IgYnVpbGRlciB3aG9zZSBpbml0aWFsIGNvbnRlbnRzIGFyZQotICAgICAgICAgKiBjb3BpZWQgZnJvbSBhbiBleGlzdGluZyBzZWxlY3Rvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvcikgewotICAgICAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNlbGVjdG9yLmVuc3VyZUNvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICBpZiAoIXNlbGVjdG9yLm1Db250cm9sQ2F0ZWdvcmllcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oc2VsZWN0b3IubUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBZGRzIGEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3J5fSB0byB0aGUgYnVpbGRlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5IFRoZSBjYXRlZ29yeSB0byBhZGQgdG8gdGhlIHNldCBvZiBkZXNpcmVkIGNhcGFiaWxpdGllcywgc3VjaCBhcwotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0NBVEVHT1JZX0xJVkVfQVVESU99LgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyIGluc3RhbmNlIGZvciBjaGFpbmluZy4KLSAgICAgICAgICovCi0gICAgICAgIEBOb25OdWxsCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZENvbnRyb2xDYXRlZ29yeShATm9uTnVsbCBTdHJpbmcgY2F0ZWdvcnkpIHsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2F0ZWdvcnkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUNvbnRyb2xDYXRlZ29yaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29udHJvbENhdGVnb3JpZXMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghbUNvbnRyb2xDYXRlZ29yaWVzLmNvbnRhaW5zKGNhdGVnb3J5KSkgewotICAgICAgICAgICAgICAgIG1Db250cm9sQ2F0ZWdvcmllcy5hZGQoY2F0ZWdvcnkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQWRkcyBhIGxpc3Qgb2Yge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGNhdGVnb3JpZXN9IHRvIHRoZSBidWlsZGVyLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY2F0ZWdvcmllcyBUaGUgbGlzdCBjYXRlZ29yaWVzIHRvIGFkZCB0byB0aGUgc2V0IG9mIGRlc2lyZWQgY2FwYWJpbGl0aWVzLAotICAgICAgICAgKiBzdWNoIGFzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJT30uCi0gICAgICAgICAqIEByZXR1cm4gVGhlIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIGNoYWluaW5nLgotICAgICAgICAgKi8KLSAgICAgICAgQE5vbk51bGwKLSAgICAgICAgcHVibGljIEJ1aWxkZXIgYWRkQ29udHJvbENhdGVnb3JpZXMoQE5vbk51bGwgQ29sbGVjdGlvbjxTdHJpbmc+IGNhdGVnb3JpZXMpIHsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yaWVzID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYXRlZ29yaWVzIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKCFjYXRlZ29yaWVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIGZvciAoU3RyaW5nIGNhdGVnb3J5IDogY2F0ZWdvcmllcykgewotICAgICAgICAgICAgICAgICAgICBhZGRDb250cm9sQ2F0ZWdvcnkoY2F0ZWdvcnkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEFkZHMgdGhlIGNvbnRlbnRzIG9mIGFuIGV4aXN0aW5nIG1lZGlhIHJvdXRlIHNlbGVjdG9yIHRvIHRoZSBidWlsZGVyLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIG1lZGlhIHJvdXRlIHNlbGVjdG9yIHdob3NlIGNvbnRlbnRzIGFyZSB0byBiZSBhZGRlZC4KLSAgICAgICAgICogQHJldHVybiBUaGUgYnVpbGRlciBpbnN0YW5jZSBmb3IgY2hhaW5pbmcuCi0gICAgICAgICAqLwotICAgICAgICBATm9uTnVsbAotICAgICAgICBwdWJsaWMgQnVpbGRlciBhZGRTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBhZGRDb250cm9sQ2F0ZWdvcmllcyhzZWxlY3Rvci5nZXRDb250cm9sQ2F0ZWdvcmllcygpKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhUm91dGVTZWxlY3RvciBtZWRpYSByb3V0ZSBzZWxlY3Rvcn0uCi0gICAgICAgICAqLwotICAgICAgICBATm9uTnVsbAotICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZVNlbGVjdG9yIGJ1aWxkKCkgewotICAgICAgICAgICAgaWYgKG1Db250cm9sQ2F0ZWdvcmllcyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEVNUFRZOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQnVuZGxlIGJ1bmRsZSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGJ1bmRsZS5wdXRTdHJpbmdBcnJheUxpc3QoS0VZX0NPTlRST0xfQ0FURUdPUklFUywgbUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yKGJ1bmRsZSwgbUNvbnRyb2xDYXRlZ29yaWVzKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFSb3V0ZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjAwNTJlLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVJvdXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjk5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFubm90YXRpb24uSW50RGVmOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5Ob25OdWxsOwotaW1wb3J0IGFuZHJvaWQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLmFwcC5BY3Rpdml0eU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRlbnRSZXNvbHZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudFNlbmRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXIuTmFtZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5Mb29wZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5NZXNzYWdlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5hcHAuQWN0aXZpdHlNYW5hZ2VyQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5oYXJkd2FyZS5kaXNwbGF5LkRpc3BsYXlNYW5hZ2VyQ29tcGF0OwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC5tZWRpYS5Wb2x1bWVQcm92aWRlckNvbXBhdDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQudjQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb25Db21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LnY0LnV0aWwuUGFpcjsKLWltcG9ydCBhbmRyb2lkLnRleHQuVGV4dFV0aWxzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Qcm92aWRlck1ldGFkYXRhOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyLlJvdXRlQ29udHJvbGxlcjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBNZWRpYVJvdXRlciBhbGxvd3MgYXBwbGljYXRpb25zIHRvIGNvbnRyb2wgdGhlIHJvdXRpbmcgb2YgbWVkaWEgY2hhbm5lbHMKLSAqIGFuZCBzdHJlYW1zIGZyb20gdGhlIGN1cnJlbnQgZGV2aWNlIHRvIGV4dGVybmFsIHNwZWFrZXJzIGFuZCBkZXN0aW5hdGlvbiBkZXZpY2VzLgotICogPHA+Ci0gKiBBIE1lZGlhUm91dGVyIGluc3RhbmNlIGlzIHJldHJpZXZlZCB0aHJvdWdoIHtAbGluayAjZ2V0SW5zdGFuY2V9LiAgQXBwbGljYXRpb25zCi0gKiBjYW4gcXVlcnkgdGhlIG1lZGlhIHJvdXRlciBhYm91dCB0aGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGFuZCBpdHMgY2FwYWJpbGl0aWVzCi0gKiB0byBkZXRlcm1pbmUgaG93IHRvIHNlbmQgY29udGVudCB0byB0aGUgcm91dGUncyBkZXN0aW5hdGlvbi4gIEFwcGxpY2F0aW9ucyBjYW4KLSAqIGFsc28ge0BsaW5rIFJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3Qgc2VuZCBjb250cm9sIHJlcXVlc3RzfSB0byB0aGUgcm91dGUKLSAqIHRvIGFzayB0aGUgcm91dGUncyBkZXN0aW5hdGlvbiB0byBwZXJmb3JtIGNlcnRhaW4gcmVtb3RlIGNvbnRyb2wgZnVuY3Rpb25zCi0gKiBzdWNoIGFzIHBsYXlpbmcgbWVkaWEuCi0gKiA8L3A+PHA+Ci0gKiBTZWUgYWxzbyB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyfSBmb3IgaW5mb3JtYXRpb24gb24gaG93IGFuIGFwcGxpY2F0aW9uCi0gKiBjYW4gcHVibGlzaCBuZXcgbWVkaWEgcm91dGVzIHRvIHRoZSBtZWRpYSByb3V0ZXIuCi0gKiA8L3A+PHA+Ci0gKiBUaGUgbWVkaWEgcm91dGVyIEFQSSBpcyBub3QgdGhyZWFkLXNhZmU7IGFsbCBpbnRlcmFjdGlvbnMgd2l0aCBpdCBtdXN0IGJlCi0gKiBkb25lIGZyb20gdGhlIG1haW4gdGhyZWFkIG9mIHRoZSBwcm9jZXNzLgotICogPC9wPgotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgTWVkaWFSb3V0ZXIgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIk1lZGlhUm91dGVyIjsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIC8qKgotICAgICAqIFBhc3NlZCB0byB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIjb25VbnNlbGVjdChpbnQpfQotICAgICAqIGFuZCB7QGxpbmsgQ2FsbGJhY2sjb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIsIFJvdXRlSW5mbywgaW50KX0gd2hlbiB0aGUgcmVhc29uIHRoZSByb3V0ZQotICAgICAqIHdhcyB1bnNlbGVjdGVkIGlzIHVua25vd24uCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVU5TRUxFQ1RfUkVBU09OX1VOS05PV04gPSAwOwotICAgIC8qKgotICAgICAqIFBhc3NlZCB0byB7QGxpbmsgYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLk1lZGlhUm91dGVQcm92aWRlci5Sb3V0ZUNvbnRyb2xsZXIjb25VbnNlbGVjdChpbnQpfQotICAgICAqIGFuZCB7QGxpbmsgQ2FsbGJhY2sjb25Sb3V0ZVVuc2VsZWN0ZWQoTWVkaWFSb3V0ZXIsIFJvdXRlSW5mbywgaW50KX0gd2hlbiB0aGUgdXNlciBwcmVzc2VkCi0gICAgICogdGhlIGRpc2Nvbm5lY3QgYnV0dG9uIHRvIGRpc2Nvbm5lY3QgYW5kIGtlZXAgcGxheWluZy4KLSAgICAgKiA8cD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZURlc2NyaXB0b3IjY2FuRGlzY29ubmVjdEFuZEtlZXBQbGF5aW5nKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNFTEVDVF9SRUFTT05fRElTQ09OTkVDVEVEID0gMTsKLSAgICAvKioKLSAgICAgKiBQYXNzZWQgdG8ge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyI29uVW5zZWxlY3QoaW50KX0KLSAgICAgKiBhbmQge0BsaW5rIENhbGxiYWNrI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9IHdoZW4gdGhlIHVzZXIgcHJlc3NlZAotICAgICAqIHRoZSBzdG9wIGNhc3RpbmcgYnV0dG9uLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFVOU0VMRUNUX1JFQVNPTl9TVE9QUEVEID0gMjsKLSAgICAvKioKLSAgICAgKiBQYXNzZWQgdG8ge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXIuUm91dGVDb250cm9sbGVyI29uVW5zZWxlY3QoaW50KX0KLSAgICAgKiBhbmQge0BsaW5rIENhbGxiYWNrI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9IHdoZW4gdGhlIHVzZXIgc2VsZWN0ZWQKLSAgICAgKiBhIGRpZmZlcmVudCByb3V0ZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBVTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRCA9IDM7Ci0KLSAgICAvLyBNYWludGFpbnMgZ2xvYmFsIG1lZGlhIHJvdXRlciBzdGF0ZSBmb3IgdGhlIHByb2Nlc3MuCi0gICAgLy8gVGhpcyBmaWVsZCBpcyBpbml0aWFsaXplZCBpbiBNZWRpYVJvdXRlci5nZXRJbnN0YW5jZSgpIGJlZm9yZSBhbnkKLSAgICAvLyBNZWRpYVJvdXRlciBvYmplY3RzIGFyZSBpbnN0YW50aWF0ZWQgc28gaXQgaXMgZ3VhcmFudGVlZCB0byBiZQotICAgIC8vIHZhbGlkIHdoZW5ldmVyIGFueSBpbnN0YW5jZSBtZXRob2QgaXMgaW52b2tlZC4KLSAgICBzdGF0aWMgR2xvYmFsTWVkaWFSb3V0ZXIgc0dsb2JhbDsKLQotICAgIC8vIENvbnRleHQtYm91bmQgc3RhdGUgb2YgdGhlIG1lZGlhIHJvdXRlci4KLSAgICBmaW5hbCBDb250ZXh0IG1Db250ZXh0OwotICAgIGZpbmFsIEFycmF5TGlzdDxDYWxsYmFja1JlY29yZD4gbUNhbGxiYWNrUmVjb3JkcyA9IG5ldyBBcnJheUxpc3Q8Q2FsbGJhY2tSZWNvcmQ+KCk7Ci0KLSAgICBASW50RGVmKGZsYWcgPSB0cnVlLAotICAgICAgICAgICAgdmFsdWUgPSB7Ci0gICAgICAgICAgICAgICAgICAgIENBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTiwKLSAgICAgICAgICAgICAgICAgICAgQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSwKLSAgICAgICAgICAgICAgICAgICAgQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UUwotICAgICAgICAgICAgfQotICAgICkKLSAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgcHJpdmF0ZSBAaW50ZXJmYWNlIENhbGxiYWNrRmxhZ3Mge30KLQotICAgIC8qKgotICAgICAqIEZsYWcgZm9yIHtAbGluayAjYWRkQ2FsbGJhY2t9OiBBY3RpdmVseSBzY2FuIGZvciByb3V0ZXMgd2hpbGUgdGhpcyBjYWxsYmFjawotICAgICAqIGlzIHJlZ2lzdGVyZWQuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgbWVkaWEgcm91dGVyIHdpbGwgYWN0aXZlbHkgc2NhbiBmb3IgbmV3Ci0gICAgICogcm91dGVzLiAgQ2VydGFpbiByb3V0ZXMsIHN1Y2ggYXMgd2lmaSBkaXNwbGF5IHJvdXRlcywgbWF5IG5vdCBiZSBkaXNjb3ZlcmFibGUKLSAgICAgKiBleGNlcHQgd2hlbiBhY3RpdmVseSBzY2FubmluZy4gIFRoaXMgZmxhZyBpcyB0eXBpY2FsbHkgdXNlZCB3aGVuIHRoZSByb3V0ZSBwaWNrZXIKLSAgICAgKiBkaWFsb2cgaGFzIGJlZW4gb3BlbmVkIGJ5IHRoZSB1c2VyIHRvIGVuc3VyZSB0aGF0IHRoZSByb3V0ZSBpbmZvcm1hdGlvbiBpcwotICAgICAqIHVwIHRvIGRhdGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFjdGl2ZSBzY2FubmluZyBtYXkgY29uc3VtZSBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBwb3dlciBhbmQgbWF5IGhhdmUgaW50cnVzaXZlCi0gICAgICogZWZmZWN0cyBvbiB3aXJlbGVzcyBjb25uZWN0aXZpdHkuICBUaGVyZWZvcmUgaXQgaXMgaW1wb3J0YW50IHRoYXQgYWN0aXZlIHNjYW5uaW5nCi0gICAgICogb25seSBiZSByZXF1ZXN0ZWQgd2hlbiBpdCBpcyBhY3R1YWxseSBuZWVkZWQgdG8gc2F0aXNmeSBhIHVzZXIgcmVxdWVzdCB0bwotICAgICAqIGRpc2NvdmVyIGFuZCBzZWxlY3QgYSBuZXcgcm91dGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoaXMgZmxhZyBpbXBsaWVzIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gYnV0IHBlcmZvcm1pbmcKLSAgICAgKiBhY3RpdmUgc2NhbnMgaXMgbXVjaCBtb3JlIGV4cGVuc2l2ZSB0aGFuIGEgbm9ybWFsIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4gPSAxIDw8IDA7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2FkZENhbGxiYWNrfTogRG8gbm90IGZpbHRlciByb3V0ZSBldmVudHMuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGlzIGZsYWcgaXMgc3BlY2lmaWVkLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkIGZvciBldmVudHMgdGhhdCBhZmZlY3QgYW55Ci0gICAgICogcm91dGUgZXZlbiBpZiB0aGV5IGRvIG5vdCBtYXRjaCB0aGUgY2FsbGJhY2sncyBmaWx0ZXIuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMgPSAxIDw8IDE7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2FkZENhbGxiYWNrfTogUmVxdWVzdCBwYXNzaXZlIHJvdXRlIGRpc2NvdmVyeSB3aGlsZSB0aGlzCi0gICAgICogY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCwgZXhjZXB0IG9uIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjaXNMb3dSYW1EZXZpY2UgbG93LVJBTSBkZXZpY2VzfS4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIHRoaXMgZmxhZyBpcyBzcGVjaWZpZWQsIHRoZSBtZWRpYSByb3V0ZXIgd2lsbCB0cnkgdG8gZGlzY292ZXIgcm91dGVzLgotICAgICAqIEFsdGhvdWdoIHJvdXRlIGRpc2NvdmVyeSBpcyBpbnRlbmRlZCB0byBiZSBlZmZpY2llbnQsIGNoZWNraW5nIGZvciBuZXcgcm91dGVzIG1heQotICAgICAqIHJlc3VsdCBpbiBzb21lIG5ldHdvcmsgYWN0aXZpdHkgYW5kIGNvdWxkIHNsb3dseSBkcmFpbiB0aGUgYmF0dGVyeS4gIFRoZXJlZm9yZQotICAgICAqIGFwcGxpY2F0aW9ucyBzaG91bGQgb25seSBzcGVjaWZ5IHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gd2hlbgotICAgICAqIHRoZXkgYXJlIHJ1bm5pbmcgaW4gdGhlIGZvcmVncm91bmQgYW5kIHdvdWxkIGxpa2UgdG8gcHJvdmlkZSB0aGUgdXNlciB3aXRoIHRoZQotICAgICAqIG9wdGlvbiBvZiBjb25uZWN0aW5nIHRvIG5ldyByb3V0ZXMuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFwcGxpY2F0aW9ucyBzaG91bGQgdHlwaWNhbGx5IGFkZCBhIGNhbGxiYWNrIHVzaW5nIHRoaXMgZmxhZyBpbiB0aGUKLSAgICAgKiB7QGxpbmsgYW5kcm9pZC5hcHAuQWN0aXZpdHkgYWN0aXZpdHknc30ge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uU3RhcnQgb25TdGFydH0KLSAgICAgKiBtZXRob2QgYW5kIHJlbW92ZSBpdCBpbiB0aGUge0BsaW5rIGFuZHJvaWQuYXBwLkFjdGl2aXR5I29uU3RvcCBvblN0b3B9IG1ldGhvZC4KLSAgICAgKiBUaGUge0BsaW5rIGFuZHJvaWQuc3VwcG9ydC52Ny5hcHAuTWVkaWFSb3V0ZURpc2NvdmVyeUZyYWdtZW50fSBmcmFnbWVudCBtYXkKLSAgICAgKiBhbHNvIGJlIHVzZWQgZm9yIHRoaXMgcHVycG9zZS4KLSAgICAgKiA8L3A+PHAgY2xhc3M9Im5vdGUiPgotICAgICAqIE9uIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjaXNMb3dSYW1EZXZpY2UgbG93LVJBTSBkZXZpY2VzfSB0aGlzIGZsYWcKLSAgICAgKiB3aWxsIGJlIGlnbm9yZWQuICBSZWZlciB0bwotICAgICAqIHtAbGluayAjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBDYWxsYmFjaywgaW50KSBhZGRDYWxsYmFja30gZm9yIGRldGFpbHMuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHNlZSBhbmRyb2lkLnN1cHBvcnQudjcuYXBwLk1lZGlhUm91dGVEaXNjb3ZlcnlGcmFnbWVudAotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUlkgPSAxIDw8IDI7Ci0KLSAgICAvKioKLSAgICAgKiBGbGFnIGZvciB7QGxpbmsgI2FkZENhbGxiYWNrfTogUmVxdWVzdCBwYXNzaXZlIHJvdXRlIGRpc2NvdmVyeSB3aGlsZSB0aGlzCi0gICAgICogY2FsbGJhY2sgaXMgcmVnaXN0ZXJlZCwgZXZlbiBvbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30uCi0gICAgICogPHAgY2xhc3M9Im5vdGUiPgotICAgICAqIFRoaXMgZmxhZyBoYXMgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBpbXBhY3Qgb24gbG93LVJBTSBkZXZpY2VzCi0gICAgICogc2luY2UgaXQgbWF5IGNhdXNlIG1hbnkgbWVkaWEgcm91dGUgcHJvdmlkZXJzIHRvIGJlIHN0YXJ0ZWQgc2ltdWx0YW5lb3VzbHkuCi0gICAgICogSXQgaXMgbXVjaCBiZXR0ZXIgdG8gdXNlIHtAbGluayAjQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWX0gaW5zdGVhZCB0byBhdm9pZAotICAgICAqIHBlcmZvcm1pbmcgcGFzc2l2ZSBkaXNjb3Zlcnkgb24gdGhlc2UgZGV2aWNlcyBhbHRvZ2V0aGVyLiAgUmVmZXIgdG8KLSAgICAgKiB7QGxpbmsgI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCkgYWRkQ2FsbGJhY2t9IGZvciBkZXRhaWxzLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgYW5kcm9pZC5zdXBwb3J0LnY3LmFwcC5NZWRpYVJvdXRlRGlzY292ZXJ5RnJhZ21lbnQKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWSA9IDEgPDwgMzsKLQotICAgIC8qKgotICAgICAqIEZsYWcgZm9yIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX06IElnbm9yZSB0aGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGZsYWcgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIG1hdGNoaW5nIG5vbi1kZWZhdWx0IHJvdXRlIGlzIGF2YWlsYWJsZS4KLSAgICAgKiBUaGlzIGNvbnN0cmFpbnQgbWF5IGJlIHVzZWQgdG8gZGVjaWRlIHdoZXRoZXIgdG8gb2ZmZXIgdGhlIHJvdXRlIGNob29zZXIgZGlhbG9nCi0gICAgICogdG8gdGhlIHVzZXIuICBUaGVyZSBpcyBubyBwb2ludCBvZmZlcmluZyB0aGUgY2hvb3NlciBpZiB0aGVyZSBhcmUgbm8KLSAgICAgKiBub24tZGVmYXVsdCBjaG9pY2VzLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBBVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURSA9IDEgPDwgMDsKLQotICAgIC8qKgotICAgICAqIEZsYWcgZm9yIHtAbGluayAjaXNSb3V0ZUF2YWlsYWJsZX06IFJlcXVpcmUgYW4gYWN0dWFsIHJvdXRlIHRvIGJlIG1hdGNoZWQuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhpcyBmbGFnIGlzIG5vdCBzZXQsIHRoZW4ge0BsaW5rICNpc1JvdXRlQXZhaWxhYmxlfSB3aWxsIHJldHVybiB0cnVlCi0gICAgICogaWYgaXQgaXMgcG9zc2libGUgdG8gZGlzY292ZXIgYSBtYXRjaGluZyByb3V0ZSBldmVuIGlmIGRpc2NvdmVyeSBpcyBub3QgaW4KLSAgICAgKiBwcm9ncmVzcyBvciBpZiBubyBtYXRjaGluZyByb3V0ZSBoYXMgeWV0IGJlZW4gZm91bmQuICBUaGlzIGZlYXR1cmUgaXMgdXNlZCB0bwotICAgICAqIHNhdmUgcmVzb3VyY2VzIGJ5IHJlbW92aW5nIHRoZSBuZWVkIHRvIHBlcmZvcm0gcGFzc2l2ZSByb3V0ZSBkaXNjb3Zlcnkgb24KLSAgICAgKiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30uCi0gICAgICogPC9wPjxwPgotICAgICAqIElmIHRoaXMgZmxhZyBpcyBzZXQsIHRoZW4ge0BsaW5rICNpc1JvdXRlQXZhaWxhYmxlfSB3aWxsIG9ubHkgcmV0dXJuIHRydWUgaWYKLSAgICAgKiBhIG1hdGNoaW5nIHJvdXRlIGhhcyBhY3R1YWxseSBiZWVuIGRpc2NvdmVyZWQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEFWQUlMQUJJTElUWV9GTEFHX1JFUVVJUkVfTUFUQ0ggPSAxIDw8IDE7Ci0KLSAgICBwcml2YXRlIE1lZGlhUm91dGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBtQ29udGV4dCA9IGNvbnRleHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyBhbiBpbnN0YW5jZSBvZiB0aGUgbWVkaWEgcm91dGVyIHNlcnZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoZSBjb250ZXh0LgotICAgICAqIDxwPgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBpcyByZXNwb25zaWJsZSBmb3IgaG9sZGluZyBhIHN0cm9uZyByZWZlcmVuY2UgdG8gdGhlIHJldHVybmVkCi0gICAgICoge0BsaW5rIE1lZGlhUm91dGVyfSBpbnN0YW5jZSwgc3VjaCBhcyBieSBzdG9yaW5nIHRoZSBpbnN0YW5jZSBpbiBhIGZpZWxkIG9mCi0gICAgICogdGhlIHtAbGluayBhbmRyb2lkLmFwcC5BY3Rpdml0eX0sIHRvIGVuc3VyZSB0aGF0IHRoZSBtZWRpYSByb3V0ZXIgcmVtYWlucyBhbGl2ZQotICAgICAqIGFzIGxvbmcgYXMgdGhlIGFwcGxpY2F0aW9uIGlzIHVzaW5nIGl0cyBmZWF0dXJlcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSW4gb3RoZXIgd29yZHMsIHRoZSBzdXBwb3J0IGxpYnJhcnkgb25seSBob2xkcyBhIHtAbGluayBXZWFrUmVmZXJlbmNlIHdlYWsgcmVmZXJlbmNlfQotICAgICAqIHRvIGVhY2ggbWVkaWEgcm91dGVyIGluc3RhbmNlLiAgV2hlbiB0aGVyZSBhcmUgbm8gcmVtYWluaW5nIHN0cm9uZyByZWZlcmVuY2VzIHRvIHRoZQotICAgICAqIG1lZGlhIHJvdXRlciBpbnN0YW5jZSwgYWxsIG9mIGl0cyBjYWxsYmFja3Mgd2lsbCBiZSByZW1vdmVkIGFuZCByb3V0ZSBkaXNjb3ZlcnkKLSAgICAgKiB3aWxsIG5vIGxvbmdlciBiZSBwZXJmb3JtZWQgb24gaXRzIGJlaGFsZi4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBtZWRpYSByb3V0ZXIgaW5zdGFuY2UgZm9yIHRoZSBjb250ZXh0LiAgVGhlIGFwcGxpY2F0aW9uIG11c3QgaG9sZAotICAgICAqIGEgc3Ryb25nIHJlZmVyZW5jZSB0byB0aGlzIG9iamVjdCBhcyBsb25nIGFzIGl0IGlzIGluIHVzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhUm91dGVyIGdldEluc3RhbmNlKEBOb25OdWxsIENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoc0dsb2JhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBzR2xvYmFsID0gbmV3IEdsb2JhbE1lZGlhUm91dGVyKGNvbnRleHQuZ2V0QXBwbGljYXRpb25Db250ZXh0KCkpOwotICAgICAgICAgICAgc0dsb2JhbC5zdGFydCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzR2xvYmFsLmdldFJvdXRlcihjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlc30gY3VycmVudGx5IGtub3duIHRvCi0gICAgICogdGhpcyBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8Um91dGVJbmZvPiBnZXRSb3V0ZXMoKSB7Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRSb3V0ZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXIuUHJvdmlkZXJJbmZvIHJvdXRlIHByb3ZpZGVyc30KLSAgICAgKiBjdXJyZW50bHkga25vd24gdG8gdGhpcyBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIExpc3Q8UHJvdmlkZXJJbmZvPiBnZXRQcm92aWRlcnMoKSB7Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRQcm92aWRlcnMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBkZWZhdWx0IHJvdXRlIGZvciBwbGF5aW5nIG1lZGlhIGNvbnRlbnQgb24gdGhlIHN5c3RlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgc3lzdGVtIGFsd2F5cyBwcm92aWRlcyBhIGRlZmF1bHQgcm91dGUuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgZGVmYXVsdCByb3V0ZSwgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBuZXZlciBiZSBudWxsLgotICAgICAqLwotICAgIEBOb25OdWxsCi0gICAgcHVibGljIFJvdXRlSW5mbyBnZXREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXREZWZhdWx0Um91dGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIGEgYmx1ZXRvb3RoIHJvdXRlIGZvciBwbGF5aW5nIG1lZGlhIGNvbnRlbnQgb24gdGhlIHN5c3RlbS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQSBibHVldG9vdGggcm91dGUsIGlmIGV4aXN0LCBvdGhlcndpc2UgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUm91dGVJbmZvIGdldEJsdWV0b290aFJvdXRlKCkgewotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0Qmx1ZXRvb3RoUm91dGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGFwcGxpY2F0aW9uIHNob3VsZCBleGFtaW5lIHRoZSByb3V0ZSdzCi0gICAgICoge0BsaW5rIFJvdXRlSW5mbyNnZXRDb250cm9sRmlsdGVycyBtZWRpYSBjb250cm9sIGludGVudCBmaWx0ZXJzfSB0byBhc3Nlc3MgdGhlCi0gICAgICogY2FwYWJpbGl0aWVzIG9mIHRoZSByb3V0ZSBiZWZvcmUgYXR0ZW1wdGluZyB0byB1c2UgaXQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogPGgzPkV4YW1wbGU8L2gzPgotICAgICAqIDxwcmU+Ci0gICAgICogcHVibGljIGJvb2xlYW4gcGxheU1vdmllKCkgewotICAgICAqICAgICBNZWRpYVJvdXRlciBtZWRpYVJvdXRlciA9IE1lZGlhUm91dGVyLmdldEluc3RhbmNlKGNvbnRleHQpOwotICAgICAqICAgICBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUgPSBtZWRpYVJvdXRlci5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgICoKLSAgICAgKiAgICAgLy8gRmlyc3QgdHJ5IHVzaW5nIHRoZSByZW1vdGUgcGxheWJhY2sgaW50ZXJmYWNlLCBpZiBzdXBwb3J0ZWQuCi0gICAgICogICAgIGlmIChyb3V0ZS5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKSkgewotICAgICAqICAgICAgICAgLy8gVGhlIHJvdXRlIHN1cHBvcnRzIHJlbW90ZSBwbGF5YmFjay4KLSAgICAgKiAgICAgICAgIC8vIFRyeSB0byBzZW5kIGl0IHRoZSBVcmkgb2YgdGhlIG1vdmllIHRvIHBsYXkuCi0gICAgICogICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1BMQVkpOwotICAgICAqICAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOwotICAgICAqICAgICAgICAgaW50ZW50LnNldERhdGFBbmRUeXBlKCJodHRwOi8vZXhhbXBsZS5jb20vdmlkZW9zL21vdmllLm1wNCIsICJ2aWRlby9tcDQiKTsKLSAgICAgKiAgICAgICAgIGlmIChyb3V0ZS5zdXBwb3J0c0NvbnRyb2xSZXF1ZXN0KGludGVudCkpIHsKLSAgICAgKiAgICAgICAgICAgICByb3V0ZS5zZW5kQ29udHJvbFJlcXVlc3QoaW50ZW50LCBudWxsKTsKLSAgICAgKiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gc2VudCB0aGUgcmVxdWVzdCB0byBwbGF5IHRoZSBtb3ZpZQotICAgICAqICAgICAgICAgfQotICAgICAqICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgLy8gSWYgcmVtb3RlIHBsYXliYWNrIHdhcyBub3QgcG9zc2libGUsIHRoZW4gcGxheSBsb2NhbGx5LgotICAgICAqICAgICBpZiAocm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pKSB7Ci0gICAgICogICAgICAgICAvLyBUaGUgcm91dGUgc3VwcG9ydHMgbGl2ZSB2aWRlbyBzdHJlYW1pbmcuCi0gICAgICogICAgICAgICAvLyBQcmVwYXJlIHRvIHBsYXkgY29udGVudCBsb2NhbGx5IGluIGEgd2luZG93IG9yIGluIGEgcHJlc2VudGF0aW9uLgotICAgICAqICAgICAgICAgcmV0dXJuIHBsYXlNb3ZpZUluV2luZG93KCk7Ci0gICAgICogICAgIH0KLSAgICAgKgotICAgICAqICAgICAvLyBOZWl0aGVyIGludGVyZmFjZSBpcyBzdXBwb3J0ZWQsIHNvIHdlIGNhbid0IHBsYXkgdGhlIG1vdmllIHRvIHRoaXMgcm91dGUuCi0gICAgICogICAgIHJldHVybiBmYWxzZTsKLSAgICAgKiB9Ci0gICAgICogPC9wcmU+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBzZWxlY3RlZCByb3V0ZSwgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBuZXZlciBiZSBudWxsLgotICAgICAqCi0gICAgICogQHNlZSBSb3V0ZUluZm8jZ2V0Q29udHJvbEZpbHRlcnMKLSAgICAgKiBAc2VlIFJvdXRlSW5mbyNzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeQotICAgICAqIEBzZWUgUm91dGVJbmZvI3N1cHBvcnRzQ29udHJvbFJlcXVlc3QKLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBSb3V0ZUluZm8gZ2V0U2VsZWN0ZWRSb3V0ZSgpIHsKLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgIHJldHVybiBzR2xvYmFsLmdldFNlbGVjdGVkUm91dGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBzZWxlY3RlZCByb3V0ZSBpZiBpdCBtYXRjaGVzIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IsIG90aGVyd2lzZQotICAgICAqIHNlbGVjdHMgdGhlIGRlZmF1bHQgcm91dGUgYW5kIHJldHVybnMgaXQuIElmIHRoZXJlIGlzIG9uZSBsaXZlIGF1ZGlvIHJvdXRlCi0gICAgICogKHVzdWFsbHkgQmx1ZXRvb3RoIEEyRFApLCBpdCB3aWxsIGJlIHNlbGVjdGVkIGluc3RlYWQgb2YgZGVmYXVsdCByb3V0ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gbWF0Y2guCi0gICAgICogQHJldHVybiBUaGUgcHJldmlvdXNseSBzZWxlY3RlZCByb3V0ZSBpZiBpdCBtYXRjaGVkIHRoZSBzZWxlY3Rvciwgb3RoZXJ3aXNlIHRoZQotICAgICAqIG5ld2x5IHNlbGVjdGVkIGRlZmF1bHQgcm91dGUgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBuZXZlciBiZSBudWxsLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlU2VsZWN0b3IKLSAgICAgKiBAc2VlIFJvdXRlSW5mbyNtYXRjaGVzU2VsZWN0b3IKLSAgICAgKi8KLSAgICBATm9uTnVsbAotICAgIHB1YmxpYyBSb3V0ZUluZm8gdXBkYXRlU2VsZWN0ZWRSb3V0ZShATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInVwZGF0ZVNlbGVjdGVkUm91dGU6ICIgKyBzZWxlY3Rvcik7Ci0gICAgICAgIH0KLSAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gc0dsb2JhbC5nZXRTZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgIGlmICghcm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSAmJiAhcm91dGUubWF0Y2hlc1NlbGVjdG9yKHNlbGVjdG9yKSkgewotICAgICAgICAgICAgcm91dGUgPSBzR2xvYmFsLmNob29zZUZhbGxiYWNrUm91dGUoKTsKLSAgICAgICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUocm91dGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByb3V0ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZWxlY3RzIHRoZSBzcGVjaWZpZWQgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRvIHNlbGVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3RSb3V0ZShATm9uTnVsbCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgaWYgKHJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInNlbGVjdFJvdXRlOiAiICsgcm91dGUpOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUocm91dGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVuc2VsZWN0cyB0aGUgY3VycmVudCByb3VuZCBhbmQgc2VsZWN0cyB0aGUgZGVmYXVsdCByb3V0ZSBpbnN0ZWFkLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZWFzb24gZ2l2ZW4gbXVzdCBiZSBvbmUgb2Y6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1VOS05PV059PC9saT4KLSAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9ESVNDT05ORUNURUR9PC9saT4KLSAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9TVE9QUEVEfTwvbGk+Ci0gICAgICogPGxpPntAbGluayBNZWRpYVJvdXRlciNVTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRH08L2xpPgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gZm9yIGRpc2Nvbm5lY3RpbmcgdGhlIGN1cnJlbnQgcm91dGUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdW5zZWxlY3QoaW50IHJlYXNvbikgewotICAgICAgICBpZiAocmVhc29uIDwgTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1VOS05PV04gfHwKLSAgICAgICAgICAgICAgICByZWFzb24gPiBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fUk9VVEVfQ0hBTkdFRCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgcmVhc29uIHRvIHVuc2VsZWN0IHJvdXRlIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgLy8gQ2hvb3NlIHRoZSBmYWxsYmFjayByb3V0ZSBpZiBpdCdzIG5vdCBhbHJlYWR5IHNlbGVjdGVkLgotICAgICAgICAvLyBPdGhlcndpc2UsIHNlbGVjdCB0aGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgICAgUm91dGVJbmZvIGZhbGxiYWNrUm91dGUgPSBzR2xvYmFsLmNob29zZUZhbGxiYWNrUm91dGUoKTsKLSAgICAgICAgaWYgKHNHbG9iYWwuZ2V0U2VsZWN0ZWRSb3V0ZSgpICE9IGZhbGxiYWNrUm91dGUpIHsKLSAgICAgICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUoZmFsbGJhY2tSb3V0ZSwgcmVhc29uKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNHbG9iYWwuc2VsZWN0Um91dGUoc0dsb2JhbC5nZXREZWZhdWx0Um91dGUoKSwgcmVhc29uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIHJvdXRlIHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIHNlbGVjdG9yLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IGF2YWlsYWJsZSByb3V0ZXMgdGhhdCBtYXRjaCB0aGUKLSAgICAgKiBzZWxlY3RvciByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhleSBhcmUgZW5hYmxlZCBvciBkaXNhYmxlZC4gSWYgdGhlCi0gICAgICoge0BsaW5rICNBVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURX0gZmxhZyBpcyBzcGVjaWZpZWQsIHRoZW4KLSAgICAgKiB0aGUgbWV0aG9kIHdpbGwgb25seSBjb25zaWRlciBub24tZGVmYXVsdCByb3V0ZXMuCi0gICAgICogPC9wPgotICAgICAqIDxwIGNsYXNzPSJub3RlIj4KLSAgICAgKiBPbiB7QGxpbmsgQWN0aXZpdHlNYW5hZ2VyI2lzTG93UmFtRGV2aWNlIGxvdy1SQU0gZGV2aWNlc30gdGhpcyBtZXRob2QKLSAgICAgKiB3aWxsIHJldHVybiB0cnVlIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGRpc2NvdmVyIGEgbWF0Y2hpbmcgcm91dGUgZXZlbiBpZgotICAgICAqIGRpc2NvdmVyeSBpcyBub3QgaW4gcHJvZ3Jlc3Mgb3IgaWYgbm8gbWF0Y2hpbmcgcm91dGUgaGFzIHlldCBiZWVuIGZvdW5kLgotICAgICAqIFVzZSB7QGxpbmsgI0FWQUlMQUJJTElUWV9GTEFHX1JFUVVJUkVfTUFUQ0h9IHRvIHJlcXVpcmUgYW4gYWN0dWFsIG1hdGNoLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBUaGUgc2VsZWN0b3IgdG8gbWF0Y2guCi0gICAgICogQHBhcmFtIGZsYWdzIEZsYWdzIHRvIGNvbnRyb2wgdGhlIGRldGVybWluYXRpb24gb2Ygd2hldGhlciBhIHJvdXRlIG1heSBiZQotICAgICAqICAgICAgICAgICAgYXZhaWxhYmxlLiBNYXkgYmUgemVybyBvciBzb21lIGNvbWJpbmF0aW9uIG9mCi0gICAgICogICAgICAgICAgICB7QGxpbmsgI0FWQUlMQUJJTElUWV9GTEFHX0lHTk9SRV9ERUZBVUxUX1JPVVRFfSBhbmQKLSAgICAgKiAgICAgICAgICAgIHtAbGluayAjQVZBSUxBQklMSVRZX0ZMQUdfUkVRVUlSRV9NQVRDSH0uCi0gICAgICogQHJldHVybiBUcnVlIGlmIGEgbWF0Y2hpbmcgcm91dGUgbWF5IGJlIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JvdXRlQXZhaWxhYmxlKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciwgaW50IGZsYWdzKSB7Ci0gICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJzZWxlY3RvciBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuaXNSb3V0ZUF2YWlsYWJsZShzZWxlY3RvciwgZmxhZ3MpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIGNhbGxiYWNrIHRvIGRpc2NvdmVyIHJvdXRlcyB0aGF0IG1hdGNoIHRoZSBzZWxlY3RvciBhbmQgdG8gcmVjZWl2ZQotICAgICAqIGV2ZW50cyB3aGVuIHRoZXkgY2hhbmdlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QgdGhhdCBoYXMgdGhlIHNhbWUgZWZmZWN0IGFzIGNhbGxpbmcKLSAgICAgKiB7QGxpbmsgI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCl9IHdpdGhvdXQgZmxhZ3MuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIHNlbGVjdG9yIEEgcm91dGUgc2VsZWN0b3IgdGhhdCBpbmRpY2F0ZXMgdGhlIGtpbmRzIG9mIHJvdXRlcyB0aGF0IHRoZQotICAgICAqIGNhbGxiYWNrIHdvdWxkIGxpa2UgdG8gZGlzY292ZXIuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIFRoZSBjYWxsYmFjayB0byBhZGQuCi0gICAgICogQHNlZSAjcmVtb3ZlQ2FsbGJhY2sKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRDYWxsYmFjayhNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IsIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGFkZENhbGxiYWNrKHNlbGVjdG9yLCBjYWxsYmFjaywgMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVnaXN0ZXJzIGEgY2FsbGJhY2sgdG8gZGlzY292ZXIgcm91dGVzIHRoYXQgbWF0Y2ggdGhlIHNlbGVjdG9yIGFuZCB0byByZWNlaXZlCi0gICAgICogZXZlbnRzIHdoZW4gdGhleSBjaGFuZ2UuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHNlbGVjdG9yIGRlc2NyaWJlcyB0aGUga2luZHMgb2Ygcm91dGVzIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvCi0gICAgICogZGlzY292ZXIuICBGb3IgZXhhbXBsZSwgaWYgdGhlIGFwcGxpY2F0aW9uIHdhbnRzIHRvIHVzZQotICAgICAqIGxpdmUgYXVkaW8gcm91dGVzIHRoZW4gaXQgc2hvdWxkIGluY2x1ZGUgdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX0FVRElPIGxpdmUgYXVkaW8gbWVkaWEgY29udHJvbCBpbnRlbnQgY2F0ZWdvcnl9Ci0gICAgICogaW4gaXRzIHNlbGVjdG9yIHdoZW4gaXQgYWRkcyBhIGNhbGxiYWNrIHRvIHRoZSBtZWRpYSByb3V0ZXIuCi0gICAgICogVGhlIHNlbGVjdG9yIG1heSBpbmNsdWRlIGFueSBudW1iZXIgb2YgY2F0ZWdvcmllcy4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogSWYgdGhlIGNhbGxiYWNrIGhhcyBhbHJlYWR5IGJlZW4gcmVnaXN0ZXJlZCwgdGhlbiB0aGUgc2VsZWN0b3IgaXMgYWRkZWQgdG8KLSAgICAgKiB0aGUgc2V0IG9mIHNlbGVjdG9ycyBiZWluZyBtb25pdG9yZWQgYnkgdGhlIGNhbGxiYWNrLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBCeSBkZWZhdWx0LCB0aGUgY2FsbGJhY2sgd2lsbCBvbmx5IGJlIGludm9rZWQgZm9yIGV2ZW50cyB0aGF0IGFmZmVjdCByb3V0ZXMKLSAgICAgKiB0aGF0IG1hdGNoIHRoZSBzcGVjaWZpZWQgc2VsZWN0b3IuICBFdmVudCBmaWx0ZXJpbmcgbWF5IGJlIGRpc2FibGVkIGJ5IHNwZWNpZnlpbmcKLSAgICAgKiB0aGUge0BsaW5rICNDQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTfSBmbGFnIHdoZW4gdGhlIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFwcGxpY2F0aW9ucyBzaG91bGQgdXNlIHRoZSB7QGxpbmsgI2lzUm91dGVBdmFpbGFibGV9IG1ldGhvZCB0byBkZXRlcm1pbmUKLSAgICAgKiB3aGV0aGVyIGlzIGl0IHBvc3NpYmxlIHRvIGRpc2NvdmVyIGEgcm91dGUgd2l0aCB0aGUgZGVzaXJlZCBjYXBhYmlsaXRpZXMKLSAgICAgKiBhbmQgdGhlcmVmb3JlIHdoZXRoZXIgdGhlIG1lZGlhIHJvdXRlIGJ1dHRvbiBzaG91bGQgYmUgc2hvd24gdG8gdGhlIHVzZXIuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUkVRVUVTVF9ESVNDT1ZFUll9IGZsYWcgc2hvdWxkIGJlIHVzZWQgd2hpbGUgdGhlIGFwcGxpY2F0aW9uCi0gICAgICogaXMgaW4gdGhlIGZvcmVncm91bmQgdG8gcmVxdWVzdCB0aGF0IHBhc3NpdmUgZGlzY292ZXJ5IGJlIHBlcmZvcm1lZCBpZiB0aGVyZSBhcmUKLSAgICAgKiBzdWZmaWNpZW50IHJlc291cmNlcyB0byBhbGxvdyBjb250aW51b3VzIHBhc3NpdmUgZGlzY292ZXJ5LgotICAgICAqIE9uIHtAbGluayBBY3Rpdml0eU1hbmFnZXIjaXNMb3dSYW1EZXZpY2UgbG93LVJBTSBkZXZpY2VzfSB0aGlzIGZsYWcgd2lsbCBiZQotICAgICAqIGlnbm9yZWQgdG8gY29uc2VydmUgcmVzb3VyY2VzLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUge0BsaW5rICNDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWX0gZmxhZyBzaG91bGQgYmUgdXNlZCB3aGVuCi0gICAgICogcGFzc2l2ZSBkaXNjb3ZlcnkgYWJzb2x1dGVseSBtdXN0IGJlIHBlcmZvcm1lZCwgZXZlbiBvbiBsb3ctUkFNIGRldmljZXMuCi0gICAgICogVGhpcyBmbGFnIGhhcyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGltcGFjdCBvbiBsb3ctUkFNIGRldmljZXMKLSAgICAgKiBzaW5jZSBpdCBtYXkgY2F1c2UgbWFueSBtZWRpYSByb3V0ZSBwcm92aWRlcnMgdG8gYmUgc3RhcnRlZCBzaW11bHRhbmVvdXNseS4KLSAgICAgKiBJdCBpcyBtdWNoIGJldHRlciB0byB1c2Uge0BsaW5rICNDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZfSBpbnN0ZWFkIHRvIGF2b2lkCi0gICAgICogcGVyZm9ybWluZyBwYXNzaXZlIGRpc2NvdmVyeSBvbiB0aGVzZSBkZXZpY2VzIGFsdG9nZXRoZXIuCi0gICAgICogPC9wPjxwPgotICAgICAqIFRoZSB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTn0gZmxhZyBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZQotICAgICAqIG1lZGlhIHJvdXRlIGNob29zZXIgZGlhbG9nIGlzIHNob3dpbmcgdG8gY29uZmlybSB0aGUgcHJlc2VuY2Ugb2YgYXZhaWxhYmxlCi0gICAgICogcm91dGVzIHRoYXQgdGhlIHVzZXIgbWF5IGNvbm5lY3QgdG8uICBUaGlzIGZsYWcgbWF5IHVzZSBzdWJzdGFudGlhbGx5IG1vcmUKLSAgICAgKiBwb3dlci4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiA8aDM+RXhhbXBsZTwvaDM+Ci0gICAgICogPHByZT4KLSAgICAgKiBwdWJsaWMgY2xhc3MgTXlBY3Rpdml0eSBleHRlbmRzIEFjdGl2aXR5IHsKLSAgICAgKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlciBtUm91dGVyOwotICAgICAqICAgICBwcml2YXRlIE1lZGlhUm91dGVyLkNhbGxiYWNrIG1DYWxsYmFjazsKLSAgICAgKiAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yOwotICAgICAqCi0gICAgICogICAgIHByb3RlY3RlZCB2b2lkIG9uQ3JlYXRlKEJ1bmRsZSBzYXZlZEluc3RhbmNlU3RhdGUpIHsKLSAgICAgKiAgICAgICAgIHN1cGVyLm9uQ3JlYXRlKHNhdmVkSW5zdGFuY2VTdGF0ZSk7Ci0gICAgICoKLSAgICAgKiAgICAgICAgIG1Sb3V0ZXIgPSBNZWRpYXJvdXRlci5nZXRJbnN0YW5jZSh0aGlzKTsKLSAgICAgKiAgICAgICAgIG1DYWxsYmFjayA9IG5ldyBNeUNhbGxiYWNrKCk7Ci0gICAgICogICAgICAgICBtU2VsZWN0b3IgPSBuZXcgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIoKQotICAgICAqICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKQotICAgICAqICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spCi0gICAgICogICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAqICAgICB9Ci0gICAgICoKLSAgICAgKiAgICAgLy8gQWRkIHRoZSBjYWxsYmFjayBvbiBzdGFydCB0byB0ZWxsIHRoZSBtZWRpYSByb3V0ZXIgd2hhdCBraW5kcyBvZiByb3V0ZXMKLSAgICAgKiAgICAgLy8gdGhlIGFwcGxpY2F0aW9uIGlzIGludGVyZXN0ZWQgaW4gc28gdGhhdCBpdCBjYW4gdHJ5IHRvIGRpc2NvdmVyIHN1aXRhYmxlIG9uZXMuCi0gICAgICogICAgIHB1YmxpYyB2b2lkIG9uU3RhcnQoKSB7Ci0gICAgICogICAgICAgICBzdXBlci5vblN0YXJ0KCk7Ci0gICAgICoKLSAgICAgKiAgICAgICAgIG1lZGlhUm91dGVyLmFkZENhbGxiYWNrKG1TZWxlY3RvciwgbUNhbGxiYWNrLAotICAgICAqICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZKTsKLSAgICAgKgotICAgICAqICAgICAgICAgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlID0gbWVkaWFSb3V0ZXIudXBkYXRlU2VsZWN0ZWRSb3V0ZShtU2VsZWN0b3IpOwotICAgICAqICAgICAgICAgLy8gZG8gc29tZXRoaW5nIHdpdGggdGhlIHJvdXRlLi4uCi0gICAgICogICAgIH0KLSAgICAgKgotICAgICAqICAgICAvLyBSZW1vdmUgdGhlIHNlbGVjdG9yIG9uIHN0b3AgdG8gdGVsbCB0aGUgbWVkaWEgcm91dGVyIHRoYXQgaXQgbm8gbG9uZ2VyCi0gICAgICogICAgIC8vIG5lZWRzIHRvIGludmVzdCBlZmZvcnQgdHJ5aW5nIHRvIGRpc2NvdmVyIHJvdXRlcyBvZiB0aGVzZSBraW5kcyBmb3Igbm93LgotICAgICAqICAgICBwdWJsaWMgdm9pZCBvblN0b3AoKSB7Ci0gICAgICogICAgICAgICBzdXBlci5vblN0b3AoKTsKLSAgICAgKgotICAgICAqICAgICAgICAgbWVkaWFSb3V0ZXIucmVtb3ZlQ2FsbGJhY2sobUNhbGxiYWNrKTsKLSAgICAgKiAgICAgfQotICAgICAqCi0gICAgICogICAgIHByaXZhdGUgZmluYWwgY2xhc3MgTXlDYWxsYmFjayBleHRlbmRzIE1lZGlhUm91dGVyLkNhbGxiYWNrIHsKLSAgICAgKiAgICAgICAgIC8vIEltcGxlbWVudCBjYWxsYmFjayBtZXRob2RzIGFzIG5lZWRlZC4KLSAgICAgKiAgICAgfQotICAgICAqIH0KLSAgICAgKiA8L3ByZT4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzZWxlY3RvciBBIHJvdXRlIHNlbGVjdG9yIHRoYXQgaW5kaWNhdGVzIHRoZSBraW5kcyBvZiByb3V0ZXMgdGhhdCB0aGUKLSAgICAgKiBjYWxsYmFjayB3b3VsZCBsaWtlIHRvIGRpc2NvdmVyLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgY2FsbGJhY2sgdG8gYWRkLgotICAgICAqIEBwYXJhbSBmbGFncyBGbGFncyB0byBjb250cm9sIHRoZSBiZWhhdmlvciBvZiB0aGUgY2FsbGJhY2suCi0gICAgICogTWF5IGJlIHplcm8gb3IgYSBjb21iaW5hdGlvbiBvZiB7QGxpbmsgI0NBTExCQUNLX0ZMQUdfUEVSRk9STV9BQ1RJVkVfU0NBTn0gYW5kCi0gICAgICoge0BsaW5rICNDQUxMQkFDS19GTEFHX1VORklMVEVSRURfRVZFTlRTfS4KLSAgICAgKiBAc2VlICNyZW1vdmVDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZENhbGxiYWNrKEBOb25OdWxsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciwgQE5vbk51bGwgQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICBAQ2FsbGJhY2tGbGFncyBpbnQgZmxhZ3MpIHsKLSAgICAgICAgaWYgKHNlbGVjdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNlbGVjdG9yIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoY2FsbGJhY2sgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2FsbGJhY2sgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkQ2FsbGJhY2s6IHNlbGVjdG9yPSIgKyBzZWxlY3RvcgotICAgICAgICAgICAgICAgICAgICArICIsIGNhbGxiYWNrPSIgKyBjYWxsYmFjayArICIsIGZsYWdzPSIgKyBJbnRlZ2VyLnRvSGV4U3RyaW5nKGZsYWdzKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDYWxsYmFja1JlY29yZCByZWNvcmQ7Ci0gICAgICAgIGludCBpbmRleCA9IGZpbmRDYWxsYmFja1JlY29yZChjYWxsYmFjayk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIHJlY29yZCA9IG5ldyBDYWxsYmFja1JlY29yZCh0aGlzLCBjYWxsYmFjayk7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tSZWNvcmRzLmFkZChyZWNvcmQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVjb3JkID0gbUNhbGxiYWNrUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICB9Ci0gICAgICAgIGJvb2xlYW4gdXBkYXRlTmVlZGVkID0gZmFsc2U7Ci0gICAgICAgIGlmICgoZmxhZ3MgJiB+cmVjb3JkLm1GbGFncykgIT0gMCkgewotICAgICAgICAgICAgcmVjb3JkLm1GbGFncyB8PSBmbGFnczsKLSAgICAgICAgICAgIHVwZGF0ZU5lZWRlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFyZWNvcmQubVNlbGVjdG9yLmNvbnRhaW5zKHNlbGVjdG9yKSkgewotICAgICAgICAgICAgcmVjb3JkLm1TZWxlY3RvciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcihyZWNvcmQubVNlbGVjdG9yKQotICAgICAgICAgICAgICAgICAgICAuYWRkU2VsZWN0b3Ioc2VsZWN0b3IpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgdXBkYXRlTmVlZGVkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAodXBkYXRlTmVlZGVkKSB7Ci0gICAgICAgICAgICBzR2xvYmFsLnVwZGF0ZURpc2NvdmVyeVJlcXVlc3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIHNwZWNpZmllZCBjYWxsYmFjay4gIEl0IHdpbGwgbm8gbG9uZ2VyIHJlY2VpdmUgZXZlbnRzIGFib3V0Ci0gICAgICogY2hhbmdlcyB0byBtZWRpYSByb3V0ZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHJlbW92ZS4KLSAgICAgKiBAc2VlICNhZGRDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZUNhbGxiYWNrKEBOb25OdWxsIENhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChjYWxsYmFjayA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYWxsYmFjayBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJyZW1vdmVDYWxsYmFjazogY2FsbGJhY2s9IiArIGNhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBpbmRleCA9IGZpbmRDYWxsYmFja1JlY29yZChjYWxsYmFjayk7Ci0gICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICBtQ2FsbGJhY2tSZWNvcmRzLnJlbW92ZShpbmRleCk7Ci0gICAgICAgICAgICBzR2xvYmFsLnVwZGF0ZURpc2NvdmVyeVJlcXVlc3QoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGZpbmRDYWxsYmFja1JlY29yZChDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtQ2FsbGJhY2tSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrUmVjb3Jkcy5nZXQoaSkubUNhbGxiYWNrID09IGNhbGxiYWNrKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZ2lzdGVycyBhIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHdpdGhpbiB0aGlzIGFwcGxpY2F0aW9uIHByb2Nlc3MuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHByb3ZpZGVyIHdpbGwgYmUgYWRkZWQgdG8gdGhlIGxpc3Qgb2YgcHJvdmlkZXJzIHRoYXQgYWxsIHtAbGluayBNZWRpYVJvdXRlcn0KLSAgICAgKiBpbnN0YW5jZXMgd2l0aGluIHRoaXMgcHJvY2VzcyBjYW4gdXNlIHRvIGRpc2NvdmVyIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXJJbnN0YW5jZSBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaW5zdGFuY2UgdG8gYWRkLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlUHJvdmlkZXIKLSAgICAgKiBAc2VlICNyZW1vdmVDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFkZFByb3ZpZGVyKEBOb25OdWxsIE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgIGlmIChwcm92aWRlckluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInByb3ZpZGVySW5zdGFuY2UgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkUHJvdmlkZXI6ICIgKyBwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLmFkZFByb3ZpZGVyKHByb3ZpZGVySW5zdGFuY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFVucmVnaXN0ZXJzIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgd2l0aGluIHRoaXMgYXBwbGljYXRpb24gcHJvY2Vzcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcHJvdmlkZXIgd2lsbCBiZSByZW1vdmVkIGZyb20gdGhlIGxpc3Qgb2YgcHJvdmlkZXJzIHRoYXQgYWxsIHtAbGluayBNZWRpYVJvdXRlcn0KLSAgICAgKiBpbnN0YW5jZXMgd2l0aGluIHRoaXMgcHJvY2VzcyBjYW4gdXNlIHRvIGRpc2NvdmVyIHJvdXRlcy4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvdmlkZXJJbnN0YW5jZSBUaGUgbWVkaWEgcm91dGUgcHJvdmlkZXIgaW5zdGFuY2UgdG8gcmVtb3ZlLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYVJvdXRlUHJvdmlkZXIKLSAgICAgKiBAc2VlICNhZGRDYWxsYmFjawotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVByb3ZpZGVyKEBOb25OdWxsIE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlKSB7Ci0gICAgICAgIGlmIChwcm92aWRlckluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInByb3ZpZGVySW5zdGFuY2UgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAicmVtb3ZlUHJvdmlkZXI6ICIgKyBwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnJlbW92ZVByb3ZpZGVyKHByb3ZpZGVySW5zdGFuY2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZHMgYSByZW1vdGUgY29udHJvbCBjbGllbnQgdG8gZW5hYmxlIHJlbW90ZSBjb250cm9sIG9mIHRoZSB2b2x1bWUKLSAgICAgKiBvZiB0aGUgc2VsZWN0ZWQgcm91dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlbW90ZSBjb250cm9sIGNsaWVudCBtdXN0IGhhdmUgcHJldmlvdXNseSBiZWVuIHJlZ2lzdGVyZWQgd2l0aAotICAgICAqIHRoZSBhdWRpbyBtYW5hZ2VyIHVzaW5nIHRoZSB7QGxpbmsgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXIjcmVnaXN0ZXJSZW1vdGVDb250cm9sQ2xpZW50Ci0gICAgICogQXVkaW9NYW5hZ2VyLnJlZ2lzdGVyUmVtb3RlQ29udHJvbENsaWVudH0gbWV0aG9kLgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSByZW1vdGVDb250cm9sQ2xpZW50IFRoZSB7QGxpbmsgYW5kcm9pZC5tZWRpYS5SZW1vdGVDb250cm9sQ2xpZW50fSB0byByZWdpc3Rlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhZGRSZW1vdGVDb250cm9sQ2xpZW50KEBOb25OdWxsIE9iamVjdCByZW1vdGVDb250cm9sQ2xpZW50KSB7Ci0gICAgICAgIGlmIChyZW1vdGVDb250cm9sQ2xpZW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJlbW90ZUNvbnRyb2xDbGllbnQgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotCi0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAiYWRkUmVtb3RlQ29udHJvbENsaWVudDogIiArIHJlbW90ZUNvbnRyb2xDbGllbnQpOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwuYWRkUmVtb3RlQ29udHJvbENsaWVudChyZW1vdGVDb250cm9sQ2xpZW50KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZW1vdmVzIGEgcmVtb3RlIGNvbnRyb2wgY2xpZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIHJlbW90ZUNvbnRyb2xDbGllbnQgVGhlIHtAbGluayBhbmRyb2lkLm1lZGlhLlJlbW90ZUNvbnRyb2xDbGllbnR9Ci0gICAgICogICAgICAgICAgICB0byB1bnJlZ2lzdGVyLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQoQE5vbk51bGwgT2JqZWN0IHJlbW90ZUNvbnRyb2xDbGllbnQpIHsKLSAgICAgICAgaWYgKHJlbW90ZUNvbnRyb2xDbGllbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicmVtb3RlQ29udHJvbENsaWVudCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgInJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQ6ICIgKyByZW1vdGVDb250cm9sQ2xpZW50KTsKLSAgICAgICAgfQotICAgICAgICBzR2xvYmFsLnJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQocmVtb3RlQ29udHJvbENsaWVudCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgbWVkaWEgc2Vzc2lvbiB0byBlbmFibGUgcmVtb3RlIGNvbnRyb2wgb2YgdGhlIHZvbHVtZSBvZiB0aGUKLSAgICAgKiBzZWxlY3RlZCByb3V0ZS4gVGhpcyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mCi0gICAgICoge0BsaW5rICNhZGRSZW1vdGVDb250cm9sQ2xpZW50fSB3aGVuIHVzaW5nIG1lZGlhIHNlc3Npb25zLiBTZXQgdGhlCi0gICAgICogc2Vzc2lvbiB0byBudWxsIHRvIGNsZWFyIGl0LgotICAgICAqCi0gICAgICogQHBhcmFtIG1lZGlhU2Vzc2lvbiBUaGUge0BsaW5rIGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYVNlc3Npb259IHRvCi0gICAgICogICAgICAgICAgICB1c2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uKE9iamVjdCBtZWRpYVNlc3Npb24pIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJhZGRNZWRpYVNlc3Npb246ICIgKyBtZWRpYVNlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwuc2V0TWVkaWFTZXNzaW9uKG1lZGlhU2Vzc2lvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNvbXBhdCBtZWRpYSBzZXNzaW9uIHRvIGVuYWJsZSByZW1vdGUgY29udHJvbCBvZiB0aGUgdm9sdW1lIG9mIHRoZQotICAgICAqIHNlbGVjdGVkIHJvdXRlLiBUaGlzIHNob3VsZCBiZSB1c2VkIGluc3RlYWQgb2YKLSAgICAgKiB7QGxpbmsgI2FkZFJlbW90ZUNvbnRyb2xDbGllbnR9IHdoZW4gdXNpbmcge0BsaW5rIE1lZGlhU2Vzc2lvbkNvbXBhdH0uCi0gICAgICogU2V0IHRoZSBzZXNzaW9uIHRvIG51bGwgdG8gY2xlYXIgaXQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbWVkaWFTZXNzaW9uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uQ29tcGF0KE1lZGlhU2Vzc2lvbkNvbXBhdCBtZWRpYVNlc3Npb24pIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJhZGRNZWRpYVNlc3Npb25Db21wYXQ6ICIgKyBtZWRpYVNlc3Npb24pOwotICAgICAgICB9Ci0gICAgICAgIHNHbG9iYWwuc2V0TWVkaWFTZXNzaW9uQ29tcGF0KG1lZGlhU2Vzc2lvbik7Ci0gICAgfQotCi0gICAgcHVibGljIE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBnZXRNZWRpYVNlc3Npb25Ub2tlbigpIHsKLSAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbnN1cmVzIHRoYXQgY2FsbHMgaW50byB0aGUgbWVkaWEgcm91dGVyIGFyZSBvbiB0aGUgY29ycmVjdCB0aHJlYWQuCi0gICAgICogSXQgcGF5cyB0byBiZSBhIGxpdHRsZSBwYXJhbm9pZCB3aGVuIGdsb2JhbCBzdGF0ZSBpbnZhcmlhbnRzIGFyZSBhdCByaXNrLgotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIGNoZWNrQ2FsbGluZ1RocmVhZCgpIHsKLSAgICAgICAgaWYgKExvb3Blci5teUxvb3BlcigpICE9IExvb3Blci5nZXRNYWluTG9vcGVyKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlRoZSBtZWRpYSByb3V0ZXIgc2VydmljZSBtdXN0IG9ubHkgYmUgIgotICAgICAgICAgICAgICAgICAgICArICJhY2Nlc3NlZCBvbiB0aGUgYXBwbGljYXRpb24ncyBtYWluIHRocmVhZC4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyA8VD4gYm9vbGVhbiBlcXVhbChUIGEsIFQgYikgewotICAgICAgICByZXR1cm4gYSA9PSBiIHx8IChhICE9IG51bGwgJiYgYiAhPSBudWxsICYmIGEuZXF1YWxzKGIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIG1lZGlhIHJvdXRlLgotICAgICAqIDxwPgotICAgICAqIEVhY2ggbWVkaWEgcm91dGUgaGFzIGEgbGlzdCBvZiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9Ci0gICAgICoge0BsaW5rICNnZXRDb250cm9sRmlsdGVycyBpbnRlbnQgZmlsdGVyc30gdGhhdCBkZXNjcmliZSB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZQotICAgICAqIHJvdXRlIGFuZCB0aGUgbWFubmVyIGluIHdoaWNoIGl0IGlzIHVzZWQgYW5kIGNvbnRyb2xsZWQuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm91dGVJbmZvIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBQcm92aWRlckluZm8gbVByb3ZpZGVyOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtRGVzY3JpcHRvcklkOwotICAgICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBtVW5pcXVlSWQ7Ci0gICAgICAgIHByaXZhdGUgU3RyaW5nIG1OYW1lOwotICAgICAgICBwcml2YXRlIFN0cmluZyBtRGVzY3JpcHRpb247Ci0gICAgICAgIHByaXZhdGUgVXJpIG1JY29uVXJpOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbUVuYWJsZWQ7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtQ29ubmVjdGluZzsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNvbm5lY3Rpb25TdGF0ZTsKLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1DYW5EaXNjb25uZWN0OwotICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IG1Db250cm9sRmlsdGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBwcml2YXRlIGludCBtUGxheWJhY2tUeXBlOwotICAgICAgICBwcml2YXRlIGludCBtUGxheWJhY2tTdHJlYW07Ci0gICAgICAgIHByaXZhdGUgaW50IG1EZXZpY2VUeXBlOwotICAgICAgICBwcml2YXRlIGludCBtVm9sdW1lSGFuZGxpbmc7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Wb2x1bWU7Ci0gICAgICAgIHByaXZhdGUgaW50IG1Wb2x1bWVNYXg7Ci0gICAgICAgIHByaXZhdGUgRGlzcGxheSBtUHJlc2VudGF0aW9uRGlzcGxheTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVByZXNlbnRhdGlvbkRpc3BsYXlJZCA9IFBSRVNFTlRBVElPTl9ESVNQTEFZX0lEX05PTkU7Ci0gICAgICAgIHByaXZhdGUgQnVuZGxlIG1FeHRyYXM7Ci0gICAgICAgIHByaXZhdGUgSW50ZW50U2VuZGVyIG1TZXR0aW5nc0ludGVudDsKLSAgICAgICAgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbURlc2NyaXB0b3I7Ci0KLSAgICAgICAgQEludERlZih7Q09OTkVDVElPTl9TVEFURV9ESVNDT05ORUNURUQsIENPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVElORywKLSAgICAgICAgICAgICAgICBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRH0pCi0gICAgICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLSAgICAgICAgcHJpdmF0ZSBAaW50ZXJmYWNlIENvbm5lY3Rpb25TdGF0ZSB7fQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVmYXVsdCBjb25uZWN0aW9uIHN0YXRlIGluZGljYXRpbmcgdGhlIHJvdXRlIGlzIGRpc2Nvbm5lY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0Q29ubmVjdGlvblN0YXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1NUQVRFX0RJU0NPTk5FQ1RFRCA9IDA7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgY29ubmVjdGlvbiBzdGF0ZSBpbmRpY2F0aW5nIHRoZSByb3V0ZSBpcyBpbiB0aGUgcHJvY2VzcyBvZiBjb25uZWN0aW5nIGFuZCBpcyBub3QgeWV0Ci0gICAgICAgICAqIHJlYWR5IGZvciB1c2UuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldENvbm5lY3Rpb25TdGF0ZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgQ09OTkVDVElPTl9TVEFURV9DT05ORUNUSU5HID0gMTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQSBjb25uZWN0aW9uIHN0YXRlIGluZGljYXRpbmcgdGhlIHJvdXRlIGlzIGNvbm5lY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0Q29ubmVjdGlvblN0YXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RFRCA9IDI7Ci0KLSAgICAgICAgQEludERlZih7UExBWUJBQ0tfVFlQRV9MT0NBTCxQTEFZQkFDS19UWVBFX1JFTU9URX0pCi0gICAgICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLSAgICAgICAgcHJpdmF0ZSBAaW50ZXJmYWNlIFBsYXliYWNrVHlwZSB7fQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUaGUgZGVmYXVsdCBwbGF5YmFjayB0eXBlLCAibG9jYWwiLCBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhCi0gICAgICAgICAqIGlzIGhhcHBlbmluZyBvbiB0aGUgc2FtZSBkZXZpY2UgKGUuZy4gYSBwaG9uZSwgYSB0YWJsZXQpIGFzIHdoZXJlIGl0IGlzCi0gICAgICAgICAqIGNvbnRyb2xsZWQgZnJvbS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0UGxheWJhY2tUeXBlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBQTEFZQkFDS19UWVBFX0xPQ0FMID0gMDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogQSBwbGF5YmFjayB0eXBlIGluZGljYXRpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEgaXMgaGFwcGVuaW5nIG9uCi0gICAgICAgICAqIGEgZGlmZmVyZW50IGRldmljZSAoaS5lLiB0aGUgcmVtb3RlIGRldmljZSkgdGhhbiB3aGVyZSBpdCBpcyBjb250cm9sbGVkIGZyb20uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldFBsYXliYWNrVHlwZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVFlQRV9SRU1PVEUgPSAxOwotCi0gICAgICAgIEBJbnREZWYoe0RFVklDRV9UWVBFX1VOS05PV04sIERFVklDRV9UWVBFX1RWLCBERVZJQ0VfVFlQRV9TUEVBS0VSLCBERVZJQ0VfVFlQRV9CTFVFVE9PVEh9KQotICAgICAgICBAUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi0gICAgICAgIHByaXZhdGUgQGludGVyZmFjZSBEZXZpY2VUeXBlIHt9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRoZSBkZWZhdWx0IHJlY2VpdmVyIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZSBpbmRpY2F0aW5nIHRoZSB0eXBlIGlzIHVua25vd24uCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldERldmljZVR5cGUKLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9UWVBFX1VOS05PV04gPSAwOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBBIHJlY2VpdmVyIGRldmljZSB0eXBlIG9mIHRoZSByb3V0ZSBpbmRpY2F0aW5nIHRoZSBwcmVzZW50YXRpb24gb2YgdGhlIG1lZGlhIGlzIGhhcHBlbmluZwotICAgICAgICAgKiBvbiBhIFRWLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXREZXZpY2VUeXBlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERVZJQ0VfVFlQRV9UViA9IDE7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgcmVjZWl2ZXIgZGV2aWNlIHR5cGUgb2YgdGhlIHJvdXRlIGluZGljYXRpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEgaXMgaGFwcGVuaW5nCi0gICAgICAgICAqIG9uIGEgc3BlYWtlci4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSAjZ2V0RGV2aWNlVHlwZQotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVWSUNFX1RZUEVfU1BFQUtFUiA9IDI7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEEgcmVjZWl2ZXIgZGV2aWNlIHR5cGUgb2YgdGhlIHJvdXRlIGluZGljYXRpbmcgdGhlIHByZXNlbnRhdGlvbiBvZiB0aGUgbWVkaWEgaXMgaGFwcGVuaW5nCi0gICAgICAgICAqIG9uIGEgYmx1ZXRvb3RoIGRldmljZSBzdWNoIGFzIGEgYmx1ZXRvb3RoIHNwZWFrZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgI2dldERldmljZVR5cGUKLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFVklDRV9UWVBFX0JMVUVUT09USCA9IDM7Ci0KLSAgICAgICAgQEludERlZih7UExBWUJBQ0tfVk9MVU1FX0ZJWEVELFBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRX0pCi0gICAgICAgIEBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLSAgICAgICAgcHJpdmF0ZSBAaW50ZXJmYWNlIFBsYXliYWNrVm9sdW1lIHt9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFBsYXliYWNrIGluZm9ybWF0aW9uIGluZGljYXRpbmcgdGhlIHBsYXliYWNrIHZvbHVtZSBpcyBmaXhlZCwgaS5lLiBpdCBjYW5ub3QgYmUKLSAgICAgICAgICogY29udHJvbGxlZCBmcm9tIHRoaXMgb2JqZWN0LiBBbiBleGFtcGxlIG9mIGZpeGVkIHBsYXliYWNrIHZvbHVtZSBpcyBhIHJlbW90ZSBwbGF5ZXIsCi0gICAgICAgICAqIHBsYXlpbmcgb3ZlciBIRE1JIHdoZXJlIHRoZSB1c2VyIHByZWZlcnMgdG8gY29udHJvbCB0aGUgdm9sdW1lIG9uIHRoZSBIRE1JIHNpbmssIHJhdGhlcgotICAgICAgICAgKiB0aGFuIGF0dGVudWF0ZSBhdCB0aGUgc291cmNlLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXRWb2x1bWVIYW5kbGluZwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVk9MVU1FX0ZJWEVEID0gMDsKLQotICAgICAgICAvKioKLSAgICAgICAgICogUGxheWJhY2sgaW5mb3JtYXRpb24gaW5kaWNhdGluZyB0aGUgcGxheWJhY2sgdm9sdW1lIGlzIHZhcmlhYmxlIGFuZCBjYW4gYmUgY29udHJvbGxlZAotICAgICAgICAgKiBmcm9tIHRoaXMgb2JqZWN0LgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlICNnZXRWb2x1bWVIYW5kbGluZwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUExBWUJBQ0tfVk9MVU1FX1ZBUklBQkxFID0gMTsKLQotICAgICAgICAvKioKLSAgICAgICAgICogVGhlIGRlZmF1bHQgcHJlc2VudGF0aW9uIGRpc3BsYXkgaWQgaW5kaWNhdGluZyBubyBwcmVzZW50YXRpb24gZGlzcGxheSBpcyBhc3NvY2lhdGVkCi0gICAgICAgICAqIHdpdGggdGhlIHJvdXRlLgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUFJFU0VOVEFUSU9OX0RJU1BMQVlfSURfTk9ORSA9IC0xOwotCi0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX0dFTkVSQUwgPSAxIDw8IDA7Ci0gICAgICAgIHN0YXRpYyBmaW5hbCBpbnQgQ0hBTkdFX1ZPTFVNRSA9IDEgPDwgMTsKLSAgICAgICAgc3RhdGljIGZpbmFsIGludCBDSEFOR0VfUFJFU0VOVEFUSU9OX0RJU1BMQVkgPSAxIDw8IDI7Ci0KLSAgICAgICAgLy8gU2hvdWxkIG1hdGNoIHRvIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5QQUNLQUdFX05BTUUuCi0gICAgICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgU1lTVEVNX01FRElBX1JPVVRFX1BST1ZJREVSX1BBQ0tBR0VfTkFNRSA9ICJhbmRyb2lkIjsKLQotICAgICAgICBSb3V0ZUluZm8oUHJvdmlkZXJJbmZvIHByb3ZpZGVyLCBTdHJpbmcgZGVzY3JpcHRvcklkLCBTdHJpbmcgdW5pcXVlSWQpIHsKLSAgICAgICAgICAgIG1Qcm92aWRlciA9IHByb3ZpZGVyOwotICAgICAgICAgICAgbURlc2NyaXB0b3JJZCA9IGRlc2NyaXB0b3JJZDsKLSAgICAgICAgICAgIG1VbmlxdWVJZCA9IHVuaXF1ZUlkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb3ZpZGVyIG9mIHRoaXMgbWVkaWEgcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgUHJvdmlkZXJJbmZvIGdldFByb3ZpZGVyKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm92aWRlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB1bmlxdWUgaWQgb2YgdGhlIHJvdXRlLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogVGhlIHJvdXRlIHVuaXF1ZSBpZCBmdW5jdGlvbnMgYXMgYSBzdGFibGUgaWRlbnRpZmllciBieSB3aGljaCB0aGUgcm91dGUgaXMga25vd24uCi0gICAgICAgICAqIEZvciBleGFtcGxlLCBhbiBhcHBsaWNhdGlvbiBjYW4gdXNlIHRoaXMgaWQgYXMgYSB0b2tlbiB0byByZW1lbWJlciB0aGUKLSAgICAgICAgICogc2VsZWN0ZWQgcm91dGUgYWNyb3NzIHJlc3RhcnRzIG9yIHRvIGNvbW11bmljYXRlIGl0cyBpZGVudGl0eSB0byBhIHNlcnZpY2UuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdW5pcXVlIGlkIG9mIHRoZSByb3V0ZSwgbmV2ZXIgbnVsbC4KLSAgICAgICAgICovCi0gICAgICAgIEBOb25OdWxsCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0SWQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVVuaXF1ZUlkOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHVzZXItdmlzaWJsZSBuYW1lIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByb3V0ZSBuYW1lIGlkZW50aWZpZXMgdGhlIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KLSAgICAgICAgICogSXQgbWF5IGJlIGEgdXNlci1zdXBwbGllZCBuYW1lLCBhbiBhbGlhcywgb3IgZGV2aWNlIHNlcmlhbCBudW1iZXIuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdXNlci12aXNpYmxlIG5hbWUgb2YgYSBtZWRpYSByb3V0ZS4gIFRoaXMgaXMgdGhlIHN0cmluZyBwcmVzZW50ZWQKLSAgICAgICAgICogdG8gdXNlcnMgd2hvIG1heSBzZWxlY3QgdGhpcyBhcyB0aGUgYWN0aXZlIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1OYW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHVzZXItdmlzaWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGUgcm91dGUgZGVzY3JpcHRpb24gZGVzY3JpYmVzIHRoZSBraW5kIG9mIGRlc3RpbmF0aW9uIHJlcHJlc2VudGVkIGJ5IHRoZSByb3V0ZS4KLSAgICAgICAgICogSXQgbWF5IGJlIGEgdXNlci1zdXBwbGllZCBzdHJpbmcsIGEgbW9kZWwgbnVtYmVyIG9yIGJyYW5kIG9mIGRldmljZS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBkZXNjcmlwdGlvbiBvZiB0aGUgcm91dGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIEBOdWxsYWJsZQotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZXNjcmlwdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBVUkkgb2YgdGhlIGljb24gcmVwcmVzZW50aW5nIHRoaXMgcm91dGUuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIGljb24gd2lsbCBiZSB1c2VkIGluIHBpY2tlciBVSXMgaWYgYXZhaWxhYmxlLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIFVSSSBvZiB0aGUgaWNvbiByZXByZXNlbnRpbmcgdGhpcyByb3V0ZSwgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFVyaSBnZXRJY29uVXJpKCkgewotICAgICAgICAgICAgcmV0dXJuIG1JY29uVXJpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGVuYWJsZWQgYW5kIG1heSBiZSBzZWxlY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgaXMgZW5hYmxlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzRW5hYmxlZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtRW5hYmxlZDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIGlzIGluIHRoZSBwcm9jZXNzIG9mIGNvbm5lY3RpbmcgYW5kIGlzIG5vdAotICAgICAgICAgKiB5ZXQgcmVhZHkgZm9yIHVzZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgaXMgaW4gdGhlIHByb2Nlc3Mgb2YgY29ubmVjdGluZy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzQ29ubmVjdGluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ29ubmVjdGluZzsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIHRoZSByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgY29ubmVjdGlvbiBzdGF0ZSBvZiB0aGlzIHJvdXRlOiB7QGxpbmsgI0NPTk5FQ1RJT05fU1RBVEVfRElTQ09OTkVDVEVEfSwKLSAgICAgICAgICoge0BsaW5rICNDT05ORUNUSU9OX1NUQVRFX0NPTk5FQ1RJTkd9LCBvciB7QGxpbmsgI0NPTk5FQ1RJT05fU1RBVEVfQ09OTkVDVEVEfS4KLSAgICAgICAgICovCi0gICAgICAgIEBDb25uZWN0aW9uU3RhdGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb25uZWN0aW9uU3RhdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb25TdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHNlZSBNZWRpYVJvdXRlciNnZXRTZWxlY3RlZFJvdXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc1NlbGVjdGVkKCkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICByZXR1cm4gc0dsb2JhbC5nZXRTZWxlY3RlZFJvdXRlKCkgPT0gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByb3V0ZSBpcyB0aGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUcnVlIGlmIHRoaXMgcm91dGUgaXMgdGhlIGRlZmF1bHQgcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjZ2V0RGVmYXVsdFJvdXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RlZmF1bHQoKSB7Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLSAgICAgICAgICAgIHJldHVybiBzR2xvYmFsLmdldERlZmF1bHRSb3V0ZSgpID09IHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcm91dGUgaXMgYSBibHVldG9vdGggcm91dGUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIGEgYmx1ZXRvb3RoIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhUm91dGVyI2dldEJsdWV0b290aFJvdXRlCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0JsdWV0b290aCgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIHNHbG9iYWwuZ2V0Qmx1ZXRvb3RoUm91dGUoKSA9PSB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIHRoZSBkZWZhdWx0IHJvdXRlIGFuZCB0aGUgZGV2aWNlIHNwZWFrZXIuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGlzIHRoZSBkZWZhdWx0IHJvdXRlIGFuZCB0aGUgZGV2aWNlIHNwZWFrZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBpc0RldmljZVNwZWFrZXIoKSB7Ci0gICAgICAgICAgICBpbnQgZGVmYXVsdEF1ZGlvUm91dGVOYW1lUmVzb3VyY2VJZCA9IFJlc291cmNlcy5nZXRTeXN0ZW0oKS5nZXRJZGVudGlmaWVyKAotICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdF9hdWRpb19yb3V0ZV9uYW1lIiwgInN0cmluZyIsICJhbmRyb2lkIik7Ci0gICAgICAgICAgICByZXR1cm4gaXNEZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAgICAgJiYgUmVzb3VyY2VzLmdldFN5c3RlbSgpLmdldFRleHQoZGVmYXVsdEF1ZGlvUm91dGVOYW1lUmVzb3VyY2VJZCkuZXF1YWxzKG1OYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIGEgbGlzdCBvZiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fSBmaWx0ZXJzIHRoYXQKLSAgICAgICAgICogZGVzY3JpYmUgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGlzIHJvdXRlIGFuZCB0aGUgbWVkaWEgY29udHJvbCBhY3Rpb25zIHRoYXQKLSAgICAgICAgICogaXQgc3VwcG9ydHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gQSBsaXN0IG9mIGludGVudCBmaWx0ZXJzIHRoYXQgc3BlY2lmaWVzIHRoZSBtZWRpYSBjb250cm9sIGludGVudHMgdGhhdAotICAgICAgICAgKiB0aGlzIHJvdXRlIHN1cHBvcnRzLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKiBAc2VlICNzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeQotICAgICAgICAgKiBAc2VlICNzdXBwb3J0c0NvbnRyb2xSZXF1ZXN0Ci0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTGlzdDxJbnRlbnRGaWx0ZXI+IGdldENvbnRyb2xGaWx0ZXJzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Db250cm9sRmlsdGVyczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGF0IGxlYXN0IG9uZSBvZiB0aGUgY2FwYWJpbGl0aWVzCi0gICAgICAgICAqIGRlc2NyaWJlZCBieSBhIG1lZGlhIHJvdXRlIHNlbGVjdG9yLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gc2VsZWN0b3IgVGhlIHNlbGVjdG9yIHRoYXQgc3BlY2lmaWVzIHRoZSBjYXBhYmlsaXRpZXMgdG8gY2hlY2suCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgYXQgbGVhc3Qgb25lIG9mIHRoZSBjYXBhYmlsaXRpZXMKLSAgICAgICAgICogZGVzY3JpYmVkIGluIHRoZSBtZWRpYSByb3V0ZSBzZWxlY3Rvci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG1hdGNoZXNTZWxlY3RvcihATm9uTnVsbCBNZWRpYVJvdXRlU2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3RvciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigic2VsZWN0b3IgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICByZXR1cm4gc2VsZWN0b3IubWF0Y2hlc0NvbnRyb2xGaWx0ZXJzKG1Db250cm9sRmlsdGVycyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyB0aGUgc3BlY2lmaWVkCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gY2F0ZWdvcnkuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBNZWRpYSBjb250cm9sIGNhdGVnb3JpZXMgZGVzY3JpYmUgdGhlIGNhcGFiaWxpdGllcyBvZiB0aGlzIHJvdXRlCi0gICAgICAgICAqIHN1Y2ggYXMgd2hldGhlciBpdCBzdXBwb3J0cyBsaXZlIGF1ZGlvIHN0cmVhbWluZyBvciByZW1vdGUgcGxheWJhY2suCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGNhdGVnb3J5IEEge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sfSBjYXRlZ29yeQotICAgICAgICAgKiBzdWNoIGFzIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9BVURJT30sCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9WSURFT30sCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLfSwgb3IgYSBwcm92aWRlci1kZWZpbmVkCi0gICAgICAgICAqIG1lZGlhIGNvbnRyb2wgY2F0ZWdvcnkuCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZCBpbnRlbnQgY2F0ZWdvcnkuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50Ci0gICAgICAgICAqIEBzZWUgI2dldENvbnRyb2xGaWx0ZXJzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShATm9uTnVsbCBTdHJpbmcgY2F0ZWdvcnkpIHsKLSAgICAgICAgICAgIGlmIChjYXRlZ29yeSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiY2F0ZWdvcnkgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgICAgIGludCBjb3VudCA9IG1Db250cm9sRmlsdGVycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobUNvbnRyb2xGaWx0ZXJzLmdldChpKS5oYXNDYXRlZ29yeShjYXRlZ29yeSkpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGNhdGVnb3J5IGFuZCBhY3Rpb24uCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBNZWRpYSBjb250cm9sIGFjdGlvbnMgZGVzY3JpYmUgc3BlY2lmaWMgcmVxdWVzdHMgdGhhdCBhbiBhcHBsaWNhdGlvbgotICAgICAgICAgKiBjYW4gYXNrIGEgcm91dGUgdG8gcGVyZm9ybS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gY2F0ZWdvcnkgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IGNhdGVnb3J5Ci0gICAgICAgICAqIHN1Y2ggYXMge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX0FVRElPfSwKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX1ZJREVPfSwKLSAgICAgICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9SRU1PVEVfUExBWUJBQ0t9LCBvciBhIHByb3ZpZGVyLWRlZmluZWQKLSAgICAgICAgICogbWVkaWEgY29udHJvbCBjYXRlZ29yeS4KLSAgICAgICAgICogQHBhcmFtIGFjdGlvbiBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbH0gYWN0aW9uCi0gICAgICAgICAqIHN1Y2ggYXMge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWX0uCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZCBpbnRlbnQgYWN0aW9uLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKiBAc2VlICNnZXRDb250cm9sRmlsdGVycwotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gc3VwcG9ydHNDb250cm9sQWN0aW9uKEBOb25OdWxsIFN0cmluZyBjYXRlZ29yeSwgQE5vbk51bGwgU3RyaW5nIGFjdGlvbikgewotICAgICAgICAgICAgaWYgKGNhdGVnb3J5ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjYXRlZ29yeSBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYWN0aW9uID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJhY3Rpb24gbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0KLSAgICAgICAgICAgIGludCBjb3VudCA9IG1Db250cm9sRmlsdGVycy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBJbnRlbnRGaWx0ZXIgZmlsdGVyID0gbUNvbnRyb2xGaWx0ZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsdGVyLmhhc0NhdGVnb3J5KGNhdGVnb3J5KSAmJiBmaWx0ZXIuaGFzQWN0aW9uKGFjdGlvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgdGhlIHNwZWNpZmllZAotICAgICAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IHJlcXVlc3QuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBNZWRpYSBjb250cm9sIHJlcXVlc3RzIGFyZSB1c2VkIHRvIHJlcXVlc3QgdGhlIHJvdXRlIHRvIHBlcmZvcm0KLSAgICAgICAgICogYWN0aW9ucyBzdWNoIGFzIHN0YXJ0aW5nIHJlbW90ZSBwbGF5YmFjayBvZiBhIG1lZGlhIGl0ZW0uCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGludGVudCBBIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgbWVkaWEgY29udHJvbCBpbnRlbnR9LgotICAgICAgICAgKiBAcmV0dXJuIFRydWUgaWYgdGhlIHJvdXRlIGNhbiBoYW5kbGUgdGhlIHNwZWNpZmllZCBpbnRlbnQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50Ci0gICAgICAgICAqIEBzZWUgI2dldENvbnRyb2xGaWx0ZXJzCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgYm9vbGVhbiBzdXBwb3J0c0NvbnRyb2xSZXF1ZXN0KEBOb25OdWxsIEludGVudCBpbnRlbnQpIHsKLSAgICAgICAgICAgIGlmIChpbnRlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludGVudCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICAgICAgQ29udGVudFJlc29sdmVyIGNvbnRlbnRSZXNvbHZlciA9IHNHbG9iYWwuZ2V0Q29udGVudFJlc29sdmVyKCk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbEZpbHRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Db250cm9sRmlsdGVycy5nZXQoaSkubWF0Y2goY29udGVudFJlc29sdmVyLCBpbnRlbnQsIHRydWUsIFRBRykgPj0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2VuZHMgYSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2x9IHJlcXVlc3QgdG8gYmUgcGVyZm9ybWVkCi0gICAgICAgICAqIGFzeW5jaHJvbm91c2x5IGJ5IHRoZSByb3V0ZSdzIGRlc3RpbmF0aW9uLgotICAgICAgICAgKiA8cD4KLSAgICAgICAgICogTWVkaWEgY29udHJvbCByZXF1ZXN0cyBhcmUgdXNlZCB0byByZXF1ZXN0IHRoZSByb3V0ZSB0byBwZXJmb3JtCi0gICAgICAgICAqIGFjdGlvbnMgc3VjaCBhcyBzdGFydGluZyByZW1vdGUgcGxheWJhY2sgb2YgYSBtZWRpYSBpdGVtLgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoaXMgZnVuY3Rpb24gbWF5IG9ubHkgYmUgY2FsbGVkIG9uIGEgc2VsZWN0ZWQgcm91dGUuICBDb250cm9sIHJlcXVlc3RzCi0gICAgICAgICAqIHNlbnQgdG8gdW5zZWxlY3RlZCByb3V0ZXMgd2lsbCBmYWlsLgotICAgICAgICAgKiA8L3A+Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbnRlbnQgQSB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50IG1lZGlhIGNvbnRyb2wgaW50ZW50fS4KLSAgICAgICAgICogQHBhcmFtIGNhbGxiYWNrIEEge0BsaW5rIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2t9IHRvIGludm9rZSB3aXRoIHRoZSByZXN1bHQKLSAgICAgICAgICogb2YgdGhlIHJlcXVlc3QsIG9yIG51bGwgaWYgbm8gcmVzdWx0IGlzIHJlcXVpcmVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2VuZENvbnRyb2xSZXF1ZXN0KEBOb25OdWxsIEludGVudCBpbnRlbnQsCi0gICAgICAgICAgICAgICAgQE51bGxhYmxlIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChpbnRlbnQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImludGVudCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja0NhbGxpbmdUaHJlYWQoKTsKLQotICAgICAgICAgICAgc0dsb2JhbC5zZW5kQ29udHJvbFJlcXVlc3QodGhpcywgaW50ZW50LCBjYWxsYmFjayk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgdHlwZSBvZiBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZS4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdHlwZSBvZiBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZToge0BsaW5rICNQTEFZQkFDS19UWVBFX0xPQ0FMfQotICAgICAgICAgKiBvciB7QGxpbmsgI1BMQVlCQUNLX1RZUEVfUkVNT1RFfS4KLSAgICAgICAgICovCi0gICAgICAgIEBQbGF5YmFja1R5cGUKLSAgICAgICAgcHVibGljIGludCBnZXRQbGF5YmFja1R5cGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVBsYXliYWNrVHlwZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSBhdWRpbyBzdHJlYW0gb3ZlciB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBzdHJlYW0gb3ZlciB3aGljaCB0aGUgcGxheWJhY2sgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGUgaXMgcGVyZm9ybWVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGludCBnZXRQbGF5YmFja1N0cmVhbSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tTdHJlYW07Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgdHlwZSBvZiB0aGUgcmVjZWl2ZXIgZGV2aWNlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSB0eXBlIG9mIHRoZSByZWNlaXZlciBkZXZpY2UgYXNzb2NpYXRlZCB3aXRoIHRoaXMgcm91dGU6Ci0gICAgICAgICAqIHtAbGluayAjREVWSUNFX1RZUEVfVFZ9IG9yIHtAbGluayAjREVWSUNFX1RZUEVfU1BFQUtFUn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldERldmljZVR5cGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbURldmljZVR5cGU7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBAaGlkZQotICAgICAgICAgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIGJvb2xlYW4gaXNEZWZhdWx0T3JCbHVldG9vdGgoKSB7Ci0gICAgICAgICAgICBpZiAoaXNEZWZhdWx0KCkgfHwgbURldmljZVR5cGUgPT0gREVWSUNFX1RZUEVfQkxVRVRPT1RIKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIGEgd29ya2Fyb3VuZCBmb3IgcGxhdGZvcm0gdmVyc2lvbiAyMyBvciBiZWxvdyB3aGVyZSB0aGUgc3lzdGVtIHJvdXRlCi0gICAgICAgICAgICAvLyBwcm92aWRlciBkb2Vzbid0IHNwZWNpZnkgZGV2aWNlIHR5cGUgZm9yIGJsdWV0b290aCBtZWRpYSByb3V0ZXMuCi0gICAgICAgICAgICByZXR1cm4gaXNTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIodGhpcykKLSAgICAgICAgICAgICAgICAgICAgJiYgc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfQVVESU8pCi0gICAgICAgICAgICAgICAgICAgICYmICFzdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9WSURFTyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gaWYgdGhlIHJvdXRlIGlzIHNlbGVjdGFibGUuCi0gICAgICAgICAqLwotICAgICAgICBib29sZWFuIGlzU2VsZWN0YWJsZSgpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgdGVzdHMgd2hldGhlciB0aGUgcm91dGUgaXMgc3RpbGwgdmFsaWQgYW5kIGVuYWJsZWQuCi0gICAgICAgICAgICAvLyBUaGUgcm91dGUgZGVzY3JpcHRvciBmaWVsZCBpcyBzZXQgdG8gbnVsbCB3aGVuIHRoZSByb3V0ZSBpcyByZW1vdmVkLgotICAgICAgICAgICAgcmV0dXJuIG1EZXNjcmlwdG9yICE9IG51bGwgJiYgbUVuYWJsZWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgcmV0dXJuIFRleHRVdGlscy5lcXVhbHMocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpLmdldE1ldGFkYXRhKCkuZ2V0UGFja2FnZU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgU1lTVEVNX01FRElBX1JPVVRFX1BST1ZJREVSX1BBQ0tBR0VfTkFNRSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyBpbmZvcm1hdGlvbiBhYm91dCBob3cgdm9sdW1lIGlzIGhhbmRsZWQgb24gdGhlIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIEhvdyB2b2x1bWUgaXMgaGFuZGxlZCBvbiB0aGUgcm91dGU6IHtAbGluayAjUExBWUJBQ0tfVk9MVU1FX0ZJWEVEfQotICAgICAgICAgKiBvciB7QGxpbmsgI1BMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRX0uCi0gICAgICAgICAqLwotICAgICAgICBAUGxheWJhY2tWb2x1bWUKLSAgICAgICAgcHVibGljIGludCBnZXRWb2x1bWVIYW5kbGluZygpIHsKLSAgICAgICAgICAgIHJldHVybiBtVm9sdW1lSGFuZGxpbmc7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgY3VycmVudCB2b2x1bWUgZm9yIHRoaXMgcm91dGUuIERlcGVuZGluZyBvbiB0aGUgcm91dGUsIHRoaXMgbWF5IG9ubHkKLSAgICAgICAgICogYmUgdmFsaWQgaWYgdGhlIHJvdXRlIGlzIGN1cnJlbnRseSBzZWxlY3RlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgdm9sdW1lIGF0IHdoaWNoIHRoZSBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZSBpcyBwZXJmb3JtZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFZvbHVtZSgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVm9sdW1lOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIG1heGltdW0gdm9sdW1lIGF0IHdoaWNoIHRoZSBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGggdGhpcyByb3V0ZSBpcyBwZXJmb3JtZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVGhlIG1heGltdW0gdm9sdW1lIGF0IHdoaWNoIHRoZSBwbGF5YmFjayBhc3NvY2lhdGVkIHdpdGgKLSAgICAgICAgICogdGhpcyByb3V0ZSBpcyBwZXJmb3JtZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFZvbHVtZU1heCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtVm9sdW1lTWF4OwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgd2hldGhlciB0aGlzIHJvdXRlIHN1cHBvcnRzIGRpc2Nvbm5lY3Rpbmcgd2l0aG91dCBpbnRlcnJ1cHRpbmcKLSAgICAgICAgICogcGxheWJhY2suCi0gICAgICAgICAqCi0gICAgICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJvdXRlIGNhbiBkaXNjb25uZWN0IHdpdGhvdXQgc3RvcHBpbmcgcGxheWJhY2ssCi0gICAgICAgICAqICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIGJvb2xlYW4gY2FuRGlzY29ubmVjdCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtQ2FuRGlzY29ubmVjdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXF1ZXN0cyBhIHZvbHVtZSBjaGFuZ2UgZm9yIHRoaXMgcm91dGUgYXN5bmNocm9ub3VzbHkuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlbGVjdGVkIHJvdXRlLiAgSXQgd2lsbCBoYXZlCi0gICAgICAgICAqIG5vIGVmZmVjdCBpZiB0aGUgcm91dGUgaXMgY3VycmVudGx5IHVuc2VsZWN0ZWQuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHZvbHVtZSBUaGUgbmV3IHZvbHVtZSB2YWx1ZSBiZXR3ZWVuIDAgYW5kIHtAbGluayAjZ2V0Vm9sdW1lTWF4fS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RTZXRWb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICBzR2xvYmFsLnJlcXVlc3RTZXRWb2x1bWUodGhpcywgTWF0aC5taW4obVZvbHVtZU1heCwgTWF0aC5tYXgoMCwgdm9sdW1lKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFJlcXVlc3RzIGFuIGluY3JlbWVudGFsIHZvbHVtZSB1cGRhdGUgZm9yIHRoaXMgcm91dGUgYXN5bmNocm9ub3VzbHkuCi0gICAgICAgICAqIDxwPgotICAgICAgICAgKiBUaGlzIGZ1bmN0aW9uIG1heSBvbmx5IGJlIGNhbGxlZCBvbiBhIHNlbGVjdGVkIHJvdXRlLiAgSXQgd2lsbCBoYXZlCi0gICAgICAgICAqIG5vIGVmZmVjdCBpZiB0aGUgcm91dGUgaXMgY3VycmVudGx5IHVuc2VsZWN0ZWQuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIGRlbHRhIFRoZSBkZWx0YSB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdm9sdW1lLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdFVwZGF0ZVZvbHVtZShpbnQgZGVsdGEpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgaWYgKGRlbHRhICE9IDApIHsKLSAgICAgICAgICAgICAgICBzR2xvYmFsLnJlcXVlc3RVcGRhdGVWb2x1bWUodGhpcywgZGVsdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHtAbGluayBEaXNwbGF5fSB0aGF0IHNob3VsZCBiZSB1c2VkIGJ5IHRoZSBhcHBsaWNhdGlvbiB0byBzaG93Ci0gICAgICAgICAqIGEge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbn0gb24gYW4gZXh0ZXJuYWwgZGlzcGxheSB3aGVuIHRoaXMgcm91dGUgaXMgc2VsZWN0ZWQuCi0gICAgICAgICAqIERlcGVuZGluZyBvbiB0aGUgcm91dGUsIHRoaXMgbWF5IG9ubHkgYmUgdmFsaWQgaWYgdGhlIHJvdXRlIGlzIGN1cnJlbnRseQotICAgICAgICAgKiBzZWxlY3RlZC4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSBwcmVmZXJyZWQgcHJlc2VudGF0aW9uIGRpc3BsYXkgbWF5IGNoYW5nZSBpbmRlcGVuZGVudGx5IG9mIHRoZSByb3V0ZQotICAgICAgICAgKiBiZWluZyBzZWxlY3RlZCBvciB1bnNlbGVjdGVkLiAgRm9yIGV4YW1wbGUsIHRoZSBwcmVzZW50YXRpb24gZGlzcGxheQotICAgICAgICAgKiBvZiB0aGUgZGVmYXVsdCBzeXN0ZW0gcm91dGUgbWF5IGNoYW5nZSB3aGVuIGFuIGV4dGVybmFsIEhETUkgZGlzcGxheSBpcyBjb25uZWN0ZWQKLSAgICAgICAgICogb3IgZGlzY29ubmVjdGVkIGV2ZW4gdGhvdWdoIHRoZSByb3V0ZSBpdHNlbGYgaGFzIG5vdCBjaGFuZ2VkLgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoaXMgbWV0aG9kIG1heSByZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBleHRlcm5hbCBkaXNwbGF5IGFzc29jaWF0ZWQgd2l0aAotICAgICAgICAgKiB0aGUgcm91dGUgb3IgaWYgdGhlIGRpc3BsYXkgaXMgbm90IHJlYWR5IHRvIHNob3cgVUkgeWV0LgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoZSBhcHBsaWNhdGlvbiBzaG91bGQgbGlzdGVuIGZvciBjaGFuZ2VzIHRvIHRoZSBwcmVzZW50YXRpb24gZGlzcGxheQotICAgICAgICAgKiB1c2luZyB0aGUge0BsaW5rIENhbGxiYWNrI29uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZH0gY2FsbGJhY2sgYW5kCi0gICAgICAgICAqIHNob3cgb3IgZGlzbWlzcyBpdHMge0BsaW5rIGFuZHJvaWQuYXBwLlByZXNlbnRhdGlvbn0gYWNjb3JkaW5nbHkgd2hlbiB0aGUgZGlzcGxheQotICAgICAgICAgKiBiZWNvbWVzIGF2YWlsYWJsZSBvciBpcyByZW1vdmVkLgotICAgICAgICAgKiA8L3A+PHA+Ci0gICAgICAgICAqIFRoaXMgbWV0aG9kIG9ubHkgbWFrZXMgc2Vuc2UgZm9yCi0gICAgICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQ0FURUdPUllfTElWRV9WSURFTyBsaXZlIHZpZGVvfSByb3V0ZXMuCi0gICAgICAgICAqIDwvcD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHJldHVybiBUaGUgcHJlZmVycmVkIHByZXNlbnRhdGlvbiBkaXNwbGF5IHRvIHVzZSB3aGVuIHRoaXMgcm91dGUgaXMKLSAgICAgICAgICogc2VsZWN0ZWQgb3IgbnVsbCBpZiBub25lLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNDQVRFR09SWV9MSVZFX1ZJREVPCi0gICAgICAgICAqIEBzZWUgYW5kcm9pZC5hcHAuUHJlc2VudGF0aW9uCi0gICAgICAgICAqLwotICAgICAgICBATnVsbGFibGUKLSAgICAgICAgcHVibGljIERpc3BsYXkgZ2V0UHJlc2VudGF0aW9uRGlzcGxheSgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgaWYgKG1QcmVzZW50YXRpb25EaXNwbGF5SWQgPj0gMCAmJiBtUHJlc2VudGF0aW9uRGlzcGxheSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbkRpc3BsYXkgPSBzR2xvYmFsLmdldERpc3BsYXkobVByZXNlbnRhdGlvbkRpc3BsYXlJZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbVByZXNlbnRhdGlvbkRpc3BsYXk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyB0aGUgcm91dGUncyBwcmVzZW50YXRpb24gZGlzcGxheSBpZCwgb3IgLTEgaWYgbm9uZS4KLSAgICAgICAgICogQGhpZGUKLSAgICAgICAgICovCi0gICAgICAgIC8vIEBSZXN0cmljdFRvKExJQlJBUllfR1JPVVApCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1QcmVzZW50YXRpb25EaXNwbGF5SWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogR2V0cyBhIGNvbGxlY3Rpb24gb2YgZXh0cmEgcHJvcGVydGllcyBhYm91dCB0aGlzIHJvdXRlIHRoYXQgd2VyZSBzdXBwbGllZAotICAgICAgICAgKiBieSBpdHMgbWVkaWEgcm91dGUgcHJvdmlkZXIsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIEBOdWxsYWJsZQotICAgICAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKLSAgICAgICAgICAgIHJldHVybiBtRXh0cmFzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgYW4gaW50ZW50IHNlbmRlciBmb3IgbGF1bmNoaW5nIGEgc2V0dGluZ3MgYWN0aXZpdHkgZm9yIHRoaXMKLSAgICAgICAgICogcm91dGUuCi0gICAgICAgICAqLwotICAgICAgICBATnVsbGFibGUKLSAgICAgICAgcHVibGljIEludGVudFNlbmRlciBnZXRTZXR0aW5nc0ludGVudCgpIHsKLSAgICAgICAgICAgIHJldHVybiBtU2V0dGluZ3NJbnRlbnQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2VsZWN0cyB0aGlzIG1lZGlhIHJvdXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgc2VsZWN0KCkgewotICAgICAgICAgICAgY2hlY2tDYWxsaW5nVGhyZWFkKCk7Ci0gICAgICAgICAgICBzR2xvYmFsLnNlbGVjdFJvdXRlKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICByZXR1cm4gIk1lZGlhUm91dGVyLlJvdXRlSW5mb3sgdW5pcXVlSWQ9IiArIG1VbmlxdWVJZAotICAgICAgICAgICAgICAgICAgICArICIsIG5hbWU9IiArIG1OYW1lCi0gICAgICAgICAgICAgICAgICAgICsgIiwgZGVzY3JpcHRpb249IiArIG1EZXNjcmlwdGlvbgotICAgICAgICAgICAgICAgICAgICArICIsIGljb25Vcmk9IiArIG1JY29uVXJpCi0gICAgICAgICAgICAgICAgICAgICsgIiwgZW5hYmxlZD0iICsgbUVuYWJsZWQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjb25uZWN0aW5nPSIgKyBtQ29ubmVjdGluZwotICAgICAgICAgICAgICAgICAgICArICIsIGNvbm5lY3Rpb25TdGF0ZT0iICsgbUNvbm5lY3Rpb25TdGF0ZQotICAgICAgICAgICAgICAgICAgICArICIsIGNhbkRpc2Nvbm5lY3Q9IiArIG1DYW5EaXNjb25uZWN0Ci0gICAgICAgICAgICAgICAgICAgICsgIiwgcGxheWJhY2tUeXBlPSIgKyBtUGxheWJhY2tUeXBlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgcGxheWJhY2tTdHJlYW09IiArIG1QbGF5YmFja1N0cmVhbQotICAgICAgICAgICAgICAgICAgICArICIsIGRldmljZVR5cGU9IiArIG1EZXZpY2VUeXBlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgdm9sdW1lSGFuZGxpbmc9IiArIG1Wb2x1bWVIYW5kbGluZwotICAgICAgICAgICAgICAgICAgICArICIsIHZvbHVtZT0iICsgbVZvbHVtZQotICAgICAgICAgICAgICAgICAgICArICIsIHZvbHVtZU1heD0iICsgbVZvbHVtZU1heAotICAgICAgICAgICAgICAgICAgICArICIsIHByZXNlbnRhdGlvbkRpc3BsYXlJZD0iICsgbVByZXNlbnRhdGlvbkRpc3BsYXlJZAotICAgICAgICAgICAgICAgICAgICArICIsIGV4dHJhcz0iICsgbUV4dHJhcwotICAgICAgICAgICAgICAgICAgICArICIsIHNldHRpbmdzSW50ZW50PSIgKyBtU2V0dGluZ3NJbnRlbnQKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBwcm92aWRlclBhY2thZ2VOYW1lPSIgKyBtUHJvdmlkZXIuZ2V0UGFja2FnZU5hbWUoKQotICAgICAgICAgICAgICAgICAgICArICIgfSI7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgbWF5YmVVcGRhdGVEZXNjcmlwdG9yKE1lZGlhUm91dGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGludCBjaGFuZ2VzID0gMDsKLSAgICAgICAgICAgIGlmIChtRGVzY3JpcHRvciAhPSBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICAgICAgY2hhbmdlcyA9IHVwZGF0ZURlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2hhbmdlczsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB1cGRhdGVEZXNjcmlwdG9yKE1lZGlhUm91dGVEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGludCBjaGFuZ2VzID0gMDsKLSAgICAgICAgICAgIG1EZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1OYW1lLCBkZXNjcmlwdG9yLmdldE5hbWUoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbU5hbWUgPSBkZXNjcmlwdG9yLmdldE5hbWUoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFlcXVhbChtRGVzY3JpcHRpb24sIGRlc2NyaXB0b3IuZ2V0RGVzY3JpcHRpb24oKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbURlc2NyaXB0aW9uID0gZGVzY3JpcHRvci5nZXREZXNjcmlwdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1JY29uVXJpLCBkZXNjcmlwdG9yLmdldEljb25VcmkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUljb25VcmkgPSBkZXNjcmlwdG9yLmdldEljb25VcmkoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1FbmFibGVkICE9IGRlc2NyaXB0b3IuaXNFbmFibGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUVuYWJsZWQgPSBkZXNjcmlwdG9yLmlzRW5hYmxlZCgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3RpbmcgIT0gZGVzY3JpcHRvci5pc0Nvbm5lY3RpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBtQ29ubmVjdGluZyA9IGRlc2NyaXB0b3IuaXNDb25uZWN0aW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvblN0YXRlICE9IGRlc2NyaXB0b3IuZ2V0Q29ubmVjdGlvblN0YXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUNvbm5lY3Rpb25TdGF0ZSA9IGRlc2NyaXB0b3IuZ2V0Q29ubmVjdGlvblN0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbUNvbnRyb2xGaWx0ZXJzLmVxdWFscyhkZXNjcmlwdG9yLmdldENvbnRyb2xGaWx0ZXJzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Db250cm9sRmlsdGVycy5jbGVhcigpOwotICAgICAgICAgICAgICAgICAgICBtQ29udHJvbEZpbHRlcnMuYWRkQWxsKGRlc2NyaXB0b3IuZ2V0Q29udHJvbEZpbHRlcnMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tUeXBlICE9IGRlc2NyaXB0b3IuZ2V0UGxheWJhY2tUeXBlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVBsYXliYWNrVHlwZSA9IGRlc2NyaXB0b3IuZ2V0UGxheWJhY2tUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tTdHJlYW0gIT0gZGVzY3JpcHRvci5nZXRQbGF5YmFja1N0cmVhbSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5YmFja1N0cmVhbSA9IGRlc2NyaXB0b3IuZ2V0UGxheWJhY2tTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1EZXZpY2VUeXBlICE9IGRlc2NyaXB0b3IuZ2V0RGV2aWNlVHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1EZXZpY2VUeXBlID0gZGVzY3JpcHRvci5nZXREZXZpY2VUeXBlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtVm9sdW1lSGFuZGxpbmcgIT0gZGVzY3JpcHRvci5nZXRWb2x1bWVIYW5kbGluZygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVIYW5kbGluZyA9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lSGFuZGxpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhbmdlcyB8PSBDSEFOR0VfR0VORVJBTCB8IENIQU5HRV9WT0xVTUU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtVm9sdW1lICE9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVZvbHVtZSA9IGRlc2NyaXB0b3IuZ2V0Vm9sdW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUwgfCBDSEFOR0VfVk9MVU1FOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobVZvbHVtZU1heCAhPSBkZXNjcmlwdG9yLmdldFZvbHVtZU1heCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVNYXggPSBkZXNjcmlwdG9yLmdldFZvbHVtZU1heCgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1ZPTFVNRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmVzZW50YXRpb25EaXNwbGF5SWQgIT0gZGVzY3JpcHRvci5nZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKSkgewotICAgICAgICAgICAgICAgICAgICBtUHJlc2VudGF0aW9uRGlzcGxheUlkID0gZGVzY3JpcHRvci5nZXRQcmVzZW50YXRpb25EaXNwbGF5SWQoKTsKLSAgICAgICAgICAgICAgICAgICAgbVByZXNlbnRhdGlvbkRpc3BsYXkgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMIHwgQ0hBTkdFX1BSRVNFTlRBVElPTl9ESVNQTEFZOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1FeHRyYXMsIGRlc2NyaXB0b3IuZ2V0RXh0cmFzKCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1FeHRyYXMgPSBkZXNjcmlwdG9yLmdldEV4dHJhcygpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIWVxdWFsKG1TZXR0aW5nc0ludGVudCwgZGVzY3JpcHRvci5nZXRTZXR0aW5nc0FjdGl2aXR5KCkpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc0ludGVudCA9IGRlc2NyaXB0b3IuZ2V0U2V0dGluZ3NBY3Rpdml0eSgpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VzIHw9IENIQU5HRV9HRU5FUkFMOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobUNhbkRpc2Nvbm5lY3QgIT0gZGVzY3JpcHRvci5jYW5EaXNjb25uZWN0QW5kS2VlcFBsYXlpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICBtQ2FuRGlzY29ubmVjdCA9IGRlc2NyaXB0b3IuY2FuRGlzY29ubmVjdEFuZEtlZXBQbGF5aW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIGNoYW5nZXMgfD0gQ0hBTkdFX0dFTkVSQUwgfCBDSEFOR0VfUFJFU0VOVEFUSU9OX0RJU1BMQVk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGNoYW5nZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgZ2V0RGVzY3JpcHRvcklkKCkgewotICAgICAgICAgICAgcmV0dXJuIG1EZXNjcmlwdG9ySWQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiogQGhpZGUgKi8KLSAgICAgICAgLy8gQFJlc3RyaWN0VG8oTElCUkFSWV9HUk9VUCkKLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVQcm92aWRlciBnZXRQcm92aWRlckluc3RhbmNlKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm92aWRlci5nZXRQcm92aWRlckluc3RhbmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmZvcm1hdGlvbiBhYm91dCBhIHJvdXRlIHRoYXQgY29uc2lzdHMgb2YgbXVsdGlwbGUgb3RoZXIgcm91dGVzIGluIGEgZ3JvdXAuCi0gICAgICogQGhpZGUKLSAgICAgKi8KLSAgICAvLyBAUmVzdHJpY3RUbyhMSUJSQVJZX0dST1VQKQotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgUm91dGVHcm91cCBleHRlbmRzIFJvdXRlSW5mbyB7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxSb3V0ZUluZm8+IG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgICAgICBSb3V0ZUdyb3VwKFByb3ZpZGVySW5mbyBwcm92aWRlciwgU3RyaW5nIGRlc2NyaXB0b3JJZCwgU3RyaW5nIHVuaXF1ZUlkKSB7Ci0gICAgICAgICAgICBzdXBlcihwcm92aWRlciwgZGVzY3JpcHRvcklkLCB1bmlxdWVJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQHJldHVybiBUaGUgbnVtYmVyIG9mIHJvdXRlcyBpbiB0aGlzIGdyb3VwCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgaW50IGdldFJvdXRlQ291bnQoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmV0dXJucyB0aGUgcm91dGUgaW4gdGhpcyBncm91cCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4Ci0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBpbmRleCBJbmRleCB0byBmZXRjaAotICAgICAgICAgKiBAcmV0dXJuIFRoZSByb3V0ZSBhdCBpbmRleAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIFJvdXRlSW5mbyBnZXRSb3V0ZUF0KGludCBpbmRleCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXMuZ2V0KGluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXR1cm5zIHRoZSByb3V0ZXMgaW4gdGhpcyBncm91cAotICAgICAgICAgKgotICAgICAgICAgKiBAcmV0dXJuIFRoZSBsaXN0IG9mIHRoZSByb3V0ZXMgaW4gdGhpcyBncm91cAotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIExpc3Q8Um91dGVJbmZvPiBnZXRSb3V0ZXMoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbVJvdXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHN1cGVyLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgc2IuYXBwZW5kKCdbJyk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChpID4gMCkgc2IuYXBwZW5kKCIsICIpOwotICAgICAgICAgICAgICAgIHNiLmFwcGVuZChtUm91dGVzLmdldChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzYi5hcHBlbmQoJ10nKTsKLSAgICAgICAgICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIGludCBtYXliZVVwZGF0ZURlc2NyaXB0b3IoTWVkaWFSb3V0ZURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBpZiAobURlc2NyaXB0b3IgIT0gZGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExpc3Q8U3RyaW5nPiBncm91cE1lbWJlcklkcyA9IGRlc2NyaXB0b3IuZ2V0R3JvdXBNZW1iZXJJZHMoKTsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxSb3V0ZUluZm8+IHJvdXRlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gZ3JvdXBNZW1iZXJJZHMuc2l6ZSgpICE9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgICAgICAgICBmb3IgKFN0cmluZyBncm91cE1lbWJlcklkIDogZ3JvdXBNZW1iZXJJZHMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB1bmlxdWVJZCA9IHNHbG9iYWwuZ2V0VW5pcXVlSWQoZ2V0UHJvdmlkZXIoKSwgZ3JvdXBNZW1iZXJJZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gZ3JvdXBNZW1iZXIgPSBzR2xvYmFsLmdldFJvdXRlKHVuaXF1ZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChncm91cE1lbWJlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGVzLmFkZChncm91cE1lbWJlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjaGFuZ2VkICYmICFtUm91dGVzLmNvbnRhaW5zKGdyb3VwTWVtYmVyKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXMgPSByb3V0ZXM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gKGNoYW5nZWQgPyBDSEFOR0VfR0VORVJBTCA6IDApIHwgc3VwZXIudXBkYXRlRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3ZpZGVzIGluZm9ybWF0aW9uIGFib3V0IGEgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBvYmplY3QgbWF5IGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHdoaWNoIG1lZGlhIHJvdXRlIHByb3ZpZGVyIGhhcwotICAgICAqIHB1Ymxpc2hlZCBhIHBhcnRpY3VsYXIgcm91dGUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgUHJvdmlkZXJJbmZvIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlUHJvdmlkZXIgbVByb3ZpZGVySW5zdGFuY2U7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTGlzdDxSb3V0ZUluZm8+IG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLQotICAgICAgICBwcml2YXRlIGZpbmFsIFByb3ZpZGVyTWV0YWRhdGEgbU1ldGFkYXRhOwotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgbURlc2NyaXB0b3I7Ci0gICAgICAgIHByaXZhdGUgUmVzb3VyY2VzIG1SZXNvdXJjZXM7Ci0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBtUmVzb3VyY2VzTm90QXZhaWxhYmxlOwotCi0gICAgICAgIFByb3ZpZGVySW5mbyhNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIpIHsKLSAgICAgICAgICAgIG1Qcm92aWRlckluc3RhbmNlID0gcHJvdmlkZXI7Ci0gICAgICAgICAgICBtTWV0YWRhdGEgPSBwcm92aWRlci5nZXRNZXRhZGF0YSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHByb3ZpZGVyJ3MgdW5kZXJseWluZyB7QGxpbmsgTWVkaWFSb3V0ZVByb3ZpZGVyfSBpbnN0YW5jZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlUHJvdmlkZXIgZ2V0UHJvdmlkZXJJbnN0YW5jZSgpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIG1Qcm92aWRlckluc3RhbmNlOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUgbWVkaWEgcm91dGUgcHJvdmlkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgU3RyaW5nIGdldFBhY2thZ2VOYW1lKCkgewotICAgICAgICAgICAgcmV0dXJuIG1NZXRhZGF0YS5nZXRQYWNrYWdlTmFtZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEdldHMgdGhlIGNvbXBvbmVudCBuYW1lIG9mIHRoZSBtZWRpYSByb3V0ZSBwcm92aWRlci4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBDb21wb25lbnROYW1lIGdldENvbXBvbmVudE5hbWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbU1ldGFkYXRhLmdldENvbXBvbmVudE5hbWUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBHZXRzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlc30gcHVibGlzaGVkIGJ5IHRoaXMgcm91dGUgcHJvdmlkZXIuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgTGlzdDxSb3V0ZUluZm8+IGdldFJvdXRlcygpIHsKLSAgICAgICAgICAgIGNoZWNrQ2FsbGluZ1RocmVhZCgpOwotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBSZXNvdXJjZXMgZ2V0UmVzb3VyY2VzKCkgewotICAgICAgICAgICAgaWYgKG1SZXNvdXJjZXMgPT0gbnVsbCAmJiAhbVJlc291cmNlc05vdEF2YWlsYWJsZSkgewotICAgICAgICAgICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IGdldFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgICAgICAgICAgQ29udGV4dCBjb250ZXh0ID0gc0dsb2JhbC5nZXRQcm92aWRlckNvbnRleHQocGFja2FnZU5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChjb250ZXh0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcyA9IGNvbnRleHQuZ2V0UmVzb3VyY2VzKCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiVW5hYmxlIHRvIG9idGFpbiByZXNvdXJjZXMgZm9yIHJvdXRlIHByb3ZpZGVyIHBhY2thZ2U6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIHBhY2thZ2VOYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlc05vdEF2YWlsYWJsZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1SZXNvdXJjZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sZWFuIHVwZGF0ZURlc2NyaXB0b3IoTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpZiAobURlc2NyaXB0b3IgIT0gZGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIG1EZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCBmaW5kUm91dGVCeURlc2NyaXB0b3JJZChTdHJpbmcgaWQpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Sb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Sb3V0ZXMuZ2V0KGkpLm1EZXNjcmlwdG9ySWQuZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgICAgIHJldHVybiAiTWVkaWFSb3V0ZXIuUm91dGVQcm92aWRlckluZm97IHBhY2thZ2VOYW1lPSIgKyBnZXRQYWNrYWdlTmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICsgIiB9IjsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSBmb3IgcmVjZWl2aW5nIGV2ZW50cyBhYm91dCBtZWRpYSByb3V0aW5nIGNoYW5nZXMuCi0gICAgICogQWxsIG1ldGhvZHMgb2YgdGhpcyBpbnRlcmZhY2Ugd2lsbCBiZSBjYWxsZWQgZnJvbSB0aGUgYXBwbGljYXRpb24ncyBtYWluIHRocmVhZC4KLSAgICAgKiA8cD4KLSAgICAgKiBBIENhbGxiYWNrIHdpbGwgb25seSByZWNlaXZlIGV2ZW50cyByZWxldmFudCB0byByb3V0ZXMgdGhhdCB0aGUgY2FsbGJhY2sKLSAgICAgKiB3YXMgcmVnaXN0ZXJlZCBmb3IgdW5sZXNzIHRoZSB7QGxpbmsgTWVkaWFSb3V0ZXIjQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UU30KLSAgICAgKiBmbGFnIHdhcyBzcGVjaWZpZWQgaW4ge0BsaW5rIE1lZGlhUm91dGVyI2FkZENhbGxiYWNrKE1lZGlhUm91dGVTZWxlY3RvciwgQ2FsbGJhY2ssIGludCl9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjYWRkQ2FsbGJhY2soTWVkaWFSb3V0ZVNlbGVjdG9yLCBDYWxsYmFjaywgaW50KQotICAgICAqIEBzZWUgTWVkaWFSb3V0ZXIjcmVtb3ZlQ2FsbGJhY2soQ2FsbGJhY2spCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBDYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc3VwcGxpZWQgbWVkaWEgcm91dGUgYmVjb21lcyBzZWxlY3RlZCBhcyB0aGUgYWN0aXZlIHJvdXRlLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWVuIHNlbGVjdGVkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN1cHBsaWVkIG1lZGlhIHJvdXRlIGJlY29tZXMgdW5zZWxlY3RlZCBhcyB0aGUgYWN0aXZlIHJvdXRlLgotICAgICAgICAgKiBGb3IgZGV0YWlsZWQgcmVhc29uLCBvdmVycmlkZSB7QGxpbmsgI29uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyLCBSb3V0ZUluZm8sIGludCl9Ci0gICAgICAgICAqIGluc3RlYWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRoYXQgaGFzIGJlZW4gdW5zZWxlY3RlZC4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHN1cHBsaWVkIG1lZGlhIHJvdXRlIGJlY29tZXMgdW5zZWxlY3RlZCBhcyB0aGUgYWN0aXZlIHJvdXRlLgotICAgICAgICAgKiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscyB7QGxpbmsgI29uUm91dGVVbnNlbGVjdGVkfS4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoZSByZWFzb24gcHJvdmlkZWQgd2lsbCBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzoKLSAgICAgICAgICogPHVsPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9VTktOT1dOfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX0RJU0NPTk5FQ1RFRH08L2xpPgotICAgICAgICAgKiA8bGk+e0BsaW5rIE1lZGlhUm91dGVyI1VOU0VMRUNUX1JFQVNPTl9TVE9QUEVEfTwvbGk+Ci0gICAgICAgICAqIDxsaT57QGxpbmsgTWVkaWFSb3V0ZXIjVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUR9PC9saT4KLSAgICAgICAgICogPC91bD4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZSBUaGUgcm91dGUgdGhhdCBoYXMgYmVlbiB1bnNlbGVjdGVkLgotICAgICAgICAgKiBAcGFyYW0gcmVhc29uIFRoZSByZWFzb24gZm9yIHVuc2VsZWN0aW5nIHRoZSByb3V0ZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlLCBpbnQgcmVhc29uKSB7Ci0gICAgICAgICAgICBvblJvdXRlVW5zZWxlY3RlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlIGhhcyBiZWVuIGFkZGVkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IGhhcyBiZWNvbWUgYXZhaWxhYmxlIGZvciB1c2UuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlQWRkZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlIGhhcyBiZWVuIHJlbW92ZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHRoYXQgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIGF2YWlsYWJpbGl0eS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKE1lZGlhUm91dGVyIHJvdXRlciwgUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBwcm9wZXJ0eSBvZiB0aGUgaW5kaWNhdGVkIG1lZGlhIHJvdXRlIGhhcyBjaGFuZ2VkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB0aGF0IHdhcyBjaGFuZ2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlJ3Mgdm9sdW1lIGNoYW5nZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcm91dGUgVGhlIHJvdXRlIHdob3NlIHZvbHVtZSBjaGFuZ2VkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVZvbHVtZUNoYW5nZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIG1lZGlhIHJvdXRlJ3MgcHJlc2VudGF0aW9uIGRpc3BsYXkgY2hhbmdlcy4KLSAgICAgICAgICogPHA+Ci0gICAgICAgICAqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuZXZlciB0aGUgcm91dGUncyBwcmVzZW50YXRpb24gZGlzcGxheSBiZWNvbWVzCi0gICAgICAgICAqIGF2YWlsYWJsZSwgaXMgcmVtb3ZlZCBvciBoYXMgY2hhbmdlcyB0byBzb21lIG9mIGl0cyBwcm9wZXJ0aWVzIChzdWNoIGFzIGl0cyBzaXplKS4KLSAgICAgICAgICogPC9wPgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gcm91dGVyIFRoZSBtZWRpYSByb3V0ZXIgcmVwb3J0aW5nIHRoZSBldmVudC4KLSAgICAgICAgICogQHBhcmFtIHJvdXRlIFRoZSByb3V0ZSB3aG9zZSBwcmVzZW50YXRpb24gZGlzcGxheSBjaGFuZ2VkLgotICAgICAgICAgKgotICAgICAgICAgKiBAc2VlIFJvdXRlSW5mbyNnZXRQcmVzZW50YXRpb25EaXNwbGF5KCkKLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVQcmVzZW50YXRpb25EaXNwbGF5Q2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgaGFzIGJlZW4gYWRkZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIHRoYXQgaGFzIGJlY29tZSBhdmFpbGFibGUgZm9yIHVzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUHJvdmlkZXJBZGRlZChNZWRpYVJvdXRlciByb3V0ZXIsIFByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgcm91dGUgcHJvdmlkZXIgaGFzIGJlZW4gcmVtb3ZlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHJvdXRlciBUaGUgbWVkaWEgcm91dGVyIHJlcG9ydGluZyB0aGUgZXZlbnQuCi0gICAgICAgICAqIEBwYXJhbSBwcm92aWRlciBUaGUgcHJvdmlkZXIgdGhhdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gYXZhaWxhYmlsaXR5LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm92aWRlclJlbW92ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBQcm92aWRlckluZm8gcHJvdmlkZXIpIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiBhIHByb3BlcnR5IG9mIHRoZSBpbmRpY2F0ZWQgbWVkaWEgcm91dGUgcHJvdmlkZXIgaGFzIGNoYW5nZWQuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSByb3V0ZXIgVGhlIG1lZGlhIHJvdXRlciByZXBvcnRpbmcgdGhlIGV2ZW50LgotICAgICAgICAgKiBAcGFyYW0gcHJvdmlkZXIgVGhlIHByb3ZpZGVyIHRoYXQgd2FzIGNoYW5nZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblByb3ZpZGVyQ2hhbmdlZChNZWRpYVJvdXRlciByb3V0ZXIsIFByb3ZpZGVySW5mbyBwcm92aWRlcikgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGJhY2sgd2hpY2ggaXMgaW52b2tlZCB3aXRoIHRoZSByZXN1bHQgb2YgYSBtZWRpYSBjb250cm9sIHJlcXVlc3QuCi0gICAgICoKLSAgICAgKiBAc2VlIFJvdXRlSW5mbyNzZW5kQ29udHJvbFJlcXVlc3QKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gYSBtZWRpYSBjb250cm9sIHJlcXVlc3Qgc3VjY2VlZHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFJlc3VsdCBkYXRhLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqIENvbnRlbnRzIGRlcGVuZCBvbiB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGFjdGlvbn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSkgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgY29udHJvbCByZXF1ZXN0IGZhaWxzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZXJyb3IgQSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSB3aGljaCBtYXkgYmUgc2hvd24gdG8gdGhlIHVzZXIsIG9yIG51bGwKLSAgICAgICAgICogaWYgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBpcyB1bmNsZWFyLgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBFcnJvciBkYXRhLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICAgICAqIENvbnRlbnRzIGRlcGVuZCBvbiB0aGUge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCBtZWRpYSBjb250cm9sIGFjdGlvbn0uCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIENhbGxiYWNrUmVjb3JkIHsKLSAgICAgICAgcHVibGljIGZpbmFsIE1lZGlhUm91dGVyIG1Sb3V0ZXI7Ci0gICAgICAgIHB1YmxpYyBmaW5hbCBDYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgICAgIHB1YmxpYyBNZWRpYVJvdXRlU2VsZWN0b3IgbVNlbGVjdG9yOwotICAgICAgICBwdWJsaWMgaW50IG1GbGFnczsKLQotICAgICAgICBwdWJsaWMgQ2FsbGJhY2tSZWNvcmQoTWVkaWFSb3V0ZXIgcm91dGVyLCBDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgbVJvdXRlciA9IHJvdXRlcjsKLSAgICAgICAgICAgIG1DYWxsYmFjayA9IGNhbGxiYWNrOwotICAgICAgICAgICAgbVNlbGVjdG9yID0gTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gZmlsdGVyUm91dGVFdmVudChSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHJldHVybiAobUZsYWdzICYgQ0FMTEJBQ0tfRkxBR19VTkZJTFRFUkVEX0VWRU5UUykgIT0gMAotICAgICAgICAgICAgICAgICAgICB8fCByb3V0ZS5tYXRjaGVzU2VsZWN0b3IobVNlbGVjdG9yKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdsb2JhbCBzdGF0ZSBmb3IgdGhlIG1lZGlhIHJvdXRlci4KLSAgICAgKiA8cD4KLSAgICAgKiBNZWRpYSByb3V0ZXMgYW5kIG1lZGlhIHJvdXRlIHByb3ZpZGVycyBhcmUgZ2xvYmFsIHRvIHRoZSBwcm9jZXNzOyB0aGVpcgotICAgICAqIHN0YXRlIGFuZCB0aGUgYnVsayBvZiB0aGUgbWVkaWEgcm91dGVyIGltcGxlbWVudGF0aW9uIGxpdmVzIGhlcmUuCi0gICAgICogPC9wPgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEdsb2JhbE1lZGlhUm91dGVyCi0gICAgICAgICAgICBpbXBsZW1lbnRzIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5TeW5jQ2FsbGJhY2ssCi0gICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlci5DYWxsYmFjayB7Ci0gICAgICAgIGZpbmFsIENvbnRleHQgbUFwcGxpY2F0aW9uQ29udGV4dDsKLSAgICAgICAgZmluYWwgQXJyYXlMaXN0PFdlYWtSZWZlcmVuY2U8TWVkaWFSb3V0ZXI+PiBtUm91dGVycyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxSb3V0ZUluZm8+IG1Sb3V0ZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8UGFpcjxTdHJpbmcsIFN0cmluZz4sIFN0cmluZz4gbVVuaXF1ZUlkTWFwID0gbmV3IEhhc2hNYXA8PigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxQcm92aWRlckluZm8+IG1Qcm92aWRlcnMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UmVtb3RlQ29udHJvbENsaWVudFJlY29yZD4gbVJlbW90ZUNvbnRyb2xDbGllbnRzID0KLSAgICAgICAgICAgICAgICBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgZmluYWwgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5QbGF5YmFja0luZm8gbVBsYXliYWNrSW5mbyA9Ci0gICAgICAgICAgICAgICAgbmV3IFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuUGxheWJhY2tJbmZvKCk7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUHJvdmlkZXJDYWxsYmFjayBtUHJvdmlkZXJDYWxsYmFjayA9IG5ldyBQcm92aWRlckNhbGxiYWNrKCk7Ci0gICAgICAgIGZpbmFsIENhbGxiYWNrSGFuZGxlciBtQ2FsbGJhY2tIYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcigpOwotICAgICAgICBwcml2YXRlIGZpbmFsIERpc3BsYXlNYW5hZ2VyQ29tcGF0IG1EaXNwbGF5TWFuYWdlcjsKLSAgICAgICAgZmluYWwgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyIG1TeXN0ZW1Qcm92aWRlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIG1Mb3dSYW07Ci0KLSAgICAgICAgcHJpdmF0ZSBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlciBtUmVnaXN0ZXJlZFByb3ZpZGVyV2F0Y2hlcjsKLSAgICAgICAgcHJpdmF0ZSBSb3V0ZUluZm8gbURlZmF1bHRSb3V0ZTsKLSAgICAgICAgcHJpdmF0ZSBSb3V0ZUluZm8gbUJsdWV0b290aFJvdXRlOwotICAgICAgICBSb3V0ZUluZm8gbVNlbGVjdGVkUm91dGU7Ci0gICAgICAgIHByaXZhdGUgUm91dGVDb250cm9sbGVyIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlcjsKLSAgICAgICAgLy8gQSBtYXAgZnJvbSByb3V0ZSBkZXNjcmlwdG9yIElEIHRvIFJvdXRlQ29udHJvbGxlciBmb3IgdGhlIG1lbWJlciByb3V0ZXMgaW4gdGhlIGN1cnJlbnRseQotICAgICAgICAvLyBzZWxlY3RlZCByb3V0ZSBncm91cC4KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBSb3V0ZUNvbnRyb2xsZXI+IG1Sb3V0ZUNvbnRyb2xsZXJNYXAgPSBuZXcgSGFzaE1hcDw+KCk7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZURpc2NvdmVyeVJlcXVlc3QgbURpc2NvdmVyeVJlcXVlc3Q7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFTZXNzaW9uUmVjb3JkIG1NZWRpYVNlc3Npb247Ci0gICAgICAgIE1lZGlhU2Vzc2lvbkNvbXBhdCBtUmNjTWVkaWFTZXNzaW9uOwotICAgICAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbkNvbXBhdCBtQ29tcGF0U2Vzc2lvbjsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVNlc3Npb25Db21wYXQuT25BY3RpdmVDaGFuZ2VMaXN0ZW5lciBtU2Vzc2lvbkFjdGl2ZUxpc3RlbmVyID0KLSAgICAgICAgICAgICAgICBuZXcgTWVkaWFTZXNzaW9uQ29tcGF0Lk9uQWN0aXZlQ2hhbmdlTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQWN0aXZlQ2hhbmdlZCgpIHsKLSAgICAgICAgICAgICAgICBpZihtUmNjTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1SY2NNZWRpYVNlc3Npb24uaXNBY3RpdmUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVtb3RlQ29udHJvbENsaWVudChtUmNjTWVkaWFTZXNzaW9uLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZW1vdmVSZW1vdGVDb250cm9sQ2xpZW50KG1SY2NNZWRpYVNlc3Npb24uZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfTsKLQotICAgICAgICBHbG9iYWxNZWRpYVJvdXRlcihDb250ZXh0IGFwcGxpY2F0aW9uQ29udGV4dCkgewotICAgICAgICAgICAgbUFwcGxpY2F0aW9uQ29udGV4dCA9IGFwcGxpY2F0aW9uQ29udGV4dDsKLSAgICAgICAgICAgIG1EaXNwbGF5TWFuYWdlciA9IERpc3BsYXlNYW5hZ2VyQ29tcGF0LmdldEluc3RhbmNlKGFwcGxpY2F0aW9uQ29udGV4dCk7Ci0gICAgICAgICAgICBtTG93UmFtID0gQWN0aXZpdHlNYW5hZ2VyQ29tcGF0LmlzTG93UmFtRGV2aWNlKAotICAgICAgICAgICAgICAgICAgICAoQWN0aXZpdHlNYW5hZ2VyKWFwcGxpY2F0aW9uQ29udGV4dC5nZXRTeXN0ZW1TZXJ2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQuQUNUSVZJVFlfU0VSVklDRSkpOwotCi0gICAgICAgICAgICAvLyBBZGQgdGhlIHN5c3RlbSBtZWRpYSByb3V0ZSBwcm92aWRlciBmb3IgaW50ZXJvcGVyYXRpbmcgd2l0aAotICAgICAgICAgICAgLy8gdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuICBUaGlzIG9uZSBpcyBzcGVjaWFsIGFuZCByZWNlaXZlcwotICAgICAgICAgICAgLy8gc3luY2hyb25pemF0aW9uIG1lc3NhZ2VzIGZyb20gdGhlIG1lZGlhIHJvdXRlci4KLSAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlciA9IFN5c3RlbU1lZGlhUm91dGVQcm92aWRlci5vYnRhaW4oYXBwbGljYXRpb25Db250ZXh0LCB0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHN0YXJ0KCkgewotICAgICAgICAgICAgYWRkUHJvdmlkZXIobVN5c3RlbVByb3ZpZGVyKTsKLQotICAgICAgICAgICAgLy8gU3RhcnQgd2F0Y2hpbmcgZm9yIHJvdXRlcyBwdWJsaXNoZWQgYnkgcmVnaXN0ZXJlZCBtZWRpYSByb3V0ZQotICAgICAgICAgICAgLy8gcHJvdmlkZXIgc2VydmljZXMuCi0gICAgICAgICAgICBtUmVnaXN0ZXJlZFByb3ZpZGVyV2F0Y2hlciA9IG5ldyBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlcigKLSAgICAgICAgICAgICAgICAgICAgbUFwcGxpY2F0aW9uQ29udGV4dCwgdGhpcyk7Ci0gICAgICAgICAgICBtUmVnaXN0ZXJlZFByb3ZpZGVyV2F0Y2hlci5zdGFydCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE1lZGlhUm91dGVyIGdldFJvdXRlcihDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVyIHJvdXRlcjsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUm91dGVycy5zaXplKCk7IC0taSA+PSAwOyApIHsKLSAgICAgICAgICAgICAgICByb3V0ZXIgPSBtUm91dGVycy5nZXQoaSkuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvdXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJvdXRlci5tQ29udGV4dCA9PSBjb250ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByb3V0ZXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcm91dGVyID0gbmV3IE1lZGlhUm91dGVyKGNvbnRleHQpOwotICAgICAgICAgICAgbVJvdXRlcnMuYWRkKG5ldyBXZWFrUmVmZXJlbmNlPE1lZGlhUm91dGVyPihyb3V0ZXIpKTsKLSAgICAgICAgICAgIHJldHVybiByb3V0ZXI7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgQ29udGVudFJlc29sdmVyIGdldENvbnRlbnRSZXNvbHZlcigpIHsKLSAgICAgICAgICAgIHJldHVybiBtQXBwbGljYXRpb25Db250ZXh0LmdldENvbnRlbnRSZXNvbHZlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIENvbnRleHQgZ2V0UHJvdmlkZXJDb250ZXh0KFN0cmluZyBwYWNrYWdlTmFtZSkgewotICAgICAgICAgICAgaWYgKHBhY2thZ2VOYW1lLmVxdWFscyhTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuUEFDS0FHRV9OQU1FKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQXBwbGljYXRpb25Db250ZXh0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUFwcGxpY2F0aW9uQ29udGV4dC5jcmVhdGVQYWNrYWdlQ29udGV4dCgKLSAgICAgICAgICAgICAgICAgICAgICAgIHBhY2thZ2VOYW1lLCBDb250ZXh0LkNPTlRFWFRfUkVTVFJJQ1RFRCk7Ci0gICAgICAgICAgICB9IGNhdGNoIChOYW1lTm90Rm91bmRFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBEaXNwbGF5IGdldERpc3BsYXkoaW50IGRpc3BsYXlJZCkgewotICAgICAgICAgICAgcmV0dXJuIG1EaXNwbGF5TWFuYWdlci5nZXREaXNwbGF5KGRpc3BsYXlJZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZW5kQ29udHJvbFJlcXVlc3QoUm91dGVJbmZvIHJvdXRlLAotICAgICAgICAgICAgICAgIEludGVudCBpbnRlbnQsIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSAmJiBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25Db250cm9sUmVxdWVzdChpbnRlbnQsIGNhbGxiYWNrKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjYWxsYmFjay5vbkVycm9yKG51bGwsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgcmVxdWVzdFNldFZvbHVtZShSb3V0ZUluZm8gcm91dGUsIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSAmJiBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmICghbVJvdXRlQ29udHJvbGxlck1hcC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICBSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IG1Sb3V0ZUNvbnRyb2xsZXJNYXAuZ2V0KHJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgIGlmIChjb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RVcGRhdGVWb2x1bWUoUm91dGVJbmZvIHJvdXRlLCBpbnQgZGVsdGEpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSAmJiBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblVwZGF0ZVZvbHVtZShkZWx0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUm91dGVJbmZvIGdldFJvdXRlKFN0cmluZyB1bmlxdWVJZCkgewotICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gaW5mbyA6IG1Sb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5mby5tVW5pcXVlSWQuZXF1YWxzKHVuaXF1ZUlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5mbzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBMaXN0PFJvdXRlSW5mbz4gZ2V0Um91dGVzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Sb3V0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICBMaXN0PFByb3ZpZGVySW5mbz4gZ2V0UHJvdmlkZXJzKCkgewotICAgICAgICAgICAgcmV0dXJuIG1Qcm92aWRlcnM7Ci0gICAgICAgIH0KLQotICAgICAgICBATm9uTnVsbCBSb3V0ZUluZm8gZ2V0RGVmYXVsdFJvdXRlKCkgewotICAgICAgICAgICAgaWYgKG1EZWZhdWx0Um91dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBvbmNlIHRoZSBtZWRpYSByb3V0ZXIgaGFzIGJlZW4gZnVsbHkKLSAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplZCBidXQgaXQgaXMgZ29vZCB0byBjaGVjayBmb3IgdGhlIGVycm9yIGluIGNhc2UgdGhlcmUKLSAgICAgICAgICAgICAgICAvLyBpcyBhIGJ1ZyBpbiBwcm92aWRlciBpbml0aWFsaXphdGlvbi4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBpcyBubyBkZWZhdWx0IHJvdXRlLiAgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiVGhlIG1lZGlhIHJvdXRlciBoYXMgbm90IHlldCBiZWVuIGZ1bGx5IGluaXRpYWxpemVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1EZWZhdWx0Um91dGU7Ci0gICAgICAgIH0KLQotICAgICAgICBSb3V0ZUluZm8gZ2V0Qmx1ZXRvb3RoUm91dGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUJsdWV0b290aFJvdXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE5vbk51bGwgUm91dGVJbmZvIGdldFNlbGVjdGVkUm91dGUoKSB7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBvbmNlIHRoZSBtZWRpYSByb3V0ZXIgaGFzIGJlZW4gZnVsbHkKLSAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplZCBidXQgaXQgaXMgZ29vZCB0byBjaGVjayBmb3IgdGhlIGVycm9yIGluIGNhc2UgdGhlcmUKLSAgICAgICAgICAgICAgICAvLyBpcyBhIGJ1ZyBpbiBwcm92aWRlciBpbml0aWFsaXphdGlvbi4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJUaGVyZSBpcyBubyBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUuICAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJUaGUgbWVkaWEgcm91dGVyIGhhcyBub3QgeWV0IGJlZW4gZnVsbHkgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbVNlbGVjdGVkUm91dGU7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHNlbGVjdFJvdXRlKEBOb25OdWxsIFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgc2VsZWN0Um91dGUocm91dGUsIE1lZGlhUm91dGVyLlVOU0VMRUNUX1JFQVNPTl9ST1VURV9DSEFOR0VEKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgc2VsZWN0Um91dGUoQE5vbk51bGwgUm91dGVJbmZvIHJvdXRlLCBpbnQgdW5zZWxlY3RSZWFzb24pIHsKLSAgICAgICAgICAgIGlmICghbVJvdXRlcy5jb250YWlucyhyb3V0ZSkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJZ25vcmluZyBhdHRlbXB0IHRvIHNlbGVjdCByZW1vdmVkIHJvdXRlOiAiICsgcm91dGUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghcm91dGUubUVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJZ25vcmluZyBhdHRlbXB0IHRvIHNlbGVjdCBkaXNhYmxlZCByb3V0ZTogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRTZWxlY3RlZFJvdXRlSW50ZXJuYWwocm91dGUsIHVuc2VsZWN0UmVhc29uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIGlzUm91dGVBdmFpbGFibGUoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yLCBpbnQgZmxhZ3MpIHsKLSAgICAgICAgICAgIGlmIChzZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE9uIGxvdy1SQU0gZGV2aWNlcywgZG8gbm90IHJlbHkgb24gYWN0dWFsIGRpc2NvdmVyeSByZXN1bHRzIHVubGVzcyBhc2tlZCB0by4KLSAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBBVkFJTEFCSUxJVFlfRkxBR19SRVFVSVJFX01BVENIKSA9PSAwICYmIG1Mb3dSYW0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQ2hlY2sgd2hldGhlciBhbnkgZXhpc3Rpbmcgcm91dGVzIG1hdGNoIHRoZSBzZWxlY3Rvci4KLSAgICAgICAgICAgIGZpbmFsIGludCByb3V0ZUNvdW50ID0gbVJvdXRlcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJvdXRlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IG1Sb3V0ZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiBBVkFJTEFCSUxJVFlfRkxBR19JR05PUkVfREVGQVVMVF9ST1VURSkgIT0gMAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgcm91dGUuaXNEZWZhdWx0T3JCbHVldG9vdGgoKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHJvdXRlLm1hdGNoZXNTZWxlY3RvcihzZWxlY3RvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBJdCBkb2Vzbid0IGxvb2sgbGlrZSB3ZSBjYW4gZmluZCBhIG1hdGNoaW5nIHJvdXRlIHJpZ2h0IG5vdy4KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZURpc2NvdmVyeVJlcXVlc3QoKSB7Ci0gICAgICAgICAgICAvLyBDb21iaW5lIGFsbCBvZiB0aGUgY2FsbGJhY2sgc2VsZWN0b3JzIGFuZCBhY3RpdmUgc2NhbiBmbGFncy4KLSAgICAgICAgICAgIGJvb2xlYW4gZGlzY292ZXIgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2xlYW4gYWN0aXZlU2NhbiA9IGZhbHNlOwotICAgICAgICAgICAgTWVkaWFSb3V0ZVNlbGVjdG9yLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlcigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Sb3V0ZXJzLnNpemUoKTsgLS1pID49IDA7ICkgewotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyIHJvdXRlciA9IG1Sb3V0ZXJzLmdldChpKS5nZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAocm91dGVyID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlcnMucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IHJvdXRlci5tQ2FsbGJhY2tSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBDYWxsYmFja1JlY29yZCBjYWxsYmFjayA9IHJvdXRlci5tQ2FsbGJhY2tSZWNvcmRzLmdldChqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkU2VsZWN0b3IoY2FsbGJhY2subVNlbGVjdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY2FsbGJhY2subUZsYWdzICYgQ0FMTEJBQ0tfRkxBR19QRVJGT1JNX0FDVElWRV9TQ0FOKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlU2NhbiA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzY292ZXIgPSB0cnVlOyAvLyBwZXJmb3JtIGFjdGl2ZSBzY2FuIGltcGxpZXMgcmVxdWVzdCBkaXNjb3ZlcnkKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoY2FsbGJhY2subUZsYWdzICYgQ0FMTEJBQ0tfRkxBR19SRVFVRVNUX0RJU0NPVkVSWSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbUxvd1JhbSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNjb3ZlciA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChjYWxsYmFjay5tRmxhZ3MgJiBDQUxMQkFDS19GTEFHX0ZPUkNFX0RJU0NPVkVSWSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2NvdmVyID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciA9IGRpc2NvdmVyID8gYnVpbGRlci5idWlsZCgpIDogTWVkaWFSb3V0ZVNlbGVjdG9yLkVNUFRZOwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgYSBuZXcgZGlzY292ZXJ5IHJlcXVlc3QuCi0gICAgICAgICAgICBpZiAobURpc2NvdmVyeVJlcXVlc3QgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAmJiBtRGlzY292ZXJ5UmVxdWVzdC5nZXRTZWxlY3RvcigpLmVxdWFscyhzZWxlY3RvcikKLSAgICAgICAgICAgICAgICAgICAgJiYgbURpc2NvdmVyeVJlcXVlc3QuaXNBY3RpdmVTY2FuKCkgPT0gYWN0aXZlU2NhbikgewotICAgICAgICAgICAgICAgIHJldHVybjsgLy8gbm8gY2hhbmdlCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc2VsZWN0b3IuaXNFbXB0eSgpICYmICFhY3RpdmVTY2FuKSB7Ci0gICAgICAgICAgICAgICAgLy8gRGlzY292ZXJ5IGlzIG5vdCBuZWVkZWQuCi0gICAgICAgICAgICAgICAgaWYgKG1EaXNjb3ZlcnlSZXF1ZXN0ID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAvLyBubyBjaGFuZ2UKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbURpc2NvdmVyeVJlcXVlc3QgPSBudWxsOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBEaXNjb3ZlcnkgaXMgbmVlZGVkLgotICAgICAgICAgICAgICAgIG1EaXNjb3ZlcnlSZXF1ZXN0ID0gbmV3IE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0KHNlbGVjdG9yLCBhY3RpdmVTY2FuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlVwZGF0ZWQgZGlzY292ZXJ5IHJlcXVlc3Q6ICIgKyBtRGlzY292ZXJ5UmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGlzY292ZXIgJiYgIWFjdGl2ZVNjYW4gJiYgbUxvd1JhbSkgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkZvcmNpbmcgcGFzc2l2ZSByb3V0ZSBkaXNjb3Zlcnkgb24gYSBsb3ctUkFNIGRldmljZSwgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAic3lzdGVtIHBlcmZvcm1hbmNlIG1heSBiZSBhZmZlY3RlZC4gIFBsZWFzZSBjb25zaWRlciB1c2luZyAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJDQUxMQkFDS19GTEFHX1JFUVVFU1RfRElTQ09WRVJZIGluc3RlYWQgb2YgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiQ0FMTEJBQ0tfRkxBR19GT1JDRV9ESVNDT1ZFUlkuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIE5vdGlmeSBwcm92aWRlcnMuCi0gICAgICAgICAgICBmaW5hbCBpbnQgcHJvdmlkZXJDb3VudCA9IG1Qcm92aWRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm92aWRlckNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLmdldChpKS5tUHJvdmlkZXJJbnN0YW5jZS5zZXREaXNjb3ZlcnlSZXF1ZXN0KG1EaXNjb3ZlcnlSZXF1ZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRQcm92aWRlcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXJJbnN0YW5jZSkgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFByb3ZpZGVySW5mbyhwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAvLyAxLiBBZGQgdGhlIHByb3ZpZGVyIHRvIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IG5ldyBQcm92aWRlckluZm8ocHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgICAgICAgICAgbVByb3ZpZGVycy5hZGQocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJQcm92aWRlciBhZGRlZDogIiArIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUFJPVklERVJfQURERUQsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAvLyAyLiBDcmVhdGUgdGhlIHByb3ZpZGVyJ3MgY29udGVudHMuCi0gICAgICAgICAgICAgICAgdXBkYXRlUHJvdmlkZXJDb250ZW50cyhwcm92aWRlciwgcHJvdmlkZXJJbnN0YW5jZS5nZXREZXNjcmlwdG9yKCkpOwotICAgICAgICAgICAgICAgIC8vIDMuIFJlZ2lzdGVyIHRoZSBwcm92aWRlciBjYWxsYmFjay4KLSAgICAgICAgICAgICAgICBwcm92aWRlckluc3RhbmNlLnNldENhbGxiYWNrKG1Qcm92aWRlckNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICAvLyA0LiBTZXQgdGhlIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAgICAgICAgICAgIHByb3ZpZGVySW5zdGFuY2Uuc2V0RGlzY292ZXJ5UmVxdWVzdChtRGlzY292ZXJ5UmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcmVtb3ZlUHJvdmlkZXIoTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRQcm92aWRlckluZm8ocHJvdmlkZXJJbnN0YW5jZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIC8vIDEuIFVucmVnaXN0ZXIgdGhlIHByb3ZpZGVyIGNhbGxiYWNrLgotICAgICAgICAgICAgICAgIHByb3ZpZGVySW5zdGFuY2Uuc2V0Q2FsbGJhY2sobnVsbCk7Ci0gICAgICAgICAgICAgICAgLy8gMi4gQ2xlYXIgdGhlIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAgICAgICAgICAgIHByb3ZpZGVySW5zdGFuY2Uuc2V0RGlzY292ZXJ5UmVxdWVzdChudWxsKTsKLSAgICAgICAgICAgICAgICAvLyAzLiBEZWxldGUgdGhlIHByb3ZpZGVyJ3MgY29udGVudHMuCi0gICAgICAgICAgICAgICAgUHJvdmlkZXJJbmZvIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVByb3ZpZGVyQ29udGVudHMocHJvdmlkZXIsIG51bGwpOwotICAgICAgICAgICAgICAgIC8vIDQuIFJlbW92ZSB0aGUgcHJvdmlkZXIgZnJvbSB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUHJvdmlkZXIgcmVtb3ZlZDogIiArIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUFJPVklERVJfUkVNT1ZFRCwgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgdXBkYXRlUHJvdmlkZXJEZXNjcmlwdG9yKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlckluc3RhbmNlLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFByb3ZpZGVySW5mbyhwcm92aWRlckluc3RhbmNlKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBwcm92aWRlcidzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IG1Qcm92aWRlcnMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICB1cGRhdGVQcm92aWRlckNvbnRlbnRzKHByb3ZpZGVyLCBkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRQcm92aWRlckluZm8oTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVySW5zdGFuY2UpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1Qcm92aWRlcnMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Qcm92aWRlcnMuZ2V0KGkpLm1Qcm92aWRlckluc3RhbmNlID09IHByb3ZpZGVySW5zdGFuY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVByb3ZpZGVyQ29udGVudHMoUHJvdmlkZXJJbmZvIHByb3ZpZGVyLAotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgcHJvdmlkZXJEZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXIudXBkYXRlRGVzY3JpcHRvcihwcm92aWRlckRlc2NyaXB0b3IpKSB7Ci0gICAgICAgICAgICAgICAgLy8gVXBkYXRlIGFsbCBleGlzdGluZyByb3V0ZXMgYW5kIHJlb3JkZXIgdGhlbSB0byBtYXRjaAotICAgICAgICAgICAgICAgIC8vIHRoZSBvcmRlciBvZiB0aGVpciBkZXNjcmlwdG9ycy4KLSAgICAgICAgICAgICAgICBpbnQgdGFyZ2V0SW5kZXggPSAwOwotICAgICAgICAgICAgICAgIGJvb2xlYW4gc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgaWYgKHByb3ZpZGVyRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwcm92aWRlckRlc2NyaXB0b3IuaXNWYWxpZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PE1lZGlhUm91dGVEZXNjcmlwdG9yPiByb3V0ZURlc2NyaXB0b3JzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJEZXNjcmlwdG9yLmdldFJvdXRlcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHJvdXRlQ291bnQgPSByb3V0ZURlc2NyaXB0b3JzLnNpemUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0aW5nIHJvdXRlIGdyb3VwJ3MgY29udGVudHMgcmVxdWlyZXMgYWxsIG1lbWJlciByb3V0ZXMnIGluZm9ybWF0aW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIHRoZSBncm91cHMgdG8gdGhlIGxpc3RzIGFuZCB1cGRhdGUgdGhlbSBsYXRlci4KLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8UGFpcjxSb3V0ZUluZm8sIE1lZGlhUm91dGVEZXNjcmlwdG9yPj4gYWRkZWRHcm91cHMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExpc3Q8UGFpcjxSb3V0ZUluZm8sIE1lZGlhUm91dGVEZXNjcmlwdG9yPj4gdXBkYXRlZEdyb3VwcyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByb3V0ZUNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZURlc2NyaXB0b3IgPSByb3V0ZURlc2NyaXB0b3JzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSByb3V0ZURlc2NyaXB0b3IuZ2V0SWQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc291cmNlSW5kZXggPSBwcm92aWRlci5maW5kUm91dGVCeURlc2NyaXB0b3JJZChpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAxLiBBZGQgdGhlIHJvdXRlIHRvIHRoZSBsaXN0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdW5pcXVlSWQgPSBhc3NpZ25Sb3V0ZVVuaXF1ZUlkKHByb3ZpZGVyLCBpZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gaXNHcm91cCA9IHJvdXRlRGVzY3JpcHRvci5nZXRHcm91cE1lbWJlcklkcygpICE9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IGlzR3JvdXAgPyBuZXcgUm91dGVHcm91cChwcm92aWRlciwgaWQsIHVuaXF1ZUlkKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFJvdXRlSW5mbyhwcm92aWRlciwgaWQsIHVuaXF1ZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIubVJvdXRlcy5hZGQodGFyZ2V0SW5kZXgrKywgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVzLmFkZChyb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIENyZWF0ZSB0aGUgcm91dGUncyBjb250ZW50cy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzR3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZGVkR3JvdXBzLmFkZChuZXcgUGFpcjw+KHJvdXRlLCByb3V0ZURlc2NyaXB0b3IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1heWJlVXBkYXRlRGVzY3JpcHRvcihyb3V0ZURlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMy4gTm90aWZ5IGNsaWVudHMgYWJvdXQgYWRkaXRpb24uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBhZGRlZDogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX0FEREVELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoc291cmNlSW5kZXggPCB0YXJnZXRJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJJZ25vcmluZyByb3V0ZSBkZXNjcmlwdG9yIHdpdGggZHVwbGljYXRlIGlkOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByb3V0ZURlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDEuIFJlb3JkZXIgdGhlIHJvdXRlIHdpdGhpbiB0aGUgbGlzdC4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcHJvdmlkZXIubVJvdXRlcy5nZXQoc291cmNlSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zd2FwKHByb3ZpZGVyLm1Sb3V0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlSW5kZXgsIHRhcmdldEluZGV4KyspOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyLiBVcGRhdGUgdGhlIHJvdXRlJ3MgY29udGVudHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZSBpbnN0YW5jZW9mIFJvdXRlR3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwZGF0ZWRHcm91cHMuYWRkKG5ldyBQYWlyPD4ocm91dGUsIHJvdXRlRGVzY3JpcHRvcikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMy4gTm90aWZ5IGNsaWVudHMgYWJvdXQgY2hhbmdlcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh1cGRhdGVSb3V0ZURlc2NyaXB0b3JBbmROb3RpZnkocm91dGUsIHJvdXRlRGVzY3JpcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyb3V0ZSA9PSBtU2VsZWN0ZWRSb3V0ZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgbmV3IGFuZC9vciBleGlzdGluZyBncm91cHMuCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFBhaXI8Um91dGVJbmZvLCBNZWRpYVJvdXRlRGVzY3JpcHRvcj4gcGFpciA6IGFkZGVkR3JvdXBzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVJbmZvIHJvdXRlID0gcGFpci5maXJzdDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0ZS5tYXliZVVwZGF0ZURlc2NyaXB0b3IocGFpci5zZWNvbmQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSBhZGRlZDogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfQURERUQsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoUGFpcjxSb3V0ZUluZm8sIE1lZGlhUm91dGVEZXNjcmlwdG9yPiBwYWlyIDogdXBkYXRlZEdyb3VwcykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlSW5mbyByb3V0ZSA9IHBhaXIuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZVJvdXRlRGVzY3JpcHRvckFuZE5vdGlmeShyb3V0ZSwgcGFpci5zZWNvbmQpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlID09IG1TZWxlY3RlZFJvdXRlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiSWdub3JpbmcgaW52YWxpZCBwcm92aWRlciBkZXNjcmlwdG9yOiAiICsgcHJvdmlkZXJEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIERpc3Bvc2UgYWxsIHJlbWFpbmluZyByb3V0ZXMgdGhhdCBkbyBub3QgaGF2ZSBtYXRjaGluZyBkZXNjcmlwdG9ycy4KLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gcHJvdmlkZXIubVJvdXRlcy5zaXplKCkgLSAxOyBpID49IHRhcmdldEluZGV4OyBpLS0pIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gMS4gRGVsZXRlIHRoZSByb3V0ZSdzIGNvbnRlbnRzLgotICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBwcm92aWRlci5tUm91dGVzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgcm91dGUubWF5YmVVcGRhdGVEZXNjcmlwdG9yKG51bGwpOwotICAgICAgICAgICAgICAgICAgICAvLyAyLiBSZW1vdmUgdGhlIHJvdXRlIGZyb20gdGhlIGxpc3QuCi0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXMucmVtb3ZlKHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHNlbGVjdGVkIHJvdXRlIGlmIG5lZWRlZC4KLSAgICAgICAgICAgICAgICB1cGRhdGVTZWxlY3RlZFJvdXRlSWZOZWVkZWQoc2VsZWN0ZWRSb3V0ZURlc2NyaXB0b3JDaGFuZ2VkKTsKLQotICAgICAgICAgICAgICAgIC8vIE5vdyBub3RpZnkgY2xpZW50cyBhYm91dCByb3V0ZXMgdGhhdCB3ZXJlIHJlbW92ZWQuCi0gICAgICAgICAgICAgICAgLy8gV2UgZG8gdGhpcyBhZnRlciB1cGRhdGluZyB0aGUgc2VsZWN0ZWQgcm91dGUgdG8gZW5zdXJlCi0gICAgICAgICAgICAgICAgLy8gdGhhdCB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlciBvYnNlcnZlcyB0aGUgbmV3IHJvdXRlCi0gICAgICAgICAgICAgICAgLy8gc2VsZWN0aW9uIGJlZm9yZSB0aGUgcmVtb3ZhbCBzaW5jZSByZW1vdmluZyB0aGUgY3VycmVudGx5Ci0gICAgICAgICAgICAgICAgLy8gc2VsZWN0ZWQgcm91dGUgbWF5IGhhdmUgc2lkZS1lZmZlY3RzLgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBwcm92aWRlci5tUm91dGVzLnNpemUoKSAtIDE7IGkgPj0gdGFyZ2V0SW5kZXg7IGktLSkgewotICAgICAgICAgICAgICAgICAgICBSb3V0ZUluZm8gcm91dGUgPSBwcm92aWRlci5tUm91dGVzLnJlbW92ZShpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSb3V0ZSByZW1vdmVkOiAiICsgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFja0hhbmRsZXIucG9zdChDYWxsYmFja0hhbmRsZXIuTVNHX1JPVVRFX1JFTU9WRUQsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBOb3RpZnkgcHJvdmlkZXIgY2hhbmdlZC4KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUHJvdmlkZXIgY2hhbmdlZDogIiArIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUFJPVklERVJfQ0hBTkdFRCwgcHJvdmlkZXIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgdXBkYXRlUm91dGVEZXNjcmlwdG9yQW5kTm90aWZ5KFJvdXRlSW5mbyByb3V0ZSwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvciByb3V0ZURlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIGludCBjaGFuZ2VzID0gcm91dGUubWF5YmVVcGRhdGVEZXNjcmlwdG9yKHJvdXRlRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBpZiAoY2hhbmdlcyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChjaGFuZ2VzICYgUm91dGVJbmZvLkNIQU5HRV9HRU5FUkFMKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgY2hhbmdlZDogIiArIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9DSEFOR0VELCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoY2hhbmdlcyAmIFJvdXRlSW5mby5DSEFOR0VfVk9MVU1FKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgdm9sdW1lIGNoYW5nZWQ6ICIgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfVk9MVU1FX0NIQU5HRUQsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChjaGFuZ2VzICYgUm91dGVJbmZvLkNIQU5HRV9QUkVTRU5UQVRJT05fRElTUExBWSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHByZXNlbnRhdGlvbiBkaXNwbGF5IGNoYW5nZWQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBNU0dfUk9VVEVfUFJFU0VOVEFUSU9OX0RJU1BMQVlfQ0hBTkdFRCwgcm91dGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBjaGFuZ2VzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBTdHJpbmcgYXNzaWduUm91dGVVbmlxdWVJZChQcm92aWRlckluZm8gcHJvdmlkZXIsIFN0cmluZyByb3V0ZURlc2NyaXB0b3JJZCkgewotICAgICAgICAgICAgLy8gQWx0aG91Z2ggcm91dGUgZGVzY3JpcHRvciBpZHMgYXJlIHVuaXF1ZSB3aXRoaW4gYSBwcm92aWRlciwgaXQncwotICAgICAgICAgICAgLy8gcG9zc2libGUgZm9yIHRoZXJlIHRvIGJlIHR3byBwcm92aWRlcnMgd2l0aCB0aGUgc2FtZSBwYWNrYWdlIG5hbWUuCi0gICAgICAgICAgICAvLyBUaGVyZWZvcmUgd2UgbXVzdCBkZWR1cGUgdGhlIGNvbXBvc2l0ZSBpZC4KLSAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnROYW1lID0gcHJvdmlkZXIuZ2V0Q29tcG9uZW50TmFtZSgpLmZsYXR0ZW5Ub1Nob3J0U3RyaW5nKCk7Ci0gICAgICAgICAgICBTdHJpbmcgdW5pcXVlSWQgPSBjb21wb25lbnROYW1lICsgIjoiICsgcm91dGVEZXNjcmlwdG9ySWQ7Ci0gICAgICAgICAgICBpZiAoZmluZFJvdXRlQnlVbmlxdWVJZCh1bmlxdWVJZCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbVVuaXF1ZUlkTWFwLnB1dChuZXcgUGFpcjw+KGNvbXBvbmVudE5hbWUsIHJvdXRlRGVzY3JpcHRvcklkKSwgdW5pcXVlSWQpOwotICAgICAgICAgICAgICAgIHJldHVybiB1bmlxdWVJZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIExvZy53KFRBRywgIkVpdGhlciAiICsgcm91dGVEZXNjcmlwdG9ySWQgKyAiIGlzbid0IHVuaXF1ZSBpbiAiICsgY29tcG9uZW50TmFtZQotICAgICAgICAgICAgICAgICAgICArICIgb3Igd2UncmUgdHJ5aW5nIHRvIGFzc2lnbiBhIHVuaXF1ZSBJRCBmb3IgYW4gYWxyZWFkeSBhZGRlZCByb3V0ZSIpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDI7IDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld1VuaXF1ZUlkID0gU3RyaW5nLmZvcm1hdChMb2NhbGUuVVMsICIlc18lZCIsIHVuaXF1ZUlkLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmluZFJvdXRlQnlVbmlxdWVJZChuZXdVbmlxdWVJZCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1VbmlxdWVJZE1hcC5wdXQobmV3IFBhaXI8Pihjb21wb25lbnROYW1lLCByb3V0ZURlc2NyaXB0b3JJZCksIG5ld1VuaXF1ZUlkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ld1VuaXF1ZUlkOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgaW50IGZpbmRSb3V0ZUJ5VW5pcXVlSWQoU3RyaW5nIHVuaXF1ZUlkKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtUm91dGVzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtUm91dGVzLmdldChpKS5tVW5pcXVlSWQuZXF1YWxzKHVuaXF1ZUlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIFN0cmluZyBnZXRVbmlxdWVJZChQcm92aWRlckluZm8gcHJvdmlkZXIsIFN0cmluZyByb3V0ZURlc2NyaXB0b3JJZCkgewotICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudE5hbWUgPSBwcm92aWRlci5nZXRDb21wb25lbnROYW1lKCkuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKLSAgICAgICAgICAgIHJldHVybiBtVW5pcXVlSWRNYXAuZ2V0KG5ldyBQYWlyPD4oY29tcG9uZW50TmFtZSwgcm91dGVEZXNjcmlwdG9ySWQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTZWxlY3RlZFJvdXRlSWZOZWVkZWQoYm9vbGVhbiBzZWxlY3RlZFJvdXRlRGVzY3JpcHRvckNoYW5nZWQpIHsKLSAgICAgICAgICAgIC8vIFVwZGF0ZSBkZWZhdWx0IHJvdXRlLgotICAgICAgICAgICAgaWYgKG1EZWZhdWx0Um91dGUgIT0gbnVsbCAmJiAhbURlZmF1bHRSb3V0ZS5pc1NlbGVjdGFibGUoKSkgewotICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkNsZWFyaW5nIHRoZSBkZWZhdWx0IHJvdXRlIGJlY2F1c2UgaXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiaXMgbm8gbG9uZ2VyIHNlbGVjdGFibGU6ICIgKyBtRGVmYXVsdFJvdXRlKTsKLSAgICAgICAgICAgICAgICBtRGVmYXVsdFJvdXRlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRGVmYXVsdFJvdXRlID09IG51bGwgJiYgIW1Sb3V0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gcm91dGUgOiBtUm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1N5c3RlbURlZmF1bHRSb3V0ZShyb3V0ZSkgJiYgcm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1EZWZhdWx0Um91dGUgPSByb3V0ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIkZvdW5kIGRlZmF1bHQgcm91dGU6ICIgKyBtRGVmYXVsdFJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVcGRhdGUgYmx1ZXRvb3RoIHJvdXRlLgotICAgICAgICAgICAgaWYgKG1CbHVldG9vdGhSb3V0ZSAhPSBudWxsICYmICFtQmx1ZXRvb3RoUm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJDbGVhcmluZyB0aGUgYmx1ZXRvb3RoIHJvdXRlIGJlY2F1c2UgaXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgKyAiaXMgbm8gbG9uZ2VyIHNlbGVjdGFibGU6ICIgKyBtQmx1ZXRvb3RoUm91dGUpOwotICAgICAgICAgICAgICAgIG1CbHVldG9vdGhSb3V0ZSA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobUJsdWV0b290aFJvdXRlID09IG51bGwgJiYgIW1Sb3V0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gcm91dGUgOiBtUm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpc1N5c3RlbUxpdmVBdWRpb09ubHlSb3V0ZShyb3V0ZSkgJiYgcm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1CbHVldG9vdGhSb3V0ZSA9IHJvdXRlOwotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmkoVEFHLCAiRm91bmQgYmx1ZXRvb3RoIHJvdXRlOiAiICsgbUJsdWV0b290aFJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBVcGRhdGUgc2VsZWN0ZWQgcm91dGUuCi0gICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGUgPT0gbnVsbCB8fCAhbVNlbGVjdGVkUm91dGUuaXNTZWxlY3RhYmxlKCkpIHsKLSAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJVbnNlbGVjdGluZyB0aGUgY3VycmVudCByb3V0ZSBiZWNhdXNlIGl0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICsgImlzIG5vIGxvbmdlciBzZWxlY3RhYmxlOiAiICsgbVNlbGVjdGVkUm91dGUpOwotICAgICAgICAgICAgICAgIHNldFNlbGVjdGVkUm91dGVJbnRlcm5hbChjaG9vc2VGYWxsYmFja1JvdXRlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGVjdGVkUm91dGVEZXNjcmlwdG9yQ2hhbmdlZCkgewotICAgICAgICAgICAgICAgIC8vIEluIGNhc2UgdGhlIHNlbGVjdGVkIHJvdXRlIGlzIGEgcm91dGUgZ3JvdXAsIHNlbGVjdC91bnNlbGVjdCByb3V0ZSBjb250cm9sbGVycwotICAgICAgICAgICAgICAgIC8vIGZvciB0aGUgYWRkZWQvcmVtb3ZlZCByb3V0ZSBtZW1iZXJzLgotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSBpbnN0YW5jZW9mIFJvdXRlR3JvdXApIHsKLSAgICAgICAgICAgICAgICAgICAgTGlzdDxSb3V0ZUluZm8+IHJvdXRlcyA9ICgoUm91dGVHcm91cCkgbVNlbGVjdGVkUm91dGUpLmdldFJvdXRlcygpOwotICAgICAgICAgICAgICAgICAgICAvLyBCdWlsZCBhIHNldCBvZiBkZXNjcmlwdG9yIElEcyBmb3IgdGhlIG5ldyByb3V0ZSBncm91cC4KLSAgICAgICAgICAgICAgICAgICAgU2V0PFN0cmluZz4gaWRTZXQgPSBuZXcgSGFzaFNldDw+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogcm91dGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZFNldC5hZGQocm91dGUubURlc2NyaXB0b3JJZCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gVW5zZWxlY3Qgcm91dGUgY29udHJvbGxlcnMgZm9yIHRoZSByZW1vdmVkIHJvdXRlcy4KLSAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PFN0cmluZywgUm91dGVDb250cm9sbGVyPj4gaXRlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWFwLkVudHJ5PFN0cmluZywgUm91dGVDb250cm9sbGVyPiBlbnRyeSA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpZFNldC5jb250YWlucyhlbnRyeS5nZXRLZXkoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblVuc2VsZWN0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLnJlbW92ZSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNlbGVjdCByb3V0ZSBjb250cm9sbGVycyBmb3IgdGhlIGFkZGVkIHJvdXRlcy4KLSAgICAgICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gcm91dGUgOiByb3V0ZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghbVJvdXRlQ29udHJvbGxlck1hcC5jb250YWluc0tleShyb3V0ZS5tRGVzY3JpcHRvcklkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlQ29udHJvbGxlciBjb250cm9sbGVyID0gcm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAub25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1EZXNjcmlwdG9ySWQsIG1TZWxlY3RlZFJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25TZWxlY3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVDb250cm9sbGVyTWFwLnB1dChyb3V0ZS5tRGVzY3JpcHRvcklkLCBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBVcGRhdGUgdGhlIHBsYXliYWNrIGluZm8gYmVjYXVzZSB0aGUgcHJvcGVydGllcyBvZiB0aGUgcm91dGUgaGF2ZSBjaGFuZ2VkLgotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrSW5mb0Zyb21TZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBSb3V0ZUluZm8gY2hvb3NlRmFsbGJhY2tSb3V0ZSgpIHsKLSAgICAgICAgICAgIC8vIFdoZW4gdGhlIGN1cnJlbnQgcm91dGUgaXMgcmVtb3ZlZCBvciBubyBsb25nZXIgc2VsZWN0YWJsZSwKLSAgICAgICAgICAgIC8vIHdlIHdhbnQgdG8gcmV2ZXJ0IHRvIGEgbGl2ZSBhdWRpbyByb3V0ZSBpZiB0aGVyZSBpcwotICAgICAgICAgICAgLy8gb25lICh1c3VhbGx5IEJsdWV0b290aCBBMkRQKS4gIEZhaWxpbmcgdGhhdCwgdXNlCi0gICAgICAgICAgICAvLyB0aGUgZGVmYXVsdCByb3V0ZS4KLSAgICAgICAgICAgIGZvciAoUm91dGVJbmZvIHJvdXRlIDogbVJvdXRlcykgewotICAgICAgICAgICAgICAgIGlmIChyb3V0ZSAhPSBtRGVmYXVsdFJvdXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBpc1N5c3RlbUxpdmVBdWRpb09ubHlSb3V0ZShyb3V0ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIHJvdXRlLmlzU2VsZWN0YWJsZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByb3V0ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbURlZmF1bHRSb3V0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBpc1N5c3RlbUxpdmVBdWRpb09ubHlSb3V0ZShSb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIHJldHVybiByb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgPT0gbVN5c3RlbVByb3ZpZGVyCi0gICAgICAgICAgICAgICAgICAgICYmIHJvdXRlLnN1cHBvcnRzQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKQotICAgICAgICAgICAgICAgICAgICAmJiAhcm91dGUuc3VwcG9ydHNDb250cm9sQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIGlzU3lzdGVtRGVmYXVsdFJvdXRlKFJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgcmV0dXJuIHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKSA9PSBtU3lzdGVtUHJvdmlkZXIKLSAgICAgICAgICAgICAgICAgICAgJiYgcm91dGUubURlc2NyaXB0b3JJZC5lcXVhbHMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLkRFRkFVTFRfUk9VVEVfSUQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldFNlbGVjdGVkUm91dGVJbnRlcm5hbChATm9uTnVsbCBSb3V0ZUluZm8gcm91dGUsIGludCB1bnNlbGVjdFJlYXNvbikgewotICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRoZSBmb2xsb3dpbmcgbG9nZ2luZyB3aGVuIG5vIGxvbmdlciBuZWVkZWQuCi0gICAgICAgICAgICBpZiAoc0dsb2JhbCA9PSBudWxsIHx8IChtQmx1ZXRvb3RoUm91dGUgIT0gbnVsbCAmJiByb3V0ZS5pc0RlZmF1bHQoKSkpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBTdGFja1RyYWNlRWxlbWVudFtdIGNhbGxTdGFjayA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCkuZ2V0U3RhY2tUcmFjZSgpOwotICAgICAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIC8vIGNhbGxTdGFja1szXSBpcyB0aGUgY2FsbGVyIG9mIHRoaXMgbWV0aG9kLgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAzOyBpIDwgY2FsbFN0YWNrLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0YWNrVHJhY2VFbGVtZW50IGNhbGxlciA9IGNhbGxTdGFja1tpXTsKLSAgICAgICAgICAgICAgICAgICAgc2IuYXBwZW5kKGNhbGxlci5nZXRDbGFzc05hbWUoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKCIuIikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYXBwZW5kKGNhbGxlci5nZXRNZXRob2ROYW1lKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZCgiOiIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLmFwcGVuZChjYWxsZXIuZ2V0TGluZU51bWJlcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5hcHBlbmQoIiAgIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChzR2xvYmFsID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAic2V0U2VsZWN0ZWRSb3V0ZUludGVybmFsIGlzIGNhbGxlZCB3aGlsZSBzR2xvYmFsIGlzIG51bGw6IHBrZ05hbWU9IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgbUFwcGxpY2F0aW9uQ29udGV4dC5nZXRQYWNrYWdlTmFtZSgpICsgIiwgY2FsbGVycz0iICsgc2IudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLncoVEFHLCAiRGVmYXVsdCByb3V0ZSBpcyBzZWxlY3RlZCB3aGlsZSBhIEJUIHJvdXRlIGlzIGF2YWlsYWJsZTogcGtnTmFtZT0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtQXBwbGljYXRpb25Db250ZXh0LmdldFBhY2thZ2VOYW1lKCkgKyAiLCBjYWxsZXJzPSIgKyBzYi50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSByb3V0ZSkgewotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUm91dGUgdW5zZWxlY3RlZDogIiArIG1TZWxlY3RlZFJvdXRlICsgIiByZWFzb246ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyB1bnNlbGVjdFJlYXNvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfVU5TRUxFQ1RFRCwgbVNlbGVjdGVkUm91dGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zZWxlY3RSZWFzb24pOwotICAgICAgICAgICAgICAgICAgICBpZiAobVNlbGVjdGVkUm91dGVDb250cm9sbGVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblVuc2VsZWN0KHVuc2VsZWN0UmVhc29uKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlci5vblJlbGVhc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCFtUm91dGVDb250cm9sbGVyTWFwLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChSb3V0ZUNvbnRyb2xsZXIgY29udHJvbGxlciA6IG1Sb3V0ZUNvbnRyb2xsZXJNYXAudmFsdWVzKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sbGVyLm9uVW5zZWxlY3QodW5zZWxlY3RSZWFzb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIub25SZWxlYXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUm91dGVDb250cm9sbGVyTWFwLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZSA9IHJvdXRlOwotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlQ29udHJvbGxlciA9IHJvdXRlLmdldFByb3ZpZGVySW5zdGFuY2UoKS5vbkNyZWF0ZVJvdXRlQ29udHJvbGxlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZUNvbnRyb2xsZXIub25TZWxlY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIlJvdXRlIHNlbGVjdGVkOiAiICsgbVNlbGVjdGVkUm91dGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QoQ2FsbGJhY2tIYW5kbGVyLk1TR19ST1VURV9TRUxFQ1RFRCwgbVNlbGVjdGVkUm91dGUpOwotCi0gICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlIGluc3RhbmNlb2YgUm91dGVHcm91cCkgewotICAgICAgICAgICAgICAgICAgICBMaXN0PFJvdXRlSW5mbz4gcm91dGVzID0gKChSb3V0ZUdyb3VwKSBtU2VsZWN0ZWRSb3V0ZSkuZ2V0Um91dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZUNvbnRyb2xsZXJNYXAuY2xlYXIoKTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChSb3V0ZUluZm8gciA6IHJvdXRlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgUm91dGVDb250cm9sbGVyIGNvbnRyb2xsZXIgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLmdldFByb3ZpZGVySW5zdGFuY2UoKS5vbkNyZWF0ZVJvdXRlQ29udHJvbGxlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByLm1EZXNjcmlwdG9ySWQsIG1TZWxlY3RlZFJvdXRlLm1EZXNjcmlwdG9ySWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5vblNlbGVjdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlQ29udHJvbGxlck1hcC5wdXQoci5tRGVzY3JpcHRvcklkLCBjb250cm9sbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrSW5mb0Zyb21TZWxlY3RlZFJvdXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TeXN0ZW1Sb3V0ZVNlbGVjdGVkQnlEZXNjcmlwdG9ySWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICAvLyBTeXN0ZW0gcm91dGUgaXMgc2VsZWN0ZWQsIGRvIG5vdCBzeW5jIHRoZSByb3V0ZSB3ZSBzZWxlY3RlZCBiZWZvcmUuCi0gICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnJlbW92ZU1lc3NhZ2VzKENhbGxiYWNrSGFuZGxlci5NU0dfUk9VVEVfU0VMRUNURUQpOwotICAgICAgICAgICAgaW50IHByb3ZpZGVySW5kZXggPSBmaW5kUHJvdmlkZXJJbmZvKG1TeXN0ZW1Qcm92aWRlcik7Ci0gICAgICAgICAgICBpZiAocHJvdmlkZXJJbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgUHJvdmlkZXJJbmZvIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQocHJvdmlkZXJJbmRleCk7Ci0gICAgICAgICAgICAgICAgaW50IHJvdXRlSW5kZXggPSBwcm92aWRlci5maW5kUm91dGVCeURlc2NyaXB0b3JJZChpZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHJvdXRlSW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5tUm91dGVzLmdldChyb3V0ZUluZGV4KS5zZWxlY3QoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhZGRSZW1vdGVDb250cm9sQ2xpZW50KE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKHJjYyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZCByZWNvcmQgPSBuZXcgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZChyY2MpOwotICAgICAgICAgICAgICAgIG1SZW1vdGVDb250cm9sQ2xpZW50cy5hZGQocmVjb3JkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZVJlbW90ZUNvbnRyb2xDbGllbnQoT2JqZWN0IHJjYykgewotICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQocmNjKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgUmVtb3RlQ29udHJvbENsaWVudFJlY29yZCByZWNvcmQgPSBtUmVtb3RlQ29udHJvbENsaWVudHMucmVtb3ZlKGluZGV4KTsKLSAgICAgICAgICAgICAgICByZWNvcmQuZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uKE9iamVjdCBzZXNzaW9uKSB7Ci0gICAgICAgICAgICBzZXRNZWRpYVNlc3Npb25SZWNvcmQoc2Vzc2lvbiAhPSBudWxsID8gbmV3IE1lZGlhU2Vzc2lvblJlY29yZChzZXNzaW9uKSA6IG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0TWVkaWFTZXNzaW9uQ29tcGF0KGZpbmFsIE1lZGlhU2Vzc2lvbkNvbXBhdCBzZXNzaW9uKSB7Ci0gICAgICAgICAgICBtQ29tcGF0U2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgICAgICAgICBpZiAoYW5kcm9pZC5vcy5CdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMjEpIHsKLSAgICAgICAgICAgICAgICBzZXRNZWRpYVNlc3Npb25SZWNvcmQoc2Vzc2lvbiAhPSBudWxsID8gbmV3IE1lZGlhU2Vzc2lvblJlY29yZChzZXNzaW9uKSA6IG51bGwpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhbmRyb2lkLm9zLkJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAxNCkgewotICAgICAgICAgICAgICAgIGlmIChtUmNjTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlUmVtb3RlQ29udHJvbENsaWVudChtUmNjTWVkaWFTZXNzaW9uLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIG1SY2NNZWRpYVNlc3Npb24ucmVtb3ZlT25BY3RpdmVDaGFuZ2VMaXN0ZW5lcihtU2Vzc2lvbkFjdGl2ZUxpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVJjY01lZGlhU2Vzc2lvbiA9IHNlc3Npb247Ci0gICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBzZXNzaW9uLmFkZE9uQWN0aXZlQ2hhbmdlTGlzdGVuZXIobVNlc3Npb25BY3RpdmVMaXN0ZW5lcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uLmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFkZFJlbW90ZUNvbnRyb2xDbGllbnQoc2Vzc2lvbi5nZXRSZW1vdGVDb250cm9sQ2xpZW50KCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHNldE1lZGlhU2Vzc2lvblJlY29yZChNZWRpYVNlc3Npb25SZWNvcmQgbWVkaWFTZXNzaW9uUmVjb3JkKSB7Ci0gICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5jbGVhclZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtTWVkaWFTZXNzaW9uID0gbWVkaWFTZXNzaW9uUmVjb3JkOwotICAgICAgICAgICAgaWYgKG1lZGlhU2Vzc2lvblJlY29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tJbmZvRnJvbVNlbGVjdGVkUm91dGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25Db21wYXQuVG9rZW4gZ2V0TWVkaWFTZXNzaW9uVG9rZW4oKSB7Ci0gICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1NZWRpYVNlc3Npb24uZ2V0VG9rZW4oKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobUNvbXBhdFNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybiBtQ29tcGF0U2Vzc2lvbi5nZXRTZXNzaW9uVG9rZW4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgZmluZFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQoT2JqZWN0IHJjYykgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQgcmVjb3JkID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLmdldChpKTsKLSAgICAgICAgICAgICAgICBpZiAocmVjb3JkLmdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSA9PSByY2MpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZVBsYXliYWNrSW5mb0Zyb21TZWxlY3RlZFJvdXRlKCkgewotICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvLnZvbHVtZSA9IG1TZWxlY3RlZFJvdXRlLmdldFZvbHVtZSgpOwotICAgICAgICAgICAgICAgIG1QbGF5YmFja0luZm8udm9sdW1lTWF4ID0gbVNlbGVjdGVkUm91dGUuZ2V0Vm9sdW1lTWF4KCk7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby52b2x1bWVIYW5kbGluZyA9IG1TZWxlY3RlZFJvdXRlLmdldFZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby5wbGF5YmFja1N0cmVhbSA9IG1TZWxlY3RlZFJvdXRlLmdldFBsYXliYWNrU3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgbVBsYXliYWNrSW5mby5wbGF5YmFja1R5cGUgPSBtU2VsZWN0ZWRSb3V0ZS5nZXRQbGF5YmFja1R5cGUoKTsKLQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1SZW1vdGVDb250cm9sQ2xpZW50cy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFJlbW90ZUNvbnRyb2xDbGllbnRSZWNvcmQgcmVjb3JkID0gbVJlbW90ZUNvbnRyb2xDbGllbnRzLmdldChpKTsKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLnVwZGF0ZVBsYXliYWNrSW5mbygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhU2Vzc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSA9PSBnZXREZWZhdWx0Um91dGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1TZWxlY3RlZFJvdXRlID09IGdldEJsdWV0b290aFJvdXRlKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIExvY2FsIHJvdXRlCi0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFTZXNzaW9uLmNsZWFyVm9sdW1lSGFuZGxpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEBWb2x1bWVQcm92aWRlckNvbXBhdC5Db250cm9sVHlwZSBpbnQgY29udHJvbFR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVQcm92aWRlckNvbXBhdC5WT0xVTUVfQ09OVFJPTF9GSVhFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tJbmZvLnZvbHVtZUhhbmRsaW5nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfVkFSSUFCTEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250cm9sVHlwZSA9IFZvbHVtZVByb3ZpZGVyQ29tcGF0LlZPTFVNRV9DT05UUk9MX0FCU09MVVRFOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5jb25maWd1cmVWb2x1bWUoY29udHJvbFR5cGUsIG1QbGF5YmFja0luZm8udm9sdW1lTWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2tJbmZvLnZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5jbGVhclZvbHVtZUhhbmRsaW5nKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBQcm92aWRlckNhbGxiYWNrIGV4dGVuZHMgTWVkaWFSb3V0ZVByb3ZpZGVyLkNhbGxiYWNrIHsKLSAgICAgICAgICAgIFByb3ZpZGVyQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25EZXNjcmlwdG9yQ2hhbmdlZChNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICAgICAgICAgIHVwZGF0ZVByb3ZpZGVyRGVzY3JpcHRvcihwcm92aWRlciwgZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGZpbmFsIGNsYXNzIE1lZGlhU2Vzc2lvblJlY29yZCB7Ci0gICAgICAgICAgICBwcml2YXRlIGZpbmFsIE1lZGlhU2Vzc2lvbkNvbXBhdCBtTXNDb21wYXQ7Ci0KLSAgICAgICAgICAgIHByaXZhdGUgQFZvbHVtZVByb3ZpZGVyQ29tcGF0LkNvbnRyb2xUeXBlIGludCBtQ29udHJvbFR5cGU7Ci0gICAgICAgICAgICBwcml2YXRlIGludCBtTWF4Vm9sdW1lOwotICAgICAgICAgICAgcHJpdmF0ZSBWb2x1bWVQcm92aWRlckNvbXBhdCBtVnBDb21wYXQ7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25SZWNvcmQoT2JqZWN0IG1lZGlhU2Vzc2lvbikgewotICAgICAgICAgICAgICAgIG1Nc0NvbXBhdCA9IE1lZGlhU2Vzc2lvbkNvbXBhdC5mcm9tTWVkaWFTZXNzaW9uKG1BcHBsaWNhdGlvbkNvbnRleHQsIG1lZGlhU2Vzc2lvbik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBNZWRpYVNlc3Npb25SZWNvcmQoTWVkaWFTZXNzaW9uQ29tcGF0IG1lZGlhU2Vzc2lvbkNvbXBhdCkgewotICAgICAgICAgICAgICAgIG1Nc0NvbXBhdCA9IG1lZGlhU2Vzc2lvbkNvbXBhdDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgY29uZmlndXJlVm9sdW1lKEBWb2x1bWVQcm92aWRlckNvbXBhdC5Db250cm9sVHlwZSBpbnQgY29udHJvbFR5cGUsCi0gICAgICAgICAgICAgICAgICAgIGludCBtYXgsIGludCBjdXJyZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1WcENvbXBhdCAhPSBudWxsICYmIGNvbnRyb2xUeXBlID09IG1Db250cm9sVHlwZSAmJiBtYXggPT0gbU1heFZvbHVtZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IGNoYW5nZWQgY29udHJvbCB0eXBlIG9yIG1heCBqdXN0IHNldCB0aGUKLSAgICAgICAgICAgICAgICAgICAgLy8gbmV3IGN1cnJlbnQgdm9sdW1lCi0gICAgICAgICAgICAgICAgICAgIG1WcENvbXBhdC5zZXRDdXJyZW50Vm9sdW1lKGN1cnJlbnQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSBjcmVhdGUgYSBuZXcgcHJvdmlkZXIgYW5kIHVwZGF0ZQotICAgICAgICAgICAgICAgICAgICBtVnBDb21wYXQgPSBuZXcgVm9sdW1lUHJvdmlkZXJDb21wYXQoY29udHJvbFR5cGUsIG1heCwgY3VycmVudCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblNldFZvbHVtZVRvKGZpbmFsIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2FsbGJhY2tIYW5kbGVyLnBvc3QobmV3IFJ1bm5hYmxlKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1TZWxlY3RlZFJvdXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZS5yZXF1ZXN0U2V0Vm9sdW1lKHZvbHVtZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkFkanVzdFZvbHVtZShmaW5hbCBpbnQgZGlyZWN0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbGxiYWNrSGFuZGxlci5wb3N0KG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkUm91dGUucmVxdWVzdFVwZGF0ZVZvbHVtZShkaXJlY3Rpb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH07Ci0gICAgICAgICAgICAgICAgICAgIG1Nc0NvbXBhdC5zZXRQbGF5YmFja1RvUmVtb3RlKG1WcENvbXBhdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBjbGVhclZvbHVtZUhhbmRsaW5nKCkgewotICAgICAgICAgICAgICAgIG1Nc0NvbXBhdC5zZXRQbGF5YmFja1RvTG9jYWwobVBsYXliYWNrSW5mby5wbGF5YmFja1N0cmVhbSk7Ci0gICAgICAgICAgICAgICAgbVZwQ29tcGF0ID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvbkNvbXBhdC5Ub2tlbiBnZXRUb2tlbigpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbU1zQ29tcGF0LmdldFNlc3Npb25Ub2tlbigpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkCi0gICAgICAgICAgICAgICAgaW1wbGVtZW50cyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LlZvbHVtZUNhbGxiYWNrIHsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCBtUmNjQ29tcGF0OwotICAgICAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1EaXNjb25uZWN0ZWQ7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBSZW1vdGVDb250cm9sQ2xpZW50UmVjb3JkKE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgICAgICBtUmNjQ29tcGF0ID0gUmVtb3RlQ29udHJvbENsaWVudENvbXBhdC5vYnRhaW4obUFwcGxpY2F0aW9uQ29udGV4dCwgcmNjKTsKLSAgICAgICAgICAgICAgICBtUmNjQ29tcGF0LnNldFZvbHVtZUNhbGxiYWNrKHRoaXMpOwotICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrSW5mbygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgT2JqZWN0IGdldFJlbW90ZUNvbnRyb2xDbGllbnQoKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1SY2NDb21wYXQuZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBkaXNjb25uZWN0KCkgewotICAgICAgICAgICAgICAgIG1EaXNjb25uZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1SY2NDb21wYXQuc2V0Vm9sdW1lQ2FsbGJhY2sobnVsbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVBsYXliYWNrSW5mbygpIHsKLSAgICAgICAgICAgICAgICBtUmNjQ29tcGF0LnNldFBsYXliYWNrSW5mbyhtUGxheWJhY2tJbmZvKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoaW50IHZvbHVtZSkgewotICAgICAgICAgICAgICAgIGlmICghbURpc2Nvbm5lY3RlZCAmJiBtU2VsZWN0ZWRSb3V0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFJvdXRlLnJlcXVlc3RTZXRWb2x1bWUodm9sdW1lKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1EaXNjb25uZWN0ZWQgJiYgbVNlbGVjdGVkUm91dGUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRSb3V0ZS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDYWxsYmFja0hhbmRsZXIgZXh0ZW5kcyBIYW5kbGVyIHsKLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgQXJyYXlMaXN0PENhbGxiYWNrUmVjb3JkPiBtVGVtcENhbGxiYWNrUmVjb3JkcyA9Ci0gICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8Q2FsbGJhY2tSZWNvcmQ+KCk7Ci0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNU0dfVFlQRV9NQVNLID0gMHhmZjAwOwotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UWVBFX1JPVVRFID0gMHgwMTAwOwotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1TR19UWVBFX1BST1ZJREVSID0gMHgwMjAwOwotCi0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfQURERUQgPSBNU0dfVFlQRV9ST1VURSB8IDE7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfUkVNT1ZFRCA9IE1TR19UWVBFX1JPVVRFIHwgMjsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IE1TR19ST1VURV9DSEFOR0VEID0gTVNHX1RZUEVfUk9VVEUgfCAzOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1ZPTFVNRV9DSEFOR0VEID0gTVNHX1RZUEVfUk9VVEUgfCA0OwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1JPVVRFX1BSRVNFTlRBVElPTl9ESVNQTEFZX0NIQU5HRUQgPSBNU0dfVFlQRV9ST1VURSB8IDU7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfU0VMRUNURUQgPSBNU0dfVFlQRV9ST1VURSB8IDY7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUk9VVEVfVU5TRUxFQ1RFRCA9IE1TR19UWVBFX1JPVVRFIHwgNzsKLQotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BST1ZJREVSX0FEREVEID0gTVNHX1RZUEVfUFJPVklERVIgfCAxOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTVNHX1BST1ZJREVSX1JFTU9WRUQgPSBNU0dfVFlQRV9QUk9WSURFUiB8IDI7Ci0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBNU0dfUFJPVklERVJfQ0hBTkdFRCA9IE1TR19UWVBFX1BST1ZJREVSIHwgMzsKLQotICAgICAgICAgICAgQ2FsbGJhY2tIYW5kbGVyKCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBwb3N0KGludCBtc2csIE9iamVjdCBvYmopIHsKLSAgICAgICAgICAgICAgICBvYnRhaW5NZXNzYWdlKG1zZywgb2JqKS5zZW5kVG9UYXJnZXQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgcG9zdChpbnQgbXNnLCBPYmplY3Qgb2JqLCBpbnQgYXJnKSB7Ci0gICAgICAgICAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gb2J0YWluTWVzc2FnZShtc2csIG9iaik7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZS5hcmcxID0gYXJnOwotICAgICAgICAgICAgICAgIG1lc3NhZ2Uuc2VuZFRvVGFyZ2V0KCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgaGFuZGxlTWVzc2FnZShNZXNzYWdlIG1zZykgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aGF0ID0gbXNnLndoYXQ7Ci0gICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IG9iaiA9IG1zZy5vYmo7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGFyZyA9IG1zZy5hcmcxOwotCi0gICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTVNHX1JPVVRFX0NIQU5HRUQKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIGdldFNlbGVjdGVkUm91dGUoKS5nZXRJZCgpLmVxdWFscygoKFJvdXRlSW5mbykgb2JqKS5nZXRJZCgpKSkgewotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTZWxlY3RlZFJvdXRlSWZOZWVkZWQodHJ1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gU3luY2hyb25pemUgc3RhdGUgd2l0aCB0aGUgc3lzdGVtIG1lZGlhIHJvdXRlci4KLSAgICAgICAgICAgICAgICBzeW5jV2l0aFN5c3RlbVByb3ZpZGVyKHdoYXQsIG9iaik7Ci0KLSAgICAgICAgICAgICAgICAvLyBJbnZva2UgYWxsIHJlZ2lzdGVyZWQgY2FsbGJhY2tzLgotICAgICAgICAgICAgICAgIC8vIEJ1aWxkIGEgbGlzdCBvZiBjYWxsYmFja3MgYmVmb3JlIGludm9raW5nIHRoZW0gaW4gY2FzZSBjYWxsYmFja3MKLSAgICAgICAgICAgICAgICAvLyBhcmUgYWRkZWQgb3IgcmVtb3ZlZCBkdXJpbmcgZGlzcGF0Y2guCi0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IG1Sb3V0ZXJzLnNpemUoKTsgLS1pID49IDA7ICkgewotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXIgcm91dGVyID0gbVJvdXRlcnMuZ2V0KGkpLmdldCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJvdXRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJvdXRlcnMucmVtb3ZlKGkpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVGVtcENhbGxiYWNrUmVjb3Jkcy5hZGRBbGwocm91dGVyLm1DYWxsYmFja1JlY29yZHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGNhbGxiYWNrQ291bnQgPSBtVGVtcENhbGxiYWNrUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FsbGJhY2tDb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnZva2VDYWxsYmFjayhtVGVtcENhbGxiYWNrUmVjb3Jkcy5nZXQoaSksIHdoYXQsIG9iaiwgYXJnKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UZW1wQ2FsbGJhY2tSZWNvcmRzLmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgc3luY1dpdGhTeXN0ZW1Qcm92aWRlcihpbnQgd2hhdCwgT2JqZWN0IG9iaikgewotICAgICAgICAgICAgICAgIHN3aXRjaCAod2hhdCkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9BRERFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlci5vblN5bmNSb3V0ZUFkZGVkKChSb3V0ZUluZm8pIG9iaik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfUkVNT1ZFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TeXN0ZW1Qcm92aWRlci5vblN5bmNSb3V0ZVJlbW92ZWQoKFJvdXRlSW5mbykgb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVByb3ZpZGVyLm9uU3luY1JvdXRlQ2hhbmdlZCgoUm91dGVJbmZvKSBvYmopOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1NFTEVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVByb3ZpZGVyLm9uU3luY1JvdXRlU2VsZWN0ZWQoKFJvdXRlSW5mbykgb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIGludm9rZUNhbGxiYWNrKENhbGxiYWNrUmVjb3JkIHJlY29yZCwgaW50IHdoYXQsIE9iamVjdCBvYmosIGludCBhcmcpIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlciByb3V0ZXIgPSByZWNvcmQubVJvdXRlcjsKLSAgICAgICAgICAgICAgICBmaW5hbCBNZWRpYVJvdXRlci5DYWxsYmFjayBjYWxsYmFjayA9IHJlY29yZC5tQ2FsbGJhY2s7Ci0gICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0ICYgTVNHX1RZUEVfTUFTSykgewotICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19UWVBFX1JPVVRFOiB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBSb3V0ZUluZm8gcm91dGUgPSAoUm91dGVJbmZvKW9iajsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcmVjb3JkLmZpbHRlclJvdXRlRXZlbnQocm91dGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKHdoYXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9BRERFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZUFkZGVkKHJvdXRlciwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9SRU1PVkVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlUmVtb3ZlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZUNoYW5nZWQocm91dGVyLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1JPVVRFX1ZPTFVNRV9DSEFOR0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlVm9sdW1lQ2hhbmdlZChyb3V0ZXIsIHJvdXRlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUk9VVEVfUFJFU0VOVEFUSU9OX0RJU1BMQVlfQ0hBTkdFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVByZXNlbnRhdGlvbkRpc3BsYXlDaGFuZ2VkKHJvdXRlciwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9TRUxFQ1RFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Sb3V0ZVNlbGVjdGVkKHJvdXRlciwgcm91dGUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIE1TR19ST1VURV9VTlNFTEVDVEVEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJvdXRlVW5zZWxlY3RlZChyb3V0ZXIsIHJvdXRlLCBhcmcpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1RZUEVfUFJPVklERVI6IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFByb3ZpZGVySW5mbyBwcm92aWRlciA9IChQcm92aWRlckluZm8pb2JqOwotICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUFJPVklERVJfQURERUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUHJvdmlkZXJBZGRlZChyb3V0ZXIsIHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNU0dfUFJPVklERVJfUkVNT1ZFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sub25Qcm92aWRlclJlbW92ZWQocm91dGVyLCBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTVNHX1BST1ZJREVSX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUHJvdmlkZXJDaGFuZ2VkKHJvdXRlciwgcHJvdmlkZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVNlc3Npb25TdGF0dXMuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9NZWRpYVNlc3Npb25TdGF0dXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIwNjU5Ni4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3N1cHBvcnQvbWVkaWFyb3V0ZXIvbWVkaWEvTWVkaWFTZXNzaW9uU3RhdHVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5hcHAuUGVuZGluZ0ludGVudDsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlN5c3RlbUNsb2NrOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLlRpbWVVdGlsczsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIHBsYXliYWNrIHN0YXR1cyBvZiBhIG1lZGlhIHNlc3Npb24uCi0gKiA8cD4KLSAqIFRoaXMgY2xhc3MgaXMgcGFydCBvZiB0aGUgcmVtb3RlIHBsYXliYWNrIHByb3RvY29sIGRlc2NyaWJlZCBieSB0aGUKLSAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQgTWVkaWFDb250cm9sSW50ZW50fSBjbGFzcy4KLSAqIDwvcD48cD4KLSAqIFdoZW4gYSBtZWRpYSBzZXNzaW9uIGlzIGNyZWF0ZWQsIGl0IGlzIGluaXRpYWxseSBpbiB0aGUKLSAqIHtAbGluayAjU0VTU0lPTl9TVEFURV9BQ1RJVkUgYWN0aXZlfSBzdGF0ZS4gIFdoZW4gdGhlIG1lZGlhIHNlc3Npb24gZW5kcwotICogbm9ybWFsbHksIGl0IHRyYW5zaXRpb25zIHRvIHRoZSB7QGxpbmsgI1NFU1NJT05fU1RBVEVfRU5ERUQgZW5kZWR9IHN0YXRlLgotICogSWYgdGhlIG1lZGlhIHNlc3Npb24gaXMgaW52YWxpZGF0ZWQgZHVlIHRvIGFub3RoZXIgc2Vzc2lvbiBmb3JjaWJseSB0YWtpbmcKLSAqIGNvbnRyb2wgb2YgdGhlIHJvdXRlLCB0aGVuIGl0IHRyYW5zaXRpb25zIHRvIHRoZQotICoge0BsaW5rICNTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEIGludmFsaWRhdGVkfSBzdGF0ZS4KLSAqIFJlZmVyIHRvIHRoZSBkb2N1bWVudGF0aW9uIG9mIGVhY2ggc3RhdGUgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIGl0cyBtZWFuaW5nLgotICogPC9wPjxwPgotICogVG8gbW9uaXRvciBzZXNzaW9uIHN0YXR1cywgdGhlIGFwcGxpY2F0aW9uIHNob3VsZCBzdXBwbHkgYSB7QGxpbmsgUGVuZGluZ0ludGVudH0gdG8gdXNlIGFzIHRoZQotICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9TRVNTSU9OX1NUQVRVU19VUERBVEVfUkVDRUlWRVIgc2Vzc2lvbiBzdGF0dXMgdXBkYXRlIHJlY2VpdmVyfQotICogZm9yIGEgZ2l2ZW4ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTiBzZXNzaW9uIHN0YXJ0IHJlcXVlc3R9LgotICogPC9wPjxwPgotICogVGhpcyBvYmplY3QgaXMgaW1tdXRhYmxlIG9uY2UgY3JlYXRlZCB1c2luZyBhIHtAbGluayBCdWlsZGVyfSBpbnN0YW5jZS4KLSAqIDwvcD4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lZGlhU2Vzc2lvblN0YXR1cyB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVElNRVNUQU1QID0gInRpbWVzdGFtcCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VTU0lPTl9TVEFURSA9ICJzZXNzaW9uU3RhdGUiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1FVRVVFX1BBVVNFRCA9ICJxdWV1ZVBhdXNlZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfRVhUUkFTID0gImV4dHJhcyI7Ci0KLSAgICBmaW5hbCBCdW5kbGUgbUJ1bmRsZTsKLQotICAgIC8qKgotICAgICAqIFNlc3Npb24gc3RhdGU6IEFjdGl2ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgc2Vzc2lvbiBpcyBhY3RpdmUgYW5kIGluIGNvbnRyb2wgb2YgdGhlIHJvdXRlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OX1NUQVRFX0FDVElWRSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBTZXNzaW9uIHN0YXRlOiBFbmRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZXMgdGhhdCB0aGUgbWVkaWEgc2Vzc2lvbiB3YXMgZW5kZWQgbm9ybWFsbHkgdXNpbmcgdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT04gZW5kIHNlc3Npb259IGFjdGlvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogQSB0ZXJtaW5hdGVkIG1lZGlhIHNlc3Npb24gY2Fubm90IGJlIHVzZWQgYW55bW9yZS4gIFRvIHBsYXkgbW9yZSBtZWRpYSwgdGhlCi0gICAgICogYXBwbGljYXRpb24gbXVzdCBzdGFydCBhIG5ldyBzZXNzaW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OX1NUQVRFX0VOREVEID0gMTsKLQotICAgIC8qKgotICAgICAqIFNlc3Npb24gc3RhdGU6IEludmFsaWRhdGVkLgotICAgICAqIDxwPgotICAgICAqIEluZGljYXRlcyB0aGF0IHRoZSBtZWRpYSBzZXNzaW9uIHdhcyBpbnZhbGlkYXRlZCBpbnZvbHVudGFyaWx5IGR1ZSB0bwotICAgICAqIGFub3RoZXIgc2Vzc2lvbiB0YWtpbmcgY29udHJvbCBvZiB0aGUgcm91dGUuCi0gICAgICogPC9wPjxwPgotICAgICAqIEFuIGludmFsaWRhdGVkIG1lZGlhIHNlc3Npb24gY2Fubm90IGJlIHVzZWQgYW55bW9yZS4gIFRvIHBsYXkgbW9yZSBtZWRpYSwgdGhlCi0gICAgICogYXBwbGljYXRpb24gbXVzdCBzdGFydCBhIG5ldyBzZXNzaW9uLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRVNTSU9OX1NUQVRFX0lOVkFMSURBVEVEID0gMjsKLQotICAgIE1lZGlhU2Vzc2lvblN0YXR1cyhCdW5kbGUgYnVuZGxlKSB7Ci0gICAgICAgIG1CdW5kbGUgPSBidW5kbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdGltZXN0YW1wIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3RhdHVzIGluZm9ybWF0aW9uIGluCi0gICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVGhlIHN0YXR1cyB0aW1lc3RhbXAgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWUoKX0gdGltZSBiYXNlLgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGdldFRpbWVzdGFtcCgpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0TG9uZyhLRVlfVElNRVNUQU1QKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBzZXNzaW9uIHN0YXRlLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgc2Vzc2lvbiBzdGF0ZS4gIE9uZSBvZiB7QGxpbmsgI1NFU1NJT05fU1RBVEVfQUNUSVZFfSwKLSAgICAgKiB7QGxpbmsgI1NFU1NJT05fU1RBVEVfRU5ERUR9LCBvciB7QGxpbmsgI1NFU1NJT05fU1RBVEVfSU5WQUxJREFURUR9LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U2Vzc2lvblN0YXRlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRJbnQoS0VZX1NFU1NJT05fU1RBVEUsIFNFU1NJT05fU1RBVEVfSU5WQUxJREFURUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2Vzc2lvbidzIHF1ZXVlIGlzIHBhdXNlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiB0aGUgc2Vzc2lvbidzIHF1ZXVlIGlzIHBhdXNlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1F1ZXVlUGF1c2VkKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZS5nZXRCb29sZWFuKEtFWV9RVUVVRV9QQVVTRUQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBidW5kbGUgb2YgZXh0cmFzIGZvciB0aGlzIHN0YXR1cyBvYmplY3QuCi0gICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAotICAgICAqIGJ5IGFwcGxpY2F0aW9ucy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGdldEV4dHJhcygpIHsKLSAgICAgICAgcmV0dXJuIG1CdW5kbGUuZ2V0QnVuZGxlKEtFWV9FWFRSQVMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiTWVkaWFTZXNzaW9uU3RhdHVzeyAiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgidGltZXN0YW1wPSIpOwotICAgICAgICBUaW1lVXRpbHMuZm9ybWF0RHVyYXRpb24oU3lzdGVtQ2xvY2suZWxhcHNlZFJlYWx0aW1lKCkgLSBnZXRUaW1lc3RhbXAoKSwgcmVzdWx0KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIG1zIGFnbyIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKCIsIHNlc3Npb25TdGF0ZT0iKS5hcHBlbmQoc2Vzc2lvblN0YXRlVG9TdHJpbmcoZ2V0U2Vzc2lvblN0YXRlKCkpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBxdWV1ZVBhdXNlZD0iKS5hcHBlbmQoaXNRdWV1ZVBhdXNlZCgpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCBleHRyYXM9IikuYXBwZW5kKGdldEV4dHJhcygpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiIH0iKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzZXNzaW9uU3RhdGVUb1N0cmluZyhpbnQgc2Vzc2lvblN0YXRlKSB7Ci0gICAgICAgIHN3aXRjaCAoc2Vzc2lvblN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNFU1NJT05fU1RBVEVfQUNUSVZFOgotICAgICAgICAgICAgICAgIHJldHVybiAiYWN0aXZlIjsKLSAgICAgICAgICAgIGNhc2UgU0VTU0lPTl9TVEFURV9FTkRFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImVuZGVkIjsKLSAgICAgICAgICAgIGNhc2UgU0VTU0lPTl9TVEFURV9JTlZBTElEQVRFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gImludmFsaWRhdGVkIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyhzZXNzaW9uU3RhdGUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIHRoaXMgb2JqZWN0IHRvIGEgYnVuZGxlIGZvciBzZXJpYWxpemF0aW9uLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udGVudHMgb2YgdGhlIG9iamVjdCByZXByZXNlbnRlZCBhcyBhIGJ1bmRsZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVuZGxlIGFzQnVuZGxlKCkgewotICAgICAgICByZXR1cm4gbUJ1bmRsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIGluc3RhbmNlIGZyb20gYSBidW5kbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnVuZGxlIFRoZSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBuZXcgaW5zdGFuY2UsIG9yIG51bGwgaWYgdGhlIGJ1bmRsZSB3YXMgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIE1lZGlhU2Vzc2lvblN0YXR1cyBmcm9tQnVuZGxlKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgcmV0dXJuIGJ1bmRsZSAhPSBudWxsID8gbmV3IE1lZGlhU2Vzc2lvblN0YXR1cyhidW5kbGUpIDogbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgTWVkaWFTZXNzaW9uU3RhdHVzIG1lZGlhIHNlc3Npb24gc3RhdHVzIG9iamVjdHN9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgQnVuZGxlIG1CdW5kbGU7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBzZXNzaW9uIHN0YXR1cyBidWlsZGVyIHVzaW5nIHRoZSBjdXJyZW50IHRpbWUgYXMgdGhlCi0gICAgICAgICAqIHJlZmVyZW5jZSB0aW1lc3RhbXAuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdGUgVGhlIHNlc3Npb24gc3RhdGUuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlcihpbnQgc2Vzc2lvblN0YXRlKSB7Ci0gICAgICAgICAgICBtQnVuZGxlID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgc2V0VGltZXN0YW1wKFN5c3RlbUNsb2NrLmVsYXBzZWRSZWFsdGltZSgpKTsKLSAgICAgICAgICAgIHNldFNlc3Npb25TdGF0ZShzZXNzaW9uU3RhdGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENyZWF0ZXMgYSBtZWRpYSBzZXNzaW9uIHN0YXR1cyBidWlsZGVyIHdob3NlIGluaXRpYWwgY29udGVudHMgYXJlCi0gICAgICAgICAqIGNvcGllZCBmcm9tIGFuIGV4aXN0aW5nIHN0YXR1cy4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyKE1lZGlhU2Vzc2lvblN0YXR1cyBzdGF0dXMpIHsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInN0YXR1cyBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1CdW5kbGUgPSBuZXcgQnVuZGxlKHN0YXR1cy5tQnVuZGxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSB0aW1lc3RhbXAgYXNzb2NpYXRlZCB3aXRoIHRoZSBzdGF0dXMgaW5mb3JtYXRpb24gaW4KLSAgICAgICAgICogbWlsbGlzZWNvbmRzIHNpbmNlIGJvb3QgaW4gdGhlIHtAbGluayBTeXN0ZW1DbG9jayNlbGFwc2VkUmVhbHRpbWV9IHRpbWUgYmFzZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFRpbWVzdGFtcChsb25nIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCkgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRMb25nKEtFWV9USU1FU1RBTVAsIGVsYXBzZWRSZWFsdGltZVRpbWVzdGFtcCk7Ci0gICAgICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBTZXRzIHRoZSBzZXNzaW9uIHN0YXRlLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIEJ1aWxkZXIgc2V0U2Vzc2lvblN0YXRlKGludCBzZXNzaW9uU3RhdGUpIHsKLSAgICAgICAgICAgIG1CdW5kbGUucHV0SW50KEtFWV9TRVNTSU9OX1NUQVRFLCBzZXNzaW9uU3RhdGUpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyB3aGV0aGVyIHRoZSBxdWV1ZSBpcyBwYXVzZWQuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRRdWV1ZVBhdXNlZChib29sZWFuIHF1ZXVlUGF1c2VkKSB7Ci0gICAgICAgICAgICBtQnVuZGxlLnB1dEJvb2xlYW4oS0VZX1FVRVVFX1BBVVNFRCwgcXVldWVQYXVzZWQpOwotICAgICAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogU2V0cyBhIGJ1bmRsZSBvZiBleHRyYXMgZm9yIHRoaXMgc3RhdHVzIG9iamVjdC4KLSAgICAgICAgICogVGhlIGV4dHJhcyB3aWxsIGJlIGlnbm9yZWQgYnkgdGhlIG1lZGlhIHJvdXRlciBidXQgdGhleSBtYXkgYmUgdXNlZAotICAgICAgICAgKiBieSBhcHBsaWNhdGlvbnMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgQnVpbGRlciBzZXRFeHRyYXMoQnVuZGxlIGV4dHJhcykgewotICAgICAgICAgICAgbUJ1bmRsZS5wdXRCdW5kbGUoS0VZX0VYVFJBUywgZXh0cmFzKTsKLSAgICAgICAgICAgIHJldHVybiB0aGlzOwotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIEJ1aWxkcyB0aGUge0BsaW5rIE1lZGlhU2Vzc2lvblN0YXR1cyBtZWRpYSBzZXNzaW9uIHN0YXR1cyBvYmplY3R9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIE1lZGlhU2Vzc2lvblN0YXR1cyBidWlsZCgpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgTWVkaWFTZXNzaW9uU3RhdHVzKG1CdW5kbGUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZTRlMjguLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc0MSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfREFUQV9ST1VURV9JRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX0RBVEFfUk9VVEVfTElCUkFSWV9HUk9VUDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLkNMSUVOVF9EQVRBX1ZPTFVNRTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19DUkVBVEVfUk9VVEVfQ09OVFJPTExFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5DTElFTlRfTVNHX1JFR0lTVEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1JFTEVBU0VfUk9VVEVfQ09OVFJPTExFUjsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuQ0xJRU5UX01TR19ST1VURV9DT05UUk9MX1JFUVVFU1Q7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19TRUxFQ1RfUk9VVEU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLkNMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNUOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1NFVF9ST1VURV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX01TR19VTlJFR0lTVEVSOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1VOU0VMRUNUX1JPVVRFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5DTElFTlRfTVNHX1VQREFURV9ST1VURV9WT0xVTUU7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuQ0xJRU5UX1ZFUlNJT05fQ1VSUkVOVDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX0RBVEFfRVJST1I7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9GQUlMRUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0NPTlRST0xfUkVRVUVTVF9TVUNDRUVERUQ7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wKLSAgICAgICAgLlNFUlZJQ0VfTVNHX0RFU0NSSVBUT1JfQ0hBTkdFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbAotICAgICAgICAuU0VSVklDRV9NU0dfR0VORVJJQ19GQUlMVVJFOwotaW1wb3J0IHN0YXRpYyBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhLk1lZGlhUm91dGVQcm92aWRlclByb3RvY29sCi0gICAgICAgIC5TRVJWSUNFX01TR19HRU5FUklDX1NVQ0NFU1M7Ci1pbXBvcnQgc3RhdGljIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZVByb3ZpZGVyUHJvdG9jb2wuU0VSVklDRV9NU0dfUkVHSVNURVJFRDsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5TRVJWSUNFX1ZFUlNJT05fMTsKLWltcG9ydCBzdGF0aWMgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlUHJvdmlkZXJQcm90b2NvbC5pc1ZhbGlkUmVtb3RlTWVzc2VuZ2VyOwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuU2VydmljZUNvbm5lY3Rpb247Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdW5kbGU7Ci1pbXBvcnQgYW5kcm9pZC5vcy5EZWFkT2JqZWN0RXhjZXB0aW9uOwotaW1wb3J0IGFuZHJvaWQub3MuSGFuZGxlcjsKLWltcG9ydCBhbmRyb2lkLm9zLklCaW5kZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5JQmluZGVyLkRlYXRoUmVjaXBpZW50OwotaW1wb3J0IGFuZHJvaWQub3MuTWVzc2FnZTsKLWltcG9ydCBhbmRyb2lkLm9zLk1lc3NlbmdlcjsKLWltcG9ydCBhbmRyb2lkLm9zLlJlbW90ZUV4Y2VwdGlvbjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudXRpbC5TcGFyc2VBcnJheTsKLQotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjazsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIE1haW50YWlucyBhIGNvbm5lY3Rpb24gdG8gYSBwYXJ0aWN1bGFyIG1lZGlhIHJvdXRlIHByb3ZpZGVyIHNlcnZpY2UuCi0gKi8KLWZpbmFsIGNsYXNzIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIgZXh0ZW5kcyBNZWRpYVJvdXRlUHJvdmlkZXIKLSAgICAgICAgaW1wbGVtZW50cyBTZXJ2aWNlQ29ubmVjdGlvbiB7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFSb3V0ZVByb3ZpZGVyUHJveHkiOyAgLy8gbWF4LiAyMyBjaGFycwotICAgIHN0YXRpYyBmaW5hbCBib29sZWFuIERFQlVHID0gTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBDb21wb25lbnROYW1lIG1Db21wb25lbnROYW1lOwotICAgIGZpbmFsIFByaXZhdGVIYW5kbGVyIG1Qcml2YXRlSGFuZGxlcjsKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxDb250cm9sbGVyPiBtQ29udHJvbGxlcnMgPSBuZXcgQXJyYXlMaXN0PENvbnRyb2xsZXI+KCk7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbVN0YXJ0ZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Cb3VuZDsKLSAgICBwcml2YXRlIENvbm5lY3Rpb24gbUFjdGl2ZUNvbm5lY3Rpb247Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Db25uZWN0aW9uUmVhZHk7Ci0KLSAgICBwdWJsaWMgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcihDb250ZXh0IGNvbnRleHQsIENvbXBvbmVudE5hbWUgY29tcG9uZW50TmFtZSkgewotICAgICAgICBzdXBlcihjb250ZXh0LCBuZXcgUHJvdmlkZXJNZXRhZGF0YShjb21wb25lbnROYW1lKSk7Ci0KLSAgICAgICAgbUNvbXBvbmVudE5hbWUgPSBjb21wb25lbnROYW1lOwotICAgICAgICBtUHJpdmF0ZUhhbmRsZXIgPSBuZXcgUHJpdmF0ZUhhbmRsZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgUm91dGVDb250cm9sbGVyIG9uQ3JlYXRlUm91dGVDb250cm9sbGVyKEBOb25OdWxsIFN0cmluZyByb3V0ZUlkKSB7Ci0gICAgICAgIGlmIChyb3V0ZUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInJvdXRlSWQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlUm91dGVDb250cm9sbGVyKHJvdXRlSWQsIG51bGwpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoCi0gICAgICAgICAgICBATm9uTnVsbCBTdHJpbmcgcm91dGVJZCwgQE5vbk51bGwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICBpZiAocm91dGVJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUlkIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJvdXRlR3JvdXBJZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJyb3V0ZUdyb3VwSWQgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY3JlYXRlUm91dGVDb250cm9sbGVyKHJvdXRlSWQsIHJvdXRlR3JvdXBJZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25EaXNjb3ZlcnlSZXF1ZXN0Q2hhbmdlZChNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0KSB7Ci0gICAgICAgIGlmIChtQ29ubmVjdGlvblJlYWR5KSB7Ci0gICAgICAgICAgICBtQWN0aXZlQ29ubmVjdGlvbi5zZXREaXNjb3ZlcnlSZXF1ZXN0KHJlcXVlc3QpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblNlcnZpY2VDb25uZWN0ZWQoQ29tcG9uZW50TmFtZSBuYW1lLCBJQmluZGVyIHNlcnZpY2UpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBDb25uZWN0ZWQiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtQm91bmQpIHsKLSAgICAgICAgICAgIGRpc2Nvbm5lY3QoKTsKLQotICAgICAgICAgICAgTWVzc2VuZ2VyIG1lc3NlbmdlciA9IChzZXJ2aWNlICE9IG51bGwgPyBuZXcgTWVzc2VuZ2VyKHNlcnZpY2UpIDogbnVsbCk7Ci0gICAgICAgICAgICBpZiAoaXNWYWxpZFJlbW90ZU1lc3NlbmdlcihtZXNzZW5nZXIpKSB7Ci0gICAgICAgICAgICAgICAgQ29ubmVjdGlvbiBjb25uZWN0aW9uID0gbmV3IENvbm5lY3Rpb24obWVzc2VuZ2VyKTsKLSAgICAgICAgICAgICAgICBpZiAoY29ubmVjdGlvbi5yZWdpc3RlcigpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uID0gY29ubmVjdGlvbjsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCB0aGlzICsgIjogU2VydmljZSByZXR1cm5lZCBpbnZhbGlkIG1lc3NlbmdlciBiaW5kZXIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU2VydmljZURpc2Nvbm5lY3RlZChDb21wb25lbnROYW1lIG5hbWUpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBTZXJ2aWNlIGRpc2Nvbm5lY3RlZCIpOwotICAgICAgICB9Ci0gICAgICAgIGRpc2Nvbm5lY3QoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgICByZXR1cm4gIlNlcnZpY2UgY29ubmVjdGlvbiAiICsgbUNvbXBvbmVudE5hbWUuZmxhdHRlblRvU2hvcnRTdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNDb21wb25lbnROYW1lKFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGNsYXNzTmFtZSkgewotICAgICAgICByZXR1cm4gbUNvbXBvbmVudE5hbWUuZ2V0UGFja2FnZU5hbWUoKS5lcXVhbHMocGFja2FnZU5hbWUpCi0gICAgICAgICAgICAgICAgJiYgbUNvbXBvbmVudE5hbWUuZ2V0Q2xhc3NOYW1lKCkuZXF1YWxzKGNsYXNzTmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIGlmICghbVN0YXJ0ZWQpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IFN0YXJ0aW5nIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1TdGFydGVkID0gdHJ1ZTsKLSAgICAgICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0b3AoKSB7Ci0gICAgICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU3RvcHBpbmciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVN0YXJ0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlYmluZElmRGlzY29ubmVjdGVkKCkgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gbnVsbCAmJiBzaG91bGRCaW5kKCkpIHsKLSAgICAgICAgICAgIHVuYmluZCgpOwotICAgICAgICAgICAgYmluZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUJpbmRpbmcoKSB7Ci0gICAgICAgIGlmIChzaG91bGRCaW5kKCkpIHsKLSAgICAgICAgICAgIGJpbmQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHVuYmluZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHNob3VsZEJpbmQoKSB7Ci0gICAgICAgIGlmIChtU3RhcnRlZCkgewotICAgICAgICAgICAgLy8gQmluZCB3aGVuZXZlciB0aGVyZSBpcyBhIGRpc2NvdmVyeSByZXF1ZXN0LgotICAgICAgICAgICAgaWYgKGdldERpc2NvdmVyeVJlcXVlc3QoKSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEJpbmQgd2hlbmV2ZXIgdGhlIGFwcGxpY2F0aW9uIGhhcyBhbiBhY3RpdmUgcm91dGUgY29udHJvbGxlci4KLSAgICAgICAgICAgIC8vIFRoaXMgbWVhbnMgdGhhdCBvbmUgb2YgdGhpcyBwcm92aWRlcidzIHJvdXRlcyBpcyBzZWxlY3RlZC4KLSAgICAgICAgICAgIGlmICghbUNvbnRyb2xsZXJzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYmluZCgpIHsKLSAgICAgICAgaWYgKCFtQm91bmQpIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IEJpbmRpbmciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSW50ZW50IHNlcnZpY2UgPSBuZXcgSW50ZW50KE1lZGlhUm91dGVQcm92aWRlclByb3RvY29sLlNFUlZJQ0VfSU5URVJGQUNFKTsKLSAgICAgICAgICAgIHNlcnZpY2Uuc2V0Q29tcG9uZW50KG1Db21wb25lbnROYW1lKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbUJvdW5kID0gZ2V0Q29udGV4dCgpLmJpbmRTZXJ2aWNlKHNlcnZpY2UsIHRoaXMsIENvbnRleHQuQklORF9BVVRPX0NSRUFURSk7Ci0gICAgICAgICAgICAgICAgaWYgKCFtQm91bmQgJiYgREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogQmluZCBmYWlsZWQiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChTZWN1cml0eUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBCaW5kIGZhaWxlZCIsIGV4KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdW5iaW5kKCkgewotICAgICAgICBpZiAobUJvdW5kKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBVbmJpbmRpbmciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbUJvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICBkaXNjb25uZWN0KCk7Ci0gICAgICAgICAgICBnZXRDb250ZXh0KCkudW5iaW5kU2VydmljZSh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgUm91dGVDb250cm9sbGVyIGNyZWF0ZVJvdXRlQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKCk7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIExpc3Q8TWVkaWFSb3V0ZURlc2NyaXB0b3I+IHJvdXRlcyA9IGRlc2NyaXB0b3IuZ2V0Um91dGVzKCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSByb3V0ZXMuc2l6ZSgpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZmluYWwgTWVkaWFSb3V0ZURlc2NyaXB0b3Igcm91dGUgPSByb3V0ZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRJZCgpLmVxdWFscyhyb3V0ZUlkKSkgewotICAgICAgICAgICAgICAgICAgICBDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBuZXcgQ29udHJvbGxlcihyb3V0ZUlkLCByb3V0ZUdyb3VwSWQpOwotICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlcnMuYWRkKGNvbnRyb2xsZXIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUNvbm5lY3Rpb25SZWFkeSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udHJvbGxlci5hdHRhY2hDb25uZWN0aW9uKG1BY3RpdmVDb25uZWN0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB1cGRhdGVCaW5kaW5nKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250cm9sbGVyOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGlvblJlYWR5KENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gY29ubmVjdGlvbikgewotICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWFkeSA9IHRydWU7Ci0gICAgICAgICAgICBhdHRhY2hDb250cm9sbGVyc1RvQ29ubmVjdGlvbigpOwotCi0gICAgICAgICAgICBNZWRpYVJvdXRlRGlzY292ZXJ5UmVxdWVzdCByZXF1ZXN0ID0gZ2V0RGlzY292ZXJ5UmVxdWVzdCgpOwotICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1BY3RpdmVDb25uZWN0aW9uLnNldERpc2NvdmVyeVJlcXVlc3QocmVxdWVzdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIG9uQ29ubmVjdGlvbkRpZWQoQ29ubmVjdGlvbiBjb25uZWN0aW9uKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiA9PSBjb25uZWN0aW9uKSB7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsIHRoaXMgKyAiOiBTZXJ2aWNlIGNvbm5lY3Rpb24gZGllZCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZGlzY29ubmVjdCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uIGNvbm5lY3Rpb24sIFN0cmluZyBlcnJvcikgewotICAgICAgICBpZiAobUFjdGl2ZUNvbm5lY3Rpb24gPT0gY29ubmVjdGlvbikgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCB0aGlzICsgIjogU2VydmljZSBjb25uZWN0aW9uIGVycm9yIC0gIiArIGVycm9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVuYmluZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbm5lY3Rpb25EZXNjcmlwdG9yQ2hhbmdlZChDb25uZWN0aW9uIGNvbm5lY3Rpb24sCi0gICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgICAgaWYgKG1BY3RpdmVDb25uZWN0aW9uID09IGNvbm5lY3Rpb24pIHsKLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgdGhpcyArICI6IERlc2NyaXB0b3IgY2hhbmdlZCwgZGVzY3JpcHRvcj0iICsgZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXREZXNjcmlwdG9yKGRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRpc2Nvbm5lY3QoKSB7Ci0gICAgICAgIGlmIChtQWN0aXZlQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzZXREZXNjcmlwdG9yKG51bGwpOwotICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWFkeSA9IGZhbHNlOwotICAgICAgICAgICAgZGV0YWNoQ29udHJvbGxlcnNGcm9tQ29ubmVjdGlvbigpOwotICAgICAgICAgICAgbUFjdGl2ZUNvbm5lY3Rpb24uZGlzcG9zZSgpOwotICAgICAgICAgICAgbUFjdGl2ZUNvbm5lY3Rpb24gPSBudWxsOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBvbkNvbnRyb2xsZXJSZWxlYXNlZChDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgbUNvbnRyb2xsZXJzLnJlbW92ZShjb250cm9sbGVyKTsKLSAgICAgICAgY29udHJvbGxlci5kZXRhY2hDb25uZWN0aW9uKCk7Ci0gICAgICAgIHVwZGF0ZUJpbmRpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgYXR0YWNoQ29udHJvbGxlcnNUb0Nvbm5lY3Rpb24oKSB7Ci0gICAgICAgIGludCBjb3VudCA9IG1Db250cm9sbGVycy5zaXplKCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgbUNvbnRyb2xsZXJzLmdldChpKS5hdHRhY2hDb25uZWN0aW9uKG1BY3RpdmVDb25uZWN0aW9uKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXRhY2hDb250cm9sbGVyc0Zyb21Db25uZWN0aW9uKCkgewotICAgICAgICBpbnQgY291bnQgPSBtQ29udHJvbGxlcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIG1Db250cm9sbGVycy5nZXQoaSkuZGV0YWNoQ29ubmVjdGlvbigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDb250cm9sbGVyIGV4dGVuZHMgUm91dGVDb250cm9sbGVyIHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgbVJvdXRlSWQ7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1Sb3V0ZUdyb3VwSWQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sZWFuIG1TZWxlY3RlZDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBlbmRpbmdTZXRWb2x1bWUgPSAtMTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YTsKLQotICAgICAgICBwcml2YXRlIENvbm5lY3Rpb24gbUNvbm5lY3Rpb247Ci0gICAgICAgIHByaXZhdGUgaW50IG1Db250cm9sbGVySWQ7Ci0KLSAgICAgICAgcHVibGljIENvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQsIFN0cmluZyByb3V0ZUdyb3VwSWQpIHsKLSAgICAgICAgICAgIG1Sb3V0ZUlkID0gcm91dGVJZDsKLSAgICAgICAgICAgIG1Sb3V0ZUdyb3VwSWQgPSByb3V0ZUdyb3VwSWQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBhdHRhY2hDb25uZWN0aW9uKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgICAgICAgICAgbUNvbm5lY3Rpb24gPSBjb25uZWN0aW9uOwotICAgICAgICAgICAgbUNvbnRyb2xsZXJJZCA9IGNvbm5lY3Rpb24uY3JlYXRlUm91dGVDb250cm9sbGVyKG1Sb3V0ZUlkLCBtUm91dGVHcm91cElkKTsKLSAgICAgICAgICAgIGlmIChtU2VsZWN0ZWQpIHsKLSAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnNlbGVjdFJvdXRlKG1Db250cm9sbGVySWQpOwotICAgICAgICAgICAgICAgIGlmIChtUGVuZGluZ1NldFZvbHVtZSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24uc2V0Vm9sdW1lKG1Db250cm9sbGVySWQsIG1QZW5kaW5nU2V0Vm9sdW1lKTsKLSAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdTZXRWb2x1bWUgPSAtMTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGEgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLnVwZGF0ZVZvbHVtZShtQ29udHJvbGxlcklkLCBtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhKTsKLSAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdVcGRhdGVWb2x1bWVEZWx0YSA9IDA7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgZGV0YWNoQ29ubmVjdGlvbigpIHsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24ucmVsZWFzZVJvdXRlQ29udHJvbGxlcihtQ29udHJvbGxlcklkKTsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbiA9IG51bGw7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xsZXJJZCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWxlYXNlKCkgewotICAgICAgICAgICAgb25Db250cm9sbGVyUmVsZWFzZWQodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TZWxlY3QoKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWQgPSB0cnVlOwotICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbi5zZWxlY3RSb3V0ZShtQ29udHJvbGxlcklkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblVuc2VsZWN0KCkgewotICAgICAgICAgICAgb25VbnNlbGVjdChNZWRpYVJvdXRlci5VTlNFTEVDVF9SRUFTT05fVU5LTk9XTik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25VbnNlbGVjdChpbnQgcmVhc29uKSB7Ci0gICAgICAgICAgICBtU2VsZWN0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24udW5zZWxlY3RSb3V0ZShtQ29udHJvbGxlcklkLCByZWFzb24pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIGlmIChtQ29ubmVjdGlvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUNvbm5lY3Rpb24uc2V0Vm9sdW1lKG1Db250cm9sbGVySWQsIHZvbHVtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nU2V0Vm9sdW1lID0gdm9sdW1lOwotICAgICAgICAgICAgICAgIG1QZW5kaW5nVXBkYXRlVm9sdW1lRGVsdGEgPSAwOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVXBkYXRlVm9sdW1lKGludCBkZWx0YSkgewotICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtQ29ubmVjdGlvbi51cGRhdGVWb2x1bWUobUNvbnRyb2xsZXJJZCwgZGVsdGEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtUGVuZGluZ1VwZGF0ZVZvbHVtZURlbHRhICs9IGRlbHRhOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uQ29udHJvbFJlcXVlc3QoSW50ZW50IGludGVudCwgQ29udHJvbFJlcXVlc3RDYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICAgICAgaWYgKG1Db25uZWN0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbUNvbm5lY3Rpb24uc2VuZENvbnRyb2xSZXF1ZXN0KG1Db250cm9sbGVySWQsIGludGVudCwgY2FsbGJhY2spOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBjbGFzcyBDb25uZWN0aW9uIGltcGxlbWVudHMgRGVhdGhSZWNpcGllbnQgewotICAgICAgICBwcml2YXRlIGZpbmFsIE1lc3NlbmdlciBtU2VydmljZU1lc3NlbmdlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBSZWNlaXZlSGFuZGxlciBtUmVjZWl2ZUhhbmRsZXI7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgTWVzc2VuZ2VyIG1SZWNlaXZlTWVzc2VuZ2VyOwotCi0gICAgICAgIHByaXZhdGUgaW50IG1OZXh0UmVxdWVzdElkID0gMTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbU5leHRDb250cm9sbGVySWQgPSAxOwotICAgICAgICBwcml2YXRlIGludCBtU2VydmljZVZlcnNpb247IC8vIG5vbi16ZXJvIHdoZW4gcmVnaXN0cmF0aW9uIGNvbXBsZXRlCi0KLSAgICAgICAgcHJpdmF0ZSBpbnQgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZDsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBTcGFyc2VBcnJheTxDb250cm9sUmVxdWVzdENhbGxiYWNrPiBtUGVuZGluZ0NhbGxiYWNrcyA9Ci0gICAgICAgICAgICAgICAgbmV3IFNwYXJzZUFycmF5PENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2s+KCk7Ci0KLSAgICAgICAgcHVibGljIENvbm5lY3Rpb24oTWVzc2VuZ2VyIHNlcnZpY2VNZXNzZW5nZXIpIHsKLSAgICAgICAgICAgIG1TZXJ2aWNlTWVzc2VuZ2VyID0gc2VydmljZU1lc3NlbmdlcjsKLSAgICAgICAgICAgIG1SZWNlaXZlSGFuZGxlciA9IG5ldyBSZWNlaXZlSGFuZGxlcih0aGlzKTsKLSAgICAgICAgICAgIG1SZWNlaXZlTWVzc2VuZ2VyID0gbmV3IE1lc3NlbmdlcihtUmVjZWl2ZUhhbmRsZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gcmVnaXN0ZXIoKSB7Ci0gICAgICAgICAgICBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkID0gbU5leHRSZXF1ZXN0SWQrKzsKLSAgICAgICAgICAgIGlmICghc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19SRUdJU1RFUiwKLSAgICAgICAgICAgICAgICAgICAgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCwKLSAgICAgICAgICAgICAgICAgICAgQ0xJRU5UX1ZFUlNJT05fQ1VSUkVOVCwgbnVsbCwgbnVsbCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgbVNlcnZpY2VNZXNzZW5nZXIuZ2V0QmluZGVyKCkubGlua1RvRGVhdGgodGhpcywgMCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChSZW1vdGVFeGNlcHRpb24gZXgpIHsKLSAgICAgICAgICAgICAgICBiaW5kZXJEaWVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBkaXNwb3NlKCkgewotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19VTlJFR0lTVEVSLCAwLCAwLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIG1SZWNlaXZlSGFuZGxlci5kaXNwb3NlKCk7Ci0gICAgICAgICAgICBtU2VydmljZU1lc3Nlbmdlci5nZXRCaW5kZXIoKS51bmxpbmtUb0RlYXRoKHRoaXMsIDApOwotCi0gICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBmYWlsUGVuZGluZ0NhbGxiYWNrcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBmYWlsUGVuZGluZ0NhbGxiYWNrcygpIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1QZW5kaW5nQ2FsbGJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MudmFsdWVBdChpKS5vbkVycm9yKG51bGwsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MuY2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uR2VuZXJpY0ZhaWx1cmUoaW50IHJlcXVlc3RJZCkgewotICAgICAgICAgICAgaWYgKHJlcXVlc3RJZCA9PSBtUGVuZGluZ1JlZ2lzdGVyUmVxdWVzdElkKSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZCA9IDA7Ci0gICAgICAgICAgICAgICAgb25Db25uZWN0aW9uRXJyb3IodGhpcywgIlJlZ2lzdHJhdGlvbiBmYWlsZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2sgPSBtUGVuZGluZ0NhbGxiYWNrcy5nZXQocmVxdWVzdElkKTsKLSAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVBlbmRpbmdDYWxsYmFja3MucmVtb3ZlKHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICAgICAgY2FsbGJhY2sub25FcnJvcihudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25HZW5lcmljU3VjY2VzcyhpbnQgcmVxdWVzdElkKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIG9uUmVnaXN0ZXJlZChpbnQgcmVxdWVzdElkLCBpbnQgc2VydmljZVZlcnNpb24sCi0gICAgICAgICAgICAgICAgQnVuZGxlIGRlc2NyaXB0b3JCdW5kbGUpIHsKLSAgICAgICAgICAgIGlmIChtU2VydmljZVZlcnNpb24gPT0gMAotICAgICAgICAgICAgICAgICAgICAmJiByZXF1ZXN0SWQgPT0gbVBlbmRpbmdSZWdpc3RlclJlcXVlc3RJZAotICAgICAgICAgICAgICAgICAgICAmJiBzZXJ2aWNlVmVyc2lvbiA+PSBTRVJWSUNFX1ZFUlNJT05fMSkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nUmVnaXN0ZXJSZXF1ZXN0SWQgPSAwOwotICAgICAgICAgICAgICAgIG1TZXJ2aWNlVmVyc2lvbiA9IHNlcnZpY2VWZXJzaW9uOwotICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvbkRlc2NyaXB0b3JDaGFuZ2VkKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlUHJvdmlkZXJEZXNjcmlwdG9yLmZyb21CdW5kbGUoZGVzY3JpcHRvckJ1bmRsZSkpOwotICAgICAgICAgICAgICAgIG9uQ29ubmVjdGlvblJlYWR5KHRoaXMpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25EZXNjcmlwdG9yQ2hhbmdlZChCdW5kbGUgZGVzY3JpcHRvckJ1bmRsZSkgewotICAgICAgICAgICAgaWYgKG1TZXJ2aWNlVmVyc2lvbiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgb25Db25uZWN0aW9uRGVzY3JpcHRvckNoYW5nZWQodGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuZnJvbUJ1bmRsZShkZXNjcmlwdG9yQnVuZGxlKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbGVhbiBvbkNvbnRyb2xSZXF1ZXN0U3VjY2VlZGVkKGludCByZXF1ZXN0SWQsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrID0gbVBlbmRpbmdDYWxsYmFja3MuZ2V0KHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnJlbW92ZShyZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uUmVzdWx0KGRhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2xlYW4gb25Db250cm9sUmVxdWVzdEZhaWxlZChpbnQgcmVxdWVzdElkLCBTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICBDb250cm9sUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrID0gbVBlbmRpbmdDYWxsYmFja3MuZ2V0KHJlcXVlc3RJZCk7Ci0gICAgICAgICAgICBpZiAoY2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnJlbW92ZShyZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgIGNhbGxiYWNrLm9uRXJyb3IoZXJyb3IsIGRhdGEpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGJpbmRlckRpZWQoKSB7Ci0gICAgICAgICAgICBtUHJpdmF0ZUhhbmRsZXIucG9zdChuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgcnVuKCkgewotICAgICAgICAgICAgICAgICAgICBvbkNvbm5lY3Rpb25EaWVkKENvbm5lY3Rpb24udGhpcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IGNyZWF0ZVJvdXRlQ29udHJvbGxlcihTdHJpbmcgcm91dGVJZCwgU3RyaW5nIHJvdXRlR3JvdXBJZCkgewotICAgICAgICAgICAgaW50IGNvbnRyb2xsZXJJZCA9IG1OZXh0Q29udHJvbGxlcklkKys7Ci0gICAgICAgICAgICBCdW5kbGUgZGF0YSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGRhdGEucHV0U3RyaW5nKENMSUVOVF9EQVRBX1JPVVRFX0lELCByb3V0ZUlkKTsKLSAgICAgICAgICAgIGRhdGEucHV0U3RyaW5nKENMSUVOVF9EQVRBX1JPVVRFX0xJQlJBUllfR1JPVVAsIHJvdXRlR3JvdXBJZCk7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX0NSRUFURV9ST1VURV9DT05UUk9MTEVSLAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIGRhdGEpOwotICAgICAgICAgICAgcmV0dXJuIGNvbnRyb2xsZXJJZDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlbGVhc2VSb3V0ZUNvbnRyb2xsZXIoaW50IGNvbnRyb2xsZXJJZCkgewotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19SRUxFQVNFX1JPVVRFX0NPTlRST0xMRVIsCi0gICAgICAgICAgICAgICAgICAgIG1OZXh0UmVxdWVzdElkKyssIGNvbnRyb2xsZXJJZCwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZWxlY3RSb3V0ZShpbnQgY29udHJvbGxlcklkKSB7Ci0gICAgICAgICAgICBzZW5kUmVxdWVzdChDTElFTlRfTVNHX1NFTEVDVF9ST1VURSwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVuc2VsZWN0Um91dGUoaW50IGNvbnRyb2xsZXJJZCwgaW50IHJlYXNvbikgewotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcyA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgIGV4dHJhcy5wdXRJbnQoQ0xJRU5UX0RBVEFfVU5TRUxFQ1RfUkVBU09OLCByZWFzb24pOwotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19VTlNFTEVDVF9ST1VURSwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBleHRyYXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lKGludCBjb250cm9sbGVySWQsIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgIEJ1bmRsZSBkYXRhID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgZGF0YS5wdXRJbnQoQ0xJRU5UX0RBVEFfVk9MVU1FLCB2b2x1bWUpOwotICAgICAgICAgICAgc2VuZFJlcXVlc3QoQ0xJRU5UX01TR19TRVRfUk9VVEVfVk9MVU1FLAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCBjb250cm9sbGVySWQsIG51bGwsIGRhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgdXBkYXRlVm9sdW1lKGludCBjb250cm9sbGVySWQsIGludCBkZWx0YSkgewotICAgICAgICAgICAgQnVuZGxlIGRhdGEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICBkYXRhLnB1dEludChDTElFTlRfREFUQV9WT0xVTUUsIGRlbHRhKTsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfVVBEQVRFX1JPVVRFX1ZPTFVNRSwKLSAgICAgICAgICAgICAgICAgICAgbU5leHRSZXF1ZXN0SWQrKywgY29udHJvbGxlcklkLCBudWxsLCBkYXRhKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sZWFuIHNlbmRDb250cm9sUmVxdWVzdChpbnQgY29udHJvbGxlcklkLCBJbnRlbnQgaW50ZW50LAotICAgICAgICAgICAgICAgIENvbnRyb2xSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgICAgIGludCByZXF1ZXN0SWQgPSBtTmV4dFJlcXVlc3RJZCsrOwotICAgICAgICAgICAgaWYgKHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfUk9VVEVfQ09OVFJPTF9SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIGNvbnRyb2xsZXJJZCwgaW50ZW50LCBudWxsKSkgewotICAgICAgICAgICAgICAgIGlmIChjYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QZW5kaW5nQ2FsbGJhY2tzLnB1dChyZXF1ZXN0SWQsIGNhbGxiYWNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXREaXNjb3ZlcnlSZXF1ZXN0KE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgICAgIHNlbmRSZXF1ZXN0KENMSUVOVF9NU0dfU0VUX0RJU0NPVkVSWV9SRVFVRVNULAotICAgICAgICAgICAgICAgICAgICBtTmV4dFJlcXVlc3RJZCsrLCAwLCByZXF1ZXN0ICE9IG51bGwgPyByZXF1ZXN0LmFzQnVuZGxlKCkgOiBudWxsLCBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgYm9vbGVhbiBzZW5kUmVxdWVzdChpbnQgd2hhdCwgaW50IHJlcXVlc3RJZCwgaW50IGFyZywgT2JqZWN0IG9iaiwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgIE1lc3NhZ2UgbXNnID0gTWVzc2FnZS5vYnRhaW4oKTsKLSAgICAgICAgICAgIG1zZy53aGF0ID0gd2hhdDsKLSAgICAgICAgICAgIG1zZy5hcmcxID0gcmVxdWVzdElkOwotICAgICAgICAgICAgbXNnLmFyZzIgPSBhcmc7Ci0gICAgICAgICAgICBtc2cub2JqID0gb2JqOwotICAgICAgICAgICAgbXNnLnNldERhdGEoZGF0YSk7Ci0gICAgICAgICAgICBtc2cucmVwbHlUbyA9IG1SZWNlaXZlTWVzc2VuZ2VyOwotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBtU2VydmljZU1lc3Nlbmdlci5zZW5kKG1zZyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9IGNhdGNoIChEZWFkT2JqZWN0RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHNlcnZpY2UgZGllZC4KLSAgICAgICAgICAgIH0gY2F0Y2ggKFJlbW90ZUV4Y2VwdGlvbiBleCkgewotICAgICAgICAgICAgICAgIGlmICh3aGF0ICE9IENMSUVOVF9NU0dfVU5SRUdJU1RFUikgewotICAgICAgICAgICAgICAgICAgICBMb2cuZShUQUcsICJDb3VsZCBub3Qgc2VuZCBtZXNzYWdlIHRvIHNlcnZpY2UuIiwgZXgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFByaXZhdGVIYW5kbGVyIGV4dGVuZHMgSGFuZGxlciB7Ci0gICAgICAgIFByaXZhdGVIYW5kbGVyKCkgewotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSGFuZGxlciB0aGF0IHJlY2VpdmVzIG1lc3NhZ2VzIGZyb20gdGhlIHNlcnZlci4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlubmVyIGNsYXNzIGlzIHN0YXRpYyBhbmQgb25seSByZXRhaW5zIGEgd2VhayByZWZlcmVuY2UgdG8gdGhlIGNvbm5lY3Rpb24KLSAgICAgKiB0byBwcmV2ZW50IHRoZSBjbGllbnQgZnJvbSBiZWluZyBsZWFrZWQgaW4gY2FzZSB0aGUgc2VydmljZSBpcyBob2xkaW5nIGFuCi0gICAgICogYWN0aXZlIHJlZmVyZW5jZSB0byB0aGUgY2xpZW50J3MgbWVzc2VuZ2VyLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIGhhbmRsZXIgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGhhbmRsZSBhbnkgbWVzc2FnZXMgb3RoZXIgdGhhbiB0aG9zZQotICAgICAqIHRoYXQgY29tZSBmcm9tIHRoZSBzZXJ2aWNlLgotICAgICAqIDwvcD4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZWNlaXZlSGFuZGxlciBleHRlbmRzIEhhbmRsZXIgewotICAgICAgICBwcml2YXRlIGZpbmFsIFdlYWtSZWZlcmVuY2U8Q29ubmVjdGlvbj4gbUNvbm5lY3Rpb25SZWY7Ci0KLSAgICAgICAgcHVibGljIFJlY2VpdmVIYW5kbGVyKENvbm5lY3Rpb24gY29ubmVjdGlvbikgewotICAgICAgICAgICAgbUNvbm5lY3Rpb25SZWYgPSBuZXcgV2Vha1JlZmVyZW5jZTxDb25uZWN0aW9uPihjb25uZWN0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICAgICAgICBtQ29ubmVjdGlvblJlZi5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIGhhbmRsZU1lc3NhZ2UoTWVzc2FnZSBtc2cpIHsKLSAgICAgICAgICAgIENvbm5lY3Rpb24gY29ubmVjdGlvbiA9IG1Db25uZWN0aW9uUmVmLmdldCgpOwotICAgICAgICAgICAgaWYgKGNvbm5lY3Rpb24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aGF0ID0gbXNnLndoYXQ7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IHJlcXVlc3RJZCA9IG1zZy5hcmcxOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBhcmcgPSBtc2cuYXJnMjsKLSAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3Qgb2JqID0gbXNnLm9iajsKLSAgICAgICAgICAgICAgICBmaW5hbCBCdW5kbGUgZGF0YSA9IG1zZy5wZWVrRGF0YSgpOwotICAgICAgICAgICAgICAgIGlmICghcHJvY2Vzc01lc3NhZ2UoY29ubmVjdGlvbiwgd2hhdCwgcmVxdWVzdElkLCBhcmcsIG9iaiwgZGF0YSkpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJVbmhhbmRsZWQgbWVzc2FnZSBmcm9tIHNlcnZlcjogIiArIG1zZyk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gcHJvY2Vzc01lc3NhZ2UoQ29ubmVjdGlvbiBjb25uZWN0aW9uLAotICAgICAgICAgICAgICAgIGludCB3aGF0LCBpbnQgcmVxdWVzdElkLCBpbnQgYXJnLCBPYmplY3Qgb2JqLCBCdW5kbGUgZGF0YSkgewotICAgICAgICAgICAgc3dpdGNoICh3aGF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19HRU5FUklDX0ZBSUxVUkU6Ci0gICAgICAgICAgICAgICAgICAgIGNvbm5lY3Rpb24ub25HZW5lcmljRmFpbHVyZShyZXF1ZXN0SWQpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLQotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfR0VORVJJQ19TVUNDRVNTOgotICAgICAgICAgICAgICAgICAgICBjb25uZWN0aW9uLm9uR2VuZXJpY1N1Y2Nlc3MocmVxdWVzdElkKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0KLSAgICAgICAgICAgICAgICBjYXNlIFNFUlZJQ0VfTVNHX1JFR0lTVEVSRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLm9uUmVnaXN0ZXJlZChyZXF1ZXN0SWQsIGFyZywgKEJ1bmRsZSlvYmopOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19ERVNDUklQVE9SX0NIQU5HRUQ6Ci0gICAgICAgICAgICAgICAgICAgIGlmIChvYmogPT0gbnVsbCB8fCBvYmogaW5zdGFuY2VvZiBCdW5kbGUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLm9uRGVzY3JpcHRvckNoYW5nZWQoKEJ1bmRsZSlvYmopOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgY2FzZSBTRVJWSUNFX01TR19DT05UUk9MX1JFUVVFU1RfU1VDQ0VFREVEOgotICAgICAgICAgICAgICAgICAgICBpZiAob2JqID09IG51bGwgfHwgb2JqIGluc3RhbmNlb2YgQnVuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29ubmVjdGlvbi5vbkNvbnRyb2xSZXF1ZXN0U3VjY2VlZGVkKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SWQsIChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICAgIGNhc2UgU0VSVklDRV9NU0dfQ09OVFJPTF9SRVFVRVNUX0ZBSUxFRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKG9iaiA9PSBudWxsIHx8IG9iaiBpbnN0YW5jZW9mIEJ1bmRsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGVycm9yID0gKGRhdGEgPT0gbnVsbCA/IG51bGwgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldFN0cmluZyhTRVJWSUNFX0RBVEFfRVJST1IpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLm9uQ29udHJvbFJlcXVlc3RGYWlsZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RJZCwgZXJyb3IsIChCdW5kbGUpb2JqKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyV2F0Y2hlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMWY2NDcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkJyb2FkY2FzdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db21wb25lbnROYW1lOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudEZpbHRlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQucG0uUGFja2FnZU1hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnBtLlJlc29sdmVJbmZvOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5TZXJ2aWNlSW5mbzsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotLyoqCi0gKiBXYXRjaGVzIGZvciBtZWRpYSByb3V0ZSBwcm92aWRlciBzZXJ2aWNlcyB0byBiZSBpbnN0YWxsZWQuCi0gKiBBZGRzIGEgcHJvdmlkZXIgdG8gdGhlIG1lZGlhIHJvdXRlciBmb3IgZWFjaCByZWdpc3RlcmVkIHNlcnZpY2UuCi0gKgotICogQHNlZSBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyCi0gKi8KLWZpbmFsIGNsYXNzIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDYWxsYmFjayBtQ2FsbGJhY2s7Ci0gICAgcHJpdmF0ZSBmaW5hbCBIYW5kbGVyIG1IYW5kbGVyOwotICAgIHByaXZhdGUgZmluYWwgUGFja2FnZU1hbmFnZXIgbVBhY2thZ2VNYW5hZ2VyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8UmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcj4gbVByb3ZpZGVycyA9Ci0gICAgICAgICAgICBuZXcgQXJyYXlMaXN0PFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXI+KCk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1SdW5uaW5nOwotCi0gICAgcHVibGljIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXJXYXRjaGVyKENvbnRleHQgY29udGV4dCwgQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtQ2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgICAgICAgbUhhbmRsZXIgPSBuZXcgSGFuZGxlcigpOwotICAgICAgICBtUGFja2FnZU1hbmFnZXIgPSBjb250ZXh0LmdldFBhY2thZ2VNYW5hZ2VyKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc3RhcnQoKSB7Ci0gICAgICAgIGlmICghbVJ1bm5pbmcpIHsKLSAgICAgICAgICAgIG1SdW5uaW5nID0gdHJ1ZTsKLQotICAgICAgICAgICAgSW50ZW50RmlsdGVyIGZpbHRlciA9IG5ldyBJbnRlbnRGaWx0ZXIoKTsKLSAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX0FEREVEKTsKLSAgICAgICAgICAgIGZpbHRlci5hZGRBY3Rpb24oSW50ZW50LkFDVElPTl9QQUNLQUdFX1JFTU9WRUQpOwotICAgICAgICAgICAgZmlsdGVyLmFkZEFjdGlvbihJbnRlbnQuQUNUSU9OX1BBQ0tBR0VfQ0hBTkdFRCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRVBMQUNFRCk7Ci0gICAgICAgICAgICBmaWx0ZXIuYWRkQWN0aW9uKEludGVudC5BQ1RJT05fUEFDS0FHRV9SRVNUQVJURUQpOwotICAgICAgICAgICAgZmlsdGVyLmFkZERhdGFTY2hlbWUoInBhY2thZ2UiKTsKLSAgICAgICAgICAgIG1Db250ZXh0LnJlZ2lzdGVyUmVjZWl2ZXIobVNjYW5QYWNrYWdlc1JlY2VpdmVyLCBmaWx0ZXIsIG51bGwsIG1IYW5kbGVyKTsKLQotICAgICAgICAgICAgLy8gU2NhbiBwYWNrYWdlcy4KLSAgICAgICAgICAgIC8vIEFsc28gaGFzIHRoZSBzaWRlLWVmZmVjdCBvZiByZXN0YXJ0aW5nIHByb3ZpZGVycyBpZiBuZWVkZWQuCi0gICAgICAgICAgICBtSGFuZGxlci5wb3N0KG1TY2FuUGFja2FnZXNSdW5uYWJsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzdG9wKCkgewotICAgICAgICBpZiAobVJ1bm5pbmcpIHsKLSAgICAgICAgICAgIG1SdW5uaW5nID0gZmFsc2U7Ci0KLSAgICAgICAgICAgIG1Db250ZXh0LnVucmVnaXN0ZXJSZWNlaXZlcihtU2NhblBhY2thZ2VzUmVjZWl2ZXIpOwotICAgICAgICAgICAgbUhhbmRsZXIucmVtb3ZlQ2FsbGJhY2tzKG1TY2FuUGFja2FnZXNSdW5uYWJsZSk7Ci0KLSAgICAgICAgICAgIC8vIFN0b3AgYWxsIHByb3ZpZGVycy4KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUHJvdmlkZXJzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICAgICAgbVByb3ZpZGVycy5nZXQoaSkuc3RvcCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgdm9pZCBzY2FuUGFja2FnZXMoKSB7Ci0gICAgICAgIGlmICghbVJ1bm5pbmcpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFkZCBwcm92aWRlcnMgZm9yIGFsbCBuZXcgc2VydmljZXMuCi0gICAgICAgIC8vIFJlb3JkZXIgdGhlIGxpc3Qgc28gdGhhdCBwcm92aWRlcnMgbGVmdCBhdCB0aGUgZW5kIHdpbGwgYmUgdGhlIG9uZXMgdG8gcmVtb3ZlLgotICAgICAgICBpbnQgdGFyZ2V0SW5kZXggPSAwOwotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYVJvdXRlUHJvdmlkZXJTZXJ2aWNlLlNFUlZJQ0VfSU5URVJGQUNFKTsKLSAgICAgICAgZm9yIChSZXNvbHZlSW5mbyByZXNvbHZlSW5mbyA6IG1QYWNrYWdlTWFuYWdlci5xdWVyeUludGVudFNlcnZpY2VzKGludGVudCwgMCkpIHsKLSAgICAgICAgICAgIFNlcnZpY2VJbmZvIHNlcnZpY2VJbmZvID0gcmVzb2x2ZUluZm8uc2VydmljZUluZm87Ci0gICAgICAgICAgICBpZiAoc2VydmljZUluZm8gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBzb3VyY2VJbmRleCA9IGZpbmRQcm92aWRlcihzZXJ2aWNlSW5mby5wYWNrYWdlTmFtZSwgc2VydmljZUluZm8ubmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHNvdXJjZUluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgUmVnaXN0ZXJlZE1lZGlhUm91dGVQcm92aWRlcihtQ29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ29tcG9uZW50TmFtZShzZXJ2aWNlSW5mby5wYWNrYWdlTmFtZSwgc2VydmljZUluZm8ubmFtZSkpOwotICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5zdGFydCgpOwotICAgICAgICAgICAgICAgICAgICBtUHJvdmlkZXJzLmFkZCh0YXJnZXRJbmRleCsrLCBwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgIG1DYWxsYmFjay5hZGRQcm92aWRlcihwcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChzb3VyY2VJbmRleCA+PSB0YXJnZXRJbmRleCkgewotICAgICAgICAgICAgICAgICAgICBSZWdpc3RlcmVkTWVkaWFSb3V0ZVByb3ZpZGVyIHByb3ZpZGVyID0gbVByb3ZpZGVycy5nZXQoc291cmNlSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBwcm92aWRlci5zdGFydCgpOyAvLyByZXN0YXJ0IHRoZSBwcm92aWRlciBpZiBuZWVkZWQKLSAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXIucmViaW5kSWZEaXNjb25uZWN0ZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbnMuc3dhcChtUHJvdmlkZXJzLCBzb3VyY2VJbmRleCwgdGFyZ2V0SW5kZXgrKyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVtb3ZlIHByb3ZpZGVycyBmb3IgbWlzc2luZyBzZXJ2aWNlcy4KLSAgICAgICAgaWYgKHRhcmdldEluZGV4IDwgbVByb3ZpZGVycy5zaXplKCkpIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSBtUHJvdmlkZXJzLnNpemUoKSAtIDE7IGkgPj0gdGFyZ2V0SW5kZXg7IGktLSkgewotICAgICAgICAgICAgICAgIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChpKTsKLSAgICAgICAgICAgICAgICBtQ2FsbGJhY2sucmVtb3ZlUHJvdmlkZXIocHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIG1Qcm92aWRlcnMucmVtb3ZlKHByb3ZpZGVyKTsKLSAgICAgICAgICAgICAgICBwcm92aWRlci5zdG9wKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBmaW5kUHJvdmlkZXIoU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgY2xhc3NOYW1lKSB7Ci0gICAgICAgIGludCBjb3VudCA9IG1Qcm92aWRlcnMuc2l6ZSgpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIFJlZ2lzdGVyZWRNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIgPSBtUHJvdmlkZXJzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChwcm92aWRlci5oYXNDb21wb25lbnROYW1lKHBhY2thZ2VOYW1lLCBjbGFzc05hbWUpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgQnJvYWRjYXN0UmVjZWl2ZXIgbVNjYW5QYWNrYWdlc1JlY2VpdmVyID0gbmV3IEJyb2FkY2FzdFJlY2VpdmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgc2NhblBhY2thZ2VzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBSdW5uYWJsZSBtU2NhblBhY2thZ2VzUnVubmFibGUgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBzY2FuUGFja2FnZXMoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwdWJsaWMgaW50ZXJmYWNlIENhbGxiYWNrIHsKLSAgICAgICAgdm9pZCBhZGRQcm92aWRlcihNZWRpYVJvdXRlUHJvdmlkZXIgcHJvdmlkZXIpOwotICAgICAgICB2b2lkIHJlbW92ZVByb3ZpZGVyKE1lZGlhUm91dGVQcm92aWRlciBwcm92aWRlcik7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNjQ0OWIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLm1lZGlhOwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5CdWlsZDsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5SZXF1aXJlc0FwaTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuV2Vha1JlZmVyZW5jZTsKLQotLyoqCi0gKiBQcm92aWRlcyBhY2Nlc3MgdG8gZmVhdHVyZXMgb2YgdGhlIHJlbW90ZSBjb250cm9sIGNsaWVudC4KLSAqCi0gKiBIaWRkZW4gZm9yIG5vdyBidXQgd2UgbWlnaHQgd2FudCB0byBtYWtlIHRoaXMgYXZhaWxhYmxlIHRvIGFwcGxpY2F0aW9ucwotICogaW4gdGhlIGZ1dHVyZS4KLSAqLwotYWJzdHJhY3QgY2xhc3MgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCB7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtUmNjOwotICAgIHByb3RlY3RlZCBWb2x1bWVDYWxsYmFjayBtVm9sdW1lQ2FsbGJhY2s7Ci0KLSAgICBwcm90ZWN0ZWQgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdChDb250ZXh0IGNvbnRleHQsIE9iamVjdCByY2MpIHsKLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtUmNjID0gcmNjOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgUmVtb3RlQ29udHJvbENsaWVudENvbXBhdCBvYnRhaW4oQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMTYpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSmVsbHliZWFuSW1wbChjb250ZXh0LCByY2MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTGVnYWN5SW1wbChjb250ZXh0LCByY2MpOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVtb3RlQ29udHJvbENsaWVudCgpIHsKLSAgICAgICAgcmV0dXJuIG1SY2M7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBwbGF5YmFjayBpbmZvcm1hdGlvbi4KLSAgICAgKiBNdXN0IGJlIGNhbGxlZCBhdCBsZWFzdCBvbmNlIHRvIGF0dGFjaCB0byB0aGUgcmVtb3RlIGNvbnRyb2wgY2xpZW50LgotICAgICAqCi0gICAgICogQHBhcmFtIGluZm8gVGhlIHBsYXliYWNrIGluZm9ybWF0aW9uLiAgTXVzdCBub3QgYmUgbnVsbC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRQbGF5YmFja0luZm8oUGxheWJhY2tJbmZvIGluZm8pIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGEgY2FsbGJhY2sgdG8gcmVjZWl2ZSB2b2x1bWUgY2hhbmdlIHJlcXVlc3RzIGZyb20gdGhlIHJlbW90ZSBjb250cm9sIGNsaWVudC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBUaGUgdm9sdW1lIGNhbGxiYWNrIHRvIHVzZSBvciBudWxsIGlmIG5vbmUuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0Vm9sdW1lQ2FsbGJhY2soVm9sdW1lQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbVZvbHVtZUNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwbGF5YmFjay4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFBsYXliYWNrSW5mbyB7Ci0gICAgICAgIHB1YmxpYyBpbnQgdm9sdW1lOwotICAgICAgICBwdWJsaWMgaW50IHZvbHVtZU1heDsKLSAgICAgICAgcHVibGljIGludCB2b2x1bWVIYW5kbGluZyA9IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19WT0xVTUVfRklYRUQ7Ci0gICAgICAgIHB1YmxpYyBpbnQgcGxheWJhY2tTdHJlYW0gPSBBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDOwotICAgICAgICBwdWJsaWMgaW50IHBsYXliYWNrVHlwZSA9IE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19UWVBFX1JFTU9URTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiB2b2x1bWUgdXBkYXRlcyBhcmUgcmVxdWVzdGVkIGJ5IHRoZSByZW1vdGUgY29udHJvbCBjbGllbnQuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBWb2x1bWVDYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdm9sdW1lIHNob3VsZCBiZSBpbmNyZWFzZWQgb3IgZGVjcmVhc2VkLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGlyZWN0aW9uIEFuIGludGVnZXIgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB2b2x1bWUgaXMgdG8gYmUgaW5jcmVhc2VkCi0gICAgICAgICAqIChwb3NpdGl2ZSB2YWx1ZSkgb3IgZGVjcmVhc2VkIChuZWdhdGl2ZSB2YWx1ZSkuCi0gICAgICAgICAqIEZvciBidW5kbGVkIGNoYW5nZXMsIHRoZSBhYnNvbHV0ZSB2YWx1ZSBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBjaGFuZ2VzCi0gICAgICAgICAqIGluIHRoZSBzYW1lIGRpcmVjdGlvbiwgZS5nLiArMyBjb3JyZXNwb25kcyB0byB0aHJlZSAidm9sdW1lIHVwIiBjaGFuZ2VzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGludCBkaXJlY3Rpb24pOwotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgdm9sdW1lIGZvciB0aGUgcm91dGUgc2hvdWxkIGJlIHNldCB0byB0aGUgZ2l2ZW4gdmFsdWUuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSB2b2x1bWUgQW4gaW50ZWdlciBpbmRpY2F0aW5nIHRoZSBuZXcgdm9sdW1lIHZhbHVlIHRoYXQgc2hvdWxkIGJlIHVzZWQsCi0gICAgICAgICAqIGFsd2F5cyBiZXR3ZWVuIDAgYW5kIHRoZSB2YWx1ZSBzZXQgYnkge0BsaW5rIFBsYXliYWNrSW5mbyN2b2x1bWVNYXh9LgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVTZXRSZXF1ZXN0KGludCB2b2x1bWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExlZ2FjeSBpbXBsZW1lbnRhdGlvbiBmb3IgcGxhdGZvcm0gdmVyc2lvbnMgcHJpb3IgdG8gSmVsbHliZWFuLgotICAgICAqIERvZXMgbm90aGluZy4KLSAgICAgKi8KLSAgICBzdGF0aWMgY2xhc3MgTGVnYWN5SW1wbCBleHRlbmRzIFJlbW90ZUNvbnRyb2xDbGllbnRDb21wYXQgewotICAgICAgICBwdWJsaWMgTGVnYWN5SW1wbChDb250ZXh0IGNvbnRleHQsIE9iamVjdCByY2MpIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQsIHJjYyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBmb3IgSmVsbHliZWFuLgotICAgICAqCi0gICAgICogVGhlIGJhc2ljIGlkZWEgb2YgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyB0byBhdHRhY2ggdGhlIFJDQyB0byBhIFVzZXJSb3V0ZUluZm8KLSAgICAgKiBpbiBvcmRlciB0byBob29rIHVwIHN0cmVhbSBtZXRhZGF0YSBhbmQgdm9sdW1lIGNhbGxiYWNrcyBiZWNhdXNlIHRoZXJlIGlzIG5vCi0gICAgICogb3RoZXIgQVBJIGF2YWlsYWJsZSB0byBkbyBzbyBpbiB0aGlzIHBsYXRmb3JtIHZlcnNpb24uICBUaGUgVXNlclJvdXRlSW5mbyBpdHNlbGYKLSAgICAgKiBpcyBub3QgYXR0YWNoZWQgdG8gdGhlIE1lZGlhUm91dGVyIHNvIGl0IGlzIHRyYW5zcGFyZW50IHRvIHRoZSB1c2VyLgotICAgICAqLwotICAgIC8vIEBAUmVxdWlyZXNBcGkoMTYpCi0gICAgc3RhdGljIGNsYXNzIEplbGx5YmVhbkltcGwgZXh0ZW5kcyBSZW1vdGVDb250cm9sQ2xpZW50Q29tcGF0IHsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVJvdXRlck9iajsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqOwotICAgICAgICBwcml2YXRlIGZpbmFsIE9iamVjdCBtVXNlclJvdXRlT2JqOwotICAgICAgICBwcml2YXRlIGJvb2xlYW4gbVJlZ2lzdGVyZWQ7Ci0KLSAgICAgICAgcHVibGljIEplbGx5YmVhbkltcGwoQ29udGV4dCBjb250ZXh0LCBPYmplY3QgcmNjKSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0LCByY2MpOwotCi0gICAgICAgICAgICBtUm91dGVyT2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0TWVkaWFSb3V0ZXIoY29udGV4dCk7Ci0gICAgICAgICAgICBtVXNlclJvdXRlQ2F0ZWdvcnlPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVSb3V0ZUNhdGVnb3J5KAotICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCAiIiwgZmFsc2UpOwotICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVVzZXJSb3V0ZSgKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlck9iaiwgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5YmFja0luZm8oUGxheWJhY2tJbmZvIGluZm8pIHsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lKAotICAgICAgICAgICAgICAgICAgICBtVXNlclJvdXRlT2JqLCBpbmZvLnZvbHVtZSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZU1heCgKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby52b2x1bWVNYXgpOwotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVIYW5kbGluZygKLSAgICAgICAgICAgICAgICAgICAgbVVzZXJSb3V0ZU9iaiwgaW5mby52b2x1bWVIYW5kbGluZyk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFBsYXliYWNrU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICBtVXNlclJvdXRlT2JqLCBpbmZvLnBsYXliYWNrU3RyZWFtKTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0UGxheWJhY2tUeXBlKAotICAgICAgICAgICAgICAgICAgICBtVXNlclJvdXRlT2JqLCBpbmZvLnBsYXliYWNrVHlwZSk7Ci0KLSAgICAgICAgICAgIGlmICghbVJlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICBtUmVnaXN0ZXJlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uVXNlclJvdXRlSW5mby5zZXRWb2x1bWVDYWxsYmFjayhtVXNlclJvdXRlT2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlVm9sdW1lQ2FsbGJhY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBWb2x1bWVDYWxsYmFja1dyYXBwZXIodGhpcykpKTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFJlbW90ZUNvbnRyb2xDbGllbnQobVVzZXJSb3V0ZU9iaiwgbVJjYyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBWb2x1bWVDYWxsYmFja1dyYXBwZXIKLSAgICAgICAgICAgICAgICBpbXBsZW1lbnRzIE1lZGlhUm91dGVySmVsbHliZWFuLlZvbHVtZUNhbGxiYWNrIHsKLSAgICAgICAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHRoZSBmcmFtZXdvcmsgbmV2ZXIgdW5yZWdpc3RlcnMgaXRzIHZvbHVtZSBvYnNlcnZlciBmcm9tCi0gICAgICAgICAgICAvLyB0aGUgYXVkaW8gc2VydmljZSBzbyB0aGUgVXNlclJvdXRlSW5mbyBvYmplY3QgbWF5IGxlYWsgYWxvbmcgd2l0aAotICAgICAgICAgICAgLy8gYW55IGNhbGxiYWNrcyB0aGF0IHdlIGF0dGFjaCB0byBpdC4gIFVzZSBhIHdlYWsgcmVmZXJlbmNlIHRvIHByZXZlbnQKLSAgICAgICAgICAgIC8vIHRoZSB2b2x1bWUgY2FsbGJhY2sgZnJvbSBob2xkaW5nIHN0cm9uZyByZWZlcmVuY2VzIHRvIGFueXRoaW5nIGltcG9ydGFudC4KLSAgICAgICAgICAgIHByaXZhdGUgZmluYWwgV2Vha1JlZmVyZW5jZTxKZWxseWJlYW5JbXBsPiBtSW1wbFdlYWs7Ci0KLSAgICAgICAgICAgIHB1YmxpYyBWb2x1bWVDYWxsYmFja1dyYXBwZXIoSmVsbHliZWFuSW1wbCBpbXBsKSB7Ci0gICAgICAgICAgICAgICAgbUltcGxXZWFrID0gbmV3IFdlYWtSZWZlcmVuY2U8SmVsbHliZWFuSW1wbD4oaW1wbCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25Wb2x1bWVVcGRhdGVSZXF1ZXN0KE9iamVjdCByb3V0ZU9iaiwgaW50IGRpcmVjdGlvbikgewotICAgICAgICAgICAgICAgIEplbGx5YmVhbkltcGwgaW1wbCA9IG1JbXBsV2Vhay5nZXQoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW1wbCAhPSBudWxsICYmIGltcGwubVZvbHVtZUNhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgaW1wbC5tVm9sdW1lQ2FsbGJhY2sub25Wb2x1bWVVcGRhdGVSZXF1ZXN0KGRpcmVjdGlvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lU2V0UmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICBKZWxseWJlYW5JbXBsIGltcGwgPSBtSW1wbFdlYWsuZ2V0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKGltcGwgIT0gbnVsbCAmJiBpbXBsLm1Wb2x1bWVDYWxsYmFjayAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGltcGwubVZvbHVtZUNhbGxiYWNrLm9uVm9sdW1lU2V0UmVxdWVzdCh2b2x1bWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9SZW1vdGVQbGF5YmFja0NsaWVudC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZVBsYXliYWNrQ2xpZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2ZTE0OTcuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1JlbW90ZVBsYXliYWNrQ2xpZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmFwcC5QZW5kaW5nSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Ccm9hZGNhc3RSZWNlaXZlcjsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5JbnRlbnRGaWx0ZXI7Ci1pbXBvcnQgYW5kcm9pZC5uZXQuVXJpOwotaW1wb3J0IGFuZHJvaWQub3MuQnVuZGxlOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC52NC51dGlsLk9iamVjdHNDb21wYXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkxvZzsKLQotLyoqCi0gKiBBIGhlbHBlciBjbGFzcyBmb3IgcGxheWluZyBtZWRpYSBvbiByZW1vdGUgcm91dGVzIHVzaW5nIHRoZSByZW1vdGUgcGxheWJhY2sgcHJvdG9jb2wKLSAqIGRlZmluZWQgYnkge0BsaW5rIE1lZGlhQ29udHJvbEludGVudH0uCi0gKiA8cD4KLSAqIFRoZSBjbGllbnQgbWFpbnRhaW5zIHNlc3Npb24gc3RhdGUgYW5kIG9mZmVycyBhIHNpbXBsaWZpZWQgaW50ZXJmYWNlIGZvciBpc3N1aW5nCi0gKiByZW1vdGUgcGxheWJhY2sgbWVkaWEgY29udHJvbCBpbnRlbnRzIHRvIGEgc2luZ2xlIHJvdXRlLgotICogPC9wPgotICovCi1wdWJsaWMgY2xhc3MgUmVtb3RlUGxheWJhY2tDbGllbnQgewotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlJlbW90ZVBsYXliYWNrQ2xpZW50IjsKLSAgICBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IExvZy5pc0xvZ2dhYmxlKFRBRywgTG9nLkRFQlVHKTsKLQotICAgIHByaXZhdGUgZmluYWwgQ29udGV4dCBtQ29udGV4dDsKLSAgICBwcml2YXRlIGZpbmFsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBtUm91dGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBY3Rpb25SZWNlaXZlciBtQWN0aW9uUmVjZWl2ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBQZW5kaW5nSW50ZW50IG1JdGVtU3RhdHVzUGVuZGluZ0ludGVudDsKLSAgICBwcml2YXRlIGZpbmFsIFBlbmRpbmdJbnRlbnQgbVNlc3Npb25TdGF0dXNQZW5kaW5nSW50ZW50OwotICAgIHByaXZhdGUgZmluYWwgUGVuZGluZ0ludGVudCBtTWVzc2FnZVBlbmRpbmdJbnRlbnQ7Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjazsKLSAgICBwcml2YXRlIGJvb2xlYW4gbVJvdXRlU3VwcG9ydHNRdWV1aW5nOwotICAgIHByaXZhdGUgYm9vbGVhbiBtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50OwotICAgIHByaXZhdGUgYm9vbGVhbiBtUm91dGVTdXBwb3J0c01lc3NhZ2luZzsKLQotICAgIFN0cmluZyBtU2Vzc2lvbklkOwotICAgIFN0YXR1c0NhbGxiYWNrIG1TdGF0dXNDYWxsYmFjazsKLSAgICBPbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyIG1Pbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHJlbW90ZSBwbGF5YmFjayBjbGllbnQgZm9yIGEgcm91dGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcm91dGUgVGhlIG1lZGlhIHJvdXRlLgotICAgICAqLwotICAgIHB1YmxpYyBSZW1vdGVQbGF5YmFja0NsaWVudChDb250ZXh0IGNvbnRleHQsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZXh0IG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocm91dGUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigicm91dGUgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUNvbnRleHQgPSBjb250ZXh0OwotICAgICAgICBtUm91dGUgPSByb3V0ZTsKLQotICAgICAgICBJbnRlbnRGaWx0ZXIgYWN0aW9uRmlsdGVyID0gbmV3IEludGVudEZpbHRlcigpOwotICAgICAgICBhY3Rpb25GaWx0ZXIuYWRkQWN0aW9uKEFjdGlvblJlY2VpdmVyLkFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEKTsKLSAgICAgICAgYWN0aW9uRmlsdGVyLmFkZEFjdGlvbihBY3Rpb25SZWNlaXZlci5BQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCk7Ci0gICAgICAgIGFjdGlvbkZpbHRlci5hZGRBY3Rpb24oQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQpOwotICAgICAgICBtQWN0aW9uUmVjZWl2ZXIgPSBuZXcgQWN0aW9uUmVjZWl2ZXIoKTsKLSAgICAgICAgY29udGV4dC5yZWdpc3RlclJlY2VpdmVyKG1BY3Rpb25SZWNlaXZlciwgYWN0aW9uRmlsdGVyKTsKLQotICAgICAgICBJbnRlbnQgaXRlbVN0YXR1c0ludGVudCA9IG5ldyBJbnRlbnQoQWN0aW9uUmVjZWl2ZXIuQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQpOwotICAgICAgICBpdGVtU3RhdHVzSW50ZW50LnNldFBhY2thZ2UoY29udGV4dC5nZXRQYWNrYWdlTmFtZSgpKTsKLSAgICAgICAgbUl0ZW1TdGF0dXNQZW5kaW5nSW50ZW50ID0gUGVuZGluZ0ludGVudC5nZXRCcm9hZGNhc3QoCi0gICAgICAgICAgICAgICAgY29udGV4dCwgMCwgaXRlbVN0YXR1c0ludGVudCwgMCk7Ci0KLSAgICAgICAgSW50ZW50IHNlc3Npb25TdGF0dXNJbnRlbnQgPSBuZXcgSW50ZW50KEFjdGlvblJlY2VpdmVyLkFDVElPTl9TRVNTSU9OX1NUQVRVU19DSEFOR0VEKTsKLSAgICAgICAgc2Vzc2lvblN0YXR1c0ludGVudC5zZXRQYWNrYWdlKGNvbnRleHQuZ2V0UGFja2FnZU5hbWUoKSk7Ci0gICAgICAgIG1TZXNzaW9uU3RhdHVzUGVuZGluZ0ludGVudCA9IFBlbmRpbmdJbnRlbnQuZ2V0QnJvYWRjYXN0KAotICAgICAgICAgICAgICAgIGNvbnRleHQsIDAsIHNlc3Npb25TdGF0dXNJbnRlbnQsIDApOwotCi0gICAgICAgIEludGVudCBtZXNzYWdlSW50ZW50ID0gbmV3IEludGVudChBY3Rpb25SZWNlaXZlci5BQ1RJT05fTUVTU0FHRV9SRUNFSVZFRCk7Ci0gICAgICAgIG1lc3NhZ2VJbnRlbnQuc2V0UGFja2FnZShjb250ZXh0LmdldFBhY2thZ2VOYW1lKCkpOwotICAgICAgICBtTWVzc2FnZVBlbmRpbmdJbnRlbnQgPSBQZW5kaW5nSW50ZW50LmdldEJyb2FkY2FzdCgKLSAgICAgICAgICAgICAgICBjb250ZXh0LCAwLCBtZXNzYWdlSW50ZW50LCAwKTsKLSAgICAgICAgZGV0ZWN0RmVhdHVyZXMoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWxlYXNlcyByZXNvdXJjZXMgb3duZWQgYnkgdGhlIGNsaWVudC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCByZWxlYXNlKCkgewotICAgICAgICBtQ29udGV4dC51bnJlZ2lzdGVyUmVjZWl2ZXIobUFjdGlvblJlY2VpdmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIHJlbW90ZSBwbGF5YmFjay4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCByZW1vdGUgcGxheWJhY2ssIHRoZW4gbm9uZSBvZiB0aGUgZnVuY3Rpb25hbGl0eQotICAgICAqIG9mZmVyZWQgYnkgdGhlIGNsaWVudCB3aWxsIGJlIGF2YWlsYWJsZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGZvbGxvd2luZwotICAgICAqIGFjdGlvbnM6IHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BMQVkgcGxheX0sCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VFSyBzZWVrfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9HRVRfU1RBVFVTIGdldCBzdGF0dXN9LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BBVVNFIHBhdXNlfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRVNVTUUgcmVzdW1lfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVE9QIHN0b3B9LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiByZW1vdGUgcGxheWJhY2sgaXMgc3VwcG9ydGVkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGVTdXBwb3J0c1JlbW90ZVBsYXliYWNrOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgcXVldWluZyBmZWF0dXJlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBxdWV1aW5nLCB0aGVuIGF0IG1vc3Qgb25lIG1lZGlhIGl0ZW0gY2FuIGJlIHBsYXllZAotICAgICAqIGF0IGEgdGltZSBhbmQgdGhlIHtAbGluayAjZW5xdWV1ZX0gbWV0aG9kIHdpbGwgbm90IGJlIGF2YWlsYWJsZS4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGJhc2ljIHJlbW90ZSBwbGF5YmFjawotICAgICAqIGFjdGlvbnMgYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFjdGlvbnM6Ci0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5RVUVVRSBlbnF1ZXVlfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkUgcmVtb3ZlfS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgcXVldWluZyBpcyBzdXBwb3J0ZWQuICBJbXBsaWVzIHtAbGluayAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZH0KLSAgICAgKiBpcyBhbHNvIHRydWUuCi0gICAgICoKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNRdWV1aW5nU3VwcG9ydGVkKCkgewotICAgICAgICByZXR1cm4gbVJvdXRlU3VwcG9ydHNRdWV1aW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgc2Vzc2lvbiBtYW5hZ2VtZW50IGZlYXR1cmVzLgotICAgICAqIDxwPgotICAgICAqIElmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHNlc3Npb24gbWFuYWdlbWVudCwgdGhlbiB0aGUgc2Vzc2lvbiB3aWxsCi0gICAgICogbm90IGJlIGNyZWF0ZWQgdW50aWwgdGhlIGZpcnN0IG1lZGlhIGl0ZW0gaXMgcGxheWVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIHJvdXRlIHN1cHBvcnRzIGFsbCBvZiB0aGUgYmFzaWMgcmVtb3RlIHBsYXliYWNrCi0gICAgICogYWN0aW9ucyBhbmQgYWxsIG9mIHRoZSBmb2xsb3dpbmcgYWN0aW9uczoKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OIHN0YXJ0IHNlc3Npb259LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUyBnZXQgc2Vzc2lvbiBzdGF0dXN9LAotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OIGVuZCBzZXNzaW9ufS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRydWUgaWYgc2Vzc2lvbiBtYW5hZ2VtZW50IGlzIHN1cHBvcnRlZC4KLSAgICAgKiBJbXBsaWVzIHtAbGluayAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZH0gaXMgYWxzbyB0cnVlLgotICAgICAqCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzU2Vzc2lvbk1hbmFnZW1lbnRTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiBtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgcm91dGUgc3VwcG9ydHMgbWVzc2FnZXMuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSByb3V0ZSBzdXBwb3J0cyBhbGwgb2YgdGhlIGJhc2ljIHJlbW90ZSBwbGF5YmFjawotICAgICAqIGFjdGlvbnMgYW5kIGFsbCBvZiB0aGUgZm9sbG93aW5nIGFjdGlvbnM6Ci0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RBUlRfU0VTU0lPTiBzdGFydCBzZXNzaW9ufSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRU5EX01FU1NBR0Ugc2VuZCBtZXNzYWdlfSwKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTkRfU0VTU0lPTiBlbmQgc2Vzc2lvbn0uCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHNlc3Npb24gbWFuYWdlbWVudCBpcyBzdXBwb3J0ZWQuCi0gICAgICogSW1wbGllcyB7QGxpbmsgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWR9IGlzIGFsc28gdHJ1ZS4KLSAgICAgKgotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01lc3NhZ2luZ1N1cHBvcnRlZCgpIHsKLSAgICAgICAgcmV0dXJuIG1Sb3V0ZVN1cHBvcnRzTWVzc2FnaW5nOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGN1cnJlbnQgc2Vzc2lvbiBpZCBpZiB0aGVyZSBpcyBvbmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIFRoZSBjdXJyZW50IHNlc3Npb24gaWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldFNlc3Npb25JZCgpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9uSWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgY3VycmVudCBzZXNzaW9uIGlkLgotICAgICAqIDxwPgotICAgICAqIEl0IGlzIHVzdWFsbHkgbm90IG5lY2Vzc2FyeSB0byBzZXQgdGhlIHNlc3Npb24gaWQgZXhwbGljaXRseSBzaW5jZQotICAgICAqIGl0IGlzIGNyZWF0ZWQgYXMgYSBzaWRlLWVmZmVjdCBvZiBvdGhlciByZXF1ZXN0cyBzdWNoIGFzCi0gICAgICoge0BsaW5rICNwbGF5fSwge0BsaW5rICNlbnF1ZXVlfSwgYW5kIHtAbGluayAjc3RhcnRTZXNzaW9ufS4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBuZXcgc2Vzc2lvbiBpZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFNlc3Npb25JZChTdHJpbmcgc2Vzc2lvbklkKSB7Ci0gICAgICAgIGlmICghT2JqZWN0c0NvbXBhdC5lcXVhbHMobVNlc3Npb25JZCwgc2Vzc2lvbklkKSkgewotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiU2Vzc2lvbiBpZCBpcyBub3c6ICIgKyBzZXNzaW9uSWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlc3Npb25JZCA9IHNlc3Npb25JZDsKLSAgICAgICAgICAgIGlmIChtU3RhdHVzQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TdGF0dXNDYWxsYmFjay5vblNlc3Npb25DaGFuZ2VkKHNlc3Npb25JZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGNsaWVudCBjdXJyZW50bHkgaGFzIGEgc2Vzc2lvbi4KLSAgICAgKiA8cD4KLSAgICAgKiBFcXVpdmFsZW50IHRvIGNoZWNraW5nIHdoZXRoZXIge0BsaW5rICNnZXRTZXNzaW9uSWR9IHJldHVybnMgYSBub24tbnVsbCByZXN1bHQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHJldHVybiBUcnVlIGlmIHRoZXJlIGlzIGEgY3VycmVudCBzZXNzaW9uLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc1Nlc3Npb24oKSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbklkICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRoYXQgc2hvdWxkIHJlY2VpdmUgc3RhdHVzIHVwZGF0ZXMgd2hlbiB0aGUgc3RhdGUgb2YKLSAgICAgKiBtZWRpYSBzZXNzaW9ucyBvciBtZWRpYSBpdGVtcyBjcmVhdGVkIGJ5IHRoaXMgaW5zdGFuY2Ugb2YgdGhlIHJlbW90ZQotICAgICAqIHBsYXliYWNrIGNsaWVudCBjaGFuZ2VzLgotICAgICAqIDxwPgotICAgICAqIFRoZSBjYWxsYmFjayBzaG91bGQgYmUgc2V0IGJlZm9yZSB0aGUgc2Vzc2lvbiBpcyBjcmVhdGVkIG9yIGFueSBwbGF5Ci0gICAgICogY29tbWFuZHMgYXJlIGlzc3VlZC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgVGhlIGNhbGxiYWNrIHRvIHNldC4gIE1heSBiZSBudWxsIHRvIHJlbW92ZSB0aGUgcHJldmlvdXMgY2FsbGJhY2suCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3RhdHVzQ2FsbGJhY2soU3RhdHVzQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgbVN0YXR1c0NhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGNhbGxiYWNrIHRoYXQgc2hvdWxkIHJlY2VpdmUgbWVzc2FnZXMgd2hlbiBhIG1lc3NhZ2UgaXMgc2VudCBmcm9tCi0gICAgICogbWVkaWEgc2Vzc2lvbnMgY3JlYXRlZCBieSB0aGlzIGluc3RhbmNlIG9mIHRoZSByZW1vdGUgcGxheWJhY2sgY2xpZW50IGNoYW5nZXMuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGNhbGxiYWNrIHNob3VsZCBiZSBzZXQgYmVmb3JlIHRoZSBzZXNzaW9uIGlzIGNyZWF0ZWQuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGxpc3RlbmVyIFRoZSBjYWxsYmFjayB0byBzZXQuICBNYXkgYmUgbnVsbCB0byByZW1vdmUgdGhlIHByZXZpb3VzIGNhbGxiYWNrLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldE9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIoT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciBsaXN0ZW5lcikgewotICAgICAgICBtT25NZXNzYWdlUmVjZWl2ZWRMaXN0ZW5lciA9IGxpc3RlbmVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBwbGF5IGEgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBDbGVhcnMgdGhlIHF1ZXVlIGFuZCBzdGFydHMgcGxheWluZyB0aGUgbmV3IGl0ZW0gaW1tZWRpYXRlbHkuICBJZiB0aGUgcXVldWUKLSAgICAgKiB3YXMgcHJldmlvdXNseSBwYXVzZWQsIHRoZW4gaXQgaXMgcmVzdW1lZCBhcyBhIHNpZGUtZWZmZWN0IG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBubyBzZXNzaW9uIGlzIGF2YWlsYWJsZSwgdGhlbgotICAgICAqIG9uZSBpcyBjcmVhdGVkIGltcGxpY2l0bHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZIEFDVElPTl9QTEFZfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50VXJpIFRoZSBjb250ZW50IFVyaSB0byBwbGF5LgotICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LCBvciBudWxsIGlmIHVua25vd24uCi0gICAgICogQHBhcmFtIHBvc2l0aW9uTWlsbGlzIFRoZSBpbml0aWFsIGNvbnRlbnQgcG9zaXRpb24gZm9yIHRoZSBpdGVtIGluIG1pbGxpc2Vjb25kcywKLSAgICAgKiBvciA8Y29kZT4wPC9jb2RlPiB0byBzdGFydCBhdCB0aGUgYmVnaW5uaW5nLgotICAgICAqIEBwYXJhbSBtZXRhZGF0YSBUaGUgbWVkaWEgaXRlbSBtZXRhZGF0YSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QTEFZfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCByZW1vdGUgcGxheWJhY2suCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUExBWQotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwbGF5KFVyaSBjb250ZW50VXJpLCBTdHJpbmcgbWltZVR5cGUsIEJ1bmRsZSBtZXRhZGF0YSwKLSAgICAgICAgICAgIGxvbmcgcG9zaXRpb25NaWxsaXMsIEJ1bmRsZSBleHRyYXMsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBwbGF5T3JFbnF1ZXVlKGNvbnRlbnRVcmksIG1pbWVUeXBlLCBtZXRhZGF0YSwgcG9zaXRpb25NaWxsaXMsCi0gICAgICAgICAgICAgICAgZXh0cmFzLCBjYWxsYmFjaywgTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gZW5xdWV1ZSBhIG1lZGlhIGl0ZW0uCi0gICAgICogPHA+Ci0gICAgICogRW5xdWV1ZXMgYSBuZXcgaXRlbSB0byBwbGF5LiAgSWYgdGhlIHF1ZXVlIHdhcyBwcmV2aW91c2x5IHBhdXNlZCwgdGhlbiB3aWxsCi0gICAgICogcmVtYWluIHBhdXNlZC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBubyBzZXNzaW9uIGlzIGF2YWlsYWJsZSwgdGhlbgotICAgICAqIG9uZSBpcyBjcmVhdGVkIGltcGxpY2l0bHkuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFIEFDVElPTl9FTlFVRVVFfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBjb250ZW50VXJpIFRoZSBjb250ZW50IFVyaSB0byBlbnF1ZXVlLgotICAgICAqIEBwYXJhbSBtaW1lVHlwZSBUaGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LCBvciBudWxsIGlmIHVua25vd24uCi0gICAgICogQHBhcmFtIHBvc2l0aW9uTWlsbGlzIFRoZSBpbml0aWFsIGNvbnRlbnQgcG9zaXRpb24gZm9yIHRoZSBpdGVtIGluIG1pbGxpc2Vjb25kcywKLSAgICAgKiBvciA8Y29kZT4wPC9jb2RlPiB0byBzdGFydCBhdCB0aGUgYmVnaW5uaW5nLgotICAgICAqIEBwYXJhbSBtZXRhZGF0YSBUaGUgbWVkaWEgaXRlbSBtZXRhZGF0YSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9FTlFVRVVFfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCBxdWV1aW5nLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VOUVVFVUUKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICogQHNlZSAjaXNRdWV1aW5nU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZW5xdWV1ZShVcmkgY29udGVudFVyaSwgU3RyaW5nIG1pbWVUeXBlLCBCdW5kbGUgbWV0YWRhdGEsCi0gICAgICAgICAgICBsb25nIHBvc2l0aW9uTWlsbGlzLCBCdW5kbGUgZXh0cmFzLCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgcGxheU9yRW5xdWV1ZShjb250ZW50VXJpLCBtaW1lVHlwZSwgbWV0YWRhdGEsIHBvc2l0aW9uTWlsbGlzLAotICAgICAgICAgICAgICAgIGV4dHJhcywgY2FsbGJhY2ssIE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fRU5RVUVVRSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHBsYXlPckVucXVldWUoVXJpIGNvbnRlbnRVcmksIFN0cmluZyBtaW1lVHlwZSwgQnVuZGxlIG1ldGFkYXRhLAotICAgICAgICAgICAgbG9uZyBwb3NpdGlvbk1pbGxpcywgQnVuZGxlIGV4dHJhcywKLSAgICAgICAgICAgIGZpbmFsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaywgU3RyaW5nIGFjdGlvbikgewotICAgICAgICBpZiAoY29udGVudFVyaSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJjb250ZW50VXJpIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvd0lmUmVtb3RlUGxheWJhY2tOb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTlFVRVVFKSkgewotICAgICAgICAgICAgdGhyb3dJZlF1ZXVpbmdOb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KGFjdGlvbik7Ci0gICAgICAgIGludGVudC5zZXREYXRhQW5kVHlwZShjb250ZW50VXJpLCBtaW1lVHlwZSk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSLAotICAgICAgICAgICAgICAgIG1JdGVtU3RhdHVzUGVuZGluZ0ludGVudCk7Ci0gICAgICAgIGlmIChtZXRhZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fTUVUQURBVEEsIG1ldGFkYXRhKTsKLSAgICAgICAgfQotICAgICAgICBpZiAocG9zaXRpb25NaWxsaXMgIT0gMCkgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0NPTlRFTlRfUE9TSVRJT04sIHBvc2l0aW9uTWlsbGlzKTsKLSAgICAgICAgfQotICAgICAgICBwZXJmb3JtSXRlbUFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIG51bGwsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBzZWVrIHRvIGEgbmV3IHBvc2l0aW9uIGluIGEgbWVkaWEgaXRlbS4KLSAgICAgKiA8cD4KLSAgICAgKiBTZWVrcyB0byBhIG5ldyBwb3NpdGlvbi4gIElmIHRoZSBxdWV1ZSB3YXMgcHJldmlvdXNseSBwYXVzZWQgdGhlbiBpdAotICAgICAqIHJlbWFpbnMgcGF1c2VkIGJ1dCB0aGUgaXRlbSdzIG5ldyBwb3NpdGlvbiBpcyBzdGlsbCByZW1lbWJlcmVkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFRUsgQUNUSU9OX1NFRUt9IGZvcgotICAgICAqIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KLSAgICAgKiBAcGFyYW0gcG9zaXRpb25NaWxsaXMgVGhlIG5ldyBjb250ZW50IHBvc2l0aW9uIGZvciB0aGUgaXRlbSBpbiBtaWxsaXNlY29uZHMsCi0gICAgICogb3IgPGNvZGU+MDwvY29kZT4gdG8gc3RhcnQgYXQgdGhlIGJlZ2lubmluZy4KLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TRUVLfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFRUsKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VlayhTdHJpbmcgaXRlbUlkLCBsb25nIHBvc2l0aW9uTWlsbGlzLCBCdW5kbGUgZXh0cmFzLAotICAgICAgICAgICAgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChpdGVtSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbUlkIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU0VFSyk7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9DT05URU5UX1BPU0lUSU9OLCBwb3NpdGlvbk1pbGxpcyk7Ci0gICAgICAgIHBlcmZvcm1JdGVtQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgaXRlbUlkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gZ2V0IHRoZSBzdGF0dXMgb2YgYSBtZWRpYSBpdGVtLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUyBBQ1RJT05fR0VUX1NUQVRVU30gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gaXRlbUlkIFRoZSBpdGVtIGlkLgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TVEFUVVN9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NUQVRVUwotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBnZXRTdGF0dXMoU3RyaW5nIGl0ZW1JZCwgQnVuZGxlIGV4dHJhcywgSXRlbUFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChpdGVtSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiaXRlbUlkIG11c3Qgbm90IGJlIG51bGwiKTsKLSAgICAgICAgfQotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fR0VUX1NUQVRVUyk7Ci0gICAgICAgIHBlcmZvcm1JdGVtQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgaXRlbUlkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcmVtb3ZlIGEgbWVkaWEgaXRlbSBmcm9tIHRoZSBxdWV1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1JFTU9WRSBBQ1RJT05fUkVNT1ZFfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpdGVtSWQgVGhlIGl0ZW0gaWQuCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVNT1ZFfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgcXVldWluZy4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRU1PVkUKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICogQHNlZSAjaXNRdWV1aW5nU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKFN0cmluZyBpdGVtSWQsIEJ1bmRsZSBleHRyYXMsIEl0ZW1BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICBpZiAoaXRlbUlkID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIml0ZW1JZCBtdXN0IG5vdCBiZSBudWxsIik7Ci0gICAgICAgIH0KLSAgICAgICAgdGhyb3dJZlF1ZXVpbmdOb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1JFTU9WRSk7Ci0gICAgICAgIHBlcmZvcm1JdGVtQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgaXRlbUlkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcGF1c2UgbWVkaWEgcGxheWJhY2suCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiBwbGF5YmFjayBpcyBhbHJlYWR5IHBhdXNlZAotICAgICAqIHRoZW4gdGhlIHJlcXVlc3QgaGFzIG5vIGVmZmVjdC4KLSAgICAgKiA8L3A+PHA+Ci0gICAgICogUGxlYXNlIHJlZmVyIHRvIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1BBVVNFIEFDVElPTl9QQVVTRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QQVVTRX0gaW50ZW50LCBvciBudWxsIGlmIG5vbmUuCi0gICAgICogQHBhcmFtIGNhbGxiYWNrIEEgY2FsbGJhY2sgdG8gaW52b2tlIHdoZW4gdGhlIHJlcXVlc3QgaGFzIGJlZW4KLSAgICAgKiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9QQVVTRQotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBwYXVzZShCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1BBVVNFKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZW5kcyBhIHJlcXVlc3QgdG8gcmVzdW1lICh1bnBhdXNlKSBtZWRpYSBwbGF5YmFjay4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIElmIHBsYXliYWNrIGlzIG5vdCBwYXVzZWQKLSAgICAgKiB0aGVuIHRoZSByZXF1ZXN0IGhhcyBubyBlZmZlY3QuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRVNVTUUgQUNUSU9OX1JFU1VNRX0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9SRVNVTUV9IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiB0aGVyZSBpcyBubyBjdXJyZW50IHNlc3Npb24uCi0gICAgICoKLSAgICAgKiBAc2VlIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fUkVTVU1FCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHJlc3VtZShCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1JFU1VNRSk7Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbVNlc3Npb25JZCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIHN0b3AgbWVkaWEgcGxheWJhY2sgYW5kIGNsZWFyIHRoZSBtZWRpYSBwbGF5YmFjayBxdWV1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgcmVxdWVzdCBpcyBpc3N1ZWQgaW4gdGhlIGN1cnJlbnQgc2Vzc2lvbi4gIElmIHRoZSBxdWV1ZSBpcyBhbHJlYWR5Ci0gICAgICogZW1wdHkgdGhlbiB0aGUgcmVxdWVzdCBoYXMgbm8gZWZmZWN0LgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU1RPUCBBQ1RJT05fU1RPUH0gZm9yCi0gICAgICogbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoaXMgcmVxdWVzdC4KLSAgICAgKiA8L3A+Ci0gICAgICoKLSAgICAgKiBAcGFyYW0gZXh0cmFzIEEgYnVuZGxlIG9mIGV4dHJhIGFyZ3VtZW50cyB0byBiZSBhZGRlZCB0byB0aGUKLSAgICAgKiB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVE9QfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUT1AKLSAgICAgKiBAc2VlICNpc1JlbW90ZVBsYXliYWNrU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc3RvcChCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX1NUT1ApOwotICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBzdGFydCBhIG5ldyBtZWRpYSBwbGF5YmFjayBzZXNzaW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSBhcHBsaWNhdGlvbiBtdXN0IHdhaXQgZm9yIHRoZSBjYWxsYmFjayB0byBpbmRpY2F0ZSB0aGF0IHRoaXMgcmVxdWVzdAotICAgICAqIGlzIGNvbXBsZXRlIGJlZm9yZSBpc3N1aW5nIG90aGVyIHJlcXVlc3RzIHRoYXQgYWZmZWN0IHRoZSBzZXNzaW9uLiAgSWYgdGhpcwotICAgICAqIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCB0aGVuIHRoZSBwcmV2aW91cyBzZXNzaW9uIHdpbGwgYmUgaW52YWxpZGF0ZWQuCi0gICAgICogPC9wPjxwPgotICAgICAqIFBsZWFzZSByZWZlciB0byB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OIEFDVElPTl9TVEFSVF9TRVNTSU9OfQotICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NUQVJUX1NFU1NJT059IGludGVudCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqIEBwYXJhbSBjYWxsYmFjayBBIGNhbGxiYWNrIHRvIGludm9rZSB3aGVuIHRoZSByZXF1ZXN0IGhhcyBiZWVuCi0gICAgICogcHJvY2Vzc2VkLCBvciBudWxsIGlmIG5vbmUuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHNlc3Npb24gbWFuYWdlbWVudC4KLSAgICAgKgotICAgICAqIEBzZWUgTWVkaWFDb250cm9sSW50ZW50I0FDVElPTl9TVEFSVF9TRVNTSU9OCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqIEBzZWUgI2lzU2Vzc2lvbk1hbmFnZW1lbnRTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzdGFydFNlc3Npb24oQnVuZGxlIGV4dHJhcywgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIHRocm93SWZTZXNzaW9uTWFuYWdlbWVudE5vdFN1cHBvcnRlZCgpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU1RBUlRfU0VTU0lPTik7Ci0gICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9TVEFUVVNfVVBEQVRFX1JFQ0VJVkVSLAotICAgICAgICAgICAgICAgIG1TZXNzaW9uU3RhdHVzUGVuZGluZ0ludGVudCk7Ci0gICAgICAgIGlmIChtUm91dGVTdXBwb3J0c01lc3NhZ2luZykgewotICAgICAgICAgICAgaW50ZW50LnB1dEV4dHJhKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9NRVNTQUdFX1JFQ0VJVkVSLCBtTWVzc2FnZVBlbmRpbmdJbnRlbnQpOwotICAgICAgICB9Ci0gICAgICAgIHBlcmZvcm1TZXNzaW9uQWN0aW9uKGludGVudCwgbnVsbCwgZXh0cmFzLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSBtZXNzYWdlLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fU0VORF9NRVNTQUdFfSBmb3IKLSAgICAgKiBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlIEEgYnVuZGxlIG1lc3NhZ2UgZGVub3Rpbmcge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFWFRSQV9NRVNTQUdFfS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbiBwcm9jZXNzZWQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHRoZXJlIGlzIG5vIGN1cnJlbnQgc2Vzc2lvbi4KLSAgICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IG1lc3NhZ2VzLgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX1NFTkRfTUVTU0FHRQotICAgICAqIEBzZWUgI2lzTWVzc2FnaW5nU3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2VuZE1lc3NhZ2UoQnVuZGxlIG1lc3NhZ2UsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpOwotICAgICAgICB0aHJvd0lmTWVzc2FnZU5vdFN1cHBvcnRlZCgpOwotCi0gICAgICAgIEludGVudCBpbnRlbnQgPSBuZXcgSW50ZW50KE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fU0VORF9NRVNTQUdFKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBtZXNzYWdlLCBjYWxsYmFjayk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VuZHMgYSByZXF1ZXN0IHRvIGdldCB0aGUgc3RhdHVzIG9mIHRoZSBtZWRpYSBwbGF5YmFjayBzZXNzaW9uLgotICAgICAqIDxwPgotICAgICAqIFRoZSByZXF1ZXN0IGlzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBzZXNzaW9uLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTCi0gICAgICogQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVU30gZm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNlbWFudGljcyBvZiB0aGlzIHJlcXVlc3QuCi0gICAgICogPC9wPgotICAgICAqCi0gICAgICogQHBhcmFtIGV4dHJhcyBBIGJ1bmRsZSBvZiBleHRyYSBhcmd1bWVudHMgdG8gYmUgYWRkZWQgdG8gdGhlCi0gICAgICoge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fR0VUX1NFU1NJT05fU1RBVFVTfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgc2Vzc2lvbiBtYW5hZ2VtZW50LgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0dFVF9TRVNTSU9OX1NUQVRVUwotICAgICAqIEBzZWUgI2lzUmVtb3RlUGxheWJhY2tTdXBwb3J0ZWQKLSAgICAgKiBAc2VlICNpc1Nlc3Npb25NYW5hZ2VtZW50U3VwcG9ydGVkCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgZ2V0U2Vzc2lvblN0YXR1cyhCdW5kbGUgZXh0cmFzLCBTZXNzaW9uQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgdGhyb3dJZlNlc3Npb25NYW5hZ2VtZW50Tm90U3VwcG9ydGVkKCk7Ci0gICAgICAgIHRocm93SWZOb0N1cnJlbnRTZXNzaW9uKCk7Ci0KLSAgICAgICAgSW50ZW50IGludGVudCA9IG5ldyBJbnRlbnQoTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMpOwotICAgICAgICBwZXJmb3JtU2Vzc2lvbkFjdGlvbihpbnRlbnQsIG1TZXNzaW9uSWQsIGV4dHJhcywgY2FsbGJhY2spOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlbmRzIGEgcmVxdWVzdCB0byBlbmQgdGhlIG1lZGlhIHBsYXliYWNrIHNlc3Npb24uCi0gICAgICogPHA+Ci0gICAgICogVGhlIHJlcXVlc3QgaXMgaXNzdWVkIGluIHRoZSBjdXJyZW50IHNlc3Npb24uICBJZiB0aGlzIHJlcXVlc3QgaXMgc3VjY2Vzc2Z1bCwKLSAgICAgKiB0aGUge0BsaW5rICNnZXRTZXNzaW9uSWQgc2Vzc2lvbiBpZCBwcm9wZXJ0eX0gd2lsbCBiZSBzZXQgdG8gbnVsbCBhZnRlcgotICAgICAqIHRoZSBjYWxsYmFjayBpcyBpbnZva2VkLgotICAgICAqIDwvcD48cD4KLSAgICAgKiBQbGVhc2UgcmVmZXIgdG8ge0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNBQ1RJT05fRU5EX1NFU1NJT04gQUNUSU9OX0VORF9TRVNTSU9OfQotICAgICAqIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzZW1hbnRpY3Mgb2YgdGhpcyByZXF1ZXN0LgotICAgICAqIDwvcD4KLSAgICAgKgotICAgICAqIEBwYXJhbSBleHRyYXMgQSBidW5kbGUgb2YgZXh0cmEgYXJndW1lbnRzIHRvIGJlIGFkZGVkIHRvIHRoZQotICAgICAqIHtAbGluayBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OfSBpbnRlbnQsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgKiBAcGFyYW0gY2FsbGJhY2sgQSBjYWxsYmFjayB0byBpbnZva2Ugd2hlbiB0aGUgcmVxdWVzdCBoYXMgYmVlbgotICAgICAqIHByb2Nlc3NlZCwgb3IgbnVsbCBpZiBub25lLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24gaWYgdGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLgotICAgICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgc2Vzc2lvbiBtYW5hZ2VtZW50LgotICAgICAqCi0gICAgICogQHNlZSBNZWRpYUNvbnRyb2xJbnRlbnQjQUNUSU9OX0VORF9TRVNTSU9OCi0gICAgICogQHNlZSAjaXNSZW1vdGVQbGF5YmFja1N1cHBvcnRlZAotICAgICAqIEBzZWUgI2lzU2Vzc2lvbk1hbmFnZW1lbnRTdXBwb3J0ZWQKLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBlbmRTZXNzaW9uKEJ1bmRsZSBleHRyYXMsIFNlc3Npb25BY3Rpb25DYWxsYmFjayBjYWxsYmFjaykgewotICAgICAgICB0aHJvd0lmU2Vzc2lvbk1hbmFnZW1lbnROb3RTdXBwb3J0ZWQoKTsKLSAgICAgICAgdGhyb3dJZk5vQ3VycmVudFNlc3Npb24oKTsKLQotICAgICAgICBJbnRlbnQgaW50ZW50ID0gbmV3IEludGVudChNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VORF9TRVNTSU9OKTsKLSAgICAgICAgcGVyZm9ybVNlc3Npb25BY3Rpb24oaW50ZW50LCBtU2Vzc2lvbklkLCBleHRyYXMsIGNhbGxiYWNrKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcGVyZm9ybUl0ZW1BY3Rpb24oZmluYWwgSW50ZW50IGludGVudCwKLSAgICAgICAgICAgIGZpbmFsIFN0cmluZyBzZXNzaW9uSWQsIGZpbmFsIFN0cmluZyBpdGVtSWQsCi0gICAgICAgICAgICBCdW5kbGUgZXh0cmFzLCBmaW5hbCBJdGVtQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2spIHsKLSAgICAgICAgaW50ZW50LmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOwotICAgICAgICBpZiAoc2Vzc2lvbklkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCwgc2Vzc2lvbklkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaXRlbUlkICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9JRCwgaXRlbUlkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZXh0cmFzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGludGVudC5wdXRFeHRyYXMoZXh0cmFzKTsKLSAgICAgICAgfQotICAgICAgICBsb2dSZXF1ZXN0KGludGVudCk7Ci0gICAgICAgIG1Sb3V0ZS5zZW5kQ29udHJvbFJlcXVlc3QoaW50ZW50LCBuZXcgTWVkaWFSb3V0ZXIuQ29udHJvbFJlcXVlc3RDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgICAgICBpZiAoZGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBzZXNzaW9uSWRSZXN1bHQgPSBpbmZlck1pc3NpbmdSZXN1bHQoc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX0lEKSk7Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzID0gTWVkaWFTZXNzaW9uU3RhdHVzLmZyb21CdW5kbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRCdW5kbGUoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fU1RBVFVTKSk7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBpdGVtSWRSZXN1bHQgPSBpbmZlck1pc3NpbmdSZXN1bHQoaXRlbUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0U3RyaW5nKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9JVEVNX0lEKSk7Ci0gICAgICAgICAgICAgICAgICAgIE1lZGlhSXRlbVN0YXR1cyBpdGVtU3RhdHVzID0gTWVkaWFJdGVtU3RhdHVzLmZyb21CdW5kbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS5nZXRCdW5kbGUoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX0lURU1fU1RBVFVTKSk7Ci0gICAgICAgICAgICAgICAgICAgIGFkb3B0U2Vzc2lvbihzZXNzaW9uSWRSZXN1bHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvbklkUmVzdWx0ICE9IG51bGwgJiYgaXRlbUlkUmVzdWx0ICE9IG51bGwgJiYgaXRlbVN0YXR1cyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCByZXN1bHQgZnJvbSAiICsgaW50ZW50LmdldEFjdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IGRhdGE9IiArIGJ1bmRsZVRvU3RyaW5nKGRhdGEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25JZD0iICsgc2Vzc2lvbklkUmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25TdGF0dXM9IiArIHNlc3Npb25TdGF0dXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaXRlbUlkPSIgKyBpdGVtSWRSZXN1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgaXRlbVN0YXR1cz0iICsgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJlc3VsdChkYXRhLCBzZXNzaW9uSWRSZXN1bHQsIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1JZFJlc3VsdCwgaXRlbVN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaGFuZGxlSW52YWxpZFJlc3VsdChpbnRlbnQsIGNhbGxiYWNrLCBkYXRhKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKFN0cmluZyBlcnJvciwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgICAgICAgICBoYW5kbGVFcnJvcihpbnRlbnQsIGNhbGxiYWNrLCBlcnJvciwgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwZXJmb3JtU2Vzc2lvbkFjdGlvbihmaW5hbCBJbnRlbnQgaW50ZW50LCBmaW5hbCBTdHJpbmcgc2Vzc2lvbklkLAotICAgICAgICAgICAgQnVuZGxlIGV4dHJhcywgZmluYWwgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSB7Ci0gICAgICAgIGludGVudC5hZGRDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKTsKLSAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fSUQsIHNlc3Npb25JZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV4dHJhcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnRlbnQucHV0RXh0cmFzKGV4dHJhcyk7Ci0gICAgICAgIH0KLSAgICAgICAgbG9nUmVxdWVzdChpbnRlbnQpOwotICAgICAgICBtUm91dGUuc2VuZENvbnRyb2xSZXF1ZXN0KGludGVudCwgbmV3IE1lZGlhUm91dGVyLkNvbnRyb2xSZXF1ZXN0Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uUmVzdWx0KEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkUmVzdWx0ID0gaW5mZXJNaXNzaW5nUmVzdWx0KHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmdldFN0cmluZyhNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCkpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cyA9IE1lZGlhU2Vzc2lvblN0YXR1cy5mcm9tQnVuZGxlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuZ2V0QnVuZGxlKE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9TRVNTSU9OX1NUQVRVUykpOwotICAgICAgICAgICAgICAgICAgICBhZG9wdFNlc3Npb24oc2Vzc2lvbklkUmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25JZFJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCByZXN1bHQgZnJvbSAiICsgaW50ZW50LmdldEFjdGlvbigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICI6IGRhdGE9IiArIGJ1bmRsZVRvU3RyaW5nKGRhdGEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25JZD0iICsgc2Vzc2lvbklkUmVzdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25TdGF0dXM9IiArIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxsYmFjay5vblJlc3VsdChkYXRhLCBzZXNzaW9uSWRSZXN1bHQsIHNlc3Npb25TdGF0dXMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW50ZW50LmdldEFjdGlvbigpLmVxdWFscyhNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VORF9TRVNTSU9OKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgc2Vzc2lvbklkUmVzdWx0LmVxdWFscyhtU2Vzc2lvbklkKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRTZXNzaW9uSWQobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGhhbmRsZUludmFsaWRSZXN1bHQoaW50ZW50LCBjYWxsYmFjaywgZGF0YSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25FcnJvcihTdHJpbmcgZXJyb3IsIEJ1bmRsZSBkYXRhKSB7Ci0gICAgICAgICAgICAgICAgaGFuZGxlRXJyb3IoaW50ZW50LCBjYWxsYmFjaywgZXJyb3IsIGRhdGEpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICB9Ci0KLSAgICB2b2lkIGFkb3B0U2Vzc2lvbihTdHJpbmcgc2Vzc2lvbklkKSB7Ci0gICAgICAgIGlmIChzZXNzaW9uSWQgIT0gbnVsbCkgewotICAgICAgICAgICAgc2V0U2Vzc2lvbklkKHNlc3Npb25JZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGhhbmRsZUludmFsaWRSZXN1bHQoSW50ZW50IGludGVudCwgQWN0aW9uQ2FsbGJhY2sgY2FsbGJhY2ssCi0gICAgICAgICAgICBCdW5kbGUgZGF0YSkgewotICAgICAgICBMb2cudyhUQUcsICJSZWNlaXZlZCBpbnZhbGlkIHJlc3VsdCBkYXRhIGZyb20gIiArIGludGVudC5nZXRBY3Rpb24oKQotICAgICAgICAgICAgICAgICsgIjogZGF0YT0iICsgYnVuZGxlVG9TdHJpbmcoZGF0YSkpOwotICAgICAgICBjYWxsYmFjay5vbkVycm9yKG51bGwsIE1lZGlhQ29udHJvbEludGVudC5FUlJPUl9VTktOT1dOLCBkYXRhKTsKLSAgICB9Ci0KLSAgICB2b2lkIGhhbmRsZUVycm9yKEludGVudCBpbnRlbnQsIEFjdGlvbkNhbGxiYWNrIGNhbGxiYWNrLAotICAgICAgICAgICAgU3RyaW5nIGVycm9yLCBCdW5kbGUgZGF0YSkgewotICAgICAgICBmaW5hbCBpbnQgY29kZTsKLSAgICAgICAgaWYgKGRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgY29kZSA9IGRhdGEuZ2V0SW50KE1lZGlhQ29udHJvbEludGVudC5FWFRSQV9FUlJPUl9DT0RFLAotICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xJbnRlbnQuRVJST1JfVU5LTk9XTik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjb2RlID0gTWVkaWFDb250cm9sSW50ZW50LkVSUk9SX1VOS05PV047Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJSZWNlaXZlZCBlcnJvciBmcm9tICIgKyBpbnRlbnQuZ2V0QWN0aW9uKCkKLSAgICAgICAgICAgICAgICAgICAgKyAiOiBlcnJvcj0iICsgZXJyb3IKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBjb2RlPSIgKyBjb2RlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgZGF0YT0iICsgYnVuZGxlVG9TdHJpbmcoZGF0YSkpOwotICAgICAgICB9Ci0gICAgICAgIGNhbGxiYWNrLm9uRXJyb3IoZXJyb3IsIGNvZGUsIGRhdGEpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkZXRlY3RGZWF0dXJlcygpIHsKLSAgICAgICAgbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjayA9IHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QTEFZKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TRUVLKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9HRVRfU1RBVFVTKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9QQVVTRSkKLSAgICAgICAgICAgICAgICAmJiByb3V0ZVN1cHBvcnRzQWN0aW9uKE1lZGlhQ29udHJvbEludGVudC5BQ1RJT05fUkVTVU1FKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TVE9QKTsKLSAgICAgICAgbVJvdXRlU3VwcG9ydHNRdWV1aW5nID0gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjawotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9FTlFVRVVFKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9SRU1PVkUpOwotICAgICAgICBtUm91dGVTdXBwb3J0c1Nlc3Npb25NYW5hZ2VtZW50ID0gbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjawotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TVEFSVF9TRVNTSU9OKQotICAgICAgICAgICAgICAgICYmIHJvdXRlU3VwcG9ydHNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9HRVRfU0VTU0lPTl9TVEFUVVMpCi0gICAgICAgICAgICAgICAgJiYgcm91dGVTdXBwb3J0c0FjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQUNUSU9OX0VORF9TRVNTSU9OKTsKLSAgICAgICAgbVJvdXRlU3VwcG9ydHNNZXNzYWdpbmcgPSBkb2VzUm91dGVTdXBwb3J0TWVzc2FnaW5nKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIHJvdXRlU3VwcG9ydHNBY3Rpb24oU3RyaW5nIGFjdGlvbikgewotICAgICAgICByZXR1cm4gbVJvdXRlLnN1cHBvcnRzQ29udHJvbEFjdGlvbihNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLLCBhY3Rpb24pOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBkb2VzUm91dGVTdXBwb3J0TWVzc2FnaW5nKCkgewotICAgICAgICBmb3IgKEludGVudEZpbHRlciBmaWx0ZXIgOiBtUm91dGUuZ2V0Q29udHJvbEZpbHRlcnMoKSkgewotICAgICAgICAgICAgaWYgKGZpbHRlci5oYXNBY3Rpb24oTWVkaWFDb250cm9sSW50ZW50LkFDVElPTl9TRU5EX01FU1NBR0UpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0aHJvd0lmUmVtb3RlUGxheWJhY2tOb3RTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIGlmICghbVJvdXRlU3VwcG9ydHNSZW1vdGVQbGF5YmFjaykgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJUaGUgcm91dGUgZG9lcyBub3Qgc3VwcG9ydCByZW1vdGUgcGxheWJhY2suIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZlF1ZXVpbmdOb3RTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIGlmICghbVJvdXRlU3VwcG9ydHNRdWV1aW5nKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oIlRoZSByb3V0ZSBkb2VzIG5vdCBzdXBwb3J0IHF1ZXVpbmcuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZlNlc3Npb25NYW5hZ2VtZW50Tm90U3VwcG9ydGVkKCkgewotICAgICAgICBpZiAoIW1Sb3V0ZVN1cHBvcnRzU2Vzc2lvbk1hbmFnZW1lbnQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgIgotICAgICAgICAgICAgICAgICAgICArICJzZXNzaW9uIG1hbmFnZW1lbnQuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdGhyb3dJZk1lc3NhZ2VOb3RTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIGlmICghbVJvdXRlU3VwcG9ydHNNZXNzYWdpbmcpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigiVGhlIHJvdXRlIGRvZXMgbm90IHN1cHBvcnQgbWVzc2FnZS4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0aHJvd0lmTm9DdXJyZW50U2Vzc2lvbigpIHsKLSAgICAgICAgaWYgKG1TZXNzaW9uSWQgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiVGhlcmUgaXMgbm8gY3VycmVudCBzZXNzaW9uLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3RhdGljIFN0cmluZyBpbmZlck1pc3NpbmdSZXN1bHQoU3RyaW5nIHJlcXVlc3QsIFN0cmluZyByZXN1bHQpIHsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBSZXN1bHQgaXMgbWlzc2luZy4KLSAgICAgICAgICAgIHJldHVybiByZXF1ZXN0OwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXF1ZXN0ID09IG51bGwgfHwgcmVxdWVzdC5lcXVhbHMocmVzdWx0KSkgewotICAgICAgICAgICAgLy8gUmVxdWVzdCBkaWRuJ3Qgc3BlY2lmeSBhIHZhbHVlIG9yIHJlc3VsdCBtYXRjaGVzIHJlcXVlc3QuCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIC8vIFJlc3VsdCBjb25mbGljdHMgd2l0aCByZXF1ZXN0LgotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGxvZ1JlcXVlc3QoSW50ZW50IGludGVudCkgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIlNlbmRpbmcgcmVxdWVzdDogIiArIGludGVudCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgU3RyaW5nIGJ1bmRsZVRvU3RyaW5nKEJ1bmRsZSBidW5kbGUpIHsKLSAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBidW5kbGUuc2l6ZSgpOyAvLyBmb3JjZSBidW5kbGUgdG8gYmUgdW5wYXJjZWxsZWQKLSAgICAgICAgICAgIHJldHVybiBidW5kbGUudG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gIm51bGwiOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgY2xhc3MgQWN0aW9uUmVjZWl2ZXIgZXh0ZW5kcyBCcm9hZGNhc3RSZWNlaXZlciB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEFDVElPTl9JVEVNX1NUQVRVU19DSEFOR0VEID0KLSAgICAgICAgICAgICAgICAiYW5kcm9pZC5zdXBwb3J0LnY3Lm1lZGlhLmFjdGlvbnMuQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQiOwotICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBBQ1RJT05fU0VTU0lPTl9TVEFUVVNfQ0hBTkdFRCA9Ci0gICAgICAgICAgICAgICAgImFuZHJvaWQuc3VwcG9ydC52Ny5tZWRpYS5hY3Rpb25zLkFDVElPTl9TRVNTSU9OX1NUQVRVU19DSEFOR0VEIjsKLSAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQUNUSU9OX01FU1NBR0VfUkVDRUlWRUQgPQotICAgICAgICAgICAgICAgICJhbmRyb2lkLnN1cHBvcnQudjcubWVkaWEuYWN0aW9ucy5BQ1RJT05fTUVTU0FHRV9SRUNFSVZFRCI7Ci0KLSAgICAgICAgQWN0aW9uUmVjZWl2ZXIoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25SZWNlaXZlKENvbnRleHQgY29udGV4dCwgSW50ZW50IGludGVudCkgewotICAgICAgICAgICAgU3RyaW5nIHNlc3Npb25JZCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfU0VTU0lPTl9JRCk7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IG51bGwgfHwgIXNlc3Npb25JZC5lcXVhbHMobVNlc3Npb25JZCkpIHsKLSAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjYXJkaW5nIHNwdXJpb3VzIHN0YXR1cyBjYWxsYmFjayAiCi0gICAgICAgICAgICAgICAgICAgICAgICArICJ3aXRoIG1pc3Npbmcgb3IgaW52YWxpZCBzZXNzaW9uIGlkOiBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cyA9IE1lZGlhU2Vzc2lvblN0YXR1cy5mcm9tQnVuZGxlKAotICAgICAgICAgICAgICAgICAgICBpbnRlbnQuZ2V0QnVuZGxlRXh0cmEoTWVkaWFDb250cm9sSW50ZW50LkVYVFJBX1NFU1NJT05fU1RBVFVTKSk7Ci0gICAgICAgICAgICBTdHJpbmcgYWN0aW9uID0gaW50ZW50LmdldEFjdGlvbigpOwotICAgICAgICAgICAgaWYgKGFjdGlvbi5lcXVhbHMoQUNUSU9OX0lURU1fU1RBVFVTX0NIQU5HRUQpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCA9IGludGVudC5nZXRTdHJpbmdFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9JRCk7Ci0gICAgICAgICAgICAgICAgaWYgKGl0ZW1JZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRpc2NhcmRpbmcgc3B1cmlvdXMgc3RhdHVzIGNhbGxiYWNrIHdpdGggbWlzc2luZyBpdGVtIGlkLiIpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMgPSBNZWRpYUl0ZW1TdGF0dXMuZnJvbUJ1bmRsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRCdW5kbGVFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfSVRFTV9TVEFUVVMpKTsKLSAgICAgICAgICAgICAgICBpZiAoaXRlbVN0YXR1cyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIExvZy53KFRBRywgIkRpc2NhcmRpbmcgc3B1cmlvdXMgc3RhdHVzIGNhbGxiYWNrIHdpdGggbWlzc2luZyBpdGVtIHN0YXR1cy4iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCBpdGVtIHN0YXR1cyBjYWxsYmFjazogc2Vzc2lvbklkPSIgKyBzZXNzaW9uSWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlc3Npb25TdGF0dXM9IiArIHNlc3Npb25TdGF0dXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGl0ZW1JZD0iICsgaXRlbUlkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBpdGVtU3RhdHVzPSIgKyBpdGVtU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0NhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0NhbGxiYWNrLm9uSXRlbVN0YXR1c0NoYW5nZWQoaW50ZW50LmdldEV4dHJhcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cywgaXRlbUlkLCBpdGVtU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGFjdGlvbi5lcXVhbHMoQUNUSU9OX1NFU1NJT05fU1RBVFVTX0NIQU5HRUQpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHNlc3Npb25TdGF0dXMgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBMb2cudyhUQUcsICJEaXNjYXJkaW5nIHNwdXJpb3VzIG1lZGlhIHN0YXR1cyBjYWxsYmFjayB3aXRoICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArIm1pc3Npbmcgc2Vzc2lvbiBzdGF0dXMuIik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiUmVjZWl2ZWQgc2Vzc2lvbiBzdGF0dXMgY2FsbGJhY2s6IHNlc3Npb25JZD0iICsgc2Vzc2lvbklkCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBzZXNzaW9uU3RhdHVzPSIgKyBzZXNzaW9uU3RhdHVzKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAobVN0YXR1c0NhbGxiYWNrICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXR1c0NhbGxiYWNrLm9uU2Vzc2lvblN0YXR1c0NoYW5nZWQoaW50ZW50LmdldEV4dHJhcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgc2Vzc2lvblN0YXR1cyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChhY3Rpb24uZXF1YWxzKEFDVElPTl9NRVNTQUdFX1JFQ0VJVkVEKSkgewotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJSZWNlaXZlZCBtZXNzYWdlIGNhbGxiYWNrOiBzZXNzaW9uSWQ9IiArIHNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaWYgKG1Pbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU9uTWVzc2FnZVJlY2VpdmVkTGlzdGVuZXIub25NZXNzYWdlUmVjZWl2ZWQoc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVudC5nZXRCdW5kbGVFeHRyYShNZWRpYUNvbnRyb2xJbnRlbnQuRVhUUkFfTUVTU0FHRSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgY2FsbGJhY2sgdGhhdCB3aWxsIHJlY2VpdmUgbWVkaWEgc3RhdHVzIHVwZGF0ZXMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBTdGF0dXNDYWxsYmFjayB7Ci0gICAgICAgIC8qKgotICAgICAgICAgKiBDYWxsZWQgd2hlbiB0aGUgc3RhdHVzIG9mIGEgbWVkaWEgaXRlbSBjaGFuZ2VzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgcmVzdWx0IGRhdGEgYnVuZGxlLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbklkIFRoZSBzZXNzaW9uIGlkLgotICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvblN0YXR1cyBUaGUgc2Vzc2lvbiBzdGF0dXMsIG9yIG51bGwgaWYgdW5rbm93bi4KLSAgICAgICAgICogQHBhcmFtIGl0ZW1JZCBUaGUgaXRlbSBpZC4KLSAgICAgICAgICogQHBhcmFtIGl0ZW1TdGF0dXMgVGhlIGl0ZW0gc3RhdHVzLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25JdGVtU3RhdHVzQ2hhbmdlZChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cywKLSAgICAgICAgICAgICAgICBTdHJpbmcgaXRlbUlkLCBNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzdGF0dXMgb2YgYSBtZWRpYSBzZXNzaW9uIGNoYW5nZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByZXN1bHQgZGF0YSBidW5kbGUuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdHVzIFRoZSBzZXNzaW9uIHN0YXR1cywgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uU3RhdHVzQ2hhbmdlZChCdW5kbGUgZGF0YSwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc2Vzc2lvbklkLCBNZWRpYVNlc3Npb25TdGF0dXMgc2Vzc2lvblN0YXR1cykgewotICAgICAgICB9Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIHRoZSBzZXNzaW9uIG9mIHRoZSByZW1vdGUgcGxheWJhY2sgY2xpZW50IGNoYW5nZXMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIG5ldyBzZXNzaW9uIGlkLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25TZXNzaW9uQ2hhbmdlZChTdHJpbmcgc2Vzc2lvbklkKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBCYXNlIGNhbGxiYWNrIHR5cGUgZm9yIHJlbW90ZSBwbGF5YmFjayByZXF1ZXN0cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEFjdGlvbkNhbGxiYWNrIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVkaWEgY29udHJvbCByZXF1ZXN0IGZhaWxzLgotICAgICAgICAgKgotICAgICAgICAgKiBAcGFyYW0gZXJyb3IgQSBsb2NhbGl6ZWQgZXJyb3IgbWVzc2FnZSB3aGljaCBtYXkgYmUgc2hvd24gdG8gdGhlIHVzZXIsIG9yIG51bGwKLSAgICAgICAgICogaWYgdGhlIGNhdXNlIG9mIHRoZSBlcnJvciBpcyB1bmNsZWFyLgotICAgICAgICAgKiBAcGFyYW0gY29kZSBUaGUgZXJyb3IgY29kZSwgb3Ige0BsaW5rIE1lZGlhQ29udHJvbEludGVudCNFUlJPUl9VTktOT1dOfSBpZiB1bmtub3duLgotICAgICAgICAgKiBAcGFyYW0gZGF0YSBUaGUgZXJyb3IgZGF0YSBidW5kbGUsIG9yIG51bGwgaWYgbm9uZS4KLSAgICAgICAgICovCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uRXJyb3IoU3RyaW5nIGVycm9yLCBpbnQgY29kZSwgQnVuZGxlIGRhdGEpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIGZvciByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMgdGhhdCBvcGVyYXRlIG9uIGl0ZW1zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgSXRlbUFjdGlvbkNhbGxiYWNrIGV4dGVuZHMgQWN0aW9uQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlcXVlc3Qgc3VjY2VlZHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByZXN1bHQgZGF0YSBidW5kbGUuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdHVzIFRoZSBzZXNzaW9uIHN0YXR1cywgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAgICAgKiBAcGFyYW0gaXRlbUlkIFRoZSBpdGVtIGlkLgotICAgICAgICAgKiBAcGFyYW0gaXRlbVN0YXR1cyBUaGUgaXRlbSBzdGF0dXMuCi0gICAgICAgICAqLwotICAgICAgICBwdWJsaWMgdm9pZCBvblJlc3VsdChCdW5kbGUgZGF0YSwgU3RyaW5nIHNlc3Npb25JZCwgTWVkaWFTZXNzaW9uU3RhdHVzIHNlc3Npb25TdGF0dXMsCi0gICAgICAgICAgICAgICAgU3RyaW5nIGl0ZW1JZCwgTWVkaWFJdGVtU3RhdHVzIGl0ZW1TdGF0dXMpIHsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrIGZvciByZW1vdGUgcGxheWJhY2sgcmVxdWVzdHMgdGhhdCBvcGVyYXRlIG9uIHNlc3Npb25zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgU2Vzc2lvbkFjdGlvbkNhbGxiYWNrIGV4dGVuZHMgQWN0aW9uQ2FsbGJhY2sgewotICAgICAgICAvKioKLSAgICAgICAgICogQ2FsbGVkIHdoZW4gdGhlIHJlcXVlc3Qgc3VjY2VlZHMuCi0gICAgICAgICAqCi0gICAgICAgICAqIEBwYXJhbSBkYXRhIFRoZSByZXN1bHQgZGF0YSBidW5kbGUuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uSWQgVGhlIHNlc3Npb24gaWQuCi0gICAgICAgICAqIEBwYXJhbSBzZXNzaW9uU3RhdHVzIFRoZSBzZXNzaW9uIHN0YXR1cywgb3IgbnVsbCBpZiB1bmtub3duLgotICAgICAgICAgKi8KLSAgICAgICAgcHVibGljIHZvaWQgb25SZXN1bHQoQnVuZGxlIGRhdGEsIFN0cmluZyBzZXNzaW9uSWQsIE1lZGlhU2Vzc2lvblN0YXR1cyBzZXNzaW9uU3RhdHVzKSB7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBIGNhbGxiYWNrIHRoYXQgd2lsbCByZWNlaXZlIG1lc3NhZ2VzIGZyb20gbWVkaWEgc2Vzc2lvbnMuCi0gICAgICovCi0gICAgcHVibGljIGludGVyZmFjZSBPbk1lc3NhZ2VSZWNlaXZlZExpc3RlbmVyIHsKLSAgICAgICAgLyoqCi0gICAgICAgICAqIENhbGxlZCB3aGVuIGEgbWVzc2FnZSByZWNlaXZlZC4KLSAgICAgICAgICoKLSAgICAgICAgICogQHBhcmFtIHNlc3Npb25JZCBUaGUgc2Vzc2lvbiBpZC4KLSAgICAgICAgICogQHBhcmFtIG1lc3NhZ2UgQSBidW5kbGUgbWVzc2FnZSBkZW5vdGluZyB7QGxpbmsgTWVkaWFDb250cm9sSW50ZW50I0VYVFJBX01FU1NBR0V9LgotICAgICAgICAgKi8KLSAgICAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChTdHJpbmcgc2Vzc2lvbklkLCBCdW5kbGUgbWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1N5c3RlbU1lZGlhUm91dGVQcm92aWRlci5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL1N5c3RlbU1lZGlhUm91dGVQcm92aWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzg0OTFmLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9TeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWE7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQnJvYWRjYXN0UmVjZWl2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbXBvbmVudE5hbWU7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkludGVudDsKLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuSW50ZW50RmlsdGVyOwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5yZXMuUmVzb3VyY2VzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9NYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQub3MuQnVpbGQ7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkRpc3BsYXk7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi0vKioKLSAqIFByb3ZpZGVzIHJvdXRlcyBmb3IgYnVpbHQtaW4gc3lzdGVtIGRlc3RpbmF0aW9ucyBzdWNoIGFzIHRoZSBsb2NhbCBkaXNwbGF5Ci0gKiBhbmQgc3BlYWtlci4gIE9uIEplbGx5YmVhbiBhbmQgbmV3ZXIgcGxhdGZvcm0gcmVsZWFzZXMsIHF1ZXJpZXMgdGhlIGZyYW1ld29yawotICogTWVkaWFSb3V0ZXIgZm9yIGZyYW1ld29yay1wcm92aWRlZCByb3V0ZXMgYW5kIHJlZ2lzdGVycyBub24tZnJhbWV3b3JrLXByb3ZpZGVkCi0gKiByb3V0ZXMgYXMgdXNlciByb3V0ZXMuCi0gKi8KLWFic3RyYWN0IGNsYXNzIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlciBleHRlbmRzIE1lZGlhUm91dGVQcm92aWRlciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIiOwotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgUEFDS0FHRV9OQU1FID0gImFuZHJvaWQiOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUk9VVEVfSUQgPSAiREVGQVVMVF9ST1VURSI7Ci0KLSAgICBwcm90ZWN0ZWQgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyKENvbnRleHQgY29udGV4dCkgewotICAgICAgICBzdXBlcihjb250ZXh0LCBuZXcgUHJvdmlkZXJNZXRhZGF0YShuZXcgQ29tcG9uZW50TmFtZShQQUNLQUdFX05BTUUsCi0gICAgICAgICAgICAgICAgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyLmNsYXNzLmdldE5hbWUoKSkpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN5c3RlbU1lZGlhUm91dGVQcm92aWRlciBvYnRhaW4oQ29udGV4dCBjb250ZXh0LCBTeW5jQ2FsbGJhY2sgc3luY0NhbGxiYWNrKSB7Ci0gICAgICAgIGlmIChCdWlsZC5WRVJTSU9OLlNES19JTlQgPj0gMjQpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQXBpMjRJbXBsKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAxOCkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKZWxseWJlYW5NcjJJbXBsKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAxNykgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKZWxseWJlYW5NcjFJbXBsKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEJ1aWxkLlZFUlNJT04uU0RLX0lOVCA+PSAxNikgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKZWxseWJlYW5JbXBsKGNvbnRleHQsIHN5bmNDYWxsYmFjayk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG5ldyBMZWdhY3lJbXBsKGNvbnRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gYSByb3V0ZSBpcyBhZGRlZCB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoCi0gICAgICogdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVBZGRlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIG1lZGlhIHJvdXRlciB3aGVuIGEgcm91dGUgaXMgcmVtb3ZlZCB0byBzeW5jaHJvbml6ZSBzdGF0ZSB3aXRoCi0gICAgICogdGhlIGZyYW1ld29yayBtZWRpYSByb3V0ZXIuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVSZW1vdmVkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgbWVkaWEgcm91dGVyIHdoZW4gYSByb3V0ZSBpcyBjaGFuZ2VkIHRvIHN5bmNocm9uaXplIHN0YXRlIHdpdGgKLSAgICAgKiB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZUNoYW5nZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBtZWRpYSByb3V0ZXIgd2hlbiBhIHJvdXRlIGlzIHNlbGVjdGVkIHRvIHN5bmNocm9uaXplIHN0YXRlIHdpdGgKLSAgICAgKiB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvblN5bmNSb3V0ZVNlbGVjdGVkKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxiYWNrcyBpbnRvIHRoZSBtZWRpYSByb3V0ZXIgdG8gc3luY2hyb25pemUgc3RhdGUgd2l0aCB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIFN5bmNDYWxsYmFjayB7Ci0gICAgICAgIHZvaWQgb25TeXN0ZW1Sb3V0ZVNlbGVjdGVkQnlEZXNjcmlwdG9ySWQoU3RyaW5nIGlkKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldERlZmF1bHRSb3V0ZSgpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIE9iamVjdCBnZXRTeXN0ZW1Sb3V0ZShNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGVnYWN5IGltcGxlbWVudGF0aW9uIGZvciBwbGF0Zm9ybSB2ZXJzaW9ucyBwcmlvciB0byBKZWxseWJlYW4uCi0gICAgICovCi0gICAgc3RhdGljIGNsYXNzIExlZ2FjeUltcGwgZXh0ZW5kcyBTeXN0ZW1NZWRpYVJvdXRlUHJvdmlkZXIgewotICAgICAgICBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NUUkVBTSA9IEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUM7Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQXJyYXlMaXN0PEludGVudEZpbHRlcj4gQ09OVFJPTF9GSUxURVJTOwotICAgICAgICBzdGF0aWMgewotICAgICAgICAgICAgSW50ZW50RmlsdGVyIGYgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICBmLmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKTsKLSAgICAgICAgICAgIGYuYWRkQ2F0ZWdvcnkoTWVkaWFDb250cm9sSW50ZW50LkNBVEVHT1JZX0xJVkVfVklERU8pOwotCi0gICAgICAgICAgICBDT05UUk9MX0ZJTFRFUlMgPSBuZXcgQXJyYXlMaXN0PEludGVudEZpbHRlcj4oKTsKLSAgICAgICAgICAgIENPTlRST0xfRklMVEVSUy5hZGQoZik7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBBdWRpb01hbmFnZXIgbUF1ZGlvTWFuYWdlcjsKLSAgICAgICAgcHJpdmF0ZSBmaW5hbCBWb2x1bWVDaGFuZ2VSZWNlaXZlciBtVm9sdW1lQ2hhbmdlUmVjZWl2ZXI7Ci0gICAgICAgIGludCBtTGFzdFJlcG9ydGVkVm9sdW1lID0gLTE7Ci0KLSAgICAgICAgcHVibGljIExlZ2FjeUltcGwoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgICAgICBzdXBlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1BdWRpb01hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKWNvbnRleHQuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LkFVRElPX1NFUlZJQ0UpOwotICAgICAgICAgICAgbVZvbHVtZUNoYW5nZVJlY2VpdmVyID0gbmV3IFZvbHVtZUNoYW5nZVJlY2VpdmVyKCk7Ci0KLSAgICAgICAgICAgIGNvbnRleHQucmVnaXN0ZXJSZWNlaXZlcihtVm9sdW1lQ2hhbmdlUmVjZWl2ZXIsCi0gICAgICAgICAgICAgICAgICAgIG5ldyBJbnRlbnRGaWx0ZXIoVm9sdW1lQ2hhbmdlUmVjZWl2ZXIuVk9MVU1FX0NIQU5HRURfQUNUSU9OKSk7Ci0gICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIHB1Ymxpc2hSb3V0ZXMoKSB7Ci0gICAgICAgICAgICBSZXNvdXJjZXMgciA9IGdldENvbnRleHQoKS5nZXRSZXNvdXJjZXMoKTsKLSAgICAgICAgICAgIGludCBtYXhWb2x1bWUgPSBtQXVkaW9NYW5hZ2VyLmdldFN0cmVhbU1heFZvbHVtZShQTEFZQkFDS19TVFJFQU0pOwotICAgICAgICAgICAgbUxhc3RSZXBvcnRlZFZvbHVtZSA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKFBMQVlCQUNLX1NUUkVBTSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvciBkZWZhdWx0Um91dGUgPSBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9ST1VURV9JRCwgci5nZXRTdHJpbmcoUi5zdHJpbmcubXJfc3lzdGVtX3JvdXRlX25hbWUpKQotICAgICAgICAgICAgICAgICAgICAuYWRkQ29udHJvbEZpbHRlcnMoQ09OVFJPTF9GSUxURVJTKQotICAgICAgICAgICAgICAgICAgICAuc2V0UGxheWJhY2tTdHJlYW0oUExBWUJBQ0tfU1RSRUFNKQotICAgICAgICAgICAgICAgICAgICAuc2V0UGxheWJhY2tUeXBlKE1lZGlhUm91dGVyLlJvdXRlSW5mby5QTEFZQkFDS19UWVBFX0xPQ0FMKQotICAgICAgICAgICAgICAgICAgICAuc2V0Vm9sdW1lSGFuZGxpbmcoTWVkaWFSb3V0ZXIuUm91dGVJbmZvLlBMQVlCQUNLX1ZPTFVNRV9WQVJJQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgLnNldFZvbHVtZU1heChtYXhWb2x1bWUpCi0gICAgICAgICAgICAgICAgICAgIC5zZXRWb2x1bWUobUxhc3RSZXBvcnRlZFZvbHVtZSkKLSAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICAgICAgICAgIE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IgcHJvdmlkZXJEZXNjcmlwdG9yID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE1lZGlhUm91dGVQcm92aWRlckRlc2NyaXB0b3IuQnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRSb3V0ZShkZWZhdWx0Um91dGUpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgc2V0RGVzY3JpcHRvcihwcm92aWRlckRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZUlkLmVxdWFscyhERUZBVUxUX1JPVVRFX0lEKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRGVmYXVsdFJvdXRlQ29udHJvbGxlcigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBjbGFzcyBEZWZhdWx0Um91dGVDb250cm9sbGVyIGV4dGVuZHMgUm91dGVDb250cm9sbGVyIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25TZXRWb2x1bWUoaW50IHZvbHVtZSkgewotICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuc2V0U3RyZWFtVm9sdW1lKFBMQVlCQUNLX1NUUkVBTSwgdm9sdW1lLCAwKTsKLSAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25VcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICAgICAgaW50IHZvbHVtZSA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKFBMQVlCQUNLX1NUUkVBTSk7Ci0gICAgICAgICAgICAgICAgaW50IG1heFZvbHVtZSA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtTWF4Vm9sdW1lKFBMQVlCQUNLX1NUUkVBTSk7Ci0gICAgICAgICAgICAgICAgaW50IG5ld1ZvbHVtZSA9IE1hdGgubWluKG1heFZvbHVtZSwgTWF0aC5tYXgoMCwgdm9sdW1lICsgZGVsdGEpKTsKLSAgICAgICAgICAgICAgICBpZiAobmV3Vm9sdW1lICE9IHZvbHVtZSkgewotICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShQTEFZQkFDS19TVFJFQU0sIHZvbHVtZSwgMCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGZpbmFsIGNsYXNzIFZvbHVtZUNoYW5nZVJlY2VpdmVyIGV4dGVuZHMgQnJvYWRjYXN0UmVjZWl2ZXIgewotICAgICAgICAgICAgLy8gVGhlc2UgY29uc3RhbnRzIGNvbWUgZnJvbSBBdWRpb01hbmFnZXIuCi0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBWT0xVTUVfQ0hBTkdFRF9BQ1RJT04gPQotICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5WT0xVTUVfQ0hBTkdFRF9BQ1RJT04iOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVhUUkFfVk9MVU1FX1NUUkVBTV9UWVBFID0KLSAgICAgICAgICAgICAgICAgICAgImFuZHJvaWQubWVkaWEuRVhUUkFfVk9MVU1FX1NUUkVBTV9UWVBFIjsKLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIEVYVFJBX1ZPTFVNRV9TVFJFQU1fVkFMVUUgPQotICAgICAgICAgICAgICAgICAgICAiYW5kcm9pZC5tZWRpYS5FWFRSQV9WT0xVTUVfU1RSRUFNX1ZBTFVFIjsKLQotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBvblJlY2VpdmUoQ29udGV4dCBjb250ZXh0LCBJbnRlbnQgaW50ZW50KSB7Ci0gICAgICAgICAgICAgICAgaWYgKGludGVudC5nZXRBY3Rpb24oKS5lcXVhbHMoVk9MVU1FX0NIQU5HRURfQUNUSU9OKSkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc3RyZWFtVHlwZSA9IGludGVudC5nZXRJbnRFeHRyYShFWFRSQV9WT0xVTUVfU1RSRUFNX1RZUEUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHN0cmVhbVR5cGUgPT0gUExBWUJBQ0tfU1RSRUFNKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgdm9sdW1lID0gaW50ZW50LmdldEludEV4dHJhKEVYVFJBX1ZPTFVNRV9TVFJFQU1fVkFMVUUsIC0xKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2b2x1bWUgPj0gMCAmJiB2b2x1bWUgIT0gbUxhc3RSZXBvcnRlZFZvbHVtZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEplbGx5YmVhbiBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICAvLyBAQFJlcXVpcmVzQXBpKDE2KQotICAgIHN0YXRpYyBjbGFzcyBKZWxseWJlYW5JbXBsIGV4dGVuZHMgU3lzdGVtTWVkaWFSb3V0ZVByb3ZpZGVyCi0gICAgICAgICAgICBpbXBsZW1lbnRzIE1lZGlhUm91dGVySmVsbHliZWFuLkNhbGxiYWNrLCBNZWRpYVJvdXRlckplbGx5YmVhbi5Wb2x1bWVDYWxsYmFjayB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IExJVkVfQVVESU9fQ09OVFJPTF9GSUxURVJTOwotICAgICAgICBzdGF0aWMgewotICAgICAgICAgICAgSW50ZW50RmlsdGVyIGYgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICBmLmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKTsKLQotICAgICAgICAgICAgTElWRV9BVURJT19DT05UUk9MX0ZJTFRFUlMgPSBuZXcgQXJyYXlMaXN0PEludGVudEZpbHRlcj4oKTsKLSAgICAgICAgICAgIExJVkVfQVVESU9fQ09OVFJPTF9GSUxURVJTLmFkZChmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEFycmF5TGlzdDxJbnRlbnRGaWx0ZXI+IExJVkVfVklERU9fQ09OVFJPTF9GSUxURVJTOwotICAgICAgICBzdGF0aWMgewotICAgICAgICAgICAgSW50ZW50RmlsdGVyIGYgPSBuZXcgSW50ZW50RmlsdGVyKCk7Ci0gICAgICAgICAgICBmLmFkZENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKLQotICAgICAgICAgICAgTElWRV9WSURFT19DT05UUk9MX0ZJTFRFUlMgPSBuZXcgQXJyYXlMaXN0PEludGVudEZpbHRlcj4oKTsKLSAgICAgICAgICAgIExJVkVfVklERU9fQ09OVFJPTF9GSUxURVJTLmFkZChmKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgZmluYWwgU3luY0NhbGxiYWNrIG1TeW5jQ2FsbGJhY2s7Ci0KLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtUm91dGVyT2JqOwotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgT2JqZWN0IG1DYWxsYmFja09iajsKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIE9iamVjdCBtVm9sdW1lQ2FsbGJhY2tPYmo7Ci0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBPYmplY3QgbVVzZXJSb3V0ZUNhdGVnb3J5T2JqOwotICAgICAgICBwcm90ZWN0ZWQgaW50IG1Sb3V0ZVR5cGVzOwotICAgICAgICBwcm90ZWN0ZWQgYm9vbGVhbiBtQWN0aXZlU2NhbjsKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gbUNhbGxiYWNrUmVnaXN0ZXJlZDsKLQotICAgICAgICAvLyBNYWludGFpbnMgYW4gYXNzb2NpYXRpb24gZnJvbSBmcmFtZXdvcmsgcm91dGVzIHRvIHN1cHBvcnQgbGlicmFyeSByb3V0ZXMuCi0gICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW5ub3QgdXNlIHRoZSB0YWcgZmllbGQgZm9yIHRoaXMgYmVjYXVzZSBhbiBhcHBsaWNhdGlvbiBtYXkKLSAgICAgICAgLy8gaGF2ZSBwdWJsaXNoZWQgaXRzIG93biB1c2VyIHJvdXRlcyB0byB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlciBhbmQgYWxyZWFkeQotICAgICAgICAvLyB1c2VkIHRoZSB0YWcgZm9yIGl0cyBvd24gcHVycG9zZXMuCi0gICAgICAgIHByb3RlY3RlZCBmaW5hbCBBcnJheUxpc3Q8U3lzdGVtUm91dGVSZWNvcmQ+IG1TeXN0ZW1Sb3V0ZVJlY29yZHMgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8U3lzdGVtUm91dGVSZWNvcmQ+KCk7Ci0KLSAgICAgICAgLy8gTWFpbnRhaW5zIGFuIGFzc29jaWF0aW9uIGZyb20gc3VwcG9ydCBsaWJyYXJ5IHJvdXRlcyB0byBmcmFtZXdvcmsgcm91dGVzLgotICAgICAgICBwcm90ZWN0ZWQgZmluYWwgQXJyYXlMaXN0PFVzZXJSb3V0ZVJlY29yZD4gbVVzZXJSb3V0ZVJlY29yZHMgPQotICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3Q8VXNlclJvdXRlUmVjb3JkPigpOwotCi0gICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJKZWxseWJlYW4uU2VsZWN0Um91dGVXb3JrYXJvdW5kIG1TZWxlY3RSb3V0ZVdvcmthcm91bmQ7Ci0gICAgICAgIHByaXZhdGUgTWVkaWFSb3V0ZXJKZWxseWJlYW4uR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCBtR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZDsKLQotICAgICAgICBwdWJsaWMgSmVsbHliZWFuSW1wbChDb250ZXh0IGNvbnRleHQsIFN5bmNDYWxsYmFjayBzeW5jQ2FsbGJhY2spIHsKLSAgICAgICAgICAgIHN1cGVyKGNvbnRleHQpOwotICAgICAgICAgICAgbVN5bmNDYWxsYmFjayA9IHN5bmNDYWxsYmFjazsKLSAgICAgICAgICAgIG1Sb3V0ZXJPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5nZXRNZWRpYVJvdXRlcihjb250ZXh0KTsKLSAgICAgICAgICAgIG1DYWxsYmFja09iaiA9IGNyZWF0ZUNhbGxiYWNrT2JqKCk7Ci0gICAgICAgICAgICBtVm9sdW1lQ2FsbGJhY2tPYmogPSBjcmVhdGVWb2x1bWVDYWxsYmFja09iaigpOwotCi0gICAgICAgICAgICBSZXNvdXJjZXMgciA9IEFwaUhlbHBlci5nZXRMaWJSZXNvdXJjZXMoY29udGV4dCk7Ci0gICAgICAgICAgICBtVXNlclJvdXRlQ2F0ZWdvcnlPYmogPSBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVSb3V0ZUNhdGVnb3J5KAotICAgICAgICAgICAgICAgICAgICBtUm91dGVyT2JqLCByLmdldFN0cmluZyhSLnN0cmluZy5tcl91c2VyX3JvdXRlX2NhdGVnb3J5X25hbWUpLCBmYWxzZSk7Ci0KLSAgICAgICAgICAgIHVwZGF0ZVN5c3RlbVJvdXRlcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBSb3V0ZUNvbnRyb2xsZXIgb25DcmVhdGVSb3V0ZUNvbnRyb2xsZXIoU3RyaW5nIHJvdXRlSWQpIHsKLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKHJvdXRlSWQpOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBTeXN0ZW1Sb3V0ZUNvbnRyb2xsZXIocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkRpc2NvdmVyeVJlcXVlc3RDaGFuZ2VkKE1lZGlhUm91dGVEaXNjb3ZlcnlSZXF1ZXN0IHJlcXVlc3QpIHsKLSAgICAgICAgICAgIGludCBuZXdSb3V0ZVR5cGVzID0gMDsKLSAgICAgICAgICAgIGJvb2xlYW4gbmV3QWN0aXZlU2NhbiA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKHJlcXVlc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZpbmFsIE1lZGlhUm91dGVTZWxlY3RvciBzZWxlY3RvciA9IHJlcXVlc3QuZ2V0U2VsZWN0b3IoKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gY2F0ZWdvcmllcyA9IHNlbGVjdG9yLmdldENvbnRyb2xDYXRlZ29yaWVzKCk7Ci0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gY2F0ZWdvcmllcy5zaXplKCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN0cmluZyBjYXRlZ29yeSA9IGNhdGVnb3JpZXMuZ2V0KGkpOwotICAgICAgICAgICAgICAgICAgICBpZiAoY2F0ZWdvcnkuZXF1YWxzKE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX0FVRElPKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um91dGVUeXBlcyB8PSBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfQVVESU87Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoY2F0ZWdvcnkuZXF1YWxzKE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgbmV3Um91dGVUeXBlcyB8PSBNZWRpYVJvdXRlckplbGx5YmVhbi5ST1VURV9UWVBFX0xJVkVfVklERU87Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuZXdSb3V0ZVR5cGVzIHw9IE1lZGlhUm91dGVySmVsbHliZWFuLlJPVVRFX1RZUEVfVVNFUjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBuZXdBY3RpdmVTY2FuID0gcmVxdWVzdC5pc0FjdGl2ZVNjYW4oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1Sb3V0ZVR5cGVzICE9IG5ld1JvdXRlVHlwZXMgfHwgbUFjdGl2ZVNjYW4gIT0gbmV3QWN0aXZlU2NhbikgewotICAgICAgICAgICAgICAgIG1Sb3V0ZVR5cGVzID0gbmV3Um91dGVUeXBlczsKLSAgICAgICAgICAgICAgICBtQWN0aXZlU2NhbiA9IG5ld0FjdGl2ZVNjYW47Ci0gICAgICAgICAgICAgICAgdXBkYXRlU3lzdGVtUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZUFkZGVkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKGFkZFN5c3RlbVJvdXRlTm9QdWJsaXNoKHJvdXRlT2JqKSkgewotICAgICAgICAgICAgICAgIHB1Ymxpc2hSb3V0ZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCB1cGRhdGVTeXN0ZW1Sb3V0ZXMoKSB7Ci0gICAgICAgICAgICB1cGRhdGVDYWxsYmFjaygpOwotICAgICAgICAgICAgYm9vbGVhbiBjaGFuZ2VkID0gZmFsc2U7Ci0gICAgICAgICAgICBmb3IgKE9iamVjdCByb3V0ZU9iaiA6IE1lZGlhUm91dGVySmVsbHliZWFuLmdldFJvdXRlcyhtUm91dGVyT2JqKSkgewotICAgICAgICAgICAgICAgIGNoYW5nZWQgfD0gYWRkU3lzdGVtUm91dGVOb1B1Ymxpc2gocm91dGVPYmopOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGNoYW5nZWQpIHsKLSAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2xlYW4gYWRkU3lzdGVtUm91dGVOb1B1Ymxpc2goT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpZiAoZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKSA9PSBudWxsCi0gICAgICAgICAgICAgICAgICAgICYmIGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaikgPCAwKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGlkID0gYXNzaWduUm91dGVJZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbmV3IFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqLCBpZCk7Ci0gICAgICAgICAgICAgICAgdXBkYXRlU3lzdGVtUm91dGVEZXNjcmlwdG9yKHJlY29yZCk7Ci0gICAgICAgICAgICAgICAgbVN5c3RlbVJvdXRlUmVjb3Jkcy5hZGQocmVjb3JkKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgU3RyaW5nIGFzc2lnblJvdXRlSWQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBUaGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlciBzaG91bGQgc3VwcGx5IGEgdW5pcXVlIHJvdXRlIGlkIHRoYXQKLSAgICAgICAgICAgIC8vIHdlIGNhbiB1c2UgaGVyZS4gIEZvciBub3cgd2UgdXNlIGEgaGFzaCBvZiB0aGUgcm91dGUgbmFtZSBhbmQgdGFrZSBjYXJlCi0gICAgICAgICAgICAvLyB0byBkZWR1cGUgaXQuCi0gICAgICAgICAgICBib29sZWFuIGlzRGVmYXVsdCA9IChnZXREZWZhdWx0Um91dGUoKSA9PSByb3V0ZU9iaik7Ci0gICAgICAgICAgICBTdHJpbmcgaWQgPSBpc0RlZmF1bHQgPyBERUZBVUxUX1JPVVRFX0lEIDoKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdChMb2NhbGUuVVMsICJST1VURV8lMDh4IiwgZ2V0Um91dGVOYW1lKHJvdXRlT2JqKS5oYXNoQ29kZSgpKTsKLSAgICAgICAgICAgIGlmIChmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChpZCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGlkOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDI7IDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIG5ld0lkID0gU3RyaW5nLmZvcm1hdChMb2NhbGUuVVMsICIlc18lZCIsIGlkLCBpKTsKLSAgICAgICAgICAgICAgICBpZiAoZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQobmV3SWQpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3SWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVSZW1vdmVkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaikgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVN5c3RlbVJvdXRlUmVjb3Jkcy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVDaGFuZ2VkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgaWYgKGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaikgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkKTsKLSAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlVm9sdW1lQ2hhbmdlZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG5ld1ZvbHVtZSA9IE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRWb2x1bWUocm91dGVPYmopOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV3Vm9sdW1lICE9IHJlY29yZC5tUm91dGVEZXNjcmlwdG9yLmdldFZvbHVtZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlRGVzY3JpcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyKHJlY29yZC5tUm91dGVEZXNjcmlwdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0Vm9sdW1lKG5ld1ZvbHVtZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBwdWJsaXNoUm91dGVzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVNlbGVjdGVkKGludCB0eXBlLCBPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZU9iaiAhPSBNZWRpYVJvdXRlckplbGx5YmVhbi5nZXRTZWxlY3RlZFJvdXRlKG1Sb3V0ZXJPYmosCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLkFMTF9ST1VURV9UWVBFUykpIHsKLSAgICAgICAgICAgICAgICAvLyBUaGUgY3VycmVudGx5IHNlbGVjdGVkIHJvdXRlIGhhcyBhbHJlYWR5IGNoYW5nZWQgc28gdGhpcyBjYWxsYmFjawotICAgICAgICAgICAgICAgIC8vIGlzIHN0YWxlLiAgRHJvcCBpdCB0byBwcmV2ZW50IGdldHRpbmcgaW50byBzeW5jIGxvb3BzLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHVzZXJSb3V0ZVJlY29yZCA9IGdldFVzZXJSb3V0ZVJlY29yZChyb3V0ZU9iaik7Ci0gICAgICAgICAgICBpZiAodXNlclJvdXRlUmVjb3JkICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICB1c2VyUm91dGVSZWNvcmQubVJvdXRlLnNlbGVjdCgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBTZWxlY3QgdGhlIHJvdXRlIGlmIGl0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBjb21wYXQgbWVkaWEgcm91dGVyLgotICAgICAgICAgICAgICAgIC8vIElmIG5vdCwgd2Ugd2lsbCBzZWxlY3QgaXQgaW5zdGVhZCB3aGVuIHRoZSByb3V0ZSBpcyBhZGRlZC4KLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCA9IG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgbVN5bmNDYWxsYmFjay5vblN5c3RlbVJvdXRlU2VsZWN0ZWRCeURlc2NyaXB0b3JJZChyZWNvcmQubVJvdXRlRGVzY3JpcHRvcklkKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuc2VsZWN0ZWQoaW50IHR5cGUsIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgLy8gTm90aGluZyB0byBkbyB3aGVuIGEgcm91dGUgaXMgdW5zZWxlY3RlZC4KLSAgICAgICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byBoYW5kbGUgd2hlbiBhIHJvdXRlIGlzIHNlbGVjdGVkLgotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVHcm91cGVkKE9iamVjdCByb3V0ZU9iaiwgT2JqZWN0IGdyb3VwT2JqLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgICAgIC8vIFJvdXRlIGdyb3VwaW5nIGlzIGRlcHJlY2F0ZWQgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCi0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Sb3V0ZVVuZ3JvdXBlZChPYmplY3Qgcm91dGVPYmosIE9iamVjdCBncm91cE9iaikgewotICAgICAgICAgICAgLy8gUm91dGUgZ3JvdXBpbmcgaXMgZGVwcmVjYXRlZCBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblZvbHVtZVNldFJlcXVlc3QoT2JqZWN0IHJvdXRlT2JqLCBpbnQgdm9sdW1lKSB7Ci0gICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gZ2V0VXNlclJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChyZWNvcmQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGUucmVxdWVzdFNldFZvbHVtZSh2b2x1bWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uVm9sdW1lVXBkYXRlUmVxdWVzdChPYmplY3Qgcm91dGVPYmosIGludCBkaXJlY3Rpb24pIHsKLSAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBnZXRVc2VyUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgaWYgKHJlY29yZCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZS5yZXF1ZXN0VXBkYXRlVm9sdW1lKGRpcmVjdGlvbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TeW5jUm91dGVBZGRlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgIT0gdGhpcykgewotICAgICAgICAgICAgICAgIE9iamVjdCByb3V0ZU9iaiA9IE1lZGlhUm91dGVySmVsbHliZWFuLmNyZWF0ZVVzZXJSb3V0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJPYmosIG1Vc2VyUm91dGVDYXRlZ29yeU9iaik7Ci0gICAgICAgICAgICAgICAgVXNlclJvdXRlUmVjb3JkIHJlY29yZCA9IG5ldyBVc2VyUm91dGVSZWNvcmQocm91dGUsIHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uc2V0VGFnKHJvdXRlT2JqLCByZWNvcmQpOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0Vm9sdW1lQ2FsbGJhY2socm91dGVPYmosIG1Wb2x1bWVDYWxsYmFja09iaik7Ci0gICAgICAgICAgICAgICAgdXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhyZWNvcmQpOwotICAgICAgICAgICAgICAgIG1Vc2VyUm91dGVSZWNvcmRzLmFkZChyZWNvcmQpOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLmFkZFVzZXJSb3V0ZShtUm91dGVyT2JqLCByb3V0ZU9iaik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIElmIHRoZSBuZXdseSBhZGRlZCByb3V0ZSBpcyB0aGUgY291bnRlcnBhcnQgb2YgdGhlIGN1cnJlbnRseSBzZWxlY3RlZAotICAgICAgICAgICAgICAgIC8vIHJvdXRlIGluIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyIHRoZW4gZW5zdXJlIGl0IGlzIHNlbGVjdGVkIGluCi0gICAgICAgICAgICAgICAgLy8gdGhlIGNvbXBhdCBtZWRpYSByb3V0ZXIuCi0gICAgICAgICAgICAgICAgT2JqZWN0IHJvdXRlT2JqID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uZ2V0U2VsZWN0ZWRSb3V0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Sb3V0ZXJPYmosIE1lZGlhUm91dGVySmVsbHliZWFuLkFMTF9ST1VURV9UWVBFUyk7Ci0gICAgICAgICAgICAgICAgaW50IGluZGV4ID0gZmluZFN5c3RlbVJvdXRlUmVjb3JkKHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZWNvcmQubVJvdXRlRGVzY3JpcHRvcklkLmVxdWFscyhyb3V0ZS5nZXREZXNjcmlwdG9ySWQoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRlLnNlbGVjdCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlUmVtb3ZlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgIT0gdGhpcykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRVc2VyUm91dGVSZWNvcmQocm91dGUpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBtVXNlclJvdXRlUmVjb3Jkcy5yZW1vdmUoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uc2V0VGFnKHJlY29yZC5tUm91dGVPYmosIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZUNhbGxiYWNrKHJlY29yZC5tUm91dGVPYmosIG51bGwpOwotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5yZW1vdmVVc2VyUm91dGUobVJvdXRlck9iaiwgcmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlQ2hhbmdlZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5nZXRQcm92aWRlckluc3RhbmNlKCkgIT0gdGhpcykgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRVc2VyUm91dGVSZWNvcmQocm91dGUpOwotICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIFVzZXJSb3V0ZVJlY29yZCByZWNvcmQgPSBtVXNlclJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVVc2VyUm91dGVQcm9wZXJ0aWVzKHJlY29yZCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3luY1JvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBpZiAoIXJvdXRlLmlzU2VsZWN0ZWQoKSkgewotICAgICAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQgcm91dGUgaGFzIGFscmVhZHkgY2hhbmdlZCBzbyB0aGlzIGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgLy8gaXMgc3RhbGUuICBEcm9wIGl0IHRvIHByZXZlbnQgZ2V0dGluZyBpbnRvIHN5bmMgbG9vcHMuCi0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAocm91dGUuZ2V0UHJvdmlkZXJJbnN0YW5jZSgpICE9IHRoaXMpIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kVXNlclJvdXRlUmVjb3JkKHJvdXRlKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgICAgICBVc2VyUm91dGVSZWNvcmQgcmVjb3JkID0gbVVzZXJSb3V0ZVJlY29yZHMuZ2V0KGluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgc2VsZWN0Um91dGUocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmRCeURlc2NyaXB0b3JJZChyb3V0ZS5nZXREZXNjcmlwdG9ySWQoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaW5kZXgpOwotICAgICAgICAgICAgICAgICAgICBzZWxlY3RSb3V0ZShyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBwdWJsaXNoUm91dGVzKCkgewotICAgICAgICAgICAgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZVByb3ZpZGVyRGVzY3JpcHRvci5CdWlsZGVyKCk7Ci0gICAgICAgICAgICBpbnQgY291bnQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGJ1aWxkZXIuYWRkUm91dGUobVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaSkubVJvdXRlRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNldERlc2NyaXB0b3IoYnVpbGRlci5idWlsZCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBpbnQgZmluZFN5c3RlbVJvdXRlUmVjb3JkKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgZmluYWwgaW50IGNvdW50ID0gbVN5c3RlbVJvdXRlUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVN5c3RlbVJvdXRlUmVjb3Jkcy5nZXQoaSkubVJvdXRlT2JqID09IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBpbnQgZmluZFN5c3RlbVJvdXRlUmVjb3JkQnlEZXNjcmlwdG9ySWQoU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLnNpemUoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgIGlmIChtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpKS5tUm91dGVEZXNjcmlwdG9ySWQuZXF1YWxzKGlkKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgaW50IGZpbmRVc2VyUm91dGVSZWNvcmQoTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgY291bnQgPSBtVXNlclJvdXRlUmVjb3Jkcy5zaXplKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBpZiAobVVzZXJSb3V0ZVJlY29yZHMuZ2V0KGkpLm1Sb3V0ZSA9PSByb3V0ZSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgVXNlclJvdXRlUmVjb3JkIGdldFVzZXJSb3V0ZVJlY29yZChPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIE9iamVjdCB0YWcgPSBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0VGFnKHJvdXRlT2JqKTsKLSAgICAgICAgICAgIHJldHVybiB0YWcgaW5zdGFuY2VvZiBVc2VyUm91dGVSZWNvcmQgPyAoVXNlclJvdXRlUmVjb3JkKXRhZyA6IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IoU3lzdGVtUm91dGVSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgICAgICAvLyBXZSBtdXN0IGFsd2F5cyByZWNyZWF0ZSB0aGUgcm91dGUgZGVzY3JpcHRvciB3aGVuIG1ha2luZyBhbnkgY2hhbmdlcwotICAgICAgICAgICAgLy8gYmVjYXVzZSB0aGV5IGFyZSBpbnRlbmRlZCB0byBiZSBpbW11dGFibGUgb25jZSBwdWJsaXNoZWQuCi0gICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIgPSBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlcigKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZURlc2NyaXB0b3JJZCwgZ2V0Um91dGVOYW1lKHJlY29yZC5tUm91dGVPYmopKTsKLSAgICAgICAgICAgIG9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkLCBidWlsZGVyKTsKLSAgICAgICAgICAgIHJlY29yZC5tUm91dGVEZXNjcmlwdG9yID0gYnVpbGRlci5idWlsZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIFN0cmluZyBnZXRSb3V0ZU5hbWUoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICAvLyBSb3V0ZXMgc2hvdWxkIG5vdCBoYXZlIG51bGwgbmFtZXMgYnV0IGl0IG1heSBoYXBwZW4gZm9yIGJhZGx5IGNvbmZpZ3VyZWQKLSAgICAgICAgICAgIC8vIHVzZXIgcm91dGVzLiAgV2UgdG9sZXJhdGUgdGhpcyBieSB1c2luZyBhbiBlbXB0eSBuYW1lIHN0cmluZyBoZXJlIGJ1dAotICAgICAgICAgICAgLy8gc3VjaCB1bm5hbWVkIHJvdXRlcyB3aWxsIGJlIGRpc2NhcmRlZCBieSB0aGUgbWVkaWEgcm91dGVyIHVwc3RyZWFtCi0gICAgICAgICAgICAvLyAod2l0aCBhIGxvZyBtZXNzYWdlIHNvIHdlIGNhbiB0cmFjayBkb3duIHRoZSBwcm9ibGVtKS4KLSAgICAgICAgICAgIENoYXJTZXF1ZW5jZSBuYW1lID0gTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldE5hbWUocm91dGVPYmosIGdldENvbnRleHQoKSk7Ci0gICAgICAgICAgICByZXR1cm4gbmFtZSAhPSBudWxsID8gbmFtZS50b1N0cmluZygpIDogIiI7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIGludCBzdXBwb3J0ZWRUeXBlcyA9IE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRTdXBwb3J0ZWRUeXBlcygKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgICAgICBpZiAoKHN1cHBvcnRlZFR5cGVzICYgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX0FVRElPKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRDb250cm9sRmlsdGVycyhMSVZFX0FVRElPX0NPTlRST0xfRklMVEVSUyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKHN1cHBvcnRlZFR5cGVzICYgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUk9VVEVfVFlQRV9MSVZFX1ZJREVPKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5hZGRDb250cm9sRmlsdGVycyhMSVZFX1ZJREVPX0NPTlRST0xfRklMVEVSUyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0UGxheWJhY2tUeXBlKAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0UGxheWJhY2tUeXBlKHJlY29yZC5tUm91dGVPYmopKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0UGxheWJhY2tTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlJvdXRlSW5mby5nZXRQbGF5YmFja1N0cmVhbShyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFZvbHVtZShyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFZvbHVtZU1heCgKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLmdldFZvbHVtZU1heChyZWNvcmQubVJvdXRlT2JqKSk7Ci0gICAgICAgICAgICBidWlsZGVyLnNldFZvbHVtZUhhbmRsaW5nKAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8uZ2V0Vm9sdW1lSGFuZGxpbmcocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhVc2VyUm91dGVSZWNvcmQgcmVjb3JkKSB7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldE5hbWUoCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0UGxheWJhY2tUeXBlKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldFBsYXliYWNrVHlwZSgpKTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLlVzZXJSb3V0ZUluZm8uc2V0UGxheWJhY2tTdHJlYW0oCi0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVPYmosIHJlY29yZC5tUm91dGUuZ2V0UGxheWJhY2tTdHJlYW0oKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRWb2x1bWUoKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZU1heCgKLSAgICAgICAgICAgICAgICAgICAgcmVjb3JkLm1Sb3V0ZU9iaiwgcmVjb3JkLm1Sb3V0ZS5nZXRWb2x1bWVNYXgoKSk7Ci0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Vc2VyUm91dGVJbmZvLnNldFZvbHVtZUhhbmRsaW5nKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldFZvbHVtZUhhbmRsaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgdXBkYXRlQ2FsbGJhY2soKSB7Ci0gICAgICAgICAgICBpZiAobUNhbGxiYWNrUmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFja1JlZ2lzdGVyZWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5yZW1vdmVDYWxsYmFjayhtUm91dGVyT2JqLCBtQ2FsbGJhY2tPYmopOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobVJvdXRlVHlwZXMgIT0gMCkgewotICAgICAgICAgICAgICAgIG1DYWxsYmFja1JlZ2lzdGVyZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuLmFkZENhbGxiYWNrKG1Sb3V0ZXJPYmosIG1Sb3V0ZVR5cGVzLCBtQ2FsbGJhY2tPYmopOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVDYWxsYmFja09iaigpIHsKLSAgICAgICAgICAgIHJldHVybiBNZWRpYVJvdXRlckplbGx5YmVhbi5jcmVhdGVDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgY3JlYXRlVm9sdW1lQ2FsbGJhY2tPYmooKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW4uY3JlYXRlVm9sdW1lQ2FsbGJhY2sodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBzZWxlY3RSb3V0ZShPYmplY3Qgcm91dGVPYmopIHsKLSAgICAgICAgICAgIGlmIChtU2VsZWN0Um91dGVXb3JrYXJvdW5kID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU2VsZWN0Um91dGVXb3JrYXJvdW5kID0gbmV3IE1lZGlhUm91dGVySmVsbHliZWFuLlNlbGVjdFJvdXRlV29ya2Fyb3VuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVNlbGVjdFJvdXRlV29ya2Fyb3VuZC5zZWxlY3RSb3V0ZShtUm91dGVyT2JqLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5BTExfUk9VVEVfVFlQRVMsIHJvdXRlT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldERlZmF1bHRSb3V0ZSgpIHsKLSAgICAgICAgICAgIGlmIChtR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUdldERlZmF1bHRSb3V0ZVdvcmthcm91bmQgPSBuZXcgTWVkaWFSb3V0ZXJKZWxseWJlYW4uR2V0RGVmYXVsdFJvdXRlV29ya2Fyb3VuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1HZXREZWZhdWx0Um91dGVXb3JrYXJvdW5kLmdldERlZmF1bHRSb3V0ZShtUm91dGVyT2JqKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgT2JqZWN0IGdldFN5c3RlbVJvdXRlKE1lZGlhUm91dGVyLlJvdXRlSW5mbyByb3V0ZSkgewotICAgICAgICAgICAgaWYgKHJvdXRlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBpbmRleCA9IGZpbmRTeXN0ZW1Sb3V0ZVJlY29yZEJ5RGVzY3JpcHRvcklkKHJvdXRlLmdldERlc2NyaXB0b3JJZCgpKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1TeXN0ZW1Sb3V0ZVJlY29yZHMuZ2V0KGluZGV4KS5tUm91dGVPYmo7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBSZXByZXNlbnRzIGEgcm91dGUgdGhhdCBpcyBwcm92aWRlZCBieSB0aGUgZnJhbWV3b3JrIG1lZGlhIHJvdXRlcgotICAgICAgICAgKiBhbmQgcHVibGlzaGVkIGJ5IHRoaXMgcm91dGUgcHJvdmlkZXIgdG8gdGhlIHN1cHBvcnQgbGlicmFyeSBtZWRpYSByb3V0ZXIuCi0gICAgICAgICAqLwotICAgICAgICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIGNsYXNzIFN5c3RlbVJvdXRlUmVjb3JkIHsKLSAgICAgICAgICAgIHB1YmxpYyBmaW5hbCBPYmplY3QgbVJvdXRlT2JqOwotICAgICAgICAgICAgcHVibGljIGZpbmFsIFN0cmluZyBtUm91dGVEZXNjcmlwdG9ySWQ7Ci0gICAgICAgICAgICBwdWJsaWMgTWVkaWFSb3V0ZURlc2NyaXB0b3IgbVJvdXRlRGVzY3JpcHRvcjsgLy8gYXNzaWduZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgY3JlYXRpb24KLQotICAgICAgICAgICAgcHVibGljIFN5c3RlbVJvdXRlUmVjb3JkKE9iamVjdCByb3V0ZU9iaiwgU3RyaW5nIGlkKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlT2JqID0gcm91dGVPYmo7Ci0gICAgICAgICAgICAgICAgbVJvdXRlRGVzY3JpcHRvcklkID0gaWQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvKioKLSAgICAgICAgICogUmVwcmVzZW50cyBhIHJvdXRlIHRoYXQgaXMgcHJvdmlkZWQgYnkgdGhlIHN1cHBvcnQgbGlicmFyeSBtZWRpYSByb3V0ZXIKLSAgICAgICAgICogYW5kIHB1Ymxpc2hlZCBieSB0aGlzIHJvdXRlIHByb3ZpZGVyIHRvIHRoZSBmcmFtZXdvcmsgbWVkaWEgcm91dGVyLgotICAgICAgICAgKi8KLSAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBVc2VyUm91dGVSZWNvcmQgewotICAgICAgICAgICAgcHVibGljIGZpbmFsIE1lZGlhUm91dGVyLlJvdXRlSW5mbyBtUm91dGU7Ci0gICAgICAgICAgICBwdWJsaWMgZmluYWwgT2JqZWN0IG1Sb3V0ZU9iajsKLQotICAgICAgICAgICAgcHVibGljIFVzZXJSb3V0ZVJlY29yZChNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUsIE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgICAgIG1Sb3V0ZSA9IHJvdXRlOwotICAgICAgICAgICAgICAgIG1Sb3V0ZU9iaiA9IHJvdXRlT2JqOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBjbGFzcyBTeXN0ZW1Sb3V0ZUNvbnRyb2xsZXIgZXh0ZW5kcyBSb3V0ZUNvbnRyb2xsZXIgewotICAgICAgICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgbVJvdXRlT2JqOwotCi0gICAgICAgICAgICBwdWJsaWMgU3lzdGVtUm91dGVDb250cm9sbGVyKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgICAgIG1Sb3V0ZU9iaiA9IHJvdXRlT2JqOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU2V0Vm9sdW1lKGludCB2b2x1bWUpIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5Sb3V0ZUluZm8ucmVxdWVzdFNldFZvbHVtZShtUm91dGVPYmosIHZvbHVtZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIHZvaWQgb25VcGRhdGVWb2x1bWUoaW50IGRlbHRhKSB7Ci0gICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uUm91dGVJbmZvLnJlcXVlc3RVcGRhdGVWb2x1bWUobVJvdXRlT2JqLCBkZWx0YSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBKZWxseWJlYW4gTVIxIGltcGxlbWVudGF0aW9uLgotICAgICAqLwotICAgIC8vIEBAUmVxdWlyZXNBcGkoMTcpCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSmVsbHliZWFuTXIxSW1wbCBleHRlbmRzIEplbGx5YmVhbkltcGwKLSAgICAgICAgICAgIGltcGxlbWVudHMgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuQ2FsbGJhY2sgewotICAgICAgICBwcml2YXRlIE1lZGlhUm91dGVySmVsbHliZWFuTXIxLkFjdGl2ZVNjYW5Xb3JrYXJvdW5kIG1BY3RpdmVTY2FuV29ya2Fyb3VuZDsKLSAgICAgICAgcHJpdmF0ZSBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kIG1Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kOwotCi0gICAgICAgIHB1YmxpYyBKZWxseWJlYW5NcjFJbXBsKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlUHJlc2VudGF0aW9uRGlzcGxheUNoYW5nZWQoT2JqZWN0IHJvdXRlT2JqKSB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBmaW5kU3lzdGVtUm91dGVSZWNvcmQocm91dGVPYmopOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQgPSBtU3lzdGVtUm91dGVSZWNvcmRzLmdldChpbmRleCk7Ci0gICAgICAgICAgICAgICAgRGlzcGxheSBuZXdQcmVzZW50YXRpb25EaXNwbGF5ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuTXIxLlJvdXRlSW5mby5nZXRQcmVzZW50YXRpb25EaXNwbGF5KHJvdXRlT2JqKTsKLSAgICAgICAgICAgICAgICBpbnQgbmV3UHJlc2VudGF0aW9uRGlzcGxheUlkID0gKG5ld1ByZXNlbnRhdGlvbkRpc3BsYXkgIT0gbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXdQcmVzZW50YXRpb25EaXNwbGF5LmdldERpc3BsYXlJZCgpIDogLTEpOwotICAgICAgICAgICAgICAgIGlmIChuZXdQcmVzZW50YXRpb25EaXNwbGF5SWQKLSAgICAgICAgICAgICAgICAgICAgICAgICE9IHJlY29yZC5tUm91dGVEZXNjcmlwdG9yLmdldFByZXNlbnRhdGlvbkRpc3BsYXlJZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJlY29yZC5tUm91dGVEZXNjcmlwdG9yID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTWVkaWFSb3V0ZURlc2NyaXB0b3IuQnVpbGRlcihyZWNvcmQubVJvdXRlRGVzY3JpcHRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0UHJlc2VudGF0aW9uRGlzcGxheUlkKG5ld1ByZXNlbnRhdGlvbkRpc3BsYXlJZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgICAgICAgICAgICAgICAgcHVibGlzaFJvdXRlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkLCBidWlsZGVyKTsKLQotICAgICAgICAgICAgaWYgKCFNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Sb3V0ZUluZm8uaXNFbmFibGVkKHJlY29yZC5tUm91dGVPYmopKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGlzQ29ubmVjdGluZyhyZWNvcmQpKSB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5zZXRDb25uZWN0aW5nKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBEaXNwbGF5IHByZXNlbnRhdGlvbkRpc3BsYXkgPQotICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5Sb3V0ZUluZm8uZ2V0UHJlc2VudGF0aW9uRGlzcGxheShyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgICAgIGlmIChwcmVzZW50YXRpb25EaXNwbGF5ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLnNldFByZXNlbnRhdGlvbkRpc3BsYXlJZChwcmVzZW50YXRpb25EaXNwbGF5LmdldERpc3BsYXlJZCgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCB1cGRhdGVDYWxsYmFjaygpIHsKLSAgICAgICAgICAgIHN1cGVyLnVwZGF0ZUNhbGxiYWNrKCk7Ci0KLSAgICAgICAgICAgIGlmIChtQWN0aXZlU2Nhbldvcmthcm91bmQgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1BY3RpdmVTY2FuV29ya2Fyb3VuZCA9IG5ldyBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5BY3RpdmVTY2FuV29ya2Fyb3VuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbnRleHQoKSwgZ2V0SGFuZGxlcigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1BY3RpdmVTY2FuV29ya2Fyb3VuZC5zZXRBY3RpdmVTY2FuUm91dGVUeXBlcyhtQWN0aXZlU2NhbiA/IG1Sb3V0ZVR5cGVzIDogMCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBjcmVhdGVDYWxsYmFja09iaigpIHsKLSAgICAgICAgICAgIHJldHVybiBNZWRpYVJvdXRlckplbGx5YmVhbk1yMS5jcmVhdGVDYWxsYmFjayh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByb3RlY3RlZCBib29sZWFuIGlzQ29ubmVjdGluZyhTeXN0ZW1Sb3V0ZVJlY29yZCByZWNvcmQpIHsKLSAgICAgICAgICAgIGlmIChtSXNDb25uZWN0aW5nV29ya2Fyb3VuZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbUlzQ29ubmVjdGluZ1dvcmthcm91bmQgPSBuZXcgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjEuSXNDb25uZWN0aW5nV29ya2Fyb3VuZCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG1Jc0Nvbm5lY3RpbmdXb3JrYXJvdW5kLmlzQ29ubmVjdGluZyhyZWNvcmQubVJvdXRlT2JqKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEplbGx5YmVhbiBNUjIgaW1wbGVtZW50YXRpb24uCi0gICAgICovCi0gICAgLy8gQEBSZXF1aXJlc0FwaSgxOCkKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBKZWxseWJlYW5NcjJJbXBsIGV4dGVuZHMgSmVsbHliZWFuTXIxSW1wbCB7Ci0gICAgICAgIHB1YmxpYyBKZWxseWJlYW5NcjJJbXBsKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkLCBidWlsZGVyKTsKLQotICAgICAgICAgICAgQ2hhclNlcXVlbmNlIGRlc2NyaXB0aW9uID0KLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuUm91dGVJbmZvLmdldERlc2NyaXB0aW9uKHJlY29yZC5tUm91dGVPYmopOwotICAgICAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLnNldERlc2NyaXB0aW9uKGRlc2NyaXB0aW9uLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHNlbGVjdFJvdXRlKE9iamVjdCByb3V0ZU9iaikgewotICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uc2VsZWN0Um91dGUobVJvdXRlck9iaiwKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFSb3V0ZXJKZWxseWJlYW4uQUxMX1JPVVRFX1RZUEVTLCByb3V0ZU9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIE9iamVjdCBnZXREZWZhdWx0Um91dGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gTWVkaWFSb3V0ZXJKZWxseWJlYW5NcjIuZ2V0RGVmYXVsdFJvdXRlKG1Sb3V0ZXJPYmopOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZVVzZXJSb3V0ZVByb3BlcnRpZXMoVXNlclJvdXRlUmVjb3JkIHJlY29yZCkgewotICAgICAgICAgICAgc3VwZXIudXBkYXRlVXNlclJvdXRlUHJvcGVydGllcyhyZWNvcmQpOwotCi0gICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbk1yMi5Vc2VyUm91dGVJbmZvLnNldERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICByZWNvcmQubVJvdXRlT2JqLCByZWNvcmQubVJvdXRlLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHVwZGF0ZUNhbGxiYWNrKCkgewotICAgICAgICAgICAgaWYgKG1DYWxsYmFja1JlZ2lzdGVyZWQpIHsKLSAgICAgICAgICAgICAgICBNZWRpYVJvdXRlckplbGx5YmVhbi5yZW1vdmVDYWxsYmFjayhtUm91dGVyT2JqLCBtQ2FsbGJhY2tPYmopOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtQ2FsbGJhY2tSZWdpc3RlcmVkID0gdHJ1ZTsKLSAgICAgICAgICAgIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLmFkZENhbGxiYWNrKG1Sb3V0ZXJPYmosIG1Sb3V0ZVR5cGVzLCBtQ2FsbGJhY2tPYmosCi0gICAgICAgICAgICAgICAgICAgIE1lZGlhUm91dGVyLkNBTExCQUNLX0ZMQUdfVU5GSUxURVJFRF9FVkVOVFMKLSAgICAgICAgICAgICAgICAgICAgfCAobUFjdGl2ZVNjYW4gPyBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4gOiAwKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDb25uZWN0aW5nKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCkgewotICAgICAgICAgICAgcmV0dXJuIE1lZGlhUm91dGVySmVsbHliZWFuTXIyLlJvdXRlSW5mby5pc0Nvbm5lY3RpbmcocmVjb3JkLm1Sb3V0ZU9iaik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBcGkyNCBpbXBsZW1lbnRhdGlvbi4KLSAgICAgKi8KLSAgICAvLyBAQFJlcXVpcmVzQXBpKDI0KQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIEFwaTI0SW1wbCBleHRlbmRzIEplbGx5YmVhbk1yMkltcGwgewotICAgICAgICBwdWJsaWMgQXBpMjRJbXBsKENvbnRleHQgY29udGV4dCwgU3luY0NhbGxiYWNrIHN5bmNDYWxsYmFjaykgewotICAgICAgICAgICAgc3VwZXIoY29udGV4dCwgc3luY0NhbGxiYWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWxkU3lzdGVtUm91dGVEZXNjcmlwdG9yKFN5c3RlbVJvdXRlUmVjb3JkIHJlY29yZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYVJvdXRlRGVzY3JpcHRvci5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgICAgIHN1cGVyLm9uQnVpbGRTeXN0ZW1Sb3V0ZURlc2NyaXB0b3IocmVjb3JkLCBidWlsZGVyKTsKLQotICAgICAgICAgICAgYnVpbGRlci5zZXREZXZpY2VUeXBlKE1lZGlhUm91dGVyQXBpMjQuUm91dGVJbmZvLmdldERldmljZVR5cGUocmVjb3JkLm1Sb3V0ZU9iaikpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL3BhY2thZ2UuaHRtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvc3VwcG9ydC9tZWRpYXJvdXRlci9tZWRpYS9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlMmFhZjIuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC9zdXBwb3J0L21lZGlhcm91dGVyL21lZGlhL3BhY2thZ2UuaHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotPGh0bWw+Ci0KLTxib2R5PgotCi08cD5Db250YWlucyBBUElzIHRoYXQgY29udHJvbCB0aGUgcm91dGluZyBvZiBtZWRpYSBjaGFubmVscyBhbmQgc3RyZWFtcyBmcm9tIHRoZSBjdXJyZW50IGRldmljZQotICB0byBleHRlcm5hbCBzcGVha2VycyBhbmQgZGVzdGluYXRpb24gZGV2aWNlcy48L3A+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L0Jhc2VMYXlvdXQuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L0Jhc2VMYXlvdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2NDcxZC4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9CYXNlTGF5b3V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZXdHcm91cFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXdHcm91cDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLkxheW91dFBhcmFtczsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwLk1hcmdpbkxheW91dFBhcmFtczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLXB1YmxpYyBjbGFzcyBCYXNlTGF5b3V0IGV4dGVuZHMgVmlld0dyb3VwSW1wbCB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3R3JvdXAgbUluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgVmlld0dyb3VwUHJvdmlkZXIgbVN1cGVyUHJvdmlkZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3R3JvdXBQcm92aWRlciBtUHJpdmF0ZVByb3ZpZGVyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBBcnJheUxpc3Q8Vmlldz4gbU1hdGNoUGFyZW50Q2hpbGRyZW4gPSBuZXcgQXJyYXlMaXN0PD4oMSk7Ci0KLSAgICBwdWJsaWMgQmFzZUxheW91dChWaWV3R3JvdXAgaW5zdGFuY2UsCi0gICAgICAgICAgICBWaWV3R3JvdXBQcm92aWRlciBzdXBlclByb3ZpZGVyLCBWaWV3R3JvdXBQcm92aWRlciBwcml2YXRlUHJvdmlkZXIpIHsKLSAgICAgICAgc3VwZXIoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgICAgICBtU3VwZXJQcm92aWRlciA9IHN1cGVyUHJvdmlkZXI7Ci0gICAgICAgIG1Qcml2YXRlUHJvdmlkZXIgPSBwcml2YXRlUHJvdmlkZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tMYXlvdXRQYXJhbXNfaW1wbChMYXlvdXRQYXJhbXMgcCkgewotICAgICAgICByZXR1cm4gcCBpbnN0YW5jZW9mIE1hcmdpbkxheW91dFBhcmFtczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGF5b3V0UGFyYW1zIGdlbmVyYXRlRGVmYXVsdExheW91dFBhcmFtc19pbXBsKCkgewotICAgICAgICByZXR1cm4gbmV3IE1hcmdpbkxheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwoQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHJldHVybiBuZXcgTWFyZ2luTGF5b3V0UGFyYW1zKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIGF0dHJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwoTGF5b3V0UGFyYW1zIGxwKSB7Ci0gICAgICAgIGlmIChscCBpbnN0YW5jZW9mIE1hcmdpbkxheW91dFBhcmFtcykgewotICAgICAgICAgICAgcmV0dXJuIGxwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXcgTWFyZ2luTGF5b3V0UGFyYW1zKGxwKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbk1lYXN1cmVfaW1wbChpbnQgd2lkdGhNZWFzdXJlU3BlYywgaW50IGhlaWdodE1lYXN1cmVTcGVjKSB7Ci0gICAgICAgIGludCBjb3VudCA9IG1JbnN0YW5jZS5nZXRDaGlsZENvdW50KCk7Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBtZWFzdXJlTWF0Y2hQYXJlbnRDaGlsZHJlbiA9Ci0gICAgICAgICAgICAgICAgVmlldy5NZWFzdXJlU3BlYy5nZXRNb2RlKHdpZHRoTWVhc3VyZVNwZWMpICE9IFZpZXcuTWVhc3VyZVNwZWMuRVhBQ1RMWSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgVmlldy5NZWFzdXJlU3BlYy5nZXRNb2RlKGhlaWdodE1lYXN1cmVTcGVjKSAhPSBWaWV3Lk1lYXN1cmVTcGVjLkVYQUNUTFk7Ci0gICAgICAgIG1NYXRjaFBhcmVudENoaWxkcmVuLmNsZWFyKCk7Ci0KLSAgICAgICAgaW50IG1heEhlaWdodCA9IDA7Ci0gICAgICAgIGludCBtYXhXaWR0aCA9IDA7Ci0gICAgICAgIGludCBjaGlsZFN0YXRlID0gMDsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIFZpZXcgY2hpbGQgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRBdChpKTsKLSAgICAgICAgICAgIGlmIChjaGlsZC5nZXRWaXNpYmlsaXR5KCkgIT0gVmlldy5HT05FKSB7Ci0gICAgICAgICAgICAgICAgbVByaXZhdGVQcm92aWRlci5tZWFzdXJlQ2hpbGRXaXRoTWFyZ2luc19pbXBsKAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQsIHdpZHRoTWVhc3VyZVNwZWMsIDAsIGhlaWdodE1lYXN1cmVTcGVjLCAwKTsKLSAgICAgICAgICAgICAgICBmaW5hbCBNYXJnaW5MYXlvdXRQYXJhbXMgbHAgPSAoTWFyZ2luTGF5b3V0UGFyYW1zKSBjaGlsZC5nZXRMYXlvdXRQYXJhbXMoKTsKLSAgICAgICAgICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpICsgbHAubGVmdE1hcmdpbiArIGxwLnJpZ2h0TWFyZ2luKTsKLSAgICAgICAgICAgICAgICBtYXhIZWlnaHQgPSBNYXRoLm1heChtYXhIZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpICsgbHAudG9wTWFyZ2luICsgbHAuYm90dG9tTWFyZ2luKTsKLSAgICAgICAgICAgICAgICBjaGlsZFN0YXRlID0gY2hpbGRTdGF0ZSB8IGNoaWxkLmdldE1lYXN1cmVkU3RhdGUoKTsKLSAgICAgICAgICAgICAgICBpZiAobWVhc3VyZU1hdGNoUGFyZW50Q2hpbGRyZW4pIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGxwLndpZHRoID09IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC5oZWlnaHQgPT0gTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1hdGNoUGFyZW50Q2hpbGRyZW4uYWRkKGNoaWxkKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFjY291bnQgZm9yIHBhZGRpbmcgdG9vCi0gICAgICAgIG1heFdpZHRoICs9IGdldFBhZGRpbmdMZWZ0V2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCk7Ci0gICAgICAgIG1heEhlaWdodCArPSBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpOwotCi0gICAgICAgIC8vIENoZWNrIGFnYWluc3Qgb3VyIG1pbmltdW0gaGVpZ2h0IGFuZCB3aWR0aAotICAgICAgICBtYXhIZWlnaHQgPSBNYXRoLm1heChtYXhIZWlnaHQsIG1Qcml2YXRlUHJvdmlkZXIuZ2V0U3VnZ2VzdGVkTWluaW11bUhlaWdodF9pbXBsKCkpOwotICAgICAgICBtYXhXaWR0aCA9IE1hdGgubWF4KG1heFdpZHRoLCBtUHJpdmF0ZVByb3ZpZGVyLmdldFN1Z2dlc3RlZE1pbmltdW1XaWR0aF9pbXBsKCkpOwotCi0gICAgICAgIC8vIENoZWNrIGFnYWluc3Qgb3VyIGZvcmVncm91bmQncyBtaW5pbXVtIGhlaWdodCBhbmQgd2lkdGgKLSAgICAgICAgZmluYWwgRHJhd2FibGUgZHJhd2FibGUgPSBtSW5zdGFuY2UuZ2V0Rm9yZWdyb3VuZCgpOwotICAgICAgICBpZiAoZHJhd2FibGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbWF4SGVpZ2h0ID0gTWF0aC5tYXgobWF4SGVpZ2h0LCBkcmF3YWJsZS5nZXRNaW5pbXVtSGVpZ2h0KCkpOwotICAgICAgICAgICAgbWF4V2lkdGggPSBNYXRoLm1heChtYXhXaWR0aCwgZHJhd2FibGUuZ2V0TWluaW11bVdpZHRoKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVByaXZhdGVQcm92aWRlci5zZXRNZWFzdXJlZERpbWVuc2lvbl9pbXBsKAotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5yZXNvbHZlU2l6ZUFuZFN0YXRlKG1heFdpZHRoLCB3aWR0aE1lYXN1cmVTcGVjLCBjaGlsZFN0YXRlKSwKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVzb2x2ZVNpemVBbmRTdGF0ZShtYXhIZWlnaHQsIGhlaWdodE1lYXN1cmVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRTdGF0ZSA8PCBWaWV3Lk1FQVNVUkVEX0hFSUdIVF9TVEFURV9TSElGVCkpOwotCi0gICAgICAgIGNvdW50ID0gbU1hdGNoUGFyZW50Q2hpbGRyZW4uc2l6ZSgpOwotICAgICAgICBpZiAoY291bnQgPiAxKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbU1hdGNoUGFyZW50Q2hpbGRyZW4uZ2V0KGkpOwotICAgICAgICAgICAgICAgIGZpbmFsIE1hcmdpbkxheW91dFBhcmFtcyBscCA9IChNYXJnaW5MYXlvdXRQYXJhbXMpIGNoaWxkLmdldExheW91dFBhcmFtcygpOwotCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IGNoaWxkV2lkdGhNZWFzdXJlU3BlYzsKLSAgICAgICAgICAgICAgICBpZiAobHAud2lkdGggPT0gTGF5b3V0UGFyYW1zLk1BVENIX1BBUkVOVCkgewotICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2lkdGggPSBNYXRoLm1heCgwLCBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCkgLSBnZXRQYWRkaW5nUmlnaHRXaXRoRm9yZWdyb3VuZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBscC5sZWZ0TWFyZ2luIC0gbHAucmlnaHRNYXJnaW4pOwotICAgICAgICAgICAgICAgICAgICBjaGlsZFdpZHRoTWVhc3VyZVNwZWMgPSBWaWV3Lk1lYXN1cmVTcGVjLm1ha2VNZWFzdXJlU3BlYygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgVmlldy5NZWFzdXJlU3BlYy5FWEFDVExZKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjaGlsZFdpZHRoTWVhc3VyZVNwZWMgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRNZWFzdXJlU3BlYyh3aWR0aE1lYXN1cmVTcGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFBhZGRpbmdMZWZ0V2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHAubGVmdE1hcmdpbiArIGxwLnJpZ2h0TWFyZ2luLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLndpZHRoKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBmaW5hbCBpbnQgY2hpbGRIZWlnaHRNZWFzdXJlU3BlYzsKLSAgICAgICAgICAgICAgICBpZiAobHAuaGVpZ2h0ID09IExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpIHsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGhlaWdodCA9IE1hdGgubWF4KDAsIG1JbnN0YW5jZS5nZXRNZWFzdXJlZEhlaWdodCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKSAtIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBscC50b3BNYXJnaW4gLSBscC5ib3R0b21NYXJnaW4pOwotICAgICAgICAgICAgICAgICAgICBjaGlsZEhlaWdodE1lYXN1cmVTcGVjID0gVmlldy5NZWFzdXJlU3BlYy5tYWtlTWVhc3VyZVNwZWMoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0LCBWaWV3Lk1lYXN1cmVTcGVjLkVYQUNUTFkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGNoaWxkSGVpZ2h0TWVhc3VyZVNwZWMgPSBtSW5zdGFuY2UuZ2V0Q2hpbGRNZWFzdXJlU3BlYyhoZWlnaHRNZWFzdXJlU3BlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRQYWRkaW5nVG9wV2l0aEZvcmVncm91bmQoKSArIGdldFBhZGRpbmdCb3R0b21XaXRoRm9yZWdyb3VuZCgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxwLnRvcE1hcmdpbiArIGxwLmJvdHRvbU1hcmdpbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBscC5oZWlnaHQpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGNoaWxkLm1lYXN1cmUoY2hpbGRXaWR0aE1lYXN1cmVTcGVjLCBjaGlsZEhlaWdodE1lYXN1cmVTcGVjKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTGF5b3V0X2ltcGwoYm9vbGVhbiBjaGFuZ2VkLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSB7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IG1JbnN0YW5jZS5nZXRDaGlsZENvdW50KCk7Ci0KLSAgICAgICAgZmluYWwgaW50IHBhcmVudExlZnQgPSBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCk7Ci0gICAgICAgIGZpbmFsIGludCBwYXJlbnRSaWdodCA9IHJpZ2h0IC0gbGVmdCAtIGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCk7Ci0KLSAgICAgICAgZmluYWwgaW50IHBhcmVudFRvcCA9IGdldFBhZGRpbmdUb3BXaXRoRm9yZWdyb3VuZCgpOwotICAgICAgICBmaW5hbCBpbnQgcGFyZW50Qm90dG9tID0gYm90dG9tIC0gdG9wIC0gZ2V0UGFkZGluZ0JvdHRvbVdpdGhGb3JlZ3JvdW5kKCk7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBWaWV3IGNoaWxkID0gbUluc3RhbmNlLmdldENoaWxkQXQoaSk7Ci0gICAgICAgICAgICBpZiAoY2hpbGQuZ2V0VmlzaWJpbGl0eSgpICE9IFZpZXcuR09ORSkgewotICAgICAgICAgICAgICAgIGZpbmFsIE1hcmdpbkxheW91dFBhcmFtcyBscCA9IChNYXJnaW5MYXlvdXRQYXJhbXMpIGNoaWxkLmdldExheW91dFBhcmFtcygpOwotCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHdpZHRoID0gY2hpbGQuZ2V0TWVhc3VyZWRXaWR0aCgpOwotICAgICAgICAgICAgICAgIGZpbmFsIGludCBoZWlnaHQgPSBjaGlsZC5nZXRNZWFzdXJlZEhlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgaW50IGNoaWxkTGVmdDsKLSAgICAgICAgICAgICAgICBpbnQgY2hpbGRUb3A7Ci0KLSAgICAgICAgICAgICAgICBjaGlsZExlZnQgPSBwYXJlbnRMZWZ0ICsgKHBhcmVudFJpZ2h0IC0gcGFyZW50TGVmdCAtIHdpZHRoKSAvIDIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbHAubGVmdE1hcmdpbiAtIGxwLnJpZ2h0TWFyZ2luOwotCi0gICAgICAgICAgICAgICAgY2hpbGRUb3AgPSBwYXJlbnRUb3AgKyAocGFyZW50Qm90dG9tIC0gcGFyZW50VG9wIC0gaGVpZ2h0KSAvIDIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbHAudG9wTWFyZ2luIC0gbHAuYm90dG9tTWFyZ2luOwotCi0gICAgICAgICAgICAgICAgY2hpbGQubGF5b3V0KGNoaWxkTGVmdCwgY2hpbGRUb3AsIGNoaWxkTGVmdCArIHdpZHRoLCBjaGlsZFRvcCArIGhlaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBzaG91bGREZWxheUNoaWxkUHJlc3NlZFN0YXRlX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRQYWRkaW5nTGVmdFdpdGhGb3JlZ3JvdW5kKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nTGVmdCgpLCAwKSA6Ci0gICAgICAgICAgICAgICAgbUluc3RhbmNlLmdldFBhZGRpbmdMZWZ0KCkgKyAwOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldFBhZGRpbmdSaWdodFdpdGhGb3JlZ3JvdW5kKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nUmlnaHQoKSwgMCkgOgotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRQYWRkaW5nUmlnaHQoKSArIDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0UGFkZGluZ1RvcFdpdGhGb3JlZ3JvdW5kKCkgewotICAgICAgICByZXR1cm4gbUluc3RhbmNlLmlzRm9yZWdyb3VuZEluc2lkZVBhZGRpbmcoKSA/IE1hdGgubWF4KG1JbnN0YW5jZS5nZXRQYWRkaW5nVG9wKCksIDApIDoKLSAgICAgICAgICAgICAgICBtSW5zdGFuY2UuZ2V0UGFkZGluZ1RvcCgpICsgMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRQYWRkaW5nQm90dG9tV2l0aEZvcmVncm91bmQoKSB7Ci0gICAgICAgIHJldHVybiBtSW5zdGFuY2UuaXNGb3JlZ3JvdW5kSW5zaWRlUGFkZGluZygpID8gTWF0aC5tYXgobUluc3RhbmNlLmdldFBhZGRpbmdCb3R0b20oKSwgMCkgOgotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5nZXRQYWRkaW5nQm90dG9tKCkgKyAwOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L01lZGlhQ29udHJvbFZpZXcySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvTWVkaWFDb250cm9sVmlldzJJbXBsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhZmYxNTAuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvTWVkaWFDb250cm9sVmlldzJJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5Qb2ludDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhQ29udHJvbGxlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuTWVkaWFDb250cm9sVmlldzJQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWV3R3JvdXBQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLnN1cHBvcnQuYW5ub3RhdGlvbi5OdWxsYWJsZTsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LkdyYXZpdHk7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXA7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LldpbmRvd01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQWRhcHRlclZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQmFzZUFkYXB0ZXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlQnV0dG9uOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5MaW5lYXJMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTGlzdFZpZXc7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuTWVkaWFDb250cm9sVmlldzI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUHJvZ3Jlc3NCYXI7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUG9wdXBXaW5kb3c7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuUmVsYXRpdmVMYXlvdXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuU2Vla0JhcjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5TZWVrQmFyLk9uU2Vla0JhckNoYW5nZUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LlRleHRWaWV3OwotCi1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEudXBkYXRlLkFwaUhlbHBlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuUjsKLWltcG9ydCBjb20uYW5kcm9pZC5zdXBwb3J0Lm1lZGlhcm91dGVyLmFwcC5NZWRpYVJvdXRlQnV0dG9uOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkZvcm1hdHRlcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1wdWJsaWMgY2xhc3MgTWVkaWFDb250cm9sVmlldzJJbXBsIGV4dGVuZHMgQmFzZUxheW91dCBpbXBsZW1lbnRzIE1lZGlhQ29udHJvbFZpZXcyUHJvdmlkZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiTWVkaWFDb250cm9sVmlldzIiOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYUNvbnRyb2xWaWV3MiBtSW5zdGFuY2U7Ci0KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEFSR1VNRU5UX0tFWV9GVUxMU0NSRUVOID0gImZ1bGxTY3JlZW4iOwotCi0gICAgLy8gVE9ETzogTW92ZSB0aGVzZSBjb25zdGFudHMgdG8gcHVibGljIGFwaSB0byBzdXBwb3J0IGN1c3RvbSB2aWRlbyB2aWV3LgotICAgIC8vIFRPRE86IENvbWJpbmUgdGhlc2UgY29uc3RhbnRzIGludG8gb25lIHJlZ2FyZGluZyBUcmFja0luZm8uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfVklERU9fVFJBQ0tfQ09VTlQgPSAiVmlkZW9UcmFja0NvdW50IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9BVURJT19UUkFDS19DT1VOVCA9ICJBdWRpb1RyYWNrQ291bnQiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgS0VZX1NVQlRJVExFX1RSQUNLX0NPVU5UID0gIlN1YnRpdGxlVHJhY2tDb3VudCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfUExBWUJBQ0tfU1BFRUQgPSAiUGxheWJhY2tTcGVlZCI7Ci0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU0VMRUNURURfQVVESU9fSU5ERVggPSAiU2VsZWN0ZWRBdWRpb0luZGV4IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEtFWV9TRUxFQ1RFRF9TVUJUSVRMRV9JTkRFWCA9ICJTZWxlY3RlZFN1YnRpdGxlSW5kZXgiOwotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgRVZFTlRfVVBEQVRFX1RSQUNLX1NUQVRVUyA9ICJVcGRhdGVUcmFja1N0YXR1cyI7Ci0KLSAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBvbmNlIGludGVncmF0aW5nIHdpdGggTWVkaWFTZXNzaW9uMiAmIE1lZGlhTWV0YWRhdGEyCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBLRVlfU1RBVEVfSVNfQURWRVJUSVNFTUVOVCA9ICJNZWRpYVR5cGVBZHZlcnRpc2VtZW50IjsKLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIEVWRU5UX1VQREFURV9NRURJQV9UWVBFX1NUQVRVUyA9ICJVcGRhdGVNZWRpYVR5cGVTdGF0dXMiOwotCi0gICAgLy8gU3RyaW5nIGZvciBzZW5kaW5nIGNvbW1hbmQgdG8gc2hvdyBzdWJ0aXRsZSB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1NIT1dfU1VCVElUTEUgPSAic2hvd1N1YnRpdGxlIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBoaWRlIHN1YnRpdGxlIHRvIE1lZGlhU2Vzc2lvbi4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfSElERV9TVUJUSVRMRSA9ICJoaWRlU3VidGl0bGUiOwotICAgIC8vIFRPRE86IHJlbW92ZSBvbmNlIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyByZXZpc2VkCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TRVRfRlVMTFNDUkVFTiA9ICJzZXRGdWxsc2NyZWVuIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBzZWxlY3QgYXVkaW8gdHJhY2sgdG8gTWVkaWFTZXNzaW9uLgotICAgIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NTUFORF9TRUxFQ1RfQVVESU9fVFJBQ0sgPSAiU2VsZWN0VHJhY2siOwotICAgIC8vIFN0cmluZyBmb3Igc2VuZGluZyBjb21tYW5kIHRvIHNldCBwbGF5YmFjayBzcGVlZCB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1NFVF9QTEFZQkFDS19TUEVFRCA9ICJTZXRQbGF5YmFja1NwZWVkIjsKLSAgICAvLyBTdHJpbmcgZm9yIHNlbmRpbmcgY29tbWFuZCB0byBtdXRlIGF1ZGlvIHRvIE1lZGlhU2Vzc2lvbi4KLSAgICBzdGF0aWMgZmluYWwgU3RyaW5nIENPTU1BTkRfTVVURT0gIk11dGUiOwotICAgIC8vIFN0cmluZyBmb3Igc2VuZGluZyBjb21tYW5kIHRvIHVubXV0ZSBhdWRpbyB0byBNZWRpYVNlc3Npb24uCi0gICAgc3RhdGljIGZpbmFsIFN0cmluZyBDT01NQU5EX1VOTVVURSA9ICJVbm11dGUiOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0sgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTRVRUSU5HU19NT0RFX1BMQVlCQUNLX1NQRUVEID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUVElOR1NfTU9ERV9IRUxQID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0VUVElOR1NfTU9ERV9TVUJUSVRMRV9UUkFDSyA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfVklERU9fUVVBTElUWSA9IDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNFVFRJTkdTX01PREVfTUFJTiA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFBMQVlCQUNLX1NQRUVEXzF4X0lOREVYID0gMzsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRURJQV9UWVBFX0RFRkFVTFQgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBNRURJQV9UWVBFX01VU0lDID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUVESUFfVFlQRV9BRFZFUlRJU0VNRU5UID0gMjsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFX1RZUEVfRU1CRURERUQgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFX1RZUEVfRlVMTCA9IDE7Ci0gICAgLy8gVE9ETzogYWRkIHN1cHBvcnQgZm9yIE1pbmltYWwgc2l6ZSB0eXBlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTSVpFX1RZUEVfTUlOSU1BTCA9IDI7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1BST0dSRVNTID0gMTAwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9QUk9HUkVTU19VUERBVEVfVElNRV9NUyA9IDEwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFV0lORF9USU1FX01TID0gMTAwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZPUldBUkRfVElNRV9NUyA9IDMwMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBBRF9TS0lQX1dBSVRfVElNRV9NUyA9IDUwMDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJFU09VUkNFX05PTl9FWElTVEVOVCA9IC0xOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBSRVNPVVJDRV9FTVBUWSA9ICIiOwotCi0gICAgcHJpdmF0ZSBSZXNvdXJjZXMgbVJlc291cmNlczsKLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbGxlciBtQ29udHJvbGxlcjsKLSAgICBwcml2YXRlIE1lZGlhQ29udHJvbGxlci5UcmFuc3BvcnRDb250cm9scyBtQ29udHJvbHM7Ci0gICAgcHJpdmF0ZSBQbGF5YmFja1N0YXRlIG1QbGF5YmFja1N0YXRlOwotICAgIHByaXZhdGUgTWVkaWFNZXRhZGF0YSBtTWV0YWRhdGE7Ci0gICAgcHJpdmF0ZSBpbnQgbUR1cmF0aW9uOwotICAgIHByaXZhdGUgaW50IG1QcmV2U3RhdGU7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZXaWR0aDsKLSAgICBwcml2YXRlIGludCBtUHJldkhlaWdodDsKLSAgICBwcml2YXRlIGludCBtT3JpZ2luYWxMZWZ0QmFyV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbVZpZGVvVHJhY2tDb3VudDsKLSAgICBwcml2YXRlIGludCBtQXVkaW9UcmFja0NvdW50OwotICAgIHByaXZhdGUgaW50IG1TdWJ0aXRsZVRyYWNrQ291bnQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVNldHRpbmdzTW9kZTsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXg7Ci0gICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4OwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZFZpZGVvUXVhbGl0eUluZGV4OwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZFNwZWVkSW5kZXg7Ci0gICAgcHJpdmF0ZSBpbnQgbUVtYmVkZGVkU2V0dGluZ3NJdGVtV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbUZ1bGxTZXR0aW5nc0l0ZW1XaWR0aDsKLSAgICBwcml2YXRlIGludCBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1IZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbUZ1bGxTZXR0aW5nc0l0ZW1IZWlnaHQ7Ci0gICAgcHJpdmF0ZSBpbnQgbVNldHRpbmdzV2luZG93TWFyZ2luOwotICAgIHByaXZhdGUgaW50IG1NZWRpYVR5cGU7Ci0gICAgcHJpdmF0ZSBpbnQgbVNpemVUeXBlOwotICAgIHByaXZhdGUgbG9uZyBtUGxheWJhY2tBY3Rpb25zOwotICAgIHByaXZhdGUgYm9vbGVhbiBtRHJhZ2dpbmc7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1Jc0Z1bGxTY3JlZW47Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1PdmVyZmxvd0V4cGFuZGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNTdG9wcGVkOwotICAgIHByaXZhdGUgYm9vbGVhbiBtU3VidGl0bGVJc0VuYWJsZWQ7Ci0gICAgcHJpdmF0ZSBib29sZWFuIG1TZWVrQXZhaWxhYmxlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNBZHZlcnRpc2VtZW50OwotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNNdXRlOwotICAgIHByaXZhdGUgYm9vbGVhbiBtTmVlZFVYVXBkYXRlOwotCi0gICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyIFZpZXcKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtUm9vdDsKLSAgICBwcml2YXRlIFZpZXcgbVRpdGxlQmFyOwotICAgIHByaXZhdGUgVGV4dFZpZXcgbVRpdGxlVmlldzsKLSAgICBwcml2YXRlIFZpZXcgbUFkRXh0ZXJuYWxMaW5rOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbUJhY2tCdXR0b247Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlQnV0dG9uIG1Sb3V0ZUJ1dHRvbjsKLSAgICBwcml2YXRlIE1lZGlhUm91dGVTZWxlY3RvciBtUm91dGVTZWxlY3RvcjsKLQotICAgIC8vIFJlbGF0aW5nIHRvIENlbnRlciBWaWV3Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUNlbnRlclZpZXc7Ci0gICAgcHJpdmF0ZSBWaWV3IG1UcmFuc3BvcnRDb250cm9sczsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1QbGF5UGF1c2VCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtRmZ3ZEJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1SZXdCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtTmV4dEJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1QcmV2QnV0dG9uOwotCi0gICAgLy8gUmVsYXRpbmcgdG8gTWluaW1hbCBFeHRyYSBWaWV3Ci0gICAgcHJpdmF0ZSBMaW5lYXJMYXlvdXQgbU1pbmltYWxFeHRyYVZpZXc7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIgVmlldwotICAgIHByaXZhdGUgUHJvZ3Jlc3NCYXIgbVByb2dyZXNzOwotICAgIHByaXZhdGUgVmlldyBtUHJvZ3Jlc3NCdWZmZXI7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyIFZpZXcKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtQm90dG9tQmFyOwotCi0gICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBMZWZ0IFZpZXcKLSAgICBwcml2YXRlIFZpZXdHcm91cCBtQm90dG9tQmFyTGVmdFZpZXc7Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbVRpbWVWaWV3OwotICAgIHByaXZhdGUgVGV4dFZpZXcgbUVuZFRpbWU7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtQ3VycmVudFRpbWU7Ci0gICAgcHJpdmF0ZSBUZXh0VmlldyBtQWRTa2lwVmlldzsKLSAgICBwcml2YXRlIFN0cmluZ0J1aWxkZXIgbUZvcm1hdEJ1aWxkZXI7Ci0gICAgcHJpdmF0ZSBGb3JtYXR0ZXIgbUZvcm1hdHRlcjsKLQotICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgUmlnaHQgVmlldwotICAgIHByaXZhdGUgVmlld0dyb3VwIG1Cb3R0b21CYXJSaWdodFZpZXc7Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUJhc2ljQ29udHJvbHM7Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUV4dHJhQ29udHJvbHM7Ci0gICAgcHJpdmF0ZSBWaWV3R3JvdXAgbUN1c3RvbUJ1dHRvbnM7Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtU3VidGl0bGVCdXR0b247Ci0gICAgcHJpdmF0ZSBJbWFnZUJ1dHRvbiBtRnVsbFNjcmVlbkJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1PdmVyZmxvd0J1dHRvblJpZ2h0OwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbU92ZXJmbG93QnV0dG9uTGVmdDsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1NdXRlQnV0dG9uOwotICAgIHByaXZhdGUgSW1hZ2VCdXR0b24gbVZpZGVvUXVhbGl0eUJ1dHRvbjsKLSAgICBwcml2YXRlIEltYWdlQnV0dG9uIG1TZXR0aW5nc0J1dHRvbjsKLSAgICBwcml2YXRlIFRleHRWaWV3IG1BZFJlbWFpbmluZ1ZpZXc7Ci0KLSAgICAvLyBSZWxhdGluZyB0byBTZXR0aW5ncyBMaXN0IFZpZXcKLSAgICBwcml2YXRlIExpc3RWaWV3IG1TZXR0aW5nc0xpc3RWaWV3OwotICAgIHByaXZhdGUgUG9wdXBXaW5kb3cgbVNldHRpbmdzV2luZG93OwotICAgIHByaXZhdGUgU2V0dGluZ3NBZGFwdGVyIG1TZXR0aW5nc0FkYXB0ZXI7Ci0gICAgcHJpdmF0ZSBTdWJTZXR0aW5nc0FkYXB0ZXIgbVN1YlNldHRpbmdzQWRhcHRlcjsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtU2V0dGluZ3NNYWluVGV4dHNMaXN0OwotICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1TZXR0aW5nc1N1YlRleHRzTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8SW50ZWdlcj4gbVNldHRpbmdzSWNvbklkc0xpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdDsKLSAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtQXVkaW9UcmFja0xpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVZpZGVvUXVhbGl0eUxpc3Q7Ci0gICAgcHJpdmF0ZSBMaXN0PFN0cmluZz4gbVBsYXliYWNrU3BlZWRUZXh0TGlzdDsKLSAgICBwcml2YXRlIExpc3Q8RmxvYXQ+IG1QbGF5YmFja1NwZWVkTGlzdDsKLQotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xWaWV3MkltcGwoTWVkaWFDb250cm9sVmlldzIgaW5zdGFuY2UsCi0gICAgICAgICAgICBWaWV3R3JvdXBQcm92aWRlciBzdXBlclByb3ZpZGVyLCBWaWV3R3JvdXBQcm92aWRlciBwcml2YXRlUHJvdmlkZXIpIHsKLSAgICAgICAgc3VwZXIoaW5zdGFuY2UsIHN1cGVyUHJvdmlkZXIsIHByaXZhdGVQcm92aWRlcik7Ci0gICAgICAgIG1JbnN0YW5jZSA9IGluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGluaXRpYWxpemUoQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIG1SZXNvdXJjZXMgPSBBcGlIZWxwZXIuZ2V0TGliUmVzb3VyY2VzKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICAvLyBJbmZsYXRlIE1lZGlhQ29udHJvbFZpZXcyIGZyb20gWE1MCi0gICAgICAgIG1Sb290ID0gbWFrZUNvbnRyb2xsZXJWaWV3KCk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1Sb290KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRNZWRpYVNlc3Npb25Ub2tlbl9pbXBsKFNlc3Npb25Ub2tlbjIgdG9rZW4pIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRPbkZ1bGxTY3JlZW5MaXN0ZW5lcl9pbXBsKE1lZGlhQ29udHJvbFZpZXcyLk9uRnVsbFNjcmVlbkxpc3RlbmVyIGwpIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRDb250cm9sbGVyX2ltcGwoTWVkaWFDb250cm9sbGVyIGNvbnRyb2xsZXIpIHsKLSAgICAgICAgbUNvbnRyb2xsZXIgPSBjb250cm9sbGVyOwotICAgICAgICBpZiAoY29udHJvbGxlciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMgPSBjb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCk7Ci0gICAgICAgICAgICAvLyBTZXQgbU1ldGFkYXRhIGFuZCBtUGxheWJhY2tTdGF0ZSB0byBleGlzdGluZyBNZWRpYVNlc3Npb24gdmFyaWFibGVzIHNpbmNlIHRoZXkgbWF5Ci0gICAgICAgICAgICAvLyBiZSBjYWxsZWQgYmVmb3JlIHRoZSBjYWxsYmFjayBpcyBjYWxsZWQKLSAgICAgICAgICAgIG1QbGF5YmFja1N0YXRlID0gbUNvbnRyb2xsZXIuZ2V0UGxheWJhY2tTdGF0ZSgpOwotICAgICAgICAgICAgbU1ldGFkYXRhID0gbUNvbnRyb2xsZXIuZ2V0TWV0YWRhdGEoKTsKLSAgICAgICAgICAgIHVwZGF0ZUR1cmF0aW9uKCk7Ci0gICAgICAgICAgICB1cGRhdGVUaXRsZSgpOwotCi0gICAgICAgICAgICBtQ29udHJvbGxlci5yZWdpc3RlckNhbGxiYWNrKG5ldyBNZWRpYUNvbnRyb2xsZXJDYWxsYmFjaygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEJ1dHRvblZpc2liaWxpdHlfaW1wbChpbnQgYnV0dG9uLCBpbnQgdmlzaWJpbGl0eSkgewotICAgICAgICAvLyBUT0RPOiBhZGQgbWVtYmVyIHZhcmlhYmxlcyBmb3IgRmFzdC1Gb3J3YXJkL1BydmlvdXMvUmV3aW5kIGJ1dHRvbnMgdG8gc2F2ZSB2aXNpYmlsaXR5IGluCi0gICAgICAgIC8vIG9yZGVyIHRvIHByZXZlbnQgYmVpbmcgb3ZlcnJpZGVuIGluc2lkZSB1cGRhdGVMYXlvdXQoKS4KLSAgICAgICAgc3dpdGNoIChidXR0b24pIHsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX1BMQVlfUEFVU0U6Ci0gICAgICAgICAgICAgICAgaWYgKG1QbGF5UGF1c2VCdXR0b24gIT0gbnVsbCAmJiBjYW5QYXVzZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9GRldEOgotICAgICAgICAgICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsICYmIGNhblNlZWtGb3J3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9SRVc6Ci0gICAgICAgICAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCAmJiBjYW5TZWVrQmFja3dhcmQoKSkgewotICAgICAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fTkVYVDoKLSAgICAgICAgICAgICAgICBpZiAobU5leHRCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX1BSRVY6Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmV2QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9TVUJUSVRMRToKLSAgICAgICAgICAgICAgICBpZiAobVN1YnRpdGxlQnV0dG9uICE9IG51bGwgJiYgbVN1YnRpdGxlVHJhY2tDb3VudCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3Mi5CVVRUT05fRlVMTF9TQ1JFRU46Ci0gICAgICAgICAgICAgICAgaWYgKG1GdWxsU2NyZWVuQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9PVkVSRkxPVzoKLSAgICAgICAgICAgICAgICBpZiAobU92ZXJmbG93QnV0dG9uUmlnaHQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtT3ZlcmZsb3dCdXR0b25SaWdodC5zZXRWaXNpYmlsaXR5KHZpc2liaWxpdHkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzIuQlVUVE9OX01VVEU6Ci0gICAgICAgICAgICAgICAgaWYgKG1NdXRlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0VmlzaWJpbGl0eSh2aXNpYmlsaXR5KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcyLkJVVFRPTl9TRVRUSU5HUzoKLSAgICAgICAgICAgICAgICBpZiAobVNldHRpbmdzQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzQnV0dG9uLnNldFZpc2liaWxpdHkodmlzaWJpbGl0eSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlcXVlc3RQbGF5QnV0dG9uRm9jdXNfaW1wbCgpIHsKLSAgICAgICAgaWYgKG1QbGF5UGF1c2VCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5yZXF1ZXN0Rm9jdXMoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDaGFyU2VxdWVuY2UgZ2V0QWNjZXNzaWJpbGl0eUNsYXNzTmFtZV9pbXBsKCkgewotICAgICAgICByZXR1cm4gTWVkaWFDb250cm9sVmlldzIuY2xhc3MuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBmdW5jdGlvbiBiZSByZW1vdmVkPwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25NZWFzdXJlX2ltcGwoaW50IHdpZHRoTWVhc3VyZVNwZWMsIGludCBoZWlnaHRNZWFzdXJlU3BlYykgewotICAgICAgICBzdXBlci5vbk1lYXN1cmVfaW1wbCh3aWR0aE1lYXN1cmVTcGVjLCBoZWlnaHRNZWFzdXJlU3BlYyk7Ci0KLSAgICAgICAgLy8gVXBkYXRlIGxheW91dCB3aGVuIHRoaXMgdmlldydzIHdpZHRoIGNoYW5nZXMgaW4gb3JkZXIgdG8gYXZvaWQgYW55IFVJIG92ZXJsYXAgYmV0d2VlbgotICAgICAgICAvLyB0cmFuc3BvcnQgY29udHJvbHMuCi0gICAgICAgIGlmIChtUHJldldpZHRoICE9IG1JbnN0YW5jZS5nZXRNZWFzdXJlZFdpZHRoKCkKLSAgICAgICAgICAgICAgICB8fCBtUHJldkhlaWdodCAhPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKSB8fCBtTmVlZFVYVXBkYXRlKSB7Ci0gICAgICAgICAgICAvLyBEaXNtaXNzIFNldHRpbmdzV2luZG93IGlmIGl0IGlzIHNob3dpbmcuCi0gICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotCi0gICAgICAgICAgICAvLyBUaGVzZSB2aWV3cyBtYXkgbm90IGhhdmUgYmVlbiBpbml0aWFsaXplZCB5ZXQuCi0gICAgICAgICAgICBpZiAobVRyYW5zcG9ydENvbnRyb2xzLmdldFdpZHRoKCkgPT0gMCB8fCBtVGltZVZpZXcuZ2V0V2lkdGgoKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgY3VycldpZHRoID0gbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKTsKLSAgICAgICAgICAgIGludCBjdXJySGVpZ2h0ID0gbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICBXaW5kb3dNYW5hZ2VyIG1hbmFnZXIgPSAoV2luZG93TWFuYWdlcikgbUluc3RhbmNlLmdldENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKQotICAgICAgICAgICAgICAgICAgICAuZ2V0U3lzdGVtU2VydmljZShDb250ZXh0LldJTkRPV19TRVJWSUNFKTsKLSAgICAgICAgICAgIFBvaW50IHNjcmVlblNpemUgPSBuZXcgUG9pbnQoKTsKLSAgICAgICAgICAgIG1hbmFnZXIuZ2V0RGVmYXVsdERpc3BsYXkoKS5nZXRTaXplKHNjcmVlblNpemUpOwotICAgICAgICAgICAgaW50IHNjcmVlbldpZHRoID0gc2NyZWVuU2l6ZS54OwotICAgICAgICAgICAgaW50IHNjcmVlbkhlaWdodCA9IHNjcmVlblNpemUueTsKLSAgICAgICAgICAgIGludCBmdWxsSWNvblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZShSLmRpbWVuLm1jdjJfZnVsbF9pY29uX3NpemUpOwotICAgICAgICAgICAgaW50IGVtYmVkZGVkSWNvblNpemUgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX2VtYmVkZGVkX2ljb25fc2l6ZSk7Ci0gICAgICAgICAgICBpbnQgbWFyZ2luU2l6ZSA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9pY29uX21hcmdpbik7Ci0KLSAgICAgICAgICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBBZHZlcnRpc2VtZW50IE1vZGUuCi0gICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX0RFRkFVTFQpIHsKLSAgICAgICAgICAgICAgICAvLyBNYXggbnVtYmVyIG9mIGljb25zIGluc2lkZSBCb3R0b21CYXJSaWdodFZpZXcgZm9yIE11c2ljIG1vZGUgaXMgNC4KLSAgICAgICAgICAgICAgICBpbnQgbWF4SWNvbkNvdW50ID0gNDsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXQobWF4SWNvbkNvdW50LCBmdWxsSWNvblNpemUsIGVtYmVkZGVkSWNvblNpemUsIG1hcmdpblNpemUsIGN1cnJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJIZWlnaHQsIHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICBpZiAobU5lZWRVWFVwZGF0ZSkgewotICAgICAgICAgICAgICAgICAgICAvLyBPbmUtdGltZSBvcGVyYXRpb24gZm9yIE11c2ljIG1lZGlhIHR5cGUKLSAgICAgICAgICAgICAgICAgICAgbUJhc2ljQ29udHJvbHMucmVtb3ZlVmlldyhtTXV0ZUJ1dHRvbik7Ci0gICAgICAgICAgICAgICAgICAgIG1FeHRyYUNvbnRyb2xzLmFkZFZpZXcobU11dGVCdXR0b24sIDApOwotICAgICAgICAgICAgICAgICAgICBtVmlkZW9RdWFsaXR5QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAobVJld0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTmVlZFVYVXBkYXRlID0gZmFsc2U7Ci0KLSAgICAgICAgICAgICAgICAvLyBNYXggbnVtYmVyIG9mIGljb25zIGluc2lkZSBCb3R0b21CYXJSaWdodFZpZXcgZm9yIE11c2ljIG1vZGUgaXMgMy4KLSAgICAgICAgICAgICAgICBpbnQgbWF4SWNvbkNvdW50ID0gMzsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXQobWF4SWNvbkNvdW50LCBmdWxsSWNvblNpemUsIGVtYmVkZGVkSWNvblNpemUsIG1hcmdpblNpemUsIGN1cnJXaWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJIZWlnaHQsIHNjcmVlbldpZHRoLCBzY3JlZW5IZWlnaHQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVByZXZXaWR0aCA9IGN1cnJXaWR0aDsKLSAgICAgICAgICAgIG1QcmV2SGVpZ2h0ID0gY3VyckhlaWdodDsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPOiBtb3ZlIHRoaXMgdG8gYSBkaWZmZXJlbnQgbG9jYXRpb24uCi0gICAgICAgIC8vIFVwZGF0ZSB0aXRsZSBiYXIgcGFyYW1ldGVycyBpbiBvcmRlciB0byBhdm9pZCBvdmVybGFwIGJldHdlZW4gdGl0bGUgdmlldyBhbmQgdGhlIHJpZ2h0Ci0gICAgICAgIC8vIHNpZGUgb2YgdGhlIHRpdGxlIGJhci4KLSAgICAgICAgdXBkYXRlVGl0bGVCYXJMYXlvdXQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkX2ltcGwoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIHN1cGVyLnNldEVuYWJsZWRfaW1wbChlbmFibGVkKTsKLQotICAgICAgICAvLyBUT0RPOiBNZXJnZSB0aGUgYmVsb3cgY29kZSB3aXRoIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKS4KLSAgICAgICAgaWYgKG1QbGF5UGF1c2VCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtRmZ3ZEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtUmV3QnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobU5leHRCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbU5leHRCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByZXZCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByb2dyZXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRFbmFibGVkKGVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGRpc2FibGVVbnN1cHBvcnRlZEJ1dHRvbnMoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblZpc2liaWxpdHlBZ2dyZWdhdGVkX2ltcGwoYm9vbGVhbiBpc1Zpc2libGUpIHsKLSAgICAgICAgc3VwZXIub25WaXNpYmlsaXR5QWdncmVnYXRlZF9pbXBsKGlzVmlzaWJsZSk7Ci0KLSAgICAgICAgaWYgKGlzVmlzaWJsZSkgewotICAgICAgICAgICAgZGlzYWJsZVVuc3VwcG9ydGVkQnV0dG9ucygpOwotICAgICAgICAgICAgbUluc3RhbmNlLnJlbW92ZUNhbGxiYWNrcyhtVXBkYXRlUHJvZ3Jlc3MpOwotICAgICAgICAgICAgbUluc3RhbmNlLnBvc3QobVVwZGF0ZVByb2dyZXNzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1JbnN0YW5jZS5yZW1vdmVDYWxsYmFja3MobVVwZGF0ZVByb2dyZXNzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJvdXRlU2VsZWN0b3IoTWVkaWFSb3V0ZVNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gICAgICAgIG1Sb3V0ZVNlbGVjdG9yID0gc2VsZWN0b3I7Ci0gICAgICAgIGlmIChtUm91dGVTZWxlY3RvciAhPSBudWxsICYmICFtUm91dGVTZWxlY3Rvci5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIG1Sb3V0ZUJ1dHRvbi5zZXRSb3V0ZVNlbGVjdG9yKHNlbGVjdG9yLCBNZWRpYVJvdXRlci5DQUxMQkFDS19GTEFHX1BFUkZPUk1fQUNUSVZFX1NDQU4pOwotICAgICAgICAgICAgbVJvdXRlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Sb3V0ZUJ1dHRvbi5zZXRSb3V0ZVNlbGVjdG9yKE1lZGlhUm91dGVTZWxlY3Rvci5FTVBUWSk7Ci0gICAgICAgICAgICBtUm91dGVCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gUHJvdGVjdGVkIG9yIHByaXZhdGUgbWV0aG9kcwotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUGxheWluZygpIHsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBtUGxheWJhY2tTdGF0ZS5nZXRTdGF0ZSgpID09IFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORzsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0Q3VycmVudFBvc2l0aW9uKCkgewotICAgICAgICBtUGxheWJhY2tTdGF0ZSA9IG1Db250cm9sbGVyLmdldFBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlICE9IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAoaW50KSBtUGxheWJhY2tTdGF0ZS5nZXRQb3NpdGlvbigpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGdldEJ1ZmZlclBlcmNlbnRhZ2UoKSB7Ci0gICAgICAgIGlmIChtRHVyYXRpb24gPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgbVBsYXliYWNrU3RhdGUgPSBtQ29udHJvbGxlci5nZXRQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgIGlmIChtUGxheWJhY2tTdGF0ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBsb25nIGJ1ZmZlcmVkUG9zID0gbVBsYXliYWNrU3RhdGUuZ2V0QnVmZmVyZWRQb3NpdGlvbigpOwotICAgICAgICAgICAgcmV0dXJuIChidWZmZXJlZFBvcyA9PSAtMSkgPyAtMSA6IChpbnQpIChidWZmZXJlZFBvcyAqIDEwMCAvIG1EdXJhdGlvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblBhdXNlKCkgewotICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCkgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9QQVVTRSkgIT0gMDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gY2FuU2Vla0JhY2t3YXJkKCkgewotICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCkgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9SRVdJTkQpICE9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGNhblNlZWtGb3J3YXJkKCkgewotICAgICAgICBpZiAobVBsYXliYWNrU3RhdGUgIT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIChtUGxheWJhY2tTdGF0ZS5nZXRBY3Rpb25zKCkgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9GQVNUX0ZPUldBUkQpICE9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlIHRoZSB2aWV3IHRoYXQgaG9sZHMgdGhlIHdpZGdldHMgdGhhdCBjb250cm9sIHBsYXliYWNrLgotICAgICAqIERlcml2ZWQgY2xhc3NlcyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBjcmVhdGUgdGhlaXIgb3duLgotICAgICAqCi0gICAgICogQHJldHVybiBUaGUgY29udHJvbGxlciB2aWV3LgotICAgICAqIEBoaWRlIFRoaXMgZG9lc24ndCB3b3JrIGFzIGFkdmVydGlzZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgVmlld0dyb3VwIG1ha2VDb250cm9sbGVyVmlldygpIHsKLSAgICAgICAgVmlld0dyb3VwIHJvb3QgPSAoVmlld0dyb3VwKSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgIFIubGF5b3V0Lm1lZGlhX2NvbnRyb2xsZXIpOwotICAgICAgICBpbml0Q29udHJvbGxlclZpZXcocm9vdCk7Ci0gICAgICAgIHJldHVybiByb290OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0Q29udHJvbGxlclZpZXcoVmlld0dyb3VwIHYpIHsKLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gVGl0bGUgQmFyIFZpZXcKLSAgICAgICAgbVRpdGxlQmFyID0gdi5maW5kVmlld0J5SWQoUi5pZC50aXRsZV9iYXIpOwotICAgICAgICBtVGl0bGVWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC50aXRsZV90ZXh0KTsKLSAgICAgICAgbUFkRXh0ZXJuYWxMaW5rID0gdi5maW5kVmlld0J5SWQoUi5pZC5hZF9leHRlcm5hbF9saW5rKTsKLSAgICAgICAgbUJhY2tCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJhY2spOwotICAgICAgICBpZiAobUJhY2tCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbUJhY2tCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1CYWNrTGlzdGVuZXIpOwotICAgICAgICAgICAgbUJhY2tCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgICAgIG1Sb3V0ZUJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQuY2FzdCk7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKLSAgICAgICAgbUNlbnRlclZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmNlbnRlcl92aWV3KTsKLSAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKFIubGF5b3V0LmVtYmVkZGVkX3RyYW5zcG9ydF9jb250cm9scyk7Ci0gICAgICAgIG1DZW50ZXJWaWV3LmFkZFZpZXcobVRyYW5zcG9ydENvbnRyb2xzKTsKLQotICAgICAgICAvLyBSZWxhdGluZyB0byBNaW5pbWFsIEV4dHJhIFZpZXcKLSAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcgPSAoTGluZWFyTGF5b3V0KSB2LmZpbmRWaWV3QnlJZChSLmlkLm1pbmltYWxfZXh0cmFfdmlldyk7Ci0gICAgICAgIExpbmVhckxheW91dC5MYXlvdXRQYXJhbXMgcGFyYW1zID0KLSAgICAgICAgICAgICAgICAoTGluZWFyTGF5b3V0LkxheW91dFBhcmFtcykgbU1pbmltYWxFeHRyYVZpZXcuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgIGludCBpY29uU2l6ZSA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9lbWJlZGRlZF9pY29uX3NpemUpOwotICAgICAgICBpbnQgbWFyZ2luU2l6ZSA9IG1SZXNvdXJjZXMuZ2V0RGltZW5zaW9uUGl4ZWxTaXplKFIuZGltZW4ubWN2Ml9pY29uX21hcmdpbik7Ci0gICAgICAgIHBhcmFtcy5zZXRNYXJnaW5zKDAsIChpY29uU2l6ZSArIG1hcmdpblNpemUgKiAyKSAqICgtMSksIDAsIDApOwotICAgICAgICBtTWluaW1hbEV4dHJhVmlldy5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIFByb2dyZXNzIEJhciBWaWV3Ci0gICAgICAgIG1Qcm9ncmVzcyA9IHYuZmluZFZpZXdCeUlkKFIuaWQucHJvZ3Jlc3MpOwotICAgICAgICBpZiAobVByb2dyZXNzICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChtUHJvZ3Jlc3MgaW5zdGFuY2VvZiBTZWVrQmFyKSB7Ci0gICAgICAgICAgICAgICAgU2Vla0JhciBzZWVrZXIgPSAoU2Vla0JhcikgbVByb2dyZXNzOwotICAgICAgICAgICAgICAgIHNlZWtlci5zZXRPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lcihtU2Vla0xpc3RlbmVyKTsKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0UHJvZ3Jlc3NEcmF3YWJsZShtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuY3VzdG9tX3Byb2dyZXNzKSk7Ci0gICAgICAgICAgICAgICAgc2Vla2VyLnNldFRodW1iKG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5jdXN0b21fcHJvZ3Jlc3NfdGh1bWIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRNYXgoTUFYX1BST0dSRVNTKTsKLSAgICAgICAgfQotICAgICAgICBtUHJvZ3Jlc3NCdWZmZXIgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnByb2dyZXNzX2J1ZmZlcik7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBWaWV3Ci0gICAgICAgIG1Cb3R0b21CYXIgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJvdHRvbV9iYXIpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIgTGVmdCBWaWV3Ci0gICAgICAgIG1Cb3R0b21CYXJMZWZ0VmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYm90dG9tX2Jhcl9sZWZ0KTsKLSAgICAgICAgbVRpbWVWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC50aW1lKTsKLSAgICAgICAgbUVuZFRpbWUgPSB2LmZpbmRWaWV3QnlJZChSLmlkLnRpbWVfZW5kKTsKLSAgICAgICAgbUN1cnJlbnRUaW1lID0gdi5maW5kVmlld0J5SWQoUi5pZC50aW1lX2N1cnJlbnQpOwotICAgICAgICBtQWRTa2lwVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYWRfc2tpcF90aW1lKTsKLSAgICAgICAgbUZvcm1hdEJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBtRm9ybWF0dGVyID0gbmV3IEZvcm1hdHRlcihtRm9ybWF0QnVpbGRlciwgTG9jYWxlLmdldERlZmF1bHQoKSk7Ci0KLSAgICAgICAgLy8gUmVsYXRpbmcgdG8gQm90dG9tIEJhciBSaWdodCBWaWV3Ci0gICAgICAgIG1Cb3R0b21CYXJSaWdodFZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmJvdHRvbV9iYXJfcmlnaHQpOwotICAgICAgICBtQmFzaWNDb250cm9scyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYmFzaWNfY29udHJvbHMpOwotICAgICAgICBtRXh0cmFDb250cm9scyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuZXh0cmFfY29udHJvbHMpOwotICAgICAgICBtQ3VzdG9tQnV0dG9ucyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuY3VzdG9tX2J1dHRvbnMpOwotICAgICAgICBtU3VidGl0bGVCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnN1YnRpdGxlKTsKLSAgICAgICAgaWYgKG1TdWJ0aXRsZUJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TdWJ0aXRsZUxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQuZnVsbHNjcmVlbik7Ci0gICAgICAgIGlmIChtRnVsbFNjcmVlbkJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobUZ1bGxTY3JlZW5MaXN0ZW5lcik7Ci0gICAgICAgICAgICAvLyBUT0RPOiBTaG93IEZ1bGxzY3JlZW4gYnV0dG9uIHdoZW4gb25seSBpdCBpcyBwb3NzaWJsZS4KLSAgICAgICAgfQotICAgICAgICBtT3ZlcmZsb3dCdXR0b25SaWdodCA9IHYuZmluZFZpZXdCeUlkKFIuaWQub3ZlcmZsb3dfcmlnaHQpOwotICAgICAgICBpZiAobU92ZXJmbG93QnV0dG9uUmlnaHQgIT0gbnVsbCkgewotICAgICAgICAgICAgbU92ZXJmbG93QnV0dG9uUmlnaHQuc2V0T25DbGlja0xpc3RlbmVyKG1PdmVyZmxvd1JpZ2h0TGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1PdmVyZmxvd0J1dHRvbkxlZnQgPSB2LmZpbmRWaWV3QnlJZChSLmlkLm92ZXJmbG93X2xlZnQpOwotICAgICAgICBpZiAobU92ZXJmbG93QnV0dG9uTGVmdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtT3ZlcmZsb3dCdXR0b25MZWZ0LnNldE9uQ2xpY2tMaXN0ZW5lcihtT3ZlcmZsb3dMZWZ0TGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1NdXRlQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5tdXRlKTsKLSAgICAgICAgaWYgKG1NdXRlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NdXRlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtTXV0ZUJ1dHRvbkxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtU2V0dGluZ3NCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnNldHRpbmdzKTsKLSAgICAgICAgaWYgKG1TZXR0aW5nc0J1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU2V0dGluZ3NCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1TZXR0aW5nc0J1dHRvbkxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtVmlkZW9RdWFsaXR5QnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC52aWRlb19xdWFsaXR5KTsKLSAgICAgICAgaWYgKG1WaWRlb1F1YWxpdHlCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVZpZGVvUXVhbGl0eUJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVZpZGVvUXVhbGl0eUxpc3RlbmVyKTsKLSAgICAgICAgfQotICAgICAgICBtQWRSZW1haW5pbmdWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC5hZF9yZW1haW5pbmcpOwotCi0gICAgICAgIC8vIFJlbGF0aW5nIHRvIFNldHRpbmdzIExpc3QgVmlldwotICAgICAgICBpbml0aWFsaXplU2V0dGluZ3NMaXN0cygpOwotICAgICAgICBtU2V0dGluZ3NMaXN0VmlldyA9IChMaXN0VmlldykgQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICBSLmxheW91dC5zZXR0aW5nc19saXN0KTsKLSAgICAgICAgbVNldHRpbmdzQWRhcHRlciA9IG5ldyBTZXR0aW5nc0FkYXB0ZXIobVNldHRpbmdzTWFpblRleHRzTGlzdCwgbVNldHRpbmdzU3ViVGV4dHNMaXN0LAotICAgICAgICAgICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0KTsKLSAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlciA9IG5ldyBTdWJTZXR0aW5nc0FkYXB0ZXIobnVsbCwgMCk7Ci0gICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3LnNldEFkYXB0ZXIobVNldHRpbmdzQWRhcHRlcik7Ci0gICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3LnNldENob2ljZU1vZGUoTGlzdFZpZXcuQ0hPSUNFX01PREVfU0lOR0xFKTsKLSAgICAgICAgbVNldHRpbmdzTGlzdFZpZXcuc2V0T25JdGVtQ2xpY2tMaXN0ZW5lcihtU2V0dGluZ3NJdGVtQ2xpY2tMaXN0ZW5lcik7Ci0KLSAgICAgICAgbUVtYmVkZGVkU2V0dGluZ3NJdGVtV2lkdGggPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1jdjJfZW1iZWRkZWRfc2V0dGluZ3Nfd2lkdGgpOwotICAgICAgICBtRnVsbFNldHRpbmdzSXRlbVdpZHRoID0gbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoUi5kaW1lbi5tY3YyX2Z1bGxfc2V0dGluZ3Nfd2lkdGgpOwotICAgICAgICBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1IZWlnaHQgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1jdjJfZW1iZWRkZWRfc2V0dGluZ3NfaGVpZ2h0KTsKLSAgICAgICAgbUZ1bGxTZXR0aW5nc0l0ZW1IZWlnaHQgPSBtUmVzb3VyY2VzLmdldERpbWVuc2lvblBpeGVsU2l6ZSgKLSAgICAgICAgICAgICAgICBSLmRpbWVuLm1jdjJfZnVsbF9zZXR0aW5nc19oZWlnaHQpOwotICAgICAgICBtU2V0dGluZ3NXaW5kb3dNYXJnaW4gPSAoLTEpICogbVJlc291cmNlcy5nZXREaW1lbnNpb25QaXhlbFNpemUoCi0gICAgICAgICAgICAgICAgUi5kaW1lbi5tY3YyX3NldHRpbmdzX29mZnNldCk7Ci0gICAgICAgIG1TZXR0aW5nc1dpbmRvdyA9IG5ldyBQb3B1cFdpbmRvdyhtU2V0dGluZ3NMaXN0VmlldywgbUVtYmVkZGVkU2V0dGluZ3NJdGVtV2lkdGgsCi0gICAgICAgICAgICAgICAgVmlld0dyb3VwLkxheW91dFBhcmFtcy5XUkFQX0NPTlRFTlQsIHRydWUpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIERpc2FibGUgcGF1c2Ugb3Igc2VlayBidXR0b25zIGlmIHRoZSBzdHJlYW0gY2Fubm90IGJlIHBhdXNlZCBvciBzZWVrZWQuCi0gICAgICogVGhpcyByZXF1aXJlcyB0aGUgY29udHJvbCBpbnRlcmZhY2UgdG8gYmUgYSBNZWRpYVBsYXllckNvbnRyb2xFeHQKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgZGlzYWJsZVVuc3VwcG9ydGVkQnV0dG9ucygpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwgJiYgIWNhblBhdXNlKCkpIHsKLSAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCAmJiAhY2FuU2Vla0JhY2t3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwgJiYgIWNhblNlZWtGb3J3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE8gV2hhdCB3ZSByZWFsbHkgc2hvdWxkIGRvIGlzIGFkZCBhIGNhblNlZWsgdG8gdGhlIE1lZGlhUGxheWVyQ29udHJvbCBpbnRlcmZhY2U7Ci0gICAgICAgICAgICAvLyB0aGlzIHNjaGVtZSBjYW4gYnJlYWsgdGhlIGNhc2Ugd2hlbiBhcHBsaWNhdGlvbnMgd2FudCB0byBhbGxvdyBzZWVrIHRocm91Z2ggdGhlCi0gICAgICAgICAgICAvLyBwcm9ncmVzcyBiYXIgYnV0IGRpc2FibGUgZm9yd2FyZC9iYWNrd2FyZCBidXR0b25zLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGN1cnJlbnRseSB0aGUgZmxhZ3MgU0VFS19CQUNLV0FSRF9BVkFJTEFCTEUsIFNFRUtfRk9SV0FSRF9BVkFJTEFCTEUsCi0gICAgICAgICAgICAvLyBhbmQgU0VFS19BVkFJTEFCTEUgYXJlIGFsbCAodW4pc2V0IHRvZ2V0aGVyOyBhcyBzdWNoIHRoZSBhZm9yZW1lbnRpb25lZCBpc3N1ZQotICAgICAgICAgICAgLy8gc2hvdWxkbid0IGFyaXNlIGluIGV4aXN0aW5nIGFwcGxpY2F0aW9ucy4KLSAgICAgICAgICAgIGlmIChtUHJvZ3Jlc3MgIT0gbnVsbCAmJiAhY2FuU2Vla0JhY2t3YXJkKCkgJiYgIWNhblNlZWtGb3J3YXJkKCkpIHsKLSAgICAgICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEluY29tcGF0aWJsZUNsYXNzQ2hhbmdlRXJyb3IgZXgpIHsKLSAgICAgICAgICAgIC8vIFdlIHdlcmUgZ2l2ZW4gYW4gb2xkIHZlcnNpb24gb2YgdGhlIGludGVyZmFjZSwgdGhhdCBkb2Vzbid0IGhhdmUKLSAgICAgICAgICAgIC8vIHRoZSBjYW5QYXVzZS9jYW5TZWVrWFlaIG1ldGhvZHMuIFRoaXMgaXMgT0ssIGl0IGp1c3QgbWVhbnMgd2UKLSAgICAgICAgICAgIC8vIGFzc3VtZSB0aGUgbWVkaWEgY2FuIGJlIHBhdXNlZCBhbmQgc2Vla2VkLCBhbmQgc28gd2UgZG9uJ3QgZGlzYWJsZQotICAgICAgICAgICAgLy8gdGhlIGJ1dHRvbnMuCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFJ1bm5hYmxlIG1VcGRhdGVQcm9ncmVzcyA9IG5ldyBSdW5uYWJsZSgpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgICAgICAgIGludCBwb3MgPSBzZXRQcm9ncmVzcygpOwotICAgICAgICAgICAgYm9vbGVhbiBpc1Nob3dpbmcgPSBtSW5zdGFuY2UuZ2V0VmlzaWJpbGl0eSgpID09IFZpZXcuVklTSUJMRTsKLSAgICAgICAgICAgIGlmICghbURyYWdnaW5nICYmIGlzU2hvd2luZyAmJiBpc1BsYXlpbmcoKSkgewotICAgICAgICAgICAgICAgIG1JbnN0YW5jZS5wb3N0RGVsYXllZChtVXBkYXRlUHJvZ3Jlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBERUZBVUxUX1BST0dSRVNTX1VQREFURV9USU1FX01TIC0gKHBvcyAlIERFRkFVTFRfUFJPR1JFU1NfVVBEQVRFX1RJTUVfTVMpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIFN0cmluZyBzdHJpbmdGb3JUaW1lKGludCB0aW1lTXMpIHsKLSAgICAgICAgaW50IHRvdGFsU2Vjb25kcyA9IHRpbWVNcyAvIDEwMDA7Ci0KLSAgICAgICAgaW50IHNlY29uZHMgPSB0b3RhbFNlY29uZHMgJSA2MDsKLSAgICAgICAgaW50IG1pbnV0ZXMgPSAodG90YWxTZWNvbmRzIC8gNjApICUgNjA7Ci0gICAgICAgIGludCBob3VycyA9IHRvdGFsU2Vjb25kcyAvIDM2MDA7Ci0KLSAgICAgICAgbUZvcm1hdEJ1aWxkZXIuc2V0TGVuZ3RoKDApOwotICAgICAgICBpZiAoaG91cnMgPiAwKSB7Ci0gICAgICAgICAgICByZXR1cm4gbUZvcm1hdHRlci5mb3JtYXQoIiVkOiUwMmQ6JTAyZCIsIGhvdXJzLCBtaW51dGVzLCBzZWNvbmRzKS50b1N0cmluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG1Gb3JtYXR0ZXIuZm9ybWF0KCIlMDJkOiUwMmQiLCBtaW51dGVzLCBzZWNvbmRzKS50b1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgc2V0UHJvZ3Jlc3MoKSB7Ci0gICAgICAgIGlmIChtQ29udHJvbGxlciA9PSBudWxsIHx8IG1EcmFnZ2luZykgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IHBvc2l0aW9uT25Qcm9ncmVzc0JhciA9IDA7Ci0gICAgICAgIGludCBjdXJyZW50UG9zaXRpb24gPSBnZXRDdXJyZW50UG9zaXRpb24oKTsKLSAgICAgICAgaWYgKG1EdXJhdGlvbiA+IDApIHsKLSAgICAgICAgICAgIHBvc2l0aW9uT25Qcm9ncmVzc0JhciA9IChpbnQpIChNQVhfUFJPR1JFU1MgKiAobG9uZykgY3VycmVudFBvc2l0aW9uIC8gbUR1cmF0aW9uKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobVByb2dyZXNzICE9IG51bGwgJiYgY3VycmVudFBvc2l0aW9uICE9IG1EdXJhdGlvbikgewotICAgICAgICAgICAgbVByb2dyZXNzLnNldFByb2dyZXNzKHBvc2l0aW9uT25Qcm9ncmVzc0Jhcik7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgbWVkaWEgaXMgYSBsb2NhbCBmaWxlLCB0aGVyZSBpcyBubyBuZWVkIHRvIHNldCBhIGJ1ZmZlciwgc28gc2V0IHNlY29uZGFyeQotICAgICAgICAgICAgLy8gcHJvZ3Jlc3MgdG8gbWF4aW11bS4KLSAgICAgICAgICAgIGlmIChnZXRCdWZmZXJQZXJjZW50YWdlKCkgPCAwKSB7Ci0gICAgICAgICAgICAgICAgbVByb2dyZXNzLnNldFNlY29uZGFyeVByb2dyZXNzKE1BWF9QUk9HUkVTUyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1Qcm9ncmVzcy5zZXRTZWNvbmRhcnlQcm9ncmVzcyhnZXRCdWZmZXJQZXJjZW50YWdlKCkgKiAxMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobUVuZFRpbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgbUVuZFRpbWUuc2V0VGV4dChzdHJpbmdGb3JUaW1lKG1EdXJhdGlvbikpOwotCi0gICAgICAgIH0KLSAgICAgICAgaWYgKG1DdXJyZW50VGltZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtQ3VycmVudFRpbWUuc2V0VGV4dChzdHJpbmdGb3JUaW1lKGN1cnJlbnRQb3NpdGlvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKG1Jc0FkdmVydGlzZW1lbnQpIHsKLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aGUgcmVtYWluaW5nIG51bWJlciBvZiBzZWNvbmRzIHVudGlsIHRoZSBmaXJzdCA1IHNlY29uZHMgb2YgdGhlCi0gICAgICAgICAgICAvLyBhZHZlcnRpc2VtZW50LgotICAgICAgICAgICAgaWYgKG1BZFNraXBWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoY3VycmVudFBvc2l0aW9uIDw9IEFEX1NLSVBfV0FJVF9USU1FX01TKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQWRTa2lwVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5HT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWRTa2lwVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHNraXBUaW1lVGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2FkX3NraXBfd2FpdF90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICgoQURfU0tJUF9XQUlUX1RJTUVfTVMgLSBjdXJyZW50UG9zaXRpb24pIC8gMTAwMCArIDEpKTsKLSAgICAgICAgICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VGV4dChza2lwVGltZVRleHQpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQWRTa2lwVmlldy5nZXRWaXNpYmlsaXR5KCkgPT0gVmlldy5WSVNJQkxFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQWRTa2lwVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRCdXR0b24uY2xlYXJDb2xvckZpbHRlcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSByZW1haW5pbmcgbnVtYmVyIG9mIHNlY29uZHMgb2YgdGhlIGFkdmVydGlzZW1lbnQuCi0gICAgICAgICAgICBpZiAobUFkUmVtYWluaW5nVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgaW50IHJlbWFpbmluZ1RpbWUgPQotICAgICAgICAgICAgICAgICAgICAgICAgKG1EdXJhdGlvbiAtIGN1cnJlbnRQb3NpdGlvbiA8IDApID8gMCA6IChtRHVyYXRpb24gLSBjdXJyZW50UG9zaXRpb24pOwotICAgICAgICAgICAgICAgIFN0cmluZyByZW1haW5pbmdUaW1lVGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYWRfcmVtYWluaW5nX3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdGb3JUaW1lKHJlbWFpbmluZ1RpbWUpKTsKLSAgICAgICAgICAgICAgICBtQWRSZW1haW5pbmdWaWV3LnNldFRleHQocmVtYWluaW5nVGltZVRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjdXJyZW50UG9zaXRpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHRvZ2dsZVBhdXNlUGxheVN0YXRlKCkgewotICAgICAgICBpZiAoaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgIG1Db250cm9scy5wYXVzZSgpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9wbGF5X2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtQ29udHJvbHMucGxheSgpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGF1c2VfY2lyY2xlX2ZpbGxlZCwgbnVsbCkpOwotICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfcGF1c2VfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRoZXJlIGFyZSB0d28gc2NlbmFyaW9zIHRoYXQgY2FuIHRyaWdnZXIgdGhlIHNlZWtiYXIgbGlzdGVuZXIgdG8gdHJpZ2dlcjoKLSAgICAvLwotICAgIC8vIFRoZSBmaXJzdCBpcyB0aGUgdXNlciB1c2luZyB0aGUgdG91Y2hwYWQgdG8gYWRqdXN0IHRoZSBwb3NpdGl0b24gb2YgdGhlCi0gICAgLy8gc2Vla2JhcidzIHRodW1iLiBJbiB0aGlzIGNhc2Ugb25TdGFydFRyYWNraW5nVG91Y2ggaXMgY2FsbGVkIGZvbGxvd2VkIGJ5Ci0gICAgLy8gYSBudW1iZXIgb2Ygb25Qcm9ncmVzc0NoYW5nZWQgbm90aWZpY2F0aW9ucywgY29uY2x1ZGVkIGJ5IG9uU3RvcFRyYWNraW5nVG91Y2guCi0gICAgLy8gV2UncmUgc2V0dGluZyB0aGUgZmllbGQgIm1EcmFnZ2luZyIgdG8gdHJ1ZSBmb3IgdGhlIGR1cmF0aW9uIG9mIHRoZSBkcmFnZ2luZwotICAgIC8vIHNlc3Npb24gdG8gYXZvaWQganVtcHMgaW4gdGhlIHBvc2l0aW9uIGluIGNhc2Ugb2Ygb25nb2luZyBwbGF5YmFjay4KLSAgICAvLwotICAgIC8vIFRoZSBzZWNvbmQgc2NlbmFyaW8gaW52b2x2ZXMgdGhlIHVzZXIgb3BlcmF0aW5nIHRoZSBzY3JvbGwgYmFsbCwgaW4gdGhpcwotICAgIC8vIGNhc2UgdGhlcmUgV09OJ1QgQkUgb25TdGFydFRyYWNraW5nVG91Y2gvb25TdG9wVHJhY2tpbmdUb3VjaCBub3RpZmljYXRpb25zLAotICAgIC8vIHdlIHdpbGwgc2ltcGx5IGFwcGx5IHRoZSB1cGRhdGVkIHBvc2l0aW9uIHdpdGhvdXQgc3VzcGVuZGluZyByZWd1bGFyIHVwZGF0ZXMuCi0gICAgcHJpdmF0ZSBmaW5hbCBPblNlZWtCYXJDaGFuZ2VMaXN0ZW5lciBtU2Vla0xpc3RlbmVyID0gbmV3IE9uU2Vla0JhckNoYW5nZUxpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25TdGFydFRyYWNraW5nVG91Y2goU2Vla0JhciBiYXIpIHsKLSAgICAgICAgICAgIGlmICghbVNlZWtBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1EcmFnZ2luZyA9IHRydWU7Ci0KLSAgICAgICAgICAgIC8vIEJ5IHJlbW92aW5nIHRoZXNlIHBlbmRpbmcgcHJvZ3Jlc3MgbWVzc2FnZXMgd2UgbWFrZSBzdXJlCi0gICAgICAgICAgICAvLyB0aGF0IGEpIHdlIHdvbid0IHVwZGF0ZSB0aGUgcHJvZ3Jlc3Mgd2hpbGUgdGhlIHVzZXIgYWRqdXN0cwotICAgICAgICAgICAgLy8gdGhlIHNlZWtiYXIgYW5kIGIpIG9uY2UgdGhlIHVzZXIgaXMgZG9uZSBkcmFnZ2luZyB0aGUgdGh1bWIKLSAgICAgICAgICAgIC8vIHdlIHdpbGwgcG9zdCBvbmUgb2YgdGhlc2UgbWVzc2FnZXMgdG8gdGhlIHF1ZXVlIGFnYWluIGFuZAotICAgICAgICAgICAgLy8gdGhpcyBlbnN1cmVzIHRoYXQgdGhlcmUgd2lsbCBiZSBleGFjdGx5IG9uZSBtZXNzYWdlIHF1ZXVlZCB1cC4KLSAgICAgICAgICAgIG1JbnN0YW5jZS5yZW1vdmVDYWxsYmFja3MobVVwZGF0ZVByb2dyZXNzKTsKLQotICAgICAgICAgICAgLy8gQ2hlY2sgaWYgcGxheWJhY2sgaXMgY3VycmVudGx5IHN0b3BwZWQuIEluIHRoaXMgY2FzZSwgdXBkYXRlIHRoZSBwYXVzZSBidXR0b24gdG8KLSAgICAgICAgICAgIC8vIHNob3cgdGhlIHBsYXkgaW1hZ2UgaW5zdGVhZCBvZiB0aGUgcmVwbGF5IGltYWdlLgotICAgICAgICAgICAgaWYgKG1Jc1N0b3BwZWQpIHsKLSAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgbVBsYXlQYXVzZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BsYXlfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICBtSXNTdG9wcGVkID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25Qcm9ncmVzc0NoYW5nZWQoU2Vla0JhciBiYXIsIGludCBwcm9ncmVzcywgYm9vbGVhbiBmcm9tVXNlcikgewotICAgICAgICAgICAgaWYgKCFtU2Vla0F2YWlsYWJsZSkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghZnJvbVVzZXIpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSdyZSBub3QgaW50ZXJlc3RlZCBpbiBwcm9ncmFtbWF0aWNhbGx5IGdlbmVyYXRlZCBjaGFuZ2VzIHRvCi0gICAgICAgICAgICAgICAgLy8gdGhlIHByb2dyZXNzIGJhcidzIHBvc2l0aW9uLgotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChtRHVyYXRpb24gPiAwKSB7Ci0gICAgICAgICAgICAgICAgaW50IHBvc2l0aW9uID0gKGludCkgKCgobG9uZykgbUR1cmF0aW9uICogcHJvZ3Jlc3MpIC8gTUFYX1BST0dSRVNTKTsKLSAgICAgICAgICAgICAgICBtQ29udHJvbHMuc2Vla1RvKHBvc2l0aW9uKTsKLQotICAgICAgICAgICAgICAgIGlmIChtQ3VycmVudFRpbWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFRpbWUuc2V0VGV4dChzdHJpbmdGb3JUaW1lKHBvc2l0aW9uKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcFRyYWNraW5nVG91Y2goU2Vla0JhciBiYXIpIHsKLSAgICAgICAgICAgIGlmICghbVNlZWtBdmFpbGFibGUpIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtRHJhZ2dpbmcgPSBmYWxzZTsKLQotICAgICAgICAgICAgc2V0UHJvZ3Jlc3MoKTsKLQotICAgICAgICAgICAgLy8gRW5zdXJlIHRoYXQgcHJvZ3Jlc3MgaXMgcHJvcGVybHkgdXBkYXRlZCBpbiB0aGUgZnV0dXJlLAotICAgICAgICAgICAgLy8gdGhlIGNhbGwgdG8gc2hvdygpIGRvZXMgbm90IGd1YXJhbnRlZSB0aGlzIGJlY2F1c2UgaXQgaXMgYQotICAgICAgICAgICAgLy8gbm8tb3AgaWYgd2UgYXJlIGFscmVhZHkgc2hvd2luZy4KLSAgICAgICAgICAgIG1JbnN0YW5jZS5wb3N0KG1VcGRhdGVQcm9ncmVzcyk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtUGxheVBhdXNlTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgdG9nZ2xlUGF1c2VQbGF5U3RhdGUoKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1SZXdMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBpbnQgcG9zID0gZ2V0Q3VycmVudFBvc2l0aW9uKCkgLSBSRVdJTkRfVElNRV9NUzsKLSAgICAgICAgICAgIG1Db250cm9scy5zZWVrVG8ocG9zKTsKLSAgICAgICAgICAgIHNldFByb2dyZXNzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtRmZ3ZExpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIGludCBwb3MgPSBnZXRDdXJyZW50UG9zaXRpb24oKSArIEZPUldBUkRfVElNRV9NUzsKLSAgICAgICAgICAgIG1Db250cm9scy5zZWVrVG8ocG9zKTsKLSAgICAgICAgICAgIHNldFByb2dyZXNzKCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtTmV4dExpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1Db250cm9scy5za2lwVG9OZXh0KCk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtUHJldkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1Db250cm9scy5za2lwVG9QcmV2aW91cygpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbUJhY2tMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZXcuT25DbGlja0xpc3RlbmVyIG1TdWJ0aXRsZUxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX1NVQlRJVExFX1RSQUNLOwotICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRUZXh0cyhtU3VidGl0bGVEZXNjcmlwdGlvbnNMaXN0KTsKLSAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0Q2hlY2tQb3NpdGlvbihtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpOwotICAgICAgICAgICAgZGlzcGxheVNldHRpbmdzV2luZG93KG1TdWJTZXR0aW5nc0FkYXB0ZXIpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVZpZGVvUXVhbGl0eUxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX1ZJREVPX1FVQUxJVFk7Ci0gICAgICAgICAgICBtU3ViU2V0dGluZ3NBZGFwdGVyLnNldFRleHRzKG1WaWRlb1F1YWxpdHlMaXN0KTsKLSAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0Q2hlY2tQb3NpdGlvbihtU2VsZWN0ZWRWaWRlb1F1YWxpdHlJbmRleCk7Ci0gICAgICAgICAgICBkaXNwbGF5U2V0dGluZ3NXaW5kb3cobVN1YlNldHRpbmdzQWRhcHRlcik7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtRnVsbFNjcmVlbkxpc3RlbmVyID0gbmV3IFZpZXcuT25DbGlja0xpc3RlbmVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25DbGljayhWaWV3IHYpIHsKLSAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNFbnRlcmluZ0Z1bGxTY3JlZW4gPSAhbUlzRnVsbFNjcmVlbjsKLSAgICAgICAgICAgIC8vIFRPRE86IFJlLWFycmFuZ2UgdGhlIGJ1dHRvbiBsYXlvdXRzIGFjY29yZGluZyB0byB0aGUgVVguCi0gICAgICAgICAgICBpZiAoaXNFbnRlcmluZ0Z1bGxTY3JlZW4pIHsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2Z1bGxzY3JlZW5fZXhpdCwgbnVsbCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2Z1bGxzY3JlZW4sIG51bGwpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEJ1bmRsZSBhcmdzID0gbmV3IEJ1bmRsZSgpOwotICAgICAgICAgICAgYXJncy5wdXRCb29sZWFuKEFSR1VNRU5UX0tFWV9GVUxMU0NSRUVOLCBpc0VudGVyaW5nRnVsbFNjcmVlbik7Ci0gICAgICAgICAgICBtQ29udHJvbGxlci5zZW5kQ29tbWFuZChDT01NQU5EX1NFVF9GVUxMU0NSRUVOLCBhcmdzLCBudWxsKTsKLQotICAgICAgICAgICAgbUlzRnVsbFNjcmVlbiA9IGlzRW50ZXJpbmdGdWxsU2NyZWVuOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbU92ZXJmbG93UmlnaHRMaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBtQmFzaWNDb250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtRXh0cmFDb250cm9scy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgIH0KLSAgICB9OwotCi0gICAgcHJpdmF0ZSBmaW5hbCBWaWV3Lk9uQ2xpY2tMaXN0ZW5lciBtT3ZlcmZsb3dMZWZ0TGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbUJhc2ljQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbUV4dHJhQ29udHJvbHMuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbU11dGVCdXR0b25MaXN0ZW5lciA9IG5ldyBWaWV3Lk9uQ2xpY2tMaXN0ZW5lcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICBpZiAoIW1Jc011dGUpIHsKLSAgICAgICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX211dGUsIG51bGwpKTsKLSAgICAgICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211dGVkX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgbUlzTXV0ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9NVVRFLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbU11dGVCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY191bm11dGUsIG51bGwpKTsKLSAgICAgICAgICAgICAgICBtTXV0ZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3VubXV0ZWRfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICBtSXNNdXRlID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9VTk1VVEUsIG51bGwsIG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgZmluYWwgVmlldy5PbkNsaWNrTGlzdGVuZXIgbVNldHRpbmdzQnV0dG9uTGlzdGVuZXIgPSBuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNsaWNrKFZpZXcgdikgewotICAgICAgICAgICAgbVNldHRpbmdzTW9kZSA9IFNFVFRJTkdTX01PREVfTUFJTjsKLSAgICAgICAgICAgIG1TZXR0aW5nc0FkYXB0ZXIuc2V0U3ViVGV4dHMobVNldHRpbmdzU3ViVGV4dHNMaXN0KTsKLSAgICAgICAgICAgIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhtU2V0dGluZ3NBZGFwdGVyKTsKLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIGZpbmFsIEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIgbVNldHRpbmdzSXRlbUNsaWNrTGlzdGVuZXIKLSAgICAgICAgICAgID0gbmV3IEFkYXB0ZXJWaWV3Lk9uSXRlbUNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkl0ZW1DbGljayhBZGFwdGVyVmlldzw/PiBwYXJlbnQsIFZpZXcgdmlldywgaW50IHBvc2l0aW9uLCBsb25nIGlkKSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKG1TZXR0aW5nc01vZGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFNFVFRJTkdTX01PREVfTUFJTjoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uID09IFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0VGV4dHMobUF1ZGlvVHJhY2tMaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0Q2hlY2tQb3NpdGlvbihtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVNldHRpbmdzTW9kZSA9IFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0s7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocG9zaXRpb24gPT0gU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5zZXRUZXh0cyhtUGxheWJhY2tTcGVlZFRleHRMaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJTZXR0aW5nc0FkYXB0ZXIuc2V0Q2hlY2tQb3NpdGlvbihtU2VsZWN0ZWRTcGVlZEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc01vZGUgPSBTRVRUSU5HU19NT0RFX1BMQVlCQUNLX1NQRUVEOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHBvc2l0aW9uID09IFNFVFRJTkdTX01PREVfSEVMUCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhtU3ViU2V0dGluZ3NBZGFwdGVyKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRUSU5HU19NT0RFX0FVRElPX1RSQUNLOgotICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gbVNlbGVjdGVkQXVkaW9UcmFja0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXggPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9UcmFja0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBleHRyYSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYS5wdXRJbnQoS0VZX1NFTEVDVEVEX0FVRElPX0lOREVYLCBwb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9TRUxFQ1RfQVVESU9fVFJBQ0ssIGV4dHJhLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5zZXQoU0VUVElOR1NfTU9ERV9BVURJT19UUkFDSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5nZXRNYWluVGV4dChwb3NpdGlvbikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRDoKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvc2l0aW9uICE9IG1TZWxlY3RlZFNwZWVkSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZWxlY3RlZFNwZWVkSW5kZXggPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIEJ1bmRsZSBleHRyYSA9IG5ldyBCdW5kbGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhLnB1dEZsb2F0KEtFWV9QTEFZQkFDS19TUEVFRCwgbVBsYXliYWNrU3BlZWRMaXN0LmdldChwb3NpdGlvbikpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoQ09NTUFORF9TRVRfUExBWUJBQ0tfU1BFRUQsIGV4dHJhLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5zZXQoU0VUVElOR1NfTU9ERV9QTEFZQkFDS19TUEVFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YlNldHRpbmdzQWRhcHRlci5nZXRNYWluVGV4dChwb3NpdGlvbikpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9IRUxQOgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTRVRUSU5HU19NT0RFX1NVQlRJVExFX1RSQUNLOgotICAgICAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gIT0gbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwb3NpdGlvbiA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdW5kbGUgZXh0cmEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmEucHV0SW50KEtFWV9TRUxFQ1RFRF9TVUJUSVRMRV9JTkRFWCwgcG9zaXRpb24gLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbGxlci5zZW5kQ29tbWFuZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NIT1dfU1VCVElUTEUsIGV4dHJhLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19zdWJ0aXRsZV9vbiwgbnVsbCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRDb250ZW50RGVzY3JpcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX2NjX2lzX29uKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlSXNFbmFibGVkID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNvbnRyb2xsZXIuc2VuZENvbW1hbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9ISURFX1NVQlRJVExFLCBudWxsLCBudWxsKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19zdWJ0aXRsZV9vZmYsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9jY19pc19vZmYpKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUlzRW5hYmxlZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvdy5kaXNtaXNzKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgU0VUVElOR1NfTU9ERV9WSURFT19RVUFMSVRZOgotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBhZGQgc3VwcG9ydCBmb3IgdmlkZW8gcXVhbGl0eQotICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRWaWRlb1F1YWxpdHlJbmRleCA9IHBvc2l0aW9uOwotICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NXaW5kb3cuZGlzbWlzcygpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH07Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlRHVyYXRpb24oKSB7Ci0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1NZXRhZGF0YS5jb250YWluc0tleShNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9EVVJBVElPTikpIHsKLSAgICAgICAgICAgICAgICBtRHVyYXRpb24gPSAoaW50KSBtTWV0YWRhdGEuZ2V0TG9uZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9EVVJBVElPTik7Ci0gICAgICAgICAgICAgICAgLy8gdXBkYXRlIHByb2dyZXNzIGJhcgotICAgICAgICAgICAgICAgIHNldFByb2dyZXNzKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlVGl0bGUoKSB7Ci0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKG1NZXRhZGF0YS5jb250YWluc0tleShNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSkpIHsKLSAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQobU1ldGFkYXRhLmdldFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhlIHRpdGxlIGJhciBpcyBtYWRlIHVwIG9mIHR3byBzZXBhcmF0ZSBMaW5lYXJMYXlvdXRzLiBJZiB0aGUgc3VtIG9mIHRoZSB0d28gYmFycyBhcmUKLSAgICAvLyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgdGl0bGUgYmFyLCByZWR1Y2UgdGhlIHNpemUgb2YgdGhlIGxlZnQgYmFyICh3aGljaCBtYWtlcyB0aGUKLSAgICAvLyBUZXh0VmlldyB0aGF0IGNvbnRhaW5zIHRoZSB0aXRsZSBvZiB0aGUgbWVkaWEgZmlsZSBzaHJpbmspLgotICAgIHByaXZhdGUgdm9pZCB1cGRhdGVUaXRsZUJhckxheW91dCgpIHsKLSAgICAgICAgaWYgKG1UaXRsZUJhciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpbnQgdGl0bGVCYXJXaWR0aCA9IG1UaXRsZUJhci5nZXRXaWR0aCgpOwotCi0gICAgICAgICAgICBWaWV3IGxlZnRCYXIgPSBtVGl0bGVCYXIuZmluZFZpZXdCeUlkKFIuaWQudGl0bGVfYmFyX2xlZnQpOwotICAgICAgICAgICAgVmlldyByaWdodEJhciA9IG1UaXRsZUJhci5maW5kVmlld0J5SWQoUi5pZC50aXRsZV9iYXJfcmlnaHQpOwotICAgICAgICAgICAgaW50IGxlZnRCYXJXaWR0aCA9IGxlZnRCYXIuZ2V0V2lkdGgoKTsKLSAgICAgICAgICAgIGludCByaWdodEJhcldpZHRoID0gcmlnaHRCYXIuZ2V0V2lkdGgoKTsKLQotICAgICAgICAgICAgUmVsYXRpdmVMYXlvdXQuTGF5b3V0UGFyYW1zIHBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgICAgIChSZWxhdGl2ZUxheW91dC5MYXlvdXRQYXJhbXMpIGxlZnRCYXIuZ2V0TGF5b3V0UGFyYW1zKCk7Ci0gICAgICAgICAgICBpZiAobGVmdEJhcldpZHRoICsgcmlnaHRCYXJXaWR0aCA+IHRpdGxlQmFyV2lkdGgpIHsKLSAgICAgICAgICAgICAgICBwYXJhbXMud2lkdGggPSB0aXRsZUJhcldpZHRoIC0gcmlnaHRCYXJXaWR0aDsKLSAgICAgICAgICAgICAgICBtT3JpZ2luYWxMZWZ0QmFyV2lkdGggPSBsZWZ0QmFyV2lkdGg7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGxlZnRCYXJXaWR0aCArIHJpZ2h0QmFyV2lkdGggPCB0aXRsZUJhcldpZHRoICYmIG1PcmlnaW5hbExlZnRCYXJXaWR0aCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcGFyYW1zLndpZHRoID0gbU9yaWdpbmFsTGVmdEJhcldpZHRoOwotICAgICAgICAgICAgICAgIG1PcmlnaW5hbExlZnRCYXJXaWR0aCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBsZWZ0QmFyLnNldExheW91dFBhcmFtcyhwYXJhbXMpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUF1ZGlvTWV0YWRhdGEoKSB7Ci0gICAgICAgIGlmIChtTWVkaWFUeXBlICE9IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtTWV0YWRhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgU3RyaW5nIHRpdGxlVGV4dCA9ICIiOwotICAgICAgICAgICAgU3RyaW5nIGFydGlzdFRleHQgPSAiIjsKLSAgICAgICAgICAgIGlmIChtTWV0YWRhdGEuY29udGFpbnNLZXkoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfVElUTEUpKSB7Ci0gICAgICAgICAgICAgICAgdGl0bGVUZXh0ID0gbU1ldGFkYXRhLmdldFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRpdGxlVGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfbXVzaWNfdGl0bGVfdW5rbm93bl90ZXh0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1NZXRhZGF0YS5jb250YWluc0tleShNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9BUlRJU1QpKSB7Ci0gICAgICAgICAgICAgICAgYXJ0aXN0VGV4dCA9IG1NZXRhZGF0YS5nZXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfQVJUSVNUKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYXJ0aXN0VGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfbXVzaWNfYXJ0aXN0X3Vua25vd25fdGV4dCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFVwZGF0ZSB0aXRsZSBmb3IgRW1iZWRkZWQgc2l6ZSB0eXBlCi0gICAgICAgICAgICBtVGl0bGVWaWV3LnNldFRleHQodGl0bGVUZXh0ICsgIiAtICIgKyBhcnRpc3RUZXh0KTsKLQotICAgICAgICAgICAgLy8gU2V0IHRvIHRydWUgdG8gdXBkYXRlIGxheW91dCBpbnNpZGUgb25NZWFzdXJlKCkKLSAgICAgICAgICAgIG1OZWVkVVhVcGRhdGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxheW91dCgpIHsKLSAgICAgICAgaWYgKG1Jc0FkdmVydGlzZW1lbnQpIHsKLSAgICAgICAgICAgIG1SZXdCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUZmd2RCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVRpbWVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgbUFkU2tpcFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgbUFkUmVtYWluaW5nVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICBtQWRFeHRlcm5hbExpbmsuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotCi0gICAgICAgICAgICBtUHJvZ3Jlc3Muc2V0RW5hYmxlZChmYWxzZSk7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgIG1OZXh0QnV0dG9uLnNldENvbG9yRmlsdGVyKFIuY29sb3IuZ3JheSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1QcmV2QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1UaW1lVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgIG1BZFNraXBWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIG1BZFJlbWFpbmluZ1ZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbUFkRXh0ZXJuYWxMaW5rLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgbVByb2dyZXNzLnNldEVuYWJsZWQodHJ1ZSk7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgbU5leHRCdXR0b24uY2xlYXJDb2xvckZpbHRlcigpOwotICAgICAgICAgICAgZGlzYWJsZVVuc3VwcG9ydGVkQnV0dG9ucygpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHVwZGF0ZUxheW91dChpbnQgbWF4SWNvbkNvdW50LCBpbnQgZnVsbEljb25TaXplLCBpbnQgZW1iZWRkZWRJY29uU2l6ZSwKLSAgICAgICAgICAgICBpbnQgbWFyZ2luU2l6ZSwgaW50IGN1cnJXaWR0aCwgaW50IGN1cnJIZWlnaHQsIGludCBzY3JlZW5XaWR0aCwgaW50IHNjcmVlbkhlaWdodCkgewotICAgICAgICBpbnQgZnVsbEJvdHRvbUJhclJpZ2h0V2lkdGhNYXggPSBmdWxsSWNvblNpemUgKiBtYXhJY29uQ291bnQKLSAgICAgICAgICAgICAgICArIG1hcmdpblNpemUgKiAobWF4SWNvbkNvdW50ICogMik7Ci0gICAgICAgIGludCBlbWJlZGRlZEJvdHRvbUJhclJpZ2h0V2lkdGhNYXggPSBlbWJlZGRlZEljb25TaXplICogbWF4SWNvbkNvdW50Ci0gICAgICAgICAgICAgICAgKyBtYXJnaW5TaXplICogKG1heEljb25Db3VudCAqIDIpOwotICAgICAgICBpbnQgZnVsbFdpZHRoID0gbVRyYW5zcG9ydENvbnRyb2xzLmdldFdpZHRoKCkgKyBtVGltZVZpZXcuZ2V0V2lkdGgoKQotICAgICAgICAgICAgICAgICsgZnVsbEJvdHRvbUJhclJpZ2h0V2lkdGhNYXg7Ci0gICAgICAgIGludCBlbWJlZGRlZFdpZHRoID0gbVRpbWVWaWV3LmdldFdpZHRoKCkgKyBlbWJlZGRlZEJvdHRvbUJhclJpZ2h0V2lkdGhNYXg7Ci0gICAgICAgIGludCBzY3JlZW5NYXhMZW5ndGggPSBNYXRoLm1heChzY3JlZW5XaWR0aCwgc2NyZWVuSGVpZ2h0KTsKLQotICAgICAgICBpZiAoZnVsbFdpZHRoID4gc2NyZWVuTWF4TGVuZ3RoKSB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBzY3JlZW4gbWF5IGJlIHNtYWxsZXIgdGhhbiB0aGUgbGVuZ3RoIG5lZWRlZCBmb3IgRnVsbCBzaXplLgotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiBpc0Z1bGxTaXplID0gKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9ERUZBVUxUKSA/IChjdXJyV2lkdGggPT0gc2NyZWVuTWF4TGVuZ3RoKSA6Ci0gICAgICAgICAgICAgICAgKGN1cnJXaWR0aCA9PSBzY3JlZW5XaWR0aCAmJiBjdXJySGVpZ2h0ID09IHNjcmVlbkhlaWdodCk7Ci0KLSAgICAgICAgaWYgKGlzRnVsbFNpemUpIHsKLSAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRGb3JTaXplQ2hhbmdlKFNJWkVfVFlQRV9GVUxMKTsKLSAgICAgICAgICAgICAgICBpZiAobU1lZGlhVHlwZSA9PSBNRURJQV9UWVBFX01VU0lDKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1UaXRsZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChlbWJlZGRlZFdpZHRoIDw9IGN1cnJXaWR0aCkgewotICAgICAgICAgICAgaWYgKG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRU1CRURERUQpIHsKLSAgICAgICAgICAgICAgICB1cGRhdGVMYXlvdXRGb3JTaXplQ2hhbmdlKFNJWkVfVFlQRV9FTUJFRERFRCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVNpemVUeXBlICE9IFNJWkVfVFlQRV9NSU5JTUFMKSB7Ci0gICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0Rm9yU2l6ZUNoYW5nZShTSVpFX1RZUEVfTUlOSU1BTCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1NZWRpYVR5cGUgPT0gTUVESUFfVFlQRV9NVVNJQykgewotICAgICAgICAgICAgICAgICAgICBtVGl0bGVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlTGF5b3V0Rm9yU2l6ZUNoYW5nZShpbnQgc2l6ZVR5cGUpIHsKLSAgICAgICAgbVNpemVUeXBlID0gc2l6ZVR5cGU7Ci0gICAgICAgIFJlbGF0aXZlTGF5b3V0LkxheW91dFBhcmFtcyB0aW1lVmlld1BhcmFtcyA9Ci0gICAgICAgICAgICAgICAgKFJlbGF0aXZlTGF5b3V0LkxheW91dFBhcmFtcykgbVRpbWVWaWV3LmdldExheW91dFBhcmFtcygpOwotICAgICAgICBTZWVrQmFyIHNlZWtlciA9IChTZWVrQmFyKSBtUHJvZ3Jlc3M7Ci0gICAgICAgIHN3aXRjaCAobVNpemVUeXBlKSB7Ci0gICAgICAgICAgICBjYXNlIFNJWkVfVFlQRV9FTUJFRERFRDoKLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBUaXRsZSBCYXIKLSAgICAgICAgICAgICAgICBtVGl0bGVCYXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEZ1bGwgU2NyZWVuIEJ1dHRvbgotICAgICAgICAgICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbiA9IG1Cb3R0b21CYXJSaWdodFZpZXcuZmluZFZpZXdCeUlkKFIuaWQuZnVsbHNjcmVlbik7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GdWxsU2NyZWVuTGlzdGVuZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5yZW1vdmVBbGxWaWV3cygpOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5yZW1vdmVWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbUJvdHRvbUJhckxlZnRWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBtVHJhbnNwb3J0Q29udHJvbHMgPSBpbmZsYXRlVHJhbnNwb3J0Q29udHJvbHMoUi5sYXlvdXQuZW1iZWRkZWRfdHJhbnNwb3J0X2NvbnRyb2xzKTsKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5hZGRWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0VGh1bWIobVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmN1c3RvbV9wcm9ncmVzc190aHVtYikpOwotICAgICAgICAgICAgICAgIG1Qcm9ncmVzc0J1ZmZlci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyCi0gICAgICAgICAgICAgICAgbUJvdHRvbUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVWaWV3UGFyYW1zLmdldFJ1bGUoUmVsYXRpdmVMYXlvdXQuTEVGVF9PRikgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICB0aW1lVmlld1BhcmFtcy5yZW1vdmVSdWxlKFJlbGF0aXZlTGF5b3V0LkxFRlRfT0YpOwotICAgICAgICAgICAgICAgICAgICB0aW1lVmlld1BhcmFtcy5hZGRSdWxlKFJlbGF0aXZlTGF5b3V0LlJJR0hUX09GLCBSLmlkLmJvdHRvbV9iYXJfbGVmdCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTSVpFX1RZUEVfRlVMTDoKLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBUaXRsZSBCYXIKLSAgICAgICAgICAgICAgICBtVGl0bGVCYXIuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1CYWNrQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEZ1bGwgU2NyZWVuIEJ1dHRvbgotICAgICAgICAgICAgICAgIG1NaW5pbWFsRXh0cmFWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbiA9IG1Cb3R0b21CYXJSaWdodFZpZXcuZmluZFZpZXdCeUlkKFIuaWQuZnVsbHNjcmVlbik7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GdWxsU2NyZWVuTGlzdGVuZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5yZW1vdmVBbGxWaWV3cygpOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5yZW1vdmVWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKFIubGF5b3V0LmZ1bGxfdHJhbnNwb3J0X2NvbnRyb2xzKTsKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyTGVmdFZpZXcuYWRkVmlldyhtVHJhbnNwb3J0Q29udHJvbHMsIDApOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0VGh1bWIobVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmN1c3RvbV9wcm9ncmVzc190aHVtYikpOwotICAgICAgICAgICAgICAgIG1Qcm9ncmVzc0J1ZmZlci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBCb3R0b20gQmFyCi0gICAgICAgICAgICAgICAgbUJvdHRvbUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRpbWVWaWV3UGFyYW1zLmdldFJ1bGUoUmVsYXRpdmVMYXlvdXQuUklHSFRfT0YpICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgdGltZVZpZXdQYXJhbXMucmVtb3ZlUnVsZShSZWxhdGl2ZUxheW91dC5SSUdIVF9PRik7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVWaWV3UGFyYW1zLmFkZFJ1bGUoUmVsYXRpdmVMYXlvdXQuTEVGVF9PRiwgUi5pZC5ib3R0b21fYmFyX3JpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNJWkVfVFlQRV9NSU5JTUFMOgotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIFRpdGxlIEJhcgotICAgICAgICAgICAgICAgIG1UaXRsZUJhci5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICAgICAgbUJhY2tCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gRnVsbCBTY3JlZW4gQnV0dG9uCi0gICAgICAgICAgICAgICAgbU1pbmltYWxFeHRyYVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgIG1GdWxsU2NyZWVuQnV0dG9uID0gbU1pbmltYWxFeHRyYVZpZXcuZmluZFZpZXdCeUlkKFIuaWQuZnVsbHNjcmVlbik7Ci0gICAgICAgICAgICAgICAgbUZ1bGxTY3JlZW5CdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1GdWxsU2NyZWVuTGlzdGVuZXIpOwotCi0gICAgICAgICAgICAgICAgLy8gUmVsYXRpbmcgdG8gQ2VudGVyIFZpZXcKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5yZW1vdmVBbGxWaWV3cygpOwotICAgICAgICAgICAgICAgIG1Cb3R0b21CYXJMZWZ0Vmlldy5yZW1vdmVWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0gICAgICAgICAgICAgICAgbVRyYW5zcG9ydENvbnRyb2xzID0gaW5mbGF0ZVRyYW5zcG9ydENvbnRyb2xzKFIubGF5b3V0Lm1pbmltYWxfdHJhbnNwb3J0X2NvbnRyb2xzKTsKLSAgICAgICAgICAgICAgICBtQ2VudGVyVmlldy5hZGRWaWV3KG1UcmFuc3BvcnRDb250cm9scyk7Ci0KLSAgICAgICAgICAgICAgICAvLyBSZWxhdGluZyB0byBQcm9ncmVzcyBCYXIKLSAgICAgICAgICAgICAgICBzZWVrZXIuc2V0VGh1bWIobnVsbCk7Ci0gICAgICAgICAgICAgICAgbVByb2dyZXNzQnVmZmVyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLQotICAgICAgICAgICAgICAgIC8vIFJlbGF0aW5nIHRvIEJvdHRvbSBCYXIKLSAgICAgICAgICAgICAgICBtQm90dG9tQmFyLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBtVGltZVZpZXcuc2V0TGF5b3V0UGFyYW1zKHRpbWVWaWV3UGFyYW1zKTsKLQotICAgICAgICBpZiAoaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BhdXNlX2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BhdXNlX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wbGF5X2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BsYXlfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtSXNGdWxsU2NyZWVuKSB7Ci0gICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfZnVsbHNjcmVlbl9leGl0LCBudWxsKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtRnVsbFNjcmVlbkJ1dHRvbi5zZXRJbWFnZURyYXdhYmxlKAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldERyYXdhYmxlKFIuZHJhd2FibGUuaWNfZnVsbHNjcmVlbiwgbnVsbCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBWaWV3IGluZmxhdGVUcmFuc3BvcnRDb250cm9scyhpbnQgbGF5b3V0SWQpIHsKLSAgICAgICAgVmlldyB2ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwgbGF5b3V0SWQpOwotICAgICAgICBtUGxheVBhdXNlQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5wYXVzZSk7Ci0gICAgICAgIGlmIChtUGxheVBhdXNlQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24ucmVxdWVzdEZvY3VzKCk7Ci0gICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtUGxheVBhdXNlTGlzdGVuZXIpOwotICAgICAgICB9Ci0gICAgICAgIG1GZndkQnV0dG9uID0gdi5maW5kVmlld0J5SWQoUi5pZC5mZndkKTsKLSAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihtRmZ3ZExpc3RlbmVyKTsKLSAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICBtRmZ3ZEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbVJld0J1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQucmV3KTsKLSAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobVJld0xpc3RlbmVyKTsKLSAgICAgICAgICAgIGlmIChtTWVkaWFUeXBlID09IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICBtUmV3QnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgTmV4dCBhbmQgUHJldmlvdXMgYnV0dG9ucwotICAgICAgICBtTmV4dEJ1dHRvbiA9IHYuZmluZFZpZXdCeUlkKFIuaWQubmV4dCk7Ci0gICAgICAgIGlmIChtTmV4dEJ1dHRvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRPbkNsaWNrTGlzdGVuZXIobU5leHRMaXN0ZW5lcik7Ci0gICAgICAgICAgICBtTmV4dEJ1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0KLSAgICAgICAgbVByZXZCdXR0b24gPSB2LmZpbmRWaWV3QnlJZChSLmlkLnByZXYpOwotICAgICAgICBpZiAobVByZXZCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0T25DbGlja0xpc3RlbmVyKG1QcmV2TGlzdGVuZXIpOwotICAgICAgICAgICAgbVByZXZCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2OwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBpbml0aWFsaXplU2V0dGluZ3NMaXN0cygpIHsKLSAgICAgICAgbVNldHRpbmdzTWFpblRleHRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBtU2V0dGluZ3NNYWluVGV4dHNMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml9hdWRpb190cmFja190ZXh0KSk7Ci0gICAgICAgIG1TZXR0aW5nc01haW5UZXh0c0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX3BsYXliYWNrX3NwZWVkX3RleHQpKTsKLSAgICAgICAgbVNldHRpbmdzTWFpblRleHRzTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfaGVscF90ZXh0KSk7Ci0KLSAgICAgICAgbVNldHRpbmdzU3ViVGV4dHNMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfbm9uZV90ZXh0KSk7Ci0gICAgICAgIG1TZXR0aW5nc1N1YlRleHRzTGlzdC5hZGQoCi0gICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmdBcnJheSgKLSAgICAgICAgICAgICAgICAgICAgICAgIFIuYXJyYXkuTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRzKVtQTEFZQkFDS19TUEVFRF8xeF9JTkRFWF0pOwotICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3QuYWRkKFJFU09VUkNFX0VNUFRZKTsKLQotICAgICAgICBtU2V0dGluZ3NJY29uSWRzTGlzdCA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLSAgICAgICAgbVNldHRpbmdzSWNvbklkc0xpc3QuYWRkKFIuZHJhd2FibGUuaWNfYXVkaW90cmFjayk7Ci0gICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0LmFkZChSLmRyYXdhYmxlLmljX3BsYXlfY2lyY2xlX2ZpbGxlZCk7Ci0gICAgICAgIG1TZXR0aW5nc0ljb25JZHNMaXN0LmFkZChSLmRyYXdhYmxlLmljX2hlbHApOwotCi0gICAgICAgIG1BdWRpb1RyYWNrTGlzdCA9IG5ldyBBcnJheUxpc3Q8U3RyaW5nPigpOwotICAgICAgICBtQXVkaW9UcmFja0xpc3QuYWRkKAotICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX25vbmVfdGV4dCkpOwotCi0gICAgICAgIG1WaWRlb1F1YWxpdHlMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgIG1WaWRlb1F1YWxpdHlMaXN0LmFkZCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5NZWRpYUNvbnRyb2xWaWV3Ml92aWRlb19xdWFsaXR5X2F1dG9fdGV4dCkpOwotCi0gICAgICAgIG1QbGF5YmFja1NwZWVkVGV4dExpc3QgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oQXJyYXlzLmFzTGlzdCgKLSAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZ0FycmF5KFIuYXJyYXkuTWVkaWFDb250cm9sVmlldzJfcGxheWJhY2tfc3BlZWRzKSkpOwotICAgICAgICAvLyBTZWxlY3QgdGhlICIxeCIgc3BlZWQgYXMgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICAgIG1TZWxlY3RlZFNwZWVkSW5kZXggPSBQTEFZQkFDS19TUEVFRF8xeF9JTkRFWDsKLQotICAgICAgICBtUGxheWJhY2tTcGVlZExpc3QgPSBuZXcgQXJyYXlMaXN0PEZsb2F0PigpOwotICAgICAgICBpbnRbXSBzcGVlZHMgPSBtUmVzb3VyY2VzLmdldEludEFycmF5KFIuYXJyYXkuc3BlZWRfbXVsdGlwbGllZF9ieV8xMDApOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNwZWVkcy5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgZmxvYXQgc3BlZWQgPSAoZmxvYXQpIHNwZWVkc1tpXSAvIDEwMC4wZjsKLSAgICAgICAgICAgIG1QbGF5YmFja1NwZWVkTGlzdC5hZGQoc3BlZWQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRpc3BsYXlTZXR0aW5nc1dpbmRvdyhCYXNlQWRhcHRlciBhZGFwdGVyKSB7Ci0gICAgICAgIC8vIFNldCBBZGFwdGVyCi0gICAgICAgIG1TZXR0aW5nc0xpc3RWaWV3LnNldEFkYXB0ZXIoYWRhcHRlcik7Ci0KLSAgICAgICAgLy8gU2V0IHdpZHRoIG9mIHdpbmRvdwotICAgICAgICBpbnQgaXRlbVdpZHRoID0gKG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRU1CRURERUQpCi0gICAgICAgICAgICAgICAgPyBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1XaWR0aCA6IG1GdWxsU2V0dGluZ3NJdGVtV2lkdGg7Ci0gICAgICAgIG1TZXR0aW5nc1dpbmRvdy5zZXRXaWR0aChpdGVtV2lkdGgpOwotCi0gICAgICAgIC8vIENhbGN1bGF0ZSBoZWlnaHQgb2Ygd2luZG93IGFuZCBzaG93Ci0gICAgICAgIGludCBpdGVtSGVpZ2h0ID0gKG1TaXplVHlwZSA9PSBTSVpFX1RZUEVfRU1CRURERUQpCi0gICAgICAgICAgICAgICAgPyBtRW1iZWRkZWRTZXR0aW5nc0l0ZW1IZWlnaHQgOiBtRnVsbFNldHRpbmdzSXRlbUhlaWdodDsKLSAgICAgICAgaW50IHRvdGFsSGVpZ2h0ID0gYWRhcHRlci5nZXRDb3VudCgpICogaXRlbUhlaWdodDsKLSAgICAgICAgbVNldHRpbmdzV2luZG93LmRpc21pc3MoKTsKLSAgICAgICAgbVNldHRpbmdzV2luZG93LnNob3dBc0Ryb3BEb3duKG1JbnN0YW5jZSwgbVNldHRpbmdzV2luZG93TWFyZ2luLAotICAgICAgICAgICAgICAgIG1TZXR0aW5nc1dpbmRvd01hcmdpbiAtIHRvdGFsSGVpZ2h0LCBHcmF2aXR5LkJPVFRPTSB8IEdyYXZpdHkuUklHSFQpOwotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgTWVkaWFDb250cm9sbGVyQ2FsbGJhY2sgZXh0ZW5kcyBNZWRpYUNvbnRyb2xsZXIuQ2FsbGJhY2sgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25QbGF5YmFja1N0YXRlQ2hhbmdlZChQbGF5YmFja1N0YXRlIHN0YXRlKSB7Ci0gICAgICAgICAgICBtUGxheWJhY2tTdGF0ZSA9IHN0YXRlOwotCi0gICAgICAgICAgICAvLyBVcGRhdGUgcGF1c2UgYnV0dG9uIGRlcGVuZGluZyBvbiBwbGF5YmFjayBzdGF0ZSBmb3IgdGhlIGZvbGxvd2luZyB0d28gcmVhc29uczoKLSAgICAgICAgICAgIC8vICAgMSkgTmVlZCB0byBoYW5kbGUgY2FzZSB3aGVyZSBhcHAgY3VzdG9taXplcyBwbGF5YmFjayBzdGF0ZSBiZWhhdmlvciB3aGVuIGFwcAotICAgICAgICAgICAgLy8gICAgICBhY3Rpdml0eSBpcyByZXN1bWVkLgotICAgICAgICAgICAgLy8gICAyKSBOZWVkIHRvIGhhbmRsZSBjYXNlIHdoZXJlIHRoZSBtZWRpYSBmaWxlIHJlYWNoZXMgZW5kIG9mIGR1cmF0aW9uLgotICAgICAgICAgICAgaWYgKG1QbGF5YmFja1N0YXRlLmdldFN0YXRlKCkgIT0gbVByZXZTdGF0ZSkgewotICAgICAgICAgICAgICAgIHN3aXRjaCAobVBsYXliYWNrU3RhdGUuZ2V0U3RhdGUoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORzoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3BhdXNlX2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BhdXNlX2J1dHRvbl9kZXNjKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVtb3ZlQ2FsbGJhY2tzKG1VcGRhdGVQcm9ncmVzcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UucG9zdChtVXBkYXRlUHJvZ3Jlc3MpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldEltYWdlRHJhd2FibGUoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZXNvdXJjZXMuZ2V0RHJhd2FibGUoUi5kcmF3YWJsZS5pY19wbGF5X2NpcmNsZV9maWxsZWQsIG51bGwpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0Q29udGVudERlc2NyaXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX3BsYXlfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFBsYXliYWNrU3RhdGUuU1RBVEVfU1RPUFBFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5UGF1c2VCdXR0b24uc2V0SW1hZ2VEcmF3YWJsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX3JlcGxheV9jaXJjbGVfZmlsbGVkLCBudWxsKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldENvbnRlbnREZXNjcmlwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVJlc291cmNlcy5nZXRTdHJpbmcoUi5zdHJpbmcubWN2Ml9yZXBsYXlfYnV0dG9uX2Rlc2MpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Jc1N0b3BwZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbVByZXZTdGF0ZSA9IG1QbGF5YmFja1N0YXRlLmdldFN0YXRlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtUGxheWJhY2tBY3Rpb25zICE9IG1QbGF5YmFja1N0YXRlLmdldEFjdGlvbnMoKSkgewotICAgICAgICAgICAgICAgIGxvbmcgbmV3QWN0aW9ucyA9IG1QbGF5YmFja1N0YXRlLmdldEFjdGlvbnMoKTsKLSAgICAgICAgICAgICAgICBpZiAoKG5ld0FjdGlvbnMgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9QQVVTRSkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBtUGxheVBhdXNlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChuZXdBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EKSAhPSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtTWVkaWFUeXBlICE9IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1SZXdCdXR0b24gIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVJld0J1dHRvbi5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKChuZXdBY3Rpb25zICYgUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEKSAhPSAwCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBtTWVkaWFUeXBlICE9IE1FRElBX1RZUEVfTVVTSUMpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1GZndkQnV0dG9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1GZndkQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoKG5ld0FjdGlvbnMgJiBQbGF5YmFja1N0YXRlLkFDVElPTl9TRUVLX1RPKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TZWVrQXZhaWxhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBtU2Vla0F2YWlsYWJsZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGxheWJhY2tBY3Rpb25zID0gbmV3QWN0aW9uczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gQWRkIGJ1dHRvbnMgaWYgY3VzdG9tIGFjdGlvbnMgYXJlIHByZXNlbnQuCi0gICAgICAgICAgICBMaXN0PFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uPiBjdXN0b21BY3Rpb25zID0gbVBsYXliYWNrU3RhdGUuZ2V0Q3VzdG9tQWN0aW9ucygpOwotICAgICAgICAgICAgbUN1c3RvbUJ1dHRvbnMucmVtb3ZlQWxsVmlld3MoKTsKLSAgICAgICAgICAgIGlmIChjdXN0b21BY3Rpb25zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKFBsYXliYWNrU3RhdGUuQ3VzdG9tQWN0aW9uIGFjdGlvbiA6IGN1c3RvbUFjdGlvbnMpIHsKLSAgICAgICAgICAgICAgICAgICAgSW1hZ2VCdXR0b24gYnV0dG9uID0gbmV3IEltYWdlQnV0dG9uKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCAvKiBBdHRyaWJ1dGVTZXQgKi8sIDAgLyogU3R5bGUgKi8pOwotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBBcHBseSBSLnN0eWxlLkJvdHRvbUJhckJ1dHRvbiB0byB0aGlzIGJ1dHRvbiB1c2luZyBsaWJyYXJ5IGNvbnRleHQuCi0gICAgICAgICAgICAgICAgICAgIC8vIFJlZmVyIENvbnN0cnVjdG9yIHdpdGggYXJndW1lbnQgKGludCBkZWZTdHlsZVJlcykgb2YgVmlldy5qYXZhCi0gICAgICAgICAgICAgICAgICAgIGJ1dHRvbi5zZXRJbWFnZVJlc291cmNlKGFjdGlvbi5nZXRJY29uKCkpOwotICAgICAgICAgICAgICAgICAgICBidXR0b24uc2V0VG9vbHRpcFRleHQoYWN0aW9uLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBhY3Rpb25TdHJpbmcgPSBhY3Rpb24uZ2V0QWN0aW9uKCkudG9TdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgYnV0dG9uLnNldE9uQ2xpY2tMaXN0ZW5lcihuZXcgVmlldy5PbkNsaWNrTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2xpY2soVmlldyB2KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogQ3VycmVudGx5LCB3ZSBhcmUganVzdCBzZW5kaW5nIGV4dHJhcyB0aGF0IGNhbWUgZnJvbSBzZXNzaW9uLgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIGl0IHRoZSByaWdodCBiZWhhdmlvcj8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29udHJvbHMuc2VuZEN1c3RvbUFjdGlvbihhY3Rpb25TdHJpbmcsIGFjdGlvbi5nZXRFeHRyYXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXN0b21CdXR0b25zLmFkZFZpZXcoYnV0dG9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgb25NZXRhZGF0YUNoYW5nZWQoTWVkaWFNZXRhZGF0YSBtZXRhZGF0YSkgewotICAgICAgICAgICAgbU1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICAgICAgICB1cGRhdGVEdXJhdGlvbigpOwotICAgICAgICAgICAgdXBkYXRlVGl0bGUoKTsKLSAgICAgICAgICAgIHVwZGF0ZUF1ZGlvTWV0YWRhdGEoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlc3Npb25FdmVudChTdHJpbmcgZXZlbnQsIEJ1bmRsZSBleHRyYXMpIHsKLSAgICAgICAgICAgIHN3aXRjaCAoZXZlbnQpIHsKLSAgICAgICAgICAgICAgICBjYXNlIEVWRU5UX1VQREFURV9UUkFDS19TVEFUVVM6Ci0gICAgICAgICAgICAgICAgICAgIG1WaWRlb1RyYWNrQ291bnQgPSBleHRyYXMuZ2V0SW50KEtFWV9WSURFT19UUkFDS19DT1VOVCk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG9uZSBvciBtb3JlIGF1ZGlvIHRyYWNrcywgYW5kIHRoaXMgaW5mb3JtYXRpb24gaGFzIG5vdCBiZWVuCi0gICAgICAgICAgICAgICAgICAgIC8vIHJlZmxlY3RlZCBpbnRvIHRoZSBTZXR0aW5ncyB3aW5kb3cgeWV0LCBhdXRvbWF0aWNhbGx5IGNoZWNrIHRoZSBmaXJzdCB0cmFjay4KLSAgICAgICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCB0aGUgQXVkaW8gVHJhY2sgc2VsZWN0aW9uIHdpbGwgYmUgZGVmYXVsdGVkIHRvICJOb25lIi4KLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tDb3VudCA9IGV4dHJhcy5nZXRJbnQoS0VZX0FVRElPX1RSQUNLX0NPVU5UKTsKLSAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtQXVkaW9UcmFja0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkIG1vcmUgdGV4dCBhYm91dCB0cmFjayBpbmZvLgotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtQXVkaW9UcmFja0NvdW50OyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgdHJhY2sgPSBtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX2F1ZGlvX3RyYWNrX251bWJlcl90ZXh0LCBpICsgMSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tMaXN0LmFkZCh0cmFjayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBDaGFuZ2Ugc3ViIHRleHQgaW5zaWRlIHRoZSBTZXR0aW5ncyB3aW5kb3cuCi0gICAgICAgICAgICAgICAgICAgICAgICBtU2V0dGluZ3NTdWJUZXh0c0xpc3Quc2V0KFNFVFRJTkdTX01PREVfQVVESU9fVFJBQ0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrTGlzdC5nZXQoMCkpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tMaXN0LmFkZChtUmVzb3VyY2VzLmdldFN0cmluZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfYXVkaW9fdHJhY2tfbm9uZV90ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1WaWRlb1RyYWNrQ291bnQgPT0gMCAmJiBtQXVkaW9UcmFja0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhVHlwZSA9IE1FRElBX1RZUEVfTVVTSUM7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVUcmFja0NvdW50ID0gZXh0cmFzLmdldEludChLRVlfU1VCVElUTEVfVFJBQ0tfQ09VTlQpOwotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVEZXNjcmlwdGlvbnNMaXN0ID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtU3VidGl0bGVUcmFja0NvdW50ID4gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TdWJ0aXRsZUJ1dHRvbi5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlRGVzY3JpcHRpb25zTGlzdC5hZGQobVJlc291cmNlcy5nZXRTdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuc3RyaW5nLk1lZGlhQ29udHJvbFZpZXcyX3N1YnRpdGxlX29mZl90ZXh0KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1TdWJ0aXRsZVRyYWNrQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyB0cmFjayA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5zdHJpbmcuTWVkaWFDb250cm9sVmlldzJfc3VidGl0bGVfdHJhY2tfbnVtYmVyX3RleHQsIGkgKyAxKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVEZXNjcmlwdGlvbnNMaXN0LmFkZCh0cmFjayk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVCdXR0b24uc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbVN1YnRpdGxlQnV0dG9uLnNldEVuYWJsZWQoZmFsc2UpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRVZFTlRfVVBEQVRFX01FRElBX1RZUEVfU1RBVFVTOgotICAgICAgICAgICAgICAgICAgICBib29sZWFuIG5ld1N0YXR1cyA9IGV4dHJhcy5nZXRCb29sZWFuKEtFWV9TVEFURV9JU19BRFZFUlRJU0VNRU5UKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5ld1N0YXR1cyAhPSBtSXNBZHZlcnRpc2VtZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSXNBZHZlcnRpc2VtZW50ID0gbmV3U3RhdHVzOwotICAgICAgICAgICAgICAgICAgICAgICAgdXBkYXRlTGF5b3V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFNldHRpbmdzQWRhcHRlciBleHRlbmRzIEJhc2VBZGFwdGVyIHsKLSAgICAgICAgcHJpdmF0ZSBMaXN0PEludGVnZXI+IG1JY29uSWRzOwotICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtTWFpblRleHRzOwotICAgICAgICBwcml2YXRlIExpc3Q8U3RyaW5nPiBtU3ViVGV4dHM7Ci0KLSAgICAgICAgcHVibGljIFNldHRpbmdzQWRhcHRlcihMaXN0PFN0cmluZz4gbWFpblRleHRzLCBATnVsbGFibGUgTGlzdDxTdHJpbmc+IHN1YlRleHRzLAotICAgICAgICAgICAgICAgIEBOdWxsYWJsZSBMaXN0PEludGVnZXI+IGljb25JZHMpIHsKLSAgICAgICAgICAgIG1NYWluVGV4dHMgPSBtYWluVGV4dHM7Ci0gICAgICAgICAgICBtU3ViVGV4dHMgPSBzdWJUZXh0czsKLSAgICAgICAgICAgIG1JY29uSWRzID0gaWNvbklkczsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIHVwZGF0ZVN1YlRleHRzKExpc3Q8U3RyaW5nPiBzdWJUZXh0cykgewotICAgICAgICAgICAgbVN1YlRleHRzID0gc3ViVGV4dHM7Ci0gICAgICAgICAgICBub3RpZnlEYXRhU2V0Q2hhbmdlZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFN0cmluZyBnZXRNYWluVGV4dChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIGlmIChtTWFpblRleHRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBtTWFpblRleHRzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbU1haW5UZXh0cy5nZXQocG9zaXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBSRVNPVVJDRV9FTVBUWTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgaW50IGdldENvdW50KCkgewotICAgICAgICAgICAgcmV0dXJuIChtTWFpblRleHRzID09IG51bGwpID8gMCA6IG1NYWluVGV4dHMuc2l6ZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBsb25nIGdldEl0ZW1JZChpbnQgcG9zaXRpb24pIHsKLSAgICAgICAgICAgIC8vIEF1dG8tZ2VuZXJhdGVkIG1ldGhvZCBzdHViLS1kb2VzIG5vdCBoYXZlIGFueSBwdXJwb3NlIGhlcmUKLSAgICAgICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzLgotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE9iamVjdCBnZXRJdGVtKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWItLWRvZXMgbm90IGhhdmUgYW55IHB1cnBvc2UgaGVyZQotICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVmlldyBnZXRWaWV3KGludCBwb3NpdGlvbiwgVmlldyBjb252ZXJ0VmlldywgVmlld0dyb3VwIGNvbnRhaW5lcikgewotICAgICAgICAgICAgVmlldyByb3c7Ci0gICAgICAgICAgICBpZiAobVNpemVUeXBlID09IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LmZ1bGxfc2V0dGluZ3NfbGlzdF9pdGVtKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LmVtYmVkZGVkX3NldHRpbmdzX2xpc3RfaXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBUZXh0VmlldyBtYWluVGV4dFZpZXcgPSAoVGV4dFZpZXcpIHJvdy5maW5kVmlld0J5SWQoUi5pZC5tYWluX3RleHQpOwotICAgICAgICAgICAgVGV4dFZpZXcgc3ViVGV4dFZpZXcgPSAoVGV4dFZpZXcpIHJvdy5maW5kVmlld0J5SWQoUi5pZC5zdWJfdGV4dCk7Ci0gICAgICAgICAgICBJbWFnZVZpZXcgaWNvblZpZXcgPSAoSW1hZ2VWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQuaWNvbik7Ci0KLSAgICAgICAgICAgIC8vIFNldCBtYWluIHRleHQKLSAgICAgICAgICAgIG1haW5UZXh0Vmlldy5zZXRUZXh0KG1NYWluVGV4dHMuZ2V0KHBvc2l0aW9uKSk7Ci0KLSAgICAgICAgICAgIC8vIFJlbW92ZSBzdWIgdGV4dCBhbmQgY2VudGVyIHRoZSBtYWluIHRleHQgaWYgc3ViIHRleHRzIGRvIG5vdCBleGlzdCBhdCBhbGwgb3IgdGhlIHN1YgotICAgICAgICAgICAgLy8gdGV4dCBhdCB0aGlzIHBhcnRpY3VsYXIgcG9zaXRpb24gaXMgZW1wdHkuCi0gICAgICAgICAgICBpZiAobVN1YlRleHRzID09IG51bGwgfHwgbVN1YlRleHRzLmdldChwb3NpdGlvbikgPT0gUkVTT1VSQ0VfRU1QVFkpIHsKLSAgICAgICAgICAgICAgICBzdWJUZXh0Vmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgc2V0IHN1YiB0ZXh0LgotICAgICAgICAgICAgICAgIHN1YlRleHRWaWV3LnNldFRleHQobVN1YlRleHRzLmdldChwb3NpdGlvbikpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBSZW1vdmUgbWFpbiBpY29uIGFuZCBzZXQgdmlzaWJpbGl0eSB0byBnb25lIGlmIGljb25zIGFyZSBzZXQgdG8gbnVsbCBvciB0aGUgaWNvbiBhdAotICAgICAgICAgICAgLy8gdGhpcyBwYXJ0aWN1bGFyIHBvc2l0aW9uIGlzIHNldCB0byBSRVNPVVJDRV9OT05fRVhJU1RFTlQuCi0gICAgICAgICAgICBpZiAobUljb25JZHMgPT0gbnVsbCB8fCBtSWNvbklkcy5nZXQocG9zaXRpb24pID09IFJFU09VUkNFX05PTl9FWElTVEVOVCkgewotICAgICAgICAgICAgICAgIGljb25WaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gT3RoZXJ3aXNlLCBzZXQgbWFpbiBpY29uLgotICAgICAgICAgICAgICAgIGljb25WaWV3LnNldEltYWdlRHJhd2FibGUobVJlc291cmNlcy5nZXREcmF3YWJsZShtSWNvbklkcy5nZXQocG9zaXRpb24pLCBudWxsKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcm93OwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0U3ViVGV4dHMoTGlzdDxTdHJpbmc+IHN1YlRleHRzKSB7Ci0gICAgICAgICAgICBtU3ViVGV4dHMgPSBzdWJUZXh0czsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRPRE86IGV4dGVuZCB0aGlzIGNsYXNzIGZyb20gU2V0dGluZ3NBZGFwdGVyCi0gICAgcHJpdmF0ZSBjbGFzcyBTdWJTZXR0aW5nc0FkYXB0ZXIgZXh0ZW5kcyBCYXNlQWRhcHRlciB7Ci0gICAgICAgIHByaXZhdGUgTGlzdDxTdHJpbmc+IG1UZXh0czsKLSAgICAgICAgcHJpdmF0ZSBpbnQgbUNoZWNrUG9zaXRpb247Ci0KLSAgICAgICAgcHVibGljIFN1YlNldHRpbmdzQWRhcHRlcihMaXN0PFN0cmluZz4gdGV4dHMsIGludCBjaGVja1Bvc2l0aW9uKSB7Ci0gICAgICAgICAgICBtVGV4dHMgPSB0ZXh0czsKLSAgICAgICAgICAgIG1DaGVja1Bvc2l0aW9uID0gY2hlY2tQb3NpdGlvbjsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TWFpblRleHQoaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICBpZiAobVRleHRzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAocG9zaXRpb24gPCBtVGV4dHMuc2l6ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtVGV4dHMuZ2V0KHBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gUkVTT1VSQ0VfRU1QVFk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICAgICAgICAgIHJldHVybiAobVRleHRzID09IG51bGwpID8gMCA6IG1UZXh0cy5zaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGxvbmcgZ2V0SXRlbUlkKGludCBwb3NpdGlvbikgewotICAgICAgICAgICAgLy8gQXV0by1nZW5lcmF0ZWQgbWV0aG9kIHN0dWItLWRvZXMgbm90IGhhdmUgYW55IHB1cnBvc2UgaGVyZQotICAgICAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMuCi0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgT2JqZWN0IGdldEl0ZW0oaW50IHBvc2l0aW9uKSB7Ci0gICAgICAgICAgICAvLyBBdXRvLWdlbmVyYXRlZCBtZXRob2Qgc3R1Yi0tZG9lcyBub3QgaGF2ZSBhbnkgcHVycG9zZSBoZXJlCi0gICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgdGhpcy4KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBWaWV3IGdldFZpZXcoaW50IHBvc2l0aW9uLCBWaWV3IGNvbnZlcnRWaWV3LCBWaWV3R3JvdXAgY29udGFpbmVyKSB7Ci0gICAgICAgICAgICBWaWV3IHJvdzsKLSAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgPT0gU0laRV9UWVBFX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICByb3cgPSBBcGlIZWxwZXIuaW5mbGF0ZUxpYkxheW91dChtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgUi5sYXlvdXQuZnVsbF9zdWJfc2V0dGluZ3NfbGlzdF9pdGVtKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcm93ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFIubGF5b3V0LmVtYmVkZGVkX3N1Yl9zZXR0aW5nc19saXN0X2l0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVGV4dFZpZXcgdGV4dFZpZXcgPSAoVGV4dFZpZXcpIHJvdy5maW5kVmlld0J5SWQoUi5pZC50ZXh0KTsKLSAgICAgICAgICAgIEltYWdlVmlldyBjaGVja1ZpZXcgPSAoSW1hZ2VWaWV3KSByb3cuZmluZFZpZXdCeUlkKFIuaWQuY2hlY2spOwotCi0gICAgICAgICAgICB0ZXh0Vmlldy5zZXRUZXh0KG1UZXh0cy5nZXQocG9zaXRpb24pKTsKLSAgICAgICAgICAgIGlmIChwb3NpdGlvbiAhPSBtQ2hlY2tQb3NpdGlvbikgewotICAgICAgICAgICAgICAgIGNoZWNrVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuSU5WSVNJQkxFKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByb3c7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRUZXh0cyhMaXN0PFN0cmluZz4gdGV4dHMpIHsKLSAgICAgICAgICAgIG1UZXh0cyA9IHRleHRzOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgc2V0Q2hlY2tQb3NpdGlvbihpbnQgY2hlY2tQb3NpdGlvbikgewotICAgICAgICAgICAgbUNoZWNrUG9zaXRpb24gPSBjaGVja1Bvc2l0aW9uOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvU3VidGl0bGVWaWV3LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9TdWJ0aXRsZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdiMmNkMS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9TdWJ0aXRsZVZpZXcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuQ2FudmFzOwotaW1wb3J0IGFuZHJvaWQub3MuTG9vcGVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC53aWRnZXQuRnJhbWVMYXlvdXQ7Ci0KLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5TdWJ0aXRsZUNvbnRyb2xsZXIuQW5jaG9yOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLlN1YnRpdGxlVHJhY2suUmVuZGVyaW5nV2lkZ2V0OwotCi1jbGFzcyBTdWJ0aXRsZVZpZXcgZXh0ZW5kcyBGcmFtZUxheW91dCBpbXBsZW1lbnRzIEFuY2hvciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTdWJ0aXRsZVZpZXciOwotCi0gICAgcHJpdmF0ZSBSZW5kZXJpbmdXaWRnZXQgbVN1YnRpdGxlV2lkZ2V0OwotICAgIHByaXZhdGUgUmVuZGVyaW5nV2lkZ2V0Lk9uQ2hhbmdlZExpc3RlbmVyIG1TdWJ0aXRsZXNDaGFuZ2VkTGlzdGVuZXI7Ci0KLSAgICBwdWJsaWMgU3VidGl0bGVWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdWJ0aXRsZVZpZXcoQ29udGV4dCBjb250ZXh0LCBATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBTdWJ0aXRsZVZpZXcoQ29udGV4dCBjb250ZXh0LCBATnVsbGFibGUgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFN1YnRpdGxlVmlldygKLSAgICAgICAgICAgIENvbnRleHQgY29udGV4dCwgQE51bGxhYmxlIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTdWJ0aXRsZVdpZGdldChSZW5kZXJpbmdXaWRnZXQgc3VidGl0bGVXaWRnZXQpIHsKLSAgICAgICAgaWYgKG1TdWJ0aXRsZVdpZGdldCA9PSBzdWJ0aXRsZVdpZGdldCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgYm9vbGVhbiBhdHRhY2hlZFRvV2luZG93ID0gaXNBdHRhY2hlZFRvV2luZG93KCk7Ci0gICAgICAgIGlmIChtU3VidGl0bGVXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGF0dGFjaGVkVG9XaW5kb3cpIHsKLSAgICAgICAgICAgICAgICBtU3VidGl0bGVXaWRnZXQub25EZXRhY2hlZEZyb21XaW5kb3coKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0LnNldE9uQ2hhbmdlZExpc3RlbmVyKG51bGwpOwotICAgICAgICB9Ci0gICAgICAgIG1TdWJ0aXRsZVdpZGdldCA9IHN1YnRpdGxlV2lkZ2V0OwotCi0gICAgICAgIGlmIChzdWJ0aXRsZVdpZGdldCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAobVN1YnRpdGxlc0NoYW5nZWRMaXN0ZW5lciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlc0NoYW5nZWRMaXN0ZW5lciA9IG5ldyBSZW5kZXJpbmdXaWRnZXQuT25DaGFuZ2VkTGlzdGVuZXIoKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkNoYW5nZWQoUmVuZGVyaW5nV2lkZ2V0IHJlbmRlcmluZ1dpZGdldCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW52YWxpZGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc2V0V2lsbE5vdERyYXcoZmFsc2UpOwotICAgICAgICAgICAgc3VidGl0bGVXaWRnZXQuc2V0T25DaGFuZ2VkTGlzdGVuZXIobVN1YnRpdGxlc0NoYW5nZWRMaXN0ZW5lcik7Ci0KLSAgICAgICAgICAgIGlmIChhdHRhY2hlZFRvV2luZG93KSB7Ci0gICAgICAgICAgICAgICAgc3VidGl0bGVXaWRnZXQub25BdHRhY2hlZFRvV2luZG93KCk7Ci0gICAgICAgICAgICAgICAgcmVxdWVzdExheW91dCgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0V2lsbE5vdERyYXcodHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnZhbGlkYXRlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExvb3BlciBnZXRTdWJ0aXRsZUxvb3BlcigpIHsKLSAgICAgICAgcmV0dXJuIExvb3Blci5nZXRNYWluTG9vcGVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLQotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5vbkF0dGFjaGVkVG9XaW5kb3coKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uRGV0YWNoZWRGcm9tV2luZG93KCkgewotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvdygpOwotCi0gICAgICAgIGlmIChtU3VidGl0bGVXaWRnZXQgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0Lm9uRGV0YWNoZWRGcm9tV2luZG93KCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkxheW91dChib29sZWFuIGNoYW5nZWQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKLSAgICAgICAgc3VwZXIub25MYXlvdXQoY2hhbmdlZCwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKLQotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCB3aWR0aCA9IGdldFdpZHRoKCkgLSBnZXRQYWRkaW5nTGVmdCgpIC0gZ2V0UGFkZGluZ1JpZ2h0KCk7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgaGVpZ2h0ID0gZ2V0SGVpZ2h0KCkgLSBnZXRQYWRkaW5nVG9wKCkgLSBnZXRQYWRkaW5nQm90dG9tKCk7Ci0KLSAgICAgICAgICAgIG1TdWJ0aXRsZVdpZGdldC5zZXRTaXplKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZHJhdyhDYW52YXMgY2FudmFzKSB7Ci0gICAgICAgIHN1cGVyLmRyYXcoY2FudmFzKTsKLQotICAgICAgICBpZiAobVN1YnRpdGxlV2lkZ2V0ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGZpbmFsIGludCBzYXZlQ291bnQgPSBjYW52YXMuc2F2ZSgpOwotICAgICAgICAgICAgY2FudmFzLnRyYW5zbGF0ZShnZXRQYWRkaW5nTGVmdCgpLCBnZXRQYWRkaW5nVG9wKCkpOwotICAgICAgICAgICAgbVN1YnRpdGxlV2lkZ2V0LmRyYXcoY2FudmFzKTsKLSAgICAgICAgICAgIGNhbnZhcy5yZXN0b3JlVG9Db3VudChzYXZlQ291bnQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lKCkgewotICAgICAgICByZXR1cm4gU3VidGl0bGVWaWV3LmNsYXNzLmdldE5hbWUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1N1cmZhY2VWaWV3LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1N1cmZhY2VWaWV3LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjOTJlODUuLjAwMDAwMDAKLS0tIGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9TdXJmYWNlVmlldy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5jb250ZW50LkNvbnRleHQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5SZWN0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlSG9sZGVyOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcyLlZJRVdfVFlQRV9TVVJGQUNFVklFVzsKLQotY2xhc3MgVmlkZW9TdXJmYWNlVmlldyBleHRlbmRzIFN1cmZhY2VWaWV3IGltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlLCBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZGVvU3VyZmFjZVZpZXciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBTVE9QU0hJUDogTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotICAgIHByaXZhdGUgU3VyZmFjZUhvbGRlciBtU3VyZmFjZUhvbGRlciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBTdXJmYWNlTGlzdGVuZXIgbVN1cmZhY2VMaXN0ZW5lciA9IG51bGw7Ci0gICAgcHJpdmF0ZSBNZWRpYVBsYXllcjIgbU1lZGlhUGxheWVyOwotICAgIC8vIEEgZmxhZyB0byBpbmRpY2F0ZSB0YWtpbmcgb3ZlciBvdGhlciB2aWV3IHNob3VsZCBiZSBwcm9jZWVkLgotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNUYWtpbmdPdmVyT2xkVmlldzsKLSAgICBwcml2YXRlIFZpZGVvVmlld0ludGVyZmFjZSBtT2xkVmlldzsKLQotCi0gICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgbnVsbCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvU3VyZmFjZVZpZXcoQ29udGV4dCBjb250ZXh0LCBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIpIHsKLSAgICAgICAgdGhpcyhjb250ZXh0LCBhdHRycywgZGVmU3R5bGVBdHRyLCAwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVmlkZW9TdXJmYWNlVmlldyhDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVmU3R5bGVSZXMpIHsKLSAgICAgICAgc3VwZXIoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgZGVmU3R5bGVSZXMpOwotICAgICAgICBnZXRIb2xkZXIoKS5hZGRDYWxsYmFjayh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gaW1wbGVtZW50cyBWaWRlb1ZpZXdJbnRlcmZhY2UKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoKTogbVN1cmZhY2VIb2xkZXI6ICIgKyBtU3VyZmFjZUhvbGRlcik7Ci0gICAgICAgIGlmIChtcCA9PSBudWxsIHx8ICFoYXNBdmFpbGFibGVTdXJmYWNlKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBtcC5zZXREaXNwbGF5KG1TdXJmYWNlSG9sZGVyKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3VyZmFjZUxpc3RlbmVyKFN1cmZhY2VMaXN0ZW5lciBsKSB7Ci0gICAgICAgIG1TdXJmYWNlTGlzdGVuZXIgPSBsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGUoKSB7Ci0gICAgICAgIHJldHVybiBWSUVXX1RZUEVfU1VSRkFDRVZJRVc7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFQbGF5ZXIoTWVkaWFQbGF5ZXIyIG1wKSB7Ci0gICAgICAgIG1NZWRpYVBsYXllciA9IG1wOwotICAgICAgICBpZiAobUlzVGFraW5nT3Zlck9sZFZpZXcpIHsKLSAgICAgICAgICAgIHRha2VPdmVyKG1PbGRWaWV3KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHRha2VPdmVyKEBOb25OdWxsIFZpZGVvVmlld0ludGVyZmFjZSBvbGRWaWV3KSB7Ci0gICAgICAgIGlmIChhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpKSB7Ci0gICAgICAgICAgICAoKFZpZXcpIG9sZFZpZXcpLnNldFZpc2liaWxpdHkoR09ORSk7Ci0gICAgICAgICAgICBtSXNUYWtpbmdPdmVyT2xkVmlldyA9IGZhbHNlOwotICAgICAgICAgICAgbU9sZFZpZXcgPSBudWxsOwotICAgICAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlVGFrZU92ZXJEb25lKHRoaXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUlzVGFraW5nT3Zlck9sZFZpZXcgPSB0cnVlOwotICAgICAgICAgICAgbU9sZFZpZXcgPSBvbGRWaWV3OwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzQXZhaWxhYmxlU3VyZmFjZSgpIHsKLSAgICAgICAgcmV0dXJuIChtU3VyZmFjZUhvbGRlciAhPSBudWxsICYmIG1TdXJmYWNlSG9sZGVyLmdldFN1cmZhY2UoKSAhPSBudWxsKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gaW1wbGVtZW50cyBTdXJmYWNlSG9sZGVyLkNhbGxiYWNrCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc3VyZmFjZUNyZWF0ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKLSAgICAgICAgTG9nLmQoVEFHLCAic3VyZmFjZUNyZWF0ZWQ6IG1TdXJmYWNlSG9sZGVyOiAiICsgbVN1cmZhY2VIb2xkZXIgKyAiLCBuZXcgaG9sZGVyOiAiICsgaG9sZGVyKTsKLSAgICAgICAgbVN1cmZhY2VIb2xkZXIgPSBob2xkZXI7Ci0gICAgICAgIGlmIChtSXNUYWtpbmdPdmVyT2xkVmlldykgewotICAgICAgICAgICAgdGFrZU92ZXIobU9sZFZpZXcpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIFJlY3QgcmVjdCA9IG1TdXJmYWNlSG9sZGVyLmdldFN1cmZhY2VGcmFtZSgpOwotICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VDcmVhdGVkKHRoaXMsIHJlY3Qud2lkdGgoKSwgcmVjdC5oZWlnaHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzdXJmYWNlQ2hhbmdlZChTdXJmYWNlSG9sZGVyIGhvbGRlciwgaW50IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlQ2hhbmdlZCh0aGlzLCB3aWR0aCwgaGVpZ2h0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHN1cmZhY2VEZXN0cm95ZWQoU3VyZmFjZUhvbGRlciBob2xkZXIpIHsKLSAgICAgICAgLy8gQWZ0ZXIgd2UgcmV0dXJuIGZyb20gdGhpcyB3ZSBjYW4ndCB1c2UgdGhlIHN1cmZhY2UgYW55IG1vcmUKLSAgICAgICAgbVN1cmZhY2VIb2xkZXIgPSBudWxsOwotICAgICAgICBpZiAobVN1cmZhY2VMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZURlc3Ryb3llZCh0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIFRPRE86IEludmVzdGlnYXRlIHRoZSB3YXkgdG8gbW92ZSBvbk1lYXN1cmUoKSBjb2RlIGludG8gRnJhbWVMYXlvdXQuCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgaW50IHZpZGVvV2lkdGggPSAobU1lZGlhUGxheWVyID09IG51bGwpID8gMCA6IG1NZWRpYVBsYXllci5nZXRWaWRlb1dpZHRoKCk7Ci0gICAgICAgIGludCB2aWRlb0hlaWdodCA9IChtTWVkaWFQbGF5ZXIgPT0gbnVsbCkgPyAwIDogbU1lZGlhUGxheWVyLmdldFZpZGVvSGVpZ2h0KCk7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25NZWFzdXJlKCIgKyBNZWFzdXJlU3BlYy50b1N0cmluZyh3aWR0aE1lYXN1cmVTcGVjKSArICIsICIKLSAgICAgICAgICAgICAgICAgICAgKyBNZWFzdXJlU3BlYy50b1N0cmluZyhoZWlnaHRNZWFzdXJlU3BlYykgKyAiKSIpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIHZpZXdTaXplOiAiICsgZ2V0V2lkdGgoKSArICIvIiArIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtVmlkZW9XaWR0aC9oZWlnaHQ6ICIgKyB2aWRlb1dpZHRoICsgIiwgIiArIHZpZGVvSGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB3aWR0aCA9IGdldERlZmF1bHRTaXplKHZpZGVvV2lkdGgsIHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICBpbnQgaGVpZ2h0ID0gZ2V0RGVmYXVsdFNpemUodmlkZW9IZWlnaHQsIGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICBpZiAodmlkZW9XaWR0aCA+IDAgJiYgdmlkZW9IZWlnaHQgPiAwKSB7Ci0gICAgICAgICAgICBpbnQgd2lkdGhTcGVjU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0U3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICAgICAgd2lkdGggPSB3aWR0aFNwZWNTaXplOwotICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0U3BlY1NpemU7Ci0KLSAgICAgICAgICAgIC8vIGZvciBjb21wYXRpYmlsaXR5LCB3ZSBhZGp1c3Qgc2l6ZSBiYXNlZCBvbiBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0IDwgd2lkdGggKiB2aWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgIHdpZHRoID0gaGVpZ2h0ICogdmlkZW9XaWR0aCAvIHZpZGVvSGVpZ2h0OwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gd2lkZSwgY29ycmVjdGluZy4gd2lkdGg6ICIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0ID4gd2lkdGggKiB2aWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgIGhlaWdodCA9IHdpZHRoICogdmlkZW9IZWlnaHQgLyB2aWRlb1dpZHRoOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gdGFsbCwgY29ycmVjdGluZy4gaGVpZ2h0OiAiICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBubyBzaXplIHlldCwganVzdCBhZG9wdCB0aGUgZ2l2ZW4gc3BlYyBzaXplcwotICAgICAgICB9Ci0gICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgImVuZCBvZiBvbk1lYXN1cmUoKSIpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJWaWV3VHlwZTogU3VyZmFjZVZpZXcgLyBWaXNpYmlsaXR5OiAiICsgZ2V0VmlzaWJpbGl0eSgpCi0gICAgICAgICAgICAgICAgKyAiIC8gc3VyZmFjZUhvbGRlcjogIiArIG1TdXJmYWNlSG9sZGVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVGV4dHVyZVZpZXcuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZGVvVGV4dHVyZVZpZXcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDI0YTNhYS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1RleHR1cmVWaWV3LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLlN1cmZhY2VUZXh0dXJlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5zdXBwb3J0LmFubm90YXRpb24uUmVxdWlyZXNBcGk7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkF0dHJpYnV0ZVNldDsKLWltcG9ydCBhbmRyb2lkLnV0aWwuTG9nOwotaW1wb3J0IGFuZHJvaWQudmlldy5TdXJmYWNlOwotaW1wb3J0IGFuZHJvaWQudmlldy5UZXh0dXJlVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLQotaW1wb3J0IHN0YXRpYyBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcyLlZJRVdfVFlQRV9URVhUVVJFVklFVzsKLQotQFJlcXVpcmVzQXBpKDI2KQotY2xhc3MgVmlkZW9UZXh0dXJlVmlldyBleHRlbmRzIFRleHR1cmVWaWV3Ci0gICAgICAgIGltcGxlbWVudHMgVmlkZW9WaWV3SW50ZXJmYWNlLCBUZXh0dXJlVmlldy5TdXJmYWNlVGV4dHVyZUxpc3RlbmVyIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVEFHID0gIlZpZGVvVGV4dHVyZVZpZXciOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gREVCVUcgPSB0cnVlOyAvLyBTVE9QU0hJUDogTG9nLmlzTG9nZ2FibGUoVEFHLCBMb2cuREVCVUcpOwotCi0gICAgcHJpdmF0ZSBTdXJmYWNlVGV4dHVyZSBtU3VyZmFjZVRleHR1cmU7Ci0gICAgcHJpdmF0ZSBTdXJmYWNlIG1TdXJmYWNlOwotICAgIHByaXZhdGUgU3VyZmFjZUxpc3RlbmVyIG1TdXJmYWNlTGlzdGVuZXI7Ci0gICAgcHJpdmF0ZSBNZWRpYVBsYXllcjIgbU1lZGlhUGxheWVyOwotICAgIC8vIEEgZmxhZyB0byBpbmRpY2F0ZSB0YWtpbmcgb3ZlciBvdGhlciB2aWV3IHNob3VsZCBiZSBwcm9jZWVkLgotICAgIHByaXZhdGUgYm9vbGVhbiBtSXNUYWtpbmdPdmVyT2xkVmlldzsKLSAgICBwcml2YXRlIFZpZGVvVmlld0ludGVyZmFjZSBtT2xkVmlldzsKLQotICAgIHB1YmxpYyBWaWRlb1RleHR1cmVWaWV3KENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzKGNvbnRleHQsIG51bGwpOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1RleHR1cmVWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIDApOwotICAgIH0KLQotICAgIHB1YmxpYyBWaWRlb1RleHR1cmVWaWV3KENvbnRleHQgY29udGV4dCwgQXR0cmlidXRlU2V0IGF0dHJzLCBpbnQgZGVmU3R5bGVBdHRyKSB7Ci0gICAgICAgIHRoaXMoY29udGV4dCwgYXR0cnMsIGRlZlN0eWxlQXR0ciwgMCk7Ci0gICAgfQotCi0gICAgcHVibGljIFZpZGVvVGV4dHVyZVZpZXcoCi0gICAgICAgICAgICBDb250ZXh0IGNvbnRleHQsIEF0dHJpYnV0ZVNldCBhdHRycywgaW50IGRlZlN0eWxlQXR0ciwgaW50IGRlZlN0eWxlUmVzKSB7Ci0gICAgICAgIHN1cGVyKGNvbnRleHQsIGF0dHJzLCBkZWZTdHlsZUF0dHIsIGRlZlN0eWxlUmVzKTsKLSAgICAgICAgc2V0U3VyZmFjZVRleHR1cmVMaXN0ZW5lcih0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gaW1wbGVtZW50cyBWaWRlb1ZpZXdJbnRlcmZhY2UKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApIHsKLSAgICAgICAgTG9nLmQoVEFHLCAiYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIoKTogbVN1cmZhY2VUZXh0dXJlOiAiICsgbVN1cmZhY2VUZXh0dXJlKTsKLSAgICAgICAgaWYgKG1wID09IG51bGwgfHwgIWhhc0F2YWlsYWJsZVN1cmZhY2UoKSkgewotICAgICAgICAgICAgLy8gU3VyZmFjZSBpcyBub3QgcmVhZHkuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgbXAuc2V0U3VyZmFjZShtU3VyZmFjZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldFN1cmZhY2VMaXN0ZW5lcihTdXJmYWNlTGlzdGVuZXIgbCkgewotICAgICAgICBtU3VyZmFjZUxpc3RlbmVyID0gbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFZpZXdUeXBlKCkgewotICAgICAgICByZXR1cm4gVklFV19UWVBFX1RFWFRVUkVWSUVXOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhUGxheWVyKE1lZGlhUGxheWVyMiBtcCkgewotICAgICAgICBtTWVkaWFQbGF5ZXIgPSBtcDsKLSAgICAgICAgaWYgKG1Jc1Rha2luZ092ZXJPbGRWaWV3KSB7Ci0gICAgICAgICAgICB0YWtlT3ZlcihtT2xkVmlldyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB0YWtlT3ZlcihATm9uTnVsbCBWaWRlb1ZpZXdJbnRlcmZhY2Ugb2xkVmlldykgewotICAgICAgICBpZiAoYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKSkgewotICAgICAgICAgICAgKChWaWV3KSBvbGRWaWV3KS5zZXRWaXNpYmlsaXR5KEdPTkUpOwotICAgICAgICAgICAgbUlzVGFraW5nT3Zlck9sZFZpZXcgPSBmYWxzZTsKLSAgICAgICAgICAgIG1PbGRWaWV3ID0gbnVsbDsKLSAgICAgICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtU3VyZmFjZUxpc3RlbmVyLm9uU3VyZmFjZVRha2VPdmVyRG9uZSh0aGlzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1Jc1Rha2luZ092ZXJPbGRWaWV3ID0gdHJ1ZTsKLSAgICAgICAgICAgIG1PbGRWaWV3ID0gb2xkVmlldzsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc0F2YWlsYWJsZVN1cmZhY2UoKSB7Ci0gICAgICAgIHJldHVybiAobVN1cmZhY2VUZXh0dXJlICE9IG51bGwgJiYgIW1TdXJmYWNlVGV4dHVyZS5pc1JlbGVhc2VkKCkgJiYgbVN1cmZhY2UgIT0gbnVsbCk7Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIGltcGxlbWVudHMgVGV4dHVyZVZpZXcuU3VyZmFjZVRleHR1cmVMaXN0ZW5lcgotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVBdmFpbGFibGUoU3VyZmFjZVRleHR1cmUgc3VyZmFjZVRleHR1cmUsIGludCB3aWR0aCwgaW50IGhlaWdodCkgewotICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VUZXh0dXJlQXZhaWxhYmxlOiBtU3VyZmFjZVRleHR1cmU6ICIgKyBtU3VyZmFjZVRleHR1cmUKLSAgICAgICAgICAgICAgICArICIsIG5ldyBzdXJmYWNlOiAiICsgc3VyZmFjZVRleHR1cmUpOwotICAgICAgICBtU3VyZmFjZVRleHR1cmUgPSBzdXJmYWNlVGV4dHVyZTsKLSAgICAgICAgbVN1cmZhY2UgPSBuZXcgU3VyZmFjZShtU3VyZmFjZVRleHR1cmUpOwotICAgICAgICBpZiAobUlzVGFraW5nT3Zlck9sZFZpZXcpIHsKLSAgICAgICAgICAgIHRha2VPdmVyKG1PbGRWaWV3KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGFzc2lnblN1cmZhY2VUb01lZGlhUGxheWVyKG1NZWRpYVBsYXllcik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VDcmVhdGVkKHRoaXMsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlVGV4dHVyZVNpemVDaGFuZ2VkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2VUZXh0dXJlLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgaWYgKG1TdXJmYWNlTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VDaGFuZ2VkKHRoaXMsIHdpZHRoLCBoZWlnaHQpOwotICAgICAgICB9Ci0gICAgICAgIC8vIHJlcXVlc3RMYXlvdXQoKTsgIC8vIFRPRE86IGZpZ3VyZSBvdXQgaWYgaXQgc2hvdWxkIGJlIGNhbGxlZCBoZXJlPwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZVRleHR1cmVVcGRhdGVkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2UpIHsKLSAgICAgICAgLy8gbm8tb3AKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblN1cmZhY2VUZXh0dXJlRGVzdHJveWVkKFN1cmZhY2VUZXh0dXJlIHN1cmZhY2VUZXh0dXJlKSB7Ci0gICAgICAgIGlmIChtU3VyZmFjZUxpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1TdXJmYWNlTGlzdGVuZXIub25TdXJmYWNlRGVzdHJveWVkKHRoaXMpOwotICAgICAgICB9Ci0gICAgICAgIG1TdXJmYWNlVGV4dHVyZSA9IG51bGw7Ci0gICAgICAgIG1TdXJmYWNlID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgb25NZWFzdXJlKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgaW50IHZpZGVvV2lkdGggPSAobU1lZGlhUGxheWVyID09IG51bGwpID8gMCA6IG1NZWRpYVBsYXllci5nZXRWaWRlb1dpZHRoKCk7Ci0gICAgICAgIGludCB2aWRlb0hlaWdodCA9IChtTWVkaWFQbGF5ZXIgPT0gbnVsbCkgPyAwIDogbU1lZGlhUGxheWVyLmdldFZpZGVvSGVpZ2h0KCk7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25NZWFzdXJlKCIgKyBNZWFzdXJlU3BlYy50b1N0cmluZyh3aWR0aE1lYXN1cmVTcGVjKSArICIsICIKLSAgICAgICAgICAgICAgICAgICAgKyBNZWFzdXJlU3BlYy50b1N0cmluZyhoZWlnaHRNZWFzdXJlU3BlYykgKyAiKSIpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIHZpZXdTaXplOiAiICsgZ2V0V2lkdGgoKSArICIvIiArIGdldEhlaWdodCgpKTsKLSAgICAgICAgICAgIExvZy5pKFRBRywgIiBtVmlkZW9XaWR0aC9oZWlnaHQ6ICIgKyB2aWRlb1dpZHRoICsgIiwgIiArIHZpZGVvSGVpZ2h0KTsKLSAgICAgICAgfQotCi0gICAgICAgIGludCB3aWR0aCA9IGdldERlZmF1bHRTaXplKHZpZGVvV2lkdGgsIHdpZHRoTWVhc3VyZVNwZWMpOwotICAgICAgICBpbnQgaGVpZ2h0ID0gZ2V0RGVmYXVsdFNpemUodmlkZW9IZWlnaHQsIGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICBpZiAodmlkZW9XaWR0aCA+IDAgJiYgdmlkZW9IZWlnaHQgPiAwKSB7Ci0gICAgICAgICAgICBpbnQgd2lkdGhTcGVjU2l6ZSA9IE1lYXN1cmVTcGVjLmdldFNpemUod2lkdGhNZWFzdXJlU3BlYyk7Ci0gICAgICAgICAgICBpbnQgaGVpZ2h0U3BlY1NpemUgPSBNZWFzdXJlU3BlYy5nZXRTaXplKGhlaWdodE1lYXN1cmVTcGVjKTsKLQotICAgICAgICAgICAgd2lkdGggPSB3aWR0aFNwZWNTaXplOwotICAgICAgICAgICAgaGVpZ2h0ID0gaGVpZ2h0U3BlY1NpemU7Ci0KLSAgICAgICAgICAgIC8vIGZvciBjb21wYXRpYmlsaXR5LCB3ZSBhZGp1c3Qgc2l6ZSBiYXNlZCBvbiBhc3BlY3QgcmF0aW8KLSAgICAgICAgICAgIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0IDwgd2lkdGggKiB2aWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgIHdpZHRoID0gaGVpZ2h0ICogdmlkZW9XaWR0aCAvIHZpZGVvSGVpZ2h0OwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gd2lkZSwgY29ycmVjdGluZy4gd2lkdGg6ICIgKyB3aWR0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlb1dpZHRoICogaGVpZ2h0ID4gd2lkdGggKiB2aWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgIGhlaWdodCA9IHdpZHRoICogdmlkZW9IZWlnaHQgLyB2aWRlb1dpZHRoOwotICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJpbWFnZSB0b28gdGFsbCwgY29ycmVjdGluZy4gaGVpZ2h0OiAiICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBubyBzaXplIHlldCwganVzdCBhZG9wdCB0aGUgZ2l2ZW4gc3BlYyBzaXplcwotICAgICAgICB9Ci0gICAgICAgIHNldE1lYXN1cmVkRGltZW5zaW9uKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5pKFRBRywgImVuZCBvZiBvbk1lYXN1cmUoKSIpOwotICAgICAgICAgICAgTG9nLmkoVEFHLCAiIG1lYXN1cmVkU2l6ZTogIiArIGdldE1lYXN1cmVkV2lkdGgoKSArICIvIiArIGdldE1lYXN1cmVkSGVpZ2h0KCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuICJWaWV3VHlwZTogVGV4dHVyZVZpZXcgLyBWaXNpYmlsaXR5OiAiICsgZ2V0VmlzaWJpbGl0eSgpCi0gICAgICAgICAgICAgICAgKyAiIC8gc3VyZmFjZVRleHR1cmU6ICIgKyBtU3VyZmFjZVRleHR1cmU7Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXcySW1wbC5qYXZhIGIvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3MkltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTcyNzlkNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXcySW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQwNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIGNvbS5hbmRyb2lkLndpZGdldDsKLQotaW1wb3J0IGFuZHJvaWQuY29udGVudC5Db250ZXh0OwotaW1wb3J0IGFuZHJvaWQuY29udGVudC5wbS5BY3Rpdml0eUluZm87Ci1pbXBvcnQgYW5kcm9pZC5jb250ZW50LnJlcy5SZXNvdXJjZXM7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXA7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5CaXRtYXBGYWN0b3J5OwotaW1wb3J0IGFuZHJvaWQuZ3JhcGhpY3MuUG9pbnQ7Ci1pbXBvcnQgYW5kcm9pZC5ncmFwaGljcy5kcmF3YWJsZS5CaXRtYXBEcmF3YWJsZTsKLWltcG9ydCBhbmRyb2lkLmdyYXBoaWNzLmRyYXdhYmxlLkRyYXdhYmxlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9BdHRyaWJ1dGVzOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuQXVkaW9Gb2N1c1JlcXVlc3Q7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5BdWRpb01hbmFnZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5EYXRhU291cmNlRGVzYzsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGE7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjIuTWVkaWFQbGF5ZXIyRXZlbnRDYWxsYmFjazsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhUGxheWVyMi5PblN1YnRpdGxlRGF0YUxpc3RlbmVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXIySW1wbDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlN1YnRpdGxlRGF0YTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhSXRlbTI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYU1ldGFkYXRhMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGFSZXRyaWV2ZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZXRhZGF0YTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlBsYXliYWNrUGFyYW1zOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuVGltZWRUZXh0OwotaW1wb3J0IGFuZHJvaWQubWVkaWEuc2Vzc2lvbi5NZWRpYUNvbnRyb2xsZXI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhQ29udHJvbGxlci5QbGF5YmFja0luZm87Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5zZXNzaW9uLk1lZGlhU2Vzc2lvbjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLnNlc3Npb24uUGxheWJhY2tTdGF0ZTsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLlNlc3Npb25Ub2tlbjI7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS51cGRhdGUuVmlkZW9WaWV3MlByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEudXBkYXRlLlZpZXdHcm91cFByb3ZpZGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkFzeW5jVGFzazsKLWltcG9ydCBhbmRyb2lkLm9zLkJ1bmRsZTsKLWltcG9ydCBhbmRyb2lkLm9zLlJlc3VsdFJlY2VpdmVyOwotaW1wb3J0IGFuZHJvaWQuc3VwcG9ydC5hbm5vdGF0aW9uLk51bGxhYmxlOwotaW1wb3J0IGFuZHJvaWQudXRpbC5BdHRyaWJ1dGVTZXQ7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLkRpc3BsYXlNZXRyaWNzOwotaW1wb3J0IGFuZHJvaWQudXRpbC5Mb2c7Ci1pbXBvcnQgYW5kcm9pZC51dGlsLlBhaXI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3Lk1vdGlvbkV2ZW50OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3OwotaW1wb3J0IGFuZHJvaWQudmlldy5WaWV3R3JvdXAuTGF5b3V0UGFyYW1zOwotaW1wb3J0IGFuZHJvaWQudmlldy5XaW5kb3dNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQudmlldy5hY2Nlc3NpYmlsaXR5LkFjY2Vzc2liaWxpdHlNYW5hZ2VyOwotaW1wb3J0IGFuZHJvaWQud2lkZ2V0LkltYWdlVmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5NZWRpYUNvbnRyb2xWaWV3MjsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5UZXh0VmlldzsKLWltcG9ydCBhbmRyb2lkLndpZGdldC5WaWRlb1ZpZXcyOwotCi1pbXBvcnQgY29tLmFuZHJvaWQuaW50ZXJuYWwuZ3JhcGhpY3MucGFsZXR0ZS5QYWxldHRlOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLlJvdXRlUGxheWVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnN1YnRpdGxlLkNsb3NlZENhcHRpb25SZW5kZXJlcjsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS5zdWJ0aXRsZS5TdWJ0aXRsZUNvbnRyb2xsZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQubWVkaWEuc3VidGl0bGUuU3VidGl0bGVUcmFjazsKLWltcG9ydCBjb20uYW5kcm9pZC5tZWRpYS51cGRhdGUuQXBpSGVscGVyOwotaW1wb3J0IGNvbS5hbmRyb2lkLm1lZGlhLnVwZGF0ZS5SOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFJdGVtU3RhdHVzOwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFDb250cm9sSW50ZW50OwotaW1wb3J0IGNvbS5hbmRyb2lkLnN1cHBvcnQubWVkaWFyb3V0ZXIubWVkaWEuTWVkaWFSb3V0ZXI7Ci1pbXBvcnQgY29tLmFuZHJvaWQuc3VwcG9ydC5tZWRpYXJvdXRlci5tZWRpYS5NZWRpYVJvdXRlU2VsZWN0b3I7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLXB1YmxpYyBjbGFzcyBWaWRlb1ZpZXcySW1wbCBleHRlbmRzIEJhc2VMYXlvdXQKLSAgICAgICAgaW1wbGVtZW50cyBWaWRlb1ZpZXcyUHJvdmlkZXIsIFZpZGVvVmlld0ludGVyZmFjZS5TdXJmYWNlTGlzdGVuZXIgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBUQUcgPSAiVmlkZW9WaWV3MiI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBERUJVRyA9IHRydWU7IC8vIFNUT1BTSElQOiBMb2cuaXNMb2dnYWJsZShUQUcsIExvZy5ERUJVRyk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBERUZBVUxUX1NIT1dfQ09OVFJPTExFUl9JTlRFUlZBTF9NUyA9IDIwMDA7Ci0KLSAgICBwcml2YXRlIGZpbmFsIFZpZGVvVmlldzIgbUluc3RhbmNlOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0VSUk9SID0gLTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX0lETEUgPSAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QUkVQQVJJTkcgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QUkVQQVJFRCA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFNUQVRFX1BMQVlJTkcgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QQVVTRUQgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBTVEFURV9QTEFZQkFDS19DT01QTEVURUQgPSA1OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfVFJBQ0tfSU5ERVggPSAtMTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBmbG9hdCBJTlZBTElEX1NQRUVEID0gMGY7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0VNQkVEREVEID0gMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX0ZVTEwgPSAxOwotICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBNaW5pbWFsIHNpemUgdHlwZS4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0laRV9UWVBFX01JTklNQUwgPSAyOwotCi0gICAgcHJpdmF0ZSBBY2Nlc3NpYmlsaXR5TWFuYWdlciBtQWNjZXNzaWJpbGl0eU1hbmFnZXI7Ci0gICAgcHJpdmF0ZSBBdWRpb01hbmFnZXIgbUF1ZGlvTWFuYWdlcjsKLSAgICBwcml2YXRlIEF1ZGlvQXR0cmlidXRlcyBtQXVkaW9BdHRyaWJ1dGVzOwotICAgIHByaXZhdGUgaW50IG1BdWRpb0ZvY3VzVHlwZSA9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU47IC8vIGxlZ2FjeSBmb2N1cyBnYWluCi0KLSAgICBwcml2YXRlIFBhaXI8RXhlY3V0b3IsIFZpZGVvVmlldzIuT25DdXN0b21BY3Rpb25MaXN0ZW5lcj4gbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkOwotICAgIHByaXZhdGUgVmlkZW9WaWV3Mi5PblZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyIG1WaWV3VHlwZUNoYW5nZWRMaXN0ZW5lcjsKLSAgICBwcml2YXRlIFZpZGVvVmlldzIuT25GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyIG1GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyOwotCi0gICAgcHJpdmF0ZSBWaWRlb1ZpZXdJbnRlcmZhY2UgbUN1cnJlbnRWaWV3OwotICAgIHByaXZhdGUgVmlkZW9UZXh0dXJlVmlldyBtVGV4dHVyZVZpZXc7Ci0gICAgcHJpdmF0ZSBWaWRlb1N1cmZhY2VWaWV3IG1TdXJmYWNlVmlldzsKLQotICAgIHByaXZhdGUgTWVkaWFQbGF5ZXIyIG1NZWRpYVBsYXllcjsKLSAgICBwcml2YXRlIERhdGFTb3VyY2VEZXNjIG1Ec2Q7Ci0gICAgcHJpdmF0ZSBNZWRpYUNvbnRyb2xWaWV3MiBtTWVkaWFDb250cm9sVmlldzsKLSAgICBwcml2YXRlIE1lZGlhU2Vzc2lvbiBtTWVkaWFTZXNzaW9uOwotICAgIHByaXZhdGUgTWVkaWFDb250cm9sbGVyIG1NZWRpYUNvbnRyb2xsZXI7Ci0gICAgcHJpdmF0ZSBNZXRhZGF0YSBtTWV0YWRhdGE7Ci0gICAgcHJpdmF0ZSBNZWRpYU1ldGFkYXRhMiBtTWVkaWFNZXRhZGF0YTsKLSAgICBwcml2YXRlIE1lZGlhTWV0YWRhdGFSZXRyaWV2ZXIgbVJldHJpZXZlcjsKLSAgICBwcml2YXRlIGJvb2xlYW4gbU5lZWRVcGRhdGVNZWRpYVR5cGU7Ci0gICAgcHJpdmF0ZSBCdW5kbGUgbU1lZGlhVHlwZURhdGE7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbVRpdGxlOwotCi0gICAgLy8gVE9ETzogbW92ZSBtdXNpYyB2aWV3IGluc2lkZSBTdXJmYWNlVmlldy9UZXh0dXJlVmlldyBvciBpbXBsZW1lbnQgVmlkZW9WaWV3SW50ZXJmYWNlLgotICAgIHByaXZhdGUgV2luZG93TWFuYWdlciBtTWFuYWdlcjsKLSAgICBwcml2YXRlIFJlc291cmNlcyBtUmVzb3VyY2VzOwotICAgIHByaXZhdGUgVmlldyBtTXVzaWNWaWV3OwotICAgIHByaXZhdGUgRHJhd2FibGUgbU11c2ljQWxidW1EcmF3YWJsZTsKLSAgICBwcml2YXRlIFN0cmluZyBtTXVzaWNUaXRsZVRleHQ7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgbU11c2ljQXJ0aXN0VGV4dDsKLSAgICBwcml2YXRlIGJvb2xlYW4gbUlzTXVzaWNNZWRpYVR5cGU7Ci0gICAgcHJpdmF0ZSBpbnQgbVByZXZXaWR0aDsKLSAgICBwcml2YXRlIGludCBtUHJldkhlaWdodDsKLSAgICBwcml2YXRlIGludCBtRG9taW5hbnRDb2xvcjsKLSAgICBwcml2YXRlIGludCBtU2l6ZVR5cGU7Ci0KLSAgICBwcml2YXRlIFBsYXliYWNrU3RhdGUuQnVpbGRlciBtU3RhdGVCdWlsZGVyOwotICAgIHByaXZhdGUgTGlzdDxQbGF5YmFja1N0YXRlLkN1c3RvbUFjdGlvbj4gbUN1c3RvbUFjdGlvbkxpc3Q7Ci0gICAgcHJpdmF0ZSBpbnQgbVRhcmdldFN0YXRlID0gU1RBVEVfSURMRTsKLSAgICBwcml2YXRlIGludCBtQ3VycmVudFN0YXRlID0gU1RBVEVfSURMRTsKLSAgICBwcml2YXRlIGludCBtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2U7Ci0gICAgcHJpdmF0ZSBsb25nIG1TZWVrV2hlblByZXBhcmVkOyAgLy8gcmVjb3JkaW5nIHRoZSBzZWVrIHBvc2l0aW9uIHdoaWxlIHByZXBhcmluZwotCi0gICAgcHJpdmF0ZSBpbnQgbVZpZGVvV2lkdGg7Ci0gICAgcHJpdmF0ZSBpbnQgbVZpZGVvSGVpZ2h0OwotCi0gICAgcHJpdmF0ZSBBcnJheUxpc3Q8SW50ZWdlcj4gbVZpZGVvVHJhY2tJbmRpY2VzOwotICAgIHByaXZhdGUgQXJyYXlMaXN0PEludGVnZXI+IG1BdWRpb1RyYWNrSW5kaWNlczsKLSAgICBwcml2YXRlIEFycmF5TGlzdDxQYWlyPEludGVnZXIsIFN1YnRpdGxlVHJhY2s+PiBtU3VidGl0bGVUcmFja0luZGljZXM7Ci0gICAgcHJpdmF0ZSBTdWJ0aXRsZUNvbnRyb2xsZXIgbVN1YnRpdGxlQ29udHJvbGxlcjsKLQotICAgIC8vIHNlbGVjdGVkIHZpZGVvL2F1ZGlvL3N1YnRpdGxlIHRyYWNrIGluZGV4IGFzIE1lZGlhUGxheWVyMiByZXR1cm5zCi0gICAgcHJpdmF0ZSBpbnQgbVNlbGVjdGVkVmlkZW9UcmFja0luZGV4OwotICAgIHByaXZhdGUgaW50IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleDsKLSAgICBwcml2YXRlIGludCBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXg7Ci0KLSAgICBwcml2YXRlIFN1YnRpdGxlVmlldyBtU3VidGl0bGVWaWV3OwotICAgIHByaXZhdGUgYm9vbGVhbiBtU3VidGl0bGVFbmFibGVkOwotCi0gICAgcHJpdmF0ZSBmbG9hdCBtU3BlZWQ7Ci0gICAgLy8gVE9ETzogUmVtb3ZlIG1GYWxsYmFja1NwZWVkIHdoZW4gaW50ZWdyYXRpb24gd2l0aCBNZWRpYVBsYXllcjIncyBuZXcgc2V0UGxheWJhY2tQYXJhbXMoKS4KLSAgICAvLyBSZWZlcjogaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xbnpBZm5zNmkyaEozUmthVXJlM1FNVDZ3c0RlZEo1T05MaUFfT09CRkZYOC9lZGl0Ci0gICAgcHJpdmF0ZSBmbG9hdCBtRmFsbGJhY2tTcGVlZDsgIC8vIGtlZXAgdGhlIG9yaWdpbmFsIHNwZWVkIGJlZm9yZSAncGF1c2UnIGlzIGNhbGxlZC4KLSAgICBwcml2YXRlIGZsb2F0IG1Wb2x1bWVMZXZlbEZsb2F0OwotICAgIHByaXZhdGUgaW50IG1Wb2x1bWVMZXZlbDsKLQotICAgIHByaXZhdGUgbG9uZyBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zOwotCi0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlciBtTWVkaWFSb3V0ZXI7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlU2VsZWN0b3IgbVJvdXRlU2VsZWN0b3I7Ci0gICAgcHJpdmF0ZSBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gbVJvdXRlOwotICAgIHByaXZhdGUgUm91dGVQbGF5ZXIgbVJvdXRlUGxheWVyOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBNZWRpYVJvdXRlci5DYWxsYmFjayBtUm91dGVyQ2FsbGJhY2sgPSBuZXcgTWVkaWFSb3V0ZXIuQ2FsbGJhY2soKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblJvdXRlU2VsZWN0ZWQoTWVkaWFSb3V0ZXIgcm91dGVyLCBNZWRpYVJvdXRlci5Sb3V0ZUluZm8gcm91dGUpIHsKLSAgICAgICAgICAgIGlmIChyb3V0ZS5zdXBwb3J0c0NvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfUkVNT1RFX1BMQVlCQUNLKSkgewotICAgICAgICAgICAgICAgIC8vIFN0b3AgbG9jYWwgcGxheWJhY2sgKGlmIG5lY2Vzc2FyeSkKLSAgICAgICAgICAgICAgICByZXNldFBsYXllcigpOwotICAgICAgICAgICAgICAgIG1Sb3V0ZSA9IHJvdXRlOwotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllciA9IG5ldyBSb3V0ZVBsYXllcihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCByb3V0ZSk7Ci0gICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLnNldFBsYXllckV2ZW50Q2FsbGJhY2sobmV3IFJvdXRlUGxheWVyLlBsYXllckV2ZW50Q2FsbGJhY2soKSB7Ci0gICAgICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvblBsYXllclN0YXRlQ2hhbmdlZChNZWRpYUl0ZW1TdGF0dXMgaXRlbVN0YXR1cykgewotICAgICAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tTdGF0ZS5CdWlsZGVyIHBzQnVpbGRlciA9IG5ldyBQbGF5YmFja1N0YXRlLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRBY3Rpb25zKFJvdXRlUGxheWVyLlBMQVlCQUNLX0FDVElPTlMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBwb3NpdGlvbiA9IGl0ZW1TdGF0dXMuZ2V0Q29udGVudFBvc2l0aW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGl0ZW1TdGF0dXMuZ2V0UGxheWJhY2tTdGF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfUEVORElORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfTk9ORSwgcG9zaXRpb24sIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfSURMRTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfUExBWUlORzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHNCdWlsZGVyLnNldFN0YXRlKFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORywgcG9zaXRpb24sIDEpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0U3RhdGUoUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQsIHBvc2l0aW9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BBVVNFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfQlVGRkVSSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwc0J1aWxkZXIuc2V0U3RhdGUoUGxheWJhY2tTdGF0ZS5TVEFURV9CVUZGRVJJTkcsIHBvc2l0aW9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BBVVNFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUl0ZW1TdGF0dXMuUExBWUJBQ0tfU1RBVEVfRklOSVNIRUQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBzQnVpbGRlci5zZXRTdGF0ZShQbGF5YmFja1N0YXRlLlNUQVRFX1NUT1BQRUQsIHBvc2l0aW9uLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlCQUNLX0NPTVBMRVRFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUgcGJTdGF0ZSA9IHBzQnVpbGRlci5idWlsZCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRQbGF5YmFja1N0YXRlKHBiU3RhdGUpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIgbW1CdWlsZGVyID0gbmV3IE1lZGlhTWV0YWRhdGEuQnVpbGRlcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgbW1CdWlsZGVyLnB1dExvbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfRFVSQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW1TdGF0dXMuZ2V0Q29udGVudER1cmF0aW9uKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRNZXRhZGF0YShtbUJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgICAgICAgICAvLyBTdGFydCByZW1vdGUgcGxheWJhY2sgKGlmIG5lY2Vzc2FyeSkKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub3BlblZpZGVvKG1Ec2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUm91dGVVbnNlbGVjdGVkKE1lZGlhUm91dGVyIHJvdXRlciwgTWVkaWFSb3V0ZXIuUm91dGVJbmZvIHJvdXRlLCBpbnQgcmVhc29uKSB7Ci0gICAgICAgICAgICBpZiAobVJvdXRlICE9IG51bGwgJiYgbVJvdXRlUGxheWVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIucmVsZWFzZSgpOwotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllciA9IG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobVJvdXRlID09IHJvdXRlKSB7Ci0gICAgICAgICAgICAgICAgbVJvdXRlID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChyZWFzb24gIT0gTWVkaWFSb3V0ZXIuVU5TRUxFQ1RfUkVBU09OX1JPVVRFX0NIQU5HRUQpIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBSZXN1bWUgbG9jYWwgcGxheWJhY2sgIChpZiBuZWNlc3NhcnkpCi0gICAgICAgICAgICAgICAgb3BlblZpZGVvKG1Ec2QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHB1YmxpYyBWaWRlb1ZpZXcySW1wbChWaWRlb1ZpZXcyIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyKSB7Ci0gICAgICAgIHN1cGVyKGluc3RhbmNlLCBzdXBlclByb3ZpZGVyLCBwcml2YXRlUHJvdmlkZXIpOwotICAgICAgICBtSW5zdGFuY2UgPSBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBpbml0aWFsaXplKEBOdWxsYWJsZSBBdHRyaWJ1dGVTZXQgYXR0cnMsIGludCBkZWZTdHlsZUF0dHIsIGludCBkZWZTdHlsZVJlcykgewotICAgICAgICBtVmlkZW9XaWR0aCA9IDA7Ci0gICAgICAgIG1WaWRlb0hlaWdodCA9IDA7Ci0gICAgICAgIG1TcGVlZCA9IDEuMGY7Ci0gICAgICAgIG1GYWxsYmFja1NwZWVkID0gbVNwZWVkOwotICAgICAgICBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXggPSBJTlZBTElEX1RSQUNLX0lOREVYOwotICAgICAgICAvLyBUT0RPOiBhZGQgYXR0cmlidXRlcyB0byBnZXQgdGhpcyB2YWx1ZS4KLSAgICAgICAgbVNob3dDb250cm9sbGVySW50ZXJ2YWxNcyA9IERFRkFVTFRfU0hPV19DT05UUk9MTEVSX0lOVEVSVkFMX01TOwotCi0gICAgICAgIG1BY2Nlc3NpYmlsaXR5TWFuYWdlciA9IEFjY2Vzc2liaWxpdHlNYW5hZ2VyLmdldEluc3RhbmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotCi0gICAgICAgIG1BdWRpb01hbmFnZXIgPSAoQXVkaW9NYW5hZ2VyKSBtSW5zdGFuY2UuZ2V0Q29udGV4dCgpCi0gICAgICAgICAgICAgICAgLmdldFN5c3RlbVNlcnZpY2UoQ29udGV4dC5BVURJT19TRVJWSUNFKTsKLSAgICAgICAgbUF1ZGlvQXR0cmlidXRlcyA9IG5ldyBBdWRpb0F0dHJpYnV0ZXMuQnVpbGRlcigpLnNldFVzYWdlKEF1ZGlvQXR0cmlidXRlcy5VU0FHRV9NRURJQSkKLSAgICAgICAgICAgICAgICAuc2V0Q29udGVudFR5cGUoQXVkaW9BdHRyaWJ1dGVzLkNPTlRFTlRfVFlQRV9NT1ZJRSkuYnVpbGQoKTsKLSAgICAgICAgbUluc3RhbmNlLnNldEZvY3VzYWJsZSh0cnVlKTsKLSAgICAgICAgbUluc3RhbmNlLnNldEZvY3VzYWJsZUluVG91Y2hNb2RlKHRydWUpOwotICAgICAgICBtSW5zdGFuY2UucmVxdWVzdEZvY3VzKCk7Ci0KLSAgICAgICAgLy8gVE9ETzogdHJ5IHRvIGtlZXAgYSBzaW5nbGUgY2hpbGQgYXQgYSB0aW1lIHJhdGhlciB0aGFuIGFsd2F5cyBoYXZpbmcgYm90aC4KLSAgICAgICAgbVRleHR1cmVWaWV3ID0gbmV3IFZpZGVvVGV4dHVyZVZpZXcobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0gICAgICAgIG1TdXJmYWNlVmlldyA9IG5ldyBWaWRlb1N1cmZhY2VWaWV3KG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICBMYXlvdXRQYXJhbXMgcGFyYW1zID0gbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULAotICAgICAgICAgICAgICAgIExheW91dFBhcmFtcy5NQVRDSF9QQVJFTlQpOwotICAgICAgICBtVGV4dHVyZVZpZXcuc2V0TGF5b3V0UGFyYW1zKHBhcmFtcyk7Ci0gICAgICAgIG1TdXJmYWNlVmlldy5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgbVRleHR1cmVWaWV3LnNldFN1cmZhY2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgbVN1cmZhY2VWaWV3LnNldFN1cmZhY2VMaXN0ZW5lcih0aGlzKTsKLSAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobVRleHR1cmVWaWV3KTsKLSAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobVN1cmZhY2VWaWV3KTsKLQotICAgICAgICBtU3VidGl0bGVWaWV3ID0gbmV3IFN1YnRpdGxlVmlldyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRMYXlvdXRQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRCYWNrZ3JvdW5kQ29sb3IoMCk7Ci0gICAgICAgIG1JbnN0YW5jZS5hZGRWaWV3KG1TdWJ0aXRsZVZpZXcpOwotCi0gICAgICAgIGJvb2xlYW4gZW5hYmxlQ29udHJvbFZpZXcgPSAoYXR0cnMgPT0gbnVsbCkgfHwgYXR0cnMuZ2V0QXR0cmlidXRlQm9vbGVhblZhbHVlKAotICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiLAotICAgICAgICAgICAgICAgICJlbmFibGVDb250cm9sVmlldyIsIHRydWUpOwotICAgICAgICBpZiAoZW5hYmxlQ29udHJvbFZpZXcpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3ID0gbmV3IE1lZGlhQ29udHJvbFZpZXcyKG1JbnN0YW5jZS5nZXRDb250ZXh0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbVN1YnRpdGxlRW5hYmxlZCA9IChhdHRycyA9PSBudWxsKSB8fCBhdHRycy5nZXRBdHRyaWJ1dGVCb29sZWFuVmFsdWUoCi0gICAgICAgICAgICAgICAgImh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIsCi0gICAgICAgICAgICAgICAgImVuYWJsZVN1YnRpdGxlIiwgZmFsc2UpOwotCi0gICAgICAgIC8vIFRPRE86IENob29zZSBUZXh0dXJlVmlldyB3aGVuIFN1cmZhY2VWaWV3IGNhbm5vdCBiZSBjcmVhdGVkLgotICAgICAgICAvLyBDaG9vc2Ugc3VyZmFjZSB2aWV3IGJ5IGRlZmF1bHQKLSAgICAgICAgaW50IHZpZXdUeXBlID0gKGF0dHJzID09IG51bGwpID8gVmlkZW9WaWV3Mi5WSUVXX1RZUEVfU1VSRkFDRVZJRVcKLSAgICAgICAgICAgICAgICA6IGF0dHJzLmdldEF0dHJpYnV0ZUludFZhbHVlKAotICAgICAgICAgICAgICAgICJodHRwOi8vc2NoZW1hcy5hbmRyb2lkLmNvbS9hcGsvcmVzL2FuZHJvaWQiLAotICAgICAgICAgICAgICAgICJ2aWV3VHlwZSIsIFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXKTsKLSAgICAgICAgaWYgKHZpZXdUeXBlID09IFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJ2aWV3VHlwZSBhdHRyaWJ1dGUgaXMgc3VyZmFjZVZpZXcuIik7Ci0gICAgICAgICAgICBtVGV4dHVyZVZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgbVN1cmZhY2VWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1DdXJyZW50VmlldyA9IG1TdXJmYWNlVmlldzsKLSAgICAgICAgfSBlbHNlIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9URVhUVVJFVklFVykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAidmlld1R5cGUgYXR0cmlidXRlIGlzIHRleHR1cmVWaWV3LiIpOwotICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICBtQ3VycmVudFZpZXcgPSBtVGV4dHVyZVZpZXc7Ci0gICAgICAgIH0KLQotICAgICAgICBNZWRpYVJvdXRlU2VsZWN0b3IuQnVpbGRlciBidWlsZGVyID0gbmV3IE1lZGlhUm91dGVTZWxlY3Rvci5CdWlsZGVyKCk7Ci0gICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9SRU1PVEVfUExBWUJBQ0spOwotICAgICAgICBidWlsZGVyLmFkZENvbnRyb2xDYXRlZ29yeShNZWRpYUNvbnRyb2xJbnRlbnQuQ0FURUdPUllfTElWRV9BVURJTyk7Ci0gICAgICAgIGJ1aWxkZXIuYWRkQ29udHJvbENhdGVnb3J5KE1lZGlhQ29udHJvbEludGVudC5DQVRFR09SWV9MSVZFX1ZJREVPKTsKLSAgICAgICAgbVJvdXRlU2VsZWN0b3IgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFDb250cm9sVmlldzJfaW1wbChNZWRpYUNvbnRyb2xWaWV3MiBtZWRpYUNvbnRyb2xWaWV3LCBsb25nIGludGVydmFsTXMpIHsKLSAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcgPSBtZWRpYUNvbnRyb2xWaWV3OwotICAgICAgICBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zID0gaW50ZXJ2YWxNczsKLSAgICAgICAgLy8gVE9ETzogQ2FsbCBNZWRpYUNvbnRyb2xWaWV3Mi5zZXRSb3V0ZVNlbGVjdG9yIG9ubHkgd2hlbiBjYXN0IGF2YWlsYWxiZS4KLSAgICAgICAgKChNZWRpYUNvbnRyb2xWaWV3MkltcGwpIG1NZWRpYUNvbnRyb2xWaWV3LmdldFByb3ZpZGVyKCkpLnNldFJvdXRlU2VsZWN0b3IobVJvdXRlU2VsZWN0b3IpOwotCi0gICAgICAgIGlmIChtSW5zdGFuY2UuaXNBdHRhY2hlZFRvV2luZG93KCkpIHsKLSAgICAgICAgICAgIGF0dGFjaE1lZGlhQ29udHJvbFZpZXcoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xsZXIgZ2V0TWVkaWFDb250cm9sbGVyX2ltcGwoKSB7Ci0gICAgICAgIGlmIChtTWVkaWFTZXNzaW9uID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIk1lZGlhU2Vzc2lvbiBpbnN0YW5jZSBpcyBub3QgYXZhaWxhYmxlLiIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtTWVkaWFDb250cm9sbGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXNzaW9uVG9rZW4yIGdldE1lZGlhU2Vzc2lvblRva2VuX2ltcGwoKSB7Ci0gICAgICAgIC8vIFRPRE86IGltcGxlbWVudCB0aGlzCi0gICAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZWRpYUNvbnRyb2xWaWV3MiBnZXRNZWRpYUNvbnRyb2xWaWV3Ml9pbXBsKCkgewotICAgICAgICByZXR1cm4gbU1lZGlhQ29udHJvbFZpZXc7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lZGlhTWV0YWRhdGEyIGdldE1lZGlhTWV0YWRhdGFfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1NZWRpYU1ldGFkYXRhOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldE1lZGlhTWV0YWRhdGFfaW1wbChNZWRpYU1ldGFkYXRhMiBtZXRhZGF0YSkgewotICAgICAgICAvLyBUT0RPOiBpbnRlZ3JhdGUgdGhpcyB3aXRoIE1lZGlhU2Vzc2lvbjIjTWVkaWFJdGVtMgotICAgICAgICBtTWVkaWFNZXRhZGF0YSA9IG1ldGFkYXRhOwotCi0gICAgICAgIC8vIFRPRE86IGFkZCBzdXBwb3J0IGZvciBoYW5kbGluZyB3ZWJzaXRlIGxpbmsKLSAgICAgICAgbU1lZGlhVHlwZURhdGEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGJvb2xlYW4gaXNBZCA9IG1ldGFkYXRhID09IG51bGwgPwotICAgICAgICAgICAgICAgIGZhbHNlIDogbWV0YWRhdGEuZ2V0TG9uZyhNZWRpYU1ldGFkYXRhMi5NRVRBREFUQV9LRVlfQURWRVJUSVNFTUVOVCkgIT0gMDsKLSAgICAgICAgbU1lZGlhVHlwZURhdGEucHV0Qm9vbGVhbigKLSAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX1NUQVRFX0lTX0FEVkVSVElTRU1FTlQsIGlzQWQpOwotCi0gICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2VuZFNlc3Npb25FdmVudCgKLSAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLkVWRU5UX1VQREFURV9NRURJQV9UWVBFX1NUQVRVUywgbU1lZGlhVHlwZURhdGEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVXBkYXRlIGxhdGVyIGluc2lkZSBPblByZXBhcmVkTGlzdGVuZXIgYWZ0ZXIgTWVkaWFTZXNzaW9uIGlzIGluaXRpYWxpemVkLgotICAgICAgICAgICAgbU5lZWRVcGRhdGVNZWRpYVR5cGUgPSB0cnVlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0U3VidGl0bGVFbmFibGVkX2ltcGwoYm9vbGVhbiBlbmFibGUpIHsKLSAgICAgICAgaWYgKGVuYWJsZSAhPSBtU3VidGl0bGVFbmFibGVkKSB7Ci0gICAgICAgICAgICBzZWxlY3RPckRlc2VsZWN0U3VidGl0bGUoZW5hYmxlKTsKLSAgICAgICAgfQotICAgICAgICBtU3VidGl0bGVFbmFibGVkID0gZW5hYmxlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzU3VidGl0bGVFbmFibGVkX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VidGl0bGVFbmFibGVkOwotICAgIH0KLQotICAgIC8vIFRPRE86IHJlbW92ZSBzZXRTcGVlZF9pbXBsIG9uY2UgTWVkaWFDb250cm9sbGVyMiBpcyByZWFkeS4KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRTcGVlZF9pbXBsKGZsb2F0IHNwZWVkKSB7Ci0gICAgICAgIGlmIChzcGVlZCA8PSAwLjBmKSB7Ci0gICAgICAgICAgICBMb2cuZShUQUcsICJVbnN1cHBvcnRlZCBzcGVlZCAoIiArIHNwZWVkICsgIikgaXMgaWdub3JlZC4iKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBtU3BlZWQgPSBzcGVlZDsKLSAgICAgICAgaWYgKG1NZWRpYVBsYXllciAhPSBudWxsICYmIG1NZWRpYVBsYXllci5pc1BsYXlpbmcoKSkgewotICAgICAgICAgICAgYXBwbHlTcGVlZCgpOwotICAgICAgICB9Ci0gICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0ZvY3VzUmVxdWVzdF9pbXBsKGludCBmb2N1c0dhaW4pIHsKLSAgICAgICAgaWYgKGZvY3VzR2FpbiAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FCi0gICAgICAgICAgICAgICAgJiYgZm9jdXNHYWluICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX0dBSU4KLSAgICAgICAgICAgICAgICAmJiBmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfR0FJTl9UUkFOU0lFTlQKLSAgICAgICAgICAgICAgICAmJiBmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfR0FJTl9UUkFOU0lFTlRfTUFZX0RVQ0sKLSAgICAgICAgICAgICAgICAmJiBmb2N1c0dhaW4gIT0gQXVkaW9NYW5hZ2VyLkFVRElPRk9DVVNfR0FJTl9UUkFOU0lFTlRfRVhDTFVTSVZFKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJJbGxlZ2FsIGF1ZGlvIGZvY3VzIHR5cGUgIiArIGZvY3VzR2Fpbik7Ci0gICAgICAgIH0KLSAgICAgICAgbUF1ZGlvRm9jdXNUeXBlID0gZm9jdXNHYWluOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEF1ZGlvQXR0cmlidXRlc19pbXBsKEF1ZGlvQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB7Ci0gICAgICAgIGlmIChhdHRyaWJ1dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIklsbGVnYWwgbnVsbCBBdWRpb0F0dHJpYnV0ZXMiKTsKLSAgICAgICAgfQotICAgICAgICBtQXVkaW9BdHRyaWJ1dGVzID0gYXR0cmlidXRlczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWaWRlb1BhdGhfaW1wbChTdHJpbmcgcGF0aCkgewotICAgICAgICBtSW5zdGFuY2Uuc2V0VmlkZW9VcmkoVXJpLnBhcnNlKHBhdGgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRWaWRlb1VyaV9pbXBsKFVyaSB1cmkpIHsKLSAgICAgICAgbUluc3RhbmNlLnNldFZpZGVvVXJpKHVyaSwgbnVsbCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0VmlkZW9VcmlfaW1wbChVcmkgdXJpLCBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMpIHsKLSAgICAgICAgRGF0YVNvdXJjZURlc2MuQnVpbGRlciBidWlsZGVyID0gbmV3IERhdGFTb3VyY2VEZXNjLkJ1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5zZXREYXRhU291cmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIHVyaSwgaGVhZGVycywgbnVsbCk7Ci0gICAgICAgIG1JbnN0YW5jZS5zZXREYXRhU291cmNlKGJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVkaWFJdGVtX2ltcGwoTWVkaWFJdGVtMiBtZWRpYUl0ZW0pIHsKLSAgICAgICAgLy8gVE9ETzogaW1wbGVtZW50IHRoaXMKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXREYXRhU291cmNlX2ltcGwoRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgIG1Ec2QgPSBkc2Q7Ci0gICAgICAgIG1TZWVrV2hlblByZXBhcmVkID0gMDsKLSAgICAgICAgb3BlblZpZGVvKGRzZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0Vmlld1R5cGVfaW1wbChpbnQgdmlld1R5cGUpIHsKLSAgICAgICAgaWYgKHZpZXdUeXBlID09IG1DdXJyZW50Vmlldy5nZXRWaWV3VHlwZSgpKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgVmlkZW9WaWV3SW50ZXJmYWNlIHRhcmdldFZpZXc7Ci0gICAgICAgIGlmICh2aWV3VHlwZSA9PSBWaWRlb1ZpZXcyLlZJRVdfVFlQRV9URVhUVVJFVklFVykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAic3dpdGNoaW5nIHRvIFRleHR1cmVWaWV3Iik7Ci0gICAgICAgICAgICB0YXJnZXRWaWV3ID0gbVRleHR1cmVWaWV3OwotICAgICAgICB9IGVsc2UgaWYgKHZpZXdUeXBlID09IFZpZGVvVmlldzIuVklFV19UWVBFX1NVUkZBQ0VWSUVXKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJzd2l0Y2hpbmcgdG8gU3VyZmFjZVZpZXciKTsKLSAgICAgICAgICAgIHRhcmdldFZpZXcgPSBtU3VyZmFjZVZpZXc7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHZpZXcgdHlwZTogIiArIHZpZXdUeXBlKTsKLSAgICAgICAgfQotICAgICAgICAoKFZpZXcpIHRhcmdldFZpZXcpLnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgdGFyZ2V0Vmlldy50YWtlT3ZlcihtQ3VycmVudFZpZXcpOwotICAgICAgICBtSW5zdGFuY2UucmVxdWVzdExheW91dCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0Vmlld1R5cGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1DdXJyZW50Vmlldy5nZXRWaWV3VHlwZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHNldEN1c3RvbUFjdGlvbnNfaW1wbCgKLSAgICAgICAgICAgIExpc3Q8UGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24+IGFjdGlvbkxpc3QsCi0gICAgICAgICAgICBFeGVjdXRvciBleGVjdXRvciwgVmlkZW9WaWV3Mi5PbkN1c3RvbUFjdGlvbkxpc3RlbmVyIGxpc3RlbmVyKSB7Ci0gICAgICAgIG1DdXN0b21BY3Rpb25MaXN0ID0gYWN0aW9uTGlzdDsKLSAgICAgICAgbUN1c3RvbUFjdGlvbkxpc3RlbmVyUmVjb3JkID0gbmV3IFBhaXI8PihleGVjdXRvciwgbGlzdGVuZXIpOwotCi0gICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwbGF5YmFjayBidWlsZGVyIGluIG9yZGVyIHRvIGNsZWFyIGV4aXN0aW5nIHRoZSBjdXN0b20gYWN0aW9ucy4KLSAgICAgICAgbVN0YXRlQnVpbGRlciA9IG51bGw7Ci0gICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRPblZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyX2ltcGwoVmlkZW9WaWV3Mi5PblZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyIGwpIHsKLSAgICAgICAgbVZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyID0gbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRGdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyX2ltcGwoVmlkZW9WaWV3Mi5PbkZ1bGxTY3JlZW5SZXF1ZXN0TGlzdGVuZXIgbCkgewotICAgICAgICBtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lciA9IGw7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25BdHRhY2hlZFRvV2luZG93X2ltcGwoKSB7Ci0gICAgICAgIHN1cGVyLm9uQXR0YWNoZWRUb1dpbmRvd19pbXBsKCk7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIE1lZGlhU2Vzc2lvbgotICAgICAgICBtTWVkaWFTZXNzaW9uID0gbmV3IE1lZGlhU2Vzc2lvbihtSW5zdGFuY2UuZ2V0Q29udGV4dCgpLCAiVmlkZW9WaWV3Mk1lZGlhU2Vzc2lvbiIpOwotICAgICAgICBtTWVkaWFTZXNzaW9uLnNldENhbGxiYWNrKG5ldyBNZWRpYVNlc3Npb25DYWxsYmFjaygpKTsKLSAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRBY3RpdmUodHJ1ZSk7Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xsZXIgPSBtTWVkaWFTZXNzaW9uLmdldENvbnRyb2xsZXIoKTsKLSAgICAgICAgbU1lZGlhUm91dGVyID0gTWVkaWFSb3V0ZXIuZ2V0SW5zdGFuY2UobUluc3RhbmNlLmdldENvbnRleHQoKSk7Ci0gICAgICAgIG1NZWRpYVJvdXRlci5zZXRNZWRpYVNlc3Npb24obU1lZGlhU2Vzc2lvbik7Ci0gICAgICAgIG1NZWRpYVJvdXRlci5hZGRDYWxsYmFjayhtUm91dGVTZWxlY3RvciwgbVJvdXRlckNhbGxiYWNrKTsKLSAgICAgICAgYXR0YWNoTWVkaWFDb250cm9sVmlldygpOwotICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBhZnRlciBtb3ZpbmcgTWVkaWFTZXNzaW9uIGNyZWF0aW5nIGNvZGUgaW5zaWRlIGluaXRpYWxpemluZyBWaWRlb1ZpZXcyCi0gICAgICAgIGlmIChtQ3VycmVudFN0YXRlID09IFNUQVRFX1BSRVBBUkVEKSB7Ci0gICAgICAgICAgICBleHRyYWN0VHJhY2tzKCk7Ci0gICAgICAgICAgICBleHRyYWN0TWV0YWRhdGEoKTsKLSAgICAgICAgICAgIGV4dHJhY3RBdWRpb01ldGFkYXRhKCk7Ci0gICAgICAgICAgICBpZiAobU5lZWRVcGRhdGVNZWRpYVR5cGUpIHsKLSAgICAgICAgICAgICAgICBtTWVkaWFTZXNzaW9uLnNlbmRTZXNzaW9uRXZlbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBNZWRpYUNvbnRyb2xWaWV3MkltcGwuRVZFTlRfVVBEQVRFX01FRElBX1RZUEVfU1RBVFVTLAotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhVHlwZURhdGEpOwotICAgICAgICAgICAgICAgIG1OZWVkVXBkYXRlTWVkaWFUeXBlID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCkgewotICAgICAgICBzdXBlci5vbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCk7Ci0KLSAgICAgICAgbU1lZGlhU2Vzc2lvbi5yZWxlYXNlKCk7Ci0gICAgICAgIG1NZWRpYVNlc3Npb24gPSBudWxsOwotICAgICAgICBtTWVkaWFDb250cm9sbGVyID0gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ2hhclNlcXVlbmNlIGdldEFjY2Vzc2liaWxpdHlDbGFzc05hbWVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIFZpZGVvVmlldzIuY2xhc3MuZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25Ub3VjaEV2ZW50KCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgKyAiLCBtVGFyZ2V0U3RhdGU9IiArIG1UYXJnZXRTdGF0ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGV2LmdldEFjdGlvbigpID09IE1vdGlvbkV2ZW50LkFDVElPTl9VUCAmJiBtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAoIW1Jc011c2ljTWVkaWFUeXBlIHx8IG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRlVMTCkgewotICAgICAgICAgICAgICAgIHRvZ2dsZU1lZGlhQ29udHJvbFZpZXdWaXNpYmlsaXR5KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gc3VwZXIub25Ub3VjaEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICBpZiAoZXYuZ2V0QWN0aW9uKCkgPT0gTW90aW9uRXZlbnQuQUNUSU9OX1VQICYmIG1NZWRpYUNvbnRyb2xWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmICghbUlzTXVzaWNNZWRpYVR5cGUgfHwgbVNpemVUeXBlICE9IFNJWkVfVFlQRV9GVUxMKSB7Ci0gICAgICAgICAgICAgICAgdG9nZ2xlTWVkaWFDb250cm9sVmlld1Zpc2liaWxpdHkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiBzdXBlci5vblRyYWNrYmFsbEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIC8vIFRPRE86IFRlc3QgdG91Y2ggZXZlbnQgaGFuZGxpbmcgbG9naWMgdGhvcm91Z2hseSBhbmQgc2ltcGxpZnkgdGhlIGxvZ2ljLgotICAgICAgICByZXR1cm4gc3VwZXIuZGlzcGF0Y2hUb3VjaEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTWVhc3VyZV9pbXBsKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgc3VwZXIub25NZWFzdXJlX2ltcGwod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOwotCi0gICAgICAgIGlmIChtSXNNdXNpY01lZGlhVHlwZSkgewotICAgICAgICAgICAgaWYgKG1QcmV2V2lkdGggIT0gbUluc3RhbmNlLmdldE1lYXN1cmVkV2lkdGgoKQotICAgICAgICAgICAgICAgICAgICB8fCBtUHJldkhlaWdodCAhPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKSkgewotICAgICAgICAgICAgICAgIGludCBjdXJyV2lkdGggPSBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpOwotICAgICAgICAgICAgICAgIGludCBjdXJySGVpZ2h0ID0gbUluc3RhbmNlLmdldE1lYXN1cmVkSGVpZ2h0KCk7Ci0gICAgICAgICAgICAgICAgUG9pbnQgc2NyZWVuU2l6ZSA9IG5ldyBQb2ludCgpOwotICAgICAgICAgICAgICAgIG1NYW5hZ2VyLmdldERlZmF1bHREaXNwbGF5KCkuZ2V0U2l6ZShzY3JlZW5TaXplKTsKLSAgICAgICAgICAgICAgICBpbnQgc2NyZWVuV2lkdGggPSBzY3JlZW5TaXplLng7Ci0gICAgICAgICAgICAgICAgaW50IHNjcmVlbkhlaWdodCA9IHNjcmVlblNpemUueTsKLQotICAgICAgICAgICAgICAgIGlmIChjdXJyV2lkdGggPT0gc2NyZWVuV2lkdGggJiYgY3VyckhlaWdodCA9PSBzY3JlZW5IZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG9yaWVudGF0aW9uID0gcmV0cmlldmVPcmllbnRhdGlvbigpOwotICAgICAgICAgICAgICAgICAgICBpZiAob3JpZW50YXRpb24gPT0gQWN0aXZpdHlJbmZvLlNDUkVFTl9PUklFTlRBVElPTl9MQU5EU0NBUEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZnVsbF9sYW5kc2NhcGVfbXVzaWMpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgaW5mbGF0ZU11c2ljVmlldyhSLmxheW91dC5mdWxsX3BvcnRyYWl0X211c2ljKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtU2l6ZVR5cGUgIT0gU0laRV9UWVBFX0ZVTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaXplVHlwZSA9IFNJWkVfVFlQRV9GVUxMOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVtb3ZlIGV4aXN0aW5nIG1GYWRlT3V0IGNhbGxiYWNrCi0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5yZW1vdmVDYWxsYmFja3MobUZhZGVPdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LlZJU0lCTEUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1TaXplVHlwZSAhPSBTSVpFX1RZUEVfRU1CRURERUQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1TaXplVHlwZSA9IFNJWkVfVFlQRV9FTUJFRERFRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZW1iZWRkZWRfbXVzaWMpOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gQWRkIG5ldyBtRmFkZU91dCBjYWxsYmFjawotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcucG9zdERlbGF5ZWQobUZhZGVPdXQsIG1TaG93Q29udHJvbGxlckludGVydmFsTXMpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1QcmV2V2lkdGggPSBjdXJyV2lkdGg7Ci0gICAgICAgICAgICAgICAgbVByZXZIZWlnaHQgPSBjdXJySGVpZ2h0OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gICAgLy8gSW1wbGVtZW50cyBWaWRlb1ZpZXdJbnRlcmZhY2UuU3VyZmFjZUxpc3RlbmVyCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VDcmVhdGVkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7Ci0gICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgTG9nLmQoVEFHLCAib25TdXJmYWNlQ3JlYXRlZCgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUgKyAiLCB3aWR0aC9oZWlnaHQ6ICIgKyB3aWR0aCArICIvIiArIGhlaWdodAotICAgICAgICAgICAgICAgICAgICArICIsICIgKyB2aWV3LnRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChuZWVkVG9TdGFydCgpKSB7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25TdXJmYWNlRGVzdHJveWVkKFZpZXcgdmlldykgewotICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU3VyZmFjZURlc3Ryb3llZCgpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUgKyAiLCAiICsgdmlldy50b1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uU3VyZmFjZUNoYW5nZWQoVmlldyB2aWV3LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgLy8gVE9ETzogRG8gd2UgbmVlZCB0byBjYWxsIHJlcXVlc3RMYXlvdXQgaGVyZT8KLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VDaGFuZ2VkKCkuIHdpZHRoL2hlaWdodDogIiArIHdpZHRoICsgIi8iICsgaGVpZ2h0Ci0gICAgICAgICAgICAgICAgICAgICsgIiwgIiArIHZpZXcudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblN1cmZhY2VUYWtlT3ZlckRvbmUoVmlkZW9WaWV3SW50ZXJmYWNlIHZpZXcpIHsKLSAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICBMb2cuZChUQUcsICJvblN1cmZhY2VUYWtlT3ZlckRvbmUoKS4gTm93IGN1cnJlbnQgdmlldyBpczogIiArIHZpZXcpOwotICAgICAgICB9Ci0gICAgICAgIG1DdXJyZW50VmlldyA9IHZpZXc7Ci0gICAgICAgIGlmIChtVmlld1R5cGVDaGFuZ2VkTGlzdGVuZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgbVZpZXdUeXBlQ2hhbmdlZExpc3RlbmVyLm9uVmlld1R5cGVDaGFuZ2VkKG1JbnN0YW5jZSwgdmlldy5nZXRWaWV3VHlwZSgpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobmVlZFRvU3RhcnQoKSkgewotICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnBsYXkoKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICAgIC8vIFByb3RlY3RlZCBvciBwcml2YXRlIG1ldGhvZHMKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotICAgIHByaXZhdGUgdm9pZCBhdHRhY2hNZWRpYUNvbnRyb2xWaWV3KCkgewotICAgICAgICAvLyBHZXQgTWVkaWFDb250cm9sbGVyIGZyb20gTWVkaWFTZXNzaW9uIGFuZCBzZXQgaXQgaW5zaWRlIE1lZGlhQ29udHJvbFZpZXcKLSAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0Q29udHJvbGxlcihtTWVkaWFTZXNzaW9uLmdldENvbnRyb2xsZXIoKSk7Ci0KLSAgICAgICAgTGF5b3V0UGFyYW1zIHBhcmFtcyA9Ci0gICAgICAgICAgICAgICAgbmV3IExheW91dFBhcmFtcyhMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5ULCBMYXlvdXRQYXJhbXMuTUFUQ0hfUEFSRU5UKTsKLSAgICAgICAgbUluc3RhbmNlLmFkZFZpZXcobU1lZGlhQ29udHJvbFZpZXcsIHBhcmFtcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzSW5QbGF5YmFja1N0YXRlKCkgewotICAgICAgICByZXR1cm4gKG1NZWRpYVBsYXllciAhPSBudWxsIHx8IG1Sb3V0ZVBsYXllciAhPSBudWxsKQotICAgICAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfRVJST1IKLSAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX0lETEUKLSAgICAgICAgICAgICAgICAmJiBtQ3VycmVudFN0YXRlICE9IFNUQVRFX1BSRVBBUklORzsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gbmVlZFRvU3RhcnQoKSB7Ci0gICAgICAgIHJldHVybiAobU1lZGlhUGxheWVyICE9IG51bGwgfHwgbVJvdXRlUGxheWVyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9QTEFZSU5HCi0gICAgICAgICAgICAgICAgJiYgbVRhcmdldFN0YXRlID09IFNUQVRFX1BMQVlJTkc7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlcyBhIE1lZGlhUGxheWVyMiBpbnN0YW5jZSBhbmQgcHJlcGFyZSBwbGF5YmFjay4KLSAgICBwcml2YXRlIHZvaWQgb3BlblZpZGVvKERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICBVcmkgdXJpID0gZHNkLmdldFVyaSgpOwotICAgICAgICBNYXA8U3RyaW5nLCBTdHJpbmc+IGhlYWRlcnMgPSBkc2QuZ2V0VXJpSGVhZGVycygpOwotICAgICAgICByZXNldFBsYXllcigpOwotICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICBtUm91dGVQbGF5ZXIub3BlblZpZGVvKGRzZCk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1BdWRpb0ZvY3VzVHlwZSAhPSBBdWRpb01hbmFnZXIuQVVESU9GT0NVU19OT05FKSB7Ci0gICAgICAgICAgICAvLyBUT0RPIHRoaXMgc2hvdWxkIGhhdmUgYSBmb2N1cyBsaXN0ZW5lcgotICAgICAgICAgICAgQXVkaW9Gb2N1c1JlcXVlc3QgZm9jdXNSZXF1ZXN0OwotICAgICAgICAgICAgZm9jdXNSZXF1ZXN0ID0gbmV3IEF1ZGlvRm9jdXNSZXF1ZXN0LkJ1aWxkZXIobUF1ZGlvRm9jdXNUeXBlKQotICAgICAgICAgICAgICAgICAgICAuc2V0QXVkaW9BdHRyaWJ1dGVzKG1BdWRpb0F0dHJpYnV0ZXMpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5yZXF1ZXN0QXVkaW9Gb2N1cyhmb2N1c1JlcXVlc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIExvZy5kKFRBRywgIm9wZW5WaWRlbygpOiBjcmVhdGluZyBuZXcgTWVkaWFQbGF5ZXIyIGluc3RhbmNlLiIpOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyID0gbmV3IE1lZGlhUGxheWVyMkltcGwoKTsKLSAgICAgICAgICAgIG1TdXJmYWNlVmlldy5zZXRNZWRpYVBsYXllcihtTWVkaWFQbGF5ZXIpOwotICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldE1lZGlhUGxheWVyKG1NZWRpYVBsYXllcik7Ci0gICAgICAgICAgICBtQ3VycmVudFZpZXcuYXNzaWduU3VyZmFjZVRvTWVkaWFQbGF5ZXIobU1lZGlhUGxheWVyKTsKLQotICAgICAgICAgICAgZmluYWwgQ29udGV4dCBjb250ZXh0ID0gbUluc3RhbmNlLmdldENvbnRleHQoKTsKLSAgICAgICAgICAgIC8vIFRPRE86IEFkZCB0aW1lbHkgZmlyaW5nIGxvZ2ljIGZvciBtb3JlIGFjY3VyYXRlIHN5bmMgYmV0d2VlbiBDQyBhbmQgdmlkZW8gZnJhbWUKLSAgICAgICAgICAgIG1TdWJ0aXRsZUNvbnRyb2xsZXIgPSBuZXcgU3VidGl0bGVDb250cm9sbGVyKGNvbnRleHQpOwotICAgICAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5yZWdpc3RlclJlbmRlcmVyKG5ldyBDbG9zZWRDYXB0aW9uUmVuZGVyZXIoY29udGV4dCkpOwotICAgICAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5zZXRBbmNob3IoKFN1YnRpdGxlQ29udHJvbGxlci5BbmNob3IpIG1TdWJ0aXRsZVZpZXcpOwotICAgICAgICAgICAgRXhlY3V0b3IgZXhlY3V0b3IgPSBuZXcgRXhlY3V0b3IoKSB7Ci0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgZXhlY3V0ZShSdW5uYWJsZSBydW5uYWJsZSkgewotICAgICAgICAgICAgICAgICAgICBydW5uYWJsZS5ydW4oKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2soZXhlY3V0b3IsIG1NZWRpYVBsYXllcjJDYWxsYmFjayk7Ci0KLSAgICAgICAgICAgIG1DdXJyZW50QnVmZmVyUGVyY2VudGFnZSA9IC0xOwotICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNldERhdGFTb3VyY2UoZHNkKTsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZXRBdWRpb0F0dHJpYnV0ZXMobUF1ZGlvQXR0cmlidXRlcyk7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0T25TdWJ0aXRsZURhdGFMaXN0ZW5lcihtU3VidGl0bGVMaXN0ZW5lcik7Ci0gICAgICAgICAgICAvLyB3ZSBkb24ndCBzZXQgdGhlIHRhcmdldCBzdGF0ZSBoZXJlIGVpdGhlciwgYnV0IHByZXNlcnZlIHRoZQotICAgICAgICAgICAgLy8gdGFyZ2V0IHN0YXRlIHRoYXQgd2FzIHRoZXJlIGJlZm9yZS4KLSAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QUkVQQVJJTkc7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIucHJlcGFyZSgpOwotCi0gICAgICAgICAgICAvLyBTYXZlIGZpbGUgbmFtZSBhcyB0aXRsZSBzaW5jZSB0aGUgZmlsZSBtYXkgbm90IGhhdmUgYSB0aXRsZSBNZXRhZGF0YS4KLSAgICAgICAgICAgIG1UaXRsZSA9IHVyaS5nZXRQYXRoKCk7Ci0gICAgICAgICAgICBTdHJpbmcgc2NoZW1lID0gdXJpLmdldFNjaGVtZSgpOwotICAgICAgICAgICAgaWYgKHNjaGVtZSAhPSBudWxsICYmIHNjaGVtZS5lcXVhbHMoImZpbGUiKSkgewotICAgICAgICAgICAgICAgIG1UaXRsZSA9IHVyaS5nZXRMYXN0UGF0aFNlZ21lbnQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1SZXRyaWV2ZXIgPSBuZXcgTWVkaWFNZXRhZGF0YVJldHJpZXZlcigpOwotICAgICAgICAgICAgbVJldHJpZXZlci5zZXREYXRhU291cmNlKG1JbnN0YW5jZS5nZXRDb250ZXh0KCksIHVyaSk7Ci0KLSAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9wZW5WaWRlbygpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICArICIsIG1UYXJnZXRTdGF0ZT0iICsgbVRhcmdldFN0YXRlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4KSB7Ci0gICAgICAgICAgICBMb2cudyhUQUcsICJVbmFibGUgdG8gb3BlbiBjb250ZW50OiAiICsgdXJpLCBleCk7Ci0gICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfRVJST1I7Ci0gICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9FUlJPUjsKLSAgICAgICAgICAgIG1NZWRpYVBsYXllcjJDYWxsYmFjay5vbkVycm9yKG1NZWRpYVBsYXllciwgZHNkLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjIuTUVESUFfRVJST1JfVU5LTk9XTiwgTWVkaWFQbGF5ZXIyLk1FRElBX0VSUk9SX0lPKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qCi0gICAgICogUmVzZXQgdGhlIG1lZGlhIHBsYXllciBpbiBhbnkgc3RhdGUKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgcmVzZXRQbGF5ZXIoKSB7Ci0gICAgICAgIGlmIChtTWVkaWFQbGF5ZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgZmluYWwgTWVkaWFQbGF5ZXIyIHBsYXllciA9IG1NZWRpYVBsYXllcjsKLSAgICAgICAgICAgIG5ldyBBc3luY1Rhc2s8TWVkaWFQbGF5ZXIyLCBWb2lkLCBWb2lkPigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwcm90ZWN0ZWQgVm9pZCBkb0luQmFja2dyb3VuZChNZWRpYVBsYXllcjIuLi4gcGxheWVycykgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBGaXggTlBFIHdoaWxlIE1lZGlhUGxheWVyMi5jbG9zZSgpCi0gICAgICAgICAgICAgICAgICAgIC8vcGxheWVyc1swXS5jbG9zZSgpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9LmV4ZWN1dGVPbkV4ZWN1dG9yKEFzeW5jVGFzay5TRVJJQUxfRVhFQ1VUT1IsIHBsYXllcik7Ci0gICAgICAgICAgICBtTWVkaWFQbGF5ZXIgPSBudWxsOwotICAgICAgICAgICAgbVRleHR1cmVWaWV3LnNldE1lZGlhUGxheWVyKG51bGwpOwotICAgICAgICAgICAgbVN1cmZhY2VWaWV3LnNldE1lZGlhUGxheWVyKG51bGwpOwotICAgICAgICAgICAgLy9tUGVuZGluZ1N1YnRpdGxlVHJhY2tzLmNsZWFyKCk7Ci0gICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfSURMRTsKLSAgICAgICAgICAgIG1UYXJnZXRTdGF0ZSA9IFNUQVRFX0lETEU7Ci0gICAgICAgICAgICBpZiAobUF1ZGlvRm9jdXNUeXBlICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX05PTkUpIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLmFiYW5kb25BdWRpb0ZvY3VzKG51bGwpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG1WaWRlb1dpZHRoID0gMDsKLSAgICAgICAgbVZpZGVvSGVpZ2h0ID0gMDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdXBkYXRlUGxheWJhY2tTdGF0ZSgpIHsKLSAgICAgICAgaWYgKG1TdGF0ZUJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgLy8gR2V0IHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIHBsYXllciBmb3IgdGhpcyBzdHJlYW0KLSAgICAgICAgICAgIG1NZXRhZGF0YSA9IG1NZWRpYVBsYXllci5nZXRNZXRhZGF0YShNZWRpYVBsYXllcjIuTUVUQURBVEFfQUxMLAotICAgICAgICAgICAgICAgICAgICBNZWRpYVBsYXllcjIuQllQQVNTX01FVEFEQVRBX0ZJTFRFUik7Ci0KLSAgICAgICAgICAgIC8vIEFkZCBQbGF5IGFjdGlvbiBhcyBkZWZhdWx0Ci0gICAgICAgICAgICBsb25nIHBsYXliYWNrQWN0aW9ucyA9IFBsYXliYWNrU3RhdGUuQUNUSU9OX1BMQVk7Ci0gICAgICAgICAgICBpZiAobU1ldGFkYXRhICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuUEFVU0VfQVZBSUxBQkxFKQotICAgICAgICAgICAgICAgICAgICAgICAgfHwgbU1ldGFkYXRhLmdldEJvb2xlYW4oTWV0YWRhdGEuUEFVU0VfQVZBSUxBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbU1ldGFkYXRhLmhhcyhNZXRhZGF0YS5TRUVLX0JBQ0tXQVJEX0FWQUlMQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlNFRUtfQkFDS1dBUkRfQVZBSUxBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoIW1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuU0VFS19GT1JXQVJEX0FWQUlMQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlNFRUtfRk9SV0FSRF9BVkFJTEFCTEUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHBsYXliYWNrQWN0aW9ucyB8PSBQbGF5YmFja1N0YXRlLkFDVElPTl9GQVNUX0ZPUldBUkQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghbU1ldGFkYXRhLmhhcyhNZXRhZGF0YS5TRUVLX0FWQUlMQUJMRSkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IG1NZXRhZGF0YS5nZXRCb29sZWFuKE1ldGFkYXRhLlNFRUtfQVZBSUxBQkxFKSkgewotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja0FjdGlvbnMgfD0gUGxheWJhY2tTdGF0ZS5BQ1RJT05fU0VFS19UTzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHBsYXliYWNrQWN0aW9ucyB8PSAoUGxheWJhY2tTdGF0ZS5BQ1RJT05fUEFVU0UgfAotICAgICAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tTdGF0ZS5BQ1RJT05fUkVXSU5EIHwgUGxheWJhY2tTdGF0ZS5BQ1RJT05fRkFTVF9GT1JXQVJEIHwKLSAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrU3RhdGUuQUNUSU9OX1NFRUtfVE8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbVN0YXRlQnVpbGRlciA9IG5ldyBQbGF5YmFja1N0YXRlLkJ1aWxkZXIoKTsKLSAgICAgICAgICAgIG1TdGF0ZUJ1aWxkZXIuc2V0QWN0aW9ucyhwbGF5YmFja0FjdGlvbnMpOwotCi0gICAgICAgICAgICBpZiAobUN1c3RvbUFjdGlvbkxpc3QgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGZvciAoUGxheWJhY2tTdGF0ZS5DdXN0b21BY3Rpb24gYWN0aW9uIDogbUN1c3RvbUFjdGlvbkxpc3QpIHsKLSAgICAgICAgICAgICAgICAgICAgbVN0YXRlQnVpbGRlci5hZGRDdXN0b21BY3Rpb24oYWN0aW9uKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgbVN0YXRlQnVpbGRlci5zZXRTdGF0ZShnZXRDb3JyZXNwb25kaW5nUGxheWJhY2tTdGF0ZSgpLAotICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5nZXRDdXJyZW50UG9zaXRpb24oKSwgbVNwZWVkKTsKLSAgICAgICAgaWYgKG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfRVJST1IKLSAgICAgICAgICAgICYmIG1DdXJyZW50U3RhdGUgIT0gU1RBVEVfSURMRQotICAgICAgICAgICAgJiYgbUN1cnJlbnRTdGF0ZSAhPSBTVEFURV9QUkVQQVJJTkcpIHsKLSAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgc2hvdWxkIGJlIHJlcGxhY2VkIHdpdGggTWVkaWFQbGF5ZXIyLmdldEJ1ZmZlcmVkUG9zaXRpb24oKSBvbmNlIGl0IGlzCi0gICAgICAgICAgICAvLyBpbXBsZW1lbnRlZC4KLSAgICAgICAgICAgIGlmIChtQ3VycmVudEJ1ZmZlclBlcmNlbnRhZ2UgPT0gLTEpIHsKLSAgICAgICAgICAgICAgICBtU3RhdGVCdWlsZGVyLnNldEJ1ZmZlcmVkUG9zaXRpb24oLTEpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3RhdGVCdWlsZGVyLnNldEJ1ZmZlcmVkUG9zaXRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAobG9uZykgKG1DdXJyZW50QnVmZmVyUGVyY2VudGFnZSAvIDEwMC4wICogbU1lZGlhUGxheWVyLmdldER1cmF0aW9uKCkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFNldCBQbGF5YmFja1N0YXRlIGZvciBNZWRpYVNlc3Npb24KLSAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgUGxheWJhY2tTdGF0ZSBzdGF0ZSA9IG1TdGF0ZUJ1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgICAgIG1NZWRpYVNlc3Npb24uc2V0UGxheWJhY2tTdGF0ZShzdGF0ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBnZXRDb3JyZXNwb25kaW5nUGxheWJhY2tTdGF0ZSgpIHsKLSAgICAgICAgc3dpdGNoIChtQ3VycmVudFN0YXRlKSB7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX0VSUk9SOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX0VSUk9SOwotICAgICAgICAgICAgY2FzZSBTVEFURV9JRExFOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX05PTkU7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX1BSRVBBUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9DT05ORUNUSU5HOwotICAgICAgICAgICAgY2FzZSBTVEFURV9QUkVQQVJFRDoKLSAgICAgICAgICAgICAgICByZXR1cm4gUGxheWJhY2tTdGF0ZS5TVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICBjYXNlIFNUQVRFX1BMQVlJTkc6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBsYXliYWNrU3RhdGUuU1RBVEVfUExBWUlORzsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfUEFVU0VEOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX1BBVVNFRDsKLSAgICAgICAgICAgIGNhc2UgU1RBVEVfUExBWUJBQ0tfQ09NUExFVEVEOgotICAgICAgICAgICAgICAgIHJldHVybiBQbGF5YmFja1N0YXRlLlNUQVRFX1NUT1BQRUQ7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgUnVubmFibGUgbUZhZGVPdXQgPSBuZXcgUnVubmFibGUoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBydW4oKSB7Ci0gICAgICAgICAgICBpZiAobUN1cnJlbnRTdGF0ZSA9PSBTVEFURV9QTEFZSU5HKSB7Ci0gICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbFZpZXcuc2V0VmlzaWJpbGl0eShWaWV3LkdPTkUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgdm9pZCBzaG93Q29udHJvbGxlcigpIHsKLSAgICAgICAgLy8gVE9ETzogRGVjaWRlIHdoYXQgdG8gc2hvdyB3aGVuIHRoZSBzdGF0ZSBpcyBub3QgaW4gcGxheWJhY2sgc3RhdGUKLSAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xWaWV3ID09IG51bGwgfHwgIWlzSW5QbGF5YmFja1N0YXRlKCkKLSAgICAgICAgICAgICAgICB8fCAobUlzTXVzaWNNZWRpYVR5cGUgJiYgbVNpemVUeXBlID09IFNJWkVfVFlQRV9GVUxMKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnJlbW92ZUNhbGxiYWNrcyhtRmFkZU91dCk7Ci0gICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5WSVNJQkxFKTsKLSAgICAgICAgaWYgKG1TaG93Q29udHJvbGxlckludGVydmFsTXMgIT0gMAotICAgICAgICAgICAgJiYgIW1BY2Nlc3NpYmlsaXR5TWFuYWdlci5pc1RvdWNoRXhwbG9yYXRpb25FbmFibGVkKCkpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnBvc3REZWxheWVkKG1GYWRlT3V0LCBtU2hvd0NvbnRyb2xsZXJJbnRlcnZhbE1zKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB0b2dnbGVNZWRpYUNvbnRyb2xWaWV3VmlzaWJpbGl0eSgpIHsKLSAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xWaWV3LmdldFZpc2liaWxpdHkoKSA9PSBWaWV3LlZJU0lCTEUpIHsKLSAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnJlbW92ZUNhbGxiYWNrcyhtRmFkZU91dCk7Ci0gICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFwcGx5U3BlZWQoKSB7Ci0gICAgICAgIFBsYXliYWNrUGFyYW1zIHBhcmFtcyA9IG1NZWRpYVBsYXllci5nZXRQbGF5YmFja1BhcmFtcygpLmFsbG93RGVmYXVsdHMoKTsKLSAgICAgICAgaWYgKG1TcGVlZCAhPSBwYXJhbXMuZ2V0U3BlZWQoKSkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBwYXJhbXMuc2V0U3BlZWQobVNwZWVkKTsKLSAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuc2V0UGxheWJhY2tQYXJhbXMocGFyYW1zKTsKLSAgICAgICAgICAgICAgICBtRmFsbGJhY2tTcGVlZCA9IG1TcGVlZDsKLSAgICAgICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmUoVEFHLCAiUGxheWJhY2tQYXJhbXMgaGFzIHVuc3VwcG9ydGVkIHZhbHVlOiAiICsgZSk7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHJldmlzZSB0aGlzIHBhcnQgYWZ0ZXIgaW50ZWdyYXRpbmcgd2l0aCBNUDIuCi0gICAgICAgICAgICAgICAgLy8gSWYgbVNwZWVkIGhhZCBhbiBpbGxlZ2FsIHZhbHVlIGZvciBzcGVlZCByYXRlLCBzeXN0ZW0gd2lsbCBkZXRlcm1pbmUgYmVzdAotICAgICAgICAgICAgICAgIC8vIGhhbmRsaW5nIChzZWUgUGxheWJhY2tQYXJhbXMuQVVESU9fRkFMTEJBQ0tfTU9ERV9ERUZBVUxUKS4KLSAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgcHJlLU1QMiByZXR1cm5zIDAuMGYgd2hlbiBpdCBpcyBwYXVzZWQuIEluIHRoaXMgY2FzZSwgVmlkZW9WaWV3MiB3aWxsCi0gICAgICAgICAgICAgICAgLy8gdXNlIG1GYWxsYmFja1NwZWVkIGluc3RlYWQuCi0gICAgICAgICAgICAgICAgZmxvYXQgZmFsbGJhY2tTcGVlZCA9IG1NZWRpYVBsYXllci5nZXRQbGF5YmFja1BhcmFtcygpLmFsbG93RGVmYXVsdHMoKS5nZXRTcGVlZCgpOwotICAgICAgICAgICAgICAgIGlmIChmYWxsYmFja1NwZWVkID4gMC4wZikgewotICAgICAgICAgICAgICAgICAgICBtRmFsbGJhY2tTcGVlZCA9IGZhbGxiYWNrU3BlZWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1TcGVlZCA9IG1GYWxsYmFja1NwZWVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVtb3RlUGxheWJhY2soKSB7Ci0gICAgICAgIGlmIChtTWVkaWFDb250cm9sbGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBQbGF5YmFja0luZm8gcGxheWJhY2tJbmZvID0gbU1lZGlhQ29udHJvbGxlci5nZXRQbGF5YmFja0luZm8oKTsKLSAgICAgICAgcmV0dXJuIHBsYXliYWNrSW5mbyAhPSBudWxsCi0gICAgICAgICAgICAgICAgJiYgcGxheWJhY2tJbmZvLmdldFBsYXliYWNrVHlwZSgpID09IFBsYXliYWNrSW5mby5QTEFZQkFDS19UWVBFX1JFTU9URTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgc2VsZWN0T3JEZXNlbGVjdFN1YnRpdGxlKGJvb2xlYW4gc2VsZWN0KSB7Ci0gICAgICAgIGlmICghaXNJblBsYXliYWNrU3RhdGUoKSkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIGlmIChzZWxlY3QpIHsKLSAgICAgICAgICAgIGlmIChtU3VidGl0bGVUcmFja0luZGljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgICAgIC8vIFRPRE86IG1ha2UgdGhpcyBzZWxlY3Rpb24gZHluYW1pYwotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCA9IG1TdWJ0aXRsZVRyYWNrSW5kaWNlcy5nZXQoMCkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlQ29udHJvbGxlci5zZWxlY3RUcmFjayhtU3VidGl0bGVUcmFja0luZGljZXMuZ2V0KDApLnNlY29uZCk7Ci0gICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnNlbGVjdFRyYWNrKG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCk7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuVklTSUJMRSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAobVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ICE9IElOVkFMSURfVFJBQ0tfSU5ERVgpIHsKLSAgICAgICAgICAgICAgICBtTWVkaWFQbGF5ZXIuZGVzZWxlY3RUcmFjayhtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpOwotICAgICAgICAgICAgICAgIG1TZWxlY3RlZFN1YnRpdGxlVHJhY2tJbmRleCA9IElOVkFMSURfVFJBQ0tfSU5ERVg7Ci0gICAgICAgICAgICAgICAgbVN1YnRpdGxlVmlldy5zZXRWaXNpYmlsaXR5KFZpZXcuR09ORSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZXh0cmFjdFRyYWNrcygpIHsKLSAgICAgICAgTGlzdDxNZWRpYVBsYXllcjIuVHJhY2tJbmZvPiB0cmFja0luZm9zID0gbU1lZGlhUGxheWVyLmdldFRyYWNrSW5mbygpOwotICAgICAgICBtVmlkZW9UcmFja0luZGljZXMgPSBuZXcgQXJyYXlMaXN0PD4oKTsKLSAgICAgICAgbUF1ZGlvVHJhY2tJbmRpY2VzID0gbmV3IEFycmF5TGlzdDw+KCk7Ci0gICAgICAgIG1TdWJ0aXRsZVRyYWNrSW5kaWNlcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBtU3VidGl0bGVDb250cm9sbGVyLnJlc2V0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHJhY2tJbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgaW50IHRyYWNrVHlwZSA9IHRyYWNrSW5mb3MuZ2V0KGkpLmdldFRyYWNrVHlwZSgpOwotICAgICAgICAgICAgaWYgKHRyYWNrVHlwZSA9PSBNZWRpYVBsYXllcjIuVHJhY2tJbmZvLk1FRElBX1RSQUNLX1RZUEVfVklERU8pIHsKLSAgICAgICAgICAgICAgICBtVmlkZW9UcmFja0luZGljZXMuYWRkKGkpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0cmFja1R5cGUgPT0gTWVkaWFQbGF5ZXIyLlRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX0FVRElPKSB7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvVHJhY2tJbmRpY2VzLmFkZChpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodHJhY2tUeXBlID09IE1lZGlhUGxheWVyMi5UcmFja0luZm8uTUVESUFfVFJBQ0tfVFlQRV9TVUJUSVRMRQotICAgICAgICAgICAgICAgICAgICB8fCB0cmFja1R5cGUgPT0gTWVkaWFQbGF5ZXIyLlRyYWNrSW5mby5NRURJQV9UUkFDS19UWVBFX1RJTUVEVEVYVCkgewotICAgICAgICAgICAgICAgIFN1YnRpdGxlVHJhY2sgdHJhY2sgPSBtU3VidGl0bGVDb250cm9sbGVyLmFkZFRyYWNrKHRyYWNrSW5mb3MuZ2V0KGkpLmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgICAgICBpZiAodHJhY2sgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICBtU3VidGl0bGVUcmFja0luZGljZXMuYWRkKG5ldyBQYWlyPD4oaSwgdHJhY2spKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gU2VsZWN0IGZpcnN0IHRyYWNrcyBhcyBkZWZhdWx0Ci0gICAgICAgIGlmIChtVmlkZW9UcmFja0luZGljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbVNlbGVjdGVkVmlkZW9UcmFja0luZGV4ID0gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAobUF1ZGlvVHJhY2tJbmRpY2VzLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKG1WaWRlb1RyYWNrSW5kaWNlcy5zaXplKCkgPT0gMCAmJiBtQXVkaW9UcmFja0luZGljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbUlzTXVzaWNNZWRpYVR5cGUgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgQnVuZGxlIGRhdGEgPSBuZXcgQnVuZGxlKCk7Ci0gICAgICAgIGRhdGEucHV0SW50KE1lZGlhQ29udHJvbFZpZXcySW1wbC5LRVlfVklERU9fVFJBQ0tfQ09VTlQsIG1WaWRlb1RyYWNrSW5kaWNlcy5zaXplKCkpOwotICAgICAgICBkYXRhLnB1dEludChNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX0FVRElPX1RSQUNLX0NPVU5ULCBtQXVkaW9UcmFja0luZGljZXMuc2l6ZSgpKTsKLSAgICAgICAgZGF0YS5wdXRJbnQoTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TVUJUSVRMRV9UUkFDS19DT1VOVCwgbVN1YnRpdGxlVHJhY2tJbmRpY2VzLnNpemUoKSk7Ci0gICAgICAgIGlmIChtU3VidGl0bGVUcmFja0luZGljZXMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgc2VsZWN0T3JEZXNlbGVjdFN1YnRpdGxlKG1TdWJ0aXRsZUVuYWJsZWQpOwotICAgICAgICB9Ci0gICAgICAgIG1NZWRpYVNlc3Npb24uc2VuZFNlc3Npb25FdmVudChNZWRpYUNvbnRyb2xWaWV3MkltcGwuRVZFTlRfVVBEQVRFX1RSQUNLX1NUQVRVUywgZGF0YSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RNZXRhZGF0YSgpIHsKLSAgICAgICAgLy8gR2V0IGFuZCBzZXQgZHVyYXRpb24gYW5kIHRpdGxlIHZhbHVlcyBhcyBNZWRpYU1ldGFkYXRhIGZvciBNZWRpYUNvbnRyb2xWaWV3MgotICAgICAgICBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIgYnVpbGRlciA9IG5ldyBNZWRpYU1ldGFkYXRhLkJ1aWxkZXIoKTsKLSAgICAgICAgaWYgKG1NZXRhZGF0YSAhPSBudWxsICYmIG1NZXRhZGF0YS5oYXMoTWV0YWRhdGEuVElUTEUpKSB7Ci0gICAgICAgICAgICBtVGl0bGUgPSBtTWV0YWRhdGEuZ2V0U3RyaW5nKE1ldGFkYXRhLlRJVExFKTsKLSAgICAgICAgfQotICAgICAgICBidWlsZGVyLnB1dFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSwgbVRpdGxlKTsKLSAgICAgICAgYnVpbGRlci5wdXRMb25nKAotICAgICAgICAgICAgICAgIE1lZGlhTWV0YWRhdGEuTUVUQURBVEFfS0VZX0RVUkFUSU9OLCBtTWVkaWFQbGF5ZXIuZ2V0RHVyYXRpb24oKSk7Ci0KLSAgICAgICAgaWYgKG1NZWRpYVNlc3Npb24gIT0gbnVsbCkgewotICAgICAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRNZXRhZGF0YShidWlsZGVyLmJ1aWxkKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGV4dHJhY3RBdWRpb01ldGFkYXRhKCkgewotICAgICAgICBpZiAoIW1Jc011c2ljTWVkaWFUeXBlKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBtUmVzb3VyY2VzID0gQXBpSGVscGVyLmdldExpYlJlc291cmNlcyhtSW5zdGFuY2UuZ2V0Q29udGV4dCgpKTsKLSAgICAgICAgbU1hbmFnZXIgPSAoV2luZG93TWFuYWdlcikgbUluc3RhbmNlLmdldENvbnRleHQoKS5nZXRBcHBsaWNhdGlvbkNvbnRleHQoKQotICAgICAgICAgICAgICAgIC5nZXRTeXN0ZW1TZXJ2aWNlKENvbnRleHQuV0lORE9XX1NFUlZJQ0UpOwotCi0gICAgICAgIGJ5dGVbXSBhbGJ1bSA9IG1SZXRyaWV2ZXIuZ2V0RW1iZWRkZWRQaWN0dXJlKCk7Ci0gICAgICAgIGlmIChhbGJ1bSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBCaXRtYXAgYml0bWFwID0gQml0bWFwRmFjdG9yeS5kZWNvZGVCeXRlQXJyYXkoYWxidW0sIDAsIGFsYnVtLmxlbmd0aCk7Ci0gICAgICAgICAgICBtTXVzaWNBbGJ1bURyYXdhYmxlID0gbmV3IEJpdG1hcERyYXdhYmxlKGJpdG1hcCk7Ci0KLSAgICAgICAgICAgIC8vIFRPRE86IHJlcGxhY2Ugd2l0aCB2aXN1YWxpemVyCi0gICAgICAgICAgICBQYWxldHRlLmdlbmVyYXRlQXN5bmMoYml0bWFwLCBuZXcgUGFsZXR0ZS5QYWxldHRlQXN5bmNMaXN0ZW5lcigpIHsKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkdlbmVyYXRlZChQYWxldHRlIHBhbGV0dGUpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogYWRkIGRvbWluYW50IGNvbG9yIGZvciBkZWZhdWx0IGFsYnVtIGltYWdlLgotICAgICAgICAgICAgICAgICAgICBtRG9taW5hbnRDb2xvciA9IHBhbGV0dGUuZ2V0RG9taW5hbnRDb2xvcigwKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NdXNpY1ZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU11c2ljVmlldy5zZXRCYWNrZ3JvdW5kQ29sb3IobURvbWluYW50Q29sb3IpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTXVzaWNBbGJ1bURyYXdhYmxlID0gbVJlc291cmNlcy5nZXREcmF3YWJsZShSLmRyYXdhYmxlLmljX2RlZmF1bHRfYWxidW1faW1hZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nIHRpdGxlID0gbVJldHJpZXZlci5leHRyYWN0TWV0YWRhdGEoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfVElUTEUpOwotICAgICAgICBpZiAodGl0bGUgIT0gbnVsbCkgewotICAgICAgICAgICAgbU11c2ljVGl0bGVUZXh0ID0gdGl0bGU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtTXVzaWNUaXRsZVRleHQgPSBtUmVzb3VyY2VzLmdldFN0cmluZyhSLnN0cmluZy5tY3YyX211c2ljX3RpdGxlX3Vua25vd25fdGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBTdHJpbmcgYXJ0aXN0ID0gbVJldHJpZXZlci5leHRyYWN0TWV0YWRhdGEoTWVkaWFNZXRhZGF0YVJldHJpZXZlci5NRVRBREFUQV9LRVlfQVJUSVNUKTsKLSAgICAgICAgaWYgKGFydGlzdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICBtTXVzaWNBcnRpc3RUZXh0ID0gYXJ0aXN0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbU11c2ljQXJ0aXN0VGV4dCA9IG1SZXNvdXJjZXMuZ2V0U3RyaW5nKFIuc3RyaW5nLm1jdjJfbXVzaWNfYXJ0aXN0X3Vua25vd25fdGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTZW5kIHRpdGxlIGFuZCBhcnRpc3Qgc3RyaW5nIHRvIE1lZGlhQ29udHJvbFZpZXcyCi0gICAgICAgIE1lZGlhTWV0YWRhdGEuQnVpbGRlciBidWlsZGVyID0gbmV3IE1lZGlhTWV0YWRhdGEuQnVpbGRlcigpOwotICAgICAgICBidWlsZGVyLnB1dFN0cmluZyhNZWRpYU1ldGFkYXRhLk1FVEFEQVRBX0tFWV9USVRMRSwgbU11c2ljVGl0bGVUZXh0KTsKLSAgICAgICAgYnVpbGRlci5wdXRTdHJpbmcoTWVkaWFNZXRhZGF0YS5NRVRBREFUQV9LRVlfQVJUSVNULCBtTXVzaWNBcnRpc3RUZXh0KTsKLSAgICAgICAgbU1lZGlhU2Vzc2lvbi5zZXRNZXRhZGF0YShidWlsZGVyLmJ1aWxkKCkpOwotCi0gICAgICAgIC8vIERpc3BsYXkgRW1iZWRkZWQgbW9kZSBhcyBkZWZhdWx0Ci0gICAgICAgIG1JbnN0YW5jZS5yZW1vdmVWaWV3KG1TdXJmYWNlVmlldyk7Ci0gICAgICAgIG1JbnN0YW5jZS5yZW1vdmVWaWV3KG1UZXh0dXJlVmlldyk7Ci0gICAgICAgIGluZmxhdGVNdXNpY1ZpZXcoUi5sYXlvdXQuZW1iZWRkZWRfbXVzaWMpOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IHJldHJpZXZlT3JpZW50YXRpb24oKSB7Ci0gICAgICAgIERpc3BsYXlNZXRyaWNzIGRtID0gUmVzb3VyY2VzLmdldFN5c3RlbSgpLmdldERpc3BsYXlNZXRyaWNzKCk7Ci0gICAgICAgIGludCB3aWR0aCA9IGRtLndpZHRoUGl4ZWxzOwotICAgICAgICBpbnQgaGVpZ2h0ID0gZG0uaGVpZ2h0UGl4ZWxzOwotCi0gICAgICAgIHJldHVybiAoaGVpZ2h0ID4gd2lkdGgpID8KLSAgICAgICAgICAgICAgICBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX1BPUlRSQUlUIDoKLSAgICAgICAgICAgICAgICBBY3Rpdml0eUluZm8uU0NSRUVOX09SSUVOVEFUSU9OX0xBTkRTQ0FQRTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgaW5mbGF0ZU11c2ljVmlldyhpbnQgbGF5b3V0SWQpIHsKLSAgICAgICAgbUluc3RhbmNlLnJlbW92ZVZpZXcobU11c2ljVmlldyk7Ci0KLSAgICAgICAgVmlldyB2ID0gQXBpSGVscGVyLmluZmxhdGVMaWJMYXlvdXQobUluc3RhbmNlLmdldENvbnRleHQoKSwgbGF5b3V0SWQpOwotICAgICAgICB2LnNldEJhY2tncm91bmRDb2xvcihtRG9taW5hbnRDb2xvcik7Ci0KLSAgICAgICAgSW1hZ2VWaWV3IGFsYnVtVmlldyA9IHYuZmluZFZpZXdCeUlkKFIuaWQuYWxidW0pOwotICAgICAgICBpZiAoYWxidW1WaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFsYnVtVmlldy5zZXRJbWFnZURyYXdhYmxlKG1NdXNpY0FsYnVtRHJhd2FibGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgVGV4dFZpZXcgdGl0bGVWaWV3ID0gdi5maW5kVmlld0J5SWQoUi5pZC50aXRsZSk7Ci0gICAgICAgIGlmICh0aXRsZVZpZXcgIT0gbnVsbCkgewotICAgICAgICAgICAgdGl0bGVWaWV3LnNldFRleHQobU11c2ljVGl0bGVUZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFRleHRWaWV3IGFydGlzdFZpZXcgPSB2LmZpbmRWaWV3QnlJZChSLmlkLmFydGlzdCk7Ci0gICAgICAgIGlmIChhcnRpc3RWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgIGFydGlzdFZpZXcuc2V0VGV4dChtTXVzaWNBcnRpc3RUZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIG1NdXNpY1ZpZXcgPSB2OwotICAgICAgICBtSW5zdGFuY2UuYWRkVmlldyhtTXVzaWNWaWV3LCAwKTsKLSAgICB9Ci0KLSAgICBPblN1YnRpdGxlRGF0YUxpc3RlbmVyIG1TdWJ0aXRsZUxpc3RlbmVyID0KLSAgICAgICAgICAgIG5ldyBPblN1YnRpdGxlRGF0YUxpc3RlbmVyKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uU3VidGl0bGVEYXRhKE1lZGlhUGxheWVyMiBtcCwgU3VidGl0bGVEYXRhIGRhdGEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblN1YnRpdGxlRGF0YSgpOiBnZXRUcmFja0luZGV4OiAiICsgZGF0YS5nZXRUcmFja0luZGV4KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBnZXRDdXJyZW50UG9zaXRpb246ICIgKyBtcC5nZXRDdXJyZW50UG9zaXRpb24oKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIGdldFN0YXJ0VGltZVVzKCk6ICIgKyBkYXRhLmdldFN0YXJ0VGltZVVzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCBkaWZmOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgKGRhdGEuZ2V0U3RhcnRUaW1lVXMoKS8xMDAwIC0gbXAuZ2V0Q3VycmVudFBvc2l0aW9uKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIm1zLCBnZXREdXJhdGlvblVzKCk6ICIgKyBkYXRhLmdldER1cmF0aW9uVXMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOwotCi0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4ID0gZGF0YS5nZXRUcmFja0luZGV4KCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPSBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIm9uU3VidGl0bGVEYXRhKCk6IGdldFRyYWNrSW5kZXg6ICIgKyBkYXRhLmdldFRyYWNrSW5kZXgoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIsIHNlbGVjdGVkIHRyYWNrIGluZGV4OiAiICsgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBmb3IgKFBhaXI8SW50ZWdlciwgU3VidGl0bGVUcmFjaz4gcCA6IG1TdWJ0aXRsZVRyYWNrSW5kaWNlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHAuZmlyc3QgPT0gaW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJ0aXRsZVRyYWNrIHRyYWNrID0gcC5zZWNvbmQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2sub25EYXRhKGRhdGEpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgIE1lZGlhUGxheWVyMkV2ZW50Q2FsbGJhY2sgbU1lZGlhUGxheWVyMkNhbGxiYWNrID0KLSAgICAgICAgICAgIG5ldyBNZWRpYVBsYXllcjJFdmVudENhbGxiYWNrKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVmlkZW9TaXplQ2hhbmdlZCgKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkLCBpbnQgd2lkdGgsIGludCBoZWlnaHQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblZpZGVvU2l6ZUNoYW5nZWQoKTogc2l6ZTogIiArIHdpZHRoICsgIi8iICsgaGVpZ2h0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCA9IG1wLmdldFZpZGVvV2lkdGgoKTsKLSAgICAgICAgICAgICAgICAgICAgbVZpZGVvSGVpZ2h0ID0gbXAuZ2V0VmlkZW9IZWlnaHQoKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblZpZGVvU2l6ZUNoYW5nZWQoKTogbVZpZGVvU2l6ZToiICsgbVZpZGVvV2lkdGggKyAiLyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtVmlkZW9IZWlnaHQpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtVmlkZW9XaWR0aCAhPSAwICYmIG1WaWRlb0hlaWdodCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2UucmVxdWVzdExheW91dCgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVE9ETzogUmVtb3ZlIHRpbWVkIHRleHQgcmVsYXRlZCBjb2RlIGxhdGVyIG9uY2UgcmVsZXZhbnQgUmVuZGVyZXIgaXMgZGVmaW5lZC4KLSAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIGp1c3QgZm9yIGRlYnVnZ2luZyBwdXJwb3NlLgotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uVGltZWRUZXh0KAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIFRpbWVkVGV4dCB0ZXh0KSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJUaW1lZFRleHQ6ICIgKyB0ZXh0LmdldFRleHQoKSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgcHVibGljIHZvaWQgb25JbmZvKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCB3aGF0LCBpbnQgZXh0cmEpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fTUVUQURBVEFfVVBEQVRFKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBleHRyYWN0VHJhY2tzKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAod2hhdCA9PSBNZWRpYVBsYXllcjIuTUVESUFfSU5GT19QUkVQQVJFRCkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vblByZXBhcmVkKG1wLCBkc2QpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fUExBWUJBQ0tfQ09NUExFVEUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMub25Db21wbGV0aW9uKG1wLCBkc2QpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHdoYXQgPT0gTWVkaWFQbGF5ZXIyLk1FRElBX0lORk9fQlVGRkVSSU5HX1VQREFURSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5vbkJ1ZmZlcmluZ1VwZGF0ZShtcCwgZHNkLCBleHRyYSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBvbkVycm9yKAotICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCBmcmFtZXdvcmtFcnIsIGludCBpbXBsRXJyKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAiRXJyb3I6ICIgKyBmcmFtZXdvcmtFcnIgKyAiLCIgKyBpbXBsRXJyKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFN0YXRlID0gU1RBVEVfRVJST1I7Ci0gICAgICAgICAgICAgICAgICAgIG1UYXJnZXRTdGF0ZSA9IFNUQVRFX0VSUk9SOwotICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NZWRpYUNvbnRyb2xWaWV3ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xWaWV3LnNldFZpc2liaWxpdHkoVmlldy5HT05FKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIG9uQ2FsbENvbXBsZXRlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCwgaW50IHdoYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhdHVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICh3aGF0ID09IE1lZGlhUGxheWVyMi5DQUxMX0NPTVBMRVRFRF9TRUVLX1RPICYmIHN0YXR1cyA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB1cGRhdGVQbGF5YmFja1N0YXRlKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgb25QcmVwYXJlZChNZWRpYVBsYXllcjIgbXAsIERhdGFTb3VyY2VEZXNjIGRzZCkgewotICAgICAgICAgICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIExvZy5kKFRBRywgIk9uUHJlcGFyZWRMaXN0ZW5lcigpLiBtQ3VycmVudFN0YXRlPSIgKyBtQ3VycmVudFN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QUkVQQVJFRDsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ3JlYXRlIGFuZCBzZXQgcGxheWJhY2sgc3RhdGUgZm9yIE1lZGlhQ29udHJvbFZpZXcyCi0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLQotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBjaGFuZ2UgdGhpcyB0byBzZW5kIFRyYWNrSW5mb3MgdG8gTWVkaWFDb250cm9sVmlldzIKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogY3JlYXRlIE1lZGlhU2Vzc2lvbiB3aGVuIGluaXRpYWxpemluZyBWaWRlb1ZpZXcyCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTWVkaWFTZXNzaW9uICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RUcmFja3MoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhY3RNZXRhZGF0YSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdEF1ZGlvTWV0YWRhdGEoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIGlmIChtTWVkaWFDb250cm9sVmlldyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sVmlldy5zZXRFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGludCB2aWRlb1dpZHRoID0gbXAuZ2V0VmlkZW9XaWR0aCgpOwotICAgICAgICAgICAgICAgICAgICBpbnQgdmlkZW9IZWlnaHQgPSBtcC5nZXRWaWRlb0hlaWdodCgpOwotCi0gICAgICAgICAgICAgICAgICAgIC8vIG1TZWVrV2hlblByZXBhcmVkIG1heSBiZSBjaGFuZ2VkIGFmdGVyIHNlZWtUbygpIGNhbGwKLSAgICAgICAgICAgICAgICAgICAgbG9uZyBzZWVrVG9Qb3NpdGlvbiA9IG1TZWVrV2hlblByZXBhcmVkOwotICAgICAgICAgICAgICAgICAgICBpZiAoc2Vla1RvUG9zaXRpb24gIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU1lZGlhQ29udHJvbGxlci5nZXRUcmFuc3BvcnRDb250cm9scygpLnNlZWtUbyhzZWVrVG9Qb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBpZiAodmlkZW9XaWR0aCAhPSAwICYmIHZpZGVvSGVpZ2h0ICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWRlb1dpZHRoICE9IG1WaWRlb1dpZHRoIHx8IHZpZGVvSGVpZ2h0ICE9IG1WaWRlb0hlaWdodCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChERUJVRykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICJPblByZXBhcmVkTGlzdGVuZXIoKSA6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2cuaShUQUcsICIgdmlkZW8gc2l6ZTogIiArIHZpZGVvV2lkdGggKyAiLyIgKyB2aWRlb0hlaWdodCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIiBtZWFzdXJlZFNpemU6ICIgKyBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRXaWR0aCgpICsgIi8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtSW5zdGFuY2UuZ2V0TWVhc3VyZWRIZWlnaHQoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvZy5pKFRBRywgIiB2aWV3U2l6ZTogIiArIG1JbnN0YW5jZS5nZXRXaWR0aCgpICsgIi8iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyBtSW5zdGFuY2UuZ2V0SGVpZ2h0KCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVmlkZW9XaWR0aCA9IHZpZGVvV2lkdGg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVZpZGVvSGVpZ2h0ID0gdmlkZW9IZWlnaHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLnJlcXVlc3RMYXlvdXQoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG5lZWRUb1N0YXJ0KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTWVkaWFDb250cm9sbGVyLmdldFRyYW5zcG9ydENvbnRyb2xzKCkucGxheSgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB0aGUgdmlkZW8gc2l6ZSB5ZXQsIGJ1dCBzaG91bGQgc3RhcnQgYW55d2F5LgotICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHZpZGVvIHNpemUgbWlnaHQgYmUgcmVwb3J0ZWQgdG8gdXMgbGF0ZXIuCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobmVlZFRvU3RhcnQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYUNvbnRyb2xsZXIuZ2V0VHJhbnNwb3J0Q29udHJvbHMoKS5wbGF5KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgb25Db21wbGV0aW9uKE1lZGlhUGxheWVyMiBtcCwgRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QTEFZQkFDS19DT01QTEVURUQ7Ci0gICAgICAgICAgICAgICAgICAgIG1UYXJnZXRTdGF0ZSA9IFNUQVRFX1BMQVlCQUNLX0NPTVBMRVRFRDsKLSAgICAgICAgICAgICAgICAgICAgdXBkYXRlUGxheWJhY2tTdGF0ZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobUF1ZGlvRm9jdXNUeXBlICE9IEF1ZGlvTWFuYWdlci5BVURJT0ZPQ1VTX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1BdWRpb01hbmFnZXIuYWJhbmRvbkF1ZGlvRm9jdXMobnVsbCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwcml2YXRlIHZvaWQgb25CdWZmZXJpbmdVcGRhdGUoTWVkaWFQbGF5ZXIyIG1wLCBEYXRhU291cmNlRGVzYyBkc2QsIGludCBwZXJjZW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50QnVmZmVyUGVyY2VudGFnZSA9IHBlcmNlbnQ7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9OwotCi0gICAgcHJpdmF0ZSBjbGFzcyBNZWRpYVNlc3Npb25DYWxsYmFjayBleHRlbmRzIE1lZGlhU2Vzc2lvbi5DYWxsYmFjayB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkNvbW1hbmQoU3RyaW5nIGNvbW1hbmQsIEJ1bmRsZSBhcmdzLCBSZXN1bHRSZWNlaXZlciByZWNlaXZlcikgewotICAgICAgICAgICAgaWYgKGlzUmVtb3RlUGxheWJhY2soKSkgewotICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vbkNvbW1hbmQoY29tbWFuZCwgYXJncywgcmVjZWl2ZXIpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmQpIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9TSE9XX1NVQlRJVExFOgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YnRpdGxlSW5kZXggPSBhcmdzLmdldEludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9TRUxFQ1RFRF9TVUJUSVRMRV9JTkRFWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSU5WQUxJRF9UUkFDS19JTkRFWCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3VidGl0bGVJbmRleCAhPSBJTlZBTElEX1RSQUNLX0lOREVYKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1YnRpdGxlVHJhY2tJbmRleCA9IG1TdWJ0aXRsZVRyYWNrSW5kaWNlcy5nZXQoc3VidGl0bGVJbmRleCkuZmlyc3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN1YnRpdGxlVHJhY2tJbmRleCAhPSBtU2VsZWN0ZWRTdWJ0aXRsZVRyYWNrSW5kZXgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlbGVjdGVkU3VidGl0bGVUcmFja0luZGV4ID0gc3VidGl0bGVUcmFja0luZGV4OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc2V0U3VidGl0bGVFbmFibGVkKHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX0hJREVfU1VCVElUTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc2V0U3VidGl0bGVFbmFibGVkKGZhbHNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NFVF9GVUxMU0NSRUVOOgotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1GdWxsU2NyZWVuUmVxdWVzdExpc3RlbmVyICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnVsbFNjcmVlblJlcXVlc3RMaXN0ZW5lci5vbkZ1bGxTY3JlZW5SZXF1ZXN0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5nZXRCb29sZWFuKE1lZGlhQ29udHJvbFZpZXcySW1wbC5BUkdVTUVOVF9LRVlfRlVMTFNDUkVFTikpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfU0VMRUNUX0FVRElPX1RSQUNLOgotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvSW5kZXggPSBhcmdzLmdldEludChNZWRpYUNvbnRyb2xWaWV3MkltcGwuS0VZX1NFTEVDVEVEX0FVRElPX0lOREVYLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJTlZBTElEX1RSQUNLX0lOREVYKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhdWRpb0luZGV4ICE9IElOVkFMSURfVFJBQ0tfSU5ERVgpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9UcmFja0luZGV4ID0gbUF1ZGlvVHJhY2tJbmRpY2VzLmdldChhdWRpb0luZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXVkaW9UcmFja0luZGV4ICE9IG1TZWxlY3RlZEF1ZGlvVHJhY2tJbmRleCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXggPSBhdWRpb1RyYWNrSW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZWxlY3RUcmFjayhtU2VsZWN0ZWRBdWRpb1RyYWNrSW5kZXgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIE1lZGlhQ29udHJvbFZpZXcySW1wbC5DT01NQU5EX1NFVF9QTEFZQkFDS19TUEVFRDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNwZWVkID0gYXJncy5nZXRGbG9hdCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVkaWFDb250cm9sVmlldzJJbXBsLktFWV9QTEFZQkFDS19TUEVFRCwgSU5WQUxJRF9TUEVFRCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3BlZWQgIT0gSU5WQUxJRF9TUEVFRCAmJiBzcGVlZCAhPSBtU3BlZWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtSW5zdGFuY2Uuc2V0U3BlZWQoc3BlZWQpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1TcGVlZCA9IHNwZWVkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb250cm9sVmlldzJJbXBsLkNPTU1BTkRfTVVURToKLSAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVMZXZlbCA9IG1BdWRpb01hbmFnZXIuZ2V0U3RyZWFtVm9sdW1lKEF1ZGlvTWFuYWdlci5TVFJFQU1fTVVTSUMpOwotICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvTWFuYWdlci5zZXRTdHJlYW1Wb2x1bWUoQXVkaW9NYW5hZ2VyLlNUUkVBTV9NVVNJQywgMCwgMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvbnRyb2xWaWV3MkltcGwuQ09NTUFORF9VTk1VVEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9NYW5hZ2VyLnNldFN0cmVhbVZvbHVtZShBdWRpb01hbmFnZXIuU1RSRUFNX01VU0lDLCBtVm9sdW1lTGV2ZWwsIDApOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvbkN1c3RvbUFjdGlvbihTdHJpbmcgYWN0aW9uLCBCdW5kbGUgZXh0cmFzKSB7Ci0gICAgICAgICAgICBtQ3VzdG9tQWN0aW9uTGlzdGVuZXJSZWNvcmQuZmlyc3QuZXhlY3V0ZSgoKSAtPgotICAgICAgICAgICAgICAgICAgICBtQ3VzdG9tQWN0aW9uTGlzdGVuZXJSZWNvcmQuc2Vjb25kLm9uQ3VzdG9tQWN0aW9uKGFjdGlvbiwgZXh0cmFzKSk7Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheSgpIHsKLSAgICAgICAgICAgIGlmIChpc0luUGxheWJhY2tTdGF0ZSgpICYmIChtQ3VycmVudFZpZXcuaGFzQXZhaWxhYmxlU3VyZmFjZSgpIHx8IG1Jc011c2ljTWVkaWFUeXBlKSkgewotICAgICAgICAgICAgICAgIGlmIChpc1JlbW90ZVBsYXliYWNrKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbVJvdXRlUGxheWVyLm9uUGxheSgpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGx5U3BlZWQoKTsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnBsYXkoKTsKLSAgICAgICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbUN1cnJlbnRTdGF0ZSA9IFNUQVRFX1BMQVlJTkc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9QTEFZSU5HOwotICAgICAgICAgICAgaWYgKERFQlVHKSB7Ci0gICAgICAgICAgICAgICAgTG9nLmQoVEFHLCAib25QbGF5KCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblBhdXNlKCkgewotICAgICAgICAgICAgaWYgKGlzSW5QbGF5YmFja1N0YXRlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vblBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChtTWVkaWFQbGF5ZXIuaXNQbGF5aW5nKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgbU1lZGlhUGxheWVyLnBhdXNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIG1DdXJyZW50U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICAgICAgICAgIHVwZGF0ZVBsYXliYWNrU3RhdGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtVGFyZ2V0U3RhdGUgPSBTVEFURV9QQVVTRUQ7Ci0gICAgICAgICAgICBpZiAoREVCVUcpIHsKLSAgICAgICAgICAgICAgICBMb2cuZChUQUcsICJvblBhdXNlKCkuIG1DdXJyZW50U3RhdGU9IiArIG1DdXJyZW50U3RhdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgbVRhcmdldFN0YXRlPSIgKyBtVGFyZ2V0U3RhdGUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2hvd0NvbnRyb2xsZXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBvblNlZWtUbyhsb25nIHBvcykgewotICAgICAgICAgICAgaWYgKGlzSW5QbGF5YmFja1N0YXRlKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoaXNSZW1vdGVQbGF5YmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1Sb3V0ZVBsYXllci5vblNlZWtUbyhwb3MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1NZWRpYVBsYXllci5zZWVrVG8ocG9zLCBNZWRpYVBsYXllcjIuU0VFS19QUkVWSU9VU19TWU5DKTsKLSAgICAgICAgICAgICAgICAgICAgbVNlZWtXaGVuUHJlcGFyZWQgPSAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbVNlZWtXaGVuUHJlcGFyZWQgPSBwb3M7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uU3RvcCgpIHsKLSAgICAgICAgICAgIGlmIChpc1JlbW90ZVBsYXliYWNrKCkpIHsKLSAgICAgICAgICAgICAgICBtUm91dGVQbGF5ZXIub25TdG9wKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJlc2V0UGxheWVyKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzaG93Q29udHJvbGxlcigpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvcGFja2FnZXMvTWVkaWFDb21wb25lbnRzL3NyYy9jb20vYW5kcm9pZC93aWRnZXQvVmlkZW9WaWV3SW50ZXJmYWNlLmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXdJbnRlcmZhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU0ZDQ3ZS4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWRlb1ZpZXdJbnRlcmZhY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2UgY29tLmFuZHJvaWQud2lkZ2V0OwotCi1pbXBvcnQgYW5kcm9pZC5hbm5vdGF0aW9uLk5vbk51bGw7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXllcjI7Ci1pbXBvcnQgYW5kcm9pZC52aWV3LlZpZXc7Ci0KLWludGVyZmFjZSBWaWRlb1ZpZXdJbnRlcmZhY2UgewotICAgIC8qKgotICAgICAqIEFzc2lnbnMgdGhlIHZpZXcncyBzdXJmYWNlIHRvIHRoZSBnaXZlbiBNZWRpYVBsYXllcjIgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbXAgTWVkaWFQbGF5ZXIyCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdXJmYWNlIGlzIHN1Y2Nlc3NmdWxseSBhc3NpZ25lZCwgZmFsc2UgaWYgbm90LiBJdCB3aWxsIGZhaWwgdG8gYXNzaWduCi0gICAgICogICAgICAgICBpZiBhbnkgb2YgTWVkaWFQbGF5ZXIyIG9yIHN1cmZhY2UgaXMgdW5hdmFpbGFibGUuCi0gICAgICovCi0gICAgYm9vbGVhbiBhc3NpZ25TdXJmYWNlVG9NZWRpYVBsYXllcihNZWRpYVBsYXllcjIgbXApOwotICAgIHZvaWQgc2V0U3VyZmFjZUxpc3RlbmVyKFN1cmZhY2VMaXN0ZW5lciBsKTsKLSAgICBpbnQgZ2V0Vmlld1R5cGUoKTsKLSAgICB2b2lkIHNldE1lZGlhUGxheWVyKE1lZGlhUGxheWVyMiBtcCk7Ci0KLSAgICAvKioKLSAgICAgKiBUYWtlcyBvdmVyIG9sZFZpZXcuIEl0IG1lYW5zIHRoYXQgdGhlIE1lZGlhUGxheWVyMiB3aWxsIHN0YXJ0IHJlbmRlcmluZyBvbiB0aGlzIHZpZXcuCi0gICAgICogVGhlIHZpc2liaWxpdHkgb2Ygb2xkVmlldyB3aWxsIGJlIHNldCBhcyB7QGxpbmsgVmlldy5HT05FfS4gSWYgdGhlIHZpZXcgZG9lc24ndCBoYXZlIGEKLSAgICAgKiBNZWRpYVBsYXllcjIgaW5zdGFuY2Ugb3IgaXRzIHN1cmZhY2UgaXMgbm90IGF2YWlsYWJsZSwgdGhlIGFjdHVhbCBleGVjdXRpb24gaXMgZGVmZXJyZWQgdW50aWwKLSAgICAgKiBhIE1lZGlhUGxheWVyMiBpbnN0YW5jZSBpcyBzZXQgYnkge0BsaW5rICNzZXRNZWRpYVBsYXllcn0gb3IgaXRzIHN1cmZhY2UgYmVjb21lcyBhdmFpbGFibGUuCi0gICAgICoge0BsaW5rIFN1cmZhY2VMaXN0ZW5lci5vblN1cmZhY2VUYWtlT3ZlckRvbmV9IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIGFjdHVhbCBleGVjdXRpb24gaXMKLSAgICAgKiBkb25lLgotICAgICAqCi0gICAgICogQHBhcmFtIG9sZFZpZXcgVGhlIHZpZXcgdGhhdCBNZWRpYVBsYXllcjIgaXMgY3VycmVudGx5IHJlbmRlcmluZyBvbi4KLSAgICAgKi8KLSAgICB2b2lkIHRha2VPdmVyKEBOb25OdWxsIFZpZGVvVmlld0ludGVyZmFjZSBvbGRWaWV3KTsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlcyBpZiB0aGUgdmlldydzIHN1cmZhY2UgaXMgYXZhaWxhYmxlLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdXJmYWNlIGlzIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGhhc0F2YWlsYWJsZVN1cmZhY2UoKTsKLQotICAgIC8qKgotICAgICAqIEFuIGluc3RhbmNlIG9mIFZpZGVvVmlld0ludGVyZmFjZSBjYWxscyB0aGVzZSBzdXJmYWNlIG5vdGlmaWNhdGlvbiBtZXRob2RzIGFjY29yZGluZ2x5IGlmCi0gICAgICogYSBsaXN0ZW5lciBoYXMgYmVlbiByZWdpc3RlcmVkIHZpYSB7QGxpbmsgI3NldFN1cmZhY2VMaXN0ZW5lcihTdXJmYWNlTGlzdGVuZXIpfS4KLSAgICAgKi8KLSAgICBpbnRlcmZhY2UgU3VyZmFjZUxpc3RlbmVyIHsKLSAgICAgICAgdm9pZCBvblN1cmZhY2VDcmVhdGVkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSAgICAgICAgdm9pZCBvblN1cmZhY2VEZXN0cm95ZWQoVmlldyB2aWV3KTsKLSAgICAgICAgdm9pZCBvblN1cmZhY2VDaGFuZ2VkKFZpZXcgdmlldywgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKLSAgICAgICAgdm9pZCBvblN1cmZhY2VUYWtlT3ZlckRvbmUoVmlkZW9WaWV3SW50ZXJmYWNlIHZpZXcpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZXdHcm91cEltcGwuamF2YSBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy9zcmMvY29tL2FuZHJvaWQvd2lkZ2V0L1ZpZXdHcm91cEltcGwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEwNjgyNi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvc3JjL2NvbS9hbmRyb2lkL3dpZGdldC9WaWV3R3JvdXBJbXBsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC53aWRnZXQ7Ci0KLWltcG9ydCBhbmRyb2lkLm1lZGlhLnVwZGF0ZS5WaWV3R3JvdXBQcm92aWRlcjsKLWltcG9ydCBhbmRyb2lkLnV0aWwuQXR0cmlidXRlU2V0OwotaW1wb3J0IGFuZHJvaWQudmlldy5Nb3Rpb25FdmVudDsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlldzsKLWltcG9ydCBhbmRyb2lkLnZpZXcuVmlld0dyb3VwOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgVmlld0dyb3VwSW1wbCBpbXBsZW1lbnRzIFZpZXdHcm91cFByb3ZpZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIFZpZXdHcm91cFByb3ZpZGVyIG1TdXBlclByb3ZpZGVyOwotCi0gICAgcHVibGljIFZpZXdHcm91cEltcGwoVmlld0dyb3VwIGluc3RhbmNlLAotICAgICAgICAgICAgVmlld0dyb3VwUHJvdmlkZXIgc3VwZXJQcm92aWRlciwgVmlld0dyb3VwUHJvdmlkZXIgcHJpdmF0ZVByb3ZpZGVyKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyID0gc3VwZXJQcm92aWRlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkF0dGFjaGVkVG9XaW5kb3dfaW1wbCgpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25BdHRhY2hlZFRvV2luZG93X2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCkgewotICAgICAgICBtU3VwZXJQcm92aWRlci5vbkRldGFjaGVkRnJvbVdpbmRvd19pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENoYXJTZXF1ZW5jZSBnZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZXRBY2Nlc3NpYmlsaXR5Q2xhc3NOYW1lX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBvblRvdWNoRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIub25Ub3VjaEV2ZW50X2ltcGwoZXYpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG9uVHJhY2tiYWxsRXZlbnRfaW1wbChNb3Rpb25FdmVudCBldikgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIub25UcmFja2JhbGxFdmVudF9pbXBsKGV2KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvbkZpbmlzaEluZmxhdGVfaW1wbCgpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25GaW5pc2hJbmZsYXRlX2ltcGwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBzZXRFbmFibGVkX2ltcGwoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLnNldEVuYWJsZWRfaW1wbChlbmFibGVkKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblZpc2liaWxpdHlBZ2dyZWdhdGVkX2ltcGwoYm9vbGVhbiBpc1Zpc2libGUpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25WaXNpYmlsaXR5QWdncmVnYXRlZF9pbXBsKGlzVmlzaWJsZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgb25MYXlvdXRfaW1wbChib29sZWFuIGNoYW5nZWQsIGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25MYXlvdXRfaW1wbChjaGFuZ2VkLCBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b20pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG9uTWVhc3VyZV9pbXBsKGludCB3aWR0aE1lYXN1cmVTcGVjLCBpbnQgaGVpZ2h0TWVhc3VyZVNwZWMpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIub25NZWFzdXJlX2ltcGwod2lkdGhNZWFzdXJlU3BlYywgaGVpZ2h0TWVhc3VyZVNwZWMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U3VnZ2VzdGVkTWluaW11bVdpZHRoX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZXRTdWdnZXN0ZWRNaW5pbXVtV2lkdGhfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0U3VnZ2VzdGVkTWluaW11bUhlaWdodF9pbXBsKCkgewotICAgICAgICByZXR1cm4gbVN1cGVyUHJvdmlkZXIuZ2V0U3VnZ2VzdGVkTWluaW11bUhlaWdodF9pbXBsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgc2V0TWVhc3VyZWREaW1lbnNpb25faW1wbChpbnQgbWVhc3VyZWRXaWR0aCwgaW50IG1lYXN1cmVkSGVpZ2h0KSB7Ci0gICAgICAgIG1TdXBlclByb3ZpZGVyLnNldE1lYXN1cmVkRGltZW5zaW9uX2ltcGwobWVhc3VyZWRXaWR0aCwgbWVhc3VyZWRIZWlnaHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGRpc3BhdGNoVG91Y2hFdmVudF9pbXBsKE1vdGlvbkV2ZW50IGV2KSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5kaXNwYXRjaFRvdWNoRXZlbnRfaW1wbChldik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY2hlY2tMYXlvdXRQYXJhbXNfaW1wbChWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIHApIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmNoZWNrTGF5b3V0UGFyYW1zX2ltcGwocCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgZ2VuZXJhdGVEZWZhdWx0TGF5b3V0UGFyYW1zX2ltcGwoKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZW5lcmF0ZURlZmF1bHRMYXlvdXRQYXJhbXNfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWaWV3R3JvdXAuTGF5b3V0UGFyYW1zIGdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwoQXR0cmlidXRlU2V0IGF0dHJzKSB7Ci0gICAgICAgIHJldHVybiBtU3VwZXJQcm92aWRlci5nZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKGF0dHJzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVmlld0dyb3VwLkxheW91dFBhcmFtcyBnZW5lcmF0ZUxheW91dFBhcmFtc19pbXBsKFZpZXdHcm91cC5MYXlvdXRQYXJhbXMgbHApIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLmdlbmVyYXRlTGF5b3V0UGFyYW1zX2ltcGwobHApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHNob3VsZERlbGF5Q2hpbGRQcmVzc2VkU3RhdGVfaW1wbCgpIHsKLSAgICAgICAgcmV0dXJuIG1TdXBlclByb3ZpZGVyLnNob3VsZERlbGF5Q2hpbGRQcmVzc2VkU3RhdGVfaW1wbCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIG1lYXN1cmVDaGlsZFdpdGhNYXJnaW5zX2ltcGwoVmlldyBjaGlsZCwKLSAgICAgICAgaW50IHBhcmVudFdpZHRoTWVhc3VyZVNwZWMsIGludCB3aWR0aFVzZWQsIGludCBwYXJlbnRIZWlnaHRNZWFzdXJlU3BlYywgaW50IGhlaWdodFVzZWQpIHsKLSAgICAgICAgbVN1cGVyUHJvdmlkZXIubWVhc3VyZUNoaWxkV2l0aE1hcmdpbnNfaW1wbChjaGlsZCwKLSAgICAgICAgICAgICAgICBwYXJlbnRXaWR0aE1lYXN1cmVTcGVjLCB3aWR0aFVzZWQsIHBhcmVudEhlaWdodE1lYXN1cmVTcGVjLCBoZWlnaHRVc2VkKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZC5tayBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGRmZDJhLi4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSB0ZXN0cwotCi1MT0NBTF9TVEFUSUNfSkFWQV9MSUJSQVJJRVMgOj0gXAotICAgIGFuZHJvaWQudGVzdC5ydW5uZXIuc3R1YnMgXAotICAgIGFuZHJvaWQudGVzdC5iYXNlLnN0dWJzIFwKLSAgICBtb2NraXRvLXRhcmdldC1taW51cy1qdW5pdDQgXAotICAgIGp1bml0Ci0KLUxPQ0FMX1NSQ19GSUxFUyA6PSAkKGNhbGwgYWxsLWphdmEtZmlsZXMtdW5kZXIsIHNyYykKLQotTE9DQUxfUEFDS0FHRV9OQU1FIDo9IE1lZGlhQ29tcG9uZW50c1Rlc3QKLQotTE9DQUxfSU5TVFJVTUVOVEFUSU9OX0ZPUiA6PSBNZWRpYUNvbXBvbmVudHMKLQotTE9DQUxfUFJJVkFURV9QTEFURk9STV9BUElTIDo9IHRydWUKLQotTE9DQUxfQ0VSVElGSUNBVEUgOj0gcGxhdGZvcm0KLQotaW5jbHVkZSAkKEJVSUxEX1BBQ0tBR0UpCmRpZmYgLS1naXQgYS9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvQW5kcm9pZE1hbmlmZXN0LnhtbCBiL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjU1MjY1Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9BbmRyb2lkTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotCi0gICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPG1hbmlmZXN0IHhtbG5zOmFuZHJvaWQ9Imh0dHA6Ly9zY2hlbWFzLmFuZHJvaWQuY29tL2Fway9yZXMvYW5kcm9pZCIKLSAgICAgICAgICBwYWNrYWdlPSJjb20uYW5kcm9pZC5tZWRpYS50ZXN0cyI+Ci0KLSAgICA8YXBwbGljYXRpb24gYW5kcm9pZDpsYWJlbD0iTWVkaWEgQVBJIFRlc3QiPgotICAgICAgICA8dXNlcy1saWJyYXJ5IGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0LnJ1bm5lciIgLz4KLSAgICA8L2FwcGxpY2F0aW9uPgotCi0gICAgPCEtLQotICAgIFRvIHJ1biB0aGUgdGVzdHMgdXNlIHRoZSBjb21tYW5kOgotICAgICJhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyBjb20uYW5kcm9pZC5tZWRpYS50ZXN0cy9hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKLSAgICAtLT4KLSAgICA8aW5zdHJ1bWVudGF0aW9uCi0gICAgICAgIGFuZHJvaWQ6bmFtZT0iYW5kcm9pZC50ZXN0Lkluc3RydW1lbnRhdGlvblRlc3RSdW5uZXIiCi0gICAgICAgIGFuZHJvaWQ6dGFyZ2V0UGFja2FnZT0iY29tLmFuZHJvaWQubWVkaWEudXBkYXRlIgotICAgICAgICBhbmRyb2lkOmxhYmVsPSJNZWRpYSBBUEkgdGVzdCIgLz4KLQotPC9tYW5pZmVzdD4KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnRUZXN0LmphdmEgYi9wYWNrYWdlcy9NZWRpYUNvbXBvbmVudHMvdGVzdHMvc3JjL2NvbS9hbmRyb2lkL21lZGlhL1Nlc3Npb25QbGF5bGlzdEFnZW50VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZWIwODQ4Li4wMDAwMDAwCi0tLSBhL3BhY2thZ2VzL01lZGlhQ29tcG9uZW50cy90ZXN0cy9zcmMvY29tL2FuZHJvaWQvbWVkaWEvU2Vzc2lvblBsYXlsaXN0QWdlbnRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBjb20uYW5kcm9pZC5tZWRpYTsKLQotaW1wb3J0IHN0YXRpYyBvcmcubW9ja2l0by5Nb2NraXRvLio7Ci0KLWltcG9ydCBhbmRyb2lkLmNvbnRlbnQuQ29udGV4dDsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkF1ZGlvQXR0cmlidXRlczsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLkRhdGFTb3VyY2VEZXNjOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFJdGVtMjsKLWltcG9ydCBhbmRyb2lkLm1lZGlhLk1lZGlhTWV0YWRhdGEyOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFQbGF5ZXJCYXNlLlBsYXllckV2ZW50Q2FsbGJhY2s7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVBsYXlsaXN0QWdlbnQ7Ci1pbXBvcnQgYW5kcm9pZC5tZWRpYS5NZWRpYVNlc3Npb24yOwotaW1wb3J0IGFuZHJvaWQubWVkaWEuTWVkaWFTZXNzaW9uMi5PbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyOwotaW1wb3J0IGFuZHJvaWQubmV0LlVyaTsKLWltcG9ydCBhbmRyb2lkLm9zLkhhbmRsZXI7Ci1pbXBvcnQgYW5kcm9pZC5vcy5IYW5kbGVyVGhyZWFkOwotaW1wb3J0IGFuZHJvaWQudGVzdC5BbmRyb2lkVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuanVuaXQuQWZ0ZXI7Ci1pbXBvcnQgb3JnLmp1bml0LkJlZm9yZTsKLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcubW9ja2l0by5NYXRjaGVyczsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLmNvbmN1cnJlbnQuRXhlY3V0b3I7Ci0KLS8qKgotICogVGVzdHMge0BsaW5rIFNlc3Npb25QbGF5bGlzdEFnZW50fS4KLSAqLwotcHVibGljIGNsYXNzIFNlc3Npb25QbGF5bGlzdEFnZW50VGVzdCBleHRlbmRzIEFuZHJvaWRUZXN0Q2FzZSB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIFRBRyA9ICJTZXNzaW9uUGxheWxpc3RBZ2VudFRlc3QiOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBXQUlUX1RJTUVfTVMgPSAxMDAwOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX1JFUEVBVF9NT0RFID0gLTEwMDsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgSU5WQUxJRF9TSFVGRkxFX01PREUgPSAtMTAwOwotCi0gICAgcHJpdmF0ZSBIYW5kbGVyIG1IYW5kbGVyOwotICAgIHByaXZhdGUgRXhlY3V0b3IgbUhhbmRsZXJFeGVjdXRvcjsKLQotICAgIHByaXZhdGUgT2JqZWN0IG1XYWl0TG9jayA9IG5ldyBPYmplY3QoKTsKLSAgICBwcml2YXRlIENvbnRleHQgbUNvbnRleHQ7Ci0gICAgcHJpdmF0ZSBNZWRpYVNlc3Npb24ySW1wbCBtU2Vzc2lvbkltcGw7Ci0gICAgcHJpdmF0ZSBNZWRpYVBsYXllckJhc2UgbVBsYXllcjsKLSAgICBwcml2YXRlIFBsYXllckV2ZW50Q2FsbGJhY2sgbVBsYXllckV2ZW50Q2FsbGJhY2s7Ci0gICAgcHJpdmF0ZSBTZXNzaW9uUGxheWxpc3RBZ2VudCBtQWdlbnQ7Ci0gICAgcHJpdmF0ZSBPbkRhdGFTb3VyY2VNaXNzaW5nSGVscGVyIG1EYXRhU291cmNlSGVscGVyOwotICAgIHByaXZhdGUgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgbUV2ZW50Q2FsbGJhY2s7Ci0KLSAgICBwdWJsaWMgY2xhc3MgTXlQbGF5bGlzdEV2ZW50Q2FsbGJhY2sgZXh0ZW5kcyBNZWRpYVBsYXlsaXN0QWdlbnQuUGxheWxpc3RFdmVudENhbGxiYWNrIHsKLSAgICAgICAgYm9vbGVhbiBvblBsYXlsaXN0Q2hhbmdlZENhbGxlZDsKLSAgICAgICAgYm9vbGVhbiBvblBsYXlsaXN0TWV0YWRhdGFDaGFuZ2VkQ2FsbGVkOwotICAgICAgICBib29sZWFuIG9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQ7Ci0gICAgICAgIGJvb2xlYW4gb25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQ7Ci0KLSAgICAgICAgcHJpdmF0ZSBPYmplY3QgbVdhaXRMb2NrOwotCi0gICAgICAgIHB1YmxpYyBNeVBsYXlsaXN0RXZlbnRDYWxsYmFjayhPYmplY3Qgd2FpdExvY2spIHsKLSAgICAgICAgICAgIG1XYWl0TG9jayA9IHdhaXRMb2NrOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICAgICAgICBvblBsYXlsaXN0Q2hhbmdlZENhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgb25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCA9IGZhbHNlOwotICAgICAgICAgICAgb25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQgPSBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RDaGFuZ2VkKE1lZGlhUGxheWxpc3RBZ2VudCBwbGF5bGlzdEFnZW50LCBMaXN0PE1lZGlhSXRlbTI+IGxpc3QsCi0gICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgb25QbGF5bGlzdENoYW5nZWRDYWxsZWQgPSB0cnVlOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay5ub3RpZnkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIG9uUGxheWxpc3RNZXRhZGF0YUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsCi0gICAgICAgICAgICAgICAgTWVkaWFNZXRhZGF0YTIgbWV0YWRhdGEpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgb25QbGF5bGlzdE1ldGFkYXRhQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25SZXBlYXRNb2RlQ2hhbmdlZChNZWRpYVBsYXlsaXN0QWdlbnQgcGxheWxpc3RBZ2VudCwgaW50IHJlcGVhdE1vZGUpIHsKLSAgICAgICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICAgICAgb25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgb25TaHVmZmxlTW9kZUNoYW5nZWQoTWVkaWFQbGF5bGlzdEFnZW50IHBsYXlsaXN0QWdlbnQsIGludCBzaHVmZmxlTW9kZSkgewotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgICAgICBvblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgbVdhaXRMb2NrLm5vdGlmeSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIE15RGF0YVNvdXJjZUhlbHBlciBpbXBsZW1lbnRzIE9uRGF0YVNvdXJjZU1pc3NpbmdIZWxwZXIgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIERhdGFTb3VyY2VEZXNjIG9uRGF0YVNvdXJjZU1pc3NpbmcoTWVkaWFTZXNzaW9uMiBzZXNzaW9uLCBNZWRpYUl0ZW0yIGl0ZW0pIHsKLSAgICAgICAgICAgIGlmIChpdGVtLmdldE1lZGlhSWQoKS5jb250YWlucygiV0lUSE9VVF9EU0QiKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhU291cmNlRGVzYy5CdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgLnNldERhdGFTb3VyY2UoZ2V0Q29udGV4dCgpLCBVcmkucGFyc2UoImRzZDovL3Rlc3QiKSkKLSAgICAgICAgICAgICAgICAgICAgLnNldE1lZGlhSWQoaXRlbS5nZXRNZWRpYUlkKCkpCi0gICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGNsYXNzIE1vY2tQbGF5ZXIgZXh0ZW5kcyBNZWRpYVBsYXllckJhc2UgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcGxheSgpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBwcmVwYXJlKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHBhdXNlKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNraXBUb05leHQoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2Vla1RvKGxvbmcgcG9zKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIGludCBnZXRQbGF5ZXJTdGF0ZSgpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBpbnQgZ2V0QnVmZmVyaW5nU3RhdGUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRBdWRpb0F0dHJpYnV0ZXMoQXVkaW9BdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgQXVkaW9BdHRyaWJ1dGVzIGdldEF1ZGlvQXR0cmlidXRlcygpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHNldERhdGFTb3VyY2UoRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dERhdGFTb3VyY2UoRGF0YVNvdXJjZURlc2MgZHNkKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0TmV4dERhdGFTb3VyY2VzKExpc3Q8RGF0YVNvdXJjZURlc2M+IGRzZHMpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgRGF0YVNvdXJjZURlc2MgZ2V0Q3VycmVudERhdGFTb3VyY2UoKSB7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBsb29wQ3VycmVudChib29sZWFuIGxvb3ApIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBzZXRQbGF5YmFja1NwZWVkKGZsb2F0IHNwZWVkKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgc2V0UGxheWVyVm9sdW1lKGZsb2F0IHZvbHVtZSkgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyBmbG9hdCBnZXRQbGF5ZXJWb2x1bWUoKSB7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCByZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2soRXhlY3V0b3IgZSwgUGxheWVyRXZlbnRDYWxsYmFjayBjYikgewotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHVucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKFBsYXllckV2ZW50Q2FsbGJhY2sgY2IpIHsKLSAgICAgICAgfQotCi0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBjbG9zZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICB9Ci0gICAgfQotCi0gICAgQEJlZm9yZQotICAgIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIG1Db250ZXh0ID0gZ2V0Q29udGV4dCgpOwotICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciBkZXhtYWtlciBidWc6IGh0dHBzOi8vY29kZS5nb29nbGUuY29tL3AvZGV4bWFrZXIvaXNzdWVzL2RldGFpbD9pZD0yCi0gICAgICAgIC8vIERleG1ha2VyIGlzIHVzZWQgYnkgbW9ja2l0by4KLSAgICAgICAgU3lzdGVtLnNldFByb3BlcnR5KCJkZXhtYWtlci5kZXhjYWNoZSIsIG1Db250ZXh0LmdldENhY2hlRGlyKCkuZ2V0UGF0aCgpKTsKLQotICAgICAgICBIYW5kbGVyVGhyZWFkIGhhbmRsZXJUaHJlYWQgPSBuZXcgSGFuZGxlclRocmVhZCgiU2Vzc2lvblBsYXlsaXN0QWdlbnQiKTsKLSAgICAgICAgaGFuZGxlclRocmVhZC5zdGFydCgpOwotICAgICAgICBtSGFuZGxlciA9IG5ldyBIYW5kbGVyKGhhbmRsZXJUaHJlYWQuZ2V0TG9vcGVyKCkpOwotICAgICAgICBtSGFuZGxlckV4ZWN1dG9yID0gKHJ1bm5hYmxlKSAtPiB7Ci0gICAgICAgICAgICBtSGFuZGxlci5wb3N0KHJ1bm5hYmxlKTsKLSAgICAgICAgfTsKLQotICAgICAgICBtUGxheWVyID0gbW9jayhNb2NrUGxheWVyLmNsYXNzKTsKLSAgICAgICAgZG9BbnN3ZXIoaW52b2NhdGlvbiAtPiB7Ci0gICAgICAgICAgICBPYmplY3RbXSBhcmdzID0gaW52b2NhdGlvbi5nZXRBcmd1bWVudHMoKTsKLSAgICAgICAgICAgIG1QbGF5ZXJFdmVudENhbGxiYWNrID0gKFBsYXllckV2ZW50Q2FsbGJhY2spIGFyZ3NbMV07Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfSkud2hlbihtUGxheWVyKS5yZWdpc3RlclBsYXllckV2ZW50Q2FsbGJhY2soTWF0Y2hlcnMuYW55KCksIE1hdGNoZXJzLmFueSgpKTsKLQotICAgICAgICBtU2Vzc2lvbkltcGwgPSBtb2NrKE1lZGlhU2Vzc2lvbjJJbXBsLmNsYXNzKTsKLSAgICAgICAgbURhdGFTb3VyY2VIZWxwZXIgPSBuZXcgTXlEYXRhU291cmNlSGVscGVyKCk7Ci0gICAgICAgIG1BZ2VudCA9IG5ldyBTZXNzaW9uUGxheWxpc3RBZ2VudChtU2Vzc2lvbkltcGwsIG1QbGF5ZXIpOwotICAgICAgICBtQWdlbnQuc2V0T25EYXRhU291cmNlTWlzc2luZ0hlbHBlcihtRGF0YVNvdXJjZUhlbHBlcik7Ci0gICAgICAgIG1FdmVudENhbGxiYWNrID0gbmV3IE15UGxheWxpc3RFdmVudENhbGxiYWNrKG1XYWl0TG9jayk7Ci0gICAgICAgIG1BZ2VudC5yZWdpc3RlclBsYXlsaXN0RXZlbnRDYWxsYmFjayhtSGFuZGxlckV4ZWN1dG9yLCBtRXZlbnRDYWxsYmFjayk7Ci0gICAgfQotCi0gICAgQEFmdGVyCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgbUhhbmRsZXIuZ2V0TG9vcGVyKCkucXVpdFNhZmVseSgpOwotICAgICAgICBtSGFuZGxlciA9IG51bGw7Ci0gICAgICAgIG1IYW5kbGVyRXhlY3V0b3IgPSBudWxsOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFNldEFuZEdldFNodWZsbGVNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBzaHVmZmxlTW9kZSA9IG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpOwotICAgICAgICBpZiAoc2h1ZmZsZU1vZGUgIT0gTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FKSB7Ci0gICAgICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgICAgICBtQWdlbnQuc2V0U2h1ZmZsZU1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9OT05FKTsKLSAgICAgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25TaHVmZmxlTW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfTk9ORSwgbUFnZW50LmdldFNodWZmbGVNb2RlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRTaHVmZmxlTW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0FMTCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfQUxMLCBtQWdlbnQuZ2V0U2h1ZmZsZU1vZGUoKSk7Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRTaHVmZmxlTW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuU0hVRkZMRV9NT0RFX0dST1VQKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uU2h1ZmZsZU1vZGVDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlNIVUZGTEVfTU9ERV9HUk9VUCwgbUFnZW50LmdldFNodWZmbGVNb2RlKCkpOwotCi0gICAgICAgIC8vIElOVkFMSURfU0hVRkZMRV9NT0RFIHdpbGwgbm90IGNoYW5nZSB0aGUgc2h1ZmZsZSBtb2RlLgotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFNodWZmbGVNb2RlKElOVkFMSURfU0hVRkZMRV9NT0RFKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRGYWxzZShtRXZlbnRDYWxsYmFjay5vblNodWZmbGVNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5TSFVGRkxFX01PREVfR1JPVVAsIG1BZ2VudC5nZXRTaHVmZmxlTW9kZSgpKTsKLSAgICB9Ci0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RTZXRBbmRHZXRSZXBlYXRNb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCByZXBlYXRNb2RlID0gbUFnZW50LmdldFJlcGVhdE1vZGUoKTsKLSAgICAgICAgaWYgKHJlcGVhdE1vZGUgIT0gTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUpIHsKLSAgICAgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9OT05FKTsKLSAgICAgICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9PTkUsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOwotCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfQUxMLCBtQWdlbnQuZ2V0UmVwZWF0TW9kZSgpKTsKLQotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0dST1VQKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUmVwZWF0TW9kZUNoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfR1JPVVAsIG1BZ2VudC5nZXRSZXBlYXRNb2RlKCkpOwotCi0gICAgICAgIC8vIElOVkFMSURfU0hVRkZMRV9NT0RFIHdpbGwgbm90IGNoYW5nZSB0aGUgc2h1ZmZsZSBtb2RlLgotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoSU5WQUxJRF9SRVBFQVRfTU9ERSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0RmFsc2UobUV2ZW50Q2FsbGJhY2sub25SZXBlYXRNb2RlQ2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9HUk9VUCwgbUFnZW50LmdldFJlcGVhdE1vZGUoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2V0UGxheWxpc3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgaW50IGxpc3RTaXplID0gMTA7Ci0gICAgICAgIGNyZWF0ZUFuZFNldFBsYXlsaXN0KDEwKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RTaXplLCBtQWdlbnQuZ2V0UGxheWxpc3QoKS5zaXplKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgfQotCi0gICAgQFRlc3QKLSAgICBwdWJsaWMgdm9pZCB0ZXN0U2tpcEl0ZW1zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgIGludCBsaXN0U2l6ZSA9IDU7Ci0gICAgICAgIExpc3Q8TWVkaWFJdGVtMj4gcGxheWxpc3QgPSBjcmVhdGVBbmRTZXRQbGF5bGlzdChsaXN0U2l6ZSk7Ci0KLSAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX05PTkUpOwotICAgICAgICAvLyBUZXN0IHNraXBUb1BsYXlsaXN0SXRlbQotICAgICAgICBmb3IgKGludCBpID0gbGlzdFNpemUgLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgbUFnZW50LnNraXBUb1BsYXlsaXN0SXRlbShwbGF5bGlzdC5nZXQoaSkpOwotICAgICAgICAgICAgYXNzZXJ0RXF1YWxzKGksIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGVzdCBza2lwVG9OZXh0SXRlbQotICAgICAgICAvLyBjdXJQbGF5UG9zID0gMAotICAgICAgICBmb3IgKGludCBjdXJQbGF5UG9zID0gMDsgY3VyUGxheVBvcyA8IGxpc3RTaXplIC0gMTsgKytjdXJQbGF5UG9zKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2tpcFRvTmV4dEl0ZW0oKTsKLSAgICAgICAgICAgIGFzc2VydEVxdWFscyhjdXJQbGF5UG9zICsgMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0U2l6ZSAtIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFRlc3Qgc2tpcFRvUHJldmlvdXMKLSAgICAgICAgLy8gY3VyUGxheVBvcyA9IGxpc3RTaXplIC0gMQotICAgICAgICBmb3IgKGludCBjdXJQbGF5UG9zID0gbGlzdFNpemUgLSAxOyBjdXJQbGF5UG9zID4gMDsgLS1jdXJQbGF5UG9zKSB7Ci0gICAgICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgICAgICBhc3NlcnRFcXVhbHMoY3VyUGxheVBvcyAtIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgICAgICB9Ci0gICAgICAgIG1BZ2VudC5za2lwVG9QcmV2aW91c0l0ZW0oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDAsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIG1BZ2VudC5zZXRSZXBlYXRNb2RlKE1lZGlhUGxheWxpc3RBZ2VudC5SRVBFQVRfTU9ERV9BTEwpOwotICAgICAgICAvLyBUZXN0IHNraXBUb1ByZXZpb3VzIHdpdGggcmVwZWF0IG1vZGUgYWxsCi0gICAgICAgIC8vIGN1clBsYXlQb3MgPSAwCi0gICAgICAgIG1BZ2VudC5za2lwVG9QcmV2aW91c0l0ZW0oKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGxpc3RTaXplIC0gMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gVGVzdCBza2lwVG9OZXh0IHdpdGggcmVwZWF0IG1vZGUgYWxsCi0gICAgICAgIC8vIGN1clBsYXlQb3MgPSBsaXN0U2l6ZSAtIDEKLSAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIC8vIGN1clBsYXlQb3MgPSBsaXN0U2l6ZSAtIDEsIG5leHRQbGF5UG9zID0gMAotICAgICAgICAvLyBUZXN0IG5leHQgcGxheSBwb3MgYWZ0ZXIgc2V0dGluZyByZXBlYXQgbW9kZSBub25lLgotICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfTk9ORSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhsaXN0U2l6ZSAtIDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdEVkaXRQbGF5bGlzdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbGlzdFNpemUgPSA1OwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0gY3JlYXRlQW5kU2V0UGxheWxpc3QobGlzdFNpemUpOwotCi0gICAgICAgIC8vIFRlc3QgYWRkIGl0ZW06IFswIChjdXIpLCAxLCAyLCAzLCA0XSAtPiBbMCAoY3VyKSwgMSwgNSwgMiwgMywgNF0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgTWVkaWFJdGVtMiBpdGVtXzUgPSBnZW5lcmF0ZU1lZGlhSXRlbSg1KTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LmFkZCgyLCBpdGVtXzUpOwotICAgICAgICAgICAgbUFnZW50LmFkZFBsYXlsaXN0SXRlbSgyLCBpdGVtXzUpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgLy8gTW92ZSBjdXJyZW50OiBbMCAoY3VyKSwgMSwgNSwgMiwgMywgNF0gLT4gWzAsIDEsIDUgKGN1ciksIDIsIDMsIDRdCi0gICAgICAgIG1BZ2VudC5za2lwVG9QbGF5bGlzdEl0ZW0oaXRlbV81KTsKLSAgICAgICAgLy8gUmVtb3ZlIGN1cnJlbnQgaXRlbTogWzAsIDEsIDUgKGN1ciksIDIsIDMsIDRdIC0+IFswLCAxLCAyIChjdXIpLCAzLCA0XQotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKGl0ZW1fNSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW1fNSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDIsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlbW92ZSBwcmV2aW91cyBpdGVtOiBbMCwgMSwgMiAoY3VyKSwgMywgNF0gLT4gWzAsIDIgKGN1ciksIDMsIDRdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgcHJldmlvdXNJdGVtID0gcGxheWxpc3QuZ2V0KDEpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKHByZXZpb3VzSXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKHByZXZpb3VzSXRlbSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlbW92ZSBuZXh0IGl0ZW06IFswLCAyIChjdXIpLCAzLCA0XSAtPiBbMCwgMiAoY3VyKSwgNF0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgTWVkaWFJdGVtMiBuZXh0SXRlbSA9IHBsYXlsaXN0LmdldCgyKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShuZXh0SXRlbSk7Ci0gICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKG5leHRJdGVtKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gUmVwbGFjZSBpdGVtOiBbMCwgMiAoY3VyKSwgNF0gLT4gWzAsIDIgKGN1ciksIDVdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5zZXQoMiwgaXRlbV81KTsKLSAgICAgICAgICAgIG1BZ2VudC5yZXBsYWNlUGxheWxpc3RJdGVtKDIsIGl0ZW1fNSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIE1vdmUgbGFzdCBhbmQgcmVtb3ZlIHRoZSBsYXN0IGl0ZW06IFswLCAyIChjdXIpLCA1XSAtPiBbMCwgMiwgNSAoY3VyKV0gLT4gWzAsIDIgKGN1cildCi0gICAgICAgIE1lZGlhSXRlbTIgbGFzdEl0ZW0gPSBwbGF5bGlzdC5nZXQoMSk7Ci0gICAgICAgIG1BZ2VudC5za2lwVG9QbGF5bGlzdEl0ZW0obGFzdEl0ZW0pOwotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3QucmVtb3ZlKGxhc3RJdGVtKTsKLSAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0obGFzdEl0ZW0pOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgYWxsIGl0ZW1zCi0gICAgICAgIGZvciAoaW50IGkgPSBwbGF5bGlzdC5zaXplKCkgLSAxOyBpID49IDA7IC0taSkgewotICAgICAgICAgICAgTWVkaWFJdGVtMiBpdGVtID0gcGxheWxpc3QuZ2V0KGkpOwotICAgICAgICAgICAgbUFnZW50LnNraXBUb1BsYXlsaXN0SXRlbShpdGVtKTsKLSAgICAgICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgICAgICBtQWdlbnQucmVtb3ZlUGxheWxpc3RJdGVtKGl0ZW0pOwotICAgICAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5OT19WQUxJRF9JVEVNUywgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0gICAgfQotCi0KLSAgICBAVGVzdAotICAgIHB1YmxpYyB2b2lkIHRlc3RQbGF5bGlzdFdpdGhJbnZhbGlkSXRlbSgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbGlzdFNpemUgPSAyOwotICAgICAgICBMaXN0PE1lZGlhSXRlbTI+IHBsYXlsaXN0ID0gY3JlYXRlQW5kU2V0UGxheWxpc3QobGlzdFNpemUpOwotCi0gICAgICAgIC8vIEFkZCBpdGVtOiBbMCAoY3VyKSwgMV0gLT4gWzAgKGN1ciksIDMgKG5vX2RzZCksIDFdCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgaW52YWxpZEl0ZW0yID0gZ2VuZXJhdGVNZWRpYUl0ZW1XaXRob3V0RGF0YVNvdXJjZURlc2MoMik7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5hZGQoMSwgaW52YWxpZEl0ZW0yKTsKLSAgICAgICAgICAgIG1BZ2VudC5hZGRQbGF5bGlzdEl0ZW0oMSwgaW52YWxpZEl0ZW0yKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gVGVzdCBza2lwIHRvIG5leHQgaXRlbTogIFswIChjdXIpLCAyIChub19kc2QpLCAxXSAtPiBbMCwgMiAobm9fZHNkKSwgMSAoY3VyKV0KLSAgICAgICAgbUFnZW50LnNraXBUb05leHRJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygyLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBUZXN0IHNraXAgdG8gcHJldmlvdXMgaXRlbTogWzAsIDIgKG5vX2RzZCksIDEgKGN1cildIC0+IFswIChjdXIpLCAyIChub19kc2QpLCAxXQotICAgICAgICBtQWdlbnQuc2tpcFRvUHJldmlvdXNJdGVtKCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBSZW1vdmUgY3VycmVudCBpdGVtOiBbMCAoY3VyKSwgMiAobm9fZHNkKSwgMV0gLT4gWzIgKG5vX2RzZCksIDEgKGN1cildCi0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIE1lZGlhSXRlbTIgaXRlbSA9IHBsYXlsaXN0LmdldCgwKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0oaXRlbSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDEsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIFJlbW92ZSBjdXJyZW50IGl0ZW06IFsyIChub19kc2QpLCAxIChjdXIpXSAtPiBbMiAobm9fZHNkKV0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgaXRlbSA9IHBsYXlsaXN0LmdldCgxKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIHBsYXlsaXN0LnJlbW92ZShpdGVtKTsKLSAgICAgICAgICAgIG1BZ2VudC5yZW1vdmVQbGF5bGlzdEl0ZW0oaXRlbSk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0UGxheWxpc3RFcXVhbHMocGxheWxpc3QsIG1BZ2VudC5nZXRQbGF5bGlzdCgpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50Lk5PX1ZBTElEX0lURU1TLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICAvLyBBZGQgaW52YWxpZCBpdGVtOiBbMiAobm9fZHNkKV0gLT4gWzAgKG5vX2RzZCksIDIgKG5vX2RzZCldCi0gICAgICAgIE1lZGlhSXRlbTIgaW52YWxpZEl0ZW0wID0gZ2VuZXJhdGVNZWRpYUl0ZW1XaXRob3V0RGF0YVNvdXJjZURlc2MoMCk7Ci0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5hZGQoMCwgaW52YWxpZEl0ZW0wKTsKLSAgICAgICAgICAgIG1BZ2VudC5hZGRQbGF5bGlzdEl0ZW0oMCwgaW52YWxpZEl0ZW0wKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuTk9fVkFMSURfSVRFTVMsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIC8vIEFkZCB2YWxpZCBpdGVtOiBbMCAobm9fZHNkKSwgMiAobm9fZHNkKV0gLT4gWzAgKG5vX2RzZCksIDEsIDIgKG5vX2RzZCldCi0gICAgICAgIE1lZGlhSXRlbTIgaW52YWxpZEl0ZW0xID0gZ2VuZXJhdGVNZWRpYUl0ZW0oMSk7Ci0gICAgICAgIG1FdmVudENhbGxiYWNrLmNsZWFyKCk7Ci0gICAgICAgIHN5bmNocm9uaXplZCAobVdhaXRMb2NrKSB7Ci0gICAgICAgICAgICBwbGF5bGlzdC5hZGQoMSwgaW52YWxpZEl0ZW0xKTsKLSAgICAgICAgICAgIG1BZ2VudC5hZGRQbGF5bGlzdEl0ZW0oMSwgaW52YWxpZEl0ZW0xKTsKLSAgICAgICAgICAgIG1XYWl0TG9jay53YWl0KFdBSVRfVElNRV9NUyk7Ci0gICAgICAgICAgICBhc3NlcnRUcnVlKG1FdmVudENhbGxiYWNrLm9uUGxheWxpc3RDaGFuZ2VkQ2FsbGVkKTsKLSAgICAgICAgfQotICAgICAgICBhc3NlcnRQbGF5bGlzdEVxdWFscyhwbGF5bGlzdCwgbUFnZW50LmdldFBsYXlsaXN0KCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMSwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgLy8gUmVwbGFjZSB0aGUgdmFsaWQgaXRlbSB3aXRoIGFuIGludmFsaWQgaXRlbToKLSAgICAgICAgLy8gWzAgKG5vX2RzZCksIDEgKGN1ciksIDIgKG5vX2RzZCldIC0+IFswIChub19kc2QpLCAzIChub19kc2QpLCAyIChub19kc2QpXQotICAgICAgICBNZWRpYUl0ZW0yIGludmFsaWRJdGVtMyA9IGdlbmVyYXRlTWVkaWFJdGVtV2l0aG91dERhdGFTb3VyY2VEZXNjKDMpOwotICAgICAgICBtRXZlbnRDYWxsYmFjay5jbGVhcigpOwotICAgICAgICBzeW5jaHJvbml6ZWQgKG1XYWl0TG9jaykgewotICAgICAgICAgICAgcGxheWxpc3Quc2V0KDEsIGludmFsaWRJdGVtMyk7Ci0gICAgICAgICAgICBtQWdlbnQucmVwbGFjZVBsYXlsaXN0SXRlbSgxLCBpbnZhbGlkSXRlbTMpOwotICAgICAgICAgICAgbVdhaXRMb2NrLndhaXQoV0FJVF9USU1FX01TKTsKLSAgICAgICAgICAgIGFzc2VydFRydWUobUV2ZW50Q2FsbGJhY2sub25QbGF5bGlzdENoYW5nZWRDYWxsZWQpOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydFBsYXlsaXN0RXF1YWxzKHBsYXlsaXN0LCBtQWdlbnQuZ2V0UGxheWxpc3QoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5FTkRfT0ZfUExBWUxJU1QsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotICAgIH0KLQotICAgIEBUZXN0Ci0gICAgcHVibGljIHZvaWQgdGVzdFBsYXlsaXN0QWZ0ZXJPbkN1cnJlbnREYXRhU291cmNlQ2hhbmdlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgICAgICBpbnQgbGlzdFNpemUgPSAyOwotICAgICAgICB2ZXJpZnkobVBsYXllcikucmVnaXN0ZXJQbGF5ZXJFdmVudENhbGxiYWNrKE1hdGNoZXJzLmFueSgpLCBNYXRjaGVycy5hbnkoKSk7Ci0KLSAgICAgICAgY3JlYXRlQW5kU2V0UGxheWxpc3QobGlzdFNpemUpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sub25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQobVBsYXllciwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sub25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQobVBsYXllciwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhTZXNzaW9uUGxheWxpc3RBZ2VudC5FTkRfT0ZfUExBWUxJU1QsIG1BZ2VudC5nZXRDdXJTaHVmZmxlZEluZGV4KCkpOwotCi0gICAgICAgIG1BZ2VudC5za2lwVG9OZXh0SXRlbSgpOwotICAgICAgICBhc3NlcnRFcXVhbHMoU2Vzc2lvblBsYXlsaXN0QWdlbnQuRU5EX09GX1BMQVlMSVNULCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLQotICAgICAgICBtQWdlbnQuc2V0UmVwZWF0TW9kZShNZWRpYVBsYXlsaXN0QWdlbnQuUkVQRUFUX01PREVfT05FKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKFNlc3Npb25QbGF5bGlzdEFnZW50LkVORF9PRl9QTEFZTElTVCwgbUFnZW50LmdldEN1clNodWZmbGVkSW5kZXgoKSk7Ci0KLSAgICAgICAgbUFnZW50LnNldFJlcGVhdE1vZGUoTWVkaWFQbGF5bGlzdEFnZW50LlJFUEVBVF9NT0RFX0FMTCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sub25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQobVBsYXllciwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygxLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICAgICAgbVBsYXllckV2ZW50Q2FsbGJhY2sub25DdXJyZW50RGF0YVNvdXJjZUNoYW5nZWQobVBsYXllciwgbnVsbCk7Ci0gICAgICAgIGFzc2VydEVxdWFscygwLCBtQWdlbnQuZ2V0Q3VyU2h1ZmZsZWRJbmRleCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIExpc3Q8TWVkaWFJdGVtMj4gY3JlYXRlQW5kU2V0UGxheWxpc3QoaW50IGxpc3RTaXplKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgTGlzdDxNZWRpYUl0ZW0yPiBpdGVtcyA9IG5ldyBBcnJheUxpc3Q8PigpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpc3RTaXplOyArK2kpIHsKLSAgICAgICAgICAgIGl0ZW1zLmFkZChnZW5lcmF0ZU1lZGlhSXRlbShpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUV2ZW50Q2FsbGJhY2suY2xlYXIoKTsKLSAgICAgICAgc3luY2hyb25pemVkIChtV2FpdExvY2spIHsKLSAgICAgICAgICAgIG1BZ2VudC5zZXRQbGF5bGlzdChpdGVtcywgbnVsbCk7Ci0gICAgICAgICAgICBtV2FpdExvY2sud2FpdChXQUlUX1RJTUVfTVMpOwotICAgICAgICAgICAgYXNzZXJ0VHJ1ZShtRXZlbnRDYWxsYmFjay5vblBsYXlsaXN0Q2hhbmdlZENhbGxlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGl0ZW1zOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBhc3NlcnRQbGF5bGlzdEVxdWFscyhMaXN0PE1lZGlhSXRlbTI+IGV4cGVjdGVkLCBMaXN0PE1lZGlhSXRlbTI+IGFjdHVhbCkgewotICAgICAgICBpZiAoZXhwZWN0ZWQgPT0gYWN0dWFsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShleHBlY3RlZCAhPSBudWxsICYmIGFjdHVhbCAhPSBudWxsKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLnNpemUoKSwgYWN0dWFsLnNpemUoKSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWQuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICAgIGFzc2VydFRydWUoZXhwZWN0ZWQuZ2V0KGkpLmVxdWFscyhhY3R1YWwuZ2V0KGkpKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIE1lZGlhSXRlbTIgZ2VuZXJhdGVNZWRpYUl0ZW1XaXRob3V0RGF0YVNvdXJjZURlc2MoaW50IGtleSkgewotICAgICAgICByZXR1cm4gbmV3IE1lZGlhSXRlbTIuQnVpbGRlcigwKQotICAgICAgICAgICAgICAgIC5zZXRNZWRpYUlkKCJURVNUX01FRElBX0lEX1dJVEhPVVRfRFNEXyIgKyBrZXkpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNZWRpYUl0ZW0yIGdlbmVyYXRlTWVkaWFJdGVtKGludCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBNZWRpYUl0ZW0yLkJ1aWxkZXIoMCkKLSAgICAgICAgICAgICAgICAuc2V0TWVkaWFJZCgiVEVTVF9NRURJQV9JRF8iICsga2V5KQotICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3BhY2thZ2VzL09XTkVSUyBiL3BhY2thZ2VzL09XTkVSUwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmJjNGNlZi4uMDAwMDAwMAotLS0gYS9wYWNrYWdlcy9PV05FUlMKKysrIC9kZXYvbnVsbApAQCAtMSw2ICswLDAgQEAKLWFrZXJzdGVuQGdvb2dsZS5jb20KLWR3a2FuZ0Bnb29nbGUuY29tCi1qYWV3YW5AZ29vZ2xlLmNvbQotbWFyY29uZUBnb29nbGUuY29tCi1zdW5nc29vQGdvb2dsZS5jb20KLXdqaWFAZ29vZ2xlLmNvbQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvT1dORVJTIGIvc2VydmljZXMvT1dORVJTCmluZGV4IGQ1ZDAwZGEuLjY2YTRiY2IgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL09XTkVSUworKysgYi9zZXJ2aWNlcy9PV05FUlMKQEAgLTEsNCArMSw3IEBACitjaHpAZ29vZ2xlLmNvbQogZWxhdXJlbnRAZ29vZ2xlLmNvbQorZXNzaWNrQGdvb2dsZS5jb20KIGV0YWx2YWxhQGdvb2dsZS5jb20KIGdrYXN0ZW5AZ29vZ2xlLmNvbQogaHVuZ2FAZ29vZ2xlLmNvbQorbWFyY29uZUBnb29nbGUuY29tCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ODM2MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDc5IEBACisKKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJhdWRpb2ZsaW5nZXIiLAorCisgICAgc3JjczogWworICAgICAgICAiQXVkaW9GbGluZ2VyLmNwcCIsCisgICAgICAgICJBdWRpb0h3RGV2aWNlLmNwcCIsCisgICAgICAgICJBdWRpb1N0cmVhbU91dC5jcHAiLAorICAgICAgICAiQXVkaW9XYXRjaGRvZy5jcHAiLAorICAgICAgICAiQnVmTG9nLmNwcCIsCisgICAgICAgICJEZXZpY2VFZmZlY3RNYW5hZ2VyLmNwcCIsCisgICAgICAgICJFZmZlY3RzLmNwcCIsCisgICAgICAgICJGYXN0Q2FwdHVyZS5jcHAiLAorICAgICAgICAiRmFzdENhcHR1cmVEdW1wU3RhdGUuY3BwIiwKKyAgICAgICAgIkZhc3RDYXB0dXJlU3RhdGUuY3BwIiwKKyAgICAgICAgIkZhc3RNaXhlci5jcHAiLAorICAgICAgICAiRmFzdE1peGVyRHVtcFN0YXRlLmNwcCIsCisgICAgICAgICJGYXN0TWl4ZXJTdGF0ZS5jcHAiLAorICAgICAgICAiRmFzdFRocmVhZC5jcHAiLAorICAgICAgICAiRmFzdFRocmVhZER1bXBTdGF0ZS5jcHAiLAorICAgICAgICAiRmFzdFRocmVhZFN0YXRlLmNwcCIsCisgICAgICAgICJOQkFJT19UZWUuY3BwIiwKKyAgICAgICAgIlBhdGNoUGFuZWwuY3BwIiwKKyAgICAgICAgIlNwZGlmU3RyZWFtT3V0LmNwcCIsCisgICAgICAgICJTdGF0ZVF1ZXVlLmNwcCIsCisgICAgICAgICJUaHJlYWRzLmNwcCIsCisgICAgICAgICJUcmFja3MuY3BwIiwKKyAgICAgICAgIlR5cGVkTG9nZ2VyLmNwcCIsCisgICAgXSwKKworICAgIGluY2x1ZGVfZGlyczogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL21lZGlhbG9nIiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJhdWRpb2hhbCIsCisgICAgICAgICJsaWJhdWRpb3Byb2Nlc3NpbmciLAorICAgICAgICAibGliYXVkaW9zcGRpZiIsCisgICAgICAgICJsaWJhdWRpb3V0aWxzIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKKyAgICAgICAgImxpYm1lZGlhbG9nc2VydmljZSIsCisgICAgICAgICJsaWJtZWRpYW1ldHJpY3MiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJuYmFpbyIsCisgICAgICAgICJsaWJuYmxvZyIsCisgICAgICAgICJsaWJwb3dlcm1hbmFnZXIiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisgICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCisgICAgICAgICJsaWJtZWRpYV9oZWxwZXIiLAorICAgICAgICAibGlidmlicmF0b3IiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliY3B1c3RhdHMiLAorICAgICAgICAibGlic25kZmlsZSIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItRFNUQVRFX1FVRVVFX0lOU1RBTlRJQVRJT05TPVwiU3RhdGVRdWV1ZUluc3RhbnRpYXRpb25zLmNwcFwiIiwKKyAgICAgICAgIi1mdmlzaWJpbGl0eT1oaWRkZW4iLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKyAgICBzYW5pdGl6ZTogeworICAgICAgICBpbnRlZ2VyX292ZXJmbG93OiB0cnVlLAorICAgIH0sCisKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0MTllNjQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgU2VydmljZVV0aWxpdGllcy5jcHAKLQotIyBGSVhNRSBNb3ZlIHRoaXMgbGlicmFyeSB0byBmcmFtZXdvcmtzL25hdGl2ZQotTE9DQUxfTU9EVUxFIDo9IGxpYnNlcnZpY2V1dGlsaXR5Ci0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmxvZyBcCi0gICAgbGliYmluZGVyCi0KLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9ICAgICAgICAgICAgICAgXAotICAgIEF1ZGlvRmxpbmdlci5jcHAgICAgICAgICAgICBcCi0gICAgVGhyZWFkcy5jcHAgICAgICAgICAgICAgICAgIFwKLSAgICBUcmFja3MuY3BwICAgICAgICAgICAgICAgICAgXAotICAgIEF1ZGlvSHdEZXZpY2UuY3BwICAgICAgICAgICBcCi0gICAgQXVkaW9TdHJlYW1PdXQuY3BwICAgICAgICAgIFwKLSAgICBTcGRpZlN0cmVhbU91dC5jcHAgICAgICAgICAgXAotICAgIEVmZmVjdHMuY3BwICAgICAgICAgICAgICAgICBcCi0gICAgUGF0Y2hQYW5lbC5jcHAgICAgICAgICAgICAgIFwKLSAgICBTdGF0ZVF1ZXVlLmNwcCAgICAgICAgICAgICAgXAotICAgIEJ1ZkxvZy5jcHAgICAgICAgICAgICAgICAgICBcCi0gICAgVHlwZWRMb2dnZXIuY3BwCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvbWVkaWFsb2cgXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYXVkaW9oYWwgXAotICAgIGxpYmF1ZGlvcHJvY2Vzc2luZyBcCi0gICAgbGliYXVkaW9zcGRpZiBcCi0gICAgbGliYXVkaW91dGlscyBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJiaW5kZXIgXAotICAgIGxpYmF1ZGlvY2xpZW50IFwKLSAgICBsaWJtZWRpYWxvZ3NlcnZpY2UgXAotICAgIGxpYm1lZGlhdXRpbHMgXAotICAgIGxpYm5iYWlvIFwKLSAgICBsaWJuYmxvZyBcCi0gICAgbGlicG93ZXJtYW5hZ2VyIFwKLSAgICBsaWJzZXJ2aWNldXRpbGl0eSBcCi0gICAgbGlibWVkaWF1dGlscyBcCi0gICAgbGlibWVtdW5yZWFjaGFibGUgXAotICAgIGxpYm1lZGlhX2hlbHBlcgotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJjcHVzdGF0cyBcCi0KLUxPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCi0KLUxPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvZmxpbmdlcgotCi1MT0NBTF9TUkNfRklMRVMgKz0gXAotICAgIEF1ZGlvV2F0Y2hkb2cuY3BwICAgICAgICBcCi0gICAgRmFzdENhcHR1cmUuY3BwICAgICAgICAgIFwKLSAgICBGYXN0Q2FwdHVyZUR1bXBTdGF0ZS5jcHAgXAotICAgIEZhc3RDYXB0dXJlU3RhdGUuY3BwICAgICBcCi0gICAgRmFzdE1peGVyLmNwcCAgICAgICAgICAgIFwKLSAgICBGYXN0TWl4ZXJEdW1wU3RhdGUuY3BwICAgXAotICAgIEZhc3RNaXhlclN0YXRlLmNwcCAgICAgICBcCi0gICAgRmFzdFRocmVhZC5jcHAgICAgICAgICAgIFwKLSAgICBGYXN0VGhyZWFkRHVtcFN0YXRlLmNwcCAgXAotICAgIEZhc3RUaHJlYWRTdGF0ZS5jcHAKLQotTE9DQUxfQ0ZMQUdTICs9IC1EU1RBVEVfUVVFVUVfSU5TVEFOVElBVElPTlM9JyJTdGF0ZVF1ZXVlSW5zdGFudGlhdGlvbnMuY3BwIicKLQotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KLQotTE9DQUxfQ0ZMQUdTICs9IC1XZXJyb3IgLVdhbGwKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCmluZGV4IGM3N2QwODIuLjllMzZmNzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuY3BwCkBAIC0xOSwxNiArMTksMjEgQEAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9GbGluZ2VyIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCisvLyBEZWZpbmUgQVVESU9fQVJSQVlTX1NUQVRJQ19DSEVDSyB0byBjaGVjayBhbGwgYXVkaW8gYXJyYXlzIGFyZSBjb3JyZWN0CisjZGVmaW5lIEFVRElPX0FSUkFZU19TVEFUSUNfQ0hFQ0sgMQorCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPGRpcmVudC5oPgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8c3lzL3RpbWUuaD4KICNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KKyNpbmNsdWRlIDx0aHJlYWQ+CiAKKyNpbmNsdWRlIDxhbmRyb2lkL29zL0lFeHRlcm5hbFZpYnJhdG9yU2VydmljZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGFyY2VsLmg+CkBAIC00NSw5ICs1MCwxMCBAQAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxhdWRpb21hbmFnZXIvQXVkaW9NYW5hZ2VyLmg+CiAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCisjaW5jbHVkZSAiTkJBSU9fVGVlLmgiCiAKICNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgogCkBAIC01Niw3ICs2Miw2IEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X2FlYy5oPgogCiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3N0cmluZy5oPgogCiAjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL1Bvd2VyTWFuYWdlci5oPgogCkBAIC02NCw4ICs2OSw5IEBACiAjaW5jbHVkZSA8bWVkaWEvTWVtb3J5TGVha1RyYWNrVXRpbC5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGUuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlUmVhZGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvQXVkaW9QYXJhbWV0ZXIuaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL0JhdHRlcnlOb3RpZmllci5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvVGltZUNoZWNrLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAKIC8vI2RlZmluZSBCVUZMT0dfTkRFQlVHIDAKQEAgLTEwMCwxNyArMTA2LDYgQEAKIAogdWludDMyX3QgQXVkaW9GbGluZ2VyOjptU2NyZWVuU3RhdGU7CiAKLQotI2lmZGVmIFRFRV9TSU5LCi1ib29sIEF1ZGlvRmxpbmdlcjo6bVRlZVNpbmtJbnB1dEVuYWJsZWQgPSBmYWxzZTsKLWJvb2wgQXVkaW9GbGluZ2VyOjptVGVlU2lua091dHB1dEVuYWJsZWQgPSBmYWxzZTsKLWJvb2wgQXVkaW9GbGluZ2VyOjptVGVlU2lua1RyYWNrRW5hYmxlZCA9IGZhbHNlOwotCi1zaXplX3QgQXVkaW9GbGluZ2VyOjptVGVlU2lua0lucHV0RnJhbWVzID0ga1RlZVNpbmtJbnB1dEZyYW1lc0RlZmF1bHQ7Ci1zaXplX3QgQXVkaW9GbGluZ2VyOjptVGVlU2lua091dHB1dEZyYW1lcyA9IGtUZWVTaW5rT3V0cHV0RnJhbWVzRGVmYXVsdDsKLXNpemVfdCBBdWRpb0ZsaW5nZXI6Om1UZWVTaW5rVHJhY2tGcmFtZXMgPSBrVGVlU2lua1RyYWNrRnJhbWVzRGVmYXVsdDsKLSNlbmRpZgotCiAvLyBJbiBvcmRlciB0byBhdm9pZCBpbnZhbGlkYXRpbmcgb2ZmbG9hZGVkIHRyYWNrcyBlYWNoIHRpbWUgYSBWaXN1YWxpemVyIGlzIHR1cm5lZCBvbiBhbmQgb2ZmCiAvLyB3ZSBkZWZpbmUgYSBtaW5pbXVtIHRpbWUgZHVyaW5nIHdoaWNoIGEgZ2xvYmFsIGVmZmVjdCBpcyBjb25zaWRlcmVkIGVuYWJsZWQuCiBzdGF0aWMgY29uc3QgbnNlY3NfdCBrTWluR2xvYmFsRWZmZWN0RW5hYmxldGltZU5zID0gc2Vjb25kcyg3MjAwKTsKQEAgLTEzNCw2ICsxMjksMzQgQEAKICAgICB9CiB9CiAKKy8vIEtlZXAgYSBzdHJvbmcgcmVmZXJlbmNlIHRvIGV4dGVybmFsIHZpYnJhdG9yIHNlcnZpY2UKK3N0YXRpYyBzcDxvczo6SUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlPiBzRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U7CisKK3N0YXRpYyBzcDxvczo6SUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlPiBnZXRFeHRlcm5hbFZpYnJhdG9yU2VydmljZSgpIHsKKyAgICBpZiAoc0V4dGVybmFsVmlicmF0b3JTZXJ2aWNlID09IDApIHsKKyAgICAgICAgc3AgPElCaW5kZXI+IGJpbmRlciA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpLT5nZXRTZXJ2aWNlKAorICAgICAgICAgICAgU3RyaW5nMTYoImV4dGVybmFsX3ZpYnJhdG9yX3NlcnZpY2UiKSk7CisgICAgICAgIGlmIChiaW5kZXIgIT0gMCkgeworICAgICAgICAgICAgc0V4dGVybmFsVmlicmF0b3JTZXJ2aWNlID0KKyAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxvczo6SUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlPihiaW5kZXIpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzRXh0ZXJuYWxWaWJyYXRvclNlcnZpY2U7Cit9CisKK2NsYXNzIERldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2tJbXBsIDogcHVibGljIERldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2sgeworICBwdWJsaWM6CisgICAgdm9pZCBvbk5ld0RldmljZXNBdmFpbGFibGUoKSBvdmVycmlkZSB7CisgICAgICAgIC8vIFN0YXJ0IGEgZGV0YWNoZWQgdGhyZWFkIHRvIGV4ZWN1dGUgbm90aWZpY2F0aW9uIGluIHBhcmFsbGVsLgorICAgICAgICAvLyBUaGlzIGlzIGRvbmUgdG8gcHJldmVudCBtdXR1YWwgYmxvY2tpbmcgb2YgYXVkaW9fZmxpbmdlciBhbmQKKyAgICAgICAgLy8gYXVkaW9fcG9saWN5IHNlcnZpY2VzIGR1cmluZyBzeXN0ZW0gaW5pdGlhbGl6YXRpb24uCisgICAgICAgIHN0ZDo6dGhyZWFkIG5vdGlmaWVyKFtdKCkgeworICAgICAgICAgICAgQXVkaW9TeXN0ZW06Om9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCk7CisgICAgICAgIH0pOworICAgICAgICBub3RpZmllci5kZXRhY2goKTsKKyAgICB9Cit9OworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIHN0ZDo6c3RyaW5nIGZvcm1hdFRvU3RyaW5nKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgewpAQCAtMTYwLDYgKzE4Myw4IEBACiAgICAgICBtVG90YWxNZW1vcnkoMCksCiAgICAgICBtQ2xpZW50U2hhcmVkSGVhcFNpemUoa01pbmltdW1DbGllbnRTaGFyZWRIZWFwU2l6ZUJ5dGVzKSwKICAgICAgIG1HbG9iYWxFZmZlY3RFbmFibGVUaW1lKDApLAorICAgICAgbVBhdGNoUGFuZWwodGhpcyksCisgICAgICBtRGV2aWNlRWZmZWN0TWFuYWdlcih0aGlzKSwKICAgICAgIG1TeXN0ZW1SZWFkeShmYWxzZSkKIHsKICAgICAvLyB1bnNpZ25lZCBpbnN0ZWFkIG9mIGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCwgYmVjYXVzZSArKyBvcGVyYXRvciBpcyB1bmF2YWlsYWJsZSBmb3IgZW51bQpAQCAtMTY4LDcgKzE5Myw2IEBACiAgICAgICAgIG1OZXh0VW5pcXVlSWRzW3VzZV0gPSBBVURJT19VTklRVUVfSURfVVNFX01BWDsKICAgICB9CiAKLSAgICBnZXRwaWRfY2FjaGVkID0gZ2V0cGlkKCk7CiAgICAgY29uc3QgYm9vbCBkb0xvZyA9IHByb3BlcnR5X2dldF9ib29sKCJyby50ZXN0X2hhcm5lc3MiLCBmYWxzZSk7CiAgICAgaWYgKGRvTG9nKSB7CiAgICAgICAgIG1Mb2dNZW1vcnlEZWFsZXIgPSBuZXcgTWVtb3J5RGVhbGVyKGtMb2dNZW1vcnlTaXplLCAiTG9nV3JpdGVycyIsCkBAIC0xODUsMjcgKzIwOSw5IEBACiAgICAgbUVmZmVjdHNGYWN0b3J5SGFsID0gRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmNyZWF0ZSgpOwogCiAgICAgbU1lZGlhTG9nTm90aWZpZXItPnJ1bigiTWVkaWFMb2dOb3RpZmllciIpOwotCi0jaWZkZWYgVEVFX1NJTksKLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgKHZvaWQpIHByb3BlcnR5X2dldCgicm8uZGVidWdnYWJsZSIsIHZhbHVlLCAiMCIpOwotICAgIGludCBkZWJ1Z2dhYmxlID0gYXRvaSh2YWx1ZSk7Ci0gICAgaW50IHRlZUVuYWJsZWQgPSAwOwotICAgIGlmIChkZWJ1Z2dhYmxlKSB7Ci0gICAgICAgICh2b2lkKSBwcm9wZXJ0eV9nZXQoImFmLnRlZSIsIHZhbHVlLCAiMCIpOwotICAgICAgICB0ZWVFbmFibGVkID0gYXRvaSh2YWx1ZSk7Ci0gICAgfQotICAgIC8vIEZJWE1FIHN5bWJvbGljIGNvbnN0YW50cyBoZXJlCi0gICAgaWYgKHRlZUVuYWJsZWQgJiAxKSB7Ci0gICAgICAgIG1UZWVTaW5rSW5wdXRFbmFibGVkID0gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKHRlZUVuYWJsZWQgJiAyKSB7Ci0gICAgICAgIG1UZWVTaW5rT3V0cHV0RW5hYmxlZCA9IHRydWU7Ci0gICAgfQotICAgIGlmICh0ZWVFbmFibGVkICYgNCkgewotICAgICAgICBtVGVlU2lua1RyYWNrRW5hYmxlZCA9IHRydWU7Ci0gICAgfQotI2VuZGlmCisgICAgc3RkOjp2ZWN0b3I8cGlkX3Q+IGhhbFBpZHM7CisgICAgbURldmljZXNGYWN0b3J5SGFsLT5nZXRIYWxQaWRzKCZoYWxQaWRzKTsKKyAgICBUaW1lQ2hlY2s6OnNldEF1ZGlvSGFsUGlkcyhoYWxQaWRzKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6Om9uRmlyc3RSZWYoKQpAQCAtMjI2LDExICsyMzIsMTcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIG1QYXRjaFBhbmVsID0gbmV3IFBhdGNoUGFuZWwodGhpcyk7Ci0KICAgICBtTW9kZSA9IEFVRElPX01PREVfTk9STUFMOwogCiAgICAgZ0F1ZGlvRmxpbmdlciA9IHRoaXM7CisKKyAgICBtRGV2aWNlc0ZhY3RvcnlIYWxDYWxsYmFjayA9IG5ldyBEZXZpY2VzRmFjdG9yeUhhbENhbGxiYWNrSW1wbDsKKyAgICBtRGV2aWNlc0ZhY3RvcnlIYWwtPnNldENhbGxiYWNrT25jZShtRGV2aWNlc0ZhY3RvcnlIYWxDYWxsYmFjayk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0QXVkaW9IYWxQaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHBpZF90PiYgcGlkcykgeworICBUaW1lQ2hlY2s6OnNldEF1ZGlvSGFsUGlkcyhwaWRzKTsKKyAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBBdWRpb0ZsaW5nZXI6On5BdWRpb0ZsaW5nZXIoKQpAQCAtMjQzLDYgKzI1NSwxNCBAQAogICAgICAgICAvLyBjbG9zZU91dHB1dF9ub252aXJ0dWFsKCkgd2lsbCByZW1vdmUgc3BlY2lmaWVkIGVudHJ5IGZyb20gbVBsYXliYWNrVGhyZWFkcwogICAgICAgICBjbG9zZU91dHB1dF9ub252aXJ0dWFsKG1QbGF5YmFja1RocmVhZHMua2V5QXQoMCkpOwogICAgIH0KKyAgICB3aGlsZSAoIW1NbWFwVGhyZWFkcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW8gPSBtTW1hcFRocmVhZHMua2V5QXQoMCk7CisgICAgICAgIGlmIChtTW1hcFRocmVhZHMudmFsdWVBdCgwKS0+aXNPdXRwdXQoKSkgeworICAgICAgICAgICAgY2xvc2VPdXRwdXRfbm9udmlydHVhbChpbyk7IC8vIHJlbW92ZXMgZW50cnkgZnJvbSBtTW1hcFRocmVhZHMKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNsb3NlSW5wdXRfbm9udmlydHVhbChpbyk7ICAvLyByZW1vdmVzIGVudHJ5IGZyb20gbU1tYXBUaHJlYWRzCisgICAgICAgIH0KKyAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1BdWRpb0h3RGV2cy5zaXplKCk7IGkrKykgewogICAgICAgICAvLyBubyBtSGFyZHdhcmVMb2NrIG5lZWRlZCwgYXMgdGhlcmUgYXJlIG5vIG90aGVyIHJlZmVyZW5jZXMgdG8gdGhpcwpAQCAtMzA2LDIwICszMjYsMjYgQEAKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUgPSBBVURJT19TVFJFQU1fREVGQVVMVDsKICAgICBhdWRpb19pb19oYW5kbGVfdCBpbyA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgbG9jYWxBdHRyID0gKmF0dHI7CiAgICAgaWYgKGRpcmVjdGlvbiA9PSBNbWFwU3RyZWFtSW50ZXJmYWNlOjpESVJFQ1RJT05fT1VUUFVUKSB7CiAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGZ1bGxDb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CiAgICAgICAgIGZ1bGxDb25maWcuc2FtcGxlX3JhdGUgPSBjb25maWctPnNhbXBsZV9yYXRlOwogICAgICAgICBmdWxsQ29uZmlnLmNoYW5uZWxfbWFzayA9IGNvbmZpZy0+Y2hhbm5lbF9tYXNrOwogICAgICAgICBmdWxsQ29uZmlnLmZvcm1hdCA9IGNvbmZpZy0+Zm9ybWF0OwotICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCAmaW8sCisgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzZWNvbmRhcnlPdXRwdXRzOworCisgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKCZsb2NhbEF0dHIsICZpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0dWFsU2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RyZWFtVHlwZSwgY2xpZW50LmNsaWVudFBpZCwgY2xpZW50LmNsaWVudFVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZ1bGxDb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSB8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQsICZwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJZCwgJnBvcnRJZCwgJnNlY29uZGFyeU91dHB1dHMpOworICAgICAgICBBTE9HV19JRighc2Vjb25kYXJ5T3V0cHV0cy5lbXB0eSgpLAorICAgICAgICAgICAgICAgICAiJXMgZG9lcyBub3Qgc3VwcG9ydCBzZWNvbmRhcnkgb3V0cHV0cywgaWdub3JpbmcgdGhlbSIsIF9fZnVuY19fKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGb3JBdHRyKGF0dHIsICZpbywKKyAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OmdldElucHV0Rm9yQXR0cigmbG9jYWxBdHRyLCAmaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkVDT1JEX1JJSURfSU5WQUxJRCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxTZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LmNsaWVudFBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50VWlkLApAQCAtMzM2LDEyICszNjIsMTIgQEAKICAgICBzcDxNbWFwVGhyZWFkPiB0aHJlYWQgPSBtTW1hcFRocmVhZHMudmFsdWVGb3IoaW8pOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBpbnRlcmZhY2UgPSBuZXcgTW1hcFRocmVhZEhhbmRsZSh0aHJlYWQpOwotICAgICAgICB0aHJlYWQtPmNvbmZpZ3VyZShhdHRyLCBzdHJlYW1UeXBlLCBhY3R1YWxTZXNzaW9uSWQsIGNhbGxiYWNrLCAqZGV2aWNlSWQsIHBvcnRJZCk7CisgICAgICAgIHRocmVhZC0+Y29uZmlndXJlKCZsb2NhbEF0dHIsIHN0cmVhbVR5cGUsIGFjdHVhbFNlc3Npb25JZCwgY2FsbGJhY2ssICpkZXZpY2VJZCwgcG9ydElkKTsKICAgICAgICAgKmhhbmRsZSA9IHBvcnRJZDsKICAgICAgICAgKnNlc3Npb25JZCA9IGFjdHVhbFNlc3Npb25JZDsKICAgICB9IGVsc2UgewogICAgICAgICBpZiAoZGlyZWN0aW9uID09IE1tYXBTdHJlYW1JbnRlcmZhY2U6OkRJUkVDVElPTl9PVVRQVVQpIHsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KGlvLCBzdHJlYW1UeXBlLCBhY3R1YWxTZXNzaW9uSWQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQocG9ydElkKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQocG9ydElkKTsKICAgICAgICAgfQpAQCAtMzUzLDYgKzM3OSw0NSBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKKy8qIHN0YXRpYyAqLworaW50IEF1ZGlvRmxpbmdlcjo6b25FeHRlcm5hbFZpYnJhdGlvblN0YXJ0KGNvbnN0IHNwPG9zOjpFeHRlcm5hbFZpYnJhdGlvbj4mIGV4dGVybmFsVmlicmF0aW9uKSB7CisgICAgc3A8b3M6OklFeHRlcm5hbFZpYnJhdG9yU2VydmljZT4gZXZzID0gZ2V0RXh0ZXJuYWxWaWJyYXRvclNlcnZpY2UoKTsKKyAgICBpZiAoZXZzICE9IDApIHsKKyAgICAgICAgaW50MzJfdCByZXQ7CisgICAgICAgIGJpbmRlcjo6U3RhdHVzIHN0YXR1cyA9IGV2cy0+b25FeHRlcm5hbFZpYnJhdGlvblN0YXJ0KCpleHRlcm5hbFZpYnJhdGlvbiwgJnJldCk7CisgICAgICAgIGlmIChzdGF0dXMuaXNPaygpKSB7CisgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBBdWRpb01peGVyOjpIQVBUSUNfU0NBTEVfTVVURTsKK30KKworLyogc3RhdGljICovCit2b2lkIEF1ZGlvRmxpbmdlcjo6b25FeHRlcm5hbFZpYnJhdGlvblN0b3AoY29uc3Qgc3A8b3M6OkV4dGVybmFsVmlicmF0aW9uPiYgZXh0ZXJuYWxWaWJyYXRpb24pIHsKKyAgICBzcDxvczo6SUV4dGVybmFsVmlicmF0b3JTZXJ2aWNlPiBldnMgPSBnZXRFeHRlcm5hbFZpYnJhdG9yU2VydmljZSgpOworICAgIGlmIChldnMgIT0gMCkgeworICAgICAgICBldnMtPm9uRXh0ZXJuYWxWaWJyYXRpb25TdG9wKCpleHRlcm5hbFZpYnJhdGlvbik7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OmFkZEVmZmVjdFRvSGFsKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQsCisgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBod01vZHVsZUlkLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgeworICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBtQXVkaW9Id0RldnMudmFsdWVGb3IoaHdNb2R1bGVJZCk7CisgICAgaWYgKGF1ZGlvSHdEZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCktPmFkZERldmljZUVmZmVjdChkZXZpY2VJZCwgZWZmZWN0KTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpyZW1vdmVFZmZlY3RGcm9tSGFsKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQsCisgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBod01vZHVsZUlkLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgeworICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBtQXVkaW9Id0RldnMudmFsdWVGb3IoaHdNb2R1bGVJZCk7CisgICAgaWYgKGF1ZGlvSHdEZXZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCktPnJlbW92ZURldmljZUVmZmVjdChkZXZpY2VJZCwgZWZmZWN0KTsKK30KKwogc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBhdWRpb19pbnRlcmZhY2VzW10gPSB7CiAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlksCiAgICAgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX0EyRFAsCkBAIC0zNjEsNyArNDI2LDcgQEAKIAogQXVkaW9Id0RldmljZSogQXVkaW9GbGluZ2VyOjpmaW5kU3VpdGFibGVId0Rldl9sKAogICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUpCiB7CiAgICAgLy8gaWYgbW9kdWxlIGlzIDAsIHRoZSByZXF1ZXN0IGNvbWVzIGZyb20gYW4gb2xkIHBvbGljeSBtYW5hZ2VyIGFuZCB3ZSBzaG91bGQgbG9hZAogICAgIC8vIHdlbGwga25vd24gbW9kdWxlcwpAQCAtMzc2LDcgKzQ0MSw3IEBACiAgICAgICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGRldiA9IGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCk7CiAgICAgICAgICAgICB1aW50MzJfdCBzdXBwb3J0ZWREZXZpY2VzOwogICAgICAgICAgICAgaWYgKGRldi0+Z2V0U3VwcG9ydGVkRGV2aWNlcygmc3VwcG9ydGVkRGV2aWNlcykgPT0gT0sgJiYKLSAgICAgICAgICAgICAgICAgICAgKHN1cHBvcnRlZERldmljZXMgJiBkZXZpY2VzKSA9PSBkZXZpY2VzKSB7CisgICAgICAgICAgICAgICAgICAgIChzdXBwb3J0ZWREZXZpY2VzICYgZGV2aWNlVHlwZSkgPT0gZGV2aWNlVHlwZSkgewogICAgICAgICAgICAgICAgIHJldHVybiBhdWRpb0h3RGV2aWNlOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00NTMsMTUgKzUxOCw4IEBACiAKIGJvb2wgQXVkaW9GbGluZ2VyOjpkdW1wVHJ5TG9jayhNdXRleCYgbXV0ZXgpCiB7Ci0gICAgYm9vbCBsb2NrZWQgPSBmYWxzZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtEdW1wTG9ja1JldHJpZXM7ICsraSkgewotICAgICAgICBpZiAobXV0ZXgudHJ5TG9jaygpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBsb2NrZWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdXNsZWVwKGtEdW1wTG9ja1NsZWVwVXMpOwotICAgIH0KLSAgICByZXR1cm4gbG9ja2VkOworICAgIHN0YXR1c190IGVyciA9IG11dGV4LnRpbWVkTG9jayhrRHVtcExvY2tUaW1lb3V0TnMpOworICAgIHJldHVybiBlcnIgPT0gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCkBAIC00NzgsNyArNTM2LDcgQEAKICAgICAgICAgICAgIG1IYXJkd2FyZUxvY2sudW5sb2NrKCk7CiAgICAgICAgIH0KIAotICAgICAgICBib29sIGxvY2tlZCA9IGR1bXBUcnlMb2NrKG1Mb2NrKTsKKyAgICAgICAgY29uc3QgYm9vbCBsb2NrZWQgPSBkdW1wVHJ5TG9jayhtTG9jayk7CiAKICAgICAgICAgLy8gZmFpbGVkIHRvIGxvY2sgLSBBdWRpb0ZsaW5nZXIgaXMgcHJvYmFibHkgZGVhZGxvY2tlZAogICAgICAgICBpZiAoIWxvY2tlZCkgewpAQCAtNTM0LDEyICs1OTIsMjQgQEAKICAgICAgICAgICAgIGRldi0+ZHVtcChmZCk7CiAgICAgICAgIH0KIAotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgIC8vIGR1bXAgdGhlIHNlcmlhbGx5IHNoYXJlZCByZWNvcmQgdGVlIHNpbmsKLSAgICAgICAgaWYgKG1SZWNvcmRUZWVTb3VyY2UgIT0gMCkgewotICAgICAgICAgICAgZHVtcFRlZShmZCwgbVJlY29yZFRlZVNvdXJjZSwgQVVESU9fSU9fSEFORExFX05PTkUsICdDJyk7Ci0gICAgICAgIH0KLSNlbmRpZgorICAgICAgICBtUGF0Y2hQYW5lbC5kdW1wKGZkKTsKKworICAgICAgICBtRGV2aWNlRWZmZWN0TWFuYWdlci5kdW1wKGZkKTsKKworICAgICAgICAvLyBkdW1wIGV4dGVybmFsIHNldFBhcmFtZXRlcnMKKyAgICAgICAgYXV0byBkdW1wTG9nZ2VyID0gW2ZkXShTaW1wbGVMb2cmIGxvZ2dlciwgY29uc3QgY2hhciogbmFtZSkgeworICAgICAgICAgICAgZHByaW50ZihmZCwgIlxuJXMgc2V0UGFyYW1ldGVyczpcbiIsIG5hbWUpOworICAgICAgICAgICAgbG9nZ2VyLmR1bXAoZmQsICIgICAgIiAvKiBwcmVmaXggKi8pOworICAgICAgICB9OworICAgICAgICBkdW1wTG9nZ2VyKG1SZWplY3RlZFNldFBhcmFtZXRlckxvZywgIlJlamVjdGVkIik7CisgICAgICAgIGR1bXBMb2dnZXIobUFwcFNldFBhcmFtZXRlckxvZywgIkFwcCIpOworICAgICAgICBkdW1wTG9nZ2VyKG1TeXN0ZW1TZXRQYXJhbWV0ZXJMb2csICJTeXN0ZW0iKTsKKworICAgICAgICAvLyBkdW1wIGhpc3RvcmljYWwgdGhyZWFkcyBpbiB0aGUgbGFzdCAxMCBzZWNvbmRzCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHRocmVhZExvZyA9IG1UaHJlYWRMb2cuZHVtcFRvU3RyaW5nKAorICAgICAgICAgICAgICAgICJIaXN0b3JpY2FsIFRocmVhZCBMb2cgIiwgMCAvKiBsaW5lcyAqLywKKyAgICAgICAgICAgICAgICBhdWRpb191dGlsc19nZXRfcmVhbF90aW1lX25zKCkgLSAxMCAqIDYwICogTkFOT1NfUEVSX1NFQ09ORCk7CisgICAgICAgIHdyaXRlKGZkLCB0aHJlYWRMb2cuY19zdHIoKSwgdGhyZWFkTG9nLnNpemUoKSk7CiAKICAgICAgICAgQlVGTE9HX1JFU0VUOwogCkBAIC01NDcsNiArNjE3LDEwIEBACiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgfQogCisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgLy8gTkJBSU9fVGVlIGR1bXAgaXMgc2FmZSB0byBjYWxsIG91dHNpZGUgb2YgQUYgbG9jay4KKyAgICAgICAgTkJBSU9fVGVlOjpkdW1wQWxsKGZkLCAiX0RVTVAiKTsKKyNlbmRpZgogICAgICAgICAvLyBhcHBlbmQgYSBjb3B5IG9mIG1lZGlhLmxvZyBoZXJlIGJ5IGZvcndhcmRpbmcgZmQgdG8gaXQsIGJ1dCBkb24ndCBhdHRlbXB0CiAgICAgICAgIC8vIHRvIGxvb2t1cCB0aGUgc2VydmljZSBpZiBpdCdzIG5vdCBydW5uaW5nLCBhcyBpdCB3aWxsIGJsb2NrIGZvciBhIHNlY29uZAogICAgICAgICBpZiAoc01lZGlhTG9nU2VydmljZUFzQmluZGVyICE9IDApIHsKQEAgLTY2MiwxMSArNzM2LDE2IEBACiAgICAgc3RhdHVzX3QgbFN0YXR1czsKICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGU7CiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzZWNvbmRhcnlPdXRwdXRzOwogCiAgICAgYm9vbCB1cGRhdGVQaWQgPSAoaW5wdXQuY2xpZW50SW5mby5jbGllbnRQaWQgPT0gLTEpOwogICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CiAgICAgdWlkX3QgY2xpZW50VWlkID0gaW5wdXQuY2xpZW50SW5mby5jbGllbnRVaWQ7Ci0gICAgaWYgKCFpc1RydXN0ZWRDYWxsaW5nVWlkKGNhbGxpbmdVaWQpKSB7CisgICAgYXVkaW9faW9faGFuZGxlX3QgZWZmZWN0VGhyZWFkSWQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IGVmZmVjdElkczsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgbG9jYWxBdHRyID0gaW5wdXQuYXR0cjsKKworICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKICAgICAgICAgQUxPR1dfSUYoY2xpZW50VWlkICE9IGNhbGxpbmdVaWQsCiAgICAgICAgICAgICAgICAgIiVzIHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgY2xpZW50VWlkKTsKQEAgLTY3NCw4ICs3NTMsOCBAQAogICAgICAgICB1cGRhdGVQaWQgPSB0cnVlOwogICAgIH0KICAgICBwaWRfdCBjbGllbnRQaWQgPSBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFBpZDsKKyAgICBjb25zdCBwaWRfdCBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmICh1cGRhdGVQaWQpIHsKLSAgICAgICAgY29uc3QgcGlkX3QgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICAgICAgQUxPR1dfSUYoY2xpZW50UGlkICE9IC0xICYmIGNsaWVudFBpZCAhPSBjYWxsaW5nUGlkLAogICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHBpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgcGlkICVkIiwKICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNhbGxpbmdVaWQsIGNhbGxpbmdQaWQsIGNsaWVudFBpZCk7CkBAIC02OTMsMTAgKzc3Miw5IEBACiAgICAgb3V0cHV0LnNlc3Npb25JZCA9IHNlc3Npb25JZDsKICAgICBvdXRwdXQub3V0cHV0SWQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICBvdXRwdXQuc2VsZWN0ZWREZXZpY2VJZCA9IGlucHV0LnNlbGVjdGVkRGV2aWNlSWQ7Ci0KLSAgICBsU3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldE91dHB1dEZvckF0dHIoJmlucHV0LmF0dHIsICZvdXRwdXQub3V0cHV0SWQsIHNlc3Npb25JZCwgJnN0cmVhbVR5cGUsCisgICAgbFN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGb3JBdHRyKCZsb2NhbEF0dHIsICZvdXRwdXQub3V0cHV0SWQsIHNlc3Npb25JZCwgJnN0cmVhbVR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCAmaW5wdXQuY29uZmlnLCBpbnB1dC5mbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dC5zZWxlY3RlZERldmljZUlkLCAmcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm91dHB1dC5zZWxlY3RlZERldmljZUlkLCAmcG9ydElkLCAmc2Vjb25kYXJ5T3V0cHV0cyk7CiAKICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUiB8fCBvdXRwdXQub3V0cHV0SWQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgQUxPR0UoImNyZWF0ZVRyYWNrKCkgZ2V0T3V0cHV0Rm9yQXR0cigpIHJldHVybiBlcnJvciAlZCBvciBpbnZhbGlkIG91dHB1dCBoYW5kbGUiLCBsU3RhdHVzKTsKQEAgLTc1NSwxOCArODMzLDEwOCBAQAogICAgICAgICBvdXRwdXQubm90aWZpY2F0aW9uRnJhbWVDb3VudCA9IGlucHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQ7CiAgICAgICAgIG91dHB1dC5mbGFncyA9IGlucHV0LmZsYWdzOwogCi0gICAgICAgIHRyYWNrID0gdGhyZWFkLT5jcmVhdGVUcmFja19sKGNsaWVudCwgc3RyZWFtVHlwZSwgaW5wdXQuYXR0ciwgJm91dHB1dC5zYW1wbGVSYXRlLAorICAgICAgICB0cmFjayA9IHRocmVhZC0+Y3JlYXRlVHJhY2tfbChjbGllbnQsIHN0cmVhbVR5cGUsIGxvY2FsQXR0ciwgJm91dHB1dC5zYW1wbGVSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25maWcuZm9ybWF0LCBpbnB1dC5jb25maWcuY2hhbm5lbF9tYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LmZyYW1lQ291bnQsICZvdXRwdXQubm90aWZpY2F0aW9uRnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQubm90aWZpY2F0aW9uc1BlckJ1ZmZlciwgaW5wdXQuc3BlZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LnNoYXJlZEJ1ZmZlciwgc2Vzc2lvbklkLCAmb3V0cHV0LmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFRpZCwgY2xpZW50VWlkLCAmbFN0YXR1cywgcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCwgaW5wdXQuY2xpZW50SW5mby5jbGllbnRUaWQsIGNsaWVudFVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxTdGF0dXMsIHBvcnRJZCk7CiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoKGxTdGF0dXMgPT0gTk9fRVJST1IpICYmICh0cmFjayA9PSAwKSk7CiAgICAgICAgIC8vIHdlIGRvbid0IGFib3J0IHlldCBpZiBsU3RhdHVzICE9IE5PX0VSUk9SOyB0aGVyZSBpcyBzdGlsbCB3b3JrIHRvIGJlIGRvbmUgcmVnYXJkbGVzcwogCiAgICAgICAgIG91dHB1dC5hZkZyYW1lQ291bnQgPSB0aHJlYWQtPmZyYW1lQ291bnQoKTsKICAgICAgICAgb3V0cHV0LmFmU2FtcGxlUmF0ZSA9IHRocmVhZC0+c2FtcGxlUmF0ZSgpOwogICAgICAgICBvdXRwdXQuYWZMYXRlbmN5TXMgPSB0aHJlYWQtPmxhdGVuY3koKTsKKyAgICAgICAgb3V0cHV0LnBvcnRJZCA9IHBvcnRJZDsKKworICAgICAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgLy8gQ29ubmVjdCBzZWNvbmRhcnkgb3V0cHV0cy4gRmFpbHVyZSBvbiBhIHNlY29uZGFyeSBvdXRwdXQgbXVzdCBub3QgaW1wZWQgdGhlIHByaW1hcnkKKyAgICAgICAgICAgIC8vIEFueSBzZWNvbmRhcnkgb3V0cHV0IHNldHVwIGZhaWx1cmUgd2lsbCBsZWFkIHRvIGEgZGVzeW5jIGJldHdlZW4gdGhlIEFQIGFuZCBBRiB1bnRpbAorICAgICAgICAgICAgLy8gdGhlIHRyYWNrIGlzIGRlc3Ryb3llZC4KKyAgICAgICAgICAgIFRlZVBhdGNoZXMgdGVlUGF0Y2hlczsKKyAgICAgICAgICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgc2Vjb25kYXJ5T3V0cHV0IDogc2Vjb25kYXJ5T3V0cHV0cykgeworICAgICAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpzZWNvbmRhcnlUaHJlYWQgPSBjaGVja1BsYXliYWNrVGhyZWFkX2woc2Vjb25kYXJ5T3V0cHV0KTsKKyAgICAgICAgICAgICAgICBpZiAoc2Vjb25kYXJ5VGhyZWFkID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIm5vIHBsYXliYWNrIHRocmVhZCBmb3VuZCBmb3Igc2Vjb25kYXJ5IG91dHB1dCAlZCIsIG91dHB1dC5vdXRwdXRJZCk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIHNpemVfdCBzb3VyY2VGcmFtZUNvdW50ID0gdGhyZWFkLT5mcmFtZUNvdW50KCkgKiBvdXRwdXQuc2FtcGxlUmF0ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyB0aHJlYWQtPnNhbXBsZVJhdGUoKTsKKyAgICAgICAgICAgICAgICBzaXplX3Qgc2lua0ZyYW1lQ291bnQgPSBzZWNvbmRhcnlUaHJlYWQtPmZyYW1lQ291bnQoKSAqIG91dHB1dC5zYW1wbGVSYXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvIHNlY29uZGFyeVRocmVhZC0+c2FtcGxlUmF0ZSgpOworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBzZWNvbmRhcnkgb3V0cHV0IGhhcyBqdXN0IGJlZW4gb3BlbmVkLCB0aGUgZmlyc3Qgc2Vjb25kYXJ5VGhyZWFkIHdyaXRlCisgICAgICAgICAgICAgICAgLy8gd2lsbCBub3QgYmxvY2sgYXMgaXQgd2lsbCBmaWxsIHRoZSBlbXB0eSBzdGFydHVwIGJ1ZmZlciBvZiB0aGUgSEFMLAorICAgICAgICAgICAgICAgIC8vIHNvIGEgc2Vjb25kIHNpbmsgYnVmZmVyIG5lZWRzIHRvIGJlIHJlYWR5IGZvciB0aGUgaW1tZWRpYXRlIG5leHQgYmxvY2tpbmcgd3JpdGUuCisgICAgICAgICAgICAgICAgLy8gQWRkaXRpb25hbGx5LCBoYXZlIGEgbWFyZ2luIG9mIG9uZSBtYWluIHRocmVhZCBidWZmZXIgYXMgdGhlIHNjaGVkdWxpbmcgaml0dGVyCisgICAgICAgICAgICAgICAgLy8gY2FuIHJlb3JkZXIgdGhlIHdyaXRlcyAoZWcgaWYgdGhyZWFkIEEmQiBoYXZlIHRoZSBzYW1lIHdyaXRlIGludGVydmFsZSwKKyAgICAgICAgICAgICAgICAvLyB0aGUgc2NoZWR1bGVyIGNvdWxkIHNjaGVkdWxlIEFCLi4uQkEpCisgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnRUb0JlUmVhZHkgPSAyICogc2lua0ZyYW1lQ291bnQgKyBzb3VyY2VGcmFtZUNvdW50OworICAgICAgICAgICAgICAgIC8vIFRvdGFsIHNlY29uZGFyeSBvdXRwdXQgYnVmZmVyIG11c3QgYmUgYXQgbGVhc3QgYXMgdGhlIHJlYWQgZnJhbWVzIHBsdXMKKyAgICAgICAgICAgICAgICAvLyB0aGUgbWFyZ2luIG9mIGEgZmV3IGJ1ZmZlcnMgb24gYm90aCBzaWRlcyBpbiBjYXNlIHRoZQorICAgICAgICAgICAgICAgIC8vIHRocmVhZHMgc2NoZWR1bGluZyBoYXMgc29tZSBqaXR0ZXIuCisgICAgICAgICAgICAgICAgLy8gVGhhdCB2YWx1ZSBzaG91bGQgbm90IGltcGFjdCBsYXRlbmN5IGFzIHRoZSBzZWNvbmRhcnkgdHJhY2sgaXMgc3RhcnRlZCBiZWZvcmUKKyAgICAgICAgICAgICAgICAvLyBpdHMgYnVmZmVyIGlzIGZ1bGwsIHNlZSBmcmFtZUNvdW50VG9CZVJlYWR5LgorICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50ID0gZnJhbWVDb3VudFRvQmVSZWFkeSArIDIgKiAoc291cmNlRnJhbWVDb3VudCArIHNpbmtGcmFtZUNvdW50KTsKKyAgICAgICAgICAgICAgICAvLyBUaGUgZnJhbWVDb3VudCBzaG91bGQgYWxzbyBub3QgYmUgc21hbGxlciB0aGFuIHRoZSBzZWNvbmRhcnkgdGhyZWFkIG1pbiBmcmFtZQorICAgICAgICAgICAgICAgIC8vIGNvdW50CisgICAgICAgICAgICAgICAgc2l6ZV90IG1pbkZyYW1lQ291bnQgPSBBdWRpb1N5c3RlbTo6Y2FsY3VsYXRlTWluRnJhbWVDb3VudCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJl0geyBNdXRleDo6QXV0b2xvY2sgX2woc2Vjb25kYXJ5VGhyZWFkLT5tTG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlY29uZGFyeVRocmVhZC0+bGF0ZW5jeV9sKCk7IH0oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmRhcnlUaHJlYWQtPm1Ob3JtYWxGcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeVRocmVhZC0+bVNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuc3BlZWQpOworICAgICAgICAgICAgICAgIGZyYW1lQ291bnQgPSBzdGQ6Om1heChmcmFtZUNvdW50LCBtaW5GcmFtZUNvdW50KTsKKworICAgICAgICAgICAgICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ub19saXRlcmFsczsKKyAgICAgICAgICAgICAgICBhdXRvIGluQ2hhbm5lbE1hc2sgPSBhdWRpb19jaGFubmVsX21hc2tfb3V0X3RvX2luKGlucHV0LmNvbmZpZy5jaGFubmVsX21hc2spOworICAgICAgICAgICAgICAgIHNwIHBhdGNoUmVjb3JkID0gbmV3IFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQobnVsbHB0ciAvKiB0aHJlYWQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jb25maWcuZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgLyogYnVmZmVyICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX0RJUkVDVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDBucyAvKiB0aW1lb3V0ICovKTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBwYXRjaFJlY29yZC0+aW5pdENoZWNrKCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiU2Vjb25kYXJ5IG91dHB1dCBwYXRjaFJlY29yZCBpbml0IGZhaWxlZDogJWQiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBXZSBjb3VsZCBjaGVjayBjb21wYXRpYmlsaXR5IG9mIHRoZSBzZWNvbmRhcnlUaHJlYWQgd2l0aCB0aGUgUGF0Y2hUcmFjaworICAgICAgICAgICAgICAgIC8vIGZvciBmYXN0IHVzYWdlOiB0aHJlYWQgaGFzIGZhc3QgbWl4ZXIsIHNhbXBsZSByYXRlIG1hdGNoZXMsIGV0Yy47CisgICAgICAgICAgICAgICAgLy8gZm9yIG5vdywgd2UgZXhjbHVkZSBmYXN0IHRyYWNrcyBieSByZW1vdmluZyB0aGUgRmFzdCBmbGFnLgorICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX291dHB1dF9mbGFnc190IG91dHB1dEZsYWdzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkob3V0cHV0LmZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOworICAgICAgICAgICAgICAgIHNwIHBhdGNoVHJhY2sgPSBuZXcgUGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2soc2Vjb25kYXJ5VGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5zYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQuY29uZmlnLmNoYW5uZWxfbWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbmZpZy5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hSZWNvcmQtPmJ1ZmZlcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2hSZWNvcmQtPmJ1ZmZlclNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMG5zIC8qIHRpbWVvdXQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50VG9CZVJlYWR5KTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBwYXRjaFRyYWNrLT5pbml0Q2hlY2soKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJTZWNvbmRhcnkgb3V0cHV0IHBhdGNoVHJhY2sgaW5pdCBmYWlsZWQ6ICVkIiwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRlZVBhdGNoZXMucHVzaF9iYWNrKHtwYXRjaFJlY29yZCwgcGF0Y2hUcmFja30pOworICAgICAgICAgICAgICAgIHNlY29uZGFyeVRocmVhZC0+YWRkUGF0Y2hUcmFjayhwYXRjaFRyYWNrKTsKKyAgICAgICAgICAgICAgICAvLyBJbiBjYXNlIHRoZSBkb3duc3RyZWFtIHBhdGNoVHJhY2sgb24gdGhlIHNlY29uZGFyeVRocmVhZCB0ZW1wb3JhcmlseSBvdXRsaXZlcworICAgICAgICAgICAgICAgIC8vIG91ciBjcmVhdGVkIHRyYWNrLCBlbnN1cmUgdGhlIGNvcnJlc3BvbmRpbmcgcGF0Y2hSZWNvcmQgaXMgc3RpbGwgYWxpdmUuCisgICAgICAgICAgICAgICAgcGF0Y2hUcmFjay0+c2V0UGVlclByb3h5KHBhdGNoUmVjb3JkLCB0cnVlIC8qIGhvbGRSZWZlcmVuY2UgKi8pOworICAgICAgICAgICAgICAgIHBhdGNoUmVjb3JkLT5zZXRQZWVyUHJveHkocGF0Y2hUcmFjaywgZmFsc2UgLyogaG9sZFJlZmVyZW5jZSAqLyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0cmFjay0+c2V0VGVlUGF0Y2hlcyhzdGQ6Om1vdmUodGVlUGF0Y2hlcykpOworICAgICAgICB9CiAKICAgICAgICAgLy8gbW92ZSBlZmZlY3QgY2hhaW4gdG8gdGhpcyBvdXRwdXQgdGhyZWFkIGlmIGFuIGVmZmVjdCBvbiBzYW1lIHNlc3Npb24gd2FzIHdhaXRpbmcKICAgICAgICAgLy8gZm9yIGEgdHJhY2sgdG8gYmUgY3JlYXRlZApAQCAtNzc0LDcgKzk0MiwxMCBAQAogICAgICAgICAgICAgLy8gbm8gcmlzayBvZiBkZWFkbG9jayBiZWNhdXNlIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaXMgaGVsZAogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9kbCh0aHJlYWQtPm1Mb2NrKTsKICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfc2woZWZmZWN0VGhyZWFkLT5tTG9jayk7Ci0gICAgICAgICAgICBtb3ZlRWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQsIGVmZmVjdFRocmVhZCwgdGhyZWFkLCB0cnVlKTsKKyAgICAgICAgICAgIGlmIChtb3ZlRWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQsIGVmZmVjdFRocmVhZCwgdGhyZWFkKSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGVmZmVjdFRocmVhZElkID0gdGhyZWFkLT5pZCgpOworICAgICAgICAgICAgICAgIGVmZmVjdElkcyA9IHRocmVhZC0+Z2V0RWZmZWN0SWRzX2woc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIExvb2sgZm9yIHN5bmMgZXZlbnRzIGF3YWl0aW5nIGZvciBhIHNlc3Npb24gdG8gYmUgdXNlZC4KQEAgLTgwOCwxMiArOTc5LDE4IEBACiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKKyAgICAvLyBlZmZlY3RUaHJlYWRJZCBpcyBub3QgTk9ORSBpZiBhbiBlZmZlY3QgY2hhaW4gY29ycmVzcG9uZGluZyB0byB0aGUgdHJhY2sgc2Vzc2lvbgorICAgIC8vIHdhcyBmb3VuZCBvbiBhbm90aGVyIHRocmVhZCBhbmQgbXVzdCBiZSBtb3ZlZCBvbiB0aGlzIHRocmVhZAorICAgIGlmIChlZmZlY3RUaHJlYWRJZCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICBBdWRpb1N5c3RlbTo6bW92ZUVmZmVjdHNUb0lvKGVmZmVjdElkcywgZWZmZWN0VGhyZWFkSWQpOworICAgIH0KKwogICAgIC8vIHJldHVybiBoYW5kbGUgdG8gY2xpZW50CiAgICAgdHJhY2tIYW5kbGUgPSBuZXcgVHJhY2tIYW5kbGUodHJhY2spOwogCiBFeGl0OgogICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SICYmIG91dHB1dC5vdXRwdXRJZCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChvdXRwdXQub3V0cHV0SWQsIHN0cmVhbVR5cGUsIHNlc3Npb25JZCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiAgICAgfQogICAgICpzdGF0dXMgPSBsU3RhdHVzOwogICAgIHJldHVybiB0cmFja0hhbmRsZTsKQEAgLTkxNyw2ICsxMDk0LDQwIEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldE1hc3RlckJhbGFuY2UoZmxvYXQgYmFsYW5jZSkKK3sKKyAgICBzdGF0dXNfdCByZXQgPSBpbml0Q2hlY2soKTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgLy8gY2hlY2sgY2FsbGluZyBwZXJtaXNzaW9ucworICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKworICAgIC8vIGNoZWNrIHJhbmdlCisgICAgaWYgKGlzbmFuKGJhbGFuY2UpIHx8IGZhYnMoYmFsYW5jZSkgPiAxLmYpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworCisgICAgLy8gc2hvcnQgY3V0LgorICAgIGlmIChtTWFzdGVyQmFsYW5jZSA9PSBiYWxhbmNlKSByZXR1cm4gTk9fRVJST1I7CisKKyAgICBtTWFzdGVyQmFsYW5jZSA9IGJhbGFuY2U7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+aXNEdXBsaWNhdGluZygpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPnNldE1hc3RlckJhbGFuY2UoYmFsYW5jZSk7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpCiB7CiAgICAgc3RhdHVzX3QgcmV0ID0gaW5pdENoZWNrKCk7CkBAIC0xMDU2LDYgKzEyNjcsMTMgQEAKICAgICByZXR1cm4gbWFzdGVyVm9sdW1lX2woKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpnZXRNYXN0ZXJCYWxhbmNlKGZsb2F0ICpiYWxhbmNlKSBjb25zdAoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgKmJhbGFuY2UgPSBnZXRNYXN0ZXJCYWxhbmNlX2woKTsKKyAgICByZXR1cm4gTk9fRVJST1I7IC8vIGlmIGNhbGxlZCB0aHJvdWdoIGJpbmRlciwgbWF5IHJldHVybiBhIHRyYW5zYWN0aW9uYWwgZXJyb3IKK30KKwogYm9vbCBBdWRpb0ZsaW5nZXI6Om1hc3Rlck11dGUoKSBjb25zdAogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0xMDY3LDYgKzEyODUsMTEgQEAKICAgICByZXR1cm4gbU1hc3RlclZvbHVtZTsKIH0KIAorZmxvYXQgQXVkaW9GbGluZ2VyOjpnZXRNYXN0ZXJCYWxhbmNlX2woKSBjb25zdAoreworICAgIHJldHVybiBtTWFzdGVyQmFsYW5jZTsKK30KKwogYm9vbCBBdWRpb0ZsaW5nZXI6Om1hc3Rlck11dGVfbCgpIGNvbnN0CiB7CiAgICAgcmV0dXJuIG1NYXN0ZXJNdXRlOwpAQCAtMTA3OCw5ICsxMzAxLDkgQEAKICAgICAgICAgQUxPR1coImNoZWNrU3RyZWFtVHlwZSgpIGludmFsaWQgc3RyZWFtICVkIiwgc3RyZWFtKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgcGlkX3QgY2FsbGVyID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UICYmIGNhbGxlciAhPSBnZXRwaWRfY2FjaGVkKSB7Ci0gICAgICAgIEFMT0dXKCJjaGVja1N0cmVhbVR5cGUoKSBwaWQgJWQgY2Fubm90IHVzZSBpbnRlcm5hbCBzdHJlYW0gdHlwZSAlZCIsIGNhbGxlciwgc3RyZWFtKTsKKyAgICBjb25zdCB1aWRfdCBjYWxsZXJVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQgJiYgIWlzQXVkaW9TZXJ2ZXJVaWQoY2FsbGVyVWlkKSkgeworICAgICAgICBBTE9HVygiY2hlY2tTdHJlYW1UeXBlKCkgdWlkICVkIGNhbm5vdCB1c2UgaW50ZXJuYWwgc3RyZWFtIHR5cGUgJWQiLCBjYWxsZXJVaWQsIHN0cmVhbSk7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKQEAgLTExMDIsNyArMTMyNSw4IEBACiAgICAgaWYgKG91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBBTE9HX0FTU0VSVChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX1BBVENILCAiYXR0ZW1wdCB0byBjaGFuZ2UgQVVESU9fU1RSRUFNX1BBVENIIHZvbHVtZSIpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RyZWFtID09IEFVRElPX1NUUkVBTV9QQVRDSCAmJiB2YWx1ZSAhPSAxLjBmLAorICAgICAgICAgICAgICAgICAgICAgICAgIkFVRElPX1NUUkVBTV9QQVRDSCBtdXN0IGhhdmUgZnVsbCBzY2FsZSB2b2x1bWUiKTsKIAogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBWb2x1bWVJbnRlcmZhY2UgKnZvbHVtZUludGVyZmFjZSA9IGdldFZvbHVtZUludGVyZmFjZV9sKG91dHB1dCk7CkBAIC0xMTgwLDYgKzE0MDQsMzAgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjp1cGRhdGVPdXREZXZpY2VzRm9yUmVjb3JkVGhyZWFkc19sKGNvbnN0IERldmljZURlc2NyaXB0b3JCYXNlVmVjdG9yJiBkZXZpY2VzKQoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVJlY29yZFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgbVJlY29yZFRocmVhZHMudmFsdWVBdChpKS0+dXBkYXRlT3V0RGV2aWNlcyhkZXZpY2VzKTsKKyAgICB9Cit9CisKKy8vIGZvcndhcmRBdWRpb0h3U3luY1RvRG93bnN0cmVhbVBhdGNoZXNfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCit2b2lkIEF1ZGlvRmxpbmdlcjo6Zm9yd2FyZFBhcmFtZXRlcnNUb0Rvd25zdHJlYW1QYXRjaGVzX2woCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHVwU3RyZWFtLCBjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXJzLAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+Jik+IHVzZVRocmVhZCkKK3sKKyAgICBzdGQ6OnZlY3RvcjxQYXRjaFBhbmVsOjpTb2Z0d2FyZVBhdGNoPiBzd1BhdGNoZXM7CisgICAgaWYgKG1QYXRjaFBhbmVsLmdldERvd25zdHJlYW1Tb2Z0d2FyZVBhdGNoZXModXBTdHJlYW0sICZzd1BhdGNoZXMpICE9IE9LKSByZXR1cm47CisgICAgQUxPR1ZfSUYoIXN3UGF0Y2hlcy5lbXB0eSgpLCAiJXMgZm91bmQgJXp1IGRvd25zdHJlYW0gcGF0Y2hlcyBmb3Igc3RyZWFtIElEICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBzd1BhdGNoZXMuc2l6ZSgpLCB1cFN0cmVhbSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBzd1BhdGNoIDogc3dQYXRjaGVzKSB7CisgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiBkb3duU3RyZWFtID0gY2hlY2tQbGF5YmFja1RocmVhZF9sKHN3UGF0Y2guZ2V0UGxheWJhY2tUaHJlYWRIYW5kbGUoKSk7CisgICAgICAgIGlmIChkb3duU3RyZWFtICE9IE5VTEwgJiYgKHVzZVRocmVhZCA9PSBudWxscHRyIHx8IHVzZVRocmVhZChkb3duU3RyZWFtKSkpIHsKKyAgICAgICAgICAgIGRvd25TdHJlYW0tPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIC8vIEZpbHRlciByZXNlcnZlZCBrZXlzIGZyb20gc2V0UGFyYW1ldGVycygpIGJlZm9yZSBmb3J3YXJkaW5nIHRvIGF1ZGlvIEhBTCBvciBhY3RpbmcgdXBvbi4KIC8vIFNvbWUga2V5cyBhcmUgdXNlZCBmb3IgYXVkaW8gcm91dGluZyBhbmQgYXVkaW8gcGF0aCBjb25maWd1cmF0aW9uIGFuZCBzaG91bGQgYmUgcmVzZXJ2ZWQgZm9yIHVzZQogLy8gYnkgYXVkaW8gcG9saWN5IGFuZCBhdWRpbyBmbGluZ2VyIGZvciBmdW5jdGlvbmFsLCBwcml2YWN5IGFuZCBzZWN1cml0eSByZWFzb25zLgpAQCAtMTE5MywzMCArMTQ0MSw0NiBAQAogICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlGcmFtZUNvdW50KSwKICAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5SW5wdXRTb3VyY2UpLAogICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlNb25vT3V0cHV0KSwKLSAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtQ29ubmVjdCksCi0gICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbURpc2Nvbm5lY3QpLAorICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlEZXZpY2VDb25uZWN0KSwKKyAgICAgICAgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5RGV2aWNlRGlzY29ubmVjdCksCiAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZEZvcm1hdHMpLAogICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1TdXBwb3J0ZWRDaGFubmVscyksCiAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZFNhbXBsaW5nUmF0ZXMpLAogICAgIH07CiAKLSAgICAvLyBtdWx0aXVzZXIgZnJpZW5kbHkgYXBwIElEIGNoZWNrIGZvciByZXF1ZXN0cyBjb21pbmcgZnJvbSBhdWRpb3NlcnZlcgotICAgIGlmIChtdWx0aXVzZXJfZ2V0X2FwcF9pZChjYWxsaW5nVWlkKSA9PSBBSURfQVVESU9TRVJWRVIpIHsKLSAgICAgICAgcmV0dXJuOworICAgIGlmIChpc0F1ZGlvU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CisgICAgICAgIHJldHVybjsgLy8gbm8gbmVlZCB0byBmaWx0ZXIgaWYgYXVkaW9zZXJ2ZXIuCiAgICAgfQogCiAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcihrZXlWYWx1ZVBhaXJzKTsKICAgICBTdHJpbmc4IHZhbHVlOworICAgIEF1ZGlvUGFyYW1ldGVyIHJlamVjdGVkUGFyYW07CiAgICAgZm9yIChhdXRvJiBrZXkgOiBrUmVzZXJ2ZWRQYXJhbWV0ZXJzKSB7CiAgICAgICAgIGlmIChwYXJhbS5nZXQoa2V5LCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIEFMT0dXKCIlczogZmlsdGVyaW5nIGtleSAlcyB2YWx1ZSAlcyBmcm9tIHVpZCAlZCIsCi0gICAgICAgICAgICAgICAgICBfX2Z1bmNfXywga2V5LnN0cmluZygpLCB2YWx1ZS5zdHJpbmcoKSwgY2FsbGluZ1VpZCk7CisgICAgICAgICAgICByZWplY3RlZFBhcmFtLmFkZChrZXksIHZhbHVlKTsKICAgICAgICAgICAgIHBhcmFtLnJlbW92ZShrZXkpOwogICAgICAgICB9CiAgICAgfQorICAgIGxvZ0ZpbHRlcmVkUGFyYW1ldGVycyhwYXJhbS5zaXplKCkgKyByZWplY3RlZFBhcmFtLnNpemUoKSwga2V5VmFsdWVQYWlycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVqZWN0ZWRQYXJhbS5zaXplKCksIHJlamVjdGVkUGFyYW0udG9TdHJpbmcoKSwgY2FsbGluZ1VpZCk7CiAgICAga2V5VmFsdWVQYWlycyA9IHBhcmFtLnRvU3RyaW5nKCk7CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpsb2dGaWx0ZXJlZFBhcmFtZXRlcnMoc2l6ZV90IG9yaWdpbmFsS1ZQU2l6ZSwgY29uc3QgU3RyaW5nOCYgb3JpZ2luYWxLVlBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVqZWN0ZWRLVlBTaXplLCBjb25zdCBTdHJpbmc4JiByZWplY3RlZEtWUHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IGNhbGxpbmdVaWQpIHsKKyAgICBhdXRvIHByZWZpeCA9IFN0cmluZzg6OmZvcm1hdCgiVUlEICU1ZCIsIGNhbGxpbmdVaWQpOworICAgIGF1dG8gc3VmZml4ID0gU3RyaW5nODo6Zm9ybWF0KCIlenUgS1ZQIHJlY2VpdmVkOiAlcyIsIG9yaWdpbmFsS1ZQU2l6ZSwgb3JpZ2luYWxLVlBzLmNfc3RyKCkpOworICAgIGlmIChyZWplY3RlZEtWUFNpemUgIT0gMCkgeworICAgICAgICBhdXRvIGVycm9yID0gU3RyaW5nODo6Zm9ybWF0KCIlenUgS1ZQIHJlamVjdGVkOiAlcyIsIHJlamVjdGVkS1ZQU2l6ZSwgcmVqZWN0ZWRLVlBzLmNfc3RyKCkpOworICAgICAgICBBTE9HVygiJXM6ICVzLCAlcywgJXMiLCBfX2Z1bmNfXywgcHJlZml4LmNfc3RyKCksIGVycm9yLmNfc3RyKCksIHN1ZmZpeC5jX3N0cigpKTsKKyAgICAgICAgbVJlamVjdGVkU2V0UGFyYW1ldGVyTG9nLmxvZygiJXMsICVzLCAlcyIsIHByZWZpeC5jX3N0cigpLCBlcnJvci5jX3N0cigpLCBzdWZmaXguY19zdHIoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYXV0byYgbG9nZ2VyID0gKGlzU2VydmljZVVpZChjYWxsaW5nVWlkKSA/IG1TeXN0ZW1TZXRQYXJhbWV0ZXJMb2cgOiBtQXBwU2V0UGFyYW1ldGVyTG9nKTsKKyAgICAgICAgbG9nZ2VyLmxvZygiJXMsICVzIiwgcHJlZml4LmNfc3RyKCksIHN1ZmZpeC5jX3N0cigpKTsKKyAgICB9Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycykKIHsKICAgICBBTE9HVigic2V0UGFyYW1ldGVycygpOiBpbyAlZCwga2V5dmFsdWUgJXMsIGNhbGxpbmcgcGlkICVkIGNhbGxpbmcgdWlkICVkIiwKQEAgLTEyOTYsNyArMTU2MCw5IEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiB0aHJlYWQtPnNldFBhcmFtZXRlcnMoZmlsdGVyZWRLZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gdGhyZWFkLT5zZXRQYXJhbWV0ZXJzKGZpbHRlcmVkS2V5VmFsdWVQYWlycyk7CisgICAgICAgIGZvcndhcmRQYXJhbWV0ZXJzVG9Eb3duc3RyZWFtUGF0Y2hlc19sKHRocmVhZC0+aWQoKSwgZmlsdGVyZWRLZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KQEAgLTEzNjEsNyArMTYyNyw3IEBACiAgICAgcHJvcG9zZWQuZm9ybWF0ID0gZm9ybWF0OwogCiAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBkZXYgPSBtUHJpbWFyeUhhcmR3YXJlRGV2LT5od0RldmljZSgpOwotICAgIHNpemVfdCBmcmFtZXM7CisgICAgc2l6ZV90IGZyYW1lcyA9IDA7CiAgICAgZm9yICg7OykgewogICAgICAgICAvLyBOb3RlOiBjb25maWcgaXMgY3VycmVudGx5IGEgY29uc3QgcGFyYW1ldGVyIGZvciBnZXRfaW5wdXRfYnVmZmVyX3NpemUoKQogICAgICAgICAvLyBidXQgd2UgdXNlIGEgY29weSBmcm9tIHByb3Bvc2VkIGluIGNhc2UgY29uZmlnIGNoYW5nZXMgZnJvbSB0aGUgY2FsbC4KQEAgLTE0NzIsMzAgKzE3MzgsMzYgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudChwaWRfdCBwaWQpCiB7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzdGQ6OnZlY3Rvcjwgc3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU+ID4gcmVtb3ZlZEVmZmVjdHM7CiAgICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2NsKG1DbGllbnRMb2NrKTsKLSAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMucmVtb3ZlSXRlbShwaWQpOwotICAgIH0KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9jbChtQ2xpZW50TG9jayk7CisgICAgICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5yZW1vdmVJdGVtKHBpZCk7CisgICAgICAgIH0KIAotICAgIEFMT0dWKCIlZCBkaWVkLCByZWxlYXNpbmcgaXRzIHNlc3Npb25zIiwgcGlkKTsKLSAgICBzaXplX3QgbnVtID0gbUF1ZGlvU2Vzc2lvblJlZnMuc2l6ZSgpOwotICAgIGJvb2wgcmVtb3ZlZCA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtOyApIHsKLSAgICAgICAgQXVkaW9TZXNzaW9uUmVmICpyZWYgPSBtQXVkaW9TZXNzaW9uUmVmcy5pdGVtQXQoaSk7Ci0gICAgICAgIEFMT0dWKCIgcGlkICVkIEAgJXp1IiwgcmVmLT5tUGlkLCBpKTsKLSAgICAgICAgaWYgKHJlZi0+bVBpZCA9PSBwaWQpIHsKLSAgICAgICAgICAgIEFMT0dWKCIgcmVtb3ZpbmcgZW50cnkgZm9yIHBpZCAlZCBzZXNzaW9uICVkIiwgcGlkLCByZWYtPm1TZXNzaW9uaWQpOwotICAgICAgICAgICAgbUF1ZGlvU2Vzc2lvblJlZnMucmVtb3ZlQXQoaSk7Ci0gICAgICAgICAgICBkZWxldGUgcmVmOwotICAgICAgICAgICAgcmVtb3ZlZCA9IHRydWU7Ci0gICAgICAgICAgICBudW0tLTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGkrKzsKKyAgICAgICAgQUxPR1YoIiVkIGRpZWQsIHJlbGVhc2luZyBpdHMgc2Vzc2lvbnMiLCBwaWQpOworICAgICAgICBzaXplX3QgbnVtID0gbUF1ZGlvU2Vzc2lvblJlZnMuc2l6ZSgpOworICAgICAgICBib29sIHJlbW92ZWQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW07ICkgeworICAgICAgICAgICAgQXVkaW9TZXNzaW9uUmVmICpyZWYgPSBtQXVkaW9TZXNzaW9uUmVmcy5pdGVtQXQoaSk7CisgICAgICAgICAgICBBTE9HVigiIHBpZCAlZCBAICV6dSIsIHJlZi0+bVBpZCwgaSk7CisgICAgICAgICAgICBpZiAocmVmLT5tUGlkID09IHBpZCkgeworICAgICAgICAgICAgICAgIEFMT0dWKCIgcmVtb3ZpbmcgZW50cnkgZm9yIHBpZCAlZCBzZXNzaW9uICVkIiwgcGlkLCByZWYtPm1TZXNzaW9uaWQpOworICAgICAgICAgICAgICAgIG1BdWRpb1Nlc3Npb25SZWZzLnJlbW92ZUF0KGkpOworICAgICAgICAgICAgICAgIGRlbGV0ZSByZWY7CisgICAgICAgICAgICAgICAgcmVtb3ZlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgbnVtLS07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAocmVtb3ZlZCkgeworICAgICAgICAgICAgcmVtb3ZlZEVmZmVjdHMgPSBwdXJnZVN0YWxlRWZmZWN0c19sKCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKHJlbW92ZWQpIHsKLSAgICAgICAgcHVyZ2VTdGFsZUVmZmVjdHNfbCgpOworICAgIGZvciAoYXV0byYgZWZmZWN0IDogcmVtb3ZlZEVmZmVjdHMpIHsKKyAgICAgICAgZWZmZWN0LT51cGRhdGVQb2xpY3lTdGF0ZSgpOwogICAgIH0KIH0KIApAQCAtMTUyMSwxOCArMTc5MywzNSBAQAogfQogCiAvLyBnZXRFZmZlY3RUaHJlYWRfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCi1zcDxBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkPiBBdWRpb0ZsaW5nZXI6OmdldEVmZmVjdFRocmVhZF9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCi0gICAgICAgIGludCBFZmZlY3RJZCkKK3NwPEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZT4gQXVkaW9GbGluZ2VyOjpnZXRFZmZlY3RUaHJlYWRfbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICBpbnQgZWZmZWN0SWQpCiB7Ci0gICAgc3A8UGxheWJhY2tUaHJlYWQ+IHRocmVhZDsKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQ7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QbGF5YmFja1RocmVhZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+Z2V0RWZmZWN0KHNlc3Npb25JZCwgRWZmZWN0SWQpICE9IDApIHsKKyAgICAgICAgaWYgKG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKS0+Z2V0RWZmZWN0KHNlc3Npb25JZCwgZWZmZWN0SWQpICE9IDApIHsKICAgICAgICAgICAgIEFMT0dfQVNTRVJUKHRocmVhZCA9PSAwKTsKICAgICAgICAgICAgIHRocmVhZCA9IG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKTsKICAgICAgICAgfQogICAgIH0KLQorICAgIGlmICh0aHJlYWQgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gdGhyZWFkOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1SZWNvcmRUaHJlYWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpLT5nZXRFZmZlY3Qoc2Vzc2lvbklkLCBlZmZlY3RJZCkgIT0gMCkgeworICAgICAgICAgICAgQUxPR19BU1NFUlQodGhyZWFkID09IDApOworICAgICAgICAgICAgdGhyZWFkID0gbVJlY29yZFRocmVhZHMudmFsdWVBdChpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAodGhyZWFkICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHRocmVhZDsKKyAgICB9CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW1hcFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKG1NbWFwVGhyZWFkcy52YWx1ZUF0KGkpLT5nZXRFZmZlY3Qoc2Vzc2lvbklkLCBlZmZlY3RJZCkgIT0gMCkgeworICAgICAgICAgICAgQUxPR19BU1NFUlQodGhyZWFkID09IDApOworICAgICAgICAgICAgdGhyZWFkID0gbU1tYXBUaHJlYWRzLnZhbHVlQXQoaSk7CisgICAgICAgIH0KKyAgICB9CiAgICAgcmV0dXJuIHRocmVhZDsKIH0KIApAQCAtMTYzNiw3ICsxOTI1LDcgQEAKICAgICBib29sIHVwZGF0ZVBpZCA9IChpbnB1dC5jbGllbnRJbmZvLmNsaWVudFBpZCA9PSAtMSk7CiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKICAgICB1aWRfdCBjbGllbnRVaWQgPSBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFVpZDsKLSAgICBpZiAoIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkpIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKGNhbGxpbmdVaWQpKSB7CiAgICAgICAgIEFMT0dXX0lGKGNsaWVudFVpZCAhPSBjYWxsaW5nVWlkLAogICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbGxpbmdVaWQsIGNsaWVudFVpZCk7CkBAIC0xNjQ0LDggKzE5MzMsOCBAQAogICAgICAgICB1cGRhdGVQaWQgPSB0cnVlOwogICAgIH0KICAgICBwaWRfdCBjbGllbnRQaWQgPSBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFBpZDsKKyAgICBjb25zdCBwaWRfdCBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGlmICh1cGRhdGVQaWQpIHsKLSAgICAgICAgY29uc3QgcGlkX3QgY2FsbGluZ1BpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKICAgICAgICAgQUxPR1dfSUYoY2xpZW50UGlkICE9IC0xICYmIGNsaWVudFBpZCAhPSBjYWxsaW5nUGlkLAogICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHBpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgcGlkICVkIiwKICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNhbGxpbmdVaWQsIGNhbGxpbmdQaWQsIGNsaWVudFBpZCk7CkBAIC0xNjk0LDYgKzE5ODMsNyBAQAogICAgICAgICBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgIH0KICAgICBsU3RhdHVzID0gQXVkaW9TeXN0ZW06OmdldElucHV0Rm9yQXR0cigmaW5wdXQuYXR0ciwgJm91dHB1dC5pbnB1dElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5yaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGSVhNRSBjb21wYXJlIHRvIEF1ZGlvVHJhY2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50UGlkLApAQCAtMTcwMSwxMiArMTk5MSwxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5vcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQuY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQuZmxhZ3MsICZvdXRwdXQuc2VsZWN0ZWREZXZpY2VJZCwgJnBvcnRJZCk7CisgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0UoImNyZWF0ZVJlY29yZCgpIGdldElucHV0Rm9yQXR0ciByZXR1cm4gZXJyb3IgJWQiLCBsU3RhdHVzKTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KIAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgUmVjb3JkVGhyZWFkICp0aHJlYWQgPSBjaGVja1JlY29yZFRocmVhZF9sKG91dHB1dC5pbnB1dElkKTsKICAgICAgICAgaWYgKHRocmVhZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBBTE9HRSgiY3JlYXRlUmVjb3JkKCkgY2hlY2tSZWNvcmRUaHJlYWRfbCBmYWlsZWQiKTsKKyAgICAgICAgICAgIEFMT0dFKCJjcmVhdGVSZWNvcmQoKSBjaGVja1JlY29yZFRocmVhZF9sIGZhaWxlZCwgaW5wdXQgaGFuZGxlICVkIiwgb3V0cHV0LmlucHV0SWQpOwogICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgfQpAQCAtMTcyMSw5ICsyMDE1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LmNvbmZpZy5mb3JtYXQsIGlucHV0LmNvbmZpZy5jaGFubmVsX21hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQuZnJhbWVDb3VudCwgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0Lm5vdGlmaWNhdGlvbkZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudFVpZCwgJm91dHB1dC5mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsbGluZ1BpZCwgY2xpZW50VWlkLCAmb3V0cHV0LmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5jbGllbnRJbmZvLmNsaWVudFRpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmxTdGF0dXMsIHBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsU3RhdHVzLCBwb3J0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Lm9wUGFja2FnZU5hbWUpOwogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKChsU3RhdHVzID09IE5PX0VSUk9SKSAmJiAocmVjb3JkVHJhY2sgPT0gMCkpOwogCiAgICAgICAgIC8vIGxTdGF0dXMgPT0gQkFEX1RZUEUgbWVhbnMgRkFTVCBmbGFnIHdhcyByZWplY3RlZDogcmVxdWVzdCBhIG5ldyBpbnB1dCBmcm9tCkBAIC0xNzUxLDYgKzIwNDYsNyBAQAogCiAgICAgb3V0cHV0LmNibGsgPSByZWNvcmRUcmFjay0+Z2V0Q2JsaygpOwogICAgIG91dHB1dC5idWZmZXJzID0gcmVjb3JkVHJhY2stPmdldEJ1ZmZlcnMoKTsKKyAgICBvdXRwdXQucG9ydElkID0gcG9ydElkOwogCiAgICAgLy8gcmV0dXJuIGhhbmRsZSB0byBjbGllbnQKICAgICByZWNvcmRIYW5kbGUgPSBuZXcgUmVjb3JkSGFuZGxlKHJlY29yZFRyYWNrKTsKQEAgLTE4NTQsNiArMjE1MCwxMCBAQAogCiAgICAgICAgIG1IYXJkd2FyZVN0YXR1cyA9IEFVRElPX0hXX0lETEU7CiAgICAgfQorICAgIGlmIChzdHJjbXAobmFtZSwgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkgPT0gMCkgeworICAgICAgICAvLyBBbiBNU0QgbW9kdWxlIGlzIGluc2VydGVkIGJlZm9yZSBoYXJkd2FyZSBtb2R1bGVzIGluIG9yZGVyIHRvIG1peCBlbmNvZGVkIHN0cmVhbXMuCisgICAgICAgIGZsYWdzID0gc3RhdGljX2Nhc3Q8QXVkaW9Id0RldmljZTo6RmxhZ3M+KGZsYWdzIHwgQXVkaW9Id0RldmljZTo6QUhXRF9JU19JTlNFUlQpOworICAgIH0KIAogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUgPSAoYXVkaW9fbW9kdWxlX2hhbmRsZV90KSBuZXh0VW5pcXVlSWQoQVVESU9fVU5JUVVFX0lEX1VTRV9NT0RVTEUpOwogICAgIG1BdWRpb0h3RGV2cy5hZGQoaGFuZGxlLCBuZXcgQXVkaW9Id0RldmljZShoYW5kbGUsIG5hbWUsIGRldiwgZmxhZ3MpKTsKQEAgLTE4ODUsNyArMjE4NSw3IEBACiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldExvd1JhbURldmljZShib29sIGlzTG93UmFtRGV2aWNlLCBpbnQ2NF90IHRvdGFsTWVtb3J5KQogewogICAgIHVpZF90IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAodWlkICE9IEFJRF9TWVNURU0pIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPclN5c3RlbVNlcnZlclVpZCh1aWQpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTE5MzAsNiArMjIzMCwyOCBAQAogICAgIHJldHVybiBtQ2xpZW50U2hhcmVkSGVhcFNpemU7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQoreworICAgIEFMT0dWKF9fZnVuY19fKTsKKworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGU7CisgICAgaWYgKGNvbmZpZy0+dHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7CisgICAgICAgIG1vZHVsZSA9IGNvbmZpZy0+ZXh0LmRldmljZS5od19tb2R1bGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbW9kdWxlID0gY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZTsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9Id0RldnMuaW5kZXhPZktleShtb2R1bGUpOworICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coIiVzKCkgYmFkIGh3IG1vZHVsZSAlZCIsIF9fZnVuY19fLCBtb2R1bGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBtQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7CisgICAgcmV0dXJuIGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCktPnNldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworfQorCiBhdWRpb19od19zeW5jX3QgQXVkaW9GbGluZ2VyOjpnZXRBdWRpb0h3U3luY0ZvclNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwpAQCAtMTk3NSw3ICsyMjk3LDEwIEBACiAgICAgICAgIGlmIChzZXNzaW9ucyAmIFRocmVhZEJhc2U6OlRSQUNLX1NFU1NJT04pIHsKICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHBhcmFtID0gQXVkaW9QYXJhbWV0ZXIoKTsKICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1Id0F2U3luYyksIHZhbHVlKTsKLSAgICAgICAgICAgIHRocmVhZC0+c2V0UGFyYW1ldGVycyhwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIFN0cmluZzgga2V5VmFsdWVQYWlycyA9IHBhcmFtLnRvU3RyaW5nKCk7CisgICAgICAgICAgICB0aHJlYWQtPnNldFBhcmFtZXRlcnMoa2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICBmb3J3YXJkUGFyYW1ldGVyc1RvRG93bnN0cmVhbVBhdGNoZXNfbCh0aHJlYWQtPmlkKCksIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYgdGhyZWFkKSB7IHJldHVybiB0aHJlYWQtPnVzZXNId0F2U3luYygpOyB9KTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQpAQCAtMjAyMSw3ICsyMzQ2LDEwIEBACiAgICAgICAgIEFMT0dWKCJzZXRBdWRpb0h3U3luY0ZvclNlc3Npb25fbCBmb3VuZCBJRCAlZCBmb3Igc2Vzc2lvbiAlZCIsIHN5bmNJZCwgc2Vzc2lvbklkKTsKICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0gPSBBdWRpb1BhcmFtZXRlcigpOwogICAgICAgICBwYXJhbS5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtSHdBdlN5bmMpLCBzeW5jSWQpOwotICAgICAgICB0aHJlYWQtPnNldFBhcmFtZXRlcnMocGFyYW0udG9TdHJpbmcoKSk7CisgICAgICAgIFN0cmluZzgga2V5VmFsdWVQYWlycyA9IHBhcmFtLnRvU3RyaW5nKCk7CisgICAgICAgIHRocmVhZC0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKKyAgICAgICAgZm9yd2FyZFBhcmFtZXRlcnNUb0Rvd25zdHJlYW1QYXRjaGVzX2wodGhyZWFkLT5pZCgpLCBrZXlWYWx1ZVBhaXJzLAorICAgICAgICAgICAgICAgIFtdKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYgdGhyZWFkKSB7IHJldHVybiB0aHJlYWQtPnVzZXNId0F2U3luYygpOyB9KTsKICAgICB9CiB9CiAKQEAgLTIwMzAsMTMgKzIzNTgsMTMgQEAKIAogCiBzcDxBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U+IEF1ZGlvRmxpbmdlcjo6b3Blbk91dHB1dF9sKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCiB7Ci0gICAgQXVkaW9Id0RldmljZSAqb3V0SHdEZXYgPSBmaW5kU3VpdGFibGVId0Rldl9sKG1vZHVsZSwgZGV2aWNlcyk7CisgICAgQXVkaW9Id0RldmljZSAqb3V0SHdEZXYgPSBmaW5kU3VpdGFibGVId0Rldl9sKG1vZHVsZSwgZGV2aWNlVHlwZSk7CiAgICAgaWYgKG91dEh3RGV2ID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIDA7CiAgICAgfQpAQCAtMjA3Nyw3ICsyNDA1LDcgQEAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvdXRId0Rldi0+b3Blbk91dHB1dFN0cmVhbSgKICAgICAgICAgICAgICZvdXRwdXRTdHJlYW0sCiAgICAgICAgICAgICAqb3V0cHV0LAotICAgICAgICAgICAgZGV2aWNlcywKKyAgICAgICAgICAgIGRldmljZVR5cGUsCiAgICAgICAgICAgICBmbGFncywKICAgICAgICAgICAgIGNvbmZpZywKICAgICAgICAgICAgIGFkZHJlc3Muc3RyaW5nKCkpOwpAQCAtMjA4Nyw4ICsyNDE1LDcgQEAKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgIGlmIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEpIHsKICAgICAgICAgICAgIHNwPE1tYXBQbGF5YmFja1RocmVhZD4gdGhyZWFkID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE1tYXBQbGF5YmFja1RocmVhZCh0aGlzLCAqb3V0cHV0LCBvdXRId0Rldiwgb3V0cHV0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcywgQVVESU9fREVWSUNFX05PTkUsIG1TeXN0ZW1SZWFkeSk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBNbWFwUGxheWJhY2tUaHJlYWQodGhpcywgKm91dHB1dCwgb3V0SHdEZXYsIG91dHB1dFN0cmVhbSwgbVN5c3RlbVJlYWR5KTsKICAgICAgICAgICAgIG1NbWFwVGhyZWFkcy5hZGQoKm91dHB1dCwgdGhyZWFkKTsKICAgICAgICAgICAgIEFMT0dWKCJvcGVuT3V0cHV0X2woKSBjcmVhdGVkIG1tYXAgcGxheWJhY2sgdGhyZWFkOiBJRCAlZCB0aHJlYWQgJXAiLAogICAgICAgICAgICAgICAgICAgKm91dHB1dCwgdGhyZWFkLmdldCgpKTsKQEAgLTIwOTYsMjEgKzI0MjMsMjIgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiB0aHJlYWQ7CiAgICAgICAgICAgICBpZiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSB7Ci0gICAgICAgICAgICAgICAgdGhyZWFkID0gbmV3IE9mZmxvYWRUaHJlYWQodGhpcywgb3V0cHV0U3RyZWFtLCAqb3V0cHV0LCBkZXZpY2VzLCBtU3lzdGVtUmVhZHkpOworICAgICAgICAgICAgICAgIHRocmVhZCA9IG5ldyBPZmZsb2FkVGhyZWFkKHRoaXMsIG91dHB1dFN0cmVhbSwgKm91dHB1dCwgbVN5c3RlbVJlYWR5KTsKICAgICAgICAgICAgICAgICBBTE9HVigib3Blbk91dHB1dF9sKCkgY3JlYXRlZCBvZmZsb2FkIG91dHB1dDogSUQgJWQgdGhyZWFkICVwIiwKICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0LCB0aHJlYWQuZ2V0KCkpOwogICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpCiAgICAgICAgICAgICAgICAgICAgIHx8ICFpc1ZhbGlkUGNtU2lua0Zvcm1hdChjb25maWctPmZvcm1hdCkKICAgICAgICAgICAgICAgICAgICAgfHwgIWlzVmFsaWRQY21TaW5rQ2hhbm5lbE1hc2soY29uZmlnLT5jaGFubmVsX21hc2spKSB7Ci0gICAgICAgICAgICAgICAgdGhyZWFkID0gbmV3IERpcmVjdE91dHB1dFRocmVhZCh0aGlzLCBvdXRwdXRTdHJlYW0sICpvdXRwdXQsIGRldmljZXMsIG1TeXN0ZW1SZWFkeSk7CisgICAgICAgICAgICAgICAgdGhyZWFkID0gbmV3IERpcmVjdE91dHB1dFRocmVhZCh0aGlzLCBvdXRwdXRTdHJlYW0sICpvdXRwdXQsIG1TeXN0ZW1SZWFkeSk7CiAgICAgICAgICAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXRfbCgpIGNyZWF0ZWQgZGlyZWN0IG91dHB1dDogSUQgJWQgdGhyZWFkICVwIiwKICAgICAgICAgICAgICAgICAgICAgICAqb3V0cHV0LCB0aHJlYWQuZ2V0KCkpOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJlYWQgPSBuZXcgTWl4ZXJUaHJlYWQodGhpcywgb3V0cHV0U3RyZWFtLCAqb3V0cHV0LCBkZXZpY2VzLCBtU3lzdGVtUmVhZHkpOworICAgICAgICAgICAgICAgIHRocmVhZCA9IG5ldyBNaXhlclRocmVhZCh0aGlzLCBvdXRwdXRTdHJlYW0sICpvdXRwdXQsIG1TeXN0ZW1SZWFkeSk7CiAgICAgICAgICAgICAgICAgQUxPR1YoIm9wZW5PdXRwdXRfbCgpIGNyZWF0ZWQgbWl4ZXIgb3V0cHV0OiBJRCAlZCB0aHJlYWQgJXAiLAogICAgICAgICAgICAgICAgICAgICAgICpvdXRwdXQsIHRocmVhZC5nZXQoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtUGxheWJhY2tUaHJlYWRzLmFkZCgqb3V0cHV0LCB0aHJlYWQpOworICAgICAgICAgICAgbVBhdGNoUGFuZWwubm90aWZ5U3RyZWFtT3BlbmVkKG91dEh3RGV2LCAqb3V0cHV0KTsKICAgICAgICAgICAgIHJldHVybiB0aHJlYWQ7CiAgICAgICAgIH0KICAgICB9CkBAIC0yMTIxLDI3ICsyNDQ5LDI5IEBACiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Om9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvckJhc2U+JiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmxhdGVuY3lNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKIHsKLSAgICBBTE9HSSgib3Blbk91dHB1dCgpIHRoaXMgJXAsIG1vZHVsZSAlZCBEZXZpY2UgJSN4LCBTYW1wbGluZ1JhdGUgJWQsIEZvcm1hdCAlIzA4eCwgIgorICAgIEFMT0dJKCJvcGVuT3V0cHV0KCkgdGhpcyAlcCwgbW9kdWxlICVkIERldmljZSAlcywgU2FtcGxpbmdSYXRlICVkLCBGb3JtYXQgJSMwOHgsICIKICAgICAgICAgICAgICAgIkNoYW5uZWxzICUjeCwgZmxhZ3MgJSN4IiwKICAgICAgICAgICAgICAgdGhpcywgbW9kdWxlLAotICAgICAgICAgICAgICAoZGV2aWNlcyAhPSBOVUxMKSA/ICpkZXZpY2VzIDogMCwKKyAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksCiAgICAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsCiAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAogICAgICAgICAgICAgICBjb25maWctPmNoYW5uZWxfbWFzaywKICAgICAgICAgICAgICAgZmxhZ3MpOwogCi0gICAgaWYgKGRldmljZXMgPT0gTlVMTCB8fCAqZGV2aWNlcyA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gZGV2aWNlLT50eXBlKCk7CisgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOChkZXZpY2UtPmFkZHJlc3MoKS5jX3N0cigpKTsKKworICAgIGlmIChkZXZpY2VUeXBlID09IEFVRElPX0RFVklDRV9OT05FKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG9wZW5PdXRwdXRfbChtb2R1bGUsIG91dHB1dCwgY29uZmlnLCAqZGV2aWNlcywgYWRkcmVzcywgZmxhZ3MpOworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG9wZW5PdXRwdXRfbChtb2R1bGUsIG91dHB1dCwgY29uZmlnLCBkZXZpY2VUeXBlLCBhZGRyZXNzLCBmbGFncyk7CiAgICAgaWYgKHRocmVhZCAhPSAwKSB7CiAgICAgICAgIGlmICgoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRKSA9PSAwKSB7CiAgICAgICAgICAgICBQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQgPSAoUGxheWJhY2tUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CkBAIC0yMjA5LDYgKzI1MzksOCBAQAogICAgICAgICBpZiAocGxheWJhY2tUaHJlYWQgIT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR1YoImNsb3NlT3V0cHV0KCkgJWQiLCBvdXRwdXQpOwogCisgICAgICAgICAgICBkdW1wVG9UaHJlYWRMb2dfbChwbGF5YmFja1RocmVhZCk7CisKICAgICAgICAgICAgIGlmIChwbGF5YmFja1RocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6Ok1JWEVSKSB7CiAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGxheWJhY2tUaHJlYWRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtUGxheWJhY2tUaHJlYWRzLnZhbHVlQXQoaSktPmlzRHVwbGljYXRpbmcoKSkgewpAQCAtMjIzMSw3ICsyNTYzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBlZmZlY3RDaGFpbnMgPSBwbGF5YmFja1RocmVhZC0+Z2V0RWZmZWN0Q2hhaW5zX2woKTsKICAgICAgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RDaGFpbnMuc2l6ZSgpOyBpICsrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBtb3ZlRWZmZWN0Q2hhaW5fbChlZmZlY3RDaGFpbnNbaV0tPnNlc3Npb25JZCgpLCBwbGF5YmFja1RocmVhZC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0VGhyZWFkLCB0cnVlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0VGhyZWFkKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTIyNDAsMTIgKzI1NzIsMTQgQEAKICAgICAgICAgICAgIGlmIChtbWFwVGhyZWFkID09IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgZHVtcFRvVGhyZWFkTG9nX2wobW1hcFRocmVhZCk7CiAgICAgICAgICAgICBtTW1hcFRocmVhZHMucmVtb3ZlSXRlbShvdXRwdXQpOwogICAgICAgICAgICAgQUxPR0QoImNsb3NpbmcgbW1hcFRocmVhZCAlcCIsIG1tYXBUaHJlYWQuZ2V0KCkpOwogICAgICAgICB9CiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvSW9EZXNjcmlwdG9yPiBpb0Rlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKICAgICAgICAgaW9EZXNjLT5tSW9IYW5kbGUgPSBvdXRwdXQ7CiAgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChBVURJT19PVVRQVVRfQ0xPU0VELCBpb0Rlc2MpOworICAgICAgICBtUGF0Y2hQYW5lbC5ub3RpZnlTdHJlYW1DbG9zZWQob3V0cHV0KTsKICAgICB9CiAgICAgLy8gVGhlIHRocmVhZCBlbnRpdHkgKGFjdGl2ZSB1bml0IG9mIGV4ZWN1dGlvbikgaXMgbm8gbG9uZ2VyIHJ1bm5pbmcgaGVyZSwKICAgICAvLyBidXQgdGhlIFRocmVhZEJhc2UgY29udGFpbmVyIHN0aWxsIGV4aXN0cy4KQEAgLTIyNzQsNyArMjYwOCw3IEBACiAgICAgZGVsZXRlIG91dDsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmNsb3NlT3V0cHV0SW50ZXJuYWxfbChjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIHRocmVhZCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpjbG9zZVRocmVhZEludGVybmFsX2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiB0aHJlYWQpCiB7CiAgICAgbVBsYXliYWNrVGhyZWFkcy5yZW1vdmVJdGVtKHRocmVhZC0+bUlkKTsKICAgICB0aHJlYWQtPmV4aXQoKTsKQEAgLTIzMjYsNyArMjY2MCw4IEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gb3BlbklucHV0X2wobW9kdWxlLCBpbnB1dCwgY29uZmlnLCAqZGV2aWNlcywgYWRkcmVzcywgc291cmNlLCBmbGFncyk7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gb3BlbklucHV0X2woCisgICAgICAgICAgICBtb2R1bGUsIGlucHV0LCBjb25maWcsICpkZXZpY2VzLCBhZGRyZXNzLCBzb3VyY2UsIGZsYWdzLCBBVURJT19ERVZJQ0VfTk9ORSwgU3RyaW5nOHt9KTsKIAogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICAvLyBub3RpZnkgY2xpZW50IHByb2Nlc3NlcyBvZiB0aGUgbmV3IGlucHV0IGNyZWF0aW9uCkBAIC0yMzQyLDcgKzI2NzcsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgb3V0cHV0RGV2aWNlQWRkcmVzcykKIHsKICAgICBBdWRpb0h3RGV2aWNlICppbkh3RGV2ID0gZmluZFN1aXRhYmxlSHdEZXZfbChtb2R1bGUsIGRldmljZXMpOwogICAgIGlmIChpbkh3RGV2ID09IE5VTEwpIHsKQEAgLTIzNTAsNiArMjY4Nyw5IEBACiAgICAgICAgIHJldHVybiAwOwogICAgIH0KIAorICAgIC8vIFNvbWUgZmxhZ3MgYXJlIHNwZWNpZmljIHRvIGZyYW1ld29yayBhbmQgbXVzdCBub3QgbGVhayB0byB0aGUgSEFMLgorICAgIGZsYWdzID0gc3RhdGljX2Nhc3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD4oZmxhZ3MgJiB+QVVESU9fSU5QVVRfRlJBTUVXT1JLX0ZMQUdTKTsKKwogICAgIC8vIEF1ZGlvIFBvbGljeSBjYW4gcmVxdWVzdCBhIHNwZWNpZmljIGhhbmRsZSBmb3IgaGFyZHdhcmUgaG90d29yZC4KICAgICAvLyBUaGUgZ29hbCBoZXJlIGlzIG5vdCB0byByZS1vcGVuIGFuIGFscmVhZHkgb3BlbmVkIGlucHV0LgogICAgIC8vIEl0IGlzIHRvIHVzZSBhIHByZS1hc3NpZ25lZCBJL08gaGFuZGxlLgpAQCAtMjM2OCw3ICsyNzA4LDggQEAKICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGluSHdIYWwgPSBpbkh3RGV2LT5od0RldmljZSgpOwogICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiBpblN0cmVhbTsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbkh3SGFsLT5vcGVuSW5wdXRTdHJlYW0oCi0gICAgICAgICAgICAqaW5wdXQsIGRldmljZXMsICZoYWxjb25maWcsIGZsYWdzLCBhZGRyZXNzLnN0cmluZygpLCBzb3VyY2UsICZpblN0cmVhbSk7CisgICAgICAgICAgICAqaW5wdXQsIGRldmljZXMsICZoYWxjb25maWcsIGZsYWdzLCBhZGRyZXNzLnN0cmluZygpLCBzb3VyY2UsCisgICAgICAgICAgICBvdXRwdXREZXZpY2UsIG91dHB1dERldmljZUFkZHJlc3MsICZpblN0cmVhbSk7CiAgICAgQUxPR1YoIm9wZW5JbnB1dF9sKCkgb3BlbklucHV0U3RyZWFtIHJldHVybmVkIGlucHV0ICVwLCBkZXZpY2VzICUjeCwgU2FtcGxpbmdSYXRlICVkIgogICAgICAgICAgICAiLCBGb3JtYXQgJSN4LCBDaGFubmVscyAlI3gsIGZsYWdzICUjeCwgc3RhdHVzICVkIGFkZHIgJXMiLAogICAgICAgICAgICAgaW5TdHJlYW0uZ2V0KCksCkBAIC0yMzkxLDcgKzI3MzIsOCBAQAogICAgICAgICBBTE9HVigib3BlbklucHV0X2woKSByZW9wZW5pbmcgd2l0aCBwcm9wb3NlZCBzYW1wbGluZyByYXRlIGFuZCBjaGFubmVsIG1hc2siKTsKICAgICAgICAgaW5TdHJlYW0uY2xlYXIoKTsKICAgICAgICAgc3RhdHVzID0gaW5Id0hhbC0+b3BlbklucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICppbnB1dCwgZGV2aWNlcywgJmhhbGNvbmZpZywgZmxhZ3MsIGFkZHJlc3Muc3RyaW5nKCksIHNvdXJjZSwgJmluU3RyZWFtKTsKKyAgICAgICAgICAgICAgICAqaW5wdXQsIGRldmljZXMsICZoYWxjb25maWcsIGZsYWdzLCBhZGRyZXNzLnN0cmluZygpLCBzb3VyY2UsCisgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlLCBvdXRwdXREZXZpY2VBZGRyZXNzLCAmaW5TdHJlYW0pOwogICAgICAgICAvLyBGSVhNRSBsb2cgdGhpcyBuZXcgc3RhdHVzOyBIQUwgc2hvdWxkIG5vdCBwcm9wb3NlIGFueSBmdXJ0aGVyIGNoYW5nZXMKICAgICB9CiAKQEAgLTIzOTksNzYgKzI3NDEsMTYgQEAKICAgICAgICAgQXVkaW9TdHJlYW1JbiAqaW5wdXRTdHJlYW0gPSBuZXcgQXVkaW9TdHJlYW1Jbihpbkh3RGV2LCBpblN0cmVhbSwgZmxhZ3MpOwogICAgICAgICBpZiAoKGZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSAhPSAwKSB7CiAgICAgICAgICAgICBzcDxNbWFwQ2FwdHVyZVRocmVhZD4gdGhyZWFkID0KLSAgICAgICAgICAgICAgICAgICAgbmV3IE1tYXBDYXB0dXJlVGhyZWFkKHRoaXMsICppbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluSHdEZXYsIGlucHV0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU91dHB1dERldmljZV9sKCksIGRldmljZXMsIG1TeXN0ZW1SZWFkeSk7CisgICAgICAgICAgICAgICAgICAgIG5ldyBNbWFwQ2FwdHVyZVRocmVhZCh0aGlzLCAqaW5wdXQsIGluSHdEZXYsIGlucHV0U3RyZWFtLCBtU3lzdGVtUmVhZHkpOwogICAgICAgICAgICAgbU1tYXBUaHJlYWRzLmFkZCgqaW5wdXQsIHRocmVhZCk7CiAgICAgICAgICAgICBBTE9HVigib3BlbklucHV0X2woKSBjcmVhdGVkIG1tYXAgY2FwdHVyZSB0aHJlYWQ6IElEICVkIHRocmVhZCAlcCIsICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLmdldCgpKTsKICAgICAgICAgICAgIHJldHVybiB0aHJlYWQ7CiAgICAgICAgIH0gZWxzZSB7Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgICAgIC8vIFRyeSB0byByZS11c2UgbW9zdCByZWNlbnRseSB1c2VkIFBpcGUgdG8gYXJjaGl2ZSBhIGNvcHkgb2YgaW5wdXQgZm9yIGR1bXBzeXMsCi0gICAgICAgICAgICAvLyBvciAocmUtKWNyZWF0ZSBpZiBjdXJyZW50IFBpcGUgaXMgaWRsZSBhbmQgZG9lcyBub3QgbWF0Y2ggdGhlIG5ldyBmb3JtYXQKLSAgICAgICAgICAgIHNwPE5CQUlPX1Npbms+IHRlZVNpbms7Ci0gICAgICAgICAgICBlbnVtIHsKLSAgICAgICAgICAgICAgICBURUVfU0lOS19OTywgICAgLy8gZG9uJ3QgY29weSBpbnB1dAotICAgICAgICAgICAgICAgIFRFRV9TSU5LX05FVywgICAvLyBjb3B5IGlucHV0IHVzaW5nIGEgbmV3IHBpcGUKLSAgICAgICAgICAgICAgICBURUVfU0lOS19PTEQsICAgLy8gY29weSBpbnB1dCB1c2luZyBhbiBleGlzdGluZyBwaXBlCi0gICAgICAgICAgICB9IGtpbmQ7Ci0gICAgICAgICAgICBOQkFJT19Gb3JtYXQgZm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhoYWxjb25maWcuc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGhhbGNvbmZpZy5jaGFubmVsX21hc2spLCBoYWxjb25maWcuZm9ybWF0KTsKLSAgICAgICAgICAgIGlmICghbVRlZVNpbmtJbnB1dEVuYWJsZWQpIHsKLSAgICAgICAgICAgICAgICBraW5kID0gVEVFX1NJTktfTk87Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKCFGb3JtYXRfaXNWYWxpZChmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05POwotICAgICAgICAgICAgfSBlbHNlIGlmIChtUmVjb3JkVGVlU2luayA9PSAwKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05FVzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobVJlY29yZFRlZVNpbmstPmdldFN0cm9uZ0NvdW50KCkgIT0gMSkgewotICAgICAgICAgICAgICAgIGtpbmQgPSBURUVfU0lOS19OTzsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoRm9ybWF0X2lzRXF1YWwoZm9ybWF0LCBtUmVjb3JkVGVlU2luay0+Zm9ybWF0KCkpKSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX09MRDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAga2luZCA9IFRFRV9TSU5LX05FVzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoa2luZCkgewotICAgICAgICAgICAgY2FzZSBURUVfU0lOS19ORVc6IHsKLSAgICAgICAgICAgICAgICBQaXBlICpwaXBlID0gbmV3IFBpcGUobVRlZVNpbmtJbnB1dEZyYW1lcywgZm9ybWF0KTsKLSAgICAgICAgICAgICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyc1sxXSA9IHtmb3JtYXR9OwotICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBwaXBlLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICAgICAgICAgICAgICBQaXBlUmVhZGVyICpwaXBlUmVhZGVyID0gbmV3IFBpcGVSZWFkZXIoKnBpcGUpOwotICAgICAgICAgICAgICAgIG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgICAgIGluZGV4ID0gcGlwZVJlYWRlci0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7Ci0gICAgICAgICAgICAgICAgbVJlY29yZFRlZVNpbmsgPSBwaXBlOwotICAgICAgICAgICAgICAgIG1SZWNvcmRUZWVTb3VyY2UgPSBwaXBlUmVhZGVyOwotICAgICAgICAgICAgICAgIHRlZVNpbmsgPSBwaXBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVEVFX1NJTktfT0xEOgotICAgICAgICAgICAgICAgIHRlZVNpbmsgPSBtUmVjb3JkVGVlU2luazsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgVEVFX1NJTktfTk86Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotI2VuZGlmCi0KICAgICAgICAgICAgIC8vIFN0YXJ0IHJlY29yZCB0aHJlYWQKICAgICAgICAgICAgIC8vIFJlY29yZFRocmVhZCByZXF1aXJlcyBib3RoIGlucHV0IGFuZCBvdXRwdXQgZGV2aWNlIGluZGljYXRpb24gdG8gZm9yd2FyZCB0byBhdWRpbwogICAgICAgICAgICAgLy8gcHJlIHByb2Nlc3NpbmcgbW9kdWxlcwotICAgICAgICAgICAgc3A8UmVjb3JkVGhyZWFkPiB0aHJlYWQgPSBuZXcgUmVjb3JkVGhyZWFkKHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0U3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW1hcnlPdXRwdXREZXZpY2VfbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUmVhZHkKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHRlZVNpbmsKLSNlbmRpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgc3A8UmVjb3JkVGhyZWFkPiB0aHJlYWQgPSBuZXcgUmVjb3JkVGhyZWFkKHRoaXMsIGlucHV0U3RyZWFtLCAqaW5wdXQsIG1TeXN0ZW1SZWFkeSk7CiAgICAgICAgICAgICBtUmVjb3JkVGhyZWFkcy5hZGQoKmlucHV0LCB0aHJlYWQpOwogICAgICAgICAgICAgQUxPR1YoIm9wZW5JbnB1dF9sKCkgY3JlYXRlZCByZWNvcmQgdGhyZWFkOiBJRCAlZCB0aHJlYWQgJXAiLCAqaW5wdXQsIHRocmVhZC5nZXQoKSk7CiAgICAgICAgICAgICByZXR1cm4gdGhyZWFkOwpAQCAtMjQ5Niw2ICsyNzc4LDggQEAKICAgICAgICAgaWYgKHJlY29yZFRocmVhZCAhPSAwKSB7CiAgICAgICAgICAgICBBTE9HVigiY2xvc2VJbnB1dCgpICVkIiwgaW5wdXQpOwogCisgICAgICAgICAgICBkdW1wVG9UaHJlYWRMb2dfbChyZWNvcmRUaHJlYWQpOworCiAgICAgICAgICAgICAvLyBJZiB3ZSBzdGlsbCBoYXZlIGVmZmVjdCBjaGFpbnMsIGl0IG1lYW5zIHRoYXQgYSBjbGllbnQgc3RpbGwgaG9sZHMgYSBoYW5kbGUKICAgICAgICAgICAgIC8vIG9uIGF0IGxlYXN0IG9uZSBlZmZlY3QuIFdlIG11c3QgZWl0aGVyIG1vdmUgdGhlIGNoYWluIHRvIGFuIGV4aXN0aW5nIHRocmVhZCB3aXRoIHRoZQogICAgICAgICAgICAgLy8gc2FtZSBzZXNzaW9uIElEIG9yIHB1dCBpdCBhc2lkZSBpbiBjYXNlIGEgbmV3IHJlY29yZCB0aHJlYWQgaXMgb3BlbmVkIGZvciBhCkBAIC0yNTM4LDYgKzI4MjIsNyBAQAogICAgICAgICAgICAgaWYgKG1tYXBUaHJlYWQgPT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBkdW1wVG9UaHJlYWRMb2dfbChtbWFwVGhyZWFkKTsKICAgICAgICAgICAgIG1NbWFwVGhyZWFkcy5yZW1vdmVJdGVtKGlucHV0KTsKICAgICAgICAgfQogICAgICAgICBjb25zdCBzcDxBdWRpb0lvRGVzY3JpcHRvcj4gaW9EZXNjID0gbmV3IEF1ZGlvSW9EZXNjcmlwdG9yKCk7CkBAIC0yNTY3LDcgKzI4NTIsNyBAQAogICAgIGRlbGV0ZSBpbjsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OmNsb3NlSW5wdXRJbnRlcm5hbF9sKGNvbnN0IHNwPFJlY29yZFRocmVhZD4mIHRocmVhZCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpjbG9zZVRocmVhZEludGVybmFsX2woY29uc3Qgc3A8UmVjb3JkVGhyZWFkPiYgdGhyZWFkKQogewogICAgIG1SZWNvcmRUaHJlYWRzLnJlbW92ZUl0ZW0odGhyZWFkLT5tSWQpOwogICAgIGNsb3NlSW5wdXRGaW5pc2godGhyZWFkKTsKQEAgLTI2MDUsNyArMjg5MCw4IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBwaWRfdCBjYWxsZXIgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CiAgICAgQUxPR1YoImFjcXVpcmluZyAlZCBmcm9tICVkLCBmb3IgJWQiLCBhdWRpb1Nlc3Npb24sIGNhbGxlciwgcGlkKTsKLSAgICBpZiAocGlkICE9IC0xICYmIChjYWxsZXIgPT0gZ2V0cGlkX2NhY2hlZCkpIHsKKyAgICBjb25zdCB1aWRfdCBjYWxsZXJVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgaWYgKHBpZCAhPSAtMSAmJiBpc0F1ZGlvU2VydmVyVWlkKGNhbGxlclVpZCkpIHsgLy8gY2hlY2sgbXVzdCBtYXRjaCByZWxlYXNlQXVkaW9TZXNzaW9uSWQoKQogICAgICAgICBjYWxsZXIgPSBwaWQ7CiAgICAgfQogCkBAIC0yNjM2LDI5ICsyOTIyLDQwIEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpyZWxlYXNlQXVkaW9TZXNzaW9uSWQoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwgcGlkX3QgcGlkKQogewotICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgcGlkX3QgY2FsbGVyID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotICAgIEFMT0dWKCJyZWxlYXNpbmcgJWQgZnJvbSAlZCBmb3IgJWQiLCBhdWRpb1Nlc3Npb24sIGNhbGxlciwgcGlkKTsKLSAgICBpZiAocGlkICE9IC0xICYmIChjYWxsZXIgPT0gZ2V0cGlkX2NhY2hlZCkpIHsKLSAgICAgICAgY2FsbGVyID0gcGlkOwotICAgIH0KLSAgICBzaXplX3QgbnVtID0gbUF1ZGlvU2Vzc2lvblJlZnMuc2l6ZSgpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKLSAgICAgICAgQXVkaW9TZXNzaW9uUmVmICpyZWYgPSBtQXVkaW9TZXNzaW9uUmVmcy5pdGVtQXQoaSk7Ci0gICAgICAgIGlmIChyZWYtPm1TZXNzaW9uaWQgPT0gYXVkaW9TZXNzaW9uICYmIHJlZi0+bVBpZCA9PSBjYWxsZXIpIHsKLSAgICAgICAgICAgIHJlZi0+bUNudC0tOwotICAgICAgICAgICAgQUxPR1YoIiBkZWNyZW1lbnRlZCByZWZjb3VudCB0byAlZCIsIHJlZi0+bUNudCk7Ci0gICAgICAgICAgICBpZiAocmVmLT5tQ250ID09IDApIHsKLSAgICAgICAgICAgICAgICBtQXVkaW9TZXNzaW9uUmVmcy5yZW1vdmVBdChpKTsKLSAgICAgICAgICAgICAgICBkZWxldGUgcmVmOwotICAgICAgICAgICAgICAgIHB1cmdlU3RhbGVFZmZlY3RzX2woKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybjsKKyAgICBzdGQ6OnZlY3Rvcjwgc3A8RWZmZWN0TW9kdWxlPiA+IHJlbW92ZWRFZmZlY3RzOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgcGlkX3QgY2FsbGVyID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBBTE9HVigicmVsZWFzaW5nICVkIGZyb20gJWQgZm9yICVkIiwgYXVkaW9TZXNzaW9uLCBjYWxsZXIsIHBpZCk7CisgICAgICAgIGNvbnN0IHVpZF90IGNhbGxlclVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICAgICAgaWYgKHBpZCAhPSAtMSAmJiBpc0F1ZGlvU2VydmVyVWlkKGNhbGxlclVpZCkpIHsgLy8gY2hlY2sgbXVzdCBtYXRjaCBhY3F1aXJlQXVkaW9TZXNzaW9uSWQoKQorICAgICAgICAgICAgY2FsbGVyID0gcGlkOwogICAgICAgICB9CisgICAgICAgIHNpemVfdCBudW0gPSBtQXVkaW9TZXNzaW9uUmVmcy5zaXplKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgICAgICAgIEF1ZGlvU2Vzc2lvblJlZiAqcmVmID0gbUF1ZGlvU2Vzc2lvblJlZnMuaXRlbUF0KGkpOworICAgICAgICAgICAgaWYgKHJlZi0+bVNlc3Npb25pZCA9PSBhdWRpb1Nlc3Npb24gJiYgcmVmLT5tUGlkID09IGNhbGxlcikgeworICAgICAgICAgICAgICAgIHJlZi0+bUNudC0tOworICAgICAgICAgICAgICAgIEFMT0dWKCIgZGVjcmVtZW50ZWQgcmVmY291bnQgdG8gJWQiLCByZWYtPm1DbnQpOworICAgICAgICAgICAgICAgIGlmIChyZWYtPm1DbnQgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtQXVkaW9TZXNzaW9uUmVmcy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHJlZjsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8IHNwPEVmZmVjdE1vZHVsZT4gPiBlZmZlY3RzID0gcHVyZ2VTdGFsZUVmZmVjdHNfbCgpOworICAgICAgICAgICAgICAgICAgICByZW1vdmVkRWZmZWN0cy5pbnNlcnQocmVtb3ZlZEVmZmVjdHMuZW5kKCksIGVmZmVjdHMuYmVnaW4oKSwgZWZmZWN0cy5lbmQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvLyBJZiB0aGUgY2FsbGVyIGlzIGF1ZGlvc2VydmVyIGl0IGlzIGxpa2VseSB0aGF0IHRoZSBzZXNzaW9uIGJlaW5nIHJlbGVhc2VkIHdhcyBhY3F1aXJlZAorICAgICAgICAvLyBvbiBiZWhhbGYgb2YgYSBwcm9jZXNzIG5vdCBpbiBub3RpZmljYXRpb24gY2xpZW50cyBhbmQgd2UgaWdub3JlIHRoZSB3YXJuaW5nLgorICAgICAgICBBTE9HV19JRighaXNBdWRpb1NlcnZlclVpZChjYWxsZXJVaWQpLAorICAgICAgICAgICAgICAgICAic2Vzc2lvbiBpZCAlZCBub3QgZm91bmQgZm9yIHBpZCAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyKTsKICAgICB9Ci0gICAgLy8gSWYgdGhlIGNhbGxlciBpcyBtZWRpYXNlcnZlciBpdCBpcyBsaWtlbHkgdGhhdCB0aGUgc2Vzc2lvbiBiZWluZyByZWxlYXNlZCB3YXMgYWNxdWlyZWQKLSAgICAvLyBvbiBiZWhhbGYgb2YgYSBwcm9jZXNzIG5vdCBpbiBub3RpZmljYXRpb24gY2xpZW50cyBhbmQgd2UgaWdub3JlIHRoZSB3YXJuaW5nLgotICAgIEFMT0dXX0lGKGNhbGxlciAhPSBnZXRwaWRfY2FjaGVkLCAic2Vzc2lvbiBpZCAlZCBub3QgZm91bmQgZm9yIHBpZCAlZCIsIGF1ZGlvU2Vzc2lvbiwgY2FsbGVyKTsKKworRXhpdDoKKyAgICBmb3IgKGF1dG8mIGVmZmVjdCA6IHJlbW92ZWRFZmZlY3RzKSB7CisgICAgICAgIGVmZmVjdC0+dXBkYXRlUG9saWN5U3RhdGUoKTsKKyAgICB9CiB9CiAKIGJvb2wgQXVkaW9GbGluZ2VyOjppc1Nlc3Npb25BY3F1aXJlZF9sKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24pCkBAIC0yNjczLDIyICsyOTcwLDI0IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6cHVyZ2VTdGFsZUVmZmVjdHNfbCgpIHsKK3N0ZDo6dmVjdG9yPHNwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlPj4gQXVkaW9GbGluZ2VyOjpwdXJnZVN0YWxlRWZmZWN0c19sKCkgewogCiAgICAgQUxPR1YoInB1cmdpbmcgc3RhbGUgZWZmZWN0cyIpOwogCiAgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBjaGFpbnM7CisgICAgc3RkOjp2ZWN0b3I8IHNwPEVmZmVjdE1vZHVsZT4gPiByZW1vdmVkRWZmZWN0czsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gdCA9IG1QbGF5YmFja1RocmVhZHMudmFsdWVBdChpKTsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHQtPm1Mb2NrKTsKICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCB0LT5tRWZmZWN0Q2hhaW5zLnNpemUoKTsgaisrKSB7CiAgICAgICAgICAgICBzcDxFZmZlY3RDaGFpbj4gZWMgPSB0LT5tRWZmZWN0Q2hhaW5zW2pdOwotICAgICAgICAgICAgaWYgKGVjLT5zZXNzaW9uSWQoKSA+IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgeworICAgICAgICAgICAgaWYgKCFhdWRpb19pc19nbG9iYWxfc2Vzc2lvbihlYy0+c2Vzc2lvbklkKCkpKSB7CiAgICAgICAgICAgICAgICAgY2hhaW5zLnB1c2goZWMpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVjb3JkVGhyZWFkcy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxSZWNvcmRUaHJlYWQ+IHQgPSBtUmVjb3JkVGhyZWFkcy52YWx1ZUF0KGkpOwogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodC0+bUxvY2spOwpAQCAtMjY5OCwxMCArMjk5NywxOSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW1hcFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8TW1hcFRocmVhZD4gdCA9IG1NbWFwVGhyZWFkcy52YWx1ZUF0KGkpOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodC0+bUxvY2spOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHQtPm1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBlYyA9IHQtPm1FZmZlY3RDaGFpbnNbal07CisgICAgICAgICAgICBjaGFpbnMucHVzaChlYyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNoYWlucy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxFZmZlY3RDaGFpbj4gZWMgPSBjaGFpbnNbaV07CiAgICAgICAgIGludCBzZXNzaW9uaWQgPSBlYy0+c2Vzc2lvbklkKCk7Ci0gICAgICAgIHNwPFRocmVhZEJhc2U+IHQgPSBlYy0+bVRocmVhZC5wcm9tb3RlKCk7CisgICAgICAgIHNwPFRocmVhZEJhc2U+IHQgPSBlYy0+dGhyZWFkKCkucHJvbW90ZSgpOwogICAgICAgICBpZiAodCA9PSAwKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpAQCAtMjcyNCwxMyArMzAzMiwyNCBAQAogICAgICAgICAgICAgICAgIGVmZmVjdC0+dW5QaW4oKTsKICAgICAgICAgICAgICAgICB0LT5yZW1vdmVFZmZlY3RfbChlZmZlY3QsIC8qcmVsZWFzZSovIHRydWUpOwogICAgICAgICAgICAgICAgIGlmIChlZmZlY3QtPnB1cmdlSGFuZGxlcygpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHQtPmNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZF9sKGVmZmVjdCwgZmFsc2UsIGVmZmVjdC0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPmNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZChmYWxzZSwgdHJ1ZSAvKnRocmVhZExvY2tlZCovKTsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnVucmVnaXN0ZXJFZmZlY3QoZWZmZWN0LT5pZCgpKTsKKyAgICAgICAgICAgICAgICByZW1vdmVkRWZmZWN0cy5wdXNoX2JhY2soZWZmZWN0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm47CisgICAgcmV0dXJuIHJlbW92ZWRFZmZlY3RzOworfQorCisvLyBkdW1wVG9UaHJlYWRMb2dfbCgpIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBoZWxkCit2b2lkIEF1ZGlvRmxpbmdlcjo6ZHVtcFRvVGhyZWFkTG9nX2woY29uc3Qgc3A8VGhyZWFkQmFzZT4gJnRocmVhZCkKK3sKKyAgICBhdWRpb191dGlsczo6RmRUb1N0cmluZyBmZFRvU3RyaW5nOworICAgIGNvbnN0IGludCBmZCA9IGZkVG9TdHJpbmcuZmQoKTsKKyAgICBpZiAoZmQgPj0gMCkgeworICAgICAgICB0aHJlYWQtPmR1bXAoZmQsIHt9IC8qIGFyZ3MgKi8pOworICAgICAgICBtVGhyZWFkTG9nLmxvZ3MoLTEgLyogdGltZSAqLywgZmRUb1N0cmluZy5nZXRTdHJpbmdBbmRDbG9zZSgpKTsKKyAgICB9CiB9CiAKIC8vIGNoZWNrVGhyZWFkX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIEF1ZGlvRmxpbmdlcjo6bUxvY2sgaGVsZApAQCAtMjg0NywxNSArMzE2NiwxNSBAQAogICAgIHJldHVybiBOVUxMOwogfQogCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9GbGluZ2VyOjpwcmltYXJ5T3V0cHV0RGV2aWNlX2woKSBjb25zdAorRGV2aWNlVHlwZVNldCBBdWRpb0ZsaW5nZXI6OnByaW1hcnlPdXRwdXREZXZpY2VfbCgpIGNvbnN0CiB7CiAgICAgUGxheWJhY2tUaHJlYWQgKnRocmVhZCA9IHByaW1hcnlQbGF5YmFja1RocmVhZF9sKCk7CiAKICAgICBpZiAodGhyZWFkID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiBEZXZpY2VUeXBlU2V0KCk7CiAgICAgfQogCi0gICAgcmV0dXJuIHRocmVhZC0+b3V0RGV2aWNlKCk7CisgICAgcmV0dXJuIHRocmVhZC0+b3V0RGV2aWNlVHlwZXMoKTsKIH0KIAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZCAqQXVkaW9GbGluZ2VyOjpmYXN0UGxheWJhY2tUaHJlYWRfbCgpIGNvbnN0CkBAIC0yOTM4LDE2ICszMjU3LDc0IEBACiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6Z2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwVXVpZCwKLSAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikgY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICpwVHlwZVV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJlZmVycmVkVHlwZUZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikgY29uc3QKIHsKKyAgICBpZiAocFV1aWQgPT0gTlVMTCB8fCBwVHlwZVV1aWQgPT0gTlVMTCB8fCBkZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtRWZmZWN0c0ZhY3RvcnlIYWwuZ2V0KCkpIHsKLSAgICAgICAgcmV0dXJuIG1FZmZlY3RzRmFjdG9yeUhhbC0+Z2V0RGVzY3JpcHRvcihwVXVpZCwgZGVzY3JpcHRvcik7Ci0gICAgfSBlbHNlIHsKKworICAgIGlmICghbUVmZmVjdHNGYWN0b3J5SGFsLmdldCgpKSB7CiAgICAgICAgIHJldHVybiAtRU5PREVWOwogICAgIH0KLX0KIAorICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGlmICghRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U6OmlzTnVsbFV1aWQocFV1aWQpKSB7CisgICAgICAgIC8vIElmIHV1aWQgaXMgc3BlY2lmaWVkLCByZXF1ZXN0IGVmZmVjdCBkZXNjcmlwdG9yIGZyb20gdGhhdC4KKyAgICAgICAgc3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5SGFsLT5nZXREZXNjcmlwdG9yKHBVdWlkLCBkZXNjcmlwdG9yKTsKKyAgICB9IGVsc2UgaWYgKCFFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6aXNOdWxsVXVpZChwVHlwZVV1aWQpKSB7CisgICAgICAgIC8vIElmIHV1aWQgaXMgbm90IHNwZWNpZmllZCwgbG9vayBmb3IgYW4gYXZhaWxhYmxlIGltcGxlbWVudGF0aW9uCisgICAgICAgIC8vIG9mIHRoZSByZXF1aXJlZCB0eXBlIGluc3RlYWQuCisKKyAgICAgICAgLy8gVXNlIGEgdGVtcG9yYXJ5IGRlc2NyaXB0b3IgdG8gYXZvaWQgbW9kaWZ5aW5nIHxkZXNjcmlwdG9yfCBpbiB0aGUgZmFpbHVyZSBjYXNlLgorICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2M7CisgICAgICAgIGRlc2MuZmxhZ3MgPSAwOyAvLyBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmcKKworICAgICAgICB1aW50MzJfdCBudW1FZmZlY3RzID0gMDsKKyAgICAgICAgc3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5SGFsLT5xdWVyeU51bWJlckVmZmVjdHMoJm51bUVmZmVjdHMpOworICAgICAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICAgICAgQUxPR1coImdldEVmZmVjdERlc2NyaXB0b3IoKSBlcnJvciAlZCBmcm9tIEZhY3RvcnlIYWwgcXVlcnlOdW1iZXJFZmZlY3RzIiwgc3RhdHVzKTsKKyAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgIH0KKworICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1FZmZlY3RzOyBpKyspIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1FZmZlY3RzRmFjdG9yeUhhbC0+Z2V0RGVzY3JpcHRvcihpLCAmZGVzYyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzIDwgMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCJnZXRFZmZlY3REZXNjcmlwdG9yKCkgZXJyb3IgJWQgZnJvbSBGYWN0b3J5SGFsIGdldERlc2NyaXB0b3IiLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1lbWNtcCgmZGVzYy50eXBlLCBwVHlwZVV1aWQsIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgeworICAgICAgICAgICAgICAgIC8vIElmIG1hdGNoaW5nIHR5cGUgZm91bmQgc2F2ZSBlZmZlY3QgZGVzY3JpcHRvci4KKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgKmRlc2NyaXB0b3IgPSBkZXNjOworCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUncyBubyBwcmVmZXJyZWQgZmxhZyBvciB0aGlzIGRlc2NyaXB0b3IgbWF0Y2hlcyB0aGUgcHJlZmVycmVkCisgICAgICAgICAgICAgICAgLy8gZmxhZywgc3VjY2VzcyEgSWYgdGhpcyBkZXNjcmlwdG9yIGRvZXNuJ3QgbWF0Y2ggdGhlIHByZWZlcnJlZAorICAgICAgICAgICAgICAgIC8vIGZsYWcsIGNvbnRpbnVlIGVudW1lcmF0aW9uIGluIGNhc2UgYSBiZXR0ZXIgbWF0Y2hpbmcgdmVyc2lvbiBvZiB0aGlzCisgICAgICAgICAgICAgICAgLy8gZWZmZWN0IHR5cGUgaXMgYXZhaWxhYmxlLiBOb3RlIHRoYXQgdGhpcyBtZWFucyBpZiBubyBlZmZlY3Qgd2l0aCBhCisgICAgICAgICAgICAgICAgLy8gY29ycmVjdCBmbGFnIGlzIGZvdW5kLCB0aGUgZGVzY3JpcHRvciByZXR1cm5lZCB3aWxsIGNvcnJlc3BvbmQgdG8gdGhlCisgICAgICAgICAgICAgICAgLy8gbGFzdCBlZmZlY3QgdGhhdCBhdCBsZWFzdCBoYWQgYSBtYXRjaGluZyB0eXBlIHV1aWQgKGlmIGFueSkuCisgICAgICAgICAgICAgICAgaWYgKHByZWZlcnJlZFR5cGVGbGFnID09IEVGRkVDVF9GTEFHX1RZUEVfTUFTSyB8fAorICAgICAgICAgICAgICAgICAgICAoZGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gcHJlZmVycmVkVHlwZUZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCFmb3VuZCkgeworICAgICAgICAgICAgc3RhdHVzID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgICAgICAgICBBTE9HVygiZ2V0RWZmZWN0RGVzY3JpcHRvcigpOiBFZmZlY3Qgbm90IGZvdW5kIGJ5IHR5cGUuIik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCJnZXRFZmZlY3REZXNjcmlwdG9yKCk6IEVpdGhlciB1dWlkIG9yIHR5cGUgdXVpZCBtdXN0IGJlIG5vbi1udWxsIFVVSURzLiIpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQogCiBzcDxJRWZmZWN0PiBBdWRpb0ZsaW5nZXI6OmNyZWF0ZUVmZmVjdCgKICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqcERlc2MsCkBAIC0yOTU1LDYgKzMzMzIsNyBAQAogICAgICAgICBpbnQzMl90IHByaW9yaXR5LAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlLAogICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICBzdGF0dXNfdCAqc3RhdHVzLApAQCAtMjk2Niw3ICszMzQ0LDcgQEAKICAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2M7CiAKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmIChwaWQgPT0gLTEgfHwgIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkpIHsKKyAgICBpZiAocGlkID09IC0xIHx8ICFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChjYWxsaW5nVWlkKSkgewogICAgICAgICBjb25zdCBwaWRfdCBjYWxsaW5nUGlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwogICAgICAgICBBTE9HV19JRihwaWQgIT0gLTEgJiYgcGlkICE9IGNhbGxpbmdQaWQsCiAgICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgcGlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyBwaWQgJWQiLApAQCAtMjk4Miw4NCArMzM2MCw2NiBAQAogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCi0gICAgLy8gY2hlY2sgYXVkaW8gc2V0dGluZ3MgcGVybWlzc2lvbiBmb3IgZ2xvYmFsIGVmZmVjdHMKLSAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCAmJiAhc2V0dGluZ3NBbGxvd2VkKCkpIHsKLSAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCi0gICAgLy8gU2Vzc2lvbiBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSBpcyByZXNlcnZlZCBmb3Igb3V0cHV0IHN0YWdlIGVmZmVjdHMKLSAgICAvLyB0aGF0IGNhbiBvbmx5IGJlIGNyZWF0ZWQgYnkgYXVkaW8gcG9saWN5IG1hbmFnZXIgKHJ1bm5pbmcgaW4gc2FtZSBwcm9jZXNzKQotICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UgJiYgZ2V0cGlkX2NhY2hlZCAhPSBwaWQpIHsKLSAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwotICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgfQotCiAgICAgaWYgKG1FZmZlY3RzRmFjdG9yeUhhbCA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogbm8gZWZmZWN0cyBmYWN0b3J5IGhhbCIsIF9fZnVuY19fKTsKICAgICAgICAgbFN0YXR1cyA9IE5PX0lOSVQ7CiAgICAgICAgIGdvdG8gRXhpdDsKICAgICB9CiAKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0KLSAgICAgICAgaWYgKCFFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6aXNOdWxsVXVpZCgmcERlc2MtPnV1aWQpKSB7Ci0gICAgICAgICAgICAvLyBpZiB1dWlkIGlzIHNwZWNpZmllZCwgcmVxdWVzdCBlZmZlY3QgZGVzY3JpcHRvcgotICAgICAgICAgICAgbFN0YXR1cyA9IG1FZmZlY3RzRmFjdG9yeUhhbC0+Z2V0RGVzY3JpcHRvcigmcERlc2MtPnV1aWQsICZkZXNjKTsKLSAgICAgICAgICAgIGlmIChsU3RhdHVzIDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBlcnJvciAlZCBmcm9tIEVmZmVjdEdldERlc2NyaXB0b3IiLCBsU3RhdHVzKTsKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBpZiB1dWlkIGlzIG5vdCBzcGVjaWZpZWQsIGxvb2sgZm9yIGFuIGF2YWlsYWJsZSBpbXBsZW1lbnRhdGlvbgotICAgICAgICAgICAgLy8gb2YgdGhlIHJlcXVpcmVkIHR5cGUgaW4gZWZmZWN0IGZhY3RvcnkKLSAgICAgICAgICAgIGlmIChFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTo6aXNOdWxsVXVpZCgmcERlc2MtPnR5cGUpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdCgpIG5vIGVmZmVjdCB0eXBlIik7Ci0gICAgICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB1aW50MzJfdCBudW1FZmZlY3RzID0gMDsKLSAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZDsKLSAgICAgICAgICAgIGQuZmxhZ3MgPSAwOyAvLyBwcmV2ZW50IGNvbXBpbGVyIHdhcm5pbmcKLSAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKLQotICAgICAgICAgICAgbFN0YXR1cyA9IG1FZmZlY3RzRmFjdG9yeUhhbC0+cXVlcnlOdW1iZXJFZmZlY3RzKCZudW1FZmZlY3RzKTsKLSAgICAgICAgICAgIGlmIChsU3RhdHVzIDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVFZmZlY3QoKSBlcnJvciAlZCBmcm9tIEVmZmVjdFF1ZXJ5TnVtYmVyRWZmZWN0cyIsIGxTdGF0dXMpOwotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBudW1FZmZlY3RzOyBpKyspIHsKLSAgICAgICAgICAgICAgICBsU3RhdHVzID0gbUVmZmVjdHNGYWN0b3J5SGFsLT5nZXREZXNjcmlwdG9yKGksICZkZXNjKTsKLSAgICAgICAgICAgICAgICBpZiAobFN0YXR1cyA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdCgpIGVycm9yICVkIGZyb20gRWZmZWN0UXVlcnlFZmZlY3QiLCBsU3RhdHVzKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChtZW1jbXAoJmRlc2MudHlwZSwgJnBEZXNjLT50eXBlLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgbWF0Y2hpbmcgdHlwZSBmb3VuZCBzYXZlIGVmZmVjdCBkZXNjcmlwdG9yLiBJZiB0aGUgc2Vzc2lvbiBpcwotICAgICAgICAgICAgICAgICAgICAvLyAwIGFuZCB0aGUgZWZmZWN0IGlzIG5vdCBhdXhpbGlhcnksIGNvbnRpbnVlIGVudW1lcmF0aW9uIGluIGNhc2UKLSAgICAgICAgICAgICAgICAgICAgLy8gYW4gYXV4aWxpYXJ5IHZlcnNpb24gb2YgdGhpcyBlZmZlY3QgdHlwZSBpcyBhdmFpbGFibGUKLSAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBkID0gZGVzYzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFmb3VuZCkgewotICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUVmZmVjdCgpIGVmZmVjdCBub3QgZm91bmQiKTsKLSAgICAgICAgICAgICAgICBnb3RvIEV4aXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBGb3Igc2FtZSBlZmZlY3QgdHlwZSwgY2hvc2UgYXV4aWxpYXJ5IHZlcnNpb24gb3ZlciBpbnNlcnQgdmVyc2lvbiBpZgotICAgICAgICAgICAgLy8gY29ubmVjdCB0byBvdXRwdXQgbWl4IChDb21wbGlhbmNlIHRvIE9wZW5TTCBFUykKLSAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYICYmCi0gICAgICAgICAgICAgICAgICAgIChkLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSAhPSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgewotICAgICAgICAgICAgICAgIGRlc2MgPSBkOwotICAgICAgICAgICAgfQorICAgIC8vIGNoZWNrIGF1ZGlvIHNldHRpbmdzIHBlcm1pc3Npb24gZm9yIGdsb2JhbCBlZmZlY3RzCisgICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpIHsKKyAgICAgICAgaWYgKCFzZXR0aW5nc0FsbG93ZWQoKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBubyBwZXJtaXNzaW9uIGZvciBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBsU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSkgeworICAgICAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogb25seSBBUE0gY2FuIGNyZWF0ZSB1c2luZyBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIGxTdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChpbyA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBBUE0gbXVzdCBzcGVjaWZ5IG91dHB1dCB3aGVuIHVzaW5nIEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFIiwgX19mdW5jX18pOworICAgICAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgICAgIGdvdG8gRXhpdDsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fREVWSUNFKSB7CisgICAgICAgIGlmICghbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQocGlkLCBjYWxsaW5nVWlkKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBkZXZpY2UgZWZmZWN0IHBlcm1pc3Npb24gZGVuaWVkIGZvciB1aWQgJWQiLCBfX2Z1bmNfXywgY2FsbGluZ1VpZCk7CisgICAgICAgICAgICBsU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlvICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGlvIGhhbmRsZSBzaG91bGQgbm90IGJlIHNwZWNpZmllZCBmb3IgZGV2aWNlIGVmZmVjdCIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBnZW5lcmFsIHNlc3Npb25JZC4KKworICAgICAgICBpZiAoYXVkaW9fdW5pcXVlX2lkX2dldF91c2Uoc2Vzc2lvbklkKSAhPSBBVURJT19VTklRVUVfSURfVVNFX1NFU1NJT04pIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBzZXNzaW9uSWQgJWQiLCBfX2Z1bmNfXywgc2Vzc2lvbklkKTsKKyAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgY2hlY2sgaWYgdGhlIGNhbGxpbmdVaWQgKGxpbWl0ZWQgdG8gcGlkKSBpcyBpbiBtQXVkaW9TZXNzaW9uUmVmcworICAgICAgICAvLyB0byBwcmV2ZW50IGNyZWF0aW5nIGFuIGVmZmVjdCB3aGVuIG9uZSBkb2Vzbid0IGFjdHVhbGx5IGhhdmUgdHJhY2sgd2l0aCB0aGF0IHNlc3Npb24/CiAgICAgfQorCiAgICAgeworICAgICAgICAvLyBHZXQgdGhlIGZ1bGwgZWZmZWN0IGRlc2NyaXB0b3IgZnJvbSB0aGUgdXVpZC90eXBlLgorICAgICAgICAvLyBJZiB0aGUgc2Vzc2lvbiBpcyB0aGUgb3V0cHV0IG1peCwgcHJlZmVyIGFuIGF1eGlsaWFyeSBlZmZlY3QsCisgICAgICAgIC8vIG90aGVyd2lzZSBubyBwcmVmZXJlbmNlLgorICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlID0gKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZIDogRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKTsKKyAgICAgICAgbFN0YXR1cyA9IGdldEVmZmVjdERlc2NyaXB0b3IoJnBEZXNjLT51dWlkLCAmcERlc2MtPnR5cGUsIHByZWZlcnJlZFR5cGUsICZkZXNjKTsKKyAgICAgICAgaWYgKGxTdGF0dXMgPCAwKSB7CisgICAgICAgICAgICBBTE9HVygiY3JlYXRlRWZmZWN0KCkgZXJyb3IgJWQgZnJvbSBnZXRFZmZlY3REZXNjcmlwdG9yIiwgbFN0YXR1cyk7CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KIAogICAgICAgICAvLyBEbyBub3QgYWxsb3cgYXV4aWxpYXJ5IGVmZmVjdHMgb24gYSBzZXNzaW9uIGRpZmZlcmVudCBmcm9tIDAgKG91dHB1dCBtaXgpCiAgICAgICAgIGlmIChzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYICYmCkBAIC0zMDcxLDcgKzM0MzEsNyBAQAogICAgICAgICAvLyBjaGVjayByZWNvcmRpbmcgcGVybWlzc2lvbiBmb3IgdmlzdWFsaXplcgogICAgICAgICBpZiAoKG1lbWNtcCgmZGVzYy50eXBlLCBTTF9JSURfVklTVUFMSVpBVElPTiwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSAmJgogICAgICAgICAgICAgLy8gVE9ETzogRG8gd2UgbmVlZCB0byBzdGFydC9zdG9wIG9wIC0gaS5lLiBpcyB0aGVyZSByZWNvcmRpbmcgYmVpbmcgcGVyZm9ybWVkPwotICAgICAgICAgICAgIXJlY29yZGluZ0FsbG93ZWQob3BQYWNrYWdlTmFtZSwgcGlkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CisgICAgICAgICAgICAhcmVjb3JkaW5nQWxsb3dlZChvcFBhY2thZ2VOYW1lLCBwaWQsIGNhbGxpbmdVaWQpKSB7CiAgICAgICAgICAgICBsU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgICAgICBnb3RvIEV4aXQ7CiAgICAgICAgIH0KQEAgLTMwODgsNDUgKzM0NDgsNTcgQEAKIAogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCisgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9ERVZJQ0UpIHsKKyAgICAgICAgICAgIHNwPENsaWVudD4gY2xpZW50ID0gcmVnaXN0ZXJQaWQocGlkKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBkZXZpY2UgdHlwZSAlZCBhZGRyZXNzICVzIiwgX19mdW5jX18sIGRldmljZS5tVHlwZSwgZGV2aWNlLmdldEFkZHJlc3MoKSk7CisgICAgICAgICAgICBoYW5kbGUgPSBtRGV2aWNlRWZmZWN0TWFuYWdlci5jcmVhdGVFZmZlY3RfbCgKKyAgICAgICAgICAgICAgICAgICAgJmRlc2MsIGRldmljZSwgY2xpZW50LCBlZmZlY3RDbGllbnQsIG1QYXRjaFBhbmVsLnBhdGNoZXNfbCgpLAorICAgICAgICAgICAgICAgICAgICBlbmFibGVkLCAmbFN0YXR1cyk7CisgICAgICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUiAmJiBsU3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGxvY2FsIHN0cm9uZyByZWZlcmVuY2UgdG8gQ2xpZW50IHdpdGggbUNsaWVudExvY2sgaGVsZAorICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfY2wobUNsaWVudExvY2spOworICAgICAgICAgICAgICAgIGNsaWVudC5jbGVhcigpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBoYW5kbGUgbXVzdCBiZSB2YWxpZCBoZXJlLCBidXQgY2hlY2sgYWdhaW4gdG8gYmUgc2FmZS4KKyAgICAgICAgICAgICAgICBpZiAoaGFuZGxlLmdldCgpICE9IG51bGxwdHIgJiYgaWQgIT0gbnVsbHB0cikgKmlkID0gaGFuZGxlLT5pZCgpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZ290byBSZWdpc3RlcjsKKyAgICAgICAgfQorCiAgICAgICAgIC8vIElmIG91dHB1dCBpcyBub3Qgc3BlY2lmaWVkIHRyeSB0byBmaW5kIGEgbWF0Y2hpbmcgYXVkaW8gc2Vzc2lvbiBJRCBpbiBvbmUgb2YgdGhlCiAgICAgICAgIC8vIG91dHB1dCB0aHJlYWRzLgogICAgICAgICAvLyBJZiBvdXRwdXQgaXMgMCBoZXJlLCBzZXNzaW9uSWQgaXMgbmVpdGhlciBTRVNTSU9OX09VVFBVVF9TVEFHRSBub3IgU0VTU0lPTl9PVVRQVVRfTUlYCiAgICAgICAgIC8vIGJlY2F1c2Ugb2YgY29kZSBjaGVja2luZyBvdXRwdXQgd2hlbiBlbnRlcmluZyB0aGUgZnVuY3Rpb24uCi0gICAgICAgIC8vIE5vdGU6IGlvIGlzIG5ldmVyIDAgd2hlbiBjcmVhdGluZyBhbiBlZmZlY3Qgb24gYW4gaW5wdXQKKyAgICAgICAgLy8gTm90ZTogaW8gaXMgbmV2ZXIgQVVESU9fSU9fSEFORExFX05PTkUgd2hlbiBjcmVhdGluZyBhbiBlZmZlY3Qgb24gYW4gaW5wdXQgYnkgQVBNLgorICAgICAgICAvLyBBbiBBdWRpb0VmZmVjdCBjcmVhdGVkIGZyb20gdGhlIEphdmEgQVBJIHdpbGwgaGF2ZSBpbyBhcyBBVURJT19JT19IQU5ETEVfTk9ORS4KICAgICAgICAgaWYgKGlvID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFKSB7Ci0gICAgICAgICAgICAgICAgLy8gb3V0cHV0IG11c3QgYmUgc3BlY2lmaWVkIGJ5IEF1ZGlvUG9saWN5TWFuYWdlciB3aGVuIHVzaW5nIHNlc3Npb24KLSAgICAgICAgICAgICAgICAvLyBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRQotICAgICAgICAgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICAvLyBsb29rIGZvciB0aGUgdGhyZWFkIHdoZXJlIHRoZSBzcGVjaWZpZWQgYXVkaW8gc2Vzc2lvbiBpcyBwcmVzZW50CisgICAgICAgICAgICBpbyA9IGZpbmRJb0hhbmRsZUJ5U2Vzc2lvbklkX2woc2Vzc2lvbklkLCBtUGxheWJhY2tUaHJlYWRzKTsKKyAgICAgICAgICAgIGlmIChpbyA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIGlvID0gZmluZElvSGFuZGxlQnlTZXNzaW9uSWRfbChzZXNzaW9uSWQsIG1SZWNvcmRUaHJlYWRzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpbyA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIGlvID0gZmluZElvSGFuZGxlQnlTZXNzaW9uSWRfbChzZXNzaW9uSWQsIG1NbWFwVGhyZWFkcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIElmIHlvdSB3aXNoIHRvIGNyZWF0ZSBhIFJlY29yZCBwcmVwcm9jZXNzaW5nIEF1ZGlvRWZmZWN0IGluIEphdmEsCisgICAgICAgICAgICAvLyB5b3UgTVVTVCBjcmVhdGUgYW4gQXVkaW9SZWNvcmQgZmlyc3QgYW5kIGtlZXAgaXQgYWxpdmUgc28gaXQgaXMgcGlja2VkIHVwIGFib3ZlLgorICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGl0IHdpbGwgZmFpbCB3aGVuIGNyZWF0ZWQgb24gYSBQbGF5YmFjayB0aHJlYWQgYnkgbGVnYWN5CisgICAgICAgICAgICAvLyBoYW5kbGluZyBiZWxvdy4gIERpdHRvIHdpdGggTW1hcCwgdGhlIGFzc29jaWF0ZWQgTW1hcCB0cmFjayBtdXN0IGJlIGNyZWF0ZWQKKyAgICAgICAgICAgIC8vIGJlZm9yZSBjcmVhdGluZyB0aGUgQXVkaW9FZmZlY3Qgb3IgdGhlIGlvIGhhbmRsZSBtdXN0IGJlIHNwZWNpZmllZC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBEZXRlY3QgaWYgdGhlIGVmZmVjdCBpcyBjcmVhdGVkIGFmdGVyIGFuIEF1ZGlvUmVjb3JkIGlzIGRlc3Ryb3llZC4KKyAgICAgICAgICAgIGlmIChnZXRPcnBoYW5FZmZlY3RDaGFpbl9sKHNlc3Npb25JZCkuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogZWZmZWN0ICVzIHdpdGggbm8gc3BlY2lmaWVkIGlvIGhhbmRsZSBpcyBkZW5pZWQgYmVjYXVzZSB0aGUgQXVkaW9SZWNvcmQiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGZvciBzZXNzaW9uICVkIG5vIGxvbmdlciBleGlzdHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXNjLm5hbWUsIHNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgbFN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGxvb2sgZm9yIHRoZSB0aHJlYWQgd2hlcmUgdGhlIHNwZWNpZmllZCBhdWRpbyBzZXNzaW9uIGlzIHByZXNlbnQKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVBsYXliYWNrVGhyZWFkcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHVpbnQzMl90IHNlc3Npb25UeXBlID0gbVBsYXliYWNrVGhyZWFkcy52YWx1ZUF0KGkpLT5oYXNBdWRpb1Nlc3Npb24oc2Vzc2lvbklkKTsKLSAgICAgICAgICAgICAgICBpZiAoc2Vzc2lvblR5cGUgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICBpbyA9IG1QbGF5YmFja1RocmVhZHMua2V5QXQoaSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHRocmVhZCB3aXRoIHNhbWUgZWZmZWN0IHNlc3Npb24gaXMgcHJlZmVyYWJsZQotICAgICAgICAgICAgICAgICAgICBpZiAoKHNlc3Npb25UeXBlICYgVGhyZWFkQmFzZTo6RUZGRUNUX1NFU1NJT04pICE9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlvID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUmVjb3JkVGhyZWFkcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAobVJlY29yZFRocmVhZHMudmFsdWVBdChpKS0+aGFzQXVkaW9TZXNzaW9uKHNlc3Npb25JZCkgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaW8gPSBtUmVjb3JkVGhyZWFkcy5rZXlBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlvID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtTW1hcFRocmVhZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG1NbWFwVGhyZWFkcy52YWx1ZUF0KGkpLT5oYXNBdWRpb1Nlc3Npb24oc2Vzc2lvbklkKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbyA9IG1NbWFwVGhyZWFkcy5rZXlBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBMZWdhY3kgaGFuZGxpbmcgb2YgY3JlYXRpbmcgYW4gZWZmZWN0IG9uIGFuIGV4cGlyZWQgb3IgbWFkZS11cAorICAgICAgICAgICAgLy8gc2Vzc2lvbiBpZC4gIFdlIHRoaW5rIHRoYXQgaXQgaXMgYSBQbGF5YmFjayBlZmZlY3QuCisgICAgICAgICAgICAvLwogICAgICAgICAgICAgLy8gSWYgbm8gb3V0cHV0IHRocmVhZCBjb250YWlucyB0aGUgcmVxdWVzdGVkIHNlc3Npb24gSUQsIGRlZmF1bHQgdG8KICAgICAgICAgICAgIC8vIGZpcnN0IG91dHB1dC4gVGhlIGVmZmVjdCBjaGFpbiB3aWxsIGJlIG1vdmVkIHRvIHRoZSBjb3JyZWN0IG91dHB1dAogICAgICAgICAgICAgLy8gdGhyZWFkIHdoZW4gYSB0cmFjayB3aXRoIHRoZSBzYW1lIHNlc3Npb24gSUQgaXMgY3JlYXRlZApAQCAtMzE3NCw3ICszNTQ2LDcgQEAKICAgICAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSByZWdpc3RlclBpZChwaWQpOwogCiAgICAgICAgIC8vIGNyZWF0ZSBlZmZlY3Qgb24gc2VsZWN0ZWQgb3V0cHV0IHRocmVhZAotICAgICAgICBib29sIHBpbm5lZCA9IChzZXNzaW9uSWQgPiBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpICYmIGlzU2Vzc2lvbkFjcXVpcmVkX2woc2Vzc2lvbklkKTsKKyAgICAgICAgYm9vbCBwaW5uZWQgPSAhYXVkaW9faXNfZ2xvYmFsX3Nlc3Npb24oc2Vzc2lvbklkKSAmJiBpc1Nlc3Npb25BY3F1aXJlZF9sKHNlc3Npb25JZCk7CiAgICAgICAgIGhhbmRsZSA9IHRocmVhZC0+Y3JlYXRlRWZmZWN0X2woY2xpZW50LCBlZmZlY3RDbGllbnQsIHByaW9yaXR5LCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgJmRlc2MsIGVuYWJsZWQsICZsU3RhdHVzLCBwaW5uZWQpOwogICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUiAmJiBsU3RhdHVzICE9IEFMUkVBRFlfRVhJU1RTKSB7CkBAIC0zMTg3LDggKzM1NTksMTcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SICYmIGxTdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKLSAgICAgICAgLy8gaGFuZGxlIG11c3QgYmUgY2xlYXJlZCBvdXRzaWRlIGxvY2suCitSZWdpc3RlcjoKKyAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUiB8fCBsU3RhdHVzID09IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgIC8vIENoZWNrIENQVSBhbmQgbWVtb3J5IHVzYWdlCisgICAgICAgIHNwPEVmZmVjdEJhc2U+IGVmZmVjdCA9IGhhbmRsZS0+ZWZmZWN0KCkucHJvbW90ZSgpOworICAgICAgICBpZiAoZWZmZWN0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJTdGF0dXMgPSBlZmZlY3QtPnVwZGF0ZVBvbGljeVN0YXRlKCk7CisgICAgICAgICAgICBpZiAoclN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGxTdGF0dXMgPSByU3RhdHVzOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKICAgICAgICAgaGFuZGxlLmNsZWFyKCk7CiAgICAgfQogCkBAIC0zMjIwLDE0ICszNjAxLDMwIEBACiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2RsKGRzdFRocmVhZC0+bUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBfc2woc3JjVGhyZWFkLT5tTG9jayk7Ci0gICAgcmV0dXJuIG1vdmVFZmZlY3RDaGFpbl9sKHNlc3Npb25JZCwgc3JjVGhyZWFkLCBkc3RUaHJlYWQsIGZhbHNlKTsKKyAgICByZXR1cm4gbW92ZUVmZmVjdENoYWluX2woc2Vzc2lvbklkLCBzcmNUaHJlYWQsIGRzdFRocmVhZCk7CiB9CiAKKwordm9pZCBBdWRpb0ZsaW5nZXI6OnNldEVmZmVjdFN1c3BlbmRlZChpbnQgZWZmZWN0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZGVkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBnZXRFZmZlY3RUaHJlYWRfbChzZXNzaW9uSWQsIGVmZmVjdElkKTsKKyAgICBpZiAodGhyZWFkID09IG51bGxwdHIpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9zbCh0aHJlYWQtPm1Mb2NrKTsKKyAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdCA9IHRocmVhZC0+Z2V0RWZmZWN0X2woc2Vzc2lvbklkLCBlZmZlY3RJZCk7CisgICAgdGhyZWFkLT5zZXRFZmZlY3RTdXNwZW5kZWRfbCgmZWZmZWN0LT5kZXNjKCkudHlwZSwgc3VzcGVuZGVkLCBzZXNzaW9uSWQpOworfQorCisKIC8vIG1vdmVFZmZlY3RDaGFpbl9sIG11c3QgYmUgY2FsbGVkIHdpdGggYm90aCBzcmNUaHJlYWQgYW5kIGRzdFRocmVhZCBtTG9ja3MgaGVsZAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjptb3ZlRWZmZWN0Q2hhaW5fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkICpzcmNUaHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQgKmRzdFRocmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZVJlZ2lzdGVyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkICpkc3RUaHJlYWQpCiB7CiAgICAgQUxPR1YoIm1vdmVFZmZlY3RDaGFpbl9sKCkgc2Vzc2lvbiAlZCBmcm9tIHRocmVhZCAlcCB0byB0aHJlYWQgJXAiLAogICAgICAgICAgICAgc2Vzc2lvbklkLCBzcmNUaHJlYWQsIGRzdFRocmVhZCk7CkBAIC0zMjc1LDcgKzM2NzIsNyBAQAogICAgICAgICAvLyBpZiB0aGUgbW92ZSByZXF1ZXN0IGlzIG5vdCByZWNlaXZlZCBmcm9tIGF1ZGlvIHBvbGljeSBtYW5hZ2VyLCB0aGUgZWZmZWN0IG11c3QgYmUKICAgICAgICAgLy8gcmUtcmVnaXN0ZXJlZCB3aXRoIHRoZSBuZXcgc3RyYXRlZ3kgYW5kIG91dHB1dAogICAgICAgICBpZiAoZHN0Q2hhaW4gPT0gMCkgewotICAgICAgICAgICAgZHN0Q2hhaW4gPSBlZmZlY3QtPmNoYWluKCkucHJvbW90ZSgpOworICAgICAgICAgICAgZHN0Q2hhaW4gPSBlZmZlY3QtPmNhbGxiYWNrKCktPmNoYWluKCkucHJvbW90ZSgpOwogICAgICAgICAgICAgaWYgKGRzdENoYWluID09IDApIHsKICAgICAgICAgICAgICAgICBBTE9HVygibW92ZUVmZmVjdENoYWluX2woKSBjYW5ub3QgZ2V0IGNoYWluIGZyb20gZWZmZWN0ICVwIiwgZWZmZWN0LmdldCgpKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBOT19JTklUOwpAQCAtMzI4MywzNiArMzY4MCw2OCBAQAogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RyYXRlZ3kgPSBkc3RDaGFpbi0+c3RyYXRlZ3koKTsKICAgICAgICAgfQotICAgICAgICBpZiAocmVSZWdpc3RlcikgewotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnVucmVnaXN0ZXJFZmZlY3QoZWZmZWN0LT5pZCgpKTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWdpc3RlckVmZmVjdCgmZWZmZWN0LT5kZXNjKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0VGhyZWFkLT5pZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPmlkKCkpOwotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnNldEVmZmVjdEVuYWJsZWQoZWZmZWN0LT5pZCgpLCBlZmZlY3QtPmlzRW5hYmxlZCgpKTsKLSAgICAgICAgfQogICAgICAgICBlZmZlY3QgPSBjaGFpbi0+Z2V0RWZmZWN0RnJvbUlkX2woMCk7CiAgICAgfQogCiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlbW92ZWQuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHNyY1RocmVhZC0+YWRkRWZmZWN0X2wocmVtb3ZlZFtpXSk7Ci0gICAgICAgICAgICBpZiAoZHN0Q2hhaW4gIT0gMCAmJiByZVJlZ2lzdGVyKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnVucmVnaXN0ZXJFZmZlY3QocmVtb3ZlZFtpXS0+aWQoKSk7Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlZ2lzdGVyRWZmZWN0KCZyZW1vdmVkW2ldLT5kZXNjKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1RocmVhZC0+aWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZFtpXS0+aWQoKSk7Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnNldEVmZmVjdEVuYWJsZWQoZWZmZWN0LT5pZCgpLCBlZmZlY3QtPmlzRW5hYmxlZCgpKTsKLSAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6bW92ZUF1eEVmZmVjdFRvSW8oaW50IEVmZmVjdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIGRzdFRocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ+ICpzcmNUaHJlYWQpCit7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzcDxQbGF5YmFja1RocmVhZD4gdGhyZWFkID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8UGxheWJhY2tUaHJlYWQgKj4oZ2V0RWZmZWN0VGhyZWFkX2woQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCBFZmZlY3RJZCkuZ2V0KCkpOworCisgICAgaWYgKEVmZmVjdElkICE9IDAgJiYgdGhyZWFkICE9IDAgJiYgZHN0VGhyZWFkICE9IHRocmVhZC5nZXQoKSkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2RsKGRzdFRocmVhZC0+bUxvY2spOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX3NsKHRocmVhZC0+bUxvY2spOworICAgICAgICBzcDxFZmZlY3RDaGFpbj4gc3JjQ2hhaW4gPSB0aHJlYWQtPmdldEVmZmVjdENoYWluX2woQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKTsKKyAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGRzdENoYWluOworICAgICAgICBpZiAoc3JjQ2hhaW4gPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKKyAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSBzcmNDaGFpbi0+Z2V0RWZmZWN0RnJvbUlkX2woRWZmZWN0SWQpOworICAgICAgICBpZiAoZWZmZWN0ID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorICAgICAgICB0aHJlYWQtPnJlbW92ZUVmZmVjdF9sKGVmZmVjdCk7CisgICAgICAgIHN0YXR1cyA9IGRzdFRocmVhZC0+YWRkRWZmZWN0X2woZWZmZWN0KTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgdGhyZWFkLT5hZGRFZmZlY3RfbChlZmZlY3QpOworICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICBnb3RvIEV4aXQ7CisgICAgICAgIH0KKworICAgICAgICBkc3RDaGFpbiA9IGVmZmVjdC0+Y2FsbGJhY2soKS0+Y2hhaW4oKS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChkc3RDaGFpbiA9PSAwKSB7CisgICAgICAgICAgICB0aHJlYWQtPmFkZEVmZmVjdF9sKGVmZmVjdCk7CisgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQorCitFeGl0OgorICAgICAgICAvLyByZW1vdmVFZmZlY3RfbCgpIGhhcyBzdG9wcGVkIHRoZSBlZmZlY3QgaWYgaXQgd2FzIGFjdGl2ZSBzbyBpdCBtdXN0IGJlIHJlc3RhcnRlZAorICAgICAgICBpZiAoZWZmZWN0LT5zdGF0ZSgpID09IEVmZmVjdE1vZHVsZTo6QUNUSVZFIHx8CisgICAgICAgICAgICBlZmZlY3QtPnN0YXRlKCkgPT0gRWZmZWN0TW9kdWxlOjpTVE9QUElORykgeworICAgICAgICAgICAgZWZmZWN0LT5zdGFydCgpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBzcmNUaHJlYWQgIT0gbnVsbHB0cikgeworICAgICAgICAqc3JjVGhyZWFkID0gdGhyZWFkOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCiBib29sIEF1ZGlvRmxpbmdlcjo6aXNOb25PZmZsb2FkYWJsZUdsb2JhbEVmZmVjdEVuYWJsZWRfbCgpCiB7CiAgICAgaWYgKG1HbG9iYWxFZmZlY3RFbmFibGVUaW1lICE9IDAgJiYKQEAgLTMzOTMsMTM2ICszODIyLDYgQEAKIH0KIAogCi1zdHJ1Y3QgRW50cnkgewotI2RlZmluZSBURUVfTUFYX0ZJTEVOQU1FIDMyIC8vICVZJW0lZCVIJU0lU18lZC53YXYgPSA0KzIrMisyKzIrMisxKzErNCsxID0gMjEKLSAgICBjaGFyIG1GaWxlTmFtZVtURUVfTUFYX0ZJTEVOQU1FXTsKLX07Ci0KLWludCBjb21wYXJFbnRyeShjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpCi17Ci0gICAgcmV0dXJuIHN0cmNtcCgoKGNvbnN0IEVudHJ5ICopIHAxKS0+bUZpbGVOYW1lLCAoKGNvbnN0IEVudHJ5ICopIHAyKS0+bUZpbGVOYW1lKTsKLX0KLQotI2lmZGVmIFRFRV9TSU5LCi12b2lkIEF1ZGlvRmxpbmdlcjo6ZHVtcFRlZShpbnQgZmQsIGNvbnN0IHNwPE5CQUlPX1NvdXJjZT4mIHNvdXJjZSwgYXVkaW9faW9faGFuZGxlX3QgaWQsIGNoYXIgc3VmZml4KQotewotICAgIE5CQUlPX1NvdXJjZSAqdGVlU291cmNlID0gc291cmNlLmdldCgpOwotICAgIGlmICh0ZWVTb3VyY2UgIT0gTlVMTCkgewotICAgICAgICAvLyAud2F2IHJvdGF0aW9uCi0gICAgICAgIC8vIFRoZXJlIGlzIGEgYmVuaWduIHJhY2UgY29uZGl0aW9uIGlmIDIgdGhyZWFkcyBjYWxsIHRoaXMgc2ltdWx0YW5lb3VzbHkuCi0gICAgICAgIC8vIFRoZXkgd291bGQgYm90aCB0cmF2ZXJzZSB0aGUgZGlyZWN0b3J5LCBidXQgdGhlIHJlc3VsdCB3b3VsZCBzaW1wbHkgYmUKLSAgICAgICAgLy8gZmFpbHVyZXMgYXQgdW5saW5rKCkgd2hpY2ggYXJlIGlnbm9yZWQuICBJdCdzIGFsc28gdW5saWtlbHkgc2luY2UKLSAgICAgICAgLy8gbm9ybWFsbHkgZHVtcHN5cyBpcyBvbmx5IGRvbmUgYnkgYnVncmVwb3J0IG9yIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLSAgICAgICAgY2hhciB0ZWVQYXRoW1BBVEhfTUFYXSA9ICIvZGF0YS9taXNjL2F1ZGlvc2VydmVyIjsKLSAgICAgICAgc2l6ZV90IHRlZVBhdGhMZW4gPSBzdHJsZW4odGVlUGF0aCk7Ci0gICAgICAgIERJUiAqZGlyID0gb3BlbmRpcih0ZWVQYXRoKTsKLSAgICAgICAgdGVlUGF0aFt0ZWVQYXRoTGVuKytdID0gJy8nOwotICAgICAgICBpZiAoZGlyICE9IE5VTEwpIHsKLSNkZWZpbmUgVEVFX01BWF9TT1JUIDIwIC8vIG51bWJlciBvZiBlbnRyaWVzIHRvIHNvcnQKLSNkZWZpbmUgVEVFX01BWF9LRUVQIDEwIC8vIG51bWJlciBvZiBlbnRyaWVzIHRvIGtlZXAKLSAgICAgICAgICAgIHN0cnVjdCBFbnRyeSBlbnRyaWVzW1RFRV9NQVhfU09SVF07Ci0gICAgICAgICAgICBzaXplX3QgZW50cnlDb3VudCA9IDA7Ci0gICAgICAgICAgICB3aGlsZSAoZW50cnlDb3VudCA8IFRFRV9NQVhfU09SVCkgewotICAgICAgICAgICAgICAgIGVycm5vID0gMDsgLy8gY2xlYXIgZXJybm8gYmVmb3JlIHJlYWRkaXIoKSB0byB0cmFjayBwb3RlbnRpYWwgZXJyb3JzLgotICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBkaXJlbnQgKnJlc3VsdCA9IHJlYWRkaXIoZGlyKTsKLSAgICAgICAgICAgICAgICBpZiAocmVzdWx0ID09IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1dfSUYoZXJybm8gIT0gMCwgInRlZSByZWFkZGlyKCkgZmFpbHVyZSAlcyIsIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBpZ25vcmUgbm9uIC53YXYgZmlsZSBlbnRyaWVzCi0gICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90IG5hbWVMZW4gPSBzdHJsZW4ocmVzdWx0LT5kX25hbWUpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lTGVuIDw9IDQgfHwgbmFtZUxlbiA+PSBURUVfTUFYX0ZJTEVOQU1FIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdHJjbXAoJnJlc3VsdC0+ZF9uYW1lW25hbWVMZW4gLSA0XSwgIi53YXYiKSkgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKHZvaWQpYXVkaW9fdXRpbHNfc3RybGNweShlbnRyaWVzW2VudHJ5Q291bnQrK10ubUZpbGVOYW1lLCByZXN1bHQtPmRfbmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAodm9pZCkgY2xvc2VkaXIoZGlyKTsKLSAgICAgICAgICAgIGlmIChlbnRyeUNvdW50ID4gVEVFX01BWF9LRUVQKSB7Ci0gICAgICAgICAgICAgICAgcXNvcnQoZW50cmllcywgZW50cnlDb3VudCwgc2l6ZW9mKEVudHJ5KSwgY29tcGFyRW50cnkpOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnlDb3VudCAtIFRFRV9NQVhfS0VFUDsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0cmNweSgmdGVlUGF0aFt0ZWVQYXRoTGVuXSwgZW50cmllc1tpXS5tRmlsZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICAodm9pZCkgdW5saW5rKHRlZVBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgZHByaW50ZihmZCwgInVuYWJsZSB0byByb3RhdGUgdGVlcyBpbiAlLipzOiAlc1xuIiwgKGludCkgdGVlUGF0aExlbiwgdGVlUGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKGVycm5vKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgY2hhciB0ZWVUaW1lWzE2XTsKLSAgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gICAgICAgIGdldHRpbWVvZmRheSgmdHYsIE5VTEwpOwotICAgICAgICBzdHJ1Y3QgdG0gdG07Ci0gICAgICAgIGxvY2FsdGltZV9yKCZ0di50dl9zZWMsICZ0bSk7Ci0gICAgICAgIHN0cmZ0aW1lKHRlZVRpbWUsIHNpemVvZih0ZWVUaW1lKSwgIiVZJW0lZCVIJU0lUyIsICZ0bSk7Ci0gICAgICAgIHNucHJpbnRmKCZ0ZWVQYXRoW3RlZVBhdGhMZW5dLCBzaXplb2YodGVlUGF0aCkgLSB0ZWVQYXRoTGVuLCAiJXNfJWRfJWMud2F2IiwgdGVlVGltZSwgaWQsCi0gICAgICAgICAgICAgICAgc3VmZml4KTsKLSAgICAgICAgLy8gaWYgMiBkdW1wc3lzIGFyZSBkb25lIHdpdGhpbiAxIHNlY29uZCwgYW5kIHJvdGF0aW9uIGRpZG4ndCB3b3JrLCB0aGVuIGRpc2NhcmQgMm5kCi0gICAgICAgIGludCB0ZWVGZCA9IG9wZW4odGVlUGF0aCwgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19FWENMIHwgT19OT0ZPTExPVywgU19JUlVTUiB8IFNfSVdVU1IpOwotICAgICAgICBpZiAodGVlRmQgPj0gMCkgewotICAgICAgICAgICAgLy8gRklYTUUgdXNlIGxpYnNuZGZpbGUKLSAgICAgICAgICAgIGNoYXIgd2F2SGVhZGVyWzQ0XTsKLSAgICAgICAgICAgIG1lbWNweSh3YXZIZWFkZXIsCi0gICAgICAgICAgICAgICAgIlJJRkZcMFwwXDBcMFdBVkVmbXQgXDIwXDBcMFwwXDFcMFwyXDBcMTA0XDI1NFwwXDBcMFwwXDBcMFw0XDBcMjBcMGRhdGFcMFwwXDBcMCIsCi0gICAgICAgICAgICAgICAgc2l6ZW9mKHdhdkhlYWRlcikpOwotICAgICAgICAgICAgTkJBSU9fRm9ybWF0IGZvcm1hdCA9IHRlZVNvdXJjZS0+Zm9ybWF0KCk7Ci0gICAgICAgICAgICB1bnNpZ25lZCBjaGFubmVsQ291bnQgPSBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCk7Ci0gICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gRm9ybWF0X3NhbXBsZVJhdGUoZm9ybWF0KTsKLSAgICAgICAgICAgIHNpemVfdCBmcmFtZVNpemUgPSBGb3JtYXRfZnJhbWVTaXplKGZvcm1hdCk7Ci0gICAgICAgICAgICB3YXZIZWFkZXJbMjJdID0gY2hhbm5lbENvdW50OyAgICAgICAvLyBudW1iZXIgb2YgY2hhbm5lbHMKLSAgICAgICAgICAgIHdhdkhlYWRlclsyNF0gPSBzYW1wbGVSYXRlOyAgICAgICAgIC8vIHNhbXBsZSByYXRlCi0gICAgICAgICAgICB3YXZIZWFkZXJbMjVdID0gc2FtcGxlUmF0ZSA+PiA4OwotICAgICAgICAgICAgd2F2SGVhZGVyWzMyXSA9IGZyYW1lU2l6ZTsgICAgICAgICAgLy8gYmxvY2sgYWxpZ25tZW50Ci0gICAgICAgICAgICB3YXZIZWFkZXJbMzNdID0gZnJhbWVTaXplID4+IDg7Ci0gICAgICAgICAgICB3cml0ZSh0ZWVGZCwgd2F2SGVhZGVyLCBzaXplb2Yod2F2SGVhZGVyKSk7Ci0gICAgICAgICAgICBzaXplX3QgdG90YWwgPSAwOwotICAgICAgICAgICAgYm9vbCBmaXJzdFJlYWQgPSB0cnVlOwotI2RlZmluZSBURUVfU0lOS19SRUFEIDEwMjQgICAgICAgICAgICAgICAgICAgICAgLy8gZnJhbWVzIHBlciBJL08gb3BlcmF0aW9uCi0gICAgICAgICAgICB2b2lkICpidWZmZXIgPSBtYWxsb2MoVEVFX1NJTktfUkVBRCAqIGZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICBmb3IgKDs7KSB7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IGNvdW50ID0gVEVFX1NJTktfUkVBRDsKLSAgICAgICAgICAgICAgICBzc2l6ZV90IGFjdHVhbCA9IHRlZVNvdXJjZS0+cmVhZChidWZmZXIsIGNvdW50KTsKLSAgICAgICAgICAgICAgICBib29sIHdhc0ZpcnN0UmVhZCA9IGZpcnN0UmVhZDsKLSAgICAgICAgICAgICAgICBmaXJzdFJlYWQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICBpZiAoYWN0dWFsIDw9IDApIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjdHVhbCA9PSAoc3NpemVfdCkgT1ZFUlJVTiAmJiB3YXNGaXJzdFJlYWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChhY3R1YWwgPD0gKHNzaXplX3QpY291bnQpOwotICAgICAgICAgICAgICAgIHdyaXRlKHRlZUZkLCBidWZmZXIsIGFjdHVhbCAqIGZyYW1lU2l6ZSk7Ci0gICAgICAgICAgICAgICAgdG90YWwgKz0gYWN0dWFsOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZnJlZShidWZmZXIpOwotICAgICAgICAgICAgbHNlZWsodGVlRmQsIChvZmZfdCkgNCwgU0VFS19TRVQpOwotICAgICAgICAgICAgdWludDMyX3QgdGVtcCA9IDQ0ICsgdG90YWwgKiBmcmFtZVNpemUgLSA4OwotICAgICAgICAgICAgLy8gRklYTUUgbm90IGJpZy1lbmRpYW4gc2FmZQotICAgICAgICAgICAgd3JpdGUodGVlRmQsICZ0ZW1wLCBzaXplb2YodGVtcCkpOwotICAgICAgICAgICAgbHNlZWsodGVlRmQsIChvZmZfdCkgNDAsIFNFRUtfU0VUKTsKLSAgICAgICAgICAgIHRlbXAgPSAgdG90YWwgKiBmcmFtZVNpemU7Ci0gICAgICAgICAgICAvLyBGSVhNRSBub3QgYmlnLWVuZGlhbiBzYWZlCi0gICAgICAgICAgICB3cml0ZSh0ZWVGZCwgJnRlbXAsIHNpemVvZih0ZW1wKSk7Ci0gICAgICAgICAgICBjbG9zZSh0ZWVGZCk7Ci0gICAgICAgICAgICAvLyBUT0RPIFNob3VsZCBjcmVhdGUgZmlsZSB3aXRoIHRlbXBvcmFyeSBuYW1lIGFuZCB0aGVuIHJlbmFtZSB0byBmaW5hbCBpZiBub24tZW1wdHkuCi0gICAgICAgICAgICBpZiAodG90YWwgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgInRlZSBjb3BpZWQgdG8gJXNcbiIsIHRlZVBhdGgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdW5saW5rKHRlZVBhdGgpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZkID49IDApIHsKLSAgICAgICAgICAgICAgICBkcHJpbnRmKGZkLCAidW5hYmxlIHRvIGNyZWF0ZSB0ZWUgJXM6ICVzXG4iLCB0ZWVQYXRoLCBzdHJlcnJvcihlcnJubykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQotI2VuZGlmCi0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpvblRyYW5zYWN0KApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvRmxpbmdlci5oCmluZGV4IDk2M2E4N2QuLjExNWJiYjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0ZsaW5nZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9GbGluZ2VyLmgKQEAgLTIxLDEzICsyMSwxOSBAQAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8Y2hyb25vPgogI2luY2x1ZGUgPGRlcXVlPgogI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxudW1lcmljPgorI2luY2x1ZGUgPG9wdGlvbmFsPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPHN0ZGludC5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgogCisjaW5jbHVkZSA8YW5kcm9pZC9vcy9CbkV4dGVybmFsVmlicmF0aW9uQ29udHJvbGxlci5oPgogI2luY2x1ZGUgPGFuZHJvaWQtYmFzZS9tYWNyb3MuaD4KIAogI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KQEAgLTQ4LDcgKzU0LDkgQEAKICNpbmNsdWRlIDx1dGlscy9UeXBlSGVscGVycy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCisjaW5jbHVkZSA8YmluZGVyL0FwcE9wc01hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgorI2luY2x1ZGUgPGJpbmRlci9JQXBwT3BzQ2FsbGJhY2suaD4KICNpbmNsdWRlIDxiaW5kZXIvTWVtb3J5RGVhbGVyLmg+CiAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KQEAgLTU3LDEyICs2NSwxOCBAQAogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEJ1ZmZlckhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL1N0cmVhbUhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0NvbnRhaW5lcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0RldmljZVR5cGVBZGRyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9NaXhlci5oPgorI2luY2x1ZGUgPG1lZGlhL0RldmljZURlc2NyaXB0b3JCYXNlLmg+CiAjaW5jbHVkZSA8bWVkaWEvRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvTGluZWFyTWFwLmg+CiAjaW5jbHVkZSA8bWVkaWEvVm9sdW1lU2hhcGVyLmg+CiAKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL0ZkVG9TdHJpbmcuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9TaW1wbGVMb2cuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9UaW1lc3RhbXBWZXJpZmllci5oPgogCiAjaW5jbHVkZSAiRmFzdENhcHR1cmUuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKQEAgLTcxLDYgKzg1LDcgQEAKICNpbmNsdWRlICJBdWRpb1N0cmVhbU91dC5oIgogI2luY2x1ZGUgIlNwZGlmU3RyZWFtT3V0LmgiCiAjaW5jbHVkZSAiQXVkaW9Id0RldmljZS5oIgorI2luY2x1ZGUgIk5CQUlPX1RlZS5oIgogCiAjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL0lQb3dlck1hbmFnZXIuaD4KIApAQCAtNzgsNiArOTMsOCBAQAogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9FZmZlY3RTaGFyZWQuaD4KICNpbmNsdWRlIDxwcml2YXRlL21lZGlhL0F1ZGlvVHJhY2tTaGFyZWQuaD4KIAorI2luY2x1ZGUgPHZpYnJhdG9yL0V4dGVybmFsVmlicmF0aW9uLmg+CisKICNpbmNsdWRlICJhbmRyb2lkL21lZGlhL0JuQXVkaW9SZWNvcmQuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtODYsNiArMTAzLDcgQEAKIGNsYXNzIEF1ZGlvQnVmZmVyOwogY2xhc3MgQXVkaW9SZXNhbXBsZXI7CiBjbGFzcyBEZXZpY2VIYWxJbnRlcmZhY2U7CitjbGFzcyBEZXZpY2VzRmFjdG9yeUhhbENhbGxiYWNrOwogY2xhc3MgRGV2aWNlc0ZhY3RvcnlIYWxJbnRlcmZhY2U7CiBjbGFzcyBFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZTsKIGNsYXNzIEZhc3RNaXhlcjsKQEAgLTEzMSw2ICsxNDksMTAgQEAKICAgICB2aXJ0dWFsICAgICBmbG9hdCAgICAgICBtYXN0ZXJWb2x1bWUoKSBjb25zdDsKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBtYXN0ZXJNdXRlKCkgY29uc3Q7CiAKKyAgICAvLyBCYWxhbmNlIHZhbHVlIG11c3QgYmUgd2l0aGluIC0xLmYgKGxlZnQgb25seSkgdG8gMS5mIChyaWdodCBvbmx5KSBpbmNsdXNpdmUuCisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSBvdmVycmlkZTsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRNYXN0ZXJCYWxhbmNlKGZsb2F0ICpiYWxhbmNlKSBjb25zdCBvdmVycmlkZTsKKwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgc2V0U3RyZWFtTXV0ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBtdXRlZCk7CkBAIC0xNTcsOCArMTc5LDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4mIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmxhdGVuY3lNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOwogCkBAIC0yMDIsNiArMjIzLDggQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHF1ZXJ5RWZmZWN0KHVpbnQzMl90IGluZGV4LCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0RWZmZWN0RGVzY3JpcHRvcihjb25zdCBlZmZlY3RfdXVpZF90ICpwVXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcFR5cGVVdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBwcmVmZXJyZWRUeXBlRmxhZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzY3JpcHRvcikgY29uc3Q7CiAKICAgICB2aXJ0dWFsIHNwPElFZmZlY3Q+IGNyZWF0ZUVmZmVjdCgKQEAgLTIxMCw2ICsyMzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvLAogICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8sCkBAIC0yMTksNiArMjQzLDEwIEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCBtb3ZlRWZmZWN0cyhhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCBhdWRpb19pb19oYW5kbGVfdCBzcmNPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQpOwogCisgICAgICAgICAgICB2b2lkIHNldEVmZmVjdFN1c3BlbmRlZChpbnQgZWZmZWN0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kZWQpIG92ZXJyaWRlOworCiAgICAgdmlydHVhbCBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbG9hZEh3TW9kdWxlKGNvbnN0IGNoYXIgKm5hbWUpOwogCiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRQcmltYXJ5T3V0cHV0U2FtcGxpbmdSYXRlKCk7CkBAIC0yNTUsNiArMjgzLDggQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWljcm9waG9uZXMoc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiAqbWljcm9waG9uZXMpOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBdWRpb0hhbFBpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8cGlkX3Q+JiBwaWRzKTsKKwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKQEAgLTI3Niw2ICszMDYsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxNbWFwU3RyZWFtQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxNbWFwU3RyZWFtSW50ZXJmYWNlPiYgaW50ZXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmhhbmRsZSk7CisKKyAgICBzdGF0aWMgaW50IG9uRXh0ZXJuYWxWaWJyYXRpb25TdGFydChjb25zdCBzcDxvczo6RXh0ZXJuYWxWaWJyYXRpb24+JiBleHRlcm5hbFZpYnJhdGlvbik7CisgICAgc3RhdGljIHZvaWQgb25FeHRlcm5hbFZpYnJhdGlvblN0b3AoY29uc3Qgc3A8b3M6OkV4dGVybmFsVmlicmF0aW9uPiYgZXh0ZXJuYWxWaWJyYXRpb24pOworCisgICAgc3RhdHVzX3QgYWRkRWZmZWN0VG9IYWwoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCwKKyAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBod01vZHVsZUlkLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCk7CisgICAgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0RnJvbUhhbChhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLAorICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGh3TW9kdWxlSWQsIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KTsKKwogcHJpdmF0ZToKICAgICAvLyBGSVhNRSBUaGUgNDAwIGlzIHRlbXBvcmFyaWx5IHRvbyBoaWdoIHVudGlsIGEgbGVhayBvZiB3cml0ZXJzIGluIG1lZGlhLmxvZyBpcyBmaXhlZC4KICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtMb2dNZW1vcnlTaXplID0gNDAwICogMTAyNDsKQEAgLTM0NSw4ICszODQsNyBAQAogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIG9uRmlyc3RSZWYoKTsKIAogICAgIEF1ZGlvSHdEZXZpY2UqICAgICAgICAgIGZpbmRTdWl0YWJsZUh3RGV2X2woYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKTsKLSAgICB2b2lkICAgICAgICAgICAgICAgICAgICBwdXJnZVN0YWxlRWZmZWN0c19sKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSk7CiAKICAgICAvLyBTZXQga0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMgdG8gdHJ1ZSB0byBlbmFibGUgZ3JlYXRlciB0aGFuIHN0ZXJlbyBvdXRwdXQKICAgICAvLyBmb3IgdGhlIE1peGVyVGhyZWFkIGFuZCBkZXZpY2Ugc2luay4gIE51bWJlciBvZiBjaGFubmVscyBhbGxvd2VkIGlzCkBAIC0zNTcsMTYgKzM5NSwxNyBAQAogICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc1ZhbGlkUGNtU2lua0NoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKSB7CiAgICAgICAgIHN3aXRjaCAoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihjaGFubmVsTWFzaykpIHsKICAgICAgICAgY2FzZSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX1BPU0lUSU9OOiB7Ci0gICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBGQ0NfMjsgLy8gc3RlcmVvIGlzIGRlZmF1bHQKLSAgICAgICAgICAgIGlmIChrRW5hYmxlRXh0ZW5kZWRDaGFubmVscykgewotICAgICAgICAgICAgICAgIGNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxDb3VudCA8IEZDQ18yIC8vIG1vbm8gaXMgbm90IHN1cHBvcnRlZCBhdCB0aGlzIHRpbWUKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNoYW5uZWxDb3VudCA+IEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fQ0hBTk5FTFMpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEhhcHRpYyBjaGFubmVsIG1hc2sgaXMgb25seSBhcHBsaWNhYmxlIGZvciBjaGFubmVsIHBvc2l0aW9uIG1hc2suCisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrICYgfkFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCk7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBtYXhDaGFubmVsQ291bnQgPSBrRW5hYmxlRXh0ZW5kZWRDaGFubmVscworICAgICAgICAgICAgICAgICAgICA/IEF1ZGlvTWl4ZXI6Ok1BWF9OVU1fQ0hBTk5FTFMgOiBGQ0NfMjsKKyAgICAgICAgICAgIGlmIChjaGFubmVsQ291bnQgPCBGQ0NfMiAvLyBtb25vIGlzIG5vdCBzdXBwb3J0ZWQgYXQgdGhpcyB0aW1lCisgICAgICAgICAgICAgICAgICAgIHx8IGNoYW5uZWxDb3VudCA+IG1heENoYW5uZWxDb3VudCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgY2hhbm5lbE1hc2sgaXMgdGhlICJjYW5vbmljYWwiIG9uZSB3ZSBleHBlY3QgZm9yIHRoZSBjaGFubmVsQ291bnQuCi0gICAgICAgICAgICByZXR1cm4gY2hhbm5lbE1hc2sgPT0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KGNoYW5uZWxDb3VudCk7CisgICAgICAgICAgICByZXR1cm4gYXVkaW9fY2hhbm5lbF9wb3NpdGlvbl9tYXNrX2lzX291dF9jYW5vbmljYWwoY2hhbm5lbE1hc2spOwogICAgICAgICAgICAgfQogICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fSU5ERVg6CiAgICAgICAgICAgICBpZiAoa0VuYWJsZUV4dGVuZGVkQ2hhbm5lbHMpIHsKQEAgLTQwOSwxMyArNDQ4LDE3IEBACiAgICAgc3RhdGljIHVpbnQzMl90ICAgICAgICAgbVNjcmVlblN0YXRlOwogCiAgICAgLy8gSW50ZXJuYWwgZHVtcCB1dGlsaXRpZXMuCi0gICAgc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7Ci0gICAgc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tTbGVlcFVzID0gMjAwMDA7CisgICAgc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tUaW1lb3V0TnMgPSAxICogTkFOT1NfUEVSX1NFQ09ORDsKICAgICBzdGF0aWMgYm9vbCBkdW1wVHJ5TG9jayhNdXRleCYgbXV0ZXgpOwogICAgIHZvaWQgZHVtcFBlcm1pc3Npb25EZW5pYWwoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICB2b2lkIGR1bXBDbGllbnRzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAgICAgdm9pZCBkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKKyAgICBTaW1wbGVMb2cgbVRocmVhZExvZ3sxNn07IC8vIDE2IFRocmVhZCBoaXN0b3J5IGxpbWl0CisKKyAgICBjbGFzcyBUaHJlYWRCYXNlOworICAgIHZvaWQgZHVtcFRvVGhyZWFkTG9nX2woY29uc3Qgc3A8VGhyZWFkQmFzZT4gJnRocmVhZCk7CisKICAgICAvLyAtLS0gQ2xpZW50IC0tLQogICAgIGNsYXNzIENsaWVudCA6IHB1YmxpYyBSZWZCYXNlIHsKICAgICBwdWJsaWM6CkBAIC00OTcsMTEgKzU0MCwxOSBAQAogICAgIGNsYXNzIEFzeW5jQ2FsbGJhY2tUaHJlYWQ7CiAgICAgY2xhc3MgVHJhY2s7CiAgICAgY2xhc3MgUmVjb3JkVHJhY2s7CisgICAgY2xhc3MgRWZmZWN0QmFzZTsKICAgICBjbGFzcyBFZmZlY3RNb2R1bGU7CiAgICAgY2xhc3MgRWZmZWN0SGFuZGxlOwogICAgIGNsYXNzIEVmZmVjdENoYWluOworICAgIGNsYXNzIERldmljZUVmZmVjdFByb3h5OworICAgIGNsYXNzIERldmljZUVmZmVjdE1hbmFnZXI7CisgICAgY2xhc3MgUGF0Y2hQYW5lbDsKKyAgICBjbGFzcyBEZXZpY2VFZmZlY3RNYW5hZ2VyQ2FsbGJhY2s7CiAKICAgICBzdHJ1Y3QgQXVkaW9TdHJlYW1JbjsKKyAgICBzdHJ1Y3QgVGVlUGF0Y2g7CisgICAgdXNpbmcgVGVlUGF0Y2hlcyA9IHN0ZDo6dmVjdG9yPFRlZVBhdGNoPjsKKwogCiAgICAgc3RydWN0ICBzdHJlYW1fdHlwZV90IHsKICAgICAgICAgc3RyZWFtX3R5cGVfdCgpCkBAIC01MTMsNiArNTY0LDE2IEBACiAgICAgICAgIGJvb2wgICAgICAgIG11dGU7CiAgICAgfTsKIAorICAgIC8vIEFic3RyYWN0aW9uIGZvciB0aGUgQXVkaW8gU291cmNlIGZvciB0aGUgUmVjb3JkVGhyZWFkIChIQUwgb3IgUGFzc3RocnVQYXRjaFJlY29yZCkuCisgICAgc3RydWN0IFNvdXJjZQorICAgIHsKKyAgICAgICAgdmlydHVhbCB+U291cmNlKCkgPSBkZWZhdWx0OworICAgICAgICAvLyBUaGUgZm9sbG93aW5nIG1ldGhvZHMgaGF2ZSB0aGUgc2FtZSBzaWduYXR1cmVzIGFzIGluIFN0cmVhbUhhbEludGVyZmFjZS4KKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpID0gMDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSA9IDA7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhbmRieSgpID0gMDsKKyAgICB9OworCiAgICAgLy8gLS0tIFBsYXliYWNrVGhyZWFkIC0tLQogI2lmZGVmIEZMT0FUX0VGRkVDVF9DSEFJTgogI2RlZmluZSBFRkZFQ1RfQlVGRkVSX0ZPUk1BVCBBVURJT19GT1JNQVRfUENNX0ZMT0FUCkBAIC01MjQsOSArNTg1LDMxIEBACiAKICNpbmNsdWRlICJUaHJlYWRzLmgiCiAKKyNpbmNsdWRlICJQYXRjaFBhbmVsLmgiCisKICNpbmNsdWRlICJFZmZlY3RzLmgiCiAKLSNpbmNsdWRlICJQYXRjaFBhbmVsLmgiCisjaW5jbHVkZSAiRGV2aWNlRWZmZWN0TWFuYWdlci5oIgorCisgICAgLy8gRmluZCBpbyBoYW5kbGUgYnkgc2Vzc2lvbiBpZC4KKyAgICAvLyBQcmVmZXJlbmNlIGlzIGdpdmVuIHRvIGFuIGlvIGhhbmRsZSB3aXRoIGEgbWF0Y2hpbmcgZWZmZWN0IGNoYWluIHRvIHNlc3Npb24gaWQuCisgICAgLy8gSWYgbm9uZSBmb3VuZCwgQVVESU9fSU9fSEFORExFX05PTkUgaXMgcmV0dXJuZWQuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgc3RhdGljIGF1ZGlvX2lvX2hhbmRsZV90IGZpbmRJb0hhbmRsZUJ5U2Vzc2lvbklkX2woCisgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCBjb25zdCBUJiB0aHJlYWRzKSB7CisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvID0gQVVESU9fSU9fSEFORExFX05PTkU7CisKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aHJlYWRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBzZXNzaW9uVHlwZSA9IHRocmVhZHMudmFsdWVBdChpKS0+aGFzQXVkaW9TZXNzaW9uKHNlc3Npb25JZCk7CisgICAgICAgICAgICBpZiAoc2Vzc2lvblR5cGUgIT0gMCkgeworICAgICAgICAgICAgICAgIGlvID0gdGhyZWFkcy5rZXlBdChpKTsKKyAgICAgICAgICAgICAgICBpZiAoKHNlc3Npb25UeXBlICYgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpFRkZFQ1RfU0VTU0lPTikgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gZWZmZWN0IGNoYWluIGhlcmUuCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpbzsKKyAgICB9CiAKICAgICAvLyBzZXJ2ZXIgc2lkZSBvZiB0aGUgY2xpZW50J3MgSUF1ZGlvVHJhY2sKICAgICBjbGFzcyBUcmFja0hhbmRsZSA6IHB1YmxpYyBhbmRyb2lkOjpCbkF1ZGlvVHJhY2sgewpAQCAtNTQwLDYgKzYyMyw3IEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCAgICAgICAgcGF1c2UoKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBhdHRhY2hBdXhFZmZlY3QoaW50IGVmZmVjdElkKTsKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNlbGVjdFByZXNlbnRhdGlvbihpbnQgcHJlc2VudGF0aW9uSWQsIGludCBwcm9ncmFtSWQpOwogICAgICAgICB2aXJ0dWFsIG1lZGlhOjpWb2x1bWVTaGFwZXI6OlN0YXR1cyBhcHBseVZvbHVtZVNoYXBlcigKICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpPcGVyYXRpb24+JiBvcGVyYXRpb24pIG92ZXJyaWRlOwpAQCAtNTY0LDYgKzY0OCwxMCBAQAogICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgc3RvcCgpOwogICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgZ2V0QWN0aXZlTWljcm9waG9uZXMoCiAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpOworICAgICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgc2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbigKKyAgICAgICAgICAgICAgICBpbnQgLyphdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90Ki8gZGlyZWN0aW9uKTsKKyAgICAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgIHNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKTsKKwogICAgIHByaXZhdGU6CiAgICAgICAgIGNvbnN0IHNwPFJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s+IG1SZWNvcmRUcmFjazsKIApAQCAtNjA1LDEzICs2OTMsMTUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBvdXRwdXREZXZpY2VBZGRyZXNzKTsKICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gb3Blbk91dHB1dF9sKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyk7CiAKICAgICAgICAgICAgICAgdm9pZCBjbG9zZU91dHB1dEZpbmlzaChjb25zdCBzcDxQbGF5YmFja1RocmVhZD4mIHRocmVhZCk7CiAgICAgICAgICAgICAgIHZvaWQgY2xvc2VJbnB1dEZpbmlzaChjb25zdCBzcDxSZWNvcmRUaHJlYWQ+JiB0aHJlYWQpOwpAQCAtNjM4LDE3ICs3MjgsMjAgQEAKIAogICAgICAgICAgICAgICBzdGF0dXNfdCBtb3ZlRWZmZWN0Q2hhaW5fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpzcmNUaHJlYWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKmRzdFRocmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlUmVnaXN0ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICpkc3RUaHJlYWQpOworCisgICAgICAgICAgICAgIHN0YXR1c190IG1vdmVBdXhFZmZlY3RUb0lvKGludCBFZmZlY3RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiBkc3RUaHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkPiAqc3JjVGhyZWFkKTsKIAogICAgICAgICAgICAgICAvLyByZXR1cm4gdGhyZWFkIGFzc29jaWF0ZWQgd2l0aCBwcmltYXJ5IGhhcmR3YXJlIGRldmljZSwgb3IgTlVMTAogICAgICAgICAgICAgICBQbGF5YmFja1RocmVhZCAqcHJpbWFyeVBsYXliYWNrVGhyZWFkX2woKSBjb25zdDsKLSAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByaW1hcnlPdXRwdXREZXZpY2VfbCgpIGNvbnN0OworICAgICAgICAgICAgICBEZXZpY2VUeXBlU2V0IHByaW1hcnlPdXRwdXREZXZpY2VfbCgpIGNvbnN0OwogCiAgICAgICAgICAgICAgIC8vIHJldHVybiB0aGUgcGxheWJhY2sgdGhyZWFkIHdpdGggc21hbGxlc3QgSEFMIGJ1ZmZlciBzaXplLCBhbmQgcHJlZmVyIGZhc3QKICAgICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKmZhc3RQbGF5YmFja1RocmVhZF9sKCkgY29uc3Q7CiAKLSAgICAgICAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ+IGdldEVmZmVjdFRocmVhZF9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIGludCBFZmZlY3RJZCk7CisgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IGdldEVmZmVjdFRocmVhZF9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIGludCBlZmZlY3RJZCk7CiAKIAogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbW92ZUNsaWVudF9sKHBpZF90IHBpZCk7CkBAIC02NzQsMTMgKzc2NywxOSBAQAogICAgICAgICAgICAgICAgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBlZmZlY3Qgd2FzIGZvdW5kIGluIG1PcnBoYW5FZmZlY3RDaGFpbnMsIGZhbHNlIG90aGVyd2lzZS4KICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgdXBkYXRlT3JwaGFuRWZmZWN0Q2hhaW5zKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCk7CiAKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjwgc3A8RWZmZWN0TW9kdWxlPiA+IHB1cmdlU3RhbGVFZmZlY3RzX2woKTsKKwogICAgICAgICAgICAgICAgIHZvaWQgYnJvYWNhc3RQYXJhbWV0ZXJzVG9SZWNvcmRUaHJlYWRzX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICAgICAgdm9pZCB1cGRhdGVPdXREZXZpY2VzRm9yUmVjb3JkVGhyZWFkc19sKGNvbnN0IERldmljZURlc2NyaXB0b3JCYXNlVmVjdG9yJiBkZXZpY2VzKTsKKyAgICAgICAgICAgICAgICB2b2lkIGZvcndhcmRQYXJhbWV0ZXJzVG9Eb3duc3RyZWFtUGF0Y2hlc19sKAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgdXBTdHJlYW0sIGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+Jik+IHVzZVRocmVhZCA9IG51bGxwdHIpOwogCiAgICAgLy8gQXVkaW9TdHJlYW1JbiBpcyBpbW11dGFibGUsIHNvIHRoZWlyIGZpZWxkcyBhcmUgY29uc3QuCiAgICAgLy8gRm9yIGVtcGhhc2lzLCB3ZSBjb3VsZCBhbHNvIG1ha2UgYWxsIHBvaW50ZXJzIHRvIHRoZW0gYmUgImNvbnN0ICoiLAogICAgIC8vIGJ1dCB0aGF0IHdvdWxkIGNsdXR0ZXIgdGhlIGNvZGUgdW5uZWNlc3NhcmlseS4KIAotICAgIHN0cnVjdCBBdWRpb1N0cmVhbUluIHsKKyAgICBzdHJ1Y3QgQXVkaW9TdHJlYW1JbiA6IHB1YmxpYyBTb3VyY2UgewogICAgICAgICBBdWRpb0h3RGV2aWNlKiBjb25zdCBhdWRpb0h3RGV2OwogICAgICAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gc3RyZWFtOwogICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzOwpAQCAtNjg5LDYgKzc4OCwxOCBAQAogCiAgICAgICAgIEF1ZGlvU3RyZWFtSW4oQXVkaW9Id0RldmljZSAqZGV2LCBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gaW4sIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpIDoKICAgICAgICAgICAgIGF1ZGlvSHdEZXYoZGV2KSwgc3RyZWFtKGluKSwgZmxhZ3MoZmxhZ3MpIHt9CisgICAgICAgIHN0YXR1c190IHJlYWQodm9pZCAqYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCAqcmVhZCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgcmV0dXJuIHN0cmVhbS0+cmVhZChidWZmZXIsIGJ5dGVzLCByZWFkKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBnZXRDYXB0dXJlUG9zaXRpb24oaW50NjRfdCAqZnJhbWVzLCBpbnQ2NF90ICp0aW1lKSBvdmVycmlkZSB7CisgICAgICAgICAgICByZXR1cm4gc3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oZnJhbWVzLCB0aW1lKTsKKyAgICAgICAgfQorICAgICAgICBzdGF0dXNfdCBzdGFuZGJ5KCkgb3ZlcnJpZGUgeyByZXR1cm4gc3RyZWFtLT5zdGFuZGJ5KCk7IH0KKyAgICB9OworCisgICAgc3RydWN0IFRlZVBhdGNoIHsKKyAgICAgICAgc3A8UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZD4gcGF0Y2hSZWNvcmQ7CisgICAgICAgIHNwPFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrPiBwYXRjaFRyYWNrOwogICAgIH07CiAKICAgICAvLyBmb3IgbUF1ZGlvU2Vzc2lvblJlZnMgb25seQpAQCAtNzE3LDYgKzgyOCw3IEBACiAgICAgICAgICAgICAgICAgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX21vZHVsZV9oYW5kbGVfdCwgQXVkaW9Id0RldmljZSo+ICBtQXVkaW9Id0RldnM7CiAKICAgICAgICAgICAgICAgICBzcDxEZXZpY2VzRmFjdG9yeUhhbEludGVyZmFjZT4gbURldmljZXNGYWN0b3J5SGFsOworICAgICAgICAgICAgICAgIHNwPERldmljZXNGYWN0b3J5SGFsQ2FsbGJhY2s+IG1EZXZpY2VzRmFjdG9yeUhhbENhbGxiYWNrOwogCiAgICAgLy8gZm9yIGR1bXAsIGluZGljYXRlcyB3aGljaCBoYXJkd2FyZSBvcGVyYXRpb24gaXMgY3VycmVudGx5IGluIHByb2dyZXNzIChidXQgbm90IHN0cmVhbSBvcHMpCiAgICAgZW51bSBoYXJkd2FyZV9jYWxsX3N0YXRlIHsKQEAgLTc1Miw2ICs4NjQsNyBAQAogICAgICAgICAgICAgICAgIC8vIG1lbWJlciB2YXJpYWJsZXMgYmVsb3cgYXJlIHByb3RlY3RlZCBieSBtTG9jawogICAgICAgICAgICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJWb2x1bWU7CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hc3Rlck11dGU7CisgICAgICAgICAgICAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hc3RlckJhbGFuY2UgPSAwLmY7CiAgICAgICAgICAgICAgICAgLy8gZW5kIG9mIHZhcmlhYmxlcyBwcm90ZWN0ZWQgYnkgbUxvY2sKIAogICAgICAgICAgICAgICAgIERlZmF1bHRLZXllZFZlY3RvcjwgYXVkaW9faW9faGFuZGxlX3QsIHNwPFJlY29yZFRocmVhZD4gPiAgICBtUmVjb3JkVGhyZWFkczsKQEAgLTc2OSw2ICs4ODIsNyBAQAogICAgICAgICAgICAgICAgIFZlY3RvcjxBdWRpb1Nlc3Npb25SZWYqPiBtQXVkaW9TZXNzaW9uUmVmczsKIAogICAgICAgICAgICAgICAgIGZsb2F0ICAgICAgIG1hc3RlclZvbHVtZV9sKCkgY29uc3Q7CisgICAgICAgICAgICAgICAgZmxvYXQgICAgICAgZ2V0TWFzdGVyQmFsYW5jZV9sKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgbWFzdGVyTXV0ZV9sKCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGxvYWRId01vZHVsZV9sKGNvbnN0IGNoYXIgKm5hbWUpOwogCkBAIC03OTEsNDQgKzkwNSwxOSBAQAogCiAgICAgLy8gZm9yIHVzZSBmcm9tIGRlc3RydWN0b3IKICAgICBzdGF0dXNfdCAgICBjbG9zZU91dHB1dF9ub252aXJ0dWFsKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCk7Ci0gICAgdm9pZCAgICAgICAgY2xvc2VPdXRwdXRJbnRlcm5hbF9sKGNvbnN0IHNwPFBsYXliYWNrVGhyZWFkPiYgdGhyZWFkKTsKKyAgICB2b2lkICAgICAgICBjbG9zZVRocmVhZEludGVybmFsX2woY29uc3Qgc3A8UGxheWJhY2tUaHJlYWQ+JiB0aHJlYWQpOwogICAgIHN0YXR1c190ICAgIGNsb3NlSW5wdXRfbm9udmlydHVhbChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7Ci0gICAgdm9pZCAgICAgICAgY2xvc2VJbnB1dEludGVybmFsX2woY29uc3Qgc3A8UmVjb3JkVGhyZWFkPiYgdGhyZWFkKTsKKyAgICB2b2lkICAgICAgICBjbG9zZVRocmVhZEludGVybmFsX2woY29uc3Qgc3A8UmVjb3JkVGhyZWFkPiYgdGhyZWFkKTsKICAgICB2b2lkICAgICAgICBzZXRBdWRpb0h3U3luY0ZvclNlc3Npb25fbChQbGF5YmFja1RocmVhZCAqdGhyZWFkLCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKIAogICAgIHN0YXR1c190ICAgIGNoZWNrU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Q7CiAKICAgICB2b2lkICAgICAgICBmaWx0ZXJSZXNlcnZlZFBhcmFtZXRlcnMoU3RyaW5nOCYga2V5VmFsdWVQYWlycywgdWlkX3QgY2FsbGluZ1VpZCk7Ci0KLSNpZmRlZiBURUVfU0lOSwotICAgIC8vIGFsbCByZWNvcmQgdGhyZWFkcyBzZXJpYWxseSBzaGFyZSBhIGNvbW1vbiB0ZWUgc2luaywgd2hpY2ggaXMgcmUtY3JlYXRlZCBvbiBmb3JtYXQgY2hhbmdlCi0gICAgc3A8TkJBSU9fU2luaz4gICBtUmVjb3JkVGVlU2luazsKLSAgICBzcDxOQkFJT19Tb3VyY2U+IG1SZWNvcmRUZWVTb3VyY2U7Ci0jZW5kaWYKKyAgICB2b2lkICAgICAgICBsb2dGaWx0ZXJlZFBhcmFtZXRlcnMoc2l6ZV90IG9yaWdpbmFsS1ZQU2l6ZSwgY29uc3QgU3RyaW5nOCYgb3JpZ2luYWxLVlBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVqZWN0ZWRLVlBTaXplLCBjb25zdCBTdHJpbmc4JiByZWplY3RlZEtWUHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IGNhbGxpbmdVaWQpOwogCiBwdWJsaWM6Ci0KLSNpZmRlZiBURUVfU0lOSwotICAgIC8vIHRlZSBzaW5rLCBpZiBlbmFibGVkIGJ5IHByb3BlcnR5LCBhbGxvd3MgZHVtcHN5cyB0byB3cml0ZSBtb3N0IHJlY2VudCBhdWRpbyB0byAud2F2IGZpbGUKLSAgICBzdGF0aWMgdm9pZCBkdW1wVGVlKGludCBmZCwgY29uc3Qgc3A8TkJBSU9fU291cmNlPiYgc291cmNlLCBhdWRpb19pb19oYW5kbGVfdCBpZCwgY2hhciBzdWZmaXgpOwotCi0gICAgLy8gd2hldGhlciB0ZWUgc2luayBpcyBlbmFibGVkIGJ5IHByb3BlcnR5Ci0gICAgc3RhdGljIGJvb2wgbVRlZVNpbmtJbnB1dEVuYWJsZWQ7Ci0gICAgc3RhdGljIGJvb2wgbVRlZVNpbmtPdXRwdXRFbmFibGVkOwotICAgIHN0YXRpYyBib29sIG1UZWVTaW5rVHJhY2tFbmFibGVkOwotCi0gICAgLy8gcnVudGltZSBjb25maWd1cmVkIHNpemUgb2YgZWFjaCB0ZWUgc2luayBwaXBlLCBpbiBmcmFtZXMKLSAgICBzdGF0aWMgc2l6ZV90IG1UZWVTaW5rSW5wdXRGcmFtZXM7Ci0gICAgc3RhdGljIHNpemVfdCBtVGVlU2lua091dHB1dEZyYW1lczsKLSAgICBzdGF0aWMgc2l6ZV90IG1UZWVTaW5rVHJhY2tGcmFtZXM7Ci0KLSAgICAvLyBjb21waWxlLXRpbWUgZGVmYXVsdCBzaXplIG9mIHRlZSBzaW5rIHBpcGVzLCBpbiBmcmFtZXMKLSAgICAvLyAweDIwMDAwMCBzdGVyZW8gMTYtYml0IFBDTSBmcmFtZXMgPSA0Ny41IHNlY29uZHMgYXQgNDQuMSBrSHosIDggbWVnYWJ5dGVzCi0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVGVlU2lua0lucHV0RnJhbWVzRGVmYXVsdCA9IDB4MjAwMDAwOwotICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga1RlZVNpbmtPdXRwdXRGcmFtZXNEZWZhdWx0ID0gMHgyMDAwMDA7Ci0gICAgc3RhdGljIGNvbnN0IHNpemVfdCBrVGVlU2lua1RyYWNrRnJhbWVzRGVmYXVsdCA9IDB4MjAwMDAwOwotI2VuZGlmCi0KICAgICAvLyBUaGVzZSBtZXRob2RzIHJlYWQgdmFyaWFibGVzIGF0b21pY2FsbHkgd2l0aG91dCBtTG9jaywKICAgICAvLyB0aG91Z2ggdGhlIHZhcmlhYmxlcyBhcmUgdXBkYXRlZCB3aXRoIG1Mb2NrLgogICAgIGJvb2wgICAgaXNMb3dSYW1EZXZpY2UoKSBjb25zdCB7IHJldHVybiBtSXNMb3dSYW1EZXZpY2U7IH0KQEAgLTg0MywxMCArOTMyLDE3IEBACiAKICAgICBuc2Vjc190IG1HbG9iYWxFZmZlY3RFbmFibGVUaW1lOyAgLy8gd2hlbiBhIGdsb2JhbCBlZmZlY3Qgd2FzIGxhc3QgZW5hYmxlZAogCi0gICAgc3A8UGF0Y2hQYW5lbD4gbVBhdGNoUGFuZWw7CisgICAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCisgICAgUGF0Y2hQYW5lbCBtUGF0Y2hQYW5lbDsKICAgICBzcDxFZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZT4gbUVmZmVjdHNGYWN0b3J5SGFsOwogCi0gICAgYm9vbCAgICAgICAgbVN5c3RlbVJlYWR5OworICAgIERldmljZUVmZmVjdE1hbmFnZXIgbURldmljZUVmZmVjdE1hbmFnZXI7CisKKyAgICBib29sICAgICAgIG1TeXN0ZW1SZWFkeTsKKworICAgIFNpbXBsZUxvZyAgbVJlamVjdGVkU2V0UGFyYW1ldGVyTG9nOworICAgIFNpbXBsZUxvZyAgbUFwcFNldFBhcmFtZXRlckxvZzsKKyAgICBTaW1wbGVMb2cgIG1TeXN0ZW1TZXRQYXJhbWV0ZXJMb2c7CiB9OwogCiAjdW5kZWYgSU5DTFVESU5HX0ZST01fQVVESU9GTElOR0VSX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmNwcAppbmRleCBiMTA5ZDA2Li5kZGExNjRjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuY3BwCkBAIC0zNCw3ICszNCw3IEBACiBzdGF0dXNfdCBBdWRpb0h3RGV2aWNlOjpvcGVuT3V0cHV0U3RyZWFtKAogICAgICAgICBBdWRpb1N0cmVhbU91dCAqKnBwU3RyZWFtT3V0LAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgIHN0cnVjdCBhdWRpb19jb25maWcgKmNvbmZpZywKICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcykKQEAgLTUwLDcgKzUwLDcgQEAKICAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsCiAgICAgICAgICAgICBjb25maWctPmZvcm1hdCwKICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBvdXRwdXRTdHJlYW0tPm9wZW4oaGFuZGxlLCBkZXZpY2VzLCBjb25maWcsIGFkZHJlc3MpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dFN0cmVhbS0+b3BlbihoYW5kbGUsIGRldmljZVR5cGUsIGNvbmZpZywgYWRkcmVzcyk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgIGRlbGV0ZSBvdXRwdXRTdHJlYW07CkBAIC03NSw3ICs3NSw3IEBACiAgICAgICAgIGlmICh3cmFwcGVyTmVlZGVkKSB7CiAgICAgICAgICAgICBpZiAoU1BESUZFbmNvZGVyOjppc0Zvcm1hdFN1cHBvcnRlZChvcmlnaW5hbENvbmZpZy5mb3JtYXQpKSB7CiAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtID0gbmV3IFNwZGlmU3RyZWFtT3V0KHRoaXMsIGZsYWdzLCBvcmlnaW5hbENvbmZpZy5mb3JtYXQpOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IG91dHB1dFN0cmVhbS0+b3BlbihoYW5kbGUsIGRldmljZXMsICZvcmlnaW5hbENvbmZpZywgYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gb3V0cHV0U3RyZWFtLT5vcGVuKGhhbmRsZSwgZGV2aWNlVHlwZSwgJm9yaWdpbmFsQ29uZmlnLCBhZGRyZXNzKTsKICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJFUlJPUiAtIG9wZW5PdXRwdXRTdHJlYW0oKSwgU1BESUYgb3BlbiByZXR1cm5lZCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb0h3RGV2aWNlLmgKaW5kZXggZWI4MjZjNi4uNjcwOWQxNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvSHdEZXZpY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9Id0RldmljZS5oCkBAIC0zNSw2ICszNSw5IEBACiAgICAgZW51bSBGbGFncyB7CiAgICAgICAgIEFIV0RfQ0FOX1NFVF9NQVNURVJfVk9MVU1FICA9IDB4MSwKICAgICAgICAgQUhXRF9DQU5fU0VUX01BU1RFUl9NVVRFICAgID0gMHgyLAorICAgICAgICAvLyBNZWFucyB0aGF0IHRoaXMgaXNuJ3QgYSB0ZXJtaW5hbCBtb2R1bGUsIGFuZCBzb2Z0d2FyZSBwYXRjaGVzCisgICAgICAgIC8vIGFyZSB1c2VkIHRvIHRyYW5zcG9ydCBhdWRpbyBkYXRhIGZ1cnRoZXIuCisgICAgICAgIEFIV0RfSVNfSU5TRVJUICAgICAgICAgICAgICA9IDB4NCwKICAgICB9OwogCiAgICAgQXVkaW9Id0RldmljZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLApAQCAtNTUsNiArNTgsMTAgQEAKICAgICAgICAgcmV0dXJuICgwICE9IChtRmxhZ3MgJiBBSFdEX0NBTl9TRVRfTUFTVEVSX01VVEUpKTsKICAgICB9CiAKKyAgICBib29sIGlzSW5zZXJ0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gKDAgIT0gKG1GbGFncyAmIEFIV0RfSVNfSU5TRVJUKSk7CisgICAgfQorCiAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1IYW5kbGU7IH0KICAgICBjb25zdCBjaGFyICptb2R1bGVOYW1lKCkgY29uc3QgeyByZXR1cm4gbU1vZHVsZU5hbWU7IH0KICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGh3RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbUh3RGV2aWNlOyB9CkBAIC02OSw3ICs3Niw3IEBACiAgICAgc3RhdHVzX3Qgb3Blbk91dHB1dFN0cmVhbSgKICAgICAgICAgICAgIEF1ZGlvU3RyZWFtT3V0ICoqcHBTdHJlYW1PdXQsCiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcywKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLAogICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCiAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvQXVkaW9TdHJlYW1PdXQuY3BwCmluZGV4IDFkNGIzZmUuLmQxM2NiOGYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmNwcApAQCAtNjYsOCArNjYsOSBAQAogICAgIC8vIE1haW50YWluIGEgNjQtYml0IHJlbmRlciBwb3NpdGlvbiB1c2luZyB0aGUgMzItYml0IHJlc3VsdCBmcm9tIHRoZSBIQUwuCiAgICAgLy8gVGhpcyBkZWx0YSBjYWxjdWxhdGlvbiByZWxpZXMgb24gdGhlIGFyaXRobWV0aWMgb3ZlcmZsb3cgYmVoYXZpb3IKICAgICAvLyBvZiBpbnRlZ2Vycy4gRm9yIGV4YW1wbGUgKDEwMCAtIDB4RkZGRkZGRjApID0gMTE2LgotICAgIHVpbnQzMl90IHRydW5jYXRlZFBvc2l0aW9uID0gKHVpbnQzMl90KW1SZW5kZXJQb3NpdGlvbjsKLSAgICBpbnQzMl90IGRlbHRhSGFsUG9zaXRpb24gPSAoaW50MzJfdCkoaGFsUG9zaXRpb24gLSB0cnVuY2F0ZWRQb3NpdGlvbik7CisgICAgY29uc3QgdWludDMyX3QgdHJ1bmNhdGVkUG9zaXRpb24gPSAodWludDMyX3QpbVJlbmRlclBvc2l0aW9uOworICAgIGludDMyX3QgZGVsdGFIYWxQb3NpdGlvbjsgLy8gaW5pdGlhbGl6YXRpb24gbm90IG5lZWRlZCwgb3ZlcndpdHRlbiBieSBfX2J1aWx0aW5fc3ViX292ZXJmbG93KCkKKyAgICAodm9pZCkgX19idWlsdGluX3N1Yl9vdmVyZmxvdyhoYWxQb3NpdGlvbiwgdHJ1bmNhdGVkUG9zaXRpb24sICZkZWx0YUhhbFBvc2l0aW9uKTsKICAgICBpZiAoZGVsdGFIYWxQb3NpdGlvbiA+IDApIHsKICAgICAgICAgbVJlbmRlclBvc2l0aW9uICs9IGRlbHRhSGFsUG9zaXRpb247CiAgICAgfQpAQCAtMTE3LDcgKzExOCw3IEBACiAKIHN0YXR1c190IEF1ZGlvU3RyZWFtT3V0OjpvcGVuKAogICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUsCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwKICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZyAqY29uZmlnLAogICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzKQogewpAQCAtMTI5LDcgKzEzMCw3IEBACiAKICAgICBpbnQgc3RhdHVzID0gaHdEZXYoKS0+b3Blbk91dHB1dFN0cmVhbSgKICAgICAgICAgICAgIGhhbmRsZSwKLSAgICAgICAgICAgIGRldmljZXMsCisgICAgICAgICAgICBkZXZpY2VUeXBlLAogICAgICAgICAgICAgY3VzdG9tRmxhZ3MsCiAgICAgICAgICAgICBjb25maWcsCiAgICAgICAgICAgICBhZGRyZXNzLApAQCAtMTUxLDcgKzE1Miw3IEBACiAKICAgICAgICAgc3RhdHVzID0gaHdEZXYoKS0+b3Blbk91dHB1dFN0cmVhbSgKICAgICAgICAgICAgICAgICBoYW5kbGUsCi0gICAgICAgICAgICAgICAgZGV2aWNlcywKKyAgICAgICAgICAgICAgICBkZXZpY2VUeXBlLAogICAgICAgICAgICAgICAgIGN1c3RvbUZsYWdzLAogICAgICAgICAgICAgICAgICZjdXN0b21Db25maWcsCiAgICAgICAgICAgICAgICAgYWRkcmVzcywKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9BdWRpb1N0cmVhbU91dC5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmgKaW5kZXggYjE2YjFhZi4uMTZmYmNmMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0F1ZGlvU3RyZWFtT3V0LmgKQEAgLTQ3LDcgKzQ3LDcgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3BlbigKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSwKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzLAorICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsCiAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnICpjb25maWcsCiAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0RldmljZUVmZmVjdE1hbmFnZXIuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0RldmljZUVmZmVjdE1hbmFnZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3YTRjNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRGV2aWNlRWZmZWN0TWFuYWdlci5jcHAKQEAgLTAsMCArMSwyNzcgQEAKKy8qCisqKgorKiogQ29weXJpZ2h0IDIwMTksIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyoqCisqKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyoqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyoqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorKioKKyoqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyoqCisqKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisqKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorKiogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisqKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisqKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyovCisKKworI2RlZmluZSBMT0dfVEFHICJBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdE1hbmFnZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9wcmltaXRpdmVzLmg+CisKKyNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKKyNpbmNsdWRlIDxtZWRpYS9hdWRpb2hhbC9FZmZlY3RzRmFjdG9yeUhhbEludGVyZmFjZS5oPgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGV2aWNlRWZmZWN0TWFuYWdlcjo6Y3JlYXRlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgIGNvbnN0IFBhdGNoUGFuZWw6OlBhdGNoJiBwYXRjaCkgeworICAgIEFMT0dWKCIlcyBoYW5kbGUgJWQgbUhhbEhhbmRsZSAlZCBudW0gc2lua3MgJWQgZGV2aWNlIHNpbmsgJTA4eCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgaGFuZGxlLCBwYXRjaC5tSGFsSGFuZGxlLAorICAgICAgICAgICAgcGF0Y2gubUF1ZGlvUGF0Y2gubnVtX3NpbmtzLAorICAgICAgICAgICAgcGF0Y2gubUF1ZGlvUGF0Y2gubnVtX3NpbmtzID4gMCA/IHBhdGNoLm1BdWRpb1BhdGNoLnNpbmtzWzBdLmV4dC5kZXZpY2UudHlwZSA6IDApOworCisgICAgbUNvbW1hbmRUaHJlYWQtPmNyZWF0ZUF1ZGlvUGF0Y2hDb21tYW5kKGhhbmRsZSwgcGF0Y2gpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGV2aWNlRWZmZWN0TWFuYWdlcjo6b25DcmVhdGVBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwKKyAgICAgICAgY29uc3QgUGF0Y2hQYW5lbDo6UGF0Y2gmIHBhdGNoKSB7CisgICAgQUxPR1YoIiVzIGhhbmRsZSAlZCBtSGFsSGFuZGxlICVkIGRldmljZSBzaW5rICUwOHgiLAorICAgICAgICAgICAgX19mdW5jX18sIGhhbmRsZSwgcGF0Y2gubUhhbEhhbmRsZSwKKyAgICAgICAgICAgIHBhdGNoLm1BdWRpb1BhdGNoLm51bV9zaW5rcyA+IDAgPyBwYXRjaC5tQXVkaW9QYXRjaC5zaW5rc1swXS5leHQuZGV2aWNlLnR5cGUgOiAwKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGZvciAoYXV0byYgZWZmZWN0IDogbURldmljZUVmZmVjdHMpIHsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZWZmZWN0LnNlY29uZC0+b25DcmVhdGVQYXRjaChoYW5kbGUsIHBhdGNoKTsKKyAgICAgICAgQUxPR1YoIiVzIEVmZmVjdCBvbkNyZWF0ZVBhdGNoIHN0YXR1cyAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworICAgICAgICBBTE9HV19JRihzdGF0dXMgPT0gQkFEX1ZBTFVFLCAiJXMgb25DcmVhdGVQYXRjaCBlcnJvciAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworICAgIH0KK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdE1hbmFnZXI6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgeworICAgIEFMT0dWKCIlcyIsIF9fZnVuY19fKTsKKyAgICBtQ29tbWFuZFRocmVhZC0+cmVsZWFzZUF1ZGlvUGF0Y2hDb21tYW5kKGhhbmRsZSk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RNYW5hZ2VyOjpvblJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgeworICAgIEFMT0dWKCIlcyIsIF9fZnVuY19fKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGZvciAoYXV0byYgZWZmZWN0IDogbURldmljZUVmZmVjdHMpIHsKKyAgICAgICAgZWZmZWN0LnNlY29uZC0+b25SZWxlYXNlUGF0Y2goaGFuZGxlKTsKKyAgICB9Cit9CisKKy8vIERldmljZUVmZmVjdE1hbmFnZXI6OmNyZWF0ZUVmZmVjdF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKK3NwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlPiBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdE1hbmFnZXI6OmNyZWF0ZUVmZmVjdF9sKAorICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yLAorICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UsCisgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAorICAgICAgICBjb25zdCBzcDxJRWZmZWN0Q2xpZW50PiYgZWZmZWN0Q2xpZW50LAorICAgICAgICBjb25zdCBzdGQ6Om1hcDxhdWRpb19wYXRjaF9oYW5kbGVfdCwgUGF0Y2hQYW5lbDo6UGF0Y2g+JiBwYXRjaGVzLAorICAgICAgICBpbnQgKmVuYWJsZWQsCisgICAgICAgIHN0YXR1c190ICpzdGF0dXMpIHsKKyAgICBzcDxEZXZpY2VFZmZlY3RQcm94eT4gZWZmZWN0OworICAgIHNwPEVmZmVjdEhhbmRsZT4gaGFuZGxlOworICAgIHN0YXR1c190IGxTdGF0dXM7CisKKyAgICBsU3RhdHVzID0gY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5KGRlc2NyaXB0b3IpOworICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgKnN0YXR1cyA9IGxTdGF0dXM7CisgICAgICAgcmV0dXJuIGhhbmRsZTsKKyAgICB9CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIGF1dG8gaXRlciA9IG1EZXZpY2VFZmZlY3RzLmZpbmQoZGV2aWNlKTsKKyAgICAgICAgaWYgKGl0ZXIgIT0gbURldmljZUVmZmVjdHMuZW5kKCkpIHsKKyAgICAgICAgICAgIGVmZmVjdCA9IGl0ZXItPnNlY29uZDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGVmZmVjdCA9IG5ldyBEZXZpY2VFZmZlY3RQcm94eShkZXZpY2UsIG1NeUNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLCBtQXVkaW9GbGluZ2VyLm5leHRVbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX0VGRkVDVCkpOworICAgICAgICB9CisgICAgICAgIC8vIGNyZWF0ZSBlZmZlY3QgaGFuZGxlIGFuZCBjb25uZWN0IGl0IHRvIGVmZmVjdCBtb2R1bGUKKyAgICAgICAgaGFuZGxlID0gbmV3IEVmZmVjdEhhbmRsZShlZmZlY3QsIGNsaWVudCwgZWZmZWN0Q2xpZW50LCAwIC8qcHJpb3JpdHkqLyk7CisgICAgICAgIGxTdGF0dXMgPSBoYW5kbGUtPmluaXRDaGVjaygpOworICAgICAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgbFN0YXR1cyA9IGVmZmVjdC0+YWRkSGFuZGxlKGhhbmRsZS5nZXQoKSk7CisgICAgICAgICAgICBpZiAobFN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGVmZmVjdC0+aW5pdChwYXRjaGVzKTsKKyAgICAgICAgICAgICAgICBtRGV2aWNlRWZmZWN0cy5lbXBsYWNlKGRldmljZSwgZWZmZWN0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoZW5hYmxlZCAhPSBOVUxMKSB7CisgICAgICAgICplbmFibGVkID0gKGludCllZmZlY3QtPmlzRW5hYmxlZCgpOworICAgIH0KKyAgICAqc3RhdHVzID0gbFN0YXR1czsKKyAgICByZXR1cm4gaGFuZGxlOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdE1hbmFnZXI6OmNoZWNrRWZmZWN0Q29tcGF0aWJpbGl0eSgKKyAgICAgICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYykgeworCisgICAgaWYgKChkZXNjLT5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgIT0gRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQworICAgICAgICAmJiAoZGVzYy0+ZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spICE9IEVGRkVDVF9GTEFHX1RZUEVfUE9TVF9QUk9DKSB7CisgICAgICAgIEFMT0dXKCIlcygpIG5vbiBwcmUvcG9zdCBwcm9jZXNzaW5nIGRldmljZSBlZmZlY3QgJXMiLCBfX2Z1bmNfXywgZGVzYy0+bmFtZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdE1hbmFnZXI6OmNyZWF0ZUVmZmVjdEhhbCgKKyAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGRldmljZUlkLAorICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19JTklUOworICAgIHNwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBlZmZlY3RzRmFjdG9yeSA9IG1BdWRpb0ZsaW5nZXIuZ2V0RWZmZWN0c0ZhY3RvcnkoKTsKKyAgICBpZiAoZWZmZWN0c0ZhY3RvcnkgIT0gMCkgeworICAgICAgICBzdGF0dXMgPSBlZmZlY3RzRmFjdG9yeS0+Y3JlYXRlRWZmZWN0KAorICAgICAgICAgICAgICAgIHBFZmZlY3RVdWlkLCBzZXNzaW9uSWQsIEFVRElPX0lPX0hBTkRMRV9OT05FLCBkZXZpY2VJZCwgZWZmZWN0KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdE1hbmFnZXI6OmR1bXAoaW50IGZkKSB7CisgICAgY29uc3QgYm9vbCBsb2NrZWQgPSBkdW1wVHJ5TG9jayhtTG9jayk7CisgICAgaWYgKCFsb2NrZWQpIHsKKyAgICAgICAgU3RyaW5nOCByZXN1bHQoIkRldmljZUVmZmVjdE1hbmFnZXIgbWF5IGJlIGRlYWRsb2NrZWRcbiIpOworICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICB9CisKKyAgICB3cml0ZShmZCwgIlxuRGV2aWNlIEVmZmVjdHM6XG4iLCBzaXplb2YoIlxuRGV2aWNlIEVmZmVjdHM6XG4iKSk7CisgICAgZm9yIChjb25zdCBhdXRvJiBpdGVyIDogbURldmljZUVmZmVjdHMpIHsKKyAgICAgICAgU3RyaW5nOCBvdXRTdHI7CisgICAgICAgIG91dFN0ci5hcHBlbmRGb3JtYXQoIiUqc0VmZmVjdCBmb3IgZGV2aWNlICVzIGFkZHJlc3MgJXM6XG4iLCAyLCAiIiwKKyAgICAgICAgICAgICAgICA6OmFuZHJvaWQ6OnRvU3RyaW5nKGl0ZXIuZmlyc3QubVR5cGUpLmNfc3RyKCksIGl0ZXIuZmlyc3QuZ2V0QWRkcmVzcygpKTsKKyAgICAgICAgd3JpdGUoZmQsIG91dFN0ci5zdHJpbmcoKSwgb3V0U3RyLnNpemUoKSk7CisgICAgICAgIGl0ZXIuc2Vjb25kLT5kdW1wKGZkLCA0KTsKKyAgICB9CisKKyAgICBpZiAobG9ja2VkKSB7CisgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgIH0KK30KKworCitzaXplX3QgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RNYW5hZ2VyOjpyZW1vdmVFZmZlY3QoY29uc3Qgc3A8RGV2aWNlRWZmZWN0UHJveHk+JiBlZmZlY3QpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtRGV2aWNlRWZmZWN0cy5lcmFzZShlZmZlY3QtPmRldmljZSgpKTsKKyAgICByZXR1cm4gbURldmljZUVmZmVjdHMuc2l6ZSgpOworfQorCitib29sIEF1ZGlvRmxpbmdlcjo6RGV2aWNlRWZmZWN0TWFuYWdlckNhbGxiYWNrOjpkaXNjb25uZWN0RWZmZWN0SGFuZGxlKAorICAgICAgICBFZmZlY3RIYW5kbGUgKmhhbmRsZSwgYm9vbCB1bnBpbklmTGFzdCkgeworICAgIHNwPEVmZmVjdEJhc2U+IGVmZmVjdEJhc2UgPSBoYW5kbGUtPmVmZmVjdCgpLnByb21vdGUoKTsKKyAgICBpZiAoZWZmZWN0QmFzZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBzcDxEZXZpY2VFZmZlY3RQcm94eT4gZWZmZWN0ID0gZWZmZWN0QmFzZS0+YXNEZXZpY2VFZmZlY3RQcm94eSgpOworICAgIGlmIChlZmZlY3QgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIHJlc3RvcmUgc3VzcGVuZGVkIGVmZmVjdHMgaWYgdGhlIGRpc2Nvbm5lY3RlZCBoYW5kbGUgd2FzIGVuYWJsZWQgYW5kIHRoZSBsYXN0IG9uZS4KKyAgICBib29sIHJlbW92ZSA9IChlZmZlY3QtPnJlbW92ZUhhbmRsZShoYW5kbGUpID09IDApICYmICghZWZmZWN0LT5pc1Bpbm5lZCgpIHx8IHVucGluSWZMYXN0KTsKKyAgICBpZiAocmVtb3ZlKSB7CisgICAgICAgIG1NYW5hZ2VyLnJlbW92ZUVmZmVjdChlZmZlY3QpOworICAgICAgICBpZiAoaGFuZGxlLT5lbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGVmZmVjdEJhc2UtPmNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZChmYWxzZSwgZmFsc2UgLyp0aHJlYWRMb2NrZWQqLyk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKKy8vIC0tLS0tLS0tLS0tICBEZXZpY2VFZmZlY3RNYW5hZ2VyOjpDb21tYW5kVGhyZWFkIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0KKworCitBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdE1hbmFnZXI6OkNvbW1hbmRUaHJlYWQ6On5Db21tYW5kVGhyZWFkKCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1Db21tYW5kcy5jbGVhcigpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGV2aWNlRWZmZWN0TWFuYWdlcjo6Q29tbWFuZFRocmVhZDo6b25GaXJzdFJlZigpCit7CisgICAgcnVuKCJEZXZpY2VFZmZlY3RNYW5hZ2VfQ29tbWFuZFRocmVhZCIsIEFORFJPSURfUFJJT1JJVFlfQVVESU8pOworfQorCitib29sIEF1ZGlvRmxpbmdlcjo6RGV2aWNlRWZmZWN0TWFuYWdlcjo6Q29tbWFuZFRocmVhZDo6dGhyZWFkTG9vcCgpCit7CisgICAgbUxvY2subG9jaygpOworICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKKyAgICB7CisgICAgICAgIHdoaWxlICghbUNvbW1hbmRzLmVtcHR5KCkgJiYgIWV4aXRQZW5kaW5nKCkpIHsKKyAgICAgICAgICAgIHNwPENvbW1hbmQ+IGNvbW1hbmQgPSBtQ29tbWFuZHMuZnJvbnQoKTsKKyAgICAgICAgICAgIG1Db21tYW5kcy5wb3BfZnJvbnQoKTsKKyAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworCisgICAgICAgICAgICBzd2l0Y2ggKGNvbW1hbmQtPm1Db21tYW5kKSB7CisgICAgICAgICAgICBjYXNlIENSRUFURV9BVURJT19QQVRDSDogeworICAgICAgICAgICAgICAgIENyZWF0ZUF1ZGlvUGF0Y2hEYXRhICpkYXRhID0gKENyZWF0ZUF1ZGlvUGF0Y2hEYXRhICopY29tbWFuZC0+bURhdGEuZ2V0KCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIkNvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIGNyZWF0ZSBhdWRpbyBwYXRjaCBoYW5kbGUgJWQiLCBkYXRhLT5tSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBtTWFuYWdlci5vbkNyZWF0ZUF1ZGlvUGF0Y2goZGF0YS0+bUhhbmRsZSwgZGF0YS0+bVBhdGNoKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgY2FzZSBSRUxFQVNFX0FVRElPX1BBVENIOiB7CisgICAgICAgICAgICAgICAgUmVsZWFzZUF1ZGlvUGF0Y2hEYXRhICpkYXRhID0gKFJlbGVhc2VBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQtPm1EYXRhLmdldCgpOworICAgICAgICAgICAgICAgIEFMT0dWKCJDb21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyByZWxlYXNlIGF1ZGlvIHBhdGNoIGhhbmRsZSAlZCIsIGRhdGEtPm1IYW5kbGUpOworICAgICAgICAgICAgICAgIG1NYW5hZ2VyLm9uUmVsZWFzZUF1ZGlvUGF0Y2goZGF0YS0+bUhhbmRsZSk7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR1coIkNvbW1hbmRUaHJlYWQoKSB1bmtub3duIGNvbW1hbmQgJWQiLCBjb21tYW5kLT5tQ29tbWFuZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBBdCB0aGlzIHN0YWdlIHdlIGhhdmUgZWl0aGVyIGFuIGVtcHR5IGNvbW1hbmQgcXVldWUgb3IgdGhlIGZpcnN0IGNvbW1hbmQgaW4gdGhlIHF1ZXVlCisgICAgICAgIC8vIGhhcyBhIGZpbml0ZSBkZWxheS4gU28gdW5sZXNzIHdlIGFyZSBleGl0aW5nIGl0IGlzIHNhZmUgdG8gd2FpdC4KKyAgICAgICAgaWYgKCFleGl0UGVuZGluZygpKSB7CisgICAgICAgICAgICBBTE9HVigiQ29tbWFuZFRocmVhZCgpIGdvaW5nIHRvIHNsZWVwIik7CisgICAgICAgICAgICBtV2FpdFdvcmtDVi53YWl0KG1Mb2NrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtTG9jay51bmxvY2soKTsKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RNYW5hZ2VyOjpDb21tYW5kVGhyZWFkOjpzZW5kQ29tbWFuZChzcDxDb21tYW5kPiBjb21tYW5kKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQ29tbWFuZHMucHVzaF9iYWNrKGNvbW1hbmQpOworICAgIG1XYWl0V29ya0NWLnNpZ25hbCgpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGV2aWNlRWZmZWN0TWFuYWdlcjo6Q29tbWFuZFRocmVhZDo6Y3JlYXRlQXVkaW9QYXRjaENvbW1hbmQoCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSwgY29uc3QgUGF0Y2hQYW5lbDo6UGF0Y2gmIHBhdGNoKQoreworICAgIHNwPENvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQ29tbWFuZChDUkVBVEVfQVVESU9fUEFUQ0gsIG5ldyBDcmVhdGVBdWRpb1BhdGNoRGF0YShoYW5kbGUsIHBhdGNoKSk7CisgICAgQUxPR1YoIkNvbW1hbmRUaHJlYWQoKSBhZGRpbmcgY3JlYXRlIHBhdGNoIGhhbmRsZSAlZCBtSGFsSGFuZGxlICVkLiIsIGhhbmRsZSwgcGF0Y2gubUhhbEhhbmRsZSk7CisgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RNYW5hZ2VyOjpDb21tYW5kVGhyZWFkOjpyZWxlYXNlQXVkaW9QYXRjaENvbW1hbmQoCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBzcDxDb21tYW5kPiBjb21tYW5kID0gbmV3IENvbW1hbmQoUkVMRUFTRV9BVURJT19QQVRDSCwgbmV3IFJlbGVhc2VBdWRpb1BhdGNoRGF0YShoYW5kbGUpKTsKKyAgICBBTE9HVigiQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWxlYXNlIHBhdGNoIik7CisgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RNYW5hZ2VyOjpDb21tYW5kVGhyZWFkOjpleGl0KCkKK3sKKyAgICBBTE9HVigiQ29tbWFuZFRocmVhZDo6ZXhpdCIpOworICAgIHsKKyAgICAgICAgQXV0b011dGV4IF9sKG1Mb2NrKTsKKyAgICAgICAgcmVxdWVzdEV4aXQoKTsKKyAgICAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CisgICAgfQorICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW4gY2FsbCBpdCBmcm9tIHRoZSB0aHJlYWQgbG9vcCBpZiBhbGwgb3RoZXIgcmVmZXJlbmNlcyBoYXZlIGJlZW4gcmVsZWFzZWQKKyAgICAvLyBidXQgaXQgd2lsbCBzYWZlbHkgcmV0dXJuIFdPVUxEX0JMT0NLIGluIHRoaXMgY2FzZQorICAgIHJlcXVlc3RFeGl0QW5kV2FpdCgpOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRGV2aWNlRWZmZWN0TWFuYWdlci5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0RldmljZUVmZmVjdE1hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGZmMTRkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0RldmljZUVmZmVjdE1hbmFnZXIuaApAQCAtMCwwICsxLDIwMyBAQAorLyoKKyoqCisqKiBDb3B5cmlnaHQgMjAxOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorKioKKyoqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworKiogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorKiogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisqKgorKiogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorKioKKyoqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyoqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisqKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyoqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyoqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorKi8KKworI2lmbmRlZiBJTkNMVURJTkdfRlJPTV9BVURJT0ZMSU5HRVJfSAorICAgICNlcnJvciBUaGlzIGhlYWRlciBmaWxlIHNob3VsZCBvbmx5IGJlIGluY2x1ZGVkIGZyb20gQXVkaW9GbGluZ2VyLmgKKyNlbmRpZgorCisvLyBEZXZpY2VFZmZlY3RNYW5hZ2VyIGlzIGNvbmNlYWxlZCB3aXRoaW4gQXVkaW9GbGluZ2VyLCB0aGVpciBsaWZldGltZXMgYXJlIHRoZSBzYW1lLgorY2xhc3MgRGV2aWNlRWZmZWN0TWFuYWdlciB7CitwdWJsaWM6CisgICAgZXhwbGljaXQgRGV2aWNlRWZmZWN0TWFuYWdlcihBdWRpb0ZsaW5nZXIqIGF1ZGlvRmxpbmdlcikKKyAgICAgICAgOiBtQ29tbWFuZFRocmVhZChuZXcgQ29tbWFuZFRocmVhZCgqdGhpcykpLCBtQXVkaW9GbGluZ2VyKCphdWRpb0ZsaW5nZXIpLAorICAgICAgICBtTXlDYWxsYmFjayhuZXcgRGV2aWNlRWZmZWN0TWFuYWdlckNhbGxiYWNrKHRoaXMpKSB7fQorCisgICAgICAgICAgICB+RGV2aWNlRWZmZWN0TWFuYWdlcigpIHsKKyAgICAgICAgICAgICAgICBtQ29tbWFuZFRocmVhZC0+ZXhpdCgpOworICAgICAgICAgICAgfQorCisgICAgc3A8RWZmZWN0SGFuZGxlPiBjcmVhdGVFZmZlY3RfbChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHImIGRldmljZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICBjb25zdCBzcDxJRWZmZWN0Q2xpZW50PiYgZWZmZWN0Q2xpZW50LAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6bWFwPGF1ZGlvX3BhdGNoX2hhbmRsZV90LCBQYXRjaFBhbmVsOjpQYXRjaD4mIHBhdGNoZXMsCisgICAgICAgICAgICAgICAgaW50ICplbmFibGVkLAorICAgICAgICAgICAgICAgIHN0YXR1c190ICpzdGF0dXMpOworICAgIHZvaWQgY3JlYXRlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsIGNvbnN0IFBhdGNoUGFuZWw6OlBhdGNoJiBwYXRjaCk7CisgICAgdm9pZCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgc2l6ZV90IHJlbW92ZUVmZmVjdChjb25zdCBzcDxEZXZpY2VFZmZlY3RQcm94eT4mIGVmZmVjdCk7CisgICAgc3RhdHVzX3QgY3JlYXRlRWZmZWN0SGFsKGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLAorICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBkZXZpY2VJZCwKKyAgICAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KTsKKyAgICBzdGF0dXNfdCBhZGRFZmZlY3RUb0hhbChhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLCBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaHdNb2R1bGVJZCwKKyAgICAgICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7CisgICAgICAgIHJldHVybiBtQXVkaW9GbGluZ2VyLmFkZEVmZmVjdFRvSGFsKGRldmljZUlkLCBod01vZHVsZUlkLCBlZmZlY3QpOworICAgIH07CisgICAgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0RnJvbUhhbChhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLCBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaHdNb2R1bGVJZCwKKyAgICAgICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7CisgICAgICAgIHJldHVybiBtQXVkaW9GbGluZ2VyLnJlbW92ZUVmZmVjdEZyb21IYWwoZGV2aWNlSWQsIGh3TW9kdWxlSWQsIGVmZmVjdCk7CisgICAgfTsKKworICAgIEF1ZGlvRmxpbmdlciYgYXVkaW9GbGluZ2VyKCkgY29uc3QgeyByZXR1cm4gbUF1ZGlvRmxpbmdlcjsgfQorCisgICAgdm9pZCBkdW1wKGludCBmZCk7CisKK3ByaXZhdGU6CisKKyAgICAvLyBUaHJlYWQgdG8gZXhlY3V0ZSBjcmVhdGUgYW5kIHJlbGVhc2UgcGF0Y2ggY29tbWFuZHMgYXN5bmNocm9ub3VzbHkuIFRoaXMgaXMgbmVlZGVkIGJlY2F1c2UKKyAgICAvLyBQYXRjaFBhbmVsOjpjcmVhdGVBdWRpb1BhdGNoIGFuZCByZWxlYXNlQXVkaW9QYXRjaCBhcmUgZXhlY3V0ZWQgZnJvbSBhdWRpbyBwb2xpY3kgc2VydmljZQorICAgIC8vIHdpdGggbXV0ZXggbG9ja2VkIGFuZCBlZmZlY3QgbWFuYWdlbWVudCByZXF1aXJlcyB0byBjYWxsIGJhY2sgaW50byBhdWRpbyBwb2xpY3kgc2VydmljZQorICAgIGNsYXNzIENvbW1hbmQ7CisgICAgY2xhc3MgQ29tbWFuZFRocmVhZCA6IHB1YmxpYyBUaHJlYWQgeworICAgIHB1YmxpYzoKKworICAgICAgICBlbnVtIHsKKyAgICAgICAgICAgIENSRUFURV9BVURJT19QQVRDSCwKKyAgICAgICAgICAgIFJFTEVBU0VfQVVESU9fUEFUQ0gsCisgICAgICAgIH07CisKKyAgICAgICAgQ29tbWFuZFRocmVhZChEZXZpY2VFZmZlY3RNYW5hZ2VyJiBtYW5hZ2VyKQorICAgICAgICAgICAgOiBUaHJlYWQoZmFsc2UpLCBtTWFuYWdlcihtYW5hZ2VyKSB7fQorICAgICAgICB+Q29tbWFuZFRocmVhZCgpIG92ZXJyaWRlOworCisgICAgICAgIC8vIFRocmVhZCB2aXJ0dWFscworICAgICAgICB2b2lkIG9uRmlyc3RSZWYoKSBvdmVycmlkZTsKKyAgICAgICAgYm9vbCB0aHJlYWRMb29wKCkgb3ZlcnJpZGU7CisKKyAgICAgICAgICAgICAgICB2b2lkIGV4aXQoKTsKKworICAgICAgICAgICAgICAgIHZvaWQgY3JlYXRlQXVkaW9QYXRjaENvbW1hbmQoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGF0Y2hQYW5lbDo6UGF0Y2gmIHBhdGNoKTsKKyAgICAgICAgICAgICAgICB2b2lkIHJlbGVhc2VBdWRpb1BhdGNoQ29tbWFuZChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgY2xhc3MgQ29tbWFuZERhdGE7CisKKyAgICAgICAgLy8gZGVzY3JpcHRvciBmb3IgcmVxdWVzdGVkIHRvbmUgcGxheWJhY2sgZXZlbnQKKyAgICAgICAgY2xhc3MgQ29tbWFuZDogcHVibGljIFJlZkJhc2UgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBDb21tYW5kKCkgPSBkZWZhdWx0OworICAgICAgICAgICAgQ29tbWFuZChpbnQgY29tbWFuZCwgc3A8Q29tbWFuZERhdGE+IGRhdGEpCisgICAgICAgICAgICAgICAgOiBtQ29tbWFuZChjb21tYW5kKSwgbURhdGEoZGF0YSkge30KKworICAgICAgICAgICAgaW50IG1Db21tYW5kID0gLTE7CisgICAgICAgICAgICBzcDxDb21tYW5kRGF0YT4gbURhdGE7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgQ29tbWFuZERhdGE6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgdmlydHVhbCB+Q29tbWFuZERhdGEoKSA9IGRlZmF1bHQ7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgQ3JlYXRlQXVkaW9QYXRjaERhdGEgOiBwdWJsaWMgQ29tbWFuZERhdGEgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBDcmVhdGVBdWRpb1BhdGNoRGF0YShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsIGNvbnN0IFBhdGNoUGFuZWw6OlBhdGNoJiBwYXRjaCkKKyAgICAgICAgICAgICAgICA6ICAgbUhhbmRsZShoYW5kbGUpLCBtUGF0Y2gocGF0Y2gpIHt9CisKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGU7CisgICAgICAgICAgICBjb25zdCBQYXRjaFBhbmVsOjpQYXRjaCBtUGF0Y2g7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgUmVsZWFzZUF1ZGlvUGF0Y2hEYXRhIDogcHVibGljIENvbW1hbmREYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgUmVsZWFzZUF1ZGlvUGF0Y2hEYXRhKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKKyAgICAgICAgICAgICAgICA6ICAgbUhhbmRsZShoYW5kbGUpIHt9CisKKyAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGU7CisgICAgICAgIH07CisKKyAgICAgICAgdm9pZCBzZW5kQ29tbWFuZChzcDxDb21tYW5kPiBjb21tYW5kKTsKKworICAgICAgICBNdXRleCAgIG1Mb2NrOworICAgICAgICBDb25kaXRpb24gbVdhaXRXb3JrQ1Y7CisgICAgICAgIHN0ZDo6ZGVxdWUgPHNwPENvbW1hbmQ+PiBtQ29tbWFuZHM7IC8vIGxpc3Qgb2YgcGVuZGluZyBjb21tYW5kcworICAgICAgICBEZXZpY2VFZmZlY3RNYW5hZ2VyJiBtTWFuYWdlcjsKKyAgICB9OworCisgICAgdm9pZCBvbkNyZWF0ZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLCBjb25zdCBQYXRjaFBhbmVsOjpQYXRjaCYgcGF0Y2gpOworICAgIHZvaWQgb25SZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworCisgICAgc3RhdHVzX3QgY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5KGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MpOworCisgICAgTXV0ZXggbUxvY2s7CisgICAgc3A8Q29tbWFuZFRocmVhZD4gbUNvbW1hbmRUaHJlYWQ7CisgICAgQXVkaW9GbGluZ2VyICZtQXVkaW9GbGluZ2VyOworICAgIGNvbnN0IHNwPERldmljZUVmZmVjdE1hbmFnZXJDYWxsYmFjaz4gbU15Q2FsbGJhY2s7CisgICAgc3RkOjptYXA8QXVkaW9EZXZpY2VUeXBlQWRkciwgc3A8RGV2aWNlRWZmZWN0UHJveHk+PiBtRGV2aWNlRWZmZWN0czsKK307CisKK2NsYXNzIERldmljZUVmZmVjdE1hbmFnZXJDYWxsYmFjayA6ICBwdWJsaWMgRWZmZWN0Q2FsbGJhY2tJbnRlcmZhY2UgeworcHVibGljOgorICAgICAgICAgICAgRGV2aWNlRWZmZWN0TWFuYWdlckNhbGxiYWNrKERldmljZUVmZmVjdE1hbmFnZXIgKm1hbmFnZXIpCisgICAgICAgICAgICAgICAgOiBtTWFuYWdlcigqbWFuYWdlcikge30KKworICAgIHN0YXR1c190IGNyZWF0ZUVmZmVjdEhhbChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKKyAgICAgICAgICAgaW50MzJfdCBzZXNzaW9uSWQsIGludDMyX3QgZGV2aWNlSWQsCisgICAgICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gKmVmZmVjdCkgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgIHJldHVybiBtTWFuYWdlci5jcmVhdGVFZmZlY3RIYWwocEVmZmVjdFV1aWQsIHNlc3Npb25JZCwgZGV2aWNlSWQsIGVmZmVjdCk7CisgICAgICAgICAgICB9CisgICAgc3RhdHVzX3QgYWxsb2NhdGVIYWxCdWZmZXIoc2l6ZV90IHNpemUgX191bnVzZWQsCisgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIgX191bnVzZWQpIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0VSUk9SOyB9CisgICAgYm9vbCB1cGRhdGVPcnBoYW5FZmZlY3RDaGFpbnMoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCBfX3VudXNlZCkgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvKCkgY29uc3Qgb3ZlcnJpZGUgIHsgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOyB9CisgICAgYm9vbCBpc091dHB1dCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgYm9vbCBpc09mZmxvYWQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorICAgIGJvb2wgaXNPZmZsb2FkT3JEaXJlY3QoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorICAgIGJvb2wgaXNPZmZsb2FkT3JNbWFwKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIHVpbnQzMl90ICBzYW1wbGVSYXRlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gQVVESU9fQ0hBTk5FTF9OT05FOyB9CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorICAgIHNpemVfdCAgICBmcmFtZUNvdW50KCkgY29uc3Qgb3ZlcnJpZGUgIHsgcmV0dXJuIDA7IH0KKyAgICB1aW50MzJfdCAgbGF0ZW5jeSgpIGNvbnN0IG92ZXJyaWRlICB7IHJldHVybiAwOyB9CisKKyAgICBzdGF0dXNfdCBhZGRFZmZlY3RUb0hhbChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCBfX3VudXNlZCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorICAgIHN0YXR1c190IHJlbW92ZUVmZmVjdEZyb21IYWwoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QgX191bnVzZWQpIG92ZXJyaWRlIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGJvb2wgZGlzY29ubmVjdEVmZmVjdEhhbmRsZShFZmZlY3RIYW5kbGUgKmhhbmRsZSwgYm9vbCB1bnBpbklmTGFzdCkgb3ZlcnJpZGU7CisgICAgdm9pZCBzZXRWb2x1bWVGb3JPdXRwdXQoZmxvYXQgbGVmdCBfX3VudXNlZCwgZmxvYXQgcmlnaHQgX191bnVzZWQpIGNvbnN0IG92ZXJyaWRlIHt9CisKKyAgICAvLyBjaGVjayBpZiBlZmZlY3RzIHNob3VsZCBiZSBzdXNwZW5kZWQgb3IgcmVzdG9yZWQgd2hlbiBhIGdpdmVuIGVmZmVjdCBpcyBlbmFibGUgb3IgZGlzYWJsZWQKKyAgICB2b2lkIGNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3RCYXNlPiYgZWZmZWN0IF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZWQgX191bnVzZWQsIGJvb2wgdGhyZWFkTG9ja2VkIF9fdW51c2VkKSBvdmVycmlkZSB7fQorICAgIHZvaWQgcmVzZXRWb2x1bWUoKSBvdmVycmlkZSB7fQorICAgIHVpbnQzMl90IHN0cmF0ZWd5KCkgY29uc3Qgb3ZlcnJpZGUgIHsgcmV0dXJuIDA7IH0KKyAgICBpbnQzMl90IGFjdGl2ZVRyYWNrQ250KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQorICAgIHZvaWQgb25FZmZlY3RFbmFibGUoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCBfX3VudXNlZCkgb3ZlcnJpZGUge30KKyAgICB2b2lkIG9uRWZmZWN0RGlzYWJsZShjb25zdCBzcDxFZmZlY3RCYXNlPiYgZWZmZWN0IF9fdW51c2VkKSBvdmVycmlkZSB7fQorCisgICAgd3A8RWZmZWN0Q2hhaW4+IGNoYWluKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbnVsbHB0cjsgfQorCisgICAgaW50IG5ld0VmZmVjdElkKCkgeyByZXR1cm4gbU1hbmFnZXIuYXVkaW9GbGluZ2VyKCkubmV4dFVuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfRUZGRUNUKTsgfQorCisgICAgc3RhdHVzX3QgYWRkRWZmZWN0VG9IYWwoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCwKKyAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBod01vZHVsZUlkLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgeworICAgICAgICByZXR1cm4gbU1hbmFnZXIuYWRkRWZmZWN0VG9IYWwoZGV2aWNlSWQsIGh3TW9kdWxlSWQsIGVmZmVjdCk7CisgICAgfQorICAgIHN0YXR1c190IHJlbW92ZUVmZmVjdEZyb21IYWwoYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCwKKyAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBod01vZHVsZUlkLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgeworICAgICAgICByZXR1cm4gbU1hbmFnZXIucmVtb3ZlRWZmZWN0RnJvbUhhbChkZXZpY2VJZCwgaHdNb2R1bGVJZCwgZWZmZWN0KTsKKyAgICB9Citwcml2YXRlOgorICAgIERldmljZUVmZmVjdE1hbmFnZXImIG1NYW5hZ2VyOworfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmNwcAppbmRleCBiM2Y1ZWZkLi5jYThmZDJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuY3BwCkBAIC0yNCwxNiArMjQsMTkgQEAKICNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvZWZmZWN0X2FlYy5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19lZmZlY3RzL2VmZmVjdF9keW5hbWljc3Byb2Nlc3NpbmcuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfbnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfdmlzdWFsaXplci5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdEhhbEludGVyZmFjZS5oPgogI2luY2x1ZGUgPG1lZGlhL2F1ZGlvaGFsL0VmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKLSNpbmNsdWRlICJTZXJ2aWNlVXRpbGl0aWVzLmgiCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNTUsODEgKzU4LDExNSBAQAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyAgRWZmZWN0TW9kdWxlIGltcGxlbWVudGF0aW9uCisvLyAgRWZmZWN0QmFzZSBpbXBsZW1lbnRhdGlvbgogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAjdW5kZWYgTE9HX1RBRwotI2RlZmluZSBMT0dfVEFHICJBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZSIKKyNkZWZpbmUgTE9HX1RBRyAiQXVkaW9GbGluZ2VyOjpFZmZlY3RCYXNlIgogCi1BdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6RWZmZWN0TW9kdWxlKFRocmVhZEJhc2UgKnRocmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB3cDxBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluPiYgY2hhaW4sCitBdWRpb0ZsaW5nZXI6OkVmZmVjdEJhc2U6OkVmZmVjdEJhc2UoY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RDYWxsYmFja0ludGVyZmFjZT4mIGNhbGxiYWNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwaW5uZWQpCiAgICAgOiBtUGlubmVkKHBpbm5lZCksCi0gICAgICBtVGhyZWFkKHRocmVhZCksIG1DaGFpbihjaGFpbiksIG1JZChpZCksIG1TZXNzaW9uSWQoc2Vzc2lvbklkKSwKLSAgICAgIG1EZXNjcmlwdG9yKCpkZXNjKSwKLSAgICAgIC8vIGNsZWFyIG1Db25maWcgdG8gZW5zdXJlIGNvbnNpc3RlbnQgaW5pdGlhbCB2YWx1ZSBvZiBidWZmZXIgZnJhbWVjb3VudAotICAgICAgLy8gaW4gY2FzZSBidWZmZXJzIGFyZSBhc3NvY2lhdGVkIGJ5IHNldEluQnVmZmVyKCkgb3Igc2V0T3V0QnVmZmVyKCkKLSAgICAgIC8vIHByaW9yIHRvIGNvbmZpZ3VyZSgpLgotICAgICAgbUNvbmZpZ3t7fSwge319LAotICAgICAgbVN0YXR1cyhOT19JTklUKSwgbVN0YXRlKElETEUpLAotICAgICAgbU1heERpc2FibGVXYWl0Q250KDEpLCAvLyBzZXQgYnkgY29uZmlndXJlKCksIHNob3VsZCBiZSA+PSAxCi0gICAgICBtRGlzYWJsZVdhaXRDbnQoMCksICAgIC8vIHNldCBieSBwcm9jZXNzKCkgYW5kIHVwZGF0ZVN0YXRlKCkKLSAgICAgIG1TdXNwZW5kZWQoZmFsc2UpLAotICAgICAgbU9mZmxvYWRlZChmYWxzZSksCi0gICAgICBtQXVkaW9GbGluZ2VyKHRocmVhZC0+bUF1ZGlvRmxpbmdlcikKLSNpZmRlZiBGTE9BVF9FRkZFQ1RfQ0hBSU4KLSAgICAgICwgbVN1cHBvcnRzRmxvYXQoZmFsc2UpCi0jZW5kaWYKKyAgICAgIG1DYWxsYmFjayhjYWxsYmFjayksIG1JZChpZCksIG1TZXNzaW9uSWQoc2Vzc2lvbklkKSwKKyAgICAgIG1EZXNjcmlwdG9yKCpkZXNjKQogewotICAgIEFMT0dWKCJDb25zdHJ1Y3RvciAlcCBwaW5uZWQgJWQiLCB0aGlzLCBwaW5uZWQpOwotICAgIGludCBsU3RhdHVzOworfQogCi0gICAgLy8gY3JlYXRlIGVmZmVjdCBlbmdpbmUgZnJvbSBlZmZlY3QgZmFjdG9yeQotICAgIG1TdGF0dXMgPSAtRU5PREVWOwotICAgIHNwPEF1ZGlvRmxpbmdlcj4gYXVkaW9GbGluZ2VyID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7Ci0gICAgaWYgKGF1ZGlvRmxpbmdlciAhPSAwKSB7Ci0gICAgICAgIHNwPEVmZmVjdHNGYWN0b3J5SGFsSW50ZXJmYWNlPiBlZmZlY3RzRmFjdG9yeSA9IGF1ZGlvRmxpbmdlci0+Z2V0RWZmZWN0c0ZhY3RvcnkoKTsKLSAgICAgICAgaWYgKGVmZmVjdHNGYWN0b3J5ICE9IDApIHsKLSAgICAgICAgICAgIG1TdGF0dXMgPSBlZmZlY3RzRmFjdG9yeS0+Y3JlYXRlRWZmZWN0KAotICAgICAgICAgICAgICAgICAgICAmZGVzYy0+dXVpZCwgc2Vzc2lvbklkLCB0aHJlYWQtPmlkKCksICZtRWZmZWN0SW50ZXJmYWNlKTsKKy8vIG11c3QgYmUgY2FsbGVkIHdpdGggRWZmZWN0TW9kdWxlOjptTG9jayBoZWxkCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEJhc2U6OnNldEVuYWJsZWRfbChib29sIGVuYWJsZWQpCit7CisKKyAgICBBTE9HVigic2V0RW5hYmxlZCAlcCBlbmFibGVkICVkIiwgdGhpcywgZW5hYmxlZCk7CisKKyAgICBpZiAoZW5hYmxlZCAhPSBpc0VuYWJsZWQoKSkgeworICAgICAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgICAgICAvLyBnb2luZyBmcm9tIGRpc2FibGVkIHRvIGVuYWJsZWQKKyAgICAgICAgY2FzZSBJRExFOgorICAgICAgICAgICAgbVN0YXRlID0gU1RBUlRJTkc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVE9QUEVEOgorICAgICAgICAgICAgbVN0YXRlID0gUkVTVEFSVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFNUT1BQSU5HOgorICAgICAgICAgICAgbVN0YXRlID0gQUNUSVZFOworICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8gZ29pbmcgZnJvbSBlbmFibGVkIHRvIGRpc2FibGVkCisgICAgICAgIGNhc2UgUkVTVEFSVDoKKyAgICAgICAgICAgIG1TdGF0ZSA9IFNUT1BQRUQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBTVEFSVElORzoKKyAgICAgICAgICAgIG1TdGF0ZSA9IElETEU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBBQ1RJVkU6CisgICAgICAgICAgICBtU3RhdGUgPSBTVE9QUElORzsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIERFU1RST1lFRDoKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsgLy8gc2ltcGx5IGlnbm9yZSBhcyB3ZSBhcmUgYmVpbmcgZGVzdHJveWVkCisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDE7IGkgPCBtSGFuZGxlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgRWZmZWN0SGFuZGxlICpoID0gbUhhbmRsZXNbaV07CisgICAgICAgICAgICBpZiAoaCAhPSBOVUxMICYmICFoLT5kaXNjb25uZWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIGgtPnNldEVuYWJsZWQoZW5hYmxlZCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICBpZiAobVN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxTdGF0dXMgPSBpbml0KCk7Ci0gICAgaWYgKGxTdGF0dXMgPCAwKSB7Ci0gICAgICAgIG1TdGF0dXMgPSBsU3RhdHVzOwotICAgICAgICBnb3RvIEVycm9yOwotICAgIH0KLQotICAgIHNldE9mZmxvYWRlZCh0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpPRkZMT0FELCB0aHJlYWQtPmlkKCkpOwotICAgIEFMT0dWKCJDb25zdHJ1Y3RvciBzdWNjZXNzIG5hbWUgJXMsIEludGVyZmFjZSAlcCIsIG1EZXNjcmlwdG9yLm5hbWUsIG1FZmZlY3RJbnRlcmZhY2UuZ2V0KCkpOwotCi0gICAgcmV0dXJuOwotRXJyb3I6Ci0gICAgbUVmZmVjdEludGVyZmFjZS5jbGVhcigpOwotICAgIEFMT0dWKCJDb25zdHJ1Y3RvciBFcnJvciAlZCIsIG1TdGF0dXMpOworICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6On5FZmZlY3RNb2R1bGUoKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RCYXNlOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCwgYm9vbCBmcm9tSGFuZGxlKQogewotICAgIEFMT0dWKCJEZXN0cnVjdG9yICVwIiwgdGhpcyk7Ci0gICAgaWYgKG1FZmZlY3RJbnRlcmZhY2UgIT0gMCkgewotICAgICAgICBjaGFyIHV1aWRTdHJbNjRdOwotICAgICAgICBBdWRpb0VmZmVjdDo6Z3VpZFRvU3RyaW5nKCZtRGVzY3JpcHRvci51dWlkLCB1dWlkU3RyLCBzaXplb2YodXVpZFN0cikpOwotICAgICAgICBBTE9HVygiRWZmZWN0TW9kdWxlICVwIGRlc3RydWN0b3IgY2FsbGVkIHdpdGggdW5yZWxlYXNlZCBpbnRlcmZhY2UsIGVmZmVjdCAlcyIsCi0gICAgICAgICAgICAgICAgdGhpcywgdXVpZFN0cik7Ci0gICAgICAgIHJlbGVhc2VfbCgpOworICAgIHN0YXR1c190IHN0YXR1czsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIHN0YXR1cyA9IHNldEVuYWJsZWRfbChlbmFibGVkKTsKICAgICB9Ci0KKyAgICBpZiAoZnJvbUhhbmRsZSkgeworICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1DYWxsYmFjay0+Y2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKHRoaXMsIGZhbHNlLCBmYWxzZSAvKnRocmVhZExvY2tlZCovKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbUNhbGxiYWNrLT5vbkVmZmVjdEVuYWJsZSh0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1DYWxsYmFjay0+b25FZmZlY3REaXNhYmxlKHRoaXMpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjphZGRIYW5kbGUoRWZmZWN0SGFuZGxlICpoYW5kbGUpCitib29sIEF1ZGlvRmxpbmdlcjo6RWZmZWN0QmFzZTo6aXNFbmFibGVkKCkgY29uc3QKK3sKKyAgICBzd2l0Y2ggKG1TdGF0ZSkgeworICAgIGNhc2UgUkVTVEFSVDoKKyAgICBjYXNlIFNUQVJUSU5HOgorICAgIGNhc2UgQUNUSVZFOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIElETEU6CisgICAgY2FzZSBTVE9QUElORzoKKyAgICBjYXNlIFNUT1BQRUQ6CisgICAgY2FzZSBERVNUUk9ZRUQ6CisgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEJhc2U6OnNldFN1c3BlbmRlZChib29sIHN1c3BlbmRlZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIG1TdXNwZW5kZWQgPSBzdXNwZW5kZWQ7Cit9CisKK2Jvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RCYXNlOjpzdXNwZW5kZWQoKSBjb25zdAoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1TdXNwZW5kZWQ7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0QmFzZTo6YWRkSGFuZGxlKEVmZmVjdEhhbmRsZSAqaGFuZGxlKQogewogICAgIHN0YXR1c190IHN0YXR1czsKIApAQCAtMTY4LDEzICsyMDUsNjkgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zc2l6ZV90IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpyZW1vdmVIYW5kbGUoRWZmZWN0SGFuZGxlICpoYW5kbGUpCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEJhc2U6OnVwZGF0ZVBvbGljeVN0YXRlKCkKK3sKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBib29sIGRvUmVnaXN0ZXIgPSBmYWxzZTsKKyAgICBib29sIHJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgICBib29sIGRvRW5hYmxlID0gZmFsc2U7CisgICAgYm9vbCBlbmFibGVkID0gZmFsc2U7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW87CisgICAgdWludDMyX3Qgc3RyYXRlZ3k7CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgIC8vIHJlZ2lzdGVyIGVmZmVjdCB3aGVuIGZpcnN0IGhhbmRsZSBpcyBhdHRhY2hlZCBhbmQgdW5yZWdpc3RlciB3aGVuIGxhc3QgaGFuZGxlIGlzIHJlbW92ZWQKKyAgICAgICAgaWYgKG1Qb2xpY3lSZWdpc3RlcmVkICE9IG1IYW5kbGVzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIGRvUmVnaXN0ZXIgPSB0cnVlOworICAgICAgICAgICAgbVBvbGljeVJlZ2lzdGVyZWQgPSBtSGFuZGxlcy5zaXplKCkgPiAwOworICAgICAgICAgICAgaWYgKG1Qb2xpY3lSZWdpc3RlcmVkKSB7CisgICAgICAgICAgICAgICAgaW8gPSBtQ2FsbGJhY2stPmlvKCk7CisgICAgICAgICAgICAgICAgc3RyYXRlZ3kgPSBtQ2FsbGJhY2stPnN0cmF0ZWd5KCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gZW5hYmxlIGVmZmVjdCB3aGVuIHJlZ2lzdGVyZWQgYWNjb3JkaW5nIHRvIGVuYWJsZSBzdGF0ZSByZXF1ZXN0ZWQgYnkgY29udHJvbGxpbmcgaGFuZGxlCisgICAgICAgIGlmIChtSGFuZGxlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBFZmZlY3RIYW5kbGUgKmhhbmRsZSA9IGNvbnRyb2xIYW5kbGVfbCgpOworICAgICAgICAgICAgaWYgKGhhbmRsZSAhPSBudWxscHRyICYmIG1Qb2xpY3lFbmFibGVkICE9IGhhbmRsZS0+ZW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgZG9FbmFibGUgPSB0cnVlOworICAgICAgICAgICAgICAgIG1Qb2xpY3lFbmFibGVkID0gaGFuZGxlLT5lbmFibGVkKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmVnaXN0ZXJlZCA9IG1Qb2xpY3lSZWdpc3RlcmVkOworICAgICAgICBlbmFibGVkID0gbVBvbGljeUVuYWJsZWQ7CisgICAgICAgIG1Qb2xpY3lMb2NrLmxvY2soKTsKKyAgICB9CisgICAgQUxPR1YoIiVzIG5hbWUgJXMgaWQgJWQgc2Vzc2lvbiAlZCBkb1JlZ2lzdGVyICVkIHJlZ2lzdGVyZWQgJWQgZG9FbmFibGUgJWQgZW5hYmxlZCAlZCIsCisgICAgICAgIF9fZnVuY19fLCBtRGVzY3JpcHRvci5uYW1lLCBtSWQsIG1TZXNzaW9uSWQsIGRvUmVnaXN0ZXIsIHJlZ2lzdGVyZWQsIGRvRW5hYmxlLCBlbmFibGVkKTsKKyAgICBpZiAoZG9SZWdpc3RlcikgeworICAgICAgICBpZiAocmVnaXN0ZXJlZCkgeworICAgICAgICAgICAgc3RhdHVzID0gQXVkaW9TeXN0ZW06OnJlZ2lzdGVyRWZmZWN0KAorICAgICAgICAgICAgICAgICZtRGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICBpbywKKyAgICAgICAgICAgICAgICBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgICAgIG1JZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6dW5yZWdpc3RlckVmZmVjdChtSWQpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChyZWdpc3RlcmVkICYmIGRvRW5hYmxlKSB7CisgICAgICAgIHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRFZmZlY3RFbmFibGVkKG1JZCwgZW5hYmxlZCk7CisgICAgfQorICAgIG1Qb2xpY3lMb2NrLnVubG9jaygpOworCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCitzc2l6ZV90IEF1ZGlvRmxpbmdlcjo6RWZmZWN0QmFzZTo6cmVtb3ZlSGFuZGxlKEVmZmVjdEhhbmRsZSAqaGFuZGxlKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgcmV0dXJuIHJlbW92ZUhhbmRsZV9sKGhhbmRsZSk7CiB9CiAKLXNzaXplX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnJlbW92ZUhhbmRsZV9sKEVmZmVjdEhhbmRsZSAqaGFuZGxlKQorc3NpemVfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEJhc2U6OnJlbW92ZUhhbmRsZV9sKEVmZmVjdEhhbmRsZSAqaGFuZGxlKQogewogICAgIHNpemVfdCBzaXplID0gbUhhbmRsZXMuc2l6ZSgpOwogICAgIHNpemVfdCBpOwpAQCAtMTk4LDE5ICsyOTEsMTUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIC8vIFByZXZlbnQgY2FsbHMgdG8gcHJvY2VzcygpIGFuZCBvdGhlciBmdW5jdGlvbnMgb24gZWZmZWN0IGludGVyZmFjZSBmcm9tIG5vdyBvbi4KLSAgICAvLyBUaGUgZWZmZWN0IGVuZ2luZSB3aWxsIGJlIHJlbGVhc2VkIGJ5IHRoZSBkZXN0cnVjdG9yIHdoZW4gdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZSBvbgotICAgIC8vIHRoaXMgb2JqZWN0IGlzIHJlbGVhc2VkIHdoaWNoIGNhbiBoYXBwZW4gYWZ0ZXIgbmV4dCBwcm9jZXNzIGlzIGNhbGxlZC4KICAgICBpZiAobUhhbmRsZXMuc2l6ZSgpID09IDAgJiYgIW1QaW5uZWQpIHsKICAgICAgICAgbVN0YXRlID0gREVTVFJPWUVEOwotICAgICAgICBtRWZmZWN0SW50ZXJmYWNlLT5jbG9zZSgpOwogICAgIH0KIAogICAgIHJldHVybiBtSGFuZGxlcy5zaXplKCk7CiB9CiAKIC8vIG11c3QgYmUgY2FsbGVkIHdpdGggRWZmZWN0TW9kdWxlOjptTG9jayBoZWxkCi1BdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZSAqQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmNvbnRyb2xIYW5kbGVfbCgpCitBdWRpb0ZsaW5nZXI6OkVmZmVjdEhhbmRsZSAqQXVkaW9GbGluZ2VyOjpFZmZlY3RCYXNlOjpjb250cm9sSGFuZGxlX2woKQogewogICAgIC8vIHRoZSBmaXJzdCB2YWxpZCBoYW5kbGUgaW4gdGhlIGxpc3QgaGFzIGNvbnRyb2wgb3ZlciB0aGUgbW9kdWxlCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSGFuZGxlcy5zaXplKCk7IGkrKykgewpAQCAtMjI0LDIzICszMTMsMjcxIEBACiB9CiAKIC8vIHVuc2FmZSBtZXRob2QgY2FsbGVkIHdoZW4gdGhlIGVmZmVjdCBwYXJlbnQgdGhyZWFkIGhhcyBiZWVuIGRlc3Ryb3llZAotc3NpemVfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6ZGlzY29ubmVjdEhhbmRsZShFZmZlY3RIYW5kbGUgKmhhbmRsZSwgYm9vbCB1bnBpbklmTGFzdCkKK3NzaXplX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RCYXNlOjpkaXNjb25uZWN0SGFuZGxlKEVmZmVjdEhhbmRsZSAqaGFuZGxlLCBib29sIHVucGluSWZMYXN0KQogewogICAgIEFMT0dWKCJkaXNjb25uZWN0KCkgJXAgaGFuZGxlICVwIiwgdGhpcywgaGFuZGxlKTsKKyAgICBpZiAobUNhbGxiYWNrLT5kaXNjb25uZWN0RWZmZWN0SGFuZGxlKGhhbmRsZSwgdW5waW5JZkxhc3QpKSB7CisgICAgICAgIHJldHVybiBtSGFuZGxlcy5zaXplKCk7CisgICAgfQorCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBzc2l6ZV90IG51bUhhbmRsZXMgPSByZW1vdmVIYW5kbGVfbChoYW5kbGUpOwogICAgIGlmICgobnVtSGFuZGxlcyA9PSAwKSAmJiAoIW1QaW5uZWQgfHwgdW5waW5JZkxhc3QpKSB7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjp1bnJlZ2lzdGVyRWZmZWN0KG1JZCk7Ci0gICAgICAgIHNwPEF1ZGlvRmxpbmdlcj4gYWYgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKLSAgICAgICAgaWYgKGFmICE9IDApIHsKLSAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgYWYtPnVwZGF0ZU9ycGhhbkVmZmVjdENoYWlucyh0aGlzKTsKLSAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgfQorICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgbUNhbGxiYWNrLT51cGRhdGVPcnBoYW5FZmZlY3RDaGFpbnModGhpcyk7CisgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICB9CiAgICAgcmV0dXJuIG51bUhhbmRsZXM7CiB9CiAKK2Jvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RCYXNlOjpwdXJnZUhhbmRsZXMoKQoreworICAgIGJvb2wgZW5hYmxlZCA9IGZhbHNlOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgRWZmZWN0SGFuZGxlICpoYW5kbGUgPSBjb250cm9sSGFuZGxlX2woKTsKKyAgICBpZiAoaGFuZGxlICE9IE5VTEwpIHsKKyAgICAgICAgZW5hYmxlZCA9IGhhbmRsZS0+ZW5hYmxlZCgpOworICAgIH0KKyAgICBtSGFuZGxlcy5jbGVhcigpOworICAgIHJldHVybiBlbmFibGVkOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0QmFzZTo6Y2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKGJvb2wgZW5hYmxlZCwgYm9vbCB0aHJlYWRMb2NrZWQpIHsKKyAgICBtQ2FsbGJhY2stPmNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZCh0aGlzLCBlbmFibGVkLCB0aHJlYWRMb2NrZWQpOworfQorCitzdGF0aWMgU3RyaW5nOCBlZmZlY3RGbGFnc1RvU3RyaW5nKHVpbnQzMl90IGZsYWdzKSB7CisgICAgU3RyaW5nOCBzOworCisgICAgcy5hcHBlbmQoImNvbm4uIG1vZGU6ICIpOworICAgIHN3aXRjaCAoZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spIHsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUOiBzLmFwcGVuZCgiaW5zZXJ0Iik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlk6IHMuYXBwZW5kKCJhdXhpbGlhcnkiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19UWVBFX1JFUExBQ0U6IHMuYXBwZW5kKCJyZXBsYWNlIik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVFlQRV9QUkVfUFJPQzogcy5hcHBlbmQoInByZXByb2MiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19UWVBFX1BPU1RfUFJPQzogcy5hcHBlbmQoInBvc3Rwcm9jIik7IGJyZWFrOworICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJ1bmtub3duL3Jlc2VydmVkIik7IGJyZWFrOworICAgIH0KKyAgICBzLmFwcGVuZCgiLCAiKTsKKworICAgIHMuYXBwZW5kKCJpbnNlcnQgcHJlZjogIik7CisgICAgc3dpdGNoIChmbGFncyAmIEVGRkVDVF9GTEFHX0lOU0VSVF9NQVNLKSB7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19JTlNFUlRfQU5ZOiBzLmFwcGVuZCgiYW55Iik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfSU5TRVJUX0ZJUlNUOiBzLmFwcGVuZCgiZmlyc3QiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19JTlNFUlRfTEFTVDogcy5hcHBlbmQoImxhc3QiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19JTlNFUlRfRVhDTFVTSVZFOiBzLmFwcGVuZCgiZXhjbHVzaXZlIik7IGJyZWFrOworICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJ1bmtub3duL3Jlc2VydmVkIik7IGJyZWFrOworICAgIH0KKyAgICBzLmFwcGVuZCgiLCAiKTsKKworICAgIHMuYXBwZW5kKCJ2b2x1bWUgbWdtdDogIik7CisgICAgc3dpdGNoIChmbGFncyAmIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLKSB7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19WT0xVTUVfTk9ORTogcy5hcHBlbmQoIm5vbmUiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19WT0xVTUVfQ1RSTDogcy5hcHBlbmQoImltcGxlbWVudHMgY29udHJvbCIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX1ZPTFVNRV9JTkQ6IHMuYXBwZW5kKCJyZXF1aXJlcyBpbmRpY2F0aW9uIik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfVk9MVU1FX01PTklUT1I6IHMuYXBwZW5kKCJtb25pdG9ycyB2b2x1bWUiKTsgYnJlYWs7CisgICAgZGVmYXVsdDogcy5hcHBlbmQoInVua25vd24vcmVzZXJ2ZWQiKTsgYnJlYWs7CisgICAgfQorICAgIHMuYXBwZW5kKCIsICIpOworCisgICAgdWludDMyX3QgZGV2aW5kID0gZmxhZ3MgJiBFRkZFQ1RfRkxBR19ERVZJQ0VfTUFTSzsKKyAgICBpZiAoZGV2aW5kKSB7CisgICAgICAgIHMuYXBwZW5kKCJkZXZpY2UgaW5kaWNhdGlvbjogIik7CisgICAgICAgIHN3aXRjaCAoZGV2aW5kKSB7CisgICAgICAgIGNhc2UgRUZGRUNUX0ZMQUdfREVWSUNFX0lORDogcy5hcHBlbmQoInJlcXVpcmVzIHVwZGF0ZXMiKTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJ1bmtub3duL3Jlc2VydmVkIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHMuYXBwZW5kKCIsICIpOworICAgIH0KKworICAgIHMuYXBwZW5kKCJpbnB1dCBtb2RlOiAiKTsKKyAgICBzd2l0Y2ggKGZsYWdzICYgRUZGRUNUX0ZMQUdfSU5QVVRfTUFTSykgeworICAgIGNhc2UgRUZGRUNUX0ZMQUdfSU5QVVRfRElSRUNUOiBzLmFwcGVuZCgiZGlyZWN0Iik7IGJyZWFrOworICAgIGNhc2UgRUZGRUNUX0ZMQUdfSU5QVVRfUFJPVklERVI6IHMuYXBwZW5kKCJwcm92aWRlciIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX0lOUFVUX0JPVEg6IHMuYXBwZW5kKCJkaXJlY3QrcHJvdmlkZXIiKTsgYnJlYWs7CisgICAgZGVmYXVsdDogcy5hcHBlbmQoIm5vdCBzZXQiKTsgYnJlYWs7CisgICAgfQorICAgIHMuYXBwZW5kKCIsICIpOworCisgICAgcy5hcHBlbmQoIm91dHB1dCBtb2RlOiAiKTsKKyAgICBzd2l0Y2ggKGZsYWdzICYgRUZGRUNUX0ZMQUdfT1VUUFVUX01BU0spIHsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX09VVFBVVF9ESVJFQ1Q6IHMuYXBwZW5kKCJkaXJlY3QiKTsgYnJlYWs7CisgICAgY2FzZSBFRkZFQ1RfRkxBR19PVVRQVVRfUFJPVklERVI6IHMuYXBwZW5kKCJwcm92aWRlciIpOyBicmVhazsKKyAgICBjYXNlIEVGRkVDVF9GTEFHX09VVFBVVF9CT1RIOiBzLmFwcGVuZCgiZGlyZWN0K3Byb3ZpZGVyIik7IGJyZWFrOworICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJub3Qgc2V0Iik7IGJyZWFrOworICAgIH0KKyAgICBzLmFwcGVuZCgiLCAiKTsKKworICAgIHVpbnQzMl90IGFjY2VsID0gZmxhZ3MgJiBFRkZFQ1RfRkxBR19IV19BQ0NfTUFTSzsKKyAgICBpZiAoYWNjZWwpIHsKKyAgICAgICAgcy5hcHBlbmQoImhhcmR3YXJlIGFjY2VsZXJhdGlvbjogIik7CisgICAgICAgIHN3aXRjaCAoYWNjZWwpIHsKKyAgICAgICAgY2FzZSBFRkZFQ1RfRkxBR19IV19BQ0NfU0lNUExFOiBzLmFwcGVuZCgibm9uLXR1bm5lbGVkIik7IGJyZWFrOworICAgICAgICBjYXNlIEVGRkVDVF9GTEFHX0hXX0FDQ19UVU5ORUw6IHMuYXBwZW5kKCJ0dW5uZWxlZCIpOyBicmVhazsKKyAgICAgICAgZGVmYXVsdDogcy5hcHBlbmQoInVua25vd24vcmVzZXJ2ZWQiKTsgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcy5hcHBlbmQoIiwgIik7CisgICAgfQorCisgICAgdWludDMyX3QgbW9kZWluZCA9IGZsYWdzICYgRUZGRUNUX0ZMQUdfQVVESU9fTU9ERV9NQVNLOworICAgIGlmIChtb2RlaW5kKSB7CisgICAgICAgIHMuYXBwZW5kKCJtb2RlIGluZGljYXRpb246ICIpOworICAgICAgICBzd2l0Y2ggKG1vZGVpbmQpIHsKKyAgICAgICAgY2FzZSBFRkZFQ1RfRkxBR19BVURJT19NT0RFX0lORDogcy5hcHBlbmQoInJlcXVpcmVkIik7IGJyZWFrOworICAgICAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKKyAgICAgICAgfQorICAgICAgICBzLmFwcGVuZCgiLCAiKTsKKyAgICB9CisKKyAgICB1aW50MzJfdCBzcmNpbmQgPSBmbGFncyAmIEVGRkVDVF9GTEFHX0FVRElPX1NPVVJDRV9NQVNLOworICAgIGlmIChzcmNpbmQpIHsKKyAgICAgICAgcy5hcHBlbmQoInNvdXJjZSBpbmRpY2F0aW9uOiAiKTsKKyAgICAgICAgc3dpdGNoIChzcmNpbmQpIHsKKyAgICAgICAgY2FzZSBFRkZFQ1RfRkxBR19BVURJT19TT1VSQ0VfSU5EOiBzLmFwcGVuZCgicmVxdWlyZWQiKTsgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJ1bmtub3duL3Jlc2VydmVkIik7IGJyZWFrOworICAgICAgICB9CisgICAgICAgIHMuYXBwZW5kKCIsICIpOworICAgIH0KKworICAgIGlmIChmbGFncyAmIEVGRkVDVF9GTEFHX09GRkxPQURfTUFTSykgeworICAgICAgICBzLmFwcGVuZCgib2ZmbG9hZGFibGUsICIpOworICAgIH0KKworICAgIGludCBsZW4gPSBzLmxlbmd0aCgpOworICAgIGlmIChzLmxlbmd0aCgpID4gMikgeworICAgICAgICAodm9pZCkgcy5sb2NrQnVmZmVyKGxlbik7CisgICAgICAgIHMudW5sb2NrQnVmZmVyKGxlbiAtIDIpOworICAgIH0KKyAgICByZXR1cm4gczsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdEJhc2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQoreworICAgIFN0cmluZzggcmVzdWx0OworCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiXHRFZmZlY3QgSUQgJWQ6XG4iLCBtSWQpOworCisgICAgYm9vbCBsb2NrZWQgPSBBdWRpb0ZsaW5nZXI6OmR1bXBUcnlMb2NrKG1Mb2NrKTsKKyAgICAvLyBmYWlsZWQgdG8gbG9jayAtIEF1ZGlvRmxpbmdlciBpcyBwcm9iYWJseSBkZWFkbG9ja2VkCisgICAgaWYgKCFsb2NrZWQpIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZCgiXHRcdENvdWxkIG5vdCBsb2NrIEZ4IG11dGV4OlxuIik7CisgICAgfQorCisgICAgcmVzdWx0LmFwcGVuZCgiXHRcdFNlc3Npb24gU3RhdGUgUmVnaXN0ZXJlZCBFbmFibGVkIFN1c3BlbmRlZDpcbiIpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlx0XHQlMDVkICAgJTAzZCAgICVzICAgICAgICAgICVzICAgICAgICVzXG4iLAorICAgICAgICAgICAgbVNlc3Npb25JZCwgbVN0YXRlLCBtUG9saWN5UmVnaXN0ZXJlZCA/ICJ5IiA6ICJuIiwKKyAgICAgICAgICAgIG1Qb2xpY3lFbmFibGVkID8gInkiIDogIm4iLCBtU3VzcGVuZGVkID8gInkiIDogIm4iKTsKKworICAgIHJlc3VsdC5hcHBlbmQoIlx0XHREZXNjcmlwdG9yOlxuIik7CisgICAgY2hhciB1dWlkU3RyWzY0XTsKKyAgICBBdWRpb0VmZmVjdDo6Z3VpZFRvU3RyaW5nKCZtRGVzY3JpcHRvci51dWlkLCB1dWlkU3RyLCBzaXplb2YodXVpZFN0cikpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlx0XHQtIFVVSUQ6ICVzXG4iLCB1dWlkU3RyKTsKKyAgICBBdWRpb0VmZmVjdDo6Z3VpZFRvU3RyaW5nKCZtRGVzY3JpcHRvci50eXBlLCB1dWlkU3RyLCBzaXplb2YodXVpZFN0cikpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlx0XHQtIFRZUEU6ICVzXG4iLCB1dWlkU3RyKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJcdFx0LSBhcGlWZXJzaW9uOiAlMDhYXG5cdFx0LSBmbGFnczogJTA4WCAoJXMpXG4iLAorICAgICAgICAgICAgbURlc2NyaXB0b3IuYXBpVmVyc2lvbiwKKyAgICAgICAgICAgIG1EZXNjcmlwdG9yLmZsYWdzLAorICAgICAgICAgICAgZWZmZWN0RmxhZ3NUb1N0cmluZyhtRGVzY3JpcHRvci5mbGFncykuc3RyaW5nKCkpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlx0XHQtIG5hbWU6ICVzXG4iLAorICAgICAgICAgICAgbURlc2NyaXB0b3IubmFtZSk7CisKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJcdFx0LSBpbXBsZW1lbnRvcjogJXNcbiIsCisgICAgICAgICAgICBtRGVzY3JpcHRvci5pbXBsZW1lbnRvcik7CisKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJcdFx0JXp1IENsaWVudHM6XG4iLCBtSGFuZGxlcy5zaXplKCkpOworICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRcdCAgUGlkIFByaW9yaXR5IEN0cmwgTG9ja2VkIGNsaWVudCBzZXJ2ZXJcbiIpOworICAgIGNoYXIgYnVmZmVyWzI1Nl07CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSGFuZGxlcy5zaXplKCk7ICsraSkgeworICAgICAgICBFZmZlY3RIYW5kbGUgKmhhbmRsZSA9IG1IYW5kbGVzW2ldOworICAgICAgICBpZiAoaGFuZGxlICE9IE5VTEwgJiYgIWhhbmRsZS0+ZGlzY29ubmVjdGVkKCkpIHsKKyAgICAgICAgICAgIGhhbmRsZS0+ZHVtcFRvQnVmZmVyKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICB9CisgICAgfQorICAgIGlmIChsb2NrZWQpIHsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgfQorCisgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0Lmxlbmd0aCgpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIEVmZmVjdE1vZHVsZSBpbXBsZW1lbnRhdGlvbgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZSIKKworQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OkVmZmVjdE1vZHVsZShjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdENhbGxiYWNrSW50ZXJmYWNlPiYgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwaW5uZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpCisgICAgOiBFZmZlY3RCYXNlKGNhbGxiYWNrLCBkZXNjLCBpZCwgc2Vzc2lvbklkLCBwaW5uZWQpLAorICAgICAgLy8gY2xlYXIgbUNvbmZpZyB0byBlbnN1cmUgY29uc2lzdGVudCBpbml0aWFsIHZhbHVlIG9mIGJ1ZmZlciBmcmFtZWNvdW50CisgICAgICAvLyBpbiBjYXNlIGJ1ZmZlcnMgYXJlIGFzc29jaWF0ZWQgYnkgc2V0SW5CdWZmZXIoKSBvciBzZXRPdXRCdWZmZXIoKQorICAgICAgLy8gcHJpb3IgdG8gY29uZmlndXJlKCkuCisgICAgICBtQ29uZmlne3t9LCB7fX0sCisgICAgICBtU3RhdHVzKE5PX0lOSVQpLAorICAgICAgbU1heERpc2FibGVXYWl0Q250KDEpLCAvLyBzZXQgYnkgY29uZmlndXJlKCksIHNob3VsZCBiZSA+PSAxCisgICAgICBtRGlzYWJsZVdhaXRDbnQoMCksICAgIC8vIHNldCBieSBwcm9jZXNzKCkgYW5kIHVwZGF0ZVN0YXRlKCkKKyAgICAgIG1PZmZsb2FkZWQoZmFsc2UpCisjaWZkZWYgRkxPQVRfRUZGRUNUX0NIQUlOCisgICAgICAsIG1TdXBwb3J0c0Zsb2F0KGZhbHNlKQorI2VuZGlmCit7CisgICAgQUxPR1YoIkNvbnN0cnVjdG9yICVwIHBpbm5lZCAlZCIsIHRoaXMsIHBpbm5lZCk7CisgICAgaW50IGxTdGF0dXM7CisKKyAgICAvLyBjcmVhdGUgZWZmZWN0IGVuZ2luZSBmcm9tIGVmZmVjdCBmYWN0b3J5CisgICAgbVN0YXR1cyA9IGNhbGxiYWNrLT5jcmVhdGVFZmZlY3RIYWwoCisgICAgICAgICAgICAmZGVzYy0+dXVpZCwgc2Vzc2lvbklkLCBkZXZpY2VJZCwgJm1FZmZlY3RJbnRlcmZhY2UpOworICAgIGlmIChtU3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbFN0YXR1cyA9IGluaXQoKTsKKyAgICBpZiAobFN0YXR1cyA8IDApIHsKKyAgICAgICAgbVN0YXR1cyA9IGxTdGF0dXM7CisgICAgICAgIGdvdG8gRXJyb3I7CisgICAgfQorCisgICAgc2V0T2ZmbG9hZGVkKGNhbGxiYWNrLT5pc09mZmxvYWQoKSwgY2FsbGJhY2stPmlvKCkpOworICAgIEFMT0dWKCJDb25zdHJ1Y3RvciBzdWNjZXNzIG5hbWUgJXMsIEludGVyZmFjZSAlcCIsIG1EZXNjcmlwdG9yLm5hbWUsIG1FZmZlY3RJbnRlcmZhY2UuZ2V0KCkpOworCisgICAgcmV0dXJuOworRXJyb3I6CisgICAgbUVmZmVjdEludGVyZmFjZS5jbGVhcigpOworICAgIEFMT0dWKCJDb25zdHJ1Y3RvciBFcnJvciAlZCIsIG1TdGF0dXMpOworfQorCitBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6fkVmZmVjdE1vZHVsZSgpCit7CisgICAgQUxPR1YoIkRlc3RydWN0b3IgJXAiLCB0aGlzKTsKKyAgICBpZiAobUVmZmVjdEludGVyZmFjZSAhPSAwKSB7CisgICAgICAgIGNoYXIgdXVpZFN0cls2NF07CisgICAgICAgIEF1ZGlvRWZmZWN0OjpndWlkVG9TdHJpbmcoJm1EZXNjcmlwdG9yLnV1aWQsIHV1aWRTdHIsIHNpemVvZih1dWlkU3RyKSk7CisgICAgICAgIEFMT0dXKCJFZmZlY3RNb2R1bGUgJXAgZGVzdHJ1Y3RvciBjYWxsZWQgd2l0aCB1bnJlbGVhc2VkIGludGVyZmFjZSwgZWZmZWN0ICVzIiwKKyAgICAgICAgICAgICAgICB0aGlzLCB1dWlkU3RyKTsKKyAgICAgICAgcmVsZWFzZV9sKCk7CisgICAgfQorCit9CisKK3NzaXplX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnJlbW92ZUhhbmRsZV9sKEVmZmVjdEhhbmRsZSAqaGFuZGxlKQoreworICAgIHNzaXplX3Qgc3RhdHVzID0gRWZmZWN0QmFzZTo6cmVtb3ZlSGFuZGxlX2woaGFuZGxlKTsKKworICAgIC8vIFByZXZlbnQgY2FsbHMgdG8gcHJvY2VzcygpIGFuZCBvdGhlciBmdW5jdGlvbnMgb24gZWZmZWN0IGludGVyZmFjZSBmcm9tIG5vdyBvbi4KKyAgICAvLyBUaGUgZWZmZWN0IGVuZ2luZSB3aWxsIGJlIHJlbGVhc2VkIGJ5IHRoZSBkZXN0cnVjdG9yIHdoZW4gdGhlIGxhc3Qgc3Ryb25nIHJlZmVyZW5jZSBvbgorICAgIC8vIHRoaXMgb2JqZWN0IGlzIHJlbGVhc2VkIHdoaWNoIGNhbiBoYXBwZW4gYWZ0ZXIgbmV4dCBwcm9jZXNzIGlzIGNhbGxlZC4KKyAgICBpZiAoc3RhdHVzID09IDAgJiYgIW1QaW5uZWQpIHsKKyAgICAgICAgbUVmZmVjdEludGVyZmFjZS0+Y2xvc2UoKTsKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCiBib29sIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjp1cGRhdGVTdGF0ZSgpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCkBAIC0zMDksOCArNjQ2LDggQEAKICAgICAvLyBpbnB1dCBhbmQgb3V0cHV0IGVmZmVjdCBidWZmZXJzIHdpdGhvdXQgYW4gaW50ZXJtZWRpYXJ5IGVmZmVjdCBwcm9jZXNzLgogICAgIC8vIFRPRE86IGNvbnNpZGVyIGltcGxlbWVudGluZyBjaGFubmVsIGNvbnZlcnNpb24uCiAgICAgY29uc3Qgc2l6ZV90IHNhZmVJbnB1dE91dHB1dFNhbXBsZUNvdW50ID0KLSAgICAgICAgICAgIGluQ2hhbm5lbENvdW50ICE9IG91dENoYW5uZWxDb3VudCA/IDAKLSAgICAgICAgICAgICAgICAgICAgOiBvdXRDaGFubmVsQ291bnQgKiBzdGQ6Om1pbigKKyAgICAgICAgICAgIG1JbkNoYW5uZWxDb3VudFJlcXVlc3RlZCAhPSBtT3V0Q2hhbm5lbENvdW50UmVxdWVzdGVkID8gMAorICAgICAgICAgICAgICAgICAgICA6IG1PdXRDaGFubmVsQ291bnRSZXF1ZXN0ZWQgKiBzdGQ6Om1pbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Db25maWcub3V0cHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50KTsKICAgICBjb25zdCBhdXRvIGFjY3VtdWxhdGVJbnB1dFRvT3V0cHV0ID0gW3RoaXMsIHNhZmVJbnB1dE91dHB1dFNhbXBsZUNvdW50XSgpIHsKQEAgLTQ3OCw5ICs4MTUsMTMgQEAKICAgICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcgIT0gbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLnJhdykgewogICAgICAgICAvLyBJZiBhbiBpbnNlcnQgZWZmZWN0IGlzIGlkbGUgYW5kIGlucHV0IGJ1ZmZlciBpcyBkaWZmZXJlbnQgZnJvbSBvdXRwdXQgYnVmZmVyLAogICAgICAgICAvLyBhY2N1bXVsYXRlIGlucHV0IG9udG8gb3V0cHV0Ci0gICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IG1DaGFpbi5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChjaGFpbi5nZXQoKSAhPSBudWxscHRyICYmIGNoYWluLT5hY3RpdmVUcmFja0NudCgpICE9IDApIHsKLSAgICAgICAgICAgIGFjY3VtdWxhdGVJbnB1dFRvT3V0cHV0KCk7CisgICAgICAgIGlmIChtQ2FsbGJhY2stPmFjdGl2ZVRyYWNrQ250KCkgIT0gMCkgeworICAgICAgICAgICAgLy8gc2ltaWxhciBoYW5kbGluZyB3aXRoIGRhdGFfYnlwYXNzIGFib3ZlLgorICAgICAgICAgICAgaWYgKG1Db25maWcub3V0cHV0Q2ZnLmFjY2Vzc01vZGUgPT0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfQUNDVU1VTEFURSkgeworICAgICAgICAgICAgICAgIGFjY3VtdWxhdGVJbnB1dFRvT3V0cHV0KCk7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBFRkZFQ1RfQlVGRkVSX0FDQ0VTU19XUklURQorICAgICAgICAgICAgICAgIGNvcHlJbnB1dFRvT3V0cHV0KCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC00OTcsNyArODM4LDYgQEAKIHsKICAgICBBTE9HVlYoImNvbmZpZ3VyZSgpIHN0YXJ0ZWQiKTsKICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkOwogICAgIHVpbnQzMl90IHNpemU7CiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2s7CiAKQEAgLTUwNiwxNyArODQ2LDExIEBACiAgICAgICAgIGdvdG8gZXhpdDsKICAgICB9CiAKLSAgICB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKLSAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgc3RhdHVzID0gREVBRF9PQkpFQ1Q7Ci0gICAgICAgIGdvdG8gZXhpdDsKLSAgICB9Ci0KICAgICAvLyBUT0RPOiBoYW5kbGUgY29uZmlndXJhdGlvbiBvZiBlZmZlY3RzIHJlcGxhY2luZyB0cmFjayBwcm9jZXNzCiAgICAgLy8gVE9ETzogaGFuZGxlIGNvbmZpZ3VyYXRpb24gb2YgaW5wdXQgKHJlY29yZCkgU1cgZWZmZWN0cyBhYm92ZSB0aGUgSEFMLAogICAgIC8vIHNpbWlsYXIgdG8gb3V0cHV0IEVGRkVDVF9GTEFHX1RZUEVfSU5TRVJUL1JFUExBQ0UsCiAgICAgLy8gaW4gd2hpY2ggY2FzZSBpbnB1dCBjaGFubmVsIG1hc2tzIHNob3VsZCBiZSB1c2VkIGhlcmUuCi0gICAgY2hhbm5lbE1hc2sgPSB0aHJlYWQtPmNoYW5uZWxNYXNrKCk7CisgICAgY2hhbm5lbE1hc2sgPSBtQ2FsbGJhY2stPmNoYW5uZWxNYXNrKCk7CiAgICAgbUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyA9IGNoYW5uZWxNYXNrOwogICAgIG1Db25maWcub3V0cHV0Q2ZnLmNoYW5uZWxzID0gY2hhbm5lbE1hc2s7CiAKQEAgLTU1MywxMSArODg3LDExIEBACiAgICAgbUNvbmZpZy5vdXRwdXRDZmcuZm9ybWF0ID0gRUZGRUNUX0JVRkZFUl9GT1JNQVQ7CiAKICAgICAvLyBEb24ndCB1c2Ugc2FtcGxlIHJhdGUgZm9yIHRocmVhZCBpZiBlZmZlY3QgaXNuJ3Qgb2ZmbG9hZGFibGUuCi0gICAgaWYgKCh0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpPRkZMT0FEKSAmJiAhaXNPZmZsb2FkZWQoKSkgeworICAgIGlmIChtQ2FsbGJhY2stPmlzT2ZmbG9hZE9yRGlyZWN0KCkgJiYgIWlzT2ZmbG9hZGVkKCkpIHsKICAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSBERUZBVUxUX09VVFBVVF9TQU1QTEVfUkFURTsKICAgICAgICAgQUxPR1YoIk92ZXJyaWRpbmcgZWZmZWN0IGlucHV0IGFzIDQ4a0h6Iik7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSB0aHJlYWQtPnNhbXBsZVJhdGUoKTsKKyAgICAgICAgbUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGUgPSBtQ2FsbGJhY2stPnNhbXBsZVJhdGUoKTsKICAgICB9CiAgICAgbUNvbmZpZy5vdXRwdXRDZmcuc2FtcGxpbmdSYXRlID0gbUNvbmZpZy5pbnB1dENmZy5zYW1wbGluZ1JhdGU7CiAgICAgbUNvbmZpZy5pbnB1dENmZy5idWZmZXJQcm92aWRlci5jb29raWUgPSBOVUxMOwpAQCAtNTY4LDcgKzkwMiw3IEBACiAgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyUHJvdmlkZXIucmVsZWFzZUJ1ZmZlciA9IE5VTEw7CiAgICAgbUNvbmZpZy5pbnB1dENmZy5hY2Nlc3NNb2RlID0gRUZGRUNUX0JVRkZFUl9BQ0NFU1NfUkVBRDsKICAgICAvLyBJbnNlcnQgZWZmZWN0OgotICAgIC8vIC0gaW4gc2Vzc2lvbiBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggb3IgQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UsCisgICAgLy8gLSBpbiBnbG9iYWwgc2Vzc2lvbnMgKGUuZyBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpLAogICAgIC8vIGFsd2F5cyBvdmVyd3JpdGVzIG91dHB1dCBidWZmZXI6IGlucHV0IGJ1ZmZlciA9PSBvdXRwdXQgYnVmZmVyCiAgICAgLy8gLSBpbiBvdGhlciBzZXNzaW9uczoKICAgICAvLyAgICAgIGxhc3QgZWZmZWN0IGluIHRoZSBjaGFpbiBhY2N1bXVsYXRlcyBpbiBvdXRwdXQgYnVmZmVyOiBpbnB1dCBidWZmZXIgIT0gb3V0cHV0IGJ1ZmZlcgpAQCAtNTgzLDExICs5MTcsMTMgQEAKICAgICB9CiAgICAgbUNvbmZpZy5pbnB1dENmZy5tYXNrID0gRUZGRUNUX0NPTkZJR19BTEw7CiAgICAgbUNvbmZpZy5vdXRwdXRDZmcubWFzayA9IEVGRkVDVF9DT05GSUdfQUxMOwotICAgIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgPSB0aHJlYWQtPmZyYW1lQ291bnQoKTsKKyAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50ID0gbUNhbGxiYWNrLT5mcmFtZUNvdW50KCk7CiAgICAgbUNvbmZpZy5vdXRwdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQgPSBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5mcmFtZUNvdW50OwogCi0gICAgQUxPR1YoImNvbmZpZ3VyZSgpICVwIHRocmVhZCAlcCBidWZmZXIgJXAgZnJhbWVjb3VudCAlenUiLAotICAgICAgICAgICAgdGhpcywgdGhyZWFkLmdldCgpLCBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcsIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOworICAgIEFMT0dWKCJjb25maWd1cmUoKSAlcCBjaGFpbiAlcCBidWZmZXIgJXAgZnJhbWVjb3VudCAlenUiLAorICAgICAgICAgICAgdGhpcywgbUNhbGxiYWNrLT5jaGFpbigpLnByb21vdGUoKSAhPSBudWxscHRyID8gbUNhbGxiYWNrLT5jaGFpbigpLnByb21vdGUoKS5nZXQoKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLAorICAgICAgICAgICAgICBtQ29uZmlnLmlucHV0Q2ZnLmJ1ZmZlci5yYXcsIG1Db25maWcuaW5wdXRDZmcuYnVmZmVyLmZyYW1lQ291bnQpOwogCiAgICAgc3RhdHVzX3QgY21kU3RhdHVzOwogICAgIHNpemUgPSBzaXplb2YoaW50KTsKQEAgLTYwMiw3ICs5MzgsNyBAQAogCiAjaWZkZWYgTVVMVElDSEFOTkVMX0VGRkVDVF9DSEFJTgogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYKLSAgICAgICAgICAgIHRocmVhZC0+aXNPdXRwdXQoKSAmJgorICAgICAgICAgICAgbUNhbGxiYWNrLT5pc091dHB1dCgpICYmCiAgICAgICAgICAgICAobUNvbmZpZy5pbnB1dENmZy5jaGFubmVscyAhPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KICAgICAgICAgICAgICAgICAgICAgfHwgbUNvbmZpZy5vdXRwdXRDZmcuY2hhbm5lbHMgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSkgewogICAgICAgICAvLyBPbGRlciBlZmZlY3RzIG1heSByZXF1aXJlIGV4YWN0IFNURVJFTyBwb3NpdGlvbiBtYXNrLgpAQCAtNjY5LDExICsxMDA1LDcgQEAKICAgICAgICAgICAgIHNpemUgPSBzaXplb2YoaW50KTsKICAgICAgICAgICAgICooaW50MzJfdCAqKXAtPmRhdGEgPSBWSVNVQUxJWkVSX1BBUkFNX0xBVEVOQ1k7CiAKLSAgICAgICAgICAgIHVpbnQzMl90IGxhdGVuY3kgPSAwOwotICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBidCA9IHRocmVhZC0+bUF1ZGlvRmxpbmdlci0+Y2hlY2tQbGF5YmFja1RocmVhZF9sKHRocmVhZC0+bUlkKTsKLSAgICAgICAgICAgIGlmIChwYnQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIGxhdGVuY3kgPSBwYnQtPmxhdGVuY3lfbCgpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgdWludDMyX3QgbGF0ZW5jeSA9IG1DYWxsYmFjay0+bGF0ZW5jeSgpOwogCiAgICAgICAgICAgICAqKChpbnQzMl90ICopcC0+ZGF0YSArIDEpPSBsYXRlbmN5OwogICAgICAgICAgICAgbUVmZmVjdEludGVyZmFjZS0+Y29tbWFuZChFRkZFQ1RfQ01EX1NFVF9QQVJBTSwKQEAgLTcyMCwzMSArMTA1MiwyMCBAQAogewogICAgIGlmICgobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0MgfHwKICAgICAgICAgIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9QT1NUX1BST0MpIHsKLSAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7Ci0gICAgICAgIGlmICh0aHJlYWQgIT0gMCkgewotICAgICAgICAgICAgc3A8U3RyZWFtSGFsSW50ZXJmYWNlPiBzdHJlYW0gPSB0aHJlYWQtPnN0cmVhbSgpOwotICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gc3RyZWFtLT5hZGRFZmZlY3QobUVmZmVjdEludGVyZmFjZSk7Ci0gICAgICAgICAgICAgICAgQUxPR0VfSUYocmVzdWx0ICE9IE9LLCAiRXJyb3Igd2hlbiBhZGRpbmcgZWZmZWN0OiAlZCIsIHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgKHZvaWQpbUNhbGxiYWNrLT5hZGRFZmZlY3RUb0hhbChtRWZmZWN0SW50ZXJmYWNlKTsKICAgICB9CiB9CiAKIC8vIHN0YXJ0KCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBQbGF5YmFja1RocmVhZDo6bUxvY2sgb3IgRWZmZWN0Q2hhaW46Om1Mb2NrIGhlbGQKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpzdGFydCgpCiB7Ci0gICAgc3A8RWZmZWN0Q2hhaW4+IGNoYWluOwogICAgIHN0YXR1c190IHN0YXR1czsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIHN0YXR1cyA9IHN0YXJ0X2woKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgY2hhaW4gPSBtQ2hhaW4ucHJvbW90ZSgpOwotICAgICAgICB9CiAgICAgfQotICAgIGlmIChjaGFpbiAhPSAwKSB7Ci0gICAgICAgIGNoYWluLT5yZXNldFZvbHVtZV9sKCk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBtQ2FsbGJhY2stPnJlc2V0Vm9sdW1lKCk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC03OTEsMTEgKzExMTIsMTAgQEAKICAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKHN0YXR1c190KTsKIAogICAgIGlmIChpc1ZvbHVtZUNvbnRyb2woKSAmJiBpc09mZmxvYWRlZE9yRGlyZWN0KCkpIHsKLSAgICAgICAgc3A8RWZmZWN0Q2hhaW4+Y2hhaW4gPSBtQ2hhaW4ucHJvbW90ZSgpOwogICAgICAgICAvLyBXZSBoYXZlIHRoZSBFZmZlY3RDaGFpbiBhbmQgRWZmZWN0TW9kdWxlIGxvY2ssIHBlcm1pdCBhIHJlZW50cmFudCBjYWxsIHRvIHNldFZvbHVtZToKICAgICAgICAgLy8gcmVzZXRWb2x1bWVfbCAtLT4gc2V0Vm9sdW1lX2wgLS0+IEVmZmVjdE1vZHVsZTo6c2V0Vm9sdW1lCiAgICAgICAgIG1TZXRWb2x1bWVSZWVudHJhbnRUaWQgPSBnZXR0aWQoKTsKLSAgICAgICAgY2hhaW4tPnJlc2V0Vm9sdW1lX2woKTsKKyAgICAgICAgbUNhbGxiYWNrLT5yZXNldFZvbHVtZSgpOwogICAgICAgICBtU2V0Vm9sdW1lUmVlbnRyYW50VGlkID0gSU5WQUxJRF9QSUQ7CiAgICAgfQogCkBAIC04MDgsNyArMTEyOCw3IEBACiAgICAgICAgIHN0YXR1cyA9IGNtZFN0YXR1czsKICAgICB9CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBzdGF0dXMgPSByZW1vdmVfZWZmZWN0X2Zyb21faGFsX2woKTsKKyAgICAgICAgc3RhdHVzID0gcmVtb3ZlRWZmZWN0RnJvbUhhbF9sKCk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CkBAIC04MTcsMjUgKzExMzcsMTggQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnJlbGVhc2VfbCgpCiB7CiAgICAgaWYgKG1FZmZlY3RJbnRlcmZhY2UgIT0gMCkgewotICAgICAgICByZW1vdmVfZWZmZWN0X2Zyb21faGFsX2woKTsKKyAgICAgICAgcmVtb3ZlRWZmZWN0RnJvbUhhbF9sKCk7CiAgICAgICAgIC8vIHJlbGVhc2UgZWZmZWN0IGVuZ2luZQogICAgICAgICBtRWZmZWN0SW50ZXJmYWNlLT5jbG9zZSgpOwogICAgICAgICBtRWZmZWN0SW50ZXJmYWNlLmNsZWFyKCk7CiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6cmVtb3ZlX2VmZmVjdF9mcm9tX2hhbF9sKCkKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpyZW1vdmVFZmZlY3RGcm9tSGFsX2woKQogewogICAgIGlmICgobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0MgfHwKICAgICAgICAgICAgICAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spID09IEVGRkVDVF9GTEFHX1RZUEVfUE9TVF9QUk9DKSB7Ci0gICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwotICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKLSAgICAgICAgICAgIHNwPFN0cmVhbUhhbEludGVyZmFjZT4gc3RyZWFtID0gdGhyZWFkLT5zdHJlYW0oKTsKLSAgICAgICAgICAgIGlmIChzdHJlYW0gIT0gMCkgewotICAgICAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHN0cmVhbS0+cmVtb3ZlRWZmZWN0KG1FZmZlY3RJbnRlcmZhY2UpOwotICAgICAgICAgICAgICAgIEFMT0dFX0lGKHJlc3VsdCAhPSBPSywgIkVycm9yIHdoZW4gcmVtb3ZpbmcgZWZmZWN0OiAlZCIsIHJlc3VsdCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbUNhbGxiYWNrLT5yZW1vdmVFZmZlY3RGcm9tSGFsKG1FZmZlY3RJbnRlcmZhY2UpOwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC05MjUsNzUgKzEyMzgsNiBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIHJldHVybiBzZXRFbmFibGVkX2woZW5hYmxlZCk7Ci19Ci0KLS8vIG11c3QgYmUgY2FsbGVkIHdpdGggRWZmZWN0TW9kdWxlOjptTG9jayBoZWxkCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c2V0RW5hYmxlZF9sKGJvb2wgZW5hYmxlZCkKLXsKLQotICAgIEFMT0dWKCJzZXRFbmFibGVkICVwIGVuYWJsZWQgJWQiLCB0aGlzLCBlbmFibGVkKTsKLQotICAgIGlmIChlbmFibGVkICE9IGlzRW5hYmxlZCgpKSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRFZmZlY3RFbmFibGVkKG1JZCwgZW5hYmxlZCk7Ci0gICAgICAgIGlmIChlbmFibGVkICYmIHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotCi0gICAgICAgIHN3aXRjaCAobVN0YXRlKSB7Ci0gICAgICAgIC8vIGdvaW5nIGZyb20gZGlzYWJsZWQgdG8gZW5hYmxlZAotICAgICAgICBjYXNlIElETEU6Ci0gICAgICAgICAgICBtU3RhdGUgPSBTVEFSVElORzsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUT1BQRUQ6Ci0gICAgICAgICAgICBtU3RhdGUgPSBSRVNUQVJUOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgU1RPUFBJTkc6Ci0gICAgICAgICAgICBtU3RhdGUgPSBBQ1RJVkU7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAvLyBnb2luZyBmcm9tIGVuYWJsZWQgdG8gZGlzYWJsZWQKLSAgICAgICAgY2FzZSBSRVNUQVJUOgotICAgICAgICAgICAgbVN0YXRlID0gU1RPUFBFRDsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNUQVJUSU5HOgotICAgICAgICAgICAgbVN0YXRlID0gSURMRTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEFDVElWRToKLSAgICAgICAgICAgIG1TdGF0ZSA9IFNUT1BQSU5HOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgREVTVFJPWUVEOgotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOyAvLyBzaW1wbHkgaWdub3JlIGFzIHdlIGFyZSBiZWluZyBkZXN0cm95ZWQKLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IG1IYW5kbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBFZmZlY3RIYW5kbGUgKmggPSBtSGFuZGxlc1tpXTsKLSAgICAgICAgICAgIGlmIChoICE9IE5VTEwgJiYgIWgtPmRpc2Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICAgICAgaC0+c2V0RW5hYmxlZChlbmFibGVkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLWJvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmlzRW5hYmxlZCgpIGNvbnN0Ci17Ci0gICAgc3dpdGNoIChtU3RhdGUpIHsKLSAgICBjYXNlIFJFU1RBUlQ6Ci0gICAgY2FzZSBTVEFSVElORzoKLSAgICBjYXNlIEFDVElWRToKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBJRExFOgotICAgIGNhc2UgU1RPUFBJTkc6Ci0gICAgY2FzZSBTVE9QUEVEOgotICAgIGNhc2UgREVTVFJPWUVEOgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KIGJvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmlzUHJvY2Vzc0VuYWJsZWQoKSBjb25zdAogewogICAgIGlmIChtU3RhdHVzICE9IE5PX0VSUk9SKSB7CkBAIC0xMDE2LDcgKzEyNjAsNyBAQAogCiBib29sIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjppc09mZmxvYWRlZE9yRGlyZWN0KCkgY29uc3QKIHsKLSAgICByZXR1cm4gKG1UaHJlYWRUeXBlID09IFRocmVhZEJhc2U6Ok9GRkxPQUQgfHwgbVRocmVhZFR5cGUgPT0gVGhyZWFkQmFzZTo6RElSRUNUKTsKKyAgICByZXR1cm4gbUNhbGxiYWNrLT5pc09mZmxvYWRPckRpcmVjdCgpOwogfQogCiBib29sIEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjppc1ZvbHVtZUNvbnRyb2xFbmFibGVkKCkgY29uc3QKQEAgLTEwNjAsOSArMTMwNCw3IEBACiAgICAgICAgICAgICAgICAgfHwgc2l6ZSA+IG1JbkNvbnZlcnNpb25CdWZmZXItPmdldFNpemUoKSkpIHsKICAgICAgICAgICAgIG1JbkNvbnZlcnNpb25CdWZmZXIuY2xlYXIoKTsKICAgICAgICAgICAgIEFMT0dWKCIlczogYWxsb2NhdGluZyBtSW5Db252ZXJzaW9uQnVmZmVyICV6dSIsIF9fZnVuY19fLCBzaXplKTsKLSAgICAgICAgICAgIHNwPEF1ZGlvRmxpbmdlcj4gYXVkaW9GbGluZ2VyID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGF1ZGlvRmxpbmdlciA9PSBudWxscHRyLCAiRU0gY291bGQgbm90IHJldHJpZXZlZCBhdWRpb0ZsaW5nZXIiKTsKLSAgICAgICAgICAgICh2b2lkKWF1ZGlvRmxpbmdlci0+bUVmZmVjdHNGYWN0b3J5SGFsLT5hbGxvY2F0ZUJ1ZmZlcihzaXplLCAmbUluQ29udmVyc2lvbkJ1ZmZlcik7CisgICAgICAgICAgICAodm9pZCltQ2FsbGJhY2stPmFsbG9jYXRlSGFsQnVmZmVyKHNpemUsICZtSW5Db252ZXJzaW9uQnVmZmVyKTsKICAgICAgICAgfQogICAgICAgICBpZiAobUluQ29udmVyc2lvbkJ1ZmZlci5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICBtSW5Db252ZXJzaW9uQnVmZmVyLT5zZXRGcmFtZUNvdW50KGluRnJhbWVDb3VudCk7CkBAIC0xMTA2LDkgKzEzNDgsNyBAQAogICAgICAgICAgICAgICAgIHx8IHNpemUgPiBtT3V0Q29udmVyc2lvbkJ1ZmZlci0+Z2V0U2l6ZSgpKSkgewogICAgICAgICAgICAgbU91dENvbnZlcnNpb25CdWZmZXIuY2xlYXIoKTsKICAgICAgICAgICAgIEFMT0dWKCIlczogYWxsb2NhdGluZyBtT3V0Q29udmVyc2lvbkJ1ZmZlciAlenUiLCBfX2Z1bmNfXywgc2l6ZSk7Ci0gICAgICAgICAgICBzcDxBdWRpb0ZsaW5nZXI+IGF1ZGlvRmxpbmdlciA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOwotICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihhdWRpb0ZsaW5nZXIgPT0gbnVsbHB0ciwgIkVNIGNvdWxkIG5vdCByZXRyaWV2ZWQgYXVkaW9GbGluZ2VyIik7Ci0gICAgICAgICAgICAodm9pZClhdWRpb0ZsaW5nZXItPm1FZmZlY3RzRmFjdG9yeUhhbC0+YWxsb2NhdGVCdWZmZXIoc2l6ZSwgJm1PdXRDb252ZXJzaW9uQnVmZmVyKTsKKyAgICAgICAgICAgICh2b2lkKW1DYWxsYmFjay0+YWxsb2NhdGVIYWxCdWZmZXIoc2l6ZSwgJm1PdXRDb252ZXJzaW9uQnVmZmVyKTsKICAgICAgICAgfQogICAgICAgICBpZiAobU91dENvbnZlcnNpb25CdWZmZXIuZ2V0KCkgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgbU91dENvbnZlcnNpb25CdWZmZXItPnNldEZyYW1lQ291bnQob3V0RnJhbWVDb3VudCk7CkBAIC0xMTMxLDcgKzEzNzEsOCBAQAogICAgIC8vIGlmIGNvbnRyb2xsZXIgZmxhZyBpcyBzZXQgKE5vdGUgdGhhdCBjb250cm9sbGVyID09IFRSVUUgPT4gRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwgc2V0KQogICAgIGlmIChpc1Byb2Nlc3NFbmFibGVkKCkgJiYKICAgICAgICAgICAgICgobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkwgfHwKLSAgICAgICAgICAgIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19WT0xVTUVfSU5EKSkgeworICAgICAgICAgICAgIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19WT0xVTUVfSU5EIHx8CisgICAgICAgICAgICAgKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVk9MVU1FX01BU0spID09IEVGRkVDVF9GTEFHX1ZPTFVNRV9NT05JVE9SKSkgewogICAgICAgICB1aW50MzJfdCB2b2x1bWVbMl07CiAgICAgICAgIHVpbnQzMl90ICpwVm9sdW1lID0gTlVMTDsKICAgICAgICAgdWludDMyX3Qgc2l6ZSA9IHNpemVvZih2b2x1bWUpOwpAQCAtMTE1NSwyMCArMTM5NiwxOCBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OnNldFZvbHVtZUZvck91dHB1dF9sKHVpbnQzMl90IGxlZnQsIHVpbnQzMl90IHJpZ2h0KQogewotICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwotICAgIGlmICh0aHJlYWQgIT0gMCAmJgotICAgICAgICAodGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6T0ZGTE9BRCB8fCB0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpESVJFQ1QpICYmCi0gICAgICAgICFpc05vbk9mZmxvYWRhYmxlRW5hYmxlZF9sKCkpIHsKLSAgICAgICAgUGxheWJhY2tUaHJlYWQgKnQgPSAoUGxheWJhY2tUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisgICAgaWYgKG1FZmZlY3RDYWxsYmFjay0+aXNPZmZsb2FkT3JEaXJlY3QoKSAmJiAhaXNOb25PZmZsb2FkYWJsZUVuYWJsZWRfbCgpKSB7CiAgICAgICAgIGZsb2F0IHZvbF9sID0gKGZsb2F0KWxlZnQgLyAoMSA8PCAyNCk7CiAgICAgICAgIGZsb2F0IHZvbF9yID0gKGZsb2F0KXJpZ2h0IC8gKDEgPDwgMjQpOwotICAgICAgICB0LT5zZXRWb2x1bWVGb3JPdXRwdXRfbCh2b2xfbCwgdm9sX3IpOworICAgICAgICBtRWZmZWN0Q2FsbGJhY2stPnNldFZvbHVtZUZvck91dHB1dCh2b2xfbCwgdm9sX3IpOwogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnNldERldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnNlbmRTZXRBdWRpb0RldmljZXNDb21tYW5kKAorICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzLCB1aW50MzJfdCBjbWRDb2RlKQogewotICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IGRldmljZVR5cGVzVG9CaXRNYXNrKGdldEF1ZGlvRGV2aWNlVHlwZXMoZGV2aWNlcykpOworICAgIGlmIChkZXZpY2VUeXBlID09IEFVRElPX0RFVklDRV9OT05FKSB7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKQEAgLTExODAsMTcgKzE0MTksMjYgQEAKICAgICBpZiAoKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfREVWSUNFX01BU0spID09IEVGRkVDVF9GTEFHX0RFVklDRV9JTkQpIHsKICAgICAgICAgc3RhdHVzX3QgY21kU3RhdHVzOwogICAgICAgICB1aW50MzJfdCBzaXplID0gc2l6ZW9mKHN0YXR1c190KTsKLSAgICAgICAgdWludDMyX3QgY21kID0gYXVkaW9faXNfb3V0cHV0X2RldmljZXMoZGV2aWNlKSA/IEVGRkVDVF9DTURfU0VUX0RFVklDRSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0NNRF9TRVRfSU5QVVRfREVWSUNFOwotICAgICAgICBzdGF0dXMgPSBtRWZmZWN0SW50ZXJmYWNlLT5jb21tYW5kKGNtZCwKKyAgICAgICAgLy8gRklYTUU6IHVzZSBhdWRpbyBkZXZpY2UgdHlwZXMgYW5kIGFkZHJlc3NlcyB3aGVuIHRoZSBoYWwgaW50ZXJmYWNlIGlzIHJlYWR5LgorICAgICAgICBzdGF0dXMgPSBtRWZmZWN0SW50ZXJmYWNlLT5jb21tYW5kKGNtZENvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQzMl90KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjbWRTdGF0dXMpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c2V0RGV2aWNlcyhjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKQoreworICAgIHJldHVybiBzZW5kU2V0QXVkaW9EZXZpY2VzQ29tbWFuZChkZXZpY2VzLCBFRkZFQ1RfQ01EX1NFVF9ERVZJQ0UpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6c2V0SW5wdXREZXZpY2UoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKQoreworICAgIHJldHVybiBzZW5kU2V0QXVkaW9EZXZpY2VzQ29tbWFuZCh7ZGV2aWNlfSwgRUZGRUNUX0NNRF9TRVRfSU5QVVRfREVWSUNFKTsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnNldE1vZGUoYXVkaW9fbW9kZV90IG1vZGUpCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKQEAgLTEyMzEsMzMgKzE0NzksNiBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnNldFN1c3BlbmRlZChib29sIHN1c3BlbmRlZCkKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIG1TdXNwZW5kZWQgPSBzdXNwZW5kZWQ7Ci19Ci0KLWJvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OnN1c3BlbmRlZCgpIGNvbnN0Ci17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICByZXR1cm4gbVN1c3BlbmRlZDsKLX0KLQotYm9vbCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6cHVyZ2VIYW5kbGVzKCkKLXsKLSAgICBib29sIGVuYWJsZWQgPSBmYWxzZTsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUhhbmRsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgRWZmZWN0SGFuZGxlICpoYW5kbGUgPSBtSGFuZGxlc1tpXTsKLSAgICAgICAgaWYgKGhhbmRsZSAhPSBOVUxMICYmICFoYW5kbGUtPmRpc2Nvbm5lY3RlZCgpKSB7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlLT5oYXNDb250cm9sKCkpIHsKLSAgICAgICAgICAgICAgICBlbmFibGVkID0gaGFuZGxlLT5lbmFibGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGVuYWJsZWQ7Ci19Ci0KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlOjpzZXRPZmZsb2FkZWQoYm9vbCBvZmZsb2FkZWQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC0xMjk3LDExMCArMTUxOCw2IEBACiAgICAgcmV0dXJuIG1PZmZsb2FkZWQ7CiB9CiAKLVN0cmluZzggZWZmZWN0RmxhZ3NUb1N0cmluZyh1aW50MzJfdCBmbGFncykgewotICAgIFN0cmluZzggczsKLQotICAgIHMuYXBwZW5kKCJjb25uLiBtb2RlOiAiKTsKLSAgICBzd2l0Y2ggKGZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSB7Ci0gICAgY2FzZSBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVDogcy5hcHBlbmQoImluc2VydCIpOyBicmVhazsKLSAgICBjYXNlIEVGRkVDVF9GTEFHX1RZUEVfQVVYSUxJQVJZOiBzLmFwcGVuZCgiYXV4aWxpYXJ5Iik7IGJyZWFrOwotICAgIGNhc2UgRUZGRUNUX0ZMQUdfVFlQRV9SRVBMQUNFOiBzLmFwcGVuZCgicmVwbGFjZSIpOyBicmVhazsKLSAgICBjYXNlIEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0M6IHMuYXBwZW5kKCJwcmVwcm9jIik7IGJyZWFrOwotICAgIGNhc2UgRUZGRUNUX0ZMQUdfVFlQRV9QT1NUX1BST0M6IHMuYXBwZW5kKCJwb3N0cHJvYyIpOyBicmVhazsKLSAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKLSAgICB9Ci0gICAgcy5hcHBlbmQoIiwgIik7Ci0KLSAgICBzLmFwcGVuZCgiaW5zZXJ0IHByZWY6ICIpOwotICAgIHN3aXRjaCAoZmxhZ3MgJiBFRkZFQ1RfRkxBR19JTlNFUlRfTUFTSykgewotICAgIGNhc2UgRUZGRUNUX0ZMQUdfSU5TRVJUX0FOWTogcy5hcHBlbmQoImFueSIpOyBicmVhazsKLSAgICBjYXNlIEVGRkVDVF9GTEFHX0lOU0VSVF9GSVJTVDogcy5hcHBlbmQoImZpcnN0Iik7IGJyZWFrOwotICAgIGNhc2UgRUZGRUNUX0ZMQUdfSU5TRVJUX0xBU1Q6IHMuYXBwZW5kKCJsYXN0Iik7IGJyZWFrOwotICAgIGNhc2UgRUZGRUNUX0ZMQUdfSU5TRVJUX0VYQ0xVU0lWRTogcy5hcHBlbmQoImV4Y2x1c2l2ZSIpOyBicmVhazsKLSAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKLSAgICB9Ci0gICAgcy5hcHBlbmQoIiwgIik7Ci0KLSAgICBzLmFwcGVuZCgidm9sdW1lIG1nbXQ6ICIpOwotICAgIHN3aXRjaCAoZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykgewotICAgIGNhc2UgRUZGRUNUX0ZMQUdfVk9MVU1FX05PTkU6IHMuYXBwZW5kKCJub25lIik7IGJyZWFrOwotICAgIGNhc2UgRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkw6IHMuYXBwZW5kKCJpbXBsZW1lbnRzIGNvbnRyb2wiKTsgYnJlYWs7Ci0gICAgY2FzZSBFRkZFQ1RfRkxBR19WT0xVTUVfSU5EOiBzLmFwcGVuZCgicmVxdWlyZXMgaW5kaWNhdGlvbiIpOyBicmVhazsKLSAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKLSAgICB9Ci0gICAgcy5hcHBlbmQoIiwgIik7Ci0KLSAgICB1aW50MzJfdCBkZXZpbmQgPSBmbGFncyAmIEVGRkVDVF9GTEFHX0RFVklDRV9NQVNLOwotICAgIGlmIChkZXZpbmQpIHsKLSAgICAgICAgcy5hcHBlbmQoImRldmljZSBpbmRpY2F0aW9uOiAiKTsKLSAgICAgICAgc3dpdGNoIChkZXZpbmQpIHsKLSAgICAgICAgY2FzZSBFRkZFQ1RfRkxBR19ERVZJQ0VfSU5EOiBzLmFwcGVuZCgicmVxdWlyZXMgdXBkYXRlcyIpOyBicmVhazsKLSAgICAgICAgZGVmYXVsdDogcy5hcHBlbmQoInVua25vd24vcmVzZXJ2ZWQiKTsgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcy5hcHBlbmQoIiwgIik7Ci0gICAgfQotCi0gICAgcy5hcHBlbmQoImlucHV0IG1vZGU6ICIpOwotICAgIHN3aXRjaCAoZmxhZ3MgJiBFRkZFQ1RfRkxBR19JTlBVVF9NQVNLKSB7Ci0gICAgY2FzZSBFRkZFQ1RfRkxBR19JTlBVVF9ESVJFQ1Q6IHMuYXBwZW5kKCJkaXJlY3QiKTsgYnJlYWs7Ci0gICAgY2FzZSBFRkZFQ1RfRkxBR19JTlBVVF9QUk9WSURFUjogcy5hcHBlbmQoInByb3ZpZGVyIik7IGJyZWFrOwotICAgIGNhc2UgRUZGRUNUX0ZMQUdfSU5QVVRfQk9USDogcy5hcHBlbmQoImRpcmVjdCtwcm92aWRlciIpOyBicmVhazsKLSAgICBkZWZhdWx0OiBzLmFwcGVuZCgibm90IHNldCIpOyBicmVhazsKLSAgICB9Ci0gICAgcy5hcHBlbmQoIiwgIik7Ci0KLSAgICBzLmFwcGVuZCgib3V0cHV0IG1vZGU6ICIpOwotICAgIHN3aXRjaCAoZmxhZ3MgJiBFRkZFQ1RfRkxBR19PVVRQVVRfTUFTSykgewotICAgIGNhc2UgRUZGRUNUX0ZMQUdfT1VUUFVUX0RJUkVDVDogcy5hcHBlbmQoImRpcmVjdCIpOyBicmVhazsKLSAgICBjYXNlIEVGRkVDVF9GTEFHX09VVFBVVF9QUk9WSURFUjogcy5hcHBlbmQoInByb3ZpZGVyIik7IGJyZWFrOwotICAgIGNhc2UgRUZGRUNUX0ZMQUdfT1VUUFVUX0JPVEg6IHMuYXBwZW5kKCJkaXJlY3QrcHJvdmlkZXIiKTsgYnJlYWs7Ci0gICAgZGVmYXVsdDogcy5hcHBlbmQoIm5vdCBzZXQiKTsgYnJlYWs7Ci0gICAgfQotICAgIHMuYXBwZW5kKCIsICIpOwotCi0gICAgdWludDMyX3QgYWNjZWwgPSBmbGFncyAmIEVGRkVDVF9GTEFHX0hXX0FDQ19NQVNLOwotICAgIGlmIChhY2NlbCkgewotICAgICAgICBzLmFwcGVuZCgiaGFyZHdhcmUgYWNjZWxlcmF0aW9uOiAiKTsKLSAgICAgICAgc3dpdGNoIChhY2NlbCkgewotICAgICAgICBjYXNlIEVGRkVDVF9GTEFHX0hXX0FDQ19TSU1QTEU6IHMuYXBwZW5kKCJub24tdHVubmVsZWQiKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgRUZGRUNUX0ZMQUdfSFdfQUNDX1RVTk5FTDogcy5hcHBlbmQoInR1bm5lbGVkIik7IGJyZWFrOwotICAgICAgICBkZWZhdWx0OiBzLmFwcGVuZCgidW5rbm93bi9yZXNlcnZlZCIpOyBicmVhazsKLSAgICAgICAgfQotICAgICAgICBzLmFwcGVuZCgiLCAiKTsKLSAgICB9Ci0KLSAgICB1aW50MzJfdCBtb2RlaW5kID0gZmxhZ3MgJiBFRkZFQ1RfRkxBR19BVURJT19NT0RFX01BU0s7Ci0gICAgaWYgKG1vZGVpbmQpIHsKLSAgICAgICAgcy5hcHBlbmQoIm1vZGUgaW5kaWNhdGlvbjogIik7Ci0gICAgICAgIHN3aXRjaCAobW9kZWluZCkgewotICAgICAgICBjYXNlIEVGRkVDVF9GTEFHX0FVRElPX01PREVfSU5EOiBzLmFwcGVuZCgicmVxdWlyZWQiKTsgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6IHMuYXBwZW5kKCJ1bmtub3duL3Jlc2VydmVkIik7IGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHMuYXBwZW5kKCIsICIpOwotICAgIH0KLQotICAgIHVpbnQzMl90IHNyY2luZCA9IGZsYWdzICYgRUZGRUNUX0ZMQUdfQVVESU9fU09VUkNFX01BU0s7Ci0gICAgaWYgKHNyY2luZCkgewotICAgICAgICBzLmFwcGVuZCgic291cmNlIGluZGljYXRpb246ICIpOwotICAgICAgICBzd2l0Y2ggKHNyY2luZCkgewotICAgICAgICBjYXNlIEVGRkVDVF9GTEFHX0FVRElPX1NPVVJDRV9JTkQ6IHMuYXBwZW5kKCJyZXF1aXJlZCIpOyBicmVhazsKLSAgICAgICAgZGVmYXVsdDogcy5hcHBlbmQoInVua25vd24vcmVzZXJ2ZWQiKTsgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgcy5hcHBlbmQoIiwgIik7Ci0gICAgfQotCi0gICAgaWYgKGZsYWdzICYgRUZGRUNUX0ZMQUdfT0ZGTE9BRF9NQVNLKSB7Ci0gICAgICAgIHMuYXBwZW5kKCJvZmZsb2FkYWJsZSwgIik7Ci0gICAgfQotCi0gICAgaW50IGxlbiA9IHMubGVuZ3RoKCk7Ci0gICAgaWYgKHMubGVuZ3RoKCkgPiAyKSB7Ci0gICAgICAgICh2b2lkKSBzLmxvY2tCdWZmZXIobGVuKTsKLSAgICAgICAgcy51bmxvY2tCdWZmZXIobGVuIC0gMik7Ci0gICAgfQotICAgIHJldHVybiBzOwotfQotCiBzdGF0aWMgc3RkOjpzdHJpbmcgZHVtcEluT3V0QnVmZmVyKGJvb2wgaXNJbnB1dCwgY29uc3Qgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiAmYnVmZmVyKSB7CiAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CiAKQEAgLTE0MTYsMzcgKzE1MzMsMTYgQEAKICAgICByZXR1cm4gc3Muc3RyKCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQordm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdE1vZHVsZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7CisgICAgRWZmZWN0QmFzZTo6ZHVtcChmZCwgYXJncyk7CisKICAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlx0RWZmZWN0IElEICVkOlxuIiwgbUlkKTsKLQogICAgIGJvb2wgbG9ja2VkID0gQXVkaW9GbGluZ2VyOjpkdW1wVHJ5TG9jayhtTG9jayk7Ci0gICAgLy8gZmFpbGVkIHRvIGxvY2sgLSBBdWRpb0ZsaW5nZXIgaXMgcHJvYmFibHkgZGVhZGxvY2tlZAotICAgIGlmICghbG9ja2VkKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRDb3VsZCBub3QgbG9jayBGeCBtdXRleDpcbiIpOwotICAgIH0KIAotICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRTZXNzaW9uIFN0YXR1cyBTdGF0ZSBFbmdpbmU6XG4iKTsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJcdFx0JTA1ZCAgICUwM2QgICAgJTAzZCAgICVwXG4iLAotICAgICAgICAgICAgbVNlc3Npb25JZCwgbVN0YXR1cywgbVN0YXRlLCBtRWZmZWN0SW50ZXJmYWNlLmdldCgpKTsKLQotICAgIHJlc3VsdC5hcHBlbmQoIlx0XHREZXNjcmlwdG9yOlxuIik7Ci0gICAgY2hhciB1dWlkU3RyWzY0XTsKLSAgICBBdWRpb0VmZmVjdDo6Z3VpZFRvU3RyaW5nKCZtRGVzY3JpcHRvci51dWlkLCB1dWlkU3RyLCBzaXplb2YodXVpZFN0cikpOwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlx0XHQtIFVVSUQ6ICVzXG4iLCB1dWlkU3RyKTsKLSAgICBBdWRpb0VmZmVjdDo6Z3VpZFRvU3RyaW5nKCZtRGVzY3JpcHRvci50eXBlLCB1dWlkU3RyLCBzaXplb2YodXVpZFN0cikpOwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlx0XHQtIFRZUEU6ICVzXG4iLCB1dWlkU3RyKTsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJcdFx0LSBhcGlWZXJzaW9uOiAlMDhYXG5cdFx0LSBmbGFnczogJTA4WCAoJXMpXG4iLAotICAgICAgICAgICAgbURlc2NyaXB0b3IuYXBpVmVyc2lvbiwKLSAgICAgICAgICAgIG1EZXNjcmlwdG9yLmZsYWdzLAotICAgICAgICAgICAgZWZmZWN0RmxhZ3NUb1N0cmluZyhtRGVzY3JpcHRvci5mbGFncykuc3RyaW5nKCkpOwotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIlx0XHQtIG5hbWU6ICVzXG4iLAotICAgICAgICAgICAgbURlc2NyaXB0b3IubmFtZSk7Ci0KLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJcdFx0LSBpbXBsZW1lbnRvcjogJXNcbiIsCi0gICAgICAgICAgICBtRGVzY3JpcHRvci5pbXBsZW1lbnRvcik7CisgICAgcmVzdWx0LmFwcGVuZCgiXHRcdFN0YXR1cyBFbmdpbmU6XG4iKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJcdFx0JTAzZCAgICAlcFxuIiwKKyAgICAgICAgICAgIG1TdGF0dXMsIG1FZmZlY3RJbnRlcmZhY2UuZ2V0KCkpOwogCiAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiXHRcdC0gZGF0YTogJXNcbiIsIG1TdXBwb3J0c0Zsb2F0ID8gImZsb2F0IiA6ICJpbnQxNiIpOwogCkBAIC0xNDgwLDE5ICsxNTc2LDEzIEBACiAgICAgICAgICAgICBkdW1wSW5PdXRCdWZmZXIoZmFsc2UgLyogaXNJbnB1dCAqLywgbU91dENvbnZlcnNpb25CdWZmZXIpLmNfc3RyKCkpOwogI2VuZGlmCiAKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJcdFx0JXp1IENsaWVudHM6XG4iLCBtSGFuZGxlcy5zaXplKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIlx0XHRcdCAgUGlkIFByaW9yaXR5IEN0cmwgTG9ja2VkIGNsaWVudCBzZXJ2ZXJcbiIpOwotICAgIGNoYXIgYnVmZmVyWzI1Nl07Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSGFuZGxlcy5zaXplKCk7ICsraSkgewotICAgICAgICBFZmZlY3RIYW5kbGUgKmhhbmRsZSA9IG1IYW5kbGVzW2ldOwotICAgICAgICBpZiAoaGFuZGxlICE9IE5VTEwgJiYgIWhhbmRsZS0+ZGlzY29ubmVjdGVkKCkpIHsKLSAgICAgICAgICAgIGhhbmRsZS0+ZHVtcFRvQnVmZmVyKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICB9Ci0gICAgfQotCiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0Lmxlbmd0aCgpKTsKIAorICAgIGlmIChtRWZmZWN0SW50ZXJmYWNlICE9IDApIHsKKyAgICAgICAgZHByaW50ZihmZCwgIlx0RWZmZWN0IElEICVkIEhBTCBkdW1wOlxuIiwgbUlkKTsKKyAgICAgICAgKHZvaWQpbUVmZmVjdEludGVyZmFjZS0+ZHVtcChmZCk7CisgICAgfQorCiAgICAgaWYgKGxvY2tlZCkgewogICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICB9CkBAIC0xNTA1LDcgKzE1OTUsNyBAQAogI3VuZGVmIExPR19UQUcKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGUiCiAKLUF1ZGlvRmxpbmdlcjo6RWZmZWN0SGFuZGxlOjpFZmZlY3RIYW5kbGUoY29uc3Qgc3A8RWZmZWN0TW9kdWxlPiYgZWZmZWN0LAorQXVkaW9GbGluZ2VyOjpFZmZlY3RIYW5kbGU6OkVmZmVjdEhhbmRsZShjb25zdCBzcDxFZmZlY3RCYXNlPiYgZWZmZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvRmxpbmdlcjo6Q2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBlZmZlY3RDbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSkKQEAgLTE1MTMsNyArMTYwMyw3IEBACiAgICAgbUVmZmVjdChlZmZlY3QpLCBtRWZmZWN0Q2xpZW50KGVmZmVjdENsaWVudCksIG1DbGllbnQoY2xpZW50KSwgbUNibGsoTlVMTCksCiAgICAgbVByaW9yaXR5KHByaW9yaXR5KSwgbUhhc0NvbnRyb2woZmFsc2UpLCBtRW5hYmxlZChmYWxzZSksIG1EaXNjb25uZWN0ZWQoZmFsc2UpCiB7Ci0gICAgQUxPR1YoImNvbnN0cnVjdG9yICVwIiwgdGhpcyk7CisgICAgQUxPR1YoImNvbnN0cnVjdG9yICVwIGNsaWVudCAlcCIsIHRoaXMsIGNsaWVudC5nZXQoKSk7CiAKICAgICBpZiAoY2xpZW50ID09IDApIHsKICAgICAgICAgcmV0dXJuOwpAQCAtMTU0Niw3ICsxNjM2LDcgQEAKIHsKICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwogICAgIEFMT0dWKCJlbmFibGUgJXAiLCB0aGlzKTsKLSAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdCA9IG1FZmZlY3QucHJvbW90ZSgpOworICAgIHNwPEVmZmVjdEJhc2U+IGVmZmVjdCA9IG1FZmZlY3QucHJvbW90ZSgpOwogICAgIGlmIChlZmZlY3QgPT0gMCB8fCBtRGlzY29ubmVjdGVkKSB7CiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9CkBAIC0xNTYwLDM4ICsxNjUwLDIyIEBACiAKICAgICBtRW5hYmxlZCA9IHRydWU7CiAKLSAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBlZmZlY3QtPnRocmVhZCgpLnByb21vdGUoKTsKLSAgICBpZiAodGhyZWFkICE9IDApIHsKLSAgICAgICAgdGhyZWFkLT5jaGVja1N1c3BlbmRPbkVmZmVjdEVuYWJsZWQoZWZmZWN0LCB0cnVlLCBlZmZlY3QtPnNlc3Npb25JZCgpKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBlZmZlY3QtPnVwZGF0ZVBvbGljeVN0YXRlKCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBtRW5hYmxlZCA9IGZhbHNlOworICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAorICAgIGVmZmVjdC0+Y2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKHRydWUsIGZhbHNlIC8qdGhyZWFkTG9ja2VkKi8pOworCiAgICAgLy8gY2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKCkgY2FuIHN1c3BlbmQgdGhpcyBzYW1lIGVmZmVjdCB3aGVuIGVuYWJsZWQKICAgICBpZiAoZWZmZWN0LT5zdXNwZW5kZWQoKSkgewogICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgfQogCi0gICAgc3RhdHVzX3Qgc3RhdHVzID0gZWZmZWN0LT5zZXRFbmFibGVkKHRydWUpOworICAgIHN0YXR1cyA9IGVmZmVjdC0+c2V0RW5hYmxlZCh0cnVlLCB0cnVlIC8qZnJvbUhhbmRsZSovKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIGlmICh0aHJlYWQgIT0gMCkgewotICAgICAgICAgICAgdGhyZWFkLT5jaGVja1N1c3BlbmRPbkVmZmVjdEVuYWJsZWQoZWZmZWN0LCBmYWxzZSwgZWZmZWN0LT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgIH0KICAgICAgICAgbUVuYWJsZWQgPSBmYWxzZTsKLSAgICB9IGVsc2UgewotICAgICAgICBpZiAodGhyZWFkICE9IDApIHsKLSAgICAgICAgICAgIGlmICh0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpPRkZMT0FEIHx8IHRocmVhZC0+dHlwZSgpID09IFRocmVhZEJhc2U6Ok1NQVApIHsKLSAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7Ci0gICAgICAgICAgICAgICAgdGhyZWFkLT5icm9hZGNhc3RfbCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFlZmZlY3QtPmlzT2ZmbG9hZGFibGUoKSkgewotICAgICAgICAgICAgICAgIGlmICh0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpPRkZMT0FEKSB7Ci0gICAgICAgICAgICAgICAgICAgIFBsYXliYWNrVGhyZWFkICp0ID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOwotICAgICAgICAgICAgICAgICAgICB0LT5pbnZhbGlkYXRlVHJhY2tzKEFVRElPX1NUUkVBTV9NVVNJQyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChlZmZlY3QtPnNlc3Npb25JZCgpID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgewotICAgICAgICAgICAgICAgICAgICB0aHJlYWQtPm1BdWRpb0ZsaW5nZXItPm9uTm9uT2ZmbG9hZGFibGVHbG9iYWxFZmZlY3RFbmFibGUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTE2MDAsNyArMTY3NCw3IEBACiB7CiAgICAgQUxPR1YoImRpc2FibGUgJXAiLCB0aGlzKTsKICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gbUVmZmVjdC5wcm9tb3RlKCk7CisgICAgc3A8RWZmZWN0QmFzZT4gZWZmZWN0ID0gbUVmZmVjdC5wcm9tb3RlKCk7CiAgICAgaWYgKGVmZmVjdCA9PSAwIHx8IG1EaXNjb25uZWN0ZWQpIHsKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KQEAgLTE2MTMsMjEgKzE2ODcsMTMgQEAKICAgICB9CiAgICAgbUVuYWJsZWQgPSBmYWxzZTsKIAorICAgIGVmZmVjdC0+dXBkYXRlUG9saWN5U3RhdGUoKTsKKwogICAgIGlmIChlZmZlY3QtPnN1c3BlbmRlZCgpKSB7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBlZmZlY3QtPnNldEVuYWJsZWQoZmFsc2UpOwotCi0gICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gZWZmZWN0LT50aHJlYWQoKS5wcm9tb3RlKCk7Ci0gICAgaWYgKHRocmVhZCAhPSAwKSB7Ci0gICAgICAgIHRocmVhZC0+Y2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKGVmZmVjdCwgZmFsc2UsIGVmZmVjdC0+c2Vzc2lvbklkKCkpOwotICAgICAgICBpZiAodGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6T0ZGTE9BRCB8fCB0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpNTUFQKSB7Ci0gICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7Ci0gICAgICAgICAgICB0aHJlYWQtPmJyb2FkY2FzdF9sKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBlZmZlY3QtPnNldEVuYWJsZWQoZmFsc2UsIHRydWUgLypmcm9tSGFuZGxlKi8pOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKQEAgLTE2NDgsMjAgKzE3MTQsMTQgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBtRGlzY29ubmVjdGVkID0gdHJ1ZTsKLSAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQ7CiAgICAgewotICAgICAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdCA9IG1FZmZlY3QucHJvbW90ZSgpOworICAgICAgICBzcDxFZmZlY3RCYXNlPiBlZmZlY3QgPSBtRWZmZWN0LnByb21vdGUoKTsKICAgICAgICAgaWYgKGVmZmVjdCAhPSAwKSB7Ci0gICAgICAgICAgICB0aHJlYWQgPSBlZmZlY3QtPnRocmVhZCgpLnByb21vdGUoKTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAodGhyZWFkICE9IDApIHsKLSAgICAgICAgdGhyZWFkLT5kaXNjb25uZWN0RWZmZWN0SGFuZGxlKHRoaXMsIHVucGluSWZMYXN0KTsKLSAgICB9IGVsc2UgewotICAgICAgICAvLyB0cnkgdG8gY2xlYW51cCBhcyBtdWNoIGFzIHdlIGNhbgotICAgICAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdCA9IG1FZmZlY3QucHJvbW90ZSgpOwotICAgICAgICBpZiAoZWZmZWN0ICE9IDAgJiYgZWZmZWN0LT5kaXNjb25uZWN0SGFuZGxlKHRoaXMsIHVucGluSWZMYXN0KSA+IDApIHsKLSAgICAgICAgICAgIEFMT0dXKCIlcyBFZmZlY3QgaGFuZGxlICVwIGRpc2Nvbm5lY3RlZCBhZnRlciB0aHJlYWQgZGVzdHJ1Y3Rpb24iLCBfX0ZVTkNUSU9OX18sIHRoaXMpOworICAgICAgICAgICAgaWYgKGVmZmVjdC0+ZGlzY29ubmVjdEhhbmRsZSh0aGlzLCB1bnBpbklmTGFzdCkgPiAwKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzIEVmZmVjdCBoYW5kbGUgJXAgZGlzY29ubmVjdGVkIGFmdGVyIHRocmVhZCBkZXN0cnVjdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB0aGlzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVmZmVjdC0+dXBkYXRlUG9saWN5U3RhdGUoKTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMTcyMyw3ICsxNzgzLDcgQEAKICAgICB9CiAKICAgICBBdXRvTXV0ZXggX2wobUxvY2spOwotICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gbUVmZmVjdC5wcm9tb3RlKCk7CisgICAgc3A8RWZmZWN0QmFzZT4gZWZmZWN0ID0gbUVmZmVjdC5wcm9tb3RlKCk7CiAgICAgaWYgKGVmZmVjdCA9PSAwIHx8IG1EaXNjb25uZWN0ZWQpIHsKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KQEAgLTE3MzEsMTIgKzE3OTEsMTMgQEAKICAgICBpZiAoIW1IYXNDb250cm9sICYmIGNtZENvZGUgIT0gRUZGRUNUX0NNRF9HRVRfUEFSQU0pIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KLSAgICBpZiAobUNsaWVudCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9CiAKICAgICAvLyBoYW5kbGUgY29tbWFuZHMgdGhhdCBhcmUgbm90IGZvcndhcmRlZCB0cmFuc3BhcmVudGx5IHRvIGVmZmVjdCBlbmdpbmUKICAgICBpZiAoY21kQ29kZSA9PSBFRkZFQ1RfQ01EX1NFVF9QQVJBTV9DT01NSVQpIHsKKyAgICAgICAgaWYgKG1DbGllbnQgPT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisKICAgICAgICAgaWYgKCpyZXBseVNpemUgPCBzaXplb2YoaW50KSkgewogICAgICAgICAgICAgYW5kcm9pZF9lcnJvcldyaXRlTG9nKDB4NTM0ZTQ1NTQsICIzMjA5NTcxMyIpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTE3NzEsMTIgKzE4MzIsMTMgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gY29weSB0byBsb2NhbCBtZW1vcnkgaW4gY2FzZSBvZiBjbGllbnQgY29ycnVwdGlvbiBiLzMyMjIwNzY5Ci0gICAgICAgICAgICBwYXJhbSA9IChlZmZlY3RfcGFyYW1fdCAqKXJlYWxsb2MocGFyYW0sIHNpemUpOwotICAgICAgICAgICAgaWYgKHBhcmFtID09IE5VTEwpIHsKKyAgICAgICAgICAgIGF1dG8gKm5ld1BhcmFtID0gKGVmZmVjdF9wYXJhbV90ICopcmVhbGxvYyhwYXJhbSwgc2l6ZSk7CisgICAgICAgICAgICBpZiAobmV3UGFyYW0gPT0gTlVMTCkgewogICAgICAgICAgICAgICAgIEFMT0dXKCJjb21tYW5kKCk6IG91dCBvZiBtZW1vcnkiKTsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBOT19NRU1PUlk7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBwYXJhbSA9IG5ld1BhcmFtOwogICAgICAgICAgICAgbWVtY3B5KHBhcmFtLCBwLCBzaXplKTsKIAogICAgICAgICAgICAgaW50IHJlcGx5ID0gMDsKQEAgLTE4NTksNyArMTkyMSw3IEBACiAgICAgYm9vbCBsb2NrZWQgPSBtQ2JsayAhPSBOVUxMICYmIEF1ZGlvRmxpbmdlcjo6ZHVtcFRyeUxvY2sobUNibGstPmxvY2spOwogCiAgICAgc25wcmludGYoYnVmZmVyLCBzaXplLCAiXHRcdFx0JTVkICAgICU1ZCAgJTNzICAgICUzcyAgJTV1ICAlNXVcbiIsCi0gICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZF9jYWNoZWQgOiBtQ2xpZW50LT5waWQoKSwKKyAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkKCkgOiBtQ2xpZW50LT5waWQoKSwKICAgICAgICAgICAgIG1Qcmlvcml0eSwKICAgICAgICAgICAgIG1IYXNDb250cm9sID8gInllcyIgOiAibm8iLAogICAgICAgICAgICAgbG9ja2VkID8gInllcyIgOiAibm8iLApAQCAtMTg3NywxMiArMTkzOSwxMyBAQAogCiBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDaGFpbihUaHJlYWRCYXNlICp0aHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkKLSAgICA6IG1UaHJlYWQodGhyZWFkKSwgbVNlc3Npb25JZChzZXNzaW9uSWQpLCBtQWN0aXZlVHJhY2tDbnQoMCksIG1UcmFja0NudCgwKSwgbVRhaWxCdWZmZXJDb3VudCgwKSwKKyAgICA6IG1TZXNzaW9uSWQoc2Vzc2lvbklkKSwgbUFjdGl2ZVRyYWNrQ250KDApLCBtVHJhY2tDbnQoMCksIG1UYWlsQnVmZmVyQ291bnQoMCksCiAgICAgICBtVm9sdW1lQ3RybElkeCgtMSksIG1MZWZ0Vm9sdW1lKFVJTlRfTUFYKSwgbVJpZ2h0Vm9sdW1lKFVJTlRfTUFYKSwKLSAgICAgIG1OZXdMZWZ0Vm9sdW1lKFVJTlRfTUFYKSwgbU5ld1JpZ2h0Vm9sdW1lKFVJTlRfTUFYKQorICAgICAgbU5ld0xlZnRWb2x1bWUoVUlOVF9NQVgpLCBtTmV3UmlnaHRWb2x1bWUoVUlOVF9NQVgpLAorICAgICAgbUVmZmVjdENhbGxiYWNrKG5ldyBFZmZlY3RDYWxsYmFjayh0aGlzLCB0aHJlYWQsIHRocmVhZC0+bUF1ZGlvRmxpbmdlci5nZXQoKSkpCiB7CiAgICAgbVN0cmF0ZWd5ID0gQXVkaW9TeXN0ZW06OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKEFVRElPX1NUUkVBTV9NVVNJQyk7Ci0gICAgaWYgKHRocmVhZCA9PSBOVUxMKSB7CisgICAgaWYgKHRocmVhZCA9PSBudWxscHRyKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgbU1heFRhaWxCdWZmZXJzID0gKChrUHJvY2Vzc1RhaWxEdXJhdGlvbk1zICogdGhyZWFkLT5zYW1wbGVSYXRlKCkpIC8gMTAwMCkgLwpAQCAtMTkzNSw0NiArMTk5OCw0MyBAQAogICAgIHJldHVybiAwOwogfQogCitzdGQ6OnZlY3RvcjxpbnQ+IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OmdldEVmZmVjdElkcygpCit7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBpZHM7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlkcy5wdXNoX2JhY2sobUVmZmVjdHNbaV0tPmlkKCkpOworICAgIH0KKyAgICByZXR1cm4gaWRzOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OmNsZWFySW5wdXRCdWZmZXIoKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7Ci0gICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJjbGVhcklucHV0QnVmZmVyKCk6IGNhbm5vdCBwcm9tb3RlIG1peGVyIHRocmVhZCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGNsZWFySW5wdXRCdWZmZXJfbCh0aHJlYWQpOworICAgIGNsZWFySW5wdXRCdWZmZXJfbCgpOwogfQogCiAvLyBNdXN0IGJlIGNhbGxlZCB3aXRoIEVmZmVjdENoYWluOjptTG9jayBsb2NrZWQKLXZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6Y2xlYXJJbnB1dEJ1ZmZlcl9sKGNvbnN0IHNwPFRocmVhZEJhc2U+JiB0aHJlYWQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OmNsZWFySW5wdXRCdWZmZXJfbCgpCiB7CiAgICAgaWYgKG1JbkJ1ZmZlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgY29uc3Qgc2l6ZV90IGZyYW1lU2l6ZSA9Ci0gICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKEVGRkVDVF9CVUZGRVJfRk9STUFUKSAqIHRocmVhZC0+Y2hhbm5lbENvdW50KCk7CisgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKEVGRkVDVF9CVUZGRVJfRk9STUFUKSAqIG1FZmZlY3RDYWxsYmFjay0+Y2hhbm5lbENvdW50KCk7CiAKLSAgICBtZW1zZXQobUluQnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5yYXcsIDAsIHRocmVhZC0+ZnJhbWVDb3VudCgpICogZnJhbWVTaXplKTsKKyAgICBtZW1zZXQobUluQnVmZmVyLT5hdWRpb0J1ZmZlcigpLT5yYXcsIDAsIG1FZmZlY3RDYWxsYmFjay0+ZnJhbWVDb3VudCgpICogZnJhbWVTaXplKTsKICAgICBtSW5CdWZmZXItPmNvbW1pdCgpOwogfQogCiAvLyBNdXN0IGJlIGNhbGxlZCB3aXRoIEVmZmVjdENoYWluOjptTG9jayBsb2NrZWQKIHZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6cHJvY2Vzc19sKCkKIHsKLSAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKLSAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgQUxPR1coInByb2Nlc3NfbCgpOiBjYW5ub3QgcHJvbW90ZSBtaXhlciB0aHJlYWQiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBib29sIGlzR2xvYmFsU2Vzc2lvbiA9IChtU2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgfHwKLSAgICAgICAgICAgIChtU2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFKTsKICAgICAvLyBuZXZlciBwcm9jZXNzIGVmZmVjdHMgd2hlbjoKICAgICAvLyAtIG9uIGFuIE9GRkxPQUQgdGhyZWFkCiAgICAgLy8gLSBubyBtb3JlIHRyYWNrcyBhcmUgb24gdGhlIHNlc3Npb24gYW5kIHRoZSBlZmZlY3QgdGFpbCBoYXMgYmVlbiByZW5kZXJlZAotICAgIGJvb2wgZG9Qcm9jZXNzID0gKHRocmVhZC0+dHlwZSgpICE9IFRocmVhZEJhc2U6Ok9GRkxPQUQpCi0gICAgICAgICAgICAgICAgICAmJiAodGhyZWFkLT50eXBlKCkgIT0gVGhyZWFkQmFzZTo6TU1BUCk7Ci0gICAgaWYgKCFpc0dsb2JhbFNlc3Npb24pIHsKKyAgICBib29sIGRvUHJvY2VzcyA9ICFtRWZmZWN0Q2FsbGJhY2stPmlzT2ZmbG9hZE9yTW1hcCgpOworICAgIGlmICghYXVkaW9faXNfZ2xvYmFsX3Nlc3Npb24obVNlc3Npb25JZCkpIHsKICAgICAgICAgYm9vbCB0cmFja3NPblNlc3Npb24gPSAodHJhY2tDbnQoKSAhPSAwKTsKIAogICAgICAgICBpZiAoIXRyYWNrc09uU2Vzc2lvbiAmJiBtVGFpbEJ1ZmZlckNvdW50ID09IDApIHsKQEAgLTE5ODUsNyArMjA0NSw3IEBACiAgICAgICAgICAgICAvLyBpZiBubyB0cmFjayBpcyBhY3RpdmUgYW5kIHRoZSBlZmZlY3QgdGFpbCBoYXMgbm90IGJlZW4gcmVuZGVyZWQsCiAgICAgICAgICAgICAvLyB0aGUgaW5wdXQgYnVmZmVyIG11c3QgYmUgY2xlYXJlZCBoZXJlIGFzIHRoZSBtaXhlciBwcm9jZXNzIHdpbGwgbm90IGRvIGl0CiAgICAgICAgICAgICBpZiAodHJhY2tzT25TZXNzaW9uIHx8IG1UYWlsQnVmZmVyQ291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgY2xlYXJJbnB1dEJ1ZmZlcl9sKHRocmVhZCk7CisgICAgICAgICAgICAgICAgY2xlYXJJbnB1dEJ1ZmZlcl9sKCk7CiAgICAgICAgICAgICAgICAgaWYgKG1UYWlsQnVmZmVyQ291bnQgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgIG1UYWlsQnVmZmVyQ291bnQtLTsKICAgICAgICAgICAgICAgICB9CkBAIC0yMDIxLDE0ICsyMDgxLDEzIEBACiAKIC8vIGNyZWF0ZUVmZmVjdF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpjcmVhdGVFZmZlY3RfbChzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaHJlYWRCYXNlICp0aHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcGlubmVkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgZWZmZWN0ID0gbmV3IEVmZmVjdE1vZHVsZSh0aHJlYWQsIHRoaXMsIGRlc2MsIGlkLCBzZXNzaW9uSWQsIHBpbm5lZCk7CisgICAgZWZmZWN0ID0gbmV3IEVmZmVjdE1vZHVsZShtRWZmZWN0Q2FsbGJhY2ssIGRlc2MsIGlkLCBzZXNzaW9uSWQsIHBpbm5lZCwgQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CiAgICAgc3RhdHVzX3QgbFN0YXR1cyA9IGVmZmVjdC0+c3RhdHVzKCk7CiAgICAgaWYgKGxTdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgbFN0YXR1cyA9IGFkZEVmZmVjdF9sbChlZmZlY3QpOwpAQCAtMjA1MSwxMiArMjExMCw3IEBACiAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCBkZXNjID0gZWZmZWN0LT5kZXNjKCk7CiAgICAgdWludDMyX3QgaW5zZXJ0UHJlZiA9IGRlc2MuZmxhZ3MgJiBFRkZFQ1RfRkxBR19JTlNFUlRfTUFTSzsKIAotICAgIGVmZmVjdC0+c2V0Q2hhaW4odGhpcyk7Ci0gICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7Ci0gICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICBlZmZlY3QtPnNldFRocmVhZCh0aHJlYWQpOworICAgIGVmZmVjdC0+c2V0Q2FsbGJhY2sobUVmZmVjdENhbGxiYWNrKTsKIAogICAgIGlmICgoZGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX1RZUEVfTUFTSykgPT0gRUZGRUNUX0ZMQUdfVFlQRV9BVVhJTElBUlkpIHsKICAgICAgICAgLy8gQXV4aWxpYXJ5IGVmZmVjdHMgYXJlIGluc2VydGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgbUVmZmVjdHMgdmVjdG9yIGFzCkBAIC0yMDY3LDEzICsyMTIxLDEzIEBACiAgICAgICAgIC8vIDMyIGJpdCBmb3JtYXQuIFRoaXMgaXMgdG8gYXZvaWQgc2F0dXJhdGlvbiBpbiBBdWRvTWl4ZXIKICAgICAgICAgLy8gYWNjdW11bGF0aW9uIHN0YWdlLiBTYXR1cmF0aW9uIGlzIGRvbmUgaW4gRWZmZWN0TW9kdWxlOjpwcm9jZXNzKCkgYmVmb3JlCiAgICAgICAgIC8vIGNhbGxpbmcgdGhlIHByb2Nlc3MgaW4gZWZmZWN0IGVuZ2luZQotICAgICAgICBzaXplX3QgbnVtU2FtcGxlcyA9IHRocmVhZC0+ZnJhbWVDb3VudCgpOworICAgICAgICBzaXplX3QgbnVtU2FtcGxlcyA9IG1FZmZlY3RDYWxsYmFjay0+ZnJhbWVDb3VudCgpOwogICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IGhhbEJ1ZmZlcjsKICNpZmRlZiBGTE9BVF9FRkZFQ1RfQ0hBSU4KLSAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gdGhyZWFkLT5tQXVkaW9GbGluZ2VyLT5tRWZmZWN0c0ZhY3RvcnlIYWwtPmFsbG9jYXRlQnVmZmVyKAorICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBtRWZmZWN0Q2FsbGJhY2stPmFsbG9jYXRlSGFsQnVmZmVyKAogICAgICAgICAgICAgICAgIG51bVNhbXBsZXMgKiBzaXplb2YoZmxvYXQpLCAmaGFsQnVmZmVyKTsKICNlbHNlCi0gICAgICAgIHN0YXR1c190IHJlc3VsdCA9IHRocmVhZC0+bUF1ZGlvRmxpbmdlci0+bUVmZmVjdHNGYWN0b3J5SGFsLT5hbGxvY2F0ZUJ1ZmZlcigKKyAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbUVmZmVjdENhbGxiYWNrLT5hbGxvY2F0ZUhhbEJ1ZmZlcigKICAgICAgICAgICAgICAgICBudW1TYW1wbGVzICogc2l6ZW9mKGludDMyX3QpLCAmaGFsQnVmZmVyKTsKICNlbmRpZgogICAgICAgICBpZiAocmVzdWx0ICE9IE9LKSByZXR1cm4gcmVzdWx0OwpAQCAtMjIwNiwxMiArMjI2MCwyMSBAQAogICAgIHJldHVybiBtRWZmZWN0cy5zaXplKCk7CiB9CiAKLS8vIHNldERldmljZV9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi12b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OnNldERldmljZV9sKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCisvLyBzZXREZXZpY2VzX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6c2V0RGV2aWNlc19sKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpCiB7CiAgICAgc2l6ZV90IHNpemUgPSBtRWZmZWN0cy5zaXplKCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgbUVmZmVjdHNbaV0tPnNldERldmljZShkZXZpY2UpOworICAgICAgICBtRWZmZWN0c1tpXS0+c2V0RGV2aWNlcyhkZXZpY2VzKTsKKyAgICB9Cit9CisKKy8vIHNldElucHV0RGV2aWNlX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6c2V0SW5wdXREZXZpY2VfbChjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpCit7CisgICAgc2l6ZV90IHNpemUgPSBtRWZmZWN0cy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgbUVmZmVjdHNbaV0tPnNldElucHV0RGV2aWNlKGRldmljZSk7CiAgICAgfQogfQogCkBAIC0yMjcyLDcgKzIzMzUsNyBAQAogICAgIH0KICAgICAvLyB0aGVuIGluZGljYXRlIHZvbHVtZSB0byBhbGwgb3RoZXIgZWZmZWN0cyBpbiBjaGFpbi4KICAgICAvLyBQYXNzIGFsdGVyZWQgdm9sdW1lIHRvIGVmZmVjdHMgYmVmb3JlIHZvbHVtZSBjb250cm9sbGVyCi0gICAgLy8gYW5kIHJlcXVlc3RlZCB2b2x1bWUgdG8gZWZmZWN0cyBhZnRlciBjb250cm9sbGVyCisgICAgLy8gYW5kIHJlcXVlc3RlZCB2b2x1bWUgdG8gZWZmZWN0cyBhZnRlciBjb250cm9sbGVyIG9yIHdpdGggdm9sdW1lIG1vbml0b3IgZmxhZwogICAgIHVpbnQzMl90IGxWb2wgPSBuZXdMZWZ0OwogICAgIHVpbnQzMl90IHJWb2wgPSBuZXdSaWdodDsKIApAQCAtMjI4NSw3ICsyMzQ4LDEyIEBACiAgICAgICAgICAgICBsVm9sID0gKmxlZnQ7CiAgICAgICAgICAgICByVm9sID0gKnJpZ2h0OwogICAgICAgICB9Ci0gICAgICAgIG1FZmZlY3RzW2ldLT5zZXRWb2x1bWUoJmxWb2wsICZyVm9sLCBmYWxzZSk7CisgICAgICAgIC8vIFBhc3MgcmVxdWVzdGVkIHZvbHVtZSBkaXJlY3RseSBpZiB0aGlzIGlzIHZvbHVtZSBtb25pdG9yIG1vZHVsZQorICAgICAgICBpZiAobUVmZmVjdHNbaV0tPmlzVm9sdW1lTW9uaXRvcigpKSB7CisgICAgICAgICAgICBtRWZmZWN0c1tpXS0+c2V0Vm9sdW1lKGxlZnQsIHJpZ2h0LCBmYWxzZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRWZmZWN0c1tpXS0+c2V0Vm9sdW1lKCZsVm9sLCAmclZvbCwgZmFsc2UpOworICAgICAgICB9CiAgICAgfQogICAgICpsZWZ0ID0gbmV3TGVmdDsKICAgICAqcmlnaHQgPSBuZXdSaWdodDsKQEAgLTIzMTgsMTMgKzIzODYsMTAgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKICAgICBTdHJpbmc4IHJlc3VsdDsKIAotICAgIHNpemVfdCBudW1FZmZlY3RzID0gbUVmZmVjdHMuc2l6ZSgpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAlenUgZWZmZWN0cyBmb3Igc2Vzc2lvbiAlZFxuIiwgbnVtRWZmZWN0cywgbVNlc3Npb25JZCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGNvbnN0IHNpemVfdCBudW1FZmZlY3RzID0gbUVmZmVjdHMuc2l6ZSgpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAgICAlenUgZWZmZWN0cyBmb3Igc2Vzc2lvbiAlZFxuIiwgbnVtRWZmZWN0cywgbVNlc3Npb25JZCk7CiAKICAgICBpZiAobnVtRWZmZWN0cykgewogICAgICAgICBib29sIGxvY2tlZCA9IEF1ZGlvRmxpbmdlcjo6ZHVtcFRyeUxvY2sobUxvY2spOwpAQCAtMjM1Miw2ICsyNDE3LDggQEAKICAgICAgICAgaWYgKGxvY2tlZCkgewogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKICAgICB9CiB9CiAKQEAgLTIzNzgsNyArMjQ0NSw3IEBACiAgICAgICAgICAgICBpZiAoZWZmZWN0ICE9IDApIHsKICAgICAgICAgICAgICAgICBkZXNjLT5tRWZmZWN0ID0gZWZmZWN0OwogICAgICAgICAgICAgICAgIGVmZmVjdC0+c2V0U3VzcGVuZGVkKHRydWUpOwotICAgICAgICAgICAgICAgIGVmZmVjdC0+c2V0RW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgZWZmZWN0LT5zZXRFbmFibGVkKGZhbHNlLCBmYWxzZSAvKmZyb21IYW5kbGUqLyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtMjQ4NCw3ICsyNTUxLDggQEAKICAgICBpZiAoKG1TZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSAmJgogICAgICAgICAoKChkZXNjLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSA9PSBFRkZFQ1RfRkxBR19UWVBFX0FVWElMSUFSWSkgfHwKICAgICAgICAgIChtZW1jbXAoJmRlc2MudHlwZSwgU0xfSUlEX1ZJU1VBTElaQVRJT04sIHNpemVvZihlZmZlY3RfdXVpZF90KSkgPT0gMCkgfHwKLSAgICAgICAgIChtZW1jbXAoJmRlc2MudHlwZSwgU0xfSUlEX1ZPTFVNRSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSkpIHsKKyAgICAgICAgIChtZW1jbXAoJmRlc2MudHlwZSwgU0xfSUlEX1ZPTFVNRSwgc2l6ZW9mKGVmZmVjdF91dWlkX3QpKSA9PSAwKSB8fAorICAgICAgICAgKG1lbWNtcCgmZGVzYy50eXBlLCBTTF9JSURfRFlOQU1JQ1NQUk9DRVNTSU5HLCBzaXplb2YoZWZmZWN0X3V1aWRfdCkpID09IDApKSkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwpAQCAtMjUzNSw3ICsyNjAzLDcgQEAKICAgICAgICAgLy8gaWYgZWZmZWN0IGlzIHJlcXVlc3RlZCB0byBzdXNwZW5kZWQgYnV0IHdhcyBub3QgeWV0IGVuYWJsZWQsIHN1c3BlbmQgaXQgbm93LgogICAgICAgICBpZiAoZGVzYy0+bUVmZmVjdCA9PSAwKSB7CiAgICAgICAgICAgICBkZXNjLT5tRWZmZWN0ID0gZWZmZWN0OwotICAgICAgICAgICAgZWZmZWN0LT5zZXRFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgIGVmZmVjdC0+c2V0RW5hYmxlZChmYWxzZSwgZmFsc2UgLypmcm9tSGFuZGxlKi8pOwogICAgICAgICAgICAgZWZmZWN0LT5zZXRTdXNwZW5kZWQodHJ1ZSk7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtMjU3MCwxMCArMjYzOCw3IEBACiB2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OnNldFRocmVhZChjb25zdCBzcDxUaHJlYWRCYXNlPiYgdGhyZWFkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbVRocmVhZCA9IHRocmVhZDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1FZmZlY3RzW2ldLT5zZXRUaHJlYWQodGhyZWFkKTsKLSAgICB9CisgICAgbUVmZmVjdENhbGxiYWNrLT5zZXRUaHJlYWQodGhyZWFkLmdldCgpKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpjaGVja091dHB1dEZsYWdDb21wYXRpYmlsaXR5KGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncykgY29uc3QKQEAgLTI2MzMsNCArMjY5OCw1NDkgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAorLy8gRWZmZWN0Q2FsbGJhY2tJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24KK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjpjcmVhdGVFZmZlY3RIYWwoCisgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBkZXZpY2VJZCwKKyAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KSB7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fSU5JVDsKKyAgICBzcDxBdWRpb0ZsaW5nZXI+IGFmID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7CisgICAgaWYgKGFmID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgc3A8RWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2U+IGVmZmVjdHNGYWN0b3J5ID0gYWYtPmdldEVmZmVjdHNGYWN0b3J5KCk7CisgICAgaWYgKGVmZmVjdHNGYWN0b3J5ICE9IDApIHsKKyAgICAgICAgc3RhdHVzID0gZWZmZWN0c0ZhY3RvcnktPmNyZWF0ZUVmZmVjdChwRWZmZWN0VXVpZCwgc2Vzc2lvbklkLCBpbygpLCBkZXZpY2VJZCwgZWZmZWN0KTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYm9vbCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDYWxsYmFjazo6dXBkYXRlT3JwaGFuRWZmZWN0Q2hhaW5zKAorICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkVmZmVjdEJhc2U+JiBlZmZlY3QpIHsKKyAgICBzcDxBdWRpb0ZsaW5nZXI+IGFmID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7CisgICAgaWYgKGFmID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBpbiBFZmZlY3RDaGFpbiBjb250ZXh0LCBhbiBFZmZlY3RCYXNlIGlzIGFsd2F5cyBmcm9tIGFuIEVmZmVjdE1vZHVsZSBzbyBzdGF0aWMgY2FzdCBpcyBzYWZlCisgICAgcmV0dXJuIGFmLT51cGRhdGVPcnBoYW5FZmZlY3RDaGFpbnMoZWZmZWN0LT5hc0VmZmVjdE1vZHVsZSgpKTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmFsbG9jYXRlSGFsQnVmZmVyKAorICAgICAgICBzaXplX3Qgc2l6ZSwgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiogYnVmZmVyKSB7CisgICAgc3A8QXVkaW9GbGluZ2VyPiBhZiA9IG1BdWRpb0ZsaW5nZXIucHJvbW90ZSgpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoYWYgPT0gbnVsbHB0ciwgImFsbG9jYXRlSGFsQnVmZmVyKCkgY291bGQgbm90IHJldHJpZXZlZCBhdWRpbyBmbGluZ2VyIik7CisgICAgcmV0dXJuIGFmLT5tRWZmZWN0c0ZhY3RvcnlIYWwtPmFsbG9jYXRlQnVmZmVyKHNpemUsIGJ1ZmZlcik7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjphZGRFZmZlY3RUb0hhbCgKKyAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIHsKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBOT19JTklUOworICAgIHNwPFRocmVhZEJhc2U+IHQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHNwIDxTdHJlYW1IYWxJbnRlcmZhY2U+IHN0ID0gdC0+c3RyZWFtKCk7CisgICAgaWYgKHN0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgcmVzdWx0ID0gc3QtPmFkZEVmZmVjdChlZmZlY3QpOworICAgIEFMT0dFX0lGKHJlc3VsdCAhPSBPSywgIkVycm9yIHdoZW4gYWRkaW5nIGVmZmVjdDogJWQiLCByZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjpyZW1vdmVFZmZlY3RGcm9tSGFsKAorICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgeworICAgIHN0YXR1c190IHJlc3VsdCA9IE5PX0lOSVQ7CisgICAgc3A8VGhyZWFkQmFzZT4gdCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9CisgICAgc3AgPFN0cmVhbUhhbEludGVyZmFjZT4gc3QgPSB0LT5zdHJlYW0oKTsKKyAgICBpZiAoc3QgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKyAgICByZXN1bHQgPSBzdC0+cmVtb3ZlRWZmZWN0KGVmZmVjdCk7CisgICAgQUxPR0VfSUYocmVzdWx0ICE9IE9LLCAiRXJyb3Igd2hlbiByZW1vdmluZyBlZmZlY3Q6ICVkIiwgcmVzdWx0KTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCithdWRpb19pb19oYW5kbGVfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDYWxsYmFjazo6aW8oKSBjb25zdCB7CisgICAgc3A8VGhyZWFkQmFzZT4gdCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgIH0KKyAgICByZXR1cm4gdC0+aWQoKTsKK30KKworYm9vbCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDYWxsYmFjazo6aXNPdXRwdXQoKSBjb25zdCB7CisgICAgc3A8VGhyZWFkQmFzZT4gdCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiB0LT5pc091dHB1dCgpOworfQorCitib29sIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjppc09mZmxvYWQoKSBjb25zdCB7CisgICAgc3A8VGhyZWFkQmFzZT4gdCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdC0+dHlwZSgpID09IFRocmVhZEJhc2U6Ok9GRkxPQUQ7Cit9CisKK2Jvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmlzT2ZmbG9hZE9yRGlyZWN0KCkgY29uc3QgeworICAgIHNwPFRocmVhZEJhc2U+IHQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpPRkZMT0FEIHx8IHQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpESVJFQ1Q7Cit9CisKK2Jvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmlzT2ZmbG9hZE9yTW1hcCgpIGNvbnN0IHsKKyAgICBzcDxUaHJlYWRCYXNlPiB0ID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgaWYgKHQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0LT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6T0ZGTE9BRCB8fCB0LT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6TU1BUDsKK30KKwordWludDMyX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OnNhbXBsZVJhdGUoKSBjb25zdCB7CisgICAgc3A8VGhyZWFkQmFzZT4gdCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiB0LT5zYW1wbGVSYXRlKCk7Cit9CisKK2F1ZGlvX2NoYW5uZWxfbWFza190IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjpjaGFubmVsTWFzaygpIGNvbnN0IHsKKyAgICBzcDxUaHJlYWRCYXNlPiB0ID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgaWYgKHQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9OT05FOworICAgIH0KKyAgICByZXR1cm4gdC0+Y2hhbm5lbE1hc2soKTsKK30KKwordWludDMyX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmNoYW5uZWxDb3VudCgpIGNvbnN0IHsKKyAgICBzcDxUaHJlYWRCYXNlPiB0ID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgaWYgKHQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgcmV0dXJuIHQtPmNoYW5uZWxDb3VudCgpOworfQorCitzaXplX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmZyYW1lQ291bnQoKSBjb25zdCB7CisgICAgc3A8VGhyZWFkQmFzZT4gdCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHJldHVybiB0LT5mcmFtZUNvdW50KCk7Cit9CisKK3VpbnQzMl90IEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjpsYXRlbmN5KCkgY29uc3QgeworICAgIHNwPFRocmVhZEJhc2U+IHQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gdC0+bGF0ZW5jeV9sKCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OnNldFZvbHVtZUZvck91dHB1dChmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgY29uc3QgeworICAgIHNwPFRocmVhZEJhc2U+IHQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdC0+c2V0Vm9sdW1lRm9yT3V0cHV0X2wobGVmdCwgcmlnaHQpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjpjaGVja1N1c3BlbmRPbkVmZmVjdEVuYWJsZWQoCisgICAgICAgIGNvbnN0IHNwPEVmZmVjdEJhc2U+JiBlZmZlY3QsIGJvb2wgZW5hYmxlZCwgYm9vbCB0aHJlYWRMb2NrZWQpIHsKKyAgICBzcDxUaHJlYWRCYXNlPiB0ID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgaWYgKHQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHQtPmNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZChlbmFibGVkLCBlZmZlY3QtPnNlc3Npb25JZCgpLCB0aHJlYWRMb2NrZWQpOworCisgICAgc3A8RWZmZWN0Q2hhaW4+IGMgPSBtQ2hhaW4ucHJvbW90ZSgpOworICAgIGlmIChjID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBpbiBFZmZlY3RDaGFpbiBjb250ZXh0LCBhbiBFZmZlY3RCYXNlIGlzIGFsd2F5cyBmcm9tIGFuIEVmZmVjdE1vZHVsZSBzbyBzdGF0aWMgY2FzdCBpcyBzYWZlCisgICAgYy0+Y2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKGVmZmVjdC0+YXNFZmZlY3RNb2R1bGUoKSwgZW5hYmxlZCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6Om9uRWZmZWN0RW5hYmxlKGNvbnN0IHNwPEVmZmVjdEJhc2U+JiBlZmZlY3QpIHsKKyAgICBzcDxUaHJlYWRCYXNlPiB0ID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgaWYgKHQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIGluIEVmZmVjdENoYWluIGNvbnRleHQsIGFuIEVmZmVjdEJhc2UgaXMgYWx3YXlzIGZyb20gYW4gRWZmZWN0TW9kdWxlIHNvIHN0YXRpYyBjYXN0IGlzIHNhZmUKKyAgICB0LT5vbkVmZmVjdEVuYWJsZShlZmZlY3QtPmFzRWZmZWN0TW9kdWxlKCkpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjpvbkVmZmVjdERpc2FibGUoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCkgeworICAgIGNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZChlZmZlY3QsIGZhbHNlLCBmYWxzZSAvKnRocmVhZExvY2tlZCovKTsKKworICAgIHNwPFRocmVhZEJhc2U+IHQgPSBtVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgdC0+b25FZmZlY3REaXNhYmxlKCk7Cit9CisKK2Jvb2wgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmRpc2Nvbm5lY3RFZmZlY3RIYW5kbGUoRWZmZWN0SGFuZGxlICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVucGluSWZMYXN0KSB7CisgICAgc3A8VGhyZWFkQmFzZT4gdCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB0LT5kaXNjb25uZWN0RWZmZWN0SGFuZGxlKGhhbmRsZSwgdW5waW5JZkxhc3QpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW46OkVmZmVjdENhbGxiYWNrOjpyZXNldFZvbHVtZSgpIHsKKyAgICBzcDxFZmZlY3RDaGFpbj4gYyA9IG1DaGFpbi5wcm9tb3RlKCk7CisgICAgaWYgKGMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGMtPnJlc2V0Vm9sdW1lX2woKTsKKworfQorCit1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OkVmZmVjdENoYWluOjpFZmZlY3RDYWxsYmFjazo6c3RyYXRlZ3koKSBjb25zdCB7CisgICAgc3A8RWZmZWN0Q2hhaW4+IGMgPSBtQ2hhaW4ucHJvbW90ZSgpOworICAgIGlmIChjID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIFBST0RVQ1RfU1RSQVRFR1lfTk9ORTsKKyAgICB9CisgICAgcmV0dXJuIGMtPnN0cmF0ZWd5KCk7Cit9CisKK2ludDMyX3QgQXVkaW9GbGluZ2VyOjpFZmZlY3RDaGFpbjo6RWZmZWN0Q2FsbGJhY2s6OmFjdGl2ZVRyYWNrQ250KCkgY29uc3QgeworICAgIHNwPEVmZmVjdENoYWluPiBjID0gbUNoYWluLnByb21vdGUoKTsKKyAgICBpZiAoYyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICByZXR1cm4gYy0+YWN0aXZlVHJhY2tDbnQoKTsKK30KKworCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdFByb3h5IgorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdFByb3h5OjpzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCwgYm9vbCBmcm9tSGFuZGxlKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IEVmZmVjdEJhc2U6OnNldEVuYWJsZWQoZW5hYmxlZCwgZnJvbUhhbmRsZSk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Qcm94eUxvY2spOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgZm9yIChhdXRvJiBoYW5kbGUgOiBtRWZmZWN0SGFuZGxlcykgeworICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBoYW5kbGUuc2Vjb25kLT5lbmFibGUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gaGFuZGxlLnNlY29uZC0+ZGlzYWJsZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCIlcyBlbmFibGUgJWQgc3RhdHVzICVkIiwgX19mdW5jX18sIGVuYWJsZWQsIHN0YXR1cyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RQcm94eTo6aW5pdCgKKyAgICAgICAgY29uc3Qgc3RkOjptYXAgPGF1ZGlvX3BhdGNoX2hhbmRsZV90LCBQYXRjaFBhbmVsOjpQYXRjaD4mIHBhdGNoZXMpIHsKKy8vRm9yIGFsbCBhdWRpbyBwYXRjaGVzCisvL0lmIHNyYyBvciBzaW5rIGRldmljZSBtYXRjaAorLy9JZiB0aGUgZWZmZWN0IGlzIEhXIGFjY2VsZXJhdGVkCisvLwlpZiBubyBjb3JyZXNwb25kaW5nIGVmZmVjdCBtb2R1bGUKKy8vCQlDcmVhdGUgRWZmZWN0TW9kdWxlOiBtSGFsRWZmZWN0CisvL0NyZWF0ZSBhbmQgYXR0YWNoIEVmZmVjdEhhbmRsZQorLy9JZiB0aGUgZWZmZWN0IGlzIG5vdCBIVyBhY2NlbGVyYXRlZCBhbmQgdGhlIHBhdGNoIHNpbmsgb3Igc3JjIGlzIGEgbWl4ZXIgcG9ydAorLy8JQ3JlYXRlIEVmZmVjdCBvbiBwYXRjaCBpbnB1dCBvciBvdXRwdXQgdGhyZWFkIG9uIHNlc3Npb24gLTEKKy8vQWRkIEVmZmVjdEhhbmRsZSB0byBFZmZlY3RIYW5kbGUgbWFwIG9mIEVmZmVjdCBQcm94eToKKyAgICBBTE9HVigiJXMgZGV2aWNlIHR5cGUgJWQgYWRkcmVzcyAlcyIsIF9fZnVuY19fLCAgbURldmljZS5tVHlwZSwgbURldmljZS5nZXRBZGRyZXNzKCkpOworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGZvciAoYXV0byAmcGF0Y2ggOiBwYXRjaGVzKSB7CisgICAgICAgIHN0YXR1cyA9IG9uQ3JlYXRlUGF0Y2gocGF0Y2guZmlyc3QsIHBhdGNoLnNlY29uZCk7CisgICAgICAgIEFMT0dWKCIlcyBvbkNyZWF0ZVBhdGNoIHN0YXR1cyAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworICAgICAgICBpZiAoc3RhdHVzID09IEJBRF9WQUxVRSkgeworICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdFByb3h5OjpvbkNyZWF0ZVBhdGNoKAorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwgY29uc3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpQYXRjaCYgcGF0Y2gpIHsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOQU1FX05PVF9GT1VORDsKKyAgICBzcDxFZmZlY3RIYW5kbGU+IGhhbmRsZTsKKyAgICAvLyBvbmx5IGNvbnNpZGVyIHNvdXJjZVswXSBhcyB0aGlzIGlzIHRoZSBvbmx5ICJ0cnVlIiBzb3VyY2Ugb2YgYSBwYXRjaAorICAgIHN0YXR1cyA9IGNoZWNrUG9ydChwYXRjaCwgJnBhdGNoLm1BdWRpb1BhdGNoLnNvdXJjZXNbMF0sICZoYW5kbGUpOworICAgIEFMT0dWKCIlcyBzb3VyY2UgY2hlY2tQb3J0IHN0YXR1cyAlZCIsIF9fZnVuY19fLCBzdGF0dXMpOworICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBwYXRjaC5tQXVkaW9QYXRjaC5udW1fc2lua3MgJiYgc3RhdHVzID09IE5BTUVfTk9UX0ZPVU5EOyBpKyspIHsKKyAgICAgICAgc3RhdHVzID0gY2hlY2tQb3J0KHBhdGNoLCAmcGF0Y2gubUF1ZGlvUGF0Y2guc2lua3NbaV0sICZoYW5kbGUpOworICAgICAgICBBTE9HVigiJXMgc2luayAlZCBjaGVja1BvcnQgc3RhdHVzICVkIiwgX19mdW5jX18sIGksIHN0YXR1cyk7CisgICAgfQorICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgfHwgc3RhdHVzID09IEFMUkVBRFlfRVhJU1RTKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtUHJveHlMb2NrKTsKKyAgICAgICAgbUVmZmVjdEhhbmRsZXMuZW1wbGFjZShwYXRjaEhhbmRsZSwgaGFuZGxlKTsKKyAgICB9CisgICAgQUxPR1dfSUYoc3RhdHVzID09IEJBRF9WQUxVRSwKKyAgICAgICAgICAgICIlcyBjYW5ub3QgYXR0YWNoIGVmZmVjdCAlcyBvbiBwYXRjaCAlZCIsIF9fZnVuY19fLCBtRGVzY3JpcHRvci5uYW1lLCBwYXRjaEhhbmRsZSk7CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdFByb3h5OjpjaGVja1BvcnQoY29uc3QgUGF0Y2hQYW5lbDo6UGF0Y2gmIHBhdGNoLAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnBvcnQsIHNwIDxFZmZlY3RIYW5kbGU+ICpoYW5kbGUpIHsKKworICAgIEFMT0dWKCIlcyB0eXBlICVkIGRldmljZSB0eXBlICVkIGFkZHJlc3MgJXMgZGV2aWNlIElEICVkIHBhdGNoLmlzU29mdHdhcmUoKSAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgcG9ydC0+dHlwZSwgcG9ydC0+ZXh0LmRldmljZS50eXBlLAorICAgICAgICAgICAgcG9ydC0+ZXh0LmRldmljZS5hZGRyZXNzLCBwb3J0LT5pZCwgcGF0Y2guaXNTb2Z0d2FyZSgpKTsKKyAgICBpZiAocG9ydC0+dHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFIHx8IHBvcnQtPmV4dC5kZXZpY2UudHlwZSAhPSBtRGV2aWNlLm1UeXBlCisgICAgICAgIHx8IHBvcnQtPmV4dC5kZXZpY2UuYWRkcmVzcyAhPSBtRGV2aWNlLm1BZGRyZXNzKSB7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTkFNRV9OT1RfRk9VTkQ7CisKKyAgICBpZiAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19IV19BQ0NfVFVOTkVMKSB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtUHJveHlMb2NrKTsKKyAgICAgICAgbURldmljZVBvcnQgPSAqcG9ydDsKKyAgICAgICAgbUhhbEVmZmVjdCA9IG5ldyBFZmZlY3RNb2R1bGUobU15Q2FsbGJhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8ZWZmZWN0X2Rlc2NyaXB0b3JfdCAqPigmbURlc2NyaXB0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTXlDYWxsYmFjay0+bmV3RWZmZWN0SWQoKSwgQVVESU9fU0VTU0lPTl9ERVZJQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIHBpbm5lZCAqLywgcG9ydC0+aWQpOworICAgICAgICBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKG1EZXZpY2UubVR5cGUpKSB7CisgICAgICAgICAgICBtSGFsRWZmZWN0LT5zZXRJbnB1dERldmljZShtRGV2aWNlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1IYWxFZmZlY3QtPnNldERldmljZXMoe21EZXZpY2V9KTsKKyAgICAgICAgfQorICAgICAgICAqaGFuZGxlID0gbmV3IEVmZmVjdEhhbmRsZShtSGFsRWZmZWN0LCBudWxscHRyLCBudWxscHRyLCAwIC8qcHJpb3JpdHkqLyk7CisgICAgICAgIHN0YXR1cyA9ICgqaGFuZGxlKS0+aW5pdENoZWNrKCk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gT0spIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IG1IYWxFZmZlY3QtPmFkZEhhbmRsZSgoKmhhbmRsZSkuZ2V0KCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbUhhbEVmZmVjdC5jbGVhcigpOworICAgICAgICAgICAgbURldmljZVBvcnQuaWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChwYXRjaC5pc1NvZnR3YXJlKCkgfHwgcGF0Y2gudGhyZWFkKCkucHJvbW90ZSgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgc3AgPFRocmVhZEJhc2U+IHRocmVhZDsKKyAgICAgICAgaWYgKGF1ZGlvX3BvcnRfY29uZmlnX2hhc19pbnB1dF9kaXJlY3Rpb24ocG9ydCkpIHsKKyAgICAgICAgICAgIGlmIChwYXRjaC5pc1NvZnR3YXJlKCkpIHsKKyAgICAgICAgICAgICAgICB0aHJlYWQgPSBwYXRjaC5tUmVjb3JkLnRocmVhZCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJlYWQgPSBwYXRjaC50aHJlYWQoKS5wcm9tb3RlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocGF0Y2guaXNTb2Z0d2FyZSgpKSB7CisgICAgICAgICAgICAgICAgdGhyZWFkID0gcGF0Y2gubVBsYXliYWNrLnRocmVhZCgpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aHJlYWQgPSBwYXRjaC50aHJlYWQoKS5wcm9tb3RlKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaW50IGVuYWJsZWQ7CisgICAgICAgICpoYW5kbGUgPSB0aHJlYWQtPmNyZWF0ZUVmZmVjdF9sKG51bGxwdHIsIG51bGxwdHIsIDAsIEFVRElPX1NFU1NJT05fREVWSUNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGVmZmVjdF9kZXNjcmlwdG9yX3QgKj4oJm1EZXNjcmlwdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVuYWJsZWQsICZzdGF0dXMsIGZhbHNlKTsKKyAgICAgICAgQUxPR1YoIiVzIHRocmVhZC0+Y3JlYXRlRWZmZWN0X2wgc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SIHx8IHN0YXR1cyA9PSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICBpZiAoaXNFbmFibGVkKCkpIHsKKyAgICAgICAgICAgICgqaGFuZGxlKS0+ZW5hYmxlKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAoKmhhbmRsZSktPmRpc2FibGUoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGV2aWNlRWZmZWN0UHJveHk6Om9uUmVsZWFzZVBhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Qcm94eUxvY2spOworICAgIG1FZmZlY3RIYW5kbGVzLmVyYXNlKHBhdGNoSGFuZGxlKTsKK30KKworCitzaXplX3QgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RQcm94eTo6cmVtb3ZlRWZmZWN0KGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVByb3h5TG9jayk7CisgICAgaWYgKGVmZmVjdCA9PSBtSGFsRWZmZWN0KSB7CisgICAgICAgIG1IYWxFZmZlY3QuY2xlYXIoKTsKKyAgICAgICAgbURldmljZVBvcnQuaWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIH0KKyAgICByZXR1cm4gbUhhbEVmZmVjdCA9PSBudWxscHRyID8gMCA6IDE7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6RGV2aWNlRWZmZWN0UHJveHk6OmFkZEVmZmVjdFRvSGFsKAorICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7CisgICAgaWYgKG1IYWxFZmZlY3QgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1NYW5hZ2VyQ2FsbGJhY2stPmFkZEVmZmVjdFRvSGFsKAorICAgICAgICAgICAgbURldmljZVBvcnQuaWQsIG1EZXZpY2VQb3J0LmV4dC5kZXZpY2UuaHdfbW9kdWxlLCBlZmZlY3QpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdFByb3h5OjpyZW1vdmVFZmZlY3RGcm9tSGFsKAorICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7CisgICAgaWYgKG1IYWxFZmZlY3QgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1NYW5hZ2VyQ2FsbGJhY2stPnJlbW92ZUVmZmVjdEZyb21IYWwoCisgICAgICAgICAgICBtRGV2aWNlUG9ydC5pZCwgbURldmljZVBvcnQuZXh0LmRldmljZS5od19tb2R1bGUsIGVmZmVjdCk7Cit9CisKK2Jvb2wgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RQcm94eTo6aXNPdXRwdXQoKSBjb25zdCB7CisgICAgaWYgKG1EZXZpY2VQb3J0LmlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIG1EZXZpY2VQb3J0LnJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTks7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdFByb3h5OjpzYW1wbGVSYXRlKCkgY29uc3QgeworICAgIGlmIChtRGV2aWNlUG9ydC5pZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FICYmCisgICAgICAgICAgICAobURldmljZVBvcnQuY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkgIT0gMCkgeworICAgICAgICByZXR1cm4gbURldmljZVBvcnQuc2FtcGxlX3JhdGU7CisgICAgfQorICAgIHJldHVybiBERUZBVUxUX09VVFBVVF9TQU1QTEVfUkFURTsKK30KKworYXVkaW9fY2hhbm5lbF9tYXNrX3QgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RQcm94eTo6Y2hhbm5lbE1hc2soKSBjb25zdCB7CisgICAgaWYgKG1EZXZpY2VQb3J0LmlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUgJiYKKyAgICAgICAgICAgIChtRGV2aWNlUG9ydC5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgIT0gMCkgeworICAgICAgICByZXR1cm4gbURldmljZVBvcnQuY2hhbm5lbF9tYXNrOworICAgIH0KKyAgICByZXR1cm4gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworfQorCit1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdFByb3h5OjpjaGFubmVsQ291bnQoKSBjb25zdCB7CisgICAgaWYgKGlzT3V0cHV0KCkpIHsKKyAgICAgICAgcmV0dXJuIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjaGFubmVsTWFzaygpKTsKKyAgICB9CisgICAgcmV0dXJuIGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKCkpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGV2aWNlRWZmZWN0UHJveHk6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSB7CisgICAgY29uc3QgVmVjdG9yPFN0cmluZzE2PiBhcmdzOworICAgIEVmZmVjdEJhc2U6OmR1bXAoZmQsIGFyZ3MpOworCisgICAgY29uc3QgYm9vbCBsb2NrZWQgPSBkdW1wVHJ5TG9jayhtUHJveHlMb2NrKTsKKyAgICBpZiAoIWxvY2tlZCkgeworICAgICAgICBTdHJpbmc4IHJlc3VsdCgiRGV2aWNlRWZmZWN0UHJveHkgbWF5IGJlIGRlYWRsb2NrZWRcbiIpOworICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICB9CisKKyAgICBTdHJpbmc4IG91dFN0cjsKKyAgICBpZiAobUhhbEVmZmVjdCAhPSBudWxscHRyKSB7CisgICAgICAgIG91dFN0ci5hcHBlbmRGb3JtYXQoIiUqc0hBTCBFZmZlY3QgSWQ6ICVkXG4iLCBzcGFjZXMsICIiLCBtSGFsRWZmZWN0LT5pZCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXRTdHIuYXBwZW5kRm9ybWF0KCIlKnNOTyBIQUwgRWZmZWN0XG4iLCBzcGFjZXMsICIiKTsKKyAgICB9CisgICAgd3JpdGUoZmQsIG91dFN0ci5zdHJpbmcoKSwgb3V0U3RyLnNpemUoKSk7CisgICAgb3V0U3RyLmNsZWFyKCk7CisKKyAgICBvdXRTdHIuYXBwZW5kRm9ybWF0KCIlKnNTdWIgRWZmZWN0czpcbiIsIHNwYWNlcywgIiIpOworICAgIHdyaXRlKGZkLCBvdXRTdHIuc3RyaW5nKCksIG91dFN0ci5zaXplKCkpOworICAgIG91dFN0ci5jbGVhcigpOworCisgICAgZm9yIChjb25zdCBhdXRvJiBpdGVyIDogbUVmZmVjdEhhbmRsZXMpIHsKKyAgICAgICAgb3V0U3RyLmFwcGVuZEZvcm1hdCgiJSpzRWZmZWN0IGZvciBwYXRjaCBoYW5kbGUgJWQ6XG4iLCBzcGFjZXMgKyAyLCAiIiwgaXRlci5maXJzdCk7CisgICAgICAgIHdyaXRlKGZkLCBvdXRTdHIuc3RyaW5nKCksIG91dFN0ci5zaXplKCkpOworICAgICAgICBvdXRTdHIuY2xlYXIoKTsKKyAgICAgICAgc3A8RWZmZWN0QmFzZT4gZWZmZWN0ID0gaXRlci5zZWNvbmQtPmVmZmVjdCgpLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGVmZmVjdCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBlZmZlY3QtPmR1bXAoZmQsIGFyZ3MpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGxvY2tlZCkgeworICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICB9Cit9CisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvRmxpbmdlcjo6RGV2aWNlRWZmZWN0UHJveHk6OlByb3h5Q2FsbGJhY2siCisKK2ludCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdFByb3h5OjpQcm94eUNhbGxiYWNrOjpuZXdFZmZlY3RJZCgpIHsKKyAgICByZXR1cm4gbU1hbmFnZXJDYWxsYmFjay0+bmV3RWZmZWN0SWQoKTsKK30KKworCitib29sIEF1ZGlvRmxpbmdlcjo6RGV2aWNlRWZmZWN0UHJveHk6OlByb3h5Q2FsbGJhY2s6OmRpc2Nvbm5lY3RFZmZlY3RIYW5kbGUoCisgICAgICAgIEVmZmVjdEhhbmRsZSAqaGFuZGxlLCBib29sIHVucGluSWZMYXN0KSB7CisgICAgc3A8RWZmZWN0QmFzZT4gZWZmZWN0QmFzZSA9IGhhbmRsZS0+ZWZmZWN0KCkucHJvbW90ZSgpOworICAgIGlmIChlZmZlY3RCYXNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gZWZmZWN0QmFzZS0+YXNFZmZlY3RNb2R1bGUoKTsKKyAgICBpZiAoZWZmZWN0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIHJlc3RvcmUgc3VzcGVuZGVkIGVmZmVjdHMgaWYgdGhlIGRpc2Nvbm5lY3RlZCBoYW5kbGUgd2FzIGVuYWJsZWQgYW5kIHRoZSBsYXN0IG9uZS4KKyAgICBib29sIHJlbW92ZSA9IChlZmZlY3QtPnJlbW92ZUhhbmRsZShoYW5kbGUpID09IDApICYmICghZWZmZWN0LT5pc1Bpbm5lZCgpIHx8IHVucGluSWZMYXN0KTsKKyAgICBpZiAocmVtb3ZlKSB7CisgICAgICAgIHNwPERldmljZUVmZmVjdFByb3h5PiBwcm94eSA9IG1Qcm94eS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChwcm94eSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBwcm94eS0+cmVtb3ZlRWZmZWN0KGVmZmVjdCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhhbmRsZS0+ZW5hYmxlZCgpKSB7CisgICAgICAgICAgICBlZmZlY3RCYXNlLT5jaGVja1N1c3BlbmRPbkVmZmVjdEVuYWJsZWQoZmFsc2UsIGZhbHNlIC8qdGhyZWFkTG9ja2VkKi8pOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdFByb3h5OjpQcm94eUNhbGxiYWNrOjpjcmVhdGVFZmZlY3RIYWwoCisgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnBFZmZlY3RVdWlkLCBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBkZXZpY2VJZCwKKyAgICAgICAgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KSB7CisgICAgcmV0dXJuIG1NYW5hZ2VyQ2FsbGJhY2stPmNyZWF0ZUVmZmVjdEhhbChwRWZmZWN0VXVpZCwgc2Vzc2lvbklkLCBkZXZpY2VJZCwgZWZmZWN0KTsKK30KKworc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RQcm94eTo6UHJveHlDYWxsYmFjazo6YWRkRWZmZWN0VG9IYWwoCisgICAgICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSB7CisgICAgc3A8RGV2aWNlRWZmZWN0UHJveHk+IHByb3h5ID0gbVByb3h5LnByb21vdGUoKTsKKyAgICBpZiAocHJveHkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIHByb3h5LT5hZGRFZmZlY3RUb0hhbChlZmZlY3QpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdFByb3h5OjpQcm94eUNhbGxiYWNrOjpyZW1vdmVFZmZlY3RGcm9tSGFsKAorICAgICAgICBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgeworICAgIHNwPERldmljZUVmZmVjdFByb3h5PiBwcm94eSA9IG1Qcm94eS5wcm9tb3RlKCk7CisgICAgaWYgKHByb3h5ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBwcm94eS0+YWRkRWZmZWN0VG9IYWwoZWZmZWN0KTsKK30KKworYm9vbCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdFByb3h5OjpQcm94eUNhbGxiYWNrOjppc091dHB1dCgpIGNvbnN0IHsKKyAgICBzcDxEZXZpY2VFZmZlY3RQcm94eT4gcHJveHkgPSBtUHJveHkucHJvbW90ZSgpOworICAgIGlmIChwcm94eSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gcHJveHktPmlzT3V0cHV0KCk7Cit9CisKK3VpbnQzMl90IEF1ZGlvRmxpbmdlcjo6RGV2aWNlRWZmZWN0UHJveHk6OlByb3h5Q2FsbGJhY2s6OnNhbXBsZVJhdGUoKSBjb25zdCB7CisgICAgc3A8RGV2aWNlRWZmZWN0UHJveHk+IHByb3h5ID0gbVByb3h5LnByb21vdGUoKTsKKyAgICBpZiAocHJveHkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVGQVVMVF9PVVRQVVRfU0FNUExFX1JBVEU7CisgICAgfQorICAgIHJldHVybiBwcm94eS0+c2FtcGxlUmF0ZSgpOworfQorCithdWRpb19jaGFubmVsX21hc2tfdCBBdWRpb0ZsaW5nZXI6OkRldmljZUVmZmVjdFByb3h5OjpQcm94eUNhbGxiYWNrOjpjaGFubmVsTWFzaygpIGNvbnN0IHsKKyAgICBzcDxEZXZpY2VFZmZlY3RQcm94eT4gcHJveHkgPSBtUHJveHkucHJvbW90ZSgpOworICAgIGlmIChwcm94eSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CisgICAgfQorICAgIHJldHVybiBwcm94eS0+Y2hhbm5lbE1hc2soKTsKK30KKwordWludDMyX3QgQXVkaW9GbGluZ2VyOjpEZXZpY2VFZmZlY3RQcm94eTo6UHJveHlDYWxsYmFjazo6Y2hhbm5lbENvdW50KCkgY29uc3QgeworICAgIHNwPERldmljZUVmZmVjdFByb3h5PiBwcm94eSA9IG1Qcm94eS5wcm9tb3RlKCk7CisgICAgaWYgKHByb3h5ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIDI7CisgICAgfQorICAgIHJldHVybiBwcm94eS0+Y2hhbm5lbENvdW50KCk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRWZmZWN0cy5oCmluZGV4IDE1YTI2ZWEuLjQwYmIyMjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9FZmZlY3RzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0VmZmVjdHMuaApAQCAtMjEsMzQgKzIxLDc4IEBACiAKIC8vLS0tIEF1ZGlvIEVmZmVjdCBNYW5hZ2VtZW50CiAKLS8vIEVmZmVjdE1vZHVsZSBhbmQgRWZmZWN0Q2hhaW4gY2xhc3NlcyBib3RoIGhhdmUgdGhlaXIgb3duIG11dGV4IHRvIHByb3RlY3QKKy8vIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSB0aGUgRWZmZWN0TW9kdWxlIHBhcmVudCBvciBvd25lciAoZS5nIGFuIEVmZmVjdENoYWluKSB0byBhYnN0cmFjdAorLy8gaW50ZXJhY3Rpb25zIGJldHdlZW4gdGhlIEVmZmVjdE1vZHVsZSBhbmQgdGhlIHJlc2V0IG9mIHRoZSBhdWRpbyBmcmFtZXdvcmsuCitjbGFzcyBFZmZlY3RDYWxsYmFja0ludGVyZmFjZSA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICAgICAgICAgIH5FZmZlY3RDYWxsYmFja0ludGVyZmFjZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAgIC8vIFRyaXZpYWwgbWV0aG9kcyB1c3VhbGx5IGltcGxlbWVudGVkIHdpdGggaGVscCBmcm9tIFRocmVhZEJhc2UKKyAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGlvKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpc091dHB1dCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpc09mZmxvYWRPckRpcmVjdCgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkT3JNbWFwKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgdWludDMyX3Qgc2FtcGxlUmF0ZSgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgdWludDMyX3QgY2hhbm5lbENvdW50KCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc2l6ZV90IGZyYW1lQ291bnQoKSBjb25zdCA9IDA7CisKKyAgICAvLyBOb24gdHJpdmlhbCBtZXRob2RzIHVzdWFsbHkgaW1wbGVtZW50ZWQgd2l0aCBoZWxwIGZyb20gVGhyZWFkQmFzZToKKyAgICAvLyAgIHBheSBhdHRlbnRpb24gdG8gbXV0ZXggbG9ja2luZyBvcmRlcgorICAgIHZpcnR1YWwgdWludDMyX3QgbGF0ZW5jeSgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdFRvSGFsKHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVFZmZlY3RGcm9tSGFsKHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHNldFZvbHVtZUZvck91dHB1dChmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgYm9vbCBkaXNjb25uZWN0RWZmZWN0SGFuZGxlKEVmZmVjdEhhbmRsZSAqaGFuZGxlLCBib29sIHVucGluSWZMYXN0KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIGNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3RCYXNlPiYgZWZmZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0aHJlYWRMb2NrZWQpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgb25FZmZlY3RFbmFibGUoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBvbkVmZmVjdERpc2FibGUoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCkgPSAwOworCisgICAgLy8gTWV0aG9kcyB1c3VhbGx5IGltcGxlbWVudGVkIHdpdGggaGVscCBmcm9tIEF1ZGlvRmxpbmdlcjogcGF5IGF0dGVudGlvbiB0byBtdXRleCBsb2NraW5nIG9yZGVyCisgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVFZmZlY3RIYWwoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCisgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGRldmljZUlkLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGFsbG9jYXRlSGFsQnVmZmVyKHNpemVfdCBzaXplLCBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgdXBkYXRlT3JwaGFuRWZmZWN0Q2hhaW5zKGNvbnN0IHNwPEVmZmVjdEJhc2U+JiBlZmZlY3QpID0gMDsKKworICAgIC8vIE1ldGhvZHMgdXN1YWxseSBpbXBsZW1lbnRlZCB3aXRoIGhlbHAgZnJvbSBFZmZlY3RDaGFpbjogcGF5IGF0dGVudGlvbiB0byBtdXRleCBsb2NraW5nIG9yZGVyCisgICAgdmlydHVhbCB1aW50MzJfdCBzdHJhdGVneSgpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGludDMyX3QgYWN0aXZlVHJhY2tDbnQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJlc2V0Vm9sdW1lKCkgPSAwOworCisgICAgdmlydHVhbCB3cDxFZmZlY3RDaGFpbj4gY2hhaW4oKSBjb25zdCA9IDA7Cit9OworCisvLyBFZmZlY3RCYXNlKEVmZmVjdE1vZHVsZSkgYW5kIEVmZmVjdENoYWluIGNsYXNzZXMgYm90aCBoYXZlIHRoZWlyIG93biBtdXRleCB0byBwcm90ZWN0CiAvLyBzdGF0ZSBjaGFuZ2VzIG9yIHJlc291cmNlIG1vZGlmaWNhdGlvbnMuIEFsd2F5cyByZXNwZWN0IHRoZSBmb2xsb3dpbmcgb3JkZXIKIC8vIGlmIG11bHRpcGxlIG11dGV4ZXMgbXVzdCBiZSBhY3F1aXJlZCB0byBhdm9pZCBjcm9zcyBkZWFkbG9jazoKLS8vIEF1ZGlvRmxpbmdlciAtPiBUaHJlYWRCYXNlIC0+IEVmZmVjdENoYWluIC0+IEVmZmVjdE1vZHVsZQotLy8gQXVkaW9IYW5kbGUgLT4gVGhyZWFkQmFzZSAtPiBFZmZlY3RDaGFpbiAtPiBFZmZlY3RNb2R1bGUKKy8vIEF1ZGlvRmxpbmdlciAtPiBUaHJlYWRCYXNlIC0+IEVmZmVjdENoYWluIC0+IEVmZmVjdEJhc2UoRWZmZWN0TW9kdWxlKQorLy8gQXVkaW9IYW5kbGUgLT4gVGhyZWFkQmFzZSAtPiBFZmZlY3RDaGFpbiAtPiBFZmZlY3RCYXNlKEVmZmVjdE1vZHVsZSkKKworLy8gTk9URTogV2hlbiBpbXBsZW1lbnRpbmcgdGhlIEVmZmVjdENhbGxiYWNrSW50ZXJmYWNlLCBpbiBhbiBFZmZlY3RDaGFpbiBvciBvdGhlciwgaXQgaXMgaW1wb3J0YW50CisvLyB0byBwYXkgYXR0ZW50aW9uIHRvIHRoaXMgbG9ja2luZyBvcmRlciBhcyBzb21lIGNhbGxiYWNrIG1ldGhvZHMgY2FuIGJlIGNhbGxlZCBmcm9tIGEgc3RhdGUgd2hlcmUKKy8vIEVmZmVjdE1vZHVsZSBhbmQvb3IgRWZmZWN0Q2hhaW4gbXV0ZXhlcyBhcmUgaGVsZC4KKwogLy8gSW4gYWRkaXRpb24sIG1ldGhvZHMgdGhhdCBsb2NrIHRoZSBBdWRpb1BvbGljeVNlcnZpY2UgbXV0ZXggKGdldE91dHB1dEZvckVmZmVjdCgpLAogLy8gc3RhcnRPdXRwdXQoKSwgZ2V0SW5wdXRGb3JBdHRyKCksIHJlbGVhc2VJbnB1dCgpLi4uKSBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyIG9yCiAvLyBUaHJlYWRiYXNlIG11dGV4IGxvY2tlZCB0byBhdm9pZCBjcm9zcyBkZWFkbG9jayB3aXRoIG90aGVyIGNsaWVudHMgY2FsbGluZyBBdWRpb1BvbGljeVNlcnZpY2UKIC8vIG1ldGhvZHMgdGhhdCBpbiB0dXJuIGNhbGwgQXVkaW9GbGluZ2VyIHRodXMgbG9ja2luZyB0aGUgc2FtZSBtdXRleGVzIGluIHRoZSByZXZlcnNlIG9yZGVyLgogCi0vLyBUaGUgRWZmZWN0TW9kdWxlIGNsYXNzIGlzIGEgd3JhcHBlciBvYmplY3QgY29udHJvbGxpbmcgdGhlIGVmZmVjdCBlbmdpbmUgaW1wbGVtZW50YXRpb24KLS8vIGluIHRoZSBlZmZlY3QgbGlicmFyeS4gSXQgcHJldmVudHMgY29uY3VycmVudCBjYWxscyB0byBwcm9jZXNzKCkgYW5kIGNvbW1hbmQoKSBmdW5jdGlvbnMKLS8vIGZyb20gZGlmZmVyZW50IGNsaWVudCB0aHJlYWRzLiBJdCBrZWVwcyBhIGxpc3Qgb2YgRWZmZWN0SGFuZGxlIG9iamVjdHMgY29ycmVzcG9uZGluZwotLy8gdG8gYWxsIGNsaWVudCBhcHBsaWNhdGlvbnMgdXNpbmcgdGhpcyBlZmZlY3QgYW5kIG5vdGlmaWVzIGFwcGxpY2F0aW9ucyBvZiBlZmZlY3Qgc3RhdGUsCi0vLyBjb250cm9sIG9yIHBhcmFtZXRlciBjaGFuZ2VzLiBJdCBtYW5hZ2VzIHRoZSBhY3RpdmF0aW9uIHN0YXRlIG1hY2hpbmUgdG8gc2VuZCBhcHByb3ByaWF0ZQotLy8gcmVzZXQsIGVuYWJsZSwgZGlzYWJsZSBjb21tYW5kcyB0byBlZmZlY3QgZW5naW5lIGFuZCBwcm92aWRlIHZvbHVtZQotLy8gcmFtcGluZyB3aGVuIGVmZmVjdHMgYXJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZC4KLS8vIFdoZW4gY29udHJvbGxpbmcgYW4gYXV4aWxpYXJ5IGVmZmVjdCwgdGhlIEVmZmVjdE1vZHVsZSBhbHNvIHByb3ZpZGVzIGFuIGlucHV0IGJ1ZmZlciB1c2VkIGJ5Ci0vLyB0aGUgYXR0YWNoZWQgdHJhY2socykgdG8gYWNjdW11bGF0ZSB0aGVpciBhdXhpbGlhcnkgY2hhbm5lbC4KLWNsYXNzIEVmZmVjdE1vZHVsZSA6IHB1YmxpYyBSZWZCYXNlIHsKKworLy8gVGhlIEVmZmVjdEJhc2UgY2xhc3MgY29udGFpbnMgY29tbW9uIHByb3BlcnRpZXMsIHN0YXRlIGFuZCBiZWhhdmlvciBmb3IgYW5kIEVmZmVjdE1vZHVsZSBvcgorLy8gb3RoZXIgZGVyaXZlZCBjbGFzc2VzIG1hbmFnaW5nIGFuIGF1ZGlvIGVmZmVjdCBpbnN0YW5jZSB3aXRoaW4gdGhlIGVmZmVjdCBmcmFtZXdvcmsuCisvLyBJdCBhbHNvIGNvbnRhaW5zIHRoZSBjbGFzcyBtdXRleCAoc2VlIGNvbW1lbnQgb24gbG9ja2luZyBvcmRlciBhYm92ZSkuCitjbGFzcyBFZmZlY3RCYXNlIDogcHVibGljIFJlZkJhc2UgewogcHVibGljOgotICAgIEVmZmVjdE1vZHVsZShUaHJlYWRCYXNlICp0aHJlYWQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHdwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0Q2hhaW4+JiBjaGFpbiwKLSAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKLSAgICAgICAgICAgICAgICAgICAgaW50IGlkLAotICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAotICAgICAgICAgICAgICAgICAgICBib29sIHBpbm5lZCk7Ci0gICAgdmlydHVhbCB+RWZmZWN0TW9kdWxlKCk7CisgICAgRWZmZWN0QmFzZShjb25zdCBzcDxFZmZlY3RDYWxsYmFja0ludGVyZmFjZT4mIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgIGludCBpZCwKKyAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICBib29sIHBpbm5lZCk7CisKKyAgICB+RWZmZWN0QmFzZSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKIAogICAgIGVudW0gZWZmZWN0X3N0YXRlIHsKICAgICAgICAgSURMRSwKQEAgLTYwLDMwICsxMDQsMTI5IEBACiAgICAgICAgIERFU1RST1lFRAogICAgIH07CiAKLSAgICBpbnQgICAgICAgICBpZCgpIGNvbnN0IHsgcmV0dXJuIG1JZDsgfQorICAgIGludCBpZCgpIGNvbnN0IHsgcmV0dXJuIG1JZDsgfQorICAgIGVmZmVjdF9zdGF0ZSBzdGF0ZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdGF0ZTsKKyAgICB9CisgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TZXNzaW9uSWQ7CisgICAgfQorICAgIGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QmIGRlc2MoKSBjb25zdCB7IHJldHVybiBtRGVzY3JpcHRvcjsgfQorICAgIGJvb2wgICAgICAgICAgICAgaXNPZmZsb2FkYWJsZSgpIGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19PRkZMT0FEX1NVUFBPUlRFRCkgIT0gMDsgfQorICAgIGJvb2wgICAgICAgICAgICAgaXNJbXBsZW1lbnRhdGlvblNvZnR3YXJlKCkgY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX0hXX0FDQ19NQVNLKSA9PSAwOyB9CisgICAgYm9vbCAgICAgICAgICAgICBpc1Byb2Nlc3NJbXBsZW1lbnRlZCgpIGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19OT19QUk9DRVNTKSA9PSAwOyB9CisgICAgYm9vbCAgICAgICAgICAgICBpc1ZvbHVtZUNvbnRyb2woKSBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVk9MVU1FX01BU0spCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gRUZGRUNUX0ZMQUdfVk9MVU1FX0NUUkw7IH0KKyAgICBib29sICAgICAgICAgICAgIGlzVm9sdW1lTW9uaXRvcigpIGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19WT0xVTUVfTUFTSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA9PSBFRkZFQ1RfRkxBR19WT0xVTUVfTU9OSVRPUjsgfQorCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCwgYm9vbCBmcm9tSGFuZGxlKTsKKyAgICBzdGF0dXNfdCAgICBzZXRFbmFibGVkX2woYm9vbCBlbmFibGVkKTsKKyAgICBib29sIGlzRW5hYmxlZCgpIGNvbnN0OworCisgICAgdm9pZCAgICAgICAgICAgICBzZXRTdXNwZW5kZWQoYm9vbCBzdXNwZW5kZWQpOworICAgIGJvb2wgICAgICAgICAgICAgc3VzcGVuZGVkKCkgY29uc3Q7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGNvbW1hbmQodWludDMyX3QgY21kQ29kZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgdm9pZCAqcENtZERhdGEgX191bnVzZWQsCisgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpyZXBseVNpemUgX191bnVzZWQsCisgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEgX191bnVzZWQpIHsgcmV0dXJuIE5PX0VSUk9SOyB9OworCisgICAgdm9pZCBzZXRDYWxsYmFjayhjb25zdCBzcDxFZmZlY3RDYWxsYmFja0ludGVyZmFjZT4mIGNhbGxiYWNrKSB7IG1DYWxsYmFjayA9IGNhbGxiYWNrOyB9CisgICAgc3A8RWZmZWN0Q2FsbGJhY2tJbnRlcmZhY2U+JiAgICAgY2FsbGJhY2soKSB7IHJldHVybiBtQ2FsbGJhY2s7IH0KKworICAgIHN0YXR1c190IGFkZEhhbmRsZShFZmZlY3RIYW5kbGUgKmhhbmRsZSk7CisgICAgc3NpemVfdCBkaXNjb25uZWN0SGFuZGxlKEVmZmVjdEhhbmRsZSAqaGFuZGxlLCBib29sIHVucGluSWZMYXN0KTsKKyAgICBzc2l6ZV90IHJlbW92ZUhhbmRsZShFZmZlY3RIYW5kbGUgKmhhbmRsZSk7CisgICAgdmlydHVhbCBzc2l6ZV90IHJlbW92ZUhhbmRsZV9sKEVmZmVjdEhhbmRsZSAqaGFuZGxlKTsKKyAgICBFZmZlY3RIYW5kbGUqIGNvbnRyb2xIYW5kbGVfbCgpOworICAgIGJvb2wgcHVyZ2VIYW5kbGVzKCk7CisKKyAgICB2b2lkICAgICAgICAgICAgIGNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZChib29sIGVuYWJsZWQsIGJvb2wgdGhyZWFkTG9ja2VkKTsKKworICAgIGJvb2wgICAgICAgICAgICAgaXNQaW5uZWQoKSBjb25zdCB7IHJldHVybiBtUGlubmVkOyB9CisgICAgdm9pZCAgICAgICAgICAgICB1blBpbigpIHsgbVBpbm5lZCA9IGZhbHNlOyB9CisKKyAgICB2b2lkICAgICAgICAgICAgIGxvY2soKSB7IG1Mb2NrLmxvY2soKTsgfQorICAgIHZvaWQgICAgICAgICAgICAgdW5sb2NrKCkgeyBtTG9jay51bmxvY2soKTsgfQorCisgICAgc3RhdHVzX3QgICAgICAgICB1cGRhdGVQb2xpY3lTdGF0ZSgpOworCisgICAgdmlydHVhbCAgICAgICAgICBzcDxFZmZlY3RNb2R1bGU+IGFzRWZmZWN0TW9kdWxlKCkgeyByZXR1cm4gbnVsbHB0cjsgfQorICAgIHZpcnR1YWwgICAgICAgICAgc3A8RGV2aWNlRWZmZWN0UHJveHk+IGFzRGV2aWNlRWZmZWN0UHJveHkoKSB7IHJldHVybiBudWxscHRyOyB9CisKKyAgICB2b2lkICAgICAgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKKworcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgQXVkaW9GbGluZ2VyOyAgICAgIC8vIGZvciBtSGFuZGxlcworICAgIGJvb2wgICAgICAgICAgICAgbVBpbm5lZCA9IGZhbHNlOworCisgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEVmZmVjdEJhc2UpOworCittdXRhYmxlIE11dGV4ICAgICAgICAgICAgICAgICBtTG9jazsgICAgICAvLyBtdXRleCBmb3IgcHJvY2VzcywgY29tbWFuZHMgYW5kIGhhbmRsZXMgbGlzdCBwcm90ZWN0aW9uCisgICAgc3A8RWZmZWN0Q2FsbGJhY2tJbnRlcmZhY2U+IG1DYWxsYmFjazsgLy8gcGFyZW50IGVmZmVjdCBjaGFpbgorICAgIGNvbnN0IGludCAgICAgICAgICAgICAgICAgbUlkOyAgICAgICAgLy8gdGhpcyBpbnN0YW5jZSB1bmlxdWUgSUQKKyAgICBjb25zdCBhdWRpb19zZXNzaW9uX3QgICAgIG1TZXNzaW9uSWQ7IC8vIGF1ZGlvIHNlc3Npb24gSUQKKyAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90IG1EZXNjcmlwdG9yOy8vIGVmZmVjdCBkZXNjcmlwdG9yIHJlY2VpdmVkIGZyb20gZWZmZWN0IGVuZ2luZQorICAgIGVmZmVjdF9zdGF0ZSAgICAgICAgICAgICAgbVN0YXRlID0gSURMRTsgLy8gY3VycmVudCBhY3RpdmF0aW9uIHN0YXRlCisgICAgLy8gZWZmZWN0IGlzIHN1c3BlbmRlZDogdGVtcG9yYXJpbHkgZGlzYWJsZWQgYnkgZnJhbWV3b3JrCisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICBtU3VzcGVuZGVkID0gZmFsc2U7CisKKyAgICBWZWN0b3I8RWZmZWN0SGFuZGxlICo+ICAgIG1IYW5kbGVzOyAgIC8vIGxpc3Qgb2YgY2xpZW50IGhhbmRsZXMKKyAgICAgICAgICAgICAgICAvLyBGaXJzdCBoYW5kbGUgaW4gbUhhbmRsZXMgaGFzIGhpZ2hlc3QgcHJpb3JpdHkgYW5kIGNvbnRyb2xzIHRoZSBlZmZlY3QgbW9kdWxlCisKKyAgICAvLyBBdWRpbyBwb2xpY3kgZWZmZWN0IHN0YXRlIG1hbmFnZW1lbnQKKyAgICAvLyBNdXRleCBwcm90ZWN0aW5nIHRyYW5zYWN0aW9ucyB3aXRoIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIGFzIG1Mb2NrIGNhbm5vdAorICAgIC8vIGJlIGhlbGQgdG8gYXZvaWQgY3Jvc3MgZGVhZGxvY2tzIHdpdGggYXVkaW8gcG9saWN5IG11dGV4CisgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgICBtUG9saWN5TG9jazsKKyAgICAvLyBFZmZlY3QgaXMgcmVnaXN0ZXJlZCBpbiBBUE0gb3Igbm90CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICBtUG9saWN5UmVnaXN0ZXJlZCA9IGZhbHNlOworICAgIC8vIEVmZmVjdCBlbmFibGVkIHN0YXRlIGNvbW11bmljYXRlZCB0byBBUE0uIEVuYWJsZWQgc3RhdGUgY29ycmVzcG9uZHMgdG8KKyAgICAvLyBzdGF0ZSByZXF1ZXN0ZWQgYnkgdGhlIEVmZmVjdEhhbmRsZSB3aXRoIGNvbnRyb2wKKyAgICBib29sICAgICAgICAgICAgICAgICAgICAgIG1Qb2xpY3lFbmFibGVkID0gZmFsc2U7Cit9OworCisvLyBUaGUgRWZmZWN0TW9kdWxlIGNsYXNzIGlzIGEgd3JhcHBlciBvYmplY3QgY29udHJvbGxpbmcgdGhlIGVmZmVjdCBlbmdpbmUgaW1wbGVtZW50YXRpb24KKy8vIGluIHRoZSBlZmZlY3QgbGlicmFyeS4gSXQgcHJldmVudHMgY29uY3VycmVudCBjYWxscyB0byBwcm9jZXNzKCkgYW5kIGNvbW1hbmQoKSBmdW5jdGlvbnMKKy8vIGZyb20gZGlmZmVyZW50IGNsaWVudCB0aHJlYWRzLiBJdCBrZWVwcyBhIGxpc3Qgb2YgRWZmZWN0SGFuZGxlIG9iamVjdHMgY29ycmVzcG9uZGluZworLy8gdG8gYWxsIGNsaWVudCBhcHBsaWNhdGlvbnMgdXNpbmcgdGhpcyBlZmZlY3QgYW5kIG5vdGlmaWVzIGFwcGxpY2F0aW9ucyBvZiBlZmZlY3Qgc3RhdGUsCisvLyBjb250cm9sIG9yIHBhcmFtZXRlciBjaGFuZ2VzLiBJdCBtYW5hZ2VzIHRoZSBhY3RpdmF0aW9uIHN0YXRlIG1hY2hpbmUgdG8gc2VuZCBhcHByb3ByaWF0ZQorLy8gcmVzZXQsIGVuYWJsZSwgZGlzYWJsZSBjb21tYW5kcyB0byBlZmZlY3QgZW5naW5lIGFuZCBwcm92aWRlIHZvbHVtZQorLy8gcmFtcGluZyB3aGVuIGVmZmVjdHMgYXJlIGFjdGl2YXRlZC9kZWFjdGl2YXRlZC4KKy8vIFdoZW4gY29udHJvbGxpbmcgYW4gYXV4aWxpYXJ5IGVmZmVjdCwgdGhlIEVmZmVjdE1vZHVsZSBhbHNvIHByb3ZpZGVzIGFuIGlucHV0IGJ1ZmZlciB1c2VkIGJ5CisvLyB0aGUgYXR0YWNoZWQgdHJhY2socykgdG8gYWNjdW11bGF0ZSB0aGVpciBhdXhpbGlhcnkgY2hhbm5lbC4KK2NsYXNzIEVmZmVjdE1vZHVsZSA6IHB1YmxpYyBFZmZlY3RCYXNlIHsKK3B1YmxpYzoKKyAgICBFZmZlY3RNb2R1bGUoY29uc3Qgc3A8RWZmZWN0Q2FsbGJhY2tJbnRlcmZhY2U+JiBjYWxsYWJjaywKKyAgICAgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKKyAgICAgICAgICAgICAgICAgICAgaW50IGlkLAorICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICBib29sIHBpbm5lZCwKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZCk7CisgICAgdmlydHVhbCB+RWZmZWN0TW9kdWxlKCk7CisKICAgICB2b2lkIHByb2Nlc3MoKTsKICAgICBib29sIHVwZGF0ZVN0YXRlKCk7CiAgICAgc3RhdHVzX3QgY29tbWFuZCh1aW50MzJfdCBjbWRDb2RlLAogICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY21kU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBDbWREYXRhLAogICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKnJlcGx5U2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnBSZXBseURhdGEpOworICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcFJlcGx5RGF0YSkgb3ZlcnJpZGU7CiAKICAgICB2b2lkIHJlc2V0X2woKTsKICAgICBzdGF0dXNfdCBjb25maWd1cmUoKTsKICAgICBzdGF0dXNfdCBpbml0KCk7Ci0gICAgZWZmZWN0X3N0YXRlIHN0YXRlKCkgY29uc3QgewotICAgICAgICByZXR1cm4gbVN0YXRlOwotICAgIH0KKwogICAgIHVpbnQzMl90IHN0YXR1cygpIHsKICAgICAgICAgcmV0dXJuIG1TdGF0dXM7CiAgICAgfQotICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbklkOwotICAgIH0KLSAgICBzdGF0dXNfdCAgICBzZXRFbmFibGVkKGJvb2wgZW5hYmxlZCk7Ci0gICAgc3RhdHVzX3QgICAgc2V0RW5hYmxlZF9sKGJvb2wgZW5hYmxlZCk7Ci0gICAgYm9vbCBpc0VuYWJsZWQoKSBjb25zdDsKKwogICAgIGJvb2wgaXNQcm9jZXNzRW5hYmxlZCgpIGNvbnN0OwogICAgIGJvb2wgaXNPZmZsb2FkZWRPckRpcmVjdCgpIGNvbnN0OwogICAgIGJvb2wgaXNWb2x1bWVDb250cm9sRW5hYmxlZCgpIGNvbnN0OwpAQCAtOTYsNTQgKzIzOSwyOCBAQAogICAgIGludDE2X3QgICAgICpvdXRCdWZmZXIoKSBjb25zdCB7CiAgICAgICAgIHJldHVybiBtT3V0QnVmZmVyICE9IDAgPyByZWludGVycHJldF9jYXN0PGludDE2X3QqPihtT3V0QnVmZmVyLT5wdHIoKSkgOiBOVUxMOwogICAgIH0KLSAgICB2b2lkICAgICAgICBzZXRDaGFpbihjb25zdCB3cDxFZmZlY3RDaGFpbj4mIGNoYWluKSB7IG1DaGFpbiA9IGNoYWluOyB9Ci0gICAgdm9pZCAgICAgICAgc2V0VGhyZWFkKGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQpCi0gICAgICAgICAgICAgICAgICAgIHsgbVRocmVhZCA9IHRocmVhZDsgbVRocmVhZFR5cGUgPSB0aHJlYWQucHJvbW90ZSgpLT50eXBlKCk7IH0KLSAgICBjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkKCkgeyByZXR1cm4gbVRocmVhZDsgfQogCi0gICAgc3RhdHVzX3QgYWRkSGFuZGxlKEVmZmVjdEhhbmRsZSAqaGFuZGxlKTsKLSAgICBzc2l6ZV90ICBkaXNjb25uZWN0SGFuZGxlKEVmZmVjdEhhbmRsZSAqaGFuZGxlLCBib29sIHVucGluSWZMYXN0KTsKLSAgICBzc2l6ZV90IHJlbW92ZUhhbmRsZShFZmZlY3RIYW5kbGUgKmhhbmRsZSk7Ci0gICAgc3NpemVfdCByZW1vdmVIYW5kbGVfbChFZmZlY3RIYW5kbGUgKmhhbmRsZSk7CisgICAgc3NpemVfdCByZW1vdmVIYW5kbGVfbChFZmZlY3RIYW5kbGUgKmhhbmRsZSkgb3ZlcnJpZGU7CiAKLSAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90JiBkZXNjKCkgY29uc3QgeyByZXR1cm4gbURlc2NyaXB0b3I7IH0KLSAgICB3cDxFZmZlY3RDaGFpbj4mICAgICBjaGFpbigpIHsgcmV0dXJuIG1DaGFpbjsgfQotCi0gICAgc3RhdHVzX3QgICAgICAgICBzZXREZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisgICAgc3RhdHVzX3QgICAgICAgICBzZXREZXZpY2VzKGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgJmRldmljZXMpOworICAgIHN0YXR1c190ICAgICAgICAgc2V0SW5wdXREZXZpY2UoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKTsKICAgICBzdGF0dXNfdCAgICAgICAgIHNldFZvbHVtZSh1aW50MzJfdCAqbGVmdCwgdWludDMyX3QgKnJpZ2h0LCBib29sIGNvbnRyb2xsZXIpOwogICAgIHN0YXR1c190ICAgICAgICAgc2V0TW9kZShhdWRpb19tb2RlX3QgbW9kZSk7CiAgICAgc3RhdHVzX3QgICAgICAgICBzZXRBdWRpb1NvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpOwogICAgIHN0YXR1c190ICAgICAgICAgc3RhcnQoKTsKICAgICBzdGF0dXNfdCAgICAgICAgIHN0b3AoKTsKLSAgICB2b2lkICAgICAgICAgICAgIHNldFN1c3BlbmRlZChib29sIHN1c3BlbmRlZCk7Ci0gICAgYm9vbCAgICAgICAgICAgICBzdXNwZW5kZWQoKSBjb25zdDsKIAotICAgIEVmZmVjdEhhbmRsZSogICAgY29udHJvbEhhbmRsZV9sKCk7Ci0KLSAgICBib29sICAgICAgICAgICAgIGlzUGlubmVkKCkgY29uc3QgeyByZXR1cm4gbVBpbm5lZDsgfQotICAgIHZvaWQgICAgICAgICAgICAgdW5QaW4oKSB7IG1QaW5uZWQgPSBmYWxzZTsgfQotICAgIGJvb2wgICAgICAgICAgICAgcHVyZ2VIYW5kbGVzKCk7Ci0gICAgdm9pZCAgICAgICAgICAgICBsb2NrKCkgeyBtTG9jay5sb2NrKCk7IH0KLSAgICB2b2lkICAgICAgICAgICAgIHVubG9jaygpIHsgbUxvY2sudW5sb2NrKCk7IH0KLSAgICBib29sICAgICAgICAgICAgIGlzT2ZmbG9hZGFibGUoKSBjb25zdAotICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfT0ZGTE9BRF9TVVBQT1JURUQpICE9IDA7IH0KLSAgICBib29sICAgICAgICAgICAgIGlzSW1wbGVtZW50YXRpb25Tb2Z0d2FyZSgpIGNvbnN0Ci0gICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAobURlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19IV19BQ0NfTUFTSykgPT0gMDsgfQotICAgIGJvb2wgICAgICAgICAgICAgaXNQcm9jZXNzSW1wbGVtZW50ZWQoKSBjb25zdAotICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1EZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfTk9fUFJPQ0VTUykgPT0gMDsgfQotICAgIGJvb2wgICAgICAgICAgICAgaXNWb2x1bWVDb250cm9sKCkgY29uc3QKLSAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIChtRGVzY3JpcHRvci5mbGFncyAmIEVGRkVDVF9GTEFHX1ZPTFVNRV9NQVNLKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IEVGRkVDVF9GTEFHX1ZPTFVNRV9DVFJMOyB9CiAgICAgc3RhdHVzX3QgICAgICAgICBzZXRPZmZsb2FkZWQoYm9vbCBvZmZsb2FkZWQsIGF1ZGlvX2lvX2hhbmRsZV90IGlvKTsKICAgICBib29sICAgICAgICAgICAgIGlzT2ZmbG9hZGVkKCkgY29uc3Q7CiAgICAgdm9pZCAgICAgICAgICAgICBhZGRFZmZlY3RUb0hhbF9sKCk7CiAgICAgdm9pZCAgICAgICAgICAgICByZWxlYXNlX2woKTsKIAorICAgIHNwPEVmZmVjdE1vZHVsZT4gYXNFZmZlY3RNb2R1bGUoKSBvdmVycmlkZSB7IHJldHVybiB0aGlzOyB9CisKICAgICB2b2lkICAgICAgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgQXVkaW9GbGluZ2VyOyAgICAgIC8vIGZvciBtSGFuZGxlcwotICAgIGJvb2wgICAgICAgICAgICAgICAgbVBpbm5lZDsKIAogICAgIC8vIE1heGltdW0gdGltZSBhbGxvY2F0ZWQgdG8gZWZmZWN0IGVuZ2luZXMgdG8gY29tcGxldGUgdGhlIHR1cm4gb2ZmIHNlcXVlbmNlCiAgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IE1BWF9ESVNBQkxFX1RJTUVfTVMgPSAxMDAwMDsKQEAgLTE1MiwyOSArMjY5LDE5IEBACiAKICAgICBzdGF0dXNfdCBzdGFydF9sKCk7CiAgICAgc3RhdHVzX3Qgc3RvcF9sKCk7Ci0gICAgc3RhdHVzX3QgcmVtb3ZlX2VmZmVjdF9mcm9tX2hhbF9sKCk7CisgICAgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0RnJvbUhhbF9sKCk7CisgICAgc3RhdHVzX3Qgc2VuZFNldEF1ZGlvRGV2aWNlc0NvbW1hbmQoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciAmZGV2aWNlcywgdWludDMyX3QgY21kQ29kZSk7CiAKLW11dGFibGUgTXV0ZXggICAgICAgICAgICAgICBtTG9jazsgICAgICAvLyBtdXRleCBmb3IgcHJvY2VzcywgY29tbWFuZHMgYW5kIGhhbmRsZXMgbGlzdCBwcm90ZWN0aW9uCi0gICAgd3A8VGhyZWFkQmFzZT4gICAgICBtVGhyZWFkOyAgICAvLyBwYXJlbnQgdGhyZWFkCi0gICAgVGhyZWFkQmFzZTo6dHlwZV90ICBtVGhyZWFkVHlwZTsgLy8gcGFyZW50IHRocmVhZCB0eXBlCi0gICAgd3A8RWZmZWN0Q2hhaW4+ICAgICBtQ2hhaW47ICAgICAvLyBwYXJlbnQgZWZmZWN0IGNoYWluCi0gICAgY29uc3QgaW50ICAgICAgICAgICBtSWQ7ICAgICAgICAvLyB0aGlzIGluc3RhbmNlIHVuaXF1ZSBJRAotICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbklkOyAvLyBhdWRpbyBzZXNzaW9uIElECi0gICAgY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCBtRGVzY3JpcHRvcjsvLyBlZmZlY3QgZGVzY3JpcHRvciByZWNlaXZlZCBmcm9tIGVmZmVjdCBlbmdpbmUKICAgICBlZmZlY3RfY29uZmlnX3QgICAgIG1Db25maWc7ICAgIC8vIGlucHV0IGFuZCBvdXRwdXQgYXVkaW8gY29uZmlndXJhdGlvbgogICAgIHNwPEVmZmVjdEhhbEludGVyZmFjZT4gbUVmZmVjdEludGVyZmFjZTsgLy8gRWZmZWN0IG1vZHVsZSBIQUwKICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+IG1JbkJ1ZmZlcjsgIC8vIEJ1ZmZlcnMgZm9yIGludGVyYWN0aW5nIHdpdGggSEFMCiAgICAgc3A8RWZmZWN0QnVmZmVySGFsSW50ZXJmYWNlPiBtT3V0QnVmZmVyOwogICAgIHN0YXR1c190ICAgICAgICAgICAgbVN0YXR1czsgICAgLy8gaW5pdGlhbGl6YXRpb24gc3RhdHVzCi0gICAgZWZmZWN0X3N0YXRlICAgICAgICBtU3RhdGU7ICAgICAvLyBjdXJyZW50IGFjdGl2YXRpb24gc3RhdGUKLSAgICBWZWN0b3I8RWZmZWN0SGFuZGxlICo+IG1IYW5kbGVzOyAgICAvLyBsaXN0IG9mIGNsaWVudCBoYW5kbGVzCiAgICAgICAgICAgICAgICAgLy8gRmlyc3QgaGFuZGxlIGluIG1IYW5kbGVzIGhhcyBoaWdoZXN0IHByaW9yaXR5IGFuZCBjb250cm9scyB0aGUgZWZmZWN0IG1vZHVsZQogICAgIHVpbnQzMl90IG1NYXhEaXNhYmxlV2FpdENudDsgICAgLy8gbWF4aW11bSBncmFjZSBwZXJpb2QgYmVmb3JlIGZvcmNpbmcgYW4gZWZmZWN0IG9mZiBhZnRlcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VuZGluZyBkaXNhYmxlIGNvbW1hbmQuCiAgICAgdWludDMyX3QgbURpc2FibGVXYWl0Q250OyAgICAgICAvLyBjdXJyZW50IHByb2Nlc3MoKSBjYWxscyBjb3VudCBkdXJpbmcgZGlzYWJsZSBwZXJpb2QuCi0gICAgYm9vbCAgICAgbVN1c3BlbmRlZDsgICAgICAgICAgICAvLyBlZmZlY3QgaXMgc3VzcGVuZGVkOiB0ZW1wb3JhcmlseSBkaXNhYmxlZCBieSBmcmFtZXdvcmsKICAgICBib29sICAgICBtT2ZmbG9hZGVkOyAgICAgICAgICAgIC8vIGVmZmVjdCBpcyBjdXJyZW50bHkgb2ZmbG9hZGVkIHRvIHRoZSBhdWRpbyBEU1AKLSAgICB3cDxBdWRpb0ZsaW5nZXI+ICAgIG1BdWRpb0ZsaW5nZXI7CiAKICNpZmRlZiBGTE9BVF9FRkZFQ1RfQ0hBSU4KICAgICBib29sICAgIG1TdXBwb3J0c0Zsb2F0OyAgICAgICAgIC8vIGVmZmVjdCBzdXBwb3J0cyBmbG9hdCBwcm9jZXNzaW5nCkBAIC0yMTIsNyArMzE5LDcgQEAKIGNsYXNzIEVmZmVjdEhhbmRsZTogcHVibGljIGFuZHJvaWQ6OkJuRWZmZWN0IHsKIHB1YmxpYzoKIAotICAgIEVmZmVjdEhhbmRsZShjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QsCisgICAgRWZmZWN0SGFuZGxlKGNvbnN0IHNwPEVmZmVjdEJhc2U+JiBlZmZlY3QsCiAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgIGNvbnN0IHNwPElFZmZlY3RDbGllbnQ+JiBlZmZlY3RDbGllbnQsCiAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5KTsKQEAgLTI1MCw5ICszNTcsOSBAQAogICAgIGJvb2wgZW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIG1FbmFibGVkOyB9CiAKICAgICAvLyBHZXR0ZXJzCi0gICAgd3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QoKSBjb25zdCB7IHJldHVybiBtRWZmZWN0OyB9CisgICAgd3A8RWZmZWN0QmFzZT4gZWZmZWN0KCkgY29uc3QgeyByZXR1cm4gbUVmZmVjdDsgfQogICAgIGludCBpZCgpIGNvbnN0IHsKLSAgICAgICAgc3A8RWZmZWN0TW9kdWxlPiBlZmZlY3QgPSBtRWZmZWN0LnByb21vdGUoKTsKKyAgICAgICAgc3A8RWZmZWN0QmFzZT4gZWZmZWN0ID0gbUVmZmVjdC5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChlZmZlY3QgPT0gMCkgewogICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgIH0KQEAgLTI2OSw3ICszNzYsNyBAQAogICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihFZmZlY3RIYW5kbGUpOwogCiAgICAgTXV0ZXggbUxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvdGVjdHMgSUVmZmVjdCBtZXRob2QgY2FsbHMKLSAgICB3cDxFZmZlY3RNb2R1bGU+IG1FZmZlY3Q7ICAgICAgICAgICAvLyBwb2ludGVyIHRvIGNvbnRyb2xsZWQgRWZmZWN0TW9kdWxlCisgICAgd3A8RWZmZWN0QmFzZT4gbUVmZmVjdDsgICAgICAgICAgIC8vIHBvaW50ZXIgdG8gY29udHJvbGxlZCBFZmZlY3RNb2R1bGUKICAgICBzcDxJRWZmZWN0Q2xpZW50PiBtRWZmZWN0Q2xpZW50OyAgICAvLyBjYWxsYmFjayBpbnRlcmZhY2UgZm9yIGNsaWVudCBub3RpZmljYXRpb25zCiAgICAgLypjb25zdCovIHNwPENsaWVudD4gbUNsaWVudDsgICAgICAgLy8gY2xpZW50IGZvciBzaGFyZWQgbWVtb3J5IGFsbG9jYXRpb24sIHNlZSBkaXNjb25uZWN0KCkKICAgICBzcDxJTWVtb3J5PiAgICAgICAgIG1DYmxrTWVtb3J5OyAgICAvLyBzaGFyZWQgbWVtb3J5IGZvciBjb250cm9sIGJsb2NrCkBAIC0zMTYsNyArNDIzLDYgQEAKICAgICB9CiAKICAgICBzdGF0dXNfdCBjcmVhdGVFZmZlY3RfbChzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhyZWFkQmFzZSAqdGhyZWFkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCkBAIC0zMzEsMTAgKzQzNywxMiBAQAogICAgIHNwPEVmZmVjdE1vZHVsZT4gZ2V0RWZmZWN0RnJvbURlc2NfbChlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9yKTsKICAgICBzcDxFZmZlY3RNb2R1bGU+IGdldEVmZmVjdEZyb21JZF9sKGludCBpZCk7CiAgICAgc3A8RWZmZWN0TW9kdWxlPiBnZXRFZmZlY3RGcm9tVHlwZV9sKGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUpOworICAgIHN0ZDo6dmVjdG9yPGludD4gZ2V0RWZmZWN0SWRzKCk7CiAgICAgLy8gRklYTUUgdXNlIGZsb2F0IHRvIGltcHJvdmUgdGhlIGR5bmFtaWMgcmFuZ2UKICAgICBib29sIHNldFZvbHVtZV9sKHVpbnQzMl90ICpsZWZ0LCB1aW50MzJfdCAqcmlnaHQsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CiAgICAgdm9pZCByZXNldFZvbHVtZV9sKCk7Ci0gICAgdm9pZCBzZXREZXZpY2VfbChhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICB2b2lkIHNldERldmljZXNfbChjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yICZkZXZpY2VzKTsKKyAgICB2b2lkIHNldElucHV0RGV2aWNlX2woY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKTsKICAgICB2b2lkIHNldE1vZGVfbChhdWRpb19tb2RlX3QgbW9kZSk7CiAgICAgdm9pZCBzZXRBdWRpb1NvdXJjZV9sKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CiAKQEAgLTM3MCw5ICs0NzgsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kKTsKICAgICAvLyBzdXNwZW5kIGFsbCBlbGlnaWJsZSBlZmZlY3RzCiAgICAgdm9pZCBzZXRFZmZlY3RTdXNwZW5kZWRBbGxfbChib29sIHN1c3BlbmQpOwotICAgIC8vIGNoZWNrIGlmIGVmZmVjdHMgc2hvdWxkIGJlIHN1c3BlbmQgb3IgcmVzdG9yZWQgd2hlbiBhIGdpdmVuIGVmZmVjdCBpcyBlbmFibGUgb3IgZGlzYWJsZWQKLSAgICB2b2lkIGNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZChjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZWQpOworICAgIC8vIGNoZWNrIGlmIGVmZmVjdHMgc2hvdWxkIGJlIHN1c3BlbmRlZCBvciByZXN0b3JlZCB3aGVuIGEgZ2l2ZW4gZWZmZWN0IGlzIGVuYWJsZSBvciBkaXNhYmxlZAorICAgIHZvaWQgY2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCwgYm9vbCBlbmFibGVkKTsKIAogICAgIHZvaWQgY2xlYXJJbnB1dEJ1ZmZlcigpOwogCkBAIC0zOTcsOSArNTA0LDYwIEBACiAgICAgLy8gaXNDb21wYXRpYmxlV2l0aFRocmVhZF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCB0aHJlYWQtPm1Mb2NrIGhlbGQKICAgICBib29sIGlzQ29tcGF0aWJsZVdpdGhUaHJlYWRfbChjb25zdCBzcDxUaHJlYWRCYXNlPiYgdGhyZWFkKSBjb25zdDsKIAorICAgIHNwPEVmZmVjdENhbGxiYWNrSW50ZXJmYWNlPiBlZmZlY3RDYWxsYmFjaygpIGNvbnN0IHsgcmV0dXJuIG1FZmZlY3RDYWxsYmFjazsgfQorICAgIHdwPFRocmVhZEJhc2U+IHRocmVhZCgpIGNvbnN0IHsgcmV0dXJuIG1FZmZlY3RDYWxsYmFjay0+dGhyZWFkKCk7IH0KKwogICAgIHZvaWQgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiBwcml2YXRlOgorCisgICAgY2xhc3MgRWZmZWN0Q2FsbGJhY2sgOiAgcHVibGljIEVmZmVjdENhbGxiYWNrSW50ZXJmYWNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIEVmZmVjdENhbGxiYWNrKEVmZmVjdENoYWluICpjaGFpbiwgVGhyZWFkQmFzZSAqdGhyZWFkLCBBdWRpb0ZsaW5nZXIgKmF1ZGlvRmxpbmdlcikKKyAgICAgICAgICAgIDogbUNoYWluKGNoYWluKSwgbVRocmVhZCh0aHJlYWQpLCBtQXVkaW9GbGluZ2VyKGF1ZGlvRmxpbmdlcikge30KKworICAgICAgICBzdGF0dXNfdCBjcmVhdGVFZmZlY3RIYWwoY29uc3QgZWZmZWN0X3V1aWRfdCAqcEVmZmVjdFV1aWQsCisgICAgICAgICAgICAgICBpbnQzMl90IHNlc3Npb25JZCwgaW50MzJfdCBkZXZpY2VJZCwgc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiAqZWZmZWN0KSBvdmVycmlkZTsKKyAgICAgICAgc3RhdHVzX3QgYWxsb2NhdGVIYWxCdWZmZXIoc2l6ZV90IHNpemUsIHNwPEVmZmVjdEJ1ZmZlckhhbEludGVyZmFjZT4qIGJ1ZmZlcikgb3ZlcnJpZGU7CisgICAgICAgIGJvb2wgdXBkYXRlT3JwaGFuRWZmZWN0Q2hhaW5zKGNvbnN0IHNwPEVmZmVjdEJhc2U+JiBlZmZlY3QpIG92ZXJyaWRlOworCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgIGJvb2wgaXNPdXRwdXQoKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgYm9vbCBpc09mZmxvYWQoKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgYm9vbCBpc09mZmxvYWRPckRpcmVjdCgpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICBib29sIGlzT2ZmbG9hZE9yTW1hcCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUoKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2soKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgIHNpemVfdCBmcmFtZUNvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgIHVpbnQzMl90IGxhdGVuY3koKSBjb25zdCBvdmVycmlkZTsKKworICAgICAgICBzdGF0dXNfdCBhZGRFZmZlY3RUb0hhbChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgb3ZlcnJpZGU7CisgICAgICAgIHN0YXR1c190IHJlbW92ZUVmZmVjdEZyb21IYWwoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpIG92ZXJyaWRlOworICAgICAgICBib29sIGRpc2Nvbm5lY3RFZmZlY3RIYW5kbGUoRWZmZWN0SGFuZGxlICpoYW5kbGUsIGJvb2wgdW5waW5JZkxhc3QpIG92ZXJyaWRlOworICAgICAgICB2b2lkIHNldFZvbHVtZUZvck91dHB1dChmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAgICAgLy8gY2hlY2sgaWYgZWZmZWN0cyBzaG91bGQgYmUgc3VzcGVuZGVkL3Jlc3RvcmVkIHdoZW4gYSBnaXZlbiBlZmZlY3QgaXMgZW5hYmxlL2Rpc2FibGVkCisgICAgICAgIHZvaWQgY2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdEJhc2U+JiBlZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZWQsIGJvb2wgdGhyZWFkTG9ja2VkKSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCByZXNldFZvbHVtZSgpIG92ZXJyaWRlOworICAgICAgICB1aW50MzJfdCBzdHJhdGVneSgpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICBpbnQzMl90IGFjdGl2ZVRyYWNrQ250KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgIHZvaWQgb25FZmZlY3RFbmFibGUoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCkgb3ZlcnJpZGU7CisgICAgICAgIHZvaWQgb25FZmZlY3REaXNhYmxlKGNvbnN0IHNwPEVmZmVjdEJhc2U+JiBlZmZlY3QpIG92ZXJyaWRlOworCisgICAgICAgIHdwPEVmZmVjdENoYWluPiBjaGFpbigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1DaGFpbjsgfQorCisgICAgICAgIHdwPFRocmVhZEJhc2U+IHRocmVhZCgpIHsgcmV0dXJuIG1UaHJlYWQ7IH0KKyAgICAgICAgdm9pZCBzZXRUaHJlYWQoVGhyZWFkQmFzZSAqdGhyZWFkKSB7IG1UaHJlYWQgPSB0aHJlYWQ7IH07CisKKyAgICBwcml2YXRlOgorICAgICAgICB3cDxFZmZlY3RDaGFpbj4gbUNoYWluOworICAgICAgICB3cDxUaHJlYWRCYXNlPiBtVGhyZWFkOworICAgICAgICB3cDxBdWRpb0ZsaW5nZXI+IG1BdWRpb0ZsaW5nZXI7CisgICAgfTsKKwogICAgIGZyaWVuZCBjbGFzcyBBdWRpb0ZsaW5nZXI7ICAvLyBmb3IgbVRocmVhZCwgbUVmZmVjdHMKICAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRWZmZWN0Q2hhaW4pOwogCkBAIC00MjUsMTMgKzU4MywxMiBAQAogCiAgICAgc3RhdGljIGJvb2wgaXNFZmZlY3RFbGlnaWJsZUZvckJ0TnJlY1N1c3BlbmQoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSk7CiAKLSAgICB2b2lkIGNsZWFySW5wdXRCdWZmZXJfbChjb25zdCBzcDxUaHJlYWRCYXNlPiYgdGhyZWFkKTsKKyAgICB2b2lkIGNsZWFySW5wdXRCdWZmZXJfbCgpOwogCiAgICAgdm9pZCBzZXRUaHJlYWQoY29uc3Qgc3A8VGhyZWFkQmFzZT4mIHRocmVhZCk7CiAKICAgICB2b2lkIHNldFZvbHVtZUZvck91dHB1dF9sKHVpbnQzMl90IGxlZnQsIHVpbnQzMl90IHJpZ2h0KTsKIAotICAgICAgICAgICAgIHdwPFRocmVhZEJhc2U+IG1UaHJlYWQ7ICAgICAvLyBwYXJlbnQgbWl4ZXIgdGhyZWFkCiAgICAgbXV0YWJsZSAgTXV0ZXggbUxvY2s7ICAgICAgICAvLyBtdXRleCBwcm90ZWN0aW5nIGVmZmVjdCBsaXN0CiAgICAgICAgICAgICAgVmVjdG9yPCBzcDxFZmZlY3RNb2R1bGU+ID4gbUVmZmVjdHM7IC8vIGxpc3Qgb2YgZWZmZWN0IG1vZHVsZXMKICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgbVNlc3Npb25JZDsgLy8gYXVkaW8gc2Vzc2lvbiBJRApAQCAtNDU1LDQgKzYxMiw5OSBAQAogICAgICAgICAgICAgIC8vIHRpbWVMb3cgZmllbGRzIGFtb25nIGVmZmVjdCB0eXBlIFVVSURzLgogICAgICAgICAgICAgIC8vIFVwZGF0ZWQgYnkgc2V0RWZmZWN0U3VzcGVuZGVkX2woKSBhbmQgc2V0RWZmZWN0U3VzcGVuZGVkQWxsX2woKSBvbmx5LgogICAgICAgICAgICAgIEtleWVkVmVjdG9yPCBpbnQsIHNwPFN1c3BlbmRlZEVmZmVjdERlc2M+ID4gbVN1c3BlbmRlZEVmZmVjdHM7CisKKyAgICAgICAgICAgICBjb25zdCBzcDxFZmZlY3RDYWxsYmFjaz4gbUVmZmVjdENhbGxiYWNrOworfTsKKworY2xhc3MgRGV2aWNlRWZmZWN0UHJveHkgOiBwdWJsaWMgRWZmZWN0QmFzZSB7CitwdWJsaWM6CisgICAgICAgIERldmljZUVmZmVjdFByb3h5IChjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBkZXZpY2UsCisgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRWZmZWN0TWFuYWdlckNhbGxiYWNrPiYgY2FsbGJhY2ssCisgICAgICAgICAgICAgICAgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywgaW50IGlkKQorICAgICAgICAgICAgOiBFZmZlY3RCYXNlKGNhbGxiYWNrLCBkZXNjLCBpZCwgQVVESU9fU0VTU0lPTl9ERVZJQ0UsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICBtRGV2aWNlKGRldmljZSksIG1NYW5hZ2VyQ2FsbGJhY2soY2FsbGJhY2spLAorICAgICAgICAgICAgICAgIG1NeUNhbGxiYWNrKG5ldyBQcm94eUNhbGxiYWNrKHRoaXMsIGNhbGxiYWNrKSkge30KKworICAgIHN0YXR1c190IHNldEVuYWJsZWQoYm9vbCBlbmFibGVkLCBib29sIGZyb21IYW5kbGUpIG92ZXJyaWRlOworICAgIHNwPERldmljZUVmZmVjdFByb3h5PiBhc0RldmljZUVmZmVjdFByb3h5KCkgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQorCisgICAgc3RhdHVzX3QgaW5pdChjb25zdCBzdGQ6Om1hcDxhdWRpb19wYXRjaF9oYW5kbGVfdCwgUGF0Y2hQYW5lbDo6UGF0Y2g+JiBwYXRjaGVzKTsKKyAgICBzdGF0dXNfdCBvbkNyZWF0ZVBhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLCBjb25zdCBQYXRjaFBhbmVsOjpQYXRjaCYgcGF0Y2gpOworICAgIHZvaWQgb25SZWxlYXNlUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOworCisgICAgc2l6ZV90IHJlbW92ZUVmZmVjdChjb25zdCBzcDxFZmZlY3RNb2R1bGU+JiBlZmZlY3QpOworCisgICAgc3RhdHVzX3QgYWRkRWZmZWN0VG9IYWwoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOworICAgIHN0YXR1c190IHJlbW92ZUVmZmVjdEZyb21IYWwoc3A8RWZmZWN0SGFsSW50ZXJmYWNlPiBlZmZlY3QpOworCisgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciYgZGV2aWNlKCkgeyByZXR1cm4gbURldmljZTsgfTsKKyAgICBib29sIGlzT3V0cHV0KCkgY29uc3Q7CisgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSgpIGNvbnN0OworICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3Q7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50KCkgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKTsKKworcHJpdmF0ZToKKworICAgIGNsYXNzIFByb3h5Q2FsbGJhY2sgOiAgcHVibGljIEVmZmVjdENhbGxiYWNrSW50ZXJmYWNlIHsKKyAgICBwdWJsaWM6CisgICAgICAgICAgICAgICAgUHJveHlDYWxsYmFjayhEZXZpY2VFZmZlY3RQcm94eSAqcHJveHksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VFZmZlY3RNYW5hZ2VyQ2FsbGJhY2s+JiBjYWxsYmFjaykKKyAgICAgICAgICAgICAgICAgICAgOiBtUHJveHkocHJveHkpLCBtTWFuYWdlckNhbGxiYWNrKGNhbGxiYWNrKSB7fQorCisgICAgICAgIHN0YXR1c190IGNyZWF0ZUVmZmVjdEhhbChjb25zdCBlZmZlY3RfdXVpZF90ICpwRWZmZWN0VXVpZCwKKyAgICAgICAgICAgICAgIGludDMyX3Qgc2Vzc2lvbklkLCBpbnQzMl90IGRldmljZUlkLCBzcDxFZmZlY3RIYWxJbnRlcmZhY2U+ICplZmZlY3QpIG92ZXJyaWRlOworICAgICAgICBzdGF0dXNfdCBhbGxvY2F0ZUhhbEJ1ZmZlcihzaXplX3Qgc2l6ZSBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICBzcDxFZmZlY3RCdWZmZXJIYWxJbnRlcmZhY2U+KiBidWZmZXIgX191bnVzZWQpIG92ZXJyaWRlIHsgcmV0dXJuIE5PX0VSUk9SOyB9CisgICAgICAgIGJvb2wgdXBkYXRlT3JwaGFuRWZmZWN0Q2hhaW5zKGNvbnN0IHNwPEVmZmVjdEJhc2U+JiBlZmZlY3QgX191bnVzZWQpIG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW8oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsgfQorICAgICAgICBib29sIGlzT3V0cHV0KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgIGJvb2wgaXNPZmZsb2FkKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgYm9vbCBpc09mZmxvYWRPckRpcmVjdCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisgICAgICAgIGJvb2wgaXNPZmZsb2FkT3JNbWFwKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKworICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCgpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICBzaXplX3QgZnJhbWVDb3VudCgpIGNvbnN0IG92ZXJyaWRlICB7IHJldHVybiAwOyB9CisgICAgICAgIHVpbnQzMl90IGxhdGVuY3koKSBjb25zdCBvdmVycmlkZSAgeyByZXR1cm4gMDsgfQorCisgICAgICAgIHN0YXR1c190IGFkZEVmZmVjdFRvSGFsKHNwPEVmZmVjdEhhbEludGVyZmFjZT4gZWZmZWN0KSBvdmVycmlkZTsKKyAgICAgICAgc3RhdHVzX3QgcmVtb3ZlRWZmZWN0RnJvbUhhbChzcDxFZmZlY3RIYWxJbnRlcmZhY2U+IGVmZmVjdCkgb3ZlcnJpZGU7CisKKyAgICAgICAgYm9vbCBkaXNjb25uZWN0RWZmZWN0SGFuZGxlKEVmZmVjdEhhbmRsZSAqaGFuZGxlLCBib29sIHVucGluSWZMYXN0KSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCBzZXRWb2x1bWVGb3JPdXRwdXQoZmxvYXQgbGVmdCBfX3VudXNlZCwgZmxvYXQgcmlnaHQgX191bnVzZWQpIGNvbnN0IG92ZXJyaWRlIHt9CisKKyAgICAgICAgdm9pZCBjaGVja1N1c3BlbmRPbkVmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCBfX3VudXNlZCwgYm9vbCB0aHJlYWRMb2NrZWQgX191bnVzZWQpIG92ZXJyaWRlIHt9CisgICAgICAgIHZvaWQgcmVzZXRWb2x1bWUoKSBvdmVycmlkZSB7fQorICAgICAgICB1aW50MzJfdCBzdHJhdGVneSgpIGNvbnN0IG92ZXJyaWRlICB7IHJldHVybiAwOyB9CisgICAgICAgIGludDMyX3QgYWN0aXZlVHJhY2tDbnQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAwOyB9CisgICAgICAgIHZvaWQgb25FZmZlY3RFbmFibGUoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCBfX3VudXNlZCkgb3ZlcnJpZGUge30KKyAgICAgICAgdm9pZCBvbkVmZmVjdERpc2FibGUoY29uc3Qgc3A8RWZmZWN0QmFzZT4mIGVmZmVjdCBfX3VudXNlZCkgb3ZlcnJpZGUge30KKworICAgICAgICB3cDxFZmZlY3RDaGFpbj4gY2hhaW4oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBudWxscHRyOyB9CisKKyAgICAgICAgaW50IG5ld0VmZmVjdElkKCk7CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCB3cDxEZXZpY2VFZmZlY3RQcm94eT4gbVByb3h5OworICAgICAgICBjb25zdCBzcDxEZXZpY2VFZmZlY3RNYW5hZ2VyQ2FsbGJhY2s+IG1NYW5hZ2VyQ2FsbGJhY2s7CisgICAgfTsKKworICAgIHN0YXR1c190IGNoZWNrUG9ydChjb25zdCBQYXRjaFBhbmVsOjpQYXRjaCYgcGF0Y2gsIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqcG9ydCwKKyAgICAgICAgICAgIHNwPEVmZmVjdEhhbmRsZT4gKmhhbmRsZSk7CisKKyAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyIG1EZXZpY2U7CisgICAgY29uc3Qgc3A8RGV2aWNlRWZmZWN0TWFuYWdlckNhbGxiYWNrPiBtTWFuYWdlckNhbGxiYWNrOworICAgIGNvbnN0IHNwPFByb3h5Q2FsbGJhY2s+IG1NeUNhbGxiYWNrOworCisgICAgTXV0ZXggbVByb3h5TG9jazsKKyAgICBzdGQ6Om1hcDxhdWRpb19wYXRjaF9oYW5kbGVfdCwgc3A8RWZmZWN0SGFuZGxlPj4gbUVmZmVjdEhhbmRsZXM7IC8vIHByb3RlY3RlZCBieSBtUHJveHlMb2NrCisgICAgc3A8RWZmZWN0TW9kdWxlPiBtSGFsRWZmZWN0OyAvLyBwcm90ZWN0ZWQgYnkgbVByb3h5TG9jaworICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBtRGV2aWNlUG9ydCA9IHsgLmlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSB9OwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmUuY3BwCmluZGV4IGQwNjM3NzIuLmRkODRiZjIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlLmNwcApAQCAtMjAsNiArMjAsNyBAQAogI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQVVESU8KIAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KICNpbmNsdWRlIDxsaW51eC9mdXRleC5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9CdWZmZXJQcm92aWRlci5oPgpAQCAtMTYxLDcgKzE2MiwyMSBAQAogICAgIGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RDYXB0dXJlU3RhdGUgKikgbUN1cnJlbnQ7CiAgICAgRmFzdENhcHR1cmVEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdENhcHR1cmVEdW1wU3RhdGUgKikgbUR1bXBTdGF0ZTsKICAgICBjb25zdCBGYXN0Q2FwdHVyZVN0YXRlOjpDb21tYW5kIGNvbW1hbmQgPSBtQ29tbWFuZDsKLSAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OworICAgIHNpemVfdCBmcmFtZUNvdW50ID0gY3VycmVudC0+bUZyYW1lQ291bnQ7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlciogZmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXIgPSBjdXJyZW50LT5tRmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXI7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyIHBhdGNoQnVmZmVyOworCisgICAgaWYgKGZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyICE9IDApIHsKKyAgICAgICAgcGF0Y2hCdWZmZXIuZnJhbWVDb3VudCA9IH4wOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmcGF0Y2hCdWZmZXIpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBmcmFtZUNvdW50ID0gMDsKKyAgICAgICAgfSBlbHNlIGlmIChwYXRjaEJ1ZmZlci5mcmFtZUNvdW50IDwgZnJhbWVDb3VudCkgeworICAgICAgICAgICAgLy8gVE9ETzogTWFrZSBzdXJlIHRoYXQgaXQgZG9lc24ndCBjYXVzZSBhbnkgaXNzdWVzIGlmIHdlIGp1c3QgZ2V0IGEgc21hbGwgYXZhaWxhYmxlCisgICAgICAgICAgICAvLyBidWZmZXIgZnJvbSB0aGUgYnVmZmVyIHByb3ZpZGVyLgorICAgICAgICAgICAgZnJhbWVDb3VudCA9IHBhdGNoQnVmZmVyLmZyYW1lQ291bnQ7CisgICAgICAgIH0KKyAgICB9CiAKICAgICBpZiAoKGNvbW1hbmQgJiBGYXN0Q2FwdHVyZVN0YXRlOjpSRUFEKSAvKiYmIGlzV2FybSovKSB7CiAgICAgICAgIEFMT0dfQVNTRVJUKG1JbnB1dFNvdXJjZSAhPSBOVUxMKTsKQEAgLTE3Niw2ICsxOTEsNyBAQAogICAgICAgICAgICAgbVRvdGFsTmF0aXZlRnJhbWVzUmVhZCArPSBmcmFtZXNSZWFkOwogICAgICAgICAgICAgZHVtcFN0YXRlLT5tRnJhbWVzUmVhZCA9IG1Ub3RhbE5hdGl2ZUZyYW1lc1JlYWQ7CiAgICAgICAgICAgICBtUmVhZEJ1ZmZlclN0YXRlID0gZnJhbWVzUmVhZDsKKyAgICAgICAgICAgIHBhdGNoQnVmZmVyLmZyYW1lQ291bnQgPSBmcmFtZXNSZWFkOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgZHVtcFN0YXRlLT5tUmVhZEVycm9ycysrOwogICAgICAgICAgICAgbVJlYWRCdWZmZXJTdGF0ZSA9IDA7CkBAIC0xOTMsMTEgKzIwOSwxOCBAQAogICAgICAgICB9CiAgICAgICAgIGlmIChtUmVhZEJ1ZmZlclN0YXRlID4gMCkgewogICAgICAgICAgICAgc3NpemVfdCBmcmFtZXNXcml0dGVuID0gbVBpcGVTaW5rLT53cml0ZShtUmVhZEJ1ZmZlciwgbVJlYWRCdWZmZXJTdGF0ZSk7Ci0gICAgICAgICAgICAvLyBGSVhNRSBUaGlzIHN1cHBvcnRzIGF0IG1vc3Qgb25lIGZhc3QgY2FwdHVyZSBjbGllbnQuCi0gICAgICAgICAgICAvLyAgICAgICBUbyBoYW5kbGUgbXVsdGlwbGUgY2xpZW50cyB0aGlzIGNvdWxkIGJlIGNvbnZlcnRlZCB0byBhbiBhcnJheSwKLSAgICAgICAgICAgIC8vICAgICAgIG9yIHdpdGggYSBsb3QgbW9yZSB3b3JrIHRoZSBjb250cm9sIGJsb2NrIGNvdWxkIGJlIHNoYXJlZCBieSBhbGwgY2xpZW50cy4KICAgICAgICAgICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsayA9IGN1cnJlbnQtPm1DYmxrOwotICAgICAgICAgICAgaWYgKGNibGsgIT0gTlVMTCAmJiBmcmFtZXNXcml0dGVuID4gMCkgeworICAgICAgICAgICAgaWYgKGZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyICE9IDApIHsKKyAgICAgICAgICAgICAgICAvLyBUaGlzIGluZGljYXRlcyB0aGUgZmFzdCB0cmFjayBpcyBhIHBhdGNoIHJlY29yZCwgdXBkYXRlIHRoZSBjYmxrIGJ5CisgICAgICAgICAgICAgICAgLy8gY2FsbGluZyByZWxlYXNlQnVmZmVyKCkuCisgICAgICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdChwYXRjaEJ1ZmZlci5yYXcsIGN1cnJlbnQtPm1GYXN0UGF0Y2hSZWNvcmRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICBtUmVhZEJ1ZmZlciwgbUZvcm1hdC5tRm9ybWF0LCBmcmFtZXNXcml0dGVuICogbUZvcm1hdC5tQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICBwYXRjaEJ1ZmZlci5mcmFtZUNvdW50ID0gZnJhbWVzV3JpdHRlbjsKKyAgICAgICAgICAgICAgICBmYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlci0+cmVsZWFzZUJ1ZmZlcigmcGF0Y2hCdWZmZXIpOworICAgICAgICAgICAgfSBlbHNlIGlmIChjYmxrICE9IE5VTEwgJiYgZnJhbWVzV3JpdHRlbiA+IDApIHsKKyAgICAgICAgICAgICAgICAvLyBGSVhNRSBUaGlzIHN1cHBvcnRzIGF0IG1vc3Qgb25lIGZhc3QgY2FwdHVyZSBjbGllbnQuCisgICAgICAgICAgICAgICAgLy8gICAgICAgVG8gaGFuZGxlIG11bHRpcGxlIGNsaWVudHMgdGhpcyBjb3VsZCBiZSBjb252ZXJ0ZWQgdG8gYW4gYXJyYXksCisgICAgICAgICAgICAgICAgLy8gICAgICAgb3Igd2l0aCBhIGxvdCBtb3JlIHdvcmsgdGhlIGNvbnRyb2wgYmxvY2sgY291bGQgYmUgc2hhcmVkIGJ5IGFsbCBjbGllbnRzLgogICAgICAgICAgICAgICAgIGludDMyX3QgcmVhciA9IGNibGstPnUubVN0cmVhbWluZy5tUmVhcjsKICAgICAgICAgICAgICAgICBhbmRyb2lkX2F0b21pY19yZWxlYXNlX3N0b3JlKGZyYW1lc1dyaXR0ZW4gKyByZWFyLCAmY2Jsay0+dS5tU3RyZWFtaW5nLm1SZWFyKTsKICAgICAgICAgICAgICAgICBjYmxrLT5tU2VydmVyICs9IGZyYW1lc1dyaXR0ZW47CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RDYXB0dXJlU3RhdGUuaAppbmRleCA5YmNhMmQ0Li5kMjg3MjMyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdENhcHR1cmVTdGF0ZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0Q2FwdHVyZVN0YXRlLmgKQEAgLTE4LDYgKzE4LDcgQEAKICNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX0NBUFRVUkVfU1RBVEVfSAogCiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0J1ZmZlclByb3ZpZGVyLmg+CiAjaW5jbHVkZSAiRmFzdFRocmVhZFN0YXRlLmgiCiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAKQEAgLTM3LDYgKzM4LDEwIEBACiAgICAgc2l6ZV90ICAgICAgICAgIG1GcmFtZUNvdW50OyAgICAgICAgLy8gbnVtYmVyIG9mIGZyYW1lcyBwZXIgZmFzdCBjYXB0dXJlIGJ1ZmZlcgogICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogbUNibGs7ICAgICAgICAgIC8vIGNvbnRyb2wgYmxvY2sgZm9yIHRoZSBzaW5nbGUgZmFzdCBjbGllbnQsIG9yIE5VTEwKIAorICAgIGF1ZGlvX2Zvcm1hdF90ICBtRmFzdFBhdGNoUmVjb3JkRm9ybWF0ID0gQVVESU9fRk9STUFUX0lOVkFMSUQ7CisgICAgQXVkaW9CdWZmZXJQcm92aWRlciogbUZhc3RQYXRjaFJlY29yZEJ1ZmZlclByb3ZpZGVyID0gbnVsbHB0cjsgICAvLyBhIHJlZmVyZW5jZSB0byBhIHBhdGNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWNvcmQgaW4gZmFzdCBtb2RlCisKICAgICAvLyBFeHRlbmRzIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZAogICAgIHN0YXRpYyBjb25zdCBDb21tYW5kCiAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgY29tbWFuZHMgYWxzbyBwcm9jZXNzIGNvbmZpZ3VyYXRpb24gY2hhbmdlcywgYW5kIGNhbiBiZSAib3IiZWQ6CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCmluZGV4IDc5YmI5ZmUuLjNlYWNjOGMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuY3BwCkBAIC0zMiwxMyArMzIsMTQgQEAKICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKLSNpbmNsdWRlIDxjcHVzdGF0cy9DZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvU3RhdGlzdGljcy5oPgogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwogI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CiAjZW5kaWYKICNlbmRpZgotI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL21vbm9fYmxlbmQuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jaGFubmVscy5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL21vbm9fYmxlbmQuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb01peGVyLmg+CiAjaW5jbHVkZSAiRmFzdE1peGVyLmgiCiAjaW5jbHVkZSAiVHlwZWRMb2dnZXIuaCIKQEAgLTQ3LDcgKzQ4LDggQEAKIAogLypzdGF0aWMqLyBjb25zdCBGYXN0TWl4ZXJTdGF0ZSBGYXN0TWl4ZXI6OnNJbml0aWFsOwogCi1GYXN0TWl4ZXI6OkZhc3RNaXhlcigpIDogRmFzdFRocmVhZCgiY3ljbGVfbXMiLCAibG9hZF91cyIpLAorRmFzdE1peGVyOjpGYXN0TWl4ZXIoYXVkaW9faW9faGFuZGxlX3QgcGFyZW50SW9IYW5kbGUpCisgICAgOiBGYXN0VGhyZWFkKCJjeWNsZV9tcyIsICJsb2FkX3VzIiksCiAgICAgLy8gbUZhc3RUcmFja05hbWVzCiAgICAgLy8gbUdlbmVyYXRpb25zCiAgICAgbU91dHB1dFNpbmsoTlVMTCksCkBAIC01OCw3ICs2MCw2IEBACiAgICAgbVNpbmtDaGFubmVsQ291bnQoRkNDXzIpLAogICAgIG1NaXhlckJ1ZmZlcihOVUxMKSwKICAgICBtTWl4ZXJCdWZmZXJTaXplKDApLAotICAgIG1NaXhlckJ1ZmZlckZvcm1hdChBVURJT19GT1JNQVRfUENNXzE2X0JJVCksCiAgICAgbU1peGVyQnVmZmVyU3RhdGUoVU5ERUZJTkVEKSwKICAgICBtRm9ybWF0KEZvcm1hdF9JbnZhbGlkKSwKICAgICBtU2FtcGxlUmF0ZSgwKSwKQEAgLTY2LDggKzY3LDExIEBACiAgICAgbVRvdGFsTmF0aXZlRnJhbWVzV3JpdHRlbigwKSwKICAgICAvLyB0aW1lc3RhbXAKICAgICBtTmF0aXZlRnJhbWVzV3JpdHRlbkJ1dE5vdFByZXNlbnRlZCgwKSwgICAvLyB0aGUgPSAwIGlzIHRvIHNpbGVuY2UgdGhlIGNvbXBpbGVyCi0gICAgbU1hc3Rlck1vbm8oZmFsc2UpCisgICAgbU1hc3Rlck1vbm8oZmFsc2UpLAorICAgIG1UaHJlYWRJb0hhbmRsZShwYXJlbnRJb0hhbmRsZSkKIHsKKyAgICAodm9pZCltVGhyZWFkSW9IYW5kbGU7IC8vIHByZXZlbnQgdW51c2VkIHdhcm5pbmcsIHNlZSBDKysxNyBbW21heWJlX3VudXNlZF1dCisKICAgICAvLyBGSVhNRSBwYXNzIHNJbml0aWFsIGFzIHBhcmFtZXRlciB0byBiYXNlIGNsYXNzIGNvbnN0cnVjdG9yLCBhbmQgbWFrZSBpdCBzdGF0aWMgbG9jYWwKICAgICBtUHJldmlvdXMgPSAmc0luaXRpYWw7CiAgICAgbUN1cnJlbnQgPSAmc0luaXRpYWw7CkBAIC0xMDEsMTMgKzEwNSw4IEBACiAgICAgcmV0dXJuIG1TUS5wb2xsKCk7CiB9CiAKLXZvaWQgRmFzdE1peGVyOjpzZXROQkxvZ1dyaXRlcihOQkxvZzo6V3JpdGVyICpsb2dXcml0ZXIpCit2b2lkIEZhc3RNaXhlcjo6c2V0TkJMb2dXcml0ZXIoTkJMb2c6OldyaXRlciAqbG9nV3JpdGVyIF9fdW51c2VkKQogewotICAgIC8vIEZJWE1FIElmIG1NaXhlciBpcyBzZXQgb3IgY2hhbmdlZCBwcmlvciB0byB0aGlzLCB3ZSBkb24ndCBpbmZvcm0gY29ycmVjdGx5LgotICAgIC8vICAgICAgIFNob3VsZCBjYWNoZSBsb2dXcml0ZXIgYW5kIHJlLWFwcGx5IGl0IGF0IHRoZSBhc3NpZ25tZW50IHRvIG1NaXhlci4KLSAgICBpZiAobU1peGVyICE9IE5VTEwpIHsKLSAgICAgICAgbU1peGVyLT5zZXROQkxvZ1dyaXRlcihsb2dXcml0ZXIpOwotICAgIH0KIH0KIAogdm9pZCBGYXN0TWl4ZXI6Om9uSWRsZSgpCkBAIC0xMzUsNiArMTM0LDc1IEBACiAgICAgfQogfQogCit2b2lkIEZhc3RNaXhlcjo6dXBkYXRlTWl4ZXJUcmFjayhpbnQgaW5kZXgsIFJlYXNvbiByZWFzb24pIHsKKyAgICBjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqIGNvbnN0IGN1cnJlbnQgPSAoY29uc3QgRmFzdE1peGVyU3RhdGUgKikgbUN1cnJlbnQ7CisgICAgY29uc3QgRmFzdFRyYWNrICogY29uc3QgZmFzdFRyYWNrID0gJmN1cnJlbnQtPm1GYXN0VHJhY2tzW2luZGV4XTsKKworICAgIC8vIGNoZWNrIGFuZCB1cGRhdGUgZ2VuZXJhdGlvbgorICAgIGlmIChyZWFzb24gPT0gUkVBU09OX01PRElGWSAmJiBtR2VuZXJhdGlvbnNbaW5kZXhdID09IGZhc3RUcmFjay0+bUdlbmVyYXRpb24pIHsKKyAgICAgICAgcmV0dXJuOyAvLyBubyBjaGFuZ2Ugb24gYW4gYWxyZWFkeSBjb25maWd1cmVkIHRyYWNrLgorICAgIH0KKyAgICBtR2VuZXJhdGlvbnNbaW5kZXhdID0gZmFzdFRyYWNrLT5tR2VuZXJhdGlvbjsKKworICAgIC8vIG1NaXhlciA9PSBudWxscHRyIG9uIGNvbmZpZ3VyYXRpb24gZmFpbHVyZSAoY2hlY2sgZG9uZSBhZnRlciBnZW5lcmF0aW9uIHVwZGF0ZSkuCisgICAgaWYgKG1NaXhlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBzd2l0Y2ggKHJlYXNvbikgeworICAgIGNhc2UgUkVBU09OX1JFTU9WRToKKyAgICAgICAgbU1peGVyLT5kZXN0cm95KGluZGV4KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBSRUFTT05fQUREOiB7CisgICAgICAgIGNvbnN0IHN0YXR1c190IHN0YXR1cyA9IG1NaXhlci0+Y3JlYXRlKAorICAgICAgICAgICAgICAgIGluZGV4LCBmYXN0VHJhY2stPm1DaGFubmVsTWFzaywgZmFzdFRyYWNrLT5tRm9ybWF0LCBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwKKyAgICAgICAgICAgICAgICAiJXM6IGNhbm5vdCBjcmVhdGUgZmFzdCB0cmFjayBpbmRleCIKKyAgICAgICAgICAgICAgICAiICVkLCBtYXNrICUjeCwgZm9ybWF0ICUjeCBpbiBBdWRpb01peGVyIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaW5kZXgsIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrLCBmYXN0VHJhY2stPm1Gb3JtYXQpOworICAgIH0KKyAgICAgICAgW1tmYWxsdGhyb3VnaF1dOyAgLy8gbm93IGZhbGx0aHJvdWdoIHRvIHVwZGF0ZSB0aGUgbmV3bHkgY3JlYXRlZCB0cmFjay4KKyAgICBjYXNlIFJFQVNPTl9NT0RJRlk6CisgICAgICAgIG1NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIoaW5kZXgsIGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyKTsKKworICAgICAgICBmbG9hdCB2bGYsIHZyZjsKKyAgICAgICAgaWYgKGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGNvbnN0IGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IHZsciA9IGZhc3RUcmFjay0+bVZvbHVtZVByb3ZpZGVyLT5nZXRWb2x1bWVMUigpOworICAgICAgICAgICAgdmxmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19sZWZ0KHZscikpOworICAgICAgICAgICAgdnJmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHZsZiA9IHZyZiA9IEF1ZGlvTWl4ZXI6OlVOSVRZX0dBSU5fRkxPQVQ7CisgICAgICAgIH0KKworICAgICAgICAvLyBzZXQgdm9sdW1lIHRvIGF2b2lkIHJhbXAgd2hlbmV2ZXIgdGhlIHRyYWNrIGlzIHVwZGF0ZWQgKG9yIGNyZWF0ZWQpLgorICAgICAgICAvLyBOb3RlOiB0aGlzIGRvZXMgbm90IGRpc3Rpbmd1aXNoIGZyb20gc3RhcnRpbmcgZnJlc2ggb3IKKyAgICAgICAgLy8gcmVzdW1pbmcgZnJvbSBhIHBhdXNlZCBzdGF0ZS4KKyAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoaW5kZXgsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7CisgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKGluZGV4LCBBdWRpb01peGVyOjpWT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOworCisgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKGluZGV4LCBBdWRpb01peGVyOjpSRVNBTVBMRSwgQXVkaW9NaXhlcjo6UkVNT1ZFLCBudWxscHRyKTsKKyAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoaW5kZXgsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAodm9pZCAqKW1NaXhlckJ1ZmZlcik7CisgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKGluZGV4LCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULAorICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCltTWl4ZXJCdWZmZXJGb3JtYXQpOworICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihpbmRleCwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkZPUk1BVCwKKyAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tRm9ybWF0KTsKKyAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoaW5kZXgsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUNoYW5uZWxNYXNrKTsKKyAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoaW5kZXgsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KW1TaW5rQ2hhbm5lbE1hc2spOworICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihpbmRleCwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkhBUFRJQ19FTkFCTEVELAorICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQpOworICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihpbmRleCwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkhBUFRJQ19JTlRFTlNJVFksCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KWZhc3RUcmFjay0+bUhhcHRpY0ludGVuc2l0eSk7CisKKyAgICAgICAgbU1peGVyLT5lbmFibGUoaW5kZXgpOworICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlczogaW52YWxpZCB1cGRhdGUgcmVhc29uICVkIiwgX19mdW5jX18sIHJlYXNvbik7CisgICAgfQorfQorCiB2b2lkIEZhc3RNaXhlcjo6b25TdGF0ZUNoYW5nZSgpCiB7CiAgICAgY29uc3QgRmFzdE1peGVyU3RhdGUgKiBjb25zdCBjdXJyZW50ID0gKGNvbnN0IEZhc3RNaXhlclN0YXRlICopIG1DdXJyZW50OwpAQCAtMTU1LDIwICsyMjMsMjUgQEAKICAgICBpZiAoY3VycmVudC0+bU91dHB1dFNpbmtHZW4gIT0gbU91dHB1dFNpbmtHZW4pIHsKICAgICAgICAgbU91dHB1dFNpbmsgPSBjdXJyZW50LT5tT3V0cHV0U2luazsKICAgICAgICAgbU91dHB1dFNpbmtHZW4gPSBjdXJyZW50LT5tT3V0cHV0U2lua0dlbjsKKyAgICAgICAgbVNpbmtDaGFubmVsTWFzayA9IGN1cnJlbnQtPm1TaW5rQ2hhbm5lbE1hc2s7CisgICAgICAgIG1CYWxhbmNlLnNldENoYW5uZWxNYXNrKG1TaW5rQ2hhbm5lbE1hc2spOwogICAgICAgICBpZiAobU91dHB1dFNpbmsgPT0gTlVMTCkgewogICAgICAgICAgICAgbUZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkOwogICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSAwOwogICAgICAgICAgICAgbVNpbmtDaGFubmVsQ291bnQgPSAwOwogICAgICAgICAgICAgbVNpbmtDaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICAgICAgICAgIG1BdWRpb0NoYW5uZWxDb3VudCA9IDA7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtRm9ybWF0ID0gbU91dHB1dFNpbmstPmZvcm1hdCgpOwogICAgICAgICAgICAgbVNhbXBsZVJhdGUgPSBGb3JtYXRfc2FtcGxlUmF0ZShtRm9ybWF0KTsKICAgICAgICAgICAgIG1TaW5rQ2hhbm5lbENvdW50ID0gRm9ybWF0X2NoYW5uZWxDb3VudChtRm9ybWF0KTsKICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVNpbmtDaGFubmVsQ291bnQgPiBBdWRpb01peGVyOjpNQVhfTlVNX0NIQU5ORUxTKTsKIAotICAgICAgICAgICAgLy8gVE9ETzogQWRkIGNoYW5uZWwgbWFzayB0byBOQkFJT19Gb3JtYXQKLSAgICAgICAgICAgIC8vIFdlIGFzc3VtZSB0aGF0IHRoZSBjaGFubmVsIG1hc2sgbXVzdCBiZSBhIHZhbGlkIHBvc2l0aW9uYWwgY2hhbm5lbCBtYXNrLgotICAgICAgICAgICAgbVNpbmtDaGFubmVsTWFzayA9IGF1ZGlvX2NoYW5uZWxfb3V0X21hc2tfZnJvbV9jb3VudChtU2lua0NoYW5uZWxDb3VudCk7CisgICAgICAgICAgICBpZiAobVNpbmtDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX05PTkUpIHsKKyAgICAgICAgICAgICAgICBtU2lua0NoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9vdXRfbWFza19mcm9tX2NvdW50KG1TaW5rQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1BdWRpb0NoYW5uZWxDb3VudCA9IG1TaW5rQ2hhbm5lbENvdW50IC0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKAorICAgICAgICAgICAgICAgICAgICBtU2lua0NoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKICAgICAgICAgfQogICAgICAgICBkdW1wU3RhdGUtPm1TYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgfQpAQCAtMTgyLDE1ICsyNTUsMTUgQEAKICAgICAgICAgZnJlZShtU2lua0J1ZmZlcik7CiAgICAgICAgIG1TaW5rQnVmZmVyID0gTlVMTDsKICAgICAgICAgaWYgKGZyYW1lQ291bnQgPiAwICYmIG1TYW1wbGVSYXRlID4gMCkgewotICAgICAgICAgICAgLy8gVGhlIG1peGVyIHByb2R1Y2VzIGVpdGhlciAxNiBiaXQgUENNIG9yIGZsb2F0IG91dHB1dCwgc2VsZWN0Ci0gICAgICAgICAgICAvLyBmbG9hdCBvdXRwdXQgaWYgdGhlIEhBTCBzdXBwb3J0cyBoaWdoZXIgdGhhbiAxNiBiaXQgcHJlY2lzaW9uLgotICAgICAgICAgICAgbU1peGVyQnVmZmVyRm9ybWF0ID0gbUZvcm1hdC5tRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUID8KLSAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgOiBBVURJT19GT1JNQVRfUENNX0ZMT0FUOwogICAgICAgICAgICAgLy8gRklYTUUgbmV3IG1heSBibG9jayBmb3IgdW5ib3VuZGVkIHRpbWUgYXQgaW50ZXJuYWwgbXV0ZXggb2YgdGhlIGhlYXAKICAgICAgICAgICAgIC8vICAgICAgIGltcGxlbWVudGF0aW9uOyBpdCB3b3VsZCBiZSBiZXR0ZXIgdG8gaGF2ZSBub3JtYWwgbWl4ZXIgYWxsb2NhdGUgZm9yIHVzCiAgICAgICAgICAgICAvLyAgICAgICB0byBhdm9pZCBibG9ja2luZyBoZXJlIGFuZCB0byBwcmV2ZW50IHBvc3NpYmxlIHByaW9yaXR5IGludmVyc2lvbgogICAgICAgICAgICAgbU1peGVyID0gbmV3IEF1ZGlvTWl4ZXIoZnJhbWVDb3VudCwgbVNhbXBsZVJhdGUpOwogICAgICAgICAgICAgLy8gRklYTUUgU2VlIHRoZSBvdGhlciBGSVhNRSBhdCBGYXN0TWl4ZXI6OnNldE5CTG9nV3JpdGVyKCkKKyAgICAgICAgICAgIE5CTG9nOjp0aHJlYWRfcGFyYW1zX3QgcGFyYW1zOworICAgICAgICAgICAgcGFyYW1zLmZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworICAgICAgICAgICAgcGFyYW1zLnNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKKyAgICAgICAgICAgIExPR19USFJFQURfUEFSQU1TKHBhcmFtcyk7CiAgICAgICAgICAgICBjb25zdCBzaXplX3QgbWl4ZXJGcmFtZVNpemUgPSBtU2lua0NoYW5uZWxDb3VudAogICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobU1peGVyQnVmZmVyRm9ybWF0KTsKICAgICAgICAgICAgIG1NaXhlckJ1ZmZlclNpemUgPSBtaXhlckZyYW1lU2l6ZSAqIGZyYW1lQ291bnQ7CkBAIC0yMjAsNiArMjkzLDEwIEBACiAgICAgICAgIHByZXZpb3VzVHJhY2tNYXNrID0gMDsKICAgICAgICAgbUZhc3RUcmFja3NHZW4gPSBjdXJyZW50LT5tRmFzdFRyYWNrc0dlbiAtIDE7CiAgICAgICAgIGR1bXBTdGF0ZS0+bUZyYW1lQ291bnQgPSBmcmFtZUNvdW50OworI2lmZGVmIFRFRV9TSU5LCisgICAgICAgIG1UZWUuc2V0KG1Gb3JtYXQsIE5CQUlPX1RlZTo6VEVFX0ZMQUdfT1VUUFVUX1RIUkVBRCk7CisgICAgICAgIG1UZWUuc2V0SWQoc3RkOjpzdHJpbmcoIl8iKSArIHN0ZDo6dG9fc3RyaW5nKG1UaHJlYWRJb0hhbmRsZSkgKyAiX0YiKTsKKyNlbmRpZgogICAgIH0gZWxzZSB7CiAgICAgICAgIHByZXZpb3VzVHJhY2tNYXNrID0gcHJldmlvdXMtPm1UcmFja01hc2s7CiAgICAgfQpAQCAtMjI3LDIxICszMDQsMTYgQEAKICAgICAvLyBjaGVjayBmb3IgY2hhbmdlIGluIGFjdGl2ZSB0cmFjayBzZXQKICAgICBjb25zdCB1bnNpZ25lZCBjdXJyZW50VHJhY2tNYXNrID0gY3VycmVudC0+bVRyYWNrTWFzazsKICAgICBkdW1wU3RhdGUtPm1UcmFja01hc2sgPSBjdXJyZW50VHJhY2tNYXNrOworICAgIGR1bXBTdGF0ZS0+bU51bVRyYWNrcyA9IHBvcGNvdW50KGN1cnJlbnRUcmFja01hc2spOwogICAgIGlmIChjdXJyZW50LT5tRmFzdFRyYWNrc0dlbiAhPSBtRmFzdFRyYWNrc0dlbikgewotICAgICAgICBBTE9HX0FTU0VSVChtTWl4ZXJCdWZmZXIgIT0gTlVMTCk7CiAKICAgICAgICAgLy8gcHJvY2VzcyByZW1vdmVkIHRyYWNrcyBmaXJzdCB0byBhdm9pZCBydW5uaW5nIG91dCBvZiB0cmFjayBuYW1lcwogICAgICAgICB1bnNpZ25lZCByZW1vdmVkVHJhY2tzID0gcHJldmlvdXNUcmFja01hc2sgJiB+Y3VycmVudFRyYWNrTWFzazsKICAgICAgICAgd2hpbGUgKHJlbW92ZWRUcmFja3MgIT0gMCkgewogICAgICAgICAgICAgaW50IGkgPSBfX2J1aWx0aW5fY3R6KHJlbW92ZWRUcmFja3MpOwogICAgICAgICAgICAgcmVtb3ZlZFRyYWNrcyAmPSB+KDEgPDwgaSk7Ci0gICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKLSAgICAgICAgICAgIEFMT0dfQVNTRVJUKGZhc3RUcmFjay0+bUJ1ZmZlclByb3ZpZGVyID09IE5VTEwpOwotICAgICAgICAgICAgaWYgKG1NaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgbU1peGVyLT5kZXN0cm95KGkpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgdXBkYXRlTWl4ZXJUcmFjayhpLCBSRUFTT05fUkVNT1ZFKTsKICAgICAgICAgICAgIC8vIGRvbid0IHJlc2V0IHRyYWNrIGR1bXAgc3RhdGUsIHNpbmNlIG90aGVyIHNpZGUgaXMgaWdub3JpbmcgaXQKLSAgICAgICAgICAgIG1HZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247CiAgICAgICAgIH0KIAogICAgICAgICAvLyBub3cgcHJvY2VzcyBhZGRlZCB0cmFja3MKQEAgLTI0OSwzNiArMzIxLDcgQEAKICAgICAgICAgd2hpbGUgKGFkZGVkVHJhY2tzICE9IDApIHsKICAgICAgICAgICAgIGludCBpID0gX19idWlsdGluX2N0eihhZGRlZFRyYWNrcyk7CiAgICAgICAgICAgICBhZGRlZFRyYWNrcyAmPSB+KDEgPDwgaSk7Ci0gICAgICAgICAgICBjb25zdCBGYXN0VHJhY2sqIGZhc3RUcmFjayA9ICZjdXJyZW50LT5tRmFzdFRyYWNrc1tpXTsKLSAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKmJ1ZmZlclByb3ZpZGVyID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXI7Ci0gICAgICAgICAgICBpZiAobU1peGVyICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBjb25zdCBpbnQgbmFtZSA9IGk7IC8vIGZvciBjbGFyaXR5LCBjaG9vc2UgbmFtZSBhcyBmYXN0IHRyYWNrIGluZGV4LgotICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1NaXhlci0+Y3JlYXRlKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tRm9ybWF0LCBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpOwotICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoc3RhdHVzICE9IE5PX0VSUk9SLAotICAgICAgICAgICAgICAgICAgICAgICAgIiVzOiBjYW5ub3QgY3JlYXRlIHRyYWNrIG5hbWUiCi0gICAgICAgICAgICAgICAgICAgICAgICAiICVkLCBtYXNrICUjeCwgZm9ybWF0ICUjeCwgc2Vzc2lvbklkICVkIGluIEF1ZGlvTWl4ZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1DaGFubmVsTWFzaywgZmFzdFRyYWNrLT5tRm9ybWF0LCBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpOwotICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgYnVmZmVyUHJvdmlkZXIpOwotICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNQUlOX0JVRkZFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopbU1peGVyQnVmZmVyKTsKLSAgICAgICAgICAgICAgICAvLyBuZXdseSBhbGxvY2F0ZWQgdHJhY2sgbmFtZXMgZGVmYXVsdCB0byBmdWxsIHNjYWxlIHZvbHVtZQotICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAotICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKW1NaXhlckJ1ZmZlckZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkZPUk1BVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdClmYXN0VHJhY2stPm1Gb3JtYXQpOwotICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpDSEFOTkVMX01BU0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlRSQUNLLCBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssCi0gICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpbVNpbmtDaGFubmVsTWFzayk7Ci0gICAgICAgICAgICAgICAgbU1peGVyLT5lbmFibGUobmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBtR2VuZXJhdGlvbnNbaV0gPSBmYXN0VHJhY2stPm1HZW5lcmF0aW9uOworICAgICAgICAgICAgdXBkYXRlTWl4ZXJUcmFjayhpLCBSRUFTT05fQUREKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIGZpbmFsbHkgcHJvY2VzcyAocG90ZW50aWFsbHkpIG1vZGlmaWVkIHRyYWNrczsgdGhlc2UgdXNlIHRoZSBzYW1lIHNsb3QKQEAgLTI4Nyw0MCArMzMwLDEwIEBACiAgICAgICAgIHdoaWxlIChtb2RpZmllZFRyYWNrcyAhPSAwKSB7CiAgICAgICAgICAgICBpbnQgaSA9IF9fYnVpbHRpbl9jdHoobW9kaWZpZWRUcmFja3MpOwogICAgICAgICAgICAgbW9kaWZpZWRUcmFja3MgJj0gfigxIDw8IGkpOwotICAgICAgICAgICAgY29uc3QgRmFzdFRyYWNrKiBmYXN0VHJhY2sgPSAmY3VycmVudC0+bUZhc3RUcmFja3NbaV07Ci0gICAgICAgICAgICBpZiAoZmFzdFRyYWNrLT5tR2VuZXJhdGlvbiAhPSBtR2VuZXJhdGlvbnNbaV0pIHsKLSAgICAgICAgICAgICAgICAvLyB0aGlzIHRyYWNrIHdhcyBhY3R1YWxseSBtb2RpZmllZAotICAgICAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIgKmJ1ZmZlclByb3ZpZGVyID0gZmFzdFRyYWNrLT5tQnVmZmVyUHJvdmlkZXI7Ci0gICAgICAgICAgICAgICAgQUxPR19BU1NFUlQoYnVmZmVyUHJvdmlkZXIgIT0gTlVMTCk7Ci0gICAgICAgICAgICAgICAgaWYgKG1NaXhlciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBuYW1lID0gaTsKLSAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCBidWZmZXJQcm92aWRlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlciA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBmID0gQXVkaW9NaXhlcjo6VU5JVFlfR0FJTl9GTE9BVDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJmYpOwotICAgICAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmZik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkVTQU1QTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6UkVNT1ZFLCBOVUxMKTsKLSAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsICh2b2lkICopbU1peGVyQnVmZmVyRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkZPUk1BVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tRm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6VFJBQ0ssIEF1ZGlvTWl4ZXI6OkNIQU5ORUxfTUFTSywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpUUkFDSywgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkICopKHVpbnRwdHJfdCltU2lua0NoYW5uZWxNYXNrKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gYWxyZWFkeSBlbmFibGVkCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1HZW5lcmF0aW9uc1tpXSA9IGZhc3RUcmFjay0+bUdlbmVyYXRpb247Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICB1cGRhdGVNaXhlclRyYWNrKGksIFJFQVNPTl9NT0RJRlkpOwogICAgICAgICB9CiAKICAgICAgICAgbUZhc3RUcmFja3NHZW4gPSBjdXJyZW50LT5tRmFzdFRyYWNrc0dlbjsKLQotICAgICAgICBkdW1wU3RhdGUtPm1OdW1UcmFja3MgPSBwb3Bjb3VudChjdXJyZW50VHJhY2tNYXNrKTsKICAgICB9CiB9CiAKQEAgLTMyOCwxMyArMzQxLDI0IEBACiB7CiAgICAgLy8gVE9ETzogcGFzcyBhbiBJRCBwYXJhbWV0ZXIgdG8gaW5kaWNhdGUgd2hpY2ggdGltZSBzZXJpZXMgd2Ugd2FudCB0byB3cml0ZSB0byBpbiBOQkxvZy5jcHAKICAgICAvLyBPcjogcGFzcyBib3RoIG9mIHRoZXNlIGludG8gYSBzaW5nbGUgY2FsbCB3aXRoIGEgYm9vbGVhbgotICAgIGlmIChtSXNXYXJtKSB7Ci0gICAgICAgIExPR19ISVNUX1RTKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTE9HX0FVRElPX1NUQVRFKCk7Ci0gICAgfQogICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlICogY29uc3QgY3VycmVudCA9IChjb25zdCBGYXN0TWl4ZXJTdGF0ZSAqKSBtQ3VycmVudDsKICAgICBGYXN0TWl4ZXJEdW1wU3RhdGUgKiBjb25zdCBkdW1wU3RhdGUgPSAoRmFzdE1peGVyRHVtcFN0YXRlICopIG1EdW1wU3RhdGU7CisKKyAgICBpZiAobUlzV2FybSkgeworICAgICAgICAvLyBMb2dnaW5nIHRpbWVzdGFtcHMgZm9yIEZhc3RNaXhlciBpcyBjdXJyZW50bHkgZGlzYWJsZWQgdG8gbWFrZSBtZW1vcnkgcm9vbSBmb3IgbG9nZ2luZworICAgICAgICAvLyBvdGhlciBzdGF0aXN0aWNzIGluIEZhc3RNaXhlci4KKyAgICAgICAgLy8gVG8gcmUtZW5hYmxlLCBkZWxldGUgdGhlICNpZmRlZiBGQVNUTUlYRVJfTE9HX0hJU1RfVFMgbGluZXMgKGFuZCB0aGUgI2VuZGlmIGxpbmVzKS4KKyNpZmRlZiBGQVNUTUlYRVJfTE9HX0hJU1RfVFMKKyAgICAgICAgTE9HX0hJU1RfVFMoKTsKKyNlbmRpZgorICAgICAgICAvL0FMT0dEKCJFcmljIEZhc3RNaXhlcjo6b25Xb3JrKCkgbUlzV2FybSIpOworICAgIH0gZWxzZSB7CisgICAgICAgIGR1bXBTdGF0ZS0+bVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsKKyAgICAgICAgLy8gU2VlIGNvbW1lbnQgaW4gaWYgYmxvY2suCisjaWZkZWYgRkFTVE1JWEVSX0xPR19ISVNUX1RTCisgICAgICAgIExPR19BVURJT19TVEFURSgpOworI2VuZGlmCisgICAgfQogICAgIGNvbnN0IEZhc3RNaXhlclN0YXRlOjpDb21tYW5kIGNvbW1hbmQgPSBtQ29tbWFuZDsKICAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IGN1cnJlbnQtPm1GcmFtZUNvdW50OwogCkBAIC0zNzYsOCArNDAwLDggQEAKICAgICAgICAgICAgICAgICBmbG9hdCB2bGYgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSk7CiAgICAgICAgICAgICAgICAgZmxvYXQgdnJmID0gZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKTsKIAotICAgICAgICAgICAgICAgIG1NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7Ci0gICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6Vk9MVU1FLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmdnJmKTsKKyAgICAgICAgICAgICAgICBtTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBBdWRpb01peGVyOjpSQU1QX1ZPTFVNRSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7CisgICAgICAgICAgICAgICAgbU1peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgQXVkaW9NaXhlcjo6UkFNUF9WT0xVTUUsIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gRklYTUUgVGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gb2YgZnJhbWVzUmVhZHkoKSBmb3IgZmFzdCB0cmFja3MKICAgICAgICAgICAgIC8vIHRha2VzIGEgdHJ5TG9jaywgd2hpY2ggY2FuIGJsb2NrCkBAIC00MzksMTcgKzQ2MywyOSBAQAogICAgICAgICAgICAgbW9ub19ibGVuZChtTWl4ZXJCdWZmZXIsIG1NaXhlckJ1ZmZlckZvcm1hdCwgRm9ybWF0X2NoYW5uZWxDb3VudChtRm9ybWF0KSwgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmxpbWl0Ki8pOwogICAgICAgICB9CisKKyAgICAgICAgLy8gQmFsYW5jZSBtdXN0IHRha2UgZWZmZWN0IGFmdGVyIG1vbm8gY29udmVyc2lvbi4KKyAgICAgICAgLy8gbUJhbGFuY2UgZGV0ZWN0cyB6ZXJvIGJhbGFuY2Ugd2l0aGluIHRoZSBjbGFzcyBmb3Igc3BlZWQgKG5vdCBuZWVkZWQgaGVyZSkuCisgICAgICAgIG1CYWxhbmNlLnNldEJhbGFuY2UobU1hc3RlckJhbGFuY2UubG9hZCgpKTsKKyAgICAgICAgbUJhbGFuY2UucHJvY2VzcygoZmxvYXQgKiltTWl4ZXJCdWZmZXIsIGZyYW1lQ291bnQpOworCiAgICAgICAgIC8vIHByZXBhcmUgdGhlIGJ1ZmZlciB1c2VkIHRvIHdyaXRlIHRvIHNpbmsKICAgICAgICAgdm9pZCAqYnVmZmVyID0gbVNpbmtCdWZmZXIgIT0gTlVMTCA/IG1TaW5rQnVmZmVyIDogbU1peGVyQnVmZmVyOwogICAgICAgICBpZiAobUZvcm1hdC5tRm9ybWF0ICE9IG1NaXhlckJ1ZmZlckZvcm1hdCkgeyAvLyBzaW5rIGZvcm1hdCBub3QgdGhlIHNhbWUgYXMgbWl4ZXIgZm9ybWF0CiAgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KGJ1ZmZlciwgbUZvcm1hdC5tRm9ybWF0LCBtTWl4ZXJCdWZmZXIsIG1NaXhlckJ1ZmZlckZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCAqIEZvcm1hdF9jaGFubmVsQ291bnQobUZvcm1hdCkpOwogICAgICAgICB9Ci0gICAgICAgIC8vIGlmIG5vbi1OVUxMLCB0aGVuIGR1cGxpY2F0ZSB3cml0ZSgpIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKLSAgICAgICAgTkJBSU9fU2luayogdGVlU2luazsKLSAgICAgICAgaWYgKCh0ZWVTaW5rID0gY3VycmVudC0+bVRlZVNpbmspICE9IE5VTEwpIHsKLSAgICAgICAgICAgICh2b2lkKSB0ZWVTaW5rLT53cml0ZShidWZmZXIsIGZyYW1lQ291bnQpOworICAgICAgICBpZiAobVNpbmtDaGFubmVsTWFzayAmIEFVRElPX0NIQU5ORUxfSEFQVElDX0FMTCkgeworICAgICAgICAgICAgLy8gV2hlbiB0aGVyZSBhcmUgaGFwdGljIGNoYW5uZWxzLCB0aGUgc2FtcGxlIGRhdGEgaXMgcGFydGlhbGx5IGludGVybGVhdmVkLgorICAgICAgICAgICAgLy8gTWFrZSB0aGUgc2FtcGxlIGRhdGEgZnVsbHkgaW50ZXJsZWF2ZWQgaGVyZS4KKyAgICAgICAgICAgIGFkanVzdF9jaGFubmVsc19ub25fZGVzdHJ1Y3RpdmUoYnVmZmVyLCBtQXVkaW9DaGFubmVsQ291bnQsIGJ1ZmZlciwgbVNpbmtDaGFubmVsQ291bnQsCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9zYW1wbGUobUZvcm1hdC5tRm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCAqIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShtQXVkaW9DaGFubmVsQ291bnQsIG1Gb3JtYXQubUZvcm1hdCkpOwogICAgICAgICB9CisgICAgICAgIC8vIGlmIG5vbi1OVUxMLCB0aGVuIGR1cGxpY2F0ZSB3cml0ZSgpIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKKyNpZmRlZiBURUVfU0lOSworICAgICAgICBtVGVlLndyaXRlKGJ1ZmZlciwgZnJhbWVDb3VudCk7CisjZW5kaWYKICAgICAgICAgLy8gRklYTUUgd3JpdGUoKSBpcyBub24tYmxvY2tpbmcgYW5kIGxvY2stZnJlZSBmb3IgYSBwcm9wZXJseSBpbXBsZW1lbnRlZCBOQkFJTyBzaW5rLAogICAgICAgICAvLyAgICAgICBidXQgdGhpcyBjb2RlIHNob3VsZCBiZSBtb2RpZmllZCB0byBoYW5kbGUgYm90aCBub24tYmxvY2tpbmcgYW5kIGJsb2NraW5nIHNpbmtzCiAgICAgICAgIGR1bXBTdGF0ZS0+bVdyaXRlU2VxdWVuY2UrKzsKQEAgLTQ3MCwzNSArNTA2LDQ5IEBACiAgICAgICAgIG1BdHRlbXB0ZWRXcml0ZSA9IHRydWU7CiAgICAgICAgIC8vIEZJWE1FIGNvdW50ICMgb2Ygd3JpdGVzIGJsb2NrZWQgZXhjZXNzaXZlbHksIENQVSB1c2FnZSwgZXRjLiBmb3IgZHVtcAogCi0gICAgICAgIEV4dGVuZGVkVGltZXN0YW1wIHRpbWVzdGFtcDsgLy8gbG9jYWwKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU91dHB1dFNpbmstPmdldFRpbWVzdGFtcCh0aW1lc3RhbXApOwotICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkID0KLSAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXTsKLSAgICAgICAgICAgIGlmICh0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA8PSBtVG90YWxOYXRpdmVGcmFtZXNXcml0dGVuKSB7Ci0gICAgICAgICAgICAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPQotICAgICAgICAgICAgICAgICAgICBtVG90YWxOYXRpdmVGcmFtZXNXcml0dGVuIC0gdG90YWxOYXRpdmVGcmFtZXNQcmVzZW50ZWQ7Ci0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQorICAgICAgICBpZiAobUlzV2FybSkgeworICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgdGltZXN0YW1wOyAvLyBsb2NhbAorICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU91dHB1dFNpbmstPmdldFRpbWVzdGFtcCh0aW1lc3RhbXApOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVRpbWVzdGFtcFZlcmlmaWVyLmFkZCgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHRvdGFsTmF0aXZlRnJhbWVzUHJlc2VudGVkID0KICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07Ci0gICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KLSAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOworICAgICAgICAgICAgICAgIGlmICh0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZCA8PSBtVG90YWxOYXRpdmVGcmFtZXNXcml0dGVuKSB7CisgICAgICAgICAgICAgICAgICAgIG1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ub3RhbE5hdGl2ZUZyYW1lc1dyaXR0ZW4gLSB0b3RhbE5hdGl2ZUZyYW1lc1ByZXNlbnRlZDsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvbid0IGNvbXBlbnNhdGUgZm9yIHNlcnZlciAtIGtlcm5lbCB0aW1lIGRpZmZlcmVuY2UgYW5kCisgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgdXBkYXRlIGxhdGVuY3kgaWYgd2UgaGF2ZSB2YWxpZCBpbmZvLgorICAgICAgICAgICAgICAgICAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZG91YmxlKW1OYXRpdmVGcmFtZXNXcml0dGVuQnV0Tm90UHJlc2VudGVkICogMTAwMCAvIG1TYW1wbGVSYXRlOworICAgICAgICAgICAgICAgICAgICBkdW1wU3RhdGUtPm1MYXRlbmN5TXMgPSBsYXRlbmN5TXM7CisgICAgICAgICAgICAgICAgICAgIExPR19MQVRFTkNZKGxhdGVuY3lNcyk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gSEFMIHJlcG9ydGVkIHRoYXQgbW9yZSBmcmFtZXMgd2VyZSBwcmVzZW50ZWQgdGhhbiB3ZXJlIHdyaXR0ZW4KKyAgICAgICAgICAgICAgICAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPSAwOworICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIEhBTCByZXBvcnRlZCB0aGF0IG1vcmUgZnJhbWVzIHdlcmUgcHJlc2VudGVkIHRoYW4gd2VyZSB3cml0dGVuCi0gICAgICAgICAgICAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQgPSAwOwotICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIGR1bXBTdGF0ZS0+bVRpbWVzdGFtcFZlcmlmaWVyLmVycm9yKCk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0KLSAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gZmV0Y2ggc2VydmVyIHRpbWUgaWYgd2UgY2FuJ3QgZ2V0IHRpbWVzdGFtcAotICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0KLSAgICAgICAgICAgICAgICAgICAgc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOwotICAgICAgICAgICAgLy8gY2xlYXIgb3V0IGtlcm5lbCBjYWNoZWQgcG9zaXRpb24gYXMgdGhpcyBtYXkgZ2V0IHJhcGlkbHkgc3RhbGUKLSAgICAgICAgICAgIC8vIGlmIHdlIG5ldmVyIGdldCBhIG5ldyB2YWxpZCB0aW1lc3RhbXAKLSAgICAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gMDsKLSAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSA9IC0xOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9CisgICAgICAgICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGZldGNoIHNlcnZlciB0aW1lIGlmIHdlIGNhbid0IGdldCB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPQorICAgICAgICAgICAgICAgICAgICAgICAgc3lzdGVtVGltZShTWVNURU1fVElNRV9NT05PVE9OSUMpOworICAgICAgICAgICAgICAgIC8vIGNsZWFyIG91dCBrZXJuZWwgY2FjaGVkIHBvc2l0aW9uIGFzIHRoaXMgbWF5IGdldCByYXBpZGx5IHN0YWxlCisgICAgICAgICAgICAgICAgLy8gaWYgd2UgbmV2ZXIgZ2V0IGEgbmV3IHZhbGlkIHRpbWVzdGFtcAorICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0gMDsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSAtMTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXIuaAppbmRleCAyMzVkMjNmLi45N2FiNjM1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlci5oCkBAIC0xOCwxMCArMTgsMTIgQEAKICNkZWZpbmUgQU5EUk9JRF9BVURJT19GQVNUX01JWEVSX0gKIAogI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9CYWxhbmNlLmg+CiAjaW5jbHVkZSAiRmFzdFRocmVhZC5oIgogI2luY2x1ZGUgIlN0YXRlUXVldWUuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXJTdGF0ZS5oIgogI2luY2x1ZGUgIkZhc3RNaXhlckR1bXBTdGF0ZS5oIgorI2luY2x1ZGUgIk5CQUlPX1RlZS5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTMyLDEyICszNCwxNiBAQAogY2xhc3MgRmFzdE1peGVyIDogcHVibGljIEZhc3RUaHJlYWQgewogCiBwdWJsaWM6Ci0gICAgICAgICAgICBGYXN0TWl4ZXIoKTsKKyAgICAvKiogRmFzdE1peGVyIGNvbnN0cnVjdG9yIHRha2VzIGFzIHBhcmFtIHRoZSBwYXJlbnQgTWl4ZXJUaHJlYWQncyBpbyBoYW5kbGUgKGlkKQorICAgICAgICBmb3IgcHVycG9zZXMgb2YgaWRlbnRpZmljYXRpb24uICovCisgICAgZXhwbGljaXQgRmFzdE1peGVyKGF1ZGlvX2lvX2hhbmRsZV90IHRocmVhZElvSGFuZGxlKTsKICAgICB2aXJ0dWFsIH5GYXN0TWl4ZXIoKTsKIAogICAgICAgICAgICAgRmFzdE1peGVyU3RhdGVRdWV1ZSogc3EoKTsKIAogICAgIHZpcnR1YWwgdm9pZCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubykgeyBtTWFzdGVyTW9uby5zdG9yZShtb25vKTsgLyogbWVtb3J5X29yZGVyX3NlcV9jc3QgKi8gfQorICAgIHZpcnR1YWwgdm9pZCBzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpIHsgbU1hc3RlckJhbGFuY2Uuc3RvcmUoYmFsYW5jZSk7IH0KKyAgICB2aXJ0dWFsIGZsb2F0IGdldE1hc3RlckJhbGFuY2UoKSBjb25zdCB7IHJldHVybiBtTWFzdGVyQmFsYW5jZS5sb2FkKCk7IH0KICAgICB2aXJ0dWFsIHZvaWQgc2V0Qm9vdHRpbWVPZmZzZXQoaW50NjRfdCBib290dGltZU9mZnNldCkgewogICAgICAgICBtQm9vdHRpbWVPZmZzZXQuc3RvcmUoYm9vdHRpbWVPZmZzZXQpOyAvKiBtZW1vcnlfb3JkZXJfc2VxX2NzdCAqLwogICAgIH0KQEAgLTUzLDYgKzU5LDE0IEBACiAgICAgdmlydHVhbCB2b2lkIG9uU3RhdGVDaGFuZ2UoKTsKICAgICB2aXJ0dWFsIHZvaWQgb25Xb3JrKCk7CiAKKyAgICBlbnVtIFJlYXNvbiB7CisgICAgICAgIFJFQVNPTl9SRU1PVkUsCisgICAgICAgIFJFQVNPTl9BREQsCisgICAgICAgIFJFQVNPTl9NT0RJRlksCisgICAgfTsKKyAgICAvLyBjYWxsZWQgd2hlbiBhIGZhc3QgdHJhY2sgb2YgaW5kZXggaGFzIGJlZW4gcmVtb3ZlZCwgYWRkZWQsIG9yIG1vZGlmaWVkCisgICAgdm9pZCB1cGRhdGVNaXhlclRyYWNrKGludCBpbmRleCwgUmVhc29uIHJlYXNvbik7CisKICAgICAvLyBGSVhNRSB0aGVzZSBmb3JtZXIgbG9jYWwgdmFyaWFibGVzIG5lZWQgY29tbWVudHMKICAgICBzdGF0aWMgY29uc3QgRmFzdE1peGVyU3RhdGUgc0luaXRpYWw7CiAKQEAgLTcxLDcgKzg1LDkgQEAKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtU2lua0NoYW5uZWxNYXNrOwogICAgIHZvaWQqICAgICAgICAgICBtTWl4ZXJCdWZmZXI7ICAgICAgIC8vIG1peGVyIG91dHB1dCBidWZmZXIuCiAgICAgc2l6ZV90ICAgICAgICAgIG1NaXhlckJ1ZmZlclNpemU7Ci0gICAgYXVkaW9fZm9ybWF0X3QgIG1NaXhlckJ1ZmZlckZvcm1hdDsgLy8gbWl4ZXIgb3V0cHV0IGZvcm1hdDogQVVESU9fRk9STUFUX1BDTV8oMTZfQklUfEZMT0FUKS4KKyAgICBzdGF0aWMgY29uc3RleHByIGF1ZGlvX2Zvcm1hdF90IG1NaXhlckJ1ZmZlckZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7CisKKyAgICB1aW50MzJfdCAgICAgICAgbUF1ZGlvQ2hhbm5lbENvdW50OyAvLyBhdWRpbyBjaGFubmVsIGNvdW50LCBleGNsdWRlcyBoYXB0aWMgY2hhbm5lbHMuCiAKICAgICBlbnVtIHtVTkRFRklORUQsIE1JWEVELCBaRVJPRUR9IG1NaXhlckJ1ZmZlclN0YXRlOwogICAgIE5CQUlPX0Zvcm1hdCAgICBtRm9ybWF0OwpAQCAtODQsOSArMTAwLDE3IEBACiAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgbVRpbWVzdGFtcDsKICAgICBpbnQ2NF90ICAgICAgICAgbU5hdGl2ZUZyYW1lc1dyaXR0ZW5CdXROb3RQcmVzZW50ZWQ7CiAKKyAgICBhdWRpb191dGlsczo6QmFsYW5jZSBtQmFsYW5jZTsKKwogICAgIC8vIGFjY2Vzc2VkIHdpdGhvdXQgbG9jayBiZXR3ZWVuIG11bHRpcGxlIHRocmVhZHMuCiAgICAgc3RkOjphdG9taWNfYm9vbCBtTWFzdGVyTW9ubzsKKyAgICBzdGQ6OmF0b21pYzxmbG9hdD4gbU1hc3RlckJhbGFuY2V7fTsKICAgICBzdGQ6OmF0b21pY19pbnRfZmFzdDY0X3QgbUJvb3R0aW1lT2Zmc2V0OworCisgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgbVRocmVhZElvSGFuZGxlOyAvLyBwYXJlbnQgdGhyZWFkIGlkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMKKyNpZmRlZiBURUVfU0lOSworICAgIE5CQUlPX1RlZSAgICAgICBtVGVlOworI2VuZGlmCiB9OyAgLy8gY2xhc3MgRmFzdE1peGVyCiAKIH0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcAppbmRleCAyZTRmYjhjLi5hNDJlMDljIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmNwcApAQCAtMTksNyArMTksNyBAQAogCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2lmZGVmIEZBU1RfVEhSRUFEX1NUQVRJU1RJQ1MKLSNpbmNsdWRlIDxjcHVzdGF0cy9DZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvU3RhdGlzdGljcy5oPgogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwogI2luY2x1ZGUgPGNwdXN0YXRzL1RocmVhZENwdVVzYWdlLmg+CiAjZW5kaWYKQEAgLTY4LDIxICs2OCwyMiBAQAogICAgIGRwcmludGYoZmQsICIgIEZhc3RNaXhlciBjb21tYW5kPSVzIHdyaXRlU2VxdWVuY2U9JXUgZnJhbWVzV3JpdHRlbj0ldVxuIgogICAgICAgICAgICAgICAgICIgICAgICAgICAgICBudW1UcmFja3M9JXUgd3JpdGVFcnJvcnM9JXUgdW5kZXJydW5zPSV1IG92ZXJydW5zPSV1XG4iCiAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgIHNhbXBsZVJhdGU9JXUgZnJhbWVDb3VudD0lenUgbWVhc3VyZWRXYXJtdXA9JS4zZyBtcywgd2FybXVwQ3ljbGVzPSV1XG4iCi0gICAgICAgICAgICAgICAgIiAgICAgICAgICAgIG1peFBlcmlvZD0lLjJmIG1zXG4iLAorICAgICAgICAgICAgICAgICIgICAgICAgICAgICBtaXhQZXJpb2Q9JS4yZiBtcyBsYXRlbmN5PSUuMmYgbXNcbiIsCiAgICAgICAgICAgICAgICAgRmFzdE1peGVyU3RhdGU6OmNvbW1hbmRUb1N0cmluZyhtQ29tbWFuZCksIG1Xcml0ZVNlcXVlbmNlLCBtRnJhbWVzV3JpdHRlbiwKICAgICAgICAgICAgICAgICBtTnVtVHJhY2tzLCBtV3JpdGVFcnJvcnMsIG1VbmRlcnJ1bnMsIG1PdmVycnVucywKICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUZyYW1lQ291bnQsIG1lYXN1cmVkV2FybXVwTXMsIG1XYXJtdXBDeWNsZXMsCi0gICAgICAgICAgICAgICAgbWl4UGVyaW9kU2VjICogMWUzKTsKKyAgICAgICAgICAgICAgICBtaXhQZXJpb2RTZWMgKiAxZTMsIG1MYXRlbmN5TXMpOworICAgIGRwcmludGYoZmQsICIgIEZhc3RNaXhlciBUaW1lc3RhbXAgc3RhdHM6ICVzXG4iLCBtVGltZXN0YW1wVmVyaWZpZXIudG9TdHJpbmcoKS5jX3N0cigpKTsKICNpZmRlZiBGQVNUX1RIUkVBRF9TVEFUSVNUSUNTCiAgICAgLy8gZmluZCB0aGUgaW50ZXJ2YWwgb2YgdmFsaWQgc2FtcGxlcwotICAgIHVpbnQzMl90IGJvdW5kcyA9IG1Cb3VuZHM7Ci0gICAgdWludDMyX3QgbmV3ZXN0T3BlbiA9IGJvdW5kcyAmIDB4RkZGRjsKKyAgICBjb25zdCB1aW50MzJfdCBib3VuZHMgPSBtQm91bmRzOworICAgIGNvbnN0IHVpbnQzMl90IG5ld2VzdE9wZW4gPSBib3VuZHMgJiAweEZGRkY7CiAgICAgdWludDMyX3Qgb2xkZXN0Q2xvc2VkID0gYm91bmRzID4+IDE2OwogCiAgICAgLy91aW50MzJfdCBuID0gKG5ld2VzdE9wZW4gLSBvbGRlc3RDbG9zZWQpICYgMHhGRkZGOwogICAgIHVpbnQzMl90IG47CiAgICAgX19idWlsdGluX3N1Yl9vdmVyZmxvdyhuZXdlc3RPcGVuLCBvbGRlc3RDbG9zZWQsICZuKTsKLSAgICBuID0gbiAmIDB4RkZGRjsKKyAgICBuICY9IDB4RkZGRjsKIAogICAgIGlmIChuID4gbVNhbXBsaW5nTikgewogICAgICAgICBBTE9HRSgidG9vIG1hbnkgc2FtcGxlcyAldSIsIG4pOwpAQCAtOTAsOSArOTEsOSBAQAogICAgIH0KICAgICAvLyBzdGF0aXN0aWNzIGZvciBtb25vdG9uaWMgKHdhbGwgY2xvY2spIHRpbWUsIHRocmVhZCByYXcgQ1BVIGxvYWQgaW4gdGltZSwgQ1BVIGNsb2NrIGZyZXF1ZW5jeSwKICAgICAvLyBhbmQgYWRqdXN0ZWQgQ1BVIGxvYWQgaW4gTUh6IG5vcm1hbGl6ZWQgZm9yIENQVSBjbG9jayBmcmVxdWVuY3kKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIHdhbGwsIGxvYWROczsKKyAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IHdhbGwsIGxvYWROczsKICNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKLSAgICBDZW50cmFsVGVuZGVuY3lTdGF0aXN0aWNzIGtIeiwgbG9hZE1IejsKKyAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IGtIeiwgbG9hZE1IejsKICAgICB1aW50MzJfdCBwcmV2aW91c0NwdWtIeiA9IDA7CiAjZW5kaWYKICAgICAvLyBBc3N1bWluZyBhIG5vcm1hbCBkaXN0cmlidXRpb24gZm9yIGN5Y2xlIHRpbWVzLCB0aHJlZSBzdGFuZGFyZCBkZXZpYXRpb25zIG9uIGVpdGhlciBzaWRlIG9mCkBAIC0xMDcsMTggKzEwOCwxOCBAQAogICAgICAgICBpZiAodGFpbCAhPSBOVUxMKSB7CiAgICAgICAgICAgICB0YWlsW2pdID0gd2FsbE5zOwogICAgICAgICB9Ci0gICAgICAgIHdhbGwuc2FtcGxlKHdhbGxOcyk7CisgICAgICAgIHdhbGwuYWRkKHdhbGxOcyk7CiAgICAgICAgIHVpbnQzMl90IHNhbXBsZUxvYWROcyA9IG1Mb2FkTnNbaV07Ci0gICAgICAgIGxvYWROcy5zYW1wbGUoc2FtcGxlTG9hZE5zKTsKKyAgICAgICAgbG9hZE5zLmFkZChzYW1wbGVMb2FkTnMpOwogI2lmZGVmIENQVV9GUkVRVUVOQ1lfU1RBVElTVElDUwogICAgICAgICB1aW50MzJfdCBzYW1wbGVDcHVrSHogPSBtQ3B1a0h6W2ldOwogICAgICAgICAvLyBza2lwIGJhZCBrSHogc2FtcGxlcwogICAgICAgICBpZiAoKHNhbXBsZUNwdWtIeiAmIH4weEYpICE9IDApIHsKLSAgICAgICAgICAgIGtIei5zYW1wbGUoc2FtcGxlQ3B1a0h6ID4+IDQpOworICAgICAgICAgICAga0h6LmFkZChzYW1wbGVDcHVrSHogPj4gNCk7CiAgICAgICAgICAgICBpZiAoc2FtcGxlQ3B1a0h6ID09IHByZXZpb3VzQ3B1a0h6KSB7CiAgICAgICAgICAgICAgICAgZG91YmxlIG1lZ2FjeWNsZXMgPSAoZG91YmxlKSBzYW1wbGVMb2FkTnMgKiAoZG91YmxlKSAoc2FtcGxlQ3B1a0h6ID4+IDQpICogMWUtMTI7CiAgICAgICAgICAgICAgICAgZG91YmxlIGFkak1IeiA9IG1lZ2FjeWNsZXMgLyBtaXhQZXJpb2RTZWM7ICAvLyBfbm90XyB3YWxsTnMgKiAxZTkKLSAgICAgICAgICAgICAgICBsb2FkTUh6LnNhbXBsZShhZGpNSHopOworICAgICAgICAgICAgICAgIGxvYWRNSHouYWRkKGFkak1Ieik7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgcHJldmlvdXNDcHVrSHogPSBzYW1wbGVDcHVrSHo7CkBAIC0xMjYsNDIgKzEyNyw0MiBAQAogICAgIH0KICAgICBpZiAobikgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBTaW1wbGUgbW92aW5nIHN0YXRpc3RpY3Mgb3ZlciBsYXN0ICUuMWYgc2Vjb25kczpcbiIsCi0gICAgICAgICAgICAgICAgICAgIHdhbGwubigpICogbWl4UGVyaW9kU2VjKTsKKyAgICAgICAgICAgICAgICAgICAgd2FsbC5nZXROKCkgKiBtaXhQZXJpb2RTZWMpOwogICAgICAgICBkcHJpbnRmKGZkLCAiICAgIHdhbGwgY2xvY2sgdGltZSBpbiBtcyBwZXIgbWl4IGN5Y2xlOlxuIgogICAgICAgICAgICAgICAgICAgICAiICAgICAgbWVhbj0lLjJmIG1pbj0lLjJmIG1heD0lLjJmIHN0ZGRldj0lLjJmXG4iLAotICAgICAgICAgICAgICAgICAgICB3YWxsLm1lYW4oKSoxZS02LCB3YWxsLm1pbmltdW0oKSoxZS02LCB3YWxsLm1heGltdW0oKSoxZS02LAotICAgICAgICAgICAgICAgICAgICB3YWxsLnN0ZGRldigpKjFlLTYpOworICAgICAgICAgICAgICAgICAgICB3YWxsLmdldE1lYW4oKSoxZS02LCB3YWxsLmdldE1pbigpKjFlLTYsIHdhbGwuZ2V0TWF4KCkqMWUtNiwKKyAgICAgICAgICAgICAgICAgICAgd2FsbC5nZXRTdGREZXYoKSoxZS02KTsKICAgICAgICAgZHByaW50ZihmZCwgIiAgICByYXcgQ1BVIGxvYWQgaW4gdXMgcGVyIG1peCBjeWNsZTpcbiIKICAgICAgICAgICAgICAgICAgICAgIiAgICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKLSAgICAgICAgICAgICAgICAgICAgbG9hZE5zLm1lYW4oKSoxZS0zLCBsb2FkTnMubWluaW11bSgpKjFlLTMsIGxvYWROcy5tYXhpbXVtKCkqMWUtMywKLSAgICAgICAgICAgICAgICAgICAgbG9hZE5zLnN0ZGRldigpKjFlLTMpOworICAgICAgICAgICAgICAgICAgICBsb2FkTnMuZ2V0TWVhbigpKjFlLTMsIGxvYWROcy5nZXRNaW4oKSoxZS0zLCBsb2FkTnMuZ2V0TWF4KCkqMWUtMywKKyAgICAgICAgICAgICAgICAgICAgbG9hZE5zLmdldFN0ZERldigpKjFlLTMpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIEZhc3RNaXhlciBzdGF0aXN0aWNzIGF2YWlsYWJsZSBjdXJyZW50bHlcbiIpOwogICAgIH0KICNpZmRlZiBDUFVfRlJFUVVFTkNZX1NUQVRJU1RJQ1MKICAgICBkcHJpbnRmKGZkLCAiICBDUFUgY2xvY2sgZnJlcXVlbmN5IGluIE1IejpcbiIKICAgICAgICAgICAgICAgICAiICAgIG1lYW49JS4wZiBtaW49JS4wZiBtYXg9JS4wZiBzdGRkZXY9JS4wZlxuIiwKLSAgICAgICAgICAgICAgICBrSHoubWVhbigpKjFlLTMsIGtIei5taW5pbXVtKCkqMWUtMywga0h6Lm1heGltdW0oKSoxZS0zLCBrSHouc3RkZGV2KCkqMWUtMyk7CisgICAgICAgICAgICAgICAga0h6LmdldE1lYW4oKSoxZS0zLCBrSHouZ2V0TWluKCkqMWUtMywga0h6LmdldE1heCgpKjFlLTMsIGtIei5nZXRTdGREZXYoKSoxZS0zKTsKICAgICBkcHJpbnRmKGZkLCAiICBhZGp1c3RlZCBDUFUgbG9hZCBpbiBNSHogKGkuZS4gbm9ybWFsaXplZCBmb3IgQ1BVIGNsb2NrIGZyZXF1ZW5jeSk6XG4iCiAgICAgICAgICAgICAgICAgIiAgICBtZWFuPSUuMWYgbWluPSUuMWYgbWF4PSUuMWYgc3RkZGV2PSUuMWZcbiIsCi0gICAgICAgICAgICAgICAgbG9hZE1Iei5tZWFuKCksIGxvYWRNSHoubWluaW11bSgpLCBsb2FkTUh6Lm1heGltdW0oKSwgbG9hZE1Iei5zdGRkZXYoKSk7CisgICAgICAgICAgICAgICAgbG9hZE1Iei5nZXRNZWFuKCksIGxvYWRNSHouZ2V0TWluKCksIGxvYWRNSHouZ2V0TWF4KCksIGxvYWRNSHouZ2V0U3RkRGV2KCkpOwogI2VuZGlmCiAgICAgaWYgKHRhaWwgIT0gTlVMTCkgewogICAgICAgICBxc29ydCh0YWlsLCBuLCBzaXplb2YodWludDMyX3QpLCBjb21wYXJlX3VpbnQzMl90KTsKICAgICAgICAgLy8gYXNzdW1lIHNhbWUgbnVtYmVyIG9mIHRhaWwgc2FtcGxlcyBvbiBlYWNoIHNpZGUsIGxlZnQgYW5kIHJpZ2h0CiAgICAgICAgIHVpbnQzMl90IGNvdW50ID0gbiAvIGtUYWlsRGVub21pbmF0b3I7Ci0gICAgICAgIENlbnRyYWxUZW5kZW5jeVN0YXRpc3RpY3MgbGVmdCwgcmlnaHQ7CisgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbGVmdCwgcmlnaHQ7CiAgICAgICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgICAgICBsZWZ0LnNhbXBsZSh0YWlsW2ldKTsKLSAgICAgICAgICAgIHJpZ2h0LnNhbXBsZSh0YWlsW24gLSAoaSArIDEpXSk7CisgICAgICAgICAgICBsZWZ0LmFkZCh0YWlsW2ldKTsKKyAgICAgICAgICAgIHJpZ2h0LmFkZCh0YWlsW24gLSAoaSArIDEpXSk7CiAgICAgICAgIH0KICAgICAgICAgZHByaW50ZihmZCwgIiAgRGlzdHJpYnV0aW9uIG9mIG1peCBjeWNsZSB0aW1lcyBpbiBtcyBmb3IgdGhlIHRhaWxzICIKICAgICAgICAgICAgICAgICAgICAgIig+IH4zIHN0ZGRldiBvdXRsaWVycyk6XG4iCiAgICAgICAgICAgICAgICAgICAgICIgICAgbGVmdCB0YWlsOiBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIKICAgICAgICAgICAgICAgICAgICAgIiAgICByaWdodCB0YWlsOiBtZWFuPSUuMmYgbWluPSUuMmYgbWF4PSUuMmYgc3RkZGV2PSUuMmZcbiIsCi0gICAgICAgICAgICAgICAgICAgIGxlZnQubWVhbigpKjFlLTYsIGxlZnQubWluaW11bSgpKjFlLTYsIGxlZnQubWF4aW11bSgpKjFlLTYsIGxlZnQuc3RkZGV2KCkqMWUtNiwKLSAgICAgICAgICAgICAgICAgICAgcmlnaHQubWVhbigpKjFlLTYsIHJpZ2h0Lm1pbmltdW0oKSoxZS02LCByaWdodC5tYXhpbXVtKCkqMWUtNiwKLSAgICAgICAgICAgICAgICAgICAgcmlnaHQuc3RkZGV2KCkqMWUtNik7CisgICAgICAgICAgICAgICAgICAgIGxlZnQuZ2V0TWVhbigpKjFlLTYsIGxlZnQuZ2V0TWluKCkqMWUtNiwgbGVmdC5nZXRNYXgoKSoxZS02LCBsZWZ0LmdldFN0ZERldigpKjFlLTYsCisgICAgICAgICAgICAgICAgICAgIHJpZ2h0LmdldE1lYW4oKSoxZS02LCByaWdodC5nZXRNaW4oKSoxZS02LCByaWdodC5nZXRNYXgoKSoxZS02LAorICAgICAgICAgICAgICAgICAgICByaWdodC5nZXRTdGREZXYoKSoxZS02KTsKICAgICAgICAgZGVsZXRlW10gdGFpbDsKICAgICB9CiAjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJEdW1wU3RhdGUuaAppbmRleCA4ZWYzMWQxLi45YjkxY2JjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyRHVtcFN0YXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlckR1bXBTdGF0ZS5oCkBAIC0xOCw2ICsxOCw3IEBACiAjZGVmaW5lIEFORFJPSURfQVVESU9fRkFTVF9NSVhFUl9EVU1QX1NUQVRFX0gKIAogI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1RpbWVzdGFtcFZlcmlmaWVyLmg+CiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgIkZhc3RUaHJlYWREdW1wU3RhdGUuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXJTdGF0ZS5oIgpAQCAtNjYsNiArNjcsNyBAQAogCiAgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7ICAgIC8vIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbiBhIHN0YWJsZSBjb3B5LCBub3QgdGhlIG9yaWdpbmFsCiAKKyAgICBkb3VibGUgICBtTGF0ZW5jeU1zID0gMC47ICAgLy8gbWVhc3VyZWQgbGF0ZW5jeSwgZGVmYXVsdCBvZiAwIGlmIG5vIHZhbGlkIHRpbWVzdGFtcCByZWFkLgogICAgIHVpbnQzMl90IG1Xcml0ZVNlcXVlbmNlOyAgICAvLyBpbmNyZW1lbnRlZCBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggd3JpdGUoKQogICAgIHVpbnQzMl90IG1GcmFtZXNXcml0dGVuOyAgICAvLyB0b3RhbCBudW1iZXIgb2YgZnJhbWVzIHdyaXR0ZW4gc3VjY2Vzc2Z1bGx5CiAgICAgdWludDMyX3QgbU51bVRyYWNrczsgICAgICAgIC8vIHRvdGFsIG51bWJlciBvZiBhY3RpdmUgZmFzdCB0cmFja3MKQEAgLTc0LDYgKzc2LDkgQEAKICAgICBzaXplX3QgICBtRnJhbWVDb3VudDsKICAgICB1aW50MzJfdCBtVHJhY2tNYXNrOyAgICAgICAgLy8gbWFzayBvZiBhY3RpdmUgdHJhY2tzCiAgICAgRmFzdFRyYWNrRHVtcCAgIG1UcmFja3NbRmFzdE1peGVyU3RhdGU6OmtNYXhGYXN0VHJhY2tzXTsKKworICAgIC8vIEZvciB0aW1lc3RhbXAgc3RhdGlzdGljcy4KKyAgICBUaW1lc3RhbXBWZXJpZmllcjxpbnQ2NF90IC8qIGZyYW1lIGNvdW50ICovLCBpbnQ2NF90IC8qIHRpbWUgbnMgKi8+IG1UaW1lc3RhbXBWZXJpZmllcjsKIH07CiAKIH0gICAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmNwcAppbmRleCAzNmQ4ZWVmLi5iOTg4NDJkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdE1peGVyU3RhdGUuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5jcHAKQEAgLTM1LDcgKzM1LDcgQEAKIEZhc3RNaXhlclN0YXRlOjpGYXN0TWl4ZXJTdGF0ZSgpIDogRmFzdFRocmVhZFN0YXRlKCksCiAgICAgLy8gbUZhc3RUcmFja3MKICAgICBtRmFzdFRyYWNrc0dlbigwKSwgbVRyYWNrTWFzaygwKSwgbU91dHB1dFNpbmsoTlVMTCksIG1PdXRwdXRTaW5rR2VuKDApLAotICAgIG1GcmFtZUNvdW50KDApLCBtVGVlU2luayhOVUxMKQorICAgIG1GcmFtZUNvdW50KDApCiB7CiAgICAgaW50IG9rID0gcHRocmVhZF9vbmNlKCZzTWF4RmFzdFRyYWNrc09uY2UsIHNNYXhGYXN0VHJhY2tzSW5pdCk7CiAgICAgaWYgKG9rICE9IDApIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0TWl4ZXJTdGF0ZS5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKaW5kZXggMmJlMWU5MS4uMzk2Yzc5NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RNaXhlclN0YXRlLmgKQEAgLTE5LDYgKzE5LDcgQEAKIAogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL21pbmlmbG9hdC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvTWl4ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9FeHRlbmRlZEF1ZGlvQnVmZmVyUHJvdmlkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9uYmFpby9OQkFJTy5oPgogI2luY2x1ZGUgPG1lZGlhL25ibG9nL05CTG9nLmg+CkBAIC00Nyw2ICs0OCw5IEBACiAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgICAgbUNoYW5uZWxNYXNrOyAgICAvLyBBVURJT19DSEFOTkVMX09VVF9NT05PIG9yIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTwogICAgIGF1ZGlvX2Zvcm1hdF90ICAgICAgICAgIG1Gb3JtYXQ7ICAgICAgICAgLy8gdHJhY2sgZm9ybWF0CiAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgbUdlbmVyYXRpb247ICAgICAvLyBpbmNyZW1lbnQgd2hlbiBhbnkgZmllbGQgaXMgYXNzaWduZWQKKyAgICBib29sICAgICAgICAgICAgICAgICAgICBtSGFwdGljUGxheWJhY2tFbmFibGVkID0gZmFsc2U7IC8vIGhhcHRpYyBwbGF5YmFjayBpcyBlbmFibGVkIG9yIG5vdAorICAgIEF1ZGlvTWl4ZXI6OmhhcHRpY19pbnRlbnNpdHlfdCBtSGFwdGljSW50ZW5zaXR5ID0gQXVkaW9NaXhlcjo6SEFQVElDX1NDQUxFX01VVEU7IC8vIGludGVuc2l0eSBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGhhcHRpYyBkYXRhCiB9OwogCiAvLyBSZXByZXNlbnRzIGEgc2luZ2xlIHN0YXRlIG9mIHRoZSBmYXN0IG1peGVyCkBAIC02OSw2ICs3Myw5IEBACiAgICAgTkJBSU9fU2luayogbU91dHB1dFNpbms7ICAgIC8vIEhBTCBvdXRwdXQgZGV2aWNlLCBtdXN0IGFscmVhZHkgYmUgbmVnb3RpYXRlZAogICAgIGludCAgICAgICAgIG1PdXRwdXRTaW5rR2VuOyAvLyBpbmNyZW1lbnQgd2hlbiBtT3V0cHV0U2luayBpcyBhc3NpZ25lZAogICAgIHNpemVfdCAgICAgIG1GcmFtZUNvdW50OyAgICAvLyBudW1iZXIgb2YgZnJhbWVzIHBlciBmYXN0IG1peCBidWZmZXIKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtU2lua0NoYW5uZWxNYXNrOyAvLyBJZiBub3QgQVVESU9fQ0hBTk5FTF9OT05FLCBzcGVjaWZpZXMgc2luayBjaGFubmVsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFzayB3aGVuIGl0IGNhbm5vdCBiZSBkaXJlY3RseSBjYWxjdWxhdGVkIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGFubmVsIGNvdW50CiAKICAgICAvLyBFeHRlbmRzIEZhc3RUaHJlYWRTdGF0ZTo6Q29tbWFuZAogICAgIHN0YXRpYyBjb25zdCBDb21tYW5kCkBAIC03Nyw5ICs4NCw2IEBACiAgICAgICAgIFdSSVRFID0gMHgxMCwgICAgICAgICAgIC8vIHdyaXRlIHRvIG91dHB1dCBzaW5rCiAgICAgICAgIE1JWF9XUklURSA9IDB4MTg7ICAgICAgIC8vIG1peCB0cmFja3MgYW5kIHdyaXRlIHRvIG91dHB1dCBzaW5rCiAKLSAgICAvLyBUaGlzIG1pZ2h0IGJlIGEgb25lLXRpbWUgY29uZmlndXJhdGlvbiByYXRoZXIgdGhhbiBwZXItc3RhdGUKLSAgICBOQkFJT19TaW5rKiBtVGVlU2luazsgICAgICAgLy8gaWYgbm9uLU5VTEwsIHRoZW4gZHVwbGljYXRlIHdyaXRlKClzIHRvIHRoaXMgbm9uLWJsb2NraW5nIHNpbmsKLQogICAgIC8vIG5ldmVyIHJldHVybnMgTlVMTDsgYXNzZXJ0cyBpZiBjb21tYW5kIGlzIGludmFsaWQKICAgICBzdGF0aWMgY29uc3QgY2hhciAqY29tbWFuZFRvU3RyaW5nKENvbW1hbmQgY29tbWFuZCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmNwcAppbmRleCAzNDQ2ZGM3Li40N2ZlMGIzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuY3BwCkBAIC0yMiw2ICsyMiw3IEBACiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CiAjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgogI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgpAQCAtNjUsOCArNjYsNiBAQAogICAgIC8qIG1NZWFzdXJlZFdhcm11cFRzKHswLCAwfSksICovCiAgICAgbVdhcm11cEN5Y2xlcygwKSwKICAgICBtV2FybXVwQ29uc2VjdXRpdmVJblJhbmdlQ3ljbGVzKDApLAotICAgIC8vIG1EdW1teU5CTG9nV3JpdGVyCi0gICAgbU5CTG9nV3JpdGVyKCZtRHVtbXlOQkxvZ1dyaXRlciksCiAgICAgbVRpbWVzdGFtcFN0YXR1cyhJTlZBTElEX09QRVJBVElPTiksCiAKICAgICBtQ29tbWFuZChGYXN0VGhyZWFkU3RhdGU6OklOSVRJQUwpLApAQCAtOTMsNyArOTIsNyBAQAogewogICAgIC8vIExPR1Qgbm93IHdvcmtzIGV2ZW4gaWYgdGxOQkxvZ1dyaXRlciBpcyBudWxscHRyLCBidXQgd2UncmUgY29uc2lkZXJpbmcgY2hhbmdpbmcgdGhhdCwKICAgICAvLyBzbyB0aGlzIGluaXRpYWxpemF0aW9uIHBlcm1pdHMgYSBmdXR1cmUgY2hhbmdlIHRvIHJlbW92ZSB0aGUgY2hlY2sgZm9yIG51bGxwdHIuCi0gICAgdGxOQkxvZ1dyaXRlciA9ICZtRHVtbXlOQkxvZ1dyaXRlcjsKKyAgICB0bE5CTG9nV3JpdGVyID0gbUR1bW15TkJMb2dXcml0ZXIuZ2V0KCk7CiAgICAgZm9yICg7OykgewogCiAgICAgICAgIC8vIGVpdGhlciBuYW5vc2xlZXAsIHNjaGVkX3lpZWxkLCBvciBidXN5IHdhaXQKQEAgLTEyMyw5ICsxMjIsOSBAQAogCiAgICAgICAgICAgICAvLyBBcyBzb29uIGFzIHBvc3NpYmxlIG9mIGxlYXJuaW5nIG9mIGEgbmV3IGR1bXAgYXJlYSwgc3RhcnQgdXNpbmcgaXQKICAgICAgICAgICAgIG1EdW1wU3RhdGUgPSBuZXh0LT5tRHVtcFN0YXRlICE9IE5VTEwgPyBuZXh0LT5tRHVtcFN0YXRlIDogbUR1bW15RHVtcFN0YXRlOwotICAgICAgICAgICAgbU5CTG9nV3JpdGVyID0gbmV4dC0+bU5CTG9nV3JpdGVyICE9IE5VTEwgPyBuZXh0LT5tTkJMb2dXcml0ZXIgOiAmbUR1bW15TkJMb2dXcml0ZXI7Ci0gICAgICAgICAgICBzZXROQkxvZ1dyaXRlcihtTkJMb2dXcml0ZXIpOyAgIC8vIEZhc3RNaXhlciBpbmZvcm1zIGl0cyBBdWRpb01peGVyLCBGYXN0Q2FwdHVyZSBpZ25vcmVzCi0gICAgICAgICAgICB0bE5CTG9nV3JpdGVyID0gbU5CTG9nV3JpdGVyOworICAgICAgICAgICAgdGxOQkxvZ1dyaXRlciA9IG5leHQtPm1OQkxvZ1dyaXRlciAhPSBOVUxMID8KKyAgICAgICAgICAgICAgICAgICAgbmV4dC0+bU5CTG9nV3JpdGVyIDogbUR1bW15TkJMb2dXcml0ZXIuZ2V0KCk7CisgICAgICAgICAgICBzZXROQkxvZ1dyaXRlcih0bE5CTG9nV3JpdGVyKTsgLy8gVGhpcyBpcyB1c2VkIGZvciBkZWJ1Z2dpbmcgb25seQogCiAgICAgICAgICAgICAvLyBXZSB3YW50IHRvIGFsd2F5cyBoYXZlIGEgdmFsaWQgcmVmZXJlbmNlIHRvIHRoZSBwcmV2aW91cyAobm9uLWlkbGUpIHN0YXRlLgogICAgICAgICAgICAgLy8gSG93ZXZlciwgdGhlIHN0YXRlIHF1ZXVlIG9ubHkgZ3VhcmFudGVlcyBhY2Nlc3MgdG8gY3VycmVudCBhbmQgcHJldmlvdXMgc3RhdGVzLgpAQCAtMjYwLDYgKzI1OSw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBtSXNXYXJtID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1NZWFzdXJlZFdhcm11cFRzID0gbU1lYXN1cmVkV2FybXVwVHM7CiAgICAgICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tV2FybXVwQ3ljbGVzID0gbVdhcm11cEN5Y2xlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtZWFzdXJlZFdhcm11cE1zID0gKG1NZWFzdXJlZFdhcm11cFRzLnR2X3NlYyAqIDFlMykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobU1lYXN1cmVkV2FybXVwVHMudHZfbnNlYyAqIDFlLTYpOworICAgICAgICAgICAgICAgICAgICAgICAgTE9HX1dBUk1VUF9USU1FKG1lYXN1cmVkV2FybXVwTXMpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIG1TbGVlcE5zID0gLTE7CkBAIC0yNzAsNiArMjcyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJ1bmRlcnJ1bjogdGltZSBzaW5jZSBsYXN0IGN5Y2xlICVkLiUwM2xkIHNlYyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpIHNlYywgbnNlYyAvIDEwMDAwMDBMKTsKICAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1VbmRlcnJ1bnMrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIExPR19VTkRFUlJVTihhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZuZXdUcykpOwogICAgICAgICAgICAgICAgICAgICAgICAgbUlnbm9yZU5leHRPdmVycnVuID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChuc2VjIDwgbU92ZXJydW5OcykgewogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1JZ25vcmVOZXh0T3ZlcnJ1bikgewpAQCAtMjc5LDYgKzI4Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIm92ZXJydW46IHRpbWUgc2luY2UgbGFzdCBjeWNsZSAlZC4lMDNsZCBzZWMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCkgc2VjLCBuc2VjIC8gMTAwMDAwMEwpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1PdmVycnVucysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPR19PVkVSUlVOKGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWMoJm5ld1RzKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGZvcmNlcyBhIG1pbmltdW0gY3ljbGUgdGltZS4gSXQ6CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgLSBjb21wZW5zYXRlcyBmb3IgYW4gYXVkaW8gSEFMIHdpdGggaml0dGVyIGR1ZSB0byBzYW1wbGUgcmF0ZSBjb252ZXJzaW9uCkBAIC0zMzksNiArMzQzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgLy8gdGhlc2Ugc3RvcmVzICMxLCAjMiwgIzMgYXJlIG5vdCBhdG9taWMgd2l0aCByZXNwZWN0IHRvIGVhY2ggb3RoZXIsCiAgICAgICAgICAgICAgICAgICAgIC8vIG9yIHdpdGggcmVzcGVjdCB0byBzdG9yZSAjNCBiZWxvdwogICAgICAgICAgICAgICAgICAgICBtRHVtcFN0YXRlLT5tTW9ub3RvbmljTnNbaV0gPSBtb25vdG9uaWNOczsKKyAgICAgICAgICAgICAgICAgICAgTE9HX1dPUktfVElNRShtb25vdG9uaWNOcyk7CiAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1Mb2FkTnNbaV0gPSBsb2FkTnM7CiAjaWZkZWYgQ1BVX0ZSRVFVRU5DWV9TVEFUSVNUSUNTCiAgICAgICAgICAgICAgICAgICAgIG1EdW1wU3RhdGUtPm1DcHVrSHpbaV0gPSBrSHo7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL0Zhc3RUaHJlYWQuaAppbmRleCAyYTcxNDE0Li4zZjZiMjA2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvRmFzdFRocmVhZC5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9GYXN0VGhyZWFkLmgKQEAgLTc4LDEyICs3OCwxMSBAQAogICAgIHVuc2lnbmVkICAgICAgICBtQ29sZEdlbjsgICAgICAgLy8gbGFzdCBvYnNlcnZlZCBtQ29sZEdlbgogICAgIGJvb2wgICAgICAgICAgICBtSXNXYXJtOyAgICAgICAgLy8gdHJ1ZSBtZWFucyByZWFkeSB0byBtaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmYWxzZSBtZWFucyB3YWl0IGZvciB3YXJtdXAgYmVmb3JlIG1peGluZwotICAgIHN0cnVjdCB0aW1lc3BlYyBtTWVhc3VyZWRXYXJtdXBUczsgIC8vIGhvdyBsb25nIGRpZCBpdCB0YWtlIGZvciB3YXJtdXAgdG8gY29tcGxldGUKLSAgICB1aW50MzJfdCAgICAgICAgbVdhcm11cEN5Y2xlczsgIC8vIGNvdW50ZXIgb2YgbnVtYmVyIG9mIGxvb3AgY3ljbGVzIGR1cmluZyB3YXJtdXAgcGhhc2UKLSAgICB1aW50MzJfdCAgICAgICAgbVdhcm11cENvbnNlY3V0aXZlSW5SYW5nZUN5Y2xlczsgICAgLy8gbnVtYmVyIG9mIGNvbnNlY3V0aXZlIGN5Y2xlcyBpbiByYW5nZQotICAgIE5CTG9nOjpXcml0ZXIgICBtRHVtbXlOQkxvZ1dyaXRlcjsKLSAgICBOQkxvZzo6V3JpdGVyKiAgbU5CTG9nV3JpdGVyOyAgIC8vIGFsd2F5cyBub24tbnVsbHB0cjogcmVhbCBOQkxvZzo6V3JpdGVyKiBvciAmbUR1bW15TkJMb2dXcml0ZXIKLSAgICBzdGF0dXNfdCAgICAgICAgbVRpbWVzdGFtcFN0YXR1czsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgICBtTWVhc3VyZWRXYXJtdXBUczsgIC8vIGhvdyBsb25nIGRpZCBpdCB0YWtlIGZvciB3YXJtdXAgdG8gY29tcGxldGUKKyAgICB1aW50MzJfdCAgICAgICAgICBtV2FybXVwQ3ljbGVzOyAgLy8gY291bnRlciBvZiBudW1iZXIgb2YgbG9vcCBjeWNsZXMgZHVyaW5nIHdhcm11cCBwaGFzZQorICAgIHVpbnQzMl90ICAgICAgICAgIG1XYXJtdXBDb25zZWN1dGl2ZUluUmFuZ2VDeWNsZXM7ICAgIC8vIG51bWJlciBvZiBjb25zZWN1dGl2ZSBjeWNsZXMgaW4gcmFuZ2UKKyAgICBjb25zdCBzcDxOQkxvZzo6V3JpdGVyPiBtRHVtbXlOQkxvZ1dyaXRlcntuZXcgTkJMb2c6OldyaXRlcigpfTsKKyAgICBzdGF0dXNfdCAgICAgICAgICBtVGltZXN0YW1wU3RhdHVzOwogCiAgICAgRmFzdFRocmVhZFN0YXRlOjpDb21tYW5kIG1Db21tYW5kOwogICAgIGJvb2wgICAgICAgICAgICBtQXR0ZW1wdGVkV3JpdGU7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL01tYXBUcmFja3MuaAppbmRleCA2ZjU0NmMzLi5iODNmNmI1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTW1hcFRyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9NbWFwVHJhY2tzLmgKQEAgLTI4LDggKzI4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc091dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNyZWF0b3JQaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5NbWFwVHJhY2soKTsKIApAQCAtMzksOCArNDEsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHN0b3AoKTsKICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRmFzdFRyYWNrKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzRGlyZWN0KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQogCi0gICAgIHN0YXRpYyB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7CisgICAgICAgICAgICB2b2lkICAgICAgICBhcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBhcHBlbmREdW1wKFN0cmluZzgmIHJlc3VsdCwgYm9vbCBhY3RpdmUpOwogCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcm90ZWN0ZWQgYnkgTU1hcFRocmVhZDo6bUxvY2sKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9OQkFJT19UZWUuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL05CQUlPX1RlZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTMwODNkNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9OQkFJT19UZWUuY3BwCkBAIC0wLDAgKzEsNTE3IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJOQkFJT19UZWUiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGZ1dHVyZT4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Zvcm1hdC5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3NuZGZpbGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9uYmFpby9QaXBlUmVhZGVyLmg+CisKKyNpbmNsdWRlICJDb25maWd1cmF0aW9uLmgiCisjaW5jbHVkZSAiTkJBSU9fVGVlLmgiCisKKy8vIEVuYWJsZWQgd2l0aCBURUVfU0lOSyBpbiBDb25maWd1cmF0aW9uLmgKKyNpZmRlZiBURUVfU0lOSworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qCisgVGVlIGZpbGVuYW1lcyBnZW5lcmF0ZWQgYXMgZm9sbG93czoKKworICJhZnRlZV9EYXRlX1RocmVhZElkX0NfcmVhc29uLndhdiIgUmVjb3JkVGhyZWFkCisgImFmdGVlX0RhdGVfVGhyZWFkSWRfTV9yZWFzb24ud2F2IiBNaXhlclRocmVhZCAoTm9ybWFsKQorICJhZnRlZV9EYXRlX1RocmVhZElkX0ZfcmVhc29uLndhdiIgTWl4ZXJUaHJlYWQgKEZhc3QpCisgImFmdGVlX0RhdGVfVGhyZWFkSWRfVHJhY2tJZF9SX3JlYXNvbi53YXYiIFJlY29yZFRyYWNrCisgImFmdGVlX0RhdGVfVGhyZWFkSWRfVHJhY2tJZF9UcmFja05hbWVfVF9yZWFzb24ud2F2IiBQbGF5YmFja1RyYWNrCisKKyB3aGVyZSBEYXRlID0gWVlZWW1tZGRfSEhNTVNTX01TRUMKKworIHdoZXJlIFJlYXNvbiA9IFsgRFRPUiB8IERVTVAgfCBSRU1PVkUgXQorCisgRXhhbXBsZXM6CisgIGFmdGVlXzIwMTgwNDI0XzE1MzgxMV8wMzhfMTNfNTdfMl9UX1JFTU9WRS53YXYKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODExXzIxOF8xM181N18yX1RfUkVNT1ZFLndhdgorICBhZnRlZV8yMDE4MDQyNF8xNTM4MTFfMzc4XzEzXzU3XzJfVF9SRU1PVkUud2F2CisgIGFmdGVlXzIwMTgwNDI0XzE1MzgyNV8xNDdfNjJfQ19EVU1QLndhdgorICBhZnRlZV8yMDE4MDQyNF8xNTM4MjVfMTQ4XzYyXzU5X1JfRFVNUC53YXYKKyAgYWZ0ZWVfMjAxODA0MjRfMTUzODI1XzE0OV8xM19GX0RVTVAud2F2CisgIGFmdGVlXzIwMTgwNDI0XzE1Mzg0Ml8xMjVfNjJfNTlfUl9SRU1PVkUud2F2CisgIGFmdGVlXzIwMTgwNDI0XzE1Mzg0Ml8xNjhfNjJfQ19EVE9SLndhdgorKi8KKworc3RhdGljIGNvbnN0ZXhwciBjaGFyIERFRkFVTFRfUFJFRklYW10gPSAiYWZ0ZWVfIjsKK3N0YXRpYyBjb25zdGV4cHIgY2hhciBERUZBVUxUX0RJUkVDVE9SWVtdID0gIi9kYXRhL21pc2MvYXVkaW9zZXJ2ZXIiOworc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgREVGQVVMVF9USFJFQURQT09MX1NJWkUgPSA4OworCisvKiogQXVkaW9GaWxlSGFuZGxlciBtYW5hZ2VzIHRlbXBvcmFyeSBhdWRpbyB3YXYgZmlsZXMgd2l0aCBhIGxlYXN0IHJlY2VudGx5IGNyZWF0ZWQKKyAgICByZXRlbnRpb24gcG9saWN5LgorCisgICAgVGhlIHRlbXBvcmFyeSBmaWxlbmFtZXMgYXJlIHN5c3RlbWF0aWNhbGx5IGdlbmVyYXRlZC4gQSBjb21tb24gZmlsZW5hbWUgcHJlZml4LAorICAgIHN0b3JhZ2UgZGlyZWN0b3J5LCBhbmQgY29uY3VycmVuY3kgcG9vbCBhcmUgcGFzc2VkIGluIG9uIGNyZWF0aW5nIHRoZSBvYmplY3QuCisKKyAgICBUZW1wb3JhcnkgZmlsZXMgYXJlIGNyZWF0ZWQgYnkgImNyZWF0ZSIsIHdoaWNoIHJldHVybnMgYSBmaWxlbmFtZSBnZW5lcmF0ZWQgYnkKKworICAgIHByZWZpeCArIDE0IGNoYXIgZGF0ZSArIHN1ZmZpeAorCisgICAgVE9ETyBNb3ZlIHRvIGF1ZGlvX3V0aWxzLgorICAgIFRPRE8gQXZvaWQgcG9pbnRpbmcgdHdvIEF1ZGlvRmlsZUhhbmRsZXJzIHRvIHRoZSBzYW1lIGRpcmVjdG9yeSBhbmQgcHJlZml4CisgICAgYXMgd2UgZG9uJ3QgaGF2ZSBhIHByZWZpeCBzcGVjaWZpYyBsb2NrIGZpbGUuICovCisKK2NsYXNzIEF1ZGlvRmlsZUhhbmRsZXIgeworcHVibGljOgorCisgICAgQXVkaW9GaWxlSGFuZGxlcihjb25zdCBzdGQ6OnN0cmluZyAmcHJlZml4LCBjb25zdCBzdGQ6OnN0cmluZyAmZGlyZWN0b3J5LCBzaXplX3QgcG9vbCkKKyAgICAgICAgOiBtVGhyZWFkUG9vbChwb29sKQorICAgICAgICAsIG1QcmVmaXgocHJlZml4KQorICAgIHsKKyAgICAgICAgKHZvaWQpc2V0RGlyZWN0b3J5KGRpcmVjdG9yeSk7CisgICAgfQorCisgICAgLyoqIHJldHVybnMgZmlsZW5hbWUgb2YgY3JlYXRlZCBhdWRpbyBmaWxlLCBlbHNlIGVtcHR5IHN0cmluZyBvbiBmYWlsdXJlLiAqLworICAgIHN0ZDo6c3RyaW5nIGNyZWF0ZSgKKyAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248c3NpemVfdCAvKiBmcmFtZXNfcmVhZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiAvKiBidWZmZXIgKi8sIHNpemVfdCAvKiBzaXplX2luX2ZyYW1lcyAqLyk+IHJlYWRlciwKKyAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc3VmZml4KTsKKworcHJpdmF0ZToKKyAgICAvKiogc2V0cyB0aGUgY3VycmVudCBkaXJlY3RvcnkuIHRoaXMgaXMgY3VycmVudGx5IHByaXZhdGUgdG8gYXZvaWQgY29uZnVzaW9uCisgICAgICAgIHdoZW4gY2hhbmdpbmcgd2hpbGUgcGVuZGluZyBvcGVyYXRpb25zIGFyZSBvY2N1cnJpbmcgKGl0J3Mgb2theSwgYnV0CisgICAgICAgIHdlYWtseSBzeW5jaHJvbml6ZWQpLiAqLworICAgIHN0YXR1c190IHNldERpcmVjdG9yeShjb25zdCBzdGQ6OnN0cmluZyAmZGlyZWN0b3J5KTsKKworICAgIC8qKiBjbGVhbnMgY3VycmVudCBkaXJlY3RvcnkgYW5kIHJldHVybnMgdGhlIGRpcmVjdG9yeSBuYW1lIGRvbmUuICovCisgICAgc3RhdHVzX3QgY2xlYW4oc3RkOjpzdHJpbmcgKmRpciA9IG51bGxwdHIpOworCisgICAgLyoqIGNyZWF0ZXMgYW4gYXVkaW8gZmlsZSBmcm9tIGEgcmVhZGVyIGZ1bmN0b3IgcGFzc2VkIGluLiAqLworICAgIHN0YXR1c190IGNyZWF0ZUludGVybmFsKAorICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjxzc2l6ZV90IC8qIGZyYW1lc19yZWFkICovCisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCAqIC8qIGJ1ZmZlciAqLywgc2l6ZV90IC8qIHNpemVfaW5fZnJhbWVzICovKT4gcmVhZGVyLAorICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZmaWxlbmFtZSk7CisKKyAgICBzdGF0aWMgYm9vbCBpc0RpcmVjdG9yeVZhbGlkKGNvbnN0IHN0ZDo6c3RyaW5nICZkaXJlY3RvcnkpIHsKKyAgICAgICAgcmV0dXJuIGRpcmVjdG9yeS5zaXplKCkgPiAwICYmIGRpcmVjdG9yeVswXSA9PSAnLyc7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZ2VuZXJhdGVGaWxlbmFtZShjb25zdCBzdGQ6OnN0cmluZyAmc3VmZml4KSBjb25zdCB7CisgICAgICAgIGNoYXIgZmlsZVRpbWVbc2l6ZW9mKCJZWVlZbW1kZF9ISE1NU1NfXDAiKV07CisgICAgICAgIHN0cnVjdCB0aW1ldmFsIHR2OworICAgICAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKyAgICAgICAgc3RydWN0IHRtIHRtOworICAgICAgICBsb2NhbHRpbWVfcigmdHYudHZfc2VjLCAmdG0pOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHN0cmZ0aW1lKGZpbGVUaW1lLCBzaXplb2YoZmlsZVRpbWUpLCAiJVklbSVkXyVIJU0lU18iLCAmdG0pID09IDAsCisgICAgICAgICAgICAiaW5jb3JyZWN0IGZpbGVUaW1lIGJ1ZmZlciIpOworICAgICAgICBjaGFyIG1zZWNbNF07CisgICAgICAgICh2b2lkKXNucHJpbnRmKG1zZWMsIHNpemVvZihtc2VjKSwgIiUwM2QiLCAoaW50KSh0di50dl91c2VjIC8gMTAwMCkpOworICAgICAgICByZXR1cm4gbVByZWZpeCArIGZpbGVUaW1lICsgbXNlYyArIHN1ZmZpeCArICIud2F2IjsKKyAgICB9CisKKyAgICBib29sIGlzTWFuYWdlZEZpbGVuYW1lKGNvbnN0IGNoYXIgKm5hbWUpIHsKKyAgICAgICAgY29uc3RleHByIHNpemVfdCBGSUxFTkFNRV9MRU5fREFURSA9IDQgKyAyICsgMiAvLyAlWSVtJWQlCisgICAgICAgICAgICArIDEgKyAyICsgMiArIDIgLy8gX0glTSVTCisgICAgICAgICAgICArIDEgKyAzOyAvL19NU0VDCisgICAgICAgIGNvbnN0IHNpemVfdCBwcmVmaXhMZW4gPSBtUHJlZml4LnNpemUoKTsKKyAgICAgICAgY29uc3Qgc2l6ZV90IG5hbWVMZW4gPSBzdHJsZW4obmFtZSk7CisKKyAgICAgICAgLy8gcmVqZWN0IG9uIHNpemUsIHByZWZpeCwgYW5kIC53YXYKKyAgICAgICAgaWYgKG5hbWVMZW4gPCBwcmVmaXhMZW4gKyBGSUxFTkFNRV9MRU5fREFURSArIDQgLyogLndhdiAqLworICAgICAgICAgICAgIHx8IHN0cm5jbXAobmFtZSwgbVByZWZpeC5jX3N0cigpLCBwcmVmaXhMZW4pICE9IDAKKyAgICAgICAgICAgICB8fCBzdHJjbXAobmFtZSArIG5hbWVMZW4gLSA0LCAiLndhdiIpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHZhbGlkYXRlIGRhdGUgcG9ydGlvbgorICAgICAgICBjb25zdCBjaGFyICpkYXRlID0gbmFtZSArIHByZWZpeExlbjsKKyAgICAgICAgcmV0dXJuIHN0ZDo6YWxsX29mKGRhdGUsIGRhdGUgKyA4LCBpc2RpZ2l0KQorICAgICAgICAgICAgJiYgZGF0ZVs4XSA9PSAnXycKKyAgICAgICAgICAgICYmIHN0ZDo6YWxsX29mKGRhdGUgKyA5LCBkYXRlICsgMTUsIGlzZGlnaXQpCisgICAgICAgICAgICAmJiBkYXRlWzE1XSA9PSAnXycKKyAgICAgICAgICAgICYmIHN0ZDo6YWxsX29mKGRhdGUgKyAxNiwgZGF0ZSArIDE5LCBpc2RpZ2l0KTsKKyAgICB9CisKKyAgICAvLyB5ZXQgYW5vdGhlciBUaHJlYWRQb29sIGltcGxlbWVudGF0aW9uLgorICAgIGNsYXNzIFRocmVhZFBvb2wgeworICAgIHB1YmxpYzoKKyAgICAgICAgVGhyZWFkUG9vbChzaXplX3Qgc2l6ZSkKKyAgICAgICAgICAgIDogbVRocmVhZFBvb2xTaXplKHNpemUpCisgICAgICAgIHsgfQorCisgICAgICAgIC8qKiBsYXVuY2hlcyB0YXNrICJuYW1lIiB3aXRoIGFzc29jaWF0ZWQgZnVuY3Rpb24gImZ1bmMiLgorICAgICAgICAgICAgaWYgdGhlIHRocmVhZHBvb2wgaXMgZXhoYXVzdGVkLCBpdCB3aWxsIGxhdW5jaCBvbiBjYWxsaW5nIGZ1bmN0aW9uICovCisgICAgICAgIHN0YXR1c190IGxhdW5jaChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgc3RkOjpmdW5jdGlvbjxzdGF0dXNfdCgpPiBmdW5jKTsKKworICAgIHByaXZhdGU6CisgICAgICAgIHN0ZDo6bXV0ZXggbUxvY2s7CisgICAgICAgIHN0ZDo6bGlzdDxzdGQ6OnBhaXI8CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcsIHN0ZDo6ZnV0dXJlPHN0YXR1c190Pj4+IG1GdXR1cmVzOyAvLyBHVUFSREVEX0JZKG1Mb2NrKQorCisgICAgICAgIGNvbnN0IHNpemVfdCBtVGhyZWFkUG9vbFNpemU7CisgICAgfSBtVGhyZWFkUG9vbDsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1QcmVmaXg7CisgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICBzdGQ6OnN0cmluZyBtRGlyZWN0b3J5OyAgICAgICAgIC8vIEdVQVJERURfQlkobUxvY2spCisgICAgc3RkOjpkZXF1ZTxzdGQ6OnN0cmluZz4gbUZpbGVzOyAvLyBHVUFSREVEX0JZKG1Mb2NrKSAgc29ydGVkIGxpc3Qgb2YgZmlsZXMgYnkgY3JlYXRpb24gdGltZQorCisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgRlJBTUVTX1BFUl9SRUFEID0gMTAyNDsKKyAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBNQVhfRklMRVNfUkVBRCA9IDEwMjQ7CisgICAgc3RhdGljIGNvbnN0ZXhwciBzaXplX3QgTUFYX0ZJTEVTX0tFRVAgPSAzMjsKK307CisKKy8qIHN0YXRpYyAqLwordm9pZCBOQkFJT19UZWU6Ok5CQUlPX1RlZUltcGw6OmR1bXBUZWUoCisgICAgICAgIGludCBmZCwgY29uc3QgTkJBSU9fU2lua1NvdXJjZSAmc2lua1NvdXJjZSwgY29uc3Qgc3RkOjpzdHJpbmcgJnN1ZmZpeCkKK3sKKyAgICAvLyBTaW5nbGV0b24uIENvbnN0cnVjdGVkIHRocmVhZC1zYWZlIG9uIGZpcnN0IGNhbGwsIG5ldmVyIGRlc3Ryb3llZC4KKyAgICBzdGF0aWMgQXVkaW9GaWxlSGFuZGxlciBhdWRpb0ZpbGVIYW5kbGVyKAorICAgICAgICAgICAgREVGQVVMVF9QUkVGSVgsIERFRkFVTFRfRElSRUNUT1JZLCBERUZBVUxUX1RIUkVBRFBPT0xfU0laRSk7CisKKyAgICBhdXRvICZzb3VyY2UgPSBzaW5rU291cmNlLnNlY29uZDsKKyAgICBpZiAoc291cmNlLmdldCgpID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSBzb3VyY2UtPmZvcm1hdCgpOworICAgIGJvb2wgZmlyc3RSZWFkID0gdHJ1ZTsKKyAgICBzdGQ6OnN0cmluZyBmaWxlbmFtZSA9IGF1ZGlvRmlsZUhhbmRsZXIuY3JlYXRlKAorICAgICAgICAgICAgLy8gdGhpcyBmdW5jdG9yIG11c3Qgbm90IGhvbGQgcmVmZXJlbmNlcyB0byBzdGFjaworICAgICAgICAgICAgW2ZpcnN0UmVhZCwgc2lua1NvdXJjZV0gKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGZyYW1lcykgbXV0YWJsZSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gJnNvdXJjZSA9IHNpbmtTb3VyY2Uuc2Vjb25kOworICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGFjdHVhbFJlYWQgPSBzb3VyY2UtPnJlYWQoYnVmZmVyLCBmcmFtZXMpOworICAgICAgICAgICAgICAgICAgICBpZiAoYWN0dWFsUmVhZCA9PSAoc3NpemVfdClPVkVSUlVOICYmIGZpcnN0UmVhZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmVjaGVjayBvbmNlCisgICAgICAgICAgICAgICAgICAgICAgICBhY3R1YWxSZWFkID0gc291cmNlLT5yZWFkKGJ1ZmZlciwgZnJhbWVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBmaXJzdFJlYWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGFjdHVhbFJlYWQ7CisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEZvcm1hdF9zYW1wbGVSYXRlKGZvcm1hdCksCisgICAgICAgICAgICBGb3JtYXRfY2hhbm5lbENvdW50KGZvcm1hdCksCisgICAgICAgICAgICBmb3JtYXQubUZvcm1hdCwKKyAgICAgICAgICAgIHN1ZmZpeCk7CisKKyAgICBpZiAoZmQgPj0gMCAmJiBmaWxlbmFtZS5zaXplKCkgPiAwKSB7CisgICAgICAgIGRwcmludGYoZmQsICJ0ZWUgd3JvdGUgdG8gJXNcbiIsIGZpbGVuYW1lLmNfc3RyKCkpOworICAgIH0KK30KKworLyogc3RhdGljICovCitOQkFJT19UZWU6Ok5CQUlPX1RlZUltcGw6Ok5CQUlPX1NpbmtTb3VyY2UgTkJBSU9fVGVlOjpOQkFJT19UZWVJbXBsOjptYWtlU2lua1NvdXJjZSgKKyAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0ICZmb3JtYXQsIHNpemVfdCBmcmFtZXMsIGJvb2wgKmVuYWJsZWQpCit7CisgICAgaWYgKEZvcm1hdF9pc1ZhbGlkKGZvcm1hdCkgJiYgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQubUZvcm1hdCkpIHsKKyAgICAgICAgUGlwZSAqcGlwZSA9IG5ldyBQaXBlKGZyYW1lcywgZm9ybWF0KTsKKyAgICAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOworICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge2Zvcm1hdH07CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBwaXBlLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKKyAgICAgICAgaWYgKGluZGV4ICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dXKCJwaXBlIGZhaWx1cmUgdG8gbmVnb3RpYXRlOiAlemQiLCBpbmRleCk7CisgICAgICAgICAgICBnb3RvIGV4aXQ7CisgICAgICAgIH0KKyAgICAgICAgUGlwZVJlYWRlciAqcGlwZVJlYWRlciA9IG5ldyBQaXBlUmVhZGVyKCpwaXBlKTsKKyAgICAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7CisgICAgICAgIGluZGV4ID0gcGlwZVJlYWRlci0+bmVnb3RpYXRlKG9mZmVycywgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7CisgICAgICAgIGlmIChpbmRleCAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVygicGlwZVJlYWRlciBmYWlsdXJlIHRvIG5lZ290aWF0ZTogJXpkIiwgaW5kZXgpOworICAgICAgICAgICAgZ290byBleGl0OworICAgICAgICB9CisgICAgICAgIGlmIChlbmFibGVkICE9IG51bGxwdHIpICplbmFibGVkID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIHtwaXBlLCBwaXBlUmVhZGVyfTsKKyAgICB9CitleGl0OgorICAgIGlmIChlbmFibGVkICE9IG51bGxwdHIpICplbmFibGVkID0gZmFsc2U7CisgICAgcmV0dXJuIHtudWxscHRyLCBudWxscHRyfTsKK30KKworc3RkOjpzdHJpbmcgQXVkaW9GaWxlSGFuZGxlcjo6Y3JlYXRlKAorICAgICAgICBzdGQ6OmZ1bmN0aW9uPHNzaXplX3QgLyogZnJhbWVzX3JlYWQgKi8KKyAgICAgICAgICAgICAgICAgICAgKHZvaWQgKiAvKiBidWZmZXIgKi8sIHNpemVfdCAvKiBzaXplX2luX2ZyYW1lcyAqLyk+IHJlYWRlciwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50LAorICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZzdWZmaXgpCit7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgZmlsZW5hbWUgPSBnZW5lcmF0ZUZpbGVuYW1lKHN1ZmZpeCk7CisKKyAgICBpZiAobVRocmVhZFBvb2wubGF1bmNoKHN0ZDo6c3RyaW5nKCJjcmVhdGUgIikgKyBmaWxlbmFtZSwKKyAgICAgICAgICAgIFs9XSgpIHsgcmV0dXJuIGNyZWF0ZUludGVybmFsKHJlYWRlciwgc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBmb3JtYXQsIGZpbGVuYW1lKTsgfSkKKyAgICAgICAgICAgID09IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBmaWxlbmFtZTsKKyAgICB9CisgICAgcmV0dXJuICIiOworfQorCitzdGF0dXNfdCBBdWRpb0ZpbGVIYW5kbGVyOjpzZXREaXJlY3RvcnkoY29uc3Qgc3RkOjpzdHJpbmcgJmRpcmVjdG9yeSkKK3sKKyAgICBpZiAoIWlzRGlyZWN0b3J5VmFsaWQoZGlyZWN0b3J5KSkgcmV0dXJuIEJBRF9WQUxVRTsKKworICAgIC8vIFRPRE86IGNvbnNpZGVyIHVzaW5nIHN0ZDo6ZmlsZXN5c3RlbSBpbiBDKysxNworICAgIERJUiAqZGlyID0gb3BlbmRpcihkaXJlY3RvcnkuY19zdHIoKSk7CisKKyAgICBpZiAoZGlyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBjYW5ub3Qgb3BlbiBkaXJlY3RvcnkgJXMiLCBfX2Z1bmNfXywgZGlyZWN0b3J5LmNfc3RyKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHNpemVfdCB0b1JlbW92ZSA9IDA7CisgICAgZGVjbHR5cGUobUZpbGVzKSBmaWxlczsKKworICAgIHdoaWxlIChmaWxlcy5zaXplKCkgPCBNQVhfRklMRVNfUkVBRCkgeworICAgICAgICBlcnJubyA9IDA7CisgICAgICAgIGNvbnN0IHN0cnVjdCBkaXJlbnQgKnJlc3VsdCA9IHJlYWRkaXIoZGlyKTsKKyAgICAgICAgaWYgKHJlc3VsdCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HV19JRihlcnJubyAhPSAwLCAiJXM6IHJlYWRkaXIgZmFpbHVyZSAlcyIsIF9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gaXMgaXQgYSBtYW5hZ2VkIGZpbGVuYW1lPworICAgICAgICBpZiAoIWlzTWFuYWdlZEZpbGVuYW1lKHJlc3VsdC0+ZF9uYW1lKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZmlsZXMuZW1wbGFjZV9iYWNrKHJlc3VsdC0+ZF9uYW1lKTsKKyAgICB9CisgICAgKHZvaWQpY2xvc2VkaXIoZGlyKTsKKworICAgIC8vIE9QVElNSVpBVElPTjogd2UgZG9uJ3QgbmVlZCB0byBzdGF0IGVhY2ggZmlsZSwgdGhlIGZpbGVuYW1lcyBuYW1lcyBhcmUKKyAgICAvLyBhbHJlYWR5IChyb3VnaGx5KSBvcmRlcmVkIGJ5IGNyZWF0aW9uIGRhdGUuICB3ZSB1c2Ugc3RkOjpkZXF1ZSBpbnN0ZWFkCisgICAgLy8gb2Ygc3RkOjpzZXQgZm9yIGZhc3RlciBpbnNlcnRpb24gYW5kIHNvcnRpbmcgdGltZXMuCisKKyAgICBpZiAoZmlsZXMuc2l6ZSgpID4gTUFYX0ZJTEVTX0tFRVApIHsKKyAgICAgICAgLy8gcmVtb3ZlZCBmaWxlcyBjYW4gdXNlIGEgcGFydGl0aW9uIChubyBuZWVkIHRvIGRvIGEgZnVsbCBzb3J0KS4KKyAgICAgICAgdG9SZW1vdmUgPSBmaWxlcy5zaXplKCkgLSBNQVhfRklMRVNfS0VFUDsKKyAgICAgICAgc3RkOjpudGhfZWxlbWVudChmaWxlcy5iZWdpbigpLCBmaWxlcy5iZWdpbigpICsgdG9SZW1vdmUgLSAxLCBmaWxlcy5lbmQoKSk7CisgICAgfQorCisgICAgLy8ga2VwdCBmaWxlcyBtdXN0IGJlIHNvcnRlZC4KKyAgICBzdGQ6OnNvcnQoZmlsZXMuYmVnaW4oKSArIHRvUmVtb3ZlLCBmaWxlcy5lbmQoKSk7CisKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisKKyAgICAgICAgbURpcmVjdG9yeSA9IGRpcmVjdG9yeTsKKyAgICAgICAgbUZpbGVzID0gc3RkOjptb3ZlKGZpbGVzKTsKKyAgICB9CisKKyAgICBpZiAodG9SZW1vdmUgPiAwKSB7IC8vIGxhdW5jaCBhIGNsZWFuIGluIGJhY2tncm91bmQuCisgICAgICAgICh2b2lkKW1UaHJlYWRQb29sLmxhdW5jaCgKKyAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZygiY2xlYW5pbmcgIikgKyBkaXJlY3RvcnksIFt0aGlzXSgpIHsgcmV0dXJuIGNsZWFuKCk7IH0pOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvRmlsZUhhbmRsZXI6OmNsZWFuKHN0ZDo6c3RyaW5nICpkaXJlY3RvcnkpCit7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGZpbGVzVG9SZW1vdmU7CisgICAgc3RkOjpzdHJpbmcgZGlyOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKworICAgICAgICBpZiAoIWlzRGlyZWN0b3J5VmFsaWQobURpcmVjdG9yeSkpIHJldHVybiBOT19JTklUOworCisgICAgICAgIGRpciA9IG1EaXJlY3Rvcnk7CisgICAgICAgIGlmIChtRmlsZXMuc2l6ZSgpID4gTUFYX0ZJTEVTX0tFRVApIHsKKyAgICAgICAgICAgIHNpemVfdCB0b1JlbW92ZSA9IG1GaWxlcy5zaXplKCkgLSBNQVhfRklMRVNfS0VFUDsKKworICAgICAgICAgICAgLy8gdXNlIG1vdmUgYW5kIGVyYXNlIHRvIGVmZmljaWVudGx5IHRyYW5zZmVyIHN0ZDo6c3RyaW5nCisgICAgICAgICAgICBzdGQ6Om1vdmUobUZpbGVzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgIG1GaWxlcy5iZWdpbigpICsgdG9SZW1vdmUsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihmaWxlc1RvUmVtb3ZlKSk7CisgICAgICAgICAgICBtRmlsZXMuZXJhc2UobUZpbGVzLmJlZ2luKCksIG1GaWxlcy5iZWdpbigpICsgdG9SZW1vdmUpOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZGlycCA9IGRpciArICIvIjsKKyAgICAvLyByZW1vdmUgZmlsZXMgb3V0c2lkZSBvZiBsb2NrIGZvciBiZXR0ZXIgY29uY3VycmVuY3kuCisgICAgZm9yIChjb25zdCBhdXRvICZmaWxlIDogZmlsZXNUb1JlbW92ZSkgeworICAgICAgICAodm9pZCl1bmxpbmsoKGRpcnAgKyBmaWxlKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICAvLyByZXR1cm4gdGhlIGRpcmVjdG9yeSBpZiByZXF1ZXN0ZWQuCisgICAgaWYgKGRpcmVjdG9yeSAhPSBudWxscHRyKSB7CisgICAgICAgICpkaXJlY3RvcnkgPSBkaXI7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9GaWxlSGFuZGxlcjo6VGhyZWFkUG9vbDo6bGF1bmNoKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgc3RkOjpmdW5jdGlvbjxzdGF0dXNfdCgpPiBmdW5jKQoreworICAgIGlmIChtVGhyZWFkUG9vbFNpemUgPiAxKSB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgIGlmIChtRnV0dXJlcy5zaXplKCkgPj0gbVRocmVhZFBvb2xTaXplKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSBtRnV0dXJlcy5iZWdpbigpOyBpdCAhPSBtRnV0dXJlcy5lbmQoKTspIHsKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUgPSBpdC0+Zmlyc3Q7CisgICAgICAgICAgICAgICAgc3RkOjpmdXR1cmU8c3RhdHVzX3Q+ICZmdXR1cmUgPSBpdC0+c2Vjb25kOworICAgICAgICAgICAgICAgIGlmICghZnV0dXJlLnZhbGlkKCkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygwKSkgPT0gc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IGZ1dHVyZSAlcyByZWFkeSIsIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgaXQgPSBtRnV0dXJlcy5lcmFzZShpdCk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBmdXR1cmUgJXMgbm90IHJlYWR5IiwgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICArK2l0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAobUZ1dHVyZXMuc2l6ZSgpIDwgbVRocmVhZFBvb2xTaXplKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IGRlZmVycmVkIGNhbGxpbmcgJXMiLCBfX2Z1bmNfXywgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIG1GdXR1cmVzLmVtcGxhY2VfYmFjayhuYW1lLCBzdGQ6OmFzeW5jKHN0ZDo6bGF1bmNoOjphc3luYywgZnVuYykpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCIlczogaW1tZWRpYXRlIGNhbGxpbmcgJXMiLCBfX2Z1bmNfXywgbmFtZS5jX3N0cigpKTsKKyAgICByZXR1cm4gZnVuYygpOworfQorCitzdGF0dXNfdCBBdWRpb0ZpbGVIYW5kbGVyOjpjcmVhdGVJbnRlcm5hbCgKKyAgICAgICAgc3RkOjpmdW5jdGlvbjxzc2l6ZV90IC8qIGZyYW1lc19yZWFkICovCisgICAgICAgICAgICAgICAgICAgICh2b2lkICogLyogYnVmZmVyICovLCBzaXplX3QgLyogc2l6ZV9pbl9mcmFtZXMgKi8pPiByZWFkZXIsCisgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCisgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZmlsZW5hbWUpCit7CisgICAgLy8gQXR0ZW1wdCB0byBjaG9vc2UgdGhlIGJlc3QgbWF0Y2hpbmcgZmlsZSBmb3JtYXQuCisgICAgLy8gV2UgY2FuIGNob29zZSBhbnkgc2ZfZm9ybWF0CisgICAgLy8gYnV0IHdyaXRlRm9ybWF0IG11c3QgYmUgb25lIG9mIDE2LCAzMiwgZmxvYXQKKyAgICAvLyBkdWUgdG8gc2Zfd3JpdGVmIGNvbXBhdGliaWxpdHkuCisgICAgaW50IHNmX2Zvcm1hdDsKKyAgICBhdWRpb19mb3JtYXRfdCB3cml0ZUZvcm1hdDsKKyAgICBzd2l0Y2ggKGZvcm1hdCkgeworICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV84X0JJVDoKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICBzZl9mb3JtYXQgPSBTRl9GT1JNQVRfUENNXzE2OworICAgICAgICB3cml0ZUZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgICAgICBBTE9HVigiJXM6ICVzIHVzaW5nIFBDTV8xNiBmb3IgZm9ybWF0ICUjeCIsIF9fZnVuY19fLCBmaWxlbmFtZS5jX3N0cigpLCBmb3JtYXQpOworICAgICAgICBicmVhazsKKyAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQ6CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzI0X0JJVF9QQUNLRUQ6CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDoKKyAgICAgICAgc2ZfZm9ybWF0ID0gU0ZfRk9STUFUX1BDTV8zMjsKKyAgICAgICAgd3JpdGVGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzMyX0JJVDsKKyAgICAgICAgQUxPR1YoIiVzOiAlcyB1c2luZyBQQ01fMzIgZm9yIGZvcm1hdCAlI3giLCBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSwgZm9ybWF0KTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOgorICAgICAgICBzZl9mb3JtYXQgPSBTRl9GT1JNQVRfRkxPQVQ7CisgICAgICAgIHdyaXRlRm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV9GTE9BVDsKKyAgICAgICAgQUxPR1YoIiVzOiAlcyB1c2luZyBQQ01fRkxPQVQgZm9yIGZvcm1hdCAlI3giLCBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSwgZm9ybWF0KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgLy8gVE9ETzoKKyAgICAgICAgLy8gaGFuZGxlIGF1ZGlvX2hhc19wcm9wb3J0aW9uYWxfZnJhbWVzKCkgZm9ybWF0cy4KKyAgICAgICAgLy8gaGFuZGxlIGNvbXByZXNzZWQgZm9ybWF0cyBhcyBzaW5nbGUgYnl0ZSBmaWxlcy4KKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBkaXJlY3Rvcnk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gY2xlYW4oJmRpcmVjdG9yeSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgcmV0dXJuIHN0YXR1czsKKyAgICBzdGQ6OnN0cmluZyBkaXJQcmVmaXggPSBkaXJlY3RvcnkgKyAiLyI7CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBwYXRoID0gZGlyUHJlZml4ICsgZmlsZW5hbWU7CisKKyAgICAvKiBjb25zdCAqLyBTRl9JTkZPIGluZm8gPSB7CisgICAgICAgIC5mcmFtZXMgPSAwLAorICAgICAgICAuc2FtcGxlcmF0ZSA9IChpbnQpc2FtcGxlUmF0ZSwKKyAgICAgICAgLmNoYW5uZWxzID0gKGludCljaGFubmVsQ291bnQsCisgICAgICAgIC5mb3JtYXQgPSBTRl9GT1JNQVRfV0FWIHwgc2ZfZm9ybWF0LAorICAgIH07CisgICAgU05ERklMRSAqc2YgPSBzZl9vcGVuKHBhdGguY19zdHIoKSwgU0ZNX1dSSVRFLCAmaW5mbyk7CisgICAgaWYgKHNmID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHNpemVfdCB0b3RhbCA9IDA7CisgICAgdm9pZCAqYnVmZmVyID0gbWFsbG9jKEZSQU1FU19QRVJfUkVBRCAqIHN0ZDo6bWF4KAorICAgICAgICAgICAgY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZSh3cml0ZUZvcm1hdCksIC8vb3V0cHV0IGZyYW1lc2l6ZQorICAgICAgICAgICAgY2hhbm5lbENvdW50ICogYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQpKSk7IC8vIGlucHV0IGZyYW1lc2l6ZQorICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBzZl9jbG9zZShzZik7CisgICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgfQorCisgICAgZm9yICg7OykgeworICAgICAgICBjb25zdCBzc2l6ZV90IGFjdHVhbFJlYWQgPSByZWFkZXIoYnVmZmVyLCBGUkFNRVNfUEVSX1JFQUQpOworICAgICAgICBpZiAoYWN0dWFsUmVhZCA8PSAwKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvbnZlcnQgaW5wdXQgZm9ybWF0IHRvIHdyaXRlRm9ybWF0IGFzIG5lZWRlZC4KKyAgICAgICAgaWYgKGZvcm1hdCAhPSB3cml0ZUZvcm1hdCkgeworICAgICAgICAgICAgbWVtY3B5X2J5X2F1ZGlvX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgYnVmZmVyLCB3cml0ZUZvcm1hdCwgYnVmZmVyLCBmb3JtYXQsIGFjdHVhbFJlYWQgKiBpbmZvLmNoYW5uZWxzKTsKKyAgICAgICAgfQorCisgICAgICAgIHNzaXplX3QgcmVhbGx5V3JpdHRlbjsKKyAgICAgICAgc3dpdGNoICh3cml0ZUZvcm1hdCkgeworICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOgorICAgICAgICAgICAgcmVhbGx5V3JpdHRlbiA9IHNmX3dyaXRlZl9zaG9ydChzZiwgKGNvbnN0IGludDE2X3QgKilidWZmZXIsIGFjdHVhbFJlYWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQ6CisgICAgICAgICAgICByZWFsbHlXcml0dGVuID0gc2Zfd3JpdGVmX2ludChzZiwgKGNvbnN0IGludDMyX3QgKilidWZmZXIsIGFjdHVhbFJlYWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX1BDTV9GTE9BVDoKKyAgICAgICAgICAgIHJlYWxseVdyaXR0ZW4gPSBzZl93cml0ZWZfZmxvYXQoc2YsIChjb25zdCBmbG9hdCAqKWJ1ZmZlciwgYWN0dWFsUmVhZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIiVzOiAlcyB3cml0ZUZvcm1hdDogJSN4IiwgX19mdW5jX18sIGZpbGVuYW1lLmNfc3RyKCksIHdyaXRlRm9ybWF0KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHJlYWxseVdyaXR0ZW4gPCAwKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6ICVzIHdyaXRlIGVycm9yOiAlemQiLCBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSwgcmVhbGx5V3JpdHRlbik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICB0b3RhbCArPSByZWFsbHlXcml0dGVuOworICAgICAgICBpZiAocmVhbGx5V3JpdHRlbiA8IGFjdHVhbFJlYWQpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogJXMgd3JpdGUgc2hvcnQgY291bnQ6ICV6ZCA8ICV6ZCIsCisgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgZmlsZW5hbWUuY19zdHIoKSwgcmVhbGx5V3JpdHRlbiwgYWN0dWFsUmVhZCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICBzZl9jbG9zZShzZik7CisgICAgZnJlZShidWZmZXIpOworICAgIGlmICh0b3RhbCA9PSAwKSB7CisgICAgICAgICh2b2lkKXVubGluayhwYXRoLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gTk9UX0VOT1VHSF9EQVRBOworICAgIH0KKworICAgIC8vIFN1Y2Nlc3M6IGFkZCBvdXIgbmFtZSB0byBtYW5hZ2VkIGZpbGVzLgorICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgLy8gd2VhayBzeW5jaHJvbml6YXRpb24gLSBvbmx5IHVwZGF0ZSBtRmlsZXMgaWYgdGhlIGRpcmVjdG9yeSBoYXNuJ3QgY2hhbmdlZC4KKyAgICAgICAgaWYgKG1EaXJlY3RvcnkgPT0gZGlyZWN0b3J5KSB7CisgICAgICAgICAgICBtRmlsZXMuZW1wbGFjZV9iYWNrKGZpbGVuYW1lKTsgIC8vIGFkZCB0byB0aGUgZW5kIHRvIHByZXNlcnZlIHNvcnQuCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOyAvLyByZXR1cm4gZnVsbCBwYXRoCit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmIC8vIFRFRV9TSU5LCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTkJBSU9fVGVlLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvTkJBSU9fVGVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVkOGNjOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9OQkFJT19UZWUuaApAQCAtMCwwICsxLDMyNiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEVuYWJsZWQgd2l0aCBURUVfU0lOSyBpbiBDb25maWd1cmF0aW9uLmgKKyNpZm5kZWYgQU5EUk9JRF9OQkFJT19URUVfSAorI2RlZmluZSBBTkRST0lEX05CQUlPX1RFRV9ICisKKyNpZmRlZiBURUVfU0lOSworCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHNldD4KKworI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJhaW8vTkJBSU8uaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFRoZSBOQkFJT19UZWUgdXNlcyB0aGUgTkJBSU8gUGlwZSBhbmQgUGlwZVJlYWRlciBmb3Igbm9uYmxvY2tpbmcKKyAqIGRhdGEgY29sbGVjdGlvbiwgZm9yIGV2ZW50dWFsIGR1bXAgdG8gbG9nIGZpbGVzLgorICogU2VlIGh0dHBzOi8vc291cmNlLmFuZHJvaWQuY29tL2RldmljZXMvYXVkaW8vZGVidWdnaW5nIGZvciBob3cgdG8KKyAqIGVuYWJsZSBieSByby5kZWJ1Z2dhYmxlIGFuZCBhZi50ZWUgcHJvcGVydGllcy4KKyAqCisgKiBUaGUgd3JpdGUoKSBpbnRvIHRoZSBOQkFJT19UZWUgaXMgdGhlcmVmb3JlIG5vbmJsb2NraW5nLAorICogYnV0IGNoYW5naW5nIE5CQUlPX1RlZSBmb3JtYXRzIHdpdGggc2V0KCkgY2Fubm90IGJlIGRvbmUgZHVyaW5nIGEgd3JpdGUoKTsKKyAqIHVzdWFsbHkgdGhlIGNhbGxlciBhbHJlYWR5IGltcGxlbWVudHMgdGhpcyBtdXR1YWwgZXhjbHVzaW9uLgorICoKKyAqIEFsbCBvdGhlciBjYWxscyBleGNlcHQgc2V0KCkgdnMgd3JpdGUoKSBtYXkgb2NjdXIgYXQgYW55IHRpbWUuCisgKgorICogZHVtcCgpIGRpc3J1cHRpb24gaXMgbWluaW1pemVkIHRvIHRoZSBjYWxsZXIgc2luY2Ugc3lzdGVtIGNhbGxzIGFyZSBleGVjdXRlZAorICogaW4gYW4gYXN5bmNocm9ub3VzIHRocmVhZCAod2hlbiBwb3NzaWJsZSkuCisgKgorICogQ3VycmVudGx5IHRoZSBOQkFJT19UZWUgaXMgImhhcmR3aXJlZCIgZm9yIEF1ZGlvRmxpbmdlciBzdXBwb3J0LgorICoKKyAqIFNvbWUgQXVkaW9GbGluZ2VyIHNwZWNpZmljIG5vdGVzOgorICoKKyAqIDEpIFRlZXMgY2FwdHVyZSBvbmx5IGxpbmVhciBQQ00gZGF0YS4KKyAqIDIpIFRlZXMgd2l0aG91dCBhbnkgZGF0YSB3cml0dGVuIGFyZSBjb25zaWRlcmVkIGVtcHR5IGFuZCBkbyBub3QgZ2VuZXJhdGUKKyAqICAgIGFueSBvdXRwdXQgZmlsZXMuCisgKiAyKSBPbmNlIGEgVGVlIGR1bXBzIGRhdGEsIGl0IGlzIGNvbnNpZGVyZWQgImVtcHRpZWQiIGFuZCBuZXcgZGF0YQorICogICAgbmVlZHMgdG8gYmUgd3JpdHRlbiBiZWZvcmUgYW5vdGhlciBUZWUgZmlsZSBpcyBnZW5lcmF0ZWQuCisgKiAzKSBUZWUgZmlsZSBmb3JtYXQgaXMKKyAqICAgIFdBViBpbnRlZ2VyIFBDTSAxNiBiaXQgZm9yIEFVRElPX0ZPUk1BVF9QQ01fOF9CSVQsIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgorICogICAgV0FWIGludGVnZXIgUENNIDMyIGJpdCBmb3IgQVVESU9fRk9STUFUX1BDTV84XzI0X0JJVCwgQVVESU9fRk9STUFUX1BDTV8yNF9CSVRfUEFDS0VECisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzMyX0JJVC4KKyAqICAgIFdBViBmbG9hdCBQQ00gMzIgYml0IGZvciBBVURJT19GT1JNQVRfUENNX0ZMT0FULgorICoKKyAqIElucHV0X1RocmVhZDoKKyAqIDEpIENhcHR1cmUgYnVmZmVyIGlzIHRlZWQgd2hlbiByZWFkIGZyb20gdGhlIEhBTCwgYmVmb3JlIHJlc2FtcGxpbmcgZm9yIHRoZSBBdWRpb1JlY29yZAorICogICAgY2xpZW50LgorICoKKyAqIE91dHB1dF9UaHJlYWQ6CisgKiAxKSBNaXhlclRocmVhZHMgd2lsbCB0ZWUgYXQgdGhlIEZhc3RNaXhlciBvdXRwdXQgKGlmIGl0IGhhcyBvbmUpIG9yIGF0IHRoZQorICogICAgTm9ybWFsTWl4ZXIgb3V0cHV0IChpZiBubyBGYXN0TWl4ZXIpLgorICogMikgRHVwbGljYXRpbmdUaHJlYWRzIGRvIG5vdCB0ZWUgYW55IG1peGVkIGRhdGEuIEFwcGx5IGEgdGVlIG9uIHRoZSBkb3duc3RyZWFtIE91dHB1dFRyYWNrCisgKiAgICBvciBvbiB0aGUgdXBzdHJlYW0gcGxheWJhY2sgVHJhY2tzLgorICogMykgRGlyZWN0VGhyZWFkcyBhbmQgT2ZmbG9hZFRocmVhZHMgZG8gbm90IHRlZSBhbnkgZGF0YS4gVGhlIHVwc3RyZWFtIHRyYWNrCisgKiAgICAoaWYgbGluZWFyIFBDTSBmb3JtYXQpIG1heSBiZSB0ZWVkIHRvIGRpc2NvdmVyIGRhdGEuCisgKiA0KSBNbWFwVGhyZWFkcyBhcmUgbm90IHN1cHBvcnRlZC4KKyAqCisgKiBUcmFja3M6CisgKiAxKSBSZWNvcmRUcmFja3MgYW5kIHBsYXliYWNrIFRyYWNrcyB0ZWUgYXMgZGF0YSBpcyBiZWluZyB3cml0dGVuIHRvIG9yCisgKiAgICByZWFkIGZyb20gdGhlIHNoYXJlZCBjbGllbnQtc2VydmVyIHRyYWNrIGJ1ZmZlciBieSB0aGUgYXNzb2NpYXRlZCBUaHJlYWRzLgorICogMikgVGhlIG1lY2hhbmlzbSBpcyBvbiB0aGUgQXVkaW9CdWZmZXJQcm92aWRlciByZWxlYXNlKCkgc28gbGFyZ2Ugc3RhdGljIFRyYWNrCisgKiAgICBwbGF5YmFjayBtYXkgbm90IHNob3cgYW55IFRlZSBkYXRhIGRlcGVuZGluZyBvbiB3aGVuIGl0IGlzIHJlbGVhc2VkLgorICogMykgV2hlbiBhIHRyYWNrIGJlY29tZXMgaW5hY3RpdmUsIHRoZSBUaHJlYWQgd2lsbCB0cmlnZ2VyIGEgZHVtcC4KKyAqLworCitjbGFzcyBOQkFJT19UZWUgeworcHVibGljOgorICAgIC8qIFRFRV9GTEFHIGlzIHVzZWQgaW4gc2V0KCkgYW5kIG11c3QgbWF0Y2ggdGhlIGZsYWdzIGZvciB0aGUgYWYudGVlIHByb3BlcnR5CisgICAgICAgZ2l2ZW4gaW4gaHR0cHM6Ly9zb3VyY2UuYW5kcm9pZC5jb20vZGV2aWNlcy9hdWRpby9kZWJ1Z2dpbmcKKyAgICAqLworICAgIGVudW0gVEVFX0ZMQUcgeworICAgICAgICBURUVfRkxBR19OT05FID0gMCwKKyAgICAgICAgVEVFX0ZMQUdfSU5QVVRfVEhSRUFEID0gKDEgPDwgMCksICAvLyB0cmVhdCBhcyBhIFRlZSBmb3IgaW5wdXQgKENhcHR1cmUpIFRocmVhZHMKKyAgICAgICAgVEVFX0ZMQUdfT1VUUFVUX1RIUkVBRCA9ICgxIDw8IDEpLCAvLyB0cmVhdCBhcyBhIFRlZSBmb3Igb3V0cHV0IChQbGF5YmFjaykgVGhyZWFkcworICAgICAgICBURUVfRkxBR19UUkFDSyA9ICgxIDw8IDIpLCAgICAgICAgIC8vIHRyZWF0IGFzIGEgVGVlIGZvciB0cmFja3MgKFJlY29yZCBhbmQgUGxheWJhY2spCisgICAgfTsKKworICAgIE5CQUlPX1RlZSgpCisgICAgICAgIDogbVRlZShzdGQ6Om1ha2Vfc2hhcmVkPE5CQUlPX1RlZUltcGw+KCkpCisgICAgeworICAgICAgICBnZXRSdW5uaW5nVGVlcygpLmFkZChtVGVlKTsKKyAgICB9CisKKyAgICB+TkJBSU9fVGVlKCkgeworICAgICAgICBnZXRSdW5uaW5nVGVlcygpLnJlbW92ZShtVGVlKTsKKyAgICAgICAgZHVtcCgtMSwgIl9EVE9SIik7IC8vIGxvZyBhbnkgZGF0YSByZW1haW5pbmcgaW4gVGVlLgorICAgIH0KKworICAgIC8qKgorICAgICAqIFxicmllZiBzZXQgaXMgdXNlZCBmb3IgZGVmZXJyZWQgY29uZmlndXJhdGlvbiBvZiBUZWUuCisgICAgICoKKyAgICAgKiAgTWF5IGJlIGNhbGxlZCBhbnl0aW1lIGV4Y2VwdCBjb25jdXJyZW50bHkgd2l0aCB3cml0ZSgpLgorICAgICAqCisgICAgICogXHBhcmFtIGZvcm1hdCBOQkFJT19Gb3JtYXQgdXNlZCB0byBvcGVuIE5CQUlPIHBpcGVzCisgICAgICogXHBhcmFtIGZsYWdzIChodHRwczovL3NvdXJjZS5hbmRyb2lkLmNvbS9kZXZpY2VzL2F1ZGlvL2RlYnVnZ2luZykKKyAgICAgKiAgICAgICAgICAgICAgLSBURUVfRkxBR19OT05FIHRvIGJ5cGFzcyBhZi50ZWUgcHJvcGVydHkgY2hlY2tzIChkZWZhdWx0KTsKKyAgICAgKiAgICAgICAgICAgICAgLSBURUVfRkxBR19JTlBVVF9USFJFQUQgdG8gY2hlY2sgYWYudGVlIGlmIGlucHV0IHRocmVhZCBsb2dnaW5nIHNldDsKKyAgICAgKiAgICAgICAgICAgICAgLSBURUVfRkxBR19PVVRQVVRfVEhSRUFEIHRvIGNoZWNrIGFmLnRlZSBpZiBvdXRwdXQgdGhyZWFkIGxvZ2dpbmcgc2V0OworICAgICAqICAgICAgICAgICAgICAtIFRFRV9GTEFHX1RSQUNLIHRvIGNoZWNrIGFmLnRlZSBpZiB0cmFjayBsb2dnaW5nIHNldC4KKyAgICAgKiBccGFyYW0gZnJhbWVzIG51bWJlciBvZiBmcmFtZXMgdG8gb3BlbiB0aGUgTkJBSU8gcGlwZSAoc2V0IHRvIDAgdG8gdXNlIGRlZmF1bHQpLgorICAgICAqCisgICAgICogXHJldHVybgorICAgICAqICAgICAgICAgLSBOT19FUlJPUiBvbiBzdWNjZXNzIChvciBmb3JtYXQgdW5jaGFuZ2VkKQorICAgICAqICAgICAgICAgLSBCQURfVkFMVUUgaWYgZm9ybWF0IG9yIGZsYWdzIGludmFsaWQuCisgICAgICogICAgICAgICAtIFBFUk1JU1NJT05fREVOSUVEIGlmIGZsYWdzIG5vdCBhbGxvd2VkIGJ5IGFmLnRlZQorICAgICAqLworCisgICAgc3RhdHVzX3Qgc2V0KGNvbnN0IE5CQUlPX0Zvcm1hdCAmZm9ybWF0LAorICAgICAgICAgICAgVEVFX0ZMQUcgZmxhZ3MgPSBURUVfRkxBR19OT05FLCBzaXplX3QgZnJhbWVzID0gMCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRlZS0+c2V0KGZvcm1hdCwgZmxhZ3MsIGZyYW1lcyk7CisgICAgfQorCisgICAgc3RhdHVzX3Qgc2V0KHVpbnQzMl90IHNhbXBsZVJhdGUsIHVpbnQzMl90IGNoYW5uZWxDb3VudCwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgVEVFX0ZMQUcgZmxhZ3MgPSBURUVfRkxBR19OT05FLCBzaXplX3QgZnJhbWVzID0gMCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVRlZS0+c2V0KEZvcm1hdF9mcm9tX1NSX0Moc2FtcGxlUmF0ZSwgY2hhbm5lbENvdW50LCBmb3JtYXQpLCBmbGFncywgZnJhbWVzKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgd3JpdGUgZGF0YSB0byB0aGUgdGVlLgorICAgICAqCisgICAgICogVGhpcyBjYWxsIGlzIGxvY2sgZnJlZSAoYXMgc2hhcmVkIHBvaW50ZXIgYW5kIE5CQUlPIGlzIGxvY2sgZnJlZSk7CisgICAgICogbWF5IGJlIGNhbGxlZCBzaW11bHRhbmVvdXMgdG8gYWxsIG1ldGhvZHMgZXhjZXB0IHNldCgpLgorICAgICAqCisgICAgICogXHBhcmFtIGJ1ZmZlciB0byB3cml0ZSB0byBwaXBlLgorICAgICAqIFxwYXJhbSBmcmFtZUNvdW50IGluIGZyYW1lcyBhcyBzcGVjaWZpZWQgYnkgdGhlIGZvcm1hdCBwYXNzZWQgdG8gc2V0KCkKKyAgICAgKi8KKworICAgIHZvaWQgd3JpdGUoY29uc3Qgdm9pZCAqYnVmZmVyLCBzaXplX3QgZnJhbWVDb3VudCkgY29uc3QgeworICAgICAgICBtVGVlLT53cml0ZShidWZmZXIsIGZyYW1lQ291bnQpOworICAgIH0KKworICAgIC8qKiBzZXRzIFRlZSBpZCBzdHJpbmcgd2hpY2ggaWRlbnRpZmllcyB0aGUgZ2VuZXJhdGVkIGZpbGUgKHNob3VsZCBiZSB1bmlxdWUpLiAqLworICAgIHZvaWQgc2V0SWQoY29uc3Qgc3RkOjpzdHJpbmcgJmlkKSBjb25zdCB7CisgICAgICAgIG1UZWUtPnNldElkKGlkKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgZHVtcCB0aGUgYXVkaW8gY29udGVudCB3cml0dGVuIHRvIHRoZSBUZWUuCisgICAgICoKKyAgICAgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlIGR1bXBlZCBmaWxlbmFtZSBmb3IgbG9nZ2luZywgdXNlIC0xIHRvIGlnbm9yZS4KKyAgICAgKiBccGFyYW0gcmVhc29uIHN0cmluZyBzdWZmaXggdG8gYXBwZW5kIHRvIHRoZSBnZW5lcmF0ZWQgZmlsZS4KKyAgICAgKi8KKyAgICB2b2lkIGR1bXAoaW50IGZkLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVhc29uID0gIiIpIGNvbnN0IHsKKyAgICAgICAgbVRlZS0+ZHVtcChmZCwgcmVhc29uKTsKKyAgICB9CisKKyAgICAvKioKKyAgICAgKiBcYnJpZWYgZHVtcCBhbGwgVGVlcyBjdXJyZW50bHkgYWxpdmUuCisgICAgICoKKyAgICAgKiBccGFyYW0gZmQgZmlsZSBkZXNjcmlwdG9yIHRvIHdyaXRlIGR1bXBlZCBmaWxlbmFtZSBmb3IgbG9nZ2luZywgdXNlIC0xIHRvIGlnbm9yZS4KKyAgICAgKiBccGFyYW0gcmVhc29uIHN0cmluZyBzdWZmaXggdG8gYXBwZW5kIHRvIHRoZSBnZW5lcmF0ZWQgZmlsZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBkdW1wQWxsKGludCBmZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnJlYXNvbiA9ICIiKSB7CisgICAgICAgIGdldFJ1bm5pbmdUZWVzKCkuZHVtcChmZCwgcmVhc29uKTsKKyAgICB9CisKK3ByaXZhdGU6CisKKyAgICAvKiogVGhlIHVuZGVybHlpbmcgaW1wbGVtZW50YXRpb24gb2YgdGhlIFRlZSAtIHRoZSBsaWZldGltZSBpcyB0aHJvdWdoCisgICAgICAgIGEgc2hhcmVkIHBvaW50ZXIgc28gZGVzdHJ1Y3Rpb24gb2YgdGhlIE5CQUlPX1RlZSBjb250YWluZXIgbWF5IHByb2NlZWQKKyAgICAgICAgZXZlbiB0aG91Z2ggZHVtcGluZyBpcyBvY2N1cnJpbmcuICovCisgICAgY2xhc3MgTkJBSU9fVGVlSW1wbCB7CisgICAgcHVibGljOgorICAgICAgICBzdGF0dXNfdCBzZXQoY29uc3QgTkJBSU9fRm9ybWF0ICZmb3JtYXQsIFRFRV9GTEFHIGZsYWdzLCBzaXplX3QgZnJhbWVzKSB7CisgICAgICAgICAgICBzdGF0aWMgY29uc3QgaW50IHRlZUNvbmZpZyA9IHByb3BlcnR5X2dldF9ib29sKCJyby5kZWJ1Z2dhYmxlIiwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgPyBwcm9wZXJ0eV9nZXRfaW50MzIoImFmLnRlZSIsIDApIDogMDsKKworICAgICAgICAgICAgLy8gY2hlY2sgdGhlIHR5cGUgb2YgVGVlCisgICAgICAgICAgICBjb25zdCBURUVfRkxBRyB0eXBlID0gVEVFX0ZMQUcoCisgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgKFRFRV9GTEFHX0lOUFVUX1RIUkVBRCB8IFRFRV9GTEFHX09VVFBVVF9USFJFQUQgfCBURUVfRkxBR19UUkFDSykpOworCisgICAgICAgICAgICAvLyBwYXJhbWV0ZXIgZmxhZ3MgY2FuJ3Qgc2VsZWN0IG11bHRpcGxlIHR5cGVzLgorICAgICAgICAgICAgaWYgKF9fYnVpbHRpbl9wb3Bjb3VudCh0eXBlKSA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBpZiB0eXBlIGlzIHNldCwgd2UgY2hlY2sgdG8gc2VlIGlmIGl0IGlzIHBlcm1pdHRlZCBieSBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgaWYgKHR5cGUgIT0gMCAmJiAodHlwZSAmIHRlZUNvbmZpZykgPT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZGV0ZXJtaW5lIG51bWJlciBvZiBmcmFtZXMgZm9yIFRlZQorICAgICAgICAgICAgaWYgKGZyYW1lcyA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogY29uc2lkZXIgdmFyeWluZyBmcmFtZSBjb3VudCBiYXNlZCBvbiB0eXBlLgorICAgICAgICAgICAgICAgIGZyYW1lcyA9IERFRkFVTFRfVEVFX0ZSQU1FUzsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gVE9ETzogc2hvdWxkIHdlIGNoZWNrIG1pbmltdW0gbnVtYmVyIG9mIGZyYW1lcz8KKworICAgICAgICAgICAgLy8gZG9uJ3QgZG8gYW55dGhpbmcgaWYgZm9ybWF0IGFuZCBmcmFtZXMgYXJlIHRoZSBzYW1lLgorICAgICAgICAgICAgaWYgKEZvcm1hdF9pc0VxdWFsKGZvcm1hdCwgbUZvcm1hdCkgJiYgZnJhbWVzID09IG1GcmFtZXMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJvb2wgZW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgYXV0byBzaW5rc291cmNlID0gbWFrZVNpbmtTb3VyY2UoZm9ybWF0LCBmcmFtZXMsICZlbmFibGVkKTsKKworICAgICAgICAgICAgLy8gZW5hYmxlZCBpcyBzZXQgaWYgbWFrZVNpbmtTb3VyY2UgaXMgc3VjY2Vzc2Z1bC4KKyAgICAgICAgICAgIC8vIE5vdGU6IGFzIG1lbnRpb25lZCBpbiBOQkFJT19UZWU6OnNldCgpLCBkb24ndCBjYWxsIHNldCgpIHdoaWxlIHdyaXRlKCkgaXMKKyAgICAgICAgICAgIC8vIG9uZ29pbmcuCisgICAgICAgICAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgICAgICAgICAgbUZsYWdzID0gZmxhZ3M7CisgICAgICAgICAgICAgICAgbUZvcm1hdCA9IGZvcm1hdDsgLy8gY291bGQgZ2V0IHRoaXMgZnJvbSB0aGUgU2luay4KKyAgICAgICAgICAgICAgICBtRnJhbWVzID0gZnJhbWVzOworICAgICAgICAgICAgICAgIG1TaW5rU291cmNlID0gc3RkOjptb3ZlKHNpbmtzb3VyY2UpOworICAgICAgICAgICAgICAgIG1FbmFibGVkLnN0b3JlKHRydWUpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHNldElkKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCkgeworICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IF9sKG1Mb2NrKTsKKyAgICAgICAgICAgIG1JZCA9IGlkOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBkdW1wKGludCBmZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnJlYXNvbikgeworICAgICAgICAgICAgaWYgKCFtRGF0YVJlYWR5LmV4Y2hhbmdlKGZhbHNlKSkgcmV0dXJuOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3VmZml4OworICAgICAgICAgICAgTkJBSU9fU2lua1NvdXJjZSBzaW5rU291cmNlOworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgICAgICAgICAgc3VmZml4ID0gbUlkICsgcmVhc29uOworICAgICAgICAgICAgICAgIHNpbmtTb3VyY2UgPSBtU2lua1NvdXJjZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGR1bXBUZWUoZmQsIHNpbmtTb3VyY2UsIHN1ZmZpeCk7CisgICAgICAgIH0KKworICAgICAgICB2b2lkIHdyaXRlKGNvbnN0IHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGZyYW1lQ291bnQpIHsKKyAgICAgICAgICAgIGlmICghbUVuYWJsZWQubG9hZCgpIHx8IGZyYW1lQ291bnQgPT0gMCkgcmV0dXJuOworICAgICAgICAgICAgKHZvaWQpbVNpbmtTb3VyY2UuZmlyc3QtPndyaXRlKGJ1ZmZlciwgZnJhbWVDb3VudCk7CisgICAgICAgICAgICBtRGF0YVJlYWR5LnN0b3JlKHRydWUpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICAvLyBUUklDS1k6IFdlIG5lZWQgdG8ga2VlcCB0aGUgTkJBSU9fU2luayBhbmQgTkJBSU9fU291cmNlIGJvdGggYWxpdmUgYXQgdGhlIHNhbWUgdGltZQorICAgICAgICAvLyBiZWNhdXNlIFBpcGVSZWFkZXIgaG9sZHMgYSBuYWtlZCByZWZlcmVuY2UgKG5vdCBhIHN0cm9uZyBvciB3ZWFrIHBvaW50ZXIpIHRvIFBpcGUuCisgICAgICAgIHVzaW5nIE5CQUlPX1NpbmtTb3VyY2UgPSBzdGQ6OnBhaXI8c3A8TkJBSU9fU2luaz4sIHNwPE5CQUlPX1NvdXJjZT4+OworCisgICAgICAgIHN0YXRpYyB2b2lkIGR1bXBUZWUoaW50IGZkLCBjb25zdCBOQkFJT19TaW5rU291cmNlJiBzaW5rU291cmNlLCBjb25zdCBzdGQ6OnN0cmluZyYgc3VmZml4KTsKKworICAgICAgICBzdGF0aWMgTkJBSU9fU2lua1NvdXJjZSBtYWtlU2lua1NvdXJjZSgKKyAgICAgICAgICAgICAgICBjb25zdCBOQkFJT19Gb3JtYXQgJmZvcm1hdCwgc2l6ZV90IGZyYW1lcywgYm9vbCAqZW5hYmxlZCk7CisKKyAgICAgICAgLy8gMHgyMDAwMDAgc3RlcmVvIDE2LWJpdCBQQ00gZnJhbWVzID0gNDcuNSBzZWNvbmRzIGF0IDQ0LjEga0h6LCA4IG1lZ2FieXRlcworICAgICAgICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBERUZBVUxUX1RFRV9GUkFNRVMgPSAweDIwMDAwMDsKKworICAgICAgICAvLyBhdG9taWMgc3RhdHVzIGNoZWNraW5nCisgICAgICAgIHN0ZDo6YXRvbWljPGJvb2w+IG1FbmFibGVke2ZhbHNlfTsKKyAgICAgICAgc3RkOjphdG9taWM8Ym9vbD4gbURhdGFSZWFkeXtmYWxzZX07CisKKyAgICAgICAgLy8gbG9ja2VkIGR1bXAgaW5mb3JtYXRpb24KKyAgICAgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBzdGQ6OnN0cmluZyBtSWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHVUFSREVEX0JZKG1Mb2NrKQorICAgICAgICBURUVfRkxBRyBtRmxhZ3MgPSBURUVfRkxBR19OT05FOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHVUFSREVEX0JZKG1Mb2NrKQorICAgICAgICBOQkFJT19Gb3JtYXQgbUZvcm1hdCA9IEZvcm1hdF9JbnZhbGlkOyAgICAgICAgICAgICAgICAgICAvLyBHVUFSREVEX0JZKG1Mb2NrKQorICAgICAgICBzaXplX3QgbUZyYW1lcyA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHVUFSREVEX0JZKG1Mb2NrKQorICAgICAgICBOQkFJT19TaW5rU291cmNlIG1TaW5rU291cmNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHVUFSREVEX0JZKG1Mb2NrKQorICAgIH07CisKKyAgICAvKiogUnVubmluZ1RlZXMgdHJhY2tzIGN1cnJlbnQgcnVubmluZyB0ZWVzIGZvciBkdW1wIHB1cnBvc2VzLgorICAgICAgICBJdCBpcyBpbXBsZW1lbnRlZCB0byBoYXZlIG1pbmltYWwgbG9ja2VkIHJlZ2lvbnMsIHRvIGJlIHRyYW5zcGFyZW50IHRvIHRoZSBjYWxsZXIuICovCisgICAgY2xhc3MgUnVubmluZ1RlZXMgeworICAgIHB1YmxpYzoKKyAgICAgICAgdm9pZCBhZGQoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE5CQUlPX1RlZUltcGw+ICZ0ZWUpIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgICAgICBBTE9HV19JRighbVRlZXMuZW1wbGFjZSh0ZWUpLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiAlcCBhbHJlYWR5IGV4aXN0cyBpbiBtVGVlcyIsIF9fZnVuY19fLCB0ZWUuZ2V0KCkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCByZW1vdmUoY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE5CQUlPX1RlZUltcGw+ICZ0ZWUpIHsKKyAgICAgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBfbChtTG9jayk7CisgICAgICAgICAgICBBTE9HV19JRihtVGVlcy5lcmFzZSh0ZWUpICE9IDEsCisgICAgICAgICAgICAgICAgICAgICIlczogJXAgZG9lc24ndCBleGlzdCBpbiBtVGVlcyIsIF9fZnVuY19fLCB0ZWUuZ2V0KCkpOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBkdW1wKGludCBmZCwgY29uc3Qgc3RkOjpzdHJpbmcgJnJlYXNvbikgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPE5CQUlPX1RlZUltcGw+PiB0ZWVzOyAvLyBzYWZlIHNuYXBzaG90IG9mIHRlZXMKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gX2wobUxvY2spOworICAgICAgICAgICAgICAgIHRlZXMuaW5zZXJ0KHRlZXMuZW5kKCksIG1UZWVzLmJlZ2luKCksIG1UZWVzLmVuZCgpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmdGVlIDogdGVlcykgeworICAgICAgICAgICAgICAgIHRlZS0+ZHVtcChmZCwgcmVhc29uKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgc3RkOjptdXRleCBtTG9jazsKKyAgICAgICAgc3RkOjpzZXQ8c3RkOjpzaGFyZWRfcHRyPE5CQUlPX1RlZUltcGw+PiBtVGVlczsgLy8gR1VBUkRFRF9CWShtTG9jaykKKyAgICB9OworCisgICAgLy8gc2luZ2xldG9uCisgICAgc3RhdGljIFJ1bm5pbmdUZWVzICZnZXRSdW5uaW5nVGVlcygpIHsKKyAgICAgICAgc3RhdGljIFJ1bm5pbmdUZWVzIHJ1bm5pbmdUZWVzOworICAgICAgICByZXR1cm4gcnVubmluZ1RlZXM7CisgICAgfQorCisgICAgLy8gVGhlIE5CQUlPIFRlZUltcGwgbWF5IGhhdmUgbGlmZXRpbWUgbG9uZ2VyIHRoYW4gTkJBSU9fVGVlIGlmCisgICAgLy8gUnVubmluZ1RlZXM6OmR1bXAoKSBpcyBiZWluZyBjYWxsZWQgc2ltdWx0YW5lb3VzIHRvIH5OQkFJT19UZWUoKS4KKyAgICAvLyBUaGlzIGlzIGFsbG93ZWQgZm9yIG1heGltdW0gY29uY3VycmVuY3kuCisgICAgY29uc3Qgc3RkOjpzaGFyZWRfcHRyPE5CQUlPX1RlZUltcGw+IG1UZWU7Cit9OyAvLyBOQkFJT19UZWUKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gVEVFX1NJTksKKyNlbmRpZiAvLyAhQU5EUk9JRF9OQkFJT19URUVfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuY3BwCmluZGV4IGU1Y2I4YTIuLjc4NmMyNzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5jcHAKQEAgLTI0LDggKzI0LDEwIEBACiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvcHJpbWl0aXZlcy5oPgogCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvRGV2aWNlRGVzY3JpcHRvckJhc2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9QYXRjaEJ1aWxkZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC00OSwxMTEgKzUxLDc3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0cykKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+bGlzdEF1ZGlvUG9ydHMobnVtX3BvcnRzLCBwb3J0cyk7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBtUGF0Y2hQYW5lbC5saXN0QXVkaW9Qb3J0cyhudW1fcG9ydHMsIHBvcnRzKTsKIH0KIAogLyogR2V0IHN1cHBvcnRlZCBhdHRyaWJ1dGVzIGZvciBhIGdpdmVuIGF1ZGlvIHBvcnQgKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6Z2V0QXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5nZXRBdWRpb1BvcnQocG9ydCk7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOworICAgIHJldHVybiBtUGF0Y2hQYW5lbC5nZXRBdWRpb1BvcnQocG9ydCk7CiB9CiAKLQogLyogQ29ubmVjdCBhIHBhdGNoIGJldHdlZW4gc2V2ZXJhbCBzb3VyY2UgYW5kIHNpbmsgcG9ydHMgKi8KIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoLCBoYW5kbGUpOwotICAgIH0KLSAgICByZXR1cm4gTk9fSU5JVDsKKyAgICByZXR1cm4gbVBhdGNoUGFuZWwuY3JlYXRlQXVkaW9QYXRjaChwYXRjaCwgaGFuZGxlKTsKIH0KIAogLyogRGlzY29ubmVjdCBhIHBhdGNoICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnJlbGVhc2VBdWRpb1BhdGNoKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+cmVsZWFzZUF1ZGlvUGF0Y2goaGFuZGxlKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgcmV0dXJuIG1QYXRjaFBhbmVsLnJlbGVhc2VBdWRpb1BhdGNoKGhhbmRsZSk7CiB9CiAKLQogLyogTGlzdCBjb25uZWN0ZWQgYXVkaW8gcG9ydHMgYW5kIHRoZXkgYXR0cmlidXRlcyAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaGVzKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgaWYgKG1QYXRjaFBhbmVsICE9IDApIHsKLSAgICAgICAgcmV0dXJuIG1QYXRjaFBhbmVsLT5saXN0QXVkaW9QYXRjaGVzKG51bV9wYXRjaGVzLCBwYXRjaGVzKTsKKyAgICByZXR1cm4gbVBhdGNoUGFuZWwubGlzdEF1ZGlvUGF0Y2hlcyhudW1fcGF0Y2hlcywgcGF0Y2hlcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6U29mdHdhcmVQYXRjaDo6Z2V0TGF0ZW5jeU1zX2woZG91YmxlICpsYXRlbmN5TXMpIGNvbnN0Cit7CisgICAgY29uc3QgYXV0byYgaXRlciA9IG1QYXRjaFBhbmVsLm1QYXRjaGVzLmZpbmQobVBhdGNoSGFuZGxlKTsKKyAgICBpZiAoaXRlciAhPSBtUGF0Y2hQYW5lbC5tUGF0Y2hlcy5lbmQoKSkgeworICAgICAgICByZXR1cm4gaXRlci0+c2Vjb25kLmdldExhdGVuY3lNcyhsYXRlbmN5TXMpOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIHJldHVybiBOT19JTklUOwotfQotCi0vKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKLXsKLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGlmIChtUGF0Y2hQYW5lbCAhPSAwKSB7Ci0gICAgICAgIHJldHVybiBtUGF0Y2hQYW5lbC0+c2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7Ci0gICAgfQotICAgIHJldHVybiBOT19JTklUOwotfQotCi0KLUF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2hQYW5lbChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbUF1ZGlvRmxpbmdlcihhdWRpb0ZsaW5nZXIpCi17Ci19Ci0KLUF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6flBhdGNoUGFuZWwoKQotewogfQogCiAvKiBMaXN0IGNvbm5lY3RlZCBhdWRpbyBwb3J0cyBhbmQgdGhlaXIgYXR0cmlidXRlcyAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpsaXN0QXVkaW9Qb3J0cyh1bnNpZ25lZCBpbnQgKm51bV9wb3J0cyBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnRzIF9fdW51c2VkKQogewotICAgIEFMT0dWKCJsaXN0QXVkaW9Qb3J0cyIpOworICAgIEFMT0dWKF9fZnVuY19fKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIC8qIEdldCBzdXBwb3J0ZWQgYXR0cmlidXRlcyBmb3IgYSBnaXZlbiBhdWRpbyBwb3J0ICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCBfX3VudXNlZCkKIHsKLSAgICBBTE9HVigiZ2V0QXVkaW9Qb3J0Iik7CisgICAgQUxPR1YoX19mdW5jX18pOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotCiAvKiBDb25uZWN0IGEgcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCiB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFsSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7Ci0gICAgc3A8QXVkaW9GbGluZ2VyPiBhdWRpb2ZsaW5nZXIgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKICAgICBpZiAoaGFuZGxlID09IE5VTEwgfHwgcGF0Y2ggPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCBoYW5kbGUgJWQiLAotICAgICAgICAgIHBhdGNoLT5udW1fc291cmNlcywgcGF0Y2gtPm51bV9zaW5rcywgKmhhbmRsZSk7Ci0gICAgaWYgKGF1ZGlvZmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KKyAgICBBTE9HVigiJXMoKSBudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQgaGFuZGxlICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBwYXRjaC0+bnVtX3NvdXJjZXMsIHBhdGNoLT5udW1fc2lua3MsICpoYW5kbGUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogCi0gICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA9PSAwIHx8IHBhdGNoLT5udW1fc291cmNlcyA+IEFVRElPX1BBVENIX1BPUlRTX01BWCB8fAotICAgICAgICAgICAgKHBhdGNoLT5udW1fc2lua3MgPT0gMCAmJiBwYXRjaC0+bnVtX3NvdXJjZXMgIT0gMikgfHwKLSAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MgPiBBVURJT19QQVRDSF9QT1JUU19NQVgpIHsKKyAgICBpZiAoIWF1ZGlvX3BhdGNoX2lzX3ZhbGlkKHBhdGNoKSB8fCAocGF0Y2gtPm51bV9zaW5rcyA9PSAwICYmIHBhdGNoLT5udW1fc291cmNlcyAhPSAyKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICAvLyBsaW1pdCBudW1iZXIgb2Ygc291cmNlcyB0byAxIGZvciBub3cgb3IgMiBzb3VyY2VzIGZvciBzcGVjaWFsIGNyb3NzIGh3IG1vZHVsZSBjYXNlLgpAQCAtMTYzLDgxICsxMzEsNzIgQEAKICAgICB9CiAKICAgICBpZiAoKmhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7ICpoYW5kbGUgIT0gMCAmJiBpbmRleCA8IG1QYXRjaGVzLnNpemUoKTsgaW5kZXgrKykgewotICAgICAgICAgICAgaWYgKCpoYW5kbGUgPT0gbVBhdGNoZXNbaW5kZXhdLT5tSGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSByZW1vdmluZyBwYXRjaCBoYW5kbGUgJWQiLCAqaGFuZGxlKTsKLSAgICAgICAgICAgICAgICBoYWxIYW5kbGUgPSBtUGF0Y2hlc1tpbmRleF0tPm1IYWxIYW5kbGU7Ci0gICAgICAgICAgICAgICAgUGF0Y2ggKnJlbW92ZWRQYXRjaCA9IG1QYXRjaGVzW2luZGV4XTsKLSAgICAgICAgICAgICAgICAvLyBmcmVlIHJlc291cmNlcyBvd25lZCBieSB0aGUgcmVtb3ZlZCBwYXRjaCBpZiBhcHBsaWNhYmxlCi0gICAgICAgICAgICAgICAgLy8gMSkgaWYgYSBzb2Z0d2FyZSBwYXRjaCBpcyBwcmVzZW50LCByZWxlYXNlIHRoZSBwbGF5YmFjayBhbmQgY2FwdHVyZSB0aHJlYWRzIGFuZAotICAgICAgICAgICAgICAgIC8vIHRyYWNrcyBjcmVhdGVkLiBUaGlzIHdpbGwgYWxzbyByZWxlYXNlIHRoZSBjb3JyZXNwb25kaW5nIGF1ZGlvIEhBTCBwYXRjaGVzCi0gICAgICAgICAgICAgICAgaWYgKChyZW1vdmVkUGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZQotICAgICAgICAgICAgICAgICAgICAgICAgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAocmVtb3ZlZFBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSAhPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2xlYXJQYXRjaENvbm5lY3Rpb25zKHJlbW92ZWRQYXRjaCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIDIpIGlmIHRoZSBuZXcgcGF0Y2ggYW5kIG9sZCBwYXRjaCBzb3VyY2Ugb3Igc2luayBhcmUgZGV2aWNlcyBmcm9tIGRpZmZlcmVudAotICAgICAgICAgICAgICAgIC8vIGh3IG1vZHVsZXMsICBjbGVhciB0aGUgYXVkaW8gSEFMIHBhdGNoZXMgbm93IGJlY2F1c2UgdGhleSB3aWxsIG5vdCBiZSB1cGRhdGVkCi0gICAgICAgICAgICAgICAgLy8gYnkgY2FsbCB0byBjcmVhdGVfYXVkaW9fcGF0Y2goKSBiZWxvdyB3aGljaCB3aWxsIGhhcHBlbiBvbiBhIGRpZmZlcmVudCBIVyBtb2R1bGUKLSAgICAgICAgICAgICAgICBpZiAoaGFsSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBod01vZHVsZSA9IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKChyZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoLnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKChwYXRjaC0+c291cmNlc1swXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIChyZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoLnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGh3TW9kdWxlID0gcmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaC5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChwYXRjaC0+bnVtX3NpbmtzID09IDApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChyZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoLnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChwYXRjaC0+c2lua3NbMF0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2guc2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUpKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgb24gKHBhdGNoLT5udW1fc2lua3MgPT0gMCk6IHRoaXMgc2l0dWF0aW9uIHNob3VsZCBub3QgaGFwcGVuIGFzCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSBzcGVjaWFsIHBhdGNoZXMgYXJlIG9ubHkgY3JlYXRlZCBieSB0aGUgcG9saWN5IG1hbmFnZXIgYnV0IGp1c3QKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIGNhc2UsIHN5c3RlbWF0aWNhbGx5IGNsZWFyIHRoZSBIQUwgcGF0Y2guCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgcmVtb3ZlZFBhdGNoLT5tQXVkaW9QYXRjaC5udW1fc2lua3MgY2Fubm90IGJlIDAgaGVyZSBiZWNhdXNlCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBoYWxIYW5kbGUgd291bGQgYmUgQVVESU9fUEFUQ0hfSEFORExFX05PTkUgaW4gdGhpcyBjYXNlLgotICAgICAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUgPSByZW1vdmVkUGF0Y2gtPm1BdWRpb1BhdGNoLnNpbmtzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChod01vZHVsZSAhPSBBVURJT19NT0RVTEVfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KGh3TW9kdWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBod0RldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KS0+aHdEZXZpY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBod0RldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2goaGFsSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtUGF0Y2hlcy5yZW1vdmVBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgZGVsZXRlIHJlbW92ZWRQYXRjaDsKLSAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgYXV0byBpdGVyID0gbVBhdGNoZXMuZmluZCgqaGFuZGxlKTsKKyAgICAgICAgaWYgKGl0ZXIgIT0gbVBhdGNoZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcygpIHJlbW92aW5nIHBhdGNoIGhhbmRsZSAlZCIsIF9fZnVuY19fLCAqaGFuZGxlKTsKKyAgICAgICAgICAgIFBhdGNoICZyZW1vdmVkUGF0Y2ggPSBpdGVyLT5zZWNvbmQ7CisgICAgICAgICAgICAvLyBmcmVlIHJlc291cmNlcyBvd25lZCBieSB0aGUgcmVtb3ZlZCBwYXRjaCBpZiBhcHBsaWNhYmxlCisgICAgICAgICAgICAvLyAxKSBpZiBhIHNvZnR3YXJlIHBhdGNoIGlzIHByZXNlbnQsIHJlbGVhc2UgdGhlIHBsYXliYWNrIGFuZCBjYXB0dXJlIHRocmVhZHMgYW5kCisgICAgICAgICAgICAvLyB0cmFja3MgY3JlYXRlZC4gVGhpcyB3aWxsIGFsc28gcmVsZWFzZSB0aGUgY29ycmVzcG9uZGluZyBhdWRpbyBIQUwgcGF0Y2hlcworICAgICAgICAgICAgaWYgKHJlbW92ZWRQYXRjaC5pc1NvZnR3YXJlKCkpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVkUGF0Y2guY2xlYXJDb25uZWN0aW9ucyh0aGlzKTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIDIpIGlmIHRoZSBuZXcgcGF0Y2ggYW5kIG9sZCBwYXRjaCBzb3VyY2Ugb3Igc2luayBhcmUgZGV2aWNlcyBmcm9tIGRpZmZlcmVudAorICAgICAgICAgICAgLy8gaHcgbW9kdWxlcywgIGNsZWFyIHRoZSBhdWRpbyBIQUwgcGF0Y2hlcyBub3cgYmVjYXVzZSB0aGV5IHdpbGwgbm90IGJlIHVwZGF0ZWQKKyAgICAgICAgICAgIC8vIGJ5IGNhbGwgdG8gY3JlYXRlX2F1ZGlvX3BhdGNoKCkgYmVsb3cgd2hpY2ggd2lsbCBoYXBwZW4gb24gYSBkaWZmZXJlbnQgSFcgbW9kdWxlCisgICAgICAgICAgICBpZiAocmVtb3ZlZFBhdGNoLm1IYWxIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgaHdNb2R1bGUgPSBBVURJT19NT0RVTEVfSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICZvbGRQYXRjaCA9IHJlbW92ZWRQYXRjaC5tQXVkaW9QYXRjaDsKKyAgICAgICAgICAgICAgICBpZiAob2xkUGF0Y2guc291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChwYXRjaC0+c291cmNlc1swXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUgPSBvbGRQYXRjaC5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocGF0Y2gtPm51bV9zaW5rcyA9PSAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAob2xkUGF0Y2guc2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwYXRjaC0+c2lua3NbMF0udHlwZSAhPSBBVURJT19QT1JUX1RZUEVfREVWSUNFIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkUGF0Y2guc2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUpKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIG9uIChwYXRjaC0+bnVtX3NpbmtzID09IDApOiB0aGlzIHNpdHVhdGlvbiBzaG91bGQgbm90IGhhcHBlbiBhcworICAgICAgICAgICAgICAgICAgICAvLyB0aGVzZSBzcGVjaWFsIHBhdGNoZXMgYXJlIG9ubHkgY3JlYXRlZCBieSB0aGUgcG9saWN5IG1hbmFnZXIgYnV0IGp1c3QKKyAgICAgICAgICAgICAgICAgICAgLy8gaW4gY2FzZSwgc3lzdGVtYXRpY2FsbHkgY2xlYXIgdGhlIEhBTCBwYXRjaC4KKyAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHJlbW92ZWRQYXRjaC5tQXVkaW9QYXRjaC5udW1fc2lua3MgY2Fubm90IGJlIDAgaGVyZSBiZWNhdXNlCisgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZWRQYXRjaC5tSGFsSGFuZGxlIHdvdWxkIGJlIEFVRElPX1BBVENIX0hBTkRMRV9OT05FIGluIHRoaXMgY2FzZS4KKyAgICAgICAgICAgICAgICAgICAgaHdNb2R1bGUgPSBvbGRQYXRjaC5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBod0RldmljZSA9IGZpbmRId0RldmljZUJ5TW9kdWxlKGh3TW9kdWxlKTsKKyAgICAgICAgICAgICAgICBpZiAoaHdEZXZpY2UgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBod0RldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocmVtb3ZlZFBhdGNoLm1IYWxIYW5kbGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVyYXNlUGF0Y2goKmhhbmRsZSk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICBQYXRjaCAqbmV3UGF0Y2ggPSBuZXcgUGF0Y2gocGF0Y2gpOworICAgIFBhdGNoIG5ld1BhdGNoeypwYXRjaH07CisgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGluc2VydGVkTW9kdWxlID0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOwogCiAgICAgc3dpdGNoIChwYXRjaC0+c291cmNlc1swXS50eXBlKSB7CiAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX0RFVklDRTogewogICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHNyY01vZHVsZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlOwotICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkoc3JjTW9kdWxlKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgc3JjTW9kdWxlKTsKKyAgICAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBmaW5kQXVkaW9Id0RldmljZUJ5TW9kdWxlKHNyY01vZHVsZSk7CisgICAgICAgICAgICBpZiAoIWF1ZGlvSHdEZXZpY2UpIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLnZhbHVlQXQoaW5kZXgpOwogICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKICAgICAgICAgICAgICAgICAvLyBzdXBwb3J0IG9ubHkgb25lIHNpbmsgaWYgY29ubmVjdGlvbiB0byBhIG1peCBvciBhY3Jvc3MgSFcgbW9kdWxlcwogICAgICAgICAgICAgICAgIGlmICgocGF0Y2gtPnNpbmtzW2ldLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCB8fAotICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLmV4dC5taXguaHdfbW9kdWxlICE9IHNyY01vZHVsZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBhdGNoLT5zaW5rc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS5od19tb2R1bGUgIT0gc3JjTW9kdWxlKSkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MgPiAxKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIG11bHRpcGxlIHNpbmtzIGZvciBtaXggb3IgYWNyb3NzIG1vZHVsZXMgbm90IHN1cHBvcnRlZCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgLy8gcmVqZWN0IGNvbm5lY3Rpb24gdG8gZGlmZmVyZW50IHNpbmsgdHlwZXMKICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gcGF0Y2gtPnNpbmtzWzBdLnR5cGUpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBkaWZmZXJlbnQgc2luayB0eXBlcyBpbiBzYW1lIHBhdGNoIG5vdCBzdXBwb3J0ZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgZGlmZmVyZW50IHNpbmsgdHlwZXMgaW4gc2FtZSBwYXRjaCBub3Qgc3VwcG9ydGVkIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICB9CkBAIC0yNTIsNDIgKzIxMSw1NiBAQAogICAgICAgICAgICAgICAgICgocGF0Y2gtPnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgJiYKICAgICAgICAgICAgICAgICAgKChwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUgIT0gc3JjTW9kdWxlKSB8fAogICAgICAgICAgICAgICAgICAgIWF1ZGlvSHdEZXZpY2UtPnN1cHBvcnRzQXVkaW9QYXRjaGVzKCkpKSkgeworICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UgPSBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS50eXBlOworICAgICAgICAgICAgICAgIFN0cmluZzggb3V0cHV0RGV2aWNlQWRkcmVzcyA9IFN0cmluZzgocGF0Y2gtPnNpbmtzWzBdLmV4dC5kZXZpY2UuYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5udW1fc291cmNlcyA9PSAyKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c291cmNlc1sxXS50eXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVggfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocGF0Y2gtPm51bV9zaW5rcyAhPSAwICYmIHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZSAhPQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMV0uZXh0Lm1peC5od19tb2R1bGUpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGludmFsaWQgc291cmNlIGNvbWJpbmF0aW9uIik7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBpbnZhbGlkIHNvdXJjZSBjb21iaW5hdGlvbiIsIF9fZnVuY19fKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1sxXS5leHQubWl4LmhhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQgPSAoTWl4ZXJUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci5jaGVja1BsYXliYWNrVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMV0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgY2Fubm90IGdldCBwbGF5YmFjayB0aHJlYWQiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGNhbm5vdCBnZXQgcGxheWJhY2sgdGhyZWFkIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZXhpc3RpbmcgcGxheWJhY2sgdGhyZWFkIGlzIHJldXNlZCwgc28gaXQgaXMgbm90IGNsb3NlZCB3aGVuIHBhdGNoIGlzIGNsZWFyZWQKKyAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gubVBsYXliYWNrLnNldFRocmVhZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFBsYXliYWNrVGhyZWFkKj4odGhyZWFkLmdldCgpKSwgZmFsc2UgLypjbG9zZVRocmVhZCovKTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS50eXBlOwotICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KHBhdGNoLT5zaW5rc1swXS5leHQuZGV2aWNlLmFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5vcGVuT3V0cHV0X2woCisgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBwYXRjaC0+c2lua3NbMF0uc2FtcGxlX3JhdGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IHBhdGNoLT5zaW5rc1swXS5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IHBhdGNoLT5zaW5rc1swXS5mb3JtYXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyA9IHBhdGNoLT5zaW5rc1swXS5mbGFncy5vdXRwdXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5vcGVuT3V0cHV0X2woCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0LmRldmljZS5od19tb2R1bGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19OT05FKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImF1ZGlvZmxpbmdlci0+b3Blbk91dHB1dF9sKCkgcmV0dXJuZWQgJXAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZC5nZXQoKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJtQXVkaW9GbGluZ2VyLm9wZW5PdXRwdXRfbCgpIHJldHVybmVkICVwIiwgdGhyZWFkLmdldCgpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBOT19NRU1PUlk7CiAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmV3UGF0Y2gubVBsYXliYWNrLnNldFRocmVhZChyZWludGVycHJldF9jYXN0PFBsYXliYWNrVGhyZWFkKj4odGhyZWFkLmdldCgpKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLnR5cGU7CiAgICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOChwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmFkZHJlc3MpOwpAQCAtMjk3LDUyICsyNzAsNzEgQEAKICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19TQU1QTEVfUkFURSkgewogICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBwYXRjaC0+c291cmNlc1swXS5zYW1wbGVfcmF0ZTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBuZXdQYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5zYW1wbGVSYXRlKCk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5zYW1wbGVfcmF0ZSA9IG5ld1BhdGNoLm1QbGF5YmFjay50aHJlYWQoKS0+c2FtcGxlUmF0ZSgpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spIHsKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IHBhdGNoLT5zb3VyY2VzWzBdLmNoYW5uZWxfbWFzazsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb25maWcuY2hhbm5lbF9tYXNrID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KG5ld1BhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmNoYW5uZWxDb3VudCgpKTsKKyAgICAgICAgICAgICAgICAgICAgY29uZmlnLmNoYW5uZWxfbWFzayA9IGF1ZGlvX2NoYW5uZWxfaW5fbWFza19mcm9tX2NvdW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLm1QbGF5YmFjay50aHJlYWQoKS0+Y2hhbm5lbENvdW50KCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0uY29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpIHsKICAgICAgICAgICAgICAgICAgICAgY29uZmlnLmZvcm1hdCA9IHBhdGNoLT5zb3VyY2VzWzBdLmZvcm1hdDsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gbmV3UGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Zm9ybWF0KCk7CisgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBuZXdQYXRjaC5tUGxheWJhY2sudGhyZWFkKCktPmZvcm1hdCgpOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MgPworICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZmxhZ3MuaW5wdXQgOiBBVURJT19JTlBVVF9GTEFHX05PTkU7CiAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPm9wZW5JbnB1dF9sKHNyY01vZHVsZSwKKyAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLm9wZW5JbnB1dF9sKHNyY01vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSk7Ci0gICAgICAgICAgICAgICAgbmV3UGF0Y2gtPm1SZWNvcmRUaHJlYWQgPSAoUmVjb3JkVGhyZWFkICopdGhyZWFkLmdldCgpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJhdWRpb2ZsaW5nZXItPm9wZW5JbnB1dF9sKCkgcmV0dXJuZWQgJXAgaW5DaGFubmVsTWFzayAlMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC0+bVJlY29yZFRocmVhZC5nZXQoKSwgY29uZmlnLmNoYW5uZWxfbWFzayk7Ci0gICAgICAgICAgICAgICAgaWYgKG5ld1BhdGNoLT5tUmVjb3JkVGhyZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlQWRkcmVzcyk7CisgICAgICAgICAgICAgICAgQUxPR1YoIm1BdWRpb0ZsaW5nZXIub3BlbklucHV0X2woKSByZXR1cm5lZCAlcCBpbkNoYW5uZWxNYXNrICUwOHgiLAorICAgICAgICAgICAgICAgICAgICAgIHRocmVhZC5nZXQoKSwgY29uZmlnLmNoYW5uZWxfbWFzayk7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKICAgICAgICAgICAgICAgICAgICAgZ290byBleGl0OwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKG5ld1BhdGNoLCBwYXRjaCk7CisgICAgICAgICAgICAgICAgbmV3UGF0Y2gubVJlY29yZC5zZXRUaHJlYWQocmVpbnRlcnByZXRfY2FzdDxSZWNvcmRUaHJlYWQqPih0aHJlYWQuZ2V0KCkpKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBuZXdQYXRjaC5jcmVhdGVDb25uZWN0aW9ucyh0aGlzKTsKICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGF1ZGlvSHdEZXZpY2UtPmlzSW5zZXJ0KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaW5zZXJ0ZWRNb2R1bGUgPSBhdWRpb0h3RGV2aWNlLT5oYW5kbGUoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tSZWNvcmRUaHJlYWRfbCgKKyAgICAgICAgICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja1JlY29yZFRocmVhZF9sKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tNbWFwVGhyZWFkX2wocGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIuY2hlY2tNbWFwVGhyZWFkX2wocGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBjYXB0dXJlIEkvTyBoYW5kbGUgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBhdGNoLT5zaW5rc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQocGF0Y2gsICZoYWxIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBuZXdQYXRjaC5zZXRUaHJlYWQodGhyZWFkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBzdGFsZSBhdWRpbyBwYXRjaCB3aXRoIHNhbWUgaW5wdXQgYXMgc2luayBpZiBhbnkKKyAgICAgICAgICAgICAgICAgICAgZm9yIChhdXRvJiBpdGVyIDogbVBhdGNoZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpdGVyLnNlY29uZC5tQXVkaW9QYXRjaC5zaW5rc1swXS5leHQubWl4LmhhbmRsZSA9PSB0aHJlYWQtPmlkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcmFzZVBhdGNoKGl0ZXIuZmlyc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBod0RldmljZSA9IGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGh3RGV2aWNlLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoLT5udW1fc291cmNlcywKQEAgLTM1NiwxOCArMzQ4LDE4IEBACiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQVVESU9fUE9SVF9UWVBFX01JWDogewogICAgICAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IHNyY01vZHVsZSA9ICBwYXRjaC0+c291cmNlc1swXS5leHQubWl4Lmh3X21vZHVsZTsKLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KHNyY01vZHVsZSk7CisgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvRmxpbmdlci5tQXVkaW9Id0RldnMuaW5kZXhPZktleShzcmNNb2R1bGUpOwogICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBzcmNNb2R1bGUpOworICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgX19mdW5jX18sIHNyY01vZHVsZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIGxpbWl0IHRvIGNvbm5lY3Rpb25zIGJldHdlZW4gZGV2aWNlcyBhbmQgb3V0cHV0IHN0cmVhbXMKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgICAgICBEZXZpY2VEZXNjcmlwdG9yQmFzZVZlY3RvciBkZXZpY2VzOwogICAgICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIGludmFsaWQgc2luayB0eXBlICVkIGZvciBtaXggc291cmNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLnR5cGUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBpbnZhbGlkIHNpbmsgdHlwZSAlZCBmb3IgbWl4IHNvdXJjZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBhdGNoLT5zaW5rc1tpXS50eXBlKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQpAQCAtMzc2LDMyMiArMzY4LDQ5OSBAQAogICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXhpdDsKICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdHlwZSB8PSBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlOworICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3JCYXNlPiBkZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvckJhc2UoCisgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlKTsKKyAgICAgICAgICAgICAgICBkZXZpY2UtPnNldEFkZHJlc3MocGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UuYWRkcmVzcyk7CisgICAgICAgICAgICAgICAgZGV2aWNlLT5hcHBseUF1ZGlvUG9ydENvbmZpZygmcGF0Y2gtPnNpbmtzW2ldKTsKKyAgICAgICAgICAgICAgICBkZXZpY2VzLnB1c2hfYmFjayhkZXZpY2UpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb2ZsaW5nZXItPmNoZWNrUGxheWJhY2tUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci5jaGVja1BsYXliYWNrVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgdGhyZWFkID0gYXVkaW9mbGluZ2VyLT5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CisgICAgICAgICAgICAgICAgdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja01tYXBUaHJlYWRfbChwYXRjaC0+c291cmNlc1swXS5leHQubWl4LmhhbmRsZSk7CiAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgYmFkIHBsYXliYWNrIEkvTyBoYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBiYWQgcGxheWJhY2sgSS9PIGhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHRocmVhZCA9PSBhdWRpb2ZsaW5nZXItPnByaW1hcnlQbGF5YmFja1RocmVhZF9sKCkpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKCk7Ci0gICAgICAgICAgICAgICAgcGFyYW0uYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCAoaW50KXR5cGUpOwotCi0gICAgICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5icm9hY2FzdFBhcmFtZXRlcnNUb1JlY29yZFRocmVhZHNfbChwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gbUF1ZGlvRmxpbmdlci5wcmltYXJ5UGxheWJhY2tUaHJlYWRfbCgpKSB7CisgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci51cGRhdGVPdXREZXZpY2VzRm9yUmVjb3JkVGhyZWFkc19sKGRldmljZXMpOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQocGF0Y2gsICZoYWxIYW5kbGUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG5ld1BhdGNoLnNldFRocmVhZCh0aHJlYWQpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyByZW1vdmUgc3RhbGUgYXVkaW8gcGF0Y2ggd2l0aCBzYW1lIG91dHB1dCBhcyBzb3VyY2UgaWYgYW55CisgICAgICAgICAgICBmb3IgKGF1dG8mIGl0ZXIgOiBtUGF0Y2hlcykgeworICAgICAgICAgICAgICAgIGlmIChpdGVyLnNlY29uZC5tQXVkaW9QYXRjaC5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlID09IHRocmVhZC0+aWQoKSkgeworICAgICAgICAgICAgICAgICAgICBlcmFzZVBhdGNoKGl0ZXIuZmlyc3QpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICBnb3RvIGV4aXQ7CiAgICAgfQogZXhpdDoKLSAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHN0YXR1cyAlZCIsIHN0YXR1cyk7CisgICAgQUxPR1YoIiVzKCkgc3RhdHVzICVkIiwgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAqaGFuZGxlID0gKGF1ZGlvX3BhdGNoX2hhbmRsZV90KSBhdWRpb2ZsaW5nZXItPm5leHRVbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX1BBVENIKTsKLSAgICAgICAgbmV3UGF0Y2gtPm1IYW5kbGUgPSAqaGFuZGxlOwotICAgICAgICBuZXdQYXRjaC0+bUhhbEhhbmRsZSA9IGhhbEhhbmRsZTsKLSAgICAgICAgbVBhdGNoZXMuYWRkKG5ld1BhdGNoKTsKLSAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBhZGRlZCBuZXcgcGF0Y2ggaGFuZGxlICVkIGhhbEhhbmRsZSAlZCIsICpoYW5kbGUsIGhhbEhhbmRsZSk7CisgICAgICAgICpoYW5kbGUgPSAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QpIG1BdWRpb0ZsaW5nZXIubmV4dFVuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfUEFUQ0gpOworICAgICAgICBuZXdQYXRjaC5tSGFsSGFuZGxlID0gaGFsSGFuZGxlOworICAgICAgICBtQXVkaW9GbGluZ2VyLm1EZXZpY2VFZmZlY3RNYW5hZ2VyLmNyZWF0ZUF1ZGlvUGF0Y2goKmhhbmRsZSwgbmV3UGF0Y2gpOworICAgICAgICBtUGF0Y2hlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoKmhhbmRsZSwgc3RkOjptb3ZlKG5ld1BhdGNoKSkpOworICAgICAgICBpZiAoaW5zZXJ0ZWRNb2R1bGUgIT0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICBhZGRTb2Z0d2FyZVBhdGNoVG9JbnNlcnRlZE1vZHVsZXMoaW5zZXJ0ZWRNb2R1bGUsICpoYW5kbGUpOworICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgY2xlYXJQYXRjaENvbm5lY3Rpb25zKG5ld1BhdGNoKTsKLSAgICAgICAgZGVsZXRlIG5ld1BhdGNoOworICAgICAgICBuZXdQYXRjaC5jbGVhckNvbm5lY3Rpb25zKHRoaXMpOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoUGF0Y2ggKnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqYXVkaW9QYXRjaCkKK0F1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2g6On5QYXRjaCgpCit7CisgICAgQUxPR0VfSUYoaXNTb2Z0d2FyZSgpLCAiU29mdHdhcmUgcGF0Y2ggY29ubmVjdGlvbnMgbGVha2VkICVkICVkIiwKKyAgICAgICAgICAgIG1SZWNvcmQuaGFuZGxlKCksIG1QbGF5YmFjay5oYW5kbGUoKSk7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2g6OmNyZWF0ZUNvbm5lY3Rpb25zKFBhdGNoUGFuZWwgKnBhbmVsKQogewogICAgIC8vIGNyZWF0ZSBwYXRjaCBmcm9tIHNvdXJjZSBkZXZpY2UgdG8gcmVjb3JkIHRocmVhZCBpbnB1dAotICAgIHN0cnVjdCBhdWRpb19wYXRjaCBzdWJQYXRjaDsKLSAgICBzdWJQYXRjaC5udW1fc291cmNlcyA9IDE7Ci0gICAgc3ViUGF0Y2guc291cmNlc1swXSA9IGF1ZGlvUGF0Y2gtPnNvdXJjZXNbMF07Ci0gICAgc3ViUGF0Y2gubnVtX3NpbmtzID0gMTsKLQotICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLT5nZXRBdWRpb1BvcnRDb25maWcoJnN1YlBhdGNoLnNpbmtzWzBdKTsKLSAgICBzdWJQYXRjaC5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlID0gQVVESU9fU09VUkNFX01JQzsKLQotICAgIHN0YXR1c190IHN0YXR1cyA9IGNyZWF0ZUF1ZGlvUGF0Y2goJnN1YlBhdGNoLCAmcGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gcGFuZWwtPmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgICAgICBQYXRjaEJ1aWxkZXIoKS5hZGRTb3VyY2UobUF1ZGlvUGF0Y2guc291cmNlc1swXSkuCisgICAgICAgICAgICAgICAgYWRkU2luayhtUmVjb3JkLnRocmVhZCgpLCB7IC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfTUlDIH0pLnBhdGNoKCksCisgICAgICAgICAgICBtUmVjb3JkLmhhbmRsZVB0cigpKTsKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIHBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgKm1SZWNvcmQuaGFuZGxlUHRyKCkgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKICAgICAvLyBjcmVhdGUgcGF0Y2ggZnJvbSBwbGF5YmFjayB0aHJlYWQgb3V0cHV0IHRvIHNpbmsgZGV2aWNlCi0gICAgaWYgKGF1ZGlvUGF0Y2gtPm51bV9zaW5rcyAhPSAwKSB7Ci0gICAgICAgIHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmdldEF1ZGlvUG9ydENvbmZpZygmc3ViUGF0Y2guc291cmNlc1swXSk7Ci0gICAgICAgIHN1YlBhdGNoLnNpbmtzWzBdID0gYXVkaW9QYXRjaC0+c2lua3NbMF07Ci0gICAgICAgIHN0YXR1cyA9IGNyZWF0ZUF1ZGlvUGF0Y2goJnN1YlBhdGNoLCAmcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlKTsKKyAgICBpZiAobUF1ZGlvUGF0Y2gubnVtX3NpbmtzICE9IDApIHsKKyAgICAgICAgc3RhdHVzID0gcGFuZWwtPmNyZWF0ZUF1ZGlvUGF0Y2goCisgICAgICAgICAgICAgICAgUGF0Y2hCdWlsZGVyKCkuYWRkU291cmNlKG1QbGF5YmFjay50aHJlYWQoKSkuYWRkU2luayhtQXVkaW9QYXRjaC5zaW5rc1swXSkucGF0Y2goKSwKKyAgICAgICAgICAgICAgICBtUGxheWJhY2suaGFuZGxlUHRyKCkpOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICptUGxheWJhY2suaGFuZGxlUHRyKCkgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgICBwYXRjaC0+bVBsYXliYWNrUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgKm1QbGF5YmFjay5oYW5kbGVQdHIoKSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgIH0KIAotICAgIC8vIHVzZSBhIHBzZXVkbyBMQ00gYmV0d2VlbiBpbnB1dCBhbmQgb3V0cHV0IGZyYW1lY291bnQKLSAgICBzaXplX3QgcGxheWJhY2tGcmFtZUNvdW50ID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+ZnJhbWVDb3VudCgpOwotICAgIGludCBwbGF5YmFja1NoaWZ0ID0gX19idWlsdGluX2N0eihwbGF5YmFja0ZyYW1lQ291bnQpOwotICAgIHNpemVfdCByZWNvcmRGcmFtZWNvdW50ID0gcGF0Y2gtPm1SZWNvcmRUaHJlYWQtPmZyYW1lQ291bnQoKTsKLSAgICBpbnQgc2hpZnQgPSBfX2J1aWx0aW5fY3R6KHJlY29yZEZyYW1lY291bnQpOwotICAgIGlmIChwbGF5YmFja1NoaWZ0IDwgc2hpZnQpIHsKLSAgICAgICAgc2hpZnQgPSBwbGF5YmFja1NoaWZ0OwotICAgIH0KLSAgICBzaXplX3QgZnJhbWVDb3VudCA9IChwbGF5YmFja0ZyYW1lQ291bnQgKiByZWNvcmRGcmFtZWNvdW50KSA+PiBzaGlmdDsKLSAgICBBTE9HVigiY3JlYXRlUGF0Y2hDb25uZWN0aW9ucygpIHBsYXlmcmFtZUNvdW50ICV6dSByZWNvcmRGcmFtZWNvdW50ICV6dSBmcmFtZUNvdW50ICV6dSIsCi0gICAgICAgICAgcGxheWJhY2tGcmFtZUNvdW50LCByZWNvcmRGcmFtZWNvdW50LCBmcmFtZUNvdW50KTsKLQogICAgIC8vIGNyZWF0ZSBhIHNwZWNpYWwgcmVjb3JkIHRyYWNrIHRvIGNhcHR1cmUgZnJvbSByZWNvcmQgdGhyZWFkCi0gICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+Y2hhbm5lbENvdW50KCk7CisgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gbVBsYXliYWNrLnRocmVhZCgpLT5jaGFubmVsQ291bnQoKTsKICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBpbkNoYW5uZWxNYXNrID0gYXVkaW9fY2hhbm5lbF9pbl9tYXNrX2Zyb21fY291bnQoY2hhbm5lbENvdW50KTsKLSAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRDaGFubmVsTWFzayA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPmNoYW5uZWxNYXNrKCk7Ci0gICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9IHBhdGNoLT5tUGxheWJhY2tUaHJlYWQtPnNhbXBsZVJhdGUoKTsKLSAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBwYXRjaC0+bVBsYXliYWNrVGhyZWFkLT5mb3JtYXQoKTsKKyAgICBhdWRpb19jaGFubmVsX21hc2tfdCBvdXRDaGFubmVsTWFzayA9IG1QbGF5YmFjay50aHJlYWQoKS0+Y2hhbm5lbE1hc2soKTsKKyAgICB1aW50MzJfdCBzYW1wbGVSYXRlID0gbVBsYXliYWNrLnRocmVhZCgpLT5zYW1wbGVSYXRlKCk7CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gbVBsYXliYWNrLnRocmVhZCgpLT5mb3JtYXQoKTsKIAotICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQgPSBuZXcgUmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5tUmVjb3JkVGhyZWFkLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fSU5QVVRfRkxBR19OT05FKTsKLSAgICBpZiAocGF0Y2gtPm1QYXRjaFJlY29yZCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19NRU1PUlk7CisgICAgYXVkaW9fZm9ybWF0X3QgaW5wdXRGb3JtYXQgPSBtUmVjb3JkLnRocmVhZCgpLT5mb3JtYXQoKTsKKyAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20oaW5wdXRGb3JtYXQpKSB7CisgICAgICAgIC8vIFRoZSBwbGF5YmFja1RocmVhZCBmb3JtYXQgd2lsbCBzYXkgUENNIGZvciBJRUM2MTkzNyBwYWNrZXRpemVkIHN0cmVhbS4KKyAgICAgICAgLy8gVXNlIHJlY29yZFRocmVhZCBmb3JtYXQuCisgICAgICAgIGZvcm1hdCA9IGlucHV0Rm9ybWF0OwogICAgIH0KLSAgICBzdGF0dXMgPSBwYXRjaC0+bVBhdGNoUmVjb3JkLT5pbml0Q2hlY2soKTsKKyAgICBhdWRpb19pbnB1dF9mbGFnc190IGlucHV0RmxhZ3MgPSBtQXVkaW9QYXRjaC5zb3VyY2VzWzBdLmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MgPworICAgICAgICAgICAgbUF1ZGlvUGF0Y2guc291cmNlc1swXS5mbGFncy5pbnB1dCA6IEFVRElPX0lOUFVUX0ZMQUdfTk9ORTsKKyAgICBpZiAoc2FtcGxlUmF0ZSA9PSBtUmVjb3JkLnRocmVhZCgpLT5zYW1wbGVSYXRlKCkgJiYKKyAgICAgICAgICAgIGluQ2hhbm5lbE1hc2sgPT0gbVJlY29yZC50aHJlYWQoKS0+Y2hhbm5lbE1hc2soKSAmJgorICAgICAgICAgICAgbVJlY29yZC50aHJlYWQoKS0+ZmFzdFRyYWNrQXZhaWxhYmxlKCkgJiYKKyAgICAgICAgICAgIG1SZWNvcmQudGhyZWFkKCktPmhhc0Zhc3RDYXB0dXJlKCkpIHsKKyAgICAgICAgLy8gQ3JlYXRlIGEgZmFzdCB0cmFjayBpZiB0aGUgcmVjb3JkIHRocmVhZCBoYXMgZmFzdCBjYXB0dXJlIHRvIGdldCBiZXR0ZXIgcGVyZm9ybWFuY2UuCisgICAgICAgIC8vIE9ubHkgZW5hYmxlIGZhc3QgbW9kZSB3aGVuIHRoZXJlIGlzIG5vIHJlc2FtcGxlIG5lZWRlZC4KKyAgICAgICAgaW5wdXRGbGFncyA9IChhdWRpb19pbnB1dF9mbGFnc190KSAoaW5wdXRGbGFncyB8IEFVRElPX0lOUFVUX0ZMQUdfRkFTVCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRmFzdCBtb2RlIGlzIG5vdCBhdmFpbGFibGUgaW4gdGhpcyBjYXNlLgorICAgICAgICBpbnB1dEZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpIChpbnB1dEZsYWdzICYgfkFVRElPX0lOUFVUX0ZMQUdfRkFTVCk7CisgICAgfQorCisgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3Qgb3V0cHV0RmxhZ3MgPSBtQXVkaW9QYXRjaC5zaW5rc1swXS5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTID8KKyAgICAgICAgICAgIG1BdWRpb1BhdGNoLnNpbmtzWzBdLmZsYWdzLm91dHB1dCA6IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX1BBVENIOworICAgIGlmIChtQXVkaW9QYXRjaC5udW1fc291cmNlcyA9PSAyICYmIG1BdWRpb1BhdGNoLnNvdXJjZXNbMV0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CisgICAgICAgIC8vICJyZXVzZSBvbmUgZXhpc3Rpbmcgb3V0cHV0IG1peCIgY2FzZQorICAgICAgICBzdHJlYW1UeXBlID0gbUF1ZGlvUGF0Y2guc291cmNlc1sxXS5leHQubWl4LnVzZWNhc2Uuc3RyZWFtOworICAgIH0KKyAgICBpZiAobVBsYXliYWNrLnRocmVhZCgpLT5oYXNGYXN0TWl4ZXIoKSkgeworICAgICAgICAvLyBDcmVhdGUgYSBmYXN0IHRyYWNrIGlmIHRoZSBwbGF5YmFjayB0aHJlYWQgaGFzIGZhc3QgbWl4ZXIgdG8gZ2V0IGJldHRlciBwZXJmb3JtYW5jZS4KKyAgICAgICAgLy8gTm90ZTogd2Ugc2hvdWxkIGhhdmUgbWF0Y2hpbmcgY2hhbm5lbCBtYXNrLCBzYW1wbGUgcmF0ZSwgYW5kIGZvcm1hdCBieSB0aGUgbG9naWMgYWJvdmUuCisgICAgICAgIG91dHB1dEZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSAob3V0cHV0RmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19GQVNUKTsKKyAgICB9IGVsc2UgeworICAgICAgICBvdXRwdXRGbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkgKG91dHB1dEZsYWdzICYgfkFVRElPX09VVFBVVF9GTEFHX0ZBU1QpOworICAgIH0KKworICAgIHNwPFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ+IHRlbXBSZWNvcmRUcmFjazsKKyAgICBjb25zdCBib29sIHVzZVBhc3N0aHJ1UGF0Y2hSZWNvcmQgPQorICAgICAgICAgICAgKGlucHV0RmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0RJUkVDVCkgJiYgKG91dHB1dEZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBjb25zdCBzaXplX3QgcGxheWJhY2tGcmFtZUNvdW50ID0gbVBsYXliYWNrLnRocmVhZCgpLT5mcmFtZUNvdW50KCk7CisgICAgY29uc3Qgc2l6ZV90IHJlY29yZEZyYW1lQ291bnQgPSBtUmVjb3JkLnRocmVhZCgpLT5mcmFtZUNvdW50KCk7CisgICAgc2l6ZV90IGZyYW1lQ291bnQgPSAwOworICAgIGlmICh1c2VQYXNzdGhydVBhdGNoUmVjb3JkKSB7CisgICAgICAgIC8vIFBhc3N0aHJ1UGF0Y2hSZWNvcmQgcHJvZHVjZXNCdWZmZXJPbkRlbWFuZCwgc28gdXNlCisgICAgICAgIC8vIG1heGltdW0gb2YgcGxheWJhY2sgYW5kIHJlY29yZCB0aHJlYWQgZnJhbWVjb3VudHMKKyAgICAgICAgZnJhbWVDb3VudCA9IHN0ZDo6bWF4KHBsYXliYWNrRnJhbWVDb3VudCwgcmVjb3JkRnJhbWVDb3VudCk7CisgICAgICAgIEFMT0dWKCIlcygpIHBsYXlmcmFtZUNvdW50ICV6dSByZWNvcmRGcmFtZUNvdW50ICV6dSBmcmFtZUNvdW50ICV6dSIsCisgICAgICAgICAgICBfX2Z1bmNfXywgcGxheWJhY2tGcmFtZUNvdW50LCByZWNvcmRGcmFtZUNvdW50LCBmcmFtZUNvdW50KTsKKyAgICAgICAgdGVtcFJlY29yZFRyYWNrID0gbmV3IFJlY29yZFRocmVhZDo6UGFzc3RocnVQYXRjaFJlY29yZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUmVjb3JkLnRocmVhZCgpLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5DaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEZsYWdzKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyB1c2UgYSBwc2V1ZG8gTENNIGJldHdlZW4gaW5wdXQgYW5kIG91dHB1dCBmcmFtZWNvdW50CisgICAgICAgIGludCBwbGF5YmFja1NoaWZ0ID0gX19idWlsdGluX2N0eihwbGF5YmFja0ZyYW1lQ291bnQpOworICAgICAgICBpbnQgc2hpZnQgPSBfX2J1aWx0aW5fY3R6KHJlY29yZEZyYW1lQ291bnQpOworICAgICAgICBpZiAocGxheWJhY2tTaGlmdCA8IHNoaWZ0KSB7CisgICAgICAgICAgICBzaGlmdCA9IHBsYXliYWNrU2hpZnQ7CisgICAgICAgIH0KKyAgICAgICAgZnJhbWVDb3VudCA9IChwbGF5YmFja0ZyYW1lQ291bnQgKiByZWNvcmRGcmFtZUNvdW50KSA+PiBzaGlmdDsKKyAgICAgICAgQUxPR1YoIiVzKCkgcGxheWZyYW1lQ291bnQgJXp1IHJlY29yZEZyYW1lQ291bnQgJXp1IGZyYW1lQ291bnQgJXp1IiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBwbGF5YmFja0ZyYW1lQ291bnQsIHJlY29yZEZyYW1lQ291bnQsIGZyYW1lQ291bnQpOworCisgICAgICAgIHRlbXBSZWNvcmRUcmFjayA9IG5ldyBSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWNvcmQudGhyZWFkKCkuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbkNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRGbGFncyk7CisgICAgfQorICAgIHN0YXR1cyA9IG1SZWNvcmQuY2hlY2tUcmFjayh0ZW1wUmVjb3JkVHJhY2suZ2V0KCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgcGF0Y2gtPm1SZWNvcmRUaHJlYWQtPmFkZFBhdGNoUmVjb3JkKHBhdGNoLT5tUGF0Y2hSZWNvcmQpOwogCiAgICAgLy8gY3JlYXRlIGEgc3BlY2lhbCBwbGF5YmFjayB0cmFjayB0byByZW5kZXIgdG8gcGxheWJhY2sgdGhyZWFkLgogICAgIC8vIHRoaXMgdHJhY2sgaXMgZ2l2ZW4gdGhlIHNhbWUgYnVmZmVyIGFzIHRoZSBQYXRjaFJlY29yZCBidWZmZXIKLSAgICBwYXRjaC0+bVBhdGNoVHJhY2sgPSBuZXcgUGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2soCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1BhdGNoLT5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW0sCisgICAgc3A8UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s+IHRlbXBQYXRjaFRyYWNrID0gbmV3IFBsYXliYWNrVGhyZWFkOjpQYXRjaFRyYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QbGF5YmFjay50aHJlYWQoKS5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0Q2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+YnVmZmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+YnVmZmVyU2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUpOwotICAgIHN0YXR1cyA9IHBhdGNoLT5tUGF0Y2hUcmFjay0+aW5pdENoZWNrKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcFJlY29yZFRyYWNrLT5idWZmZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wUmVjb3JkVHJhY2stPmJ1ZmZlclNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGbGFncyk7CisgICAgc3RhdHVzID0gbVBsYXliYWNrLmNoZWNrVHJhY2sodGVtcFBhdGNoVHJhY2suZ2V0KCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0gICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+YWRkUGF0Y2hUcmFjayhwYXRjaC0+bVBhdGNoVHJhY2spOwogCiAgICAgLy8gdGllIHBsYXliYWNrIGFuZCByZWNvcmQgdHJhY2tzIHRvZ2V0aGVyCi0gICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+c2V0UGVlclByb3h5KHBhdGNoLT5tUGF0Y2hUcmFjay5nZXQoKSk7Ci0gICAgcGF0Y2gtPm1QYXRjaFRyYWNrLT5zZXRQZWVyUHJveHkocGF0Y2gtPm1QYXRjaFJlY29yZC5nZXQoKSk7CisgICAgLy8gSW4gdGhlIGNhc2Ugb2YgUGFzc3RocnVQYXRjaFJlY29yZCBubyBJL08gYWN0aXZpdHkgaGFwcGVucyBvbiBSZWNvcmRUaHJlYWQsCisgICAgLy8gZXZlcnl0aGluZyBpcyBkcml2ZW4gZnJvbSBQbGF5YmFja1RocmVhZC4gVGh1cyBBdWRpb0J1ZmZlclByb3ZpZGVyIG1ldGhvZHMKKyAgICAvLyBvZiBQYXNzdGhydVBhdGNoUmVjb3JkIGNhbiBvbmx5IGJlIGNhbGxlZCBpZiB0aGUgY29ycmVzcG9uZGluZyBQYXRjaFRyYWNrCisgICAgLy8gaXMgYWxpdmUuIFRoZXJlIGlzIG5vIG5lZWQgdG8gaG9sZCBhIHJlZmVyZW5jZSwgYW5kIHRoZXJlIGlzIG5vIG5lZWQKKyAgICAvLyB0byBjbGVhciBpdC4gSW4gZmFjdCwgc2luY2UgcGxheWJhY2sgc3RvcHBpbmcgaXMgYXN5bmNocm9ub3VzLCB0aGVyZSBpcworICAgIC8vIG5vIHByb3BlciB0aW1lIHdoZW4gY2xlYXJpbmcgY291bGQgYmUgZG9uZS4KKyAgICBtUmVjb3JkLnNldFRyYWNrQW5kUGVlcih0ZW1wUmVjb3JkVHJhY2ssIHRlbXBQYXRjaFRyYWNrLCAhdXNlUGFzc3RocnVQYXRjaFJlY29yZCk7CisgICAgbVBsYXliYWNrLnNldFRyYWNrQW5kUGVlcih0ZW1wUGF0Y2hUcmFjaywgdGVtcFJlY29yZFRyYWNrLCB0cnVlIC8qaG9sZFJlZmVyZW5jZSovKTsKIAogICAgIC8vIHN0YXJ0IGNhcHR1cmUgYW5kIHBsYXliYWNrCi0gICAgcGF0Y2gtPm1QYXRjaFJlY29yZC0+c3RhcnQoQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSwgQVVESU9fU0VTU0lPTl9OT05FKTsKLSAgICBwYXRjaC0+bVBhdGNoVHJhY2stPnN0YXJ0KCk7CisgICAgbVJlY29yZC50cmFjaygpLT5zdGFydChBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9OT05FLCBBVURJT19TRVNTSU9OX05PTkUpOworICAgIG1QbGF5YmFjay50cmFjaygpLT5zdGFydCgpOwogCiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmNsZWFyUGF0Y2hDb25uZWN0aW9ucyhQYXRjaCAqcGF0Y2gpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6UGF0Y2g6OmNsZWFyQ29ubmVjdGlvbnMoUGF0Y2hQYW5lbCAqcGFuZWwpCiB7Ci0gICAgc3A8QXVkaW9GbGluZ2VyPiBhdWRpb2ZsaW5nZXIgPSBtQXVkaW9GbGluZ2VyLnByb21vdGUoKTsKLSAgICBpZiAoYXVkaW9mbGluZ2VyID09IDApIHsKLSAgICAgICAgcmV0dXJuOworICAgIEFMT0dWKCIlcygpIG1SZWNvcmQuaGFuZGxlICVkIG1QbGF5YmFjay5oYW5kbGUgJWQiLAorICAgICAgICAgICAgX19mdW5jX18sIG1SZWNvcmQuaGFuZGxlKCksIG1QbGF5YmFjay5oYW5kbGUoKSk7CisgICAgbVJlY29yZC5zdG9wVHJhY2soKTsKKyAgICBtUGxheWJhY2suc3RvcFRyYWNrKCk7CisgICAgbVJlY29yZC5jbGVhclRyYWNrUGVlcigpOyAvLyBtUmVjb3JkIHN0b3AgaXMgc3luY2hyb25vdXMuIEJyZWFrIFBlZXJQcm94eSBzcDw+IGN5Y2xlLgorICAgIG1SZWNvcmQuY2xvc2VDb25uZWN0aW9ucyhwYW5lbCk7CisgICAgbVBsYXliYWNrLmNsb3NlQ29ubmVjdGlvbnMocGFuZWwpOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlBhdGNoOjpnZXRMYXRlbmN5TXMoZG91YmxlICpsYXRlbmN5TXMpIGNvbnN0Cit7CisgICAgaWYgKCFpc1NvZnR3YXJlKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIGF1dG8gcmVjb3JkVHJhY2sgPSBtUmVjb3JkLmNvbnN0X3RyYWNrKCk7CisgICAgaWYgKHJlY29yZFRyYWNrLmdldCgpID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIGF1dG8gcGxheWJhY2tUcmFjayA9IG1QbGF5YmFjay5jb25zdF90cmFjaygpOworICAgIGlmIChwbGF5YmFja1RyYWNrLmdldCgpID09IG51bGxwdHIpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKworICAgIC8vIExhdGVuY3kgaW5mb3JtYXRpb24gZm9yIHRyYWNrcyBtYXkgYmUgY2FsbGVkIHdpdGhvdXQgb2J0YWluaW5nCisgICAgLy8gdGhlIHVuZGVybHlpbmcgdGhyZWFkIGxvY2suCisgICAgLy8KKyAgICAvLyBXZSB1c2UgcmVjb3JkIHNlcnZlciBsYXRlbmN5ICsgcGxheWJhY2sgdHJhY2sgbGF0ZW5jeSAoZ2VuZXJhbGx5IHNtYWxsZXIgdGhhbiB0aGUKKyAgICAvLyByZXZlcnNlIGR1ZSB0byBpbnRlcm5hbCBiaWFzZXMpLgorICAgIC8vCisgICAgLy8gVE9ETzogaXMgdGhpcyBzdGFibGUgZW5vdWdoPyBDb25zaWRlciBhIFBhdGNoVHJhY2sgc3luY2hyb25pemVkIHZlcnNpb24gb2YgdGhpcy4KKworICAgIC8vIEZvciBQQ00gdHJhY2tzIGdldCBzZXJ2ZXIgbGF0ZW5jeS4KKyAgICBpZiAoYXVkaW9faXNfbGluZWFyX3BjbShyZWNvcmRUcmFjay0+Zm9ybWF0KCkpKSB7CisgICAgICAgIGRvdWJsZSByZWNvcmRTZXJ2ZXJMYXRlbmN5TXMsIHBsYXliYWNrVHJhY2tMYXRlbmN5TXM7CisgICAgICAgIGlmIChyZWNvcmRUcmFjay0+Z2V0U2VydmVyTGF0ZW5jeU1zKCZyZWNvcmRTZXJ2ZXJMYXRlbmN5TXMpID09IE9LCisgICAgICAgICAgICAgICAgJiYgcGxheWJhY2tUcmFjay0+Z2V0VHJhY2tMYXRlbmN5TXMoJnBsYXliYWNrVHJhY2tMYXRlbmN5TXMpID09IE9LKSB7CisgICAgICAgICAgICAqbGF0ZW5jeU1zID0gcmVjb3JkU2VydmVyTGF0ZW5jeU1zICsgcGxheWJhY2tUcmFja0xhdGVuY3lNczsKKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQogICAgIH0KIAotICAgIEFMT0dWKCJjbGVhclBhdGNoQ29ubmVjdGlvbnMoKSBwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlICVkIHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSAlZCIsCi0gICAgICAgICAgcGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSwgcGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlKTsKKyAgICAvLyBTZWUgaWYga2VybmVsIGxhdGVuY2llcyBhcmUgYXZhaWxhYmxlLgorICAgIC8vIElmIHNvLCBkbyBhIGZyYW1lIGRpZmYgYW5kIHRpbWUgZGlmZmVyZW5jZSBjb21wdXRhdGlvbiB0byBlc3RpbWF0ZQorICAgIC8vIHRoZSB0b3RhbCBwYXRjaCBsYXRlbmN5LiBUaGlzIHJlcXVpcmVzIHRoYXQgZnJhbWUgY291bnRzIGFyZSByZXBvcnRlZCBieSB0aGUKKyAgICAvLyBIQUwgYXJlIG1hdGNoZWQgcHJvcGVybHkgaW4gdGhlIGNhc2Ugb2YgcmVjb3JkIG92ZXJydW5zIGFuZCBwbGF5YmFjayB1bmRlcnJ1bnMuCisgICAgVGhyZWFkQmFzZTo6VHJhY2tCYXNlOjpGcmFtZVRpbWUgcmVjb3JkRlR7fSwgcGxheUZUe307CisgICAgcmVjb3JkVHJhY2stPmdldEtlcm5lbEZyYW1lVGltZSgmcmVjb3JkRlQpOworICAgIHBsYXliYWNrVHJhY2stPmdldEtlcm5lbEZyYW1lVGltZSgmcGxheUZUKTsKKyAgICBpZiAocmVjb3JkRlQudGltZU5zID4gMCAmJiBwbGF5RlQudGltZU5zID4gMCkgeworICAgICAgICBjb25zdCBpbnQ2NF90IGZyYW1lRGlmZiA9IHJlY29yZEZULmZyYW1lcyAtIHBsYXlGVC5mcmFtZXM7CisgICAgICAgIGNvbnN0IGludDY0X3QgdGltZURpZmZOcyA9IHJlY29yZEZULnRpbWVOcyAtIHBsYXlGVC50aW1lTnM7CiAKLSAgICBpZiAocGF0Y2gtPm1QYXRjaFJlY29yZCAhPSAwKSB7Ci0gICAgICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQtPnN0b3AoKTsKLSAgICB9Ci0gICAgaWYgKHBhdGNoLT5tUGF0Y2hUcmFjayAhPSAwKSB7Ci0gICAgICAgIHBhdGNoLT5tUGF0Y2hUcmFjay0+c3RvcCgpOwotICAgIH0KLSAgICBpZiAocGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChwYXRjaC0+bVJlY29yZFBhdGNoSGFuZGxlKTsKLSAgICAgICAgcGF0Y2gtPm1SZWNvcmRQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIH0KLSAgICBpZiAocGF0Y2gtPm1QbGF5YmFja1BhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSk7Ci0gICAgICAgIHBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIH0KLSAgICBpZiAocGF0Y2gtPm1SZWNvcmRUaHJlYWQgIT0gMCkgewotICAgICAgICBpZiAocGF0Y2gtPm1QYXRjaFJlY29yZCAhPSAwKSB7Ci0gICAgICAgICAgICBwYXRjaC0+bVJlY29yZFRocmVhZC0+ZGVsZXRlUGF0Y2hSZWNvcmQocGF0Y2gtPm1QYXRjaFJlY29yZCk7CisgICAgICAgIC8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHBhdGNoIHRyYWNrIGFuZCBwYXRjaCByZWNvcmQgaGF2ZSBhIGxhcmdlIHRpbWUgZGlzcGFyaXR5IGJlY2F1c2UKKyAgICAgICAgLy8gb25lIHRocmVhZCBydW5zIGJ1dCBhbm90aGVyIGlzIHN0b3BwZWQuICBXZSBhcmJpdHJhcmlseSBjaG9vc2UgdGhlIG1heGltdW0gdGltZXN0YW1wCisgICAgICAgIC8vIHRpbWUgZGlmZmVyZW5jZSBiYXNlZCBvbiBob3cgb2Z0ZW4gd2UgZXhwZWN0IHRoZSB0aW1lc3RhbXBzIHRvIHVwZGF0ZSBpbiBub3JtYWwgb3BlcmF0aW9uCisgICAgICAgIC8vICh0eXBpY2FsIHNob3VsZCBiZSBubyBtb3JlIHRoYW4gNTAgbXMpLgorICAgICAgICAvLworICAgICAgICAvLyBJZiB0aGUgdGltZXN0YW1wcyBhcmVuJ3Qgc2FtcGxlZCBjbG9zZSBlbm91Z2gsIHRoZSBwYXRjaCBsYXRlbmN5IGlzIG5vdAorICAgICAgICAvLyBjb25zaWRlcmVkIHZhbGlkLgorICAgICAgICAvLworICAgICAgICAvLyBUT0RPOiBjaGFuZ2UgdGhpcyBiYXNlZCBvbiBtb3JlIGV4cGVyaW1lbnRzLgorICAgICAgICBjb25zdGV4cHIgaW50NjRfdCBtYXhWYWxpZFRpbWVEaWZmTnMgPSAyMDAgKiBOQU5PU19QRVJfTUlMTElTRUNPTkQ7CisgICAgICAgIGlmIChzdGQ6OmFicyh0aW1lRGlmZk5zKSA8IG1heFZhbGlkVGltZURpZmZOcykgeworICAgICAgICAgICAgKmxhdGVuY3lNcyA9IGZyYW1lRGlmZiAqIDFlMyAvIHJlY29yZFRyYWNrLT5zYW1wbGVSYXRlKCkKKyAgICAgICAgICAgICAgICAgICAtIHRpbWVEaWZmTnMgKiAxZS02OworICAgICAgICAgICAgcmV0dXJuIE9LOwogICAgICAgICB9Ci0gICAgICAgIGF1ZGlvZmxpbmdlci0+Y2xvc2VJbnB1dEludGVybmFsX2wocGF0Y2gtPm1SZWNvcmRUaHJlYWQpOwotICAgIH0KLSAgICBpZiAocGF0Y2gtPm1QbGF5YmFja1RocmVhZCAhPSAwKSB7Ci0gICAgICAgIGlmIChwYXRjaC0+bVBhdGNoVHJhY2sgIT0gMCkgewotICAgICAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC0+ZGVsZXRlUGF0Y2hUcmFjayhwYXRjaC0+bVBhdGNoVHJhY2spOwotICAgICAgICB9Ci0gICAgICAgIC8vIGlmIG51bSBzb3VyY2VzID09IDIgd2UgYXJlIHJldXNpbmcgYW4gZXhpc3RpbmcgcGxheWJhY2sgdGhyZWFkIHNvIHdlIGRvIG5vdCBjbG9zZSBpdAotICAgICAgICBpZiAocGF0Y2gtPm1BdWRpb1BhdGNoLm51bV9zb3VyY2VzICE9IDIpIHsKLSAgICAgICAgICAgIGF1ZGlvZmxpbmdlci0+Y2xvc2VPdXRwdXRJbnRlcm5hbF9sKHBhdGNoLT5tUGxheWJhY2tUaHJlYWQpOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChwYXRjaC0+bVJlY29yZFRocmVhZCAhPSAwKSB7Ci0gICAgICAgIGlmIChwYXRjaC0+bVBhdGNoUmVjb3JkICE9IDApIHsKLSAgICAgICAgICAgIHBhdGNoLT5tUGF0Y2hSZWNvcmQuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBwYXRjaC0+bVJlY29yZFRocmVhZC5jbGVhcigpOwotICAgIH0KLSAgICBpZiAocGF0Y2gtPm1QbGF5YmFja1RocmVhZCAhPSAwKSB7Ci0gICAgICAgIGlmIChwYXRjaC0+bVBhdGNoVHJhY2sgIT0gMCkgewotICAgICAgICAgICAgcGF0Y2gtPm1QYXRjaFRyYWNrLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcGF0Y2gtPm1QbGF5YmFja1RocmVhZC5jbGVhcigpOwogICAgIH0KIAorICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKK30KKworU3RyaW5nOCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlBhdGNoOjpkdW1wKGF1ZGlvX3BhdGNoX2hhbmRsZV90IG15SGFuZGxlKSBjb25zdAoreworICAgIC8vIFRPRE86IENvbnNpZGVyIHRhYmxlIGR1bXAgZm9ybSBmb3IgcGF0Y2hlcywganVzdCBsaWtlIHRyYWNrcy4KKyAgICBTdHJpbmc4IHJlc3VsdCA9IFN0cmluZzg6OmZvcm1hdCgiUGF0Y2ggJWQ6ICVzICh0aHJlYWQgJXAgPT4gdGhyZWFkICVwKSIsCisgICAgICAgICAgICBteUhhbmRsZSwgaXNTb2Z0d2FyZSgpID8gIlNvZnR3YXJlIGJyaWRnZSBiZXR3ZWVuIiA6ICJObyBzb2Z0d2FyZSBicmlkZ2UiLAorICAgICAgICAgICAgbVJlY29yZC5jb25zdF90aHJlYWQoKS5nZXQoKSwgbVBsYXliYWNrLmNvbnN0X3RocmVhZCgpLmdldCgpKTsKKworICAgIGJvb2wgaGFzU2lua0RldmljZSA9CisgICAgICAgICAgICBtQXVkaW9QYXRjaC5udW1fc2lua3MgPiAwICYmIG1BdWRpb1BhdGNoLnNpbmtzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRTsKKyAgICBib29sIGhhc1NvdXJjZURldmljZSA9CisgICAgICAgICAgICBtQXVkaW9QYXRjaC5udW1fc291cmNlcyA+IDAgJiYgbUF1ZGlvUGF0Y2guc291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U7CisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiIHRocmVhZCAlcCAlcyAoJWQpIGZpcnN0IGRldmljZSB0eXBlICUwOHgiLCBtVGhyZWFkLnVuc2FmZV9nZXQoKSwKKyAgICAgICAgICAgIGhhc1NpbmtEZXZpY2UgPyAibnVtIHNpbmtzIiA6CisgICAgICAgICAgICAgICAgKGhhc1NvdXJjZURldmljZSA/ICJudW0gc291cmNlcyIgOiAibm8gZGV2aWNlcyIpLAorICAgICAgICAgICAgaGFzU2lua0RldmljZSA/IG1BdWRpb1BhdGNoLm51bV9zaW5rcyA6CisgICAgICAgICAgICAgICAgKGhhc1NvdXJjZURldmljZSA/IG1BdWRpb1BhdGNoLm51bV9zb3VyY2VzIDogMCksCisgICAgICAgICAgICBoYXNTaW5rRGV2aWNlID8gbUF1ZGlvUGF0Y2guc2lua3NbMF0uZXh0LmRldmljZS50eXBlIDoKKyAgICAgICAgICAgICAgICAoaGFzU291cmNlRGV2aWNlID8gbUF1ZGlvUGF0Y2guc291cmNlc1swXS5leHQuZGV2aWNlLnR5cGUgOiAwKSk7CisKKyAgICAvLyBhZGQgbGF0ZW5jeSBpZiBpdCBleGlzdHMKKyAgICBkb3VibGUgbGF0ZW5jeU1zOworICAgIGlmIChnZXRMYXRlbmN5TXMoJmxhdGVuY3lNcykgPT0gT0spIHsKKyAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICBsYXRlbmN5OiAlLjJsZiBtcyIsIGxhdGVuY3lNcyk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7CiB9CiAKIC8qIERpc2Nvbm5lY3QgYSBwYXRjaCAqLwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpyZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCiB7Ci0gICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoIGhhbmRsZSAlZCIsIGhhbmRsZSk7CisgICAgQUxPR1YoIiVzIGhhbmRsZSAlZCIsIF9fZnVuY19fLCBoYW5kbGUpOwogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIHNpemVfdCBpbmRleDsKIAotICAgIHNwPEF1ZGlvRmxpbmdlcj4gYXVkaW9mbGluZ2VyID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7Ci0gICAgaWYgKGF1ZGlvZmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLQotICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8IG1QYXRjaGVzLnNpemUoKTsgaW5kZXgrKykgewotICAgICAgICBpZiAoaGFuZGxlID09IG1QYXRjaGVzW2luZGV4XS0+bUhhbmRsZSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKGluZGV4ID09IG1QYXRjaGVzLnNpemUoKSkgeworICAgIGF1dG8gaXRlciA9IG1QYXRjaGVzLmZpbmQoaGFuZGxlKTsKKyAgICBpZiAoaXRlciA9PSBtUGF0Y2hlcy5lbmQoKSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBQYXRjaCAqcmVtb3ZlZFBhdGNoID0gbVBhdGNoZXNbaW5kZXhdOwotICAgIG1QYXRjaGVzLnJlbW92ZUF0KGluZGV4KTsKKyAgICBQYXRjaCAmcmVtb3ZlZFBhdGNoID0gaXRlci0+c2Vjb25kOworICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAmcGF0Y2ggPSByZW1vdmVkUGF0Y2gubUF1ZGlvUGF0Y2g7CiAKLSAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoID0gJnJlbW92ZWRQYXRjaC0+bUF1ZGlvUGF0Y2g7Ci0KLSAgICBzd2l0Y2ggKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUpIHsKKyAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgJnNyYyA9IHBhdGNoLnNvdXJjZXNbMF07CisgICAgc3dpdGNoIChzcmMudHlwZSkgewogICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9ERVZJQ0U6IHsKLSAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBzcmNNb2R1bGUgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLmh3X21vZHVsZTsKLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXggPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy5pbmRleE9mS2V5KHNyY01vZHVsZSk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coInJlbGVhc2VBdWRpb1BhdGNoKCkgYmFkIHNyYyBodyBtb2R1bGUgJWQiLCBzcmNNb2R1bGUpOworICAgICAgICAgICAgc3A8RGV2aWNlSGFsSW50ZXJmYWNlPiBod0RldmljZSA9IGZpbmRId0RldmljZUJ5TW9kdWxlKHNyYy5leHQuZGV2aWNlLmh3X21vZHVsZSk7CisgICAgICAgICAgICBpZiAoaHdEZXZpY2UgPT0gMCkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcygpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgX19mdW5jX18sIHNyYy5leHQuZGV2aWNlLmh3X21vZHVsZSk7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBpZiAocmVtb3ZlZFBhdGNoLT5tUmVjb3JkUGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUgfHwKLSAgICAgICAgICAgICAgICAgICAgcmVtb3ZlZFBhdGNoLT5tUGxheWJhY2tQYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgIGNsZWFyUGF0Y2hDb25uZWN0aW9ucyhyZW1vdmVkUGF0Y2gpOworICAgICAgICAgICAgaWYgKHJlbW92ZWRQYXRjaC5pc1NvZnR3YXJlKCkpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVkUGF0Y2guY2xlYXJDb25uZWN0aW9ucyh0aGlzKTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKLSAgICAgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPmNoZWNrUmVjb3JkVGhyZWFkX2woCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgIGlmIChwYXRjaC5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSA9IHBhdGNoLnNpbmtzWzBdLmV4dC5taXguaGFuZGxlOworICAgICAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1BdWRpb0ZsaW5nZXIuY2hlY2tSZWNvcmRUaHJlYWRfbChpb0hhbmRsZSk7CiAgICAgICAgICAgICAgICAgaWYgKHRocmVhZCA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocmVhZCA9IGF1ZGlvZmxpbmdlci0+Y2hlY2tNbWFwVGhyZWFkX2wocGF0Y2gtPnNpbmtzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkID0gbUF1ZGlvRmxpbmdlci5jaGVja01tYXBUaHJlYWRfbChpb0hhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIGlmICh0aHJlYWQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coInJlbGVhc2VBdWRpb1BhdGNoKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgYmFkIGNhcHR1cmUgSS9PIGhhbmRsZSAlZCIsIF9fZnVuY19fLCBpb0hhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0aHJlYWQtPnNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KHJlbW92ZWRQYXRjaC0+bUhhbEhhbmRsZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChyZW1vdmVkUGF0Y2gubUhhbEhhbmRsZSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBhdWRpb2ZsaW5nZXItPm1BdWRpb0h3RGV2cy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGh3RGV2aWNlID0gYXVkaW9Id0RldmljZS0+aHdEZXZpY2UoKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocmVtb3ZlZFBhdGNoLT5tSGFsSGFuZGxlKTsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBod0RldmljZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocmVtb3ZlZFBhdGNoLm1IYWxIYW5kbGUpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIEFVRElPX1BPUlRfVFlQRV9NSVg6IHsKLSAgICAgICAgICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBzcmNNb2R1bGUgPSAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5od19tb2R1bGU7Ci0gICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMuaW5kZXhPZktleShzcmNNb2R1bGUpOwotICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlQXVkaW9QYXRjaCgpIGJhZCBzcmMgaHcgbW9kdWxlICVkIiwgc3JjTW9kdWxlKTsKKyAgICAgICAgICAgIGlmIChmaW5kSHdEZXZpY2VCeU1vZHVsZShzcmMuZXh0Lm1peC5od19tb2R1bGUpID09IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBiYWQgc3JjIGh3IG1vZHVsZSAlZCIsIF9fZnVuY19fLCBzcmMuZXh0Lm1peC5od19tb2R1bGUpOwogICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9mbGluZ2VyLT5jaGVja1BsYXliYWNrVGhyZWFkX2wocGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUgPSBzcmMuZXh0Lm1peC5oYW5kbGU7CisgICAgICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLmNoZWNrUGxheWJhY2tUaHJlYWRfbChpb0hhbmRsZSk7CiAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICB0aHJlYWQgPSBhdWRpb2ZsaW5nZXItPmNoZWNrTW1hcFRocmVhZF9sKHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5taXguaGFuZGxlKTsKKyAgICAgICAgICAgICAgICB0aHJlYWQgPSBtQXVkaW9GbGluZ2VyLmNoZWNrTW1hcFRocmVhZF9sKGlvSGFuZGxlKTsKICAgICAgICAgICAgICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coInJlbGVhc2VBdWRpb1BhdGNoKCkgYmFkIHBsYXliYWNrIEkvTyBoYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBiYWQgcGxheWJhY2sgSS9PIGhhbmRsZSAlZCIsIF9fZnVuY19fLCBpb0hhbmRsZSk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChyZW1vdmVkUGF0Y2gtPm1IYWxIYW5kbGUpOworICAgICAgICAgICAgc3RhdHVzID0gdGhyZWFkLT5zZW5kUmVsZWFzZUF1ZGlvUGF0Y2hDb25maWdFdmVudChyZW1vdmVkUGF0Y2gubUhhbEhhbmRsZSk7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICBicmVhazsKICAgICB9CiAKLSAgICBkZWxldGUgcmVtb3ZlZFBhdGNoOworICAgIGVyYXNlUGF0Y2goaGFuZGxlKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6ZXJhc2VQYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpIHsKKyAgICBtUGF0Y2hlcy5lcmFzZShoYW5kbGUpOworICAgIHJlbW92ZVNvZnR3YXJlUGF0Y2hGcm9tSW5zZXJ0ZWRNb2R1bGVzKGhhbmRsZSk7CisgICAgbUF1ZGlvRmxpbmdlci5tRGV2aWNlRWZmZWN0TWFuYWdlci5yZWxlYXNlQXVkaW9QYXRjaChoYW5kbGUpOworfQogCiAvKiBMaXN0IGNvbm5lY3RlZCBhdWRpbyBwb3J0cyBhbmQgdGhleSBhdHRyaWJ1dGVzICovCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6Omxpc3RBdWRpb1BhdGNoZXModW5zaWduZWQgaW50ICpudW1fcGF0Y2hlcyBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMgX191bnVzZWQpCiB7Ci0gICAgQUxPR1YoImxpc3RBdWRpb1BhdGNoZXMiKTsKKyAgICBBTE9HVihfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi0vKiBTZXQgYXVkaW8gcG9ydCBjb25maWd1cmF0aW9uICovCi1zdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OnNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6Z2V0RG93bnN0cmVhbVNvZnR3YXJlUGF0Y2hlcygKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtLAorICAgICAgICBzdGQ6OnZlY3RvcjxBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OlNvZnR3YXJlUGF0Y2g+ICpwYXRjaGVzKSBjb25zdAogewotICAgIEFMT0dWKCJzZXRBdWRpb1BvcnRDb25maWciKTsKLQotICAgIHNwPEF1ZGlvRmxpbmdlcj4gYXVkaW9mbGluZ2VyID0gbUF1ZGlvRmxpbmdlci5wcm9tb3RlKCk7Ci0gICAgaWYgKGF1ZGlvZmxpbmdlciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBOT19JTklUOworICAgIGZvciAoY29uc3QgYXV0byYgbW9kdWxlIDogbUluc2VydGVkTW9kdWxlcykgeworICAgICAgICBpZiAobW9kdWxlLnNlY29uZC5zdHJlYW1zLmNvdW50KHN0cmVhbSkpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcGF0Y2hIYW5kbGUgOiBtb2R1bGUuc2Vjb25kLnN3X3BhdGNoZXMpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBhdXRvJiBwYXRjaF9pdGVyID0gbVBhdGNoZXMuZmluZChwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgaWYgKHBhdGNoX2l0ZXIgIT0gbVBhdGNoZXMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUGF0Y2ggJnBhdGNoID0gcGF0Y2hfaXRlci0+c2Vjb25kOworICAgICAgICAgICAgICAgICAgICBwYXRjaGVzLT5lbXBsYWNlX2JhY2soKnRoaXMsIHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLm1QbGF5YmFjay5jb25zdF90aHJlYWQoKS0+aWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC5tUmVjb3JkLmNvbnN0X3RocmVhZCgpLT5pZCgpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiU3RhbGUgcGF0Y2ggaGFuZGxlIGluIHRoZSBjYWNoZTogJWQiLCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIE9LOworICAgICAgICB9CiAgICAgfQorICAgIC8vIFRoZSBzdHJlYW0gaXMgbm90IGFzc29jaWF0ZWQgd2l0aCBhbnkgb2YgaW5zZXJ0ZWQgbW9kdWxlcy4KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQogCi0gICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZTsKLSAgICBpZiAoY29uZmlnLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgbW9kdWxlID0gY29uZmlnLT5leHQuZGV2aWNlLmh3X21vZHVsZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtb2R1bGUgPSBjb25maWctPmV4dC5taXguaHdfbW9kdWxlOwordm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6Om5vdGlmeVN0cmVhbU9wZW5lZCgKKyAgICAgICAgQXVkaW9Id0RldmljZSAqYXVkaW9Id0RldmljZSwgYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtKQoreworICAgIGlmIChhdWRpb0h3RGV2aWNlLT5pc0luc2VydCgpKSB7CisgICAgICAgIG1JbnNlcnRlZE1vZHVsZXNbYXVkaW9Id0RldmljZS0+aGFuZGxlKCldLnN0cmVhbXMuaW5zZXJ0KHN0cmVhbSk7CiAgICAgfQorfQogCi0gICAgc3NpemVfdCBpbmRleCA9IGF1ZGlvZmxpbmdlci0+bUF1ZGlvSHdEZXZzLmluZGV4T2ZLZXkobW9kdWxlKTsKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpub3RpZnlTdHJlYW1DbG9zZWQoYXVkaW9faW9faGFuZGxlX3Qgc3RyZWFtKQoreworICAgIGZvciAoYXV0byYgbW9kdWxlIDogbUluc2VydGVkTW9kdWxlcykgeworICAgICAgICBtb2R1bGUuc2Vjb25kLnN0cmVhbXMuZXJhc2Uoc3RyZWFtKTsKKyAgICB9Cit9CisKK0F1ZGlvSHdEZXZpY2UqIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6ZmluZEF1ZGlvSHdEZXZpY2VCeU1vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlKQoreworICAgIGlmIChtb2R1bGUgPT0gQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FKSByZXR1cm4gbnVsbHB0cjsKKyAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvRmxpbmdlci5tQXVkaW9Id0RldnMuaW5kZXhPZktleShtb2R1bGUpOwogICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInNldEF1ZGlvUG9ydENvbmZpZygpIGJhZCBodyBtb2R1bGUgJWQiLCBtb2R1bGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HVygiJXMoKSBiYWQgaHcgbW9kdWxlICVkIiwgX19mdW5jX18sIG1vZHVsZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbUF1ZGlvRmxpbmdlci5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7Cit9CisKK3NwPERldmljZUhhbEludGVyZmFjZT4gQXVkaW9GbGluZ2VyOjpQYXRjaFBhbmVsOjpmaW5kSHdEZXZpY2VCeU1vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlKQoreworICAgIEF1ZGlvSHdEZXZpY2UgKmF1ZGlvSHdEZXZpY2UgPSBmaW5kQXVkaW9Id0RldmljZUJ5TW9kdWxlKG1vZHVsZSk7CisgICAgcmV0dXJuIGF1ZGlvSHdEZXZpY2UgPyBhdWRpb0h3RGV2aWNlLT5od0RldmljZSgpIDogbnVsbHB0cjsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBhdGNoUGFuZWw6OmFkZFNvZnR3YXJlUGF0Y2hUb0luc2VydGVkTW9kdWxlcygKKyAgICAgICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIG1JbnNlcnRlZE1vZHVsZXNbbW9kdWxlXS5zd19wYXRjaGVzLmluc2VydChoYW5kbGUpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6cmVtb3ZlU29mdHdhcmVQYXRjaEZyb21JbnNlcnRlZE1vZHVsZXMoCisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBmb3IgKGF1dG8mIG1vZHVsZSA6IG1JbnNlcnRlZE1vZHVsZXMpIHsKKyAgICAgICAgbW9kdWxlLnNlY29uZC5zd19wYXRjaGVzLmVyYXNlKGhhbmRsZSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGF0Y2hQYW5lbDo6ZHVtcChpbnQgZmQpIGNvbnN0Cit7CisgICAgU3RyaW5nOCBwYXRjaFBhbmVsRHVtcDsKKyAgICBjb25zdCBjaGFyICppbmRlbnQgPSAiICAiOworCisgICAgYm9vbCBoZWFkZXJQcmludGVkID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvJiBpdGVyIDogbVBhdGNoZXMpIHsKKyAgICAgICAgaWYgKCFoZWFkZXJQcmludGVkKSB7CisgICAgICAgICAgICBwYXRjaFBhbmVsRHVtcCArPSAiXG5QYXRjaGVzOlxuIjsKKyAgICAgICAgICAgIGhlYWRlclByaW50ZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIHBhdGNoUGFuZWxEdW1wLmFwcGVuZEZvcm1hdCgiJXMlc1xuIiwgaW5kZW50LCBpdGVyLnNlY29uZC5kdW1wKGl0ZXIuZmlyc3QpLnN0cmluZygpKTsKICAgICB9CiAKLSAgICBBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlID0gYXVkaW9mbGluZ2VyLT5tQXVkaW9Id0RldnMudmFsdWVBdChpbmRleCk7Ci0gICAgcmV0dXJuIGF1ZGlvSHdEZXZpY2UtPmh3RGV2aWNlKCktPnNldEF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIGhlYWRlclByaW50ZWQgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIG1vZHVsZSA6IG1JbnNlcnRlZE1vZHVsZXMpIHsKKyAgICAgICAgaWYgKCFtb2R1bGUuc2Vjb25kLnN0cmVhbXMuZW1wdHkoKSB8fCAhbW9kdWxlLnNlY29uZC5zd19wYXRjaGVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIGlmICghaGVhZGVyUHJpbnRlZCkgeworICAgICAgICAgICAgICAgIHBhdGNoUGFuZWxEdW1wICs9ICJcblRyYWNrZWQgaW5zZXJ0ZWQgbW9kdWxlczpcbiI7CisgICAgICAgICAgICAgICAgaGVhZGVyUHJpbnRlZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTdHJpbmc4IG1vZHVsZUR1bXAgPSBTdHJpbmc4Ojpmb3JtYXQoIk1vZHVsZSAlZDogSS9PIGhhbmRsZXM6ICIsIG1vZHVsZS5maXJzdCk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN0cmVhbSA6IG1vZHVsZS5zZWNvbmQuc3RyZWFtcykgeworICAgICAgICAgICAgICAgIG1vZHVsZUR1bXAuYXBwZW5kRm9ybWF0KCIlZCAiLCBzdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbW9kdWxlRHVtcC5hcHBlbmQoIjsgU1cgUGF0Y2hlczogIik7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhdGNoIDogbW9kdWxlLnNlY29uZC5zd19wYXRjaGVzKSB7CisgICAgICAgICAgICAgICAgbW9kdWxlRHVtcC5hcHBlbmRGb3JtYXQoIiVkICIsIHBhdGNoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBhdGNoUGFuZWxEdW1wLmFwcGVuZEZvcm1hdCgiJXMlc1xuIiwgaW5kZW50LCBtb2R1bGVEdW1wLnN0cmluZygpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghcGF0Y2hQYW5lbER1bXAuaXNFbXB0eSgpKSB7CisgICAgICAgIHdyaXRlKGZkLCBwYXRjaFBhbmVsRHVtcC5zdHJpbmcoKSwgcGF0Y2hQYW5lbER1bXAuc2l6ZSgpKTsKKyAgICB9CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmggYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGF0Y2hQYW5lbC5oCmluZGV4IGQzN2MwZDMuLjg5ZDRlYjEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QYXRjaFBhbmVsLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1BhdGNoUGFuZWwuaApAQCAtMTksMTMgKzE5LDMzIEBACiAgICAgI2Vycm9yIFRoaXMgaGVhZGVyIGZpbGUgc2hvdWxkIG9ubHkgYmUgaW5jbHVkZWQgZnJvbSBBdWRpb0ZsaW5nZXIuaAogI2VuZGlmCiAKLWNsYXNzIFBhdGNoUGFuZWwgOiBwdWJsaWMgUmVmQmFzZSB7CisKKy8vIFBhdGNoUGFuZWwgaXMgY29uY2VhbGVkIHdpdGhpbiBBdWRpb0ZsaW5nZXIsIHRoZWlyIGxpZmV0aW1lcyBhcmUgdGhlIHNhbWUuCitjbGFzcyBQYXRjaFBhbmVsIHsKIHB1YmxpYzoKKyAgICBjbGFzcyBTb2Z0d2FyZVBhdGNoIHsKKyAgICAgIHB1YmxpYzoKKyAgICAgICAgU29mdHdhcmVQYXRjaChjb25zdCBQYXRjaFBhbmVsICZwYXRjaFBhbmVsLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBwbGF5YmFja1RocmVhZEhhbmRsZSwgYXVkaW9faW9faGFuZGxlX3QgcmVjb3JkVGhyZWFkSGFuZGxlKQorICAgICAgICAgICAgICAgIDogbVBhdGNoUGFuZWwocGF0Y2hQYW5lbCksIG1QYXRjaEhhbmRsZShwYXRjaEhhbmRsZSksCisgICAgICAgICAgICAgICAgICBtUGxheWJhY2tUaHJlYWRIYW5kbGUocGxheWJhY2tUaHJlYWRIYW5kbGUpLAorICAgICAgICAgICAgICAgICAgbVJlY29yZFRocmVhZEhhbmRsZShyZWNvcmRUaHJlYWRIYW5kbGUpIHt9CisgICAgICAgIFNvZnR3YXJlUGF0Y2goY29uc3QgU29mdHdhcmVQYXRjaCYpID0gZGVmYXVsdDsKKyAgICAgICAgU29mdHdhcmVQYXRjaCYgb3BlcmF0b3I9KGNvbnN0IFNvZnR3YXJlUGF0Y2gmKSA9IGRlZmF1bHQ7CiAKLSAgICBjbGFzcyBQYXRjaDsKKyAgICAgICAgLy8gTXVzdCBiZSBjYWxsZWQgdW5kZXIgQXVkaW9GbGluZ2VyOjptTG9jaworICAgICAgICBzdGF0dXNfdCBnZXRMYXRlbmN5TXNfbChkb3VibGUgKmxhdGVuY3lNcykgY29uc3Q7CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbVBhdGNoSGFuZGxlOyB9OworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRQbGF5YmFja1RocmVhZEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1QbGF5YmFja1RocmVhZEhhbmRsZTsgfTsKKyAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZ2V0UmVjb3JkVGhyZWFkSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbVJlY29yZFRocmVhZEhhbmRsZTsgfTsKKyAgICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IFBhdGNoUGFuZWwgJm1QYXRjaFBhbmVsOworICAgICAgICBjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGU7CisgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IG1QbGF5YmFja1RocmVhZEhhbmRsZTsKKyAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgbVJlY29yZFRocmVhZEhhbmRsZTsKKyAgICB9OwogCi0gICAgZXhwbGljaXQgUGF0Y2hQYW5lbChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIpOwotICAgIHZpcnR1YWwgflBhdGNoUGFuZWwoKTsKKyAgICBleHBsaWNpdCBQYXRjaFBhbmVsKEF1ZGlvRmxpbmdlciogYXVkaW9GbGluZ2VyKSA6IG1BdWRpb0ZsaW5nZXIoKmF1ZGlvRmxpbmdlcikge30KIAogICAgIC8qIExpc3QgY29ubmVjdGVkIGF1ZGlvIHBvcnRzIGFuZCB0aGVpciBhdHRyaWJ1dGVzICovCiAgICAgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHModW5zaWduZWQgaW50ICpudW1fcG9ydHMsCkBAIC00NSw0NiArNjUsMTk3IEBACiAgICAgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoZXMpOwogCi0gICAgLyogU2V0IGF1ZGlvIHBvcnQgY29uZmlndXJhdGlvbiAqLwotICAgIHN0YXR1c190IHNldEF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisgICAgLy8gUmV0cmlldmVzIGFsbCBjdXJyZW50bHkgZXN0cmFibGlzaGVkIHNvZnR3YXJlIHBhdGNoZXMgZm9yIGEgc3RyZWFtCisgICAgLy8gb3BlbmVkIG9uIGFuIGludGVybWVkaWF0ZSBtb2R1bGUuCisgICAgc3RhdHVzX3QgZ2V0RG93bnN0cmVhbVNvZnR3YXJlUGF0Y2hlcyhhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0sCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTb2Z0d2FyZVBhdGNoPiAqcGF0Y2hlcykgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKFBhdGNoICpwYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqYXVkaW9QYXRjaCk7Ci0gICAgdm9pZCBjbGVhclBhdGNoQ29ubmVjdGlvbnMoUGF0Y2ggKnBhdGNoKTsKKyAgICAvLyBOb3RpZmllcyBwYXRjaCBwYW5lbCBhYm91dCBhbGwgb3BlbmVkIGFuZCBjbG9zZWQgc3RyZWFtcy4KKyAgICB2b2lkIG5vdGlmeVN0cmVhbU9wZW5lZChBdWRpb0h3RGV2aWNlICphdWRpb0h3RGV2aWNlLCBhdWRpb19pb19oYW5kbGVfdCBzdHJlYW0pOworICAgIHZvaWQgbm90aWZ5U3RyZWFtQ2xvc2VkKGF1ZGlvX2lvX2hhbmRsZV90IHN0cmVhbSk7CiAKLSAgICBjbGFzcyBQYXRjaCB7CisgICAgdm9pZCBkdW1wKGludCBmZCkgY29uc3Q7CisKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBUaHJlYWRUeXBlLCB0eXBlbmFtZSBUcmFja1R5cGU+CisgICAgY2xhc3MgRW5kcG9pbnQgZmluYWwgewogICAgIHB1YmxpYzoKLSAgICAgICAgZXhwbGljaXQgUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCkgOgotICAgICAgICAgICAgbUF1ZGlvUGF0Y2goKnBhdGNoKSwgbUhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSksCi0gICAgICAgICAgICBtSGFsSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwgbVJlY29yZFBhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwKLSAgICAgICAgICAgIG1QbGF5YmFja1BhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7fQotICAgICAgICB+UGF0Y2goKSB7fQorICAgICAgICBFbmRwb2ludCgpID0gZGVmYXVsdDsKKyAgICAgICAgRW5kcG9pbnQoY29uc3QgRW5kcG9pbnQmKSA9IGRlbGV0ZTsKKyAgICAgICAgRW5kcG9pbnQmIG9wZXJhdG9yPShjb25zdCBFbmRwb2ludCYgb3RoZXIpIG5vZXhjZXB0IHsKKyAgICAgICAgICAgIG1UaHJlYWQgPSBvdGhlci5tVGhyZWFkOworICAgICAgICAgICAgbUNsb3NlVGhyZWFkID0gb3RoZXIubUNsb3NlVGhyZWFkOworICAgICAgICAgICAgbUhhbmRsZSA9IG90aGVyLm1IYW5kbGU7CisgICAgICAgICAgICBtVHJhY2sgPSBvdGhlci5tVHJhY2s7CisgICAgICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICAgIH0KKyAgICAgICAgRW5kcG9pbnQoRW5kcG9pbnQmJiBvdGhlcikgbm9leGNlcHQgeyBzd2FwKG90aGVyKTsgfQorICAgICAgICBFbmRwb2ludCYgb3BlcmF0b3I9KEVuZHBvaW50JiYgb3RoZXIpIG5vZXhjZXB0IHsKKyAgICAgICAgICAgIHN3YXAob3RoZXIpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIH5FbmRwb2ludCgpIHsKKyAgICAgICAgICAgIEFMT0dFX0lGKG1IYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICJBIG5vbiBlbXB0eSBQYXRjaCBFbmRwb2ludCBsZWFrZWQsIGhhbmRsZSAlZCIsIG1IYW5kbGUpOworICAgICAgICB9CiAKLSAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoICAgICAgICAgICAgICBtQXVkaW9QYXRjaDsKLSAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgICAgICAgICAgICBtSGFuZGxlOwotICAgICAgICAvLyBoYW5kbGUgZm9yIGF1ZGlvIEhBTCBwYXRjaCBoYW5kbGUgcHJlc2VudCBvbmx5IHdoZW4gdGhlIGF1ZGlvIEhBTCB2ZXJzaW9uIGlzID49IDMuMAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICAgIG1IYWxIYW5kbGU7Ci0gICAgICAgIC8vIGJlbG93IG1lbWJlcnMgYXJlIHVzZWQgYnkgYSBzb2Z0d2FyZSBhdWRpbyBwYXRjaCBjb25uZWN0aW5nIGEgc291cmNlIGRldmljZSBmcm9tIGEKLSAgICAgICAgLy8gZ2l2ZW4gYXVkaW8gSFcgbW9kdWxlIHRvIGEgc2luayBkZXZpY2Ugb24gYW4gb3RoZXIgYXVkaW8gSFcgbW9kdWxlLgotICAgICAgICAvLyBwbGF5YmFjayB0aHJlYWQgY3JlYXRlZCBieSBjcmVhdGVBdWRpb1BhdGNoKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyUGF0Y2hDb25uZWN0aW9ucygpIGlmCi0gICAgICAgIC8vIG5vIGV4aXN0aW5nIHBsYXliYWNrIHRocmVhZCBjYW4gYmUgdXNlZCBieSB0aGUgc29mdHdhcmUgcGF0Y2gKLSAgICAgICAgc3A8UGxheWJhY2tUaHJlYWQ+ICAgICAgICAgICAgICBtUGxheWJhY2tUaHJlYWQ7Ci0gICAgICAgIC8vIGF1ZGlvIHRyYWNrIGNyZWF0ZWQgYnkgY3JlYXRlUGF0Y2hDb25uZWN0aW9ucygpIGFuZCByZWxlYXNlZCBieSBjbGVhclBhdGNoQ29ubmVjdGlvbnMoKQotICAgICAgICBzcDxQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjaz4gIG1QYXRjaFRyYWNrOwotICAgICAgICAvLyByZWNvcmQgdGhyZWFkIGNyZWF0ZWQgYnkgY3JlYXRlQXVkaW9QYXRjaCgpIGFuZCByZWxlYXNlZCBieSBjbGVhclBhdGNoQ29ubmVjdGlvbnMoKQotICAgICAgICBzcDxSZWNvcmRUaHJlYWQ+ICAgICAgICAgICAgICAgIG1SZWNvcmRUaHJlYWQ7Ci0gICAgICAgIC8vIGF1ZGlvIHJlY29yZCBjcmVhdGVkIGJ5IGNyZWF0ZVBhdGNoQ29ubmVjdGlvbnMoKSBhbmQgcmVsZWFzZWQgYnkgY2xlYXJQYXRjaENvbm5lY3Rpb25zKCkKLSAgICAgICAgc3A8UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZD4gICBtUGF0Y2hSZWNvcmQ7Ci0gICAgICAgIC8vIGhhbmRsZSBmb3IgYXVkaW8gcGF0Y2ggY29ubmVjdGluZyBzb3VyY2UgZGV2aWNlIHRvIHJlY29yZCB0aHJlYWQgaW5wdXQuCi0gICAgICAgIC8vIGNyZWF0ZWQgYnkgY3JlYXRlUGF0Y2hDb25uZWN0aW9ucygpIGFuZCByZWxlYXNlZCBieSBjbGVhclBhdGNoQ29ubmVjdGlvbnMoKQotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICAgIG1SZWNvcmRQYXRjaEhhbmRsZTsKLSAgICAgICAgLy8gaGFuZGxlIGZvciBhdWRpbyBwYXRjaCBjb25uZWN0aW5nIHBsYXliYWNrIHRocmVhZCBvdXRwdXQgdG8gc2luayBkZXZpY2UKLSAgICAgICAgLy8gY3JlYXRlZCBieSBjcmVhdGVQYXRjaENvbm5lY3Rpb25zKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyUGF0Y2hDb25uZWN0aW9ucygpCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICAgICAgICAgICAgbVBsYXliYWNrUGF0Y2hIYW5kbGU7CisgICAgICAgIHN0YXR1c190IGNoZWNrVHJhY2soVHJhY2tUeXBlICp0cmFja09yTnVsbCkgY29uc3QgeworICAgICAgICAgICAgaWYgKHRyYWNrT3JOdWxsID09IG51bGxwdHIpIHJldHVybiBOT19NRU1PUlk7CisgICAgICAgICAgICByZXR1cm4gdHJhY2tPck51bGwtPmluaXRDaGVjaygpOworICAgICAgICB9CisgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIG1IYW5kbGU7IH0KKyAgICAgICAgc3A8VGhyZWFkVHlwZT4gdGhyZWFkKCkgY29uc3QgeyByZXR1cm4gbVRocmVhZDsgfQorICAgICAgICBzcDxUcmFja1R5cGU+IHRyYWNrKCkgY29uc3QgeyByZXR1cm4gbVRyYWNrOyB9CisgICAgICAgIHNwPGNvbnN0IFRocmVhZFR5cGU+IGNvbnN0X3RocmVhZCgpIGNvbnN0IHsgcmV0dXJuIG1UaHJlYWQ7IH0KKyAgICAgICAgc3A8Y29uc3QgVHJhY2tUeXBlPiBjb25zdF90cmFjaygpIGNvbnN0IHsgcmV0dXJuIG1UcmFjazsgfQogCisgICAgICAgIHZvaWQgY2xvc2VDb25uZWN0aW9ucyhQYXRjaFBhbmVsICpwYW5lbCkgeworICAgICAgICAgICAgaWYgKG1IYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICBwYW5lbC0+cmVsZWFzZUF1ZGlvUGF0Y2gobUhhbmRsZSk7CisgICAgICAgICAgICAgICAgbUhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1UaHJlYWQgIT0gMCkgeworICAgICAgICAgICAgICAgIGlmIChtVHJhY2sgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtVGhyZWFkLT5kZWxldGVQYXRjaFRyYWNrKG1UcmFjayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtQ2xvc2VUaHJlYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcGFuZWwtPm1BdWRpb0ZsaW5nZXIuY2xvc2VUaHJlYWRJbnRlcm5hbF9sKG1UaHJlYWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCogaGFuZGxlUHRyKCkgeyByZXR1cm4gJm1IYW5kbGU7IH0KKyAgICAgICAgdm9pZCBzZXRUaHJlYWQoY29uc3Qgc3A8VGhyZWFkVHlwZT4mIHRocmVhZCwgYm9vbCBjbG9zZVRocmVhZCA9IHRydWUpIHsKKyAgICAgICAgICAgIG1UaHJlYWQgPSB0aHJlYWQ7CisgICAgICAgICAgICBtQ2xvc2VUaHJlYWQgPSBjbG9zZVRocmVhZDsKKyAgICAgICAgfQorICAgICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICAgICAgdm9pZCBzZXRUcmFja0FuZFBlZXIoY29uc3Qgc3A8VHJhY2tUeXBlPiYgdHJhY2ssIGNvbnN0IHNwPFQ+ICZwZWVyLCBib29sIGhvbGRSZWZlcmVuY2UpIHsKKyAgICAgICAgICAgIG1UcmFjayA9IHRyYWNrOworICAgICAgICAgICAgbVRocmVhZC0+YWRkUGF0Y2hUcmFjayhtVHJhY2spOworICAgICAgICAgICAgbVRyYWNrLT5zZXRQZWVyUHJveHkocGVlciwgaG9sZFJlZmVyZW5jZSk7CisgICAgICAgICAgICBtQ2xlYXJQZWVyUHJveHkgPSBob2xkUmVmZXJlbmNlOworICAgICAgICB9CisgICAgICAgIHZvaWQgY2xlYXJUcmFja1BlZXIoKSB7IGlmIChtQ2xlYXJQZWVyUHJveHkgJiYgbVRyYWNrKSBtVHJhY2stPmNsZWFyUGVlclByb3h5KCk7IH0KKyAgICAgICAgdm9pZCBzdG9wVHJhY2soKSB7IGlmIChtVHJhY2spIG1UcmFjay0+c3RvcCgpOyB9CisKKyAgICAgICAgdm9pZCBzd2FwKEVuZHBvaW50ICZvdGhlcikgbm9leGNlcHQgeworICAgICAgICAgICAgdXNpbmcgc3RkOjpzd2FwOworICAgICAgICAgICAgc3dhcChtVGhyZWFkLCBvdGhlci5tVGhyZWFkKTsKKyAgICAgICAgICAgIHN3YXAobUNsb3NlVGhyZWFkLCBvdGhlci5tQ2xvc2VUaHJlYWQpOworICAgICAgICAgICAgc3dhcChtQ2xlYXJQZWVyUHJveHksIG90aGVyLm1DbGVhclBlZXJQcm94eSk7CisgICAgICAgICAgICBzd2FwKG1IYW5kbGUsIG90aGVyLm1IYW5kbGUpOworICAgICAgICAgICAgc3dhcChtVHJhY2ssIG90aGVyLm1UcmFjayk7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgdm9pZCBzd2FwKEVuZHBvaW50ICZhLCBFbmRwb2ludCAmYikgbm9leGNlcHQgeworICAgICAgICAgICAgYS5zd2FwKGIpOworICAgICAgICB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBzcDxUaHJlYWRUeXBlPiBtVGhyZWFkOworICAgICAgICBib29sIG1DbG9zZVRocmVhZCA9IHRydWU7CisgICAgICAgIGJvb2wgbUNsZWFyUGVlclByb3h5ID0gdHJ1ZTsKKyAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbUhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgICAgICBzcDxUcmFja1R5cGU+IG1UcmFjazsKICAgICB9OwogCisgICAgY2xhc3MgUGF0Y2ggZmluYWwgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICZwYXRjaCkgOiBtQXVkaW9QYXRjaChwYXRjaCkge30KKyAgICAgICAgUGF0Y2goKSA9IGRlZmF1bHQ7CisgICAgICAgIH5QYXRjaCgpOworICAgICAgICBQYXRjaChjb25zdCBQYXRjaCYgb3RoZXIpIG5vZXhjZXB0IHsKKyAgICAgICAgICAgIG1BdWRpb1BhdGNoID0gb3RoZXIubUF1ZGlvUGF0Y2g7CisgICAgICAgICAgICBtSGFsSGFuZGxlID0gb3RoZXIubUhhbEhhbmRsZTsKKyAgICAgICAgICAgIG1QbGF5YmFjayA9IG90aGVyLm1QbGF5YmFjazsKKyAgICAgICAgICAgIG1SZWNvcmQgPSBvdGhlci5tUmVjb3JkOworICAgICAgICAgICAgbVRocmVhZCA9IG90aGVyLm1UaHJlYWQ7CisgICAgICAgIH0KKyAgICAgICAgUGF0Y2goUGF0Y2gmJiBvdGhlcikgbm9leGNlcHQgeyBzd2FwKG90aGVyKTsgfQorICAgICAgICBQYXRjaCYgb3BlcmF0b3I9KFBhdGNoJiYgb3RoZXIpIG5vZXhjZXB0IHsKKyAgICAgICAgICAgIHN3YXAob3RoZXIpOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisKKyAgICAgICAgdm9pZCBzd2FwKFBhdGNoICZvdGhlcikgbm9leGNlcHQgeworICAgICAgICAgICAgdXNpbmcgc3RkOjpzd2FwOworICAgICAgICAgICAgc3dhcChtQXVkaW9QYXRjaCwgb3RoZXIubUF1ZGlvUGF0Y2gpOworICAgICAgICAgICAgc3dhcChtSGFsSGFuZGxlLCBvdGhlci5tSGFsSGFuZGxlKTsKKyAgICAgICAgICAgIHN3YXAobVBsYXliYWNrLCBvdGhlci5tUGxheWJhY2spOworICAgICAgICAgICAgc3dhcChtUmVjb3JkLCBvdGhlci5tUmVjb3JkKTsKKyAgICAgICAgICAgIHN3YXAobVRocmVhZCwgb3RoZXIubVRocmVhZCk7CisgICAgICAgIH0KKworICAgICAgICBmcmllbmQgdm9pZCBzd2FwKFBhdGNoICZhLCBQYXRjaCAmYikgbm9leGNlcHQgeworICAgICAgICAgICAgYS5zd2FwKGIpOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzX3QgY3JlYXRlQ29ubmVjdGlvbnMoUGF0Y2hQYW5lbCAqcGFuZWwpOworICAgICAgICB2b2lkIGNsZWFyQ29ubmVjdGlvbnMoUGF0Y2hQYW5lbCAqcGFuZWwpOworICAgICAgICBib29sIGlzU29mdHdhcmUoKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbVJlY29yZC5oYW5kbGUoKSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSB8fAorICAgICAgICAgICAgICAgICAgICBtUGxheWJhY2suaGFuZGxlKCkgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7IH0KKworICAgICAgICB2b2lkIHNldFRocmVhZChzcDxUaHJlYWRCYXNlPiB0aHJlYWQpIHsgbVRocmVhZCA9IHRocmVhZDsgfQorICAgICAgICB3cDxUaHJlYWRCYXNlPiB0aHJlYWQoKSBjb25zdCB7IHJldHVybiBtVGhyZWFkOyB9CisKKyAgICAgICAgLy8gcmV0dXJucyB0aGUgbGF0ZW5jeSBvZiB0aGUgcGF0Y2ggKGZyb20gcmVjb3JkIHRvIHBsYXliYWNrKS4KKyAgICAgICAgc3RhdHVzX3QgZ2V0TGF0ZW5jeU1zKGRvdWJsZSAqbGF0ZW5jeU1zKSBjb25zdDsKKworICAgICAgICBTdHJpbmc4IGR1bXAoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbXlIYW5kbGUpIGNvbnN0OworCisgICAgICAgIC8vIE5vdGUgdGhhdCBhdWRpb19wYXRjaDo6aWQgaXMgb25seSB1bmlxdWUgd2l0aGluIGEgSEFMIG1vZHVsZQorICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggICAgICAgICAgICAgIG1BdWRpb1BhdGNoOworICAgICAgICAvLyBoYW5kbGUgZm9yIGF1ZGlvIEhBTCBwYXRjaCBoYW5kbGUgcHJlc2VudCBvbmx5IHdoZW4gdGhlIGF1ZGlvIEhBTCB2ZXJzaW9uIGlzID49IDMuMAorICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICAgIG1IYWxIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgLy8gYmVsb3cgbWVtYmVycyBhcmUgdXNlZCBieSBhIHNvZnR3YXJlIGF1ZGlvIHBhdGNoIGNvbm5lY3RpbmcgYSBzb3VyY2UgZGV2aWNlIGZyb20gYQorICAgICAgICAvLyBnaXZlbiBhdWRpbyBIVyBtb2R1bGUgdG8gYSBzaW5rIGRldmljZSBvbiBhbiBvdGhlciBhdWRpbyBIVyBtb2R1bGUuCisgICAgICAgIC8vIHRoZSBvYmplY3RzIGFyZSBjcmVhdGVkIGJ5IGNyZWF0ZUNvbm5lY3Rpb25zKCkgYW5kIHJlbGVhc2VkIGJ5IGNsZWFyQ29ubmVjdGlvbnMoKQorICAgICAgICAvLyBwbGF5YmFjayB0aHJlYWQgaXMgY3JlYXRlZCBpZiBubyBleGlzdGluZyBwbGF5YmFjayB0aHJlYWQgY2FuIGJlIHVzZWQKKyAgICAgICAgLy8gY29ubmVjdHMgcGxheWJhY2sgdGhyZWFkIG91dHB1dCB0byBzaW5rIGRldmljZQorICAgICAgICBFbmRwb2ludDxQbGF5YmFja1RocmVhZCwgUGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s+IG1QbGF5YmFjazsKKyAgICAgICAgLy8gY29ubmVjdHMgc291cmNlIGRldmljZSB0byByZWNvcmQgdGhyZWFkIGlucHV0CisgICAgICAgIEVuZHBvaW50PFJlY29yZFRocmVhZCwgUmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZD4gbVJlY29yZDsKKworICAgICAgICB3cDxUaHJlYWRCYXNlPiBtVGhyZWFkOworICAgIH07CisKKyAgICAvLyBDYWxsIHdpdGggQXVkaW9GbGluZ2VyIG1Mb2NrIGhlbGQKKyAgICBzdGQ6Om1hcDxhdWRpb19wYXRjaF9oYW5kbGVfdCwgUGF0Y2g+JiBwYXRjaGVzX2woKSB7IHJldHVybiBtUGF0Y2hlczsgfQorCiBwcml2YXRlOgotICAgIGNvbnN0IHdwPEF1ZGlvRmxpbmdlcj4gICAgICBtQXVkaW9GbGluZ2VyOwotICAgIFNvcnRlZFZlY3RvciA8UGF0Y2ggKj4gICAgICBtUGF0Y2hlczsKKyAgICBBdWRpb0h3RGV2aWNlKiBmaW5kQXVkaW9Id0RldmljZUJ5TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGUpOworICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gZmluZEh3RGV2aWNlQnlNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSk7CisgICAgdm9pZCBhZGRTb2Z0d2FyZVBhdGNoVG9JbnNlcnRlZE1vZHVsZXMoCisgICAgICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworICAgIHZvaWQgcmVtb3ZlU29mdHdhcmVQYXRjaEZyb21JbnNlcnRlZE1vZHVsZXMoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICB2b2lkIGVyYXNlUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKworICAgIEF1ZGlvRmxpbmdlciAmbUF1ZGlvRmxpbmdlcjsKKyAgICBzdGQ6Om1hcDxhdWRpb19wYXRjaF9oYW5kbGVfdCwgUGF0Y2g+IG1QYXRjaGVzOworCisgICAgLy8gVGhpcyBtYXAgYWxsb3dzIGdvaW5nIGZyb20gYSB0aHJlYWQgdG8gImRvd25zdHJlYW0iIHNvZnR3YXJlIHBhdGNoZXMKKyAgICAvLyB3aGVuIGEgcHJvY2Vzc2luZyBtb2R1bGUgaW5zZXJ0ZWQgaW4gYmV0d2Vlbi4gRXhhbXBsZToKKyAgICAvLworICAgIC8vICBmcm9tIG1hcCB2YWx1ZS5zdHJlYW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcCBrZXkKKyAgICAvLyAgW01peGVyIHRocmVhZF0gLS0+IFtWaXJ0dWFsIG91dHB1dCBkZXZpY2VdIC0tPiBbUHJvY2Vzc2luZyBtb2R1bGVdIC0tLVwKKyAgICAvLyAgICAgICBbSGFyd2FyZSBtb2R1bGVdIDwtLSBbUGh5c2ljYWwgb3V0cHV0IGRldmljZV0gPC0tIFtTL1cgUGF0Y2hdIDwtLS8KKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIG1hcCB2YWx1ZS5zd19wYXRjaGVzCisgICAgLy8KKyAgICAvLyBUaGlzIGFsbG93cyB0aGUgbWl4ZXIgdGhyZWFkIHRvIGxvb2sgdXAgdGhlIHRocmVhZHMgb2YgdGhlIHNvZnR3YXJlIHBhdGNoCisgICAgLy8gZm9yIHByb3BhZ2F0aW5nIHRpbWluZyBpbmZvLCBwYXJhbWV0ZXJzLCBldGMuCisgICAgLy8KKyAgICAvLyBUaGUgY3VycmVudCBhc3N1bXB0aW9ucyBhcmU6CisgICAgLy8gICAxKSBUaGUgcHJvY2Vzc2luZyBtb2R1bGUgYWN0cyBhcyBhIG1peGVyIHdpdGggc2V2ZXJhbCBvdXRwdXRzIHdoaWNoCisgICAgLy8gICAgICByZXByZXNlbnQgZGlmZmVyZW50bHkgZG93bm1peGVkIGFuZCAvIG9yIGVuY29kZWQgdmVyc2lvbnMgb2YgdGhlIHNhbWUKKyAgICAvLyAgICAgIG1peGVkIHN0cmVhbS4gVGhlcmUgaXMgbm8gMToxIGNvcnJlc3BvbmRlbmNlIGJldHdlZW4gdGhlIGlucHV0IHN0cmVhbXMKKyAgICAvLyAgICAgIGFuZCB0aGUgc29mdHdhcmUgcGF0Y2hlcywgYnV0IHJhdGhlciBhIE46TiBjb3JyZXNwb25kZW5jZSBiZXR3ZWVuCisgICAgLy8gICAgICBhIGdyb3VwIG9mIHN0cmVhbXMgYW5kIGEgZ3JvdXAgb2YgcGF0Y2hlcy4KKyAgICAvLyAgIDIpIFRoZXJlIGFyZSBvbmx5IGEgY291cGxlIG9mIGluc2VydGVkIHByb2Nlc3NpbmcgbW9kdWxlcyBpbiB0aGUgc3lzdGVtLAorICAgIC8vICAgICAgc28gd2hlbiBsb29raW5nIGZvciBhIHN0cmVhbSBvciBwYXRjaCBoYW5kbGUgd2UgY2FuIGl0ZXJhdGUgb3ZlcgorICAgIC8vICAgICAgYWxsIG1vZHVsZXMuCisgICAgc3RydWN0IE1vZHVsZUNvbm5lY3Rpb25zIHsKKyAgICAgICAgc3RkOjpzZXQ8YXVkaW9faW9faGFuZGxlX3Q+IHN0cmVhbXM7CisgICAgICAgIHN0ZDo6c2V0PGF1ZGlvX3BhdGNoX2hhbmRsZV90PiBzd19wYXRjaGVzOworICAgIH07CisgICAgc3RkOjptYXA8YXVkaW9fbW9kdWxlX2hhbmRsZV90LCBNb2R1bGVDb25uZWN0aW9ucz4gbUluc2VydGVkTW9kdWxlczsKIH07CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUGxheWJhY2tUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCmluZGV4IGE3OGJlOTkuLjFmZjAzYzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9QbGF5YmFja1RyYWNrcy5oCkBAIC0xOSw2ICsxOSw0MiBAQAogICAgICNlcnJvciBUaGlzIGhlYWRlciBmaWxlIHNob3VsZCBvbmx5IGJlIGluY2x1ZGVkIGZyb20gQXVkaW9GbGluZ2VyLmgKICNlbmRpZgogCisvLyBDaGVja3MgYW5kIG1vbml0b3JzIE9QX1BMQVlfQVVESU8KK2NsYXNzIE9wUGxheUF1ZGlvTW9uaXRvciA6IHB1YmxpYyBSZWZCYXNlIHsKK3B1YmxpYzoKKyAgICB+T3BQbGF5QXVkaW9Nb25pdG9yKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBoYXNPcFBsYXlBdWRpbygpIGNvbnN0OworCisgICAgc3RhdGljIHNwPE9wUGxheUF1ZGlvTW9uaXRvcj4gY3JlYXRlSWZOZWVkZWQoCisgICAgICAgICAgICB1aWRfdCB1aWQsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwgaW50IGlkLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpOworCitwcml2YXRlOgorICAgIE9wUGxheUF1ZGlvTW9uaXRvcih1aWRfdCB1aWQsIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsIGludCBpZCk7CisgICAgdm9pZCBvbkZpcnN0UmVmKCkgb3ZlcnJpZGU7CisgICAgc3RhdGljIHZvaWQgZ2V0UGFja2FnZXNGb3JVaWQodWlkX3QgdWlkLCBWZWN0b3I8U3RyaW5nMTY+JiBwYWNrYWdlcyk7CisKKyAgICBBcHBPcHNNYW5hZ2VyIG1BcHBPcHNNYW5hZ2VyOworCisgICAgY2xhc3MgUGxheUF1ZGlvT3BDYWxsYmFjayA6IHB1YmxpYyBCbkFwcE9wc0NhbGxiYWNrIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IFBsYXlBdWRpb09wQ2FsbGJhY2soY29uc3Qgd3A8T3BQbGF5QXVkaW9Nb25pdG9yPiYgbW9uaXRvcik7CisgICAgICAgIHZvaWQgb3BDaGFuZ2VkKGludDMyX3Qgb3AsIGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSkgb3ZlcnJpZGU7CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCB3cDxPcFBsYXlBdWRpb01vbml0b3I+IG1Nb25pdG9yOworICAgIH07CisKKyAgICBzcDxQbGF5QXVkaW9PcENhbGxiYWNrPiBtT3BDYWxsYmFjazsKKyAgICAvLyBjYWxsZWQgYnkgUGxheUF1ZGlvT3BDYWxsYmFjayB3aGVuIE9QX1BMQVlfQVVESU8gaXMgdXBkYXRlZCBpbiBBcHBPcCBjYWxsYmFjaworICAgIHZvaWQgY2hlY2tQbGF5QXVkaW9Gb3JVc2FnZSgpOworCisgICAgc3RkOjphdG9taWNfYm9vbCBtSGFzT3BQbGF5QXVkaW87CisgICAgVmVjdG9yPFN0cmluZzE2PiBtUGFja2FnZXM7CisgICAgY29uc3QgdWlkX3QgbVVpZDsKKyAgICBjb25zdCBpbnQzMl90IG1Vc2FnZTsgLy8gb24gcHVycG9zZSBub3QgYXVkaW9fdXNhZ2VfdCBiZWNhdXNlIGFsd2F5cyBjaGVja2VkIGluIGFwcE9wcyBhcyBpbnQzMl90CisgICAgY29uc3QgaW50IG1JZDsgLy8gZm9yIGxvZ2dpbmcgcHVycG9zZXMgb25seQorfTsKKwogLy8gcGxheWJhY2sgdHJhY2sKIGNsYXNzIFRyYWNrIDogcHVibGljIFRyYWNrQmFzZSwgcHVibGljIFZvbHVtZVByb3ZpZGVyIHsKIHB1YmxpYzoKQEAgLTM0LDI5ICs3MCwyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY3JlYXRvclBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKiBkZWZhdWx0IGJlaGF2aW91ciBpcyB0byBzdGFydCB3aGVuIHRoZXJlIGFyZSBhcyBtYW55IGZyYW1lcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogcmVhZHkgYXMgcG9zc2libGUgKGFrYS4gQnVmZmVyIGlzIGZ1bGwpLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudFRvQmVSZWFkeSA9IFNJWkVfTUFYKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5UcmFjaygpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCkgY29uc3Q7CiAKLSAgICBzdGF0aWMgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50ID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiA9IEFVRElPX1NFU1NJT05fTk9ORSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50ID0gQXVkaW9TeXN0ZW06OlNZTkNfRVZFTlRfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiA9IEFVRElPX1NFU1NJT05fTk9ORSk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICBzdG9wKCk7CiAgICAgICAgICAgICB2b2lkICAgICAgICBwYXVzZSgpOwogCiAgICAgICAgICAgICB2b2lkICAgICAgICBmbHVzaCgpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgZGVzdHJveSgpOwotICAgICAgICAgICAgaW50ICAgICAgICAgbmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9Ci0gICAgICAgICAgICB2b2lkICAgICAgICBzZXROYW1lKGludCBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtTmFtZSA+PSAwICYmIG5hbWUgPj0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICIlcyBib3RoIG9sZCBuYW1lICVkIGFuZCBuZXcgbmFtZSAlZCBhcmUgdmFsaWQiLCBfX2Z1bmNfXywgbU5hbWUsIG5hbWUpOwotICAgICAgICAgICAgICAgIG1OYW1lID0gbmFtZTsKLSAgICAgICAgICAgIH0KIAogICAgIHZpcnR1YWwgdWludDMyX3QgICAgc2FtcGxlUmF0ZSgpIGNvbnN0OwogCkBAIC02NSwxMiArOTgsMTUgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzT2ZmbG9hZGVkKCkgY29uc3QKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDA7IH0KLSAgICAgICAgICAgIGJvb2wgICAgICAgIGlzRGlyZWN0KCkgY29uc3QgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgIT0gMDsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNEaXJlY3QoKSBjb25zdCBvdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwOyB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc09mZmxvYWRlZE9yRGlyZWN0KCkgY29uc3QgeyByZXR1cm4gKG1GbGFncwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYgKEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSkgIT0gMDsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNTdGF0aWMoKSBjb25zdCB7IHJldHVybiAgbVNoYXJlZEJ1ZmZlci5nZXQoKSAhPSBudWxscHRyOyB9CiAKICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKTsKICAgICAgICAgICAgIHN0YXR1c190ICAgIGF0dGFjaEF1eEVmZmVjdChpbnQgRWZmZWN0SWQpOwogICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0QXV4QnVmZmVyKGludCBFZmZlY3RJZCwgaW50MzJfdCAqYnVmZmVyKTsKICAgICAgICAgICAgIGludDMyX3QgICAgICphdXhCdWZmZXIoKSBjb25zdCB7IHJldHVybiBtQXV4QnVmZmVyOyB9CkBAIC04Nyw2ICsxMjMsMTAgQEAKIAogICAgIHZpcnR1YWwgYm9vbCAgICAgICAgaXNGYXN0VHJhY2soKSBjb25zdCB7IHJldHVybiAobUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCkgIT0gMDsgfQogCisgICAgICAgICAgICBkb3VibGUgICAgICBidWZmZXJMYXRlbmN5TXMoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzU3RhdGljKCkgPyAwLiA6IFRyYWNrQmFzZTo6YnVmZmVyTGF0ZW5jeU1zKCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKIC8vIGltcGxlbWVudCB2b2x1bWUgaGFuZGxpbmcuCiAgICAgbWVkaWE6OlZvbHVtZVNoYXBlcjo6U3RhdHVzIGFwcGx5Vm9sdW1lU2hhcGVyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxtZWRpYTo6Vm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uPiYgY29uZmlndXJhdGlvbiwKQEAgLTExMSw2ICsxNTEsMjYgQEAKICAgICAvKiogQ29weSB0aGUgdHJhY2sgbWV0YWRhdGEgaW4gdGhlIHByb3ZpZGVkIGl0ZXJhdG9yLiBUaHJlYWQgc2FmZS4gKi8KICAgICB2aXJ0dWFsIHZvaWQgICAgY29weU1ldGFkYXRhVG8oTWV0YWRhdGFJbnNlcnRlciYgYmFja0luc2VydGVyKSBjb25zdDsKIAorICAgICAgICAgICAgLyoqIFJldHVybiBoYXB0aWMgcGxheWJhY2sgb2YgdGhlIHRyYWNrIGlzIGVuYWJsZWQgb3Igbm90LCB1c2VkIGluIG1peGVyLiAqLworICAgICAgICAgICAgYm9vbCAgICBnZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKSBjb25zdCB7IHJldHVybiBtSGFwdGljUGxheWJhY2tFbmFibGVkOyB9CisgICAgICAgICAgICAvKiogU2V0IGhhcHRpYyBwbGF5YmFjayBvZiB0aGUgdHJhY2sgaXMgZW5hYmxlZCBvciBub3QsIHNob3VsZCBiZQorICAgICAgICAgICAgICogIHNldCBhZnRlciBxdWVyeSBvciBnZXQgY2FsbGJhY2sgZnJvbSB2aWJyYXRvciBzZXJ2aWNlICovCisgICAgICAgICAgICB2b2lkICAgIHNldEhhcHRpY1BsYXliYWNrRW5hYmxlZChib29sIGhhcHRpY1BsYXliYWNrRW5hYmxlZCkgeworICAgICAgICAgICAgICAgIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBoYXB0aWNQbGF5YmFja0VuYWJsZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiogUmV0dXJuIGF0IHdoYXQgaW50ZW5zaXR5IHRvIHBsYXkgaGFwdGljcywgdXNlZCBpbiBtaXhlci4gKi8KKyAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OmhhcHRpY19pbnRlbnNpdHlfdCBnZXRIYXB0aWNJbnRlbnNpdHkoKSBjb25zdCB7IHJldHVybiBtSGFwdGljSW50ZW5zaXR5OyB9CisgICAgICAgICAgICAvKiogU2V0IGludGVuc2l0eSBvZiBoYXB0aWMgcGxheWJhY2ssIHNob3VsZCBiZSBzZXQgYWZ0ZXIgcXVlcnlpbmcgdmlicmF0b3Igc2VydmljZS4gKi8KKyAgICAgICAgICAgIHZvaWQgICAgc2V0SGFwdGljSW50ZW5zaXR5KEF1ZGlvTWl4ZXI6OmhhcHRpY19pbnRlbnNpdHlfdCBoYXB0aWNJbnRlbnNpdHkpIHsKKyAgICAgICAgICAgICAgICBpZiAoQXVkaW9NaXhlcjo6aXNWYWxpZEhhcHRpY0ludGVuc2l0eShoYXB0aWNJbnRlbnNpdHkpKSB7CisgICAgICAgICAgICAgICAgICAgIG1IYXB0aWNJbnRlbnNpdHkgPSBoYXB0aWNJbnRlbnNpdHk7CisgICAgICAgICAgICAgICAgICAgIHNldEhhcHRpY1BsYXliYWNrRW5hYmxlZChtSGFwdGljSW50ZW5zaXR5ICE9IEF1ZGlvTWl4ZXI6OkhBUFRJQ19TQ0FMRV9NVVRFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxvczo6RXh0ZXJuYWxWaWJyYXRpb24+IGdldEV4dGVybmFsVmlicmF0aW9uKCkgY29uc3QgeyByZXR1cm4gbUV4dGVybmFsVmlicmF0aW9uOyB9CisKKyAgICAgICAgICAgIHZvaWQgICAgc2V0VGVlUGF0Y2hlcyhUZWVQYXRjaGVzIHRlZVBhdGNoZXMpOworCiBwcm90ZWN0ZWQ6CiAgICAgLy8gZm9yIG51bWVyb3VzCiAgICAgZnJpZW5kIGNsYXNzIFBsYXliYWNrVGhyZWFkOwpAQCAtMTIxLDggKzE4MSw4IEBACiAgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFRyYWNrKTsKIAogICAgIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCi0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKTsKLSAgICAvLyByZWxlYXNlQnVmZmVyKCkgbm90IG92ZXJyaWRkZW4KKyAgICBzdGF0dXNfdCBnZXROZXh0QnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKSBvdmVycmlkZTsKKyAgICB2b2lkIHJlbGVhc2VCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpIG92ZXJyaWRlOwogCiAgICAgLy8gRXh0ZW5kZWRBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQogICAgIHZpcnR1YWwgc2l6ZV90IGZyYW1lc1JlYWR5KCkgY29uc3Q7CkBAIC0xNDAsNyArMjAwLDcgQEAKICAgICBib29sIGlzUmVzdW1lUGVuZGluZygpOwogICAgIHZvaWQgcmVzdW1lQWNrKCk7CiAgICAgdm9pZCB1cGRhdGVUcmFja0ZyYW1lSW5mbyhpbnQ2NF90IHRyYWNrRnJhbWVzUmVsZWFzZWQsIGludDY0X3Qgc2lua0ZyYW1lc1dyaXR0ZW4sCi0gICAgICAgICAgICBjb25zdCBFeHRlbmRlZFRpbWVzdGFtcCAmdGltZVN0YW1wKTsKKyAgICAgICAgICAgIHVpbnQzMl90IGhhbFNhbXBsZVJhdGUsIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lU3RhbXApOwogCiAgICAgc3A8SU1lbW9yeT4gc2hhcmVkQnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbVNoYXJlZEJ1ZmZlcjsgfQogCkBAIC0xNTksNiArMjE5LDEwIEBACiAKICAgICBpbnQgZmFzdEluZGV4KCkgY29uc3QgeyByZXR1cm4gbUZhc3RJbmRleDsgfQogCisgICAgYm9vbCBpc1BsYXliYWNrUmVzdHJpY3RlZCgpIGNvbnN0IHsKKyAgICAgICAgLy8gVGhlIG1vbml0b3IgaXMgb25seSBjcmVhdGVkIGZvciB0cmFja3MgdGhhdCBjYW4gYmUgc2lsZW5jZWQuCisgICAgICAgIHJldHVybiBtT3BQbGF5QXVkaW9Nb25pdG9yID8gIW1PcFBsYXlBdWRpb01vbml0b3ItPmhhc09wUGxheUF1ZGlvKCkgOiBmYWxzZTsgfQorCiBwcm90ZWN0ZWQ6CiAKICAgICAvLyBGSUxMRUQgc3RhdGUgaXMgdXNlZCBmb3Igc3VwcHJlc3Npbmcgdm9sdW1lIHJhbXAgYXQgYmVnaW4gb2YgcGxheWluZwpAQCAtMTcxLDcgKzIzNSw2IEBACiAKICAgICBib29sICAgICAgICAgICAgICAgIG1SZXNldERvbmU7CiAgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtVHlwZTsKLSAgICBpbnQgICAgICAgICAgICAgICAgIG1OYW1lOwogICAgIGVmZmVjdF9idWZmZXJfdCAgICAgKm1NYWluQnVmZmVyOwogCiAgICAgaW50MzJfdCAgICAgICAgICAgICAqbUF1eEJ1ZmZlcjsKQEAgLTE4OCw3ICsyNTEsMzEgQEAKIAogICAgIHNwPG1lZGlhOjpWb2x1bWVIYW5kbGVyPiAgbVZvbHVtZUhhbmRsZXI7IC8vIGhhbmRsZXMgbXVsdGlwbGUgVm9sdW1lU2hhcGVyIGNvbmZpZ3MgYW5kIG9wZXJhdGlvbnMKIAorICAgIHNwPE9wUGxheUF1ZGlvTW9uaXRvcj4gIG1PcFBsYXlBdWRpb01vbml0b3I7CisKKyAgICBib29sICAgICAgICAgICAgICAgIG1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBmYWxzZTsgLy8gaW5kaWNhdGVzIGhhcHRpYyBwbGF5YmFjayBlbmFibGVkIG9yIG5vdAorICAgIC8vIGludGVuc2l0eSB0byBwbGF5IGhhcHRpYyBkYXRhCisgICAgQXVkaW9NaXhlcjo6aGFwdGljX2ludGVuc2l0eV90IG1IYXB0aWNJbnRlbnNpdHkgPSBBdWRpb01peGVyOjpIQVBUSUNfU0NBTEVfTVVURTsKKyAgICBjbGFzcyBBdWRpb1ZpYnJhdGlvbkNvbnRyb2xsZXIgOiBwdWJsaWMgb3M6OkJuRXh0ZXJuYWxWaWJyYXRpb25Db250cm9sbGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IEF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcihUcmFjayogdHJhY2spIDogbVRyYWNrKHRyYWNrKSB7fQorICAgICAgICBiaW5kZXI6OlN0YXR1cyBtdXRlKC8qb3V0Ki8gYm9vbCAqcmV0KSBvdmVycmlkZTsKKyAgICAgICAgYmluZGVyOjpTdGF0dXMgdW5tdXRlKC8qb3V0Ki8gYm9vbCAqcmV0KSBvdmVycmlkZTsKKyAgICBwcml2YXRlOgorICAgICAgICBUcmFjayogY29uc3QgbVRyYWNrOworICAgIH07CisgICAgc3A8QXVkaW9WaWJyYXRpb25Db250cm9sbGVyPiBtQXVkaW9WaWJyYXRpb25Db250cm9sbGVyOworICAgIHNwPG9zOjpFeHRlcm5hbFZpYnJhdGlvbj4gICAgbUV4dGVybmFsVmlicmF0aW9uOworICAgIC8qKiBIb3cgbWFueSBmcmFtZXMgc2hvdWxkIGJlIGluIHRoZSBidWZmZXIgYmVmb3JlIHRoZSB0cmFjayBpcyBjb25zaWRlcmVkIHJlYWR5ICovCisgICAgY29uc3Qgc2l6ZV90ICAgICAgICBtRnJhbWVDb3VudFRvQmVSZWFkeTsKKwogcHJpdmF0ZToKKyAgICB2b2lkICAgICAgICAgICAgICAgIGludGVyY2VwdEJ1ZmZlcihjb25zdCBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIGJ1ZmZlcik7CisgICAgdGVtcGxhdGUgPGNsYXNzIEY+CisgICAgdm9pZCAgICAgICAgICAgICAgICBmb3JFYWNoVGVlUGF0Y2hUcmFjayhGIGYpIHsKKyAgICAgICAgZm9yIChhdXRvJiB0cCA6IG1UZWVQYXRjaGVzKSB7IGYodHAucGF0Y2hUcmFjayk7IH0KKyAgICB9OworCiAgICAgLy8gVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG9ubHkgZm9yIGZhc3QgdHJhY2tzLCBhbmQgc2hvdWxkIGJlIGluIGEgc3ViY2xhc3MKICAgICBpbnQgICAgICAgICAgICAgICAgIG1GYXN0SW5kZXg7IC8vIGluZGV4IHdpdGhpbiBGYXN0TWl4ZXJTdGF0ZTo6bUZhc3RUcmFja3NbXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVpdGhlciBtRmFzdEluZGV4ID09IC0xIGlmIG5vdCBpc0Zhc3RUcmFjaygpCkBAIC0yMDgsNiArMjk1LDcgQEAKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBtRmxhZ3M7CiAgICAgLy8gSWYgdGhlIGxhc3QgdHJhY2sgY2hhbmdlIHdhcyBub3RpZmllZCB0byB0aGUgY2xpZW50IHdpdGggcmVhZEFuZENsZWFySGFzQ2hhbmdlZAogICAgIHN0ZDo6YXRvbWljX2ZsYWcgICAgIG1DaGFuZ2VOb3RpZmllZCA9IEFUT01JQ19GTEFHX0lOSVQ7CisgICAgVGVlUGF0Y2hlcyAgbVRlZVBhdGNoZXM7CiB9OyAgLy8gZW5kIG9mIFRyYWNrCiAKIApAQCAtMjMzLDcgKzMyMSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6U1lOQ19FVkVOVF9OT05FLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24gPSBBVURJT19TRVNTSU9OX05PTkUpOwogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgc3RvcCgpOwotICAgICAgICAgICAgYm9vbCAgICAgICAgd3JpdGUodm9pZCogZGF0YSwgdWludDMyX3QgZnJhbWVzKTsKKyAgICAgICAgICAgIHNzaXplX3QgICAgIHdyaXRlKHZvaWQqIGRhdGEsIHVpbnQzMl90IGZyYW1lcyk7CiAgICAgICAgICAgICBib29sICAgICAgICBidWZmZXJRdWV1ZUVtcHR5KCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlclF1ZXVlLnNpemUoKSA9PSAwOyB9CiAgICAgICAgICAgICBib29sICAgICAgICBpc0FjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIG1BY3RpdmU7IH0KICAgICBjb25zdCB3cDxUaHJlYWRCYXNlPiYgdGhyZWFkKCkgY29uc3QgeyByZXR1cm4gbVRocmVhZDsgfQpAQCAtMjQxLDYgKzMyOSwxOCBAQAogICAgICAgICAgICAgdm9pZCAgICAgICAgY29weU1ldGFkYXRhVG8oTWV0YWRhdGFJbnNlcnRlciYgYmFja0luc2VydGVyKSBjb25zdCBvdmVycmlkZTsKICAgICAvKiogU2V0IHRoZSBtZXRhZGF0YXMgb2YgdGhlIHVwc3RyZWFtIHRyYWNrcy4gVGhyZWFkIHNhZmUuICovCiAgICAgICAgICAgICB2b2lkICAgICAgICBzZXRNZXRhZGF0YXMoY29uc3QgU291cmNlTWV0YWRhdGFzJiBtZXRhZGF0YXMpOworICAgIC8qKiByZXR1cm5zIGNsaWVudCB0aW1lc3RhbXAgdG8gdGhlIHVwc3RyZWFtIGR1cGxpY2F0aW5nIHRocmVhZC4gKi8KKyAgICBFeHRlbmRlZFRpbWVzdGFtcCAgIGdldENsaWVudFByb3h5VGltZXN0YW1wKCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNlcnZlciAtIGtlcm5lbCBkaWZmZXJlbmNlIGlzIG5vdCB0cnVlIGxhdGVuY3kgd2hlbiBkcmFpbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaS5lLiBtU2VydmVyUHJveHktPmlzRHJhaW5lZCgpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wIHRpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgbUNsaWVudFByb3h5LT5nZXRUaW1lc3RhbXAoJnRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gT24gc3VjY2VzcywgdGhlIHRpbWVzdGFtcCBMT0NBVElPTl9TRVJWRVIgYW5kIExPQ0FUSU9OX0tFUk5FTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVudHJpZXMgd2lsbCBiZSBwcm9wZXJseSBmaWxsZWQuIElmIGdldFRpbWVzdGFtcCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXMgdW5zdWNjZXNzZnVsLCB0aGVuIGEgZGVmYXVsdCBpbml0aWFsaXplZCB0aW1lc3RhbXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAod2l0aCBtVGltZU5zW10gZmlsbGVkIHdpdGggLTEncykgaXMgcmV0dXJuZWQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KIAogcHJpdmF0ZToKICAgICBzdGF0dXNfdCAgICAgICAgICAgIG9idGFpbkJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlciwKQEAgLTI1Nyw2ICszNTcsNyBAQAogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZlOwogICAgIER1cGxpY2F0aW5nVGhyZWFkKiBjb25zdCAgICBtU291cmNlVGhyZWFkOyAvLyBmb3Igd2FpdFRpbWVNcygpIGluIHdyaXRlKCkKICAgICBzcDxBdWRpb1RyYWNrQ2xpZW50UHJveHk+ICAgbUNsaWVudFByb3h5OworCiAgICAgLyoqIEF0dHJpYnV0ZXMgb2YgdGhlIHNvdXJjZSB0cmFja3MuCiAgICAgICoKICAgICAgKiBUaGlzIG1lbWJlciBtdXN0IGJlIGFjY2Vzc2VkIHdpdGggbVRyYWNrTWV0YWRhdGFzTXV0ZXggdGFrZW4uCkBAIC0yNzQsNyArMzc1LDcgQEAKIH07ICAvLyBlbmQgb2YgT3V0cHV0VHJhY2sKIAogLy8gcGxheWJhY2sgdHJhY2ssIHVzZWQgYnkgUGF0Y2hQYW5lbAotY2xhc3MgUGF0Y2hUcmFjayA6IHB1YmxpYyBUcmFjaywgcHVibGljIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciB7CitjbGFzcyBQYXRjaFRyYWNrIDogcHVibGljIFRyYWNrLCBwdWJsaWMgUGF0Y2hUcmFja0Jhc2UgewogcHVibGljOgogCiAgICAgICAgICAgICAgICAgICAgICAgICBQYXRjaFRyYWNrKFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCwKQEAgLTI4NSw5ICszODYsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVvdXQmIHRpbWVvdXQgPSB7fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnRUb0JlUmVhZHkgPSAxIC8qKiBEZWZhdWx0IGJlaGF2aW91ciBpcyB0byBzdGFydAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqICBhcyBzb29uIGFzIHBvc3NpYmxlIHRvIGhhdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgdGhlIGxvd2VzdCBwb3NzaWJsZSBsYXRlbmN5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICogIGV2ZW4gaWYgaXQgbWlnaHQgZ2xpdGNoLiAqLyk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+UGF0Y2hUcmFjaygpOwogCisgICAgICAgICAgICBzaXplX3QgICAgICBmcmFtZXNSZWFkeSgpIGNvbnN0IG92ZXJyaWRlOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBzdGFydChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50ID0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpTWU5DX0VWRU5UX05PTkUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiA9IEFVRElPX1NFU1NJT05fTk9ORSk7CkBAIC0zMDEsMTIgKzQwOSw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lT3V0ID0gTlVMTCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKFByb3h5OjpCdWZmZXIqIGJ1ZmZlcik7CiAKLSAgICAgICAgICAgIHZvaWQgc2V0UGVlclByb3h5KFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciAqcHJveHkpIHsgbVBlZXJQcm94eSA9IHByb3h5OyB9Ci0KIHByaXZhdGU6CiAgICAgICAgICAgICB2b2lkIHJlc3RhcnRJZkRpc2FibGVkKCk7Ci0KLSAgICBzcDxDbGllbnRQcm94eT4gICAgICAgICAgICAgbVByb3h5OwotICAgIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciogICBtUGVlclByb3h5OwotICAgIHN0cnVjdCB0aW1lc3BlYyAgICAgICAgICAgICBtUGVlclRpbWVvdXQ7CiB9OyAgLy8gZW5kIG9mIFBhdGNoVHJhY2sKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9SZWNvcmRUcmFja3MuaAppbmRleCBmYzJkYmJiLi5kNTI1N2JkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvUmVjb3JkVHJhY2tzLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1JlY29yZFRyYWNrcy5oCkBAIC0xOSw2ICsxOSwzOSBAQAogICAgICNlcnJvciBUaGlzIGhlYWRlciBmaWxlIHNob3VsZCBvbmx5IGJlIGluY2x1ZGVkIGZyb20gQXVkaW9GbGluZ2VyLmgKICNlbmRpZgogCisvLyBDaGVja3MgYW5kIG1vbml0b3JzIE9QX1JFQ09SRF9BVURJTworY2xhc3MgT3BSZWNvcmRBdWRpb01vbml0b3IgOiBwdWJsaWMgUmVmQmFzZSB7CitwdWJsaWM6CisgICAgfk9wUmVjb3JkQXVkaW9Nb25pdG9yKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBoYXNPcFJlY29yZEF1ZGlvKCkgY29uc3Q7CisKKyAgICBzdGF0aWMgc3A8T3BSZWNvcmRBdWRpb01vbml0b3I+IGNyZWF0ZUlmTmVlZGVkKHVpZF90IHVpZCwgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOworCitwcml2YXRlOgorICAgIE9wUmVjb3JkQXVkaW9Nb25pdG9yKHVpZF90IHVpZCwgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOworICAgIHZvaWQgb25GaXJzdFJlZigpIG92ZXJyaWRlOworCisgICAgQXBwT3BzTWFuYWdlciBtQXBwT3BzTWFuYWdlcjsKKworICAgIGNsYXNzIFJlY29yZEF1ZGlvT3BDYWxsYmFjayA6IHB1YmxpYyBCbkFwcE9wc0NhbGxiYWNrIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IFJlY29yZEF1ZGlvT3BDYWxsYmFjayhjb25zdCB3cDxPcFJlY29yZEF1ZGlvTW9uaXRvcj4mIG1vbml0b3IpOworICAgICAgICB2b2lkIG9wQ2hhbmdlZChpbnQzMl90IG9wLCBjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUpIG92ZXJyaWRlOworCisgICAgcHJpdmF0ZToKKyAgICAgICAgY29uc3Qgd3A8T3BSZWNvcmRBdWRpb01vbml0b3I+IG1Nb25pdG9yOworICAgIH07CisKKyAgICBzcDxSZWNvcmRBdWRpb09wQ2FsbGJhY2s+IG1PcENhbGxiYWNrOworICAgIC8vIGNhbGxlZCBieSBSZWNvcmRBdWRpb09wQ2FsbGJhY2sgd2hlbiBPUF9SRUNPUkRfQVVESU8gaXMgdXBkYXRlZCBpbiBBcHBPcCBjYWxsYmFjaworICAgIC8vIGFuZCBpbiBvbkZpcnN0UmVmKCkKKyAgICB2b2lkIGNoZWNrUmVjb3JkQXVkaW8oKTsKKworICAgIHN0ZDo6YXRvbWljX2Jvb2wgbUhhc09wUmVjb3JkQXVkaW87CisgICAgY29uc3QgdWlkX3QgbVVpZDsKKyAgICBjb25zdCBTdHJpbmcxNiBtUGFja2FnZTsKK307CisKIC8vIHJlY29yZCB0cmFjawogY2xhc3MgUmVjb3JkVHJhY2sgOiBwdWJsaWMgVHJhY2tCYXNlIHsKIHB1YmxpYzoKQEAgLTMyLDkgKzY1LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IGNyZWF0b3JQaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfdHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5SZWNvcmRUcmFjaygpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgaW5pdENoZWNrKCkgY29uc3Q7CkBAIC01MSw3ICs4Niw3IEBACiAgICAgICAgICAgICBib29sICAgICAgICBzZXRPdmVyZmxvdygpIHsgYm9vbCB0bXAgPSBtT3ZlcmZsb3c7IG1PdmVyZmxvdyA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG1wOyB9CiAKLSAgICBzdGF0aWMgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXBIZWFkZXIoU3RyaW5nOCYgcmVzdWx0KTsKICAgICAgICAgICAgIHZvaWQgICAgICAgIGFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSk7CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgIGhhbmRsZVN5bmNTdGFydEV2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KTsKQEAgLTYzLDEyICs5OCwyMyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVzdGFtcCk7CiAKICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRmFzdFRyYWNrKCkgY29uc3QgeyByZXR1cm4gKG1GbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfRkFTVCkgIT0gMDsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNEaXJlY3QoKSBjb25zdCBvdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAobUZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19ESVJFQ1QpICE9IDA7IH0KIAogICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0U2lsZW5jZWQoYm9vbCBzaWxlbmNlZCkgeyBpZiAoIWlzUGF0Y2hUcmFjaygpKSBtU2lsZW5jZWQgPSBzaWxlbmNlZDsgfQotICAgICAgICAgICAgYm9vbCAgICAgICAgaXNTaWxlbmNlZCgpIGNvbnN0IHsgcmV0dXJuIG1TaWxlbmNlZDsgfQorICAgICAgICAgICAgYm9vbCAgICAgICAgaXNTaWxlbmNlZCgpIGNvbnN0OwogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRBY3RpdmVNaWNyb3Bob25lcyhzdGQ6OnZlY3RvcjxtZWRpYTo6TWljcm9waG9uZUluZm8+KiBhY3RpdmVNaWNyb3Bob25lcyk7CiAKKyAgICAgICAgICAgIHN0YXR1c190ICAgIHNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pOworICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pOworCisgICAgc3RhdGljICBib29sICAgICAgICBjaGVja1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQykgPT0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogcHJpdmF0ZToKICAgICBmcmllbmQgY2xhc3MgQXVkaW9GbGluZ2VyOyAgLy8gZm9yIG1TdGF0ZQogCkBAIC05OSwxMCArMTQ1LDE1IEBACiAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190ICAgICAgICAgICAgICAgIG1GbGFnczsKIAogICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2lsZW5jZWQ7CisKKyAgICAgICAgICAgIC8vIHVzZWQgdG8gZW5mb3JjZSBPUF9SRUNPUkRfQVVESU8KKyAgICAgICAgICAgIHVpZF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVVpZDsKKyAgICAgICAgICAgIFN0cmluZzE2ICAgICAgICAgICAgICAgICAgICAgICAgICAgbU9wUGFja2FnZU5hbWU7CisgICAgICAgICAgICBzcDxPcFJlY29yZEF1ZGlvTW9uaXRvcj4gICAgICAgICAgIG1PcFJlY29yZEF1ZGlvTW9uaXRvcjsKIH07CiAKIC8vIHBsYXliYWNrIHRyYWNrLCB1c2VkIGJ5IFBhdGNoUGFuZWwKLWNsYXNzIFBhdGNoUmVjb3JkIDogdmlydHVhbCBwdWJsaWMgUmVjb3JkVHJhY2ssIHB1YmxpYyBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgeworY2xhc3MgUGF0Y2hSZWNvcmQgOiBwdWJsaWMgUmVjb3JkVHJhY2ssIHB1YmxpYyBQYXRjaFRyYWNrQmFzZSB7CiBwdWJsaWM6CiAKICAgICBQYXRjaFJlY29yZChSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCwKQEAgLTExMiw5ICsxNjMsMTIgQEAKICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICB2b2lkICpidWZmZXIsCiAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7CisgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICBjb25zdCBUaW1lb3V0JiB0aW1lb3V0ID0ge30pOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgflBhdGNoUmVjb3JkKCk7CiAKKyAgICB2aXJ0dWFsIFNvdXJjZSogZ2V0U291cmNlKCkgeyByZXR1cm4gbnVsbHB0cjsgfQorCiAgICAgLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpOwogICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlQnVmZmVyKEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKTsKQEAgLTEyNCwxMCArMTc4LDcwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0aW1lT3V0ID0gTlVMTCk7CiAgICAgdmlydHVhbCB2b2lkICAgICAgICByZWxlYXNlQnVmZmVyKFByb3h5OjpCdWZmZXIgKmJ1ZmZlcik7CiAKLSAgICB2b2lkIHNldFBlZXJQcm94eShQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgKnByb3h5KSB7IG1QZWVyUHJveHkgPSBwcm94eTsgfQorICAgIHNpemVfdCB3cml0ZUZyYW1lcyhjb25zdCB2b2lkKiBzcmMsIHNpemVfdCBmcmFtZUNvdW50LCBzaXplX3QgZnJhbWVTaXplKSB7CisgICAgICAgIHJldHVybiB3cml0ZUZyYW1lcyh0aGlzLCBzcmMsIGZyYW1lQ291bnQsIGZyYW1lU2l6ZSk7CisgICAgfQorCitwcm90ZWN0ZWQ6CisgICAgLyoqIFdyaXRlIHRoZSBzb3VyY2UgZGF0YSBpbnRvIHRoZSBidWZmZXIgcHJvdmlkZXIuIEByZXR1cm4gd3JpdHRlbiBmcmFtZSBjb3VudC4gKi8KKyAgICBzdGF0aWMgc2l6ZV90IHdyaXRlRnJhbWVzKEF1ZGlvQnVmZmVyUHJvdmlkZXIqIGRlc3QsIGNvbnN0IHZvaWQqIHNyYywKKyAgICAgICAgICAgIHNpemVfdCBmcmFtZUNvdW50LCBzaXplX3QgZnJhbWVTaXplKTsKKworfTsgIC8vIGVuZCBvZiBQYXRjaFJlY29yZAorCitjbGFzcyBQYXNzdGhydVBhdGNoUmVjb3JkIDogcHVibGljIFBhdGNoUmVjb3JkLCBwdWJsaWMgU291cmNlIHsKK3B1YmxpYzoKKyAgICBQYXNzdGhydVBhdGNoUmVjb3JkKFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKTsKKworICAgIFNvdXJjZSogZ2V0U291cmNlKCkgb3ZlcnJpZGUgeyByZXR1cm4gc3RhdGljX2Nhc3Q8U291cmNlKj4odGhpcyk7IH0KKworICAgIC8vIFNvdXJjZSBpbnRlcmZhY2UKKyAgICBzdGF0dXNfdCByZWFkKHZvaWQgKmJ1ZmZlciwgc2l6ZV90IGJ5dGVzLCBzaXplX3QgKnJlYWQpIG92ZXJyaWRlOworICAgIHN0YXR1c190IGdldENhcHR1cmVQb3NpdGlvbihpbnQ2NF90ICpmcmFtZXMsIGludDY0X3QgKnRpbWUpIG92ZXJyaWRlOworICAgIHN0YXR1c190IHN0YW5kYnkoKSBvdmVycmlkZTsKKworICAgIC8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCisgICAgLy8gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSBSZWNvcmRUaHJlYWQgdG8gcGFzcyB0aGUgZGF0YSBvYnRhaW5lZAorICAgIC8vIGZyb20gSEFMIG9yIG90aGVyIHNvdXJjZSB0byB0aGUgY2xpZW50LiBQYXNzdGhydVBhdGNoUmVjb3JkIHJlY2VpdmVzCisgICAgLy8gdGhlIGRhdGEgaW4gJ29idGFpbkJ1ZmZlcicgc28gdGhlc2UgY2FsbHMgYXJlIHN0dWJiZWQgb3V0LgorICAgIHN0YXR1c190IGdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpIG92ZXJyaWRlOworICAgIHZvaWQgcmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgICAvLyBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCisgICAgLy8gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBmcm9tIERpcmVjdE91dHB1dFRocmVhZCB0byBhY3F1aXJlIGRhdGEgZnJvbSBIQUwuCisgICAgYm9vbCBwcm9kdWNlc0J1ZmZlck9uRGVtYW5kKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorICAgIHN0YXR1c190IG9idGFpbkJ1ZmZlcihQcm94eTo6QnVmZmVyICpidWZmZXIsIGNvbnN0IHN0cnVjdCB0aW1lc3BlYyAqdGltZU91dCA9IG51bGxwdHIpIG92ZXJyaWRlOworICAgIHZvaWQgcmVsZWFzZUJ1ZmZlcihQcm94eTo6QnVmZmVyICpidWZmZXIpIG92ZXJyaWRlOwogCiBwcml2YXRlOgotICAgIHNwPENsaWVudFByb3h5PiAgICAgICAgICAgICBtUHJveHk7Ci0gICAgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyKiAgIG1QZWVyUHJveHk7Ci0gICAgc3RydWN0IHRpbWVzcGVjICAgICAgICAgICAgIG1QZWVyVGltZW91dDsKLX07ICAvLyBlbmQgb2YgUGF0Y2hSZWNvcmQKKyAgICAvLyBUaGlzIGlzIHRvIHVzZSB3aXRoIFBhdGNoUmVjb3JkOjp3cml0ZUZyYW1lcworICAgIHN0cnVjdCBQYXRjaFJlY29yZEF1ZGlvQnVmZmVyUHJvdmlkZXIgOiBwdWJsaWMgQXVkaW9CdWZmZXJQcm92aWRlciB7CisgICAgICAgIGV4cGxpY2l0IFBhdGNoUmVjb3JkQXVkaW9CdWZmZXJQcm92aWRlcihQYXNzdGhydVBhdGNoUmVjb3JkJiBwYXNzdGhydSkgOgorICAgICAgICAgICAgICAgIG1QYXNzdGhydShwYXNzdGhydSkge30KKyAgICAgICAgc3RhdHVzX3QgZ2V0TmV4dEJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICAgICAgcmV0dXJuIG1QYXNzdGhydS5QYXRjaFJlY29yZDo6Z2V0TmV4dEJ1ZmZlcihidWZmZXIpOworICAgICAgICB9CisgICAgICAgIHZvaWQgcmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikgb3ZlcnJpZGUgeworICAgICAgICAgICAgcmV0dXJuIG1QYXNzdGhydS5QYXRjaFJlY29yZDo6cmVsZWFzZUJ1ZmZlcihidWZmZXIpOworICAgICAgICB9CisgICAgcHJpdmF0ZToKKyAgICAgICAgUGFzc3RocnVQYXRjaFJlY29yZCYgbVBhc3N0aHJ1OworICAgIH07CisKKyAgICBzcDxTdHJlYW1JbkhhbEludGVyZmFjZT4gb2J0YWluU3RyZWFtKHNwPFRocmVhZEJhc2U+KiB0aHJlYWQpOworCisgICAgUGF0Y2hSZWNvcmRBdWRpb0J1ZmZlclByb3ZpZGVyIG1QYXRjaFJlY29yZEF1ZGlvQnVmZmVyUHJvdmlkZXI7CisgICAgc3RkOjp1bmlxdWVfcHRyPHZvaWQsIGRlY2x0eXBlKGZyZWUpKj4gbVNpbmtCdWZmZXI7ICAvLyBmcmFtZSBzaXplIGFsaWduZWQgY29udGludW91cyBidWZmZXIKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8dm9pZCwgZGVjbHR5cGUoZnJlZSkqPiBtU3R1YkJ1ZmZlcjsgIC8vIGJ1ZmZlciB1c2VkIGZvciBBdWRpb0J1ZmZlclByb3ZpZGVyCisgICAgc2l6ZV90IG1VbmNvbnN1bWVkRnJhbWVzID0gMDsKKyAgICBzdGQ6Om11dGV4IG1SZWFkTG9jazsKKyAgICBzdGQ6OmNvbmRpdGlvbl92YXJpYWJsZSBtUmVhZENWOworICAgIHNpemVfdCBtUmVhZEJ5dGVzID0gMDsgLy8gR1VBUkRFRF9CWShtUmVhZExvY2spCisgICAgc3RhdHVzX3QgbVJlYWRFcnJvciA9IE5PX0VSUk9SOyAvLyBHVUFSREVEX0JZKG1SZWFkTG9jaykKKyAgICBpbnQ2NF90IG1MYXN0UmVhZEZyYW1lcyA9IDA7ICAvLyBhY2Nlc3NlZCBvbiBSZWNvcmRUaHJlYWQgb25seQorfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEyNjdlYS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwxOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxMiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpbmNsdWRlIDxiaW5kZXIvQXBwT3BzTWFuYWdlci5oPgotI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgotI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KLSNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+Ci0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgotCi0vKiBXaGVuIHBlcmZvcm1pbmcgcGVybWlzc2lvbiBjaGVja3Mgd2UgZG8gbm90IHVzZSBwZXJtaXNzaW9uIGNhY2hlIGZvcgotICogcnVudGltZSBwZXJtaXNzaW9ucyAocHJvdGVjdGlvbiBsZXZlbCBkYW5nZXJvdXMpIGFzIHRoZXkgbWF5IGNoYW5nZSBhdAotICogcnVudGltZS4gQWxsIG90aGVyIHBlcm1pc3Npb25zIChwcm90ZWN0aW9uIGxldmVsIG5vcm1hbCBhbmQgZGFuZ2Vyb3VzKQotICogY2FuIGJlIGNhY2hlZCBhcyB0aGV5IG5ldmVyIGNoYW5nZS4gT2YgY291cnNlIGFsbCBwZXJtaXNzaW9uIGNoZWNrZWQKLSAqIGhlcmUgYXJlIHBsYXRmb3JtIGRlZmluZWQuCi0gKi8KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1zdGF0aWMgY29uc3QgU3RyaW5nMTYgc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8oImFuZHJvaWQucGVybWlzc2lvbi5SRUNPUkRfQVVESU8iKTsKLQotLy8gTm90IHZhbGlkIHVudGlsIGluaXRpYWxpemVkIGJ5IEF1ZGlvRmxpbmdlciBjb25zdHJ1Y3Rvci4gIEl0IHdvdWxkIGhhdmUgdG8gYmUKLS8vIHJlLWluaXRpYWxpemVkIGlmIHRoZSBwcm9jZXNzIGNvbnRhaW5pbmcgQXVkaW9GbGluZ2VyIHNlcnZpY2UgZm9ya3MgKHdoaWNoIGl0IGRvZXNuJ3QpLgotLy8gVGhpcyBpcyBvZnRlbiB1c2VkIHRvIHZhbGlkYXRlIGJpbmRlciBpbnRlcmZhY2UgY2FsbHMgd2l0aGluIGF1ZGlvc2VydmVyCi0vLyAoZS5nLiBBdWRpb1BvbGljeU1hbmFnZXIgdG8gQXVkaW9GbGluZ2VyKS4KLXBpZF90IGdldHBpZF9jYWNoZWQ7Ci0KLS8vIEEgdHJ1c3RlZCBjYWxsaW5nIFVJRCBtYXkgc3BlY2lmeSB0aGUgY2xpZW50IFVJRCBhcyBwYXJ0IG9mIGEgYmluZGVyIGludGVyZmFjZSBjYWxsLgotLy8gb3RoZXJ3aXNlIHRoZSBjYWxsaW5nIFVJRCBtdXN0IGJlIGVxdWFsIHRvIHRoZSBjbGllbnQgVUlELgotYm9vbCBpc1RydXN0ZWRDYWxsaW5nVWlkKHVpZF90IHVpZCkgewotICAgIHN3aXRjaCAodWlkKSB7Ci0gICAgY2FzZSBBSURfTUVESUE6Ci0gICAgY2FzZSBBSURfQVVESU9TRVJWRVI6Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci19Ci0KLXN0YXRpYyBTdHJpbmcxNiByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoUGVybWlzc2lvbkNvbnRyb2xsZXImIHBlcm1pc3Npb25Db250cm9sbGVyLAotICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKSB7Ci0gICAgaWYgKG9wUGFja2FnZU5hbWUuc2l6ZSgpID4gMCkgewotICAgICAgICByZXR1cm4gb3BQYWNrYWdlTmFtZTsKLSAgICB9Ci0gICAgLy8gSW4gc29tZSBjYXNlcyB0aGUgY2FsbGluZyBjb2RlIGhhcyBubyBhY2Nlc3MgdG8gdGhlIHBhY2thZ2UgaXQgcnVucyB1bmRlci4KLSAgICAvLyBGb3IgZXhhbXBsZSwgY29kZSB1c2luZyB0aGUgd2lsaGVsbSBmcmFtZXdvcmsncyBPcGVuU0wtRVMgQVBJcy4gSW4gdGhpcwotICAgIC8vIGNhc2Ugd2Ugd2lsbCBnZXQgdGhlIHBhY2thZ2VzIGZvciB0aGUgY2FsbGluZyBVSUQgYW5kIHBpY2sgdGhlIGZpcnN0IG9uZQotICAgIC8vIGZvciBhdHRyaWJ1dGluZyB0aGUgYXBwIG9wLiBUaGlzIHdpbGwgd29yayBjb3JyZWN0bHkgZm9yIHJ1bnRpbWUgcGVybWlzc2lvbnMKLSAgICAvLyBhcyBmb3IgbGVnYWN5IGFwcHMgd2Ugd2lsbCB0b2dnbGUgdGhlIGFwcCBvcCBmb3IgYWxsIHBhY2thZ2VzIGluIHRoZSBVSUQuCi0gICAgLy8gVGhlIGNhdmVhdCBpcyB0aGF0IHRoZSBvcGVyYXRpb24gbWF5IGJlIGF0dHJpYnV0ZWQgdG8gdGhlIHdyb25nIHBhY2thZ2UgYW5kCi0gICAgLy8gc3RhdHMgYmFzZWQgb24gYXBwIG9wcyBtYXkgYmUgc2xpZ2h0bHkgb2ZmLgotICAgIFZlY3RvcjxTdHJpbmcxNj4gcGFja2FnZXM7Ci0gICAgcGVybWlzc2lvbkNvbnRyb2xsZXIuZ2V0UGFja2FnZXNGb3JVaWQodWlkLCBwYWNrYWdlcyk7Ci0gICAgaWYgKHBhY2thZ2VzLmlzRW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiTm8gcGFja2FnZXMgZm9yIHVpZCAlZCIsIHVpZCk7Ci0gICAgICAgIHJldHVybiBvcFBhY2thZ2VOYW1lOyAvLyBlbXB0eSBzdHJpbmcKLSAgICB9Ci0gICAgcmV0dXJuIHBhY2thZ2VzWzBdOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgaXNBdWRpb1NlcnZlck9yUm9vdCh1aWRfdCB1aWQpIHsKLSAgICAvLyBBSURfUk9PVCBpcyBPSyBmb3IgY29tbWFuZC1saW5lIHRlc3RzLiAgTmF0aXZlIHVuZm9ya2VkIGF1ZGlvc2VydmVyIGFsd2F5cyBPSy4KLSAgICByZXR1cm4gdWlkID09IEFJRF9ST09UIHx8IHVpZCA9PSBBSURfQVVESU9TRVJWRVIgOwotfQotCi1zdGF0aWMgYm9vbCBjaGVja1JlY29yZGluZ0ludGVybmFsKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsCi0gICAgICAgIHVpZF90IHVpZCwgYm9vbCBzdGFydCkgewotICAgIC8vIE9rYXkgdG8gbm90IHRyYWNrIGluIGFwcCBvcHMgYXMgYXVkaW8gc2VydmVyIGlzIHVzIGFuZCBpZgotICAgIC8vIGRldmljZSBpcyByb290ZWQgc2VjdXJpdHkgbW9kZWwgaXMgY29uc2lkZXJlZCBjb21wcm9taXNlZC4KLSAgICBpZiAoaXNBdWRpb1NlcnZlck9yUm9vdCh1aWQpKSByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIFdlIHNwZWNpZnkgYSBwaWQgYW5kIHVpZCBoZXJlIGFzIG1lZGlhc2VydmVyIChha2EgTWVkaWFSZWNvcmRlciBvciBTdGFnZUZyaWdodFJlY29yZGVyKQotICAgIC8vIG1heSBvcGVuIGEgcmVjb3JkIHRyYWNrIG9uIGJlaGFsZiBvZiBhIGNsaWVudC4gIE5vdGUgdGhhdCBwaWQgbWF5IGJlIGEgdGlkLgotICAgIC8vIElNUE9SVEFOVDogRE9OJ1QgVVNFIFBlcm1pc3Npb25DYWNoZSAtIFJVTlRJTUUgUEVSTUlTU0lPTlMgQ0hBTkdFLgotICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBlcm1pc3Npb25Db250cm9sbGVyOwotICAgIGNvbnN0IGJvb2wgb2sgPSBwZXJtaXNzaW9uQ29udHJvbGxlci5jaGVja1Blcm1pc3Npb24oc0FuZHJvaWRQZXJtaXNzaW9uUmVjb3JkQXVkaW8sIHBpZCwgdWlkKTsKLSAgICBpZiAoIW9rKSB7Ci0gICAgICAgIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzICVzIiwgU3RyaW5nOChzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbykuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBTdHJpbmcxNiByZXNvbHZlZE9wUGFja2FnZU5hbWUgPSByZXNvbHZlQ2FsbGluZ1BhY2thZ2UoCi0gICAgICAgICAgICBwZXJtaXNzaW9uQ29udHJvbGxlciwgb3BQYWNrYWdlTmFtZSwgdWlkKTsKLSAgICBpZiAocmVzb2x2ZWRPcFBhY2thZ2VOYW1lLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBBcHBPcHNNYW5hZ2VyIGFwcE9wczsKLSAgICBjb25zdCBpbnQzMl90IG9wID0gYXBwT3BzLnBlcm1pc3Npb25Ub09wQ29kZShzQW5kcm9pZFBlcm1pc3Npb25SZWNvcmRBdWRpbyk7Ci0gICAgaWYgKHN0YXJ0KSB7Ci0gICAgICAgIGlmIChhcHBPcHMuc3RhcnRPcE5vVGhyb3cob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lLCAvKnN0YXJ0SWZNb2RlRGVmYXVsdCovIGZhbHNlKQotICAgICAgICAgICAgICAgICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgewotICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3QgZGVuaWVkIGJ5IGFwcCBvcDogJWQiLCBvcCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoYXBwT3BzLm5vdGVPcChvcCwgdWlkLCByZXNvbHZlZE9wUGFja2FnZU5hbWUpICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgewotICAgICAgICAgICAgQUxPR0UoIlJlcXVlc3QgZGVuaWVkIGJ5IGFwcCBvcDogJWQiLCBvcCk7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCByZWNvcmRpbmdBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgewotICAgIHJldHVybiBjaGVja1JlY29yZGluZ0ludGVybmFsKG9wUGFja2FnZU5hbWUsIHBpZCwgdWlkLCAvKnN0YXJ0Ki8gZmFsc2UpOwotfQotCi1ib29sIHN0YXJ0UmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCkgewotICAgICByZXR1cm4gY2hlY2tSZWNvcmRpbmdJbnRlcm5hbChvcFBhY2thZ2VOYW1lLCBwaWQsIHVpZCwgLypzdGFydCovIHRydWUpOwotfQotCi12b2lkIGZpbmlzaFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKSB7Ci0gICAgLy8gT2theSB0byBub3QgdHJhY2sgaW4gYXBwIG9wcyBhcyBhdWRpbyBzZXJ2ZXIgaXMgdXMgYW5kIGlmCi0gICAgLy8gZGV2aWNlIGlzIHJvb3RlZCBzZWN1cml0eSBtb2RlbCBpcyBjb25zaWRlcmVkIGNvbXByb21pc2VkLgotICAgIGlmIChpc0F1ZGlvU2VydmVyT3JSb290KHVpZCkpIHJldHVybjsKLQotICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBlcm1pc3Npb25Db250cm9sbGVyOwotICAgIFN0cmluZzE2IHJlc29sdmVkT3BQYWNrYWdlTmFtZSA9IHJlc29sdmVDYWxsaW5nUGFja2FnZSgKLSAgICAgICAgICAgIHBlcm1pc3Npb25Db250cm9sbGVyLCBvcFBhY2thZ2VOYW1lLCB1aWQpOwotICAgIGlmIChyZXNvbHZlZE9wUGFja2FnZU5hbWUuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFwcE9wc01hbmFnZXIgYXBwT3BzOwotICAgIGNvbnN0IGludDMyX3Qgb3AgPSBhcHBPcHMucGVybWlzc2lvblRvT3BDb2RlKHNBbmRyb2lkUGVybWlzc2lvblJlY29yZEF1ZGlvKTsKLSAgICBhcHBPcHMuZmluaXNoT3Aob3AsIHVpZCwgcmVzb2x2ZWRPcFBhY2thZ2VOYW1lKTsKLX0KLQotYm9vbCBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgaWYgKGdldHBpZF9jYWNoZWQgPT0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0NhcHR1cmVBdWRpb091dHB1dCgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fT1VUUFVUIik7Ci0gICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNDYXB0dXJlQXVkaW9PdXRwdXQsIHBpZCwgdWlkKTsKLSAgICBpZiAoIW9rKSBBTE9HRSgiUmVxdWVzdCByZXF1aXJlcyBhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19PVVRQVVQiKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLWJvb2wgY2FwdHVyZUhvdHdvcmRBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgLy8gQ0FQVFVSRV9BVURJT19IT1RXT1JEIHBlcm1pc3Npb24gaW1wbGllcyBSRUNPUkRfQVVESU8gcGVybWlzc2lvbgotICAgIGJvb2wgb2sgPSByZWNvcmRpbmdBbGxvd2VkKFN0cmluZzE2KCIiKSwgcGlkLCB1aWQpOwotCi0gICAgaWYgKG9rKSB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzQ2FwdHVyZUhvdHdvcmRBbGxvd2VkKCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FQVFVSRV9BVURJT19IT1RXT1JEIik7Ci0gICAgICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCi0gICAgICAgIG9rID0gUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNDYXB0dXJlSG90d29yZEFsbG93ZWQpOwotICAgIH0KLSAgICBpZiAoIW9rKSBBTE9HRSgiYW5kcm9pZC5wZXJtaXNzaW9uLkNBUFRVUkVfQVVESU9fSE9UV09SRCIpOwotICAgIHJldHVybiBvazsKLX0KLQotYm9vbCBzZXR0aW5nc0FsbG93ZWQoKSB7Ci0gICAgaWYgKGdldHBpZF9jYWNoZWQgPT0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0F1ZGlvU2V0dGluZ3MoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MiKTsKLSAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgotICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0F1ZGlvU2V0dGluZ3MpOwotICAgIGlmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fU0VUVElOR1MiKTsKLSAgICByZXR1cm4gb2s7Ci19Ci0KLWJvb2wgbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpIHsKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc01vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fUk9VVElORyIpOwotICAgIC8vIElNUE9SVEFOVDogVXNlIFBlcm1pc3Npb25DYWNoZSAtIG5vdCBhIHJ1bnRpbWUgcGVybWlzc2lvbiBhbmQgbWF5IG5vdCBjaGFuZ2UuCi0gICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tDYWxsaW5nUGVybWlzc2lvbihzTW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCk7Ci0gICAgaWYgKCFvaykgQUxPR0UoImFuZHJvaWQucGVybWlzc2lvbi5NT0RJRllfQVVESU9fUk9VVElORyIpOwotICAgIHJldHVybiBvazsKLX0KLQotYm9vbCBkdW1wQWxsb3dlZCgpIHsKLSAgICAvLyBkb24ndCBvcHRpbWl6ZSBmb3Igc2FtZSBwaWQsIHNpbmNlIG1lZGlhc2VydmVyIG5ldmVyIGR1bXBzIGl0c2VsZgotICAgIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzRHVtcCgiYW5kcm9pZC5wZXJtaXNzaW9uLkRVTVAiKTsKLSAgICAvLyBJTVBPUlRBTlQ6IFVzZSBQZXJtaXNzaW9uQ2FjaGUgLSBub3QgYSBydW50aW1lIHBlcm1pc3Npb24gYW5kIG1heSBub3QgY2hhbmdlLgotICAgIGJvb2wgb2sgPSBQZXJtaXNzaW9uQ2FjaGU6OmNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oc0R1bXApOwotICAgIC8vIGNvbnZlbnRpb24gaXMgZm9yIGNhbGxlciB0byBkdW1wIGFuIGVycm9yIG1lc3NhZ2UgdG8gZmQgaW5zdGVhZCBvZiBsb2dnaW5nIGhlcmUKLSAgICAvL2lmICghb2spIEFMT0dFKCJSZXF1ZXN0IHJlcXVpcmVzIGFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7Ci0gICAgcmV0dXJuIG9rOwotfQotCi1ib29sIG1vZGlmeVBob25lU3RhdGVBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKSB7Ci0gICAgc3RhdGljIGNvbnN0IFN0cmluZzE2IHNNb2RpZnlQaG9uZVN0YXRlKCJhbmRyb2lkLnBlcm1pc3Npb24uTU9ESUZZX1BIT05FX1NUQVRFIik7Ci0gICAgYm9vbCBvayA9IFBlcm1pc3Npb25DYWNoZTo6Y2hlY2tQZXJtaXNzaW9uKHNNb2RpZnlQaG9uZVN0YXRlLCBwaWQsIHVpZCk7Ci0gICAgaWYgKCFvaykgQUxPR0UoIlJlcXVlc3QgcmVxdWlyZXMgYW5kcm9pZC5wZXJtaXNzaW9uLk1PRElGWV9QSE9ORV9TVEFURSIpOwotICAgIHJldHVybiBvazsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TZXJ2aWNlVXRpbGl0aWVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0NWFkYTEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NlcnZpY2VVdGlsaXRpZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0KLSNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNvbnRyb2xsZXIuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1leHRlcm4gcGlkX3QgZ2V0cGlkX2NhY2hlZDsKLWJvb2wgaXNUcnVzdGVkQ2FsbGluZ1VpZCh1aWRfdCB1aWQpOwotYm9vbCByZWNvcmRpbmdBbGxvd2VkKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci1ib29sIHN0YXJ0UmVjb3JkaW5nKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLCBwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci12b2lkIGZpbmlzaFJlY29yZGluZyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgdWlkX3QgdWlkKTsKLWJvb2wgY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci1ib29sIGNhcHR1cmVIb3R3b3JkQWxsb3dlZChwaWRfdCBwaWQsIHVpZF90IHVpZCk7Ci1ib29sIHNldHRpbmdzQWxsb3dlZCgpOwotYm9vbCBtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCk7Ci1ib29sIGR1bXBBbGxvd2VkKCk7Ci1ib29sIG1vZGlmeVBob25lU3RhdGVBbGxvd2VkKHBpZF90IHBpZCwgdWlkX3QgdWlkKTsKLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TcGRpZlN0cmVhbU91dC5jcHAgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU3BkaWZTdHJlYW1PdXQuY3BwCmluZGV4IGE0NGFiMmEuLmM3YWJhNzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9TcGRpZlN0cmVhbU91dC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1NwZGlmU3RyZWFtT3V0LmNwcApAQCAtNTksNiArNTksNyBAQAogICAgIC8vIFRPRE8gTW92ZSB0aGlzIGludG8gdGhlIGF1ZGlvX3V0aWxzIGFzIGEgc3RhdGljIG1ldGhvZC4KICAgICBzd2l0Y2goY29uZmlnLT5mb3JtYXQpIHsKICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRV9BQzM6CisgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0VfQUMzX0pPQzoKICAgICAgICAgICAgIG1SYXRlTXVsdGlwbGllciA9IDQ7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfQUMzOgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuY3BwCmluZGV4IGMyMzIwYmMuLjU5ZDBhZDkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5jcHAKQEAgLTIzLDEwICsyMywxNCBAQAogI2luY2x1ZGUgIkNvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlIDxtYXRoLmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db250YWluZXJzLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9SZXNhbXBsZXJQdWJsaWMuaD4KICNpbmNsdWRlIDxtZWRpYS9SZWNvcmRCdWZmZXJDb252ZXJ0ZXIuaD4KQEAgLTM2LDEwICs0MCwxMyBAQAogCiAjaW5jbHVkZSA8cHJpdmF0ZS9tZWRpYS9BdWRpb1RyYWNrU2hhcmVkLmg+CiAjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CisjaW5jbHVkZSA8YXVkaW9fdXRpbHMvQmFsYW5jZS5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2NoYW5uZWxzLmg+CiAjaW5jbHVkZSA8YXVkaW9fdXRpbHMvbW9ub19ibGVuZC5oPgogI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL3ByaW1pdGl2ZXMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9mb3JtYXQuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9taW5pZmxvYXQuaD4KKyNpbmNsdWRlIDxhdWRpb191dGlscy9zYWZlX21hdGguaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfbnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fZWZmZWN0cy9lZmZlY3RfYWVjLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CkBAIC01NCw2ICs2MSw3IEBACiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vU291cmNlQXVkaW9CdWZmZXJQcm92aWRlci5oPgogI2luY2x1ZGUgPG1lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmg+CiAKKyNpbmNsdWRlIDxhdWRpb21hbmFnZXIvQXVkaW9NYW5hZ2VyLmg+CiAjaW5jbHVkZSA8cG93ZXJtYW5hZ2VyL1Bvd2VyTWFuYWdlci5oPgogCiAjaW5jbHVkZSA8bWVkaWEvYXVkaW9oYWwvRWZmZWN0c0ZhY3RvcnlIYWxJbnRlcmZhY2UuaD4KQEAgLTYyLDggKzcwLDggQEAKICNpbmNsdWRlICJBdWRpb0ZsaW5nZXIuaCIKICNpbmNsdWRlICJGYXN0TWl4ZXIuaCIKICNpbmNsdWRlICJGYXN0Q2FwdHVyZS5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKLSNpbmNsdWRlICJtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmgiCisjaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvU2VydmljZVV0aWxpdGllcy5oPgogCiAjaWZkZWYgQUREX0JBVFRFUllfREFUQQogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYVBsYXllclNlcnZpY2UuaD4KQEAgLTcxLDcgKzc5LDcgQEAKICNlbmRpZgogCiAjaWZkZWYgREVCVUdfQ1BVX1VTQUdFCi0jaW5jbHVkZSA8Y3B1c3RhdHMvQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcy5oPgorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL1N0YXRpc3RpY3MuaD4KICNpbmNsdWRlIDxjcHVzdGF0cy9UaHJlYWRDcHVVc2FnZS5oPgogI2VuZGlmCiAKQEAgLTIwMCw3ICsyMDgsNyBAQAogLy8gSW5pdGlhbGx5IHRoaXMgaGVhcCBpcyB1c2VkIHRvIGFsbG9jYXRlIGNsaWVudCBidWZmZXJzIGZvciAiZmFzdCIgQXVkaW9SZWNvcmQuCiAvLyBFdmVudHVhbGx5IGl0IHdpbGwgYmUgdGhlIHNpbmdsZSBidWZmZXIgdGhhdCBGYXN0Q2FwdHVyZSB3cml0ZXMgaW50byB2aWEgSEFMIHJlYWQoKSwKIC8vIGFuZCB0aGF0IGFsbCAiZmFzdCIgQXVkaW9SZWNvcmQgY2xpZW50cyByZWFkIGZyb20uICBJbiBlaXRoZXIgY2FzZSwgdGhlIHNpemUgY2FuIGJlIHNtYWxsLgotc3RhdGljIGNvbnN0IHNpemVfdCBrUmVjb3JkVGhyZWFkUmVhZE9ubHlIZWFwU2l6ZSA9IDB4NDAwMDsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1JlY29yZFRocmVhZFJlYWRPbmx5SGVhcFNpemUgPSAweEQwMDA7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMzMzLDkgKzM0MSw5IEBACiAjaWZkZWYgREVCVUdfQ1BVX1VTQUdFCiBwcml2YXRlOgogICAgIFRocmVhZENwdVVzYWdlIG1DcHVVc2FnZTsgICAgICAgICAgIC8vIGluc3RhbnRhbmVvdXMgdGhyZWFkIENQVSB1c2FnZSBpbiB3YWxsIGNsb2NrIG5zCi0gICAgQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcyBtV2NTdGF0czsgLy8gc3RhdGlzdGljcyBvbiB0aHJlYWQgQ1BVIHVzYWdlIGluIHdhbGwgY2xvY2sgbnMKKyAgICBhdWRpb191dGlsczo6U3RhdGlzdGljczxkb3VibGU+IG1XY1N0YXRzOyAvLyBzdGF0aXN0aWNzIG9uIHRocmVhZCBDUFUgdXNhZ2UgaW4gd2FsbCBjbG9jayBucwogCi0gICAgQ2VudHJhbFRlbmRlbmN5U3RhdGlzdGljcyBtSHpTdGF0czsgLy8gc3RhdGlzdGljcyBvbiB0aHJlYWQgQ1BVIHVzYWdlIGluIGN5Y2xlcworICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbUh6U3RhdHM7IC8vIHN0YXRpc3RpY3Mgb24gdGhyZWFkIENQVSB1c2FnZSBpbiBjeWNsZXMKIAogICAgIGludCBtQ3B1TnVtOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRocmVhZCdzIGN1cnJlbnQgQ1BVIG51bWJlcgogICAgIGludCBtQ3B1a0h6OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZyZXF1ZW5jeSBvZiB0aHJlYWQncyBjdXJyZW50IENQVSBpbiBrSHoKQEAgLTM2MSw3ICszNjksNyBAQAogCiAgICAgLy8gcmVjb3JkIHNhbXBsZSBmb3Igd2FsbCBjbG9jayBzdGF0aXN0aWNzCiAgICAgaWYgKHZhbGlkKSB7Ci0gICAgICAgIG1XY1N0YXRzLnNhbXBsZSh3Y05zKTsKKyAgICAgICAgbVdjU3RhdHMuYWRkKHdjTnMpOwogICAgIH0KIAogICAgIC8vIGdldCB0aGUgY3VycmVudCBDUFUgbnVtYmVyCkBAIC0zODAsMjYgKzM4OCwyNiBAQAogCiAgICAgLy8gaWYgbm8gY2hhbmdlIGluIENQVSBudW1iZXIgb3IgZnJlcXVlbmN5LCB0aGVuIHJlY29yZCBzYW1wbGUgZm9yIGN5Y2xlIHN0YXRpc3RpY3MKICAgICBpZiAodmFsaWQgJiYgbUNwdWtIeiA+IDApIHsKLSAgICAgICAgZG91YmxlIGN5Y2xlcyA9IHdjTnMgKiBjcHVrSHogKiAwLjAwMDAwMTsKLSAgICAgICAgbUh6U3RhdHMuc2FtcGxlKGN5Y2xlcyk7CisgICAgICAgIGNvbnN0IGRvdWJsZSBjeWNsZXMgPSB3Y05zICogY3B1a0h6ICogMC4wMDAwMDE7CisgICAgICAgIG1IelN0YXRzLmFkZChjeWNsZXMpOwogICAgIH0KIAotICAgIHVuc2lnbmVkIG4gPSBtV2NTdGF0cy5uKCk7CisgICAgY29uc3QgdW5zaWduZWQgbiA9IG1XY1N0YXRzLmdldE4oKTsKICAgICAvLyBtQ3B1VXNhZ2UuZWxhcHNlZCgpIGlzIGV4cGVuc2l2ZSwgc28gZG9uJ3QgY2FsbCBpdCBldmVyeSBsb29wCiAgICAgaWYgKChuICYgMTI3KSA9PSAxKSB7Ci0gICAgICAgIGxvbmcgbG9uZyBlbGFwc2VkID0gbUNwdVVzYWdlLmVsYXBzZWQoKTsKKyAgICAgICAgY29uc3QgbG9uZyBsb25nIGVsYXBzZWQgPSBtQ3B1VXNhZ2UuZWxhcHNlZCgpOwogICAgICAgICBpZiAoZWxhcHNlZCA+PSBERUJVR19DUFVfVVNBR0UgKiAxMDAwMDAwMDAwTEwpIHsKLSAgICAgICAgICAgIGRvdWJsZSBwZXJMb29wID0gZWxhcHNlZCAvIChkb3VibGUpIG47Ci0gICAgICAgICAgICBkb3VibGUgcGVyTG9vcDEwMCA9IHBlckxvb3AgKiAwLjAxOwotICAgICAgICAgICAgZG91YmxlIHBlckxvb3AxayA9IHBlckxvb3AgKiAwLjAwMTsKLSAgICAgICAgICAgIGRvdWJsZSBtZWFuID0gbVdjU3RhdHMubWVhbigpOwotICAgICAgICAgICAgZG91YmxlIHN0ZGRldiA9IG1XY1N0YXRzLnN0ZGRldigpOwotICAgICAgICAgICAgZG91YmxlIG1pbmltdW0gPSBtV2NTdGF0cy5taW5pbXVtKCk7Ci0gICAgICAgICAgICBkb3VibGUgbWF4aW11bSA9IG1XY1N0YXRzLm1heGltdW0oKTsKLSAgICAgICAgICAgIGRvdWJsZSBtZWFuQ3ljbGVzID0gbUh6U3RhdHMubWVhbigpOwotICAgICAgICAgICAgZG91YmxlIHN0ZGRldkN5Y2xlcyA9IG1IelN0YXRzLnN0ZGRldigpOwotICAgICAgICAgICAgZG91YmxlIG1pbkN5Y2xlcyA9IG1IelN0YXRzLm1pbmltdW0oKTsKLSAgICAgICAgICAgIGRvdWJsZSBtYXhDeWNsZXMgPSBtSHpTdGF0cy5tYXhpbXVtKCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgcGVyTG9vcCA9IGVsYXBzZWQgLyAoZG91YmxlKSBuOworICAgICAgICAgICAgY29uc3QgZG91YmxlIHBlckxvb3AxMDAgPSBwZXJMb29wICogMC4wMTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBwZXJMb29wMWsgPSBwZXJMb29wICogMC4wMDE7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWVhbiA9IG1XY1N0YXRzLmdldE1lYW4oKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBzdGRkZXYgPSBtV2NTdGF0cy5nZXRTdGREZXYoKTsKKyAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBtaW5pbXVtID0gbVdjU3RhdHMuZ2V0TWluKCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWF4aW11bSA9IG1XY1N0YXRzLmdldE1heCgpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIG1lYW5DeWNsZXMgPSBtSHpTdGF0cy5nZXRNZWFuKCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgc3RkZGV2Q3ljbGVzID0gbUh6U3RhdHMuZ2V0U3RkRGV2KCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWluQ3ljbGVzID0gbUh6U3RhdHMuZ2V0TWluKCk7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgbWF4Q3ljbGVzID0gbUh6U3RhdHMuZ2V0TWF4KCk7CiAgICAgICAgICAgICBtQ3B1VXNhZ2UucmVzZXRFbGFwc2VkKCk7CiAgICAgICAgICAgICBtV2NTdGF0cy5yZXNldCgpOwogICAgICAgICAgICAgbUh6U3RhdHMucmVzZXQoKTsKQEAgLTQ1Myw1MiArNDYxLDggQEAKICAgICB9CiB9CiAKLXN0ZDo6c3RyaW5nIGRldmljZXNUb1N0cmluZyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykKLXsKLSAgICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gICAgaWYgKGRldmljZXMgJiBBVURJT19ERVZJQ0VfQklUX0lOKSB7Ci0gICAgICAgIElucHV0RGV2aWNlQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZGV2aWNlcywgcmVzdWx0KTsKLSAgICB9IGVsc2UgewotICAgICAgICBPdXRwdXREZXZpY2VDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhkZXZpY2VzLCByZXN1bHQpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGQ6OnN0cmluZyBpbnB1dEZsYWdzVG9TdHJpbmcoYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKLXsKLSAgICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gICAgSW5wdXRGbGFnQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZmxhZ3MsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RkOjpzdHJpbmcgb3V0cHV0RmxhZ3NUb1N0cmluZyhhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykKLXsKLSAgICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gICAgT3V0cHV0RmxhZ0NvbnZlcnRlcjo6bWFza1RvU3RyaW5nKGZsYWdzLCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KLWNvbnN0IGNoYXIgKnNvdXJjZVRvU3RyaW5nKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKLXsKLSAgICBzd2l0Y2ggKHNvdXJjZSkgewotICAgIGNhc2UgQVVESU9fU09VUkNFX0RFRkFVTFQ6ICAgICAgICAgICAgICByZXR1cm4gImRlZmF1bHQiOwotICAgIGNhc2UgQVVESU9fU09VUkNFX01JQzogICAgICAgICAgICAgICAgICByZXR1cm4gIm1pYyI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOiAgICAgICAgIHJldHVybiAidm9pY2UgdXBsaW5rIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzogICAgICAgcmV0dXJuICJ2b2ljZSBkb3dubGluayI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDogICAgICAgICAgIHJldHVybiAidm9pY2UgY2FsbCI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfQ0FNQ09SREVSOiAgICAgICAgICAgIHJldHVybiAiY2FtY29yZGVyIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTjogICAgcmV0dXJuICJ2b2ljZSByZWNvZ25pdGlvbiI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTjogIHJldHVybiAidm9pY2UgY29tbXVuaWNhdGlvbiI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDogICAgICAgIHJldHVybiAicmVtb3RlIHN1Ym1peCI7Ci0gICAgY2FzZSBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQ6ICAgICAgICAgIHJldHVybiAidW5wcm9jZXNzZWQiOwotICAgIGNhc2UgQVVESU9fU09VUkNFX0ZNX1RVTkVSOiAgICAgICAgICAgICByZXR1cm4gIkZNIHR1bmVyIjsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9IT1RXT1JEOiAgICAgICAgICAgICAgcmV0dXJuICJob3R3b3JkIjsKLSAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ1bmtub3duIjsKLSAgICB9Ci19Ci0KIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VGhyZWFkQmFzZShjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAotICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLCBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsIHR5cGVfdCB0eXBlLCBib29sIHN5c3RlbVJlYWR5KQorICAgICAgICB0eXBlX3QgdHlwZSwgYm9vbCBzeXN0ZW1SZWFkeSkKICAgICA6ICAgVGhyZWFkKGZhbHNlIC8qY2FuQ2FsbEphdmEqLyksCiAgICAgICAgIG1UeXBlKHR5cGUpLAogICAgICAgICBtQXVkaW9GbGluZ2VyKGF1ZGlvRmxpbmdlciksCkBAIC01MDYsOCArNDcwLDcgQEAKICAgICAgICAgLy8gYXJlIHNldCBieSBQbGF5YmFja1RocmVhZDo6cmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpIG9yCiAgICAgICAgIC8vIFJlY29yZFRocmVhZDo6cmVhZElucHV0UGFyYW1ldGVyc19sKCkKICAgICAgICAgLy9GSVhNRTogbVN0YW5kYnkgc2hvdWxkIGJlIHRydWUgaGVyZS4gSXMgdGhpcyBzb21lIGtpbmQgb2YgaGFjaz8KLSAgICAgICAgbVN0YW5kYnkoZmFsc2UpLCBtT3V0RGV2aWNlKG91dERldmljZSksIG1JbkRldmljZShpbkRldmljZSksCi0gICAgICAgIG1QcmV2T3V0RGV2aWNlKEFVRElPX0RFVklDRV9OT05FKSwgbVByZXZJbkRldmljZShBVURJT19ERVZJQ0VfTk9ORSksCisgICAgICAgIG1TdGFuZGJ5KGZhbHNlKSwKICAgICAgICAgbUF1ZGlvU291cmNlKEFVRElPX1NPVVJDRV9ERUZBVUxUKSwgbUlkKGlkKSwKICAgICAgICAgLy8gbU5hbWUgd2lsbCBiZSBzZXQgYnkgY29uY3JldGUgKG5vbi12aXJ0dWFsKSBzdWJjbGFzcwogICAgICAgICBtRGVhdGhSZWNpcGllbnQobmV3IFBNRGVhdGhSZWNpcGllbnQodGhpcykpLApAQCAtNTI4LDYgKzQ5MSw4IEBACiAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKG1Qb3dlck1hbmFnZXIpOwogICAgICAgICBiaW5kZXItPnVubGlua1RvRGVhdGgobURlYXRoUmVjaXBpZW50KTsKICAgICB9CisKKyAgICBzZW5kU3RhdGlzdGljcyh0cnVlIC8qIGZvcmNlICovKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpyZWFkeVRvUnVuKCkKQEAgLTYwMiwxNiArNTY3LDI3IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRJb0NvbmZpZ0V2ZW50KGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkKQordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRJb0NvbmZpZ0V2ZW50KGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgc2VuZElvQ29uZmlnRXZlbnRfbChldmVudCwgcGlkKTsKKyAgICBzZW5kSW9Db25maWdFdmVudF9sKGV2ZW50LCBwaWQsIHBvcnRJZCk7CiB9CiAKIC8vIHNlbmRJb0NvbmZpZ0V2ZW50X2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kSW9Db25maWdFdmVudF9sKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkKQordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OnNlbmRJb0NvbmZpZ0V2ZW50X2woYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBzcDxDb25maWdFdmVudD4gY29uZmlnRXZlbnQgPSAoQ29uZmlnRXZlbnQgKiluZXcgSW9Db25maWdFdmVudChldmVudCwgcGlkKTsKKyAgICAvLyBUaGUgYXVkaW8gc3RhdGlzdGljcyBoaXN0b3J5IGlzIGV4cG9uZW50aWFsbHkgd2VpZ2h0ZWQgdG8gZm9yZ2V0IGV2ZW50cworICAgIC8vIGFib3V0IGZpdmUgb3IgbW9yZSBzZWNvbmRzIGluIHRoZSBwYXN0LiAgSW4gb3JkZXIgdG8gaGF2ZQorICAgIC8vIGNyaXNwZXIgc3RhdGlzdGljcyBmb3IgbWVkaWFtZXRyaWNzLCB3ZSByZXNldCB0aGUgc3RhdGlzdGljcyBvbgorICAgIC8vIGFuIElvQ29uZmlnRXZlbnQsIHRvIHJlZmxlY3QgZGlmZmVyZW50IHByb3BlcnRpZXMgZm9yIGEgbmV3IGRldmljZS4KKyAgICBtSW9KaXR0ZXJNcy5yZXNldCgpOworICAgIG1MYXRlbmN5TXMucmVzZXQoKTsKKyAgICBtUHJvY2Vzc1RpbWVNcy5yZXNldCgpOworICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisKKyAgICBzcDxDb25maWdFdmVudD4gY29uZmlnRXZlbnQgPSAoQ29uZmlnRXZlbnQgKiluZXcgSW9Db25maWdFdmVudChldmVudCwgcGlkLCBwb3J0SWQpOwogICAgIHNlbmRDb25maWdFdmVudF9sKGNvbmZpZ0V2ZW50KTsKIH0KIApAQCAtNjcxLDYgKzY0NywxOCBAQAogICAgIHJldHVybiBzZW5kQ29uZmlnRXZlbnRfbChjb25maWdFdmVudCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6c2VuZFVwZGF0ZU91dERldmljZUNvbmZpZ0V2ZW50KAorICAgICAgICBjb25zdCBEZXZpY2VEZXNjcmlwdG9yQmFzZVZlY3RvciYgb3V0RGV2aWNlcykKK3sKKyAgICBpZiAodHlwZSgpICE9IFJFQ09SRCkgeworICAgICAgICAvLyBUaGUgdXBkYXRlIG91dCBkZXZpY2Ugb3BlcmF0aW9uIGlzIG9ubHkgZm9yIHJlY29yZCB0aHJlYWQuCisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBzcDxDb25maWdFdmVudD4gY29uZmlnRXZlbnQgPSAoQ29uZmlnRXZlbnQgKiluZXcgVXBkYXRlT3V0RGV2aWNlc0NvbmZpZ0V2ZW50KG91dERldmljZXMpOworICAgIHJldHVybiBzZW5kQ29uZmlnRXZlbnRfbChjb25maWdFdmVudCk7Cit9CisKIAogLy8gcG9zdCBjb25kaXRpb246IG1Db25maWdFdmVudHMuaXNFbXB0eSgpCiB2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6cHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkKQEAgLTY5NCw3ICs2ODIsNyBAQAogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIENGR19FVkVOVF9JTzogewogICAgICAgICAgICAgSW9Db25maWdFdmVudERhdGEgKmRhdGEgPSAoSW9Db25maWdFdmVudERhdGEgKilldmVudC0+bURhdGEuZ2V0KCk7Ci0gICAgICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoZGF0YS0+bUV2ZW50LCBkYXRhLT5tUGlkKTsKKyAgICAgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChkYXRhLT5tRXZlbnQsIGRhdGEtPm1QaWQsIGRhdGEtPm1Qb3J0SWQpOwogICAgICAgICB9IGJyZWFrOwogICAgICAgICBjYXNlIENGR19FVkVOVF9TRVRfUEFSQU1FVEVSOiB7CiAgICAgICAgICAgICBTZXRQYXJhbWV0ZXJDb25maWdFdmVudERhdGEgKmRhdGEgPSAoU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnREYXRhICopZXZlbnQtPm1EYXRhLmdldCgpOwpAQCAtNzA1LDI0ICs2OTMsMjkgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSBicmVhazsKICAgICAgICAgY2FzZSBDRkdfRVZFTlRfQ1JFQVRFX0FVRElPX1BBVENIOiB7Ci0gICAgICAgICAgICBjb25zdCBhdWRpb19kZXZpY2VzX3Qgb2xkRGV2aWNlID0gZ2V0RGV2aWNlKCk7CisgICAgICAgICAgICBjb25zdCBEZXZpY2VUeXBlU2V0IG9sZERldmljZXMgPSBnZXREZXZpY2VUeXBlcygpOwogICAgICAgICAgICAgQ3JlYXRlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YSAqZGF0YSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnREYXRhICopZXZlbnQtPm1EYXRhLmdldCgpOwogICAgICAgICAgICAgZXZlbnQtPm1TdGF0dXMgPSBjcmVhdGVBdWRpb1BhdGNoX2woJmRhdGEtPm1QYXRjaCwgJmRhdGEtPm1IYW5kbGUpOwotICAgICAgICAgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldERldmljZSgpOwotICAgICAgICAgICAgbUxvY2FsTG9nLmxvZygiQ0ZHX0VWRU5UX0NSRUFURV9BVURJT19QQVRDSDogb2xkIGRldmljZSAlI3ggKCVzKSBuZXcgZGV2aWNlICUjeCAoJXMpIiwKLSAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKW9sZERldmljZSwgZGV2aWNlc1RvU3RyaW5nKG9sZERldmljZSkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKW5ld0RldmljZSwgZGV2aWNlc1RvU3RyaW5nKG5ld0RldmljZSkuY19zdHIoKSk7CisgICAgICAgICAgICBjb25zdCBEZXZpY2VUeXBlU2V0IG5ld0RldmljZXMgPSBnZXREZXZpY2VUeXBlcygpOworICAgICAgICAgICAgbUxvY2FsTG9nLmxvZygiQ0ZHX0VWRU5UX0NSRUFURV9BVURJT19QQVRDSDogb2xkIGRldmljZSAlcyAoJXMpIG5ldyBkZXZpY2UgJXMgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgIGR1bXBEZXZpY2VUeXBlcyhvbGREZXZpY2VzKS5jX3N0cigpLCB0b1N0cmluZyhvbGREZXZpY2VzKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICBkdW1wRGV2aWNlVHlwZXMobmV3RGV2aWNlcykuY19zdHIoKSwgdG9TdHJpbmcobmV3RGV2aWNlcykuY19zdHIoKSk7CiAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgIGNhc2UgQ0ZHX0VWRU5UX1JFTEVBU0VfQVVESU9fUEFUQ0g6IHsKLSAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBvbGREZXZpY2UgPSBnZXREZXZpY2UoKTsKKyAgICAgICAgICAgIGNvbnN0IERldmljZVR5cGVTZXQgb2xkRGV2aWNlcyA9IGdldERldmljZVR5cGVzKCk7CiAgICAgICAgICAgICBSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YSAqZGF0YSA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50RGF0YSAqKWV2ZW50LT5tRGF0YS5nZXQoKTsKICAgICAgICAgICAgIGV2ZW50LT5tU3RhdHVzID0gcmVsZWFzZUF1ZGlvUGF0Y2hfbChkYXRhLT5tSGFuZGxlKTsKLSAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXREZXZpY2UoKTsKLSAgICAgICAgICAgIG1Mb2NhbExvZy5sb2coIkNGR19FVkVOVF9SRUxFQVNFX0FVRElPX1BBVENIOiBvbGQgZGV2aWNlICUjeCAoJXMpIG5ldyBkZXZpY2UgJSN4ICglcykiLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpb2xkRGV2aWNlLCBkZXZpY2VzVG9TdHJpbmcob2xkRGV2aWNlKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQpbmV3RGV2aWNlLCBkZXZpY2VzVG9TdHJpbmcobmV3RGV2aWNlKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGNvbnN0IERldmljZVR5cGVTZXQgbmV3RGV2aWNlcyA9IGdldERldmljZVR5cGVzKCk7CisgICAgICAgICAgICBtTG9jYWxMb2cubG9nKCJDRkdfRVZFTlRfUkVMRUFTRV9BVURJT19QQVRDSDogb2xkIGRldmljZSAlcyAoJXMpIG5ldyBkZXZpY2UgJXMgKCVzKSIsCisgICAgICAgICAgICAgICAgICAgIGR1bXBEZXZpY2VUeXBlcyhvbGREZXZpY2VzKS5jX3N0cigpLCB0b1N0cmluZyhvbGREZXZpY2VzKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICBkdW1wRGV2aWNlVHlwZXMobmV3RGV2aWNlcykuY19zdHIoKSwgdG9TdHJpbmcobmV3RGV2aWNlcykuY19zdHIoKSk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgQ0ZHX0VWRU5UX1VQREFURV9PVVRfREVWSUNFOiB7CisgICAgICAgICAgICBVcGRhdGVPdXREZXZpY2VzQ29uZmlnRXZlbnREYXRhICpkYXRhID0KKyAgICAgICAgICAgICAgICAgICAgKFVwZGF0ZU91dERldmljZXNDb25maWdFdmVudERhdGEgKilldmVudC0+bURhdGEuZ2V0KCk7CisgICAgICAgICAgICB1cGRhdGVPdXREZXZpY2VzKGRhdGEtPm1PdXREZXZpY2VzKTsKICAgICAgICAgfSBicmVhazsKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGZhbHNlLCAicHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkgdW5rbm93biBldmVudCB0eXBlICVkIiwgZXZlbnQtPm1UeXBlKTsKQEAgLTc0OSw2ICs3NDIsNyBAQAogICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihtYXNrKTsKIAogICAgIHN3aXRjaCAocmVwcmVzZW50YXRpb24pIHsKKyAgICAvLyBUcmF2ZWwgYWxsIHNpbmdsZSBiaXQgY2hhbm5lbCBtYXNrIHRvIGNvbnZlcnQgY2hhbm5lbCBtYXNrIHRvIHN0cmluZy4KICAgICBjYXNlIEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fUE9TSVRJT046IHsKICAgICAgICAgaWYgKG91dHB1dCkgewogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9GUk9OVF9MRUZUKSBzLmFwcGVuZCgiZnJvbnQtbGVmdCwgIik7CkBAIC03NjksNiArNzYzLDEwIEBACiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX0xFRlQpIHMuYXBwZW5kKCJ0b3AtYmFjay1sZWZ0LCAiKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX0JBQ0tfQ0VOVEVSKSBzLmFwcGVuZCgidG9wLWJhY2stY2VudGVyLCAiICk7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX1RPUF9CQUNLX1JJR0hUKSBzLmFwcGVuZCgidG9wLWJhY2stcmlnaHQsICIgKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX1NJREVfTEVGVCkgcy5hcHBlbmQoInRvcC1zaWRlLWxlZnQsICIgKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9PVVRfVE9QX1NJREVfUklHSFQpIHMuYXBwZW5kKCJ0b3Atc2lkZS1yaWdodCwgIiApOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX09VVF9IQVBUSUNfQikgcy5hcHBlbmQoImhhcHRpYy1CLCAiICk7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfT1VUX0hBUFRJQ19BKSBzLmFwcGVuZCgiaGFwdGljLUEsICIgKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgfkFVRElPX0NIQU5ORUxfT1VUX0FMTCkgcy5hcHBlbmQoInVua25vd24sICAiKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9MRUZUKSBzLmFwcGVuZCgibGVmdCwgIik7CkBAIC03ODMsNiArNzgxLDEyIEBACiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWF9BWElTKSBzLmFwcGVuZCgiWCwgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWV9BWElTKSBzLmFwcGVuZCgiWSwgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fWl9BWElTKSBzLmFwcGVuZCgiWiwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fQkFDS19MRUZUKSBzLmFwcGVuZCgiYmFjay1sZWZ0LCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9CQUNLX1JJR0hUKSBzLmFwcGVuZCgiYmFjay1yaWdodCwgIik7CisgICAgICAgICAgICBpZiAobWFzayAmIEFVRElPX0NIQU5ORUxfSU5fQ0VOVEVSKSBzLmFwcGVuZCgiY2VudGVyLCAiKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9MT1dfRlJFUVVFTkNZKSBzLmFwcGVuZCgibG93IGZyZXEsICIpOworICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1RPUF9MRUZUKSBzLmFwcGVuZCgidG9wLWxlZnQsICIgKTsKKyAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9UT1BfUklHSFQpIHMuYXBwZW5kKCJ0b3AtcmlnaHQsICIgKTsKICAgICAgICAgICAgIGlmIChtYXNrICYgQVVESU9fQ0hBTk5FTF9JTl9WT0lDRV9VUExJTkspIHMuYXBwZW5kKCJ2b2ljZS11cGxpbmssICIpOwogICAgICAgICAgICAgaWYgKG1hc2sgJiBBVURJT19DSEFOTkVMX0lOX1ZPSUNFX0ROTElOSykgcy5hcHBlbmQoInZvaWNlLWRubGluaywgIik7CiAgICAgICAgICAgICBpZiAobWFzayAmIH5BVURJT19DSEFOTkVMX0lOX0FMTCkgcy5hcHBlbmQoInVua25vd24sICAiKTsKQEAgLTgwNCwxMiArODA4LDggQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpkdW1wQmFzZShpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KICAgICBkcHJpbnRmKGZkLCAiXG4lcyB0aHJlYWQgJXAsIG5hbWUgJXMsIHRpZCAlZCwgdHlwZSAlZCAoJXMpOlxuIiwgaXNPdXRwdXQoKSA/ICJPdXRwdXQiIDogIklucHV0IiwKICAgICAgICAgICAgIHRoaXMsIG1UaHJlYWROYW1lLCBnZXRUaWQoKSwgdHlwZSgpLCB0aHJlYWRUeXBlVG9TdHJpbmcodHlwZSgpKSk7CiAKQEAgLTgxOCw2ICs4MTgsMjEgQEAKICAgICAgICAgZHByaW50ZihmZCwgIiAgVGhyZWFkIG1heSBiZSBkZWFkbG9ja2VkXG4iKTsKICAgICB9CiAKKyAgICBkdW1wQmFzZV9sKGZkLCBhcmdzKTsKKyAgICBkdW1wSW50ZXJuYWxzX2woZmQsIGFyZ3MpOworICAgIGR1bXBUcmFja3NfbChmZCwgYXJncyk7CisgICAgZHVtcEVmZmVjdENoYWluc19sKGZkLCBhcmdzKTsKKworICAgIGlmIChsb2NrZWQpIHsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgfQorCisgICAgZHByaW50ZihmZCwgIiAgTG9jYWwgbG9nOlxuIik7CisgICAgbUxvY2FsTG9nLmR1bXAoZmQsICIgICAiIC8qIHByZWZpeCAqLywgNDAgLyogbGluZXMgKi8pOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6ZHVtcEJhc2VfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCit7CiAgICAgZHByaW50ZihmZCwgIiAgSS9PIGhhbmRsZTogJWRcbiIsIG1JZCk7CiAgICAgZHByaW50ZihmZCwgIiAgU3RhbmRieTogJXNcbiIsIG1TdGFuZGJ5ID8gInllcyIgOiAibm8iKTsKICAgICBkcHJpbnRmKGZkLCAiICBTYW1wbGUgcmF0ZTogJXUgSHpcbiIsIG1TYW1wbGVSYXRlKTsKQEAgLTgzMiw2ICs4NDcsOCBAQAogICAgIGRwcmludGYoZmQsICIgIFBlbmRpbmcgY29uZmlnIGV2ZW50czoiKTsKICAgICBzaXplX3QgbnVtQ29uZmlnID0gbUNvbmZpZ0V2ZW50cy5zaXplKCk7CiAgICAgaWYgKG51bUNvbmZpZykgeworICAgICAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKKyAgICAgICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtQ29uZmlnOyBpKyspIHsKICAgICAgICAgICAgIG1Db25maWdFdmVudHNbaV0tPmR1bXAoYnVmZmVyLCBTSVpFKTsKICAgICAgICAgICAgIGRwcmludGYoZmQsICJcbiAgICAlcyIsIGJ1ZmZlcik7CkBAIC04NDEsMjAgKzg1OCw0OSBAQAogICAgICAgICBkcHJpbnRmKGZkLCAiIG5vbmVcbiIpOwogICAgIH0KICAgICAvLyBOb3RlOiBvdXRwdXQgZGV2aWNlIG1heSBiZSB1c2VkIGJ5IGNhcHR1cmUgdGhyZWFkcyBmb3IgZWZmZWN0cyBzdWNoIGFzIEFFQy4KLSAgICBkcHJpbnRmKGZkLCAiICBPdXRwdXQgZGV2aWNlOiAlI3ggKCVzKVxuIiwgbU91dERldmljZSwgZGV2aWNlc1RvU3RyaW5nKG1PdXREZXZpY2UpLmNfc3RyKCkpOwotICAgIGRwcmludGYoZmQsICIgIElucHV0IGRldmljZTogJSN4ICglcylcbiIsIG1JbkRldmljZSwgZGV2aWNlc1RvU3RyaW5nKG1JbkRldmljZSkuY19zdHIoKSk7Ci0gICAgZHByaW50ZihmZCwgIiAgQXVkaW8gc291cmNlOiAlZCAoJXMpXG4iLCBtQXVkaW9Tb3VyY2UsIHNvdXJjZVRvU3RyaW5nKG1BdWRpb1NvdXJjZSkpOworICAgIGRwcmludGYoZmQsICIgIE91dHB1dCBkZXZpY2VzOiAlcyAoJXMpXG4iLAorICAgICAgICAgICAgZHVtcERldmljZVR5cGVzKG91dERldmljZVR5cGVzKCkpLmNfc3RyKCksIHRvU3RyaW5nKG91dERldmljZVR5cGVzKCkpLmNfc3RyKCkpOworICAgIGRwcmludGYoZmQsICIgIElucHV0IGRldmljZTogJSN4ICglcylcbiIsCisgICAgICAgICAgICBpbkRldmljZVR5cGUoKSwgdG9TdHJpbmcoaW5EZXZpY2VUeXBlKCkpLmNfc3RyKCkpOworICAgIGRwcmludGYoZmQsICIgIEF1ZGlvIHNvdXJjZTogJWQgKCVzKVxuIiwgbUF1ZGlvU291cmNlLCB0b1N0cmluZyhtQXVkaW9Tb3VyY2UpLmNfc3RyKCkpOwogCi0gICAgaWYgKGxvY2tlZCkgewotICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAvLyBEdW1wIHRpbWVzdGFtcCBzdGF0aXN0aWNzIGZvciB0aGUgVGhyZWFkIHR5cGVzIHRoYXQgc3VwcG9ydCBpdC4KKyAgICBpZiAobVR5cGUgPT0gUkVDT1JECisgICAgICAgICAgICB8fCBtVHlwZSA9PSBNSVhFUgorICAgICAgICAgICAgfHwgbVR5cGUgPT0gRFVQTElDQVRJTkcKKyAgICAgICAgICAgIHx8IG1UeXBlID09IERJUkVDVAorICAgICAgICAgICAgfHwgbVR5cGUgPT0gT0ZGTE9BRCkgeworICAgICAgICBkcHJpbnRmKGZkLCAiICBUaW1lc3RhbXAgc3RhdHM6ICVzXG4iLCBtVGltZXN0YW1wVmVyaWZpZXIudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgVGltZXN0YW1wIGNvcnJlY3RlZDogJXNcbiIsIGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSA/ICJ5ZXMiIDogIm5vIik7CisgICAgfQorCisgICAgaWYgKG1MYXN0SW9CZWdpbk5zID4gMCkgeyAvLyBNTUFQIG1heSBub3Qgc2V0IHRoaXMKKyAgICAgICAgZHByaW50ZihmZCwgIiAgTGFzdCAlcyBvY2N1cnJlZCAobXNlY3MpOiAlbGxkXG4iLAorICAgICAgICAgICAgICAgIGlzT3V0cHV0KCkgPyAid3JpdGUiIDogInJlYWQiLAorICAgICAgICAgICAgICAgIChsb25nIGxvbmcpIChzeXN0ZW1UaW1lKCkgLSBtTGFzdElvQmVnaW5OcykgLyBOQU5PU19QRVJfTUlMTElTRUNPTkQpOworICAgIH0KKworICAgIGlmIChtUHJvY2Vzc1RpbWVNcy5nZXROKCkgPiAwKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIFByb2Nlc3MgdGltZSBtcyBzdGF0czogJXNcbiIsIG1Qcm9jZXNzVGltZU1zLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgfQorCisgICAgaWYgKG1Jb0ppdHRlck1zLmdldE4oKSA+IDApIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgSGFsICVzIGppdHRlciBtcyBzdGF0czogJXNcbiIsCisgICAgICAgICAgICAgICAgaXNPdXRwdXQoKSA/ICJ3cml0ZSIgOiAicmVhZCIsCisgICAgICAgICAgICAgICAgbUlvSml0dGVyTXMudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICB9CisKKyAgICBpZiAobUxhdGVuY3lNcy5nZXROKCkgPiAwKSB7CisgICAgICAgIGRwcmludGYoZmQsICIgIFRocmVhZGxvb3AgJXMgbGF0ZW5jeSBzdGF0czogJXNcbiIsCisgICAgICAgICAgICAgICAgaXNPdXRwdXQoKSA/ICJ3cml0ZSIgOiAicmVhZCIsCisgICAgICAgICAgICAgICAgbUxhdGVuY3lNcy50b1N0cmluZygpLmNfc3RyKCkpOwogICAgIH0KIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmR1bXBFZmZlY3RDaGFpbnMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQordm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OmR1bXBFZmZlY3RDaGFpbnNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCiB7CiAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7CiAgICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7CiAKICAgICBzaXplX3QgbnVtRWZmZWN0Q2hhaW5zID0gbUVmZmVjdENoYWlucy5zaXplKCk7CiAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAlenUgRWZmZWN0IENoYWluc1xuIiwgbnVtRWZmZWN0Q2hhaW5zKTsKQEAgLTk4NSw2ICsxMDMxLDEyIEBACiAgICAgbVBvd2VyTWFuYWdlci5jbGVhcigpOwogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6dXBkYXRlT3V0RGV2aWNlcygKKyAgICAgICAgY29uc3QgRGV2aWNlRGVzY3JpcHRvckJhc2VWZWN0b3ImIG91dERldmljZXMgX191bnVzZWQpCit7CisgICAgQUxPR0UoIiVzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiBSZWNvcmRUaHJlYWQiLCBfX2Z1bmNfXyk7Cit9CisKIHZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpQTURlYXRoUmVjaXBpZW50OjpiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+JiB3aG8gX191bnVzZWQpCiB7CiAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CkBAIC0xMDk0LDMyICsxMTQ2LDI2IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6Y2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpCi17Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBjaGVja1N1c3BlbmRPbkVmZmVjdEVuYWJsZWRfbChlZmZlY3QsIGVuYWJsZWQsIHNlc3Npb25JZCk7Ci19Cit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6Y2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKGJvb2wgZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0aHJlYWRMb2NrZWQpIHsKKyAgICBpZiAoIXRocmVhZExvY2tlZCkgeworICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6Y2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkX2woY29uc3Qgc3A8RWZmZWN0TW9kdWxlPiYgZWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkKLXsKICAgICBpZiAobVR5cGUgIT0gUkVDT1JEKSB7CiAgICAgICAgIC8vIHN1c3BlbmQgYWxsIGVmZmVjdHMgaW4gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYIHdoZW4gZW5hYmxpbmcgYW55IGVmZmVjdCBvbgogICAgICAgICAvLyBhbm90aGVyIHNlc3Npb24uIFRoaXMgZ2l2ZXMgdGhlIHByaW9yaXR5IHRvIHdlbGwgYmVoYXZlZCBlZmZlY3QgY29udHJvbCBwYW5lbHMKICAgICAgICAgLy8gYW5kIGFwcGxpY2F0aW9ucyBub3QgdXNpbmcgZ2xvYmFsIGVmZmVjdHMuCiAgICAgICAgIC8vIEVuYWJsaW5nIHBvc3QgcHJvY2Vzc2luZyBpbiBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSBzZXNzaW9uIGRvZXMgbm90IGFmZmVjdAogICAgICAgICAvLyBnbG9iYWwgZWZmZWN0cwotICAgICAgICBpZiAoKHNlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpICYmIChzZXNzaW9uSWQgIT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UpKSB7CisgICAgICAgIGlmICghYXVkaW9faXNfZ2xvYmFsX3Nlc3Npb24oc2Vzc2lvbklkKSkgewogICAgICAgICAgICAgc2V0RWZmZWN0U3VzcGVuZGVkX2woTlVMTCwgZW5hYmxlZCwgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKTsKICAgICAgICAgfQogICAgIH0KIAotICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2woc2Vzc2lvbklkKTsKLSAgICBpZiAoY2hhaW4gIT0gMCkgewotICAgICAgICBjaGFpbi0+Y2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKGVmZmVjdCwgZW5hYmxlZCk7CisgICAgaWYgKCF0aHJlYWRMb2NrZWQpIHsKKyAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgfQogfQogCkBAIC0xMTI3LDggKzExNzMsOSBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmNoZWNrRWZmZWN0Q29tcGF0aWJpbGl0eV9sKAogICAgICAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKQogewotICAgIC8vIE5vIGdsb2JhbCBlZmZlY3Qgc2Vzc2lvbnMgb24gcmVjb3JkIHRocmVhZHMKLSAgICBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCB8fCBzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UpIHsKKyAgICAvLyBObyBnbG9iYWwgb3V0cHV0IGVmZmVjdCBzZXNzaW9ucyBvbiByZWNvcmQgdGhyZWFkcworICAgIGlmIChzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYCisgICAgICAgICAgICB8fCBzZXNzaW9uSWQgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UpIHsKICAgICAgICAgQUxPR1coImNoZWNrRWZmZWN0Q29tcGF0aWJpbGl0eV9sKCk6IGdsb2JhbCBlZmZlY3QgJXMgb24gcmVjb3JkIHRocmVhZCAlcyIsCiAgICAgICAgICAgICAgICAgZGVzYy0+bmFtZSwgbVRocmVhZE5hbWUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMTIwMiw2ICsxMjQ5LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBvbiBvdXRwdXQgc3RhZ2Ugc2Vzc2lvbiIsIGRlc2MtPm5hbWUpOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSBpZiAoc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fREVWSUNFKSB7CisgICAgICAgICAgICAgICAgLy8gb25seSBwb3N0IHByb2Nlc3Npbmcgb24gb3V0cHV0IHN0YWdlIHNlc3Npb24KKyAgICAgICAgICAgICAgICBpZiAoKGRlc2MtPmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSAhPSBFRkZFQ1RfRkxBR19UWVBFX1BPU1RfUFJPQykgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5X2woKTogbm9uIHBvc3QgcHJvY2Vzc2luZyBlZmZlY3QgJXMgbm90IGFsbG93ZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBvbiBkZXZpY2Ugc2Vzc2lvbiIsIGRlc2MtPm5hbWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgLy8gbm8gcmVzdHJpY3Rpb24gb24gZWZmZWN0cyBhcHBsaWVkIG9uIG5vbiBmYXN0IHRyYWNrcwogICAgICAgICAgICAgICAgIGlmICgoaGFzQXVkaW9TZXNzaW9uX2woc2Vzc2lvbklkKSAmIFRocmVhZEJhc2U6OkZBU1RfU0VTU0lPTikgPT0gMCkgewpAQCAtMTI0Myw3ICsxMjk3LDcgQEAKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICNlbmRpZgotICAgICAgICBpZiAoKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSkgfHwgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpKSB7CisgICAgICAgIGlmIChhdWRpb19pc19nbG9iYWxfc2Vzc2lvbihzZXNzaW9uSWQpKSB7CiAgICAgICAgICAgICBBTE9HVygiY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5X2woKTogZ2xvYmFsIGVmZmVjdCAlcyBvbiBEVVBMSUNBVElORyIKICAgICAgICAgICAgICAgICAgICAgIiB0aHJlYWQgJXMiLCBkZXNjLT5uYW1lLCBtVGhyZWFkTmFtZSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMTI4Myw3ICsxMzM3LDYgQEAKICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW47CiAgICAgYm9vbCBjaGFpbkNyZWF0ZWQgPSBmYWxzZTsKICAgICBib29sIGVmZmVjdENyZWF0ZWQgPSBmYWxzZTsKLSAgICBib29sIGVmZmVjdFJlZ2lzdGVyZWQgPSBmYWxzZTsKICAgICBhdWRpb191bmlxdWVfaWRfdCBlZmZlY3RJZCA9IEFVRElPX1VOSVFVRV9JRF9VU0VfVU5TUEVDSUZJRUQ7CiAKICAgICBsU3RhdHVzID0gaW5pdENoZWNrKCk7CkBAIC0xMzE5LDIyICsxMzcyLDE2IEBACiAKICAgICAgICAgaWYgKGVmZmVjdCA9PSAwKSB7CiAgICAgICAgICAgICBlZmZlY3RJZCA9IG1BdWRpb0ZsaW5nZXItPm5leHRVbmlxdWVJZChBVURJT19VTklRVUVfSURfVVNFX0VGRkVDVCk7Ci0gICAgICAgICAgICAvLyBDaGVjayBDUFUgYW5kIG1lbW9yeSB1c2FnZQotICAgICAgICAgICAgbFN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpyZWdpc3RlckVmZmVjdCgKLSAgICAgICAgICAgICAgICAgICAgZGVzYywgbUlkLCBjaGFpbi0+c3RyYXRlZ3koKSwgc2Vzc2lvbklkLCBlZmZlY3RJZCk7Ci0gICAgICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGdvdG8gRXhpdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVmZmVjdFJlZ2lzdGVyZWQgPSB0cnVlOwogICAgICAgICAgICAgLy8gY3JlYXRlIGEgbmV3IGVmZmVjdCBtb2R1bGUgaWYgbm9uZSBwcmVzZW50IGluIHRoZSBjaGFpbgotICAgICAgICAgICAgbFN0YXR1cyA9IGNoYWluLT5jcmVhdGVFZmZlY3RfbChlZmZlY3QsIHRoaXMsIGRlc2MsIGVmZmVjdElkLCBzZXNzaW9uSWQsIHBpbm5lZCk7CisgICAgICAgICAgICBsU3RhdHVzID0gY2hhaW4tPmNyZWF0ZUVmZmVjdF9sKGVmZmVjdCwgZGVzYywgZWZmZWN0SWQsIHNlc3Npb25JZCwgcGlubmVkKTsKICAgICAgICAgICAgIGlmIChsU3RhdHVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgZ290byBFeGl0OwogICAgICAgICAgICAgfQogICAgICAgICAgICAgZWZmZWN0Q3JlYXRlZCA9IHRydWU7CiAKLSAgICAgICAgICAgIGVmZmVjdC0+c2V0RGV2aWNlKG1PdXREZXZpY2UpOwotICAgICAgICAgICAgZWZmZWN0LT5zZXREZXZpY2UobUluRGV2aWNlKTsKKyAgICAgICAgICAgIC8vIEZJWE1FOiB1c2UgdmVjdG9yIG9mIGRldmljZSBhbmQgYWRkcmVzcyB3aGVuIGVmZmVjdCBpbnRlcmZhY2UgaXMgcmVhZHkuCisgICAgICAgICAgICBlZmZlY3QtPnNldERldmljZXMob3V0RGV2aWNlVHlwZUFkZHJzKCkpOworICAgICAgICAgICAgZWZmZWN0LT5zZXRJbnB1dERldmljZShpbkRldmljZVR5cGVBZGRyKCkpOwogICAgICAgICAgICAgZWZmZWN0LT5zZXRNb2RlKG1BdWRpb0ZsaW5nZXItPmdldE1vZGUoKSk7CiAgICAgICAgICAgICBlZmZlY3QtPnNldEF1ZGlvU291cmNlKG1BdWRpb1NvdXJjZSk7CiAgICAgICAgIH0KQEAgLTEzNTUsOSArMTQwMiw2IEBACiAgICAgICAgIGlmIChlZmZlY3RDcmVhdGVkKSB7CiAgICAgICAgICAgICBjaGFpbi0+cmVtb3ZlRWZmZWN0X2woZWZmZWN0KTsKICAgICAgICAgfQotICAgICAgICBpZiAoZWZmZWN0UmVnaXN0ZXJlZCkgewotICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnVucmVnaXN0ZXJFZmZlY3QoZWZmZWN0SWQpOwotICAgICAgICB9CiAgICAgICAgIGlmIChjaGFpbkNyZWF0ZWQpIHsKICAgICAgICAgICAgIHJlbW92ZUVmZmVjdENoYWluX2woY2hhaW4pOwogICAgICAgICB9CkBAIC0xMzc1LDkgKzE0MTksMTIgQEAKICAgICBzcDxFZmZlY3RNb2R1bGU+IGVmZmVjdDsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0KLSAgICAgICAgZWZmZWN0ID0gaGFuZGxlLT5lZmZlY3QoKS5wcm9tb3RlKCk7Ci0gICAgICAgIGlmIChlZmZlY3QgPT0gMCkgeworICAgICAgICBzcDxFZmZlY3RCYXNlPiBlZmZlY3RCYXNlID0gaGFuZGxlLT5lZmZlY3QoKS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChlZmZlY3RCYXNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBlZmZlY3QgPSBlZmZlY3RCYXNlLT5hc0VmZmVjdE1vZHVsZSgpOworICAgICAgICBpZiAoZWZmZWN0ID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICAvLyByZXN0b3JlIHN1c3BlbmRlZCBlZmZlY3RzIGlmIHRoZSBkaXNjb25uZWN0ZWQgaGFuZGxlIHdhcyBlbmFibGVkIGFuZCB0aGUgbGFzdCBvbmUuCkBAIC0xMzg4LDEzICsxNDM1LDM1IEBACiAgICAgfQogICAgIGlmIChyZW1vdmUpIHsKICAgICAgICAgbUF1ZGlvRmxpbmdlci0+dXBkYXRlT3JwaGFuRWZmZWN0Q2hhaW5zKGVmZmVjdCk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjp1bnJlZ2lzdGVyRWZmZWN0KGVmZmVjdC0+aWQoKSk7CiAgICAgICAgIGlmIChoYW5kbGUtPmVuYWJsZWQoKSkgewotICAgICAgICAgICAgY2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKGVmZmVjdCwgZmFsc2UsIGVmZmVjdC0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgZWZmZWN0LT5jaGVja1N1c3BlbmRPbkVmZmVjdEVuYWJsZWQoZmFsc2UsIGZhbHNlIC8qdGhyZWFkTG9ja2VkKi8pOwogICAgICAgICB9CiAgICAgfQogfQogCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6b25FZmZlY3RFbmFibGUoY29uc3Qgc3A8RWZmZWN0TW9kdWxlPiYgZWZmZWN0KSB7CisgICAgaWYgKG1UeXBlID09IE9GRkxPQUQgfHwgbVR5cGUgPT0gTU1BUCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBicm9hZGNhc3RfbCgpOworICAgIH0KKyAgICBpZiAoIWVmZmVjdC0+aXNPZmZsb2FkYWJsZSgpKSB7CisgICAgICAgIGlmIChtVHlwZSA9PSBUaHJlYWRCYXNlOjpPRkZMT0FEKSB7CisgICAgICAgICAgICBQbGF5YmFja1RocmVhZCAqdCA9IChQbGF5YmFja1RocmVhZCAqKXRoaXM7CisgICAgICAgICAgICB0LT5pbnZhbGlkYXRlVHJhY2tzKEFVRElPX1NUUkVBTV9NVVNJQyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGVmZmVjdC0+c2Vzc2lvbklkKCkgPT0gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKSB7CisgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLT5vbk5vbk9mZmxvYWRhYmxlR2xvYmFsRWZmZWN0RW5hYmxlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpvbkVmZmVjdERpc2FibGUoKSB7CisgICAgaWYgKG1UeXBlID09IE9GRkxPQUQgfHwgbVR5cGUgPT0gTU1BUCkgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBicm9hZGNhc3RfbCgpOworICAgIH0KK30KKwogc3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU+IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6Z2V0RWZmZWN0KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgIGludCBlZmZlY3RJZCkKIHsKQEAgLTE0MDksNiArMTQ3OCwxMiBAQAogICAgIHJldHVybiBjaGFpbiAhPSAwID8gY2hhaW4tPmdldEVmZmVjdEZyb21JZF9sKGVmZmVjdElkKSA6IDA7CiB9CiAKK3N0ZDo6dmVjdG9yPGludD4gQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpnZXRFZmZlY3RJZHNfbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKQoreworICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2woc2Vzc2lvbklkKTsKKyAgICByZXR1cm4gY2hhaW4gIT0gbnVsbHB0ciA/IGNoYWluLT5nZXRFZmZlY3RJZHMoKSA6IHN0ZDo6dmVjdG9yPGludD57fTsKK30KKwogLy8gUGxheWJhY2tUaHJlYWQ6OmFkZEVmZmVjdF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGFuZAogLy8gUGxheWJhY2tUaHJlYWQ6Om1Mb2NrIGhlbGQKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6YWRkRWZmZWN0X2woY29uc3Qgc3A8RWZmZWN0TW9kdWxlPiYgZWZmZWN0KQpAQCAtMTQ0OCw4ICsxNTIzLDggQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKLSAgICBlZmZlY3QtPnNldERldmljZShtT3V0RGV2aWNlKTsKLSAgICBlZmZlY3QtPnNldERldmljZShtSW5EZXZpY2UpOworICAgIGVmZmVjdC0+c2V0RGV2aWNlcyhvdXREZXZpY2VUeXBlQWRkcnMoKSk7CisgICAgZWZmZWN0LT5zZXRJbnB1dERldmljZShpbkRldmljZVR5cGVBZGRyKCkpOwogICAgIGVmZmVjdC0+c2V0TW9kZShtQXVkaW9GbGluZ2VyLT5nZXRNb2RlKCkpOwogICAgIGVmZmVjdC0+c2V0QXVkaW9Tb3VyY2UobUF1ZGlvU291cmNlKTsKIApAQCAtMTQ2NCw3ICsxNTM5LDcgQEAKICAgICAgICAgZGV0YWNoQXV4RWZmZWN0X2woZWZmZWN0LT5pZCgpKTsKICAgICB9CiAKLSAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBlZmZlY3QtPmNoYWluKCkucHJvbW90ZSgpOworICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGVmZmVjdC0+Y2FsbGJhY2soKS0+Y2hhaW4oKS5wcm9tb3RlKCk7CiAgICAgaWYgKGNoYWluICE9IDApIHsKICAgICAgICAgLy8gcmVtb3ZlIGVmZmVjdCBjaGFpbiBpZiByZW1vdmluZyBsYXN0IGVmZmVjdAogICAgICAgICBpZiAoY2hhaW4tPnJlbW92ZUVmZmVjdF9sKGVmZmVjdCwgcmVsZWFzZSkgPT0gMCkgewpAQCAtMTUxOSw3ICsxNTk0LDcgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCiB7CiAgICAgY29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKICAgICBjb25maWctPmV4dC5taXguaGFuZGxlID0gbUlkOwpAQCAtMTU3MSw2ICsxNjQ2LDkgQEAKICAgICAtLW1CYXR0ZXJ5Q291bnRlclt0cmFjay0+dWlkKCldLnNlY29uZDsKICAgICAvLyBtTGF0ZXN0QWN0aXZlVHJhY2sgaXMgbm90IGNsZWFyZWQgZXZlbiBpZiBpcyB0aGUgc2FtZSBhcyB0cmFjay4KICAgICBtSGFzQ2hhbmdlZCA9IHRydWU7CisjaWZkZWYgVEVFX1NJTksKKyAgICB0cmFjay0+ZHVtcFRlZSgtMSAvKiBmZCAqLywgIl9SRU1PVkUiKTsKKyNlbmRpZgogICAgIHJldHVybiBpbmRleDsKIH0KIApAQCAtMTY0NSw2ICsxNzIzLDY1IEBACiAgICAgbVdhaXRXb3JrQ1YuYnJvYWRjYXN0KCk7CiB9CiAKKy8vIENhbGwgb25seSBmcm9tIHRocmVhZExvb3AoKSBvciB3aGVuIGl0IGlzIGlkbGUuCisvLyBEbyBub3QgY2FsbCBmcm9tIGhpZ2ggcGVyZm9ybWFuY2UgY29kZSBhcyB0aGlzIG1heSBkbyBiaW5kZXIgcnBjIHRvIHRoZSBNZWRpYU1ldHJpY3Mgc2VydmljZS4KK3ZvaWQgQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpzZW5kU3RhdGlzdGljcyhib29sIGZvcmNlKQoreworICAgIC8vIERvIG5vdCBsb2cgaWYgd2UgaGF2ZSBubyBzdGF0cy4KKyAgICAvLyBXZSBjaG9vc2UgdGhlIHRpbWVzdGFtcCB2ZXJpZmllciBiZWNhdXNlIGl0IGlzIHRoZSBtb3N0IGxpa2VseSBpdGVtIHRvIGJlIHByZXNlbnQuCisgICAgY29uc3QgaW50NjRfdCBuc3RhdHMgPSBtVGltZXN0YW1wVmVyaWZpZXIuZ2V0TigpIC0gbUxhc3RSZWNvcmRlZFRpbWVzdGFtcFZlcmlmaWVyTjsKKyAgICBpZiAobnN0YXRzID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIERvbid0IGxvZyBtb3JlIGZyZXF1ZW50bHkgdGhhbiBvbmNlIHBlciAxMiBob3Vycy4KKyAgICAvLyBXZSB1c2UgQk9PVFRJTUUgdG8gaW5jbHVkZSBzdXNwZW5kIHRpbWUuCisgICAgY29uc3QgaW50NjRfdCB0aW1lTnMgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX0JPT1RUSU1FKTsKKyAgICBjb25zdCBpbnQ2NF90IHNpbmNlTnMgPSB0aW1lTnMgLSBtTGFzdFJlY29yZGVkVGltZU5zOyAvLyBvayBpZiBtTGFzdFJlY29yZGVkVGltZU5zID0gMAorICAgIGlmICghZm9yY2UgJiYgc2luY2VOcyA8PSAxMiAqIE5BTk9TX1BFUl9IT1VSKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtTGFzdFJlY29yZGVkVGltZXN0YW1wVmVyaWZpZXJOID0gbVRpbWVzdGFtcFZlcmlmaWVyLmdldE4oKTsKKyAgICBtTGFzdFJlY29yZGVkVGltZU5zID0gdGltZU5zOworCisgICAgc3RkOjp1bmlxdWVfcHRyPE1lZGlhQW5hbHl0aWNzSXRlbT4gaXRlbShNZWRpYUFuYWx5dGljc0l0ZW06OmNyZWF0ZSgiYXVkaW90aHJlYWQiKSk7CisKKyNkZWZpbmUgTU1fUFJFRklYICJhbmRyb2lkLm1lZGlhLmF1ZGlvdGhyZWFkLiIgLy8gYXZvaWQgY3V0LW4tcGFzdGUgZXJyb3JzLgorCisgICAgLy8gdGhyZWFkIGNvbmZpZ3VyYXRpb24KKyAgICBpdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggImlkIiwgKGludDMyX3QpbUlkKTsgLy8gSU8gaGFuZGxlCisgICAgLy8gaXRlbS0+c2V0SW50MzIoTU1fUFJFRklYICJwb3J0SWQiLCAoaW50MzJfdCltUG9ydElkKTsKKyAgICBpdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAidHlwZSIsIHRocmVhZFR5cGVUb1N0cmluZyhtVHlwZSkpOworICAgIGl0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAic2FtcGxlUmF0ZSIsIChpbnQzMl90KW1TYW1wbGVSYXRlKTsKKyAgICBpdGVtLT5zZXRJbnQ2NChNTV9QUkVGSVggImNoYW5uZWxNYXNrIiwgKGludDY0X3QpbUNoYW5uZWxNYXNrKTsKKyAgICBpdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAiZW5jb2RpbmciLCB0b1N0cmluZyhtRm9ybWF0KS5jX3N0cigpKTsKKyAgICBpdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggImZyYW1lQ291bnQiLCAoaW50MzJfdCltRnJhbWVDb3VudCk7CisgICAgaXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggIm91dERldmljZSIsIHRvU3RyaW5nKG91dERldmljZVR5cGVzKCkpLmNfc3RyKCkpOworICAgIGl0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJpbkRldmljZSIsIHRvU3RyaW5nKGluRGV2aWNlVHlwZSgpKS5jX3N0cigpKTsKKworICAgIC8vIHRocmVhZCBzdGF0aXN0aWNzCisgICAgaWYgKG1Jb0ppdHRlck1zLmdldE4oKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAiaW9KaXR0ZXJNcy5tZWFuIiwgbUlvSml0dGVyTXMuZ2V0TWVhbigpKTsKKyAgICAgICAgaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAiaW9KaXR0ZXJNcy5zdGQiLCBtSW9KaXR0ZXJNcy5nZXRTdGREZXYoKSk7CisgICAgfQorICAgIGlmIChtUHJvY2Vzc1RpbWVNcy5nZXROKCkgPiAwKSB7CisgICAgICAgIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggInByb2Nlc3NUaW1lTXMubWVhbiIsIG1Qcm9jZXNzVGltZU1zLmdldE1lYW4oKSk7CisgICAgICAgIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggInByb2Nlc3NUaW1lTXMuc3RkIiwgbVByb2Nlc3NUaW1lTXMuZ2V0U3RkRGV2KCkpOworICAgIH0KKyAgICBjb25zdCBhdXRvIHRzaml0dGVyID0gbVRpbWVzdGFtcFZlcmlmaWVyLmdldEppdHRlck1zKCk7CisgICAgaWYgKHRzaml0dGVyLmdldE4oKSA+IDApIHsKKyAgICAgICAgaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAidGltZXN0YW1wSml0dGVyTXMubWVhbiIsIHRzaml0dGVyLmdldE1lYW4oKSk7CisgICAgICAgIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggInRpbWVzdGFtcEppdHRlck1zLnN0ZCIsIHRzaml0dGVyLmdldFN0ZERldigpKTsKKyAgICB9CisgICAgaWYgKG1MYXRlbmN5TXMuZ2V0TigpID4gMCkgeworICAgICAgICBpdGVtLT5zZXREb3VibGUoTU1fUFJFRklYICJsYXRlbmN5TXMubWVhbiIsIG1MYXRlbmN5TXMuZ2V0TWVhbigpKTsKKyAgICAgICAgaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAibGF0ZW5jeU1zLnN0ZCIsIG1MYXRlbmN5TXMuZ2V0U3RkRGV2KCkpOworICAgIH0KKworICAgIGl0ZW0tPnNlbGZyZWNvcmQoKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICBQbGF5YmFjawogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTY1MiwxMCArMTc4OSw5IEBACiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpQbGF5YmFja1RocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV90IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN5c3RlbVJlYWR5KQotICAgIDogICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQsIGRldmljZSwgQVVESU9fREVWSUNFX05PTkUsIHR5cGUsIHN5c3RlbVJlYWR5KSwKKyAgICA6ICAgVGhyZWFkQmFzZShhdWRpb0ZsaW5nZXIsIGlkLCB0eXBlLCBzeXN0ZW1SZWFkeSksCiAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50KDApLCBtU2lua0J1ZmZlcihOVUxMKSwKICAgICAgICAgbU1peGVyQnVmZmVyRW5hYmxlZChBdWRpb0ZsaW5nZXI6OmtFbmFibGVFeHRlbmRlZFByZWNpc2lvbiksCiAgICAgICAgIG1NaXhlckJ1ZmZlcihOVUxMKSwKQEAgLTE2NzQsNyArMTgxMCw3IEBACiAgICAgICAgIC8vIG1TdHJlYW1UeXBlc1tdIGluaXRpYWxpemVkIGluIGNvbnN0cnVjdG9yIGJvZHkKICAgICAgICAgbVRyYWNrcyh0eXBlID09IE1JWEVSKSwKICAgICAgICAgbU91dHB1dChvdXRwdXQpLAotICAgICAgICBtTGFzdFdyaXRlVGltZSgtMSksIG1OdW1Xcml0ZXMoMCksIG1OdW1EZWxheWVkV3JpdGVzKDApLCBtSW5Xcml0ZShmYWxzZSksCisgICAgICAgIG1OdW1Xcml0ZXMoMCksIG1OdW1EZWxheWVkV3JpdGVzKDApLCBtSW5Xcml0ZShmYWxzZSksCiAgICAgICAgIG1NaXhlclN0YXR1cyhNSVhFUl9JRExFKSwKICAgICAgICAgbU1peGVyU3RhdHVzSWdub3JpbmdGYXN0VHJhY2tzKE1JWEVSX0lETEUpLAogICAgICAgICBtU3RhbmRieURlbGF5TnMoQXVkaW9GbGluZ2VyOjptU3RhbmRieVRpbWVJbk5zZWNzKSwKQEAgLTE3MDksMTAgKzE4NDUsMjIgQEAKICAgICAgICAgaWYgKG1PdXRwdXQtPmF1ZGlvSHdEZXYtPmNhblNldE1hc3Rlck11dGUoKSkgewogICAgICAgICAgICAgbU1hc3Rlck11dGUgPSBmYWxzZTsKICAgICAgICAgfQorICAgICAgICBtSXNNc2REZXZpY2UgPSBzdHJjbXAoCisgICAgICAgICAgICAgICAgbU91dHB1dC0+YXVkaW9Id0Rldi0+bW9kdWxlTmFtZSgpLCBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSA9PSAwOwogICAgIH0KIAogICAgIHJlYWRPdXRwdXRQYXJhbWV0ZXJzX2woKTsKIAorICAgIC8vIFRPRE86IFdlIG1heSBhbHNvIG1hdGNoIG9uIGFkZHJlc3MgYXMgd2VsbCBhcyBkZXZpY2UgdHlwZSBmb3IKKyAgICAvLyBBVURJT19ERVZJQ0VfT1VUX0JVUywgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCwgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYCisgICAgaWYgKHR5cGUgPT0gTUlYRVIgfHwgdHlwZSA9PSBESVJFQ1QgfHwgdHlwZSA9PSBPRkZMT0FEKSB7CisgICAgICAgIC8vIFRPRE86IFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIGVuc3VyZSB0aGF0IG9ubHkgY29udGFpbnMgb25lIHNpbmdsZSBkZXZpY2UgdHlwZS4KKyAgICAgICAgbVRpbWVzdGFtcENvcnJlY3RlZERldmljZSA9IChhdWRpb19kZXZpY2VzX3QpcHJvcGVydHlfZ2V0X2ludDY0KAorICAgICAgICAgICAgICAgICJhdWRpby50aW1lc3RhbXAuY29ycmVjdGVkX291dHB1dF9kZXZpY2UiLAorICAgICAgICAgICAgICAgIChpbnQ2NF90KShtSXNNc2REZXZpY2UgPyBBVURJT19ERVZJQ0VfT1VUX0JVUyAvLyB0dXJuIG9uIGJ5IGRlZmF1bHQgZm9yIE1TRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVURJT19ERVZJQ0VfTk9ORSkpOworICAgIH0KKwogICAgIC8vICsrIG9wZXJhdG9yIGRvZXMgbm90IGNvbXBpbGUKICAgICBmb3IgKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gQVVESU9fU1RSRUFNX01JTjsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOwogICAgICAgICAgICAgc3RyZWFtID0gKGF1ZGlvX3N0cmVhbV90eXBlX3QpIChzdHJlYW0gKyAxKSkgewpAQCAtMTczMiwxNiArMTg4MCwyNCBAQAogICAgIGZyZWUobUVmZmVjdEJ1ZmZlcik7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCisvLyBUaHJlYWQgdmlydHVhbHMKKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpvbkZpcnN0UmVmKCkKIHsKLSAgICBkdW1wSW50ZXJuYWxzKGZkLCBhcmdzKTsKLSAgICBkdW1wVHJhY2tzKGZkLCBhcmdzKTsKLSAgICBkdW1wRWZmZWN0Q2hhaW5zKGZkLCBhcmdzKTsKLSAgICBkcHJpbnRmKGZkLCAiICBMb2NhbCBsb2c6XG4iKTsKLSAgICBtTG9jYWxMb2cuZHVtcChmZCwgIiAgICIgLyogcHJlZml4ICovLCA0MCAvKiBsaW5lcyAqLyk7CisgICAgcnVuKG1UaHJlYWROYW1lLCBBTkRST0lEX1BSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCisvLyBUaHJlYWRCYXNlIHZpcnR1YWxzCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnByZUV4aXQoKQoreworICAgIEFMT0dWKCIgIHByZUV4aXQoKSIpOworICAgIC8vIEZJWE1FIHRoaXMgaXMgdXNpbmcgaGFyZC1jb2RlZCBzdHJpbmdzIGJ1dCBpbiB0aGUgZnV0dXJlLCB0aGlzIGZ1bmN0aW9uYWxpdHkgd2lsbCBiZQorICAgIC8vICAgICAgIGNvbnZlcnRlZCB0byB1c2UgYXVkaW8gSEFMIGV4dGVuc2lvbnMgcmVxdWlyZWQgdG8gc3VwcG9ydCB0dW5uZWxpbmcKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBtT3V0cHV0LT5zdHJlYW0tPnNldFBhcmFtZXRlcnMoU3RyaW5nOCgiZXhpdGluZz0xIikpOworICAgIEFMT0dFX0lGKHJlc3VsdCAhPSBPSywgIkVycm9yIHdoZW4gc2V0dGluZyBwYXJhbWV0ZXJzIG9uIGV4aXQ6ICVkIiwgcmVzdWx0KTsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpkdW1wVHJhY2tzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewogICAgIFN0cmluZzggcmVzdWx0OwogCkBAIC0xNzczLDcgKzE5MjksNyBAQAogICAgIGlmIChudW10cmFja3MpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiBvZiB3aGljaCAlenUgYXJlIGFjdGl2ZVxuIiwgbnVtYWN0aXZlKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwotICAgICAgICBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOworICAgICAgICBtVHJhY2tzWzBdLT5hcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzOyArK2kpIHsKICAgICAgICAgICAgIHNwPFRyYWNrPiB0cmFjayA9IG1UcmFja3NbaV07CiAgICAgICAgICAgICBpZiAodHJhY2sgIT0gMCkgewpAQCAtMTc5Myw3ICsxOTQ5LDcgQEAKICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICBUaGUgZm9sbG93aW5nIHRyYWNrcyBhcmUgaW4gdGhlIGFjdGl2ZSBsaXN0IGJ1dCIKICAgICAgICAgICAgICAgICAiIG5vdCBpbiB0aGUgdHJhY2sgbGlzdFxuIik7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgVHJhY2s6OmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKKyAgICAgICAgbUFjdGl2ZVRyYWNrc1swXS0+YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bWFjdGl2ZTsgKytpKSB7CiAgICAgICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKG1UcmFja3MuaW5kZXhPZih0cmFjaykgPCAwKSB7CkBAIC0xODA2LDEzICsxOTYyLDE0IEBACiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCiB7Ci0gICAgZHVtcEJhc2UoZmQsIGFyZ3MpOwotCisgICAgZHByaW50ZihmZCwgIiAgTWFzdGVyIG11dGU6ICVzXG4iLCBtTWFzdGVyTXV0ZSA/ICJvbiIgOiAib2ZmIik7CisgICAgaWYgKG1IYXB0aWNDaGFubmVsTWFzayAhPSBBVURJT19DSEFOTkVMX05PTkUpIHsKKyAgICAgICAgZHByaW50ZihmZCwgIiAgSGFwdGljIGNoYW5uZWwgbWFzazogJSN4ICglcylcbiIsIG1IYXB0aWNDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFza1RvU3RyaW5nKG1IYXB0aWNDaGFubmVsTWFzaywgdHJ1ZSAvKiBvdXRwdXQgKi8pLmNfc3RyKCkpOworICAgIH0KICAgICBkcHJpbnRmKGZkLCAiICBOb3JtYWwgZnJhbWUgY291bnQ6ICV6dVxuIiwgbU5vcm1hbEZyYW1lQ291bnQpOwotICAgIGRwcmludGYoZmQsICIgIExhc3Qgd3JpdGUgb2NjdXJyZWQgKG1zZWNzKTogJWxsdVxuIiwKLSAgICAgICAgICAgICh1bnNpZ25lZCBsb25nIGxvbmcpIG5zMm1zKHN5c3RlbVRpbWUoKSAtIG1MYXN0V3JpdGVUaW1lKSk7CiAgICAgZHByaW50ZihmZCwgIiAgVG90YWwgd3JpdGVzOiAlZFxuIiwgbU51bVdyaXRlcyk7CiAgICAgZHByaW50ZihmZCwgIiAgRGVsYXllZCB3cml0ZXM6ICVkXG4iLCBtTnVtRGVsYXllZFdyaXRlcyk7CiAgICAgZHByaW50ZihmZCwgIiAgQmxvY2tlZCBpbiB3cml0ZTogJXNcbiIsIG1JbldyaXRlID8gInllcyIgOiAibm8iKTsKQEAgLTE4MjUsNyArMTk4Miw3IEBACiAgICAgQXVkaW9TdHJlYW1PdXQgKm91dHB1dCA9IG1PdXRwdXQ7CiAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBvdXRwdXQgIT0gTlVMTCA/IG91dHB1dC0+ZmxhZ3MgOiBBVURJT19PVVRQVVRfRkxBR19OT05FOwogICAgIGRwcmludGYoZmQsICIgIEF1ZGlvU3RyZWFtT3V0OiAlcCBmbGFncyAlI3ggKCVzKVxuIiwKLSAgICAgICAgICAgIG91dHB1dCwgZmxhZ3MsIG91dHB1dEZsYWdzVG9TdHJpbmcoZmxhZ3MpLmNfc3RyKCkpOworICAgICAgICAgICAgb3V0cHV0LCBmbGFncywgdG9TdHJpbmcoZmxhZ3MpLmNfc3RyKCkpOwogICAgIGRwcmludGYoZmQsICIgIEZyYW1lcyB3cml0dGVuOiAlbGxkXG4iLCAobG9uZyBsb25nKW1GcmFtZXNXcml0dGVuKTsKICAgICBkcHJpbnRmKGZkLCAiICBTdXNwZW5kZWQgZnJhbWVzOiAlbGxkXG4iLCAobG9uZyBsb25nKW1TdXNwZW5kZWRGcmFtZXMpOwogICAgIGlmIChtUGlwZVNpbmsuZ2V0KCkgIT0gbnVsbHB0cikgewpAQCAtMTgzNywyMyArMTk5NCw2IEBACiAgICAgfQogfQogCi0vLyBUaHJlYWQgdmlydHVhbHMKLQotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpvbkZpcnN0UmVmKCkKLXsKLSAgICBydW4obVRocmVhZE5hbWUsIEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKLX0KLQotLy8gVGhyZWFkQmFzZSB2aXJ0dWFscwotdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpwcmVFeGl0KCkKLXsKLSAgICBBTE9HVigiICBwcmVFeGl0KCkiKTsKLSAgICAvLyBGSVhNRSB0aGlzIGlzIHVzaW5nIGhhcmQtY29kZWQgc3RyaW5ncyBidXQgaW4gdGhlIGZ1dHVyZSwgdGhpcyBmdW5jdGlvbmFsaXR5IHdpbGwgYmUKLSAgICAvLyAgICAgICBjb252ZXJ0ZWQgdG8gdXNlIGF1ZGlvIEhBTCBleHRlbnNpb25zIHJlcXVpcmVkIHRvIHN1cHBvcnQgdHVubmVsaW5nCi0gICAgc3RhdHVzX3QgcmVzdWx0ID0gbU91dHB1dC0+c3RyZWFtLT5zZXRQYXJhbWV0ZXJzKFN0cmluZzgoImV4aXRpbmc9MSIpKTsKLSAgICBBTE9HRV9JRihyZXN1bHQgIT0gT0ssICJFcnJvciB3aGVuIHNldHRpbmcgcGFyYW1ldGVycyBvbiBleGl0OiAlZCIsIHJlc3VsdCk7Ci19Ci0KIC8vIFBsYXliYWNrVGhyZWFkOjpjcmVhdGVUcmFja19sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGhlbGQKIHNwPEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrPiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpjcmVhdGVUcmFja19sKAogICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OkNsaWVudD4mIGNsaWVudCwKQEAgLTE4NjksNiArMjAwOSw3IEBACiAgICAgICAgIGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWRCdWZmZXIsCiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKKyAgICAgICAgcGlkX3QgY3JlYXRvclBpZCwKICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgIHN0YXR1c190ICpzdGF0dXMsCkBAIC0xODgwLDExICsyMDIxLDE3IEBACiAgICAgc3RhdHVzX3QgbFN0YXR1czsKICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBvdXRwdXRGbGFncyA9IG1PdXRwdXQtPmZsYWdzOwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IHJlcXVlc3RlZEZsYWdzID0gKmZsYWdzOworICAgIHVpbnQzMl90IHNhbXBsZVJhdGU7CisKKyAgICBpZiAoc2hhcmVkQnVmZmVyICE9IDAgJiYgY2hlY2tJTWVtb3J5KHNoYXJlZEJ1ZmZlcikgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgbFN0YXR1cyA9IEJBRF9WQUxVRTsKKyAgICAgICAgZ290byBFeGl0OworICAgIH0KIAogICAgIGlmICgqcFNhbXBsZVJhdGUgPT0gMCkgewogICAgICAgICAqcFNhbXBsZVJhdGUgPSBtU2FtcGxlUmF0ZTsKICAgICB9Ci0gICAgdWludDMyX3Qgc2FtcGxlUmF0ZSA9ICpwU2FtcGxlUmF0ZTsKKyAgICBzYW1wbGVSYXRlID0gKnBTYW1wbGVSYXRlOwogCiAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBGQVNUIGZsYWcgY29uc2lkZXJlZCBPSyBpZiBmYXN0IG1peGVyIGlzIHByZXNlbnQKICAgICBpZiAoaGFzRmFzdE1peGVyKCkpIHsKQEAgLTE5MDUsNyArMjA1Miw3IEBACiAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCkgJiYKICAgICAgICAgICAgIC8vIFRPRE86IGV4dHJhY3QgYXMgYSBkYXRhIGxpYnJhcnkgZnVuY3Rpb24gdGhhdCBjaGVja3MgdGhhdCBhIGNvbXB1dGF0aW9uYWxseQogICAgICAgICAgICAgLy8gZXhwZW5zaXZlIGRvd25taXhlciBpcyBub3QgcmVxdWlyZWQ6IGlzRmFzdE91dHB1dENoYW5uZWxDb252ZXJzaW9uKCkKLSAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBtQ2hhbm5lbE1hc2sgfHwKKyAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSAobUNoYW5uZWxNYXNrIHwgbUhhcHRpY0NoYW5uZWxNYXNrKSB8fAogICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIHx8CiAgICAgICAgICAgICAgICAgICAgIChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX09VVF9NT05PCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogJiYgbUNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyAqLykpICYmCkBAIC0xOTMyLDYgKzIwNzksNyBAQAogICAgICAgICB7IC8vIHNjb3BlIGZvciBtTG9jawogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICAgICAgICAgIGZvciAoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24gOiB7CisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NFU1NJT05fREVWSUNFLAogICAgICAgICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSwKICAgICAgICAgICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLAogICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsCkBAIC0yMDQzLDkgKzIxOTEsMTUgQEAKICAgICAgICAgICAgIC8vIG5vdGlmeSBldmVyeSBIQUwgYnVmZmVyLCByZWdhcmRsZXNzIG9mIHRoZSBzaXplIG9mIHRoZSB0cmFjayBidWZmZXIKICAgICAgICAgICAgIG1heE5vdGlmaWNhdGlvbkZyYW1lcyA9IG1GcmFtZUNvdW50OwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gRm9yIG5vcm1hbCB0cmFja3MsIHVzZSBhdCBsZWFzdCBkb3VibGUtYnVmZmVyaW5nIGlmIG5vIHNhbXBsZSByYXRlIGNvbnZlcnNpb24sCi0gICAgICAgICAgICAvLyBvciBhdCBsZWFzdCB0cmlwbGUtYnVmZmVyaW5nIGlmIHRoZXJlIGlzIHNhbXBsZSByYXRlIGNvbnZlcnNpb24KLSAgICAgICAgICAgIGNvbnN0IGludCBuQnVmZmVyaW5nID0gc2FtcGxlUmF0ZSA9PSBtU2FtcGxlUmF0ZSA/IDIgOiAzOworICAgICAgICAgICAgLy8gVHJpcGxlIGJ1ZmZlciB0aGUgbm90aWZpY2F0aW9uIHBlcmlvZCBmb3IgYSB0cmlwbGUgYnVmZmVyZWQgbWl4ZXIgcGVyaW9kOworICAgICAgICAgICAgLy8gb3RoZXJ3aXNlLCBkb3VibGUgYnVmZmVyaW5nIGZvciB0aGUgbm90aWZpY2F0aW9uIHBlcmlvZCBpcyBmaW5lLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIGJlIG1vdmVkIHRvIEF1ZGlvVHJhY2sgdG8gbW9kaWZ5IHRoZSBub3RpZmljYXRpb24gcGVyaW9kCisgICAgICAgICAgICAvLyBvbiBBdWRpb1RyYWNrOjpzZXRCdWZmZXJTaXplSW5GcmFtZXMoKSBjaGFuZ2VzLgorICAgICAgICAgICAgY29uc3QgaW50IG5CdWZmZXJpbmcgPQorICAgICAgICAgICAgICAgICAgICAodWludDY0X3R7ZnJhbWVDb3VudH0gKiBtU2FtcGxlUmF0ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvICh1aW50NjRfdHttTm9ybWFsRnJhbWVDb3VudH0gKiBzYW1wbGVSYXRlKSA9PSAzID8gMyA6IDI7CisKICAgICAgICAgICAgIG1heE5vdGlmaWNhdGlvbkZyYW1lcyA9IGZyYW1lQ291bnQgLyBuQnVmZmVyaW5nOwogICAgICAgICAgICAgLy8gSWYgY2xpZW50IHJlcXVlc3RlZCBhIGZhc3QgdHJhY2sgYnV0IHRoaXMgd2FzIGRlbmllZCwgdGhlbiB1c2UgdGhlIHNtYWxsZXIgbWF4aW11bS4KICAgICAgICAgICAgIGlmIChyZXF1ZXN0ZWRGbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0ZBU1QpIHsKQEAgLTIxNDAsNyArMjI5NCw3IEBACiAgICAgICAgIHRyYWNrID0gbmV3IFRyYWNrKHRoaXMsIGNsaWVudCwgc3RyZWFtVHlwZSwgYXR0ciwgc2FtcGxlUmF0ZSwgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBidWZmZXIgKi8sIChzaXplX3QpMCAvKiBidWZmZXJTaXplICovLCBzaGFyZWRCdWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCAqZmxhZ3MsIFRyYWNrQmFzZTo6VFlQRV9ERUZBVUxULCBwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIGNyZWF0b3JQaWQsIHVpZCwgKmZsYWdzLCBUcmFja0Jhc2U6OlRZUEVfREVGQVVMVCwgcG9ydElkKTsKIAogICAgICAgICBsU3RhdHVzID0gdHJhY2sgIT0gMCA/IHRyYWNrLT5pbml0Q2hlY2soKSA6IChzdGF0dXNfdCkgTk9fTUVNT1JZOwogICAgICAgICBpZiAobFN0YXR1cyAhPSBOT19FUlJPUikgewpAQCAtMjE3NCw0OCArMjMyOCwxNyBAQAogfQogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotc3NpemVfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFja3M8VD46OmFkZChjb25zdCBzcDxUPiAmdHJhY2spCi17Ci0gICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1UcmFja3MuYWRkKHRyYWNrKTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAvLyBzZXQgbmFtZSBmb3IgdHJhY2sgd2hlbiBhZGRpbmcuCi0gICAgICAgIGludCBuYW1lOwotICAgICAgICBpZiAobVVudXNlZFRyYWNrTmFtZXMuZW1wdHkoKSkgewotICAgICAgICAgICAgbmFtZSA9IG1UcmFja3Muc2l6ZSgpIC0gMTsgLy8gbmV3IG5hbWUgezAgLi4uIHNpemUtMX0uCi0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyByZXVzZSBzbWFsbGVzdCBuYW1lIGZvciBkZWxldGVkIHRyYWNrLgotICAgICAgICAgICAgYXV0byBpdCA9IG1VbnVzZWRUcmFja05hbWVzLmJlZ2luKCk7Ci0gICAgICAgICAgICBuYW1lID0gKml0OwotICAgICAgICAgICAgKHZvaWQpbVVudXNlZFRyYWNrTmFtZXMuZXJhc2UoaXQpOwotICAgICAgICB9Ci0gICAgICAgIHRyYWNrLT5zZXROYW1lKG5hbWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIExPR19BTFdBWVNfRkFUQUwoImNhbm5vdCBhZGQgdHJhY2siKTsKLSAgICB9Ci0gICAgcmV0dXJuIGluZGV4OwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgogc3NpemVfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFja3M8VD46OnJlbW92ZShjb25zdCBzcDxUPiAmdHJhY2spCiB7Ci0gICAgY29uc3QgaW50IG5hbWUgPSB0cmFjay0+bmFtZSgpOworICAgIGNvbnN0IGludCB0cmFja0lkID0gdHJhY2stPmlkKCk7CiAgICAgY29uc3Qgc3NpemVfdCBpbmRleCA9IG1UcmFja3MucmVtb3ZlKHRyYWNrKTsKICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAvLyBpbnZhbGlkYXRlIG5hbWUgd2hlbiByZW1vdmluZyBmcm9tIG1UcmFja3MuCi0gICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobmFtZSA8IDAsICJpbnZhbGlkIG5hbWUgJWQgZm9yIHRyYWNrIG9uIG1UcmFja3MiLCBuYW1lKTsKLQotICAgICAgICBpZiAobVNhdmVEZWxldGVkVHJhY2tOYW1lcykgeworICAgICAgICBpZiAobVNhdmVEZWxldGVkVHJhY2tJZHMpIHsKICAgICAgICAgICAgIC8vIFdlIGNhbid0IGRpcmVjdGx5IGFjY2VzcyBtQXVkaW9NaXhlciBzaW5jZSB0aGUgY2FsbGVyIG1heSBiZSBvdXRzaWRlIG9mIHRocmVhZExvb3AuCi0gICAgICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBhZGQgdG8gbURlbGV0ZWRUcmFja05hbWVzIHdoaWNoIGlzIHNvbGVseSB1c2VkIGZvciBtQXVkaW9NaXhlciB1cGRhdGUsCisgICAgICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBhZGQgdG8gbURlbGV0ZWRUcmFja0lkcyB3aGljaCBpcyBzb2xlbHkgdXNlZCBmb3IgbUF1ZGlvTWl4ZXIgdXBkYXRlLAogICAgICAgICAgICAgLy8gdG8gYmUgaGFuZGxlZCB3aGVuIE1peGVyVGhyZWFkOjpwcmVwYXJlVHJhY2tzX2woKSBuZXh0IGNoYW5nZXMgbUF1ZGlvTWl4ZXIuCi0gICAgICAgICAgICBtRGVsZXRlZFRyYWNrTmFtZXMuZW1wbGFjZShuYW1lKTsKKyAgICAgICAgICAgIG1EZWxldGVkVHJhY2tJZHMuZW1wbGFjZSh0cmFja0lkKTsKICAgICAgICAgfQotCi0gICAgICAgIG1VbnVzZWRUcmFja05hbWVzLmVtcGxhY2UobmFtZSk7Ci0gICAgICAgIHRyYWNrLT5zZXROYW1lKFQ6OlRSQUNLX05BTUVfUEVORElORyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihuYW1lID49IDAsCi0gICAgICAgICAgICAgICAgInZhbGlkIG5hbWUgJWQgZm9yIHRyYWNrIG5vdCBpbiBtVHJhY2tzIChyZXR1cm5lZCAlemQpIiwgbmFtZSwgaW5kZXgpOwogICAgIH0KICAgICByZXR1cm4gaW5kZXg7CiB9CkBAIC0yMjUxLDYgKzIzNzQsMTEgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6c2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKQoreworICAgIG1NYXN0ZXJCYWxhbmNlLnN0b3JlKGJhbGFuY2UpOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OnNldE1hc3Rlck11dGUoYm9vbCBtdXRlZCkKIHsKICAgICBpZiAoaXNEdXBsaWNhdGluZygpKSB7CkBAIC0yMzAzLDE1ICsyNDMxLDEzIEBACiAgICAgICAgIGlmICh0cmFjay0+aXNFeHRlcm5hbFRyYWNrKCkpIHsKICAgICAgICAgICAgIFRyYWNrQmFzZTo6dHJhY2tfc3RhdGUgc3RhdGUgPSB0cmFjay0+bVN0YXRlOwogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQobUlkLCB0cmFjay0+c3RyZWFtVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRPdXRwdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgIC8vIGFib3J0IHRyYWNrIHdhcyBzdG9wcGVkL3BhdXNlZCB3aGlsZSB3ZSByZWxlYXNlZCB0aGUgbG9jawogICAgICAgICAgICAgaWYgKHN0YXRlICE9IHRyYWNrLT5tU3RhdGUpIHsKICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dChtSWQsIHRyYWNrLT5zdHJlYW1UeXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KHRyYWNrLT5wb3J0SWQoKSk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMjMyNCw2ICsyNDUwLDcgQEAKICAgICAgICAgICAgIC8vIHRvIHRyYWNrIHRoZSBzcGVha2VyIHVzYWdlCiAgICAgICAgICAgICBhZGRCYXR0ZXJ5RGF0YShJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFBdWRpb0ZsaW5nZXJTdGFydCk7CiAjZW5kaWYKKyAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fQ0xJRU5UX1NUQVJURUQsIHRyYWNrLT5jcmVhdG9yUGlkKCksIHRyYWNrLT5wb3J0SWQoKSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBzZXQgcmV0cnkgY291bnQgZm9yIGJ1ZmZlciBmaWxsCkBAIC0yMzQwLDYgKzI0NjcsMjUgQEAKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNoYXJlZEJ1ZmZlcigpICE9IDAgPyBUcmFjazo6RlNfRklMTEVEIDogVHJhY2s6OkZTX0ZJTExJTkc7CiAgICAgICAgIH0KIAorICAgICAgICBpZiAoKHRyYWNrLT5jaGFubmVsTWFzaygpICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSAhPSBBVURJT19DSEFOTkVMX05PTkUKKyAgICAgICAgICAgICAgICAmJiBtSGFwdGljQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9OT05FKSB7CisgICAgICAgICAgICAvLyBVbmxvY2sgZHVlIHRvIFZpYnJhdG9yU2VydmljZSB3aWxsIGxvY2sgZm9yIHRoaXMgY2FsbCBhbmQgd2lsbAorICAgICAgICAgICAgLy8gY2FsbCBUcmFja3MubXV0ZS91bm11dGUgd2hpY2ggYWxzbyByZXF1aXJlIHRocmVhZCdzIGxvY2suCisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIGNvbnN0IGludCBpbnRlbnNpdHkgPSBBdWRpb0ZsaW5nZXI6Om9uRXh0ZXJuYWxWaWJyYXRpb25TdGFydCgKKyAgICAgICAgICAgICAgICAgICAgdHJhY2stPmdldEV4dGVybmFsVmlicmF0aW9uKCkpOworICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgdHJhY2stPnNldEhhcHRpY0ludGVuc2l0eShzdGF0aWNfY2FzdDxBdWRpb01peGVyOjpoYXB0aWNfaW50ZW5zaXR5X3Q+KGludGVuc2l0eSkpOworICAgICAgICAgICAgLy8gSGFwdGljIHBsYXliYWNrIHNob3VsZCBiZSBlbmFibGVkIGJ5IHZpYnJhdG9yIHNlcnZpY2UuCisgICAgICAgICAgICBpZiAodHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gRGlzYWJsZSBoYXB0aWMgcGxheWJhY2sgb2YgYWxsIGFjdGl2ZSB0cmFjayB0byBlbnN1cmUgb25seQorICAgICAgICAgICAgICAgIC8vIG9uZSB0cmFjayBwbGF5aW5nIGhhcHRpYyBpZiBjdXJyZW50IHRyYWNrIHNob3VsZCBwbGF5IGhhcHRpYy4KKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnQgOiBtQWN0aXZlVHJhY2tzKSB7CisgICAgICAgICAgICAgICAgICAgIHQtPnNldEhhcHRpY1BsYXliYWNrRW5hYmxlZChmYWxzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKICAgICAgICAgdHJhY2stPm1SZXNldERvbmUgPSBmYWxzZTsKICAgICAgICAgdHJhY2stPm1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcyA9IDA7CiAgICAgICAgIG1BY3RpdmVUcmFja3MuYWRkKHRyYWNrKTsKQEAgLTI0MDUsNyArMjU1MSwxNiBAQAogICAgIHJldHVybiBTdHJpbmc4KCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkKSB7CitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYgKG1PdXRwdXQgPT0gbnVsbHB0ciB8fCBtT3V0cHV0LT5zdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1PdXRwdXQtPnN0cmVhbS0+c2VsZWN0UHJlc2VudGF0aW9uKHByZXNlbnRhdGlvbklkLCBwcm9ncmFtSWQpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSB7CiAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGRlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKICAgICBBTE9HVigiUGxheWJhY2tUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZCwgdGhyZWFkICVwLCBldmVudCAlZCIsIHRoaXMsIGV2ZW50KTsKIApAQCAtMjQyNCw3ICsyNTc5LDEwIEBACiAgICAgICAgIGRlc2MtPm1GcmFtZUNvdW50SEFMID0gbUZyYW1lQ291bnQ7CiAgICAgICAgIGRlc2MtPm1MYXRlbmN5ID0gbGF0ZW5jeV9sKCk7CiAgICAgICAgIGJyZWFrOwotCisgICAgY2FzZSBBVURJT19DTElFTlRfU1RBUlRFRDoKKyAgICAgICAgZGVzYy0+bVBhdGNoID0gbVBhdGNoOworICAgICAgICBkZXNjLT5tUG9ydElkID0gcG9ydElkOworICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX09VVFBVVF9DTE9TRUQ6CiAgICAgZGVmYXVsdDoKICAgICAgICAgYnJlYWs7CkBAIC0yNDYyLDYgKzI2MjAsMTEgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIC8vIHJlamVjdCBvdXQgb2Ygc2VxdWVuY2UgcmVxdWVzdHMKICAgICBpZiAoKG1EcmFpblNlcXVlbmNlICYgMSkgJiYgKHNlcXVlbmNlID09IG1EcmFpblNlcXVlbmNlKSkgeworICAgICAgICAvLyBSZWdpc3RlciBkaXNjb250aW51aXR5IHdoZW4gSFcgZHJhaW4gaXMgY29tcGxldGVkIGJlY2F1c2UgdGhhdCBjYW4gY2F1c2UKKyAgICAgICAgLy8gdGhlIHRpbWVzdGFtcCBmcmFtZSBwb3NpdGlvbiB0byByZXNldCB0byAwIGZvciBkaXJlY3QgYW5kIG9mZmxvYWQgdGhyZWFkcy4KKyAgICAgICAgLy8gKE91dCBvZiBzZXF1ZW5jZSByZXF1ZXN0cyBhcmUgaWdub3JlZCwgc2luY2UgdGhlIGRpc2NvbnRpbnVpdHkgd291bGQgYmUgaGFuZGxlZAorICAgICAgICAvLyBlbHNld2hlcmUsIGUuZy4gaW4gZmx1c2gpLgorICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZGlzY29udGludWl0eSgpOwogICAgICAgICBtRHJhaW5TZXF1ZW5jZSAmPSB+MTsKICAgICAgICAgbVdhaXRXb3JrQ1Yuc2lnbmFsKCk7CiAgICAgfQpAQCAtMjQ4MSw2ICsyNjQ0LDcgQEAKICAgICAgICAgICAgICAgICBtQ2hhbm5lbE1hc2spOwogICAgIH0KICAgICBtQ2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKG1DaGFubmVsTWFzayk7CisgICAgbUJhbGFuY2Uuc2V0Q2hhbm5lbE1hc2sobUNoYW5uZWxNYXNrKTsKIAogICAgIC8vIEdldCBhY3R1YWwgSEFMIGZvcm1hdC4KICAgICBzdGF0dXNfdCByZXN1bHQgPSBtT3V0cHV0LT5zdHJlYW0tPmdldEZvcm1hdCgmbUhBTEZvcm1hdCk7CkBAIC0yNjAwLDcgKzI3NjQsNyBAQAogICAgIGZyZWUobU1peGVyQnVmZmVyKTsKICAgICBtTWl4ZXJCdWZmZXIgPSBOVUxMOwogICAgIGlmIChtTWl4ZXJCdWZmZXJFbmFibGVkKSB7Ci0gICAgICAgIG1NaXhlckJ1ZmZlckZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQ7IC8vIGFsc28gdmFsaWQ6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgorICAgICAgICBtTWl4ZXJCdWZmZXJGb3JtYXQgPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUOyAvLyBubyBsb25nZXIgdmFsaWQ6IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULgogICAgICAgICBtTWl4ZXJCdWZmZXJTaXplID0gbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50CiAgICAgICAgICAgICAgICAgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1NaXhlckJ1ZmZlckZvcm1hdCk7CiAgICAgICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZtTWl4ZXJCdWZmZXIsIDMyLCBtTWl4ZXJCdWZmZXJTaXplKTsKQEAgLTI2MTQsNiArMjc3OCwxMSBAQAogICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbUVmZmVjdEJ1ZmZlciwgMzIsIG1FZmZlY3RCdWZmZXJTaXplKTsKICAgICB9CiAKKyAgICBtSGFwdGljQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2sgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEw7CisgICAgbUNoYW5uZWxNYXNrICY9IH5tSGFwdGljQ2hhbm5lbE1hc2s7CisgICAgbUhhcHRpY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtSGFwdGljQ2hhbm5lbE1hc2spOworICAgIG1DaGFubmVsQ291bnQgLT0gbUhhcHRpY0NoYW5uZWxDb3VudDsKKwogICAgIC8vIGZvcmNlIHJlY29uZmlndXJhdGlvbiBvZiBlZmZlY3QgY2hhaW5zIGFuZCBlbmdpbmVzIHRvIHRha2UgbmV3IGJ1ZmZlciBzaXplIGFuZCBhdWRpbwogICAgIC8vIHBhcmFtZXRlcnMgaW50byBhY2NvdW50CiAgICAgLy8gTm90ZSB0aGF0IG1Mb2NrIGlzIG5vdCBoZWxkIHdoZW4gcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpIGlzIGNhbGxlZCBmcm9tIHRoZSBjb25zdHJ1Y3RvcgpAQCAtMjYyMiw3ICsyNzkxLDggQEAKICAgICAvLyBjcmVhdGUgYSBjb3B5IG9mIG1FZmZlY3RDaGFpbnMgYXMgY2FsbGluZyBtb3ZlRWZmZWN0Q2hhaW5fbCgpIGNhbiByZW9yZGVyIHNvbWUgZWZmZWN0IGNoYWlucwogICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zID0gbUVmZmVjdENoYWluczsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdENoYWlucy5zaXplKCk7IGkgKyspIHsKLSAgICAgICAgbUF1ZGlvRmxpbmdlci0+bW92ZUVmZmVjdENoYWluX2woZWZmZWN0Q2hhaW5zW2ldLT5zZXNzaW9uSWQoKSwgdGhpcywgdGhpcywgZmFsc2UpOworICAgICAgICBtQXVkaW9GbGluZ2VyLT5tb3ZlRWZmZWN0Q2hhaW5fbChlZmZlY3RDaGFpbnNbaV0tPnNlc3Npb25JZCgpLAorICAgICAgICAgICAgdGhpcy8qIHNyY1RocmVhZCAqLywgdGhpcy8qIGRzdFRocmVhZCAqLyk7CiAgICAgfQogfQogCkBAIC0yNjgyLDI4ICsyODUyLDYgQEAKICAgICB9CiB9CiAKLS8vIGhhc0F1ZGlvU2Vzc2lvbl9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi11aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpoYXNBdWRpb1Nlc3Npb25fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSBjb25zdAotewotICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gICAgaWYgKGdldEVmZmVjdENoYWluX2woc2Vzc2lvbklkKSAhPSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IEVGRkVDVF9TRVNTSU9OOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewotICAgICAgICBzcDxUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwotICAgICAgICBpZiAoc2Vzc2lvbklkID09IHRyYWNrLT5zZXNzaW9uSWQoKSAmJiAhdHJhY2stPmlzSW52YWxpZCgpKSB7Ci0gICAgICAgICAgICByZXN1bHQgfD0gVFJBQ0tfU0VTU0lPTjsKLSAgICAgICAgICAgIGlmICh0cmFjay0+aXNGYXN0VHJhY2soKSkgewotICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBGQVNUX1NFU1NJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci19Ci0KIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmdldFN0cmF0ZWd5Rm9yU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpCiB7CiAgICAgLy8gc2Vzc2lvbiBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggaXMgcGxhY2VkIGluIHNhbWUgc3RyYXRlZ3kgYXMgTVVTSUMgc3RyZWFtIHNvIHRoYXQKQEAgLTI3ODEsMzEgKzI5MjksMjUgQEAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6dGhyZWFkTG9vcF9yZW1vdmVUcmFja3MoCiAgICAgICAgIGNvbnN0IFZlY3Rvcjwgc3A8VHJhY2s+ID4mIHRyYWNrc1RvUmVtb3ZlKQogewotICAgIHNpemVfdCBjb3VudCA9IHRyYWNrc1RvUmVtb3ZlLnNpemUoKTsKLSAgICBpZiAoY291bnQgPiAwKSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IGNvdW50IDsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxUcmFjaz4mIHRyYWNrID0gdHJhY2tzVG9SZW1vdmUuaXRlbUF0KGkpOwotICAgICAgICAgICAgaWYgKHRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgewotICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wT3V0cHV0KG1JZCwgdHJhY2stPnN0cmVhbVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgIC8vIE1pc2NlbGxhbmVvdXMgdHJhY2sgY2xlYW51cCB3aGVuIHJlbW92ZWQgZnJvbSB0aGUgYWN0aXZlIGxpc3QsCisgICAgLy8gY2FsbGVkIHdpdGhvdXQgVGhyZWFkIGxvY2sgYnV0IHN5bmNocm9uaXplZCB3aXRoIHRocmVhZExvb3AgcHJvY2Vzc2luZy4KICNpZmRlZiBBRERfQkFUVEVSWV9EQVRBCi0gICAgICAgICAgICAgICAgLy8gdG8gdHJhY2sgdGhlIHNwZWFrZXIgdXNhZ2UKLSAgICAgICAgICAgICAgICBhZGRCYXR0ZXJ5RGF0YShJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFBdWRpb0ZsaW5nZXJTdG9wKTsKLSNlbmRpZgotICAgICAgICAgICAgICAgIGlmICh0cmFjay0+aXNUZXJtaW5hdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobUlkLCB0cmFjay0+c3RyZWFtVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2Vzc2lvbklkKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIHRyYWNrIDogdHJhY2tzVG9SZW1vdmUpIHsKKyAgICAgICAgaWYgKHRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgeworICAgICAgICAgICAgLy8gdG8gdHJhY2sgdGhlIHNwZWFrZXIgdXNhZ2UKKyAgICAgICAgICAgIGFkZEJhdHRlcnlEYXRhKElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YUF1ZGlvRmxpbmdlclN0b3ApOwogICAgICAgICB9CiAgICAgfQorI2Vsc2UKKyAgICAodm9pZCl0cmFja3NUb1JlbW92ZTsgLy8gc3VwcHJlc3MgdW51c2VkIHdhcm5pbmcKKyNlbmRpZgogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmNoZWNrU2lsZW50TW9kZV9sKCkKIHsKICAgICBpZiAoIW1NYXN0ZXJNdXRlKSB7CiAgICAgICAgIGNoYXIgdmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICAgICAgaWYgKG1PdXREZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSB7CisgICAgICAgIGlmIChpc1NpbmdsZURldmljZVR5cGUob3V0RGV2aWNlVHlwZXMoKSwgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYKSkgewogICAgICAgICAgICAgQUxPR0QoInJvLmF1ZGlvLnNpbGVudCB3aWxsIGJlIGlnbm9yZWQgZm9yIHRocmVhZHMgb24gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYIik7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KQEAgLTI4NTAsNiArMjk5Miw5IEBACiAgICAgICAgIEFUUkFDRV9FTkQoKTsKICAgICAgICAgaWYgKGZyYW1lc1dyaXR0ZW4gPiAwKSB7CiAgICAgICAgICAgICBieXRlc1dyaXR0ZW4gPSBmcmFtZXNXcml0dGVuICogbUZyYW1lU2l6ZTsKKyNpZmRlZiBURUVfU0lOSworICAgICAgICAgICAgbVRlZS53cml0ZSgoY2hhciAqKW1TaW5rQnVmZmVyICsgb2Zmc2V0LCBmcmFtZXNXcml0dGVuKTsKKyNlbmRpZgogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYnl0ZXNXcml0dGVuID0gZnJhbWVzV3JpdHRlbjsKICAgICAgICAgfQpAQCAtMjg2NCw5ICszMDA5LDExIEBACiAgICAgICAgICAgICBBTE9HX0FTU0VSVChtQ2FsbGJhY2tUaHJlYWQgIT0gMCk7CiAgICAgICAgICAgICBtQ2FsbGJhY2tUaHJlYWQtPnNldFdyaXRlQmxvY2tlZChtV3JpdGVBY2tTZXF1ZW5jZSk7CiAgICAgICAgIH0KKyAgICAgICAgQVRSQUNFX0JFR0lOKCJ3cml0ZSIpOwogICAgICAgICAvLyBGSVhNRSBXZSBzaG91bGQgaGF2ZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aW1lc3RhbXBzIGZvciBkaXJlY3Qgb3V0cHV0IHRocmVhZHMuCiAgICAgICAgIC8vIFRoZXkgYXJlIHVzZWQgZS5nIGZvciBtdWx0aWNoYW5uZWwgUENNIHBsYXliYWNrIG92ZXIgSERNSS4KICAgICAgICAgYnl0ZXNXcml0dGVuID0gbU91dHB1dC0+d3JpdGUoKGNoYXIgKiltU2lua0J1ZmZlciArIG9mZnNldCwgbUJ5dGVzUmVtYWluaW5nKTsKKyAgICAgICAgQVRSQUNFX0VORCgpOwogCiAgICAgICAgIGlmIChtVXNlQXN5bmNXcml0ZSAmJgogICAgICAgICAgICAgICAgICgoYnl0ZXNXcml0dGVuIDwgMCkgfHwgKGJ5dGVzV3JpdHRlbiA9PSAoc3NpemVfdCltQnl0ZXNSZW1haW5pbmcpKSkgewpAQCAtMjk0NCw3ICszMDkxLDcgQEAKICAgICAvLyBtYWtlIHN1cmUgc3RhbmRieSBkZWxheSBpcyBub3QgdG9vIHNob3J0IHdoZW4gY29ubmVjdGVkIHRvIGFuIEEyRFAgc2luayB0byBhdm9pZAogICAgIC8vIHRydW5jYXRpbmcgYXVkaW8gd2hlbiBnb2luZyB0byBzdGFuZGJ5LgogICAgIG1TdGFuZGJ5RGVsYXlOcyA9IEF1ZGlvRmxpbmdlcjo6bVN0YW5kYnlUaW1lSW5Oc2VjczsKLSAgICBpZiAoKG1PdXREZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAwKSB7CisgICAgaWYgKCFJbnRlcnNlY3Rpb24ob3V0RGV2aWNlVHlwZXMoKSwgIGdldEF1ZGlvRGV2aWNlT3V0QWxsQTJkcFNldCgpKS5lbXB0eSgpKSB7CiAgICAgICAgIGlmIChtU3RhbmRieURlbGF5TnMgPCBrRGVmYXVsdFN0YW5kYnlUaW1lSW5Oc2VjcykgewogICAgICAgICAgICAgbVN0YW5kYnlEZWxheU5zID0ga0RlZmF1bHRTdGFuZGJ5VGltZUluTnNlY3M7CiAgICAgICAgIH0KQEAgLTI5ODUsMTEgKzMxMzIsMTEgQEAKICAgICBoYWxPdXRCdWZmZXIgPSBoYWxJbkJ1ZmZlcjsKICAgICBlZmZlY3RfYnVmZmVyX3QgKmJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8ZWZmZWN0X2J1ZmZlcl90Kj4oaGFsSW5CdWZmZXItPmV4dGVybmFsRGF0YSgpKTsKICAgICBBTE9HVigiYWRkRWZmZWN0Q2hhaW5fbCgpICVwIG9uIHRocmVhZCAlcCBmb3Igc2Vzc2lvbiAlZCIsIGNoYWluLmdldCgpLCB0aGlzLCBzZXNzaW9uKTsKLSAgICBpZiAoc2Vzc2lvbiA+IEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCkgeworICAgIGlmICghYXVkaW9faXNfZ2xvYmFsX3Nlc3Npb24oc2Vzc2lvbikpIHsKICAgICAgICAgLy8gT25seSBvbmUgZWZmZWN0IGNoYWluIGNhbiBiZSBwcmVzZW50IGluIGRpcmVjdCBvdXRwdXQgdGhyZWFkIGFuZCBpdCB1c2VzCiAgICAgICAgIC8vIHRoZSBzaW5rIGJ1ZmZlciBhcyBpbnB1dAogICAgICAgICBpZiAobVR5cGUgIT0gRElSRUNUKSB7Ci0gICAgICAgICAgICBzaXplX3QgbnVtU2FtcGxlcyA9IG1Ob3JtYWxGcmFtZUNvdW50ICogbUNoYW5uZWxDb3VudDsKKyAgICAgICAgICAgIHNpemVfdCBudW1TYW1wbGVzID0gbU5vcm1hbEZyYW1lQ291bnQgKiAobUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQpOwogICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbUF1ZGlvRmxpbmdlci0+bUVmZmVjdHNGYWN0b3J5SGFsLT5hbGxvY2F0ZUJ1ZmZlcigKICAgICAgICAgICAgICAgICAgICAgbnVtU2FtcGxlcyAqIHNpemVvZihlZmZlY3RfYnVmZmVyX3QpLAogICAgICAgICAgICAgICAgICAgICAmaGFsSW5CdWZmZXIpOwpAQCAtMzAyNSw4ICszMTcyLDExIEBACiAgICAgY2hhaW4tPnNldFRocmVhZCh0aGlzKTsKICAgICBjaGFpbi0+c2V0SW5CdWZmZXIoaGFsSW5CdWZmZXIpOwogICAgIGNoYWluLT5zZXRPdXRCdWZmZXIoaGFsT3V0QnVmZmVyKTsKLSAgICAvLyBFZmZlY3QgY2hhaW4gZm9yIHNlc3Npb24gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UgaXMgaW5zZXJ0ZWQgYXQgZW5kIG9mIGVmZmVjdAotICAgIC8vIGNoYWlucyBsaXN0IGluIG9yZGVyIHRvIGJlIHByb2Nlc3NlZCBsYXN0IGFzIGl0IGNvbnRhaW5zIG91dHB1dCBzdGFnZSBlZmZlY3RzLgorICAgIC8vIEVmZmVjdCBjaGFpbiBmb3Igc2Vzc2lvbiBBVURJT19TRVNTSU9OX0RFVklDRSBpcyBpbnNlcnRlZCBhdCBlbmQgb2YgZWZmZWN0CisgICAgLy8gY2hhaW5zIGxpc3QgaW4gb3JkZXIgdG8gYmUgcHJvY2Vzc2VkIGxhc3QgYXMgaXQgY29udGFpbnMgb3V0cHV0IGRldmljZSBlZmZlY3RzLgorICAgIC8vIEVmZmVjdCBjaGFpbiBmb3Igc2Vzc2lvbiBBVURJT19TRVNTSU9OX09VVFBVVF9TVEFHRSBpcyBpbnNlcnRlZCBqdXN0IGJlZm9yZSB0byBhcHBseSBwb3N0CisgICAgLy8gcHJvY2Vzc2luZyBlZmZlY3RzIHNwZWNpZmljIHRvIGFuIG91dHB1dCBzdHJlYW0gYmVmb3JlIGVmZmVjdHMgYXBwbGllZCB0byBhbGwgc3RyZWFtcworICAgIC8vIHJvdXRlZCB0byBhIGdpdmVuIGRldmljZS4KICAgICAvLyBFZmZlY3QgY2hhaW4gZm9yIHNlc3Npb24gQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYIGlzIGluc2VydGVkIGJlZm9yZQogICAgIC8vIHNlc3Npb24gQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UgdG8gYmUgcHJvY2Vzc2VkCiAgICAgLy8gYWZ0ZXIgdHJhY2sgc3BlY2lmaWMgZWZmZWN0cyBhbmQgYmVmb3JlIG91dHB1dCBzdGFnZS4KQEAgLTMwMzYsNyArMzE4Niw4IEBACiAgICAgLy8gY2hhaW5zIGxpc3QgdG8gYmUgcHJvY2Vzc2VkIGJlZm9yZSBvdXRwdXQgbWl4IGVmZmVjdHMuIFJlbGF0aXZlIG9yZGVyIGJldHdlZW4gb3RoZXIKICAgICAvLyBzZXNzaW9ucyBpcyBub3QgaW1wb3J0YW50LgogICAgIHN0YXRpY19hc3NlcnQoQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYID09IDAgJiYKLSAgICAgICAgICAgIEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFIDwgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLAorICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UgPCBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggJiYKKyAgICAgICAgICAgIEFVRElPX1NFU1NJT05fREVWSUNFIDwgQVVESU9fU0VTU0lPTl9PVVRQVVRfU1RBR0UsCiAgICAgICAgICAgICAiYXVkaW9fc2Vzc2lvbl90IGNvbnN0YW50cyBtaXNkZWZpbmVkIik7CiAgICAgc2l6ZV90IHNpemUgPSBtRWZmZWN0Q2hhaW5zLnNpemUoKTsKICAgICBzaXplX3QgaSA9IDA7CkBAIC0zMTMwLDggKzMyODEsOCBAQAogICAgIFZlY3Rvcjwgc3A8VHJhY2s+ID4gdHJhY2tzVG9SZW1vdmU7CiAKICAgICBtU3RhbmRieVRpbWVOcyA9IHN5c3RlbVRpbWUoKTsKLSAgICBuc2Vjc190IGxhc3RXcml0ZUZpbmlzaGVkID0gLTE7IC8vIHRpbWUgbGFzdCBzZXJ2ZXIgd3JpdGUgY29tcGxldGVkCi0gICAgaW50NjRfdCBsYXN0RnJhbWVzV3JpdHRlbiA9IC0xOyAvLyB0cmFjayBjaGFuZ2VzIGluIHRpbWVzdGFtcCBzZXJ2ZXIgZnJhbWVzIHdyaXR0ZW4KKyAgICBpbnQ2NF90IGxhc3RMb29wQ291bnRXcml0dGVuID0gLTI7IC8vIG5ldmVyIG1hdGNoZXMgInByZXZpb3VzIiBsb29wLCB3aGVuIGxvb3BDb3VudCA9IDAuCisgICAgaW50NjRfdCBsYXN0RnJhbWVzV3JpdHRlbiA9IC0xOyAgICAvLyB0cmFjayBjaGFuZ2VzIGluIHRpbWVzdGFtcCBzZXJ2ZXIgZnJhbWVzIHdyaXR0ZW4KIAogICAgIC8vIE1JWEVSCiAgICAgbnNlY3NfdCBsYXN0V2FybmluZyA9IDA7CkBAIC0zMTY3LDcgKzMzMTgsMTggQEAKIAogICAgIGNoZWNrU2lsZW50TW9kZV9sKCk7CiAKLSAgICB3aGlsZSAoIWV4aXRQZW5kaW5nKCkpCisgICAgLy8gRElSRUNUIGFuZCBPRkZMT0FEIHRocmVhZHMgc2hvdWxkIHJlc2V0IGZyYW1lIGNvdW50IHRvIHplcm8gb24gc3RvcC9mbHVzaAorICAgIC8vIFRPRE86IGFkZCBjb25maXJtYXRpb24gY2hlY2tzOgorICAgIC8vIDEpIERJUkVDVCB0aHJlYWRzIGFuZCBsaW5lYXIgUENNIGZvcm1hdCByZWFsbHkgcmVzZXRzIHRvIDA/CisgICAgLy8gMikgSXMgZnJhbWUgY291bnQgcmVhbGx5IHZhbGlkIGlmIG5vdCBsaW5lYXIgcGNtPworICAgIC8vIDMpIEFyZSBhbGwgNjQgYml0cyBvZiBwb3NpdGlvbiByZXR1cm5lZCwgbm90IGp1c3QgbG93ZXN0IDMyIGJpdHM/CisgICAgaWYgKG1UeXBlID09IE9GRkxPQUQgfHwgbVR5cGUgPT0gRElSRUNUKSB7CisgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5zZXREaXNjb250aW51aXR5TW9kZShtVGltZXN0YW1wVmVyaWZpZXIuRElTQ09OVElOVUlUWV9NT0RFX1pFUk8pOworICAgIH0KKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBsYXN0RG93bnN0cmVhbVBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisKKyAgICAvLyBsb29wQ291bnQgaXMgdXNlZCBmb3Igc3RhdGlzdGljcyBhbmQgZGlhZ25vc3RpY3MuCisgICAgZm9yIChpbnQ2NF90IGxvb3BDb3VudCA9IDA7ICFleGl0UGVuZGluZygpOyArK2xvb3BDb3VudCkKICAgICB7CiAgICAgICAgIC8vIExvZyBtZXJnZSByZXF1ZXN0cyBhcmUgcGVyZm9ybWVkIGR1cmluZyBBdWRpb0ZsaW5nZXIgYmluZGVyIHRyYW5zYWN0aW9ucywgYnV0CiAgICAgICAgIC8vIHRoYXQgZG9lcyBub3QgY292ZXIgYXVkaW8gcGxheWJhY2suIEl0J3MgcmVxdWVzdGVkIGhlcmUgZm9yIHRoYXQgcmVhc29uLgpAQCAtMzE3Niw2ICszMzM4LDUxIEBACiAgICAgICAgIGNwdVN0YXRzLnNhbXBsZShteU5hbWUpOwogCiAgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zOworICAgICAgICBhdWRpb19zZXNzaW9uX3QgYWN0aXZlSGFwdGljU2Vzc2lvbklkID0gQVVESU9fU0VTU0lPTl9OT05FOworICAgICAgICBzdGQ6OnZlY3RvcjxzcDxUcmFjaz4+IGFjdGl2ZVRyYWNrczsKKworICAgICAgICAvLyBJZiB0aGUgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfQlVTLCBjaGVjayBmb3IgZG93bnN0cmVhbSBsYXRlbmN5LgorICAgICAgICAvLworICAgICAgICAvLyBOb3RlOiB3ZSBhY2Nlc3Mgb3V0RGV2aWNlVHlwZXMoKSBvdXRzaWRlIG9mIG1Mb2NrLgorICAgICAgICBpZiAoaXNNc2REZXZpY2UoKSAmJiBvdXREZXZpY2VUeXBlcygpLmNvdW50KEFVRElPX0RFVklDRV9PVVRfQlVTKSAhPSAwKSB7CisgICAgICAgICAgICAvLyBIZXJlLCB3ZSB0cnkgZm9yIHRoZSBBRiBsb2NrLCBidXQgZG8gbm90IGJsb2NrIG9uIGl0IGFzIHRoZSBsYXRlbmN5CisgICAgICAgICAgICAvLyBpcyBtb3JlIGluZm9ybWF0aW9uYWwuCisgICAgICAgICAgICBpZiAobUF1ZGlvRmxpbmdlci0+bUxvY2sudHJ5TG9jaygpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UGF0Y2hQYW5lbDo6U29mdHdhcmVQYXRjaD4gc3dQYXRjaGVzOworICAgICAgICAgICAgICAgIGRvdWJsZSBsYXRlbmN5TXM7CisgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZG93bnN0cmVhbVBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgICAgICAgICAgICAgaWYgKG1BdWRpb0ZsaW5nZXItPm1QYXRjaFBhbmVsLmdldERvd25zdHJlYW1Tb2Z0d2FyZVBhdGNoZXMoaWQoKSwgJnN3UGF0Y2hlcykgPT0gT0sKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHN3UGF0Y2hlcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzd1BhdGNoZXNbMF0uZ2V0TGF0ZW5jeU1zX2woJmxhdGVuY3lNcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBkb3duc3RyZWFtUGF0Y2hIYW5kbGUgPSBzd1BhdGNoZXNbMF0uZ2V0UGF0Y2hIYW5kbGUoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGRvd25zdHJlYW1QYXRjaEhhbmRsZSAhPSBsYXN0RG93bnN0cmVhbVBhdGNoSGFuZGxlKSB7CisgICAgICAgICAgICAgICAgICAgIG1Eb3duc3RyZWFtTGF0ZW5jeVN0YXRNcy5yZXNldCgpOworICAgICAgICAgICAgICAgICAgICBsYXN0RG93bnN0cmVhbVBhdGNoSGFuZGxlID0gZG93bnN0cmVhbVBhdGNoSGFuZGxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHZlcmlmeSBkb3duc3RyZWFtIGxhdGVuY3kgKHdlIGFzc3VtZSBhIG1heCByZWFzb25hYmxlCisgICAgICAgICAgICAgICAgICAgIC8vIGxhdGVuY3kgb2YgNSBzZWNvbmRzKS4KKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIG1pbkxhdGVuY3kgPSAwLiwgbWF4TGF0ZW5jeSA9IDUwMDAuOworICAgICAgICAgICAgICAgICAgICBpZiAobGF0ZW5jeU1zID49IG1pbkxhdGVuY3kgJiYgbGF0ZW5jeU1zIDw9IG1heExhdGVuY3kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJuZXcgZG93bnN0cmVhbSBsYXRlbmN5ICVsZiBtcyIsIGxhdGVuY3lNcyk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRCgib3V0IG9mIHJhbmdlIGRvd25zdHJlYW0gbGF0ZW5jeSAlbGYgbXMiLCBsYXRlbmN5TXMpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGxhdGVuY3lNcyA8IG1pbkxhdGVuY3kpIGxhdGVuY3lNcyA9IG1pbkxhdGVuY3k7CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChsYXRlbmN5TXMgPiBtYXhMYXRlbmN5KSBsYXRlbmN5TXMgPSBtYXhMYXRlbmN5OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1Eb3duc3RyZWFtTGF0ZW5jeVN0YXRNcy5hZGQobGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUF1ZGlvRmxpbmdlci0+bUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAobGFzdERvd25zdHJlYW1QYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgIC8vIG91ciBkZXZpY2UgaXMgbm8gbG9uZ2VyIEFVRElPX0RFVklDRV9PVVRfQlVTLCByZXNldCBwYXRjaCBoYW5kbGUgYW5kIHN0YXRzLgorICAgICAgICAgICAgICAgIG1Eb3duc3RyZWFtTGF0ZW5jeVN0YXRNcy5yZXNldCgpOworICAgICAgICAgICAgICAgIGxhc3REb3duc3RyZWFtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogCiAgICAgICAgIHsgLy8gc2NvcGUgZm9yIG1Mb2NrCiAKQEAgLTMxOTAsMTYgKzMzOTcsNTEgQEAKICAgICAgICAgICAgICAgICBsb2dTdHJpbmcgPSBOVUxMOwogICAgICAgICAgICAgfQogCisgICAgICAgICAgICAvLyBDb2xsZWN0IHRpbWVzdGFtcCBzdGF0aXN0aWNzIGZvciB0aGUgUGxheWJhY2sgVGhyZWFkIHR5cGVzIHRoYXQgc3VwcG9ydCBpdC4KKyAgICAgICAgICAgIGlmIChtVHlwZSA9PSBNSVhFUgorICAgICAgICAgICAgICAgICAgICB8fCBtVHlwZSA9PSBEVVBMSUNBVElORworICAgICAgICAgICAgICAgICAgICB8fCBtVHlwZSA9PSBESVJFQ1QKKyAgICAgICAgICAgICAgICAgICAgfHwgbVR5cGUgPT0gT0ZGTE9BRCkgeyAvLyBubyBpbmRlbnRhdGlvbgogICAgICAgICAgICAgLy8gR2F0aGVyIHRoZSBmcmFtZXNSZWxlYXNlZCBjb3VudGVycyBmb3IgYWxsIGFjdGl2ZSB0cmFja3MsCiAgICAgICAgICAgICAvLyBhbmQgYXNzb2NpYXRlIHdpdGggdGhlIHNpbmsgZnJhbWVzIHdyaXR0ZW4gb3V0LiAgV2UgbmVlZAogICAgICAgICAgICAgLy8gdGhpcyB0byBjb252ZXJ0IHRoZSBzaW5rIHRpbWVzdGFtcCB0byB0aGUgdHJhY2sgdGltZXN0YW1wLgogICAgICAgICAgICAgYm9vbCBrZXJuZWxMb2NhdGlvblVwZGF0ZSA9IGZhbHNlOwotICAgICAgICAgICAgaWYgKG1Ob3JtYWxTaW5rICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBOb3RlOiBUaGUgRHVwbGljYXRpbmdUaHJlYWQgbWF5IG5vdCBoYXZlIGEgbU5vcm1hbFNpbmsuCisgICAgICAgICAgICBFeHRlbmRlZFRpbWVzdGFtcCB0aW1lc3RhbXA7IC8vIHVzZSBwcml2YXRlIGNvcHkgdG8gZmV0Y2gKKyAgICAgICAgICAgIGlmIChtU3RhbmRieSkgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHRocmVhZGxvb3BfZ2V0SGFsVGltZXN0YW1wX2woJnRpbWVzdGFtcCkgPT0gT0spIHsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuYWRkKHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKKworICAgICAgICAgICAgICAgIGlmIChpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0JFRk9SRTogJWQgJWxsZCAlbGxkIiwgaWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9uZyBsb25nKXRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSk7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gY29ycmVjdGVkVGltZXN0YW1wID0gbVRpbWVzdGFtcFZlcmlmaWVyLmdldExhc3RDb3JyZWN0ZWRUaW1lc3RhbXAoKTsKKyAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gY29ycmVjdGVkVGltZXN0YW1wLm1GcmFtZXM7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBjb3JyZWN0ZWRUaW1lc3RhbXAubVRpbWVOczsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0FGVEVSOiAlZCAlbGxkICVsbGQiLCBpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChsb25nIGxvbmcpdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyl0aW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiBEb3duc3RyZWFtIGxhdGVuY3kgb25seSBhZGRlZCBpZiB0aW1lc3RhbXAgY29ycmVjdGlvbiBlbmFibGVkLgorICAgICAgICAgICAgICAgICAgICBpZiAobURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE4oKSA+IDApIHsgLy8gd2UgaGF2ZSBsYXRlbmN5IGluZm8uCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IG5ld1Bvc2l0aW9uID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIGludDY0X3QobURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE1lYW4oKSAqIG1TYW1wbGVSYXRlICogMWUtMyk7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwcmV2ZW50IHJldHJvZ3JhZGUKKyAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSBtYXgoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld1Bvc2l0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtIG1TdXNwZW5kZWRGcmFtZXMpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIC8vIFdlIGFsd2F5cyBmZXRjaCB0aGUgdGltZXN0YW1wIGhlcmUgYmVjYXVzZSBvZnRlbiB0aGUgZG93bnN0cmVhbQogICAgICAgICAgICAgICAgIC8vIHNpbmsgd2lsbCBibG9jayB3aGlsZSB3cml0aW5nLgotICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wIHRpbWVzdGFtcDsgLy8gdXNlIHByaXZhdGUgY29weSB0byBmZXRjaAotICAgICAgICAgICAgICAgICh2b2lkKSBtTm9ybWFsU2luay0+Z2V0VGltZXN0YW1wKHRpbWVzdGFtcCk7CiAKICAgICAgICAgICAgICAgICAvLyBXZSBrZWVwIHRyYWNrIG9mIHRoZSBsYXN0IHZhbGlkIGtlcm5lbCBwb3NpdGlvbiBpbiBjYXNlIHdlIGFyZSBpbiB1bmRlcnJ1bgogICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgbm9ybWFsIG1peGVyIHBlcmlvZCBpcyB0aGUgc2FtZSBhcyB0aGUgZmFzdCBtaXhlciBwZXJpb2QsIG9yIHRoZXJlCkBAIC0zMjI4LDcgKzM0NzAsMTAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICsgbVN1c3BlbmRlZEZyYW1lczsgLy8gYWRkIGZyYW1lcyBkaXNjYXJkZWQgd2hlbiBzdXNwZW5kZWQKICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQogICAgICAgICAgICAgICAgICAgICAgICAgdGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5lcnJvcigpOwogICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAvLyBtRnJhbWVzV3JpdHRlbiBmb3Igbm9uLW9mZmxvYWRlZCB0cmFja3MgYXJlIGNvbnRpZ3VvdXMKICAgICAgICAgICAgIC8vIGV2ZW4gYWZ0ZXIgc3RhbmRieSgpIGlzIGNhbGxlZC4gVGhpcyBpcyB1c2VmdWwgZm9yIHRoZSB0cmFjayBmcmFtZQogICAgICAgICAgICAgLy8gdG8gc2luayBmcmFtZSBtYXBwaW5nLgpAQCAtMzI0NCwxMSArMzQ4OSwxMSBAQAogICAgICAgICAgICAgICAgICAgICAvLyB1c2UgdGhlIHRpbWUgYmVmb3JlIHdlIGNhbGxlZCB0aGUgSEFMIHdyaXRlIC0gaXQgaXMgYSBiaXQgbW9yZSBhY2N1cmF0ZQogICAgICAgICAgICAgICAgICAgICAvLyB0byB3aGVuIHRoZSBzZXJ2ZXIgbGFzdCByZWFkIGRhdGEgdGhhbiB0aGUgY3VycmVudCB0aW1lIGhlcmUuCiAgICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIElmIHdlIGhhdmVuJ3Qgd3JpdHRlbiBhbnl0aGluZywgbUxhc3RXcml0ZVRpbWUgd2lsbCBiZSAtMQorICAgICAgICAgICAgICAgICAgICAvLyBJZiB3ZSBoYXZlbid0IHdyaXR0ZW4gYW55dGhpbmcsIG1MYXN0SW9CZWdpbk5zIHdpbGwgYmUgLTEKICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHdlIHVzZSBzeXN0ZW1UaW1lKCkuCiAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0gbUZyYW1lc1dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fU0VSVkVSXSA9IG1MYXN0V3JpdGVUaW1lID09IC0xCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBzeXN0ZW1UaW1lKCkgOiBtTGFzdFdyaXRlVGltZTsKKyAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0gbUxhc3RJb0JlZ2luTnMgPT0gLTEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IHN5c3RlbVRpbWUoKSA6IG1MYXN0SW9CZWdpbk5zOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGZvciAoY29uc3Qgc3A8VHJhY2s+ICZ0IDogbUFjdGl2ZVRyYWNrcykgewpAQCAtMzI1NiwxMCArMzUwMSwyMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgdC0+dXBkYXRlVHJhY2tGcmFtZUluZm8oCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc1JlbGVhc2VkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtU2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcCk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhtRm9ybWF0KSkgeworICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSBtVGltZXN0YW1wLmdldE91dHB1dFNlcnZlckxhdGVuY3lNcyhtU2FtcGxlUmF0ZSk7CisgICAgICAgICAgICAgICAgaWYgKGxhdGVuY3lNcyAhPSAwLikgeyAvLyBub3RlIDAuIG1lYW5zIHRpbWVzdGFtcCBpcyBlbXB0eS4KKyAgICAgICAgICAgICAgICAgICAgbUxhdGVuY3lNcy5hZGQobGF0ZW5jeU1zKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIH0gLy8gaWYgKG1UeXBlIC4uLiApIHsgLy8gbm8gaW5kZW50YXRpb24KICNpZiAwCiAgICAgICAgICAgICAvLyBsb2dGb3JtYXQgZXhhbXBsZQogICAgICAgICAgICAgaWYgKHogJSAxMDAgPT0gMCkgewpAQCAtMzMwMCw3ICszNTU1LDcgQEAKIAogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCghbUFjdGl2ZVRyYWNrcy5zaXplKCkgJiYgc3lzdGVtVGltZSgpID4gbVN0YW5kYnlUaW1lTnMpIHx8CisgICAgICAgICAgICBpZiAoKG1BY3RpdmVUcmFja3MuaXNFbXB0eSgpICYmIHN5c3RlbVRpbWUoKSA+IG1TdGFuZGJ5VGltZU5zKSB8fAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N1c3BlbmRlZCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gcHV0IGF1ZGlvIGhhcmR3YXJlIGludG8gc3RhbmRieSBhZnRlciBzaG9ydCBkZWxheQogICAgICAgICAgICAgICAgIGlmIChzaG91bGRTdGFuZGJ5X2woKSkgewpAQCAtMzMxMiw5ICszNTY3LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBMT0dfQVVESU9fU1RBVEUoKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtU3RhbmRieSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIHNlbmRTdGF0aXN0aWNzKGZhbHNlIC8qIGZvcmNlICovKTsKICAgICAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgICAgICBpZiAoIW1BY3RpdmVUcmFja3Muc2l6ZSgpICYmIG1Db25maWdFdmVudHMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgaWYgKG1BY3RpdmVUcmFja3MuaXNFbXB0eSgpICYmIG1Db25maWdFdmVudHMuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHdlJ3JlIGFib3V0IHRvIHdhaXQsIGZsdXNoIHRoZSBiaW5kZXIgY29tbWFuZCBidWZmZXIKICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogCkBAIC0zMzU3LDYgKzM2MTMsMjUgQEAKICAgICAgICAgICAgIC8vIGR1cmluZyBtaXhpbmcgYW5kIGVmZmVjdCBwcm9jZXNzIGFzIHRoZSBhdWRpbyBidWZmZXJzIGNvdWxkIGJlIGRlbGV0ZWQKICAgICAgICAgICAgIC8vIG9yIG1vZGlmaWVkIGlmIGFuIGVmZmVjdCBpcyBjcmVhdGVkIG9yIGRlbGV0ZWQKICAgICAgICAgICAgIGxvY2tFZmZlY3RDaGFpbnNfbChlZmZlY3RDaGFpbnMpOworCisgICAgICAgICAgICAvLyBEZXRlcm1pbmUgd2hpY2ggc2Vzc2lvbiB0byBwaWNrIHVwIGhhcHRpYyBkYXRhLgorICAgICAgICAgICAgLy8gVGhpcyBtdXN0IGJlIGRvbmUgdW5kZXIgdGhlIHNhbWUgbG9jayBhcyBwcmVwYXJlVHJhY2tzX2woKS4KKyAgICAgICAgICAgIC8vIFRPRE86IFdyaXRlIGhhcHRpYyBkYXRhIGRpcmVjdGx5IHRvIHNpbmsgYnVmZmVyIHdoZW4gbWl4aW5nLgorICAgICAgICAgICAgaWYgKG1IYXB0aWNDaGFubmVsQ291bnQgPiAwICYmIGVmZmVjdENoYWlucy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiB0cmFjayA6IG1BY3RpdmVUcmFja3MpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5nZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlSGFwdGljU2Vzc2lvbklkID0gdHJhY2stPnNlc3Npb25JZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEFjcXVpcmUgYSBsb2NhbCBjb3B5IG9mIGFjdGl2ZSB0cmFja3Mgd2l0aCBsb2NrIChyZWxlYXNlIHcvbyBsb2NrKS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBDb250cm9sIG1ldGhvZHMgb24gdGhlIHRyYWNrIGFjcXVpcmUgdGhlIFRocmVhZEJhc2UgbG9jayAoZS5nLiBzdGFydCgpCisgICAgICAgICAgICAvLyBzdG9wKCksIHBhdXNlKCksIGV0Yy4pLCBidXQgdGhlIHRocmVhZExvb3AgaXMgZW50aXRsZWQgdG8gY2FsbCBhdWRpbworICAgICAgICAgICAgLy8gZGF0YSAvIGJ1ZmZlciBtZXRob2RzIG9uIHRyYWNrcyBmcm9tIGFjdGl2ZVRyYWNrcyB3aXRob3V0IHRoZSBUaHJlYWRCYXNlIGxvY2suCisgICAgICAgICAgICBhY3RpdmVUcmFja3MuaW5zZXJ0KGFjdGl2ZVRyYWNrcy5lbmQoKSwgbUFjdGl2ZVRyYWNrcy5iZWdpbigpLCBtQWN0aXZlVHJhY2tzLmVuZCgpKTsKICAgICAgICAgfSAvLyBtTG9jayBzY29wZSBlbmRzCiAKICAgICAgICAgaWYgKG1CeXRlc1JlbWFpbmluZyA9PSAwKSB7CkBAIC0zMzcxLDYgKzM2NDYsMTMgQEAKICAgICAgICAgICAgICAgICB0aHJlYWRMb29wX3NsZWVwVGltZSgpOwogICAgICAgICAgICAgICAgIGlmIChtU2xlZXBUaW1lVXMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICBtQ3VycmVudFdyaXRlTGVuZ3RoID0gbVNpbmtCdWZmZXJTaXplOworCisgICAgICAgICAgICAgICAgICAgIC8vIFRhbGx5IHVuZGVycnVuIGZyYW1lcyBhcyB3ZSBhcmUgaW5zZXJ0aW5nIDBzIGhlcmUuCisgICAgICAgICAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgdHJhY2sgOiBhY3RpdmVUcmFja3MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9PSBUcmFjazo6RlNfQUNUSVZFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMobU5vcm1hbEZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gRWl0aGVyIHRocmVhZExvb3BfbWl4KCkgb3IgdGhyZWFkTG9vcF9zbGVlcFRpbWUoKSBzaG91bGQgaGF2ZSBzZXQKQEAgLTMzOTQsOCArMzY3NiwyNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLypsaW1pdCovKTsKICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBpZiAoIWhhc0Zhc3RNaXhlcigpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEJhbGFuY2UgbXVzdCB0YWtlIGVmZmVjdCBhZnRlciBtb25vIGNvbnZlcnNpb24uCisgICAgICAgICAgICAgICAgICAgIC8vIFdlIGRvIGl0IGhlcmUgaWYgdGhlcmUgaXMgbm8gRmFzdE1peGVyLgorICAgICAgICAgICAgICAgICAgICAvLyBtQmFsYW5jZSBkZXRlY3RzIHplcm8gYmFsYW5jZSB3aXRoaW4gdGhlIGNsYXNzIGZvciBzcGVlZCAobm90IG5lZWRlZCBoZXJlKS4KKyAgICAgICAgICAgICAgICAgICAgbUJhbGFuY2Uuc2V0QmFsYW5jZShtTWFzdGVyQmFsYW5jZS5sb2FkKCkpOworICAgICAgICAgICAgICAgICAgICBtQmFsYW5jZS5wcm9jZXNzKChmbG9hdCAqKW1NaXhlckJ1ZmZlciwgbU5vcm1hbEZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIG1lbWNweV9ieV9hdWRpb19mb3JtYXQoYnVmZmVyLCBmb3JtYXQsIG1NaXhlckJ1ZmZlciwgbU1peGVyQnVmZmVyRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgbU5vcm1hbEZyYW1lQ291bnQgKiBtQ2hhbm5lbENvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Ob3JtYWxGcmFtZUNvdW50ICogKG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50KSk7CisKKyAgICAgICAgICAgICAgICAvLyBJZiB3ZSdyZSBnb2luZyBkaXJlY3RseSB0byB0aGUgc2luayBhbmQgdGhlcmUgYXJlIGhhcHRpYyBjaGFubmVscywKKyAgICAgICAgICAgICAgICAvLyB3ZSBzaG91bGQgYWRqdXN0IGNoYW5uZWxzIGFzIHRoZSBzYW1wbGUgZGF0YSBpcyBwYXJ0aWFsbHkgaW50ZXJsZWF2ZWQKKyAgICAgICAgICAgICAgICAvLyBpbiB0aGlzIGNhc2UuCisgICAgICAgICAgICAgICAgaWYgKCFtRWZmZWN0QnVmZmVyVmFsaWQgJiYgbUhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgYWRqdXN0X2NoYW5uZWxzX25vbl9kZXN0cnVjdGl2ZShidWZmZXIsIG1DaGFubmVsQ291bnQsIGJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX2ZyYW1lKG1DaGFubmVsQ291bnQsIGZvcm1hdCkgKiBtTm9ybWFsRnJhbWVDb3VudCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgPSBtQ3VycmVudFdyaXRlTGVuZ3RoOwpAQCAtMzQxMyw2ICszNzEzLDE5IEBACiAgICAgICAgICAgICBpZiAobVNsZWVwVGltZVVzID09IDAgJiYgbVR5cGUgIT0gT0ZGTE9BRCkgewogICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZWZmZWN0Q2hhaW5zLnNpemUoKTsgaSArKykgewogICAgICAgICAgICAgICAgICAgICBlZmZlY3RDaGFpbnNbaV0tPnByb2Nlc3NfbCgpOworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBXcml0ZSBoYXB0aWMgZGF0YSBkaXJlY3RseSB0byBzaW5rIGJ1ZmZlciB3aGVuIG1peGluZy4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZUhhcHRpY1Nlc3Npb25JZCAhPSBBVURJT19TRVNTSU9OX05PTkUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiBhY3RpdmVIYXB0aWNTZXNzaW9uSWQgPT0gZWZmZWN0Q2hhaW5zW2ldLT5zZXNzaW9uSWQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSGFwdGljIGRhdGEgaXMgYWN0aXZlIGluIHRoaXMgY2FzZSwgY29weSBpdCBkaXJlY3RseSBmcm9tCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBidWZmZXIgdG8gb3V0IGJ1ZmZlci4KKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCBhdWRpb0J1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShtQ2hhbm5lbENvdW50LCBFRkZFQ1RfQlVGRkVSX0ZPUk1BVCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdCopZWZmZWN0Q2hhaW5zW2ldLT5vdXRCdWZmZXIoKSArIGF1ZGlvQnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUZGRUNUX0JVRkZFUl9GT1JNQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB1aW50OF90KillZmZlY3RDaGFpbnNbaV0tPmluQnVmZmVyKCkgKyBhdWRpb0J1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVGRkVDVF9CVUZGRVJfRk9STUFULCBtTm9ybWFsRnJhbWVDb3VudCAqIG1IYXB0aWNDaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0zNDM4LDggKzM3NTEsMjQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUgLypsaW1pdCovKTsKICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgaWYgKCFoYXNGYXN0TWl4ZXIoKSkgeworICAgICAgICAgICAgICAgIC8vIEJhbGFuY2UgbXVzdCB0YWtlIGVmZmVjdCBhZnRlciBtb25vIGNvbnZlcnNpb24uCisgICAgICAgICAgICAgICAgLy8gV2UgZG8gaXQgaGVyZSBpZiB0aGVyZSBpcyBubyBGYXN0TWl4ZXIuCisgICAgICAgICAgICAgICAgLy8gbUJhbGFuY2UgZGV0ZWN0cyB6ZXJvIGJhbGFuY2Ugd2l0aGluIHRoZSBjbGFzcyBmb3Igc3BlZWQgKG5vdCBuZWVkZWQgaGVyZSkuCisgICAgICAgICAgICAgICAgbUJhbGFuY2Uuc2V0QmFsYW5jZShtTWFzdGVyQmFsYW5jZS5sb2FkKCkpOworICAgICAgICAgICAgICAgIG1CYWxhbmNlLnByb2Nlc3MoKGZsb2F0ICopbUVmZmVjdEJ1ZmZlciwgbU5vcm1hbEZyYW1lQ291bnQpOworICAgICAgICAgICAgfQorCiAgICAgICAgICAgICBtZW1jcHlfYnlfYXVkaW9fZm9ybWF0KG1TaW5rQnVmZmVyLCBtRm9ybWF0LCBtRWZmZWN0QnVmZmVyLCBtRWZmZWN0QnVmZmVyRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCAqIG1DaGFubmVsQ291bnQpOworICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudCAqIChtQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCkpOworICAgICAgICAgICAgLy8gVGhlIHNhbXBsZSBkYXRhIGlzIHBhcnRpYWxseSBpbnRlcmxlYXZlZCB3aGVuIGhhcHRpYyBjaGFubmVscyBleGlzdCwKKyAgICAgICAgICAgIC8vIHdlIG5lZWQgdG8gYWRqdXN0IGNoYW5uZWxzIGhlcmUuCisgICAgICAgICAgICBpZiAobUhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKKyAgICAgICAgICAgICAgICBhZGp1c3RfY2hhbm5lbHNfbm9uX2Rlc3RydWN0aXZlKG1TaW5rQnVmZmVyLCBtQ2hhbm5lbENvdW50LCBtU2lua0J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1DaGFubmVsQ291bnQgKyBtSGFwdGljQ2hhbm5lbENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShtRm9ybWF0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShtQ2hhbm5lbENvdW50LCBtRm9ybWF0KSAqIG1Ob3JtYWxGcmFtZUNvdW50KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIC8vIGVuYWJsZSBjaGFuZ2VzIGluIGVmZmVjdCBjaGFpbgpAQCAtMzQ0OSw0MyArMzc3OCw2OCBAQAogICAgICAgICAgICAgLy8gbVNsZWVwVGltZVVzID09IDAgbWVhbnMgd2UgbXVzdCB3cml0ZSB0byBhdWRpbyBoYXJkd2FyZQogICAgICAgICAgICAgaWYgKG1TbGVlcFRpbWVVcyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgc3NpemVfdCByZXQgPSAwOwotICAgICAgICAgICAgICAgIC8vIFdlIHNhdmUgbGFzdFdyaXRlRmluaXNoZWQgaGVyZSwgYXMgcHJldmlvdXNMYXN0V3JpdGVGaW5pc2hlZCwKLSAgICAgICAgICAgICAgICAvLyBmb3IgdGhyb3R0bGluZy4gT24gdGhyZWFkIHN0YXJ0LCBwcmV2aW91c0xhc3RXcml0ZUZpbmlzaGVkIHdpbGwgYmUKLSAgICAgICAgICAgICAgICAvLyBzZXQgdG8gLTEsIHdoaWNoIHByb3Blcmx5IHJlc3VsdHMgaW4gbm8gdGhyb3R0bGluZyBhZnRlciB0aGUgZmlyc3Qgd3JpdGUuCi0gICAgICAgICAgICAgICAgbnNlY3NfdCBwcmV2aW91c0xhc3RXcml0ZUZpbmlzaGVkID0gbGFzdFdyaXRlRmluaXNoZWQ7Ci0gICAgICAgICAgICAgICAgbnNlY3NfdCBkZWx0YSA9IDA7CisgICAgICAgICAgICAgICAgLy8gd3JpdGVQZXJpb2ROcyBpcyB1cGRhdGVkID49IDAgd2hlbiByZXQgPiAwLgorICAgICAgICAgICAgICAgIGludDY0X3Qgd3JpdGVQZXJpb2ROcyA9IC0xOwogICAgICAgICAgICAgICAgIGlmIChtQnl0ZXNSZW1haW5pbmcpIHsKICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgcmV3cml0ZSB0byByZWR1Y2UgbnVtYmVyIG9mIHN5c3RlbSBjYWxscwotICAgICAgICAgICAgICAgICAgICBtTGFzdFdyaXRlVGltZSA9IHN5c3RlbVRpbWUoKTsgIC8vIGFsc28gdXNlZCBmb3IgZHVtcHN5cworICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IGxhc3RJb0JlZ2luTnMgPSBzeXN0ZW1UaW1lKCk7CiAgICAgICAgICAgICAgICAgICAgIHJldCA9IHRocmVhZExvb3Bfd3JpdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgbGFzdFdyaXRlRmluaXNoZWQgPSBzeXN0ZW1UaW1lKCk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbHRhID0gbGFzdFdyaXRlRmluaXNoZWQgLSBtTGFzdFdyaXRlVGltZTsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBsYXN0SW9FbmROcyA9IHN5c3RlbVRpbWUoKTsKICAgICAgICAgICAgICAgICAgICAgaWYgKHJldCA8IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1JlbWFpbmluZyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAocmV0ID4gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgbUJ5dGVzV3JpdHRlbiArPSByZXQ7CiAgICAgICAgICAgICAgICAgICAgICAgICBtQnl0ZXNSZW1haW5pbmcgLT0gcmV0OwotICAgICAgICAgICAgICAgICAgICAgICAgbUZyYW1lc1dyaXR0ZW4gKz0gcmV0IC8gbUZyYW1lU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgZnJhbWVzID0gcmV0IC8gbUZyYW1lU2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuICs9IGZyYW1lczsKKworICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVQZXJpb2ROcyA9IGxhc3RJb0VuZE5zIC0gbUxhc3RJb0VuZE5zOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBpbmZvcm1hdGlvbiByZWxhdGluZyB0byB3cml0ZSB0aW1lLgorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2hhc19wcm9wb3J0aW9uYWxfZnJhbWVzKG1Gb3JtYXQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgYXJlIGluIGEgY29udGludW91cyBtaXhpbmcgY3ljbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobU1peGVyU3RhdHVzID09IE1JWEVSX1RSQUNLU19SRUFEWSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9vcENvdW50ID09IGxhc3RMb29wQ291bnRXcml0dGVuICsgMSkgeworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGRvdWJsZSBqaXR0ZXJNcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZXN0YW1wVmVyaWZpZXI8aW50NjRfdCwgaW50NjRfdD46OmNvbXB1dGVKaXR0ZXJNcygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtmcmFtZXMsIHdyaXRlUGVyaW9kTnN9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgezAsIDB9IC8qIGxhc3RUaW1lc3RhbXAgKi8sIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIHByb2Nlc3NNcyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobGFzdElvQmVnaW5OcyAtIG1MYXN0SW9FbmROcykgKiAxZS02OworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Jb0ppdHRlck1zLmFkZChqaXR0ZXJNcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9jZXNzVGltZU1zLmFkZChwcm9jZXNzTXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIGJsb2NrZWQgZGV0ZWN0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50NjRfdCBkZWx0YVdyaXRlTnMgPSBsYXN0SW9FbmROcyAtIGxhc3RJb0JlZ2luTnM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1UeXBlID09IE1JWEVSICYmIGRlbHRhV3JpdGVOcyA+IG1heFBlcmlvZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtTnVtRGVsYXllZFdyaXRlcysrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGxhc3RJb0VuZE5zIC0gbGFzdFdhcm5pbmcpID4ga1dhcm5pbmdUaHJvdHRsZU5zKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfTkFNRSgidW5kZXJydW4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJ3cml0ZSBibG9ja2VkIGZvciAlbGxkIG1zZWNzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlZCBkZWxheWVkIHdyaXRlcywgdGhyZWFkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZylkZWx0YVdyaXRlTnMgLyBOQU5PU19QRVJfTUlMTElTRUNPTkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1EZWxheWVkV3JpdGVzLCBtSWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFdhcm5pbmcgPSBsYXN0SW9FbmROczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSB0aW1pbmcgaW5mby4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0SW9CZWdpbk5zID0gbGFzdElvQmVnaW5OczsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0SW9FbmROcyA9IGxhc3RJb0VuZE5zOworICAgICAgICAgICAgICAgICAgICAgICAgbGFzdExvb3BDb3VudFdyaXR0ZW4gPSBsb29wQ291bnQ7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChtTWl4ZXJTdGF0dXMgPT0gTUlYRVJfRFJBSU5fVFJBQ0spIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAobU1peGVyU3RhdHVzID09IE1JWEVSX0RSQUlOX0FMTCkpIHsKICAgICAgICAgICAgICAgICAgICAgdGhyZWFkTG9vcF9kcmFpbigpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBpZiAobVR5cGUgPT0gTUlYRVIgJiYgIW1TdGFuZGJ5KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIHdyaXRlIGJsb2NrZWQgZGV0ZWN0aW9uCi0gICAgICAgICAgICAgICAgICAgIGlmIChkZWx0YSA+IG1heFBlcmlvZCkgewotICAgICAgICAgICAgICAgICAgICAgICAgbU51bURlbGF5ZWRXcml0ZXMrKzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobGFzdFdyaXRlRmluaXNoZWQgLSBsYXN0V2FybmluZykgPiBrV2FybmluZ1Rocm90dGxlTnMpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVFJBQ0VfTkFNRSgidW5kZXJydW4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygid3JpdGUgYmxvY2tlZCBmb3IgJWxsdSBtc2VjcywgJWQgZGVsYXllZCB3cml0ZXMsIHRocmVhZCAlcCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZyBsb25nKSBuczJtcyhkZWx0YSksIG1OdW1EZWxheWVkV3JpdGVzLCB0aGlzKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0V2FybmluZyA9IGxhc3RXcml0ZUZpbmlzaGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAgICAgaWYgKG1UaHJlYWRUaHJvdHRsZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfUkVBRFkgLy8gd2UgYXJlIG1peGluZyAoYWN0aXZlIHRyYWNrcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiByZXQgPiAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHdyb3RlIHNvbWV0aGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIHdyaXRlUGVyaW9kTnMgPiAwKSB7ICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSB3cml0ZSBwZXJpb2QgaW5mbwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gTGltaXQgTWl4ZXJUaHJlYWQgZGF0YSBwcm9jZXNzaW5nIHRvIG5vIG1vcmUgdGhhbiB0d2ljZSB0aGUKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4cGVjdGVkIHByb2Nlc3NpbmcgcmF0ZS4KICAgICAgICAgICAgICAgICAgICAgICAgIC8vCkBAIC0zNTA0LDEyICszODU4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDIuIHRocmVhZExvb3BfbWl4IChzaWduaWZpY2FudCBmb3IgaGVhdnkgbWl4aW5nLCBlc3BlY2lhbGx5CiAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgb24gbG93IHRpZXIgcHJvY2Vzc29ycykKIAotICAgICAgICAgICAgICAgICAgICAgICAgLy8gaXQncyBPSyBpZiBkZWx0YU1zIChhbmQgZGVsdGFOcykgaXMgYW4gb3ZlcmVzdGltYXRlLgotICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBkZWx0YU5zOwotICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVsdGFOcyA9IGxhc3RXcml0ZUZpbmlzaGVkIC0gcHJldmlvdXNMYXN0V3JpdGVGaW5pc2hlZDsKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9zdWJfb3ZlcmZsb3coCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFdyaXRlRmluaXNoZWQscHJldmlvdXNMYXN0V3JpdGVGaW5pc2hlZCwgJmRlbHRhTnMpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MzJfdCBkZWx0YU1zID0gZGVsdGFOcyAvIDEwMDAwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpdCdzIE9LIGlmIGRlbHRhTXMgaXMgYW4gb3ZlcmVzdGltYXRlLgorCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IGRlbHRhTXMgPSB3cml0ZVBlcmlvZE5zIC8gTkFOT1NfUEVSX01JTExJU0VDT05EOwogCiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQzMl90IHRocm90dGxlTXMgPSAoaW50MzJfdCltSGFsZkJ1ZmZlck1zIC0gZGVsdGFNczsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc2lnbmVkKW1IYWxmQnVmZmVyTXMgPj0gdGhyb3R0bGVNcyAmJiB0aHJvdHRsZU1zID4gMCkgewpAQCAtMzUyMiwxNCArMzg3MywxNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWRUaHJvdHRsZVRpbWVNcyArPSB0aHJvdHRsZU1zOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRocm90dGxlIG11c3QgYmUgYXR0cmlidXRlZCB0byB0aGUgcHJldmlvdXMgbWl4ZXIgbG9vcCdzIHdyaXRlIHRpbWUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhbGxvdyBiYWNrLXRvLWJhY2sgdGhyb3R0bGluZy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0V3JpdGVGaW5pc2hlZCArPSB0aHJvdHRsZU1zICogMTAwMDAwMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGlzIGFsc28gZW5zdXJlcyBwcm9wZXIgdGltaW5nIHN0YXRpc3RpY3MuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxhc3RJb0VuZE5zID0gc3lzdGVtVGltZSgpOyAgLy8gd2UgZmV0Y2ggdGhlIHdyaXRlIGVuZCB0aW1lIGFnYWluLgogICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkaWZmID0gbVRocmVhZFRocm90dGxlVGltZU1zIC0gbVRocmVhZFRocm90dGxlRW5kTXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRpZmYgPiAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vdGlmeSBvZiB0aHJvdHRsZSBlbmQgb24gZGVidWcgbG9nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBwcmV2ZW50IHNwYW1taW5nIGZvciBibHVldG9vdGgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0RfSUYoIWF1ZGlvX2lzX2EyZHBfb3V0X2RldmljZShvdXREZXZpY2UoKSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWF1ZGlvX2lzX2hlYXJpbmdfYWlkX291dF9kZXZpY2Uob3V0RGV2aWNlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRF9JRighaXNTaW5nbGVEZXZpY2VUeXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dERldmljZVR5cGVzKCksIGF1ZGlvX2lzX2EyZHBfb3V0X2RldmljZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzU2luZ2xlRGV2aWNlVHlwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXREZXZpY2VUeXBlcygpLCBhdWRpb19pc19oZWFyaW5nX2FpZF9vdXRfZGV2aWNlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWl4ZXIoJXApIHRocm90dGxlIGVuZDogdGhyb3R0bGUgdGltZSgldSkiLCB0aGlzLCBkaWZmKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZFRocm90dGxlRW5kTXMgPSBtVGhyZWFkVGhyb3R0bGVUaW1lTXM7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQpAQCAtMzYwNSwyNCArMzk1OSwzNiBAQAogLy8gcmVtb3ZlVHJhY2tzX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6cmVtb3ZlVHJhY2tzX2woY29uc3QgVmVjdG9yPCBzcDxUcmFjaz4gPiYgdHJhY2tzVG9SZW1vdmUpCiB7Ci0gICAgc2l6ZV90IGNvdW50ID0gdHJhY2tzVG9SZW1vdmUuc2l6ZSgpOwotICAgIGlmIChjb3VudCA+IDApIHsKLSAgICAgICAgZm9yIChzaXplX3QgaT0wIDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICAgICAgY29uc3Qgc3A8VHJhY2s+JiB0cmFjayA9IHRyYWNrc1RvUmVtb3ZlLml0ZW1BdChpKTsKLSAgICAgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKHRyYWNrKTsKLSAgICAgICAgICAgIEFMT0dWKCJyZW1vdmVUcmFja3NfbCByZW1vdmluZyB0cmFjayBvbiBzZXNzaW9uICVkIiwgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IGdldEVmZmVjdENoYWluX2wodHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoInN0b3BwaW5nIHRyYWNrIG9uIGNoYWluICVwIGZvciBzZXNzaW9uIElkOiAlZCIsIGNoYWluLmdldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPnNlc3Npb25JZCgpKTsKLSAgICAgICAgICAgICAgICBjaGFpbi0+ZGVjQWN0aXZlVHJhY2tDbnQoKTsKLSAgICAgICAgICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIHRyYWNrIDogdHJhY2tzVG9SZW1vdmUpIHsKKyAgICAgICAgbUFjdGl2ZVRyYWNrcy5yZW1vdmUodHJhY2spOworICAgICAgICBBTE9HVigiJXMoJWQpOiByZW1vdmluZyB0cmFjayBvbiBzZXNzaW9uICVkIiwgX19mdW5jX18sIHRyYWNrLT5pZCgpLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKHRyYWNrLT5zZXNzaW9uSWQoKSk7CisgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBzdG9wcGluZyB0cmFjayBvbiBjaGFpbiAlcCBmb3Igc2Vzc2lvbiBJZDogJWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdHJhY2stPmlkKCksIGNoYWluLmdldCgpLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICAgICAgY2hhaW4tPmRlY0FjdGl2ZVRyYWNrQ250KCk7CisgICAgICAgIH0KKyAgICAgICAgLy8gSWYgYW4gZXh0ZXJuYWwgY2xpZW50IHRyYWNrLCBpbmZvcm0gQVBNIHdlJ3JlIG5vIGxvbmdlciBhY3RpdmUsIGFuZCByZW1vdmUgaWYgbmVlZGVkLgorICAgICAgICAvLyBXZSBkbyB0aGlzIHVuZGVyIGxvY2sgc28gdGhhdCB0aGUgc3RhdGUgaXMgY29uc2lzdGVudCBpZiB0aGUgVHJhY2sgaXMgZGVzdHJveWVkLgorICAgICAgICBpZiAodHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7CisgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dCh0cmFjay0+cG9ydElkKCkpOwogICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkgewotICAgICAgICAgICAgICAgIHJlbW92ZVRyYWNrX2wodHJhY2spOworICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KHRyYWNrLT5wb3J0SWQoKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICAgICAgaWYgKHRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkgeworICAgICAgICAgICAgLy8gcmVtb3ZlIGZyb20gb3VyIHRyYWNrcyB2ZWN0b3IKKyAgICAgICAgICAgIHJlbW92ZVRyYWNrX2wodHJhY2spOworICAgICAgICB9CisgICAgICAgIGlmICgodHJhY2stPmNoYW5uZWxNYXNrKCkgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpICE9IEFVRElPX0NIQU5ORUxfTk9ORQorICAgICAgICAgICAgICAgICYmIG1IYXB0aWNDaGFubmVsQ291bnQgPiAwKSB7CisgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIC8vIFVubG9jayBkdWUgdG8gVmlicmF0b3JTZXJ2aWNlIHdpbGwgbG9jayBmb3IgdGhpcyBjYWxsIGFuZCB3aWxsCisgICAgICAgICAgICAvLyBjYWxsIFRyYWNrcy5tdXRlL3VubXV0ZSB3aGljaCBhbHNvIHJlcXVpcmUgdGhyZWFkJ3MgbG9jay4KKyAgICAgICAgICAgIEF1ZGlvRmxpbmdlcjo6b25FeHRlcm5hbFZpYnJhdGlvblN0b3AodHJhY2stPmdldEV4dGVybmFsVmlicmF0aW9uKCkpOworICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICB9CiAgICAgfQotCiB9CiAKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmdldFRpbWVzdGFtcF9sKEF1ZGlvVGltZXN0YW1wJiB0aW1lc3RhbXApCkBAIC0zNjM5LDEyICs0MDA1LDQ3IEBACiAgICAgICAgIHVpbnQ2NF90IHBvc2l0aW9uNjQ7CiAgICAgICAgIGlmIChtT3V0cHV0LT5nZXRQcmVzZW50YXRpb25Qb3NpdGlvbigmcG9zaXRpb242NCwgJnRpbWVzdGFtcC5tVGltZSkgPT0gT0spIHsKICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSAodWludDMyX3QpcG9zaXRpb242NDsKKyAgICAgICAgICAgIGlmIChtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TigpID4gMCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHBvc2l0aW9uT2Zmc2V0ID0KKyAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KShtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXMuZ2V0TWVhbigpICogbVNhbXBsZVJhdGUgKiAxZS0zKTsKKyAgICAgICAgICAgICAgICBpZiAocG9zaXRpb25PZmZzZXQgPiB0aW1lc3RhbXAubVBvc2l0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gPSAwOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb24gLT0gcG9zaXRpb25PZmZzZXQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAorLy8gRm9yIGRlZGljYXRlZCBWb0lQIG91dHB1dHMsIGxldCB0aGUgSEFMIGFwcGx5IHRoZSBzdHJlYW0gdm9sdW1lLiBUcmFjayB2b2x1bWUgaXMKKy8vIHN0aWxsIGFwcGxpZWQgYnkgdGhlIG1peGVyLgorLy8gQWxsIHRyYWNrcyBhdHRhY2hlZCB0byBhIG1peGVyIHdpdGggZmxhZyBWT0lQX1JYIGFyZSB0aWVkIHRvIHRoZSBzYW1lCisvLyBzdHJlYW0gdHlwZSBTVFJFQU1fVk9JQ0VfQ0FMTCBzbyB0aGlzIHdpbGwgb25seSBjaGFuZ2UgdGhlIEhBTCB2b2x1bWUgb25jZSBldmVuCisvLyBpZiBtb3JlIHRoYW4gb25lIHRyYWNrIGFyZSBhY3RpdmUKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OmhhbmRsZVZvaXBWb2x1bWVfbChmbG9hdCAqdm9sdW1lKQoreworICAgIHN0YXR1c190IHJlc3VsdCA9IE5PX0VSUk9SOworICAgIGlmICgobU91dHB1dC0+ZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYKSAhPSAwKSB7CisgICAgICAgIGlmICgqdm9sdW1lICE9IG1MZWZ0Vm9sRmxvYXQpIHsKKyAgICAgICAgICAgIHJlc3VsdCA9IG1PdXRwdXQtPnN0cmVhbS0+c2V0Vm9sdW1lKCp2b2x1bWUsICp2b2x1bWUpOworICAgICAgICAgICAgQUxPR0VfSUYocmVzdWx0ICE9IE9LLAorICAgICAgICAgICAgICAgICAgICAgIkVycm9yIHdoZW4gc2V0dGluZyBvdXRwdXQgc3RyZWFtIHZvbHVtZTogJWQiLCByZXN1bHQpOworICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIG1MZWZ0Vm9sRmxvYXQgPSAqdm9sdW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIGlmIHN0cmVhbSB2b2x1bWUgd2FzIHN1Y2Nlc3NmdWxseSBzZW50IHRvIHRoZSBIQUwsIG1MZWZ0Vm9sRmxvYXQgPT0gdiBoZXJlIGFuZCB3ZQorICAgICAgICAvLyByZW1vdmUgc3RyZWFtIHZvbHVtZSBjb250cmlidXRpb24gZnJvbSBzb2Z0d2FyZSB2b2x1bWUuCisgICAgICAgIGlmIChtTGVmdFZvbEZsb2F0ID09ICp2b2x1bWUpIHsKKyAgICAgICAgICAgICp2b2x1bWUgPSAxLjBmOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCiB7CkBAIC0zNjY3LDI0ICs0MDY4LDMxIEBACiAKICAgICAvLyBzdG9yZSBuZXcgZGV2aWNlIGFuZCBzZW5kIHRvIGVmZmVjdHMKICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHJWZWN0b3IgZGV2aWNlVHlwZUFkZHJzOwogICAgIGZvciAodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYocG9wY291bnQocGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZSkgPiAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgIW1PdXRwdXQtPmF1ZGlvSHdEZXYtPnN1cHBvcnRzQXVkaW9QYXRjaGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVudW1lcmF0ZWQgZGV2aWNlIHR5cGUoJSN4KSBtdXN0IG5vdCBiZSB1c2VkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXMgaXQgZG9lcyBub3Qgc3VwcG9ydCBhdWRpbyBwYXRjaGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlKTsKICAgICAgICAgdHlwZSB8PSBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlOworICAgICAgICBkZXZpY2VUeXBlQWRkcnMucHVzaF9iYWNrKEF1ZGlvRGV2aWNlVHlwZUFkZHIocGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZSwKKyAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS5hZGRyZXNzKSk7CiAgICAgfQogCisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzaW5rUG9ydElkID0gcGF0Y2gtPnNpbmtzWzBdLmlkOwogI2lmZGVmIEFERF9CQVRURVJZX0RBVEEKICAgICAvLyB3aGVuIGNoYW5naW5nIHRoZSBhdWRpbyBvdXRwdXQgZGV2aWNlLCBjYWxsIGFkZEJhdHRlcnlEYXRhIHRvIG5vdGlmeQogICAgIC8vIHRoZSBjaGFuZ2UKLSAgICBpZiAobU91dERldmljZSAhPSB0eXBlKSB7CisgICAgaWYgKG91dERldmljZVR5cGVzKCkgIT0gZGV2aWNlVHlwZXMpIHsKICAgICAgICAgdWludDMyX3QgcGFyYW1zID0gMDsKICAgICAgICAgLy8gY2hlY2sgd2hldGhlciBzcGVha2VyIGlzIG9uCi0gICAgICAgIGlmICh0eXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSB7CisgICAgICAgIGlmIChkZXZpY2VUeXBlcy5jb3VudChBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpID4gMCkgewogICAgICAgICAgICAgcGFyYW1zIHw9IElNZWRpYVBsYXllclNlcnZpY2U6OmtCYXR0ZXJ5RGF0YVNwZWFrZXJPbjsKICAgICAgICAgfQogCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VXaXRob3V0U3BlYWtlcgotICAgICAgICAgICAgPSBBVURJT19ERVZJQ0VfT1VUX0FMTCAmIH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CiAgICAgICAgIC8vIGNoZWNrIGlmIGFueSBvdGhlciBkZXZpY2UgKGV4Y2VwdCBzcGVha2VyKSBpcyBvbgotICAgICAgICBpZiAodHlwZSAmIGRldmljZVdpdGhvdXRTcGVha2VyKSB7CisgICAgICAgIGlmICghaXNTaW5nbGVEZXZpY2VUeXBlKGRldmljZVR5cGVzLCBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpKSB7CiAgICAgICAgICAgICBwYXJhbXMgfD0gSU1lZGlhUGxheWVyU2VydmljZTo6a0JhdHRlcnlEYXRhT3RoZXJBdWRpb0RldmljZU9uOwogICAgICAgICB9CiAKQEAgLTM2OTUsMTQgKzQxMDMsMTUgQEAKICNlbmRpZgogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldERldmljZV9sKHR5cGUpOworICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VzX2woZGV2aWNlVHlwZUFkZHJzKTsKICAgICB9CiAKLSAgICAvLyBtUHJldk91dERldmljZSBpcyB0aGUgbGF0ZXN0IGRldmljZSBzZXQgYnkgY3JlYXRlQXVkaW9QYXRjaF9sKCkuIEl0IGlzIG5vdCBzZXQgd2hlbgotICAgIC8vIHRoZSB0aHJlYWQgaXMgY3JlYXRlZCBzbyB0aGF0IHRoZSBmaXJzdCBwYXRjaCBjcmVhdGlvbiB0cmlnZ2VycyBhbiBpb0NvbmZpZ0NoYW5nZWQgY2FsbGJhY2sKLSAgICBib29sIGNvbmZpZ0NoYW5nZWQgPSBtUHJldk91dERldmljZSAhPSB0eXBlOwotICAgIG1PdXREZXZpY2UgPSB0eXBlOworICAgIC8vIG1QYXRjaC5udW1fc2lua3MgaXMgbm90IHNldCB3aGVuIHRoZSB0aHJlYWQgaXMgY3JlYXRlZCBzbyB0aGF0CisgICAgLy8gdGhlIGZpcnN0IHBhdGNoIGNyZWF0aW9uIHRyaWdnZXJzIGFuIGlvQ29uZmlnQ2hhbmdlZCBjYWxsYmFjaworICAgIGJvb2wgY29uZmlnQ2hhbmdlZCA9IChtUGF0Y2gubnVtX3NpbmtzID09IDApIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgKG1QYXRjaC5zaW5rc1swXS5pZCAhPSBzaW5rUG9ydElkKTsKICAgICBtUGF0Y2ggPSAqcGF0Y2g7CisgICAgbU91dERldmljZVR5cGVBZGRycyA9IGRldmljZVR5cGVBZGRyczsKIAogICAgIGlmIChtT3V0cHV0LT5hdWRpb0h3RGV2LT5zdXBwb3J0c0F1ZGlvUGF0Y2hlcygpKSB7CiAgICAgICAgIHNwPERldmljZUhhbEludGVyZmFjZT4gaHdEZXZpY2UgPSBtT3V0cHV0LT5hdWRpb0h3RGV2LT5od0RldmljZSgpOwpAQCAtMzcyOCw3ICs0MTM3LDYgQEAKICAgICAgICAgKmhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgIH0KICAgICBpZiAoY29uZmlnQ2hhbmdlZCkgewotICAgICAgICBtUHJldk91dERldmljZSA9IHR5cGU7CiAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTM3NTIsNyArNDE2MCw4IEBACiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAKLSAgICBtT3V0RGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgbVBhdGNoID0gYXVkaW9fcGF0Y2h7fTsKKyAgICBtT3V0RGV2aWNlVHlwZUFkZHJzLmNsZWFyKCk7CiAKICAgICBpZiAobU91dHB1dC0+YXVkaW9Id0Rldi0+c3VwcG9ydHNBdWRpb1BhdGNoZXMoKSkgewogICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGh3RGV2aWNlID0gbU91dHB1dC0+YXVkaW9Id0Rldi0+aHdEZXZpY2UoKTsKQEAgLTM3NzcsMTkgKzQxODYsMjMgQEAKICAgICBkZXN0cm95VHJhY2tfbCh0cmFjayk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6Z2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKIHsKLSAgICBUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBUaHJlYWRCYXNlOjp0b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOwogICAgIGNvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CiAgICAgY29uZmlnLT5leHQubWl4Lmh3X21vZHVsZSA9IG1PdXRwdXQtPmF1ZGlvSHdEZXYtPmhhbmRsZSgpOwogICAgIGNvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworICAgIGlmIChtT3V0cHV0ICYmIG1PdXRwdXQtPmZsYWdzICE9IEFVRElPX09VVFBVVF9GTEFHX05PTkUpIHsKKyAgICAgICAgY29uZmlnLT5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICAgICAgY29uZmlnLT5mbGFncy5vdXRwdXQgPSBtT3V0cHV0LT5mbGFnczsKKyAgICB9CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6TWl4ZXJUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAotICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSwgdHlwZV90IHR5cGUpCi0gICAgOiAgIFBsYXliYWNrVGhyZWFkKGF1ZGlvRmxpbmdlciwgb3V0cHV0LCBpZCwgZGV2aWNlLCB0eXBlLCBzeXN0ZW1SZWFkeSksCisgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBib29sIHN5c3RlbVJlYWR5LCB0eXBlX3QgdHlwZSkKKyAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCB0eXBlLCBzeXN0ZW1SZWFkeSksCiAgICAgICAgIC8vIG1BdWRpb01peGVyIGJlbG93CiAgICAgICAgIC8vIG1GYXN0TWl4ZXIgYmVsb3cKICAgICAgICAgbUZhc3RNaXhlckZ1dGV4KDApLApAQCAtMzc5OCw3ICs0MjExLDggQEAKICAgICAgICAgLy8gbVBpcGVTaW5rIGJlbG93CiAgICAgICAgIC8vIG1Ob3JtYWxTaW5rIGJlbG93CiB7Ci0gICAgQUxPR1YoIk1peGVyVGhyZWFkKCkgaWQ9JWQgZGV2aWNlPSUjeCB0eXBlPSVkIiwgaWQsIGRldmljZSwgdHlwZSk7CisgICAgc2V0TWFzdGVyQmFsYW5jZShhdWRpb0ZsaW5nZXItPmdldE1hc3RlckJhbGFuY2VfbCgpKTsKKyAgICBBTE9HVigiTWl4ZXJUaHJlYWQoKSBpZD0lZCB0eXBlPSVkIiwgaWQsIHR5cGUpOwogICAgIEFMT0dWKCJtU2FtcGxlUmF0ZT0ldSwgbUNoYW5uZWxNYXNrPSUjeCwgbUNoYW5uZWxDb3VudD0ldSwgbUZvcm1hdD0lI3gsIG1GcmFtZVNpemU9JXp1LCAiCiAgICAgICAgICAgICAibUZyYW1lQ291bnQ9JXp1LCBtTm9ybWFsRnJhbWVDb3VudD0lenUiLAogICAgICAgICAgICAgbVNhbXBsZVJhdGUsIG1DaGFubmVsTWFzaywgbUNoYW5uZWxDb3VudCwgbUZvcm1hdCwgbUZyYW1lU2l6ZSwgbUZyYW1lQ291bnQsCkBAIC0zODE0LDcgKzQyMjgsOCBAQAogICAgIC8vIGNyZWF0ZSBhbiBOQkFJTyBzaW5rIGZvciB0aGUgSEFMIG91dHB1dCBzdHJlYW0sIGFuZCBuZWdvdGlhdGUKICAgICBtT3V0cHV0U2luayA9IG5ldyBBdWRpb1N0cmVhbU91dFNpbmsob3V0cHV0LT5zdHJlYW0pOwogICAgIHNpemVfdCBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge0Zvcm1hdF9mcm9tX1NSX0MobVNhbXBsZVJhdGUsIG1DaGFubmVsQ291bnQsIG1Gb3JtYXQpfTsKKyAgICBjb25zdCBOQkFJT19Gb3JtYXQgb2ZmZXJzWzFdID0ge0Zvcm1hdF9mcm9tX1NSX0MoCisgICAgICAgICAgICBtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCArIG1IYXB0aWNDaGFubmVsQ291bnQsIG1Gb3JtYXQpfTsKICNpZiAhTE9HX05ERUJVRwogICAgIHNzaXplX3QgaW5kZXggPQogI2Vsc2UKQEAgLTM4MzksNyArNDI1NCw3IEBACiAgICAgICAgIC8vIHNjaGVkdWxlZCByZWxpYWJseSB3aXRoIENGUy4gSG93ZXZlciwgdGhlIEJUIEEyRFAgSEFMIGlzCiAgICAgICAgIC8vIGJ1cnN0eSAoZG9lcyBub3QgcHVsbCBhdCBhIHJlZ3VsYXIgcmF0ZSkgYW5kIHNvIGNhbm5vdCBvcGVyYXRlIHdpdGggRmFzdE1peGVyLgogICAgICAgICBpbml0RmFzdE1peGVyID0gbUZyYW1lQ291bnQgPCBtTm9ybWFsRnJhbWVDb3VudAotICAgICAgICAgICAgICAgICYmIChtT3V0RGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCkgPT0gMDsKKyAgICAgICAgICAgICAgICAmJiBJbnRlcnNlY3Rpb24ob3V0RGV2aWNlVHlwZXMoKSwgZ2V0QXVkaW9EZXZpY2VPdXRBbGxBMmRwU2V0KCkpLmVtcHR5KCk7CiAgICAgICAgIGJyZWFrOwogICAgIH0KICAgICBBTE9HV19JRihpbml0RmFzdE1peGVyID09IGZhbHNlICYmIG1GcmFtZUNvdW50IDwgbU5vcm1hbEZyYW1lQ291bnQsCkBAIC0zODU2LDE2ICs0MjcxLDE0IEBACiAgICAgICAgICAgICAvLyBjaGFuZ2Ugb3VyIFNpbmsgZm9ybWF0IHRvIGFjY2VwdCBvdXIgaW50ZXJtZWRpYXRlIHByZWNpc2lvbgogICAgICAgICAgICAgbUZvcm1hdCA9IGZhc3RNaXhlckZvcm1hdDsKICAgICAgICAgICAgIGZyZWUobVNpbmtCdWZmZXIpOwotICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IG1DaGFubmVsQ291bnQgKiBhdWRpb19ieXRlc19wZXJfc2FtcGxlKG1Gb3JtYXQpOworICAgICAgICAgICAgbUZyYW1lU2l6ZSA9IGF1ZGlvX2J5dGVzX3Blcl9mcmFtZShtQ2hhbm5lbENvdW50ICsgbUhhcHRpY0NoYW5uZWxDb3VudCwgbUZvcm1hdCk7CiAgICAgICAgICAgICBjb25zdCBzaXplX3Qgc2lua0J1ZmZlclNpemUgPSBtTm9ybWFsRnJhbWVDb3VudCAqIG1GcmFtZVNpemU7CiAgICAgICAgICAgICAodm9pZClwb3NpeF9tZW1hbGlnbigmbVNpbmtCdWZmZXIsIDMyLCBzaW5rQnVmZmVyU2l6ZSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBjcmVhdGUgYSBNb25vUGlwZSB0byBjb25uZWN0IG91ciBzdWJtaXggdG8gRmFzdE1peGVyCiAgICAgICAgIE5CQUlPX0Zvcm1hdCBmb3JtYXQgPSBtT3V0cHV0U2luay0+Zm9ybWF0KCk7Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgTkJBSU9fRm9ybWF0IG9yaWdmb3JtYXQgPSBmb3JtYXQ7Ci0jZW5kaWYKKwogICAgICAgICAvLyBhZGp1c3QgZm9ybWF0IHRvIG1hdGNoIHRoYXQgb2YgdGhlIEZhc3QgTWl4ZXIKICAgICAgICAgQUxPR1YoImZvcm1hdCBjaGFuZ2VkIGZyb20gJSN4IHRvICUjeCIsIGZvcm1hdC5tRm9ybWF0LCBmYXN0TWl4ZXJGb3JtYXQpOwogICAgICAgICBmb3JtYXQubUZvcm1hdCA9IGZhc3RNaXhlckZvcm1hdDsKQEAgLTM4NzcsNyArNDI5MCw3IEBACiAgICAgICAgIE1vbm9QaXBlICptb25vUGlwZSA9IG5ldyBNb25vUGlwZShtTm9ybWFsRnJhbWVDb3VudCAqIDQsIGZvcm1hdCwgdHJ1ZSAvKndyaXRlQ2FuQmxvY2sqLyk7CiAgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7Zm9ybWF0fTsKICAgICAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwotI2lmICFMT0dfTkRFQlVHIHx8IGRlZmluZWQoVEVFX1NJTkspCisjaWYgIUxPR19OREVCVUcKICAgICAgICAgc3NpemVfdCBpbmRleCA9CiAjZWxzZQogICAgICAgICAodm9pZCkKQEAgLTM4ODgsMjUgKzQzMDEsOCBAQAogICAgICAgICAgICAgICAgIChtb25vUGlwZS0+bWF4RnJhbWVzKCkgKiA3KSAvIDggOiBtTm9ybWFsRnJhbWVDb3VudCAqIDIpOwogICAgICAgICBtUGlwZVNpbmsgPSBtb25vUGlwZTsKIAotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgIGlmIChtVGVlU2lua091dHB1dEVuYWJsZWQpIHsKLSAgICAgICAgICAgIC8vIGNyZWF0ZSBhIFBpcGUgdG8gYXJjaGl2ZSBhIGNvcHkgb2YgRmFzdE1peGVyJ3Mgb3V0cHV0IGZvciBkdW1wc3lzCi0gICAgICAgICAgICBQaXBlICp0ZWVTaW5rID0gbmV3IFBpcGUobVRlZVNpbmtPdXRwdXRGcmFtZXMsIG9yaWdmb3JtYXQpOwotICAgICAgICAgICAgY29uc3QgTkJBSU9fRm9ybWF0IG9mZmVyczJbMV0gPSB7b3JpZ2Zvcm1hdH07Ci0gICAgICAgICAgICBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICAgICAgICAgIGluZGV4ID0gdGVlU2luay0+bmVnb3RpYXRlKG9mZmVyczIsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwotICAgICAgICAgICAgQUxPR19BU1NFUlQoaW5kZXggPT0gMCk7Ci0gICAgICAgICAgICBtVGVlU2luayA9IHRlZVNpbms7Ci0gICAgICAgICAgICBQaXBlUmVhZGVyICp0ZWVTb3VyY2UgPSBuZXcgUGlwZVJlYWRlcigqdGVlU2luayk7Ci0gICAgICAgICAgICBudW1Db3VudGVyT2ZmZXJzID0gMDsKLSAgICAgICAgICAgIGluZGV4ID0gdGVlU291cmNlLT5uZWdvdGlhdGUob2ZmZXJzMiwgMSwgTlVMTCwgbnVtQ291bnRlck9mZmVycyk7Ci0gICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICAgICAgICAgIG1UZWVTb3VyY2UgPSB0ZWVTb3VyY2U7Ci0gICAgICAgIH0KLSNlbmRpZgotCiAgICAgICAgIC8vIGNyZWF0ZSBmYXN0IG1peGVyIGFuZCBjb25maWd1cmUgaXQgaW5pdGlhbGx5IHdpdGgganVzdCBvbmUgZmFzdCB0cmFjayBmb3Igb3VyIHN1Ym1peAotICAgICAgICBtRmFzdE1peGVyID0gbmV3IEZhc3RNaXhlcigpOworICAgICAgICBtRmFzdE1peGVyID0gbmV3IEZhc3RNaXhlcihtSWQpOwogICAgICAgICBGYXN0TWl4ZXJTdGF0ZVF1ZXVlICpzcSA9IG1GYXN0TWl4ZXItPnNxKCk7CiAjaWZkZWYgU1RBVEVfUVVFVUVfRFVNUAogICAgICAgICBzcS0+c2V0T2JzZXJ2ZXJEdW1wKCZtU3RhdGVRdWV1ZU9ic2VydmVyRHVtcCk7CkBAIC0zOTE3LDggKzQzMTMsMTEgQEAKICAgICAgICAgLy8gd3JhcCB0aGUgc291cmNlIHNpZGUgb2YgdGhlIE1vbm9QaXBlIHRvIG1ha2UgaXQgYW4gQXVkaW9CdWZmZXJQcm92aWRlcgogICAgICAgICBmYXN0VHJhY2stPm1CdWZmZXJQcm92aWRlciA9IG5ldyBTb3VyY2VBdWRpb0J1ZmZlclByb3ZpZGVyKG5ldyBNb25vUGlwZVJlYWRlcihtb25vUGlwZSkpOwogICAgICAgICBmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlciA9IE5VTEw7Ci0gICAgICAgIGZhc3RUcmFjay0+bUNoYW5uZWxNYXNrID0gbUNoYW5uZWxNYXNrOyAvLyBtUGlwZVNpbmsgY2hhbm5lbCBtYXNrIGZvciBhdWRpbyB0byBGYXN0TWl4ZXIKKyAgICAgICAgZmFzdFRyYWNrLT5tQ2hhbm5lbE1hc2sgPSBtQ2hhbm5lbE1hc2sgfCBtSGFwdGljQ2hhbm5lbE1hc2s7IC8vIG1QaXBlU2luayBjaGFubmVsIG1hc2sgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhdWRpbyB0byBGYXN0TWl4ZXIKICAgICAgICAgZmFzdFRyYWNrLT5tRm9ybWF0ID0gbUZvcm1hdDsgLy8gbVBpcGVTaW5rIGZvcm1hdCBmb3IgYXVkaW8gdG8gRmFzdE1peGVyCisgICAgICAgIGZhc3RUcmFjay0+bUhhcHRpY1BsYXliYWNrRW5hYmxlZCA9IG1IYXB0aWNDaGFubmVsTWFzayAhPSBBVURJT19DSEFOTkVMX05PTkU7CisgICAgICAgIGZhc3RUcmFjay0+bUhhcHRpY0ludGVuc2l0eSA9IEF1ZGlvTWl4ZXI6OkhBUFRJQ19TQ0FMRV9OT05FOwogICAgICAgICBmYXN0VHJhY2stPm1HZW5lcmF0aW9uKys7CiAgICAgICAgIHN0YXRlLT5tRmFzdFRyYWNrc0dlbisrOwogICAgICAgICBzdGF0ZS0+bVRyYWNrTWFzayA9IDE7CkBAIC0zOTI2LDI0ICs0MzI1LDMwIEBACiAgICAgICAgIHN0YXRlLT5tT3V0cHV0U2luayA9IG1PdXRwdXRTaW5rLmdldCgpOwogICAgICAgICBzdGF0ZS0+bU91dHB1dFNpbmtHZW4rKzsKICAgICAgICAgc3RhdGUtPm1GcmFtZUNvdW50ID0gbUZyYW1lQ291bnQ7CisgICAgICAgIC8vIHNwZWNpZnkgc2luayBjaGFubmVsIG1hc2sgd2hlbiBoYXB0aWMgY2hhbm5lbCBtYXNrIHByZXNlbnQgYXMgaXQgY2FuIG5vdAorICAgICAgICAvLyBiZSBjYWxjdWxhdGVkIGRpcmVjdGx5IGZyb20gY2hhbm5lbCBjb3VudAorICAgICAgICBzdGF0ZS0+bVNpbmtDaGFubmVsTWFzayA9IG1IYXB0aWNDaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX05PTkUKKyAgICAgICAgICAgICAgICA/IEFVRElPX0NIQU5ORUxfTk9ORSA6IG1DaGFubmVsTWFzayB8IG1IYXB0aWNDaGFubmVsTWFzazsKICAgICAgICAgc3RhdGUtPm1Db21tYW5kID0gRmFzdE1peGVyU3RhdGU6OkNPTERfSURMRTsKICAgICAgICAgLy8gYWxyZWFkeSBkb25lIGluIGNvbnN0cnVjdG9yIGluaXRpYWxpemF0aW9uIGxpc3QKICAgICAgICAgLy9tRmFzdE1peGVyRnV0ZXggPSAwOwogICAgICAgICBzdGF0ZS0+bUNvbGRGdXRleEFkZHIgPSAmbUZhc3RNaXhlckZ1dGV4OwogICAgICAgICBzdGF0ZS0+bUNvbGRHZW4rKzsKICAgICAgICAgc3RhdGUtPm1EdW1wU3RhdGUgPSAmbUZhc3RNaXhlckR1bXBTdGF0ZTsKLSNpZmRlZiBURUVfU0lOSwotICAgICAgICBzdGF0ZS0+bVRlZVNpbmsgPSBtVGVlU2luay5nZXQoKTsKLSNlbmRpZgogICAgICAgICBtRmFzdE1peGVyTkJMb2dXcml0ZXIgPSBhdWRpb0ZsaW5nZXItPm5ld1dyaXRlcl9sKGtGYXN0TWl4ZXJMb2dTaXplLCAiRmFzdE1peGVyIik7CiAgICAgICAgIHN0YXRlLT5tTkJMb2dXcml0ZXIgPSBtRmFzdE1peGVyTkJMb2dXcml0ZXIuZ2V0KCk7CiAgICAgICAgIHNxLT5lbmQoKTsKICAgICAgICAgc3EtPnB1c2goRmFzdE1peGVyU3RhdGVRdWV1ZTo6QkxPQ0tfVU5USUxfUFVTSEVEKTsKIAorICAgICAgICBOQkxvZzo6dGhyZWFkX2luZm9fdCBpbmZvOworICAgICAgICBpbmZvLmlkID0gbUlkOworICAgICAgICBpbmZvLnR5cGUgPSBOQkxvZzo6RkFTVE1JWEVSOworICAgICAgICBtRmFzdE1peGVyTkJMb2dXcml0ZXItPmxvZzxOQkxvZzo6RVZFTlRfVEhSRUFEX0lORk8+KGluZm8pOworCiAgICAgICAgIC8vIHN0YXJ0IHRoZSBmYXN0IG1peGVyCiAgICAgICAgIG1GYXN0TWl4ZXItPnJ1bigiRmFzdE1peGVyIiwgUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKICAgICAgICAgcGlkX3QgdGlkID0gbUZhc3RNaXhlci0+Z2V0VGlkKCk7Ci0gICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkX2NhY2hlZCwgdGlkLCBrUHJpb3JpdHlGYXN0TWl4ZXIsIGZhbHNlIC8qZm9yQXBwKi8pOworICAgICAgICBzZW5kUHJpb0NvbmZpZ0V2ZW50KGdldHBpZCgpLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlciwgZmFsc2UgLypmb3JBcHAqLyk7CiAgICAgICAgIHN0cmVhbSgpLT5zZXRIYWxUaHJlYWRQcmlvcml0eShrUHJpb3JpdHlGYXN0TWl4ZXIpOwogCiAjaWZkZWYgQVVESU9fV0FUQ0hET0cKQEAgLTM5NTIsOSArNDM1NywxNCBAQAogICAgICAgICBtQXVkaW9XYXRjaGRvZy0+c2V0RHVtcCgmbUF1ZGlvV2F0Y2hkb2dEdW1wKTsKICAgICAgICAgbUF1ZGlvV2F0Y2hkb2ctPnJ1bigiQXVkaW9XYXRjaGRvZyIsIFBSSU9SSVRZX1VSR0VOVF9BVURJTyk7CiAgICAgICAgIHRpZCA9IG1BdWRpb1dhdGNoZG9nLT5nZXRUaWQoKTsKLSAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWRfY2FjaGVkLCB0aWQsIGtQcmlvcml0eUZhc3RNaXhlciwgZmFsc2UgLypmb3JBcHAqLyk7CisgICAgICAgIHNlbmRQcmlvQ29uZmlnRXZlbnQoZ2V0cGlkKCksIHRpZCwga1ByaW9yaXR5RmFzdE1peGVyLCBmYWxzZSAvKmZvckFwcCovKTsKICNlbmRpZgotCisgICAgfSBlbHNlIHsKKyNpZmRlZiBURUVfU0lOSworICAgICAgICAvLyBPbmx5IHVzZSB0aGUgTWl4ZXJUaHJlYWQgdGVlIGlmIHRoZXJlIGlzIG5vIEZhc3RNaXhlci4KKyAgICAgICAgbVRlZS5zZXQobU91dHB1dFNpbmstPmZvcm1hdCgpLCBOQkFJT19UZWU6OlRFRV9GTEFHX09VVFBVVF9USFJFQUQpOworICAgICAgICBtVGVlLnNldElkKHN0ZDo6c3RyaW5nKCJfIikgKyBzdGQ6OnRvX3N0cmluZyhtSWQpICsgIl9NIik7CisjZW5kaWYKICAgICB9CiAKICAgICBzd2l0Y2ggKGtVc2VGYXN0TWl4ZXIpIHsKQEAgLTQwMTgsMTIgKzQ0MjgsNiBAQAogICAgIHJldHVybiBsYXRlbmN5OwogfQogCi0KLXZvaWQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6dGhyZWFkTG9vcF9yZW1vdmVUcmFja3MoY29uc3QgVmVjdG9yPCBzcDxUcmFjaz4gPiYgdHJhY2tzVG9SZW1vdmUpCi17Ci0gICAgUGxheWJhY2tUaHJlYWQ6OnRocmVhZExvb3BfcmVtb3ZlVHJhY2tzKHRyYWNrc1RvUmVtb3ZlKTsKLX0KLQogc3NpemVfdCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjp0aHJlYWRMb29wX3dyaXRlKCkKIHsKICAgICAvLyBGSVhNRSB3ZSBzaG91bGQgb25seSBkbyBvbmUgcHVzaCBwZXIgY3ljbGU7IGNvbmZpcm0gdGhpcyBpcyB0cnVlCkBAIC00MjIyLDE0ICs0NjI2LDE0IEBACiBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjptaXhlcl9zdGF0ZSBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpwcmVwYXJlVHJhY2tzX2woCiAgICAgICAgIFZlY3Rvcjwgc3A8VHJhY2s+ID4gKnRyYWNrc1RvUmVtb3ZlKQogewotICAgIC8vIGNsZWFuIHVwIGRlbGV0ZWQgdHJhY2sgbmFtZXMgaW4gQXVkaW9NaXhlciBiZWZvcmUgYWxsb2NhdGluZyBuZXcgdHJhY2tzCi0gICAgKHZvaWQpbVRyYWNrcy5wcm9jZXNzRGVsZXRlZFRyYWNrTmFtZXMoW3RoaXNdKGludCBuYW1lKSB7Ci0gICAgICAgIC8vIGZvciBlYWNoIG5hbWUsIGRlc3Ryb3kgaXQgaW4gdGhlIEF1ZGlvTWl4ZXIKLSAgICAgICAgaWYgKG1BdWRpb01peGVyLT5leGlzdHMobmFtZSkpIHsKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5kZXN0cm95KG5hbWUpOworICAgIC8vIGNsZWFuIHVwIGRlbGV0ZWQgdHJhY2sgaWRzIGluIEF1ZGlvTWl4ZXIgYmVmb3JlIGFsbG9jYXRpbmcgbmV3IHRyYWNrcworICAgICh2b2lkKW1UcmFja3MucHJvY2Vzc0RlbGV0ZWRUcmFja0lkcyhbdGhpc10oaW50IHRyYWNrSWQpIHsKKyAgICAgICAgLy8gZm9yIGVhY2ggdHJhY2tJZCwgZGVzdHJveSBpdCBpbiB0aGUgQXVkaW9NaXhlcgorICAgICAgICBpZiAobUF1ZGlvTWl4ZXItPmV4aXN0cyh0cmFja0lkKSkgeworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmRlc3Ryb3kodHJhY2tJZCk7CiAgICAgICAgIH0KICAgICB9KTsKLSAgICBtVHJhY2tzLmNsZWFyRGVsZXRlZFRyYWNrTmFtZXMoKTsKKyAgICBtVHJhY2tzLmNsZWFyRGVsZXRlZFRyYWNrSWRzKCk7CiAKICAgICBtaXhlcl9zdGF0ZSBtaXhlclN0YXR1cyA9IE1JWEVSX0lETEU7CiAgICAgLy8gZmluZCBvdXQgd2hpY2ggdHJhY2tzIG5lZWQgdG8gYmUgcHJvY2Vzc2VkCkBAIC00MjcwLDYgKzQ2NzQsMzggQEAKICAgICBtTWl4ZXJCdWZmZXJWYWxpZCA9IGZhbHNlOyAgLy8gbU1peGVyQnVmZmVyIGhhcyBubyB2YWxpZCBkYXRhIHVudGlsIGFwcHJvcHJpYXRlIHRyYWNrcyBmb3VuZC4KICAgICBtRWZmZWN0QnVmZmVyVmFsaWQgPSBmYWxzZTsgLy8gbUVmZmVjdEJ1ZmZlciBoYXMgbm8gdmFsaWQgZGF0YSB1bnRpbCB0cmFja3MgZm91bmQuCiAKKyAgICAvLyBEZWZlcnJlZE9wZXJhdGlvbnMgaGFuZGxlcyBzdGF0aXN0aWNzIGFmdGVyIHNldHRpbmcgbWl4ZXJTdGF0dXMuCisgICAgY2xhc3MgRGVmZXJyZWRPcGVyYXRpb25zIHsKKyAgICBwdWJsaWM6CisgICAgICAgIERlZmVycmVkT3BlcmF0aW9ucyhtaXhlcl9zdGF0ZSAqbWl4ZXJTdGF0dXMpCisgICAgICAgICAgICA6IG1NaXhlclN0YXR1cyhtaXhlclN0YXR1cykgeyB9CisKKyAgICAgICAgLy8gd2hlbiBsZWF2aW5nIHNjb3BlLCB0YWxseSBmcmFtZXMgcHJvcGVybHkuCisgICAgICAgIH5EZWZlcnJlZE9wZXJhdGlvbnMoKSB7CisgICAgICAgICAgICAvLyBUYWxseSB1bmRlcnJ1biBmcmFtZXMgb25seSBpZiB3ZSBhcmUgYWN0dWFsbHkgbWl4aW5nIChNSVhFUl9UUkFDS1NfUkVBRFkpCisgICAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgaXMgd2hlbiB0aGUgdW5kZXJydW4gb2NjdXJzLgorICAgICAgICAgICAgLy8gV2UgZG8gbm90IGRpc3Rpbmd1aXNoIGJldHdlZW4gRmFzdFRyYWNrcyBhbmQgTm9ybWFsVHJhY2tzIGhlcmUuCisgICAgICAgICAgICBpZiAoKm1NaXhlclN0YXR1cyA9PSBNSVhFUl9UUkFDS1NfUkVBRFkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnVuZGVycnVuIDogbVVuZGVycnVuRnJhbWVzKSB7CisgICAgICAgICAgICAgICAgICAgIHVuZGVycnVuLmZpcnN0LT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVycnVuLnNlY29uZCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gdGFsbHlVbmRlcnJ1bkZyYW1lcygpIGlzIGNhbGxlZCB0byB1cGRhdGUgdGhlIHRyYWNrIGNvdW50ZXJzCisgICAgICAgIC8vIHdpdGggdGhlIG51bWJlciBvZiB1bmRlcnJ1biBmcmFtZXMgZm9yIGEgcGFydGljdWxhciBtaXhlciBwZXJpb2QuCisgICAgICAgIC8vIFdlIGRlZmVyIHRhbGx5aW5nIHVudGlsIHdlIGtub3cgdGhlIGZpbmFsIG1peGVyIHN0YXR1cy4KKyAgICAgICAgdm9pZCB0YWxseVVuZGVycnVuRnJhbWVzKHNwPFRyYWNrPiB0cmFjaywgc2l6ZV90IHVuZGVycnVuRnJhbWVzKSB7CisgICAgICAgICAgICBtVW5kZXJydW5GcmFtZXMuZW1wbGFjZV9iYWNrKHRyYWNrLCB1bmRlcnJ1bkZyYW1lcyk7CisgICAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IG1peGVyX3N0YXRlICogY29uc3QgbU1peGVyU3RhdHVzOworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3A8VHJhY2s+LCBzaXplX3Q+PiBtVW5kZXJydW5GcmFtZXM7CisgICAgfSBkZWZlcnJlZE9wZXJhdGlvbnMoJm1peGVyU3RhdHVzKTsgLy8gaW1wbGljaXQgbmVzdGVkIHNjb3BlIGZvciB2YXJpYWJsZSBjYXB0dXJlCisKKyAgICBib29sIG5vRmFzdEhhcHRpY1RyYWNrID0gdHJ1ZTsKICAgICBmb3IgKHNpemVfdCBpPTAgOyBpPGNvdW50IDsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFRyYWNrPiB0ID0gbUFjdGl2ZVRyYWNrc1tpXTsKIApAQCAtNDI3OCw2ICs0NzE0LDEzIEBACiAKICAgICAgICAgLy8gcHJvY2VzcyBmYXN0IHRyYWNrcwogICAgICAgICBpZiAodHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUZhc3RNaXhlci5nZXQoKSA9PSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAiJXMoJWQpOiBGYXN0VHJhY2soJWQpIHByZXNlbnQgd2l0aG91dCBGYXN0TWl4ZXIiLAorICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGlkKCksIHRyYWNrLT5pZCgpKTsKKworICAgICAgICAgICAgaWYgKHRyYWNrLT5nZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQoKSkgeworICAgICAgICAgICAgICAgIG5vRmFzdEhhcHRpY1RyYWNrID0gZmFsc2U7CisgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIEl0J3MgdGhlb3JldGljYWxseSBwb3NzaWJsZSAodGhvdWdoIHVubGlrZWx5KSBmb3IgYSBmYXN0IHRyYWNrIHRvIGJlIGNyZWF0ZWQKICAgICAgICAgICAgIC8vIGFuZCB0aGVuIHJlbW92ZWQgd2l0aGluIHRoZSBzYW1lIG5vcm1hbCBtaXggY3ljbGUuICBUaGlzIGlzIG5vdCBhIHByb2JsZW0sIGFzCkBAIC00MzA0LDEzICs0NzQ3LDE0IEBACiAgICAgICAgICAgICB0cmFjay0+bU9ic2VydmVkVW5kZXJydW5zID0gdW5kZXJydW5zOwogICAgICAgICAgICAgLy8gZG9uJ3QgY291bnQgdW5kZXJydW5zIHRoYXQgb2NjdXIgd2hpbGUgc3RvcHBpbmcgb3IgcGF1c2luZwogICAgICAgICAgICAgLy8gb3Igc3RvcHBlZCB3aGljaCBjYW4gb2NjdXIgd2hlbiBmbHVzaCgpIGlzIGNhbGxlZCB3aGlsZSBhY3RpdmUKKyAgICAgICAgICAgIHNpemVfdCB1bmRlcnJ1bkZyYW1lcyA9IDA7CiAgICAgICAgICAgICBpZiAoISh0cmFjay0+aXNTdG9wcGluZygpIHx8IHRyYWNrLT5pc1BhdXNpbmcoKSB8fCB0cmFjay0+aXNTdG9wcGVkKCkpICYmCiAgICAgICAgICAgICAgICAgICAgIHJlY2VudFVuZGVycnVucyA+IDApIHsKICAgICAgICAgICAgICAgICAvLyBGSVhNRSBmYXN0IG1peGVyIHdpbGwgcHVsbCAmIG1peCBwYXJ0aWFsIGJ1ZmZlcnMsIGJ1dCB3ZSBjb3VudCBhcyBhIGZ1bGwgdW5kZXJydW4KLSAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcyhyZWNlbnRVbmRlcnJ1bnMgKiBtRnJhbWVDb3VudCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKDApOworICAgICAgICAgICAgICAgIHVuZGVycnVuRnJhbWVzID0gcmVjZW50VW5kZXJydW5zICogbUZyYW1lQ291bnQ7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBJbW1lZGlhdGVseSBhY2NvdW50IGZvciBGYXN0VHJhY2sgdW5kZXJydW5zLgorICAgICAgICAgICAgdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXModW5kZXJydW5GcmFtZXMpOwogCiAgICAgICAgICAgICAvLyBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHN0YXRlIG1hY2hpbmUgZm9yIG5vcm1hbCB0cmFja3MsCiAgICAgICAgICAgICAvLyB3aXRoIGEgZmV3IG1vZGlmaWNhdGlvbnMgZm9yIGZhc3QgdHJhY2tzLgpAQCAtNDQwMiwyMyArNDg0NiwzMyBAQAogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1Wb2x1bWVQcm92aWRlciA9IHZwOwogICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1DaGFubmVsTWFzayA9IHRyYWNrLT5tQ2hhbm5lbE1hc2s7CiAgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUZvcm1hdCA9IHRyYWNrLT5tRm9ybWF0OworICAgICAgICAgICAgICAgICAgICBmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSB0cmFjay0+Z2V0SGFwdGljUGxheWJhY2tFbmFibGVkKCk7CisgICAgICAgICAgICAgICAgICAgIGZhc3RUcmFjay0+bUhhcHRpY0ludGVuc2l0eSA9IHRyYWNrLT5nZXRIYXB0aWNJbnRlbnNpdHkoKTsKICAgICAgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tR2VuZXJhdGlvbisrOwogICAgICAgICAgICAgICAgICAgICBzdGF0ZS0+bVRyYWNrTWFzayB8PSAxIDw8IGo7CiAgICAgICAgICAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIC8vIG5vIGFja25vd2xlZGdlbWVudCByZXF1aXJlZCBmb3IgbmV3bHkgYWN0aXZlIHRyYWNrcwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBzcDxBdWRpb1RyYWNrU2VydmVyUHJveHk+IHByb3h5ID0gdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHk7CisgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lOworICAgICAgICAgICAgICAgIGlmICh0cmFjay0+aXNQbGF5YmFja1Jlc3RyaWN0ZWQoKSB8fCBtU3RyZWFtVHlwZXNbdHJhY2stPnN0cmVhbVR5cGUoKV0ubXV0ZSkgeworICAgICAgICAgICAgICAgICAgICB2b2x1bWUgPSAwLmY7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdm9sdW1lID0gbWFzdGVyVm9sdW1lICogbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLnZvbHVtZTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBoYW5kbGVWb2lwVm9sdW1lX2woJnZvbHVtZSk7CisKICAgICAgICAgICAgICAgICAvLyBjYWNoZSB0aGUgY29tYmluZWQgbWFzdGVyIHZvbHVtZSBhbmQgc3RyZWFtIHR5cGUgdm9sdW1lIGZvciBmYXN0IG1peGVyOyB0aGlzCiAgICAgICAgICAgICAgICAgLy8gbGFja3MgYW55IHN5bmNocm9uaXphdGlvbiBvciBiYXJyaWVyIHNvIFZvbHVtZVByb3ZpZGVyIG1heSByZWFkIGEgc3RhbGUgdmFsdWUKICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCB2aCA9IHRyYWNrLT5nZXRWb2x1bWVIYW5kbGVyKCktPmdldFZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5LT5mcmFtZXNSZWxlYXNlZCgpKS5maXJzdDsKLSAgICAgICAgICAgICAgICBmbG9hdCB2b2x1bWUgPSBtYXN0ZXJWb2x1bWUKLSAgICAgICAgICAgICAgICAgICAgICAgICogbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLnZvbHVtZQotICAgICAgICAgICAgICAgICAgICAgICAgKiB2aDsKKyAgICAgICAgICAgICAgICAgICAgcHJveHktPmZyYW1lc1JlbGVhc2VkKCkpLmZpcnN0OworICAgICAgICAgICAgICAgIHZvbHVtZSAqPSB2aDsKICAgICAgICAgICAgICAgICB0cmFjay0+bUNhY2hlZFZvbHVtZSA9IHZvbHVtZTsKICAgICAgICAgICAgICAgICBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCB2bHIgPSBwcm94eS0+Z2V0Vm9sdW1lTFIoKTsKICAgICAgICAgICAgICAgICBmbG9hdCB2bGYgPSB2b2x1bWUgKiBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX2xlZnQodmxyKSk7CiAgICAgICAgICAgICAgICAgZmxvYXQgdnJmID0gdm9sdW1lICogZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKTsKKwogICAgICAgICAgICAgICAgIHRyYWNrLT5zZXRGaW5hbFZvbHVtZSgodmxmICsgdnJmKSAvIDIuZik7CiAgICAgICAgICAgICAgICAgKytmYXN0VHJhY2tzOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTQ0NDcsNiArNDkwMSwxMCBAQAogICAgICAgICAgICAgICAgIC8vIEF2b2lkcyBhIG1pc2xlYWRpbmcgZGlzcGxheSBpbiBkdW1wc3lzCiAgICAgICAgICAgICAgICAgdHJhY2stPm1PYnNlcnZlZFVuZGVycnVucy5tQml0RmllbGRzLm1Nb3N0UmVjZW50ID0gVU5ERVJSVU5fRlVMTDsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgIT0gdHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpKSB7CisgICAgICAgICAgICAgICAgZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkID0gdHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpOworICAgICAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQogCkBAIC00NDU2LDE5ICs0OTE0LDIxIEBACiAKICAgICAgICAgLy8gVGhlIGZpcnN0IHRpbWUgYSB0cmFjayBpcyBhZGRlZCB3ZSB3YWl0CiAgICAgICAgIC8vIGZvciBhbGwgaXRzIGJ1ZmZlcnMgdG8gYmUgZmlsbGVkIGJlZm9yZSBwcm9jZXNzaW5nIGl0Ci0gICAgICAgIGludCBuYW1lID0gdHJhY2stPm5hbWUoKTsKKyAgICAgICAgY29uc3QgaW50IHRyYWNrSWQgPSB0cmFjay0+aWQoKTsKIAogICAgICAgICAvLyBpZiBhbiBhY3RpdmUgdHJhY2sgZG9lc24ndCBleGlzdCBpbiB0aGUgQXVkaW9NaXhlciwgY3JlYXRlIGl0LgotICAgICAgICBpZiAoIW1BdWRpb01peGVyLT5leGlzdHMobmFtZSkpIHsKKyAgICAgICAgLy8gdXNlIHRoZSB0cmFja0lkIGFzIHRoZSBBdWRpb01peGVyIG5hbWUuCisgICAgICAgIGlmICghbUF1ZGlvTWl4ZXItPmV4aXN0cyh0cmFja0lkKSkgewogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvTWl4ZXItPmNyZWF0ZSgKLSAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1DaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1Gb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU2Vzc2lvbklkKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiJXM6IGNhbm5vdCBjcmVhdGUgdHJhY2sgbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgJWQsIG1hc2sgJSN4LCBmb3JtYXQgJSN4LCBzZXNzaW9uSWQgJWQgaW4gQXVkaW9NaXhlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbmFtZSwgdHJhY2stPm1DaGFubmVsTWFzaywgdHJhY2stPm1Gb3JtYXQsIHRyYWNrLT5tU2Vzc2lvbklkKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKTogQXVkaW9NaXhlciBjYW5ub3QgY3JlYXRlIHRyYWNrKCVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgbWFzayAlI3gsIGZvcm1hdCAlI3gsIHNlc3Npb25JZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdHJhY2tJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tQ2hhbm5lbE1hc2ssIHRyYWNrLT5tRm9ybWF0LCB0cmFjay0+bVNlc3Npb25JZCk7CiAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CiAgICAgICAgICAgICAgICAgdHJhY2stPmludmFsaWRhdGUoKTsgLy8gY29uc2lkZXIgaXQgZGVhZC4KICAgICAgICAgICAgICAgICBjb250aW51ZTsKQEAgLTQ0ODksNyArNDk0OSw3IEBACiAgICAgICAgIC8vIFRPRE86IE9OTFkgVVNFRCBGT1IgTEVHQUNZIFJFU0FNUExFUlMsIHJlbW92ZSB3aGVuIHRoZXkgYXJlIHJlbW92ZWQuCiAgICAgICAgIC8vIGFkZCBmcmFtZXMgYWxyZWFkeSBjb25zdW1lZCBidXQgbm90IHlldCByZWxlYXNlZCBieSB0aGUgcmVzYW1wbGVyCiAgICAgICAgIC8vIGJlY2F1c2UgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVhZHkoKSB3aWxsIGluY2x1ZGUgdGhlc2UgZnJhbWVzCi0gICAgICAgIGRlc2lyZWRGcmFtZXMgKz0gbUF1ZGlvTWl4ZXItPmdldFVucmVsZWFzZWRGcmFtZXModHJhY2stPm5hbWUoKSk7CisgICAgICAgIGRlc2lyZWRGcmFtZXMgKz0gbUF1ZGlvTWl4ZXItPmdldFVucmVsZWFzZWRGcmFtZXModHJhY2tJZCk7CiAKICAgICAgICAgdWludDMyX3QgbWluRnJhbWVzID0gMTsKICAgICAgICAgaWYgKCh0cmFjay0+c2hhcmVkQnVmZmVyKCkgPT0gMCkgJiYgIXRyYWNrLT5pc1N0b3BwZWQoKSAmJiAhdHJhY2stPmlzUGF1c2luZygpICYmCkBAIC00NTAxLDEzICs0OTYxLDEzIEBACiAgICAgICAgIGlmIChBVFJBQ0VfRU5BQkxFRCgpKSB7CiAgICAgICAgICAgICAvLyBJIHdpc2ggd2UgaGFkIGZvcm1hdHRlZCB0cmFjZSBuYW1lcwogICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHJhY2VOYW1lKCJuUmR5Iik7Ci0gICAgICAgICAgICB0cmFjZU5hbWUgKz0gc3RkOjp0b19zdHJpbmcodHJhY2stPm5hbWUoKSk7CisgICAgICAgICAgICB0cmFjZU5hbWUgKz0gc3RkOjp0b19zdHJpbmcodHJhY2tJZCk7CiAgICAgICAgICAgICBBVFJBQ0VfSU5UKHRyYWNlTmFtZS5jX3N0cigpLCBmcmFtZXNSZWFkeSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChmcmFtZXNSZWFkeSA+PSBtaW5GcmFtZXMpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYKICAgICAgICAgICAgICAgICAhdHJhY2stPmlzUGF1c2VkKCkgJiYgIXRyYWNrLT5pc1Rlcm1pbmF0ZWQoKSkKICAgICAgICAgewotICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayAlZCBzPSUwOHggW09LXSBvbiB0aHJlYWQgJXAiLCBuYW1lLCBjYmxrLT5tU2VydmVyLCB0aGlzKTsKKyAgICAgICAgICAgIEFMT0dWVigidHJhY2soJWQpIHM9JTA4eCBbT0tdIG9uIHRocmVhZCAlcCIsIHRyYWNrSWQsIGNibGstPm1TZXJ2ZXIsIHRoaXMpOwogCiAgICAgICAgICAgICBtaXhlZFRyYWNrcysrOwogCkBAIC00NTI0LDkgKzQ5ODQsOSBAQAogICAgICAgICAgICAgICAgIGlmIChjaGFpbiAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1dpdGhFZmZlY3QrKzsKICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygicHJlcGFyZVRyYWNrc19sKCk6IHRyYWNrICVkIGF0dGFjaGVkIHRvIGVmZmVjdCBidXQgbm8gY2hhaW4gZm91bmQgb24gIgorICAgICAgICAgICAgICAgICAgICBBTE9HVygicHJlcGFyZVRyYWNrc19sKCk6IHRyYWNrKCVkKSBhdHRhY2hlZCB0byBlZmZlY3QgYnV0IG5vIGNoYWluIGZvdW5kIG9uICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2Vzc2lvbiAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdHJhY2stPnNlc3Npb25JZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLCB0cmFjay0+c2Vzc2lvbklkKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KIApAQCAtNDUzNyw5ICs0OTk3LDEyIEBACiAgICAgICAgICAgICAgICAgdHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPSBUcmFjazo6RlNfQUNUSVZFOwogICAgICAgICAgICAgICAgIGlmICh0cmFjay0+bVN0YXRlID09IFRyYWNrQmFzZTo6UkVTVU1JTkcpIHsKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6QUNUSVZFOwotICAgICAgICAgICAgICAgICAgICBwYXJhbSA9IEF1ZGlvTWl4ZXI6OlJBTVBfVk9MVU1FOworICAgICAgICAgICAgICAgICAgICAvLyBJZiBhIG5ldyB0cmFjayBpcyBwYXVzZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgc3RhcnQsIGRvIG5vdCByYW1wIG9uIHJlc3VtZS4KKyAgICAgICAgICAgICAgICAgICAgaWYgKGNibGstPm1TZXJ2ZXIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW0gPSBBdWRpb01peGVyOjpSQU1QX1ZPTFVNRTsKKyAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIEF1ZGlvTWl4ZXI6OlJFU0FNUExFLCBBdWRpb01peGVyOjpSRVNFVCwgTlVMTCk7CisgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcih0cmFja0lkLCBBdWRpb01peGVyOjpSRVNBTVBMRSwgQXVkaW9NaXhlcjo6UkVTRVQsIE5VTEwpOwogICAgICAgICAgICAgICAgIG1MZWZ0Vm9sRmxvYXQgPSAtMS4wOwogICAgICAgICAgICAgLy8gRklYTUUgc2hvdWxkIG5vdCBtYWtlIGEgZGVjaXNpb24gYmFzZWQgb24gbVNlcnZlcgogICAgICAgICAgICAgfSBlbHNlIGlmIChjYmxrLT5tU2VydmVyICE9IDApIHsKQEAgLTQ1NTIsMTcgKzUwMTUsMjMgQEAKICAgICAgICAgICAgIHVpbnQzMl90IHZsLCB2cjsgICAgICAgLy8gaW4gVTguMjQgaW50ZWdlciBmb3JtYXQKICAgICAgICAgICAgIGZsb2F0IHZsZiwgdnJmLCB2YWY7ICAgLy8gaW4gWzAuMCwgMS4wXSBmbG9hdCBmb3JtYXQKICAgICAgICAgICAgIC8vIHJlYWQgb3JpZ2luYWwgdm9sdW1lcyB3aXRoIHZvbHVtZSBjb250cm9sCi0gICAgICAgICAgICBmbG9hdCB0eXBlVm9sdW1lID0gbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLnZvbHVtZTsKLSAgICAgICAgICAgIGZsb2F0IHYgPSBtYXN0ZXJWb2x1bWUgKiB0eXBlVm9sdW1lOworICAgICAgICAgICAgZmxvYXQgdiA9IG1hc3RlclZvbHVtZSAqIG1TdHJlYW1UeXBlc1t0cmFjay0+c3RyZWFtVHlwZSgpXS52b2x1bWU7CisgICAgICAgICAgICAvLyBBbHdheXMgZmV0Y2ggdm9sdW1lc2hhcGVyIHZvbHVtZSB0byBlbnN1cmUgc3RhdGUgaXMgdXBkYXRlZC4KKyAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvVHJhY2tTZXJ2ZXJQcm94eT4gcHJveHkgPSB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eTsKKyAgICAgICAgICAgIGNvbnN0IGZsb2F0IHZoID0gdHJhY2stPmdldFZvbHVtZUhhbmRsZXIoKS0+Z2V0Vm9sdW1lKAorICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKSkuZmlyc3Q7CiAKLSAgICAgICAgICAgIGlmICh0cmFjay0+aXNQYXVzaW5nKCkgfHwgbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLm11dGUpIHsKKyAgICAgICAgICAgIGlmIChtU3RyZWFtVHlwZXNbdHJhY2stPnN0cmVhbVR5cGUoKV0ubXV0ZSB8fCB0cmFjay0+aXNQbGF5YmFja1Jlc3RyaWN0ZWQoKSkgeworICAgICAgICAgICAgICAgIHYgPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBoYW5kbGVWb2lwVm9sdW1lX2woJnYpOworCisgICAgICAgICAgICBpZiAodHJhY2stPmlzUGF1c2luZygpKSB7CiAgICAgICAgICAgICAgICAgdmwgPSB2ciA9IDA7CiAgICAgICAgICAgICAgICAgdmxmID0gdnJmID0gdmFmID0gMC47Ci0gICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1BhdXNpbmcoKSkgewotICAgICAgICAgICAgICAgICAgICB0cmFjay0+c2V0UGF1c2VkKCk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRyYWNrLT5zZXRQYXVzZWQoKTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3A8QXVkaW9UcmFja1NlcnZlclByb3h5PiBwcm94eSA9IHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5OwogICAgICAgICAgICAgICAgIGdhaW5fbWluaWZsb2F0X3BhY2tlZF90IHZsciA9IHByb3h5LT5nZXRWb2x1bWVMUigpOwogICAgICAgICAgICAgICAgIHZsZiA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfbGVmdCh2bHIpKTsKICAgICAgICAgICAgICAgICB2cmYgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX3JpZ2h0KHZscikpOwpAQCAtNDU3NSw4ICs1MDQ0LDYgQEAKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRyYWNrIHJpZ2h0IHZvbHVtZSBvdXQgb2YgcmFuZ2U6ICUuM2ciLCB2cmYpOwogICAgICAgICAgICAgICAgICAgICB2cmYgPSBHQUlOX0ZMT0FUX1VOSVRZOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCB2aCA9IHRyYWNrLT5nZXRWb2x1bWVIYW5kbGVyKCktPmdldFZvbHVtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWxlYXNlZCgpKS5maXJzdDsKICAgICAgICAgICAgICAgICAvLyBub3cgYXBwbHkgdGhlIG1hc3RlciB2b2x1bWUgYW5kIHN0cmVhbSB0eXBlIHZvbHVtZSBhbmQgc2hhcGVyIHZvbHVtZQogICAgICAgICAgICAgICAgIHZsZiAqPSB2ICogdmg7CiAgICAgICAgICAgICAgICAgdnJmICo9IHYgKiB2aDsKQEAgLTQ2MTUsNjEgKzUwODIsNDMgQEAKICAgICAgICAgICAgICAgICB0cmFjay0+bUhhc1ZvbHVtZUNvbnRyb2xsZXIgPSBmYWxzZTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgLy8gRm9yIGRlZGljYXRlZCBWb0lQIG91dHB1dHMsIGxldCB0aGUgSEFMIGFwcGx5IHRoZSBzdHJlYW0gdm9sdW1lLiBUcmFjayB2b2x1bWUgaXMKLSAgICAgICAgICAgIC8vIHN0aWxsIGFwcGxpZWQgYnkgdGhlIG1peGVyLgotICAgICAgICAgICAgaWYgKChtT3V0cHV0LT5mbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX1ZPSVBfUlgpICE9IDApIHsKLSAgICAgICAgICAgICAgICB2ID0gbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLm11dGUgPyAwLjBmIDogdjsKLSAgICAgICAgICAgICAgICBpZiAodiAhPSBtTGVmdFZvbEZsb2F0KSB7Ci0gICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHJlc3VsdCA9IG1PdXRwdXQtPnN0cmVhbS0+c2V0Vm9sdW1lKHYsIHYpOwotICAgICAgICAgICAgICAgICAgICBBTE9HRV9JRihyZXN1bHQgIT0gT0ssICJFcnJvciB3aGVuIHNldHRpbmcgb3V0cHV0IHN0cmVhbSB2b2x1bWU6ICVkIiwgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCA9PSBPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgbUxlZnRWb2xGbG9hdCA9IHY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gaWYgc3RyZWFtIHZvbHVtZSB3YXMgc3VjY2Vzc2Z1bGx5IHNlbnQgdG8gdGhlIEhBTCwgbUxlZnRWb2xGbG9hdCA9PSB2IGhlcmUgYW5kIHdlCi0gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHN0cmVhbSB2b2x1bWUgY29udHJpYnV0aW9uIGZyb20gc29mdHdhcmUgdm9sdW1lLgotICAgICAgICAgICAgICAgIGlmICh2ICE9IDAuMGYgJiYgbUxlZnRWb2xGbG9hdCA9PSB2KSB7Ci0gICAgICAgICAgICAgICAgICAgdmxmID0gbWluKDEuMGYsIHZsZiAvIHYpOwotICAgICAgICAgICAgICAgICAgIHZyZiA9IG1pbigxLjBmLCB2cmYgLyB2KTsKLSAgICAgICAgICAgICAgICAgICB2YWYgPSBtaW4oMS4wZiwgdmFmIC8gdik7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBYWFg6IHRoZXNlIHRoaW5ncyBET04nVCBuZWVkIHRvIGJlIGRvbmUgZWFjaCB0aW1lCi0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIobmFtZSwgdHJhY2spOwotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmVuYWJsZShuYW1lKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRCdWZmZXJQcm92aWRlcih0cmFja0lkLCB0cmFjayk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+ZW5hYmxlKHRyYWNrSWQpOwogCi0gICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKG5hbWUsIHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUwLCAmdmxmKTsKLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIobmFtZSwgcGFyYW0sIEF1ZGlvTWl4ZXI6OlZPTFVNRTEsICZ2cmYpOwotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcihuYW1lLCBwYXJhbSwgQXVkaW9NaXhlcjo6QVVYTEVWRUwsICZ2YWYpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcih0cmFja0lkLCBwYXJhbSwgQXVkaW9NaXhlcjo6Vk9MVU1FMCwgJnZsZik7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKHRyYWNrSWQsIHBhcmFtLCBBdWRpb01peGVyOjpWT0xVTUUxLCAmdnJmKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIodHJhY2tJZCwgcGFyYW0sIEF1ZGlvTWl4ZXI6OkFVWExFVkVMLCAmdmFmKTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkZPUk1BVCwgKHZvaWQgKil0cmFjay0+Zm9ybWF0KCkpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6Q0hBTk5FTF9NQVNLLCAodm9pZCAqKSh1aW50cHRyX3QpdHJhY2stPmNoYW5uZWxNYXNrKCkpOwogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCi0gICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfQ0hBTk5FTF9NQVNLLCAodm9pZCAqKSh1aW50cHRyX3QpbUNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9DSEFOTkVMX01BU0ssCisgICAgICAgICAgICAgICAgKHZvaWQgKikodWludHB0cl90KShtQ2hhbm5lbE1hc2sgfCBtSGFwdGljQ2hhbm5lbE1hc2spKTsKICAgICAgICAgICAgIC8vIGxpbWl0IHRyYWNrIHNhbXBsZSByYXRlIHRvIDIgeCBvdXRwdXQgc2FtcGxlIHJhdGUsIHdoaWNoIGNoYW5nZXMgYXQgcmUtY29uZmlndXJhdGlvbgogICAgICAgICAgICAgdWludDMyX3QgbWF4U2FtcGxlUmF0ZSA9IG1TYW1wbGVSYXRlICogQVVESU9fUkVTQU1QTEVSX0RPV05fUkFUSU9fTUFYOwotICAgICAgICAgICAgdWludDMyX3QgcmVxU2FtcGxlUmF0ZSA9IHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRTYW1wbGVSYXRlKCk7CisgICAgICAgICAgICB1aW50MzJfdCByZXFTYW1wbGVSYXRlID0gcHJveHktPmdldFNhbXBsZVJhdGUoKTsKICAgICAgICAgICAgIGlmIChyZXFTYW1wbGVSYXRlID09IDApIHsKICAgICAgICAgICAgICAgICByZXFTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcVNhbXBsZVJhdGUgPiBtYXhTYW1wbGVSYXRlKSB7CiAgICAgICAgICAgICAgICAgcmVxU2FtcGxlUmF0ZSA9IG1heFNhbXBsZVJhdGU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpSRVNBTVBMRSwKICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpTQU1QTEVfUkFURSwKICAgICAgICAgICAgICAgICAodm9pZCAqKSh1aW50cHRyX3QpcmVxU2FtcGxlUmF0ZSk7CiAKLSAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIHBsYXliYWNrUmF0ZSA9IHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRQbGF5YmFja1JhdGUoKTsKKyAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tSYXRlIHBsYXliYWNrUmF0ZSA9IHByb3h5LT5nZXRQbGF5YmFja1JhdGUoKTsKICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRJTUVTVFJFVENILAogICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlBMQVlCQUNLX1JBVEUsCiAgICAgICAgICAgICAgICAgJnBsYXliYWNrUmF0ZSk7CkBAIC00NjkwLDI5ICs1MTM5LDM3IEBACiAgICAgICAgICAgICAgICAgICAgICYmICh0cmFjay0+bWFpbkJ1ZmZlcigpID09IG1TaW5rQnVmZmVyCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgdHJhY2stPm1haW5CdWZmZXIoKSA9PSBtTWl4ZXJCdWZmZXIpKSB7CiAgICAgICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpNSVhFUl9GT1JNQVQsICh2b2lkICopbU1peGVyQnVmZmVyRm9ybWF0KTsKICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLCAodm9pZCAqKW1NaXhlckJ1ZmZlcik7CiAgICAgICAgICAgICAgICAgLy8gVE9ETzogb3ZlcnJpZGUgdHJhY2stPm1haW5CdWZmZXIoKT8KICAgICAgICAgICAgICAgICBtTWl4ZXJCdWZmZXJWYWxpZCA9IHRydWU7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6TUlYRVJfRk9STUFULCAodm9pZCAqKUVGRkVDVF9CVUZGRVJfRk9STUFUKTsKICAgICAgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0UGFyYW1ldGVyKAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6Ok1BSU5fQlVGRkVSLCAodm9pZCAqKXRyYWNrLT5tYWluQnVmZmVyKCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKLSAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgIHRyYWNrSWQsCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6VFJBQ0ssCiAgICAgICAgICAgICAgICAgQXVkaW9NaXhlcjo6QVVYX0JVRkZFUiwgKHZvaWQgKil0cmFjay0+YXV4QnVmZmVyKCkpOworICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPnNldFBhcmFtZXRlcigKKyAgICAgICAgICAgICAgICB0cmFja0lkLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OlRSQUNLLAorICAgICAgICAgICAgICAgIEF1ZGlvTWl4ZXI6OkhBUFRJQ19FTkFCTEVELCAodm9pZCAqKSh1aW50cHRyX3QpdHJhY2stPmdldEhhcHRpY1BsYXliYWNrRW5hYmxlZCgpKTsKKyAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRQYXJhbWV0ZXIoCisgICAgICAgICAgICAgICAgdHJhY2tJZCwKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpUUkFDSywKKyAgICAgICAgICAgICAgICBBdWRpb01peGVyOjpIQVBUSUNfSU5URU5TSVRZLCAodm9pZCAqKSh1aW50cHRyX3QpdHJhY2stPmdldEhhcHRpY0ludGVuc2l0eSgpKTsKIAogICAgICAgICAgICAgLy8gcmVzZXQgcmV0cnkgY291bnQKICAgICAgICAgICAgIHRyYWNrLT5tUmV0cnlDb3VudCA9IGtNYXhUcmFja1JldHJpZXM7CkBAIC00NzI1LDEzICs1MTgyLDEzIEBACiAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfUkVBRFk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzaXplX3QgdW5kZXJydW5GcmFtZXMgPSAwOwogICAgICAgICAgICAgaWYgKGZyYW1lc1JlYWR5IDwgZGVzaXJlZEZyYW1lcyAmJiAhdHJhY2stPmlzU3RvcHBlZCgpICYmICF0cmFjay0+aXNQYXVzZWQoKSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJ0cmFjayglcCkgdW5kZXJydW4sICBmcmFtZXNSZWFkeSglenUpIDwgZnJhbWVzRGVzaXJlZCglemQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLCBmcmFtZXNSZWFkeSwgZGVzaXJlZEZyYW1lcyk7Ci0gICAgICAgICAgICAgICAgdHJhY2stPm1BdWRpb1RyYWNrU2VydmVyUHJveHktPnRhbGx5VW5kZXJydW5GcmFtZXMoZGVzaXJlZEZyYW1lcyk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKDApOworICAgICAgICAgICAgICAgIEFMT0dWKCJ0cmFjayglZCkgdW5kZXJydW4sICBmcmFtZXNSZWFkeSglenUpIDwgZnJhbWVzRGVzaXJlZCglemQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsIGZyYW1lc1JlYWR5LCBkZXNpcmVkRnJhbWVzKTsKKyAgICAgICAgICAgICAgICB1bmRlcnJ1bkZyYW1lcyA9IGRlc2lyZWRGcmFtZXM7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBkZWZlcnJlZE9wZXJhdGlvbnMudGFsbHlVbmRlcnJ1bkZyYW1lcyh0cmFjaywgdW5kZXJydW5GcmFtZXMpOwogCiAgICAgICAgICAgICAvLyBjbGVhciBlZmZlY3QgY2hhaW4gaW5wdXQgYnVmZmVyIGlmIGFuIGFjdGl2ZSB0cmFjayB1bmRlcnJ1bnMgdG8gYXZvaWQgc2VuZGluZwogICAgICAgICAgICAgLy8gcHJldmlvdXMgYXVkaW8gYnVmZmVyIGFnYWluIHRvIGVmZmVjdHMKQEAgLTQ3NDAsNyArNTE5Nyw3IEBACiAgICAgICAgICAgICAgICAgY2hhaW4tPmNsZWFySW5wdXRCdWZmZXIoKTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQUxPR1ZWKCJ0cmFjayAlZCBzPSUwOHggW05PVCBSRUFEWV0gb24gdGhyZWFkICVwIiwgbmFtZSwgY2Jsay0+bVNlcnZlciwgdGhpcyk7CisgICAgICAgICAgICBBTE9HVlYoInRyYWNrKCVkKSBzPSUwOHggW05PVCBSRUFEWV0gb24gdGhyZWFkICVwIiwgdHJhY2tJZCwgY2Jsay0+bVNlcnZlciwgdGhpcyk7CiAgICAgICAgICAgICBpZiAoKHRyYWNrLT5zaGFyZWRCdWZmZXIoKSAhPSAwKSB8fCB0cmFjay0+aXNUZXJtaW5hdGVkKCkgfHwKICAgICAgICAgICAgICAgICAgICAgdHJhY2stPmlzU3RvcHBlZCgpIHx8IHRyYWNrLT5pc1BhdXNlZCgpKSB7CiAgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBjb25zdW1lZCBhbGwgdGhlIGJ1ZmZlcnMgb2YgdGhpcyB0cmFjay4KQEAgLTQ3NTksNyArNTIxNiw4IEBACiAgICAgICAgICAgICAgICAgLy8gTm8gYnVmZmVycyBmb3IgdGhpcyB0cmFjay4gR2l2ZSBpdCBhIGZldyBjaGFuY2VzIHRvCiAgICAgICAgICAgICAgICAgLy8gZmlsbCBhIGJ1ZmZlciwgdGhlbiByZW1vdmUgaXQgZnJvbSBhY3RpdmUgbGlzdC4KICAgICAgICAgICAgICAgICBpZiAoLS0odHJhY2stPm1SZXRyeUNvdW50KSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dJKCJCVUZGRVIgVElNRU9VVDogcmVtb3ZlKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IG9uIHRocmVhZCAlcCIsIG5hbWUsIHRoaXMpOworICAgICAgICAgICAgICAgICAgICBBTE9HSSgiQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSglZCkgZnJvbSBhY3RpdmUgbGlzdCBvbiB0aHJlYWQgJXAiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSWQsIHRoaXMpOwogICAgICAgICAgICAgICAgICAgICB0cmFja3NUb1JlbW92ZS0+YWRkKHRyYWNrKTsKICAgICAgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgdG8gY2xpZW50IHByb2Nlc3MgdGhhdCB0aGUgdHJhY2sgd2FzIGRpc2FibGVkIGJlY2F1c2Ugb2YgdW5kZXJydW47CiAgICAgICAgICAgICAgICAgICAgIC8vIGl0IHdpbGwgdGhlbiBhdXRvbWF0aWNhbGx5IGNhbGwgc3RhcnQoKSB3aGVuIGRhdGEgaXMgYXZhaWxhYmxlCkBAIC00NzcyLDEzICs1MjMwLDI0IEBACiAgICAgICAgICAgICAgICAgICAgIG1peGVyU3RhdHVzID0gTUlYRVJfVFJBQ0tTX0VOQUJMRUQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgbUF1ZGlvTWl4ZXItPmRpc2FibGUobmFtZSk7CisgICAgICAgICAgICBtQXVkaW9NaXhlci0+ZGlzYWJsZSh0cmFja0lkKTsKICAgICAgICAgfQogCiAgICAgICAgIH0gICAvLyBsb2NhbCB2YXJpYWJsZSBzY29wZSB0byBhdm9pZCBnb3RvIHdhcm5pbmcKIAogICAgIH0KIAorICAgIGlmIChtSGFwdGljQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9OT05FICYmIHNxICE9IE5VTEwpIHsKKyAgICAgICAgLy8gV2hlbiB0aGVyZSBpcyBubyBmYXN0IHRyYWNrIHBsYXlpbmcgaGFwdGljIGFuZCBGYXN0TWl4ZXIgZXhpc3RzLAorICAgICAgICAvLyBlbmFibGluZyB0aGUgZmlyc3QgRmFzdFRyYWNrLCB3aGljaCBwcm92aWRlcyBtaXhlZCBkYXRhIGZyb20gbm9ybWFsCisgICAgICAgIC8vIHRyYWNrcywgdG8gcGxheSBoYXB0aWMgZGF0YS4KKyAgICAgICAgRmFzdFRyYWNrICpmYXN0VHJhY2sgPSAmc3RhdGUtPm1GYXN0VHJhY2tzWzBdOworICAgICAgICBpZiAoZmFzdFRyYWNrLT5tSGFwdGljUGxheWJhY2tFbmFibGVkICE9IG5vRmFzdEhhcHRpY1RyYWNrKSB7CisgICAgICAgICAgICBmYXN0VHJhY2stPm1IYXB0aWNQbGF5YmFja0VuYWJsZWQgPSBub0Zhc3RIYXB0aWNUcmFjazsKKyAgICAgICAgICAgIGRpZE1vZGlmeSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKICAgICAvLyBQdXNoIHRoZSBuZXcgRmFzdE1peGVyIHN0YXRlIGlmIG5lY2Vzc2FyeQogICAgIGJvb2wgcGF1c2VBdWRpb1dhdGNoZG9nID0gZmFsc2U7CiAgICAgaWYgKGRpZE1vZGlmeSkgewpAQCAtNDgzMyw5ICs1MzAyLDkgQEAKICAgICAvLyBvZiBwcmVwYXJlVHJhY2tzX2woKTsgdGhpcyByZWxlYXNlcyBhbnkgb3V0c3RhbmRpbmcgYnVmZmVyIGJhY2sgdG8gdGhlIHRyYWNrLgogICAgIC8vIFNlZSBhbHNvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBkZXN0cm95VHJhY2tfbCgpLgogICAgIGZvciAoY29uc3QgYXV0byAmdHJhY2sgOiAqdHJhY2tzVG9SZW1vdmUpIHsKLSAgICAgICAgY29uc3QgaW50IG5hbWUgPSB0cmFjay0+bmFtZSgpOwotICAgICAgICBpZiAobUF1ZGlvTWl4ZXItPmV4aXN0cyhuYW1lKSkgeyAvLyBOb3JtYWwgdHJhY2tzIGhlcmUsIGZhc3QgdHJhY2tzIGluIEZhc3RNaXhlci4KLSAgICAgICAgICAgIG1BdWRpb01peGVyLT5zZXRCdWZmZXJQcm92aWRlcihuYW1lLCBudWxscHRyIC8qIGJ1ZmZlclByb3ZpZGVyICovKTsKKyAgICAgICAgY29uc3QgaW50IHRyYWNrSWQgPSB0cmFjay0+aWQoKTsKKyAgICAgICAgaWYgKG1BdWRpb01peGVyLT5leGlzdHModHJhY2tJZCkpIHsgLy8gTm9ybWFsIHRyYWNrcyBoZXJlLCBmYXN0IHRyYWNrcyBpbiBGYXN0TWl4ZXIuCisgICAgICAgICAgICBtQXVkaW9NaXhlci0+c2V0QnVmZmVyUHJvdmlkZXIodHJhY2tJZCwgbnVsbHB0ciAvKiBidWZmZXJQcm92aWRlciAqLyk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ5MDIsMTEgKzUzNzEsMTEgQEAKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICAvLyBDaGVjayB2YWxpZGl0eSBhcyB3ZSBkb24ndCBjYWxsIEF1ZGlvTWl4ZXI6OmNyZWF0ZSgpIGhlcmUuCi0gICAgaWYgKCFBdWRpb01peGVyOjppc1ZhbGlkRm9ybWF0KGZvcm1hdCkpIHsKKyAgICBpZiAoIW1BdWRpb01peGVyLT5pc1ZhbGlkRm9ybWF0KGZvcm1hdCkpIHsKICAgICAgICAgQUxPR1coIiVzOiBpbnZhbGlkIGZvcm1hdDogJSN4IiwgX19mdW5jX18sIGZvcm1hdCk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgaWYgKCFBdWRpb01peGVyOjppc1ZhbGlkQ2hhbm5lbE1hc2soY2hhbm5lbE1hc2spKSB7CisgICAgaWYgKCFtQXVkaW9NaXhlci0+aXNWYWxpZENoYW5uZWxNYXNrKGNoYW5uZWxNYXNrKSkgewogICAgICAgICBBTE9HVygiJXM6IGludmFsaWQgY2hhbm5lbE1hc2s6ICUjeCIsIF9fZnVuY19fLCBjaGFubmVsTWFzayk7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC00OTU2LDM5ICs1NDI1LDcgQEAKICAgICAgICAgfQogICAgIH0KICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJvdXRpbmcpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKLSNpZmRlZiBBRERfQkFUVEVSWV9EQVRBCi0gICAgICAgIC8vIHdoZW4gY2hhbmdpbmcgdGhlIGF1ZGlvIG91dHB1dCBkZXZpY2UsIGNhbGwgYWRkQmF0dGVyeURhdGEgdG8gbm90aWZ5Ci0gICAgICAgIC8vIHRoZSBjaGFuZ2UKLSAgICAgICAgaWYgKG1PdXREZXZpY2UgIT0gdmFsdWUpIHsKLSAgICAgICAgICAgIHVpbnQzMl90IHBhcmFtcyA9IDA7Ci0gICAgICAgICAgICAvLyBjaGVjayB3aGV0aGVyIHNwZWFrZXIgaXMgb24KLSAgICAgICAgICAgIGlmICh2YWx1ZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgewotICAgICAgICAgICAgICAgIHBhcmFtcyB8PSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFTcGVha2VyT247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VXaXRob3V0U3BlYWtlcgotICAgICAgICAgICAgICAgID0gQVVESU9fREVWSUNFX09VVF9BTEwgJiB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSOwotICAgICAgICAgICAgLy8gY2hlY2sgaWYgYW55IG90aGVyIGRldmljZSAoZXhjZXB0IHNwZWFrZXIpIGlzIG9uCi0gICAgICAgICAgICBpZiAodmFsdWUgJiBkZXZpY2VXaXRob3V0U3BlYWtlcikgewotICAgICAgICAgICAgICAgIHBhcmFtcyB8PSBJTWVkaWFQbGF5ZXJTZXJ2aWNlOjprQmF0dGVyeURhdGFPdGhlckF1ZGlvRGV2aWNlT247Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChwYXJhbXMgIT0gMCkgewotICAgICAgICAgICAgICAgIGFkZEJhdHRlcnlEYXRhKHBhcmFtcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSNlbmRpZgotCi0gICAgICAgIC8vIGZvcndhcmQgZGV2aWNlIGNoYW5nZSB0byBlZmZlY3RzIHRoYXQgaGF2ZSByZXF1ZXN0ZWQgdG8gYmUKLSAgICAgICAgLy8gYXdhcmUgb2YgYXR0YWNoZWQgYXVkaW8gZGV2aWNlLgotICAgICAgICBpZiAodmFsdWUgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgIGEyZHBEZXZpY2VDaGFuZ2VkID0KLSAgICAgICAgICAgICAgICAgICAgKG1PdXREZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSAhPSAodmFsdWUgJiBBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKTsKLSAgICAgICAgICAgIG1PdXREZXZpY2UgPSB2YWx1ZTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldERldmljZV9sKG1PdXREZXZpY2UpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIExPR19GQVRBTCgiU2hvdWxkIG5vdCBzZXQgcm91dGluZyBkZXZpY2UgaW4gTWl4ZXJUaHJlYWQiKTsKICAgICB9CiAKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CkBAIC01MDA0LDE3ICs1NDQxLDE3IEBACiAgICAgICAgICAgICBkZWxldGUgbUF1ZGlvTWl4ZXI7CiAgICAgICAgICAgICBtQXVkaW9NaXhlciA9IG5ldyBBdWRpb01peGVyKG1Ob3JtYWxGcmFtZUNvdW50LCBtU2FtcGxlUmF0ZSk7CiAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnRyYWNrIDogbVRyYWNrcykgewotICAgICAgICAgICAgICAgIGNvbnN0IGludCBuYW1lID0gdHJhY2stPm5hbWUoKTsKKyAgICAgICAgICAgICAgICBjb25zdCBpbnQgdHJhY2tJZCA9IHRyYWNrLT5pZCgpOwogICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb01peGVyLT5jcmVhdGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tJZCwKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5tU2Vzc2lvbklkKTsKICAgICAgICAgICAgICAgICBBTE9HV19JRihzdGF0dXMgIT0gTk9fRVJST1IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiJXM6IGNhbm5vdCBjcmVhdGUgdHJhY2sgbmFtZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICIgJWQsIG1hc2sgJSN4LCBmb3JtYXQgJSN4LCBzZXNzaW9uSWQgJWQgaW4gQXVkaW9NaXhlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMoKTogQXVkaW9NaXhlciBjYW5ub3QgY3JlYXRlIHRyYWNrKCVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgbWFzayAlI3gsIGZvcm1hdCAlI3gsIHNlc3Npb25JZCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHRyYWNrLT5tQ2hhbm5lbE1hc2ssIHRyYWNrLT5tRm9ybWF0LCB0cmFjay0+bVNlc3Npb25JZCk7CisgICAgICAgICAgICAgICAgICAgICAgICB0cmFja0lkLCB0cmFjay0+bUNoYW5uZWxNYXNrLCB0cmFjay0+bUZvcm1hdCwgdHJhY2stPm1TZXNzaW9uSWQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBVURJT19PVVRQVVRfQ09ORklHX0NIQU5HRUQpOwogICAgICAgICB9CkBAIC01MDI0LDEzICs1NDYxLDE1IEBACiB9CiAKIAotdm9pZCBBdWRpb0ZsaW5nZXI6Ok1peGVyVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNaXhlclRocmVhZDo6ZHVtcEludGVybmFsc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKIHsKLSAgICBQbGF5YmFja1RocmVhZDo6ZHVtcEludGVybmFscyhmZCwgYXJncyk7CisgICAgUGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHNfbChmZCwgYXJncyk7CiAgICAgZHByaW50ZihmZCwgIiAgVGhyZWFkIHRocm90dGxlIHRpbWUgKG1zZWNzKTogJXVcbiIsIG1UaHJlYWRUaHJvdHRsZVRpbWVNcyk7CiAgICAgZHByaW50ZihmZCwgIiAgQXVkaW9NaXhlciB0cmFja3M6ICVzXG4iLCBtQXVkaW9NaXhlci0+dHJhY2tOYW1lcygpLmNfc3RyKCkpOwogICAgIGRwcmludGYoZmQsICIgIE1hc3RlciBtb25vOiAlc1xuIiwgbU1hc3Rlck1vbm8gPyAib24iIDogIm9mZiIpOwotCisgICAgZHByaW50ZihmZCwgIiAgTWFzdGVyIGJhbGFuY2U6ICVmICglcylcbiIsIG1NYXN0ZXJCYWxhbmNlLmxvYWQoKSwKKyAgICAgICAgICAgIChoYXNGYXN0TWl4ZXIoKSA/IHN0ZDo6dG9fc3RyaW5nKG1GYXN0TWl4ZXItPmdldE1hc3RlckJhbGFuY2UoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG1CYWxhbmNlLnRvU3RyaW5nKCkpLmNfc3RyKCkpOwogICAgIGlmIChoYXNGYXN0TWl4ZXIoKSkgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBGYXN0TWl4ZXIgdGhyZWFkICVwIHRpZD0lZCIsIG1GYXN0TWl4ZXIuZ2V0KCksIG1GYXN0TWl4ZXItPmdldFRpZCgpKTsKIApAQCAtNTAzOCw5ICs1NDc3LDkgQEAKICAgICAgICAgLy8gd2hpbGUgd2UgYXJlIGR1bXBpbmcgaXQuICBJdCBtYXkgYmUgaW5jb25zaXN0ZW50LCBidXQgaXQgd29uJ3QgbXV0YXRlIQogICAgICAgICAvLyBUaGlzIGlzIGEgbGFyZ2Ugb2JqZWN0IHNvIHdlIHBsYWNlIGl0IG9uIHRoZSBoZWFwLgogICAgICAgICAvLyBGSVhNRSAyNTk3Mjk1ODogTmVlZCBhbiBpbnRlbGxpZ2VudCBjb3B5IGNvbnN0cnVjdG9yIHRoYXQgZG9lcyBub3QgdG91Y2ggdW51c2VkIHBhZ2VzLgotICAgICAgICBjb25zdCBGYXN0TWl4ZXJEdW1wU3RhdGUgKmNvcHkgPSBuZXcgRmFzdE1peGVyRHVtcFN0YXRlKG1GYXN0TWl4ZXJEdW1wU3RhdGUpOworICAgICAgICBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8RmFzdE1peGVyRHVtcFN0YXRlPiBjb3B5ID0KKyAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPEZhc3RNaXhlckR1bXBTdGF0ZT4obUZhc3RNaXhlckR1bXBTdGF0ZSk7CiAgICAgICAgIGNvcHktPmR1bXAoZmQpOwotICAgICAgICBkZWxldGUgY29weTsKIAogI2lmZGVmIFNUQVRFX1FVRVVFX0RVTVAKICAgICAgICAgLy8gU2ltaWxhciBmb3Igc3RhdGUgcXVldWUKQEAgLTUwNjEsMTIgKzU1MDAsNiBAQAogICAgIH0gZWxzZSB7CiAgICAgICAgIGRwcmludGYoZmQsICIgIE5vIEZhc3RNaXhlclxuIik7CiAgICAgfQotCi0jaWZkZWYgVEVFX1NJTksKLSAgICAvLyBXcml0ZSB0aGUgdGVlIG91dHB1dCB0byBhIC53YXYgZmlsZQotICAgIGR1bXBUZWUoZmQsIG1UZWVTb3VyY2UsIG1JZCwgJ00nKTsKLSNlbmRpZgotCiB9CiAKIHVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQ6OmlkbGVTbGVlcFRpbWVVcygpIGNvbnN0CkBAIC01MDkzLDUyICs1NTI2LDYwIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpEaXJlY3RPdXRwdXRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAotICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LCBhdWRpb19pb19oYW5kbGVfdCBpZCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSkKLSAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIERJUkVDVCwgc3lzdGVtUmVhZHkpCisgICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBUaHJlYWRCYXNlOjp0eXBlX3QgdHlwZSwgYm9vbCBzeXN0ZW1SZWFkeSkKKyAgICA6ICAgUGxheWJhY2tUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCB0eXBlLCBzeXN0ZW1SZWFkeSkKIHsKLX0KLQotQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OkRpcmVjdE91dHB1dFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCi0gICAgICAgIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCB1aW50MzJfdCBkZXZpY2UsCi0gICAgICAgIFRocmVhZEJhc2U6OnR5cGVfdCB0eXBlLCBib29sIHN5c3RlbVJlYWR5KQotICAgIDogICBQbGF5YmFja1RocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIGRldmljZSwgdHlwZSwgc3lzdGVtUmVhZHkpCi0gICAgICAgICwgbVZvbHVtZVNoYXBlckFjdGl2ZShmYWxzZSkKLXsKKyAgICBzZXRNYXN0ZXJCYWxhbmNlKGF1ZGlvRmxpbmdlci0+Z2V0TWFzdGVyQmFsYW5jZV9sKCkpOwogfQogCiBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6fkRpcmVjdE91dHB1dFRocmVhZCgpCiB7CiB9CiAKK3ZvaWQgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit7CisgICAgUGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHNfbChmZCwgYXJncyk7CisgICAgZHByaW50ZihmZCwgIiAgTWFzdGVyIGJhbGFuY2U6ICVmICBMZWZ0OiAlZiAgUmlnaHQ6ICVmXG4iLAorICAgICAgICAgICAgbU1hc3RlckJhbGFuY2UubG9hZCgpLCBtTWFzdGVyQmFsYW5jZUxlZnQsIG1NYXN0ZXJCYWxhbmNlUmlnaHQpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6RGlyZWN0T3V0cHV0VGhyZWFkOjpzZXRNYXN0ZXJCYWxhbmNlKGZsb2F0IGJhbGFuY2UpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobU1hc3RlckJhbGFuY2UgIT0gYmFsYW5jZSkgeworICAgICAgICBtTWFzdGVyQmFsYW5jZS5zdG9yZShiYWxhbmNlKTsKKyAgICAgICAgbUJhbGFuY2UuY29tcHV0ZVN0ZXJlb0JhbGFuY2UoYmFsYW5jZSwgJm1NYXN0ZXJCYWxhbmNlTGVmdCwgJm1NYXN0ZXJCYWxhbmNlUmlnaHQpOworICAgICAgICBicm9hZGNhc3RfbCgpOworICAgIH0KK30KKwogdm9pZCBBdWRpb0ZsaW5nZXI6OkRpcmVjdE91dHB1dFRocmVhZDo6cHJvY2Vzc1ZvbHVtZV9sKFRyYWNrICp0cmFjaywgYm9vbCBsYXN0VHJhY2spCiB7CiAgICAgZmxvYXQgbGVmdCwgcmlnaHQ7CiAKLSAgICBpZiAobU1hc3Rlck11dGUgfHwgbVN0cmVhbVR5cGVzW3RyYWNrLT5zdHJlYW1UeXBlKCldLm11dGUpIHsKKyAgICAvLyBFbnN1cmUgdm9sdW1lc2hhcGVyIHN0YXRlIGFsd2F5cyBhZHZhbmNlcyBldmVuIHdoZW4gbXV0ZWQuCisgICAgY29uc3Qgc3A8QXVkaW9UcmFja1NlcnZlclByb3h5PiBwcm94eSA9IHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5OworICAgIGNvbnN0IGF1dG8gW3NoYXBlclZvbHVtZSwgc2hhcGVyQWN0aXZlXSA9IHRyYWNrLT5nZXRWb2x1bWVIYW5kbGVyKCktPmdldFZvbHVtZSgKKyAgICAgICAgICAgIHByb3h5LT5mcmFtZXNSZWxlYXNlZCgpKTsKKyAgICBtVm9sdW1lU2hhcGVyQWN0aXZlID0gc2hhcGVyQWN0aXZlOworCisgICAgaWYgKG1NYXN0ZXJNdXRlIHx8IG1TdHJlYW1UeXBlc1t0cmFjay0+c3RyZWFtVHlwZSgpXS5tdXRlIHx8IHRyYWNrLT5pc1BsYXliYWNrUmVzdHJpY3RlZCgpKSB7CiAgICAgICAgIGxlZnQgPSByaWdodCA9IDA7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZmxvYXQgdHlwZVZvbHVtZSA9IG1TdHJlYW1UeXBlc1t0cmFjay0+c3RyZWFtVHlwZSgpXS52b2x1bWU7Ci0gICAgICAgIGZsb2F0IHYgPSBtTWFzdGVyVm9sdW1lICogdHlwZVZvbHVtZTsKLSAgICAgICAgc3A8QXVkaW9UcmFja1NlcnZlclByb3h5PiBwcm94eSA9IHRyYWNrLT5tQXVkaW9UcmFja1NlcnZlclByb3h5OwotCi0gICAgICAgIC8vIEdldCB2b2x1bWVzaGFwZXIgc2NhbGluZwotICAgICAgICBzdGQ6OnBhaXI8ZmxvYXQgLyogdm9sdW1lICovLCBib29sIC8qIGFjdGl2ZSAqLz4KLSAgICAgICAgICAgIHZoID0gdHJhY2stPmdldFZvbHVtZUhhbmRsZXIoKS0+Z2V0Vm9sdW1lKAotICAgICAgICAgICAgICAgICAgICB0cmFjay0+bUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKSk7Ci0gICAgICAgIHYgKj0gdmguZmlyc3Q7Ci0gICAgICAgIG1Wb2x1bWVTaGFwZXJBY3RpdmUgPSB2aC5zZWNvbmQ7CisgICAgICAgIGNvbnN0IGZsb2F0IHYgPSBtTWFzdGVyVm9sdW1lICogdHlwZVZvbHVtZSAqIHNoYXBlclZvbHVtZTsKIAogICAgICAgICBnYWluX21pbmlmbG9hdF9wYWNrZWRfdCB2bHIgPSBwcm94eS0+Z2V0Vm9sdW1lTFIoKTsKICAgICAgICAgbGVmdCA9IGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfbGVmdCh2bHIpKTsKICAgICAgICAgaWYgKGxlZnQgPiBHQUlOX0ZMT0FUX1VOSVRZKSB7CiAgICAgICAgICAgICBsZWZ0ID0gR0FJTl9GTE9BVF9VTklUWTsKICAgICAgICAgfQotICAgICAgICBsZWZ0ICo9IHY7CisgICAgICAgIGxlZnQgKj0gdiAqIG1NYXN0ZXJCYWxhbmNlTGVmdDsgLy8gRGlyZWN0T3V0cHV0VGhyZWFkIGJhbGFuY2UgYXBwbGllZCBhcyB0cmFjayB2b2x1bWUKICAgICAgICAgcmlnaHQgPSBmbG9hdF9mcm9tX2dhaW4oZ2Fpbl9taW5pZmxvYXRfdW5wYWNrX3JpZ2h0KHZscikpOwogICAgICAgICBpZiAocmlnaHQgPiBHQUlOX0ZMT0FUX1VOSVRZKSB7CiAgICAgICAgICAgICByaWdodCA9IEdBSU5fRkxPQVRfVU5JVFk7CiAgICAgICAgIH0KLSAgICAgICAgcmlnaHQgKj0gdjsKKyAgICAgICAgcmlnaHQgKj0gdiAqIG1NYXN0ZXJCYWxhbmNlUmlnaHQ7CiAgICAgfQogCiAgICAgaWYgKGxhc3RUcmFjaykgewpAQCAtNTE4MCw2ICs1NjIxLDExIEBACiAgICAgICAgICAgICAgICAgbUZsdXNoUGVuZGluZyA9IHRydWU7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHByZXZpb3VzVHJhY2sgPT0gMCkgeworICAgICAgICAvLyB0aGVyZSBjb3VsZCBiZSBhbiBvbGQgdHJhY2sgYWRkZWQgYmFjayBkdXJpbmcgdHJhY2sgdHJhbnNpdGlvbiBmb3IgZGlyZWN0CisgICAgICAgIC8vIG91dHB1dCwgc28gYWx3YXlzIGlzc3VlcyBmbHVzaCB0byBmbHVzaCBkYXRhIG9mIHRoZSBwcmV2aW91cyB0cmFjayBpZiBpdAorICAgICAgICAvLyB3YXMgYWxyZWFkeSBkZXN0cm95ZWQgd2l0aCBIQUwgcGF1c2VkLCB0aGVuIGZsdXNoIGNhbiByZXN1bWUgdGhlIHBsYXliYWNrCisgICAgICAgIG1GbHVzaFBlbmRpbmcgPSB0cnVlOwogICAgIH0KICAgICBQbGF5YmFja1RocmVhZDo6b25BZGROZXdUcmFja19sKCk7CiB9CkBAIC01MjE4LDcgKzU2NjQsNiBAQAogICAgICAgICAgICAgICAgIGRvSHdQYXVzZSA9IHRydWU7CiAgICAgICAgICAgICAgICAgbUh3UGF1c2VkID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICB9IGVsc2UgaWYgKHRyYWNrLT5pc0ZsdXNoUGVuZGluZygpKSB7CiAgICAgICAgICAgICB0cmFjay0+Zmx1c2hBY2soKTsKICAgICAgICAgICAgIGlmIChsYXN0KSB7CkBAIC01MjUwLDEwICs1Njk1LDE3IEBACiAgICAgICAgICAgICBtaW5GcmFtZXMgPSAxOwogICAgICAgICB9CiAKLSAgICAgICAgaWYgKCh0cmFjay0+ZnJhbWVzUmVhZHkoKSA+PSBtaW5GcmFtZXMpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYgIXRyYWNrLT5pc1BhdXNlZCgpICYmCisgICAgICAgIGNvbnN0IHNpemVfdCBmcmFtZXNSZWFkeSA9IHRyYWNrLT5mcmFtZXNSZWFkeSgpOworICAgICAgICBjb25zdCBpbnQgdHJhY2tJZCA9IHRyYWNrLT5pZCgpOworICAgICAgICBpZiAoQVRSQUNFX0VOQUJMRUQoKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHJhY2VOYW1lKCJuUmR5Iik7CisgICAgICAgICAgICB0cmFjZU5hbWUgKz0gc3RkOjp0b19zdHJpbmcodHJhY2tJZCk7CisgICAgICAgICAgICBBVFJBQ0VfSU5UKHRyYWNlTmFtZS5jX3N0cigpLCBmcmFtZXNSZWFkeSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChmcmFtZXNSZWFkeSA+PSBtaW5GcmFtZXMpICYmIHRyYWNrLT5pc1JlYWR5KCkgJiYgIXRyYWNrLT5pc1BhdXNlZCgpICYmCiAgICAgICAgICAgICAgICAgIXRyYWNrLT5pc1N0b3BwaW5nXzIoKSAmJiAhdHJhY2stPmlzU3RvcHBlZCgpKQogICAgICAgICB7Ci0gICAgICAgICAgICBBTE9HVlYoInRyYWNrICVkIHM9JTA4eCBbT0tdIiwgdHJhY2stPm5hbWUoKSwgY2Jsay0+bVNlcnZlcik7CisgICAgICAgICAgICBBTE9HVlYoInRyYWNrKCVkKSBzPSUwOHggW09LXSIsIHRyYWNrSWQsIGNibGstPm1TZXJ2ZXIpOwogCiAgICAgICAgICAgICBpZiAodHJhY2stPm1GaWxsaW5nVXBTdGF0dXMgPT0gVHJhY2s6OkZTX0ZJTExFRCkgewogICAgICAgICAgICAgICAgIHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID0gVHJhY2s6OkZTX0FDVElWRTsKQEAgLTUzMTUsNyArNTc2Nyw4IEBACiAKICAgICAgICAgICAgICAgICBpbnQ2NF90IGZyYW1lc1dyaXR0ZW4gPSBtQnl0ZXNXcml0dGVuIC8gbUZyYW1lU2l6ZTsKICAgICAgICAgICAgICAgICBpZiAobVN0YW5kYnkgfHwgIWxhc3QgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVzZW50YXRpb25Db21wbGV0ZShmcmFtZXNXcml0dGVuLCBhdWRpb0hBTEZyYW1lcykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5wcmVzZW50YXRpb25Db21wbGV0ZShmcmFtZXNXcml0dGVuLCBhdWRpb0hBTEZyYW1lcykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5pc1BhdXNlZCgpIHx8IG1Id1BhdXNlZCkgewogICAgICAgICAgICAgICAgICAgICBpZiAodHJhY2stPmlzU3RvcHBpbmdfMigpKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVE9QUEVEOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC01MzI5LDcgKzU3ODIsNyBAQAogICAgICAgICAgICAgICAgIC8vIGZpbGwgYSBidWZmZXIsIHRoZW4gcmVtb3ZlIGl0IGZyb20gYWN0aXZlIGxpc3QuCiAgICAgICAgICAgICAgICAgLy8gT25seSBjb25zaWRlciBsYXN0IHRyYWNrIHN0YXJ0ZWQgZm9yIG1peGVyIHN0YXRlIGNvbnRyb2wKICAgICAgICAgICAgICAgICBpZiAoLS0odHJhY2stPm1SZXRyeUNvdW50KSA8PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJCVUZGRVIgVElNRU9VVDogcmVtb3ZlKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IiwgdHJhY2stPm5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJCVUZGRVIgVElNRU9VVDogcmVtb3ZlIHRyYWNrKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IiwgdHJhY2tJZCk7CiAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICAgICAgICAgICAgICAvLyBpbmRpY2F0ZSB0byBjbGllbnQgcHJvY2VzcyB0aGF0IHRoZSB0cmFjayB3YXMgZGlzYWJsZWQgYmVjYXVzZSBvZiB1bmRlcnJ1bjsKICAgICAgICAgICAgICAgICAgICAgLy8gaXQgd2lsbCB0aGVuIGF1dG9tYXRpY2FsbHkgY2FsbCBzdGFydCgpIHdoZW4gZGF0YSBpcyBhdmFpbGFibGUKQEAgLTUzMzcsNyArNTc5MCw3IEBACiAgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChsYXN0KSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJwYXVzZSBiZWNhdXNlIG9mIFVOREVSUlVOLCBmcmFtZXNSZWFkeSA9ICV6dSwiCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1pbkZyYW1lcyA9ICV1LCBtRm9ybWF0ID0gJSN4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+ZnJhbWVzUmVhZHkoKSwgbWluRnJhbWVzLCBtRm9ybWF0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNSZWFkeSwgbWluRnJhbWVzLCBtRm9ybWF0KTsKICAgICAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfRU5BQkxFRDsKICAgICAgICAgICAgICAgICAgICAgaWYgKG1Id1N1cHBvcnRzUGF1c2UgJiYgIW1Id1BhdXNlZCAmJiAhbVN0YW5kYnkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGRvSHdQYXVzZSA9IHRydWU7CkBAIC01NDc2LDE2ICs1OTI5LDcgQEAKICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbSA9IEF1ZGlvUGFyYW1ldGVyKGtleVZhbHVlUGFpcik7CiAgICAgaW50IHZhbHVlOwogICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICAvLyBmb3J3YXJkIGRldmljZSBjaGFuZ2UgdG8gZWZmZWN0cyB0aGF0IGhhdmUgcmVxdWVzdGVkIHRvIGJlCi0gICAgICAgIC8vIGF3YXJlIG9mIGF0dGFjaGVkIGF1ZGlvIGRldmljZS4KLSAgICAgICAgaWYgKHZhbHVlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICBhMmRwRGV2aWNlQ2hhbmdlZCA9Ci0gICAgICAgICAgICAgICAgICAgIChtT3V0RGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCkgIT0gKHZhbHVlICYgQVVESU9fREVWSUNFX09VVF9BTExfQTJEUCk7Ci0gICAgICAgICAgICBtT3V0RGV2aWNlID0gdmFsdWU7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VfbChtT3V0RGV2aWNlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBMT0dfRkFUQUwoIlNob3VsZCBub3Qgc2V0IHJvdXRpbmcgZGV2aWNlIGluIERpcmVjdE91dHB1dFRocmVhZCIpOwogICAgIH0KICAgICBpZiAocGFyYW0uZ2V0SW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUZyYW1lQ291bnQpLCB2YWx1ZSkgPT0gTk9fRVJST1IpIHsKICAgICAgICAgLy8gZG8gbm90IGFjY2VwdCBmcmFtZSBjb3VudCBjaGFuZ2VzIGlmIHRyYWNrcyBhcmUgb3BlbiBhcyB0aGUgdHJhY2sgYnVmZmVyCkBAIC01NTY4LDYgKzYwMTIsOCBAQAogICAgIG1PdXRwdXQtPmZsdXNoKCk7CiAgICAgbUh3UGF1c2VkID0gZmFsc2U7CiAgICAgbUZsdXNoUGVuZGluZyA9IGZhbHNlOworICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7IC8vIERJUkVDVCBhbmQgT0ZGTE9BREVEIGZsdXNoIHJlc2V0cyBmcmFtZSBjb3VudC4KKyAgICBtVGltZXN0YW1wLmNsZWFyKCk7CiB9CiAKIGludDY0X3QgQXVkaW9GbGluZ2VyOjpEaXJlY3RPdXRwdXRUaHJlYWQ6OmNvbXB1dGVXYWl0VGltZU5zX2woKSBjb25zdCB7CkBAIC01Njk2LDggKzYxNDIsOCBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiBBdWRpb0ZsaW5nZXI6Ok9mZmxvYWRUaHJlYWQ6Ok9mZmxvYWRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAotICAgICAgICBBdWRpb1N0cmVhbU91dCogb3V0cHV0LCBhdWRpb19pb19oYW5kbGVfdCBpZCwgdWludDMyX3QgZGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KQotICAgIDogICBEaXJlY3RPdXRwdXRUaHJlYWQoYXVkaW9GbGluZ2VyLCBvdXRwdXQsIGlkLCBkZXZpY2UsIE9GRkxPQUQsIHN5c3RlbVJlYWR5KSwKKyAgICAgICAgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwgYXVkaW9faW9faGFuZGxlX3QgaWQsIGJvb2wgc3lzdGVtUmVhZHkpCisgICAgOiAgIERpcmVjdE91dHB1dFRocmVhZChhdWRpb0ZsaW5nZXIsIG91dHB1dCwgaWQsIE9GRkxPQUQsIHN5c3RlbVJlYWR5KSwKICAgICAgICAgbVBhdXNlZFdyaXRlTGVuZ3RoKDApLCBtUGF1c2VkQnl0ZXNSZW1haW5pbmcoMCksIG1LZWVwV2FrZUxvY2sodHJ1ZSksCiAgICAgICAgIG1PZmZsb2FkVW5kZXJydW5Qb3NpdGlvbih+MExMKQogewpAQCAtNTgxMSw3ICs2MjU3LDcgQEAKICAgICAgICAgICAgIH0KICAgICAgICAgfSAgZWxzZSBpZiAodHJhY2stPmZyYW1lc1JlYWR5KCkgJiYgdHJhY2stPmlzUmVhZHkoKSAmJgogICAgICAgICAgICAgICAgICF0cmFjay0+aXNQYXVzZWQoKSAmJiAhdHJhY2stPmlzVGVybWluYXRlZCgpICYmICF0cmFjay0+aXNTdG9wcGluZ18yKCkpIHsKLSAgICAgICAgICAgIEFMT0dWVigiT2ZmbG9hZFRocmVhZDogdHJhY2sgJWQgcz0lMDh4IFtPS10iLCB0cmFjay0+bmFtZSgpLCBjYmxrLT5tU2VydmVyKTsKKyAgICAgICAgICAgIEFMT0dWVigiT2ZmbG9hZFRocmVhZDogdHJhY2soJWQpIHM9JTA4eCBbT0tdIiwgdHJhY2stPmlkKCksIGNibGstPm1TZXJ2ZXIpOwogICAgICAgICAgICAgaWYgKHRyYWNrLT5tRmlsbGluZ1VwU3RhdHVzID09IFRyYWNrOjpGU19GSUxMRUQpIHsKICAgICAgICAgICAgICAgICB0cmFjay0+bUZpbGxpbmdVcFN0YXR1cyA9IFRyYWNrOjpGU19BQ1RJVkU7CiAgICAgICAgICAgICAgICAgaWYgKGxhc3QpIHsKQEAgLTU4NTUsNyArNjMwMSw3IEBACiAgICAgICAgICAgICAgICAgbWl4ZXJTdGF0dXMgPSBNSVhFUl9UUkFDS1NfUkVBRFk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVlYoIk9mZmxvYWRUaHJlYWQ6IHRyYWNrICVkIHM9JTA4eCBbTk9UIFJFQURZXSIsIHRyYWNrLT5uYW1lKCksIGNibGstPm1TZXJ2ZXIpOworICAgICAgICAgICAgQUxPR1ZWKCJPZmZsb2FkVGhyZWFkOiB0cmFjayglZCkgcz0lMDh4IFtOT1QgUkVBRFldIiwgdHJhY2stPmlkKCksIGNibGstPm1TZXJ2ZXIpOwogICAgICAgICAgICAgaWYgKHRyYWNrLT5pc1N0b3BwaW5nXzEoKSkgewogICAgICAgICAgICAgICAgIGlmICgtLSh0cmFjay0+bVJldHJ5Q291bnQpIDw9IDApIHsKICAgICAgICAgICAgICAgICAgICAgLy8gSGFyZHdhcmUgYnVmZmVyIGNhbiBob2xkIGEgbGFyZ2UgYW1vdW50IG9mIGF1ZGlvIHNvIHdlIG11c3QKQEAgLTU5MDIsNiArNjM0OCwxNCBAQAogICAgICAgICAgICAgICAgICAgICB0cmFjay0+cHJlc2VudGF0aW9uQ29tcGxldGUoZnJhbWVzV3JpdHRlbiwgYXVkaW9IQUxGcmFtZXMpOwogICAgICAgICAgICAgICAgICAgICB0cmFjay0+cmVzZXQoKTsKICAgICAgICAgICAgICAgICAgICAgdHJhY2tzVG9SZW1vdmUtPmFkZCh0cmFjayk7CisgICAgICAgICAgICAgICAgICAgIC8vIERJUkVDVCBhbmQgT0ZGTE9BREVEIHN0b3AgcmVzZXRzIGZyYW1lIGNvdW50cy4KKyAgICAgICAgICAgICAgICAgICAgaWYgKCFtVXNlQXN5bmNXcml0ZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgd2UgZG9uJ3QgZ2V0IGV4cGxpY2l0IGRyYWluIG5vdGlmaWNhdGlvbiB3ZSBtdXN0CisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWdpc3RlciBkaXNjb250aW51aXR5IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGlzIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcHJldmlvdXMgKCFsYXN0KSBvciB0aGUgdXBjb21pbmcgKGxhc3QpIHRyYWNrCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0byBhdm9pZCBza2lwcGluZyB0aGUgZGlzY29udGludWl0eS4KKyAgICAgICAgICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5kaXNjb250aW51aXR5KCk7CisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIC8vIE5vIGJ1ZmZlcnMgZm9yIHRoaXMgdHJhY2suIEdpdmUgaXQgYSBmZXcgY2hhbmNlcyB0bwpAQCAtNTkyMyw4ICs2Mzc3LDggQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKHJ1bm5pbmcpIHsgLy8gc3RpbGwgcnVubmluZywgZ2l2ZSB1cyBtb3JlIHRpbWUuCiAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay0+bVJldHJ5Q291bnQgPSBrTWF4VHJhY2tSZXRyaWVzT2ZmbG9hZDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJPZmZsb2FkVGhyZWFkOiBCVUZGRVIgVElNRU9VVDogcmVtb3ZlKCVkKSBmcm9tIGFjdGl2ZSBsaXN0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2stPm5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiT2ZmbG9hZFRocmVhZDogQlVGRkVSIFRJTUVPVVQ6IHJlbW92ZSB0cmFjayglZCkgZnJvbSBhY3RpdmUgbGlzdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrLT5pZCgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrc1RvUmVtb3ZlLT5hZGQodHJhY2spOwogICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGVsbCBjbGllbnQgcHJvY2VzcyB0aGF0IHRoZSB0cmFjayB3YXMgZGlzYWJsZWQgYmVjYXVzZSBvZiB1bmRlcnJ1bjsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0IHdpbGwgdGhlbiBhdXRvbWF0aWNhbGx5IGNhbGwgc3RhcnQoKSB3aGVuIGRhdGEgaXMgYXZhaWxhYmxlCkBAIC01OTM2LDcgKzYzOTAsOSBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICAgIC8vIGNvbXB1dGUgdm9sdW1lIGZvciB0aGlzIHRyYWNrCi0gICAgICAgIHByb2Nlc3NWb2x1bWVfbCh0cmFjaywgbGFzdCk7CisgICAgICAgIGlmICh0cmFjay0+aXNSZWFkeSgpKSB7ICAvLyBjaGVjayByZWFkeSB0byBwcmV2ZW50IHByZW1hdHVyZSBzdGFydC4KKyAgICAgICAgICAgIHByb2Nlc3NWb2x1bWVfbCh0cmFjaywgbGFzdCk7CisgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBtYWtlIHN1cmUgdGhlIHBhdXNlL2ZsdXNoL3Jlc3VtZSBzZXF1ZW5jZSBpcyBleGVjdXRlZCBpbiB0aGUgcmlnaHQgb3JkZXIuCkBAIC02MDEyLDcgKzY0NjgsNyBAQAogCiBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjpEdXBsaWNhdGluZ1RocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCiAgICAgICAgIEF1ZGlvRmxpbmdlcjo6TWl4ZXJUaHJlYWQqIG1haW5UaHJlYWQsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBib29sIHN5c3RlbVJlYWR5KQotICAgIDogICBNaXhlclRocmVhZChhdWRpb0ZsaW5nZXIsIG1haW5UaHJlYWQtPmdldE91dHB1dCgpLCBpZCwgbWFpblRocmVhZC0+b3V0RGV2aWNlKCksCisgICAgOiAgIE1peGVyVGhyZWFkKGF1ZGlvRmxpbmdlciwgbWFpblRocmVhZC0+Z2V0T3V0cHV0KCksIGlkLAogICAgICAgICAgICAgICAgICAgICBzeXN0ZW1SZWFkeSwgRFVQTElDQVRJTkcpLAogICAgICAgICBtV2FpdFRpbWVNcyhVSU5UX01BWCkKIHsKQEAgLTYwNjcsNyArNjUyMywyMiBAQAogc3NpemVfdCBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjp0aHJlYWRMb29wX3dyaXRlKCkKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG91dHB1dFRyYWNrcy5zaXplKCk7IGkrKykgewotICAgICAgICBvdXRwdXRUcmFja3NbaV0tPndyaXRlKG1TaW5rQnVmZmVyLCB3cml0ZUZyYW1lcyk7CisgICAgICAgIGNvbnN0IHNzaXplX3QgYWN0dWFsV3JpdHRlbiA9IG91dHB1dFRyYWNrc1tpXS0+d3JpdGUobVNpbmtCdWZmZXIsIHdyaXRlRnJhbWVzKTsKKworICAgICAgICAvLyBDb25zaWRlciB0aGUgZmlyc3QgT3V0cHV0VHJhY2sgZm9yIHRpbWVzdGFtcCBhbmQgZnJhbWUgY291bnRpbmcuCisKKyAgICAgICAgLy8gVGhlIHRocmVhZExvb3AoKSBnZW5lcmFsbHkgYXNzdW1lcyB3cml0aW5nIGEgZnVsbCBzaW5rIGJ1ZmZlciBzaXplIGF0IGEgdGltZS4KKyAgICAgICAgLy8gSGVyZSwgd2UgY29ycmVjdCBmb3Igd3JpdGVGcmFtZXMgb2YgMCAoYSBzdG9wKSBvciB1bmRlcnJ1bnMgYmVjYXVzZQorICAgICAgICAvLyB3ZSBhbHdheXMgY2xhaW0gc3VjY2Vzcy4KKyAgICAgICAgaWYgKGkgPT0gMCkgeworICAgICAgICAgICAgY29uc3Qgc3NpemVfdCBjb3JyZWN0aW9uID0gbVNpbmtCdWZmZXJTaXplIC8gbUZyYW1lU2l6ZSAtIGFjdHVhbFdyaXR0ZW47CisgICAgICAgICAgICBBTE9HRF9JRihjb3JyZWN0aW9uICE9IDAgJiYgd3JpdGVGcmFtZXMgIT0gMCwKKyAgICAgICAgICAgICAgICAgICAgIiVzOiB3cml0ZUZyYW1lczoldSAgYWN0dWFsV3JpdHRlbjolemQgIGNvcnJlY3Rpb246JXpkICBtRnJhbWVzV3JpdHRlbjolbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHdyaXRlRnJhbWVzLCBhY3R1YWxXcml0dGVuLCBjb3JyZWN0aW9uLCAobG9uZyBsb25nKW1GcmFtZXNXcml0dGVuKTsKKyAgICAgICAgICAgIG1GcmFtZXNXcml0dGVuIC09IGNvcnJlY3Rpb247CisgICAgICAgIH0KKworICAgICAgICAvLyBUT0RPOiBSZXBvcnQgY29ycmVjdGlvbiBmb3IgdGhlIG90aGVyIG91dHB1dCB0cmFja3MgYW5kIHNob3cgaW4gdGhlIGR1bXAuCiAgICAgfQogICAgIG1TdGFuZGJ5ID0gZmFsc2U7CiAgICAgcmV0dXJuIChzc2l6ZV90KW1TaW5rQnVmZmVyU2l6ZTsKQEAgLTYwODEsOSArNjU1Miw5IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6RHVwbGljYXRpbmdUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQordm9pZCBBdWRpb0ZsaW5nZXI6OkR1cGxpY2F0aW5nVGhyZWFkOjpkdW1wSW50ZXJuYWxzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewotICAgIE1peGVyVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGZkLCBhcmdzKTsKKyAgICBNaXhlclRocmVhZDo6ZHVtcEludGVybmFsc19sKGZkLCBhcmdzKTsKIAogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwogICAgIGNvbnN0IHNpemVfdCBudW1UcmFja3MgPSBtT3V0cHV0VHJhY2tzLnNpemUoKTsKQEAgLTYwOTIsNyArNjU2Myw3IEBACiAgICAgICAgIHNzIDw8ICI6IjsKICAgICAgICAgZm9yIChjb25zdCBhdXRvICZ0cmFjayA6IG1PdXRwdXRUcmFja3MpIHsKICAgICAgICAgICAgIGNvbnN0IHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IHRyYWNrLT50aHJlYWQoKS5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBzcyA8PCAiICgiIDw8IHRyYWNrLT5uYW1lKCkgPDwgIiA6ICI7CisgICAgICAgICAgICBzcyA8PCAiICgiIDw8IHRyYWNrLT5pZCgpIDw8ICIgOiAiOwogICAgICAgICAgICAgaWYgKHRocmVhZC5nZXQoKSAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgc3MgPDwgdGhyZWFkLmdldCgpIDw8ICIsICIgPDwgdGhyZWFkLT5pZCgpOwogICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTYyMjksMjIgKzY3MDAsMTUgQEAKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N0cmVhbUluICppbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzeXN0ZW1SZWFkeQotI2lmZGVmIFRFRV9TSU5LCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgY29uc3Qgc3A8TkJBSU9fU2luaz4mIHRlZVNpbmsKLSNlbmRpZgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApIDoKLSAgICBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQsIG91dERldmljZSwgaW5EZXZpY2UsIFJFQ09SRCwgc3lzdGVtUmVhZHkpLAorICAgIFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCwgUkVDT1JELCBzeXN0ZW1SZWFkeSksCiAgICAgbUlucHV0KGlucHV0KSwKKyAgICBtU291cmNlKG1JbnB1dCksCiAgICAgbUFjdGl2ZVRyYWNrcygmdGhpcy0+bUxvY2FsTG9nKSwKICAgICBtUnNtcEluQnVmZmVyKE5VTEwpLAogICAgIC8vIG1Sc21wSW5GcmFtZXMsIG1Sc21wSW5GcmFtZXNQMiwgYW5kIG1Sc21wSW5GcmFtZXNPQSBhcmUgc2V0IGJ5IHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpCiAgICAgbVJzbXBJblJlYXIoMCkKLSNpZmRlZiBURUVfU0lOSwotICAgICwgbVRlZVNpbmsodGVlU2luaykKLSNlbmRpZgogICAgICwgbVJlYWRPbmx5SGVhcChuZXcgTWVtb3J5RGVhbGVyKGtSZWNvcmRUaHJlYWRSZWFkT25seUhlYXBTaXplLAogICAgICAgICAgICAgIlJlY29yZFRocmVhZFJPIiwgTWVtb3J5SGVhcEJhc2U6OlJFQURfT05MWSkpCiAgICAgLy8gbUZhc3RDYXB0dXJlIGJlbG93CkBAIC02MjYxLDggKzY3MjUsMjEgQEAKICAgICBzbnByaW50ZihtVGhyZWFkTmFtZSwga1RocmVhZE5hbWVMZW5ndGgsICJBdWRpb0luXyVYIiwgaWQpOwogICAgIG1OQkxvZ1dyaXRlciA9IGF1ZGlvRmxpbmdlci0+bmV3V3JpdGVyX2woa0xvZ1NpemUsIG1UaHJlYWROYW1lKTsKIAorICAgIGlmIChtSW5wdXQgIT0gbnVsbHB0ciAmJiBtSW5wdXQtPmF1ZGlvSHdEZXYgIT0gbnVsbHB0cikgeworICAgICAgICBtSXNNc2REZXZpY2UgPSBzdHJjbXAoCisgICAgICAgICAgICAgICAgbUlucHV0LT5hdWRpb0h3RGV2LT5tb2R1bGVOYW1lKCksIEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QpID09IDA7CisgICAgfQorCiAgICAgcmVhZElucHV0UGFyYW1ldGVyc19sKCk7CiAKKyAgICAvLyBUT0RPOiBXZSBtYXkgYWxzbyBtYXRjaCBvbiBhZGRyZXNzIGFzIHdlbGwgYXMgZGV2aWNlIHR5cGUgZm9yCisgICAgLy8gQVVESU9fREVWSUNFX0lOX0JVUywgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQLCBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWAorICAgIC8vIFRPRE86IFRoaXMgcHJvcGVydHkgc2hvdWxkIGJlIGVuc3VyZSB0aGF0IG9ubHkgY29udGFpbnMgb25lIHNpbmdsZSBkZXZpY2UgdHlwZS4KKyAgICBtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdClwcm9wZXJ0eV9nZXRfaW50NjQoCisgICAgICAgICAgICAiYXVkaW8udGltZXN0YW1wLmNvcnJlY3RlZF9pbnB1dF9kZXZpY2UiLAorICAgICAgICAgICAgKGludDY0X3QpKG1Jc01zZERldmljZSA/IEFVRElPX0RFVklDRV9JTl9CVVMgLy8gdHVybiBvbiBieSBkZWZhdWx0IGZvciBNU0QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBVURJT19ERVZJQ0VfTk9ORSkpOworCiAgICAgLy8gY3JlYXRlIGFuIE5CQUlPIHNvdXJjZSBmb3IgdGhlIEhBTCBpbnB1dCBzdHJlYW0sIGFuZCBuZWdvdGlhdGUKICAgICBtSW5wdXRTb3VyY2UgPSBuZXcgQXVkaW9TdHJlYW1JblNvdXJjZShpbnB1dC0+c3RyZWFtKTsKICAgICBzaXplX3QgbnVtQ291bnRlck9mZmVycyA9IDA7CkBAIC02MzU5LDcgKzY4MzYsNyBAQAogICAgICAgICAvLyBzdGFydCB0aGUgZmFzdCBjYXB0dXJlCiAgICAgICAgIG1GYXN0Q2FwdHVyZS0+cnVuKCJGYXN0Q2FwdHVyZSIsIEFORFJPSURfUFJJT1JJVFlfVVJHRU5UX0FVRElPKTsKICAgICAgICAgcGlkX3QgdGlkID0gbUZhc3RDYXB0dXJlLT5nZXRUaWQoKTsKLSAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWRfY2FjaGVkLCB0aWQsIGtQcmlvcml0eUZhc3RDYXB0dXJlLCBmYWxzZSAvKmZvckFwcCovKTsKKyAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChnZXRwaWQoKSwgdGlkLCBrUHJpb3JpdHlGYXN0Q2FwdHVyZSwgZmFsc2UgLypmb3JBcHAqLyk7CiAgICAgICAgIHN0cmVhbSgpLT5zZXRIYWxUaHJlYWRQcmlvcml0eShrUHJpb3JpdHlGYXN0Q2FwdHVyZSk7CiAjaWZkZWYgQVVESU9fV0FUQ0hET0cKICAgICAgICAgLy8gRklYTUUKQEAgLTYzNjcsNiArNjg0NCwxMCBAQAogCiAgICAgICAgIG1GYXN0VHJhY2tBdmFpbCA9IHRydWU7CiAgICAgfQorI2lmZGVmIFRFRV9TSU5LCisgICAgbVRlZS5zZXQobUlucHV0U291cmNlLT5mb3JtYXQoKSwgTkJBSU9fVGVlOjpURUVfRkxBR19JTlBVVF9USFJFQUQpOworICAgIG1UZWUuc2V0SWQoc3RkOjpzdHJpbmcoIl8iKSArIHN0ZDo6dG9fc3RyaW5nKG1JZCkgKyAiX0MiKTsKKyNlbmRpZgogZmFpbGVkOiA7CiAKICAgICAvLyBGSVhNRSBtTm9ybWFsU291cmNlCkBAIC02NDI3LDggKzY5MDgsMTAgQEAKICAgICAvLyB1c2VkIHRvIHJlcXVlc3QgYSBkZWZlcnJlZCBzbGVlcCwgdG8gYmUgZXhlY3V0ZWQgbGF0ZXIgd2hpbGUgbXV0ZXggaXMgdW5sb2NrZWQKICAgICB1aW50MzJfdCBzbGVlcFVzID0gMDsKIAorICAgIGludDY0X3QgbGFzdExvb3BDb3VudFJlYWQgPSAtMjsgIC8vIG5ldmVyIG1hdGNoZXMgInByZXZpb3VzIiBsb29wLCB3aGVuIGxvb3BDb3VudCA9IDAuCisKICAgICAvLyBsb29wIHdoaWxlIHRoZXJlIGlzIHdvcmsgdG8gZG8KLSAgICBmb3IgKDs7KSB7CisgICAgZm9yIChpbnQ2NF90IGxvb3BDb3VudCA9IDA7OyArK2xvb3BDb3VudCkgeyAgLy8gbG9vcENvdW50IHVzZWQgZm9yIHN0YXRpc3RpY3MgdHJhY2tpbmcKICAgICAgICAgVmVjdG9yPCBzcDxFZmZlY3RDaGFpbj4gPiBlZmZlY3RDaGFpbnM7CiAKICAgICAgICAgLy8gYWN0aXZlVHJhY2tzIGFjY3VtdWxhdGVzIGEgY29weSBvZiBhIHN1YnNldCBvZiBtQWN0aXZlVHJhY2tzCkBAIC02NDk0LDYgKzY5NzcsNyBAQAogCiAgICAgICAgICAgICAgICAgY2FzZSBUcmFja0Jhc2U6OlBBVVNJTkc6CiAgICAgICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKGFjdGl2ZVRyYWNrKTsKKyAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6UEFVU0VEOwogICAgICAgICAgICAgICAgICAgICBkb0Jyb2FkY2FzdCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgIHNpemUtLTsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CkBAIC02NTE1LDEyICs2OTk5LDEyIEBACiAgICAgICAgICAgICAgICAgICAgIGFsbFN0b3BwZWQgPSBmYWxzZTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAKLSAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6SURMRToKLSAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLQorICAgICAgICAgICAgICAgIGNhc2UgVHJhY2tCYXNlOjpJRExFOiAgICAvLyBjYW5ub3QgYmUgb24gQWN0aXZlVHJhY2tzIGlmIGlkbGUKKyAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6UEFVU0VEOiAgLy8gY2Fubm90IGJlIG9uIEFjdGl2ZVRyYWNrcyBpZiBwYXVzZWQKKyAgICAgICAgICAgICAgICBjYXNlIFRyYWNrQmFzZTo6U1RPUFBFRDogLy8gY2Fubm90IGJlIG9uIEFjdGl2ZVRyYWNrcyBpZiBkZXN0cm95ZWQvdGVybWluYXRlZAogICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoIlVuZXhwZWN0ZWQgYWN0aXZlVHJhY2tTdGF0ZSAlZCIsIGFjdGl2ZVRyYWNrU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlczogVW5leHBlY3RlZCBhY3RpdmUgdHJhY2sgc3RhdGU6JWQsIGlkOiVkLCB0cmFja3M6JXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYWN0aXZlVHJhY2tTdGF0ZSwgYWN0aXZlVHJhY2stPmlkKCksIHNpemUpOwogICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrcy5hZGQoYWN0aXZlVHJhY2spOwpAQCAtNjU0NSw3ICs3MDI5LDcgQEAKICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgLy8gc2xlZXAgaWYgdGhlcmUgYXJlIG5vIGFjdGl2ZSB0cmFja3MgdG8gcHJvY2VzcwotICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrcy5pc0VtcHR5KCkpIHsKICAgICAgICAgICAgICAgICBpZiAoc2xlZXBVcyA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHNsZWVwVXMgPSBrUmVjb3JkVGhyZWFkU2xlZXBVczsKICAgICAgICAgICAgICAgICB9CkBAIC02NTk2LDYgKzcwODAsMTQgQEAKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgZGlkTW9kaWZ5ID0gdHJ1ZTsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXIqIGFicCA9IChmYXN0VHJhY2sgIT0gMCAmJiBmYXN0VHJhY2stPmlzUGF0Y2hUcmFjaygpKSA/CisgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXVkaW9CdWZmZXJQcm92aWRlcio+KGZhc3RUcmFjay5nZXQoKSkgOiBudWxscHRyOworICAgICAgICAgICAgaWYgKHN0YXRlLT5tRmFzdFBhdGNoUmVjb3JkQnVmZmVyUHJvdmlkZXIgIT0gYWJwKSB7CisgICAgICAgICAgICAgICAgc3RhdGUtPm1GYXN0UGF0Y2hSZWNvcmRCdWZmZXJQcm92aWRlciA9IGFicDsKKyAgICAgICAgICAgICAgICBzdGF0ZS0+bUZhc3RQYXRjaFJlY29yZEZvcm1hdCA9IGZhc3RUcmFjayA9PSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElEIDogZmFzdFRyYWNrLT5mb3JtYXQoKTsKKyAgICAgICAgICAgICAgICBkaWRNb2RpZnkgPSB0cnVlOworICAgICAgICAgICAgfQogICAgICAgICAgICAgc3EtPmVuZChkaWRNb2RpZnkpOwogICAgICAgICAgICAgaWYgKGRpZE1vZGlmeSkgewogICAgICAgICAgICAgICAgIHNxLT5wdXNoKGJsb2NrKTsKQEAgLTY2MTgsMTEgKzcxMTAsMTEgQEAKIAogICAgICAgICBpbnQzMl90IHJlYXIgPSBtUnNtcEluUmVhciAmIChtUnNtcEluRnJhbWVzUDIgLSAxKTsKICAgICAgICAgc3NpemVfdCBmcmFtZXNSZWFkOworICAgICAgICBjb25zdCBpbnQ2NF90IGxhc3RJb0JlZ2luTnMgPSBzeXN0ZW1UaW1lKCk7IC8vIHN0YXJ0IElPIHRpbWluZwogCiAgICAgICAgIC8vIElmIGFuIE5CQUlPIHNvdXJjZSBpcyBwcmVzZW50LCB1c2UgaXQgdG8gcmVhZCB0aGUgbm9ybWFsIGNhcHR1cmUncyBkYXRhCiAgICAgICAgIGlmIChtUGlwZVNvdXJjZSAhPSAwKSB7Ci0gICAgICAgICAgICBzaXplX3QgZnJhbWVzVG9SZWFkID0gbUJ1ZmZlclNpemUgLyBtRnJhbWVTaXplOwotICAgICAgICAgICAgZnJhbWVzVG9SZWFkID0gbWluKG1Sc21wSW5GcmFtZXNPQSAtIHJlYXIsIG1Sc21wSW5GcmFtZXNQMiAvIDIpOworICAgICAgICAgICAgc2l6ZV90IGZyYW1lc1RvUmVhZCA9IG1pbihtUnNtcEluRnJhbWVzT0EgLSByZWFyLCBtUnNtcEluRnJhbWVzUDIgLyAyKTsKIAogICAgICAgICAgICAgLy8gVGhlIGF1ZGlvIGZpZm8gcmVhZCgpIHJldHVybnMgT1ZFUlJVTiBvbiBvdmVyZmxvdywgYW5kIGFkdmFuY2VzIHRoZSByZWFkIHBvaW50ZXIKICAgICAgICAgICAgIC8vIHRvIHRoZSBmdWxsIGJ1ZmZlciBwb2ludCAoY2xlYXJpbmcgdGhlIG92ZXJmbG93IGNvbmRpdGlvbikuICBVcG9uIE9WRVJSVU4gZXJyb3IsCkBAIC02NjY2LDcgKzcxNTgsNyBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQVRSQUNFX0JFR0lOKCJyZWFkIik7CiAgICAgICAgICAgICBzaXplX3QgYnl0ZXNSZWFkOwotICAgICAgICAgICAgc3RhdHVzX3QgcmVzdWx0ID0gbUlucHV0LT5zdHJlYW0tPnJlYWQoCisgICAgICAgICAgICBzdGF0dXNfdCByZXN1bHQgPSBtU291cmNlLT5yZWFkKAogICAgICAgICAgICAgICAgICAgICAodWludDhfdCopbVJzbXBJbkJ1ZmZlciArIHJlYXIgKiBtRnJhbWVTaXplLCBtQnVmZmVyU2l6ZSwgJmJ5dGVzUmVhZCk7CiAgICAgICAgICAgICBBVFJBQ0VfRU5EKCk7CiAgICAgICAgICAgICBpZiAocmVzdWx0IDwgMCkgewpAQCAtNjY3NiwxNiArNzE2OCwzNCBAQAogICAgICAgICAgICAgfQogICAgICAgICB9CiAKKyAgICAgICAgY29uc3QgaW50NjRfdCBsYXN0SW9FbmROcyA9IHN5c3RlbVRpbWUoKTsgLy8gZW5kIElPIHRpbWluZworCiAgICAgICAgIC8vIFVwZGF0ZSBzZXJ2ZXIgdGltZXN0YW1wIHdpdGggc2VydmVyIHN0YXRzCiAgICAgICAgIC8vIHN5c3RlbVRpbWUoKSBpcyBvcHRpb25hbCBpZiB0aGUgaGFyZHdhcmUgc3VwcG9ydHMgdGltZXN0YW1wcy4KICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gKz0gZnJhbWVzUmVhZDsKLSAgICAgICAgbVRpbWVzdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVJdID0gc3lzdGVtVGltZSgpOworICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX1NFUlZFUl0gPSBsYXN0SW9FbmROczsKIAogICAgICAgICAvLyBVcGRhdGUgc2VydmVyIHRpbWVzdGFtcCB3aXRoIGtlcm5lbCBzdGF0cwogICAgICAgICBpZiAobVBpcGVTb3VyY2UuZ2V0KCkgPT0gbnVsbHB0ciAvKiBkb24ndCBvYnRhaW4gZm9yIEZhc3RDYXB0dXJlLCBjb3VsZCBibG9jayAqLykgewogICAgICAgICAgICAgaW50NjRfdCBwb3NpdGlvbiwgdGltZTsKLSAgICAgICAgICAgIGludCByZXQgPSBtSW5wdXQtPnN0cmVhbS0+Z2V0Q2FwdHVyZVBvc2l0aW9uKCZwb3NpdGlvbiwgJnRpbWUpOwotICAgICAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgaWYgKG1TdGFuZGJ5KSB7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcFZlcmlmaWVyLmRpc2NvbnRpbnVpdHkoKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAobVNvdXJjZS0+Z2V0Q2FwdHVyZVBvc2l0aW9uKCZwb3NpdGlvbiwgJnRpbWUpID09IE5PX0VSUk9SCisgICAgICAgICAgICAgICAgICAgICYmIHRpbWUgPiBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0pIHsKKworICAgICAgICAgICAgICAgIG1UaW1lc3RhbXBWZXJpZmllci5hZGQocG9zaXRpb24sIHRpbWUsIG1TYW1wbGVSYXRlKTsKKworICAgICAgICAgICAgICAgIC8vIENvcnJlY3QgdGltZXN0YW1wcworICAgICAgICAgICAgICAgIGlmIChpc1RpbWVzdGFtcENvcnJlY3Rpb25FbmFibGVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0JFRk9SRTogJWQgJWxsZCAlbGxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCgpLCAobG9uZyBsb25nKXRpbWUsIChsb25nIGxvbmcpcG9zaXRpb24pOworICAgICAgICAgICAgICAgICAgICBhdXRvIGNvcnJlY3RlZFRpbWVzdGFtcCA9IG1UaW1lc3RhbXBWZXJpZmllci5nZXRMYXN0Q29ycmVjdGVkVGltZXN0YW1wKCk7CisgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uID0gY29ycmVjdGVkVGltZXN0YW1wLm1GcmFtZXM7CisgICAgICAgICAgICAgICAgICAgIHRpbWUgPSBjb3JyZWN0ZWRUaW1lc3RhbXAubVRpbWVOczsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlRTX0FGVEVSOiAlZCAlbGxkICVsbGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkKCksIChsb25nIGxvbmcpdGltZSwgKGxvbmcgbG9uZylwb3NpdGlvbik7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgbVRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSBwb3NpdGlvbjsKICAgICAgICAgICAgICAgICBtVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPSB0aW1lOwogICAgICAgICAgICAgICAgIC8vIE5vdGU6IEluIGdlbmVyYWwgcmVjb3JkIGJ1ZmZlcnMgc2hvdWxkIHRlbmQgdG8gYmUgZW1wdHkgaW4KQEAgLTY2OTMsOCArNzIwMywxOSBAQAogICAgICAgICAgICAgICAgIC8vCiAgICAgICAgICAgICAgICAgLy8gQWxzbywgaXQgaXMgbm90IGFkdmFudGFnZW91cyB0byBjYWxsIGdldF9wcmVzZW50YXRpb25fcG9zaXRpb24gZHVyaW5nIHRoZSByZWFkCiAgICAgICAgICAgICAgICAgLy8gYXMgdGhlIHJlYWQgb2J0YWlucyBhIGxvY2ssIHByZXZlbnRpbmcgdGhlIHRpbWVzdGFtcCBjYWxsIGZyb20gZXhlY3V0aW5nLgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBtVGltZXN0YW1wVmVyaWZpZXIuZXJyb3IoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQorCisgICAgICAgIC8vIEZyb20gdGhlIHRpbWVzdGFtcCwgaW5wdXQgcmVhZCBsYXRlbmN5IGlzIG5lZ2F0aXZlIG91dHB1dCB3cml0ZSBsYXRlbmN5LgorICAgICAgICBjb25zdCBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gbUlucHV0ICE9IE5VTEwgPyBtSW5wdXQtPmZsYWdzIDogQVVESU9fSU5QVVRfRkxBR19OT05FOworICAgICAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0gUmVjb3JkVHJhY2s6OmNoZWNrU2VydmVyTGF0ZW5jeVN1cHBvcnRlZChtRm9ybWF0LCBmbGFncykKKyAgICAgICAgICAgICAgICA/IC0gbVRpbWVzdGFtcC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMobVNhbXBsZVJhdGUpIDogMC47CisgICAgICAgIGlmIChsYXRlbmN5TXMgIT0gMC4pIHsgLy8gbm90ZSAwLiBtZWFucyB0aW1lc3RhbXAgaXMgZW1wdHkuCisgICAgICAgICAgICBtTGF0ZW5jeU1zLmFkZChsYXRlbmN5TXMpOworICAgICAgICB9CisKICAgICAgICAgLy8gVXNlIHRoaXMgdG8gdHJhY2sgdGltZXN0YW1wIGluZm9ybWF0aW9uCiAgICAgICAgIC8vIEFMT0dEKCIlcyIsIG1UaW1lc3RhbXAudG9TdHJpbmcoKS5jX3N0cigpKTsKIApAQCAtNjcwOCwxMCArNzIyOSwxMSBAQAogICAgICAgICAgICAgZ290byB1bmxvY2s7CiAgICAgICAgIH0KICAgICAgICAgQUxPR19BU1NFUlQoZnJhbWVzUmVhZCA+IDApOworICAgICAgICBtRnJhbWVzUmVhZCArPSBmcmFtZXNSZWFkOwogCi0gICAgICAgIGlmIChtVGVlU2luayAhPSAwKSB7Ci0gICAgICAgICAgICAodm9pZCkgbVRlZVNpbmstPndyaXRlKCh1aW50OF90KiltUnNtcEluQnVmZmVyICsgcmVhciAqIG1GcmFtZVNpemUsIGZyYW1lc1JlYWQpOwotICAgICAgICB9CisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgKHZvaWQpbVRlZS53cml0ZSgodWludDhfdCopbVJzbXBJbkJ1ZmZlciArIHJlYXIgKiBtRnJhbWVTaXplLCBmcmFtZXNSZWFkKTsKKyNlbmRpZgogICAgICAgICAvLyBJZiBkZXN0aW5hdGlvbiBpcyBub24tY29udGlndW91cywgd2Ugbm93IGNvcnJlY3QgZm9yIHJlYWRpbmcgcGFzdCBlbmQgb2YgYnVmZmVyLgogICAgICAgICB7CiAgICAgICAgICAgICBzaXplX3QgcGFydDEgPSBtUnNtcEluRnJhbWVzUDIgLSByZWFyOwpAQCAtNjc2OSw5ICs3MjkxLDMzIEBACiAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gbWluKGZyYW1lc091dCwKICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RpbmF0aW9uRnJhbWVzUG9zc2libGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc0luLCBtU2FtcGxlUmF0ZSwgYWN0aXZlVHJhY2stPm1TYW1wbGVSYXRlKSk7Ci0gICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBmcmFtZXMgZnJvbSB0aGUgUmVjb3JkVGhyZWFkIGJ1ZmZlciBwcm92aWRlciB0byB0aGUgUmVjb3JkVHJhY2sgYnVmZmVyCi0gICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gYWN0aXZlVHJhY2stPm1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPmNvbnZlcnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVNpbmsucmF3LCBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLCBmcmFtZXNPdXQpOworCisgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZVRyYWNrLT5pc0RpcmVjdCgpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIE5vIFJlY29yZEJ1ZmZlckNvbnZlcnRlciB1c2VkIGZvciBkaXJlY3Qgc3RyZWFtcy4gUGFzcworICAgICAgICAgICAgICAgICAgICAvLyBzdHJhaWdodCBmcm9tIFJlY29yZFRocmVhZCBidWZmZXIgdG8gUmVjb3JkVHJhY2sgYnVmZmVyLgorICAgICAgICAgICAgICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgYnVmZmVyOworICAgICAgICAgICAgICAgICAgICBidWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lc091dDsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYWN0aXZlVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlci0+Z2V0TmV4dEJ1ZmZlcigmYnVmZmVyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSyAmJiBidWZmZXIuZnJhbWVDb3VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVl9JRihidWZmZXIuZnJhbWVDb3VudCAhPSBmcmFtZXNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpIHJlYWQgbGVzcyB0aGFuIGV4cGVjdGVkICglenUgdnMgJXp1KSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBidWZmZXIuZnJhbWVDb3VudCwgZnJhbWVzT3V0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IGJ1ZmZlci5mcmFtZUNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5KGFjdGl2ZVRyYWNrLT5tU2luay5yYXcsIGJ1ZmZlci5yYXcsIGJ1ZmZlci5mcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVUcmFjay0+bVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyLT5yZWxlYXNlQnVmZmVyKCZidWZmZXIpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzT3V0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpIGNhbm5vdCBmaWxsIHJlcXVlc3QsIHN0YXR1czogJWQsIGZyYW1lQ291bnQ6ICV6dSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHN0YXR1cywgYnVmZmVyLmZyYW1lQ291bnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcHJvY2VzcyBmcmFtZXMgZnJvbSB0aGUgUmVjb3JkVGhyZWFkIGJ1ZmZlciBwcm92aWRlciB0byB0aGUgUmVjb3JkVHJhY2sKKyAgICAgICAgICAgICAgICAgICAgLy8gYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIGZyYW1lc091dCA9IGFjdGl2ZVRyYWNrLT5tUmVjb3JkQnVmZmVyQ29udmVydGVyLT5jb252ZXJ0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tU2luay5yYXcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNPdXQpOworICAgICAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgICAgIGlmIChmcmFtZXNPdXQgPiAwICYmIChvdmVycnVuID09IE9WRVJSVU5fVU5LTk9XTikpIHsKICAgICAgICAgICAgICAgICAgICAgb3ZlcnJ1biA9IE9WRVJSVU5fRkFMU0U7CkBAIC02NzgzLDE0ICs3MzI5LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTYW5pdGl6ZSBiZWZvcmUgcmVsZWFzaW5nIGlmIHRoZSB0cmFjayBoYXMgbm8gYWNjZXNzIHRvIHRoZSBzb3VyY2UgZGF0YQogICAgICAgICAgICAgICAgICAgICAgICAgLy8gQW4gaWRsZSBVSUQgcmVjZWl2ZXMgc2lsZW5jZSBmcm9tIG5vbiB2aXJ0dWFsIGRldmljZXMgdW50aWwgYWN0aXZlCiAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlVHJhY2stPmlzU2lsZW5jZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbXNldChhY3RpdmVUcmFjay0+bVNpbmsucmF3LCAwLCBmcmFtZXNPdXQgKiBtRnJhbWVTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1zZXQoYWN0aXZlVHJhY2stPm1TaW5rLnJhdywgMCwgZnJhbWVzT3V0ICogYWN0aXZlVHJhY2stPmZyYW1lU2l6ZSgpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5yZWxlYXNlQnVmZmVyKCZhY3RpdmVUcmFjay0+bVNpbmspOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgICAgICAgLy8gRklYTUUgY291bGQgZG8gYSBwYXJ0aWFsIGRyb3Agb2YgZnJhbWVzT3V0CiAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bUZyYW1lc1RvRHJvcCA+IDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tRnJhbWVzVG9Ecm9wIC09IGZyYW1lc091dDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZVRyYWNrLT5tRnJhbWVzVG9Ecm9wIC09IChzc2l6ZV90KWZyYW1lc091dDsKICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmVUcmFjay0+bUZyYW1lc1RvRHJvcCA8PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KQEAgLTY4NDQsNiArNzM5MCwyMyBAQAogICAgICAgICAvLyBlbmFibGUgY2hhbmdlcyBpbiBlZmZlY3QgY2hhaW4KICAgICAgICAgdW5sb2NrRWZmZWN0Q2hhaW5zKGVmZmVjdENoYWlucyk7CiAgICAgICAgIC8vIGVmZmVjdENoYWlucyBkb2Vzbid0IG5lZWQgdG8gYmUgY2xlYXJlZCwgc2luY2UgaXQgaXMgY2xlYXJlZCBieSBkZXN0cnVjdG9yIGF0IHNjb3BlIGVuZAorICAgICAgICBpZiAoYXVkaW9faGFzX3Byb3BvcnRpb25hbF9mcmFtZXMobUZvcm1hdCkKKyAgICAgICAgICAgICYmIGxvb3BDb3VudCA9PSBsYXN0TG9vcENvdW50UmVhZCArIDEpIHsKKyAgICAgICAgICAgIGNvbnN0IGludDY0X3QgcmVhZFBlcmlvZE5zID0gbGFzdElvRW5kTnMgLSBtTGFzdElvRW5kTnM7CisgICAgICAgICAgICBjb25zdCBkb3VibGUgaml0dGVyTXMgPQorICAgICAgICAgICAgICAgIFRpbWVzdGFtcFZlcmlmaWVyPGludDY0X3QsIGludDY0X3Q+Ojpjb21wdXRlSml0dGVyTXMoCisgICAgICAgICAgICAgICAgICAgIHtmcmFtZXNSZWFkLCByZWFkUGVyaW9kTnN9LAorICAgICAgICAgICAgICAgICAgICB7MCwgMH0gLyogbGFzdFRpbWVzdGFtcCAqLywgbVNhbXBsZVJhdGUpOworICAgICAgICAgICAgY29uc3QgZG91YmxlIHByb2Nlc3NNcyA9IChsYXN0SW9CZWdpbk5zIC0gbUxhc3RJb0VuZE5zKSAqIDFlLTY7CisKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgICAgICBtSW9KaXR0ZXJNcy5hZGQoaml0dGVyTXMpOworICAgICAgICAgICAgbVByb2Nlc3NUaW1lTXMuYWRkKHByb2Nlc3NNcyk7CisgICAgICAgIH0KKyAgICAgICAgLy8gdXBkYXRlIHRpbWluZyBpbmZvLgorICAgICAgICBtTGFzdElvQmVnaW5OcyA9IGxhc3RJb0JlZ2luTnM7CisgICAgICAgIG1MYXN0SW9FbmROcyA9IGxhc3RJb0VuZE5zOworICAgICAgICBsYXN0TG9vcENvdW50UmVhZCA9IGxvb3BDb3VudDsKICAgICB9CiAKICAgICBzdGFuZGJ5SWZOb3RBbHJlYWR5SW5TdGFuZGJ5KCk7CkBAIC02ODk4LDcgKzc0NjEsNyBAQAogICAgICAgICAgICAgc3EtPmVuZChmYWxzZSAvKmRpZE1vZGlmeSovKTsKICAgICAgICAgfQogICAgIH0KLSAgICBzdGF0dXNfdCByZXN1bHQgPSBtSW5wdXQtPnN0cmVhbS0+c3RhbmRieSgpOworICAgIHN0YXR1c190IHJlc3VsdCA9IG1Tb3VyY2UtPnN0YW5kYnkoKTsKICAgICBBTE9HRV9JRihyZXN1bHQgIT0gT0ssICJFcnJvciB3aGVuIHB1dHRpbmcgaW5wdXQgc3RyZWFtIGludG8gc3RhbmRieTogJWQiLCByZXN1bHQpOwogCiAgICAgLy8gSWYgZ29pbmcgaW50byBzdGFuZGJ5LCBmbHVzaCB0aGUgcGlwZSBzb3VyY2UuCkBAIC02OTIyLDExICs3NDg1LDEzIEBACiAgICAgICAgIHNpemVfdCAqcEZyYW1lQ291bnQsCiAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCiAgICAgICAgIHNpemVfdCAqcE5vdGlmaWNhdGlvbkZyYW1lQ291bnQsCisgICAgICAgIHBpZF90IGNyZWF0b3JQaWQsCiAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCAqZmxhZ3MsCiAgICAgICAgIHBpZF90IHRpZCwKICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cywKLSAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAorICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSkKIHsKICAgICBzaXplX3QgZnJhbWVDb3VudCA9ICpwRnJhbWVDb3VudDsKICAgICBzaXplX3Qgbm90aWZpY2F0aW9uRnJhbWVDb3VudCA9ICpwTm90aWZpY2F0aW9uRnJhbWVDb3VudDsKQEAgLTY5NDIsNiArNzUwNywxMiBAQAogICAgICAgICBnb3RvIEV4aXQ7CiAgICAgfQogCisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpICYmICgqZmxhZ3MgJiBBVURJT19JTlBVVF9GTEFHX0RJUkVDVCkgPT0gMCkgeworICAgICAgICBBTE9HRSgiY3JlYXRlUmVjb3JkVHJhY2tfbCgpIG9uIGFuIGVuY29kZWQgc3RyZWFtIHJlcXVpcmVzIEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUIik7CisgICAgICAgIGxTdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgIGdvdG8gRXhpdDsKKyAgICB9CisKICAgICBpZiAoKnBTYW1wbGVSYXRlID09IDApIHsKICAgICAgICAgKnBTYW1wbGVSYXRlID0gbVNhbXBsZVJhdGU7CiAgICAgfQpAQCAtNjk2Niw4ICs3NTM3LDEwIEBACiAgICAgICAgICAgICAvLyB3ZSBmb3JtZXJseSBjaGVja2VkIGZvciBhIGNhbGxiYWNrIGhhbmRsZXIgKG5vbi0wIHRpZCksCiAgICAgICAgICAgICAvLyBidXQgdGhhdCBpcyBubyBsb25nZXIgcmVxdWlyZWQgZm9yIFRSQU5TRkVSX09CVEFJTiBtb2RlCiAgICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gZnJhbWUgY291bnQgaXMgbm90IHNwZWNpZmllZCwgb3IgaXMgZXhhY3RseSB0aGUgcGlwZSBkZXB0aAotICAgICAgICAgICAgKChmcmFtZUNvdW50ID09IDApIHx8IChmcmFtZUNvdW50ID09IG1QaXBlRnJhbWVzUDIpKSAmJgorICAgICAgICAgICAgLy8gRnJhbWUgY291bnQgaXMgbm90IHNwZWNpZmllZCAoMCksIG9yIGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0aGUgcGlwZSBkZXB0aC4KKyAgICAgICAgICAgIC8vIEl0IGlzIE9LIHRvIHByb3ZpZGUgYSBoaWdoZXIgY2FwYWNpdHkgdGhhbiByZXF1ZXN0ZWQuCisgICAgICAgICAgICAvLyBXZSB3aWxsIGZvcmNlIGl0IHRvIG1QaXBlRnJhbWVzUDIgYmVsb3cuCisgICAgICAgICAgICAoZnJhbWVDb3VudCA8PSBtUGlwZUZyYW1lc1AyKSAmJgogICAgICAgICAgICAgLy8gUENNIGRhdGEKICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oZm9ybWF0KSAmJgogICAgICAgICAgICAgLy8gaGFyZHdhcmUgZm9ybWF0CkBAIC03MDUxLDggKzc2MjQsOCBAQAogCiAgICAgICAgIHRyYWNrID0gbmV3IFJlY29yZFRyYWNrKHRoaXMsIGNsaWVudCwgYXR0ciwgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAotICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywgc2Vzc2lvbklkLCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgKmZsYWdzLCBUcmFja0Jhc2U6OlRZUEVfREVGQVVMVCwgcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sIHNlc3Npb25JZCwgY3JlYXRvclBpZCwgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICpmbGFncywgVHJhY2tCYXNlOjpUWVBFX0RFRkFVTFQsIG9wUGFja2FnZU5hbWUsIHBvcnRJZCk7CiAKICAgICAgICAgbFN0YXR1cyA9IHRyYWNrLT5pbml0Q2hlY2soKTsKICAgICAgICAgaWYgKGxTdGF0dXMgIT0gTk9fRVJST1IpIHsKQEAgLTcxMDcsOCArNzY4MCwxNCBAQAogICAgIHsKICAgICAgICAgLy8gVGhpcyBzZWN0aW9uIGlzIGEgcmVuZGV6dm91cyBiZXR3ZWVuIGJpbmRlciB0aHJlYWQgZXhlY3V0aW5nIHN0YXJ0KCkgYW5kIFJlY29yZFRocmVhZAogICAgICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CisgICAgICAgIGlmIChyZWNvcmRUcmFjay0+aXNJbnZhbGlkKCkpIHsKKyAgICAgICAgICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KICAgICAgICAgaWYgKG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgPj0gMCkgewogICAgICAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTSU5HKSB7CisgICAgICAgICAgICAgICAgLy8gV2UgaGF2ZW4ndCBzdG9wcGVkIHlldCAobW92ZWQgdG8gUEFVU0VEIGFuZCBub3QgaW4gbUFjdGl2ZVRyYWNrcykKKyAgICAgICAgICAgICAgICAvLyBzbyBubyBuZWVkIHRvIHN0YXJ0SW5wdXQoKS4KICAgICAgICAgICAgICAgICBBTE9HVigiYWN0aXZlIHJlY29yZCB0cmFjayBQQVVTSU5HIC0+IEFDVElWRSIpOwogICAgICAgICAgICAgICAgIHJlY29yZFRyYWNrLT5tU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKICAgICAgICAgICAgIH0gZWxzZSB7CkBAIC03MTI1LDE3ICs3NzA0LDM2IEBACiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogICAgICAgICBpZiAocmVjb3JkVHJhY2stPmlzRXh0ZXJuYWxUcmFjaygpKSB7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQ7Ci0gICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChyZWNvcmRUcmFjay0+cG9ydElkKCksICZzaWxlbmNlZCk7CisgICAgICAgICAgICBzdGF0dXMgPSBBdWRpb1N5c3RlbTo6c3RhcnRJbnB1dChyZWNvcmRUcmFjay0+cG9ydElkKCkpOwogICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgLy8gRklYTUUgc2hvdWxkIHZlcmlmeSB0aGF0IHJlY29yZFRyYWNrIGlzIHN0aWxsIGluIG1BY3RpdmVUcmFja3MKKyAgICAgICAgICAgIGlmIChyZWNvcmRUcmFjay0+aXNJbnZhbGlkKCkpIHsKKyAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlNUQVJUSU5HXzEpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPm1TdGF0ZSA9IFRyYWNrQmFzZTo6U1RBUlRJTkdfMjsKKyAgICAgICAgICAgICAgICAgICAgLy8gU1RBUlRJTkdfMiBmb3JjZXMgZGVzdHJveSB0byBjYWxsIHN0b3BJbnB1dC4KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHJlY29yZFRyYWNrLT5tU3RhdGUgIT0gVHJhY2tCYXNlOjpTVEFSVElOR18xKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogdW5zeW5jaHJvbml6ZWQgbVN0YXRlOiVkIGNoYW5nZSIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCByZWNvcmRUcmFjay0+aWQoKSwgcmVjb3JkVHJhY2stPm1TdGF0ZSk7CisgICAgICAgICAgICAgICAgLy8gU29tZW9uZSBlbHNlIGhhcyBjaGFuZ2VkIHN0YXRlLCBsZXQgdGhlbSB0YWtlIG92ZXIsCisgICAgICAgICAgICAgICAgLy8gbGVhdmUgbVN0YXRlIGluIHRoZSBuZXcgc3RhdGUuCisgICAgICAgICAgICAgICAgcmVjb3JkVHJhY2stPmNsZWFyU3luY1N0YXJ0RXZlbnQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyB3ZSdyZSBvaywgYnV0IHBlcmhhcHMgc3RhcnRJbnB1dCBoYXMgZmFpbGVkCiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogc3RhcnRJbnB1dCBmYWlsZWQsIHN0YXR1cyAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCByZWNvcmRUcmFjay0+aWQoKSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICAvLyBXZSBhcmUgaW4gQWN0aXZlVHJhY2tzIGlmIFNUQVJUSU5HXzEgYW5kIHZhbGlkLCBzbyByZW1vdmUgZnJvbSBBY3RpdmVUcmFja3MsCisgICAgICAgICAgICAgICAgLy8gbGVhdmUgaW4gU1RBUlRJTkdfMSwgc28gZGVzdHJveSgpIHdpbGwgbm90IGNhbGwgc3RvcElucHV0LgogICAgICAgICAgICAgICAgIG1BY3RpdmVUcmFja3MucmVtb3ZlKHJlY29yZFRyYWNrKTsKICAgICAgICAgICAgICAgICByZWNvcmRUcmFjay0+Y2xlYXJTeW5jU3RhcnRFdmVudCgpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJSZWNvcmRUaHJlYWQ6OnN0YXJ0IGVycm9yICVkIiwgc3RhdHVzKTsKICAgICAgICAgICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVjb3JkVHJhY2stPnNldFNpbGVuY2VkKHNpbGVuY2VkKTsKKyAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woCisgICAgICAgICAgICAgICAgQVVESU9fQ0xJRU5UX1NUQVJURUQsIHJlY29yZFRyYWNrLT5jcmVhdG9yUGlkKCksIHJlY29yZFRyYWNrLT5wb3J0SWQoKSk7CiAgICAgICAgIH0KICAgICAgICAgLy8gQ2F0Y2ggdXAgd2l0aCBjdXJyZW50IGJ1ZmZlciBpbmRpY2VzIGlmIHRocmVhZCBpcyBhbHJlYWR5IHJ1bm5pbmcuCiAgICAgICAgIC8vIFRoaXMgaXMgd2hhdCBtYWtlcyBhIG5ldyBjbGllbnQgZGlzY2FyZCBhbGwgYnVmZmVyZWQgZGF0YS4gIElmIHRoZSB0cmFjaydzIG1Sc21wSW5Gcm9udApAQCAtNzE0MywyNiArNzc0MSwxNSBAQAogICAgICAgICAvLyBzZWUgcHJldmlvdXNseSBidWZmZXJlZCBkYXRhIGJlZm9yZSBpdCBjYWxsZWQgc3RhcnQoKSwgYnV0IHdpdGggZ3JlYXRlciByaXNrIG9mIG92ZXJydW4uCiAKICAgICAgICAgcmVjb3JkVHJhY2stPm1SZXNhbXBsZXJCdWZmZXJQcm92aWRlci0+cmVzZXQoKTsKLSAgICAgICAgLy8gY2xlYXIgYW55IGNvbnZlcnRlciBzdGF0ZSBhcyBuZXcgZGF0YSB3aWxsIGJlIGRpc2NvbnRpbnVvdXMKLSAgICAgICAgcmVjb3JkVHJhY2stPm1SZWNvcmRCdWZmZXJDb252ZXJ0ZXItPnJlc2V0KCk7CisgICAgICAgIGlmICghcmVjb3JkVHJhY2stPmlzRGlyZWN0KCkpIHsKKyAgICAgICAgICAgIC8vIGNsZWFyIGFueSBjb252ZXJ0ZXIgc3RhdGUgYXMgbmV3IGRhdGEgd2lsbCBiZSBkaXNjb250aW51b3VzCisgICAgICAgICAgICByZWNvcmRUcmFjay0+bVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+cmVzZXQoKTsKKyAgICAgICAgfQogICAgICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpTVEFSVElOR18yOwogICAgICAgICAvLyBzaWduYWwgdGhyZWFkIHRvIHN0YXJ0CiAgICAgICAgIG1XYWl0V29ya0NWLmJyb2FkY2FzdCgpOwotICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5pbmRleE9mKHJlY29yZFRyYWNrKSA8IDApIHsKLSAgICAgICAgICAgIEFMT0dWKCJSZWNvcmQgZmFpbGVkIHRvIHN0YXJ0Iik7Ci0gICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7Ci0gICAgICAgICAgICBnb3RvIHN0YXJ0RXJyb3I7Ci0gICAgICAgIH0KICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9Ci0KLXN0YXJ0RXJyb3I6Ci0gICAgaWYgKHJlY29yZFRyYWNrLT5pc0V4dGVybmFsVHJhY2soKSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcElucHV0KHJlY29yZFRyYWNrLT5wb3J0SWQoKSk7Ci0gICAgfQotICAgIHJlY29yZFRyYWNrLT5jbGVhclN5bmNTdGFydEV2ZW50KCk7Ci0gICAgLy8gRklYTUUgSSB3b25kZXIgd2h5IHdlIGRvIG5vdCByZXNldCB0aGUgc3RhdGUgaGVyZT8KLSAgICByZXR1cm4gc3RhdHVzOwogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzeW5jU3RhcnRFdmVudENhbGxiYWNrKGNvbnN0IHdwPFN5bmNFdmVudD4mIGV2ZW50KQpAQCAtNzE4MSwyNCArNzc2OCwyOCBAQAogYm9vbCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c3RvcChSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrKiByZWNvcmRUcmFjaykgewogICAgIEFMT0dWKCJSZWNvcmRUaHJlYWQ6OnN0b3AiKTsKICAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgIC8vIGlmIHdlJ3JlIGludmFsaWQsIHdlIGNhbid0IGJlIG9uIHRoZSBBY3RpdmVUcmFja3MuCiAgICAgaWYgKG1BY3RpdmVUcmFja3MuaW5kZXhPZihyZWNvcmRUcmFjaykgPCAwIHx8IHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTSU5HKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgICAgLy8gbm90ZSB0aGF0IHRocmVhZExvb3AgbWF5IHN0aWxsIGJlIHByb2Nlc3NpbmcgdGhlIHRyYWNrIGF0IHRoaXMgcG9pbnQgW3dpdGhvdXQgbG9ja10KICAgICByZWNvcmRUcmFjay0+bVN0YXRlID0gVHJhY2tCYXNlOjpQQVVTSU5HOwotICAgIC8vIHNpZ25hbCB0aHJlYWQgdG8gc3RvcAotICAgIG1XYWl0V29ya0NWLmJyb2FkY2FzdCgpOwotICAgIC8vIGRvIG5vdCB3YWl0IGZvciBtU3RhcnRTdG9wQ29uZCBpZiBleGl0aW5nCi0gICAgaWYgKGV4aXRQZW5kaW5nKCkpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBOT1RFOiBXYWl0aW5nIGhlcmUgaXMgaW1wb3J0YW50IHRvIGtlZXAgc3RvcCBzeW5jaHJvbm91cy4KKyAgICAvLyBUaGlzIGlzIG5lZWRlZCBmb3IgcHJvcGVyIHBhdGNoUmVjb3JkIHBlZXIgcmVsZWFzZS4KKyAgICB3aGlsZSAocmVjb3JkVHJhY2stPm1TdGF0ZSA9PSBUcmFja0Jhc2U6OlBBVVNJTkcgJiYgIXJlY29yZFRyYWNrLT5pc0ludmFsaWQoKSkgeworICAgICAgICBtV2FpdFdvcmtDVi5icm9hZGNhc3QoKTsgLy8gc2lnbmFsIHRocmVhZCB0byBzdG9wCisgICAgICAgIG1TdGFydFN0b3BDb25kLndhaXQobUxvY2spOwogICAgIH0KLSAgICAvLyBGSVhNRSBpbmNvcnJlY3QgdXNhZ2Ugb2Ygd2FpdDogbm8gZXhwbGljaXQgcHJlZGljYXRlIG9yIGxvb3AKLSAgICBtU3RhcnRTdG9wQ29uZC53YWl0KG1Mb2NrKTsKLSAgICAvLyBpZiB3ZSBoYXZlIGJlZW4gcmVzdGFydGVkLCByZWNvcmRUcmFjayBpcyBpbiBtQWN0aXZlVHJhY2tzIGhlcmUKLSAgICBpZiAoZXhpdFBlbmRpbmcoKSB8fCBtQWN0aXZlVHJhY2tzLmluZGV4T2YocmVjb3JkVHJhY2spIDwgMCkgeworCisgICAgaWYgKHJlY29yZFRyYWNrLT5tU3RhdGUgPT0gVHJhY2tCYXNlOjpQQVVTRUQpIHsgLy8gc3VjY2Vzc2Z1bCBzdG9wCiAgICAgICAgIEFMT0dWKCJSZWNvcmQgc3RvcHBlZCBPSyIpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CisKKyAgICAvLyBkb24ndCBoYW5kbGUgYW55dGhpbmcgLSB3ZSd2ZSBiZWVuIGludmFsaWRhdGVkIG9yIHJlc3RhcnRlZCBhbmQgaW4gYSBkaWZmZXJlbnQgc3RhdGUKKyAgICBBTE9HV19JRigiJXMoJWQpOiB1bnN5bmNocm9uaXplZCBzdG9wLCBzdGF0ZTogJWQiLAorICAgICAgICAgICAgX19mdW5jX18sIHJlY29yZFRyYWNrLT5pZCgpLCByZWNvcmRUcmFjay0+bVN0YXRlKTsKICAgICByZXR1cm4gZmFsc2U7CiB9CiAKQEAgLTcyNDEsNiArNzgzMiwyMSBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpzZXRQcmVmZXJyZWRNaWNyb3Bob25lRGlyZWN0aW9uKAorICAgICAgICAgICAgYXVkaW9fbWljcm9waG9uZV9kaXJlY3Rpb25fdCBkaXJlY3Rpb24pCit7CisgICAgQUxPR1YoInNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oJWQpIiwgZGlyZWN0aW9uKTsKKyAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgIHJldHVybiBtSW5wdXQtPnN0cmVhbS0+c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihkaXJlY3Rpb24pOworfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKGZsb2F0IHpvb20pCit7CisgICAgQUxPR1YoInNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbiglZikiLCB6b29tKTsKKyAgICBBdXRvTXV0ZXggX2wobUxvY2spOworICAgIHJldHVybiBtSW5wdXQtPnN0cmVhbS0+c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKHpvb20pOworfQorCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjp1cGRhdGVNZXRhZGF0YV9sKCkKIHsKICAgICBpZiAobUlucHV0ID09IG51bGxwdHIgfHwgbUlucHV0LT5zdHJlYW0gPT0gbnVsbHB0ciB8fApAQCAtNzI4MywyNCArNzg4OSwxNCBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpkdW1wSW50ZXJuYWxzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewotICAgIGR1bXBJbnRlcm5hbHMoZmQsIGFyZ3MpOwotICAgIGR1bXBUcmFja3MoZmQsIGFyZ3MpOwotICAgIGR1bXBFZmZlY3RDaGFpbnMoZmQsIGFyZ3MpOwotICAgIGRwcmludGYoZmQsICIgIExvY2FsIGxvZzpcbiIpOwotICAgIG1Mb2NhbExvZy5kdW1wKGZkLCAiICAgIiAvKiBwcmVmaXggKi8sIDQwIC8qIGxpbmVzICovKTsKLX0KLQotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCi17Ci0gICAgZHVtcEJhc2UoZmQsIGFyZ3MpOwotCiAgICAgQXVkaW9TdHJlYW1JbiAqaW5wdXQgPSBtSW5wdXQ7CiAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyA9IGlucHV0ICE9IE5VTEwgPyBpbnB1dC0+ZmxhZ3MgOiBBVURJT19JTlBVVF9GTEFHX05PTkU7CiAgICAgZHByaW50ZihmZCwgIiAgQXVkaW9TdHJlYW1JbjogJXAgZmxhZ3MgJSN4ICglcylcbiIsCi0gICAgICAgICAgICBpbnB1dCwgZmxhZ3MsIGlucHV0RmxhZ3NUb1N0cmluZyhmbGFncykuY19zdHIoKSk7Ci0gICAgaWYgKG1BY3RpdmVUcmFja3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgICAgIGlucHV0LCBmbGFncywgdG9TdHJpbmcoZmxhZ3MpLmNfc3RyKCkpOworICAgIGRwcmludGYoZmQsICIgIEZyYW1lcyByZWFkOiAlbGxkXG4iLCAobG9uZyBsb25nKW1GcmFtZXNSZWFkKTsKKyAgICBpZiAobUFjdGl2ZVRyYWNrcy5pc0VtcHR5KCkpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiAgTm8gYWN0aXZlIHJlY29yZCBjbGllbnRzXG4iKTsKICAgICB9CiAKQEAgLTczMTYsMTIgKzc5MTIsMTIgQEAKICAgICAvLyB3aGlsZSB3ZSBhcmUgZHVtcGluZyBpdC4gIEl0IG1heSBiZSBpbmNvbnNpc3RlbnQsIGJ1dCBpdCB3b24ndCBtdXRhdGUhCiAgICAgLy8gVGhpcyBpcyBhIGxhcmdlIG9iamVjdCBzbyB3ZSBwbGFjZSBpdCBvbiB0aGUgaGVhcC4KICAgICAvLyBGSVhNRSAyNTk3Mjk1ODogTmVlZCBhbiBpbnRlbGxpZ2VudCBjb3B5IGNvbnN0cnVjdG9yIHRoYXQgZG9lcyBub3QgdG91Y2ggdW51c2VkIHBhZ2VzLgotICAgIGNvbnN0IEZhc3RDYXB0dXJlRHVtcFN0YXRlICpjb3B5ID0gbmV3IEZhc3RDYXB0dXJlRHVtcFN0YXRlKG1GYXN0Q2FwdHVyZUR1bXBTdGF0ZSk7CisgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEZhc3RDYXB0dXJlRHVtcFN0YXRlPiBjb3B5ID0KKyAgICAgICAgICAgIHN0ZDo6bWFrZV91bmlxdWU8RmFzdENhcHR1cmVEdW1wU3RhdGU+KG1GYXN0Q2FwdHVyZUR1bXBTdGF0ZSk7CiAgICAgY29weS0+ZHVtcChmZCk7Ci0gICAgZGVsZXRlIGNvcHk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmR1bXBUcmFja3MoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZHVtcFRyYWNrc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBTdHJpbmc4IHJlc3VsdDsKICAgICBzaXplX3QgbnVtdHJhY2tzID0gbVRyYWNrcy5zaXplKCk7CkBAIC03MzMyLDcgKzc5MjgsNyBAQAogICAgIGlmIChudW10cmFja3MpIHsKICAgICAgICAgZHByaW50ZihmZCwgIiBvZiB3aGljaCAlenUgYXJlIGFjdGl2ZVxuIiwgbnVtYWN0aXZlKTsKICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwotICAgICAgICBSZWNvcmRUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihyZXN1bHQpOworICAgICAgICBtVHJhY2tzWzBdLT5hcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtdHJhY2tzIDsgKytpKSB7CiAgICAgICAgICAgICBzcDxSZWNvcmRUcmFjaz4gdHJhY2sgPSBtVHJhY2tzW2ldOwogICAgICAgICAgICAgaWYgKHRyYWNrICE9IDApIHsKQEAgLTczNTIsNyArNzk0OCw3IEBACiAgICAgICAgIHJlc3VsdC5hcHBlbmQoIiAgVGhlIGZvbGxvd2luZyB0cmFja3MgYXJlIGluIHRoZSBhY3RpdmUgbGlzdCBidXQiCiAgICAgICAgICAgICAgICAgIiBub3QgaW4gdGhlIHRyYWNrIGxpc3RcbiIpOwogICAgICAgICByZXN1bHQuYXBwZW5kKHByZWZpeCk7Ci0gICAgICAgIFJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIG1BY3RpdmVUcmFja3NbMF0tPmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1hY3RpdmU7ICsraSkgewogICAgICAgICAgICAgc3A8UmVjb3JkVHJhY2s+IHRyYWNrID0gbUFjdGl2ZVRyYWNrc1tpXTsKICAgICAgICAgICAgIGlmIChtVHJhY2tzLmluZGV4T2YodHJhY2spIDwgMCkgewpAQCAtNzM5MSw3ICs3OTg3LDcgQEAKICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKikgdGhyZWFkQmFzZS5nZXQoKTsKICAgICBjb25zdCBpbnQzMl90IHJlYXIgPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5SZWFyOwogICAgIGNvbnN0IGludDMyX3QgZnJvbnQgPSBtUnNtcEluRnJvbnQ7Ci0gICAgY29uc3Qgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CisgICAgY29uc3Qgc3NpemVfdCBmaWxsZWQgPSBhdWRpb191dGlsczo6c2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgZnJvbnQpOwogCiAgICAgc2l6ZV90IGZyYW1lc0luOwogICAgIGJvb2wgb3ZlcnJ1biA9IGZhbHNlOwpAQCAtNzQwNSw3ICs4MDAxLDggQEAKICAgICB9IGVsc2UgewogICAgICAgICAvLyBjbGllbnQgaXMgbm90IGtlZXBpbmcgdXAgd2l0aCBzZXJ2ZXIsIGJ1dCBnaXZlIGl0IGxhdGVzdCBkYXRhCiAgICAgICAgIGZyYW1lc0luID0gcmVjb3JkVGhyZWFkLT5tUnNtcEluRnJhbWVzOwotICAgICAgICBtUnNtcEluRnJvbnQgPSAvKiBmcm9udCA9ICovIHJlYXIgLSBmcmFtZXNJbjsKKyAgICAgICAgbVJzbXBJbkZyb250ID0gLyogZnJvbnQgPSAqLyBhdWRpb191dGlsczo6c2FmZV9zdWJfb3ZlcmZsb3coCisgICAgICAgICAgICAgICAgcmVhciwgc3RhdGljX2Nhc3Q8aW50MzJfdD4oZnJhbWVzSW4pKTsKICAgICAgICAgb3ZlcnJ1biA9IHRydWU7CiAgICAgfQogICAgIGlmIChmcmFtZXNBdmFpbGFibGUgIT0gTlVMTCkgewpAQCAtNzQyOSw3ICs4MDI2LDcgQEAKICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCA9IChSZWNvcmRUaHJlYWQgKikgdGhyZWFkQmFzZS5nZXQoKTsKICAgICBpbnQzMl90IHJlYXIgPSByZWNvcmRUaHJlYWQtPm1Sc21wSW5SZWFyOwogICAgIGludDMyX3QgZnJvbnQgPSBtUnNtcEluRnJvbnQ7Ci0gICAgc3NpemVfdCBmaWxsZWQgPSByZWFyIC0gZnJvbnQ7CisgICAgc3NpemVfdCBmaWxsZWQgPSBhdWRpb191dGlsczo6c2FmZV9zdWJfb3ZlcmZsb3cocmVhciwgZnJvbnQpOwogICAgIC8vIEZJWE1FIHNob3VsZCBub3QgYmUgUDIgKGRvbid0IHdhbnQgdG8gaW5jcmVhc2UgbGF0ZW5jeSkKICAgICAvLyBGSVhNRSBpZiBjbGllbnQgbm90IGtlZXBpbmcgdXAsIGRpc2NhcmQKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCEoMCA8PSBmaWxsZWQgJiYgKHNpemVfdCkgZmlsbGVkIDw9IHJlY29yZFRocmVhZC0+bVJzbXBJbkZyYW1lcykpOwpAQCAtNzQ2MiwxMyArODA1OSwxMyBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVzYW1wbGVyQnVmZmVyUHJvdmlkZXI6OnJlbGVhc2VCdWZmZXIoCiAgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQogewotICAgIHNpemVfdCBzdGVwQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgaW50MzJfdCBzdGVwQ291bnQgPSBzdGF0aWNfY2FzdDxpbnQzMl90PihidWZmZXItPmZyYW1lQ291bnQpOwogICAgIGlmIChzdGVwQ291bnQgPT0gMCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIEFMT0dfQVNTRVJUKHN0ZXBDb3VudCA8PSBtUnNtcEluVW5yZWwpOwogICAgIG1Sc21wSW5VbnJlbCAtPSBzdGVwQ291bnQ7Ci0gICAgbVJzbXBJbkZyb250ICs9IHN0ZXBDb3VudDsKKyAgICBtUnNtcEluRnJvbnQgPSBhdWRpb191dGlsczo6c2FmZV9hZGRfb3ZlcmZsb3cobVJzbXBJbkZyb250LCBzdGVwQ291bnQpOwogICAgIGJ1ZmZlci0+cmF3ID0gTlVMTDsKICAgICBidWZmZXItPmZyYW1lQ291bnQgPSAwOwogfQpAQCAtNzQ4Myw3ICs4MDgwLDcgQEAKIHsKICAgICAvLyBkaXNhYmxlIEFFQyBhbmQgTlMgaWYgdGhlIGRldmljZSBpcyBhIEJUIFNDTyBoZWFkc2V0IHN1cHBvcnRpbmcgdGhvc2UKICAgICAvLyBwcmUgcHJvY2Vzc2luZ3MKLSAgICBib29sIHN1c3BlbmQgPSBhdWRpb19pc19ibHVldG9vdGhfc2NvX2RldmljZShtSW5EZXZpY2UpICYmCisgICAgYm9vbCBzdXNwZW5kID0gYXVkaW9faXNfYmx1ZXRvb3RoX3Njb19kZXZpY2UoaW5EZXZpY2VUeXBlKCkpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9GbGluZ2VyLT5idE5yZWNJc09mZigpOwogICAgIGlmIChtQnROcmVjU3VzcGVuZGVkLmV4Y2hhbmdlKHN1c3BlbmQpICE9IHN1c3BlbmQpIHsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CkBAIC03NTQ4LDM0ICs4MTQ1LDExIEBACiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSb3V0aW5nKSwgdmFsdWUpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIC8vIGZvcndhcmQgZGV2aWNlIGNoYW5nZSB0byBlZmZlY3RzIHRoYXQgaGF2ZSByZXF1ZXN0ZWQgdG8gYmUKLSAgICAgICAgLy8gYXdhcmUgb2YgYXR0YWNoZWQgYXVkaW8gZGV2aWNlLgotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldERldmljZV9sKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIHN0b3JlIGlucHV0IGRldmljZSBhbmQgb3V0cHV0IGRldmljZSBidXQgZG8gbm90IGZvcndhcmQgb3V0cHV0IGRldmljZSB0byBhdWRpbyBIQUwuCi0gICAgICAgIC8vIE5vdGUgdGhhdCBzdGF0dXMgaXMgaWdub3JlZCBieSB0aGUgY2FsbGVyIGZvciBvdXRwdXQgZGV2aWNlCi0gICAgICAgIC8vIChzZWUgQXVkaW9GbGluZ2VyOjpzZXRQYXJhbWV0ZXJzKCkKLSAgICAgICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKHZhbHVlKSkgewotICAgICAgICAgICAgbU91dERldmljZSA9IHZhbHVlOwotICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbUluRGV2aWNlID0gdmFsdWU7Ci0gICAgICAgICAgICBpZiAodmFsdWUgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBtUHJldkluRGV2aWNlID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjaGVja0J0TnJlY19sKCk7Ci0gICAgICAgIH0KKyAgICAgICAgTE9HX0ZBVEFMKCJTaG91bGQgbm90IHNldCByb3V0aW5nIGRldmljZSBpbiBSZWNvcmRUaHJlYWQiKTsKICAgICB9CiAgICAgaWYgKHBhcmFtLmdldEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlJbnB1dFNvdXJjZSksIHZhbHVlKSA9PSBOT19FUlJPUiAmJgogICAgICAgICAgICAgbUF1ZGlvU291cmNlICE9IChhdWRpb19zb3VyY2VfdCl2YWx1ZSkgewotICAgICAgICAvLyBmb3J3YXJkIGRldmljZSBjaGFuZ2UgdG8gZWZmZWN0cyB0aGF0IGhhdmUgcmVxdWVzdGVkIHRvIGJlCi0gICAgICAgIC8vIGF3YXJlIG9mIGF0dGFjaGVkIGF1ZGlvIGRldmljZS4KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXRBdWRpb1NvdXJjZV9sKChhdWRpb19zb3VyY2VfdCl2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbUF1ZGlvU291cmNlID0gKGF1ZGlvX3NvdXJjZV90KXZhbHVlOworICAgICAgICBMT0dfRkFUQUwoIlNob3VsZCBub3Qgc2V0IGF1ZGlvIHNvdXJjZSBpbiBSZWNvcmRUaHJlYWQiKTsKICAgICB9CiAKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CkBAIC03NjE4LDcgKzgxOTIsOCBAQAogICAgIHJldHVybiBTdHJpbmc4KCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCkgewordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6aW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSB7CiAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGRlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKIAogICAgIGRlc2MtPm1Jb0hhbmRsZSA9IG1JZDsKQEAgLTc2MzUsNyArODIxMCwxMCBAQAogICAgICAgICBkZXNjLT5tRnJhbWVDb3VudEhBTCA9IG1GcmFtZUNvdW50OwogICAgICAgICBkZXNjLT5tTGF0ZW5jeSA9IDA7CiAgICAgICAgIGJyZWFrOwotCisgICAgY2FzZSBBVURJT19DTElFTlRfU1RBUlRFRDoKKyAgICAgICAgZGVzYy0+bVBhdGNoID0gbVBhdGNoOworICAgICAgICBkZXNjLT5tUG9ydElkID0gcG9ydElkOworICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX0lOUFVUX0NMT1NFRDoKICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKQEAgLTc2NDcsMTAgKzgyMjUsMTUgQEAKIHsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBtSW5wdXQtPnN0cmVhbS0+Z2V0QXVkaW9Qcm9wZXJ0aWVzKCZtU2FtcGxlUmF0ZSwgJm1DaGFubmVsTWFzaywgJm1IQUxGb3JtYXQpOwogICAgIExPR19BTFdBWVNfRkFUQUxfSUYocmVzdWx0ICE9IE9LLCAiRXJyb3IgcmV0cmlldmluZyBhdWRpbyBwcm9wZXJ0aWVzIGZyb20gSEFMOiAlZCIsIHJlc3VsdCk7Ci0gICAgbUNoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKG1DaGFubmVsTWFzayk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihtQ2hhbm5lbENvdW50ID4gRkNDXzgsICJIQUwgY2hhbm5lbCBjb3VudCAlZCA+ICVkIiwgbUNoYW5uZWxDb3VudCwgRkNDXzgpOwogICAgIG1Gb3JtYXQgPSBtSEFMRm9ybWF0OwotICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIWF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCksICJIQUwgZm9ybWF0ICUjeCBpcyBub3QgbGluZWFyIHBjbSIsIG1Gb3JtYXQpOworICAgIG1DaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhtQ2hhbm5lbE1hc2spOworICAgIGlmIChhdWRpb19pc19saW5lYXJfcGNtKG1Gb3JtYXQpKSB7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobUNoYW5uZWxDb3VudCA+IEZDQ184LCAiSEFMIGNoYW5uZWwgY291bnQgJWQgPiAlZCIsCisgICAgICAgICAgICAgICAgbUNoYW5uZWxDb3VudCwgRkNDXzgpOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIENhbiBoYXZlIG1vcmUgdGhhdCBGQ0NfOCBjaGFubmVscyBpbiBlbmNvZGVkIHN0cmVhbXMuCisgICAgICAgIEFMT0dJKCJIQUwgZm9ybWF0ICUjeCBpcyBub3QgbGluZWFyIHBjbSIsIG1Gb3JtYXQpOworICAgIH0KICAgICByZXN1bHQgPSBtSW5wdXQtPnN0cmVhbS0+Z2V0RnJhbWVTaXplKCZtRnJhbWVTaXplKTsKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlc3VsdCAhPSBPSywgIkVycm9yIHJldHJpZXZpbmcgZnJhbWUgc2l6ZSBmcm9tIEhBTDogJWQiLCByZXN1bHQpOwogICAgIHJlc3VsdCA9IG1JbnB1dC0+c3RyZWFtLT5nZXRCdWZmZXJTaXplKCZtQnVmZmVyU2l6ZSk7CkBAIC03NzAwLDI3ICs4MjgzLDYgQEAKICAgICByZXR1cm4gMDsKIH0KIAotLy8gaGFzQXVkaW9TZXNzaW9uX2woKSBtdXN0IGJlIGNhbGxlZCB3aXRoIFRocmVhZEJhc2U6Om1Mb2NrIGhlbGQKLXVpbnQzMl90IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpoYXNBdWRpb1Nlc3Npb25fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSBjb25zdAotewotICAgIHVpbnQzMl90IHJlc3VsdCA9IDA7Ci0gICAgaWYgKGdldEVmZmVjdENoYWluX2woc2Vzc2lvbklkKSAhPSAwKSB7Ci0gICAgICAgIHJlc3VsdCA9IEVGRkVDVF9TRVNTSU9OOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbVRyYWNrcy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAoc2Vzc2lvbklkID09IG1UcmFja3NbaV0tPnNlc3Npb25JZCgpKSB7Ci0gICAgICAgICAgICByZXN1bHQgfD0gVFJBQ0tfU0VTU0lPTjsKLSAgICAgICAgICAgIGlmIChtVHJhY2tzW2ldLT5pc0Zhc3RUcmFjaygpKSB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0IHw9IEZBU1RfU0VTU0lPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLX0KLQogS2V5ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90LCBib29sPiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6c2Vzc2lvbklkcygpIGNvbnN0CiB7CiAgICAgS2V5ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90LCBib29sPiBpZHM7CkBAIC03NzU0LDExICs4MzE2LDYgQEAKIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbikKIHsKLSAgICAvLyBvbmx5IG9uZSBjaGFpbiBwZXIgaW5wdXQgdGhyZWFkCi0gICAgaWYgKG1FZmZlY3RDaGFpbnMuc2l6ZSgpICE9IDApIHsKLSAgICAgICAgQUxPR1coImFkZEVmZmVjdENoYWluX2woKSBhbHJlYWR5IG9uZSBjaGFpbiAlcCBvbiB0aHJlYWQgJXAiLCBjaGFpbi5nZXQoKSwgdGhpcyk7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9CiAgICAgQUxPR1YoImFkZEVmZmVjdENoYWluX2woKSAlcCBvbiB0aHJlYWQgJXAiLCBjaGFpbi5nZXQoKSwgdGhpcyk7CiAgICAgY2hhaW4tPnNldFRocmVhZCh0aGlzKTsKICAgICBjaGFpbi0+c2V0SW5CdWZmZXIoTlVMTCk7CkBAIC03Nzc4LDEzICs4MzM1LDE0IEBACiBzaXplX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OnJlbW92ZUVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbikKIHsKICAgICBBTE9HVigicmVtb3ZlRWZmZWN0Q2hhaW5fbCgpICVwIGZyb20gdGhyZWFkICVwIiwgY2hhaW4uZ2V0KCksIHRoaXMpOwotICAgIEFMT0dXX0lGKG1FZmZlY3RDaGFpbnMuc2l6ZSgpICE9IDEsCi0gICAgICAgICAgICAicmVtb3ZlRWZmZWN0Q2hhaW5fbCgpICVwIGludmFsaWQgY2hhaW4gc2l6ZSAlenUgb24gdGhyZWFkICVwIiwKLSAgICAgICAgICAgIGNoYWluLmdldCgpLCBtRWZmZWN0Q2hhaW5zLnNpemUoKSwgdGhpcyk7Ci0gICAgaWYgKG1FZmZlY3RDaGFpbnMuc2l6ZSgpID09IDEpIHsKLSAgICAgICAgbUVmZmVjdENoYWlucy5yZW1vdmVBdCgwKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoY2hhaW4gPT0gbUVmZmVjdENoYWluc1tpXSkgeworICAgICAgICAgICAgbUVmZmVjdENoYWlucy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiAwOworICAgIHJldHVybiBtRWZmZWN0Q2hhaW5zLnNpemUoKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLApAQCAtNzc5MywxMCArODM1MSwxMSBAQAogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogCiAgICAgLy8gc3RvcmUgbmV3IGRldmljZSBhbmQgc2VuZCB0byBlZmZlY3RzCi0gICAgbUluRGV2aWNlID0gcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS50eXBlOwotICAgIG1QYXRjaCA9ICpwYXRjaDsKKyAgICBtSW5EZXZpY2VUeXBlQWRkci5tVHlwZSA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UudHlwZTsKKyAgICBtSW5EZXZpY2VUeXBlQWRkci5tQWRkcmVzcyA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuYWRkcmVzczsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkID0gcGF0Y2gtPnNvdXJjZXNbMF0uaWQ7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldERldmljZV9sKG1JbkRldmljZSk7CisgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldElucHV0RGV2aWNlX2woaW5EZXZpY2VUeXBlQWRkcigpKTsKICAgICB9CiAKICAgICBjaGVja0J0TnJlY19sKCk7CkBAIC03ODM1LDkgKzgzOTQsOSBAQAogICAgICAgICAqaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgfQogCi0gICAgaWYgKG1JbkRldmljZSAhPSBtUHJldkluRGV2aWNlKSB7CisgICAgaWYgKChtUGF0Y2gubnVtX3NvdXJjZXMgPT0gMCkgfHwgKG1QYXRjaC5zb3VyY2VzWzBdLmlkICE9IGRldmljZUlkKSkgewogICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX0lOUFVUX0NPTkZJR19DSEFOR0VEKTsKLSAgICAgICAgbVByZXZJbkRldmljZSA9IG1JbkRldmljZTsKKyAgICAgICAgbVBhdGNoID0gKnBhdGNoOwogICAgIH0KIAogICAgIHJldHVybiBzdGF0dXM7CkBAIC03ODQ3LDcgKzg0MDYsOCBAQAogewogICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwogCi0gICAgbUluRGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgbVBhdGNoID0gYXVkaW9fcGF0Y2h7fTsKKyAgICBtSW5EZXZpY2VUeXBlQWRkci5yZXNldCgpOwogCiAgICAgaWYgKG1JbnB1dC0+YXVkaW9Id0Rldi0+c3VwcG9ydHNBdWRpb1BhdGNoZXMoKSkgewogICAgICAgICBzcDxEZXZpY2VIYWxJbnRlcmZhY2U+IGh3RGV2aWNlID0gbUlucHV0LT5hdWRpb0h3RGV2LT5od0RldmljZSgpOwpAQCAtNzg2MCwyNCArODQyMCw0MyBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmFkZFBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6dXBkYXRlT3V0RGV2aWNlcyhjb25zdCBEZXZpY2VEZXNjcmlwdG9yQmFzZVZlY3RvciYgb3V0RGV2aWNlcykKK3sKKyAgICBtT3V0RGV2aWNlcyA9IG91dERldmljZXM7CisgICAgbU91dERldmljZVR5cGVBZGRycyA9IGRldmljZVR5cGVBZGRyc0Zyb21EZXNjcmlwdG9ycyhtT3V0RGV2aWNlcyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRWZmZWN0Q2hhaW5zLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldERldmljZXNfbChvdXREZXZpY2VUeXBlQWRkcnMoKSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjphZGRQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgbVRyYWNrcy5hZGQocmVjb3JkKTsKKyAgICBpZiAocmVjb3JkLT5nZXRTb3VyY2UoKSkgeworICAgICAgICBtU291cmNlID0gcmVjb3JkLT5nZXRTb3VyY2UoKTsKKyAgICB9CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OmRlbGV0ZVBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6ZGVsZXRlUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmIChtU291cmNlID09IHJlY29yZC0+Z2V0U291cmNlKCkpIHsKKyAgICAgICAgbVNvdXJjZSA9IG1JbnB1dDsKKyAgICB9CiAgICAgZGVzdHJveVRyYWNrX2wocmVjb3JkKTsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6Z2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKQordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpCiB7Ci0gICAgVGhyZWFkQmFzZTo6Z2V0QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgVGhyZWFkQmFzZTo6dG9BdWRpb1BvcnRDb25maWcoY29uZmlnKTsKICAgICBjb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSzsKICAgICBjb25maWctPmV4dC5taXguaHdfbW9kdWxlID0gbUlucHV0LT5hdWRpb0h3RGV2LT5oYW5kbGUoKTsKICAgICBjb25maWctPmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBtQXVkaW9Tb3VyY2U7CisgICAgaWYgKG1JbnB1dCAmJiBtSW5wdXQtPmZsYWdzICE9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSkgeworICAgICAgICBjb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgICAgICBjb25maWctPmZsYWdzLmlucHV0ID0gbUlucHV0LT5mbGFnczsKKyAgICB9CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTc5MjYsMTEgKzg1MDUsMTAgQEAKIAogQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpNbWFwVGhyZWFkKAogICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAotICAgICAgICBBdWRpb0h3RGV2aWNlICpod0Rldiwgc3A8U3RyZWFtSGFsSW50ZXJmYWNlPiBzdHJlYW0sCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSkKLSAgICA6IFRocmVhZEJhc2UoYXVkaW9GbGluZ2VyLCBpZCwgb3V0RGV2aWNlLCBpbkRldmljZSwgTU1BUCwgc3lzdGVtUmVhZHkpLAorICAgICAgICBBdWRpb0h3RGV2aWNlICpod0Rldiwgc3A8U3RyZWFtSGFsSW50ZXJmYWNlPiBzdHJlYW0sIGJvb2wgc3lzdGVtUmVhZHkpCisgICAgOiBUaHJlYWRCYXNlKGF1ZGlvRmxpbmdlciwgaWQsIE1NQVAsIHN5c3RlbVJlYWR5KSwKICAgICAgIG1TZXNzaW9uSWQoQVVESU9fU0VTU0lPTl9OT05FKSwKLSAgICAgIG1EZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwgbVBvcnRJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKSwKKyAgICAgIG1Qb3J0SWQoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSksCiAgICAgICBtSGFsU3RyZWFtKHN0cmVhbSksIG1IYWxEZXZpY2UoaHdEZXYtPmh3RGV2aWNlKCkpLCBtQXVkaW9Id0Rldihod0RldiksCiAgICAgICBtQWN0aXZlVHJhY2tzKCZ0aGlzLT5tTG9jYWxMb2cpLAogICAgICAgbUhhbFZvbEZsb2F0KC0xLjBmKSwgLy8gSW5pdGlhbGl6ZSB0byBpbGxlZ2FsIHZhbHVlIHNvIGl0IGFsd2F5cyBnZXRzIHNldCBwcm9wZXJseSBsYXRlci4KQEAgLTc5NjQsNyArODU0Miw3IEBACiAgICAgfQogICAgIC8vIFRoaXMgd2lsbCBkZWNyZW1lbnQgcmVmZXJlbmNlcyBhbmQgbWF5IGNhdXNlIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGlzIHRocmVhZC4KICAgICBpZiAoaXNPdXRwdXQoKSkgewotICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dChtSWQsIHN0cmVhbVR5cGUoKSwgbVNlc3Npb25JZCk7CisgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1Qb3J0SWQpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQobVBvcnRJZCk7CiAgICAgfQpAQCAtODA0Myw2ICs4NjIxLDcgQEAKICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPQogICAgICAgICAgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CiAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQgPSBtRGV2aWNlSWQ7CisgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzZWNvbmRhcnlPdXRwdXRzOwogICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6Z2V0T3V0cHV0Rm9yQXR0cigmbUF0dHIsICZpbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0cmVhbSwKQEAgLTgwNTEsNyArODYzMCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcG9ydElkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNlY29uZGFyeU91dHB1dHMpOworICAgICAgICBBTE9HRF9JRighc2Vjb25kYXJ5T3V0cHV0cy5lbXB0eSgpLAorICAgICAgICAgICAgICAgICAiTW1hcFRocmVhZDo6c3RhcnQgZG9lcyBub3Qgc3VwcG9ydCBzZWNvbmRhcnkgb3V0cHV0cywgaWdub3JpbmcgdGhlbSIpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnOwogICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBtU2FtcGxlUmF0ZTsKQEAgLTgwNTksNiArODY0MSw3IEBACiAgICAgICAgIGNvbmZpZy5mb3JtYXQgPSBtRm9ybWF0OwogICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkID0gbURldmljZUlkOwogICAgICAgICByZXQgPSBBdWRpb1N5c3RlbTo6Z2V0SW5wdXRGb3JBdHRyKCZtQXR0ciwgJmlvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJFQ09SRF9SSUlEX0lOVkFMSUQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50UGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC5jbGllbnRVaWQsCkBAIC04MDc2LDIxICs4NjU5LDIwIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgYm9vbCBzaWxlbmNlZCA9IGZhbHNlOwogICAgIGlmIChpc091dHB1dCgpKSB7Ci0gICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dChtSWQsIHN0cmVhbVR5cGUoKSwgbVNlc3Npb25JZCk7CisgICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpzdGFydE91dHB1dChwb3J0SWQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldCA9IEF1ZGlvU3lzdGVtOjpzdGFydElucHV0KHBvcnRJZCwgJnNpbGVuY2VkKTsKKyAgICAgICAgcmV0ID0gQXVkaW9TeXN0ZW06OnN0YXJ0SW5wdXQocG9ydElkKTsKICAgICB9CiAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIC8vIGFib3J0IGlmIHN0YXJ0IGlzIHJlamVjdGVkIGJ5IGF1ZGlvIHBvbGljeSBtYW5hZ2VyCiAgICAgaWYgKHJldCAhPSBOT19FUlJPUikgewogICAgICAgICBBTE9HRSgiJXM6IGVycm9yIHN0YXJ0IHJlamVjdGVkIGJ5IEF1ZGlvUG9saWN5TWFuYWdlciA9ICVkIiwgX19GVU5DVElPTl9fLCByZXQpOwotICAgICAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgIT0gMCkgeworICAgICAgICBpZiAoIW1BY3RpdmVUcmFja3MuaXNFbXB0eSgpKSB7CiAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgIGlmIChpc091dHB1dCgpKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIG1TZXNzaW9uSWQpOworICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KHBvcnRJZCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQocG9ydElkKTsKICAgICAgICAgICAgIH0KQEAgLTgxMDEsMjEgKzg2ODMsMjIgQEAKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAorICAgIC8vIEdpdmVuIHRoYXQgTW1hcFRocmVhZDo6bUF0dHIgaXMgbXV0YWJsZSwgc2hvdWxkIGEgTW1hcFRyYWNrIGhhdmUgYXR0cmlidXRlcyA/CisgICAgc3A8TW1hcFRyYWNrPiB0cmFjayA9IG5ldyBNbWFwVHJhY2sodGhpcywgbUF0dHIsIG1TYW1wbGVSYXRlLCBtRm9ybWF0LCBtQ2hhbm5lbE1hc2ssIG1TZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNPdXRwdXQoKSwgY2xpZW50LmNsaWVudFVpZCwgY2xpZW50LmNsaWVudFBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksIHBvcnRJZCk7CisKICAgICBpZiAoaXNPdXRwdXQoKSkgewogICAgICAgICAvLyBmb3JjZSB2b2x1bWUgdXBkYXRlIHdoZW4gYSBuZXcgdHJhY2sgaXMgYWRkZWQKICAgICAgICAgbUhhbFZvbEZsb2F0ID0gLTEuMGY7Ci0gICAgfSBlbHNlIGlmICghc2lsZW5jZWQpIHsKLSAgICAgICAgZm9yIChjb25zdCBzcDxNbWFwVHJhY2s+ICZ0cmFjayA6IG1BY3RpdmVUcmFja3MpIHsKLSAgICAgICAgICAgIGlmICh0cmFjay0+aXNTaWxlbmNlZF9sKCkgJiYgdHJhY2stPnVpZCgpICE9IGNsaWVudC5jbGllbnRVaWQpCi0gICAgICAgICAgICAgICAgdHJhY2stPmludmFsaWRhdGUoKTsKKyAgICB9IGVsc2UgaWYgKCF0cmFjay0+aXNTaWxlbmNlZF9sKCkpIHsKKyAgICAgICAgZm9yIChjb25zdCBzcDxNbWFwVHJhY2s+ICZ0IDogbUFjdGl2ZVRyYWNrcykgeworICAgICAgICAgICAgaWYgKHQtPmlzU2lsZW5jZWRfbCgpICYmIHQtPnVpZCgpICE9IGNsaWVudC5jbGllbnRVaWQpCisgICAgICAgICAgICAgICAgdC0+aW52YWxpZGF0ZSgpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gR2l2ZW4gdGhhdCBNbWFwVGhyZWFkOjptQXR0ciBpcyBtdXRhYmxlLCBzaG91bGQgYSBNbWFwVHJhY2sgaGF2ZSBhdHRyaWJ1dGVzID8KLSAgICBzcDxNbWFwVHJhY2s+IHRyYWNrID0gbmV3IE1tYXBUcmFjayh0aGlzLCBtQXR0ciwgbVNhbXBsZVJhdGUsIG1Gb3JtYXQsIG1DaGFubmVsTWFzaywgbVNlc3Npb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQuY2xpZW50VWlkLCBjbGllbnQuY2xpZW50UGlkLCBwb3J0SWQpOwogCi0gICAgdHJhY2stPnNldFNpbGVuY2VkX2woc2lsZW5jZWQpOwogICAgIG1BY3RpdmVUcmFja3MuYWRkKHRyYWNrKTsKICAgICBzcDxFZmZlY3RDaGFpbj4gY2hhaW4gPSBnZXRFZmZlY3RDaGFpbl9sKG1TZXNzaW9uSWQpOwogICAgIGlmIChjaGFpbiAhPSAwKSB7CkBAIC04MTYyLDggKzg3NDUsOCBAQAogCiAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgaWYgKGlzT3V0cHV0KCkpIHsKLSAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BPdXRwdXQobUlkLCBzdHJlYW1UeXBlKCksIHRyYWNrLT5zZXNzaW9uSWQoKSk7Ci0gICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1JZCwgc3RyZWFtVHlwZSgpLCB0cmFjay0+c2Vzc2lvbklkKCkpOworICAgICAgICBBdWRpb1N5c3RlbTo6c3RvcE91dHB1dCh0cmFjay0+cG9ydElkKCkpOworICAgICAgICBBdWRpb1N5c3RlbTo6cmVsZWFzZU91dHB1dCh0cmFjay0+cG9ydElkKCkpOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQodHJhY2stPnBvcnRJZCgpKTsKICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dCh0cmFjay0+cG9ydElkKCkpOwpAQCAtODE4OCw3ICs4NzcxLDcgQEAKICAgICBpZiAobUhhbFN0cmVhbSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgIT0gMCkgeworICAgIGlmICghbUFjdGl2ZVRyYWNrcy5pc0VtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KICAgICBtSGFsU3RyZWFtLT5zdGFuZGJ5KCk7CkBAIC04MjE5LDkgKzg4MDIsMTEgQEAKIAogICAgIHdoaWxlICghZXhpdFBlbmRpbmcoKSkKICAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIFZlY3Rvcjwgc3A8RWZmZWN0Q2hhaW4+ID4gZWZmZWN0Q2hhaW5zOwogCisgICAgICAgIHsgLy8gdW5kZXIgVGhyZWFkIGxvY2sKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKwogICAgICAgICBpZiAobVNpZ25hbFBlbmRpbmcpIHsKICAgICAgICAgICAgIC8vIEEgc2lnbmFsIHdhcyByYWlzZWQgd2hpbGUgd2Ugd2VyZSB1bmxvY2tlZAogICAgICAgICAgICAgbVNpZ25hbFBlbmRpbmcgPSBmYWxzZTsKQEAgLTgyNTYsMTAgKzg4NDEsMTMgQEAKICAgICAgICAgdXBkYXRlTWV0YWRhdGFfbCgpOwogCiAgICAgICAgIGxvY2tFZmZlY3RDaGFpbnNfbChlZmZlY3RDaGFpbnMpOworICAgICAgICB9IC8vIHJlbGVhc2UgVGhyZWFkIGxvY2sKKwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdENoYWlucy5zaXplKCk7IGkgKyspIHsKLSAgICAgICAgICAgIGVmZmVjdENoYWluc1tpXS0+cHJvY2Vzc19sKCk7CisgICAgICAgICAgICBlZmZlY3RDaGFpbnNbaV0tPnByb2Nlc3NfbCgpOyAvLyBUaHJlYWQgaXMgbm90IGxvY2tlZCwgYnV0IGVmZmVjdCBjaGFpbiBpcyBsb2NrZWQKICAgICAgICAgfQotICAgICAgICAvLyBlbmFibGUgY2hhbmdlcyBpbiBlZmZlY3QgY2hhaW4KKworICAgICAgICAvLyBlbmFibGUgY2hhbmdlcyBpbiBlZmZlY3QgY2hhaW4sIGluY2x1ZGluZyBtb3ZpbmcgdG8gYW5vdGhlciB0aHJlYWQuCiAgICAgICAgIHVubG9ja0VmZmVjdENoYWlucyhlZmZlY3RDaGFpbnMpOwogICAgICAgICAvLyBFZmZlY3QgY2hhaW5zIHdpbGwgYmUgYWN0dWFsbHkgZGVsZXRlZCBoZXJlIGlmIHRoZXkgd2VyZSByZW1vdmVkIGZyb20KICAgICAgICAgLy8gbUVmZmVjdENoYWlucyBsaXN0IGR1cmluZyBtaXhpbmcgb3IgZWZmZWN0cyBwcm9jZXNzaW5nCkBAIC04Mjg0LDI2ICs4ODcyLDcgQEAKICAgICBpbnQgdmFsdWU7CiAgICAgYm9vbCBzZW5kVG9IYWwgPSB0cnVlOwogICAgIGlmIChwYXJhbS5nZXRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksIHZhbHVlKSA9PSBOT19FUlJPUikgewotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCl2YWx1ZTsKLSAgICAgICAgLy8gZm9yd2FyZCBkZXZpY2UgY2hhbmdlIHRvIGVmZmVjdHMgdGhhdCBoYXZlIHJlcXVlc3RlZCB0byBiZQotICAgICAgICAvLyBhd2FyZSBvZiBhdHRhY2hlZCBhdWRpbyBkZXZpY2UuCi0gICAgICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVmZmVjdENoYWlucy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIG1FZmZlY3RDaGFpbnNbaV0tPnNldERldmljZV9sKGRldmljZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKGRldmljZSkpIHsKLSAgICAgICAgICAgIG1PdXREZXZpY2UgPSBkZXZpY2U7Ci0gICAgICAgICAgICBpZiAoIWlzT3V0cHV0KCkpIHsKLSAgICAgICAgICAgICAgICBzZW5kVG9IYWwgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1JbkRldmljZSA9IGRldmljZTsKLSAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBtUHJldkluRGV2aWNlID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUT0RPOiBpbXBsZW1lbnQgYW5kIGNhbGwgY2hlY2tCdE5yZWNfbCgpOwotICAgICAgICB9CisgICAgICAgIExPR19GQVRBTCgiU2hvdWxkIG5vdCBoYXBwZW4gc2V0IHJvdXRpbmcgZGV2aWNlIGluIE1tYXBUaHJlYWQiKTsKICAgICB9CiAgICAgaWYgKHNlbmRUb0hhbCkgewogICAgICAgICBzdGF0dXMgPSBtSGFsU3RyZWFtLT5zZXRQYXJhbWV0ZXJzKGtleVZhbHVlUGFpcik7CkBAIC04MzI0LDcgKzg4OTMsOCBAQAogICAgIHJldHVybiBTdHJpbmc4KCk7CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjppb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQpIHsKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjppb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkIF9fdW51c2VkKSB7CiAgICAgc3A8QXVkaW9Jb0Rlc2NyaXB0b3I+IGRlc2MgPSBuZXcgQXVkaW9Jb0Rlc2NyaXB0b3IoKTsKIAogICAgIGRlc2MtPm1Jb0hhbmRsZSA9IG1JZDsKQEAgLTgzNjEsMjQgKzg5MzEsMzkgQEAKICAgICAvLyBzdG9yZSBuZXcgZGV2aWNlIGFuZCBzZW5kIHRvIGVmZmVjdHMKICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IEFVRElPX0RFVklDRV9OT05FOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQ7CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkclZlY3RvciBzaW5rRGV2aWNlVHlwZUFkZHJzOworICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgc291cmNlRGV2aWNlVHlwZUFkZHI7CisgICAgdWludDMyX3QgbnVtRGV2aWNlcyA9IDA7CiAgICAgaWYgKGlzT3V0cHV0KCkpIHsKICAgICAgICAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYocG9wY291bnQocGF0Y2gtPnNpbmtzW2ldLmV4dC5kZXZpY2UudHlwZSkgPiAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICFtQXVkaW9Id0Rldi0+c3VwcG9ydHNBdWRpb1BhdGNoZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkVudW1lcmF0ZWQgZGV2aWNlIHR5cGUoJSN4KSBtdXN0IG5vdCBiZSB1c2VkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFzIGl0IGRvZXMgbm90IHN1cHBvcnQgYXVkaW8gcGF0Y2hlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGUpOwogICAgICAgICAgICAgdHlwZSB8PSBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlOworICAgICAgICAgICAgc2lua0RldmljZVR5cGVBZGRycy5wdXNoX2JhY2soQXVkaW9EZXZpY2VUeXBlQWRkcihwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS50eXBlLAorICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0uZXh0LmRldmljZS5hZGRyZXNzKSk7CiAgICAgICAgIH0KICAgICAgICAgZGV2aWNlSWQgPSBwYXRjaC0+c2lua3NbMF0uaWQ7CisgICAgICAgIG51bURldmljZXMgPSBtUGF0Y2gubnVtX3NpbmtzOwogICAgIH0gZWxzZSB7CiAgICAgICAgIHR5cGUgPSBwYXRjaC0+c291cmNlc1swXS5leHQuZGV2aWNlLnR5cGU7CiAgICAgICAgIGRldmljZUlkID0gcGF0Y2gtPnNvdXJjZXNbMF0uaWQ7CisgICAgICAgIG51bURldmljZXMgPSBtUGF0Y2gubnVtX3NvdXJjZXM7CisgICAgICAgIHNvdXJjZURldmljZVR5cGVBZGRyLm1UeXBlID0gcGF0Y2gtPnNvdXJjZXNbMF0uZXh0LmRldmljZS50eXBlOworICAgICAgICBzb3VyY2VEZXZpY2VUeXBlQWRkci5tQWRkcmVzcyA9IHBhdGNoLT5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuYWRkcmVzczsKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1FZmZlY3RDaGFpbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgbUVmZmVjdENoYWluc1tpXS0+c2V0RGV2aWNlX2wodHlwZSk7CisgICAgICAgIGlmIChpc091dHB1dCgpKSB7CisgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXREZXZpY2VzX2woc2lua0RldmljZVR5cGVBZGRycyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtRWZmZWN0Q2hhaW5zW2ldLT5zZXRJbnB1dERldmljZV9sKHNvdXJjZURldmljZVR5cGVBZGRyKTsKKyAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChpc091dHB1dCgpKSB7Ci0gICAgICAgIG1PdXREZXZpY2UgPSB0eXBlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIG1JbkRldmljZSA9IHR5cGU7CisgICAgaWYgKCFpc091dHB1dCgpKSB7CiAgICAgICAgIC8vIHN0b3JlIG5ldyBzb3VyY2UgYW5kIHNlbmQgdG8gZWZmZWN0cwogICAgICAgICBpZiAobUF1ZGlvU291cmNlICE9IHBhdGNoLT5zaW5rc1swXS5leHQubWl4LnVzZWNhc2Uuc291cmNlKSB7CiAgICAgICAgICAgICBtQXVkaW9Tb3VyY2UgPSBwYXRjaC0+c2lua3NbMF0uZXh0Lm1peC51c2VjYXNlLnNvdXJjZTsKQEAgLTg0MTUsMjYgKzkwMDAsMjEgQEAKICAgICAgICAgKmhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogICAgIH0KIAotICAgIGlmIChpc091dHB1dCgpICYmIG1QcmV2T3V0RGV2aWNlICE9IG1PdXREZXZpY2UpIHsKLSAgICAgICAgbVByZXZPdXREZXZpY2UgPSB0eXBlOwotICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKEFVRElPX09VVFBVVF9DT05GSUdfQ0hBTkdFRCk7CisgICAgaWYgKG51bURldmljZXMgPT0gMCB8fCBtRGV2aWNlSWQgIT0gZGV2aWNlSWQpIHsKKyAgICAgICAgaWYgKGlzT3V0cHV0KCkpIHsKKyAgICAgICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fT1VUUFVUX0NPTkZJR19DSEFOR0VEKTsKKyAgICAgICAgICAgIG1PdXREZXZpY2VUeXBlQWRkcnMgPSBzaW5rRGV2aWNlVHlwZUFkZHJzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChBVURJT19JTlBVVF9DT05GSUdfQ0hBTkdFRCk7CisgICAgICAgICAgICBtSW5EZXZpY2VUeXBlQWRkciA9IHNvdXJjZURldmljZVR5cGVBZGRyOworICAgICAgICB9CiAgICAgICAgIHNwPE1tYXBTdHJlYW1DYWxsYmFjaz4gY2FsbGJhY2sgPSBtQ2FsbGJhY2sucHJvbW90ZSgpOwogICAgICAgICBpZiAobURldmljZUlkICE9IGRldmljZUlkICYmIGNhbGxiYWNrICE9IDApIHsKICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgY2FsbGJhY2stPm9uUm91dGluZ0NoYW5nZWQoZGV2aWNlSWQpOwogICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICB9Ci0gICAgICAgIG1EZXZpY2VJZCA9IGRldmljZUlkOwotICAgIH0KLSAgICBpZiAoIWlzT3V0cHV0KCkgJiYgbVByZXZJbkRldmljZSAhPSBtSW5EZXZpY2UpIHsKLSAgICAgICAgbVByZXZJbkRldmljZSA9IHR5cGU7Ci0gICAgICAgIHNlbmRJb0NvbmZpZ0V2ZW50X2woQVVESU9fSU5QVVRfQ09ORklHX0NIQU5HRUQpOwotICAgICAgICBzcDxNbWFwU3RyZWFtQ2FsbGJhY2s+IGNhbGxiYWNrID0gbUNhbGxiYWNrLnByb21vdGUoKTsKLSAgICAgICAgaWYgKG1EZXZpY2VJZCAhPSBkZXZpY2VJZCAmJiBjYWxsYmFjayAhPSAwKSB7Ci0gICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgIGNhbGxiYWNrLT5vblJvdXRpbmdDaGFuZ2VkKGRldmljZUlkKTsKLSAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgfQorICAgICAgICBtUGF0Y2ggPSAqcGF0Y2g7CiAgICAgICAgIG1EZXZpY2VJZCA9IGRldmljZUlkOwogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwpAQCAtODQ0NCw3ICs5MDI0LDkgQEAKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKIAotICAgIG1JbkRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgIG1QYXRjaCA9IGF1ZGlvX3BhdGNoe307CisgICAgbU91dERldmljZVR5cGVBZGRycy5jbGVhcigpOworICAgIG1JbkRldmljZVR5cGVBZGRyLnJlc2V0KCk7CiAKICAgICBib29sIHN1cHBvcnRzQXVkaW9QYXRjaGVzID0gbUhhbERldmljZS0+c3VwcG9ydHNBdWRpb1BhdGNoZXMoJnN1cHBvcnRzQXVkaW9QYXRjaGVzKSA9PSBPSyA/CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydHNBdWRpb1BhdGNoZXMgOiBmYWxzZTsKQEAgLTg0NTksOSArOTA0MSw5IEBACiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OmdldEF1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKIHsKLSAgICBUaHJlYWRCYXNlOjpnZXRBdWRpb1BvcnRDb25maWcoY29uZmlnKTsKKyAgICBUaHJlYWRCYXNlOjp0b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOwogICAgIGlmIChpc091dHB1dCgpKSB7CiAgICAgICAgIGNvbmZpZy0+cm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CiAgICAgICAgIGNvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBtQXVkaW9Id0Rldi0+aGFuZGxlKCk7CkBAIC04NTIwLDI4ICs5MTAyLDYgQEAKICAgICByZXR1cm4gbUVmZmVjdENoYWlucy5zaXplKCk7CiB9CiAKLS8vIGhhc0F1ZGlvU2Vzc2lvbl9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCi11aW50MzJfdCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Omhhc0F1ZGlvU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIGNvbnN0Ci17Ci0gICAgdWludDMyX3QgcmVzdWx0ID0gMDsKLSAgICBpZiAoZ2V0RWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQpICE9IDApIHsKLSAgICAgICAgcmVzdWx0ID0gRUZGRUNUX1NFU1NJT047Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQWN0aXZlVHJhY2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPE1tYXBUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwotICAgICAgICBpZiAoc2Vzc2lvbklkID09IHRyYWNrLT5zZXNzaW9uSWQoKSkgewotICAgICAgICAgICAgcmVzdWx0IHw9IFRSQUNLX1NFU1NJT047Ci0gICAgICAgICAgICBpZiAodHJhY2stPmlzRmFzdFRyYWNrKCkpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgfD0gRkFTVF9TRVNTSU9OOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotfQotCiB2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6dGhyZWFkTG9vcF9zdGFuZGJ5KCkKIHsKICAgICBtSGFsU3RyZWFtLT5zdGFuZGJ5KCk7CkBAIC04NTY3LDggKzkxMjcsOCBAQAogICAgICAgICBjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKQogewogICAgIC8vIE5vIGdsb2JhbCBlZmZlY3Qgc2Vzc2lvbnMgb24gbW1hcCB0aHJlYWRzCi0gICAgaWYgKHNlc3Npb25JZCA9PSBBVURJT19TRVNTSU9OX09VVFBVVF9NSVggfHwgc2Vzc2lvbklkID09IEFVRElPX1NFU1NJT05fT1VUUFVUX1NUQUdFKSB7Ci0gICAgICAgIEFMT0dXKCJjaGVja0VmZmVjdENvbXBhdGliaWxpdHlfbCgpOiBnbG9iYWwgZWZmZWN0ICVzIG9uIHJlY29yZCB0aHJlYWQgJXMiLAorICAgIGlmIChhdWRpb19pc19nbG9iYWxfc2Vzc2lvbihzZXNzaW9uSWQpKSB7CisgICAgICAgIEFMT0dXKCJjaGVja0VmZmVjdENvbXBhdGliaWxpdHlfbCgpOiBnbG9iYWwgZWZmZWN0ICVzIG9uIE1NQVAgdGhyZWFkICVzIiwKICAgICAgICAgICAgICAgICBkZXNjLT5uYW1lLCBtVGhyZWFkTmFtZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQpAQCAtODU5MCw3ICs5MTUwLDYgQEAKICAgICB9CiAKICAgICByZXR1cm4gTk9fRVJST1I7Ci0KIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OmNoZWNrSW52YWxpZFRyYWNrc19sKCkKQEAgLTg2MTAsMjggKzkxNjksMTcgQEAKICAgICB9CiB9CiAKLXZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwVGhyZWFkOjpkdW1wSW50ZXJuYWxzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKQogewotICAgIGR1bXBJbnRlcm5hbHMoZmQsIGFyZ3MpOwotICAgIGR1bXBUcmFja3MoZmQsIGFyZ3MpOwotICAgIGR1bXBFZmZlY3RDaGFpbnMoZmQsIGFyZ3MpOwotICAgIGRwcmludGYoZmQsICIgIExvY2FsIGxvZzpcbiIpOwotICAgIG1Mb2NhbExvZy5kdW1wKGZkLCAiICAgIiAvKiBwcmVmaXggKi8sIDQwIC8qIGxpbmVzICovKTsKLX0KLQotdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6OmR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKQotewotICAgIGR1bXBCYXNlKGZkLCBhcmdzKTsKLQogICAgIGRwcmludGYoZmQsICIgIEF0dHJpYnV0ZXM6IGNvbnRlbnQgdHlwZSAlZCB1c2FnZSAlZCBzb3VyY2UgJWRcbiIsCiAgICAgICAgICAgICBtQXR0ci5jb250ZW50X3R5cGUsIG1BdHRyLnVzYWdlLCBtQXR0ci5zb3VyY2UpOwogICAgIGRwcmludGYoZmQsICIgIFNlc3Npb246ICVkIHBvcnQgSWQ6ICVkXG4iLCBtU2Vzc2lvbklkLCBtUG9ydElkKTsKLSAgICBpZiAobUFjdGl2ZVRyYWNrcy5zaXplKCkgPT0gMCkgeworICAgIGlmIChtQWN0aXZlVHJhY2tzLmlzRW1wdHkoKSkgewogICAgICAgICBkcHJpbnRmKGZkLCAiICBObyBhY3RpdmUgY2xpZW50c1xuIik7CiAgICAgfQogfQogCi12b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6ZHVtcFRyYWNrcyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6ZHVtcFRyYWNrc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKICAgICBTdHJpbmc4IHJlc3VsdDsKICAgICBzaXplX3QgbnVtdHJhY2tzID0gbUFjdGl2ZVRyYWNrcy5zaXplKCk7CkBAIC04NjM5LDcgKzkxODcsNyBAQAogICAgIGNvbnN0IGNoYXIgKnByZWZpeCA9ICIgICAgIjsKICAgICBpZiAobnVtdHJhY2tzKSB7CiAgICAgICAgIHJlc3VsdC5hcHBlbmQocHJlZml4KTsKLSAgICAgICAgTW1hcFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKHJlc3VsdCk7CisgICAgICAgIG1BY3RpdmVUcmFja3NbMF0tPmFwcGVuZER1bXBIZWFkZXIocmVzdWx0KTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW10cmFja3MgOyArK2kpIHsKICAgICAgICAgICAgIHNwPE1tYXBUcmFjaz4gdHJhY2sgPSBtQWN0aXZlVHJhY2tzW2ldOwogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChwcmVmaXgpOwpAQCAtODY1Myw5ICs5MjAxLDggQEAKIAogQXVkaW9GbGluZ2VyOjpNbWFwUGxheWJhY2tUaHJlYWQ6Ok1tYXBQbGF5YmFja1RocmVhZCgKICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBhdWRpb19pb19oYW5kbGVfdCBpZCwKLSAgICAgICAgQXVkaW9Id0RldmljZSAqaHdEZXYsICBBdWRpb1N0cmVhbU91dCAqb3V0cHV0LAotICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLCBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsIGJvb2wgc3lzdGVtUmVhZHkpCi0gICAgOiBNbWFwVGhyZWFkKGF1ZGlvRmxpbmdlciwgaWQsIGh3RGV2LCBvdXRwdXQtPnN0cmVhbSwgb3V0RGV2aWNlLCBpbkRldmljZSwgc3lzdGVtUmVhZHkpLAorICAgICAgICBBdWRpb0h3RGV2aWNlICpod0RldiwgIEF1ZGlvU3RyZWFtT3V0ICpvdXRwdXQsIGJvb2wgc3lzdGVtUmVhZHkpCisgICAgOiBNbWFwVGhyZWFkKGF1ZGlvRmxpbmdlciwgaWQsIGh3RGV2LCBvdXRwdXQtPnN0cmVhbSwgc3lzdGVtUmVhZHkpLAogICAgICAgbVN0cmVhbVR5cGUoQVVESU9fU1RSRUFNX01VU0lDKSwKICAgICAgIG1TdHJlYW1Wb2x1bWUoMS4wKSwKICAgICAgIG1TdHJlYW1NdXRlKGZhbHNlKSwKQEAgLTg4NDUsOSArOTM5MiwxOCBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBQbGF5YmFja1RocmVhZDo6ZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFBsYXliYWNrVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKIHsKLSAgICBNbWFwVGhyZWFkOjpkdW1wSW50ZXJuYWxzKGZkLCBhcmdzKTsKKyAgICBNbWFwVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIGlmIChtT3V0cHV0ICYmIG1PdXRwdXQtPmZsYWdzICE9IEFVRElPX09VVFBVVF9GTEFHX05PTkUpIHsKKyAgICAgICAgY29uZmlnLT5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICAgICAgY29uZmlnLT5mbGFncy5vdXRwdXQgPSBtT3V0cHV0LT5mbGFnczsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpNbWFwUGxheWJhY2tUaHJlYWQ6OmR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpCit7CisgICAgTW1hcFRocmVhZDo6ZHVtcEludGVybmFsc19sKGZkLCBhcmdzKTsKIAogICAgIGRwcmludGYoZmQsICIgIFN0cmVhbSB0eXBlOiAlZCBTdHJlYW0gdm9sdW1lOiAlZiBIQUwgdm9sdW1lOiAlZiBTdHJlYW0gbXV0ZSAlZFxuIiwKICAgICAgICAgICAgIG1TdHJlYW1UeXBlLCBtU3RyZWFtVm9sdW1lLCBtSGFsVm9sRmxvYXQsIG1TdHJlYW1NdXRlKTsKQEAgLTg4NTYsOSArOTQxMiw4IEBACiAKIEF1ZGlvRmxpbmdlcjo6TW1hcENhcHR1cmVUaHJlYWQ6Ok1tYXBDYXB0dXJlVGhyZWFkKAogICAgICAgICBjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAotICAgICAgICBBdWRpb0h3RGV2aWNlICpod0RldiwgIEF1ZGlvU3RyZWFtSW4gKmlucHV0LAotICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLCBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsIGJvb2wgc3lzdGVtUmVhZHkpCi0gICAgOiBNbWFwVGhyZWFkKGF1ZGlvRmxpbmdlciwgaWQsIGh3RGV2LCBpbnB1dC0+c3RyZWFtLCBvdXREZXZpY2UsIGluRGV2aWNlLCBzeXN0ZW1SZWFkeSksCisgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmh3RGV2LCAgQXVkaW9TdHJlYW1JbiAqaW5wdXQsIGJvb2wgc3lzdGVtUmVhZHkpCisgICAgOiBNbWFwVGhyZWFkKGF1ZGlvRmxpbmdlciwgaWQsIGh3RGV2LCBpbnB1dC0+c3RyZWFtLCBzeXN0ZW1SZWFkeSksCiAgICAgICBtSW5wdXQoaW5wdXQpCiB7CiAgICAgc25wcmludGYobVRocmVhZE5hbWUsIGtUaHJlYWROYW1lTGVuZ3RoLCAiQXVkaW9NbWFwSW5fJVgiLCBpZCk7CkBAIC04ODY3LDcgKzk0MjIsMTMgQEAKIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpNbWFwQ2FwdHVyZVRocmVhZDo6ZXhpdFN0YW5kYnkoKQogewotICAgIG1JbnB1dC0+c3RyZWFtLT5zZXRHYWluKDEuMGYpOworICAgIHsKKyAgICAgICAgLy8gbUlucHV0IG1pZ2h0IGhhdmUgYmVlbiBjbGVhcmVkIGJ5IGNsZWFySW5wdXQoKQorICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBpZiAobUlucHV0ICE9IG51bGxwdHIgJiYgbUlucHV0LT5zdHJlYW0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgbUlucHV0LT5zdHJlYW0tPnNldEdhaW4oMS4wZik7CisgICAgICAgIH0KKyAgICB9CiAgICAgcmV0dXJuIE1tYXBUaHJlYWQ6OmV4aXRTdGFuZGJ5KCk7CiB9CiAKQEAgLTg5MzUsNCArOTQ5NiwxMyBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBDYXB0dXJlVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykKK3sKKyAgICBNbWFwVGhyZWFkOjp0b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIGlmIChtSW5wdXQgJiYgbUlucHV0LT5mbGFncyAhPSBBVURJT19JTlBVVF9GTEFHX05PTkUpIHsKKyAgICAgICAgY29uZmlnLT5jb25maWdfbWFzayB8PSBBVURJT19QT1JUX0NPTkZJR19GTEFHUzsKKyAgICAgICAgY29uZmlnLT5mbGFncy5pbnB1dCA9IG1JbnB1dC0+ZmxhZ3M7CisgICAgfQorfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RocmVhZHMuaAppbmRleCBlYTI5NDU1Li40YzUzZTI4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVGhyZWFkcy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UaHJlYWRzLmgKQEAgLTM3LDE1ICszNywxMSBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyICp0aHJlYWRUeXBlVG9TdHJpbmcodHlwZV90IHR5cGUpOwogCiAgICAgVGhyZWFkQmFzZShjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAotICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwgdHlwZV90IHR5cGUsCi0gICAgICAgICAgICAgICAgYm9vbCBzeXN0ZW1SZWFkeSk7CisgICAgICAgICAgICAgICB0eXBlX3QgdHlwZSwgYm9vbCBzeXN0ZW1SZWFkeSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+VGhyZWFkQmFzZSgpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICByZWFkeVRvUnVuKCk7CiAKLSAgICB2b2lkIGR1bXBCYXNlKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0gICAgdm9pZCBkdW1wRWZmZWN0Q2hhaW5zKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KICAgICB2b2lkIGNsZWFyUG93ZXJNYW5hZ2VyKCk7CiAKICAgICAvLyBiYXNlIGZvciByZWNvcmQgYW5kIHBsYXliYWNrCkBAIC01NSw2ICs1MSw3IEBACiAgICAgICAgIENGR19FVkVOVF9TRVRfUEFSQU1FVEVSLAogICAgICAgICBDRkdfRVZFTlRfQ1JFQVRFX0FVRElPX1BBVENILAogICAgICAgICBDRkdfRVZFTlRfUkVMRUFTRV9BVURJT19QQVRDSCwKKyAgICAgICAgQ0ZHX0VWRU5UX1VQREFURV9PVVRfREVWSUNFLAogICAgIH07CiAKICAgICBjbGFzcyBDb25maWdFdmVudERhdGE6IHB1YmxpYyBSZWZCYXNlIHsKQEAgLTEwNiw4ICsxMDMsOSBAQAogCiAgICAgY2xhc3MgSW9Db25maWdFdmVudERhdGEgOiBwdWJsaWMgQ29uZmlnRXZlbnREYXRhIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIElvQ29uZmlnRXZlbnREYXRhKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkKSA6Ci0gICAgICAgICAgICBtRXZlbnQoZXZlbnQpLCBtUGlkKHBpZCkge30KKyAgICAgICAgSW9Db25maWdFdmVudERhdGEoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA6CisgICAgICAgICAgICBtRXZlbnQoZXZlbnQpLCBtUGlkKHBpZCksIG1Qb3J0SWQocG9ydElkKSB7fQogCiAgICAgICAgIHZpcnR1YWwgIHZvaWQgZHVtcChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7CiAgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJJTyBldmVudDogZXZlbnQgJWRcbiIsIG1FdmVudCk7CkBAIC0xMTUsMTMgKzExMywxNCBAQAogCiAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBtRXZlbnQ7CiAgICAgICAgIGNvbnN0IHBpZF90ICAgICAgICAgICAgICAgICBtUGlkOworICAgICAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90ICAgbVBvcnRJZDsKICAgICB9OwogCiAgICAgY2xhc3MgSW9Db25maWdFdmVudCA6IHB1YmxpYyBDb25maWdFdmVudCB7CiAgICAgcHVibGljOgotICAgICAgICBJb0NvbmZpZ0V2ZW50KGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkKSA6CisgICAgICAgIElvQ29uZmlnRXZlbnQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQsIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA6CiAgICAgICAgICAgICBDb25maWdFdmVudChDRkdfRVZFTlRfSU8pIHsKLSAgICAgICAgICAgIG1EYXRhID0gbmV3IElvQ29uZmlnRXZlbnREYXRhKGV2ZW50LCBwaWQpOworICAgICAgICAgICAgbURhdGEgPSBuZXcgSW9Db25maWdFdmVudERhdGEoZXZlbnQsIHBpZCwgcG9ydElkKTsKICAgICAgICAgfQogICAgICAgICB2aXJ0dWFsIH5Jb0NvbmZpZ0V2ZW50KCkge30KICAgICB9OwpAQCAtMjIwLDYgKzIxOSwyOCBAQAogICAgICAgICB2aXJ0dWFsIH5SZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KCkge30KICAgICB9OwogCisgICAgY2xhc3MgVXBkYXRlT3V0RGV2aWNlc0NvbmZpZ0V2ZW50RGF0YSA6IHB1YmxpYyBDb25maWdFdmVudERhdGEgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgVXBkYXRlT3V0RGV2aWNlc0NvbmZpZ0V2ZW50RGF0YShjb25zdCBEZXZpY2VEZXNjcmlwdG9yQmFzZVZlY3RvciYgb3V0RGV2aWNlcykgOgorICAgICAgICAgICAgbU91dERldmljZXMob3V0RGV2aWNlcykge30KKworICAgICAgICB2aXJ0dWFsIHZvaWQgZHVtcChjaGFyICpidWZmZXIsIHNpemVfdCBzaXplKSB7CisgICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemUsICJEZXZpY2VzOiAlcyIsIGFuZHJvaWQ6OnRvU3RyaW5nKG1PdXREZXZpY2VzKS5jX3N0cigpKTsKKyAgICAgICAgfQorCisgICAgICAgIERldmljZURlc2NyaXB0b3JCYXNlVmVjdG9yIG1PdXREZXZpY2VzOworICAgIH07CisKKyAgICBjbGFzcyBVcGRhdGVPdXREZXZpY2VzQ29uZmlnRXZlbnQgOiBwdWJsaWMgQ29uZmlnRXZlbnQgeworICAgIHB1YmxpYzoKKyAgICAgICAgZXhwbGljaXQgVXBkYXRlT3V0RGV2aWNlc0NvbmZpZ0V2ZW50KGNvbnN0IERldmljZURlc2NyaXB0b3JCYXNlVmVjdG9yJiBvdXREZXZpY2VzKSA6CisgICAgICAgICAgICBDb25maWdFdmVudChDRkdfRVZFTlRfVVBEQVRFX09VVF9ERVZJQ0UpIHsKKyAgICAgICAgICAgIG1EYXRhID0gbmV3IFVwZGF0ZU91dERldmljZXNDb25maWdFdmVudERhdGEob3V0RGV2aWNlcyk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIH5VcGRhdGVPdXREZXZpY2VzQ29uZmlnRXZlbnQoKTsKKyAgICB9OworCiAgICAgY2xhc3MgUE1EZWF0aFJlY2lwaWVudCA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CiAgICAgcHVibGljOgogICAgICAgICBleHBsaWNpdCAgICBQTURlYXRoUmVjaXBpZW50KGNvbnN0IHdwPFRocmVhZEJhc2U+JiB0aHJlYWQpIDogbVRocmVhZCh0aHJlYWQpIHt9CkBAIC0yNTAsNiArMjcxLDggQEAKICAgICAgICAgICAgICAgICAvLyBDYWxsZWQgYnkgQXVkaW9GbGluZ2VyOjpmcmFtZUNvdW50KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCkgYW5kIGVmZmVjdHMsCiAgICAgICAgICAgICAgICAgLy8gYW5kIHJldHVybnMgdGhlIFtub3JtYWwgbWl4XSBidWZmZXIncyBmcmFtZSBjb3VudC4KICAgICB2aXJ0dWFsICAgICBzaXplX3QgICAgICBmcmFtZUNvdW50KCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGxhdGVuY3lfbCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRWb2x1bWVGb3JPdXRwdXRfbChmbG9hdCBsZWZ0IF9fdW51c2VkLCBmbG9hdCByaWdodCBfX3VudXNlZCkgY29uc3Qge30KIAogICAgICAgICAgICAgICAgIC8vIFJldHVybidzIHRoZSBIQUwncyBmcmFtZSBjb3VudCBpLmUuIGZhc3QgbWl4ZXIgYnVmZmVyIHNpemUuCiAgICAgICAgICAgICAgICAgc2l6ZV90ICAgICAgZnJhbWVDb3VudEhBTCgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZUNvdW50OyB9CkBAIC0yNjMsMzIgKzI4Niw0OSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpID0gMDsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBzZXRQYXJhbWV0ZXJzKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpcnMpOwogICAgIHZpcnR1YWwgICAgIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cykgPSAwOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCA9IDApID0gMDsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgPSAwOwogICAgICAgICAgICAgICAgIC8vIHNlbmRDb25maWdFdmVudF9sKCkgbXVzdCBiZSBjYWxsZWQgd2l0aCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiAgICAgICAgICAgICAgICAgLy8gQ2FuIHRlbXBvcmFyaWx5IHJlbGVhc2UgdGhlIGxvY2sgaWYgd2FpdGluZyBmb3IgYSByZXBseSBmcm9tCiAgICAgICAgICAgICAgICAgLy8gcHJvY2Vzc0NvbmZpZ0V2ZW50c19sKCkuCiAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZENvbmZpZ0V2ZW50X2woc3A8Q29uZmlnRXZlbnQ+JiBldmVudCk7Ci0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZElvQ29uZmlnRXZlbnQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwKTsKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZW5kSW9Db25maWdFdmVudF9sKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZElvQ29uZmlnRXZlbnQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZElvQ29uZmlnRXZlbnRfbChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZFByaW9Db25maWdFdmVudChwaWRfdCBwaWQsIHBpZF90IHRpZCwgaW50MzJfdCBwcmlvLCBib29sIGZvckFwcCk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2VuZFByaW9Db25maWdFdmVudF9sKHBpZF90IHBpZCwgcGlkX3QgdGlkLCBpbnQzMl90IHByaW8sIGJvb2wgZm9yQXBwKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZW5kU2V0UGFyYW1ldGVyQ29uZmlnRXZlbnRfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIpOwogICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbmRDcmVhdGVBdWRpb1BhdGNoQ29uZmlnRXZlbnQoY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwogICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNlbmRSZWxlYXNlQXVkaW9QYXRjaENvbmZpZ0V2ZW50KGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZFVwZGF0ZU91dERldmljZUNvbmZpZ0V2ZW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlRGVzY3JpcHRvckJhc2VWZWN0b3ImIG91dERldmljZXMpOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHByb2Nlc3NDb25maWdFdmVudHNfbCgpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGNhY2hlUGFyYW1ldGVyc19sKCkgPSAwOwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKSA9IDA7CiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgcmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpID0gMDsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBnZXRBdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpID0gMDsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB1cGRhdGVPdXREZXZpY2VzKGNvbnN0IERldmljZURlc2NyaXB0b3JCYXNlVmVjdG9yJiBvdXREZXZpY2VzKTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgPSAwOwogCiAKICAgICAgICAgICAgICAgICAvLyBzZWUgbm90ZSBhdCBkZWNsYXJhdGlvbiBvZiBtU3RhbmRieSwgbU91dERldmljZSBhbmQgbUluRGV2aWNlCiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgc3RhbmRieSgpIGNvbnN0IHsgcmV0dXJuIG1TdGFuZGJ5OyB9Ci0gICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1PdXREZXZpY2U7IH0KLSAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UoKSBjb25zdCB7IHJldHVybiBtSW5EZXZpY2U7IH0KLSAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gaXNPdXRwdXQoKSA/IG1PdXREZXZpY2UgOiBtSW5EZXZpY2U7IH0KKyAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VUeXBlU2V0IG91dERldmljZVR5cGVzKCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZ2V0QXVkaW9EZXZpY2VUeXBlcyhtT3V0RGV2aWNlVHlwZUFkZHJzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1JbkRldmljZVR5cGVBZGRyLm1UeXBlOyB9CisgICAgICAgICAgICAgICAgRGV2aWNlVHlwZVNldCBnZXREZXZpY2VUeXBlcygpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGlzT3V0cHV0KCkgPyBvdXREZXZpY2VUeXBlcygpIDogRGV2aWNlVHlwZVNldCh7aW5EZXZpY2VUeXBlKCl9KTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yJiBvdXREZXZpY2VUeXBlQWRkcnMoKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtT3V0RGV2aWNlVHlwZUFkZHJzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyJiBpbkRldmljZVR5cGVBZGRyKCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUluRGV2aWNlVHlwZUFkZHI7CisgICAgICAgICAgICAgICAgfQogCiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaXNPdXRwdXQoKSBjb25zdCA9IDA7CiAKQEAgLTMxOCw2ICszNTgsNyBAQAogICAgICAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBnZXRFZmZlY3RDaGFpbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKICAgICAgICAgICAgICAgICAvLyBzYW1lIGFzIGdldEVmZmVjdENoYWluKCkgYnV0IG11c3QgYmUgY2FsbGVkIHdpdGggVGhyZWFkQmFzZSBtdXRleCBsb2NrZWQKICAgICAgICAgICAgICAgICBzcDxFZmZlY3RDaGFpbj4gZ2V0RWZmZWN0Q2hhaW5fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSBjb25zdDsKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IGdldEVmZmVjdElkc19sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgIC8vIGFkZCBhbiBlZmZlY3QgY2hhaW4gdG8gdGhlIGNoYWluIGxpc3QgKG1FZmZlY3RDaGFpbnMpCiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgYWRkRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKSA9IDA7CiAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGFuIGVmZmVjdCBjaGFpbiBmcm9tIHRoZSBjaGFpbiBsaXN0IChtRWZmZWN0Q2hhaW5zKQpAQCAtMzM3LDcgKzM3OCw4IEBACiAgICAgICAgICAgICAgICAgc3A8QXVkaW9GbGluZ2VyOjpFZmZlY3RNb2R1bGU+IGdldEVmZmVjdChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCBpbnQgZWZmZWN0SWQpOwogICAgICAgICAgICAgICAgIHNwPEF1ZGlvRmxpbmdlcjo6RWZmZWN0TW9kdWxlPiBnZXRFZmZlY3RfbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLCBpbnQgZWZmZWN0SWQpOwogICAgICAgICAgICAgICAgIC8vIGFkZCBhbmQgZWZmZWN0IG1vZHVsZS4gQWxzbyBjcmVhdGVzIHRoZSBlZmZlY3QgY2hhaW4gaXMgbm9uZSBleGlzdHMgZm9yCi0gICAgICAgICAgICAgICAgLy8gdGhlIGVmZmVjdHMgYXVkaW8gc2Vzc2lvbgorICAgICAgICAgICAgICAgIC8vIHRoZSBlZmZlY3RzIGF1ZGlvIHNlc3Npb24uIE9ubHkgY2FsbGVkIGluIGEgY29udGV4dCBvZiBtb3ZpbmcgYW4gZWZmZWN0CisgICAgICAgICAgICAgICAgLy8gZnJvbSBvbmUgdGhyZWFkIHRvIGFub3RoZXIKICAgICAgICAgICAgICAgICBzdGF0dXNfdCBhZGRFZmZlY3RfbChjb25zdCBzcDwgRWZmZWN0TW9kdWxlPiYgZWZmZWN0KTsKICAgICAgICAgICAgICAgICAvLyByZW1vdmUgYW5kIGVmZmVjdCBtb2R1bGUuIEFsc28gcmVtb3ZlcyB0aGUgZWZmZWN0IGNoYWluIGlzIHRoaXMgd2FzIHRoZSBsYXN0CiAgICAgICAgICAgICAgICAgLy8gZWZmZWN0CkBAIC0zNTYsNiArMzk4LDI3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBoYXNBdWRpb1Nlc3Npb25fbChzZXNzaW9uSWQpOwogICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgICAgICAgICAgICAgIHVpbnQzMl90IGhhc0F1ZGlvU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIGNvbnN0IFQmIHRyYWNrcykgY29uc3QgeworICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCByZXN1bHQgPSAwOworICAgICAgICAgICAgICAgICAgICBpZiAoZ2V0RWZmZWN0Q2hhaW5fbChzZXNzaW9uSWQpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IEVGRkVDVF9TRVNTSU9OOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdHJhY2tzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxUcmFja0Jhc2U+JiB0cmFjayA9IHRyYWNrc1tpXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXNzaW9uSWQgPT0gdHJhY2stPnNlc3Npb25JZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmICF0cmFjay0+aXNJbnZhbGlkKCkgICAgICAgLy8gbm90IHlldCByZW1vdmVkIGZyb20gdHJhY2tzLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmJiAhdHJhY2stPmlzVGVybWluYXRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9IFRSQUNLX1NFU1NJT047CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRyYWNrLT5pc0Zhc3RUcmFjaygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSBGQVNUX1NFU1NJT047ICAvLyBjYXV0aW9uLCBvbmx5IHJlcHJlc2VudHMgZmlyc3QgdHJhY2suCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgICAgICAgICAgICAgfQorCiAgICAgICAgICAgICAgICAgLy8gdGhlIHZhbHVlIHJldHVybmVkIGJ5IGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgbm90IGltcG9ydGFudCBhcyB0aGUKICAgICAgICAgICAgICAgICAvLyBzdHJhdGVneSBpcyBvbmx5IG1lYW5pbmdmdWwgZm9yIFBsYXliYWNrVGhyZWFkIHdoaWNoIGltcGxlbWVudHMgdGhpcyBtZXRob2QKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgX191bnVzZWQpCkBAIC0zNjMsMTQgKzQyNiw5IEBACiAKICAgICAgICAgICAgICAgICAvLyBjaGVjayBpZiBzb21lIGVmZmVjdHMgbXVzdCBiZSBzdXNwZW5kZWQvcmVzdG9yZWQgd2hlbiBhbiBlZmZlY3QgaXMgZW5hYmxlZAogICAgICAgICAgICAgICAgIC8vIG9yIGRpc2FibGVkCi0gICAgICAgICAgICAgICAgdm9pZCBjaGVja1N1c3BlbmRPbkVmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0TW9kdWxlPiYgZWZmZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYKTsKLSAgICAgICAgICAgICAgICB2b2lkIGNoZWNrU3VzcGVuZE9uRWZmZWN0RW5hYmxlZF9sKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpOworICAgICAgICAgICAgICAgIHZvaWQgY2hlY2tTdXNwZW5kT25FZmZlY3RFbmFibGVkKGJvb2wgZW5hYmxlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdGhyZWFkTG9ja2VkKTsKIAogICAgICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0U3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KSA9IDA7CiAgICAgICAgICAgICAgICAgdmlydHVhbCBib29sICAgICAgICBpc1ZhbGlkU3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KSBjb25zdCA9IDA7CkBAIC0zOTMsOCArNDUxLDIwIEBACiAKICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGJyb2FkY2FzdF9sKCk7CiAKKyAgICAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICBpc01zZERldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Jc01zZERldmljZTsgfQorCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgICAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisKKyAgICAgICAgICAgICAgICAvLyBkZWxpdmVyIHN0YXRzIHRvIG1lZGlhbWV0cmljcy4KKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICAgICAgICAgIHNlbmRTdGF0aXN0aWNzKGJvb2wgZm9yY2UpOworCiAgICAgbXV0YWJsZSAgICAgTXV0ZXggICAgICAgICAgICAgICAgICAgbUxvY2s7CiAKKyAgICAgICAgICAgICAgICB2b2lkIG9uRWZmZWN0RW5hYmxlKGNvbnN0IHNwPEVmZmVjdE1vZHVsZT4mIGVmZmVjdCk7CisgICAgICAgICAgICAgICAgdm9pZCBvbkVmZmVjdERpc2FibGUoKTsKKwogcHJvdGVjdGVkOgogCiAgICAgICAgICAgICAgICAgLy8gZW50cnkgZGVzY3JpYmluZyBhbiBlZmZlY3QgYmVpbmcgc3VzcGVuZGVkIGluIG1TdXNwZW5kZWRTZXNzaW9ucyBrZXllZCB2ZWN0b3IKQEAgLTQzNCw2ICs1MDQsMTcgQEAKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRNYXN0ZXJNb25vX2woYm9vbCBtb25vIF9fdW51c2VkKSB7IH0KICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICByZXF1aXJlTW9ub0JsZW5kKCkgeyByZXR1cm4gZmFsc2U7IH0KIAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlZCB3aXRoaW4gdGhlIHRocmVhZExvb3AgdG8gb2J0YWluIHRpbWVzdGFtcCBmcm9tIHRoZSBIQUwuCisgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgdGhyZWFkbG9vcF9nZXRIYWxUaW1lc3RhbXBfbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuZGVkVGltZXN0YW1wICp0aW1lc3RhbXAgX191bnVzZWQpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHNfbChpbnQgZmQgX191bnVzZWQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MgX191bnVzZWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyB9CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZHVtcFRyYWNrc19sKGludCBmZCBfX3VudXNlZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkgeyB9CisKKwogICAgIGZyaWVuZCBjbGFzcyBBdWRpb0ZsaW5nZXI7ICAgICAgLy8gZm9yIG1FZmZlY3RDaGFpbnMKIAogICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVfdCAgICAgICAgICAgIG1UeXBlOwpAQCAtNDU3LDIyICs1MzgsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSEFMIGZvcm1hdCBpZiBGYXN0bWl4ZXIgaXMgdXNlZC4KICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAgICAgICAgICBtSEFMRm9ybWF0OwogICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgIG1CdWZmZXJTaXplOyAgICAgICAvLyBIQUwgYnVmZmVyIHNpemUgZm9yIHJlYWQoKSBvciB3cml0ZSgpCi0KKyAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyVmVjdG9yIG1PdXREZXZpY2VUeXBlQWRkcnM7IC8vIG91dHB1dCBkZXZpY2UgdHlwZXMgYW5kIGFkZHJlc3NlcworICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgICAgICAgbUluRGV2aWNlVHlwZUFkZHI7ICAgLy8gaW5wdXQgZGV2aWNlIHR5cGUgYW5kIGFkZHJlc3MKICAgICAgICAgICAgICAgICBWZWN0b3I8IHNwPENvbmZpZ0V2ZW50PiA+ICAgICBtQ29uZmlnRXZlbnRzOwogICAgICAgICAgICAgICAgIFZlY3Rvcjwgc3A8Q29uZmlnRXZlbnQ+ID4gICAgIG1QZW5kaW5nQ29uZmlnRXZlbnRzOyAvLyBldmVudHMgYXdhaXRpbmcgc3lzdGVtIHJlYWR5CiAKICAgICAgICAgICAgICAgICAvLyBUaGVzZSBmaWVsZHMgYXJlIHdyaXR0ZW4gYW5kIHJlYWQgYnkgdGhyZWFkIGl0c2VsZiB3aXRob3V0IGxvY2sgb3IgYmFycmllciwKLSAgICAgICAgICAgICAgICAvLyBhbmQgcmVhZCBieSBvdGhlciB0aHJlYWRzIHdpdGhvdXQgbG9jayBvciBiYXJyaWVyIHZpYSBzdGFuZGJ5KCksIG91dERldmljZSgpCi0gICAgICAgICAgICAgICAgLy8gYW5kIGluRGV2aWNlKCkuCisgICAgICAgICAgICAgICAgLy8gYW5kIHJlYWQgYnkgb3RoZXIgdGhyZWFkcyB3aXRob3V0IGxvY2sgb3IgYmFycmllciB2aWEgc3RhbmRieSgpLCBvdXREZXZpY2VUeXBlcygpCisgICAgICAgICAgICAgICAgLy8gYW5kIGluRGV2aWNlVHlwZSgpLgogICAgICAgICAgICAgICAgIC8vIEJlY2F1c2Ugb2YgdGhlIGFic2VuY2Ugb2YgYSBsb2NrIG9yIGJhcnJpZXIsIGFueSBvdGhlciB0aHJlYWQgdGhhdCByZWFkcwogICAgICAgICAgICAgICAgIC8vIHRoZXNlIGZpZWxkcyBtdXN0IHVzZSB0aGUgaW5mb3JtYXRpb24gaW4gaXNvbGF0aW9uLCBvciBiZSBwcmVwYXJlZCB0byBkZWFsCiAgICAgICAgICAgICAgICAgLy8gd2l0aCBwb3NzaWJpbGl0eSB0aGF0IGl0IG1pZ2h0IGJlIGluY29uc2lzdGVudCB3aXRoIG90aGVyIGluZm9ybWF0aW9uLgogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1TdGFuZGJ5OyAgICAgLy8gV2hldGhlciB0aHJlYWQgaXMgY3VycmVudGx5IGluIHN0YW5kYnkuCi0gICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgbU91dERldmljZTsgICAvLyBvdXRwdXQgZGV2aWNlCi0gICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgbUluRGV2aWNlOyAgICAvLyBpbnB1dCBkZXZpY2UKLSAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICBtUHJldk91dERldmljZTsgICAvLyBwcmV2aW91cyBvdXRwdXQgZGV2aWNlCi0gICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgbVByZXZJbkRldmljZTsgICAgLy8gcHJldmlvdXMgaW5wdXQgZGV2aWNlCisKICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggICAgICBtUGF0Y2g7CisKICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCAgICAgICAgICBtQXVkaW9Tb3VyY2U7CiAKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBtSWQ7CkBAIC00OTMsMTAgKzU3MywzMiBAQAogICAgICAgICAgICAgICAgIHNwPE5CTG9nOjpXcml0ZXI+ICAgICAgIG1OQkxvZ1dyaXRlcjsKICAgICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICBtU3lzdGVtUmVhZHk7CiAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgICAgICAgbVRpbWVzdGFtcDsKKyAgICAgICAgICAgICAgICBUaW1lc3RhbXBWZXJpZmllcjwgLy8gRm9yIHRpbWVzdGFtcCBzdGF0aXN0aWNzLgorICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAvKiBmcmFtZSBjb3VudCAqLywgaW50NjRfdCAvKiB0aW1lIG5zICovPiBtVGltZXN0YW1wVmVyaWZpZXI7CisgICAgICAgICAgICAgICAgLy8gVGltZXN0YW1wIGNvcnJlY3RlZCBkZXZpY2Ugc2hvdWxkIGJlIGEgc2luZ2xlIGRldmljZS4KKyAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgICAgICAgICBtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisKKyAgICAgICAgICAgICAgICAvLyBUaHJlYWRMb29wIHN0YXRpc3RpY3MgcGVyIGl0ZXJhdGlvbi4KKyAgICAgICAgICAgICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICBtTGFzdElvQmVnaW5OcyA9IC0xOworICAgICAgICAgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1MYXN0SW9FbmROcyA9IC0xOworCisgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgcmVhZCB1bmRlciBUaHJlYWRCYXNlIGxvY2sgKGlmIG5vdCBvbiB0aGUgdGhyZWFkTG9vcCB0aHJlYWQpLgorICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbUlvSml0dGVyTXN7MC45OTUgLyogYWxwaGEgKi99OworICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbVByb2Nlc3NUaW1lTXN7MC45OTUgLyogYWxwaGEgKi99OworICAgICAgICAgICAgICAgIGF1ZGlvX3V0aWxzOjpTdGF0aXN0aWNzPGRvdWJsZT4gbUxhdGVuY3lNc3swLjk5NSAvKiBhbHBoYSAqL307CisKKyAgICAgICAgICAgICAgICAvLyBTYXZlIHRoZSBsYXN0IGNvdW50IHdoZW4gd2UgZGVsaXZlcmVkIHN0YXRpc3RpY3MgdG8gbWVkaWFtZXRyaWNzLgorICAgICAgICAgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1MYXN0UmVjb3JkZWRUaW1lc3RhbXBWZXJpZmllck4gPSAwOworICAgICAgICAgICAgICAgIGludDY0X3QgICAgICAgICAgICAgICAgIG1MYXN0UmVjb3JkZWRUaW1lTnMgPSAwOyAgLy8gQk9PVFRJTUUgdG8gaW5jbHVkZSBzdXNwZW5kLgorCisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbUlzTXNkRGV2aWNlID0gZmFsc2U7CiAgICAgICAgICAgICAgICAgLy8gQSBjb25kaXRpb24gdGhhdCBtdXN0IGJlIGV2YWx1YXRlZCBieSB0aGUgdGhyZWFkIGxvb3AgaGFzIGNoYW5nZWQgYW5kCiAgICAgICAgICAgICAgICAgLy8gd2UgbXVzdCBub3Qgd2FpdCBmb3IgYXN5bmMgd3JpdGUgY2FsbGJhY2sgaW4gdGhlIHRocmVhZCBsb29wIGJlZm9yZSBldmFsdWF0aW5nIGl0CiAgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgbVNpZ25hbFBlbmRpbmc7CiAKKyNpZmRlZiBURUVfU0lOSworICAgICAgICAgICAgICAgIE5CQUlPX1RlZSAgICAgICAgICAgICAgIG1UZWU7CisjZW5kaWYKICAgICAgICAgICAgICAgICAvLyBBY3RpdmVUcmFja3MgaXMgYSBzb3J0ZWQgdmVjdG9yIG9mIHRyYWNrIHR5cGUgVCByZXByZXNlbnRpbmcgdGhlCiAgICAgICAgICAgICAgICAgLy8gYWN0aXZlIHRyYWNrcyBvZiB0aHJlYWRMb29wKCkgdG8gYmUgY29uc2lkZXJlZCBieSB0aGUgbG9ja2VkIHByZXBhcmUgcG9ydGlvbi4KICAgICAgICAgICAgICAgICAvLyBBY3RpdmVUcmFja3Mgc2hvdWxkIGJlIGFjY2Vzc2VkIHdpdGggdGhlIFRocmVhZEJhc2UgbG9jayBoZWxkLgpAQCAtNTQzLDYgKzY0NSw5IEBACiAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAgICAgICAgICBzaXplKCkgY29uc3QgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVUcmFja3Muc2l6ZSgpOwogICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJvb2wgICAgICAgICAgICBpc0VtcHR5KCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1BY3RpdmVUcmFja3MuaXNFbXB0eSgpOworICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIHNzaXplX3QgICAgICAgICBpbmRleE9mKGNvbnN0IHNwPFQ+JiBpdGVtKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUFjdGl2ZVRyYWNrcy5pbmRleE9mKGl0ZW0pOwogICAgICAgICAgICAgICAgICAgICB9CkBAIC01OTMsNiArNjk4LDEwIEBACiAgICAgICAgICAgICAgICAgfTsKIAogICAgICAgICAgICAgICAgIFNpbXBsZUxvZyBtTG9jYWxMb2c7CisKK3ByaXZhdGU6CisgICAgICAgICAgICAgICAgdm9pZCBkdW1wQmFzZV9sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CisgICAgICAgICAgICAgICAgdm9pZCBkdW1wRWZmZWN0Q2hhaW5zX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIH07CiAKIGNsYXNzIFZvbHVtZUludGVyZmFjZSB7CkBAIC02NDIsMTEgKzc1MSw5IEBACiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga01heE5leHRCdWZmZXJEZWxheU5zID0gMTAwMDAwMDAwOwogCiAgICAgUGxheWJhY2tUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCB0eXBlX3QgdHlwZSwgYm9vbCBzeXN0ZW1SZWFkeSk7CisgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIHR5cGVfdCB0eXBlLCBib29sIHN5c3RlbVJlYWR5KTsKICAgICB2aXJ0dWFsICAgICAgICAgICAgIH5QbGF5YmFja1RocmVhZCgpOwogCi0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCiAgICAgLy8gVGhyZWFkIHZpcnR1YWxzCiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwogCkBAIC02NzIsNiArNzc5LDcgQEAKICAgICAgICAgICAgICAgICAvLyBpcyBzYWZlIHRvIGRvIHNvLiBUaGF0IHdpbGwgZHJvcCB0aGUgZmluYWwgcmVmIGNvdW50IGFuZCBkZXN0cm95IHRoZSB0cmFja3MuCiAgICAgdmlydHVhbCAgICAgbWl4ZXJfc3RhdGUgcHJlcGFyZVRyYWNrc19sKFZlY3Rvcjwgc3A8VHJhY2s+ID4gKnRyYWNrc1RvUmVtb3ZlKSA9IDA7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVtb3ZlVHJhY2tzX2woY29uc3QgVmVjdG9yPCBzcDxUcmFjaz4gPiYgdHJhY2tzVG9SZW1vdmUpOworICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGhhbmRsZVZvaXBWb2x1bWVfbChmbG9hdCAqdm9sdW1lKTsKIAogICAgIC8vIFN0cmVhbU91dEhhbEludGVyZmFjZUNhbGxiYWNrIGltcGxlbWVudGF0aW9uCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgb25Xcml0ZVJlYWR5KCk7CkBAIC02OTYsNiArODA0LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFjdGl2ZVRyYWNrcy51cGRhdGVQb3dlclN0YXRlKHRoaXMsIHRydWUgLyogZm9yY2UgKi8pOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KIAorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBUcmFja3NfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOworCiBwdWJsaWM6CiAKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBpbml0Q2hlY2soKSBjb25zdCB7IHJldHVybiAobU91dHB1dCA9PSBOVUxMKSA/IE5PX0lOSVQgOiBOT19FUlJPUjsgfQpAQCAtNzAzLDE2ICs4MTQsMTcgQEAKICAgICAgICAgICAgICAgICAvLyByZXR1cm4gZXN0aW1hdGVkIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzLCBhcyByZXBvcnRlZCBieSBIQUwKICAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBsYXRlbmN5KCkgY29uc3Q7CiAgICAgICAgICAgICAgICAgLy8gc2FtZSwgYnV0IGxvY2sgbXVzdCBhbHJlYWR5IGJlIGhlbGQKLSAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBsYXRlbmN5X2woKSBjb25zdDsKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAgICBsYXRlbmN5X2woKSBjb25zdCBvdmVycmlkZTsKIAogICAgICAgICAgICAgICAgIC8vIFZvbHVtZUludGVyZmFjZQogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldE1hc3RlclZvbHVtZShmbG9hdCB2YWx1ZSk7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBzZXRNYXN0ZXJNdXRlKGJvb2wgbXV0ZWQpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZmxvYXQgdmFsdWUpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHNldFN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgbXV0ZWQpOwogICAgIHZpcnR1YWwgICAgIGZsb2F0ICAgICAgIHN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Q7CiAKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzZXRWb2x1bWVGb3JPdXRwdXRfbChmbG9hdCBsZWZ0LCBmbG9hdCByaWdodCkgY29uc3Q7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0Vm9sdW1lRm9yT3V0cHV0X2woZmxvYXQgbGVmdCwgZmxvYXQgcmlnaHQpIGNvbnN0IG92ZXJyaWRlOwogCiAgICAgICAgICAgICAgICAgc3A8VHJhY2s+ICAgY3JlYXRlVHJhY2tfbCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpDbGllbnQ+JiBjbGllbnQsCkBAIC03MjgsNiArODQwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBjcmVhdG9yUGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCB0aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgKnN0YXR1cyAvKm5vbi1OVUxMKi8sCkBAIC03NTEsNyArODY0LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gYW5kcm9pZF9hdG9taWNfYWNxdWlyZV9sb2FkKCZtU3VzcGVuZGVkKSA+IDA7IH0KIAogICAgIHZpcnR1YWwgICAgIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCk7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRSZW5kZXJQb3NpdGlvbih1aW50MzJfdCAqaGFsRnJhbWVzLCB1aW50MzJfdCAqZHNwRnJhbWVzKTsKICAgICAgICAgICAgICAgICAvLyBDb25zaWRlciBhbHNvIHJlbW92aW5nIGFuZCBwYXNzaW5nIGFuIGV4cGxpY2l0IG1NYWluQnVmZmVyIGluaXRpYWxpemF0aW9uCiAgICAgICAgICAgICAgICAgLy8gcGFyYW1ldGVyIHRvIEFGOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OlRyYWNrKCkuCkBAIC03NjYsNyArODgwLDkgQEAKIAogICAgICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKICAgICAgICAgICAgICAgICB2aXJ0dWFsIHNpemVfdCByZW1vdmVFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pOwotICAgICAgICAgICAgICAgIHZpcnR1YWwgdWludDMyX3QgaGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3Q7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoYXNBdWRpb1Nlc3Npb25fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRocmVhZEJhc2U6Omhhc0F1ZGlvU2Vzc2lvbl9sKHNlc3Npb25JZCwgbVRyYWNrcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclNlc3Npb25fbChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKTsKIAogCkBAIC03ODQsNyArOTAwLDcgQEAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBhZGRQYXRjaFRyYWNrKGNvbnN0IHNwPFBhdGNoVHJhY2s+JiB0cmFjayk7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZGVsZXRlUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFRyYWNrPiYgdHJhY2spOwogCi0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZ2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKICAgICAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIGFzeW5jaHJvbm91cyBzaWduYWwgd2FpdCB0aW1lLgogICAgIHZpcnR1YWwgICAgIGludDY0X3QgICAgIGNvbXB1dGVXYWl0VGltZU5zX2woKSBjb25zdCB7IHJldHVybiBJTlQ2NF9NQVg7IH0KQEAgLTgwMSw2ICs5MTcsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYmIG1UcmFja3Muc2l6ZSgpIDwgUGxheWJhY2tUaHJlYWQ6OmtNYXhUcmFja3M7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogCisgICAgICAgICAgICAgICAgYm9vbCAgICAgICAgaXNUaW1lc3RhbXBDb3JyZWN0aW9uRW5hYmxlZCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKG1UaW1lc3RhbXBDb3JyZWN0ZWREZXZpY2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgb3V0RGV2aWNlVHlwZXMoKS5jb3VudChtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlKSAhPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogcHJvdGVjdGVkOgogICAgIC8vIHVwZGF0ZWQgYnkgcmVhZE91dHB1dFBhcmFtZXRlcnNfbCgpCiAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICAgICAgICBtTm9ybWFsRnJhbWVDb3VudDsgIC8vIG5vcm1hbCBtaXhlciBhbmQgZWZmZWN0cwpAQCAtODgwLDYgKzEwMDEsMTEgQEAKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1CeXRlc1dyaXR0ZW47CiAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzV3JpdHRlbjsgLy8gbm90IHJlc2V0IG9uIHN0YW5kYnkKICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgIG1TdXNwZW5kZWRGcmFtZXM7IC8vIG5vdCByZXNldCBvbiBzdGFuZGJ5CisKKyAgICAvLyBtSGFwdGljQ2hhbm5lbE1hc2sgYW5kIG1IYXB0aWNDaGFubmVsQ291bnQgd2lsbCBvbmx5IGJlIHZhbGlkIHdoZW4gdGhlIHRocmVhZCBzdXBwb3J0CisgICAgLy8gaGFwdGljIHBsYXliYWNrLgorICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICAgICAgICAgICAgbUhhcHRpY0NoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgICAgICAgICAgbUhhcHRpY0NoYW5uZWxDb3VudCA9IDA7CiBwcml2YXRlOgogICAgIC8vIG1NYXN0ZXJNdXRlIGlzIGluIGJvdGggUGxheWJhY2tUaHJlYWQgYW5kIGluIEF1ZGlvRmxpbmdlci4gIFdoZW4gYQogICAgIC8vIFBsYXliYWNrVGhyZWFkIG5lZWRzIHRvIGZpbmQgb3V0IGlmIG1hc3Rlci1tdXRlZCwgaXQgY2hlY2tzIGl0J3MgbG9jYWwKQEAgLTkzMiwxOSArMTA1OCwxOSBAQAogICAgIHZvaWQgICAgICAgIHVwZGF0ZU1ldGFkYXRhX2woKSBmaW5hbDsKICAgICB2aXJ0dWFsIHZvaWQgc2VuZE1ldGFkYXRhVG9CYWNrZW5kX2woY29uc3QgU3RyZWFtT3V0SGFsSW50ZXJmYWNlOjpTb3VyY2VNZXRhZGF0YSYgbWV0YWRhdGEpOwogCi0gICAgdmlydHVhbCB2b2lkIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLSAgICB2b2lkICAgICAgICBkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KLSAgICAvLyBUaGUgVHJhY2tzIGNsYXNzIG1hbmFnZXMgbmFtZXMgZm9yIGFsbCB0cmFja3MKLSAgICAvLyBhZGRlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBUaHJlYWQuCisgICAgLy8gVGhlIFRyYWNrcyBjbGFzcyBtYW5hZ2VzIHRyYWNrcyBhZGRlZCBhbmQgcmVtb3ZlZCBmcm9tIHRoZSBUaHJlYWQuCiAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgICAgY2xhc3MgVHJhY2tzIHsKICAgICBwdWJsaWM6Ci0gICAgICAgIFRyYWNrcyhib29sIHNhdmVEZWxldGVkVHJhY2tOYW1lcykgOgotICAgICAgICAgICAgbVNhdmVEZWxldGVkVHJhY2tOYW1lcyhzYXZlRGVsZXRlZFRyYWNrTmFtZXMpIHsgfQorICAgICAgICBUcmFja3MoYm9vbCBzYXZlRGVsZXRlZFRyYWNrSWRzKSA6CisgICAgICAgICAgICBtU2F2ZURlbGV0ZWRUcmFja0lkcyhzYXZlRGVsZXRlZFRyYWNrSWRzKSB7IH0KIAogICAgICAgICAvLyBTb3J0ZWRWZWN0b3IgbWV0aG9kcwotICAgICAgICBzc2l6ZV90ICAgICAgICAgYWRkKGNvbnN0IHNwPFQ+ICZ0cmFjayk7CisgICAgICAgIHNzaXplX3QgICAgICAgICBhZGQoY29uc3Qgc3A8VD4gJnRyYWNrKSB7CisgICAgICAgICAgICBjb25zdCBzc2l6ZV90IGluZGV4ID0gbVRyYWNrcy5hZGQodHJhY2spOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpbmRleCA8IDAsICJjYW5ub3QgYWRkIHRyYWNrIik7CisgICAgICAgICAgICByZXR1cm4gaW5kZXg7CisgICAgICAgIH0KICAgICAgICAgc3NpemVfdCAgICAgICAgIHJlbW92ZShjb25zdCBzcDxUPiAmdHJhY2spOwogICAgICAgICBzaXplX3QgICAgICAgICAgc2l6ZSgpIGNvbnN0IHsKICAgICAgICAgICAgIHJldHVybiBtVHJhY2tzLnNpemUoKTsKQEAgLTk2NSwyOCArMTA5MSwxOSBAQAogICAgICAgICAgICAgcmV0dXJuIG1UcmFja3MuZW5kKCk7CiAgICAgICAgIH0KIAotICAgICAgICBzaXplX3QgICAgICAgICAgcHJvY2Vzc0RlbGV0ZWRUcmFja05hbWVzKHN0ZDo6ZnVuY3Rpb248dm9pZChpbnQpPiBmKSB7Ci0gICAgICAgICAgICBjb25zdCBzaXplX3Qgc2l6ZSA9IG1EZWxldGVkVHJhY2tOYW1lcy5zaXplKCk7Ci0gICAgICAgICAgICBpZiAoc2l6ZSA+IDApIHsKLSAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGludCBuYW1lIDogbURlbGV0ZWRUcmFja05hbWVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIGYobmFtZSk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICBzaXplX3QgICAgICAgICAgcHJvY2Vzc0RlbGV0ZWRUcmFja0lkcyhzdGQ6OmZ1bmN0aW9uPHZvaWQoaW50KT4gZikgeworICAgICAgICAgICAgZm9yIChjb25zdCBpbnQgdHJhY2tJZCA6IG1EZWxldGVkVHJhY2tJZHMpIHsKKyAgICAgICAgICAgICAgICBmKHRyYWNrSWQpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHNpemU7CisgICAgICAgICAgICByZXR1cm4gbURlbGV0ZWRUcmFja0lkcy5zaXplKCk7CiAgICAgICAgIH0KIAotICAgICAgICB2b2lkICAgICAgICAgICAgY2xlYXJEZWxldGVkVHJhY2tOYW1lcygpIHsgbURlbGV0ZWRUcmFja05hbWVzLmNsZWFyKCk7IH0KKyAgICAgICAgdm9pZCAgICAgICAgICAgIGNsZWFyRGVsZXRlZFRyYWNrSWRzKCkgeyBtRGVsZXRlZFRyYWNrSWRzLmNsZWFyKCk7IH0KIAogICAgIHByaXZhdGU6Ci0gICAgICAgIC8vIFRyYWNrIG5hbWVzIHBlbmRpbmcgZGVsZXRpb24gZm9yIE1JWEVSIHR5cGUgdGhyZWFkcwotICAgICAgICBjb25zdCBib29sIG1TYXZlRGVsZXRlZFRyYWNrTmFtZXM7IC8vIHRydWUgdG8gZW5hYmxlIHRyYWNraW5nCi0gICAgICAgIHN0ZDo6c2V0PGludD4gbURlbGV0ZWRUcmFja05hbWVzOwotCi0gICAgICAgIC8vIEZhc3QgbG9va3VwIG9mIHByZXZpb3VzbHkgZGVsZXRlZCB0cmFjayBuYW1lcyBmb3IgcmV1c2UuCi0gICAgICAgIC8vIFRoaXMgaXMgYW4gYXJiaXRyYXJ5IGRlY2lzaW9uIChhY3R1YWxseSBhbnkgbm9uLW5lZ2F0aXZlCi0gICAgICAgIC8vIGludGVnZXIgdGhhdCBpc24ndCBpbiBtVHJhY2tzWypdLT5uYW1lcygpIGNvdWxkIGJlIHVzZWQpIC0gd2UgYXR0ZW1wdAotICAgICAgICAvLyB0byB1c2UgdGhlIHNtYWxsZXN0IHBvc3NpYmxlIGF2YWlsYWJsZSBuYW1lLgotICAgICAgICBzdGQ6OnNldDxpbnQ+IG1VbnVzZWRUcmFja05hbWVzOworICAgICAgICAvLyBUcmFja3MgcGVuZGluZyBkZWxldGlvbiBmb3IgTUlYRVIgdHlwZSB0aHJlYWRzCisgICAgICAgIGNvbnN0IGJvb2wgbVNhdmVEZWxldGVkVHJhY2tJZHM7IC8vIHRydWUgdG8gZW5hYmxlIHRyYWNraW5nCisgICAgICAgIHN0ZDo6c2V0PGludD4gbURlbGV0ZWRUcmFja0lkczsKIAogICAgICAgICBTb3J0ZWRWZWN0b3I8c3A8VD4+IG1UcmFja3M7IC8vIHdyYXBwZWQgU29ydGVkVmVjdG9yLgogICAgIH07CkBAIC05OTcsNyArMTExNCw4IEBACiAgICAgQXVkaW9TdHJlYW1PdXQgICAgICAgICAgICAgICAgICAqbU91dHB1dDsKIAogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hc3RlclZvbHVtZTsKLSAgICBuc2Vjc190ICAgICAgICAgICAgICAgICAgICAgICAgIG1MYXN0V3JpdGVUaW1lOworICAgIHN0ZDo6YXRvbWljPGZsb2F0PiAgICAgICAgICAgICAgbU1hc3RlckJhbGFuY2V7fTsKKyAgICBhdWRpb191dGlsczo6QmFsYW5jZSAgICAgICAgICAgIG1CYWxhbmNlOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU51bVdyaXRlczsKICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OdW1EZWxheWVkV3JpdGVzOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUluV3JpdGU7CkBAIC0xMDU2LDE2ICsxMTc0LDEzIEBACiAgICAgc3A8TkJBSU9fU2luaz4gICAgICAgICAgbVBpcGVTaW5rOwogICAgIC8vIFRoZSBjdXJyZW50IHNpbmsgZm9yIHRoZSBub3JtYWwgbWl4ZXIgdG8gd3JpdGUgaXQncyAoc3ViKW1peCwgbU91dHB1dFNpbmsgb3IgbVBpcGVTaW5rCiAgICAgc3A8TkJBSU9fU2luaz4gICAgICAgICAgbU5vcm1hbFNpbms7Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAvLyBGb3IgZHVtcHN5cwotICAgIHNwPE5CQUlPX1Npbms+ICAgICAgICAgIG1UZWVTaW5rOwotICAgIHNwPE5CQUlPX1NvdXJjZT4gICAgICAgIG1UZWVTb3VyY2U7Ci0jZW5kaWYKICAgICB1aW50MzJfdCAgICAgICAgICAgICAgICBtU2NyZWVuU3RhdGU7ICAgLy8gY2FjaGVkIGNvcHkgb2YgZ1NjcmVlblN0YXRlCiAgICAgLy8gVE9ETzogYWRkIGNvbW1lbnQgYW5kIGFkanVzdCBzaXplIGFzIG5lZWRlZAogICAgIHN0YXRpYyBjb25zdCBzaXplX3QgICAgIGtGYXN0TWl4ZXJMb2dTaXplID0gOCAqIDEwMjQ7CiAgICAgc3A8TkJMb2c6OldyaXRlcj4gICAgICAgbUZhc3RNaXhlck5CTG9nV3JpdGVyOwogCisgICAgLy8gRG93bnN0cmVhbSBwYXRjaCBsYXRlbmN5LCBhdmFpbGFibGUgaWYgbURvd25zdHJlYW1MYXRlbmN5U3RhdE1zLmdldE4oKSA+IDAuCisgICAgYXVkaW9fdXRpbHM6OlN0YXRpc3RpY3M8ZG91YmxlPiBtRG93bnN0cmVhbUxhdGVuY3lTdGF0TXN7MC45OTl9OwogCiBwdWJsaWM6CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaGFzRmFzdE1peGVyKCkgY29uc3QgPSAwOwpAQCAtMTA4OCw3ICsxMjAzLDYgQEAKICAgICBNaXhlclRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCiAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwKLSAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgIGJvb2wgc3lzdGVtUmVhZHksCiAgICAgICAgICAgICAgICAgdHlwZV90IHR5cGUgPSBNSVhFUik7CiAgICAgdmlydHVhbCAgICAgICAgICAgICB+TWl4ZXJUaHJlYWQoKTsKQEAgLTEwOTcsNyArMTIxMSw2IEBACiAKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBjaGVja0Zvck5ld1BhcmFtZXRlcl9sKGNvbnN0IFN0cmluZzgmIGtleVZhbHVlUGFpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKIAogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGlzVHJhY2tBbGxvd2VkX2woCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LApAQCAtMTExNiwxMiArMTIyOSwxMyBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFsc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CisKICAgICAvLyB0aHJlYWRMb29wIHNuaXBwZXRzCiAgICAgdmlydHVhbCAgICAgc3NpemVfdCAgICAgdGhyZWFkTG9vcF93cml0ZSgpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRocmVhZExvb3Bfc3RhbmRieSgpOwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIHRocmVhZExvb3BfbWl4KCk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdGhyZWFkTG9vcF9zbGVlcFRpbWUoKTsKLSAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0aHJlYWRMb29wX3JlbW92ZVRyYWNrcyhjb25zdCBWZWN0b3I8IHNwPFRyYWNrPiA+JiB0cmFja3NUb1JlbW92ZSk7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgY29ycmVjdExhdGVuY3lfbCh1aW50MzJfdCBsYXRlbmN5KSBjb25zdDsKIAogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLApAQCAtMTE1NCw2ICsxMjY4LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbUZhc3RNaXhlckR1bXBTdGF0ZS5tVHJhY2tzW2Zhc3RJbmRleF0ubVVuZGVycnVuczsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB0aHJlYWRsb29wX2dldEhhbFRpbWVzdGFtcF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgKnRpbWVzdGFtcCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobU5vcm1hbFNpbmsuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1Ob3JtYWxTaW5rLT5nZXRUaW1lc3RhbXAoKnRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgc2V0TWFzdGVyTW9ub19sKGJvb2wgbW9ubykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJNb25vLnN0b3JlKG1vbm8pOwpAQCAtMTE2NSwyNyArMTI4Nyw0MyBAQAogICAgICAgICAgICAgICAgIC8vIEJsZW5kaW5nIHdpdGggbGltaXRlciBpcyBub3QgaWRlbXBvdGVudCwKICAgICAgICAgICAgICAgICAvLyBhbmQgYmxlbmRpbmcgd2l0aG91dCBsaW1pdGVyIGlzIGlkZW1wb3RlbnQgYnV0IGluZWZmaWNpZW50IHRvIGRvIHR3aWNlLgogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgcmVxdWlyZU1vbm9CbGVuZCgpIHsgcmV0dXJuIG1NYXN0ZXJNb25vLmxvYWQoKSAmJiAhaGFzRmFzdE1peGVyKCk7IH0KKworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU1hc3RlckJhbGFuY2Uuc3RvcmUoYmFsYW5jZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhc0Zhc3RNaXhlcigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GYXN0TWl4ZXItPnNldE1hc3RlckJhbGFuY2UoYmFsYW5jZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogfTsKIAogY2xhc3MgRGlyZWN0T3V0cHV0VGhyZWFkIDogcHVibGljIFBsYXliYWNrVGhyZWFkIHsKIHB1YmxpYzoKIAogICAgIERpcmVjdE91dHB1dFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIEF1ZGlvU3RyZWFtT3V0KiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIGJvb2wgc3lzdGVtUmVhZHkpCisgICAgICAgIDogRGlyZWN0T3V0cHV0VGhyZWFkKGF1ZGlvRmxpbmdlciwgb3V0cHV0LCBpZCwgRElSRUNULCBzeXN0ZW1SZWFkeSkgeyB9CisKICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+RGlyZWN0T3V0cHV0VGhyZWFkKCk7CiAKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICBzZWxlY3RQcmVzZW50YXRpb24oaW50IHByZXNlbnRhdGlvbklkLCBpbnQgcHJvZ3JhbUlkKTsKKwogICAgIC8vIFRocmVhZCB2aXJ0dWFscwogCiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgY2hlY2tGb3JOZXdQYXJhbWV0ZXJfbChjb25zdCBTdHJpbmc4JiBrZXlWYWx1ZVBhaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKTsKKwogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGZsdXNoSHdfbCgpOwogCisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0TWFzdGVyQmFsYW5jZShmbG9hdCBiYWxhbmNlKSBvdmVycmlkZTsKKwogcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgICAgIHVpbnQzMl90ICAgIGFjdGl2ZVNsZWVwVGltZVVzKCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgaWRsZVNsZWVwVGltZVVzKCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgc3VzcGVuZFNsZWVwVGltZVVzKCkgY29uc3Q7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgY2FjaGVQYXJhbWV0ZXJzX2woKTsKIAorICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOworCiAgICAgLy8gdGhyZWFkTG9vcCBzbmlwcGV0cwogICAgIHZpcnR1YWwgICAgIG1peGVyX3N0YXRlIHByZXBhcmVUcmFja3NfbChWZWN0b3I8IHNwPFRyYWNrPiA+ICp0cmFja3NUb1JlbW92ZSk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgdGhyZWFkTG9vcF9taXgoKTsKQEAgLTExOTUsMTEgKzEzMzMsMTAgQEAKIAogICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIG9uQWRkTmV3VHJhY2tfbCgpOwogCi0gICAgYm9vbCBtVm9sdW1lU2hhcGVyQWN0aXZlOworICAgIGJvb2wgbVZvbHVtZVNoYXBlckFjdGl2ZSA9IGZhbHNlOwogCiAgICAgRGlyZWN0T3V0cHV0VGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgQXVkaW9TdHJlYW1PdXQqIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCB1aW50MzJfdCBkZXZpY2UsIFRocmVhZEJhc2U6OnR5cGVfdCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzeXN0ZW1SZWFkeSk7CisgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlkLCBUaHJlYWRCYXNlOjp0eXBlX3QgdHlwZSwgYm9vbCBzeXN0ZW1SZWFkeSk7CiAgICAgdm9pZCBwcm9jZXNzVm9sdW1lX2woVHJhY2sgKnRyYWNrLCBib29sIGxhc3RUcmFjayk7CiAKICAgICAvLyBwcmVwYXJlVHJhY2tzX2woKSB0ZWxscyB0aHJlYWRMb29wX21peCgpIHRoZSBuYW1lIG9mIHRoZSBzaW5nbGUgYWN0aXZlIHRyYWNrCkBAIC0xMjA3LDE3ICsxMzQ0LDM4IEBACiAKICAgICB3cDxUcmFjaz4gICAgICAgICAgICAgICBtUHJldmlvdXNUcmFjazsgICAgICAgICAvLyB1c2VkIHRvIGRldGVjdCB0cmFjayBzd2l0Y2gKIAorICAgIC8vIFRoaXMgbXVzdCBiZSBpbml0aWFsaXplZCBmb3IgaW5pdGlhbCBjb25kaXRpb24gb2YgbU1hc3RlckJhbGFuY2UgPSAwIChkaXNhYmxlZCkuCisgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgbU1hc3RlckJhbGFuY2VMZWZ0ID0gMS5mOworICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgIG1NYXN0ZXJCYWxhbmNlUmlnaHQgPSAxLmY7CisKIHB1YmxpYzoKICAgICB2aXJ0dWFsICAgICBib29sICAgICAgICBoYXNGYXN0TWl4ZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogCiAgICAgdmlydHVhbCAgICAgaW50NjRfdCAgICAgY29tcHV0ZVdhaXRUaW1lTnNfbCgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgICAgdGhyZWFkbG9vcF9nZXRIYWxUaW1lc3RhbXBfbChFeHRlbmRlZFRpbWVzdGFtcCAqdGltZXN0YW1wKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZvciBESVJFQ1QgYW5kIE9GRkxPQUQgdGhyZWFkcywgcXVlcnkgdGhlIG91dHB1dCBzaW5rIGRpcmVjdGx5LgorICAgICAgICAgICAgICAgICAgICBpZiAobU91dHB1dCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB1cG9zaXRpb242NDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyB0aW1lOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1PdXRwdXQtPmdldFByZXNlbnRhdGlvblBvc2l0aW9uKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXBvc2l0aW9uNjQsICZ0aW1lKSA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+bVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IChpbnQ2NF90KXVwb3NpdGlvbjY0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcC0+bVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSBhdWRpb191dGlsc19uc19mcm9tX3RpbWVzcGVjKCZ0aW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIH0KIH07CiAKIGNsYXNzIE9mZmxvYWRUaHJlYWQgOiBwdWJsaWMgRGlyZWN0T3V0cHV0VGhyZWFkIHsKIHB1YmxpYzoKIAogICAgIE9mZmxvYWRUaHJlYWQoY29uc3Qgc3A8QXVkaW9GbGluZ2VyPiYgYXVkaW9GbGluZ2VyLCBBdWRpb1N0cmVhbU91dCogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgaWQsIHVpbnQzMl90IGRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSk7CisgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwgYm9vbCBzeXN0ZW1SZWFkeSk7CiAgICAgdmlydHVhbCAgICAgICAgICAgICAgICAgfk9mZmxvYWRUaHJlYWQoKSB7fTsKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBmbHVzaEh3X2woKTsKIApAQCAtMTI4NCw4ICsxNDQyLDYgQEAKICAgICB2aXJ0dWFsICAgICAgICAgICAgICAgICB+RHVwbGljYXRpbmdUaHJlYWQoKTsKIAogICAgIC8vIFRocmVhZCB2aXJ0dWFscwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKLQogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGFkZE91dHB1dFRyYWNrKE1peGVyVGhyZWFkKiB0aHJlYWQpOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbW92ZU91dHB1dFRyYWNrKE1peGVyVGhyZWFkKiB0aHJlYWQpOwogICAgICAgICAgICAgICAgIHVpbnQzMl90ICAgIHdhaXRUaW1lTXMoKSBjb25zdCB7IHJldHVybiBtV2FpdFRpbWVNczsgfQpAQCAtMTI5NCw2ICsxNDUwLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmVhbU91dEhhbEludGVyZmFjZTo6U291cmNlTWV0YWRhdGEmIG1ldGFkYXRhKSBvdmVycmlkZTsKIHByb3RlY3RlZDoKICAgICB2aXJ0dWFsICAgICB1aW50MzJfdCAgICBhY3RpdmVTbGVlcFRpbWVVcygpIGNvbnN0OworICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHNfbChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIG92ZXJyaWRlOwogCiBwcml2YXRlOgogICAgICAgICAgICAgICAgIGJvb2wgICAgICAgIG91dHB1dHNSZWFkeShjb25zdCBTb3J0ZWRWZWN0b3I8IHNwPE91dHB1dFRyYWNrPiA+ICZvdXRwdXRUcmFja3MpOwpAQCAtMTMxOCw2ICsxNDc1LDIyIEBACiAgICAgU29ydGVkVmVjdG9yIDwgc3A8T3V0cHV0VHJhY2s+ID4gIG1PdXRwdXRUcmFja3M7CiBwdWJsaWM6CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaGFzRmFzdE1peGVyKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB0aHJlYWRsb29wX2dldEhhbFRpbWVzdGFtcF9sKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgKnRpbWVzdGFtcCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICBpZiAobU91dHB1dFRyYWNrcy5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAvLyBmb3J3YXJkIHRoZSBmaXJzdCBPdXRwdXRUcmFjaydzIGtlcm5lbCBpbmZvcm1hdGlvbiBmb3IgdGltZXN0YW1wLgorICAgICAgICAgICAgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgdHJhY2tUaW1lc3RhbXAgPQorICAgICAgICAgICAgICAgICAgICBtT3V0cHV0VHJhY2tzWzBdLT5nZXRDbGllbnRQcm94eVRpbWVzdGFtcCgpOworICAgICAgICAgICAgaWYgKHRyYWNrVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPiAwKSB7CisgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrVGltZXN0YW1wLm1UaW1lTnNbRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF07CisgICAgICAgICAgICAgICAgdGltZXN0YW1wLT5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tUaW1lc3RhbXAubVBvc2l0aW9uW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdOworICAgICAgICAgICAgICAgIHJldHVybiBPSzsgIC8vIGRpc2NhcmQgc2VydmVyIHRpbWVzdGFtcCAtIHRoYXQncyBpZ25vcmVkLgorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CiB9OwogCiAvLyByZWNvcmQgdGhyZWFkCkBAIC0xMzczLDEyICsxNTQ2LDcgQEAKICAgICAgICAgICAgIFJlY29yZFRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsCiAgICAgICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4gKmlucHV0LAogICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlLAogICAgICAgICAgICAgICAgICAgICBib29sIHN5c3RlbVJlYWR5Ci0jaWZkZWYgVEVFX1NJTksKLSAgICAgICAgICAgICAgICAgICAgLCBjb25zdCBzcDxOQkFJT19TaW5rPiYgdGVlU2luawotI2VuZGlmCiAgICAgICAgICAgICAgICAgICAgICk7CiAgICAgICAgICAgICB2aXJ0dWFsICAgICB+UmVjb3JkVGhyZWFkKCk7CiAKQEAgLTEzODYsOSArMTU1NCw2IEBACiAgICAgdm9pZCAgICAgICAgZGVzdHJveVRyYWNrX2woY29uc3Qgc3A8UmVjb3JkVHJhY2s+JiB0cmFjayk7CiAgICAgdm9pZCAgICAgICAgcmVtb3ZlVHJhY2tfbChjb25zdCBzcDxSZWNvcmRUcmFjaz4mIHRyYWNrKTsKIAotICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLSAgICB2b2lkICAgICAgICBkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KICAgICAvLyBUaHJlYWQgdmlydHVhbHMKICAgICB2aXJ0dWFsIGJvb2wgICAgICAgIHRocmVhZExvb3AoKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHByZUV4aXQoKTsKQEAgLTE0MTEsMTEgKzE1NzYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwRnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICpwTm90aWZpY2F0aW9uRnJhbWVDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgcGlkX3QgY3JlYXRvclBpZCwKICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgcGlkX3QgdGlkLAogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAqc3RhdHVzIC8qbm9uLU5VTEwqLywKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCAgICBzdGFydChSZWNvcmRUcmFjayogcmVjb3JkVHJhY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1N5c3RlbTo6c3luY19ldmVudF90IGV2ZW50LApAQCAtMTQyNSw3ICsxNTkyLDYgQEAKICAgICAgICAgICAgIC8vIHJldHVybiB0cnVlIGlmIHRoZSBjYWxsZXIgc2hvdWxkIHRoZW4gZG8gaXQncyBwYXJ0IG9mIHRoZSBzdG9wcGluZyBwcm9jZXNzCiAgICAgICAgICAgICBib29sICAgICAgICBzdG9wKFJlY29yZFRyYWNrKiByZWNvcmRUcmFjayk7CiAKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4qIGNsZWFySW5wdXQoKTsKICAgICAgICAgICAgIHZpcnR1YWwgc3A8U3RyZWFtSGFsSW50ZXJmYWNlPiBzdHJlYW0oKSBjb25zdDsKIApAQCAtMTQzNCwyMCArMTYwMCwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCYgc3RhdHVzKTsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGNhY2hlUGFyYW1ldGVyc19sKCkge30KICAgICB2aXJ0dWFsIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7Ci0gICAgdmlydHVhbCB2b2lkICAgICAgICBpb0NvbmZpZ0NoYW5nZWQoYXVkaW9faW9fY29uZmlnX2V2ZW50IGV2ZW50LCBwaWRfdCBwaWQgPSAwKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIGlvQ29uZmlnQ2hhbmdlZChhdWRpb19pb19jb25maWdfZXZlbnQgZXZlbnQsIHBpZF90IHBpZCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgcmVsZWFzZUF1ZGlvUGF0Y2hfbChjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgICAgICAgdm9pZCAgICAgICAgdXBkYXRlT3V0RGV2aWNlcyhjb25zdCBEZXZpY2VEZXNjcmlwdG9yQmFzZVZlY3RvciYgb3V0RGV2aWNlcykgb3ZlcnJpZGU7CiAKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGFkZFBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKTsKLSAgICAgICAgICAgIHZvaWQgICAgICAgIGRlbGV0ZVBhdGNoUmVjb3JkKGNvbnN0IHNwPFBhdGNoUmVjb3JkPiYgcmVjb3JkKTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIGFkZFBhdGNoVHJhY2soY29uc3Qgc3A8UGF0Y2hSZWNvcmQ+JiByZWNvcmQpOworICAgICAgICAgICAgdm9pZCAgICAgICAgZGVsZXRlUGF0Y2hUcmFjayhjb25zdCBzcDxQYXRjaFJlY29yZD4mIHJlY29yZCk7CiAKICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlYWRJbnB1dFBhcmFtZXRlcnNfbCgpOwogICAgIHZpcnR1YWwgdWludDMyX3QgICAgZ2V0SW5wdXRGcmFtZXNMb3N0KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGFkZEVmZmVjdENoYWluX2woY29uc3Qgc3A8RWZmZWN0Q2hhaW4+JiBjaGFpbik7CiAgICAgdmlydHVhbCBzaXplX3QgcmVtb3ZlRWZmZWN0Q2hhaW5fbChjb25zdCBzcDxFZmZlY3RDaGFpbj4mIGNoYWluKTsKLSAgICB2aXJ0dWFsIHVpbnQzMl90IGhhc0F1ZGlvU2Vzc2lvbl9sKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpIGNvbnN0OworICAgICAgICAgICAgdWludDMyX3QgaGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBUaHJlYWRCYXNlOjpoYXNBdWRpb1Nlc3Npb25fbChzZXNzaW9uSWQsIG1UcmFja3MpOworICAgICAgICAgICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBSZXR1cm4gdGhlIHNldCBvZiB1bmlxdWUgc2Vzc2lvbiBJRHMgYWNyb3NzIGFsbCB0cmFja3MuCiAgICAgICAgICAgICAvLyBUaGUga2V5cyBhcmUgdGhlIHNlc3Npb24gSURzLCBhbmQgdGhlIGFzc29jaWF0ZWQgdmFsdWVzIGFyZSBtZWFuaW5nbGVzcy4KQEAgLTE0NjEsNyArMTYzMSw3IEBACiAKICAgICB2aXJ0dWFsIHNpemVfdCAgICAgIGZyYW1lQ291bnQoKSBjb25zdCB7IHJldHVybiBtRnJhbWVDb3VudDsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaGFzRmFzdENhcHR1cmUoKSBjb25zdCB7IHJldHVybiBtRmFzdENhcHR1cmUgIT0gMDsgfQotICAgIHZpcnR1YWwgdm9pZCAgICAgICAgZ2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5X2woY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOwpAQCAtMTQ3OSw4ICsxNjQ5LDIzIEBACiAKICAgICAgICAgICAgIHN0YXR1c190ICAgIGdldEFjdGl2ZU1pY3JvcGhvbmVzKHN0ZDo6dmVjdG9yPG1lZGlhOjpNaWNyb3Bob25lSW5mbz4qIGFjdGl2ZU1pY3JvcGhvbmVzKTsKIAorICAgICAgICAgICAgc3RhdHVzX3QgICAgc2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihhdWRpb19taWNyb3Bob25lX2RpcmVjdGlvbl90IGRpcmVjdGlvbik7CisgICAgICAgICAgICBzdGF0dXNfdCAgICBzZXRQcmVmZXJyZWRNaWNyb3Bob25lRmllbGREaW1lbnNpb24oZmxvYXQgem9vbSk7CisKICAgICAgICAgICAgIHZvaWQgICAgICAgIHVwZGF0ZU1ldGFkYXRhX2woKSBvdmVycmlkZTsKIAorICAgICAgICAgICAgYm9vbCAgICAgICAgZmFzdFRyYWNrQXZhaWxhYmxlKCkgY29uc3QgeyByZXR1cm4gbUZhc3RUcmFja0F2YWlsOyB9CisKKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzVGltZXN0YW1wQ29ycmVjdGlvbkVuYWJsZWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2tzIHBvcGNvdW50IGZvciBleGFjdGx5IG9uZSBkZXZpY2UuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGF1ZGlvX2lzX2lucHV0X2RldmljZShtVGltZXN0YW1wQ29ycmVjdGVkRGV2aWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgaW5EZXZpY2VUeXBlKCkgPT0gbVRpbWVzdGFtcENvcnJlY3RlZERldmljZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworcHJvdGVjdGVkOgorICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFsc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CisgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wVHJhY2tzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKKwogcHJpdmF0ZToKICAgICAgICAgICAgIC8vIEVudGVyIHN0YW5kYnkgaWYgbm90IGFscmVhZHkgaW4gc3RhbmRieSwgYW5kIHNldCBtU3RhbmRieSBmbGFnCiAgICAgICAgICAgICB2b2lkICAgIHN0YW5kYnlJZk5vdEFscmVhZHlJblN0YW5kYnkoKTsKQEAgLTE0OTEsNiArMTY3Niw3IEBACiAgICAgICAgICAgICB2b2lkICAgIGNoZWNrQnROcmVjX2woKTsKIAogICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiAgICAgICAgICAgICAgICAgICAgICAgKm1JbnB1dDsKKyAgICAgICAgICAgIFNvdXJjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICptU291cmNlOwogICAgICAgICAgICAgU29ydGVkVmVjdG9yIDwgc3A8UmVjb3JkVHJhY2s+ID4gICAgbVRyYWNrczsKICAgICAgICAgICAgIC8vIG1BY3RpdmVUcmFja3MgaGFzIGR1YWwgcm9sZXM6ICBpdCBpbmRpY2F0ZXMgdGhlIGN1cnJlbnQgYWN0aXZlIHRyYWNrKHMpLCBhbmQKICAgICAgICAgICAgIC8vIGlzIHVzZWQgdG9nZXRoZXIgd2l0aCBtU3RhcnRTdG9wQ29uZCB0byBpbmRpY2F0ZSBzdGFydCgpL3N0b3AoKSBwcm9ncmVzcwpAQCAtMTUwOCw4ICsxNjk0LDYgQEAKICAgICAgICAgICAgIGludDMyX3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Sc21wSW5SZWFyOyAgICAvLyBsYXN0IGZpbGxlZCBmcmFtZSArIDEKIAogICAgICAgICAgICAgLy8gRm9yIGR1bXBzeXMKLSAgICAgICAgICAgIGNvbnN0IHNwPE5CQUlPX1Npbms+ICAgICAgICAgICAgICAgIG1UZWVTaW5rOwotCiAgICAgICAgICAgICBjb25zdCBzcDxNZW1vcnlEZWFsZXI+ICAgICAgICAgICAgICBtUmVhZE9ubHlIZWFwOwogCiAgICAgICAgICAgICAvLyBvbmUtdGltZSBpbml0aWFsaXphdGlvbiwgbm8gbG9ja3MgcmVxdWlyZWQKQEAgLTE1NTIsNiArMTczNiwxMCBAQAogICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUZhc3RUcmFja0F2YWlsOyAgICAvLyB0cnVlIGlmIGZhc3QgdHJhY2sgYXZhaWxhYmxlCiAgICAgICAgICAgICAvLyBjb21tb24gc3RhdGUgdG8gYWxsIHJlY29yZCB0aHJlYWRzCiAgICAgICAgICAgICBzdGQ6OmF0b21pY19ib29sICAgICAgICAgICAgICAgICAgICBtQnROcmVjU3VzcGVuZGVkOworCisgICAgICAgICAgICBpbnQ2NF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRnJhbWVzUmVhZCA9IDA7ICAgIC8vIGNvbnRpbnVvdXMgcnVubmluZyBjb3VudGVyLgorCisgICAgICAgICAgICBEZXZpY2VEZXNjcmlwdG9yQmFzZVZlY3RvciAgICAgICAgICBtT3V0RGV2aWNlczsKIH07CiAKIGNsYXNzIE1tYXBUaHJlYWQgOiBwdWJsaWMgVGhyZWFkQmFzZQpAQCAtMTU2MSw4ICsxNzQ5LDcgQEAKICNpbmNsdWRlICJNbWFwVHJhY2tzLmgiCiAKICAgICBNbWFwVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgYXVkaW9faW9faGFuZGxlX3QgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqaHdEZXYsIHNwPFN0cmVhbUhhbEludGVyZmFjZT4gc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBvdXREZXZpY2UsIGF1ZGlvX2RldmljZXNfdCBpbkRldmljZSwgYm9vbCBzeXN0ZW1SZWFkeSk7CisgICAgICAgICAgICAgICBBdWRpb0h3RGV2aWNlICpod0Rldiwgc3A8U3RyZWFtSGFsSW50ZXJmYWNlPiBzdHJlYW0sIGJvb2wgc3lzdGVtUmVhZHkpOwogICAgIHZpcnR1YWwgICAgIH5NbWFwVGhyZWFkKCk7CiAKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBjb25maWd1cmUoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLApAQCAtMTU5OCwxMyArMTc4NSwxNCBAQAogICAgIHZpcnR1YWwgICAgIGJvb2wgICAgICAgIGNoZWNrRm9yTmV3UGFyYW1ldGVyX2woY29uc3QgU3RyaW5nOCYga2V5VmFsdWVQYWlyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190JiBzdGF0dXMpOwogICAgIHZpcnR1YWwgICAgIFN0cmluZzggICAgIGdldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYga2V5cyk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCk7CisgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgaW9Db25maWdDaGFuZ2VkKGF1ZGlvX2lvX2NvbmZpZ19ldmVudCBldmVudCwgcGlkX3QgcGlkID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICByZWFkSGFsUGFyYW1ldGVyc19sKCk7CiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgY2FjaGVQYXJhbWV0ZXJzX2woKSB7fQogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hfbChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlKTsKICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICByZWxlYXNlQXVkaW9QYXRjaF9sKGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7Ci0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZ2V0QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CiAKICAgICB2aXJ0dWFsICAgICBzcDxTdHJlYW1IYWxJbnRlcmZhY2U+IHN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIG1IYWxTdHJlYW07IH0KICAgICB2aXJ0dWFsICAgICBzdGF0dXNfdCAgICBhZGRFZmZlY3RDaGFpbl9sKGNvbnN0IHNwPEVmZmVjdENoYWluPiYgY2hhaW4pOwpAQCAtMTYxMiw3ICsxODAwLDEwIEBACiAgICAgdmlydHVhbCAgICAgc3RhdHVzX3QgICAgY2hlY2tFZmZlY3RDb21wYXRpYmlsaXR5X2woY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQpOwogCi0gICAgdmlydHVhbCAgICAgdWludDMyX3QgICAgaGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3Q7CisgICAgICAgICAgICAgICAgdWludDMyX3QgICAgaGFzQXVkaW9TZXNzaW9uX2woYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlOiB1c2luZyBtQWN0aXZlVHJhY2tzIGFzIG5vIG1UcmFja3MgaGVyZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRocmVhZEJhc2U6Omhhc0F1ZGlvU2Vzc2lvbl9sKHNlc3Npb25JZCwgbUFjdGl2ZVRyYWNrcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIHNldFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCk7CiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaXNWYWxpZFN5bmNFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCkgY29uc3Q7CiAKQEAgLTE2MjcsMTUgKzE4MTgsMTcgQEAKICAgICAgICAgICAgICAgICAvLyBTZXRzIHRoZSBVSUQgcmVjb3JkcyBzaWxlbmNlCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgc2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkIF9fdW51c2VkLCBib29sIHNpbGVuY2VkIF9fdW51c2VkKSB7fQogCi0gICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGR1bXBJbnRlcm5hbHMoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKTsKLSAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wVHJhY2tzKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7Ci0KICBwcm90ZWN0ZWQ6CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFsc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CisgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHVtcFRyYWNrc19sKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgb3ZlcnJpZGU7CisKKyAgICAgICAgICAgICAgICAvKioKKyAgICAgICAgICAgICAgICAgKiBAYnJpZWYgbURldmljZUlkICBjdXJyZW50IGRldmljZSBwb3J0IHVuaXF1ZSBpZGVudGlmaWVyCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbURldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKIAogICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCAgICAgIG1BdHRyOwogICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCAgICAgICAgIG1TZXNzaW9uSWQ7Ci0gICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgbURldmljZUlkOwogICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgICAgIG1Qb3J0SWQ7CiAKICAgICAgICAgICAgICAgICB3cDxNbWFwU3RyZWFtQ2FsbGJhY2s+ICBtQ2FsbGJhY2s7CkBAIC0xNjU0LDggKzE4NDcsNyBAQAogCiBwdWJsaWM6CiAgICAgTW1hcFBsYXliYWNrVGhyZWFkKGNvbnN0IHNwPEF1ZGlvRmxpbmdlcj4mIGF1ZGlvRmxpbmdlciwgYXVkaW9faW9faGFuZGxlX3QgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqaHdEZXYsIEF1ZGlvU3RyZWFtT3V0ICpvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG91dERldmljZSwgYXVkaW9fZGV2aWNlc190IGluRGV2aWNlLCBib29sIHN5c3RlbVJlYWR5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Id0RldmljZSAqaHdEZXYsIEF1ZGlvU3RyZWFtT3V0ICpvdXRwdXQsIGJvb2wgc3lzdGVtUmVhZHkpOwogICAgIHZpcnR1YWwgICAgIH5NbWFwUGxheWJhY2tUaHJlYWQoKSB7fQogCiAgICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgY29uZmlndXJlKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKQEAgLTE2ODIsMTMgKzE4NzQsMTQgQEAKICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBjaGVja1NpbGVudE1vZGVfbCgpOwogICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHByb2Nlc3NWb2x1bWVfbCgpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCAgICAgdm9pZCAgICAgICAgZHVtcEludGVybmFscyhpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwotCiAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgaXNPdXRwdXQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CiAKICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVNZXRhZGF0YV9sKCkgb3ZlcnJpZGU7CiAKKyAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZyk7CisKIHByb3RlY3RlZDoKKyAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkdW1wSW50ZXJuYWxzX2woaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSBvdmVycmlkZTsKIAogICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgICAgICAgICBtU3RyZWFtVHlwZTsKICAgICAgICAgICAgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgICAgICAgbU1hc3RlclZvbHVtZTsKQEAgLTE3MDMsOCArMTg5Niw3IEBACiAKIHB1YmxpYzoKICAgICBNbWFwQ2FwdHVyZVRocmVhZChjb25zdCBzcDxBdWRpb0ZsaW5nZXI+JiBhdWRpb0ZsaW5nZXIsIGF1ZGlvX2lvX2hhbmRsZV90IGlkLAotICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmh3RGV2LCBBdWRpb1N0cmVhbUluICppbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3Qgb3V0RGV2aWNlLCBhdWRpb19kZXZpY2VzX3QgaW5EZXZpY2UsIGJvb2wgc3lzdGVtUmVhZHkpOworICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvSHdEZXZpY2UgKmh3RGV2LCBBdWRpb1N0cmVhbUluICppbnB1dCwgYm9vbCBzeXN0ZW1SZWFkeSk7CiAgICAgdmlydHVhbCAgICAgfk1tYXBDYXB0dXJlVGhyZWFkKCkge30KIAogICAgICAgICAgICAgICAgIEF1ZGlvU3RyZWFtSW4qIGNsZWFySW5wdXQoKTsKQEAgLTE3MTYsNiArMTkwOCw4IEBACiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgcHJvY2Vzc1ZvbHVtZV9sKCkgb3ZlcnJpZGU7CiAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgICAgc2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKSBvdmVycmlkZTsKIAorICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgICAgIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKwogcHJvdGVjdGVkOgogCiAgICAgICAgICAgICAgICAgQXVkaW9TdHJlYW1JbiogIG1JbnB1dDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja0Jhc2UuaAppbmRleCBjY2ZiNjlmLi41MmU3ZDU5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tCYXNlLmgKKysrIGIvc2VydmljZXMvYXVkaW9mbGluZ2VyL1RyYWNrQmFzZS5oCkBAIC0yNSwxMyArMjUsMTMgQEAKIHB1YmxpYzoKICAgICBlbnVtIHRyYWNrX3N0YXRlIHsKICAgICAgICAgSURMRSwKLSAgICAgICAgRkxVU0hFRCwKKyAgICAgICAgRkxVU0hFRCwgICAgICAgIC8vIGZvciBQbGF5YmFja1RyYWNrcyBvbmx5CiAgICAgICAgIFNUT1BQRUQsCiAgICAgICAgIC8vIG5leHQgMiBzdGF0ZXMgYXJlIGN1cnJlbnRseSB1c2VkIGZvciBmYXN0IHRyYWNrcwogICAgICAgICAvLyBhbmQgb2ZmbG9hZGVkIHRyYWNrcyBvbmx5CiAgICAgICAgIFNUT1BQSU5HXzEsICAgICAvLyB3YWl0aW5nIGZvciBmaXJzdCB1bmRlcnJ1bgogICAgICAgICBTVE9QUElOR18yLCAgICAgLy8gd2FpdGluZyBmb3IgcHJlc2VudGF0aW9uIGNvbXBsZXRlCi0gICAgICAgIFJFU1VNSU5HLAorICAgICAgICBSRVNVTUlORywgICAgICAgLy8gZm9yIFBsYXliYWNrVHJhY2tzIG9ubHkKICAgICAgICAgQUNUSVZFLAogICAgICAgICBQQVVTSU5HLAogICAgICAgICBQQVVTRUQsCkBAIC01NCwxMSArNTQsNiBAQAogICAgICAgICBUWVBFX1BBVENILAogICAgIH07CiAKLSAgICBlbnVtIHsKLSAgICAgICAgVFJBQ0tfTkFNRV9QRU5ESU5HID0gLTEsCi0gICAgICAgIFRSQUNLX05BTUVfRkFJTFVSRSA9IC0yLAotICAgIH07Ci0KICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrQmFzZShUaHJlYWRCYXNlICp0aHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPENsaWVudD4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBtQXR0ciwKQEAgLTY5LDYgKzY0LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgY3JlYXRvclBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT3V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY190eXBlIGFsbG9jID0gQUxMT0NfQ0JMSywKQEAgLTg0LDYgKzgwLDggQEAKICAgICAgICAgICAgIGF1ZGlvX3RyYWNrX2NibGtfdCogY2JsaygpIGNvbnN0IHsgcmV0dXJuIG1DYmxrOyB9CiAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkKCkgY29uc3QgeyByZXR1cm4gbVNlc3Npb25JZDsgfQogICAgICAgICAgICAgdWlkX3QgICAgICAgdWlkKCkgY29uc3QgeyByZXR1cm4gbVVpZDsgfQorICAgICAgICAgICAgcGlkX3QgICAgICAgY3JlYXRvclBpZCgpIGNvbnN0IHsgcmV0dXJuIG1DcmVhdG9yUGlkOyB9CisKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKCkgY29uc3QgeyByZXR1cm4gbVBvcnRJZDsgfQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgc2V0U3luY0V2ZW50KGNvbnN0IHNwPFN5bmNFdmVudD4mIGV2ZW50KTsKIApAQCAtOTEsNiArODksNyBAQAogICAgICAgICAgICAgdm9pZCogICAgICAgYnVmZmVyKCkgY29uc3QgeyByZXR1cm4gbUJ1ZmZlcjsgfQogICAgICAgICAgICAgc2l6ZV90ICAgICAgYnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1CdWZmZXJTaXplOyB9CiAgICAgdmlydHVhbCBib29sICAgICAgICBpc0Zhc3RUcmFjaygpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgICAgICAgIGlzRGlyZWN0KCkgY29uc3QgPSAwOwogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNPdXRwdXRUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX09VVFBVVCk7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzUGF0Y2hUcmFjaygpIGNvbnN0IHsgcmV0dXJuIChtVHlwZSA9PSBUWVBFX1BBVENIKTsgfQogICAgICAgICAgICAgYm9vbCAgICAgICAgaXNFeHRlcm5hbFRyYWNrKCkgY29uc3QgeyByZXR1cm4gIWlzT3V0cHV0VHJhY2soKSAmJiAhaXNQYXRjaFRyYWNrKCk7IH0KQEAgLTk4LDggKzk3LDExMSBAQAogICAgIHZpcnR1YWwgdm9pZCAgICAgICAgaW52YWxpZGF0ZSgpIHsgbUlzSW52YWxpZCA9IHRydWU7IH0KICAgICAgICAgICAgIGJvb2wgICAgICAgIGlzSW52YWxpZCgpIGNvbnN0IHsgcmV0dXJuIG1Jc0ludmFsaWQ7IH0KIAorICAgICAgICAgICAgdm9pZCAgICAgICAgdGVybWluYXRlKCkgeyBtVGVybWluYXRlZCA9IHRydWU7IH0KKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzVGVybWluYXRlZCgpIGNvbnN0IHsgcmV0dXJuIG1UZXJtaW5hdGVkOyB9CisKICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgIGF0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBtQXR0cjsgfQogCisjaWZkZWYgVEVFX1NJTksKKyAgICAgICAgICAgdm9pZCAgICAgICAgIGR1bXBUZWUoaW50IGZkLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVhc29uKSBjb25zdCB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1UZWUuZHVtcChmZCwgcmVhc29uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAvKiogcmV0dXJucyB0aGUgYnVmZmVyIGNvbnRlbnRzIHNpemUgY29udmVydGVkIHRvIHRpbWUgaW4gbWlsbGlzZWNvbmRzCisgICAgICAgICAgICAgKiBmb3IgUENNIFBsYXliYWNrIG9yIFJlY29yZCBzdHJlYW1pbmcgdHJhY2tzLiBUaGUgcmV0dXJuIHZhbHVlIGlzIHplcm8gZm9yCisgICAgICAgICAgICAgKiBQQ00gc3RhdGljIHRyYWNrcyBhbmQgbm90IGRlZmluZWQgZm9yIG5vbi1QQ00gdHJhY2tzLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRob3V0IHRoZSB0aHJlYWQgbG9jay4KKyAgICAgICAgICAgICAqLworICAgIHZpcnR1YWwgZG91YmxlICAgICAgYnVmZmVyTGF0ZW5jeU1zKCkgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtU2VydmVyUHJveHktPmZyYW1lc1JlYWR5U2FmZSgpICogMTAwMCAvIHNhbXBsZVJhdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyoqIHJldHVybnMgd2hldGhlciB0aGUgdHJhY2sgc3VwcG9ydHMgc2VydmVyIGxhdGVuY3kgY29tcHV0YXRpb24uCisgICAgICAgICAgICAgKiBUaGlzIGlzIHNldCBpbiB0aGUgY29uc3RydWN0b3IgYW5kIGNvbnN0YW50IHRocm91Z2hvdXQgdGhlIHRyYWNrIGxpZmV0aW1lLgorICAgICAgICAgICAgICovCisKKyAgICAgICAgICAgIGJvb2wgICAgICAgIGlzU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgpIGNvbnN0IHsgcmV0dXJuIG1TZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkOyB9CisKKyAgICAgICAgICAgIC8qKiBjb21wdXRlcyB0aGUgc2VydmVyIGxhdGVuY3kgZm9yIFBDTSBQbGF5YmFjayBvciBSZWNvcmQgdHJhY2sKKyAgICAgICAgICAgICAqIHRvIHRoZSBkZXZpY2Ugc2luay9zb3VyY2UuICBUaGlzIGlzIHRoZSB0aW1lIGZvciB0aGUgbmV4dCBmcmFtZSBpbiB0aGUgdHJhY2sgYnVmZmVyCisgICAgICAgICAgICAgKiB3cml0dGVuIG9yIHJlYWQgZnJvbSB0aGUgc2VydmVyIHRocmVhZCB0byB0aGUgZGV2aWNlIHNvdXJjZSBvciBzaW5rLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRob3V0IHRoZSB0aHJlYWQgbG9jaywgYnV0IGxhdGVuY3lNcyBhbmQgZnJvbVRyYWNrCisgICAgICAgICAgICAgKiBtYXkgYmUgbm90IGJlIHN5bmNocm9uaXplZC4gRm9yIGV4YW1wbGUgUGF0Y2hQYW5lbCBtYXkgbm90IG9idGFpbiB0aGUKKyAgICAgICAgICAgICAqIHRocmVhZCBsb2NrIGJlZm9yZSBjYWxsaW5nLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFxwYXJhbSBsYXRlbmN5TXMgb24gc3VjY2VzcyBpcyBzZXQgdG8gdGhlIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzIG9mIHRoZQorICAgICAgICAgICAgICogICAgICAgIG5leHQgZnJhbWUgd3JpdHRlbi9yZWFkIGJ5IHRoZSBzZXJ2ZXIgdGhyZWFkIHRvL2Zyb20gdGhlIHRyYWNrIGJ1ZmZlcgorICAgICAgICAgICAgICogICAgICAgIGZyb20gdGhlIGRldmljZSBzb3VyY2Uvc2luay4KKyAgICAgICAgICAgICAqIFxwYXJhbSBmcm9tVHJhY2sgb24gc3VjY2VzcyBpcyBzZXQgdG8gdHJ1ZSBpZiBsYXRlbmN5IHdhcyBjb21wdXRlZCBkaXJlY3RseQorICAgICAgICAgICAgICogICAgICAgIGZyb20gdGhlIHRyYWNrIHRpbWVzdGFtcDsgb3RoZXJ3aXNlIHNldCB0byBmYWxzZSBpZiBsYXRlbmN5IHdhcworICAgICAgICAgICAgICogICAgICAgIGVzdGltYXRlZCBmcm9tIHRoZSBzZXJ2ZXIgdGltZXN0YW1wLgorICAgICAgICAgICAgICogICAgICAgIGZyb21UcmFjayBtYXkgYmUgbnVsbHB0ciBvciBvbWl0dGVkIGlmIG5vdCByZXF1aXJlZC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBccmV0dXJucyBPSyBvciBJTlZBTElEX09QRVJBVElPTiBvbiBmYWlsdXJlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRTZXJ2ZXJMYXRlbmN5TXMoZG91YmxlICpsYXRlbmN5TXMsIGJvb2wgKmZyb21UcmFjayA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBubyB0aHJlYWQgbG9jayBpcyBhY3F1aXJlZCwgdGhlc2UgYXRvbWljcyBhcmUgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3luY2hyb25pemVkIHdpdGggZWFjaCBvdGhlciwgY29uc2lkZXJlZCBhIGJlbmlnbiByYWNlLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZG91YmxlIHNlcnZlckxhdGVuY3lNcyA9IG1TZXJ2ZXJMYXRlbmN5TXMubG9hZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzZXJ2ZXJMYXRlbmN5TXMgPT0gMC4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZnJvbVRyYWNrICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmZyb21UcmFjayA9IG1TZXJ2ZXJMYXRlbmN5RnJvbVRyYWNrLmxvYWQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKmxhdGVuY3lNcyA9IHNlcnZlckxhdGVuY3lNczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qKiBjb21wdXRlcyB0aGUgdG90YWwgY2xpZW50IGxhdGVuY3kgZm9yIFBDTSBQbGF5YmFjayBvciBSZWNvcmQgdHJhY2tzCisgICAgICAgICAgICAgKiBmb3IgdGhlIG5leHQgY2xpZW50IGFwcCBhY2Nlc3MgdG8gdGhlIGRldmljZSBzaW5rL3NvdXJjZTsgaS5lLiB0aGUKKyAgICAgICAgICAgICAqIHNlcnZlciBsYXRlbmN5IHBsdXMgdGhlIGJ1ZmZlciBsYXRlbmN5LgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFRoaXMgbWF5IGJlIGNhbGxlZCB3aXRob3V0IHRoZSB0aHJlYWQgbG9jaywgYnV0IGxhdGVuY3lNcyBhbmQgZnJvbVRyYWNrCisgICAgICAgICAgICAgKiBtYXkgYmUgbm90IGJlIHN5bmNocm9uaXplZC4gRm9yIGV4YW1wbGUgUGF0Y2hQYW5lbCBtYXkgbm90IG9idGFpbiB0aGUKKyAgICAgICAgICAgICAqIHRocmVhZCBsb2NrIGJlZm9yZSBjYWxsaW5nLgorICAgICAgICAgICAgICoKKyAgICAgICAgICAgICAqIFxwYXJhbSBsYXRlbmN5TXMgb24gc3VjY2VzcyBpcyBzZXQgdG8gdGhlIGxhdGVuY3kgaW4gbWlsbGlzZWNvbmRzIG9mIHRoZQorICAgICAgICAgICAgICogICAgICAgIG5leHQgZnJhbWUgd3JpdHRlbi9yZWFkIGJ5IHRoZSBjbGllbnQgYXBwIHRvL2Zyb20gdGhlIHRyYWNrIGJ1ZmZlcgorICAgICAgICAgICAgICogICAgICAgIGZyb20gdGhlIGRldmljZSBzaW5rL3NvdXJjZS4KKyAgICAgICAgICAgICAqIFxwYXJhbSBmcm9tVHJhY2sgb24gc3VjY2VzcyBpcyBzZXQgdG8gdHJ1ZSBpZiBsYXRlbmN5IHdhcyBjb21wdXRlZCBkaXJlY3RseQorICAgICAgICAgICAgICogICAgICAgIGZyb20gdGhlIHRyYWNrIHRpbWVzdGFtcDsgb3RoZXJ3aXNlIHNldCB0byBmYWxzZSBpZiBsYXRlbmN5IHdhcworICAgICAgICAgICAgICogICAgICAgIGVzdGltYXRlZCBmcm9tIHRoZSBzZXJ2ZXIgdGltZXN0YW1wLgorICAgICAgICAgICAgICogICAgICAgIGZyb21UcmFjayBtYXkgYmUgbnVsbHB0ciBvciBvbWl0dGVkIGlmIG5vdCByZXF1aXJlZC4KKyAgICAgICAgICAgICAqCisgICAgICAgICAgICAgKiBccmV0dXJucyBPSyBvciBJTlZBTElEX09QRVJBVElPTiBvbiBmYWlsdXJlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBzdGF0dXNfdCAgICBnZXRUcmFja0xhdGVuY3lNcyhkb3VibGUgKmxhdGVuY3lNcywgYm9vbCAqZnJvbVRyYWNrID0gbnVsbHB0cikgY29uc3QgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBzZXJ2ZXJMYXRlbmN5TXM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0U2VydmVyTGF0ZW5jeU1zKCZzZXJ2ZXJMYXRlbmN5TXMsIGZyb21UcmFjayk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBPSykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqbGF0ZW5jeU1zID0gc2VydmVyTGF0ZW5jeU1zICsgYnVmZmVyTGF0ZW5jeU1zKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgLy8gVE9ETzogQ29uc2lkZXIgbWFraW5nIHRoaXMgZXh0ZXJuYWwuCisgICAgICAgICAgIHN0cnVjdCBGcmFtZVRpbWUgeworICAgICAgICAgICAgICAgaW50NjRfdCBmcmFtZXM7CisgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVOczsKKyAgICAgICAgICAgfTsKKworICAgICAgICAgICAvLyBLZXJuZWxGcmFtZVRpbWUgaXMgdXBkYXRlZCBwZXIgIm1peCIgcGVyaW9kIGV2ZW4gZm9yIG5vbi1wY20gdHJhY2tzLgorICAgICAgICAgICB2b2lkICAgICAgICAgZ2V0S2VybmVsRnJhbWVUaW1lKEZyYW1lVGltZSAqZnQpIGNvbnN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICpmdCA9IG1LZXJuZWxGcmFtZVRpbWUubG9hZCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIG1Gb3JtYXQ7IH0KKyAgICAgICAgICAgaW50IGlkKCkgY29uc3QgeyByZXR1cm4gbUlkOyB9CisKIHByb3RlY3RlZDoKICAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oVHJhY2tCYXNlKTsKIApAQCAtMTExLDEwICsyMTMsMTAgQEAKICAgICAvLyBidXQgcHV0dGluZyBpdCBpbiBUcmFja0Jhc2UgYXZvaWRzIHRoZSBjb21wbGV4aXR5IG9mIHZpcnR1YWwgaW5oZXJpdGFuY2UKICAgICB2aXJ0dWFsIHNpemVfdCAgZnJhbWVzUmVhZHkoKSBjb25zdCB7IHJldHVybiBTSVpFX01BWDsgfQogCi0gICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUZvcm1hdDsgfQotCiAgICAgdWludDMyX3QgY2hhbm5lbENvdW50KCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxDb3VudDsgfQogCisgICAgc2l6ZV90IGZyYW1lU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIG1GcmFtZVNpemU7IH0KKwogICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUNoYW5uZWxNYXNrOyB9CiAKICAgICB2aXJ0dWFsIHVpbnQzMl90IHNhbXBsZVJhdGUoKSBjb25zdCB7IHJldHVybiBtU2FtcGxlUmF0ZTsgfQpAQCAtMTM0LDE0ICsyMzYsNiBAQAogICAgICAgICByZXR1cm4gbVN0YXRlID09IFNUT1BQSU5HXzI7CiAgICAgfQogCi0gICAgYm9vbCBpc1Rlcm1pbmF0ZWQoKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiBtVGVybWluYXRlZDsKLSAgICB9Ci0KLSAgICB2b2lkIHRlcm1pbmF0ZSgpIHsKLSAgICAgICAgbVRlcm1pbmF0ZWQgPSB0cnVlOwotICAgIH0KLQogICAgIC8vIFVwcGVyIGNhc2UgY2hhcmFjdGVycyBhcmUgZmluYWwgc3RhdGVzLgogICAgIC8vIExvd2VyIGNhc2UgY2hhcmFjdGVycyBhcmUgdHJhbnNpdG9yeS4KICAgICBjb25zdCBjaGFyICpnZXRUcmFja1N0YXRlU3RyaW5nKCkgY29uc3QgewpAQCAtMjA4LDEzICszMDIsMjEgQEAKICAgICBjb25zdCBib29sICAgICAgICAgIG1Jc091dDsKICAgICBzcDxTZXJ2ZXJQcm94eT4gICAgIG1TZXJ2ZXJQcm94eTsKICAgICBjb25zdCBpbnQgICAgICAgICAgIG1JZDsKLSAgICBzcDxOQkFJT19TaW5rPiAgICAgIG1UZWVTaW5rOwotICAgIHNwPE5CQUlPX1NvdXJjZT4gICAgbVRlZVNvdXJjZTsKKyNpZmRlZiBURUVfU0lOSworICAgIE5CQUlPX1RlZSAgICAgICAgICAgbVRlZTsKKyNlbmRpZgogICAgIGJvb2wgICAgICAgICAgICAgICAgbVRlcm1pbmF0ZWQ7CiAgICAgdHJhY2tfdHlwZSAgICAgICAgICBtVHlwZTsgICAgICAvLyBtdXN0IGJlIG9uZSBvZiBUWVBFX0RFRkFVTFQsIFRZUEVfT1VUUFVULCBUWVBFX1BBVENIIC4uLgogICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgbVRocmVhZElvSGFuZGxlOyAvLyBJL08gaGFuZGxlIG9mIHRoZSB0aHJlYWQgdGhlIHRyYWNrIGlzIGF0dGFjaGVkIHRvCiAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUG9ydElkOyAvLyB1bmlxdWUgSUQgZm9yIHRoaXMgdHJhY2sgdXNlZCBieSBhdWRpbyBwb2xpY3kKICAgICBib29sICAgICAgICAgICAgICAgIG1Jc0ludmFsaWQ7IC8vIG5vbi1yZXNldHRhYmxlIGxhdGNoLCBzZXQgYnkgaW52YWxpZGF0ZSgpCisKKyAgICBib29sICAgICAgICAgICAgICAgIG1TZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkID0gZmFsc2U7CisgICAgc3RkOjphdG9taWM8Ym9vbD4gICBtU2VydmVyTGF0ZW5jeUZyb21UcmFja3t9OyAvLyBsYXRlbmN5IGZyb20gdHJhY2sgb3Igc2VydmVyIHRpbWVzdGFtcC4KKyAgICBzdGQ6OmF0b21pYzxkb3VibGU+IG1TZXJ2ZXJMYXRlbmN5TXN7fTsgICAgICAgIC8vIGxhc3QgbGF0ZW5jeSBwdXNoZWQgZnJvbSBzZXJ2ZXIgdGhyZWFkLgorICAgIHN0ZDo6YXRvbWljPEZyYW1lVGltZT4gbUtlcm5lbEZyYW1lVGltZXt9OyAgICAgLy8gbGFzdCBmcmFtZSB0aW1lIG9uIGtlcm5lbCBzaWRlLgorICAgIGNvbnN0IHBpZF90ICAgICAgICAgbUNyZWF0b3JQaWQ7ICAvLyBjYW4gYmUgZGlmZmVyZW50IGZyb20gbWNsaWVudC0+cGlkKCkgZm9yIGluc3RhbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gY3JlYXRlZCBieSBOdVBsYXllciBvbiBiZWhhbGYgb2YgYSBjbGllbnQKIH07CiAKIC8vIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgUGF0Y2hUcmFjayBhbmQgUGF0Y2hSZWNvcmQuCkBAIC0yMjUsNyArMzI3LDM1IEBACiAKICAgICB2aXJ0dWFsIH5QYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIoKSB7fQogCisgICAgdmlydHVhbCBib29sICAgICAgICBwcm9kdWNlc0J1ZmZlck9uRGVtYW5kKCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgb2J0YWluQnVmZmVyKFByb3h5OjpCdWZmZXIqIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdGltZXNwZWMgKnJlcXVlc3RlZCA9IE5VTEwpID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgICAgICAgIHJlbGVhc2VCdWZmZXIoUHJveHk6OkJ1ZmZlciogYnVmZmVyKSA9IDA7CiB9OworCitjbGFzcyBQYXRjaFRyYWNrQmFzZSA6IHB1YmxpYyBQYXRjaFByb3h5QnVmZmVyUHJvdmlkZXIKK3sKK3B1YmxpYzoKKyAgICB1c2luZyBUaW1lb3V0ID0gc3RkOjpvcHRpb25hbDxzdGQ6OmNocm9ubzo6bmFub3NlY29uZHM+OworICAgICAgICAgICAgICAgICAgICAgICAgUGF0Y2hUcmFja0Jhc2Uoc3A8Q2xpZW50UHJveHk+IHByb3h5LCBjb25zdCBUaHJlYWRCYXNlJiB0aHJlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUaW1lb3V0JiB0aW1lb3V0KTsKKyAgICAgICAgICAgIHZvaWQgICAgICAgIHNldFBlZXJUaW1lb3V0KHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kcyB0aW1lb3V0KTsKKyAgICAgICAgICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgICAgICAgICAgdm9pZCAgICAgICAgc2V0UGVlclByb3h5KGNvbnN0IHNwPFQ+ICZwcm94eSwgYm9vbCBob2xkUmVmZXJlbmNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbVBlZXJSZWZlcmVuY2VIb2xkID0gaG9sZFJlZmVyZW5jZSA/IHByb3h5IDogbnVsbHB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGVlclByb3h5ID0gcHJveHkuZ2V0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2lkICAgICAgICBjbGVhclBlZXJQcm94eSgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGVlclJlZmVyZW5jZUhvbGQuY2xlYXIoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtUGVlclByb3h5ID0gbnVsbHB0cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYm9vbCAgICAgICAgcHJvZHVjZXNCdWZmZXJPbkRlbWFuZCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisKK3Byb3RlY3RlZDoKKyAgICBjb25zdCBzcDxDbGllbnRQcm94eT4gICAgICAgbVByb3h5OworICAgIHNwPFJlZkJhc2U+ICAgICAgICAgICAgICAgICBtUGVlclJlZmVyZW5jZUhvbGQ7ICAgLy8ga2VlcHMgbVBlZXJQcm94eSBhbGl2ZSBkdXJpbmcgYWNjZXNzLgorICAgIFBhdGNoUHJveHlCdWZmZXJQcm92aWRlciogICBtUGVlclByb3h5ID0gbnVsbHB0cjsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgICAgICAgICAgICAgbVBlZXJUaW1lb3V0e307CisKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHJhY2tzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCmluZGV4IDZkMjVmYjkuLmYzNTk5YzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UcmFja3MuY3BwCkBAIC0xOCwyMSArMTgsMjMgQEAKIAogI2RlZmluZSBMT0dfVEFHICJBdWRpb0ZsaW5nZXIiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19BVURJTwogCiAjaW5jbHVkZSAiQ29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgPGxpbnV4L2Z1dGV4Lmg+CiAjaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KIAogI2luY2x1ZGUgPHByaXZhdGUvbWVkaWEvQXVkaW9UcmFja1NoYXJlZC5oPgogCiAjaW5jbHVkZSAiQXVkaW9GbGluZ2VyLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogCiAjaW5jbHVkZSA8bWVkaWEvbmJhaW8vUGlwZS5oPgogI2luY2x1ZGUgPG1lZGlhL25iYWlvL1BpcGVSZWFkZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9SZWNvcmRCdWZmZXJDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlIDxhdWRpb191dGlscy9taW5pZmxvYXQuaD4KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNTYsNiArNTgsOCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICBUcmFja0Jhc2UKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpUcmFja0Jhc2UiCiAKIHN0YXRpYyB2b2xhdGlsZSBpbnQzMl90IG5leHRUcmFja0lkID0gNTU7CiAKQEAgLTcxLDYgKzc1LDcgQEAKICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgIHBpZF90IGNyZWF0b3JQaWQsCiAgICAgICAgICAgICB1aWRfdCBjbGllbnRVaWQsCiAgICAgICAgICAgICBib29sIGlzT3V0LAogICAgICAgICAgICAgYWxsb2NfdHlwZSBhbGxvYywKQEAgLTk3LDE0ICsxMDIsMTYgQEAKICAgICAgICAgbUlkKGFuZHJvaWRfYXRvbWljX2luYygmbmV4dFRyYWNrSWQpKSwKICAgICAgICAgbVRlcm1pbmF0ZWQoZmFsc2UpLAogICAgICAgICBtVHlwZSh0eXBlKSwKLSAgICAgICAgbVRocmVhZElvSGFuZGxlKHRocmVhZC0+aWQoKSksCisgICAgICAgIG1UaHJlYWRJb0hhbmRsZSh0aHJlYWQgPyB0aHJlYWQtPmlkKCkgOiBBVURJT19JT19IQU5ETEVfTk9ORSksCiAgICAgICAgIG1Qb3J0SWQocG9ydElkKSwKLSAgICAgICAgbUlzSW52YWxpZChmYWxzZSkKKyAgICAgICAgbUlzSW52YWxpZChmYWxzZSksCisgICAgICAgIG1DcmVhdG9yUGlkKGNyZWF0b3JQaWQpCiB7CiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAoIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkgfHwgY2xpZW50VWlkID09IEFVRElPX1VJRF9JTlZBTElEKSB7CisgICAgaWYgKCFpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChjYWxsaW5nVWlkKSB8fCBjbGllbnRVaWQgPT0gQVVESU9fVUlEX0lOVkFMSUQpIHsKICAgICAgICAgQUxPR1dfSUYoY2xpZW50VWlkICE9IEFVRElPX1VJRF9JTlZBTElEICYmIGNsaWVudFVpZCAhPSBjYWxsaW5nVWlkLAotICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwgX19GVU5DVElPTl9fLCBjYWxsaW5nVWlkLCBjbGllbnRVaWQpOworICAgICAgICAgICAgICAgICIlcyglZCk6IHVpZCAlZCB0cmllZCB0byBwYXNzIGl0c2VsZiBvZmYgYXMgJWQiLAorICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBjYWxsaW5nVWlkLCBjbGllbnRVaWQpOwogICAgICAgICBjbGllbnRVaWQgPSBjYWxsaW5nVWlkOwogICAgIH0KICAgICAvLyBjbGllbnRVaWQgY29udGFpbnMgdGhlIHVpZCBvZiB0aGUgYXBwIHRoYXQgaXMgcmVzcG9uc2libGUgZm9yIHRoaXMgdHJhY2ssIHNvIHdlIGNhbiBibGFtZQpAQCAtMTQ0LDcgKzE1MSw3IEBACiAgICAgICAgIG1DYmxrTWVtb3J5ID0gY2xpZW50LT5oZWFwKCktPmFsbG9jYXRlKHNpemUpOwogICAgICAgICBpZiAobUNibGtNZW1vcnkgPT0gMCB8fAogICAgICAgICAgICAgICAgIChtQ2JsayA9IHN0YXRpY19jYXN0PGF1ZGlvX3RyYWNrX2NibGtfdCAqPihtQ2Jsa01lbW9yeS0+cG9pbnRlcigpKSkgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBBdWRpb1RyYWNrIHNpemU9JXp1Iiwgc2l6ZSk7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBub3QgZW5vdWdoIG1lbW9yeSBmb3IgQXVkaW9UcmFjayBzaXplPSV6dSIsIF9fZnVuY19fLCBtSWQsIHNpemUpOwogICAgICAgICAgICAgY2xpZW50LT5oZWFwKCktPmR1bXAoIkF1ZGlvVHJhY2siKTsKICAgICAgICAgICAgIG1DYmxrTWVtb3J5LmNsZWFyKCk7CiAgICAgICAgICAgICByZXR1cm47CkBAIC0xNTIsNyArMTU5LDcgQEAKICAgICB9IGVsc2UgewogICAgICAgICBtQ2JsayA9IChhdWRpb190cmFja19jYmxrX3QgKikgbWFsbG9jKHNpemUpOwogICAgICAgICBpZiAobUNibGsgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciBBdWRpb1RyYWNrIHNpemU9JXp1Iiwgc2l6ZSk7CisgICAgICAgICAgICBBTE9HRSgiJXMoJWQpOiBub3QgZW5vdWdoIG1lbW9yeSBmb3IgQXVkaW9UcmFjayBzaXplPSV6dSIsIF9fZnVuY19fLCBtSWQsIHNpemUpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9CiAgICAgfQpAQCAtMTY2LDcgKzE3Myw4IEBACiAgICAgICAgICAgICBpZiAocm9IZWFwID09IDAgfHwKICAgICAgICAgICAgICAgICAgICAgKG1CdWZmZXJNZW1vcnkgPSByb0hlYXAtPmFsbG9jYXRlKGJ1ZmZlclNpemUpKSA9PSAwIHx8CiAgICAgICAgICAgICAgICAgICAgIChtQnVmZmVyID0gbUJ1ZmZlck1lbW9yeS0+cG9pbnRlcigpKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIm5vdCBlbm91Z2ggbWVtb3J5IGZvciByZWFkLW9ubHkgYnVmZmVyIHNpemU9JXp1IiwgYnVmZmVyU2l6ZSk7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogbm90IGVub3VnaCBtZW1vcnkgZm9yIHJlYWQtb25seSBidWZmZXIgc2l6ZT0lenUiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgYnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICAgICAgaWYgKHJvSGVhcCAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHJvSGVhcC0+ZHVtcCgiYnVmZmVyIik7CiAgICAgICAgICAgICAgICAgfQpAQCAtMjA1LDI3ICsyMTMsMTIgQEAKICAgICAgICAgICAgIG1CdWZmZXIgPSBidWZmZXI7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUwoImludmFsaWQgYWxsb2NhdGlvbiB0eXBlOiAlZCIsIChpbnQpYWxsb2MpOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXMoJWQpOiBpbnZhbGlkIGFsbG9jYXRpb24gdHlwZTogJWQiLCBfX2Z1bmNfXywgbUlkLCAoaW50KWFsbG9jKTsKICAgICAgICAgfQogICAgICAgICBtQnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7CiAKICNpZmRlZiBURUVfU0lOSwotICAgICAgICBpZiAobVRlZVNpbmtUcmFja0VuYWJsZWQpIHsKLSAgICAgICAgICAgIE5CQUlPX0Zvcm1hdCBwaXBlRm9ybWF0ID0gRm9ybWF0X2Zyb21fU1JfQyhtU2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCwgbUZvcm1hdCk7Ci0gICAgICAgICAgICBpZiAoRm9ybWF0X2lzVmFsaWQocGlwZUZvcm1hdCkpIHsKLSAgICAgICAgICAgICAgICBQaXBlICpwaXBlID0gbmV3IFBpcGUobVRlZVNpbmtUcmFja0ZyYW1lcywgcGlwZUZvcm1hdCk7Ci0gICAgICAgICAgICAgICAgc2l6ZV90IG51bUNvdW50ZXJPZmZlcnMgPSAwOwotICAgICAgICAgICAgICAgIGNvbnN0IE5CQUlPX0Zvcm1hdCBvZmZlcnNbMV0gPSB7cGlwZUZvcm1hdH07Ci0gICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IHBpcGUtPm5lZ290aWF0ZShvZmZlcnMsIDEsIE5VTEwsIG51bUNvdW50ZXJPZmZlcnMpOwotICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4ID09IDApOwotICAgICAgICAgICAgICAgIFBpcGVSZWFkZXIgKnBpcGVSZWFkZXIgPSBuZXcgUGlwZVJlYWRlcigqcGlwZSk7Ci0gICAgICAgICAgICAgICAgbnVtQ291bnRlck9mZmVycyA9IDA7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBwaXBlUmVhZGVyLT5uZWdvdGlhdGUob2ZmZXJzLCAxLCBOVUxMLCBudW1Db3VudGVyT2ZmZXJzKTsKLSAgICAgICAgICAgICAgICBBTE9HX0FTU0VSVChpbmRleCA9PSAwKTsKLSAgICAgICAgICAgICAgICBtVGVlU2luayA9IHBpcGU7Ci0gICAgICAgICAgICAgICAgbVRlZVNvdXJjZSA9IHBpcGVSZWFkZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICAgICAgbVRlZS5zZXQoc2FtcGxlUmF0ZSwgbUNoYW5uZWxDb3VudCwgZm9ybWF0LCBOQkFJT19UZWU6OlRFRV9GTEFHX1RSQUNLKTsKICNlbmRpZgogCiAgICAgfQpAQCAtMjQ0LDkgKzIzNyw2IEBACiAKIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6VHJhY2tCYXNlOjp+VHJhY2tCYXNlKCkKIHsKLSNpZmRlZiBURUVfU0lOSwotICAgIGR1bXBUZWUoLTEsIG1UZWVTb3VyY2UsIG1JZCwgJ1QnKTsKLSNlbmRpZgogICAgIC8vIGRlbGV0ZSB0aGUgcHJveHkgYmVmb3JlIGRlbGV0aW5nIHRoZSBzaGFyZWQgbWVtb3J5IGl0IHJlZmVycyB0bywgdG8gYXZvaWQgZGFuZ2xpbmcgcmVmZXJlbmNlCiAgICAgbVNlcnZlclByb3h5LmNsZWFyKCk7CiAgICAgaWYgKG1DYmxrICE9IE5VTEwpIHsKQEAgLTI3NCw5ICsyNjQsNyBAQAogdm9pZCBBdWRpb0ZsaW5nZXI6OlRocmVhZEJhc2U6OlRyYWNrQmFzZTo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKICNpZmRlZiBURUVfU0lOSwotICAgIGlmIChtVGVlU2luayAhPSAwKSB7Ci0gICAgICAgICh2b2lkKSBtVGVlU2luay0+d3JpdGUoYnVmZmVyLT5yYXcsIGJ1ZmZlci0+ZnJhbWVDb3VudCk7Ci0gICAgfQorICAgIG1UZWUud3JpdGUoYnVmZmVyLT5yYXcsIGJ1ZmZlci0+ZnJhbWVDb3VudCk7CiAjZW5kaWYKIAogICAgIFNlcnZlclByb3h5OjpCdWZmZXIgYnVmOwpAQCAtMjkzLDkgKzI4MSwzMiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAorQXVkaW9GbGluZ2VyOjpUaHJlYWRCYXNlOjpQYXRjaFRyYWNrQmFzZTo6UGF0Y2hUcmFja0Jhc2Uoc3A8Q2xpZW50UHJveHk+IHByb3h5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGhyZWFkQmFzZSYgdGhyZWFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGltZW91dCYgdGltZW91dCkKKyAgICA6IG1Qcm94eShwcm94eSkKK3sKKyAgICBpZiAodGltZW91dCkgeworICAgICAgICBzZXRQZWVyVGltZW91dCgqdGltZW91dCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gRG91YmxlIGJ1ZmZlciBtaXhlcgorICAgICAgICB1aW50NjRfdCBtaXhCdWZmZXJOcyA9ICgodWludDY0X3QpMiAqIHRocmVhZC5mcmFtZUNvdW50KCkgKiAxMDAwMDAwMDAwKSAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkLnNhbXBsZVJhdGUoKTsKKyAgICAgICAgc2V0UGVlclRpbWVvdXQoc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRze21peEJ1ZmZlck5zfSk7CisgICAgfQorfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6VGhyZWFkQmFzZTo6UGF0Y2hUcmFja0Jhc2U6OnNldFBlZXJUaW1lb3V0KHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kcyB0aW1lb3V0KSB7CisgICAgbVBlZXJUaW1lb3V0LnR2X3NlYyA9IHRpbWVvdXQuY291bnQoKSAvIHN0ZDo6bmFubzo6ZGVuOworICAgIG1QZWVyVGltZW91dC50dl9uc2VjID0gdGltZW91dC5jb3VudCgpICUgc3RkOjpuYW5vOjpkZW47Cit9CisKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gICAgICBQbGF5YmFjawogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6OlRyYWNrSGFuZGxlIgogCiBBdWRpb0ZsaW5nZXI6OlRyYWNrSGFuZGxlOjpUcmFja0hhbmRsZShjb25zdCBzcDxBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjaz4mIHRyYWNrKQogICAgIDogQm5BdWRpb1RyYWNrKCksCkBAIC0zNDAsNiArMzUxLDEwIEBACiAgICAgcmV0dXJuIG1UcmFjay0+c2V0UGFyYW1ldGVycyhrZXlWYWx1ZVBhaXJzKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwgaW50IHByb2dyYW1JZCkgeworICAgIHJldHVybiBtVHJhY2stPnNlbGVjdFByZXNlbnRhdGlvbihwcmVzZW50YXRpb25JZCwgcHJvZ3JhbUlkKTsKK30KKwogVm9sdW1lU2hhcGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpUcmFja0hhbmRsZTo6YXBwbHlWb2x1bWVTaGFwZXIoCiAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCiAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKSB7CkBAIC0zNjgsNiArMzgzLDExNyBAQAogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgIEFwcE9wIGZvciBhdWRpbyBwbGF5YmFjaworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBzdGF0aWMKK3NwPEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok9wUGxheUF1ZGlvTW9uaXRvcj4KK0F1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok9wUGxheUF1ZGlvTW9uaXRvcjo6Y3JlYXRlSWZOZWVkZWQoCisgICAgICAgICAgICB1aWRfdCB1aWQsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0ciwgaW50IGlkLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpCit7CisgICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSB7CisgICAgICAgIFZlY3RvciA8U3RyaW5nMTY+IHBhY2thZ2VzOworICAgICAgICBnZXRQYWNrYWdlc0ZvclVpZCh1aWQsIHBhY2thZ2VzKTsKKyAgICAgICAgaWYgKHBhY2thZ2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgQUxPR0QoIk9wUGxheUF1ZGlvOiBub3QgbXV0aW5nIHRyYWNrOiVkIHVzYWdlOiVkIGZvciBzZXJ2aWNlIFVJRCAlZCIsCisgICAgICAgICAgICAgICAgICBpZCwKKyAgICAgICAgICAgICAgICAgIGF0dHIudXNhZ2UsCisgICAgICAgICAgICAgICAgICB1aWQpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gc3RyZWFtIHR5cGUgaGFzIGJlZW4gZmlsdGVyZWQgYnkgYXVkaW8gcG9saWN5IHRvIGluZGljYXRlIHdoZXRoZXIgaXQgY2FuIGJlIG11dGVkCisgICAgaWYgKHN0cmVhbVR5cGUgPT0gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpIHsKKyAgICAgICAgQUxPR0QoIk9wUGxheUF1ZGlvOiBub3QgbXV0aW5nIHRyYWNrOiVkIHVzYWdlOiVkIEVORk9SQ0VEX0FVRElCTEUiLCBpZCwgYXR0ci51c2FnZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBpZiAoKGF0dHIuZmxhZ3MgJiBBVURJT19GTEFHX0JZUEFTU19JTlRFUlJVUFRJT05fUE9MSUNZKQorICAgICAgICAgICAgPT0gQVVESU9fRkxBR19CWVBBU1NfSU5URVJSVVBUSU9OX1BPTElDWSkgeworICAgICAgICBBTE9HRCgiT3BQbGF5QXVkaW86IG5vdCBtdXRpbmcgdHJhY2s6JWQgZmxhZ3MgJSN4IGhhdmUgRkxBR19CWVBBU1NfSU5URVJSVVBUSU9OX1BPTElDWSIsCisgICAgICAgICAgICBpZCwgYXR0ci5mbGFncyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gbmV3IE9wUGxheUF1ZGlvTW9uaXRvcih1aWQsIGF0dHIudXNhZ2UsIGlkKTsKK30KKworQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3BQbGF5QXVkaW9Nb25pdG9yOjpPcFBsYXlBdWRpb01vbml0b3IoCisgICAgICAgIHVpZF90IHVpZCwgYXVkaW9fdXNhZ2VfdCB1c2FnZSwgaW50IGlkKQorICAgICAgICA6IG1IYXNPcFBsYXlBdWRpbyh0cnVlKSwgbVVpZCh1aWQpLCBtVXNhZ2UoKGludDMyX3QpIHVzYWdlKSwgbUlkKGlkKQoreworfQorCitBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPcFBsYXlBdWRpb01vbml0b3I6On5PcFBsYXlBdWRpb01vbml0b3IoKQoreworICAgIGlmIChtT3BDYWxsYmFjayAhPSAwKSB7CisgICAgICAgIG1BcHBPcHNNYW5hZ2VyLnN0b3BXYXRjaGluZ01vZGUobU9wQ2FsbGJhY2spOworICAgIH0KKyAgICBtT3BDYWxsYmFjay5jbGVhcigpOworfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok9wUGxheUF1ZGlvTW9uaXRvcjo6b25GaXJzdFJlZigpCit7CisgICAgZ2V0UGFja2FnZXNGb3JVaWQobVVpZCwgbVBhY2thZ2VzKTsKKyAgICBjaGVja1BsYXlBdWRpb0ZvclVzYWdlKCk7CisgICAgaWYgKCFtUGFja2FnZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIG1PcENhbGxiYWNrID0gbmV3IFBsYXlBdWRpb09wQ2FsbGJhY2sodGhpcyk7CisgICAgICAgIG1BcHBPcHNNYW5hZ2VyLnN0YXJ0V2F0Y2hpbmdNb2RlKEFwcE9wc01hbmFnZXI6Ok9QX1BMQVlfQVVESU8sIG1QYWNrYWdlc1swXSwgbU9wQ2FsbGJhY2spOworICAgIH0KK30KKworYm9vbCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPcFBsYXlBdWRpb01vbml0b3I6Omhhc09wUGxheUF1ZGlvKCkgY29uc3QgeworICAgIHJldHVybiBtSGFzT3BQbGF5QXVkaW8ubG9hZCgpOworfQorCisvLyBOb3RlIHRoaXMgbWV0aG9kIGlzIG5ldmVyIGNhbGxlZCAoYW5kIG5ldmVyIHRvIGJlKSBmb3IgYXVkaW8gc2VydmVyIC8gcGF0Y2ggcmVjb3JkIHRyYWNrCisvLyAtIG5vdCBjYWxsZWQgZnJvbSBjb25zdHJ1Y3RvciBkdWUgdG8gY2hlY2sgb24gVUlELAorLy8gLSBub3QgY2FsbGVkIGZyb20gUGxheUF1ZGlvT3BDYWxsYmFjayBiZWNhdXNlIHRoZSBjYWxsYmFjayBpcyBub3QgaW5zdGFsbGVkIGluIHRoaXMgY2FzZQordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPcFBsYXlBdWRpb01vbml0b3I6OmNoZWNrUGxheUF1ZGlvRm9yVXNhZ2UoKQoreworICAgIGlmIChtUGFja2FnZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIG1IYXNPcFBsYXlBdWRpby5zdG9yZShmYWxzZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgYm9vbCBoYXNJdCA9IHRydWU7CisgICAgICAgIGZvciAoY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lIDogbVBhY2thZ2VzKSB7CisgICAgICAgICAgICBjb25zdCBpbnQzMl90IG1vZGUgPSBtQXBwT3BzTWFuYWdlci5jaGVja0F1ZGlvT3BOb1Rocm93KEFwcE9wc01hbmFnZXI6Ok9QX1BMQVlfQVVESU8sCisgICAgICAgICAgICAgICAgICAgIG1Vc2FnZSwgbVVpZCwgcGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKG1vZGUgIT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEKSB7CisgICAgICAgICAgICAgICAgaGFzSXQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBBTE9HRCgiT3BQbGF5QXVkaW86IHRyYWNrOiVkIHVzYWdlOiVkICVzbXV0ZWQiLCBtSWQsIG1Vc2FnZSwgaGFzSXQgPyAibm90ICIgOiAiIik7CisgICAgICAgIG1IYXNPcFBsYXlBdWRpby5zdG9yZShoYXNJdCk7CisgICAgfQorfQorCitBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPcFBsYXlBdWRpb01vbml0b3I6OlBsYXlBdWRpb09wQ2FsbGJhY2s6OlBsYXlBdWRpb09wQ2FsbGJhY2soCisgICAgICAgIGNvbnN0IHdwPE9wUGxheUF1ZGlvTW9uaXRvcj4mIG1vbml0b3IpIDogbU1vbml0b3IobW9uaXRvcikKK3sgfQorCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6Ok9wUGxheUF1ZGlvTW9uaXRvcjo6UGxheUF1ZGlvT3BDYWxsYmFjazo6b3BDaGFuZ2VkKGludDMyX3Qgb3AsCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgcGFja2FnZU5hbWUpIHsKKyAgICAvLyB3ZSBvbmx5IGhhdmUgdWlkLCBzbyB3ZSBuZWVkIHRvIGNoZWNrIGFsbCBwYWNrYWdlIG5hbWVzIGFueXdheQorICAgIFVOVVNFRChwYWNrYWdlTmFtZSk7CisgICAgaWYgKG9wICE9IEFwcE9wc01hbmFnZXI6Ok9QX1BMQVlfQVVESU8pIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcDxPcFBsYXlBdWRpb01vbml0b3I+IG1vbml0b3IgPSBtTW9uaXRvci5wcm9tb3RlKCk7CisgICAgaWYgKG1vbml0b3IgIT0gTlVMTCkgeworICAgICAgICBtb25pdG9yLT5jaGVja1BsYXlBdWRpb0ZvclVzYWdlKCk7CisgICAgfQorfQorCisvLyBzdGF0aWMKK3ZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3BQbGF5QXVkaW9Nb25pdG9yOjpnZXRQYWNrYWdlc0ZvclVpZCgKKyAgICB1aWRfdCB1aWQsIFZlY3RvcjxTdHJpbmcxNj4mIHBhY2thZ2VzKQoreworICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBlcm1pc3Npb25Db250cm9sbGVyOworICAgIHBlcm1pc3Npb25Db250cm9sbGVyLmdldFBhY2thZ2VzRm9yVWlkKHVpZCwgcGFja2FnZXMpOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6VHJhY2siCiAKIC8vIFRyYWNrIGNvbnN0cnVjdG9yIG11c3QgYmUgY2FsbGVkIHdpdGggQXVkaW9GbGluZ2VyOjptTG9jayBhbmQgVGhyZWFkQmFzZTo6bUxvY2sgaGVsZAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OlRyYWNrKApAQCAtMzgzLDI4ICs1MDksMzEgQEAKICAgICAgICAgICAgIHNpemVfdCBidWZmZXJTaXplLAogICAgICAgICAgICAgY29uc3Qgc3A8SU1lbW9yeT4mIHNoYXJlZEJ1ZmZlciwKICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICBwaWRfdCBjcmVhdG9yUGlkLAogICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICB0cmFja190eXBlIHR5cGUsCi0gICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLAorICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnRUb0JlUmVhZHkpCiAgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIGNsaWVudCwgYXR0ciwgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgIChzaGFyZWRCdWZmZXIgIT0gMCkgPyBzaGFyZWRCdWZmZXItPnBvaW50ZXIoKSA6IGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgIChzaGFyZWRCdWZmZXIgIT0gMCkgPyBzaGFyZWRCdWZmZXItPnNpemUoKSA6IGJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIHVpZCwgdHJ1ZSAvKmlzT3V0Ki8sCisgICAgICAgICAgICAgICAgICBzZXNzaW9uSWQsIGNyZWF0b3JQaWQsIHVpZCwgdHJ1ZSAvKmlzT3V0Ki8sCiAgICAgICAgICAgICAgICAgICAodHlwZSA9PSBUWVBFX1BBVENIKSA/ICggYnVmZmVyID09IE5VTEwgPyBBTExPQ19MT0NBTCA6IEFMTE9DX05PTkUpIDogQUxMT0NfQ0JMSywKICAgICAgICAgICAgICAgICAgIHR5cGUsIHBvcnRJZCksCiAgICAgbUZpbGxpbmdVcFN0YXR1cyhGU19JTlZBTElEKSwKICAgICAvLyBtUmV0cnlDb3VudCBpbml0aWFsaXplZCBsYXRlciB3aGVuIG5lZWRlZAogICAgIG1TaGFyZWRCdWZmZXIoc2hhcmVkQnVmZmVyKSwKICAgICBtU3RyZWFtVHlwZShzdHJlYW1UeXBlKSwKLSAgICBtTmFtZShUUkFDS19OQU1FX0ZBSUxVUkUpLCAgLy8gc2V0IHRvIFRSQUNLX05BTUVfUEVORElORyBvbiBjb25zdHJ1Y3RvciBzdWNjZXNzLgogICAgIG1NYWluQnVmZmVyKHRocmVhZC0+c2lua0J1ZmZlcigpKSwKICAgICBtQXV4QnVmZmVyKE5VTEwpLAogICAgIG1BdXhFZmZlY3RJZCgwKSwgbUhhc1ZvbHVtZUNvbnRyb2xsZXIoZmFsc2UpLAogICAgIG1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcygwKSwKICAgICBtRnJhbWVNYXAoMTYgLyogc2luay1mcmFtZS10by10cmFjay1mcmFtZSBtYXAgbWVtb3J5ICovKSwKICAgICBtVm9sdW1lSGFuZGxlcihuZXcgbWVkaWE6OlZvbHVtZUhhbmRsZXIoc2FtcGxlUmF0ZSkpLAorICAgIG1PcFBsYXlBdWRpb01vbml0b3IoT3BQbGF5QXVkaW9Nb25pdG9yOjpjcmVhdGVJZk5lZWRlZCh1aWQsIGF0dHIsIGlkKCksIHN0cmVhbVR5cGUpKSwKICAgICAvLyBtU2lua1RpbWVzdGFtcAorICAgIG1GcmFtZUNvdW50VG9CZVJlYWR5KGZyYW1lQ291bnRUb0JlUmVhZHkpLAogICAgIG1GYXN0SW5kZXgoLTEpLAogICAgIG1DYWNoZWRWb2x1bWUoMS4wKSwKICAgICAvKiBUaGUgdHJhY2sgbWlnaHQgbm90IHBsYXkgaW1tZWRpYXRlbHkgYWZ0ZXIgYmVpbmcgYWN0aXZlLCBzaW1pbGFybHkgYXMgaWYgaXRzIHZvbHVtZSB3YXMgMC4KQEAgLTQxNyw4ICs1NDYsOCBAQAogICAgIC8vIGNsaWVudCA9PSAwIGltcGxpZXMgc2hhcmVkQnVmZmVyID09IDAKICAgICBBTE9HX0FTU0VSVCghKGNsaWVudCA9PSAwICYmIHNoYXJlZEJ1ZmZlciAhPSAwKSk7CiAKLSAgICBBTE9HVl9JRihzaGFyZWRCdWZmZXIgIT0gMCwgInNoYXJlZEJ1ZmZlcjogJXAsIHNpemU6ICV6dSIsIHNoYXJlZEJ1ZmZlci0+cG9pbnRlcigpLAotICAgICAgICAgICAgc2hhcmVkQnVmZmVyLT5zaXplKCkpOworICAgIEFMT0dWX0lGKHNoYXJlZEJ1ZmZlciAhPSAwLCAiJXMoJWQpOiBzaGFyZWRCdWZmZXI6ICVwLCBzaXplOiAlenUiLAorICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgc2hhcmVkQnVmZmVyLT5wb2ludGVyKCksIHNoYXJlZEJ1ZmZlci0+c2l6ZSgpKTsKIAogICAgIGlmIChtQ2JsayA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybjsKQEAgLTQzNCw3ICs1NjMsNyBAQAogICAgIG1TZXJ2ZXJQcm94eSA9IG1BdWRpb1RyYWNrU2VydmVyUHJveHk7CiAKICAgICBpZiAoIXRocmVhZC0+aXNUcmFja0FsbG93ZWRfbChjaGFubmVsTWFzaywgZm9ybWF0LCBzZXNzaW9uSWQsIHVpZCkpIHsKLSAgICAgICAgQUxPR0UoIm5vIG1vcmUgdHJhY2tzIGF2YWlsYWJsZSIpOworICAgICAgICBBTE9HRSgiJXMoJWQpOiBubyBtb3JlIHRyYWNrcyBhdmFpbGFibGUiLCBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICAvLyBvbmx5IGFsbG9jYXRlIGEgZmFzdCB0cmFjayBpbmRleCBpZiB3ZSB3ZXJlIGFibGUgdG8gYWxsb2NhdGUgYSBub3JtYWwgdHJhY2sgbmFtZQpAQCAtNDUzLDEyICs1ODIsMjQgQEAKICAgICAgICAgbUZhc3RJbmRleCA9IGk7CiAgICAgICAgIHRocmVhZC0+bUZhc3RUcmFja0F2YWlsTWFzayAmPSB+KDEgPDwgaSk7CiAgICAgfQotICAgIG1OYW1lID0gVFJBQ0tfTkFNRV9QRU5ESU5HOworCisgICAgbVNlcnZlckxhdGVuY3lTdXBwb3J0ZWQgPSB0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpNSVhFUgorICAgICAgICAgICAgfHwgdGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6RFVQTElDQVRJTkc7CisjaWZkZWYgVEVFX1NJTksKKyAgICBtVGVlLnNldElkKHN0ZDo6c3RyaW5nKCJfIikgKyBzdGQ6OnRvX3N0cmluZyhtVGhyZWFkSW9IYW5kbGUpCisgICAgICAgICAgICArICJfIiArIHN0ZDo6dG9fc3RyaW5nKG1JZCkgKyAiX1QiKTsKKyNlbmRpZgorCisgICAgaWYgKGNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSB7CisgICAgICAgIG1BdWRpb1ZpYnJhdGlvbkNvbnRyb2xsZXIgPSBuZXcgQXVkaW9WaWJyYXRpb25Db250cm9sbGVyKHRoaXMpOworICAgICAgICBtRXh0ZXJuYWxWaWJyYXRpb24gPSBuZXcgb3M6OkV4dGVybmFsVmlicmF0aW9uKAorICAgICAgICAgICAgICAgIG1VaWQsICIiIC8qIHBrZyAqLywgbUF0dHIsIG1BdWRpb1ZpYnJhdGlvbkNvbnRyb2xsZXIpOworICAgIH0KIH0KIAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6On5UcmFjaygpCiB7Ci0gICAgQUxPR1YoIlBsYXliYWNrVGhyZWFkOjpUcmFjayBkZXN0cnVjdG9yIik7CisgICAgQUxPR1YoIiVzKCVkKSIsIF9fZnVuY19fLCBtSWQpOwogCiAgICAgLy8gVGhlIGRlc3RydWN0b3Igd291bGQgY2xlYXIgbVNoYXJlZEJ1ZmZlciwKICAgICAvLyBidXQgaXQgd2lsbCBub3QgcHVzaCB0aGUgZGVjcmVtZW50ZWQgcmVmZXJlbmNlIGNvdW50LApAQCAtNDcyLDcgKzYxMyw3IEBACiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6aW5pdENoZWNrKCkgY29uc3QKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBUcmFja0Jhc2U6OmluaXRDaGVjaygpOwotICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgbU5hbWUgPT0gVFJBQ0tfTkFNRV9GQUlMVVJFKSB7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUiAmJiBtQ2JsayA9PSBudWxscHRyKSB7CiAgICAgICAgIHN0YXR1cyA9IE5PX01FTU9SWTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKQEAgLTQ5OCwxOCArNjM5LDIxIEBACiAgICAgICAgICAgICB3YXNBY3RpdmUgPSBwbGF5YmFja1RocmVhZC0+ZGVzdHJveVRyYWNrX2wodGhpcyk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlzRXh0ZXJuYWxUcmFjaygpICYmICF3YXNBY3RpdmUpIHsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlT3V0cHV0KG1UaHJlYWRJb0hhbmRsZSwgbVN0cmVhbVR5cGUsIG1TZXNzaW9uSWQpOworICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VPdXRwdXQobVBvcnRJZCk7CiAgICAgICAgIH0KICAgICB9CisgICAgZm9yRWFjaFRlZVBhdGNoVHJhY2soW10oYXV0byBwYXRjaFRyYWNrKSB7IHBhdGNoVHJhY2stPmRlc3Ryb3koKTsgfSk7CiB9CiAKLS8qc3RhdGljKi8gdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCJUIE5hbWUgQWN0aXZlIENsaWVudCBTZXNzaW9uIFMgIEZsYWdzICIKLSAgICAgICAgICAgICAgICAgICIgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgIgotICAgICAgICAgICAgICAgICAgIlNUICBMIGRCICBSIGRCICBWUyBkQiAiCi0gICAgICAgICAgICAgICAgICAiICBTZXJ2ZXIgRnJtQ250ICBGcm1SZHkgRiBVbmRlcnJ1bnMgIEZsdXNoZWQgIgotICAgICAgICAgICAgICAgICAgIk1haW4gQnVmICBBdXggQnVmXG4iKTsKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJUeXBlICAgICBJZCBBY3RpdmUgQ2xpZW50IFNlc3Npb24gUG9ydCBJZCBTICBGbGFncyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJTVCBVc2cgQ1QgIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBHIGRiICBMIGRCICBSIGRCICBWUyBkQiAiCisgICAgICAgICAgICAgICAgICAgICAgICAiICBTZXJ2ZXIgRnJtQ250ICBGcm1SZHkgRiBVbmRlcnJ1bnMgIEZsdXNoZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAiJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpc1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoKSA/ICIgICBMYXRlbmN5IiA6ICIiKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlKQpAQCAtNTE4LDcgKzY2Miw3IEBACiAgICAgc3dpdGNoIChtVHlwZSkgewogICAgIGNhc2UgVFlQRV9ERUZBVUxUOgogICAgIGNhc2UgVFlQRV9PVVRQVVQ6Ci0gICAgICAgIGlmIChtU2hhcmVkQnVmZmVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGlzU3RhdGljKCkpIHsKICAgICAgICAgICAgIHRyYWNrVHlwZSA9ICdTJzsgLy8gc3RhdGljCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICB0cmFja1R5cGUgPSAnICc7IC8vIG5vcm1hbApAQCAtNTMyLDEzICs2NzYsOSBAQAogICAgIH0KIAogICAgIGlmIChpc0Zhc3RUcmFjaygpKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkYlYyAlM2QiLCB0cmFja1R5cGUsIG1GYXN0SW5kZXgpOwotICAgIH0gZWxzZSBpZiAobU5hbWUgPT0gVFJBQ0tfTkFNRV9QRU5ESU5HKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjIHBlbmQiLCB0cmFja1R5cGUpOwotICAgIH0gZWxzZSBpZiAobU5hbWUgPT0gVFJBQ0tfTkFNRV9GQUlMVVJFKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjIGZhaWwiLCB0cmFja1R5cGUpOworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCJGJWQgJWMgJTZkIiwgbUZhc3RJbmRleCwgdHJhY2tUeXBlLCBtSWQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiVjICU0ZCIsIHRyYWNrVHlwZSwgbU5hbWUpOworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIgICAlYyAlNmQiLCB0cmFja1R5cGUsIG1JZCk7CiAgICAgfQogCiAgICAgY2hhciBub3dJblVuZGVycnVuOwpAQCAtNTkzLDIyICs3MzMsMjcgQEAKICAgICAgICAgICAgID8gJ3InIC8qIGJ1ZmZlciByZWR1Y2VkICovOiBidWZmZXJTaXplSW5GcmFtZXMgPiBtRnJhbWVDb3VudAogICAgICAgICAgICAgICAgICAgICA/ICdlJyAvKiBlcnJvciAqLyA6ICcgJyAvKiBpZGVudGljYWwgKi87CiAKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlN3MgJTZ1ICU3dSAlMnMgMHglMDNYICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICUwOFggJTZ1ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICIlMnUgJTUuMmcgJTUuMmcgJTUuMmclYyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlNnp1JWMgJTZ6dSAlYyAlOXUlYyAlN3UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIiUwOHpYICUwOHpYXG4iLAorICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU3cyAlNnUgJTd1ICU3dSAlMnMgMHglMDNYICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlMDhYICUwOFggJTZ1ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIlMnUgJTN4ICUyeCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJTUuMmcgJTUuMmcgJTUuMmcgJTUuMmclYyAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJTA4WCAlNnp1JWMgJTZ6dSAlYyAlOXUlYyAlN3UiLAogICAgICAgICAgICAgYWN0aXZlID8gInllcyIgOiAibm8iLAotICAgICAgICAgICAgKG1DbGllbnQgPT0gMCkgPyBnZXRwaWRfY2FjaGVkIDogbUNsaWVudC0+cGlkKCksCisgICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZCgpIDogbUNsaWVudC0+cGlkKCksCiAgICAgICAgICAgICBtU2Vzc2lvbklkLAorICAgICAgICAgICAgbVBvcnRJZCwKICAgICAgICAgICAgIGdldFRyYWNrU3RhdGVTdHJpbmcoKSwKICAgICAgICAgICAgIG1DYmxrLT5tRmxhZ3MsCiAKICAgICAgICAgICAgIG1Gb3JtYXQsCiAgICAgICAgICAgICBtQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5nZXRTYW1wbGVSYXRlKCksCisgICAgICAgICAgICBzYW1wbGVSYXRlKCksCiAKICAgICAgICAgICAgIG1TdHJlYW1UeXBlLAorICAgICAgICAgICAgbUF0dHIudXNhZ2UsCisgICAgICAgICAgICBtQXR0ci5jb250ZW50X3R5cGUsCisKKyAgICAgICAgICAgIDIwLjAgKiBsb2cxMChtRmluYWxWb2x1bWUpLAogICAgICAgICAgICAgMjAuMCAqIGxvZzEwKGZsb2F0X2Zyb21fZ2FpbihnYWluX21pbmlmbG9hdF91bnBhY2tfbGVmdCh2bHIpKSksCiAgICAgICAgICAgICAyMC4wICogbG9nMTAoZmxvYXRfZnJvbV9nYWluKGdhaW5fbWluaWZsb2F0X3VucGFja19yaWdodCh2bHIpKSksCiAgICAgICAgICAgICAyMC4wICogbG9nMTAodnNWb2x1bWUuZmlyc3QpLCAvLyBWb2x1bWVTaGFwZXIocykgdG90YWwgdm9sdW1lCkBAIC02MjEsMTEgKzc2NiwyMSBAQAogICAgICAgICAgICAgZmlsbGluZ1N0YXR1cywKICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPmdldFVuZGVycnVuRnJhbWVzKCksCiAgICAgICAgICAgICBub3dJblVuZGVycnVuLAotICAgICAgICAgICAgKHVuc2lnbmVkKW1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc0ZsdXNoZWQoKSAlIDEwMDAwMDAwLAotCi0gICAgICAgICAgICAoc2l6ZV90KW1NYWluQnVmZmVyLCAvLyB1c2UgJXpYIGFzICVwIGFwcGVuZHMgMHgKLSAgICAgICAgICAgIChzaXplX3QpbUF1eEJ1ZmZlciAgIC8vIHVzZSAlelggYXMgJXAgYXBwZW5kcyAweAorICAgICAgICAgICAgKHVuc2lnbmVkKW1BdWRpb1RyYWNrU2VydmVyUHJveHktPmZyYW1lc0ZsdXNoZWQoKSAlIDEwMDAwMDAwCiAgICAgICAgICAgICApOworCisgICAgaWYgKGlzU2VydmVyTGF0ZW5jeVN1cHBvcnRlZCgpKSB7CisgICAgICAgIGRvdWJsZSBsYXRlbmN5TXM7CisgICAgICAgIGJvb2wgZnJvbVRyYWNrOworICAgICAgICBpZiAoZ2V0VHJhY2tMYXRlbmN5TXMoJmxhdGVuY3lNcywgJmZyb21UcmFjaykgPT0gT0spIHsKKyAgICAgICAgICAgIC8vIFNob3cgbGF0ZW5jeSBpbiBtc2VjLCBmb2xsb3dlZCBieSAndCcgaWYgZnJvbSB0cmFjayB0aW1lc3RhbXAgKHRoZSBtb3N0IGFjY3VyYXRlKQorICAgICAgICAgICAgLy8gb3IgJ2snIGlmIGVzdGltYXRlZCBmcm9tIGtlcm5lbCBiZWNhdXNlIHRyYWNrIGZyYW1lcyBoYXZlbid0IGJlZW4gcHJlc2VudGVkIHlldC4KKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAlNy4ybGYgJWMiLCBsYXRlbmN5TXMsIGZyb21UcmFjayA/ICd0JyA6ICdrJyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlMTBzIiwgbUNibGstPm1TZXJ2ZXIgIT0gMCA/ICJ1bmF2YWlsIiA6ICJuZXciKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogfQogCiB1aW50MzJfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c2FtcGxlUmF0ZSgpIGNvbnN0IHsKQEAgLTYzMyw4ICs3ODgsNyBAQAogfQogCiAvLyBBdWRpb0J1ZmZlclByb3ZpZGVyIGludGVyZmFjZQotc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmdldE5leHRCdWZmZXIoCi0gICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQorc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmdldE5leHRCdWZmZXIoQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCiB7CiAgICAgU2VydmVyUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgc2l6ZV90IGRlc2lyZWRGcmFtZXMgPSBidWZmZXItPmZyYW1lQ291bnQ7CkBAIC02NDMsMTcgKzc5Nyw0NiBAQAogICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IGJ1Zi5tRnJhbWVDb3VudDsKICAgICBidWZmZXItPnJhdyA9IGJ1Zi5tUmF3OwogICAgIGlmIChidWYubUZyYW1lQ291bnQgPT0gMCAmJiAhaXNTdG9wcGluZygpICYmICFpc1N0b3BwZWQoKSAmJiAhaXNQYXVzZWQoKSkgewotICAgICAgICBBTE9HVigidW5kZXJydW4sICBmcmFtZXNSZWFkeSglenUpIDwgZnJhbWVzRGVzaXJlZCglemQpLCBzdGF0ZTogJWQiLAotICAgICAgICAgICAgICAgIGJ1Zi5tRnJhbWVDb3VudCwgZGVzaXJlZEZyYW1lcywgbVN0YXRlKTsKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogdW5kZXJydW4sICBmcmFtZXNSZWFkeSglenUpIDwgZnJhbWVzRGVzaXJlZCglemQpLCBzdGF0ZTogJWQiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIGJ1Zi5tRnJhbWVDb3VudCwgZGVzaXJlZEZyYW1lcywgbVN0YXRlKTsKICAgICAgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+dGFsbHlVbmRlcnJ1bkZyYW1lcyhkZXNpcmVkRnJhbWVzKTsKICAgICB9IGVsc2UgewogICAgICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT50YWxseVVuZGVycnVuRnJhbWVzKDApOwogICAgIH0KLQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLS8vIHJlbGVhc2VCdWZmZXIoKSBpcyBub3Qgb3ZlcnJpZGRlbgordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKK3sKKyAgICBpbnRlcmNlcHRCdWZmZXIoKmJ1ZmZlcik7CisgICAgVHJhY2tCYXNlOjpyZWxlYXNlQnVmZmVyKGJ1ZmZlcik7Cit9CisKKy8vIFRPRE86IGNvbXBlbnNhdGUgZm9yIHRpbWUgc2hpZnQgYmV0d2VlbiBIVyBtb2R1bGVzLgordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6aW50ZXJjZXB0QnVmZmVyKAorICAgICAgICBjb25zdCBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXImIHNvdXJjZUJ1ZmZlcikgeworICAgIGF1dG8gc3RhcnQgPSBzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKTsKKyAgICBjb25zdCBzaXplX3QgZnJhbWVDb3VudCA9IHNvdXJjZUJ1ZmZlci5mcmFtZUNvdW50OworICAgIGlmIChmcmFtZUNvdW50ID09IDApIHsKKyAgICAgICAgcmV0dXJuOyAgLy8gTm8gYXVkaW8gdG8gaW50ZXJjZXB0LgorICAgICAgICAvLyBBZGRpdGlvbmFsbHkgUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyOjpvYnRhaW5CdWZmZXIgKGNhbGxlZCBieSBQYXRoVHJhY2s6OmdldE5leHRCdWZmZXIpCisgICAgICAgIC8vIGRvZXMgbm90IGFsbG93IDAgZnJhbWUgc2l6ZSByZXF1ZXN0IGNvbnRyYXJ5IHRvIGdldE5leHRCdWZmZXIKKyAgICB9CisgICAgZm9yIChhdXRvJiB0ZWVQYXRjaCA6IG1UZWVQYXRjaGVzKSB7CisgICAgICAgIFJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQqIHBhdGNoUmVjb3JkID0gdGVlUGF0Y2gucGF0Y2hSZWNvcmQuZ2V0KCk7CisgICAgICAgIGNvbnN0IHNpemVfdCBmcmFtZXNXcml0dGVuID0gcGF0Y2hSZWNvcmQtPndyaXRlRnJhbWVzKAorICAgICAgICAgICAgICAgIHNvdXJjZUJ1ZmZlci5pOCwgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSk7CisgICAgICAgIGNvbnN0IHNpemVfdCBmcmFtZXNMZWZ0ID0gZnJhbWVDb3VudCAtIGZyYW1lc1dyaXR0ZW47CisgICAgICAgIEFMT0dXX0lGKGZyYW1lc0xlZnQgIT0gMCwgIiVzKCVkKSBQYXRjaFJlY29yZCAlZCBjYW4gbm90IHByb3ZpZGUgYmlnIGVub3VnaCAiCisgICAgICAgICAgICAgICAgICJidWZmZXIgJXp1LyV6dSwgZHJvcHBpbmcgJXp1IGZyYW1lcyIsIF9fZnVuY19fLCBtSWQsIHBhdGNoUmVjb3JkLT5tSWQsCisgICAgICAgICAgICAgICAgIGZyYW1lc1dyaXR0ZW4sIGZyYW1lQ291bnQsIGZyYW1lc0xlZnQpOworICAgIH0KKyAgICBhdXRvIHNwZW50ID0gY2VpbDxzdGQ6OmNocm9ubzo6bWljcm9zZWNvbmRzPihzdGQ6OmNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKSAtIHN0YXJ0KTsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm9fbGl0ZXJhbHM7CisgICAgLy8gQXZlcmFnZSBpcyB+MjB1cyBwZXIgdHJhY2ssIHRoaXMgc2hvdWxkIHZpcnR1YWxseSBuZXZlciBiZSBsb2dnZWQgKExvZ2dpbmcgdGFrZXMgPjIwMHVzKQorICAgIEFMT0dEX0lGKHNwZW50ID4gNTAwdXMsICIlczogdG9vayAlbGxkdXMgdG8gaW50ZXJjZXB0ICV6dSB0cmFja3MiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICBzcGVudC5jb3VudCgpLCBtVGVlUGF0Y2hlcy5zaXplKCkpOworfQogCiAvLyBFeHRlbmRlZEF1ZGlvQnVmZmVyUHJvdmlkZXIgaW50ZXJmYWNlCiAKQEAgLTY4Miw2ICs4NjUsMTMgQEAKICAgICBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5zZXRUaW1lc3RhbXAodGltZXN0YW1wKTsKIAogICAgIC8vIFdlIGRvIG5vdCBzZXQgZHJhaW5lZCBoZXJlLCBhcyBGYXN0VHJhY2sgdGltZXN0YW1wIG1heSBub3QgZ28gdG8gdmVyeSBsYXN0IGZyYW1lLgorCisgICAgLy8gQ29tcHV0ZSBsYXRlbmN5LgorICAgIC8vIFRPRE86IENvbnNpZGVyIHdoZXRoZXIgdGhlIHNlcnZlciBsYXRlbmN5IG1heSBiZSBwYXNzZWQgaW4gYnkgRmFzdE1peGVyCisgICAgLy8gYXMgYSBjb25zdGFudCBmb3IgYWxsIGFjdGl2ZSBGYXN0VHJhY2tzLgorICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSB0aW1lc3RhbXAuZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKHNhbXBsZVJhdGUoKSk7CisgICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2suc3RvcmUodHJ1ZSk7CisgICAgbVNlcnZlckxhdGVuY3lNcy5zdG9yZShsYXRlbmN5TXMpOwogfQogCiAvLyBEb24ndCBjYWxsIGZvciBmYXN0IHRyYWNrczsgdGhlIGZyYW1lc1JlYWR5KCkgY291bGQgcmVzdWx0IGluIHByaW9yaXR5IGludmVyc2lvbgpAQCAtNjk3LDggKzg4NywxMiBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBpZiAoZnJhbWVzUmVhZHkoKSA+PSBtU2VydmVyUHJveHktPmdldEJ1ZmZlclNpemVJbkZyYW1lcygpIHx8Ci0gICAgICAgICAgICAobUNibGstPm1GbGFncyAmIENCTEtfRk9SQ0VSRUFEWSkpIHsKKyAgICBzaXplX3QgYnVmZmVyU2l6ZUluRnJhbWVzID0gbVNlcnZlclByb3h5LT5nZXRCdWZmZXJTaXplSW5GcmFtZXMoKTsKKyAgICBzaXplX3QgZnJhbWVzVG9CZVJlYWR5ID0gc3RkOjptaW4obUZyYW1lQ291bnRUb0JlUmVhZHksIGJ1ZmZlclNpemVJbkZyYW1lcyk7CisKKyAgICBpZiAoZnJhbWVzUmVhZHkoKSA+PSBmcmFtZXNUb0JlUmVhZHkgfHwgKG1DYmxrLT5tRmxhZ3MgJiBDQkxLX0ZPUkNFUkVBRFkpKSB7CisgICAgICAgIEFMT0dWKCIlcyglZCk6IGNvbnNpZGVyIHRyYWNrIHJlYWR5IHdpdGggJXp1LyV6dSwgdGFyZ2V0IHdhcyAlenUpIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgZnJhbWVzUmVhZHkoKSwgYnVmZmVyU2l6ZUluRnJhbWVzLCBmcmFtZXNUb0JlUmVhZHkpOwogICAgICAgICBtRmlsbGluZ1VwU3RhdHVzID0gRlNfRklMTEVEOwogICAgICAgICBhbmRyb2lkX2F0b21pY19hbmQofkNCTEtfRk9SQ0VSRUFEWSwgJm1DYmxrLT5tRmxhZ3MpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKQEAgLTcxMCw4ICs5MDQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiBfX3VudXNlZCkKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKLSAgICBBTE9HVigic3RhcnQoJWQpLCBjYWxsaW5nIHBpZCAlZCBzZXNzaW9uICVkIiwKLSAgICAgICAgICAgIG1OYW1lLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksIG1TZXNzaW9uSWQpOworICAgIEFMT0dWKCIlcyglZCk6IGNhbGxpbmcgcGlkICVkIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLCBtU2Vzc2lvbklkKTsKIAogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewpAQCAtNzM3LDE0ICs5MzEsMTcgQEAKICAgICAgICAgICAgIGlmIChtUmVzdW1lVG9TdG9wcGluZykgewogICAgICAgICAgICAgICAgIC8vIGhhcHBlbmVkIHdlIG5lZWQgdG8gcmVzdW1lIHRvIFNUT1BQSU5HXzEKICAgICAgICAgICAgICAgICBtU3RhdGUgPSBUcmFja0Jhc2U6OlNUT1BQSU5HXzE7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlBBVVNFRCA9PiBTVE9QUElOR18xICglZCkgb24gdGhyZWFkICVwIiwgbU5hbWUsIHRoaXMpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IFBBVVNFRCA9PiBTVE9QUElOR18xIG9uIHRocmVhZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCAoaW50KW1UaHJlYWRJb0hhbmRsZSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG1TdGF0ZSA9IFRyYWNrQmFzZTo6UkVTVU1JTkc7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlBBVVNFRCA9PiBSRVNVTUlORyAoJWQpIG9uIHRocmVhZCAlcCIsIG1OYW1lLCB0aGlzKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBQQVVTRUQgPT4gUkVTVU1JTkcgb24gdGhyZWFkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAgbUlkLCAoaW50KW1UaHJlYWRJb0hhbmRsZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBtU3RhdGUgPSBUcmFja0Jhc2U6OkFDVElWRTsKLSAgICAgICAgICAgIEFMT0dWKCI/ID0+IEFDVElWRSAoJWQpIG9uIHRocmVhZCAlcCIsIG1OYW1lLCB0aGlzKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6ID8gPT4gQUNUSVZFIG9uIHRocmVhZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKICAgICAgICAgfQogCiAgICAgICAgIC8vIHN0YXRlcyB0byByZXNldCBwb3NpdGlvbiBpbmZvIGZvciBub24tb2ZmbG9hZGVkL2RpcmVjdCB0cmFja3MKQEAgLTc5MCwxMiArOTg3LDE1IEBACiAgICAgfSBlbHNlIHsKICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgIH0KKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIGZvckVhY2hUZWVQYXRjaFRyYWNrKFtdKGF1dG8gcGF0Y2hUcmFjaykgeyBwYXRjaFRyYWNrLT5zdGFydCgpOyB9KTsKKyAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c3RvcCgpCiB7Ci0gICAgQUxPR1YoInN0b3AoJWQpLCBjYWxsaW5nIHBpZCAlZCIsIG1OYW1lLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOworICAgIEFMT0dWKCIlcyglZCk6IGNhbGxpbmcgcGlkICVkIiwgX19mdW5jX18sIG1JZCwgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOwpAQCAtODE5LDE1ICsxMDE5LDE2IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPmJyb2FkY2FzdF9sKCk7Ci0gICAgICAgICAgICBBTE9HVigibm90IHN0b3BwaW5nL3N0b3BwZWQgPT4gc3RvcHBpbmcvc3RvcHBlZCAoJWQpIG9uIHRocmVhZCAlcCIsIG1OYW1lLAotICAgICAgICAgICAgICAgICAgICBwbGF5YmFja1RocmVhZCk7CisgICAgICAgICAgICBBTE9HVigiJXMoJWQpOiBub3Qgc3RvcHBpbmcvc3RvcHBlZCA9PiBzdG9wcGluZy9zdG9wcGVkIG9uIHRocmVhZCAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIChpbnQpbVRocmVhZElvSGFuZGxlKTsKICAgICAgICAgfQogICAgIH0KKyAgICBmb3JFYWNoVGVlUGF0Y2hUcmFjayhbXShhdXRvIHBhdGNoVHJhY2spIHsgcGF0Y2hUcmFjay0+c3RvcCgpOyB9KTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6cGF1c2UoKQogewotICAgIEFMT0dWKCJwYXVzZSglZCksIGNhbGxpbmcgcGlkICVkIiwgbU5hbWUsIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CisgICAgQUxPR1YoIiVzKCVkKTogY2FsbGluZyBwaWQgJWQiLCBfX2Z1bmNfXywgbUlkLCBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCkpOwogICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOwogICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CkBAIC04NDYsNyArMTA0Nyw4IEBACiAgICAgICAgIGNhc2UgQUNUSVZFOgogICAgICAgICBjYXNlIFJFU1VNSU5HOgogICAgICAgICAgICAgbVN0YXRlID0gUEFVU0lORzsKLSAgICAgICAgICAgIEFMT0dWKCJBQ1RJVkUvUkVTVU1JTkcgPT4gUEFVU0lORyAoJWQpIG9uIHRocmVhZCAlcCIsIG1OYW1lLCB0aHJlYWQuZ2V0KCkpOworICAgICAgICAgICAgQUxPR1YoIiVzKCVkKTogQUNUSVZFL1JFU1VNSU5HID0+IFBBVVNJTkcgb24gdGhyZWFkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOwogICAgICAgICAgICAgcGxheWJhY2tUaHJlYWQtPmJyb2FkY2FzdF9sKCk7CiAgICAgICAgICAgICBicmVhazsKIApAQCAtODU0LDExICsxMDU2LDEzIEBACiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KKyAgICAvLyBQYXVzaW5nIHRoZSBUZWVQYXRjaCB0byBhdm9pZCBhIGdsaXRjaCBvbiB1bmRlcnJ1biwgYXQgdGhlIGNvc3Qgb2YgYnVmZmVyZWQgYXVkaW8gbG9zcy4KKyAgICBmb3JFYWNoVGVlUGF0Y2hUcmFjayhbXShhdXRvIHBhdGNoVHJhY2spIHsgcGF0Y2hUcmFjay0+cGF1c2UoKTsgfSk7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmZsdXNoKCkKIHsKLSAgICBBTE9HVigiZmx1c2goJWQpIiwgbU5hbWUpOworICAgIEFMT0dWKCIlcyglZCkiLCBfX2Z1bmNfXywgbUlkKTsKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICBpZiAodGhyZWFkICE9IDApIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOwpAQCAtODgwLDExICsxMDg0LDEyIEBACiAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBBTE9HVigiZmx1c2g6IG9mZmxvYWQgZmx1c2giKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IG9mZmxvYWQgZmx1c2giLCBfX2Z1bmNfXywgbUlkKTsKICAgICAgICAgICAgIHJlc2V0KCk7CiAKICAgICAgICAgICAgIGlmIChtU3RhdGUgPT0gU1RPUFBJTkdfMSB8fCBtU3RhdGUgPT0gU1RPUFBJTkdfMikgewotICAgICAgICAgICAgICAgIEFMT0dWKCJmbHVzaGVkIGluIFNUT1BQSU5HXzEgb3IgMiBzdGF0ZSwgY2hhbmdlIHN0YXRlIHRvIEFDVElWRSIpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IGZsdXNoZWQgaW4gU1RPUFBJTkdfMSBvciAyIHN0YXRlLCBjaGFuZ2Ugc3RhdGUgdG8gQUNUSVZFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQpOwogICAgICAgICAgICAgICAgIG1TdGF0ZSA9IEFDVElWRTsKICAgICAgICAgICAgIH0KIApAQCAtOTE0LDYgKzExMTksOCBAQAogICAgICAgICAvLyBiZWNhdXNlIHRoZSBoYXJkd2FyZSBidWZmZXIgY291bGQgaG9sZCBhIGxhcmdlIGFtb3VudCBvZiBhdWRpbwogICAgICAgICBwbGF5YmFja1RocmVhZC0+YnJvYWRjYXN0X2woKTsKICAgICB9CisgICAgLy8gRmx1c2ggdGhlIFRlZSB0byBhdm9pZCBvbiByZXN1bWUgcGxheWluZyBvbGQgZGF0YSBhbmQgZ2xpdGNoaW5nIG9uIHRoZSB0cmFuc2l0aW9uIHRvIG5ldyBkYXRhCisgICAgZm9yRWFjaFRlZVBhdGNoVHJhY2soW10oYXV0byBwYXRjaFRyYWNrKSB7IHBhdGNoVHJhY2stPmZsdXNoKCk7IH0pOwogfQogCiAvLyBtdXN0IGJlIGNhbGxlZCB3aXRoIHRocmVhZCBsb2NrIGhlbGQKQEAgLTk0OSw3ICsxMTU2LDcgQEAKIHsKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICBpZiAodGhyZWFkID09IDApIHsKLSAgICAgICAgQUxPR0UoInRocmVhZCBpcyBkZWFkIik7CisgICAgICAgIEFMT0dFKCIlcyglZCk6IHRocmVhZCBpcyBkZWFkIiwgX19mdW5jX18sIG1JZCk7CiAgICAgICAgIHJldHVybiBGQUlMRURfVFJBTlNBQ1RJT047CiAgICAgfSBlbHNlIGlmICgodGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6RElSRUNUKSB8fAogICAgICAgICAgICAgICAgICAgICAodGhyZWFkLT50eXBlKCkgPT0gVGhyZWFkQmFzZTo6T0ZGTE9BRCkpIHsKQEAgLTk1OSw2ICsxMTY2LDE5IEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c2VsZWN0UHJlc2VudGF0aW9uKGludCBwcmVzZW50YXRpb25JZCwKKyAgICAgICAgaW50IHByb2dyYW1JZCkgeworICAgIHNwPFRocmVhZEJhc2U+IHRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgPT0gMCkgeworICAgICAgICBBTE9HRSgidGhyZWFkIGlzIGRlYWQiKTsKKyAgICAgICAgcmV0dXJuIEZBSUxFRF9UUkFOU0FDVElPTjsKKyAgICB9IGVsc2UgaWYgKCh0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpESVJFQ1QpIHx8ICh0aHJlYWQtPnR5cGUoKSA9PSBUaHJlYWRCYXNlOjpPRkZMT0FEKSkgeworICAgICAgICBEaXJlY3RPdXRwdXRUaHJlYWQgKmRpcmVjdE91dHB1dFRocmVhZCA9IHN0YXRpY19jYXN0PERpcmVjdE91dHB1dFRocmVhZCo+KHRocmVhZC5nZXQoKSk7CisgICAgICAgIHJldHVybiBkaXJlY3RPdXRwdXRUaHJlYWQtPnNlbGVjdFByZXNlbnRhdGlvbihwcmVzZW50YXRpb25JZCwgcHJvZ3JhbUlkKTsKKyAgICB9CisgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworfQorCiBWb2x1bWVTaGFwZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXBwbHlWb2x1bWVTaGFwZXIoCiAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6Q29uZmlndXJhdGlvbj4mIGNvbmZpZ3VyYXRpb24sCiAgICAgICAgIGNvbnN0IHNwPFZvbHVtZVNoYXBlcjo6T3BlcmF0aW9uPiYgb3BlcmF0aW9uKQpAQCAtOTY5LDggKzExODksMTAgQEAKICAgICAgICAgY29uc3QgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uOjpPcHRpb25GbGFnIG9wdGlvbkZsYWcKICAgICAgICAgICAgID0gY29uZmlndXJhdGlvbi0+Z2V0T3B0aW9uRmxhZ3MoKTsKICAgICAgICAgaWYgKChvcHRpb25GbGFnICYgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uOjpPUFRJT05fRkxBR19DTE9DS19USU1FKSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXMgdHJhY2tzIGRvIG5vdCBzdXBwb3J0IGZyYW1lIGNvdW50ZWQgVm9sdW1lU2hhcGVyLCIKLSAgICAgICAgICAgICAgICAgICAgIiB1c2luZyBjbG9jayB0aW1lIGluc3RlYWQiLCBpc09mZmxvYWRlZCgpID8gIk9mZmxvYWQiIDogIkRpcmVjdCIpOworICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogJXMgdHJhY2tzIGRvIG5vdCBzdXBwb3J0IGZyYW1lIGNvdW50ZWQgVm9sdW1lU2hhcGVyLCIKKyAgICAgICAgICAgICAgICAgICAgIiB1c2luZyBjbG9jayB0aW1lIGluc3RlYWQiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLAorICAgICAgICAgICAgICAgICAgICBpc09mZmxvYWRlZCgpID8gIk9mZmxvYWQiIDogIkRpcmVjdCIpOwogICAgICAgICAgICAgbmV3Q29uZmlndXJhdGlvbiA9IG5ldyBWb2x1bWVTaGFwZXI6OkNvbmZpZ3VyYXRpb24oKmNvbmZpZ3VyYXRpb24pOwogICAgICAgICAgICAgbmV3Q29uZmlndXJhdGlvbi0+c2V0T3B0aW9uRmxhZ3MoCiAgICAgICAgICAgICAgICAgVm9sdW1lU2hhcGVyOjpDb25maWd1cmF0aW9uOjpPcHRpb25GbGFnKG9wdGlvbkZsYWcKQEAgLTk4NSw3ICsxMjA3LDcgQEAKICAgICAgICAgLy8gU2lnbmFsIHRocmVhZCB0byBmZXRjaCBuZXcgdm9sdW1lLgogICAgICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKICAgICAgICAgaWYgKHRocmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOwogICAgICAgICAgICAgdGhyZWFkLT5icm9hZGNhc3RfbCgpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTAxNyw2ICsxMjM5LDExIEBACiAgICAgfTsKIH0KIAordm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6c2V0VGVlUGF0Y2hlcyhUZWVQYXRjaGVzIHRlZVBhdGNoZXMpIHsKKyAgICBmb3JFYWNoVGVlUGF0Y2hUcmFjayhbXShhdXRvIHBhdGNoVHJhY2spIHsgcGF0Y2hUcmFjay0+ZGVzdHJveSgpOyB9KTsKKyAgICBtVGVlUGF0Y2hlcyA9IHN0ZDo6bW92ZSh0ZWVQYXRjaGVzKTsKK30KKwogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OmdldFRpbWVzdGFtcChBdWRpb1RpbWVzdGFtcCYgdGltZXN0YW1wKQogewogICAgIGlmICghaXNPZmZsb2FkZWQoKSAmJiAhaXNEaXJlY3QoKSkgewpAQCAtMTAzNCw1NCArMTI2MSwyNSBAQAogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6YXR0YWNoQXV4RWZmZWN0KGludCBFZmZlY3RJZCkKIHsKLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBERUFEX09CSkVDVDsKICAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVGhyZWFkLnByb21vdGUoKTsKLSAgICBpZiAodGhyZWFkICE9IDApIHsKLSAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOwotICAgICAgICBzcDxBdWRpb0ZsaW5nZXI+IGFmID0gbUNsaWVudC0+YXVkaW9GbGluZ2VyKCk7CisgICAgaWYgKHRocmVhZCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CiAKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKGFmLT5tTG9jayk7CisgICAgc3A8UGxheWJhY2tUaHJlYWQ+IGRzdFRocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICBzcDxQbGF5YmFja1RocmVhZD4gc3JjVGhyZWFkOyAvLyBzcmNUaHJlYWQgaXMgaW5pdGlhbGl6ZWQgYnkgY2FsbCB0byBtb3ZlQXV4RWZmZWN0VG9JbygpCisgICAgc3A8QXVkaW9GbGluZ2VyPiBhZiA9IG1DbGllbnQtPmF1ZGlvRmxpbmdlcigpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGFmLT5tb3ZlQXV4RWZmZWN0VG9JbyhFZmZlY3RJZCwgZHN0VGhyZWFkLCAmc3JjVGhyZWFkKTsKIAotICAgICAgICBzcDxQbGF5YmFja1RocmVhZD4gc3JjVGhyZWFkID0gYWYtPmdldEVmZmVjdFRocmVhZF9sKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwgRWZmZWN0SWQpOwotCi0gICAgICAgIGlmIChFZmZlY3RJZCAhPSAwICYmIHNyY1RocmVhZCAhPSAwICYmIHBsYXliYWNrVGhyZWFkICE9IHNyY1RocmVhZC5nZXQoKSkgewotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9kbChwbGF5YmFja1RocmVhZC0+bUxvY2spOwotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9zbChzcmNUaHJlYWQtPm1Mb2NrKTsKLSAgICAgICAgICAgIHNwPEVmZmVjdENoYWluPiBjaGFpbiA9IHNyY1RocmVhZC0+Z2V0RWZmZWN0Q2hhaW5fbChBVURJT19TRVNTSU9OX09VVFBVVF9NSVgpOwotICAgICAgICAgICAgaWYgKGNoYWluID09IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHNwPEVmZmVjdE1vZHVsZT4gZWZmZWN0ID0gY2hhaW4tPmdldEVmZmVjdEZyb21JZF9sKEVmZmVjdElkKTsKLSAgICAgICAgICAgIGlmIChlZmZlY3QgPT0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNyY1RocmVhZC0+cmVtb3ZlRWZmZWN0X2woZWZmZWN0KTsKLSAgICAgICAgICAgIHN0YXR1cyA9IHBsYXliYWNrVGhyZWFkLT5hZGRFZmZlY3RfbChlZmZlY3QpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHNyY1RocmVhZC0+YWRkRWZmZWN0X2woZWZmZWN0KTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyByZW1vdmVFZmZlY3RfbCgpIGhhcyBzdG9wcGVkIHRoZSBlZmZlY3QgaWYgaXQgd2FzIGFjdGl2ZSBzbyBpdCBtdXN0IGJlIHJlc3RhcnRlZAotICAgICAgICAgICAgaWYgKGVmZmVjdC0+c3RhdGUoKSA9PSBFZmZlY3RNb2R1bGU6OkFDVElWRSB8fAotICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPnN0YXRlKCkgPT0gRWZmZWN0TW9kdWxlOjpTVE9QUElORykgewotICAgICAgICAgICAgICAgIGVmZmVjdC0+c3RhcnQoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3A8RWZmZWN0Q2hhaW4+IGRzdENoYWluID0gZWZmZWN0LT5jaGFpbigpLnByb21vdGUoKTsKLSAgICAgICAgICAgIGlmIChkc3RDaGFpbiA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgc3JjVGhyZWFkLT5hZGRFZmZlY3RfbChlZmZlY3QpOwotICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjp1bnJlZ2lzdGVyRWZmZWN0KGVmZmVjdC0+aWQoKSk7Ci0gICAgICAgICAgICBBdWRpb1N5c3RlbTo6cmVnaXN0ZXJFZmZlY3QoJmVmZmVjdC0+ZGVzYygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY1RocmVhZC0+aWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RDaGFpbi0+c3RyYXRlZ3koKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX09VVFBVVF9NSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0LT5pZCgpKTsKLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzZXRFZmZlY3RFbmFibGVkKGVmZmVjdC0+aWQoKSwgZWZmZWN0LT5pc0VuYWJsZWQoKSk7CisgICAgaWYgKEVmZmVjdElkICE9IDAgJiYgc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIHN0YXR1cyA9IGRzdFRocmVhZC0+YXR0YWNoQXV4RWZmZWN0KHRoaXMsIEVmZmVjdElkKTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgQXVkaW9TeXN0ZW06Om1vdmVFZmZlY3RzVG9JbyhzdGQ6OnZlY3RvcjxpbnQ+KEVmZmVjdElkKSwgZHN0VGhyZWFkLT5pZCgpKTsKICAgICAgICAgfQotICAgICAgICBzdGF0dXMgPSBwbGF5YmFja1RocmVhZC0+YXR0YWNoQXV4RWZmZWN0KHRoaXMsIEVmZmVjdElkKTsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHNyY1RocmVhZCAhPSBudWxscHRyKSB7CisgICAgICAgIGFmLT5tb3ZlQXV4RWZmZWN0VG9JbyhFZmZlY3RJZCwgc3JjVGhyZWFkLCAmZHN0VGhyZWFkKTsKICAgICB9CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KQEAgLTExMDUsMTEgKzEzMDMsMTQgQEAKICAgICAvLyB0byBkZXRlY3Qgd2hlbiBhbGwgZnJhbWVzIGhhdmUgYmVlbiBwbGF5ZWQuIEluIHRoaXMgY2FzZSBmcmFtZXNXcml0dGVuIGlzbid0CiAgICAgLy8gdXNlZnVsIGJlY2F1c2UgaXQgZG9lc24ndCBhbHdheXMgcmVmbGVjdCB3aGV0aGVyIHRoZXJlIGlzIGRhdGEgaW4gdGhlIGgvdwogICAgIC8vIGJ1ZmZlcnMsIHBhcnRpY3VsYXJseSBpZiBhIHRyYWNrIGhhcyBiZWVuIHBhdXNlZCBhbmQgcmVzdW1lZCBkdXJpbmcgZHJhaW5pbmcKLSAgICBBTE9HVigicHJlc2VudGF0aW9uQ29tcGxldGUoKSBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgJWxsZCBmcmFtZXNXcml0dGVuICVsbGQiLAorICAgIEFMT0dWKCIlcyglZCk6IHByZXNlbnRhdGlvbkNvbXBsZXRlKCkgbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzICVsbGQgZnJhbWVzV3JpdHRlbiAlbGxkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCiAgICAgICAgICAgICAobG9uZyBsb25nKW1QcmVzZW50YXRpb25Db21wbGV0ZUZyYW1lcywgKGxvbmcgbG9uZylmcmFtZXNXcml0dGVuKTsKICAgICBpZiAobVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzID09IDApIHsKICAgICAgICAgbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzID0gZnJhbWVzV3JpdHRlbiArIGF1ZGlvSGFsRnJhbWVzOwotICAgICAgICBBTE9HVigicHJlc2VudGF0aW9uQ29tcGxldGUoKSByZXNldDogbVByZXNlbnRhdGlvbkNvbXBsZXRlRnJhbWVzICVsbGQgYXVkaW9IYWxGcmFtZXMgJXp1IiwKKyAgICAgICAgQUxPR1YoIiVzKCVkKTogcHJlc2VudGF0aW9uQ29tcGxldGUoKSByZXNldDoiCisgICAgICAgICAgICAgICAgIiBtUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMgJWxsZCBhdWRpb0hhbEZyYW1lcyAlenUiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCiAgICAgICAgICAgICAgICAgKGxvbmcgbG9uZyltUHJlc2VudGF0aW9uQ29tcGxldGVGcmFtZXMsIGF1ZGlvSGFsRnJhbWVzKTsKICAgICB9CiAKQEAgLTExNzUsNyArMTM3Niw4IEBACiAgICAgaWYgKGlzVGVybWluYXRlZCgpIHx8IG1TdGF0ZSA9PSBQQVVTRUQgfHwKICAgICAgICAgICAgICgoZnJhbWVzUmVhZHkoKSA9PSAwKSAmJiAoKG1TaGFyZWRCdWZmZXIgIT0gMCkgfHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1TdGF0ZSA9PSBTVE9QUEVEKSkpKSB7Ci0gICAgICAgIEFMT0dXKCJUcmFjazo6c2V0U3luY0V2ZW50KCkgaW4gaW52YWxpZCBzdGF0ZSAlZCBvbiBzZXNzaW9uICVkICVzIG1vZGUsIGZyYW1lc1JlYWR5ICV6dSIsCisgICAgICAgIEFMT0dXKCIlcyglZCk6IGluIGludmFsaWQgc3RhdGUgJWQgb24gc2Vzc2lvbiAlZCAlcyBtb2RlLCBmcmFtZXNSZWFkeSAlenUiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLAogICAgICAgICAgICAgICBtU3RhdGUsIG1TZXNzaW9uSWQsIChtU2hhcmVkQnVmZmVyICE9IDApID8gInN0YXRpYyIgOiAic3RyZWFtIiwgZnJhbWVzUmVhZHkoKSk7CiAgICAgICAgIGV2ZW50LT5jYW5jZWwoKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTE5Miw2ICsxMzk0LDcgQEAKIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpUcmFjazo6ZGlzYWJsZSgpCiB7CisgICAgLy8gVE9ETyhiLzE0MjM5NDg4OCk6IHRoZSBmaWxsaW5nIHN0YXR1cyBzaG91bGQgYWxzbyBiZSByZXNldCB0byBmaWxsaW5nCiAgICAgc2lnbmFsQ2xpZW50RmxhZyhDQkxLX0RJU0FCTEVEKTsKIH0KIApAQCAtMTI0Niw3ICsxNDQ5LDE3IEBACiAvL1RvIGJlIGNhbGxlZCB3aXRoIHRocmVhZCBsb2NrIGhlbGQKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OnVwZGF0ZVRyYWNrRnJhbWVJbmZvKAogICAgICAgICBpbnQ2NF90IHRyYWNrRnJhbWVzUmVsZWFzZWQsIGludDY0X3Qgc2lua0ZyYW1lc1dyaXR0ZW4sCi0gICAgICAgIGNvbnN0IEV4dGVuZGVkVGltZXN0YW1wICZ0aW1lU3RhbXApIHsKKyAgICAgICAgdWludDMyX3QgaGFsU2FtcGxlUmF0ZSwgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVTdGFtcCkgeworICAgLy8gTWFrZSB0aGUga2VybmVsIGZyYW1ldGltZSBhdmFpbGFibGUuCisgICAgY29uc3QgRnJhbWVUaW1lIGZ0eworICAgICAgICAgICAgdGltZVN0YW1wLm1Qb3NpdGlvbltFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXSwKKyAgICAgICAgICAgIHRpbWVTdGFtcC5tVGltZU5zW0V4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9LRVJORUxdfTsKKyAgICAvLyBBTE9HRCgiRnJhbWVUaW1lOiAlbGxkICVsbGQiLCAobG9uZyBsb25nKWZ0LmZyYW1lcywgKGxvbmcgbG9uZylmdC50aW1lTnMpOworICAgIG1LZXJuZWxGcmFtZVRpbWUuc3RvcmUoZnQpOworICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgLy91cGRhdGUgZnJhbWUgbWFwCiAgICAgbUZyYW1lTWFwLnB1c2godHJhY2tGcmFtZXNSZWxlYXNlZCwgc2lua0ZyYW1lc1dyaXR0ZW4pOwogCkBAIC0xMjU1LDYgKzE0NjgsNyBAQAogICAgIC8vIE91ciB0aW1lc3RhbXBzIGFyZSBvbmx5IHVwZGF0ZWQgd2hlbiB0aGUgdHJhY2sgaXMgb24gdGhlIFRocmVhZCBhY3RpdmUgbGlzdC4KICAgICAvLyBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRyYWNrcyBhcmUgbm90IHJlbW92ZWQgYmVmb3JlIGZ1bGwgZHJhaW4uCiAgICAgRXh0ZW5kZWRUaW1lc3RhbXAgbG9jYWwgPSB0aW1lU3RhbXA7CisgICAgYm9vbCBkcmFpbmVkID0gdHJ1ZTsgLy8gZGVmYXVsdCBhc3N1bWUgZHJhaW5lZCwgaWYgbm8gc2VydmVyIGluZm8gZm91bmQKICAgICBib29sIGNoZWNrZWQgPSBmYWxzZTsKICAgICBmb3IgKGludCBpID0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX01BWCAtIDE7CiAgICAgICAgICAgICBpID49IEV4dGVuZGVkVGltZXN0YW1wOjpMT0NBVElPTl9TRVJWRVI7IC0taSkgewpAQCAtMTI2MywyMSArMTQ3Nyw2NCBAQAogICAgICAgICAgICAgbG9jYWwubVBvc2l0aW9uW2ldID0gbUZyYW1lTWFwLmZpbmRYKGxvY2FsLm1Qb3NpdGlvbltpXSk7CiAgICAgICAgICAgICAvLyBjaGVjayBkcmFpbiBzdGF0ZSBmcm9tIHRoZSBsYXRlc3Qgc3RhZ2UgaW4gdGhlIHBpcGVsaW5lLgogICAgICAgICAgICAgaWYgKCFjaGVja2VkICYmIGkgPD0gRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTCkgewotICAgICAgICAgICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnNldERyYWluZWQoCi0gICAgICAgICAgICAgICAgICAgICAgICBsb2NhbC5tUG9zaXRpb25baV0gPj0gbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+ZnJhbWVzUmVsZWFzZWQoKSk7CisgICAgICAgICAgICAgICAgZHJhaW5lZCA9IGxvY2FsLm1Qb3NpdGlvbltpXSA+PSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNSZWxlYXNlZCgpOwogICAgICAgICAgICAgICAgIGNoZWNrZWQgPSB0cnVlOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotICAgIGlmICghY2hlY2tlZCkgeyAvLyBubyBzZXJ2ZXIgaW5mbywgYXNzdW1lIGRyYWluZWQuCi0gICAgICAgIG1BdWRpb1RyYWNrU2VydmVyUHJveHktPnNldERyYWluZWQodHJ1ZSk7Ci0gICAgfQorCisgICAgbUF1ZGlvVHJhY2tTZXJ2ZXJQcm94eS0+c2V0RHJhaW5lZChkcmFpbmVkKTsKICAgICAvLyBTZXQgY29ycmVjdGlvbiBmb3IgZmx1c2hlZCBmcmFtZXMgdGhhdCBhcmUgbm90IGFjY291bnRlZCBmb3IgaW4gcmVsZWFzZWQuCiAgICAgbG9jYWwubUZsdXNoZWQgPSBtQXVkaW9UcmFja1NlcnZlclByb3h5LT5mcmFtZXNGbHVzaGVkKCk7CiAgICAgbVNlcnZlclByb3h5LT5zZXRUaW1lc3RhbXAobG9jYWwpOworCisgICAgLy8gQ29tcHV0ZSBsYXRlbmN5IGluZm8uCisgICAgY29uc3QgYm9vbCB1c2VUcmFja1RpbWVzdGFtcCA9ICFkcmFpbmVkOworICAgIGNvbnN0IGRvdWJsZSBsYXRlbmN5TXMgPSB1c2VUcmFja1RpbWVzdGFtcAorICAgICAgICAgICAgPyBsb2NhbC5nZXRPdXRwdXRTZXJ2ZXJMYXRlbmN5TXMoc2FtcGxlUmF0ZSgpKQorICAgICAgICAgICAgOiB0aW1lU3RhbXAuZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKGhhbFNhbXBsZVJhdGUpOworCisgICAgbVNlcnZlckxhdGVuY3lGcm9tVHJhY2suc3RvcmUodXNlVHJhY2tUaW1lc3RhbXApOworICAgIG1TZXJ2ZXJMYXRlbmN5TXMuc3RvcmUobGF0ZW5jeU1zKTsKK30KKworYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OkF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcjo6bXV0ZSgKKyAgICAgICAgLypvdXQqLyBib29sICpyZXQpIHsKKyAgICAqcmV0ID0gZmFsc2U7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRyYWNrLT5tVGhyZWFkLnByb21vdGUoKTsKKyAgICBpZiAodGhyZWFkICE9IDApIHsKKyAgICAgICAgLy8gTG9jayBmb3IgdXBkYXRpbmcgbUhhcHRpY1BsYXliYWNrRW5hYmxlZC4KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOworICAgICAgICBQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQgPSAoUGxheWJhY2tUaHJlYWQgKil0aHJlYWQuZ2V0KCk7CisgICAgICAgIGlmICgobVRyYWNrLT5jaGFubmVsTWFzaygpICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSAhPSBBVURJT19DSEFOTkVMX05PTkUKKyAgICAgICAgICAgICAgICAmJiBwbGF5YmFja1RocmVhZC0+bUhhcHRpY0NoYW5uZWxDb3VudCA+IDApIHsKKyAgICAgICAgICAgIG1UcmFjay0+c2V0SGFwdGljUGxheWJhY2tFbmFibGVkKGZhbHNlKTsKKyAgICAgICAgICAgICpyZXQgPSB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6VHJhY2s6OkF1ZGlvVmlicmF0aW9uQ29udHJvbGxlcjo6dW5tdXRlKAorICAgICAgICAvKm91dCovIGJvb2wgKnJldCkgeworICAgICpyZXQgPSBmYWxzZTsKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQgPSBtVHJhY2stPm1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICh0aHJlYWQgIT0gMCkgeworICAgICAgICAvLyBMb2NrIGZvciB1cGRhdGluZyBtSGFwdGljUGxheWJhY2tFbmFibGVkLgorICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wodGhyZWFkLT5tTG9jayk7CisgICAgICAgIFBsYXliYWNrVGhyZWFkICpwbGF5YmFja1RocmVhZCA9IChQbGF5YmFja1RocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgaWYgKChtVHJhY2stPmNoYW5uZWxNYXNrKCkgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpICE9IEFVRElPX0NIQU5ORUxfTk9ORQorICAgICAgICAgICAgICAgICYmIHBsYXliYWNrVGhyZWFkLT5tSGFwdGljQ2hhbm5lbENvdW50ID4gMCkgeworICAgICAgICAgICAgbVRyYWNrLT5zZXRIYXB0aWNQbGF5YmFja0VuYWJsZWQodHJ1ZSk7CisgICAgICAgICAgICAqcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpPdXRwdXRUcmFjayIKIAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2s6Ok91dHB1dFRyYWNrKAogICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkLApAQCAtMTI5MSw3ICsxNTQ4LDcgQEAKICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190e30gLyogY3VycmVudGx5IHVudXNlZCBmb3Igb3V0cHV0IHRyYWNrICovLAogICAgICAgICAgICAgICBzYW1wbGVSYXRlLCBmb3JtYXQsIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LAogICAgICAgICAgICAgICBudWxscHRyIC8qIGJ1ZmZlciAqLywgKHNpemVfdCkwIC8qIGJ1ZmZlclNpemUgKi8sIG51bGxwdHIgLyogc2hhcmVkQnVmZmVyICovLAotICAgICAgICAgICAgICBBVURJT19TRVNTSU9OX05PTkUsIHVpZCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9OT05FLCBnZXRwaWQoKSwgdWlkLCBBVURJT19PVVRQVVRfRkxBR19OT05FLAogICAgICAgICAgICAgICBUWVBFX09VVFBVVCksCiAgICAgbUFjdGl2ZShmYWxzZSksIG1Tb3VyY2VUaHJlYWQoc291cmNlVGhyZWFkKQogewpAQCAtMTI5OSw5ICsxNTU2LDkgQEAKICAgICBpZiAobUNibGsgIT0gTlVMTCkgewogICAgICAgICBtT3V0QnVmZmVyLmZyYW1lQ291bnQgPSAwOwogICAgICAgICBwbGF5YmFja1RocmVhZC0+bVRyYWNrcy5hZGQodGhpcyk7Ci0gICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjayBjb25zdHJ1Y3RvciBtQ2JsayAlcCwgbUJ1ZmZlciAlcCwgIgorICAgICAgICBBTE9HVigiJXMoKTogbUNibGsgJXAsIG1CdWZmZXIgJXAsICIKICAgICAgICAgICAgICAgICAiZnJhbWVDb3VudCAlenUsIG1DaGFubmVsTWFzayAweCUwOHgiLAotICAgICAgICAgICAgICAgIG1DYmxrLCBtQnVmZmVyLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtQ2JsaywgbUJ1ZmZlciwKICAgICAgICAgICAgICAgICBmcmFtZUNvdW50LCBtQ2hhbm5lbE1hc2spOwogICAgICAgICAvLyBzaW5jZSBjbGllbnQgYW5kIHNlcnZlciBhcmUgaW4gdGhlIHNhbWUgcHJvY2VzcywKICAgICAgICAgLy8gdGhlIGJ1ZmZlciBoYXMgdGhlIHNhbWUgdmlydHVhbCBhZGRyZXNzIG9uIGJvdGggc2lkZXMKQEAgLTEzMTEsNyArMTU2OCw4IEBACiAgICAgICAgIG1DbGllbnRQcm94eS0+c2V0U2VuZExldmVsKDAuMCk7CiAgICAgICAgIG1DbGllbnRQcm94eS0+c2V0U2FtcGxlUmF0ZShzYW1wbGVSYXRlKTsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiRXJyb3IgY3JlYXRpbmcgb3V0cHV0IHRyYWNrIG9uIHRocmVhZCAlcCIsIHBsYXliYWNrVGhyZWFkKTsKKyAgICAgICAgQUxPR1coIiVzKCVkKTogRXJyb3IgY3JlYXRpbmcgb3V0cHV0IHRyYWNrIG9uIHRocmVhZCAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgKGludCltVGhyZWFkSW9IYW5kbGUpOwogICAgIH0KIH0KIApAQCAtMTM0Miw3ICsxNjAwLDcgQEAKICAgICBtQWN0aXZlID0gZmFsc2U7CiB9CiAKLWJvb2wgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2s6OndyaXRlKHZvaWQqIGRhdGEsIHVpbnQzMl90IGZyYW1lcykKK3NzaXplX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6T3V0cHV0VHJhY2s6OndyaXRlKHZvaWQqIGRhdGEsIHVpbnQzMl90IGZyYW1lcykKIHsKICAgICBCdWZmZXIgKnBJbkJ1ZmZlcjsKICAgICBCdWZmZXIgaW5CdWZmZXI7CkBAIC0xMzczLDggKzE2MzEsOSBAQAogICAgICAgICAgICAgbnNlY3NfdCBzdGFydFRpbWUgPSBzeXN0ZW1UaW1lKCk7CiAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBvYnRhaW5CdWZmZXIoJm1PdXRCdWZmZXIsIHdhaXRUaW1lTGVmdE1zKTsKICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgJiYgc3RhdHVzICE9IE5PVF9FTk9VR0hfREFUQSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgbm8gbW9yZSBvdXRwdXQgYnVmZmVyczsgc3RhdHVzICVkIiwgdGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1UaHJlYWQudW5zYWZlX2dldCgpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHRocmVhZCAlZCBubyBtb3JlIG91dHB1dCBidWZmZXJzOyBzdGF0dXMgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIChpbnQpbVRocmVhZElvSGFuZGxlLCBzdGF0dXMpOwogICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlckZ1bGwgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTQxMCw4ICsxNjY5LDkgQEAKICAgICAgICAgICAgICAgICBpZiAocEluQnVmZmVyICE9ICZpbkJ1ZmZlcikgewogICAgICAgICAgICAgICAgICAgICBkZWxldGUgcEluQnVmZmVyOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVigiT3V0cHV0VHJhY2s6OndyaXRlKCkgJXAgdGhyZWFkICVwIHJlbGVhc2VkIG92ZXJmbG93IGJ1ZmZlciAlenUiLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZC51bnNhZmVfZ2V0KCksIG1CdWZmZXJRdWV1ZS5zaXplKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHRocmVhZCAlZCByZWxlYXNlZCBvdmVyZmxvdyBidWZmZXIgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KW1UaHJlYWRJb0hhbmRsZSwgbUJ1ZmZlclF1ZXVlLnNpemUoKSk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQpAQCAtMTQyOSwxMSArMTY4OSwxNCBAQAogICAgICAgICAgICAgICAgIHBJbkJ1ZmZlci0+cmF3ID0gcEluQnVmZmVyLT5tQnVmZmVyOwogICAgICAgICAgICAgICAgIG1lbWNweShwSW5CdWZmZXItPnJhdywgaW5CdWZmZXIucmF3LCBpbkJ1ZmZlci5mcmFtZUNvdW50ICogbUZyYW1lU2l6ZSk7CiAgICAgICAgICAgICAgICAgbUJ1ZmZlclF1ZXVlLmFkZChwSW5CdWZmZXIpOwotICAgICAgICAgICAgICAgIEFMT0dWKCJPdXRwdXRUcmFjazo6d3JpdGUoKSAlcCB0aHJlYWQgJXAgYWRkaW5nIG92ZXJmbG93IGJ1ZmZlciAlenUiLCB0aGlzLAotICAgICAgICAgICAgICAgICAgICAgICAgbVRocmVhZC51bnNhZmVfZ2V0KCksIG1CdWZmZXJRdWV1ZS5zaXplKCkpOworICAgICAgICAgICAgICAgIEFMT0dWKCIlcyglZCk6IHRocmVhZCAlZCBhZGRpbmcgb3ZlcmZsb3cgYnVmZmVyICV6dSIsIF9fZnVuY19fLCBtSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAoaW50KW1UaHJlYWRJb0hhbmRsZSwgbUJ1ZmZlclF1ZXVlLnNpemUoKSk7CisgICAgICAgICAgICAgICAgLy8gYXVkaW8gZGF0YSBpcyBjb25zdW1lZCAoc3RvcmVkIGxvY2FsbHkpOyBzZXQgZnJhbWVDb3VudCB0byAwLgorICAgICAgICAgICAgICAgIGluQnVmZmVyLmZyYW1lQ291bnQgPSAwOwogICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiT3V0cHV0VHJhY2s6OndyaXRlKCkgJXAgdGhyZWFkICVwIG5vIG1vcmUgb3ZlcmZsb3cgYnVmZmVycyIsCi0gICAgICAgICAgICAgICAgICAgICAgICBtVGhyZWFkLnVuc2FmZV9nZXQoKSwgdGhpcyk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCVkKTogdGhyZWFkICVkIG5vIG1vcmUgb3ZlcmZsb3cgYnVmZmVycyIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCAoaW50KW1UaHJlYWRJb0hhbmRsZSk7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogcmV0dXJuIGVycm9yIGZvciB0aGlzLgogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMTQ0NCw3ICsxNzA3LDcgQEAKICAgICAgICAgc3RvcCgpOwogICAgIH0KIAotICAgIHJldHVybiBvdXRwdXRCdWZmZXJGdWxsOworICAgIHJldHVybiBmcmFtZXMgLSBpbkJ1ZmZlci5mcmFtZUNvdW50OyAgLy8gbnVtYmVyIG9mIGZyYW1lcyBjb25zdW1lZC4KIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlBsYXliYWNrVGhyZWFkOjpPdXRwdXRUcmFjazo6Y29weU1ldGFkYXRhVG8oTWV0YWRhdGFJbnNlcnRlciYgYmFja0luc2VydGVyKSBjb25zdApAQCAtMTQ5Niw2ICsxNzU5LDEwIEBACiAgICAgfQogfQogCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6UGF0Y2hUcmFjayIKKwogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6UGF0Y2hUcmFjayhQbGF5YmFja1RocmVhZCAqcGxheWJhY2tUaHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKQEAgLTE1MDQsMzEgKzE3NzEsNDAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGltZW91dCYgdGltZW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lQ291bnRUb0JlUmVhZHkpCiAgICAgOiAgIFRyYWNrKHBsYXliYWNrVGhyZWFkLCBOVUxMLCBzdHJlYW1UeXBlLAogICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3R7fSAvKiBjdXJyZW50bHkgdW51c2VkIGZvciBwYXRjaCB0cmFjayAqLywKICAgICAgICAgICAgICAgc2FtcGxlUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmZXJTaXplLCBudWxscHRyIC8qIHNoYXJlZEJ1ZmZlciAqLywKLSAgICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9OT05FLCBnZXR1aWQoKSwgZmxhZ3MsIFRZUEVfUEFUQ0gpLAotICAgICAgICAgICAgICBtUHJveHkobmV3IENsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplLCB0cnVlLCB0cnVlKSkKKyAgICAgICAgICAgICAgQVVESU9fU0VTU0lPTl9OT05FLCBnZXRwaWQoKSwgQUlEX0FVRElPU0VSVkVSLCBmbGFncywgVFlQRV9QQVRDSCwKKyAgICAgICAgICAgICAgQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwgZnJhbWVDb3VudFRvQmVSZWFkeSksCisgICAgICAgIFBhdGNoVHJhY2tCYXNlKG5ldyBDbGllbnRQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSwgdHJ1ZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICpwbGF5YmFja1RocmVhZCwgdGltZW91dCkKIHsKLSAgICB1aW50NjRfdCBtaXhCdWZmZXJOcyA9ICgodWludDY0X3QpMiAqIHBsYXliYWNrVGhyZWFkLT5mcmFtZUNvdW50KCkgKiAxMDAwMDAwMDAwKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYXliYWNrVGhyZWFkLT5zYW1wbGVSYXRlKCk7Ci0gICAgbVBlZXJUaW1lb3V0LnR2X3NlYyA9IG1peEJ1ZmZlck5zIC8gMTAwMDAwMDAwMDsKLSAgICBtUGVlclRpbWVvdXQudHZfbnNlYyA9IChpbnQpIChtaXhCdWZmZXJOcyAlIDEwMDAwMDAwMDApOwotCi0gICAgQUxPR1YoIlBhdGNoVHJhY2sgJXAgc2FtcGxlUmF0ZSAlZCBtUGVlclRpbWVvdXQgJWQuJTAzZCBzZWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBzYW1wbGVSYXRlLAorICAgIEFMT0dWKCIlcyglZCk6IHNhbXBsZVJhdGUgJWQgbVBlZXJUaW1lb3V0ICVkLiUwM2Qgc2VjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCltUGVlclRpbWVvdXQudHZfc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShtUGVlclRpbWVvdXQudHZfbnNlYyAvIDEwMDAwMDApKTsKIH0KIAogQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6flBhdGNoVHJhY2soKQogeworICAgIEFMT0dWKCIlcyglZCkiLCBfX2Z1bmNfXywgbUlkKTsKK30KKworc2l6ZV90IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OmZyYW1lc1JlYWR5KCkgY29uc3QKK3sKKyAgICBpZiAobVBlZXJQcm94eSAmJiBtUGVlclByb3h5LT5wcm9kdWNlc0J1ZmZlck9uRGVtYW5kKCkpIHsKKyAgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIFRyYWNrOjpmcmFtZXNSZWFkeSgpOworICAgIH0KIH0KIAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6c3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgdHJpZ2dlclNlc3Npb24pCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVHJhY2s6OnN0YXJ0KGV2ZW50LCB0cmlnZ2VyU2Vzc2lvbik7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewpAQCAtMTU0MiwxMiArMTgxOCwyMiBAQAogc3RhdHVzX3QgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6Z2V0TmV4dEJ1ZmZlcigKICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCiB7Ci0gICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiUGF0Y2hUcmFjazo6Z2V0TmV4dEJ1ZmZlcigpIGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiKTsKKyAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICIlcyglZCk6IGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiLCBfX2Z1bmNfXywgbUlkKTsKICAgICBQcm94eTo6QnVmZmVyIGJ1ZjsKICAgICBidWYubUZyYW1lQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CisgICAgaWYgKEFUUkFDRV9FTkFCTEVEKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgdHJhY2VOYW1lKCJQVG5SZXEiKTsKKyAgICAgICAgdHJhY2VOYW1lICs9IHN0ZDo6dG9fc3RyaW5nKGlkKCkpOworICAgICAgICBBVFJBQ0VfSU5UKHRyYWNlTmFtZS5jX3N0cigpLCBidWYubUZyYW1lQ291bnQpOworICAgIH0KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtUGVlclByb3h5LT5vYnRhaW5CdWZmZXIoJmJ1ZiwgJm1QZWVyVGltZW91dCk7Ci0gICAgQUxPR1ZfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAiUGF0Y2hUcmFjaygpICVwIGdldE5leHRCdWZmZXIgc3RhdHVzICVkIiwgdGhpcywgc3RhdHVzKTsKKyAgICBBTE9HVl9JRihzdGF0dXMgIT0gTk9fRVJST1IsICIlcyglZCk6IGdldE5leHRCdWZmZXIgc3RhdHVzICVkIiwgX19mdW5jX18sIG1JZCwgc3RhdHVzKTsKICAgICBidWZmZXItPmZyYW1lQ291bnQgPSBidWYubUZyYW1lQ291bnQ7CisgICAgaWYgKEFUUkFDRV9FTkFCTEVEKCkpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgdHJhY2VOYW1lKCJQVG5PYnQiKTsKKyAgICAgICAgdHJhY2VOYW1lICs9IHN0ZDo6dG9fc3RyaW5nKGlkKCkpOworICAgICAgICBBVFJBQ0VfSU5UKHRyYWNlTmFtZS5jX3N0cigpLCBidWYubUZyYW1lQ291bnQpOworICAgIH0KICAgICBpZiAoYnVmLm1GcmFtZUNvdW50ID09IDApIHsKICAgICAgICAgcmV0dXJuIFdPVUxEX0JMT0NLOwogICAgIH0KQEAgLTE1NTcsNyArMTg0Myw3IEBACiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpQbGF5YmFja1RocmVhZDo6UGF0Y2hUcmFjazo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKLSAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFRyYWNrOjpyZWxlYXNlQnVmZmVyKCkgY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIpOworICAgIEFMT0dfQVNTRVJUKG1QZWVyUHJveHkgIT0gMCwgIiVzKCVkKTogY2FsbGVkIHdpdGhvdXQgcGVlciBwcm94eSIsIF9fZnVuY19fLCBtSWQpOwogICAgIFByb3h5OjpCdWZmZXIgYnVmOwogICAgIGJ1Zi5tRnJhbWVDb3VudCA9IGJ1ZmZlci0+ZnJhbWVDb3VudDsKICAgICBidWYubVJhdyA9IGJ1ZmZlci0+cmF3OwpAQCAtMTU4NiwxMyArMTg3MiwzMSBAQAogewogICAgIG1Qcm94eS0+cmVsZWFzZUJ1ZmZlcihidWZmZXIpOwogICAgIHJlc3RhcnRJZkRpc2FibGVkKCk7Ci0gICAgYW5kcm9pZF9hdG9taWNfb3IoQ0JMS19GT1JDRVJFQURZLCAmbUNibGstPm1GbGFncyk7CisKKyAgICAvLyBDaGVjayBpZiB0aGUgUGF0Y2hUcmFjayBoYXMgZW5vdWdoIGRhdGEgdG8gd3JpdGUgb25jZSBpbiByZWxlYXNlQnVmZmVyKCkuCisgICAgLy8gSWYgbm90LCBwcmV2ZW50IGFuIHVuZGVycnVuIGZyb20gb2NjdXJyaW5nIGJ5IG1vdmluZyB0aGUgdHJhY2sgaW50byBGU19GSUxMSU5HOworICAgIC8vIHRoaXMgbG9naWMgYXZvaWRzIGdsaXRjaGVzIHdoZW4gc3VzcGVuZGluZyBBMkRQIHdpdGggQXVkaW9QbGF5YmFja0NhcHR1cmUuCisgICAgLy8gVE9ETzogcGVyaGFwcyB1bmRlcnJ1biBhdm9pZGFuY2UgY291bGQgYmUgYSB0cmFjayBwcm9wZXJ0eSBjaGVja2VkIGluIGlzUmVhZHkoKSBpbnN0ZWFkLgorICAgIGlmIChtRmlsbGluZ1VwU3RhdHVzID09IEZTX0FDVElWRQorICAgICAgICAgICAgJiYgYXVkaW9faXNfbGluZWFyX3BjbShtRm9ybWF0KQorICAgICAgICAgICAgJiYgIWlzT2ZmbG9hZGVkT3JEaXJlY3QoKSkgeworICAgICAgICBpZiAoc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgICAgICAgICB0aHJlYWQgIT0gMCkgeworICAgICAgICAgICAgUGxheWJhY2tUaHJlYWQgKnBsYXliYWNrVGhyZWFkID0gKFBsYXliYWNrVGhyZWFkICopdGhyZWFkLmdldCgpOworICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGZyYW1lQ291bnQgPSBwbGF5YmFja1RocmVhZC0+ZnJhbWVDb3VudCgpICogc2FtcGxlUmF0ZSgpCisgICAgICAgICAgICAgICAgICAgIC8gcGxheWJhY2tUaHJlYWQtPnNhbXBsZVJhdGUoKTsKKyAgICAgICAgICAgIGlmIChmcmFtZXNSZWFkeSgpIDwgZnJhbWVDb3VudCkgeworICAgICAgICAgICAgICAgIEFMT0dEKCIlcyglZCkgTm90IGVub3VnaCBkYXRhLCB3YWl0IGZvciBidWZmZXIgdG8gZmlsbCIsIF9fZnVuY19fLCBtSWQpOworICAgICAgICAgICAgICAgIG1GaWxsaW5nVXBTdGF0dXMgPSBGU19GSUxMSU5HOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlBhdGNoVHJhY2s6OnJlc3RhcnRJZkRpc2FibGVkKCkKIHsKICAgICBpZiAoYW5kcm9pZF9hdG9taWNfYW5kKH5DQkxLX0RJU0FCTEVELCAmbUNibGstPm1GbGFncykgJiBDQkxLX0RJU0FCTEVEKSB7Ci0gICAgICAgIEFMT0dXKCJQYXRjaFRyYWNrOjpyZWxlYXNlQnVmZmVyKCkgZGlzYWJsZWQgZHVlIHRvIHByZXZpb3VzIHVuZGVycnVuLCByZXN0YXJ0aW5nIik7CisgICAgICAgIEFMT0dXKCIlcyglZCk6IGRpc2FibGVkIGR1ZSB0byBwcmV2aW91cyB1bmRlcnJ1biwgcmVzdGFydGluZyIsIF9fZnVuY19fLCBtSWQpOwogICAgICAgICBzdGFydCgpOwogICAgIH0KIH0KQEAgLTE2MDEsNiArMTkwNSwxMDcgQEAKIC8vICAgICAgUmVjb3JkCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gICAgICBBcHBPcCBmb3IgYXVkaW8gcmVjb3JkaW5nCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpPcFJlY29yZEF1ZGlvTW9uaXRvciIKKworLy8gc3RhdGljCitzcDxBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6T3BSZWNvcmRBdWRpb01vbml0b3I+CitBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6T3BSZWNvcmRBdWRpb01vbml0b3I6OmNyZWF0ZUlmTmVlZGVkKAorICAgICAgICAgICAgdWlkX3QgdWlkLCBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSkKK3sKKyAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHsKKyAgICAgICAgQUxPR1YoIm5vdCBzaWxlbmNpbmcgcmVjb3JkIGZvciBzZXJ2aWNlIHVpZDolZCBwYWNrOiVzIiwKKyAgICAgICAgICAgICAgICB1aWQsIFN0cmluZzgob3BQYWNrYWdlTmFtZSkuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBpZiAob3BQYWNrYWdlTmFtZS5zaXplKCkgPT0gMCkgeworICAgICAgICBWZWN0b3I8U3RyaW5nMTY+IHBhY2thZ2VzOworICAgICAgICAvLyBubyBwYWNrYWdlIG5hbWUsIGhhcHBlbnMgd2l0aCBTTCBFUyBjbGllbnRzCisgICAgICAgIC8vIHF1ZXJ5IHBhY2thZ2UgbWFuYWdlciB0byBmaW5kIG9uZQorICAgICAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwZXJtaXNzaW9uQ29udHJvbGxlcjsKKyAgICAgICAgcGVybWlzc2lvbkNvbnRyb2xsZXIuZ2V0UGFja2FnZXNGb3JVaWQodWlkLCBwYWNrYWdlcyk7CisgICAgICAgIGlmIChwYWNrYWdlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoInVzaW5nIHBhY2s6JXMgZm9yIHVpZDolZCIsIFN0cmluZzgocGFja2FnZXNbMF0pLnN0cmluZygpLCB1aWQpOworICAgICAgICAgICAgcmV0dXJuIG5ldyBPcFJlY29yZEF1ZGlvTW9uaXRvcih1aWQsIHBhY2thZ2VzWzBdKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuZXcgT3BSZWNvcmRBdWRpb01vbml0b3IodWlkLCBvcFBhY2thZ2VOYW1lKTsKK30KKworQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6Ok9wUmVjb3JkQXVkaW9Nb25pdG9yOjpPcFJlY29yZEF1ZGlvTW9uaXRvcigKKyAgICAgICAgdWlkX3QgdWlkLCBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSkKKyAgICAgICAgOiBtSGFzT3BSZWNvcmRBdWRpbyh0cnVlKSwgbVVpZCh1aWQpLCBtUGFja2FnZShvcFBhY2thZ2VOYW1lKQoreworfQorCitBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6T3BSZWNvcmRBdWRpb01vbml0b3I6On5PcFJlY29yZEF1ZGlvTW9uaXRvcigpCit7CisgICAgaWYgKG1PcENhbGxiYWNrICE9IDApIHsKKyAgICAgICAgbUFwcE9wc01hbmFnZXIuc3RvcFdhdGNoaW5nTW9kZShtT3BDYWxsYmFjayk7CisgICAgfQorICAgIG1PcENhbGxiYWNrLmNsZWFyKCk7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6Ok9wUmVjb3JkQXVkaW9Nb25pdG9yOjpvbkZpcnN0UmVmKCkKK3sKKyAgICBjaGVja1JlY29yZEF1ZGlvKCk7CisgICAgbU9wQ2FsbGJhY2sgPSBuZXcgUmVjb3JkQXVkaW9PcENhbGxiYWNrKHRoaXMpOworICAgIEFMT0dWKCJzdGFydCB3YXRjaGluZyBPUF9SRUNPUkRfQVVESU8gZm9yIHBhY2s6JXMiLCBTdHJpbmc4KG1QYWNrYWdlKS5zdHJpbmcoKSk7CisgICAgbUFwcE9wc01hbmFnZXIuc3RhcnRXYXRjaGluZ01vZGUoQXBwT3BzTWFuYWdlcjo6T1BfUkVDT1JEX0FVRElPLCBtUGFja2FnZSwgbU9wQ2FsbGJhY2spOworfQorCitib29sIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpPcFJlY29yZEF1ZGlvTW9uaXRvcjo6aGFzT3BSZWNvcmRBdWRpbygpIGNvbnN0IHsKKyAgICByZXR1cm4gbUhhc09wUmVjb3JkQXVkaW8ubG9hZCgpOworfQorCisvLyBDYWxsZWQgYnkgUmVjb3JkQXVkaW9PcENhbGxiYWNrIHdoZW4gT1BfUkVDT1JEX0FVRElPIGlzIHVwZGF0ZWQgaW4gQXBwT3AgY2FsbGJhY2sKKy8vIGFuZCBpbiBvbkZpcnN0UmVmKCkKKy8vIE5vdGUgdGhpcyBtZXRob2QgaXMgbmV2ZXIgY2FsbGVkIChhbmQgbmV2ZXIgdG8gYmUpIGZvciBhdWRpbyBzZXJ2ZXIgLyByb290IHRyYWNrCisvLyBkdWUgdG8gdGhlIFVJRCBpbiBjcmVhdGVJZk5lZWRlZCgpLiBBcyBhIHJlc3VsdCBmb3IgdGhvc2UgcmVjb3JkIHRyYWNrLCBpdCdzOgorLy8gLSBub3QgY2FsbGVkIGZyb20gY29uc3RydWN0b3IsCisvLyAtIG5vdCBjYWxsZWQgZnJvbSBSZWNvcmRBdWRpb09wQ2FsbGJhY2sgYmVjYXVzZSB0aGUgY2FsbGJhY2sgaXMgbm90IGluc3RhbGxlZCBpbiB0aGlzIGNhc2UKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6Ok9wUmVjb3JkQXVkaW9Nb25pdG9yOjpjaGVja1JlY29yZEF1ZGlvKCkKK3sKKyAgICBjb25zdCBpbnQzMl90IG1vZGUgPSBtQXBwT3BzTWFuYWdlci5jaGVja09wKEFwcE9wc01hbmFnZXI6Ok9QX1JFQ09SRF9BVURJTywKKyAgICAgICAgICAgIG1VaWQsIG1QYWNrYWdlKTsKKyAgICBjb25zdCBib29sIGhhc0l0ID0gIChtb2RlID09IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCk7CisgICAgLy8gdmVyYm9zZSBsb2dnaW5nIG9ubHkgbG9nIHdoZW4gYXBwT3AgY2hhbmdlZAorICAgIEFMT0dJX0lGKGhhc0l0ICE9IG1IYXNPcFJlY29yZEF1ZGlvLmxvYWQoKSwKKyAgICAgICAgICAgICJPUF9SRUNPUkRfQVVESU8gbWlzc2luZywgJXNzaWxlbmNpbmcgcmVjb3JkIHVpZCVkIHBhY2s6JXMiLAorICAgICAgICAgICAgaGFzSXQgPyAidW4iIDogIiIsIG1VaWQsIFN0cmluZzgobVBhY2thZ2UpLnN0cmluZygpKTsKKyAgICBtSGFzT3BSZWNvcmRBdWRpby5zdG9yZShoYXNJdCk7Cit9CisKK0F1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpPcFJlY29yZEF1ZGlvTW9uaXRvcjo6UmVjb3JkQXVkaW9PcENhbGxiYWNrOjpSZWNvcmRBdWRpb09wQ2FsbGJhY2soCisgICAgICAgIGNvbnN0IHdwPE9wUmVjb3JkQXVkaW9Nb25pdG9yPiYgbW9uaXRvcikgOiBtTW9uaXRvcihtb25pdG9yKQoreyB9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6Ok9wUmVjb3JkQXVkaW9Nb25pdG9yOjpSZWNvcmRBdWRpb09wQ2FsbGJhY2s6Om9wQ2hhbmdlZChpbnQzMl90IG9wLAorICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lKSB7CisgICAgVU5VU0VEKHBhY2thZ2VOYW1lKTsKKyAgICBpZiAob3AgIT0gQXBwT3BzTWFuYWdlcjo6T1BfUkVDT1JEX0FVRElPKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8T3BSZWNvcmRBdWRpb01vbml0b3I+IG1vbml0b3IgPSBtTW9uaXRvci5wcm9tb3RlKCk7CisgICAgaWYgKG1vbml0b3IgIT0gTlVMTCkgeworICAgICAgICBtb25pdG9yLT5jaGVja1JlY29yZEF1ZGlvKCk7CisgICAgfQorfQorCisKKworI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6OlJlY29yZEhhbmRsZSIKKwogQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OlJlY29yZEhhbmRsZSgKICAgICAgICAgY29uc3Qgc3A8QXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrPiYgcmVjb3JkVHJhY2spCiAgICAgOiBCbkF1ZGlvUmVjb3JkKCksCkBAIC0xNjE1LDcgKzIwMjAsNyBAQAogCiBiaW5kZXI6OlN0YXR1cyBBdWRpb0ZsaW5nZXI6OlJlY29yZEhhbmRsZTo6c3RhcnQoaW50IC8qQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCovIGV2ZW50LAogICAgICAgICBpbnQgLyphdWRpb19zZXNzaW9uX3QqLyB0cmlnZ2VyU2Vzc2lvbikgewotICAgIEFMT0dWKCJSZWNvcmRIYW5kbGU6OnN0YXJ0KCkiKTsKKyAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKAogICAgICAgICBtUmVjb3JkVHJhY2stPnN0YXJ0KChBdWRpb1N5c3RlbTo6c3luY19ldmVudF90KWV2ZW50LCAoYXVkaW9fc2Vzc2lvbl90KSB0cmlnZ2VyU2Vzc2lvbikpOwogfQpAQCAtMTYyNiwxOCArMjAzMSwzMiBAQAogfQogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpzdG9wX25vbnZpcnR1YWwoKSB7Ci0gICAgQUxPR1YoIlJlY29yZEhhbmRsZTo6c3RvcCgpIik7CisgICAgQUxPR1YoIiVzKCkiLCBfX2Z1bmNfXyk7CiAgICAgbVJlY29yZFRyYWNrLT5zdG9wKCk7CiB9CiAKIGJpbmRlcjo6U3RhdHVzIEF1ZGlvRmxpbmdlcjo6UmVjb3JkSGFuZGxlOjpnZXRBY3RpdmVNaWNyb3Bob25lcygKICAgICAgICAgc3RkOjp2ZWN0b3I8bWVkaWE6Ok1pY3JvcGhvbmVJbmZvPiogYWN0aXZlTWljcm9waG9uZXMpIHsKLSAgICBBTE9HVigiUmVjb3JkSGFuZGxlOjpnZXRBY3RpdmVNaWNyb3Bob25lcygpIik7CisgICAgQUxPR1YoIiVzKCkiLCBfX2Z1bmNfXyk7CiAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVCgKICAgICAgICAgICAgIG1SZWNvcmRUcmFjay0+Z2V0QWN0aXZlTWljcm9waG9uZXMoYWN0aXZlTWljcm9waG9uZXMpKTsKIH0KIAorYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oCisgICAgICAgIGludCAvKmF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QqLyBkaXJlY3Rpb24pIHsKKyAgICBBTE9HVigiJXMoKSIsIF9fZnVuY19fKTsKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6OmZyb21TdGF0dXNUKG1SZWNvcmRUcmFjay0+c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbigKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3Q+KGRpcmVjdGlvbikpKTsKK30KKworYmluZGVyOjpTdGF0dXMgQXVkaW9GbGluZ2VyOjpSZWNvcmRIYW5kbGU6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgQUxPR1YoIiVzKCkiLCBfX2Z1bmNfXyk7CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpmcm9tU3RhdHVzVChtUmVjb3JkVHJhY2stPnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbih6b29tKSk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyN1bmRlZiBMT0dfVEFHCisjZGVmaW5lIExPR19UQUcgIkFGOjpSZWNvcmRUcmFjayIKIAogLy8gUmVjb3JkVHJhY2sgY29uc3RydWN0b3IgbXVzdCBiZSBjYWxsZWQgd2l0aCBBdWRpb0ZsaW5nZXI6Om1Mb2NrIGFuZCBUaHJlYWRCYXNlOjptTG9jayBoZWxkCiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OlJlY29yZFRyYWNrKApAQCAtMTY1MSwxMiArMjA3MCwxNSBAQAogICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgc2l6ZV90IGJ1ZmZlclNpemUsCiAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgcGlkX3QgY3JlYXRvclBpZCwKICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICB0cmFja190eXBlIHR5cGUsCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogICAgIDogICBUcmFja0Jhc2UodGhyZWFkLCBjbGllbnQsIGF0dHIsIHNhbXBsZVJhdGUsIGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmcmFtZUNvdW50LCBidWZmZXIsIGJ1ZmZlclNpemUsIHNlc3Npb25JZCwgdWlkLCBmYWxzZSAvKmlzT3V0Ki8sCisgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgZnJhbWVDb3VudCwgYnVmZmVyLCBidWZmZXJTaXplLCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICBjcmVhdG9yUGlkLCB1aWQsIGZhbHNlIC8qaXNPdXQqLywKICAgICAgICAgICAgICAgICAgICh0eXBlID09IFRZUEVfREVGQVVMVCkgPwogICAgICAgICAgICAgICAgICAgICAgICAgICAoKGZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSA/IEFMTE9DX1BJUEUgOiBBTExPQ19DQkxLKSA6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICgoYnVmZmVyID09IE5VTEwpID8gQUxMT0NfTE9DQUwgOiBBTExPQ19OT05FKSwKQEAgLTE2NjYsMjQgKzIwODgsMjcgQEAKICAgICAgICAgbVJlc2FtcGxlckJ1ZmZlclByb3ZpZGVyKE5VTEwpLCAvLyBpbml0aWFsaXplIGluIGNhc2Ugb2YgZWFybHkgY29uc3RydWN0b3IgZXhpdAogICAgICAgICBtUmVjb3JkQnVmZmVyQ29udmVydGVyKE5VTEwpLAogICAgICAgICBtRmxhZ3MoZmxhZ3MpLAotICAgICAgICBtU2lsZW5jZWQoZmFsc2UpCisgICAgICAgIG1TaWxlbmNlZChmYWxzZSksCisgICAgICAgIG1PcFJlY29yZEF1ZGlvTW9uaXRvcihPcFJlY29yZEF1ZGlvTW9uaXRvcjo6Y3JlYXRlSWZOZWVkZWQodWlkLCBvcFBhY2thZ2VOYW1lKSkKIHsKICAgICBpZiAobUNibGsgPT0gTlVMTCkgewogICAgICAgICByZXR1cm47CiAgICAgfQogCi0gICAgbVJlY29yZEJ1ZmZlckNvbnZlcnRlciA9IG5ldyBSZWNvcmRCdWZmZXJDb252ZXJ0ZXIoCi0gICAgICAgICAgICB0aHJlYWQtPm1DaGFubmVsTWFzaywgdGhyZWFkLT5tRm9ybWF0LCB0aHJlYWQtPm1TYW1wbGVSYXRlLAotICAgICAgICAgICAgY2hhbm5lbE1hc2ssIGZvcm1hdCwgc2FtcGxlUmF0ZSk7Ci0gICAgLy8gQ2hlY2sgaWYgdGhlIFJlY29yZEJ1ZmZlckNvbnZlcnRlciBjb25zdHJ1Y3Rpb24gd2FzIHN1Y2Nlc3NmdWwuCi0gICAgLy8gSWYgbm90LCBkb24ndCBjb250aW51ZSB3aXRoIGNvbnN0cnVjdGlvbi4KLSAgICAvLwotICAgIC8vIE5PVEU6IEl0IHdvdWxkIGJlIGV4dHJlbWVseSByYXJlIHRoYXQgdGhlIHJlY29yZCB0cmFjayBjYW5ub3QgYmUgY3JlYXRlZAotICAgIC8vIGZvciB0aGUgY3VycmVudCBkZXZpY2UsIGJ1dCBhIHBlbmRpbmcgb3IgZnV0dXJlIGRldmljZSBjaGFuZ2Ugd291bGQgbWFrZQotICAgIC8vIHRoZSByZWNvcmQgdHJhY2sgY29uZmlndXJhdGlvbiB2YWxpZC4KLSAgICBpZiAobVJlY29yZEJ1ZmZlckNvbnZlcnRlci0+aW5pdENoZWNrKCkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIlJlY29yZFRyYWNrIHVuYWJsZSB0byBjcmVhdGUgcmVjb3JkIGJ1ZmZlciBjb252ZXJ0ZXIiKTsKLSAgICAgICAgcmV0dXJuOworICAgIGlmICghaXNEaXJlY3QoKSkgeworICAgICAgICBtUmVjb3JkQnVmZmVyQ29udmVydGVyID0gbmV3IFJlY29yZEJ1ZmZlckNvbnZlcnRlcigKKyAgICAgICAgICAgICAgICB0aHJlYWQtPm1DaGFubmVsTWFzaywgdGhyZWFkLT5tRm9ybWF0LCB0aHJlYWQtPm1TYW1wbGVSYXRlLAorICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCBmb3JtYXQsIHNhbXBsZVJhdGUpOworICAgICAgICAvLyBDaGVjayBpZiB0aGUgUmVjb3JkQnVmZmVyQ29udmVydGVyIGNvbnN0cnVjdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgICAgICAgLy8gSWYgbm90LCBkb24ndCBjb250aW51ZSB3aXRoIGNvbnN0cnVjdGlvbi4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gTk9URTogSXQgd291bGQgYmUgZXh0cmVtZWx5IHJhcmUgdGhhdCB0aGUgcmVjb3JkIHRyYWNrIGNhbm5vdCBiZSBjcmVhdGVkCisgICAgICAgIC8vIGZvciB0aGUgY3VycmVudCBkZXZpY2UsIGJ1dCBhIHBlbmRpbmcgb3IgZnV0dXJlIGRldmljZSBjaGFuZ2Ugd291bGQgbWFrZQorICAgICAgICAvLyB0aGUgcmVjb3JkIHRyYWNrIGNvbmZpZ3VyYXRpb24gdmFsaWQuCisgICAgICAgIGlmIChtUmVjb3JkQnVmZmVyQ29udmVydGVyLT5pbml0Q2hlY2soKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgQUxPR0UoIiVzKCVkKTogUmVjb3JkVHJhY2sgdW5hYmxlIHRvIGNyZWF0ZSByZWNvcmQgYnVmZmVyIGNvbnZlcnRlciIsIF9fZnVuY19fLCBtSWQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CiAgICAgfQogCiAgICAgbVNlcnZlclByb3h5ID0gbmV3IEF1ZGlvUmVjb3JkU2VydmVyUHJveHkobUNibGssIG1CdWZmZXIsIGZyYW1lQ291bnQsCkBAIC0xNjk0LDEyICsyMTE5LDIwIEBACiAgICAgaWYgKGZsYWdzICYgQVVESU9fSU5QVVRfRkxBR19GQVNUKSB7CiAgICAgICAgIEFMT0dfQVNTRVJUKHRocmVhZC0+bUZhc3RUcmFja0F2YWlsKTsKICAgICAgICAgdGhyZWFkLT5tRmFzdFRyYWNrQXZhaWwgPSBmYWxzZTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBUT0RPOiBvbmx5IE5vcm1hbCBSZWNvcmQgaGFzIHRpbWVzdGFtcHMgKEZhc3QgUmVjb3JkIGRvZXMgbm90KS4KKyAgICAgICAgbVNlcnZlckxhdGVuY3lTdXBwb3J0ZWQgPSBjaGVja1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQobUZvcm1hdCwgZmxhZ3MpOwogICAgIH0KKyNpZmRlZiBURUVfU0lOSworICAgIG1UZWUuc2V0SWQoc3RkOjpzdHJpbmcoIl8iKSArIHN0ZDo6dG9fc3RyaW5nKG1UaHJlYWRJb0hhbmRsZSkKKyAgICAgICAgICAgICsgIl8iICsgc3RkOjp0b19zdHJpbmcobUlkKQorICAgICAgICAgICAgKyAiX1IiKTsKKyNlbmRpZgogfQogCiBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6On5SZWNvcmRUcmFjaygpCiB7Ci0gICAgQUxPR1YoIiVzIiwgX19mdW5jX18pOworICAgIEFMT0dWKCIlcygpIiwgX19mdW5jX18pOwogICAgIGRlbGV0ZSBtUmVjb3JkQnVmZmVyQ29udmVydGVyOwogICAgIGRlbGV0ZSBtUmVzYW1wbGVyQnVmZmVyUHJvdmlkZXI7CiB9CkBAIC0xNzU2LDE3ICsyMTg5LDM0IEBACiAgICAgLy8gc2VlIGNvbW1lbnRzIGF0IEF1ZGlvRmxpbmdlcjo6UGxheWJhY2tUaHJlYWQ6OlRyYWNrOjpkZXN0cm95KCkKICAgICBzcDxSZWNvcmRUcmFjaz4ga2VlcCh0aGlzKTsKICAgICB7Ci0gICAgICAgIGlmIChpc0V4dGVybmFsVHJhY2soKSkgewotICAgICAgICAgICAgaWYgKG1TdGF0ZSA9PSBBQ1RJVkUgfHwgbVN0YXRlID09IFJFU1VNSU5HKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnN0b3BJbnB1dChtUG9ydElkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpyZWxlYXNlSW5wdXQobVBvcnRJZCk7Ci0gICAgICAgIH0KKyAgICAgICAgdHJhY2tfc3RhdGUgcHJpb3JTdGF0ZSA9IG1TdGF0ZTsKICAgICAgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CiAgICAgICAgIGlmICh0aHJlYWQgIT0gMCkgewogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKHRocmVhZC0+bUxvY2spOwogICAgICAgICAgICAgUmVjb3JkVGhyZWFkICpyZWNvcmRUaHJlYWQgPSAoUmVjb3JkVGhyZWFkICopIHRocmVhZC5nZXQoKTsKLSAgICAgICAgICAgIHJlY29yZFRocmVhZC0+ZGVzdHJveVRyYWNrX2wodGhpcyk7CisgICAgICAgICAgICBwcmlvclN0YXRlID0gbVN0YXRlOworICAgICAgICAgICAgcmVjb3JkVGhyZWFkLT5kZXN0cm95VHJhY2tfbCh0aGlzKTsgLy8gbW92ZSBtU3RhdGUgdG8gU1RPUFBFRCwgdGVybWluYXRlCisgICAgICAgIH0KKyAgICAgICAgLy8gQVBNIHBvcnRpZC9jbGllbnQgbWFuYWdlbWVudCBkb25lIG91dHNpZGUgb2YgbG9jay4KKyAgICAgICAgLy8gTk9URTogaWYgdGhyZWFkIGRvZXNuJ3QgZXhpc3QsIHRoZSBpbnB1dCBkZXNjcmlwdG9yIHByb2JhYmx5IGRvZXNuJ3QgZWl0aGVyLgorICAgICAgICBpZiAoaXNFeHRlcm5hbFRyYWNrKCkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAocHJpb3JTdGF0ZSkgeworICAgICAgICAgICAgY2FzZSBBQ1RJVkU6ICAgICAvLyBpbnZhbGlkYXRlZCB3aGlsZSBzdGlsbCBhY3RpdmUKKyAgICAgICAgICAgIGNhc2UgU1RBUlRJTkdfMjogLy8gaW52YWxpZGF0ZWQvc3RhcnQtYWJvcnRlZCBhZnRlciBzdGFydElucHV0IHN1Y2Nlc3NmdWxseSBjYWxsZWQKKyAgICAgICAgICAgIGNhc2UgUEFVU0lORzogICAgLy8gaW52YWxpZGF0ZWQgd2hpbGUgaW4gdGhlIG1pZGRsZSBvZiBzdG9wKCkgcGF1c2luZyAoc3RpbGwgYWN0aXZlKQorICAgICAgICAgICAgICAgIEF1ZGlvU3lzdGVtOjpzdG9wSW5wdXQobVBvcnRJZCk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgU1RBUlRJTkdfMTogLy8gaW52YWxpZGF0ZWQvc3RhcnQtYWJvcnRlZCBhbmQgc3RhcnRJbnB1dCBub3Qgc3VjY2Vzc2Z1bAorICAgICAgICAgICAgY2FzZSBQQVVTRUQ6ICAgICAvLyBPSywgbm90IGFjdGl2ZQorICAgICAgICAgICAgY2FzZSBJRExFOiAgICAgICAvLyBPSywgbm90IGFjdGl2ZQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIFNUT1BQRUQ6ICAgIC8vIHVuZXhwZWN0ZWQgKGRlc3Ryb3llZCkKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXMoJWQpOiBpbnZhbGlkIHByaW9yIHN0YXRlOiAlZCIsIF9fZnVuY19fLCBtSWQsIHByaW9yU3RhdGUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQXVkaW9TeXN0ZW06OnJlbGVhc2VJbnB1dChtUG9ydElkKTsKICAgICAgICAgfQogICAgIH0KIH0KQEAgLTE3ODMsMzEgKzIyMzMsNTAgQEAKIH0KIAogCi0vKnN0YXRpYyovIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCJBY3RpdmUgQ2xpZW50IFNlc3Npb24gUyAgRmxhZ3MgICBGb3JtYXQgQ2huIG1hc2sgIFNSYXRlICAgU2VydmVyIEZybUNudCBTaWxcbiIpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkFjdGl2ZSAgICAgSWQgQ2xpZW50IFNlc3Npb24gUG9ydCBJZCAgUyAgRmxhZ3MgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgRm9ybWF0IENobiBtYXNrICBTUmF0ZSBTb3VyY2UgICIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgU2VydmVyIEZybUNudCBGcm1SZHkgU2lsJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpc1NlcnZlckxhdGVuY3lTdXBwb3J0ZWQoKSA/ICIgICBMYXRlbmN5IiA6ICIiKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmFwcGVuZER1bXAoU3RyaW5nOCYgcmVzdWx0LCBib29sIGFjdGl2ZSkKIHsKLSAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlYyU1cyAlNnUgJTd1ICUycyAweCUwM1ggIgotICAgICAgICAgICAgIiUwOFggJTA4WCAlNnUgIgotICAgICAgICAgICAgIiUwOFggJTZ6dSAlM2NcbiIsCisgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiJWMlNXMgJTZkICU2dSAlN3UgJTd1ICAlMnMgMHglMDNYICIKKyAgICAgICAgICAgICIlMDhYICUwOFggJTZ1ICU2WCAiCisgICAgICAgICAgICAiJTA4WCAlNnp1ICU2enUgJTNjIiwKICAgICAgICAgICAgIGlzRmFzdFRyYWNrKCkgPyAnRicgOiAnICcsCiAgICAgICAgICAgICBhY3RpdmUgPyAieWVzIiA6ICJubyIsCi0gICAgICAgICAgICAobUNsaWVudCA9PSAwKSA/IGdldHBpZF9jYWNoZWQgOiBtQ2xpZW50LT5waWQoKSwKKyAgICAgICAgICAgIG1JZCwKKyAgICAgICAgICAgIChtQ2xpZW50ID09IDApID8gZ2V0cGlkKCkgOiBtQ2xpZW50LT5waWQoKSwKICAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICBtUG9ydElkLAogICAgICAgICAgICAgZ2V0VHJhY2tTdGF0ZVN0cmluZygpLAogICAgICAgICAgICAgbUNibGstPm1GbGFncywKIAogICAgICAgICAgICAgbUZvcm1hdCwKICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKICAgICAgICAgICAgIG1TYW1wbGVSYXRlLAorICAgICAgICAgICAgbUF0dHIuc291cmNlLAogCiAgICAgICAgICAgICBtQ2Jsay0+bVNlcnZlciwKICAgICAgICAgICAgIG1GcmFtZUNvdW50LAorICAgICAgICAgICAgbVNlcnZlclByb3h5LT5mcmFtZXNSZWFkeVNhZmUoKSwKICAgICAgICAgICAgIGlzU2lsZW5jZWQoKSA/ICdzJyA6ICduJwogICAgICAgICAgICAgKTsKKyAgICBpZiAoaXNTZXJ2ZXJMYXRlbmN5U3VwcG9ydGVkKCkpIHsKKyAgICAgICAgZG91YmxlIGxhdGVuY3lNczsKKyAgICAgICAgYm9vbCBmcm9tVHJhY2s7CisgICAgICAgIGlmIChnZXRUcmFja0xhdGVuY3lNcygmbGF0ZW5jeU1zLCAmZnJvbVRyYWNrKSA9PSBPSykgeworICAgICAgICAgICAgLy8gU2hvdyBsYXRlbmN5IGluIG1zZWMsIGZvbGxvd2VkIGJ5ICd0JyBpZiBmcm9tIHRyYWNrIHRpbWVzdGFtcCAodGhlIG1vc3QgYWNjdXJhdGUpCisgICAgICAgICAgICAvLyBvciAnaycgaWYgZXN0aW1hdGVkIGZyb20ga2VybmVsICh1c3VhbGx5IGZvciBkZWJ1Z2dpbmcpLgorICAgICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiICU3LjJsZiAlYyIsIGxhdGVuY3lNcywgZnJvbVRyYWNrID8gJ3QnIDogJ2snKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiUxMHMiLCBtQ2Jsay0+bVNlcnZlciAhPSAwID8gInVuYXZhaWwiIDogIm5ldyIpOworICAgICAgICB9CisgICAgfQorICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CiB9CiAKIHZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlJlY29yZFRyYWNrOjpoYW5kbGVTeW5jU3RhcnRFdmVudChjb25zdCBzcDxTeW5jRXZlbnQ+JiBldmVudCkKQEAgLTE4MzcsNiArMjMwNiwxNiBAQAogICAgICAgICBpbnQ2NF90IHRyYWNrRnJhbWVzUmVsZWFzZWQsIGludDY0X3Qgc291cmNlRnJhbWVzUmVhZCwKICAgICAgICAgdWludDMyX3QgaGFsU2FtcGxlUmF0ZSwgY29uc3QgRXh0ZW5kZWRUaW1lc3RhbXAgJnRpbWVzdGFtcCkKIHsKKyAgIC8vIE1ha2UgdGhlIGtlcm5lbCBmcmFtZXRpbWUgYXZhaWxhYmxlLgorICAgIGNvbnN0IEZyYW1lVGltZSBmdHsKKyAgICAgICAgICAgIHRpbWVzdGFtcC5tUG9zaXRpb25bRXh0ZW5kZWRUaW1lc3RhbXA6OkxPQ0FUSU9OX0tFUk5FTF0sCisgICAgICAgICAgICB0aW1lc3RhbXAubVRpbWVOc1tFeHRlbmRlZFRpbWVzdGFtcDo6TE9DQVRJT05fS0VSTkVMXX07CisgICAgLy8gQUxPR0QoIkZyYW1lVGltZTogJWxsZCAlbGxkIiwgKGxvbmcgbG9uZylmdC5mcmFtZXMsIChsb25nIGxvbmcpZnQudGltZU5zKTsKKyAgICBtS2VybmVsRnJhbWVUaW1lLnN0b3JlKGZ0KTsKKyAgICBpZiAoIWF1ZGlvX2lzX2xpbmVhcl9wY20obUZvcm1hdCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKwogICAgIEV4dGVuZGVkVGltZXN0YW1wIGxvY2FsID0gdGltZXN0YW1wOwogCiAgICAgLy8gQ29udmVydCBIQUwgZnJhbWVzIHRvIHNlcnZlci1zaWRlIHRyYWNrIGZyYW1lcyBhdCB0cmFjayBzYW1wbGUgcmF0ZS4KQEAgLTE4NTAsNiArMjMyOSwyMyBAQAogICAgICAgICB9CiAgICAgfQogICAgIG1TZXJ2ZXJQcm94eS0+c2V0VGltZXN0YW1wKGxvY2FsKTsKKworICAgIC8vIENvbXB1dGUgbGF0ZW5jeSBpbmZvLgorICAgIGNvbnN0IGJvb2wgdXNlVHJhY2tUaW1lc3RhbXAgPSB0cnVlOyAvLyB1c2UgdHJhY2sgdW5sZXNzIGRlYnVnZ2luZy4KKyAgICBjb25zdCBkb3VibGUgbGF0ZW5jeU1zID0gLSAodXNlVHJhY2tUaW1lc3RhbXAKKyAgICAgICAgICAgID8gbG9jYWwuZ2V0T3V0cHV0U2VydmVyTGF0ZW5jeU1zKHNhbXBsZVJhdGUoKSkKKyAgICAgICAgICAgIDogdGltZXN0YW1wLmdldE91dHB1dFNlcnZlckxhdGVuY3lNcyhoYWxTYW1wbGVSYXRlKSk7CisKKyAgICBtU2VydmVyTGF0ZW5jeUZyb21UcmFjay5zdG9yZSh1c2VUcmFja1RpbWVzdGFtcCk7CisgICAgbVNlcnZlckxhdGVuY3lNcy5zdG9yZShsYXRlbmN5TXMpOworfQorCitib29sIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpSZWNvcmRUcmFjazo6aXNTaWxlbmNlZCgpIGNvbnN0IHsKKyAgICBpZiAobVNpbGVuY2VkKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICAvLyBUaGUgbW9uaXRvciBpcyBvbmx5IGNyZWF0ZWQgZm9yIHJlY29yZCB0cmFja3MgdGhhdCBjYW4gYmUgc2lsZW5jZWQuCisgICAgcmV0dXJuIG1PcFJlY29yZEF1ZGlvTW9uaXRvciA/ICFtT3BSZWNvcmRBdWRpb01vbml0b3ItPmhhc09wUmVjb3JkQXVkaW8oKSA6IGZhbHNlOwogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OmdldEFjdGl2ZU1pY3JvcGhvbmVzKApAQCAtMTg2NCw2ICsyMzYwLDMxIEBACiAgICAgfQogfQogCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVEaXJlY3Rpb24oCisgICAgICAgIGF1ZGlvX21pY3JvcGhvbmVfZGlyZWN0aW9uX3QgZGlyZWN0aW9uKSB7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgaWYgKHRocmVhZCAhPSAwKSB7CisgICAgICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgcmV0dXJuIHJlY29yZFRocmVhZC0+c2V0UHJlZmVycmVkTWljcm9waG9uZURpcmVjdGlvbihkaXJlY3Rpb24pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorfQorCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UmVjb3JkVHJhY2s6OnNldFByZWZlcnJlZE1pY3JvcGhvbmVGaWVsZERpbWVuc2lvbihmbG9hdCB6b29tKSB7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkID0gbVRocmVhZC5wcm9tb3RlKCk7CisgICAgaWYgKHRocmVhZCAhPSAwKSB7CisgICAgICAgIFJlY29yZFRocmVhZCAqcmVjb3JkVGhyZWFkID0gKFJlY29yZFRocmVhZCAqKXRocmVhZC5nZXQoKTsKKyAgICAgICAgcmV0dXJuIHJlY29yZFRocmVhZC0+c2V0UHJlZmVycmVkTWljcm9waG9uZUZpZWxkRGltZW5zaW9uKHpvb20pOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6UGF0Y2hSZWNvcmQiCisKIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZDo6UGF0Y2hSZWNvcmQoUmVjb3JkVGhyZWFkICpyZWNvcmRUaHJlYWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLApAQCAtMTg3MSwzOSArMjM5Miw3NiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgZnJhbWVDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnVmZmVyU2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGltZW91dCYgdGltZW91dCkKICAgICA6ICAgUmVjb3JkVHJhY2socmVjb3JkVGhyZWFkLCBOVUxMLAogICAgICAgICAgICAgICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdHt9IC8qIGN1cnJlbnRseSB1bnVzZWQgZm9yIHBhdGNoIHRyYWNrICovLAogICAgICAgICAgICAgICAgIHNhbXBsZVJhdGUsIGZvcm1hdCwgY2hhbm5lbE1hc2ssIGZyYW1lQ291bnQsCi0gICAgICAgICAgICAgICAgYnVmZmVyLCBidWZmZXJTaXplLCBBVURJT19TRVNTSU9OX05PTkUsIGdldHVpZCgpLCBmbGFncywgVFlQRV9QQVRDSCksCi0gICAgICAgICAgICAgICAgbVByb3h5KG5ldyBDbGllbnRQcm94eShtQ2JsaywgbUJ1ZmZlciwgZnJhbWVDb3VudCwgbUZyYW1lU2l6ZSwgZmFsc2UsIHRydWUpKQorICAgICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyU2l6ZSwgQVVESU9fU0VTU0lPTl9OT05FLCBnZXRwaWQoKSwgQUlEX0FVRElPU0VSVkVSLAorICAgICAgICAgICAgICAgIGZsYWdzLCBUWVBFX1BBVENILCBTdHJpbmcxNigpKSwKKyAgICAgICAgUGF0Y2hUcmFja0Jhc2UobmV3IENsaWVudFByb3h5KG1DYmxrLCBtQnVmZmVyLCBmcmFtZUNvdW50LCBtRnJhbWVTaXplLCBmYWxzZSwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICpyZWNvcmRUaHJlYWQsIHRpbWVvdXQpCiB7Ci0gICAgdWludDY0X3QgbWl4QnVmZmVyTnMgPSAoKHVpbnQ2NF90KTIgKiByZWNvcmRUaHJlYWQtPmZyYW1lQ291bnQoKSAqIDEwMDAwMDAwMDApIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvcmRUaHJlYWQtPnNhbXBsZVJhdGUoKTsKLSAgICBtUGVlclRpbWVvdXQudHZfc2VjID0gbWl4QnVmZmVyTnMgLyAxMDAwMDAwMDAwOwotICAgIG1QZWVyVGltZW91dC50dl9uc2VjID0gKGludCkgKG1peEJ1ZmZlck5zICUgMTAwMDAwMDAwMCk7Ci0KLSAgICBBTE9HVigiUGF0Y2hSZWNvcmQgJXAgc2FtcGxlUmF0ZSAlZCBtUGVlclRpbWVvdXQgJWQuJTAzZCBzZWMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBzYW1wbGVSYXRlLAorICAgIEFMT0dWKCIlcyglZCk6IHNhbXBsZVJhdGUgJWQgbVBlZXJUaW1lb3V0ICVkLiUwM2Qgc2VjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIG1JZCwgc2FtcGxlUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCltUGVlclRpbWVvdXQudHZfc2VjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50KShtUGVlclRpbWVvdXQudHZfbnNlYyAvIDEwMDAwMDApKTsKIH0KIAogQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlBhdGNoUmVjb3JkOjp+UGF0Y2hSZWNvcmQoKQogeworICAgIEFMT0dWKCIlcyglZCkiLCBfX2Z1bmNfXywgbUlkKTsKK30KKworc3RhdGljIHNpemVfdCB3cml0ZUZyYW1lc0hlbHBlcigKKyAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlciogZGVzdCwgY29uc3Qgdm9pZCogc3JjLCBzaXplX3QgZnJhbWVDb3VudCwgc2l6ZV90IGZyYW1lU2l6ZSkKK3sKKyAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIgcGF0Y2hCdWZmZXI7CisgICAgcGF0Y2hCdWZmZXIuZnJhbWVDb3VudCA9IGZyYW1lQ291bnQ7CisgICAgYXV0byBzdGF0dXMgPSBkZXN0LT5nZXROZXh0QnVmZmVyKCZwYXRjaEJ1ZmZlcik7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgIEFMT0dXKCIlcyBQYXRoUmVjb3JkIGdldE5leHRCdWZmZXIgZmFpbGVkIHdpdGggZXJyb3IgJWQ6ICVzIiwKKyAgICAgICAgICAgICBfX2Z1bmNfXywgc3RhdHVzLCBzdHJlcnJvcigtc3RhdHVzKSk7CisgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIEFMT0dfQVNTRVJUKHBhdGNoQnVmZmVyLmZyYW1lQ291bnQgPD0gZnJhbWVDb3VudCk7CisgICAgbWVtY3B5KHBhdGNoQnVmZmVyLnJhdywgc3JjLCBwYXRjaEJ1ZmZlci5mcmFtZUNvdW50ICogZnJhbWVTaXplKTsKKyAgICBzaXplX3QgZnJhbWVzV3JpdHRlbiA9IHBhdGNoQnVmZmVyLmZyYW1lQ291bnQ7CisgICAgZGVzdC0+cmVsZWFzZUJ1ZmZlcigmcGF0Y2hCdWZmZXIpOworICAgIHJldHVybiBmcmFtZXNXcml0dGVuOworfQorCisvLyBzdGF0aWMKK3NpemVfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGF0Y2hSZWNvcmQ6OndyaXRlRnJhbWVzKAorICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyKiBkZXN0LCBjb25zdCB2b2lkKiBzcmMsIHNpemVfdCBmcmFtZUNvdW50LCBzaXplX3QgZnJhbWVTaXplKQoreworICAgIHNpemVfdCBmcmFtZXNXcml0dGVuID0gd3JpdGVGcmFtZXNIZWxwZXIoZGVzdCwgc3JjLCBmcmFtZUNvdW50LCBmcmFtZVNpemUpOworICAgIC8vIE9uIGJ1ZmZlciB3cmFwLCB0aGUgYnVmZmVyIGZyYW1lIGNvdW50IHdpbGwgYmUgbGVzcyB0aGFuIHJlcXVlc3RlZCwKKyAgICAvLyB3aGVuIHRoaXMgaGFwcGVucyBhIHNlY29uZCBidWZmZXIgbmVlZHMgdG8gYmUgdXNlZCB0byB3cml0ZSB0aGUgbGVmdG92ZXIgYXVkaW8KKyAgICBjb25zdCBzaXplX3QgZnJhbWVzTGVmdCA9IGZyYW1lQ291bnQgLSBmcmFtZXNXcml0dGVuOworICAgIGlmIChmcmFtZXNXcml0dGVuICE9IDAgJiYgZnJhbWVzTGVmdCAhPSAwKSB7CisgICAgICAgIGZyYW1lc1dyaXR0ZW4gKz0gd3JpdGVGcmFtZXNIZWxwZXIoZGVzdCwgKGNvbnN0IGNoYXIqKXNyYyArIGZyYW1lc1dyaXR0ZW4gKiBmcmFtZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZXNMZWZ0LCBmcmFtZVNpemUpOworICAgIH0KKyAgICByZXR1cm4gZnJhbWVzV3JpdHRlbjsKIH0KIAogLy8gQXVkaW9CdWZmZXJQcm92aWRlciBpbnRlcmZhY2UKIHN0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZDo6Z2V0TmV4dEJ1ZmZlcigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdWZmZXJQcm92aWRlcjo6QnVmZmVyKiBidWZmZXIpCiB7Ci0gICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiUGF0Y2hSZWNvcmQ6OmdldE5leHRCdWZmZXIoKSBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5Iik7CisgICAgQUxPR19BU1NFUlQobVBlZXJQcm94eSAhPSAwLCAiJXMoJWQpOiBjYWxsZWQgd2l0aG91dCBwZWVyIHByb3h5IiwgX19mdW5jX18sIG1JZCk7CiAgICAgUHJveHk6OkJ1ZmZlciBidWY7CiAgICAgYnVmLm1GcmFtZUNvdW50ID0gYnVmZmVyLT5mcmFtZUNvdW50OwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1QZWVyUHJveHktPm9idGFpbkJ1ZmZlcigmYnVmLCAmbVBlZXJUaW1lb3V0KTsKICAgICBBTE9HVl9JRihzdGF0dXMgIT0gTk9fRVJST1IsCi0gICAgICAgICAgICAgIlBhdGNoUmVjb3JkKCkgJXAgbVBlZXJQcm94eS0+b2J0YWluQnVmZmVyIHN0YXR1cyAlZCIsIHRoaXMsIHN0YXR1cyk7CisgICAgICAgICAgICAgIiVzKCVkKTogbVBlZXJQcm94eS0+b2J0YWluQnVmZmVyIHN0YXR1cyAlZCIsIF9fZnVuY19fLCBtSWQsIHN0YXR1cyk7CiAgICAgYnVmZmVyLT5mcmFtZUNvdW50ID0gYnVmLm1GcmFtZUNvdW50OworICAgIGlmIChBVFJBQ0VfRU5BQkxFRCgpKSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIHRyYWNlTmFtZSgiUFJuT2J0Iik7CisgICAgICAgIHRyYWNlTmFtZSArPSBzdGQ6OnRvX3N0cmluZyhpZCgpKTsKKyAgICAgICAgQVRSQUNFX0lOVCh0cmFjZU5hbWUuY19zdHIoKSwgYnVmLm1GcmFtZUNvdW50KTsKKyAgICB9CiAgICAgaWYgKGJ1Zi5tRnJhbWVDb3VudCA9PSAwKSB7CiAgICAgICAgIHJldHVybiBXT1VMRF9CTE9DSzsKICAgICB9CkBAIC0xOTEzLDcgKzI0NzEsNyBAQAogCiB2b2lkIEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXRjaFJlY29yZDo6cmVsZWFzZUJ1ZmZlcihBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKIHsKLSAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICJQYXRjaFJlY29yZDo6cmVsZWFzZUJ1ZmZlcigpIGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiKTsKKyAgICBBTE9HX0FTU0VSVChtUGVlclByb3h5ICE9IDAsICIlcyglZCk6IGNhbGxlZCB3aXRob3V0IHBlZXIgcHJveHkiLCBfX2Z1bmNfXywgbUlkKTsKICAgICBQcm94eTo6QnVmZmVyIGJ1ZjsKICAgICBidWYubUZyYW1lQ291bnQgPSBidWZmZXItPmZyYW1lQ291bnQ7CiAgICAgYnVmLm1SYXcgPSBidWZmZXItPnJhdzsKQEAgLTE5MzIsNyArMjQ5MCwxODMgQEAKICAgICBtUHJveHktPnJlbGVhc2VCdWZmZXIoYnVmZmVyKTsKIH0KIAorI3VuZGVmIExPR19UQUcKKyNkZWZpbmUgTE9HX1RBRyAiQUY6OlB0aHJQYXRjaFJlY29yZCIKIAorc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjx2b2lkLCBkZWNsdHlwZShmcmVlKSo+IGFsbG9jQWxpZ25lZChzaXplX3QgYWxpZ25tZW50LCBzaXplX3Qgc2l6ZSkKK3sKKyAgICB2b2lkICpwdHIgPSBudWxscHRyOworICAgICh2b2lkKXBvc2l4X21lbWFsaWduKCZwdHIsIGFsaWdubWVudCwgc2l6ZSk7CisgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjx2b2lkLCBkZWNsdHlwZShmcmVlKSo+KHB0ciwgZnJlZSk7Cit9CisKK0F1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXNzdGhydVBhdGNoUmVjb3JkOjpQYXNzdGhydVBhdGNoUmVjb3JkKAorICAgICAgICBSZWNvcmRUaHJlYWQgKnJlY29yZFRocmVhZCwKKyAgICAgICAgdWludDMyX3Qgc2FtcGxlUmF0ZSwKKyAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgc2l6ZV90IGZyYW1lQ291bnQsCisgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MpCisgICAgICAgIDogUGF0Y2hSZWNvcmQocmVjb3JkVGhyZWFkLCBzYW1wbGVSYXRlLCBjaGFubmVsTWFzaywgZm9ybWF0LCBmcmFtZUNvdW50LAorICAgICAgICAgICAgICAgIG51bGxwdHIgLypidWZmZXIqLywgMCAvKmJ1ZmZlclNpemUqLywgZmxhZ3MpLAorICAgICAgICAgIG1QYXRjaFJlY29yZEF1ZGlvQnVmZmVyUHJvdmlkZXIoKnRoaXMpLAorICAgICAgICAgIG1TaW5rQnVmZmVyKGFsbG9jQWxpZ25lZCgzMiwgbUZyYW1lQ291bnQgKiBtRnJhbWVTaXplKSksCisgICAgICAgICAgbVN0dWJCdWZmZXIoYWxsb2NBbGlnbmVkKDMyLCBtRnJhbWVDb3VudCAqIG1GcmFtZVNpemUpKQoreworICAgIG1lbXNldChtU3R1YkJ1ZmZlci5nZXQoKSwgMCwgbUZyYW1lQ291bnQgKiBtRnJhbWVTaXplKTsKK30KKworc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXNzdGhydVBhdGNoUmVjb3JkOjpvYnRhaW5TdHJlYW0oCisgICAgICAgIHNwPFRocmVhZEJhc2U+KiB0aHJlYWQpCit7CisgICAgKnRocmVhZCA9IG1UaHJlYWQucHJvbW90ZSgpOworICAgIGlmICghKnRocmVhZCkgcmV0dXJuIG51bGxwdHI7CisgICAgUmVjb3JkVGhyZWFkICpyZWNvcmRUaHJlYWQgPSBzdGF0aWNfY2FzdDxSZWNvcmRUaHJlYWQqPigoKnRocmVhZCkuZ2V0KCkpOworICAgIE11dGV4OjpBdXRvbG9jayBfbChyZWNvcmRUaHJlYWQtPm1Mb2NrKTsKKyAgICByZXR1cm4gcmVjb3JkVGhyZWFkLT5tSW5wdXQgPyByZWNvcmRUaHJlYWQtPm1JbnB1dC0+c3RyZWFtIDogbnVsbHB0cjsKK30KKworLy8gUGF0Y2hQcm94eUJ1ZmZlclByb3ZpZGVyIG1ldGhvZHMgYXJlIGNhbGxlZCBvbiBEaXJlY3RPdXRwdXRUaHJlYWQKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXNzdGhydVBhdGNoUmVjb3JkOjpvYnRhaW5CdWZmZXIoCisgICAgICAgIFByb3h5OjpCdWZmZXIqIGJ1ZmZlciwgY29uc3Qgc3RydWN0IHRpbWVzcGVjKiB0aW1lT3V0KQoreworICAgIGlmIChtVW5jb25zdW1lZEZyYW1lcykgeworICAgICAgICBidWZmZXItPm1GcmFtZUNvdW50ID0gc3RkOjptaW4oYnVmZmVyLT5tRnJhbWVDb3VudCwgbVVuY29uc3VtZWRGcmFtZXMpOworICAgICAgICAvLyBtVW5jb25zdW1lZEZyYW1lcyBpcyBkZWNyZWFzZWQgaW4gcmVsZWFzZUJ1ZmZlciB0byB1c2UgYWN0dWFsIGZyYW1lIGNvbnN1bXB0aW9uIGZpZ3VyZS4KKyAgICAgICAgcmV0dXJuIFBhdGNoUmVjb3JkOjpvYnRhaW5CdWZmZXIoYnVmZmVyLCB0aW1lT3V0KTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIGV4ZWN1dGUgYSByZWFkIGZyb20gSEFMIGFuZCB3cml0ZSBpbnRvIHRoZSBidWZmZXIuCisgICAgbnNlY3NfdCBzdGFydFRpbWVOcyA9IDA7CisgICAgaWYgKHRpbWVPdXQgJiYgKHRpbWVPdXQtPnR2X3NlYyAhPSAwIHx8IHRpbWVPdXQtPnR2X25zZWMgIT0gMCkgJiYgdGltZU91dC0+dHZfc2VjICE9IElOVF9NQVgpIHsKKyAgICAgICAgLy8gV2lsbCBuZWVkIHRvIGNvcnJlY3QgdGltZU91dCBieSBlbGFwc2VkIHRpbWUuCisgICAgICAgIHN0YXJ0VGltZU5zID0gc3lzdGVtVGltZSgpOworICAgIH0KKyAgICBjb25zdCBzaXplX3QgZnJhbWVzVG9SZWFkID0gc3RkOjptaW4oYnVmZmVyLT5tRnJhbWVDb3VudCwgbUZyYW1lQ291bnQpOworICAgIGJ1ZmZlci0+bUZyYW1lQ291bnQgPSAwOworICAgIGJ1ZmZlci0+bVJhdyA9IG51bGxwdHI7CisgICAgc3A8VGhyZWFkQmFzZT4gdGhyZWFkOworICAgIHNwPFN0cmVhbUluSGFsSW50ZXJmYWNlPiBzdHJlYW0gPSBvYnRhaW5TdHJlYW0oJnRocmVhZCk7CisgICAgaWYgKCFzdHJlYW0pIHJldHVybiBOT19JTklUOyAgLy8gSWYgdGhlcmUgaXMgbm8gc3RyZWFtLCBSZWNvcmRUaHJlYWQgaXMgbm90IHJlYWRpbmcuCisKKyAgICBzdGF0dXNfdCByZXN1bHQgPSBOT19FUlJPUjsKKyAgICBzaXplX3QgYnl0ZXNSZWFkID0gMDsKKyAgICB7CisgICAgICAgIEFUUkFDRV9OQU1FKCJyZWFkIik7CisgICAgICAgIHJlc3VsdCA9IHN0cmVhbS0+cmVhZChtU2lua0J1ZmZlci5nZXQoKSwgZnJhbWVzVG9SZWFkICogbUZyYW1lU2l6ZSwgJmJ5dGVzUmVhZCk7CisgICAgICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIGdvdG8gc3RyZWFtX2Vycm9yOworICAgICAgICBpZiAoYnl0ZXNSZWFkID09IDApIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICB7CisgICAgICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZWFkTG9jayk7CisgICAgICAgIG1SZWFkQnl0ZXMgKz0gYnl0ZXNSZWFkOworICAgICAgICBtUmVhZEVycm9yID0gTk9fRVJST1I7CisgICAgfQorICAgIG1SZWFkQ1Yubm90aWZ5X29uZSgpOworICAgIC8vIHdyaXRlRnJhbWVzIGhhbmRsZXMgd3JhcGFyb3VuZCBhbmQgc2hvdWxkIHdyaXRlIGFsbCB0aGUgcHJvdmlkZWQgZnJhbWVzLgorICAgIC8vIElmIGl0IGNvdWxkbid0LCB0aGVyZSBpcyBzb21ldGhpbmcgd3Jvbmcgd2l0aCB0aGUgY2xpZW50L3NlcnZlciBidWZmZXIgb2YgdGhlIHNvZnR3YXJlIHBhdGNoLgorICAgIGJ1ZmZlci0+bUZyYW1lQ291bnQgPSB3cml0ZUZyYW1lcygKKyAgICAgICAgICAgICZtUGF0Y2hSZWNvcmRBdWRpb0J1ZmZlclByb3ZpZGVyLAorICAgICAgICAgICAgbVNpbmtCdWZmZXIuZ2V0KCksIGJ5dGVzUmVhZCAvIG1GcmFtZVNpemUsIG1GcmFtZVNpemUpOworICAgIEFMT0dXX0lGKGJ1ZmZlci0+bUZyYW1lQ291bnQgPCBieXRlc1JlYWQgLyBtRnJhbWVTaXplLAorICAgICAgICAgICAgIkxvc3QgJXp1IGZyYW1lcyBvYnRhaW5lZCBmcm9tIEhBTCIsIGJ5dGVzUmVhZCAvIG1GcmFtZVNpemUgLSBidWZmZXItPm1GcmFtZUNvdW50KTsKKyAgICBtVW5jb25zdW1lZEZyYW1lcyA9IGJ1ZmZlci0+bUZyYW1lQ291bnQ7CisgICAgc3RydWN0IHRpbWVzcGVjIG5ld1RpbWVPdXQ7CisgICAgaWYgKHN0YXJ0VGltZU5zKSB7CisgICAgICAgIC8vIENvcnJlY3QgdGhlIHRpbWVvdXQgYnkgZWxhcHNlZCB0aW1lLgorICAgICAgICBuc2Vjc190IG5ld1RpbWVPdXROcyA9IGF1ZGlvX3V0aWxzX25zX2Zyb21fdGltZXNwZWModGltZU91dCkgLSAoc3lzdGVtVGltZSgpIC0gc3RhcnRUaW1lTnMpOworICAgICAgICBpZiAobmV3VGltZU91dE5zIDwgMCkgbmV3VGltZU91dE5zID0gMDsKKyAgICAgICAgbmV3VGltZU91dC50dl9zZWMgPSBuZXdUaW1lT3V0TnMgLyBOQU5PU19QRVJfU0VDT05EOworICAgICAgICBuZXdUaW1lT3V0LnR2X25zZWMgPSBuZXdUaW1lT3V0TnMgLSBuZXdUaW1lT3V0LnR2X3NlYyAqIE5BTk9TX1BFUl9TRUNPTkQ7CisgICAgICAgIHRpbWVPdXQgPSAmbmV3VGltZU91dDsKKyAgICB9CisgICAgcmV0dXJuIFBhdGNoUmVjb3JkOjpvYnRhaW5CdWZmZXIoYnVmZmVyLCB0aW1lT3V0KTsKKworc3RyZWFtX2Vycm9yOgorICAgIHN0cmVhbS0+c3RhbmRieSgpOworICAgIHsKKyAgICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlYWRMb2NrKTsKKyAgICAgICAgbVJlYWRFcnJvciA9IHJlc3VsdDsKKyAgICB9CisgICAgbVJlYWRDVi5ub3RpZnlfb25lKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKwordm9pZCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGFzc3RocnVQYXRjaFJlY29yZDo6cmVsZWFzZUJ1ZmZlcihQcm94eTo6QnVmZmVyKiBidWZmZXIpCit7CisgICAgaWYgKGJ1ZmZlci0+bUZyYW1lQ291bnQgPD0gbVVuY29uc3VtZWRGcmFtZXMpIHsKKyAgICAgICAgbVVuY29uc3VtZWRGcmFtZXMgLT0gYnVmZmVyLT5tRnJhbWVDb3VudDsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVygiV3JpdGUgc2lkZSBoYXMgY29uc3VtZWQgbW9yZSBmcmFtZXMgdGhhbiB3ZSBoYWQ6ICV6dSA+ICV6dSIsCisgICAgICAgICAgICAgICAgYnVmZmVyLT5tRnJhbWVDb3VudCwgbVVuY29uc3VtZWRGcmFtZXMpOworICAgICAgICBtVW5jb25zdW1lZEZyYW1lcyA9IDA7CisgICAgfQorICAgIFBhdGNoUmVjb3JkOjpyZWxlYXNlQnVmZmVyKGJ1ZmZlcik7Cit9CisKKy8vIEF1ZGlvQnVmZmVyUHJvdmlkZXIgYW5kIFNvdXJjZSBtZXRob2RzIGFyZSBjYWxsZWQgb24gUmVjb3JkVGhyZWFkCisvLyAncmVhZCcgZW11bGF0ZXMgYWN0dWFsIGF1ZGlvIGRhdGEgd2l0aCAwJ3MuIFRoaXMgaXMgT0sgYXMgJ2dldE5leHRCdWZmZXInCisvLyBhbmQgJ3JlbGVhc2VCdWZmZXInIGFyZSBzdHViYmVkIG91dCBhbmQgaWdub3JlIHRoZWlyIGlucHV0LgorLy8gSXQncyBub3QgcG9zc2libGUgdG8gcmV0cmlldmUgYWN0dWFsIGRhdGEgaGVyZSB3L28gYmxvY2tpbmcgJ29idGFpbkJ1ZmZlcicKKy8vIHVudGlsIHdlIGNvcHkgaXQuCitzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6OlJlY29yZFRocmVhZDo6UGFzc3RocnVQYXRjaFJlY29yZDo6cmVhZCgKKyAgICAgICAgdm9pZCogYnVmZmVyLCBzaXplX3QgYnl0ZXMsIHNpemVfdCogcmVhZCkKK3sKKyAgICBieXRlcyA9IHN0ZDo6bWluKGJ5dGVzLCBtRnJhbWVDb3VudCAqIG1GcmFtZVNpemUpOworICAgIHsKKyAgICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1SZWFkTG9jayk7CisgICAgICAgIG1SZWFkQ1Yud2FpdChsb2NrLCBbJl17IHJldHVybiBtUmVhZEVycm9yICE9IE5PX0VSUk9SIHx8IG1SZWFkQnl0ZXMgIT0gMDsgfSk7CisgICAgICAgIGlmIChtUmVhZEVycm9yICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBtTGFzdFJlYWRGcmFtZXMgPSAwOworICAgICAgICAgICAgcmV0dXJuIG1SZWFkRXJyb3I7CisgICAgICAgIH0KKyAgICAgICAgKnJlYWQgPSBzdGQ6Om1pbihieXRlcywgbVJlYWRCeXRlcyk7CisgICAgICAgIG1SZWFkQnl0ZXMgLT0gKnJlYWQ7CisgICAgfQorICAgIG1MYXN0UmVhZEZyYW1lcyA9ICpyZWFkIC8gbUZyYW1lU2l6ZTsKKyAgICBtZW1zZXQoYnVmZmVyLCAwLCAqcmVhZCk7CisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXNzdGhydVBhdGNoUmVjb3JkOjpnZXRDYXB0dXJlUG9zaXRpb24oCisgICAgICAgIGludDY0X3QqIGZyYW1lcywgaW50NjRfdCogdGltZSkKK3sKKyAgICBzcDxUaHJlYWRCYXNlPiB0aHJlYWQ7CisgICAgc3A8U3RyZWFtSW5IYWxJbnRlcmZhY2U+IHN0cmVhbSA9IG9idGFpblN0cmVhbSgmdGhyZWFkKTsKKyAgICByZXR1cm4gc3RyZWFtID8gc3RyZWFtLT5nZXRDYXB0dXJlUG9zaXRpb24oZnJhbWVzLCB0aW1lKSA6IE5PX0lOSVQ7Cit9CisKK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXNzdGhydVBhdGNoUmVjb3JkOjpzdGFuZGJ5KCkKK3sKKyAgICAvLyBSZWNvcmRUaHJlYWQgaXNzdWVzICdzdGFuZGJ5JyBjb21tYW5kIGluIHR3byBtYWpvciBjYXNlczoKKyAgICAvLyAxLiBFcnJvciBvbiByZWFkLS10aGlzIGNhc2UgaXMgaGFuZGxlZCBpbiAnb2J0YWluQnVmZmVyJy4KKyAgICAvLyAyLiBUcmFjayBpcyBzdG9wcGluZy0tYXMgUGFzc3RocnVQYXRjaFJlY29yZCBhc3N1bWVzIGNvbnRpbnVvdXMKKyAgICAvLyAgICBvdXRwdXQsIHRoaXMgY2FuIG9ubHkgaGFwcGVuIHdoZW4gdGhlIHNvZnR3YXJlIHBhdGNoCisgICAgLy8gICAgaXMgYmVpbmcgdG9ybiBkb3duLiBJbiB0aGlzIGNhc2UsIHRoZSBSZWNvcmRUaHJlYWQKKyAgICAvLyAgICB3aWxsIHRlcm1pbmF0ZSBhbmQgY2xvc2UgdGhlIEhBTCBzdHJlYW0uCisgICAgcmV0dXJuIDA7Cit9CisKKy8vIEFzIHRoZSBidWZmZXIgZ2V0cyBmaWxsZWQgaW4gb2J0YWluQnVmZmVyLCBoZXJlIHdlIG9ubHkgc2ltdWxhdGUgZGF0YSBjb25zdW1wdGlvbi4KK3N0YXR1c190IEF1ZGlvRmxpbmdlcjo6UmVjb3JkVGhyZWFkOjpQYXNzdGhydVBhdGNoUmVjb3JkOjpnZXROZXh0QnVmZmVyKAorICAgICAgICBBdWRpb0J1ZmZlclByb3ZpZGVyOjpCdWZmZXIqIGJ1ZmZlcikKK3sKKyAgICBidWZmZXItPmZyYW1lQ291bnQgPSBtTGFzdFJlYWRGcmFtZXM7CisgICAgYnVmZmVyLT5yYXcgPSBidWZmZXItPmZyYW1lQ291bnQgIT0gMCA/IG1TdHViQnVmZmVyLmdldCgpIDogbnVsbHB0cjsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9GbGluZ2VyOjpSZWNvcmRUaHJlYWQ6OlBhc3N0aHJ1UGF0Y2hSZWNvcmQ6OnJlbGVhc2VCdWZmZXIoCisgICAgICAgIEF1ZGlvQnVmZmVyUHJvdmlkZXI6OkJ1ZmZlciogYnVmZmVyKQoreworICAgIGJ1ZmZlci0+ZnJhbWVDb3VudCA9IDA7CisgICAgYnVmZmVyLT5yYXcgPSBudWxscHRyOworfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjdW5kZWYgTE9HX1RBRworI2RlZmluZSBMT0dfVEFHICJBRjo6TW1hcFRyYWNrIgogCiBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6TW1hcFRyYWNrKFRocmVhZEJhc2UgKnRocmVhZCwKICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyLApAQCAtMTk0MCwxMyArMjY3NCwxNSBAQAogICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCiAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAogICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICBib29sIGlzT3V0LAogICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgIHBpZF90IHBpZCwKKyAgICAgICAgcGlkX3QgY3JlYXRvclBpZCwKICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiAgICAgOiAgIFRyYWNrQmFzZSh0aHJlYWQsIE5VTEwsIGF0dHIsIHNhbXBsZVJhdGUsIGZvcm1hdCwKICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrLCAoc2l6ZV90KTAgLyogZnJhbWVDb3VudCAqLywKICAgICAgICAgICAgICAgICAgIG51bGxwdHIgLyogYnVmZmVyICovLCAoc2l6ZV90KTAgLyogYnVmZmVyU2l6ZSAqLywKLSAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgdWlkLCBmYWxzZSAvKiBpc091dCAqLywKKyAgICAgICAgICAgICAgICAgIHNlc3Npb25JZCwgY3JlYXRvclBpZCwgdWlkLCBpc091dCwKICAgICAgICAgICAgICAgICAgIEFMTE9DX05PTkUsCiAgICAgICAgICAgICAgICAgICBUWVBFX0RFRkFVTFQsIHBvcnRJZCksCiAgICAgICAgIG1QaWQocGlkKSwgbVNpbGVuY2VkKGZhbHNlKSwgbVNpbGVuY2VkTm90aWZpZWQoZmFsc2UpCkBAIC0xOTYzLDcgKzI2OTksNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6c3RhcnQoQXVkaW9TeXN0ZW06OnN5bmNfZXZlbnRfdCBldmVudCBfX3VudXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHRyaWdnZXJTZXNzaW9uIF9fdW51c2VkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCB0cmlnZ2VyU2Vzc2lvbiBfX3VudXNlZCkKIHsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CkBAIC0xOTk0LDE5ICsyNzMwLDI4IEBACiB7CiB9CiAKLS8qc3RhdGljKi8gdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6YXBwZW5kRHVtcEhlYWRlcihTdHJpbmc4JiByZXN1bHQpCit2b2lkIEF1ZGlvRmxpbmdlcjo6TW1hcFRocmVhZDo6TW1hcFRyYWNrOjphcHBlbmREdW1wSGVhZGVyKFN0cmluZzgmIHJlc3VsdCkKIHsKLSAgICByZXN1bHQuYXBwZW5kKCJDbGllbnQgU2Vzc2lvbiAgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGVcbiIpOworICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIkNsaWVudCBTZXNzaW9uIFBvcnQgSWQgIEZvcm1hdCBDaG4gbWFzayAgU1JhdGUgRmxhZ3MgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBpc091dCgpID8gIlVzZyBDVCI6ICJTb3VyY2UiKTsKIH0KIAogdm9pZCBBdWRpb0ZsaW5nZXI6Ok1tYXBUaHJlYWQ6Ok1tYXBUcmFjazo6YXBwZW5kRHVtcChTdHJpbmc4JiByZXN1bHQsIGJvb2wgYWN0aXZlIF9fdW51c2VkKQogewotICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiU2dSAlN3UgJTA4WCAlMDhYICU2dVxuIiwKKyAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlNnUgJTd1ICU3dSAlMDhYICUwOFggJTZ1IDB4JTAzWCAiLAogICAgICAgICAgICAgbVBpZCwKICAgICAgICAgICAgIG1TZXNzaW9uSWQsCisgICAgICAgICAgICBtUG9ydElkLAogICAgICAgICAgICAgbUZvcm1hdCwKICAgICAgICAgICAgIG1DaGFubmVsTWFzaywKLSAgICAgICAgICAgIG1TYW1wbGVSYXRlKTsKKyAgICAgICAgICAgIG1TYW1wbGVSYXRlLAorICAgICAgICAgICAgbUF0dHIuZmxhZ3MpOworICAgIGlmIChpc091dCgpKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiUzeCAlMngiLCBtQXR0ci51c2FnZSwgbUF0dHIuY29udGVudF90eXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQuYXBwZW5kRm9ybWF0KCIlNngiLCBtQXR0ci5zb3VyY2UpOworICAgIH0KKyAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvVHlwZWRMb2dnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCmluZGV4IDM4YzNjMDIuLjZlZjE5YmYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvZmxpbmdlci9UeXBlZExvZ2dlci5oCkBAIC05Nyw4ICs5Nyw0MiBAQAogI2RlZmluZSBMT0dfQVVESU9fU1RBVEUoKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCiAgICAgICAgIHgtPmxvZ0V2ZW50SGlzdFRzKE5CTG9nOjpFVkVOVF9BVURJT19TVEFURSwgaGFzaChfX0ZJTEVfXywgX19MSU5FX18pKTsgfSB3aGlsZSgwKQogCisvLyBMb2cgdGhlIGRpZmZlcmVuY2UgYmV3dGVlbiBmcmFtZXMgcHJlc2VudGVkIGJ5IEhBTCBhbmQgZnJhbWVzIHdyaXR0ZW4gdG8gSEFMIG91dHB1dCBzaW5rLAorLy8gZGl2aWRlZCBieSB0aGUgc2FtcGxlIHJhdGUuIFBhcmFtZXRlciBtcyBpcyBvZiB0eXBlIGRvdWJsZS4KKyNkZWZpbmUgTE9HX0xBVEVOQ1kobXMpIGRvIHsgTkJMb2c6OldyaXRlciAqeCA9IHRsTkJMb2dXcml0ZXI7IGlmICh4ICE9IG51bGxwdHIpIFwKKyAgICAgICAgeC0+bG9nPE5CTG9nOjpFVkVOVF9MQVRFTkNZPihtcyk7IH0gd2hpbGUgKDApCisKKy8vIFJlY29yZCB0aHJlYWQgb3ZlcnJ1biBldmVudCBuYW5vc2Vjb25kIHRpbWVzdGFtcC4gUGFyYW1ldGVyIG5zIGlzIGFuIGludDY0X3QuCisjZGVmaW5lIExPR19PVkVSUlVOKG5zKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBpZiAoeCAhPSBudWxscHRyKSBcCisgICAgICAgIHgtPmxvZzxOQkxvZzo6RVZFTlRfT1ZFUlJVTj4obnMpOyB9IHdoaWxlICgwKQorCisvLyBSZWNvcmQgdGhyZWFkIGluZm8uIFRoaXMgY3VycmVudGx5IGluY2x1ZGVzIHR5cGUsIGZyYW1lQ291bnQsIGFuZCBzYW1wbGVSYXRlLgorLy8gUGFyYW1ldGVyIHR5cGUgaXMgdGhyZWFkX2luZm9fdCBhcyBkZWZpbmVkIGluIE5CTG9nLmguCisjZGVmaW5lIExPR19USFJFQURfSU5GTyhpbmZvKSBkbyB7IE5CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBcCisgICAgICAgIGlmICh4ICE9IG51bGxwdHIpIHgtPmxvZzxOQkxvZzo6RVZFTlRfVEhSRUFEX0lORk8+KGluZm8pOyB9IHdoaWxlICgwKQorCisjZGVmaW5lIExPR19USFJFQURfUEFSQU1TKHBhcmFtcykgZG8ge05CTG9nOjpXcml0ZXIgKnggPSB0bE5CTG9nV3JpdGVyOyBcCisgICAgICAgIGlmICh4ICE9IG51bGxwdHIpIHgtPmxvZzxOQkxvZzo6RVZFTlRfVEhSRUFEX1BBUkFNUz4ocGFyYW1zKTsgfSB3aGlsZSAoMCkKKworLy8gUmVjb3JkIHRocmVhZCB1bmRlcnJ1biBldmVudCBuYW5vc2Vjb25kIHRpbWVzdGFtcC4gUGFyYW1ldGVyIG5zIGlzIGFuIGludDY0X3QuCisjZGVmaW5lIExPR19VTkRFUlJVTihucykgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAorICAgICAgICB4LT5sb2c8TkJMb2c6OkVWRU5UX1VOREVSUlVOPihucyk7IH0gd2hpbGUgKDApCisKKy8vIFJlY29yZCB0aHJlYWQgd2FybXVwIHRpbWUgaW4gbWlsbGlzZWNvbmRzLiBQYXJhbWV0ZXIgbXMgaXMgb2YgdHlwZSBkb3VibGUuCisjZGVmaW5lIExPR19XQVJNVVBfVElNRShtcykgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAorICAgICAgICB4LT5sb2c8TkJMb2c6OkVWRU5UX1dBUk1VUF9USU1FPihtcyk7IH0gd2hpbGUgKDApCisKKy8vIFJlY29yZCBhIHR5cGVkIGVudHJ5IHRoYXQgcmVwcmVzZW50cyBhIHRocmVhZCdzIHdvcmsgdGltZSBpbiBuYW5vc2Vjb25kcy4KKy8vIFBhcmFtZXRlciBucyBzaG91bGQgYmUgb2YgdHlwZSB1aW50MzJfdC4KKyNkZWZpbmUgTE9HX1dPUktfVElNRShucykgZG8geyBOQkxvZzo6V3JpdGVyICp4ID0gdGxOQkxvZ1dyaXRlcjsgaWYgKHggIT0gbnVsbHB0cikgXAorICAgICAgICB4LT5sb2c8TkJMb2c6OkVWRU5UX1dPUktfVElNRT4obnMpOyB9IHdoaWxlICgwKQorCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiBleHRlcm4gIkMiIHsKKy8vIFRPRE8gY29uc2lkZXIgYWRkaW5nIGEgdGhyZWFkX2xvY2FsIE5CTG9nOjpXcml0ZXIgdGxEdW1teU5CTG9nV3JpdGVyIGFuZCB0aGVuCisvLyBpbml0aWFsaXplIGJlbG93IHRsTkJMb2dXcml0ZXIgdG8gJnRsRHVtbXlOQkxvZ1dyaXRlciB0byByZW1vdmUgdGhlIG5lZWQgdG8KKy8vIGNoZWNrIGZvciBudWxscHRyIGV2ZXJ5IHRpbWUuIEFsc28gcmVkdWNlcyB0aGUgbmVlZCB0byBhZGQgYSBuZXcgbG9nZ2luZyBtYWNybyBhYm92ZQorLy8gZWFjaCB0aW1lIHdlIHdhbnQgdG8gbG9nIGEgbmV3IHR5cGUuCiBleHRlcm4gdGhyZWFkX2xvY2FsIE5CTG9nOjpXcml0ZXIgKnRsTkJMb2dXcml0ZXI7CiB9CiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDJiODlmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5icApAQCAtMCwwICsxLDUgQEAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5bWFuYWdlcl9pbnRlcmZhY2VfaGVhZGVycyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzI4MWIwNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIHNlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBcCi0gICAgc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwIFwKLSAgICBzZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAgXAotICAgIHNlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJiaW5kZXIgXAotICAgIGxpYmF1ZGlvY2xpZW50IFwKLSAgICBsaWJoYXJkd2FyZV9sZWdhY3kgXAotICAgIGxpYnNlcnZpY2V1dGlsaXR5IFwKLSAgICBsaWJhdWRpb3BvbGljeW1hbmFnZXIgXAotICAgIGxpYm1lZGlhX2hlbHBlciBcCi0gICAgbGlibWVkaWFtZXRyaWNzIFwKLSAgICBsaWJlZmZlY3RzY29uZmlnCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwotCi1MT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJhdWRpb3BvbGljeXNlcnZpY2UKLQotTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KLUxPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IG1hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJzb3VuZHRyaWdnZXIKLQotaWZlcSAoJChVU0VfQ09ORklHVVJBQkxFX0FVRElPX1BPTElDWSksIDEpCi0KLWlmbmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQotJChlcnJvciBDb25maWd1cmFibGUgcG9saWN5IGRvZXMgbm90IHN1cHBvcnQgbGVnYWN5IGNvbmYgZmlsZSkKLWVuZGlmICNpZm5lcSAoJChVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GKSwgMSkKLQotTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCi0gICAgcGFyYW1ldGVyLWZyYW1ld29yay5wb2xpY3kgXAotICAgIGF1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mIFwKLQotTE9DQUxfQ19JTkNMVURFUyArPSBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlCi1MT0NBTF9DX0lOQ0xVREVTICs9IGZyYW1ld29ya3MvYXYvaW5jbHVkZQotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhYmxlCi0KLWVsc2UKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJhdWRpb3BvbGljeWVuZ2luZWRlZmF1bHQKLQotZW5kaWYgIyBpZmVxICgkKFVTRV9DT05GSUdVUkFCTEVfQVVESU9fUE9MSUNZKSwgMSkKLQotTE9DQUxfQ19JTkNMVURFUyArPSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlIFwKLQotTE9DQUxfU1RBVElDX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlibWVkaWFfaGVscGVyCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IGxpYm1lZGlhbWV0cmljcwotCi1pZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyArPSBsaWJ4bWwyCi0KLUxPQ0FMX0NGTEFHUyArPSAtRFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKLWVuZGlmICNpZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQotCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdlcnJvcgotCi1MT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0Ci0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotaWZuZXEgKCQoVVNFX0NVU1RPTV9BVURJT19QT0xJQ1kpLCAxKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIG1hbmFnZXIvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0Ci0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UKLQotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLQotTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKLQotTE9DQUxfTU9EVUxFOj0gbGliYXVkaW9wb2xpY3ltYW5hZ2VyCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotZW5kaWYKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUmVjdXJzaXZlIGNhbGwgc3ViLWZvbGRlciBBbmRyb2lkLm1rCi0jCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaAppbmRleCA0ODEyYjFmLi45Njc2ZDA5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9BdWRpb1BvbGljeUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L0F1ZGlvUG9saWN5SW50ZXJmYWNlLmgKQEAgLTE3LDggKzE3LDEwIEBACiAjaWZuZGVmIEFORFJPSURfQVVESU9QT0xJQ1lfSU5URVJGQUNFX0gKICNkZWZpbmUgQU5EUk9JRF9BVURJT1BPTElDWV9JTlRFUkZBQ0VfSAogCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYS9EZXZpY2VEZXNjcmlwdG9yQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNTgsNDUgKzYwLDM5IEBACiAgICAgdHlwZWRlZiBlbnVtIHsKICAgICAgICAgQVBJX0lOUFVUX0lOVkFMSUQgPSAtMSwKICAgICAgICAgQVBJX0lOUFVUX0xFR0FDWSAgPSAwLC8vIGUuZy4gYXVkaW8gcmVjb3JkaW5nIGZyb20gYSBtaWNyb3Bob25lCi0gICAgICAgIEFQSV9JTlBVVF9NSVhfQ0FQVFVSRSwvLyB1c2VkIGZvciAicmVtb3RlIHN1Ym1peCIsIGNhcHR1cmUgb2YgdGhlIG1lZGlhIHRvIHBsYXkgaXQgcmVtb3RlbHkKKyAgICAgICAgQVBJX0lOUFVUX01JWF9DQVBUVVJFLC8vIHVzZWQgZm9yICJyZW1vdGUgc3VibWl4IiBsZWdhY3kgbW9kZSAobm8gREFQKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhcHR1cmUgb2YgdGhlIG1lZGlhIHRvIHBsYXkgaXQgcmVtb3RlbHkKICAgICAgICAgQVBJX0lOUFVUX01JWF9FWFRfUE9MSUNZX1JFUk9VVEUsLy8gdXNlZCBmb3IgcGxhdGZvcm0gYXVkaW8gcmVyb3V0aW5nLCB3aGVyZSBtaXhlcyBhcmUKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaGFuZGxlZCBieSBleHRlcm5hbCBhbmQgZHluYW1pY2FsbHkgaW5zdGFsbGVkCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvbGljaWVzIHdoaWNoIHJlcm91dGUgYXVkaW8gbWl4ZXMKKyAgICAgICAgQVBJX0lOUFVUX01JWF9QVUJMSUNfQ0FQVFVSRV9QTEFZQkFDSywgIC8vIHVzZWQgZm9yIHBsYXliYWNrIGNhcHR1cmUgd2l0aCBhIE1lZGlhUHJvamVjdGlvbgogICAgICAgICBBUElfSU5QVVRfVEVMRVBIT05ZX1JYLCAvLyB1c2VkIGZvciBjYXB0dXJlIGZyb20gdGVsZXBob255IFJYIHBhdGgKICAgICB9IGlucHV0X3R5cGVfdDsKIAotICAgIGVudW0gewotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTk9ORSA9IDAsCi0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQUxMID0gKDEgPDwgMCksICAgICAgLy8gQ29uY3VycmVuY3kgd2l0aCBhIGNhbGwKLSAgICAgICAgQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkUgPSAoMSA8PCAxKSwgICAvLyBDb25jdXJyZW5jeSB3aXRoIGFub3RoZXIgY2FwdHVyZQotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfSE9UV09SRCA9ICgxIDw8IDIpLCAgIC8vIENvbmN1cnJlbmN5IHdpdGggYSBob3R3b3JkCi0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9QUkVFTVBUID0gKDEgPDwgMyksICAgLy8gcHJlLWVtcHRlZCBzb21lb25lCi0gICAgICAgICAgICAgICAgLy8gTkI6IHByZWVtcHQgaXMgbWFya2VkIG9uIGEgc3VjY2Vzc2Z1bCByZXR1cm4sIG90aGVycyBhcmUgb24gZmFpbGluZyBjYWxscwotICAgICAgICBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTEFTVCA9ICgxIDw8IDQpLAotCi0gICAgICAgIEFQSV9JTlBVVF9DT05DVVJSRU5DWV9BTEwgPSAoQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0xBU1QgLSAxKSwKLSAgICB9OwotCi0gICAgdHlwZWRlZiB1aW50MzJfdCBjb25jdXJyZW5jeV90eXBlX19tYXNrX3Q7Ci0KIHB1YmxpYzoKICAgICB2aXJ0dWFsIH5BdWRpb1BvbGljeUludGVyZmFjZSgpIHt9CiAgICAgLy8KICAgICAvLyBjb25maWd1cmF0aW9uIGZ1bmN0aW9ucwogICAgIC8vCiAKKyAgICAvLyBJbmZvcm1zIEFQTSB0aGF0IG5ldyBIQUwgbW9kdWxlcyBhcmUgYXZhaWxhYmxlLiBUaGlzIHR5cGljYWxseSBoYXBwZW5zCisgICAgLy8gZHVlIHRvIHJlZ2lzdHJhdGlvbiBvZiBhbiBhdWRpbyBIQUwgc2VydmljZS4KKyAgICB2aXJ0dWFsIHZvaWQgb25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGUoKSA9IDA7CisKICAgICAvLyBpbmRpY2F0ZSBhIGNoYW5nZSBpbiBkZXZpY2UgY29ubmVjdGlvbiBzdGF0dXMKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpID0gMDsKICAgICAvLyByZXRyaWV2ZSBhIGRldmljZSBjb25uZWN0aW9uIHN0YXR1cwogICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcykgPSAwOwogICAgIC8vIGluZGljYXRlIGEgY2hhbmdlIGluIGRldmljZSBjb25maWd1cmF0aW9uCiAgICAgdmlydHVhbCBzdGF0dXNfdCBoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpID0gMDsKICAgICAvLyBpbmRpY2F0ZSBhIGNoYW5nZSBpbiBwaG9uZSBzdGF0ZS4gVmFsaWQgcGhvbmVzIHN0YXRlcyBhcmUgZGVmaW5lZCBieSBhdWRpb19tb2RlX3QKICAgICB2aXJ0dWFsIHZvaWQgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3Qgc3RhdGUpID0gMDsKICAgICAvLyBmb3JjZSB1c2luZyBhIHNwZWNpZmljIGRldmljZSBjYXRlZ29yeSBmb3IgdGhlIHNwZWNpZmllZCB1c2FnZQpAQCAtMTIyLDIzICsxMTgsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpID0gMDsKICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIG91dHB1dCBzdGFydHMgYmVpbmcgdXNlZCBieSBjb3JyZXNwb25kaW5nIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBvdXRwdXQgc3RvcHMgYmVpbmcgdXNlZCBieSBjb3JyZXNwb25kaW5nIHN0cmVhbS4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKICAgICAvLyByZWxlYXNlcyB0aGUgb3V0cHV0LgotICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgPSAwOworICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAKICAgICAvLyByZXF1ZXN0IGFuIGlucHV0IGFwcHJvcHJpYXRlIGZvciByZWNvcmQgZnJvbSB0aGUgc3VwcGxpZWQgZGV2aWNlIHdpdGggc3VwcGxpZWQgcGFyYW1ldGVycy4KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IHJpaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKQEAgLTE0NywxNiArMTM5LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfdHlwZV90ICppbnB1dFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSA9IDA7CiAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdGFydHMgYmVpbmcgdXNlZC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNpbGVuY2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgKmNvbmN1cnJlbmN5KSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAgICAgLy8gaW5kaWNhdGVzIHRvIHRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB0aGF0IHRoZSBpbnB1dCBzdG9wcyBiZWluZyB1c2VkLgotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpID0gMDsKICAgICAvLyByZWxlYXNlcyB0aGUgaW5wdXQuCi0gICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgPSAwOwogCiAgICAgLy8KICAgICAvLyB2b2x1bWUgY29udHJvbCBmdW5jdGlvbnMKQEAgLTE4MSw2ICsxNjgsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1heFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgpID0gMDsKKwogICAgIC8vIHJldHVybiB0aGUgc3RyYXRlZ3kgY29ycmVzcG9uZGluZyB0byBhIGdpdmVuIHN0cmVhbSB0eXBlCiAgICAgdmlydHVhbCB1aW50MzJfdCBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwogCkBAIC0xOTYsNiArMTk2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCkgPSAwOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpID0gMDsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpID0gMDsKKyAgICB2aXJ0dWFsIHN0YXR1c190IG1vdmVFZmZlY3RzVG9Jbyhjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBpZHMsIGF1ZGlvX2lvX2hhbmRsZV90IGlvKSA9IDA7CiAKICAgICB2aXJ0dWFsIGJvb2wgaXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3QgPSAwOwogICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLApAQCAtMjA1LDcgKzIwNiwxMCBAQAogICAgIC8vZHVtcCBzdGF0ZQogICAgIHZpcnR1YWwgc3RhdHVzX3QgICAgZHVtcChpbnQgZmQpID0gMDsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0QWxsb3dlZENhcHR1cmVQb2xpY3kodWlkX3QgdWlkLCBhdWRpb19mbGFnc19tYXNrX3QgZmxhZ3MpID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgaXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBvZmZsb2FkSW5mbykgPSAwOworICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgPSAwOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKQEAgLTIzMywxMSArMjM3LDE1IEBACiAgICAgdmlydHVhbCBzdGF0dXNfdCByZWdpc3RlclBvbGljeU1peGVzKGNvbnN0IFZlY3RvcjxBdWRpb01peD4mIG1peGVzKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyUG9saWN5TWl4ZXMoVmVjdG9yPEF1ZGlvTWl4PiBtaXhlcykgPSAwOwogCisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwgY29uc3QgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKQorICAgICAgICAgICAgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpID0gMDsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCkgPSAwOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSA9IDA7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldE1hc3Rlck1vbm8oYm9vbCBtb25vKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNb25vKGJvb2wgKm1vbm8pID0gMDsKQEAgLTI1MSw3ICsyNTksMzAgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcG9ydGVkKSA9IDA7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCkgPSAwOwogCi0gICAgdmlydHVhbCB2b2lkICAgICBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpOworICAgIHZpcnR1YWwgYm9vbCAgICAgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCAgICAgc2V0QXBwU3RhdGUodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcykgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5KSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgJnZvbHVtZUdyb3VwKSA9IDA7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkgPSAwOworCisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpID0gMDsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKSA9IDA7CiB9OwogCiAKQEAgLTI3OSw4ICszMTAsNyBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3Qgb3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgKmRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3JCYXNlPiYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbGF0ZW5jeU1zLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncykgPSAwOwogICAgIC8vIGNyZWF0ZXMgYSBzcGVjaWFsIG91dHB1dCB0aGF0IGlzIGR1cGxpY2F0ZWQgdG8gdGhlIHR3byBvdXRwdXRzIHBhc3NlZCBhcyBhcmd1bWVudHMuIFRoZSBkdXBsaWNhdGlvbiBpcyBwZXJmb3JtZWQgYnkKQEAgLTMyNCwxMSArMzU0LDYgQEAKICAgICAvLyBmdW5jdGlvbiBlbmFibGluZyB0byByZWNlaXZlIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9ucyBkaXJlY3RseSBmcm9tIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSB0byBhdWRpbyBwb2xpY3kgbWFuYWdlci4KICAgICB2aXJ0dWFsIFN0cmluZzggZ2V0UGFyYW1ldGVycyhhdWRpb19pb19oYW5kbGVfdCBpb0hhbmRsZSwgY29uc3QgU3RyaW5nOCYga2V5cykgPSAwOwogCi0gICAgLy8gcmVxdWVzdCB0aGUgcGxheWJhY2sgb2YgYSB0b25lIG9uIHRoZSBzcGVjaWZpZWQgc3RyZWFtOiB1c2VkIGZvciBpbnN0YW5jZSB0byByZXBsYWNlIG5vdGlmaWNhdGlvbiBzb3VuZHMgd2hlbiBwbGF5aW5nCi0gICAgLy8gb3ZlciBhIHRlbGVwaG9ueSBkZXZpY2UgZHVyaW5nIGEgcGhvbmUgY2FsbC4KLSAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA9IDA7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wVG9uZSgpID0gMDsKLQogICAgIC8vIHNldCBkb3duIGxpbmsgYXVkaW8gdm9sdW1lLgogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9pY2VWb2x1bWUoZmxvYXQgdm9sdW1lLCBpbnQgZGVsYXlNcyA9IDApID0gMDsKIApAQCAtMzM3LDYgKzM2MiwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQpID0gMDsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXRFZmZlY3RTdXNwZW5kZWQoaW50IGVmZmVjdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZGVkKSA9IDA7CisKICAgICAvKiBDcmVhdGUgYSBwYXRjaCBiZXR3ZWVuIHNldmVyYWwgc291cmNlIGFuZCBzaW5rIHBvcnRzICovCiAgICAgdmlydHVhbCBzdGF0dXNfdCBjcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLApAQCAtMzUzLDE1ICszODIsMjAgQEAKIAogICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkgPSAwOwogCisgICAgdmlydHVhbCB2b2lkIG9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncykgPSAwOworCiAgICAgdmlydHVhbCBhdWRpb191bmlxdWVfaWRfdCBuZXdBdWRpb1VuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCB1c2UpID0gMDsKIAogICAgIHZpcnR1YWwgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShTdHJpbmc4IHJlZ0lkLCBpbnQzMl90IHN0YXRlKSA9IDA7CiAKICAgICB2aXJ0dWFsIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgKmRldmljZUNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgPSAwOwogfTsKIAogZXh0ZXJuICJDIiBBdWRpb1BvbGljeUludGVyZmFjZSogY3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvVEVTVF9NQVBQSU5HIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvVEVTVF9NQVBQSU5HCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViNmMxOWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9URVNUX01BUFBJTkcKQEAgLTAsMCArMSw3IEBACit7CisgICJwcmVzdWJtaXQiOiBbCisgICAgeworICAgICAgICJuYW1lIjogImF1ZGlvcG9saWN5X3Rlc3RzIgorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvYXVkaW9fcG9saWN5LmNvbmYgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9hdWRpb19wb2xpY3kuY29uZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWI4M2ZlZi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9hdWRpb19wb2xpY3kuY29uZgorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0jCi0jIFRlbXBsYXRlIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUKLSMKLQotIyBHbG9iYWwgY29uZmlndXJhdGlvbiBzZWN0aW9uOgotIyAtIGJlZm9yZSBhdWRpbyBIQUwgdmVyc2lvbiAzLjA6Ci0jICAgbGlzdHMgaW5wdXQgYW5kIG91dHB1dCBkZXZpY2VzIGFsd2F5cyBwcmVzZW50IG9uIHRoZSBkZXZpY2UKLSMgICBhcyB3ZWxsIGFzIHRoZSBvdXRwdXQgZGV2aWNlIHNlbGVjdGVkIGJ5IGRlZmF1bHQuCi0jICAgRGV2aWNlcyBhcmUgZGVzaWduYXRlZCBieSBhIHN0cmluZyB0aGF0IGNvcnJlc3BvbmRzIHRvIHRoZSBlbnVtIGluIGF1ZGlvLmgKLSMKLSMgIGdsb2JhbF9jb25maWd1cmF0aW9uIHsKLSMgICAgYXR0YWNoZWRfb3V0cHV0X2RldmljZXMgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSCi0jICAgIGRlZmF1bHRfb3V0cHV0X2RldmljZSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIKLSMgICAgYXR0YWNoZWRfaW5wdXRfZGV2aWNlcyBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUN8QVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgKLSMgIH0KLSMKLSMgLSBhZnRlciBhbmQgaW5jbHVkaW5nIGF1ZGlvIEhBTCAzLjAgdGhlIGdsb2JhbF9jb25maWd1cmF0aW9uIHNlY3Rpb24gaXMgaW5jbHVkZWQgaW4gZWFjaAotIyAgIGhhcmR3YXJlIG1vZHVsZSBzZWN0aW9uLgotIyAgIGl0IGFsc28gaW5jbHVkZXMgdGhlIGF1ZGlvIEhBTCB2ZXJzaW9uIG9mIHRoaXMgaHcgbW9kdWxlOgotIyAgZ2xvYmFsX2NvbmZpZ3VyYXRpb24gewotIyAgICAuLi4KLSMgICAgIGF1ZGlvX2hhbF92ZXJzaW9uIDxtYWpvci5taW5vcj4gICMgYXVkaW8gSEFMIHZlcnNpb24gaW4gZS5nLiAzLjAKLSMgIH0KLSMgICBvdGhlciBhdHRyaWJ1dGVzIChhdHRhY2hlZCBkZXZpY2VzLCBkZWZhdWx0IGRldmljZSkgaGF2ZSB0byBiZSBpbmNsdWRlZCBpbiB0aGUKLSMgICBnbG9iYWxfY29uZmlndXJhdGlvbiBzZWN0aW9uIG9mIGVhY2ggaGFyZHdhcmUgbW9kdWxlCi0KLQotIyBhdWRpbyBoYXJkd2FyZSBtb2R1bGUgc2VjdGlvbjogY29udGFpbnMgZGVzY3JpcHRvcnMgZm9yIGFsbCBhdWRpbyBodyBtb2R1bGVzIHByZXNlbnQgb24gdGhlCi0jIGRldmljZS4gRWFjaCBodyBtb2R1bGUgbm9kZSBpcyBuYW1lZCBhZnRlciB0aGUgY29ycmVzcG9uZGluZyBodyBtb2R1bGUgbGlicmFyeSBiYXNlIG5hbWUuCi0jIEZvciBpbnN0YW5jZSwgInByaW1hcnkiIGNvcnJlc3BvbmRzIHRvIGF1ZGlvLnByaW1hcnkuPGRldmljZT4uc28uCi0jIFRoZSAicHJpbWFyeSIgbW9kdWxlIGlzIG1hbmRhdG9yeSBhbmQgbXVzdCBpbmNsdWRlIGF0IGxlYXN0IG9uZSBvdXRwdXQgd2l0aAotIyBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZIGZsYWcuCi0jIEVhY2ggbW9kdWxlIGRlc2NyaXB0b3IgY29udGFpbnMgb25lIG9yIG1vcmUgb3V0cHV0IHByb2ZpbGUgZGVzY3JpcHRvcnMgYW5kIHplcm8gb3IgbW9yZQotIyBpbnB1dCBwcm9maWxlIGRlc2NyaXB0b3JzLiBFYWNoIHByb2ZpbGUgbGlzdHMgYWxsIHRoZSBwYXJhbWV0ZXJzIHN1cHBvcnRlZCBieSBhIGdpdmVuIG91dHB1dAotIyBvciBpbnB1dCBzdHJlYW0gY2F0ZWdvcnkuCi0jIFRoZSAiY2hhbm5lbF9tYXNrcyIsICJmb3JtYXRzIiwgImRldmljZXMiIGFuZCAiZmxhZ3MiIGFyZSBzcGVjaWZpZWQgdXNpbmcgc3RyaW5ncyBjb3JyZXNwb25kaW5nCi0jIHRvIGVudW1zIGluIGF1ZGlvLmggYW5kIGF1ZGlvX3BvbGljeS5oLiBUaGV5IGFyZSBjb25jYXRlbmF0ZWQgYnkgdXNlIG9mICJ8IiB3aXRob3V0IHNwYWNlIG9yICJcbiIuCi0jCi0jIEZvciBhdWRpbyBIQUwgdmVyc2lvbiBwb3N0ZXJpb3IgdG8gMy4wIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgb3Igc3ViIHNlY3Rpb25zIGNhbiBiZSBwcmVzZW50IGluCi0jIGEgaHcgbW9kdWxlIHNlY3Rpb246Ci0jIC0gQSAiZ2xvYmFsX2NvbmZpZ3VyYXRpb24iIHNlY3Rpb246IHNlZSBhYm92ZQotIyAtIE9wdGlvbmFsbHkgYSAiZGV2aWNlcyIgc2VjdGlvbjoKLSMgICBUaGlzIHNlY3Rpb24gY29udGFpbnMgZGVzY3JpcHRvcnMgZm9yIGF1ZGlvIGRldmljZXMgd2l0aCBhdHRyaWJ1dGVzIGxpa2UgYW4gYWRkcmVzcyBvciBhCi0jICAgZ2FpbiBjb250cm9sbGVyLiBUaGUgc3ludGF4IGZvciB0aGUgZGV2aWNlcyBzZWN0aW9uIGFuZCBkZXZpY2UgZGVzY3JpcHRvciBpcyBhcyBmb2xsb3dzOgotIyAgICBkZXZpY2VzIHsKLSMgICAgICA8ZGV2aWNlIG5hbWU+IHsgICAgICAgICAgICAgICMgPGRldmljZSBuYW1lPjogYW55IHN0cmluZyB3aXRob3V0IHNwYWNlCi0jICAgICAgICB0eXBlIDxkZXZpY2UgdHlwZT4gICAgICAgICAjIDxkZXZpY2UgdHlwZT4gZS5nLiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIKLSMgICAgICAgIGFkZHJlc3MgPGFkZHJlc3M+ICAgICAgICAgICMgb3B0aW9uYWw6IGRldmljZSBhZGRyZXNzLCBjaGFyIHN0cmluZyBsZXNzIHRoYW4gNjQgaW4gbGVuZ3RoCi0jICAgICAgfQotIyAgICB9Ci0jIC0gb25lIG9yIG1vcmUgImdhaW5zIiBzZWN0aW9ucyBjYW4gYmUgcHJlc2VudCBpbiBhIGRldmljZSBkZXNjcmlwdG9yIHNlY3Rpb24uCi0jICAgSWYgcHJlc2VudCwgdGhleSBkZXNjcmliZSB0aGUgY2FwYWJpbGl0aWVzIG9mIGdhaW4gY29udHJvbGxlcnMgYXR0YWNoZWQgdG8gdGhpcyBpbnB1dCBvcgotIyAgIG91dHB1dCBkZXZpY2UuIGUuZy4gOgotIyAgIDxkZXZpY2UgbmFtZT4geyAgICAgICAgICAgICAgICAgICMgPGRldmljZSBuYW1lPjogYW55IHN0cmluZyB3aXRob3V0IHNwYWNlCi0jICAgICB0eXBlIDxkZXZpY2UgdHlwZT4gICAgICAgICAgICAgIyA8ZGV2aWNlIHR5cGU+IGUuZy4gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSCi0jICAgICBhZGRyZXNzIDxhZGRyZXNzPiAgICAgICAgICAgICAgIyBvcHRpb25hbDogZGV2aWNlIGFkZHJlc3MsIGNoYXIgc3RyaW5nIGxlc3MgdGhhbiA2NCBpbiBsZW5ndGgKLSMgICAgIGdhaW5zIHsKLSMgICAgICAgPGdhaW4gbmFtZT4gewotIyAgICAgICAgIG1vZGUgPGdhaW4gbW9kZXMgc3VwcG9ydGVkPiAgICAgICAgICAgICAgIyBlLmcuIEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUwotIyAgICAgICAgIGNoYW5uZWxfbWFzayA8Y29udHJvbGxlZCBjaGFubmVscz4gICAgICAgIyBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfQ0hBTk5FTFMKLSMgICAgICAgICBtaW5fdmFsdWVfbUIgPG1pbiB2YWx1ZSBpbiBtaWxsaWJlbD4KLSMgICAgICAgICBtYXhfdmFsdWVfbUIgPG1heCB2YWx1ZSBpbiBtaWxsaWJlbD4KLSMgICAgICAgICBkZWZhdWx0X3ZhbHVlX21CIDxkZWZhdWx0IHZhbHVlIGluIG1pbGxpYmVsPgotIyAgICAgICAgIHN0ZXBfdmFsdWVfbUIgPHN0ZXAgdmFsdWUgaW4gbWlsbGliZWw+Ci0jICAgICAgICAgbWluX3JhbXBfbXMgPG1pbiBkdXJhdGlvbiBpbiBtcz4gICAgICAgICAjIG5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9SQU1QCi0jICAgICAgICAgbWF4X3JhbXBfbXMgPG1heCBkdXJhdGlvbiBtcz4gICAgICAgICAgICAjIG5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9SQU1QCi0jICAgICAgIH0KLSMgICAgIH0KLSMgICB9Ci0jIC0gd2hlbiBhIGRldmljZSBkZXNjcmlwdG9yIGlzIHByZXNlbnQsIG91dHB1dCBhbmQgaW5wdXQgcHJvZmlsZXMgY2FuIHJlZmVyIHRvIHRoaXMgZGV2aWNlIGJ5Ci0jIGl0cyBuYW1lIGluIHRoZWlyICJkZXZpY2VzIiBzZWN0aW9uIGluc3RlYWQgb2Ygc3BlY2lmeWluZyBhIGRldmljZSB0eXBlLiBlLmcuIDoKLSMgICBvdXRwdXRzIHsKLSMgICAgIHByaW1hcnkgewotIyAgICAgICBzYW1wbGluZ19yYXRlcyA0NDEwMAotIyAgICAgICBjaGFubmVsX21hc2tzIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTwotIyAgICAgICBmb3JtYXRzIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCi0jICAgICAgIGRldmljZXMgPGRldmljZSBuYW1lPgotIyAgICAgICBmbGFncyBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZCi0jICAgICB9Ci0jICAgfQotIyBzYW1wbGUgYXVkaW9fcG9saWN5LmNvbmYgZmlsZSBiZWxvdwotCi1hdWRpb19od19tb2R1bGVzIHsKLSAgcHJpbWFyeSB7Ci0gICAgZ2xvYmFsX2NvbmZpZ3VyYXRpb24gewotICAgICAgYXR0YWNoZWRfb3V0cHV0X2RldmljZXMgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSCi0gICAgICBkZWZhdWx0X291dHB1dF9kZXZpY2UgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSCi0gICAgICBhdHRhY2hlZF9pbnB1dF9kZXZpY2VzIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQwotICAgICAgYXVkaW9faGFsX3ZlcnNpb24gMy4wCi0gICAgfQotICAgIGRldmljZXMgewotICAgICAgc3BlYWtlciB7Ci0gICAgICAgIHR5cGUgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSCi0gICAgICAgIGdhaW5zIHsKLSAgICAgICAgICBnYWluXzEgewotICAgICAgICAgICAgbW9kZSBBVURJT19HQUlOX01PREVfSk9JTlQKLSAgICAgICAgICAgIG1pbl92YWx1ZV9tQiAtODQwMAotICAgICAgICAgICAgbWF4X3ZhbHVlX21CIDQwMDAKLSAgICAgICAgICAgIGRlZmF1bHRfdmFsdWVfbUIgMAotICAgICAgICAgICAgc3RlcF92YWx1ZV9tQiAxMDAKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0cHV0cyB7Ci0gICAgICBwcmltYXJ5IHsKLSAgICAgICAgc2FtcGxpbmdfcmF0ZXMgNDgwMDAKLSAgICAgICAgY2hhbm5lbF9tYXNrcyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KLSAgICAgICAgZm9ybWF0cyBBVURJT19GT1JNQVRfUENNXzE2X0JJVAotICAgICAgICBkZXZpY2VzIHNwZWFrZXIKLSAgICAgICAgZmxhZ3MgQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWQotICAgICAgfQotICAgIH0KLSAgICBpbnB1dHMgewotICAgICAgcHJpbWFyeSB7Ci0gICAgICAgIHNhbXBsaW5nX3JhdGVzIDgwMDB8MTYwMDAKLSAgICAgICAgY2hhbm5lbF9tYXNrcyBBVURJT19DSEFOTkVMX0lOX01PTk8KLSAgICAgICAgZm9ybWF0cyBBVURJT19GT1JNQVRfUENNXzE2X0JJVAotICAgICAgICBkZXZpY2VzIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQwotICAgICAgfQotICAgIH0KLSAgfQotICByX3N1Ym1peCB7Ci0gICAgZ2xvYmFsX2NvbmZpZ3VyYXRpb24gewotICAgICAgYXR0YWNoZWRfaW5wdXRfZGV2aWNlcyBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWAotICAgICAgYXVkaW9faGFsX3ZlcnNpb24gMi4wCi0gICAgfQotICAgIG91dHB1dHMgewotICAgICAgc3VibWl4IHsKLSAgICAgICAgc2FtcGxpbmdfcmF0ZXMgNDgwMDAKLSAgICAgICAgY2hhbm5lbF9tYXNrcyBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8KLSAgICAgICAgZm9ybWF0cyBBVURJT19GT1JNQVRfUENNXzE2X0JJVAotICAgICAgICBkZXZpY2VzIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWAotICAgICAgfQotICAgIH0KLSAgICBpbnB1dHMgewotICAgICAgc3VibWl4IHsKLSAgICAgICAgc2FtcGxpbmdfcmF0ZXMgNDgwMDAKLSAgICAgICAgY2hhbm5lbF9tYXNrcyBBVURJT19DSEFOTkVMX0lOX1NURVJFTwotICAgICAgICBmb3JtYXRzIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUCi0gICAgICAgIGRldmljZXMgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUwZDJmNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNyBAQAorY2NfbGlicmFyeV9oZWFkZXJzIHsKKyAgICBuYW1lOiAibGliYXVkaW9wb2xpY3ljb21tb24iLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb25faGVhZGVycyIsCisgICAgXSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjY2U4ZTMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFJlY3Vyc2l2ZSBjYWxsIHN1Yi1mb2xkZXIgQW5kcm9pZC5tawotIwotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9Sb3V0aW5nU3RyYXRlZ3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1JvdXRpbmdTdHJhdGVneS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzg5NjdlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1JvdXRpbmdTdHJhdGVneS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIFRpbWUgaW4gbWlsbGlzZWNvbmRzIGFmdGVyIG1lZGlhIHN0b3BwZWQgcGxheWluZyBkdXJpbmcgd2hpY2ggd2UgY29uc2lkZXIgdGhhdCB0aGUKLS8vIHNvbmlmaWNhdGlvbiBzaG91bGQgYmUgYXMgdW5vYnRydXNpdmUgYXMgZHVyaW5nIHRoZSB0aW1lIG1lZGlhIHdhcyBwbGF5aW5nLgotI2RlZmluZSBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSA1MDAwCi0KLWVudW0gcm91dGluZ19zdHJhdGVneSB7Ci0gICAgU1RSQVRFR1lfTUVESUEsCi0gICAgU1RSQVRFR1lfUEhPTkUsCi0gICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLAotICAgIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMLAotICAgIFNUUkFURUdZX0RUTUYsCi0gICAgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwKLSAgICBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIsCi0gICAgU1RSQVRFR1lfQUNDRVNTSUJJTElUWSwKLSAgICBTVFJBVEVHWV9SRVJPVVRJTkcsCi0gICAgTlVNX1NUUkFURUdJRVMKLX07Ci0KLX07IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9pbmNsdWRlL1ZvbHVtZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKaW5kZXggZmMwMTJhMi4uN2M4Y2U4MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvVm9sdW1lLmgKQEAgLTE2LDEwICsxNiwyNyBAQAogCiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29tbW9uVHlwZXMuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0NvbnRhaW5lcnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxtYXRoLmg+CiAKKyNpbmNsdWRlICJwb2xpY3kuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIFZvbHVtZVNvdXJjZSBpcyB0aGUgZGlzY3JpbWluZW50IGZvciB2b2x1bWUgbWFuYWdlbWVudCBvbiBhbiBvdXRwdXQuCisgKiBJdCB1c2VkIHRvIGJlIHRoZSBzdHJlYW0gdHlwZSBieSBsZWdhY3ksIGl0IG1heSBiZSBob3N0IHZvbHVtZSBncm91cCBvciBhIHZvbHVtZSBjdXJ2ZXMgaWYKKyAqIHdlIGFsbG93IHRvIGhhdmUgbW9yZSB0aGFuIG9uZSBjdXJ2ZSBwZXIgdm9sdW1lIGdyb3VwIChtYW5kYXRvcnkgdG8gZ2V0IHJpZCBvZiBBdWRpb1NlcnZlcgorICogc3RyZWFtIGFsaWFzZXMuCisgKi8KK2VudW0gVm9sdW1lU291cmNlIDogc3RkOjp1bmRlcmx5aW5nX3R5cGU8dm9sdW1lX2dyb3VwX3Q+Ojp0eXBlOworc3RhdGljIGNvbnN0IFZvbHVtZVNvdXJjZSBWT0xVTUVfU09VUkNFX05PTkUgPSBzdGF0aWNfY2FzdDxWb2x1bWVTb3VyY2U+KFZPTFVNRV9HUk9VUF9OT05FKTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCiAvLyBBYnNvbHV0ZSBtaW4gdm9sdW1lIGluIGRCIChjYW4gYmUgcmVwcmVzZW50ZWQgaW4gc2luZ2xlIHByZWNpc2lvbiBub3JtYWwgZmxvYXQgdmFsdWUpCiAjZGVmaW5lIFZPTFVNRV9NSU5fREIgKC03NTgpCiAKQEAgLTY4LDQzICs4NSwyNiBAQAogICAgICAqCiAgICAgICogQHJldHVybiBzdWJzZXQgb2YgZGV2aWNlIHJlcXVpcmVkIHRvIGxpbWl0IHRoZSBudW1iZXIgb2Ygdm9sdW1lIGNhdGVnb3J5IHBlciBkZXZpY2UKICAgICAgKi8KLSAgICBzdGF0aWMgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQorICAgIHN0YXRpYyBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yVm9sdW1lKGNvbnN0IGFuZHJvaWQ6OkRldmljZVR5cGVTZXQmIGRldmljZVR5cGVzKQogICAgIHsKLSAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICBpZiAoZGV2aWNlVHlwZXMuZW1wdHkoKSkgewogICAgICAgICAgICAgLy8gdGhpcyBoYXBwZW5zIHdoZW4gZm9yY2luZyBhIHJvdXRlIHVwZGF0ZSBhbmQgbm8gdHJhY2sgaXMgYWN0aXZlIG9uIGFuIG91dHB1dC4KICAgICAgICAgICAgIC8vIEluIHRoaXMgY2FzZSB0aGUgcmV0dXJuZWQgY2F0ZWdvcnkgaXMgbm90IGltcG9ydGFudC4KLSAgICAgICAgICAgIGRldmljZSA9ICBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgIH0gZWxzZSBpZiAocG9wY291bnQoZGV2aWNlKSA+IDEpIHsKLSAgICAgICAgICAgIC8vIE11bHRpcGxlIGRldmljZSBzZWxlY3Rpb24gaXMgZWl0aGVyOgotICAgICAgICAgICAgLy8gIC0gc3BlYWtlciArIG9uZSBvdGhlciBkZXZpY2U6IGdpdmUgcHJpb3JpdHkgdG8gc3BlYWtlciBpbiB0aGlzIGNhc2UuCi0gICAgICAgICAgICAvLyAgLSBvbmUgQTJEUCBkZXZpY2UgKyBhbm90aGVyIGRldmljZTogaGFwcGVucyB3aXRoIGR1cGxpY2F0ZWQgb3V0cHV0LiBJbiB0aGlzIGNhc2UKLSAgICAgICAgICAgIC8vIHJldGFpbiB0aGUgZGV2aWNlIG9uIHRoZSBBMkRQIG91dHB1dCBhcyB0aGUgb3RoZXIgbXVzdCBub3QgY29ycmVzcG9uZCB0byBhbiBhY3RpdmUKLSAgICAgICAgICAgIC8vIHNlbGVjdGlvbiBpZiBub3QgdGhlIHNwZWFrZXIuCi0gICAgICAgICAgICAvLyAgLSBIRE1JLUNFQyBzeXN0ZW0gYXVkaW8gbW9kZSBvbmx5IG91dHB1dDogZ2l2ZSBwcmlvcml0eSB0byBhdmFpbGFibGUgaXRlbSBpbiBvcmRlci4KLSAgICAgICAgICAgIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDOwotICAgICAgICAgICAgfSBlbHNlIGlmIChkZXZpY2UgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9BVVhfTElORTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9TUERJRikgewotICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9PVVRfU1BESUY7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKICAgICAgICAgfQogCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gYXBtX2V4dHJhY3Rfb25lX2F1ZGlvX2RldmljZShkZXZpY2VUeXBlcyk7CisKICAgICAgICAgLypTUEVBS0VSX1NBRkUgaXMgYW4gYWxpYXMgb2YgU1BFQUtFUiBmb3IgcHVycG9zZXMgb2Ygdm9sdW1lIGNvbnRyb2wqLwotICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKQotICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICBpZiAoZGV2aWNlVHlwZSA9PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkgeworICAgICAgICAgICAgZGV2aWNlVHlwZSA9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgfQogCi0gICAgICAgIEFMT0dXX0lGKHBvcGNvdW50KGRldmljZSkgIT0gMSwKLSAgICAgICAgICAgICAgICAgImdldERldmljZUZvclZvbHVtZSgpIGludmFsaWQgZGV2aWNlIGNvbWJpbmF0aW9uOiAlMDh4IiwKLSAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKyAgICAgICAgQUxPR1dfSUYoZGV2aWNlVHlwZSA9PSBBVURJT19ERVZJQ0VfTk9ORSwKKyAgICAgICAgICAgICAgICAgImdldERldmljZUZvclZvbHVtZSgpIGludmFsaWQgZGV2aWNlIGNvbWJpbmF0aW9uOiAlcywgcmV0dXJuaW5nIEFVRElPX0RFVklDRV9OT05FIiwKKyAgICAgICAgICAgICAgICAgYW5kcm9pZDo6ZHVtcERldmljZVR5cGVzKGRldmljZVR5cGVzKS5jX3N0cigpKTsKIAotICAgICAgICByZXR1cm4gZGV2aWNlOworICAgICAgICByZXR1cm4gZGV2aWNlVHlwZTsKICAgICB9CiAKICAgICAvKioKQEAgLTExNCw5ICsxMTQsOSBAQAogICAgICAqCiAgICAgICogQHJldHVybiBkZXZpY2UgY2F0ZWdvcnkuCiAgICAgICovCi0gICAgc3RhdGljIGRldmljZV9jYXRlZ29yeSBnZXREZXZpY2VDYXRlZ29yeShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQorICAgIHN0YXRpYyBkZXZpY2VfY2F0ZWdvcnkgZ2V0RGV2aWNlQ2F0ZWdvcnkoY29uc3QgYW5kcm9pZDo6RGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpCiAgICAgewotICAgICAgICBzd2l0Y2goZ2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSkpIHsKKyAgICAgICAgc3dpdGNoKGdldERldmljZUZvclZvbHVtZShkZXZpY2VUeXBlcykpIHsKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFOgogICAgICAgICAgICAgcmV0dXJuIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRTsKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQ6CkBAIC0xMzQsNiArMTM0LDcgQEAKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U6CiAgICAgICAgICAgICByZXR1cm4gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQTsKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI6CisgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkU6CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVDoKICAgICAgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI6CiAgICAgICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZOgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUvcG9saWN5LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaAppbmRleCA5YmQ2OGUxLi4wNTM3MzY1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZS9wb2xpY3kuaApAQCAtMTcsOSArMTcsMjIgQEAKICNwcmFnbWEgb25jZQogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db250YWluZXJzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgU3RyZWFtVHlwZVZlY3RvciA9IHN0ZDo6dmVjdG9yPGF1ZGlvX3N0cmVhbV90eXBlX3Q+OworCitzdGF0aWMgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGRlZmF1bHRBdHRyID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAogCiBzdGF0aWMgY29uc3QgYXVkaW9fZm9ybWF0X3QgZ0R5bmFtaWNGb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKIAorc3RhdGljIGNvbnN0IHVpbnQzMl90IFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZID0gNTAwMDsKKwogLy8gRm9yIG1peGVkIG91dHB1dCBhbmQgaW5wdXRzLCB0aGUgcG9saWN5IHdpbGwgdXNlIG1heCBtaXhlciBzYW1wbGluZyByYXRlcy4KIC8vIERvIG5vdCBsaW1pdCBzYW1wbGluZyByYXRlIG90aGVyd2lzZQogI2RlZmluZSBTQU1QTEVfUkFURV9IWl9NQVggMTkyMDAwCkBAIC0zMiwyMiArNDUsNiBAQAogI2RlZmluZSBNQVhfTUlYRVJfQ0hBTk5FTF9DT1VOVCBGQ0NfOAogCiAvKioKLSAqIEEgZGV2aWNlIG1hc2sgZm9yIGFsbCBhdWRpbyBpbnB1dCBkZXZpY2VzIHRoYXQgYXJlIGNvbnNpZGVyZWQgInZpcnR1YWwiIHdoZW4gZXZhbHVhdGluZwotICogYWN0aXZlIGlucHV0cyBpbiBnZXRBY3RpdmVJbnB1dHMoKQotICovCi0jZGVmaW5lIEFQTV9BVURJT19JTl9ERVZJQ0VfVklSVFVBTF9BTEwgKEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYfFwKLSAgICAgICAgQVVESU9fREVWSUNFX0lOX0JVU3xBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIpCi0KLQotLyoqCi0gKiBBIGRldmljZSBtYXNrIGZvciBhbGwgYXVkaW8gaW5wdXQgYW5kIG91dHB1dCBkZXZpY2VzIHdoZXJlIG1hdGNoaW5nIGlucHV0cy9vdXRwdXRzIG9uIGRldmljZQotICogdHlwZSBhbG9uZSBpcyBub3QgZW5vdWdoOiB0aGUgYWRkcmVzcyBtdXN0IG1hdGNoIHRvbwotICovCi0jZGVmaW5lIEFQTV9BVURJT19ERVZJQ0VfT1VUX01BVENIX0FERFJFU1NfQUxMIChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVh8QVVESU9fREVWSUNFX09VVF9CVVMpCi0KLSNkZWZpbmUgQVBNX0FVRElPX0RFVklDRV9JTl9NQVRDSF9BRERSRVNTX0FMTCAoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVh8QVVESU9fREVWSUNFX0lOX0JVUykKLQotLyoqCiAgKiBBbGlhcyB0byBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFQgZGVmaW5lZCBmb3IgY2xhcmlmaWNhdGlvbiB3aGVuIHRoaXMgdmFsdWUgaXMgdXNlZCBieSB2b2x1bWUKICAqIGNvbnRyb2wgQVBJcyAoZS5nIHNldFN0cmVhbVZvbHVtZUluZGV4KCkuCiAgKi8KQEAgLTY4LDIwICs2NSwzMSBAQAogfQogCiAvKioKLSAqIENoZWNrIGlmIHRoZSBpbnB1dCBkZXZpY2UgZ2l2ZW4gaXMgY29uc2lkZXJlZCBhcyBhIHZpcnR1YWwgZGV2aWNlLgorICogQ2hlY2sgd2hldGhlciB0aGUgb3V0cHV0IGRldmljZSB0eXBlIGlzIG9uZQorICogd2hlcmUgYWRkcmVzc2VzIGFyZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gb25lIGNvbm5lY3RlZCBkZXZpY2UgYW5kIGFub3RoZXIKICAqCiAgKiBAcGFyYW1baW5dIGRldmljZSB0byBjb25zaWRlcgogICoKLSAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIGEgdmlydHVhbCBvbmUsIGZhbHNlIG90aGVyd2lzZS4KKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIG5lZWRzIGRpc3Rpbmd1aXNoIG9uIGFkZHJlc3MsIGZhbHNlIG90aGVyd2lzZS4uCiAgKi8KLXN0YXRpYyBpbmxpbmUgYm9vbCBpc192aXJ0dWFsX2lucHV0X2RldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQorc3RhdGljIGlubGluZSBib29sIGFwbV9hdWRpb19vdXRfZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQogewotICAgIGlmICgoZGV2aWNlICYgQVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgewotICAgICAgICBkZXZpY2UgJj0gfkFVRElPX0RFVklDRV9CSVRfSU47Ci0gICAgICAgIGlmICgocG9wY291bnQoZGV2aWNlKSA9PSAxKSAmJiAoKGRldmljZSAmIH5BUE1fQVVESU9fSU5fREVWSUNFX1ZJUlRVQUxfQUxMKSA9PSAwKSkKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVggfHwKKyAgICAgICAgICAgZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfQlVTOworfQorCisvKioKKyAqIENoZWNrIHdoZXRoZXIgdGhlIGlucHV0IGRldmljZSB0eXBlIGlzIG9uZQorICogd2hlcmUgYWRkcmVzc2VzIGFyZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gb25lIGNvbm5lY3RlZCBkZXZpY2UgYW5kIGFub3RoZXIKKyAqCisgKiBAcGFyYW1baW5dIGRldmljZSB0byBjb25zaWRlcgorICoKKyAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIG5lZWRzIGRpc3Rpbmd1aXNoIG9uIGFkZHJlc3MsIGZhbHNlIG90aGVyd2lzZS4uCisgKi8KK3N0YXRpYyBpbmxpbmUgYm9vbCBhcG1fYXVkaW9faW5fZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIHJldHVybiBkZXZpY2UgPT0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVggfHwKKyAgICAgICAgICAgZGV2aWNlID09IEFVRElPX0RFVklDRV9JTl9CVVM7CiB9CiAKIC8qKgpAQCAtOTQsMTAgKzEwMiwyMCBAQAogICovCiBzdGF0aWMgaW5saW5lIGJvb2wgZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQogewotICAgIHJldHVybiAoKChkZXZpY2UgJiBBVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSAmJgotICAgICAgICAgICAgKCh+QVVESU9fREVWSUNFX0JJVF9JTiAmIGRldmljZSAmIEFQTV9BVURJT19ERVZJQ0VfSU5fTUFUQ0hfQUREUkVTU19BTEwpICE9IDApKSB8fAotICAgICAgICAgICAoKChkZXZpY2UgJiBBVURJT19ERVZJQ0VfQklUX0lOKSA9PSAwKSAmJgotICAgICAgICAgICAgKChkZXZpY2UgJiBBUE1fQVVESU9fREVWSUNFX09VVF9NQVRDSF9BRERSRVNTX0FMTCkgIT0gMCkpOworICAgIHJldHVybiBhcG1fYXVkaW9faW5fZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpIHx8CisgICAgICAgICAgIGFwbV9hdWRpb19vdXRfZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpOworfQorCisvKioKKyAqIENoZWNrIHdoZXRoZXIgYXVkaW8gZGV2aWNlIGhhcyBlbmNvZGluZyBjYXBhYmlsaXR5LgorICoKKyAqIEBwYXJhbVtpbl0gZGV2aWNlIHRvIGNvbnNpZGVyCisgKgorICogQHJldHVybiB0cnVlIGlmIGRldmljZSBoYXMgZW5jb2RpbmcgY2FwYWJpbGl0eSwgZmFsc2Ugb3RoZXJ3aXNlLi4KKyAqLworc3RhdGljIGlubGluZSBib29sIGRldmljZV9oYXNfZW5jb2RpbmdfY2FwYWJpbGl0eShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIHJldHVybiBhdWRpb19pc19hMmRwX291dF9kZXZpY2UoZGV2aWNlKTsKIH0KIAogLyoqCkBAIC0xMDgsNyArMTI2LDEwIEBACiAgKiBAcGFyYW1baW5dIGlucHV0U291cmNlIHRvIGNvbnNpZGVyLiBWYWxpZCBzb3VyY2VzIGFyZToKICAqIC0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04KICAqIC0gQVVESU9fU09VUkNFX0NBTUNPUkRFUgorICogLSBBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0UKKyAqIC0gQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VECiAgKiAtIEFVRElPX1NPVVJDRV9NSUMKKyAqIC0gQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFCiAgKiAtIEFVRElPX1NPVVJDRV9GTV9UVU5FUgogICogLSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04KICAqIC0gQVVESU9fU09VUkNFX0hPVFdPUkQKQEAgLTEyMSwxMCArMTQyLDE2IEBACiB7CiAgICAgc3dpdGNoIChpbnB1dFNvdXJjZSkgewogICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT046Ci0gICAgICAgIHJldHVybiA2OworICAgICAgICByZXR1cm4gOTsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6Ci0gICAgICAgIHJldHVybiA1OworICAgICAgICByZXR1cm4gODsKKyAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRToKKyAgICAgICAgcmV0dXJuIDc7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQ6CisgICAgICAgIHJldHVybiA2OwogICAgIGNhc2UgQVVESU9fU09VUkNFX01JQzoKKyAgICAgICAgcmV0dXJuIDU7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0U6CiAgICAgICAgIHJldHVybiA0OwogICAgIGNhc2UgQVVESU9fU09VUkNFX0ZNX1RVTkVSOgogICAgICAgICByZXR1cm4gMzsKQEAgLTE1MiwzICsxNzksNjUgQEAKICAgICB9CiAgICAgcmV0dXJuIGZvcm1hdDEgPT0gZm9ybWF0MjsKIH0KKworLyoqCisgKiBAYnJpZWYgaGFzU3RyZWFtIGNoZWNrcyBpZiBhIGdpdmVuIHN0cmVhbSB0eXBlIGlzIGZvdW5kIGluIHRoZSBsaXN0IG9mIHN0cmVhbXMKKyAqIEBwYXJhbSBzdHJlYW1zIGNvbGxlY3Rpb24gb2Ygc3RyZWFtIHR5cGVzIHRvIGNvbnNpZGVyLgorICogQHBhcmFtIHN0cmVhbVR5cGUgdG8gY29uc2lkZXIKKyAqIEByZXR1cm4gdHJ1ZSBpZiB2b2ljZSBzdHJlYW0gaXMgZm91bmQgaW4gdGhlIGdpdmVuIHN0cmVhbXMsIGZhbHNlIG90aGVyd2lzZQorICovCitzdGF0aWMgaW5saW5lIGJvb2wgaGFzU3RyZWFtKGNvbnN0IGFuZHJvaWQ6OlN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSkKK3sKKyAgICByZXR1cm4gc3RkOjpmaW5kKGJlZ2luKHN0cmVhbXMpLCBlbmQoc3RyZWFtcyksIHN0cmVhbVR5cGUpICE9IGVuZChzdHJlYW1zKTsKK30KKworLyoqCisgKiBAYnJpZWYgaGFzVm9pY2VTdHJlYW0gY2hlY2tzIGlmIGEgdm9pY2Ugc3RyZWFtIGlzIGZvdW5kIGluIHRoZSBsaXN0IG9mIHN0cmVhbXMKKyAqIEBwYXJhbSBzdHJlYW1zIGNvbGxlY3Rpb24gdG8gY29uc2lkZXIuCisgKiBAcmV0dXJuIHRydWUgaWYgdm9pY2Ugc3RyZWFtIGlzIGZvdW5kIGluIHRoZSBnaXZlbiBzdHJlYW1zLCBmYWxzZSBvdGhlcndpc2UKKyAqLworc3RhdGljIGlubGluZSBib29sIGhhc1ZvaWNlU3RyZWFtKGNvbnN0IGFuZHJvaWQ6OlN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbXMpCit7CisgICAgcmV0dXJuIGhhc1N0cmVhbShzdHJlYW1zLCBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7Cit9CisKKy8qKgorICogQGJyaWVmIGV4dHJhY3Qgb25lIGRldmljZSByZWxldmFudCBmcm9tIG11bHRpcGxlIGRldmljZSBzZWxlY3Rpb24KKyAqIEBwYXJhbSBkZXZpY2VUeXBlcyBjb2xsZWN0aW9uIG9mIGF1ZGlvIGRldmljZSB0eXBlCisgKiBAcmV0dXJuIHRoZSBkZXZpY2UgdHlwZSB0aGF0IGlzIHNlbGVjdGVkCisgKi8KK3N0YXRpYyBpbmxpbmUgYXVkaW9fZGV2aWNlc190IGFwbV9leHRyYWN0X29uZV9hdWRpb19kZXZpY2UoCisgICAgICAgIGNvbnN0IGFuZHJvaWQ6OkRldmljZVR5cGVTZXQmIGRldmljZVR5cGVzKSB7CisgICAgaWYgKGRldmljZVR5cGVzLmVtcHR5KCkpIHsKKyAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOworICAgIH0gZWxzZSBpZiAoZGV2aWNlVHlwZXMuc2l6ZSgpID09IDEpIHsKKyAgICAgICAgcmV0dXJuICooZGV2aWNlVHlwZXMuYmVnaW4oKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gTXVsdGlwbGUgZGV2aWNlIHNlbGVjdGlvbiBpcyBlaXRoZXI6CisgICAgICAgIC8vICAtIHNwZWFrZXIgKyBvbmUgb3RoZXIgZGV2aWNlOiBnaXZlIHByaW9yaXR5IHRvIHNwZWFrZXIgaW4gdGhpcyBjYXNlLgorICAgICAgICAvLyAgLSBvbmUgQTJEUCBkZXZpY2UgKyBhbm90aGVyIGRldmljZTogaGFwcGVucyB3aXRoIGR1cGxpY2F0ZWQgb3V0cHV0LiBJbiB0aGlzIGNhc2UKKyAgICAgICAgLy8gcmV0YWluIHRoZSBkZXZpY2Ugb24gdGhlIEEyRFAgb3V0cHV0IGFzIHRoZSBvdGhlciBtdXN0IG5vdCBjb3JyZXNwb25kIHRvIGFuIGFjdGl2ZQorICAgICAgICAvLyBzZWxlY3Rpb24gaWYgbm90IHRoZSBzcGVha2VyLgorICAgICAgICAvLyAgLSBIRE1JLUNFQyBzeXN0ZW0gYXVkaW8gbW9kZSBvbmx5IG91dHB1dDogZ2l2ZSBwcmlvcml0eSB0byBhdmFpbGFibGUgaXRlbSBpbiBvcmRlci4KKyAgICAgICAgaWYgKGRldmljZVR5cGVzLmNvdW50KEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgfSBlbHNlIGlmIChkZXZpY2VUeXBlcy5jb3VudChBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSkgIT0gMCkgeworICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOworICAgICAgICB9IGVsc2UgaWYgKGRldmljZVR5cGVzLmNvdW50KEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkMpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDOworICAgICAgICB9IGVsc2UgaWYgKGRldmljZVR5cGVzLmNvdW50KEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkUpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FOworICAgICAgICB9IGVsc2UgaWYgKGRldmljZVR5cGVzLmNvdW50KEFVRElPX0RFVklDRV9PVVRfU1BESUYpICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfT1VUX1NQRElGOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZGV2aWNlc190PiBhMmRwRGV2aWNlcyA9IGFuZHJvaWQ6OkludGVyc2VjdGlvbigKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlVHlwZXMsIGFuZHJvaWQ6OmdldEF1ZGlvRGV2aWNlT3V0QWxsQTJkcFNldCgpKTsKKyAgICAgICAgICAgIGlmIChhMmRwRGV2aWNlcy5lbXB0eSgpIHx8IGEyZHBEZXZpY2VzLnNpemUoKSA+IDEpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMgaW52YWxpZCBkZXZpY2UgY29tYmluYXRpb246ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYW5kcm9pZDo6ZHVtcERldmljZVR5cGVzKGRldmljZVR5cGVzKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBhMmRwRGV2aWNlcy5lbXB0eSgpID8gQVVESU9fREVWSUNFX05PTkUgOiBhMmRwRGV2aWNlc1swXTsKKyAgICAgICAgfQorICAgIH0KK30KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmFkM2M1YgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5icApAQCAtMCwwICsxLDU1IEBACitjY19saWJyYXJ5X3N0YXRpYyB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyIsCisKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAiLAorICAgICAgICAic3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9QYXRjaC5jcHAiLAorICAgICAgICAic3JjL0F1ZGlvUG9saWN5TWl4LmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9Qcm9maWxlVmVjdG9ySGVscGVyLmNwcCIsCisgICAgICAgICJzcmMvQXVkaW9Sb3V0ZS5jcHAiLAorICAgICAgICAic3JjL0NsaWVudERlc2NyaXB0b3IuY3BwIiwKKyAgICAgICAgInNyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcCIsCisgICAgICAgICJzcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAiLAorICAgICAgICAic3JjL0h3TW9kdWxlLmNwcCIsCisgICAgICAgICJzcmMvSU9Qcm9maWxlLmNwcCIsCisgICAgICAgICJzcmMvUG9saWN5QXVkaW9Qb3J0LmNwcCIsCisgICAgICAgICJzcmMvU2VyaWFsaXplci5jcHAiLAorICAgICAgICAic3JjL1NvdW5kVHJpZ2dlclNlc3Npb24uY3BwIiwKKyAgICAgICAgInNyYy9UeXBlQ29udmVydGVyLmNwcCIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJoaWRsYmFzZSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlieG1sMiIsCisgICAgXSwKKyAgICBleHBvcnRfc2hhcmVkX2xpYl9oZWFkZXJzOiBbCisgICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb24iLAorICAgICAgICAibGlibWVkaWEiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tbW9uIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5bWFuYWdlcl9pbnRlcmZhY2VfaGVhZGVycyIsCisgICAgXSwKKyAgICBleHBvcnRfaGVhZGVyX2xpYl9oZWFkZXJzOiBbImxpYmF1ZGlvcG9saWN5Y29tbW9uIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzMzMWMyLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvQW5kcm9pZC5taworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLUxPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLQotTE9DQUxfU1JDX0ZJTEVTOj0gXAotICAgIHNyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcCBcCi0gICAgc3JjL0F1ZGlvR2Fpbi5jcHAgXAotICAgIHNyYy9Id01vZHVsZS5jcHAgXAotICAgIHNyYy9JT1Byb2ZpbGUuY3BwIFwKLSAgICBzcmMvQXVkaW9Qb3J0LmNwcCBcCi0gICAgc3JjL0F1ZGlvUHJvZmlsZS5jcHAgXAotICAgIHNyYy9BdWRpb1JvdXRlLmNwcCBcCi0gICAgc3JjL0F1ZGlvUG9saWN5TWl4LmNwcCBcCi0gICAgc3JjL0F1ZGlvUGF0Y2guY3BwIFwKLSAgICBzcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwIFwKLSAgICBzcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcCBcCi0gICAgc3JjL0F1ZGlvQ29sbGVjdGlvbnMuY3BwIFwKLSAgICBzcmMvRWZmZWN0RGVzY3JpcHRvci5jcHAgXAotICAgIHNyYy9Tb3VuZFRyaWdnZXJTZXNzaW9uLmNwcCBcCi0gICAgc3JjL1Nlc3Npb25Sb3V0ZS5jcHAgXAotICAgIHNyYy9BdWRpb1NvdXJjZURlc2NyaXB0b3IuY3BwIFwKLSAgICBzcmMvVm9sdW1lQ3VydmUuY3BwIFwKLSAgICBzcmMvVHlwZUNvbnZlcnRlci5jcHAgXAotICAgIHNyYy9BdWRpb1Nlc3Npb24uY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlibWVkaWEgXAotICAgIGxpYnV0aWxzIFwKLSAgICBsaWJsb2cgXAotCi1MT0NBTF9FWFBPUlRfU0hBUkVEX0xJQlJBUllfSEVBREVSUyA6PSBsaWJtZWRpYQotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kgXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBhdWRpby11dGlscykgXAotCi1pZmVxICgkKFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYpLCAxKQotCi1MT0NBTF9TUkNfRklMRVMgKz0gc3JjL1NlcmlhbGl6ZXIuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gbGlieG1sMgotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBleHRlcm5hbC9saWJ4bWwyL2luY2x1ZGUgXAotCi1lbHNlCi0KLUxPQ0FMX1NSQ19GSUxFUyArPSBcCi0gICAgc3JjL0NvbmZpZ1BhcnNpbmdVdGlscy5jcHAgXAotICAgIHNyYy9TdHJlYW1EZXNjcmlwdG9yLmNwcCBcCi0gICAgc3JjL0dhaW5zLmNwcAotCi1lbmRpZiAjaWZlcSAoJChVU0VfWE1MX0FVRElPX1BPTElDWV9DT05GKSwgMSkKLQotTE9DQUxfRVhQT1JUX0NfSU5DTFVERV9ESVJTIDo9IFwKLSAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKLQotTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKLQotTE9DQUxfQ0ZMQUdTIDo9IC1XYWxsIC1XZXJyb3IKLQotTE9DQUxfTU9EVUxFIDo9IGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cwotCi1pbmNsdWRlICQoQlVJTERfU1RBVElDX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Db2xsZWN0aW9ucy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvQ29sbGVjdGlvbnMuaAppbmRleCBmODZlNzVhLi5iNjkyNTkyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Db2xsZWN0aW9ucy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0NvbGxlY3Rpb25zLmgKQEAgLTI1LDIwICsyNSwxNSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIEF1ZGlvUG9ydDsKK2NsYXNzIFBvbGljeUF1ZGlvUG9ydDsKIGNsYXNzIEF1ZGlvUm91dGU7CiAKLWNsYXNzIEF1ZGlvUG9ydFZlY3RvciA6IHB1YmxpYyBWZWN0b3I8c3A8QXVkaW9Qb3J0PiA+Ci17Ci1wdWJsaWM6Ci0gICAgc3A8QXVkaW9Qb3J0PiBmaW5kQnlUYWdOYW1lKGNvbnN0IFN0cmluZzggJnRhZ05hbWUpIGNvbnN0OwotfTsKK3VzaW5nIFBvbGljeUF1ZGlvUG9ydFZlY3RvciA9IFZlY3RvcjxzcDxQb2xpY3lBdWRpb1BvcnQ+PjsKK3VzaW5nIEF1ZGlvUm91dGVWZWN0b3IgPSBWZWN0b3I8c3A8QXVkaW9Sb3V0ZT4+OwogCitzcDxQb2xpY3lBdWRpb1BvcnQ+IGZpbmRCeVRhZ05hbWUoY29uc3QgUG9saWN5QXVkaW9Qb3J0VmVjdG9yJiBwb2xpY3lBdWRpb1BvcnRWZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnRhZ05hbWUpOwogCi1jbGFzcyBBdWRpb1JvdXRlVmVjdG9yIDogcHVibGljIFZlY3RvcjxzcDxBdWRpb1JvdXRlPiA+Ci17Ci1wdWJsaWM6Ci0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0OwotfTsKK3ZvaWQgZHVtcEF1ZGlvUm91dGVWZWN0b3IoY29uc3QgQXVkaW9Sb3V0ZVZlY3RvciYgYXVkaW9Sb3V0ZVZlY3RvciwgU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvR2Fpbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvR2Fpbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWM1MDhmLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0dhaW4uaAorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBBdWRpb0dhaW46IHB1YmxpYyBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgQXVkaW9HYWluKGludCBpbmRleCwgYm9vbCB1c2VJbkNoYW5uZWxNYXNrKTsKLSAgICB2aXJ0dWFsIH5BdWRpb0dhaW4oKSB7fQotCi0gICAgdm9pZCBzZXRNb2RlKGF1ZGlvX2dhaW5fbW9kZV90IG1vZGUpIHsgbUdhaW4ubW9kZSA9IG1vZGU7IH0KLSAgICBjb25zdCBhdWRpb19nYWluX21vZGVfdCAmZ2V0TW9kZSgpIGNvbnN0IHsgcmV0dXJuIG1HYWluLm1vZGU7IH0KLQotICAgIHZvaWQgc2V0Q2hhbm5lbE1hc2soYXVkaW9fY2hhbm5lbF9tYXNrX3QgbWFzaykgeyBtR2Fpbi5jaGFubmVsX21hc2sgPSBtYXNrOyB9Ci0gICAgY29uc3QgYXVkaW9fY2hhbm5lbF9tYXNrX3QgJmdldENoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUdhaW4uY2hhbm5lbF9tYXNrOyB9Ci0KLSAgICB2b2lkIHNldE1pblZhbHVlSW5NYihpbnQgbWluVmFsdWUpIHsgbUdhaW4ubWluX3ZhbHVlID0gbWluVmFsdWU7IH0KLSAgICBpbnQgZ2V0TWluVmFsdWVJbk1iKCkgY29uc3QgeyByZXR1cm4gbUdhaW4ubWluX3ZhbHVlOyB9Ci0KLSAgICB2b2lkIHNldE1heFZhbHVlSW5NYihpbnQgbWF4VmFsdWUpIHsgbUdhaW4ubWF4X3ZhbHVlID0gbWF4VmFsdWU7IH0KLSAgICBpbnQgZ2V0TWF4VmFsdWVJbk1iKCkgY29uc3QgeyByZXR1cm4gbUdhaW4ubWF4X3ZhbHVlOyB9Ci0KLSAgICB2b2lkIHNldERlZmF1bHRWYWx1ZUluTWIoaW50IGRlZmF1bHRWYWx1ZSkgeyBtR2Fpbi5kZWZhdWx0X3ZhbHVlID0gZGVmYXVsdFZhbHVlOyB9Ci0gICAgaW50IGdldERlZmF1bHRWYWx1ZUluTWIoKSBjb25zdCB7IHJldHVybiBtR2Fpbi5kZWZhdWx0X3ZhbHVlOyB9Ci0KLSAgICB2b2lkIHNldFN0ZXBWYWx1ZUluTWIodWludDMyX3Qgc3RlcFZhbHVlKSB7IG1HYWluLnN0ZXBfdmFsdWUgPSBzdGVwVmFsdWU7IH0KLSAgICBpbnQgZ2V0U3RlcFZhbHVlSW5NYigpIGNvbnN0IHsgcmV0dXJuIG1HYWluLnN0ZXBfdmFsdWU7IH0KLQotICAgIHZvaWQgc2V0TWluUmFtcEluTXModWludDMyX3QgbWluUmFtcCkgeyBtR2Fpbi5taW5fcmFtcF9tcyA9IG1pblJhbXA7IH0KLSAgICBpbnQgZ2V0TWluUmFtcEluTXMoKSBjb25zdCB7IHJldHVybiBtR2Fpbi5taW5fcmFtcF9tczsgfQotCi0gICAgdm9pZCBzZXRNYXhSYW1wSW5Ncyh1aW50MzJfdCBtYXhSYW1wKSB7IG1HYWluLm1heF9yYW1wX21zID0gbWF4UmFtcDsgfQotICAgIGludCBnZXRNYXhSYW1wSW5NcygpIGNvbnN0IHsgcmV0dXJuIG1HYWluLm1heF9yYW1wX21zOyB9Ci0KLSAgICAvLyBUT0RPOiByZW1vdmUgZHVtcCBmcm9tIGhlcmUgKHNwbGl0IHNlcmlhbGl6YXRpb24pCi0gICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKLQotICAgIHZvaWQgZ2V0RGVmYXVsdENvbmZpZyhzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmNvbmZpZyk7Ci0gICAgc3RhdHVzX3QgY2hlY2tDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpOwotCi0gICAgY29uc3Qgc3RydWN0IGF1ZGlvX2dhaW4gJmdldEdhaW4oKSBjb25zdCB7IHJldHVybiBtR2FpbjsgfQotCi1wcml2YXRlOgotICAgIGludCAgICAgICAgICAgICAgIG1JbmRleDsKLSAgICBzdHJ1Y3QgYXVkaW9fZ2FpbiBtR2FpbjsKLSAgICBib29sICAgICAgICAgICAgICBtVXNlSW5DaGFubmVsTWFzazsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUyOTYzMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvKioKKyAqIEludGVyZmFjZSBmb3IgSS9PIGRlc2NyaXB0b3JzIHRvIGltcGxlbWVudCBzbyBpbmZvcm1hdGlvbiBhYm91dCB0aGVpciBjb250ZXh0CisgKiBjYW4gYmUgcXVlcmllZCBhbmQgdXBkYXRlZC4KKyAqLworY2xhc3MgQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UKK3sKK3B1YmxpYzoKKyAgICB2aXJ0dWFsIH5BdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZSgpIHt9OworCisgICAgdmlydHVhbCBhdWRpb19jb25maWdfYmFzZV90IGdldENvbmZpZygpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSA9IDA7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgSW9EZXNjcmlwdG9yLCBjbGFzcyBGaWx0ZXI+CitzcDxEZXZpY2VEZXNjcmlwdG9yPiBmaW5kUHJlZmVycmVkRGV2aWNlKAorICAgICAgICBJb0Rlc2NyaXB0b3ImIGRlc2MsIEZpbHRlciBmaWx0ZXIsIGJvb2wmIGFjdGl2ZSwgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzKQoreworICAgIGF1dG8gYWN0aXZlQ2xpZW50cyA9IGRlc2MtPmNsaWVudHNMaXN0KHRydWUgLyphY3RpdmVPbmx5Ki8pOworICAgIGF1dG8gYWN0aXZlQ2xpZW50c1dpdGhSb3V0ZSA9CisgICAgICAgIGRlc2MtPmNsaWVudHNMaXN0KHRydWUgLyphY3RpdmVPbmx5Ki8sIGZpbHRlciwgdHJ1ZSAvKnByZWZlcnJlZERldmljZSovKTsKKyAgICBhY3RpdmUgPSBhY3RpdmVDbGllbnRzLnNpemUoKSA+IDA7CisgICAgaWYgKGFjdGl2ZSAmJiBhY3RpdmVDbGllbnRzLnNpemUoKSA9PSBhY3RpdmVDbGllbnRzV2l0aFJvdXRlLnNpemUoKSkgeworICAgICAgICByZXR1cm4gZGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoYWN0aXZlQ2xpZW50c1dpdGhSb3V0ZVswXS0+cHJlZmVycmVkRGV2aWNlSWQoKSk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgSW9Db2xsZWN0aW9uLCBjbGFzcyBGaWx0ZXI+CitzcDxEZXZpY2VEZXNjcmlwdG9yPiBmaW5kUHJlZmVycmVkRGV2aWNlKAorICAgICAgICBJb0NvbGxlY3Rpb24mIGlvQ29sbGVjdGlvbiwgRmlsdGVyIGZpbHRlciwgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzKQoreworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlvQ29sbGVjdGlvbi5zaXplKCk7IGkrKykgeworICAgICAgICBhdXRvIGRlc2MgPSBpb0NvbGxlY3Rpb24udmFsdWVBdChpKTsKKyAgICAgICAgYm9vbCBhY3RpdmU7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGN1ckRldmljZSA9IGZpbmRQcmVmZXJyZWREZXZpY2UoZGVzYywgZmlsdGVyLCBhY3RpdmUsIGRldmljZXMpOworICAgICAgICBpZiAoYWN0aXZlICYmIGN1ckRldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIGlmIChjdXJEZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZGV2aWNlID0gY3VyRGV2aWNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb0lucHV0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmgKaW5kZXggYjI1ZDZkNC4uZWM4Mjg3MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmgKQEAgLTE2LDgyICsxNiwxMTYgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlICJBdWRpb1BvcnQuaCIKLSNpbmNsdWRlICJBdWRpb1Nlc3Npb24uaCIKLSNpbmNsdWRlICJBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIuaCIKLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgIkF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiQ2xpZW50RGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJFZmZlY3REZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiSU9Qcm9maWxlLmgiCisjaW5jbHVkZSAiUG9saWN5QXVkaW9Qb3J0LmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotY2xhc3MgSU9Qcm9maWxlOwotY2xhc3MgQXVkaW9NaXg7CitjbGFzcyBBdWRpb1BvbGljeU1peDsKK2NsYXNzIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlOwogCiAvLyBkZXNjcmlwdG9yIGZvciBhdWRpbyBpbnB1dHMuIFVzZWQgdG8gbWFpbnRhaW4gY3VycmVudCBjb25maWd1cmF0aW9uIG9mIGVhY2ggb3BlbmVkIGF1ZGlvIGlucHV0CiAvLyBhbmQga2VlcCB0cmFjayBvZiB0aGUgdXNhZ2Ugb2YgdGhpcyBpbnB1dC4KLWNsYXNzIEF1ZGlvSW5wdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnLCBwdWJsaWMgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyCitjbGFzcyBBdWRpb0lucHV0RGVzY3JpcHRvcjogcHVibGljIEF1ZGlvUG9ydENvbmZpZywKKyAgICAgICAgcHVibGljIFBvbGljeUF1ZGlvUG9ydENvbmZpZywKKyAgICAgICAgcHVibGljIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlLAorICAgICAgICBwdWJsaWMgQ2xpZW50TWFwSGFuZGxlcjxSZWNvcmRDbGllbnREZXNjcmlwdG9yPgogewogcHVibGljOgotICAgIGV4cGxpY2l0IEF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRJZCgpIGNvbnN0OworICAgIEF1ZGlvSW5wdXREZXNjcmlwdG9yKGNvbnN0IHNwPElPUHJvZmlsZT4mIHByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKmNsaWVudEludGVyZmFjZSk7CisKKyAgICB2aXJ0dWFsIH5BdWRpb0lucHV0RGVzY3JpcHRvcigpID0gZGVmYXVsdDsKKwogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRNb2R1bGVIYW5kbGUoKSBjb25zdDsKLSAgICB1aW50MzJfdCBnZXRPcGVuUmVmQ291bnQoKSBjb25zdDsKIAotICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIChtRGV2aWNlICE9IG51bGxwdHIpID8KKyAgICAgICAgICAgICAgICAgICAgbURldmljZS0+dHlwZSgpIDogQVVESU9fREVWSUNFX05PTkU7IH0KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2UoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlOyB9CisgICAgdm9pZCBzZXREZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSkgeyBtRGV2aWNlID0gZGV2aWNlOyB9CisgICAgRGV2aWNlVmVjdG9yIHN1cHBvcnRlZERldmljZXMoKSBjb25zdCAgeworICAgICAgICByZXR1cm4gbVByb2ZpbGUgIT0gbnVsbHB0ciA/IG1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkgOiAgRGV2aWNlVmVjdG9yKCk7IH0KIAotICAgIGF1ZGlvX2lvX2hhbmRsZV90ICAgICAgICAgICAgIG1Jb0hhbmRsZTsgICAgICAgLy8gaW5wdXQgaGFuZGxlCi0gICAgYXVkaW9fZGV2aWNlc190ICAgICAgICAgICAgICAgbURldmljZTsgICAgICAgICAvLyBjdXJyZW50IGRldmljZSB0aGlzIGlucHV0IGlzIHJvdXRlZCB0bwotICAgIEF1ZGlvTWl4ICAgICAgICAgICAgICAgICAgICAgICptUG9saWN5TWl4OyAgICAgLy8gbm9uIE5VTEwgd2hlbiB1c2VkIGJ5IGEgZHluYW1pYyBwb2xpY3kKLSAgICBjb25zdCBzcDxJT1Byb2ZpbGU+ICAgICAgICAgICBtUHJvZmlsZTsgICAgICAgIC8vIEkvTyBwcm9maWxlIHRoaXMgb3V0cHV0IGRlcml2ZXMgZnJvbQorICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IG92ZXJyaWRlOwogCisgICAgYXVkaW9faW9faGFuZGxlX3QgICBtSW9IYW5kbGUgPSBBVURJT19JT19IQU5ETEVfTk9ORTsgLy8gaW5wdXQgaGFuZGxlCisgICAgd3A8QXVkaW9Qb2xpY3lNaXg+ICBtUG9saWN5TWl4OyAgICAgICAgICAgICAgICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQorICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gbVByb2ZpbGU7ICAgICAgICAgICAgICAgICAgICAgLy8gSS9PIHByb2ZpbGUgdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tCisKKyAgICAvLyBQb2xpY3lBdWRpb1BvcnRDb25maWcKKyAgICB2aXJ0dWFsIHNwPFBvbGljeUF1ZGlvUG9ydD4gZ2V0UG9saWN5QXVkaW9Qb3J0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVByb2ZpbGU7CisgICAgfQorCisgICAgLy8gQXVkaW9Qb3J0Q29uZmlnCisgICAgdmlydHVhbCBzdGF0dXNfdCBhcHBseUF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqYmFja3VwQ29uZmlnID0gTlVMTCk7CiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAogICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKICAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgeyByZXR1cm4gbVByb2ZpbGU7IH0KKwogICAgIHZvaWQgdG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0OwogICAgIHZvaWQgc2V0UHJlZW1wdGVkU2Vzc2lvbnMoY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX3Nlc3Npb25fdD4mIHNlc3Npb25zKTsKICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiBnZXRQcmVlbXB0ZWRTZXNzaW9ucygpIGNvbnN0OwogICAgIGJvb2wgaGFzUHJlZW1wdGVkU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikgY29uc3Q7CiAgICAgdm9pZCBjbGVhclByZWVtcHRlZFNlc3Npb25zKCk7Ci0gICAgYm9vbCBpc0FjdGl2ZSgpIGNvbnN0OworICAgIGJvb2wgaXNBY3RpdmUoKSBjb25zdCB7IHJldHVybiBtR2xvYmFsQWN0aXZlQ291bnQgPiAwOyB9CiAgICAgYm9vbCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0OwotICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKGJvb2wgYWN0aXZlT25seSA9IGZhbHNlKSBjb25zdDsKKyAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UoKSBjb25zdDsKICAgICBib29sIGlzU291bmRUcmlnZ2VyKCkgY29uc3Q7Ci0gICAgc3RhdHVzX3QgYWRkQXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+JiBhdWRpb1Nlc3Npb24pOwotICAgIHN0YXR1c190IHJlbW92ZUF1ZGlvU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgc3A8QXVkaW9TZXNzaW9uPiBnZXRBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pIGNvbnN0OwotICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gZ2V0QXVkaW9TZXNzaW9ucyhib29sIGFjdGl2ZU9ubHkpIGNvbnN0OwotICAgIHNpemVfdCBnZXRBdWRpb1Nlc3Npb25Db3VudChib29sIGFjdGl2ZU9ubHkpIGNvbnN0OwotICAgIGF1ZGlvX3NvdXJjZV90IGdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZShib29sIGFjdGl2ZU9ubHkpIGNvbnN0OwotCi0gICAgLy8gaW1wbGVtZW50YXRpb24gb2YgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyCi0gICAgdmlydHVhbCBhdWRpb19jb25maWdfYmFzZV90IGdldENvbmZpZygpIGNvbnN0OwotICAgIHZpcnR1YWwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdDsKLQotICAgIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiBnZXRIaWdoZXN0UHJpb3JpdHlDbGllbnQoKSBjb25zdDsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgZ2V0SGlnaGVzdFByaW9yaXR5QXR0cmlidXRlcygpIGNvbnN0OworICAgIHZvaWQgc2V0Q2xpZW50QWN0aXZlKGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKTsKKyAgICBpbnQzMl90IGFjdGl2ZUNvdW50KCkgeyByZXR1cm4gbUdsb2JhbEFjdGl2ZUNvdW50OyB9CisgICAgdm9pZCB0cmFja0VmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdCwgYm9vbCBlbmFibGVkKTsKKyAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBnZXRFbmFibGVkRWZmZWN0cygpIGNvbnN0OworICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIGdldEFjdGl2ZUVmZmVjdHMoKSBjb25zdDsgLy8gZW5hYmxlZCBhbmQgbm90IHN1c3BlbmRlZAorICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlCisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBnZXRDb25maWcoKSBjb25zdCBvdmVycmlkZTsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0IG92ZXJyaWRlOworICAgIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSBvdmVycmlkZTsKIAogICAgIHN0YXR1c190IG9wZW4oY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQpOwogICAgIC8vIENhbGxlZCB3aGVuIGEgc3RyZWFtIGlzIGFib3V0IHRvIGJlIHN0YXJ0ZWQuCi0gICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIEF1ZGlvU2Vzc2lvbjo6Y2hhbmdlQWN0aXZlQ291bnQoMSkKKyAgICAvLyBOb3RlOiBjYWxsZWQgYWZ0ZXIgc2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgdHJ1ZSkKICAgICBzdGF0dXNfdCBzdGFydCgpOwogICAgIC8vIENhbGxlZCBhZnRlciBhIHN0cmVhbSBpcyBzdG9wcGVkCi0gICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIEF1ZGlvU2Vzc2lvbjo6Y2hhbmdlQWN0aXZlQ291bnQoLTEpCisgICAgLy8gTm90ZTogY2FsbGVkIGFmdGVyIHNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKQogICAgIHZvaWQgc3RvcCgpOwogICAgIHZvaWQgY2xvc2UoKTsKIAotcHJpdmF0ZToKLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAgICAgICAgICBtUGF0Y2hIYW5kbGU7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAgICAgICAgICAgbUlkOwotICAgIC8vIGF1ZGlvIHNlc3Npb25zIGF0dGFjaGVkIHRvIHRoaXMgaW5wdXQKLSAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uICAgICAgICBtU2Vzc2lvbnM7CisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGdldENsaWVudHNGb3JTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50c0xpc3QoYm9vbCBhY3RpdmVPbmx5ID0gZmFsc2UsCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IEFVRElPX1NPVVJDRV9ERUZBVUxULCBib29sIHByZWZlcnJlZERldmljZU9ubHkgPSBmYWxzZSkgY29uc3Q7CisKKyAgICB2b2lkIHNldEFwcFN0YXRlKHVpZF90IHVpZCwgYXBwX3N0YXRlX3Qgc3RhdGUpOworCisgICAgLy8gaW1wbGVtZW50YXRpb24gb2YgQ2xpZW50TWFwSGFuZGxlcjxSZWNvcmRDbGllbnREZXNjcmlwdG9yPgorICAgIHZvaWQgYWRkQ2xpZW50KGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+ICZjbGllbnQpIG92ZXJyaWRlOworCisgICAgLy8gR28gb3ZlciBhbGwgYWN0aXZlIGNsaWVudHMgYW5kIHN1c3BlbmQgb3IgcmVzdG9yZSBlZmZlY3RzIGFjY29yZGluZyBoaWdoZXN0IHByaW9yaXR5CisgICAgLy8gYWN0aXZlIHVzZSBjYXNlCisgICAgdm9pZCBjaGVja1N1c3BlbmRFZmZlY3RzKCk7CisKKyBwcml2YXRlOgorCisgICAgdm9pZCB1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKGludCBldmVudCwgY29uc3Qgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCk7CisKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtRGV2aWNlID0gbnVsbHB0cjsgLyoqPCBjdXJyZW50IGRldmljZSB0aGlzIGlucHV0IGlzIHJvdXRlZCB0byAqLworCiAgICAgLy8gQmVjYXVzZSBhIHByZWVtcHRpYmxlIGNhcHR1cmUgc2Vzc2lvbiBjYW4gcHJlZW1wdCBhbm90aGVyIG9uZSwgd2UgZW5kIHVwIGluIGFuIGVuZGxlc3MgbG9vcAogICAgIC8vIHNpdHVhdGlvbiB3ZXJlIGVhY2ggc2Vzc2lvbiBpcyBhbGxvd2VkIHRvIHJlc3RhcnQgYWZ0ZXIgYmVpbmcgcHJlZW1wdGVkLAogICAgIC8vIHRodXMgcHJlZW1wdGluZyB0aGUgb3RoZXIgb25lIHdoaWNoIHJlc3RhcnRzIGFuZCBzbyBvbi4KQEAgLTk5LDcgKzEzMyw5IEBACiAgICAgLy8gYSBwYXJ0aWN1bGFyIGlucHV0IHN0YXJ0ZWQgYW5kIHByZXZlbnQgcHJlZW1wdGlvbiBvZiB0aGlzIGFjdGl2ZSBpbnB1dCBieSB0aGlzIHNlc3Npb24uCiAgICAgLy8gV2UgYWxzbyBpbmhlcml0IHNlc3Npb25zIGZyb20gdGhlIHByZWVtcHRlZCBpbnB1dCB0byBhdm9pZCBhIDMgd2F5IHByZWVtcHRpb24gbG9vcCBldGMuLi4KICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90PiBtUHJlZW1wdGVkU2Vzc2lvbnM7Ci0gICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKm1DbGllbnRJbnRlcmZhY2U7CisgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKiBjb25zdCBtQ2xpZW50SW50ZXJmYWNlOworICAgIGludDMyX3QgbUdsb2JhbEFjdGl2ZUNvdW50ID0gMDsgIC8vIG5vbi1jbGllbnQtc3BlY2lmaWMgYWN0aXZpdHkgcmVmIGNvdW50CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gbUVuYWJsZWRFZmZlY3RzOwogfTsKIAogY2xhc3MgQXVkaW9JbnB1dENvbGxlY3Rpb24gOgpAQCAtMTExLDE5ICsxNDcsMzEgQEAKICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZ2V0SW5wdXRGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7CiAKICAgICAvLyBjb3VudCBhY3RpdmUgY2FwdHVyZSBzZXNzaW9ucyB1c2luZyBvbmUgb2YgdGhlIHNwZWNpZmllZCBkZXZpY2VzLgotICAgIC8vIGlnbm9yZSBkZXZpY2VzIGlmIEFVRElPX0RFVklDRV9JTl9ERUZBVUxUIGlzIHBhc3NlZAotICAgIHVpbnQzMl90IGFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gQVVESU9fREVWSUNFX0lOX0RFRkFVTFQpIGNvbnN0OworICAgIC8vIGlnbm9yZSBkZXZpY2VzIGlmIGVtcHR5IHZlY3RvciBpcyBwYXNzZWQKKyAgICB1aW50MzJfdCBhY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogcmV0dXJuIGlvIGhhbmRsZSBvZiBhY3RpdmUgaW5wdXQgb3IgMCBpZiBubyBpbnB1dCBpcyBhY3RpdmUKICAgICAgKiBPbmx5IGNvbnNpZGVycyBpbnB1dHMgZnJvbSBwaHlzaWNhbCBkZXZpY2VzIChlLmcuIG1haW4gbWljLCBoZWFkc2V0IG1pYykgd2hlbgogICAgICAqIGlnbm9yZVZpcnR1YWxJbnB1dHMgaXMgdHJ1ZS4KICAgICAgKi8KLSAgICBWZWN0b3I8c3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IGdldEFjdGl2ZUlucHV0cyhib29sIGlnbm9yZVZpcnR1YWxJbnB1dHMgPSB0cnVlKTsKKyAgICBWZWN0b3I8c3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IGdldEFjdGl2ZUlucHV0cygpOwogCi0gICAgYXVkaW9fZGV2aWNlc190IGdldFN1cHBvcnRlZERldmljZXMoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdDsKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZ2V0SW5wdXRGb3JDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0OworICAgIHZvaWQgdHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsIGJvb2wgZW5hYmxlZCk7CisKKyAgICAvKioKKyAgICAqIEBicmllZiBjbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2U6IHdoZW4gYSBkZXZpY2UgaXMgZGlzY29ubmVjdGVkLCBhbmQgaWYgdGhpcyBkZXZpY2UgaGFzCisgICAgKiBiZWVuIGNob3NlbiBhcyB0aGUgcHJlZmVycmVkIGRldmljZSBieSBhbnkgY2xpZW50LCB0aGUgcG9saWN5IG1hbmFnZXIgc2hhbGwKKyAgICAqIHByZXZlbnQgZnJvbSB1c2luZyB0aGlzIGRldmljZSBhbnkgbW9yZSBieSBjbGVhcmluZyBhbGwgdGhlIHNlc3Npb24gcm91dGVzIGludm9sdmluZyB0aGlzCisgICAgKiBkZXZpY2UuCisgICAgKiBJbiBvdGhlciB3b3JkcywgdGhlIHByZWZlcnJlZCBkZXZpY2UgcG9ydCBpZCBvZiB0aGVzZSBjbGllbnRzIHdpbGwgYmUgcmVzZXR0ZWQgdG8gTk9ORS4KKyAgICAqIEBwYXJhbSBkaXNjb25uZWN0ZWREZXZpY2UgZGV2aWNlIHRvIGJlIGRpc2Nvbm5lY3RlZAorICAgICovCisgICAgdm9pZCBjbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRpc2Nvbm5lY3RlZERldmljZSk7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIH07CiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5oCmluZGV4IDVlNWQzOGIuLjQxZjdkZmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb091dHB1dERlc2NyaXB0b3IuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmgKQEAgLTE2LDc5ICsxNiwzMDUgQEAKIAogI3ByYWdtYSBvbmNlCiAKKyNkZWZpbmUgX19TVERDX0xJTUlUX01BQ1JPUworI2luY2x1ZGUgPGludHR5cGVzLmg+CisKICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KIAotI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgotI2luY2x1ZGUgPFJvdXRpbmdTdHJhdGVneS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSAiQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiQXVkaW9JT0Rlc2NyaXB0b3JJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJDbGllbnREZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIlBvbGljeUF1ZGlvUG9ydC5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBjbGFzcyBJT1Byb2ZpbGU7Ci1jbGFzcyBBdWRpb01peDsKK2NsYXNzIEF1ZGlvUG9saWN5TWl4OwogY2xhc3MgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2U7Ci1jbGFzcyBEZXZpY2VEZXNjcmlwdG9yOworCitjbGFzcyBBY3Rpdml0eVRyYWNraW5nCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+QWN0aXZpdHlUcmFja2luZygpID0gZGVmYXVsdDsKKyAgICBib29sIGlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zID0gMCwgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChtQWN0aXZpdHlDb3VudCA+IDApIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgICAgIGlmIChpblBhc3RNcyA9PSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHN5c1RpbWUgPT0gMCkgeworICAgICAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobnMybXMoc3lzVGltZSAtIG1TdG9wVGltZSkgPCBpblBhc3RNcykgeworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2b2lkIGNoYW5nZUFjdGl2aXR5Q291bnQoaW50IGRlbHRhKQorICAgIHsKKyAgICAgICAgaWYgKChkZWx0YSArIChpbnQpbUFjdGl2aXR5Q291bnQpIDwgMCkgeworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiJXM6IGludmFsaWQgZGVsdGEgJWQsIHJlZkNvdW50ICVkIiwgX19mdW5jX18sIGRlbHRhLCBtQWN0aXZpdHlDb3VudCk7CisgICAgICAgIH0KKyAgICAgICAgbUFjdGl2aXR5Q291bnQgKz0gZGVsdGE7CisgICAgICAgIGlmICghbUFjdGl2aXR5Q291bnQpIHsKKyAgICAgICAgICAgIHNldFN0b3BUaW1lKHN5c3RlbVRpbWUoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgdWludDMyX3QgZ2V0QWN0aXZpdHlDb3VudCgpIGNvbnN0IHsgcmV0dXJuIG1BY3Rpdml0eUNvdW50OyB9CisgICAgbnNlY3NfdCBnZXRTdG9wVGltZSgpIGNvbnN0IHsgcmV0dXJuIG1TdG9wVGltZTsgfQorICAgIHZvaWQgc2V0U3RvcFRpbWUobnNlY3NfdCBzdG9wVGltZSkgeyBtU3RvcFRpbWUgPSBzdG9wVGltZTsgfQorCisgICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAorICAgIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gQWN0aXZpdHlDb3VudDogJWQsIFN0b3BUaW1lOiAlIiBQUklkNjQgIiwgIiwgc3BhY2VzLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWN0aXZpdHlDb3VudCgpLCBnZXRTdG9wVGltZSgpKTsKKyAgICB9Citwcml2YXRlOgorICAgIHVpbnQzMl90IG1BY3Rpdml0eUNvdW50ID0gMDsKKyAgICBuc2Vjc190IG1TdG9wVGltZSA9IDA7Cit9OworCisvKioKKyAqIEBicmllZiBWb2x1bWVBY3Rpdml0eTogaXQgdHJhY2tzIHRoZSBhY3Rpdml0eSBmb3Igdm9sdW1lIHBvbGljeSAodm9sdW1lIGluZGV4LCBtdXRlLAorICogbWVtb3JpemUgcHJldmlvdXMgc3RvcCwgYW5kIHN0b3JlIG11dGUgaWYgaW5jb21wYXRpYmxlIGRldmljZSB3aXRoIGFub3RoZXIgc3RyYXRlZ3kuCisgKi8KK2NsYXNzIFZvbHVtZUFjdGl2aXR5IDogcHVibGljIEFjdGl2aXR5VHJhY2tpbmcKK3sKK3B1YmxpYzoKKyAgICBib29sIGlzTXV0ZWQoKSBjb25zdCB7IHJldHVybiBtTXV0ZUNvdW50ID4gMDsgfQorICAgIGludCBnZXRNdXRlQ291bnQoKSBjb25zdCB7IHJldHVybiBtTXV0ZUNvdW50OyB9CisgICAgaW50IGluY011dGVDb3VudCgpIHsgcmV0dXJuICsrbU11dGVDb3VudDsgfQorICAgIGludCBkZWNNdXRlQ291bnQoKSB7IHJldHVybiBtTXV0ZUNvdW50ID4gMCA/IC0tbU11dGVDb3VudCA6IC0xOyB9CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdCBvdmVycmlkZQorICAgIHsKKyAgICAgICAgQWN0aXZpdHlUcmFja2luZzo6ZHVtcChkc3QsIHNwYWNlcyk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIsIFZvbHVtZTogJS4wM2YsIE11dGVDb3VudDogJTAyZFxuIiwgbUN1clZvbHVtZURiLCBtTXV0ZUNvdW50KTsKKyAgICB9CisgICAgdm9pZCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lRGIpIHsgbUN1clZvbHVtZURiID0gdm9sdW1lRGI7IH0KKyAgICBmbG9hdCBnZXRWb2x1bWUoKSBjb25zdCB7IHJldHVybiBtQ3VyVm9sdW1lRGI7IH0KKworcHJpdmF0ZToKKyAgICBpbnQgbU11dGVDb3VudCA9IDA7IC8qKjwgbXV0ZSByZXF1ZXN0IGNvdW50ZXIgKi8KKyAgICBmbG9hdCBtQ3VyVm9sdW1lRGIgPSBOQU47IC8qKjwgY3VycmVudCB2b2x1bWUgaW4gZEIuICovCit9OworLyoqCisgKiBOb3RlOiB2b2x1bWUgYWN0aXZpdGllcyBzaGFsbCBiZSBpbmRleGVkIGJ5IEN1cnZlc0lkIGlmIHdlIHdhbnQgdG8gYWxsb3cgbXVsdGlwbGUKKyAqIGN1cnZlcyBwZXIgdm9sdW1lIHNvdXJjZSwgaW5mZXJyaW5nIGEgbXV0ZSBtYW5hZ2VtZW50IG9yIHZvbHVtZSBiYWxhbmNpbmcgYmV0d2VlbiBIVyBhbmQgU1cgaXMKKyAqIGRvbmUKKyAqLwordXNpbmcgVm9sdW1lQWN0aXZpdGllcyA9IHN0ZDo6bWFwPFZvbHVtZVNvdXJjZSwgVm9sdW1lQWN0aXZpdHk+OworCisvKioKKyAqIEBicmllZiBUaGUgQWN0aXZpdHkgY2xhc3M6IGl0IHRyYWNrcyB0aGUgYWN0aXZpdHkgZm9yIHZvbHVtZSBwb2xpY3kgKHZvbHVtZSBpbmRleCwgbXV0ZSwKKyAqIG1lbW9yaXplIHByZXZpb3VzIHN0b3AsIGFuZCBzdG9yZSBtdXRlIGlmIGluY29tcGF0aWJsZSBkZXZpY2Ugd2l0aCBhbm90aGVyIHN0cmF0ZWd5LgorICogSGF2aW5nIHRoaXMgY2xhc3MgcHJldmVudHMgZnJvbSBsb29waW5nIG9uIGFsbCBhdHRyaWJ1dGVzIChsZWdhY3kgc3RyZWFtcykgb2YgdGhlIHN0cmF0ZWd5CisgKi8KK2NsYXNzIFJvdXRpbmdBY3Rpdml0eSA6IHB1YmxpYyBBY3Rpdml0eVRyYWNraW5nCit7CitwdWJsaWM6CisgICAgdm9pZCBzZXRNdXRlZEJ5RGV2aWNlKCBib29sIGlzTXV0ZWQpIHsgbUlzTXV0ZWRCeURldmljZSA9IGlzTXV0ZWQ7IH0KKyAgICBib29sIGlzTXV0ZWRCeURldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1Jc011dGVkQnlEZXZpY2U7IH0KKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgICAgQWN0aXZpdHlUcmFja2luZzo6ZHVtcChkc3QsIHNwYWNlcyk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiIpOworICAgIH0KK3ByaXZhdGU6CisgICAgLyoqCisgICAgICogc3RyYXRlZ2llcyBtdXRlZCBiZWNhdXNlIG9mIGluY29tcGF0aWJsZSBkZXZpY2Ugc2VsZWN0aW9uLgorICAgICAqIFNlZSBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoKQorICAgICAqLworICAgIGJvb2wgbUlzTXV0ZWRCeURldmljZSA9IGZhbHNlOworfTsKK3VzaW5nIFJvdXRpbmdBY3Rpdml0aWVzID0gc3RkOjptYXA8cHJvZHVjdF9zdHJhdGVneV90LCBSb3V0aW5nQWN0aXZpdHk+OwogCiAvLyBkZXNjcmlwdG9yIGZvciBhdWRpbyBvdXRwdXRzLiBVc2VkIHRvIG1haW50YWluIGN1cnJlbnQgY29uZmlndXJhdGlvbiBvZiBlYWNoIG9wZW5lZCBhdWRpbyBvdXRwdXQKIC8vIGFuZCBrZWVwIHRyYWNrIG9mIHRoZSB1c2FnZSBvZiB0aGlzIG91dHB1dCBieSBlYWNoIGF1ZGlvIHN0cmVhbSB0eXBlLgotY2xhc3MgQXVkaW9PdXRwdXREZXNjcmlwdG9yOiBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnCitjbGFzcyBBdWRpb091dHB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb1BvcnRDb25maWcsCisgICAgICAgIHB1YmxpYyBQb2xpY3lBdWRpb1BvcnRDb25maWcsCisgICAgICAgIHB1YmxpYyBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZSwKKyAgICAgICAgcHVibGljIENsaWVudE1hcEhhbmRsZXI8VHJhY2tDbGllbnREZXNjcmlwdG9yPgogewogcHVibGljOgotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxBdWRpb1BvcnQ+JiBwb3J0LAorICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxQb2xpY3lBdWRpb1BvcnQ+JiBwb2xpY3lBdWRpb1BvcnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwogICAgIHZpcnR1YWwgfkF1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CiAKLSAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Qgb3ZlcnJpZGU7CiAgICAgdm9pZCAgICAgICAgbG9nKGNvbnN0IGNoYXIqIGluZGVudCk7CiAKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90IGdldElkKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKCkgY29uc3Q7Ci0gICAgdmlydHVhbCBib29sIHNoYXJlc0h3TW9kdWxlV2l0aChjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKTsKLSAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBzdXBwb3J0ZWREZXZpY2VzKCk7CisgICAgdmlydHVhbCBEZXZpY2VWZWN0b3IgZGV2aWNlcygpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VzOyB9CisgICAgYm9vbCBzaGFyZXNId01vZHVsZVdpdGgoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYyk7CisgICAgdmlydHVhbCBEZXZpY2VWZWN0b3Igc3VwcG9ydGVkRGV2aWNlcygpIGNvbnN0ICB7IHJldHVybiBtRGV2aWNlczsgfQogICAgIHZpcnR1YWwgYm9vbCBpc0R1cGxpY2F0ZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQogICAgIHZpcnR1YWwgdWludDMyX3QgbGF0ZW5jeSgpIHsgcmV0dXJuIDA7IH0KLSAgICB2aXJ0dWFsIGJvb2wgaXNGaXhlZFZvbHVtZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKLSAgICB2aXJ0dWFsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MSgpIHsgcmV0dXJuIDA7IH0KLSAgICB2aXJ0dWFsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MigpIHsgcmV0dXJuIDA7IH0KLSAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICB2aXJ0dWFsIGJvb2wgaXNGaXhlZFZvbHVtZShjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcyk7CisgICAgdmlydHVhbCBib29sIHNldFZvbHVtZShmbG9hdCB2b2x1bWVEYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIGNvbnN0IFN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKTsKLSAgICB2aXJ0dWFsIHZvaWQgY2hhbmdlUmVmQ291bnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBkZWx0YSk7CiAKLSAgICBib29sIGlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7Ci0gICAgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OworICAgIC8qKgorICAgICAqIEBicmllZiBzZXRTdG9wVGltZSBzZXQgdGhlIHN0b3AgdGltZSBkdWUgdG8gdGhlIGNsaWVudCBzdG9wcGFnZSBvciBhIHJlIHJvdXRpbmcgb2YgdGhpcworICAgICAqIGNsaWVudAorICAgICAqIEBwYXJhbSBjbGllbnQgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEBwYXJhbSBzeXNUaW1lIHdoZW4gdGhlIGNsaWVudCBzdG9wcGVkL3dhcyByZXJvdXRlZAorICAgICAqLworICAgIHZvaWQgc2V0U3RvcFRpbWUoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBuc2Vjc190IHN5c1RpbWUpOwogCisgICAgLyoqCisgICAgICogQ2hhbmdlcyB0aGUgY2xpZW50LT5hY3RpdmUoKSBzdGF0ZSBhbmQgdGhlIG91dHB1dCBkZXNjcmlwdG9yJ3MgZ2xvYmFsIGFjdGl2ZSBjb3VudCwKKyAgICAgKiBhbG9uZyB3aXRoIHRoZSBzdHJlYW0gYWN0aXZlIGNvdW50IGFuZCBtQWN0aXZlQ2xpZW50cy4KKyAgICAgKiBUaGUgY2xpZW50IG11c3QgYmUgcHJldmlvdXNseSBhZGRlZCBieSB0aGUgYmFzZSBjbGFzcyBhZGRDbGllbnQoKS4KKyAgICAgKiBJbiBjYXNlIG9mIGR1cGxpY2F0aW5nIHRocmVhZCwgY2xpZW50IHNoYWxsIGJlIGFkZGVkIG9uIHRoZSBkdXBsaWNhdGVkIHRocmVhZCwgbm90IG9uIHRoZQorICAgICAqIGludm9sdmVkIG91dHB1dHMgYnV0IHNldENsaWVudEFjdGl2ZSB3aWxsIGJlIGNhbGxlZCBvbiBhbGwgb3V0cHV0IHRvIHRyYWNrIHN0cmF0ZWd5IGFuZAorICAgICAqIGFjdGl2ZSBjbGllbnQgZm9yIGEgZ2l2ZW4gb3V0cHV0LgorICAgICAqIEFjdGl2ZSByZWYgY291bnQgb2YgdGhlIGNsaWVudCB3aWxsIGJlIGluY3JlbWVudGVkL2RlY3JlbWVudGVkIHRocm91Z2ggc2V0QWN0aXZlIEFQSQorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCBzZXRDbGllbnRBY3RpdmUoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBib29sIGFjdGl2ZSk7CisKKyAgICBib29sIGlzQWN0aXZlKHVpbnQzMl90IGluUGFzdE1zKSBjb25zdDsKKyAgICBib29sIGlzQWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UgPSBWT0xVTUVfU09VUkNFX05PTkUsCisgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDAsCisgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUgPSAwKSBjb25zdDsKKyAgICBib29sIGlzQW55QWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2VUb0lnbm9yZSkgY29uc3Q7CisKKyAgICBzdGQ6OnZlY3RvcjxWb2x1bWVTb3VyY2U+IGdldEFjdGl2ZVZvbHVtZVNvdXJjZXMoKSBjb25zdCB7CisgICAgICAgIHN0ZDo6dmVjdG9yPFZvbHVtZVNvdXJjZT4gYWN0aXZlTGlzdDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVZvbHVtZUFjdGl2aXRpZXMpIHsKKyAgICAgICAgICAgIGlmIChpdGVyLnNlY29uZC5pc0FjdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgYWN0aXZlTGlzdC5wdXNoX2JhY2soaXRlci5maXJzdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGFjdGl2ZUxpc3Q7CisgICAgfQorICAgIHVpbnQzMl90IGdldEFjdGl2aXR5Q291bnQoVm9sdW1lU291cmNlIHZzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Wb2x1bWVBY3Rpdml0aWVzLmZpbmQodnMpICE9IHN0ZDo6ZW5kKG1Wb2x1bWVBY3Rpdml0aWVzKT8KKyAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUFjdGl2aXRpZXMuYXQodnMpLmdldEFjdGl2aXR5Q291bnQoKSA6IDA7CisgICAgfQorICAgIGJvb2wgaXNNdXRlZChWb2x1bWVTb3VyY2UgdnMpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbVZvbHVtZUFjdGl2aXRpZXMuZmluZCh2cykgIT0gc3RkOjplbmQobVZvbHVtZUFjdGl2aXRpZXMpPworICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQWN0aXZpdGllcy5hdCh2cykuaXNNdXRlZCgpIDogZmFsc2U7CisgICAgfQorICAgIGludCBnZXRNdXRlQ291bnQoVm9sdW1lU291cmNlIHZzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Wb2x1bWVBY3Rpdml0aWVzLmZpbmQodnMpICE9IHN0ZDo6ZW5kKG1Wb2x1bWVBY3Rpdml0aWVzKT8KKyAgICAgICAgICAgICAgICAgICAgbVZvbHVtZUFjdGl2aXRpZXMuYXQodnMpLmdldE11dGVDb3VudCgpIDogMDsKKyAgICB9CisgICAgaW50IGluY011dGVDb3VudChWb2x1bWVTb3VyY2UgdnMpCisgICAgeworICAgICAgICByZXR1cm4gbVZvbHVtZUFjdGl2aXRpZXNbdnNdLmluY011dGVDb3VudCgpOworICAgIH0KKyAgICBpbnQgZGVjTXV0ZUNvdW50KFZvbHVtZVNvdXJjZSB2cykKKyAgICB7CisgICAgICAgIHJldHVybiBtVm9sdW1lQWN0aXZpdGllc1t2c10uZGVjTXV0ZUNvdW50KCk7CisgICAgfQorICAgIHZvaWQgc2V0Q3VyVm9sdW1lKFZvbHVtZVNvdXJjZSB2cywgZmxvYXQgdm9sdW1lRGIpCisgICAgeworICAgICAgICAvLyBFdmVuIGlmIG5vdCBhY3Rpdml0eSBmb3IgdGhpcyBzb3VyY2UgcmVnaXN0ZXJlZCwgbmVlZCB0byBjcmVhdGUgYW55d2F5CisgICAgICAgIG1Wb2x1bWVBY3Rpdml0aWVzW3ZzXS5zZXRWb2x1bWUodm9sdW1lRGIpOworICAgIH0KKyAgICBmbG9hdCBnZXRDdXJWb2x1bWUoVm9sdW1lU291cmNlIHZzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Wb2x1bWVBY3Rpdml0aWVzLmZpbmQodnMpICE9IHN0ZDo6ZW5kKG1Wb2x1bWVBY3Rpdml0aWVzKSA/CisgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVBY3Rpdml0aWVzLmF0KHZzKS5nZXRWb2x1bWUoKSA6IE5BTjsKKyAgICB9CisKKyAgICBib29sIGlzU3RyYXRlZ3lBY3RpdmUocHJvZHVjdF9zdHJhdGVneV90IHBzLCB1aW50MzJfdCBpblBhc3RNcyA9IDAsIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gbVJvdXRpbmdBY3Rpdml0aWVzLmZpbmQocHMpICE9IHN0ZDo6ZW5kKG1Sb3V0aW5nQWN0aXZpdGllcyk/CisgICAgICAgICAgICAgICAgICAgIG1Sb3V0aW5nQWN0aXZpdGllcy5hdChwcykuaXNBY3RpdmUoaW5QYXN0TXMsIHN5c1RpbWUpIDogZmFsc2U7CisgICAgfQorICAgIGJvb2wgaXNTdHJhdGVneU11dGVkQnlEZXZpY2UocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Sb3V0aW5nQWN0aXZpdGllcy5maW5kKHBzKSAhPSBzdGQ6OmVuZChtUm91dGluZ0FjdGl2aXRpZXMpPworICAgICAgICAgICAgICAgICAgICBtUm91dGluZ0FjdGl2aXRpZXMuYXQocHMpLmlzTXV0ZWRCeURldmljZSgpIDogZmFsc2U7CisgICAgfQorICAgIHZvaWQgc2V0U3RyYXRlZ3lNdXRlZEJ5RGV2aWNlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcywgYm9vbCBpc011dGVkKQorICAgIHsKKyAgICAgICAgbVJvdXRpbmdBY3Rpdml0aWVzW3BzXS5zZXRNdXRlZEJ5RGV2aWNlKGlzTXV0ZWQpOworICAgIH0KKworICAgIC8vIFBvbGljeUF1ZGlvUG9ydENvbmZpZworICAgIHZpcnR1YWwgc3A8UG9saWN5QXVkaW9Qb3J0PiBnZXRQb2xpY3lBdWRpb1BvcnQoKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIG1Qb2xpY3lBdWRpb1BvcnQ7CisgICAgfQorCisgICAgLy8gQXVkaW9Qb3J0Q29uZmlnCisgICAgdmlydHVhbCBzdGF0dXNfdCBhcHBseUF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqYmFja3VwQ29uZmlnID0gTlVMTCk7CiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKLSAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgeyByZXR1cm4gbVBvcnQ7IH0KKyAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gZ2V0QXVkaW9Qb3J0KCkgY29uc3QgeyByZXR1cm4gbVBvbGljeUF1ZGlvUG9ydC0+YXNBdWRpb1BvcnQoKTsgfQorCiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKIAogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRNb2R1bGVIYW5kbGUoKSBjb25zdDsKIAotICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldFBhdGNoSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbVBhdGNoSGFuZGxlOyB9OwotICAgIHZvaWQgc2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKSB7IG1QYXRjaEhhbmRsZSA9IGhhbmRsZTsgfTsKKyAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZQorICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZ2V0Q29uZmlnKCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSkgb3ZlcnJpZGU7CiAKLSAgICBzcDxBdWRpb1BvcnQ+ICAgICAgIG1Qb3J0OwotICAgIGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlOyAgICAgICAgICAgICAgICAgICAvLyBjdXJyZW50IGRldmljZSB0aGlzIG91dHB1dCBpcyByb3V0ZWQgdG8KLSAgICB1aW50MzJfdCBtUmVmQ291bnRbQVVESU9fU1RSRUFNX0NOVF07IC8vIG51bWJlciBvZiBzdHJlYW1zIG9mIGVhY2ggdHlwZSB1c2luZyB0aGlzIG91dHB1dAotICAgIG5zZWNzX3QgbVN0b3BUaW1lW0FVRElPX1NUUkVBTV9DTlRdOwotICAgIGZsb2F0IG1DdXJWb2x1bWVbQVVESU9fU1RSRUFNX0NOVF07ICAgLy8gY3VycmVudCBzdHJlYW0gdm9sdW1lIGluIGRCCi0gICAgaW50IG1NdXRlQ291bnRbQVVESU9fU1RSRUFNX0NOVF07ICAgICAvLyBtdXRlIHJlcXVlc3QgY291bnRlcgotICAgIGJvb2wgbVN0cmF0ZWd5TXV0ZWRCeURldmljZVtOVU1fU1RSQVRFR0lFU107IC8vIHN0cmF0ZWdpZXMgbXV0ZWQgYmVjYXVzZSBvZiBpbmNvbXBhdGlibGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXZpY2Ugc2VsZWN0aW9uLiBTZWUgY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcygpCi0gICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKm1DbGllbnRJbnRlcmZhY2U7CisgICAgVHJhY2tDbGllbnRWZWN0b3IgY2xpZW50c0xpc3QoYm9vbCBhY3RpdmVPbmx5ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5ID0gUFJPRFVDVF9TVFJBVEVHWV9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJlZmVycmVkRGV2aWNlT25seSA9IGZhbHNlKSBjb25zdDsKKworICAgIC8vIG92ZXJyaWRlIENsaWVudE1hcEhhbmRsZXIgdG8gYWJvcnQgd2hlbiByZW1vdmluZyBhIGNsaWVudCB3aGVuIGFjdGl2ZS4KKyAgICB2b2lkIHJlbW92ZUNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgb3ZlcnJpZGUgeworICAgICAgICBhdXRvIGNsaWVudCA9IGdldENsaWVudChwb3J0SWQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNsaWVudC5nZXQoKSA9PSBudWxscHRyLAorICAgICAgICAgICAgICAgICIlcyglZCk6IG5vbmV4aXN0ZW50IGNsaWVudCBwb3J0SWQgJWQiLCBfX2Z1bmNfXywgbUlkLCBwb3J0SWQpOworICAgICAgICAvLyBpdCBpcyBwb3NzaWJsZSB0aGF0IHdoZW4gYSBjbGllbnQgaXMgcmVtb3ZlZCwgd2UgY291bGQgcmVtb3ZlIGl0cworICAgICAgICAvLyBhc3NvY2lhdGVkIGFjdGl2ZSBjb3VudCBieSBjYWxsaW5nIGNoYW5nZVN0cmVhbUFjdGl2ZUNvdW50KCksCisgICAgICAgIC8vIGJ1dCB0aGF0IHdvdWxkIGJlIGhpZGluZyBhIHByb2JsZW0sIHNvIHdlIGxvZyBmYXRhbCBpbnN0ZWFkLgorICAgICAgICBhdXRvIGNsaWVudEl0ZXIgPSBzdGQ6OmZpbmQoYmVnaW4obUFjdGl2ZUNsaWVudHMpLCBlbmQobUFjdGl2ZUNsaWVudHMpLCBjbGllbnQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGNsaWVudEl0ZXIgIT0gbUFjdGl2ZUNsaWVudHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVkKSByZW1vdmluZyBjbGllbnQgcG9ydElkICVkIHdoaWNoIGlzIGFjdGl2ZSAoY291bnQgJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbUlkLCBwb3J0SWQsIGNsaWVudC0+Z2V0QWN0aXZpdHlDb3VudCgpKTsKKyAgICAgICAgQ2xpZW50TWFwSGFuZGxlcjxUcmFja0NsaWVudERlc2NyaXB0b3I+OjpyZW1vdmVDbGllbnQocG9ydElkKTsKKyAgICB9CisKKyAgICBjb25zdCBUcmFja0NsaWVudFZlY3RvciYgZ2V0QWN0aXZlQ2xpZW50cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1BY3RpdmVDbGllbnRzOworICAgIH0KKworICAgIGJvb2wgdXNlSHdHYWluKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAhZGV2aWNlcygpLmlzRW1wdHkoKSA/IGRldmljZXMoKS5pdGVtQXQoMCktPmhhc0dhaW5Db250cm9sbGVyKCkgOiBmYWxzZTsKKyAgICB9CisKKyAgICBEZXZpY2VWZWN0b3IgbURldmljZXM7IC8qKjwgY3VycmVudCBkZXZpY2VzIHRoaXMgb3V0cHV0IGlzIHJvdXRlZCB0byAqLworICAgIHdwPEF1ZGlvUG9saWN5TWl4PiBtUG9saWN5TWl4OyAgLy8gbm9uIE5VTEwgd2hlbiB1c2VkIGJ5IGEgZHluYW1pYyBwb2xpY3kKIAogcHJvdGVjdGVkOgotICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZTsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1JZDsKKyAgICBjb25zdCBzcDxQb2xpY3lBdWRpb1BvcnQ+IG1Qb2xpY3lBdWRpb1BvcnQ7CisgICAgQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgKiBjb25zdCBtQ2xpZW50SW50ZXJmYWNlOworICAgIHVpbnQzMl90IG1HbG9iYWxBY3RpdmVDb3VudCA9IDA7ICAvLyBub24tY2xpZW50LXNwZWNpZmljIGFjdGl2ZSBjb3VudAorICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworCisgICAgLy8gVGhlIEFjdGl2ZUNsaWVudHMgc2hvd3MgdGhlIGNsaWVudHMgdGhhdCBjb250cmlidXRlIHRvIHRoZSBAVm9sdW1lU291cmNlIGNvdW50cworICAgIC8vIGFuZCBtYXkgaW5jbHVkZSB1cHN0cmVhbSBjbGllbnRzIGZyb20gYSBkdXBsaWNhdGluZyB0aHJlYWQuCisgICAgLy8gQ29tcGFyZSB3aXRoIHRoZSBDbGllbnRNYXAgKG1DbGllbnRzKSB3aGljaCBhcmUgZXh0ZXJuYWwgQXVkaW9UcmFjayBjbGllbnRzIG9mIHRoZQorICAgIC8vIG91dHB1dCBkZXNjcmlwdG9yIChhbmQgZG8gbm90IGNvdW50IGludGVybmFsIFBhdGNoVHJhY2tzKS4KKyAgICBUcmFja0NsaWVudFZlY3RvciBtQWN0aXZlQ2xpZW50czsKKworICAgIFJvdXRpbmdBY3Rpdml0aWVzIG1Sb3V0aW5nQWN0aXZpdGllczsgLyoqPCB0cmFjayByb3V0aW5nIGFjdGl2aXR5IG9uIHRoaXMgb3VwdXQuKi8KKworICAgIFZvbHVtZUFjdGl2aXRpZXMgbVZvbHVtZUFjdGl2aXRpZXM7IC8qKjwgdHJhY2sgdm9sdW1lIGFjdGl2aXR5IG9uIHRoaXMgb3VwdXQuKi8KIH07CiAKIC8vIEF1ZGlvIG91dHB1dCBkcml2ZW4gYnkgYSBzb2Z0d2FyZSBtaXhlciBpbiBhdWRpbyBmbGluZ2VyLgpAQCAtOTksMjAgKzMyNSwyNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwogICAgIHZpcnR1YWwgflN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKCkge30KIAotICAgIHN0YXR1c190ICAgIGR1bXAoaW50IGZkKTsKLQotICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGRldmljZSgpIGNvbnN0OwotICAgIHZpcnR1YWwgYm9vbCBzaGFyZXNId01vZHVsZVdpdGgoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYyk7Ci0gICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3Qgc3VwcG9ydGVkRGV2aWNlcygpOworICAgICAgICAgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBEZXZpY2VWZWN0b3IgZGV2aWNlcygpIGNvbnN0OworICAgIHZvaWQgc2V0RGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIHsgbURldmljZXMgPSBkZXZpY2VzOyB9CisgICAgYm9vbCBzaGFyZXNId01vZHVsZVdpdGgoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKTsKKyAgICB2aXJ0dWFsIERldmljZVZlY3RvciBzdXBwb3J0ZWREZXZpY2VzKCkgY29uc3Q7CisgICAgdmlydHVhbCBib29sIGRldmljZXNTdXBwb3J0RW5jb2RlZEZvcm1hdHMoY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpOwogICAgIHZpcnR1YWwgdWludDMyX3QgbGF0ZW5jeSgpOwogICAgIHZpcnR1YWwgYm9vbCBpc0R1cGxpY2F0ZWQoKSBjb25zdCB7IHJldHVybiAobU91dHB1dDEgIT0gTlVMTCAmJiBtT3V0cHV0MiAhPSBOVUxMKTsgfQotICAgIHZpcnR1YWwgYm9vbCBpc0ZpeGVkVm9sdW1lKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwotICAgIHZpcnR1YWwgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzdWJPdXRwdXQxKCkgeyByZXR1cm4gbU91dHB1dDE7IH0KLSAgICB2aXJ0dWFsIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MigpIHsgcmV0dXJuIG1PdXRwdXQyOyB9Ci0gICAgdmlydHVhbCB2b2lkIGNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgZGVsdGEpOwotICAgIHZpcnR1YWwgYm9vbCBzZXRWb2x1bWUoZmxvYXQgdm9sdW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgIHZpcnR1YWwgYm9vbCBpc0ZpeGVkVm9sdW1lKGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzKTsKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gc3ViT3V0cHV0MSgpIHsgcmV0dXJuIG1PdXRwdXQxOyB9CisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHN1Yk91dHB1dDIoKSB7IHJldHVybiBtT3V0cHV0MjsgfQorICAgIHZvaWQgc2V0Q2xpZW50QWN0aXZlKGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwgYm9vbCBhY3RpdmUpIG92ZXJyaWRlOworICAgIHZvaWQgc2V0QWxsQ2xpZW50c0luYWN0aXZlKCkKKyAgICB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogY2xpZW50c0xpc3QodHJ1ZSkpIHsKKyAgICAgICAgICAgIHNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgY29uc3QgU3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKTsKIApAQCAtMTIwLDQ5ICszNTMsNzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKIAotICAgICAgICAgICAgc3RhdHVzX3Qgb3Blbihjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQpOwotICAgICAgICAgICAgLy8gQ2FsbGVkIHdoZW4gYSBzdHJlYW0gaXMgYWJvdXQgdG8gYmUgc3RhcnRlZAotICAgICAgICAgICAgLy8gTm90ZTogY2FsbGVkIGJlZm9yZSBjaGFuZ2VSZWZDb3VudCgxKTsKLSAgICAgICAgICAgIHN0YXR1c190IHN0YXJ0KCk7Ci0gICAgICAgICAgICAvLyBDYWxsZWQgYWZ0ZXIgYSBzdHJlYW0gaXMgc3RvcHBlZC4KLSAgICAgICAgICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBjaGFuZ2VSZWZDb3VudCgtMSk7Ci0gICAgICAgICAgICB2b2lkIHN0b3AoKTsKLSAgICAgICAgICAgIHZvaWQgY2xvc2UoKTsKLSAgICAgICAgICAgIHN0YXR1c190IG9wZW5EdXBsaWNhdGluZyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppb0hhbmRsZSk7CisgICAgICAgIHN0YXR1c190IG9wZW4oY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCk7CisKKyAgICAgICAgLy8gQ2FsbGVkIHdoZW4gYSBzdHJlYW0gaXMgYWJvdXQgdG8gYmUgc3RhcnRlZAorICAgICAgICAvLyBOb3RlOiBjYWxsZWQgYmVmb3JlIHNldENsaWVudEFjdGl2ZSh0cnVlKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICAgICAgLy8gQ2FsbGVkIGFmdGVyIGEgc3RyZWFtIGlzIHN0b3BwZWQuCisgICAgICAgIC8vIE5vdGU6IGNhbGxlZCBhZnRlciBzZXRDbGllbnRBY3RpdmUoZmFsc2UpOworICAgICAgICB2b2lkIHN0b3AoKTsKKyAgICAgICAgdm9pZCBjbG9zZSgpOworICAgICAgICBzdGF0dXNfdCBvcGVuRHVwbGljYXRpbmcoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlKTsKKworICAgIC8qKgorICAgICAqIEBicmllZiBzdXBwb3J0c0RldmljZQorICAgICAqIEBwYXJhbSBkZXZpY2UgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkIGJ5IHR5cGUgKGZvciBub24gYnVzIC8gcmVtb3RlIHN1Ym1peCBkZXZpY2VzKSwKKyAgICAgKiAgICAgICAgIHRydWUgaWYgdGhlIGRldmljZSBpcyBzdXBwb3J0ZWQgKGJvdGggdHlwZSBhbmQgYWRkcmVzcykgZm9yIGJ1cyAvIHJlbW90ZSBzdWJtaXgKKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgc3VwcG9ydHNEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgc3VwcG9ydHNBbGxEZXZpY2VzCisgICAgICogQHBhcmFtIGRldmljZXMgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0CisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgd2Vha2x5IHN1cHBvcnRlZCBieSB0eXBlIChlLmcuIGZvciBub24gYnVzIC8gcnN1Ym1peCBkZXZpY2VzKSwKKyAgICAgKiAgICAgICAgIHRydWUgaWYgdGhlIGRldmljZSBpcyBzdXBwb3J0ZWQgKGJvdGggdHlwZSBhbmQgYWRkcmVzcykgZm9yIGJ1cyAvIHJlbW90ZSBzdWJtaXgKKyAgICAgKiAgICAgICAgIGZhbHNlIG90aGVyd2lzZQorICAgICAqLworICAgIGJvb2wgc3VwcG9ydHNBbGxEZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZmlsdGVyU3VwcG9ydGVkRGV2aWNlcyB0YWtlcyBhIHZlY3RvciBvZiBkZXZpY2VzIGFuZCBmaWx0ZXJzIHRoZW0gYWNjb3JkaW5nIHRvIHRoZQorICAgICAqIGRldmljZSBzdXBwb3J0ZWQgYnkgdGhpcyBvdXRwdXQgKHRoZSBwcm9maWxlIGZyb20gd2hpY2ggdGhpcyBvdXRwdXQgZGVyaXZlcyBmcm9tKQorICAgICAqIEBwYXJhbSBkZXZpY2VzIHJlZmVyZW5jZSBkZXZpY2UgdmVjdG9yIHRvIGJlIGZpbHRlcmVkCisgICAgICogQHJldHVybiB2ZWN0b3Igb2YgZGV2aWNlcyBmaWx0ZXJlZCBmcm9tIHRoZSBzdXBwb3J0ZWQgZGV2aWNlcyBvZiB0aGlzIG91dHB1dCAod2Vha2x5IG9yIG5vdAorICAgICAqIGRlcGVuZGluZyBvbiB0aGUgZGV2aWNlIHR5cGUpCisgICAgICovCisgICAgRGV2aWNlVmVjdG9yIGZpbHRlclN1cHBvcnRlZERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdDsKIAogICAgIGNvbnN0IHNwPElPUHJvZmlsZT4gbVByb2ZpbGU7ICAgICAgICAgIC8vIEkvTyBwcm9maWxlIHRoaXMgb3V0cHV0IGRlcml2ZXMgZnJvbQogICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1Jb0hhbmRsZTsgICAgICAgICAgIC8vIG91dHB1dCBoYW5kbGUKICAgICB1aW50MzJfdCBtTGF0ZW5jeTsgICAgICAgICAgICAgICAgICAvLwogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG1GbGFnczsgICAvLwotICAgIEF1ZGlvTWl4ICptUG9saWN5TWl4OyAgICAgICAgICAgICAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MTsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IGZpcnN0IG91dHB1dAogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtT3V0cHV0MjsgICAgLy8gdXNlZCBieSBkdXBsaWNhdGVkIG91dHB1dHM6IHNlY29uZCBvdXRwdXQKICAgICB1aW50MzJfdCBtRGlyZWN0T3BlbkNvdW50OyAvLyBudW1iZXIgb2YgY2xpZW50cyB1c2luZyB0aGlzIG91dHB1dCAoZGlyZWN0IG91dHB1dHMgb25seSkKICAgICBhdWRpb19zZXNzaW9uX3QgbURpcmVjdENsaWVudFNlc3Npb247IC8vIHNlc3Npb24gaWQgb2YgdGhlIGRpcmVjdCBvdXRwdXQgY2xpZW50Ci0gICAgdWludDMyX3QgbUdsb2JhbFJlZkNvdW50OyAgLy8gbm9uLXN0cmVhbS1zcGVjaWZpYyByZWYgY291bnQKIH07CiAKIC8vIEF1ZGlvIG91dHB1dCBkcml2ZW4gYnkgYW4gaW5wdXQgZGV2aWNlIGRpcmVjdGx5LgogY2xhc3MgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6IHB1YmxpYyBBdWRpb091dHB1dERlc2NyaXB0b3IKIHsKIHB1YmxpYzoKLSAgICBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2UsCisgICAgSHdBdWRpb091dHB1dERlc2NyaXB0b3IoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKTsKICAgICB2aXJ0dWFsIH5Id0F1ZGlvT3V0cHV0RGVzY3JpcHRvcigpIHt9CiAKLSAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7CisgICAgICAgICAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKIAotICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IHN1cHBvcnRlZERldmljZXMoKTsKLSAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgY29uc3QgU3RyZWFtVHlwZVZlY3RvciAmc3RyZWFtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpOwogCkBAIC0xNzAsNyArNDI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CiAgICAgdmlydHVhbCB2b2lkIHRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdDsKIAotICAgIGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gbVNvdXJjZTsKKyAgICBjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBtU291cmNlOwogCiB9OwogCkBAIC0xNzgsMjUgKzQzNSw1MiBAQAogICAgICAgICBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19pb19oYW5kbGVfdCwgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ID4KIHsKIHB1YmxpYzoKLSAgICBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OworICAgIGJvb2wgaXNBY3RpdmUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKIAogICAgIC8qKgotICAgICAqIHJldHVybiB3aGV0aGVyIGEgc3RyZWFtIGlzIHBsYXlpbmcgcmVtb3RlbHksIG92ZXJyaWRlIHRvIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZgorICAgICAqIHJldHVybiB3aGV0aGVyIGFueSBzb3VyY2UgY29udHJpYnV0aW5nIHRvIFZvbHVtZVNvdXJjZSBpcyBwbGF5aW5nIHJlbW90ZWx5LCBvdmVycmlkZQorICAgICAqIHRvIGNoYW5nZSB0aGUgZGVmaW5pdGlvbiBvZgogICAgICAqIGxvY2FsL3JlbW90ZSBwbGF5YmFjaywgdXNlZCBmb3IgaW5zdGFuY2UgYnkgbm90aWZpY2F0aW9uIG1hbmFnZXIgdG8gbm90IG1ha2UKICAgICAgKiBtZWRpYSBwbGF5ZXJzIGxvc2UgYXVkaW8gZm9jdXMgd2hlbiBub3QgcGxheWluZyBsb2NhbGx5CiAgICAgICogRm9yIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uLCAicmVtb3RlbHkiIG1lYW5zIHBsYXlpbmcgZHVyaW5nIHNjcmVlbiBtaXJyb3Jpbmcgd2hpY2gKICAgICAgKiB1c2VzIGFuIG91dHB1dCBmb3IgcGxheWJhY2sgd2l0aCBhIG5vbi1lbXB0eSwgbm9uICIwIiBhZGRyZXNzLgogICAgICAqLwotICAgIGJvb2wgaXNTdHJlYW1BY3RpdmVSZW1vdGVseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKKyAgICBib29sIGlzQWN0aXZlUmVtb3RlbHkoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKIAogICAgIC8qKgotICAgICAqIHJldHVybiB3aGV0aGVyIGEgc3RyZWFtIGlzIHBsYXlpbmcsIGJ1dCBub3Qgb24gYSAicmVtb3RlIiBkZXZpY2UuCisgICAgICogcmV0dXJuIHdoZXRoZXIgYW55IHNvdXJjZSBjb250cmlidXRpbmcgdG8gVm9sdW1lU291cmNlIGlzIHBsYXlpbmcsIGJ1dCBub3Qgb24gYSAicmVtb3RlIgorICAgICAqIGRldmljZS4KICAgICAgKiBPdmVycmlkZSB0byBjaGFuZ2UgdGhlIGRlZmluaXRpb24gb2YgYSBsb2NhbC9yZW1vdGUgcGxheWJhY2suCiAgICAgICogVXNlZCBmb3IgaW5zdGFuY2UgYnkgcG9saWN5IG1hbmFnZXIgdG8gYWx0ZXIgdGhlIHNwZWFrZXIgcGxheWJhY2sgKCJzcGVha2VyIHNhZmUiIGJlaGF2aW9yKQogICAgICAqIHdoZW4gbWVkaWEgcGxheXMgb3Igbm90IGxvY2FsbHkuCiAgICAgICogRm9yIHRoZSBiYXNlIGltcGxlbWVudGF0aW9uLCAicmVtb3RlbHkiIG1lYW5zIHBsYXlpbmcgZHVyaW5nIHNjcmVlbiBtaXJyb3JpbmcuCiAgICAgICovCi0gICAgYm9vbCBpc1N0cmVhbUFjdGl2ZUxvY2FsbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CisgICAgYm9vbCBpc0FjdGl2ZUxvY2FsbHkoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBpc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlIGNoZWNrcyBpZiB0aGUgZ2l2ZW4gc3RyYXRlZ3kgaXMgYWN0aXZlIChvciB3YXMgYWN0aXZlCisgICAgICogaW4gdGhlIHBhc3QpIG9uIHRoZSBnaXZlbiBvdXRwdXQgYW5kIGFsbCB0aGUgb3V0cHV0cyBiZWxvbmdpbmcgdG8gdGhlIHNhbWUgSFcgTW9kdWxlCisgICAgICogdGhlIHNhbWUgbW9kdWxlIHRoYW4gdGhlIGdpdmVuIG91dHB1dAorICAgICAqIEBwYXJhbSBvdXRwdXREZXNjIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gcHMgcHJvZHVjdCBzdHJhdGVneSB0byBiZSBjaGVja2VkIHVwb24gYWN0aXZpdHkgc3RhdHVzCisgICAgICogQHBhcmFtIGluUGFzdE1zIGlmIDAsIGNoZWNrIGN1cnJlbnRseSwgb3RoZXJ3aXNlLCBjaGVjayBpbiB0aGUgcGFzdAorICAgICAqIEBwYXJhbSBzeXNUaW1lIHNoYWxsIGJlIHNldCBpZiByZXF1ZXN0IGlzIGRvbmUgZm9yIHRoZSBwYXN0IGFjdGl2aXR5LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiBhbiBvdXRwdXQgZm9sbG93aW5nIHRoZSBzdHJhdGVneSBpcyBhY3RpdmUgb24gdGhlIHNhbWUgbW9kdWxlIHRoYW4gZGVzYywKKyAgICAgKiBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIGlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUocHJvZHVjdF9zdHJhdGVneV90IHBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluUGFzdE1zID0gMCwgbnNlY3NfdCBzeXNUaW1lID0gMCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgY2xlYXJTZXNzaW9uUm91dGVzRm9yRGV2aWNlOiB3aGVuIGEgZGV2aWNlIGlzIGRpc2Nvbm5lY3RlZCwgYW5kIGlmIHRoaXMgZGV2aWNlIGhhcworICAgICAqIGJlZW4gY2hvc2VuIGFzIHRoZSBwcmVmZXJyZWQgZGV2aWNlIGJ5IGFueSBjbGllbnQsIHRoZSBwb2xpY3kgbWFuYWdlciBzaGFsbAorICAgICAqIHByZXZlbnQgZnJvbSB1c2luZyB0aGlzIGRldmljZSBhbnkgbW9yZSBieSBjbGVhcmluZyBhbGwgdGhlIHNlc3Npb24gcm91dGVzIGludm9sdmluZyB0aGlzCisgICAgICogZGV2aWNlLgorICAgICAqIEluIG90aGVyIHdvcmRzLCB0aGUgcHJlZmVycmVkIGRldmljZSBwb3J0IGlkIG9mIHRoZXNlIGNsaWVudHMgd2lsbCBiZSByZXNldHRlZCB0byBOT05FLgorICAgICAqIEBwYXJhbSBkaXNjb25uZWN0ZWREZXZpY2UgZGV2aWNlIHRvIGJlIGRpc2Nvbm5lY3RlZAorICAgICAqLworICAgIHZvaWQgY2xlYXJTZXNzaW9uUm91dGVzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkaXNjb25uZWN0ZWREZXZpY2UpOwogCiAgICAgLyoqCiAgICAgICogcmV0dXJucyB0aGUgQTJEUCBvdXRwdXQgaGFuZGxlIGlmIGl0IGlzIG9wZW4gb3IgMCBvdGhlcndpc2UKQEAgLTIxOCwyNyArNTAyLDUzIEBACiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGdldFByaW1hcnlPdXRwdXQoKSBjb25zdDsKIAogICAgIC8qKgotICAgICAqIHJldHVybiB0cnVlIGlmIGFueSBvdXRwdXQgaXMgcGxheWluZyBhbnl0aGluZyBiZXNpZGVzIHRoZSBzdHJlYW0gdG8gaWdub3JlCisgICAgICogQGJyaWVmIGlzQW55T3V0cHV0QWN0aXZlIGNoZWNrcyBpZiBhbnkgb3V0cHV0IGlzIGFjdGl2ZSAoYWthIHBsYXlpbmcpIGV4Y2VwdCB0aGUgb25lKHMpIHRoYXQKKyAgICAgKiBob2xkIHRoZSB2b2x1bWUgc291cmNlIHRvIGJlIGlnbm9yZWQKKyAgICAgKiBAcGFyYW0gdm9sdW1lU291cmNlVG9JZ25vcmUgc291cmNlIG5vdCB0byBiZSBjb25zaWRlcmVkIGluIHRoZSBhY3Rpdml0eSBkZXRlY3Rpb24KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgYW55IG91dHB1dCBpcyBhY3RpdmUgZm9yIGFueSB2b2x1bWUgc291cmNlIGV4Y2VwdCB0aGUgb25lIHRvIGJlIGlnbm9yZWQKICAgICAgKi8KLSAgICBib29sIGlzQW55T3V0cHV0QWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVG9JZ25vcmUpIGNvbnN0OworICAgIGJvb2wgaXNBbnlPdXRwdXRBY3RpdmUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZVRvSWdub3JlKSBjb25zdAorICAgIHsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNBbnlBY3RpdmUodm9sdW1lU291cmNlVG9JZ25vcmUpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KIAogICAgIGF1ZGlvX2RldmljZXNfdCBnZXRTdXBwb3J0ZWREZXZpY2VzKGF1ZGlvX2lvX2hhbmRsZV90IGhhbmRsZSkgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGdldE91dHB1dEZvckNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKIH07CiAKIGNsYXNzIEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uIDoKICAgICAgICAgcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjwgYXVkaW9faW9faGFuZGxlX3QsIHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiA+CiB7CiBwdWJsaWM6Ci0gICAgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKKyAgICBib29sIGlzQWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIHVpbnQzMl90IGluUGFzdE1zID0gMCkgY29uc3Q7CiAKICAgICAvKioKLSAgICAgKiByZXR1cm4gdHJ1ZSBpZiBhbnkgb3V0cHV0IGlzIHBsYXlpbmcgYW55dGhpbmcgYmVzaWRlcyB0aGUgc3RyZWFtIHRvIGlnbm9yZQorICAgICAqIEBicmllZiBpc0FueU91dHB1dEFjdGl2ZSBjaGVja3MgaWYgYW55IG91dHB1dCBpcyBhY3RpdmUgKGFrYSBwbGF5aW5nKSBleGNlcHQgdGhlIG9uZShzKSB0aGF0CisgICAgICogaG9sZCB0aGUgdm9sdW1lIHNvdXJjZSB0byBiZSBpZ25vcmVkCisgICAgICogQHBhcmFtIHZvbHVtZVNvdXJjZVRvSWdub3JlIHNvdXJjZSBub3QgdG8gYmUgY29uc2lkZXJlZCBpbiB0aGUgYWN0aXZpdHkgZGV0ZWN0aW9uCisgICAgICogQHJldHVybiB0cnVlIGlmIGFueSBvdXRwdXQgaXMgYWN0aXZlIGZvciBhbnkgdm9sdW1lIHNvdXJjZSBleGNlcHQgdGhlIG9uZSB0byBiZSBpZ25vcmVkCiAgICAgICovCi0gICAgYm9vbCBpc0FueU91dHB1dEFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVRvSWdub3JlKSBjb25zdDsKKyAgICBib29sIGlzQW55T3V0cHV0QWN0aXZlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2VUb0lnbm9yZSkgY29uc3QKKyAgICB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJm91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQW55QWN0aXZlKHZvbHVtZVNvdXJjZVRvSWdub3JlKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiB9OwogCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9QYXRjaC5oCmluZGV4IGMxYzNmM2MuLmE1ZGU2NTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BhdGNoLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUGF0Y2guaApAQCAtMjIsNiArMjIsNyBAQAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zMCwxMiArMzEsMjQgQEAKIHB1YmxpYzoKICAgICBBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsIHVpZF90IHVpZCk7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtSGFuZGxlOyB9CiAKLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtSGFuZGxlOworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGdldEFmSGFuZGxlKCkgY29uc3QgeyByZXR1cm4gbUFmUGF0Y2hIYW5kbGU7IH0KKworICAgIHZvaWQgc2V0QWZIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZIYW5kbGUpIHsgbUFmUGF0Y2hIYW5kbGUgPSBhZkhhbmRsZTsgfQorCisgICAgdWlkX3QgZ2V0VWlkKCkgY29uc3QgeyByZXR1cm4gbVVpZDsgfQorCisgICAgdm9pZCBzZXRVaWQodWlkX3QgdWlkKSB7IG1VaWQgPSB1aWQ7IH0KKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisKICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbVBhdGNoOworCitwcml2YXRlOgorICAgIGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1IYW5kbGU7CiAgICAgdWlkX3QgbVVpZDsKLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtQWZQYXRjaEhhbmRsZTsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtQWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwogfTsKIAogY2xhc3MgQXVkaW9QYXRjaENvbGxlY3Rpb24gOiBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPGF1ZGlvX3BhdGNoX2hhbmRsZV90LCBzcDxBdWRpb1BhdGNoPiA+CkBAIC00Nyw3ICs2MCw3IEBACiAKICAgICBzdGF0dXNfdCBsaXN0QXVkaW9QYXRjaGVzKHVuc2lnbmVkIGludCAqbnVtX3BhdGNoZXMsIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2hlcykgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb2xpY3lDb25maWcuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeUNvbmZpZy5oCmluZGV4IDQzZjZlZDYuLjQ3YzZlNjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeUNvbmZpZy5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeUNvbmZpZy5oCkBAIC0xNiwxOSArMTYsMjAgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlIDxBdWRpb0dhaW4uaD4KLSNpbmNsdWRlIDxWb2x1bWVDdXJ2ZS5oPgotI2luY2x1ZGUgPEF1ZGlvUG9ydC5oPgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKwogI2luY2x1ZGUgPEF1ZGlvUGF0Y2guaD4KICNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8SU9Qcm9maWxlLmg+CiAjaW5jbHVkZSA8SHdNb2R1bGUuaD4KKyNpbmNsdWRlIDxQb2xpY3lBdWRpb1BvcnQuaD4KICNpbmNsdWRlIDxBdWRpb0lucHV0RGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPEF1ZGlvT3V0cHV0RGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWl4Lmg+CiAjaW5jbHVkZSA8RWZmZWN0RGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPFNvdW5kVHJpZ2dlclNlc3Npb24uaD4KLSNpbmNsdWRlIDxTZXNzaW9uUm91dGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Byb2ZpbGUuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC0zNiwyMyArMzcsMzEgQEAKIHsKIHB1YmxpYzoKICAgICBBdWRpb1BvbGljeUNvbmZpZyhId01vZHVsZUNvbGxlY3Rpb24gJmh3TW9kdWxlcywKLSAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVJbnB1dERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRlZmF1bHRPdXRwdXREZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gKnZvbHVtZXMgPSBudWxscHRyKQotICAgICAgICA6IG1Id01vZHVsZXMoaHdNb2R1bGVzKSwKLSAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyhhdmFpbGFibGVPdXRwdXREZXZpY2VzKSwKLSAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzKGF2YWlsYWJsZUlucHV0RGV2aWNlcyksCi0gICAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2VzKGRlZmF1bHRPdXRwdXREZXZpY2VzKSwKLSAgICAgICAgICBtVm9sdW1lQ3VydmVzKHZvbHVtZXMpLAorICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciAmb3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgJmlucHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGVmYXVsdE91dHB1dERldmljZSkKKyAgICAgICAgOiBtRW5naW5lTGlicmFyeU5hbWVTdWZmaXgoa0RlZmF1bHRFbmdpbmVMaWJyYXJ5TmFtZVN1ZmZpeCksCisgICAgICAgICAgbUh3TW9kdWxlcyhod01vZHVsZXMpLAorICAgICAgICAgIG1PdXRwdXREZXZpY2VzKG91dHB1dERldmljZXMpLAorICAgICAgICAgIG1JbnB1dERldmljZXMoaW5wdXREZXZpY2VzKSwKKyAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZShkZWZhdWx0T3V0cHV0RGV2aWNlKSwKICAgICAgICAgICBtSXNTcGVha2VyRHJjRW5hYmxlZChmYWxzZSkKICAgICB7fQogCi0gICAgdm9pZCBzZXRWb2x1bWVzKGNvbnN0IFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gJnZvbHVtZXMpCi0gICAgewotICAgICAgICBpZiAobVZvbHVtZUN1cnZlcyAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICAqbVZvbHVtZUN1cnZlcyA9IHZvbHVtZXM7Ci0gICAgICAgIH0KKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0U291cmNlKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbVNvdXJjZTsKKyAgICB9CisKKyAgICB2b2lkIHNldFNvdXJjZShjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSkgeworICAgICAgICBtU291cmNlID0gZmlsZTsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0RW5naW5lTGlicmFyeU5hbWVTdWZmaXgoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtRW5naW5lTGlicmFyeU5hbWVTdWZmaXg7CisgICAgfQorCisgICAgdm9pZCBzZXRFbmdpbmVMaWJyYXJ5TmFtZVN1ZmZpeChjb25zdCBzdGQ6OnN0cmluZyYgc3VmZml4KSB7CisgICAgICAgIG1FbmdpbmVMaWJyYXJ5TmFtZVN1ZmZpeCA9IHN1ZmZpeDsKICAgICB9CiAKICAgICB2b2lkIHNldEh3TW9kdWxlcyhjb25zdCBId01vZHVsZUNvbGxlY3Rpb24gJmh3TW9kdWxlcykKQEAgLTYwLDIzICs2OSwyMyBAQAogICAgICAgICBtSHdNb2R1bGVzID0gaHdNb2R1bGVzOwogICAgIH0KIAotICAgIHZvaWQgYWRkQXZhaWxhYmxlRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZhdmFpbGFibGVEZXZpY2UpCisgICAgdm9pZCBhZGREZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSkKICAgICB7Ci0gICAgICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGF2YWlsYWJsZURldmljZS0+dHlwZSgpKSkgewotICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuYWRkKGF2YWlsYWJsZURldmljZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGF2YWlsYWJsZURldmljZS0+dHlwZSgpKSkgewotICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5hZGQoYXZhaWxhYmxlRGV2aWNlKTsKKyAgICAgICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlLT50eXBlKCkpKSB7CisgICAgICAgICAgICBtT3V0cHV0RGV2aWNlcy5hZGQoZGV2aWNlKTsKKyAgICAgICAgfSBlbHNlIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlLT50eXBlKCkpKSB7CisgICAgICAgICAgICBtSW5wdXREZXZpY2VzLmFkZChkZXZpY2UpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgdm9pZCBhZGRBdmFpbGFibGVJbnB1dERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVJbnB1dERldmljZXMpCisgICAgdm9pZCBhZGRJbnB1dERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZpbnB1dERldmljZXMpCiAgICAgewotICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmFkZChhdmFpbGFibGVJbnB1dERldmljZXMpOworICAgICAgICBtSW5wdXREZXZpY2VzLmFkZChpbnB1dERldmljZXMpOwogICAgIH0KIAotICAgIHZvaWQgYWRkQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmF2YWlsYWJsZU91dHB1dERldmljZXMpCisgICAgdm9pZCBhZGRPdXRwdXREZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmb3V0cHV0RGV2aWNlcykKICAgICB7Ci0gICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChhdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKKyAgICAgICAgbU91dHB1dERldmljZXMuYWRkKG91dHB1dERldmljZXMpOwogICAgIH0KIAogICAgIGJvb2wgaXNTcGVha2VyRHJjRW5hYmxlZCgpIGNvbnN0IHsgcmV0dXJuIG1Jc1NwZWFrZXJEcmNFbmFibGVkOyB9CkBAIC04OCw2MyArOTcsOTcgQEAKIAogICAgIGNvbnN0IEh3TW9kdWxlQ29sbGVjdGlvbiBnZXRId01vZHVsZXMoKSBjb25zdCB7IHJldHVybiBtSHdNb2R1bGVzOyB9CiAKLSAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpIGNvbnN0CisgICAgY29uc3QgRGV2aWNlVmVjdG9yICZnZXRJbnB1dERldmljZXMoKSBjb25zdAogICAgIHsKLSAgICAgICAgcmV0dXJuIG1BdmFpbGFibGVJbnB1dERldmljZXM7CisgICAgICAgIHJldHVybiBtSW5wdXREZXZpY2VzOwogICAgIH0KIAotICAgIGNvbnN0IERldmljZVZlY3RvciAmZ2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpIGNvbnN0CisgICAgY29uc3QgRGV2aWNlVmVjdG9yICZnZXRPdXRwdXREZXZpY2VzKCkgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlczsKKyAgICAgICAgcmV0dXJuIG1PdXRwdXREZXZpY2VzOwogICAgIH0KIAogICAgIHZvaWQgc2V0RGVmYXVsdE91dHB1dERldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGVmYXVsdERldmljZSkKICAgICB7Ci0gICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlcyA9IGRlZmF1bHREZXZpY2U7CisgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlID0gZGVmYXVsdERldmljZTsKICAgICB9CiAKLSAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZ2V0RGVmYXVsdE91dHB1dERldmljZSgpIGNvbnN0IHsgcmV0dXJuIG1EZWZhdWx0T3V0cHV0RGV2aWNlczsgfQorICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZnZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkgY29uc3QgeyByZXR1cm4gbURlZmF1bHRPdXRwdXREZXZpY2U7IH0KIAogICAgIHZvaWQgc2V0RGVmYXVsdCh2b2lkKQogICAgIHsKLSAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2VzID0gbmV3IERldmljZURlc2NyaXB0b3IoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKTsKLSAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZTsKKyAgICAgICAgbVNvdXJjZSA9ICJBdWRpb1BvbGljeUNvbmZpZzo6c2V0RGVmYXVsdCI7CisgICAgICAgIG1FbmdpbmVMaWJyYXJ5TmFtZVN1ZmZpeCA9IGtEZWZhdWx0RW5naW5lTGlicmFyeU5hbWVTdWZmaXg7CisgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKTsKKyAgICAgICAgbURlZmF1bHRPdXRwdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShBdWRpb1Byb2ZpbGU6OmNyZWF0ZUZ1bGxEeW5hbWljKGdEeW5hbWljRm9ybWF0KSk7CiAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRlZmF1bHRJbnB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyk7Ci0gICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmFkZChtRGVmYXVsdE91dHB1dERldmljZXMpOwotICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmFkZChkZWZhdWx0SW5wdXREZXZpY2UpOworICAgICAgICBkZWZhdWx0SW5wdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShBdWRpb1Byb2ZpbGU6OmNyZWF0ZUZ1bGxEeW5hbWljKGdEeW5hbWljRm9ybWF0KSk7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gbWljUHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoCisgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIEFVRElPX0NIQU5ORUxfSU5fTU9OTywgODAwMCk7CisgICAgICAgIGRlZmF1bHRJbnB1dERldmljZS0+YWRkQXVkaW9Qcm9maWxlKG1pY1Byb2ZpbGUpOworICAgICAgICBtT3V0cHV0RGV2aWNlcy5hZGQobURlZmF1bHRPdXRwdXREZXZpY2UpOworICAgICAgICBtSW5wdXREZXZpY2VzLmFkZChkZWZhdWx0SW5wdXREZXZpY2UpOwogCi0gICAgICAgIG1vZHVsZSA9IG5ldyBId01vZHVsZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSk7CisgICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBuZXcgSHdNb2R1bGUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlksIDIgLypoYWxWZXJzaW9uTWFqb3IqLyk7CisgICAgICAgIG1Id01vZHVsZXMuYWRkKG1vZHVsZSk7CiAKLSAgICAgICAgc3A8T3V0cHV0UHJvZmlsZT4gb3V0UHJvZmlsZTsKLSAgICAgICAgb3V0UHJvZmlsZSA9IG5ldyBPdXRwdXRQcm9maWxlKFN0cmluZzgoInByaW1hcnkiKSk7Ci0gICAgICAgIG91dFByb2ZpbGUtPmF0dGFjaChtb2R1bGUpOworICAgICAgICBzcDxPdXRwdXRQcm9maWxlPiBvdXRQcm9maWxlID0gbmV3IE91dHB1dFByb2ZpbGUoInByaW1hcnkiKTsKICAgICAgICAgb3V0UHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKAogICAgICAgICAgICAgICAgIG5ldyBBdWRpb1Byb2ZpbGUoQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywgNDQxMDApKTsKLSAgICAgICAgb3V0UHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKG1EZWZhdWx0T3V0cHV0RGV2aWNlcyk7CisgICAgICAgIG91dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtRGVmYXVsdE91dHB1dERldmljZSk7CiAgICAgICAgIG91dFByb2ZpbGUtPnNldEZsYWdzKEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpOwogICAgICAgICBtb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUob3V0UHJvZmlsZSk7CiAKLSAgICAgICAgc3A8SW5wdXRQcm9maWxlPiBpblByb2ZpbGU7Ci0gICAgICAgIGluUHJvZmlsZSA9IG5ldyBJbnB1dFByb2ZpbGUoU3RyaW5nOCgicHJpbWFyeSIpKTsKLSAgICAgICAgaW5Qcm9maWxlLT5hdHRhY2gobW9kdWxlKTsKLSAgICAgICAgaW5Qcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUoCi0gICAgICAgICAgICAgICAgbmV3IEF1ZGlvUHJvZmlsZShBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9JTl9NT05PLCA4MDAwKSk7CisgICAgICAgIHNwPElucHV0UHJvZmlsZT4gaW5Qcm9maWxlID0gbmV3IElucHV0UHJvZmlsZSgicHJpbWFyeSIpOworICAgICAgICBpblByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZShtaWNQcm9maWxlKTsKICAgICAgICAgaW5Qcm9maWxlLT5hZGRTdXBwb3J0ZWREZXZpY2UoZGVmYXVsdElucHV0RGV2aWNlKTsKICAgICAgICAgbW9kdWxlLT5hZGRJbnB1dFByb2ZpbGUoaW5Qcm9maWxlKTsKIAotICAgICAgICBtSHdNb2R1bGVzLmFkZChtb2R1bGUpOworICAgICAgICBzZXREZWZhdWx0U3Vycm91bmRGb3JtYXRzKCk7CisgICAgfQorCisgICAgLy8gU3Vycm91bmQgZm9ybWF0cywgd2l0aCBhbiBvcHRpb25hbCBsaXN0IG9mIHN1YmZvcm1hdHMgdGhhdCBhcmUgZXF1aXZhbGVudCBmcm9tIHVzZXJzJyBQT1YuCisgICAgdXNpbmcgU3Vycm91bmRGb3JtYXRzID0gc3RkOjp1bm9yZGVyZWRfbWFwPGF1ZGlvX2Zvcm1hdF90LCBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+PjsKKworICAgIGNvbnN0IFN1cnJvdW5kRm9ybWF0cyAmZ2V0U3Vycm91bmRGb3JtYXRzKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtU3Vycm91bmRGb3JtYXRzOworICAgIH0KKworICAgIHZvaWQgc2V0U3Vycm91bmRGb3JtYXRzKGNvbnN0IFN1cnJvdW5kRm9ybWF0cyAmc3Vycm91bmRGb3JtYXRzKQorICAgIHsKKyAgICAgICAgbVN1cnJvdW5kRm9ybWF0cyA9IHN1cnJvdW5kRm9ybWF0czsKKyAgICB9CisKKyAgICB2b2lkIHNldERlZmF1bHRTdXJyb3VuZEZvcm1hdHMoKQorICAgIHsKKyAgICAgICAgbVN1cnJvdW5kRm9ybWF0cyA9IHsKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfQUMzLCB7fX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0VfQUMzLCB7fX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0RUUywge319LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9EVFNfSEQsIHt9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfQUFDX0xDLCB7CisgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjEsIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjIsIEFVRElPX0ZPUk1BVF9BQUNfRUxELAorICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfQUFDX1hIRX19LAorICAgICAgICAgICAge0FVRElPX0ZPUk1BVF9ET0xCWV9UUlVFSEQsIHt9fSwKKyAgICAgICAgICAgIHtBVURJT19GT1JNQVRfRV9BQzNfSk9DLCB7fX0sCisgICAgICAgICAgICB7QVVESU9fRk9STUFUX0FDNCwge319fTsKICAgICB9CiAKIHByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0IGNvbnN0ZXhwciBjaGFyKiBjb25zdCBrRGVmYXVsdEVuZ2luZUxpYnJhcnlOYW1lU3VmZml4ID0gImRlZmF1bHQiOworCisgICAgc3RkOjpzdHJpbmcgbVNvdXJjZTsKKyAgICBzdGQ6OnN0cmluZyBtRW5naW5lTGlicmFyeU5hbWVTdWZmaXg7CiAgICAgSHdNb2R1bGVDb2xsZWN0aW9uICZtSHdNb2R1bGVzOyAvKio8IENvbGxlY3Rpb24gb2YgTW9kdWxlLCB3aXRoIFByb2ZpbGVzLCBpLmUuIE1peCBQb3J0cy4gKi8KLSAgICBEZXZpY2VWZWN0b3IgJm1BdmFpbGFibGVPdXRwdXREZXZpY2VzOwotICAgIERldmljZVZlY3RvciAmbUF2YWlsYWJsZUlucHV0RGV2aWNlczsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmbURlZmF1bHRPdXRwdXREZXZpY2VzOwotICAgIFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gKm1Wb2x1bWVDdXJ2ZXM7CisgICAgRGV2aWNlVmVjdG9yICZtT3V0cHV0RGV2aWNlczsKKyAgICBEZXZpY2VWZWN0b3IgJm1JbnB1dERldmljZXM7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm1EZWZhdWx0T3V0cHV0RGV2aWNlOwogICAgIC8vIFRPRE86IHJlbW92ZSB3aGVuIGxlZ2FjeSBjb25mIGZpbGUgaXMgcmVtb3ZlZC4gdHJ1ZSBvbiBkZXZpY2VzIHRoYXQgdXNlIERSQyBvbiB0aGUKICAgICAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiBwYXRoIHRvIGJvb3N0IHNvZnQgc291bmRzLCB1c2VkIHRvIGFkanVzdCB2b2x1bWUgY3VydmVzIGFjY29yZGluZ2x5LgogICAgIC8vIE5vdGU6IHJlbW92ZSBhbHNvIHNwZWFrZXJfZHJjX2VuYWJsZWQgZnJvbSBnbG9iYWwgY29uZmlndXJhdGlvbiBvZiBYTUwgY29uZmlnIGZpbGUuCiAgICAgYm9vbCBtSXNTcGVha2VyRHJjRW5hYmxlZDsKKyAgICBTdXJyb3VuZEZvcm1hdHMgbVN1cnJvdW5kRm9ybWF0czsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvbGljeU1peC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmgKaW5kZXggOGZjNmZlOS4uZmM3OWFiMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUG9saWN5TWl4LmgKQEAgLTE2LDQ5ICsxNiw0OCBAQAogCiAjcHJhZ21hIG9uY2UKIAorI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKICNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9EZXZpY2VUeXBlQWRkci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAKLW5hbWVzcGFjZSBhbmRyb2lkIHsKKyNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8QXVkaW9PdXRwdXREZXNjcmlwdG9yLmg+CiAKLWNsYXNzIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOworbmFtZXNwYWNlIGFuZHJvaWQgewogCiAvKioKICAqIGN1c3RvbSBtaXggZW50cnkgaW4gbVBvbGljeU1peGVzCiAgKi8KLWNsYXNzIEF1ZGlvUG9saWN5TWl4IDogcHVibGljIFJlZkJhc2UgeworY2xhc3MgQXVkaW9Qb2xpY3lNaXggOiBwdWJsaWMgQXVkaW9NaXgsIHB1YmxpYyBSZWZCYXNlIHsKIHB1YmxpYzoKLSAgICBBdWRpb1BvbGljeU1peCgpIHt9CisgICAgQXVkaW9Qb2xpY3lNaXgoY29uc3QgQXVkaW9NaXggJm1peCkgOiBBdWRpb01peChtaXgpIHt9CisgICAgQXVkaW9Qb2xpY3lNaXgoY29uc3QgQXVkaW9Qb2xpY3lNaXgmKSA9IGRlbGV0ZTsKKyAgICBBdWRpb1BvbGljeU1peCYgb3BlcmF0b3I9KGNvbnN0IEF1ZGlvUG9saWN5TWl4JikgPSBkZWxldGU7CiAKLSAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJmdldE91dHB1dCgpIGNvbnN0OworICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmZ2V0T3V0cHV0KCkgY29uc3QgeyByZXR1cm4gbU91dHB1dDsgfQorICAgIHZvaWQgc2V0T3V0cHV0KGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmb3V0cHV0KSB7IG1PdXRwdXQgPSBvdXRwdXQ7IH0KKyAgICB2b2lkIGNsZWFyT3V0cHV0KCkgeyBtT3V0cHV0LmNsZWFyKCk7IH0KIAotICAgIHZvaWQgc2V0T3V0cHV0KHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmb3V0cHV0KTsKLQotICAgIHZvaWQgY2xlYXJPdXRwdXQoKTsKLQotICAgIGFuZHJvaWQ6OkF1ZGlvTWl4ICpnZXRNaXgoKTsKLQotICAgIHZvaWQgc2V0TWl4KEF1ZGlvTWl4ICZtaXgpOwotCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdDsKIAogcHJpdmF0ZToKLSAgICBBdWRpb01peCAgICBtTWl4OyAgICAgICAgICAgICAgICAgICAvLyBBdWRpbyBwb2xpY3kgbWl4IGRlc2NyaXB0b3IKICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbU91dHB1dDsgIC8vIENvcnJlc3BvbmRpbmcgb3V0cHV0IHN0cmVhbQogfTsKIAogCi1jbGFzcyBBdWRpb1BvbGljeU1peENvbGxlY3Rpb24gOiBwdWJsaWMgRGVmYXVsdEtleWVkVmVjdG9yPFN0cmluZzgsIHNwPEF1ZGlvUG9saWN5TWl4PiA+CitjbGFzcyBBdWRpb1BvbGljeU1peENvbGxlY3Rpb24gOiBwdWJsaWMgVmVjdG9yPHNwPEF1ZGlvUG9saWN5TWl4Pj4KIHsKIHB1YmxpYzoKLSAgICBzdGF0dXNfdCBnZXRBdWRpb1BvbGljeU1peChjb25zdCBTdHJpbmc4JiBhZGRyZXNzLCBzcDxBdWRpb1BvbGljeU1peD4gJnBvbGljeU1peCkgY29uc3Q7CisgICAgc3RhdHVzX3QgZ2V0QXVkaW9Qb2xpY3lNaXgoYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsCisgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLCBzcDxBdWRpb1BvbGljeU1peD4gJnBvbGljeU1peCkgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCByZWdpc3Rlck1peChjb25zdCBTdHJpbmc4JiBhZGRyZXNzLCBBdWRpb01peCBtaXgsIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjKTsKKyAgICBzdGF0dXNfdCByZWdpc3Rlck1peChBdWRpb01peCBtaXgsIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjKTsKIAotICAgIHN0YXR1c190IHVucmVnaXN0ZXJNaXgoY29uc3QgU3RyaW5nOCYgYWRkcmVzcyk7CisgICAgc3RhdHVzX3QgdW5yZWdpc3Rlck1peChjb25zdCBBdWRpb01peCYgbWl4KTsKIAogICAgIHZvaWQgY2xvc2VPdXRwdXQoc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+ICZkZXNjKTsKIApAQCAtNjYsMjEgKzY1LDUyIEBACiAgICAgICogVHJ5IHRvIGZpbmQgYW4gb3V0cHV0IGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBhdHRyaWJ1dGVzLgogICAgICAqCiAgICAgICogQHBhcmFtW2luXSBhdHRyaWJ1dGVzIHRvIGNvbnNpZGVyIGZvd3IgdGhlIHJlc2VhcmNoIG9mIG91dHB1dCBkZXNjcmlwdG9yLgotICAgICAqIEBwYXJhbVtvdXRdIGRlc2MgdG8gcmV0dXJuIGlmIGFuIG91dHB1dCBjb3VsZCBiZSBmb3VuZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgYW4gb3V0cHV0IHdhcyBmb3VuZCBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZSAoaW4gdGhpcyBjYXNlLCB0aGUKLSAgICAgKiAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3Igb3V0cHV0IHBhcmFtIGlzIGluaXRpYWxpemVkKSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAgICogQHBhcmFtW291dF0gZGVzYyB0byByZXR1cm4gaWYgYW4gcHJpbWFyeSBvdXRwdXQgY291bGQgYmUgZm91bmQuCisgICAgICogQHBhcmFtW291dF0gc2Vjb25kYXJ5RGVzYyBvdGhlciBkZXNjIHRoYXQgdGhlIGF1ZGlvIHNob3VsZCBiZSByb3V0ZWQgdG8uCisgICAgICogQHJldHVybiBPSyBpZiB0aGUgcmVxdWVzdCBpcyB2YWxpZAorICAgICAqICAgICAgICAgb3RoZXJ3aXNlIGlmIHRoZSByZXF1ZXN0IGlzIG5vdCBzdXBwb3J0ZWQKICAgICAgKi8KLSAgICBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLCB1aWRfdCB1aWQsCi0gICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJmRlc2MpOworICAgIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzLCB1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmcHJpbWFyeURlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+ICpzZWNvbmRhcnlEZXNjcyk7CiAKLSAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVEZXZpY2VUeXBlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXggKipwb2xpY3lNaXgpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmYXZhaWxhYmxlRGV2aWNlVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+ICpwb2xpY3lNaXgpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgZ2V0SW5wdXRNaXhGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyLCBBdWRpb01peCAqKnBvbGljeU1peCk7CisgICAgLyoqCisgICAgICogQGJyaWVmIHRyeSB0byBmaW5kIGEgbWF0Y2hpbmcgbWl4IGZvciBhIGdpdmVuIG91dHB1dCBkZXNjcmlwdG9yIGFuZCByZXR1cm5zIHRoZSBhc3NvY2lhdGVkCisgICAgICogb3V0cHV0IGRldmljZS4KKyAgICAgKiBAcGFyYW0gb3V0cHV0IHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcGFyYW0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBsaXN0IG9mIG91dHB1dCBkZXZpY2VzIGN1cnJlbnRseSByZWFjaGFibGUKKyAgICAgKiBAcmV0dXJuIGRldmljZSBzZWxlY3RlZCBmcm9tIHRoZSBtaXggYXR0YWNoZWQgdG8gdGhlIG91dHB1dCwgbnVsbCBwb2ludGVyIG90aGVyd2lzZQorICAgICAqLworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZUFuZE1peEZvck91dHB1dChjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKIAotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKKyAgICBzdGF0dXNfdCBnZXRJbnB1dE1peEZvckF0dHIoYXVkaW9fYXR0cmlidXRlc190IGF0dHIsIHNwPEF1ZGlvUG9saWN5TWl4PiAqcG9saWN5TWl4KTsKKworICAgIC8qKgorICAgICAqIFVwZGF0ZXMgdGhlIG1peCBydWxlcyBpbiBvcmRlciB0byBtYWtlIHN0cmVhbXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiB1aWQKKyAgICAgKiBiZSByb3V0ZWQgdG8gdGhlIGdpdmVuIGF1ZGlvIGRldmljZXMuCisgICAgICogQHBhcmFtIHVpZCB0aGUgdWlkIGZvciB3aGljaCB0aGUgZGV2aWNlIGFmZmluaXR5IGlzIHNldAorICAgICAqIEBwYXJhbSBkZXZpY2VzIHRoZSB2ZWN0b3Igb2YgZGV2aWNlcyB0aGF0IHRoaXMgdWlkIG1heSBiZSByb3V0ZWQgdG8uIEEgdHlwaWNhbAorICAgICAqICAgIHVzZSBpcyB0byBwYXNzIHRoZSBkZXZpY2VzIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHpvbmUgaW4gYSBtdWx0aS16b25lIHNldHVwLgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIHVwZGF0ZSB3YXMgc3VjY2Vzc2Z1bCwgSU5WQUxJRF9PUEVSQVRJT04gb3RoZXJ3aXNlLgorICAgICAqICAgIEFuIGV4YW1wbGUgb2YgZmFpbHVyZSBpcyB3aGVuIHRoZXJlIGFyZSBhbHJlYWR5IHJ1bGVzIGluIHBsYWNlIHRvIHJlc3RyaWN0CisgICAgICogICAgYSBtaXggdG8gdGhlIGdpdmVuIHVpZCAoaS5lLiB3aGVuIGEgTUFUQ0hfVUlEIHJ1bGUgd2FzIHNldCBmb3IgaXQpLgorICAgICAqLworICAgIHN0YXR1c190IHNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLCBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworICAgIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKTsKKyAgICBzdGF0dXNfdCBnZXREZXZpY2VzRm9yVWlkKHVpZF90IHVpZCwgVmVjdG9yPEF1ZGlvRGV2aWNlVHlwZUFkZHI+JiBkZXZpY2VzKSBjb25zdDsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OworCitwcml2YXRlOgorICAgIGVudW0gY2xhc3MgTWl4TWF0Y2hTdGF0dXMgeyBNQVRDSCwgTk9fTUFUQ0gsIElOVkFMSURfTUlYIH07CisgICAgTWl4TWF0Y2hTdGF0dXMgbWl4TWF0Y2goY29uc3QgQXVkaW9NaXgqIG1peCwgc2l6ZV90IG1peEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcywgdWlkX3QgdWlkKTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1BvcnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlhODZkZC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiQXVkaW9Db2xsZWN0aW9ucy5oIgotI2luY2x1ZGUgIkF1ZGlvUHJvZmlsZS5oIgotI2luY2x1ZGUgIkhhbmRsZUdlbmVyYXRvci5oIgotI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIEh3TW9kdWxlOwotY2xhc3MgQXVkaW9HYWluOwotY2xhc3MgQXVkaW9Sb3V0ZTsKLXR5cGVkZWYgVmVjdG9yPHNwPEF1ZGlvR2Fpbj4gPiBBdWRpb0dhaW5Db2xsZWN0aW9uOwotCi1jbGFzcyBBdWRpb1BvcnQgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlLCBwcml2YXRlIEhhbmRsZUdlbmVyYXRvcjxhdWRpb19wb3J0X2hhbmRsZV90PgotewotcHVibGljOgotICAgIEF1ZGlvUG9ydChjb25zdCBTdHJpbmc4JiBuYW1lLCBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLCAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSkgOgotICAgICAgICBtTmFtZShuYW1lKSwgbVR5cGUodHlwZSksIG1Sb2xlKHJvbGUpLCBtRmxhZ3MoQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSkge30KLQotICAgIHZpcnR1YWwgfkF1ZGlvUG9ydCgpIHt9Ci0KLSAgICB2b2lkIHNldE5hbWUoY29uc3QgU3RyaW5nOCAmbmFtZSkgeyBtTmFtZSA9IG5hbWU7IH0KLSAgICBjb25zdCBTdHJpbmc4ICZnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KLQotICAgIGF1ZGlvX3BvcnRfdHlwZV90IGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBtVHlwZTsgfQotICAgIGF1ZGlvX3BvcnRfcm9sZV90IGdldFJvbGUoKSBjb25zdCB7IHJldHVybiBtUm9sZTsgfQotCi0gICAgdmlydHVhbCBjb25zdCBTdHJpbmc4IGdldFRhZ05hbWUoKSBjb25zdCA9IDA7Ci0KLSAgICB2b2lkIHNldEdhaW5zKGNvbnN0IEF1ZGlvR2FpbkNvbGxlY3Rpb24gJmdhaW5zKSB7IG1HYWlucyA9IGdhaW5zOyB9Ci0gICAgY29uc3QgQXVkaW9HYWluQ29sbGVjdGlvbiAmZ2V0R2FpbnMoKSBjb25zdCB7IHJldHVybiBtR2FpbnM7IH0KLQotICAgIHZpcnR1YWwgdm9pZCBzZXRGbGFncyh1aW50MzJfdCBmbGFncykKLSAgICB7Ci0gICAgICAgIC8vZm9yY2UgZGlyZWN0IGZsYWcgaWYgb2ZmbG9hZCBmbGFnIGlzIHNldDogb2ZmbG9hZGluZyBpbXBsaWVzIGEgZGlyZWN0IG91dHB1dCBzdHJlYW0KLSAgICAgICAgLy8gYW5kIGFsbCBjb21tb24gYmVoYXZpb3JzIGFyZSBkcml2ZW4gYnkgY2hlY2tpbmcgb25seSB0aGUgZGlyZWN0IGZsYWcKLSAgICAgICAgLy8gdGhpcyBzaG91bGQgbm9ybWFsbHkgYmUgc2V0IGFwcHJvcHJpYXRlbHkgaW4gdGhlIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUKLSAgICAgICAgaWYgKG1Sb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgJiYgKGZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgIT0gMCkgewotICAgICAgICAgICAgZmxhZ3MgfD0gQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUOwotICAgICAgICB9Ci0gICAgICAgIG1GbGFncyA9IGZsYWdzOwotICAgIH0KLSAgICB1aW50MzJfdCBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIG1GbGFnczsgfQotCi0gICAgdmlydHVhbCB2b2lkIGF0dGFjaChjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSk7Ci0gICAgYm9vbCBpc0F0dGFjaGVkKCkgeyByZXR1cm4gbU1vZHVsZSAhPSAwOyB9Ci0KLSAgICAvLyBBdWRpbyBwb3J0IElEcyBhcmUgaW4gYSBkaWZmZXJlbnQgbmFtZXNwYWNlIHRoYW4gQXVkaW9GbGluZ2VyIHVuaXF1ZSBJRHMKLSAgICBzdGF0aWMgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXROZXh0VW5pcXVlSWQoKTsKLQotICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgaW1wb3J0QXVkaW9Qb3J0KGNvbnN0IHNwPEF1ZGlvUG9ydD4mIHBvcnQsIGJvb2wgZm9yY2UgPSBmYWxzZSk7Ci0KLSAgICB2b2lkIGFkZEF1ZGlvUHJvZmlsZShjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlKSB7IG1Qcm9maWxlcy5hZGQocHJvZmlsZSk7IH0KLQotICAgIHZvaWQgc2V0QXVkaW9Qcm9maWxlcyhjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3IgJnByb2ZpbGVzKSB7IG1Qcm9maWxlcyA9IHByb2ZpbGVzOyB9Ci0gICAgQXVkaW9Qcm9maWxlVmVjdG9yICZnZXRBdWRpb1Byb2ZpbGVzKCkgeyByZXR1cm4gbVByb2ZpbGVzOyB9Ci0KLSAgICBib29sIGhhc1ZhbGlkQXVkaW9Qcm9maWxlKCkgY29uc3QgeyByZXR1cm4gbVByb2ZpbGVzLmhhc1ZhbGlkUHJvZmlsZSgpOyB9Ci0KLSAgICBib29sIGhhc0R5bmFtaWNBdWRpb1Byb2ZpbGUoKSBjb25zdCB7IHJldHVybiBtUHJvZmlsZXMuaGFzRHluYW1pY1Byb2ZpbGUoKTsgfQotCi0gICAgLy8gc2VhcmNoZXMgZm9yIGFuIGV4YWN0IG1hdGNoCi0gICAgdmlydHVhbCBzdGF0dXNfdCBjaGVja0V4YWN0QXVkaW9Qcm9maWxlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSBjb25zdDsKLQotICAgIC8vIHNlYXJjaGVzIGZvciBhIGNvbXBhdGlibGUgbWF0Y2gsIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBmb3IgaW5wdXQKLSAgICAvLyBwYXJhbWV0ZXJzIGFyZSBpbnB1dHxvdXRwdXQsIHJldHVybmVkIHZhbHVlIGlzIHRoZSBiZXN0IG1hdGNoLgotICAgIHN0YXR1c190IGNoZWNrQ29tcGF0aWJsZUF1ZGlvUHJvZmlsZSh1aW50MzJfdCAmc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAmY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICZmb3JtYXQpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbVByb2ZpbGVzLmNoZWNrQ29tcGF0aWJsZVByb2ZpbGUoc2FtcGxpbmdSYXRlLCBjaGFubmVsTWFzaywgZm9ybWF0LCBtVHlwZSwgbVJvbGUpOwotICAgIH0KLQotICAgIHZvaWQgY2xlYXJBdWRpb1Byb2ZpbGVzKCkgeyByZXR1cm4gbVByb2ZpbGVzLmNsZWFyUHJvZmlsZXMoKTsgfQotCi0gICAgc3RhdHVzX3QgY2hlY2tHYWluKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqZ2FpbkNvbmZpZywgaW50IGluZGV4KSBjb25zdDsKLQotICAgIHZvaWQgcGlja0F1ZGlvUHJvZmlsZSh1aW50MzJfdCAmc2FtcGxpbmdSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAmY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICZmb3JtYXQpIGNvbnN0OwotCi0gICAgc3RhdGljIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IHNQY21Gb3JtYXRDb21wYXJlVGFibGVbXTsKLQotICAgIHN0YXRpYyBpbnQgY29tcGFyZUZvcm1hdHMoYXVkaW9fZm9ybWF0X3QgZm9ybWF0MSwgYXVkaW9fZm9ybWF0X3QgZm9ybWF0Mik7Ci0KLSAgICAvLyBVc2VkIHRvIHNlbGVjdCBhbiBhdWRpbyBIQUwgb3V0cHV0IHN0cmVhbSB3aXRoIGEgc2FtcGxlIGZvcm1hdCBwcm92aWRpbmcgdGhlCi0gICAgLy8gbGVzcyBkZWdyYWRhdGlvbiBmb3IgYSBnaXZlbiBBdWRpb1RyYWNrIHNhbXBsZSBmb3JtYXQuCi0gICAgc3RhdGljIGJvb2wgaXNCZXR0ZXJGb3JtYXRNYXRjaChhdWRpb19mb3JtYXRfdCBuZXdGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgY3VycmVudEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCB0YXJnZXRGb3JtYXQpOwotCi0gICAgYXVkaW9fbW9kdWxlX2hhbmRsZV90IGdldE1vZHVsZUhhbmRsZSgpIGNvbnN0OwotICAgIHVpbnQzMl90IGdldE1vZHVsZVZlcnNpb25NYWpvcigpIGNvbnN0OwotICAgIGNvbnN0IGNoYXIgKmdldE1vZHVsZU5hbWUoKSBjb25zdDsKLQotICAgIGJvb2wgdXNlSW5wdXRDaGFubmVsTWFzaygpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gKChtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSAmJiAobVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkpIHx8Ci0gICAgICAgICAgICAgICAgKChtVHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSAmJiAobVJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspKTsKLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBpc0RpcmVjdE91dHB1dCgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gKG1UeXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpICYmIChtUm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSAmJgotICAgICAgICAgICAgICAgIChtRmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkpOwotICAgIH0KLQotICAgIHZvaWQgYWRkUm91dGUoY29uc3Qgc3A8QXVkaW9Sb3V0ZT4gJnJvdXRlKSB7IG1Sb3V0ZXMuYWRkKHJvdXRlKTsgfQotICAgIGNvbnN0IEF1ZGlvUm91dGVWZWN0b3IgJmdldFJvdXRlcygpIGNvbnN0IHsgcmV0dXJuIG1Sb3V0ZXM7IH0KLQotICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwotICAgIHZvaWQgbG9nKGNvbnN0IGNoYXIqIGluZGVudCkgY29uc3Q7Ci0KLSAgICBBdWRpb0dhaW5Db2xsZWN0aW9uIG1HYWluczsgLy8gZ2FpbiBjb250cm9sbGVycwotICAgIHNwPEh3TW9kdWxlPiBtTW9kdWxlOyAgICAgICAgICAgICAgICAgLy8gYXVkaW8gSFcgbW9kdWxlIGV4cG9zaW5nIHRoaXMgSS9PIHN0cmVhbQotCi1wcml2YXRlOgotICAgIHZvaWQgcGlja0NoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICZjaGFubmVsTWFzaywgY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcykgY29uc3Q7Ci0gICAgdm9pZCBwaWNrU2FtcGxpbmdSYXRlKHVpbnQzMl90ICZyYXRlLGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsaW5nUmF0ZXMpIGNvbnN0OwotCi0gICAgU3RyaW5nOCAgbU5hbWU7Ci0gICAgYXVkaW9fcG9ydF90eXBlX3QgbVR5cGU7Ci0gICAgYXVkaW9fcG9ydF9yb2xlX3QgbVJvbGU7Ci0gICAgdWludDMyX3QgbUZsYWdzOyAvLyBhdHRyaWJ1dGUgZmxhZ3MgbWFzayAoZS5nIHByaW1hcnkgb3V0cHV0LCBkaXJlY3Qgb3V0cHV0Li4uKS4KLSAgICBBdWRpb1Byb2ZpbGVWZWN0b3IgbVByb2ZpbGVzOyAvLyBBdWRpb1Byb2ZpbGVzIHN1cHBvcnRlZCBieSB0aGlzIHBvcnQgKGZvcm1hdCwgUmF0ZXMsIENoYW5uZWxzKQotICAgIEF1ZGlvUm91dGVWZWN0b3IgbVJvdXRlczsgLy8gUm91dGVzIGludm9sdmluZyB0aGlzIHBvcnQKLX07Ci0KLWNsYXNzIEF1ZGlvUG9ydENvbmZpZyA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICBBdWRpb1BvcnRDb25maWcoKTsKLSAgICB2aXJ0dWFsIH5BdWRpb1BvcnRDb25maWcoKSB7fQotCi0gICAgc3RhdHVzX3QgYXBwbHlBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpiYWNrdXBDb25maWcgPSBOVUxMKTsKLSAgICB2aXJ0dWFsIHZvaWQgdG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBnZXRBdWRpb1BvcnQoKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBib29sIGhhc1NhbWVId01vZHVsZUFzKGNvbnN0IHNwPEF1ZGlvUG9ydENvbmZpZz4mIG90aGVyKSBjb25zdCB7Ci0gICAgICAgIHJldHVybiAob3RoZXIgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAob3RoZXItPmdldEF1ZGlvUG9ydCgpLT5nZXRNb2R1bGVIYW5kbGUoKSA9PSBnZXRBdWRpb1BvcnQoKS0+Z2V0TW9kdWxlSGFuZGxlKCkpOwotICAgIH0KLSAgICB1aW50MzJfdCBtU2FtcGxpbmdSYXRlOwotICAgIGF1ZGlvX2Zvcm1hdF90IG1Gb3JtYXQ7Ci0gICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgbUNoYW5uZWxNYXNrOwotICAgIHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyBtR2FpbjsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Byb2ZpbGUuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Byb2ZpbGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc0MWM2Ni4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qcm9maWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAicG9saWN5LmgiCi0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotdHlwZWRlZiBTb3J0ZWRWZWN0b3I8dWludDMyX3Q+IFNhbXBsZVJhdGVWZWN0b3I7Ci10eXBlZGVmIFNvcnRlZFZlY3RvcjxhdWRpb19jaGFubmVsX21hc2tfdD4gQ2hhbm5lbHNWZWN0b3I7Ci10eXBlZGVmIFZlY3RvcjxhdWRpb19mb3JtYXRfdD4gRm9ybWF0VmVjdG9yOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmbGVmdCwgY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZyaWdodCk7Ci0KLWNsYXNzIEF1ZGlvUHJvZmlsZSA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UKLXsKLXB1YmxpYzoKLSAgICBBdWRpb1Byb2ZpbGUoYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAotICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFza3MsCi0gICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSkgOgotICAgICAgICBtTmFtZShTdHJpbmc4KCIiKSksCi0gICAgICAgIG1Gb3JtYXQoZm9ybWF0KQotICAgIHsKLSAgICAgICAgbUNoYW5uZWxNYXNrcy5hZGQoY2hhbm5lbE1hc2tzKTsKLSAgICAgICAgbVNhbXBsaW5nUmF0ZXMuYWRkKHNhbXBsaW5nUmF0ZSk7Ci0gICAgfQotCi0gICAgQXVkaW9Qcm9maWxlKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcywKLSAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxpbmdSYXRlQ29sbGVjdGlvbikgOgotICAgICAgICBtTmFtZShTdHJpbmc4KCIiKSksCi0gICAgICAgIG1Gb3JtYXQoZm9ybWF0KSwKLSAgICAgICAgbUNoYW5uZWxNYXNrcyhjaGFubmVsTWFza3MpLAotICAgICAgICBtU2FtcGxpbmdSYXRlcyhzYW1wbGluZ1JhdGVDb2xsZWN0aW9uKQotICAgIHt9Ci0KLSAgICBhdWRpb19mb3JtYXRfdCBnZXRGb3JtYXQoKSBjb25zdCB7IHJldHVybiBtRm9ybWF0OyB9Ci0KLSAgICB2b2lkIHNldENoYW5uZWxzKGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MpCi0gICAgewotICAgICAgICBpZiAobUlzRHluYW1pY0NoYW5uZWxzKSB7Ci0gICAgICAgICAgICBtQ2hhbm5lbE1hc2tzID0gY2hhbm5lbE1hc2tzOwotICAgICAgICB9Ci0gICAgfQotICAgIGNvbnN0IENoYW5uZWxzVmVjdG9yICZnZXRDaGFubmVscygpIGNvbnN0IHsgcmV0dXJuIG1DaGFubmVsTWFza3M7IH0KLQotICAgIHZvaWQgc2V0U2FtcGxlUmF0ZXMoY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxlUmF0ZXMpCi0gICAgewotICAgICAgICBpZiAobUlzRHluYW1pY1JhdGUpIHsKLSAgICAgICAgICAgIG1TYW1wbGluZ1JhdGVzID0gc2FtcGxlUmF0ZXM7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmZ2V0U2FtcGxlUmF0ZXMoKSBjb25zdCB7IHJldHVybiBtU2FtcGxpbmdSYXRlczsgfQotCi0gICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gaGFzVmFsaWRGb3JtYXQoKSAmJiBoYXNWYWxpZFJhdGVzKCkgJiYgaGFzVmFsaWRDaGFubmVscygpOyB9Ci0KLSAgICB2b2lkIGNsZWFyKCkKLSAgICB7Ci0gICAgICAgIGlmIChtSXNEeW5hbWljQ2hhbm5lbHMpIHsKLSAgICAgICAgICAgIG1DaGFubmVsTWFza3MuY2xlYXIoKTsKLSAgICAgICAgfQotICAgICAgICBpZiAobUlzRHluYW1pY1JhdGUpIHsKLSAgICAgICAgICAgIG1TYW1wbGluZ1JhdGVzLmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbmxpbmUgYm9vbCBzdXBwb3J0c0NoYW5uZWxzKGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxzKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1DaGFubmVsTWFza3MuaW5kZXhPZihjaGFubmVscykgPj0gMDsKLSAgICB9Ci0gICAgaW5saW5lIGJvb2wgc3VwcG9ydHNSYXRlKHVpbnQzMl90IHJhdGUpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbVNhbXBsaW5nUmF0ZXMuaW5kZXhPZihyYXRlKSA+PSAwOwotICAgIH0KLQotICAgIHN0YXR1c190IGNoZWNrRXhhY3QodWludDMyX3QgcmF0ZSwgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbHMsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAmdXBkYXRlZENoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHBvcnRUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlKSBjb25zdDsKLQotICAgIHN0YXR1c190IGNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZ1cGRhdGVkU2FtcGxpbmdSYXRlKSBjb25zdDsKLQotICAgIGJvb2wgaGFzVmFsaWRGb3JtYXQoKSBjb25zdCB7IHJldHVybiBtRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOyB9Ci0gICAgYm9vbCBoYXNWYWxpZFJhdGVzKCkgY29uc3QgeyByZXR1cm4gIW1TYW1wbGluZ1JhdGVzLmlzRW1wdHkoKTsgfQotICAgIGJvb2wgaGFzVmFsaWRDaGFubmVscygpIGNvbnN0IHsgcmV0dXJuICFtQ2hhbm5lbE1hc2tzLmlzRW1wdHkoKTsgfQotCi0gICAgdm9pZCBzZXREeW5hbWljQ2hhbm5lbHMoYm9vbCBkeW5hbWljKSB7IG1Jc0R5bmFtaWNDaGFubmVscyA9IGR5bmFtaWM7IH0KLSAgICBib29sIGlzRHluYW1pY0NoYW5uZWxzKCkgY29uc3QgeyByZXR1cm4gbUlzRHluYW1pY0NoYW5uZWxzOyB9Ci0KLSAgICB2b2lkIHNldER5bmFtaWNSYXRlKGJvb2wgZHluYW1pYykgeyBtSXNEeW5hbWljUmF0ZSA9IGR5bmFtaWM7IH0KLSAgICBib29sIGlzRHluYW1pY1JhdGUoKSBjb25zdCB7IHJldHVybiBtSXNEeW5hbWljUmF0ZTsgfQotCi0gICAgdm9pZCBzZXREeW5hbWljRm9ybWF0KGJvb2wgZHluYW1pYykgeyBtSXNEeW5hbWljRm9ybWF0ID0gZHluYW1pYzsgfQotICAgIGJvb2wgaXNEeW5hbWljRm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUlzRHluYW1pY0Zvcm1hdDsgfQotCi0gICAgYm9vbCBpc0R5bmFtaWMoKSB7IHJldHVybiBtSXNEeW5hbWljRm9ybWF0IHx8IG1Jc0R5bmFtaWNDaGFubmVscyB8fCBtSXNEeW5hbWljUmF0ZTsgfQotCi0gICAgdm9pZCBkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgU3RyaW5nOCAgbU5hbWU7Ci0gICAgYXVkaW9fZm9ybWF0X3QgbUZvcm1hdDsKLSAgICBDaGFubmVsc1ZlY3RvciBtQ2hhbm5lbE1hc2tzOwotICAgIFNhbXBsZVJhdGVWZWN0b3IgbVNhbXBsaW5nUmF0ZXM7Ci0KLSAgICBib29sIG1Jc0R5bmFtaWNGb3JtYXQgPSBmYWxzZTsKLSAgICBib29sIG1Jc0R5bmFtaWNDaGFubmVscyA9IGZhbHNlOwotICAgIGJvb2wgbUlzRHluYW1pY1JhdGUgPSBmYWxzZTsKLX07Ci0KLQotY2xhc3MgQXVkaW9Qcm9maWxlVmVjdG9yIDogcHVibGljIFZlY3RvcjxzcDxBdWRpb1Byb2ZpbGU+ID4KLXsKLXB1YmxpYzoKLSAgICBzc2l6ZV90IGFkZChjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlKQotICAgIHsKLSAgICAgICAgc3NpemVfdCBpbmRleCA9IFZlY3Rvcjo6YWRkKHByb2ZpbGUpOwotICAgICAgICAvLyB3ZSBzb3J0IGZyb20gd29yc3QgdG8gYmVzdCwgc28gdGhhdCBBVURJT19GT1JNQVRfREVGQVVMVCBpcyBhbHdheXMgdGhlIGZpcnN0IGVudHJ5LgotICAgICAgICAvLyBUT0RPOiBjb21wYXJlRm9ybWF0cyBjb3VsZCBiZSBhIGxhbWJkYSB0byBjb252ZXJ0IGJldHdlZW4gcG9pbnRlci10by1mb3JtYXQgdG8gZm9ybWF0OgotICAgICAgICAvLyBbXShjb25zdCBhdWRpb19mb3JtYXRfdCAqZm9ybWF0MSwgY29uc3QgYXVkaW9fZm9ybWF0X3QgKmZvcm1hdDIpIHsKLSAgICAgICAgLy8gICAgIHJldHVybiBjb21wYXJlRm9ybWF0cygqZm9ybWF0MSwgKmZvcm1hdDIpOwotICAgICAgICAvLyB9Ci0gICAgICAgIHNvcnQoY29tcGFyZUZvcm1hdHMpOwotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBBUEkgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBieSB0aGUgcG9saWN5IG1hbmFnZXIgb25jZSByZXRyaWV2aW5nIGNhcGFiaWxpdGllcwotICAgIC8vIGZvciBhIHByb2ZpbGUgd2l0aCBkeW5hbWljIGZvcm1hdCwgcmF0ZSBhbmQgY2hhbm5lbHMgYXR0cmlidXRlcwotICAgIHNzaXplX3QgYWRkUHJvZmlsZUZyb21IYWwoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZVRvQWRkKQotICAgIHsKLSAgICAgICAgLy8gQ2hlY2sgdmFsaWQgcHJvZmlsZSB0byBhZGQ6Ci0gICAgICAgIGlmICghcHJvZmlsZVRvQWRkLT5oYXNWYWxpZEZvcm1hdCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkQ2hhbm5lbHMoKSAmJiAhcHJvZmlsZVRvQWRkLT5oYXNWYWxpZFJhdGVzKCkpIHsKLSAgICAgICAgICAgIEZvcm1hdFZlY3RvciBmb3JtYXRzOwotICAgICAgICAgICAgZm9ybWF0cy5hZGQocHJvZmlsZVRvQWRkLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICBzZXRGb3JtYXRzKEZvcm1hdFZlY3Rvcihmb3JtYXRzKSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgICAgICBpZiAoIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmIHByb2ZpbGVUb0FkZC0+aGFzVmFsaWRSYXRlcygpKSB7Ci0gICAgICAgICAgICBzZXRTYW1wbGVSYXRlc0Zvcihwcm9maWxlVG9BZGQtPmdldFNhbXBsZVJhdGVzKCksIHByb2ZpbGVUb0FkZC0+Z2V0Rm9ybWF0KCkpOwotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmICFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkUmF0ZXMoKSkgewotICAgICAgICAgICAgc2V0Q2hhbm5lbHNGb3IocHJvZmlsZVRvQWRkLT5nZXRDaGFubmVscygpLCBwcm9maWxlVG9BZGQtPmdldEZvcm1hdCgpKTsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIC8vIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgcHJvZmlsZSB0byBhdm9pZCBkdXBsaWNhdGVzCi0gICAgICAgIGZvciAoc2l6ZV90IHByb2ZpbGVJbmRleCA9IDA7IHByb2ZpbGVJbmRleCA8IHNpemUoKTsgcHJvZmlsZUluZGV4KyspIHsKLSAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUgPSBpdGVtQXQocHJvZmlsZUluZGV4KTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5pc1ZhbGlkKCkgJiYgcHJvZmlsZSA9PSBwcm9maWxlVG9BZGQpIHsKLSAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRvCi0gICAgICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGVJbmRleDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7IC8vIHNldCB0aGUgZm9ybWF0IGFzIGR5bmFtaWMgdG8gYWxsb3cgcmVtb3ZhbAotICAgICAgICByZXR1cm4gYWRkKHByb2ZpbGVUb0FkZCk7Ci0gICAgfQotCi0gICAgc3A8QXVkaW9Qcm9maWxlPiBnZXRGaXJzdFZhbGlkUHJvZmlsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5pc1ZhbGlkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gaXRlbUF0KGkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGJvb2wgaGFzVmFsaWRQcm9maWxlKCkgY29uc3QgeyByZXR1cm4gZ2V0Rmlyc3RWYWxpZFByb2ZpbGUoKSAhPSAwOyB9Ci0KLSAgICBzdGF0dXNfdCBjaGVja0V4YWN0UHJvZmlsZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3Q7Ci0KLSAgICBzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVQcm9maWxlKHVpbnQzMl90ICZzYW1wbGluZ1JhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190ICZjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICZmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCBwb3J0VHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlKSBjb25zdDsKLQotICAgIEZvcm1hdFZlY3RvciBnZXRTdXBwb3J0ZWRGb3JtYXRzKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIEZvcm1hdFZlY3RvciBzdXBwb3J0ZWRGb3JtYXRzOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5oYXNWYWxpZEZvcm1hdCgpKSB7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydGVkRm9ybWF0cy5hZGQoaXRlbUF0KGkpLT5nZXRGb3JtYXQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cHBvcnRlZEZvcm1hdHM7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNEeW5hbWljUHJvZmlsZSgpIGNvbnN0Ci0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoaXRlbUF0KGkpLT5pc0R5bmFtaWMoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBib29sIGhhc0R5bmFtaWNGb3JtYXQoKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldFByb2ZpbGVGb3IoZ0R5bmFtaWNGb3JtYXQpICE9IDA7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNEeW5hbWljQ2hhbm5lbHNGb3IoYXVkaW9fZm9ybWF0X3QgZm9ybWF0KSBjb25zdAotICAgIHsKLSAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKLSAgICAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNDaGFubmVscygpKSB7Ci0gICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgfQotICAgICAgIH0KLSAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgYm9vbCBoYXNEeW5hbWljUmF0ZUZvcihhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Ci0gICAgewotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBpdGVtQXQoaSk7Ci0gICAgICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY1JhdGUoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBPbmUgYXVkaW8gcHJvZmlsZSB3aWxsIGJlIGFkZGVkIGZvciBlYWNoIGZvcm1hdCBzdXBwb3J0ZWQgYnkgQXVkaW8gSEFMCi0gICAgdm9pZCBzZXRGb3JtYXRzKGNvbnN0IEZvcm1hdFZlY3RvciAmZm9ybWF0cykKLSAgICB7Ci0gICAgICAgIC8vIE9ubHkgYWxsb3cgdG8gY2hhbmdlIHRoZSBmb3JtYXQgb2YgZHluYW1pYyBwcm9maWxlCi0gICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gZHluYW1pY0Zvcm1hdFByb2ZpbGUgPSBnZXRQcm9maWxlRm9yKGdEeW5hbWljRm9ybWF0KTsKLSAgICAgICAgaWYgKGR5bmFtaWNGb3JtYXRQcm9maWxlID09IDApIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0c1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmdldENoYW5uZWxzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR5bmFtaWNGb3JtYXRQcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpKTsKLSAgICAgICAgICAgIHByb2ZpbGUtPnNldER5bmFtaWNGb3JtYXQodHJ1ZSk7Ci0gICAgICAgICAgICBwcm9maWxlLT5zZXREeW5hbWljQ2hhbm5lbHMoZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmlzRHluYW1pY0NoYW5uZWxzKCkpOwotICAgICAgICAgICAgcHJvZmlsZS0+c2V0RHluYW1pY1JhdGUoZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmlzRHluYW1pY1JhdGUoKSk7Ci0gICAgICAgICAgICBhZGQocHJvZmlsZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGNsZWFyUHJvZmlsZXMoKQotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IHNpemUoKTsgaSAhPSAwOyApIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdCgtLWkpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmlzRHluYW1pY0Zvcm1hdCgpICYmIHByb2ZpbGUtPmhhc1ZhbGlkRm9ybWF0KCkpIHsKLSAgICAgICAgICAgICAgICByZW1vdmVBdChpKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHByb2ZpbGUtPmNsZWFyKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAotICAgIHsKLSAgICAgICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gUHJvZmlsZXM6XG4iLCBzcGFjZXMsICIiKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNQcm9maWxlICV6dToiLCBzcGFjZXMgKyA0LCAiIiwgaSk7Ci0gICAgICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgICAgICBpdGVtQXQoaSktPmR1bXAoZmQsIHNwYWNlcyArIDgpOwotICAgICAgICB9Ci0gICAgfQotCi1wcml2YXRlOgotICAgIHZvaWQgc2V0U2FtcGxlUmF0ZXNGb3IoY29uc3QgU2FtcGxlUmF0ZVZlY3RvciAmc2FtcGxlUmF0ZXMsIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBmb3JtYXQgJiYgcHJvZmlsZS0+aXNEeW5hbWljUmF0ZSgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmhhc1ZhbGlkUmF0ZXMoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNyZWF0ZSBhIG5ldyBwcm9maWxlIHdpdGggc2FtZSBmb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdCwgcHJvZmlsZS0+Z2V0Q2hhbm5lbHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsZVJhdGVzKTsKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOyAvLyBuZWVkIHRvIHNldCB0byBhbGxvdyBjbGVhbmluZwotICAgICAgICAgICAgICAgICAgICBhZGQocHJvZmlsZVRvQWRkKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5zZXRTYW1wbGVSYXRlcyhzYW1wbGVSYXRlcyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLQotICAgIHZvaWQgc2V0Q2hhbm5lbHNGb3IoY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxNYXNrcywgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQotICAgIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlID0gaXRlbUF0KGkpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNDaGFubmVscygpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmhhc1ZhbGlkQ2hhbm5lbHMoKSkgewotICAgICAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNyZWF0ZSBhIG5ldyBwcm9maWxlIHdpdGggc2FtZSBmb3JtYXQKLSAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBwcm9maWxlVG9BZGQgPSBuZXcgQXVkaW9Qcm9maWxlKGZvcm1hdCwgY2hhbm5lbE1hc2tzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsgLy8gbmVlZCB0byBzZXQgdG8gYWxsb3cgY2xlYW5pbmcKLSAgICAgICAgICAgICAgICAgICAgYWRkKHByb2ZpbGVUb0FkZCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+c2V0Q2hhbm5lbHMoY2hhbm5lbE1hc2tzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgc3A8QXVkaW9Qcm9maWxlPiBnZXRQcm9maWxlRm9yKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPmdldEZvcm1hdCgpID09IGZvcm1hdCkgewotICAgICAgICAgICAgICAgIHJldHVybiBpdGVtQXQoaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgc3RhdGljIGludCBjb21wYXJlRm9ybWF0cyhjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICpwcm9maWxlMSwgY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAqcHJvZmlsZTIpOwotfTsKLQotYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQXVkaW9Qcm9maWxlICZsZWZ0LCBjb25zdCBBdWRpb1Byb2ZpbGUgJnJpZ2h0KTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUHJvZmlsZVZlY3RvckhlbHBlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUHJvZmlsZVZlY3RvckhlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NGJkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Qcm9maWxlVmVjdG9ySGVscGVyLmgKQEAgLTAsMCArMSw2NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qcm9maWxlLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordm9pZCBzb3J0QXVkaW9Qcm9maWxlcyhBdWRpb1Byb2ZpbGVWZWN0b3IgJmF1ZGlvUHJvZmlsZVZlY3Rvcik7CisKK3NzaXplX3QgYWRkQXVkaW9Qcm9maWxlQW5kU29ydChBdWRpb1Byb2ZpbGVWZWN0b3IgJmF1ZGlvUHJvZmlsZVZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlKTsKKworLy8gT25lIGF1ZGlvIHByb2ZpbGUgd2lsbCBiZSBhZGRlZCBmb3IgZWFjaCBmb3JtYXQgc3VwcG9ydGVkIGJ5IEF1ZGlvIEhBTAordm9pZCBhZGRQcm9maWxlc0ZvckZvcm1hdHMoQXVkaW9Qcm9maWxlVmVjdG9yICZhdWRpb1Byb2ZpbGVWZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXRWZWN0b3IgJmZvcm1hdFZlY3Rvcik7CisKKy8vIFRoaXMgQVBJIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYnkgdGhlIHBvbGljeSBtYW5hZ2VyIG9uY2UgcmV0cmlldmluZyBjYXBhYmlsaXRpZXMKKy8vIGZvciBhIHByb2ZpbGUgd2l0aCBkeW5hbWljIGZvcm1hdCwgcmF0ZSBhbmQgY2hhbm5lbHMgYXR0cmlidXRlcwordm9pZCBhZGREeW5hbWljQXVkaW9Qcm9maWxlQW5kU29ydChBdWRpb1Byb2ZpbGVWZWN0b3IgJmF1ZGlvUHJvZmlsZVZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZVRvQWRkKTsKKwordm9pZCBhcHBlbmRBdWRpb1Byb2ZpbGVzKEF1ZGlvUHJvZmlsZVZlY3RvciAmYXVkaW9Qcm9maWxlVmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciAmYXVkaW9Qcm9maWxlVmVjdG9yVG9BcHBlbmQpOworCitzdGF0dXNfdCBjaGVja0V4YWN0UHJvZmlsZShjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3IgJmF1ZGlvUHJvZmlsZVZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KTsKKworc3RhdHVzX3QgY2hlY2tDb21wYXRpYmxlUHJvZmlsZShjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3IgJmF1ZGlvUHJvZmlsZVZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJnNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgJmNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAmZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCBwb3J0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3QgcG9ydFJvbGUpOworCisvLyBBc3N1bWluZyB0aGF0IHRoaXMgcHJvZmlsZSB2ZWN0b3IgY29udGFpbnMgaW5wdXQgcHJvZmlsZXMsCisvLyBmaW5kIHRoZSBiZXN0IG1hdGNoaW5nIGNvbmZpZyBmcm9tICdvdXRwdXRQcm9maWxlcycsIGFjY29yZGluZyB0bworLy8gdGhlIGdpdmVuIHByZWZlcmVuY2VzIGZvciBhdWRpbyBmb3JtYXRzIGFuZCBjaGFubmVsIG1hc2tzLgorLy8gTm90ZTogc3RkOjp2ZWN0b3JzIGFyZSB1c2VkIGJlY2F1c2Ugc3BlY2lhbGl6ZWQgY29udGFpbmVycyBmb3IgZm9ybWF0cworLy8gICAgICAgYW5kIGNoYW5uZWxzIGNhbiBiZSBzb3J0ZWQgYW5kIHVzZSB0aGVpciBvd24gb3JkZXJpbmcuCitzdGF0dXNfdCBmaW5kQmVzdE1hdGNoaW5nT3V0cHV0Q29uZmlnKAorICAgICAgICBjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3IgJmF1ZGlvUHJvZmlsZVZlY3RvciwKKyAgICAgICAgY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yICZvdXRwdXRQcm9maWxlVmVjdG9yLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gJnByZWZlcnJlZEZvcm1hdFZlY3RvciwgLy8gb3JkZXI6IG1vc3QgcHJlZiAtPiBsZWFzdCBwcmVmCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiAmcHJlZmVycmVkT3V0cHV0Q2hhbm5lbFZlY3RvciwKKyAgICAgICAgYm9vbCBwcmVmZXJIaWdoZXJTYW1wbGluZ1JhdGVzLAorICAgICAgICBhdWRpb19jb25maWdfYmFzZSAmYmVzdE91dHB1dENvbmZpZyk7CisKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1JvdXRlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Sb3V0ZS5oCmluZGV4IDZiMjRmZGUuLmE3ZGVmM2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1JvdXRlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvUm91dGUuaApAQCAtMjUsNyArMjUsNyBAQAogbmFtZXNwYWNlIGFuZHJvaWQKIHsKIAotY2xhc3MgQXVkaW9Qb3J0OworY2xhc3MgUG9saWN5QXVkaW9Qb3J0OwogY2xhc3MgRGV2aWNlRGVzY3JpcHRvcjsKIAogdHlwZWRlZiBlbnVtIHsKQEAgLTM4LDE5ICszOCwzMyBAQAogcHVibGljOgogICAgIGV4cGxpY2l0IEF1ZGlvUm91dGUoYXVkaW9fcm91dGVfdHlwZV90IHR5cGUpIDogbVR5cGUodHlwZSkge30KIAotICAgIHZvaWQgc2V0U291cmNlcyhjb25zdCBBdWRpb1BvcnRWZWN0b3IgJnNvdXJjZXMpIHsgbVNvdXJjZXMgPSBzb3VyY2VzOyB9Ci0gICAgY29uc3QgQXVkaW9Qb3J0VmVjdG9yICZnZXRTb3VyY2VzKCkgY29uc3QgeyByZXR1cm4gbVNvdXJjZXM7IH0KKyAgICB2b2lkIHNldFNvdXJjZXMoY29uc3QgUG9saWN5QXVkaW9Qb3J0VmVjdG9yICZzb3VyY2VzKSB7IG1Tb3VyY2VzID0gc291cmNlczsgfQorICAgIGNvbnN0IFBvbGljeUF1ZGlvUG9ydFZlY3RvciAmZ2V0U291cmNlcygpIGNvbnN0IHsgcmV0dXJuIG1Tb3VyY2VzOyB9CiAKLSAgICB2b2lkIHNldFNpbmsoY29uc3Qgc3A8QXVkaW9Qb3J0PiAmc2luaykgeyBtU2luayA9IHNpbms7IH0KLSAgICBjb25zdCBzcDxBdWRpb1BvcnQ+ICZnZXRTaW5rKCkgY29uc3QgeyByZXR1cm4gbVNpbms7IH0KKyAgICB2b2lkIHNldFNpbmsoY29uc3Qgc3A8UG9saWN5QXVkaW9Qb3J0PiAmc2luaykgeyBtU2luayA9IHNpbms7IH0KKyAgICBjb25zdCBzcDxQb2xpY3lBdWRpb1BvcnQ+ICZnZXRTaW5rKCkgY29uc3QgeyByZXR1cm4gbVNpbms7IH0KIAogICAgIGF1ZGlvX3JvdXRlX3R5cGVfdCBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gbVR5cGU7IH0KIAotICAgIHZvaWQgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0OworICAgIC8qKgorICAgICAqIEBicmllZiBzdXBwb3J0c1BhdGNoIGNoZWNrcyBpZiBhbiBhdWRpbyBwYXRjaCBpcyBzdXBwb3J0ZWQgYnkgYSBSb3V0ZSBkZWNsYXJlZCBpbgorICAgICAqIHRoZSBhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgZmlsZS4KKyAgICAgKiBJZiB0aGUgcGF0Y2ggaXMgc3VwcG9ydGVkIG5hdGl2ZWx5IGJ5IGFuIEF1ZGlvSEFMICh3aGljaCBzdXBwb3J0cyBvZiBjb3Vyc2UgUm91dGluZyBBUEkgMy4wKSwKKyAgICAgKiBhdWRpb3BvbGljeSB3aWxsIG5vdCByZXF1ZXN0IEF1ZGlvRmxpbmdlciB0byB1c2UgYSBzb2Z0d2FyZSBicmlkZ2UgdG8gcmVhbGl6ZSBhIHBhdGNoCisgICAgICogYmV0d2VlbiAyIHBvcnRzLgorICAgICAqIEBwYXJhbSBzcmNQb3J0IChha2EgdGhlIHNvdXJjZSkgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEBwYXJhbSBkc3RQb3J0IChha2EgdGhlIHNpbmspIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGF1ZGlvIHJvdXRlIHN1cHBvcnRzIHRoZSBjb25uZWN0aW9uIGJldHdlZW4gdGhlIHNpbmsgYW5kIHRoZSBzb3VyY2UsCisgICAgICogZmFsc2Ugb3RoZXJ3aXNlCisgICAgICovCisgICAgYm9vbCBzdXBwb3J0c1BhdGNoKGNvbnN0IHNwPFBvbGljeUF1ZGlvUG9ydD4gJnNyY1BvcnQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFBvbGljeUF1ZGlvUG9ydD4gJmRzdFBvcnQpIGNvbnN0OworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgQXVkaW9Qb3J0VmVjdG9yIG1Tb3VyY2VzOwotICAgIHNwPEF1ZGlvUG9ydD4gbVNpbms7CisgICAgUG9saWN5QXVkaW9Qb3J0VmVjdG9yIG1Tb3VyY2VzOworICAgIHNwPFBvbGljeUF1ZGlvUG9ydD4gbVNpbms7CiAgICAgYXVkaW9fcm91dGVfdHlwZV90IG1UeXBlOwogCiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDUyNDdkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDEwOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgotI2luY2x1ZGUgPG1lZGlhL0lBdWRpb1BvbGljeVNlcnZpY2VDbGllbnQuaD4KLSNpbmNsdWRlICJBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1jbGFzcyBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZTsKLQotY2xhc3MgQXVkaW9TZXNzaW9uIDogcHVibGljIFJlZkJhc2UsIHB1YmxpYyBBdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIKLXsKLXB1YmxpYzoKLSAgICBBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsZVJhdGUsCi0gICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgIGJvb2wgaXNTb3VuZFRyaWdnZXIsCi0gICAgICAgICAgICAgICAgIEF1ZGlvTWl4KiBwb2xpY3lNaXgsCi0gICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpOwotCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3Q7Ci0KLSAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbigpIGNvbnN0IHsgcmV0dXJuIG1SZWNvcmRDbGllbnRJbmZvLnNlc3Npb247IH0KLSAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSgpY29uc3QgeyByZXR1cm4gbVJlY29yZENsaWVudEluZm8uc291cmNlOyB9Ci0gICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZy5mb3JtYXQ7IH0KLSAgICB1aW50MzJfdCBzYW1wbGVSYXRlKCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZy5zYW1wbGVfcmF0ZTsgfQotICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrKCkgY29uc3QgeyByZXR1cm4gbUNvbmZpZy5jaGFubmVsX21hc2s7IH0KLSAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9Ci0gICAgdWlkX3QgdWlkKCkgY29uc3QgeyByZXR1cm4gbVJlY29yZENsaWVudEluZm8udWlkOyB9Ci0gICAgdm9pZCBzZXRVaWQodWlkX3QgdWlkKSB7IG1SZWNvcmRDbGllbnRJbmZvLnVpZCA9IHVpZDsgfQotICAgIGJvb2wgbWF0Y2hlcyhjb25zdCBzcDxBdWRpb1Nlc3Npb24+ICZvdGhlcikgY29uc3Q7Ci0gICAgYm9vbCBpc1NvdW5kVHJpZ2dlcigpIGNvbnN0IHsgcmV0dXJuIG1Jc1NvdW5kVHJpZ2dlcjsgfQotICAgIHZvaWQgc2V0U2lsZW5jZWQoYm9vbCBzaWxlbmNlZCkgeyBtU2lsZW5jZWQgPSBzaWxlbmNlZDsgfQotICAgIGJvb2wgaXNTaWxlbmNlZCgpIGNvbnN0IHsgcmV0dXJuIG1TaWxlbmNlZDsgfQotICAgIHVpbnQzMl90IG9wZW5Db3VudCgpIGNvbnN0IHsgcmV0dXJuIG1PcGVuQ291bnQ7IH0gOwotICAgIHVpbnQzMl90IGFjdGl2ZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZUNvdW50OyB9IDsKLQotICAgIHVpbnQzMl90IGNoYW5nZU9wZW5Db3VudChpbnQgZGVsdGEpOwotICAgIHVpbnQzMl90IGNoYW5nZUFjdGl2ZUNvdW50KGludCBkZWx0YSk7Ci0KLSAgICB2b2lkIHNldEluZm9Qcm92aWRlcihBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIgKnByb3ZpZGVyKTsKLSAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBBdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIKLSAgICB2aXJ0dWFsIHZvaWQgb25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIHJlY29yZF9jbGllbnRfaW5mb190IG1SZWNvcmRDbGllbnRJbmZvOwotICAgIGNvbnN0IHN0cnVjdCBhdWRpb19jb25maWdfYmFzZSBtQ29uZmlnOwotICAgIGNvbnN0IGF1ZGlvX2lucHV0X2ZsYWdzX3QgbUZsYWdzOwotICAgIGJvb2wgIG1Jc1NvdW5kVHJpZ2dlcjsKLSAgICBib29sIG1TaWxlbmNlZDsKLSAgICB1aW50MzJfdCAgbU9wZW5Db3VudDsKLSAgICB1aW50MzJfdCAgbUFjdGl2ZUNvdW50OwotICAgIEF1ZGlvTWl4KiBtUG9saWN5TWl4OyAvLyBub24gTlVMTCB3aGVuIHVzZWQgYnkgYSBkeW5hbWljIHBvbGljeQotICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlKiBtQ2xpZW50SW50ZXJmYWNlOwotICAgIGNvbnN0IEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciogbUluZm9Qcm92aWRlcjsKLX07Ci0KLWNsYXNzIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gOgotICAgIHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90LCBzcDxBdWRpb1Nlc3Npb24+ID4sCi0gICAgcHVibGljIEF1ZGlvU2Vzc2lvbkluZm9VcGRhdGVMaXN0ZW5lcgotewotcHVibGljOgotICAgIHN0YXR1c190IGFkZFNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4mIGF1ZGlvU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyICpwcm92aWRlcik7Ci0KLSAgICBzdGF0dXNfdCByZW1vdmVTZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLQotICAgIHVpbnQzMl90IGdldE9wZW5Db3VudCgpIGNvbnN0OwotCi0gICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBnZXRBY3RpdmVTZXNzaW9ucygpIGNvbnN0OwotICAgIHNpemVfdCBnZXRBY3RpdmVTZXNzaW9uQ291bnQoKSBjb25zdDsKLSAgICBib29sIGhhc0FjdGl2ZVNlc3Npb24oKSBjb25zdDsKLSAgICBib29sIGlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3Q7Ci0gICAgYXVkaW9fc291cmNlX3QgZ2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGJvb2wgYWN0aXZlT25seSkgY29uc3Q7Ci0KLSAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBBdWRpb1Nlc3Npb25JbmZvVXBkYXRlTGlzdGVuZXIKLSAgICB2aXJ0dWFsIHZvaWQgb25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0OwotCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGludCBzcGFjZXMpIGNvbnN0OwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDAzN2ZjLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9BdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vKioKLSAqIEludGVyZmFjZSBmb3IgaW5wdXQgZGVzY3JpcHRvcnMgdG8gaW1wbGVtZW50IHNvIGRlcGVuZGVudCBhdWRpbyBzZXNzaW9ucyBjYW4gcXVlcnkgaW5mb3JtYXRpb24KLSAqIGFib3V0IHRoZWlyIGNvbnRleHQKLSAqLwotY2xhc3MgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+QXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyKCkge307Ci0KLSAgICB2aXJ0dWFsIGF1ZGlvX2NvbmZpZ19iYXNlX3QgZ2V0Q29uZmlnKCkgY29uc3QgPSAwOwotCi0gICAgdmlydHVhbCBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRQYXRjaEhhbmRsZSgpIGNvbnN0ID0gMDsKLQotfTsKLQotY2xhc3MgQXVkaW9TZXNzaW9uSW5mb1VwZGF0ZUxpc3RlbmVyCi17Ci1wdWJsaWM6Ci0gICAgdmlydHVhbCB+QXVkaW9TZXNzaW9uSW5mb1VwZGF0ZUxpc3RlbmVyKCkge307Ci0KLSAgICB2aXJ0dWFsIHZvaWQgb25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0ID0gMDs7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkOTBmNDIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0F1ZGlvU291cmNlRGVzY3JpcHRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+Ci0jaW5jbHVkZSA8QXVkaW9QYXRjaC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOwotY2xhc3MgSHdBdWRpb091dHB1dERlc2NyaXB0b3I7Ci1jbGFzcyBEZXZpY2VEZXNjcmlwdG9yOwotCi1jbGFzcyBBdWRpb1NvdXJjZURlc2NyaXB0b3I6IHB1YmxpYyBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgQXVkaW9Tb3VyY2VEZXNjcmlwdG9yKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSwgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpIDoKLSAgICAgICAgbURldmljZShkZXZpY2UpLCBtQXR0cmlidXRlcygqYXR0cmlidXRlcyksIG1VaWQodWlkKSB7fQotICAgIHZpcnR1YWwgfkF1ZGlvU291cmNlRGVzY3JpcHRvcigpIHt9Ci0KLSAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBnZXRIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtUGF0Y2hEZXNjLT5tSGFuZGxlOyB9Ci0KLSAgICBzdGF0dXNfdCAgICBkdW1wKGludCBmZCk7Ci0KLSAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtRGV2aWNlOwotICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBtQXR0cmlidXRlczsKLSAgICB1aWRfdCBtVWlkOwotICAgIHNwPEF1ZGlvUGF0Y2g+IG1QYXRjaERlc2M7Ci0gICAgd3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG1Td091dHB1dDsKLSAgICB3cDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbUh3T3V0cHV0OwotfTsKLQotY2xhc3MgQXVkaW9Tb3VyY2VDb2xsZWN0aW9uIDoKLSAgICAgICAgcHVibGljIERlZmF1bHRLZXllZFZlY3RvcjwgYXVkaW9fcGF0Y2hfaGFuZGxlX3QsIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gPgotewotcHVibGljOgotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBjb25zdDsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9DbGllbnREZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ2xpZW50RGVzY3JpcHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjNWQxZDAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvQ2xpZW50RGVzY3JpcHRvci5oCkBAIC0wLDAgKzEsMzA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8YXVkaW9tYW5hZ2VyL0F1ZGlvTWFuYWdlci5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUHJvZHVjdFN0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHBvbGljeS5oPgorI2luY2x1ZGUgPFZvbHVtZS5oPgorI2luY2x1ZGUgIkF1ZGlvUGF0Y2guaCIKKyNpbmNsdWRlICJFZmZlY3REZXNjcmlwdG9yLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgRGV2aWNlRGVzY3JpcHRvcjsKK2NsYXNzIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOworY2xhc3MgU3dBdWRpb091dHB1dERlc2NyaXB0b3I7CisKK2NsYXNzIENsaWVudERlc2NyaXB0b3I6IHB1YmxpYyBSZWZCYXNlCit7CitwdWJsaWM6CisgICAgQ2xpZW50RGVzY3JpcHRvcihhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgdWlkX3QgdWlkLCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwcmVmZXJyZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNQcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UgPSBmYWxzZSkgOgorICAgICAgICBtUG9ydElkKHBvcnRJZCksIG1VaWQodWlkKSwgbVNlc3Npb25JZChzZXNzaW9uSWQpLCBtQXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwKKyAgICAgICAgbUNvbmZpZyhjb25maWcpLCBtUHJlZmVycmVkRGV2aWNlSWQocHJlZmVycmVkRGV2aWNlSWQpLCBtQWN0aXZlKGZhbHNlKSwKKyAgICAgICAgbVByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZShpc1ByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZSl7fQorICAgIH5DbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0OworICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgdG9TaG9ydFN0cmluZygpIGNvbnN0OworCisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQoKSBjb25zdCB7IHJldHVybiBtUG9ydElkOyB9CisgICAgdWlkX3QgdWlkKCkgY29uc3QgeyByZXR1cm4gbVVpZDsgfQorICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gbVNlc3Npb25JZDsgfTsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIG1BdHRyaWJ1dGVzOyB9CisgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcoKSBjb25zdCB7IHJldHVybiBtQ29uZmlnOyB9CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwcmVmZXJyZWREZXZpY2VJZCgpIGNvbnN0IHsgcmV0dXJuIG1QcmVmZXJyZWREZXZpY2VJZDsgfTsKKyAgICB2b2lkIHNldFByZWZlcnJlZERldmljZUlkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcHJlZmVycmVkRGV2aWNlSWQpIHsKKyAgICAgICAgbVByZWZlcnJlZERldmljZUlkID0gcHJlZmVycmVkRGV2aWNlSWQ7CisgICAgfQorICAgIGJvb2wgaXNQcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UoKSBjb25zdCB7IHJldHVybiBtUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlOyB9CisgICAgdmlydHVhbCB2b2lkIHNldEFjdGl2ZShib29sIGFjdGl2ZSkgeyBtQWN0aXZlID0gYWN0aXZlOyB9CisgICAgYm9vbCBhY3RpdmUoKSBjb25zdCB7IHJldHVybiBtQWN0aXZlOyB9CisgICAgYm9vbCBoYXNQcmVmZXJyZWREZXZpY2UoYm9vbCBhY3RpdmVPbmx5ID0gZmFsc2UpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1QcmVmZXJyZWREZXZpY2VJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FICYmICghYWN0aXZlT25seSB8fCBtQWN0aXZlKTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUG9ydElkOyAgLy8gdW5pcXVlIElkIGZvciB0aGlzIGNsaWVudAorICAgIGNvbnN0IHVpZF90IG1VaWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFVJRAorICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbklkOyAgICAgICAvLyBhdWRpbyBzZXNzaW9uIElECisgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IG1BdHRyaWJ1dGVzOyAvLyB1c2FnZS4uLgorICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgbUNvbmZpZzsKKyAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90IG1QcmVmZXJyZWREZXZpY2VJZDsgIC8vIHNlbGVjdGVkIGlucHV0IGRldmljZSBwb3J0IElECisgICAgICAgICAgYm9vbCBtQWN0aXZlOworICAgICAgICAgIGJvb2wgbVByZWZlcnJlZERldmljZUZvckV4Y2x1c2l2ZVVzZSA9IGZhbHNlOworfTsKKworY2xhc3MgVHJhY2tDbGllbnREZXNjcmlwdG9yOiBwdWJsaWMgQ2xpZW50RGVzY3JpcHRvcgoreworcHVibGljOgorICAgIFRyYWNrQ2xpZW50RGVzY3JpcHRvcihhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgdWlkX3QgdWlkLCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcHJlZmVycmVkRGV2aWNlSWQsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx3cDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+IHNlY29uZGFyeU91dHB1dHMpIDoKKyAgICAgICAgQ2xpZW50RGVzY3JpcHRvcihwb3J0SWQsIHVpZCwgc2Vzc2lvbklkLCBhdHRyaWJ1dGVzLCBjb25maWcsIHByZWZlcnJlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlKSwKKyAgICAgICAgbVN0cmVhbShzdHJlYW0pLCBtU3RyYXRlZ3koc3RyYXRlZ3kpLCBtVm9sdW1lU291cmNlKHZvbHVtZVNvdXJjZSksIG1GbGFncyhmbGFncyksCisgICAgICAgIG1TZWNvbmRhcnlPdXRwdXRzKHN0ZDo6bW92ZShzZWNvbmRhcnlPdXRwdXRzKSkge30KKyAgICB+VHJhY2tDbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdXNpbmcgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0IG92ZXJyaWRlOworICAgIHN0ZDo6c3RyaW5nIHRvU2hvcnRTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKworICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKCkgY29uc3QgeyByZXR1cm4gbUZsYWdzOyB9CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0oKSBjb25zdCB7IHJldHVybiBtU3RyZWFtOyB9CisgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KCkgY29uc3QgeyByZXR1cm4gbVN0cmF0ZWd5OyB9CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8d3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiYgZ2V0U2Vjb25kYXJ5T3V0cHV0cygpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TZWNvbmRhcnlPdXRwdXRzOworICAgIH07CisgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIG1Wb2x1bWVTb3VyY2U7IH0KKworICAgIHZvaWQgc2V0QWN0aXZlKGJvb2wgYWN0aXZlKSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgaW50IGRlbHRhID0gYWN0aXZlID8gMSA6IC0xOworICAgICAgICBjaGFuZ2VBY3Rpdml0eUNvdW50KGRlbHRhKTsKKyAgICB9CisgICAgdm9pZCBjaGFuZ2VBY3Rpdml0eUNvdW50KGludCBkZWx0YSkKKyAgICB7CisgICAgICAgIGlmIChkZWx0YSA+IDApIHsKKyAgICAgICAgICAgIG1BY3Rpdml0eUNvdW50ICs9IGRlbHRhOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighbUFjdGl2aXR5Q291bnQsICIlcyglcykgaW52YWxpZCBkZWx0YSAlZCwgaW5hY3RpdmUgY2xpZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB0b1Nob3J0U3RyaW5nKCkuY19zdHIoKSwgZGVsdGEpOworICAgICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihzdGF0aWNfY2FzdDxpbnQ+KG1BY3Rpdml0eUNvdW50KSA8IC1kZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVzKSBpbnZhbGlkIGRlbHRhICVkLCBhY3RpdmUgY2xpZW50IGNvdW50ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB0b1Nob3J0U3RyaW5nKCkuY19zdHIoKSwgZGVsdGEsIG1BY3Rpdml0eUNvdW50KTsKKyAgICAgICAgICAgIG1BY3Rpdml0eUNvdW50ICs9IGRlbHRhOworICAgICAgICB9CisgICAgICAgIENsaWVudERlc2NyaXB0b3I6OnNldEFjdGl2ZShtQWN0aXZpdHlDb3VudCA+IDApOworICAgIH0KKyAgICB1aW50MzJfdCBnZXRBY3Rpdml0eUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUFjdGl2aXR5Q291bnQ7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW07CisgICAgY29uc3QgcHJvZHVjdF9zdHJhdGVneV90IG1TdHJhdGVneTsKKyAgICBjb25zdCBWb2x1bWVTb3VyY2UgbVZvbHVtZVNvdXJjZTsKKyAgICBjb25zdCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBtRmxhZ3M7CisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8d3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiBtU2Vjb25kYXJ5T3V0cHV0czsKKworICAgIC8qKgorICAgICAqIHJlcXVpcmVkIGZvciBkdXBsaWNhdGluZyB0aHJlYWQsIHByZXZlbnQgZnJvbSByZW1vdmluZyBhY3RpdmUgY2xpZW50IGZyb20gYW4gb3V0cHV0CisgICAgICogaW52b2x2ZWQgaW4gYSBkdXBsaWNhdGlvbi4KKyAgICAgKi8KKyAgICB1aW50MzJfdCBtQWN0aXZpdHlDb3VudCA9IDA7Cit9OworCitjbGFzcyBSZWNvcmRDbGllbnREZXNjcmlwdG9yOiBwdWJsaWMgQ2xpZW50RGVzY3JpcHRvcgoreworcHVibGljOgorICAgIFJlY29yZENsaWVudERlc2NyaXB0b3IoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQsIGF1ZGlvX3VuaXF1ZV9pZF90IHJpaWQsIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcsIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcHJlZmVycmVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsIGJvb2wgaXNTb3VuZFRyaWdnZXIpIDoKKyAgICAgICAgQ2xpZW50RGVzY3JpcHRvcihwb3J0SWQsIHVpZCwgc2Vzc2lvbklkLCBhdHRyaWJ1dGVzLCBjb25maWcsIHByZWZlcnJlZERldmljZUlkKSwKKyAgICAgICAgbVJJSWQocmlpZCksIG1Tb3VyY2Uoc291cmNlKSwgbUZsYWdzKGZsYWdzKSwgbUlzU291bmRUcmlnZ2VyKGlzU291bmRUcmlnZ2VyKSwKKyAgICAgICAgbUFwcFN0YXRlKEFQUF9TVEFURV9JRExFKSB7fQorICAgIH5SZWNvcmRDbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgdXNpbmcgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0IG92ZXJyaWRlOworCisgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCgpIGNvbnN0IHsgcmV0dXJuIG1SSUlkOyB9CisgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKCkgY29uc3QgeyByZXR1cm4gbVNvdXJjZTsgfQorICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KKyAgICBib29sIGlzU291bmRUcmlnZ2VyKCkgY29uc3QgeyByZXR1cm4gbUlzU291bmRUcmlnZ2VyOyB9CisgICAgYm9vbCBpc0xvd0xldmVsKCkgY29uc3QgeyByZXR1cm4gbVJJSWQgPT0gUkVDT1JEX1JJSURfSU5WQUxJRDsgfQorICAgIHZvaWQgc2V0QXBwU3RhdGUoYXBwX3N0YXRlX3QgYXBwU3RhdGUpIHsgbUFwcFN0YXRlID0gYXBwU3RhdGU7IH0KKyAgICBhcHBfc3RhdGVfdCBhcHBTdGF0ZSgpIHsgcmV0dXJuIG1BcHBTdGF0ZTsgfQorICAgIGJvb2wgaXNTaWxlbmNlZCgpIGNvbnN0IHsgcmV0dXJuIG1BcHBTdGF0ZSA9PSBBUFBfU1RBVEVfSURMRTsgfQorICAgIHZvaWQgdHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsIGJvb2wgZW5hYmxlZCk7CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gZ2V0RW5hYmxlZEVmZmVjdHMoKSBjb25zdCB7IHJldHVybiBtRW5hYmxlZEVmZmVjdHM7IH0KKworcHJpdmF0ZToKKyAgICBjb25zdCBhdWRpb191bmlxdWVfaWRfdCBtUklJZDsKKyAgICBjb25zdCBhdWRpb19zb3VyY2VfdCBtU291cmNlOworICAgIGNvbnN0IGF1ZGlvX2lucHV0X2ZsYWdzX3QgbUZsYWdzOworICAgIGNvbnN0IGJvb2wgbUlzU291bmRUcmlnZ2VyOworICAgICAgICAgIGFwcF9zdGF0ZV90IG1BcHBTdGF0ZTsKKyAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBtRW5hYmxlZEVmZmVjdHM7Cit9OworCitjbGFzcyBTb3VyY2VDbGllbnREZXNjcmlwdG9yOiBwdWJsaWMgVHJhY2tDbGllbnREZXNjcmlwdG9yCit7CitwdWJsaWM6CisgICAgU291cmNlQ2xpZW50RGVzY3JpcHRvcihhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgdWlkX3QgdWlkLCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAmY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIHNyY0RldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlKTsKKworICAgIH5Tb3VyY2VDbGllbnREZXNjcmlwdG9yKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgZ2V0UGF0Y2hIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtUGF0Y2hIYW5kbGU7IH0KKyAgICB2b2lkIHNldFBhdGNoSGFuZGxlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKSB7IG1QYXRjaEhhbmRsZSA9IHBhdGNoSGFuZGxlOyB9CisKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2UoKSBjb25zdCB7IHJldHVybiBtU3JjRGV2aWNlOyB9CisgICAgd3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHN3T3V0cHV0KCkgY29uc3QgeyByZXR1cm4gbVN3T3V0cHV0OyB9CisgICAgdm9pZCBzZXRTd091dHB1dChjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIHN3T3V0cHV0KTsKKyAgICB3cDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaHdPdXRwdXQoKSBjb25zdCB7IHJldHVybiBtSHdPdXRwdXQ7IH0KKyAgICB2b2lkIHNldEh3T3V0cHV0KGNvbnN0IHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgaHdPdXRwdXQpOworCisgICAgdXNpbmcgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcDsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0IG92ZXJyaWRlOworCisgcHJpdmF0ZToKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtU3JjRGV2aWNlOworICAgIHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBtU3dPdXRwdXQ7CisgICAgd3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IG1Id091dHB1dDsKK307CisKK2NsYXNzIFNvdXJjZUNsaWVudENvbGxlY3Rpb24gOgorICAgIHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8IGF1ZGlvX3BvcnRfaGFuZGxlX3QsIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+ID4KK3sKK3B1YmxpYzoKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKK307CisKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4gPiBUcmFja0NsaWVudFZlY3RvcjsKK3R5cGVkZWYgc3RkOjp2ZWN0b3I8IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+ID4gUmVjb3JkQ2xpZW50VmVjdG9yOworCisvLyBBIE1hcCB0aGF0IGFzc29jaWF0ZXMgYSBwb3J0SWQgd2l0aCBhIGNsaWVudCAodHlwZSBUKQorLy8gd2hpY2ggaXMgZWl0aGVyIFRyYWNrQ2xpZW50RGVzY3JpcHRvciBvciBSZWNvcmRDbGllbnREZXNjcmlwdG9yLgorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgQ2xpZW50TWFwSGFuZGxlciB7CitwdWJsaWM6CisgICAgdmlydHVhbCB+Q2xpZW50TWFwSGFuZGxlcigpID0gZGVmYXVsdDsKKworICAgIC8vIFRyYWNrIGNsaWVudCBtYW5hZ2VtZW50CisgICAgdmlydHVhbCB2b2lkIGFkZENsaWVudChjb25zdCBzcDxUPiAmY2xpZW50KSB7CisgICAgICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gY2xpZW50LT5wb3J0SWQoKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighbUNsaWVudHMuZW1wbGFjZShwb3J0SWQsIGNsaWVudCkuc2Vjb25kLAorICAgICAgICAgICAgICAgICIlcyglZCk6IGF0dGVtcHRpbmcgdG8gYWRkIGNsaWVudCB0aGF0IGFscmVhZHkgZXhpc3RzIiwgX19mdW5jX18sIHBvcnRJZCk7CisgICAgfQorICAgIHNwPFQ+IGdldENsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgY29uc3QgeworICAgICAgICBhdXRvIGl0ID0gbUNsaWVudHMuZmluZChwb3J0SWQpOworICAgICAgICBpZiAoaXQgPT0gbUNsaWVudHMuZW5kKCkpIHJldHVybiBudWxscHRyOworICAgICAgICByZXR1cm4gaXQtPnNlY29uZDsKKyAgICB9CisgICAgdmlydHVhbCB2b2lkIHJlbW92ZUNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkgeworICAgICAgICBhdXRvIGl0ID0gbUNsaWVudHMuZmluZChwb3J0SWQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGl0ID09IG1DbGllbnRzLmVuZCgpLAorICAgICAgICAgICAgICAgICIlcyglZCk6IGNsaWVudCBkb2VzIG5vdCBleGlzdCIsIF9fZnVuY19fLCBwb3J0SWQpOworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGl0LT5zZWNvbmQtPmFjdGl2ZSgpLAorICAgICAgICAgICAgICAgICIlcyglZCk6IHJlbW92aW5nIGNsaWVudCBzdGlsbCBhY3RpdmUhIiwgX19mdW5jX18sIHBvcnRJZCk7CisgICAgICAgICh2b2lkKW1DbGllbnRzLmVyYXNlKGl0KTsKKyAgICB9CisgICAgc2l6ZV90IGdldENsaWVudENvdW50KCkgY29uc3QgeworICAgICAgICByZXR1cm4gbUNsaWVudHMuc2l6ZSgpOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0IHsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQ6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGNsaWVudC0+ZHVtcChkc3QsIDIsIGluZGV4KyspOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaGVscGVyIHR5cGVzCisgICAgdXNpbmcgQ2xpZW50TWFwID0gc3RkOjptYXA8YXVkaW9fcG9ydF9oYW5kbGVfdCwgc3A8VD4+OworICAgIHVzaW5nIENsaWVudE1hcEl0ZXJhdG9yID0gdHlwZW5hbWUgQ2xpZW50TWFwOjpjb25zdF9pdGVyYXRvcjsgIC8vIENsaWVudE1hcCBpcyBjb25zdCBxdWFsaWZpZWQKKyAgICBjbGFzcyBDbGllbnRJdGVyYWJsZSB7CisgICAgcHVibGljOgorICAgICAgICBleHBsaWNpdCBDbGllbnRJdGVyYWJsZShjb25zdCBDbGllbnRNYXBIYW5kbGVyPFQ+ICZyZWYpIDogbUNsaWVudE1hcEhhbmRsZXIocmVmKSB7IH0KKworICAgICAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIC8vIHRyYWl0cworICAgICAgICAgICAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnOworICAgICAgICAgICAgdXNpbmcgdmFsdWVfdHlwZSA9IHNwPFQ+OworICAgICAgICAgICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gcHRyZGlmZl90OworICAgICAgICAgICAgdXNpbmcgcG9pbnRlciA9IGNvbnN0IHNwPFQ+KjsgICAgLy8gTm90ZTogY29uc3QKKyAgICAgICAgICAgIHVzaW5nIHJlZmVyZW5jZSA9IGNvbnN0IHNwPFQ+JjsgIC8vIE5vdGU6IGNvbnN0CisKKyAgICAgICAgICAgIC8vIGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICBleHBsaWNpdCBpdGVyYXRvcihjb25zdCBDbGllbnRNYXBJdGVyYXRvciAmaXQpIDogbUl0KGl0KSB7IH0KKyAgICAgICAgICAgIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgICAgLyogcHJlZml4ICovICAgICB7ICsrbUl0OyByZXR1cm4gKnRoaXM7IH0KKyAgICAgICAgICAgIHJlZmVyZW5jZSBvcGVyYXRvciogKCkgY29uc3QgICAgICAgICAgICAgICB7IHJldHVybiBtSXQtPnNlY29uZDsgfQorICAgICAgICAgICAgcmVmZXJlbmNlIG9wZXJhdG9yLT4oKSBjb25zdCAgICAgICAgICAgICAgIHsgcmV0dXJuIG1JdC0+c2Vjb25kOyB9IC8vIGFzIGlmIHNwPD4KKyAgICAgICAgICAgIGRpZmZlcmVuY2VfdHlwZSBvcGVyYXRvci0oY29uc3QgaXRlcmF0b3ImIHJocykge3JldHVybiBtSXQgLSByaHMubUl0OyB9CisgICAgICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIHJocykgY29uc3QgeyByZXR1cm4gbUl0ID09IHJocy5tSXQ7IH0KKyAgICAgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgcmhzKSBjb25zdCB7IHJldHVybiBtSXQgIT0gcmhzLm1JdDsgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgQ2xpZW50TWFwSXRlcmF0b3IgbUl0OworICAgICAgICB9OworCisgICAgICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3J7bUNsaWVudE1hcEhhbmRsZXIubUNsaWVudHMuYmVnaW4oKX07IH0KKyAgICAgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3J7bUNsaWVudE1hcEhhbmRsZXIubUNsaWVudHMuZW5kKCl9OyB9CisKKyAgICBwcml2YXRlOgorICAgICAgICBjb25zdCBDbGllbnRNYXBIYW5kbGVyPFQ+JiBtQ2xpZW50TWFwSGFuZGxlcjsgLy8gaXRlcmF0aW5nIGRvZXMgbm90IG1vZGlmeSBtYXAuCisgICAgfTsKKworICAgIC8vIHJldHVybiBhbiBpdGVyYWJsZSBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBpbiBhIHJhbmdlLWJhc2VkLWZvciB0byBlbnVtZXJhdGUgY2xpZW50cy4KKyAgICAvLyB0aGlzIGl0ZXJhYmxlIGRvZXMgbm90IGFsbG93IG1vZGlmaWNhdGlvbiwgaXQgc2hvdWxkIGJlIHVzZWQgYXMgYSB0ZW1wb3JhcnkuCisgICAgQ2xpZW50SXRlcmFibGUgZ2V0Q2xpZW50SXRlcmFibGUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBDbGllbnRJdGVyYWJsZXsqdGhpc307CisgICAgfQorCitwcml2YXRlOgorICAgIC8vIENsaWVudE1hcCBtYXBzIGEgcG9ydElkIHRvIGEgY2xpZW50IGRlc2NyaXB0b3IgKGJvdGggdW5pcXVlbHkgaWRlbnRpZnkgZWFjaCBvdGhlcikuCisgICAgQ2xpZW50TWFwIG1DbGllbnRzOworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NvbmZpZ1BhcnNpbmdVdGlscy5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0NvbmZpZ1BhcnNpbmdVdGlscy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA3ODU0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Db25maWdQYXJzaW5nVXRpbHMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkF1ZGlvUG9saWN5Q29uZmlnLmgiCi0jaW5jbHVkZSAiRGV2aWNlRGVzY3JpcHRvci5oIgotI2luY2x1ZGUgIkh3TW9kdWxlLmgiCi0jaW5jbHVkZSAiYXVkaW9fcG9saWN5X2NvbmYuaCIKLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KLSNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZWZpbml0aW9ucyBmb3IgYXVkaW9fcG9saWN5LmNvbmYgZmlsZSBwYXJzaW5nCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIENvbmZpZ1BhcnNpbmdVdGlscwotewotcHVibGljOgotICAgIHN0YXRpYyBzdGF0dXNfdCBsb2FkQ29uZmlnKGNvbnN0IGNoYXIgKnBhdGgsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwotCi1wcml2YXRlOgotICAgIHN0YXRpYyB2b2lkIGxvYWRBdWRpb1BvcnRHYWluKGNub2RlICpyb290LCBBdWRpb1BvcnQgJmF1ZGlvUG9ydCwgaW50IGluZGV4KTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkQXVkaW9Qb3J0R2FpbnMoY25vZGUgKnJvb3QsIEF1ZGlvUG9ydCAmYXVkaW9Qb3J0KTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkRGV2aWNlRGVzY3JpcHRvckdhaW5zKGNub2RlICpyb290LCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlRGVzYyk7Ci0gICAgc3RhdGljIHN0YXR1c190IGxvYWRId01vZHVsZURldmljZShjbm9kZSAqcm9vdCwgRGV2aWNlVmVjdG9yICZkZXZpY2VzKTsKLSAgICBzdGF0aWMgc3RhdHVzX3QgbG9hZEh3TW9kdWxlUHJvZmlsZShjbm9kZSAqcm9vdCwgc3A8SHdNb2R1bGU+ICZtb2R1bGUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpOwotICAgIHN0YXRpYyB2b2lkIGxvYWREZXZpY2VzRnJvbVRhZyhjb25zdCBjaGFyICp0YWcsIERldmljZVZlY3RvciAmZGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRlY2xhcmVkRGV2aWNlcyk7Ci0gICAgc3RhdGljIHZvaWQgbG9hZEh3TW9kdWxlcyhjbm9kZSAqcm9vdCwgSHdNb2R1bGVDb2xsZWN0aW9uICZod01vZHVsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SHdNb2R1bGU+ICZwcmltYXJ5TW9kdWxlKTsKLSAgICBzdGF0aWMgdm9pZCBsb2FkTW9kdWxlR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBjb25zdCBzcDxId01vZHVsZT4gJm1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpOwotICAgIHN0YXRpYyBzdGF0dXNfdCBsb2FkSHdNb2R1bGUoY25vZGUgKnJvb3QsIHNwPEh3TW9kdWxlPiAmbW9kdWxlLCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRGV2aWNlRGVzY3JpcHRvci5oCmluZGV4IDkyYTRjM2UuLmE2NTYyZDcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9EZXZpY2VEZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0RldmljZURlc2NyaXB0b3IuaApAQCAtMTYsNyArMTYsOSBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgorI2luY2x1ZGUgIlBvbGljeUF1ZGlvUG9ydC5oIgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgorI2luY2x1ZGUgPG1lZGlhL0RldmljZURlc2NyaXB0b3JCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgpAQCAtMjYsNjkgKzI4LDIyOSBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLWNsYXNzIERldmljZURlc2NyaXB0b3IgOiBwdWJsaWMgQXVkaW9Qb3J0LCBwdWJsaWMgQXVkaW9Qb3J0Q29uZmlnCitjbGFzcyBEZXZpY2VEZXNjcmlwdG9yIDogcHVibGljIERldmljZURlc2NyaXB0b3JCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBQb2xpY3lBdWRpb1BvcnQsIHB1YmxpYyBQb2xpY3lBdWRpb1BvcnRDb25maWcKIHsKIHB1YmxpYzoKICAgICAgLy8gTm90ZSB0aGF0IGVtcHR5IG5hbWUgcmVmZXJzIGJ5IGNvbnZlbnRpb24gdG8gYSBnZW5lcmljIGRldmljZS4KLSAgICBleHBsaWNpdCBEZXZpY2VEZXNjcmlwdG9yKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4ICZ0YWdOYW1lID0gU3RyaW5nOCgiIikpOworICAgIGV4cGxpY2l0IERldmljZURlc2NyaXB0b3IoYXVkaW9fZGV2aWNlc190IHR5cGUpOworICAgIERldmljZURlc2NyaXB0b3IoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZ0YWdOYW1lLAorICAgICAgICAgICAgY29uc3QgRm9ybWF0VmVjdG9yICZlbmNvZGVkRm9ybWF0cyA9IEZvcm1hdFZlY3Rvcnt9KTsKKyAgICBEZXZpY2VEZXNjcmlwdG9yKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmdGFnTmFtZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzLCBjb25zdCBGb3JtYXRWZWN0b3IgJmVuY29kZWRGb3JtYXRzID0gRm9ybWF0VmVjdG9ye30pOworICAgIERldmljZURlc2NyaXB0b3IoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlVHlwZUFkZHIsIGNvbnN0IHN0ZDo6c3RyaW5nICZ0YWdOYW1lID0gIiIsCisgICAgICAgICAgICBjb25zdCBGb3JtYXRWZWN0b3IgJmVuY29kZWRGb3JtYXRzID0gRm9ybWF0VmVjdG9ye30pOwogCiAgICAgdmlydHVhbCB+RGV2aWNlRGVzY3JpcHRvcigpIHt9CiAKLSAgICB2aXJ0dWFsIGNvbnN0IFN0cmluZzggZ2V0VGFnTmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1UYWdOYW1lOyB9CisgICAgdmlydHVhbCB2b2lkIGFkZEF1ZGlvUHJvZmlsZShjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlKSB7CisgICAgICAgIGFkZEF1ZGlvUHJvZmlsZUFuZFNvcnQobVByb2ZpbGVzLCBwcm9maWxlKTsKKyAgICB9CiAKLSAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlOyB9CisgICAgdmlydHVhbCBjb25zdCBzdGQ6OnN0cmluZyBnZXRUYWdOYW1lKCkgY29uc3QgeyByZXR1cm4gbVRhZ05hbWU7IH0KKworICAgIGNvbnN0IEZvcm1hdFZlY3RvciYgZW5jb2RlZEZvcm1hdHMoKSBjb25zdCB7IHJldHVybiBtRW5jb2RlZEZvcm1hdHM7IH0KKworICAgIGF1ZGlvX2Zvcm1hdF90IGdldEVuY29kZWRGb3JtYXQoKSB7IHJldHVybiBtQ3VycmVudEVuY29kZWRGb3JtYXQ7IH0KKworICAgIHZvaWQgc2V0RW5jb2RlZEZvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpIHsKKyAgICAgICAgbUN1cnJlbnRFbmNvZGVkRm9ybWF0ID0gZm9ybWF0OworICAgIH0KIAogICAgIGJvb2wgZXF1YWxzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBvdGhlcikgY29uc3Q7CiAKKyAgICBib29sIGhhc0N1cnJlbnRFbmNvZGVkRm9ybWF0KCkgY29uc3Q7CisKKyAgICBib29sIHN1cHBvcnRzRm9ybWF0KGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CisKKyAgICAvLyBQb2xpY3lBdWRpb1BvcnRDb25maWcKKyAgICB2aXJ0dWFsIHNwPFBvbGljeUF1ZGlvUG9ydD4gZ2V0UG9saWN5QXVkaW9Qb3J0KCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8UG9saWN5QXVkaW9Qb3J0Kj4oY29uc3RfY2FzdDxEZXZpY2VEZXNjcmlwdG9yKj4odGhpcykpOworICAgIH0KKwogICAgIC8vIEF1ZGlvUG9ydENvbmZpZwotICAgIHZpcnR1YWwgc3A8QXVkaW9Qb3J0PiBnZXRBdWRpb1BvcnQoKSBjb25zdCB7IHJldHVybiAoQXVkaW9Qb3J0KikgdGhpczsgfQorICAgIHZpcnR1YWwgc3RhdHVzX3QgYXBwbHlBdWRpb1BvcnRDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmJhY2t1cENvbmZpZyA9IE5VTEwpOwogICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnID0gTlVMTCkgY29uc3Q7CiAKLSAgICAvLyBBdWRpb1BvcnQKKyAgICAvLyBQb2xpY3lBdWRpb1BvcnQKKyAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gYXNBdWRpb1BvcnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxBdWRpb1BvcnQqPihjb25zdF9jYXN0PERldmljZURlc2NyaXB0b3IqPih0aGlzKSk7CisgICAgfQogICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpOworICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsKKworICAgIC8vIEF1ZGlvUG9ydAogICAgIHZpcnR1YWwgdm9pZCB0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3Q7Ci0gICAgdmlydHVhbCB2b2lkIGltcG9ydEF1ZGlvUG9ydChjb25zdCBzcDxBdWRpb1BvcnQ+JiBwb3J0LCBib29sIGZvcmNlID0gZmFsc2UpOwogCi0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBnZXRJZCgpIGNvbnN0OwotICAgIHN0YXR1c190IGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwotICAgIHZvaWQgbG9nKCkgY29uc3Q7CisgICAgdm9pZCBpbXBvcnRBdWRpb1BvcnRBbmRQaWNrQXVkaW9Qcm9maWxlKGNvbnN0IHNwPFBvbGljeUF1ZGlvUG9ydD4mIHBvbGljeVBvcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZSk7CiAKLSAgICBTdHJpbmc4IG1BZGRyZXNzOworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCwgYm9vbCB2ZXJib3NlID0gdHJ1ZSkgY29uc3Q7CiAKIHByaXZhdGU6Ci0gICAgU3RyaW5nOCBtVGFnTmFtZTsgLy8gVW5pcXVlIGh1bWFuIHJlYWRhYmxlIGlkZW50aWZpZXIgZm9yIGEgZGV2aWNlIHBvcnQgZm91bmQgaW4gY29uZiBmaWxlLgotICAgIGF1ZGlvX2RldmljZXNfdCAgICAgbURldmljZVR5cGU7Ci0gICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtSWQ7Ci0KLWZyaWVuZCBjbGFzcyBEZXZpY2VWZWN0b3I7CisgICAgc3RkOjpzdHJpbmcgbVRhZ05hbWU7IC8vIFVuaXF1ZSBodW1hbiByZWFkYWJsZSBpZGVudGlmaWVyIGZvciBhIGRldmljZSBwb3J0IGZvdW5kIGluIGNvbmYgZmlsZS4KKyAgICBGb3JtYXRWZWN0b3IgICAgICAgIG1FbmNvZGVkRm9ybWF0czsKKyAgICBhdWRpb19mb3JtYXRfdCAgICAgIG1DdXJyZW50RW5jb2RlZEZvcm1hdDsKIH07CiAKIGNsYXNzIERldmljZVZlY3RvciA6IHB1YmxpYyBTb3J0ZWRWZWN0b3I8c3A8RGV2aWNlRGVzY3JpcHRvcj4gPgogewogcHVibGljOgotICAgIERldmljZVZlY3RvcigpIDogU29ydGVkVmVjdG9yKCksIG1EZXZpY2VUeXBlcyhBVURJT19ERVZJQ0VfTk9ORSkge30KKyAgICBEZXZpY2VWZWN0b3IoKSA6IFNvcnRlZFZlY3RvcigpIHt9CisgICAgZXhwbGljaXQgRGV2aWNlVmVjdG9yKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKSA6IERldmljZVZlY3RvcigpCisgICAgeworICAgICAgICBhZGQoaXRlbSk7CisgICAgfQogCiAgICAgc3NpemVfdCBhZGQoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pOwogICAgIHZvaWQgYWRkKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcyk7CiAgICAgc3NpemVfdCByZW1vdmUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pOworICAgIHZvaWQgcmVtb3ZlKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcyk7CiAgICAgc3NpemVfdCBpbmRleE9mKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKSBjb25zdDsKIAotICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlcygpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VUeXBlczsgfQorICAgIERldmljZVR5cGVTZXQgdHlwZXMoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZXM7IH0KIAotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykgY29uc3Q7Ci0gICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGcm9tVHlwZShhdWRpb19kZXZpY2VzX3QgdHlwZXMpIGNvbnN0OworICAgIC8vIElmICdhZGRyZXNzJyBpcyBlbXB0eSBhbmQgJ2NvZGVjJyBpcyBBVURJT19GT1JNQVRfREVGQVVMVCwgYSBkZXZpY2Ugd2l0aCBhIG5vbi1lbXB0eQorICAgIC8vIGFkZHJlc3MgbWF5IGJlIHJldHVybmVkIGlmIHRoZXJlIGlzIG5vIGRldmljZSB3aXRoIHRoZSBzcGVjaWZpZWQgJ3R5cGUnIGFuZCBlbXB0eSBhZGRyZXNzLgorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCAmYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgY29kZWMpIGNvbnN0OworICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRnJvbVR5cGVzKGNvbnN0IERldmljZVR5cGVTZXQmIHR5cGVzKSBjb25zdDsKKyAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlKSBjb25zdCB7CisgICAgICAgIHJldHVybiBnZXREZXZpY2VzRnJvbVR5cGVzKHt0eXBlfSk7CisgICAgfQorCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldERldmljZUZyb21JZAorICAgICAqIEBwYXJhbSBpZCBvZiB0aGUgRGV2aWNlRGVzY3JpcHRvciB0byBzZWFjaCAoYWthIFBvcnQgaGFuZGxlKS4KKyAgICAgKiBAcmV0dXJuIERldmljZURlc2NyaXB0b3IgYXNzb2NpYXRlZCB0byBwb3J0IGlkIGlmIGZvdW5kLCBudWxscHRyIG90aGVyd2lzZS4gSWYgdGhlIGlkIGlzCisgICAgICogZXF1YWwgdG8gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwgaXQgYWxzbyByZXR1cm5zIGEgbnVsbHB0ci4KKyAgICAgKi8KICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXREZXZpY2VGcm9tSWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBpZCkgY29uc3Q7Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlRnJvbVRhZ05hbWUoY29uc3QgU3RyaW5nOCAmdGFnTmFtZSkgY29uc3Q7Ci0gICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGcm9tVHlwZUFkZHIoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpIGNvbnN0OworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZUZyb21UYWdOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZ0YWdOYW1lKSBjb25zdDsKKyAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0Zyb21Id01vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlKSBjb25zdDsKIAotICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VzRnJvbUh3TW9kdWxlKGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtb2R1bGVIYW5kbGUpIGNvbnN0OworICAgIERldmljZVZlY3RvciBnZXRGaXJzdERldmljZXNGcm9tVHlwZXMoc3RkOjp2ZWN0b3I8YXVkaW9fZGV2aWNlc190PiBvcmRlcmVkVHlwZXMpIGNvbnN0OworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldEZpcnN0RXhpc3RpbmdEZXZpY2Uoc3RkOjp2ZWN0b3I8YXVkaW9fZGV2aWNlc190PiBvcmRlcmVkVHlwZXMpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcyA9IDAsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OworICAgIC8vIFJldHVybiBkZXZpY2UgZGVzY3JpcHRvciB0aGF0IGlzIHVzZWQgdG8gb3BlbiBhbiBpbnB1dC9vdXRwdXQgc3RyZWFtLgorICAgIC8vIE51bGwgcG9pbnRlciB3aWxsIGJlIHJldHVybmVkIGlmCisgICAgLy8gICAgIDEpIHRoaXMgY29sbGVjdGlvbiBpcyBlbXB0eQorICAgIC8vICAgICAyKSB0aGUgZGV2aWNlIGRlc2NyaXB0b3JzIGFyZSBub3QgdGhlIHNhbWUgY2F0ZWdvcnkoaW5wdXQgb3Igb3V0cHV0KQorICAgIC8vICAgICAzKSB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBkZXZpY2UgdHlwZSBmb3IgaW5wdXQgY2FzZQorICAgIC8vICAgICA0KSB0aGUgY29tYmluYXRpb24gb2YgYWxsIGRldmljZXMgaXMgaW52YWxpZCBmb3Igc2VsZWN0aW9uCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlRm9yT3BlbmluZygpIGNvbnN0OworCisgICAgLy8gSWYgdGhlcmUgYXJlIGRldmljZXMgd2l0aCB0aGUgZ2l2ZW4gdHlwZSBhbmQgdGhlIGRldmljZXMgdG8gYWRkIGlzIG5vdCBlbXB0eSwKKyAgICAvLyByZW1vdmUgYWxsIHRoZSBkZXZpY2VzIHdpdGggdGhlIGdpdmVuIHR5cGUgYW5kIGFkZCBhbGwgdGhlIGRldmljZXMgdG8gYWRkLgorICAgIHZvaWQgcmVwbGFjZURldmljZXNCeVR5cGUoYXVkaW9fZGV2aWNlc190IHR5cGVUb1JlbW92ZSwgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzVG9BZGQpOworCisgICAgYm9vbCBjb250YWluc0RldmljZUFtb25nVHlwZXMoY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFJbnRlcnNlY3Rpb24obURldmljZVR5cGVzLCBkZXZpY2VUeXBlcykuZW1wdHkoKTsKKyAgICB9CisKKyAgICBib29sIGNvbnRhaW5zRGV2aWNlV2l0aFR5cGUoYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIGNvbnRhaW5zRGV2aWNlQW1vbmdUeXBlcyh7ZGV2aWNlVHlwZX0pOworICAgIH0KKworICAgIGJvb2wgb25seUNvbnRhaW5zRGV2aWNlc1dpdGhUeXBlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlKSBjb25zdCB7CisgICAgICAgIHJldHVybiBpc1NpbmdsZURldmljZVR5cGUobURldmljZVR5cGVzLCBkZXZpY2VUeXBlKTsKKyAgICB9CisKKyAgICBib29sIGNvbnRhaW5zKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBpdGVtKSBjb25zdCB7IHJldHVybiBpbmRleE9mKGl0ZW0pID49IDA7IH0KKworICAgIC8qKgorICAgICAqIEBicmllZiBjb250YWluc0F0TGVhc3RPbmUKKyAgICAgKiBAcGFyYW0gZGV2aWNlcyB2ZWN0b3Igb2YgZGV2aWNlcyB0byBjaGVjayBhZ2FpbnN0LgorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgRGV2aWNlVmVjdG9yIGNvbnRhaW5zIGF0IGxpc3Qgb25lIG9mIHRoZSBkZXZpY2VzIGZyb20gdGhlIGdpdmVuIHZlY3Rvci4KKyAgICAgKi8KKyAgICBib29sIGNvbnRhaW5zQXRMZWFzdE9uZShjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGNvbnRhaW5zQWxsRGV2aWNlcworICAgICAqIEBwYXJhbSBkZXZpY2VzIHZlY3RvciBvZiBkZXZpY2VzIHRvIGNoZWNrIGFnYWluc3QuCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBEZXZpY2VWZWN0b3IgY29udGFpbnMgYWxsIHRoZSBkZXZpY2VzIGZyb20gdGhlIGdpdmVuIHZlY3RvcgorICAgICAqLworICAgIGJvb2wgY29udGFpbnNBbGxEZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZmlsdGVyIHRoZSBkZXZpY2VzIHN1cHBvcnRlZCBieSB0aGlzIGNvbGxlY3Rpb24gYWdhaW5zdCBhbm90aGVyIGNvbGxlY3Rpb24KKyAgICAgKiBAcGFyYW0gZGV2aWNlcyB0byBmaWx0ZXIgYWdhaW5zdAorICAgICAqIEByZXR1cm4gYSBmaWx0ZXJlZCBEZXZpY2VWZWN0b3IKKyAgICAgKi8KKyAgICBEZXZpY2VWZWN0b3IgZmlsdGVyKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZmlsdGVyIHRoZSBkZXZpY2VzIHN1cHBvcnRlZCBieSB0aGlzIGNvbGxlY3Rpb24gYmVmb3JlIHNlbmRpbmcKKyAgICAgKiB0aGVuIHRvIHRoZSBFbmdpbmUgdmlhIEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyIGludGVyZmFjZQorICAgICAqIEByZXR1cm4gYSBmaWx0ZXJlZCBEZXZpY2VWZWN0b3IKKyAgICAgKi8KKyAgICBEZXZpY2VWZWN0b3IgZmlsdGVyRm9yRW5naW5lKCkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgbWVyZ2UgdHdvIHZlY3RvcnMuIEFzIFNvcnRlZFZlY3RvciBJbXBsZW1lbnRhdGlvbiBpcyBidWdneSAoaXQgZG9lcyBub3QgY2hlY2sgdGhlIHNpemUKKyAgICAgKiBvZiB0aGUgZGVzdGluYXRpb24gdmVjdG9yLCBvbmx5IG9mIHRoZSBzb3VyY2UsIGl0IHByb3ZpZGVzIGEgc2FmZSBpbXBsZW1lbnRhdGlvbgorICAgICAqIEBwYXJhbSBkZXZpY2VzIHNvdXJjZSBkZXZpY2UgdmVjdG9yIHRvIG1lcmdlIHdpdGgKKyAgICAgKiBAcmV0dXJuIHNpemUgb2YgdGhlIG1lcmdlZCB2ZWN0b3IuCisgICAgICovCisgICAgc3NpemVfdCBtZXJnZShjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpCisgICAgeworICAgICAgICBpZiAoaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBhZGQoZGV2aWNlcyk7CisgICAgICAgICAgICByZXR1cm4gc2l6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBTb3J0ZWRWZWN0b3I6Om1lcmdlKGRldmljZXMpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBicmllZiBvcGVyYXRvciA9PSBEZXZpY2VWZWN0b3IgYXJlIGVxdWFscyBpZiBhbGwgdGhlIERldmljZURlc2NyaXB0b3IgY2FuIGJlIGZvdW5kIChha2EKKyAgICAgKiBEZXZpY2VEZXNjcmlwdG9yIHdpdGggc2FtZSB0eXBlIGFuZCBhZGRyZXNzKSBhbmQgdGhlIHZlY3RvciBoYXMgc2FtZSBzaXplLgorICAgICAqIEBwYXJhbSByaWdodCBEZXZpY2VWZWN0b3IgdG8gY29tcGFyZSB0by4KKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgcmlnaHQgY29udGFpbnMgdGhlIHNhbWUgZGV2aWNlIGFuZCBoYXMgdGhlIHNhbWUgc2l6ZS4KKyAgICAgKi8KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgRGV2aWNlVmVjdG9yICZyaWdodCkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChzaXplKCkgIT0gcmlnaHQuc2l6ZSgpKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZkZXZpY2UgOiAqdGhpcykgeworICAgICAgICAgICAgaWYgKHJpZ2h0LmluZGV4T2YoZGV2aWNlKSA8IDApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IERldmljZVZlY3RvciAmcmlnaHQpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gIW9wZXJhdG9yPT0ocmlnaHQpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRGaXJzdFZhbGlkQWRkcmVzcworICAgICAqIEByZXR1cm4gdGhlIGZpcnN0IHZhbGlkIGFkZHJlc3Mgb2YgYSBsaXN0IG9mIGRldmljZSwgIiIgaWYgbm8gZGV2aWNlIHdpdGggdmFsaWQgYWRkcmVzcworICAgICAqIGZvdW5kLgorICAgICAqIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGhlbHBzIG1haW50YWluaW5nIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgd2hlcmUgd2UgdXNlZCB0byBoYXZlIGEKKyAgICAgKiBkZXZpY2VzIG1hc2sgYW5kIGFuIGFkZHJlc3MuCisgICAgICovCisgICAgU3RyaW5nOCBnZXRGaXJzdFZhbGlkQWRkcmVzcygpIGNvbnN0CisgICAgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6ICp0aGlzKSB7CisgICAgICAgICAgICBpZiAoZGV2aWNlLT5hZGRyZXNzKCkgIT0gIiIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gU3RyaW5nOChkZXZpY2UtPmFkZHJlc3MoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gU3RyaW5nOCgiIik7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgdG9TdHJpbmcoKSBjb25zdDsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcyA9IDAsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIHZvaWQgcmVmcmVzaFR5cGVzKCk7Ci0gICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2VUeXBlczsKKyAgICBEZXZpY2VUeXBlU2V0IG1EZXZpY2VUeXBlczsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9FZmZlY3REZXNjcmlwdG9yLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvRWZmZWN0RGVzY3JpcHRvci5oCmluZGV4IDA0ODMxYzYuLmM0ZWFiMzAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9FZmZlY3REZXNjcmlwdG9yLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0VmZmVjdERlc2NyaXB0b3IuaApAQCAtMTYsMjUgKzE2LDM5IEBACiAKICNwcmFnbWEgb25jZQogCi0jaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+CisjaW5jbHVkZSA8cG9saWN5Lmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdC5oPgogI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi0KIGNsYXNzIEVmZmVjdERlc2NyaXB0b3IgOiBwdWJsaWMgUmVmQmFzZQogewogcHVibGljOgotICAgIHN0YXR1c190IGR1bXAoaW50IGZkKTsKKyAgICBFZmZlY3REZXNjcmlwdG9yKGNvbnN0IGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2MsIGJvb2wgaXNNdXNpY0VmZmVjdCwKKyAgICAgICAgICAgICAgICAgICAgIGludCBpZCwgYXVkaW9faW9faGFuZGxlX3QgaW8sIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSA6CisgICAgICAgIG1JZChpZCksIG1JbyhpbyksIG1TZXNzaW9uKHNlc3Npb24pLCBtRW5hYmxlZChmYWxzZSksIG1TdXNwZW5kZWQoZmFsc2UpLAorICAgICAgICBtSXNNdXNpY0VmZmVjdChpc011c2ljRWZmZWN0KQorICAgIHsKKyAgICAgICAgbWVtY3B5ICgmbURlc2MsIGRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7CisgICAgfQogCi0gICAgaW50IG1JbzsgICAgICAgICAgICAgICAgLy8gaW8gdGhlIGVmZmVjdCBpcyBhdHRhY2hlZCB0bwotICAgIHJvdXRpbmdfc3RyYXRlZ3kgbVN0cmF0ZWd5OyAvLyByb3V0aW5nIHN0cmF0ZWd5IHRoZSBlZmZlY3QgaXMgYXNzb2NpYXRlZCB0bwotICAgIGludCBtU2Vzc2lvbjsgICAgICAgICAgICAgICAvLyBhdWRpbyBzZXNzaW9uIHRoZSBlZmZlY3QgaXMgb24KLSAgICBlZmZlY3RfZGVzY3JpcHRvcl90IG1EZXNjOyAgLy8gZWZmZWN0IGRlc2NyaXB0b3IKLSAgICBib29sIG1FbmFibGVkOyAgICAgICAgICAgICAgLy8gZW5hYmxlZCBzdGF0ZTogQ1BVIGxvYWQgYmVpbmcgdXNlZCBvciBub3QKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCkgY29uc3Q7CisKKyAgICBpbnQgbUlkOyAgICAgICAgICAgICAgICAgICAvLyBlZmZlY3QgdW5pcXVlIElECisgICAgYXVkaW9faW9faGFuZGxlX3QgbUlvOyAgICAgLy8gaW8gdGhlIGVmZmVjdCBpcyBhdHRhY2hlZCB0bworICAgIGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbjsgIC8vIGF1ZGlvIHNlc3Npb24gdGhlIGVmZmVjdCBpcyBvbgorICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgbURlc2M7IC8vIGVmZmVjdCBkZXNjcmlwdG9yCisgICAgYm9vbCBtRW5hYmxlZDsgICAgICAgICAgICAgLy8gZW5hYmxlZCBzdGF0ZTogQ1BVIGxvYWQgYmVpbmcgdXNlZCBvciBub3QKKyAgICBib29sIG1TdXNwZW5kZWQ7ICAgICAgICAgICAvLyBlbmFibGVkIGJ1dCBzdXNwZW5kZWQgYnkgY29uY3VyZW50IGNhcHR1cmUgcG9saWN5CisKKyAgICBib29sIGlzTXVzaWNFZmZlY3QoKSBjb25zdCB7IHJldHVybiBtSXNNdXNpY0VmZmVjdDsgfQorCitwcml2YXRlOgorICAgIGJvb2wgbUlzTXVzaWNFZmZlY3Q7CiB9OwogCiBjbGFzcyBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiA6IHB1YmxpYyBLZXllZFZlY3RvcjxpbnQsIHNwPEVmZmVjdERlc2NyaXB0b3I+ID4KQEAgLTQzLDE0ICs1NywyMiBAQAogICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uKCk7CiAKICAgICBzdGF0dXNfdCByZWdpc3RlckVmZmVjdChjb25zdCBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjLCBhdWRpb19pb19oYW5kbGVfdCBpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwgaW50IHNlc3Npb24sIGludCBpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNlc3Npb24sIGludCBpZCwgYm9vbCBpc011c2ljRWZmZWN0KTsKICAgICBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCk7CisgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZ2V0RWZmZWN0KGludCBpZCkgY29uc3Q7CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gZ2V0RWZmZWN0c0ZvcklvKGF1ZGlvX2lvX2hhbmRsZV90IGlvKSBjb25zdDsKICAgICBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKTsKKyAgICBib29sICAgICBpc0VmZmVjdEVuYWJsZWQoaW50IGlkKSBjb25zdDsKICAgICB1aW50MzJfdCBnZXRNYXhFZmZlY3RzQ3B1TG9hZCgpIGNvbnN0OwogICAgIHVpbnQzMl90IGdldE1heEVmZmVjdHNNZW1vcnkoKSBjb25zdDsKLSAgICBib29sIGlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCk7CisgICAgYm9vbCBpc05vbk9mZmxvYWRhYmxlRWZmZWN0RW5hYmxlZCgpIGNvbnN0OwogCi0gICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworICAgIHZvaWQgbW92ZUVmZmVjdHMoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNPdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQpOworICAgIHZvaWQgbW92ZUVmZmVjdHMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaWRzLCBhdWRpb19pb19oYW5kbGVfdCBkc3RPdXRwdXQpOworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcyA9IDAsIGJvb2wgdmVyYm9zZSA9IHRydWUpIGNvbnN0OwogCiBwcml2YXRlOgogICAgIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdERlc2MsIGJvb2wgZW5hYmxlZCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvR2FpbnMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9HYWlucy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjIyOWE0Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9HYWlucy5oCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8U3RyZWFtRGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIFN0cmVhbURlc2NyaXB0b3I7Ci0KLWNsYXNzIEdhaW5zCi17Ci1wdWJsaWMgOgotICAgIHN0YXRpYyBmbG9hdCB2b2xJbmRleFRvRGIoY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqcG9pbnQsIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4SW5VaSk7Ci0KLSAgICAvLyBkZWZhdWx0IHZvbHVtZSBjdXJ2ZQotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNEZWZhdWx0Vm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIC8vIGRlZmF1bHQgdm9sdW1lIGN1cnZlIGZvciBtZWRpYSBzdHJhdGVneQotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgLy8gdm9sdW1lIGN1cnZlIGZvciBub24tbWVkaWEgYXVkaW8gb24gZXh0IG1lZGlhIG91dHB1dHMgKEhETUksIExpbmUsIGV0YykKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzRXh0TWVkaWFTeXN0ZW1Wb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgLy8gdm9sdW1lIGN1cnZlIGZvciBtZWRpYSBzdHJhdGVneSBvbiBzcGVha2VycwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlRHJjW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICAvLyB2b2x1bWUgY3VydmUgZm9yIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBvbiBzcGVha2VycwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmNbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmNbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNEZWZhdWx0Vm9pY2VWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzTGluZWFyVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdOwotICAgIHN0YXRpYyBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50IHNTaWxlbnRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF07Ci0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgc0Z1bGxTY2FsZVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICBzdGF0aWMgY29uc3QgVm9sdW1lQ3VydmVQb2ludCBzSGVhcmluZ0FpZFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXTsKLSAgICAvLyBkZWZhdWx0IHZvbHVtZSBjdXJ2ZXMgcGVyIHN0cmVhbSBhbmQgZGV2aWNlIGNhdGVnb3J5LiBTZWUgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcygpCi0gICAgc3RhdGljIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fQ05UXVtERVZJQ0VfQ0FURUdPUllfQ05UXTsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Id01vZHVsZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKaW5kZXggY2I5ZjQ5ZS4uMjNmMGM5YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0h3TW9kdWxlLmgKQEAgLTQ2LDYgKzQ2LDIyIEBACiAKICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmdldERlY2xhcmVkRGV2aWNlcygpIGNvbnN0IHsgcmV0dXJuIG1EZWNsYXJlZERldmljZXM7IH0KICAgICB2b2lkIHNldERlY2xhcmVkRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpOworICAgIERldmljZVZlY3RvciBnZXRBbGxEZXZpY2VzKCkgY29uc3QKKyAgICB7CisgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gbURlY2xhcmVkRGV2aWNlczsKKyAgICAgICAgZGV2aWNlcy5tZXJnZShtRHluYW1pY0RldmljZXMpOworICAgICAgICByZXR1cm4gZGV2aWNlczsKKyAgICB9CisgICAgdm9pZCBhZGREeW5hbWljRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpCisgICAgeworICAgICAgICBtRHluYW1pY0RldmljZXMuYWRkKGRldmljZSk7CisgICAgfQorCisgICAgYm9vbCByZW1vdmVEeW5hbWljRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpCisgICAgeworICAgICAgICByZXR1cm4gbUR5bmFtaWNEZXZpY2VzLnJlbW92ZShkZXZpY2UpID49IDA7CisgICAgfQorICAgIERldmljZVZlY3RvciBnZXREeW5hbWljRGV2aWNlcygpIGNvbnN0IHsgcmV0dXJuIG1EeW5hbWljRGV2aWNlczsgfQogCiAgICAgY29uc3QgSW5wdXRQcm9maWxlQ29sbGVjdGlvbiAmZ2V0SW5wdXRQcm9maWxlcygpIGNvbnN0IHsgcmV0dXJuIG1JbnB1dFByb2ZpbGVzOyB9CiAgICAgY29uc3QgT3V0cHV0UHJvZmlsZUNvbGxlY3Rpb24gJmdldE91dHB1dFByb2ZpbGVzKCkgY29uc3QgeyByZXR1cm4gbU91dHB1dFByb2ZpbGVzOyB9CkBAIC02NiwyMyArODIsMzUgQEAKICAgICBzdGF0dXNfdCBhZGRJbnB1dFByb2ZpbGUoY29uc3Qgc3A8SU9Qcm9maWxlPiAmcHJvZmlsZSk7CiAgICAgc3RhdHVzX3QgYWRkUHJvZmlsZShjb25zdCBzcDxJT1Byb2ZpbGU+ICZwcm9maWxlKTsKIAotICAgIHN0YXR1c190IGFkZE91dHB1dFByb2ZpbGUoY29uc3QgU3RyaW5nOCYgbmFtZSwgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICBzdGF0dXNfdCBhZGRPdXRwdXRQcm9maWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAogICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwgY29uc3QgU3RyaW5nOCYgYWRkcmVzcyk7Ci0gICAgc3RhdHVzX3QgcmVtb3ZlT3V0cHV0UHJvZmlsZShjb25zdCBTdHJpbmc4JiBuYW1lKTsKLSAgICBzdGF0dXNfdCBhZGRJbnB1dFByb2ZpbGUoY29uc3QgU3RyaW5nOCYgbmFtZSwgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICBzdGF0dXNfdCByZW1vdmVPdXRwdXRQcm9maWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKKyAgICBzdGF0dXNfdCBhZGRJbnB1dFByb2ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKTsKLSAgICBzdGF0dXNfdCByZW1vdmVJbnB1dFByb2ZpbGUoY29uc3QgU3RyaW5nOCYgbmFtZSk7CisgICAgc3RhdHVzX3QgcmVtb3ZlSW5wdXRQcm9maWxlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lKTsKIAogICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtSGFuZGxlOyB9CiAgICAgdm9pZCBzZXRIYW5kbGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IGhhbmRsZSk7CiAKLSAgICBzcDxBdWRpb1BvcnQ+IGZpbmRQb3J0QnlUYWdOYW1lKGNvbnN0IFN0cmluZzggJnRhZ05hbWUpIGNvbnN0CisgICAgc3A8UG9saWN5QXVkaW9Qb3J0PiBmaW5kUG9ydEJ5VGFnTmFtZShjb25zdCBzdGQ6OnN0cmluZyAmdGFnTmFtZSkgY29uc3QKICAgICB7Ci0gICAgICAgIHJldHVybiBtUG9ydHMuZmluZEJ5VGFnTmFtZSh0YWdOYW1lKTsKKyAgICAgICAgcmV0dXJuIGZpbmRCeVRhZ05hbWUobVBvcnRzLCB0YWdOYW1lKTsKICAgICB9CiAKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgc3VwcG9ydHNQYXRjaCBjaGVja3MgaWYgYW4gYXVkaW8gcGF0Y2ggYmV0d2VlbiAyIHBvcnRzIGJlbG9naW5nIHRvIHRoaXMgSHdNb2R1bGUKKyAgICAgKiBpcyBzdXBwb3J0ZWQgYnkgYSBId01vZHVsZS4gVGhlIHBvcnRzIGFuZCB0aGUgcm91dGUgc2hhbGwgYmUgZGVjbGFyZWQgaW4gdGhlCisgICAgICogYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIGZpbGUuCisgICAgICogQHBhcmFtIHNyY1BvcnQgKGFrYSB0aGUgc291cmNlKSB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHBhcmFtIGRzdFBvcnQgKGFrYSB0aGUgc2luaykgdG8gYmUgY29uc2lkZXJlZAorICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgSHdNb2R1bGUgc3VwcG9ydHMgdGhlIGNvbm5lY3Rpb24gYmV0d2VlbiB0aGUgc2luayBhbmQgdGhlIHNvdXJjZSwKKyAgICAgKiBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIHN1cHBvcnRzUGF0Y2goY29uc3Qgc3A8UG9saWN5QXVkaW9Qb3J0PiAmc3JjUG9ydCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8UG9saWN5QXVkaW9Qb3J0PiAmZHN0UG9ydCkgY29uc3Q7CisKICAgICAvLyBUT0RPIHJlbW92ZSBmcm9tIGhlcmUgKHNwbGl0IHNlcmlhbGl6YXRpb24pCi0gICAgdm9pZCBkdW1wKGludCBmZCk7CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiAKIHByaXZhdGU6CiAgICAgdm9pZCByZWZyZXNoU3VwcG9ydGVkRGV2aWNlcygpOwpAQCAtOTMsOCArMTIxLDkgQEAKICAgICBJbnB1dFByb2ZpbGVDb2xsZWN0aW9uIG1JbnB1dFByb2ZpbGVzOyAgLy8gaW5wdXQgcHJvZmlsZXMgZXhwb3NlZCBieSB0aGlzIG1vZHVsZQogICAgIHVpbnQzMl90IG1IYWxWZXJzaW9uOyAvLyBhdWRpbyBIQUwgQVBJIHZlcnNpb24KICAgICBEZXZpY2VWZWN0b3IgbURlY2xhcmVkRGV2aWNlczsgLy8gZGV2aWNlcyBkZWNsYXJlZCBpbiBhdWRpb19wb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlLgorICAgIERldmljZVZlY3RvciBtRHluYW1pY0RldmljZXM7IC8qKjwgZGV2aWNlcyB0aGF0IGNhbiBiZSBhZGRlZC9yZW1vdmVkIGF0IHJ1bnRpbWUgKGUuZy4gcnNidW1peCkqLwogICAgIEF1ZGlvUm91dGVWZWN0b3IgbVJvdXRlczsKLSAgICBBdWRpb1BvcnRWZWN0b3IgbVBvcnRzOworICAgIFBvbGljeUF1ZGlvUG9ydFZlY3RvciBtUG9ydHM7CiB9OwogCiBjbGFzcyBId01vZHVsZUNvbGxlY3Rpb24gOiBwdWJsaWMgVmVjdG9yPHNwPEh3TW9kdWxlPiA+CkBAIC0xMDIsMTQgKzEzMSw2NCBAQAogcHVibGljOgogICAgIHNwPEh3TW9kdWxlPiBnZXRNb2R1bGVGcm9tTmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdDsKIAotICAgIHNwPEh3TW9kdWxlPiBnZXRNb2R1bGVGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3Q7CisgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZUZvckRldmljZVR5cGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KSBjb25zdDsKIAotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZURlc2NyaXB0b3IoY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1hdGNoQWRyZXNzID0gdHJ1ZSkgY29uc3Q7CisgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZUZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgY29uc3Q7CiAKLSAgICBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7CisgICAgRGV2aWNlVmVjdG9yIGdldEF2YWlsYWJsZURldmljZXNGcm9tTW9kdWxlTmFtZShjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVEZXZpY2VzKSBjb25zdDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXREZXZpY2VEZXNjcmlwdG9yIHJldHVybnMgYSBkZXZpY2UgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHRvIHRoZSBkZXZpY2UgdHlwZSBhbmQKKyAgICAgKiBkZXZpY2UgYWRkcmVzcyAoaWYgbWF0Y2hBZGRyZXNzIGlzIHRydWUpLgorICAgICAqIEl0IG1heSBsb29wIHR3aWNlIG9uIGFsbCBtb2R1bGVzIHRvIGNoZWNrIGlmIGFsbG93VG9DcmVhdGUgaXMgdHJ1ZQorICAgICAqICAgICAgLWZpcnN0IGxvb3Agd2lsbCBjaGVjayBpZiB0aGUgZGV2aWNlIGlzIGZvdW5kIG9uIGEgbW9kdWxlIHNpbmNlIGRlY2xhcmVkIGluIHRoZSBsaXN0CisgICAgICogb2YgZGV2aWNlIHBvcnQgaW4gY29uZmlndXJhdGlvbiBmaWxlCisgICAgICogICAgICAtKGFsbG93VG9DcmVhdGUgaXMgdHJ1ZSlzZWNvbmQgbG9vcCB3aWxsIGNoZWNrIGlmIHRoZSBkZXZpY2UgaXMgd2Vha2x5IHN1cHBvcnRlZCBieSBvbmUKKyAgICAgKiBvciBtb3JlIHByb2ZpbGVzIG9uIGEgZ2l2ZW4gbW9kdWxlIGFuZCB3aWxsIGFkZCBhcyBhIHN1cHBvcnRlZCBkZXZpY2UgZm9yIHRoaXMgbW9kdWxlLgorICAgICAqICAgICAgIFRoZSBkZXZpY2Ugd2lsbCBhbHNvIGJlIGFkZGVkIHRvIHRoZSBkeW5hbWljIGxpc3Qgb2YgZGV2aWNlIG9mIHRoaXMgbW9kdWxlCisgICAgICogQHBhcmFtIHR5cGUgb2YgdGhlIGRldmljZSByZXF1ZXN0ZWQKKyAgICAgKiBAcGFyYW0gYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHJlcXVlc3RlZAorICAgICAqIEBwYXJhbSBuYW1lIG9mIHRoZSBkZXZpY2UgdGhhdCByZXF1ZXN0ZWQKKyAgICAgKiBAcGFyYW0gZW5jb2RlZEZvcm1hdCBpZiBub3QgQVVESU9fRk9STUFUX0RFRkFVTFQsIG11c3QgbWF0Y2ggb25lIHN1cHBvcnRlZCBmb3JtYXQKKyAgICAgKiBAcGFyYW0gbWF0Y2hBZGRyZXNzIHRydWUgaWYgYSBzdHJvbmcgbWF0Y2ggaXMgcmVxdWlyZWQKKyAgICAgKiBAcGFyYW0gYWxsb3dUb0NyZWF0ZSB0cnVlIGlmIGFsbG93ZWQgdG8gY3JlYXRlIGR5bmFtaWMgZGV2aWNlIChlLmcuIGhkbWksIHVzYi4uLikKKyAgICAgKiBAcmV0dXJuIGRldmljZSBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgdG8gdGhlIHR5cGUgKGFuZCBhZGRyZXNzIGlmIG1hdGNoQWRkcmVzcyBpcyB0cnVlKQorICAgICAqLworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldERldmljZURlc2NyaXB0b3IoY29uc3QgYXVkaW9fZGV2aWNlc190IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG93VG9DcmVhdGUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2hBZGRyZXNzID0gdHJ1ZSkgY29uc3Q7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgY3JlYXRlRGV2aWNlIGNyZWF0ZXMgYSBuZXcgZGV2aWNlIGZyb20gdGhlIHR5cGUgYW5kIGFkZHJlc3MgZ2l2ZW4uIEl0IGNoZWNrcyB0aGF0CisgICAgICogYWNjb3JkaW5nIHRvIHRoZSBkZXZpY2UgdHlwZSwgYSBtb2R1bGUgaXMgc3VwcG9ydGluZyB0aGlzIGRldmljZSAod2VhayBjaGVjaykuCisgICAgICogVGhpcyBjb25jZXJucyBvbmx5IGR5bmFtaWMgZGV2aWNlLCBha2EgZGV2aWNlIHdpdGggYSBzcGVjaWZpYyBhZGRyZXNzIGFuZCBub3QKKyAgICAgKiBhbHJlYWR5IHN1cHBvcnRlZCBieSBtb2R1bGUvdW5kZXJseWluZyBwcm9maWxlcy4KKyAgICAgKiBAcGFyYW0gdHlwZSBvZiB0aGUgZGV2aWNlIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcGFyYW0gbmFtZSBvZiB0aGUgZGV2aWNlIHRvIGJlIGNyZWF0ZWQKKyAgICAgKiBAcmV0dXJuIGRldmljZSBkZXNjcmlwdG9yIGlmIGEgbW9kdWxlIGlzIHN1cHBvcnRpbmcgdGhpcyB0eXBlLCBudWxscHRyIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBjcmVhdGVEZXZpY2UoY29uc3QgYXVkaW9fZGV2aWNlc190IHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGNsZWFuVXBGb3JEZXZpY2U6IGxvb3Agb24gYWxsIHByb2ZpbGVzIG9mIGFsbCBtb2R1bGVzIHRvIHJlbW92ZSBkZXZpY2UgZnJvbQorICAgICAqIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBkZXZpY2UuIElmIHRoaXMgZGV2aWNlIGlzIGEgZHluYW1pYyBkZXZpY2UgKGFrYSBhIGRldmljZSBub3QgaW4gdGhlCisgICAgICogeG1sIGZpbGUgd2l0aCBhIHJ1bnRpbWUgYWRkcmVzcyksIGl0IGlzIGFsc28gcmVtb3ZlZCBmcm9tIHRoZSBtb2R1bGUgY29sbGVjdGlvbiBvZiBkeW5hbWljCisgICAgICogZGV2aWNlcy4KKyAgICAgKiBAcGFyYW0gZGV2aWNlIHRoYXQgaGFzIGJlZW4gZGlzY29ubmVjdGVkCisgICAgICovCisgICAgdm9pZCBjbGVhblVwRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpOworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCkgY29uc3Q7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSU9Qcm9maWxlLmgKaW5kZXggNjdhYzliYy4uMjA0NDg2MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lPUHJvZmlsZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JT1Byb2ZpbGUuaApAQCAtMTYsOCArMTYsMTAgQEAKIAogI3ByYWdtYSBvbmNlCiAKLSNpbmNsdWRlICJBdWRpb1BvcnQuaCIKICNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAiUG9saWN5QXVkaW9Qb3J0LmgiCisjaW5jbHVkZSAicG9saWN5LmgiCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db250YWluZXJzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCkBAIC0zMCwxOCArMzIsMjggQEAKIC8vIEl0IGlzIHVzZWQgYnkgdGhlIHBvbGljeSBtYW5hZ2VyIHRvIGRldGVybWluZSBpZiBhbiBvdXRwdXQgb3IgaW5wdXQgaXMgc3VpdGFibGUgZm9yCiAvLyBhIGdpdmVuIHVzZSBjYXNlLCAgb3Blbi9jbG9zZSBpdCBhY2NvcmRpbmdseSBhbmQgY29ubmVjdC9kaXNjb25uZWN0IGF1ZGlvIHRyYWNrcwogLy8gdG8vZnJvbSBpdC4KLWNsYXNzIElPUHJvZmlsZSA6IHB1YmxpYyBBdWRpb1BvcnQKK2NsYXNzIElPUHJvZmlsZSA6IHB1YmxpYyBBdWRpb1BvcnQsIHB1YmxpYyBQb2xpY3lBdWRpb1BvcnQKIHsKIHB1YmxpYzoKLSAgICBJT1Byb2ZpbGUoY29uc3QgU3RyaW5nOCAmbmFtZSwgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSkKKyAgICBJT1Byb2ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUpCiAgICAgICAgIDogQXVkaW9Qb3J0KG5hbWUsIEFVRElPX1BPUlRfVFlQRV9NSVgsIHJvbGUpLAotICAgICAgICAgIG1heE9wZW5Db3VudCgocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSA/IDEgOiAwKSwKKyAgICAgICAgICBtYXhPcGVuQ291bnQoMSksCiAgICAgICAgICAgY3VyT3BlbkNvdW50KDApLAogICAgICAgICAgIG1heEFjdGl2ZUNvdW50KDEpLAogICAgICAgICAgIGN1ckFjdGl2ZUNvdW50KDApIHt9CiAKKyAgICB2aXJ0dWFsIH5JT1Byb2ZpbGUoKSA9IGRlZmF1bHQ7CisKICAgICAvLyBGb3IgYSBQcm9maWxlIGFrYSBNaXhQb3J0LCB0YWcgbmFtZSBhbmQgbmFtZSBhcmUgZXF1aXZhbGVudC4KLSAgICB2aXJ0dWFsIGNvbnN0IFN0cmluZzggZ2V0VGFnTmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldE5hbWUoKTsgfQorICAgIHZpcnR1YWwgY29uc3Qgc3RkOjpzdHJpbmcgZ2V0VGFnTmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldE5hbWUoKTsgfQorCisgICAgdmlydHVhbCB2b2lkIGFkZEF1ZGlvUHJvZmlsZShjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICZwcm9maWxlKSB7CisgICAgICAgIGFkZEF1ZGlvUHJvZmlsZUFuZFNvcnQobVByb2ZpbGVzLCBwcm9maWxlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gYXNBdWRpb1BvcnQoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxBdWRpb1BvcnQqPihjb25zdF9jYXN0PElPUHJvZmlsZSo+KHRoaXMpKTsKKyAgICB9CiAKICAgICAvLyBGSVhNRTogdGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBzaGFyZWQgTU1BUCBzdHJlYW0gY2xpZW50cyB1c2UgdGhlIHNhbWUgYXVkaW8gc2Vzc2lvbi4KICAgICAvLyBPbmNlIGNhcHR1cmUgY2xpZW50cyBhcmUgdHJhY2tlZCBpbmRpdmlkdWFsbHkgYW5kIG5vdCBwZXIgc2Vzc2lvbiB0aGlzIGNhbiBiZSByZW1vdmVkCkBAIC01MSwxOCArNjMsMzEgQEAKICAgICAvLyBmbGFncyBhcmUgcGFyc2VkIGJlZm9yZSBtYXhBY3RpdmVDb3VudCBieSB0aGUgc2VyaWFsaXplci4KICAgICB2b2lkIHNldEZsYWdzKHVpbnQzMl90IGZsYWdzKSBvdmVycmlkZQogICAgIHsKLSAgICAgICAgQXVkaW9Qb3J0OjpzZXRGbGFncyhmbGFncyk7CisgICAgICAgIFBvbGljeUF1ZGlvUG9ydDo6c2V0RmxhZ3MoZmxhZ3MpOwogICAgICAgICBpZiAoZ2V0Um9sZSgpID09IEFVRElPX1BPUlRfUk9MRV9TSU5LICYmIChmbGFncyAmIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSkgIT0gMCkgewogICAgICAgICAgICAgbWF4QWN0aXZlQ291bnQgPSAwOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgaW5wdXQgYW5kIGRpcmVjdCBvdXRwdXQsIGFuZCBpcyBub3QgdXNlZCBmb3Igb3RoZXIgb3V0cHV0LgotICAgIC8vIElmIHBhcmFtZXRlciB1cGRhdGVkU2FtcGxpbmdSYXRlIGlzIG5vbi1OVUxMLCBpdCBpcyBhc3NpZ25lZCB0aGUgYWN0dWFsIHNhbXBsZSByYXRlLgotICAgIC8vIEZvciBpbnB1dCwgZmxhZ3MgaXMgaW50ZXJwcmV0ZWQgYXMgYXVkaW9faW5wdXRfZmxhZ3NfdC4KLSAgICAvLyBUT0RPOiBtZXJnZSBhdWRpb19vdXRwdXRfZmxhZ3NfdCBhbmQgYXVkaW9faW5wdXRfZmxhZ3NfdC4KLSAgICBib29sIGlzQ29tcGF0aWJsZVByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgaXNDb21wYXRpYmxlUHJvZmlsZTogVGhpcyBtZXRob2QgaXMgdXNlZCBmb3IgaW5wdXQgYW5kIGRpcmVjdCBvdXRwdXQsCisgICAgICogYW5kIGlzIG5vdCB1c2VkIGZvciBvdGhlciBvdXRwdXQuCisgICAgICogQ2hlY2tzIGlmIHRoZSBJTyBwcm9maWxlIGlzIGNvbXBhdGlibGUgd2l0aCBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAgICAgKiBGb3IgaW5wdXQsIGZsYWdzIGlzIGludGVycHJldGVkIGFzIGF1ZGlvX2lucHV0X2ZsYWdzX3QuCisgICAgICogVE9ETzogbWVyZ2UgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgYW5kIGF1ZGlvX2lucHV0X2ZsYWdzX3QuCisgICAgICoKKyAgICAgKiBAcGFyYW0gZGV2aWNlcyB2ZWN0b3Igb2YgZGV2aWNlcyB0byBiZSBjaGVja2VkIGZvciBjb21wYXRpYmlsaXR5CisgICAgICogQHBhcmFtIHNhbXBsaW5nUmF0ZSB0byBiZSBjaGVja2VkIGZvciBjb21wYXRpYmlsaXR5LiBNdXN0IGJlIHNwZWNpZmllZAorICAgICAqIEBwYXJhbSB1cGRhdGVkU2FtcGxpbmdSYXRlIGlmIG5vbi1OVUxMLCBpdCBpcyBhc3NpZ25lZCB0aGUgYWN0dWFsIHNhbXBsZSByYXRlLgorICAgICAqIEBwYXJhbSBmb3JtYXQgdG8gYmUgY2hlY2tlZCBmb3IgY29tcGF0aWJpbGl0eS4gTXVzdCBiZSBzcGVjaWZpZWQKKyAgICAgKiBAcGFyYW0gdXBkYXRlZEZvcm1hdCBpZiBub24tTlVMTCwgaXQgaXMgYXNzaWduZWQgdGhlIGFjdHVhbCBmb3JtYXQKKyAgICAgKiBAcGFyYW0gY2hhbm5lbE1hc2sgdG8gYmUgY2hlY2tlZCBmb3IgY29tcGF0aWJpbGl0eS4gTXVzdCBiZSBzcGVjaWZpZWQKKyAgICAgKiBAcGFyYW0gdXBkYXRlZENoYW5uZWxNYXNrIGlmIG5vbi1OVUxMLCBpdCBpcyBhc3NpZ25lZCB0aGUgYWN0dWFsIGNoYW5uZWwgbWFzaworICAgICAqIEBwYXJhbSBmbGFncyB0byBiZSBjaGVja2VkIGZvciBjb21wYXRpYmlsaXR5CisgICAgICogQHBhcmFtIGV4YWN0TWF0Y2hSZXF1aXJlZEZvcklucHV0RmxhZ3MgdHJ1ZSBpZiBleGFjdCBtYXRjaCBpcyByZXF1aXJlZCBvbiBmbGFncworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgcHJvZmlsZSBpcyBjb21wYXRpYmxlLCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgYm9vbCBpc0NvbXBhdGlibGVQcm9maWxlKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdXBkYXRlZFNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LApAQCAtNzMsNTQgKzk4LDYzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4YWN0TWF0Y2hSZXF1aXJlZEZvcklucHV0RmxhZ3MgPSBmYWxzZSkgY29uc3Q7CiAKLSAgICB2b2lkIGR1bXAoaW50IGZkKTsKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdDsKICAgICB2b2lkIGxvZygpOwogCiAgICAgYm9vbCBoYXNTdXBwb3J0ZWREZXZpY2VzKCkgY29uc3QgeyByZXR1cm4gIW1TdXBwb3J0ZWREZXZpY2VzLmlzRW1wdHkoKTsgfQogCi0gICAgYm9vbCBzdXBwb3J0RGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0CisgICAgYm9vbCBzdXBwb3J0c0RldmljZVR5cGVzKGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzKSBjb25zdAogICAgIHsKLSAgICAgICAgaWYgKGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKGRldmljZSkpIHsKLSAgICAgICAgICAgIHJldHVybiBtU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlOworICAgICAgICBjb25zdCBib29sIGFyZU91dHB1dERldmljZXMgPSBJbnRlcnNlY3Rpb24oZGV2aWNlVHlwZXMsIGdldEF1ZGlvRGV2aWNlSW5BbGxTZXQoKSkuZW1wdHkoKTsKKyAgICAgICAgY29uc3QgYm9vbCBkZXZpY2VzU3VwcG9ydGVkID0gIW1TdXBwb3J0ZWREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZXMoZGV2aWNlVHlwZXMpLmVtcHR5KCk7CisgICAgICAgIHJldHVybiBkZXZpY2VzU3VwcG9ydGVkICYmCisgICAgICAgICAgICAgICAoIWFyZU91dHB1dERldmljZXMgfHwgZGV2aWNlc1N1cHBvcnRFbmNvZGVkRm9ybWF0cyhkZXZpY2VUeXBlcykpOworICAgIH0KKworICAgIC8qKgorICAgICAqIEBicmllZiBzdXBwb3J0c0RldmljZQorICAgICAqIEBwYXJhbSBkZXZpY2UgdG8gYmUgY2hlY2tlZCBhZ2FpbnN0CisgICAgICogICAgICAgIGZvcmNlQ2hlY2tPbkFkZHJlc3MgaWYgdHJ1ZSwgY2hlY2sgb24gdHlwZSBhbmQgYWRkcmVzcyB3aGF0ZXZlciB0aGUgdHlwZSwgb3RoZXJ3aXNlCisgICAgICogICAgICAgIHRoZSBhZGRyZXNzIGVuZm9yY2VtZW50IGlzIGxpbWl0ZWQgdG8gIm9mZmljYWwgZGV2aWNlcyIgdGhhdCBkaXN0aW5ndWlzaGUgb24gYWRkcmVzcworICAgICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZGV2aWNlIGlzIHN1cHBvcnRlZCBieSB0eXBlIChmb3Igbm9uIGJ1cyAvIHJlbW90ZSBzdWJtaXggZGV2aWNlcyksCisgICAgICogICAgICAgICB0cnVlIGlmIHRoZSBkZXZpY2UgaXMgc3VwcG9ydGVkIChib3RoIHR5cGUgYW5kIGFkZHJlc3MpIGZvciBidXMgLyByZW1vdGUgc3VibWl4CisgICAgICogICAgICAgICBmYWxzZSBvdGhlcndpc2UKKyAgICAgKi8KKyAgICBib29sIHN1cHBvcnRzRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsIGJvb2wgZm9yY2VDaGVja09uQWRkcmVzcyA9IGZhbHNlKSBjb25zdAorICAgIHsKKyAgICAgICAgaWYgKCFkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZS0+dHlwZSgpKSAmJiAhZm9yY2VDaGVja09uQWRkcmVzcykgeworICAgICAgICAgICAgcmV0dXJuIHN1cHBvcnRzRGV2aWNlVHlwZXMoRGV2aWNlVHlwZVNldCh7ZGV2aWNlLT50eXBlKCl9KSk7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1TdXBwb3J0ZWREZXZpY2VzLnR5cGVzKCkgJiAoZGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pOworICAgICAgICByZXR1cm4gbVN1cHBvcnRlZERldmljZXMuY29udGFpbnMoZGV2aWNlKTsKICAgICB9CiAKLSAgICBib29sIHN1cHBvcnREZXZpY2VBZGRyZXNzKGNvbnN0IFN0cmluZzggJmFkZHJlc3MpIGNvbnN0CisgICAgYm9vbCBkZXZpY2VzU3VwcG9ydEVuY29kZWRGb3JtYXRzKERldmljZVR5cGVTZXQgZGV2aWNlVHlwZXMpIGNvbnN0CiAgICAgewotICAgICAgICByZXR1cm4gbVN1cHBvcnRlZERldmljZXNbMF0tPm1BZGRyZXNzID09IGFkZHJlc3M7Ci0gICAgfQotCi0gICAgLy8gY2hvc2UgZmlyc3QgZGV2aWNlIHByZXNlbnQgaW4gbVN1cHBvcnRlZERldmljZXMgYWxzbyBwYXJ0IG9mIGRldmljZVR5cGUKLSAgICBhdWRpb19kZXZpY2VzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlRm9yVHlwZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrICA8IG1TdXBwb3J0ZWREZXZpY2VzLnNpemUoKTsgaysrKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJvZmlsZVR5cGUgPSBtU3VwcG9ydGVkRGV2aWNlc1trXS0+dHlwZSgpOwotICAgICAgICAgICAgaWYgKHByb2ZpbGVUeXBlICYgZGV2aWNlVHlwZSkgewotICAgICAgICAgICAgICAgIHJldHVybiBwcm9maWxlVHlwZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZVR5cGVzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOyAvLyByZXF1aXJlZCBmb3IgaXNPZmZsb2FkU3VwcG9ydGVkKCkgY2hlY2sKICAgICAgICAgfQotICAgICAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0KKyAgICAgICAgICAgIG1TdXBwb3J0ZWREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZXMoZGV2aWNlVHlwZXMpOworICAgICAgICBpZiAoIWRldmljZUxpc3QuZW1wdHkoKSkgeworICAgICAgICAgICAgcmV0dXJuIGRldmljZUxpc3QuaXRlbUF0KDApLT5oYXNDdXJyZW50RW5jb2RlZEZvcm1hdCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBhdWRpb19kZXZpY2VzX3QgZ2V0U3VwcG9ydGVkRGV2aWNlc1R5cGUoKSBjb25zdCB7IHJldHVybiBtU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpOyB9Ci0KICAgICB2b2lkIGNsZWFyU3VwcG9ydGVkRGV2aWNlcygpIHsgbVN1cHBvcnRlZERldmljZXMuY2xlYXIoKTsgfQogICAgIHZvaWQgYWRkU3VwcG9ydGVkRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpCiAgICAgewogICAgICAgICBtU3VwcG9ydGVkRGV2aWNlcy5hZGQoZGV2aWNlKTsKICAgICB9Ci0KKyAgICB2b2lkIHJlbW92ZVN1cHBvcnRlZERldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlKQorICAgIHsKKyAgICAgICAgbVN1cHBvcnRlZERldmljZXMucmVtb3ZlKGRldmljZSk7CisgICAgfQogICAgIHZvaWQgc2V0U3VwcG9ydGVkRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpCiAgICAgewogICAgICAgICBtU3VwcG9ydGVkRGV2aWNlcyA9IGRldmljZXM7CiAgICAgfQogCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0U3VwcG9ydGVkRGV2aWNlQnlBZGRyZXNzKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBTdHJpbmc4IGFkZHJlc3MpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbVN1cHBvcnRlZERldmljZXMuZ2V0RGV2aWNlKHR5cGUsIGFkZHJlc3MpOwotICAgIH0KLQogICAgIGNvbnN0IERldmljZVZlY3RvciAmZ2V0U3VwcG9ydGVkRGV2aWNlcygpIGNvbnN0IHsgcmV0dXJuIG1TdXBwb3J0ZWREZXZpY2VzOyB9CiAKICAgICBib29sIGNhbk9wZW5OZXdJbygpIHsKQEAgLTE1OCwxMyArMTkyLDEzIEBACiBjbGFzcyBJbnB1dFByb2ZpbGUgOiBwdWJsaWMgSU9Qcm9maWxlCiB7CiBwdWJsaWM6Ci0gICAgZXhwbGljaXQgSW5wdXRQcm9maWxlKGNvbnN0IFN0cmluZzggJm5hbWUpIDogSU9Qcm9maWxlKG5hbWUsIEFVRElPX1BPUlRfUk9MRV9TSU5LKSB7fQorICAgIGV4cGxpY2l0IElucHV0UHJvZmlsZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgOiBJT1Byb2ZpbGUobmFtZSwgQVVESU9fUE9SVF9ST0xFX1NJTkspIHt9CiB9OwogCiBjbGFzcyBPdXRwdXRQcm9maWxlIDogcHVibGljIElPUHJvZmlsZQogewogcHVibGljOgotICAgIGV4cGxpY2l0IE91dHB1dFByb2ZpbGUoY29uc3QgU3RyaW5nOCAmbmFtZSkgOiBJT1Byb2ZpbGUobmFtZSwgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSkge30KKyAgICBleHBsaWNpdCBPdXRwdXRQcm9maWxlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSA6IElPUHJvZmlsZShuYW1lLCBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7fQogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL0lWb2x1bWVDdXJ2ZXMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ4YjgxYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzLmgKQEAgLTAsMCArMSw0NyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8Vm9sdW1lLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db250YWluZXJzLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBJVm9sdW1lQ3VydmVzCit7CitwdWJsaWM6CisgICAgdmlydHVhbCB+SVZvbHVtZUN1cnZlcygpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCkgPSAwOworICAgIHZpcnR1YWwgYm9vbCBjYW5CZU11dGVkKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4TWluKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4KGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZSkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4TWF4KCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgZmxvYXQgdm9sSW5kZXhUb0RiKGRldmljZV9jYXRlZ29yeSBkZXZpY2UsIGludCBpbmRleEluVWkpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaGFzVm9sdW1lSW5kZXhGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFZvbHVtZShpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCkgPSAwOworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8YXVkaW9fYXR0cmlidXRlc190PiBnZXRBdHRyaWJ1dGVzKCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8YXVkaW9fc3RyZWFtX3R5cGVfdD4gZ2V0U3RyZWFtVHlwZXMoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCwgYm9vbCBjdXJ2ZVBvaW50cyA9IGZhbHNlKSBjb25zdCA9IDA7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24uaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWY2YjA4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9JVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8Vm9sdW1lLmg+Ci0jaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24KLXsKLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5JVm9sdW1lQ3VydmVzQ29sbGVjdGlvbigpID0gZGVmYXVsdDsKLQotICAgIHZpcnR1YWwgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBhZGRDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpID0gMDsKLSAgICB2aXJ0dWFsIGJvb2wgY2FuQmVNdXRlZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgPSAwOwotICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4TWluKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCBpbnQgZ2V0Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpID0gMDsKLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1heChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgZmxvYXQgdm9sSW5kZXhUb0RiKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleEluVWkpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KSA9IDA7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcyhib29sIC8qaXNTcGVha2VyRHJjRW5hYmxlZCovKSB7fQotICAgIHZpcnR1YWwgdm9pZCBzd2l0Y2hWb2x1bWVDdXJ2ZShhdWRpb19zdHJlYW1fdHlwZV90IHNyYywgYXVkaW9fc3RyZWFtX3R5cGVfdCBkc3QpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgcmVzdG9yZU9yaWdpblZvbHVtZUN1cnZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotICAgIHsKLSAgICAgICAgc3dpdGNoVm9sdW1lQ3VydmUoc3RyZWFtLCBzdHJlYW0pOwotICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wgaGFzVm9sdW1lSW5kZXhGb3JEZXZpY2UoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpIGNvbnN0ID0gMDsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Qb2xpY3lBdWRpb1BvcnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9Qb2xpY3lBdWRpb1BvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWRmM2MwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1BvbGljeUF1ZGlvUG9ydC5oCkBAIC0wLDAgKzEsMTUzIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlICJBdWRpb0NvbGxlY3Rpb25zLmgiCisjaW5jbHVkZSAiQXVkaW9Qcm9maWxlVmVjdG9ySGVscGVyLmgiCisjaW5jbHVkZSAiSGFuZGxlR2VuZXJhdG9yLmgiCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9HYWluLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb3J0Lmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgSHdNb2R1bGU7CitjbGFzcyBBdWRpb1JvdXRlOworCitjbGFzcyBQb2xpY3lBdWRpb1BvcnQgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlLCBwcml2YXRlIEhhbmRsZUdlbmVyYXRvcjxhdWRpb19wb3J0X2hhbmRsZV90PgoreworcHVibGljOgorICAgIFBvbGljeUF1ZGlvUG9ydCgpIDogbUZsYWdzKEFVRElPX09VVFBVVF9GTEFHX05PTkUpIHt9CisKKyAgICB2aXJ0dWFsIH5Qb2xpY3lBdWRpb1BvcnQoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIGNvbnN0IHN0ZDo6c3RyaW5nIGdldFRhZ05hbWUoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHNwPEF1ZGlvUG9ydD4gYXNBdWRpb1BvcnQoKSBjb25zdCA9IDA7CisKKyAgICB2aXJ0dWFsIHZvaWQgc2V0RmxhZ3ModWludDMyX3QgZmxhZ3MpCisgICAgeworICAgICAgICAvL2ZvcmNlIGRpcmVjdCBmbGFnIGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQ6IG9mZmxvYWRpbmcgaW1wbGllcyBhIGRpcmVjdCBvdXRwdXQgc3RyZWFtCisgICAgICAgIC8vIGFuZCBhbGwgY29tbW9uIGJlaGF2aW9ycyBhcmUgZHJpdmVuIGJ5IGNoZWNraW5nIG9ubHkgdGhlIGRpcmVjdCBmbGFnCisgICAgICAgIC8vIHRoaXMgc2hvdWxkIG5vcm1hbGx5IGJlIHNldCBhcHByb3ByaWF0ZWx5IGluIHRoZSBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlCisgICAgICAgIGlmIChhc0F1ZGlvUG9ydCgpLT5nZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRSAmJgorICAgICAgICAgICAgICAgIChmbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICE9IDApIHsKKyAgICAgICAgICAgIGZsYWdzIHw9IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVDsKKyAgICAgICAgfQorICAgICAgICBtRmxhZ3MgPSBmbGFnczsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBtRmxhZ3M7IH0KKworICAgIHZpcnR1YWwgdm9pZCBhdHRhY2goY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpOworICAgIHZpcnR1YWwgdm9pZCBkZXRhY2goKTsKKyAgICBib29sIGlzQXR0YWNoZWQoKSB7IHJldHVybiBtTW9kdWxlICE9IDA7IH0KKworICAgIC8vIEF1ZGlvIHBvcnQgSURzIGFyZSBpbiBhIGRpZmZlcmVudCBuYW1lc3BhY2UgdGhhbiBBdWRpb0ZsaW5nZXIgdW5pcXVlIElEcworICAgIHN0YXRpYyBhdWRpb19wb3J0X2hhbmRsZV90IGdldE5leHRVbmlxdWVJZCgpOworCisgICAgLy8gc2VhcmNoZXMgZm9yIGFuIGV4YWN0IG1hdGNoCisgICAgdmlydHVhbCBzdGF0dXNfdCBjaGVja0V4YWN0QXVkaW9Qcm9maWxlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSBjb25zdDsKKworICAgIC8vIHNlYXJjaGVzIGZvciBhIGNvbXBhdGlibGUgbWF0Y2gsIGN1cnJlbnRseSBpbXBsZW1lbnRlZCBmb3IgaW5wdXQKKyAgICAvLyBwYXJhbWV0ZXJzIGFyZSBpbnB1dHxvdXRwdXQsIHJldHVybmVkIHZhbHVlIGlzIHRoZSBiZXN0IG1hdGNoLgorICAgIHN0YXR1c190IGNoZWNrQ29tcGF0aWJsZUF1ZGlvUHJvZmlsZSh1aW50MzJfdCAmc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAmY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICZmb3JtYXQpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gY2hlY2tDb21wYXRpYmxlUHJvZmlsZSgKKyAgICAgICAgICAgICAgICBhc0F1ZGlvUG9ydCgpLT5nZXRBdWRpb1Byb2ZpbGVzKCksIHNhbXBsaW5nUmF0ZSwgY2hhbm5lbE1hc2ssIGZvcm1hdCwKKyAgICAgICAgICAgICAgICBhc0F1ZGlvUG9ydCgpLT5nZXRUeXBlKCksIGFzQXVkaW9Qb3J0KCktPmdldFJvbGUoKSk7CisgICAgfQorCisgICAgdm9pZCBwaWNrQXVkaW9Qcm9maWxlKHVpbnQzMl90ICZzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICZjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgJmZvcm1hdCkgY29uc3Q7CisKKyAgICBzdGF0aWMgY29uc3QgYXVkaW9fZm9ybWF0X3Qgc1BjbUZvcm1hdENvbXBhcmVUYWJsZVtdOworCisgICAgc3RhdGljIGludCBjb21wYXJlRm9ybWF0cyhhdWRpb19mb3JtYXRfdCBmb3JtYXQxLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQyKTsKKworICAgIC8vIFVzZWQgdG8gc2VsZWN0IGFuIGF1ZGlvIEhBTCBvdXRwdXQgc3RyZWFtIHdpdGggYSBzYW1wbGUgZm9ybWF0IHByb3ZpZGluZyB0aGUKKyAgICAvLyBsZXNzIGRlZ3JhZGF0aW9uIGZvciBhIGdpdmVuIEF1ZGlvVHJhY2sgc2FtcGxlIGZvcm1hdC4KKyAgICBzdGF0aWMgYm9vbCBpc0JldHRlckZvcm1hdE1hdGNoKGF1ZGlvX2Zvcm1hdF90IG5ld0Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGN1cnJlbnRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCB0YXJnZXRGb3JtYXQpOworICAgIHN0YXRpYyB1aW50MzJfdCBmb3JtYXREaXN0YW5jZShhdWRpb19mb3JtYXRfdCBmb3JtYXQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQyKTsKKyAgICBzdGF0aWMgY29uc3QgdWludDMyX3Qga0Zvcm1hdERpc3RhbmNlTWF4ID0gNDsKKworICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBnZXRNb2R1bGVIYW5kbGUoKSBjb25zdDsKKyAgICB1aW50MzJfdCBnZXRNb2R1bGVWZXJzaW9uTWFqb3IoKSBjb25zdDsKKyAgICBjb25zdCBjaGFyICpnZXRNb2R1bGVOYW1lKCkgY29uc3Q7CisgICAgc3A8SHdNb2R1bGU+IGdldE1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIG1Nb2R1bGU7IH0KKworICAgIGlubGluZSBib29sIGlzRGlyZWN0T3V0cHV0KCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiAoYXNBdWRpb1BvcnQoKS0+Z2V0VHlwZSgpID09IEFVRElPX1BPUlRfVFlQRV9NSVgpICYmCisgICAgICAgICAgICAgICAgKGFzQXVkaW9Qb3J0KCktPmdldFJvbGUoKSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSAmJgorICAgICAgICAgICAgICAgIChtRmxhZ3MgJiAoQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkpOworICAgIH0KKworICAgIHZvaWQgYWRkUm91dGUoY29uc3Qgc3A8QXVkaW9Sb3V0ZT4gJnJvdXRlKSB7IG1Sb3V0ZXMuYWRkKHJvdXRlKTsgfQorICAgIGNvbnN0IEF1ZGlvUm91dGVWZWN0b3IgJmdldFJvdXRlcygpIGNvbnN0IHsgcmV0dXJuIG1Sb3V0ZXM7IH0KKworcHJpdmF0ZToKKyAgICB2b2lkIHBpY2tDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAmY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2hhbm5lbE1hc2tTZXQgJmNoYW5uZWxNYXNrcykgY29uc3Q7CisgICAgdm9pZCBwaWNrU2FtcGxpbmdSYXRlKHVpbnQzMl90ICZyYXRlLCBjb25zdCBTYW1wbGVSYXRlU2V0ICZzYW1wbGluZ1JhdGVzKSBjb25zdDsKKworICAgIHVpbnQzMl90IG1GbGFnczsgLy8gYXR0cmlidXRlIGZsYWdzIG1hc2sgKGUuZyBwcmltYXJ5IG91dHB1dCwgZGlyZWN0IG91dHB1dC4uLikuCisgICAgc3A8SHdNb2R1bGU+IG1Nb2R1bGU7ICAgICAvLyBhdWRpbyBIVyBtb2R1bGUgZXhwb3NpbmcgdGhpcyBJL08gc3RyZWFtCisgICAgQXVkaW9Sb3V0ZVZlY3RvciBtUm91dGVzOyAvLyBSb3V0ZXMgaW52b2x2aW5nIHRoaXMgcG9ydAorfTsKKworY2xhc3MgUG9saWN5QXVkaW9Qb3J0Q29uZmlnIDogcHVibGljIHZpcnR1YWwgUmVmQmFzZQoreworcHVibGljOgorICAgIHZpcnR1YWwgflBvbGljeUF1ZGlvUG9ydENvbmZpZygpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgc3A8UG9saWN5QXVkaW9Qb3J0PiBnZXRQb2xpY3lBdWRpb1BvcnQoKSBjb25zdCA9IDA7CisKKyAgICBzdGF0dXNfdCB2YWxpZGF0aW9uQmVmb3JlQXBwbHlDb25maWcoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcpIGNvbnN0OworCisgICAgdm9pZCBhcHBseVBvbGljeUF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgeworICAgICAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTKSB7CisgICAgICAgICAgICBtRmxhZ3MgPSBjb25maWctPmZsYWdzOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCB0b1BvbGljeUF1ZGlvUG9ydENvbmZpZygKKyAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcgPSBOVUxMKSBjb25zdDsKKworCisgICAgdmlydHVhbCBib29sIGhhc1NhbWVId01vZHVsZUFzKGNvbnN0IHNwPFBvbGljeUF1ZGlvUG9ydENvbmZpZz4mIG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiAob3RoZXIuZ2V0KCkgIT0gbnVsbHB0cikgJiYgKG90aGVyLT5nZXRQb2xpY3lBdWRpb1BvcnQoKS5nZXQoKSAhPSBudWxscHRyKSAmJgorICAgICAgICAgICAgICAgIChnZXRQb2xpY3lBdWRpb1BvcnQoKS5nZXQoKSAhPSBudWxscHRyKSAmJgorICAgICAgICAgICAgICAgIChvdGhlci0+Z2V0UG9saWN5QXVkaW9Qb3J0KCktPmdldE1vZHVsZUhhbmRsZSgpID09CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRQb2xpY3lBdWRpb1BvcnQoKS0+Z2V0TW9kdWxlSGFuZGxlKCkpOworICAgIH0KKworICAgIHVuaW9uIGF1ZGlvX2lvX2ZsYWdzIG1GbGFncyA9IHsgQVVESU9fSU5QVVRfRkxBR19OT05FIH07Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2VyaWFsaXplci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1NlcmlhbGl6ZXIuaAppbmRleCAyOWRlODQ4Li40OGM0MTQ3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2VyaWFsaXplci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TZXJpYWxpemVyLmgKQEAgLTE3LDIyMyArMTcsOSBAQAogI3ByYWdtYSBvbmNlCiAKICNpbmNsdWRlICJBdWRpb1BvbGljeUNvbmZpZy5oIgotI2luY2x1ZGUgPHV0aWxzL1N0cm9uZ1BvaW50ZXIuaD4KLSNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KLSNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHNzdHJlYW0+Ci0jaW5jbHVkZSA8ZnN0cmVhbT4KLQotc3RydWN0IF94bWxOb2RlOwotc3RydWN0IF94bWxEb2M7CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RydWN0IEF1ZGlvR2FpblRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbW9kZVtdOyAvKio8IGdhaW4gbW9kZXMgc3VwcG9ydGVkLCBlLmcuIEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUy4gKi8KLSAgICAgICAgLyoqIGNvbnRyb2xsZWQgY2hhbm5lbHMsIG5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9DSEFOTkVMUy4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgY2hhbm5lbE1hc2tbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWluVmFsdWVNQltdOyAvKio8IG1pbiB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWF4VmFsdWVNQltdOyAvKio8IG1heCB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZGVmYXVsdFZhbHVlTUJbXTsgLyoqPCBkZWZhdWx0IHZhbHVlIGluIG1pbGxpYmVsLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBzdGVwVmFsdWVNQltdOyAvKio8IHN0ZXAgdmFsdWUgaW4gbWlsbGliZWwuICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG1pblJhbXBNc1tdOyAvKio8IG5lZWRlZCBpZiBtb2RlIEFVRElPX0dBSU5fTU9ERV9SQU1QLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtYXhSYW1wTXNbXTsgLyoqPCAubmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX1JBTVAgKi8KLSAgICB9OwotCi0gICAgdHlwZWRlZiBBdWRpb0dhaW4gRWxlbWVudDsKLSAgICB0eXBlZGVmIHNwPEVsZW1lbnQ+IFB0ckVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBBdWRpb0dhaW5Db2xsZWN0aW9uIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiB2b2lkICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwotCi0gICAgLy8gR2FpbiBoYXMgbm8gY2hpbGQKLX07Ci0KLS8vIEEgcHJvZmlsZSBzZWN0aW9uIGNvbnRhaW5zIGEgbmFtZSwgIG9uZSBhdWRpbyBmb3JtYXQgYW5kIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcwotLy8gYW5kIGNoYW5uZWwgbWFza3MgZm9yIHRoaXMgZm9ybWF0Ci1zdHJ1Y3QgQXVkaW9Qcm9maWxlVHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBuYW1lW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHNhbXBsaW5nUmF0ZXNbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgZm9ybWF0W107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGNoYW5uZWxNYXNrc1tdOwotICAgIH07Ci0KLSAgICB0eXBlZGVmIEF1ZGlvUHJvZmlsZSBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8QXVkaW9Qcm9maWxlPiBQdHJFbGVtZW50OwotICAgIHR5cGVkZWYgQXVkaW9Qcm9maWxlVmVjdG9yIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiB2b2lkICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwotfTsKLQotc3RydWN0IE1peFBvcnRUcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBjb2xsZWN0aW9uVGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIG5hbWVbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgcm9sZVtdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBmbGFnc1tdOwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBtYXhPcGVuQ291bnRbXTsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgbWF4QWN0aXZlQ291bnRbXTsKLSAgICB9OwotCi0gICAgdHlwZWRlZiBJT1Byb2ZpbGUgRWxlbWVudDsKLSAgICB0eXBlZGVmIHNwPEVsZW1lbnQ+IFB0ckVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBJT1Byb2ZpbGVDb2xsZWN0aW9uIENvbGxlY3Rpb247Ci0gICAgdHlwZWRlZiB2b2lkICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOwotCi0gICAgLy8gQ2hpbGRyZW4gYXJlOiBHYWluVHJhaXRzCi19OwotCi1zdHJ1Y3QgRGV2aWNlUG9ydFRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgdGFnTmFtZVtdOyAvKio8ICA8ZGV2aWNlIHRhZyBuYW1lPjogYW55IHN0cmluZyB3aXRob3V0IHNwYWNlLiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciB0eXBlW107IC8qKjwgPGRldmljZSB0eXBlPi4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgcm9sZVtdOyAvKio8IDxkZXZpY2Ugcm9sZTogc2luayBvciBzb3VyY2U+LiAqLwotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciByb2xlU291cmNlW107IC8qKjwgPGF0dHJpYnV0ZSByb2xlIHNvdXJjZSB2YWx1ZT4uICovCi0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGFkZHJlc3NbXTsgLyoqPCBvcHRpb25hbDogZGV2aWNlIGFkZHJlc3MsIGNoYXIgc3RyaW5nIGxlc3MgdGhhbiA2NC4gKi8KLSAgICB9OwotICAgIHR5cGVkZWYgRGV2aWNlRGVzY3JpcHRvciBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8RGV2aWNlRGVzY3JpcHRvcj4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIERldmljZVZlY3RvciBDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgdm9pZCAqUHRyU2VyaWFsaXppbmdDdHg7Ci0KLSAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKLSAgICAvLyBDaGlsZHJlbiBhcmU6IEdhaW5UcmFpdHMgKG9wdGlvbm5hbCkKLX07Ci0KLXN0cnVjdCBSb3V0ZVRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgdHlwZVtdOyAvKio8IDxyb3V0ZSB0eXBlPjogbWl4IG9yIG11eC4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgdHlwZU1peFtdOyAvKio8IHR5cGUgYXR0cmlidXRlIG1peCB2YWx1ZS4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc2lua1tdOyAvKio8IDxzaW5rOiBpbnZvbHZlZCBpbiB0aGlzIHJvdXRlPi4gKi8KLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc291cmNlc1tdOyAvKio8IHNvdXJjZXM6IGFsbCBzb3VyY2UgdGhhdCBjYW4gYmUgaW52b2x2ZWQgaW4gdGhpcyByb3V0ZS4gKi8KLSAgICB9OwotICAgIHR5cGVkZWYgQXVkaW9Sb3V0ZSBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8QXVkaW9Sb3V0ZT4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIEF1ZGlvUm91dGVWZWN0b3IgQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIEh3TW9kdWxlICpQdHJTZXJpYWxpemluZ0N0eDsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBQdHJFbGVtZW50ICZlbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBjdHgpOwotfTsKLQotc3RydWN0IE1vZHVsZVRyYWl0cwotewotICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCB0YWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNvbGxlY3Rpb25UYWc7Ci0KLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY2hpbGRBdHRhY2hlZERldmljZXNUYWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNoaWxkQXR0YWNoZWREZXZpY2VUYWc7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZzsKLQotICAgIHN0cnVjdCBBdHRyaWJ1dGVzCi0gICAgewotICAgICAgICBzdGF0aWMgY29uc3QgY2hhciBuYW1lW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHZlcnNpb25bXTsKLSAgICB9OwotCi0gICAgdHlwZWRlZiBId01vZHVsZSBFbGVtZW50OwotICAgIHR5cGVkZWYgc3A8RWxlbWVudD4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIEh3TW9kdWxlQ29sbGVjdGlvbiBDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgQXVkaW9Qb2xpY3lDb25maWcgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Ci0KLSAgICAvLyBDaGlsZHJlbiBhcmU6IG1peFBvcnRUcmFpdHMsIGRldmljZVBvcnRUcmFpdHMgYW5kIHJvdXRlVHJhaXRzCi0gICAgLy8gTmVlZCB0byBjYWxsIGRlc2VyaWFsaXplIG9uIGVhY2ggY2hpbGQKLX07Ci0KLXN0cnVjdCBHbG9iYWxDb25maWdUcmFpdHMKLXsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdGFnOwotCi0gICAgc3RydWN0IEF0dHJpYnV0ZXMKLSAgICB7Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHNwZWFrZXJEcmNFbmFibGVkW107Ci0gICAgfTsKLQotICAgIHN0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZShjb25zdCBfeG1sTm9kZSAqcm9vdCwgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZyk7Ci19OwotCi1zdHJ1Y3QgVm9sdW1lVHJhaXRzCi17Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IHRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgY29sbGVjdGlvblRhZzsKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgdm9sdW1lUG9pbnRUYWc7Ci0KLSAgICBzdHJ1Y3QgQXR0cmlidXRlcwotICAgIHsKLSAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIgc3RyZWFtW107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIGRldmljZUNhdGVnb3J5W107Ci0gICAgICAgIHN0YXRpYyBjb25zdCBjaGFyIHJlZmVyZW5jZVtdOwotICAgIH07Ci0KLSAgICB0eXBlZGVmIFZvbHVtZUN1cnZlIEVsZW1lbnQ7Ci0gICAgdHlwZWRlZiBzcDxWb2x1bWVDdXJ2ZT4gUHRyRWxlbWVudDsKLSAgICB0eXBlZGVmIFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gQ29sbGVjdGlvbjsKLSAgICB0eXBlZGVmIHZvaWQgKlB0clNlcmlhbGl6aW5nQ3R4OwotCi0gICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7Ci0KLSAgICAvLyBObyBDaGlsZAotfTsKLQotY2xhc3MgUG9saWN5U2VyaWFsaXplcgotewotcHJpdmF0ZToKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3Qgcm9vdE5hbWU7Ci0KLSAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgdmVyc2lvbkF0dHJpYnV0ZTsKLSAgICBzdGF0aWMgY29uc3QgdWludDMyX3QgZ01ham9yOyAvKio8IHRoZSBtYWpvciBudW1iZXIgb2YgdGhlIHBvbGljeSB4bWwgZm9ybWF0IHZlcnNpb24uICovCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGdNaW5vcjsgLyoqPCB0aGUgbWlub3IgbnVtYmVyIG9mIHRoZSBwb2xpY3kgeG1sIGZvcm1hdCB2ZXJzaW9uLiAqLwotCi1wdWJsaWM6Ci0gICAgUG9saWN5U2VyaWFsaXplcigpOwotICAgIHN0YXR1c190IGRlc2VyaWFsaXplKGNvbnN0IGNoYXIgKnN0ciwgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZyk7Ci0KLXByaXZhdGU6Ci0gICAgdHlwZWRlZiBBdWRpb1BvbGljeUNvbmZpZyBFbGVtZW50OwotCi0gICAgc3RkOjpzdHJpbmcgbVJvb3RFbGVtZW50TmFtZTsKLSAgICBzdGQ6OnN0cmluZyBtVmVyc2lvbjsKLQotICAgIC8vIENoaWxkcmVuIGFyZTogTW9kdWxlc1RyYWl0cywgVm9sdW1lVHJhaXRzCi19Oworc3RhdHVzX3QgZGVzZXJpYWxpemVBdWRpb1BvbGljeUZpbGUoY29uc3QgY2hhciAqZmlsZU5hbWUsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpOwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2Vzc2lvblJvdXRlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvU2Vzc2lvblJvdXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyYjQ0NDAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1Nlc3Npb25Sb3V0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLWNsYXNzIERldmljZURlc2NyaXB0b3I7Ci1jbGFzcyBEZXZpY2VWZWN0b3I7Ci0KLWNsYXNzIFNlc3Npb25Sb3V0ZSA6IHB1YmxpYyBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgLy8gRm9yIElucHV0IChTb3VyY2UpIHJvdXRlcywgdXNlIFNUUkVBTV9UWVBFX05BICgiTkEiID0gIm5vdCBhcHBsaWNhYmxlKWZvciB0aGUKLSAgICAvLyBzdHJlYW1UeXBlIGFyZ3VtZW50Ci0gICAgc3RhdGljIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgU1RSRUFNX1RZUEVfTkEgPSBBVURJT19TVFJFQU1fREVGQVVMVDsKLQotICAgIC8vIEZvciBPdXRwdXQgKFNpbmspIHJvdXRlcywgdXNlIFNPVVJDRV9UWVBFX05BICgiTkEiID0gIm5vdCBhcHBsaWNhYmxlIikgZm9yIHRoZQotICAgIC8vIHNvdXJjZSBhcmd1bWVudAotCi0gICAgc3RhdGljIGNvbnN0IGF1ZGlvX3NvdXJjZV90IFNPVVJDRV9UWVBFX05BID0gQVVESU9fU09VUkNFX0RFRkFVTFQ7Ci0KLSAgICBTZXNzaW9uUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAotICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2VEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCi0gICAgICAgIDogbVVpZCh1aWQpLAotICAgICAgICAgIG1TZXNzaW9uKHNlc3Npb24pLAotICAgICAgICAgIG1EZXZpY2VEZXNjcmlwdG9yKGRldmljZURlc2NyaXB0b3IpLAotICAgICAgICAgIG1SZWZDb3VudCgwKSwKLSAgICAgICAgICBtQWN0aXZpdHlDb3VudCgwKSwKLSAgICAgICAgICBtQ2hhbmdlZChmYWxzZSksCi0gICAgICAgICAgbVN0cmVhbVR5cGUoc3RyZWFtVHlwZSksCi0gICAgICAgICAgbVNvdXJjZShzb3VyY2UpCi0gICAge30KLQotICAgIHZvaWQgbG9nKGNvbnN0IGNoYXIqIHByZWZpeCk7Ci0KLSAgICBib29sIGlzQWN0aXZlT3JDaGFuZ2VkKCkgewotICAgICAgICByZXR1cm4gKG1EZXZpY2VEZXNjcmlwdG9yICE9IDApICYmIChtQ2hhbmdlZCB8fCAobUFjdGl2aXR5Q291bnQgPiAwKSk7Ci0gICAgfQotCi0gICAgdWlkX3QgICAgICAgICAgICAgICAgICAgICAgIG1VaWQ7Ci0gICAgYXVkaW9fc2Vzc2lvbl90ICAgICAgICAgICAgIG1TZXNzaW9uOwotICAgIHNwPERldmljZURlc2NyaXB0b3I+ICAgICAgICBtRGV2aWNlRGVzY3JpcHRvcjsKLQotICAgIC8vICJyZWZlcmVuY2UiIGNvdW50aW5nCi0gICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIG1SZWZDb3VudDsgICAgICAvLyArLy0gb24gcmVmZXJlbmNlcwotICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICBtQWN0aXZpdHlDb3VudDsgLy8gKy8tIG9uIHN0YXJ0L3N0b3AKLSAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgbUNoYW5nZWQ7Ci0gICAgLy8gZm9yIG91dHB1dHMKLSAgICBjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICAgbVN0cmVhbVR5cGU7Ci0gICAgLy8gZm9yIGlucHV0cwotICAgIGNvbnN0IGF1ZGlvX3NvdXJjZV90ICAgICAgICBtU291cmNlOwotfTsKLQotY2xhc3MgU2Vzc2lvblJvdXRlTWFwOiBwdWJsaWMgS2V5ZWRWZWN0b3I8YXVkaW9fc2Vzc2lvbl90LCBzcDxTZXNzaW9uUm91dGU+ID4KLXsKLXB1YmxpYzoKLSAgICAvLyBUaGVzZSBjb25zdGFudHMgaWRlbnRpZnkgdGhlIFNlc3Npb25Sb3V0TWFwIGFzIGhvbGRpbmcgRUlUSEVSIGlucHV0IHJvdXRlcywKLSAgICAvLyBvciBvdXRwdXQgcm91dGVzLiAgQW4gZXJyb3Igd2lsbCBvY2N1ciBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYWRkIGEgU2Vzc2lvblJvdXRlCi0gICAgLy8gb2JqZWN0IHdpdGggbVN0cmVhbVR5cGUgPT0gU1RSRUFNX1RZUEVfTkEgKGkuZS4gYW4gaW5wdXQgU2Vzc2lvblJvdXRlKSB0byBhCi0gICAgLy8gU2Vzc2lvblJvdXRNYXAgdGhhdCBpcyBtYXJrZWQgZm9yIG91dHB1dCAoaS5lLiBtTWFwVHlwZSA9PSBTRVNTSU9OX1JPVVRFX01BUF9PVVRQVVQpCi0gICAgLy8gYW5kIHNpbWlsYXJseSAgZm9yIG91dHB1dCBTZXNzaW9uUm91dGVzIGFuZCBJbnB1dCBTZXNzaW9uUm91dGVNYXBzLgotICAgIHR5cGVkZWYgZW51bQotICAgIHsKLSAgICAgICAgTUFQVFlQRV9JTlBVVCA9IDAsCi0gICAgICAgIE1BUFRZUEVfT1VUUFVUID0gMQotICAgIH0gc2Vzc2lvbl9yb3V0ZV9tYXBfdHlwZV90OwotCi0gICAgZXhwbGljaXQgU2Vzc2lvblJvdXRlTWFwKHNlc3Npb25fcm91dGVfbWFwX3R5cGVfdCBtYXBUeXBlKSA6Ci0gICAgICAgIG1NYXBUeXBlKG1hcFR5cGUpCi0gICAge30KLQotICAgIGJvb2wgaGFzUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotCi0gICAgdm9pZCByZW1vdmVSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0KLSAgICBpbnQgaW5jUm91dGVBY3Rpdml0eShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgaW50IGRlY1JvdXRlQWN0aXZpdHkoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgIGJvb2wgZ2V0QW5kQ2xlYXJSb3V0ZUNoYW5nZWQoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOyAvLyBhbHNvIGNsZWFycyB0aGUgY2hhbmdlZCBmbGFnCi0gICAgdm9pZCBsb2coY29uc3QgY2hhciogY2FwdGlvbik7Ci0gICAgYXVkaW9fZGV2aWNlc190IGdldEFjdGl2ZURldmljZUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGF2YWlsYWJsZURldmljZXMpOwotICAgIC8vIFNwZWNpZnkgYW4gT3V0cHV0KFNpbmspIHJvdXRlIGJ5IHBhc3NpbmcgU2Vzc2lvblJvdXRlOjpTT1VSQ0VfVFlQRV9OQSBpbiB0aGUKLSAgICAvLyBzb3VyY2UgYXJndW1lbnQuCi0gICAgLy8gU3BlY2lmeSBhbiBJbnB1dChTb3VyY2UpIHJvdXQgYnkgcGFzc2luZyBTZXNzaW9uUm91dGU6OkFVRElPX1NUUkVBTV9ERUZBVUxUCi0gICAgLy8gaW4gdGhlIHN0cmVhbVR5cGUgYXJndW1lbnQuCi0gICAgdm9pZCBhZGRSb3V0ZShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2VEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKLQotcHJpdmF0ZToKLSAgICAvLyBVc2VkIHRvIG1hcmsgYSBTZXNzaW9uUm91dGUgYXMgZm9yIGVpdGhlciBpbnB1dHMgKG1NYXBUeXBlID09IGtTZXNzaW9uUm91dGVNYXBfSW5wdXQpCi0gICAgLy8gb3Igb3V0cHV0cyAobU1hcFR5cGUgPT0ga1Nlc3Npb25Sb3V0ZU1hcF9PdXRwdXQpCi0gICAgY29uc3Qgc2Vzc2lvbl9yb3V0ZV9tYXBfdHlwZV90IG1NYXBUeXBlOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1N0cmVhbURlc2NyaXB0b3IuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9TdHJlYW1EZXNjcmlwdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwYjEwMzcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1N0cmVhbURlc2NyaXB0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDExMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oIgotI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgotI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIHN0cmVhbSBkZXNjcmlwdG9yIHVzZWQgZm9yIHZvbHVtZSBjb250cm9sCi1jbGFzcyBTdHJlYW1EZXNjcmlwdG9yCi17Ci1wdWJsaWM6Ci0gICAgU3RyZWFtRGVzY3JpcHRvcigpOwotCi0gICAgaW50IGdldFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0OwotICAgIGJvb2wgY2FuQmVNdXRlZCgpIGNvbnN0IHsgcmV0dXJuIG1DYW5CZU11dGVkOyB9Ci0gICAgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpOwotICAgIHZvaWQgYWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCk7Ci0gICAgaW50IGdldFZvbHVtZUluZGV4TWluKCkgY29uc3QgeyByZXR1cm4gbUluZGV4TWluOyB9Ci0gICAgaW50IGdldFZvbHVtZUluZGV4TWF4KCkgY29uc3QgeyByZXR1cm4gbUluZGV4TWF4OyB9Ci0gICAgdm9pZCBzZXRWb2x1bWVJbmRleE1pbihpbnQgdm9sSW5kZXhNaW4pOwotICAgIHZvaWQgc2V0Vm9sdW1lSW5kZXhNYXgoaW50IHZvbEluZGV4TWF4KTsKLSAgICBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0Ci0gICAgewotICAgICAgICBkZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpOwotICAgICAgICByZXR1cm4gbUluZGV4Q3VyLmluZGV4T2ZLZXkoZGV2aWNlKSA+PSAwOwotICAgIH0KLQotICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0OwotCi0gICAgdm9pZCBzZXRWb2x1bWVDdXJ2ZVBvaW50KGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqcG9pbnQpOwotICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKmdldFZvbHVtZUN1cnZlUG9pbnQoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5KSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1Wb2x1bWVDdXJ2ZVtkZXZpY2VDYXRlZ29yeV07Ci0gICAgfQotCi1wcml2YXRlOgotICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKm1Wb2x1bWVDdXJ2ZVtERVZJQ0VfQ0FURUdPUllfQ05UXTsKLSAgICBLZXllZFZlY3RvcjxhdWRpb19kZXZpY2VzX3QsIGludD4gbUluZGV4Q3VyOyAvKio8IGN1cnJlbnQgdm9sdW1lIGluZGV4IHBlciBkZXZpY2UuICovCi0gICAgaW50IG1JbmRleE1pbjsgLyoqPCBtaW4gdm9sdW1lIGluZGV4LiAqLwotICAgIGludCBtSW5kZXhNYXg7IC8qKjwgbWF4IHZvbHVtZSBpbmRleC4gKi8KLSAgICBib29sIG1DYW5CZU11dGVkOyAvKio8IHRydWUgaXMgdGhlIHN0cmVhbSBjYW4gYmUgbXV0ZWQuICovCi19OwotCi0vKioKLSAqIHN0cmVhbSBkZXNjcmlwdG9ycyBjb2xsZWN0aW9uIGZvciB2b2x1bWUgY29udHJvbAotICovCi1jbGFzcyBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbiA6IHB1YmxpYyBEZWZhdWx0S2V5ZWRWZWN0b3I8YXVkaW9fc3RyZWFtX3R5cGVfdCwgU3RyZWFtRGVzY3JpcHRvcj4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbgotewotcHVibGljOgotICAgIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uKCk7Ci0KLSAgICB2aXJ0dWFsIHZvaWQgY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgIHZpcnR1YWwgdm9pZCBhZGRDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpOwotICAgIHZpcnR1YWwgYm9vbCBjYW5CZU11dGVkKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1pbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZUZvcihzdHJlYW0pLmdldFZvbHVtZUluZGV4TWluKCk7Ci0gICAgfQotICAgIHZpcnR1YWwgaW50IGdldFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlRm9yKHN0cmVhbSkuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlKTsKLSAgICB9Ci0gICAgdmlydHVhbCBpbnQgZ2V0Vm9sdW1lSW5kZXhNYXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gdmFsdWVGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleE1heCgpOwotICAgIH0KLSAgICB2aXJ0dWFsIGZsb2F0IHZvbEluZGV4VG9EYihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZGV2aWNlX2NhdGVnb3J5IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KTsKLSAgICB2aXJ0dWFsIHZvaWQgaW5pdGlhbGl6ZVZvbHVtZUN1cnZlcyhib29sIGlzU3BlYWtlckRyY0VuYWJsZWQpOwotICAgIHZpcnR1YWwgdm9pZCBzd2l0Y2hWb2x1bWVDdXJ2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVNyYywgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ec3QpOwotICAgIHZpcnR1YWwgYm9vbCBoYXNWb2x1bWVJbmRleEZvckRldmljZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiB2YWx1ZUZvcihzdHJlYW0pLmhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGRldmljZSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7Ci0KLXByaXZhdGU6Ci0gICAgdm9pZCBzZXRWb2x1bWVDdXJ2ZVBvaW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnQgKnBvaW50KTsKLSAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpnZXRWb2x1bWVDdXJ2ZVBvaW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5KSBjb25zdDsKLSAgICB2b2lkIHNldFZvbHVtZUluZGV4TWluKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLGludCB2b2xJbmRleE1pbik7Ci0gICAgdm9pZCBzZXRWb2x1bWVJbmRleE1heChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSxpbnQgdm9sSW5kZXhNYXgpOwotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1R5cGVDb252ZXJ0ZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvaW5jbHVkZS9UeXBlQ29udmVydGVyLmgKaW5kZXggNjNjMTlkMS4uNmIwNDc2YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1R5cGVDb252ZXJ0ZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVHlwZUNvbnZlcnRlci5oCkBAIC0yMywyNiArMjMsMTAgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdHJ1Y3QgRGV2aWNlQ2F0ZWdvcnlUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGRldmljZV9jYXRlZ29yeSBUeXBlOwotICAgIHR5cGVkZWYgVmVjdG9yPFR5cGU+IENvbGxlY3Rpb247Ci19Owotc3RydWN0IE1peFR5cGVUcmFpdHMKLXsKLSAgICB0eXBlZGVmIGludDMyX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKLXN0cnVjdCBSb3V0ZUZsYWdUcmFpdHMKLXsKLSAgICB0eXBlZGVmIHVpbnQzMl90IFR5cGU7Ci0gICAgdHlwZWRlZiBWZWN0b3I8VHlwZT4gQ29sbGVjdGlvbjsKLX07Ci1zdHJ1Y3QgUnVsZVRyYWl0cwotewotICAgIHR5cGVkZWYgdWludDMyX3QgVHlwZTsKLSAgICB0eXBlZGVmIFZlY3RvcjxUeXBlPiBDb2xsZWN0aW9uOwotfTsKK3N0cnVjdCBSdWxlVHJhaXRzIDogcHVibGljIERlZmF1bHRUcmFpdHM8dWludDMyX3Q+IHt9OwordXNpbmcgRGV2aWNlQ2F0ZWdvcnlUcmFpdHMgPSBEZWZhdWx0VHJhaXRzPGRldmljZV9jYXRlZ29yeT47CitzdHJ1Y3QgTWl4VHlwZVRyYWl0cyA6IHB1YmxpYyBEZWZhdWx0VHJhaXRzPGludDMyX3Q+IHt9Oworc3RydWN0IFJvdXRlRmxhZ1RyYWl0cyA6IHB1YmxpYyBEZWZhdWx0VHJhaXRzPHVpbnQzMl90PiB7fTsKIAogdHlwZWRlZiBUeXBlQ29udmVydGVyPERldmljZUNhdGVnb3J5VHJhaXRzPiBEZXZpY2VDYXRlZ29yeUNvbnZlcnRlcjsKIHR5cGVkZWYgVHlwZUNvbnZlcnRlcjxNaXhUeXBlVHJhaXRzPiBNaXhUeXBlQ29udmVydGVyOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL1ZvbHVtZUN1cnZlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVm9sdW1lQ3VydmUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U2YjJiNC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvVm9sdW1lQ3VydmUuaAorKysgL2Rldi9udWxsCkBAIC0xLDIzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbi5oIgotI2luY2x1ZGUgPHBvbGljeS5oPgotI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSA8dXRpbHMvS2V5ZWRWZWN0b3IuaD4KLSNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KLSNpbmNsdWRlIDxjdXRpbHMvY29uZmlnX3V0aWxzLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RydWN0IEN1cnZlUG9pbnQKLXsKLSAgICBDdXJ2ZVBvaW50KCkge30KLSAgICBDdXJ2ZVBvaW50KGludCBpbmRleCwgaW50IGF0dGVudWF0aW9uSW5NYikgOgotICAgICAgICBtSW5kZXgoaW5kZXgpLCBtQXR0ZW51YXRpb25Jbk1iKGF0dGVudWF0aW9uSW5NYikge30KLSAgICB1aW50MzJfdCBtSW5kZXg7Ci0gICAgaW50IG1BdHRlbnVhdGlvbkluTWI7Ci19OwotCi1pbmxpbmUgYm9vbCBvcGVyYXRvcjwgKGNvbnN0IEN1cnZlUG9pbnQgJmxocywgY29uc3QgQ3VydmVQb2ludCAmcmhzKQotewotICAgIHJldHVybiBsaHMubUluZGV4IDwgcmhzLm1JbmRleDsKLX0KLQotLy8gQSB2b2x1bWUgY3VydmUgZm9yIGEgZ2l2ZW4gdXNlIGNhc2UgYW5kIGRldmljZSBjYXRlZ29yeQotLy8gSXQgY29udGFpbnMgb2YgbGlzdCBvZiBwb2ludHMgb2YgdGhpcyBjdXJ2ZSBleHByZXNzaW5nIHRoZSBhdHRlbnVhdGlvbiBpbiBNaWxsaWJlbHMgZm9yCi0vLyBhIGdpdmVuIHZvbHVtZSBpbmRleCBmcm9tIDAgdG8gMTAwCi1jbGFzcyBWb2x1bWVDdXJ2ZSA6IHB1YmxpYyBSZWZCYXNlCi17Ci1wdWJsaWM6Ci0gICAgVm9sdW1lQ3VydmUoZGV2aWNlX2NhdGVnb3J5IGRldmljZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIDoKLSAgICAgICAgbURldmljZUNhdGVnb3J5KGRldmljZSksIG1TdHJlYW1UeXBlKHN0cmVhbSkge30KLQotICAgIGRldmljZV9jYXRlZ29yeSBnZXREZXZpY2VDYXRlZ29yeSgpIGNvbnN0IHsgcmV0dXJuIG1EZXZpY2VDYXRlZ29yeTsgfQotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0U3RyZWFtVHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1TdHJlYW1UeXBlOyB9Ci0KLSAgICB2b2lkIGFkZChjb25zdCBDdXJ2ZVBvaW50ICZwb2ludCkgeyBtQ3VydmVQb2ludHMuYWRkKHBvaW50KTsgfQotCi0gICAgZmxvYXQgdm9sSW5kZXhUb0RiKGludCBpbmRleEluVWksIGludCB2b2xJbmRleE1pbiwgaW50IHZvbEluZGV4TWF4KSBjb25zdDsKLQotICAgIHZvaWQgZHVtcChpbnQgZmQpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIFNvcnRlZFZlY3RvcjxDdXJ2ZVBvaW50PiBtQ3VydmVQb2ludHM7Ci0gICAgZGV2aWNlX2NhdGVnb3J5IG1EZXZpY2VDYXRlZ29yeTsKLSAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1TdHJlYW1UeXBlOwotfTsKLQotLy8gVm9sdW1lIEN1cnZlcyBmb3IgYSBnaXZlbiB1c2UgY2FzZSBpbmRleGVkIGJ5IGRldmljZSBjYXRlZ29yeQotY2xhc3MgVm9sdW1lQ3VydmVzRm9yU3RyZWFtIDogcHVibGljIEtleWVkVmVjdG9yPGRldmljZV9jYXRlZ29yeSwgc3A8Vm9sdW1lQ3VydmU+ID4KLXsKLXB1YmxpYzoKLSAgICBWb2x1bWVDdXJ2ZXNGb3JTdHJlYW0oKSA6IG1JbmRleE1pbigwKSwgbUluZGV4TWF4KDEpLCBtQ2FuQmVNdXRlZCh0cnVlKQotICAgIHsKLSAgICAgICAgbUluZGV4Q3VyLmFkZChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSwgMCk7Ci0gICAgfQotCi0gICAgc3A8Vm9sdW1lQ3VydmU+IGdldEN1cnZlc0ZvcihkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlKSBjb25zdAotICAgIHsKLSAgICAgICAgaWYgKGluZGV4T2ZLZXkoZGV2aWNlKSA8IDApIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZUZvcihkZXZpY2UpOwotICAgIH0KLQotICAgIGludCBnZXRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAotICAgIHsKLSAgICAgICAgZGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKLSAgICAgICAgLy8gdGhlcmUgaXMgYWx3YXlzIGEgdmFsaWQgZW50cnkgZm9yIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FCi0gICAgICAgIGlmIChtSW5kZXhDdXIuaW5kZXhPZktleShkZXZpY2UpIDwgMCkgewotICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1JbmRleEN1ci52YWx1ZUZvcihkZXZpY2UpOwotICAgIH0KLQotICAgIGJvb2wgY2FuQmVNdXRlZCgpIGNvbnN0IHsgcmV0dXJuIG1DYW5CZU11dGVkOyB9Ci0gICAgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpIHsgbUluZGV4Q3VyLmNsZWFyKCk7IH0KLSAgICB2b2lkIGFkZEN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgaW5kZXgpIHsgbUluZGV4Q3VyLmFkZChkZXZpY2UsIGluZGV4KTsgfQotCi0gICAgdm9pZCBzZXRWb2x1bWVJbmRleE1pbihpbnQgdm9sSW5kZXhNaW4pIHsgbUluZGV4TWluID0gdm9sSW5kZXhNaW47IH0KLSAgICBpbnQgZ2V0Vm9sdW1lSW5kZXhNaW4oKSBjb25zdCB7IHJldHVybiBtSW5kZXhNaW47IH0KLQotICAgIHZvaWQgc2V0Vm9sdW1lSW5kZXhNYXgoaW50IHZvbEluZGV4TWF4KSB7IG1JbmRleE1heCA9IHZvbEluZGV4TWF4OyB9Ci0gICAgaW50IGdldFZvbHVtZUluZGV4TWF4KCkgY29uc3QgeyByZXR1cm4gbUluZGV4TWF4OyB9Ci0KLSAgICBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0Ci0gICAgewotICAgICAgICBkZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXZpY2UpOwotICAgICAgICByZXR1cm4gbUluZGV4Q3VyLmluZGV4T2ZLZXkoZGV2aWNlKSA+PSAwOwotICAgIH0KLQotICAgIGNvbnN0IHNwPFZvbHVtZUN1cnZlPiBnZXRPcmlnaW5Wb2x1bWVDdXJ2ZShkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkpIGNvbnN0Ci0gICAgewotICAgICAgICBBTE9HX0FTU0VSVChtT3JpZ2luVm9sdW1lQ3VydmVzLmluZGV4T2ZLZXkoZGV2aWNlQ2F0ZWdvcnkpID49IDAsICJJbnZhbGlkIGRldmljZSBjYXRlZ29yeSIpOwotICAgICAgICByZXR1cm4gbU9yaWdpblZvbHVtZUN1cnZlcy52YWx1ZUZvcihkZXZpY2VDYXRlZ29yeSk7Ci0gICAgfQotICAgIHZvaWQgc2V0Vm9sdW1lQ3VydmUoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LCBjb25zdCBzcDxWb2x1bWVDdXJ2ZT4gJnZvbHVtZUN1cnZlKQotICAgIHsKLSAgICAgICAgQUxPR19BU1NFUlQoaW5kZXhPZktleShkZXZpY2VDYXRlZ29yeSkgPj0gMCwgIkludmFsaWQgZGV2aWNlIGNhdGVnb3J5IGZvciBWb2x1bWUgQ3VydmUiKTsKLSAgICAgICAgcmVwbGFjZVZhbHVlRm9yKGRldmljZUNhdGVnb3J5LCB2b2x1bWVDdXJ2ZSk7Ci0gICAgfQotCi0gICAgc3NpemVfdCBhZGQoY29uc3Qgc3A8Vm9sdW1lQ3VydmU+ICZ2b2x1bWVDdXJ2ZSkKLSAgICB7Ci0gICAgICAgIGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSA9IHZvbHVtZUN1cnZlLT5nZXREZXZpY2VDYXRlZ29yeSgpOwotICAgICAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShkZXZpY2VDYXRlZ29yeSk7Ci0gICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgIC8vIEtlZXAgdHJhY2sgb2Ygb3JpZ2luYWwgVm9sdW1lIEN1cnZlcyBwZXIgZGV2aWNlIGNhdGVnb3J5IGluIG9yZGVyIHRvIHN3aXRjaCBjdXJ2ZXMuCi0gICAgICAgICAgICBtT3JpZ2luVm9sdW1lQ3VydmVzLmFkZChkZXZpY2VDYXRlZ29yeSwgdm9sdW1lQ3VydmUpOwotICAgICAgICAgICAgcmV0dXJuIEtleWVkVmVjdG9yOjphZGQoZGV2aWNlQ2F0ZWdvcnksIHZvbHVtZUN1cnZlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gaW5kZXg7Ci0gICAgfQotCi0gICAgZmxvYXQgdm9sSW5kZXhUb0RiKGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXQsIGludCBpbmRleEluVWkpIGNvbnN0Ci0gICAgewotICAgICAgICBzcDxWb2x1bWVDdXJ2ZT4gdmMgPSBnZXRDdXJ2ZXNGb3IoZGV2aWNlQ2F0KTsKLSAgICAgICAgaWYgKHZjICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiB2Yy0+dm9sSW5kZXhUb0RiKGluZGV4SW5VaSwgbUluZGV4TWluLCBtSW5kZXhNYXgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgZGV2aWNlIGNhdGVnb3J5ICVkIGZvciBWb2x1bWUgQ3VydmUiLCBkZXZpY2VDYXQpOwotICAgICAgICAgICAgcmV0dXJuIDAuMGY7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICB2b2lkIGR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBib29sIGN1cnZlUG9pbnRzID0gZmFsc2UpIGNvbnN0OwotCi1wcml2YXRlOgotICAgIEtleWVkVmVjdG9yPGRldmljZV9jYXRlZ29yeSwgc3A8Vm9sdW1lQ3VydmU+ID4gbU9yaWdpblZvbHVtZUN1cnZlczsKLSAgICBLZXllZFZlY3RvcjxhdWRpb19kZXZpY2VzX3QsIGludD4gbUluZGV4Q3VyOyAvKio8IGN1cnJlbnQgdm9sdW1lIGluZGV4IHBlciBkZXZpY2UuICovCi0gICAgaW50IG1JbmRleE1pbjsgLyoqPCBtaW4gdm9sdW1lIGluZGV4LiAqLwotICAgIGludCBtSW5kZXhNYXg7IC8qKjwgbWF4IHZvbHVtZSBpbmRleC4gKi8KLSAgICBib29sIG1DYW5CZU11dGVkOyAvKio8IHRydWUgaXMgdGhlIHN0cmVhbSBjYW4gYmUgbXV0ZWQuICovCi19OwotCi0vLyBDb2xsZWN0aW9uIG9mIFZvbHVtZSBDdXJ2ZXMgaW5kZXhlZCBieSB1c2UgY2FzZQotY2xhc3MgVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiA6IHB1YmxpYyBLZXllZFZlY3RvcjxhdWRpb19zdHJlYW1fdHlwZV90LCBWb2x1bWVDdXJ2ZXNGb3JTdHJlYW0+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbgotewotcHVibGljOgotICAgIFZvbHVtZUN1cnZlc0NvbGxlY3Rpb24oKQotICAgIHsKLSAgICAgICAgLy8gQ3JlYXRlIGFuIGVtcHR5IGNvbGxlY3Rpb24gb2YgY3VydmVzCi0gICAgICAgIGZvciAoc3NpemVfdCBpID0gMCA7IGkgPCBBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4oaSk7Ci0gICAgICAgICAgICBLZXllZFZlY3Rvcjo6YWRkKHN0cmVhbSwgVm9sdW1lQ3VydmVzRm9yU3RyZWFtKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8gT25jZSBYTUwgaGFzIGJlZW4gcGFyc2VkLCBtdXN0IGJlIGNhbGwgZmlyc3QgdG8gc2FuaXR5IGNoZWNrIHRhYmxlIGFuZCBpbml0aWFsaXplIGluZGV4ZXMKLSAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KQotICAgIHsKLSAgICAgICAgZWRpdFZhbHVlQXQoc3RyZWFtKS5zZXRWb2x1bWVJbmRleE1pbihpbmRleE1pbik7Ci0gICAgICAgIGVkaXRWYWx1ZUF0KHN0cmVhbSkuc2V0Vm9sdW1lSW5kZXhNYXgoaW5kZXhNYXgpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotICAgIHZpcnR1YWwgdm9pZCBjbGVhckN1cnJlbnRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLSAgICB7Ci0gICAgICAgIGVkaXRDdXJ2ZXNGb3Ioc3RyZWFtKS5jbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgYWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgaW5kZXgpCi0gICAgewotICAgICAgICBlZGl0Q3VydmVzRm9yKHN0cmVhbSkuYWRkQ3VycmVudFZvbHVtZUluZGV4KGRldmljZSwgaW5kZXgpOwotICAgIH0KLSAgICB2aXJ0dWFsIGJvb2wgY2FuQmVNdXRlZChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgeyByZXR1cm4gZ2V0Q3VydmVzRm9yKHN0cmVhbSkuY2FuQmVNdXRlZCgpOyB9Ci0KLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1pbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDdXJ2ZXNGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleE1pbigpOwotICAgIH0KLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleE1heChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDdXJ2ZXNGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleE1heCgpOwotICAgIH0KLSAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLSAgICB7Ci0gICAgICAgIHJldHVybiBnZXRDdXJ2ZXNGb3Ioc3RyZWFtKS5nZXRWb2x1bWVJbmRleChkZXZpY2UpOwotICAgIH0KLSAgICB2aXJ0dWFsIHZvaWQgc3dpdGNoVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1TcmMsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtRHN0KQotICAgIHsKLSAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVzRm9yU3RyZWFtICZzb3VyY2VDdXJ2ZXMgPSBnZXRDdXJ2ZXNGb3Ioc3RyZWFtU3JjKTsKLSAgICAgICAgVm9sdW1lQ3VydmVzRm9yU3RyZWFtICZkc3RDdXJ2ZXMgPSBlZGl0Q3VydmVzRm9yKHN0cmVhbURzdCk7Ci0gICAgICAgIEFMT0dfQVNTRVJUKHNvdXJjZUN1cnZlcy5zaXplKCkgPT0gZHN0Q3VydmVzLnNpemUoKSwgImRldmljZSBjYXRlZ29yeSBub3QgYWxpZ25lZCIpOwotICAgICAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgc291cmNlQ3VydmVzLnNpemUoKTsgaW5kZXgrKykgewotICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGNhdCA9IHNvdXJjZUN1cnZlcy5rZXlBdChpbmRleCk7Ci0gICAgICAgICAgICBkc3RDdXJ2ZXMuc2V0Vm9sdW1lQ3VydmUoY2F0LCBzb3VyY2VDdXJ2ZXMuZ2V0T3JpZ2luVm9sdW1lQ3VydmUoY2F0KSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgdmlydHVhbCBmbG9hdCB2b2xJbmRleFRvRGIoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGRldmljZV9jYXRlZ29yeSBjYXQsIGludCBpbmRleEluVWkpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gZ2V0Q3VydmVzRm9yKHN0cmVhbSkudm9sSW5kZXhUb0RiKGNhdCwgaW5kZXhJblVpKTsKLSAgICB9Ci0gICAgdmlydHVhbCBib29sIGhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIGdldEN1cnZlc0ZvcihzdHJlYW0pLmhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGRldmljZSk7Ci0gICAgfQotCi0gICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wKGludCBmZCkgY29uc3Q7Ci0KLSAgICBzc2l6ZV90IGFkZChjb25zdCBzcDxWb2x1bWVDdXJ2ZT4gJnZvbHVtZUN1cnZlKQotICAgIHsKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gdm9sdW1lQ3VydmUtPmdldFN0cmVhbVR5cGUoKTsKLSAgICAgICAgcmV0dXJuIGVkaXRDdXJ2ZXNGb3Ioc3RyZWFtVHlwZSkuYWRkKHZvbHVtZUN1cnZlKTsKLSAgICB9Ci0gICAgVm9sdW1lQ3VydmVzRm9yU3RyZWFtICZlZGl0Q3VydmVzRm9yKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotICAgIHsKLSAgICAgICAgQUxPR19BU1NFUlQoaW5kZXhPZktleShzdHJlYW0pID49IDAsICJJbnZhbGlkIHN0cmVhbSB0eXBlIGZvciBWb2x1bWUgQ3VydmUiKTsKLSAgICAgICAgcmV0dXJuIGVkaXRWYWx1ZUF0KHN0cmVhbSk7Ci0gICAgfQotICAgIGNvbnN0IFZvbHVtZUN1cnZlc0ZvclN0cmVhbSAmZ2V0Q3VydmVzRm9yKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAotICAgIHsKLSAgICAgICAgQUxPR19BU1NFUlQoaW5kZXhPZktleShzdHJlYW0pID49IDAsICJJbnZhbGlkIHN0cmVhbSB0eXBlIGZvciBWb2x1bWUgQ3VydmUiKTsKLSAgICAgICAgcmV0dXJuIHZhbHVlRm9yKHN0cmVhbSk7Ci0gICAgfQotfTsKLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9pbmNsdWRlL2F1ZGlvX3BvbGljeV9jb25mLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvYXVkaW9fcG9saWN5X2NvbmYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEyNzk0Ny4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL2luY2x1ZGUvYXVkaW9fcG9saWN5X2NvbmYuaAorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTIgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyAgICAgIERlZmluaXRpb25zIGZvciBhdWRpbyBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlIChhdWRpb19wb2xpY3kuY29uZikKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotI2RlZmluZSBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTUFYX0xFTiAzMgotCi0jZGVmaW5lIEFVRElPX1BPTElDWV9DT05GSUdfRklMRSAiL3N5c3RlbS9ldGMvYXVkaW9fcG9saWN5LmNvbmYiCi0jZGVmaW5lIEFVRElPX1BPTElDWV9WRU5ET1JfQ09ORklHX0ZJTEUgIi92ZW5kb3IvZXRjL2F1ZGlvX3BvbGljeS5jb25mIgotCi0vLyBnbG9iYWwgY29uZmlndXJhdGlvbgotI2RlZmluZSBHTE9CQUxfQ09ORklHX1RBRyAiZ2xvYmFsX2NvbmZpZ3VyYXRpb24iCi0KLSNkZWZpbmUgQVRUQUNIRURfT1VUUFVUX0RFVklDRVNfVEFHICJhdHRhY2hlZF9vdXRwdXRfZGV2aWNlcyIKLSNkZWZpbmUgREVGQVVMVF9PVVRQVVRfREVWSUNFX1RBRyAiZGVmYXVsdF9vdXRwdXRfZGV2aWNlIgotI2RlZmluZSBBVFRBQ0hFRF9JTlBVVF9ERVZJQ0VTX1RBRyAiYXR0YWNoZWRfaW5wdXRfZGV2aWNlcyIKLSNkZWZpbmUgU1BFQUtFUl9EUkNfRU5BQkxFRF9UQUcgInNwZWFrZXJfZHJjX2VuYWJsZWQiCi0jZGVmaW5lIEFVRElPX0hBTF9WRVJTSU9OX1RBRyAiYXVkaW9faGFsX3ZlcnNpb24iCi0KLS8vIGh3IG1vZHVsZXMgZGVzY3JpcHRpb25zCi0jZGVmaW5lIEFVRElPX0hXX01PRFVMRV9UQUcgImF1ZGlvX2h3X21vZHVsZXMiCi0KLSNkZWZpbmUgT1VUUFVUU19UQUcgIm91dHB1dHMiCi0jZGVmaW5lIElOUFVUU19UQUcgImlucHV0cyIKLQotI2RlZmluZSBTQU1QTElOR19SQVRFU19UQUcgInNhbXBsaW5nX3JhdGVzIgotI2RlZmluZSBGT1JNQVRTX1RBRyAiZm9ybWF0cyIKLSNkZWZpbmUgQ0hBTk5FTFNfVEFHICJjaGFubmVsX21hc2tzIgotI2RlZmluZSBERVZJQ0VTX1RBRyAiZGV2aWNlcyIKLSNkZWZpbmUgRkxBR1NfVEFHICJmbGFncyIKLQotI2RlZmluZSBBUE1fREVWSUNFU19UQUcgImRldmljZXMiCi0jZGVmaW5lIEFQTV9ERVZJQ0VfVFlQRSAidHlwZSIKLSNkZWZpbmUgQVBNX0RFVklDRV9BRERSRVNTICJhZGRyZXNzIgotCi0jZGVmaW5lIE1JWEVSU19UQUcgIm1peGVycyIKLSNkZWZpbmUgTUlYRVJfVFlQRSAidHlwZSIKLSNkZWZpbmUgTUlYRVJfVFlQRV9NVVggIm11eCIKLSNkZWZpbmUgTUlYRVJfVFlQRV9NSVggIm1peCIKLQotI2RlZmluZSBHQUlOU19UQUcgImdhaW5zIgotI2RlZmluZSBHQUlOX01PREUgIm1vZGUiCi0jZGVmaW5lIEdBSU5fQ0hBTk5FTFMgImNoYW5uZWxfbWFzayIKLSNkZWZpbmUgR0FJTl9NSU5fVkFMVUUgIm1pbl92YWx1ZV9tQiIKLSNkZWZpbmUgR0FJTl9NQVhfVkFMVUUgIm1heF92YWx1ZV9tQiIKLSNkZWZpbmUgR0FJTl9ERUZBVUxUX1ZBTFVFICJkZWZhdWx0X3ZhbHVlX21CIgotI2RlZmluZSBHQUlOX1NURVBfVkFMVUUgInN0ZXBfdmFsdWVfbUIiCi0jZGVmaW5lIEdBSU5fTUlOX1JBTVBfTVMgIm1pbl9yYW1wX21zIgotI2RlZmluZSBHQUlOX01BWF9SQU1QX01TICJtYXhfcmFtcF9tcyIKLQotI2RlZmluZSBEWU5BTUlDX1ZBTFVFX1RBRyAiZHluYW1pYyIgLy8gc3BlY2lhbCB2YWx1ZSBmb3IgImNoYW5uZWxfbWFza3MiLCAic2FtcGxpbmdfcmF0ZXMiIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gImZvcm1hdHMiIGluIG91dHB1dHMgZGVzY3JpcHRvcnMgaW5kaWNhdGluZyB0aGF0IHN1cHBvcnRlZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzIHNob3VsZCBiZSBxdWVyaWVkIGFmdGVyIG9wZW5pbmcgdGhlIG91dHB1dC4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvQ29sbGVjdGlvbnMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAKaW5kZXggY2E2N2I4Ny4uY2QxMDAxMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Db2xsZWN0aW9ucy5jcHAKQEAgLTE4LDE2ICsxOCwxNiBAQAogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCiAjaW5jbHVkZSAiQXVkaW9Db2xsZWN0aW9ucy5oIgotI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgogI2luY2x1ZGUgIkF1ZGlvUm91dGUuaCIKICNpbmNsdWRlICJId01vZHVsZS5oIgotI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgorI2luY2x1ZGUgIlBvbGljeUF1ZGlvUG9ydC5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLXNwPEF1ZGlvUG9ydD4gQXVkaW9Qb3J0VmVjdG9yOjpmaW5kQnlUYWdOYW1lKGNvbnN0IFN0cmluZzggJnRhZ05hbWUpIGNvbnN0CitzcDxQb2xpY3lBdWRpb1BvcnQ+IGZpbmRCeVRhZ05hbWUoY29uc3QgUG9saWN5QXVkaW9Qb3J0VmVjdG9yJiBwb2xpY3lBdWRpb1BvcnRWZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnRhZ05hbWUpCiB7Ci0gICAgZm9yIChjb25zdCBhdXRvJiBwb3J0IDogKnRoaXMpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHBvcnQgOiBwb2xpY3lBdWRpb1BvcnRWZWN0b3IpIHsKICAgICAgICAgaWYgKHBvcnQtPmdldFRhZ05hbWUoKSA9PSB0YWdOYW1lKSB7CiAgICAgICAgICAgICByZXR1cm4gcG9ydDsKICAgICAgICAgfQpAQCAtMzUsMjIgKzM1LDE2IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXN0YXR1c190IEF1ZGlvUm91dGVWZWN0b3I6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAordm9pZCBkdW1wQXVkaW9Sb3V0ZVZlY3Rvcihjb25zdCBBdWRpb1JvdXRlVmVjdG9yJiBhdWRpb1JvdXRlVmVjdG9yLCBTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpCiB7Ci0gICAgaWYgKGlzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgaWYgKGF1ZGlvUm91dGVWZWN0b3IuaXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbiUqc0F1ZGlvIFJvdXRlcyAoJXp1KTpcbiIsIHNwYWNlcywgIiIsIHNpemUoKSk7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBSb3V0ZSAlenU6XG4iLCBzcGFjZXMsICIiLCBpICsgMSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgaXRlbUF0KGkpLT5kdW1wKGZkLCA0KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4lKnNBdWRpbyBSb3V0ZXMgKCV6dSk6XG4iLCBzcGFjZXMsICIiLCBhdWRpb1JvdXRlVmVjdG9yLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdWRpb1JvdXRlVmVjdG9yLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFJvdXRlICV6dTpcbiIsIHNwYWNlcywgIiIsIGkgKyAxKTsKKyAgICAgICAgYXVkaW9Sb3V0ZVZlY3Rvci5pdGVtQXQoaSktPmR1bXAoZHN0LCA0KTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0dhaW4uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9HYWluLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkzZDRhNi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0dhaW4uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9HYWluIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0vLyNkZWZpbmUgVkVSWV9WRVJCT1NFX0xPR0dJTkcKLSNpZmRlZiBWRVJZX1ZFUkJPU0VfTE9HR0lORwotI2RlZmluZSBBTE9HVlYgQUxPR1YKLSNlbHNlCi0jZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKLSNlbmRpZgotCi0jaW5jbHVkZSAiQXVkaW9HYWluLmgiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi0jaW5jbHVkZSA8bWF0aC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUF1ZGlvR2Fpbjo6QXVkaW9HYWluKGludCBpbmRleCwgYm9vbCB1c2VJbkNoYW5uZWxNYXNrKQotewotICAgIG1JbmRleCA9IGluZGV4OwotICAgIG1Vc2VJbkNoYW5uZWxNYXNrID0gdXNlSW5DaGFubmVsTWFzazsKLSAgICBtZW1zZXQoJm1HYWluLCAwLCBzaXplb2Yoc3RydWN0IGF1ZGlvX2dhaW4pKTsKLX0KLQotdm9pZCBBdWRpb0dhaW46OmdldERlZmF1bHRDb25maWcoc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnICpjb25maWcpCi17Ci0gICAgY29uZmlnLT5pbmRleCA9IG1JbmRleDsKLSAgICBjb25maWctPm1vZGUgPSBtR2Fpbi5tb2RlOwotICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrID0gbUdhaW4uY2hhbm5lbF9tYXNrOwotICAgIGlmICgobUdhaW4ubW9kZSAmIEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgPT0gQVVESU9fR0FJTl9NT0RFX0pPSU5UKSB7Ci0gICAgICAgIGNvbmZpZy0+dmFsdWVzWzBdID0gbUdhaW4uZGVmYXVsdF92YWx1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICB1aW50MzJfdCBudW1WYWx1ZXM7Ci0gICAgICAgIGlmIChtVXNlSW5DaGFubmVsTWFzaykgewotICAgICAgICAgICAgbnVtVmFsdWVzID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2sobUdhaW4uY2hhbm5lbF9tYXNrKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhtR2Fpbi5jaGFubmVsX21hc2spOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtVmFsdWVzOyBpKyspIHsKLSAgICAgICAgICAgIGNvbmZpZy0+dmFsdWVzW2ldID0gbUdhaW4uZGVmYXVsdF92YWx1ZTsKLSAgICAgICAgfQotICAgIH0KLSAgICBpZiAoKG1HYWluLm1vZGUgJiBBVURJT19HQUlOX01PREVfUkFNUCkgPT0gQVVESU9fR0FJTl9NT0RFX1JBTVApIHsKLSAgICAgICAgY29uZmlnLT5yYW1wX2R1cmF0aW9uX21zID0gbUdhaW4ubWluX3JhbXBfbXM7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb0dhaW46OmNoZWNrQ29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19nYWluX2NvbmZpZyAqY29uZmlnKQotewotICAgIGlmICgoY29uZmlnLT5tb2RlICYgfm1HYWluLm1vZGUpICE9IDApIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgaWYgKChjb25maWctPm1vZGUgJiBBVURJT19HQUlOX01PREVfSk9JTlQpID09IEFVRElPX0dBSU5fTU9ERV9KT0lOVCkgewotICAgICAgICBpZiAoKGNvbmZpZy0+dmFsdWVzWzBdIDwgbUdhaW4ubWluX3ZhbHVlKSB8fAotICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT52YWx1ZXNbMF0gPiBtR2Fpbi5tYXhfdmFsdWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKChjb25maWctPmNoYW5uZWxfbWFzayAmIH5tR2Fpbi5jaGFubmVsX21hc2spICE9IDApIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgdWludDMyX3QgbnVtVmFsdWVzOwotICAgICAgICBpZiAobVVzZUluQ2hhbm5lbE1hc2spIHsKLSAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG51bVZhbHVlcyA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzayhjb25maWctPmNoYW5uZWxfbWFzayk7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1WYWx1ZXM7IGkrKykgewotICAgICAgICAgICAgaWYgKChjb25maWctPnZhbHVlc1tpXSA8IG1HYWluLm1pbl92YWx1ZSkgfHwKLSAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+dmFsdWVzW2ldID4gbUdhaW4ubWF4X3ZhbHVlKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgaWYgKChjb25maWctPm1vZGUgJiBBVURJT19HQUlOX01PREVfUkFNUCkgPT0gQVVESU9fR0FJTl9NT0RFX1JBTVApIHsKLSAgICAgICAgaWYgKChjb25maWctPnJhbXBfZHVyYXRpb25fbXMgPCBtR2Fpbi5taW5fcmFtcF9tcykgfHwKLSAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+cmFtcF9kdXJhdGlvbl9tcyA+IG1HYWluLm1heF9yYW1wX21zKSkgewotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXZvaWQgQXVkaW9HYWluOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzR2FpbiAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1vZGU6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1vZGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGNoYW5uZWxfbWFzazogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUdhaW4uY2hhbm5lbF9tYXNrKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtaW5fdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5taW5fdmFsdWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIG1heF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1heF92YWx1ZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZGVmYXVsdF92YWx1ZTogJWQgbUJcbiIsIHNwYWNlcywgIiIsIG1HYWluLmRlZmF1bHRfdmFsdWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHN0ZXBfdmFsdWU6ICVkIG1CXG4iLCBzcGFjZXMsICIiLCBtR2Fpbi5zdGVwX3ZhbHVlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtaW5fcmFtcF9tczogJWQgbXNcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1pbl9yYW1wX21zKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtYXhfcmFtcF9tczogJWQgbXNcbiIsIHNwYWNlcywgIiIsIG1HYWluLm1heF9yYW1wX21zKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9JbnB1dERlc2NyaXB0b3IuY3BwCmluZGV4IDFlMDY0MGMuLmNiM2M5NTMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvSW5wdXREZXNjcmlwdG9yLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb0lucHV0RGVzY3JpcHRvci5jcHAKQEAgLTE3LDI3ICsxNywyNSBAQAogI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvSW5wdXREZXNjcmlwdG9yIgogLy8jZGVmaW5lIExPR19OREVCVUcgMAogCi0jaW5jbHVkZSA8QXVkaW9Qb2xpY3lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlICJBdWRpb0lucHV0RGVzY3JpcHRvci5oIgotI2luY2x1ZGUgIklPUHJvZmlsZS5oIgotI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgotI2luY2x1ZGUgIkh3TW9kdWxlLmgiCisjaW5jbHVkZSA8YXVkaW9tYW5hZ2VyL0F1ZGlvTWFuYWdlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CiAjaW5jbHVkZSA8cG9saWN5Lmg+CisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lJbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJBdWRpb0lucHV0RGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkF1ZGlvUG9saWN5TWl4LmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBBdWRpb0lucHV0RGVzY3JpcHRvcjo6QXVkaW9JbnB1dERlc2NyaXB0b3IoY29uc3Qgc3A8SU9Qcm9maWxlPiYgcHJvZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQotICAgIDogbUlvSGFuZGxlKDApLAotICAgICAgbURldmljZShBVURJT19ERVZJQ0VfTk9ORSksIG1Qb2xpY3lNaXgoTlVMTCksCi0gICAgICBtUHJvZmlsZShwcm9maWxlKSwgbVBhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSwgbUlkKDApLAotICAgICAgbUNsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpCisgICAgOiBtUHJvZmlsZShwcm9maWxlKQorICAgICwgIG1DbGllbnRJbnRlcmZhY2UoY2xpZW50SW50ZXJmYWNlKQogewogICAgIGlmIChwcm9maWxlICE9IE5VTEwpIHsKICAgICAgICAgcHJvZmlsZS0+cGlja0F1ZGlvUHJvZmlsZShtU2FtcGxpbmdSYXRlLCBtQ2hhbm5lbE1hc2ssIG1Gb3JtYXQpOwotICAgICAgICBpZiAocHJvZmlsZS0+bUdhaW5zLnNpemUoKSA+IDApIHsKLSAgICAgICAgICAgIHByb2ZpbGUtPm1HYWluc1swXS0+Z2V0RGVmYXVsdENvbmZpZygmbUdhaW4pOworICAgICAgICBpZiAocHJvZmlsZS0+Z2V0R2FpbnMoKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBwcm9maWxlLT5nZXRHYWlucygpWzBdLT5nZXREZWZhdWx0Q29uZmlnKCZtR2Fpbik7CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC01MCwxOSArNDgsMjcgQEAKICAgICByZXR1cm4gbVByb2ZpbGUtPmdldE1vZHVsZUhhbmRsZSgpOwogfQogCi11aW50MzJfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0T3BlblJlZkNvdW50KCkgY29uc3QKK2F1ZGlvX3NvdXJjZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpzb3VyY2UoKSBjb25zdAogewotICAgIHJldHVybiBtU2Vzc2lvbnMuZ2V0T3BlbkNvdW50KCk7CisgICAgcmV0dXJuIGdldEhpZ2hlc3RQcmlvcml0eUF0dHJpYnV0ZXMoKS5zb3VyY2U7CiB9CiAKLWF1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldElkKCkgY29uc3QKK3N0YXR1c190IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjphcHBseUF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyAqYmFja3VwQ29uZmlnKQogewotICAgIHJldHVybiBtSWQ7Ci19CisgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGxvY2FsQmFja3VwQ29uZmlnID0geyAuY29uZmlnX21hc2sgPSBjb25maWctPmNvbmZpZ19tYXNrIH07CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7CiAKLWF1ZGlvX3NvdXJjZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjppbnB1dFNvdXJjZShib29sIGFjdGl2ZU9ubHkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIGdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZShhY3RpdmVPbmx5KTsKKyAgICB0b0F1ZGlvUG9ydENvbmZpZygmbG9jYWxCYWNrdXBDb25maWcpOworICAgIGlmICgoc3RhdHVzID0gdmFsaWRhdGlvbkJlZm9yZUFwcGx5Q29uZmlnKGNvbmZpZykpID09IE5PX0VSUk9SKSB7CisgICAgICAgIEF1ZGlvUG9ydENvbmZpZzo6YXBwbHlBdWRpb1BvcnRDb25maWcoY29uZmlnLCBiYWNrdXBDb25maWcpOworICAgICAgICBhcHBseVBvbGljeUF1ZGlvUG9ydENvbmZpZyhjb25maWcpOworICAgIH0KKworICAgIGlmIChiYWNrdXBDb25maWcgIT0gTlVMTCkgeworICAgICAgICAqYmFja3VwQ29uZmlnID0gbG9jYWxCYWNrdXBDb25maWc7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLApAQCAtNzcsMTMgKzgzLDEzIEBACiAgICAgfQogCiAgICAgQXVkaW9Qb3J0Q29uZmlnOjp0b0F1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7CisgICAgdG9Qb2xpY3lBdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOwogCi0gICAgZHN0Q29uZmlnLT5pZCA9IG1JZDsKICAgICBkc3RDb25maWctPnJvbGUgPSBBVURJT19QT1JUX1JPTEVfU0lOSzsKICAgICBkc3RDb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOwogICAgIGRzdENvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBnZXRNb2R1bGVIYW5kbGUoKTsKICAgICBkc3RDb25maWctPmV4dC5taXguaGFuZGxlID0gbUlvSGFuZGxlOwotICAgIGRzdENvbmZpZy0+ZXh0Lm1peC51c2VjYXNlLnNvdXJjZSA9IGlucHV0U291cmNlKCk7CisgICAgZHN0Q29uZmlnLT5leHQubWl4LnVzZWNhc2Uuc291cmNlID0gc291cmNlKCk7CiB9CiAKIHZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KHN0cnVjdCBhdWRpb19wb3J0ICpwb3J0KSBjb25zdApAQCAtMTE4LDU3ICsxMjQsNjIgQEAKICAgICBtUHJlZW1wdGVkU2Vzc2lvbnMuY2xlYXIoKTsKIH0KIAotYm9vbCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6aXNBY3RpdmUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5oYXNBY3RpdmVTZXNzaW9uKCk7Ci19Ci0KIGJvb2wgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKIHsKLSAgICByZXR1cm4gbVNlc3Npb25zLmlzU291cmNlQWN0aXZlKHNvdXJjZSk7CisgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpICYmCisgICAgICAgICAgICAoKGNsaWVudC0+c291cmNlKCkgPT0gc291cmNlKSB8fAorICAgICAgICAgICAgICAgICgoc291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTikgJiYKKyAgICAgICAgICAgICAgICAgICAgKGNsaWVudC0+c291cmNlKCkgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmCisgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+aXNTb3VuZFRyaWdnZXIoKSkpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWF1ZGlvX3NvdXJjZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdAorYXVkaW9fYXR0cmlidXRlc190IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRIaWdoZXN0UHJpb3JpdHlBdHRyaWJ1dGVzKCkgY29uc3QKIHsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IHsgLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9ERUZBVUxUIH07CisgICAgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gdG9wQ2xpZW50ID0gZ2V0SGlnaGVzdFByaW9yaXR5Q2xpZW50KCk7CisgICAgcmV0dXJuIHRvcENsaWVudCA/IHRvcENsaWVudC0+YXR0cmlidXRlcygpIDogYXR0cmlidXRlczsKK30KIAotICAgIHJldHVybiBtU2Vzc2lvbnMuZ2V0SGlnaGVzdFByaW9yaXR5U291cmNlKGFjdGl2ZU9ubHkpOworc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldEhpZ2hlc3RQcmlvcml0eUNsaWVudCgpIGNvbnN0Cit7CisgICAgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gdG9wQ2xpZW50OworCisgICAgZm9yIChib29sIGFjdGl2ZU9ubHkgOiB7IHRydWUsIGZhbHNlIH0pIHsKKyAgICAgICAgaW50MzJfdCB0b3BQcmlvcml0eSA9IC0xOworICAgICAgICBhcHBfc3RhdGVfdCB0b3BTdGF0ZSA9IEFQUF9TVEFURV9JRExFOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmIChhY3RpdmVPbmx5ICYmICFjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXBwX3N0YXRlX3QgY3VyU3RhdGUgPSBjbGllbnQtPmFwcFN0YXRlKCk7CisgICAgICAgICAgICBpZiAoY3VyU3RhdGUgPj0gdG9wU3RhdGUpIHsKKyAgICAgICAgICAgICAgICBpbnQzMl90IGN1clByaW9yaXR5ID0gc291cmNlX3ByaW9yaXR5KGNsaWVudC0+c291cmNlKCkpOworICAgICAgICAgICAgICAgIGlmIChjdXJQcmlvcml0eSA+PSB0b3BQcmlvcml0eSkgeworICAgICAgICAgICAgICAgICAgICB0b3BDbGllbnQgPSBjbGllbnQ7CisgICAgICAgICAgICAgICAgICAgIHRvcFByaW9yaXR5ID0gY3VyUHJpb3JpdHk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHRvcFN0YXRlID0gY3VyU3RhdGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRvcENsaWVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdG9wQ2xpZW50OwogfQogCiBib29sIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjppc1NvdW5kVHJpZ2dlcigpIGNvbnN0IHsKLSAgICAvLyBzb3VuZCB0cmlnZ2VyIGFuZCBub24gc291bmQgdHJpZ2dlciBzZXNzaW9ucyBhcmUgbm90IG1peGVkCi0gICAgLy8gb24gYSBnaXZlbiBpbnB1dAotICAgIHJldHVybiBtU2Vzc2lvbnMudmFsdWVBdCgwKS0+aXNTb3VuZFRyaWdnZXIoKTsKLX0KLQotc3A8QXVkaW9TZXNzaW9uPiBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0QXVkaW9TZXNzaW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSBjb25zdCB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy52YWx1ZUZvcihzZXNzaW9uKTsKLX0KLQotQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0QXVkaW9TZXNzaW9ucyhib29sIGFjdGl2ZU9ubHkpIGNvbnN0Ci17Ci0gICAgaWYgKGFjdGl2ZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9ucy5nZXRBY3RpdmVTZXNzaW9ucygpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtU2Vzc2lvbnM7CisgICAgLy8gc291bmQgdHJpZ2dlciBhbmQgbm9uIHNvdW5kIHRyaWdnZXIgY2xpZW50cyBhcmUgbm90IG1peGVkIG9uIGEgZ2l2ZW4gaW5wdXQKKyAgICAvLyBzbyBjaGVjayBvbmx5IGZpcnN0IGNsaWVudAorICAgIGlmIChnZXRDbGllbnRDb3VudCgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLX0KLQotc2l6ZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRBdWRpb1Nlc3Npb25Db3VudChib29sIGFjdGl2ZU9ubHkpIGNvbnN0Ci17Ci0gICAgaWYgKGFjdGl2ZU9ubHkpIHsKLSAgICAgICAgcmV0dXJuIG1TZXNzaW9ucy5nZXRBY3RpdmVTZXNzaW9uQ291bnQoKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbVNlc3Npb25zLnNpemUoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjphZGRBdWRpb1Nlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiYgYXVkaW9TZXNzaW9uKSB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5hZGRTZXNzaW9uKHNlc3Npb24sIGF1ZGlvU2Vzc2lvbiwgLypBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIqL3RoaXMpOwotfQotCi1zdGF0dXNfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6cmVtb3ZlQXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKSB7Ci0gICAgcmV0dXJuIG1TZXNzaW9ucy5yZW1vdmVTZXNzaW9uKHNlc3Npb24pOworICAgIHJldHVybiBnZXRDbGllbnRJdGVyYWJsZSgpLmJlZ2luKCktPmlzU291bmRUcmlnZ2VyKCk7CiB9CiAKIGF1ZGlvX3BhdGNoX2hhbmRsZV90IEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpnZXRQYXRjaEhhbmRsZSgpIGNvbnN0CkBAIC0xNzksNyArMTkwLDEzIEBACiB2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpzZXRQYXRjaEhhbmRsZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpCiB7CiAgICAgbVBhdGNoSGFuZGxlID0gaGFuZGxlOwotICAgIG1TZXNzaW9ucy5vblNlc3Npb25JbmZvVXBkYXRlKCk7CisgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgICAgICB1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKAorICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmlzTG93TGV2ZWwoKSA/IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQgOiBSRUNPUkRfQ09ORklHX0VWRU5UX1VQREFURSwKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50KTsKKyAgICAgICAgfQorICAgIH0KIH0KIAogYXVkaW9fY29uZmlnX2Jhc2VfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0Q29uZmlnKCkgY29uc3QKQEAgLTE5MCw4ICsyMDcsNyBAQAogfQogCiBzdGF0dXNfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6b3Blbihjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCkKQEAgLTIwOCwyOCArMjI0LDMwIEBACiAKICAgICBtRGV2aWNlID0gZGV2aWNlOwogCi0gICAgQUxPR1YoIm9wZW5pbmcgaW5wdXQgZm9yIGRldmljZSAlMDh4IGFkZHJlc3MgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKLSAgICAgICAgICBtRGV2aWNlLCBhZGRyZXNzLnN0cmluZygpLCBtUHJvZmlsZS5nZXQoKSwgbVByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7CisgICAgQUxPR1YoIm9wZW5pbmcgaW5wdXQgZm9yIGRldmljZSAlcyBwcm9maWxlICVwIG5hbWUgJXMiLAorICAgICAgICAgIG1EZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgbVByb2ZpbGUuZ2V0KCksIG1Qcm9maWxlLT5nZXROYW1lKCkuY19zdHIoKSk7CisKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IG1EZXZpY2UtPnR5cGUoKTsKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IG1DbGllbnRJbnRlcmZhY2UtPm9wZW5JbnB1dChtUHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1EZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZkZXZpY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KG1EZXZpY2UtPmFkZHJlc3MoKS5jX3N0cigpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRGV2aWNlICE9IGRldmljZSwKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1EZXZpY2UtPnR5cGUoKSAhPSBkZXZpY2VUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIiVzIG9wZW5JbnB1dCByZXR1cm5lZCBkZXZpY2UgJTA4eCB3aGVuIGdpdmVuIGRldmljZSAlMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbURldmljZSwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbURldmljZS0+dHlwZSgpLCBkZXZpY2VUeXBlKTsKIAogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRigqaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIG9wZW5JbnB1dCByZXR1cm5lZCBpbnB1dCBoYW5kbGUgJWQgZm9yIGRldmljZSAlMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICppbnB1dCwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgb3BlbklucHV0IHJldHVybmVkIGlucHV0IGhhbmRsZSAlZCBmb3IgZGV2aWNlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICppbnB1dCwgbURldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IGxDb25maWcuc2FtcGxlX3JhdGU7CiAgICAgICAgIG1DaGFubmVsTWFzayA9IGxDb25maWcuY2hhbm5lbF9tYXNrOwogICAgICAgICBtRm9ybWF0ID0gbENvbmZpZy5mb3JtYXQ7Ci0gICAgICAgIG1JZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisgICAgICAgIG1JZCA9IFBvbGljeUF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CiAgICAgICAgIG1Jb0hhbmRsZSA9ICppbnB1dDsKICAgICAgICAgbVByb2ZpbGUtPmN1ck9wZW5Db3VudCsrOwogICAgIH0KQEAgLTIzOSw3ICsyNTcsNyBAQAogCiBzdGF0dXNfdCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c3RhcnQoKQogewotICAgIGlmIChnZXRBdWRpb1Nlc3Npb25Db3VudCh0cnVlLyphY3RpdmVPbmx5Ki8pID09IDEpIHsKKyAgICBpZiAoIWlzQWN0aXZlKCkpIHsKICAgICAgICAgaWYgKCFtUHJvZmlsZS0+Y2FuU3RhcnROZXdJbygpKSB7CiAgICAgICAgICAgICBBTE9HSSgiJXMgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50ICVkIiwgX19mdW5jX18sIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCk7CiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC0yNjIsNDIgKzI4MCwyNDcgQEAKIHZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmNsb3NlKCkKIHsKICAgICBpZiAobUlvSGFuZGxlICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgIC8vIGNsZWFuIHVwIGFjdGl2ZSBjbGllbnRzIGlmIGFueSAoY2FuIGhhcHBlbiBpZiBjbG9zZSgpIGlzIGNhbGxlZCB0byBmb3JjZQorICAgICAgICAvLyBjbGllbnRzIHRvIHJlY29ubmVjdAorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzIGNsaWVudCB3aXRoIHBvcnQgSUQgJWQgc3RpbGwgYWN0aXZlIG9uIGlucHV0ICVkIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGNsaWVudC0+cG9ydElkKCksIG1JZCk7CisgICAgICAgICAgICAgICAgc2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgZmFsc2UpOworICAgICAgICAgICAgICAgIHN0b3AoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPmNsb3NlSW5wdXQobUlvSGFuZGxlKTsKICAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihtUHJvZmlsZS0+Y3VyT3BlbkNvdW50IDwgMSwgIiVzIHByb2ZpbGUgb3BlbiBjb3VudCAldSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvZmlsZS0+Y3VyT3BlbkNvdW50KTsKLSAgICAgICAgLy8gZG8gbm90IGNhbGwgc3RvcCgpIGhlcmUgYXMgc3RvcCgpIGlzIHN1cHBvc2VkIHRvIGJlIGNhbGxlZCBhZnRlcgotICAgICAgICAvLyBBdWRpb1Nlc3Npb246OmNoYW5nZUFjdGl2ZUNvdW50KC0xKSBhbmQgd2UgZG9uJ3Qga25vdyBob3cgbWFueSBzZXNzaW9ucwotICAgICAgICAvLyBhcmUgc3RpbGwgYWN0aXZlIGF0IHRoaXMgdGltZQotICAgICAgICBpZiAoaXNBY3RpdmUoKSkgewotICAgICAgICAgICAgbVByb2ZpbGUtPmN1ckFjdGl2ZUNvdW50LS07Ci0gICAgICAgIH0KKwogICAgICAgICBtUHJvZmlsZS0+Y3VyT3BlbkNvdW50LS07CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVByb2ZpbGUtPmN1ck9wZW5Db3VudCA8ICBtUHJvZmlsZS0+Y3VyQWN0aXZlQ291bnQsCisgICAgICAgICAgICAgICAgIiVzKCVkKTogbVByb2ZpbGUtPmN1ck9wZW5Db3VudCAlZCA8IG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCAlZC4iLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtSWQsIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQsIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudCk7CiAgICAgICAgIG1Jb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgIH0KIH0KIAotc3RhdHVzX3QgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6YWRkQ2xpZW50KGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+ICZjbGllbnQpIHsKKyAgICBDbGllbnRNYXBIYW5kbGVyPFJlY29yZENsaWVudERlc2NyaXB0b3I+OjphZGRDbGllbnQoY2xpZW50KTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUVuYWJsZWRFZmZlY3RzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmIChtRW5hYmxlZEVmZmVjdHMudmFsdWVBdChpKS0+bVNlc3Npb24gPT0gY2xpZW50LT5zZXNzaW9uKCkpIHsKKyAgICAgICAgICAgIGNsaWVudC0+dHJhY2tFZmZlY3RFbmFibGVkKG1FbmFibGVkRWZmZWN0cy52YWx1ZUF0KGkpLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb0lucHV0RGVzY3JpcHRvcjo6c2V0Q2xpZW50QWN0aXZlKGNvbnN0IHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKQogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZ2V0Q2xpZW50KGNsaWVudC0+cG9ydElkKCkpID09IG51bGxwdHIsCisgICAgICAgICIlcyglZCkgZG9lcyBub3QgZXhpc3Qgb24gaW5wdXQgZGVzY3JpcHRvciIsIF9fZnVuY19fLCBjbGllbnQtPnBvcnRJZCgpKTsKKyAgICBpZiAoYWN0aXZlID09IGNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KIAotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBJRDogJWRcbiIsIGdldElkKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlZFxuIiwgbUZvcm1hdCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIERldmljZXMgJTA4eFxuIiwgbURldmljZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIC8vIEhhbmRsZSBub24tY2xpZW50LXNwZWNpZmljIGFjdGl2aXR5IHJlZiBjb3VudAorICAgIGludDMyX3Qgb2xkR2xvYmFsQWN0aXZlQ291bnQgPSBtR2xvYmFsQWN0aXZlQ291bnQ7CisgICAgaWYgKCFhY3RpdmUgJiYgbUdsb2JhbEFjdGl2ZUNvdW50IDwgMSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCIlcyglZCkgaW52YWxpZCBkZWFjdGl2YXRpb24gd2l0aCBnbG9iYWxBY3RpdmVDb3VudCAlZCIsCisgICAgICAgICAgICAgICBfX2Z1bmNfXywgY2xpZW50LT5wb3J0SWQoKSwgbUdsb2JhbEFjdGl2ZUNvdW50KTsKKyAgICAgICAgLy8gbUdsb2JhbEFjdGl2ZUNvdW50ID0gMTsKKyAgICB9CisgICAgY29uc3QgaW50IGRlbHRhID0gYWN0aXZlID8gMSA6IC0xOworICAgIG1HbG9iYWxBY3RpdmVDb3VudCArPSBkZWx0YTsKIAotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBtUG9saWN5TWl4LnByb21vdGUoKTsKKyAgICBpZiAoKG9sZEdsb2JhbEFjdGl2ZUNvdW50ID09IDApICYmIChtR2xvYmFsQWN0aXZlQ291bnQgPiAwKSkgeworICAgICAgICBpZiAoKHBvbGljeU1peCAhPSBOVUxMKSAmJiAoKHBvbGljeU1peC0+bUNiRmxhZ3MgJiBBdWRpb01peDo6a0NiRmxhZ05vdGlmeUFjdGl2aXR5KSAhPSAwKSkKKyAgICAgICAgeworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUocG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9NSVhJTkcpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICgob2xkR2xvYmFsQWN0aXZlQ291bnQgPiAwKSAmJiAobUdsb2JhbEFjdGl2ZUNvdW50ID09IDApKSB7CisgICAgICAgIGlmICgocG9saWN5TWl4ICE9IE5VTEwpICYmICgocG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKQorICAgICAgICB7CisgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX0lETEUpOworICAgICAgICB9CisgICAgfQogCi0gICAgbVNlc3Npb25zLmR1bXAoZmQsIDEpOworICAgIGNsaWVudC0+c2V0QWN0aXZlKGFjdGl2ZSk7CiAKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgY2hlY2tTdXNwZW5kRWZmZWN0cygpOworCisgICAgaW50IGV2ZW50ID0gYWN0aXZlID8gUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCA6IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RPUDsKKyAgICB1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKGV2ZW50LCBjbGllbnQpOworfQorCit2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjp1cGRhdGVDbGllbnRSZWNvcmRpbmdDb25maWd1cmF0aW9uKAorICAgIGludCBldmVudCwgY29uc3Qgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCkKK3sKKyAgICBBTE9HVigiJXMgcmlpZCAlZCB1aWQgJWQgcG9ydCAlZCBzZXNzaW9uICVkIGV2ZW50ICVkIiwKKyAgICAgICAgICAgIF9fZnVuY19fLCBjbGllbnQtPnJpaWQoKSwgY2xpZW50LT51aWQoKSwgY2xpZW50LT5wb3J0SWQoKSwgY2xpZW50LT5zZXNzaW9uKCksIGV2ZW50KTsKKyAgICAvLyBkbyBub3Qgc2VuZCBjYWxsYmFjayBpZiBzdGFydGluZyBhbmQgbm8gZGV2aWNlIGlzIHNlbGVjdGVkIHlldCB0byBhdm9pZAorICAgIC8vIGRvdWJsZSBjYWxsYmFja3MgZnJvbSBzdGFydElucHV0KCkgYmVmb3JlIGFuZCBhZnRlciB0aGUgZGV2aWNlIGlzIHNlbGVjdGVkCisgICAgLy8gInN0YXJ0IiBhbmQgInN0b3AiIGV2ZW50cyBmb3IgImhpZ2ggbGV2ZWwiIGNsaWVudHMgKEF1ZGlvUmVjb3JkKSBhcmUgc2VudCBieSB0aGUgY2xpZW50IHNpZGUKKyAgICBpZiAoKGV2ZW50ID09IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQgJiYgbVBhdGNoSGFuZGxlID09IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKQorICAgICAgICAgICAgfHwgKCFjbGllbnQtPmlzTG93TGV2ZWwoKQorICAgICAgICAgICAgICAgICAgICAmJiAoZXZlbnQgPT0gUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCB8fCBldmVudCA9PSBSRUNPUkRfQ09ORklHX0VWRU5UX1NUT1ApKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBzZXNzaW9uQ29uZmlnID0gY2xpZW50LT5jb25maWcoKTsKKyAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCByZWNvcmRDbGllbnRJbmZve2NsaWVudC0+cmlpZCgpLCBjbGllbnQtPnVpZCgpLCBjbGllbnQtPnNlc3Npb24oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudC0+c291cmNlKCksIGNsaWVudC0+cG9ydElkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmlzU2lsZW5jZWQoKX07CisgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBjb25maWcgPSBnZXRDb25maWcoKTsKKworICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHM7CisgICAgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb24gZWZmZWN0c0xpc3QgPSBjbGllbnQtPmdldEVuYWJsZWRFZmZlY3RzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RzTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICBjbGllbnRFZmZlY3RzLnB1c2hfYmFjayhlZmZlY3RzTGlzdC52YWx1ZUF0KGkpLT5tRGVzYyk7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0czsKKyAgICBlZmZlY3RzTGlzdCA9IGdldEVuYWJsZWRFZmZlY3RzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlZmZlY3RzTGlzdC5zaXplKCk7IGkrKykgeworICAgICAgICBlZmZlY3RzLnB1c2hfYmFjayhlZmZlY3RzTGlzdC52YWx1ZUF0KGkpLT5tRGVzYyk7CisgICAgfQorCisgICAgbUNsaWVudEludGVyZmFjZS0+b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGV2ZW50LCAmcmVjb3JkQ2xpZW50SW5mbywgJnNlc3Npb25Db25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudEVmZmVjdHMsICZjb25maWcsIGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1QYXRjaEhhbmRsZSwgc291cmNlKCkpOworfQorCitSZWNvcmRDbGllbnRWZWN0b3IgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmdldENsaWVudHNGb3JTZXNzaW9uKAorICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQoreworICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoY2xpZW50LT5zZXNzaW9uKCkgPT0gc2Vzc2lvbikgeworICAgICAgICAgICAgY2xpZW50cy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY2xpZW50czsKK30KKworUmVjb3JkQ2xpZW50VmVjdG9yIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpjbGllbnRzTGlzdChib29sIGFjdGl2ZU9ubHksIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcmVmZXJyZWREZXZpY2VPbmx5KSBjb25zdAoreworICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoKCFhY3RpdmVPbmx5IHx8IGNsaWVudC0+YWN0aXZlKCkpCisgICAgICAgICAgICAmJiAoc291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUIHx8IHNvdXJjZSA9PSBjbGllbnQtPnNvdXJjZSgpKQorICAgICAgICAgICAgJiYgKCFwcmVmZXJyZWREZXZpY2VPbmx5IHx8IGNsaWVudC0+aGFzUHJlZmVycmVkRGV2aWNlKCkpKSB7CisgICAgICAgICAgICBjbGllbnRzLnB1c2hfYmFjayhjbGllbnQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjbGllbnRzOworfQorCit2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjp0cmFja0VmZmVjdEVuYWJsZWQoY29uc3Qgc3A8RWZmZWN0RGVzY3JpcHRvcj4gJmVmZmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZWQpCit7CisgICAgaWYgKGVuYWJsZWQpIHsKKyAgICAgICAgbUVuYWJsZWRFZmZlY3RzLnJlcGxhY2VWYWx1ZUZvcihlZmZlY3QtPm1JZCwgZWZmZWN0KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtRW5hYmxlZEVmZmVjdHMucmVtb3ZlSXRlbShlZmZlY3QtPm1JZCk7CisgICAgICAgIC8vIGFsd2F5cyBleGl0IGZyb20gc3VzcGVuZCB3aGVuIGRpc2FibGluZyBhbiBlZmZlY3QgYXMgb25seSBlbmFibGVkIGVmZmVjdHMKKyAgICAgICAgLy8gYXJlIG1hbmFnZWQgYnkgY2hlY2tTdXNwZW5kRWZmZWN0cygpCisgICAgICAgIGlmIChlZmZlY3QtPm1TdXNwZW5kZWQpIHsKKyAgICAgICAgICAgIGVmZmVjdC0+bVN1c3BlbmRlZCA9IGZhbHNlOworICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0RWZmZWN0U3VzcGVuZGVkKGVmZmVjdC0+bUlkLCBlZmZlY3QtPm1TZXNzaW9uLCBlZmZlY3QtPm1TdXNwZW5kZWQpOworICAgICAgICB9CisgICAgfQorCisgICAgUmVjb3JkQ2xpZW50VmVjdG9yIGNsaWVudHMgPSBnZXRDbGllbnRzRm9yU2Vzc2lvbigoYXVkaW9fc2Vzc2lvbl90KWVmZmVjdC0+bVNlc3Npb24pOworICAgIFJlY29yZENsaWVudFZlY3RvciB1cGRhdGVkQ2xpZW50czsKKworICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogY2xpZW50cykgeworICAgICAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBjbGllbnRFZmZlY3QgPSBjbGllbnQtPmdldEVuYWJsZWRFZmZlY3RzKCkuZ2V0RWZmZWN0KGVmZmVjdC0+bUlkKTsKKyAgICAgICAgYm9vbCBjaGFuZ2VkID0gKGVuYWJsZWQgJiYgY2xpZW50RWZmZWN0ID09IG51bGxwdHIpCisgICAgICAgICAgICAgICAgfHwgKCFlbmFibGVkICYmIGNsaWVudEVmZmVjdCAhPSBudWxscHRyKTsKKyAgICAgICAgY2xpZW50LT50cmFja0VmZmVjdEVuYWJsZWQoZWZmZWN0LCBlbmFibGVkKTsKKyAgICAgICAgaWYgKGNoYW5nZWQgJiYgY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICAgICAgdXBkYXRlZENsaWVudHMucHVzaF9iYWNrKGNsaWVudCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBjaGVja1N1c3BlbmRFZmZlY3RzKCk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IHVwZGF0ZWRDbGllbnRzKSB7CisgICAgICAgIHVwZGF0ZUNsaWVudFJlY29yZGluZ0NvbmZpZ3VyYXRpb24oUkVDT1JEX0NPTkZJR19FVkVOVF9VUERBVEUsIGNsaWVudCk7CisgICAgfQorfQorCitFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBBdWRpb0lucHV0RGVzY3JpcHRvcjo6Z2V0RW5hYmxlZEVmZmVjdHMoKSBjb25zdAoreworICAgIC8vIHJlcG9ydCBlZmZlY3RzIGZvciBoaWdoZXN0IHByaW9yaXR5IGFjdGl2ZSBzb3VyY2UgYXMgYXBwbGllZCB0byBhbGwgY2xpZW50cworICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIGVuYWJsZWRFZmZlY3RzOworICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IHRvcENsaWVudCA9IGdldEhpZ2hlc3RQcmlvcml0eUNsaWVudCgpOworICAgIGlmICh0b3BDbGllbnQgIT0gbnVsbHB0cikgeworICAgICAgICBlbmFibGVkRWZmZWN0cyA9IHRvcENsaWVudC0+Z2V0RW5hYmxlZEVmZmVjdHMoKTsKKyAgICB9CisgICAgcmV0dXJuIGVuYWJsZWRFZmZlY3RzOworfQorCit2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpzZXRBcHBTdGF0ZSh1aWRfdCB1aWQsIGFwcF9zdGF0ZV90IHN0YXRlKQoreworICAgIFJlY29yZENsaWVudFZlY3RvciBjbGllbnRzID0gY2xpZW50c0xpc3QoZmFsc2UgLyphY3RpdmVPbmx5Ki8pOworICAgIFJlY29yZENsaWVudFZlY3RvciB1cGRhdGVkQ2xpZW50czsKKworICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogY2xpZW50cykgeworICAgICAgICBpZiAodWlkID09IGNsaWVudC0+dWlkKCkpIHsKKyAgICAgICAgICAgIGJvb2wgd2FzU2lsZW5jZWQgPSBjbGllbnQtPmlzU2lsZW5jZWQoKTsKKyAgICAgICAgICAgIGNsaWVudC0+c2V0QXBwU3RhdGUoc3RhdGUpOworICAgICAgICAgICAgaWYgKGNsaWVudC0+YWN0aXZlKCkgJiYgd2FzU2lsZW5jZWQgIT0gY2xpZW50LT5pc1NpbGVuY2VkKCkpIHsKKyAgICAgICAgICAgICAgICB1cGRhdGVkQ2xpZW50cy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGNoZWNrU3VzcGVuZEVmZmVjdHMoKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogdXBkYXRlZENsaWVudHMpIHsKKyAgICAgICAgdXBkYXRlQ2xpZW50UmVjb3JkaW5nQ29uZmlndXJhdGlvbihSRUNPUkRfQ09ORklHX0VWRU5UX1VQREFURSwgY2xpZW50KTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9JbnB1dERlc2NyaXB0b3I6OmNoZWNrU3VzcGVuZEVmZmVjdHMoKQoreworICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IHRvcENsaWVudCA9IGdldEhpZ2hlc3RQcmlvcml0eUNsaWVudCgpOworICAgIGlmICh0b3BDbGllbnQgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRW5hYmxlZEVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0ID0gbUVuYWJsZWRFZmZlY3RzLnZhbHVlQXQoaSk7CisgICAgICAgIGlmIChlZmZlY3QtPm1TZXNzaW9uID09IHRvcENsaWVudC0+c2Vzc2lvbigpKSB7CisgICAgICAgICAgICBpZiAoZWZmZWN0LT5tU3VzcGVuZGVkKSB7CisgICAgICAgICAgICAgICAgZWZmZWN0LT5tU3VzcGVuZGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0RWZmZWN0U3VzcGVuZGVkKGVmZmVjdC0+bUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPm1TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPm1TdXNwZW5kZWQpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCFlZmZlY3QtPm1TdXNwZW5kZWQpIHsKKyAgICAgICAgICAgIGVmZmVjdC0+bVN1c3BlbmRlZCA9IHRydWU7CisgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5zZXRFZmZlY3RTdXNwZW5kZWQoZWZmZWN0LT5tSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0LT5tU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3QtPm1TdXNwZW5kZWQpOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIEF1ZGlvSW5wdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIElEOiAlZFxuIiwgZ2V0SWQoKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBTYW1wbGluZyByYXRlOiAlZFxuIiwgbVNhbXBsaW5nUmF0ZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBGb3JtYXQ6ICVkXG4iLCBtRm9ybWF0KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRGV2aWNlcyAlc1xuIiwgbURldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICBtRW5hYmxlZEVmZmVjdHMuZHVtcChkc3QsIDEgLypzcGFjZXMqLywgZmFsc2UgLyp2ZXJib3NlKi8pOworICAgIGRzdC0+YXBwZW5kKCIgQXVkaW9SZWNvcmQgQ2xpZW50czpcbiIpOworICAgIENsaWVudE1hcEhhbmRsZXI8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj46OmR1bXAoZHN0KTsKKyAgICBkc3QtPmFwcGVuZCgiXG4iKTsKIH0KIAogYm9vbCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6aXNTb3VyY2VBY3RpdmUoYXVkaW9fc291cmNlX3Qgc291cmNlKSBjb25zdApAQCAtMzIyLDU2ICs1NDUsNzQgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotdWludDMyX3QgQXVkaW9JbnB1dENvbGxlY3Rpb246OmFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKSBjb25zdAordWludDMyX3QgQXVkaW9JbnB1dENvbGxlY3Rpb246OmFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3QKIHsKICAgICB1aW50MzJfdCBjb3VudCA9IDA7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewogICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gIGlucHV0RGVzY3JpcHRvciA9IHZhbHVlQXQoaSk7CiAgICAgICAgIGlmIChpbnB1dERlc2NyaXB0b3ItPmlzQWN0aXZlKCkgJiYKLSAgICAgICAgICAgICAgICAoKGRldmljZXMgPT0gQVVESU9fREVWSUNFX0lOX0RFRkFVTFQpIHx8Ci0gICAgICAgICAgICAgICAgICgoaW5wdXREZXNjcmlwdG9yLT5tRGV2aWNlICYgZGV2aWNlcyAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSkpIHsKKyAgICAgICAgICAgICAgICAoZGV2aWNlcy5pc0VtcHR5KCkgfHwgZGV2aWNlcy5jb250YWlucyhpbnB1dERlc2NyaXB0b3ItPmdldERldmljZSgpKSkpIHsKICAgICAgICAgICAgIGNvdW50Kys7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGNvdW50OwogfQogCi1WZWN0b3I8c3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpnZXRBY3RpdmVJbnB1dHMoYm9vbCBpZ25vcmVWaXJ0dWFsSW5wdXRzKQorVmVjdG9yPHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBBdWRpb0lucHV0Q29sbGVjdGlvbjo6Z2V0QWN0aXZlSW5wdXRzKCkKIHsKICAgICBWZWN0b3I8c3AgPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiA+IGFjdGl2ZUlucHV0czsKIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKICAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+ICBpbnB1dERlc2NyaXB0b3IgPSB2YWx1ZUF0KGkpOwotICAgICAgICBpZiAoKGlucHV0RGVzY3JpcHRvci0+aXNBY3RpdmUoKSkKLSAgICAgICAgICAgICAgICAmJiAoIWlnbm9yZVZpcnR1YWxJbnB1dHMgfHwKLSAgICAgICAgICAgICAgICAgICAgIWlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGlucHV0RGVzY3JpcHRvci0+bURldmljZSkpKSB7CisgICAgICAgIGlmIChpbnB1dERlc2NyaXB0b3ItPmlzQWN0aXZlKCkpIHsKICAgICAgICAgICAgIGFjdGl2ZUlucHV0cy5hZGQoaW5wdXREZXNjcmlwdG9yKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gYWN0aXZlSW5wdXRzOwogfQogCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9JbnB1dENvbGxlY3Rpb246OmdldFN1cHBvcnRlZERldmljZXMoYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlKSBjb25zdAorc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IEF1ZGlvSW5wdXRDb2xsZWN0aW9uOjpnZXRJbnB1dEZvckNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gdmFsdWVGb3IoaGFuZGxlKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IGlucHV0RGVzYy0+bVByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXNUeXBlKCk7Ci0gICAgcmV0dXJuIGRldmljZXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGlucHV0RGVzYy0+Z2V0Q2xpZW50KHBvcnRJZCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0RGVzYzsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKIH0KIAotc3RhdHVzX3QgQXVkaW9JbnB1dENvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAordm9pZCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6dHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5hYmxlZCkKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuSW5wdXRzIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICItIElucHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAoaW5wdXREZXNjLT5tSW9IYW5kbGUgPT0gZWZmZWN0LT5tSW8pIHsKKyAgICAgICAgICAgIHJldHVybiBpbnB1dERlc2MtPnRyYWNrRWZmZWN0RW5hYmxlZChlZmZlY3QsIGVuYWJsZWQpOworICAgICAgICB9CiAgICAgfQorfQogCi0gICAgcmV0dXJuIE5PX0VSUk9SOwordm9pZCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6Y2xlYXJTZXNzaW9uUm91dGVzRm9yRGV2aWNlKAorICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkaXNjb25uZWN0ZWREZXZpY2UpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gdmFsdWVBdChpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBpbnB1dERlc2MtPmdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQtPnByZWZlcnJlZERldmljZUlkKCkgPT0gZGlzY29ubmVjdGVkRGV2aWNlLT5nZXRJZCgpKSB7CisgICAgICAgICAgICAgICAgY2xpZW50LT5zZXRQcmVmZXJyZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb0lucHV0Q29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmQoIlxuSW5wdXRzIGR1bXA6XG4iKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCItIElucHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0KTsKKyAgICB9CiB9CiAKIH07IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb091dHB1dERlc2NyaXB0b3IuY3BwCmluZGV4IDk5YjQ1YzguLmFhYTI4YmMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvT3V0cHV0RGVzY3JpcHRvci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9PdXRwdXREZXNjcmlwdG9yLmNwcApAQCAtMTksODQgKzE5LDExNSBAQAogCiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lJbnRlcmZhY2UuaD4KICNpbmNsdWRlICJBdWRpb091dHB1dERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJBdWRpb1BvbGljeU1peC5oIgogI2luY2x1ZGUgIklPUHJvZmlsZS5oIgotI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgogI2luY2x1ZGUgIlZvbHVtZS5oIgogI2luY2x1ZGUgIkh3TW9kdWxlLmgiCisjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvR2Fpbi5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KIAogLy8gQSBkZXZpY2UgbWFzayBmb3IgYWxsIGF1ZGlvIG91dHB1dCBkZXZpY2VzIHRoYXQgYXJlIGNvbnNpZGVyZWQgInJlbW90ZSIgd2hlbiBldmFsdWF0aW5nCiAvLyBhY3RpdmUgb3V0cHV0IGRldmljZXMgaW4gaXNTdHJlYW1BY3RpdmVSZW1vdGVseSgpCi0jZGVmaW5lIEFQTV9BVURJT19PVVRfREVWSUNFX1JFTU9URV9BTEwgIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLUF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPEF1ZGlvUG9ydD4mIHBvcnQsCitzdGF0aWMgY29uc3QgRGV2aWNlVHlwZVNldCYgZ2V0QWxsT3V0UmVtb3RlRGV2aWNlcygpIHsKKyAgICBzdGF0aWMgY29uc3QgRGV2aWNlVHlwZVNldCBhbGxPdXRSZW1vdGVEZXZpY2VzID0ge0FVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWH07CisgICAgcmV0dXJuIGFsbE91dFJlbW90ZURldmljZXM7Cit9CisKK0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6QXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPFBvbGljeUF1ZGlvUG9ydD4mIHBvbGljeUF1ZGlvUG9ydCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCi0gICAgOiBtUG9ydChwb3J0KSwgbURldmljZShBVURJT19ERVZJQ0VfTk9ORSksCi0gICAgICBtQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSksIG1QYXRjaEhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSksIG1JZCgwKQorICAgIDogbVBvbGljeUF1ZGlvUG9ydChwb2xpY3lBdWRpb1BvcnQpLCBtQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSkKIHsKLSAgICAvLyBjbGVhciB1c2FnZSBjb3VudCBmb3IgYWxsIHN0cmVhbSB0eXBlcwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0NOVDsgaSsrKSB7Ci0gICAgICAgIG1SZWZDb3VudFtpXSA9IDA7Ci0gICAgICAgIG1DdXJWb2x1bWVbaV0gPSAtMS4wOwotICAgICAgICBtTXV0ZUNvdW50W2ldID0gMDsKLSAgICAgICAgbVN0b3BUaW1lW2ldID0gMDsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBOVU1fU1RSQVRFR0lFUzsgaSsrKSB7Ci0gICAgICAgIG1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0gPSBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKG1Qb3J0LmdldCgpICE9IG51bGxwdHIpIHsKLSAgICAgICAgbVBvcnQtPnBpY2tBdWRpb1Byb2ZpbGUobVNhbXBsaW5nUmF0ZSwgbUNoYW5uZWxNYXNrLCBtRm9ybWF0KTsKLSAgICAgICAgaWYgKG1Qb3J0LT5tR2FpbnMuc2l6ZSgpID4gMCkgewotICAgICAgICAgICAgbVBvcnQtPm1HYWluc1swXS0+Z2V0RGVmYXVsdENvbmZpZygmbUdhaW4pOworICAgIGlmIChtUG9saWN5QXVkaW9Qb3J0LmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgbVBvbGljeUF1ZGlvUG9ydC0+cGlja0F1ZGlvUHJvZmlsZShtU2FtcGxpbmdSYXRlLCBtQ2hhbm5lbE1hc2ssIG1Gb3JtYXQpOworICAgICAgICBpZiAobVBvbGljeUF1ZGlvUG9ydC0+YXNBdWRpb1BvcnQoKS0+Z2V0R2FpbnMoKS5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICBtUG9saWN5QXVkaW9Qb3J0LT5hc0F1ZGlvUG9ydCgpLT5nZXRHYWlucygpWzBdLT5nZXREZWZhdWx0Q29uZmlnKCZtR2Fpbik7CiAgICAgICAgIH0KICAgICB9CiB9CiAKK2F1ZGlvX2NvbmZpZ19iYXNlX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpnZXRDb25maWcoKSBjb25zdAoreworICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnID0geyAuc2FtcGxlX3JhdGUgPSBtU2FtcGxpbmdSYXRlLCAuY2hhbm5lbF9tYXNrID0gbUNoYW5uZWxNYXNrLAorICAgICAgICAgICAgLmZvcm1hdCA9IG1Gb3JtYXQgfTsKKyAgICByZXR1cm4gY29uZmlnOworfQorCiBhdWRpb19tb2R1bGVfaGFuZGxlX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpnZXRNb2R1bGVIYW5kbGUoKSBjb25zdAogewotICAgIHJldHVybiBtUG9ydC5nZXQoKSAhPSBudWxscHRyID8gbVBvcnQtPmdldE1vZHVsZUhhbmRsZSgpIDogQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOworICAgIHJldHVybiBtUG9saWN5QXVkaW9Qb3J0LmdldCgpICE9IG51bGxwdHIgPworICAgICAgICAgICAgbVBvbGljeUF1ZGlvUG9ydC0+Z2V0TW9kdWxlSGFuZGxlKCkgOiBBVURJT19NT0RVTEVfSEFORExFX05PTkU7CiB9CiAKLWF1ZGlvX3BvcnRfaGFuZGxlX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpnZXRJZCgpIGNvbnN0CithdWRpb19wYXRjaF9oYW5kbGVfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmdldFBhdGNoSGFuZGxlKCkgY29uc3QKIHsKLSAgICByZXR1cm4gbUlkOworICAgIHJldHVybiBtUGF0Y2hIYW5kbGU7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmRldmljZSgpIGNvbnN0Cit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0UGF0Y2hIYW5kbGUoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQogewotICAgIHJldHVybiBtRGV2aWNlOwotfQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzdXBwb3J0ZWREZXZpY2VzKCkKLXsKLSAgICByZXR1cm4gbURldmljZTsKKyAgICBtUGF0Y2hIYW5kbGUgPSBoYW5kbGU7CiB9CiAKIGJvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzaGFyZXNId01vZHVsZVdpdGgoCiAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpCiB7Ci0gICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgIHJldHVybiBzaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYy0+c3ViT3V0cHV0MSgpKSB8fAotICAgICAgICAgICAgICAgICAgICBzaGFyZXNId01vZHVsZVdpdGgob3V0cHV0RGVzYy0+c3ViT3V0cHV0MigpKTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gaGFzU2FtZUh3TW9kdWxlQXMob3V0cHV0RGVzYyk7Ci0gICAgfQorICAgIHJldHVybiBoYXNTYW1lSHdNb2R1bGVBcyhvdXRwdXREZXNjKTsKIH0KIAotdm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmNoYW5nZVJlZkNvdW50KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWx0YSkKK3ZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRTdG9wVGltZShjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIG5zZWNzX3Qgc3lzVGltZSkKIHsKLSAgICBpZiAoKGRlbHRhICsgKGludCltUmVmQ291bnRbc3RyZWFtXSkgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJjaGFuZ2VSZWZDb3VudCgpIGludmFsaWQgZGVsdGEgJWQgZm9yIHN0cmVhbSAlZCwgcmVmQ291bnQgJWQiLAotICAgICAgICAgICAgICBkZWx0YSwgc3RyZWFtLCBtUmVmQ291bnRbc3RyZWFtXSk7Ci0gICAgICAgIG1SZWZDb3VudFtzdHJlYW1dID0gMDsKKyAgICBtVm9sdW1lQWN0aXZpdGllc1tjbGllbnQtPnZvbHVtZVNvdXJjZSgpXS5zZXRTdG9wVGltZShzeXNUaW1lKTsKKyAgICBtUm91dGluZ0FjdGl2aXRpZXNbY2xpZW50LT5zdHJhdGVneSgpXS5zZXRTdG9wVGltZShzeXNUaW1lKTsKK30KKwordm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldENsaWVudEFjdGl2ZShjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsIGJvb2wgYWN0aXZlKQoreworICAgIGF1dG8gY2xpZW50SXRlciA9IHN0ZDo6ZmluZChiZWdpbihtQWN0aXZlQ2xpZW50cyksIGVuZChtQWN0aXZlQ2xpZW50cyksIGNsaWVudCk7CisgICAgaWYgKGFjdGl2ZSA9PSAoY2xpZW50SXRlciAhPSBlbmQobUFjdGl2ZUNsaWVudHMpKSkgeworICAgICAgICBBTE9HVygiJXMoJXMpOiBpZ25vcmVkIGFjdGl2ZTogJWQsIGN1cnJlbnQgc3RyZWFtIGNvdW50ICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIGNsaWVudC0+dG9TaG9ydFN0cmluZygpLmNfc3RyKCksIGFjdGl2ZSwKKyAgICAgICAgICAgICAgbVJvdXRpbmdBY3Rpdml0aWVzLmF0KGNsaWVudC0+c3RyYXRlZ3koKSkuZ2V0QWN0aXZpdHlDb3VudCgpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBtUmVmQ291bnRbc3RyZWFtXSArPSBkZWx0YTsKLSAgICBBTE9HVigiY2hhbmdlUmVmQ291bnQoKSBzdHJlYW0gJWQsIGNvdW50ICVkIiwgc3RyZWFtLCBtUmVmQ291bnRbc3RyZWFtXSk7CisgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICBtQWN0aXZlQ2xpZW50cy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQWN0aXZlQ2xpZW50cy5lcmFzZShjbGllbnRJdGVyKTsKKyAgICB9CisgICAgY29uc3QgaW50IGRlbHRhID0gYWN0aXZlID8gMSA6IC0xOworICAgIC8vIElmIHBzIGlzIHVua25vd24sIGl0IGlzIHRpbWUgdG8gdHJhY2sgaXQhCisgICAgbVJvdXRpbmdBY3Rpdml0aWVzW2NsaWVudC0+c3RyYXRlZ3koKV0uY2hhbmdlQWN0aXZpdHlDb3VudChkZWx0YSk7CisgICAgbVZvbHVtZUFjdGl2aXRpZXNbY2xpZW50LT52b2x1bWVTb3VyY2UoKV0uY2hhbmdlQWN0aXZpdHlDb3VudChkZWx0YSk7CisKKyAgICAvLyBIYW5kbGUgbm9uLWNsaWVudC1zcGVjaWZpYyBhY3Rpdml0eSByZWYgY291bnQKKyAgICBpbnQzMl90IG9sZEdsb2JhbEFjdGl2ZUNvdW50ID0gbUdsb2JhbEFjdGl2ZUNvdW50OworICAgIGlmICghYWN0aXZlICYmIG1HbG9iYWxBY3RpdmVDb3VudCA8IDEpIHsKKyAgICAgICAgQUxPR1coIiVzKCVzKTogaW52YWxpZCBkZWFjdGl2YXRpb24gd2l0aCBnbG9iYWxSZWZDb3VudCAlZCIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBjbGllbnQtPnRvU2hvcnRTdHJpbmcoKS5jX3N0cigpLCBtR2xvYmFsQWN0aXZlQ291bnQpOworICAgICAgICBtR2xvYmFsQWN0aXZlQ291bnQgPSAxOworICAgIH0KKyAgICBtR2xvYmFsQWN0aXZlQ291bnQgKz0gZGVsdGE7CisKKyAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gbVBvbGljeU1peC5wcm9tb3RlKCk7CisgICAgaWYgKChwb2xpY3lNaXggIT0gTlVMTCkgJiYgKChwb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpIHsKKyAgICAgICAgaWYgKChvbGRHbG9iYWxBY3RpdmVDb3VudCA9PSAwKSB8fCAobUdsb2JhbEFjdGl2ZUNvdW50ID09IDApKSB7CisgICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgIG1HbG9iYWxBY3RpdmVDb3VudCA+IDAgPyBNSVhfU1RBVEVfTUlYSU5HIDogTUlYX1NUQVRFX0lETEUpOworICAgICAgICB9CisgICAgfQorICAgIGNsaWVudC0+c2V0QWN0aXZlKGFjdGl2ZSk7Cit9CisKK2Jvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0FjdGl2ZShWb2x1bWVTb3VyY2UgdnMsIHVpbnQzMl90IGluUGFzdE1zLCBuc2Vjc190IHN5c1RpbWUpIGNvbnN0Cit7CisgICAgcmV0dXJuICh2cyA9PSBWT0xVTUVfU09VUkNFX05PTkUpID8KKyAgICAgICAgICAgICAgICBpc0FjdGl2ZShpblBhc3RNcykgOiAobVZvbHVtZUFjdGl2aXRpZXMuZmluZCh2cykgIT0gc3RkOjplbmQobVZvbHVtZUFjdGl2aXRpZXMpPworICAgICAgICAgICAgICAgIG1Wb2x1bWVBY3Rpdml0aWVzLmF0KHZzKS5pc0FjdGl2ZShpblBhc3RNcywgc3lzVGltZSkgOiBmYWxzZSk7CiB9CiAKIGJvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0FjdGl2ZSh1aW50MzJfdCBpblBhc3RNcykgY29uc3QKQEAgLTEwNSw2MiArMTM2LDU4IEBACiAgICAgaWYgKGluUGFzdE1zICE9IDApIHsKICAgICAgICAgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KUFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBpZiAoaSA9PSBBVURJT19TVFJFQU1fUEFUQ0gpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBtVm9sdW1lQWN0aXZpdGllcykgeworICAgICAgICBpZiAoaXRlci5zZWNvbmQuaXNBY3RpdmUoaW5QYXN0TXMsIHN5c1RpbWUpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUpIGNvbnN0Ci17Ci0gICAgaWYgKG1SZWZDb3VudFtzdHJlYW1dICE9IDApIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmIChpblBhc3RNcyA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKHN5c1RpbWUgPT0gMCkgewotICAgICAgICBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwotICAgIH0KLSAgICBpZiAobnMybXMoc3lzVGltZSAtIG1TdG9wVGltZVtzdHJlYW1dKSA8IGluUGFzdE1zKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzRml4ZWRWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSBfX3VudXNlZCkKK2Jvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0ZpeGVkVm9sdW1lKGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzIF9fdW51c2VkKQogewogICAgIHJldHVybiBmYWxzZTsKIH0KIAotYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZShmbG9hdCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlIF9fdW51c2VkLAorYm9vbCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZShmbG9hdCB2b2x1bWVEYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyZWFtVHlwZVZlY3RvciAmLypzdHJlYW1zKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVR5cGVTZXQmIC8qZGV2aWNlVHlwZXMqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKIHsKICAgICAvLyBXZSBhY3R1YWxseSBjaGFuZ2UgdGhlIHZvbHVtZSBpZjoKICAgICAvLyAtIHRoZSBmbG9hdCB2YWx1ZSByZXR1cm5lZCBieSBjb21wdXRlVm9sdW1lKCkgY2hhbmdlZAogICAgIC8vIC0gdGhlIGZvcmNlIGZsYWcgaXMgc2V0Ci0gICAgaWYgKHZvbHVtZSAhPSBtQ3VyVm9sdW1lW3N0cmVhbV0gfHwgZm9yY2UpIHsKLSAgICAgICAgQUxPR1YoInNldFZvbHVtZSgpIGZvciBzdHJlYW0gJWQsIHZvbHVtZSAlZiwgZGVsYXkgJWQiLCBzdHJlYW0sIHZvbHVtZSwgZGVsYXlNcyk7Ci0gICAgICAgIG1DdXJWb2x1bWVbc3RyZWFtXSA9IHZvbHVtZTsKKyAgICBpZiAodm9sdW1lRGIgIT0gZ2V0Q3VyVm9sdW1lKHZvbHVtZVNvdXJjZSkgfHwgZm9yY2UpIHsKKyAgICAgICAgQUxPR1YoIiVzIGZvciB2b2x1bWVTcmMgJWQsIHZvbHVtZSAlZiwgZGVsYXkgJWQiLCBfX2Z1bmNfXywgdm9sdW1lU291cmNlLCB2b2x1bWVEYiwgZGVsYXlNcyk7CisgICAgICAgIHNldEN1clZvbHVtZSh2b2x1bWVTb3VyY2UsIHZvbHVtZURiKTsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAorc3RhdHVzX3QgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjphcHBseUF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9jb25maWcgKmJhY2t1cENvbmZpZykKK3sKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbG9jYWxCYWNrdXBDb25maWcgPSB7IC5jb25maWdfbWFzayA9IGNvbmZpZy0+Y29uZmlnX21hc2sgfTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKworICAgIHRvQXVkaW9Qb3J0Q29uZmlnKCZsb2NhbEJhY2t1cENvbmZpZyk7CisgICAgaWYgKChzdGF0dXMgPSB2YWxpZGF0aW9uQmVmb3JlQXBwbHlDb25maWcoY29uZmlnKSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgQXVkaW9Qb3J0Q29uZmlnOjphcHBseUF1ZGlvUG9ydENvbmZpZyhjb25maWcsIGJhY2t1cENvbmZpZyk7CisgICAgICAgIGFwcGx5UG9saWN5QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgfQorCisgICAgaWYgKGJhY2t1cENvbmZpZyAhPSBOVUxMKSB7CisgICAgICAgICpiYWNrdXBDb25maWcgPSBsb2NhbEJhY2t1cENvbmZpZzsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCit2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0CiB7CiAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFfEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTS3wKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX0NPTkZJR19GT1JNQVR8QVVESU9fUE9SVF9DT05GSUdfR0FJTjsKQEAgLTE2OCw4ICsxOTUsOCBAQAogICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IHNyY0NvbmZpZy0+Y29uZmlnX21hc2s7CiAgICAgfQogICAgIEF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOworICAgIHRvUG9saWN5QXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKIAotICAgIGRzdENvbmZpZy0+aWQgPSBtSWQ7CiAgICAgZHN0Q29uZmlnLT5yb2xlID0gQVVESU9fUE9SVF9ST0xFX1NPVVJDRTsKICAgICBkc3RDb25maWctPnR5cGUgPSBBVURJT19QT1JUX1RZUEVfTUlYOwogICAgIGRzdENvbmZpZy0+ZXh0Lm1peC5od19tb2R1bGUgPSBnZXRNb2R1bGVIYW5kbGUoKTsKQEAgLTE3OSwzNyArMjA2LDYwIEBACiB2b2lkIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0CiB7CiAgICAgLy8gU2hvdWxkIG5vdCBiZSBjYWxsZWQgZm9yIGR1cGxpY2F0ZWQgcG9ydHMsIHNlZSBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcuCi0gICAgbVBvcnQtPnRvQXVkaW9Qb3J0KHBvcnQpOworICAgIG1Qb2xpY3lBdWRpb1BvcnQtPmFzQXVkaW9Qb3J0KCktPnRvQXVkaW9Qb3J0KHBvcnQpOwogICAgIHBvcnQtPmlkID0gbUlkOwogICAgIHBvcnQtPmV4dC5taXguaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7CiB9CiAKLXN0YXR1c190IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChpbnQgZmQpCitUcmFja0NsaWVudFZlY3RvciBBdWRpb091dHB1dERlc2NyaXB0b3I6OmNsaWVudHNMaXN0KGJvb2wgYWN0aXZlT25seSwgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHByZWZlcnJlZERldmljZU9ubHkpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSUQ6ICVkXG4iLCBtSWQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgU2FtcGxpbmcgcmF0ZTogJWRcbiIsIG1TYW1wbGluZ1JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9ybWF0OiAlMDh4XG4iLCBtRm9ybWF0KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIENoYW5uZWxzOiAlMDh4XG4iLCBtQ2hhbm5lbE1hc2spOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRGV2aWNlcyAlMDh4XG4iLCBkZXZpY2UoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBTdHJlYW0gdm9sdW1lIHJlZkNvdW50IG11dGVDb3VudFxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGludClBVURJT19TVFJFQU1fQ05UOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMmQgICAgICUuMDNmICAgICAlMDJkICAgICAgICUwMmRcbiIsCi0gICAgICAgICAgICAgICAgIGksIG1DdXJWb2x1bWVbaV0sIG1SZWZDb3VudFtpXSwgbU11dGVDb3VudFtpXSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBUcmFja0NsaWVudFZlY3RvciBjbGllbnRzOworICAgIGZvciAoY29uc3QgYXV0byAmY2xpZW50IDogZ2V0Q2xpZW50SXRlcmFibGUoKSkgeworICAgICAgICBpZiAoKCFhY3RpdmVPbmx5IHx8IGNsaWVudC0+YWN0aXZlKCkpCisgICAgICAgICAgICAmJiAoc3RyYXRlZ3kgPT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FIHx8IHN0cmF0ZWd5ID09IGNsaWVudC0+c3RyYXRlZ3koKSkKKyAgICAgICAgICAgICYmICghcHJlZmVycmVkRGV2aWNlT25seSB8fAorICAgICAgICAgICAgICAgIChjbGllbnQtPmhhc1ByZWZlcnJlZERldmljZSgpICYmICFjbGllbnQtPmlzUHJlZmVycmVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlKCkpKSkgeworICAgICAgICAgICAgY2xpZW50cy5wdXNoX2JhY2soY2xpZW50KTsKKyAgICAgICAgfQogICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICByZXR1cm4gY2xpZW50czsKK30KIAotICAgIHJldHVybiBOT19FUlJPUjsKK2Jvb2wgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjppc0FueUFjdGl2ZShWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlVG9JZ25vcmUpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0ZDo6ZmluZF9pZihiZWdpbihtQWN0aXZlQ2xpZW50cyksIGVuZChtQWN0aXZlQ2xpZW50cyksCisgICAgICAgICAgICAgICAgICAgICAgICBbJnZvbHVtZVNvdXJjZVRvSWdub3JlXShjb25zdCBhdXRvICZjbGllbnQpIHsKKyAgICAgICAgcmV0dXJuIGNsaWVudC0+dm9sdW1lU291cmNlKCkgIT0gdm9sdW1lU291cmNlVG9JZ25vcmU7IH0pICE9IGVuZChtQWN0aXZlQ2xpZW50cyk7Cit9CisKK3ZvaWQgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIElEOiAlZFxuIiwgbUlkKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFNhbXBsaW5nIHJhdGU6ICVkXG4iLCBtU2FtcGxpbmdSYXRlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEZvcm1hdDogJTA4eFxuIiwgbUZvcm1hdCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBDaGFubmVsczogJTA4eFxuIiwgbUNoYW5uZWxNYXNrKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIERldmljZXM6ICVzXG4iLCBkZXZpY2VzKCkudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIEdsb2JhbCBhY3RpdmUgY291bnQ6ICV1XG4iLCBtR2xvYmFsQWN0aXZlQ291bnQpOworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6IG1Sb3V0aW5nQWN0aXZpdGllcykgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIFByb2R1Y3QgU3RyYXRlZ3kgaWQ6ICVkIiwgaXRlci5maXJzdCk7CisgICAgICAgIGl0ZXIuc2Vjb25kLmR1bXAoZHN0LCA0KTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVZvbHVtZUFjdGl2aXRpZXMpIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBWb2x1bWUgQWN0aXZpdGllcyBpZDogJWQiLCBpdGVyLmZpcnN0KTsKKyAgICAgICAgaXRlci5zZWNvbmQuZHVtcChkc3QsIDQpOworICAgIH0KKyAgICBkc3QtPmFwcGVuZCgiIEF1ZGlvVHJhY2sgQ2xpZW50czpcbiIpOworICAgIENsaWVudE1hcEhhbmRsZXI8VHJhY2tDbGllbnREZXNjcmlwdG9yPjo6ZHVtcChkc3QpOworICAgIGRzdC0+YXBwZW5kKCJcbiIpOworICAgIGlmICghbUFjdGl2ZUNsaWVudHMuZW1wdHkoKSkgeworICAgICAgICBkc3QtPmFwcGVuZCgiIEF1ZGlvVHJhY2sgYWN0aXZlIChzdHJlYW0pIGNsaWVudHM6XG4iKTsKKyAgICAgICAgc2l6ZV90IGluZGV4ID0gMDsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBtQWN0aXZlQ2xpZW50cykgeworICAgICAgICAgICAgY2xpZW50LT5kdW1wKGRzdCwgMiwgaW5kZXgrKyk7CisgICAgICAgIH0KKyAgICAgICAgZHN0LT5hcHBlbmQoIiBcbiIpOworICAgIH0KIH0KIAogdm9pZCBBdWRpb091dHB1dERlc2NyaXB0b3I6OmxvZyhjb25zdCBjaGFyKiBpbmRlbnQpCkBAIC0yMjMsNDMgKzI3MywzNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCiAgICAgOiBBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgY2xpZW50SW50ZXJmYWNlKSwKICAgICBtUHJvZmlsZShwcm9maWxlKSwgbUlvSGFuZGxlKEFVRElPX0lPX0hBTkRMRV9OT05FKSwgbUxhdGVuY3koMCksCi0gICAgbUZsYWdzKChhdWRpb19vdXRwdXRfZmxhZ3NfdCkwKSwgbVBvbGljeU1peChOVUxMKSwKKyAgICBtRmxhZ3MoKGF1ZGlvX291dHB1dF9mbGFnc190KTApLAogICAgIG1PdXRwdXQxKDApLCBtT3V0cHV0MigwKSwgbURpcmVjdE9wZW5Db3VudCgwKSwKLSAgICBtRGlyZWN0Q2xpZW50U2Vzc2lvbihBVURJT19TRVNTSU9OX05PTkUpLCBtR2xvYmFsUmVmQ291bnQoMCkKKyAgICBtRGlyZWN0Q2xpZW50U2Vzc2lvbihBVURJT19TRVNTSU9OX05PTkUpCiB7CiAgICAgaWYgKHByb2ZpbGUgIT0gTlVMTCkgewogICAgICAgICBtRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpcHJvZmlsZS0+Z2V0RmxhZ3MoKTsKICAgICB9CiB9CiAKLXN0YXR1c190IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3ZvaWQgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIExhdGVuY3k6ICVkXG4iLCBtTGF0ZW5jeSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBGbGFncyAlMDh4XG4iLCBtRmxhZ3MpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChmZCk7Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBMYXRlbmN5OiAlZFxuIiwgbUxhdGVuY3kpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRmxhZ3MgJTA4eFxuIiwgbUZsYWdzKTsKKyAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoZHN0KTsKIH0KIAotYXVkaW9fZGV2aWNlc190IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkZXZpY2UoKSBjb25zdAorRGV2aWNlVmVjdG9yIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpkZXZpY2VzKCkgY29uc3QKIHsKICAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgcmV0dXJuIChhdWRpb19kZXZpY2VzX3QpKG1PdXRwdXQxLT5tRGV2aWNlIHwgbU91dHB1dDItPm1EZXZpY2UpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlOworICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG1PdXRwdXQxLT5kZXZpY2VzKCk7CisgICAgICAgIGRldmljZXMubWVyZ2UobU91dHB1dDItPmRldmljZXMoKSk7CisgICAgICAgIHJldHVybiBkZXZpY2VzOwogICAgIH0KKyAgICByZXR1cm4gbURldmljZXM7CiB9CiAKIGJvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnNoYXJlc0h3TW9kdWxlV2l0aCgKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYykKKyAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKQogewogICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgewogICAgICAgICByZXR1cm4gbU91dHB1dDEtPnNoYXJlc0h3TW9kdWxlV2l0aChvdXRwdXREZXNjKSB8fCBtT3V0cHV0Mi0+c2hhcmVzSHdNb2R1bGVXaXRoKG91dHB1dERlc2MpOwpAQCAtMjcxLDEyICszMTIsMzkgQEAKICAgICB9CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydGVkRGV2aWNlcygpCitEZXZpY2VWZWN0b3IgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRlZERldmljZXMoKSBjb25zdAogewogICAgIGlmIChpc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICByZXR1cm4gKGF1ZGlvX2RldmljZXNfdCkobU91dHB1dDEtPnN1cHBvcnRlZERldmljZXMoKSB8IG1PdXRwdXQyLT5zdXBwb3J0ZWREZXZpY2VzKCkpOworICAgICAgICBEZXZpY2VWZWN0b3Igc3VwcG9ydGVkRGV2aWNlcyA9IG1PdXRwdXQxLT5zdXBwb3J0ZWREZXZpY2VzKCk7CisgICAgICAgIHN1cHBvcnRlZERldmljZXMubWVyZ2UobU91dHB1dDItPnN1cHBvcnRlZERldmljZXMoKSk7CisgICAgICAgIHJldHVybiBzdXBwb3J0ZWREZXZpY2VzOworICAgIH0KKyAgICByZXR1cm4gbVByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKTsKK30KKworYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c3VwcG9ydHNEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSkgY29uc3QKK3sKKyAgICByZXR1cm4gc3VwcG9ydGVkRGV2aWNlcygpLmNvbnRhaW5zKGRldmljZSk7Cit9CisKK2Jvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRzQWxsRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN1cHBvcnRlZERldmljZXMoKS5jb250YWluc0FsbERldmljZXMoZGV2aWNlcyk7Cit9CisKK0RldmljZVZlY3RvciBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZmlsdGVyU3VwcG9ydGVkRGV2aWNlcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0Cit7CisgICAgRGV2aWNlVmVjdG9yIGZpbHRlcmVkRGV2aWNlcyA9IHN1cHBvcnRlZERldmljZXMoKTsKKyAgICByZXR1cm4gZmlsdGVyZWREZXZpY2VzLmZpbHRlcihkZXZpY2VzKTsKK30KKworYm9vbCBTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZGV2aWNlc1N1cHBvcnRFbmNvZGVkRm9ybWF0cyhjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcykKK3sKKyAgICBpZiAoaXNEdXBsaWNhdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIChtT3V0cHV0MS0+ZGV2aWNlc1N1cHBvcnRFbmNvZGVkRm9ybWF0cyhkZXZpY2VUeXBlcykKKyAgICAgICAgICAgICAgICAgICAgfHwgbU91dHB1dDItPmRldmljZXNTdXBwb3J0RW5jb2RlZEZvcm1hdHMoZGV2aWNlVHlwZXMpKTsKICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbVByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXNUeXBlKCk7CisgICAgICAgcmV0dXJuIG1Qcm9maWxlLT5kZXZpY2VzU3VwcG9ydEVuY29kZWRGb3JtYXRzKGRldmljZVR5cGVzKTsKICAgICB9CiB9CiAKQEAgLTI4OSw1MSArMzU3LDI2IEBACiAgICAgfQogfQogCi12b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjaGFuZ2VSZWZDb3VudChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsdGEpCit2b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRDbGllbnRBY3RpdmUoY29uc3Qgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiYgY2xpZW50LCBib29sIGFjdGl2ZSkKIHsKICAgICAvLyBmb3J3YXJkIHVzYWdlIGNvdW50IGNoYW5nZSB0byBhdHRhY2hlZCBvdXRwdXRzCiAgICAgaWYgKGlzRHVwbGljYXRlZCgpKSB7Ci0gICAgICAgIG1PdXRwdXQxLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIGRlbHRhKTsKLSAgICAgICAgbU91dHB1dDItPmNoYW5nZVJlZkNvdW50KHN0cmVhbSwgZGVsdGEpOworICAgICAgICBtT3V0cHV0MS0+c2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgYWN0aXZlKTsKKyAgICAgICAgbU91dHB1dDItPnNldENsaWVudEFjdGl2ZShjbGllbnQsIGFjdGl2ZSk7CiAgICAgfQotICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCBkZWx0YSk7Ci0KLSAgICAvLyBoYW5kbGUgc3RyZWFtLWluZGVwZW5kZW50IHJlZiBjb3VudAotICAgIHVpbnQzMl90IG9sZEdsb2JhbFJlZkNvdW50ID0gbUdsb2JhbFJlZkNvdW50OwotICAgIGlmICgoZGVsdGEgKyAoaW50KW1HbG9iYWxSZWZDb3VudCkgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJjaGFuZ2VSZWZDb3VudCgpIGludmFsaWQgZGVsdGEgJWQgZ2xvYmFsUmVmQ291bnQgJWQiLCBkZWx0YSwgbUdsb2JhbFJlZkNvdW50KTsKLSAgICAgICAgbUdsb2JhbFJlZkNvdW50ID0gMDsKLSAgICB9IGVsc2UgewotICAgICAgICBtR2xvYmFsUmVmQ291bnQgKz0gZGVsdGE7Ci0gICAgfQotICAgIGlmICgob2xkR2xvYmFsUmVmQ291bnQgPT0gMCkgJiYgKG1HbG9iYWxSZWZDb3VudCA+IDApKSB7Ci0gICAgICAgIGlmICgobVBvbGljeU1peCAhPSBOVUxMKSAmJiAoKG1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKG1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfTUlYSU5HKTsKLSAgICAgICAgfQotCi0gICAgfSBlbHNlIGlmICgob2xkR2xvYmFsUmVmQ291bnQgPiAwKSAmJiAobUdsb2JhbFJlZkNvdW50ID09IDApKSB7Ci0gICAgICAgIGlmICgobVBvbGljeU1peCAhPSBOVUxMKSAmJiAoKG1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKG1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfSURMRSk7Ci0gICAgICAgIH0KLSAgICB9CisgICAgQXVkaW9PdXRwdXREZXNjcmlwdG9yOjpzZXRDbGllbnRBY3RpdmUoY2xpZW50LCBhY3RpdmUpOwogfQogCi0KLWJvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzRml4ZWRWb2x1bWUoYXVkaW9fZGV2aWNlc190IGRldmljZSkKK2Jvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OmlzRml4ZWRWb2x1bWUoY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpCiB7CiAgICAgLy8gdW5pdCBnYWluIGlmIHJlcm91dGluZyB0byBleHRlcm5hbCBwb2xpY3kKLSAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCkgeworICAgIGlmIChpc1NpbmdsZURldmljZVR5cGUoZGV2aWNlVHlwZXMsIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCkpIHsKICAgICAgICAgaWYgKG1Qb2xpY3lNaXggIT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR1YoIm1heCBnYWluIHdoZW4gcmVyb3V0aW5nIGZvciBvdXRwdXQ9JWQiLCBtSW9IYW5kbGUpOwogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCkgeworICAgIGlmIChpc1NpbmdsZURldmljZVR5cGUoZGV2aWNlVHlwZXMsIEFVRElPX0RFVklDRV9PVVRfVEVMRVBIT05ZX1RYKSkgewogICAgICAgICBBTE9HVigibWF4IGdhaW4gd2hlbiBvdXRwdXQgZGV2aWNlIGlzIHRlbGVwaG9ueSB0eCIpOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC0zNjQsMzQgKzQwNyw3NSBAQAogICAgICAgICAgICAgbUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRkFTVCA/IEFVRElPX0xBVEVOQ1lfTE9XIDogQVVESU9fTEFURU5DWV9OT1JNQUw7CiB9CiAKLWJvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZShmbG9hdCB2b2x1bWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKK2Jvb2wgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZShmbG9hdCB2b2x1bWVEYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2UgdnMsIGNvbnN0IFN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKIHsKLSAgICBib29sIGNoYW5nZWQgPSBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZSh2b2x1bWUsIHN0cmVhbSwgZGV2aWNlLCBkZWxheU1zLCBmb3JjZSk7Ci0KLSAgICBpZiAoY2hhbmdlZCkgewotICAgICAgICAvLyBGb3JjZSBWT0lDRV9DQUxMIHRvIHRyYWNrIEJMVUVUT09USF9TQ08gc3RyZWFtIHZvbHVtZSB3aGVuIGJsdWV0b290aCBhdWRpbyBpcwotICAgICAgICAvLyBlbmFibGVkCi0gICAgICAgIGZsb2F0IHZvbHVtZSA9IFZvbHVtZTo6RGJUb0FtcGwobUN1clZvbHVtZVtzdHJlYW1dKTsKLSAgICAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgewotICAgICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0U3RyZWFtVm9sdW1lKAotICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgdm9sdW1lLCBtSW9IYW5kbGUsIGRlbGF5TXMpOwotICAgICAgICB9Ci0gICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZSwgbUlvSGFuZGxlLCBkZWxheU1zKTsKKyAgICBTdHJlYW1UeXBlVmVjdG9yIHN0cmVhbXMgPSBzdHJlYW1UeXBlczsKKyAgICBpZiAoIUF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKHZvbHVtZURiLCB2cywgc3RyZWFtVHlwZXMsIGRldmljZVR5cGVzLCBkZWxheU1zLCBmb3JjZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICByZXR1cm4gY2hhbmdlZDsKKyAgICBpZiAoc3RyZWFtcy5lbXB0eSgpKSB7CisgICAgICAgIHN0cmVhbXMucHVzaF9iYWNrKEFVRElPX1NUUkVBTV9NVVNJQyk7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlUG9ydCA6IGRldmljZXMoKSkgeworICAgICAgICAvLyBBUE0gbG9vcHMgb24gYWxsIGdyb3VwLCBzbyBmaWx0ZXIgb24gYWN0aXZlIGdyb3VwIHRvIHNldCB0aGUgcG9ydCBnYWluLAorICAgICAgICAvLyBsZXQgdGhlIG90aGVyIGdyb3VwcyBzZXQgdGhlIHN0cmVhbSB2b2x1bWUgYXMgcGVyIGxlZ2FjeQorICAgICAgICAvLyBUT0RPOiBQYXNzIGluIHRoZSBkZXZpY2UgYWRkcmVzcyBhbmQgY2hlY2sgYWdhaW5zdCBpdC4KKyAgICAgICAgaWYgKGlzU2luZ2xlRGV2aWNlVHlwZShkZXZpY2VUeXBlcywgZGV2aWNlUG9ydC0+dHlwZSgpKSAmJgorICAgICAgICAgICAgICAgIGRldmljZVBvcnQtPmhhc0dhaW5Db250cm9sbGVyKHRydWUpICYmIGlzQWN0aXZlKHZzKSkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBkZXZpY2UgJXMgaGFzIGdhaW4gY29udHJvbGxlciIsIF9fZnVuY19fLCBkZXZpY2VQb3J0LT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgLy8gQHRvZG86IGhlcmUgd2UgbWlnaHQgYmUgaW4gdHJvdWJsZSBpZiB0aGUgU3dPdXRwdXQgaGFzIHNldmVyYWwgYWN0aXZlIGNsaWVudHMgd2l0aAorICAgICAgICAgICAgLy8gZGlmZmVyZW50IFZvbHVtZSBTb3VyY2UgKG9yIGlmIHdlIGFsbG93IHNldmVyYWwgY3VydmVzIHdpdGhpbiBzYW1lIHZvbHVtZSBncm91cCkKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBAdG9kbzogZGVmYXVsdCBzdHJlYW0gdm9sdW1lIHRvIG1heCAoMCkgd2hlbiB1c2luZyBIVyBQb3J0IGdhaW4/CisgICAgICAgICAgICBmbG9hdCB2b2x1bWVBbXBsID0gVm9sdW1lOjpEYlRvQW1wbCgwKTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtIDogc3RyZWFtcykgeworICAgICAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPnNldFN0cmVhbVZvbHVtZShzdHJlYW0sIHZvbHVtZUFtcGwsIG1Jb0hhbmRsZSwgZGVsYXlNcyk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEF1ZGlvR2FpbnMgZ2FpbnMgPSBkZXZpY2VQb3J0LT5nZXRHYWlucygpOworICAgICAgICAgICAgaW50IGdhaW5NaW5WYWx1ZUluTWIgPSBnYWluc1swXS0+Z2V0TWluVmFsdWVJbk1iKCk7CisgICAgICAgICAgICBpbnQgZ2Fpbk1heFZhbHVlSW5NYiA9IGdhaW5zWzBdLT5nZXRNYXhWYWx1ZUluTWIoKTsKKyAgICAgICAgICAgIGludCBnYWluU3RlcFZhbHVlSW5NYiA9IGdhaW5zWzBdLT5nZXRTdGVwVmFsdWVJbk1iKCk7CisgICAgICAgICAgICBpbnQgZ2FpblZhbHVlTWIgPSAoKHZvbHVtZURiICogMTAwKS8gZ2FpblN0ZXBWYWx1ZUluTWIpICogZ2FpblN0ZXBWYWx1ZUluTWI7CisgICAgICAgICAgICBnYWluVmFsdWVNYiA9IHN0ZDo6bWF4KGdhaW5NaW5WYWx1ZUluTWIsIHN0ZDo6bWluKGdhaW5WYWx1ZU1iLCBnYWluTWF4VmFsdWVJbk1iKSk7CisKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnIGNvbmZpZyA9IHt9OworICAgICAgICAgICAgZGV2aWNlUG9ydC0+dG9BdWRpb1BvcnRDb25maWcoJmNvbmZpZyk7CisgICAgICAgICAgICBjb25maWcuY29uZmlnX21hc2sgPSBBVURJT19QT1JUX0NPTkZJR19HQUlOOworICAgICAgICAgICAgY29uZmlnLmdhaW4udmFsdWVzWzBdID0gZ2FpblZhbHVlTWI7CisgICAgICAgICAgICByZXR1cm4gbUNsaWVudEludGVyZmFjZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZjb25maWcsIDApID09IE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIC8vIEZvcmNlIFZPSUNFX0NBTEwgdG8gdHJhY2sgQkxVRVRPT1RIX1NDTyBzdHJlYW0gdm9sdW1lIHdoZW4gYmx1ZXRvb3RoIGF1ZGlvIGlzIGVuYWJsZWQKKyAgICBmbG9hdCB2b2x1bWVBbXBsID0gVm9sdW1lOjpEYlRvQW1wbChnZXRDdXJWb2x1bWUodnMpKTsKKyAgICBpZiAoaGFzU3RyZWFtKHN0cmVhbXMsIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPKSkgeworICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsIHZvbHVtZUFtcGwsIG1Jb0hhbmRsZSwgZGVsYXlNcyk7CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtIDogc3RyZWFtcykgeworICAgICAgICBBTE9HVigiJXMgb3V0cHV0ICVkIGZvciB2b2x1bWVTb3VyY2UgJWQsIHZvbHVtZSAlZiwgZGVsYXkgJWQgc3RyZWFtPSVzIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIG1Jb0hhbmRsZSwgdnMsIHZvbHVtZURiLCBkZWxheU1zLCB0b1N0cmluZyhzdHJlYW0pLmNfc3RyKCkpOworICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5zZXRTdHJlYW1Wb2x1bWUoc3RyZWFtLCB2b2x1bWVBbXBsLCBtSW9IYW5kbGUsIGRlbGF5TXMpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogc3RhdHVzX3QgU3dBdWRpb091dHB1dERlc2NyaXB0b3I6Om9wZW4oY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQpCiB7CisgICAgbURldmljZXMgPSBkZXZpY2VzOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IGRldmljZXMuZ2V0RGV2aWNlRm9yT3BlbmluZygpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoZGV2aWNlID09IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAiJXMgZmFpbGVkIHRvIGdldCBkZXZpY2UgZGVzY3JpcHRvciBmb3Igb3BlbmluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCB0aGUgcmVxdWVzdGVkIGRldmljZXMsIGFsbCBkZXZpY2UgdHlwZXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkdW1wRGV2aWNlVHlwZXMoZGV2aWNlcy50eXBlcygpKS5jX3N0cigpKTsKKwogICAgIGF1ZGlvX2NvbmZpZ190IGxDb25maWc7CiAgICAgaWYgKGNvbmZpZyA9PSBudWxscHRyKSB7CiAgICAgICAgIGxDb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CkBAIC00MDIsNyArNDg2LDYgQEAKICAgICAgICAgbENvbmZpZyA9ICpjb25maWc7CiAgICAgfQogCi0gICAgbURldmljZSA9IGRldmljZTsKICAgICAvLyBpZiB0aGUgc2VsZWN0ZWQgcHJvZmlsZSBpcyBvZmZsb2FkZWQgYW5kIG5vIG9mZmxvYWQgaW5mbyB3YXMgc3BlY2lmaWVkLAogICAgIC8vIGNyZWF0ZSBhIGRlZmF1bHQgb25lCiAgICAgaWYgKChtUHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpICYmCkBAIC00MjAsMjggKzUwMywyNiBAQAogCiAgICAgbUZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShtRmxhZ3MgfCBmbGFncyk7CiAKLSAgICBBTE9HVigib3BlbmluZyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IGFkZHJlc3MgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKLSAgICAgICAgICBtRGV2aWNlLCBhZGRyZXNzLnN0cmluZygpLCBtUHJvZmlsZS5nZXQoKSwgbVByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7CisgICAgQUxPR1YoIm9wZW5pbmcgb3V0cHV0IGZvciBkZXZpY2UgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKKyAgICAgICAgICBtRGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksIG1Qcm9maWxlLmdldCgpLCBtUHJvZmlsZS0+Z2V0TmFtZSgpLmNfc3RyKCkpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUNsaWVudEludGVyZmFjZS0+b3Blbk91dHB1dChtUHJvZmlsZS0+Z2V0TW9kdWxlSGFuZGxlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtTGF0ZW5jeSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1GbGFncyk7Ci0gICAgTE9HX0FMV0FZU19GQVRBTF9JRihtRGV2aWNlICE9IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICIlcyBvcGVuT3V0cHV0IHJldHVybmVkIGRldmljZSAlMDh4IHdoZW4gZ2l2ZW4gZGV2aWNlICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtRGV2aWNlLCBkZXZpY2UpOwogCiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewogICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzIG9wZW5PdXRwdXQgcmV0dXJuZWQgb3V0cHV0IGhhbmRsZSAlZCBmb3IgZGV2aWNlICUwOHgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgKm91dHB1dCwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgb3Blbk91dHB1dCByZXR1cm5lZCBvdXRwdXQgaGFuZGxlICVkIGZvciBkZXZpY2UgJXMsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2VsZWN0ZWQgZGV2aWNlICVzIGZvciBvcGVuaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sICpvdXRwdXQsIGRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgbVNhbXBsaW5nUmF0ZSA9IGxDb25maWcuc2FtcGxlX3JhdGU7CiAgICAgICAgIG1DaGFubmVsTWFzayA9IGxDb25maWcuY2hhbm5lbF9tYXNrOwogICAgICAgICBtRm9ybWF0ID0gbENvbmZpZy5mb3JtYXQ7Ci0gICAgICAgIG1JZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisgICAgICAgIG1JZCA9IFBvbGljeUF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CiAgICAgICAgIG1Jb0hhbmRsZSA9ICpvdXRwdXQ7CiAgICAgICAgIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQrKzsKICAgICB9CkBAIC00OTEsNiArNTcyLDE3IEBACiB2b2lkIFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpjbG9zZSgpCiB7CiAgICAgaWYgKG1Jb0hhbmRsZSAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAvLyBjbGVhbiB1cCBhY3RpdmUgY2xpZW50cyBpZiBhbnkgKGNhbiBoYXBwZW4gaWYgY2xvc2UoKSBpcyBjYWxsZWQgdG8gZm9yY2UKKyAgICAgICAgLy8gY2xpZW50cyB0byByZWNvbm5lY3QKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZjbGllbnQgOiBnZXRDbGllbnRJdGVyYWJsZSgpKSB7CisgICAgICAgICAgICBpZiAoY2xpZW50LT5hY3RpdmUoKSkgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBjbGllbnQgd2l0aCBwb3J0IElEICVkIHN0aWxsIGFjdGl2ZSBvbiBvdXRwdXQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBjbGllbnQtPnBvcnRJZCgpLCBtSWQpOworICAgICAgICAgICAgICAgIHNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKTsKKyAgICAgICAgICAgICAgICBzdG9wKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKICAgICAgICAgcGFyYW0uYWRkKFN0cmluZzgoImNsb3NpbmciKSwgU3RyaW5nOCgidHJ1ZSIpKTsKICAgICAgICAgbUNsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhtSW9IYW5kbGUsIHBhcmFtLnRvU3RyaW5nKCkpOwpAQCAtNDk5LDExICs1OTEsNiBAQAogCiAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYobVByb2ZpbGUtPmN1ck9wZW5Db3VudCA8IDEsICIlcyBwcm9maWxlIG9wZW4gY291bnQgJXUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb2ZpbGUtPmN1ck9wZW5Db3VudCk7Ci0gICAgICAgIC8vIGRvIG5vdCBjYWxsIHN0b3AoKSBoZXJlIGFzIHN0b3AoKSBpcyBzdXBwb3NlZCB0byBiZSBjYWxsZWQgYWZ0ZXIgY2hhbmdlUmVmQ291bnQoLTEpCi0gICAgICAgIC8vIGFuZCB3ZSBkb24ndCBrbm93IGhvdyBtYW55IHN0cmVhbXMgYXJlIHN0aWxsIGFjdGl2ZSBhdCB0aGlzIHRpbWUKLSAgICAgICAgaWYgKGlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIG1Qcm9maWxlLT5jdXJBY3RpdmVDb3VudC0tOwotICAgICAgICB9CiAgICAgICAgIG1Qcm9maWxlLT5jdXJPcGVuQ291bnQtLTsKICAgICAgICAgbUlvSGFuZGxlID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgfQpAQCAtNTIxLDcgKzYwOCw3IEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBtSWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOworICAgIG1JZCA9IFBvbGljeUF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CiAgICAgbUlvSGFuZGxlID0gKmlvSGFuZGxlOwogICAgIG1PdXRwdXQxID0gb3V0cHV0MTsKICAgICBtT3V0cHV0MiA9IG91dHB1dDI7CkBAIC01MzQsNTUgKzYyMSw0MiBAQAogfQogCiAvLyBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvciBpbXBsZW1lbnRhdGlvbgotSHdBdWRpb091dHB1dERlc2NyaXB0b3I6Okh3QXVkaW9PdXRwdXREZXNjcmlwdG9yKGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4mIHNvdXJjZSwKK0h3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjpId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcihjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCi0gICAgOiBBdWRpb091dHB1dERlc2NyaXB0b3Ioc291cmNlLT5tRGV2aWNlLCBjbGllbnRJbnRlcmZhY2UpLAorICAgIDogQXVkaW9PdXRwdXREZXNjcmlwdG9yKHNvdXJjZS0+c3JjRGV2aWNlKCksIGNsaWVudEludGVyZmFjZSksCiAgICAgICBtU291cmNlKHNvdXJjZSkKIHsKIH0KIAotc3RhdHVzX3QgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoaW50IGZkKQordm9pZCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBBdWRpb091dHB1dERlc2NyaXB0b3I6OmR1bXAoZmQpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiU291cmNlOlxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIG1Tb3VyY2UtPmR1bXAoZmQpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi1hdWRpb19kZXZpY2VzX3QgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OnN1cHBvcnRlZERldmljZXMoKQotewotICAgIHJldHVybiBtRGV2aWNlOworICAgIEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6ZHVtcChkc3QpOworICAgIGRzdC0+YXBwZW5kKCJTb3VyY2U6XG4iKTsKKyAgICBtU291cmNlLT5kdW1wKGRzdCwgMCwgMCk7CiB9CiAKIHZvaWQgSHdBdWRpb091dHB1dERlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0Q29uZmlnKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAogewotICAgIG1Tb3VyY2UtPm1EZXZpY2UtPnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKKyAgICBtU291cmNlLT5zcmNEZXZpY2UoKS0+dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOwogfQogCiB2b2lkIEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKIHsKLSAgICBtU291cmNlLT5tRGV2aWNlLT50b0F1ZGlvUG9ydChwb3J0KTsKKyAgICBtU291cmNlLT5zcmNEZXZpY2UoKS0+dG9BdWRpb1BvcnQocG9ydCk7CiB9CiAKIAotYm9vbCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorYm9vbCBId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKGZsb2F0IHZvbHVtZURiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIGNvbnN0IFN0cmVhbVR5cGVWZWN0b3IgJnN0cmVhbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQogewotICAgIGJvb2wgY2hhbmdlZCA9IEF1ZGlvT3V0cHV0RGVzY3JpcHRvcjo6c2V0Vm9sdW1lKHZvbHVtZSwgc3RyZWFtLCBkZXZpY2UsIGRlbGF5TXMsIGZvcmNlKTsKKyAgICBib29sIGNoYW5nZWQgPSBBdWRpb091dHB1dERlc2NyaXB0b3I6OnNldFZvbHVtZSgKKyAgICAgICAgICAgIHZvbHVtZURiLCB2b2x1bWVTb3VyY2UsIHN0cmVhbXMsIGRldmljZVR5cGVzLCBkZWxheU1zLCBmb3JjZSk7CiAKICAgICBpZiAoY2hhbmdlZCkgewogICAgICAgLy8gVE9ETzogdXNlIGdhaW4gY29udHJvbGxlciBvbiBzb3VyY2UgZGV2aWNlIGlmIGFueSB0byBhZGp1c3Qgdm9sdW1lCkBAIC01OTEsMzkgKzY2NSwzOSBAQAogfQogCiAvLyBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbgotYm9vbCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAorYm9vbCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNBY3RpdmUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CiB7CiAgICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGhpcy0+c2l6ZSgpOyBpKyspIHsKICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB0aGlzLT52YWx1ZUF0KGkpOwotICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKHZvbHVtZVNvdXJjZSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgU3dBdWRpb091dHB1dENvbGxlY3Rpb246OmlzU3RyZWFtQWN0aXZlTG9jYWxseShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Citib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0FjdGl2ZUxvY2FsbHkoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CiB7CiAgICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGhpcy0+c2l6ZSgpOyBpKyspIHsKICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB0aGlzLT52YWx1ZUF0KGkpOwotICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcywgc3lzVGltZSkKLSAgICAgICAgICAgICAgICAmJiAoKG91dHB1dERlc2MtPmRldmljZSgpICYgQVBNX0FVRElPX09VVF9ERVZJQ0VfUkVNT1RFX0FMTCkgPT0gMCkpIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKHZvbHVtZVNvdXJjZSwgaW5QYXN0TXMsIHN5c1RpbWUpCisgICAgICAgICAgICAgICAgJiYgKCEob3V0cHV0RGVzYy0+ZGV2aWNlcygpCisgICAgICAgICAgICAgICAgICAgICAgICAuY29udGFpbnNEZXZpY2VBbW9uZ1R5cGVzKGdldEFsbE91dFJlbW90ZURldmljZXMoKSkpKSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGZhbHNlOwogfQogCi1ib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0Citib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc0FjdGl2ZVJlbW90ZWx5KFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewogICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKLSAgICAgICAgaWYgKCgob3V0cHV0RGVzYy0+ZGV2aWNlKCkgJiBBUE1fQVVESU9fT1VUX0RFVklDRV9SRU1PVEVfQUxMKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmlzU3RyZWFtQWN0aXZlKHN0cmVhbSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5kZXZpY2VzKCkuY29udGFpbnNEZXZpY2VBbW9uZ1R5cGVzKGdldEFsbE91dFJlbW90ZURldmljZXMoKSkgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc0FjdGl2ZSh2b2x1bWVTb3VyY2UsIGluUGFzdE1zLCBzeXNUaW1lKSkgewogICAgICAgICAgICAgLy8gZG8gbm90IGNvbnNpZGVyIHJlIHJvdXRpbmcgKHdoZW4gdGhlIG91dHB1dCBpcyBnb2luZyB0byBhIGR5bmFtaWMgcG9saWN5KQogICAgICAgICAgICAgLy8gYXMgInJlbW90ZSBwbGF5YmFjayIKICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKQEAgLTYzNCwxMSArNzA4LDI3IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCitib29sIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjppc1N0cmF0ZWd5QWN0aXZlT25TYW1lTW9kdWxlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcywgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG90aGVyRGVzYyA9IHZhbHVlQXQoaSk7CisgICAgICAgIGlmIChkZXNjLT5zaGFyZXNId01vZHVsZVdpdGgob3RoZXJEZXNjKSAmJgorICAgICAgICAgICAgICAgIG90aGVyRGVzYy0+aXNTdHJhdGVneUFjdGl2ZShwcywgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKIGF1ZGlvX2lvX2hhbmRsZV90IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpnZXRBMmRwT3V0cHV0KCkgY29uc3QKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gdmFsdWVBdChpKTsKLSAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiBvdXRwdXREZXNjLT5kZXZpY2UoKSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApIHsKKyAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJgorICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZXMoKS5jb250YWluc0RldmljZUFtb25nVHlwZXMoZ2V0QXVkaW9EZXZpY2VPdXRBbGxBMmRwU2V0KCkpICYmCisgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlc1N1cHBvcnRFbmNvZGVkRm9ybWF0cyhnZXRBdWRpb0RldmljZU91dEFsbEEyZHBTZXQoKSkpIHsKICAgICAgICAgICAgIHJldHVybiB0aGlzLT5rZXlBdChpKTsKICAgICAgICAgfQogICAgIH0KQEAgLTY1MCwxMiArNzQwLDExIEBACiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHByaW1hcnlPdXRwdXQgPSBnZXRQcmltYXJ5T3V0cHV0KCk7CiAKICAgICBpZiAoKHByaW1hcnlPdXRwdXQgIT0gTlVMTCkgJiYgKHByaW1hcnlPdXRwdXQtPm1Qcm9maWxlICE9IE5VTEwpCi0gICAgICAgICYmIChwcmltYXJ5T3V0cHV0LT5tUHJvZmlsZS0+bU1vZHVsZSAhPSBOVUxMKSkgewotICAgICAgICBzcDxId01vZHVsZT4gcHJpbWFyeUh3TW9kdWxlID0gcHJpbWFyeU91dHB1dC0+bVByb2ZpbGUtPm1Nb2R1bGU7Ci0gICAgICAgIFZlY3RvciA8c3A8SU9Qcm9maWxlPj4gcHJpbWFyeUh3TW9kdWxlT3V0cHV0UHJvZmlsZXMgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmltYXJ5SHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCk7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcHJpbWFyeUh3TW9kdWxlT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChwcmltYXJ5SHdNb2R1bGVPdXRwdXRQcm9maWxlc1tpXS0+c3VwcG9ydERldmljZShBVURJT19ERVZJQ0VfT1VUX0FMTF9BMkRQKSkgeworICAgICAgICAmJiAocHJpbWFyeU91dHB1dC0+bVByb2ZpbGUtPmdldE1vZHVsZSgpICE9IE5VTEwpKSB7CisgICAgICAgIHNwPEh3TW9kdWxlPiBwcmltYXJ5SHdNb2R1bGUgPSBwcmltYXJ5T3V0cHV0LT5tUHJvZmlsZS0+Z2V0TW9kdWxlKCk7CisKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZvdXRwdXRQcm9maWxlIDogcHJpbWFyeUh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpKSB7CisgICAgICAgICAgICBpZiAob3V0cHV0UHJvZmlsZS0+c3VwcG9ydHNEZXZpY2VUeXBlcyhnZXRBdWRpb0RldmljZU91dEFsbEEyZHBTZXQoKSkpIHsKICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNjkwLDg5ICs3NzksNTkgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotYm9vbCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNBbnlPdXRwdXRBY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1Ub0lnbm9yZSkgY29uc3QKK3NwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6Z2V0T3V0cHV0Rm9yQ2xpZW50KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIGZvciAoc2l6ZV90IHMgPSAwIDsgcyA8IEFVRElPX1NUUkVBTV9DTlQgOyBzKyspIHsKLSAgICAgICAgaWYgKHMgPT0gKHNpemVfdCkgc3RyZWFtVG9JZ25vcmUpIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAob3V0cHV0RGVzYy0+Z2V0Q2xpZW50KHBvcnRJZCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuIG91dHB1dERlc2M7CiAgICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICAgICAgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOwotICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzXSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiAwOworfQorCit2b2lkIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpjbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2UoCisgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkaXNjb25uZWN0ZWREZXZpY2UpCit7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB2YWx1ZUF0KGkpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IG91dHB1dERlc2MtPmdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQtPnByZWZlcnJlZERldmljZUlkKCkgPT0gZGlzY29ubmVjdGVkRGV2aWNlLT5nZXRJZCgpKSB7CisgICAgICAgICAgICAgICAgY2xpZW50LT5zZXRQcmVmZXJyZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6Z2V0U3VwcG9ydGVkRGV2aWNlcyhhdWRpb19pb19oYW5kbGVfdCBoYW5kbGUpIGNvbnN0Cit2b2lkIFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlRm9yKGhhbmRsZSk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBvdXRwdXREZXNjLT5tUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlc1R5cGUoKTsKLSAgICByZXR1cm4gZGV2aWNlczsKLX0KLQotCi1zdGF0dXNfdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbk91dHB1dHMgZHVtcDpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBkc3QtPmFwcGVuZCgiXG5PdXRwdXRzIGR1bXA6XG4iKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIi0gT3V0cHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCItIE91dHB1dCAlZCBkdW1wOlxuIiwga2V5QXQoaSkpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCk7CiAgICAgfQotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiAvLyBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiBpbXBsZW1lbnRhdGlvbgotYm9vbCBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAorYm9vbCBId0F1ZGlvT3V0cHV0Q29sbGVjdGlvbjo6aXNBY3RpdmUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CiB7CiAgICAgbnNlY3NfdCBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGhpcy0+c2l6ZSgpOyBpKyspIHsKICAgICAgICAgY29uc3Qgc3A8SHdBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSB0aGlzLT52YWx1ZUF0KGkpOwotICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoc3RyZWFtLCBpblBhc3RNcywgc3lzVGltZSkpIHsKKyAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzQWN0aXZlKHZvbHVtZVNvdXJjZSwgaW5QYXN0TXMsIHN5c1RpbWUpKSB7CiAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWJvb2wgSHdBdWRpb091dHB1dENvbGxlY3Rpb246OmlzQW55T3V0cHV0QWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVG9JZ25vcmUpIGNvbnN0Cit2b2lkIEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBmb3IgKHNpemVfdCBzID0gMCA7IHMgPCBBVURJT19TVFJFQU1fQ05UIDsgcysrKSB7Ci0gICAgICAgIGlmIChzID09IChzaXplX3QpIHN0cmVhbVRvSWdub3JlKSB7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IHZhbHVlQXQoaSk7Ci0gICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3NdICE9IDApIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXR1c190IEh3QXVkaW9PdXRwdXRDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuT3V0cHV0cyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGRzdC0+YXBwZW5kKCJcbk91dHB1dHMgZHVtcDpcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBPdXRwdXQgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIi0gT3V0cHV0ICVkIGR1bXA6XG4iLCBrZXlBdChpKSk7CisgICAgICAgIHZhbHVlQXQoaSktPmR1bXAoZHN0KTsKICAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIH07IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUGF0Y2guY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9QYXRjaC5jcHAKaW5kZXggYTlmZTQ4ZC4uZDc5MTEwYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9QYXRjaC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9QYXRjaC5jcHAKQEAgLTE4LDcgKzE4LDYgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgIkF1ZGlvUGF0Y2guaCIKLSNpbmNsdWRlICJBdWRpb0dhaW4uaCIKICNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAKICNpbmNsdWRlIDxsb2cvbG9nLmg+CkBAIC0yNyw2MCArMjYsMzMgQEAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogQXVkaW9QYXRjaDo6QXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLCB1aWRfdCB1aWQpIDoKLSAgICBtSGFuZGxlKEhhbmRsZUdlbmVyYXRvcjxhdWRpb19wYXRjaF9oYW5kbGVfdD46OmdldE5leHRIYW5kbGUoKSksCiAgICAgbVBhdGNoKCpwYXRjaCksCi0gICAgbVVpZCh1aWQpLAotICAgIG1BZlBhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKQorICAgIG1IYW5kbGUoSGFuZGxlR2VuZXJhdG9yPGF1ZGlvX3BhdGNoX2hhbmRsZV90Pjo6Z2V0TmV4dEhhbmRsZSgpKSwKKyAgICBtVWlkKHVpZCkKIHsKIH0KIAotc3RhdHVzX3QgQXVkaW9QYXRjaDo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3N0YXRpYyB2b2lkIGR1bXBQYXRjaEVuZHBvaW50cygKKyAgICAgICAgU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBjb25zdCBjaGFyICpwcmVmaXgsIGludCBjb3VudCwgY29uc3QgYXVkaW9fcG9ydF9jb25maWcgKmNmZ3MpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNBdWRpbyBwYXRjaCAlZDpcbiIsIHNwYWNlcywgIiIsIGluZGV4KzEpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGhhbmRsZTogJTJkXG4iLCBzcGFjZXMsICIiLCBtSGFuZGxlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBhdWRpbyBmbGluZ2VyIGhhbmRsZTogJTJkXG4iLCBzcGFjZXMsICIiLCBtQWZQYXRjaEhhbmRsZSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gb3duZXIgdWlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1VaWQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtICVkIHNvdXJjZXM6XG4iLCBzcGFjZXMsICIiLCBtUGF0Y2gubnVtX3NvdXJjZXMpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1QYXRjaC5udW1fc291cmNlczsgaSsrKSB7Ci0gICAgICAgIGlmIChtUGF0Y2guc291cmNlc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKLSAgICAgICAgICAgIGRldmljZVRvU3RyaW5nKG1QYXRjaC5zb3VyY2VzW2ldLmV4dC5kZXZpY2UudHlwZSwgZGV2aWNlKTsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gRGV2aWNlIElEICVkICVzXG4iLCBzcGFjZXMgKyAyLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zb3VyY2VzW2ldLmlkLAotICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLmNfc3RyKCkpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgeworICAgICAgICBjb25zdCBhdWRpb19wb3J0X2NvbmZpZyAmY2ZnID0gY2Znc1tpXTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyAgWyVzICVkXSAiLCBzcGFjZXMsICIiLCBwcmVmaXgsIGkgKyAxKTsKKyAgICAgICAgaWYgKGNmZy50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJEZXZpY2UgSUQgJWQgJXMiLCBjZmcuaWQsIHRvU3RyaW5nKGNmZy5leHQuZGV2aWNlLnR5cGUpLmNfc3RyKCkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBNaXggSUQgJWQgSS9PIGhhbmRsZSAlZFxuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc291cmNlc1tpXS5pZCwgbVBhdGNoLnNvdXJjZXNbaV0uZXh0Lm1peC5oYW5kbGUpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIk1peCBJRCAlZCBJL08gaGFuZGxlICVkIiwgY2ZnLmlkLCBjZmcuZXh0Lm1peC5oYW5kbGUpOwogICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CiAgICAgfQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gJWQgc2lua3M6XG4iLCBzcGFjZXMsICIiLCBtUGF0Y2gubnVtX3NpbmtzKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtUGF0Y2gubnVtX3NpbmtzOyBpKyspIHsKLSAgICAgICAgaWYgKG1QYXRjaC5zaW5rc1tpXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKLSAgICAgICAgICAgIGRldmljZVRvU3RyaW5nKG1QYXRjaC5zaW5rc1tpXS5leHQuZGV2aWNlLnR5cGUsIGRldmljZSk7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIERldmljZSBJRCAlZCAlc1xuIiwgc3BhY2VzICsgMiwgIiIsCi0gICAgICAgICAgICAgICAgICAgICBtUGF0Y2guc2lua3NbaV0uaWQsCi0gICAgICAgICAgICAgICAgICAgICBkZXZpY2UuY19zdHIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIE1peCBJRCAlZCBJL08gaGFuZGxlICVkXG4iLCBzcGFjZXMgKyAyLCAiIiwKLSAgICAgICAgICAgICAgICAgICAgIG1QYXRjaC5zaW5rc1tpXS5pZCwgbVBhdGNoLnNpbmtzW2ldLmV4dC5taXguaGFuZGxlKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQorfQogCi0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwordm9pZCBBdWRpb1BhdGNoOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcywgaW50IGluZGV4KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNQYXRjaCAlZDogb3duZXIgdWlkICU0ZCwgaGFuZGxlICUyZCwgYWYgaGFuZGxlICUyZFxuIiwKKyAgICAgICAgICAgIHNwYWNlcywgIiIsIGluZGV4ICsgMSwgbVVpZCwgbUhhbmRsZSwgbUFmUGF0Y2hIYW5kbGUpOworICAgIGR1bXBQYXRjaEVuZHBvaW50cyhkc3QsIHNwYWNlcywgInNyYyAiLCBtUGF0Y2gubnVtX3NvdXJjZXMsIG1QYXRjaC5zb3VyY2VzKTsKKyAgICBkdW1wUGF0Y2hFbmRwb2ludHMoZHN0LCBzcGFjZXMsICJzaW5rIiwgbVBhdGNoLm51bV9zaW5rcywgbVBhdGNoLnNpbmtzKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9QYXRjaENvbGxlY3Rpb246OmFkZEF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLApAQCAtOTUsNyArNjcsNyBAQAogICAgIGFkZChoYW5kbGUsIHBhdGNoKTsKICAgICBBTE9HVigiYWRkQXVkaW9QYXRjaCgpIGhhbmRsZSAlZCBhZiBoYW5kbGUgJWQgbnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIHNvdXJjZSBoYW5kbGUgJWQiCiAgICAgICAgICAgICAic2luayBoYW5kbGUgJWQiLAotICAgICAgICAgIGhhbmRsZSwgcGF0Y2gtPm1BZlBhdGNoSGFuZGxlLCBwYXRjaC0+bVBhdGNoLm51bV9zb3VyY2VzLCBwYXRjaC0+bVBhdGNoLm51bV9zaW5rcywKKyAgICAgICAgICBoYW5kbGUsIHBhdGNoLT5nZXRBZkhhbmRsZSgpLCBwYXRjaC0+bVBhdGNoLm51bV9zb3VyY2VzLCBwYXRjaC0+bVBhdGNoLm51bV9zaW5rcywKICAgICAgICAgICBwYXRjaC0+bVBhdGNoLnNvdXJjZXNbMF0uaWQsIHBhdGNoLT5tUGF0Y2guc2lua3NbMF0uaWQpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KQEAgLTEwOCw3ICs4MCw3IEBACiAgICAgICAgIEFMT0dXKCJyZW1vdmVBdWRpb1BhdGNoKCkgcGF0Y2ggJWQgbm90IGluIiwgaGFuZGxlKTsKICAgICAgICAgcmV0dXJuIEFMUkVBRFlfRVhJU1RTOwogICAgIH0KLSAgICBBTE9HVigicmVtb3ZlQXVkaW9QYXRjaCgpIGhhbmRsZSAlZCBhZiBoYW5kbGUgJWQiLCBoYW5kbGUsIHZhbHVlQXQoaW5kZXgpLT5tQWZQYXRjaEhhbmRsZSk7CisgICAgQUxPR1YoInJlbW92ZUF1ZGlvUGF0Y2goKSBoYW5kbGUgJWQgYWYgaGFuZGxlICVkIiwgaGFuZGxlLCB2YWx1ZUF0KGluZGV4KS0+Z2V0QWZIYW5kbGUoKSk7CiAgICAgcmVtb3ZlSXRlbXNBdChpbmRleCk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQpAQCAtMTUwLDcgKzEyMiw3IEBACiAgICAgICAgIH0KICAgICAgICAgaWYgKHBhdGNoZXNXcml0dGVuIDwgcGF0Y2hlc01heCkgewogICAgICAgICAgICAgcGF0Y2hlc1twYXRjaGVzV3JpdHRlbl0gPSBwYXRjaC0+bVBhdGNoOwotICAgICAgICAgICAgcGF0Y2hlc1twYXRjaGVzV3JpdHRlbisrXS5pZCA9IHBhdGNoLT5tSGFuZGxlOworICAgICAgICAgICAgcGF0Y2hlc1twYXRjaGVzV3JpdHRlbisrXS5pZCA9IHBhdGNoLT5nZXRIYW5kbGUoKTsKICAgICAgICAgfQogICAgICAgICAoKm51bV9wYXRjaGVzKSsrOwogICAgICAgICBBTE9HVigibGlzdEF1ZGlvUGF0Y2hlcygpIHBhdGNoICV6dSBudW1fc291cmNlcyAlZCBudW1fc2lua3MgJWQiLApAQCAtMTYxLDE2ICsxMzMsMTIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3ZvaWQgQXVkaW9QYXRjaENvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuQXVkaW8gUGF0Y2hlczpcbiIpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKKyAgICBkc3QtPmFwcGVuZCgiXG5BdWRpbyBQYXRjaGVzOlxuIik7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkLCAyLCBpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIDIsIGkpOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9saWN5TWl4LmNwcAppbmRleCAwODkzMGYxLi4yMGMwYTI0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvbGljeU1peC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qb2xpY3lNaXguY3BwCkBAIC0yMCwyODIgKzIwLDM0NCBAQAogI2luY2x1ZGUgIkF1ZGlvUG9saWN5TWl4LmgiCiAjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogI2luY2x1ZGUgIkh3TW9kdWxlLmgiCi0jaW5jbHVkZSAiQXVkaW9Qb3J0LmgiCisjaW5jbHVkZSAiUG9saWN5QXVkaW9Qb3J0LmgiCiAjaW5jbHVkZSAiSU9Qcm9maWxlLmgiCi0jaW5jbHVkZSAiQXVkaW9HYWluLmgiCiAjaW5jbHVkZSA8QXVkaW9PdXRwdXREZXNjcmlwdG9yLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotdm9pZCBBdWRpb1BvbGljeU1peDo6c2V0T3V0cHV0KHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmb3V0cHV0KQordm9pZCBBdWRpb1BvbGljeU1peDo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKIHsKLSAgICBtT3V0cHV0ID0gb3V0cHV0OwotfQotCi1jb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJkF1ZGlvUG9saWN5TWl4OjpnZXRPdXRwdXQoKSBjb25zdAotewotICAgIHJldHVybiBtT3V0cHV0OwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWl4OjpjbGVhck91dHB1dCgpCi17Ci0gICAgbU91dHB1dC5jbGVhcigpOwotfQotCi12b2lkIEF1ZGlvUG9saWN5TWl4OjpzZXRNaXgoQXVkaW9NaXggJm1peCkKLXsKLSAgICBtTWl4ID0gbWl4OwotfQotCi1hbmRyb2lkOjpBdWRpb01peCAqQXVkaW9Qb2xpY3lNaXg6OmdldE1peCgpCi17Ci0gICAgcmV0dXJuICZtTWl4OwotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1peDo6ZHVtcChpbnQgZmQsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0F1ZGlvIFBvbGljeSBNaXggJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCsxKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc0F1ZGlvIFBvbGljeSBNaXggJWQ6XG4iLCBzcGFjZXMsICIiLCBpbmRleCArIDEpOwogICAgIHN0ZDo6c3RyaW5nIG1peFR5cGVMaXRlcmFsOwotICAgIGlmICghTWl4VHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcobU1peC5tTWl4VHlwZSwgbWl4VHlwZUxpdGVyYWwpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogZmFpbGVkIHRvIGNvbnZlcnQgbWl4IHR5cGUgJWQiLCBfX0ZVTkNUSU9OX18sIG1NaXgubU1peFR5cGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGlmICghTWl4VHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcobU1peFR5cGUsIG1peFR5cGVMaXRlcmFsKSkgeworICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjb252ZXJ0IG1peCB0eXBlICVkIiwgX19GVU5DVElPTl9fLCBtTWl4VHlwZSk7CisgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBtaXggdHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIG1peFR5cGVMaXRlcmFsLmNfc3RyKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBtaXggdHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIG1peFR5cGVMaXRlcmFsLmNfc3RyKCkpOworCiAgICAgc3RkOjpzdHJpbmcgcm91dGVGbGFnTGl0ZXJhbDsKLSAgICBSb3V0ZUZsYWdUeXBlQ29udmVydGVyOjptYXNrVG9TdHJpbmcobU1peC5tUm91dGVGbGFncywgcm91dGVGbGFnTGl0ZXJhbCk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBSb3V0ZSBGbGFnczogJXNcbiIsIHNwYWNlcywgIiIsIHJvdXRlRmxhZ0xpdGVyYWwuY19zdHIoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHN0ZDo6c3RyaW5nIGRldmljZUxpdGVyYWw7Ci0gICAgZGV2aWNlVG9TdHJpbmcobU1peC5tRGV2aWNlVHlwZSwgZGV2aWNlTGl0ZXJhbCk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBkZXZpY2UgdHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIGRldmljZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gZGV2aWNlIGFkZHJlc3M6ICVzXG4iLCBzcGFjZXMsICIiLCBtTWl4Lm1EZXZpY2VBZGRyZXNzLnN0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CisgICAgUm91dGVGbGFnVHlwZUNvbnZlcnRlcjo6bWFza1RvU3RyaW5nKG1Sb3V0ZUZsYWdzLCByb3V0ZUZsYWdMaXRlcmFsKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBSb3V0ZSBGbGFnczogJXNcbiIsIHNwYWNlcywgIiIsIHJvdXRlRmxhZ0xpdGVyYWwuY19zdHIoKSk7CisKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBkZXZpY2UgdHlwZTogJXNcbiIsIHNwYWNlcywgIiIsIHRvU3RyaW5nKG1EZXZpY2VUeXBlKS5jX3N0cigpKTsKKworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIGRldmljZSBhZGRyZXNzOiAlc1xuIiwgc3BhY2VzLCAiIiwgbURldmljZUFkZHJlc3Muc3RyaW5nKCkpOwogCiAgICAgaW50IGluZGV4Q3JpdGVyaW9uID0gMDsKLSAgICBmb3IgKGNvbnN0IGF1dG8gJmNyaXRlcmlvbiA6IG1NaXgubUNyaXRlcmlhKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gQ3JpdGVyaW9uICVkOlxuIiwgc3BhY2VzICsgMiwgIiIsIGluZGV4Q3JpdGVyaW9uKyspOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHVzYWdlTGl0ZXJhbDsKLSAgICAgICAgaWYgKCFVc2FnZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGNyaXRlcmlvbi5tVmFsdWUubVVzYWdlLCB1c2FnZUxpdGVyYWwpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjb252ZXJ0IHVzYWdlICVkIiwgX19GVU5DVElPTl9fLCBjcml0ZXJpb24ubVZhbHVlLm1Vc2FnZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGZvciAoY29uc3QgYXV0byAmY3JpdGVyaW9uIDogbUNyaXRlcmlhKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIENyaXRlcmlvbiAlZDogIiwgc3BhY2VzICsgMiwgIiIsIGluZGV4Q3JpdGVyaW9uKyspOworCisgICAgICAgIHN0ZDo6c3RyaW5nIHJ1bGVUeXBlLCBydWxlVmFsdWU7CisgICAgICAgIGJvb2wgdW5rbm93blJ1bGUgPSAhUnVsZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGNyaXRlcmlvbi5tUnVsZSwgcnVsZVR5cGUpOworICAgICAgICBzd2l0Y2ggKGNyaXRlcmlvbi5tUnVsZSAmIH5SVUxFX0VYQ0xVU0lPTl9NQVNLKSB7IC8vIG5vIG5lZWQgdG8gbWF0Y2ggUlVMRV9FWENMVURFXy4uLgorICAgICAgICBjYXNlIFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFOgorICAgICAgICAgICAgVXNhZ2VUeXBlQ29udmVydGVyOjp0b1N0cmluZyhjcml0ZXJpb24ubVZhbHVlLm1Vc2FnZSwgcnVsZVZhbHVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFJVTEVfTUFUQ0hfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUOgorICAgICAgICAgICAgU291cmNlVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcoY3JpdGVyaW9uLm1WYWx1ZS5tU291cmNlLCBydWxlVmFsdWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgUlVMRV9NQVRDSF9VSUQ6CisgICAgICAgICAgICBydWxlVmFsdWUgPSBzdGQ6OnRvX3N0cmluZyhjcml0ZXJpb24ubVZhbHVlLm1VaWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICB1bmtub3duUnVsZSA9IHRydWU7CiAgICAgICAgIH0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBVc2FnZTolc1xuIiwgc3BhY2VzICsgNCwgIiIsIHVzYWdlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICBpZiAobU1peC5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKLSAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHNvdXJjZUxpdGVyYWw7Ci0gICAgICAgICAgICBpZiAoIVNvdXJjZVR5cGVDb252ZXJ0ZXI6OnRvU3RyaW5nKGNyaXRlcmlvbi5tVmFsdWUubVNvdXJjZSwgc291cmNlTGl0ZXJhbCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjb252ZXJ0IHNvdXJjZSAlZCIsIF9fRlVOQ1RJT05fXywgY3JpdGVyaW9uLm1WYWx1ZS5tU291cmNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBTb3VyY2U6JXNcbiIsIHNwYWNlcyArIDQsICIiLCBzb3VyY2VMaXRlcmFsLmNfc3RyKCkpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworCisgICAgICAgIGlmICghdW5rbm93blJ1bGUpIHsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlcyAlc1xuIiwgcnVsZVR5cGUuY19zdHIoKSwgcnVsZVZhbHVlLmNfc3RyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlVua25vd24gcnVsZSB0eXBlIHZhbHVlIDB4JXhcbiIsIGNyaXRlcmlvbi5tUnVsZSk7CiAgICAgICAgIH0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBVaWQ6JWRcbiIsIHNwYWNlcyArIDQsICIiLCBjcml0ZXJpb24ubVZhbHVlLm1VaWQpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHN0ZDo6c3RyaW5nIHJ1bGVMaXRlcmFsOwotICAgICAgICBpZiAoIVJ1bGVUeXBlQ29udmVydGVyOjp0b1N0cmluZyhjcml0ZXJpb24ubVJ1bGUsIHJ1bGVMaXRlcmFsKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gY29udmVydCBzb3VyY2UgJWQiLCBfX0ZVTkNUSU9OX18sY3JpdGVyaW9uLm1SdWxlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBSdWxlOiVzXG4iLCBzcGFjZXMgKyA0LCAiIiwgcnVsZUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICB9Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OnJlZ2lzdGVyTWl4KGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsIEF1ZGlvTWl4IG1peCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OnJlZ2lzdGVyTWl4KEF1ZGlvTWl4IG1peCwgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MpCiB7Ci0gICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoYWRkcmVzcyk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgQUxPR0UoInJlZ2lzdGVyUG9saWN5TWl4ZXMoKTogbWl4IGZvciBhZGRyZXNzICVzIGFscmVhZHkgcmVnaXN0ZXJlZCIsIGFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9Qb2xpY3lNaXg+JiByZWdpc3RlcmVkTWl4ID0gaXRlbUF0KGkpOworICAgICAgICBpZiAobWl4Lm1EZXZpY2VUeXBlID09IHJlZ2lzdGVyZWRNaXgtPm1EZXZpY2VUeXBlCisgICAgICAgICAgICAgICAgJiYgbWl4Lm1EZXZpY2VBZGRyZXNzLmNvbXBhcmUocmVnaXN0ZXJlZE1peC0+bURldmljZUFkZHJlc3MpID09IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCJyZWdpc3Rlck1peCgpOiBtaXggYWxyZWFkeSByZWdpc3RlcmVkIGZvciBkZXY9MHgleCBhZGRyPSVzIiwKKyAgICAgICAgICAgICAgICAgICAgbWl4Lm1EZXZpY2VUeXBlLCBtaXgubURldmljZUFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQogICAgIH0KLSAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gbmV3IEF1ZGlvUG9saWN5TWl4KCk7Ci0gICAgcG9saWN5TWl4LT5zZXRNaXgobWl4KTsKLSAgICBhZGQoYWRkcmVzcywgcG9saWN5TWl4KTsKKyAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gbmV3IEF1ZGlvUG9saWN5TWl4KG1peCk7CisgICAgYWRkKHBvbGljeU1peCk7CisgICAgQUxPR0QoInJlZ2lzdGVyTWl4KCk6IGFkZGluZyBtaXggZm9yIGRldj0weCV4IGFkZHI9JXMiLAorICAgICAgICAgICAgcG9saWN5TWl4LT5tRGV2aWNlVHlwZSwgcG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSk7CiAKICAgICBpZiAoZGVzYyAhPSAwKSB7Ci0gICAgICAgIGRlc2MtPm1Qb2xpY3lNaXggPSBwb2xpY3lNaXgtPmdldE1peCgpOworICAgICAgICBkZXNjLT5tUG9saWN5TWl4ID0gcG9saWN5TWl4OwogICAgICAgICBwb2xpY3lNaXgtPnNldE91dHB1dChkZXNjKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OnVucmVnaXN0ZXJNaXgoY29uc3QgU3RyaW5nOCYgYWRkcmVzcykKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6dW5yZWdpc3Rlck1peChjb25zdCBBdWRpb01peCYgbWl4KQogewotICAgIHNzaXplX3QgaW5kZXggPSBpbmRleE9mS2V5KGFkZHJlc3MpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR0UoInVucmVnaXN0ZXJQb2xpY3lNaXhlcygpOiBtaXggZm9yIGFkZHJlc3MgJXMgbm90IHJlZ2lzdGVyZWQiLCBhZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPEF1ZGlvUG9saWN5TWl4PiYgcmVnaXN0ZXJlZE1peCA9IGl0ZW1BdChpKTsKKyAgICAgICAgaWYgKG1peC5tRGV2aWNlVHlwZSA9PSByZWdpc3RlcmVkTWl4LT5tRGV2aWNlVHlwZQorICAgICAgICAgICAgICAgICYmIG1peC5tRGV2aWNlQWRkcmVzcy5jb21wYXJlKHJlZ2lzdGVyZWRNaXgtPm1EZXZpY2VBZGRyZXNzKSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HRCgidW5yZWdpc3Rlck1peCgpOiByZW1vdmluZyBtaXggZm9yIGRldj0weCV4IGFkZHI9JXMiLAorICAgICAgICAgICAgICAgICAgICBtaXgubURldmljZVR5cGUsIG1peC5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICByZW1vdmVBdChpKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQogICAgIH0KIAotICAgIHJlbW92ZUl0ZW1zQXQoaW5kZXgpOwotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBBTE9HRSgidW5yZWdpc3Rlck1peCgpOiBtaXggbm90IHJlZ2lzdGVyZWQgZm9yIGRldj0weCV4IGFkZHI9JXMiLAorICAgICAgICAgICAgbWl4Lm1EZXZpY2VUeXBlLCBtaXgubURldmljZUFkZHJlc3Muc3RyaW5nKCkpOworICAgIHJldHVybiBCQURfVkFMVUU7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0QXVkaW9Qb2xpY3lNaXgoY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+ICZwb2xpY3lNaXgpIGNvbnN0CitzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmdldEF1ZGlvUG9saWN5TWl4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLAorICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLCBzcDxBdWRpb1BvbGljeU1peD4gJnBvbGljeU1peCkgY29uc3QKIHsKLSAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShhZGRyZXNzKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJ1bnJlZ2lzdGVyUG9saWN5TWl4ZXMoKTogbWl4IGZvciBhZGRyZXNzICVzIG5vdCByZWdpc3RlcmVkIiwgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisKKyAgICBBTE9HVigiZ2V0QXVkaW9Qb2xpY3lNaXgoKSBmb3IgZGV2PTB4JXggYWRkcj0lcyIsIGRldmljZVR5cGUsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgIGZvciAoc3NpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIC8vIFdvcmthcm91bmQ6IHdoZW4gYW4gaW4gYXVkaW8gcG9saWN5IGlzIHJlZ2lzdGVyZWQsIGl0IG9wZW5zIGFuIG91dHB1dAorICAgICAgICAvLyB0aGF0IHRyaWVzIHRvIGZpbmQgdGhlIGF1ZGlvIHBvbGljeSwgdGh1cyB0aGUgZGV2aWNlIG11c3QgYmUgaWdub3JlZC4KKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+bURldmljZUFkZHJlc3MuY29tcGFyZShhZGRyZXNzKSA9PSAwKSB7CisgICAgICAgICAgICBwb2xpY3lNaXggPSBpdGVtQXQoaSk7CisgICAgICAgICAgICBBTE9HVigiZ2V0QXVkaW9Qb2xpY3lNaXg6IGZvdW5kIG1peCAlenUgbWF0Y2ggKGRldlR5cGU9MHgleCBhZGRyPSVzKSIsCisgICAgICAgICAgICAgICAgICAgIGksIGRldmljZVR5cGUsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CiAgICAgfQotICAgIHBvbGljeU1peCA9IHZhbHVlQXQoaW5kZXgpOwotICAgIHJldHVybiBOT19FUlJPUjsKKworICAgIEFMT0dFKCJnZXRBdWRpb1BvbGljeU1peCgpOiBtaXggbm90IHJlZ2lzdGVyZWQgZm9yIGRldj0weCV4IGFkZHI9JXMiLAorICAgICAgICAgICAgZGV2aWNlVHlwZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmNsb3NlT3V0cHV0KHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmZGVzYykKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSB2YWx1ZUF0KGkpOworICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gaXRlbUF0KGkpOwogICAgICAgICBpZiAocG9saWN5TWl4LT5nZXRPdXRwdXQoKSA9PSBkZXNjKSB7CiAgICAgICAgICAgICBwb2xpY3lNaXgtPmNsZWFyT3V0cHV0KCk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0T3V0cHV0Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiAmZGVzYykKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0T3V0cHV0Rm9yQXR0cigKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzLCB1aWRfdCB1aWQsCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJnByaW1hcnlEZXNjLAorICAgICAgICBzdGQ6OnZlY3RvcjxzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4+ICpzZWNvbmRhcnlEZXNjcykKIHsKICAgICBBTE9HVigiZ2V0T3V0cHV0Rm9yQXR0cigpIHF1ZXJ5aW5nICV6dSBtaXhlczoiLCBzaXplKCkpOwotICAgIGRlc2MgPSAwOworICAgIHByaW1hcnlEZXNjID0gMDsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSB2YWx1ZUF0KGkpOwotICAgICAgICBBdWRpb01peCAqbWl4ID0gcG9saWN5TWl4LT5nZXRNaXgoKTsKKyAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peCA9IGl0ZW1BdChpKTsKKyAgICAgICAgY29uc3QgYm9vbCBwcmltYXJ5T3V0cHV0TWl4ID0gIWlzX21peF9sb29wYmFja19yZW5kZXIocG9saWN5TWl4LT5tUm91dGVGbGFncyk7CisgICAgICAgIGlmICghcHJpbWFyeU91dHB1dE1peCAmJiAoZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19NTUFQX05PSVJRKSkgeworICAgICAgICAgICAgLy8gQUF1ZGlvIGRvZXMgbm90IHN1cHBvcnQgTU1BUF9OT19JUlEgbG9vcGJhY2sgcmVuZGVyLCBhbmQgdGhlcmUgaXMgbm8gd2F5IHdpdGgKKyAgICAgICAgICAgIC8vIHRoZSBjdXJyZW50IE1tYXBTdHJlYW1JbnRlcmZhY2U6OnN0YXJ0IHRvIHJlamVjdCBhIHNwZWNpZmljIGNsaWVudCBhZGRlZCB0byBhIHNoYXJlZAorICAgICAgICAgICAgLy8gbW1hcCBzdHJlYW0uCisgICAgICAgICAgICAvLyBBcyBhIHJlc3VsdCBhbGwgTU1BUF9OT0lSUSByZXF1ZXN0cyBoYXZlIHRvIGJlIHJlamVjdGVkIHdoZW4gYW4gbG9vcGJhY2sgcmVuZGVyCisgICAgICAgICAgICAvLyBwb2xpY3kgaXMgcHJlc2VudC4gVGhhdCBlbnN1cmVzIG5vIHNoYXJlZCBtbWFwIHN0cmVhbSBpcyB1c2VkIHdoZW4gYW4gbG9vcGJhY2sKKyAgICAgICAgICAgIC8vIHJlbmRlciBwb2xpY3kgaXMgcmVnaXN0ZXJlZC4KKyAgICAgICAgICAgIEFMT0dEKCIlczogUmVqZWN0aW5nIE1NQVBfTk9JUlEgcmVxdWVzdCBkdWUgdG8gTE9PUEJBQ0t8UkVOREVSIG1peCBwcmVzZW50LiIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgfQogCi0gICAgICAgIGlmIChtaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1BMQVlFUlMpIHsKLSAgICAgICAgICAgIC8vIFRPRE8gaWYgYWRkaW5nIG1vcmUgcGxheWVyIHJ1bGVzIChjdXJyZW50bHkgb25seSAyKSwgbWFrZSBydWxlIGhhbmRsaW5nICJnZW5lcmljIgotICAgICAgICAgICAgLy8gICAgICBhcyB0aGVyZSBpcyBubyBkaWZmZXJlbmNlIGluIHRoZSB0cmVhdG1lbnQgb2YgdXNhZ2UtIG9yIHVpZC1iYXNlZCBydWxlcwotICAgICAgICAgICAgYm9vbCBoYXNVc2FnZU1hdGNoUnVsZXMgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2wgaGFzVXNhZ2VFeGNsdWRlUnVsZXMgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2wgdXNhZ2VNYXRjaEZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sIHVzYWdlRXhjbHVzaW9uRm91bmQgPSBmYWxzZTsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHBvbGljeURlc2MgPSBwb2xpY3lNaXgtPmdldE91dHB1dCgpOworICAgICAgICBpZiAoIXBvbGljeURlc2MpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogU2tpcGluZyAlenU6IE1peCBoYXMgbm8gb3V0cHV0IiwgX19mdW5jX18sIGkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KIAotICAgICAgICAgICAgYm9vbCBoYXNVaWRNYXRjaFJ1bGVzID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sIGhhc1VpZEV4Y2x1ZGVSdWxlcyA9IGZhbHNlOwotICAgICAgICAgICAgYm9vbCB1aWRNYXRjaEZvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICBib29sIHVpZEV4Y2x1c2lvbkZvdW5kID0gZmFsc2U7CisgICAgICAgIGlmIChwcmltYXJ5T3V0cHV0TWl4ICYmIHByaW1hcnlEZXNjICE9IDApIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogU2tpcGluZyAlenU6IFByaW1hcnkgb3V0cHV0IGFscmVhZHkgZm91bmQiLCBfX2Z1bmNfXywgaSk7CisgICAgICAgICAgICBjb250aW51ZTsgLy8gUHJpbWFyeSBvdXRwdXQgYWxyZWFkeSBmb3VuZAorICAgICAgICB9CiAKLSAgICAgICAgICAgIGJvb2wgaGFzQWRkck1hdGNoID0gZmFsc2U7CisgICAgICAgIHN3aXRjaCAobWl4TWF0Y2gocG9saWN5TWl4LmdldCgpLCBpLCBhdHRyaWJ1dGVzLCB1aWQpKSB7CisgICAgICAgICAgICBjYXNlIE1peE1hdGNoU3RhdHVzOjpJTlZBTElEX01JWDoKKyAgICAgICAgICAgICAgICAvLyBUaGUgbWl4IGhhcyBjb250cmFkaWN0b3J5IHJ1bGVzLCBpZ25vcmUgaXQKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiByZWplY3QgaW52YWxpZCBtaXggYXQgcmVnaXN0cmF0aW9uCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICBjYXNlIE1peE1hdGNoU3RhdHVzOjpOT19NQVRDSDoKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6IE1peCAlenU6IGRvZXMgbm90IG1hdGNoIiwgX19mdW5jX18sIGkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIHRoZSBtaXgKKyAgICAgICAgICAgIGNhc2UgTWl4TWF0Y2hTdGF0dXM6Ok1BVENIOjsKKyAgICAgICAgfQogCi0gICAgICAgICAgICAvLyBpdGVyYXRlIG92ZXIgYWxsIG1peCBjcml0ZXJpYSB0byBsaXN0IHdoYXQgcnVsZXMgdGhpcyBtaXggY29udGFpbnMKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbWl4LT5tQ3JpdGVyaWEuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiIGdldE91dHB1dEZvckF0dHI6IG1peCAlenU6IGluc3BlY3RpbmcgbWl4IGNyaXRlcmlhICV6dSBvZiAlenUiLAotICAgICAgICAgICAgICAgICAgICAgICAgaSwgaiwgbWl4LT5tQ3JpdGVyaWEuc2l6ZSgpKTsKLQotICAgICAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGFkZHJlc3MgbWF0Y2gsIHByaW9yaXRpemUgdGhhdCBtYXRjaAotICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKGF0dHJpYnV0ZXMudGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJuY21wKGF0dHJpYnV0ZXMudGFncyArIHN0cmxlbigiYWRkcj0iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gc3RybGVuKCJhZGRyPSIpIC0gMSkgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBoYXNBZGRyTWF0Y2ggPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBzd2l0Y2ggKG1peC0+bUNyaXRlcmlhW2pdLm1SdWxlKSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRToKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlx0bWl4IGhhcyBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRSBmb3IgdXNhZ2UgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Vc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgIGhhc1VzYWdlTWF0Y2hSdWxlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlID09IGF0dHJpYnV0ZXMudXNhZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIG9uZSBtYXRjaCBhZ2FpbnN0IGFsbCBhbGxvd2VkIHVzYWdlcwotICAgICAgICAgICAgICAgICAgICAgICAgdXNhZ2VNYXRjaEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJVTEVfRVhDTFVERV9BVFRSSUJVVEVfVVNBR0U6Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9FWENMVURFX0FUVFJJQlVURV9VU0FHRSBmb3IgdXNhZ2UgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVXNhZ2UpOwotICAgICAgICAgICAgICAgICAgICBoYXNVc2FnZUV4Y2x1ZGVSdWxlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlID09IGF0dHJpYnV0ZXMudXNhZ2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIHRoaXMgdXNhZ2UgaXMgdG8gYmUgZXhjbHVkZWQKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlRXhjbHVzaW9uRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgUlVMRV9NQVRDSF9VSUQ6Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9NQVRDSF9VSUQgZm9yIHVpZCAlZCIsIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkKTsKLSAgICAgICAgICAgICAgICAgICAgaGFzVWlkTWF0Y2hSdWxlcyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVpZCA9PSB1aWQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdW5kIG9uZSBVSUQgbWF0Y2ggYWdhaW5zdCBhbGwgYWxsb3dlZCBVSURzCi0gICAgICAgICAgICAgICAgICAgICAgICB1aWRNYXRjaEZvdW5kID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFJVTEVfRVhDTFVERV9VSUQ6Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9FWENMVURFX1VJRCBmb3IgdWlkICVkIiwgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQpOwotICAgICAgICAgICAgICAgICAgICBoYXNVaWRFeGNsdWRlUnVsZXMgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBpZiAobWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQgPT0gdWlkKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCB0aGlzIFVJRCBpcyB0byBiZSBleGNsdWRlZAotICAgICAgICAgICAgICAgICAgICAgICAgdWlkRXhjbHVzaW9uRm91bmQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vIGNvbnNpc3RlbmN5IGNoZWNrczogZm9yIGVhY2ggImRpbWVuc2lvbiIgb2YgcnVsZXMgKHVzYWdlLCB1aWQuLi4pLCB3ZSBjYW4KLSAgICAgICAgICAgICAgICAvLyBvbmx5IGhhdmUgTUFUQ0ggcnVsZXMsIG9yIEVYQ0xVREUgcnVsZXMgaW4gZWFjaCBkaW1lbnNpb24sIG5vdCBhIGNvbWJpbmF0aW9uCi0gICAgICAgICAgICAgICAgaWYgKGhhc1VzYWdlTWF0Y2hSdWxlcyAmJiBoYXNVc2FnZUV4Y2x1ZGVSdWxlcykgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cjogaW52YWxpZCBjb21iaW5hdGlvbiBvZiBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGFuZCBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFIGluIG1peCAlenUiLCBpKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGhhc1VpZE1hdGNoUnVsZXMgJiYgaGFzVWlkRXhjbHVkZVJ1bGVzKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyOiBpbnZhbGlkIGNvbWJpbmF0aW9uIG9mIFJVTEVfTUFUQ0hfVUlEIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYW5kIFJVTEVfRVhDTFVERV9VSUQgaW4gbWl4ICV6dSIsIGkpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICgoaGFzVXNhZ2VFeGNsdWRlUnVsZXMgJiYgdXNhZ2VFeGNsdXNpb25Gb3VuZCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHx8IChoYXNVaWRFeGNsdWRlUnVsZXMgJiYgdWlkRXhjbHVzaW9uRm91bmQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBzdG9wIGl0ZXJhdGluZyBvbiBjcml0ZXJpYSBiZWNhdXNlIGFuIGV4Y2x1c2lvbiB3YXMgZm91bmQgKHdpbGwgZmFpbCkKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIH0vL2l0ZXJhdGUgb24gbWl4IGNyaXRlcmlhCi0KLSAgICAgICAgICAgIC8vIGRldGVybWluZSBpZiBleGl0aW5nIG9uIHN1Y2Nlc3MgKG9yIGltcGxpY2l0IGZhaWx1cmUgYXMgZGVzYyBpcyAwKQotICAgICAgICAgICAgaWYgKGhhc0FkZHJNYXRjaCB8fAotICAgICAgICAgICAgICAgICAgICAhKChoYXNVc2FnZUV4Y2x1ZGVSdWxlcyAmJiB1c2FnZUV4Y2x1c2lvbkZvdW5kKSB8fAotICAgICAgICAgICAgICAgICAgICAgIChoYXNVc2FnZU1hdGNoUnVsZXMgJiYgIXVzYWdlTWF0Y2hGb3VuZCkgIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgKGhhc1VpZEV4Y2x1ZGVSdWxlcyAmJiB1aWRFeGNsdXNpb25Gb3VuZCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAoaGFzVWlkTWF0Y2hSdWxlcyAmJiAhdWlkTWF0Y2hGb3VuZCkpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIlx0Z2V0T3V0cHV0Rm9yQXR0ciB3aWxsIHVzZSBtaXggJXp1IiwgaSk7Ci0gICAgICAgICAgICAgICAgZGVzYyA9IHBvbGljeU1peC0+Z2V0T3V0cHV0KCk7CisgICAgICAgIHBvbGljeURlc2MtPm1Qb2xpY3lNaXggPSBwb2xpY3lNaXg7CisgICAgICAgIGlmIChwcmltYXJ5T3V0cHV0TWl4KSB7CisgICAgICAgICAgICBwcmltYXJ5RGVzYyA9IHBvbGljeURlc2M7CisgICAgICAgICAgICBBTE9HVigiJXM6IE1peCAlenU6IHNldCBwcmltYXJ5IGRlc2MiLCBfX2Z1bmNfXywgaSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAocG9saWN5RGVzYy0+bUlvSGFuZGxlID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBNaXggJXp1IGlnbm9yZWQgYXMgc2Vjb25kYXJ5T3V0cHV0IGJlY2F1c2Ugbm90IG9wZW5lZCB5ZXQiLCBfX2Z1bmNfXywgaSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dWKCIlczogQWRkIGEgc2Vjb25kYXJ5IGRlc2MgJXp1IiwgX19mdW5jX18sIGkpOworICAgICAgICAgICAgICAgIHNlY29uZGFyeURlc2NzLT5wdXNoX2JhY2socG9saWN5RGVzYyk7CiAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQogCi0gICAgICAgIH0gZWxzZSBpZiAobWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKLSAgICAgICAgICAgIGlmIChhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFICYmCi0gICAgICAgICAgICAgICAgICAgIHN0cm5jbXAoYXR0cmlidXRlcy50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDAgJiYKK0F1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6TWl4TWF0Y2hTdGF0dXMgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjptaXhNYXRjaCgKKyAgICAgICAgY29uc3QgQXVkaW9NaXgqIG1peCwgc2l6ZV90IG1peEluZGV4LCBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMsIHVpZF90IHVpZCkgeworCisgICAgaWYgKG1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgeworICAgICAgICAvLyBMb29wYmFjayByZW5kZXIgbWl4ZXMgYXJlIGNyZWF0ZWQgZnJvbSBhIHB1YmxpYyBBUEkgYW5kIHRodXMgcmVzdHJpY3RlZAorICAgICAgICAvLyB0byBub24gc2Vuc2libGUgYXVkaW8gdGhhdCBoYXZlIG5vdCBvcHRlZCBvdXQuCisgICAgICAgIGlmIChpc19taXhfbG9vcGJhY2tfcmVuZGVyKG1peC0+bVJvdXRlRmxhZ3MpKSB7CisgICAgICAgICAgICBhdXRvIGhhc0ZsYWcgPSBbXShhdXRvIGZsYWdzLCBhdXRvIGZsYWcpIHsgcmV0dXJuIChmbGFncyAmIGZsYWcpID09IGZsYWc7IH07CisgICAgICAgICAgICBpZiAoaGFzRmxhZyhhdHRyaWJ1dGVzLmZsYWdzLCBBVURJT19GTEFHX05PX1NZU1RFTV9DQVBUVVJFKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBNaXhNYXRjaFN0YXR1czo6Tk9fTUFUQ0g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIW1peC0+bUFsbG93UHJpdmlsZWdlZFBsYXliYWNrQ2FwdHVyZSAmJgorICAgICAgICAgICAgICAgIGhhc0ZsYWcoYXR0cmlidXRlcy5mbGFncywgQVVESU9fRkxBR19OT19NRURJQV9QUk9KRUNUSU9OKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBNaXhNYXRjaFN0YXR1czo6Tk9fTUFUQ0g7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIShhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX1VOS05PV04gfHwKKyAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMudXNhZ2UgPT0gQVVESU9fVVNBR0VfTUVESUEgfHwKKyAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMudXNhZ2UgPT0gQVVESU9fVVNBR0VfR0FNRSkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6Ok5PX01BVENIOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIFRPRE8gaWYgYWRkaW5nIG1vcmUgcGxheWVyIHJ1bGVzIChjdXJyZW50bHkgb25seSAyKSwgbWFrZSBydWxlIGhhbmRsaW5nICJnZW5lcmljIgorICAgICAgICAvLyAgICAgIGFzIHRoZXJlIGlzIG5vIGRpZmZlcmVuY2UgaW4gdGhlIHRyZWF0bWVudCBvZiB1c2FnZS0gb3IgdWlkLWJhc2VkIHJ1bGVzCisgICAgICAgIGJvb2wgaGFzVXNhZ2VNYXRjaFJ1bGVzID0gZmFsc2U7CisgICAgICAgIGJvb2wgaGFzVXNhZ2VFeGNsdWRlUnVsZXMgPSBmYWxzZTsKKyAgICAgICAgYm9vbCB1c2FnZU1hdGNoRm91bmQgPSBmYWxzZTsKKyAgICAgICAgYm9vbCB1c2FnZUV4Y2x1c2lvbkZvdW5kID0gZmFsc2U7CisKKyAgICAgICAgYm9vbCBoYXNVaWRNYXRjaFJ1bGVzID0gZmFsc2U7CisgICAgICAgIGJvb2wgaGFzVWlkRXhjbHVkZVJ1bGVzID0gZmFsc2U7CisgICAgICAgIGJvb2wgdWlkTWF0Y2hGb3VuZCA9IGZhbHNlOworICAgICAgICBib29sIHVpZEV4Y2x1c2lvbkZvdW5kID0gZmFsc2U7CisKKyAgICAgICAgYm9vbCBoYXNBZGRyTWF0Y2ggPSBmYWxzZTsKKworICAgICAgICAvLyBpdGVyYXRlIG92ZXIgYWxsIG1peCBjcml0ZXJpYSB0byBsaXN0IHdoYXQgcnVsZXMgdGhpcyBtaXggY29udGFpbnMKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtaXgtPm1Dcml0ZXJpYS5zaXplKCk7IGorKykgeworICAgICAgICAgICAgQUxPR1YoIiBnZXRPdXRwdXRGb3JBdHRyOiBtaXggJXp1OiBpbnNwZWN0aW5nIG1peCBjcml0ZXJpYSAlenUgb2YgJXp1IiwKKyAgICAgICAgICAgICAgICAgICAgbWl4SW5kZXgsIGosIG1peC0+bUNyaXRlcmlhLnNpemUoKSk7CisKKyAgICAgICAgICAgIC8vIGlmIHRoZXJlIGlzIGFuIGFkZHJlc3MgbWF0Y2gsIHByaW9yaXRpemUgdGhhdCBtYXRjaAorICAgICAgICAgICAgaWYgKHN0cm5jbXAoYXR0cmlidXRlcy50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDAgJiYKICAgICAgICAgICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MgKyBzdHJsZW4oImFkZHI9IiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSBzdHJsZW4oImFkZHI9IikgLSAxKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgZGVzYyA9IHBvbGljeU1peC0+Z2V0T3V0cHV0KCk7CisgICAgICAgICAgICAgICAgaGFzQWRkck1hdGNoID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3dpdGNoIChtaXgtPm1Dcml0ZXJpYVtqXS5tUnVsZSkgeworICAgICAgICAgICAgY2FzZSBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRToKKyAgICAgICAgICAgICAgICBBTE9HVigiXHRtaXggaGFzIFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFIGZvciB1c2FnZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVXNhZ2UpOworICAgICAgICAgICAgICAgIGhhc1VzYWdlTWF0Y2hSdWxlcyA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVXNhZ2UgPT0gYXR0cmlidXRlcy51c2FnZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCBvbmUgbWF0Y2ggYWdhaW5zdCBhbGwgYWxsb3dlZCB1c2FnZXMKKyAgICAgICAgICAgICAgICAgICAgdXNhZ2VNYXRjaEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIFJVTEVfRVhDTFVERV9BVFRSSUJVVEVfVVNBR0U6CisgICAgICAgICAgICAgICAgQUxPR1YoIlx0bWl4IGhhcyBSVUxFX0VYQ0xVREVfQVRUUklCVVRFX1VTQUdFIGZvciB1c2FnZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVzYWdlKTsKKyAgICAgICAgICAgICAgICBoYXNVc2FnZUV4Y2x1ZGVSdWxlcyA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVXNhZ2UgPT0gYXR0cmlidXRlcy51c2FnZSkgeworICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCB0aGlzIHVzYWdlIGlzIHRvIGJlIGV4Y2x1ZGVkCisgICAgICAgICAgICAgICAgICAgIHVzYWdlRXhjbHVzaW9uRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgUlVMRV9NQVRDSF9VSUQ6CisgICAgICAgICAgICAgICAgQUxPR1YoIlx0bWl4IGhhcyBSVUxFX01BVENIX1VJRCBmb3IgdWlkICVkIiwgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQpOworICAgICAgICAgICAgICAgIGhhc1VpZE1hdGNoUnVsZXMgPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVpZCA9PSB1aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZm91bmQgb25lIFVJRCBtYXRjaCBhZ2FpbnN0IGFsbCBhbGxvd2VkIFVJRHMKKyAgICAgICAgICAgICAgICAgICAgdWlkTWF0Y2hGb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBSVUxFX0VYQ0xVREVfVUlEOgorICAgICAgICAgICAgICAgIEFMT0dWKCJcdG1peCBoYXMgUlVMRV9FWENMVURFX1VJRCBmb3IgdWlkICVkIiwgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1VaWQpOworICAgICAgICAgICAgICAgIGhhc1VpZEV4Y2x1ZGVSdWxlcyA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkID09IHVpZCkgeworICAgICAgICAgICAgICAgICAgICAvLyBmb3VuZCB0aGlzIFVJRCBpcyB0byBiZSBleGNsdWRlZAorICAgICAgICAgICAgICAgICAgICB1aWRFeGNsdXNpb25Gb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY29uc2lzdGVuY3kgY2hlY2tzOiBmb3IgZWFjaCAiZGltZW5zaW9uIiBvZiBydWxlcyAodXNhZ2UsIHVpZC4uLiksIHdlIGNhbgorICAgICAgICAgICAgLy8gb25seSBoYXZlIE1BVENIIHJ1bGVzLCBvciBFWENMVURFIHJ1bGVzIGluIGVhY2ggZGltZW5zaW9uLCBub3QgYSBjb21iaW5hdGlvbgorICAgICAgICAgICAgaWYgKGhhc1VzYWdlTWF0Y2hSdWxlcyAmJiBoYXNVc2FnZUV4Y2x1ZGVSdWxlcykgeworICAgICAgICAgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyOiBpbnZhbGlkIGNvbWJpbmF0aW9uIG9mIFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFIgorICAgICAgICAgICAgICAgICAgICAgICAgIiBhbmQgUlVMRV9FWENMVURFX0FUVFJJQlVURV9VU0FHRSBpbiBtaXggJXp1IiwgbWl4SW5kZXgpOworICAgICAgICAgICAgICAgIHJldHVybiBNaXhNYXRjaFN0YXR1czo6SU5WQUxJRF9NSVg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFzVWlkTWF0Y2hSdWxlcyAmJiBoYXNVaWRFeGNsdWRlUnVsZXMpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cjogaW52YWxpZCBjb21iaW5hdGlvbiBvZiBSVUxFX01BVENIX1VJRCIKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYW5kIFJVTEVfRVhDTFVERV9VSUQgaW4gbWl4ICV6dSIsIG1peEluZGV4KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6OklOVkFMSURfTUlYOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKGhhc1VzYWdlRXhjbHVkZVJ1bGVzICYmIHVzYWdlRXhjbHVzaW9uRm91bmQpCisgICAgICAgICAgICAgICAgICAgIHx8IChoYXNVaWRFeGNsdWRlUnVsZXMgJiYgdWlkRXhjbHVzaW9uRm91bmQpKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7IC8vIHN0b3AgaXRlcmF0aW5nIG9uIGNyaXRlcmlhIGJlY2F1c2UgYW4gZXhjbHVzaW9uIHdhcyBmb3VuZCAod2lsbCBmYWlsKQorICAgICAgICAgICAgfQorCisgICAgICAgIH0vL2l0ZXJhdGUgb24gbWl4IGNyaXRlcmlhCisKKyAgICAgICAgLy8gZGV0ZXJtaW5lIGlmIGV4aXRpbmcgb24gc3VjY2VzcyAob3IgaW1wbGljaXQgZmFpbHVyZSBhcyBkZXNjIGlzIDApCisgICAgICAgIGlmIChoYXNBZGRyTWF0Y2ggfHwKKyAgICAgICAgICAgICAgICAhKChoYXNVc2FnZUV4Y2x1ZGVSdWxlcyAmJiB1c2FnZUV4Y2x1c2lvbkZvdW5kKSB8fAorICAgICAgICAgICAgICAgICAgKGhhc1VzYWdlTWF0Y2hSdWxlcyAmJiAhdXNhZ2VNYXRjaEZvdW5kKSAgfHwKKyAgICAgICAgICAgICAgICAgIChoYXNVaWRFeGNsdWRlUnVsZXMgJiYgdWlkRXhjbHVzaW9uRm91bmQpIHx8CisgICAgICAgICAgICAgICAgICAoaGFzVWlkTWF0Y2hSdWxlcyAmJiAhdWlkTWF0Y2hGb3VuZCkpKSB7CisgICAgICAgICAgICBBTE9HVigiXHRnZXRPdXRwdXRGb3JBdHRyIHdpbGwgdXNlIG1peCAlenUiLCBtaXhJbmRleCk7CisgICAgICAgICAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6Ok1BVENIOwogICAgICAgICB9Ci0gICAgICAgIGlmIChkZXNjICE9IDApIHsKLSAgICAgICAgICAgIGRlc2MtPm1Qb2xpY3lNaXggPSBtaXg7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisKKyAgICB9IGVsc2UgaWYgKG1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7CisgICAgICAgIGlmIChhdHRyaWJ1dGVzLnVzYWdlID09IEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFICYmCisgICAgICAgICAgICAgICAgc3RybmNtcChhdHRyaWJ1dGVzLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCAmJgorICAgICAgICAgICAgICAgIHN0cm5jbXAoYXR0cmlidXRlcy50YWdzICsgc3RybGVuKCJhZGRyPSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgbWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0FUVFJJQlVURVNfVEFHU19NQVhfU0laRSAtIHN0cmxlbigiYWRkcj0iKSAtIDEpID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiBNaXhNYXRjaFN0YXR1czo6TUFUQ0g7CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICByZXR1cm4gTWl4TWF0Y2hTdGF0dXM6Ok5PX01BVENIOwogfQogCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb01peCAqKnBvbGljeU1peCkKK3NwPERldmljZURlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0RGV2aWNlQW5kTWl4Rm9yT3V0cHV0KAorICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gJm91dHB1dCwKKyAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzKQogewogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgQXVkaW9NaXggKm1peCA9IHZhbHVlQXQoaSktPmdldE1peCgpOworICAgICAgICBpZiAoaXRlbUF0KGkpLT5nZXRPdXRwdXQoKSA9PSBvdXRwdXQpIHsKKyAgICAgICAgICAgIC8vIFRoaXMgRGVzYyBpcyBpbnZvbHZlZCBpbiBhIE1peCwgd2hpY2ggaGFzIHRoZSBoaWdoZXN0IHByaW8KKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gaXRlbUF0KGkpLT5tRGV2aWNlVHlwZTsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGl0ZW1BdChpKS0+bURldmljZUFkZHJlc3M7CisgICAgICAgICAgICBBTE9HVigiJXM6IGRldmljZSAoMHgleCwgYWRkcj0lcykgZm9yY2VkIGJ5IG1peCIsCisgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZVR5cGUsIGFkZHJlc3MuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UoZGV2aWNlVHlwZSwgYWRkcmVzcywgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQogCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKAorICAgICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbERldmljZXMsCisgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiAqcG9saWN5TWl4KSBjb25zdAoreworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQXVkaW9Qb2xpY3lNaXggKm1peCA9IGl0ZW1BdChpKS5nZXQoKTsKICAgICAgICAgaWYgKG1peC0+bU1peFR5cGUgIT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQpAQCAtMzA0LDIwICszNjYsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgbWl4LT5tQ3JpdGVyaWFbal0ubVZhbHVlLm1Tb3VyY2UgPT0gaW5wdXRTb3VyY2UpIHx8CiAgICAgICAgICAgICAgICAoUlVMRV9FWENMVURFX0FUVFJJQlVURV9DQVBUVVJFX1BSRVNFVCA9PSBtaXgtPm1Dcml0ZXJpYVtqXS5tUnVsZSAmJgogICAgICAgICAgICAgICAgICAgICBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVNvdXJjZSAhPSBpbnB1dFNvdXJjZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoYXZhaWxEZXZpY2VzICYgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHBvbGljeU1peCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgLy8gYXNzdW1pbmcgUG9saWN5TWl4IG9ubHkgZm9yIHJlbW90ZSBzdWJtaXggZm9yIGlucHV0CisgICAgICAgICAgICAgICAgLy8gc28gbWl4LT5tRGV2aWNlVHlwZSBjYW4gb25seSBiZSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgKKyAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7CisgICAgICAgICAgICAgICAgYXV0byBtaXhEZXZpY2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxEZXZpY2VzLmdldERldmljZShkZXZpY2UsIG1peC0+bURldmljZUFkZHJlc3MsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgICAgICBpZiAobWl4RGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHBvbGljeU1peCAhPSBudWxscHRyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAqcG9saWN5TWl4ID0gbWl4OwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1peERldmljZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0gICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOworICAgIHJldHVybiBudWxscHRyOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmdldElucHV0TWl4Rm9yQXR0cihhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciwgQXVkaW9NaXggKipwb2xpY3lNaXgpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmdldElucHV0TWl4Rm9yQXR0cigKKyAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIsIHNwPEF1ZGlvUG9saWN5TWl4PiAqcG9saWN5TWl4KQogewogICAgIGlmIChzdHJuY21wKGF0dHIudGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSAhPSAwKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CkBAIC0zMjUsMzggKzM5MywxNDcgQEAKICAgICBTdHJpbmc4IGFkZHJlc3MoYXR0ci50YWdzICsgc3RybGVuKCJhZGRyPSIpKTsKIAogI2lmZGVmIExPR19OREVCVUcKLSAgICBBTE9HVigiZ2V0SW5wdXRNaXhGb3JBdHRyIGxvb2tpbmcgZm9yIGFkZHJlc3MgJXNcbiAgbWl4ZXMgYXZhaWxhYmxlOiIsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgIEFMT0dWKCJnZXRJbnB1dE1peEZvckF0dHIgbG9va2luZyBmb3IgYWRkcmVzcyAlcyBmb3Igc291cmNlICVkXG4gIG1peGVzIGF2YWlsYWJsZToiLAorICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgYXR0ci5zb3VyY2UpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSB2YWx1ZUF0KGkpOwotICAgICAgICAgICAgQXVkaW9NaXggKm1peCA9IHBvbGljeU1peC0+Z2V0TWl4KCk7Ci0gICAgICAgICAgICBBTE9HVigiXHRtaXggJXp1IGFkZHJlc3M9JXMiLCBpLCBtaXgtPm1EZXZpY2VBZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9Qb2xpY3lNaXg+IGF1ZGlvUG9saWN5TWl4ID0gaXRlbUF0KGkpOworICAgICAgICBBTE9HVigiXHRtaXggJXp1IGFkZHJlc3M9JXMiLCBpLCBhdWRpb1BvbGljeU1peC0+bURldmljZUFkZHJlc3Muc3RyaW5nKCkpOwogICAgIH0KICNlbmRpZgogCi0gICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoYWRkcmVzcyk7Ci0gICAgaWYgKGluZGV4IDwgMCkgeworICAgIHNpemVfdCBpbmRleDsKKyAgICBmb3IgKGluZGV4ID0gMDsgaW5kZXggPCBzaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9Qb2xpY3lNaXg+JiByZWdpc3RlcmVkTWl4ID0gaXRlbUF0KGluZGV4KTsKKyAgICAgICAgaWYgKHJlZ2lzdGVyZWRNaXgtPm1EZXZpY2VBZGRyZXNzLmNvbXBhcmUoYWRkcmVzcykgPT0gMCkgeworICAgICAgICAgICAgQUxPR0QoImdldElucHV0TWl4Rm9yQXR0ciBmb3VuZCBhZGRyPSVzIGRldj0weCV4IiwKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJlZE1peC0+bURldmljZUFkZHJlc3Muc3RyaW5nKCksIHJlZ2lzdGVyZWRNaXgtPm1EZXZpY2VUeXBlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmIChpbmRleCA9PSBzaXplKCkpIHsKICAgICAgICAgQUxPR1coImdldElucHV0TWl4Rm9yQXR0cigpIG5vIHBvbGljeSBmb3IgYWRkcmVzcyAlcyIsIGFkZHJlc3Muc3RyaW5nKCkpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBzcDxBdWRpb1BvbGljeU1peD4gYXVkaW9Qb2xpY3lNaXggPSB2YWx1ZUF0KGluZGV4KTsKLSAgICBBdWRpb01peCAqbWl4ID0gYXVkaW9Qb2xpY3lNaXgtPmdldE1peCgpOworICAgIGNvbnN0IHNwPEF1ZGlvUG9saWN5TWl4PiBhdWRpb1BvbGljeU1peCA9IGl0ZW1BdChpbmRleCk7CiAKLSAgICBpZiAobWl4LT5tTWl4VHlwZSAhPSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgaWYgKGF1ZGlvUG9saWN5TWl4LT5tTWl4VHlwZSAhPSBNSVhfVFlQRV9QTEFZRVJTKSB7CiAgICAgICAgIEFMT0dXKCJnZXRJbnB1dE1peEZvckF0dHIoKSBiYWQgcG9saWN5IG1peCB0eXBlIGZvciBhZGRyZXNzICVzIiwgYWRkcmVzcy5zdHJpbmcoKSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgICpwb2xpY3lNaXggPSBtaXg7CisgICAgaWYgKHBvbGljeU1peCAhPSBudWxscHRyKSB7CisgICAgICAgICpwb2xpY3lNaXggPSBhdWRpb1BvbGljeU1peDsKKyAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1peENvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIHN0ZDo6c3RyaW5nIGxvZygiXG5BdWRpbyBQb2xpY3kgTWl4OlxuIik7Ci0gICAgd3JpdGUoZmQsIGxvZy5jX3N0cigpLCBsb2cuc2l6ZSgpKTsKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsCisgICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgeworICAgIC8vIHZlcmlmeSBmZWFzaWJpbGl0eTogZm9yIGVhY2ggcGxheWVyIG1peDogaWYgaXQgYWxyZWFkeSBjb250YWlucyBhCisgICAgLy8gICAgIm1hdGNoIHVpZCIgcnVsZSBmb3IgdGhpcyB1aWQsIHJldHVybiBhbiBlcnJvcgorICAgIC8vICAgIChhZGRpbmcgYSB1aWQtZGV2aWNlIGFmZmluaXR5IHdvdWxkIHJlc3VsdCBpbiBjb250cmFkaWN0b3J5IHJ1bGVzKQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCwgMiwgaSk7CisgICAgICAgIGNvbnN0IEF1ZGlvUG9saWN5TWl4KiBtaXggPSBpdGVtQXQoaSkuZ2V0KCk7CisgICAgICAgIGlmICghbWl4LT5pc0RldmljZUFmZmluaXR5Q29tcGF0aWJsZSgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAobWl4LT5oYXNVaWRSdWxlKHRydWUgLyptYXRjaCovLCB1aWQpKSB7CisgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyByZW1vdmUgZXhpc3RpbmcgcnVsZXMgZm9yIHRoaXMgdWlkCisgICAgcmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWQpOworCisgICAgLy8gZm9yIGVhY2ggcGxheWVyIG1peDoKKyAgICAvLyAgIElGICAgIGRldmljZSBpcyBub3QgYSB0YXJnZXQgZm9yIHRoZSBtaXgsCisgICAgLy8gICAgIEFORCBpdCBkb2Vzbid0IGhhdmUgYSAibWF0Y2ggdWlkIiBydWxlCisgICAgLy8gICBUSEVOIGFkZCBhIHJ1bGUgdG8gZXhjbHVkZSB0aGUgdWlkCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBjb25zdCBBdWRpb1BvbGljeU1peCAqbWl4ID0gaXRlbUF0KGkpLmdldCgpOworICAgICAgICBpZiAoIW1peC0+aXNEZXZpY2VBZmZpbml0eUNvbXBhdGlibGUoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gY2hlY2sgaWYgdGhpcyBtaXggZ29lcyB0byBhIGRldmljZSBpbiB0aGUgbGlzdCBvZiBkZXZpY2VzCisgICAgICAgIGJvb2wgZGV2aWNlTWF0Y2ggPSBmYWxzZTsKKyAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciBtaXhEZXZpY2UobWl4LT5tRGV2aWNlVHlwZSwgbWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZGV2aWNlcy5zaXplKCk7IGorKykgeworICAgICAgICAgICAgaWYgKG1peERldmljZS5lcXVhbHMoZGV2aWNlc1tqXSkpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VNYXRjaCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFkZXZpY2VNYXRjaCAmJiAhbWl4LT5oYXNNYXRjaFVpZFJ1bGUoKSkgeworICAgICAgICAgICAgLy8gdGhpcyBtaXggZG9lc24ndCBnbyB0byBvbmUgb2YgdGhlIGxpc3RlZCBkZXZpY2VzIGZvciB0aGUgZ2l2ZW4gdWlkLAorICAgICAgICAgICAgLy8gYW5kIGl0J3Mgbm90IGFscmVhZHkgcmVzdHJpY3RpbmcgdGhlIG1peCBvbiBhIHVpZCwKKyAgICAgICAgICAgIC8vIG1vZGlmeSBpdHMgcnVsZXMgdG8gZXhjbHVkZSB0aGUgdWlkCisgICAgICAgICAgICBpZiAoIW1peC0+aGFzVWlkUnVsZShmYWxzZSAvKm1hdGNoKi8sIHVpZCkpIHsKKyAgICAgICAgICAgICAgICAvLyBubyBuZWVkIHRvIGRvIGl0IGFnYWluIGlmIHVpZCBpcyBhbHJlYWR5IGV4Y2x1ZGVkCisgICAgICAgICAgICAgICAgbWl4LT5zZXRFeGNsdWRlVWlkKHVpZCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6cmVtb3ZlVWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQpIHsKKyAgICAvLyBmb3IgZWFjaCBwbGF5ZXIgbWl4OiByZW1vdmUgZXhpc3RpbmcgcnVsZXMgdGhhdCBtYXRjaCBvciBleGNsdWRlIHRoaXMgdWlkCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBib29sIGZvdW5kVWlkUnVsZSA9IGZhbHNlOworICAgICAgICBjb25zdCBBdWRpb1BvbGljeU1peCAqbWl4ID0gaXRlbUF0KGkpLmdldCgpOworICAgICAgICBpZiAoIW1peC0+aXNEZXZpY2VBZmZpbml0eUNvbXBhdGlibGUoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBjcml0ZXJpYVRvUmVtb3ZlOworICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IG1peC0+bUNyaXRlcmlhLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBydWxlID0gbWl4LT5tQ3JpdGVyaWFbal0ubVJ1bGU7CisgICAgICAgICAgICAvLyBpcyB0aGlzIHJ1bGUgZXhjbHVkaW5nIHRoZSB1aWQ/IChub3QgY29uc2lkZXJpbmcgdWlkIG1hdGNoIHJ1bGVzCisgICAgICAgICAgICAvLyBhcyB0aG9zZSBhcmUgbm90IHVzZWQgZm9yIHVpZC1kZXZpY2UgYWZmaW5pdHkpCisgICAgICAgICAgICBpZiAocnVsZSA9PSBSVUxFX0VYQ0xVREVfVUlECisgICAgICAgICAgICAgICAgICAgICYmIHVpZCA9PSBtaXgtPm1Dcml0ZXJpYVtqXS5tVmFsdWUubVVpZCkgeworICAgICAgICAgICAgICAgIGZvdW5kVWlkUnVsZSA9IHRydWU7CisgICAgICAgICAgICAgICAgY3JpdGVyaWFUb1JlbW92ZS5pbnNlcnQoY3JpdGVyaWFUb1JlbW92ZS5iZWdpbigpLCBqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoZm91bmRVaWRSdWxlKSB7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGNyaXRlcmlhVG9SZW1vdmUuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgICAgICBtaXgtPm1Dcml0ZXJpYS5yZW1vdmVBdChjcml0ZXJpYVRvUmVtb3ZlW2pdKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5TWl4Q29sbGVjdGlvbjo6Z2V0RGV2aWNlc0ZvclVpZCh1aWRfdCB1aWQsCisgICAgICAgIFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgY29uc3QgeworICAgIC8vIGZvciBlYWNoIHBsYXllciBtaXg6IGZpbmQgcnVsZXMgdGhhdCBkb24ndCBleGNsdWRlIHRoaXMgdWlkLCBhbmQgYWRkIHRoZSBkZXZpY2UgdG8gdGhlIGxpc3QKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGJvb2wgcnVsZUFsbG93c1VpZCA9IHRydWU7CisgICAgICAgIGNvbnN0IEF1ZGlvUG9saWN5TWl4ICptaXggPSBpdGVtQXQoaSkuZ2V0KCk7CisgICAgICAgIGlmIChtaXgtPm1NaXhUeXBlICE9IE1JWF9UWVBFX1BMQVlFUlMpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbWl4LT5tQ3JpdGVyaWEuc2l6ZSgpOyBqKyspIHsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHJ1bGUgPSBtaXgtPm1Dcml0ZXJpYVtqXS5tUnVsZTsKKyAgICAgICAgICAgIGlmIChydWxlID09IFJVTEVfRVhDTFVERV9VSUQKKyAgICAgICAgICAgICAgICAgICAgJiYgdWlkID09IG1peC0+bUNyaXRlcmlhW2pdLm1WYWx1ZS5tVWlkKSB7CisgICAgICAgICAgICAgICAgcnVsZUFsbG93c1VpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChydWxlQWxsb3dzVWlkKSB7CisgICAgICAgICAgICBkZXZpY2VzLmFkZChBdWRpb0RldmljZVR5cGVBZGRyKG1peC0+bURldmljZVR5cGUsIG1peC0+bURldmljZUFkZHJlc3Muc3RyaW5nKCkpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZCgiXG5BdWRpbyBQb2xpY3kgTWl4OlxuIik7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpdGVtQXQoaSktPmR1bXAoZHN0LCAyLCBpKTsKKyAgICB9Cit9CisKIH07IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9ydC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1BvcnQuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODU1NjJlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUG9ydC5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0ODMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvcnQiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0jaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgotI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgotI2luY2x1ZGUgIkh3TW9kdWxlLmgiCi0jaW5jbHVkZSAiQXVkaW9HYWluLmgiCi0jaW5jbHVkZSA8cG9saWN5Lmg+Ci0KLSNpZm5kZWYgQVJSQVlfU0laRQotI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKLSNlbmRpZgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLSBBdWRpb1BvcnQgY2xhc3MgaW1wbGVtZW50YXRpb24KLXZvaWQgQXVkaW9Qb3J0OjphdHRhY2goY29uc3Qgc3A8SHdNb2R1bGU+JiBtb2R1bGUpCi17Ci0gICAgbU1vZHVsZSA9IG1vZHVsZTsKLX0KLQotLy8gTm90ZSB0aGF0IGlzIGEgZGlmZmVyZW50IG5hbWVzcGFjZSB0aGFuIEF1ZGlvRmxpbmdlciB1bmlxdWUgSURzCi1hdWRpb19wb3J0X2hhbmRsZV90IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCkKLXsKLSAgICByZXR1cm4gZ2V0TmV4dEhhbmRsZSgpOwotfQotCi1hdWRpb19tb2R1bGVfaGFuZGxlX3QgQXVkaW9Qb3J0OjpnZXRNb2R1bGVIYW5kbGUoKSBjb25zdAotewotICAgIHJldHVybiBtTW9kdWxlICE9IDAgPyBtTW9kdWxlLT5nZXRIYW5kbGUoKSA6IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORTsKLX0KLQotdWludDMyX3QgQXVkaW9Qb3J0OjpnZXRNb2R1bGVWZXJzaW9uTWFqb3IoKSBjb25zdAotewotICAgIHJldHVybiBtTW9kdWxlICE9IDAgPyBtTW9kdWxlLT5nZXRIYWxWZXJzaW9uTWFqb3IoKSA6IDA7Ci19Ci0KLWNvbnN0IGNoYXIgKkF1ZGlvUG9ydDo6Z2V0TW9kdWxlTmFtZSgpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1Nb2R1bGUgIT0gMCA/IG1Nb2R1bGUtPmdldE5hbWUoKSA6ICJpbnZhbGlkIG1vZHVsZSI7Ci19Ci0KLXZvaWQgQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKLXsKLSAgICAvLyBUT0RPOiB1cGRhdGUgdGhpcyBmdW5jdGlvbiBvbmNlIGF1ZGlvX3BvcnQgc3RydWN0dXJlIHJlZmxlY3RzIHRoZSBuZXcgcHJvZmlsZSBkZWZpbml0aW9uLgotICAgIC8vIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbjogZmxhdGVuaW5nIHRoZSBBdWRpb1Byb2ZpbGUgaW50byBhdWRpb19wb3J0IHN0cnVjdHVyZS4KLSAgICBTb3J0ZWRWZWN0b3I8YXVkaW9fZm9ybWF0X3Q+IGZsYXRlbmVkRm9ybWF0czsKLSAgICBTYW1wbGVSYXRlVmVjdG9yIGZsYXRlbmVkUmF0ZXM7Ci0gICAgQ2hhbm5lbHNWZWN0b3IgZmxhdGVuZWRDaGFubmVsczsKLSAgICBmb3IgKGNvbnN0IGF1dG8mIHByb2ZpbGUgOiBtUHJvZmlsZXMpIHsKLSAgICAgICAgaWYgKHByb2ZpbGUtPmlzVmFsaWQoKSkgewotICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0VG9FeHBvcnQgPSBwcm9maWxlLT5nZXRGb3JtYXQoKTsKLSAgICAgICAgICAgIGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnJhdGVzVG9FeHBvcnQgPSBwcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpOwotICAgICAgICAgICAgY29uc3QgQ2hhbm5lbHNWZWN0b3IgJmNoYW5uZWxzVG9FeHBvcnQgPSBwcm9maWxlLT5nZXRDaGFubmVscygpOwotCi0gICAgICAgICAgICBpZiAoZmxhdGVuZWRGb3JtYXRzLmluZGV4T2YoZm9ybWF0VG9FeHBvcnQpIDwgMCkgewotICAgICAgICAgICAgICAgIGZsYXRlbmVkRm9ybWF0cy5hZGQoZm9ybWF0VG9FeHBvcnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChzaXplX3QgcmF0ZUluZGV4ID0gMDsgcmF0ZUluZGV4IDwgcmF0ZXNUb0V4cG9ydC5zaXplKCk7IHJhdGVJbmRleCsrKSB7Ci0gICAgICAgICAgICAgICAgdWludDMyX3QgcmF0ZSA9IHJhdGVzVG9FeHBvcnRbcmF0ZUluZGV4XTsKLSAgICAgICAgICAgICAgICBpZiAoZmxhdGVuZWRSYXRlcy5pbmRleE9mKHJhdGUpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBmbGF0ZW5lZFJhdGVzLmFkZChyYXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBjaGFuSW5kZXggPSAwOyBjaGFuSW5kZXggPCBjaGFubmVsc1RvRXhwb3J0LnNpemUoKTsgY2hhbkluZGV4KyspIHsKLSAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVscyA9IGNoYW5uZWxzVG9FeHBvcnRbY2hhbkluZGV4XTsKLSAgICAgICAgICAgICAgICBpZiAoZmxhdGVuZWRDaGFubmVscy5pbmRleE9mKGNoYW5uZWxzKSA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgZmxhdGVuZWRDaGFubmVscy5hZGQoY2hhbm5lbHMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmbGF0ZW5lZFJhdGVzLnNpemUoKSA+IEFVRElPX1BPUlRfTUFYX1NBTVBMSU5HX1JBVEVTIHx8Ci0gICAgICAgICAgICAgICAgICAgIGZsYXRlbmVkQ2hhbm5lbHMuc2l6ZSgpID4gQVVESU9fUE9SVF9NQVhfQ0hBTk5FTF9NQVNLUyB8fAotICAgICAgICAgICAgICAgICAgICBmbGF0ZW5lZEZvcm1hdHMuc2l6ZSgpID4gQVVESU9fUE9SVF9NQVhfRk9STUFUUykgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogYmFpbGluZyBvdXQ6IGNhbm5vdCBleHBvcnQgcHJvZmlsZXMgdG8gcG9ydCBjb25maWciLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBwb3J0LT5yb2xlID0gbVJvbGU7Ci0gICAgcG9ydC0+dHlwZSA9IG1UeXBlOwotICAgIHN0cmxjcHkocG9ydC0+bmFtZSwgbU5hbWUsIEFVRElPX1BPUlRfTUFYX05BTUVfTEVOKTsKLSAgICBwb3J0LT5udW1fc2FtcGxlX3JhdGVzID0gZmxhdGVuZWRSYXRlcy5zaXplKCk7Ci0gICAgcG9ydC0+bnVtX2NoYW5uZWxfbWFza3MgPSBmbGF0ZW5lZENoYW5uZWxzLnNpemUoKTsKLSAgICBwb3J0LT5udW1fZm9ybWF0cyA9IGZsYXRlbmVkRm9ybWF0cy5zaXplKCk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmbGF0ZW5lZFJhdGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHBvcnQtPnNhbXBsZV9yYXRlc1tpXSA9IGZsYXRlbmVkUmF0ZXNbaV07Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZmxhdGVuZWRDaGFubmVscy5zaXplKCk7IGkrKykgewotICAgICAgICBwb3J0LT5jaGFubmVsX21hc2tzW2ldID0gZmxhdGVuZWRDaGFubmVsc1tpXTsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmbGF0ZW5lZEZvcm1hdHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgcG9ydC0+Zm9ybWF0c1tpXSA9IGZsYXRlbmVkRm9ybWF0c1tpXTsKLSAgICB9Ci0KLSAgICBBTE9HVigiQXVkaW9Qb3J0Ojp0b0F1ZGlvUG9ydCgpIG51bSBnYWlucyAlenUiLCBtR2FpbnMuc2l6ZSgpKTsKLQotICAgIHVpbnQzMl90IGk7Ci0gICAgZm9yIChpID0gMDsgaSA8IG1HYWlucy5zaXplKCkgJiYgaSA8IEFVRElPX1BPUlRfTUFYX0dBSU5TOyBpKyspIHsKLSAgICAgICAgcG9ydC0+Z2FpbnNbaV0gPSBtR2FpbnNbaV0tPmdldEdhaW4oKTsKLSAgICB9Ci0gICAgcG9ydC0+bnVtX2dhaW5zID0gaTsKLX0KLQotdm9pZCBBdWRpb1BvcnQ6OmltcG9ydEF1ZGlvUG9ydChjb25zdCBzcDxBdWRpb1BvcnQ+JiBwb3J0LCBib29sIGZvcmNlIF9fdW51c2VkKQotewotICAgIGZvciAoY29uc3QgYXV0byYgcHJvZmlsZVRvSW1wb3J0IDogcG9ydC0+bVByb2ZpbGVzKSB7Ci0gICAgICAgIGlmIChwcm9maWxlVG9JbXBvcnQtPmlzVmFsaWQoKSkgewotICAgICAgICAgICAgLy8gSW1wb3J0IG9ubHkgdmFsaWQgcG9ydCwgaS5lLiB2YWxpZCBmb3JtYXQsIG5vbiBlbXB0eSByYXRlcyBhbmQgY2hhbm5lbHMgbWFza3MKLSAgICAgICAgICAgIGJvb2wgaGFzU2FtZVByb2ZpbGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcHJvZmlsZSA6IG1Qcm9maWxlcykgewotICAgICAgICAgICAgICAgIGlmICgqcHJvZmlsZSA9PSAqcHJvZmlsZVRvSW1wb3J0KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIG5ldmVyIGltcG9ydCBhIHByb2ZpbGUgdHdpY2UKLSAgICAgICAgICAgICAgICAgICAgaGFzU2FtZVByb2ZpbGUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaGFzU2FtZVByb2ZpbGUpIHsgLy8gbmV2ZXIgaW1wb3J0IGEgc2FtZSBwcm9maWxlIHR3aWNlCi0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhZGRBdWRpb1Byb2ZpbGUocHJvZmlsZVRvSW1wb3J0KTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotc3RhdHVzX3QgQXVkaW9Qb3J0OjpjaGVja0V4YWN0QXVkaW9Qcm9maWxlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSBjb25zdAotewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIGF1dG8gY29uZmlnX21hc2sgPSBjb25maWctPmNvbmZpZ19tYXNrOwotICAgIGlmIChjb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pIHsKLSAgICAgICAgY29uZmlnX21hc2sgJj0gfkFVRElPX1BPUlRfQ09ORklHX0dBSU47Ci0gICAgICAgIHN0YXR1cyA9IGNoZWNrR2FpbigmY29uZmlnLT5nYWluLCBjb25maWctPmdhaW4uaW5kZXgpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmIChjb25maWdfbWFzayAhPSAwKSB7Ci0gICAgICAgIC8vIFRPRE8gc2hvdWxkIHdlIGNoZWNrIHNhbXBsZV9yYXRlIC8gY2hhbm5lbF9tYXNrIC8gZm9ybWF0IHNlcGFyYXRlbHk/Ci0gICAgICAgIHN0YXR1cyA9IG1Qcm9maWxlcy5jaGVja0V4YWN0UHJvZmlsZShjb25maWctPnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWctPmZvcm1hdCk7Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7Ci19Ci0KLXZvaWQgQXVkaW9Qb3J0OjpwaWNrU2FtcGxpbmdSYXRlKHVpbnQzMl90ICZwaWNrZWRSYXRlLGNvbnN0IFNhbXBsZVJhdGVWZWN0b3IgJnNhbXBsaW5nUmF0ZXMpIGNvbnN0Ci17Ci0gICAgcGlja2VkUmF0ZSA9IDA7Ci0gICAgLy8gRm9yIGRpcmVjdCBvdXRwdXRzLCBwaWNrIG1pbmltdW0gc2FtcGxpbmcgcmF0ZTogdGhpcyBoZWxwcyBlbnN1cmluZyB0aGF0IHRoZQotICAgIC8vIGNoYW5uZWwgY291bnQgLyBzYW1wbGluZyByYXRlIGNvbWJpbmF0aW9uIGNob3NlbiB3aWxsIGJlIHN1cHBvcnRlZCBieSB0aGUgY29ubmVjdGVkCi0gICAgLy8gc2luawotICAgIGlmIChpc0RpcmVjdE91dHB1dCgpKSB7Ci0gICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IFVJTlRfTUFYOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNhbXBsaW5nUmF0ZXMuc2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgICAgICBpZiAoKHNhbXBsaW5nUmF0ZXNbaV0gPCBzYW1wbGluZ1JhdGUpICYmIChzYW1wbGluZ1JhdGVzW2ldID4gMCkpIHsKLSAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBzYW1wbGluZ1JhdGVzW2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHBpY2tlZFJhdGUgPSAoc2FtcGxpbmdSYXRlID09IFVJTlRfTUFYKSA/IDAgOiBzYW1wbGluZ1JhdGU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgdWludDMyX3QgbWF4UmF0ZSA9IFNBTVBMRV9SQVRFX0haX01BWDsKLQotICAgICAgICAvLyBGb3IgbWl4ZWQgb3V0cHV0IGFuZCBpbnB1dHMsIHVzZSBtYXggbWl4ZXIgc2FtcGxpbmcgcmF0ZXMuIERvIG5vdAotICAgICAgICAvLyBsaW1pdCBzYW1wbGluZyByYXRlIG90aGVyd2lzZQotICAgICAgICAvLyBGb3IgaW5wdXRzLCBhbHNvIHNlZSBjaGVja0NvbXBhdGlibGVTYW1wbGluZ1JhdGUoKS4KLSAgICAgICAgaWYgKG1UeXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKLSAgICAgICAgICAgIG1heFJhdGUgPSBVSU5UX01BWDsKLSAgICAgICAgfQotICAgICAgICAvLyBUT0RPOiBzaG91bGQgbVNhbXBsaW5nUmF0ZXNbXSBiZSBvcmRlcmVkIGluIHRlcm1zIG9mIG91ciBwcmVmZXJlbmNlCi0gICAgICAgIC8vIGFuZCB3ZSByZXR1cm4gdGhlIGZpcnN0IChhbmQgaGVuY2UgbW9zdCBwcmVmZXJyZWQpIG1hdGNoPyAgVGhpcyBpcyBvZiBjb25jZXJuIGlmCi0gICAgICAgIC8vIHdlIHdhbnQgdG8gY2hvb3NlIDk2a0h6IG92ZXIgMTkya0h6IGZvciBVU0IgZHJpdmVyIHN0YWJpbGl0eSBvciByZXNvdXJjZSBjb25zdHJhaW50cy4KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzYW1wbGluZ1JhdGVzLnNpemUoKTsgaSArKykgewotICAgICAgICAgICAgaWYgKChzYW1wbGluZ1JhdGVzW2ldID4gcGlja2VkUmF0ZSkgJiYgKHNhbXBsaW5nUmF0ZXNbaV0gPD0gbWF4UmF0ZSkpIHsKLSAgICAgICAgICAgICAgICBwaWNrZWRSYXRlID0gc2FtcGxpbmdSYXRlc1tpXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvcnQ6OnBpY2tDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCAmcGlja2VkQ2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MpIGNvbnN0Ci17Ci0gICAgcGlja2VkQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7Ci0gICAgLy8gRm9yIGRpcmVjdCBvdXRwdXRzLCBwaWNrIG1pbmltdW0gY2hhbm5lbCBjb3VudDogdGhpcyBoZWxwcyBlbnN1cmluZyB0aGF0IHRoZQotICAgIC8vIGNoYW5uZWwgY291bnQgLyBzYW1wbGluZyByYXRlIGNvbWJpbmF0aW9uIGNob3NlbiB3aWxsIGJlIHN1cHBvcnRlZCBieSB0aGUgY29ubmVjdGVkCi0gICAgLy8gc2luawotICAgIGlmIChpc0RpcmVjdE91dHB1dCgpKSB7Ci0gICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IFVJTlRfTUFYOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNoYW5uZWxNYXNrcy5zaXplKCk7IGkgKyspIHsKLSAgICAgICAgICAgIHVpbnQzMl90IGNubENvdW50OwotICAgICAgICAgICAgaWYgKHVzZUlucHV0Q2hhbm5lbE1hc2soKSkgewotICAgICAgICAgICAgICAgIGNubENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX2luX21hc2soY2hhbm5lbE1hc2tzW2ldKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY25sQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2tzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgoY25sQ291bnQgPCBjaGFubmVsQ291bnQpICYmIChjbmxDb3VudCA+IDApKSB7Ci0gICAgICAgICAgICAgICAgcGlja2VkQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFza3NbaV07Ci0gICAgICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gY25sQ291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICB1aW50MzJfdCBjaGFubmVsQ291bnQgPSAwOwotICAgICAgICB1aW50MzJfdCBtYXhDb3VudCA9IE1BWF9NSVhFUl9DSEFOTkVMX0NPVU5UOwotCi0gICAgICAgIC8vIEZvciBtaXhlZCBvdXRwdXQgYW5kIGlucHV0cywgdXNlIG1heCBtaXhlciBjaGFubmVsIGNvdW50LiBEbyBub3QKLSAgICAgICAgLy8gbGltaXQgY2hhbm5lbCBjb3VudCBvdGhlcndpc2UKLSAgICAgICAgaWYgKG1UeXBlICE9IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKLSAgICAgICAgICAgIG1heENvdW50ID0gVUlOVF9NQVg7Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjaGFubmVsTWFza3Muc2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBjbmxDb3VudDsKLSAgICAgICAgICAgIGlmICh1c2VJbnB1dENoYW5uZWxNYXNrKCkpIHsKLSAgICAgICAgICAgICAgICBjbmxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrc1tpXSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNubENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKGNubENvdW50ID4gY2hhbm5lbENvdW50KSAmJiAoY25sQ291bnQgPD0gbWF4Q291bnQpKSB7Ci0gICAgICAgICAgICAgICAgcGlja2VkQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFza3NbaV07Ci0gICAgICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gY25sQ291bnQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19Ci0KLS8qIGZvcm1hdCBpbiBvcmRlciBvZiBpbmNyZWFzaW5nIHByZWZlcmVuY2UgKi8KLWNvbnN0IGF1ZGlvX2Zvcm1hdF90IEF1ZGlvUG9ydDo6c1BjbUZvcm1hdENvbXBhcmVUYWJsZVtdID0gewotICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCwKLSAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCi0gICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQsCi0gICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRCwKLSAgICAgICAgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQsCi0gICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQsCi19OwotCi1pbnQgQXVkaW9Qb3J0Ojpjb21wYXJlRm9ybWF0cyhhdWRpb19mb3JtYXRfdCBmb3JtYXQxLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQyKQotewotICAgIC8vIE5PVEU6IEFVRElPX0ZPUk1BVF9JTlZBTElEIGlzIGFsc28gY29uc2lkZXJlZCBub3QgUENNIGFuZCB3aWxsIGJlIGNvbXBhcmVkIGVxdWFsIHRvIGFueQotICAgIC8vIGNvbXByZXNzZWQgZm9ybWF0IGFuZCBiZXR0ZXIgdGhhbiBhbnkgUENNIGZvcm1hdC4gVGhpcyBpcyBieSBkZXNpZ24gb2YgcGlja0Zvcm1hdCgpCi0gICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdDEpKSB7Ci0gICAgICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQyKSkgewotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQyKSkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotCi0gICAgaW50IGluZGV4MSA9IC0xLCBpbmRleDIgPSAtMTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsKLSAgICAgICAgICAgIChpIDwgQVJSQVlfU0laRShzUGNtRm9ybWF0Q29tcGFyZVRhYmxlKSkgJiYgKChpbmRleDEgPT0gLTEpIHx8IChpbmRleDIgPT0gLTEpKTsKLSAgICAgICAgICAgIGkgKyspIHsKLSAgICAgICAgaWYgKHNQY21Gb3JtYXRDb21wYXJlVGFibGVbaV0gPT0gZm9ybWF0MSkgewotICAgICAgICAgICAgaW5kZXgxID0gaTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc1BjbUZvcm1hdENvbXBhcmVUYWJsZVtpXSA9PSBmb3JtYXQyKSB7Ci0gICAgICAgICAgICBpbmRleDIgPSBpOwotICAgICAgICB9Ci0gICAgfQotICAgIC8vIGZvcm1hdDEgbm90IGZvdW5kID0+IGluZGV4MSA8IDAgPT4gZm9ybWF0MiA+IGZvcm1hdDEKLSAgICAvLyBmb3JtYXQyIG5vdCBmb3VuZCA9PiBpbmRleDIgPCAwID0+IGZvcm1hdDIgPCBmb3JtYXQxCi0gICAgcmV0dXJuIGluZGV4MSAtIGluZGV4MjsKLX0KLQotYm9vbCBBdWRpb1BvcnQ6OmlzQmV0dGVyRm9ybWF0TWF0Y2goYXVkaW9fZm9ybWF0X3QgbmV3Rm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgY3VycmVudEZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IHRhcmdldEZvcm1hdCkKLXsKLSAgICBpZiAobmV3Rm9ybWF0ID09IGN1cnJlbnRGb3JtYXQpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoY3VycmVudEZvcm1hdCA9PSBBVURJT19GT1JNQVRfSU5WQUxJRCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKG5ld0Zvcm1hdCA9PSB0YXJnZXRGb3JtYXQpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGludCBjdXJyZW50RGlmZkJ5dGVzID0gKGludClhdWRpb19ieXRlc19wZXJfc2FtcGxlKHRhcmdldEZvcm1hdCkgLQotICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShjdXJyZW50Rm9ybWF0KTsKLSAgICBpbnQgbmV3RGlmZkJ5dGVzID0gKGludClhdWRpb19ieXRlc19wZXJfc2FtcGxlKHRhcmdldEZvcm1hdCkgLQotICAgICAgICAgICAgYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShuZXdGb3JtYXQpOwotCi0gICAgaWYgKGFicyhuZXdEaWZmQnl0ZXMpIDwgYWJzKGN1cnJlbnREaWZmQnl0ZXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSBpZiAoYWJzKG5ld0RpZmZCeXRlcykgPT0gYWJzKGN1cnJlbnREaWZmQnl0ZXMpKSB7Ci0gICAgICAgIHJldHVybiAobmV3RGlmZkJ5dGVzID49IDApOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQXVkaW9Qb3J0OjpwaWNrQXVkaW9Qcm9maWxlKHVpbnQzMl90ICZzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCAmY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAmZm9ybWF0KSBjb25zdAotewotICAgIGZvcm1hdCA9IEFVRElPX0ZPUk1BVF9ERUZBVUxUOwotICAgIHNhbXBsaW5nUmF0ZSA9IDA7Ci0gICAgY2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7Ci0KLSAgICAvLyBzcGVjaWFsIGNhc2UgZm9yIHVuaW5pdGlhbGl6ZWQgZHluYW1pYyBwcm9maWxlCi0gICAgaWYgKCFtUHJvZmlsZXMuaGFzVmFsaWRQcm9maWxlKCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBhdWRpb19mb3JtYXRfdCBiZXN0Rm9ybWF0ID0gc1BjbUZvcm1hdENvbXBhcmVUYWJsZVtBUlJBWV9TSVpFKHNQY21Gb3JtYXRDb21wYXJlVGFibGUpIC0gMV07Ci0gICAgLy8gRm9yIG1peGVkIG91dHB1dCBhbmQgaW5wdXRzLCB1c2UgYmVzdCBtaXhlciBvdXRwdXQgZm9ybWF0LgotICAgIC8vIERvIG5vdCBsaW1pdCBmb3JtYXQgb3RoZXJ3aXNlCi0gICAgaWYgKChtVHlwZSAhPSBBVURJT19QT1JUX1RZUEVfTUlYKSB8fCBpc0RpcmVjdE91dHB1dCgpKSB7Ci0gICAgICAgIGJlc3RGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICB9Ci0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Qcm9maWxlcy5zaXplKCk7IGkgKyspIHsKLSAgICAgICAgaWYgKCFtUHJvZmlsZXNbaV0tPmlzVmFsaWQoKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0VG9Db21wYXJlID0gbVByb2ZpbGVzW2ldLT5nZXRGb3JtYXQoKTsKLSAgICAgICAgaWYgKChjb21wYXJlRm9ybWF0cyhmb3JtYXRUb0NvbXBhcmUsIGZvcm1hdCkgPiAwKSAmJgotICAgICAgICAgICAgICAgIChjb21wYXJlRm9ybWF0cyhmb3JtYXRUb0NvbXBhcmUsIGJlc3RGb3JtYXQpIDw9IDApKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBwaWNrZWRTYW1wbGluZ1JhdGUgPSAwOwotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgcGlja2VkQ2hhbm5lbE1hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7Ci0gICAgICAgICAgICBwaWNrQ2hhbm5lbE1hc2socGlja2VkQ2hhbm5lbE1hc2ssIG1Qcm9maWxlc1tpXS0+Z2V0Q2hhbm5lbHMoKSk7Ci0gICAgICAgICAgICBwaWNrU2FtcGxpbmdSYXRlKHBpY2tlZFNhbXBsaW5nUmF0ZSwgbVByb2ZpbGVzW2ldLT5nZXRTYW1wbGVSYXRlcygpKTsKLQotICAgICAgICAgICAgaWYgKGZvcm1hdFRvQ29tcGFyZSAhPSBBVURJT19GT1JNQVRfREVGQVVMVCAmJiBwaWNrZWRDaGFubmVsTWFzayAhPSBBVURJT19DSEFOTkVMX05PTkUKLSAgICAgICAgICAgICAgICAgICAgJiYgcGlja2VkU2FtcGxpbmdSYXRlICE9IDApIHsKLSAgICAgICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXRUb0NvbXBhcmU7Ci0gICAgICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBwaWNrZWRDaGFubmVsTWFzazsKLSAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBwaWNrZWRTYW1wbGluZ1JhdGU7Ci0gICAgICAgICAgICAgICAgLy8gVE9ETzogc2hhbGwgd2UgcmV0dXJuIG9uIHRoZSBmaXJzdCBvbmUgb3Igc3RpbGwgdHJ5aW5nIHRvIHBpY2sgYSBiZXR0ZXIgUHJvZmlsZT8KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICBBTE9HVigiJXMgUG9ydFtubTolc10gcHJvZmlsZSByYXRlPSVkLCBmb3JtYXQ9JWQsIGNoYW5uZWxzPSVkIiwgX19GVU5DVElPTl9fLCBtTmFtZS5zdHJpbmcoKSwKLSAgICAgICAgICBzYW1wbGluZ1JhdGUsIGNoYW5uZWxNYXNrLCBmb3JtYXQpOwotfQotCi1zdGF0dXNfdCBBdWRpb1BvcnQ6OmNoZWNrR2Fpbihjb25zdCBzdHJ1Y3QgYXVkaW9fZ2Fpbl9jb25maWcgKmdhaW5Db25maWcsIGludCBpbmRleCkgY29uc3QKLXsKLSAgICBpZiAoaW5kZXggPCAwIHx8IChzaXplX3QpaW5kZXggPj0gbUdhaW5zLnNpemUoKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICByZXR1cm4gbUdhaW5zW2luZGV4XS0+Y2hlY2tDb25maWcoZ2FpbkNvbmZpZyk7Ci19Ci0KLXZvaWQgQXVkaW9Qb3J0OjpkdW1wKGludCBmZCwgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgaWYgKCFtTmFtZS5pc0VtcHR5KCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuc3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIH0KLSAgICBpZiAodmVyYm9zZSkgewotICAgICAgICBtUHJvZmlsZXMuZHVtcChmZCwgc3BhY2VzKTsKLQotICAgICAgICBpZiAobUdhaW5zLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGdhaW5zOlxuIiwgc3BhY2VzLCAiIik7Ci0gICAgICAgICAgICByZXN1bHQgPSBidWZmZXI7Ci0gICAgICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUdhaW5zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbUdhaW5zW2ldLT5kdW1wKGZkLCBzcGFjZXMgKyAyLCBpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvcnQ6OmxvZyhjb25zdCBjaGFyKiBpbmRlbnQpIGNvbnN0Ci17Ci0gICAgQUxPR0koIiVzIFBvcnRbbm06JXMsIHR5cGU6JWQsIHJvbGU6JWRdIiwgaW5kZW50LCBtTmFtZS5zdHJpbmcoKSwgbVR5cGUsIG1Sb2xlKTsKLX0KLQotLy8gLS0tIEF1ZGlvUG9ydENvbmZpZyBjbGFzcyBpbXBsZW1lbnRhdGlvbgotCi1BdWRpb1BvcnRDb25maWc6OkF1ZGlvUG9ydENvbmZpZygpCi17Ci0gICAgbVNhbXBsaW5nUmF0ZSA9IDA7Ci0gICAgbUNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOwotICAgIG1Gb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICBtZW1zZXQoJm1HYWluLCAwLCBzaXplb2Yoc3RydWN0IGF1ZGlvX2dhaW5fY29uZmlnKSk7Ci0gICAgbUdhaW4uaW5kZXggPSAtMTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb3J0Q29uZmlnOjphcHBseUF1ZGlvUG9ydENvbmZpZyhjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpiYWNrdXBDb25maWcpCi17Ci0gICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGxvY2FsQmFja3VwQ29uZmlnOwotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotCi0gICAgbG9jYWxCYWNrdXBDb25maWcuY29uZmlnX21hc2sgPSBjb25maWctPmNvbmZpZ19tYXNrOwotICAgIHRvQXVkaW9Qb3J0Q29uZmlnKCZsb2NhbEJhY2t1cENvbmZpZyk7Ci0KLSAgICBzcDxBdWRpb1BvcnQ+IGF1ZGlvcG9ydCA9IGdldEF1ZGlvUG9ydCgpOwotICAgIGlmIChhdWRpb3BvcnQgPT0gMCkgewotICAgICAgICBzdGF0dXMgPSBOT19JTklUOwotICAgICAgICBnb3RvIGV4aXQ7Ci0gICAgfQotICAgIHN0YXR1cyA9IGF1ZGlvcG9ydC0+Y2hlY2tFeGFjdEF1ZGlvUHJvZmlsZShjb25maWcpOwotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgZ290byBleGl0OwotICAgIH0KLSAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFKSB7Ci0gICAgICAgIG1TYW1wbGluZ1JhdGUgPSBjb25maWctPnNhbXBsZV9yYXRlOwotICAgIH0KLSAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgewotICAgICAgICBtQ2hhbm5lbE1hc2sgPSBjb25maWctPmNoYW5uZWxfbWFzazsKLSAgICB9Ci0gICAgaWYgKGNvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpIHsKLSAgICAgICAgbUZvcm1hdCA9IGNvbmZpZy0+Zm9ybWF0OwotICAgIH0KLSAgICBpZiAoY29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pIHsKLSAgICAgICAgbUdhaW4gPSBjb25maWctPmdhaW47Ci0gICAgfQotCi1leGl0OgotICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgYXBwbHlBdWRpb1BvcnRDb25maWcoJmxvY2FsQmFja3VwQ29uZmlnKTsKLSAgICB9Ci0gICAgaWYgKGJhY2t1cENvbmZpZyAhPSBOVUxMKSB7Ci0gICAgICAgICpiYWNrdXBDb25maWcgPSBsb2NhbEJhY2t1cENvbmZpZzsKLSAgICB9Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotdm9pZCBBdWRpb1BvcnRDb25maWc6OnRvQXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAotewotICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpIHsKLSAgICAgICAgZHN0Q29uZmlnLT5zYW1wbGVfcmF0ZSA9IG1TYW1wbGluZ1JhdGU7Ci0gICAgICAgIGlmICgoc3JjQ29uZmlnICE9IE5VTEwpICYmIChzcmNDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEUpKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPnNhbXBsZV9yYXRlID0gc3JjQ29uZmlnLT5zYW1wbGVfcmF0ZTsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRzdENvbmZpZy0+c2FtcGxlX3JhdGUgPSAwOwotICAgIH0KLSAgICBpZiAoZHN0Q29uZmlnLT5jb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSykgewotICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IG1DaGFubmVsTWFzazsKLSAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19DSEFOTkVMX01BU0spKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPmNoYW5uZWxfbWFzayA9IHNyY0NvbmZpZy0+Y2hhbm5lbF9tYXNrOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0Q29uZmlnLT5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX05PTkU7Ci0gICAgfQotICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRk9STUFUKSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Zm9ybWF0ID0gbUZvcm1hdDsKLSAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GT1JNQVQpKSB7Ci0gICAgICAgICAgICBkc3RDb25maWctPmZvcm1hdCA9IHNyY0NvbmZpZy0+Zm9ybWF0OwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZHN0Q29uZmlnLT5mb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKLSAgICB9Ci0gICAgc3A8QXVkaW9Qb3J0PiBhdWRpb3BvcnQgPSBnZXRBdWRpb1BvcnQoKTsKLSAgICBpZiAoKGRzdENvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKSAmJiBhdWRpb3BvcnQgIT0gTlVMTCkgewotICAgICAgICBkc3RDb25maWctPmdhaW4gPSBtR2FpbjsKLSAgICAgICAgaWYgKChzcmNDb25maWcgIT0gTlVMTCkgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19HQUlOKQotICAgICAgICAgICAgICAgICYmIGF1ZGlvcG9ydC0+Y2hlY2tHYWluKCZzcmNDb25maWctPmdhaW4sIHNyY0NvbmZpZy0+Z2Fpbi5pbmRleCkgPT0gT0spIHsKLSAgICAgICAgICAgIGRzdENvbmZpZy0+Z2FpbiA9IHNyY0NvbmZpZy0+Z2FpbjsKLSAgICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Z2Fpbi5pbmRleCA9IC0xOwotICAgIH0KLSAgICBpZiAoZHN0Q29uZmlnLT5nYWluLmluZGV4ICE9IC0xKSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfR0FJTjsKLSAgICB9IGVsc2UgewotICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrICY9IH5BVURJT19QT1JUX0NPTkZJR19HQUlOOwotICAgIH0KLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qcm9maWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUHJvZmlsZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkNmZjMWMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qcm9maWxlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDI5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUHJvZmlsZSIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgIkF1ZGlvUHJvZmlsZS5oIgotI2luY2x1ZGUgIkF1ZGlvUG9ydC5oIgotI2luY2x1ZGUgIkh3TW9kdWxlLmgiCi0jaW5jbHVkZSAiQXVkaW9HYWluLmgiCi0jaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+Ci0jaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUmVzYW1wbGVyUHVibGljLmg+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLXN0YXR1c190IEF1ZGlvUHJvZmlsZTo6Y2hlY2tFeGFjdCh1aW50MzJfdCBzYW1wbGluZ1JhdGUsIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKLXsKLSAgICBpZiAoYXVkaW9fZm9ybWF0c19tYXRjaChmb3JtYXQsIG1Gb3JtYXQpICYmCi0gICAgICAgICAgICBzdXBwb3J0c0NoYW5uZWxzKGNoYW5uZWxNYXNrKSAmJgotICAgICAgICAgICAgc3VwcG9ydHNSYXRlKHNhbXBsaW5nUmF0ZSkpIHsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICByZXR1cm4gQkFEX1ZBTFVFOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWJvb2wgb3BlcmF0b3IgPT0gKGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmbGVmdCwgY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZyaWdodCkKLXsKLSAgICBpZiAobGVmdC5zaXplKCkgIT0gcmlnaHQuc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZm9yKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgcmlnaHQuc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgIGlmIChsZWZ0W2luZGV4XSAhPSByaWdodFtpbmRleF0pIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBvcGVyYXRvciA9PSAoY29uc3QgQXVkaW9Qcm9maWxlICZsZWZ0LCBjb25zdCBBdWRpb1Byb2ZpbGUgJmNvbXBhcmVUbykKLXsKLSAgICByZXR1cm4gKGxlZnQuZ2V0Rm9ybWF0KCkgPT0gY29tcGFyZVRvLmdldEZvcm1hdCgpKSAmJgotICAgICAgICAgICAgKGxlZnQuZ2V0Q2hhbm5lbHMoKSA9PSBjb21wYXJlVG8uZ2V0Q2hhbm5lbHMoKSkgJiYKLSAgICAgICAgICAgIChsZWZ0LmdldFNhbXBsZVJhdGVzKCkgPT0gY29tcGFyZVRvLmdldFNhbXBsZVJhdGVzKCkpOwotfQotCi1zdGF0dXNfdCBBdWRpb1Byb2ZpbGU6OmNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZSh1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmdXBkYXRlZFNhbXBsaW5nUmF0ZSkgY29uc3QKLXsKLSAgICBBTE9HX0FTU0VSVChzYW1wbGluZ1JhdGUgPiAwKTsKLQotICAgIGlmIChtU2FtcGxpbmdSYXRlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgdXBkYXRlZFNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLQotICAgIC8vIFNlYXJjaCBmb3IgdGhlIGNsb3Nlc3Qgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGUgdGhhdCBpcyBhYm92ZSAocHJlZmVycmVkKQotICAgIC8vIG9yIGJlbG93IChhY2NlcHRhYmxlKSB0aGUgZGVzaXJlZCBzYW1wbGluZyByYXRlLCB3aXRoaW4gYSBwZXJtaXR0ZWQgcmF0aW8uCi0gICAgLy8gVGhlIHNhbXBsaW5nIHJhdGVzIGFyZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLgotICAgIHNpemVfdCBvcmRlck9mRGVzaXJlZFJhdGUgPSBtU2FtcGxpbmdSYXRlcy5vcmRlck9mKHNhbXBsaW5nUmF0ZSk7Ci0KLSAgICAvLyBQcmVmZXIgdG8gZG93bi1zYW1wbGUgZnJvbSBhIGhpZ2hlciBzYW1wbGluZyByYXRlLCBhcyB3ZSBnZXQgdGhlIGRlc2lyZWQgZnJlcXVlbmN5IHNwZWN0cnVtLgotICAgIGlmIChvcmRlck9mRGVzaXJlZFJhdGUgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCkpIHsKLSAgICAgICAgdWludDMyX3QgY2FuZGlkYXRlID0gbVNhbXBsaW5nUmF0ZXNbb3JkZXJPZkRlc2lyZWRSYXRlXTsKLSAgICAgICAgaWYgKGNhbmRpZGF0ZSAvIEFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWCA8PSBzYW1wbGluZ1JhdGUpIHsKLSAgICAgICAgICAgIHVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gQnV0IGlmIHdlIGhhdmUgdG8gdXAtc2FtcGxlIGZyb20gYSBsb3dlciBzYW1wbGluZyByYXRlLCB0aGF0J3MgT0suCi0gICAgaWYgKG9yZGVyT2ZEZXNpcmVkUmF0ZSAhPSAwKSB7Ci0gICAgICAgIHVpbnQzMl90IGNhbmRpZGF0ZSA9IG1TYW1wbGluZ1JhdGVzW29yZGVyT2ZEZXNpcmVkUmF0ZSAtIDFdOwotICAgICAgICBpZiAoY2FuZGlkYXRlICogQVVESU9fUkVTQU1QTEVSX1VQX1JBVElPX01BWCA+PSBzYW1wbGluZ1JhdGUpIHsKLSAgICAgICAgICAgIHVwZGF0ZWRTYW1wbGluZ1JhdGUgPSBjYW5kaWRhdGU7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgLy8gbGVhdmUgdXBkYXRlZFNhbXBsaW5nUmF0ZSB1bm1vZGlmaWVkCi0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qcm9maWxlOjpjaGVja0NvbXBhdGlibGVDaGFubmVsTWFzayhhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgJnVwZGF0ZWRDaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgcG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlKSBjb25zdAotewotICAgIGlmIChtQ2hhbm5lbE1hc2tzLmlzRW1wdHkoKSkgewotICAgICAgICB1cGRhdGVkQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICBjb25zdCBib29sIGlzUmVjb3JkVGhyZWFkID0gcG9ydFR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCAmJiBwb3J0Um9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSzsKLSAgICBjb25zdCBib29sIGlzSW5kZXggPSBhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKGNoYW5uZWxNYXNrKQotICAgICAgICAgICAgPT0gQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9JTkRFWDsKLSAgICBpbnQgYmVzdE1hdGNoID0gMDsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DaGFubmVsTWFza3Muc2l6ZSgpOyBpICsrKSB7Ci0gICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHN1cHBvcnRlZCA9IG1DaGFubmVsTWFza3NbaV07Ci0gICAgICAgIGlmIChzdXBwb3J0ZWQgPT0gY2hhbm5lbE1hc2spIHsKLSAgICAgICAgICAgIC8vIEV4YWN0IG1hdGNoZXMgYWx3YXlzIHRha2VuLgotICAgICAgICAgICAgdXBkYXRlZENoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBVURJT19DSEFOTkVMX05PTkUgKHZhbHVlOiAwKSBpcyB1c2VkIGZvciBkeW5hbWljIGNoYW5uZWwgc3VwcG9ydAotICAgICAgICBpZiAoaXNSZWNvcmRUaHJlYWQgJiYgc3VwcG9ydGVkICE9IEFVRElPX0NIQU5ORUxfTk9ORSkgewotICAgICAgICAgICAgLy8gQXBwcm94aW1hdGUgKGJlc3QpIG1hdGNoOgotICAgICAgICAgICAgLy8gVGhlIG1hdGNoIHNjb3JlIG1lYXN1cmVzIGhvdyB3ZWxsIHRoZSBzdXBwb3J0ZWQgY2hhbm5lbCBtYXNrIG1hdGNoZXMgdGhlCi0gICAgICAgICAgICAvLyBkZXNpcmVkIG1hc2ssIHdoZXJlIGluY3JlYXNpbmctaXMtYmV0dGVyLgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIFRPRE86IFNvbWUgdHdlYWtzIG1heSBiZSBuZWVkZWQuCi0gICAgICAgICAgICAvLyBTaG91bGQgYmUgYSBzdGF0aWMgZnVuY3Rpb24gb2YgdGhlIGRhdGEgcHJvY2Vzc2luZyBsaWJyYXJ5LgotICAgICAgICAgICAgLy8KLSAgICAgICAgICAgIC8vIEluIHByaW9yaXR5OgotICAgICAgICAgICAgLy8gbWF0Y2ggc2NvcmUgPSAxMDAwIGlmIGxlZ2FjeSBjaGFubmVsIGNvbnZlcnNpb24gZXF1aXZhbGVudCAoYWx3YXlzIHByZWZlciB0aGlzKQotICAgICAgICAgICAgLy8gT1IKLSAgICAgICAgICAgIC8vIG1hdGNoIHNjb3JlICs9IDEwMCBpZiB0aGUgY2hhbm5lbCBtYXNrIHJlcHJlc2VudGF0aW9ucyBtYXRjaAotICAgICAgICAgICAgLy8gbWF0Y2ggc2NvcmUgKz0gbnVtYmVyIG9mIGNoYW5uZWxzIG1hdGNoZWQuCi0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gSWYgdGhlcmUgYXJlIG5vIG1hdGNoZWQgY2hhbm5lbHMsIHRoZSBtYXNrIG1heSBzdGlsbCBiZSBhY2NlcHRlZAotICAgICAgICAgICAgLy8gYnV0IHRoZSBwbGF5YmFjayBvciByZWNvcmQgd2lsbCBiZSBzaWxlbnQuCi0gICAgICAgICAgICBjb25zdCBib29sIGlzU3VwcG9ydGVkSW5kZXggPSAoYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9yZXByZXNlbnRhdGlvbihzdXBwb3J0ZWQpCi0gICAgICAgICAgICAgICAgICAgID09IEFVRElPX0NIQU5ORUxfUkVQUkVTRU5UQVRJT05fSU5ERVgpOwotICAgICAgICAgICAgaW50IG1hdGNoOwotICAgICAgICAgICAgaWYgKGlzSW5kZXggJiYgaXNTdXBwb3J0ZWRJbmRleCkgewotICAgICAgICAgICAgICAgIC8vIGluZGV4IGVxdWl2YWxlbmNlCi0gICAgICAgICAgICAgICAgbWF0Y2ggPSAxMDAgKyBfX2J1aWx0aW5fcG9wY291bnQoCi0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoY2hhbm5lbE1hc2spCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiBhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoc3VwcG9ydGVkKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGlzSW5kZXggJiYgIWlzU3VwcG9ydGVkSW5kZXgpIHsKLSAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBlcXVpdmFsZW50Qml0cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAoMSA8PCBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhzdXBwb3J0ZWQpKSAtIDEgOwotICAgICAgICAgICAgICAgIG1hdGNoID0gX19idWlsdGluX3BvcGNvdW50KAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSAmIGVxdWl2YWxlbnRCaXRzKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoIWlzSW5kZXggJiYgaXNTdXBwb3J0ZWRJbmRleCkgewotICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGVxdWl2YWxlbnRCaXRzID0KLSAgICAgICAgICAgICAgICAgICAgICAgICgxIDw8IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKSkgLSAxOwotICAgICAgICAgICAgICAgIG1hdGNoID0gX19idWlsdGluX3BvcGNvdW50KAotICAgICAgICAgICAgICAgICAgICAgICAgZXF1aXZhbGVudEJpdHMgJiBhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoc3VwcG9ydGVkKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uYWwgZXF1aXZhbGVuY2UKLSAgICAgICAgICAgICAgICBtYXRjaCA9IDEwMCArIF9fYnVpbHRpbl9wb3Bjb3VudCgKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhzdXBwb3J0ZWQpKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1cHBvcnRlZCkgewotICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLOgotICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU86Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOX01PTk8pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gMTAwMDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfSU5fTU9OTzoKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IDEwMDA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG1hdGNoID4gYmVzdE1hdGNoKSB7Ci0gICAgICAgICAgICAgICAgYmVzdE1hdGNoID0gbWF0Y2g7Ci0gICAgICAgICAgICAgICAgdXBkYXRlZENoYW5uZWxNYXNrID0gc3VwcG9ydGVkOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBiZXN0TWF0Y2ggPiAwID8gTk9fRVJST1IgOiBCQURfVkFMVUU7Ci19Ci0KLXZvaWQgQXVkaW9Qcm9maWxlOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiVzJXMlc1xuIiwgbUlzRHluYW1pY0Zvcm1hdCA/ICJbZHluYW1pYyBmb3JtYXRdIiA6ICIiLAotICAgICAgICAgICAgIG1Jc0R5bmFtaWNDaGFubmVscyA/ICJbZHluYW1pYyBjaGFubmVsc10iIDogIiIsCi0gICAgICAgICAgICAgbUlzRHluYW1pY1JhdGUgPyAiW2R5bmFtaWMgcmF0ZXNdIiA6ICIiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgaWYgKG1OYW1lLmxlbmd0aCgpICE9IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBuYW1lOiAlc1xuIiwgc3BhY2VzLCAiIiwgbU5hbWUuc3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotICAgIHN0ZDo6c3RyaW5nIGZvcm1hdExpdGVyYWw7Ci0gICAgaWYgKEZvcm1hdENvbnZlcnRlcjo6dG9TdHJpbmcobUZvcm1hdCwgZm9ybWF0TGl0ZXJhbCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBmb3JtYXQ6ICVzXG4iLCBzcGFjZXMsICIiLCBmb3JtYXRMaXRlcmFsLmNfc3RyKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotICAgIGlmICghbVNhbXBsaW5nUmF0ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc2FtcGxpbmcgcmF0ZXM6Iiwgc3BhY2VzLCAiIik7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtU2FtcGxpbmdSYXRlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJWQiLCBtU2FtcGxpbmdSYXRlc1tpXSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1TYW1wbGluZ1JhdGVzLnNpemUoKSAtIDEpID8gIiIgOiAiLCAiKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuYXBwZW5kKCJcbiIpOwotICAgIH0KLQotICAgIGlmICghbUNoYW5uZWxNYXNrcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBjaGFubmVsIG1hc2tzOiIsIHNwYWNlcywgIiIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUNoYW5uZWxNYXNrcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiMHglMDR4IiwgbUNoYW5uZWxNYXNrc1tpXSk7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1DaGFubmVsTWFza3Muc2l6ZSgpIC0gMSkgPyAiIiA6ICIsICIpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgfQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotfQotCi1zdGF0dXNfdCBBdWRpb1Byb2ZpbGVWZWN0b3I6OmNoZWNrRXhhY3RQcm9maWxlKHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkgY29uc3QKLXsKLSAgICBpZiAoaXNFbXB0eSgpKSB7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICBmb3IgKGNvbnN0IGF1dG8mIHByb2ZpbGUgOiAqdGhpcykgewotICAgICAgICBpZiAocHJvZmlsZS0+Y2hlY2tFeGFjdChzYW1wbGluZ1JhdGUsIGNoYW5uZWxNYXNrLCBmb3JtYXQpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIEJBRF9WQUxVRTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qcm9maWxlVmVjdG9yOjpjaGVja0NvbXBhdGlibGVQcm9maWxlKHVpbnQzMl90ICZzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgJmNoYW5uZWxNYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90ICZmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgcG9ydFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3QgcG9ydFJvbGUpIGNvbnN0Ci17Ci0gICAgaWYgKGlzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgY29uc3QgYm9vbCBjaGVja0luZXhhY3QgPSAvLyB3aGVuIHBvcnQgaXMgaW5wdXQgYW5kIGZvcm1hdCBpcyBsaW5lYXIgcGNtCi0gICAgICAgICAgICBwb3J0VHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYICYmIHBvcnRSb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LCi0gICAgICAgICAgICAmJiBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCk7Ci0KLSAgICAvLyBpdGVyYXRlIGZyb20gYmVzdCBmb3JtYXQgdG8gd29yc3QgZm9ybWF0IChyZXZlcnNlIG9yZGVyKQotICAgIGZvciAoc3NpemVfdCBpID0gc2l6ZSgpIC0gMTsgaSA+PSAwIDsgLS1pKSB7Ci0gICAgICAgIGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IGl0ZW1BdChpKTsKLSAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0VG9Db21wYXJlID0gcHJvZmlsZS0+Z2V0Rm9ybWF0KCk7Ci0gICAgICAgIGlmIChmb3JtYXRUb0NvbXBhcmUgPT0gZm9ybWF0IHx8Ci0gICAgICAgICAgICAgICAgKGNoZWNrSW5leGFjdAotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZm9ybWF0VG9Db21wYXJlICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdFRvQ29tcGFyZSkpKSB7Ci0gICAgICAgICAgICAvLyBDb21wYXRpYmxlIHByb2ZpbGUgaGFzIGJlZW4gZm91bmQsIGNoZWNrcyBpZiB0aGlzIHByb2ZpbGUgaGFzIGNvbXBhdGlibGUKLSAgICAgICAgICAgIC8vIHJhdGUgYW5kIGNoYW5uZWxzIGFzIHdlbGwKLSAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHVwZGF0ZWRDaGFubmVsczsKLSAgICAgICAgICAgIHVpbnQzMl90IHVwZGF0ZWRSYXRlOwotICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmNoZWNrQ29tcGF0aWJsZUNoYW5uZWxNYXNrKGNoYW5uZWxNYXNrLCB1cGRhdGVkQ2hhbm5lbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9ydFR5cGUsIHBvcnRSb2xlKSA9PSBOT19FUlJPUiAmJgotICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5jaGVja0NvbXBhdGlibGVTYW1wbGluZ1JhdGUoc2FtcGxpbmdSYXRlLCB1cGRhdGVkUmF0ZSkgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAvLyBmb3IgaW5leGFjdCBjaGVja3Mgd2UgdGFrZSB0aGUgZmlyc3QgbGluZWFyIHBjbSBmb3JtYXQgZHVlIHRvIHNvcnRpbmcuCi0gICAgICAgICAgICAgICAgZm9ybWF0ID0gZm9ybWF0VG9Db21wYXJlOwotICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrID0gdXBkYXRlZENoYW5uZWxzOwotICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSA9IHVwZGF0ZWRSYXRlOwotICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQkFEX1ZBTFVFOwotfQotCi1pbnQgQXVkaW9Qcm9maWxlVmVjdG9yOjpjb21wYXJlRm9ybWF0cyhjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICpwcm9maWxlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gKnByb2ZpbGUyKQotewotICAgIHJldHVybiBBdWRpb1BvcnQ6OmNvbXBhcmVGb3JtYXRzKCgqcHJvZmlsZTEpLT5nZXRGb3JtYXQoKSwgKCpwcm9maWxlMiktPmdldEZvcm1hdCgpKTsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Qcm9maWxlVmVjdG9ySGVscGVyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUHJvZmlsZVZlY3RvckhlbHBlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGNjYjhiOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvUHJvZmlsZVZlY3RvckhlbHBlci5jcHAKQEAgLTAsMCArMSw0MzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1Byb2ZpbGVWZWN0b3JIZWxwZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0NvbnRhaW5lcnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Jlc2FtcGxlclB1YmxpYy5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorCisjaW5jbHVkZSAiQXVkaW9Qcm9maWxlVmVjdG9ySGVscGVyLmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlICJQb2xpY3lBdWRpb1BvcnQuaCIKKyNpbmNsdWRlICJwb2xpY3kuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIHNvcnRBdWRpb1Byb2ZpbGVzKEF1ZGlvUHJvZmlsZVZlY3RvciAmYXVkaW9Qcm9maWxlVmVjdG9yKSB7CisgICAgc3RkOjpzb3J0KGF1ZGlvUHJvZmlsZVZlY3Rvci5iZWdpbigpLCBhdWRpb1Byb2ZpbGVWZWN0b3IuZW5kKCksCisgICAgICAgICAgICBbXShjb25zdCBzcDxBdWRpb1Byb2ZpbGU+ICYgYSwgY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmIGIpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgcmV0dXJuIFBvbGljeUF1ZGlvUG9ydDo6Y29tcGFyZUZvcm1hdHMoYS0+Z2V0Rm9ybWF0KCksIGItPmdldEZvcm1hdCgpKSA8IDA7CisgICAgICAgICAgICB9KTsKK30KKworc3NpemVfdCBhZGRBdWRpb1Byb2ZpbGVBbmRTb3J0KEF1ZGlvUHJvZmlsZVZlY3RvciAmYXVkaW9Qcm9maWxlVmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGUpCit7CisgICAgc3NpemVfdCByZXQgPSBhdWRpb1Byb2ZpbGVWZWN0b3IuYWRkKHByb2ZpbGUpOworICAgIC8vIHdlIHNvcnQgZnJvbSB3b3JzdCB0byBiZXN0LCBzbyB0aGF0IEFVRElPX0ZPUk1BVF9ERUZBVUxUIGlzIGFsd2F5cyB0aGUgZmlyc3QgZW50cnkuCisgICAgc29ydEF1ZGlvUHJvZmlsZXMoYXVkaW9Qcm9maWxlVmVjdG9yKTsKKyAgICByZXR1cm4gcmV0OworfQorCitzcDxBdWRpb1Byb2ZpbGU+IGdldEF1ZGlvUHJvZmlsZUZvckZvcm1hdChjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3IgJmF1ZGlvUHJvZmlsZVZlY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnByb2ZpbGUgOiBhdWRpb1Byb2ZpbGVWZWN0b3IpIHsKKyAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCkgeworICAgICAgICAgICAgcmV0dXJuIHByb2ZpbGU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7Cit9CisKK3ZvaWQgc2V0U2FtcGxlUmF0ZXNGb3JBdWRpb1Byb2ZpbGVzKEF1ZGlvUHJvZmlsZVZlY3RvciAmYXVkaW9Qcm9maWxlVmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2FtcGxlUmF0ZVNldCAmc2FtcGxlUmF0ZVNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCkKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnByb2ZpbGUgOiBhdWRpb1Byb2ZpbGVWZWN0b3IpIHsKKyAgICAgICAgaWYgKHByb2ZpbGUtPmdldEZvcm1hdCgpID09IGZvcm1hdCAmJiBwcm9maWxlLT5pc0R5bmFtaWNSYXRlKCkpIHsKKyAgICAgICAgICAgIGlmIChwcm9maWxlLT5oYXNWYWxpZFJhdGVzKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNyZWF0ZSBhIG5ldyBwcm9maWxlIHdpdGggc2FtZSBmb3JtYXQKKyAgICAgICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGVUb0FkZCA9IG5ldyBBdWRpb1Byb2ZpbGUoCisgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQsIHByb2ZpbGUtPmdldENoYW5uZWxzKCksIHNhbXBsZVJhdGVTZXQpOworICAgICAgICAgICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsgLy8gbmVlZCB0byBzZXQgdG8gYWxsb3cgY2xlYW5pbmcKKyAgICAgICAgICAgICAgICBhZGRBdWRpb1Byb2ZpbGVBbmRTb3J0KGF1ZGlvUHJvZmlsZVZlY3RvciwgcHJvZmlsZVRvQWRkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJvZmlsZS0+c2V0U2FtcGxlUmF0ZXMoc2FtcGxlUmF0ZVNldCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgc2V0Q2hhbm5lbHNGb3JBdWRpb1Byb2ZpbGVzKEF1ZGlvUHJvZmlsZVZlY3RvciAmYXVkaW9Qcm9maWxlVmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2hhbm5lbE1hc2tTZXQgJmNoYW5uZWxNYXNrU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQoreworICAgIGZvciAoY29uc3QgYXV0byAmcHJvZmlsZSA6IGF1ZGlvUHJvZmlsZVZlY3RvcikgeworICAgICAgICBpZiAocHJvZmlsZS0+Z2V0Rm9ybWF0KCkgPT0gZm9ybWF0ICYmIHByb2ZpbGUtPmlzRHluYW1pY0NoYW5uZWxzKCkpIHsKKyAgICAgICAgICAgIGlmIChwcm9maWxlLT5oYXNWYWxpZENoYW5uZWxzKCkpIHsKKyAgICAgICAgICAgICAgICAvLyBOZWVkIHRvIGNyZWF0ZSBhIG5ldyBwcm9maWxlIHdpdGggc2FtZSBmb3JtYXQKKyAgICAgICAgICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGVUb0FkZCA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0LCBjaGFubmVsTWFza1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCkpOworICAgICAgICAgICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsgLy8gbmVlZCB0byBzZXQgdG8gYWxsb3cgY2xlYW5pbmcKKyAgICAgICAgICAgICAgICBhZGRBdWRpb1Byb2ZpbGVBbmRTb3J0KGF1ZGlvUHJvZmlsZVZlY3RvciwgcHJvZmlsZVRvQWRkKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcHJvZmlsZS0+c2V0Q2hhbm5lbHMoY2hhbm5lbE1hc2tTZXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorfQorCit2b2lkIGFkZFByb2ZpbGVzRm9yRm9ybWF0cyhBdWRpb1Byb2ZpbGVWZWN0b3IgJmF1ZGlvUHJvZmlsZVZlY3RvciwgY29uc3QgRm9ybWF0VmVjdG9yICZmb3JtYXRWZWN0b3IpCit7CisgICAgLy8gT25seSBhbGxvdyB0byBjaGFuZ2UgdGhlIGZvcm1hdCBvZiBkeW5hbWljIHByb2ZpbGUKKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGR5bmFtaWNGb3JtYXRQcm9maWxlID0gZ2V0QXVkaW9Qcm9maWxlRm9yRm9ybWF0KAorICAgICAgICAgICAgYXVkaW9Qcm9maWxlVmVjdG9yLCBnRHluYW1pY0Zvcm1hdCk7CisgICAgaWYgKCFkeW5hbWljRm9ybWF0UHJvZmlsZSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byAmZm9ybWF0IDogZm9ybWF0VmVjdG9yKSB7CisgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0LAorICAgICAgICAgICAgICAgIGR5bmFtaWNGb3JtYXRQcm9maWxlLT5nZXRDaGFubmVscygpLAorICAgICAgICAgICAgICAgIGR5bmFtaWNGb3JtYXRQcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpKTsKKyAgICAgICAgcHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsKKyAgICAgICAgcHJvZmlsZS0+c2V0RHluYW1pY0NoYW5uZWxzKGR5bmFtaWNGb3JtYXRQcm9maWxlLT5pc0R5bmFtaWNDaGFubmVscygpKTsKKyAgICAgICAgcHJvZmlsZS0+c2V0RHluYW1pY1JhdGUoZHluYW1pY0Zvcm1hdFByb2ZpbGUtPmlzRHluYW1pY1JhdGUoKSk7CisgICAgICAgIGFkZEF1ZGlvUHJvZmlsZUFuZFNvcnQoYXVkaW9Qcm9maWxlVmVjdG9yLCBwcm9maWxlKTsKKyAgICB9Cit9CisKK3ZvaWQgYWRkRHluYW1pY0F1ZGlvUHJvZmlsZUFuZFNvcnQoQXVkaW9Qcm9maWxlVmVjdG9yICZhdWRpb1Byb2ZpbGVWZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJnByb2ZpbGVUb0FkZCkKK3sKKyAgICAvLyBDaGVjayB2YWxpZCBwcm9maWxlIHRvIGFkZDoKKyAgICBpZiAoIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRGb3JtYXQoKSkgeworICAgICAgICBBTE9HVygiQWRkaW5nIGR5bmFtaWMgYXVkaW8gcHJvZmlsZSB3aXRob3V0IHZhbGlkIGZvcm1hdCIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghcHJvZmlsZVRvQWRkLT5oYXNWYWxpZENoYW5uZWxzKCkgJiYgIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRSYXRlcygpKSB7CisgICAgICAgIEZvcm1hdFZlY3RvciBmb3JtYXRzOworICAgICAgICBmb3JtYXRzLnB1c2hfYmFjayhwcm9maWxlVG9BZGQtPmdldEZvcm1hdCgpKTsKKyAgICAgICAgYWRkUHJvZmlsZXNGb3JGb3JtYXRzKGF1ZGlvUHJvZmlsZVZlY3RvciwgRm9ybWF0VmVjdG9yKGZvcm1hdHMpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIXByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmIHByb2ZpbGVUb0FkZC0+aGFzVmFsaWRSYXRlcygpKSB7CisgICAgICAgIHNldFNhbXBsZVJhdGVzRm9yQXVkaW9Qcm9maWxlcygKKyAgICAgICAgICAgICAgICBhdWRpb1Byb2ZpbGVWZWN0b3IsIHByb2ZpbGVUb0FkZC0+Z2V0U2FtcGxlUmF0ZXMoKSwgcHJvZmlsZVRvQWRkLT5nZXRGb3JtYXQoKSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHByb2ZpbGVUb0FkZC0+aGFzVmFsaWRDaGFubmVscygpICYmICFwcm9maWxlVG9BZGQtPmhhc1ZhbGlkUmF0ZXMoKSkgeworICAgICAgICBzZXRDaGFubmVsc0ZvckF1ZGlvUHJvZmlsZXMoCisgICAgICAgICAgICAgICAgYXVkaW9Qcm9maWxlVmVjdG9yLCBwcm9maWxlVG9BZGQtPmdldENoYW5uZWxzKCksIHByb2ZpbGVUb0FkZC0+Z2V0Rm9ybWF0KCkpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIEdvIHRocm91Z2ggdGhlIGxpc3Qgb2YgcHJvZmlsZSB0byBhdm9pZCBkdXBsaWNhdGVzCisgICAgZm9yIChzaXplX3QgcHJvZmlsZUluZGV4ID0gMDsgcHJvZmlsZUluZGV4IDwgYXVkaW9Qcm9maWxlVmVjdG9yLnNpemUoKTsgcHJvZmlsZUluZGV4KyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmcHJvZmlsZSA9IGF1ZGlvUHJvZmlsZVZlY3Rvci5hdChwcm9maWxlSW5kZXgpOworICAgICAgICBpZiAocHJvZmlsZS0+aXNWYWxpZCgpICYmIHByb2ZpbGUgPT0gcHJvZmlsZVRvQWRkKSB7CisgICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGRvCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOyAvLyBzZXQgdGhlIGZvcm1hdCBhcyBkeW5hbWljIHRvIGFsbG93IHJlbW92YWwKKyAgICBhZGRBdWRpb1Byb2ZpbGVBbmRTb3J0KGF1ZGlvUHJvZmlsZVZlY3RvciwgcHJvZmlsZVRvQWRkKTsKK30KKwordm9pZCBhcHBlbmRBdWRpb1Byb2ZpbGVzKEF1ZGlvUHJvZmlsZVZlY3RvciAmYXVkaW9Qcm9maWxlVmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciAmYXVkaW9Qcm9maWxlVmVjdG9yVG9BcHBlbmQpCit7CisgICAgYXVkaW9Qcm9maWxlVmVjdG9yLmluc2VydChhdWRpb1Byb2ZpbGVWZWN0b3IuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1Byb2ZpbGVWZWN0b3JUb0FwcGVuZC5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Qcm9maWxlVmVjdG9yVG9BcHBlbmQuZW5kKCkpOworfQorCitzdGF0dXNfdCBjaGVja0V4YWN0KGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJmF1ZGlvUHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQoreworICAgIGlmIChhdWRpb19mb3JtYXRzX21hdGNoKGZvcm1hdCwgYXVkaW9Qcm9maWxlLT5nZXRGb3JtYXQoKSkgJiYKKyAgICAgICAgICAgIGF1ZGlvUHJvZmlsZS0+c3VwcG9ydHNDaGFubmVscyhjaGFubmVsTWFzaykgJiYKKyAgICAgICAgICAgIGF1ZGlvUHJvZmlsZS0+c3VwcG9ydHNSYXRlKHNhbXBsaW5nUmF0ZSkpIHsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0dXNfdCBjaGVja0NvbXBhdGlibGVTYW1wbGluZ1JhdGUoY29uc3Qgc3A8QXVkaW9Qcm9maWxlPiAmYXVkaW9Qcm9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmdXBkYXRlZFNhbXBsaW5nUmF0ZSkKK3sKKyAgICBBTE9HX0FTU0VSVChzYW1wbGluZ1JhdGUgPiAwKTsKKworICAgIGNvbnN0IFNhbXBsZVJhdGVTZXQgc2FtcGxlUmF0ZXMgPSBhdWRpb1Byb2ZpbGUtPmdldFNhbXBsZVJhdGVzKCk7CisgICAgaWYgKHNhbXBsZVJhdGVzLmVtcHR5KCkpIHsKKyAgICAgICAgdXBkYXRlZFNhbXBsaW5nUmF0ZSA9IHNhbXBsaW5nUmF0ZTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIC8vIFNlYXJjaCBmb3IgdGhlIGNsb3Nlc3Qgc3VwcG9ydGVkIHNhbXBsaW5nIHJhdGUgdGhhdCBpcyBhYm92ZSAocHJlZmVycmVkKQorICAgIC8vIG9yIGJlbG93IChhY2NlcHRhYmxlKSB0aGUgZGVzaXJlZCBzYW1wbGluZyByYXRlLCB3aXRoaW4gYSBwZXJtaXR0ZWQgcmF0aW8uCisgICAgLy8gVGhlIHNhbXBsaW5nIHJhdGVzIGFyZSBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyLgorICAgIGF1dG8gZGVzaXJlZFJhdGUgPSBzYW1wbGVSYXRlcy5sb3dlcl9ib3VuZChzYW1wbGluZ1JhdGUpOworCisgICAgLy8gUHJlZmVyIHRvIGRvd24tc2FtcGxlIGZyb20gYSBoaWdoZXIgc2FtcGxpbmcgcmF0ZSwgYXMgd2UgZ2V0IHRoZSBkZXNpcmVkIGZyZXF1ZW5jeSBzcGVjdHJ1bS4KKyAgICBpZiAoZGVzaXJlZFJhdGUgIT0gc2FtcGxlUmF0ZXMuZW5kKCkpIHsKKyAgICAgICAgaWYgKCpkZXNpcmVkUmF0ZSAvIEFVRElPX1JFU0FNUExFUl9ET1dOX1JBVElPX01BWCA8PSBzYW1wbGluZ1JhdGUpIHsKKyAgICAgICAgICAgIHVwZGF0ZWRTYW1wbGluZ1JhdGUgPSAqZGVzaXJlZFJhdGU7CisgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gQnV0IGlmIHdlIGhhdmUgdG8gdXAtc2FtcGxlIGZyb20gYSBsb3dlciBzYW1wbGluZyByYXRlLCB0aGF0J3MgT0suCisgICAgaWYgKGRlc2lyZWRSYXRlICE9IHNhbXBsZVJhdGVzLmJlZ2luKCkpIHsKKyAgICAgICAgdWludDMyX3QgY2FuZGlkYXRlID0gKigtLWRlc2lyZWRSYXRlKTsKKyAgICAgICAgaWYgKGNhbmRpZGF0ZSAqIEFVRElPX1JFU0FNUExFUl9VUF9SQVRJT19NQVggPj0gc2FtcGxpbmdSYXRlKSB7CisgICAgICAgICAgICB1cGRhdGVkU2FtcGxpbmdSYXRlID0gY2FuZGlkYXRlOworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIC8vIGxlYXZlIHVwZGF0ZWRTYW1wbGluZ1JhdGUgdW5tb2RpZmllZAorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3N0YXR1c190IGNoZWNrQ29tcGF0aWJsZUNoYW5uZWxNYXNrKGNvbnN0IHNwPEF1ZGlvUHJvZmlsZT4gJmF1ZGlvUHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgJnVwZGF0ZWRDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHBvcnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3QgcG9ydFJvbGUpCit7CisgICAgY29uc3QgQ2hhbm5lbE1hc2tTZXQgY2hhbm5lbE1hc2tzID0gYXVkaW9Qcm9maWxlLT5nZXRDaGFubmVscygpOworICAgIGlmIChjaGFubmVsTWFza3MuZW1wdHkoKSkgeworICAgICAgICB1cGRhdGVkQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICBjb25zdCBib29sIGlzUmVjb3JkVGhyZWFkID0gcG9ydFR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCAmJiBwb3J0Um9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSzsKKyAgICBjb25zdCBib29sIGlzSW5kZXggPSBhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKGNoYW5uZWxNYXNrKQorICAgICAgICAgICAgPT0gQVVESU9fQ0hBTk5FTF9SRVBSRVNFTlRBVElPTl9JTkRFWDsKKyAgICBjb25zdCB1aW50MzJfdCBjaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzayk7CisgICAgaW50IGJlc3RNYXRjaCA9IDA7CisgICAgZm9yIChjb25zdCBhdXRvICZzdXBwb3J0ZWQgOiBjaGFubmVsTWFza3MpIHsKKyAgICAgICAgaWYgKHN1cHBvcnRlZCA9PSBjaGFubmVsTWFzaykgeworICAgICAgICAgICAgLy8gRXhhY3QgbWF0Y2hlcyBhbHdheXMgdGFrZW4uCisgICAgICAgICAgICB1cGRhdGVkQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFVRElPX0NIQU5ORUxfTk9ORSAodmFsdWU6IDApIGlzIHVzZWQgZm9yIGR5bmFtaWMgY2hhbm5lbCBzdXBwb3J0CisgICAgICAgIGlmIChpc1JlY29yZFRocmVhZCAmJiBzdXBwb3J0ZWQgIT0gQVVESU9fQ0hBTk5FTF9OT05FKSB7CisgICAgICAgICAgICAvLyBBcHByb3hpbWF0ZSAoYmVzdCkgbWF0Y2g6CisgICAgICAgICAgICAvLyBUaGUgbWF0Y2ggc2NvcmUgbWVhc3VyZXMgaG93IHdlbGwgdGhlIHN1cHBvcnRlZCBjaGFubmVsIG1hc2sgbWF0Y2hlcyB0aGUKKyAgICAgICAgICAgIC8vIGRlc2lyZWQgbWFzaywgd2hlcmUgaW5jcmVhc2luZy1pcy1iZXR0ZXIuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVE9ETzogU29tZSB0d2Vha3MgbWF5IGJlIG5lZWRlZC4KKyAgICAgICAgICAgIC8vIFNob3VsZCBiZSBhIHN0YXRpYyBmdW5jdGlvbiBvZiB0aGUgZGF0YSBwcm9jZXNzaW5nIGxpYnJhcnkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSW4gcHJpb3JpdHk6CisgICAgICAgICAgICAvLyBtYXRjaCBzY29yZSA9IDEwMDAgaWYgbGVnYWN5IGNoYW5uZWwgY29udmVyc2lvbiBlcXVpdmFsZW50IChhbHdheXMgcHJlZmVyIHRoaXMpCisgICAgICAgICAgICAvLyBPUgorICAgICAgICAgICAgLy8gbWF0Y2ggc2NvcmUgKz0gMTAwIGlmIHRoZSBjaGFubmVsIG1hc2sgcmVwcmVzZW50YXRpb25zIG1hdGNoCisgICAgICAgICAgICAvLyBtYXRjaCBzY29yZSArPSBudW1iZXIgb2YgY2hhbm5lbHMgbWF0Y2hlZC4KKyAgICAgICAgICAgIC8vIG1hdGNoIHNjb3JlICs9IDEwMCBpZiB0aGUgY2hhbm5lbCBtYXNrIHJlcHJlc2VudGF0aW9ucyBETyBOT1QgbWF0Y2gKKyAgICAgICAgICAgIC8vICAgYnV0IHRoZSBwcm9maWxlIGhhcyBwb3NpdGlvbmFsIGNoYW5uZWwgbWFzayBhbmQgbGVzcyB0aGFuIDIgY2hhbm5lbHMuCisgICAgICAgICAgICAvLyAgIFRoaXMgaXMgZm9yIGF1ZGlvIEhBTCBjb252ZW50aW9uIHRvIG5vdCBsaXN0IGluZGV4IG1hc2tzIGZvciBsZXNzIHRoYW4gMiBjaGFubmVscworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIHRoZXJlIGFyZSBubyBtYXRjaGVkIGNoYW5uZWxzLCB0aGUgbWFzayBtYXkgc3RpbGwgYmUgYWNjZXB0ZWQKKyAgICAgICAgICAgIC8vIGJ1dCB0aGUgcGxheWJhY2sgb3IgcmVjb3JkIHdpbGwgYmUgc2lsZW50LgorICAgICAgICAgICAgY29uc3QgYm9vbCBpc1N1cHBvcnRlZEluZGV4ID0gKGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfcmVwcmVzZW50YXRpb24oc3VwcG9ydGVkKQorICAgICAgICAgICAgICAgICAgICA9PSBBVURJT19DSEFOTkVMX1JFUFJFU0VOVEFUSU9OX0lOREVYKTsKKyAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IHN1cHBvcnRlZENoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKHN1cHBvcnRlZCk7CisgICAgICAgICAgICBpbnQgbWF0Y2g7CisgICAgICAgICAgICBpZiAoaXNJbmRleCAmJiBpc1N1cHBvcnRlZEluZGV4KSB7CisgICAgICAgICAgICAgICAgLy8gaW5kZXggZXF1aXZhbGVuY2UKKyAgICAgICAgICAgICAgICBtYXRjaCA9IDEwMCArIF9fYnVpbHRpbl9wb3Bjb3VudCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhzdXBwb3J0ZWQpKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoaXNJbmRleCAmJiAhaXNTdXBwb3J0ZWRJbmRleCkgeworICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGVxdWl2YWxlbnRCaXRzID0gKDEgPDwgc3VwcG9ydGVkQ2hhbm5lbENvdW50KSAtIDEgOworICAgICAgICAgICAgICAgIG1hdGNoID0gX19idWlsdGluX3BvcGNvdW50KAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX2dldF9iaXRzKGNoYW5uZWxNYXNrKSAmIGVxdWl2YWxlbnRCaXRzKTsKKyAgICAgICAgICAgICAgICBpZiAoc3VwcG9ydGVkQ2hhbm5lbENvdW50IDw9IEZDQ18yKSB7CisgICAgICAgICAgICAgICAgICAgIG1hdGNoICs9IDEwMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFpc0luZGV4ICYmIGlzU3VwcG9ydGVkSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCBlcXVpdmFsZW50Qml0cyA9ICgxIDw8IGNoYW5uZWxDb3VudCkgLSAxOworICAgICAgICAgICAgICAgIG1hdGNoID0gX19idWlsdGluX3BvcGNvdW50KAorICAgICAgICAgICAgICAgICAgICAgICAgZXF1aXZhbGVudEJpdHMgJiBhdWRpb19jaGFubmVsX21hc2tfZ2V0X2JpdHMoc3VwcG9ydGVkKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHBvc2l0aW9uYWwgZXF1aXZhbGVuY2UKKyAgICAgICAgICAgICAgICBtYXRjaCA9IDEwMCArIF9fYnVpbHRpbl9wb3Bjb3VudCgKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhjaGFubmVsTWFzaykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIGF1ZGlvX2NoYW5uZWxfbWFza19nZXRfYml0cyhzdXBwb3J0ZWQpKTsKKyAgICAgICAgICAgICAgICBzd2l0Y2ggKHN1cHBvcnRlZCkgeworICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9JTl9GUk9OVF9CQUNLOgorICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU86CisgICAgICAgICAgICAgICAgICAgIGlmIChjaGFubmVsTWFzayA9PSBBVURJT19DSEFOTkVMX0lOX01PTk8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hdGNoID0gMTAwMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0NIQU5ORUxfSU5fTU9OTzoKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fRlJPTlRfQkFDSworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IGNoYW5uZWxNYXNrID09IEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IDEwMDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1hdGNoID4gYmVzdE1hdGNoKSB7CisgICAgICAgICAgICAgICAgYmVzdE1hdGNoID0gbWF0Y2g7CisgICAgICAgICAgICAgICAgdXBkYXRlZENoYW5uZWxNYXNrID0gc3VwcG9ydGVkOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBiZXN0TWF0Y2ggPiAwID8gTk9fRVJST1IgOiBCQURfVkFMVUU7Cit9CisKK3N0YXR1c190IGNoZWNrRXhhY3RQcm9maWxlKGNvbnN0IEF1ZGlvUHJvZmlsZVZlY3RvciYgYXVkaW9Qcm9maWxlVmVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3Qgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpCit7CisgICAgaWYgKGF1ZGlvUHJvZmlsZVZlY3Rvci5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHByb2ZpbGUgOiBhdWRpb1Byb2ZpbGVWZWN0b3IpIHsKKyAgICAgICAgaWYgKGNoZWNrRXhhY3QocHJvZmlsZSwgc2FtcGxpbmdSYXRlLCBjaGFubmVsTWFzaywgZm9ybWF0KSA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK3N0YXR1c190IGNoZWNrQ29tcGF0aWJsZVByb2ZpbGUoY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yICZhdWRpb1Byb2ZpbGVWZWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190ICZjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgJmZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgcG9ydFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlKQoreworICAgIGlmIChhdWRpb1Byb2ZpbGVWZWN0b3IuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgY29uc3QgYm9vbCBjaGVja0luZXhhY3QgPSAvLyB3aGVuIHBvcnQgaXMgaW5wdXQgYW5kIGZvcm1hdCBpcyBsaW5lYXIgcGNtCisgICAgICAgICAgICBwb3J0VHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYICYmIHBvcnRSb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LCisgICAgICAgICAgICAmJiBhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdCk7CisKKyAgICAvLyBpdGVyYXRlIGZyb20gYmVzdCBmb3JtYXQgdG8gd29yc3QgZm9ybWF0IChyZXZlcnNlIG9yZGVyKQorICAgIGZvciAoc3NpemVfdCBpID0gYXVkaW9Qcm9maWxlVmVjdG9yLnNpemUoKSAtIDE7IGkgPj0gMCA7IC0taSkgeworICAgICAgICBjb25zdCBzcDxBdWRpb1Byb2ZpbGU+IHByb2ZpbGUgPSBhdWRpb1Byb2ZpbGVWZWN0b3IuYXQoaSk7CisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdFRvQ29tcGFyZSA9IHByb2ZpbGUtPmdldEZvcm1hdCgpOworICAgICAgICBpZiAoZm9ybWF0VG9Db21wYXJlID09IGZvcm1hdCB8fAorICAgICAgICAgICAgICAgIChjaGVja0luZXhhY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIGZvcm1hdFRvQ29tcGFyZSAhPSBBVURJT19GT1JNQVRfREVGQVVMVAorICAgICAgICAgICAgICAgICAgICAgICAgJiYgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXRUb0NvbXBhcmUpKSkgeworICAgICAgICAgICAgLy8gQ29tcGF0aWJsZSBwcm9maWxlIGhhcyBiZWVuIGZvdW5kLCBjaGVja3MgaWYgdGhpcyBwcm9maWxlIGhhcyBjb21wYXRpYmxlCisgICAgICAgICAgICAvLyByYXRlIGFuZCBjaGFubmVscyBhcyB3ZWxsCisgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCB1cGRhdGVkQ2hhbm5lbHM7CisgICAgICAgICAgICB1aW50MzJfdCB1cGRhdGVkUmF0ZTsKKyAgICAgICAgICAgIGlmIChjaGVja0NvbXBhdGlibGVDaGFubmVsTWFzayhwcm9maWxlLCBjaGFubmVsTWFzaywgdXBkYXRlZENoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvcnRUeXBlLCBwb3J0Um9sZSkgPT0gTk9fRVJST1IgJiYKKyAgICAgICAgICAgICAgICAgICAgY2hlY2tDb21wYXRpYmxlU2FtcGxpbmdSYXRlKHByb2ZpbGUsIHNhbXBsaW5nUmF0ZSwgdXBkYXRlZFJhdGUpID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgLy8gZm9yIGluZXhhY3QgY2hlY2tzIHdlIHRha2UgdGhlIGZpcnN0IGxpbmVhciBwY20gZm9ybWF0IGR1ZSB0byBzb3J0aW5nLgorICAgICAgICAgICAgICAgIGZvcm1hdCA9IGZvcm1hdFRvQ29tcGFyZTsKKyAgICAgICAgICAgICAgICBjaGFubmVsTWFzayA9IHVwZGF0ZWRDaGFubmVsczsKKyAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSB1cGRhdGVkUmF0ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworLy8gUmV0dXJucyBhbiBpbnRlcnNlY3Rpb24gYmV0d2VlbiB0d28gcG9zc2libHkgdW5zb3J0ZWQgdmVjdG9ycyBhbmQgdGhlIGNvbnRlbnRzIG9mICdvcmRlcicuCisvLyBUaGUgcmVzdWx0IGlzIG9yZGVyZWQgYWNjb3JkaW5nIHRvICdvcmRlcicuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBPcmRlcj4KK3N0ZDo6dmVjdG9yPHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IGludGVyc2VjdEZpbHRlckFuZE9yZGVyKAorICAgICAgICBjb25zdCBUJiBpbnB1dDEsIGNvbnN0IFQmIGlucHV0MiwgY29uc3QgT3JkZXImIG9yZGVyKQoreworICAgIHN0ZDo6c2V0PHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGU+IHNldDF7aW5wdXQxLmJlZ2luKCksIGlucHV0MS5lbmQoKX07CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gc2V0MntpbnB1dDIuYmVnaW4oKSwgaW5wdXQyLmVuZCgpfTsKKyAgICBzdGQ6OnNldDx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiBjb21tb247CisgICAgc3RkOjpzZXRfaW50ZXJzZWN0aW9uKHNldDEuYmVnaW4oKSwgc2V0MS5lbmQoKSwgc2V0Mi5iZWdpbigpLCBzZXQyLmVuZCgpLAorICAgICAgICAgICAgc3RkOjppbnNlcnRlcihjb21tb24sIGNvbW1vbi5iZWdpbigpKSk7CisgICAgc3RkOjp2ZWN0b3I8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gcmVzdWx0OworICAgIGZvciAoY29uc3QgYXV0byYgZSA6IG9yZGVyKSB7CisgICAgICAgIGlmIChjb21tb24uZmluZChlKSAhPSBjb21tb24uZW5kKCkpIHJlc3VsdC5wdXNoX2JhY2soZSk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKKy8vIEludGVyc2VjdCB0d28gcG9zc2libHkgdW5zb3J0ZWQgdmVjdG9ycywgcmV0dXJuIGNvbW1vbiBlbGVtZW50cyBhY2NvcmRpbmcgdG8gJ2NvbXAnIG9yZGVyaW5nLgorLy8gJ2NvbXAnIGlzIGEgY29tcGFyYXRvciBmdW5jdGlvbi4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENvbXBhcmU+CitzdGQ6OnZlY3Rvcjx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiBpbnRlcnNlY3RBbmRPcmRlcigKKyAgICAgICAgY29uc3QgVCYgaW5wdXQxLCBjb25zdCBUJiBpbnB1dDIsIENvbXBhcmUgY29tcCkKK3sKKyAgICBzdGQ6OnNldDx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlLCBDb21wYXJlPiBzZXQxe2lucHV0MS5iZWdpbigpLCBpbnB1dDEuZW5kKCksIGNvbXB9OworICAgIHN0ZDo6c2V0PHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGUsIENvbXBhcmU+IHNldDJ7aW5wdXQyLmJlZ2luKCksIGlucHV0Mi5lbmQoKSwgY29tcH07CisgICAgc3RkOjp2ZWN0b3I8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gcmVzdWx0OworICAgIHN0ZDo6c2V0X2ludGVyc2VjdGlvbihzZXQxLmJlZ2luKCksIHNldDEuZW5kKCksIHNldDIuYmVnaW4oKSwgc2V0Mi5lbmQoKSwKKyAgICAgICAgICAgIHN0ZDo6YmFja19pbnNlcnRlcihyZXN1bHQpLCBjb21wKTsKKyAgICByZXR1cm4gcmVzdWx0OworfQorCitzdGF0dXNfdCBmaW5kQmVzdE1hdGNoaW5nT3V0cHV0Q29uZmlnKAorICAgICAgICBjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3IgJmF1ZGlvUHJvZmlsZVZlY3RvciwKKyAgICAgICAgY29uc3QgQXVkaW9Qcm9maWxlVmVjdG9yICZvdXRwdXRQcm9maWxlVmVjdG9yLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gJnByZWZlcnJlZEZvcm1hdFZlY3RvciwgLy8gb3JkZXI6IG1vc3QgcHJlZiAtPiBsZWFzdCBwcmVmCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGF1ZGlvX2NoYW5uZWxfbWFza190PiAmcHJlZmVycmVkT3V0cHV0Q2hhbm5lbFZlY3RvciwKKyAgICAgICAgYm9vbCBwcmVmZXJIaWdoZXJTYW1wbGluZ1JhdGVzLAorICAgICAgICBhdWRpb19jb25maWdfYmFzZSAmYmVzdE91dHB1dENvbmZpZykKK3sKKyAgICBhdXRvIGZvcm1hdHMgPSBpbnRlcnNlY3RGaWx0ZXJBbmRPcmRlcihhdWRpb1Byb2ZpbGVWZWN0b3IuZ2V0U3VwcG9ydGVkRm9ybWF0cygpLAorICAgICAgICAgICAgb3V0cHV0UHJvZmlsZVZlY3Rvci5nZXRTdXBwb3J0ZWRGb3JtYXRzKCksIHByZWZlcnJlZEZvcm1hdFZlY3Rvcik7CisgICAgLy8gUGljayB0aGUgYmVzdCBjb21wYXRpYmxlIHByb2ZpbGUuCisgICAgZm9yIChjb25zdCBhdXRvJiBmIDogZm9ybWF0cykgeworICAgICAgICBzcDxBdWRpb1Byb2ZpbGU+IGlucHV0UHJvZmlsZSA9IGF1ZGlvUHJvZmlsZVZlY3Rvci5nZXRGaXJzdFZhbGlkUHJvZmlsZUZvcihmKTsKKyAgICAgICAgc3A8QXVkaW9Qcm9maWxlPiBvdXRwdXRQcm9maWxlID0gb3V0cHV0UHJvZmlsZVZlY3Rvci5nZXRGaXJzdFZhbGlkUHJvZmlsZUZvcihmKTsKKyAgICAgICAgaWYgKGlucHV0UHJvZmlsZSA9PSBudWxscHRyIHx8IG91dHB1dFByb2ZpbGUgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYXV0byBjaGFubmVscyA9IGludGVyc2VjdEZpbHRlckFuZE9yZGVyKGFzT3V0TWFzayhpbnB1dFByb2ZpbGUtPmdldENoYW5uZWxzKCkpLAorICAgICAgICAgICAgICAgIG91dHB1dFByb2ZpbGUtPmdldENoYW5uZWxzKCksIHByZWZlcnJlZE91dHB1dENoYW5uZWxWZWN0b3IpOworICAgICAgICBpZiAoY2hhbm5lbHMuZW1wdHkoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYXV0byBzYW1wbGVSYXRlcyA9IHByZWZlckhpZ2hlclNhbXBsaW5nUmF0ZXMgPworICAgICAgICAgICAgICAgIGludGVyc2VjdEFuZE9yZGVyKGlucHV0UHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSwgb3V0cHV0UHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Z3JlYXRlcjx0eXBlbmFtZSBTYW1wbGVSYXRlU2V0Ojp2YWx1ZV90eXBlPigpKSA6CisgICAgICAgICAgICAgICAgaW50ZXJzZWN0QW5kT3JkZXIoaW5wdXRQcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpLCBvdXRwdXRQcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsZXNzPHR5cGVuYW1lIFNhbXBsZVJhdGVTZXQ6OnZhbHVlX3R5cGU+KCkpOworICAgICAgICBpZiAoc2FtcGxlUmF0ZXMuZW1wdHkoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR0QoIiVzKCkgZm91bmQgY2hhbm5lbCBtYXNrICUjeCBhbmQgc2FtcGxlIHJhdGUgJWQgZm9yIGZvcm1hdCAlI3guIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgKmNoYW5uZWxzLmJlZ2luKCksICpzYW1wbGVSYXRlcy5iZWdpbigpLCBmKTsKKyAgICAgICAgYmVzdE91dHB1dENvbmZpZy5mb3JtYXQgPSBmOworICAgICAgICBiZXN0T3V0cHV0Q29uZmlnLnNhbXBsZV9yYXRlID0gKnNhbXBsZVJhdGVzLmJlZ2luKCk7CisgICAgICAgIGJlc3RPdXRwdXRDb25maWcuY2hhbm5lbF9tYXNrID0gKmNoYW5uZWxzLmJlZ2luKCk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgcmV0dXJuIEJBRF9WQUxVRTsKK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Sb3V0ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcAppbmRleCA3OWFkMWY3Li4yYTE4ZjE5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1JvdXRlLmNwcApAQCAtMTksMzQgKzE5LDM3IEBACiAKICNpbmNsdWRlICJBdWRpb1JvdXRlLmgiCiAjaW5jbHVkZSAiSHdNb2R1bGUuaCIKLSNpbmNsdWRlICJBdWRpb0dhaW4uaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQKIHsKIAotdm9pZCBBdWRpb1JvdXRlOjpkdW1wKGludCBmZCwgaW50IHNwYWNlcykgY29uc3QKK3ZvaWQgQXVkaW9Sb3V0ZTo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFR5cGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtVHlwZSA9PSBBVURJT19ST1VURV9NVVggPyAiTXV4IiA6ICJNaXgiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIFNpbms6ICVzXG4iLCBzcGFjZXMsICIiLCBtU2luay0+Z2V0VGFnTmFtZSgpLnN0cmluZygpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBUeXBlOiAlc1xuIiwgc3BhY2VzLCAiIiwgbVR5cGUgPT0gQVVESU9fUk9VVEVfTVVYID8gIk11eCIgOiAiTWl4Iik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU2luazogJXNcbiIsIHNwYWNlcywgIiIsIG1TaW5rLT5nZXRUYWdOYW1lKCkuY19zdHIoKSk7CiAgICAgaWYgKG1Tb3VyY2VzLnNpemUoKSAhPSAwKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gU291cmNlczogXG4iLCBzcGFjZXMsICIiKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBTb3VyY2VzOiBcbiIsIHNwYWNlcywgIiIpOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Tb3VyY2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMlcyBcbiIsIHNwYWNlcyArIDQsICIiLCBtU291cmNlc1tpXS0+Z2V0VGFnTmFtZSgpLnN0cmluZygpKTsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMlcyBcbiIsIHNwYWNlcyArIDQsICIiLCBtU291cmNlc1tpXS0+Z2V0VGFnTmFtZSgpLmNfc3RyKCkpOwogICAgICAgICB9CiAgICAgfQotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7CisgICAgZHN0LT5hcHBlbmQoIlxuIik7Cit9CiAKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKK2Jvb2wgQXVkaW9Sb3V0ZTo6c3VwcG9ydHNQYXRjaChjb25zdCBzcDxQb2xpY3lBdWRpb1BvcnQ+ICZzcmNQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFBvbGljeUF1ZGlvUG9ydD4gJmRzdFBvcnQpIGNvbnN0Cit7CisgICAgaWYgKG1TaW5rID09IDAgfHwgZHN0UG9ydCA9PSAwIHx8IGRzdFBvcnQgIT0gbVNpbmspIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBBTE9HVigiJXM6IHNpbmtzICVzIG1hdGNoaW5nIiwgX19GVU5DVElPTl9fLCBtU2luay0+Z2V0VGFnTmFtZSgpLmNfc3RyKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmc291cmNlUG9ydCA6IG1Tb3VyY2VzKSB7CisgICAgICAgIGlmIChzb3VyY2VQb3J0ID09IHNyY1BvcnQpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogc291cmNlcyAlcyBtYXRjaGluZyIsIF9fRlVOQ1RJT05fXywgc291cmNlUG9ydC0+Z2V0VGFnTmFtZSgpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOwogfQogCiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9TZXNzaW9uLmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NkYTQ2Yi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9BdWRpb1Nlc3Npb24uY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9TZXNzaW9uIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8QXVkaW9Qb2xpY3lJbnRlcmZhY2UuaD4KLSNpbmNsdWRlICJwb2xpY3kuaCIKLSNpbmNsdWRlICJBdWRpb1Nlc3Npb24uaCIKLSNpbmNsdWRlICJBdWRpb0dhaW4uaCIKLSNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCi0KLSNpbmNsdWRlIDxsb2cvbG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLUF1ZGlvU2Vzc2lvbjo6QXVkaW9TZXNzaW9uKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGVSYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4KiBwb2xpY3lNaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKSA6Ci0gICAgbVJlY29yZENsaWVudEluZm8oeyAudWlkID0gdWlkLCAuc2Vzc2lvbiA9IHNlc3Npb24sIC5zb3VyY2UgPSBpbnB1dFNvdXJjZX0pLAotICAgIG1Db25maWcoeyAuZm9ybWF0ID0gZm9ybWF0LCAuc2FtcGxlX3JhdGUgPSBzYW1wbGVSYXRlLCAuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2t9KSwKLSAgICBtRmxhZ3MoZmxhZ3MpLCBtSXNTb3VuZFRyaWdnZXIoaXNTb3VuZFRyaWdnZXIpLAotICAgIG1PcGVuQ291bnQoMSksIG1BY3RpdmVDb3VudCgwKSwgbVBvbGljeU1peChwb2xpY3lNaXgpLCBtQ2xpZW50SW50ZXJmYWNlKGNsaWVudEludGVyZmFjZSksCi0gICAgbUluZm9Qcm92aWRlcihOVUxMKQotewotfQotCi11aW50MzJfdCBBdWRpb1Nlc3Npb246OmNoYW5nZU9wZW5Db3VudChpbnQgZGVsdGEpCi17Ci0gICAgaWYgKChkZWx0YSArIChpbnQpbU9wZW5Db3VudCkgPCAwKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBpbnZhbGlkIGRlbHRhICVkLCBvcGVuIGNvdW50ICVkIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZWx0YSwgbU9wZW5Db3VudCk7Ci0gICAgICAgIG1PcGVuQ291bnQgPSAodWludDMyX3QpKC1kZWx0YSk7Ci0gICAgfQotICAgIG1PcGVuQ291bnQgKz0gZGVsdGE7Ci0gICAgQUxPR1YoIiVzIG9wZW4gY291bnQgJWQiLCBfX0ZVTkNUSU9OX18sIG1PcGVuQ291bnQpOwotICAgIHJldHVybiBtT3BlbkNvdW50OwotfQotCi11aW50MzJfdCBBdWRpb1Nlc3Npb246OmNoYW5nZUFjdGl2ZUNvdW50KGludCBkZWx0YSkKLXsKLSAgICBjb25zdCB1aW50MzJfdCBvbGRBY3RpdmVDb3VudCA9IG1BY3RpdmVDb3VudDsKLSAgICBpZiAoKGRlbHRhICsgKGludCltQWN0aXZlQ291bnQpIDwgMCkgewotICAgICAgICBBTE9HVygiJXMgaW52YWxpZCBkZWx0YSAlZCwgYWN0aXZlIGNvdW50ICVkIiwKLSAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBkZWx0YSwgbUFjdGl2ZUNvdW50KTsKLSAgICAgICAgbUFjdGl2ZUNvdW50ID0gKHVpbnQzMl90KSgtZGVsdGEpOwotICAgIH0KLSAgICBtQWN0aXZlQ291bnQgKz0gZGVsdGE7Ci0gICAgQUxPR1YoIiVzIGFjdGl2ZSBjb3VudCAlZCIsIF9fRlVOQ1RJT05fXywgbUFjdGl2ZUNvdW50KTsKLSAgICBpbnQgZXZlbnQgPSBSRUNPUkRfQ09ORklHX0VWRU5UX05PTkU7Ci0KLSAgICBpZiAoKG9sZEFjdGl2ZUNvdW50ID09IDApICYmIChtQWN0aXZlQ291bnQgPiAwKSkgewotICAgICAgICBldmVudCA9IFJFQ09SRF9DT05GSUdfRVZFTlRfU1RBUlQ7Ci0gICAgfSBlbHNlIGlmICgob2xkQWN0aXZlQ291bnQgPiAwKSAmJiAobUFjdGl2ZUNvdW50ID09IDApKSB7Ci0gICAgICAgIGV2ZW50ID0gUkVDT1JEX0NPTkZJR19FVkVOVF9TVE9QOwotICAgIH0KLQotICAgIGlmIChldmVudCAhPSBSRUNPUkRfQ09ORklHX0VWRU5UX05PTkUpIHsKLSAgICAgICAgLy8gRHluYW1pYyBwb2xpY3kgY2FsbGJhY2s6Ci0gICAgICAgIC8vIGlmIGlucHV0IG1hcHMgdG8gYSBkeW5hbWljIHBvbGljeSB3aXRoIGFuIGFjdGl2aXR5IGxpc3RlbmVyLCBub3RpZnkgb2Ygc3RhdGUgY2hhbmdlCi0gICAgICAgIGlmICgobVBvbGljeU1peCAhPSBOVUxMKSAmJiAoKG1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKG1Qb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAoZXZlbnQgPT0gUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCkgPyBNSVhfU1RBVEVfTUlYSU5HIDogTUlYX1NUQVRFX0lETEUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gUmVjb3JkaW5nIGNvbmZpZ3VyYXRpb24gY2FsbGJhY2s6Ci0gICAgICAgIGNvbnN0IEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciogcHJvdmlkZXIgPSBtSW5mb1Byb3ZpZGVyOwotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90IGRldmljZUNvbmZpZyA9IChwcm92aWRlciAhPSBOVUxMKSA/IHByb3ZpZGVyLT5nZXRDb25maWcoKSA6Ci0gICAgICAgICAgICAgICAgQVVESU9fQ09ORklHX0JBU0VfSU5JVElBTElaRVI7Ci0gICAgICAgIGNvbnN0IGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlID0gKHByb3ZpZGVyICE9IE5VTEwpID8gcHJvdmlkZXItPmdldFBhdGNoSGFuZGxlKCkgOgotICAgICAgICAgICAgICAgIEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICBpZiAocGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgIG1DbGllbnRJbnRlcmZhY2UtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgJm1SZWNvcmRDbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAmbUNvbmZpZywgJmRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIG1BY3RpdmVDb3VudDsKLX0KLQotYm9vbCBBdWRpb1Nlc3Npb246Om1hdGNoZXMoY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiAmb3RoZXIpIGNvbnN0Ci17Ci0gICAgaWYgKG90aGVyLT5zZXNzaW9uKCkgPT0gbVJlY29yZENsaWVudEluZm8uc2Vzc2lvbiAmJgotICAgICAgICBvdGhlci0+aW5wdXRTb3VyY2UoKSA9PSBtUmVjb3JkQ2xpZW50SW5mby5zb3VyY2UgJiYKLSAgICAgICAgb3RoZXItPmZvcm1hdCgpID09IG1Db25maWcuZm9ybWF0ICYmCi0gICAgICAgIG90aGVyLT5zYW1wbGVSYXRlKCkgPT0gbUNvbmZpZy5zYW1wbGVfcmF0ZSAmJgotICAgICAgICBvdGhlci0+Y2hhbm5lbE1hc2soKSA9PSBtQ29uZmlnLmNoYW5uZWxfbWFzayAmJgotICAgICAgICBvdGhlci0+ZmxhZ3MoKSA9PSBtRmxhZ3MgJiYKLSAgICAgICAgb3RoZXItPnVpZCgpID09IG1SZWNvcmRDbGllbnRJbmZvLnVpZCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIEF1ZGlvU2Vzc2lvbjo6c2V0SW5mb1Byb3ZpZGVyKEF1ZGlvU2Vzc2lvbkluZm9Qcm92aWRlciAqcHJvdmlkZXIpCi17Ci0gICAgbUluZm9Qcm92aWRlciA9IHByb3ZpZGVyOwotfQotCi12b2lkIEF1ZGlvU2Vzc2lvbjo6b25TZXNzaW9uSW5mb1VwZGF0ZSgpIGNvbnN0Ci17Ci0gICAgaWYgKG1BY3RpdmVDb3VudCA+IDApIHsKLSAgICAgICAgLy8gcmVzZW5kIHRoZSBjYWxsYmFjayBhZnRlciByZXF1ZXJ5aW5nIHRoZSBpbmZvcm1hdGlvbnMgZnJvbSB0aGUgaW5mbyBwcm92aWRlcgotICAgICAgICBjb25zdCBBdWRpb1Nlc3Npb25JbmZvUHJvdmlkZXIqIHByb3ZpZGVyID0gbUluZm9Qcm92aWRlcjsKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCBkZXZpY2VDb25maWcgPSAocHJvdmlkZXIgIT0gTlVMTCkgPyBwcm92aWRlci0+Z2V0Q29uZmlnKCkgOgotICAgICAgICAgICAgICAgIEFVRElPX0NPTkZJR19CQVNFX0lOSVRJQUxJWkVSOwotICAgICAgICBjb25zdCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSA9IChwcm92aWRlciAhPSBOVUxMKSA/IHByb3ZpZGVyLT5nZXRQYXRjaEhhbmRsZSgpIDoKLSAgICAgICAgICAgICAgICBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgaWYgKHBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBtQ2xpZW50SW50ZXJmYWNlLT5vblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoUkVDT1JEX0NPTkZJR19FVkVOVF9TVEFSVCwKLSAgICAgICAgICAgICAgICAgICAgJm1SZWNvcmRDbGllbnRJbmZvLCAmbUNvbmZpZywgJmRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOwotICAgICAgICB9Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1Nlc3Npb246OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnNBdWRpbyBzZXNzaW9uICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gc2Vzc2lvbjogJTJkXG4iLCBzcGFjZXMsICIiLCBtUmVjb3JkQ2xpZW50SW5mby5zZXNzaW9uKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBvd25lciB1aWQ6ICUyZFxuIiwgc3BhY2VzLCAiIiwgbVJlY29yZENsaWVudEluZm8udWlkKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBpbnB1dCBzb3VyY2U6ICVkXG4iLCBzcGFjZXMsICIiLCBtUmVjb3JkQ2xpZW50SW5mby5zb3VyY2UpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGZvcm1hdDogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbUNvbmZpZy5mb3JtYXQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIHNhbXBsZTogJWRcbiIsIHNwYWNlcywgIiIsIG1Db25maWcuc2FtcGxlX3JhdGUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGNoYW5uZWwgbWFzazogJTA4eFxuIiwKLSAgICAgICAgICAgICBzcGFjZXMsICIiLCBtQ29uZmlnLmNoYW5uZWxfbWFzayk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gaXMgc291bmR0cmlnZ2VyOiAlc1xuIiwKLSAgICAgICAgICAgICBzcGFjZXMsICIiLCBtSXNTb3VuZFRyaWdnZXIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBvcGVuIGNvdW50OiAlZFxuIiwgc3BhY2VzLCAiIiwgbU9wZW5Db3VudCk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gYWN0aXZlIGNvdW50OiAlZFxuIiwgc3BhY2VzLCAiIiwgbUFjdGl2ZUNvdW50KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLXN0YXR1c190IEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb246OmFkZFNlc3Npb24oYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4mIGF1ZGlvU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9TZXNzaW9uSW5mb1Byb3ZpZGVyICpwcm92aWRlcikKLXsKLSAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShzZXNzaW9uKTsKLQotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgIEFMT0dXKCJhZGRTZXNzaW9uKCkgc2Vzc2lvbiAlZCBhbHJlYWR5IGluIiwgc2Vzc2lvbik7Ci0gICAgICAgIHJldHVybiBBTFJFQURZX0VYSVNUUzsKLSAgICB9Ci0gICAgYXVkaW9TZXNzaW9uLT5zZXRJbmZvUHJvdmlkZXIocHJvdmlkZXIpOwotICAgIGFkZChzZXNzaW9uLCBhdWRpb1Nlc3Npb24pOwotICAgIEFMT0dWKCJhZGRTZXNzaW9uKCkgc2Vzc2lvbiAlZCAgY2xpZW50ICVkIHNvdXJjZSAlZCIsCi0gICAgICAgICAgICBzZXNzaW9uLCBhdWRpb1Nlc3Npb24tPnVpZCgpLCBhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCkpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotc3RhdHVzX3QgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6cmVtb3ZlU2Vzc2lvbihhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShzZXNzaW9uKTsKLQotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInJlbW92ZVNlc3Npb24oKSBzZXNzaW9uICVkIG5vdCBpbiIsIHNlc3Npb24pOwotICAgICAgICByZXR1cm4gQUxSRUFEWV9FWElTVFM7Ci0gICAgfQotICAgIEFMT0dWKCJyZW1vdmVTZXNzaW9uKCkgc2Vzc2lvbiAlZCIsIHNlc3Npb24pOwotICAgIHZhbHVlQXQoaW5kZXgpLT5zZXRJbmZvUHJvdmlkZXIoTlVMTCk7Ci0gICAgcmVtb3ZlSXRlbXNBdChpbmRleCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi11aW50MzJfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpnZXRPcGVuQ291bnQoKSBjb25zdAotewotICAgIHVpbnQzMl90IG9wZW5Db3VudCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBvcGVuQ291bnQgKz0gdmFsdWVBdChpKS0+b3BlbkNvdW50KCk7Ci0gICAgfQotICAgIHJldHVybiBvcGVuQ291bnQ7Ci19Ci0KLUF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gQXVkaW9TZXNzaW9uQ29sbGVjdGlvbjo6Z2V0QWN0aXZlU2Vzc2lvbnMoKSBjb25zdAotewotICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gYWN0aXZlU2Vzc2lvbnM7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAodmFsdWVBdChpKS0+YWN0aXZlQ291bnQoKSAhPSAwKSB7Ci0gICAgICAgICAgICBhY3RpdmVTZXNzaW9ucy5hZGQodmFsdWVBdChpKS0+c2Vzc2lvbigpLCB2YWx1ZUF0KGkpKTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYWN0aXZlU2Vzc2lvbnM7Ci19Ci0KLXNpemVfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpnZXRBY3RpdmVTZXNzaW9uQ291bnQoKSBjb25zdAotewotICAgIHNpemVfdCBhY3RpdmVDb3VudCA9IDA7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAodmFsdWVBdChpKS0+YWN0aXZlQ291bnQoKSAhPSAwKSB7Ci0gICAgICAgICAgICBhY3RpdmVDb3VudCsrOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBhY3RpdmVDb3VudDsKLX0KLQotYm9vbCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpoYXNBY3RpdmVTZXNzaW9uKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0QWN0aXZlU2Vzc2lvbkNvdW50KCkgIT0gMDsKLX0KLQotYm9vbCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjppc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0Ci17Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+ICBhdWRpb1Nlc3Npb24gPSB2YWx1ZUF0KGkpOwotICAgICAgICAvLyBBVURJT19TT1VSQ0VfSE9UV09SRCBpcyBlcXVpdmFsZW50IHRvIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiBvbmx5IGlmIGl0Ci0gICAgICAgIC8vIGNvcnJlc3BvbmRzIHRvIGFuIGFjdGl2ZSBjYXB0dXJlIHRyaWdnZXJlZCBieSBhIGhhcmR3YXJlIGhvdHdvcmQgcmVjb2duaXRpb24KLSAgICAgICAgaWYgKGF1ZGlvU2Vzc2lvbi0+YWN0aXZlQ291bnQoKSA+IDAgJiYKLSAgICAgICAgICAgICAgICAoKGF1ZGlvU2Vzc2lvbi0+aW5wdXRTb3VyY2UoKSA9PSBzb3VyY2UpIHx8Ci0gICAgICAgICAgICAgICAgKChzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSAmJgotICAgICAgICAgICAgICAgICAoYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJgotICAgICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24tPmlzU291bmRUcmlnZ2VyKCkpKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi1hdWRpb19zb3VyY2VfdCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpnZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoYm9vbCBhY3RpdmVPbmx5KSBjb25zdAotewotICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IEFVRElPX1NPVVJDRV9ERUZBVUxUOwotICAgIGludDMyX3QgcHJpb3JpdHkgPSAtMTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgY29uc3Qgc3A8QXVkaW9TZXNzaW9uPiAgYXVkaW9TZXNzaW9uID0gdmFsdWVBdChpKTsKLSAgICAgICAgaWYgKGFjdGl2ZU9ubHkgJiYgYXVkaW9TZXNzaW9uLT5hY3RpdmVDb3VudCgpID09IDApIHsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGludDMyX3QgY3VyUHJpb3JpdHkgPSBzb3VyY2VfcHJpb3JpdHkoYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpKTsKLSAgICAgICAgaWYgKGN1clByaW9yaXR5ID4gcHJpb3JpdHkpIHsKLSAgICAgICAgICAgIHByaW9yaXR5ID0gY3VyUHJpb3JpdHk7Ci0gICAgICAgICAgICBzb3VyY2UgPSBhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHNvdXJjZTsKLX0KLQotdm9pZCBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uOjpvblNlc3Npb25JbmZvVXBkYXRlKCkgY29uc3QKLXsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHZhbHVlQXQoaSktPm9uU2Vzc2lvbkluZm9VcGRhdGUoKTsKLSAgICB9Ci19Ci0KLXN0YXR1c190IEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb246OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqc0F1ZGlvIFNlc3Npb25zOlxuIiwgc3BhY2VzLCAiIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCwgc3BhY2VzICsgMiwgaSk7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0F1ZGlvU291cmNlRGVzY3JpcHRvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMzNlNTcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQXVkaW9Tb3VyY2VEZXNjcmlwdG9yLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Tb3VyY2VEZXNjcmlwdG9yIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+Ci0jaW5jbHVkZSA8SHdNb2R1bGUuaD4KLSNpbmNsdWRlIDxBdWRpb0dhaW4uaD4KLSNpbmNsdWRlIDxBdWRpb1NvdXJjZURlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8SU9Qcm9maWxlLmg+Ci0jaW5jbHVkZSA8QXVkaW9PdXRwdXREZXNjcmlwdG9yLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotc3RhdHVzX3QgQXVkaW9Tb3VyY2VEZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIm1TdHJlYW06ICVkXG4iLCBhdWRpb19hdHRyaWJ1dGVzX3RvX3N0cmVhbV90eXBlKCZtQXR0cmlidXRlcykpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJtRGV2aWNlOlxuIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIG1EZXZpY2UtPmR1bXAoZmQsIDIgLCAwKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLQotc3RhdHVzX3QgQXVkaW9Tb3VyY2VDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuQXVkaW8gc291cmNlcyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBTb3VyY2UgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLX07IC8vbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NsaWVudERlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ2xpZW50RGVzY3JpcHRvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU4MjJiOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NsaWVudERlc2NyaXB0b3IuY3BwCkBAIC0wLDAgKzEsMTIwIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE1fQ2xpZW50RGVzY3JpcHRvciIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPFR5cGVDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlICJBdWRpb091dHB1dERlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJBdWRpb1BhdGNoLmgiCisjaW5jbHVkZSAiQ2xpZW50RGVzY3JpcHRvci5oIgorI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJId01vZHVsZS5oIgorI2luY2x1ZGUgIklPUHJvZmlsZS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3N0ZDo6c3RyaW5nIENsaWVudERlc2NyaXB0b3I6OnRvU2hvcnRTdHJpbmcoKSBjb25zdAoreworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworCisgICAgc3MgPDwgIlBvcnRJZDogIiA8PCBtUG9ydElkIDw8ICIgU2Vzc2lvbklkOiAiIDw8IG1TZXNzaW9uSWQgPDwgIiBVaWQ6ICIgPDwgbVVpZDsKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzQ2xpZW50ICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gUG9ydCBJZDogJWQgU2Vzc2lvbiBJZDogJWQgVUlEOiAlZFxuIiwgc3BhY2VzLCAiIiwKKyAgICAgICAgICAgICBtUG9ydElkLCBtU2Vzc2lvbklkLCBtVWlkKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBGb3JtYXQ6ICUwOHggU2FtcGxpbmcgcmF0ZTogJWQgQ2hhbm5lbHM6ICUwOHhcbiIsIHNwYWNlcywgIiIsCisgICAgICAgICAgICAgbUNvbmZpZy5mb3JtYXQsIG1Db25maWcuc2FtcGxlX3JhdGUsIG1Db25maWcuY2hhbm5lbF9tYXNrKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBBdHRyaWJ1dGVzOiAlc1xuIiwgc3BhY2VzLCAiIiwgdG9TdHJpbmcobUF0dHJpYnV0ZXMpLmNfc3RyKCkpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFByZWZlcnJlZCBEZXZpY2UgSWQ6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1QcmVmZXJyZWREZXZpY2VJZCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU3RhdGU6ICVzXG4iLCBzcGFjZXMsICIiLCBtQWN0aXZlID8gIkFjdGl2ZSIgOiAiSW5hY3RpdmUiKTsKK30KKwordm9pZCBUcmFja0NsaWVudERlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgpIGNvbnN0Cit7CisgICAgQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChkc3QsIHNwYWNlcywgaW5kZXgpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMtIFN0cmVhbTogJWQgZmxhZ3M6ICUwOHhcbiIsIHNwYWNlcywgIiIsIG1TdHJlYW0sIG1GbGFncyk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gUmVmY291bnQ6ICVkXG4iLCBzcGFjZXMsICIiLCBtQWN0aXZpdHlDb3VudCk7Cit9CisKK3N0ZDo6c3RyaW5nIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjo6dG9TaG9ydFN0cmluZygpIGNvbnN0Cit7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisKKyAgICBzcyA8PCBDbGllbnREZXNjcmlwdG9yOjp0b1Nob3J0U3RyaW5nKCkgPDwgIiBTdHJlYW06ICIgPDwgbVN0cmVhbTsKKyAgICByZXR1cm4gc3Muc3RyKCk7Cit9CisKK3ZvaWQgUmVjb3JkQ2xpZW50RGVzY3JpcHRvcjo6dHJhY2tFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3QsIGJvb2wgZW5hYmxlZCkKK3sKKyAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBtRW5hYmxlZEVmZmVjdHMucmVwbGFjZVZhbHVlRm9yKGVmZmVjdC0+bUlkLCBlZmZlY3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1FbmFibGVkRWZmZWN0cy5yZW1vdmVJdGVtKGVmZmVjdC0+bUlkKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVjb3JkQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBDbGllbnREZXNjcmlwdG9yOjpkdW1wKGRzdCwgc3BhY2VzLCBpbmRleCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gU291cmNlOiAlZCBmbGFnczogJTA4eFxuIiwgc3BhY2VzLCAiIiwgbVNvdXJjZSwgbUZsYWdzKTsKKyAgICBtRW5hYmxlZEVmZmVjdHMuZHVtcChkc3QsIHNwYWNlcyArIDIgLypzcGFjZXMqLywgZmFsc2UgLyp2ZXJib3NlKi8pOworfQorCitTb3VyY2VDbGllbnREZXNjcmlwdG9yOjpTb3VyY2VDbGllbnREZXNjcmlwdG9yKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkLCB1aWRfdCB1aWQsCisgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICZjb25maWcsCisgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgc3JjRGV2aWNlLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSkgOgorICAgIFRyYWNrQ2xpZW50RGVzY3JpcHRvcjo6VHJhY2tDbGllbnREZXNjcmlwdG9yKHBvcnRJZCwgdWlkLCBBVURJT19TRVNTSU9OX05PTkUsIGF0dHJpYnV0ZXMsCisgICAgICAgIHtjb25maWcuc2FtcGxlX3JhdGUsIGNvbmZpZy5jaGFubmVsX21hc2ssIGNvbmZpZy5mb3JtYXR9LCBBVURJT19QT1JUX0hBTkRMRV9OT05FLAorICAgICAgICBzdHJlYW0sIHN0cmF0ZWd5LCB2b2x1bWVTb3VyY2UsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsIGZhbHNlLAorICAgICAgICB7fSAvKiBTb3VyY2VzIGRvIG5vdCBzdXBwb3J0IHNlY29uZGFyeSBvdXRwdXRzKi8pLCBtU3JjRGV2aWNlKHNyY0RldmljZSkKK3sKK30KKwordm9pZCBTb3VyY2VDbGllbnREZXNjcmlwdG9yOjpzZXRTd091dHB1dChjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIHN3T3V0cHV0KQoreworICAgIG1Td091dHB1dCA9IHN3T3V0cHV0OworfQorCit2b2lkIFNvdXJjZUNsaWVudERlc2NyaXB0b3I6OnNldEh3T3V0cHV0KGNvbnN0IHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgaHdPdXRwdXQpCit7CisgICAgbUh3T3V0cHV0ID0gaHdPdXRwdXQ7Cit9CisKK3ZvaWQgU291cmNlQ2xpZW50RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGludCBpbmRleCkgY29uc3QKK3sKKyAgICBUcmFja0NsaWVudERlc2NyaXB0b3I6OmR1bXAoZHN0LCBzcGFjZXMsIGluZGV4KTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzLSBEZXZpY2U6XG4iLCBzcGFjZXMsICIiKTsKKyAgICBtU3JjRGV2aWNlLT5kdW1wKGRzdCwgMiwgMCk7Cit9CisKK3ZvaWQgU291cmNlQ2xpZW50Q29sbGVjdGlvbjo6ZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgZHN0LT5hcHBlbmQoIlxuQXVkaW8gc291cmNlczpcbiIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIDIsIGkpOworICAgIH0KK30KKworfTsgLy9uYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0NvbmZpZ1BhcnNpbmdVdGlscy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMTA1ZjUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvQ29uZmlnUGFyc2luZ1V0aWxzLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE06OkNvbmZpZ1BhcnNpbmdVdGlscyIKLS8vI2RlZmluZSBMT0dfTkRFQlVHIDAKLQotI2luY2x1ZGUgIkNvbmZpZ1BhcnNpbmdVdGlscy5oIgotI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgotI2luY2x1ZGUgIklPUHJvZmlsZS5oIgotI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+Ci0jaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tIGF1ZGlvX3BvbGljeS5jb25mIGZpbGUgcGFyc2luZwotCi0vL3N0YXRpYwotdm9pZCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRBdWRpb1BvcnRHYWluKGNub2RlICpyb290LCBBdWRpb1BvcnQgJmF1ZGlvUG9ydCwgaW50IGluZGV4KQotewotICAgIGNub2RlICpub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7Ci0KLSAgICBzcDxBdWRpb0dhaW4+IGdhaW4gPSBuZXcgQXVkaW9HYWluKGluZGV4LCBhdWRpb1BvcnQudXNlSW5wdXRDaGFubmVsTWFzaygpKTsKLQotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NT0RFKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXRNb2RlKEdhaW5Nb2RlQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhub2RlLT52YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX0NIQU5ORUxTKSA9PSAwKSB7Ci0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBtYXNrOwotICAgICAgICAgICAgaWYgKGF1ZGlvUG9ydC51c2VJbnB1dENoYW5uZWxNYXNrKCkpIHsKLSAgICAgICAgICAgICAgICBpZiAoSW5wdXRDaGFubmVsQ29udmVydGVyOjpmcm9tU3RyaW5nKG5vZGUtPnZhbHVlLCBtYXNrKSkgewotICAgICAgICAgICAgICAgICAgICBnYWluLT5zZXRDaGFubmVsTWFzayhtYXNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChPdXRwdXRDaGFubmVsQ29udmVydGVyOjpmcm9tU3RyaW5nKG5vZGUtPnZhbHVlLCBtYXNrKSkgewotICAgICAgICAgICAgICAgICAgICBnYWluLT5zZXRDaGFubmVsTWFzayhtYXNrKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5fTUlOX1ZBTFVFKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXRNaW5WYWx1ZUluTWIoYXRvaShub2RlLT52YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01BWF9WQUxVRSkgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+c2V0TWF4VmFsdWVJbk1iKGF0b2kobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9ERUZBVUxUX1ZBTFVFKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXREZWZhdWx0VmFsdWVJbk1iKGF0b2kobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9TVEVQX1ZBTFVFKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXRTdGVwVmFsdWVJbk1iKGF0b2kobm9kZS0+dmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgR0FJTl9NSU5fUkFNUF9NUykgPT0gMCkgewotICAgICAgICAgICAgZ2Fpbi0+c2V0TWluUmFtcEluTXMoYXRvaShub2RlLT52YWx1ZSkpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBHQUlOX01BWF9SQU1QX01TKSA9PSAwKSB7Ci0gICAgICAgICAgICBnYWluLT5zZXRNYXhSYW1wSW5NcyhhdG9pKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgIH0KLSAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgfQotCi0gICAgQUxPR1YoImxvYWRHYWluKCkgYWRkaW5nIG5ldyBnYWluIG1vZGUgJTA4eCBjaGFubmVsIG1hc2sgJTA4eCBtaW4gbUIgJWQgbWF4IG1CICVkIiwKLSAgICAgICAgICBnYWluLT5nZXRNb2RlKCksIGdhaW4tPmdldENoYW5uZWxNYXNrKCksIGdhaW4tPmdldE1pblZhbHVlSW5NYigpLAotICAgICAgICAgIGdhaW4tPmdldE1heFZhbHVlSW5NYigpKTsKLQotICAgIGlmIChnYWluLT5nZXRNb2RlKCkgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGF1ZGlvUG9ydC5tR2FpbnMuYWRkKGdhaW4pOwotfQotCi12b2lkIENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEF1ZGlvUG9ydEdhaW5zKGNub2RlICpyb290LCBBdWRpb1BvcnQgJmF1ZGlvUG9ydCkKLXsKLSAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotICAgIGludCBpbmRleCA9IDA7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgQUxPR1YoImxvYWRHYWlucygpIGxvYWRpbmcgZ2FpbiAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICBsb2FkQXVkaW9Qb3J0R2Fpbihub2RlLCBhdWRpb1BvcnQsIGluZGV4KyspOwotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci19Ci0KLS8vc3RhdGljCi12b2lkIENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZERldmljZURlc2NyaXB0b3JHYWlucyhjbm9kZSAqcm9vdCwgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZURlc2MpCi17Ci0gICAgbG9hZEF1ZGlvUG9ydEdhaW5zKHJvb3QsICpkZXZpY2VEZXNjKTsKLSAgICBpZiAoZGV2aWNlRGVzYy0+bUdhaW5zLnNpemUoKSA+IDApIHsKLSAgICAgICAgZGV2aWNlRGVzYy0+bUdhaW5zWzBdLT5nZXREZWZhdWx0Q29uZmlnKCZkZXZpY2VEZXNjLT5tR2Fpbik7Ci0gICAgfQotfQotCi0vL3N0YXRpYwotc3RhdHVzX3QgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkSHdNb2R1bGVEZXZpY2UoY25vZGUgKnJvb3QsIERldmljZVZlY3RvciAmZGV2aWNlcykKLXsKLSAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotCi0gICAgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEFQTV9ERVZJQ0VfVFlQRSkgPT0gMCkgewotICAgICAgICAgICAgZGV2aWNlRnJvbVN0cmluZyhub2RlLT52YWx1ZSwgdHlwZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgaWYgKHR5cGUgPT0gQVVESU9fREVWSUNFX05PTkUgfHwKLSAgICAgICAgICAgICghYXVkaW9faXNfaW5wdXRfZGV2aWNlKHR5cGUpICYmICFhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpKSkgewotICAgICAgICBBTE9HVygibG9hZERldmljZSgpIGJhZCB0eXBlICUwOHgiLCB0eXBlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKHR5cGUsIFN0cmluZzgocm9vdC0+bmFtZSkpOwotCi0gICAgbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgQVBNX0RFVklDRV9BRERSRVNTKSA9PSAwKSB7Ci0gICAgICAgICAgICBkZXZpY2VEZXNjLT5tQWRkcmVzcyA9IFN0cmluZzgoKGNoYXIgKilub2RlLT52YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIENIQU5ORUxTX1RBRykgPT0gMCkgewotICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZSh0eXBlKSkgewotICAgICAgICAgICAgICAgIGRldmljZURlc2MtPmFkZEF1ZGlvUHJvZmlsZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBdWRpb1Byb2ZpbGUoZ0R5bmFtaWNGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0Q2hhbm5lbE1hc2tzRnJvbVN0cmluZyhub2RlLT52YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZVJhdGVWZWN0b3IoKSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VEZXNjLT5hZGRBdWRpb1Byb2ZpbGUoCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXcgQXVkaW9Qcm9maWxlKGdEeW5hbWljRm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRDaGFubmVsTWFza3NGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlUmF0ZVZlY3RvcigpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5TX1RBRykgPT0gMCkgewotICAgICAgICAgICAgbG9hZERldmljZURlc2NyaXB0b3JHYWlucyhub2RlLCBkZXZpY2VEZXNjKTsKLSAgICAgICAgfQotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0KLSAgICBBTE9HVigibG9hZERldmljZSgpIGFkZGluZyBkZXZpY2UgdGFnIChsaXRlcmFsIHR5cGUpICVzIHR5cGUgJTA4eCBhZGRyZXNzICVzIiwKLSAgICAgICAgICBkZXZpY2VEZXNjLT5nZXRUYWdOYW1lKCkuc3RyaW5nKCksIHR5cGUsIGRldmljZURlc2MtPm1BZGRyZXNzLnN0cmluZygpKTsKLQotICAgIGRldmljZXMuYWRkKGRldmljZURlc2MpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLy9zdGF0aWMKLXN0YXR1c190IENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZEh3TW9kdWxlUHJvZmlsZShjbm9kZSAqcm9vdCwgc3A8SHdNb2R1bGU+ICZtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSkKLXsKLSAgICBjbm9kZSAqbm9kZSA9IHJvb3QtPmZpcnN0X2NoaWxkOwotCi0gICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbmV3IElPUHJvZmlsZShTdHJpbmc4KHJvb3QtPm5hbWUpLCByb2xlKTsKLQotICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBhdWRpb1Byb2ZpbGVzOwotICAgIFNhbXBsZVJhdGVWZWN0b3Igc2FtcGxlUmF0ZXM7Ci0gICAgQ2hhbm5lbHNWZWN0b3IgY2hhbm5lbHM7Ci0gICAgRm9ybWF0VmVjdG9yIGZvcm1hdHM7Ci0KLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZPUk1BVFNfVEFHKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgc3RyY21wKG5vZGUtPnZhbHVlLCBEWU5BTUlDX1ZBTFVFX1RBRykgIT0gMCkgewotICAgICAgICAgICAgZm9ybWF0cyA9IGZvcm1hdHNGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgU0FNUExJTkdfUkFURVNfVEFHKSA9PSAwICYmCi0gICAgICAgICAgICAgICAgICBzdHJjbXAobm9kZS0+dmFsdWUsIERZTkFNSUNfVkFMVUVfVEFHKSAhPSAwKSB7Ci0gICAgICAgICAgICBjb2xsZWN0aW9uRnJvbVN0cmluZzxTYW1wbGVSYXRlVHJhaXRzPihub2RlLT52YWx1ZSwgc2FtcGxlUmF0ZXMpOwotICAgICAgICB9IGVsc2UgaWYgKHN0cmNtcChub2RlLT5uYW1lLCBDSEFOTkVMU19UQUcpID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICBzdHJjbXAobm9kZS0+dmFsdWUsIERZTkFNSUNfVkFMVUVfVEFHKSAhPSAwKSB7Ci0gICAgICAgICAgICBpZiAocm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSykgewotICAgICAgICAgICAgICAgIGNoYW5uZWxzID0gaW5wdXRDaGFubmVsTWFza3NGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2hhbm5lbHMgPSBvdXRwdXRDaGFubmVsTWFza3NGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAobm9kZS0+bmFtZSwgREVWSUNFU19UQUcpID09IDApIHsKLSAgICAgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VzOwotICAgICAgICAgICAgbG9hZERldmljZXNGcm9tVGFnKG5vZGUtPnZhbHVlLCBkZXZpY2VzLCBtb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpKTsKLSAgICAgICAgICAgIHByb2ZpbGUtPnNldFN1cHBvcnRlZERldmljZXMoZGV2aWNlcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEZMQUdTX1RBRykgPT0gMCkgewotICAgICAgICAgICAgaWYgKHJvbGUgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKLSAgICAgICAgICAgICAgICBwcm9maWxlLT5zZXRGbGFncyhJbnB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHByb2ZpbGUtPnNldEZsYWdzKE91dHB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKG5vZGUtPnZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKG5vZGUtPm5hbWUsIEdBSU5TX1RBRykgPT0gMCkgewotICAgICAgICAgICAgbG9hZEF1ZGlvUG9ydEdhaW5zKG5vZGUsICpwcm9maWxlKTsKLSAgICAgICAgfQotICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICB9Ci0gICAgaWYgKGZvcm1hdHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZVRvQWRkID0gbmV3IEF1ZGlvUHJvZmlsZShnRHluYW1pY0Zvcm1hdCwgY2hhbm5lbHMsIHNhbXBsZVJhdGVzKTsKLSAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KHRydWUpOwotICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNDaGFubmVscyhjaGFubmVscy5pc0VtcHR5KCkpOwotICAgICAgICBwcm9maWxlVG9BZGQtPnNldER5bmFtaWNSYXRlKHNhbXBsZVJhdGVzLmlzRW1wdHkoKSk7Ci0gICAgICAgIGF1ZGlvUHJvZmlsZXMuYWRkKHByb2ZpbGVUb0FkZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmb3JtYXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAvLyBGb3IgY29tcGF0aWJpbGl0eSByZWFzb24sIGZvciBlYWNoIGZvcm1hdCwgY3JlYXRlcyBhIHByb2ZpbGUgd2l0aCB0aGUgc2FtZQotICAgICAgICAgICAgLy8gY29sbGVjdGlvbiBvZiByYXRlIGFuZCBjaGFubmVscy4KLSAgICAgICAgICAgIHNwPEF1ZGlvUHJvZmlsZT4gcHJvZmlsZVRvQWRkID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXRzW2ldLCBjaGFubmVscywgc2FtcGxlUmF0ZXMpOwotICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljRm9ybWF0KGZvcm1hdHNbaV0gPT0gZ0R5bmFtaWNGb3JtYXQpOwotICAgICAgICAgICAgcHJvZmlsZVRvQWRkLT5zZXREeW5hbWljQ2hhbm5lbHMoY2hhbm5lbHMuaXNFbXB0eSgpKTsKLSAgICAgICAgICAgIHByb2ZpbGVUb0FkZC0+c2V0RHluYW1pY1JhdGUoc2FtcGxlUmF0ZXMuaXNFbXB0eSgpKTsKLSAgICAgICAgICAgIGF1ZGlvUHJvZmlsZXMuYWRkKHByb2ZpbGVUb0FkZCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcHJvZmlsZS0+c2V0QXVkaW9Qcm9maWxlcyhhdWRpb1Byb2ZpbGVzKTsKLSAgICBBTE9HV19JRighcHJvZmlsZS0+aGFzU3VwcG9ydGVkRGV2aWNlcygpLCAibG9hZCVzKCkgaW52YWxpZCBzdXBwb3J0ZWQgZGV2aWNlcyIsCi0gICAgICAgICAgICAgcm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSyA/ICJJbnB1dCIgOiAiT3V0cHV0Iik7Ci0gICAgaWYgKHByb2ZpbGUtPmhhc1N1cHBvcnRlZERldmljZXMoKSkgewotICAgICAgICBBTE9HVigibG9hZCVzKCkgYWRkaW5nIFN1cHBvcnRlZCBEZXZpY2VzICUwNHgsIG1GbGFncyAlMDR4IiwKLSAgICAgICAgICAgICAgcm9sZSA9PSBBVURJT19QT1JUX1JPTEVfU0lOSyA/ICJJbnB1dCIgOiAiT3V0cHV0IiwKLSAgICAgICAgICAgICAgcHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlc1R5cGUoKSwgcHJvZmlsZS0+Z2V0RmxhZ3MoKSk7Ci0gICAgICAgIHJldHVybiBtb2R1bGUtPmFkZFByb2ZpbGUocHJvZmlsZSk7Ci0gICAgfQotICAgIHJldHVybiBCQURfVkFMVUU7Ci19Ci0KLS8vc3RhdGljCi1zdGF0dXNfdCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRId01vZHVsZShjbm9kZSAqcm9vdCwgc3A8SHdNb2R1bGU+ICZtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKQotewotICAgIHN0YXR1c190IHN0YXR1cyA9IE5BTUVfTk9UX0ZPVU5EOwotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgREVWSUNFU19UQUcpOwotICAgIGlmIChub2RlICE9IE5VTEwpIHsKLSAgICAgICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKLSAgICAgICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIGRldmljZSAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbG9hZEh3TW9kdWxlRGV2aWNlKG5vZGUsIGRldmljZXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgfQotICAgICAgICBtb2R1bGUtPnNldERlY2xhcmVkRGV2aWNlcyhkZXZpY2VzKTsKLSAgICB9Ci0gICAgbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIE9VVFBVVFNfVEFHKTsKLSAgICBpZiAobm9kZSAhPSBOVUxMKSB7Ci0gICAgICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICAgICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkSHdNb2R1bGUoKSBsb2FkaW5nIG91dHB1dCAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbG9hZEh3TW9kdWxlUHJvZmlsZShub2RlLCBtb2R1bGUsIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOQU1FX05PVF9GT1VORCB8fCBzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSB0bXBTdGF0dXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBub2RlID0gbm9kZS0+bmV4dDsKLSAgICAgICAgfQotICAgIH0KLSAgICBub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgSU5QVVRTX1RBRyk7Ci0gICAgaWYgKG5vZGUgIT0gTlVMTCkgewotICAgICAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEh3TW9kdWxlKCkgbG9hZGluZyBpbnB1dCAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICAgICAgc3RhdHVzX3QgdG1wU3RhdHVzID0gbG9hZEh3TW9kdWxlUHJvZmlsZShub2RlLCBtb2R1bGUsIEFVRElPX1BPUlRfUk9MRV9TSU5LKTsKLSAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTkFNRV9OT1RfRk9VTkQgfHwgc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgc3RhdHVzID0gdG1wU3RhdHVzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgbm9kZSA9IG5vZGUtPm5leHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbG9hZE1vZHVsZUdsb2JhbENvbmZpZyhyb290LCBtb2R1bGUsIGNvbmZpZyk7Ci0gICAgcmV0dXJuIHN0YXR1czsKLX0KLQotLy9zdGF0aWMKLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkSHdNb2R1bGVzKGNub2RlICpyb290LCBId01vZHVsZUNvbGxlY3Rpb24gJmh3TW9kdWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpCi17Ci0gICAgY25vZGUgKm5vZGUgPSBjb25maWdfZmluZChyb290LCBBVURJT19IV19NT0RVTEVfVEFHKTsKLSAgICBpZiAobm9kZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBub2RlID0gbm9kZS0+Zmlyc3RfY2hpbGQ7Ci0gICAgd2hpbGUgKG5vZGUpIHsKLSAgICAgICAgQUxPR1YoImxvYWRId01vZHVsZXMoKSBsb2FkaW5nIG1vZHVsZSAlcyIsIG5vZGUtPm5hbWUpOwotICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbmV3IEh3TW9kdWxlKG5vZGUtPm5hbWUpOwotICAgICAgICBpZiAobG9hZEh3TW9kdWxlKG5vZGUsIG1vZHVsZSwgY29uZmlnKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgaHdNb2R1bGVzLmFkZChtb2R1bGUpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLX0KLQotLy9zdGF0aWMKLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkRGV2aWNlc0Zyb21UYWcoY29uc3QgY2hhciAqdGFnLCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGVjbGFyZWREZXZpY2VzKQotewotICAgIGNoYXIgKnRhZ0xpdGVyYWwgPSBzdHJuZHVwKHRhZywgc3RybGVuKHRhZykpOwotICAgIGNoYXIgKmRldlRhZyA9IHN0cnRvayh0YWdMaXRlcmFsLCBBdWRpb1BhcmFtZXRlcjo6dmFsdWVMaXN0U2VwYXJhdG9yKTsKLSAgICB3aGlsZSAoZGV2VGFnICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHN0cmxlbihkZXZUYWcpICE9IDApIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlOwotICAgICAgICAgICAgaWYgKGRldmljZUZyb21TdHJpbmcoZGV2VGFnLCB0eXBlKSkgewotICAgICAgICAgICAgICAgIHVpbnQzMl90IGluQml0ID0gdHlwZSAmIEFVRElPX0RFVklDRV9CSVRfSU47Ci0gICAgICAgICAgICAgICAgdHlwZSAmPSB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICAgICAgICAgICAgICB3aGlsZSAodHlwZSkgewotICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHNpbmdsZVR5cGUgPQotICAgICAgICAgICAgICAgICAgICAgICAgaW5CaXQgfCAoMSA8PCAoMzEgLSBfX2J1aWx0aW5fY2x6KHR5cGUpKSk7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGUgJj0gfnNpbmdsZVR5cGU7Ci0gICAgICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldiA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKHNpbmdsZVR5cGUpOwotICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXYpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWNsYXJlZERldmljZXMuZ2V0RGV2aWNlRnJvbVRhZ05hbWUoU3RyaW5nOChkZXZUYWcpKTsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlRGVzYyAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldmljZXMuYWRkKGRldmljZURlc2MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBkZXZUYWcgPSBzdHJ0b2soTlVMTCwgQXVkaW9QYXJhbWV0ZXI6OnZhbHVlTGlzdFNlcGFyYXRvcik7Ci0gICAgfQotICAgIGZyZWUodGFnTGl0ZXJhbCk7Ci19Ci0KLS8vc3RhdGljCi12b2lkIENvbmZpZ1BhcnNpbmdVdGlsczo6bG9hZE1vZHVsZUdsb2JhbENvbmZpZyhjbm9kZSAqcm9vdCwgY29uc3Qgc3A8SHdNb2R1bGU+ICZtb2R1bGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnKQotewotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgR0xPQkFMX0NPTkZJR19UQUcpOwotCi0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIERldmljZVZlY3RvciBkZWNsYXJlZERldmljZXM7Ci0gICAgaWYgKG1vZHVsZSAhPSBOVUxMKSB7Ci0gICAgICAgIGRlY2xhcmVkRGV2aWNlcyA9IG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCk7Ci0gICAgfQotCi0gICAgbm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOwotICAgIHdoaWxlIChub2RlKSB7Ci0gICAgICAgIGlmIChzdHJjbXAoQVRUQUNIRURfT1VUUFVUX0RFVklDRVNfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlT3V0cHV0RGV2aWNlczsKLSAgICAgICAgICAgIGxvYWREZXZpY2VzRnJvbVRhZyhub2RlLT52YWx1ZSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgZGVjbGFyZWREZXZpY2VzKTsKLSAgICAgICAgICAgIEFMT0dWKCJsb2FkR2xvYmFsQ29uZmlnKCkgQXR0YWNoZWQgT3V0cHV0IERldmljZXMgJTA4eCIsCi0gICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkpOwotICAgICAgICAgICAgY29uZmlnLmFkZEF2YWlsYWJsZU91dHB1dERldmljZXMoYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKERFRkFVTFRfT1VUUFVUX0RFVklDRV9UQUcsIG5vZGUtPm5hbWUpID09IDApIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICAgICAgICAgIGRldmljZUZyb21TdHJpbmcobm9kZS0+dmFsdWUsIGRldmljZSk7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGVmYXVsdE91dHB1dERldmljZSA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKGRldmljZSk7Ci0gICAgICAgICAgICAgICAgY29uZmlnLnNldERlZmF1bHRPdXRwdXREZXZpY2UoZGVmYXVsdE91dHB1dERldmljZSk7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBtRGVmYXVsdE91dHB1dERldmljZSAlMDh4IiwgZGVmYXVsdE91dHB1dERldmljZS0+dHlwZSgpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImxvYWRHbG9iYWxDb25maWcoKSBkZWZhdWx0IGRldmljZSBub3Qgc3BlY2lmaWVkIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyY21wKEFUVEFDSEVEX0lOUFVUX0RFVklDRVNfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzOwotICAgICAgICAgICAgbG9hZERldmljZXNGcm9tVGFnKG5vZGUtPnZhbHVlLCBhdmFpbGFibGVJbnB1dERldmljZXMsIGRlY2xhcmVkRGV2aWNlcyk7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIEF2YWlsYWJsZSBJbnB1dERldmljZXMgJTA4eCIsIGF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpKTsKLSAgICAgICAgICAgIGNvbmZpZy5hZGRBdmFpbGFibGVJbnB1dERldmljZXMoYXZhaWxhYmxlSW5wdXREZXZpY2VzKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHJjbXAoQVVESU9fSEFMX1ZFUlNJT05fVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICB1aW50MzJfdCBtYWpvciwgbWlub3I7Ci0gICAgICAgICAgICBzc2NhbmYoKGNoYXIgKilub2RlLT52YWx1ZSwgIiV1LiV1IiwgJm1ham9yLCAmbWlub3IpOwotICAgICAgICAgICAgbW9kdWxlLT5zZXRIYWxWZXJzaW9uKG1ham9yLCBtaW5vcik7Ci0gICAgICAgICAgICBBTE9HVigibG9hZEdsb2JhbENvbmZpZygpIG1IYWxWZXJzaW9uID0gbWFqb3IgJXUgbWlub3IgJXUiLCBtYWpvciwgbWlub3IpOwotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLX0KLQotLy9zdGF0aWMKLXZvaWQgQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkR2xvYmFsQ29uZmlnKGNub2RlICpyb290LCBBdWRpb1BvbGljeUNvbmZpZyAmY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SHdNb2R1bGU+JiBwcmltYXJ5TW9kdWxlKQotewotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgR0xPQkFMX0NPTkZJR19UQUcpOwotCi0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIG5vZGUgPSBub2RlLT5maXJzdF9jaGlsZDsKLSAgICB3aGlsZSAobm9kZSkgewotICAgICAgICBpZiAoc3RyY21wKFNQRUFLRVJfRFJDX0VOQUJMRURfVEFHLCBub2RlLT5uYW1lKSA9PSAwKSB7Ci0gICAgICAgICAgICBib29sIHNwZWFrZXJEcmNFbmFibGVkOwotICAgICAgICAgICAgaWYgKHV0aWxpdGllczo6Y29udmVydFRvPHN0ZDo6c3RyaW5nLCBib29sPihub2RlLT52YWx1ZSwgc3BlYWtlckRyY0VuYWJsZWQpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImxvYWRHbG9iYWxDb25maWcoKSBtU3BlYWtlckRyY0VuYWJsZWQgPSAlZCIsIHNwZWFrZXJEcmNFbmFibGVkKTsKLSAgICAgICAgICAgICAgICBjb25maWcuc2V0U3BlYWtlckRyY0VuYWJsZWQoc3BlYWtlckRyY0VuYWJsZWQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIG5vZGUgPSBub2RlLT5uZXh0OwotICAgIH0KLSAgICBsb2FkTW9kdWxlR2xvYmFsQ29uZmlnKHJvb3QsIHByaW1hcnlNb2R1bGUsIGNvbmZpZyk7Ci19Ci0KLS8vc3RhdGljCi1zdGF0dXNfdCBDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRDb25maWcoY29uc3QgY2hhciAqcGF0aCwgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZykKLXsKLSAgICBjbm9kZSAqcm9vdDsKLSAgICBjaGFyICpkYXRhOwotCi0gICAgZGF0YSA9IChjaGFyICopbG9hZF9maWxlKHBhdGgsIE5VTEwpOwotICAgIGlmIChkYXRhID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJvb3QgPSBjb25maWdfbm9kZSgiIiwgIiIpOwotICAgIGNvbmZpZ19sb2FkKHJvb3QsIGRhdGEpOwotCi0gICAgSHdNb2R1bGVDb2xsZWN0aW9uIGh3TW9kdWxlczsKLSAgICBsb2FkSHdNb2R1bGVzKHJvb3QsIGh3TW9kdWxlcywgY29uZmlnKTsKLQotICAgIC8vIGxlZ2FjeSBhdWRpb19wb2xpY3kuY29uZiBmaWxlcyBoYXZlIG9uZSBnbG9iYWxfY29uZmlndXJhdGlvbiBzZWN0aW9uLCBhdHRhY2hlZCB0byBwcmltYXJ5LgotICAgIGxvYWRHbG9iYWxDb25maWcocm9vdCwgY29uZmlnLCBod01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX1BSSU1BUlkpKTsKLQotICAgIGNvbmZpZy5zZXRId01vZHVsZXMoaHdNb2R1bGVzKTsKLQotICAgIGNvbmZpZ19mcmVlKHJvb3QpOwotICAgIGZyZWUocm9vdCk7Ci0gICAgZnJlZShkYXRhKTsKLQotICAgIEFMT0dJKCJsb2FkQXVkaW9Qb2xpY3lDb25maWcoKSBsb2FkZWQgJXNcbiIsIHBhdGgpOwotCi0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9EZXZpY2VEZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCmluZGV4IDE5YzIwNjIuLjg2ZGJiYTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0RldmljZURlc2NyaXB0b3IuY3BwCkBAIC0xOCw1OSArMTgsMTc5IEBACiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKICNpbmNsdWRlIDxhdWRpb191dGlscy9zdHJpbmcuaD4KKyNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CisjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgIkRldmljZURlc2NyaXB0b3IuaCIKICNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCi0jaW5jbHVkZSAiQXVkaW9HYWluLmgiCiAjaW5jbHVkZSAiSHdNb2R1bGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1EZXZpY2VEZXNjcmlwdG9yOjpEZXZpY2VEZXNjcmlwdG9yKGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4ICZ0YWdOYW1lKSA6Ci0gICAgQXVkaW9Qb3J0KFN0cmluZzgoIiIpLCBBVURJT19QT1JUX1RZUEVfREVWSUNFLAotICAgICAgICAgICAgICBhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpID8gQVVESU9fUE9SVF9ST0xFX1NJTksgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9SVF9ST0xFX1NPVVJDRSksCi0gICAgbUFkZHJlc3MoIiIpLCBtVGFnTmFtZSh0YWdOYW1lKSwgbURldmljZVR5cGUodHlwZSksIG1JZCgwKQorRGV2aWNlRGVzY3JpcHRvcjo6RGV2aWNlRGVzY3JpcHRvcihhdWRpb19kZXZpY2VzX3QgdHlwZSkgOgorICAgICAgICBEZXZpY2VEZXNjcmlwdG9yKHR5cGUsICIiIC8qdGFnTmFtZSovKQogewotICAgIGlmICh0eXBlID09IEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYIHx8IHR5cGUgPT0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYICkgewotICAgICAgICBtQWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKLSAgICB9CiB9CiAKLWF1ZGlvX3BvcnRfaGFuZGxlX3QgRGV2aWNlRGVzY3JpcHRvcjo6Z2V0SWQoKSBjb25zdAorRGV2aWNlRGVzY3JpcHRvcjo6RGV2aWNlRGVzY3JpcHRvcihhdWRpb19kZXZpY2VzX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnRhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvcm1hdFZlY3RvciAmZW5jb2RlZEZvcm1hdHMpIDoKKyAgICAgICAgRGV2aWNlRGVzY3JpcHRvcih0eXBlLCB0YWdOYW1lLCAiIiAvKmFkZHJlc3MqLywgZW5jb2RlZEZvcm1hdHMpCiB7Ci0gICAgcmV0dXJuIG1JZDsKK30KKworRGV2aWNlRGVzY3JpcHRvcjo6RGV2aWNlRGVzY3JpcHRvcihhdWRpb19kZXZpY2VzX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnRhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXRWZWN0b3IgJmVuY29kZWRGb3JtYXRzKSA6CisgICAgICAgIERldmljZURlc2NyaXB0b3IoQXVkaW9EZXZpY2VUeXBlQWRkcih0eXBlLCBhZGRyZXNzKSwgdGFnTmFtZSwgZW5jb2RlZEZvcm1hdHMpCit7Cit9CisKK0RldmljZURlc2NyaXB0b3I6OkRldmljZURlc2NyaXB0b3IoY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlVHlwZUFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZ0YWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGb3JtYXRWZWN0b3IgJmVuY29kZWRGb3JtYXRzKSA6CisgICAgICAgIERldmljZURlc2NyaXB0b3JCYXNlKGRldmljZVR5cGVBZGRyKSwgbVRhZ05hbWUodGFnTmFtZSksIG1FbmNvZGVkRm9ybWF0cyhlbmNvZGVkRm9ybWF0cykKK3sKKyAgICBtQ3VycmVudEVuY29kZWRGb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKKyAgICAvKiBJZiBmcmFtZXdvcmsgcnVucyBhZ2FpbnN0IGEgcHJlIDUuMCBBdWRpbyBIQUwsIGVuY29kZWQgZm9ybWF0cyBhcmUgYWJzZW50IGZyb20gdGhlIGNvbmZpZy4KKyAgICAgKiBGSVhNRTogQVBNIHNob3VsZCBrbm93IHRoZSB2ZXJzaW9uIG9mIHRoZSBIQUwgYW5kIGRvbid0IGFkZCB0aGUgZm9ybWF0cyBmb3IgVjUuMC4KKyAgICAgKiBGb3Igbm93LCB0aGUgd29ya2Fyb3VuZCB0byByZW1vdmUgQUMzIGFuZCBJRUM2MTkzNyBzdXBwb3J0IG9uIEhETUkgaXMgdG8gZGVjbGFyZQorICAgICAqIHNvbWV0aGluZyBsaWtlICdlbmNvZGVkRm9ybWF0cz0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiJyBvbiB0aGUgSERNSSBkZXZpY2VQb3J0LgorICAgICAqLworICAgIGlmIChtRGV2aWNlVHlwZUFkZHIubVR5cGUgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JICYmIG1FbmNvZGVkRm9ybWF0cy5lbXB0eSgpKSB7CisgICAgICAgIG1FbmNvZGVkRm9ybWF0cy5wdXNoX2JhY2soQVVESU9fRk9STUFUX0FDMyk7CisgICAgICAgIG1FbmNvZGVkRm9ybWF0cy5wdXNoX2JhY2soQVVESU9fRk9STUFUX0lFQzYxOTM3KTsKKyAgICB9CiB9CiAKIHZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6YXR0YWNoKGNvbnN0IHNwPEh3TW9kdWxlPiYgbW9kdWxlKQogewotICAgIEF1ZGlvUG9ydDo6YXR0YWNoKG1vZHVsZSk7CisgICAgUG9saWN5QXVkaW9Qb3J0OjphdHRhY2gobW9kdWxlKTsKICAgICBtSWQgPSBnZXROZXh0VW5pcXVlSWQoKTsKIH0KIAordm9pZCBEZXZpY2VEZXNjcmlwdG9yOjpkZXRhY2goKSB7CisgICAgbUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBQb2xpY3lBdWRpb1BvcnQ6OmRldGFjaCgpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorYm9vbCBjaGVja0VxdWFsKGNvbnN0IFQmIGYxLCBjb25zdCBUJiBmMikKK3sKKyAgICBzdGQ6OnNldDx0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiBzMShmMS5iZWdpbigpLCBmMS5lbmQoKSk7CisgICAgc3RkOjpzZXQ8dHlwZW5hbWUgVDo6dmFsdWVfdHlwZT4gczIoZjIuYmVnaW4oKSwgZjIuZW5kKCkpOworICAgIHJldHVybiBzMSA9PSBzMjsKK30KKwogYm9vbCBEZXZpY2VEZXNjcmlwdG9yOjplcXVhbHMoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIG90aGVyKSBjb25zdAogewogICAgIC8vIERldmljZXMgYXJlIGNvbnNpZGVyZWQgZXF1YWwgaWYgdGhleToKICAgICAvLyAtIGFyZSBvZiB0aGUgc2FtZSB0eXBlIChhIGRldmljZSB0eXBlIGNhbm5vdCBiZSBBVURJT19ERVZJQ0VfTk9ORSkKICAgICAvLyAtIGhhdmUgdGhlIHNhbWUgYWRkcmVzcworICAgIC8vIC0gaGF2ZSB0aGUgc2FtZSBlbmNvZGluZ0Zvcm1hdHMgKGlmIGRldmljZSBzdXBwb3J0cyBlbmNvZGluZykKICAgICBpZiAob3RoZXIgPT0gMCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQotICAgIHJldHVybiAobURldmljZVR5cGUgPT0gb3RoZXItPm1EZXZpY2VUeXBlKSAmJiAobUFkZHJlc3MgPT0gb3RoZXItPm1BZGRyZXNzKTsKKworICAgIHJldHVybiBtRGV2aWNlVHlwZUFkZHIuZXF1YWxzKG90aGVyLT5tRGV2aWNlVHlwZUFkZHIpICYmCisgICAgICAgICAgIGNoZWNrRXF1YWwobUVuY29kZWRGb3JtYXRzLCBvdGhlci0+bUVuY29kZWRGb3JtYXRzKTsKIH0KIAorYm9vbCBEZXZpY2VEZXNjcmlwdG9yOjpoYXNDdXJyZW50RW5jb2RlZEZvcm1hdCgpIGNvbnN0Cit7CisgICAgaWYgKCFkZXZpY2VfaGFzX2VuY29kaW5nX2NhcGFiaWxpdHkodHlwZSgpKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKG1FbmNvZGVkRm9ybWF0cy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiAobUN1cnJlbnRFbmNvZGVkRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKK30KKworYm9vbCBEZXZpY2VEZXNjcmlwdG9yOjpzdXBwb3J0c0Zvcm1hdChhdWRpb19mb3JtYXRfdCBmb3JtYXQpCit7CisgICAgaWYgKG1FbmNvZGVkRm9ybWF0cy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byYgZGV2Rm9ybWF0IDogbUVuY29kZWRGb3JtYXRzKSB7CisgICAgICAgIGlmIChkZXZGb3JtYXQgPT0gZm9ybWF0KSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0YXR1c190IERldmljZURlc2NyaXB0b3I6OmFwcGx5QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9jb25maWcgKmJhY2t1cENvbmZpZykKK3sKKyAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbG9jYWxCYWNrdXBDb25maWcgPSB7IC5jb25maWdfbWFzayA9IGNvbmZpZy0+Y29uZmlnX21hc2sgfTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKworICAgIHRvQXVkaW9Qb3J0Q29uZmlnKCZsb2NhbEJhY2t1cENvbmZpZyk7CisgICAgaWYgKChzdGF0dXMgPSB2YWxpZGF0aW9uQmVmb3JlQXBwbHlDb25maWcoY29uZmlnKSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgQXVkaW9Qb3J0Q29uZmlnOjphcHBseUF1ZGlvUG9ydENvbmZpZyhjb25maWcsIGJhY2t1cENvbmZpZyk7CisgICAgICAgIGFwcGx5UG9saWN5QXVkaW9Qb3J0Q29uZmlnKGNvbmZpZyk7CisgICAgfQorCisgICAgaWYgKGJhY2t1cENvbmZpZyAhPSBOVUxMKSB7CisgICAgICAgICpiYWNrdXBDb25maWcgPSBsb2NhbEJhY2t1cENvbmZpZzsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordm9pZCBEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydENvbmZpZyhzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKmRzdENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzcmNDb25maWcpIGNvbnN0Cit7CisgICAgRGV2aWNlRGVzY3JpcHRvckJhc2U6OnRvQXVkaW9Qb3J0Q29uZmlnKGRzdENvbmZpZywgc3JjQ29uZmlnKTsKKyAgICB0b1BvbGljeUF1ZGlvUG9ydENvbmZpZyhkc3RDb25maWcsIHNyY0NvbmZpZyk7CisKKyAgICBkc3RDb25maWctPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0gZ2V0TW9kdWxlSGFuZGxlKCk7Cit9CisKK3ZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoc3RydWN0IGF1ZGlvX3BvcnQgKnBvcnQpIGNvbnN0Cit7CisgICAgQUxPR1YoIkRldmljZURlc2NyaXB0b3I6OnRvQXVkaW9Qb3J0KCkgaGFuZGxlICVkIHR5cGUgJTA4eCIsIG1JZCwgbURldmljZVR5cGVBZGRyLm1UeXBlKTsKKyAgICBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6dG9BdWRpb1BvcnQocG9ydCk7CisgICAgcG9ydC0+ZXh0LmRldmljZS5od19tb2R1bGUgPSBnZXRNb2R1bGVIYW5kbGUoKTsKK30KKwordm9pZCBEZXZpY2VEZXNjcmlwdG9yOjppbXBvcnRBdWRpb1BvcnRBbmRQaWNrQXVkaW9Qcm9maWxlKAorICAgICAgICBjb25zdCBzcDxQb2xpY3lBdWRpb1BvcnQ+JiBwb2xpY3lQb3J0LCBib29sIGZvcmNlKSB7CisgICAgaWYgKCFmb3JjZSAmJiAhcG9saWN5UG9ydC0+YXNBdWRpb1BvcnQoKS0+aGFzRHluYW1pY0F1ZGlvUHJvZmlsZSgpKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgQXVkaW9Qb3J0OjppbXBvcnRBdWRpb1BvcnQocG9saWN5UG9ydC0+YXNBdWRpb1BvcnQoKSk7CisgICAgcG9saWN5UG9ydC0+cGlja0F1ZGlvUHJvZmlsZShtU2FtcGxpbmdSYXRlLCBtQ2hhbm5lbE1hc2ssIG1Gb3JtYXQpOworfQorCit2b2lkIERldmljZURlc2NyaXB0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsIGJvb2wgdmVyYm9zZSkgY29uc3QKK3sKKyAgICBTdHJpbmc4IGV4dHJhSW5mbzsKKyAgICBpZiAoIW1UYWdOYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgZXh0cmFJbmZvLmFwcGVuZEZvcm1hdCgiJSpzLSB0YWcgbmFtZTogJXNcbiIsIHNwYWNlcywgIiIsIG1UYWdOYW1lLmNfc3RyKCkpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGRlc2NCYXNlRHVtcFN0cjsKKyAgICBEZXZpY2VEZXNjcmlwdG9yQmFzZTo6ZHVtcCgmZGVzY0Jhc2VEdW1wU3RyLCBzcGFjZXMsIGluZGV4LCBleHRyYUluZm8uc3RyaW5nKCksIHZlcmJvc2UpOworICAgIGRzdC0+YXBwZW5kKGRlc2NCYXNlRHVtcFN0ci5jX3N0cigpKTsKK30KKworCiB2b2lkIERldmljZVZlY3Rvcjo6cmVmcmVzaFR5cGVzKCkKIHsKLSAgICBtRGV2aWNlVHlwZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKKyAgICBtRGV2aWNlVHlwZXMuY2xlYXIoKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIG1EZXZpY2VUeXBlcyB8PSBpdGVtQXQoaSktPnR5cGUoKTsKKyAgICAgICAgbURldmljZVR5cGVzLmluc2VydChpdGVtQXQoaSktPnR5cGUoKSk7CiAgICAgfQotICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OnJlZnJlc2hUeXBlcygpIG1EZXZpY2VUeXBlcyAlMDh4IiwgbURldmljZVR5cGVzKTsKKyAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjpyZWZyZXNoVHlwZXMoKSBtRGV2aWNlVHlwZXMgJXMiLCBkdW1wRGV2aWNlVHlwZXMobURldmljZVR5cGVzKS5jX3N0cigpKTsKIH0KIAogc3NpemVfdCBEZXZpY2VWZWN0b3I6OmluZGV4T2YoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGl0ZW0pIGNvbnN0CiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbS0+ZXF1YWxzKGl0ZW1BdChpKSkpIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+ZXF1YWxzKGl0ZW0pKSB7IC8vIGl0ZW0gbWF5IGJlIG51bGwgc3A8PiwgaS5lLiBBVURJT19ERVZJQ0VfTk9ORQogICAgICAgICAgICAgcmV0dXJuIGk7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMjEsNzYgKzI0MSw3NyBAQAogICAgIHJldHVybiByZXQ7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tSHdNb2R1bGUoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZUhhbmRsZSkgY29uc3QKK3ZvaWQgRGV2aWNlVmVjdG9yOjpyZW1vdmUoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKQogewotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbUF0KGkpLT5nZXRNb2R1bGVIYW5kbGUoKSA9PSBtb2R1bGVIYW5kbGUpIHsKLSAgICAgICAgICAgIGRldmljZXMgfD0gaXRlbUF0KGkpLT50eXBlKCk7Ci0gICAgICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IGRldmljZXMpIHsKKyAgICAgICAgcmVtb3ZlKGRldmljZSk7CiAgICAgfQotICAgIHJldHVybiBkZXZpY2VzOwogfQogCi1zcDxEZXZpY2VEZXNjcmlwdG9yPiBEZXZpY2VWZWN0b3I6OmdldERldmljZShhdWRpb19kZXZpY2VzX3QgdHlwZSwgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykgY29uc3QKLXsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2U7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBpZiAoaXRlbUF0KGkpLT50eXBlKCkgPT0gdHlwZSkgewotICAgICAgICAgICAgaWYgKGFkZHJlc3MgPT0gIiIgfHwgaXRlbUF0KGkpLT5tQWRkcmVzcyA9PSBhZGRyZXNzKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gaXRlbUF0KGkpOwotICAgICAgICAgICAgICAgIGlmIChpdGVtQXQoaSktPm1BZGRyZXNzID09IGFkZHJlc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OmdldERldmljZSgpIGZvciB0eXBlICUwOHggYWRkcmVzcyAlcyBmb3VuZCAlcCIsCi0gICAgICAgICAgdHlwZSwgYWRkcmVzcy5zdHJpbmcoKSwgZGV2aWNlLmdldCgpKTsKLSAgICByZXR1cm4gZGV2aWNlOwotfQotCi1zcDxEZXZpY2VEZXNjcmlwdG9yPiBEZXZpY2VWZWN0b3I6OmdldERldmljZUZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdAotewotICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKLSAgICAgICAgaWYgKGRldmljZS0+Z2V0SWQoKSA9PSBpZCkgewotICAgICAgICAgICAgcmV0dXJuIGRldmljZTsKLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gbnVsbHB0cjsKLX0KLQotRGV2aWNlVmVjdG9yIERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlKSBjb25zdAotewotICAgIERldmljZVZlY3RvciBkZXZpY2VzOwotICAgIGJvb2wgaXNPdXRwdXQgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlcyh0eXBlKTsKLSAgICB0eXBlICY9IH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyAoaSA8IHNpemUoKSkgJiYgKHR5cGUgIT0gQVVESU9fREVWSUNFX05PTkUpOyBpKyspIHsKLSAgICAgICAgYm9vbCBjdXJJc091dHB1dCA9IGF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKGl0ZW1BdChpKS0+bURldmljZVR5cGUpOwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyVHlwZSA9IGl0ZW1BdChpKS0+bURldmljZVR5cGUgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKLSAgICAgICAgaWYgKChpc091dHB1dCA9PSBjdXJJc091dHB1dCkgJiYgKCh0eXBlICYgY3VyVHlwZSkgIT0gMCkpIHsKLSAgICAgICAgICAgIGRldmljZXMuYWRkKGl0ZW1BdChpKSk7Ci0gICAgICAgICAgICB0eXBlICY9IH5jdXJUeXBlOwotICAgICAgICAgICAgQUxPR1YoIkRldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21UeXBlKCkgZm9yIHR5cGUgJXggZm91bmQgJXAiLAotICAgICAgICAgICAgICAgICAgaXRlbUF0KGkpLT50eXBlKCksIGl0ZW1BdChpKS5nZXQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGRldmljZXM7Ci19Ci0KLURldmljZVZlY3RvciBEZXZpY2VWZWN0b3I6OmdldERldmljZXNGcm9tVHlwZUFkZHIoCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCB0eXBlLCBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKSBjb25zdAorRGV2aWNlVmVjdG9yIERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlc0Zyb21Id01vZHVsZShhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlSGFuZGxlKSBjb25zdAogewogICAgIERldmljZVZlY3RvciBkZXZpY2VzOwogICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKLSAgICAgICAgaWYgKGRldmljZS0+dHlwZSgpID09IHR5cGUgJiYgZGV2aWNlLT5tQWRkcmVzcyA9PSBhZGRyZXNzKSB7CisgICAgICAgIGlmIChkZXZpY2UtPmdldE1vZHVsZUhhbmRsZSgpID09IG1vZHVsZUhhbmRsZSkgewogICAgICAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gZGV2aWNlczsKIH0KIAotc3A8RGV2aWNlRGVzY3JpcHRvcj4gRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VGcm9tVGFnTmFtZShjb25zdCBTdHJpbmc4ICZ0YWdOYW1lKSBjb25zdAorc3A8RGV2aWNlRGVzY3JpcHRvcj4gRGV2aWNlVmVjdG9yOjpnZXREZXZpY2UoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQpIGNvbnN0Cit7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKGl0ZW1BdChpKS0+dHlwZSgpID09IHR5cGUpIHsKKyAgICAgICAgICAgIC8vIElmIGZvcm1hdCBpcyBzcGVjaWZpZWQsIG1hdGNoIGl0IGFuZCBpZ25vcmUgYWRkcmVzcworICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGlmIGFkZHJlc3MgaXMgc3BlY2lmaWVkIG1hdGNoIGl0CisgICAgICAgICAgICAvLyBPdGhlcndpc2UgYWx3YXlzIG1hdGNoCisgICAgICAgICAgICBpZiAoKChhZGRyZXNzID09ICIiIHx8IChpdGVtQXQoaSktPmFkZHJlc3MoKS5jb21wYXJlKGFkZHJlc3MuY19zdHIoKSkgPT0gMCkpICYmCisgICAgICAgICAgICAgICAgIGZvcm1hdCA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgfHwKKyAgICAgICAgICAgICAgICAoaXRlbUF0KGkpLT5zdXBwb3J0c0Zvcm1hdChmb3JtYXQpICYmIGZvcm1hdCAhPSBBVURJT19GT1JNQVRfREVGQVVMVCkpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2UgPSBpdGVtQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKGl0ZW1BdChpKS0+YWRkcmVzcygpLmNvbXBhcmUoYWRkcmVzcy5jX3N0cigpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiRGV2aWNlVmVjdG9yOjolcygpIGZvciB0eXBlICUwOHggYWRkcmVzcyBcIiVzXCIgZm91bmQgJXAgZm9ybWF0ICUwOHgiLAorICAgICAgICAgICAgX19mdW5jX18sIHR5cGUsIGFkZHJlc3Muc3RyaW5nKCksIGRldmljZS5nZXQoKSwgZm9ybWF0KTsKKyAgICByZXR1cm4gZGV2aWNlOworfQorCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBEZXZpY2VWZWN0b3I6OmdldERldmljZUZyb21JZChhdWRpb19wb3J0X2hhbmRsZV90IGlkKSBjb25zdAoreworICAgIGlmIChpZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgZGV2aWNlIDogKnRoaXMpIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2UtPmdldElkKCkgPT0gaWQpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworfQorCitEZXZpY2VWZWN0b3IgRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VzRnJvbVR5cGVzKGNvbnN0IERldmljZVR5cGVTZXQmIHR5cGVzKSBjb25zdAoreworICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgIGlmICh0eXBlcy5lbXB0eSgpKSB7CisgICAgICAgIHJldHVybiBkZXZpY2VzOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CisgICAgICAgIGlmICh0eXBlcy5jb3VudChpdGVtQXQoaSktPnR5cGUoKSkgIT0gMCkgeworICAgICAgICAgICAgZGV2aWNlcy5hZGQoaXRlbUF0KGkpKTsKKyAgICAgICAgICAgIEFMT0dWKCJEZXZpY2VWZWN0b3I6OiVzKCkgZm9yIHR5cGUgJTA4eCBmb3VuZCAlcCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBpdGVtQXQoaSktPnR5cGUoKSwgaXRlbUF0KGkpLmdldCgpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZGV2aWNlczsKK30KKworc3A8RGV2aWNlRGVzY3JpcHRvcj4gRGV2aWNlVmVjdG9yOjpnZXREZXZpY2VGcm9tVGFnTmFtZShjb25zdCBzdGQ6OnN0cmluZyAmdGFnTmFtZSkgY29uc3QKIHsKICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6ICp0aGlzKSB7CiAgICAgICAgIGlmIChkZXZpY2UtPmdldFRhZ05hbWUoKSA9PSB0YWdOYW1lKSB7CkBAIC0yMDAsMTE1ICszMjEsMTEzIEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXN0YXR1c190IERldmljZVZlY3Rvcjo6ZHVtcChpbnQgZmQsIGNvbnN0IFN0cmluZzggJnRhZywgaW50IHNwYWNlcywgYm9vbCB2ZXJib3NlKSBjb25zdAorRGV2aWNlVmVjdG9yIERldmljZVZlY3Rvcjo6Z2V0Rmlyc3REZXZpY2VzRnJvbVR5cGVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19kZXZpY2VzX3Q+IG9yZGVyZWRUeXBlcykgY29uc3QKK3sKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKKyAgICBmb3IgKGF1dG8gZGV2aWNlVHlwZSA6IG9yZGVyZWRUeXBlcykgeworICAgICAgICBpZiAoIShkZXZpY2VzID0gZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZVR5cGUpKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2VzOworfQorCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBEZXZpY2VWZWN0b3I6OmdldEZpcnN0RXhpc3RpbmdEZXZpY2UoCisgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2RldmljZXNfdD4gb3JkZXJlZFR5cGVzKSBjb25zdCB7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOworICAgIGZvciAoYXV0byBkZXZpY2VUeXBlIDogb3JkZXJlZFR5cGVzKSB7CisgICAgICAgIGlmICgoZGV2aWNlID0gZ2V0RGV2aWNlKGRldmljZVR5cGUsIFN0cmluZzgoIiIpLCBBVURJT19GT1JNQVRfREVGQVVMVCkpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3NwPERldmljZURlc2NyaXB0b3I+IERldmljZVZlY3Rvcjo6Z2V0RGV2aWNlRm9yT3BlbmluZygpIGNvbnN0CiB7CiAgICAgaWYgKGlzRW1wdHkoKSkgewotICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgICAgIC8vIFJldHVybiBudWxscHRyIGlmIHRoaXMgY29sbGVjdGlvbiBpcyBlbXB0eS4KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfSBlbHNlIGlmIChhcmVBbGxPZlNhbWVEZXZpY2VUeXBlKHR5cGVzKCksIGF1ZGlvX2lzX2lucHV0X2RldmljZSkpIHsKKyAgICAgICAgLy8gRm9yIGlucHV0IGNhc2UsIHJldHVybiB0aGUgZmlyc3Qgb25lIHdoZW4gdGhlcmUgaXMgb25seSBvbmUgZGV2aWNlLgorICAgICAgICByZXR1cm4gc2l6ZSgpID4gMSA/IG51bGxwdHIgOiAqYmVnaW4oKTsKKyAgICB9IGVsc2UgaWYgKGFyZUFsbE9mU2FtZURldmljZVR5cGUodHlwZXMoKSwgYXVkaW9faXNfb3V0cHV0X2RldmljZSkpIHsKKyAgICAgICAgLy8gRm9yIG91dHB1dCBjYXNlLCByZXR1cm4gdGhlIGRldmljZSBkZXNjcmlwdG9yIGFjY29yZGluZyB0byBhcG0gc3RyYXRlZ3kuCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlID0gYXBtX2V4dHJhY3Rfb25lX2F1ZGlvX2RldmljZSh0eXBlcygpKTsKKyAgICAgICAgcmV0dXJuIGRldmljZVR5cGUgPT0gQVVESU9fREVWSUNFX05PTkUgPyBudWxscHRyIDoKKyAgICAgICAgICAgICAgICBnZXREZXZpY2UoZGV2aWNlVHlwZSwgU3RyaW5nOCgiIiksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICB9Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtICVzIGRldmljZXM6XG4iLCBzcGFjZXMsICIiLCB0YWcuc3RyaW5nKCkpOwotICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGl0ZW1BdChpKS0+ZHVtcChmZCwgc3BhY2VzICsgMiwgaSwgdmVyYm9zZSk7Ci0gICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAvLyBSZXR1cm4gbnVsbCBwb2ludGVyIGlmIHRoZSBkZXZpY2VzIGFyZSBub3QgYWxsIGlucHV0L291dHB1dCBkZXZpY2UuCisgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXZvaWQgRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnRDb25maWcoc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpkc3RDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAordm9pZCBEZXZpY2VWZWN0b3I6OnJlcGxhY2VEZXZpY2VzQnlUeXBlKAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZVRvUmVtb3ZlLCBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXNUb0FkZCkgeworICAgIERldmljZVZlY3RvciBkZXZpY2VzVG9SZW1vdmUgPSBnZXREZXZpY2VzRnJvbVR5cGUodHlwZVRvUmVtb3ZlKTsKKyAgICBpZiAoIWRldmljZXNUb1JlbW92ZS5pc0VtcHR5KCkgJiYgIWRldmljZXNUb0FkZC5pc0VtcHR5KCkpIHsKKyAgICAgICAgcmVtb3ZlKGRldmljZXNUb1JlbW92ZSk7CisgICAgICAgIGFkZChkZXZpY2VzVG9BZGQpOworICAgIH0KK30KKwordm9pZCBEZXZpY2VWZWN0b3I6OmR1bXAoU3RyaW5nOCAqZHN0LCBjb25zdCBTdHJpbmc4ICZ0YWcsIGludCBzcGFjZXMsIGJvb2wgdmVyYm9zZSkgY29uc3QKIHsKLSAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrID0gQVVESU9fUE9SVF9DT05GSUdfR0FJTjsKLSAgICBpZiAobVNhbXBsaW5nUmF0ZSAhPSAwKSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfU0FNUExFX1JBVEU7Ci0gICAgfQotICAgIGlmIChtQ2hhbm5lbE1hc2sgIT0gQVVESU9fQ0hBTk5FTF9OT05FKSB7Ci0gICAgICAgIGRzdENvbmZpZy0+Y29uZmlnX21hc2sgfD0gQVVESU9fUE9SVF9DT05GSUdfQ0hBTk5FTF9NQVNLOwotICAgIH0KLSAgICBpZiAobUZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRCkgewotICAgICAgICBkc3RDb25maWctPmNvbmZpZ19tYXNrIHw9IEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVDsKLSAgICB9Ci0KLSAgICBpZiAoc3JjQ29uZmlnICE9IE5VTEwpIHsKLSAgICAgICAgZHN0Q29uZmlnLT5jb25maWdfbWFzayB8PSBzcmNDb25maWctPmNvbmZpZ19tYXNrOwotICAgIH0KLQotICAgIEF1ZGlvUG9ydENvbmZpZzo6dG9BdWRpb1BvcnRDb25maWcoZHN0Q29uZmlnLCBzcmNDb25maWcpOwotCi0gICAgZHN0Q29uZmlnLT5pZCA9IG1JZDsKLSAgICBkc3RDb25maWctPnJvbGUgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlKG1EZXZpY2VUeXBlKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfU0lOSyA6IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7Ci0gICAgZHN0Q29uZmlnLT50eXBlID0gQVVESU9fUE9SVF9UWVBFX0RFVklDRTsKLSAgICBkc3RDb25maWctPmV4dC5kZXZpY2UudHlwZSA9IG1EZXZpY2VUeXBlOwotCi0gICAgLy9UT0RPIFVuZGVyc3RhbmQgd2h5IHRoaXMgdGVzdCBpcyBuZWNlc3NhcnkuIGkuZS4gd2h5IGF0IGJvb3QgdGltZSBkb2VzIGl0IGNyYXNoCi0gICAgLy8gd2l0aG91dCB0aGUgdGVzdD8KLSAgICAvLyBUaGlzIGhhcyBiZWVuIGRlbW9uc3RyYXRlZCB0byBOT1QgYmUgdHJ1ZSAoYXQgc3RhcnQgdXApCi0gICAgLy8gQUxPR19BU1NFUlQobU1vZHVsZSAhPSBOVUxMKTsKLSAgICBkc3RDb25maWctPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0KLSAgICAgICAgICAgIG1Nb2R1bGUgIT0gMCA/IG1Nb2R1bGUtPmdldEhhbmRsZSgpIDogQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOwotICAgICh2b2lkKWF1ZGlvX3V0aWxzX3N0cmxjcHlfemVyb2ZpbGwoZHN0Q29uZmlnLT5leHQuZGV2aWNlLmFkZHJlc3MsIG1BZGRyZXNzLnN0cmluZygpKTsKLX0KLQotdm9pZCBEZXZpY2VEZXNjcmlwdG9yOjp0b0F1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCkgY29uc3QKLXsKLSAgICBBTE9HVigiRGV2aWNlRGVzY3JpcHRvcjo6dG9BdWRpb1BvcnQoKSBoYW5kbGUgJWQgdHlwZSAleCIsIG1JZCwgbURldmljZVR5cGUpOwotICAgIEF1ZGlvUG9ydDo6dG9BdWRpb1BvcnQocG9ydCk7Ci0gICAgcG9ydC0+aWQgPSBtSWQ7Ci0gICAgdG9BdWRpb1BvcnRDb25maWcoJnBvcnQtPmFjdGl2ZV9jb25maWcpOwotICAgIHBvcnQtPmV4dC5kZXZpY2UudHlwZSA9IG1EZXZpY2VUeXBlOwotICAgIHBvcnQtPmV4dC5kZXZpY2UuaHdfbW9kdWxlID0gbU1vZHVsZS0+Z2V0SGFuZGxlKCk7Ci0gICAgKHZvaWQpYXVkaW9fdXRpbHNfc3RybGNweV96ZXJvZmlsbChwb3J0LT5leHQuZGV2aWNlLmFkZHJlc3MsIG1BZGRyZXNzLnN0cmluZygpKTsKLX0KLQotdm9pZCBEZXZpY2VEZXNjcmlwdG9yOjppbXBvcnRBdWRpb1BvcnQoY29uc3Qgc3A8QXVkaW9Qb3J0PiYgcG9ydCwgYm9vbCBmb3JjZSkgewotICAgIGlmICghZm9yY2UgJiYgIXBvcnQtPmhhc0R5bmFtaWNBdWRpb1Byb2ZpbGUoKSkgeworICAgIGlmIChpc0VtcHR5KCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBBdWRpb1BvcnQ6OmltcG9ydEF1ZGlvUG9ydChwb3J0KTsKLSAgICBwb3J0LT5waWNrQXVkaW9Qcm9maWxlKG1TYW1wbGluZ1JhdGUsIG1DaGFubmVsTWFzaywgbUZvcm1hdCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gJXMgZGV2aWNlczpcbiIsIHNwYWNlcywgIiIsIHRhZy5zdHJpbmcoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpdGVtQXQoaSktPmR1bXAoZHN0LCBzcGFjZXMgKyAyLCBpLCB2ZXJib3NlKTsKKyAgICB9CiB9CiAKLXN0YXR1c190IERldmljZURlc2NyaXB0b3I6OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzLCBpbnQgaW5kZXgsIGJvb2wgdmVyYm9zZSkgY29uc3QKK3N0ZDo6c3RyaW5nIERldmljZVZlY3Rvcjo6dG9TdHJpbmcoKSBjb25zdAogewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzRGV2aWNlICVkOlxuIiwgc3BhY2VzLCAiIiwgaW5kZXgrMSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIGlmIChtSWQgIT0gMCkgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMtIGlkOiAlMmRcbiIsIHNwYWNlcywgIiIsIG1JZCk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBpZiAoaXNFbXB0eSgpKSB7CisgICAgICAgIHJldHVybiB7IkFVRElPX0RFVklDRV9OT05FIn07CiAgICAgfQotICAgIGlmICghbVRhZ05hbWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiUqcy0gdGFnIG5hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCBtVGFnTmFtZS5zdHJpbmcoKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKKyAgICBzdGQ6OnN0cmluZyByZXN1bHQgPSB7InsifTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6ICp0aGlzKSB7CisgICAgICAgIGlmIChkZXZpY2UgIT0gKmJlZ2luKCkpIHsKKyAgICAgICAgICAgcmVzdWx0ICs9ICI7IjsKKyAgICAgICAgfQorICAgICAgICByZXN1bHQgKz0gZGV2aWNlLT50b1N0cmluZygpOwogICAgIH0KLSAgICBzdGQ6OnN0cmluZyBkZXZpY2VMaXRlcmFsOwotICAgIGlmIChkZXZpY2VUb1N0cmluZyhtRGV2aWNlVHlwZSwgZGV2aWNlTGl0ZXJhbCkpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSB0eXBlOiAlLTQ4c1xuIiwgc3BhY2VzLCAiIiwgZGV2aWNlTGl0ZXJhbC5jX3N0cigpKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIH0KLSAgICBpZiAobUFkZHJlc3Muc2l6ZSgpICE9IDApIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJSpzLSBhZGRyZXNzOiAlLTMyc1xuIiwgc3BhY2VzLCAiIiwgbUFkZHJlc3Muc3RyaW5nKCkpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgfQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgIEF1ZGlvUG9ydDo6ZHVtcChmZCwgc3BhY2VzLCB2ZXJib3NlKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gcmVzdWx0ICsgIn0iOwogfQogCi12b2lkIERldmljZURlc2NyaXB0b3I6OmxvZygpIGNvbnN0CitEZXZpY2VWZWN0b3IgRGV2aWNlVmVjdG9yOjpmaWx0ZXIoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAogewotICAgIHN0ZDo6c3RyaW5nIGRldmljZTsKLSAgICBkZXZpY2VUb1N0cmluZyhtRGV2aWNlVHlwZSwgZGV2aWNlKTsKLSAgICBBTE9HSSgiRGV2aWNlIGlkOiVkIHR5cGU6MHglWDolcywgYWRkcjolcyIsIG1JZCwgIG1EZXZpY2VUeXBlLCBkZXZpY2UuY19zdHIoKSwKLSAgICAgICAgICBtQWRkcmVzcy5zdHJpbmcoKSk7CisgICAgRGV2aWNlVmVjdG9yIGZpbHRlcmVkRGV2aWNlczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6ICp0aGlzKSB7CisgICAgICAgIGlmIChkZXZpY2VzLmNvbnRhaW5zKGRldmljZSkpIHsKKyAgICAgICAgICAgIGZpbHRlcmVkRGV2aWNlcy5hZGQoZGV2aWNlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmlsdGVyZWREZXZpY2VzOworfQogCi0gICAgQXVkaW9Qb3J0Ojpsb2coIiAgIik7Citib29sIERldmljZVZlY3Rvcjo6Y29udGFpbnNBdExlYXN0T25lKGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcykgY29uc3QKK3sKKyAgICByZXR1cm4gIWZpbHRlcihkZXZpY2VzKS5pc0VtcHR5KCk7Cit9CisKK2Jvb2wgRGV2aWNlVmVjdG9yOjpjb250YWluc0FsbERldmljZXMoY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzKSBjb25zdAoreworICAgIHJldHVybiBmaWx0ZXIoZGV2aWNlcykuc2l6ZSgpID09IGRldmljZXMuc2l6ZSgpOworfQorCitEZXZpY2VWZWN0b3IgRGV2aWNlVmVjdG9yOjpmaWx0ZXJGb3JFbmdpbmUoKSBjb25zdAoreworICAgIERldmljZVZlY3RvciBmaWx0ZXJlZERldmljZXM7CisgICAgZm9yIChjb25zdCBhdXRvICZkZXZpY2UgOiAqdGhpcykgeworICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoZGV2aWNlLT50eXBlKCkpICYmIGRldmljZS0+YWRkcmVzcygpICE9ICIwIikgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgZmlsdGVyZWREZXZpY2VzLmFkZChkZXZpY2UpOworICAgIH0KKyAgICByZXR1cm4gZmlsdGVyZWREZXZpY2VzOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9FZmZlY3REZXNjcmlwdG9yLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCmluZGV4IDdiMjM0MWUuLjQxNTk2MmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0VmZmVjdERlc2NyaXB0b3IuY3BwCkBAIC0yMiwyNSArMjIsMTUgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCi1zdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yOjpkdW1wKGludCBmZCkKK3ZvaWQgRWZmZWN0RGVzY3JpcHRvcjo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMpIGNvbnN0CiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgSS9POiAlZFxuIiwgbUlvKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFN0cmF0ZWd5OiAlZFxuIiwgbVN0cmF0ZWd5KTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFNlc3Npb246ICVkXG4iLCBtU2Vzc2lvbik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBOYW1lOiAlc1xuIiwgIG1EZXNjLm5hbWUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgJXNcbiIsICBtRW5hYmxlZCA/ICJFbmFibGVkIiA6ICJEaXNhYmxlZCIpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLQotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzSUQ6ICVkXG4iLCBzcGFjZXMsICIiLCBtSWQpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNJL086ICVkXG4iLCBzcGFjZXMsICIiLCBtSW8pOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNNdXNpYyBFZmZlY3Q6ICVzXG4iLCBzcGFjZXMsICIiLCBpc011c2ljRWZmZWN0KCk/ICJ5ZXMiIDogIm5vIik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc1Nlc3Npb246ICVkXG4iLCBzcGFjZXMsICIiLCBtU2Vzc2lvbik7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqc05hbWU6ICVzXG4iLCBzcGFjZXMsICIiLCAgbURlc2MubmFtZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyVzXG4iLCBzcGFjZXMsICIiLCAgbUVuYWJsZWQgPyAiRW5hYmxlZCIgOiAiRGlzYWJsZWQiKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzJXNcbiIsIHNwYWNlcywgIiIsICBtU3VzcGVuZGVkID8gIlN1c3BlbmRlZCIgOiAiQWN0aXZlIik7CiB9CiAKIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbigpIDoKQEAgLTUzLDEwICs0MywxNCBAQAogCiBzdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6cmVnaXN0ZXJFZmZlY3QoY29uc3QgZWZmZWN0X2Rlc2NyaXB0b3JfdCAqZGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzdHJhdGVneSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkLCBib29sIGlzTXVzaWNFZmZlY3QpCiB7CisgICAgaWYgKGdldEVmZmVjdChpZCkgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXMgZWZmZWN0ICVzIGFscmVhZHkgcmVnaXN0ZXJlZCIsIF9fRlVOQ1RJT05fXywgZGVzYy0+bmFtZSk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKICAgICBpZiAobVRvdGFsRWZmZWN0c01lbW9yeSArIGRlc2MtPm1lbW9yeVVzYWdlID4gZ2V0TWF4RWZmZWN0c01lbW9yeSgpKSB7CiAgICAgICAgIEFMT0dXKCJyZWdpc3RlckVmZmVjdCgpIG1lbW9yeSBsaW1pdCBleGNlZWRlZCBmb3IgRnggJXMsIE1lbW9yeSAlZCBLQiIsCiAgICAgICAgICAgICAgICAgZGVzYy0+bmFtZSwgZGVzYy0+bWVtb3J5VXNhZ2UpOwpAQCAtNjYsMzQgKzYwLDM0IEBACiAgICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgPiBtVG90YWxFZmZlY3RzTWVtb3J5TWF4VXNlZCkgewogICAgICAgICBtVG90YWxFZmZlY3RzTWVtb3J5TWF4VXNlZCA9IG1Ub3RhbEVmZmVjdHNNZW1vcnk7CiAgICAgfQotICAgIEFMT0dWKCJyZWdpc3RlckVmZmVjdCgpIGVmZmVjdCAlcywgaW8gJWQsIHN0cmF0ZWd5ICVkIHNlc3Npb24gJWQgaWQgJWQiLAotICAgICAgICAgICAgZGVzYy0+bmFtZSwgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7CisgICAgQUxPR1YoInJlZ2lzdGVyRWZmZWN0KCkgZWZmZWN0ICVzLCBpbyAlZCwgc2Vzc2lvbiAlZCBpZCAlZCIsCisgICAgICAgICAgICBkZXNjLT5uYW1lLCBpbywgc2Vzc2lvbiwgaWQpOwogICAgIEFMT0dWKCJyZWdpc3RlckVmZmVjdCgpIG1lbW9yeSAlZCwgdG90YWwgbWVtb3J5ICVkIiwgZGVzYy0+bWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOwogCi0gICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IG5ldyBFZmZlY3REZXNjcmlwdG9yKCk7Ci0gICAgbWVtY3B5ICgmZWZmZWN0RGVzYy0+bURlc2MsIGRlc2MsIHNpemVvZihlZmZlY3RfZGVzY3JpcHRvcl90KSk7Ci0gICAgZWZmZWN0RGVzYy0+bUlvID0gaW87Ci0gICAgZWZmZWN0RGVzYy0+bVN0cmF0ZWd5ID0gc3RhdGljX2Nhc3Q8cm91dGluZ19zdHJhdGVneT4oc3RyYXRlZ3kpOwotICAgIGVmZmVjdERlc2MtPm1TZXNzaW9uID0gc2Vzc2lvbjsKLSAgICBlZmZlY3REZXNjLT5tRW5hYmxlZCA9IGZhbHNlOwotCisgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9CisgICAgICAgIG5ldyBFZmZlY3REZXNjcmlwdG9yKGRlc2MsIGlzTXVzaWNFZmZlY3QsIGlkLCBpbywgKGF1ZGlvX3Nlc3Npb25fdClzZXNzaW9uKTsKICAgICBhZGQoaWQsIGVmZmVjdERlc2MpOwogCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCitzcDxFZmZlY3REZXNjcmlwdG9yPiBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6Z2V0RWZmZWN0KGludCBpZCkgY29uc3QKIHsKICAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShpZCk7CiAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIHVua25vd24gZWZmZWN0IElEICVkIiwgaWQpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0dXJuIHZhbHVlQXQoaW5kZXgpOworfQorCitzdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6dW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCit7CisgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0RGVzYyA9IGdldEVmZmVjdChpZCk7CisgICAgaWYgKGVmZmVjdERlc2MgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXMgdW5rbm93biBlZmZlY3QgSUQgJWQiLCBfX0ZVTkNUSU9OX18sIGlkKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSB2YWx1ZUF0KGluZGV4KTsKLQotICAgIHNldEVmZmVjdEVuYWJsZWQoZWZmZWN0RGVzYywgZmFsc2UpOwotCiAgICAgaWYgKG1Ub3RhbEVmZmVjdHNNZW1vcnkgPCBlZmZlY3REZXNjLT5tRGVzYy5tZW1vcnlVc2FnZSkgewogICAgICAgICBBTE9HVygidW5yZWdpc3RlckVmZmVjdCgpIG1lbW9yeSAlZCB0b28gYmlnIGZvciB0b3RhbCAlZCIsCiAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubWVtb3J5VXNhZ2UsIG1Ub3RhbEVmZmVjdHNNZW1vcnkpOwpAQCAtMTE5LDYgKzExMywxNCBAQAogICAgIHJldHVybiBzZXRFZmZlY3RFbmFibGVkKHZhbHVlQXQoaW5kZXgpLCBlbmFibGVkKTsKIH0KIAorYm9vbCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6aXNFZmZlY3RFbmFibGVkKGludCBpZCkgY29uc3QKK3sKKyAgICBzc2l6ZV90IGluZGV4ID0gaW5kZXhPZktleShpZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB2YWx1ZUF0KGluZGV4KS0+bUVuYWJsZWQ7Cit9CiAKIHN0YXR1c190IEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjpzZXRFZmZlY3RFbmFibGVkKGNvbnN0IHNwPEVmZmVjdERlc2NyaXB0b3I+ICZlZmZlY3REZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVkKQpAQCAtMTUwLDExICsxNTIsMTEgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWJvb2wgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OmlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkKK2Jvb2wgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OmlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkgY29uc3QKIHsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdERlc2MgPSB2YWx1ZUF0KGkpOwotICAgICAgICBpZiAoZWZmZWN0RGVzYy0+bUVuYWJsZWQgJiYgKGVmZmVjdERlc2MtPm1TdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgJiYKKyAgICAgICAgaWYgKGVmZmVjdERlc2MtPm1FbmFibGVkICYmIChlZmZlY3REZXNjLT5pc011c2ljRWZmZWN0KCkpICYmCiAgICAgICAgICAgICAgICAgKChlZmZlY3REZXNjLT5tRGVzYy5mbGFncyAmIEVGRkVDVF9GTEFHX09GRkxPQURfU1VQUE9SVEVEKSA9PSAwKSkgewogICAgICAgICAgICAgQUxPR1YoImlzTm9uT2ZmbG9hZGFibGVFZmZlY3RFbmFibGVkKCkgbm9uIG9mZmxvYWRhYmxlIGVmZmVjdCAlcyBlbmFibGVkIG9uIHNlc3Npb24gJWQiLAogICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bURlc2MubmFtZSwgZWZmZWN0RGVzYy0+bVNlc3Npb24pOwpAQCAtMTc0LDI0ICsxNzYsNTkgQEAKICAgICByZXR1cm4gTUFYX0VGRkVDVFNfTUVNT1JZOwogfQogCi1zdGF0dXNfdCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6ZHVtcChpbnQgZmQpCit2b2lkIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uOjptb3ZlRWZmZWN0cyhhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNyY091dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCkKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwKLSAgICAgICAgICAgICJcblRvdGFsIEVmZmVjdHMgQ1BVOiAlZiBNSVBTLCBUb3RhbCBFZmZlY3RzIG1lbW9yeTogJWQgS0IsIE1heCBtZW1vcnkgdXNlZDogJWQgS0JcbiIsCi0gICAgICAgICAgICAgKGZsb2F0KW1Ub3RhbEVmZmVjdHNDcHVMb2FkLzEwLCBtVG90YWxFZmZlY3RzTWVtb3J5LCBtVG90YWxFZmZlY3RzTWVtb3J5TWF4VXNlZCk7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiUmVnaXN0ZXJlZCBlZmZlY3RzOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIEFMT0dWKCIlcyBzZXNzaW9uICVkIHNyY091dHB1dCAlZCBkc3RPdXRwdXQgJWQiLCBfX2Z1bmNfXywgc2Vzc2lvbiwgc3JjT3V0cHV0LCBkc3RPdXRwdXQpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBFZmZlY3QgJWQgZHVtcDpcbiIsIGtleUF0KGkpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGZkKTsKKyAgICAgICAgc3A8RWZmZWN0RGVzY3JpcHRvcj4gZWZmZWN0ID0gdmFsdWVBdChpKTsKKyAgICAgICAgaWYgKGVmZmVjdC0+bVNlc3Npb24gPT0gc2Vzc2lvbiAmJiBlZmZlY3QtPm1JbyA9PSBzcmNPdXRwdXQpIHsKKyAgICAgICAgICAgIGVmZmVjdC0+bUlvID0gZHN0T3V0cHV0OworICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6bW92ZUVmZmVjdHMoY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgZHN0T3V0cHV0KQoreworICAgIEFMT0dWKCIlcyBudW0gZWZmZWN0cyAlenUsIGZpcnN0IElEICVkLCBkc3RPdXRwdXQgJWQiLAorICAgICAgICBfX2Z1bmNfXywgaWRzLnNpemUoKSwgaWRzLnNpemUoKSA/IGlkc1swXSA6IDAsIGRzdE91dHB1dCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBzcDxFZmZlY3REZXNjcmlwdG9yPiBlZmZlY3QgPSB2YWx1ZUF0KGkpOworICAgICAgICBpZiAoc3RkOjpmaW5kKGJlZ2luKGlkcyksIGVuZChpZHMpLCBlZmZlY3QtPm1JZCkgIT0gZW5kKGlkcykpIHsKKyAgICAgICAgICAgIGVmZmVjdC0+bUlvID0gZHN0T3V0cHV0OworICAgICAgICB9CisgICAgfQorfQorCitFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbjo6Z2V0RWZmZWN0c0ZvcklvKGF1ZGlvX2lvX2hhbmRsZV90IGlvKSBjb25zdAoreworICAgIEVmZmVjdERlc2NyaXB0b3JDb2xsZWN0aW9uIGVmZmVjdHM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgeworICAgICAgICBpZiAodmFsdWVBdChpKS0+bUlvID09IGlvKSB7CisgICAgICAgICAgICBlZmZlY3RzLmFkZChrZXlBdChpKSwgdmFsdWVBdChpKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGVmZmVjdHM7Cit9CisKK3ZvaWQgRWZmZWN0RGVzY3JpcHRvckNvbGxlY3Rpb246OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBib29sIHZlcmJvc2UpIGNvbnN0Cit7CisgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoCisgICAgICAgICAgICAiXG4lKnNUb3RhbCBFZmZlY3RzIENQVTogJWYgTUlQUywgIgorICAgICAgICAgICAgIlRvdGFsIEVmZmVjdHMgbWVtb3J5OiAlZCBLQiwgTWF4IG1lbW9yeSB1c2VkOiAlZCBLQlxuIiwKKyAgICAgICAgICAgIHNwYWNlcywgIiIsCisgICAgICAgICAgICAoZmxvYXQpIG1Ub3RhbEVmZmVjdHNDcHVMb2FkIC8gMTAsCisgICAgICAgICAgICBtVG90YWxFZmZlY3RzTWVtb3J5LAorICAgICAgICAgICAgbVRvdGFsRWZmZWN0c01lbW9yeU1heFVzZWQpOworICAgIH0KKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzRWZmZWN0czpcbiIsIHNwYWNlcywgIiIpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcy0gRWZmZWN0ICVkOlxuIiwgc3BhY2VzLCAiIiwga2V5QXQoaSkpOworICAgICAgICB2YWx1ZUF0KGkpLT5kdW1wKGRzdCwgc3BhY2VzICsgMik7CisgICAgfQogfQogCiB9OyAvL25hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9HYWlucy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9HYWlucy5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0MDdhMTcuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvR2FpbnMuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6R2FpbnMiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLS8vI2RlZmluZSBWRVJZX1ZFUkJPU0VfTE9HR0lORwotI2lmZGVmIFZFUllfVkVSQk9TRV9MT0dHSU5HCi0jZGVmaW5lIEFMT0dWViBBTE9HVgotI2Vsc2UKLSNkZWZpbmUgQUxPR1ZWKGEuLi4pIGRvIHsgfSB3aGlsZSgwKQotI2VuZGlmCi0KLSNpbmNsdWRlICJHYWlucy5oIgotI2luY2x1ZGUgPFZvbHVtZS5oPgotI2luY2x1ZGUgPG1hdGguaD4KLSNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gRW5naW5lZGVmYXVsdAotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtNDkuNWZ9LCB7MzMsIC0zMy41Zn0sIHs2NiwgLTE3LjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC01OC4wZn0sIHsyMCwgLTQwLjBmfSwgezYwLCAtMTcuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTU4LjBmfSwgezIwLCAtNDAuMGZ9LCB7NjAsIC0yMS4wZn0sIHsxMDAsIC0xMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtNTYuMGZ9LCB7MjAsIC0zNC4wZn0sIHs2MCwgLTExLjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmNbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtNTUuMGZ9LCB7MjAsIC00My4wZn0sIHs4NiwgLTEyLjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTI5LjdmfSwgezMzLCAtMjAuMWZ9LCB7NjYsIC0xMC4yZn0sIHsxMDAsIDAuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC0zNS43Zn0sIHszMywgLTI2LjFmfSwgezY2LCAtMTMuMmZ9LCB7MTAwLCAwLjBmfQotfTsKLQotLy8gQVVESU9fU1RSRUFNX1NZU1RFTSwgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUgYW5kIEFVRElPX1NUUkVBTV9EVE1GIHZvbHVtZSB0cmFja3MKLS8vIEFVRElPX1NUUkVBTV9SSU5HIG9uIHBob25lcyBhbmQgQVVESU9fU1RSRUFNX01VU0lDIG9uIHRhYmxldHMuCi0vLyBBVURJT19TVFJFQU1fRFRNRiB0cmFja3MgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwgd2hpbGUgaW4gY2FsbCAoU2VlIEF1ZGlvU2VydmljZS5qYXZhKS4KLS8vIFRoZSByYW5nZSBpcyBjb25zdHJhaW5lZCBiZXR3ZWVuIC0yNGRCIGFuZCAtNmRCIG92ZXIgc3BlYWtlciBhbmQgLTMwZEIgYW5kIC0xOGRCIG92ZXIgaGVhZHNldC4KLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHsxLCAtMjQuMGZ9LCB7MzMsIC0xOC4wZn0sIHs2NiwgLTEyLjBmfSwgezEwMCwgLTYuMGZ9Ci19OwotCi1jb25zdCBWb2x1bWVDdXJ2ZVBvaW50Ci1HYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZURyY1tWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezEsIC0zNC4wZn0sIHszMywgLTI0LjBmfSwgezY2LCAtMTUuMGZ9LCB7MTAwLCAtNi4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTMwLjBmfSwgezMzLCAtMjYuMGZ9LCB7NjYsIC0yMi4wZn0sIHsxMDAsIC0xOC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHswLCAtNDIuMGZ9LCB7MzMsIC0yOC4wZn0sIHs2NiwgLTE0LjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmVbVm9sdW1lOjpWT0xDTlRdID0gewotICAgIHswLCAtMjQuMGZ9LCB7MzMsIC0xNi4wZn0sIHs2NiwgLTguMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNMaW5lYXJWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezAsIC05Ni4wZn0sIHszMywgLTY4LjBmfSwgezY2LCAtMzQuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNTaWxlbnRWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezAsIC05Ni4wZn0sIHsxLCAtOTYuMGZ9LCB7MiwgLTk2LjBmfSwgezEwMCwgLTk2LjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludAotR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZVtWb2x1bWU6OlZPTENOVF0gPSB7Ci0gICAgezAsIDAuMGZ9LCB7MSwgMC4wZn0sIHsyLCAwLjBmfSwgezEwMCwgMC4wZn0KLX07Ci0KLWNvbnN0IFZvbHVtZUN1cnZlUG9pbnQKLUdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlW1ZvbHVtZTo6Vk9MQ05UXSA9IHsKLSAgICB7MSwgLTEyOC4wZn0sIHsyMCwgLTgwLjBmfSwgezYwLCAtNDAuMGZ9LCB7MTAwLCAwLjBmfQotfTsKLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqR2FpbnM6OnNWb2x1bWVQcm9maWxlc1tBVURJT19TVFJFQU1fQ05UXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbREVWSUNFX0NBVEVHT1JZX0NOVF0gPSB7Ci0gICAgeyAvLyBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTAotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c1NwZWFrZXJWb2ljZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9TWVNURU0KLSAgICAgICAgR2FpbnM6OnNIZWFkc2V0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9SSU5HCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsICAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fTVVTSUMKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdE1lZGlhVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fQUxBUk0KLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04KLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0Vm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlclNvbmlmaWNhdGlvblZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRWb2x1bWVDdXJ2ZSwgIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9IRUFEU0VUCi0gICAgICAgIEdhaW5zOjpzU3BlYWtlclZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFZvaWNlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFCi0gICAgICAgIEdhaW5zOjpzSGVhZHNldFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c0RlZmF1bHRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FQVJQSUVDRQotICAgICAgICBHYWluczo6c0V4dE1lZGlhU3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgICAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7ICAvLyBBVURJT19TVFJFQU1fRFRNRgotICAgICAgICBHYWluczo6c0hlYWRzZXRTeXN0ZW1Wb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9TUEVBS0VSCi0gICAgICAgIEdhaW5zOjpzRGVmYXVsdFN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNFeHRNZWRpYVN5c3RlbVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBCi0gICAgICAgIEdhaW5zOjpzSGVhcmluZ0FpZFZvbHVtZUN1cnZlICAgICAgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fVFRTCi0gICAgICAvLyAiVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyIjogYWx3YXlzIHNpbGVudCBleGNlcHQgb24gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNTaWxlbnRWb2x1bWVDdXJ2ZSwgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNTaWxlbnRWb2x1bWVDdXJ2ZSwgICAgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzU2lsZW50Vm9sdW1lQ3VydmUsICAgIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNIZWFyaW5nQWlkVm9sdW1lQ3VydmUgIC8vIERFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRAotICAgIH0sCi0gICAgeyAvLyBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWQotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c1NwZWFrZXJNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0RlZmF1bHRNZWRpYVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNEZWZhdWx0TWVkaWFWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0hlYXJpbmdBaWRWb2x1bWVDdXJ2ZSAgICAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9SRVJPVVRJTkcKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0hFQURTRVQKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFCi0gICAgICAgIEdhaW5zOjpzRnVsbFNjYWxlVm9sdW1lQ3VydmUsIC8vIERFVklDRV9DQVRFR09SWV9FWFRfTUVESUEKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSAgLy8gREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlECi0gICAgfSwKLSAgICB7IC8vIEFVRElPX1NUUkVBTV9QQVRDSAotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfSEVBRFNFVAotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUgotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlLCAvLyBERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UKLSAgICAgICAgR2FpbnM6OnNGdWxsU2NhbGVWb2x1bWVDdXJ2ZSwgLy8gREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQQotICAgICAgICBHYWluczo6c0Z1bGxTY2FsZVZvbHVtZUN1cnZlICAvLyBERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQKLSAgICB9LAotfTsKLQotLy9zdGF0aWMKLWZsb2F0IEdhaW5zOjp2b2xJbmRleFRvRGIoY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqY3VydmUsIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4LCBpbnQgaW5kZXhJblVpKQotewotICAgIC8vIHRoZSB2b2x1bWUgaW5kZXggaW4gdGhlIFVJIGlzIHJlbGF0aXZlIHRvIHRoZSBtaW4gYW5kIG1heCB2b2x1bWUgaW5kaWNlcyBmb3IgdGhpcyBzdHJlYW0gdHlwZQotICAgIGludCBuYlN0ZXBzID0gMSArIGN1cnZlW1ZvbHVtZTo6Vk9MTUFYXS5tSW5kZXggLSBjdXJ2ZVtWb2x1bWU6OlZPTE1JTl0ubUluZGV4OwotICAgIGludCB2b2xJZHggPSAobmJTdGVwcyAqIChpbmRleEluVWkgLSBpbmRleE1pbikpIC8gKGluZGV4TWF4IC0gaW5kZXhNaW4pOwotCi0gICAgLy8gZmluZCB3aGF0IHBhcnQgb2YgdGhlIGN1cnZlIHRoaXMgaW5kZXggdm9sdW1lIGJlbG9uZ3MgdG8sIG9yIGlmIGl0J3Mgb3V0IG9mIGJvdW5kcwotICAgIGludCBzZWdtZW50ID0gMDsKLSAgICBpZiAodm9sSWR4IDwgY3VydmVbVm9sdW1lOjpWT0xNSU5dLm1JbmRleCkgeyAgICAgICAgIC8vIG91dCBvZiBib3VuZHMKLSAgICAgICAgcmV0dXJuIFZPTFVNRV9NSU5fREI7Ci0gICAgfSBlbHNlIGlmICh2b2xJZHggPCBjdXJ2ZVtWb2x1bWU6OlZPTEtORUUxXS5tSW5kZXgpIHsKLSAgICAgICAgc2VnbWVudCA9IDA7Ci0gICAgfSBlbHNlIGlmICh2b2xJZHggPCBjdXJ2ZVtWb2x1bWU6OlZPTEtORUUyXS5tSW5kZXgpIHsKLSAgICAgICAgc2VnbWVudCA9IDE7Ci0gICAgfSBlbHNlIGlmICh2b2xJZHggPD0gY3VydmVbVm9sdW1lOjpWT0xNQVhdLm1JbmRleCkgewotICAgICAgICBzZWdtZW50ID0gMjsKLSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG91dCBvZiBib3VuZHMKLSAgICAgICAgcmV0dXJuIDAuMGY7Ci0gICAgfQotCi0gICAgLy8gbGluZWFyIGludGVycG9sYXRpb24gaW4gdGhlIGF0dGVudWF0aW9uIHRhYmxlIGluIGRCCi0gICAgZmxvYXQgZGVjaWJlbHMgPSBjdXJ2ZVtzZWdtZW50XS5tREJBdHRlbnVhdGlvbiArCi0gICAgICAgICAgICAoKGZsb2F0KSh2b2xJZHggLSBjdXJ2ZVtzZWdtZW50XS5tSW5kZXgpKSAqCi0gICAgICAgICAgICAgICAgKCAoY3VydmVbc2VnbWVudCsxXS5tREJBdHRlbnVhdGlvbiAtCi0gICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tREJBdHRlbnVhdGlvbikgLwotICAgICAgICAgICAgICAgICAgICAoKGZsb2F0KShjdXJ2ZVtzZWdtZW50KzFdLm1JbmRleCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VydmVbc2VnbWVudF0ubUluZGV4KSkgKTsKLQotICAgIEFMT0dWVigiVk9MVU1FIHZvbCBpbmRleD1bJWQgJWQgJWRdLCBkQj1bJS4xZiAlLjFmICUuMWZdIiwKLSAgICAgICAgICAgIGN1cnZlW3NlZ21lbnRdLm1JbmRleCwgdm9sSWR4LAotICAgICAgICAgICAgY3VydmVbc2VnbWVudCsxXS5tSW5kZXgsCi0gICAgICAgICAgICBjdXJ2ZVtzZWdtZW50XS5tREJBdHRlbnVhdGlvbiwKLSAgICAgICAgICAgIGRlY2liZWxzLAotICAgICAgICAgICAgY3VydmVbc2VnbWVudCsxXS5tREJBdHRlbnVhdGlvbik7Ci0KLSAgICByZXR1cm4gZGVjaWJlbHM7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0h3TW9kdWxlLmNwcAppbmRleCBhZWY3ZGJlLi44ODZlNGM5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Id01vZHVsZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSHdNb2R1bGUuY3BwCkBAIC0xOSw3ICsxOSw2IEBACiAKICNpbmNsdWRlICJId01vZHVsZS5oIgogI2luY2x1ZGUgIklPUHJvZmlsZS5oIgotI2luY2x1ZGUgIkF1ZGlvR2Fpbi5oIgogI2luY2x1ZGUgPHBvbGljeS5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgogCkBAIC00Miw3ICs0MSw3IEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBId01vZHVsZTo6YWRkT3V0cHV0UHJvZmlsZShjb25zdCBTdHJpbmc4JiBuYW1lLCBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorc3RhdHVzX3QgSHdNb2R1bGU6OmFkZE91dHB1dFByb2ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKQogewogICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IG5ldyBPdXRwdXRQcm9maWxlKG5hbWUpOwpAQCAtNTAsOCArNDksMTAgQEAKICAgICBwcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUobmV3IEF1ZGlvUHJvZmlsZShjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSkpOwogCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKGRldmljZSk7Ci0gICAgZGV2RGVzYy0+bUFkZHJlc3MgPSBhZGRyZXNzOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihkZXZpY2UsICIiIC8qdGFnTmFtZSovLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICBhZGREeW5hbWljRGV2aWNlKGRldkRlc2MpOworICAgIC8vIFJlY2lwcm9jYWxseSBhdHRhY2ggdGhlIGRldmljZSB0byB0aGUgbW9kdWxlCisgICAgZGV2RGVzYy0+YXR0YWNoKHRoaXMpOwogICAgIHByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShkZXZEZXNjKTsKIAogICAgIHJldHVybiBhZGRPdXRwdXRQcm9maWxlKHByb2ZpbGUpOwpAQCAtOTMsMTAgKzk0LDEzIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBId01vZHVsZTo6cmVtb3ZlT3V0cHV0UHJvZmlsZShjb25zdCBTdHJpbmc4JiBuYW1lKQorc3RhdHVzX3QgSHdNb2R1bGU6OnJlbW92ZU91dHB1dFByb2ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpCiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgaWYgKG1PdXRwdXRQcm9maWxlc1tpXS0+Z2V0TmFtZSgpID09IG5hbWUpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogbU91dHB1dFByb2ZpbGVzW2ldLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVEeW5hbWljRGV2aWNlKGRldmljZSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtT3V0cHV0UHJvZmlsZXMucmVtb3ZlQXQoaSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMTA1LDI3ICsxMDksMzIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190IEh3TW9kdWxlOjphZGRJbnB1dFByb2ZpbGUoY29uc3QgU3RyaW5nOCYgbmFtZSwgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKK3N0YXR1c190IEh3TW9kdWxlOjphZGRJbnB1dFByb2ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpCiB7CiAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gbmV3IElucHV0UHJvZmlsZShuYW1lKTsKICAgICBwcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUobmV3IEF1ZGlvUHJvZmlsZShjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSkpOwogCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IG5ldyBEZXZpY2VEZXNjcmlwdG9yKGRldmljZSk7Ci0gICAgZGV2RGVzYy0+bUFkZHJlc3MgPSBhZGRyZXNzOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihkZXZpY2UsICIiIC8qdGFnTmFtZSovLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICBhZGREeW5hbWljRGV2aWNlKGRldkRlc2MpOworICAgIC8vIFJlY2lwcm9jYWxseSBhdHRhY2ggdGhlIGRldmljZSB0byB0aGUgbW9kdWxlCisgICAgZGV2RGVzYy0+YXR0YWNoKHRoaXMpOwogICAgIHByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShkZXZEZXNjKTsKIAogICAgIEFMT0dWKCJhZGRJbnB1dFByb2ZpbGUoKSBuYW1lICVzIHJhdGUgJWQgbWFzayAweCUwOHgiLAotICAgICAgICAgIG5hbWUuc3RyaW5nKCksIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKKyAgICAgICAgICBuYW1lLmNfc3RyKCksIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrKTsKIAogICAgIHJldHVybiBhZGRJbnB1dFByb2ZpbGUocHJvZmlsZSk7CiB9CiAKLXN0YXR1c190IEh3TW9kdWxlOjpyZW1vdmVJbnB1dFByb2ZpbGUoY29uc3QgU3RyaW5nOCYgbmFtZSkKK3N0YXR1c190IEh3TW9kdWxlOjpyZW1vdmVJbnB1dFByb2ZpbGUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUpCiB7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRQcm9maWxlcy5zaXplKCk7IGkrKykgewogICAgICAgICBpZiAobUlucHV0UHJvZmlsZXNbaV0tPmdldE5hbWUoKSA9PSBuYW1lKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmRldmljZSA6IG1JbnB1dFByb2ZpbGVzW2ldLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkpIHsKKyAgICAgICAgICAgICAgICByZW1vdmVEeW5hbWljRGV2aWNlKGRldmljZSk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBtSW5wdXRQcm9maWxlcy5yZW1vdmVBdChpKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNDUsNyArMTU0LDcgQEAKIHNwPERldmljZURlc2NyaXB0b3I+IEh3TW9kdWxlOjpnZXRSb3V0ZVNpbmtEZXZpY2UoY29uc3Qgc3A8QXVkaW9Sb3V0ZT4gJnJvdXRlKSBjb25zdAogewogICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNpbmtEZXZpY2UgPSAwOwotICAgIGlmIChyb3V0ZS0+Z2V0U2luaygpLT5nZXRUeXBlKCkgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgIGlmIChyb3V0ZS0+Z2V0U2luaygpLT5hc0F1ZGlvUG9ydCgpLT5nZXRUeXBlKCkgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewogICAgICAgICBzaW5rRGV2aWNlID0gbURlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VGcm9tVGFnTmFtZShyb3V0ZS0+Z2V0U2luaygpLT5nZXRUYWdOYW1lKCkpOwogICAgIH0KICAgICByZXR1cm4gc2lua0RldmljZTsKQEAgLTE1NSw3ICsxNjQsNyBAQAogewogICAgIERldmljZVZlY3RvciBzb3VyY2VEZXZpY2VzOwogICAgIGZvciAoY29uc3QgYXV0byYgc291cmNlIDogcm91dGUtPmdldFNvdXJjZXMoKSkgewotICAgICAgICBpZiAoc291cmNlLT5nZXRUeXBlKCkgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgeworICAgICAgICBpZiAoc291cmNlLT5hc0F1ZGlvUG9ydCgpLT5nZXRUeXBlKCkgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewogICAgICAgICAgICAgc291cmNlRGV2aWNlcy5hZGQobURlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VGcm9tVGFnTmFtZShzb3VyY2UtPmdldFRhZ05hbWUoKSkpOwogICAgICAgICB9CiAgICAgfQpAQCAtMTc1LDIwICsxODQsMjAgQEAKICAgICBmb3IgKGNvbnN0IGF1dG8mIHN0cmVhbSA6IG1JbnB1dFByb2ZpbGVzKSB7CiAgICAgICAgIERldmljZVZlY3RvciBzb3VyY2VEZXZpY2VzOwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHJvdXRlIDogc3RyZWFtLT5nZXRSb3V0ZXMoKSkgewotICAgICAgICAgICAgc3A8QXVkaW9Qb3J0PiBzaW5rID0gcm91dGUtPmdldFNpbmsoKTsKKyAgICAgICAgICAgIHNwPFBvbGljeUF1ZGlvUG9ydD4gc2luayA9IHJvdXRlLT5nZXRTaW5rKCk7CiAgICAgICAgICAgICBpZiAoc2luayA9PSAwIHx8IHN0cmVhbSAhPSBzaW5rKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHJvdXRlIGF0dGFjaGVkIHRvIGlucHV0IHN0cmVhbSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBEZXZpY2VWZWN0b3Igc291cmNlRGV2aWNlc0ZvclJvdXRlID0gZ2V0Um91dGVTb3VyY2VEZXZpY2VzKHJvdXRlKTsKICAgICAgICAgICAgIGlmIChzb3VyY2VEZXZpY2VzRm9yUm91dGUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHNvdXJjZSBkZXZpY2VzIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZWFtLT5nZXROYW1lKCkuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBzb3VyY2UgZGV2aWNlcyBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbS0+Z2V0TmFtZSgpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc291cmNlRGV2aWNlcy5hZGQoc291cmNlRGV2aWNlc0ZvclJvdXRlKTsKICAgICAgICAgfQogICAgICAgICBpZiAoc291cmNlRGV2aWNlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBzb3VyY2UgZGV2aWNlcyBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbS0+Z2V0TmFtZSgpLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBzb3VyY2UgZGV2aWNlcyBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbS0+Z2V0TmFtZSgpLmNfc3RyKCkpOwogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgc3RyZWFtLT5zZXRTdXBwb3J0ZWREZXZpY2VzKHNvdXJjZURldmljZXMpOwpAQCAtMTk2LDE0ICsyMDUsMTQgQEAKICAgICBmb3IgKGNvbnN0IGF1dG8mIHN0cmVhbSA6IG1PdXRwdXRQcm9maWxlcykgewogICAgICAgICBEZXZpY2VWZWN0b3Igc2lua0RldmljZXM7CiAgICAgICAgIGZvciAoY29uc3QgYXV0byYgcm91dGUgOiBzdHJlYW0tPmdldFJvdXRlcygpKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb1BvcnQ+IHNvdXJjZSA9IHJvdXRlLT5nZXRTb3VyY2VzKCkuZmluZEJ5VGFnTmFtZShzdHJlYW0tPmdldFRhZ05hbWUoKSk7CisgICAgICAgICAgICBzcDxQb2xpY3lBdWRpb1BvcnQ+IHNvdXJjZSA9IGZpbmRCeVRhZ05hbWUocm91dGUtPmdldFNvdXJjZXMoKSwgc3RyZWFtLT5nZXRUYWdOYW1lKCkpOwogICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSAwIHx8IHN0cmVhbSAhPSBzb3VyY2UpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcm91dGUgYXR0YWNoZWQgdG8gb3V0cHV0IHN0cmVhbSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzaW5rRGV2aWNlID0gZ2V0Um91dGVTaW5rRGV2aWNlKHJvdXRlKTsKICAgICAgICAgICAgIGlmIChzaW5rRGV2aWNlID09IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGludmFsaWQgc2luayBkZXZpY2UgZm9yICVzIiwgX19GVU5DVElPTl9fLCBzdHJlYW0tPmdldE5hbWUoKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBpbnZhbGlkIHNpbmsgZGV2aWNlIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgc3RyZWFtLT5nZXROYW1lKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzaW5rRGV2aWNlcy5hZGQoc2lua0RldmljZSk7CkBAIC0yMTgsMzcgKzIyNywzOCBAQAogICAgIG1IYW5kbGUgPSBoYW5kbGU7CiB9CiAKLXZvaWQgSHdNb2R1bGU6OmR1bXAoaW50IGZkKQotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OworYm9vbCBId01vZHVsZTo6c3VwcG9ydHNQYXRjaChjb25zdCBzcDxQb2xpY3lBdWRpb1BvcnQ+ICZzcmNQb3J0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxQb2xpY3lBdWRpb1BvcnQ+ICZkc3RQb3J0KSBjb25zdCB7CisgICAgZm9yIChjb25zdCBhdXRvICZyb3V0ZSA6IG1Sb3V0ZXMpIHsKKyAgICAgICAgaWYgKHJvdXRlLT5zdXBwb3J0c1BhdGNoKHNyY1BvcnQsIGRzdFBvcnQpKSB7CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CiAKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgIC0gbmFtZTogJXNcbiIsIGdldE5hbWUoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgLSBoYW5kbGU6ICVkXG4iLCBtSGFuZGxlKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAtIHZlcnNpb246ICV1LiV1XG4iLCBnZXRIYWxWZXJzaW9uTWFqb3IoKSwgZ2V0SGFsVmVyc2lvbk1pbm9yKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKK3ZvaWQgSHdNb2R1bGU6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgIC0gbmFtZTogJXNcbiIsIGdldE5hbWUoKSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgLSBoYW5kbGU6ICVkXG4iLCBtSGFuZGxlKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAtIHZlcnNpb246ICV1LiV1XG4iLCBnZXRIYWxWZXJzaW9uTWFqb3IoKSwgZ2V0SGFsVmVyc2lvbk1pbm9yKCkpOwogICAgIGlmIChtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpKSB7Ci0gICAgICAgIHdyaXRlKGZkLCAiICAtIG91dHB1dHM6XG4iLCBzdHJsZW4oIiAgLSBvdXRwdXRzOlxuIikpOworICAgICAgICBkc3QtPmFwcGVuZCgiICAtIG91dHB1dHM6XG4iKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0UHJvZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICBvdXRwdXQgJXp1OlxuIiwgaSk7Ci0gICAgICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgICAgICBtT3V0cHV0UHJvZmlsZXNbaV0tPmR1bXAoZmQpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgICBvdXRwdXQgJXp1OlxuIiwgaSk7CisgICAgICAgICAgICBtT3V0cHV0UHJvZmlsZXNbaV0tPmR1bXAoZHN0KTsKICAgICAgICAgfQogICAgIH0KICAgICBpZiAobUlucHV0UHJvZmlsZXMuc2l6ZSgpKSB7Ci0gICAgICAgIHdyaXRlKGZkLCAiICAtIGlucHV0czpcbiIsIHN0cmxlbigiICAtIGlucHV0czpcbiIpKTsKKyAgICAgICAgZHN0LT5hcHBlbmQoIiAgLSBpbnB1dHM6XG4iKTsKICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRQcm9maWxlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgIGlucHV0ICV6dTpcbiIsIGkpOwotICAgICAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICAgICAgbUlucHV0UHJvZmlsZXNbaV0tPmR1bXAoZmQpOworICAgICAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgICBpbnB1dCAlenU6XG4iLCBpKTsKKyAgICAgICAgICAgIG1JbnB1dFByb2ZpbGVzW2ldLT5kdW1wKGRzdCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbURlY2xhcmVkRGV2aWNlcy5kdW1wKGZkLCBTdHJpbmc4KCJEZWNsYXJlZCIpLCAgMiwgdHJ1ZSk7Ci0gICAgbVJvdXRlcy5kdW1wKGZkLCAyKTsKKyAgICBtRGVjbGFyZWREZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCJEZWNsYXJlZCIpLCAyLCB0cnVlKTsKKyAgICBtRHluYW1pY0RldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIkR5bmFtaWMiKSwgIDIsIHRydWUpOworICAgIGR1bXBBdWRpb1JvdXRlVmVjdG9yKG1Sb3V0ZXMsIGRzdCwgMik7CiB9CiAKIHNwIDxId01vZHVsZT4gSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXRNb2R1bGVGcm9tTmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdApAQCAtMjYxLDY0ICsyNzEsMTY4IEBACiAgICAgcmV0dXJuIG51bGxwdHI7CiB9CiAKLXNwIDxId01vZHVsZT4gSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXRNb2R1bGVGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3QKK3NwIDxId01vZHVsZT4gSHdNb2R1bGVDb2xsZWN0aW9uOjpnZXRNb2R1bGVGb3JEZXZpY2VUeXBlKGF1ZGlvX2RldmljZXNfdCB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgY29uc3QKIHsKICAgICBmb3IgKGNvbnN0IGF1dG8mIG1vZHVsZSA6ICp0aGlzKSB7Ci0gICAgICAgIGNvbnN0IGF1dG8mIHByb2ZpbGVzID0gYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpID8KKyAgICAgICAgY29uc3QgYXV0byYgcHJvZmlsZXMgPSBhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpID8KICAgICAgICAgICAgICAgICBtb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkgOiBtb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKTsKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwcm9maWxlIDogcHJvZmlsZXMpIHsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbW9kdWxlOworICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnRzRGV2aWNlVHlwZXMoe3R5cGV9KSkgeworICAgICAgICAgICAgICAgIGlmIChlbmNvZGVkRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBkZWNsYXJlZERldmljZXMgPSBtb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpOworICAgICAgICAgICAgICAgICAgICBzcCA8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlRGVzYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjbGFyZWREZXZpY2VzLmdldERldmljZSh0eXBlLCBTdHJpbmc4KCksIGVuY29kZWRGb3JtYXQpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlRGVzYykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vZHVsZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb2R1bGU7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogICAgIHJldHVybiBudWxscHRyOwogfQogCi1zcDxEZXZpY2VEZXNjcmlwdG9yPiBId01vZHVsZUNvbGxlY3Rpb246OmdldERldmljZURlc2NyaXB0b3IoY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG1hdGNoQWRyZXNzKSBjb25zdAorc3A8SHdNb2R1bGU+IEh3TW9kdWxlQ29sbGVjdGlvbjo6Z2V0TW9kdWxlRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpIGNvbnN0CiB7Ci0gICAgU3RyaW5nOCBhZGRyZXNzID0gKGRldmljZV9hZGRyZXNzID09IG51bGxwdHIpID8gU3RyaW5nOCgiIikgOiBTdHJpbmc4KGRldmljZV9hZGRyZXNzKTsKKyAgICByZXR1cm4gZ2V0TW9kdWxlRm9yRGV2aWNlVHlwZShkZXZpY2UtPnR5cGUoKSwgZW5jb2RlZEZvcm1hdCk7Cit9CisKK0RldmljZVZlY3RvciBId01vZHVsZUNvbGxlY3Rpb246OmdldEF2YWlsYWJsZURldmljZXNGcm9tTW9kdWxlTmFtZSgKKyAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVEZXZpY2VzKSBjb25zdAoreworICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBnZXRNb2R1bGVGcm9tTmFtZShuYW1lKTsKKyAgICBpZiAobW9kdWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcigpOworICAgIH0KKyAgICByZXR1cm4gYXZhaWxhYmxlRGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKG1vZHVsZS0+Z2V0SGFuZGxlKCkpOworfQorCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBId01vZHVsZUNvbGxlY3Rpb246OmdldERldmljZURlc2NyaXB0b3IoY29uc3QgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd1RvQ3JlYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgbWF0Y2hBZGRyZXNzKSBjb25zdAoreworICAgIFN0cmluZzggZGV2QWRkcmVzcyA9IChhZGRyZXNzID09IG51bGxwdHIgfHwgIW1hdGNoQWRkcmVzcykgPyBTdHJpbmc4KCIiKSA6IFN0cmluZzgoYWRkcmVzcyk7CiAgICAgLy8gaGFuZGxlIGxlZ2FjeSByZW1vdGUgc3VibWl4IGNhc2Ugd2hlcmUgdGhlIGFkZHJlc3Mgd2FzIG5vdCBhbHdheXMgc3BlY2lmaWVkCi0gICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSAmJiAoYWRkcmVzcy5sZW5ndGgoKSA9PSAwKSkgewotICAgICAgICBhZGRyZXNzID0gU3RyaW5nOCgiMCIpOworICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZVR5cGUpICYmIChkZXZBZGRyZXNzLmxlbmd0aCgpID09IDApKSB7CisgICAgICAgIGRldkFkZHJlc3MgPSBTdHJpbmc4KCIwIik7CiAgICAgfQogCiAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6ICp0aGlzKSB7Ci0gICAgICAgIERldmljZVZlY3RvciBkZWNsYXJlZERldmljZXMgPSBod01vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCk7Ci0gICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gZGVjbGFyZWREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZUFkZHIoZGV2aWNlLCBhZGRyZXNzKTsKLSAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIGRldmljZUxpc3QuaXRlbUF0KDApOworICAgICAgICBEZXZpY2VWZWN0b3IgbW9kdWxlRGV2aWNlcyA9IGh3TW9kdWxlLT5nZXRBbGxEZXZpY2VzKCk7CisgICAgICAgIGF1dG8gbW9kdWxlRGV2aWNlID0gbW9kdWxlRGV2aWNlcy5nZXREZXZpY2UoZGV2aWNlVHlwZSwgZGV2QWRkcmVzcywgZW5jb2RlZEZvcm1hdCk7CisgICAgICAgIGlmIChtb2R1bGVEZXZpY2UpIHsKKyAgICAgICAgICAgIGlmIChlbmNvZGVkRm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgICAgICAgICAgbW9kdWxlRGV2aWNlLT5zZXRFbmNvZGVkRm9ybWF0KGVuY29kZWRGb3JtYXQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGFsbG93VG9DcmVhdGUpIHsKKyAgICAgICAgICAgICAgICBtb2R1bGVEZXZpY2UtPmF0dGFjaChod01vZHVsZSk7CisgICAgICAgICAgICAgICAgbW9kdWxlRGV2aWNlLT5zZXRBZGRyZXNzKGRldkFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIG1vZHVsZURldmljZS0+c2V0TmFtZShuYW1lKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBtb2R1bGVEZXZpY2U7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCFtYXRjaEFkcmVzcykgewotICAgICAgICAgICAgZGV2aWNlTGlzdCA9IGRlY2xhcmVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmICghZGV2aWNlTGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZGV2aWNlTGlzdC5pdGVtQXQoMCk7CisgICAgfQorICAgIGlmICghYWxsb3dUb0NyZWF0ZSkgeworICAgICAgICBBTE9HVigiJXM6IGNvdWxkIG5vdCBmaW5kIEhXIG1vZHVsZSBmb3IgZGV2aWNlICVzICUwNHggYWRkcmVzcyAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgbmFtZSwgZGV2aWNlVHlwZSwgYWRkcmVzcyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gY3JlYXRlRGV2aWNlKGRldmljZVR5cGUsIGFkZHJlc3MsIG5hbWUsIGVuY29kZWRGb3JtYXQpOworfQorCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBId01vZHVsZUNvbGxlY3Rpb246OmNyZWF0ZURldmljZShjb25zdCBhdWRpb19kZXZpY2VzX3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkgY29uc3QKK3sKKyAgICBzcDxId01vZHVsZT4gaHdNb2R1bGUgPSBnZXRNb2R1bGVGb3JEZXZpY2VUeXBlKHR5cGUsIGVuY29kZWRGb3JtYXQpOworICAgIGlmIChod01vZHVsZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJTA0eCBhZGRyZXNzICVzIiwgX19GVU5DVElPTl9fLCB0eXBlLAorICAgICAgICAgICAgICBhZGRyZXNzKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IodHlwZSwgbmFtZSwgYWRkcmVzcyk7CisgICAgZGV2aWNlLT5zZXROYW1lKG5hbWUpOworICAgIGRldmljZS0+c2V0RW5jb2RlZEZvcm1hdChlbmNvZGVkRm9ybWF0KTsKKworICAvLyBBZGQgdGhlIGRldmljZSB0byB0aGUgbGlzdCBvZiBkeW5hbWljIGRldmljZXMKKyAgICBod01vZHVsZS0+YWRkRHluYW1pY0RldmljZShkZXZpY2UpOworICAgIC8vIFJlY2lwcm9jYWxseSBhdHRhY2ggdGhlIGRldmljZSB0byB0aGUgbW9kdWxlCisgICAgZGV2aWNlLT5hdHRhY2goaHdNb2R1bGUpOworICAgIEFMT0dEKCIlczogYWRkaW5nIGR5bmFtaWMgZGV2aWNlICVzIHRvIG1vZHVsZSAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CisKKyAgICBjb25zdCBhdXRvICZwcm9maWxlcyA9IChhdWRpb19pc19vdXRwdXRfZGV2aWNlKHR5cGUpID8gaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGh3TW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCkpOworICAgIGZvciAoY29uc3QgYXV0byAmcHJvZmlsZSA6IHByb2ZpbGVzKSB7CisgICAgICAgIC8vIEFkZCB0aGUgZGV2aWNlIGFzIHN1cHBvcnRlZCB0byBhbGwgcHJvZmlsZSBzdXBwb3J0aW5nICJ3ZWFrbHkiIG9yIG5vdCB0aGUgZGV2aWNlCisgICAgICAgIC8vIGFjY29yZGluZyB0byBpdHMgdHlwZQorICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlLCBmYWxzZSAvKm1hdGNoQWRyZXNzKi8pKSB7CisKKyAgICAgICAgICAgIC8vIEB0b2RvIHF1aWQgb2YgYXVkaW8gcHJvZmlsZT8gaW1wb3J0IHRoZSBwcm9maWxlIGZyb20gZGV2aWNlIG9mIHRoZSBzYW1lIHR5cGU/CisgICAgICAgICAgICBjb25zdCBhdXRvICZpc29UeXBlRGV2aWNlRm9yUHJvZmlsZSA9CisgICAgICAgICAgICAgICAgcHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlcygpLmdldERldmljZSh0eXBlLCBTdHJpbmc4KCksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgIGRldmljZS0+aW1wb3J0QXVkaW9Qb3J0QW5kUGlja0F1ZGlvUHJvZmlsZShpc29UeXBlRGV2aWNlRm9yUHJvZmlsZSwgdHJ1ZSAvKiBmb3JjZSAqLyk7CisKKyAgICAgICAgICAgIEFMT0dWKCIlczogYWRkaW5nIGRldmljZSAlcyB0byBwcm9maWxlICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIHByb2ZpbGUtPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShkZXZpY2UpOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBkZXZpY2U7Cit9CisKK3ZvaWQgSHdNb2R1bGVDb2xsZWN0aW9uOjpjbGVhblVwRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UpCit7CisgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6ICp0aGlzKSB7CisgICAgICAgIERldmljZVZlY3RvciBtb2R1bGVEZXZpY2VzID0gaHdNb2R1bGUtPmdldEFsbERldmljZXMoKTsKKyAgICAgICAgaWYgKCFtb2R1bGVEZXZpY2VzLmNvbnRhaW5zKGRldmljZSkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gcmVtb3ZhbCBvZiByZW1vdGUgc3VibWl4IGRldmljZXMgYXNzb2NpYXRlZCB3aXRoIGEgZHluYW1pYyBwb2xpY3kgaXMKKyAgICAgICAgLy8gaGFuZGxlZCBieSByZW1vdmVPdXRwdXRQcm9maWxlKCkgYW5kIHJlbW92ZUlucHV0UHJvZmlsZSgpCisgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShkZXZpY2UtPnR5cGUoKSkgJiYgZGV2aWNlLT5hZGRyZXNzKCkgIT0gIjAiKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGRldmljZS0+ZGV0YWNoKCk7CisgICAgICAgIC8vIE9ubHkgcmVtb3ZlIGZyb20gZHluYW1pYyBsaXN0LCBub3QgZnJvbSBkZWNsYXJlZCBsaXN0ISEhCisgICAgICAgIGlmICghaHdNb2R1bGUtPmdldER5bmFtaWNEZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGh3TW9kdWxlLT5yZW1vdmVEeW5hbWljRGV2aWNlKGRldmljZSk7CisgICAgICAgIEFMT0dWKCIlczogcmVtb3ZlZCBkeW5hbWljIGRldmljZSAlcyBmcm9tIG1vZHVsZSAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIGh3TW9kdWxlLT5nZXROYW1lKCkpOworCisgICAgICAgIGNvbnN0IElPUHJvZmlsZUNvbGxlY3Rpb24gJnByb2ZpbGVzID0gYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UtPnR5cGUoKSkgPworICAgICAgICAgICAgICAgICAgICBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKSA6IGh3TW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmcHJvZmlsZSA6IHByb2ZpbGVzKSB7CisgICAgICAgICAgICAvLyBGb3IgY2xlYW51cCwgc3Ryb25nIG1hdGNoIGlzIHJlcXVpcmVkCisgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlLCB0cnVlIC8qbWF0Y2hBZHJlc3MqLykpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6IHJlbW92aW5nIGRldmljZSAlcyBmcm9tIHByb2ZpbGUgJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIHByb2ZpbGUtPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBwcm9maWxlLT5yZW1vdmVTdXBwb3J0ZWREZXZpY2UoZGV2aWNlKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihkZXZpY2UpOwotICAgIGRldkRlc2MtPnNldE5hbWUoU3RyaW5nOChkZXZpY2VfbmFtZSkpOwotICAgIGRldkRlc2MtPm1BZGRyZXNzID0gYWRkcmVzczsKLSAgICByZXR1cm4gZGV2RGVzYzsKIH0KIAotc3RhdHVzX3QgSHdNb2R1bGVDb2xsZWN0aW9uOjpkdW1wKGludCBmZCkgY29uc3QKK3ZvaWQgSHdNb2R1bGVDb2xsZWN0aW9uOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLQotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuSFcgTW9kdWxlcyBkdW1wOlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOworICAgIGRzdC0+YXBwZW5kKCJcbkhXIE1vZHVsZXMgZHVtcDpcbiIpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiLSBIVyBNb2R1bGUgJXp1OlxuIiwgaSArIDEpOwotICAgICAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgICAgIGl0ZW1BdChpKS0+ZHVtcChmZCk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCItIEhXIE1vZHVsZSAlenU6XG4iLCBpICsgMSk7CisgICAgICAgIGl0ZW1BdChpKS0+ZHVtcChkc3QpOwogICAgIH0KLSAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL0lPUHJvZmlsZS5jcHAKaW5kZXggMzkwZWEzNi4uYmYxYTBmNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvSU9Qcm9maWxlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9JT1Byb2ZpbGUuY3BwCkBAIC0yMCwxNiArMjAsMTEgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8tYmFzZS5oPgogI2luY2x1ZGUgIklPUHJvZmlsZS5oIgogI2luY2x1ZGUgIkh3TW9kdWxlLmgiCi0jaW5jbHVkZSAiQXVkaW9HYWluLmgiCiAjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLS8vIGNoZWNrcyBpZiB0aGUgSU8gcHJvZmlsZSBpcyBjb21wYXRpYmxlIHdpdGggc3BlY2lmaWVkIHBhcmFtZXRlcnMuCi0vLyBTYW1wbGluZyByYXRlLCBmb3JtYXQgYW5kIGNoYW5uZWwgbWFzayBtdXN0IGJlIHNwZWNpZmllZCBpbiBvcmRlciB0bwotLy8gZ2V0IGEgdmFsaWQgYSBtYXRjaAotYm9vbCBJT1Byb2ZpbGU6OmlzQ29tcGF0aWJsZVByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MsCitib29sIElPUHJvZmlsZTo6aXNDb21wYXRpYmxlUHJvZmlsZShjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqdXBkYXRlZFNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKQEAgLTQ2LDE0ICs0MSw4IEBACiAgICAgICAgICAgICBnZXRUeXBlKCkgPT0gQVVESU9fUE9SVF9UWVBFX01JWCAmJiBnZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NJTks7CiAgICAgQUxPR19BU1NFUlQoaXNQbGF5YmFja1RocmVhZCAhPSBpc1JlY29yZFRocmVhZCk7CiAKLQotICAgIGlmIChkZXZpY2UgIT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgLy8ganVzdCBjaGVjayB0eXBlcyBpZiBtdWx0aXBsZSBkZXZpY2VzIGFyZSBzZWxlY3RlZAotICAgICAgICBpZiAocG9wY291bnQoZGV2aWNlICYgfkFVRElPX0RFVklDRV9CSVRfSU4pID4gMSkgewotICAgICAgICAgICAgaWYgKChtU3VwcG9ydGVkRGV2aWNlcy50eXBlcygpICYgZGV2aWNlKSAhPSBkZXZpY2UpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobVN1cHBvcnRlZERldmljZXMuZ2V0RGV2aWNlKGRldmljZSwgYWRkcmVzcykgPT0gMCkgeworICAgIGlmICghZGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgaWYgKCFtU3VwcG9ydGVkRGV2aWNlcy5jb250YWluc0FsbERldmljZXMoZGV2aWNlcykpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0KQEAgLTg5LDcgKzc4LDEwIEBACiAgICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoaXNQbGF5YmFja1RocmVhZCAmJiAoZ2V0RmxhZ3MoKSAmIGZsYWdzKSAhPSBmbGFncykgeworICAgIGNvbnN0IHVpbnQzMl90IG11c3RNYXRjaE91dHB1dEZsYWdzID0KKyAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVHxBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DfEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlE7CisgICAgaWYgKGlzUGxheWJhY2tUaHJlYWQgJiYgKCgoZ2V0RmxhZ3MoKSBeIGZsYWdzKSAmIG11c3RNYXRjaE91dHB1dEZsYWdzKQorICAgICAgICAgICAgICAgICAgICB8fCAoZ2V0RmxhZ3MoKSAmIGZsYWdzKSAhPSBmbGFncykpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgICAvLyBUaGUgb25seSBpbnB1dCBmbGFnIHRoYXQgaXMgYWxsb3dlZCB0byBiZSBkaWZmZXJlbnQgaXMgdGhlIGZhc3QgZmxhZy4KQEAgLTExMywxNiArMTA1LDEzIEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgSU9Qcm9maWxlOjpkdW1wKGludCBmZCkKK3ZvaWQgSU9Qcm9maWxlOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKIHsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKKyAgICBzdGQ6OnN0cmluZyBwb3J0U3RyOworICAgIEF1ZGlvUG9ydDo6ZHVtcCgmcG9ydFN0ciwgNCk7CisgICAgZHN0LT5hcHBlbmQocG9ydFN0ci5jX3N0cigpKTsKIAotICAgIEF1ZGlvUG9ydDo6ZHVtcChmZCwgNCk7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgLSBmbGFnczogMHglMDR4IiwgZ2V0RmxhZ3MoKSk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgICAgLSBmbGFnczogMHglMDR4IiwgZ2V0RmxhZ3MoKSk7CiAgICAgc3RkOjpzdHJpbmcgZmxhZ3NMaXRlcmFsOwogICAgIGlmIChnZXRSb2xlKCkgPT0gQVVESU9fUE9SVF9ST0xFX1NJTkspIHsKICAgICAgICAgSW5wdXRGbGFnQ29udmVydGVyOjptYXNrVG9TdHJpbmcoZ2V0RmxhZ3MoKSwgZmxhZ3NMaXRlcmFsKTsKQEAgLTEzMCwyMSArMTE5LDE0IEBACiAgICAgICAgIE91dHB1dEZsYWdDb252ZXJ0ZXI6Om1hc2tUb1N0cmluZyhnZXRGbGFncygpLCBmbGFnc0xpdGVyYWwpOwogICAgIH0KICAgICBpZiAoIWZsYWdzTGl0ZXJhbC5lbXB0eSgpKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmRGb3JtYXQoIiAoJXMpIiwgZmxhZ3NMaXRlcmFsLmNfc3RyKCkpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICglcykiLCBmbGFnc0xpdGVyYWwuY19zdHIoKSk7CiAgICAgfQotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci0gICAgbVN1cHBvcnRlZERldmljZXMuZHVtcChmZCwgU3RyaW5nOCgiU3VwcG9ydGVkIiksIDQsIGZhbHNlKTsKLQotICAgIHJlc3VsdC5jbGVhcigpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlxuICAgIC0gbWF4T3BlbkNvdW50OiAldSAtIGN1ck9wZW5Db3VudDogJXVcbiIsCisgICAgZHN0LT5hcHBlbmQoIlxuIik7CisgICAgbVN1cHBvcnRlZERldmljZXMuZHVtcChkc3QsIFN0cmluZzgoIlN1cHBvcnRlZCIpLCA0LCBmYWxzZSk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIlxuICAgIC0gbWF4T3BlbkNvdW50OiAldSAtIGN1ck9wZW5Db3VudDogJXVcbiIsCiAgICAgICAgICAgICAgbWF4T3BlbkNvdW50LCBjdXJPcGVuQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgICAgLSBtYXhBY3RpdmVDb3VudDogJXUgLSBjdXJBY3RpdmVDb3VudDogJXVcbiIsCisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiAgICAtIG1heEFjdGl2ZUNvdW50OiAldSAtIGN1ckFjdGl2ZUNvdW50OiAldVxuIiwKICAgICAgICAgICAgICBtYXhBY3RpdmVDb3VudCwgY3VyQWN0aXZlQ291bnQpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogfQogCiB2b2lkIElPUHJvZmlsZTo6bG9nKCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1BvbGljeUF1ZGlvUG9ydC5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Qb2xpY3lBdWRpb1BvcnQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhjNjFiOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Qb2xpY3lBdWRpb1BvcnQuY3BwCkBAIC0wLDAgKzEsMjk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE06OlBvbGljeUF1ZGlvUG9ydCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCisjaW5jbHVkZSAiUG9saWN5QXVkaW9Qb3J0LmgiCisjaW5jbHVkZSAiSHdNb2R1bGUuaCIKKyNpbmNsdWRlIDxwb2xpY3kuaD4KKworI2lmbmRlZiBBUlJBWV9TSVpFCisjZGVmaW5lIEFSUkFZX1NJWkUoYSkgKHNpemVvZihhKSAvIHNpemVvZigoYSlbMF0pKQorI2VuZGlmCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLy8gLS0tIFBvbGljeUF1ZGlvUG9ydCBjbGFzcyBpbXBsZW1lbnRhdGlvbgordm9pZCBQb2xpY3lBdWRpb1BvcnQ6OmF0dGFjaChjb25zdCBzcDxId01vZHVsZT4mIG1vZHVsZSkKK3sKKyAgICBBTE9HVigiJXM6IGF0dGFjaGluZyBtb2R1bGUgJXMgdG8gcG9ydCAlcyIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGdldE1vZHVsZU5hbWUoKSwgYXNBdWRpb1BvcnQoKS0+Z2V0TmFtZSgpLmNfc3RyKCkpOworICAgIG1Nb2R1bGUgPSBtb2R1bGU7Cit9CisKK3ZvaWQgUG9saWN5QXVkaW9Qb3J0OjpkZXRhY2goKQoreworICAgIG1Nb2R1bGUgPSBudWxscHRyOworfQorCisvLyBOb3RlIHRoYXQgaXMgYSBkaWZmZXJlbnQgbmFtZXNwYWNlIHRoYW4gQXVkaW9GbGluZ2VyIHVuaXF1ZSBJRHMKK2F1ZGlvX3BvcnRfaGFuZGxlX3QgUG9saWN5QXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKQoreworICAgIHJldHVybiBnZXROZXh0SGFuZGxlKCk7Cit9CisKK2F1ZGlvX21vZHVsZV9oYW5kbGVfdCBQb2xpY3lBdWRpb1BvcnQ6OmdldE1vZHVsZUhhbmRsZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Nb2R1bGUgIT0gMCA/IG1Nb2R1bGUtPmdldEhhbmRsZSgpIDogQVVESU9fTU9EVUxFX0hBTkRMRV9OT05FOworfQorCit1aW50MzJfdCBQb2xpY3lBdWRpb1BvcnQ6OmdldE1vZHVsZVZlcnNpb25NYWpvcigpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Nb2R1bGUgIT0gMCA/IG1Nb2R1bGUtPmdldEhhbFZlcnNpb25NYWpvcigpIDogMDsKK30KKworY29uc3QgY2hhciAqUG9saWN5QXVkaW9Qb3J0OjpnZXRNb2R1bGVOYW1lKCkgY29uc3QKK3sKKyAgICByZXR1cm4gbU1vZHVsZSAhPSAwID8gbU1vZHVsZS0+Z2V0TmFtZSgpIDogImludmFsaWQgbW9kdWxlIjsKK30KKworc3RhdHVzX3QgUG9saWN5QXVkaW9Qb3J0OjpjaGVja0V4YWN0QXVkaW9Qcm9maWxlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSBjb25zdAoreworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIGF1dG8gY29uZmlnX21hc2sgPSBjb25maWctPmNvbmZpZ19tYXNrOworICAgIGlmIChjb25maWdfbWFzayAmIEFVRElPX1BPUlRfQ09ORklHX0dBSU4pIHsKKyAgICAgICAgY29uZmlnX21hc2sgJj0gfkFVRElPX1BPUlRfQ09ORklHX0dBSU47CisgICAgICAgIHN0YXR1cyA9IGFzQXVkaW9Qb3J0KCktPmNoZWNrR2FpbigmY29uZmlnLT5nYWluLCBjb25maWctPmdhaW4uaW5kZXgpOworICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICB9CisgICAgfQorICAgIGlmIChjb25maWdfbWFzayAhPSAwKSB7CisgICAgICAgIC8vIFRPRE8gc2hvdWxkIHdlIGNoZWNrIHNhbXBsZV9yYXRlIC8gY2hhbm5lbF9tYXNrIC8gZm9ybWF0IHNlcGFyYXRlbHk/CisgICAgICAgIHN0YXR1cyA9IGNoZWNrRXhhY3RQcm9maWxlKGFzQXVkaW9Qb3J0KCktPmdldEF1ZGlvUHJvZmlsZXMoKSwgY29uZmlnLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICBjb25maWctPmNoYW5uZWxfbWFzaywgY29uZmlnLT5mb3JtYXQpOworICAgIH0KKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkIFBvbGljeUF1ZGlvUG9ydDo6cGlja1NhbXBsaW5nUmF0ZSh1aW50MzJfdCAmcGlja2VkUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNhbXBsZVJhdGVTZXQgJnNhbXBsaW5nUmF0ZXMpIGNvbnN0Cit7CisgICAgcGlja2VkUmF0ZSA9IDA7CisgICAgLy8gRm9yIGRpcmVjdCBvdXRwdXRzLCBwaWNrIG1pbmltdW0gc2FtcGxpbmcgcmF0ZTogdGhpcyBoZWxwcyBlbnN1cmluZyB0aGF0IHRoZQorICAgIC8vIGNoYW5uZWwgY291bnQgLyBzYW1wbGluZyByYXRlIGNvbWJpbmF0aW9uIGNob3NlbiB3aWxsIGJlIHN1cHBvcnRlZCBieSB0aGUgY29ubmVjdGVkCisgICAgLy8gc2luaworICAgIGlmIChpc0RpcmVjdE91dHB1dCgpKSB7CisgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSA9IFVJTlRfTUFYOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gcmF0ZSA6IHNhbXBsaW5nUmF0ZXMpIHsKKyAgICAgICAgICAgIGlmICgocmF0ZSA8IHNhbXBsaW5nUmF0ZSkgJiYgKHJhdGUgPiAwKSkgeworICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSA9IHJhdGU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgcGlja2VkUmF0ZSA9IChzYW1wbGluZ1JhdGUgPT0gVUlOVF9NQVgpID8gMCA6IHNhbXBsaW5nUmF0ZTsKKyAgICB9IGVsc2UgeworICAgICAgICB1aW50MzJfdCBtYXhSYXRlID0gU0FNUExFX1JBVEVfSFpfTUFYOworCisgICAgICAgIC8vIEZvciBtaXhlZCBvdXRwdXQgYW5kIGlucHV0cywgdXNlIG1heCBtaXhlciBzYW1wbGluZyByYXRlcy4gRG8gbm90CisgICAgICAgIC8vIGxpbWl0IHNhbXBsaW5nIHJhdGUgb3RoZXJ3aXNlCisgICAgICAgIC8vIEZvciBpbnB1dHMsIGFsc28gc2VlIGNoZWNrQ29tcGF0aWJsZVNhbXBsaW5nUmF0ZSgpLgorICAgICAgICBpZiAoYXNBdWRpb1BvcnQoKS0+Z2V0VHlwZSgpID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgICAgIG1heFJhdGUgPSBVSU5UX01BWDsKKyAgICAgICAgfQorICAgICAgICAvLyBUT0RPOiBzaG91bGQgbVNhbXBsaW5nUmF0ZXNbXSBiZSBvcmRlcmVkIGluIHRlcm1zIG9mIG91ciBwcmVmZXJlbmNlCisgICAgICAgIC8vIGFuZCB3ZSByZXR1cm4gdGhlIGZpcnN0IChhbmQgaGVuY2UgbW9zdCBwcmVmZXJyZWQpIG1hdGNoPyAgVGhpcyBpcyBvZiBjb25jZXJuIGlmCisgICAgICAgIC8vIHdlIHdhbnQgdG8gY2hvb3NlIDk2a0h6IG92ZXIgMTkya0h6IGZvciBVU0IgZHJpdmVyIHN0YWJpbGl0eSBvciByZXNvdXJjZSBjb25zdHJhaW50cy4KKyAgICAgICAgZm9yIChjb25zdCBhdXRvIHJhdGUgOiBzYW1wbGluZ1JhdGVzKSB7CisgICAgICAgICAgICBpZiAoKHJhdGUgPiBwaWNrZWRSYXRlKSAmJiAocmF0ZSA8PSBtYXhSYXRlKSkgeworICAgICAgICAgICAgICAgIHBpY2tlZFJhdGUgPSByYXRlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIFBvbGljeUF1ZGlvUG9ydDo6cGlja0NoYW5uZWxNYXNrKGF1ZGlvX2NoYW5uZWxfbWFza190ICZwaWNrZWRDaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2hhbm5lbE1hc2tTZXQgJmNoYW5uZWxNYXNrcykgY29uc3QKK3sKKyAgICBwaWNrZWRDaGFubmVsTWFzayA9IEFVRElPX0NIQU5ORUxfTk9ORTsKKyAgICAvLyBGb3IgZGlyZWN0IG91dHB1dHMsIHBpY2sgbWluaW11bSBjaGFubmVsIGNvdW50OiB0aGlzIGhlbHBzIGVuc3VyaW5nIHRoYXQgdGhlCisgICAgLy8gY2hhbm5lbCBjb3VudCAvIHNhbXBsaW5nIHJhdGUgY29tYmluYXRpb24gY2hvc2VuIHdpbGwgYmUgc3VwcG9ydGVkIGJ5IHRoZSBjb25uZWN0ZWQKKyAgICAvLyBzaW5rCisgICAgaWYgKGlzRGlyZWN0T3V0cHV0KCkpIHsKKyAgICAgICAgdWludDMyX3QgY2hhbm5lbENvdW50ID0gVUlOVF9NQVg7CisgICAgICAgIGZvciAoY29uc3QgYXV0byBjaGFubmVsTWFzayA6IGNoYW5uZWxNYXNrcykgeworICAgICAgICAgICAgdWludDMyX3QgY25sQ291bnQ7CisgICAgICAgICAgICBpZiAoYXNBdWRpb1BvcnQoKS0+dXNlSW5wdXRDaGFubmVsTWFzaygpKSB7CisgICAgICAgICAgICAgICAgY25sQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21faW5fbWFzayhjaGFubmVsTWFzayk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNubENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoY25sQ291bnQgPCBjaGFubmVsQ291bnQpICYmIChjbmxDb3VudCA+IDApKSB7CisgICAgICAgICAgICAgICAgcGlja2VkQ2hhbm5lbE1hc2sgPSBjaGFubmVsTWFzazsKKyAgICAgICAgICAgICAgICBjaGFubmVsQ291bnQgPSBjbmxDb3VudDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHVpbnQzMl90IGNoYW5uZWxDb3VudCA9IDA7CisgICAgICAgIHVpbnQzMl90IG1heENvdW50ID0gTUFYX01JWEVSX0NIQU5ORUxfQ09VTlQ7CisKKyAgICAgICAgLy8gRm9yIG1peGVkIG91dHB1dCBhbmQgaW5wdXRzLCB1c2UgbWF4IG1peGVyIGNoYW5uZWwgY291bnQuIERvIG5vdAorICAgICAgICAvLyBsaW1pdCBjaGFubmVsIGNvdW50IG90aGVyd2lzZQorICAgICAgICBpZiAoYXNBdWRpb1BvcnQoKS0+Z2V0VHlwZSgpICE9IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgICAgIG1heENvdW50ID0gVUlOVF9NQVg7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChjb25zdCBhdXRvIGNoYW5uZWxNYXNrIDogY2hhbm5lbE1hc2tzKSB7CisgICAgICAgICAgICB1aW50MzJfdCBjbmxDb3VudDsKKyAgICAgICAgICAgIGlmIChhc0F1ZGlvUG9ydCgpLT51c2VJbnB1dENoYW5uZWxNYXNrKCkpIHsKKyAgICAgICAgICAgICAgICBjbmxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9pbl9tYXNrKGNoYW5uZWxNYXNrKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY25sQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChjbmxDb3VudCA+IGNoYW5uZWxDb3VudCkgJiYgKGNubENvdW50IDw9IG1heENvdW50KSkgeworICAgICAgICAgICAgICAgIHBpY2tlZENoYW5uZWxNYXNrID0gY2hhbm5lbE1hc2s7CisgICAgICAgICAgICAgICAgY2hhbm5lbENvdW50ID0gY25sQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIGZvcm1hdCBpbiBvcmRlciBvZiBpbmNyZWFzaW5nIHByZWZlcmVuY2UgKi8KK2NvbnN0IGF1ZGlvX2Zvcm1hdF90IFBvbGljeUF1ZGlvUG9ydDo6c1BjbUZvcm1hdENvbXBhcmVUYWJsZVtdID0geworICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCwKKyAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCisgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fOF8yNF9CSVQsCisgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMjRfQklUX1BBQ0tFRCwKKyAgICAgICAgQVVESU9fRk9STUFUX1BDTV8zMl9CSVQsCisgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQsCit9OworCitpbnQgUG9saWN5QXVkaW9Qb3J0Ojpjb21wYXJlRm9ybWF0cyhhdWRpb19mb3JtYXRfdCBmb3JtYXQxLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQyKQoreworICAgIC8vIE5PVEU6IEFVRElPX0ZPUk1BVF9JTlZBTElEIGlzIGFsc28gY29uc2lkZXJlZCBub3QgUENNIGFuZCB3aWxsIGJlIGNvbXBhcmVkIGVxdWFsIHRvIGFueQorICAgIC8vIGNvbXByZXNzZWQgZm9ybWF0IGFuZCBiZXR0ZXIgdGhhbiBhbnkgUENNIGZvcm1hdC4gVGhpcyBpcyBieSBkZXNpZ24gb2YgcGlja0Zvcm1hdCgpCisgICAgaWYgKCFhdWRpb19pc19saW5lYXJfcGNtKGZvcm1hdDEpKSB7CisgICAgICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQyKSkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQyKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgaW50IGluZGV4MSA9IC0xLCBpbmRleDIgPSAtMTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsKKyAgICAgICAgICAgIChpIDwgQVJSQVlfU0laRShzUGNtRm9ybWF0Q29tcGFyZVRhYmxlKSkgJiYgKChpbmRleDEgPT0gLTEpIHx8IChpbmRleDIgPT0gLTEpKTsKKyAgICAgICAgICAgIGkgKyspIHsKKyAgICAgICAgaWYgKHNQY21Gb3JtYXRDb21wYXJlVGFibGVbaV0gPT0gZm9ybWF0MSkgeworICAgICAgICAgICAgaW5kZXgxID0gaTsKKyAgICAgICAgfQorICAgICAgICBpZiAoc1BjbUZvcm1hdENvbXBhcmVUYWJsZVtpXSA9PSBmb3JtYXQyKSB7CisgICAgICAgICAgICBpbmRleDIgPSBpOworICAgICAgICB9CisgICAgfQorICAgIC8vIGZvcm1hdDEgbm90IGZvdW5kID0+IGluZGV4MSA8IDAgPT4gZm9ybWF0MiA+IGZvcm1hdDEKKyAgICAvLyBmb3JtYXQyIG5vdCBmb3VuZCA9PiBpbmRleDIgPCAwID0+IGZvcm1hdDIgPCBmb3JtYXQxCisgICAgcmV0dXJuIGluZGV4MSAtIGluZGV4MjsKK30KKwordWludDMyX3QgUG9saWN5QXVkaW9Qb3J0Ojpmb3JtYXREaXN0YW5jZShhdWRpb19mb3JtYXRfdCBmb3JtYXQxLCBhdWRpb19mb3JtYXRfdCBmb3JtYXQyKQoreworICAgIGlmIChmb3JtYXQxID09IGZvcm1hdDIpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGlmIChmb3JtYXQxID09IEFVRElPX0ZPUk1BVF9JTlZBTElEIHx8IGZvcm1hdDIgPT0gQVVESU9fRk9STUFUX0lOVkFMSUQpIHsKKyAgICAgICAgcmV0dXJuIGtGb3JtYXREaXN0YW5jZU1heDsKKyAgICB9CisgICAgaW50IGRpZmZCeXRlcyA9IChpbnQpYXVkaW9fYnl0ZXNfcGVyX3NhbXBsZShmb3JtYXQxKSAtCisgICAgICAgICAgICBhdWRpb19ieXRlc19wZXJfc2FtcGxlKGZvcm1hdDIpOworCisgICAgcmV0dXJuIGFicyhkaWZmQnl0ZXMpOworfQorCitib29sIFBvbGljeUF1ZGlvUG9ydDo6aXNCZXR0ZXJGb3JtYXRNYXRjaChhdWRpb19mb3JtYXRfdCBuZXdGb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBjdXJyZW50Rm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgdGFyZ2V0Rm9ybWF0KQoreworICAgIHJldHVybiBmb3JtYXREaXN0YW5jZShuZXdGb3JtYXQsIHRhcmdldEZvcm1hdCkgPCBmb3JtYXREaXN0YW5jZShjdXJyZW50Rm9ybWF0LCB0YXJnZXRGb3JtYXQpOworfQorCit2b2lkIFBvbGljeUF1ZGlvUG9ydDo6cGlja0F1ZGlvUHJvZmlsZSh1aW50MzJfdCAmc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgJmNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgJmZvcm1hdCkgY29uc3QKK3sKKyAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfREVGQVVMVDsKKyAgICBzYW1wbGluZ1JhdGUgPSAwOworICAgIGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworCisgICAgLy8gc3BlY2lhbCBjYXNlIGZvciB1bmluaXRpYWxpemVkIGR5bmFtaWMgcHJvZmlsZQorICAgIGlmICghYXNBdWRpb1BvcnQoKS0+aGFzVmFsaWRBdWRpb1Byb2ZpbGUoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGF1ZGlvX2Zvcm1hdF90IGJlc3RGb3JtYXQgPSBzUGNtRm9ybWF0Q29tcGFyZVRhYmxlW0FSUkFZX1NJWkUoc1BjbUZvcm1hdENvbXBhcmVUYWJsZSkgLSAxXTsKKyAgICAvLyBGb3IgbWl4ZWQgb3V0cHV0IGFuZCBpbnB1dHMsIHVzZSBiZXN0IG1peGVyIG91dHB1dCBmb3JtYXQuCisgICAgLy8gRG8gbm90IGxpbWl0IGZvcm1hdCBvdGhlcndpc2UKKyAgICBpZiAoKGFzQXVkaW9Qb3J0KCktPmdldFR5cGUoKSAhPSBBVURJT19QT1JUX1RZUEVfTUlYKSB8fCBpc0RpcmVjdE91dHB1dCgpKSB7CisgICAgICAgIGJlc3RGb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRDsKKyAgICB9CisKKyAgICBjb25zdCBBdWRpb1Byb2ZpbGVWZWN0b3ImIGF1ZGlvUHJvZmlsZXMgPSBhc0F1ZGlvUG9ydCgpLT5nZXRBdWRpb1Byb2ZpbGVzKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhdWRpb1Byb2ZpbGVzLnNpemUoKTsgaSArKykgeworICAgICAgICBpZiAoIWF1ZGlvUHJvZmlsZXNbaV0tPmlzVmFsaWQoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0VG9Db21wYXJlID0gYXVkaW9Qcm9maWxlc1tpXS0+Z2V0Rm9ybWF0KCk7CisgICAgICAgIGlmICgoY29tcGFyZUZvcm1hdHMoZm9ybWF0VG9Db21wYXJlLCBmb3JtYXQpID4gMCkgJiYKKyAgICAgICAgICAgICAgICAoY29tcGFyZUZvcm1hdHMoZm9ybWF0VG9Db21wYXJlLCBiZXN0Rm9ybWF0KSA8PSAwKSkgeworICAgICAgICAgICAgdWludDMyX3QgcGlja2VkU2FtcGxpbmdSYXRlID0gMDsKKyAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IHBpY2tlZENoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FOworICAgICAgICAgICAgcGlja0NoYW5uZWxNYXNrKHBpY2tlZENoYW5uZWxNYXNrLCBhdWRpb1Byb2ZpbGVzW2ldLT5nZXRDaGFubmVscygpKTsKKyAgICAgICAgICAgIHBpY2tTYW1wbGluZ1JhdGUocGlja2VkU2FtcGxpbmdSYXRlLCBhdWRpb1Byb2ZpbGVzW2ldLT5nZXRTYW1wbGVSYXRlcygpKTsKKworICAgICAgICAgICAgaWYgKGZvcm1hdFRvQ29tcGFyZSAhPSBBVURJT19GT1JNQVRfREVGQVVMVCAmJiBwaWNrZWRDaGFubmVsTWFzayAhPSBBVURJT19DSEFOTkVMX05PTkUKKyAgICAgICAgICAgICAgICAgICAgJiYgcGlja2VkU2FtcGxpbmdSYXRlICE9IDApIHsKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBmb3JtYXRUb0NvbXBhcmU7CisgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2sgPSBwaWNrZWRDaGFubmVsTWFzazsKKyAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPSBwaWNrZWRTYW1wbGluZ1JhdGU7CisgICAgICAgICAgICAgICAgLy8gVE9ETzogc2hhbGwgd2UgcmV0dXJuIG9uIHRoZSBmaXJzdCBvbmUgb3Igc3RpbGwgdHJ5aW5nIHRvIHBpY2sgYSBiZXR0ZXIgUHJvZmlsZT8KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiJXMgUG9ydFtubTolc10gcHJvZmlsZSByYXRlPSVkLCBmb3JtYXQ9JWQsIGNoYW5uZWxzPSVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgYXNBdWRpb1BvcnQoKS0+Z2V0TmFtZSgpLmNfc3RyKCksIHNhbXBsaW5nUmF0ZSwgY2hhbm5lbE1hc2ssIGZvcm1hdCk7Cit9CisKKy8vIC0tLSBQb2xpY3lBdWRpb1BvcnRDb25maWcgY2xhc3MgaW1wbGVtZW50YXRpb24KKworc3RhdHVzX3QgUG9saWN5QXVkaW9Qb3J0Q29uZmlnOjp2YWxpZGF0aW9uQmVmb3JlQXBwbHlDb25maWcoCisgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKSBjb25zdAoreworICAgIHNwPFBvbGljeUF1ZGlvUG9ydD4gcG9saWN5QXVkaW9Qb3J0ID0gZ2V0UG9saWN5QXVkaW9Qb3J0KCk7CisgICAgcmV0dXJuIHBvbGljeUF1ZGlvUG9ydCA/IHBvbGljeUF1ZGlvUG9ydC0+Y2hlY2tFeGFjdEF1ZGlvUHJvZmlsZShjb25maWcpIDogTk9fSU5JVDsKK30KKwordm9pZCBQb2xpY3lBdWRpb1BvcnRDb25maWc6OnRvUG9saWN5QXVkaW9Qb3J0Q29uZmlnKHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqZHN0Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc3JjQ29uZmlnKSBjb25zdAoreworICAgIGlmIChkc3RDb25maWctPmNvbmZpZ19tYXNrICYgQVVESU9fUE9SVF9DT05GSUdfRkxBR1MpIHsKKyAgICAgICAgaWYgKChzcmNDb25maWcgIT0gbnVsbHB0cikgJiYgKHNyY0NvbmZpZy0+Y29uZmlnX21hc2sgJiBBVURJT19QT1JUX0NPTkZJR19GTEFHUykpIHsKKyAgICAgICAgICAgIGRzdENvbmZpZy0+ZmxhZ3MgPSBzcmNDb25maWctPmZsYWdzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHN0Q29uZmlnLT5mbGFncyA9IG1GbGFnczsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGRzdENvbmZpZy0+ZmxhZ3MgPSB7IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSB9OworICAgIH0KK30KKworCisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1NlcmlhbGl6ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKaW5kZXggYTI1MzExMy4uYjhlMWNiZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2VyaWFsaXplci5jcHAKQEAgLTE3LDI0MSArMTcsNDM2IEBACiAjZGVmaW5lIExPR19UQUcgIkFQTTo6U2VyaWFsaXplciIKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAotI2luY2x1ZGUgIlNlcmlhbGl6ZXIuaCIKLSNpbmNsdWRlIDxtZWRpYS9jb252ZXJ0Lmg+Ci0jaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CiAjaW5jbHVkZSA8bGlieG1sL3BhcnNlci5oPgogI2luY2x1ZGUgPGxpYnhtbC94aW5jbHVkZS5oPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzc3RyZWFtPgotI2luY2x1ZGUgPGlzdHJlYW0+Ci0KLXVzaW5nIHN0ZDo6c3RyaW5nOworI2luY2x1ZGUgPG1lZGlhL2NvbnZlcnQuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJvbmdQb2ludGVyLmg+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorI2luY2x1ZGUgIlNlcmlhbGl6ZXIuaCIKKyNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotc3RyaW5nIGdldFhtbEF0dHJpYnV0ZShjb25zdCB4bWxOb2RlICpjdXIsIGNvbnN0IGNoYXIgKmF0dHJpYnV0ZSkKK25hbWVzcGFjZSB7CisKKy8vIFRPRE8obW5hZ2Fub3YpOiBDb25zaWRlciBmaW5kaW5nIGFuIGFsdGVybmF0aXZlIGZvciB1c2luZyBISURMIGNvZGUuCit1c2luZyBoYXJkd2FyZTo6UmV0dXJuOwordXNpbmcgaGFyZHdhcmU6OlN0YXR1czsKK3VzaW5nIHV0aWxpdGllczo6Y29udmVydFRvOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBFLCB0eXBlbmFtZSBDPgorc3RydWN0IEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzIHsKKyAgICB0eXBlZGVmIHNwPEU+IEVsZW1lbnQ7CisgICAgdHlwZWRlZiBDIENvbGxlY3Rpb247CisgICAgdHlwZWRlZiB2b2lkKiBQdHJTZXJpYWxpemluZ0N0eDsKKworICAgIHN0YXRpYyBzdGF0dXNfdCBhZGRFbGVtZW50VG9Db2xsZWN0aW9uKGNvbnN0IEVsZW1lbnQgJmVsZW1lbnQsIENvbGxlY3Rpb24gKmNvbGxlY3Rpb24pIHsKKyAgICAgICAgcmV0dXJuIGNvbGxlY3Rpb24tPmFkZChlbGVtZW50KSA+PSAwID8gTk9fRVJST1IgOiBCQURfVkFMVUU7CisgICAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgQz4KK3N0cnVjdCBTdGRDb2xsZWN0aW9uVHJhaXRzIHsKKyAgICB0eXBlZGVmIEMgQ29sbGVjdGlvbjsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIEM6OnZhbHVlX3R5cGUgRWxlbWVudDsKKyAgICB0eXBlZGVmIHZvaWQqIFB0clNlcmlhbGl6aW5nQ3R4OworCisgICAgc3RhdGljIHN0YXR1c190IGFkZEVsZW1lbnRUb0NvbGxlY3Rpb24oY29uc3QgRWxlbWVudCAmZWxlbWVudCwgQ29sbGVjdGlvbiAqY29sbGVjdGlvbikgeworICAgICAgICBhdXRvIHBhaXIgPSBjb2xsZWN0aW9uLT5pbnNlcnQoZWxlbWVudCk7CisgICAgICAgIHJldHVybiBwYWlyLnNlY29uZCA/IE5PX0VSUk9SIDogQkFEX1ZBTFVFOworICAgIH0KK307CisKK3N0cnVjdCBBdWRpb0dhaW5UcmFpdHMgOiBwdWJsaWMgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHM8QXVkaW9HYWluLCBBdWRpb0dhaW5zPgogewotICAgIHhtbENoYXIgKnhtbFZhbHVlID0geG1sR2V0UHJvcChjdXIsIChjb25zdCB4bWxDaGFyKilhdHRyaWJ1dGUpOwotICAgIGlmICh4bWxWYWx1ZSA9PSBOVUxMKSB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiZ2FpbiI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gImdhaW5zIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICAvKiogZ2FpbiBtb2RlcyBzdXBwb3J0ZWQsIGUuZy4gQVVESU9fR0FJTl9NT0RFX0NIQU5ORUxTLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm1vZGUgPSAibW9kZSI7CisgICAgICAgIC8qKiBjb250cm9sbGVkIGNoYW5uZWxzLCBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfQ0hBTk5FTFMuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY2hhbm5lbE1hc2sgPSAiY2hhbm5lbF9tYXNrIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptaW5WYWx1ZU1CID0gIm1pblZhbHVlTUIiOyAvKio8IG1pbiB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptYXhWYWx1ZU1CID0gIm1heFZhbHVlTUIiOyAvKio8IG1heCB2YWx1ZSBpbiBtaWxsaWJlbC4gKi8KKyAgICAgICAgLyoqIGRlZmF1bHQgdmFsdWUgaW4gbWlsbGliZWwuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqZGVmYXVsdFZhbHVlTUIgPSAiZGVmYXVsdFZhbHVlTUIiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnN0ZXBWYWx1ZU1CID0gInN0ZXBWYWx1ZU1CIjsgLyoqPCBzdGVwIHZhbHVlIGluIG1pbGxpYmVsLiAqLworICAgICAgICAvKiogbmVlZGVkIGlmIG1vZGUgQVVESU9fR0FJTl9NT0RFX1JBTVAuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWluUmFtcE1zID0gIm1pblJhbXBNcyI7CisgICAgICAgIC8qKiBuZWVkZWQgaWYgbW9kZSBBVURJT19HQUlOX01PREVfUkFNUC4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICptYXhSYW1wTXMgPSAibWF4UmFtcE1zIjsKKyAgICAgICAgLyoqIG5lZWRlZCB0byBhbGxvdyB1c2Ugc2V0UG9ydEdhaW4gaW5zdGVhZCBvZiBzZXRTdHJlYW1Wb2x1bWUuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdXNlRm9yVm9sdW1lID0gInVzZUZvclZvbHVtZSI7CisKKyAgICB9OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CisgICAgLy8gTm8gY2hpbGRyZW4KK307CisKKy8vIEEgcHJvZmlsZSBzZWN0aW9uIGNvbnRhaW5zIGEgbmFtZSwgIG9uZSBhdWRpbyBmb3JtYXQgYW5kIHRoZSBsaXN0IG9mIHN1cHBvcnRlZCBzYW1wbGluZyByYXRlcworLy8gYW5kIGNoYW5uZWwgbWFza3MgZm9yIHRoaXMgZm9ybWF0CitzdHJ1Y3QgQXVkaW9Qcm9maWxlVHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPEF1ZGlvUHJvZmlsZSwgQXVkaW9Qcm9maWxlVmVjdG9yPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gInByb2ZpbGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJwcm9maWxlcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzYW1wbGluZ1JhdGVzID0gInNhbXBsaW5nUmF0ZXMiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmZvcm1hdCA9ICJmb3JtYXQiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNoYW5uZWxNYXNrcyA9ICJjaGFubmVsTWFza3MiOworICAgIH07CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKK307CisKK3N0cnVjdCBNaXhQb3J0VHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPElPUHJvZmlsZSwgSU9Qcm9maWxlQ29sbGVjdGlvbj4KK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJtaXhQb3J0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAibWl4UG9ydHMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyb2xlID0gInJvbGUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnJvbGVTb3VyY2UgPSAic291cmNlIjsgLyoqPCA8YXR0cmlidXRlIHJvbGUgc291cmNlIHZhbHVlPi4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpmbGFncyA9ICJmbGFncyI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWF4T3BlbkNvdW50ID0gIm1heE9wZW5Db3VudCI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbWF4QWN0aXZlQ291bnQgPSAibWF4QWN0aXZlQ291bnQiOworICAgIH07CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKKyAgICAvLyBDaGlsZHJlbjogR2FpblRyYWl0cworfTsKKworc3RydWN0IERldmljZVBvcnRUcmFpdHMgOiBwdWJsaWMgQW5kcm9pZENvbGxlY3Rpb25UcmFpdHM8RGV2aWNlRGVzY3JpcHRvciwgRGV2aWNlVmVjdG9yPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gImRldmljZVBvcnQiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJkZXZpY2VQb3J0cyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgLyoqICA8ZGV2aWNlIHRhZyBuYW1lPjogYW55IHN0cmluZyB3aXRob3V0IHNwYWNlLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZ05hbWUgPSAidGFnTmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdHlwZSA9ICJ0eXBlIjsgLyoqPCA8ZGV2aWNlIHR5cGU+LiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnJvbGUgPSAicm9sZSI7IC8qKjwgPGRldmljZSByb2xlOiBzaW5rIG9yIHNvdXJjZT4uICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqcm9sZVNvdXJjZSA9ICJzb3VyY2UiOyAvKio8IDxhdHRyaWJ1dGUgcm9sZSBzb3VyY2UgdmFsdWU+LiAqLworICAgICAgICAvKiogb3B0aW9uYWw6IGRldmljZSBhZGRyZXNzLCBjaGFyIHN0cmluZyBsZXNzIHRoYW4gNjQuICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqYWRkcmVzcyA9ICJhZGRyZXNzIjsKKyAgICAgICAgLyoqIG9wdGlvbmFsOiB0aGUgbGlzdCBvZiBlbmNvZGVkIGF1ZGlvIGZvcm1hdHMgdGhhdCBhcmUga25vd24gdG8gYmUgc3VwcG9ydGVkLiAqLworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmVuY29kZWRGb3JtYXRzID0gImVuY29kZWRGb3JtYXRzIjsKKyAgICB9OworCisgICAgc3RhdGljIFJldHVybjxFbGVtZW50PiBkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IHNlcmlhbGl6aW5nQ29udGV4dCk7CisgICAgLy8gQ2hpbGRyZW46IEdhaW5UcmFpdHMgKG9wdGlvbmFsKQorfTsKKworc3RydWN0IFJvdXRlVHJhaXRzIDogcHVibGljIEFuZHJvaWRDb2xsZWN0aW9uVHJhaXRzPEF1ZGlvUm91dGUsIEF1ZGlvUm91dGVWZWN0b3I+Cit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAicm91dGUiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJyb3V0ZXMiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMKKyAgICB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdHlwZSA9ICJ0eXBlIjsgLyoqPCA8cm91dGUgdHlwZT46IG1peCBvciBtdXguICovCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdHlwZU1peCA9ICJtaXgiOyAvKio8IHR5cGUgYXR0cmlidXRlIG1peCB2YWx1ZS4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzaW5rID0gInNpbmsiOyAvKio8IDxzaW5rOiBpbnZvbHZlZCBpbiB0aGlzIHJvdXRlPi4gKi8KKyAgICAgICAgLyoqIHNvdXJjZXM6IGFsbCBzb3VyY2UgdGhhdCBjYW4gYmUgaW52b2x2ZWQgaW4gdGhpcyByb3V0ZS4gKi8KKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzb3VyY2VzID0gInNvdXJjZXMiOworICAgIH07CisKKyAgICB0eXBlZGVmIEh3TW9kdWxlICpQdHJTZXJpYWxpemluZ0N0eDsKKworICAgIHN0YXRpYyBSZXR1cm48RWxlbWVudD4gZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOworfTsKKworc3RydWN0IE1vZHVsZVRyYWl0cyA6IHB1YmxpYyBBbmRyb2lkQ29sbGVjdGlvblRyYWl0czxId01vZHVsZSwgSHdNb2R1bGVDb2xsZWN0aW9uPgoreworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gIm1vZHVsZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gIm1vZHVsZXMiOworCisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZyA9ICJhdHRhY2hlZERldmljZXMiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY2hpbGRBdHRhY2hlZERldmljZVRhZyA9ICJpdGVtIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZyA9ICJkZWZhdWx0T3V0cHV0RGV2aWNlIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm5hbWUgPSAibmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdmVyc2lvbiA9ICJoYWxWZXJzaW9uIjsKKyAgICB9OworCisgICAgdHlwZWRlZiBBdWRpb1BvbGljeUNvbmZpZyAqUHRyU2VyaWFsaXppbmdDdHg7CisKKyAgICBzdGF0aWMgUmV0dXJuPEVsZW1lbnQ+IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KTsKKyAgICAvLyBDaGlsZHJlbjogbWl4UG9ydFRyYWl0cywgZGV2aWNlUG9ydFRyYWl0cywgYW5kIHJvdXRlVHJhaXRzCisgICAgLy8gTmVlZCB0byBjYWxsIGRlc2VyaWFsaXplIG9uIGVhY2ggY2hpbGQKK307CisKK3N0cnVjdCBHbG9iYWxDb25maWdUcmFpdHMKK3sKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJnbG9iYWxDb25maWd1cmF0aW9uIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzCisgICAgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnNwZWFrZXJEcmNFbmFibGVkID0gInNwZWFrZXJfZHJjX2VuYWJsZWQiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmVuZ2luZUxpYnJhcnlTdWZmaXggPSAiZW5naW5lX2xpYnJhcnkiOworICAgIH07CisKKyAgICBzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqcm9vdCwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZyk7Cit9OworCitzdHJ1Y3QgU3Vycm91bmRTb3VuZFRyYWl0cworeworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gInN1cnJvdW5kU291bmQiOworCisgICAgc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKnJvb3QsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpOworICAgIC8vIENoaWxkcmVuOiBTdXJyb3VuZFNvdW5kRm9ybWF0VHJhaXRzCit9OworCitzdHJ1Y3QgU3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0cyA6IHB1YmxpYyBTdGRDb2xsZWN0aW9uVHJhaXRzPEF1ZGlvUG9saWN5Q29uZmlnOjpTdXJyb3VuZEZvcm1hdHM+Cit7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiZm9ybWF0IjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAiZm9ybWF0cyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcworICAgIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpuYW1lID0gIm5hbWUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnN1YmZvcm1hdHMgPSAic3ViZm9ybWF0cyI7CisgICAgfTsKKworICAgIHN0YXRpYyBSZXR1cm48RWxlbWVudD4gZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLCBQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpOworfTsKKworY2xhc3MgUG9saWN5U2VyaWFsaXplcgoreworcHVibGljOgorICAgIFBvbGljeVNlcmlhbGl6ZXIoKSA6IG1WZXJzaW9ue3N0ZDo6dG9fc3RyaW5nKGdNYWpvcikgKyAiLiIgKyBzdGQ6OnRvX3N0cmluZyhnTWlub3IpfQorICAgIHsKKyAgICAgICAgQUxPR1YoIiVzOiBWZXJzaW9uPSVzIFJvb3Q9JXMiLCBfX2Z1bmNfXywgbVZlcnNpb24uY19zdHIoKSwgcm9vdE5hbWUpOworICAgIH0KKyAgICBzdGF0dXNfdCBkZXNlcmlhbGl6ZShjb25zdCBjaGFyICpjb25maWdGaWxlLCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKTsKKworcHJpdmF0ZToKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnJvb3ROYW1lID0gImF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp2ZXJzaW9uQXR0cmlidXRlID0gInZlcnNpb24iOworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgZ01ham9yID0gMTsgLyoqPCB0aGUgbWFqb3IgbnVtYmVyIG9mIHRoZSBwb2xpY3kgeG1sIGZvcm1hdCB2ZXJzaW9uLiAqLworICAgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgZ01pbm9yID0gMDsgLyoqPCB0aGUgbWlub3IgbnVtYmVyIG9mIHRoZSBwb2xpY3kgeG1sIGZvcm1hdCB2ZXJzaW9uLiAqLworCisgICAgdHlwZWRlZiBBdWRpb1BvbGljeUNvbmZpZyBFbGVtZW50OworCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbVZlcnNpb247CisKKyAgICAvLyBDaGlsZHJlbjogTW9kdWxlc1RyYWl0cywgVm9sdW1lVHJhaXRzLCBTdXJyb3VuZFNvdW5kVHJhaXRzIChvcHRpb25hbCkKK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY29uc3RleHByIHZvaWQgKCp4bWxEZWxldGVyKShUKiB0KTsKK3RlbXBsYXRlIDw+Citjb25zdGV4cHIgYXV0byB4bWxEZWxldGVyPHhtbERvYz4gPSB4bWxGcmVlRG9jOworLy8gaHR0cDovL2IvMTExMDY3Mjc3IC0gQWRkIGJhY2sgY29uc3RleHByIHdoZW4gd2Ugc3dpdGNoIHRvIEMrKzE3LgordGVtcGxhdGUgPD4KK2F1dG8geG1sRGVsZXRlcjx4bWxDaGFyPiA9IFtdKHhtbENoYXIgKnMpIHsgeG1sRnJlZShzKTsgfTsKKworLyoqIEByZXR1cm4gYSB1bmlxdWVfcHRyIHdpdGggdGhlIGNvcnJlY3QgZGVsZXRlciBmb3IgdGhlIGxpYnhtbDIgb2JqZWN0LiAqLwordGVtcGxhdGUgPGNsYXNzIFQ+Citjb25zdGV4cHIgYXV0byBtYWtlX3htbFVuaXF1ZShUICp0KSB7CisgICAgLy8gV3JhcCBkZWxldGVyIGluIGxhbWJkYSB0byBlbmFibGUgZW1wdHkgYmFzZSBvcHRpbWl6YXRpb24KKyAgICBhdXRvIGRlbGV0ZXIgPSBbXShUICp0KSB7IHhtbERlbGV0ZXI8VD4odCk7IH07CisgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxULCBkZWNsdHlwZShkZWxldGVyKT57dCwgZGVsZXRlcn07Cit9CisKK3N0ZDo6c3RyaW5nIGdldFhtbEF0dHJpYnV0ZShjb25zdCB4bWxOb2RlICpjdXIsIGNvbnN0IGNoYXIgKmF0dHJpYnV0ZSkKK3sKKyAgICBhdXRvIHhtbFZhbHVlID0gbWFrZV94bWxVbmlxdWUoeG1sR2V0UHJvcChjdXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KGF0dHJpYnV0ZSkpKTsKKyAgICBpZiAoeG1sVmFsdWUgPT0gbnVsbHB0cikgewogICAgICAgICByZXR1cm4gIiI7CiAgICAgfQotICAgIHN0cmluZyB2YWx1ZSgoY29uc3QgY2hhciopeG1sVmFsdWUpOwotICAgIHhtbEZyZWUoeG1sVmFsdWUpOworICAgIHN0ZDo6c3RyaW5nIHZhbHVlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHhtbFZhbHVlLmdldCgpKSk7CiAgICAgcmV0dXJuIHZhbHVlOwogfQogCi11c2luZyB1dGlsaXRpZXM6OmNvbnZlcnRUbzsKLQotY29uc3QgY2hhciAqY29uc3QgUG9saWN5U2VyaWFsaXplcjo6cm9vdE5hbWUgPSAiYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uIjsKLWNvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVNlcmlhbGl6ZXI6OnZlcnNpb25BdHRyaWJ1dGUgPSAidmVyc2lvbiI7Ci1jb25zdCB1aW50MzJfdCBQb2xpY3lTZXJpYWxpemVyOjpnTWFqb3IgPSAxOwotY29uc3QgdWludDMyX3QgUG9saWN5U2VyaWFsaXplcjo6Z01pbm9yID0gMDsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnUmVmZXJlbmNlRWxlbWVudE5hbWUgPSAicmVmZXJlbmNlIjsKLXN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnUmVmZXJlbmNlQXR0cmlidXRlTmFtZSA9ICJuYW1lIjsKLQogdGVtcGxhdGUgPGNsYXNzIFRyYWl0Pgotc3RhdGljIHZvaWQgZ2V0UmVmZXJlbmNlKGNvbnN0IF94bWxOb2RlICpyb290LCBjb25zdCBfeG1sTm9kZSAqJnJlZk5vZGUsIGNvbnN0IHN0cmluZyAmcmVmTmFtZSkKK2NvbnN0IHhtbE5vZGUqIGdldFJlZmVyZW5jZShjb25zdCB4bWxOb2RlICpjdXIsIGNvbnN0IHN0ZDo6c3RyaW5nICZyZWZOYW1lKQogewotICAgIGNvbnN0IF94bWxOb2RlICpjb2wgPSByb290OwotICAgIHdoaWxlIChjb2wgIT0gTlVMTCkgewotICAgICAgICBpZiAoIXhtbFN0cmNtcChjb2wtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OmNvbGxlY3Rpb25UYWcpKSB7Ci0gICAgICAgICAgICBjb25zdCB4bWxOb2RlICpjdXIgPSBjb2wtPmNoaWxkcmVuOwotICAgICAgICAgICAgd2hpbGUgKGN1ciAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCgheG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilnUmVmZXJlbmNlRWxlbWVudE5hbWUpKSkgewotICAgICAgICAgICAgICAgICAgICBzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIGdSZWZlcmVuY2VBdHRyaWJ1dGVOYW1lKTsKKyAgICBmb3IgKDsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KFRyYWl0Ojpjb2xsZWN0aW9uVGFnKSkpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY2hpbGQgPSBjdXItPmNoaWxkcmVuOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgICAgICAgICAgaWYgKCgheG1sU3RyY21wKGNoaWxkLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KFRyYWl0OjpyZWZlcmVuY2VUYWcpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgVHJhaXQ6OkF0dHJpYnV0ZXM6OnJlZmVyZW5jZU5hbWUpOwogICAgICAgICAgICAgICAgICAgICBpZiAocmVmTmFtZSA9PSBuYW1lKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZWZOb2RlID0gY3VyOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNoaWxkOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGN1ciA9IGN1ci0+bmV4dDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBjb2wgPSBjb2wtPm5leHQ7CiAgICAgfQotICAgIHJldHVybjsKKyAgICByZXR1cm4gTlVMTDsKIH0KIAogdGVtcGxhdGUgPGNsYXNzIFRyYWl0Pgotc3RhdGljIHN0YXR1c190IGRlc2VyaWFsaXplQ29sbGVjdGlvbihfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjdXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFRyYWl0OjpDb2xsZWN0aW9uICZjb2xsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBUcmFpdDo6UHRyU2VyaWFsaXppbmdDdHggc2VyaWFsaXppbmdDb250ZXh0KQorc3RhdHVzX3QgZGVzZXJpYWxpemVDb2xsZWN0aW9uKGNvbnN0IHhtbE5vZGUgKmN1ciwKKyAgICAgICAgdHlwZW5hbWUgVHJhaXQ6OkNvbGxlY3Rpb24gKmNvbGxlY3Rpb24sCisgICAgICAgIHR5cGVuYW1lIFRyYWl0OjpQdHJTZXJpYWxpemluZ0N0eCBzZXJpYWxpemluZ0NvbnRleHQpCiB7Ci0gICAgY29uc3QgeG1sTm9kZSAqcm9vdCA9IGN1ci0+eG1sQ2hpbGRyZW5Ob2RlOwotICAgIHdoaWxlIChyb290ICE9IE5VTEwpIHsKLSAgICAgICAgaWYgKHhtbFN0cmNtcChyb290LT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojpjb2xsZWN0aW9uVGFnKSAmJgotICAgICAgICAgICAgICAgIHhtbFN0cmNtcChyb290LT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojp0YWcpKSB7Ci0gICAgICAgICAgICByb290ID0gcm9vdC0+bmV4dDsKLSAgICAgICAgICAgIGNvbnRpbnVlOworICAgIGZvciAoY3VyID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgY29uc3QgeG1sTm9kZSAqY2hpbGQgPSBOVUxMOworICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KFRyYWl0Ojpjb2xsZWN0aW9uVGFnKSkpIHsKKyAgICAgICAgICAgIGNoaWxkID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7CisgICAgICAgIH0gZWxzZSBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KFRyYWl0Ojp0YWcpKSkgeworICAgICAgICAgICAgY2hpbGQgPSBjdXI7CiAgICAgICAgIH0KLSAgICAgICAgY29uc3QgeG1sTm9kZSAqY2hpbGQgPSByb290OwotICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6Y29sbGVjdGlvblRhZykpIHsKLSAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPnhtbENoaWxkcmVuTm9kZTsKLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoY2hpbGQgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OnRhZykpIHsKLSAgICAgICAgICAgICAgICB0eXBlbmFtZSBUcmFpdDo6UHRyRWxlbWVudCBlbGVtZW50OwotICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IFRyYWl0OjpkZXNlcmlhbGl6ZShkb2MsIGNoaWxkLCBlbGVtZW50LCBzZXJpYWxpemluZ0NvbnRleHQpOwotICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNvbGxlY3Rpb24uYWRkKGVsZW1lbnQpIDwgMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBhZGQgZWxlbWVudCB0byAlcyBjb2xsZWN0aW9uIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFpdDo6Y29sbGVjdGlvblRhZyk7CisgICAgICAgIGZvciAoOyBjaGlsZCAhPSBOVUxMOyBjaGlsZCA9IGNoaWxkLT5uZXh0KSB7CisgICAgICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oVHJhaXQ6OnRhZykpKSB7CisgICAgICAgICAgICAgICAgYXV0byBlbGVtZW50ID0gVHJhaXQ6OmRlc2VyaWFsaXplKGNoaWxkLCBzZXJpYWxpemluZ0NvbnRleHQpOworICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBUcmFpdDo6YWRkRWxlbWVudFRvQ29sbGVjdGlvbihlbGVtZW50LCBjb2xsZWN0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBjb3VsZCBub3QgYWRkIGVsZW1lbnQgdG8gJXMgY29sbGVjdGlvbiIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWl0Ojpjb2xsZWN0aW9uVGFnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHQ7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCF4bWxTdHJjbXAocm9vdC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilUcmFpdDo6dGFnKSkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KFRyYWl0Ojp0YWcpKSkgewogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9Ci0gICAgICAgIHJvb3QgPSByb290LT5uZXh0OwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLWNvbnN0IGNoYXIgKmNvbnN0IEF1ZGlvR2FpblRyYWl0czo6dGFnID0gImdhaW4iOwotY29uc3QgY2hhciAqY29uc3QgQXVkaW9HYWluVHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gImdhaW5zIjsKLQotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6Om1vZGVbXSA9ICJtb2RlIjsKLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjpjaGFubmVsTWFza1tdID0gImNoYW5uZWxfbWFzayI7Ci1jb25zdCBjaGFyIEF1ZGlvR2FpblRyYWl0czo6QXR0cmlidXRlczo6bWluVmFsdWVNQltdID0gIm1pblZhbHVlTUIiOwotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6Om1heFZhbHVlTUJbXSA9ICJtYXhWYWx1ZU1CIjsKLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjpkZWZhdWx0VmFsdWVNQltdID0gImRlZmF1bHRWYWx1ZU1CIjsKLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjpzdGVwVmFsdWVNQltdID0gInN0ZXBWYWx1ZU1CIjsKLWNvbnN0IGNoYXIgQXVkaW9HYWluVHJhaXRzOjpBdHRyaWJ1dGVzOjptaW5SYW1wTXNbXSA9ICJtaW5SYW1wTXMiOwotY29uc3QgY2hhciBBdWRpb0dhaW5UcmFpdHM6OkF0dHJpYnV0ZXM6Om1heFJhbXBNc1tdID0gIm1heFJhbXBNcyI7Ci0KLXN0YXR1c190IEF1ZGlvR2FpblRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqLypkb2MqLywgY29uc3QgX3htbE5vZGUgKnJvb3QsIFB0ckVsZW1lbnQgJmdhaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCitSZXR1cm48QXVkaW9HYWluVHJhaXRzOjpFbGVtZW50PiBBdWRpb0dhaW5UcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwKKyAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKICAgICBzdGF0aWMgdWludDMyX3QgaW5kZXggPSAwOwotICAgIGdhaW4gPSBuZXcgRWxlbWVudChpbmRleCsrLCB0cnVlKTsKKyAgICBFbGVtZW50IGdhaW4gPSBuZXcgQXVkaW9HYWluKGluZGV4KyssIHRydWUpOwogCi0gICAgc3RyaW5nIG1vZGUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6bW9kZSk7CisgICAgc3RkOjpzdHJpbmcgbW9kZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om1vZGUpOwogICAgIGlmICghbW9kZS5lbXB0eSgpKSB7CiAgICAgICAgIGdhaW4tPnNldE1vZGUoR2Fpbk1vZGVDb252ZXJ0ZXI6Om1hc2tGcm9tU3RyaW5nKG1vZGUpKTsKICAgICB9CiAKLSAgICBzdHJpbmcgY2hhbm5lbHNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmNoYW5uZWxNYXNrKTsKKyAgICBzdGQ6OnN0cmluZyBjaGFubmVsc0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpjaGFubmVsTWFzayk7CiAgICAgaWYgKCFjaGFubmVsc0xpdGVyYWwuZW1wdHkoKSkgewogICAgICAgICBnYWluLT5zZXRDaGFubmVsTWFzayhjaGFubmVsTWFza0Zyb21TdHJpbmcoY2hhbm5lbHNMaXRlcmFsKSk7CiAgICAgfQogCi0gICAgc3RyaW5nIG1pblZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6Om1pblZhbHVlTUIpOworICAgIHN0ZDo6c3RyaW5nIG1pblZhbHVlTUJMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bWluVmFsdWVNQik7CiAgICAgaW50MzJfdCBtaW5WYWx1ZU1COwogICAgIGlmICghbWluVmFsdWVNQkxpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8obWluVmFsdWVNQkxpdGVyYWwsIG1pblZhbHVlTUIpKSB7CiAgICAgICAgIGdhaW4tPnNldE1pblZhbHVlSW5NYihtaW5WYWx1ZU1CKTsKICAgICB9CiAKLSAgICBzdHJpbmcgbWF4VmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6bWF4VmFsdWVNQik7CisgICAgc3RkOjpzdHJpbmcgbWF4VmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjptYXhWYWx1ZU1CKTsKICAgICBpbnQzMl90IG1heFZhbHVlTUI7CiAgICAgaWYgKCFtYXhWYWx1ZU1CTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyhtYXhWYWx1ZU1CTGl0ZXJhbCwgbWF4VmFsdWVNQikpIHsKICAgICAgICAgZ2Fpbi0+c2V0TWF4VmFsdWVJbk1iKG1heFZhbHVlTUIpOwogICAgIH0KIAotICAgIHN0cmluZyBkZWZhdWx0VmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6ZGVmYXVsdFZhbHVlTUIpOworICAgIHN0ZDo6c3RyaW5nIGRlZmF1bHRWYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OmRlZmF1bHRWYWx1ZU1CKTsKICAgICBpbnQzMl90IGRlZmF1bHRWYWx1ZU1COwogICAgIGlmICghZGVmYXVsdFZhbHVlTUJMaXRlcmFsLmVtcHR5KCkgJiYgY29udmVydFRvKGRlZmF1bHRWYWx1ZU1CTGl0ZXJhbCwgZGVmYXVsdFZhbHVlTUIpKSB7CiAgICAgICAgIGdhaW4tPnNldERlZmF1bHRWYWx1ZUluTWIoZGVmYXVsdFZhbHVlTUIpOwogICAgIH0KIAotICAgIHN0cmluZyBzdGVwVmFsdWVNQkxpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6c3RlcFZhbHVlTUIpOworICAgIHN0ZDo6c3RyaW5nIHN0ZXBWYWx1ZU1CTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnN0ZXBWYWx1ZU1CKTsKICAgICB1aW50MzJfdCBzdGVwVmFsdWVNQjsKICAgICBpZiAoIXN0ZXBWYWx1ZU1CTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyhzdGVwVmFsdWVNQkxpdGVyYWwsIHN0ZXBWYWx1ZU1CKSkgewogICAgICAgICBnYWluLT5zZXRTdGVwVmFsdWVJbk1iKHN0ZXBWYWx1ZU1CKTsKICAgICB9CiAKLSAgICBzdHJpbmcgbWluUmFtcE1zTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjptaW5SYW1wTXMpOworICAgIHN0ZDo6c3RyaW5nIG1pblJhbXBNc0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjptaW5SYW1wTXMpOwogICAgIHVpbnQzMl90IG1pblJhbXBNczsKICAgICBpZiAoIW1pblJhbXBNc0xpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8obWluUmFtcE1zTGl0ZXJhbCwgbWluUmFtcE1zKSkgewogICAgICAgICBnYWluLT5zZXRNaW5SYW1wSW5NcyhtaW5SYW1wTXMpOwogICAgIH0KIAotICAgIHN0cmluZyBtYXhSYW1wTXNMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6Om1heFJhbXBNcyk7CisgICAgc3RkOjpzdHJpbmcgbWF4UmFtcE1zTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6Om1heFJhbXBNcyk7CiAgICAgdWludDMyX3QgbWF4UmFtcE1zOwogICAgIGlmICghbWF4UmFtcE1zTGl0ZXJhbC5lbXB0eSgpICYmIGNvbnZlcnRUbyhtYXhSYW1wTXNMaXRlcmFsLCBtYXhSYW1wTXMpKSB7CiAgICAgICAgIGdhaW4tPnNldE1heFJhbXBJbk1zKG1heFJhbXBNcyk7CiAgICAgfQotICAgIEFMT0dWKCIlczogYWRkaW5nIG5ldyBnYWluIG1vZGUgJTA4eCBjaGFubmVsIG1hc2sgJTA4eCBtaW4gbUIgJWQgbWF4IG1CICVkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgIGdhaW4tPmdldE1vZGUoKSwgZ2Fpbi0+Z2V0Q2hhbm5lbE1hc2soKSwgZ2Fpbi0+Z2V0TWluVmFsdWVJbk1iKCksCi0gICAgICAgICAgZ2Fpbi0+Z2V0TWF4VmFsdWVJbk1iKCkpOwotCi0gICAgaWYgKGdhaW4tPmdldE1vZGUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgc3RkOjpzdHJpbmcgdXNlRm9yVm9sdW1lTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnVzZUZvclZvbHVtZSk7CisgICAgYm9vbCB1c2VGb3JWb2x1bWUgPSBmYWxzZTsKKyAgICBpZiAoIXVzZUZvclZvbHVtZUxpdGVyYWwuZW1wdHkoKSAmJiBjb252ZXJ0VG8odXNlRm9yVm9sdW1lTGl0ZXJhbCwgdXNlRm9yVm9sdW1lKSkgeworICAgICAgICBnYWluLT5zZXRVc2VGb3JWb2x1bWUodXNlRm9yVm9sdW1lKTsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIEFMT0dWKCIlczogYWRkaW5nIG5ldyBnYWluIG1vZGUgJTA4eCBjaGFubmVsIG1hc2sgJTA4eCBtaW4gbUIgJWQgbWF4IG1CICVkIFVzZUZvclZvbHVtZTogJWQiLAorICAgICAgICAgIF9fZnVuY19fLCBnYWluLT5nZXRNb2RlKCksIGdhaW4tPmdldENoYW5uZWxNYXNrKCksIGdhaW4tPmdldE1pblZhbHVlSW5NYigpLAorICAgICAgICAgIGdhaW4tPmdldE1heFZhbHVlSW5NYigpLCB1c2VGb3JWb2x1bWUpOworCisgICAgaWYgKGdhaW4tPmdldE1vZGUoKSAhPSAwKSB7CisgICAgICAgIHJldHVybiBnYWluOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgfQogfQogCi1jb25zdCBjaGFyICpjb25zdCBBdWRpb1Byb2ZpbGVUcmFpdHM6OmNvbGxlY3Rpb25UYWcgPSAicHJvZmlsZXMiOwotY29uc3QgY2hhciAqY29uc3QgQXVkaW9Qcm9maWxlVHJhaXRzOjp0YWcgPSAicHJvZmlsZSI7Ci0KLWNvbnN0IGNoYXIgQXVkaW9Qcm9maWxlVHJhaXRzOjpBdHRyaWJ1dGVzOjpuYW1lW10gPSAibmFtZSI7Ci1jb25zdCBjaGFyIEF1ZGlvUHJvZmlsZVRyYWl0czo6QXR0cmlidXRlczo6c2FtcGxpbmdSYXRlc1tdID0gInNhbXBsaW5nUmF0ZXMiOwotY29uc3QgY2hhciBBdWRpb1Byb2ZpbGVUcmFpdHM6OkF0dHJpYnV0ZXM6OmZvcm1hdFtdID0gImZvcm1hdCI7Ci1jb25zdCBjaGFyIEF1ZGlvUHJvZmlsZVRyYWl0czo6QXR0cmlidXRlczo6Y2hhbm5lbE1hc2tzW10gPSAiY2hhbm5lbE1hc2tzIjsKLQotc3RhdHVzX3QgQXVkaW9Qcm9maWxlVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICovKmRvYyovLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmcHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKK1JldHVybjxBdWRpb1Byb2ZpbGVUcmFpdHM6OkVsZW1lbnQ+IEF1ZGlvUHJvZmlsZVRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLAorICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQogewotICAgIHN0cmluZyBzYW1wbGluZ1JhdGVzID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnNhbXBsaW5nUmF0ZXMpOwotICAgIHN0cmluZyBmb3JtYXQgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6Zm9ybWF0KTsKLSAgICBzdHJpbmcgY2hhbm5lbHMgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6Y2hhbm5lbE1hc2tzKTsKKyAgICBzdGQ6OnN0cmluZyBzYW1wbGluZ1JhdGVzID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c2FtcGxpbmdSYXRlcyk7CisgICAgc3RkOjpzdHJpbmcgZm9ybWF0ID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6Zm9ybWF0KTsKKyAgICBzdGQ6OnN0cmluZyBjaGFubmVscyA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OmNoYW5uZWxNYXNrcyk7CiAKLSAgICBwcm9maWxlID0gbmV3IEVsZW1lbnQoZm9ybWF0RnJvbVN0cmluZyhmb3JtYXQsIGdEeW5hbWljRm9ybWF0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzRnJvbVN0cmluZyhjaGFubmVscywgIiwiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlc0Zyb21TdHJpbmcoc2FtcGxpbmdSYXRlcywgIiwiKSk7CisgICAgRWxlbWVudCBwcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZShmb3JtYXRGcm9tU3RyaW5nKGZvcm1hdCwgZ0R5bmFtaWNGb3JtYXQpLAorICAgICAgICAgICAgY2hhbm5lbE1hc2tzRnJvbVN0cmluZyhjaGFubmVscywgIiwiKSwKKyAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXNGcm9tU3RyaW5nKHNhbXBsaW5nUmF0ZXMsICIsIikpOwogCiAgICAgcHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdChwcm9maWxlLT5nZXRGb3JtYXQoKSA9PSBnRHluYW1pY0Zvcm1hdCk7Ci0gICAgcHJvZmlsZS0+c2V0RHluYW1pY0NoYW5uZWxzKHByb2ZpbGUtPmdldENoYW5uZWxzKCkuaXNFbXB0eSgpKTsKLSAgICBwcm9maWxlLT5zZXREeW5hbWljUmF0ZShwcm9maWxlLT5nZXRTYW1wbGVSYXRlcygpLmlzRW1wdHkoKSk7CisgICAgcHJvZmlsZS0+c2V0RHluYW1pY0NoYW5uZWxzKHByb2ZpbGUtPmdldENoYW5uZWxzKCkuZW1wdHkoKSk7CisgICAgcHJvZmlsZS0+c2V0RHluYW1pY1JhdGUocHJvZmlsZS0+Z2V0U2FtcGxlUmF0ZXMoKS5lbXB0eSgpKTsKIAotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gcHJvZmlsZTsKIH0KIAotCi1jb25zdCBjaGFyICpjb25zdCBNaXhQb3J0VHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gIm1peFBvcnRzIjsKLWNvbnN0IGNoYXIgKmNvbnN0IE1peFBvcnRUcmFpdHM6OnRhZyA9ICJtaXhQb3J0IjsKLQotY29uc3QgY2hhciBNaXhQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjpuYW1lW10gPSAibmFtZSI7Ci1jb25zdCBjaGFyIE1peFBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OnJvbGVbXSA9ICJyb2xlIjsKLWNvbnN0IGNoYXIgTWl4UG9ydFRyYWl0czo6QXR0cmlidXRlczo6ZmxhZ3NbXSA9ICJmbGFncyI7Ci1jb25zdCBjaGFyIE1peFBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6Om1heE9wZW5Db3VudFtdID0gIm1heE9wZW5Db3VudCI7Ci1jb25zdCBjaGFyIE1peFBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6Om1heEFjdGl2ZUNvdW50W10gPSAibWF4QWN0aXZlQ291bnQiOwotCi1zdGF0dXNfdCBNaXhQb3J0VHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjaGlsZCwgUHRyRWxlbWVudCAmbWl4UG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCitSZXR1cm48TWl4UG9ydFRyYWl0czo6RWxlbWVudD4gTWl4UG9ydFRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY2hpbGQsCisgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCiB7Ci0gICAgc3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om5hbWUpOwogICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bmFtZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6bmFtZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKLSAgICBzdHJpbmcgcm9sZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6cm9sZSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CisgICAgc3RkOjpzdHJpbmcgcm9sZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6cm9sZSk7CiAgICAgaWYgKHJvbGUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpyb2xlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpyb2xlKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiBSb2xlPSVzIiwgX19GVU5DVElPTl9fLCByb2xlLmNfc3RyKCkpOwotICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlID0gcm9sZSA9PSAic291cmNlIiA/IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgOiBBVURJT19QT1JUX1JPTEVfU0lOSzsKKyAgICBBTE9HVigiJXM6IFJvbGU9JXMiLCBfX2Z1bmNfXywgcm9sZS5jX3N0cigpKTsKKyAgICBhdWRpb19wb3J0X3JvbGVfdCBwb3J0Um9sZSA9IChyb2xlID09IEF0dHJpYnV0ZXM6OnJvbGVTb3VyY2UpID8KKyAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgOiBBVURJT19QT1JUX1JPTEVfU0lOSzsKIAotICAgIG1peFBvcnQgPSBuZXcgRWxlbWVudChTdHJpbmc4KG5hbWUuY19zdHIoKSksIHBvcnRSb2xlKTsKKyAgICBFbGVtZW50IG1peFBvcnQgPSBuZXcgSU9Qcm9maWxlKG5hbWUsIHBvcnRSb2xlKTsKIAogICAgIEF1ZGlvUHJvZmlsZVRyYWl0czo6Q29sbGVjdGlvbiBwcm9maWxlczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9Qcm9maWxlVHJhaXRzPihkb2MsIGNoaWxkLCBwcm9maWxlcywgTlVMTCk7Ci0gICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSkgewotICAgICAgICBzcCA8QXVkaW9Qcm9maWxlPiBkeW5hbWljUHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoZ0R5bmFtaWNGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsc1ZlY3RvcigpLCBTYW1wbGVSYXRlVmVjdG9yKCkpOwotICAgICAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsKLSAgICAgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNDaGFubmVscyh0cnVlKTsKLSAgICAgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNSYXRlKHRydWUpOwotICAgICAgICBwcm9maWxlcy5hZGQoZHluYW1pY1Byb2ZpbGUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb1Byb2ZpbGVUcmFpdHM+KGNoaWxkLCAmcHJvZmlsZXMsIE5VTEwpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1Qoc3RhdHVzKTsKICAgICB9CisgICAgaWYgKHByb2ZpbGVzLmVtcHR5KCkpIHsKKyAgICAgICAgcHJvZmlsZXMuYWRkKEF1ZGlvUHJvZmlsZTo6Y3JlYXRlRnVsbER5bmFtaWMoZ0R5bmFtaWNGb3JtYXQpKTsKKyAgICB9CisgICAgLy8gVGhlIGF1ZGlvIHByb2ZpbGVzIGFyZSBpbiBvcmRlciBvZiBsaXN0ZWQgaW4gYXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAvLyBTb3J0IGF1ZGlvIHByb2ZpbGVzIGFjY3JvZGluZyB0byB0aGUgZm9ybWF0LgorICAgIHNvcnRBdWRpb1Byb2ZpbGVzKHByb2ZpbGVzKTsKICAgICBtaXhQb3J0LT5zZXRBdWRpb1Byb2ZpbGVzKHByb2ZpbGVzKTsKIAotICAgIHN0cmluZyBmbGFncyA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6ZmxhZ3MpOworICAgIHN0ZDo6c3RyaW5nIGZsYWdzID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpmbGFncyk7CiAgICAgaWYgKCFmbGFncy5lbXB0eSgpKSB7CiAgICAgICAgIC8vIFNvdXJjZSByb2xlCiAgICAgICAgIGlmIChwb3J0Um9sZSA9PSBBVURJT19QT1JUX1JPTEVfU09VUkNFKSB7CkBAIC0yNjEsNTIgKzQ1Niw0NiBAQAogICAgICAgICAgICAgbWl4UG9ydC0+c2V0RmxhZ3MoSW5wdXRGbGFnQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhmbGFncykpOwogICAgICAgICB9CiAgICAgfQotICAgIHN0cmluZyBtYXhPcGVuQ291bnQgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om1heE9wZW5Db3VudCk7CisgICAgc3RkOjpzdHJpbmcgbWF4T3BlbkNvdW50ID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjptYXhPcGVuQ291bnQpOwogICAgIGlmICghbWF4T3BlbkNvdW50LmVtcHR5KCkpIHsKICAgICAgICAgY29udmVydFRvKG1heE9wZW5Db3VudCwgbWl4UG9ydC0+bWF4T3BlbkNvdW50KTsKICAgICB9Ci0gICAgc3RyaW5nIG1heEFjdGl2ZUNvdW50ID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjptYXhBY3RpdmVDb3VudCk7CisgICAgc3RkOjpzdHJpbmcgbWF4QWN0aXZlQ291bnQgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om1heEFjdGl2ZUNvdW50KTsKICAgICBpZiAoIW1heEFjdGl2ZUNvdW50LmVtcHR5KCkpIHsKICAgICAgICAgY29udmVydFRvKG1heEFjdGl2ZUNvdW50LCBtaXhQb3J0LT5tYXhBY3RpdmVDb3VudCk7CiAgICAgfQogICAgIC8vIERlc2VyaWFsaXplIGNoaWxkcmVuCiAgICAgQXVkaW9HYWluVHJhaXRzOjpDb2xsZWN0aW9uIGdhaW5zOwotICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb0dhaW5UcmFpdHM+KGRvYywgY2hpbGQsIGdhaW5zLCBOVUxMKTsKKyAgICBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9HYWluVHJhaXRzPihjaGlsZCwgJmdhaW5zLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfQogICAgIG1peFBvcnQtPnNldEdhaW5zKGdhaW5zKTsKIAotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gbWl4UG9ydDsKIH0KIAotY29uc3QgY2hhciAqY29uc3QgRGV2aWNlUG9ydFRyYWl0czo6dGFnID0gImRldmljZVBvcnQiOwotY29uc3QgY2hhciAqY29uc3QgRGV2aWNlUG9ydFRyYWl0czo6Y29sbGVjdGlvblRhZyA9ICJkZXZpY2VQb3J0cyI7Ci0KLWNvbnN0IGNoYXIgRGV2aWNlUG9ydFRyYWl0czo6QXR0cmlidXRlczo6dGFnTmFtZVtdID0gInRhZ05hbWUiOwotY29uc3QgY2hhciBEZXZpY2VQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjp0eXBlW10gPSAidHlwZSI7Ci1jb25zdCBjaGFyIERldmljZVBvcnRUcmFpdHM6OkF0dHJpYnV0ZXM6OnJvbGVbXSA9ICJyb2xlIjsKLWNvbnN0IGNoYXIgRGV2aWNlUG9ydFRyYWl0czo6QXR0cmlidXRlczo6YWRkcmVzc1tdID0gImFkZHJlc3MiOwotY29uc3QgY2hhciBEZXZpY2VQb3J0VHJhaXRzOjpBdHRyaWJ1dGVzOjpyb2xlU291cmNlW10gPSAic291cmNlIjsKLQotc3RhdHVzX3QgRGV2aWNlUG9ydFRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZGV2aWNlRGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clNlcmlhbGl6aW5nQ3R4IC8qc2VyaWFsaXppbmdDb250ZXh0Ki8pCitSZXR1cm48RGV2aWNlUG9ydFRyYWl0czo6RWxlbWVudD4gRGV2aWNlUG9ydFRyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqY3VyLAorICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCAvKnNlcmlhbGl6aW5nQ29udGV4dCovKQogewotICAgIHN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnRhZ05hbWUpOworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjp0YWdOYW1lKTsKICAgICBpZiAobmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnRhZ05hbWUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6OnRhZ05hbWUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIEF0dHJpYnV0ZXM6OnRhZ05hbWUsIG5hbWUuY19zdHIoKSk7Ci0gICAgc3RyaW5nIHR5cGVOYW1lID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnR5cGUpOworICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjp0YWdOYW1lLCBuYW1lLmNfc3RyKCkpOworICAgIHN0ZDo6c3RyaW5nIHR5cGVOYW1lID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6dHlwZSk7CiAgICAgaWYgKHR5cGVOYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBubyB0eXBlIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgbmFtZS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyB0eXBlIGZvciAlcyIsIF9fZnVuY19fLCBuYW1lLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIEF0dHJpYnV0ZXM6OnR5cGUsIHR5cGVOYW1lLmNfc3RyKCkpOwotICAgIHN0cmluZyByb2xlID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnJvbGUpOworICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjp0eXBlLCB0eXBlTmFtZS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyByb2xlID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6cm9sZSk7CiAgICAgaWYgKHJvbGUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpyb2xlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpyb2xlKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9Ci0gICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCBBdHRyaWJ1dGVzOjpyb2xlLCByb2xlLmNfc3RyKCkpOworICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX2Z1bmNfXywgdGFnLCBBdHRyaWJ1dGVzOjpyb2xlLCByb2xlLmNfc3RyKCkpOwogICAgIGF1ZGlvX3BvcnRfcm9sZV90IHBvcnRSb2xlID0gKHJvbGUgPT0gQXR0cmlidXRlczo6cm9sZVNvdXJjZSkgPwogICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UgOiBBVURJT19QT1JUX1JPTEVfU0lOSzsKIApAQCAtMzE0LDMzOCArNTAzLDMwMyBAQAogICAgIGlmICghZGV2aWNlRnJvbVN0cmluZyh0eXBlTmFtZSwgdHlwZSkgfHwKICAgICAgICAgICAgICghYXVkaW9faXNfaW5wdXRfZGV2aWNlKHR5cGUpICYmIHBvcnRSb2xlID09IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UpIHx8CiAgICAgICAgICAgICAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2VzKHR5cGUpICYmIHBvcnRSb2xlID09IEFVRElPX1BPUlRfUk9MRV9TSU5LKSkgewotICAgICAgICBBTE9HVygiJXM6IGJhZCB0eXBlICUwOHgiLCBfX0ZVTkNUSU9OX18sIHR5cGUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HVygiJXM6IGJhZCB0eXBlICUwOHgiLCBfX2Z1bmNfXywgdHlwZSk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQotICAgIGRldmljZURlc2MgPSBuZXcgRWxlbWVudCh0eXBlLCBTdHJpbmc4KG5hbWUuY19zdHIoKSkpOwotCi0gICAgc3RyaW5nIGFkZHJlc3MgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6YWRkcmVzcyk7Ci0gICAgaWYgKCFhZGRyZXNzLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBhZGRyZXNzPSVzIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgYWRkcmVzcy5jX3N0cigpLCBuYW1lLmNfc3RyKCkpOwotICAgICAgICBkZXZpY2VEZXNjLT5tQWRkcmVzcyA9IFN0cmluZzgoYWRkcmVzcy5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyBlbmNvZGVkRm9ybWF0c0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjplbmNvZGVkRm9ybWF0cyk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6OmVuY29kZWRGb3JtYXRzLCBlbmNvZGVkRm9ybWF0c0xpdGVyYWwuY19zdHIoKSk7CisgICAgRm9ybWF0VmVjdG9yIGVuY29kZWRGb3JtYXRzOworICAgIGlmICghZW5jb2RlZEZvcm1hdHNMaXRlcmFsLmVtcHR5KCkpIHsKKyAgICAgICAgZW5jb2RlZEZvcm1hdHMgPSBmb3JtYXRzRnJvbVN0cmluZyhlbmNvZGVkRm9ybWF0c0xpdGVyYWwsICIgIik7CiAgICAgfQorICAgIHN0ZDo6c3RyaW5nIGFkZHJlc3MgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjphZGRyZXNzKTsKKyAgICBFbGVtZW50IGRldmljZURlc2MgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcih0eXBlLCBuYW1lLCBhZGRyZXNzLCBlbmNvZGVkRm9ybWF0cyk7CiAKICAgICBBdWRpb1Byb2ZpbGVUcmFpdHM6OkNvbGxlY3Rpb24gcHJvZmlsZXM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvUHJvZmlsZVRyYWl0cz4oZG9jLCByb290LCBwcm9maWxlcywgTlVMTCk7Ci0gICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSkgewotICAgICAgICBzcCA8QXVkaW9Qcm9maWxlPiBkeW5hbWljUHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoZ0R5bmFtaWNGb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsc1ZlY3RvcigpLCBTYW1wbGVSYXRlVmVjdG9yKCkpOwotICAgICAgICBkeW5hbWljUHJvZmlsZS0+c2V0RHluYW1pY0Zvcm1hdCh0cnVlKTsKLSAgICAgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNDaGFubmVscyh0cnVlKTsKLSAgICAgICAgZHluYW1pY1Byb2ZpbGUtPnNldER5bmFtaWNSYXRlKHRydWUpOwotICAgICAgICBwcm9maWxlcy5hZGQoZHluYW1pY1Byb2ZpbGUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxBdWRpb1Byb2ZpbGVUcmFpdHM+KGN1ciwgJnByb2ZpbGVzLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CiAgICAgfQorICAgIGlmIChwcm9maWxlcy5lbXB0eSgpKSB7CisgICAgICAgIHByb2ZpbGVzLmFkZChBdWRpb1Byb2ZpbGU6OmNyZWF0ZUZ1bGxEeW5hbWljKGdEeW5hbWljRm9ybWF0KSk7CisgICAgfQorICAgIC8vIFRoZSBhdWRpbyBwcm9maWxlcyBhcmUgaW4gb3JkZXIgb2YgbGlzdGVkIGluIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUuCisgICAgLy8gU29ydCBhdWRpbyBwcm9maWxlcyBhY2Nyb2RpbmcgdG8gdGhlIGZvcm1hdC4KKyAgICBzb3J0QXVkaW9Qcm9maWxlcyhwcm9maWxlcyk7CiAgICAgZGV2aWNlRGVzYy0+c2V0QXVkaW9Qcm9maWxlcyhwcm9maWxlcyk7CiAKICAgICAvLyBEZXNlcmlhbGl6ZSBBdWRpb0dhaW4gY2hpbGRyZW4KLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248QXVkaW9HYWluVHJhaXRzPihkb2MsIHJvb3QsIGRldmljZURlc2MtPm1HYWlucywgTlVMTCk7Ci0gICAgQUxPR1YoIiVzOiBhZGRpbmcgZGV2aWNlIHRhZyAlcyB0eXBlICUwOHggYWRkcmVzcyAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICBkZXZpY2VEZXNjLT5nZXROYW1lKCkuc3RyaW5nKCksIHR5cGUsIGRldmljZURlc2MtPm1BZGRyZXNzLnN0cmluZygpKTsKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgc3RhdHVzID0gZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF1ZGlvR2FpblRyYWl0cz4oY3VyLCAmZGV2aWNlRGVzYy0+bUdhaW5zLCBOVUxMKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfQorICAgIEFMT0dWKCIlczogYWRkaW5nIGRldmljZSB0YWcgJXMgdHlwZSAlMDh4IGFkZHJlc3MgJXMiLCBfX2Z1bmNfXywKKyAgICAgICAgICBkZXZpY2VEZXNjLT5nZXROYW1lKCkuY19zdHIoKSwgdHlwZSwgZGV2aWNlRGVzYy0+YWRkcmVzcygpLmNfc3RyKCkpOworICAgIHJldHVybiBkZXZpY2VEZXNjOwogfQogCi1jb25zdCBjaGFyICpjb25zdCBSb3V0ZVRyYWl0czo6dGFnID0gInJvdXRlIjsKLWNvbnN0IGNoYXIgKmNvbnN0IFJvdXRlVHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gInJvdXRlcyI7Ci0KLWNvbnN0IGNoYXIgUm91dGVUcmFpdHM6OkF0dHJpYnV0ZXM6OnR5cGVbXSA9ICJ0eXBlIjsKLWNvbnN0IGNoYXIgUm91dGVUcmFpdHM6OkF0dHJpYnV0ZXM6OnR5cGVNaXhbXSA9ICJtaXgiOwotY29uc3QgY2hhciBSb3V0ZVRyYWl0czo6QXR0cmlidXRlczo6c2lua1tdID0gInNpbmsiOwotY29uc3QgY2hhciBSb3V0ZVRyYWl0czo6QXR0cmlidXRlczo6c291cmNlc1tdID0gInNvdXJjZXMiOwotCi0KLXN0YXR1c190IFJvdXRlVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICovKmRvYyovLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBjdHgpCitSZXR1cm48Um91dGVUcmFpdHM6OkVsZW1lbnQ+IFJvdXRlVHJhaXRzOjpkZXNlcmlhbGl6ZShjb25zdCB4bWxOb2RlICpjdXIsIFB0clNlcmlhbGl6aW5nQ3R4IGN0eCkKIHsKLSAgICBzdHJpbmcgdHlwZSA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjp0eXBlKTsKKyAgICBzdGQ6OnN0cmluZyB0eXBlID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6dHlwZSk7CiAgICAgaWYgKHR5cGUuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjp0eXBlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjp0eXBlKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9CiAgICAgYXVkaW9fcm91dGVfdHlwZV90IHJvdXRlVHlwZSA9ICh0eXBlID09IEF0dHJpYnV0ZXM6OnR5cGVNaXgpID8KICAgICAgICAgICAgICAgICBBVURJT19ST1VURV9NSVggOiBBVURJT19ST1VURV9NVVg7CiAKLSAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIEF0dHJpYnV0ZXM6OnR5cGUsIHR5cGUuY19zdHIoKSk7Ci0gICAgZWxlbWVudCA9IG5ldyBFbGVtZW50KHJvdXRlVHlwZSk7CisgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIEF0dHJpYnV0ZXM6OnR5cGUsIHR5cGUuY19zdHIoKSk7CisgICAgRWxlbWVudCByb3V0ZSA9IG5ldyBBdWRpb1JvdXRlKHJvdXRlVHlwZSk7CiAKLSAgICBzdHJpbmcgc2lua0F0dHIgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6c2luayk7CisgICAgc3RkOjpzdHJpbmcgc2lua0F0dHIgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzaW5rKTsKICAgICBpZiAoc2lua0F0dHIuZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpzaW5rKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpzaW5rKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICB9CiAgICAgLy8gQ29udmVydCBTaW5rIG5hbWUgdG8gcG9ydCBwb2ludGVyCi0gICAgc3A8QXVkaW9Qb3J0PiBzaW5rID0gY3R4LT5maW5kUG9ydEJ5VGFnTmFtZShTdHJpbmc4KHNpbmtBdHRyLmNfc3RyKCkpKTsKKyAgICBzcDxQb2xpY3lBdWRpb1BvcnQ+IHNpbmsgPSBjdHgtPmZpbmRQb3J0QnlUYWdOYW1lKHNpbmtBdHRyKTsKICAgICBpZiAoc2luayA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gc2luayBmb3VuZCB3aXRoIG5hbWU9JXMiLCBfX0ZVTkNUSU9OX18sIHNpbmtBdHRyLmNfc3RyKCkpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IG5vIHNpbmsgZm91bmQgd2l0aCBuYW1lPSVzIiwgX19mdW5jX18sIHNpbmtBdHRyLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KLSAgICBlbGVtZW50LT5zZXRTaW5rKHNpbmspOworICAgIHJvdXRlLT5zZXRTaW5rKHNpbmspOwogCi0gICAgc3RyaW5nIHNvdXJjZXNBdHRyID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnNvdXJjZXMpOworICAgIHN0ZDo6c3RyaW5nIHNvdXJjZXNBdHRyID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6c291cmNlcyk7CiAgICAgaWYgKHNvdXJjZXNBdHRyLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6c291cmNlcyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX2Z1bmNfXywgQXR0cmlidXRlczo6c291cmNlcyk7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CiAgICAgfQogICAgIC8vIFRva2VuaXplIGFuZCBDb252ZXJ0IFNvdXJjZXMgbmFtZSB0byBwb3J0IHBvaW50ZXIKLSAgICBBdWRpb1BvcnRWZWN0b3Igc291cmNlczsKLSAgICBjaGFyICpzb3VyY2VzTGl0ZXJhbCA9IHN0cm5kdXAoc291cmNlc0F0dHIuY19zdHIoKSwgc3RybGVuKHNvdXJjZXNBdHRyLmNfc3RyKCkpKTsKLSAgICBjaGFyICpkZXZUYWcgPSBzdHJ0b2soc291cmNlc0xpdGVyYWwsICIsIik7CisgICAgUG9saWN5QXVkaW9Qb3J0VmVjdG9yIHNvdXJjZXM7CisgICAgc3RkOjp1bmlxdWVfcHRyPGNoYXJbXT4gc291cmNlc0xpdGVyYWx7c3RybmR1cCgKKyAgICAgICAgICAgICAgICBzb3VyY2VzQXR0ci5jX3N0cigpLCBzdHJsZW4oc291cmNlc0F0dHIuY19zdHIoKSkpfTsKKyAgICBjaGFyICpkZXZUYWcgPSBzdHJ0b2soc291cmNlc0xpdGVyYWwuZ2V0KCksICIsIik7CiAgICAgd2hpbGUgKGRldlRhZyAhPSBOVUxMKSB7CiAgICAgICAgIGlmIChzdHJsZW4oZGV2VGFnKSAhPSAwKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb1BvcnQ+IHNvdXJjZSA9IGN0eC0+ZmluZFBvcnRCeVRhZ05hbWUoU3RyaW5nOChkZXZUYWcpKTsKKyAgICAgICAgICAgIHNwPFBvbGljeUF1ZGlvUG9ydD4gc291cmNlID0gY3R4LT5maW5kUG9ydEJ5VGFnTmFtZShkZXZUYWcpOwogICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBubyBzb3VyY2UgZm91bmQgd2l0aCBuYW1lPSVzIiwgX19GVU5DVElPTl9fLCBkZXZUYWcpOwotICAgICAgICAgICAgICAgIGZyZWUoc291cmNlc0xpdGVyYWwpOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBubyBzb3VyY2UgZm91bmQgd2l0aCBuYW1lPSVzIiwgX19mdW5jX18sIGRldlRhZyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHNvdXJjZXMuYWRkKHNvdXJjZSk7CiAgICAgICAgIH0KICAgICAgICAgZGV2VGFnID0gc3RydG9rKE5VTEwsICIsIik7CiAgICAgfQotICAgIGZyZWUoc291cmNlc0xpdGVyYWwpOwogCi0gICAgc2luay0+YWRkUm91dGUoZWxlbWVudCk7CisgICAgc2luay0+YWRkUm91dGUocm91dGUpOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc291cmNlcy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxBdWRpb1BvcnQ+IHNvdXJjZSA9IHNvdXJjZXMuaXRlbUF0KGkpOwotICAgICAgICBzb3VyY2UtPmFkZFJvdXRlKGVsZW1lbnQpOworICAgICAgICBzcDxQb2xpY3lBdWRpb1BvcnQ+IHNvdXJjZSA9IHNvdXJjZXMuaXRlbUF0KGkpOworICAgICAgICBzb3VyY2UtPmFkZFJvdXRlKHJvdXRlKTsKICAgICB9Ci0gICAgZWxlbWVudC0+c2V0U291cmNlcyhzb3VyY2VzKTsKLSAgICByZXR1cm4gTk9fRVJST1I7CisgICAgcm91dGUtPnNldFNvdXJjZXMoc291cmNlcyk7CisgICAgcmV0dXJuIHJvdXRlOwogfQogCi1jb25zdCBjaGFyICpjb25zdCBNb2R1bGVUcmFpdHM6OmNoaWxkQXR0YWNoZWREZXZpY2VzVGFnID0gImF0dGFjaGVkRGV2aWNlcyI7Ci1jb25zdCBjaGFyICpjb25zdCBNb2R1bGVUcmFpdHM6OmNoaWxkQXR0YWNoZWREZXZpY2VUYWcgPSAiaXRlbSI7Ci1jb25zdCBjaGFyICpjb25zdCBNb2R1bGVUcmFpdHM6OmNoaWxkRGVmYXVsdE91dHB1dERldmljZVRhZyA9ICJkZWZhdWx0T3V0cHV0RGV2aWNlIjsKLQotY29uc3QgY2hhciAqY29uc3QgTW9kdWxlVHJhaXRzOjp0YWcgPSAibW9kdWxlIjsKLWNvbnN0IGNoYXIgKmNvbnN0IE1vZHVsZVRyYWl0czo6Y29sbGVjdGlvblRhZyA9ICJtb2R1bGVzIjsKLQotY29uc3QgY2hhciBNb2R1bGVUcmFpdHM6OkF0dHJpYnV0ZXM6Om5hbWVbXSA9ICJuYW1lIjsKLWNvbnN0IGNoYXIgTW9kdWxlVHJhaXRzOjpBdHRyaWJ1dGVzOjp2ZXJzaW9uW10gPSAiaGFsVmVyc2lvbiI7Ci0KLXN0YXR1c190IE1vZHVsZVRyYWl0czo6ZGVzZXJpYWxpemUoeG1sRG9jUHRyIGRvYywgY29uc3QgeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQdHJTZXJpYWxpemluZ0N0eCBjdHgpCitSZXR1cm48TW9kdWxlVHJhaXRzOjpFbGVtZW50PiBNb2R1bGVUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggY3R4KQogewotICAgIHN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpuYW1lKTsKICAgICBpZiAobmFtZS5lbXB0eSgpKSB7Ci0gICAgICAgIEFMT0dFKCIlczogTm8gJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6Om5hbWUpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIiwgX19mdW5jX18sIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOwogICAgIH0KICAgICB1aW50MzJfdCB2ZXJzaW9uTWFqb3IgPSAwLCB2ZXJzaW9uTWlub3IgPSAwOwotICAgIHN0cmluZyB2ZXJzaW9uTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjp2ZXJzaW9uKTsKKyAgICBzdGQ6OnN0cmluZyB2ZXJzaW9uTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIEF0dHJpYnV0ZXM6OnZlcnNpb24pOwogICAgIGlmICghdmVyc2lvbkxpdGVyYWwuZW1wdHkoKSkgewogICAgICAgICBzc2NhbmYodmVyc2lvbkxpdGVyYWwuY19zdHIoKSwgIiV1LiV1IiwgJnZlcnNpb25NYWpvciwgJnZlcnNpb25NaW5vcik7Ci0gICAgICAgIEFMT0dWKCIlczogbUhhbFZlcnNpb24gPSBtYWpvciAldSBtaW5vciAldSIsICBfX0ZVTkNUSU9OX18sCisgICAgICAgIEFMT0dWKCIlczogbUhhbFZlcnNpb24gPSBtYWpvciAldSBtaW5vciAldSIsICBfX2Z1bmNfXywKICAgICAgICAgICAgICAgdmVyc2lvbk1ham9yLCB2ZXJzaW9uTWFqb3IpOwogICAgIH0KIAotICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKKyAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKIAotICAgIG1vZHVsZSA9IG5ldyBFbGVtZW50KG5hbWUuY19zdHIoKSwgdmVyc2lvbk1ham9yLCB2ZXJzaW9uTWlub3IpOworICAgIEVsZW1lbnQgbW9kdWxlID0gbmV3IEh3TW9kdWxlKG5hbWUuY19zdHIoKSwgdmVyc2lvbk1ham9yLCB2ZXJzaW9uTWlub3IpOwogCiAgICAgLy8gRGVzZXJpYWxpemUgY2hpbGRyZW5zOiBBdWRpbyBNaXggUG9ydCwgQXVkaW8gRGV2aWNlIFBvcnRzIChTb3VyY2UvU2luayksIEF1ZGlvIFJvdXRlcwogICAgIE1peFBvcnRUcmFpdHM6OkNvbGxlY3Rpb24gbWl4UG9ydHM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPE1peFBvcnRUcmFpdHM+KGRvYywgcm9vdCwgbWl4UG9ydHMsIE5VTEwpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxNaXhQb3J0VHJhaXRzPihjdXIsICZtaXhQb3J0cywgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIH0KICAgICBtb2R1bGUtPnNldFByb2ZpbGVzKG1peFBvcnRzKTsKIAogICAgIERldmljZVBvcnRUcmFpdHM6OkNvbGxlY3Rpb24gZGV2aWNlUG9ydHM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPERldmljZVBvcnRUcmFpdHM+KGRvYywgcm9vdCwgZGV2aWNlUG9ydHMsIE5VTEwpOworICAgIHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxEZXZpY2VQb3J0VHJhaXRzPihjdXIsICZkZXZpY2VQb3J0cywgTlVMTCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChzdGF0dXMpOworICAgIH0KICAgICBtb2R1bGUtPnNldERlY2xhcmVkRGV2aWNlcyhkZXZpY2VQb3J0cyk7CiAKICAgICBSb3V0ZVRyYWl0czo6Q29sbGVjdGlvbiByb3V0ZXM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPFJvdXRlVHJhaXRzPihkb2MsIHJvb3QsIHJvdXRlcywgbW9kdWxlLmdldCgpKTsKKyAgICBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Um91dGVUcmFpdHM+KGN1ciwgJnJvdXRlcywgbW9kdWxlLmdldCgpKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKHN0YXR1cyk7CisgICAgfQogICAgIG1vZHVsZS0+c2V0Um91dGVzKHJvdXRlcyk7CiAKLSAgICBjb25zdCB4bWxOb2RlICpjaGlsZHJlbiA9IHJvb3QtPnhtbENoaWxkcmVuTm9kZTsKLSAgICB3aGlsZSAoY2hpbGRyZW4gIT0gTlVMTCkgewotICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZHJlbi0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKiljaGlsZEF0dGFjaGVkRGV2aWNlc1RhZykpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlczogJXMgJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIHRhZywgY2hpbGRBdHRhY2hlZERldmljZXNUYWcpOwotICAgICAgICAgICAgY29uc3QgeG1sTm9kZSAqY2hpbGQgPSBjaGlsZHJlbi0+eG1sQ2hpbGRyZW5Ob2RlOwotICAgICAgICAgICAgd2hpbGUgKGNoaWxkICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKiljaGlsZEF0dGFjaGVkRGV2aWNlVGFnKSkgewotICAgICAgICAgICAgICAgICAgICB4bWxDaGFyICphdHRhY2hlZERldmljZSA9IHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdHRhY2hlZERldmljZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19GVU5DVElPTl9fLCB0YWcsIGNoaWxkQXR0YWNoZWREZXZpY2VUYWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY29uc3QgY2hhciopYXR0YWNoZWREZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKS5nZXREZXZpY2VGcm9tVGFnTmFtZShTdHJpbmc4KChjb25zdCBjaGFyKilhdHRhY2hlZERldmljZSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY3R4LT5hZGRBdmFpbGFibGVEZXZpY2UoZGV2aWNlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHhtbEZyZWUoYXR0YWNoZWREZXZpY2UpOworICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY2hpbGRyZW4gPSBjdXItPnhtbENoaWxkcmVuTm9kZTsgY2hpbGRyZW4gIT0gTlVMTDsKKyAgICAgICAgIGNoaWxkcmVuID0gY2hpbGRyZW4tPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGRyZW4tPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KGNoaWxkQXR0YWNoZWREZXZpY2VzVGFnKSkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogJXMgJXMgZm91bmQiLCBfX2Z1bmNfXywgdGFnLCBjaGlsZEF0dGFjaGVkRGV2aWNlc1RhZyk7CisgICAgICAgICAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmNoaWxkID0gY2hpbGRyZW4tPnhtbENoaWxkcmVuTm9kZTsgY2hpbGQgIT0gTlVMTDsKKyAgICAgICAgICAgICAgICAgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworICAgICAgICAgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPihjaGlsZEF0dGFjaGVkRGV2aWNlVGFnKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYXV0byBhdHRhY2hlZERldmljZSA9IG1ha2VfeG1sVW5pcXVlKHhtbE5vZGVMaXN0R2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGQtPmRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSkpOworICAgICAgICAgICAgICAgICAgICBpZiAoYXR0YWNoZWREZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiAlcyAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIGNoaWxkQXR0YWNoZWREZXZpY2VUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGF0dGFjaGVkRGV2aWNlLmdldCgpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBtb2R1bGUtPmdldERlY2xhcmVkRGV2aWNlcygpLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VGcm9tVGFnTmFtZShzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0YWNoZWREZXZpY2UuZ2V0KCkpKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBjdHgtPmFkZERldmljZShkZXZpY2UpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNoaWxkID0gY2hpbGQtPm5leHQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGRyZW4tPm5hbWUsIChjb25zdCB4bWxDaGFyICopY2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnKSkgewotICAgICAgICAgICAgeG1sQ2hhciAqZGVmYXVsdE91dHB1dERldmljZSA9IHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGRyZW4tPnhtbENoaWxkcmVuTm9kZSwgMSk7OwotICAgICAgICAgICAgaWYgKGRlZmF1bHRPdXRwdXREZXZpY2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogJXMgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgY2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnLAotICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKilkZWZhdWx0T3V0cHV0RGV2aWNlKTsKLSAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQotICAgICAgICAgICAgICAgICAgICAgICAgbW9kdWxlLT5nZXREZWNsYXJlZERldmljZXMoKS5nZXREZXZpY2VGcm9tVGFnTmFtZShTdHJpbmc4KChjb25zdCBjaGFyKilkZWZhdWx0T3V0cHV0RGV2aWNlKSk7CisgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkcmVuLT5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4oY2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnKSkpIHsKKyAgICAgICAgICAgIGF1dG8gZGVmYXVsdE91dHB1dERldmljZSA9IG1ha2VfeG1sVW5pcXVlKHhtbE5vZGVMaXN0R2V0U3RyaW5nKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuLT5kb2MsIGNoaWxkcmVuLT54bWxDaGlsZHJlbk5vZGUsIDEpKTsKKyAgICAgICAgICAgIGlmIChkZWZhdWx0T3V0cHV0RGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6ICVzICVzPSVzIiwgX19mdW5jX18sIHRhZywgY2hpbGREZWZhdWx0T3V0cHV0RGV2aWNlVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGVmYXVsdE91dHB1dERldmljZS5nZXQoKSkpOworICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkuZ2V0RGV2aWNlRnJvbVRhZ05hbWUoCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihkZWZhdWx0T3V0cHV0RGV2aWNlLmdldCgpKSkpOwogICAgICAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gMCAmJiBjdHgtPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIGN0eC0+c2V0RGVmYXVsdE91dHB1dERldmljZShkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IGRlZmF1bHQgaXMgJTA4eCIsIF9fRlVOQ1RJT05fXywgY3R4LT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCktPnR5cGUoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogZGVmYXVsdCBpcyAlMDh4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgY3R4LT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCktPnR5cGUoKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHhtbEZyZWUoZGVmYXVsdE91dHB1dERldmljZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgY2hpbGRyZW4gPSBjaGlsZHJlbi0+bmV4dDsKICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJldHVybiBtb2R1bGU7CiB9CiAKLWNvbnN0IGNoYXIgKmNvbnN0IEdsb2JhbENvbmZpZ1RyYWl0czo6dGFnID0gImdsb2JhbENvbmZpZ3VyYXRpb24iOwotCi1jb25zdCBjaGFyIEdsb2JhbENvbmZpZ1RyYWl0czo6QXR0cmlidXRlczo6c3BlYWtlckRyY0VuYWJsZWRbXSA9ICJzcGVha2VyX2RyY19lbmFibGVkIjsKLQotCi1zdGF0dXNfdCBHbG9iYWxDb25maWdUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKmN1ciwgQXVkaW9Qb2xpY3lDb25maWcgJmNvbmZpZykKK3N0YXR1c190IEdsb2JhbENvbmZpZ1RyYWl0czo6ZGVzZXJpYWxpemUoY29uc3QgeG1sTm9kZSAqcm9vdCwgQXVkaW9Qb2xpY3lDb25maWcgKmNvbmZpZykKIHsKLSAgICBjb25zdCB4bWxOb2RlICpyb290ID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7Ci0gICAgd2hpbGUgKHJvb3QgIT0gTlVMTCkgewotICAgICAgICBpZiAoIXhtbFN0cmNtcChyb290LT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKXRhZykpIHsKLSAgICAgICAgICAgIHN0cmluZyBzcGVha2VyRHJjRW5hYmxlZCA9Ci0gICAgICAgICAgICAgICAgICAgIGdldFhtbEF0dHJpYnV0ZShyb290LCBBdHRyaWJ1dGVzOjpzcGVha2VyRHJjRW5hYmxlZCk7CisgICAgZm9yIChjb25zdCB4bWxOb2RlICpjdXIgPSByb290LT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCByZWludGVycHJldF9jYXN0PGNvbnN0IHhtbENoYXIqPih0YWcpKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgc3BlYWtlckRyY0VuYWJsZWQgPQorICAgICAgICAgICAgICAgICAgICBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzcGVha2VyRHJjRW5hYmxlZCk7CiAgICAgICAgICAgICBib29sIGlzU3BlYWtlckRyY0VuYWJsZWQ7CiAgICAgICAgICAgICBpZiAoIXNwZWFrZXJEcmNFbmFibGVkLmVtcHR5KCkgJiYKLSAgICAgICAgICAgICAgICAgICAgY29udmVydFRvPHN0cmluZywgYm9vbD4oc3BlYWtlckRyY0VuYWJsZWQsIGlzU3BlYWtlckRyY0VuYWJsZWQpKSB7Ci0gICAgICAgICAgICAgICAgY29uZmlnLnNldFNwZWFrZXJEcmNFbmFibGVkKGlzU3BlYWtlckRyY0VuYWJsZWQpOworICAgICAgICAgICAgICAgICAgICBjb252ZXJ0VG88c3RkOjpzdHJpbmcsIGJvb2w+KHNwZWFrZXJEcmNFbmFibGVkLCBpc1NwZWFrZXJEcmNFbmFibGVkKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+c2V0U3BlYWtlckRyY0VuYWJsZWQoaXNTcGVha2VyRHJjRW5hYmxlZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzdGQ6OnN0cmluZyBlbmdpbmVMaWJyYXJ5U3VmZml4ID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6ZW5naW5lTGlicmFyeVN1ZmZpeCk7CisgICAgICAgICAgICBpZiAoIWVuZ2luZUxpYnJhcnlTdWZmaXguZW1wdHkoKSkgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+c2V0RW5naW5lTGlicmFyeU5hbWVTdWZmaXgoZW5naW5lTGlicmFyeVN1ZmZpeCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gTk9fRVJST1I7CiAgICAgICAgIH0KLSAgICAgICAgcm9vdCA9IHJvb3QtPm5leHQ7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotCi1jb25zdCBjaGFyICpjb25zdCBWb2x1bWVUcmFpdHM6OnRhZyA9ICJ2b2x1bWUiOwotY29uc3QgY2hhciAqY29uc3QgVm9sdW1lVHJhaXRzOjpjb2xsZWN0aW9uVGFnID0gInZvbHVtZXMiOwotY29uc3QgY2hhciAqY29uc3QgVm9sdW1lVHJhaXRzOjp2b2x1bWVQb2ludFRhZyA9ICJwb2ludCI7Ci0KLWNvbnN0IGNoYXIgVm9sdW1lVHJhaXRzOjpBdHRyaWJ1dGVzOjpzdHJlYW1bXSA9ICJzdHJlYW0iOwotY29uc3QgY2hhciBWb2x1bWVUcmFpdHM6OkF0dHJpYnV0ZXM6OmRldmljZUNhdGVnb3J5W10gPSAiZGV2aWNlQ2F0ZWdvcnkiOwotY29uc3QgY2hhciBWb2x1bWVUcmFpdHM6OkF0dHJpYnV0ZXM6OnJlZmVyZW5jZVtdID0gInJlZiI7Ci0KLXN0YXR1c190IFZvbHVtZVRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgUHRyRWxlbWVudCAmZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKK3N0YXR1c190IFN1cnJvdW5kU291bmRUcmFpdHM6OmRlc2VyaWFsaXplKGNvbnN0IHhtbE5vZGUgKnJvb3QsIEF1ZGlvUG9saWN5Q29uZmlnICpjb25maWcpCiB7Ci0gICAgc3RyaW5nIHN0cmVhbVR5cGVMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OnN0cmVhbSk7Ci0gICAgaWYgKHN0cmVhbVR5cGVMaXRlcmFsLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6c3RyZWFtKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlOwotICAgIGlmICghU3RyZWFtVHlwZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhzdHJlYW1UeXBlTGl0ZXJhbCwgc3RyZWFtVHlwZSkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkICVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpzdHJlYW0pOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBzdHJpbmcgZGV2aWNlQ2F0ZWdvcnlMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmRldmljZUNhdGVnb3J5KTsKLSAgICBpZiAoZGV2aWNlQ2F0ZWdvcnlMaXRlcmFsLmVtcHR5KCkpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6ZGV2aWNlQ2F0ZWdvcnkpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnk7Ci0gICAgaWYgKCFEZXZpY2VDYXRlZ29yeUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhkZXZpY2VDYXRlZ29yeUxpdGVyYWwsIGRldmljZUNhdGVnb3J5KSkgewotICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXM9JXMiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OmRldmljZUNhdGVnb3J5LAotICAgICAgICAgICAgICBkZXZpY2VDYXRlZ29yeUxpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQorICAgIGNvbmZpZy0+c2V0RGVmYXVsdFN1cnJvdW5kRm9ybWF0cygpOwogCi0gICAgc3RyaW5nIHJlZmVyZW5jZU5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6cmVmZXJlbmNlKTsKLSAgICBjb25zdCBfeG1sTm9kZSAqcmVmID0gTlVMTDsKLSAgICBpZiAoIXJlZmVyZW5jZU5hbWUuZW1wdHkoKSkgewotICAgICAgICBnZXRSZWZlcmVuY2U8Vm9sdW1lVHJhaXRzPihyb290LT5wYXJlbnQsIHJlZiwgcmVmZXJlbmNlTmFtZSk7Ci0gICAgICAgIGlmIChyZWYgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBObyByZWZlcmVuY2UgUHRyIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgcmVmZXJlbmNlTmFtZS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBlbGVtZW50ID0gbmV3IEVsZW1lbnQoZGV2aWNlQ2F0ZWdvcnksIHN0cmVhbVR5cGUpOwotCi0gICAgY29uc3QgeG1sTm9kZSAqY2hpbGQgPSByZWZlcmVuY2VOYW1lLmVtcHR5KCkgPyByb290LT54bWxDaGlsZHJlbk5vZGUgOiByZWYtPnhtbENoaWxkcmVuTm9kZTsKLSAgICB3aGlsZSAoY2hpbGQgIT0gTlVMTCkgewotICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKil2b2x1bWVQb2ludFRhZykpIHsKLSAgICAgICAgICAgIHhtbENoYXIgKnBvaW50RGVmaW5pdGlvbiA9IHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSk7OwotICAgICAgICAgICAgaWYgKHBvaW50RGVmaW5pdGlvbiA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBmb3IgKGNvbnN0IHhtbE5vZGUgKmN1ciA9IHJvb3QtPnhtbENoaWxkcmVuTm9kZTsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhcio+KHRhZykpKSB7CisgICAgICAgICAgICBBdWRpb1BvbGljeUNvbmZpZzo6U3Vycm91bmRGb3JtYXRzIGZvcm1hdHM7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248U3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0cz4oCisgICAgICAgICAgICAgICAgICAgIGN1ciwgJmZvcm1hdHMsIG51bGxwdHIpOworICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGNvbmZpZy0+c2V0U3Vycm91bmRGb3JtYXRzKGZvcm1hdHMpOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoIiVzOiAlcz0lcyIsIF9fRlVOQ1RJT05fXywgdGFnLCAoY29uc3QgY2hhciopcG9pbnREZWZpbml0aW9uKTsKLSAgICAgICAgICAgIFZlY3RvcjxpbnQzMl90PiBwb2ludDsKLSAgICAgICAgICAgIGNvbGxlY3Rpb25Gcm9tU3RyaW5nPERlZmF1bHRUcmFpdHM8aW50MzJfdD4gPigoY29uc3QgY2hhciopcG9pbnREZWZpbml0aW9uLCBwb2ludCwgIiwiKTsKLSAgICAgICAgICAgIGlmIChwb2ludC5zaXplKCkgIT0gMikgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCAlczogJXMiLCBfX0ZVTkNUSU9OX18sIHZvbHVtZVBvaW50VGFnLAotICAgICAgICAgICAgICAgICAgICAgIChjb25zdCBjaGFyKilwb2ludERlZmluaXRpb24pOwotICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbGVtZW50LT5hZGQoQ3VydmVQb2ludChwb2ludFswXSwgcG9pbnRbMV0pKTsKLSAgICAgICAgICAgIHhtbEZyZWUocG9pbnREZWZpbml0aW9uKTsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgfQotICAgICAgICBjaGlsZCA9IGNoaWxkLT5uZXh0OwogICAgIH0KICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLVBvbGljeVNlcmlhbGl6ZXI6OlBvbGljeVNlcmlhbGl6ZXIoKSA6IG1Sb290RWxlbWVudE5hbWUocm9vdE5hbWUpCitSZXR1cm48U3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0czo6RWxlbWVudD4gU3Vycm91bmRTb3VuZEZvcm1hdFRyYWl0czo6ZGVzZXJpYWxpemUoCisgICAgICAgIGNvbnN0IHhtbE5vZGUgKmN1ciwgUHRyU2VyaWFsaXppbmdDdHggLypzZXJpYWxpemluZ0NvbnRleHQqLykKIHsKLSAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3NzOwotICAgIG9zcyA8PCBnTWFqb3IgPDwgIi4iIDw8IGdNaW5vcjsKLSAgICBtVmVyc2lvbiA9IG9zcy5zdHIoKTsKLSAgICBBTE9HVigiJXM6IFZlcnNpb249JXMgUm9vdD0lcyIsIF9fRlVOQ1RJT05fXywgbVZlcnNpb24uY19zdHIoKSwgbVJvb3RFbGVtZW50TmFtZS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyBmb3JtYXRMaXRlcmFsID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgaWYgKGZvcm1hdExpdGVyYWwuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vICVzIGZvdW5kIGZvciBhIHN1cnJvdW5kIGZvcm1hdCIsIF9fZnVuY19fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICAgICAgcmV0dXJuIFN0YXR1czo6ZnJvbVN0YXR1c1QoQkFEX1ZBTFVFKTsKKyAgICB9CisgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0ID0gZm9ybWF0RnJvbVN0cmluZyhmb3JtYXRMaXRlcmFsKTsKKyAgICBpZiAoZm9ybWF0ID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5yZWNvZ25pemVkIGZvcm1hdCAlcyIsIF9fZnVuY19fLCBmb3JtYXRMaXRlcmFsLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gU3RhdHVzOjpmcm9tU3RhdHVzVChCQURfVkFMVUUpOworICAgIH0KKyAgICBFbGVtZW50IHBhaXIgPSBzdGQ6Om1ha2VfcGFpcihmb3JtYXQsIENvbGxlY3Rpb246Om1hcHBlZF90eXBle30pOworCisgICAgc3RkOjpzdHJpbmcgc3ViZm9ybWF0c0xpdGVyYWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBBdHRyaWJ1dGVzOjpzdWJmb3JtYXRzKTsKKyAgICBpZiAoc3ViZm9ybWF0c0xpdGVyYWwuZW1wdHkoKSkgcmV0dXJuIHBhaXI7CisgICAgRm9ybWF0VmVjdG9yIHN1YmZvcm1hdHMgPSBmb3JtYXRzRnJvbVN0cmluZyhzdWJmb3JtYXRzTGl0ZXJhbCwgIiAiKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHN1YmZvcm1hdCA6IHN1YmZvcm1hdHMpIHsKKyAgICAgICAgYXV0byByZXN1bHQgPSBwYWlyLnNlY29uZC5pbnNlcnQoc3ViZm9ybWF0KTsKKyAgICAgICAgaWYgKCFyZXN1bHQuc2Vjb25kKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBhZGQgc3ViZm9ybWF0ICV4IHRvIGNvbGxlY3Rpb24iLCBfX2Z1bmNfXywgc3ViZm9ybWF0KTsKKyAgICAgICAgICAgIHJldHVybiBTdGF0dXM6OmZyb21TdGF0dXNUKEJBRF9WQUxVRSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHBhaXI7CiB9CiAKLXN0YXR1c190IFBvbGljeVNlcmlhbGl6ZXI6OmRlc2VyaWFsaXplKGNvbnN0IGNoYXIgKmNvbmZpZ0ZpbGUsIEF1ZGlvUG9saWN5Q29uZmlnICZjb25maWcpCitzdGF0dXNfdCBQb2xpY3lTZXJpYWxpemVyOjpkZXNlcmlhbGl6ZShjb25zdCBjaGFyICpjb25maWdGaWxlLCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQogewotICAgIHhtbERvY1B0ciBkb2M7Ci0gICAgZG9jID0geG1sUGFyc2VGaWxlKGNvbmZpZ0ZpbGUpOwotICAgIGlmIChkb2MgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZSAlcyBkb2N1bWVudC4iLCBfX0ZVTkNUSU9OX18sIGNvbmZpZ0ZpbGUpOworICAgIGF1dG8gZG9jID0gbWFrZV94bWxVbmlxdWUoeG1sUGFyc2VGaWxlKGNvbmZpZ0ZpbGUpKTsKKyAgICBpZiAoZG9jID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgcGFyc2UgJXMgZG9jdW1lbnQuIiwgX19mdW5jX18sIGNvbmZpZ0ZpbGUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICB4bWxOb2RlUHRyIGN1ciA9IHhtbERvY0dldFJvb3RFbGVtZW50KGRvYyk7Ci0gICAgaWYgKGN1ciA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlICVzIGRvY3VtZW50OiBlbXB0eS4iLCBfX0ZVTkNUSU9OX18sIGNvbmZpZ0ZpbGUpOwotICAgICAgICB4bWxGcmVlRG9jKGRvYyk7CisgICAgeG1sTm9kZVB0ciByb290ID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jLmdldCgpKTsKKyAgICBpZiAocm9vdCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlICVzIGRvY3VtZW50OiBlbXB0eS4iLCBfX2Z1bmNfXywgY29uZmlnRmlsZSk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGlmICh4bWxYSW5jbHVkZVByb2Nlc3MoZG9jKSA8IDApIHsKLSAgICAgICAgIEFMT0dFKCIlczogbGlieG1sIGZhaWxlZCB0byByZXNvbHZlIFhJbmNsdWRlcyBvbiAlcyBkb2N1bWVudC4iLCBfX0ZVTkNUSU9OX18sIGNvbmZpZ0ZpbGUpOworICAgIGlmICh4bWxYSW5jbHVkZVByb2Nlc3MoZG9jLmdldCgpKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBsaWJ4bWwgZmFpbGVkIHRvIHJlc29sdmUgWEluY2x1ZGVzIG9uICVzIGRvY3VtZW50LiIsIF9fZnVuY19fLCBjb25maWdGaWxlKTsKICAgICB9CiAKLSAgICBpZiAoeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikgbVJvb3RFbGVtZW50TmFtZS5jX3N0cigpKSkgIHsKLSAgICAgICAgQUxPR0UoIiVzOiBObyAlcyByb290IGVsZW1lbnQgZm91bmQgaW4geG1sIGRhdGEgJXMuIiwgX19GVU5DVElPTl9fLCBtUm9vdEVsZW1lbnROYW1lLmNfc3RyKCksCi0gICAgICAgICAgICAgIChjb25zdCBjaGFyICopY3VyLT5uYW1lKTsKLSAgICAgICAgeG1sRnJlZURvYyhkb2MpOworICAgIGlmICh4bWxTdHJjbXAocm9vdC0+bmFtZSwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB4bWxDaGFyKj4ocm9vdE5hbWUpKSkgIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyAlcyByb290IGVsZW1lbnQgZm91bmQgaW4geG1sIGRhdGEgJXMuIiwgX19mdW5jX18sIHJvb3ROYW1lLAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHJvb3QtPm5hbWUpKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzdHJpbmcgdmVyc2lvbiA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIHZlcnNpb25BdHRyaWJ1dGUpOworICAgIHN0ZDo6c3RyaW5nIHZlcnNpb24gPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgdmVyc2lvbkF0dHJpYnV0ZSk7CiAgICAgaWYgKHZlcnNpb24uZW1wdHkoKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5vIHZlcnNpb24gZm91bmQgaW4gcm9vdCBub2RlICVzIiwgX19GVU5DVElPTl9fLCBtUm9vdEVsZW1lbnROYW1lLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiJXM6IE5vIHZlcnNpb24gZm91bmQgaW4gcm9vdCBub2RlICVzIiwgX19mdW5jX18sIHJvb3ROYW1lKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgaWYgKHZlcnNpb24gIT0gbVZlcnNpb24pIHsKLSAgICAgICAgQUxPR0UoIiVzOiBWZXJzaW9uIGRvZXMgbm90IG1hdGNoOyBleHBlY3QgJXMgZ290ICVzIiwgX19GVU5DVElPTl9fLCBtVmVyc2lvbi5jX3N0cigpLAorICAgICAgICBBTE9HRSgiJXM6IFZlcnNpb24gZG9lcyBub3QgbWF0Y2g7IGV4cGVjdCAlcyBnb3QgJXMiLCBfX2Z1bmNfXywgbVZlcnNpb24uY19zdHIoKSwKICAgICAgICAgICAgICAgdmVyc2lvbi5jX3N0cigpKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gTGV0cyBkZXNlcmlhbGl6ZSBjaGlsZHJlbgogICAgIC8vIE1vZHVsZXMKICAgICBNb2R1bGVUcmFpdHM6OkNvbGxlY3Rpb24gbW9kdWxlczsKLSAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248TW9kdWxlVHJhaXRzPihkb2MsIGN1ciwgbW9kdWxlcywgJmNvbmZpZyk7Ci0gICAgY29uZmlnLnNldEh3TW9kdWxlcyhtb2R1bGVzKTsKLQotICAgIC8vIGRlc2VyaWFsaXplIHZvbHVtZSBzZWN0aW9uCi0gICAgVm9sdW1lVHJhaXRzOjpDb2xsZWN0aW9uIHZvbHVtZXM7Ci0gICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPFZvbHVtZVRyYWl0cz4oZG9jLCBjdXIsIHZvbHVtZXMsICZjb25maWcpOwotICAgIGNvbmZpZy5zZXRWb2x1bWVzKHZvbHVtZXMpOworICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQ29sbGVjdGlvbjxNb2R1bGVUcmFpdHM+KHJvb3QsICZtb2R1bGVzLCBjb25maWcpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgY29uZmlnLT5zZXRId01vZHVsZXMobW9kdWxlcyk7CiAKICAgICAvLyBHbG9iYWwgQ29uZmlndXJhdGlvbgotICAgIEdsb2JhbENvbmZpZ1RyYWl0czo6ZGVzZXJpYWxpemUoY3VyLCBjb25maWcpOworICAgIEdsb2JhbENvbmZpZ1RyYWl0czo6ZGVzZXJpYWxpemUocm9vdCwgY29uZmlnKTsKIAotICAgIHhtbEZyZWVEb2MoZG9jKTsKKyAgICAvLyBTdXJyb3VuZCBjb25maWd1cmF0aW9uCisgICAgU3Vycm91bmRTb3VuZFRyYWl0czo6ZGVzZXJpYWxpemUocm9vdCwgY29uZmlnKTsKKwogICAgIHJldHVybiBhbmRyb2lkOjpPSzsKIH0KIAorfSAgLy8gbmFtZXNwYWNlCisKK3N0YXR1c190IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lGaWxlKGNvbnN0IGNoYXIgKmZpbGVOYW1lLCBBdWRpb1BvbGljeUNvbmZpZyAqY29uZmlnKQoreworICAgIFBvbGljeVNlcmlhbGl6ZXIgc2VyaWFsaXplcjsKKyAgICByZXR1cm4gc2VyaWFsaXplci5kZXNlcmlhbGl6ZShmaWxlTmFtZSwgY29uZmlnKTsKK30KKwogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2Vzc2lvblJvdXRlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1Nlc3Npb25Sb3V0ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyMDY1MjYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU2Vzc2lvblJvdXRlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEzOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE1fU2Vzc2lvblJvdXRlIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0jaW5jbHVkZSAiU2Vzc2lvblJvdXRlLmgiCi0jaW5jbHVkZSAiSHdNb2R1bGUuaCIKLSNpbmNsdWRlICJBdWRpb0dhaW4uaCIKLSNpbmNsdWRlICJEZXZpY2VEZXNjcmlwdG9yLmgiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotLy8gLS0tIFNlc3Npb25Sb3V0ZSBjbGFzcyBpbXBsZW1lbnRhdGlvbgotdm9pZCBTZXNzaW9uUm91dGU6OmxvZyhjb25zdCBjaGFyKiBwcmVmaXgpCi17Ci0gICAgQUxPR0koIiVzW1Nlc3Npb25Sb3V0ZSBzdHJtOjB4JVgsIHNyYzolZCwgc2VzczoweCVYLCBkZXY6MHglWCByZWZzOiVkIGFjdDolZCIsCi0gICAgICAgICAgcHJlZml4LCBtU3RyZWFtVHlwZSwgbVNvdXJjZSwgbVNlc3Npb24sCi0gICAgICAgICAgbURldmljZURlc2NyaXB0b3IgIT0gMCA/IG1EZXZpY2VEZXNjcmlwdG9yLT50eXBlKCkgOiBBVURJT19ERVZJQ0VfTk9ORSwKLSAgICAgICAgICBtUmVmQ291bnQsIG1BY3Rpdml0eUNvdW50KTsKLX0KLQotLy8gLS0tIFNlc3Npb25Sb3V0ZU1hcCBjbGFzcyBpbXBsZW1lbnRhdGlvbgotYm9vbCBTZXNzaW9uUm91dGVNYXA6Omhhc1JvdXRlKGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIHJldHVybiBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgJiYgdmFsdWVGb3Ioc2Vzc2lvbiktPm1EZXZpY2VEZXNjcmlwdG9yICE9IDA7Ci19Ci0KLWJvb2wgU2Vzc2lvblJvdXRlTWFwOjpnZXRBbmRDbGVhclJvdXRlQ2hhbmdlZChhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICBpZiAoaW5kZXhPZktleShzZXNzaW9uKSA+PSAwKSB7Ci0gICAgICAgIGlmICh2YWx1ZUZvcihzZXNzaW9uKS0+bUNoYW5nZWQpIHsKLSAgICAgICAgICAgIHZhbHVlRm9yKHNlc3Npb24pLT5tQ2hhbmdlZCA9IGZhbHNlOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi12b2lkIFNlc3Npb25Sb3V0ZU1hcDo6cmVtb3ZlUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCi17Ci0gICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCA/IHZhbHVlRm9yKHNlc3Npb24pIDogMDsKLSAgICBpZiAocm91dGUgIT0gMCkgewotICAgICAgICBBTE9HX0FTU0VSVChyb3V0ZS0+bVJlZkNvdW50ID4gMCk7Ci0gICAgICAgIC0tcm91dGUtPm1SZWZDb3VudDsKLSAgICAgICAgaWYgKHJvdXRlLT5tUmVmQ291bnQgPD0gMCkgewotICAgICAgICAgICAgcmVtb3ZlSXRlbShzZXNzaW9uKTsKLSAgICAgICAgfQotICAgIH0KLX0KLQotaW50IFNlc3Npb25Sb3V0ZU1hcDo6aW5jUm91dGVBY3Rpdml0eShhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKLXsKLSAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gaW5kZXhPZktleShzZXNzaW9uKSA+PSAwID8gdmFsdWVGb3Ioc2Vzc2lvbikgOiAwOwotICAgIHJldHVybiByb3V0ZSAhPSAwID8gKysocm91dGUtPm1BY3Rpdml0eUNvdW50KSA6IC0xOwotfQotCi1pbnQgU2Vzc2lvblJvdXRlTWFwOjpkZWNSb3V0ZUFjdGl2aXR5KGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQotewotICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBpbmRleE9mS2V5KHNlc3Npb24pID49IDAgPyB2YWx1ZUZvcihzZXNzaW9uKSA6IDA7Ci0gICAgaWYgKHJvdXRlICE9IDAgJiYgcm91dGUtPm1BY3Rpdml0eUNvdW50ID4gMCkgewotICAgICAgICByZXR1cm4gLS0ocm91dGUtPm1BY3Rpdml0eUNvdW50KTsKLSAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotfQotCi12b2lkIFNlc3Npb25Sb3V0ZU1hcDo6bG9nKGNvbnN0IGNoYXIqIGNhcHRpb24pCi17Ci0gICAgQUxPR0koIiVzIC0tLS0iLCBjYXB0aW9uKTsKLSAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZSgpOyBpbmRleCsrKSB7Ci0gICAgICAgIHZhbHVlQXQoaW5kZXgpLT5sb2coIiAgIik7Ci0gICAgfQotfQotCi12b2lkIFNlc3Npb25Sb3V0ZU1hcDo6YWRkUm91dGUoYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCi17Ci0gICAgaWYgKG1NYXBUeXBlID09IE1BUFRZUEVfSU5QVVQgJiYgc3RyZWFtVHlwZSAhPSBTZXNzaW9uUm91dGU6OlNUUkVBTV9UWVBFX05BKSB7Ci0gICAgICAgIEFMT0dFKCJBZGRpbmcgT3V0cHV0IFJvdXRlIHRvIElucHV0Um91dGVNYXAiKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAobU1hcFR5cGUgPT0gTUFQVFlQRV9PVVRQVVQgJiYgc291cmNlICE9IFNlc3Npb25Sb3V0ZTo6U09VUkNFX1RZUEVfTkEpIHsKLSAgICAgICAgQUxPR0UoIkFkZGluZyBJbnB1dCBSb3V0ZSB0byBPdXRwdXRSb3V0ZU1hcCIpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IGluZGV4T2ZLZXkoc2Vzc2lvbikgPj0gMCA/IHZhbHVlRm9yKHNlc3Npb24pIDogMDsKLQotICAgIGlmIChyb3V0ZSAhPSAwKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yICE9IDAgfHwgcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yICE9IDApIHsKLSAgICAgICAgICAgIHJvdXRlLT5tQ2hhbmdlZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcm91dGUtPm1SZWZDb3VudCsrOwotICAgICAgICByb3V0ZS0+bURldmljZURlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIHJvdXRlID0gbmV3IFNlc3Npb25Sb3V0ZShzZXNzaW9uLCBzdHJlYW1UeXBlLCBzb3VyY2UsIGRlc2NyaXB0b3IsIHVpZCk7Ci0gICAgICAgIHJvdXRlLT5tUmVmQ291bnQrKzsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gMCkgewotICAgICAgICAgICAgcm91dGUtPm1DaGFuZ2VkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBhZGQoc2Vzc2lvbiwgcm91dGUpOwotICAgIH0KLX0KLQotYXVkaW9fZGV2aWNlc190IFNlc3Npb25Sb3V0ZU1hcDo6Z2V0QWN0aXZlRGV2aWNlRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGF2YWlsYWJsZURldmljZXMpCi17Ci0gICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHNpemUoKTsgaW5kZXgrKykgewotICAgICAgICBzcDxTZXNzaW9uUm91dGU+IHJvdXRlID0gdmFsdWVBdChpbmRleCk7Ci0gICAgICAgIGlmIChzdHJlYW1UeXBlID09IHJvdXRlLT5tU3RyZWFtVHlwZSAmJiByb3V0ZS0+aXNBY3RpdmVPckNoYW5nZWQoKQotICAgICAgICAgICAgICAgICYmIHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvciAhPSAwKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gcm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yLT50eXBlKCk7Ci0gICAgICAgICAgICBpZiAoIWF2YWlsYWJsZURldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSkuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRldmljZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQVVESU9fREVWSUNFX05PTkU7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1N0cmVhbURlc2NyaXB0b3IuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU3RyZWFtRGVzY3JpcHRvci5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1NjQ5ZmIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvU3RyZWFtRGVzY3JpcHRvci5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiQVBNOjpWb2x1bWVzIgotLy8jZGVmaW5lIExPR19OREVCVUcgMAotCi0vLyNkZWZpbmUgVkVSWV9WRVJCT1NFX0xPR0dJTkcKLSNpZmRlZiBWRVJZX1ZFUkJPU0VfTE9HR0lORwotI2RlZmluZSBBTE9HVlYgQUxPR1YKLSNlbHNlCi0jZGVmaW5lIEFMT0dWVihhLi4uKSBkbyB7IH0gd2hpbGUoMCkKLSNlbmRpZgotCi0jaW5jbHVkZSAiU3RyZWFtRGVzY3JpcHRvci5oIgotI2luY2x1ZGUgIkdhaW5zLmgiCi0jaW5jbHVkZSAicG9saWN5LmgiCi0jaW5jbHVkZSA8dXRpbHMvTG9nLmg+Ci0jaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8vIC0tLSBTdHJlYW1EZXNjcmlwdG9yIGNsYXNzIGltcGxlbWVudGF0aW9uCi0KLVN0cmVhbURlc2NyaXB0b3I6OlN0cmVhbURlc2NyaXB0b3IoKQotICAgIDogICBtSW5kZXhNaW4oMCksIG1JbmRleE1heCgxKSwgbUNhbkJlTXV0ZWQodHJ1ZSkKLXsKLSAgICAvLyBJbml0aWFsaXplIHRoZSBjdXJyZW50IHN0cmVhbSdzIGluZGV4IHRvIG1JbmRleE1heCBzbyB2b2x1bWUgaXNuJ3QgMCBpbgotICAgIC8vIGNhc2VzIHdoZXJlIHRoZSBKYXZhIGxheWVyIGRvZXNuJ3QgY2FsbCBpbnRvIHRoZSBhdWRpbyBwb2xpY3kgc2VydmljZSB0bwotICAgIC8vIHNldCB0aGUgZGVmYXVsdCB2b2x1bWUuCi0gICAgbUluZGV4Q3VyLmFkZChBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSwgbUluZGV4TWF4KTsKLX0KLQotaW50IFN0cmVhbURlc2NyaXB0b3I6OmdldFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0Ci17Ci0gICAgZGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKTsKLSAgICAvLyB0aGVyZSBpcyBhbHdheXMgYSB2YWxpZCBlbnRyeSBmb3IgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUKLSAgICBpZiAobUluZGV4Q3VyLmluZGV4T2ZLZXkoZGV2aWNlKSA8IDApIHsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUU7Ci0gICAgfQotICAgIHJldHVybiBtSW5kZXhDdXIudmFsdWVGb3IoZGV2aWNlKTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yOjpjbGVhckN1cnJlbnRWb2x1bWVJbmRleCgpCi17Ci0gICAgbUluZGV4Q3VyLmNsZWFyKCk7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6YWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCkKLXsKLSAgICBtSW5kZXhDdXIuYWRkKGRldmljZSwgaW5kZXgpOwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3I6OnNldFZvbHVtZUluZGV4TWluKGludCB2b2xJbmRleE1pbikKLXsKLSAgICBtSW5kZXhNaW4gPSB2b2xJbmRleE1pbjsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yOjpzZXRWb2x1bWVJbmRleE1heChpbnQgdm9sSW5kZXhNYXgpCi17Ci0gICAgbUluZGV4TWF4ID0gdm9sSW5kZXhNYXg7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvcjo6c2V0Vm9sdW1lQ3VydmVQb2ludChkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqcG9pbnQpCi17Ci0gICAgbVZvbHVtZUN1cnZlW2RldmljZUNhdGVnb3J5XSA9IHBvaW50OwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3I6OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotICAgIFN0cmluZzggcmVzdWx0OwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMgICAgICAgICAlMDJkICAgICAgICAgJTAyZCAgICAgICAgICIsCi0gICAgICAgICAgICAgbUNhbkJlTXV0ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwgbUluZGV4TWluLCBtSW5kZXhNYXgpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbmRleEN1ci5zaXplKCk7IGkrKykgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlMDR4IDogJTAyZCwgIiwKLSAgICAgICAgICAgICAgICAgbUluZGV4Q3VyLmtleUF0KGkpLAotICAgICAgICAgICAgICAgICBtSW5kZXhDdXIudmFsdWVBdChpKSk7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZCgiXG4iKTsKLQotICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotfQotCi1TdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6U3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24oKQotewotICAgIGZvciAoc2l6ZV90IHN0cmVhbSA9IDAgOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fQ05UOyBzdHJlYW0rKykgewotICAgICAgICBhZGQoc3RhdGljX2Nhc3Q8YXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyZWFtKSwgU3RyZWFtRGVzY3JpcHRvcigpKTsKLSAgICB9Ci19Ci0KLWJvb2wgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmNhbkJlTXV0ZWQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgcmV0dXJuIHZhbHVlQXQoc3RyZWFtKS5jYW5CZU11dGVkKCk7Ci19Ci0KLXZvaWQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmNsZWFyQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIGVkaXRWYWx1ZUF0KHN0cmVhbSkuY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoKTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6YWRkQ3VycmVudFZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGludCBpbmRleCkKLXsKLSAgICBlZGl0VmFsdWVBdChzdHJlYW0pLmFkZEN1cnJlbnRWb2x1bWVJbmRleChkZXZpY2UsIGluZGV4KTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0Vm9sdW1lQ3VydmVQb2ludChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWb2x1bWVDdXJ2ZVBvaW50ICpwb2ludCkKLXsKLSAgICBlZGl0VmFsdWVBdChzdHJlYW0pLnNldFZvbHVtZUN1cnZlUG9pbnQoZGV2aWNlQ2F0ZWdvcnksIHBvaW50KTsKLX0KLQotY29uc3QgVm9sdW1lQ3VydmVQb2ludCAqU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmdldFZvbHVtZUN1cnZlUG9pbnQoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIHZhbHVlQXQoc3RyZWFtKS5nZXRWb2x1bWVDdXJ2ZVBvaW50KGRldmljZUNhdGVnb3J5KTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0Vm9sdW1lSW5kZXhNaW4oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0saW50IHZvbEluZGV4TWluKQotewotICAgIHJldHVybiBlZGl0VmFsdWVBdChzdHJlYW0pLnNldFZvbHVtZUluZGV4TWluKHZvbEluZGV4TWluKTsKLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c2V0Vm9sdW1lSW5kZXhNYXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0saW50IHZvbEluZGV4TWF4KQotewotICAgIHJldHVybiBlZGl0VmFsdWVBdChzdHJlYW0pLnNldFZvbHVtZUluZGV4TWF4KHZvbEluZGV4TWF4KTsKLX0KLQotZmxvYXQgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OnZvbEluZGV4VG9EYihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgZGV2aWNlX2NhdGVnb3J5IGNhdGVnb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhJblVpKSBjb25zdAotewotICAgIGNvbnN0IFN0cmVhbURlc2NyaXB0b3IgJnN0cmVhbURlc2MgPSB2YWx1ZUF0KHN0cmVhbSk7Ci0gICAgcmV0dXJuIEdhaW5zOjp2b2xJbmRleFRvRGIoc3RyZWFtRGVzYy5nZXRWb2x1bWVDdXJ2ZVBvaW50KGNhdGVnb3J5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1EZXNjLmdldFZvbHVtZUluZGV4TWluKCksIHN0cmVhbURlc2MuZ2V0Vm9sdW1lSW5kZXhNYXgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleEluVWkpOwotfQotCi1zdGF0dXNfdCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1pbiwgaW50IGluZGV4TWF4KQotewotICAgIEFMT0dWKCJpbml0U3RyZWFtVm9sdW1lKCkgc3RyZWFtICVkLCBtaW4gJWQsIG1heCAlZCIsIHN0cmVhbSAsIGluZGV4TWluLCBpbmRleE1heCk7Ci0gICAgaWYgKGluZGV4TWluIDwgMCB8fCBpbmRleE1pbiA+PSBpbmRleE1heCkgewotICAgICAgICBBTE9HVygiaW5pdFN0cmVhbVZvbHVtZSgpIGludmFsaWQgaW5kZXggbGltaXRzIGZvciBzdHJlYW0gJWQsIG1pbiAlZCwgbWF4ICVkIiwKLSAgICAgICAgICAgICAgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgc2V0Vm9sdW1lSW5kZXhNaW4oc3RyZWFtLCBpbmRleE1pbik7Ci0gICAgc2V0Vm9sdW1lSW5kZXhNYXgoc3RyZWFtLCBpbmRleE1heCk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi12b2lkIFN0cmVhbURlc2NyaXB0b3JDb2xsZWN0aW9uOjppbml0aWFsaXplVm9sdW1lQ3VydmVzKGJvb2wgaXNTcGVha2VyRHJjRW5hYmxlZCkKLXsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1NUUkVBTV9DTlQ7IGkrKykgewotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IERFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgewotICAgICAgICAgICAgc2V0Vm9sdW1lQ3VydmVQb2ludChzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90PihpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZGV2aWNlX2NhdGVnb3J5PihqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNWb2x1bWVQcm9maWxlc1tpXVtqXSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBDaGVjayBhdmFpbGFiaWxpdHkgb2YgRFJDIG9uIHNwZWFrZXIgcGF0aDogaWYgYXZhaWxhYmxlLCBvdmVycmlkZSBzb21lIG9mIHRoZSBzcGVha2VyIGN1cnZlcwotICAgIGlmIChpc1NwZWFrZXJEcmNFbmFibGVkKSB7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX1NZU1RFTSwgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNEZWZhdWx0U3lzdGVtVm9sdW1lQ3VydmVEcmMpOwotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9SSU5HLCBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyYyk7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX0FMQVJNLCBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1NwZWFrZXJTb25pZmljYXRpb25Wb2x1bWVDdXJ2ZURyYyk7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiwgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyU29uaWZpY2F0aW9uVm9sdW1lQ3VydmVEcmMpOwotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KEFVRElPX1NUUkVBTV9NVVNJQywgREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2FpbnM6OnNTcGVha2VyTWVkaWFWb2x1bWVDdXJ2ZURyYyk7Ci0gICAgICAgIHNldFZvbHVtZUN1cnZlUG9pbnQoQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFksIERFVklDRV9DQVRFR09SWV9TUEVBS0VSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdhaW5zOjpzU3BlYWtlck1lZGlhVm9sdW1lQ3VydmVEcmMpOwotICAgIH0KLX0KLQotdm9pZCBTdHJlYW1EZXNjcmlwdG9yQ29sbGVjdGlvbjo6c3dpdGNoVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1TcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbURzdCkKLXsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IERFVklDRV9DQVRFR09SWV9DTlQ7IGorKykgewotICAgICAgICBzZXRWb2x1bWVDdXJ2ZVBvaW50KHN0cmVhbURzdCwgc3RhdGljX2Nhc3Q8ZGV2aWNlX2NhdGVnb3J5PihqKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHYWluczo6c1ZvbHVtZVByb2ZpbGVzW3N0cmVhbVNyY11bal0pOwotICAgIH0KLX0KLQotc3RhdHVzX3QgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5TdHJlYW1zIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAotICAgICAgICAgICAgICIgU3RyZWFtICBDYW4gYmUgbXV0ZWQgIEluZGV4IE1pbiAgSW5kZXggTWF4ICBJbmRleCBDdXIgW2RldmljZSA6IGluZGV4XS4uLlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMnp1ICAgICAgIiwgaSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS5kdW1wKGZkKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbW1vbi9tYW5hZ2VyZGVmaW5pdGlvbnMvc3JjL1R5cGVDb252ZXJ0ZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVHlwZUNvbnZlcnRlci5jcHAKaW5kZXggNmY0OGVhZS4uMmI1NDU1ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVHlwZUNvbnZlcnRlci5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVHlwZUNvbnZlcnRlci5jcHAKQEAgLTQ1LDEzICs0NSwxMyBAQAogY29uc3QgUm91dGVGbGFnVHlwZUNvbnZlcnRlcjo6VGFibGUgUm91dGVGbGFnVHlwZUNvbnZlcnRlcjo6bVRhYmxlW10gPSB7CiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKE1JWF9ST1VURV9GTEFHX1JFTkRFUiksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSyksCisgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDS19BTkRfUkVOREVSKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oTUlYX1JPVVRFX0ZMQUdfQUxMKSwKICAgICBURVJNSU5BVE9SCiB9OwogCiB0ZW1wbGF0ZSA8PgogY29uc3QgUnVsZVR5cGVDb252ZXJ0ZXI6OlRhYmxlIFJ1bGVUeXBlQ29udmVydGVyOjptVGFibGVbXSA9IHsKLSAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oUlVMRV9FWENMVVNJT05fTUFTSyksCiAgICAgTUFLRV9TVFJJTkdfRlJPTV9FTlVNKFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFKSwKICAgICBNQUtFX1NUUklOR19GUk9NX0VOVU0oUlVMRV9NQVRDSF9BVFRSSUJVVEVfQ0FQVFVSRV9QUkVTRVQpLAogICAgIE1BS0VfU1RSSU5HX0ZST01fRU5VTShSVUxFX01BVENIX1VJRCksCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vbWFuYWdlcmRlZmluaXRpb25zL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjM2YxYmMuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL21hbmFnZXJkZWZpbml0aW9ucy9zcmMvVm9sdW1lQ3VydmUuY3BwCisrKyAvZGV2L251bGwKQEAgLTEsMTQ4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jZGVmaW5lIExPR19UQUcgIkFQTTo6Vm9sdW1lQ3VydmUiCi0vLyNkZWZpbmUgTE9HX05ERUJVRyAwCi0KLSNpbmNsdWRlICJWb2x1bWVDdXJ2ZS5oIgotI2luY2x1ZGUgIlR5cGVDb252ZXJ0ZXIuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQgewotCi1mbG9hdCBWb2x1bWVDdXJ2ZTo6dm9sSW5kZXhUb0RiKGludCBpbmRleEluVWksIGludCB2b2xJbmRleE1pbiwgaW50IHZvbEluZGV4TWF4KSBjb25zdAotewotICAgIEFMT0dfQVNTRVJUKCFtQ3VydmVQb2ludHMuaXNFbXB0eSgpLCAiSW52YWxpZCB2b2x1bWUgY3VydmUiKTsKLQotICAgIHNpemVfdCBuYkN1cnZlUG9pbnRzID0gbUN1cnZlUG9pbnRzLnNpemUoKTsKLSAgICAvLyB0aGUgdm9sdW1lIGluZGV4IGluIHRoZSBVSSBpcyByZWxhdGl2ZSB0byB0aGUgbWluIGFuZCBtYXggdm9sdW1lIGluZGljZXMgZm9yIHRoaXMgc3RyZWFtCi0gICAgaW50IG5iU3RlcHMgPSAxICsgbUN1cnZlUG9pbnRzW25iQ3VydmVQb2ludHMgLSAxXS5tSW5kZXggLSBtQ3VydmVQb2ludHNbMF0ubUluZGV4OwotICAgIGlmIChpbmRleEluVWkgPCB2b2xJbmRleE1pbikgewotICAgICAgICBBTE9HVigiVk9MVU1FIHJlbWFwcGluZyBpbmRleCBmcm9tICVkIHRvIG1pbiBpbmRleCAlZCIsIGluZGV4SW5VaSwgdm9sSW5kZXhNaW4pOwotICAgICAgICBpbmRleEluVWkgPSB2b2xJbmRleE1pbjsKLSAgICB9IGVsc2UgaWYgKGluZGV4SW5VaSA+IHZvbEluZGV4TWF4KSB7Ci0gICAgICAgIEFMT0dWKCJWT0xVTUUgcmVtYXBwaW5nIGluZGV4IGZyb20gJWQgdG8gbWF4IGluZGV4ICVkIiwgaW5kZXhJblVpLCB2b2xJbmRleE1heCk7Ci0gICAgICAgIGluZGV4SW5VaSA9IHZvbEluZGV4TWF4OwotICAgIH0KLSAgICBpbnQgdm9sSWR4ID0gKG5iU3RlcHMgKiAoaW5kZXhJblVpIC0gdm9sSW5kZXhNaW4pKSAvICh2b2xJbmRleE1heCAtIHZvbEluZGV4TWluKTsKLQotICAgIC8vIFdoZXJlIHdvdWxkIHRoaXMgdm9sdW1lIGluZGV4IGJlZW4gaW5zZXJ0ZWQgaW4gdGhlIGN1cnZlIHBvaW50Ci0gICAgc2l6ZV90IGluZGV4SW5VaVBvc2l0aW9uID0gbUN1cnZlUG9pbnRzLm9yZGVyT2YoQ3VydmVQb2ludCh2b2xJZHgsIDApKTsKLSAgICBpZiAoaW5kZXhJblVpUG9zaXRpb24gPj0gbmJDdXJ2ZVBvaW50cykgewotICAgICAgICAvL3VzZSBsYXN0IHBvaW50IG9mIHRhYmxlCi0gICAgICAgIHJldHVybiBtQ3VydmVQb2ludHNbbmJDdXJ2ZVBvaW50cyAtIDFdLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGY7Ci0gICAgfQotICAgIGlmIChpbmRleEluVWlQb3NpdGlvbiA9PSAwKSB7Ci0gICAgICAgIGlmIChpbmRleEluVWlQb3NpdGlvbiAhPSBtQ3VydmVQb2ludHNbMF0ubUluZGV4KSB7Ci0gICAgICAgICAgICByZXR1cm4gVk9MVU1FX01JTl9EQjsgLy8gb3V0IG9mIGJvdW5kcwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBtQ3VydmVQb2ludHNbMF0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZjsKLSAgICB9Ci0gICAgLy8gbGluZWFyIGludGVycG9sYXRpb24gaW4gdGhlIGF0dGVudWF0aW9uIHRhYmxlIGluIGRCCi0gICAgZmxvYXQgZGVjaWJlbHMgPSAobUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZikgKwotICAgICAgICAgICAgKChmbG9hdCkodm9sSWR4IC0gbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUluZGV4KSkgKgotICAgICAgICAgICAgICAgICggKChtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb25dLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGYpIC0KLSAgICAgICAgICAgICAgICAgICAgICAgIChtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb24gLSAxXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmKSkgLwotICAgICAgICAgICAgICAgICAgICAoKGZsb2F0KShtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb25dLm1JbmRleCAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUluZGV4KSkgKTsKLQotICAgIEFMT0dWKCJWT0xVTUUgbURldmljZUNhdGVnb3J5ICVkLCBtU3RyZWFtVHlwZSAlZCB2b2wgaW5kZXg9WyVkICVkICVkXSwgZEI9WyUuMWYgJS4xZiAlLjFmXSIsCi0gICAgICAgICAgICBtRGV2aWNlQ2F0ZWdvcnksIG1TdHJlYW1UeXBlLAotICAgICAgICAgICAgbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUluZGV4LCB2b2xJZHgsCi0gICAgICAgICAgICBtQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb25dLm1JbmRleCwKLSAgICAgICAgICAgICgoZmxvYXQpbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZiksIGRlY2liZWxzLAotICAgICAgICAgICAgKChmbG9hdCltQ3VydmVQb2ludHNbaW5kZXhJblVpUG9zaXRpb25dLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGYpKTsKLQotICAgIHJldHVybiBkZWNpYmVsczsKLX0KLQotdm9pZCBWb2x1bWVDdXJ2ZTo6ZHVtcChpbnQgZmQpIGNvbnN0Ci17Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07Ci0gICAgU3RyaW5nOCByZXN1bHQ7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIHsiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ3VydmVQb2ludHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiKCUzZCwgJTVkKSIsCi0gICAgICAgICAgICAgICAgIG1DdXJ2ZVBvaW50c1tpXS5tSW5kZXgsIG1DdXJ2ZVBvaW50c1tpXS5tQXR0ZW51YXRpb25Jbk1iKTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICByZXN1bHQuYXBwZW5kKGkgPT0gKG1DdXJ2ZVBvaW50cy5zaXplKCkgLSAxKSA/ICIgfVxuIiA6ICIsICIpOwotICAgIH0KLSAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKLX0KLQotdm9pZCBWb2x1bWVDdXJ2ZXNGb3JTdHJlYW06OmR1bXAoaW50IGZkLCBpbnQgc3BhY2VzID0gMCwgYm9vbCBjdXJ2ZVBvaW50cykgY29uc3QKLXsKLSAgICBjb25zdCBzaXplX3QgU0laRSA9IDI1NjsKLSAgICBjaGFyIGJ1ZmZlcltTSVpFXTsKLSAgICBTdHJpbmc4IHJlc3VsdDsKLQotICAgIGlmICghY3VydmVQb2ludHMpIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJXMgICAgICAgICAlMDJkICAgICAgICAgJTAyZCAgICAgICAgICIsCi0gICAgICAgICAgICAgICAgIG1DYW5CZU11dGVkID8gInRydWUgIiA6ICJmYWxzZSIsIG1JbmRleE1pbiwgbUluZGV4TWF4KTsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbmRleEN1ci5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiJTA0eCA6ICUwMmQsICIsIG1JbmRleEN1ci5rZXlBdChpKSwgbUluZGV4Q3VyLnZhbHVlQXQoaSkpOwotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzdGQ6OnN0cmluZyBkZXZpY2VDYXRMaXRlcmFsOwotICAgICAgICBEZXZpY2VDYXRlZ29yeUNvbnZlcnRlcjo6dG9TdHJpbmcoa2V5QXQoaSksIGRldmljZUNhdExpdGVyYWwpOwotICAgICAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIlKnMgJXMgOiIsCi0gICAgICAgICAgICAgICAgIHNwYWNlcywgIiIsIGRldmljZUNhdExpdGVyYWwuY19zdHIoKSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChmZCk7Ci0gICAgfQotICAgIHJlc3VsdC5hcHBlbmQoIlxuIik7Ci0gICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7Ci19Ci0KLXN0YXR1c190IFZvbHVtZUN1cnZlc0NvbGxlY3Rpb246OmR1bXAoaW50IGZkKSBjb25zdAotewotICAgIGNvbnN0IHNpemVfdCBTSVpFID0gMjU2OwotICAgIGNoYXIgYnVmZmVyW1NJWkVdOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5TdHJlYW1zIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAotICAgICAgICAgICAgICIgU3RyZWFtICBDYW4gYmUgbXV0ZWQgIEluZGV4IE1pbiAgSW5kZXggTWF4ICBJbmRleCBDdXIgW2RldmljZSA6IGluZGV4XS4uLlxuIik7Ci0gICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICUwMnp1ICAgICAgIiwgaSk7Ci0gICAgICAgIHdyaXRlKGZkLCBidWZmZXIsIHN0cmxlbihidWZmZXIpKTsKLSAgICAgICAgdmFsdWVBdChpKS5kdW1wKGZkKTsKLSAgICB9Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiXG5Wb2x1bWUgQ3VydmVzIGZvciBVc2UgQ2FzZXMgKGFrYSBTdHJlYW0gdHlwZXMpIGR1bXA6XG4iKTsKLSAgICB3cml0ZShmZCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSk7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzaXplKCk7IGkrKykgewotICAgICAgICBzdGQ6OnN0cmluZyBzdHJlYW1UeXBlTGl0ZXJhbDsKLSAgICAgICAgU3RyZWFtVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcoa2V5QXQoaSksIHN0cmVhbVR5cGVMaXRlcmFsKTsKLSAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLAotICAgICAgICAgICAgICAgICAiICVzICglMDJ6dSk6IEN1cnZlIHBvaW50cyBmb3IgZGV2aWNlIGNhdGVnb3J5IChpbmRleCwgYXR0ZW51YXRpb24gaW4gbWlsbGliZWwpXG4iLAotICAgICAgICAgICAgICAgICBzdHJlYW1UeXBlTGl0ZXJhbC5jX3N0cigpLCBpKTsKLSAgICAgICAgd3JpdGUoZmQsIGJ1ZmZlciwgc3RybGVuKGJ1ZmZlcikpOwotICAgICAgICB2YWx1ZUF0KGkpLmR1bXAoZmQsIDIsIHRydWUpOwotICAgIH0KLQotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDYxMGJiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxMDUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCitzb29uZ19uYW1lc3BhY2UgeworfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJhMmRwX2luX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIsCisgICAgdmVuZG9yOiB0cnVlLAorICAgIHNyYzogIjphMmRwX2luX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uIiwKK30KK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImEyZHBfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjOiAiOmEyZHBfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24iLAorfQorcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjOiAiOmF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2dlbmVyaWMiLAorfQorcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAicl9zdWJtaXhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjOiAiOnJfc3VibWl4X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uIiwKK30KK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImF1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCIsCisgICAgdmVuZG9yOiB0cnVlLAorICAgIHNyYzogIjphdWRpb19wb2xpY3lfdm9sdW1lcyIsCit9CitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJkZWZhdWx0X3ZvbHVtZV90YWJsZXMueG1sIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjOiAiOmRlZmF1bHRfdm9sdW1lX3RhYmxlcyIsCit9CitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJzdXJyb3VuZF9zb3VuZF9jb25maWd1cmF0aW9uXzVfMC54bWwiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmM6ICI6c3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAiLAorfQorcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAidXNiX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIsCisgICAgdmVuZG9yOiB0cnVlLAorICAgIHNyYzogIjp1c2JfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24iLAorfQorcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAicHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLAorICAgIHNyYzogIjpwcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uIiwKKyAgICB2ZW5kb3I6IHRydWUsCit9CisKK2ZpbGVncm91cCB7CisgICAgbmFtZTogImEyZHBfaW5fYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24iLAorICAgIHNyY3M6IFsiYTJkcF9pbl9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiXSwKK30KK2ZpbGVncm91cCB7CisgICAgbmFtZTogImEyZHBfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24iLAorICAgIHNyY3M6IFsiYTJkcF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiXSwKK30KK2ZpbGVncm91cCB7CisgICAgbmFtZTogInByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24iLAorICAgIHNyY3M6IFsicHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiXSwKK30KK2ZpbGVncm91cCB7CisgICAgbmFtZTogInN1cnJvdW5kX3NvdW5kX2NvbmZpZ3VyYXRpb25fNV8wIiwKKyAgICBzcmNzOiBbInN1cnJvdW5kX3NvdW5kX2NvbmZpZ3VyYXRpb25fNV8wLnhtbCJdLAorfQorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiZGVmYXVsdF92b2x1bWVfdGFibGVzIiwKKyAgICBzcmNzOiBbImRlZmF1bHRfdm9sdW1lX3RhYmxlcy54bWwiXSwKK30KK2ZpbGVncm91cCB7CisgICAgbmFtZTogImF1ZGlvX3BvbGljeV92b2x1bWVzIiwKKyAgICBzcmNzOiBbImF1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCJdLAorfQorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpYyIsCisgICAgc3JjczogWyJhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9nZW5lcmljLnhtbCJdLAorfQorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpY19jb25maWd1cmFibGUiLAorICAgIHNyY3M6IFsiYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpY19jb25maWd1cmFibGUueG1sIl0sCit9CitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJ1c2JfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24iLAorICAgIHNyY3M6IFsidXNiX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCJdLAorfQorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAicl9zdWJtaXhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24iLAorICAgIHNyY3M6IFsicl9zdWJtaXhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIl0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAppbmRleCAzNzlmN2U1Li5iMjgzODFiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKQEAgLTE4NSwxNCArMTg1LDI3IEBACiAgICAgICAgIDwhLS0gQmx1ZXRvb3RoIEF1ZGlvIEhBTCAtLT4KICAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0iYmx1ZXRvb3RoX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIvPgogCisgICAgICAgIDwhLS0gTVNEIEF1ZGlvIEhBTCAob3B0aW9uYWwpIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJtc2RfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CisKICAgICA8L21vZHVsZXM+CiAgICAgPCEtLSBFbmQgb2YgTW9kdWxlcyBzZWN0aW9uIC0tPgogCi0gICAgPCEtLSBWb2x1bWUgc2VjdGlvbiAtLT4KKyAgICA8IS0tIFZvbHVtZSBzZWN0aW9uOgorICAgICAgICBJTVBPUlRBTlQgTk9URTogVm9sdW1lIHRhYmxlcyBoYXZlIGJlZW4gbW92ZWQgdG8gZW5naW5lIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICBLZWVwIGl0IGhlcmUgZm9yIGxlZ2FjeS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEVuZ2luZSB3aWxsIGZhbGxiYWNrIG9uIHRoZXNlIGZpbGVzIGlmIG5vbmUgYXJlIHByb3ZpZGVkIGJ5IGVuZ2luZS4KKyAgICAgLS0+CiAKICAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfdm9sdW1lcy54bWwiLz4KICAgICA8eGk6aW5jbHVkZSBocmVmPSJkZWZhdWx0X3ZvbHVtZV90YWJsZXMueG1sIi8+CiAKICAgICA8IS0tIEVuZCBvZiBWb2x1bWUgc2VjdGlvbiAtLT4KIAorICAgIDwhLS0gU3Vycm91bmQgU291bmQgY29uZmlndXJhdGlvbiAtLT4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9InN1cnJvdW5kX3NvdW5kX2NvbmZpZ3VyYXRpb25fNV8wLnhtbCIvPgorCisgICAgPCEtLSBFbmQgb2YgU3Vycm91bmQgU291bmQgY29uZmlndXJhdGlvbiAtLT4KKwogPC9hdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fYmx1ZXRvb3RoX2xlZ2FjeV9oYWwueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2JsdWV0b290aF9sZWdhY3lfaGFsLnhtbAppbmRleCBhNzVmMWNiLi5iNGNjMWQzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fYmx1ZXRvb3RoX2xlZ2FjeV9oYWwueG1sCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9ibHVldG9vdGhfbGVnYWN5X2hhbC54bWwKQEAgLTE4NSwxNCArMTg1LDI3IEBACiAgICAgICAgIDwhLS0gSGVhcmluZyBhaWQgQXVkaW8gSEFMIC0tPgogICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJoZWFyaW5nX2FpZF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KIAorICAgICAgICA8IS0tIE1TRCBBdWRpbyBIQUwgKG9wdGlvbmFsKSAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0ibXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCIvPgorCiAgICAgPC9tb2R1bGVzPgogICAgIDwhLS0gRW5kIG9mIE1vZHVsZXMgc2VjdGlvbiAtLT4KIAotICAgIDwhLS0gVm9sdW1lIHNlY3Rpb24gLS0+CisgICAgPCEtLSBWb2x1bWUgc2VjdGlvbjoKKyAgICAgICAgSU1QT1JUQU5UIE5PVEU6IFZvbHVtZSB0YWJsZXMgaGF2ZSBiZWVuIG1vdmVkIHRvIGVuZ2luZSBjb25maWd1cmF0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgS2VlcCBpdCBoZXJlIGZvciBsZWdhY3kuCisgICAgICAgICAgICAgICAgICAgICAgICBFbmdpbmUgd2lsbCBmYWxsYmFjayBvbiB0aGVzZSBmaWxlcyBpZiBub25lIGFyZSBwcm92aWRlZCBieSBlbmdpbmUuCisgICAgIC0tPgogCiAgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X3ZvbHVtZXMueG1sIi8+CiAgICAgPHhpOmluY2x1ZGUgaHJlZj0iZGVmYXVsdF92b2x1bWVfdGFibGVzLnhtbCIvPgogCiAgICAgPCEtLSBFbmQgb2YgVm9sdW1lIHNlY3Rpb24gLS0+CiAKKyAgICA8IS0tIFN1cnJvdW5kIFNvdW5kIGNvbmZpZ3VyYXRpb24gLS0+CisKKyAgICA8eGk6aW5jbHVkZSBocmVmPSJzdXJyb3VuZF9zb3VuZF9jb25maWd1cmF0aW9uXzVfMC54bWwiLz4KKworICAgIDwhLS0gRW5kIG9mIFN1cnJvdW5kIFNvdW5kIGNvbmZpZ3VyYXRpb24gLS0+CisKIDwvYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2dlbmVyaWMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2dlbmVyaWMueG1sCmluZGV4IDU4NzY4YzMuLjlhZDYwOWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9nZW5lcmljLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpYy54bWwKQEAgLTMwLDExICszMCwyMSBAQAogICAgIDwvbW9kdWxlcz4KICAgICA8IS0tIEVuZCBvZiBNb2R1bGVzIHNlY3Rpb24gLS0+CiAKLSAgICA8IS0tIFZvbHVtZSBzZWN0aW9uIC0tPgorICAgIDwhLS0gVm9sdW1lIHNlY3Rpb246CisgICAgICAgIElNUE9SVEFOVCBOT1RFOiBWb2x1bWUgdGFibGVzIGhhdmUgYmVlbiBtb3ZlZCB0byBlbmdpbmUgY29uZmlndXJhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgICAgIEtlZXAgaXQgaGVyZSBmb3IgbGVnYWN5LgorICAgICAgICAgICAgICAgICAgICAgICAgRW5naW5lIHdpbGwgZmFsbGJhY2sgb24gdGhlc2UgZmlsZXMgaWYgbm9uZSBhcmUgcHJvdmlkZWQgYnkgZW5naW5lLgorICAgICAtLT4KIAogICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCIvPgogICAgIDx4aTppbmNsdWRlIGhyZWY9ImRlZmF1bHRfdm9sdW1lX3RhYmxlcy54bWwiLz4KIAogICAgIDwhLS0gRW5kIG9mIFZvbHVtZSBzZWN0aW9uIC0tPgogCisgICAgPCEtLSBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0ic3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIi8+CisKKyAgICA8IS0tIEVuZCBvZiBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCiA8L2F1ZGlvUG9saWN5Q29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9nZW5lcmljX2NvbmZpZ3VyYWJsZS54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpY19jb25maWd1cmFibGUueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZTRmN2YKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpY19jb25maWd1cmFibGUueG1sCkBAIC0wLDAgKzEsNTAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDIwIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgICA8IS0tIHZlcnNpb24gc2VjdGlvbiBjb250YWlucyBhIOKAnHZlcnNpb27igJ0gdGFnIGluIHRoZSBmb3JtIOKAnG1ham9yLm1pbm9y4oCdIGUuZyB2ZXJzaW9uPeKAnTEuMOKAnSAtLT4KKworICAgIDwhLS0gR2xvYmFsIGNvbmZpZ3VyYXRpb24gRGVjYWxhcmF0aW9uIC0tPgorICAgIDxnbG9iYWxDb25maWd1cmF0aW9uIHNwZWFrZXJfZHJjX2VuYWJsZWQ9ImZhbHNlIiBlbmdpbmVfbGlicmFyeT0iY29uZmlndXJhYmxlIi8+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPCEtLSBQcmltYXJ5IEF1ZGlvIEhBTCAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0icHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KKworICAgICAgICA8IS0tIFJlbW90ZSBTdWJtaXggQXVkaW8gSEFMIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJyX3N1Ym1peF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLz4KKworICAgIDwvbW9kdWxlcz4KKyAgICA8IS0tIEVuZCBvZiBNb2R1bGVzIHNlY3Rpb24gLS0+CisKKyAgICA8IS0tIFZvbHVtZSBzZWN0aW9uOgorICAgICAgICBJTVBPUlRBTlQgTk9URTogVm9sdW1lIHRhYmxlcyBoYXZlIGJlZW4gbW92ZWQgdG8gZW5naW5lIGNvbmZpZ3VyYXRpb24uCisgICAgICAgICAgICAgICAgICAgICAgICBLZWVwIGl0IGhlcmUgZm9yIGxlZ2FjeS4KKyAgICAgICAgICAgICAgICAgICAgICAgIEVuZ2luZSB3aWxsIGZhbGxiYWNrIG9uIHRoZXNlIGZpbGVzIGlmIG5vbmUgYXJlIHByb3ZpZGVkIGJ5IGVuZ2luZS4KKyAgICAgLS0+CisKKyAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfdm9sdW1lcy54bWwiLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJkZWZhdWx0X3ZvbHVtZV90YWJsZXMueG1sIi8+CisKKyAgICA8IS0tIEVuZCBvZiBWb2x1bWUgc2VjdGlvbiAtLT4KKworICAgIDwhLS0gU3Vycm91bmQgU291bmQgY29uZmlndXJhdGlvbiAtLT4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9InN1cnJvdW5kX3NvdW5kX2NvbmZpZ3VyYXRpb25fNV8wLnhtbCIvPgorCisgICAgPCEtLSBFbmQgb2YgU3Vycm91bmQgU291bmQgY29uZmlndXJhdGlvbiAtLT4KKworPC9hdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpY190di54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpY190di54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWYxY2EzMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9nZW5lcmljX3R2LnhtbApAQCAtMCwwICsxLDQ5IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxhdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24gdmVyc2lvbj0iMS4wIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisgICAgPCEtLSB2ZXJzaW9uIHNlY3Rpb24gY29udGFpbnMgYSDigJx2ZXJzaW9u4oCdIHRhZyBpbiB0aGUgZm9ybSDigJxtYWpvci5taW5vcuKAnSBlLmcgdmVyc2lvbj3igJ0xLjDigJ0gLS0+CisKKyAgICA8IS0tIEdsb2JhbCBjb25maWd1cmF0aW9uIERlY2FsYXJhdGlvbiAtLT4KKyAgICA8Z2xvYmFsQ29uZmlndXJhdGlvbiBzcGVha2VyX2RyY19lbmFibGVkPSJmYWxzZSIvPgorCisgICAgPG1vZHVsZXM+CisgICAgICAgIDwhLS0gUHJpbWFyeSBBdWRpbyBIQUwgLS0+CisgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9InByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fdHYueG1sIi8+CisKKyAgICAgICAgPCEtLSBVc2IgQXVkaW8gSEFMIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJ1c2JfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CisKKyAgICAgICAgPCEtLSBSZW1vdGUgU3VibWl4IEF1ZGlvIEhBTCAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0icl9zdWJtaXhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CisKKyAgICA8L21vZHVsZXM+CisgICAgPCEtLSBFbmQgb2YgTW9kdWxlcyBzZWN0aW9uIC0tPgorCisgICAgPCEtLSBWb2x1bWUgc2VjdGlvbiAtLT4KKworICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImRlZmF1bHRfdm9sdW1lX3RhYmxlcy54bWwiLz4KKworICAgIDwhLS0gRW5kIG9mIFZvbHVtZSBzZWN0aW9uIC0tPgorCisgICAgPCEtLSBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0ic3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIi8+CisKKyAgICA8IS0tIEVuZCBvZiBTdXJyb3VuZCBTb3VuZCBjb25maWd1cmF0aW9uIC0tPgorCis8L2F1ZGlvUG9saWN5Q29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9zdHViLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9zdHViLnhtbAppbmRleCAyNmMzODFmLi44MzUwZWI4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fc3R1Yi54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX3N0dWIueG1sCkBAIC0xNSw2ICsxNSw5IEBACiAtLT4KIAogPGF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgICA8IS0tIEdsb2JhbCBjb25maWd1cmF0aW9uIERlY2FsYXJhdGlvbiAtLT4KKyAgICA8Z2xvYmFsQ29uZmlndXJhdGlvbiBzcGVha2VyX2RyY19lbmFibGVkPSJmYWxzZSIvPgorCiAgICAgPG1vZHVsZXM+CiAgICAgICAgIDwhLS0gU3R1YiBBdWRpbyBIQUwgLS0+CiAgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9InN0dWJfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIi8+CkBAIC0yNiw1ICsyOSw2IEBACiAKICAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfdm9sdW1lcy54bWwiLz4KICAgICA8eGk6aW5jbHVkZSBocmVmPSJkZWZhdWx0X3ZvbHVtZV90YWJsZXMueG1sIi8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0ic3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sIi8+CiAKIDwvYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV92b2x1bWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9hdWRpb19wb2xpY3lfdm9sdW1lcy54bWwKaW5kZXggZWM2NGE3Yy4uZGRkMDMxYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL2F1ZGlvX3BvbGljeV92b2x1bWVzLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvYXVkaW9fcG9saWN5X3ZvbHVtZXMueG1sCkBAIC0xODEsNiArMTgxLDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fQVNTSVNUQU5UIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9BU1NJU1RBTlQiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX0FTU0lTVEFOVCIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8dm9sdW1lIHN0cmVhbT0iQVVESU9fU1RSRUFNX0FTU0lTVEFOVCIgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9BU1NJU1RBTlQiIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CiAgICAgPHZvbHVtZSBzdHJlYW09IkFVRElPX1NUUkVBTV9SRVJPVVRJTkciIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVmPSJGVUxMX1NDQUxFX1ZPTFVNRV9DVVJWRSIvPgogICAgIDx2b2x1bWUgc3RyZWFtPSJBVURJT19TVFJFQU1fUkVST1VUSU5HIiBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9tc2RfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiMTdiYzYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvbXNkX2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbApAQCAtMCwwICsxLDc4IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTctMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8IS0tIE11bHRpIFN0cmVhbSBEZWNvZGVyIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUgLS0+Cis8bW9kdWxlIG5hbWU9Im1zZCIgaGFsVmVyc2lvbj0iMi4wIj4KKyAgICA8YXR0YWNoZWREZXZpY2VzPgorICAgICAgICA8aXRlbT5NUzEyIElucHV0PC9pdGVtPgorICAgICAgICA8aXRlbT5NUzEyIE91dHB1dDwvaXRlbT4KKyAgICA8L2F0dGFjaGVkRGV2aWNlcz4KKyAgICA8bWl4UG9ydHM+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9Im1zMTIgaW5wdXQiIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgPC9taXhQb3J0PgorICAgICAgICA8bWl4UG9ydCBuYW1lPSJtczEyIGNvbXByZXNzZWQgaW5wdXQiIHJvbGU9InNvdXJjZSIKKyAgICAgICAgICAgICAgICBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUfEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUR8QVVESU9fT1VUUFVUX0ZMQUdfTk9OX0JMT0NLSU5HIj4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUMzIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEiLz4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfRV9BQzMiCisgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSIzMjAwMCw0NDEwMCw0ODAwMCIKKyAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyxBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSxBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzX0pPQyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUM0IgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgICA8L21peFBvcnQ+CisgICAgICAgIDwhLS0gVGhlIEhXIEFWIFN5bmMgZmxhZyBpcyBub3QgcmVxdWlyZWQsIGJ1dCBpcyByZWNvbW1lbmRlZCAtLT4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0ibXMxMiBvdXRwdXQiIHJvbGU9InNpbmsiIGZsYWdzPSJBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkMiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfQUMzIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl81UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl81UE9JTlQxIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgIDwvbWl4UG9ydHM+CisgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iTVMxMiBJbnB1dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9CVVMiICByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9BQzMiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEiLz4KKyAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9FX0FDMyIKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iMzIwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfTU9OTyxBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSxBVURJT19DSEFOTkVMX09VVF83UE9JTlQxIi8+CisgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX0VfQUMzX0pPQyIKKyAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9NT05PLEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyxBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLEFVRElPX0NIQU5ORUxfT1VUXzdQT0lOVDEiLz4KKyAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9BQzQiCisgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjMyMDAwLDQ0MTAwLDQ4MDAwIgorICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX01PTk8sQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsQVVESU9fQ0hBTk5FTF9PVVRfN1BPSU5UMSIvPgorICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJNUzEyIE91dHB1dCIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0JVUyIgIHJvbGU9InNvdXJjZSI+CisgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgIDwvZGV2aWNlUG9ydHM+CisgICAgPHJvdXRlcz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iTVMxMiBJbnB1dCIgc291cmNlcz0ibXMxMiBpbnB1dCxtczEyIGNvbXByZXNzZWQgaW5wdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0ibXMxMiBvdXRwdXQiIHNvdXJjZXM9Ik1TMTIgT3V0cHV0Ii8+CisgICAgPC9yb3V0ZXM+Cis8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAppbmRleCA1YjdhZTdmLi5lZWRjOTZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvcHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCkBAIC0xLDUgKzEsNSBAQAogPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0gRGVmYXVsdCBQcmltYXJ5IEF1ZGlvIEhBTCBNb2R1bGUgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gaW5jbHVkZSBmbGllIC0tPgorPCEtLSBEZWZhdWx0IFByaW1hcnkgQXVkaW8gSEFMIE1vZHVsZSBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBpbmNsdWRlIGZpbGUgLS0+CiA8bW9kdWxlIG5hbWU9InByaW1hcnkiIGhhbFZlcnNpb249IjIuMCI+CiAgICAgPGF0dGFjaGVkRGV2aWNlcz4KICAgICAgICAgPGl0ZW0+U3BlYWtlcjwvaXRlbT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX3R2LnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9wcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX3R2LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjYwMTVhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnL3ByaW1hcnlfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fdHYueG1sCkBAIC0wLDAgKzEsMjYgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8IS0tIERlZmF1bHQgUHJpbWFyeSBBdWRpbyBIQUwgTW9kdWxlIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGluY2x1ZGUgZmlsZSBmb3IgVFYgLS0+Cis8bW9kdWxlIG5hbWU9InByaW1hcnkiIGhhbFZlcnNpb249IjIuMCI+CisgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgPGl0ZW0+U3BlYWtlcjwvaXRlbT4KKyAgICA8L2F0dGFjaGVkRGV2aWNlcz4KKyAgICA8ZGVmYXVsdE91dHB1dERldmljZT5TcGVha2VyPC9kZWZhdWx0T3V0cHV0RGV2aWNlPgorICAgIDxtaXhQb3J0cz4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0icHJpbWFyeSBvdXRwdXQiIHJvbGU9InNvdXJjZSIgZmxhZ3M9IkFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkiPgorICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgPG1peFBvcnQgbmFtZT0iZGlyZWN0IiByb2xlPSJzb3VyY2UiIGZsYWdzPSJBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QiIC8+CisgICAgICAgIDxtaXhQb3J0IG5hbWU9InR1bm5lbCIgcm9sZT0ic291cmNlIgorICAgICAgICAgICAgICAgICBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUfEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMiIC8+CisgICA8L21peFBvcnRzPgorICAgPGRldmljZVBvcnRzPgorICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJTcGVha2VyIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIiIHJvbGU9InNpbmsiIC8+CisgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9Ik91dCBBdXggRGlnaXRhbCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9BVVhfRElHSVRBTCIgcm9sZT0ic2luayIKKyAgICAgICAgICAgICAgICAgICAgZW5jb2RlZEZvcm1hdHM9IkFVRElPX0ZPUk1BVF9BQzMgQVVESU9fRk9STUFUX0lFQzYxOTM3IiAvPgorICAgIDwvZGV2aWNlUG9ydHM+CisgICAgPHJvdXRlcz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iU3BlYWtlciIgc291cmNlcz0icHJpbWFyeSBvdXRwdXQiLz4KKyAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iT3V0IEF1eCBEaWdpdGFsIiBzb3VyY2VzPSJwcmltYXJ5IG91dHB1dCxkaXJlY3QsdHVubmVsIi8+CisgICAgPC9yb3V0ZXM+Cis8L21vZHVsZT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZy9zdXJyb3VuZF9zb3VuZF9jb25maWd1cmF0aW9uXzVfMC54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvc3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MGExODEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWcvc3Vycm91bmRfc291bmRfY29uZmlndXJhdGlvbl81XzAueG1sCkBAIC0wLDAgKzEsMzEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxzdXJyb3VuZFNvdW5kPgorICA8IS0tIEVhY2ggb2YgdGhlIGxpc3RlZCBmb3JtYXRzIGdldHMgYW4gZW50cnkgaW4gU3Vycm91bmQgU2V0dGluZ3MgZGlhbG9nIG9uIFRWIGRldmljZXMuCisgICAgICAgVGhlcmUgbXVzdCBiZSBhIGNvcnJlc3BvbmRpbmcgSmF2YSBFTkNPRElOR18uLi4gY29udGFudCBkZWZpbmVkIGluIEF1ZGlvRm9ybWF0LmphdmEsCisgICAgICAgYW5kIGEgZGlzcGxheSBuYW1lIGRlZmluZWQgaW4gQXVkaW9Gb3JtYXQudG9EaXNwbGF5TmFtZS4gRm9yIHRoZSBmb3JtYXRzIHRoYXQgZG9uJ3QKKyAgICAgICBuZWVkIGEgZGVkaWNhdGVkIFN1cnJvbmQgU2V0dGluZ3MgZGlhbG9nIGVudHJ5LCBhIHN1YmZvcm1hdHMgbGlzdCBoYXMgdG8gYmUgdXNlZC4gLS0+CisgIDxmb3JtYXRzPgorICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0FDMyIgLz4KKyAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9FX0FDMyIgLz4KKyAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9FX0FDM19KT0MiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfRE9MQllfVFJVRUhEIiAvPgorICAgIDxmb3JtYXQgbmFtZT0iQVVESU9fRk9STUFUX0RUUyIgLz4KKyAgICA8Zm9ybWF0IG5hbWU9IkFVRElPX0ZPUk1BVF9EVFNfSEQiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfQUFDX0xDIiBzdWJmb3JtYXRzPSJBVURJT19GT1JNQVRfQUFDX0hFX1YxIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjIgQVVESU9fRk9STUFUX0FBQ19FTEQgQVVESU9fRk9STUFUX0FBQ19YSEUiIC8+CisgICAgPGZvcm1hdCBuYW1lPSJBVURJT19GT1JNQVRfQUM0IiAvPgorICA8L2Zvcm1hdHM+Cis8L3N1cnJvdW5kU291bmQ+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTFjNjlmMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vQW5kcm9pZC5icApAQCAtMCwwICsxLDUxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5ZW5naW5lX2NvbW1vbl9oZWFkZXJzIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKK30KKworY2NfbGlicmFyeV9zdGF0aWMgeworICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeWVuZ2luZV9jb21tb24iLAorICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy9FbmdpbmVCYXNlLmNwcCIsCisgICAgICAgICJzcmMvUHJvZHVjdFN0cmF0ZWd5LmNwcCIsCisgICAgICAgICJzcmMvVm9sdW1lQ3VydmUuY3BwIiwKKyAgICAgICAgInNyYy9Wb2x1bWVHcm91cC5jcHAiLAorICAgICAgICAic3JjL0xhc3RSZW1vdmFibGVNZWRpYURldmljZXMuY3BwIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9wb2xpY3ljb21tb24iLAorICAgICAgICAibGliYXVkaW9wb2xpY3llbmdpbmVfY29tbW9uX2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9wb2xpY3llbmdpbmVfaW50ZXJmYWNlX2hlYWRlcnMiLAorICAgIF0sCisgICAgZXhwb3J0X2hlYWRlcl9saWJfaGVhZGVyczogWworICAgICAgICAibGliYXVkaW9wb2xpY3llbmdpbmVfY29tbW9uX2hlYWRlcnMiLAorICAgIF0sCisgICAgc3RhdGljX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZV9jb25maWciLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbiIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9FbmdpbmVCYXNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvRW5naW5lQmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjdmMzM5ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvRW5naW5lQmFzZS5oCkBAIC0wLDAgKzEsMTQ0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxFbmdpbmVDb25maWcuaD4KKyNpbmNsdWRlIDxFbmdpbmVJbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxQcm9kdWN0U3RyYXRlZ3kuaD4KKyNpbmNsdWRlIDxWb2x1bWVHcm91cC5oPgorI2luY2x1ZGUgPExhc3RSZW1vdmFibGVNZWRpYURldmljZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CisKK2NsYXNzIEVuZ2luZUJhc2UgOiBwdWJsaWMgRW5naW5lSW50ZXJmYWNlCit7CitwdWJsaWM6CisgICAgLy8vCisgICAgLy8vIGZyb20gRW5naW5lSW50ZXJmYWNlCisgICAgLy8vCisgICAgYW5kcm9pZDo6c3RhdHVzX3QgaW5pdENoZWNrKCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcikgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKSBvdmVycmlkZTsKKworICAgIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbVBob25lU3RhdGU7IH0KKworICAgIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpIG92ZXJyaWRlCisgICAgeworICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpIGNvbnN0IG92ZXJyaWRlCisgICAgeworICAgICAgICByZXR1cm4gbUZvcmNlVXNlW3VzYWdlXTsKKyAgICB9CisgICAgYW5kcm9pZDo6c3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IC8qZGV2RGVzYyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgLypzdGF0ZSovKSBvdmVycmlkZTsKKworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdCBvdmVycmlkZTsKKworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdCBvdmVycmlkZTsKKworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBnZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBTdHJlYW1UeXBlVmVjdG9yIGdldFN0cmVhbVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGdldEFsbEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdCBvdmVycmlkZTsKKworICAgIFN0cmF0ZWd5VmVjdG9yIGdldE9yZGVyZWRQcm9kdWN0U3RyYXRlZ2llcygpIGNvbnN0IG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpIGNvbnN0IG92ZXJyaWRlOworCisgICAgVm9sdW1lQ3VydmVzICpnZXRWb2x1bWVDdXJ2ZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBWb2x1bWVDdXJ2ZXMgKmdldFZvbHVtZUN1cnZlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0IG92ZXJyaWRlOworCisgICAgSVZvbHVtZUN1cnZlcyAqZ2V0Vm9sdW1lQ3VydmVzRm9yVm9sdW1lR3JvdXAodm9sdW1lX2dyb3VwX3QgZ3JvdXApIGNvbnN0IG92ZXJyaWRlCisgICAgeworICAgICAgIHJldHVybiBtVm9sdW1lR3JvdXBzLmZpbmQoZ3JvdXApICE9IGVuZChtVm9sdW1lR3JvdXBzKSA/CisgICAgICAgICAgICAgICAgICAgbVZvbHVtZUdyb3Vwcy5hdChncm91cCktPmdldFZvbHVtZUN1cnZlcygpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICBWb2x1bWVHcm91cFZlY3RvciBnZXRWb2x1bWVHcm91cHMoKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZvbHVtZV9ncm91cF90IGdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0IG92ZXJyaWRlOworCisgICAgdm9sdW1lX2dyb3VwX3QgZ2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdCBvdmVycmlkZTsKKworICAgIHN0YXR1c190IGxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpIGNvbnN0IG92ZXJyaWRlOworCisgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZGV2aWNlc190PiBnZXRMYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzKAorICAgICAgICAgICAgZGV2aWNlX291dF9ncm91cF90IGdyb3VwID0gR1JPVVBfTk9ORSkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBtTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcy5nZXRMYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzKGdyb3VwKTsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCBvdmVycmlkZTsKKworICAgIHN0YXR1c190IHNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCByZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgZ2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKSBjb25zdCBvdmVycmlkZTsKKworICAgIGVuZ2luZUNvbmZpZzo6UGFyc2luZ1Jlc3VsdCBsb2FkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWcoKTsKKworICAgIGNvbnN0IFByb2R1Y3RTdHJhdGVneU1hcCAmZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKSBjb25zdCB7IHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXM7IH0KKworICAgIFByb2R1Y3RTdHJhdGVneU1hcCAmZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKSB7IHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXM7IH0KKworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OworCisgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUJ5TmFtZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgY29uc3Q7CisKKyAgICBBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqZ2V0QXBtT2JzZXJ2ZXIoKSBjb25zdCB7IHJldHVybiBtQXBtT2JzZXJ2ZXI7IH0KKworICAgIGlubGluZSBib29sIGlzSW5DYWxsKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBpc19zdGF0ZV9pbl9jYWxsKGdldFBob25lU3RhdGUoKSk7CisgICAgfQorCisgICAgVm9sdW1lU291cmNlIHRvVm9sdW1lU291cmNlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAorICAgIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFZvbHVtZVNvdXJjZT4oZ2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKHN0cmVhbSkpOworICAgIH0KKworICAgIHN0YXR1c190IHN3aXRjaFZvbHVtZUN1cnZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtU3JjLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbURzdCk7CisKKyAgICBzdGF0dXNfdCByZXN0b3JlT3JpZ2luVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOworCitwcml2YXRlOgorICAgIEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICptQXBtT2JzZXJ2ZXIgPSBudWxscHRyOworCisgICAgUHJvZHVjdFN0cmF0ZWd5TWFwIG1Qcm9kdWN0U3RyYXRlZ2llczsKKyAgICBQcm9kdWN0U3RyYXRlZ3lQcmVmZXJyZWRSb3V0aW5nTWFwIG1Qcm9kdWN0U3RyYXRlZ3lQcmVmZXJyZWREZXZpY2VzOworICAgIFZvbHVtZUdyb3VwTWFwIG1Wb2x1bWVHcm91cHM7CisgICAgTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcyBtTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlczsKKyAgICBhdWRpb19tb2RlX3QgbVBob25lU3RhdGUgPSBBVURJT19NT0RFX05PUk1BTDsgIC8qKjwgY3VycmVudCBwaG9uZSBzdGF0ZS4gKi8KKworICAgIC8qKiBjdXJyZW50IGZvcmNlZCB1c2UgY29uZmlndXJhdGlvbi4gKi8KKyAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVF0gPSB7fTsKK307CisKK30gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL0xhc3RSZW1vdmFibGVNZWRpYURldmljZXMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYTMwNTNhNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmgKQEAgLTAsMCArMSw1MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9MQVNUX1JFTU9WQUJMRV9NRURJQV9ERVZJQ0VTX0gKKyNkZWZpbmUgQU5EUk9JRF9MQVNUX1JFTU9WQUJMRV9NRURJQV9ERVZJQ0VTX0gKKworI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxId01vZHVsZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpb19wb2xpY3kuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit0eXBlZGVmIGVudW0geworICAgIEdST1VQX05PTkUgPSAtMSwKKyAgICBHUk9VUF9XSVJFRCwKKyAgICBHUk9VUF9CVF9BMkRQLAorICAgIE5VTV9HUk9VUAorfSBkZXZpY2Vfb3V0X2dyb3VwX3Q7CisKK2NsYXNzIExhc3RSZW1vdmFibGVNZWRpYURldmljZXMKK3sKK3B1YmxpYzoKKyAgICB2b2lkIHNldFJlbW92YWJsZU1lZGlhRGV2aWNlcyhzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXNjLCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpOworICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2RldmljZXNfdD4gZ2V0TGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcygKKyAgICAgICAgICAgIGRldmljZV9vdXRfZ3JvdXBfdCBncm91cCA9IEdST1VQX05PTkUpIGNvbnN0OworCitwcml2YXRlOgorICAgIHN0cnVjdCBEZXZpY2VHcm91cERlc2NyaXB0b3IgeworICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXNjOworICAgICAgICBkZXZpY2Vfb3V0X2dyb3VwX3QgZ3JvdXA7CisgICAgfTsKKyAgICBzdGQ6OnZlY3RvcjxEZXZpY2VHcm91cERlc2NyaXB0b3I+IG1NZWRpYURldmljZXM7CisKKyAgICBkZXZpY2Vfb3V0X2dyb3VwX3QgZ2V0RGV2aWNlT3V0R3JvdXAoYXVkaW9fZGV2aWNlc190IGRldmljZSkgY29uc3Q7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvLyBBTkRST0lEX0xBU1RfUkVNT1ZBQkxFX01FRElBX0RFVklDRVNfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1Byb2R1Y3RTdHJhdGVneS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1Byb2R1Y3RTdHJhdGVneS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlYmU3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvUHJvZHVjdFN0cmF0ZWd5LmgKQEAgLTAsMCArMSwxNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIlZvbHVtZUdyb3VwLmgiCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8SGFuZGxlR2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQXR0cmlidXRlcy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworLyoqCisgKiBAYnJpZWYgVGhlIFByb2R1Y3RTdHJhdGVneSBjbGFzcyBkZXNjcmliZXMgZm9yIGVhY2ggcHJvZHVjdF9zdHJhdGVneV90IGlkZW50aWZpZXIgdGhlCisgKiBhc3NvY2lhdGVkIGF1ZGlvIGF0dHJpYnV0ZXMsIHRoZSBkZXZpY2UgdHlwZXMgdG8gdXNlLCB0aGUgZGV2aWNlIGFkZHJlc3MgdG8gdXNlLgorICogVGhlIGlkZW50aWZpZXIgaXMgdm9sdW50YXJpbHkgbm90IHN0cm9uZ2x5IHR5cGVkIGluIG9yZGVyIHRvIGJlIGV4dGVuc2libGUgYnkgT0VNLgorICovCitjbGFzcyBQcm9kdWN0U3RyYXRlZ3kgOiBwdWJsaWMgdmlydHVhbCBSZWZCYXNlLCBwcml2YXRlIEhhbmRsZUdlbmVyYXRvcjx1aW50MzJfdD4KK3sKK3ByaXZhdGU6CisgICAgc3RydWN0IEF1ZGlvQXR0cmlidXRlcyB7CisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbSA9IEFVRElPX1NUUkVBTV9ERUZBVUxUOworICAgICAgICB2b2x1bWVfZ3JvdXBfdCBtVm9sdW1lR3JvdXAgPSBWT0xVTUVfR1JPVVBfTk9ORTsKKyAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IG1BdHRyaWJ1dGVzID0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKKyAgICB9OworCisgICAgdXNpbmcgQXVkaW9BdHRyaWJ1dGVzVmVjdG9yID0gc3RkOjp2ZWN0b3I8QXVkaW9BdHRyaWJ1dGVzPjsKKworcHVibGljOgorICAgIFByb2R1Y3RTdHJhdGVneShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSk7CisKKyAgICB2b2lkIGFkZEF0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhdWRpb0F0dHJpYnV0ZXMpOworCisgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6QXVkaW9BdHRyaWJ1dGVzPiBsaXN0QXVkaW9BdHRyaWJ1dGVzKCkgY29uc3Q7CisKKyAgICBzdGQ6OnN0cmluZyBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGdldEF1ZGlvQXR0cmlidXRlcygpIGNvbnN0OworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBnZXRJZCgpIGNvbnN0IHsgcmV0dXJuIG1JZDsgfQorICAgIFN0cmVhbVR5cGVWZWN0b3IgZ2V0U3VwcG9ydGVkU3RyZWFtcygpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIG1hdGNoZXMgY2hlY2tzIGlmIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzIHNoYWxsIGZvbGxvdyB0aGUgc3RyYXRlZ3kuCisgICAgICogICAgICAgIE9yZGVyIG9mIHRoZSBhdHRyaWJ1dGVzIHdpdGhpbiBhIHN0cmF0ZWd5IG1hdHRlcnMuCisgICAgICogICAgICAgIElmIG9ubHkgdGhlIHVzYWdlIGlzIGF2YWlsYWJsZSwgdGhlIGNoZWNrIGlzIHBlcmZvcm1lZCBvbiB0aGUgdXNhZ2VzIG9mIHRoZSBnaXZlbgorICAgICAqICAgICAgICBhdHRyaWJ1dGVzLCBvdGhlcndpc2UgYWxsIGZpZWxkcyBtdXN0IG1hdGNoLgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIHRvIGNvbnNpZGVyCisgICAgICogQHJldHVybiB0cnVlIGlmIGF0dHJpYnV0ZXMgbWF0Y2hlcyB3aXRoIHRoZSBzdHJhdGVneSwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgICAqLworICAgIGJvb2wgbWF0Y2hlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcykgY29uc3Q7CisKKyAgICBib29sIHN1cHBvcnRTdHJlYW1UeXBlKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbVR5cGUpIGNvbnN0OworCisgICAgdm9pZCBzZXREZXZpY2VBZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKQorICAgIHsKKyAgICAgICAgbURldmljZUFkZHJlc3MgPSBhZGRyZXNzOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGdldERldmljZUFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlQWRkcmVzczsgfQorCisgICAgdm9pZCBzZXREZXZpY2VUeXBlcyhjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VzKQorICAgIHsKKyAgICAgICAgbUFwcGxpY2FibGVEZXZpY2VzID0gZGV2aWNlczsKKyAgICB9CisKKyAgICBEZXZpY2VUeXBlU2V0IGdldERldmljZVR5cGVzKCkgY29uc3QgeyByZXR1cm4gbUFwcGxpY2FibGVEZXZpY2VzOyB9CisKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgZ2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgZ2V0U3RyZWFtVHlwZUZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdDsKKworICAgIHZvbHVtZV9ncm91cF90IGdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0OworCisgICAgdm9sdW1lX2dyb3VwX3QgZ2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKKworICAgIHZvbHVtZV9ncm91cF90IGdldERlZmF1bHRWb2x1bWVHcm91cCgpIGNvbnN0OworCisgICAgYm9vbCBpc0RlZmF1bHQoKSBjb25zdDsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwKSBjb25zdDsKKworcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBtTmFtZTsKKworICAgIEF1ZGlvQXR0cmlidXRlc1ZlY3RvciBtQXR0cmlidXRlc1ZlY3RvcjsKKworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBtSWQ7CisKKyAgICBzdGQ6OnN0cmluZyBtRGV2aWNlQWRkcmVzczsgLyoqPCBEZXZpY2UgYWRkcmVzcyBhcHBsaWNhYmxlIGZvciB0aGlzIHN0cmF0ZWd5LCBtYXliZSBlbXB0eSAqLworCisgICAgLyoqCisgICAgICogQXBwbGljYWJsZSBkZXZpY2UocykgdHlwZSBtYXNrIGZvciB0aGlzIHN0cmF0ZWd5LgorICAgICAqLworICAgIERldmljZVR5cGVTZXQgbUFwcGxpY2FibGVEZXZpY2VzOworfTsKKworY2xhc3MgUHJvZHVjdFN0cmF0ZWd5TWFwIDogcHVibGljIHN0ZDo6bWFwPHByb2R1Y3Rfc3RyYXRlZ3lfdCwgc3A8UHJvZHVjdFN0cmF0ZWd5PiA+Cit7CitwdWJsaWM6CisgICAgLyoqCisgICAgICogQGJyaWVmIGluaXRpYWxpemU6IHNldCBkZWZhdWx0IHByb2R1Y3Qgc3RyYXRlZ3kgaW4gY2FjaGUuCisgICAgICovCisgICAgdm9pZCBpbml0aWFsaXplKCk7CisgICAgLyoqCisgICAgICogQGJyaWVmIGdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZS4gVGhlIG9yZGVyIG9mIHRoZSB2ZWN0b3IgaXMgZGltZW5zaW9ubmluZy4KKyAgICAgKiBAcGFyYW0gYXR0cgorICAgICAqIEByZXR1cm4gYXBwbGljYWJsZSBwcm9kdWN0IHN0cmF0ZWd5IGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlLCBkZWZhdWx0IGlmIG5vbmUgYXBwbGljYWJsZS4KKyAgICAgKi8KKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0OworCisgICAgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3Q7CisKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgZ2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OworCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0OworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3kgY2FuIGJlIGNhbGxlZCBmcm9tCisgICAgICogICAgICAgIEF1ZGlvTWFuYWdlcjogaW4gdGhpcyBjYXNlLCB0aGUgcHJvZHVjdCBzdHJhdGVneSBJUyB0aGUgZm9ybWVyIHJvdXRpbmcgc3RyYXRlZ3kKKyAgICAgKiAgICAgICAgQ2FyQXVkaW9NYW5hZ2VyOiBpbiB0aGlzIGNhc2UsIHRoZSBwcm9kdWN0IHN0cmF0ZWd5IElTIHRoZSBjYXIgdXNhZ2UKKyAgICAgKiAgICAgICAgICAgICAgICAgICAgICBbZ2V0QXVkaW9BdHRyaWJ1dGVzRm9yQ2FyVXNhZ2VdCisgICAgICogICAgICAgIE9lbUV4dGVuc2lvbjogaW4gdGhpcyBjYXNlLCB0aGUgcHJvZHVjdCBzdHJhdGVneSBJUyB0aGUgT2VtIHVzYWdlCisgICAgICoKKyAgICAgKiBAcGFyYW0gc3RyYXRlZ3kKKyAgICAgKiBAcmV0dXJuIGF1ZGlvIGF0dHJpYnV0ZXMgKG9yIGF0IGxlYXN0IG9uZSBvZiB0aGUgYXR0cmlidXRlcykgZm9sbG93aW5nIHRoZSBnaXZlbiBzdHJhdGVneS4KKyAgICAgKi8KKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgZ2V0QXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIGNvbnN0OworCisgICAgRGV2aWNlVHlwZVNldCBnZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIGNvbnN0OworCisgICAgc3RkOjpzdHJpbmcgZ2V0RGV2aWNlQWRkcmVzc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIGNvbnN0OworCisgICAgdm9sdW1lX2dyb3VwX3QgZ2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3Q7CisKKyAgICB2b2x1bWVfZ3JvdXBfdCBnZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0OworCisgICAgdm9sdW1lX2dyb3VwX3QgZ2V0RGVmYXVsdFZvbHVtZUdyb3VwKCkgY29uc3Q7CisKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0RGVmYXVsdCgpIGNvbnN0OworCisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcyA9IDApIGNvbnN0OworCitwcml2YXRlOgorICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBtRGVmYXVsdFN0cmF0ZWd5ID0gUFJPRFVDVF9TVFJBVEVHWV9OT05FOworfTsKKworY2xhc3MgUHJvZHVjdFN0cmF0ZWd5UHJlZmVycmVkUm91dGluZ01hcCA6IHB1YmxpYyBzdGQ6Om1hcDxwcm9kdWN0X3N0cmF0ZWd5X3QsIEF1ZGlvRGV2aWNlVHlwZUFkZHI+Cit7CitwdWJsaWM6CisgICAgdm9pZCBkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcyA9IDApIGNvbnN0OworfTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1ZvbHVtZUN1cnZlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvVm9sdW1lQ3VydmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTc1ZmYxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9pbmNsdWRlL1ZvbHVtZUN1cnZlLmgKQEAgLTAsMCArMSwxOTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIklWb2x1bWVDdXJ2ZXMuaCIKKyNpbmNsdWRlIDxwb2xpY3kuaD4KKyNpbmNsdWRlIDx1dGlscy9SZWZCYXNlLmg+CisjaW5jbHVkZSA8SGFuZGxlR2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgorI2luY2x1ZGUgPHV0aWxzL1NvcnRlZFZlY3Rvci5oPgorI2luY2x1ZGUgPHV0aWxzL0tleWVkVmVjdG9yLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitzdHJ1Y3QgQ3VydmVQb2ludAoreworICAgIEN1cnZlUG9pbnQoKSB7fQorICAgIEN1cnZlUG9pbnQoaW50IGluZGV4LCBpbnQgYXR0ZW51YXRpb25Jbk1iKSA6CisgICAgICAgIG1JbmRleChpbmRleCksIG1BdHRlbnVhdGlvbkluTWIoYXR0ZW51YXRpb25Jbk1iKSB7fQorICAgIHVpbnQzMl90IG1JbmRleDsKKyAgICBpbnQgbUF0dGVudWF0aW9uSW5NYjsKK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPCAoY29uc3QgQ3VydmVQb2ludCAmbGhzLCBjb25zdCBDdXJ2ZVBvaW50ICZyaHMpCit7CisgICAgcmV0dXJuIGxocy5tSW5kZXggPCByaHMubUluZGV4OworfQorCisvLyBBIHZvbHVtZSBjdXJ2ZSBmb3IgYSBnaXZlbiB1c2UgY2FzZSBhbmQgZGV2aWNlIGNhdGVnb3J5CisvLyBJdCBjb250YWlucyBvZiBsaXN0IG9mIHBvaW50cyBvZiB0aGlzIGN1cnZlIGV4cHJlc3NpbmcgdGhlIGF0dGVudWF0aW9uIGluIE1pbGxpYmVscyBmb3IKKy8vIGEgZ2l2ZW4gdm9sdW1lIGluZGV4IGZyb20gMCB0byAxMDAKK2NsYXNzIFZvbHVtZUN1cnZlIDogcHVibGljIFJlZkJhc2UKK3sKK3B1YmxpYzoKKyAgICBWb2x1bWVDdXJ2ZShkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlKSA6IG1EZXZpY2VDYXRlZ29yeShkZXZpY2UpIHt9CisKKyAgICB2b2lkIGFkZChjb25zdCBDdXJ2ZVBvaW50ICZwb2ludCkgeyBtQ3VydmVQb2ludHMuYWRkKHBvaW50KTsgfQorCisgICAgZmxvYXQgdm9sSW5kZXhUb0RiKGludCBpbmRleEluVWksIGludCB2b2xJbmRleE1pbiwgaW50IHZvbEluZGV4TWF4KSBjb25zdDsKKworICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMgPSAwLCBib29sIGN1cnZlUG9pbnRzID0gZmFsc2UpIGNvbnN0OworCisgICAgZGV2aWNlX2NhdGVnb3J5IGdldERldmljZUNhdGVnb3J5KCkgY29uc3QgeyByZXR1cm4gbURldmljZUNhdGVnb3J5OyB9CisKK3ByaXZhdGU6CisgICAgY29uc3QgZGV2aWNlX2NhdGVnb3J5IG1EZXZpY2VDYXRlZ29yeTsKKyAgICBTb3J0ZWRWZWN0b3I8Q3VydmVQb2ludD4gbUN1cnZlUG9pbnRzOworfTsKKworLy8gVm9sdW1lIEN1cnZlcyBmb3IgYSBnaXZlbiB1c2UgY2FzZSBpbmRleGVkIGJ5IGRldmljZSBjYXRlZ29yeQorY2xhc3MgVm9sdW1lQ3VydmVzIDogcHVibGljIEtleWVkVmVjdG9yPGRldmljZV9jYXRlZ29yeSwgc3A8Vm9sdW1lQ3VydmU+ID4sCisgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgSVZvbHVtZUN1cnZlcworeworcHVibGljOgorICAgIFZvbHVtZUN1cnZlcyhpbnQgaW5kZXhNaW4gPSAwLCBpbnQgaW5kZXhNYXggPSAxMDApIDoKKyAgICAgICAgbUluZGV4TWluKGluZGV4TWluKSwgbUluZGV4TWF4KGluZGV4TWF4KQorICAgIHsKKyAgICAgICAgYWRkQ3VycmVudFZvbHVtZUluZGV4KEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FLCAwKTsKKyAgICB9CisgICAgc3RhdHVzX3QgaW5pdFZvbHVtZShpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCkgb3ZlcnJpZGUKKyAgICB7CisgICAgICAgIG1JbmRleE1pbiA9IGluZGV4TWluOworICAgICAgICBtSW5kZXhNYXggPSBpbmRleE1heDsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIHNwPFZvbHVtZUN1cnZlPiBnZXRDdXJ2ZXNGb3IoZGV2aWNlX2NhdGVnb3J5IGRldmljZSkgY29uc3QKKyAgICB7CisgICAgICAgIGlmIChpbmRleE9mS2V5KGRldmljZSkgPCAwKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdmFsdWVGb3IoZGV2aWNlKTsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGludCBnZXRWb2x1bWVJbmRleChjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcykgY29uc3QKKyAgICB7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShkZXZpY2VUeXBlcyk7CisgICAgICAgIC8vIHRoZXJlIGlzIGFsd2F5cyBhIHZhbGlkIGVudHJ5IGZvciBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRQorICAgICAgICBpZiAobUluZGV4Q3VyLmZpbmQoZGV2aWNlKSA9PSBlbmQobUluZGV4Q3VyKSkgeworICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1JbmRleEN1ci5hdChkZXZpY2UpOworICAgIH0KKworICAgIHZpcnR1YWwgYm9vbCBjYW5CZU11dGVkKCkgY29uc3QgeyByZXR1cm4gbUNhbkJlTXV0ZWQ7IH0KKyAgICB2aXJ0dWFsIHZvaWQgY2xlYXJDdXJyZW50Vm9sdW1lSW5kZXgoKSB7IG1JbmRleEN1ci5jbGVhcigpOyB9CisgICAgdm9pZCBhZGRDdXJyZW50Vm9sdW1lSW5kZXgoYXVkaW9fZGV2aWNlc190IGRldmljZSwgaW50IGluZGV4KSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgbUluZGV4Q3VyW2RldmljZV0gPSBpbmRleDsKKyAgICB9CisKKyAgICBpbnQgZ2V0Vm9sdW1lSW5kZXhNaW4oKSBjb25zdCB7IHJldHVybiBtSW5kZXhNaW47IH0KKworICAgIGludCBnZXRWb2x1bWVJbmRleE1heCgpIGNvbnN0IHsgcmV0dXJuIG1JbmRleE1heDsgfQorCisgICAgYm9vbCBoYXNWb2x1bWVJbmRleEZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBjb25zdAorICAgIHsKKyAgICAgICAgZGV2aWNlID0gVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoe2RldmljZX0pOworICAgICAgICByZXR1cm4gbUluZGV4Q3VyLmZpbmQoZGV2aWNlKSAhPSBlbmQobUluZGV4Q3VyKTsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzd2l0Y2hDdXJ2ZXNGcm9tKGNvbnN0IFZvbHVtZUN1cnZlcyAmcmVmZXJlbmNlQ3VydmVzKQorICAgIHsKKyAgICAgICAgaWYgKHNpemUoKSAhPSByZWZlcmVuY2VDdXJ2ZXMuc2l6ZSgpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXMhIGRldmljZSBjYXRlZ29yeSBub3QgYWxpZ25lZCwgY2Fubm90IHN3aXRjaCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1RZUEU7CisgICAgICAgIH0KKyAgICAgICAgZm9yIChzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IHNpemUoKTsgaW5kZXgrKykgeworICAgICAgICAgICAgZGV2aWNlX2NhdGVnb3J5IGNhdCA9IGtleUF0KGluZGV4KTsKKyAgICAgICAgICAgIHNldFZvbHVtZUN1cnZlKGNhdCwgcmVmZXJlbmNlQ3VydmVzLmdldE9yaWdpblZvbHVtZUN1cnZlKGNhdCkpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgc3RhdHVzX3QgcmVzdG9yZU9yaWdpblZvbHVtZUN1cnZlKCkKKyAgICB7CisgICAgICAgIHJldHVybiBzd2l0Y2hDdXJ2ZXNGcm9tKCp0aGlzKTsKKyAgICB9CisKKyAgICBjb25zdCBzcDxWb2x1bWVDdXJ2ZT4gZ2V0T3JpZ2luVm9sdW1lQ3VydmUoZGV2aWNlX2NhdGVnb3J5IGRldmljZUNhdGVnb3J5KSBjb25zdAorICAgIHsKKyAgICAgICAgQUxPR19BU1NFUlQobU9yaWdpblZvbHVtZUN1cnZlcy5pbmRleE9mS2V5KGRldmljZUNhdGVnb3J5KSA+PSAwLCAiSW52YWxpZCBkZXZpY2UgY2F0ZWdvcnkiKTsKKyAgICAgICAgcmV0dXJuIG1PcmlnaW5Wb2x1bWVDdXJ2ZXMudmFsdWVGb3IoZGV2aWNlQ2F0ZWdvcnkpOworICAgIH0KKyAgICB2b2lkIHNldFZvbHVtZUN1cnZlKGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXRlZ29yeSwgY29uc3Qgc3A8Vm9sdW1lQ3VydmU+ICZ2b2x1bWVDdXJ2ZSkKKyAgICB7CisgICAgICAgIEFMT0dfQVNTRVJUKGluZGV4T2ZLZXkoZGV2aWNlQ2F0ZWdvcnkpID49IDAsICJJbnZhbGlkIGRldmljZSBjYXRlZ29yeSBmb3IgVm9sdW1lIEN1cnZlIik7CisgICAgICAgIHJlcGxhY2VWYWx1ZUZvcihkZXZpY2VDYXRlZ29yeSwgdm9sdW1lQ3VydmUpOworICAgIH0KKworICAgIHNzaXplX3QgYWRkKGNvbnN0IHNwPFZvbHVtZUN1cnZlPiAmdm9sdW1lQ3VydmUpCisgICAgeworICAgICAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnkgPSB2b2x1bWVDdXJ2ZS0+Z2V0RGV2aWNlQ2F0ZWdvcnkoKTsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IGluZGV4T2ZLZXkoZGV2aWNlQ2F0ZWdvcnkpOworICAgICAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgICAgICAvLyBLZWVwIHRyYWNrIG9mIG9yaWdpbmFsIFZvbHVtZSBDdXJ2ZXMgcGVyIGRldmljZSBjYXRlZ29yeSBpbiBvcmRlciB0byBzd2l0Y2ggY3VydmVzLgorICAgICAgICAgICAgbU9yaWdpblZvbHVtZUN1cnZlcy5hZGQoZGV2aWNlQ2F0ZWdvcnksIHZvbHVtZUN1cnZlKTsKKyAgICAgICAgICAgIHJldHVybiBLZXllZFZlY3Rvcjo6YWRkKGRldmljZUNhdGVnb3J5LCB2b2x1bWVDdXJ2ZSk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGluZGV4OworICAgIH0KKworICAgIHZpcnR1YWwgZmxvYXQgdm9sSW5kZXhUb0RiKGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXQsIGludCBpbmRleEluVWkpIGNvbnN0CisgICAgeworICAgICAgICBzcDxWb2x1bWVDdXJ2ZT4gdmMgPSBnZXRDdXJ2ZXNGb3IoZGV2aWNlQ2F0KTsKKyAgICAgICAgaWYgKHZjICE9IDApIHsKKyAgICAgICAgICAgIHJldHVybiB2Yy0+dm9sSW5kZXhUb0RiKGluZGV4SW5VaSwgbUluZGV4TWluLCBtSW5kZXhNYXgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgZGV2aWNlIGNhdGVnb3J5ICVkIGZvciBWb2x1bWUgQ3VydmUiLCBkZXZpY2VDYXQpOworICAgICAgICAgICAgcmV0dXJuIDAuMGY7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9pZCBhZGRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikKKyAgICB7CisgICAgICAgIG1BdHRyaWJ1dGVzLnB1c2hfYmFjayhhdHRyKTsKKyAgICB9CisgICAgQXR0cmlidXRlc1ZlY3RvciBnZXRBdHRyaWJ1dGVzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gbUF0dHJpYnV0ZXM7IH0KKyAgICB2b2lkIGFkZFN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCisgICAgeworICAgICAgICBtU3RyZWFtcy5wdXNoX2JhY2soc3RyZWFtKTsKKyAgICB9CisgICAgU3RyZWFtVHlwZVZlY3RvciBnZXRTdHJlYW1UeXBlcygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIG1TdHJlYW1zOyB9CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCwgYm9vbCBjdXJ2ZVBvaW50cyA9IGZhbHNlKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBLZXllZFZlY3RvcjxkZXZpY2VfY2F0ZWdvcnksIHNwPFZvbHVtZUN1cnZlPiA+IG1PcmlnaW5Wb2x1bWVDdXJ2ZXM7CisgICAgc3RkOjptYXA8YXVkaW9fZGV2aWNlc190LCBpbnQ+IG1JbmRleEN1cjsgLyoqPCBjdXJyZW50IHZvbHVtZSBpbmRleCBwZXIgZGV2aWNlLiAqLworICAgIGludCBtSW5kZXhNaW47IC8qKjwgbWluIHZvbHVtZSBpbmRleC4gKi8KKyAgICBpbnQgbUluZGV4TWF4OyAvKio8IG1heCB2b2x1bWUgaW5kZXguICovCisgICAgY29uc3QgYm9vbCBtQ2FuQmVNdXRlZCA9IHRydWU7IC8qKjwgdHJ1ZSBpcyB0aGUgc3RyZWFtIGNhbiBiZSBtdXRlZC4gKi8KKworICAgIEF0dHJpYnV0ZXNWZWN0b3IgbUF0dHJpYnV0ZXM7CisgICAgU3RyZWFtVHlwZVZlY3RvciBtU3RyZWFtczsgLyoqPCBLZWVwIGl0IGZvciBsZWdhY3kuICovCit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvVm9sdW1lR3JvdXAuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vaW5jbHVkZS9Wb2x1bWVHcm91cC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNzhmNjQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL2luY2x1ZGUvVm9sdW1lR3JvdXAuaApAQCAtMCwwICsxLDYxIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxWb2x1bWVDdXJ2ZS5oPgorI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgorI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KKyNpbmNsdWRlIDxIYW5kbGVHZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBWb2x1bWVHcm91cCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UsIHByaXZhdGUgSGFuZGxlR2VuZXJhdG9yPHVpbnQzMl90PgoreworcHVibGljOgorICAgIFZvbHVtZUdyb3VwKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCk7CisgICAgc3RkOjpzdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9CisgICAgdm9sdW1lX2dyb3VwX3QgZ2V0SWQoKSBjb25zdCB7IHJldHVybiBtSWQ7IH0KKworICAgIHZvaWQgYWRkKGNvbnN0IHNwPFZvbHVtZUN1cnZlPiAmY3VydmUpOworCisgICAgVm9sdW1lQ3VydmVzICpnZXRWb2x1bWVDdXJ2ZXMoKSB7IHJldHVybiAmbUdyb3VwVm9sdW1lQ3VydmVzOyB9CisKKyAgICB2b2lkIGFkZFN1cHBvcnRlZEF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKTsKKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGdldFN1cHBvcnRlZEF0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBtR3JvdXBWb2x1bWVDdXJ2ZXMuZ2V0QXR0cmlidXRlcygpOyB9CisKKyAgICB2b2lkIGFkZFN1cHBvcnRlZFN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7CisgICAgU3RyZWFtVHlwZVZlY3RvciBnZXRTdHJlYW1UeXBlcygpIGNvbnN0IHsgcmV0dXJuIG1Hcm91cFZvbHVtZUN1cnZlcy5nZXRTdHJlYW1UeXBlcygpOyB9CisKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCkgY29uc3Q7CisKK3ByaXZhdGU6CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbU5hbWU7CisgICAgY29uc3Qgdm9sdW1lX2dyb3VwX3QgbUlkOworICAgIFZvbHVtZUN1cnZlcyBtR3JvdXBWb2x1bWVDdXJ2ZXM7Cit9OworCitjbGFzcyBWb2x1bWVHcm91cE1hcCA6IHB1YmxpYyBzdGQ6Om1hcDx2b2x1bWVfZ3JvdXBfdCwgc3A8Vm9sdW1lR3JvdXA+ID4KK3sKK3B1YmxpYzoKKyAgICB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzID0gMCkgY29uc3Q7Cit9OworCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVCYXNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZUJhc2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0NmE1MGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVCYXNlLmNwcApAQCAtMCwwICsxLDM5OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZS9CYXNlIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiRW5naW5lQmFzZS5oIgorI2luY2x1ZGUgIkVuZ2luZURlZmF1bHRDb25maWcuaCIKKyNpbmNsdWRlIDxUeXBlQ29udmVydGVyLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgeworCit2b2lkIEVuZ2luZUJhc2U6OnNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcikKK3sKKyAgICBBTE9HX0FTU0VSVChvYnNlcnZlciAhPSBOVUxMLCAiSW52YWxpZCBBdWRpbyBQb2xpY3kgTWFuYWdlciBvYnNlcnZlciIpOworICAgIG1BcG1PYnNlcnZlciA9IG9ic2VydmVyOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjppbml0Q2hlY2soKQoreworICAgIHJldHVybiAobUFwbU9ic2VydmVyICE9IG51bGxwdHIpPyBOT19FUlJPUiA6IE5PX0lOSVQ7Cit9CisKK3N0YXR1c190IEVuZ2luZUJhc2U6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKQoreworICAgIEFMT0dWKCJzZXRQaG9uZVN0YXRlKCkgc3RhdGUgJWQiLCBzdGF0ZSk7CisKKyAgICBpZiAoc3RhdGUgPCAwIHx8IHVpbnQzMl90KHN0YXRlKSA+PSBBVURJT19NT0RFX0NOVCkgeworICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIGludmFsaWQgc3RhdGUgJWQiLCBzdGF0ZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgaWYgKHN0YXRlID09IG1QaG9uZVN0YXRlICkgeworICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIHNldHRpbmcgc2FtZSBzdGF0ZSAlZCIsIHN0YXRlKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBzdG9yZSBwcmV2aW91cyBwaG9uZSBzdGF0ZSBmb3IgbWFuYWdlbWVudCBvZiBzb25pZmljYXRpb24gc3RyYXRlZ3kgYmVsb3cKKyAgICBpbnQgb2xkU3RhdGUgPSBtUGhvbmVTdGF0ZTsKKyAgICBtUGhvbmVTdGF0ZSA9IHN0YXRlOworCisgICAgaWYgKCFpc19zdGF0ZV9pbl9jYWxsKG9sZFN0YXRlKSAmJiBpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKSkgeworICAgICAgICBBTE9HVigiICBFbnRlcmluZyBjYWxsIGluIHNldFBob25lU3RhdGUoKSIpOworICAgICAgICBzd2l0Y2hWb2x1bWVDdXJ2ZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgQVVESU9fU1RSRUFNX0RUTUYpOworICAgIH0gZWxzZSBpZiAoaXNfc3RhdGVfaW5fY2FsbChvbGRTdGF0ZSkgJiYgIWlzX3N0YXRlX2luX2NhbGwoc3RhdGUpKSB7CisgICAgICAgIEFMT0dWKCIgIEV4aXRpbmcgY2FsbCBpbiBzZXRQaG9uZVN0YXRlKCkiKTsKKyAgICAgICAgcmVzdG9yZU9yaWdpblZvbHVtZUN1cnZlKEFVRElPX1NUUkVBTV9EVE1GKTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpCit7CisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSBkZXZEZXNjLT50eXBlKCk7CisgICAgaWYgKChkZXZpY2VUeXBlICE9IEFVRElPX0RFVklDRV9OT05FKSAmJiBhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZVR5cGUpKSB7CisgICAgICAgIG1MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLnNldFJlbW92YWJsZU1lZGlhRGV2aWNlcyhkZXZEZXNjLCBzdGF0ZSk7CisgICAgfQorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitwcm9kdWN0X3N0cmF0ZWd5X3QgRW5naW5lQmFzZTo6Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Qcm9kdWN0U3RyYXRlZ2llcy5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGF0dHIpOworfQorCithdWRpb19zdHJlYW1fdHlwZV90IEVuZ2luZUJhc2U6OmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QKK3sKKyAgICByZXR1cm4gbVByb2R1Y3RTdHJhdGVnaWVzLmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKGF0dHIpOworfQorCithdWRpb19hdHRyaWJ1dGVzX3QgRW5naW5lQmFzZTo6Z2V0QXR0cmlidXRlc0ZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Qcm9kdWN0U3RyYXRlZ2llcy5nZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShzdHJlYW0pOworfQorCitwcm9kdWN0X3N0cmF0ZWd5X3QgRW5naW5lQmFzZTo6Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXMuZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKHN0cmVhbSk7Cit9CisKK3Byb2R1Y3Rfc3RyYXRlZ3lfdCBFbmdpbmVCYXNlOjpnZXRQcm9kdWN0U3RyYXRlZ3lCeU5hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVByb2R1Y3RTdHJhdGVnaWVzKSB7CisgICAgICAgIGlmIChpdGVyLnNlY29uZC0+Z2V0TmFtZSgpID09IG5hbWUpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVyLnNlY29uZC0+Z2V0SWQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gUFJPRFVDVF9TVFJBVEVHWV9OT05FOworfQorCitlbmdpbmVDb25maWc6OlBhcnNpbmdSZXN1bHQgRW5naW5lQmFzZTo6bG9hZEF1ZGlvUG9saWN5RW5naW5lQ29uZmlnKCkKK3sKKyAgICBhdXRvIGxvYWRWb2x1bWVDb25maWcgPSBbXShhdXRvICZ2b2x1bWVHcm91cHMsIGF1dG8gJnZvbHVtZUNvbmZpZykgeworICAgICAgICAvLyBFbnN1cmUgbmFtZSB1bmljaXR5IHRvIHByZXZlbnQgZHVwbGljYXRlCisgICAgICAgIGNvbnN0IGF1dG8gJml0ZXIgPSBzdGQ6OmZpbmRfaWYoc3RkOjpiZWdpbih2b2x1bWVHcm91cHMpLCBzdGQ6OmVuZCh2b2x1bWVHcm91cHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmdm9sdW1lQ29uZmlnXShjb25zdCBhdXRvICZ2b2x1bWVHcm91cCkgeworICAgICAgICAgICAgICAgIHJldHVybiB2b2x1bWVDb25maWcubmFtZSA9PSB2b2x1bWVHcm91cC5zZWNvbmQtPmdldE5hbWUoKTsgfSk7CisgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaXRlciAhPSBzdGQ6OmVuZCh2b2x1bWVHcm91cHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncm91cCBuYW1lICVzIGRlZmluZWQgdHdpY2UsIHJldmlldyB0aGUgY29uZmlndXJhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lQ29uZmlnLm5hbWUuY19zdHIoKSk7CisKKyAgICAgICAgc3A8Vm9sdW1lR3JvdXA+IHZvbHVtZUdyb3VwID0gbmV3IFZvbHVtZUdyb3VwKHZvbHVtZUNvbmZpZy5uYW1lLCB2b2x1bWVDb25maWcuaW5kZXhNaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVDb25maWcuaW5kZXhNYXgpOworICAgICAgICB2b2x1bWVHcm91cHNbdm9sdW1lR3JvdXAtPmdldElkKCldID0gdm9sdW1lR3JvdXA7CisKKyAgICAgICAgZm9yIChhdXRvICZjb25maWdDdXJ2ZSA6IHZvbHVtZUNvbmZpZy52b2x1bWVDdXJ2ZXMpIHsKKyAgICAgICAgICAgIGRldmljZV9jYXRlZ29yeSBkZXZpY2VDYXQgPSBERVZJQ0VfQ0FURUdPUllfU1BFQUtFUjsKKyAgICAgICAgICAgIGlmICghRGV2aWNlQ2F0ZWdvcnlDb252ZXJ0ZXI6OmZyb21TdHJpbmcoY29uZmlnQ3VydmUuZGV2aWNlQ2F0ZWdvcnksIGRldmljZUNhdCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXMiLCBfX0ZVTkNUSU9OX18sIGNvbmZpZ0N1cnZlLmRldmljZUNhdGVnb3J5LmNfc3RyKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8Vm9sdW1lQ3VydmU+IGN1cnZlID0gbmV3IFZvbHVtZUN1cnZlKGRldmljZUNhdCk7CisgICAgICAgICAgICBmb3IgKGF1dG8gJnBvaW50IDogY29uZmlnQ3VydmUuY3VydmVQb2ludHMpIHsKKyAgICAgICAgICAgICAgICBjdXJ2ZS0+YWRkKHtwb2ludC5pbmRleCwgcG9pbnQuYXR0ZW51YXRpb25Jbk1ifSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2b2x1bWVHcm91cC0+YWRkKGN1cnZlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdm9sdW1lR3JvdXA7CisgICAgfTsKKyAgICBhdXRvIGFkZFN1cHBvcnRlZEF0dHJpYnV0ZXNUb0dyb3VwID0gW10oYXV0byAmZ3JvdXAsIGF1dG8gJnZvbHVtZUdyb3VwLCBhdXRvICZzdHJhdGVneSkgeworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHIgOiBncm91cC5hdHRyaWJ1dGVzVmVjdCkgeworICAgICAgICAgICAgc3RyYXRlZ3ktPmFkZEF0dHJpYnV0ZXMoe2dyb3VwLnN0cmVhbSwgdm9sdW1lR3JvdXAtPmdldElkKCksIGF0dHJ9KTsKKyAgICAgICAgICAgIHZvbHVtZUdyb3VwLT5hZGRTdXBwb3J0ZWRBdHRyaWJ1dGVzKGF0dHIpOworICAgICAgICB9CisgICAgfTsKKyAgICBhdXRvIGNoZWNrU3RyZWFtRm9yR3JvdXBzID0gW10oYXV0byBzdHJlYW1UeXBlLCBjb25zdCBhdXRvICZ2b2x1bWVHcm91cHMpIHsKKyAgICAgICAgY29uc3QgYXV0byAmaXRlciA9IHN0ZDo6ZmluZF9pZihzdGQ6OmJlZ2luKHZvbHVtZUdyb3VwcyksIHN0ZDo6ZW5kKHZvbHVtZUdyb3VwcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzdHJlYW1UeXBlXShjb25zdCBhdXRvICZ2b2x1bWVHcm91cCkgeworICAgICAgICAgICAgY29uc3QgYXV0byYgc3RyZWFtcyA9IHZvbHVtZUdyb3VwLnNlY29uZC0+Z2V0U3RyZWFtVHlwZXMoKTsKKyAgICAgICAgICAgIHJldHVybiBzdGQ6OmZpbmQoc3RkOjpiZWdpbihzdHJlYW1zKSwgc3RkOjplbmQoc3RyZWFtcyksIHN0cmVhbVR5cGUpICE9CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZW5kKHN0cmVhbXMpOworICAgICAgICB9KTsKKyAgICAgICAgcmV0dXJuIGl0ZXIgIT0gZW5kKHZvbHVtZUdyb3Vwcyk7CisgICAgfTsKKworICAgIGF1dG8gcmVzdWx0ID0gZW5naW5lQ29uZmlnOjpwYXJzZSgpOworICAgIGlmIChyZXN1bHQucGFyc2VkQ29uZmlnID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1coIiVzOiBObyBjb25maWd1cmF0aW9uIGZvdW5kLCB1c2luZyBkZWZhdWx0IG1hdGNoaW5nIHBob25lIGV4cGVyaWVuY2UuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZW5naW5lQ29uZmlnOjpDb25maWcgY29uZmlnID0gZ0RlZmF1bHRFbmdpbmVDb25maWc7CisgICAgICAgIGFuZHJvaWQ6OnN0YXR1c190IHJldCA9IGVuZ2luZUNvbmZpZzo6cGFyc2VMZWdhY3lWb2x1bWVzKGNvbmZpZy52b2x1bWVHcm91cHMpOworICAgICAgICByZXN1bHQgPSB7c3RkOjptYWtlX3VuaXF1ZTxlbmdpbmVDb25maWc6OkNvbmZpZz4oY29uZmlnKSwKKyAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHNpemVfdD4ocmV0ID09IE5PX0VSUk9SID8gMCA6IDEpfTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBBcHBlbmQgZm9yIGludGVybmFsIHVzZSBvbmx5IHZvbHVtZSBncm91cHMgKGUuZy4gcmVyb3V0aW5nL3BhdGNoKQorICAgICAgICByZXN1bHQucGFyc2VkQ29uZmlnLT52b2x1bWVHcm91cHMuaW5zZXJ0KAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmVuZChyZXN1bHQucGFyc2VkQ29uZmlnLT52b2x1bWVHcm91cHMpLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmJlZ2luKGdTeXN0ZW1Wb2x1bWVHcm91cHMpLCBzdGQ6OmVuZChnU3lzdGVtVm9sdW1lR3JvdXBzKSk7CisgICAgfQorICAgIC8vIEFwcGVuZCBmb3IgaW50ZXJuYWwgdXNlIG9ubHkgc3RyYXRlZ2llcyAoZS5nLiByZXJvdXRpbmcvcGF0Y2gpCisgICAgcmVzdWx0LnBhcnNlZENvbmZpZy0+cHJvZHVjdFN0cmF0ZWdpZXMuaW5zZXJ0KAorICAgICAgICAgICAgICAgIHN0ZDo6ZW5kKHJlc3VsdC5wYXJzZWRDb25maWctPnByb2R1Y3RTdHJhdGVnaWVzKSwKKyAgICAgICAgICAgICAgICBzdGQ6OmJlZ2luKGdPcmRlcmVkU3lzdGVtU3RyYXRlZ2llcyksIHN0ZDo6ZW5kKGdPcmRlcmVkU3lzdGVtU3RyYXRlZ2llcykpOworCisKKyAgICBBTE9HRV9JRihyZXN1bHQubmJTa2lwcGVkRWxlbWVudCAhPSAwLCAic2tpcHBlZCAlenUgZWxlbWVudHMiLCByZXN1bHQubmJTa2lwcGVkRWxlbWVudCk7CisKKyAgICBlbmdpbmVDb25maWc6OlZvbHVtZUdyb3VwIGRlZmF1bHRWb2x1bWVDb25maWc7CisgICAgZW5naW5lQ29uZmlnOjpWb2x1bWVHcm91cCBkZWZhdWx0U3lzdGVtVm9sdW1lQ29uZmlnOworICAgIGZvciAoYXV0byAmdm9sdW1lQ29uZmlnIDogcmVzdWx0LnBhcnNlZENvbmZpZy0+dm9sdW1lR3JvdXBzKSB7CisgICAgICAgIC8vIHNhdmUgZGVmYXVsdCB2b2x1bWUgY29uZmlnIGZvciBzdHJlYW1zIG5vdCBkZWZpbmVkIGluIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgaWYgKHZvbHVtZUNvbmZpZy5uYW1lLmNvbXBhcmUoIkFVRElPX1NUUkVBTV9NVVNJQyIpID09IDApIHsKKyAgICAgICAgICAgIGRlZmF1bHRWb2x1bWVDb25maWcgPSB2b2x1bWVDb25maWc7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZvbHVtZUNvbmZpZy5uYW1lLmNvbXBhcmUoIkFVRElPX1NUUkVBTV9QQVRDSCIpID09IDApIHsKKyAgICAgICAgICAgIGRlZmF1bHRTeXN0ZW1Wb2x1bWVDb25maWcgPSB2b2x1bWVDb25maWc7CisgICAgICAgIH0KKyAgICAgICAgbG9hZFZvbHVtZUNvbmZpZyhtVm9sdW1lR3JvdXBzLCB2b2x1bWVDb25maWcpOworICAgIH0KKyAgICBmb3IgKGF1dG8mIHN0cmF0ZWd5Q29uZmlnIDogcmVzdWx0LnBhcnNlZENvbmZpZy0+cHJvZHVjdFN0cmF0ZWdpZXMpIHsKKyAgICAgICAgc3A8UHJvZHVjdFN0cmF0ZWd5PiBzdHJhdGVneSA9IG5ldyBQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3lDb25maWcubmFtZSk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmZ3JvdXAgOiBzdHJhdGVneUNvbmZpZy5hdHRyaWJ1dGVzR3JvdXBzKSB7CisgICAgICAgICAgICBjb25zdCBhdXRvICZpdGVyID0gc3RkOjpmaW5kX2lmKGJlZ2luKG1Wb2x1bWVHcm91cHMpLCBlbmQobVZvbHVtZUdyb3VwcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmZ3JvdXBdKGNvbnN0IGF1dG8gJnZvbHVtZUdyb3VwKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBncm91cC52b2x1bWVHcm91cCA9PSB2b2x1bWVHcm91cC5zZWNvbmQtPmdldE5hbWUoKTsgfSk7CisgICAgICAgICAgICBzcDxWb2x1bWVHcm91cD4gdm9sdW1lR3JvdXAgPSBudWxscHRyOworICAgICAgICAgICAgLy8gSWYgbm8gdm9sdW1lIGdyb3VwIHByb3ZpZGVkIGZvciB0aGlzIHN0cmF0ZWd5LCBjcmVhdGVzIGEgbmV3IG9uZSB1c2luZworICAgICAgICAgICAgLy8gTXVzaWMgVm9sdW1lIEdyb3VwIGNvbmZpZ3VyYXRpb24gKGNvbnNpZGVyZWQgYXMgdGhlIGRlZmF1bHQpCisgICAgICAgICAgICBpZiAoaXRlciA9PSBlbmQobVZvbHVtZUdyb3VwcykpIHsKKyAgICAgICAgICAgICAgICBlbmdpbmVDb25maWc6OlZvbHVtZUdyb3VwIHZvbHVtZUNvbmZpZzsKKyAgICAgICAgICAgICAgICBpZiAoZ3JvdXAuc3RyZWFtID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7CisgICAgICAgICAgICAgICAgICAgIHZvbHVtZUNvbmZpZyA9IGRlZmF1bHRTeXN0ZW1Wb2x1bWVDb25maWc7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgdm9sdW1lQ29uZmlnID0gZGVmYXVsdFZvbHVtZUNvbmZpZzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgQUxPR1coIiVzOiBObyBjb25maWd1cmF0aW9uIG9mICVzIGZvdW5kLCB1c2luZyBkZWZhdWx0IHZvbHVtZSBjb25maWd1cmF0aW9uIgorICAgICAgICAgICAgICAgICAgICAgICAgLCBfX0ZVTkNUSU9OX18sIGdyb3VwLnZvbHVtZUdyb3VwLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHZvbHVtZUNvbmZpZy5uYW1lID0gZ3JvdXAudm9sdW1lR3JvdXA7CisgICAgICAgICAgICAgICAgdm9sdW1lR3JvdXAgPSBsb2FkVm9sdW1lQ29uZmlnKG1Wb2x1bWVHcm91cHMsIHZvbHVtZUNvbmZpZyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHZvbHVtZUdyb3VwID0gaXRlci0+c2Vjb25kOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGdyb3VwLnN0cmVhbSAhPSBBVURJT19TVFJFQU1fREVGQVVMVCkgeworICAgICAgICAgICAgICAgIC8vIEEgbGVnYWN5IHN0cmVhbSBjYW4gYmUgYXNzaWduZWQgb25jZSB0byBhIHZvbHVtZSBncm91cAorICAgICAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoY2hlY2tTdHJlYW1Gb3JHcm91cHMoZ3JvdXAuc3RyZWFtLCBtVm9sdW1lR3JvdXBzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJlYW0gJXMgYWxyZWFkeSBhc3NpZ25lZCB0byBhIHZvbHVtZSBncm91cCwgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJldmlldyB0aGUgY29uZmlndXJhdGlvbiIsIHRvU3RyaW5nKGdyb3VwLnN0cmVhbSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgdm9sdW1lR3JvdXAtPmFkZFN1cHBvcnRlZFN0cmVhbShncm91cC5zdHJlYW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkU3VwcG9ydGVkQXR0cmlidXRlc1RvR3JvdXAoZ3JvdXAsIHZvbHVtZUdyb3VwLCBzdHJhdGVneSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5SWQgPSBzdHJhdGVneS0+Z2V0SWQoKTsKKyAgICAgICAgbVByb2R1Y3RTdHJhdGVnaWVzW3N0cmF0ZWd5SWRdID0gc3RyYXRlZ3k7CisgICAgfQorICAgIG1Qcm9kdWN0U3RyYXRlZ2llcy5pbml0aWFsaXplKCk7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworU3RyYXRlZ3lWZWN0b3IgRW5naW5lQmFzZTo6Z2V0T3JkZXJlZFByb2R1Y3RTdHJhdGVnaWVzKCkgY29uc3QKK3sKKyAgICBhdXRvIGZpbmRCeUZsYWcgPSBbXShjb25zdCBhdXRvICZwcm9kdWN0U3RyYXRlZ2llcywgYXV0byBmbGFnKSB7CisgICAgICAgIHJldHVybiBzdGQ6OmZpbmRfaWYoYmVnaW4ocHJvZHVjdFN0cmF0ZWdpZXMpLCBlbmQocHJvZHVjdFN0cmF0ZWdpZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsmXShjb25zdCBhdXRvICZzdHJhdGVneSkgeworICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZhdHRyaWJ1dGVzIDogc3RyYXRlZ3kuc2Vjb25kLT5nZXRBdWRpb0F0dHJpYnV0ZXMoKSkgeworICAgICAgICAgICAgICAgIGlmICgoYXR0cmlidXRlcy5mbGFncyAmIGZsYWcpID09IGZsYWcpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9KTsKKyAgICB9OworICAgIGF1dG8gc3RyYXRlZ2llcyA9IG1Qcm9kdWN0U3RyYXRlZ2llczsKKyAgICBhdXRvIGVuZm9yY2VkQXVkaWJsZVN0cmF0ZWd5SXRlciA9IGZpbmRCeUZsYWcoc3RyYXRlZ2llcywgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKTsKKworICAgIGlmIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCAmJgorICAgICAgICAgICAgZW5mb3JjZWRBdWRpYmxlU3RyYXRlZ3lJdGVyICE9IHN0cmF0ZWdpZXMuZW5kKCkpIHsKKyAgICAgICAgYXV0byBlbmZvcmNlZEF1ZGlibGVTdHJhdGVneSA9ICplbmZvcmNlZEF1ZGlibGVTdHJhdGVneUl0ZXI7CisgICAgICAgIHN0cmF0ZWdpZXMuZXJhc2UoZW5mb3JjZWRBdWRpYmxlU3RyYXRlZ3lJdGVyKTsKKyAgICAgICAgc3RyYXRlZ2llcy5pbnNlcnQoYmVnaW4oc3RyYXRlZ2llcyksIGVuZm9yY2VkQXVkaWJsZVN0cmF0ZWd5KTsKKyAgICB9CisgICAgU3RyYXRlZ3lWZWN0b3Igb3JkZXJlZFN0cmF0ZWdpZXM7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogc3RyYXRlZ2llcykgeworICAgICAgICBvcmRlcmVkU3RyYXRlZ2llcy5wdXNoX2JhY2soaXRlci5zZWNvbmQtPmdldElkKCkpOworICAgIH0KKyAgICByZXR1cm4gb3JkZXJlZFN0cmF0ZWdpZXM7Cit9CisKK1N0cmVhbVR5cGVWZWN0b3IgRW5naW5lQmFzZTo6Z2V0U3RyZWFtVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdAoreworICAgIC8vIEBUT0RPIGRlZmF1bHQgbXVzaWMgc3RyZWFtIHRvIGNvbnRyb2wgdm9sdW1lIGlmIG5vIGdyb3VwPworICAgIHJldHVybiAobVByb2R1Y3RTdHJhdGVnaWVzLmZpbmQocHMpICE9IGVuZChtUHJvZHVjdFN0cmF0ZWdpZXMpKSA/CisgICAgICAgICAgICAgICAgbVByb2R1Y3RTdHJhdGVnaWVzLmF0KHBzKS0+Z2V0U3VwcG9ydGVkU3RyZWFtcygpIDoKKyAgICAgICAgICAgICAgICBTdHJlYW1UeXBlVmVjdG9yKEFVRElPX1NUUkVBTV9NVVNJQyk7Cit9CisKK0F0dHJpYnV0ZXNWZWN0b3IgRW5naW5lQmFzZTo6Z2V0QWxsQXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMpIGNvbnN0Cit7CisgICAgcmV0dXJuIChtUHJvZHVjdFN0cmF0ZWdpZXMuZmluZChwcykgIT0gZW5kKG1Qcm9kdWN0U3RyYXRlZ2llcykpID8KKyAgICAgICAgICAgICAgICBtUHJvZHVjdFN0cmF0ZWdpZXMuYXQocHMpLT5nZXRBdWRpb0F0dHJpYnV0ZXMoKSA6IEF0dHJpYnV0ZXNWZWN0b3IoKTsKK30KKworc3RhdHVzX3QgRW5naW5lQmFzZTo6bGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVByb2R1Y3RTdHJhdGVnaWVzKSB7CisgICAgICAgIGNvbnN0IGF1dG8gJnByb2R1Y3RTdHJhdGVneSA9IGl0ZXIuc2Vjb25kOworICAgICAgICBzdHJhdGVnaWVzLnB1c2hfYmFjaygKKyAgICAgICAge3Byb2R1Y3RTdHJhdGVneS0+Z2V0TmFtZSgpLCBwcm9kdWN0U3RyYXRlZ3ktPmxpc3RBdWRpb0F0dHJpYnV0ZXMoKSwKKyAgICAgICAgIHByb2R1Y3RTdHJhdGVneS0+Z2V0SWQoKX0pOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK1ZvbHVtZUN1cnZlcyAqRW5naW5lQmFzZTo6Z2V0Vm9sdW1lQ3VydmVzRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0Cit7CisgICAgdm9sdW1lX2dyb3VwX3Qgdm9sR3IgPSBtUHJvZHVjdFN0cmF0ZWdpZXMuZ2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGF0dHIpOworICAgIGNvbnN0IGF1dG8gJml0ZXIgPSBtVm9sdW1lR3JvdXBzLmZpbmQodm9sR3IpOworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoaXRlciA9PSBzdGQ6OmVuZChtVm9sdW1lR3JvdXBzKSwgIk5vIHZvbHVtZSBncm91cHMgZm9yICVzIiwgdG9TdHJpbmcoYXR0cikuY19zdHIoKSk7CisgICAgcmV0dXJuIG1Wb2x1bWVHcm91cHMuYXQodm9sR3IpLT5nZXRWb2x1bWVDdXJ2ZXMoKTsKK30KKworVm9sdW1lQ3VydmVzICpFbmdpbmVCYXNlOjpnZXRWb2x1bWVDdXJ2ZXNGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIHZvbHVtZV9ncm91cF90IHZvbEdyID0gbVByb2R1Y3RTdHJhdGVnaWVzLmdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZShzdHJlYW0pOworICAgIGlmICh2b2xHciA9PSBWT0xVTUVfR1JPVVBfTk9ORSkgeworICAgICAgICB2b2xHciA9IG1Qcm9kdWN0U3RyYXRlZ2llcy5nZXREZWZhdWx0Vm9sdW1lR3JvdXAoKTsKKyAgICB9CisgICAgY29uc3QgYXV0byAmaXRlciA9IG1Wb2x1bWVHcm91cHMuZmluZCh2b2xHcik7CisgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpdGVyID09IHN0ZDo6ZW5kKG1Wb2x1bWVHcm91cHMpLCAiTm8gdm9sdW1lIGdyb3VwcyBmb3IgJXMiLAorICAgICAgICAgICAgICAgIHRvU3RyaW5nKHN0cmVhbSkuY19zdHIoKSk7CisgICAgcmV0dXJuIG1Wb2x1bWVHcm91cHMuYXQodm9sR3IpLT5nZXRWb2x1bWVDdXJ2ZXMoKTsKK30KKworc3RhdHVzX3QgRW5naW5lQmFzZTo6c3dpdGNoVm9sdW1lQ3VydmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1TcmMsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtRHN0KQoreworICAgIGF1dG8gc3JjQ3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzRm9yU3RyZWFtVHlwZShzdHJlYW1TcmMpOworICAgIGF1dG8gZHN0Q3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzRm9yU3RyZWFtVHlwZShzdHJlYW1Ec3QpOworCisgICAgaWYgKHNyY0N1cnZlcyA9PSBudWxscHRyIHx8IGRzdEN1cnZlcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHJldHVybiBkc3RDdXJ2ZXMtPnN3aXRjaEN1cnZlc0Zyb20oKnNyY0N1cnZlcyk7Cit9CisKK3N0YXR1c190IEVuZ2luZUJhc2U6OnJlc3RvcmVPcmlnaW5Wb2x1bWVDdXJ2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBWb2x1bWVDdXJ2ZXMgKmN1cnZlcyA9IGdldFZvbHVtZUN1cnZlc0ZvclN0cmVhbVR5cGUoc3RyZWFtKTsKKyAgICByZXR1cm4gY3VydmVzICE9IG51bGxwdHIgPyBjdXJ2ZXMtPnN3aXRjaEN1cnZlc0Zyb20oKmN1cnZlcykgOiBCQURfVkFMVUU7Cit9CisKK1ZvbHVtZUdyb3VwVmVjdG9yIEVuZ2luZUJhc2U6OmdldFZvbHVtZUdyb3VwcygpIGNvbnN0Cit7CisgICAgVm9sdW1lR3JvdXBWZWN0b3IgZ3JvdXA7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVZvbHVtZUdyb3VwcykgeworICAgICAgICBncm91cC5wdXNoX2JhY2soaXRlci5maXJzdCk7CisgICAgfQorICAgIHJldHVybiBncm91cDsKK30KKwordm9sdW1lX2dyb3VwX3QgRW5naW5lQmFzZTo6Z2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QKK3sKKyAgICByZXR1cm4gbVByb2R1Y3RTdHJhdGVnaWVzLmdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhhdHRyKTsKK30KKwordm9sdW1lX2dyb3VwX3QgRW5naW5lQmFzZTo6Z2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIHJldHVybiBtUHJvZHVjdFN0cmF0ZWdpZXMuZ2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKHN0cmVhbSk7Cit9CisKK3N0YXR1c190IEVuZ2luZUJhc2U6Omxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogbVZvbHVtZUdyb3VwcykgeworICAgICAgICBncm91cHMucHVzaF9iYWNrKHtpdGVyLnNlY29uZC0+Z2V0TmFtZSgpLCBpdGVyLnNlY29uZC0+Z2V0SWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlci5zZWNvbmQtPmdldFN1cHBvcnRlZEF0dHJpYnV0ZXMoKSwgaXRlci5zZWNvbmQtPmdldFN0cmVhbVR5cGVzKCl9KTsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjpzZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpCit7CisgICAgLy8gdmVyaWZ5IHN0cmF0ZWd5IGV4aXN0cworICAgIGlmIChtUHJvZHVjdFN0cmF0ZWdpZXMuZmluZChzdHJhdGVneSkgPT0gbVByb2R1Y3RTdHJhdGVnaWVzLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIHN0cmF0ZWd5ICV1IiwgX19mdW5jX18sIHN0cmF0ZWd5KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBtUHJvZHVjdFN0cmF0ZWd5UHJlZmVycmVkRGV2aWNlc1tzdHJhdGVneV0gPSBkZXZpY2U7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjpyZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpCit7CisgICAgLy8gdmVyaWZ5IHN0cmF0ZWd5IGV4aXN0cworICAgIGlmIChtUHJvZHVjdFN0cmF0ZWdpZXMuZmluZChzdHJhdGVneSkgPT0gbVByb2R1Y3RTdHJhdGVnaWVzLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIHN0cmF0ZWd5ICV1IiwgX19mdW5jX18sIHN0cmF0ZWd5KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAobVByb2R1Y3RTdHJhdGVneVByZWZlcnJlZERldmljZXMuZXJhc2Uoc3RyYXRlZ3kpID09IDApIHsKKyAgICAgICAgLy8gbm8gcHJlZmVycmVkIGRldmljZSB3YXMgc2V0CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBFbmdpbmVCYXNlOjpnZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpIGNvbnN0Cit7CisgICAgLy8gdmVyaWZ5IHN0cmF0ZWd5IGV4aXN0cworICAgIGlmIChtUHJvZHVjdFN0cmF0ZWdpZXMuZmluZChzdHJhdGVneSkgPT0gbVByb2R1Y3RTdHJhdGVnaWVzLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCIlcyB1bmtub3duIHN0cmF0ZWd5ICV1IiwgX19mdW5jX18sIHN0cmF0ZWd5KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgLy8gcHJlZmVycmVkIGRldmljZSBmb3IgdGhpcyBzdHJhdGVneT8KKyAgICBhdXRvIGRldkl0ID0gbVByb2R1Y3RTdHJhdGVneVByZWZlcnJlZERldmljZXMuZmluZChzdHJhdGVneSk7CisgICAgaWYgKGRldkl0ID09IG1Qcm9kdWN0U3RyYXRlZ3lQcmVmZXJyZWREZXZpY2VzLmVuZCgpKSB7CisgICAgICAgIEFMT0dWKCIlcyBubyBwcmVmZXJyZWQgZGV2aWNlIGZvciBzdHJhdGVneSAldSIsIF9fZnVuY19fLCBzdHJhdGVneSk7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICBkZXZpY2UgPSBkZXZJdC0+c2Vjb25kOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBFbmdpbmVCYXNlOjpkdW1wKFN0cmluZzggKmRzdCkgY29uc3QKK3sKKyAgICBtUHJvZHVjdFN0cmF0ZWdpZXMuZHVtcChkc3QsIDIpOworICAgIG1Qcm9kdWN0U3RyYXRlZ3lQcmVmZXJyZWREZXZpY2VzLmR1bXAoZHN0LCAyKTsKKyAgICBtVm9sdW1lR3JvdXBzLmR1bXAoZHN0LCAyKTsKK30KKworfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5Cit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVEZWZhdWx0Q29uZmlnLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9FbmdpbmVEZWZhdWx0Q29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTMwNzFkNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL0VuZ2luZURlZmF1bHRDb25maWcuaApAQCAtMCwwICsxLDE3NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKy8qKgorICogQGJyaWVmIEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMgaGFyZCBjb2RlZCBhcnJheSBvZiBzdHJhdGVnaWVzIHRvIGZpbGwgbmV3IGVuZ2luZSBBUEkgY29udHJhY3QuCisgKi8KK2NvbnN0IGVuZ2luZUNvbmZpZzo6UHJvZHVjdFN0cmF0ZWdpZXMgZ09yZGVyZWRTdHJhdGVnaWVzID0geworICAgIHsiU1RSQVRFR1lfUEhPTkUiLAorICAgICB7CisgICAgICAgICB7InBob25lIiwgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwsICJBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCIsCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsCisgICAgICAgICAgICAiIn19LAorICAgICAgICAgfSwKKyAgICAgICAgIHsic2NvIiwgQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08sICJBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyIsCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsIEFVRElPX0ZMQUdfU0NPLAorICAgICAgICAgICAgIiJ9fSwKKyAgICAgICAgIH0KKyAgICAgfSwKKyAgICB9LAorICAgIHsiU1RSQVRFR1lfU09OSUZJQ0FUSU9OIiwKKyAgICAgeworICAgICAgICAgeyJyaW5nIiwgQVVESU9fU1RSRUFNX1JJTkcsICJBVURJT19TVFJFQU1fUklORyIsCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORSwKKyAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19CisgICAgICAgICB9LAorICAgICAgICAgeyJhbGFybSIsIEFVRElPX1NUUkVBTV9BTEFSTSwgIkFVRElPX1NUUkVBTV9BTEFSTSIsCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfQUxBUk0sIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19LAorICAgICAgICAgfQorICAgICB9LAorICAgIH0sCisgICAgeyJTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFIiwKKyAgICAgeworICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSwgIkFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFIiwKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLCBBVURJT19TT1VSQ0VfREVGQVVMVCwKKyAgICAgICAgICAgIEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCwgIiJ9fQorICAgICAgICAgfQorICAgICB9LAorICAgIH0sCisgICAgeyJTVFJBVEVHWV9BQ0NFU1NJQklMSVRZIiwKKyAgICAgeworICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSwgIkFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIiwKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFksCisgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9fQorICAgICAgICAgfQorICAgICB9LAorICAgIH0sCisgICAgeyJTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCIsCisgICAgIHsKKyAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX05PVElGSUNBVElPTiwgIkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iLAorICAgICAgICAgIHsKKyAgICAgICAgICAgICAge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT04sIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVCwKKyAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVCwKKyAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCwKKyAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5ULAorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifQorICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgfSwKKyAgICB9LAorICAgIHsiU1RSQVRFR1lfTUVESUEiLAorICAgICB7CisgICAgICAgICB7ImFzc2lzdGFudCIsIEFVRElPX1NUUkVBTV9BU1NJU1RBTlQsICJBVURJT19TVFJFQU1fQVNTSVNUQU5UIiwKKyAgICAgICAgICB7e0FVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0gsIEFVRElPX1VTQUdFX0FTU0lTVEFOVCwKKyAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19CisgICAgICAgICB9LAorICAgICAgICAgeyJtdXNpYyIsIEFVRElPX1NUUkVBTV9NVVNJQywgIkFVRElPX1NUUkVBTV9NVVNJQyIsCisgICAgICAgICAgeworICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX01FRElBLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0dBTUUsIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfQVNTSVNUQU5ULCBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSwKKyAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifQorICAgICAgICAgIH0sCisgICAgICAgICB9LAorICAgICAgICAgeyJzeXN0ZW0iLCBBVURJT19TVFJFQU1fU1lTVEVNLCAiQVVESU9fU1RSRUFNX1NZU1RFTSIsCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04sCisgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9fQorICAgICAgICAgfQorICAgICB9LAorICAgIH0sCisgICAgeyJTVFJBVEVHWV9EVE1GIiwKKyAgICAgeworICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fRFRNRiwgIkFVRElPX1NUUkVBTV9EVE1GIiwKKyAgICAgICAgICB7CisgICAgICAgICAgICAgIHtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HLAorICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifQorICAgICAgICAgIH0KKyAgICAgICAgIH0KKyAgICAgfSwKKyAgICB9LAorICAgIHsiU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSIiwKKyAgICAgeworICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fVFRTLCAiQVVESU9fU1RSRUFNX1RUUyIsCisgICAgICAgICAge3tBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwgQVVESU9fU09VUkNFX0RFRkFVTFQsCisgICAgICAgICAgICBBVURJT19GTEFHX0JFQUNPTiwgIiJ9fQorICAgICAgICAgfQorICAgICB9LAorICAgIH0KK307CisKKy8qKgorICogRm9yIEludGVybmFsIHVzZSBvZiByZXNwZWN0aXZlbHkgYXVkaW8gcG9saWN5IGFuZCBhdWRpb2ZsaW5nZXIKKyAqIEZvciBjb21wYXRpYmlsaXR5IHJlYXNvbiB3aHkgYXBtIHZvbHVtZSBjb25maWcgZmlsZSwgdm9sdW1lIGdyb3VwIG5hbWUgaXMgdGhlIHN0cmVhbSB0eXBlLgorICovCitjb25zdCBlbmdpbmVDb25maWc6OlByb2R1Y3RTdHJhdGVnaWVzIGdPcmRlcmVkU3lzdGVtU3RyYXRlZ2llcyA9IHsKKyAgICB7InJlcm91dGluZyIsCisgICAgIHsKKyAgICAgICAgIHsiIiwgQVVESU9fU1RSRUFNX1JFUk9VVElORywgIkFVRElPX1NUUkVBTV9SRVJPVVRJTkciLAorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19CisgICAgICAgICB9CisgICAgIH0sCisgICAgfSwKKyAgICB7InBhdGNoIiwKKyAgICAgeworICAgICAgICAgeyIiLCBBVURJT19TVFJFQU1fUEFUQ0gsICJBVURJT19TVFJFQU1fUEFUQ0giLAorICAgICAgICAgIHt7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn19CisgICAgICAgICB9CisgICAgIH0sCisgICAgfQorfTsKK2NvbnN0IGVuZ2luZUNvbmZpZzo6Vm9sdW1lR3JvdXBzIGdTeXN0ZW1Wb2x1bWVHcm91cHMgPSB7CisgICAgeyJBVURJT19TVFJFQU1fUkVST1VUSU5HIiwgMCwgMSwKKyAgICAgeworICAgICAgICAgeyJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIsIHt7MCwwfSwgezEwMCwgMH19fSwKKyAgICAgICAgIHsiREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiLCB7ezAsMH0sIHsxMDAsIDB9fX0sCisgICAgICAgICB7IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIsIHt7MCwwfSwgezEwMCwgMH19fSwKKyAgICAgICAgIHsiREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIsIHt7MCwwfSwgezEwMCwgMH19fSwKKyAgICAgICAgIHsiREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiwge3swLDB9LCB7MTAwLCAwfX19LAorCisgICAgIH0KKyAgICB9LAorICAgIHsiQVVESU9fU1RSRUFNX1BBVENIIiwgMCwgMSwKKyAgICAgeworICAgICAgICAgeyJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIsIHt7MCwwfSwgezEwMCwgMH19fSwKKyAgICAgICAgIHsiREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiLCB7ezAsMH0sIHsxMDAsIDB9fX0sCisgICAgICAgICB7IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIsIHt7MCwwfSwgezEwMCwgMH19fSwKKyAgICAgICAgIHsiREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIsIHt7MCwwfSwgezEwMCwgMH19fSwKKyAgICAgICAgIHsiREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiwge3swLDB9LCB7MTAwLCAwfX19LAorCisgICAgIH0KKyAgICB9Cit9OworCitjb25zdCBlbmdpbmVDb25maWc6OkNvbmZpZyBnRGVmYXVsdEVuZ2luZUNvbmZpZyA9IHsKKyAgICAxLjAsCisgICAgZ09yZGVyZWRTdHJhdGVnaWVzLAorICAgIHt9LAorICAgIHt9LAorICAgIHt9Cit9OworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzLmNwcApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi44N2I2YWFmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcy5jcHAKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZS9MYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzIgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiTGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcy5oIgorI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCit2b2lkIExhc3RSZW1vdmFibGVNZWRpYURldmljZXM6OnNldFJlbW92YWJsZU1lZGlhRGV2aWNlcyhzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKQoreworICAgIGlmIChkZXNjID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmICgoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpICYmCisgICAgICAgICAgICAgICAgKGdldERldmljZU91dEdyb3VwKGRlc2MtPnR5cGUoKSkgIT0gR1JPVVBfTk9ORSkpIHsKKyAgICAgICAgICAgIHNldFJlbW92YWJsZU1lZGlhRGV2aWNlcyhkZXNjLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKTsKKyAgICAgICAgICAgIG1NZWRpYURldmljZXMuaW5zZXJ0KG1NZWRpYURldmljZXMuYmVnaW4oKSwge2Rlc2MsIGdldERldmljZU91dEdyb3VwKGRlc2MtPnR5cGUoKSl9KTsKKyAgICAgICAgfSBlbHNlIGlmIChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gaXRlciA9IG1NZWRpYURldmljZXMuYmVnaW4oKTsgaXRlciAhPSBtTWVkaWFEZXZpY2VzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgICAgICAgICBpZiAoKGl0ZXItPmRlc2MpLT5lcXVhbHMoZGVzYykpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1lZGlhRGV2aWNlcy5lcmFzZShpdGVyKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGQ6OnZlY3RvcjxhdWRpb19kZXZpY2VzX3Q+IExhc3RSZW1vdmFibGVNZWRpYURldmljZXM6OmdldExhc3RSZW1vdmFibGVNZWRpYURldmljZXMoCisgICAgICAgIGRldmljZV9vdXRfZ3JvdXBfdCBncm91cCkgY29uc3QKK3sKKyAgICBzdGQ6OnZlY3RvcjxhdWRpb19kZXZpY2VzX3Q+IHJldDsKKyAgICBmb3IgKGF1dG8gaXRlciA9IG1NZWRpYURldmljZXMuYmVnaW4oKTsgaXRlciAhPSBtTWVkaWFEZXZpY2VzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgaWYgKChncm91cCA9PSBHUk9VUF9OT05FKSB8fCAoZ3JvdXAgPT0gZ2V0RGV2aWNlT3V0R3JvdXAoKGl0ZXItPmRlc2MpLT50eXBlKCkpKSkgeworICAgICAgICAgICAgcmV0LnB1c2hfYmFjaygoaXRlci0+ZGVzYyktPnR5cGUoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKworZGV2aWNlX291dF9ncm91cF90IExhc3RSZW1vdmFibGVNZWRpYURldmljZXM6OmdldERldmljZU91dEdyb3VwKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpIGNvbnN0Cit7CisgICAgc3dpdGNoIChkZXZpY2UpIHsKKyAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOgorICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9MSU5FOgorICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUOgorICAgIGNhc2UgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVDoKKyAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0FDQ0VTU09SWToKKyAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRToKKyAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQ6CisgICAgICAgIHJldHVybiBHUk9VUF9XSVJFRDsKKyAgICBjYXNlIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFA6CisgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM6CisgICAgY2FzZSBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI6CisgICAgICAgIHJldHVybiBHUk9VUF9CVF9BMkRQOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBHUk9VUF9OT05FOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvUHJvZHVjdFN0cmF0ZWd5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1Byb2R1Y3RTdHJhdGVneS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUxYzdiYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1Byb2R1Y3RTdHJhdGVneS5jcHAKQEAgLTAsMCArMSwzMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkFQTTo6QXVkaW9Qb2xpY3lFbmdpbmUvUHJvZHVjdFN0cmF0ZWd5IgorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSAiUHJvZHVjdFN0cmF0ZWd5LmgiCisKKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oPgorI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlIDxsb2cvbG9nLmg+CisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitQcm9kdWN0U3RyYXRlZ3k6OlByb2R1Y3RTdHJhdGVneShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgOgorICAgIG1OYW1lKG5hbWUpLAorICAgIG1JZChzdGF0aWNfY2FzdDxwcm9kdWN0X3N0cmF0ZWd5X3Q+KEhhbmRsZUdlbmVyYXRvcjx1aW50MzJfdD46OmdldE5leHRIYW5kbGUoKSkpCit7Cit9CisKK3ZvaWQgUHJvZHVjdFN0cmF0ZWd5OjphZGRBdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYXVkaW9BdHRyaWJ1dGVzKQoreworICAgIG1BdHRyaWJ1dGVzVmVjdG9yLnB1c2hfYmFjayhhdWRpb0F0dHJpYnV0ZXMpOworfQorCitzdGQ6OnZlY3RvcjxhbmRyb2lkOjpBdWRpb0F0dHJpYnV0ZXM+IFByb2R1Y3RTdHJhdGVneTo6bGlzdEF1ZGlvQXR0cmlidXRlcygpIGNvbnN0Cit7CisgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6QXVkaW9BdHRyaWJ1dGVzPiBhbmRyb2lkQWE7CisgICAgZm9yIChjb25zdCBhdXRvICZhdHRyIDogbUF0dHJpYnV0ZXNWZWN0b3IpIHsKKyAgICAgICAgYW5kcm9pZEFhLnB1c2hfYmFjayh7YXR0ci5tVm9sdW1lR3JvdXAsIGF0dHIubVN0cmVhbSwgYXR0ci5tQXR0cmlidXRlc30pOworICAgIH0KKyAgICByZXR1cm4gYW5kcm9pZEFhOworfQorCitBdHRyaWJ1dGVzVmVjdG9yIFByb2R1Y3RTdHJhdGVneTo6Z2V0QXVkaW9BdHRyaWJ1dGVzKCkgY29uc3QKK3sKKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGF0dHJWZWN0b3I7CisgICAgZm9yIChjb25zdCBhdXRvICZhdHRyR3JvdXAgOiBtQXR0cmlidXRlc1ZlY3RvcikgeworICAgICAgICBhdHRyVmVjdG9yLnB1c2hfYmFjayhhdHRyR3JvdXAubUF0dHJpYnV0ZXMpOworICAgIH0KKyAgICBpZiAobm90IGF0dHJWZWN0b3IuZW1wdHkoKSkgeworICAgICAgICByZXR1cm4gYXR0clZlY3RvcjsKKyAgICB9CisgICAgcmV0dXJuIHsgQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUiB9OworfQorCitib29sIFByb2R1Y3RTdHJhdGVneTo6bWF0Y2hlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cikgY29uc3QKK3sKKyAgICByZXR1cm4gc3RkOjpmaW5kX2lmKGJlZ2luKG1BdHRyaWJ1dGVzVmVjdG9yKSwgZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsmYXR0cl0oY29uc3QgYXV0byAmc3VwcG9ydGVkQXR0cikgeworICAgICAgICByZXR1cm4gQXVkaW9Qcm9kdWN0U3RyYXRlZ3k6OmF0dHJpYnV0ZXNNYXRjaGVzKHN1cHBvcnRlZEF0dHIubUF0dHJpYnV0ZXMsIGF0dHIpOworICAgIH0pICE9IGVuZChtQXR0cmlidXRlc1ZlY3Rvcik7Cit9CisKK2F1ZGlvX3N0cmVhbV90eXBlX3QgUHJvZHVjdFN0cmF0ZWd5OjpnZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcygKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdAoreworICAgIGNvbnN0IGF1dG8gJml0ZXIgPSBzdGQ6OmZpbmRfaWYoYmVnaW4obUF0dHJpYnV0ZXNWZWN0b3IpLCBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbJmF0dHJdKGNvbnN0IGF1dG8gJnN1cHBvcnRlZEF0dHIpIHsKKyAgICAgICAgcmV0dXJuIEF1ZGlvUHJvZHVjdFN0cmF0ZWd5OjphdHRyaWJ1dGVzTWF0Y2hlcyhzdXBwb3J0ZWRBdHRyLm1BdHRyaWJ1dGVzLCBhdHRyKTsgfSk7CisgICAgaWYgKGl0ZXIgPT0gZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKSkgeworICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CisgICAgfQorICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZSA9IGl0ZXItPm1TdHJlYW07CisgICAgQUxPR1dfSUYoc3RyZWFtVHlwZSA9PSBBVURJT19TVFJFQU1fREVGQVVMVCwKKyAgICAgICAgICAgICAiJXM6IFN0cmF0ZWd5ICVzIHN1cHBvcnRpbmcgYXR0cmlidXRlcyAlcyBoYXMgbm90IHN0cmVhbSB0eXBlIGFzc29jaWF0ZWQiCisgICAgICAgICAgICAgImZhbGxiYWNrIG9uIE1VU0lDLiBEbyBub3QgdXNlIHN0cmVhbSB2b2x1bWUgQVBJIiwgX19mdW5jX18sIG1OYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgdG9TdHJpbmcoYXR0cikuY19zdHIoKSk7CisgICAgcmV0dXJuIHN0cmVhbVR5cGUgIT0gQVVESU9fU1RSRUFNX0RFRkFVTFQgPyBzdHJlYW1UeXBlIDogQVVESU9fU1RSRUFNX01VU0lDOworfQorCithdWRpb19hdHRyaWJ1dGVzX3QgUHJvZHVjdFN0cmF0ZWd5OjpnZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGUpIGNvbnN0Cit7CisgICAgY29uc3QgYXV0byBpdGVyID0gc3RkOjpmaW5kX2lmKGJlZ2luKG1BdHRyaWJ1dGVzVmVjdG9yKSwgZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZzdHJlYW1UeXBlXShjb25zdCBhdXRvICZzdXBwb3J0ZWRBdHRyKSB7CisgICAgICAgIHJldHVybiBzdXBwb3J0ZWRBdHRyLm1TdHJlYW0gPT0gc3RyZWFtVHlwZTsgfSk7CisgICAgcmV0dXJuIGl0ZXIgIT0gZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKSA/IGl0ZXItPm1BdHRyaWJ1dGVzIDogQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUjsKK30KKworYm9vbCBQcm9kdWN0U3RyYXRlZ3k6OmlzRGVmYXVsdCgpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0ZDo6ZmluZF9pZihiZWdpbihtQXR0cmlidXRlc1ZlY3RvciksIGVuZChtQXR0cmlidXRlc1ZlY3RvciksIFtdKGNvbnN0IGF1dG8gJmF0dHIpIHsKKyAgICAgICAgcmV0dXJuIGF0dHIubUF0dHJpYnV0ZXMgPT0gZGVmYXVsdEF0dHI7IH0pICE9IGVuZChtQXR0cmlidXRlc1ZlY3Rvcik7Cit9CisKK1N0cmVhbVR5cGVWZWN0b3IgUHJvZHVjdFN0cmF0ZWd5OjpnZXRTdXBwb3J0ZWRTdHJlYW1zKCkgY29uc3QKK3sKKyAgICBTdHJlYW1UeXBlVmVjdG9yIHN0cmVhbXM7CisgICAgZm9yIChjb25zdCBhdXRvICZzdXBwb3J0ZWRBdHRyIDogbUF0dHJpYnV0ZXNWZWN0b3IpIHsKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChiZWdpbihzdHJlYW1zKSwgZW5kKHN0cmVhbXMpLCBzdXBwb3J0ZWRBdHRyLm1TdHJlYW0pID09IGVuZChzdHJlYW1zKSAmJgorICAgICAgICAgICAgICAgIHN1cHBvcnRlZEF0dHIubVN0cmVhbSAhPSBBVURJT19TVFJFQU1fREVGQVVMVCkgeworICAgICAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2soc3VwcG9ydGVkQXR0ci5tU3RyZWFtKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gc3RyZWFtczsKK30KKworYm9vbCBQcm9kdWN0U3RyYXRlZ3k6OnN1cHBvcnRTdHJlYW1UeXBlKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbVR5cGUpIGNvbnN0Cit7CisgICAgcmV0dXJuIHN0ZDo6ZmluZF9pZihiZWdpbihtQXR0cmlidXRlc1ZlY3RvciksIGVuZChtQXR0cmlidXRlc1ZlY3RvciksCisgICAgICAgICAgICAgICAgICAgICAgICBbJnN0cmVhbVR5cGVdKGNvbnN0IGF1dG8gJnN1cHBvcnRlZEF0dHIpIHsKKyAgICAgICAgcmV0dXJuIHN1cHBvcnRlZEF0dHIubVN0cmVhbSA9PSBzdHJlYW1UeXBlOyB9KSAhPSBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpOworfQorCit2b2x1bWVfZ3JvdXBfdCBQcm9kdWN0U3RyYXRlZ3k6OmdldFZvbHVtZUdyb3VwRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZzdXBwb3J0ZWRBdHRyIDogbUF0dHJpYnV0ZXNWZWN0b3IpIHsKKyAgICAgICAgaWYgKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5OjphdHRyaWJ1dGVzTWF0Y2hlcyhzdXBwb3J0ZWRBdHRyLm1BdHRyaWJ1dGVzLCBhdHRyKSkgeworICAgICAgICAgICAgcmV0dXJuIHN1cHBvcnRlZEF0dHIubVZvbHVtZUdyb3VwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBWT0xVTUVfR1JPVVBfTk9ORTsKK30KKwordm9sdW1lX2dyb3VwX3QgUHJvZHVjdFN0cmF0ZWd5OjpnZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZzdXBwb3J0ZWRBdHRyIDogbUF0dHJpYnV0ZXNWZWN0b3IpIHsKKyAgICAgICAgaWYgKHN1cHBvcnRlZEF0dHIubVN0cmVhbSA9PSBzdHJlYW0pIHsKKyAgICAgICAgICAgIHJldHVybiBzdXBwb3J0ZWRBdHRyLm1Wb2x1bWVHcm91cDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gVk9MVU1FX0dST1VQX05PTkU7Cit9CisKK3ZvbHVtZV9ncm91cF90IFByb2R1Y3RTdHJhdGVneTo6Z2V0RGVmYXVsdFZvbHVtZUdyb3VwKCkgY29uc3QKK3sKKyAgICBjb25zdCBhdXRvICZpdGVyID0gc3RkOjpmaW5kX2lmKGJlZ2luKG1BdHRyaWJ1dGVzVmVjdG9yKSwgZW5kKG1BdHRyaWJ1dGVzVmVjdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IGF1dG8gJmF0dHIpIHtyZXR1cm4gYXR0ci5tQXR0cmlidXRlcyA9PSBkZWZhdWx0QXR0cjt9KTsKKyAgICByZXR1cm4gaXRlciAhPSBlbmQobUF0dHJpYnV0ZXNWZWN0b3IpID8gaXRlci0+bVZvbHVtZUdyb3VwIDogVk9MVU1FX0dST1VQX05PTkU7Cit9CisKK3ZvaWQgUHJvZHVjdFN0cmF0ZWd5OjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4lKnMtJXMgKGlkOiAlZClcbiIsIHNwYWNlcywgIiIsIG1OYW1lLmNfc3RyKCksIG1JZCk7CisgICAgc3RkOjpzdHJpbmcgZGV2aWNlTGl0ZXJhbDsKKyAgICBpZiAoIWRldmljZVR5cGVzVG9TdHJpbmcobUFwcGxpY2FibGVEZXZpY2VzLCBkZXZpY2VMaXRlcmFsKSkgeworICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBjb252ZXJ0IGRldmljZSAlcyIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZHVtcERldmljZVR5cGVzKG1BcHBsaWNhYmxlRGV2aWNlcykuY19zdHIoKSk7CisgICAgfQorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNTZWxlY3RlZCBEZXZpY2U6IHt0eXBlOiVzLCBAOiVzfVxuIiwgc3BhY2VzICsgMiwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUxpdGVyYWwuY19zdHIoKSwgbURldmljZUFkZHJlc3MuY19zdHIoKSk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHIgOiBtQXR0cmlidXRlc1ZlY3RvcikgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzR3JvdXA6ICVkIHN0cmVhbTogJXNcbiIsIHNwYWNlcyArIDMsICIiLCBhdHRyLm1Wb2x1bWVHcm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kcm9pZDo6dG9TdHJpbmcoYXR0ci5tU3RyZWFtKS5jX3N0cigpKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyBBdHRyaWJ1dGVzOiAiLCBzcGFjZXMgKyAzLCAiIik7CisgICAgICAgIHN0ZDo6c3RyaW5nIGF0dFN0ciA9CisgICAgICAgICAgICAgICAgYXR0ci5tQXR0cmlidXRlcyA9PSBkZWZhdWx0QXR0ciA/ICJ7IEFueSB9IiA6IGFuZHJvaWQ6OnRvU3RyaW5nKGF0dHIubUF0dHJpYnV0ZXMpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJXNcbiIsIGF0dFN0ci5jX3N0cigpKTsKKyAgICB9Cit9CisKK3Byb2R1Y3Rfc3RyYXRlZ3lfdCBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiAqdGhpcykgeworICAgICAgICBpZiAoaXRlci5zZWNvbmQtPm1hdGNoZXMoYXR0cikpIHsKKyAgICAgICAgICAgIHJldHVybiBpdGVyLnNlY29uZC0+Z2V0SWQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBTE9HVigiJXM6IE5vIG1hdGNoaW5nIHByb2R1Y3Qgc3RyYXRlZ3kgZm9yIGF0dHJpYnV0ZXMgJXMsIHJldHVybiBkZWZhdWx0IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgIHRvU3RyaW5nKGF0dHIpLmNfc3RyKCkpOworICAgIHJldHVybiBnZXREZWZhdWx0KCk7Cit9CisKK2F1ZGlvX2F0dHJpYnV0ZXNfdCBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6ICp0aGlzKSB7CisgICAgICAgIGNvbnN0IGF1dG8gc3RyYXRlZ3kgPSBpdGVyLnNlY29uZDsKKyAgICAgICAgaWYgKHN0cmF0ZWd5LT5zdXBwb3J0U3RyZWFtVHlwZShzdHJlYW0pKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyYXRlZ3ktPmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR1YoIiVzOiBObyBwcm9kdWN0IHN0cmF0ZWd5IGZvciBzdHJlYW0gJXMsIHVzaW5nIGRlZmF1bHQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgdG9TdHJpbmcoc3RyZWFtKS5jX3N0cigpKTsKKyAgICByZXR1cm4ge307Cit9CisKK2F1ZGlvX3N0cmVhbV90eXBlX3QgUHJvZHVjdFN0cmF0ZWd5TWFwOjpnZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcygKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6ICp0aGlzKSB7CisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gaXRlci5zZWNvbmQtPmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKGF0dHIpOworICAgICAgICBpZiAoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9ERUZBVUxUKSB7CisgICAgICAgICAgICByZXR1cm4gc3RyZWFtOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCIlczogTm8gcHJvZHVjdCBzdHJhdGVneSBmb3IgYXR0cmlidXRlcyAlcywgdXNpbmcgZGVmYXVsdCAoYWthIE1VU0lDKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICB0b1N0cmluZyhhdHRyKS5jX3N0cigpKTsKKyAgICByZXR1cm4gIEFVRElPX1NUUkVBTV9NVVNJQzsKK30KKworcHJvZHVjdF9zdHJhdGVneV90IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0RGVmYXVsdCgpIGNvbnN0Cit7CisgICAgaWYgKG1EZWZhdWx0U3RyYXRlZ3kgIT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FKSB7CisgICAgICAgIHJldHVybiBtRGVmYXVsdFN0cmF0ZWd5OworICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiAqdGhpcykgeworICAgICAgICBpZiAoaXRlci5zZWNvbmQtPmlzRGVmYXVsdCgpKSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IHVzaW5nIGRlZmF1bHQgJXMiLCBfX0ZVTkNUSU9OX18sIGl0ZXIuc2Vjb25kLT5nZXROYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gaXRlci5zZWNvbmQtPmdldElkKCk7CisgICAgICAgIH0KKyAgICB9CisgICAgQUxPR0UoIiVzOiBObyBkZWZhdWx0IHByb2R1Y3Qgc3RyYXRlZ3kgZGVmaW5lZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgcmV0dXJuIFBST0RVQ1RfU1RSQVRFR1lfTk9ORTsKK30KKworYXVkaW9fYXR0cmlidXRlc190IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0QXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneSgKKyAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBjb25zdAoreworICAgIGlmIChmaW5kKHN0cmF0ZWd5KSA9PSBlbmQoKSkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCAlZCBzdHJhdGVneSByZXF1ZXN0ZWQiLCBzdHJhdGVneSk7CisgICAgICAgIHJldHVybiBBVURJT19BVFRSSUJVVEVTX0lOSVRJQUxJWkVSOworICAgIH0KKyAgICByZXR1cm4gYXQoc3RyYXRlZ3kpLT5nZXRBdWRpb0F0dHJpYnV0ZXMoKVswXTsKK30KKworcHJvZHVjdF9zdHJhdGVneV90IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAoreworICAgIGZvciAoY29uc3QgYXV0byAmaXRlciA6ICp0aGlzKSB7CisgICAgICAgIGlmIChpdGVyLnNlY29uZC0+c3VwcG9ydFN0cmVhbVR5cGUoc3RyZWFtKSkgeworICAgICAgICAgICAgcmV0dXJuIGl0ZXIuc2Vjb25kLT5nZXRJZCgpOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dWKCIlczogTm8gcHJvZHVjdCBzdHJhdGVneSBmb3Igc3RyZWFtICVkLCB1c2luZyBkZWZhdWx0IiwgX19GVU5DVElPTl9fLCBzdHJlYW0pOworICAgIHJldHVybiBnZXREZWZhdWx0KCk7Cit9CisKKworRGV2aWNlVHlwZVNldCBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KAorICAgICAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpIGNvbnN0Cit7CisgICAgaWYgKGZpbmQoc3RyYXRlZ3kpID09IGVuZCgpKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkICVkIHN0cmF0ZWd5IHJlcXVlc3RlZCwgcmV0dXJuaW5nIGRldmljZSBmb3IgZGVmYXVsdCBzdHJhdGVneSIsIHN0cmF0ZWd5KTsKKyAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IGRlZmF1bHRTdHJhdGVneSA9IGdldERlZmF1bHQoKTsKKyAgICAgICAgaWYgKGRlZmF1bHRTdHJhdGVneSA9PSBQUk9EVUNUX1NUUkFURUdZX05PTkUpIHsKKyAgICAgICAgICAgIHJldHVybiB7QVVESU9fREVWSUNFX05PTkV9OworICAgICAgICB9CisgICAgICAgIHJldHVybiBhdChnZXREZWZhdWx0KCkpLT5nZXREZXZpY2VUeXBlcygpOworICAgIH0KKyAgICByZXR1cm4gYXQoc3RyYXRlZ3kpLT5nZXREZXZpY2VUeXBlcygpOworfQorCitzdGQ6OnN0cmluZyBQcm9kdWN0U3RyYXRlZ3lNYXA6OmdldERldmljZUFkZHJlc3NGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHBzSWQpIGNvbnN0Cit7CisgICAgaWYgKGZpbmQocHNJZCkgPT0gZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIkludmFsaWQgJWQgc3RyYXRlZ3kgcmVxdWVzdGVkLCByZXR1cm5pbmcgZGV2aWNlIGZvciBkZWZhdWx0IHN0cmF0ZWd5IiwgcHNJZCk7CisgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBkZWZhdWx0U3RyYXRlZ3kgPSBnZXREZWZhdWx0KCk7CisgICAgICAgIGlmIChkZWZhdWx0U3RyYXRlZ3kgPT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FKSB7CisgICAgICAgICAgICByZXR1cm4ge307CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGF0KGdldERlZmF1bHQoKSktPmdldERldmljZUFkZHJlc3MoKTsKKyAgICB9CisgICAgcmV0dXJuIGF0KHBzSWQpLT5nZXREZXZpY2VBZGRyZXNzKCk7Cit9CisKK3ZvbHVtZV9ncm91cF90IFByb2R1Y3RTdHJhdGVneU1hcDo6Z2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiAqdGhpcykgeworICAgICAgICB2b2x1bWVfZ3JvdXBfdCBncm91cCA9IGl0ZXIuc2Vjb25kLT5nZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMoYXR0cik7CisgICAgICAgIGlmIChncm91cCAhPSBWT0xVTUVfR1JPVVBfTk9ORSkgeworICAgICAgICAgICAgcmV0dXJuIGdyb3VwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBnZXREZWZhdWx0Vm9sdW1lR3JvdXAoKTsKK30KKwordm9sdW1lX2dyb3VwX3QgUHJvZHVjdFN0cmF0ZWd5TWFwOjpnZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0Cit7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogKnRoaXMpIHsKKyAgICAgICAgdm9sdW1lX2dyb3VwX3QgZ3JvdXAgPSBpdGVyLnNlY29uZC0+Z2V0Vm9sdW1lR3JvdXBGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgICAgIGlmIChncm91cCAhPSBWT0xVTUVfR1JPVVBfTk9ORSkgeworICAgICAgICAgICAgcmV0dXJuIGdyb3VwOworICAgICAgICB9CisgICAgfQorICAgIEFMT0dXKCIlczogbm8gdm9sdW1lIGdyb3VwIGZvciAlcywgdXNpbmcgZGVmYXVsdCIsIF9fZnVuY19fLCB0b1N0cmluZyhzdHJlYW0pLmNfc3RyKCkpOworICAgIHJldHVybiBnZXREZWZhdWx0Vm9sdW1lR3JvdXAoKTsKK30KKwordm9sdW1lX2dyb3VwX3QgUHJvZHVjdFN0cmF0ZWd5TWFwOjpnZXREZWZhdWx0Vm9sdW1lR3JvdXAoKSBjb25zdAoreworICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCBkZWZhdWx0U3RyYXRlZ3kgPSBnZXREZWZhdWx0KCk7CisgICAgaWYgKGRlZmF1bHRTdHJhdGVneSA9PSBQUk9EVUNUX1NUUkFURUdZX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIFZPTFVNRV9HUk9VUF9OT05FOworICAgIH0KKyAgICByZXR1cm4gYXQoZGVmYXVsdFN0cmF0ZWd5KS0+Z2V0RGVmYXVsdFZvbHVtZUdyb3VwKCk7Cit9CisKK3ZvaWQgUHJvZHVjdFN0cmF0ZWd5TWFwOjppbml0aWFsaXplKCkKK3sKKyAgICBtRGVmYXVsdFN0cmF0ZWd5ID0gZ2V0RGVmYXVsdCgpOworICAgIEFMT0dfQVNTRVJUKG1EZWZhdWx0U3RyYXRlZ3kgIT0gUFJPRFVDVF9TVFJBVEVHWV9OT05FLCAiTm8gZGVmYXVsdCBwcm9kdWN0IHN0cmF0ZWd5IGZvdW5kIik7Cit9CisKK3ZvaWQgUHJvZHVjdFN0cmF0ZWd5TWFwOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzUHJvZHVjdCBTdHJhdGVnaWVzIGR1bXA6Iiwgc3BhY2VzLCAiIik7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogKnRoaXMpIHsKKyAgICAgICAgaXRlci5zZWNvbmQtPmR1bXAoZHN0LCBzcGFjZXMgKyAyKTsKKyAgICB9Cit9CisKK3ZvaWQgUHJvZHVjdFN0cmF0ZWd5UHJlZmVycmVkUm91dGluZ01hcDo6ZHVtcChhbmRyb2lkOjpTdHJpbmc4KiBkc3QsIGludCBzcGFjZXMpIGNvbnN0IHsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4lKnNQcmVmZXJyZWQgZGV2aWNlcyBwZXIgcHJvZHVjdCBzdHJhdGVneSBkdW1wOiIsIHNwYWNlcywgIiIpOworICAgIGZvciAoY29uc3QgYXV0byYgaXRlciA6ICp0aGlzKSB7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiUqc1N0cmF0ZWd5ICV1IGRldjolMDh4IGFkZHI6JXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzcGFjZXMgKyAyLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQzMl90KSBpdGVyLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLnNlY29uZC5tVHlwZSwgaXRlci5zZWNvbmQubUFkZHJlc3MuY19zdHIoKSk7CisgICAgfQorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiIpOworfQorfQorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Wb2x1bWVDdXJ2ZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM1MjU3OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb21tb24vc3JjL1ZvbHVtZUN1cnZlLmNwcApAQCAtMCwwICsxLDEyOSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpWb2x1bWVDdXJ2ZSIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIlZvbHVtZUN1cnZlLmgiCisjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgorI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitmbG9hdCBWb2x1bWVDdXJ2ZTo6dm9sSW5kZXhUb0RiKGludCBpbmRleEluVWksIGludCB2b2xJbmRleE1pbiwgaW50IHZvbEluZGV4TWF4KSBjb25zdAoreworICAgIEFMT0dfQVNTRVJUKCFtQ3VydmVQb2ludHMuaXNFbXB0eSgpLCAiSW52YWxpZCB2b2x1bWUgY3VydmUiKTsKKyAgICBpZiAodm9sSW5kZXhNaW4gPCAwIHx8IHZvbEluZGV4TWF4IDwgMCkgeworICAgICAgICAvLyBJbiBvcmRlciB0byBsZXQgQXVkaW9TZXJ2aWNlIGluaXRpYWxpemUgdGhlIG1pbiBhbmQgbWF4LCBjb252ZW50aW9uIGlzIHRvIHVzZSAtMQorICAgICAgICByZXR1cm4gTkFOOworICAgIH0KKyAgICBpZiAoaW5kZXhJblVpIDwgdm9sSW5kZXhNaW4pIHsKKyAgICAgICAgLy8gYW4gaW5kZXggb2YgMCBtZWFucyBtdXRlIHJlcXVlc3Qgd2hlbiB2b2xJbmRleE1pbiA+IDAKKyAgICAgICAgaWYgKGluZGV4SW5VaSA9PSAwKSB7CisgICAgICAgICAgICBBTE9HVigiVk9MVU1FIGZvcmNpbmcgbXV0ZSBmb3IgaW5kZXggMCB3aXRoIG1pbiBpbmRleCAlZCIsIHZvbEluZGV4TWluKTsKKyAgICAgICAgICAgIHJldHVybiBWT0xVTUVfTUlOX0RCOworICAgICAgICB9CisgICAgICAgIEFMT0dWKCJWT0xVTUUgcmVtYXBwaW5nIGluZGV4IGZyb20gJWQgdG8gbWluIGluZGV4ICVkIiwgaW5kZXhJblVpLCB2b2xJbmRleE1pbik7CisgICAgICAgIGluZGV4SW5VaSA9IHZvbEluZGV4TWluOworICAgIH0gZWxzZSBpZiAoaW5kZXhJblVpID4gdm9sSW5kZXhNYXgpIHsKKyAgICAgICAgQUxPR1YoIlZPTFVNRSByZW1hcHBpbmcgaW5kZXggZnJvbSAlZCB0byBtYXggaW5kZXggJWQiLCBpbmRleEluVWksIHZvbEluZGV4TWF4KTsKKyAgICAgICAgaW5kZXhJblVpID0gdm9sSW5kZXhNYXg7CisgICAgfQorCisgICAgc2l6ZV90IG5iQ3VydmVQb2ludHMgPSBtQ3VydmVQb2ludHMuc2l6ZSgpOworICAgIC8vIHRoZSB2b2x1bWUgaW5kZXggaW4gdGhlIFVJIGlzIHJlbGF0aXZlIHRvIHRoZSBtaW4gYW5kIG1heCB2b2x1bWUgaW5kaWNlcyBmb3IgdGhpcyBzdHJlYW0KKyAgICBpbnQgbmJTdGVwcyA9IDEgKyBtQ3VydmVQb2ludHNbbmJDdXJ2ZVBvaW50cyAtIDFdLm1JbmRleCAtIG1DdXJ2ZVBvaW50c1swXS5tSW5kZXg7CisgICAgaW50IHZvbElkeCA9IChuYlN0ZXBzICogKGluZGV4SW5VaSAtIHZvbEluZGV4TWluKSkgLyAodm9sSW5kZXhNYXggLSB2b2xJbmRleE1pbik7CisKKyAgICAvLyBXaGVyZSB3b3VsZCB0aGlzIHZvbHVtZSBpbmRleCBiZWVuIGluc2VydGVkIGluIHRoZSBjdXJ2ZSBwb2ludAorICAgIHNpemVfdCBpbmRleEluVWlQb3NpdGlvbiA9IG1DdXJ2ZVBvaW50cy5vcmRlck9mKEN1cnZlUG9pbnQodm9sSWR4LCAwKSk7CisgICAgaWYgKGluZGV4SW5VaVBvc2l0aW9uID49IG5iQ3VydmVQb2ludHMpIHsKKyAgICAgICAgLy91c2UgbGFzdCBwb2ludCBvZiB0YWJsZQorICAgICAgICByZXR1cm4gbUN1cnZlUG9pbnRzW25iQ3VydmVQb2ludHMgLSAxXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmOworICAgIH0KKyAgICBpZiAoaW5kZXhJblVpUG9zaXRpb24gPT0gMCkgeworICAgICAgICBpZiAoaW5kZXhJblVpUG9zaXRpb24gIT0gbUN1cnZlUG9pbnRzWzBdLm1JbmRleCkgeworICAgICAgICAgICAgcmV0dXJuIFZPTFVNRV9NSU5fREI7IC8vIG91dCBvZiBib3VuZHMKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gbUN1cnZlUG9pbnRzWzBdLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGY7CisgICAgfQorICAgIC8vIGxpbmVhciBpbnRlcnBvbGF0aW9uIGluIHRoZSBhdHRlbnVhdGlvbiB0YWJsZSBpbiBkQgorICAgIGZsb2F0IGRlY2liZWxzID0gKG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbiAtIDFdLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGYpICsKKyAgICAgICAgICAgICgoZmxvYXQpKHZvbElkeCAtIG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbiAtIDFdLm1JbmRleCkpICoKKyAgICAgICAgICAgICAgICAoICgobUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAobUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uIC0gMV0ubUF0dGVudWF0aW9uSW5NYiAvIDEwMC4wZikpIC8KKyAgICAgICAgICAgICAgICAgICAgKChmbG9hdCkobUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uXS5tSW5kZXggLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbiAtIDFdLm1JbmRleCkpICk7CisKKyAgICBBTE9HVigiVk9MVU1FIHZvbCBpbmRleD1bJWQgJWQgJWRdLCBkQj1bJS4xZiAlLjFmICUuMWZdIiwKKyAgICAgICAgICAgIG1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbiAtIDFdLm1JbmRleCwgdm9sSWR4LAorICAgICAgICAgICAgbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uXS5tSW5kZXgsCisgICAgICAgICAgICAoKGZsb2F0KW1DdXJ2ZVBvaW50c1tpbmRleEluVWlQb3NpdGlvbiAtIDFdLm1BdHRlbnVhdGlvbkluTWIgLyAxMDAuMGYpLCBkZWNpYmVscywKKyAgICAgICAgICAgICgoZmxvYXQpbUN1cnZlUG9pbnRzW2luZGV4SW5VaVBvc2l0aW9uXS5tQXR0ZW51YXRpb25Jbk1iIC8gMTAwLjBmKSk7CisKKyAgICByZXR1cm4gZGVjaWJlbHM7Cit9CisKK3ZvaWQgVm9sdW1lQ3VydmU6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzLCBib29sIGN1cnZlUG9pbnRzKSBjb25zdAoreworICAgIGlmICghY3VydmVQb2ludHMpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBkc3QtPmFwcGVuZCgiIHsiKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1DdXJ2ZVBvaW50cy5zaXplKCk7IGkrKykgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzKCUzZCwgJTVkKSIsIHNwYWNlcywgIiIsIG1DdXJ2ZVBvaW50c1tpXS5tSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1DdXJ2ZVBvaW50c1tpXS5tQXR0ZW51YXRpb25Jbk1iKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoaSA9PSAobUN1cnZlUG9pbnRzLnNpemUoKSAtIDEpID8gIiB9XG4iIDogIiwgIik7CisgICAgfQorfQorCit2b2lkIFZvbHVtZUN1cnZlczo6ZHVtcChTdHJpbmc4ICpkc3QsIGludCBzcGFjZXMsIGJvb2wgY3VydmVQb2ludHMpIGNvbnN0Cit7CisgICAgaWYgKCFjdXJ2ZVBvaW50cykgeworLy8gICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnMlMDJkICAgICAgJXMgICAgICAgICAlMDNkICAgICAgICAlMDNkICAgICAgICAiLCBzcGFjZXMsICIiLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIG1TdHJlYW0sIG1DYW5CZU11dGVkID8gInRydWUgIiA6ICJmYWxzZSIsIG1JbmRleE1pbiwgbUluZGV4TWF4KTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyBDYW4gYmUgbXV0ZWQgIEluZGV4IE1pbiAgSW5kZXggTWF4ICBJbmRleCBDdXIgW2RldmljZSA6IGluZGV4XS4uLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VzICsgMSwgIiIpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzICVzICAgICAgICAgJTAyZCAgICAgICAgICUwMmQgICAgICAgICAiLCBzcGFjZXMgKyAxLCAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbkJlTXV0ZWQgPyAidHJ1ZSAiIDogImZhbHNlIiwgbUluZGV4TWluLCBtSW5kZXhNYXgpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnBhaXIgOiBtSW5kZXhDdXIpIHsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlMDR4IDogJTAyZCwgIiwgcGFpci5maXJzdCwgcGFpci5zZWNvbmQpOworICAgICAgICB9CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHN0cmVhbU5hbWVzOworICAgIGZvciAoY29uc3QgYXV0byAmc3RyZWFtIDogbVN0cmVhbXMpIHsKKyAgICAgICAgc3RyZWFtTmFtZXMgKz0gYW5kcm9pZDo6dG9TdHJpbmcoc3RyZWFtKSArICIoIitzdGQ6OnRvX3N0cmluZyhzdHJlYW0pKyIpICI7CisgICAgfQorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIlKnNWb2x1bWUgQ3VydmVzIFN0cmVhbXMvQXR0cmlidXRlcywgQ3VydmUgcG9pbnRzIFN0cmVhbXMgZm9yIGRldmljZSIKKyAgICAgICAgICAgICAgICAgICAgICAiIGNhdGVnb3J5IChpbmRleCwgYXR0ZW51YXRpb24gaW4gbWlsbGliZWwpXG4iLCBzcGFjZXMsICIiKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzIFN0cmVhbXM6ICVzIFxuIiwgc3BhY2VzLCAiIiwgc3RyZWFtTmFtZXMuY19zdHIoKSk7CisgICAgaWYgKCFtQXR0cmlidXRlcy5lbXB0eSgpKSBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzIEF0dHJpYnV0ZXM6Iiwgc3BhY2VzLCAiIik7CisgICAgZm9yIChjb25zdCBhdXRvICZhdHRyaWJ1dGVzIDogbUF0dHJpYnV0ZXMpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgYXR0U3RyID0gYXR0cmlidXRlcyA9PSBkZWZhdWx0QXR0ciA/ICJ7IEFueSB9IiA6IGFuZHJvaWQ6OnRvU3RyaW5nKGF0dHJpYnV0ZXMpOworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiJSpzICVzXG4iLCBhdHRyaWJ1dGVzID09IG1BdHRyaWJ1dGVzLmZyb250KCkgPyAwIDogc3BhY2VzICsgMTMsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBhdHRTdHIuY19zdHIoKSk7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZGV2aWNlQ2F0TGl0ZXJhbDsKKyAgICAgICAgRGV2aWNlQ2F0ZWdvcnlDb252ZXJ0ZXI6OnRvU3RyaW5nKGtleUF0KGkpLCBkZXZpY2VDYXRMaXRlcmFsKTsKKyAgICAgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiUqcyAlcyA6Iiwgc3BhY2VzLCAiIiwgZGV2aWNlQ2F0TGl0ZXJhbC5jX3N0cigpKTsKKyAgICAgICAgdmFsdWVBdChpKS0+ZHVtcChkc3QsIDEsIHRydWUpOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvVm9sdW1lR3JvdXAuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbW1vbi9zcmMvVm9sdW1lR3JvdXAuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUxODk4MDcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29tbW9uL3NyYy9Wb2x1bWVHcm91cC5jcHAKQEAgLTAsMCArMSw3NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZS9Wb2x1bWVHcm91cCIKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgIlZvbHVtZUdyb3VwLmgiCisjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgorI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgPGxvZy9sb2cuaD4KKworCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vCisvLyBWb2x1bWVHcm91cCBpbXBsZW1lbnRhdGlvbgorLy8KK1ZvbHVtZUdyb3VwOjpWb2x1bWVHcm91cChjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpIDoKKyAgICBtTmFtZShuYW1lKSwgbUlkKHN0YXRpY19jYXN0PHZvbHVtZV9ncm91cF90PihIYW5kbGVHZW5lcmF0b3I8dWludDMyX3Q+OjpnZXROZXh0SGFuZGxlKCkpKSwKKyAgICBtR3JvdXBWb2x1bWVDdXJ2ZXMoVm9sdW1lQ3VydmVzKGluZGV4TWluLCBpbmRleE1heCkpCit7Cit9CisKK3ZvaWQgVm9sdW1lR3JvdXA6OmR1bXAoU3RyaW5nOCAqZHN0LCBpbnQgc3BhY2VzKSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiUqcy0lcyAoaWQ6ICVkKVxuIiwgc3BhY2VzLCAiIiwgbU5hbWUuY19zdHIoKSwgbUlkKTsKKyAgICBtR3JvdXBWb2x1bWVDdXJ2ZXMuZHVtcChkc3QsIHNwYWNlcyArIDIsIHRydWUpOworICAgIG1Hcm91cFZvbHVtZUN1cnZlcy5kdW1wKGRzdCwgc3BhY2VzICsgMiwgZmFsc2UpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbiIpOworfQorCit2b2lkIFZvbHVtZUdyb3VwOjphZGQoY29uc3Qgc3A8Vm9sdW1lQ3VydmU+ICZjdXJ2ZSkKK3sKKyAgICBtR3JvdXBWb2x1bWVDdXJ2ZXMuYWRkKGN1cnZlKTsKK30KKwordm9pZCBWb2x1bWVHcm91cDo6YWRkU3VwcG9ydGVkQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpCit7CisgICAgbUdyb3VwVm9sdW1lQ3VydmVzLmFkZEF0dHJpYnV0ZXMoYXR0cik7Cit9CisKK3ZvaWQgVm9sdW1lR3JvdXA6OmFkZFN1cHBvcnRlZFN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKK3sKKyAgICBtR3JvdXBWb2x1bWVDdXJ2ZXMuYWRkU3RyZWFtVHlwZShzdHJlYW0pOworfQorCisvLworLy8gVm9sdW1lR3JvdXBNYXAgaW1wbGVtZW50YXRpb24KKy8vCit2b2lkIFZvbHVtZUdyb3VwTWFwOjpkdW1wKFN0cmluZzggKmRzdCwgaW50IHNwYWNlcykgY29uc3QKK3sKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG4lKnNWb2x1bWUgR3JvdXBzIGR1bXA6Iiwgc3BhY2VzLCAiIik7CisgICAgZm9yIChjb25zdCBhdXRvICZpdGVyIDogKnRoaXMpIHsKKyAgICAgICAgaXRlci5zZWNvbmQtPmR1bXAoZHN0LCBzcGFjZXMgKyAyKTsKKyAgICB9Cit9CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmODQwZjkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwyNyBAQAorY2NfbGlicmFyeSB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5ZW5naW5lX2NvbmZpZyIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJleHRlcm5hbC9saWJ4bWwyL2luY2x1ZGUiLAorICAgIF0sCisgICAgc3JjczogWworICAgICAgICAic3JjL0VuZ2luZUNvbmZpZy5jcHAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJ4bWwyIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgIF0sCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvX3N5c3RlbV9oZWFkZXJzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvaW5jbHVkZS9FbmdpbmVDb25maWcuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9jb25maWcvaW5jbHVkZS9FbmdpbmVDb25maWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjVlZDVlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9pbmNsdWRlL0VuZ2luZUNvbmZpZy5oCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI3ByYWdtYSBvbmNlCisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisKK3N0cnVjdCBfeG1sTm9kZTsKK3N0cnVjdCBfeG1sRG9jOworCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZW5naW5lQ29uZmlnIHsKKworLyoqIERlZmF1bHQgcGF0aCBvZiBhdWRpbyBwb2xpY3kgdXNhZ2VzIGNvbmZpZ3VyYXRpb24gZmlsZS4gKi8KK2NvbnN0ZXhwciBjaGFyIERFRkFVTFRfUEFUSFtdID0gIi92ZW5kb3IvZXRjL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwiOworCisvKiogRGlyZWN0b3JpZXMgd2hlcmUgdGhlIGVmZmVjdCBsaWJyYXJpZXMgd2lsbCBiZSBzZWFyY2ggZm9yLiAqLworY29uc3RleHByIGNvbnN0IGNoYXIqIFBPTElDWV9VU0FHRV9MSUJSQVJZX1BBVEhbXSA9IHsiL29kbS9ldGMvIiwgIi92ZW5kb3IvZXRjLyIsICIvc3lzdGVtL2V0Yy8ifTsKKwordXNpbmcgQXR0cmlidXRlc1ZlY3RvciA9IHN0ZDo6dmVjdG9yPGF1ZGlvX2F0dHJpYnV0ZXNfdD47Cit1c2luZyBTdHJlYW1WZWN0b3IgPSBzdGQ6OnZlY3RvcjxhdWRpb19zdHJlYW1fdHlwZV90PjsKKworc3RydWN0IEF0dHJpYnV0ZXNHcm91cCB7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbTsKKyAgICBzdGQ6OnN0cmluZyB2b2x1bWVHcm91cDsKKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGF0dHJpYnV0ZXNWZWN0OworfTsKKwordXNpbmcgQXR0cmlidXRlc0dyb3VwcyA9IHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZXNHcm91cD47CisKK3N0cnVjdCBDdXJ2ZVBvaW50IHsKKyAgICBpbnQgaW5kZXg7CisgICAgaW50IGF0dGVudWF0aW9uSW5NYjsKK307Cit1c2luZyBDdXJ2ZVBvaW50cyA9IHN0ZDo6dmVjdG9yPEN1cnZlUG9pbnQ+OworCitzdHJ1Y3QgVm9sdW1lQ3VydmUgeworICAgIHN0ZDo6c3RyaW5nIGRldmljZUNhdGVnb3J5OworICAgIEN1cnZlUG9pbnRzIGN1cnZlUG9pbnRzOworfTsKK3VzaW5nIFZvbHVtZUN1cnZlcyA9IHN0ZDo6dmVjdG9yPFZvbHVtZUN1cnZlPjsKKworc3RydWN0IFZvbHVtZUdyb3VwIHsKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIGludCBpbmRleE1pbjsKKyAgICBpbnQgaW5kZXhNYXg7CisgICAgVm9sdW1lQ3VydmVzIHZvbHVtZUN1cnZlczsKK307Cit1c2luZyBWb2x1bWVHcm91cHMgPSBzdGQ6OnZlY3RvcjxWb2x1bWVHcm91cD47CisKK3N0cnVjdCBQcm9kdWN0U3RyYXRlZ3kgeworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgQXR0cmlidXRlc0dyb3VwcyBhdHRyaWJ1dGVzR3JvdXBzOworfTsKKwordXNpbmcgUHJvZHVjdFN0cmF0ZWdpZXMgPSBzdGQ6OnZlY3RvcjxQcm9kdWN0U3RyYXRlZ3k+OworCit1c2luZyBWYWx1ZVBhaXIgPSBzdGQ6OnBhaXI8dWludDMyX3QsIHN0ZDo6c3RyaW5nPjsKK3VzaW5nIFZhbHVlUGFpcnMgPSBzdGQ6OnZlY3RvcjxWYWx1ZVBhaXI+OworCitzdHJ1Y3QgQ3JpdGVyaW9uVHlwZQoreworICAgIHN0ZDo6c3RyaW5nIG5hbWU7CisgICAgYm9vbCBpc0luY2x1c2l2ZTsKKyAgICBWYWx1ZVBhaXJzIHZhbHVlUGFpcnM7Cit9OworCit1c2luZyBDcml0ZXJpb25UeXBlcyA9IHN0ZDo6dmVjdG9yPENyaXRlcmlvblR5cGU+OworCitzdHJ1Y3QgQ3JpdGVyaW9uCit7CisgICAgc3RkOjpzdHJpbmcgbmFtZTsKKyAgICBzdGQ6OnN0cmluZyB0eXBlTmFtZTsKKyAgICBzdGQ6OnN0cmluZyBkZWZhdWx0TGl0ZXJhbFZhbHVlOworfTsKKwordXNpbmcgQ3JpdGVyaWEgPSBzdGQ6OnZlY3RvcjxDcml0ZXJpb24+OworCitzdHJ1Y3QgQ29uZmlnIHsKKyAgICBmbG9hdCB2ZXJzaW9uOworICAgIFByb2R1Y3RTdHJhdGVnaWVzIHByb2R1Y3RTdHJhdGVnaWVzOworICAgIENyaXRlcmlhIGNyaXRlcmlhOworICAgIENyaXRlcmlvblR5cGVzIGNyaXRlcmlvblR5cGVzOworICAgIFZvbHVtZUdyb3VwcyB2b2x1bWVHcm91cHM7Cit9OworCisvKiogUmVzdWx0IG9mIGBwYXJzZShjb25zdCBjaGFyKilgICovCitzdHJ1Y3QgUGFyc2luZ1Jlc3VsdCB7CisgICAgLyoqIFBhcnNlZCBjb25maWcsIG51bGxwdHIgaWYgdGhlIHhtbCBsaWIgY291bGQgbm90IGxvYWQgdGhlIGZpbGUgKi8KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q29uZmlnPiBwYXJzZWRDb25maWc7CisgICAgc2l6ZV90IG5iU2tpcHBlZEVsZW1lbnQ7IC8vPCBOdW1iZXIgb2Ygc2tpcHBlZCBpbnZhbGlkIHByb2R1Y3Qgc3RyYXRlZ2llcworfTsKKworLyoqIFBhcnNlcyB0aGUgcHJvdmlkZWQgYXVkaW8gcG9saWN5IHVzYWdlIGNvbmZpZ3VyYXRpb24uCisgKiBAcmV0dXJuIGF1ZGlvIHBvbGljeSB1c2FnZSBAc2VlIENvbmZpZworICovCitQYXJzaW5nUmVzdWx0IHBhcnNlKGNvbnN0IGNoYXIqIHBhdGggPSBERUZBVUxUX1BBVEgpOworYW5kcm9pZDo6c3RhdHVzX3QgcGFyc2VMZWdhY3lWb2x1bWVzKFZvbHVtZUdyb3VwcyAmdm9sdW1lR3JvdXBzKTsKKworfSAvLyBuYW1lc3BhY2UgZW5naW5lQ29uZmlnCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvY29uZmlnL3NyYy9FbmdpbmVDb25maWcuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9zcmMvRW5naW5lQ29uZmlnLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZjhjZGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2NvbmZpZy9zcmMvRW5naW5lQ29uZmlnLmNwcApAQCAtMCwwICsxLDczMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNkZWZpbmUgTE9HX1RBRyAiQVBNOjpBdWRpb1BvbGljeUVuZ2luZS9Db25maWciCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJFbmdpbmVDb25maWcuaCIKKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgorI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9jb252ZXJ0Lmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8bGlieG1sL3BhcnNlci5oPgorI2luY2x1ZGUgPGxpYnhtbC94aW5jbHVkZS5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8aXN0cmVhbT4KKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIHV0aWxpdGllczo6Y29udmVydFRvOworCituYW1lc3BhY2UgZW5naW5lQ29uZmlnIHsKKworc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpnVmVyc2lvbkF0dHJpYnV0ZSA9ICJ2ZXJzaW9uIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnUmVmZXJlbmNlRWxlbWVudE5hbWUgPSAicmVmZXJlbmNlIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnUmVmZXJlbmNlQXR0cmlidXRlTmFtZSA9ICJuYW1lIjsKKwordGVtcGxhdGU8dHlwZW5hbWUgRSwgdHlwZW5hbWUgQz4KK3N0cnVjdCBCYXNlU2VyaWFsaXplclRyYWl0cyB7CisgICAgdHlwZWRlZiBFIEVsZW1lbnQ7CisgICAgdHlwZWRlZiBDIENvbGxlY3Rpb247CisgICAgdHlwZWRlZiB2b2lkKiBQdHJTZXJpYWxpemluZ0N0eDsKK307CisKK3N0cnVjdCBBdHRyaWJ1dGVzR3JvdXBUcmFpdHMgOiBwdWJsaWMgQmFzZVNlcmlhbGl6ZXJUcmFpdHM8QXR0cmlidXRlc0dyb3VwLCBBdHRyaWJ1dGVzR3JvdXBzPiB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiQXR0cmlidXRlc0dyb3VwIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAiQXR0cmlidXRlc0dyb3VwcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcyB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzdHJlYW1UeXBlID0gInN0cmVhbVR5cGUiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnZvbHVtZUdyb3VwID0gInZvbHVtZUdyb3VwIjsKKyAgICB9OworICAgIHN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBDb2xsZWN0aW9uICZwcyk7Cit9OworCitzdHJ1Y3QgUHJvZHVjdFN0cmF0ZWd5VHJhaXRzIDogcHVibGljIEJhc2VTZXJpYWxpemVyVHJhaXRzPFByb2R1Y3RTdHJhdGVneSwgUHJvZHVjdFN0cmF0ZWdpZXM+IHsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJQcm9kdWN0U3RyYXRlZ3kiOworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqY29sbGVjdGlvblRhZyA9ICJQcm9kdWN0U3RyYXRlZ2llcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcyB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICB9OworICAgIHN0YXRpYyBhbmRyb2lkOjpzdGF0dXNfdCBkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBDb2xsZWN0aW9uICZwcyk7Cit9Oworc3RydWN0IFZhbHVlVHJhaXRzIDogcHVibGljIEJhc2VTZXJpYWxpemVyVHJhaXRzPFZhbHVlUGFpciwgVmFsdWVQYWlycz4geworICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdGFnID0gInZhbHVlIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAidmFsdWVzIjsKKworICAgIHN0cnVjdCBBdHRyaWJ1dGVzIHsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpsaXRlcmFsID0gImxpdGVyYWwiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm51bWVyaWNhbCA9ICJudW1lcmljYWwiOworICAgIH07CisKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmY29sbGVjdGlvbik7Cit9Oworc3RydWN0IENyaXRlcmlvblR5cGVUcmFpdHMgOiBwdWJsaWMgQmFzZVNlcmlhbGl6ZXJUcmFpdHM8Q3JpdGVyaW9uVHlwZSwgQ3JpdGVyaW9uVHlwZXM+IHsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJjcml0ZXJpb25fdHlwZSI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gImNyaXRlcmlvbl90eXBlcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcyB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0eXBlID0gInR5cGUiOworICAgIH07CisKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmY29sbGVjdGlvbik7Cit9Oworc3RydWN0IENyaXRlcmlvblRyYWl0cyA6IHB1YmxpYyBCYXNlU2VyaWFsaXplclRyYWl0czxDcml0ZXJpb24sIENyaXRlcmlhPiB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAiY3JpdGVyaW9uIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAiY3JpdGVyaWEiOworCisgICAgc3RydWN0IEF0dHJpYnV0ZXMgeworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKm5hbWUgPSAibmFtZSI7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqdHlwZSA9ICJ0eXBlIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpkZWZhdWx0VmFsID0gImRlZmF1bHQiOworICAgIH07CisKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmY29sbGVjdGlvbik7Cit9Oworc3RydWN0IFZvbHVtZVRyYWl0cyA6IHB1YmxpYyBCYXNlU2VyaWFsaXplclRyYWl0czxWb2x1bWVDdXJ2ZSwgVm9sdW1lQ3VydmVzPiB7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp0YWcgPSAidm9sdW1lIjsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmNvbGxlY3Rpb25UYWcgPSAidm9sdW1lcyI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICp2b2x1bWVQb2ludFRhZyA9ICJwb2ludCI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcyB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqZGV2aWNlQ2F0ZWdvcnkgPSAiZGV2aWNlQ2F0ZWdvcnkiOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnN0cmVhbSA9ICJzdHJlYW0iOyAvLyBGb3IgbGVnYWN5IHZvbHVtZSBjdXJ2ZXMKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpyZWZlcmVuY2UgPSAicmVmIjsgLyoqPCBGb3Igdm9sdW1lIGN1cnZlcyBmYWN0b3JpemF0aW9uLiAqLworICAgIH07CisKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmY29sbGVjdGlvbik7Cit9Oworc3RydWN0IFZvbHVtZUdyb3VwVHJhaXRzIDogcHVibGljIEJhc2VTZXJpYWxpemVyVHJhaXRzPFZvbHVtZUdyb3VwLCBWb2x1bWVHcm91cHM+IHsKKyAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKnRhZyA9ICJ2b2x1bWVHcm91cCI7CisgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnID0gInZvbHVtZUdyb3VwcyI7CisKKyAgICBzdHJ1Y3QgQXR0cmlidXRlcyB7CisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqbmFtZSA9ICJuYW1lIjsKKyAgICAgICAgc3RhdGljIGNvbnN0ZXhwciBjb25zdCBjaGFyICpzdHJlYW0gPSAic3RyZWFtIjsgLy8gRm9yIGxlZ2FjeSB2b2x1bWUgY3VydmVzCisgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqaW5kZXhNaW4gPSAiaW5kZXhNaW4iOworICAgICAgICBzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmluZGV4TWF4ID0gImluZGV4TWF4IjsKKyAgICB9OworCisgICAgc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gJmNvbGxlY3Rpb24pOworfTsKKwordXNpbmcgeG1sQ2hhclVuaXF1ZSA9IHN0ZDo6dW5pcXVlX3B0cjx4bWxDaGFyLCBkZWNsdHlwZSh4bWxGcmVlKT47CisKK3N0ZDo6c3RyaW5nIGdldFhtbEF0dHJpYnV0ZShjb25zdCB4bWxOb2RlICpjdXIsIGNvbnN0IGNoYXIgKmF0dHJpYnV0ZSkKK3sKKyAgICB4bWxDaGFyVW5pcXVlIGNoYXJQdHIoeG1sR2V0UHJvcChjdXIsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgeG1sQ2hhciAqPihhdHRyaWJ1dGUpKSwgeG1sRnJlZSk7CisgICAgaWYgKGNoYXJQdHIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gIiI7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHZhbHVlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGNoYXJQdHIuZ2V0KCkpKTsKKyAgICByZXR1cm4gdmFsdWU7Cit9CisKK3N0YXRpYyB2b2lkIGdldFJlZmVyZW5jZShjb25zdCBfeG1sTm9kZSAqcm9vdCwgY29uc3QgX3htbE5vZGUgKiZyZWZOb2RlLCBjb25zdCBzdGQ6OnN0cmluZyAmcmVmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjb2xsZWN0aW9uVGFnKQoreworICAgIGZvciAocm9vdCA9IHJvb3QtPnhtbENoaWxkcmVuTm9kZTsgcm9vdCAhPSBOVUxMOyByb290ID0gcm9vdC0+bmV4dCkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChyb290LT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKWNvbGxlY3Rpb25UYWcpKSB7CisgICAgICAgICAgICBmb3IgKHhtbE5vZGUgKmN1ciA9IHJvb3QtPnhtbENoaWxkcmVuTm9kZTsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICAgICAgICAgIGlmICgoIXhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopZ1JlZmVyZW5jZUVsZW1lbnROYW1lKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIGdSZWZlcmVuY2VBdHRyaWJ1dGVOYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHJlZk5hbWUgPT0gbmFtZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVmTm9kZSA9IGN1cjsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFpdD4KK3N0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZUNvbGxlY3Rpb24oX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBUcmFpdDo6Q29sbGVjdGlvbiAmY29sbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICZuYlNraXBwZWRFbGVtZW50KQoreworICAgIGZvciAoY3VyID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OmNvbGxlY3Rpb25UYWcpICYmCisgICAgICAgICAgICB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojp0YWcpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBjb25zdCB4bWxOb2RlICpjaGlsZCA9IGN1cjsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OmNvbGxlY3Rpb25UYWcpKSB7CisgICAgICAgICAgICBjaGlsZCA9IGNoaWxkLT54bWxDaGlsZHJlbk5vZGU7CisgICAgICAgIH0KKyAgICAgICAgZm9yICg7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKVRyYWl0Ojp0YWcpKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVHJhaXQ6OmRlc2VyaWFsaXplKGRvYywgY2hpbGQsIGNvbGxlY3Rpb24pOworICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICAgICAgbmJTa2lwcGVkRWxlbWVudCArPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopVHJhaXQ6OnRhZykpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXRpYyBjb25zdGV4cHIgY29uc3QgY2hhciAqYXR0cmlidXRlc0F0dHJpYnV0ZVJlZiA9ICJhdHRyaWJ1dGVzUmVmIjsgLyoqPCBmb3IgZmFjdG9yaXphdGlvbi4gKi8KKworc3RhdGljIHN0YXR1c190IHBhcnNlQXR0cmlidXRlcyhjb25zdCBfeG1sTm9kZSAqY3VyLCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMpCit7CisgICAgZm9yICg7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQ29udGVudFR5cGUiKSkpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGNvbnRlbnRUeXBlWG1sID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgInZhbHVlIik7CisgICAgICAgICAgICBhdWRpb19jb250ZW50X3R5cGVfdCBjb250ZW50VHlwZTsKKyAgICAgICAgICAgIGlmIChub3QgQXVkaW9Db250ZW50VHlwZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyhjb250ZW50VHlwZVhtbC5jX3N0cigpLCBjb250ZW50VHlwZSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBjb250ZW50IHR5cGUgJXMiLCBjb250ZW50VHlwZVhtbC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYXR0cmlidXRlcy5jb250ZW50X3R5cGUgPSBjb250ZW50VHlwZTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBjb250ZW50IHR5cGUgJXMiLCAgX19GVU5DVElPTl9fLCBjb250ZW50VHlwZVhtbC5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJVc2FnZSIpKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgdXNhZ2VYbWwgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCAidmFsdWUiKTsKKyAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2U7CisgICAgICAgICAgICBpZiAobm90IFVzYWdlVHlwZUNvbnZlcnRlcjo6ZnJvbVN0cmluZyh1c2FnZVhtbC5jX3N0cigpLCB1c2FnZSkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCB1c2FnZSAlcyIsIHVzYWdlWG1sLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBhdHRyaWJ1dGVzLnVzYWdlID0gdXNhZ2U7CisgICAgICAgICAgICBBTE9HVigiJXMgdXNhZ2UgJXMiLCAgX19GVU5DVElPTl9fLCB1c2FnZVhtbC5jX3N0cigpKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJGbGFncyIpKSkgeworICAgICAgICAgICAgc3RkOjpzdHJpbmcgZmxhZ3MgPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCAidmFsdWUiKTsKKworICAgICAgICAgICAgQUxPR1YoIiVzIGZsYWdzICVzIiwgIF9fRlVOQ1RJT05fXywgZmxhZ3MuY19zdHIoKSk7CisgICAgICAgICAgICBhdHRyaWJ1dGVzLmZsYWdzID0gQXVkaW9GbGFnQ29udmVydGVyOjptYXNrRnJvbVN0cmluZyhmbGFncywgIiAiKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIXhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJCdW5kbGUiKSkpIHsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGJ1bmRsZUtleSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsICJrZXkiKTsKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGJ1bmRsZVZhbHVlID0gZ2V0WG1sQXR0cmlidXRlKGN1ciwgInZhbHVlIik7CisKKyAgICAgICAgICAgIEFMT0dWKCIlcyBCdW5kbGUgJXMgJXMiLCAgX19GVU5DVElPTl9fLCBidW5kbGVLZXkuY19zdHIoKSwgYnVuZGxlVmFsdWUuY19zdHIoKSk7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIHRhZ3MoYnVuZGxlS2V5ICsgIj0iICsgYnVuZGxlVmFsdWUpOworICAgICAgICAgICAgc3RkOjpzdHJuY3B5KGF0dHJpYnV0ZXMudGFncywgdGFncy5jX3N0cigpLCBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXRpYyBzdGF0dXNfdCBkZXNlcmlhbGl6ZUF0dHJpYnV0ZXMoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqY3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMpIHsKKyAgICAvLyBSZXRyaWV2ZSBjb250ZW50IHR5cGUsIHVzYWdlLCBmbGFncywgYW5kIGJ1bmRsZSBmcm9tIHhtbAorICAgIGZvciAoOyBjdXIgIT0gTlVMTDsgY3VyID0gY3VyLT5uZXh0KSB7CisgICAgICAgIGlmIChub3QgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkF0dHJpYnV0ZXMiKSkpIHsKKyAgICAgICAgICAgIGNvbnN0IHhtbE5vZGUgKmF0dHJOb2RlID0gY3VyOworICAgICAgICAgICAgc3RkOjpzdHJpbmcgYXR0clJlZiA9IGdldFhtbEF0dHJpYnV0ZShjdXIsIGF0dHJpYnV0ZXNBdHRyaWJ1dGVSZWYpOworICAgICAgICAgICAgaWYgKCFhdHRyUmVmLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBnZXRSZWZlcmVuY2UoeG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKSwgYXR0ck5vZGUsIGF0dHJSZWYsIGF0dHJpYnV0ZXNBdHRyaWJ1dGVSZWYpOworICAgICAgICAgICAgICAgIGlmIChhdHRyTm9kZSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogTm8gcmVmZXJlbmNlIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgYXR0clJlZi5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGRlc2VyaWFsaXplQXR0cmlidXRlcyhkb2MsIGF0dHJOb2RlLT54bWxDaGlsZHJlbk5vZGUsIGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHBhcnNlQXR0cmlidXRlcyhhdHRyTm9kZS0+eG1sQ2hpbGRyZW5Ob2RlLCBhdHRyaWJ1dGVzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobm90IHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJDb250ZW50VHlwZSIpKSB8fAorICAgICAgICAgICAgICAgIG5vdCB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiVXNhZ2UiKSkgfHwKKyAgICAgICAgICAgICAgICBub3QgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIkZsYWdzIikpIHx8CisgICAgICAgICAgICAgICAgbm90IHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJCdW5kbGUiKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXJzZUF0dHJpYnV0ZXMoY3VyLCBhdHRyaWJ1dGVzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gQkFEX1ZBTFVFOworfQorCitzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemVBdHRyaWJ1dGVzQ29sbGVjdGlvbihfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzVmVjdG9yICZjb2xsZWN0aW9uKQoreworICAgIHN0YXR1c190IHJldCA9IEJBRF9WQUxVRTsKKyAgICAvLyBFaXRoZXIgd2UgZG8gcHJvdmlkZSBvbmx5IG9uZSBhdHRyaWJ1dGVzIG9yIGEgY29sbGVjdGlvbiBvZiBzdXBwb3J0ZWQgYXR0cmlidXRlcworICAgIGZvciAoY3VyID0gY3VyLT54bWxDaGlsZHJlbk5vZGU7IGN1ciAhPSBOVUxMOyBjdXIgPSBjdXItPm5leHQpIHsKKyAgICAgICAgaWYgKG5vdCB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQXR0cmlidXRlcyIpKSB8fAorICAgICAgICAgICAgICAgIG5vdCB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQ29udGVudFR5cGUiKSkgfHwKKyAgICAgICAgICAgICAgICBub3QgeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKikoIlVzYWdlIikpIHx8CisgICAgICAgICAgICAgICAgbm90IHhtbFN0cmNtcChjdXItPm5hbWUsIChjb25zdCB4bWxDaGFyICopKCJGbGFncyIpKSB8fAorICAgICAgICAgICAgICAgIG5vdCB4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQnVuZGxlIikpKSB7CisgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9IEFVRElPX0FUVFJJQlVURVNfSU5JVElBTElaRVI7CisgICAgICAgICAgICByZXQgPSBkZXNlcmlhbGl6ZUF0dHJpYnV0ZXMoZG9jLCBjdXIsIGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgaWYgKHJldCA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGNvbGxlY3Rpb24ucHVzaF9iYWNrKGF0dHJpYnV0ZXMpOworICAgICAgICAgICAgICAgIC8vIFdlIGFyZSBkb25lIGlmIHRoZSAiQXR0cmlidXRlcyIgYmFsaXNlIGlzIG9taXR0ZWQsIG9ubHkgb25lIEF0dHJpYnV0ZXMgaXMgYWxsb3dlZAorICAgICAgICAgICAgICAgIGlmICh4bWxTdHJjbXAoY3VyLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKSgiQXR0cmlidXRlcyIpKSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitzdGF0dXNfdCBBdHRyaWJ1dGVzR3JvdXBUcmFpdHM6OmRlc2VyaWFsaXplKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmNoaWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9uICZhdHRyaWJ1dGVzR3JvdXApCit7CisgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgaWYgKG5hbWUuZW1wdHkoKSkgeworICAgICAgICBBTE9HVigiQXR0cmlidXRlc0dyb3VwVHJhaXRzIE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIH0KKyAgICBBTE9HVigiJXM6ICVzID0gJXMiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CisKKyAgICBzdGQ6OnN0cmluZyB2b2x1bWVHcm91cCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6dm9sdW1lR3JvdXApOworICAgIGlmICh2b2x1bWVHcm91cC5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gYXR0cmlidXRlICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjp2b2x1bWVHcm91cCk7CisgICAgfQorICAgIEFMT0dWKCIlczogJXMgPSAlcyIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6dm9sdW1lR3JvdXAsIHZvbHVtZUdyb3VwLmNfc3RyKCkpOworCisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW1UeXBlID0gQVVESU9fU1RSRUFNX0RFRkFVTFQ7CisgICAgc3RkOjpzdHJpbmcgc3RyZWFtVHlwZVhtbCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6c3RyZWFtVHlwZSk7CisgICAgaWYgKHN0cmVhbVR5cGVYbWwuZW1wdHkoKSkgeworICAgICAgICBBTE9HVigiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6c3RyZWFtVHlwZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIiVzOiAlcyA9ICVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpzdHJlYW1UeXBlLCBzdHJlYW1UeXBlWG1sLmNfc3RyKCkpOworICAgICAgICBpZiAobm90IFN0cmVhbVR5cGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcoc3RyZWFtVHlwZVhtbC5jX3N0cigpLCBzdHJlYW1UeXBlKSkgeworICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgc3RyZWFtIHR5cGUgJXMiLCBzdHJlYW1UeXBlWG1sLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICBBdHRyaWJ1dGVzVmVjdG9yIGF0dHJpYnV0ZXNWZWN0OworICAgIGRlc2VyaWFsaXplQXR0cmlidXRlc0NvbGxlY3Rpb24oZG9jLCBjaGlsZCwgYXR0cmlidXRlc1ZlY3QpOworCisgICAgYXR0cmlidXRlc0dyb3VwLnB1c2hfYmFjayh7bmFtZSwgc3RyZWFtVHlwZSwgdm9sdW1lR3JvdXAsIGF0dHJpYnV0ZXNWZWN0fSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBWYWx1ZVRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqLypkb2MqLywgY29uc3QgX3htbE5vZGUgKmNoaWxkLCBDb2xsZWN0aW9uICZ2YWx1ZXMpCit7CisgICAgc3RkOjpzdHJpbmcgbGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjaGlsZCwgQXR0cmlidXRlczo6bGl0ZXJhbCk7CisgICAgaWYgKGxpdGVyYWwuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bGl0ZXJhbCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHVpbnQzMl90IG51bWVyaWNhbCA9IDA7CisgICAgc3RkOjpzdHJpbmcgbnVtZXJpY2FsVGFnID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpudW1lcmljYWwpOworICAgIGlmIChudW1lcmljYWxUYWcuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bGl0ZXJhbCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICghY29udmVydFRvKG51bWVyaWNhbFRhZywgbnVtZXJpY2FsKSkgeworICAgICAgICBBTE9HRSgiJXM6IDogSW52YWxpZCB2YWx1ZSglcykiLCBfX0ZVTkNUSU9OX18sIG51bWVyaWNhbFRhZy5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgdmFsdWVzLnB1c2hfYmFjayh7bnVtZXJpY2FsLCBsaXRlcmFsfSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBDcml0ZXJpb25UeXBlVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gJmNyaXRlcmlvblR5cGVzKQoreworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBhdHRyaWJ1dGUgJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigiJXM6ICVzICVzID0gJXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKKworICAgIHN0ZDo6c3RyaW5nIHR5cGUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OnR5cGUpOworICAgIGlmICh0eXBlLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBhdHRyaWJ1dGUgJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6OnR5cGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigiJXM6ICVzICVzID0gJXMiLCBfX0ZVTkNUSU9OX18sIHRhZywgQXR0cmlidXRlczo6dHlwZSwgdHlwZS5jX3N0cigpKTsKKyAgICBib29sIGlzSW5jbHVzaXZlKHR5cGUgPT0gImluY2x1c2l2ZSIpOworCisgICAgVmFsdWVQYWlycyBwYWlyczsKKyAgICBzaXplX3QgbmJTa2lwcGVkRWxlbWVudHMgPSAwOworICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxWYWx1ZVRyYWl0cz4oZG9jLCBjaGlsZCwgcGFpcnMsIG5iU2tpcHBlZEVsZW1lbnRzKTsKKyAgICBjcml0ZXJpb25UeXBlcy5wdXNoX2JhY2soe25hbWUsIGlzSW5jbHVzaXZlLCBwYWlyc30pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQ3JpdGVyaW9uVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICovKmRvYyovLCBjb25zdCBfeG1sTm9kZSAqY2hpbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gJmNyaXRlcmlhKQoreworICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgIGlmIChuYW1lLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBhdHRyaWJ1dGUgJXMgZm91bmQiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6Om5hbWUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBBTE9HVigiJXM6ICVzID0gJXMiLCBfX0ZVTkNUSU9OX18sIEF0dHJpYnV0ZXM6Om5hbWUsIG5hbWUuY19zdHIoKSk7CisKKyAgICBzdGQ6OnN0cmluZyBkZWZhdWx0VmFsdWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OmRlZmF1bHRWYWwpOworICAgIGlmIChkZWZhdWx0VmFsdWUuZW1wdHkoKSkgeworICAgICAgICAvLyBOb3QgbWFuZGF0b3J5IHRvIHByb3ZpZGUgYSBkZWZhdWx0IHZhbHVlIGZvciBhIGNyaXRlcmlvbiwgZXZlbiBpdCBpcyByZWNvbW1hbmRlZC4uLgorICAgICAgICBBTE9HVigiJXM6IE5vIGF0dHJpYnV0ZSAlcyBmb3VuZCAoYnV0IHJlY29tbWFuZGVkKSIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6ZGVmYXVsdFZhbCk7CisgICAgfQorICAgIEFMT0dWKCIlczogJXMgPSAlcyIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6ZGVmYXVsdFZhbCwgZGVmYXVsdFZhbHVlLmNfc3RyKCkpOworCisgICAgc3RkOjpzdHJpbmcgdHlwZU5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUoY2hpbGQsIEF0dHJpYnV0ZXM6OnR5cGUpOworICAgIGlmICh0eXBlTmFtZS5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gYXR0cmlidXRlICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiAlcyA9ICVzIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjp0eXBlLCB0eXBlTmFtZS5jX3N0cigpKTsKKworICAgIGNyaXRlcmlhLnB1c2hfYmFjayh7bmFtZSwgdHlwZU5hbWUsIGRlZmF1bHRWYWx1ZX0pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgUHJvZHVjdFN0cmF0ZWd5VHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiAmc3RyYXRlZ2llcykKK3sKKyAgICBzdGQ6OnN0cmluZyBuYW1lID0gZ2V0WG1sQXR0cmlidXRlKGNoaWxkLCBBdHRyaWJ1dGVzOjpuYW1lKTsKKyAgICBpZiAobmFtZS5lbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCJQcm9kdWN0U3RyYXRlZ3lUcmFpdHMgTm8gYXR0cmlidXRlICVzIGZvdW5kIiwgQXR0cmlidXRlczo6bmFtZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCIlczogJXMgPSAlcyIsIF9fRlVOQ1RJT05fXywgQXR0cmlidXRlczo6bmFtZSwgbmFtZS5jX3N0cigpKTsKKworICAgIHNpemVfdCBza2lwcGVkID0gMDsKKyAgICBBdHRyaWJ1dGVzR3JvdXBzIGF0dHJHcm91cHM7CisgICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPEF0dHJpYnV0ZXNHcm91cFRyYWl0cz4oZG9jLCBjaGlsZCwgYXR0ckdyb3Vwcywgc2tpcHBlZCk7CisKKyAgICBzdHJhdGVnaWVzLnB1c2hfYmFjayh7bmFtZSwgYXR0ckdyb3Vwc30pOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgVm9sdW1lVHJhaXRzOjpkZXNlcmlhbGl6ZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpyb290LCBDb2xsZWN0aW9uICZ2b2x1bWVzKQoreworICAgIHN0ZDo6c3RyaW5nIGRldmljZUNhdGVnb3J5ID0gZ2V0WG1sQXR0cmlidXRlKHJvb3QsIEF0dHJpYnV0ZXM6OmRldmljZUNhdGVnb3J5KTsKKyAgICBpZiAoZGV2aWNlQ2F0ZWdvcnkuZW1wdHkoKSkgeworICAgICAgICBBTE9HVygiJXM6IE5vICVzIGZvdW5kIiwgX19GVU5DVElPTl9fLCBBdHRyaWJ1dGVzOjpkZXZpY2VDYXRlZ29yeSk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHJlZmVyZW5jZU5hbWUgPSBnZXRYbWxBdHRyaWJ1dGUocm9vdCwgQXR0cmlidXRlczo6cmVmZXJlbmNlKTsKKyAgICBjb25zdCBfeG1sTm9kZSAqcmVmID0gTlVMTDsKKyAgICBpZiAoIXJlZmVyZW5jZU5hbWUuZW1wdHkoKSkgeworICAgICAgICBnZXRSZWZlcmVuY2UoeG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKSwgcmVmLCByZWZlcmVuY2VOYW1lLCBjb2xsZWN0aW9uVGFnKTsKKyAgICAgICAgaWYgKHJlZiA9PSBOVUxMKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE5vIHJlZmVyZW5jZSBQdHIgZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCByZWZlcmVuY2VOYW1lLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBSZXRyaWV2ZSBjdXJ2ZSBwb2ludCBmcm9tIHJlZmVyZW5jZSBlbGVtZW50IGlmIGZvdW5kIG9yIGRpcmVjdGx5IGZyb20gY3VycmVudCBjdXJ2ZQorICAgIEN1cnZlUG9pbnRzIGN1cnZlUG9pbnRzOworICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY2hpbGQgPSByZWZlcmVuY2VOYW1lLmVtcHR5KCkgPworICAgICAgICAgcm9vdC0+eG1sQ2hpbGRyZW5Ob2RlIDogcmVmLT54bWxDaGlsZHJlbk5vZGU7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgaWYgKCF4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopdm9sdW1lUG9pbnRUYWcpKSB7CisgICAgICAgICAgICB4bWxDaGFyVW5pcXVlIHBvaW50WG1sKHhtbE5vZGVMaXN0R2V0U3RyaW5nKGRvYywgY2hpbGQtPnhtbENoaWxkcmVuTm9kZSwgMSksIHhtbEZyZWUpOworICAgICAgICAgICAgaWYgKHBvaW50WG1sID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgQUxPR1YoIiVzOiAlcz0lcyIsIF9fZnVuY19fLCB0YWcsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBvaW50WG1sLmdldCgpKSk7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHBvaW50OworICAgICAgICAgICAgY29sbGVjdGlvbkZyb21TdHJpbmc8RGVmYXVsdFRyYWl0czxpbnQ+PigKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBvaW50WG1sLmdldCgpKSwgcG9pbnQsICIsIik7CisgICAgICAgICAgICBpZiAocG9pbnQuc2l6ZSgpICE9IDIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgJXM6ICVzIiwgX19mdW5jX18sIHZvbHVtZVBvaW50VGFnLAorICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHBvaW50WG1sLmdldCgpKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGN1cnZlUG9pbnRzLnB1c2hfYmFjayh7cG9pbnRbMF0sIHBvaW50WzFdfSk7CisgICAgICAgIH0KKyAgICB9CisgICAgdm9sdW1lcy5wdXNoX2JhY2soeyBkZXZpY2VDYXRlZ29yeSwgY3VydmVQb2ludHMgfSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBWb2x1bWVHcm91cFRyYWl0czo6ZGVzZXJpYWxpemUoX3htbERvYyAqZG9jLCBjb25zdCBfeG1sTm9kZSAqcm9vdCwgQ29sbGVjdGlvbiAmdm9sdW1lcykKK3sKKyAgICBzdGQ6OnN0cmluZyBuYW1lOworICAgIGludCBpbmRleE1pbiA9IDA7CisgICAgaW50IGluZGV4TWF4ID0gMDsKKyAgICBTdHJlYW1WZWN0b3Igc3RyZWFtcyA9IHt9OworICAgIEF0dHJpYnV0ZXNWZWN0b3IgYXR0cmlidXRlc1ZlY3QgPSB7fTsKKworICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY2hpbGQgPSByb290LT54bWxDaGlsZHJlbk5vZGU7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgaWYgKG5vdCB4bWxTdHJjbXAoY2hpbGQtPm5hbWUsIChjb25zdCB4bWxDaGFyICopQXR0cmlidXRlczo6bmFtZSkpIHsKKyAgICAgICAgICAgIHhtbENoYXJVbmlxdWUgbmFtZVhtbCh4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpLCB4bWxGcmVlKTsKKyAgICAgICAgICAgIGlmIChuYW1lWG1sID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbmFtZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KG5hbWVYbWwuZ2V0KCkpOworICAgICAgICB9CisgICAgICAgIGlmIChub3QgeG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKUF0dHJpYnV0ZXM6OmluZGV4TWluKSkgeworICAgICAgICAgICAgeG1sQ2hhclVuaXF1ZSBpbmRleE1pblhtbCh4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpLCB4bWxGcmVlKTsKKyAgICAgICAgICAgIGlmIChpbmRleE1pblhtbCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGV4TWluTGl0ZXJhbChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihpbmRleE1pblhtbC5nZXQoKSkpOworICAgICAgICAgICAgaWYgKCFjb252ZXJ0VG8oaW5kZXhNaW5MaXRlcmFsLCBpbmRleE1pbikpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChub3QgeG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKUF0dHJpYnV0ZXM6OmluZGV4TWF4KSkgeworICAgICAgICAgICAgeG1sQ2hhclVuaXF1ZSBpbmRleE1heFhtbCh4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpLCB4bWxGcmVlKTsKKyAgICAgICAgICAgIGlmIChpbmRleE1heFhtbCA9PSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nIGluZGV4TWF4TGl0ZXJhbChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihpbmRleE1heFhtbC5nZXQoKSkpOworICAgICAgICAgICAgaWYgKCFjb252ZXJ0VG8oaW5kZXhNYXhMaXRlcmFsLCBpbmRleE1heCkpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGRlc2VyaWFsaXplQXR0cmlidXRlc0NvbGxlY3Rpb24oZG9jLCByb290LCBhdHRyaWJ1dGVzVmVjdCk7CisKKyAgICBzdGQ6OnN0cmluZyBzdHJlYW1OYW1lczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmVhbSA6IHN0cmVhbXMpIHsKKyAgICAgICAgc3RyZWFtTmFtZXMgKz0gYW5kcm9pZDo6dG9TdHJpbmcoc3RyZWFtKSArICIgIjsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgYXR0cm1OYW1lczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJmF0dHIgOiBhdHRyaWJ1dGVzVmVjdCkgeworICAgICAgICBhdHRybU5hbWVzICs9IGFuZHJvaWQ6OnRvU3RyaW5nKGF0dHIpICsgIlxuIjsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBncm91cD0lcyBpbmRleE1pbj0lZCwgaW5kZXhNYXg9JWQgc3RyZWFtcz0lcyBhdHRyaWJ1dGVzPSVzIiwKKyAgICAgICAgICBfX2Z1bmNfXywgbmFtZS5jX3N0cigpLCBpbmRleE1pbiwgaW5kZXhNYXgsIHN0cmVhbU5hbWVzLmNfc3RyKCksIGF0dHJtTmFtZXMuY19zdHIoICkpOworCisgICAgVm9sdW1lQ3VydmVzIGdyb3VwVm9sdW1lQ3VydmVzOworICAgIHNpemVfdCBza2lwcGVkID0gMDsKKyAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Vm9sdW1lVHJhaXRzPihkb2MsIHJvb3QsIGdyb3VwVm9sdW1lQ3VydmVzLCBza2lwcGVkKTsKKyAgICB2b2x1bWVzLnB1c2hfYmFjayh7IG5hbWUsIGluZGV4TWluLCBpbmRleE1heCwgZ3JvdXBWb2x1bWVDdXJ2ZXMgfSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmxlZ2FjeVZvbHVtZWNvbGxlY3Rpb25UYWcgPSAidm9sdW1lcyI7CitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmxlZ2FjeVZvbHVtZVRhZyA9ICJ2b2x1bWUiOworCitzdGF0dXNfdCBkZXNlcmlhbGl6ZUxlZ2FjeVZvbHVtZShfeG1sRG9jICpkb2MsIGNvbnN0IF94bWxOb2RlICpjdXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVm9sdW1lQ3VydmVzPiAmbGVnYWN5Vm9sdW1lcykKK3sKKyAgICBzdGQ6OnN0cmluZyBzdHJlYW1UeXBlTGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsICJzdHJlYW0iKTsKKyAgICBpZiAoc3RyZWFtVHlwZUxpdGVyYWwuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSBzdHJlYW0gZm91bmQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIGRldmljZUNhdGVnb3J5TGl0ZXJhbCA9IGdldFhtbEF0dHJpYnV0ZShjdXIsICJkZXZpY2VDYXRlZ29yeSIpOworICAgIGlmIChkZXZpY2VDYXRlZ29yeUxpdGVyYWwuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGF0dHJpYnV0ZSBkZXZpY2VDYXRlZ29yeSBmb3VuZCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgcmVmZXJlbmNlTmFtZSA9IGdldFhtbEF0dHJpYnV0ZShjdXIsICJyZWYiKTsKKyAgICBjb25zdCB4bWxOb2RlICpyZWYgPSBOVUxMOworICAgIGlmICghcmVmZXJlbmNlTmFtZS5lbXB0eSgpKSB7CisgICAgICAgIGdldFJlZmVyZW5jZSh4bWxEb2NHZXRSb290RWxlbWVudChkb2MpLCByZWYsIHJlZmVyZW5jZU5hbWUsIGxlZ2FjeVZvbHVtZWNvbGxlY3Rpb25UYWcpOworICAgICAgICBpZiAocmVmID09IE5VTEwpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogTm8gcmVmZXJlbmNlIFB0ciBmb3VuZCBmb3IgJXMiLCBfX2Z1bmNfXywgcmVmZXJlbmNlTmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiVzOiByZWZlcmVuY2UgZm91bmQgZm9yICVzIiwgX19mdW5jX18sIHJlZmVyZW5jZU5hbWUuY19zdHIoKSk7CisgICAgfQorICAgIEN1cnZlUG9pbnRzIGN1cnZlUG9pbnRzOworICAgIGZvciAoY29uc3QgeG1sTm9kZSAqY2hpbGQgPSByZWZlcmVuY2VOYW1lLmVtcHR5KCkgPworICAgICAgICAgY3VyLT54bWxDaGlsZHJlbk5vZGUgOiByZWYtPnhtbENoaWxkcmVuTm9kZTsgY2hpbGQgIT0gTlVMTDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworICAgICAgICBpZiAoIXhtbFN0cmNtcChjaGlsZC0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilWb2x1bWVUcmFpdHM6OnZvbHVtZVBvaW50VGFnKSkgeworICAgICAgICAgICAgeG1sQ2hhclVuaXF1ZSBwb2ludFhtbCh4bWxOb2RlTGlzdEdldFN0cmluZyhkb2MsIGNoaWxkLT54bWxDaGlsZHJlbk5vZGUsIDEpLCB4bWxGcmVlKTsKKyAgICAgICAgICAgIGlmIChwb2ludFhtbCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEFMT0dWKCIlczogJXM9JXMiLCBfX2Z1bmNfXywgbGVnYWN5Vm9sdW1lVGFnLAorICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocG9pbnRYbWwuZ2V0KCkpKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gcG9pbnQ7CisgICAgICAgICAgICBjb2xsZWN0aW9uRnJvbVN0cmluZzxEZWZhdWx0VHJhaXRzPGludD4+KAorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4ocG9pbnRYbWwuZ2V0KCkpLCBwb2ludCwgIiwiKTsKKyAgICAgICAgICAgIGlmIChwb2ludC5zaXplKCkgIT0gMikgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCAlczogJXMiLCBfX2Z1bmNfXywgVm9sdW1lVHJhaXRzOjp2b2x1bWVQb2ludFRhZywKKyAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihwb2ludFhtbC5nZXQoKSkpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJ2ZVBvaW50cy5wdXNoX2JhY2soe3BvaW50WzBdLCBwb2ludFsxXX0pOworICAgICAgICB9CisgICAgfQorICAgIGxlZ2FjeVZvbHVtZXNbc3RyZWFtVHlwZUxpdGVyYWxdLnB1c2hfYmFjayh7IGRldmljZUNhdGVnb3J5TGl0ZXJhbCwgY3VydmVQb2ludHMgfSk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0aWMgc3RhdHVzX3QgZGVzZXJpYWxpemVMZWdhY3lWb2x1bWVDb2xsZWN0aW9uKF94bWxEb2MgKmRvYywgY29uc3QgX3htbE5vZGUgKmN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lR3JvdXBzICZ2b2x1bWVHcm91cHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAmbmJTa2lwcGVkRWxlbWVudCkKK3sKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVm9sdW1lQ3VydmVzPiBsZWdhY3lWb2x1bWVNYXA7CisgICAgZm9yIChjdXIgPSBjdXItPnhtbENoaWxkcmVuTm9kZTsgY3VyICE9IE5VTEw7IGN1ciA9IGN1ci0+bmV4dCkgeworICAgICAgICBpZiAoeG1sU3RyY21wKGN1ci0+bmFtZSwgKGNvbnN0IHhtbENoYXIgKilsZWdhY3lWb2x1bWVjb2xsZWN0aW9uVGFnKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgY29uc3QgeG1sTm9kZSAqY2hpbGQgPSBjdXItPnhtbENoaWxkcmVuTm9kZTsKKyAgICAgICAgZm9yICg7IGNoaWxkICE9IE5VTEw7IGNoaWxkID0gY2hpbGQtPm5leHQpIHsKKyAgICAgICAgICAgIGlmICgheG1sU3RyY21wKGNoaWxkLT5uYW1lLCAoY29uc3QgeG1sQ2hhciAqKWxlZ2FjeVZvbHVtZVRhZykpIHsKKworICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplTGVnYWN5Vm9sdW1lKGRvYywgY2hpbGQsIGxlZ2FjeVZvbHVtZU1hcCk7CisgICAgICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICBuYlNraXBwZWRFbGVtZW50ICs9IDE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGZvciAoY29uc3QgYXV0byAmdm9sdW1lTWFwSXRlciA6IGxlZ2FjeVZvbHVtZU1hcCkgeworICAgICAgICAvLyBJbiBvcmRlciB0byBsZXQgQXVkaW9TZXJ2aWNlIHNldHRpbmcgdGhlIG1pbiBhbmQgbWF4IChjb21wYXRpYmlsaXR5KSwgc2V0IE1pbiBhbmQgTWF4CisgICAgICAgIC8vIHRvIC0xIGV4Y2VwdCBmb3IgcHJpdmF0ZSBzdHJlYW1zCisgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtVHlwZTsKKyAgICAgICAgaWYgKCFTdHJlYW1UeXBlQ29udmVydGVyOjpmcm9tU3RyaW5nKHZvbHVtZU1hcEl0ZXIuZmlyc3QsIHN0cmVhbVR5cGUpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgc3RyZWFtICVzIiwgX19mdW5jX18sIHZvbHVtZU1hcEl0ZXIuZmlyc3QuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIGludCBpbmRleE1pbiA9IHN0cmVhbVR5cGUgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQgPyAwIDogLTE7CisgICAgICAgIGludCBpbmRleE1heCA9IHN0cmVhbVR5cGUgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQgPyAxMDAgOiAtMTsKKyAgICAgICAgdm9sdW1lR3JvdXBzLnB1c2hfYmFjayh7IHZvbHVtZU1hcEl0ZXIuZmlyc3QsIGluZGV4TWluLCBpbmRleE1heCwgdm9sdW1lTWFwSXRlci5zZWNvbmQgfSk7CisgICAgfQorICAgIHJldHVybiBOT19FUlJPUjsKK30KKworbmFtZXNwYWNlIHsKKworY2xhc3MgWG1sRXJyb3JIYW5kbGVyIHsKK3B1YmxpYzoKKyAgICBYbWxFcnJvckhhbmRsZXIoKSB7CisgICAgICAgIHhtbFNldEdlbmVyaWNFcnJvckZ1bmModGhpcywgJnhtbEVycm9ySGFuZGxlcik7CisgICAgfQorICAgIFhtbEVycm9ySGFuZGxlcihjb25zdCBYbWxFcnJvckhhbmRsZXImKSA9IGRlbGV0ZTsKKyAgICBYbWxFcnJvckhhbmRsZXIoWG1sRXJyb3JIYW5kbGVyJiYpID0gZGVsZXRlOworICAgIFhtbEVycm9ySGFuZGxlciYgb3BlcmF0b3I9KGNvbnN0IFhtbEVycm9ySGFuZGxlciYpID0gZGVsZXRlOworICAgIFhtbEVycm9ySGFuZGxlciYgb3BlcmF0b3I9KFhtbEVycm9ySGFuZGxlciYmKSA9IGRlbGV0ZTsKKyAgICB+WG1sRXJyb3JIYW5kbGVyKCkgeworICAgICAgICB4bWxTZXRHZW5lcmljRXJyb3JGdW5jKE5VTEwsIE5VTEwpOworICAgICAgICBpZiAoIW1FcnJvck1lc3NhZ2UuZW1wdHkoKSkgeworICAgICAgICAgICAgQUxPRyhMT0dfRVJST1IsICJsaWJ4bWwyIiwgIiVzIiwgbUVycm9yTWVzc2FnZS5jX3N0cigpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgdm9pZCB4bWxFcnJvckhhbmRsZXIodm9pZCogY3R4LCBjb25zdCBjaGFyKiBtc2csIC4uLikgeworICAgICAgICBjaGFyIGJ1ZmZlclsyNTZdOworICAgICAgICB2YV9saXN0IGFyZ3M7CisgICAgICAgIHZhX3N0YXJ0KGFyZ3MsIG1zZyk7CisgICAgICAgIHZzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCBtc2csIGFyZ3MpOworICAgICAgICB2YV9lbmQoYXJncyk7CisgICAgICAgIHN0YXRpY19jYXN0PFhtbEVycm9ySGFuZGxlcio+KGN0eCktPm1FcnJvck1lc3NhZ2UgKz0gYnVmZmVyOworICAgIH0KK3ByaXZhdGU6CisgICAgc3RkOjpzdHJpbmcgbUVycm9yTWVzc2FnZTsKK307CisKK30gIC8vIG5hbWVzcGFjZQorCitQYXJzaW5nUmVzdWx0IHBhcnNlKGNvbnN0IGNoYXIqIHBhdGgpIHsKKyAgICBYbWxFcnJvckhhbmRsZXIgZXJyb3JIYW5kbGVyOworICAgIHhtbERvY1B0ciBkb2M7CisgICAgZG9jID0geG1sUGFyc2VGaWxlKHBhdGgpOworICAgIGlmIChkb2MgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZSBkb2N1bWVudCAlcyIsIF9fRlVOQ1RJT05fXywgcGF0aCk7CisgICAgICAgIHJldHVybiB7bnVsbHB0ciwgMH07CisgICAgfQorICAgIHhtbE5vZGVQdHIgY3VyID0geG1sRG9jR2V0Um9vdEVsZW1lbnQoZG9jKTsKKyAgICBpZiAoY3VyID09IE5VTEwpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgcGFyc2U6IGVtcHR5IGRvY3VtZW50ICVzIiwgX19GVU5DVElPTl9fLCBwYXRoKTsKKyAgICAgICAgeG1sRnJlZURvYyhkb2MpOworICAgICAgICByZXR1cm4ge251bGxwdHIsIDB9OworICAgIH0KKyAgICBpZiAoeG1sWEluY2x1ZGVQcm9jZXNzKGRvYykgPCAwKSB7CisgICAgICAgIEFMT0dFKCIlczogbGlieG1sIGZhaWxlZCB0byByZXNvbHZlIFhJbmNsdWRlcyBvbiBkb2N1bWVudCAlcyIsIF9fRlVOQ1RJT05fXywgcGF0aCk7CisgICAgICAgIHJldHVybiB7bnVsbHB0ciwgMH07CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHZlcnNpb24gPSBnZXRYbWxBdHRyaWJ1dGUoY3VyLCBnVmVyc2lvbkF0dHJpYnV0ZSk7CisgICAgaWYgKHZlcnNpb24uZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIHZlcnNpb24gZm91bmQiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiB7bnVsbHB0ciwgMH07CisgICAgfQorICAgIHNpemVfdCBuYlNraXBwZWRFbGVtZW50cyA9IDA7CisgICAgYXV0byBjb25maWcgPSBzdGQ6Om1ha2VfdW5pcXVlPENvbmZpZz4oKTsKKyAgICBjb25maWctPnZlcnNpb24gPSBzdGQ6OnN0b2YodmVyc2lvbik7CisgICAgZGVzZXJpYWxpemVDb2xsZWN0aW9uPFByb2R1Y3RTdHJhdGVneVRyYWl0cz4oCisgICAgICAgICAgICAgICAgZG9jLCBjdXIsIGNvbmZpZy0+cHJvZHVjdFN0cmF0ZWdpZXMsIG5iU2tpcHBlZEVsZW1lbnRzKTsKKyAgICBkZXNlcmlhbGl6ZUNvbGxlY3Rpb248Q3JpdGVyaW9uVHJhaXRzPigKKyAgICAgICAgICAgICAgICBkb2MsIGN1ciwgY29uZmlnLT5jcml0ZXJpYSwgbmJTa2lwcGVkRWxlbWVudHMpOworICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxDcml0ZXJpb25UeXBlVHJhaXRzPigKKyAgICAgICAgICAgICAgICBkb2MsIGN1ciwgY29uZmlnLT5jcml0ZXJpb25UeXBlcywgbmJTa2lwcGVkRWxlbWVudHMpOworICAgIGRlc2VyaWFsaXplQ29sbGVjdGlvbjxWb2x1bWVHcm91cFRyYWl0cz4oCisgICAgICAgICAgICAgICAgZG9jLCBjdXIsIGNvbmZpZy0+dm9sdW1lR3JvdXBzLCBuYlNraXBwZWRFbGVtZW50cyk7CisKKyAgICByZXR1cm4ge3N0ZDo6bW92ZShjb25maWcpLCBuYlNraXBwZWRFbGVtZW50c307Cit9CisKK2FuZHJvaWQ6OnN0YXR1c190IHBhcnNlTGVnYWN5Vm9sdW1lRmlsZShjb25zdCBjaGFyKiBwYXRoLCBWb2x1bWVHcm91cHMgJnZvbHVtZUdyb3VwcykgeworICAgIFhtbEVycm9ySGFuZGxlciBlcnJvckhhbmRsZXI7CisgICAgeG1sRG9jUHRyIGRvYzsKKyAgICBkb2MgPSB4bWxQYXJzZUZpbGUocGF0aCk7CisgICAgaWYgKGRvYyA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IHBhcnNlIGRvY3VtZW50ICVzIiwgX19GVU5DVElPTl9fLCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgeG1sTm9kZVB0ciBjdXIgPSB4bWxEb2NHZXRSb290RWxlbWVudChkb2MpOworICAgIGlmIChjdXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IENvdWxkIG5vdCBwYXJzZTogZW1wdHkgZG9jdW1lbnQgJXMiLCBfX0ZVTkNUSU9OX18sIHBhdGgpOworICAgICAgICB4bWxGcmVlRG9jKGRvYyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGlmICh4bWxYSW5jbHVkZVByb2Nlc3MoZG9jKSA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBsaWJ4bWwgZmFpbGVkIHRvIHJlc29sdmUgWEluY2x1ZGVzIG9uIGRvY3VtZW50ICVzIiwgX19GVU5DVElPTl9fLCBwYXRoKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc2l6ZV90IG5iU2tpcHBlZEVsZW1lbnRzID0gMDsKKyAgICByZXR1cm4gZGVzZXJpYWxpemVMZWdhY3lWb2x1bWVDb2xsZWN0aW9uKGRvYywgY3VyLCB2b2x1bWVHcm91cHMsIG5iU2tpcHBlZEVsZW1lbnRzKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmtDb25maWdMb2NhdGlvbkxpc3RbXSA9IHsiL29kbS9ldGMiLCAiL3ZlbmRvci9ldGMiLCAiL3N5c3RlbS9ldGMifTsKK3N0YXRpYyBjb25zdCBpbnQga0NvbmZpZ0xvY2F0aW9uTGlzdFNpemUgPQorICAgICAgICAoc2l6ZW9mKGtDb25maWdMb2NhdGlvbkxpc3QpIC8gc2l6ZW9mKGtDb25maWdMb2NhdGlvbkxpc3RbMF0pKTsKK3N0YXRpYyBjb25zdCBpbnQgZ0FwbVhtbENvbmZpZ0ZpbGVQYXRoTWF4TGVuZ3RoID0gMTI4OworCitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmFwbVhtbENvbmZpZ0ZpbGVOYW1lID0gImF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCI7CitzdGF0aWMgY29uc3RleHByIGNvbnN0IGNoYXIgKmFwbUEyZHBPZmZsb2FkRGlzYWJsZWRYbWxDb25maWdGaWxlTmFtZSA9CisgICAgICAgICJhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9hMmRwX29mZmxvYWRfZGlzYWJsZWQueG1sIjsKKworYW5kcm9pZDo6c3RhdHVzX3QgcGFyc2VMZWdhY3lWb2x1bWVzKFZvbHVtZUdyb3VwcyAmdm9sdW1lR3JvdXBzKSB7CisgICAgY2hhciBhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGVbZ0FwbVhtbENvbmZpZ0ZpbGVQYXRoTWF4TGVuZ3RoXTsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjaGFyICo+IGZpbGVOYW1lczsKKyAgICBzdGF0dXNfdCByZXQ7CisKKyAgICBpZiAocHJvcGVydHlfZ2V0X2Jvb2woInJvLmJsdWV0b290aC5hMmRwX29mZmxvYWQuc3VwcG9ydGVkIiwgZmFsc2UpICYmCisgICAgICAgICAgICBwcm9wZXJ0eV9nZXRfYm9vbCgicGVyc2lzdC5ibHVldG9vdGguYTJkcF9vZmZsb2FkLmRpc2FibGVkIiwgZmFsc2UpKSB7CisgICAgICAgIC8vIEEyRFAgb2ZmbG9hZCBzdXBwb3J0ZWQgYnV0IGRpc2FibGVkOiB0cnkgdG8gdXNlIHNwZWNpYWwgWE1MIGZpbGUKKyAgICAgICAgZmlsZU5hbWVzLnB1c2hfYmFjayhhcG1BMmRwT2ZmbG9hZERpc2FibGVkWG1sQ29uZmlnRmlsZU5hbWUpOworICAgIH0KKyAgICBmaWxlTmFtZXMucHVzaF9iYWNrKGFwbVhtbENvbmZpZ0ZpbGVOYW1lKTsKKworICAgIGZvciAoY29uc3QgY2hhciogZmlsZU5hbWUgOiBmaWxlTmFtZXMpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQ29uZmlnTG9jYXRpb25MaXN0U2l6ZTsgaSsrKSB7CisgICAgICAgICAgICBzbnByaW50ZihhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUsIHNpemVvZihhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUpLAorICAgICAgICAgICAgICAgICAgICAgIiVzLyVzIiwga0NvbmZpZ0xvY2F0aW9uTGlzdFtpXSwgZmlsZU5hbWUpOworICAgICAgICAgICAgcmV0ID0gcGFyc2VMZWdhY3lWb2x1bWVGaWxlKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgdm9sdW1lR3JvdXBzKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBCQURfVkFMVUU7Cit9CisKK30gLy8gbmFtZXNwYWNlIGVuZ2luZUNvbmZpZworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlYTQyYjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitjY19saWJyYXJ5X2hlYWRlcnMgeworICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeWVuZ2luZV9pbnRlcmZhY2VfaGVhZGVycyIsCisgICAgaG9zdF9zdXBwb3J0ZWQ6IHRydWUsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQ1OTRmNS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmg+Ci0jaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+Ci0jaW5jbHVkZSA8Vm9sdW1lLmg+Ci0jaW5jbHVkZSA8SHdNb2R1bGUuaD4KLSNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgotI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgotI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qKgotICogVGhpcyBpbnRlcmZhY2UgaXMgZGVkaWNhdGVkIHRvIHRoZSBwb2xpY3kgbWFuYWdlciB0aGF0IGEgUG9saWN5IEVuZ2luZSBzaGFsbCBpbXBsZW1lbnQuCi0gKi8KLWNsYXNzIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZQotewotcHVibGljOgotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGUgZW5naW5lIHdhcyBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIGluaXRpYWxpemF0aW9uIGhhcyBiZWVuIGRvbmUgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4uCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIHRoZSBNYW5hZ2VyIG9ic2VydmVyIHRoYXQgYWxsb3dzIHRoZSBlbmdpbmUgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gb24gY29sbGVjdGlvbgotICAgICAqIG9mIGRldmljZXMsIHN0cmVhbXMsIEh3TW9kdWxlcywgLi4uCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIG9ic2VydmVyIGhhbmRsZSBvbiB0aGUgbWFuYWdlci4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHZvaWQgc2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGlucHV0IGRldmljZSBzZWxlY3RlZCBmb3IgYSBnaXZlbiBpbnB1dCBzb3VyY2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIGlucHV0U291cmNlIHRvIGdldCB0aGUgc2VsZWN0ZWQgaW5wdXQgZGV2aWNlIGFzc29jaWF0ZWQgdG8KLSAgICAgKgotICAgICAqIEByZXR1cm4gc2VsZWN0ZWQgaW5wdXQgZGV2aWNlIGZvciB0aGUgZ2l2ZW4gaW5wdXQgc291cmNlLCBtYXkgYmUgbm9uZSBpZiBlcnJvci4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkgY29uc3QgPSAwOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBvdXRwdXQgZGV2aWNlIGFzc29jaWF0ZWQgdG8gYSBnaXZlbiBzdHJhdGVneS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gc3RyZWFtIHR5cGUgZm9yIHdoaWNoIHRoZSBzZWxlY3RlZCBvdXB1dCBkZXZpY2UgaXMgcmVxdWVzdGVkLgotICAgICAqCi0gICAgICogQHJldHVybiBzZWxlY3RlZCBvdXB1dCBkZXZpY2UgZm9yIHRoZSBnaXZlbiBzdHJhdGVneSwgbWF5IGJlIG5vbmUgaWYgZXJyb3IuCi0gICAgICovCi0gICAgdmlydHVhbCBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9yU3RyYXRlZ3kocm91dGluZ19zdHJhdGVneSBzdGF0ZWd5KSBjb25zdCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHN0cmF0ZWd5IHNlbGVjdGVkIGZvciBhIGdpdmVuIHN0cmVhbSB0eXBlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSBzdHJlYW06IGZvciB3aGljaCB0aGUgc2VsZWN0ZWQgc3RyYXRlZ3kgZm9sbG93ZWQgYnkgaXMgcmVxdWVzdGVkLgotICAgICAqCi0gICAgICogQHJldHVybiBzdHJhdGVneSB0byBiZSBmb2xsb3dlZC4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pID0gMDsKLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgc3RyYXRlZ3kgc2VsZWN0ZWQgZm9yIGEgZ2l2ZW4gdXNhZ2UuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHVzYWdlIHRvIGdldCB0aGUgc2VsZWN0ZWQgc3RyYXRlZ3kgZm9sbG93ZWQgYnkuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHN0cmF0ZWd5IHRvIGJlIGZvbGxvd2VkLgotICAgICAqLwotICAgIHZpcnR1YWwgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclVzYWdlKGF1ZGlvX3VzYWdlX3QgdXNhZ2UpID0gMDsKLQotICAgIC8qKgotICAgICAqIFNldCB0aGUgVGVsZXBob255IE1vZGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIG1vZGU6IEFuZHJvaWQgUGhvbmUgc3RhdGUgKG5vcm1hbCwgcmluZ3RvbmUsIGNzdiwgaW4gY29tbXVuaWNhdGlvbikKLSAgICAgKgotICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgVGVsZXBob255IE1vZGUgc2V0IGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKSA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHRlbGVwaG9ueSBNb2RlCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBjdXJyZW50IHRlbGVwaG9ueSBtb2RlCi0gICAgICovCi0gICAgdmlydHVhbCBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpIGNvbnN0ID0gMDsKLQotICAgIC8qKgotICAgICAqIFNldCBGb3JjZSBVc2UgY29uZmlnIGZvciBhIGdpdmVuIHVzYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSB1c2FnZSBmb3Igd2hpY2ggYSBjb25maWd1cmF0aW9uIHNoYWxsIGJlIGZvcmNlZC4KLSAgICAgKiBAcGFyYW1baW5dIGNvbmZpZyB3aXNoZWQgdG8gYmUgZm9yY2VkIGZvciB0aGUgZ2l2ZW4gdXNhZ2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBGb3JjZSBVc2UgY29uZmlnIHdhcyBzZXQgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZSAoZS5nLiBjb25maWcKLSAgICAgKiBub3QgYWxsb3dlZCBhIGdpdmVuIHVzYWdlLi4uKQotICAgICAqLwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpID0gMDsKLQotICAgIC8qKgotICAgICAqIEdldCBGb3JjZSBVc2UgY29uZmlnIGZvciBhIGdpdmVuIHVzYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSB1c2FnZSBmb3Igd2hpY2ggYSBjb25maWd1cmF0aW9uIHNoYWxsIGJlIGZvcmNlZC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gY29uZmlnIHdpc2hlZCB0byBiZSBmb3JjZWQgZm9yIHRoZSBnaXZlbiB1c2FnZS4KLSAgICAgKi8KLSAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdCA9IDA7Ci0KLSAgICAvKioKLSAgICAgKiBTZXQgdGhlIGNvbm5lY3Rpb24gc3RhdGUgb2YgZGV2aWNlKHMpLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSBkZXZEZXNjIGZvciB3aGljaCB0aGUgc3RhdGUgaGFzIGNoYW5nZWQuCi0gICAgICogQHBhcmFtW2luXSBzdGF0ZSBvZiBhdmFpbGFiaWxpdHkgb2YgdGhpcyh0aGVzZSkgZGV2aWNlKHMpLgotICAgICAqCi0gICAgICogQHJldHVybiBOT19FUlJPUiBpZiBkZXZpY2VzIGNyaXRlcmlvbiB1cGRhdGVkIGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3QgYW5kcm9pZDo6c3A8YW5kcm9pZDo6RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpID0gMDsKLQotcHJvdGVjdGVkOgotICAgIHZpcnR1YWwgfkF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZSgpIHt9Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmgKaW5kZXggYjc5MDJjZi4uMzQ5Zjk2OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9BdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaApAQCAtMTYsOSArMTYsNyBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgPElWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uLmg+Ci0jaW5jbHVkZSA8QXVkaW9HYWluLmg+Ci0jaW5jbHVkZSA8QXVkaW9Qb3J0Lmg+CisjaW5jbHVkZSA8UG9saWN5QXVkaW9Qb3J0Lmg+CiAjaW5jbHVkZSA8QXVkaW9QYXRjaC5oPgogI2luY2x1ZGUgPElPUHJvZmlsZS5oPgogI2luY2x1ZGUgPERldmljZURlc2NyaXB0b3IuaD4KQEAgLTQ3LDExICs0NSw5IEBACiAKICAgICB2aXJ0dWFsIGNvbnN0IEF1ZGlvSW5wdXRDb2xsZWN0aW9uICZnZXRJbnB1dHMoKSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIGNvbnN0IERldmljZVZlY3RvciAmZ2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIGNvbnN0IERldmljZVZlY3RvciBnZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCkgY29uc3QgPSAwOwogCi0gICAgdmlydHVhbCBjb25zdCBEZXZpY2VWZWN0b3IgJmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgSVZvbHVtZUN1cnZlc0NvbGxlY3Rpb24gJmdldFZvbHVtZUN1cnZlcygpID0gMDsKKyAgICB2aXJ0dWFsIGNvbnN0IERldmljZVZlY3RvciBnZXRBdmFpbGFibGVJbnB1dERldmljZXMoKSBjb25zdCA9IDA7CiAKICAgICB2aXJ0dWFsIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZnZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkgY29uc3QgPSAwOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlL0VuZ2luZUludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9FbmdpbmVJbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmIyMGI1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lL2ludGVyZmFjZS9FbmdpbmVJbnRlcmZhY2UuaApAQCAtMCwwICsxLDM0MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1Byb2R1Y3RTdHJhdGVneS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvVm9sdW1lR3JvdXAuaD4KKyNpbmNsdWRlIDxJVm9sdW1lQ3VydmVzLmg+CisjaW5jbHVkZSA8cG9saWN5Lmg+CisjaW5jbHVkZSA8Vm9sdW1lLmg+CisjaW5jbHVkZSA8SHdNb2R1bGUuaD4KKyNpbmNsdWRlIDxEZXZpY2VEZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CisjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK3VzaW5nIERldmljZVN0cmF0ZWd5TWFwID0gc3RkOjptYXA8cHJvZHVjdF9zdHJhdGVneV90LCBEZXZpY2VWZWN0b3I+OwordXNpbmcgU3RyYXRlZ3lWZWN0b3IgPSBzdGQ6OnZlY3Rvcjxwcm9kdWN0X3N0cmF0ZWd5X3Q+OwordXNpbmcgVm9sdW1lR3JvdXBWZWN0b3IgPSBzdGQ6OnZlY3Rvcjx2b2x1bWVfZ3JvdXBfdD47CisKKy8qKgorICogVGhpcyBpbnRlcmZhY2UgaXMgZGVkaWNhdGVkIHRvIHRoZSBwb2xpY3kgbWFuYWdlciB0aGF0IGEgUG9saWN5IEVuZ2luZSBzaGFsbCBpbXBsZW1lbnQuCisgKi8KK2NsYXNzIEVuZ2luZUludGVyZmFjZQoreworcHVibGljOgorICAgIC8qKgorICAgICAqIENoZWNrcyBpZiB0aGUgZW5naW5lIHdhcyBjb3JyZWN0bHkgaW5pdGlhbGl6ZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIGluaXRpYWxpemF0aW9uIGhhcyBiZWVuIGRvbmUgY29ycmVjdGx5LCBlcnJvciBjb2RlIG90aGVyd2lzZS4uCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBpbml0Q2hlY2soKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXRzIHRoZSBNYW5hZ2VyIG9ic2VydmVyIHRoYXQgYWxsb3dzIHRoZSBlbmdpbmUgdG8gcmV0cmlldmUgaW5mb3JtYXRpb24gb24gY29sbGVjdGlvbgorICAgICAqIG9mIGRldmljZXMsIHN0cmVhbXMsIEh3TW9kdWxlcywgLi4uCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIG9ic2VydmVyIGhhbmRsZSBvbiB0aGUgbWFuYWdlci4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvaWQgc2V0T2JzZXJ2ZXIoQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm9ic2VydmVyKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIFRlbGVwaG9ueSBNb2RlLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBtb2RlOiBBbmRyb2lkIFBob25lIHN0YXRlIChub3JtYWwsIHJpbmd0b25lLCBjc3YsIGluIGNvbW11bmljYXRpb24pCisgICAgICoKKyAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIFRlbGVwaG9ueSBNb2RlIHNldCBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSkgPSAwOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSB0ZWxlcGhvbnkgTW9kZQorICAgICAqCisgICAgICogQHJldHVybiB0aGUgY3VycmVudCB0ZWxlcGhvbnkgbW9kZQorICAgICAqLworICAgIHZpcnR1YWwgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXQgRm9yY2UgVXNlIGNvbmZpZyBmb3IgYSBnaXZlbiB1c2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdXNhZ2UgZm9yIHdoaWNoIGEgY29uZmlndXJhdGlvbiBzaGFsbCBiZSBmb3JjZWQuCisgICAgICogQHBhcmFtW2luXSBjb25maWcgd2lzaGVkIHRvIGJlIGZvcmNlZCBmb3IgdGhlIGdpdmVuIHVzYWdlLgorICAgICAqCisgICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgRm9yY2UgVXNlIGNvbmZpZyB3YXMgc2V0IGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UgKGUuZy4gY29uZmlnCisgICAgICogbm90IGFsbG93ZWQgYSBnaXZlbiB1c2FnZS4uLikKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBHZXQgRm9yY2UgVXNlIGNvbmZpZyBmb3IgYSBnaXZlbiB1c2FnZS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gdXNhZ2UgZm9yIHdoaWNoIGEgY29uZmlndXJhdGlvbiBzaGFsbCBiZSBmb3JjZWQuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIGNvbmZpZyB3aXNoZWQgdG8gYmUgZm9yY2VkIGZvciB0aGUgZ2l2ZW4gdXNhZ2UuCisgICAgICovCisgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogU2V0IHRoZSBjb25uZWN0aW9uIHN0YXRlIG9mIGRldmljZShzKS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gZGV2RGVzYyBmb3Igd2hpY2ggdGhlIHN0YXRlIGhhcyBjaGFuZ2VkLgorICAgICAqIEBwYXJhbVtpbl0gc3RhdGUgb2YgYXZhaWxhYmlsaXR5IG9mIHRoaXModGhlc2UpIGRldmljZShzKS4KKyAgICAgKgorICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgZGV2aWNlcyBjcml0ZXJpb24gdXBkYXRlZCBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IGFuZHJvaWQ6OnNwPGFuZHJvaWQ6OkRldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBHZXQgdGhlIHN0cmF0ZWd5IHNlbGVjdGVkIGZvciBhIGdpdmVuIGF1ZGlvIGF0dHJpYnV0ZXMuCisgICAgICoKKyAgICAgKiBAcGFyYW1baW5dIGF1ZGlvIGF0dHJpYnV0ZXMgdG8gZ2V0IHRoZSBzZWxlY3RlZCBAcHJvZHVjdF9zdHJhdGVneV90IGZvbGxvd2VkIGJ5LgorICAgICAqCisgICAgICogQHJldHVybiBAcHJvZHVjdF9zdHJhdGVneV90IHRvIGJlIGZvbGxvd2VkLgorICAgICAqLworICAgIHZpcnR1YWwgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyByZXRyaWV2ZXMgdGhlIGRldmljZXMgdG8gYmUgdXNlZCBmb3IgZ2l2ZW4KKyAgICAgKiBhdWRpbyBhdHRyaWJ1dGVzLgorICAgICAqIEBwYXJhbSBhdHRyaWJ1dGVzIG9mIHRoZSBvdXRwdXQgcmVxdWVzdGluZyBEZXZpY2Uocykgc2VsZWN0aW9uCisgICAgICogQHBhcmFtIHByZWZlcmVkRGV2aWNlIHZhbGlkIHJlZmVyZW5jZSBpZiBhIHByZWZlcmVkIGRldmljZSBpcyByZXF1ZXN0ZWQsIG51bGxwdHIgb3RoZXJ3aXNlLgorICAgICAqIEBwYXJhbSBmcm9tQ2FjaGUgaWYgdHJ1ZSwgdGhlIGRldmljZSBpcyByZXR1cm5lZCBmcm9tIGludGVybmFsIGNhY2hlLAorICAgICAqICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIGl0IGlzIGRldGVybWluZWQgYnkgY3VycmVudCBzdGF0ZSAoZGV2aWNlIGNvbm5lY3RlZCxwaG9uZSBzdGF0ZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgIGZvcmNlIHVzZSwgYTJkcCBvdXRwdXQuLi4pCisgICAgICogQHJldHVybiB2ZWN0b3Igb2Ygc2VsZWN0ZWQgZGV2aWNlIGRlc2NyaXB0b3JzLgorICAgICAqICAgICAgICAgQXBwcm9wcmlhdGUgZGV2aWNlIGZvciBzdHJlYW1zIGhhbmRsZWQgYnkgdGhlIHNwZWNpZmllZCBhdWRpbyBhdHRyaWJ1dGVzIGFjY29yZGluZworICAgICAqICAgICAgICAgdG8gY3VycmVudCBwaG9uZSBzdGF0ZSwgZm9yY2VkIHN0YXRlcywgY29ubmVjdGVkIGRldmljZXMuLi4KKyAgICAgKiAgICAgICAgIGlmIGZyb21DYWNoZSBpcyB0cnVlLCB0aGUgZGV2aWNlIGlzIHJldHVybmVkIGZyb20gaW50ZXJuYWwgY2FjaGUsCisgICAgICogICAgICAgICBvdGhlcndpc2UgaXQgaXMgZGV0ZXJtaW5lZCBieSBjdXJyZW50IHN0YXRlIChkZXZpY2UgY29ubmVjdGVkLHBob25lIHN0YXRlLCBmb3JjZSB1c2UsCisgICAgICogICAgICAgICBhMmRwIG91dHB1dC4uLikKKyAgICAgKiBUaGlzIGFsbG93cyB0bzoKKyAgICAgKiAgICAgIDEgc3BlZWQgdXAgcHJvY2VzcyB3aGVuIHRoZSBzdGF0ZSBpcyBzdGFibGUgKHdoZW4gc3RhcnRpbmcgb3Igc3RvcHBpbmcgYW4gb3V0cHV0KQorICAgICAqICAgICAgMiBhY2Nlc3MgdG8gZWl0aGVyIGN1cnJlbnQgZGV2aWNlIHNlbGVjdGlvbiAoZnJvbUNhY2hlID09IHRydWUpIG9yCisgICAgICogICAgICAiZnV0dXJlIiBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gZmFsc2UpIHdoZW4gY2FsbGVkIGZyb20gYSBjb250ZXh0CisgICAgICogICAgICB3aGVyZSBjb25kaXRpb25zIGFyZSBjaGFuZ2luZyAoc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCksIHNldFBob25lU3RhdGUoKS4uLikgQU5ECisgICAgICogICAgICBiZWZvcmUgbWFuYWdlciB1cGRhdGVzIGl0cyBvdXRwdXRzLgorICAgICAqLworICAgIHZpcnR1YWwgRGV2aWNlVmVjdG9yIGdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKAorICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnByZWZlcmVkRGV2aWNlID0gbnVsbHB0ciwKKyAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlID0gZmFsc2UpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtIExlZ2FjeSBmdW5jdGlvbiByZXRyaWV2aW5nIGRldmljZXMgZnJvbSBhIHN0cmVhbSB0eXBlLgorICAgICAqIEBwYXJhbSBzdHJlYW0gdHlwZSBvZiB0aGUgb3V0cHV0IHJlcXVlc3RpbmcgRGV2aWNlKHMpIHNlbGVjdGlvbgorICAgICAqIEBwYXJhbSBmcm9tQ2FjaGUgaWYgdHJ1ZSwgdGhlIGRldmljZSBpcyByZXR1cm5lZCBmcm9tIGludGVybmFsIGNhY2hlLAorICAgICAqICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlIGl0IGlzIGRldGVybWluZWQgYnkgY3VycmVudCBzdGF0ZSAoZGV2aWNlIGNvbm5lY3RlZCxwaG9uZSBzdGF0ZSwKKyAgICAgKiAgICAgICAgICAgICAgICAgIGZvcmNlIHVzZSwgYTJkcCBvdXRwdXQuLi4pCisgICAgICogQHJldHVybiBhcHByb3ByaWF0ZSBkZXZpY2UgZm9yIHN0cmVhbXMgaGFuZGxlZCBieSB0aGUgc3BlY2lmaWVkIGF1ZGlvIGF0dHJpYnV0ZXMgYWNjb3JkaW5nCisgICAgICogICAgICAgICB0byBjdXJyZW50IHBob25lIHN0YXRlLCBmb3JjZWQgc3RhdGVzLCBjb25uZWN0ZWQgZGV2aWNlcy4uLgorICAgICAqICAgICAgICAgaWYgZnJvbUNhY2hlIGlzIHRydWUsIHRoZSBkZXZpY2UgaXMgcmV0dXJuZWQgZnJvbSBpbnRlcm5hbCBjYWNoZSwKKyAgICAgKiAgICAgICAgIG90aGVyd2lzZSBpdCBpcyBkZXRlcm1pbmVkIGJ5IGN1cnJlbnQgc3RhdGUgKGRldmljZSBjb25uZWN0ZWQscGhvbmUgc3RhdGUsIGZvcmNlIHVzZSwKKyAgICAgKiAgICAgICAgIGEyZHAgb3V0cHV0Li4uKQorICAgICAqIFRoaXMgYWxsb3dzIHRvOgorICAgICAqICAgICAgMSBzcGVlZCB1cCBwcm9jZXNzIHdoZW4gdGhlIHN0YXRlIGlzIHN0YWJsZSAod2hlbiBzdGFydGluZyBvciBzdG9wcGluZyBhbiBvdXRwdXQpCisgICAgICogICAgICAyIGFjY2VzcyB0byBlaXRoZXIgY3VycmVudCBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gdHJ1ZSkgb3IKKyAgICAgKiAgICAgICJmdXR1cmUiIGRldmljZSBzZWxlY3Rpb24gKGZyb21DYWNoZSA9PSBmYWxzZSkgd2hlbiBjYWxsZWQgZnJvbSBhIGNvbnRleHQKKyAgICAgKiAgICAgIHdoZXJlIGNvbmRpdGlvbnMgYXJlIGNoYW5naW5nIChzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSwgc2V0UGhvbmVTdGF0ZSgpLi4uKSBBTkQKKyAgICAgKiAgICAgIGJlZm9yZSBtYW5hZ2VyIHVwZGF0ZXMgaXRzIG91dHB1dHMuCisgICAgICovCisgICAgdmlydHVhbCBEZXZpY2VWZWN0b3IgZ2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlID0gZmFsc2UpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEdldCB0aGUgaW5wdXQgZGV2aWNlIHNlbGVjdGVkIGZvciBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzLgorICAgICAqCisgICAgICogQHBhcmFtW2luXSBhdHRyIGF1ZGlvIGF0dHJpYnV0ZXMgdG8gY29uc2lkZXIKKyAgICAgKiBAcGFyYW1bb3V0XSBtaXggdG8gYmUgdXNlZCBpZiBhIG1peCBoYXMgYmVlbiBpbnN0YWxsZWQgZm9yIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzLgorICAgICAqIEByZXR1cm4gc2VsZWN0ZWQgaW5wdXQgZGV2aWNlIGZvciB0aGUgYXVkaW8gYXR0cmlidXRlcywgbWF5IGJlIG51bGwgaWYgZXJyb3IuCisgICAgICovCisgICAgdmlydHVhbCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIHNwPEF1ZGlvUG9saWN5TWl4PiAqbWl4ID0gbnVsbHB0cikgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogR2V0IHRoZSBsZWdhY3kgc3RyZWFtIHR5cGUgZm9yIGEgZ2l2ZW4gYXVkaW8gYXR0cmlidXRlcy4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gYXVkaW8gYXR0cmlidXRlcyB0byBnZXQgdGhlIGFzc29jaWF0ZWQgYXVkaW9fc3RyZWFtX3R5cGVfdC4KKyAgICAgKgorICAgICAqIEByZXR1cm4gYXVkaW9fc3RyZWFtX3R5cGVfdCBhc3NvY2lhdGVkIHRvIHRoZSBhdHRyaWJ1dGVzLgorICAgICAqLworICAgIHZpcnR1YWwgYXVkaW9fc3RyZWFtX3R5cGVfdCBnZXRTdHJlYW1UeXBlRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldEF0dHJpYnV0ZXNGb3JTdHJlYW0gZ2V0IHRoZSBhdWRpbyBhdHRyaWJ1dGVzIGZyb20gbGVnYWN5IHN0cmVhbSB0eXBlCisgICAgICogQXR0cmlidXRlcyByZXR1cm5lZCBtaWdodCBvbmx5IGJlIHVzZWQgdG8gY2hlY2sgdXBvbiByb3V0aW5nIGRlY2lzaW9uLCBub3Qgdm9sdW1lIGRlY2lzaW9ucy4KKyAgICAgKiBAcGFyYW0gc3RyZWFtIHRvIGNvbnNpZGVyCisgICAgICogQHJldHVybiBhdWRpbyBhdHRyaWJ1dGVzIG1hdGNoaW5nIHRoZSBsZWdhY3kgc3RyZWFtIHR5cGUKKyAgICAgKi8KKyAgICB2aXJ0dWFsIGF1ZGlvX2F0dHJpYnV0ZXNfdCBnZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldFN0cmVhbVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5IHJldHJpZXZlcyB0aGUgbGlzdCBvZiBsZWdhY3kgc3RyZWFtIHR5cGUgZm9sbG93aW5nCisgICAgICogdGhlIGdpdmVuIHByb2R1Y3Qgc3RyYXRlZ3kKKyAgICAgKiBAcGFyYW0gcHMgcHJvZHVjdCBzdHJhdGVneSB0byBjb25zaWRlcgorICAgICAqIEByZXR1cm4gYXNzb2NpYXRlZCBsZWdhY3kgU3RyZWFtIFR5cGVzIHZlY3RvciBvZiB0aGUgZ2l2ZW4gcHJvZHVjdCBzdHJhdGVneQorICAgICAqLworICAgIHZpcnR1YWwgU3RyZWFtVHlwZVZlY3RvciBnZXRTdHJlYW1UeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5IHJldHJpZXZlcyBhbGwgdGhlIGF0dHJpYnV0ZXMgZm9sbG93aW5nIHRoZSBnaXZlbgorICAgICAqIHByb2R1Y3Qgc3RyYXRlZ3kuIEFueSBhdHRyaWJ1dGVzIHRoYXQgIm1hdGNoZXMiIHdpdGggdGhpcyBvbmUgd2lsbCBmb2xsb3cgdGhlIHByb2R1Y3QKKyAgICAgKiBzdHJhdGVneS4KKyAgICAgKiAibWF0Y2hpbmciIG1lYW5zIHRoZSB1c2FnZSBzaGFsbCBtYXRjaCBpZiByZWZlcmVuY2UgYXR0cmlidXRlcyBoYXMgYSBkZWZpbmVkIHVzYWdlLCBBTkQKKyAgICAgKiBjb250ZW50IHR5cGUgc2hhbGwgbWF0Y2ggaWYgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgaGFzIGEgZGVmaW5lZCBjb250ZW50IHR5cGUgQU5ECisgICAgICogZmxhZ3Mgc2hhbGwgbWF0Y2ggaWYgcmVmZXJlbmNlIGF0dHJpYnV0ZXMgaGFzIGRlZmluZWQgZmxhZ3MgQU5ECisgICAgICogdGFncyBzaGFsbCBtYXRjaCBpZiByZWZlcmVuY2UgYXR0cmlidXRlcyBoYXMgZGVmaW5lZCB0YWdzLgorICAgICAqIEBwYXJhbSBwcyBwcm9kdWN0IHN0cmF0ZWd5IHRvIGNvbnNpZGVyCisgICAgICogQHJldHVybiB2ZWN0b3Igb2YgcHJvZHVjdCBzdHJhdGVneSBpZHMsIGVtcHR5IGlmIHVua25vd24gc3RyYXRlZ3kuCisgICAgICovCisgICAgdmlydHVhbCBBdHRyaWJ1dGVzVmVjdG9yIGdldEFsbEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHBzKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0T3JkZXJlZEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMKKyAgICAgKiBAcmV0dXJuIHByaW9yaXR5IG9yZGVyZWQgcHJvZHVjdCBzdHJhdGVnaWVzIHRvIGhlbHAgdGhlIEF1ZGlvUG9saWN5TWFuYWdlciBldmFsdWF0aW5nIHRoZQorICAgICAqIGRldmljZSBzZWxlY3Rpb24gcGVyIG91dHB1dCBhY2NvcmRpbmcgdG8gdGhlIHByaW9yaXRpemVkIHN0cmF0ZWdpZXMuCisgICAgICovCisgICAgdmlydHVhbCBTdHJhdGVneVZlY3RvciBnZXRPcmRlcmVkUHJvZHVjdFN0cmF0ZWdpZXMoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgdXBkYXRlRGV2aWNlU2VsZWN0aW9uQ2FjaGUuIERldmljZSBzZWxlY3Rpb24gZm9yIEF1ZGlvQXR0cmlidXRlIC8gU3RyZWFtcyBpcyBjYWNoZWQKKyAgICAgKiBpbiB0aGUgZW5naW5lIGluIG9yZGVyIHRvIHNwZWVkIHVwIHByb2Nlc3Mgd2hlbiB0aGUgYXVkaW8gc3lzdGVtIGlzIHN0YWJsZS4KKyAgICAgKiBXaGVuIGEgZGV2aWNlIGlzIGNvbm5lY3RlZCwgdGhlIGFuZHJvaWQgbW9kZSBpcyBjaGFuZ2VkLCBlbmdpbmUgaXMgbm90aWZpZWQgYW5kIGNhbiB1cGRhdGUKKyAgICAgKiB0aGUgY2FjaGUuCisgICAgICogV2hlbiBzdGFydGluZyAvIHN0b3BwaW5nIGFuIG91dHB1dCB3aXRoIGEgc3RyZWFtIHRoYXQgY2FuIGFmZmVjdCBub3RpZmljYXRpb24sIHRoZSBlbmdpbmUKKyAgICAgKiBuZWVkcyB0byB1cGRhdGUgdGhlIGNhY2hlIHVwb24gdGhpcyBmdW5jdGlvbiBjYWxsLgorICAgICAqLworICAgIHZpcnR1YWwgdm9pZCB1cGRhdGVEZXZpY2VTZWxlY3Rpb25DYWNoZSgpID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcy4gSW50cm9zcGVjdGlvbiBBUEkgdG8gcmV0cmlldmUgYSBjb2xsZWN0aW9uIG9mCisgICAgICogQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgdGhhdCBhbGxvd3MgdG8gYnVpbGQgQXVkaW9BdHRyaWJ1dGVzIGFjY29yZGluZyB0byBhCisgICAgICogcHJvZHVjdF9zdHJhdGVneSB3aGljaCBpcyBqdXN0IGFuIGluZGV4LiBJdCBoYXMgYWxzbyBhIGh1bWFuIHJlYWRhYmxlIG5hbWUgdG8gaGVscCB0aGUKKyAgICAgKiBDYXIvT2VtL0F1ZGlvTWFuYWdlciBpZGVudGl5aW5nIHRoZSB1c2UgY2FzZS4KKyAgICAgKiBAcGFyYW0gc3RyYXRlZ2llcyBjb2xsZWN0aW9uLgorICAgICAqIEByZXR1cm4gT0sgaWYgdGhlIGxpc3QgaGFzIGJlZW4gcmV0cmlldmVkLCBlcnJvciBjb2RlIG90aGVyd2lzZQorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoQXVkaW9Qcm9kdWN0U3RyYXRlZ3lWZWN0b3IgJnN0cmF0ZWdpZXMpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRWb2x1bWVDdXJ2ZXNGb3JBdHRyaWJ1dGVzIHJldHJpZXZlcyB0aGUgVm9sdW1lIEN1cnZlcyBpbnRlcmZhY2UgZm9yIHRoZQorICAgICAqICAgICAgICByZXF1ZXN0ZWQgQXVkaW8gQXR0cmlidXRlcy4KKyAgICAgKiBAcGFyYW0gYXR0ciB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiBJVm9sdW1lQ3VydmVzIGludGVyZmFjZSBwb2ludGVyIGlmIGZvdW5kLCBudWxscHRyIG90aGVyd2lzZQorICAgICAqLworICAgIHZpcnR1YWwgSVZvbHVtZUN1cnZlcyAqZ2V0Vm9sdW1lQ3VydmVzRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpIGNvbnN0ID0gMDsKKworICAgIC8qKgorICAgICAqIEBicmllZiBnZXRWb2x1bWVDdXJ2ZXNGb3JTdHJlYW1UeXBlIHJldHJpZXZlcyB0aGUgVm9sdW1lIEN1cnZlcyBpbnRlcmZhY2UgZm9yIHRoZSBzdHJlYW0KKyAgICAgKiBAcGFyYW0gc3RyZWFtIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcmV0dXJuIElWb2x1bWVDdXJ2ZXMgaW50ZXJmYWNlIHBvaW50ZXIgaWYgZm91bmQsIG51bGxwdHIgb3RoZXJ3aXNlCisgICAgICovCisgICAgdmlydHVhbCBJVm9sdW1lQ3VydmVzICpnZXRWb2x1bWVDdXJ2ZXNGb3JTdHJlYW1UeXBlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0Vm9sdW1lQ3VydmVzRm9yVm9sdW1lR3JvdXAgcmV0cmlldmVzIHRoZSBWb2x1bWUgQ3VydmVzIGludGVyZmFjZSBmb3Igdm9sdW1lIGdyb3VwCisgICAgICogQHBhcmFtIGdyb3VwIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgKiBAcmV0dXJuIElWb2x1bWVDdXJ2ZXMgaW50ZXJmYWNlIHBvaW50ZXIgaWYgZm91bmQsIG51bGxwdHIgb3RoZXJ3aXNlCisgICAgICovCisgICAgdmlydHVhbCBJVm9sdW1lQ3VydmVzICpnZXRWb2x1bWVDdXJ2ZXNGb3JWb2x1bWVHcm91cCh2b2x1bWVfZ3JvdXBfdCBncm91cCkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldFZvbHVtZUdyb3VwcyByZXRyaWV2ZXMgdGhlIGNvbGxlY3Rpb24gb2Ygdm9sdW1lIGdyb3Vwcy4KKyAgICAgKiBAcmV0dXJuIHZlY3RvciBvZiB2b2x1bWUgZ3JvdXBzCisgICAgICovCisgICAgdmlydHVhbCBWb2x1bWVHcm91cFZlY3RvciBnZXRWb2x1bWVHcm91cHMoKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzIGdldHMgdGhlIGFwcHJvcHJpYXRlIHZvbHVtZSBncm91cCB0byBiZSB1c2VkIGZvciBhIGdpdmVuCisgICAgICogQXVkaW8gQXR0cmlidXRlcy4KKyAgICAgKiBAcGFyYW0gYXR0ciB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiB2b2x1bWUgZ3JvdXAgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gYXVkaW8gYXR0cmlidXRlcywgZGVmYXVsdCBncm91cCBpZiBub25lCisgICAgICogYXBwbGljYWJsZSwgVk9MVU1FX0dST1VQX05PTkUgaWYgbm8gZGVmYXVsdCBncm91cCBkZWZpbmVkLgorICAgICAqLworICAgIHZpcnR1YWwgdm9sdW1lX2dyb3VwX3QgZ2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZSBnZXRzIHRoZSBhcHByb3ByaWF0ZSB2b2x1bWUgZ3JvdXAgdG8gYmUgdXNlZCBmb3IgYSBnaXZlbgorICAgICAqIGxlZ2FjeSBzdHJlYW0gdHlwZQorICAgICAqIEBwYXJhbSBzdHJlYW0gdHlwZSB0byBiZSBjb25zaWRlcmVkCisgICAgICogQHJldHVybiB2b2x1bWUgZ3JvdXAgYXNzb2NpYXRlZCB0byB0aGUgZ2l2ZW4gc3RyZWFtIHR5cGUsIGRlZmF1bHQgZ3JvdXAgaWYgbm9uZSBhcHBsaWNhYmxlLAorICAgICAqIFZPTFVNRV9HUk9VUF9OT05FIGlmIG5vIGRlZmF1bHQgZ3JvdXAgZGVmaW5lZC4KKyAgICAgKi8KKyAgICB2aXJ0dWFsIHZvbHVtZV9ncm91cF90IGdldFZvbHVtZUdyb3VwRm9yU3RyZWFtVHlwZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgY29uc3QgPSAwOworCisgICAgLyoqCisgICAgICogQGJyaWVmIGxpc3RBdWRpb1ZvbHVtZUdyb3VwcyBpbnRyb3NwZWN0aW9uIEFQSSB0byBnZXQgdGhlIEF1ZGlvIFZvbHVtZSBHcm91cHMsIGFrYQorICAgICAqIGZvcm1lciBzdHJlYW0gYWxpYXNlcyBpbiBBdWRpbyBTZXJ2aWNlLCBkZWZpbmluZyB2b2x1bWUgY3VydmVzIGF0dGFjaGVkIHRvIG9uZSBvciBtb3JlCisgICAgICogQXVkaW8gQXR0cmlidXRlcy4KKyAgICAgKiBAcGFyYW0gZ3JvdXBzCisgICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgdm9sdW1lIGdyb3VwcyB3ZXJlIHJldHJpZXZlZCBzdWNjZXNzZnVsbHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKSBjb25zdCA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgc2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kgc2V0cyB0aGUgZGVmYXVsdCBkZXZpY2UgdG8gYmUgdXNlZCBmb3IgYQorICAgICAqIHN0cmF0ZWd5IHdoZW4gYXZhaWxhYmxlCisgICAgICogQHBhcmFtIHN0cmF0ZWd5IHRoZSBhdWRpbyBzdHJhdGVneSB3aG9zZSByb3V0aW5nIHdpbGwgYmUgYWZmZWN0ZWQKKyAgICAgKiBAcGFyYW0gZGV2aWNlIHRoZSBhdWRpbyBkZXZpY2UgdG8gcm91dGUgdG8gd2hlbiBhdmFpbGFibGUKKyAgICAgKiBAcmV0dXJuIEJBRF9WQUxVRSBpZiB0aGUgc3RyYXRlZ3kgaXMgaW52YWxpZCwKKyAgICAgKiAgICAgb3IgTk9fRVJST1IgaWYgdGhlIHByZWZlcnJlZCBkZXZpY2Ugd2FzIHNldAorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgcmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kgcmVtb3ZlcyB0aGUgcHJlZmVycmVkIGRldmljZSBwcmV2aW91c2x5IHNldAorICAgICAqIGZvciB0aGUgZ2l2ZW4gc3RyYXRlZ3kKKyAgICAgKiBAcGFyYW0gc3RyYXRlZ3kgdGhlIGF1ZGlvIHN0cmF0ZWd5IHdob3NlIHJvdXRpbmcgd2lsbCBiZSBhZmZlY3RlZAorICAgICAqIEByZXR1cm4gQkFEX1ZBTFVFIGlmIHRoZSBzdHJhdGVneSBpcyBpbnZhbGlkLAorICAgICAqICAgICBvciBOT19FUlJPUiBpZiB0aGUgcHJlZmVycmVkIGRldmljZSB3YXMgcmVtb3ZlZAorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgZ2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kgcXVlcmllcyB3aGljaCBkZXZpY2UgaXMgc2V0IGFzIHRoZQorICAgICAqIHByZWZlcnJlZCBkZXZpY2UgZm9yIHRoZSBnaXZlbiBzdHJhdGVneQorICAgICAqIEBwYXJhbSBzdHJhdGVneSB0aGUgc3RyYXRlZ3kgdG8gcXVlcnkKKyAgICAgKiBAcGFyYW0gZGV2aWNlIHJldHVybnMgY29uZmlndXJlZCBhcyB0aGUgcHJlZmVycmVkIGRldmljZSBpZiBvbmUgd2FzIHNldAorICAgICAqIEByZXR1cm4gQkFEX1ZBTFVFIGlmIHRoZSBzdHJhdGVneSBpcyBpbnZhbGlkLAorICAgICAqICAgICBvciBOQU1FX05PVF9GT1VORCBpZiBubyBwcmVmZXJyZWQgZGV2aWNlIHdhcyBzZXQKKyAgICAgKiAgICAgb3IgTk9fRVJST1IgaWYgdGhlIGRldmljZSBwYXJhbWV0ZXIgd2FzIGluaXRpYWxpemVkIHRvIHRoZSBwcmVmZXJyZWQgZGV2aWNlCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpIGNvbnN0ID0gMDsKKworCisgICAgdmlydHVhbCB2b2lkIGR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5FbmdpbmVJbnRlcmZhY2UoKSB7fQorfTsKKworX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKK2V4dGVybiAiQyIgRW5naW5lSW50ZXJmYWNlKiBjcmVhdGVFbmdpbmVJbnN0YW5jZSgpOworCitfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorZXh0ZXJuICJDIiB2b2lkIGRlc3Ryb3lFbmdpbmVJbnN0YW5jZShFbmdpbmVJbnRlcmZhY2UgKmVuZ2luZSk7CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGY1MjJmMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNDUgQEAKK2NjX2xpYnJhcnlfaGVhZGVycyB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhYmxlX2ludGVyZmFjZV9oZWFkZXJzIiwKKyAgICBob3N0X3N1cHBvcnRlZDogdHJ1ZSwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImludGVyZmFjZSJdLAorfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhYmxlIiwKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICJzcmMvRW5naW5lLmNwcCIsCisgICAgICAgICJzcmMvRW5naW5lSW5zdGFuY2UuY3BwIiwKKyAgICAgICAgInNyYy9TdHJlYW0uY3BwIiwKKyAgICAgICAgInNyYy9JbnB1dFNvdXJjZS5jcHAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgIF0sCisgICAgbG9jYWxfaW5jbHVkZV9kaXJzOiBbImluY2x1ZGUiXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tbW9uIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lY29uZmlndXJhYmxlX2ludGVyZmFjZV9oZWFkZXJzIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMiLAorICAgICAgICAibGliYXVkaW9wb2xpY3llbmdpbmVfY29tbW9uIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lX2NvbmZpZyIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYWJsZV9wZnd3cmFwcGVyIiwKKworICAgIF0sCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeSIsCisgICAgICAgICJsaWJwYXJhbWV0ZXIiLAorICAgICAgICAibGlieG1sMiIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMyMTA1ZTkuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi1pZmVxICgkKFVTRV9DT05GSUdVUkFCTEVfQVVESU9fUE9MSUNZKSwgMSkKLQotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi0jIENvbXBvbmVudCBidWlsZAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgc3JjL0VuZ2luZS5jcHAgXAotICAgIHNyYy9FbmdpbmVJbnN0YW5jZS5jcHAgXAotICAgIHNyYy9TdHJlYW0uY3BwIFwKLSAgICBzcmMvU3RyYXRlZ3kuY3BwIFwKLSAgICBzcmMvVXNhZ2UuY3BwIFwKLSAgICBzcmMvSW5wdXRTb3VyY2UuY3BwIFwKLQotYXVkaW9fcG9saWN5X2VuZ2luZV9pbmNsdWRlc19jb21tb24gOj0gXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmUvaW50ZXJmYWNlCi0KLUxPQ0FMX0NGTEFHUyArPSBcCi0gICAgLVdhbGwgXAotICAgIC1XZXJyb3IgXAotICAgIC1XZXh0cmEgXAotCi1MT0NBTF9FWFBPUlRfQ19JTkNMVURFX0RJUlMgOj0gXAotICAgICQoYXVkaW9fcG9saWN5X2VuZ2luZV9pbmNsdWRlc19jb21tb24pCi0KLUxPQ0FMX0NfSU5DTFVERVMgOj0gXAotICAgICQoYXVkaW9fcG9saWN5X2VuZ2luZV9pbmNsdWRlc19jb21tb24pIFwKLSAgICAkKFRBUkdFVF9PVVRfSEVBREVSUykvaHcgXAotICAgICQoY2FsbCBpbmNsdWRlLXBhdGgtZm9yLCBmcmFtZXdvcmtzLWF2KSBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZQotCi1MT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotCi1MT0NBTF9NT0RVTEUgOj0gbGliYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmFibGUKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotICAgIGxpYmF1ZGlvcG9saWN5cGZ3d3JhcHBlciBcCi0gICAgbGliYXVkaW9wb2xpY3ljb21wb25lbnRzCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gXAotICAgIGxpYmxvZyBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJ1dGlscyBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJhdWRpb3V0aWxzIFwKLSAgICBsaWJwYXJhbWV0ZXIgXAotICAgIGxpYm1lZGlhX2hlbHBlciBcCi0gICAgbGlieG1sMgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFJlY3Vyc2l2ZSBjYWxsIHN1Yi1mb2xkZXIgQW5kcm9pZC5tawotIwotaW5jbHVkZSAkKGNhbGwgYWxsLW1ha2VmaWxlcy11bmRlciwkKExPQ0FMX1BBVEgpKQotCi1lbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlM2VhZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIFJvb3Qgc29vbmdfbmFtZXNwYWNlIGZvciBjb21tb24gY29tcG9uZW50cworCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbCIsCisgICAgdmVuZG9yOiB0cnVlLAorICAgIHNyYzogIjphdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhIiwKK30KK2ZpbGVncm91cCB7CisgICAgbmFtZTogImF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzX3RlbXBsYXRlIiwKKyAgICBzcmNzOiBbImV4YW1wbGUvY29tbW9uL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbC5pbiJdLAorfQorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYSIsCisgICAgc3JjczogWyJleGFtcGxlL2NvbW1vbi9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbCJdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkxM2ExNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw5NCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEltcG9ydCB0aGlzIG5hbWVzcGFjZSBpbiBvcmRlciB0byB1c2UgQU9TUCBBdXRvbW90aXZlIGNvbmZpZ3VyYXRpb24gZXhhbXBsZQorCitzb29uZ19uYW1lc3BhY2UgeworICAgIGltcG9ydHM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnIiwKKyAgICBdLAorfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJhdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjOiAiOmF1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbiIsCisgICAgcmVxdWlyZWQ6IFsKKyAgICAgICAgIjphdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwiLAorICAgICAgICAiOmF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sIiwKKyAgICAgICAgIjphdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwiLAorICAgICAgICAiOmF1ZGlvX3BvbGljeV9lbmdpbmVfdm9sdW1lcy54bWwiLAorICAgIF0sCit9CitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmM6ICJhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwiLAorfQorcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiYXVkaW9fcG9saWN5X2VuZ2luZV92b2x1bWVzLnhtbCIsCisgICAgdmVuZG9yOiB0cnVlLAorICAgIHNyYzogIjphdWRpb19wb2xpY3lfZW5naW5lX3ZvbHVtZXMiLAorfQorcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjOiAiOmF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzIiwKK30KKworLy8KKy8vIEdlbmVyYXRlIGF1ZGlvX3BvbGljeV9lbmdpbmUgY3JpdGVyaW9uIHR5cGUgZmlsZSA9PiBwcm92aWRlcyBkZXZpY2UgYWRkcmVzc2VzIGNyaXRlcmlvbiB0eXBlCisvLworZ2VucnVsZSB7CisgICAgbmFtZTogImF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzIiwKKyAgICBkZWZhdWx0czogWyJidWlsZHBvbGljeWNyaXRlcmlvbnR5cGVzcnVsZSJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIjphdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl90b3BfZmlsZSIsCisgICAgICAgICI6YXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZmlsZXMiLAorICAgIF0sCit9CitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9maWxlcyIsCisgICAgc3JjczogWworICAgICAgICAiOnJfc3VibWl4X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uIiwKKyAgICAgICAgIjpkZWZhdWx0X3ZvbHVtZV90YWJsZXMiLAorICAgICAgICAiOmF1ZGlvX3BvbGljeV92b2x1bWVzIiwKKyAgICAgICAgIjpzdXJyb3VuZF9zb3VuZF9jb25maWd1cmF0aW9uXzVfMCIsCisgICAgICAgICI6cHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbiIsCisgICAgXSwKK30KK2ZpbGVncm91cCB7CisgICAgbmFtZSA6ICJhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl90b3BfZmlsZSIsCisgICAgc3JjczogWyI6YXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpYyJdLAorfQorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uIiwKKyAgICBzcmNzOiBbImF1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwiXSwKK30KK2ZpbGVncm91cCB7CisgICAgbmFtZTogImF1ZGlvX3BvbGljeV9lbmdpbmVfdm9sdW1lcyIsCisgICAgc3JjczogWyJhdWRpb19wb2xpY3lfZW5naW5lX3ZvbHVtZXMueG1sIl0sCit9CitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJhdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb25fZmlsZXMiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIjphdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24iLAorICAgICAgICAiYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIiwKKyAgICAgICAgIjphdWRpb19wb2xpY3lfZW5naW5lX3ZvbHVtZXMiLAorICAgICAgICAiOmF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzIiwKKyAgICAgICAgIjphdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUvYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhhMTQwYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICAgLS0+CisKKzxjb25maWd1cmF0aW9uIHZlcnNpb249IjEuMCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIi8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sIi8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwiLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfZW5naW5lX3ZvbHVtZXMueG1sIi8+CisKKzwvY29uZmlndXJhdGlvbj4KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY1OThjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvYXV0b21vdGl2ZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKQEAgLTAsMCArMSwxNjcgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxQcm9kdWN0U3RyYXRlZ2llcz4KKyAgICA8IS0tIE9FTSBVc2FnZXMgLS0+CisgICAgPCEtLSBwcm9kdWN0X3N0cmF0ZWd5IHdpbGwgYmUgZGVmaW5lZCBhY2NvcmRpbmcgdGhpcyBvcmRlcgorICAgIHByb2R1Y3Rfc3RyYXRlZ3kgaXMgb2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQgaWYgYWxsIHRoZSBjb25kaXRpb25zIGFyZSBzYXRpc2ZpZWQgZm9yCisgICAgQXVkaW9BdHRyaWJ1dGVzIGFhCisKKyAgICBpbnQgdHlwZSA9IDA7CisgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7CisgICAgdHlwZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX09FTV9UWVBFLCAwKTsKKyAgICB9CisgICAgaWYoCisgICAgKCBhYS5tQ29udGVudFR5cGUgPT0gQXVkaW9BdHRyaWJ1dGVzLkFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0ggKSAmJgorICAgICggYWEubVVzYWdlID09IEF1ZGlvQXR0cmlidXRlcy5BVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UgKSAmJgorICAgICggdHlwZSA9PSAxICkgKQorICAgIC0tPgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJvZW1fdHJhZmZpY19hbm91bmNlbWVudCI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9Im9lbV90cmFmZmljX2Fub3VuY2VtZW50Ij4KKyAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCIvPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4KKyAgICAgICAgICAgIDwhLS0gIHRyYWZmaWNfYW5ub3VjZW1lbnQgPSAxIC0tPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9Im9lbSIgdmFsdWU9IjEiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJvZW1fc3RyYXRlZ3lfMSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9Im9lbV9hZGFzXzIiPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9Im9lbSIgdmFsdWU9IjIiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJvZW1fc3RyYXRlZ3lfMiI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9Im9lbV9hZGFzXzMiPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9Im9lbSIgdmFsdWU9IjMiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIENhciBVc2FnZXMgLS0+CisgICAgPCEtLSBLZWVwIHRob3NlIGxpbmVzIG9ubHkgZm9yIGNhciAtLT4KKyAgICA8IS0tIENoZWNrIGNhciBjb25kaXRpb25zIGlmIGFueSBPRU0gY29uZGl0aW9ucyBtYXRjaGVkIC0tPgorICAgIDwhLS0gQXMgZGVmaW5lZCBieSBDYXJBdWRpb0F0dHJpYnV0ZXNVdGlsLmphdmEgLS0+CisgICAgPCEtLSBwcm9kdWN0X3N0cmF0ZWd5IHdpbGwgYmUgZGVmaW5lZCBhY2NvcmRpbmcgdGhpcyBvcmRlcgorICAgIHByb2R1Y3Rfc3RyYXRlZ3kgaXMgcmFkaW8gaWYgYWxsIHRoZSBjb25kaXRpb25zIGFyZSBzYXRpc2ZpZWQgZm9yIEF1ZGlvQXR0cmlidXRlcyBhYQorCisgICAgICAgIGludCB0eXBlID0gQ0FSX0FVRElPX1RZUEVfREVGQVVMVDsKKyAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7CisgICAgICAgIHR5cGUgPSBidW5kbGUuZ2V0SW50KEtFWV9DQVJfQVVESU9fVFlQRSwgQ0FSX0FVRElPX1RZUEVfREVGQVVMVCk7CisgICAgICAgIH0KKyAgICAgICAgaWYoCisgICAgICAgICggYWEubUNvbnRlbnRUeXBlID09IEF1ZGlvQXR0cmlidXRlcy5BVURJT19DT05URU5UX1RZUEVfU1BFRUNIICkgJiYKKyAgICAgICAgKCBhYS5tVXNhZ2UgPT0gQXVkaW9BdHRyaWJ1dGVzLkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSApICYmCisgICAgICAgICggdHlwZSA9PSBDQVJfQVVESU9fVFlQRV9SQURJTyApICkKKyAgICAgICAgLS0+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJyYWRpbyI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9Im1lZGlhX2Nhcl9hdWRpb190eXBlXzMiPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfTVVTSUMiLz4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTUVESUEiLz4KKyAgICAgICAgICAgIDxCdW5kbGUga2V5PSJjYXJfYXVkaW9fdHlwZSIgdmFsdWU9IjMiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJleHRfYXVkaW9fc291cmNlIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCB2b2x1bWVHcm91cD0ibWVkaWFfY2FyX2F1ZGlvX3R5cGVfNyI+CisgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQyIvPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9NRURJQSIvPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9ImNhcl9hdWRpb190eXBlIiB2YWx1ZT0iNyIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9InZvaWNlX2NvbW1hbmQiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHZvbHVtZUdyb3VwPSJzcGVlY2giIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9BU1NJU1RBTlQiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+CisgICAgICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+CisgICAgICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4KKyAgICAgICAgICAgICAgICA8IS0tICBDQVJfQVVESU9fVFlQRV9WT0lDRV9DT01NQU5EID0gMSAtLT4KKyAgICAgICAgICAgICAgICA8QnVuZGxlIGtleT0iY2FyX2F1ZGlvX3R5cGUiIHZhbHVlPSIxIi8+CisgICAgICAgICAgICA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFkiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5UIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJzYWZldHlfYWxlcnQiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHZvbHVtZUdyb3VwPSJzeXN0ZW0iPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OIi8+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTiIvPgorICAgICAgICAgICAgPCEtLSAgQ0FSX0FVRElPX1RZUEVfU0FGRVRZX0FMRVJUID0gMiAtLT4KKyAgICAgICAgICAgIDxCdW5kbGUga2V5PSJjYXJfYXVkaW9fdHlwZSIgdmFsdWU9IjIiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIFRvIGJlIGNoZWNrZWQKKyAgICBDQVJfQVVESU9fVFlQRV9DQVJTRVJWSUNFX0JPVFRPTQorICAgIENBUl9BVURJT19UWVBFX0NBUlNFUlZJQ0VfQ0FSX1BST1hZCisgICAgQ0FSX0FVRElPX1RZUEVfQ0FSU0VSVklDRV9NRURJQV9NVVRFCisgICAgLS0+CisKKyAgICA8IS0tIEdlbmVyaWMgVXNhZ2VzIC0tPgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0ibXVzaWMiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9NVVNJQyIgdm9sdW1lR3JvdXA9Im1lZGlhIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX01FRElBIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0dBTUUiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPCEtLSBEZWZhdWx0IHByb2R1Y3Qgc3RyYXRlZ3kgaGFzIGVtcHR5IGF0dHJpYnV0ZXMgLS0+CisgICAgICAgICAgICA8QXR0cmlidXRlcz48L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJuYXZfZ3VpZGFuY2UiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHZvbHVtZUdyb3VwPSJzcGVlY2giPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJ2b2ljZV9jYWxsIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCIgdm9sdW1lR3JvdXA9InBob25lIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08iIHZvbHVtZUdyb3VwPSJwaG9uZSI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPEZsYWdzIHZhbHVlPSJBVURJT19GTEFHX1NDTyIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iYWxhcm0iPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9BTEFSTSIgdm9sdW1lR3JvdXA9InJpbmciPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BTEFSTSIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9InJpbmciPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9SSU5HIiB2b2x1bWVHcm91cD0icmluZyI+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkUiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJub3RpZmljYXRpb24iPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iIHZvbHVtZUdyb3VwPSJyaW5nIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0ic3lzdGVtIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fU1lTVEVNIiB2b2x1bWVHcm91cD0ic3lzdGVtIj4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04iLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJ0dHMiPgorICAgICAgICA8IS0tIFRUUyBzdHJlYW0gTVVTVCBCRSBNQU5BR0VEIE9VVFNJREUgZGVmYXVsdCBwcm9kdWN0IHN0cmF0ZWd5IGlmIE5PIERFRElDQVRFRCBPVVRQVVQKKyAgICAgICAgICAgICBmb3IgVFRTLCBvdGhlcndpc2Ugd2hlbiBiZWFjb24gaGFwcGVucywgZGVmYXVsdCBzdHJhdGVneSBpcyAuLi4gbXV0ZWQuCisgICAgICAgICAgICAgSWYgaXQgaXMgbWVkaWEsIGl0IGlzIGFubm95aW5nLi4uIC0tPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9UVFMiIHZvbHVtZUdyb3VwPSJ0dHMiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxGbGFncyB2YWx1ZT0iQVVESU9fRkxBR19CRUFDT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworPC9Qcm9kdWN0U3RyYXRlZ2llcz4KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUvYXVkaW9fcG9saWN5X2VuZ2luZV92b2x1bWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL2F1ZGlvX3BvbGljeV9lbmdpbmVfdm9sdW1lcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTdhMjVhOAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlL2F1ZGlvX3BvbGljeV9lbmdpbmVfdm9sdW1lcy54bWwKQEAgLTAsMCArMSwxOTMgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgICAtLT4KKworPCEtLSBWb2x1bWUgR3JvdXBzIFRhYmxlcyBpbmNsdWRlZCBieSBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBmaWxlIC0tPgorPCEtLSBOb3RlOgorICAgICAgICBJdCBpcyBWQUxJRCB0byBoYXZlIGEgZ3JvdXAgd2l0aG91dCBhdHRyaWJ1dGVzIGlmIGEgcHJvZHVjdCBzdHJhdGVneSBpcyBmb2xsb3dpbmcKKyAgICAgICAgdGhpcyBncm91cCBmb3IgYWxsIGF0dHJpYnV0ZXMuCisgICAgICAgIE90aGVyd2lzZSwgYXR0cmlidXRlcyBtdXN0IGJlIHNwZWNpZmllZAorLS0+CisKKzx2b2x1bWVHcm91cHM+CisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5vZW1fdHJhZmZpY19hbm91bmNlbWVudDwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKzwhLS0gT0VNIEFEQVMgaXMgYSB2b2x1bWUgZ3JvdXAgdGhhdCBoYXMgYSBzaW5nbGUgcG9ydCBnYWluICh0aGlzIGlzIHRoZSByZWFzb24gd2h5IGl0IGlzIGEgZ3JvdXAKKyAgICAgYnV0IG1heSBob3N0IGRpZmZlcmVudCBzdHJlYW1zLgorICAgICBBIHByaW9yaXR5IG11c3QgYmUgZ2l2ZW4gYW1vbmcgdGhlbSAoZWl0aGVyIHRoZXkgYXJlIG11bHR1YWx5IGV4Y2x1aXN2ZSwgc28gdGhlIHZvbHVtZQorICAgICB3aWxsIGJlIHRoZSBvbmUgb2YgdGhlIGN1cnJlbnRseSBhY2l0dmUgc3RyZWFtLCBvdGhlcndpc2UgYSBwcmlvcml0eSBtdXN0IGJlIGdpdmVuIGJ5CisgICAgIGFueSBtZWFuLiAtLT4KKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPm9lbV9hZGFzXzI8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+b2VtX2FkYXNfMzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKworPCEtLSBNRURJQSBpcyBhIHZvbHVtZSBncm91cCB0aGF0IGhhcyBhIHNpbmdsZSBwb3J0IGdhaW4gKHRoaXMgaXMgdGhlIHJlYXNvbiB3aHkgaXQgaXMgYSBncm91cAorICAgICBidXQgbWF5IGhvc3QgZGlmZmVyZW50IHN0cmVhbXMuCisgICAgIEEgcHJpb3JpdHkgbXVzdCBiZSBnaXZlbiBhbW9uZyB0aGVtIChlaXRoZXIgdGhleSBhcmUgbXVsdHVhbHkgZXhjbHVzaXZlLCBzbyB0aGUgdm9sdW1lCisgICAgIHdpbGwgYmUgdGhlIG9uZSBvZiB0aGUgYWN0aXZlIHN0cmVhbSB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkgKE9SREVSIE1BVFRFUlMpIHVubGVzcyB0aGUgY3VydmVzCisgICAgIGZvbGxvd2VkIHdpbGwgdGhlIHRoZSBjdXJ2ZXMgZm9yIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlcy4tLT4KKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPm1lZGlhX2Nhcl9hdWRpb190eXBlXzM8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+bWVkaWFfY2FyX2F1ZGlvX3R5cGVfNzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPm1lZGlhPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD40MDwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5zcGVlY2g8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4xPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5zeXN0ZW08L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5waG9uZTwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjE8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnJpbmc8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT50dHM8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKworPC92b2x1bWVHcm91cHM+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jYXJlbXUvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jYXJlbXUvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWU2YjdiCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NhcmVtdS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsODIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBJbXBvcnQgdGhpcyBuYW1lc3BhY2UgaW4gb3JkZXIgdG8gdXNlIEFPU1AgQ2FyIEVtdWxhdG9yIGNvbmZpZ3VyYXRpb24gZXhhbXBsZQorCitzb29uZ19uYW1lc3BhY2UgeworICAgIGltcG9ydHM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2F1dG9tb3RpdmUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWciLAorICAgIF0sCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImF1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmM6ICI6YXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uIiwKKyAgICByZXF1aXJlZDogWworICAgICAgICAiYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sIiwKKyAgICAgICAgImF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sIiwKKyAgICAgICAgImF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCIsCisgICAgICAgICI6YXVkaW9fcG9saWN5X2VuZ2luZV92b2x1bWVzLnhtbCIsCisgICAgXSwKK30KK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCIsCisgICAgdmVuZG9yOiB0cnVlLAorICAgIHNyYzogImF1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbCIsCit9CitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJhdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmM6ICI6YXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMiLAorfQorCisvLworLy8gR2VuZXJhdGUgYXVkaW9fcG9saWN5X2VuZ2luZSBjcml0ZXJpb24gdHlwZSBmaWxlID0+IHByb3ZpZGVzIGRldmljZSBhZGRyZXNzZXMgY3JpdGVyaW9uIHR5cGUKKy8vCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMiLAorICAgIGRlZmF1bHRzOiBbImJ1aWxkcG9saWN5Y3JpdGVyaW9udHlwZXNydWxlIl0sCisgICAgc3JjczogWworICAgICAgICAiOmF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX3RvcF9maWxlIiwKKyAgICAgICAgIjphdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9maWxlcyIsCisgICAgXSwKK30KK2ZpbGVncm91cCB7CisgICAgbmFtZTogImF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2ZpbGVzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICI6cl9zdWJtaXhfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24iLAorICAgICAgICAiOmRlZmF1bHRfdm9sdW1lX3RhYmxlcyIsCisgICAgICAgICI6YXVkaW9fcG9saWN5X3ZvbHVtZXMiLAorICAgICAgICAiOnN1cnJvdW5kX3NvdW5kX2NvbmZpZ3VyYXRpb25fNV8wIiwKKyAgICAgICAgIjpwcmltYXJ5X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uIiwKKyAgICBdLAorfQorZmlsZWdyb3VwIHsKKyAgICBuYW1lIDogImF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX3RvcF9maWxlIiwKKyAgICBzcmNzOiBbIjphdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9nZW5lcmljIl0sCit9CitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJhdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb25fZmlsZXMiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIjphdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24iLAorICAgICAgICAiYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIiwKKyAgICAgICAgIjphdWRpb19wb2xpY3lfZW5naW5lX3ZvbHVtZXMiLAorICAgICAgICAiOmF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzIiwKKyAgICAgICAgIjphdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NhcmVtdS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY2FyZW11L2F1ZGlvX3BvbGljeV9lbmdpbmVfcHJvZHVjdF9zdHJhdGVnaWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTk4Y2YyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NhcmVtdS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKQEAgLTAsMCArMSwxNjcgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKK0xpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKK1VubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKK2Rpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCitXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KK1NlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKK2xpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+CisKKzxQcm9kdWN0U3RyYXRlZ2llcz4KKyAgICA8IS0tIE9FTSBVc2FnZXMgLS0+CisgICAgPCEtLSBwcm9kdWN0X3N0cmF0ZWd5IHdpbGwgYmUgZGVmaW5lZCBhY2NvcmRpbmcgdGhpcyBvcmRlcgorICAgIHByb2R1Y3Rfc3RyYXRlZ3kgaXMgb2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQgaWYgYWxsIHRoZSBjb25kaXRpb25zIGFyZSBzYXRpc2ZpZWQgZm9yCisgICAgQXVkaW9BdHRyaWJ1dGVzIGFhCisKKyAgICBpbnQgdHlwZSA9IDA7CisgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7CisgICAgdHlwZSA9IGJ1bmRsZS5nZXRJbnQoS0VZX09FTV9UWVBFLCAwKTsKKyAgICB9CisgICAgaWYoCisgICAgKCBhYS5tQ29udGVudFR5cGUgPT0gQXVkaW9BdHRyaWJ1dGVzLkFVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0ggKSAmJgorICAgICggYWEubVVzYWdlID09IEF1ZGlvQXR0cmlidXRlcy5BVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UgKSAmJgorICAgICggdHlwZSA9PSAxICkgKQorICAgIC0tPgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJvZW1fdHJhZmZpY19hbm91bmNlbWVudCI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9Im9lbV90cmFmZmljX2Fub3VuY2VtZW50Ij4KKyAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCIvPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4KKyAgICAgICAgICAgIDwhLS0gIHRyYWZmaWNfYW5ub3VjZW1lbnQgPSAxIC0tPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9Im9lbSIgdmFsdWU9IjEiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJvZW1fc3RyYXRlZ3lfMSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9Im9lbV9hZGFzXzIiPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9Im9lbSIgdmFsdWU9IjIiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJvZW1fc3RyYXRlZ3lfMiI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9Im9lbV9hZGFzXzMiPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSIvPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9Im9lbSIgdmFsdWU9IjMiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIENhciBVc2FnZXMgLS0+CisgICAgPCEtLSBLZWVwIHRob3NlIGxpbmVzIG9ubHkgZm9yIGNhciAtLT4KKyAgICA8IS0tIENoZWNrIGNhciBjb25kaXRpb25zIGlmIGFueSBPRU0gY29uZGl0aW9ucyBtYXRjaGVkIC0tPgorICAgIDwhLS0gQXMgZGVmaW5lZCBieSBDYXJBdWRpb0F0dHJpYnV0ZXNVdGlsLmphdmEgLS0+CisgICAgPCEtLSBwcm9kdWN0X3N0cmF0ZWd5IHdpbGwgYmUgZGVmaW5lZCBhY2NvcmRpbmcgdGhpcyBvcmRlcgorICAgIHByb2R1Y3Rfc3RyYXRlZ3kgaXMgcmFkaW8gaWYgYWxsIHRoZSBjb25kaXRpb25zIGFyZSBzYXRpc2ZpZWQgZm9yIEF1ZGlvQXR0cmlidXRlcyBhYQorCisgICAgICAgIGludCB0eXBlID0gQ0FSX0FVRElPX1RZUEVfREVGQVVMVDsKKyAgICAgICAgaWYgKGJ1bmRsZSAhPSBudWxsKSB7CisgICAgICAgIHR5cGUgPSBidW5kbGUuZ2V0SW50KEtFWV9DQVJfQVVESU9fVFlQRSwgQ0FSX0FVRElPX1RZUEVfREVGQVVMVCk7CisgICAgICAgIH0KKyAgICAgICAgaWYoCisgICAgICAgICggYWEubUNvbnRlbnRUeXBlID09IEF1ZGlvQXR0cmlidXRlcy5BVURJT19DT05URU5UX1RZUEVfU1BFRUNIICkgJiYKKyAgICAgICAgKCBhYS5tVXNhZ2UgPT0gQXVkaW9BdHRyaWJ1dGVzLkFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfTkFWSUdBVElPTl9HVUlEQU5DRSApICYmCisgICAgICAgICggdHlwZSA9PSBDQVJfQVVESU9fVFlQRV9SQURJTyApICkKKyAgICAgICAgLS0+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJyYWRpbyI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgdm9sdW1lR3JvdXA9Im1lZGlhX2Nhcl9hdWRpb190eXBlXzMiPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfTVVTSUMiLz4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTUVESUEiLz4KKyAgICAgICAgICAgIDxCdW5kbGUga2V5PSJjYXJfYXVkaW9fdHlwZSIgdmFsdWU9IjMiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJleHRfYXVkaW9fc291cmNlIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCB2b2x1bWVHcm91cD0ibWVkaWFfY2FyX2F1ZGlvX3R5cGVfNyI+CisgICAgICAgICAgICA8Q29udGVudFR5cGUgdmFsdWU9IkFVRElPX0NPTlRFTlRfVFlQRV9NVVNJQyIvPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9NRURJQSIvPgorICAgICAgICAgICAgPEJ1bmRsZSBrZXk9ImNhcl9hdWRpb190eXBlIiB2YWx1ZT0iNyIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9InZvaWNlX2NvbW1hbmQiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHZvbHVtZUdyb3VwPSJzcGVlY2giIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9BU1NJU1RBTlQiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+CisgICAgICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU1BFRUNIIi8+CisgICAgICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4KKyAgICAgICAgICAgICAgICA8IS0tICBDQVJfQVVESU9fVFlQRV9WT0lDRV9DT01NQU5EID0gMSAtLT4KKyAgICAgICAgICAgICAgICA8QnVuZGxlIGtleT0iY2FyX2F1ZGlvX3R5cGUiIHZhbHVlPSIxIi8+CisgICAgICAgICAgICA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFkiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5UIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJzYWZldHlfYWxlcnQiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHZvbHVtZUdyb3VwPSJzeXN0ZW0iPgorICAgICAgICAgICAgPENvbnRlbnRUeXBlIHZhbHVlPSJBVURJT19DT05URU5UX1RZUEVfU09OSUZJQ0FUSU9OIi8+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTiIvPgorICAgICAgICAgICAgPCEtLSAgQ0FSX0FVRElPX1RZUEVfU0FGRVRZX0FMRVJUID0gMiAtLT4KKyAgICAgICAgICAgIDxCdW5kbGUga2V5PSJjYXJfYXVkaW9fdHlwZSIgdmFsdWU9IjIiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8IS0tIFRvIGJlIGNoZWNrZWQKKyAgICBDQVJfQVVESU9fVFlQRV9DQVJTRVJWSUNFX0JPVFRPTQorICAgIENBUl9BVURJT19UWVBFX0NBUlNFUlZJQ0VfQ0FSX1BST1hZCisgICAgQ0FSX0FVRElPX1RZUEVfQ0FSU0VSVklDRV9NRURJQV9NVVRFCisgICAgLS0+CisKKyAgICA8IS0tIEdlbmVyaWMgVXNhZ2VzIC0tPgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0ibXVzaWMiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9NVVNJQyIgdm9sdW1lR3JvdXA9Im1lZGlhIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX01FRElBIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0dBTUUiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPCEtLSBEZWZhdWx0IHByb2R1Y3Qgc3RyYXRlZ3kgaGFzIGVtcHR5IGF0dHJpYnV0ZXMgLS0+CisgICAgICAgICAgICA8QXR0cmlidXRlcz48L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJuYXZfZ3VpZGFuY2UiPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHZvbHVtZUdyb3VwPSJzcGVlY2giPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJ2b2ljZV9jYWxsIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCIgdm9sdW1lR3JvdXA9InBob25lIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08iIHZvbHVtZUdyb3VwPSJwaG9uZSI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPEZsYWdzIHZhbHVlPSJBVURJT19GTEFHX1NDTyIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iYWxhcm0iPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9BTEFSTSIgdm9sdW1lR3JvdXA9InJpbmciPgorICAgICAgICAgICAgPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BTEFSTSIvPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9InJpbmciPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9SSU5HIiB2b2x1bWVHcm91cD0icmluZyI+CisgICAgICAgICAgICA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkUiLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJub3RpZmljYXRpb24iPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iIHZvbHVtZUdyb3VwPSJyaW5nIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0ic3lzdGVtIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fU1lTVEVNIiB2b2x1bWVHcm91cD0ic3lzdGVtIj4KKyAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04iLz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJ0dHMiPgorICAgICAgICA8IS0tIFRUUyBzdHJlYW0gTVVTVCBCRSBNQU5BR0VEIE9VVFNJREUgZGVmYXVsdCBwcm9kdWN0IHN0cmF0ZWd5IGlmIE5PIERFRElDQVRFRCBPVVRQVVQKKyAgICAgICAgICAgICBmb3IgVFRTLCBvdGhlcndpc2Ugd2hlbiBiZWFjb24gaGFwcGVucywgZGVmYXVsdCBzdHJhdGVneSBpcyAuLi4gbXV0ZWQuCisgICAgICAgICAgICAgSWYgaXQgaXMgbWVkaWEsIGl0IGlzIGFubm95aW5nLi4uIC0tPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9UVFMiIHZvbHVtZUdyb3VwPSJ0dHMiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxGbGFncyB2YWx1ZT0iQVVESU9fRkxBR19CRUFDT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworPC9Qcm9kdWN0U3RyYXRlZ2llcz4KKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NhcmVtdS9hdWRpb19wb2xpY3lfZW5naW5lX3ZvbHVtZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NhcmVtdS9hdWRpb19wb2xpY3lfZW5naW5lX3ZvbHVtZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3YTI1YTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY2FyZW11L2F1ZGlvX3BvbGljeV9lbmdpbmVfdm9sdW1lcy54bWwKQEAgLTAsMCArMSwxOTMgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgICAtLT4KKworPCEtLSBWb2x1bWUgR3JvdXBzIFRhYmxlcyBpbmNsdWRlZCBieSBBdWRpbyBQb2xpY3kgQ29uZmlndXJhdGlvbiBmaWxlIC0tPgorPCEtLSBOb3RlOgorICAgICAgICBJdCBpcyBWQUxJRCB0byBoYXZlIGEgZ3JvdXAgd2l0aG91dCBhdHRyaWJ1dGVzIGlmIGEgcHJvZHVjdCBzdHJhdGVneSBpcyBmb2xsb3dpbmcKKyAgICAgICAgdGhpcyBncm91cCBmb3IgYWxsIGF0dHJpYnV0ZXMuCisgICAgICAgIE90aGVyd2lzZSwgYXR0cmlidXRlcyBtdXN0IGJlIHNwZWNpZmllZAorLS0+CisKKzx2b2x1bWVHcm91cHM+CisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5vZW1fdHJhZmZpY19hbm91bmNlbWVudDwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKzwhLS0gT0VNIEFEQVMgaXMgYSB2b2x1bWUgZ3JvdXAgdGhhdCBoYXMgYSBzaW5nbGUgcG9ydCBnYWluICh0aGlzIGlzIHRoZSByZWFzb24gd2h5IGl0IGlzIGEgZ3JvdXAKKyAgICAgYnV0IG1heSBob3N0IGRpZmZlcmVudCBzdHJlYW1zLgorICAgICBBIHByaW9yaXR5IG11c3QgYmUgZ2l2ZW4gYW1vbmcgdGhlbSAoZWl0aGVyIHRoZXkgYXJlIG11bHR1YWx5IGV4Y2x1aXN2ZSwgc28gdGhlIHZvbHVtZQorICAgICB3aWxsIGJlIHRoZSBvbmUgb2YgdGhlIGN1cnJlbnRseSBhY2l0dmUgc3RyZWFtLCBvdGhlcndpc2UgYSBwcmlvcml0eSBtdXN0IGJlIGdpdmVuIGJ5CisgICAgIGFueSBtZWFuLiAtLT4KKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPm9lbV9hZGFzXzI8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+b2VtX2FkYXNfMzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKworPCEtLSBNRURJQSBpcyBhIHZvbHVtZSBncm91cCB0aGF0IGhhcyBhIHNpbmdsZSBwb3J0IGdhaW4gKHRoaXMgaXMgdGhlIHJlYXNvbiB3aHkgaXQgaXMgYSBncm91cAorICAgICBidXQgbWF5IGhvc3QgZGlmZmVyZW50IHN0cmVhbXMuCisgICAgIEEgcHJpb3JpdHkgbXVzdCBiZSBnaXZlbiBhbW9uZyB0aGVtIChlaXRoZXIgdGhleSBhcmUgbXVsdHVhbHkgZXhjbHVzaXZlLCBzbyB0aGUgdm9sdW1lCisgICAgIHdpbGwgYmUgdGhlIG9uZSBvZiB0aGUgYWN0aXZlIHN0cmVhbSB3aXRoIGhpZ2hlc3QgcHJpb3JpdHkgKE9SREVSIE1BVFRFUlMpIHVubGVzcyB0aGUgY3VydmVzCisgICAgIGZvbGxvd2VkIHdpbGwgdGhlIHRoZSBjdXJ2ZXMgZm9yIHRoZSByZXF1ZXN0ZWQgYXR0cmlidXRlcy4tLT4KKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPm1lZGlhX2Nhcl9hdWRpb190eXBlXzM8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+bWVkaWFfY2FyX2F1ZGlvX3R5cGVfNzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPm1lZGlhPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD40MDwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5zcGVlY2g8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4xPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5zeXN0ZW08L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5waG9uZTwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjE8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NDA8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPnJpbmc8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjQwPC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTQyMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjMzLC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD42NiwtMTQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT50dHM8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjAsLTA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgPC92b2x1bWVHcm91cD4KKworPC92b2x1bWVHcm91cHM+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jb21tb24vYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY29tbW9uL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjODJiMmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvY29tbW9uL2F1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEueG1sCkBAIC0wLDAgKzEsMzAgQEAKKzw/eG1sIHZlcnNpb249JzEuMCcgZW5jb2Rpbmc9J1VURi04Jz8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorLS0+Cis8Y3JpdGVyaWE+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJBdmFpbGFibGVJbnB1dERldmljZXMiIHR5cGU9IklucHV0RGV2aWNlc01hc2tUeXBlIiBkZWZhdWx0PSJub25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJBdmFpbGFibGVPdXRwdXREZXZpY2VzIiB0eXBlPSJPdXRwdXREZXZpY2VzTWFza1R5cGUiIGRlZmF1bHQ9Im5vbmUiLz4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IkF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMiIHR5cGU9Ik91dHB1dERldmljZXNBZGRyZXNzZXNUeXBlIiBkZWZhdWx0PSJub25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJBdmFpbGFibGVJbnB1dERldmljZXNBZGRyZXNzZXMiIHR5cGU9IklucHV0RGV2aWNlc0FkZHJlc3Nlc1R5cGUiIGRlZmF1bHQ9Im5vbmUiLz4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IlRlbGVwaG9ueU1vZGUiIHR5cGU9IkFuZHJvaWRNb2RlVHlwZSIgZGVmYXVsdD0iTm9ybWFsIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iIHR5cGU9IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvblR5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iRm9yY2VVc2VGb3JNZWRpYSIgdHlwZT0iRm9yY2VVc2VGb3JNZWRpYVR5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iRm9yY2VVc2VGb3JSZWNvcmQiIHR5cGU9IkZvcmNlVXNlRm9yUmVjb3JkVHlwZSIgZGVmYXVsdD0iRm9yY2VOb25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJGb3JjZVVzZUZvckRvY2siIHR5cGU9IkZvcmNlVXNlRm9yRG9ja1R5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iRm9yY2VVc2VGb3JTeXN0ZW0iIHR5cGU9IkZvcmNlVXNlRm9yU3lzdGVtVHlwZSIgZGVmYXVsdD0iRm9yY2VOb25lIi8+CisgICAgPGNyaXRlcmlvbiBuYW1lPSJGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyIgdHlwZT0iRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW9UeXBlIiBkZWZhdWx0PSJGb3JjZU5vbmUiLz4KKyAgICA8Y3JpdGVyaW9uIG5hbWU9IkZvcmNlVXNlRm9yRW5jb2RlZFN1cnJvdW5kIiB0eXBlPSJGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZFR5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorICAgIDxjcml0ZXJpb24gbmFtZT0iRm9yY2VVc2VGb3JWaWJyYXRlUmluZ2luZyIgdHlwZT0iRm9yY2VVc2VGb3JWaWJyYXRlUmluZ2luZ1R5cGUiIGRlZmF1bHQ9IkZvcmNlTm9uZSIvPgorPC9jcml0ZXJpYT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jb21tb24vYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sLmluIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NvbW1vbi9hdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcy54bWwuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTEzNGM0MgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9jb21tb24vYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sLmluCkBAIC0wLDAgKzEsMTAxIEBACis8P3htbCB2ZXJzaW9uPScxLjAnIGVuY29kaW5nPSdVVEYtOCc/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorPGNyaXRlcmlvbl90eXBlcz4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iT3V0cHV0RGV2aWNlc01hc2tUeXBlIiB0eXBlPSJpbmNsdXNpdmUiLz4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iSW5wdXREZXZpY2VzTWFza1R5cGUiIHR5cGU9ImluY2x1c2l2ZSIvPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJPdXRwdXREZXZpY2VzQWRkcmVzc2VzVHlwZSIgdHlwZT0iaW5jbHVzaXZlIj4KKyAgICAgICAgPHZhbHVlcz4KKyAgICAgICAgICAgIDwhLS0gbGVnYWN5IHJlbW90ZSBzdWJtaXggLS0+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iMCIgbnVtZXJpY2FsPSIxIi8+CisgICAgICAgIDwvdmFsdWVzPgorICAgIDwvY3JpdGVyaW9uX3R5cGU+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IklucHV0RGV2aWNlc0FkZHJlc3Nlc1R5cGUiIHR5cGU9ImluY2x1c2l2ZSI+CisgICAgICAgIDx2YWx1ZXM+CisgICAgICAgICAgICA8IS0tIGxlZ2FjeSByZW1vdGUgc3VibWl4IC0tPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IjAiIG51bWVyaWNhbD0iMSIvPgorICAgICAgICA8L3ZhbHVlcz4KKyAgICA8L2NyaXRlcmlvbl90eXBlPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJBbmRyb2lkTW9kZVR5cGUiIHR5cGU9ImV4Y2x1c2l2ZSIvPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJCb29sZWFuVHlwZSIgdHlwZT0iZXhjbHVzaXZlIj4KKyAgICAgICAgPHZhbHVlcz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGYWxzZSIgbnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iVHJ1ZSIgbnVtZXJpY2FsPSIxIi8+CisgICAgICAgIDwvdmFsdWVzPgorICAgIDwvY3JpdGVyaW9uX3R5cGU+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IkZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvblR5cGUiIHR5cGU9ImV4Y2x1c2l2ZSI+CisgICAgICAgIDx2YWx1ZXM+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VOb25lIiBudW1lcmljYWw9IjAiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZVNwZWFrZXIiIG51bWVyaWNhbD0iMSIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlQnRTY28iIG51bWVyaWNhbD0iMyIvPgorICAgICAgICA8L3ZhbHVlcz4KKyAgICA8L2NyaXRlcmlvbl90eXBlPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJGb3JjZVVzZUZvck1lZGlhVHlwZSIgdHlwZT0iZXhjbHVzaXZlIj4KKyAgICAgICAgPHZhbHVlcz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZU5vbmUiIG51bWVyaWNhbD0iMCIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlU3BlYWtlciIgbnVtZXJpY2FsPSIxIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VIZWFkcGhvbmVzIiBudW1lcmljYWw9IjIiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZUJ0QTJkcCIgbnVtZXJpY2FsPSI0Ii8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VXaXJlZEFjY2Vzc29yeSIgbnVtZXJpY2FsPSI1Ii8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VBbmFsb2dEb2NrIiBudW1lcmljYWw9IjgiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZURpZ2l0YWxEb2NrIiBudW1lcmljYWw9IjkiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZU5vQnRBMmRwIiBudW1lcmljYWw9IjEwIi8+CisgICAgICAgIDwvdmFsdWVzPgorICAgIDwvY3JpdGVyaW9uX3R5cGU+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IkZvcmNlVXNlRm9yUmVjb3JkVHlwZSIgdHlwZT0iZXhjbHVzaXZlIj4KKyAgICAgICAgPHZhbHVlcz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZU5vbmUiIG51bWVyaWNhbD0iMCIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlQnRTY28iIG51bWVyaWNhbD0iMyIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlV2lyZWRBY2Nlc3NvcnkiIG51bWVyaWNhbD0iNSIvPgorICAgICAgICA8L3ZhbHVlcz4KKyAgICA8L2NyaXRlcmlvbl90eXBlPgorICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSJGb3JjZVVzZUZvckRvY2tUeXBlIiB0eXBlPSJleGNsdXNpdmUiPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlTm9uZSIgbnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VXaXJlZEFjY2Vzc29yeSIgbnVtZXJpY2FsPSI1Ii8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VCdENhckRvY2siIG51bWVyaWNhbD0iNiIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlQnREZXNrRG9jayIgbnVtZXJpY2FsPSI3Ii8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VBbmFsb2dEb2NrIiBudW1lcmljYWw9IjgiLz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZURpZ2l0YWxEb2NrIiBudW1lcmljYWw9IjkiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iRm9yY2VVc2VGb3JTeXN0ZW1UeXBlIiB0eXBlPSJleGNsdXNpdmUiID4KKyAgICAgICAgPHZhbHVlcz4KKyAgICAgICAgICAgIDx2YWx1ZSBsaXRlcmFsPSJGb3JjZU5vbmUiIG51bWVyaWNhbD0iMCIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlU3lzdGVtRW5mb3JjZWQiIG51bWVyaWNhbD0iMTEiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW9UeXBlIiB0eXBlPSJleGNsdXNpdmUiPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlTm9uZSIgbnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQiIG51bWVyaWNhbD0iMTIiLz4KKyAgICAgICAgPC92YWx1ZXM+CisgICAgPC9jcml0ZXJpb25fdHlwZT4KKyAgICA8Y3JpdGVyaW9uX3R5cGUgbmFtZT0iRm9yY2VVc2VGb3JFbmNvZGVkU3Vycm91bmRUeXBlIiB0eXBlPSJleGNsdXNpdmUiPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlTm9uZSIgbnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VFbmNvZGVkU3Vycm91bmROZXZlciIgbnVtZXJpY2FsPSIxMyIvPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlRW5jb2RlZFN1cnJvdW5kQWx3YXlzIiBudW1lcmljYWw9IjE0Ii8+CisgICAgICAgIDwvdmFsdWVzPgorICAgIDwvY3JpdGVyaW9uX3R5cGU+CisgICAgPGNyaXRlcmlvbl90eXBlIG5hbWU9IkZvcmNlVXNlRm9yVmlicmF0ZVJpbmdpbmdUeXBlIiB0eXBlPSJleGNsdXNpdmUiPgorICAgICAgICA8dmFsdWVzPgorICAgICAgICAgICAgPHZhbHVlIGxpdGVyYWw9IkZvcmNlTm9uZSIgbnVtZXJpY2FsPSIwIi8+CisgICAgICAgICAgICA8dmFsdWUgbGl0ZXJhbD0iRm9yY2VCdFNjbyIgbnVtZXJpY2FsPSIzIi8+CisgICAgICAgIDwvdmFsdWVzPgorICAgIDwvY3JpdGVyaW9uX3R5cGU+Cis8L2NyaXRlcmlvbl90eXBlcz4KKworCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZDMzYmQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvQW5kcm9pZC5icApAQCAtMCwwICsxLDEwNCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEltcG9ydCB0aGlzIG5hbWVzcGFjZSBpbiBvcmRlciB0byB1c2UgQU9TUCBQaG9uZSBjb25maWd1cmF0aW9uIGV4YW1wbGUKKworc29vbmdfbmFtZXNwYWNlIHsKKyAgICBpbXBvcnRzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZyIsCisgICAgXSwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbCIsCisgICAgdmVuZG9yOiB0cnVlLAorICAgIHNyYzogIjphdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24iLAorICAgIHJlcXVpcmVkOiBbCisgICAgICAgICI6YXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sIiwKKyAgICAgICAgIjphdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhLnhtbCIsCisgICAgICAgICI6YXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIiwKKyAgICAgICAgIjphdWRpb19wb2xpY3lfZW5naW5lX3ZvbHVtZXMueG1sIiwKKyAgICBdLAorfQorcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjOiAiYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIiwKK30KK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImF1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjOiAiOmF1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMiLAorfQorcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbCIsCisgICAgdmVuZG9yOiB0cnVlLAorICAgIHNyYzogIjphdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMiLAorfQorcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjOiAiOmF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzIiwKK30KKworLy8KKy8vIEdlbmVyYXRlIGF1ZGlvX3BvbGljeV9lbmdpbmUgY3JpdGVyaW9uIHR5cGUgZmlsZSA9PiBwcm92aWRlcyBkZXZpY2UgYWRkcmVzc2VzIGNyaXRlcmlvbiB0eXBlCisvLworZ2VucnVsZSB7CisgICAgbmFtZTogImF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzIiwKKyAgICBkZWZhdWx0czogWyJidWlsZHBvbGljeWNyaXRlcmlvbnR5cGVzcnVsZSJdLAorICAgIHNyY3M6IFsKKyAgICAgICAgIjphdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl90b3BfZmlsZSIsCisgICAgICAgICI6YXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZmlsZXMiLAorICAgIF0sCit9CitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl9maWxlcyIsCisgICAgc3JjczogWworICAgICAgICAiOnJfc3VibWl4X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uIiwKKyAgICAgICAgIjpkZWZhdWx0X3ZvbHVtZV90YWJsZXMiLAorICAgICAgICAiOmF1ZGlvX3BvbGljeV92b2x1bWVzIiwKKyAgICAgICAgIjpzdXJyb3VuZF9zb3VuZF9jb25maWd1cmF0aW9uXzVfMCIsCisgICAgICAgICI6cHJpbWFyeV9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbiIsCisgICAgXSwKK30KK2ZpbGVncm91cCB7CisgICAgbmFtZSA6ICJhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl90b3BfZmlsZSIsCisgICAgc3JjczogWyI6YXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZ2VuZXJpYyJdLAorfQorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uIiwKKyAgICBzcmNzOiBbImF1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwiXSwKK30KK2ZpbGVncm91cCB7CisgICAgbmFtZTogImF1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMiLAorICAgIHNyY3M6IFsiYXVkaW9fcG9saWN5X2VuZ2luZV9zdHJlYW1fdm9sdW1lcy54bWwiXSwKK30KK2ZpbGVncm91cCB7CisgICAgbmFtZTogImF1ZGlvX3BvbGljeV9lbmdpbmVfZGVmYXVsdF9zdHJlYW1fdm9sdW1lcyIsCisgICAgc3JjczogWyJhdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sIl0sCit9CitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJhdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb25fZmlsZXMiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIjphdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24iLAorICAgICAgICAiYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIiwKKyAgICAgICAgIjphdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzIiwKKyAgICAgICAgIjphdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMiLAorICAgICAgICAiOmF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzIiwKKyAgICAgICAgIjphdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlhIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmFmOWI5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSwyNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAgICAgLS0+CisKKzxjb25maWd1cmF0aW9uIHZlcnNpb249IjEuMCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorCisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIi8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpb25fdHlwZXMueG1sIi8+CisgICAgPHhpOmluY2x1ZGUgaHJlZj0iYXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYS54bWwiLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfZGVmYXVsdF9zdHJlYW1fdm9sdW1lcy54bWwiLz4KKworPC9jb25maWd1cmF0aW9uPgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZTZkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbApAQCAtMCwwICsxLDEzNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gRGVmYXVsdCBWb2x1bWUgVGFibGVzIGluY2x1ZGVkIGJ5IEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUgLS0+Cis8IS0tIEZ1bGwgRGVmYXVsdCBWb2x1bWUgdGFibGUgZm9yIGFsbCBkZXZpY2UgY2F0ZWdvcnkgLS0+Cis8dm9sdW1lcz4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIEZ1bGwgU2NhbGUgcmVmZXJlbmNlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjAsMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJTSUxFTlRfVk9MVU1FX0NVUlZFIj4KKyAgICAgICAgPHBvaW50PjAsLTk2MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLC05NjAwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IFN5c3RlbSByZWZlcmVuY2UgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtMjQwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4zMywtMTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42NiwtMTIwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsLTYwMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IE1lZGlhIHJlZmVyZW5jZSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tRGVmYXVsdCBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC00OTUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjMzLC0zMzUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjY2LC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgaXMgU3BlYWtlciBNZWRpYSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJfU1lTVEVNX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IGlzIFNwZWFrZXIgU3lzdGVtIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTQ2ODA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NDIsLTIwNzA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+ODUsLTU0MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS1EZWZhdWx0IFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTQ5NTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MzMsLTMzNTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjYsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IGlzIEV4dCBNZWRpYSBTeXN0ZW0gVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMjEwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsLTEwMDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBIZWFyaW5nIEFpZCBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC0xMjcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtODAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAgIDwhLS0gTm9uLW11dGFibGUgZGVmYXVsdCB2b2x1bWUgY3VydmVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tICAgICAqIGZpcnN0IHBvaW50IGlzIGFsd2F5cyBmb3IgaW5kZXggMCAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgPCEtLSAgICAgKiBhdHRlbnVhdGlvbiBpcyBzbWFsbCBlbm91Z2ggdGhhdCBzdHJlYW0gY2FuIHN0aWxsIGJlIGhlYXJkIC0tPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBub24tbXV0YWJsZSByZWZlcmVuY2UgVm9sdW1lIEN1cnZlIC0tPgorICAgIDwhLS0gICAgICAgIGJhc2VkIG9uIERFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX0hFQURTRVRfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tRGVmYXVsdCBub24tbXV0YWJsZSBWb2x1bWUgQ3VydmUgZm9yIGhlYWRzZXQgLS0+CisgICAgPCEtLSAgICBiYXNlZCBvbiBERUZBVUxUX0RFVklDRV9DQVRFR09SWV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTQ5NTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MzMsLTMzNTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjYsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IG5vbi1tdXRhYmxlIFNwZWFrZXIgVm9sdW1lIEN1cnZlIC0tPgorICAgIDwhLS0gICAgYmFzZWQgb24gREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfRUFSUElFQ0VfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tRGVmYXVsdCBub24tbXV0YWJsZSBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICBiYXNlZCBvbiBERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC00OTUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjMzLC0zMzUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjY2LC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfRVhUX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IG5vbi1tdXRhYmxlIEV4dCBNZWRpYSBTeXN0ZW0gVm9sdW1lIEN1cnZlIC0tPgorICAgIDwhLS0gICAgIGJhc2VkIG9uIERFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0yMTAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwtMTAwMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IG5vbi1tdXRhYmxlIEhlYXJpbmcgQWlkIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICA8IS0tICAgICBiYXNlZCBvbiBERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTEyNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC04MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKzwvdm9sdW1lcz4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3Mzg4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCkBAIC0wLDAgKzEsMTAxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgICAtLT4KKworPFByb2R1Y3RTdHJhdGVnaWVzPgorCisgICAgPCEtLSAiaGlkZGVuIHN0cmF0ZWdpZXMiIGxpa2UgVFRTLCBlbmZvcmNlZCBhdWRpYmxlOgorICAgICAgICAgICAgU2hhbGwgd2UgZXhwb3NlIHRoZW0gaGVyZSBvciBrZWVwIGl0IGhhcmQgY29kZWQgLS0+CisKKyAgICA8IS0tIFVzZWQgdG8gaWRlbnRpZnkgdGhlIHZvbHVtZSBvZiBhdWRpbyBzdHJlYW1zIGZvciBlbmZvcmNlZCBzeXN0ZW0gc291bmRzIGluIGNlcnRhaW4KKyAgICAgICAgIGNvdW50cmllcyAoZS5nLiBjYW1lcmEgaW4gSmFwYW4pCisgICAgICAgICBUaGlzIHN0cmF0ZWd5IHdpbGwgb25seSBoYXZlIGhpZ2hlciBwcmlvcml0eSB0aGFuIHBob25lIGlmIGZvcmNlIGZvciBzeXN0ZW0gaXMgc2V0IHRvCisgICAgICAgICBlbmZvcmNlZC4gLS0+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1BIT05FIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCIgdm9sdW1lR3JvdXA9InZvaWNlX2NhbGwiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPIiB2b2x1bWVHcm91cD0iYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPEZsYWdzIHZhbHVlPSJBVURJT19GTEFHX1NDTyIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9TT05JRklDQVRJT04iPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9SSU5HIiB2b2x1bWVHcm91cD0icmluZyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0FMQVJNIiB2b2x1bWVHcm91cD0iYWxhcm0iPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQUxBUk0iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUiIHZvbHVtZUdyb3VwPSJlbmZvcmNlZF9hdWRpYmxlIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8RmxhZ3MgdmFsdWU9IkFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9BQ0NFU1NJQklMSVRZIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSIgdm9sdW1lR3JvdXA9ImFjY2Vzc2liaWxpdHkiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OIiB2b2x1bWVHcm91cD0ibm90aWZpY2F0aW9uIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfTUVESUEiPgorICAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fTVVTSUMiIHZvbHVtZUdyb3VwPSJtdXNpYyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9NRURJQSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9HQU1FIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOVCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+PC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQVNTSVNUQU5UIiB2b2x1bWVHcm91cD0iYXNzaXN0YW50Ij4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPgorICAgICAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCIvPgorICAgICAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5UIi8+CisgICAgICAgICAgICA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9TWVNURU0iIHZvbHVtZUdyb3VwPSJzeXN0ZW0iPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfRFRNRiI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0RUTUYiIHZvbHVtZUdyb3VwPSJkdG1mIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORyIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPCEtLSBVc2VkIHRvIGlkZW50aWZ5IHRoZSB2b2x1bWUgb2YgYXVkaW8gc3RyZWFtcyBleGNsdXNpdmVseSB0cmFuc21pdHRlZCB0aHJvdWdoIHRoZSAgc3BlYWtlcgorICAgICAgICAgKFRUUykgb2YgdGhlIGRldmljZSAtLT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1RUUyIgdm9sdW1lR3JvdXA9InR0cyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPEZsYWdzIHZhbHVlPSJBVURJT19GTEFHX0JFQUNPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCis8L1Byb2R1Y3RTdHJhdGVnaWVzPgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9zdHJlYW1fdm9sdW1lcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9zdHJlYW1fdm9sdW1lcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFhNzFjYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbApAQCAtMCwwICsxLDIyMCBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gVm9sdW1lIHNlY3Rpb24gZGVmaW5lcyBhIHZvbHVtZSBjdXJ2ZSBmb3IgYSBnaXZlbiB1c2UgY2FzZSBhbmQgZGV2aWNlIGNhdGVnb3J5LgorSXQgY29udGFpbnMgYSBsaXN0IG9mIHBvaW50cyBvZiB0aGlzIGN1cnZlIGV4cHJlc3NpbmcgdGhlIGF0dGVudWF0aW9uIGluIE1pbGxpYmVscyBmb3IgYSBnaXZlbgordm9sdW1lIGluZGV4IGZyb20gMCB0byAxMDAuCis8dm9sdW1lIGRldmljZUNhdGVnb3J5PeKAneKAnT4KKzxwb2ludD4wLC05NjAwPC9wb2ludD4KKzxwb2ludD4xMDAsMDwvcG9pbnQ+Cis8L3ZvbHVtZT4KKy0tPgorCis8dm9sdW1lR3JvdXBzPgorICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+dm9pY2VfY2FsbDwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjE8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NzwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNzAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTkwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5zeXN0ZW08L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtMzAwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0yMjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE4MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjEsLTUxMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjU3LC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD43MSwtMjUwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+ODUsLTIzMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwtMjEwMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8IS0tdm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLy0tPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5yaW5nPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+bXVzaWM8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjI1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiAgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPmFsYXJtPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MTwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1NQRUFLRVJfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfRVhUX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5ub3RpZmljYXRpb248L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+Ymx1ZXRvb3RoX3NjbzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPmVuZm9yY2VkX2F1ZGlibGU8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtMzAwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0yMjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE4MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjEsLTM0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjcxLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTIwMDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPCEtLXZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8tLT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+ZHRtZjwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtMzAwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0yMjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE4MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjEsLTQwMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjcxLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE0MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPCEtLXZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8tLT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+dHRzPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4xNTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJTSUxFTlRfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJTSUxFTlRfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+YWNjZXNzaWJpbGl0eTwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjE8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1NQRUFLRVJfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5hc3Npc3RhbnQ8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjE1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiAgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKzwvdm9sdW1lR3JvdXBzPgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmgKaW5kZXggYTU5N2U4Ny4uZjUyZGUyMSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUvQXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbmNsdWRlL0F1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaApAQCAtMTYsMTMgKzE2LDExIEBACiAKICNwcmFnbWEgb25jZQogCi1jbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2U7CitjbGFzcyBFbmdpbmVJbnRlcmZhY2U7CiBjbGFzcyBBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZTsKIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgewogCiBjbGFzcyBFbmdpbmU7CiAKQEAgLTcxLDcgKzY5LDcgQEAKICAqIENvbXBpbGUgdGltZSBlcnJvciB3aWxsIGNsYWltIGlmIGludmFsaWQgaW50ZXJmYWNlIGlzIHJlcXVlc3RlZC4KICAqLwogdGVtcGxhdGUgPD4KLUF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZSAqRW5naW5lSW5zdGFuY2U6OnF1ZXJ5SW50ZXJmYWNlKCkgY29uc3Q7CitFbmdpbmVJbnRlcmZhY2UgKkVuZ2luZUluc3RhbmNlOjpxdWVyeUludGVyZmFjZSgpIGNvbnN0OwogCiB0ZW1wbGF0ZSA8PgogQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKkVuZ2luZUluc3RhbmNlOjpxdWVyeUludGVyZmFjZSgpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZS9BdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZS9BdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oCmluZGV4IDJlMjlhOWIuLjFmYzIyNjQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9pbnRlcmZhY2UvQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlL0F1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmgKQEAgLTE2LDEwICsxNiwxMSBAQAogCiAjcHJhZ21hIG9uY2UKIAotI2luY2x1ZGUgPFJvdXRpbmdTdHJhdGVneS5oPgorI2luY2x1ZGUgPHBvbGljeS5oPgogI2luY2x1ZGUgPEVuZ2luZURlZmluaXRpb24uaD4KICNpbmNsdWRlIDxWb2x1bWUuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb0NvbW1vblR5cGVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KQEAgLTM2LDE5ICszNyw2IEBACiB7CiBwdWJsaWM6CiAgICAgLyoqCi0gICAgICogQWRkIGEgc3RyYXRlZ3kgdG8gdGhlIGVuZ2luZQotICAgICAqCi0gICAgICogQHBhcmFtW2luXSBuYW1lIG9mIHRoZSBzdHJhdGVneSB0byBhZGQKLSAgICAgKiBAcGFyYW1baW5dIGlkZW50aWZpZXI6IHRoZSBudW1lcmljYWwgdmFsdWUgYXNzb2NpYXRlZCB0byB0aGlzIG1lbWJlci4gSXQgTVVTVCBtYXRjaCBlaXRoZXIKLSAgICAgKiAgICAgICAgICAgIHN5c3RlbS9hdWRpby5oIG9yIHN5c3RlbS9hdWRpb19wb2xpY3kuaCBlbnVtcmF0aW9uIHZhbHVlIGluIG9yZGVyIHRvIGxpbmsgdGhlCi0gICAgICogICAgICAgICAgICBwYXJhbWV0ZXIgY29udHJvbGVkIGJ5IHRoZSBQRlcgYW5kIHRoZSBwb2xpY3kgbWFuYWdlciBjb21wb25lbnQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHRoZSBzdHJhdGVneSBoYXMgYmVlbiBhZGRlZCBzdWNjZXNzZnVsbHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgotICAgICAqCi0gICAgICovCi0gICAgdmlydHVhbCBhbmRyb2lkOjpzdGF0dXNfdCBhZGRTdHJhdGVneShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgcm91dGluZ19zdHJhdGVneSBpZCkgPSAwOwotCi0gICAgLyoqCiAgICAgICogQWRkIGEgc3RyZWFtcyB0byB0aGUgZW5naW5lLgogICAgICAqCiAgICAgICogQHBhcmFtW2luXSBuYW1lIG9mIHRoZSBzdHJlYW0gdG8gYWRkCkBAIC02MiwxOSArNTAsNiBAQAogICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3QgYWRkU3RyZWFtKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb19zdHJlYW1fdHlwZV90IGlkKSA9IDA7CiAKICAgICAvKioKLSAgICAgKiBBZGQgYSB1c2FnZSB0byB0aGUgZW5naW5lCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIG5hbWUgb2YgdGhlIHVzYWdlIHRvIGFkZAotICAgICAqIEBwYXJhbVtpbl0gaWRlbnRpZmllcjogdGhlIG51bWVyaWNhbCB2YWx1ZSBhc3NvY2lhdGVkIHRvIHRoaXMgbWVtYmVyLiBJdCBNVVNUIG1hdGNoIGVpdGhlcgotICAgICAqICAgICAgICAgICAgc3lzdGVtL2F1ZGlvLmggb3Igc3lzdGVtL2F1ZGlvX3BvbGljeS5oIGVudW1yYXRpb24gdmFsdWUgaW4gb3JkZXIgdG8gbGluayB0aGUKLSAgICAgKiAgICAgICAgICAgIHBhcmFtZXRlciBjb250cm9sZWQgYnkgdGhlIFBGVyBhbmQgdGhlIHBvbGljeSBtYW5hZ2VyIGNvbXBvbmVudC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIHVzYWdlIGhhcyBiZWVuIGFkZGVkIHN1Y2Nlc3NmdWxseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCi0gICAgICoKLSAgICAgKi8KLSAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IGFkZFVzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb191c2FnZV90IGlkKSA9IDA7Ci0KLSAgICAvKioKICAgICAgKiBBZGQgYW4gaW5wdXQgc291cmNlIHRvIHRoZSBlbmdpbmUKICAgICAgKgogICAgICAqIEBwYXJhbVtpbl0gbmFtZSBvZiB0aGUgaW5wdXQgc291cmNlIHRvIGFkZApAQCAtODgsMjYgKzYzLDYgQEAKICAgICB2aXJ0dWFsIGFuZHJvaWQ6OnN0YXR1c190IGFkZElucHV0U291cmNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb19zb3VyY2VfdCBpZCkgPSAwOwogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBkZXZpY2UgdG8gYmUgdXNlZCBieSBhIHN0cmF0ZWd5LgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSBzdHJhdGVneTogbmFtZSBvZiB0aGUgc3RyYXRlZ3kgZm9yIHdoaWNoIHRoZSBkZXZpY2UgdG8gdXNlIGhhcyB0byBiZSBzZXQKLSAgICAgKiBAcGFyYW1baW5dIGRldmljZXM7IG1hc2sgb2YgZGV2aWNlcyB0byBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gc3RyYXRlZ3kuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRldmljZXMgd2VyZSBzZXQgY29ycmVjbHR5IGZvciB0aGlzIHN0cmF0ZWd5LCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgdmlydHVhbCBib29sIHNldERldmljZUZvclN0cmF0ZWd5KGNvbnN0IHJvdXRpbmdfc3RyYXRlZ3kgJnN0cmF0ZWd5LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykgPSAwOwotCi0gICAgLyoqCi0gICAgICogU2V0IHRoZSBzdHJhdGVneSB0byBiZSBmb2xsb3dlZCBieSBhIHN0cmVhbS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gc3RyZWFtOiBuYW1lIG9mIHRoZSBzdHJlYW0gZm9yIHdoaWNoIHRoZSBzdHJhdGVneSB0byB1c2UgaGFzIHRvIGJlIHNldAotICAgICAqIEBwYXJhbVtpbl0gc3RyYXRlZ3kgdG8gZm9sbG93IGZvciB0aGUgZ2l2ZW4gc3RyZWFtLgotICAgICAqCi0gICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBzdHJhdGVneSB3ZXJlIHNldCBjb3JyZWNsdHkgZm9yIHRoaXMgc3RyZWFtLCBmYWxzZSBvdGhlcndpc2UuCi0gICAgICovCi0gICAgdmlydHVhbCBib29sIHNldFN0cmF0ZWd5Rm9yU3RyZWFtKGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnN0cmVhbSwgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkgPSAwOwotCi0gICAgLyoqCiAgICAgICogU2V0IHRoZSBzdHJhdGVneSB0byBiZSBmb2xsb3dlZCBieSBhIHN0cmVhbS4KICAgICAgKgogICAgICAqIEBwYXJhbVtpbl0gc3RyZWFtOiBuYW1lIG9mIHRoZSBzdHJlYW0gZm9yIHdoaWNoIHRoZSBzdHJhdGVneSB0byB1c2UgaGFzIHRvIGJlIHNldApAQCAtMTE5LDE2ICs3NCw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmdm9sdW1lUHJvZmlsZSkgPSAwOwogCiAgICAgLyoqCi0gICAgICogU2V0IHRoZSBzdHJhdGVneSB0byBiZSBmb2xsb3dlZCBieSBhIHVzYWdlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSB1c2FnZTogbmFtZSBvZiB0aGUgdXNhZ2UgZm9yIHdoaWNoIHRoZSBzdHJhdGVneSB0byB1c2UgaGFzIHRvIGJlIHNldAotICAgICAqIEBwYXJhbVtpbl0gc3RyYXRlZ3kgdG8gZm9sbG93IGZvciB0aGUgZ2l2ZW4gdXNhZ2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHN0cmF0ZWd5IHdlcmUgc2V0IGNvcnJlY2x0eSBmb3IgdGhpcyB1c2FnZSwgZmFsc2Ugb3RoZXJ3aXNlLgotICAgICAqLwotICAgIHZpcnR1YWwgYm9vbCBzZXRTdHJhdGVneUZvclVzYWdlKGNvbnN0IGF1ZGlvX3VzYWdlX3QgJnVzYWdlLCByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KSA9IDA7Ci0KLSAgICAvKioKICAgICAgKiBTZXQgdGhlIGlucHV0IGRldmljZSB0byBiZSB1c2VkIGJ5IGFuIGlucHV0IHNvdXJjZS4KICAgICAgKgogICAgICAqIEBwYXJhbVtpbl0gaW5wdXRTb3VyY2U6IG5hbWUgb2YgdGhlIGlucHV0IHNvdXJjZSBmb3Igd2hpY2ggdGhlIGRldmljZSB0byB1c2UgaGFzIHRvIGJlIHNldApAQCAtMTM5LDYgKzg0LDIyIEBACiAgICAgdmlydHVhbCBib29sIHNldERldmljZUZvcklucHV0U291cmNlKGNvbnN0IGF1ZGlvX3NvdXJjZV90ICZpbnB1dFNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkgPSAwOwogCisgICAgdmlydHVhbCB2b2lkIHNldERldmljZUFkZHJlc3NGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKSA9IDA7CisKKyAgICAvKioKKyAgICAgKiBTZXQgdGhlIGRldmljZSB0byBiZSB1c2VkIGJ5IGEgcHJvZHVjdCBzdHJhdGVneS4KKyAgICAgKgorICAgICAqIEBwYXJhbVtpbl0gc3RyYXRlZ3k6IG5hbWUgb2YgdGhlIHByb2R1Y3Qgc3RyYXRlZ3kgZm9yIHdoaWNoIHRoZSBkZXZpY2UgdG8gdXNlIGhhcyB0byBiZSBzZXQKKyAgICAgKiBAcGFyYW1baW5dIGRldmljZXM7IG1hc2sgb2YgZGV2aWNlcyB0byBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gc3RyYXRlZ3kuCisgICAgICoKKyAgICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGRldmljZXMgd2VyZSBzZXQgY29ycmVjbHR5IGZvciB0aGlzIHN0cmF0ZWd5LCBmYWxzZSBvdGhlcndpc2UuCisgICAgICovCisgICAgdmlydHVhbCBib29sIHNldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMpID0gMDsKKworICAgIHZpcnR1YWwgcHJvZHVjdF9zdHJhdGVneV90IGdldFByb2R1Y3RTdHJhdGVneUJ5TmFtZShjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcykgPSAwOworCiBwcm90ZWN0ZWQ6CiAgICAgdmlydHVhbCB+QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSB7fQogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwZWJmZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBSb290IHNvb25nX25hbWVzcGFjZSBmb3IgY29tbW9uIGNvbXBvbmVudHMKKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiUG9saWN5Q2xhc3MueG1sIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjOiAiOlBvbGljeUNsYXNzIiwKKyAgICBzdWJfZGlyOiAicGFyYW1ldGVyLWZyYW1ld29yay9TdHJ1Y3R1cmUvUG9saWN5IiwKK30KK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogIlBvbGljeVN1YnN5c3RlbS54bWwiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmM6ICI6UG9saWN5U3Vic3lzdGVtIiwKKyAgICBzdWJfZGlyOiAicGFyYW1ldGVyLWZyYW1ld29yay9TdHJ1Y3R1cmUvUG9saWN5IiwKK30KK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogIlBvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmM6ICI6YnVpbGRjb21tb250eXBlc3N0cnVjdHVyZV9nZW4iLAorICAgIHN1Yl9kaXI6ICJwYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kiLAorfQorZ2VucnVsZSB7CisgICAgbmFtZTogImJ1aWxkY29tbW9udHlwZXNzdHJ1Y3R1cmVfZ2VuIiwKKyAgICBkZWZhdWx0czogWyJidWlsZGNvbW1vbnR5cGVzc3RydWN0dXJlcnVsZSJdLAorfQorCitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJwcm9kdWN0X3N0cmF0ZWdpZXNfc3RydWN0dXJlX3RlbXBsYXRlIiwKKyAgICBzcmNzOiBbImV4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUHJvZHVjdFN0cmF0ZWdpZXMueG1sLmluIl0sCit9CitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJQb2xpY3lTdWJzeXN0ZW0iLAorICAgIHNyY3M6IFsiZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0ueG1sIl0sCit9CitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJQb2xpY3lTdWJzeXN0ZW0tbm8tc3RyYXRlZ3kiLAorICAgIHNyY3M6IFsiZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0tbm8tc3RyYXRlZ3kueG1sIl0sCit9CitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJjb21tb25fdHlwZXNfc3RydWN0dXJlX3RlbXBsYXRlIiwKKyAgICBzcmNzOiBbImV4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbC5pbiJdLAorfQorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiUG9saWN5Q2xhc3MiLAorICAgIHNyY3M6IFsiZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lDbGFzcy54bWwiXSwKK30KK2ZpbGVncm91cCB7CisgICAgbmFtZTogInZvbHVtZXMucGZ3IiwKKyAgICBzcmNzOiBbImV4YW1wbGVzL1NldHRpbmdzL3ZvbHVtZXMucGZ3Il0sCit9CitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJkZXZpY2VfZm9yX2lucHV0X3NvdXJjZS5wZnciLAorICAgIHNyY3M6IFsiZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9pbnB1dF9zb3VyY2UucGZ3Il0sCit9CitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnVzZXJkZWJ1Zy54bWwiLAorICAgIHNyY3M6IFsiZXhhbXBsZXMvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS51c2VyZGVidWcueG1sIl0sCit9CitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnVzZXIueG1sIiwKKyAgICBzcmNzOiBbImV4YW1wbGVzL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kudXNlci54bWwiXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDAyZmQ1Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw3ICswLDAgQEAKLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgUmVjdXJzaXZlIGNhbGwgc3ViLWZvbGRlciBBbmRyb2lkLm1rCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi1pbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCQoTE9DQUxfUEFUSCkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQW5kcm9pZC5tawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmFhZWZkMi4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsMTYyICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBATk9URToKLSMgQXVkaW8gUG9saWN5IEVuZ2luZSBjb25maWd1cmFibGUgZXhhbXBsZSBmb3IgZ2VuZXJpYyBkZXZpY2UgYnVpbGQKLSMKLSMgQW55IHZlbmRvciBzaGFsbCBoYXZlIGl0cyBvd24gY29uZmlndXJhdGlvbiB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgZGV2aWNlIGZvbGRlcgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWlmZXEgKDEsIDApCi0KLUxPQ0FMX1BBVEggOj0gJChjYWxsIG15LWRpcikKLQotUEZXX0NPUkUgOj0gZXh0ZXJuYWwvcGFyYW1ldGVyLWZyYW1ld29yawotQlVJTERfUEZXX1NFVFRJTkdTIDo9ICQoUEZXX0NPUkUpL3N1cHBvcnQvYW5kcm9pZC9idWlsZF9wZndfc2V0dGluZ3MubWsKLVBGV19ERUZBVUxUX1NDSEVNQVNfRElSIDo9ICQoUEZXX0NPUkUpL3Vwc3RyZWFtL3NjaGVtYXMKLVBGV19TQ0hFTUFTX0RJUiA6PSAkKFBGV19ERUZBVUxUX1NDSEVNQVNfRElSKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ09ORklHVVJBVElPTiBGSUxFUwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIyMjIyMjIyMgUG9saWN5IFBGVyB0b3AgbGV2ZWwgZmlsZSAjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrCi1MT0NBTF9TUkNfRklMRVMgOj0gJChMT0NBTF9NT0RVTEUpLmluCi0KLUFVRElPX1BBVFRFUk4gPSBAVFVOSU5HX0FMTE9XRURACi1pZmVxICgkKFRBUkdFVF9CVUlMRF9WQVJJQU5UKSx1c2VyKQotQVVESU9fVkFMVUUgPSBmYWxzZQotZWxzZQotQVVESU9fVkFMVUUgPSB0cnVlCi1lbmRpZgotCi1MT0NBTF9QT1NUX0lOU1RBTExfQ01EIDo9ICQoaGlkZSkgc2VkIC1pIC1lICdzfCQoQVVESU9fUEFUVEVSTil8JChBVURJT19WQUxVRSl8ZycgJChMT0NBTF9NT0RVTEVfUEFUSCkvJChMT0NBTF9NT0RVTEUpCi0KLWluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKLQotCi0jIyMjIyMjIyMjIFBvbGljeSBQRlcgU3RydWN0dXJlcyAjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gUG9saWN5Q2xhc3MueG1sCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfTU9EVUxFX1BBVEggOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9TdHJ1Y3R1cmUvUG9saWN5Ci1MT0NBTF9TUkNfRklMRVMgOj0gU3RydWN0dXJlLyQoTE9DQUxfTU9EVUxFKQotaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQotCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBQb2xpY3lTdWJzeXN0ZW0ueG1sCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBcCi0gICAgUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbCBcCi0gICAgUG9saWN5U3Vic3lzdGVtLVZvbHVtZS54bWwgXAotICAgIGxpYnBvbGljeS1zdWJzeXN0ZW0gXAotCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKLUxPQ0FMX1NSQ19GSUxFUyA6PSBTdHJ1Y3R1cmUvJChMT0NBTF9NT0RVTEUpCi1pbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotTE9DQUxfTU9EVUxFIDo9IFBvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwKLUxPQ0FMX01PRFVMRV9UQUdTIDo9IG9wdGlvbmFsCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVRfRVRDKS9wYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kKLUxPQ0FMX1NSQ19GSUxFUyA6PSBTdHJ1Y3R1cmUvJChMT0NBTF9NT0RVTEUpCi1pbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCi0KLSMjIyMjIyMjIyBQb2xpY3kgUEZXIFNldHRpbmdzICMjIyMjIyMjIwotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi1MT0NBTF9NT0RVTEUgOj0gcGFyYW1ldGVyLWZyYW1ld29yay5wb2xpY3kKLUxPQ0FMX01PRFVMRV9TVEVNIDo9IFBvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrL1NldHRpbmdzL1BvbGljeQotTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gXAotICAgICAgICBQb2xpY3lDbGFzcy54bWwgXAotICAgICAgICBQb2xpY3lTdWJzeXN0ZW0ueG1sIFwKLSAgICAgICAgUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKLQotaWZlcSAoJChwZndfcmVidWlsZF9zZXR0aW5ncyksdHJ1ZSkKLVBGV19UT1BMRVZFTF9GSUxFIDo9ICQoVEFSR0VUX09VVF9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKLVBGV19DUklURVJJQV9GSUxFIDo9ICQoTE9DQUxfUEFUSCkvcG9saWN5X2NyaXRlcmlhLnR4dAotUEZXX0VERF9GSUxFUyA6PSBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9tZWRpYS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcGhvbmUucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbi5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2R0bWYucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3N0cmVhbS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl91c2FnZS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3JfaW5wdXRfc291cmNlLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3Mvdm9sdW1lcy5wZncKLQotaW5jbHVkZSAkKEJVSUxEX1BGV19TRVRUSU5HUykKLWVsc2UKLSMgVXNlIHRoZSBleGlzdGluZyBmaWxlCi1MT0NBTF9TUkNfRklMRVMgOj0gU2V0dGluZ3MvJChMT0NBTF9NT0RVTEVfU1RFTSkKLWluY2x1ZGUgJChCVUlMRF9QUkVCVUlMVCkKLWVuZGlmICMgcGZ3X3JlYnVpbGRfc2V0dGluZ3MKLQotIyMjIyMjIyMjIFBvbGljeSBQRlcgU2V0dGluZ3MgLSBObyBPdXRwdXQgIyMjIyMjIyMjCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrLnBvbGljeS5uby1vdXRwdXQKLUxPQ0FMX01PRFVMRV9TVEVNIDo9IFBvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMtTm9PdXRwdXREZXZpY2UueG1sCi1MT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCi1MT0NBTF9NT0RVTEVfUkVMQVRJVkVfUEFUSCA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrL1NldHRpbmdzL1BvbGljeQotTE9DQUxfQURESVRJT05BTF9ERVBFTkRFTkNJRVMgOj0gXAotICAgICAgICBQb2xpY3lDbGFzcy54bWwgXAotICAgICAgICBQb2xpY3lTdWJzeXN0ZW0ueG1sIFwKLSAgICAgICAgUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKLQotUEZXX1RPUExFVkVMX0ZJTEUgOj0gJChUQVJHRVRfT1VUX0VUQykvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbAotUEZXX0NSSVRFUklBX0ZJTEUgOj0gJChMT0NBTF9QQVRIKS9wb2xpY3lfY3JpdGVyaWEudHh0Ci1QRldfRUREX0ZJTEVTIDo9IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5nc05vT3V0cHV0L2RldmljZV9mb3Jfc3RyYXRlZ2llcy5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl9zdHJlYW0ucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9zdHJhdGVneV9mb3JfdXNhZ2UucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX2lucHV0X3NvdXJjZS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL3ZvbHVtZXMucGZ3Ci0KLWluY2x1ZGUgJChCVUlMRF9QRldfU0VUVElOR1MpCi0KLSMjIyMjIyMjIyBQb2xpY3kgUEZXIFNldHRpbmdzIC0gTm8gSW5wdXQgIyMjIyMjIyMjCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBwYXJhbWV0ZXItZnJhbWV3b3JrLnBvbGljeS5uby1pbnB1dAotTE9DQUxfTU9EVUxFX1NURU0gOj0gUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy1Ob0lucHV0RGV2aWNlLnhtbAotTE9DQUxfTU9EVUxFX0NMQVNTIDo9IEVUQwotTE9DQUxfTU9EVUxFX1JFTEFUSVZFX1BBVEggOj0gcGFyYW1ldGVyLWZyYW1ld29yay9TZXR0aW5ncy9Qb2xpY3kKLUxPQ0FMX0FERElUSU9OQUxfREVQRU5ERU5DSUVTIDo9IFwKLSAgICAgICAgUG9saWN5Q2xhc3MueG1sIFwKLSAgICAgICAgUG9saWN5U3Vic3lzdGVtLnhtbCBcCi0gICAgICAgIFBhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sCi0KLVBGV19UT1BMRVZFTF9GSUxFIDo9ICQoVEFSR0VUX09VVF9FVEMpL3BhcmFtZXRlci1mcmFtZXdvcmsvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS54bWwKLVBGV19DUklURVJJQV9GSUxFIDo9ICQoTE9DQUxfUEFUSCkvcG9saWN5X2NyaXRlcmlhLnR4dAotUEZXX0VERF9GSUxFUyA6PSBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9tZWRpYS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcGhvbmUucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbi5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2R0bWYucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3IFwKLSAgICAgICAgJChMT0NBTF9QQVRIKS9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdyBcCi0gICAgICAgICQoTE9DQUxfUEFUSCkvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3N0cmVhbS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl91c2FnZS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzTm9JbnB1dC9kZXZpY2VfZm9yX2lucHV0X3NvdXJjZS5wZncgXAotICAgICAgICAkKExPQ0FMX1BBVEgpL1NldHRpbmdzL3ZvbHVtZXMucGZ3Ci0KLWluY2x1ZGUgJChCVUlMRF9QRldfU0VUVElOR1MpCi0KLWVuZGlmICMgaWZlcSAoMSwgMCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0Nhci9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiMWI2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0Nhci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsOTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBJbXBvcnQgdGhpcyBuYW1lc3BhY2UgaW4gb3JkZXIgdG8gdXNlIEFPU1AgQXV0b21vdGl2ZSBjb25maWd1cmF0aW9uIGV4YW1wbGUKKworc29vbmdfbmFtZXNwYWNlIHsKKyAgICBpbXBvcnRzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9hdXRvbW90aXZlIiwKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29uZmlnIiwKKyAgICBdLAorfQorCisvLworLy8gR2VuZXJhdGUgQXVkaW8gUG9saWN5IFBhcmFtZXRlciBGcmFtZXdvcmsgUHJvZHVjdCBTdHJhdGVnaWVzIFN0cnVjdHVyZSBmaWxlIGZyb20gdGVtcGxhdGUKKy8vCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJQcm9kdWN0U3RyYXRlZ2llcy54bWwiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmM6ICI6YnVpbGRzdHJhdGVnaWVzc3RydWN0dXJlX2dlbiIsCisgICAgc3ViX2RpcjogInBhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeSIsCisgICAgcmVxdWlyZWQ6IFsibGlicG9saWN5LXN1YnN5c3RlbSJdLAorfQorZ2VucnVsZSB7CisgICAgbmFtZTogImJ1aWxkc3RyYXRlZ2llc3N0cnVjdHVyZV9nZW4iLAorICAgIGRlZmF1bHRzOiBbImJ1aWxkc3RyYXRlZ2llc3N0cnVjdHVyZXJ1bGUiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICI6YXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uX2ZpbGVzIiwKKyAgICBdLAorfQorCisvLworLy8gR2VuZXJhdGUgQXVkaW8gUG9saWN5IFBhcmFtZXRlciBGcmFtZXdvcmsgQ29uZmlndXJhYmxlIERvbWFpbnMKKy8vCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJwYXJhbWV0ZXItZnJhbWV3b3JrLnBvbGljeSIsCisgICAgZmlsZW5hbWVfZnJvbV9zcmM6IHRydWUsCisgICAgdmVuZG9yOiB0cnVlLAorICAgIHNyYzogIjpkb21haW5nZW5lcmF0b3Jwb2xpY3lydWxlX2dlbiIsCisgICAgc3ViX2RpcjogInBhcmFtZXRlci1mcmFtZXdvcmsvU2V0dGluZ3MvUG9saWN5IiwKKyAgICByZXF1aXJlZDogWworICAgICAgICAiUHJvZHVjdFN0cmF0ZWdpZXMueG1sIiwKKyAgICAgICAgIlBvbGljeUNsYXNzLnhtbCIsCisgICAgICAgICJQb2xpY3lTdWJzeXN0ZW0ueG1sIiwKKyAgICAgICAgIlBvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwiLAorICAgIF0sCit9CitnZW5ydWxlIHsKKyAgICBuYW1lOiAiZG9tYWluZ2VuZXJhdG9ycG9saWN5cnVsZV9nZW4iLAorICAgIGRlZmF1bHRzOiBbImRvbWFpbmdlbmVyYXRvcnBvbGljeXJ1bGUiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICI6YXVkaW9fcG9saWN5X3Bmd190b3BsZXZlbCIsCisgICAgICAgICI6YXVkaW9fcG9saWN5X3Bmd19zdHJ1Y3R1cmVfZmlsZXMiLAorICAgICAgICAiOmF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzIiwKKyAgICAgICAgIjplZGRfZmlsZXMiLAorICAgIF0sCit9CitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJlZGRfZmlsZXMiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIjpkZXZpY2VfZm9yX2lucHV0X3NvdXJjZS5wZnciLAorICAgICAgICAiOnZvbHVtZXMucGZ3IiwKKyAgICAgICAgIlNldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVnaWVzLnBmdyIsCisgICAgXSwKK30KKy8vIFRoaXMgaXMgZm9yIFNldHRpbmdzIGdlbmVyYXRpb24sIG11c3QgdXNlIHNvY2tldCBwb3J0LCBzbyB1c2VyZGVidWcgdmVyc2lvbiBpcyByZXF1aXJlZAorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiYXVkaW9fcG9saWN5X3Bmd190b3BsZXZlbCIsCisgICAgc3JjczogWyI6UGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS51c2VyZGVidWcueG1sIl0sCit9CitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJhdWRpb19wb2xpY3lfcGZ3X3N0cnVjdHVyZV9maWxlcyIsCisgICAgc3JjczogWworICAgICAgICAiOlBvbGljeUNsYXNzIiwKKyAgICAgICAgIjpQb2xpY3lTdWJzeXN0ZW0iLAorICAgICAgICAiOmJ1aWxkY29tbW9udHlwZXNzdHJ1Y3R1cmVfZ2VuIiwKKyAgICAgICAgIjpidWlsZHN0cmF0ZWdpZXNzdHJ1Y3R1cmVfZ2VuIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVnaWVzLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0Nhci9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ2llcy5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRhZTM1NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0Nhci9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ2llcy5wZncKQEAgLTAsMCArMSw3NjAgQEAKK3N1cERvbWFpbjogRGV2aWNlRm9yUHJvZHVjdFN0cmF0ZWdpZXMKKwlzdXBEb21haW46IE9lbVRyYWZmaWNBbm91bmNlbWVudAorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fdHJhZmZpY19hbm91bmNlbWVudC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQvZGV2aWNlX2FkZHJlc3MgPSBCVVMwOF9PRU0xCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzA4X09FTTEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV90cmFmZmljX2Fub3VuY2VtZW50L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKwlzdXBEb21haW46IE9lbVN0cmF0ZWd5MQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzEvZGV2aWNlX2FkZHJlc3MgPSBCVVMwOF9PRU0xCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzA4X09FTTEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8xL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCisJc3VwRG9tYWluOiBPZW1TdHJhdGVneTIKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8yL2RldmljZV9hZGRyZXNzID0gQlVTMDhfT0VNMQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwOF9PRU0xCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8yL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKworCXN1cERvbWFpbjogUmFkaW8KKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmFkaW8vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3JhZGlvL2RldmljZV9hZGRyZXNzID0gQlVTMDlfT0VNMgorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwOV9PRU0yCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yYWRpby9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3JhZGlvL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJYnVzID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmFkaW8vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKwlzdXBEb21haW46IEV4dEF1ZGlvU291cmNlCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2V4dF9hdWRpb19zb3VyY2Uvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2V4dF9hdWRpb19zb3VyY2UvZGV2aWNlX2FkZHJlc3MgPSBCVVMwOV9PRU0yCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzA5X09FTTIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2V4dF9hdWRpb19zb3VyY2Uvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKworCXN1cERvbWFpbjogVm9pY2VDb21tYW5kCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvZGV2aWNlX2FkZHJlc3MgPSBCVVMwMl9WT0lDRV9DT01NQU5ECisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAyX1ZPSUNFX0NPTU1BTkQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jb21tYW5kL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJYnVzID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY29tbWFuZC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDAKKworCisJc3VwRG9tYWluOiBTYWZldHlBbGVydAorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zYWZldHlfYWxlcnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NhZmV0eV9hbGVydC9kZXZpY2VfYWRkcmVzcyA9IEJVUzAwX01FRElBCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAwX01FRElBCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zYWZldHlfYWxlcnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zYWZldHlfYWxlcnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQlidXMgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zYWZldHlfYWxlcnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogTXVzaWMKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbXVzaWMvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL211c2ljL2RldmljZV9hZGRyZXNzID0gQlVTMDBfTUVESUEKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDBfTUVESUEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL211c2ljL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbXVzaWMvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQlidXMgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tdXNpYy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDAKKworCisKKwlzdXBEb21haW46IE5hdkd1aWRhbmNlCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25hdl9ndWlkYW5jZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbmF2X2d1aWRhbmNlL2RldmljZV9hZGRyZXNzID0gQlVTMDFfTkFWX0dVSURBTkNFCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAxX05BVl9HVUlEQU5DRQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbmF2X2d1aWRhbmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbmF2X2d1aWRhbmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJYnVzID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbmF2X2d1aWRhbmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IFZvaWNlQ2FsbAorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jYWxsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jYWxsL2RldmljZV9hZGRyZXNzID0gQlVTMDRfQ0FMTAorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwNF9DQUxMCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy92b2ljZV9jYWxsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY2FsbC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWJ1cyA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NhbGwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogQWxhcm0KKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWxhcm0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FsYXJtL2RldmljZV9hZGRyZXNzID0gQlVTMDVfQUxBUk0KKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDVfQUxBUk0KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FsYXJtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWxhcm0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMQorCQkJCQlidXMgPSAwCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hbGFybS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDAKKworCisJc3VwRG9tYWluOiBSaW5nCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Jpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3JpbmcvZGV2aWNlX2FkZHJlc3MgPSBCVVMwM19DQUxMX1JJTkcKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDNfQ0FMTF9SSU5HCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWJ1cyA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Jpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogTm90aWZpY2F0aW9uCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25vdGlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbm90aWZpY2F0aW9uL2RldmljZV9hZGRyZXNzID0gQlVTMDZfTk9USUZJQ0FUSU9OCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzA2X05PVElGSUNBVElPTgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbm90aWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbm90aWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJYnVzID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbm90aWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IFN5c3RlbQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zeXN0ZW0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3N5c3RlbS9kZXZpY2VfYWRkcmVzcyA9IEJVUzA3X1NZU1RFTV9TT1VORAorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwN19TWVNURU1fU09VTkQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3N5c3RlbS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3N5c3RlbS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWJ1cyA9IDAKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3N5c3RlbS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWJ1cyA9IDAKKworCXN1cERvbWFpbjogVHRzCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3R0cy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdHRzL2RldmljZV9hZGRyZXNzID0gQlVTMDBfTUVESUEKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDBfTUVESUEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3R0cy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3R0cy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0NhckVtdS9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvQ2FyRW11L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQ2MDViMgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0NhckVtdS9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsOTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBJbXBvcnQgdGhpcyBuYW1lc3BhY2UgaW4gb3JkZXIgdG8gdXNlIEFPU1AgQ2FyIEVtdWxhdG9yIGNvbmZpZ3VyYXRpb24gZXhhbXBsZQorCitzb29uZ19uYW1lc3BhY2UgeworICAgIGltcG9ydHM6IFsKKyAgICAgICAgImZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2NvbmZpZy9leGFtcGxlL2NhcmVtdSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0NhciIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZyIsCisgICAgXSwKK30KKworLy8KKy8vIEdlbmVyYXRlIEF1ZGlvIFBvbGljeSBQYXJhbWV0ZXIgRnJhbWV3b3JrIFByb2R1Y3QgU3RyYXRlZ2llcyBTdHJ1Y3R1cmUgZmlsZSBmcm9tIHRlbXBsYXRlCisvLworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiUHJvZHVjdFN0cmF0ZWdpZXMueG1sIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjOiAiOmJ1aWxkc3RyYXRlZ2llc3N0cnVjdHVyZV9nZW4iLAorICAgIHN1Yl9kaXI6ICJwYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kiLAorICAgIHJlcXVpcmVkOiBbImxpYnBvbGljeS1zdWJzeXN0ZW0iXSwKK30KK2dlbnJ1bGUgeworICAgIG5hbWU6ICJidWlsZHN0cmF0ZWdpZXNzdHJ1Y3R1cmVfZ2VuIiwKKyAgICBkZWZhdWx0czogWyJidWlsZHN0cmF0ZWdpZXNzdHJ1Y3R1cmVydWxlIl0sCisgICAgc3JjczogWworICAgICAgICAiOmF1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbl9maWxlcyIsCisgICAgXSwKK30KKworLy8KKy8vIEdlbmVyYXRlIEF1ZGlvIFBvbGljeSBQYXJhbWV0ZXIgRnJhbWV3b3JrIENvbmZpZ3VyYWJsZSBEb21haW5zCisvLworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAicGFyYW1ldGVyLWZyYW1ld29yay5wb2xpY3kiLAorICAgIGZpbGVuYW1lX2Zyb21fc3JjOiB0cnVlLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmM6ICI6ZG9tYWluZ2VuZXJhdG9ycG9saWN5cnVsZV9nZW4iLAorICAgIHN1Yl9kaXI6ICJwYXJhbWV0ZXItZnJhbWV3b3JrL1NldHRpbmdzL1BvbGljeSIsCisgICAgcmVxdWlyZWQ6IFsKKyAgICAgICAgIlByb2R1Y3RTdHJhdGVnaWVzLnhtbCIsCisgICAgICAgICJQb2xpY3lDbGFzcy54bWwiLAorICAgICAgICAiUG9saWN5U3Vic3lzdGVtLnhtbCIsCisgICAgICAgICJQb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sIiwKKyAgICBdLAorfQorZ2VucnVsZSB7CisgICAgbmFtZTogImRvbWFpbmdlbmVyYXRvcnBvbGljeXJ1bGVfZ2VuIiwKKyAgICBkZWZhdWx0czogWyJkb21haW5nZW5lcmF0b3Jwb2xpY3lydWxlIl0sCisgICAgc3JjczogWworICAgICAgICAiOmF1ZGlvX3BvbGljeV9wZndfdG9wbGV2ZWwiLAorICAgICAgICAiOmF1ZGlvX3BvbGljeV9wZndfc3RydWN0dXJlX2ZpbGVzIiwKKyAgICAgICAgIjphdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcyIsCisgICAgICAgICI6ZWRkX2ZpbGVzIiwKKyAgICBdLAorfQorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiZWRkX2ZpbGVzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICI6ZGV2aWNlX2Zvcl9pbnB1dF9zb3VyY2UucGZ3IiwKKyAgICAgICAgIjp2b2x1bWVzLnBmdyIsCisgICAgICAgICJTZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ2llcy5wZnciLAorICAgIF0sCit9CisvLyBUaGlzIGlzIGZvciBTZXR0aW5ncyBnZW5lcmF0aW9uLCBtdXN0IHVzZSBzb2NrZXQgcG9ydCwgc28gdXNlcmRlYnVnIHZlcnNpb24gaXMgcmVxdWlyZWQKK2ZpbGVncm91cCB7CisgICAgbmFtZTogImF1ZGlvX3BvbGljeV9wZndfdG9wbGV2ZWwiLAorICAgIHNyY3M6IFsiOlBhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kudXNlcmRlYnVnLnhtbCJdLAorfQorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiYXVkaW9fcG9saWN5X3Bmd19zdHJ1Y3R1cmVfZmlsZXMiLAorICAgIHNyY3M6IFsKKyAgICAgICAgIjpQb2xpY3lDbGFzcyIsCisgICAgICAgICI6UG9saWN5U3Vic3lzdGVtIiwKKyAgICAgICAgIjpidWlsZGNvbW1vbnR5cGVzc3RydWN0dXJlX2dlbiIsCisgICAgICAgICI6YnVpbGRzdHJhdGVnaWVzc3RydWN0dXJlX2dlbiIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL0NhckVtdS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ2llcy5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXJFbXUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWdpZXMucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjNzc4ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9DYXJFbXUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWdpZXMucGZ3CkBAIC0wLDAgKzEsNjkwIEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVnaWVzCisJc3VwRG9tYWluOiBPZW1UcmFmZmljQW5vdW5jZW1lbnQKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV90cmFmZmljX2Fub3VuY2VtZW50L2RldmljZV9hZGRyZXNzID0gQlVTMDBfTUVESUEKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDBfTUVESUEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV90cmFmZmljX2Fub3VuY2VtZW50L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3RyYWZmaWNfYW5vdW5jZW1lbnQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKwlzdXBEb21haW46IE9lbVN0cmF0ZWd5MQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzEvZGV2aWNlX2FkZHJlc3MgPSBCVVMwMl9PRU0xCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAyX09FTTEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8xL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCisJc3VwRG9tYWluOiBPZW1TdHJhdGVneTIKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL29lbV9zdHJhdGVneV8yL2RldmljZV9hZGRyZXNzID0gQlVTMDFfTkFWX0dVSURBTkNFCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAxX05BVl9HVUlEQU5DRQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvb2VtX3N0cmF0ZWd5XzIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9vZW1fc3RyYXRlZ3lfMi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDAKKworCisKKwlzdXBEb21haW46IFJhZGlvCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3JhZGlvL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yYWRpby9kZXZpY2VfYWRkcmVzcyA9IEJVUzAwX01FRElBCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAwX01FRElBCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yYWRpby9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3JhZGlvL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisJc3VwRG9tYWluOiBFeHRBdWRpb1NvdXJjZQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL2RldmljZV9hZGRyZXNzID0gQlVTMDBfTUVESUEKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDBfTUVESUEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2V4dF9hdWRpb19zb3VyY2Uvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9leHRfYXVkaW9fc291cmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKworCXN1cERvbWFpbjogVm9pY2VDb21tYW5kCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvZGV2aWNlX2FkZHJlc3MgPSBCVVMwNF9WT0lDRQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwNF9WT0lDRQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY29tbWFuZC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NvbW1hbmQvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogU2FmZXR5QWxlcnQKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zYWZldHlfYWxlcnQvZGV2aWNlX2FkZHJlc3MgPSBCVVMwMF9NRURJQQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwMF9NRURJQQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc2FmZXR5X2FsZXJ0L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IE11c2ljCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL211c2ljL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tdXNpYy9kZXZpY2VfYWRkcmVzcyA9IEJVUzAwX01FRElBCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAwX01FRElBCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tdXNpYy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL211c2ljL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKworCXN1cERvbWFpbjogTmF2R3VpZGFuY2UKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbmF2X2d1aWRhbmNlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9uYXZfZ3VpZGFuY2UvZGV2aWNlX2FkZHJlc3MgPSBCVVMwMV9OQVZfR1VJREFOQ0UKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDFfTkFWX0dVSURBTkNFCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9uYXZfZ3VpZGFuY2Uvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9uYXZfZ3VpZGFuY2Uvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogVm9pY2VDYWxsCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NhbGwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NhbGwvZGV2aWNlX2FkZHJlc3MgPSBCVVMwNF9WT0lDRQorCisJCWRvbWFpbjogU2VsZWN0ZWREZXZpY2UKKwkJCWNvbmY6IEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyBCVVMwNF9WT0lDRQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdm9pY2VfY2FsbC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3ZvaWNlX2NhbGwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogQWxhcm0KKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWxhcm0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FsYXJtL2RldmljZV9hZGRyZXNzID0gQlVTMDBfTUVESUEKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDBfTUVESUEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FsYXJtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWxhcm0vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogUmluZworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL2RldmljZV9hZGRyZXNzID0gQlVTMDRfVk9JQ0UKKworCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDRfVk9JQ0UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Jpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yaW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisKKwlzdXBEb21haW46IE5vdGlmaWNhdGlvbgorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9ub3RpZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL25vdGlmaWNhdGlvbi9kZXZpY2VfYWRkcmVzcyA9IEJVUzAwX01FRElBCisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAwX01FRElBCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9ub3RpZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9ub3RpZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlidXMgPSAwCisKKworCXN1cERvbWFpbjogU3lzdGVtCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3N5c3RlbS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlmbSA9IDAKKwkJCQkJYXV4X2xpbmUgPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCXByb3h5ID0gMAorCQkJCQl1c2JfaGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc3lzdGVtL2RldmljZV9hZGRyZXNzID0gQlVTMDNfU1lTVEVNX1NPVU5ECisKKwkJZG9tYWluOiBTZWxlY3RlZERldmljZQorCQkJY29uZjogQnVzCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIEJVUzAzX1NZU1RFTV9TT1VORAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc3lzdGVtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc3lzdGVtL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJYnVzID0gMAorCisJc3VwRG9tYWluOiBUdHMKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdHRzL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy90dHMvZGV2aWNlX2FkZHJlc3MgPSBCVVMwMF9NRURJQQorIAorCQlkb21haW46IFNlbGVjdGVkRGV2aWNlCisJCQljb25mOiBCdXMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJ1cworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXNBZGRyZXNzZXMgSW5jbHVkZXMgQlVTMDBfTUVESUEKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3R0cy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDEKKworCQkJY29uZjogRGVmYXVsdAorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3R0cy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWJ1cyA9IDAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kudXNlci54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnVzZXIueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1OTYwY2IKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnVzZXIueG1sCkBAIC0wLDAgKzEsMTQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8UGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvbiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIFN5c3RlbUNsYXNzTmFtZT0iUG9saWN5IiBUdW5pbmdBbGxvd2VkPSJmYWxzZSI+CisKKyAgICA8U3Vic3lzdGVtUGx1Z2lucz4KKyAgICAgICAgPExvY2F0aW9uIEZvbGRlcj0iIj4KKyAgICAgICAgICAgIDxQbHVnaW4gTmFtZT0ibGlicG9saWN5LXN1YnN5c3RlbS5zbyIvPgorICAgICAgICA8L0xvY2F0aW9uPgorICAgIDwvU3Vic3lzdGVtUGx1Z2lucz4KKyAgICA8U3RydWN0dXJlRGVzY3JpcHRpb25GaWxlTG9jYXRpb24gUGF0aD0iU3RydWN0dXJlL1BvbGljeS9Qb2xpY3lDbGFzcy54bWwiLz4KKyAgICA8U2V0dGluZ3NDb25maWd1cmF0aW9uPgorICAgICAgICA8Q29uZmlndXJhYmxlRG9tYWluc0ZpbGVMb2NhdGlvbiBQYXRoPSJTZXR0aW5ncy9Qb2xpY3kvUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy54bWwiLz4KKyAgICA8L1NldHRpbmdzQ29uZmlndXJhdGlvbj4KKzwvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kudXNlcmRlYnVnLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kudXNlcmRlYnVnLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjdkN2Q4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvblBvbGljeS51c2VyZGVidWcueG1sCkBAIC0wLDAgKzEsMTUgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8UGFyYW1ldGVyRnJhbWV3b3JrQ29uZmlndXJhdGlvbiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgIFN5c3RlbUNsYXNzTmFtZT0iUG9saWN5IiBTZXJ2ZXJQb3J0PSJ1bml4Oi8vL2Rldi9zb2NrZXQvYXVkaW9zZXJ2ZXIvcG9saWN5X2RlYnVnIgorICAgIFR1bmluZ0FsbG93ZWQ9InRydWUiPgorCisgICAgPFN1YnN5c3RlbVBsdWdpbnM+CisgICAgICAgIDxMb2NhdGlvbiBGb2xkZXI9IiI+CisgICAgICAgICAgICA8UGx1Z2luIE5hbWU9ImxpYnBvbGljeS1zdWJzeXN0ZW0uc28iLz4KKyAgICAgICAgPC9Mb2NhdGlvbj4KKyAgICA8L1N1YnN5c3RlbVBsdWdpbnM+CisgICAgPFN0cnVjdHVyZURlc2NyaXB0aW9uRmlsZUxvY2F0aW9uIFBhdGg9IlN0cnVjdHVyZS9Qb2xpY3kvUG9saWN5Q2xhc3MueG1sIi8+CisgICAgPFNldHRpbmdzQ29uZmlndXJhdGlvbj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZURvbWFpbnNGaWxlTG9jYXRpb24gUGF0aD0iU2V0dGluZ3MvUG9saWN5L1BvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sIi8+CisgICAgPC9TZXR0aW5nc0NvbmZpZ3VyYXRpb24+Cis8L1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbC5pbiBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sLmluCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNTYxNWNkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sLmluCisrKyAvZGV2L251bGwKQEAgLTEsMTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgU3lzdGVtQ2xhc3NOYW1lPSJQb2xpY3kiIFNlcnZlclBvcnQ9IjUwMTkiIFR1bmluZ0FsbG93ZWQ9IkBUVU5JTkdfQUxMT1dFREAiPgotCi0gICAgPFN1YnN5c3RlbVBsdWdpbnM+Ci0gICAgICAgIDxMb2NhdGlvbiBGb2xkZXI9IiI+Ci0gICAgICAgICAgICA8UGx1Z2luIE5hbWU9ImxpYnBvbGljeS1zdWJzeXN0ZW0uc28iLz4KLSAgICAgICAgPC9Mb2NhdGlvbj4KLSAgICA8L1N1YnN5c3RlbVBsdWdpbnM+Ci0gICAgPFN0cnVjdHVyZURlc2NyaXB0aW9uRmlsZUxvY2F0aW9uIFBhdGg9IlN0cnVjdHVyZS9Qb2xpY3kvUG9saWN5Q2xhc3MueG1sIi8+Ci0gICAgPFNldHRpbmdzQ29uZmlndXJhdGlvbj4KLSAgICAgICAgPENvbmZpZ3VyYWJsZURvbWFpbnNGaWxlTG9jYXRpb24gUGF0aD0iU2V0dGluZ3MvUG9saWN5L1BvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sIi8+Ci0gICAgPC9TZXR0aW5nc0NvbmZpZ3VyYXRpb24+Ci08L1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWI1NGNmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvQW5kcm9pZC5icApAQCAtMCwwICsxLDEwMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIEltcG9ydCB0aGlzIG5hbWVzcGFjZSBpbiBvcmRlciB0byB1c2UgQU9TUCBQaG9uZSBjb25maWd1cmF0aW9uIGV4YW1wbGUKKworc29vbmdfbmFtZXNwYWNlIHsKKyAgICBpbXBvcnRzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZyIsCisgICAgXSwKK30KKworLy8KKy8vIEdlbmVyYXRlIEF1ZGlvIFBvbGljeSBQYXJhbWV0ZXIgRnJhbWV3b3JrIFByb2R1Y3QgU3RyYXRlZ2llcyBTdHJ1Y3R1cmUgZmlsZSBmcm9tIHRlbXBsYXRlCisvLworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiUHJvZHVjdFN0cmF0ZWdpZXMueG1sIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjOiAiOmJ1aWxkc3RyYXRlZ2llc3N0cnVjdHVyZV9nZW4iLAorICAgIHN1Yl9kaXI6ICJwYXJhbWV0ZXItZnJhbWV3b3JrL1N0cnVjdHVyZS9Qb2xpY3kiLAorICAgIHJlcXVpcmVkOiBbImxpYnBvbGljeS1zdWJzeXN0ZW0iXSwKK30KK2dlbnJ1bGUgeworICAgIG5hbWU6ICJidWlsZHN0cmF0ZWdpZXNzdHJ1Y3R1cmVfZ2VuIiwKKyAgICBkZWZhdWx0czogWyJidWlsZHN0cmF0ZWdpZXNzdHJ1Y3R1cmVydWxlIl0sCisgICAgc3JjczogWworICAgICAgICAiOmF1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbl9maWxlcyIsCisgICAgXSwKK30KKworLy8KKy8vIEdlbmVyYXRlIEF1ZGlvIFBvbGljeSBQYXJhbWV0ZXIgRnJhbWV3b3JrIENvbmZpZ3VyYWJsZSBEb21haW5zCisvLworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAicGFyYW1ldGVyLWZyYW1ld29yay5wb2xpY3kiLAorICAgIGZpbGVuYW1lX2Zyb21fc3JjOiB0cnVlLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmM6ICI6ZG9tYWluZ2VuZXJhdG9ycG9saWN5cnVsZV9nZW4iLAorICAgIHN1Yl9kaXI6ICJwYXJhbWV0ZXItZnJhbWV3b3JrL1NldHRpbmdzL1BvbGljeSIsCisgICAgcmVxdWlyZWQ6IFsKKyAgICAgICAgIlByb2R1Y3RTdHJhdGVnaWVzLnhtbCIsCisgICAgICAgICJQb2xpY3lDbGFzcy54bWwiLAorICAgICAgICAiUG9saWN5U3Vic3lzdGVtLnhtbCIsCisgICAgICAgICJQb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sIiwKKyAgICBdLAorfQorZ2VucnVsZSB7CisgICAgbmFtZTogImRvbWFpbmdlbmVyYXRvcnBvbGljeXJ1bGVfZ2VuIiwKKyAgICBkZWZhdWx0czogWyJkb21haW5nZW5lcmF0b3Jwb2xpY3lydWxlIl0sCisgICAgc3JjczogWworICAgICAgICAiOmF1ZGlvX3BvbGljeV9wZndfdG9wbGV2ZWwiLAorICAgICAgICAiOmF1ZGlvX3BvbGljeV9wZndfc3RydWN0dXJlX2ZpbGVzIiwKKyAgICAgICAgIjphdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcyIsCisgICAgICAgICI6ZWRkX2ZpbGVzIiwKKyAgICBdLAorfQorZmlsZWdyb3VwIHsKKyAgICBuYW1lOiAiZWRkX2ZpbGVzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICI6ZGV2aWNlX2Zvcl9pbnB1dF9zb3VyY2UucGZ3IiwKKyAgICAgICAgIjp2b2x1bWVzLnBmdyIsCisgICAgICAgICJTZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfbWVkaWEucGZ3IiwKKyAgICAgICAgIlNldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdyIsCisgICAgICAgICJTZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfZHRtZi5wZnciLAorICAgICAgICAiU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3IiwKKyAgICAgICAgIlNldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9waG9uZS5wZnciLAorICAgICAgICAiU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3NvbmlmaWNhdGlvbi5wZnciLAorICAgICAgICAiU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdyIsCisgICAgICAgICJTZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyLnBmdyIsCisgICAgICAgICJTZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdyIsCisgICAgICAgICJTZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcGF0Y2gucGZ3IiwKKyAgICBdLAorfQorLy8gVGhpcyBpcyBmb3IgU2V0dGluZ3MgZ2VuZXJhdGlvbiwgbXVzdCB1c2Ugc29ja2V0IHBvcnQsIHNvIHVzZXJkZWJ1ZyB2ZXJzaW9uIGlzIHJlcXVpcmVkCitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJhdWRpb19wb2xpY3lfcGZ3X3RvcGxldmVsIiwKKyAgICBzcmNzOiBbIjpQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnVzZXJkZWJ1Zy54bWwiXSwKK30KK2ZpbGVncm91cCB7CisgICAgbmFtZTogImF1ZGlvX3BvbGljeV9wZndfc3RydWN0dXJlX2ZpbGVzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICI6UG9saWN5Q2xhc3MiLAorICAgICAgICAiOlBvbGljeVN1YnN5c3RlbSIsCisgICAgICAgICI6YnVpbGRjb21tb250eXBlc3N0cnVjdHVyZV9nZW4iLAorICAgICAgICAiOmJ1aWxkc3RyYXRlZ2llc3N0cnVjdHVyZV9nZW4iLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDE2YTkwNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdwpAQCAtMCwwICsxLDU5NiBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JQcm9kdWN0U3RyYXRlZ3kKKworCXN1cERvbWFpbjogQWNjZXNzaWJpbGl0eQorCQkjCisJCSMgU1RSQVRFR1lfQUNDRVNTSUJJTElUWSBmb2xsb3dzIFNUUkFURUdZX1BIT05FIGlmIGluIGNhbGwgd2lkZWx5IHNwZWFraW5nCisJCSMgU1RSQVRFR1lfQUNDRVNTSUJJTElUWSBmb2xsb3dzIFNUUkFURUdZX01FRElBIG90aGVyd2lzZQorCQkjCisJCSMgT3RoZXIgY2FzZSBhcmUgaGFuZGxlZCBwcm9ncmFtbWF0aWNhbGx5IGhhcyBpbnZvbHZpbmcgYWN0aXZpdHkgb2Ygc3RyZWFtcy4KKwkJIworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogQ2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJYnVzID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisKKwkJZG9tYWluOiBEZXZpY2UKKwkJCWNvbmY6IFJlbW90ZVN1Ym1peAorCQkJCSMKKwkJCQkjIEFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIDAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMQorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJIworCQkJCSMgQWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lCisJCQkJIworCQkJCSMgQWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQkjCisJCQkJIyBBY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAxCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBGb3JjZVNwZWFrZXJXaGVuTm90SW5DYWxsCisJCQkJIworCQkJCSMgQWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzIEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjb0NhcmtpdAorCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvQ2Fya2l0CisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAxCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0CisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBCbHVldG9vdGhTY28KKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbworCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMQorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkjIGJ1dCBMaW5lIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gV2lyZWRIZWFkc2V0IGluIHRoaXMgY2FzZS4KKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkc2V0CisJCQkJCSMKKwkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMQorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJIworCQkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBVc2JEZXZpY2UKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAxCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgVVNCIGFjY2Vzc29yeSBub3QgcmVhY2hhYmxlIGluIGNhbGwKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5CisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgRGd0bERvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBBdXhEaWdpdGFsCisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBIZG1pIG5vdCByZWFjaGFibGUgaW4gY2FsbAorCQkJCSMKKwkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDEKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBBbmxnRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsCisJCQkJIworCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlzcGVha2VyID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMQorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogRWFycGllY2UKKwkJCQkjCisJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEVhcnBpZWNlCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMQorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9kdG1mLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9kdG1mLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTQ0NDVkCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2R0bWYucGZ3CkBAIC0wLDAgKzEsNjI1IEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVnaWVzCisJc3VwRG9tYWluOiBEdG1mCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJaXAgPSAwCisJCQkJCWJ1cyA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL2RldmljZV9hZGRyZXNzID0KKworCQlkb21haW46IERldmljZTIKKwkJCWNvbmY6IFJlbW90ZVN1Ym1peAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIEluY2x1ZGVzIDAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMQorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcAorCQkJCSMKKwkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEZvcmNlU3BlYWtlcldoZW5Ob3RJbkNhbGwKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXMgRm9yY2VTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gSXNOb3QgRm9yY2VIZG1pU3lzdGVtRW5mb3JjZWQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvSGVhZHNldAorCQkJCSMKKwkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjbworCQkJCSMKKwkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogTGluZQorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJIyBidXQgTGluZSBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIFdpcmVkSGVhZHNldCBpbiB0aGlzIGNhc2UuCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHNldAorCQkJCQkjCisJCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDEKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBVc2JEZXZpY2UKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCSMKKwkJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCSMKKwkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgVVNCIGFjY2Vzc29yeSBub3QgcmVhY2hhYmxlIGluIGNhbGwKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5CisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IERndGxEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwKKwkJCQkjCisJCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEhkbWkKKwkJCQkjCisJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IEhkbWkgbm90IHJlYWNoYWJsZSBpbiBjYWxsCisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMQorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBBbmxnRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsCisJCQkJIworCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jaworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEVhcnBpZWNlCisJCQkJIworCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogU3BlYWtlcgorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKKwkJCQkJIworCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyBJc05vdCBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMQorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCWRvbWFpbjogQXJjCisJCQkjCisJCQkjIERUTUYgc3RyYXRlZ3kgZm9sbG93cyBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKKwkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQorCQkJIworCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pQXJjCisKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWlfYXJjID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAwCisKKwkJZG9tYWluOiBTcGRpZgorCQkJIworCQkJIyBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCisJCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKKwkJCSMKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BkaWYKKworCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9zcGRpZiA9IDAKKworCQlkb21haW46IEF1eExpbmUKKwkJCSMKKwkJCSMgRFRNRiBzdHJhdGVneSBmb2xsb3dzIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkjIHRoZXNlIGZvbGxvd2luZyBkb21haW5zIGNvbnNpc3RzIGluIGRldmljZShzKSB0aGF0IGNhbiBjby1leGlzdCB3aXRoIG90aGVycworCQkJIyBlLmcuIEFSQywgU1BESUYsIEFVWF9MSU5FCisJCQkjCisJCQljb25mOiBTZWxlY3RlZAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEF1eExpbmUKKworCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSA9IDAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmI4ZjNjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3CkBAIC0wLDAgKzEsMzYxIEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCisJc3VwRG9tYWluOiBFbmZvcmNlZEF1ZGlibGUKKworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogQ2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJIyBubyBlbmZvcmNlZF9hdWRpYmxlIG9uIHJlbW90ZSBzdWJtaXggKGUuZy4gV0ZEKQorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlidXMgPSAwCisJCQkJCWZtID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisKKwkJZG9tYWluOiBTcGVha2VyCisJCQljb25mOiBTZWxlY3RlZAorCQkJCSMKKwkJCQkjIHN0cmF0ZWd5IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUgdXNlcyBzYW1lIHJvdXRpbmcgcG9saWN5IGFzIFNUUkFURUdZX1NPTklGSUNBVElPTgorCQkJCSMgZXhjZXB0OgorCQkJCSMgICAgLSB3aGVuIGluIGNhbGwgd2hlcmUgaXQgZG9lc24ndCBkZWZhdWx0IHRvIFNUUkFURUdZX1BIT05FIGJlaGF2aW9yCisJCQkJIyAgICAtIGluIGNvdW50cmllcyB3aGVyZSBub3QgZW5mb3JjZWQgaW4gd2hpY2ggY2FzZSBpdCBmb2xsb3dzIFNUUkFURUdZX01FRElBCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCUFOWQorCQkJCQlGb3JjZVVzZUZvclN5c3RlbSBJcyBGb3JjZVN5c3RlbUVuZm9yY2VkCisJCQkJCUFMTAorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgUmVtb3RlU3VibWl4CisJCQkJCQlBTlkKKwkJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEJsdWV0b290aEEyZHAKKwkJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgU3BlYWtlciBpcyBhbHNvIHRoZSBmYWxsYmFjayBkZXZpY2UgaWYgYW55IG9mIHRoZSBkZXZpY2UgZnJvbSBEZXZpY2UyIGRvbWFpbgorCQkJCQkjIGlzIHNlbGVjdGVkLgorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBSZW1vdGVTdWJtaXgKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkcGhvbmUKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgTGluZQorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5CisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkRldmljZQorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgSGRtaQorCQkJCQkJQU5ZCisJCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKwkJCQkJCQlGb3JjZVVzZUZvckRvY2sgSXNOb3QgRm9yY2VBbmFsb2dEb2NrCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKworCQlkb21haW46IERldmljZTIKKwkJCWNvbmY6IFJlbW90ZVN1Ym1peAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgUmVtb3RlU3VibWl4CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyAwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IExpbmUKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDEKKworCQkJY29uZjogV2lyZWRIZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAxCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogRGd0bERvY2tIZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogSGRtaQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAxCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogTm9EZXZpY2UKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9tZWRpYS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfbWVkaWEucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMTBhNTcKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfbWVkaWEucGZ3CkBAIC0wLDAgKzEsMzQwIEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogTWVkaWEKKwkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKKwkJCWNvbmY6IGNhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlmbSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlidXMgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL2RldmljZV9hZGRyZXNzID0KKworCQlkb21haW46IERldmljZTIKKwkJCWNvbmY6IFJlbW90ZVN1Ym1peAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgUmVtb3RlU3VibWl4CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlc0FkZHJlc3NlcyBJbmNsdWRlcyAwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcAorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZUJ0U2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZQorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZUJ0U2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogRm9yY2VTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQkjCisJCQkJIyBJZiBoZG1pIHN5c3RlbSBhdWRpbyBtb2RlIGlzIG9uLCByZW1vdmUgc3BlYWtlciBvdXQgb2Ygb3V0cHV0IGxpc3QuCisJCQkJIworCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogTGluZQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAxCisKKwkJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDEKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JBY2Nlc3NvcnkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBVc2JEZXZpY2UKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAxCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IERndGxEb2NrSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQXV4RGlnaXRhbAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMQorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jaworCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQkjCisJCQkJIyBJZiBoZG1pIHN5c3RlbSBhdWRpbyBtb2RlIGlzIG9uLCByZW1vdmUgc3BlYWtlciBvdXQgb2Ygb3V0cHV0IGxpc3QuCisJCQkJIworCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlQnRTY28KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDEKKwkJCQkJaGRtaSA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBEZWZhdWx0CisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJZG9tYWluOiBBcmMKKwkJCSMKKwkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCisJCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKKwkJCSMKKwkJCWNvbmY6IFNlbGVjdGVkCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pQXJjCisKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyA9IDEKKworCQkJY29uZjogTm90U2VsZWN0ZWQKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyA9IDAKKworCQlkb21haW46IFNwZGlmCisJCQkjCisJCQkjIHRoZXNlIGZvbGxvd2luZyBkb21haW5zIGNvbnNpc3RzIGluIGRldmljZShzKSB0aGF0IGNhbiBjby1leGlzdCB3aXRoIG90aGVycworCQkJIyBlLmcuIEFSQywgU1BESUYsIEFVWF9MSU5FCisJCQkjCisJCQljb25mOiBTZWxlY3RlZAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BkaWYKKworCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMAorCisJCWRvbWFpbjogQXV4TGluZQorCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEF1eExpbmUKKworCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lID0gMQorCisJCQljb25mOiBOb3RTZWxlY3RlZAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2F1eF9saW5lID0gMApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3BhdGNoLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9wYXRjaC5wZncKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVlZWVjNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9wYXRjaC5wZncKQEAgLTAsMCArMSwzNiBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JQcm9kdWN0U3RyYXRlZ3kKKwlzdXBEb21haW46IFBhdGNoCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3BhdGNoL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlidXMgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3BhdGNoL2RldmljZV9hZGRyZXNzID0KKworCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcGhvbmUucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3Bob25lLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTJmYzliCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3Bob25lLnBmdwpAQCAtMCwwICsxLDQ4MyBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JQcm9kdWN0U3RyYXRlZ3kKKwlzdXBEb21haW46IFBob25lCisJCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCisJCQljb25mOiBjYWxpYnJhdGlvbgorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJIyBubyBzb25pZmljYXRpb24gb24gcmVtb3RlIHN1Ym1peCAoZS5nLiBXRkQpCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWJ1cyA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9kZXZpY2VfYWRkcmVzcyA9CisKKwkJZG9tYWluOiBEZXZpY2UKKwkJCWNvbmY6IFNjb0NhcmtpdAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvQ2Fya2l0CisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0CisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbworCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAxCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcAorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VOb25lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQloZG1pID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHBob25lCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBXaXJlZEhlYWRzZXQKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAxCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFVzYkRldmljZQorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCisJCQkJQU5ZCisJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKKwkJCQkJQUxMCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisJCQkJCQkjCisJCQkJCQkjIEluIGNhc2Ugb2YgRm9yY2UgU3BlYWtlciwgcHJpb3JpdHkgYmV0d2VlbiBkZXZpY2UgYW5kIGFjY2Vzc29yeSBhcmUKKwkJCQkJCSMgaW52ZXJ0ZWQgY29tcGFyZWQgdG8gRm9yY2UgTm9uZSBvciBCdCBTY28KKwkJCQkJCSMKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5CisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBVc2JBY2Nlc3NvcnkKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTworCQkJCSMgb3IgRk9SQ0VfTk9ORQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBIZG1pCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDEKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCisJCQkJIyBvciBGT1JDRV9OT05FCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0CisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAxCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IEVhcnBpZWNlCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAxCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCQljb25mOiBTcGVha2VyCisJCQkJIworCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KKwkJCQkjIG9yIEZPUkNFX05PTkUKKwkJCQkjCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAxCisKKwkJCWNvbmY6IERlZmF1bHQKKwkJCQkjCisJCQkJIyBGYWxsYmFjayBvbiBkZWZhdWx0IG91dHB1dCBkZXZpY2Ugd2hpY2ggY2FuIGJlIHNwZWFrZXIgZm9yIGV4YW1wbGUKKwkJCQkjCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCXNwZWFrZXIgPSAxCisKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3Jlcm91dGluZy5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjc1Y2RmCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3Jlcm91dGluZy5wZncKQEAgLTAsMCArMSwzNiBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JQcm9kdWN0U3RyYXRlZ3kKKwlzdXBEb21haW46IFJlcm91dGluZworCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJc3BlYWtlciA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlzcGRpZiA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCWJ1cyA9IDAKKwkJCQkJc3R1YiA9IDAKKwkJCQkvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvcmVyb3V0aW5nL2RldmljZV9hZGRyZXNzID0KKworCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfc29uaWZpY2F0aW9uLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2MDQ0NWIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfc29uaWZpY2F0aW9uLnBmdwpAQCAtMCwwICsxLDQ5MCBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JQcm9kdWN0U3RyYXRlZ3kKKwlzdXBEb21haW46IFNvbmlmaWNhdGlvbgorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCQloZG1pX2FyYyA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQlzcGVha2VyX3NhZmUgPSAwCisJCQkJCWF1eF9saW5lID0gMAorCQkJCQkjCisJCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCBidXQgSERNSSBpcyBub3QgcmVhY2hhYmxlCisJCQkJCSMKKwkJCQkJaGRtaSA9IDAKKwkJCQkJYnVzID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJcHJveHkgPSAwCisJCQkJCXVzYl9oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vZGV2aWNlX2FkZHJlc3MgPQorCisJCWRvbWFpbjogU3BlYWtlcgorCisJCQljb25mOiBTZWxlY3RlZAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggRU5GT1JDRURfQVVESUJMRSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCQkjCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIExpbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKworCQlkb21haW46IERldmljZTIKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFNjb0NhcmtpdAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJQU5ZCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0NhcmtpdAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDEKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBTY29IZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbworCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBTY28KKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBwaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAxCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkjCisJCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBMaW5lCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMgYnV0IExpbmUgaGFzIGEgbG93ZXIgcHJpb3JpdHkgdGhhbiBXaXJlZEhlYWRzZXQgaW4gdGhpcyBjYXNlLgorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKKwkJCQkJIworCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAxCisKKwkJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0CisJCQkJQU5ZCisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkjCisJCQkJCUFMTAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCQkJIworCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBVc2JEZXZpY2UKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5CisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJCQkjCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMQorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IFVzYkFjY2Vzc29yeQorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCisJCQkJIyBidXQgVVNCIEFjY2Vzc29yeSBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDEKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IERndGxEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCisJCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDEKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCXRlbGVwaG9ueV90eCA9IDAKKwkJCQkJbGluZSA9IDAKKworCQkJY29uZjogRWFycGllY2UKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEVhcnBpZWNlCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCisKKwkJCWNvbmY6IE5vbmUKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWxpbmUgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YjExZTIzCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvUGhvbmUvU2V0dGluZ3MvZGV2aWNlX2Zvcl9wcm9kdWN0X3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdwpAQCAtMCwwICsxLDUzNiBAQAorc3VwRG9tYWluOiBEZXZpY2VGb3JQcm9kdWN0U3RyYXRlZ3kKKwlzdXBEb21haW46IFNvbmlmaWNhdGlvblJlc3BlY3RmdWwKKwkJIworCQkjIFNvbmlmaWNpYXRpb24gUmVzcGVjdGZ1bCBmb2xsb3dzOgorCQkjCS0gSWYgaW4gY2FsbDogU3RyYXRlZ3kgc29uaWZpY2F0aW9uICh0aGF0IGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaW4gY2FsbCBhbHNvLi4uKQorCQkjCS0gSWYgbm90IGluIGNhbGwgQU5EIGEgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZSByZW1vdGVseTogU3RyYXRlZ3kgc29uaWZpY2F0aW9uICh0aGF0CisJCSMgICAgIGZvbGxvd3MgZW5mb3JjZWQgYXVkaWJsZSwgd2hpY2ggZm9sbG93cyBtZWRpYSkKKwkJIwktIGlmIG5vdCBpbiBjYWxsIGFuZCBubyBtdXNpYyBzdHJlYW0gYWN0aXZlIHJlbW90ZWx5IGFuZCBtdXNpYyBzdHJlYW0gYWN0aXZlKTogc3RyYXRlZ3kKKwkJIyAgICAgbWVkaWEKKwkJIyAgIC0gT3RoZXJ3aXNlIGZvbGxvd3Mgc29uaWZpY2F0aW9uIGJ5IHJlcGxhY2luZyBzcGVha2VyIHdpdGggc3BlYWtlciBzYWZlIGlmIHNwZWFrZXIgaXMKKwkJIwkgIHNlbGVjdGVkLgorCQkjCisJCSMgQ2FzZSBvZiBzdHJlYW0gYWN0aXZlIGhhbmRsZWQgcHJvZ3JhbW1hdGljYWxseQorCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcworCQkJY29uZjogY2FsaWJyYXRpb24KKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJCWhkbWlfYXJjID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJc3BkaWYgPSAwCisJCQkJCWZtID0gMAorCQkJCQl0ZWxlcGhvbnlfdHggPSAwCisJCQkJCWlwID0gMAorCQkJCQlwcm94eSA9IDAKKwkJCQkJdXNiX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCisJCQkJL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL2RldmljZV9hZGRyZXNzID0KKworCQlkb21haW46IFNwZWFrZXJzCisKKwkJCWNvbmY6IFNwZWFrZXJTYWZlCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyU2FmZQorCQkJCSMKKwkJCQkjIEZvbGxvd3Mgc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsIGFuZCByZXBsYWNlIHNwZWFrZXIgYnkgc3BlYWtlciBzYWZlCisJCQkJIyBpZiBhbmQgb25seSBpZiBzcGVha2VyIG9ubHkgc2VsZWN0ZWQKKwkJCQkjCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQlzcGVha2VyX3NhZmUgPSAxCisJCQkJCXNwZWFrZXIgPSAwCisKKwkJCWNvbmY6IFNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKwkJCQlBTlkKKwkJCQkJIworCQkJCQkjIEZvbGxvd3Mgc29uaWZpY2F0aW9uIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgY2FsbAorCQkJCQkJIworCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgorCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBMaW5lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJc3BlYWtlciA9IDEKKworCQkJY29uZjogTm9uZQorCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlcl9zYWZlID0gMAorCQkJCQlzcGVha2VyID0gMAorCisJCWRvbWFpbjogRGV2aWNlMgorCQkJY29uZjogQmx1ZXRvb3RoQTJkcAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjb0NhcmtpdAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAxCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogQmx1ZXRvb3RoU2NvSGVhZHNldAorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEJsdWV0b290aFNjbworCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJIworCQkJCUFOWQorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAxCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKKwkJCQlBTlkKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCisJCQkJCQkjCisJCQkJCQlBTlkKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCQkJIworCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCisJCQkJCWxpbmUgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogTGluZQorCQkJCUFOWQorCQkJCQkjCisJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJIyBidXQgTGluZSBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIFdpcmVkSGVhZHNldCBpbiB0aGlzIGNhc2UuCisJCQkJCSMKKwkJCQkJIworCQkJCQlBTEwKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkc2V0CisJCQkJCSMKKwkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAorCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJCSMKKwkJCQkJQUxMCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMQorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IFdpcmVkSGVhZHNldAorCQkJCUFOWQorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKKwkJCQkJCSMKKwkJCQkJCUFOWQorCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJQUxMCisJCQkJCQkjCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJCQkjCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogVXNiRGV2aWNlCisJCQkJQU5ZCisJCQkJCUFMTAorCQkJCQkJIworCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCQkJIworCQkJCQkJQU5ZCisJCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCQlBTEwKKwkJCQkJCSMKKwkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKKwkJCQkJCSMKKwkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgorCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5CisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDEKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogVXNiQWNjZXNzb3J5CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBVc2JBY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCisJCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IERndGxEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCisJCQkJIworCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCisJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgorCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0CisKKwkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCWVhcnBpZWNlID0gMAorCQkJCQlibHVldG9vdGhfc2NvID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAorCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAorCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJd2lyZWRfaGVhZHBob25lID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCisJCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWhkbWkgPSAwCisKKwkJCWNvbmY6IEF1eERpZ2l0YWwKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQorCQkJCSMgYnV0IEhETUkgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDEKKworCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0CisJCQkJIworCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKKwkJCQkjIGJ1dCBBbmxnRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgorCQkJCSMKKwkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIGZvbGxvd3MgbWVkaWEgaWYgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZQorCQkJCSMKKwkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAorCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCisJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKKwkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCWJsdWV0b290aF9zY28gPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCisJCQkJCWxpbmUgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMQorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJaGRtaSA9IDAKKworCQkJY29uZjogRWFycGllY2UKKwkJCQkjCisJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAorCQkJCSMKKwkJCQlBTlkKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKKwkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KKwkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCisJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQorCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzaworCQkJCQllYXJwaWVjZSA9IDEKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJbGluZSA9IDAKKwkJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCisJCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAorCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQloZG1pID0gMAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1Bob25lL1NldHRpbmdzL2RldmljZV9mb3JfcHJvZHVjdF9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOGYzY2MKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9QaG9uZS9TZXR0aW5ncy9kZXZpY2VfZm9yX3Byb2R1Y3Rfc3RyYXRlZ3lfdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyLnBmdwpAQCAtMCwwICsxLDQzIEBACitzdXBEb21haW46IERldmljZUZvclByb2R1Y3RTdHJhdGVneQorCXN1cERvbWFpbjogVHJhbnNtaXR0ZWRUaHJvdWdoU3BlYWtlcgorCQlkb21haW46IFVucmVhY2hlYWJsZURldmljZXMKKwkJCWNvbmY6IENhbGlicmF0aW9uCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKKwkJCQkJaGRtaV9hcmMgPSAwCisJCQkJCXNwZGlmID0gMAorCQkJCQlhdXhfbGluZSA9IDAKKwkJCQkJZm0gPSAwCisJCQkJCXNwZWFrZXJfc2FmZSA9IDAKKwkJCQkJZWFycGllY2UgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKKwkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKKwkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCisJCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCisJCQkJCWhkbWkgPSAwCisJCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAorCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJdGVsZXBob255X3R4ID0gMAorCQkJCQlsaW5lID0gMAorCQkJCQlpcCA9IDAKKwkJCQkJYnVzID0gMAorCQkJCQlzdHViID0gMAorCQkJCS9Qb2xpY3kvcG9saWN5L3Byb2R1Y3Rfc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvZGV2aWNlX2FkZHJlc3MgPQorCisJCWRvbWFpbjogU3BlYWtlcgorCQkJY29uZjogU2VsZWN0ZWQKKwkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKKworCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvcHJvZHVjdF9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCisJCQkJCXNwZWFrZXIgPSAxCisKKwkJCWNvbmY6IE5vdFNlbGVjdGVkCisJCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9wcm9kdWN0X3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKKwkJCQkJc3BlYWtlciA9IDAKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvUG9saWN5Q29uZmlndXJhYmxlRG9tYWlucy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9Qb2xpY3lDb25maWd1cmFibGVEb21haW5zLnhtbAppbmRleCBiNDNmODNiLi5iYWZmYTgxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9Qb2xpY3lDb25maWd1cmFibGVEb21haW5zLnhtbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9Qb2xpY3lDb25maWd1cmFibGVEb21haW5zLnhtbApAQCAtMTQ1LDcgKzE0NSw3IEBACiAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BlYWtlciIvPgogICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiLz4KICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgotICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiLz4KICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIi8+CiAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSIvPgogICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRzZXQiLz4KQEAgLTE2Nyw4ICsxNjcsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgpAQCAtMjA4LDggKzIwOCw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CkBAIC0yNDksOCArMjQ5LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTI5MCw4ICsyOTAsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgpAQCAtMzMxLDggKzMzMSw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CkBAIC0zNzIsOCArMzcyLDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTQxMyw4ICs0MTMsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgpAQCAtNDU0LDggKzQ1NCw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CkBAIC00OTUsOCArNDk1LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTUzNiw4ICs1MzYsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MTwvQml0UGFyYW1ldGVyPgpAQCAtNTc3LDggKzU3Nyw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CkBAIC02MTgsOCArNjE4LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTY1OSw4ICs2NTksOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSI+MDwvQml0UGFyYW1ldGVyPgpAQCAtNzAwLDggKzcwMCw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfZGV2aWNlIj4wPC9CaXRQYXJhbWV0ZXI+CkBAIC03NDEsOCArNzQxLDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTEwMzksNyArMTAzOSw3IEBACiAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyIvPgogICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiLz4KICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIi8+Ci0gICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCIvPgogICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CiAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSIvPgogICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiLz4KQEAgLTEwNzksOCArMTA3OSw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC0xMTMyLDggKzExMzIsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtMTE4NSw4ICsxMTg1LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTEyMzgsOCArMTIzOCw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC0xMjkxLDggKzEyOTEsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtMTM0NCw4ICsxMzQ0LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTEzOTcsOCArMTM5Nyw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC0xNDUwLDggKzE0NTAsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtMTUwMyw4ICsxNTAzLDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTE1NTYsOCArMTU1Niw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC0xNjA5LDggKzE2MDksOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtMTY2Miw4ICsxNjYyLDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KQEAgLTE3MTUsOCArMTcxNSw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjE8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC0xNzY4LDggKzE3NjgsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtMTgyMSw4ICsxODIxLDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTE4NzQsOCArMTg3NCw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC0xOTI3LDggKzE5MjcsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtMjIyOCw3ICsyMjI4LDcgQEAKICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHAiLz4KICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyIvPgogICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIi8+Ci0gICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ii8+CiAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CiAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSIvPgpAQCAtMjI2NCw4ICsyMjY0LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC0yMzExLDggKzIzMTEsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTIzNTgsOCArMjM1OCw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4xPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtMjQwNSw4ICsyNDA1LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC0yNDUyLDggKzI0NTIsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTI0OTksOCArMjQ5OSw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtMjU0Niw4ICsyNTQ2LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC0yNTkzLDggKzI1OTMsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTI2NDAsOCArMjY0MCw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtMjY4Nyw4ICsyNjg3LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC0yNzM0LDggKzI3MzQsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTI3ODEsOCArMjc4MSw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgpAQCAtMjgyOCw4ICsyODI4LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9ibHVldG9vdGhfYTJkcF9zcGVha2VyIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC0yODc1LDggKzI4NzUsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTI5MjIsOCArMjkyMiw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcF9zcGVha2VyIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtMzI0Niw3ICszMjQ2LDcgQEAKICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ii8+CiAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIi8+CiAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSIvPgotICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiLz4KICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgogICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIi8+CkBAIC0zMjg0LDggKzMyODQsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtMzMzMSw4ICszMzMxLDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTMzNzgsOCArMzM3OCw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC0zNDI1LDggKzM0MjUsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtMzQ3Miw4ICszNDcyLDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTM1MTksOCArMzUxOSw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC0zNTY2LDggKzM1NjYsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtMzYxMyw4ICszNjEzLDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MTwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTM2NjAsOCArMzY2MCw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC0zNzA3LDggKzM3MDcsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtMzc1NCw4ICszNzU0LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTM4MDEsOCArMzgwMSw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CkBAIC0zODQ4LDggKzM4NDgsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtMzg5NSw4ICszODk1LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTM5NDIsOCArMzk0Miw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC00MjA3LDcgKzQyMDcsNyBAQAogICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyIvPgogICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciIvPgogICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSIvPgotICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiLz4KKyAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ii8+CiAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCIvPgogICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2FjY2Vzc29yeSIvPgogICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSIvPgpAQCAtNDI0Nyw4ICs0MjQ3LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtNDMwMCw4ICs0MzAwLDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtNDM1Myw4ICs0MzUzLDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtNDQwNiw4ICs0NDA2LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtNDQ1OSw4ICs0NDU5LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtNDUxMiw4ICs0NTEyLDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtNDU2NSw4ICs0NTY1LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtNDYxOCw4ICs0NjE4LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtNDY3MSw4ICs0NjcxLDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtNDcyNCw4ICs0NzI0LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtNDc3Nyw4ICs0Nzc3LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtNDgzMCw4ICs0ODMwLDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtNDg4Myw4ICs0ODgzLDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgpAQCAtNDkzNiw4ICs0OTM2LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4xPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtNDk4OSw4ICs0OTg5LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtNTA0Miw4ICs1MDQyLDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtNTA5NSw4ICs1MDk1LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtNTE0OCw4ICs1MTQ4LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtNTQ0OCw3ICs1NDQ4LDcgQEAKICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiLz4KICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX3NwZWFrZXIiLz4KICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiLz4KLSAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCIvPgogICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiLz4KICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9kZXZpY2UiLz4KQEAgLTU0OTAsOCArNTQ5MCw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTU1NDMsOCArNTU0Myw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTU1OTYsOCArNTU5Niw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTU2NDksOCArNTY0OSw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTU3MDIsOCArNTcwMiw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTU3NTUsOCArNTc1NSw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTU4MDgsOCArNTgwOCw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTU4NjEsOCArNTg2MSw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTU5MTQsOCArNTkxNCw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTU5NjcsOCArNTk2Nyw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KQEAgLTYwMjAsOCArNjAyMCw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MTwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTYwNzMsOCArNjA3Myw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTYxMjYsOCArNjEyNiw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2hkbWkiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaGRtaSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTYxNzAsNyArNjE3MCw3IEBACiAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2JsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMiLz4KICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciIvPgogICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIi8+Ci0gICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ii8+CiAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CiAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSIvPgpAQCAtNjIzMCw4ICs2MjMwLDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWkiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC02NTM5LDcgKzY1MzksNyBAQAogICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHNldCIvPgogICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svd2lyZWRfaGVhZHBob25lIi8+CiAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIi8+Ci0gICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCIvPgorICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiLz4KICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CiAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfYWNjZXNzb3J5Ii8+CiAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay91c2JfZGV2aWNlIi8+CkBAIC02NTgzLDggKzY1ODMsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC02NjM2LDggKzY2MzYsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC02Njg5LDggKzY2ODksOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC02NzQyLDggKzY3NDIsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC02Nzk1LDggKzY3OTUsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC02ODQ4LDggKzY4NDgsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC02OTAxLDggKzY5MDEsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC02OTU0LDggKzY5NTQsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC03MDA3LDggKzcwMDcsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC03MDYwLDggKzcwNjAsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjE8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC03MTEzLDggKzcxMTMsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC03MTY2LDggKzcxNjYsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC03MjE5LDggKzcyMTksOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC03MjcyLDggKzcyNzIsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CkBAIC03MzI1LDggKzczMjUsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC03Mzc4LDggKzczNzgsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MTwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC03NDMxLDggKzc0MzEsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC03NDg0LDggKzc0ODQsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC03NTM3LDggKzc1MzcsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC03NzEwLDcgKzc3MTAsNyBAQAogICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay93aXJlZF9oZWFkc2V0Ii8+CiAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3dpcmVkX2hlYWRwaG9uZSIvPgogICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIi8+Ci0gICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ii8+CisgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ii8+CiAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ii8+CiAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3VzYl9hY2Nlc3NvcnkiLz4KICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svdXNiX2RldmljZSIvPgpAQCAtNzc0Miw4ICs3NzQyLDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC03NzgzLDggKzc3ODMsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTc4MjQsOCArNzgyNCw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtNzg2NSw4ICs3ODY1LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC03OTA2LDggKzc5MDYsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTc5NDcsOCArNzk0Nyw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtNzk4OCw4ICs3OTg4LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjE8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC04MDI5LDggKzgwMjksOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTgwNzAsOCArODA3MCw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtODExMSw4ICs4MTExLDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC04MTUyLDggKzgxNTIsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KQEAgLTgxOTMsOCArODE5Myw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtODIzNCw4ICs4MjM0LDggQEAKICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9saW5lIj4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImxpbmUiPjA8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgotICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FuZ2xfZG9ja19oZWFkc2V0Ij4KLSAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0Ij4xPC9CaXRQYXJhbWV0ZXI+CisgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5sZ19kb2NrX2hlYWRzZXQiPgorICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiPjE8L0JpdFBhcmFtZXRlcj4KICAgICAgICAgPC9Db25maWd1cmFibGVFbGVtZW50PgogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2RndGxfZG9ja19oZWFkc2V0Ij4KICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CkBAIC04Mjc1LDggKzgyNzUsOCBAQAogICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2xpbmUiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+Ci0gICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYW5nbF9kb2NrX2hlYWRzZXQiPgotICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5nbF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KKyAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmxnX2RvY2tfaGVhZHNldCI+CisgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmxnX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgogICAgICAgICA8L0NvbmZpZ3VyYWJsZUVsZW1lbnQ+CiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svZGd0bF9kb2NrX2hlYWRzZXQiPgogICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGd0bF9kb2NrX2hlYWRzZXQiPjA8L0JpdFBhcmFtZXRlcj4KQEAgLTgzMTYsOCArODMxNiw4IEBACiAgICAgICAgIDxDb25maWd1cmFibGVFbGVtZW50IFBhdGg9Ii9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svbGluZSI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIj4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KLSAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hbmdsX2RvY2tfaGVhZHNldCI+Ci0gICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJhbmdsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgorICAgICAgICA8Q29uZmlndXJhYmxlRWxlbWVudCBQYXRoPSIvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL2FubGdfZG9ja19oZWFkc2V0Ij4KKyAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFubGdfZG9ja19oZWFkc2V0Ij4wPC9CaXRQYXJhbWV0ZXI+CiAgICAgICAgIDwvQ29uZmlndXJhYmxlRWxlbWVudD4KICAgICAgICAgPENvbmZpZ3VyYWJsZUVsZW1lbnQgUGF0aD0iL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9kZ3RsX2RvY2tfaGVhZHNldCI+CiAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCI+MDwvQml0UGFyYW1ldGVyPgpAQCAtODQ3Miw3ICs4NDcyLDcgQEAKICAgICA8Q29uZmlndXJhdGlvbnM+CiAgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJTb25pZmljYXRpb24iPgogICAgICAgICA8Q29tcG91bmRSdWxlIFR5cGU9IkFsbCI+Ci0gICAgICAgICAgPFNlbGVjdGlvbkNyaXRlcmlvblJ1bGUgU2VsZWN0aW9uQ3JpdGVyaW9uPSJUZWxlcGhvbnlNb2RlIiBNYXRjaGVzV2hlbj0iSXMiIFZhbHVlPSJSaW5nVG9uZSIvPgorICAgICAgICAgIDxTZWxlY3Rpb25Dcml0ZXJpb25SdWxlIFNlbGVjdGlvbkNyaXRlcmlvbj0iVGVsZXBob255TW9kZSIgTWF0Y2hlc1doZW49IklzIiBWYWx1ZT0iUmluZ3RvbmUiLz4KICAgICAgICAgPC9Db21wb3VuZFJ1bGU+CiAgICAgICA8L0NvbmZpZ3VyYXRpb24+CiAgICAgICA8Q29uZmlndXJhdGlvbiBOYW1lPSJQaG9uZSI+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX2lucHV0X3NvdXJjZS5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX2lucHV0X3NvdXJjZS5wZncKaW5kZXggYTk5MDg3OS4uOWUwOTU3YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9pbnB1dF9zb3VyY2UucGZ3CisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3JfaW5wdXRfc291cmNlLnBmdwpAQCAtMTgsNyArMTgsNiBAQAogCQkJCWxvb3BiYWNrID0gMAogCQkJCWlwID0gMAogCQkJCWJ1cyA9IDAKLQkJCQlzdHViID0gMAogCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL21pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCiAJCQkJY29tbXVuaWNhdGlvbiA9IDAKIAkJCQlhbWJpZW50ID0gMApAQCAtMzYsNyArMzUsNiBAQAogCQkJCWxvb3BiYWNrID0gMAogCQkJCWlwID0gMAogCQkJCWJ1cyA9IDAKLQkJCQlzdHViID0gMAogCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX2Rvd25saW5rL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKIAkJCQljb21tdW5pY2F0aW9uID0gMAogCQkJCWFtYmllbnQgPSAwCkBAIC01OCw3ICs1Niw2IEBACiAJCQkJbG9vcGJhY2sgPSAwCiAJCQkJaXAgPSAwCiAJCQkJYnVzID0gMAotCQkJCXN0dWIgPSAwCiAJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCiAJCQkJY29tbXVuaWNhdGlvbiA9IDAKIAkJCQlhbWJpZW50ID0gMApAQCAtODAsNyArNzcsNiBAQAogCQkJCWxvb3BiYWNrID0gMAogCQkJCWlwID0gMAogCQkJCWJ1cyA9IDAKLQkJCQlzdHViID0gMAogCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCiAJCQkJY29tbXVuaWNhdGlvbiA9IDAKIAkJCQlhbWJpZW50ID0gMApAQCAtMTAyLDcgKzk4LDYgQEAKIAkJCQlsb29wYmFjayA9IDAKIAkJCQlpcCA9IDAKIAkJCQlidXMgPSAwCi0JCQkJc3R1YiA9IDAKIAkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzawogCQkJCWNvbW11bmljYXRpb24gPSAwCiAJCQkJYW1iaWVudCA9IDAKQEAgLTEyMyw3ICsxMTgsNiBAQAogCQkJCWxvb3BiYWNrID0gMAogCQkJCWlwID0gMAogCQkJCWJ1cyA9IDAKLQkJCQlzdHViID0gMAogCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3ZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKIAkJCQljb21tdW5pY2F0aW9uID0gMAogCQkJCWFtYmllbnQgPSAwCkBAIC0xNDIsNyArMTM2LDYgQEAKIAkJCQlsb29wYmFjayA9IDAKIAkJCQlpcCA9IDAKIAkJCQlidXMgPSAwCi0JCQkJc3R1YiA9IDAKIAkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9jb21tdW5pY2F0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKIAkJCQljb21tdW5pY2F0aW9uID0gMAogCQkJCWFtYmllbnQgPSAwCkBAIC0xNjAsNyArMTUzLDYgQEAKIAkJCQlsb29wYmFjayA9IDAKIAkJCQlpcCA9IDAKIAkJCQlidXMgPSAwCi0JCQkJc3R1YiA9IDAKIAkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKIAkJCQljb21tdW5pY2F0aW9uID0gMAogCQkJCWFtYmllbnQgPSAwCkBAIC0xODIsNyArMTc0LDYgQEAKIAkJCQlsb29wYmFjayA9IDAKIAkJCQlpcCA9IDAKIAkJCQlidXMgPSAwCi0JCQkJc3R1YiA9IDAKIAkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9ob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKIAkJCQljb21tdW5pY2F0aW9uID0gMAogCQkJCWFtYmllbnQgPSAwCkBAIC0yMDEsNyArMTkyLDYgQEAKIAkJCQlsb29wYmFjayA9IDAKIAkJCQlpcCA9IDAKIAkJCQlidXMgPSAwCi0JCQkJc3R1YiA9IDAKIAkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy91bnByb2Nlc3NlZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCiAJCQkJY29tbXVuaWNhdGlvbiA9IDAKIAkJCQlhbWJpZW50ID0gMApAQCAtMjIwLDcgKzIxMCw2IEBACiAJCQkJbG9vcGJhY2sgPSAwCiAJCQkJaXAgPSAwCiAJCQkJYnVzID0gMAotCQkJCXN0dWIgPSAwCiAJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzawogCQkJCWNvbW11bmljYXRpb24gPSAwCiAJCQkJYW1iaWVudCA9IDAKQEAgLTI0Miw3ICsyMzEsNiBAQAogCQkJCWxvb3BiYWNrID0gMAogCQkJCWlwID0gMAogCQkJCWJ1cyA9IDAKLQkJCQlzdHViID0gMAogCiAJZG9tYWluOiBEZWZhdWx0QW5kTWljCiAJCWNvbmY6IEEyZHAKQEAgLTI1NSwxMiArMjQzLDE0IEBACiAJCQkJCXVzYl9kZXZpY2UgPSAwCiAJCQkJCWJ1aWx0aW5fbWljID0gMAogCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCiAJCQkJY29tcG9uZW50OiBtaWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay8KIAkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCiAJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCiAJCQkJCXVzYl9kZXZpY2UgPSAwCiAJCQkJCWJ1aWx0aW5fbWljID0gMAogCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCiAKIAkJY29uZjogU2NvCiAJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldApAQCAtMjczLDEyICsyNjMsMTQgQEAKIAkJCQkJdXNiX2RldmljZSA9IDAKIAkJCQkJYnVpbHRpbl9taWMgPSAwCiAJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKKwkJCQkJc3R1YiA9IDAKIAkJCQljb21wb25lbnQ6IG1pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrLwogCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKIAkJCQkJd2lyZWRfaGVhZHNldCA9IDAKIAkJCQkJdXNiX2RldmljZSA9IDAKIAkJCQkJYnVpbHRpbl9taWMgPSAwCiAJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKKwkJCQkJc3R1YiA9IDAKIAogCQljb25mOiBXaXJlZEhlYWRzZXQKIAkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKQEAgLTI5MCwxMiArMjgyLDE0IEBACiAJCQkJCXVzYl9kZXZpY2UgPSAwCiAJCQkJCWJ1aWx0aW5fbWljID0gMAogCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCiAJCQkJY29tcG9uZW50OiBtaWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay8KIAkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCiAJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCiAJCQkJCXVzYl9kZXZpY2UgPSAwCiAJCQkJCWJ1aWx0aW5fbWljID0gMAogCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCiAKIAkJY29uZjogVXNiRGV2aWNlCiAJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCkBAIC0zMDcsMTIgKzMwMSwxNCBAQAogCQkJCQl1c2JfZGV2aWNlID0gMQogCQkJCQlidWlsdGluX21pYyA9IDAKIAkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAogCQkJCWNvbXBvbmVudDogbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svCiAJCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAogCQkJCQl1c2JfZGV2aWNlID0gMQogCQkJCQlidWlsdGluX21pYyA9IDAKIAkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAogCiAJCWNvbmY6IEJ1aWx0aW5NaWMKIAkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBCdWlsdGluTWljCkBAIC0zMjQsMTIgKzMyMCwzMyBAQAogCQkJCQl1c2JfZGV2aWNlID0gMAogCQkJCQlidWlsdGluX21pYyA9IDEKIAkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAogCQkJCWNvbXBvbmVudDogbWljL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svCiAJCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAogCQkJCQl1c2JfZGV2aWNlID0gMAogCQkJCQlidWlsdGluX21pYyA9IDEKIAkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQlzdHViID0gMAorCisJCWNvbmY6IFN0dWIKKwkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBEZWZhdWx0CisKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcworCQkJCWNvbXBvbmVudDogZGVmYXVsdC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrLworCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDEKKwkJCQljb21wb25lbnQ6IG1pYy9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrLworCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKKwkJCQkJd2lyZWRfaGVhZHNldCA9IDAKKwkJCQkJdXNiX2RldmljZSA9IDAKKwkJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKKwkJCQkJc3R1YiA9IDEKIAogCQljb25mOiBEZWZhdWx0CiAJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMKQEAgLTMzOSwxMiArMzU2LDE0IEBACiAJCQkJCXVzYl9kZXZpY2UgPSAwCiAJCQkJCWJ1aWx0aW5fbWljID0gMAogCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCiAJCQkJY29tcG9uZW50OiBtaWMvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay8KIAkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCiAJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCiAJCQkJCXVzYl9kZXZpY2UgPSAwCiAJCQkJCWJ1aWx0aW5fbWljID0gMAogCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCXN0dWIgPSAwCiAKIAlkb21haW46IFZvaWNlVXBsaW5rQW5kVm9pY2VEb3dubGlua0FuZFZvaWNlQ2FsbAogCQljb25mOiBWb2ljZUNhbGwKQEAgLTM1NCwxMiArMzczLDI5IEBACiAJCQkJdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcnggPSAxCiAJCQkJdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCA9IDEKIAkJCQl2b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcnggPSAxCisJCQkJdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zdHViID0gMAorCQkJCXZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zdHViID0gMAorCQkJCXZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3N0dWIgPSAwCisKKwkJY29uZjogU3R1YgorCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIERlZmF1bHQKKworCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzCisJCQkJdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcnggPSAwCisJCQkJdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCA9IDAKKwkJCQl2b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcnggPSAwCisJCQkJdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zdHViID0gMQorCQkJCXZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zdHViID0gMQorCQkJCXZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3N0dWIgPSAxCiAKIAkJY29uZjogRGVmYXVsdAogCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzCiAJCQkJdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcnggPSAwCiAJCQkJdm9pY2VfY2FsbC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3RlbGVwaG9ueV9yeCA9IDAKIAkJCQl2b2ljZV91cGxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay90ZWxlcGhvbnlfcnggPSAwCisJCQkJdm9pY2VfZG93bmxpbmsvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zdHViID0gMAorCQkJCXZvaWNlX2NhbGwvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zdHViID0gMAorCQkJCXZvaWNlX3VwbGluay9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3N0dWIgPSAwCiAKIAlkb21haW46IENhbWNvcmRlcgogCQljb25mOiBCYWNrTWljCkBAIC0zNjgsNiArNDA0LDcgQEAKIAkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzawogCQkJCWJhY2tfbWljID0gMQogCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCXN0dWIgPSAwCiAKIAkJY29uZjogQnVpbHRpbk1pYwogCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIEJ1aWx0aW5NaWMKQEAgLTM3NSwxMSArNDEyLDIxIEBACiAJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvY2FtY29yZGVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKIAkJCQliYWNrX21pYyA9IDAKIAkJCQlidWlsdGluX21pYyA9IDEKKwkJCQlzdHViID0gMAorCisJCWNvbmY6IFN0dWIKKwkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBEZWZhdWx0CisKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9jYW1jb3JkZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWJhY2tfbWljID0gMAorCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCXN0dWIgPSAxCiAKIAkJY29uZjogRGVmYXVsdAogCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2NhbWNvcmRlci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCiAJCQkJYmFja19taWMgPSAwCiAJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJc3R1YiA9IDAKIAogCWRvbWFpbjogVm9pY2VSZWNvZ25pdGlvbkFuZFVucHJvY2Vzc2VkQW5kSG90d29yZAogCQljb25mOiBTY29IZWFkc2V0CkBAIC0zOTIsMTYgKzQzOSwxOSBAQAogCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAogCQkJCQl1c2JfZGV2aWNlID0gMAogCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQkJc3R1YiA9IDAKIAkJCQljb21wb25lbnQ6IHVucHJvY2Vzc2VkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKIAkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMQogCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAogCQkJCQl1c2JfZGV2aWNlID0gMAogCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQkJc3R1YiA9IDAKIAkJCQljb21wb25lbnQ6IGhvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzawogCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCiAJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCiAJCQkJCXVzYl9kZXZpY2UgPSAwCiAJCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCQlzdHViID0gMAogCiAJCWNvbmY6IFdpcmVkSGVhZHNldAogCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldApAQCAtNDExLDE3ICs0NjEsMjAgQEAKIAkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQogCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlzdHViID0gMAogCQkJCQlidWlsdGluX21pYyA9IDAKIAkJCQljb21wb25lbnQ6IHVucHJvY2Vzc2VkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKIAkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQogCQkJCQl1c2JfZGV2aWNlID0gMAogCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQkJc3R1YiA9IDAKIAkJCQljb21wb25lbnQ6IGhvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzawogCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJCXdpcmVkX2hlYWRzZXQgPSAxCiAJCQkJCXVzYl9kZXZpY2UgPSAwCiAJCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCQlzdHViID0gMAogCiAJCWNvbmY6IFVzYkRldmljZQogCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQpAQCAtNDMyLDE2ICs0ODUsMTkgQEAKIAkJCQkJd2lyZWRfaGVhZHNldCA9IDAKIAkJCQkJdXNiX2RldmljZSA9IDEKIAkJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJCXN0dWIgPSAwCiAJCQkJY29tcG9uZW50OiB1bnByb2Nlc3NlZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCiAJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKIAkJCQkJd2lyZWRfaGVhZHNldCA9IDAKIAkJCQkJdXNiX2RldmljZSA9IDEKIAkJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJCXN0dWIgPSAwCiAJCQkJY29tcG9uZW50OiBob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKIAkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAogCQkJCQl1c2JfZGV2aWNlID0gMQogCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQkJc3R1YiA9IDAKIAogCQljb25mOiBCdWlsdGluTWljCiAJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgQnVpbHRpbk1pYwpAQCAtNDUyLDE3ICs1MDgsNDIgQEAKIAkJCQkJd2lyZWRfaGVhZHNldCA9IDAKIAkJCQkJdXNiX2RldmljZSA9IDAKIAkJCQkJYnVpbHRpbl9taWMgPSAxCisJCQkJCXN0dWIgPSAwCiAJCQkJY29tcG9uZW50OiB1bnByb2Nlc3NlZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCiAJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKIAkJCQkJd2lyZWRfaGVhZHNldCA9IDAKIAkJCQkJdXNiX2RldmljZSA9IDAKIAkJCQkJYnVpbHRpbl9taWMgPSAxCisJCQkJCXN0dWIgPSAwCiAJCQkJY29tcG9uZW50OiBob3R3b3JkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKIAkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAogCQkJCQl1c2JfZGV2aWNlID0gMAogCQkJCQlidWlsdGluX21pYyA9IDEKKwkJCQkJc3R1YiA9IDAKIAorCQljb25mOiBTdHViCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgRGVmYXVsdAorCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMKKwkJCQljb21wb25lbnQ6IHZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQkJc3R1YiA9IDEKKwkJCQljb21wb25lbnQ6IHVucHJvY2Vzc2VkL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAorCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAorCQkJCQl1c2JfZGV2aWNlID0gMAorCQkJCQlidWlsdGluX21pYyA9IDAKKwkJCQkJc3R1YiA9IDEKKwkJCQljb21wb25lbnQ6IGhvdHdvcmQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCisJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCisJCQkJCXVzYl9kZXZpY2UgPSAwCisJCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCQlzdHViID0gMQogCQljb25mOiBEZWZhdWx0CiAJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMKIAkJCQljb21wb25lbnQ6IHZvaWNlX3JlY29nbml0aW9uL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKQEAgLTQ3MCwxNiArNTUxLDE5IEBACiAJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCiAJCQkJCXVzYl9kZXZpY2UgPSAwCiAJCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCQlzdHViID0gMAogCQkJCWNvbXBvbmVudDogdW5wcm9jZXNzZWQvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzawogCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJCXdpcmVkX2hlYWRzZXQgPSAwCiAJCQkJCXVzYl9kZXZpY2UgPSAwCiAJCQkJCWJ1aWx0aW5fbWljID0gMAorCQkJCQlzdHViID0gMAogCQkJCWNvbXBvbmVudDogaG90d29yZC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCiAJCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKIAkJCQkJd2lyZWRfaGVhZHNldCA9IDAKIAkJCQkJdXNiX2RldmljZSA9IDAKIAkJCQkJYnVpbHRpbl9taWMgPSAwCisJCQkJCXN0dWIgPSAwCiAKIAlkb21haW46IFZvaWNlQ29tbXVuaWNhdGlvbgogCQljb25mOiBTY29IZWFkc2V0CkBAIC00OTUsNiArNTc5LDcgQEAKIAkJCQl1c2JfZGV2aWNlID0gMAogCQkJCWJ1aWx0aW5fbWljID0gMAogCQkJCWJhY2tfbWljID0gMAorCQkJCXN0dWIgPSAwCiAKIAkJY29uZjogV2lyZWRIZWFkc2V0CiAJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VOb25lCkBAIC01MDYsNiArNTkxLDcgQEAKIAkJCQl1c2JfZGV2aWNlID0gMAogCQkJCWJ1aWx0aW5fbWljID0gMAogCQkJCWJhY2tfbWljID0gMAorCQkJCXN0dWIgPSAwCiAKIAkJY29uZjogVXNiRGV2aWNlCiAJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VOb25lCkBAIC01MTcsNiArNjAzLDcgQEAKIAkJCQl1c2JfZGV2aWNlID0gMQogCQkJCWJ1aWx0aW5fbWljID0gMAogCQkJCWJhY2tfbWljID0gMAorCQkJCXN0dWIgPSAwCiAKIAkJY29uZjogQnVpbHRpbk1pYwogCQkJQXZhaWxhYmxlSW5wdXREZXZpY2VzIEluY2x1ZGVzIEJ1aWx0aW5NaWMKQEAgLTUzMiw2ICs2MTksNyBAQAogCQkJCXVzYl9kZXZpY2UgPSAwCiAJCQkJYnVpbHRpbl9taWMgPSAxCiAJCQkJYmFja19taWMgPSAwCisJCQkJc3R1YiA9IDAKIAogCQljb25mOiBCYWNrTWljCiAJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCkBAIC01NDMsNiArNjMxLDcgQEAKIAkJCQl1c2JfZGV2aWNlID0gMAogCQkJCWJ1aWx0aW5fbWljID0gMAogCQkJCWJhY2tfbWljID0gMQorCQkJCXN0dWIgPSAwCiAKIAkJY29uZjogRGVmYXVsdAogCQkJIwpAQCAtNTU0LDYgKzY0Myw3IEBACiAJCQkJdXNiX2RldmljZSA9IDAKIAkJCQlidWlsdGluX21pYyA9IDEKIAkJCQliYWNrX21pYyA9IDAKKwkJCQlzdHViID0gMAogCiAJZG9tYWluOiBSZW1vdGVTdWJtaXgKIAkJY29uZjogUmVtb3RlU3VibWl4CkBAIC01NjEsMTAgKzY1MSwxOSBAQAogCiAJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvcmVtb3RlX3N1Ym1peC9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCiAJCQkJcmVtb3RlX3N1Ym1peCA9IDEKKwkJCQlzdHViID0gMAorCisJCWNvbmY6IFN0dWIKKwkJCUF2YWlsYWJsZUlucHV0RGV2aWNlcyBJbmNsdWRlcyBEZWZhdWx0CisKKwkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9yZW1vdGVfc3VibWl4L2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKKwkJCQlyZW1vdGVfc3VibWl4ID0gMAorCQkJCXN0dWIgPSAxCiAKIAkJY29uZjogRGVmYXVsdAogCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL3JlbW90ZV9zdWJtaXgvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzawogCQkJCXJlbW90ZV9zdWJtaXggPSAwCisJCQkJc3R1YiA9IDAKIAogCWRvbWFpbjogRm1UdW5lcgogCQljb25mOiBGbVR1bmVyCkBAIC01NzIsOCArNjcxLDI5IEBACiAKIAkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy9mbV90dW5lci9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrCiAJCQkJZm1fdHVuZXIgPSAxCisJCQkJc3R1YiA9IDAKKworCQljb25mOiBTdHViCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgRGVmYXVsdAorCisJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZm1fdHVuZXIvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzaworCQkJCWZtX3R1bmVyID0gMAorCQkJCXN0dWIgPSAxCiAKIAkJY29uZjogRGVmYXVsdAogCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2ZtX3R1bmVyL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2sKIAkJCQlmbV90dW5lciA9IDAKKwkJCQlzdHViID0gMAorCisJZG9tYWluOiBWb2ljZQorCQljb25mOiBTdHViCisJCQlBdmFpbGFibGVJbnB1dERldmljZXMgSW5jbHVkZXMgRGVmYXVsdAorCisJCQkvUG9saWN5L3BvbGljeS9pbnB1dF9zb3VyY2VzL2VjaG9fcmVmZXJlbmNlL2FwcGxpY2FibGVfaW5wdXRfZGV2aWNlL21hc2svc3R1YiA9IDEKKwkJCS9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvdm9pY2VfcGVyZm9ybWFuY2UvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zdHViID0gMQorCisJCWNvbmY6IERlZmF1bHQKKwkJCS9Qb2xpY3kvcG9saWN5L2lucHV0X3NvdXJjZXMvZWNob19yZWZlcmVuY2UvYXBwbGljYWJsZV9pbnB1dF9kZXZpY2UvbWFzay9zdHViID0gMAorCQkJL1BvbGljeS9wb2xpY3kvaW5wdXRfc291cmNlcy92b2ljZV9wZXJmb3JtYW5jZS9hcHBsaWNhYmxlX2lucHV0X2RldmljZS9tYXNrL3N0dWIgPSAwCisKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfYWNjZXNzaWJpbGl0eS5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViMTE5ODAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9hY2Nlc3NpYmlsaXR5LnBmdworKysgL2Rldi9udWxsCkBAIC0xLDU5MyArMCwwIEBACi1zdXBEb21haW46IERldmljZUZvclN0cmF0ZWd5Ci0KLQlzdXBEb21haW46IEFjY2Vzc2liaWxpdHkKLQkJIwotCQkjIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgZm9sbG93cyBTVFJBVEVHWV9QSE9ORSBpZiBpbiBjYWxsIHdpZGVseSBzcGVha2luZwotCQkjIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgZm9sbG93cyBTVFJBVEVHWV9NRURJQSBvdGhlcndpc2UKLQkJIwotCQkjIE90aGVyIGNhc2UgYXJlIGhhbmRsZWQgcHJvZ3JhbW1hdGljYWxseSBoYXMgaW52b2x2aW5nIGFjdGl2aXR5IG9mIHN0cmVhbXMuCi0JCSMKLQkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKLQkJCWNvbmY6IENhbGlicmF0aW9uCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQloZG1pX2FyYyA9IDAKLQkJCQkJc3BkaWYgPSAwCi0JCQkJCWF1eF9saW5lID0gMAotCQkJCQlmbSA9IDAKLQkJCQkJc3BlYWtlcl9zYWZlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBEZXZpY2UKLQkJCWNvbmY6IFJlbW90ZVN1Ym1peAotCQkJCSMKLQkJCQkjIEFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCSMKLQkJCQkjIEFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmUKLQkJCQkjCi0JCQkJIyBBY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBBY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRm9yY2VTcGVha2VyV2hlbk5vdEluQ2FsbAotCQkJCSMKLQkJCQkjIEFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMQotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvQ2Fya2l0Ci0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAxCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0Ci0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0Ci0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAxCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRwaG9uZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBMaW5lCi0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCQkjIGJ1dCBMaW5lIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gV2lyZWRIZWFkc2V0IGluIHRoaXMgY2FzZS4KLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkc2V0Ci0JCQkJCSMKLQkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRzZXQKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCSMKLQkJCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDEKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIGFjY2Vzc2liaWxpdHkgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5Ci0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5Ci0JCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAxCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFVzYkFjY2Vzc29yeQotCQkJCSMKLQkJCQkjIGFjY2Vzc2liaWxpdHkgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgVVNCIGFjY2Vzc29yeSBub3QgcmVhY2hhYmxlIGluIGNhbGwKLQkJCQkjCi0JCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5Ci0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKLQkJCQkjCi0JCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IERndGxEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwKLQkJCQkjCi0JCQkJIyBhY2Nlc3NpYmlsaXR5IGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEF1eERpZ2l0YWwKLQkJCQkjCi0JCQkJIyBhY2Nlc3NpYmlsaXR5IGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IEhkbWkgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDEKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBBbmxnRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvYWNjZXNzaWJpbGl0eS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEVhcnBpZWNlCi0JCQkJIwotCQkJCSMgYWNjZXNzaWJpbGl0eSBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9hY2Nlc3NpYmlsaXR5L3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAxCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBEZWZhdWx0Ci0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2FjY2Vzc2liaWxpdHkvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2R0bWYucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9kdG1mLnBmdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODgzYzc0MS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2R0bWYucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsNjIzICswLDAgQEAKLXN1cERvbWFpbjogRGV2aWNlRm9yU3RyYXRlZ3kKLQotCXN1cERvbWFpbjogRHRtZgotCi0JCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCi0JCQljb25mOiBDYWxpYnJhdGlvbgotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZm0gPSAwCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBEZXZpY2UyCi0JCQljb25mOiBSZW1vdGVTdWJtaXgKLQkJCQkjCi0JCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgUmVtb3RlU3VibWl4Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAxCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwCi0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHAKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCSMKLQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogRm9yY2VTcGVha2VyV2hlbk5vdEluQ2FsbAotCQkJCSMKLQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKLQkJCQlGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyBJc05vdCBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvSGVhZHNldAotCQkJCSMKLQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvSGVhZHNldAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY28KLQkJCQkjCi0JCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbwotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAxCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRwaG9uZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMQotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIyBidXQgTGluZSBoYXMgYSBsb3dlciBwcmlvcml0eSB0aGFuIFdpcmVkSGVhZHNldCBpbiB0aGlzIGNhc2UuCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFdpcmVkSGVhZHNldAotCQkJCQkjCi0JCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAxCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHNldAotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJIwotCQkJCQkjIERUTUYgZm9sbG93cyBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5Ci0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5Ci0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMQotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFVzYkFjY2Vzc29yeQotCQkJCSMKLQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgVVNCIGFjY2Vzc29yeSBub3QgcmVhY2hhYmxlIGluIGNhbGwKLQkJCQkjCi0JCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIE1lZGlhIHN0cmF0ZWd5IGludmVydHMgdGhlIHByaW9yaXR5IG9mIFVTQiBkZXZpY2UgdnMgYWNjZXNzb3J5Ci0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogRGd0bERvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBEZ3RsRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIERndGxEb2NrSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogSGRtaQotCQkJCSMKLQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgSGRtaSBub3QgcmVhY2hhYmxlIGluIGNhbGwKLQkJCQkjCi0JCQkJIyBEVE1GIGZvbGxvd3MgTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMQotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgRFRNRiBmYWxscyB0aHJvdWdoIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBBbmxnRG9ja0hlYWRzZXQgbm90IHJlYWNoYWJsZSBpbiBjYWxsCi0JCQkJIwotCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIyBNZWRpYSBzdHJhdGVneSBpbnZlcnRzIHRoZSBwcmlvcml0eSBvZiBVU0IgZGV2aWNlIHZzIGFjY2Vzc29yeQotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JEb2NrIElzIEZvcmNlQW5hbG9nRG9jawotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBFYXJwaWVjZQotCQkJCSMKLQkJCQkjIERUTUYgZmFsbHMgdGhyb3VnaCBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMQotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBTcGVha2VyCi0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBEVE1GIGZhbGxzIHRocm91Z2ggUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgotCQkJCQkjCi0JCQkJCSMgRFRNRiBmb2xsb3dzIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMQotCi0JCQljb25mOiBEZWZhdWx0Ci0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2R0bWYvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQlkb21haW46IEFyYwotCQkJIwotCQkJIyBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCi0JCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKLQkJCSMKLQkJCWNvbmY6IFNlbGVjdGVkCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgSGRtaUFyYwotCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAwCi0KLQkJZG9tYWluOiBTcGRpZgotCQkJIwotCQkJIyBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCi0JCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKLQkJCSMKLQkJCWNvbmY6IFNlbGVjdGVkCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BkaWYKLQotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMQotCi0JCQljb25mOiBOb3RTZWxlY3RlZAotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZHRtZi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMAotCi0JCWRvbWFpbjogQXV4TGluZQotCQkJIwotCQkJIyBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCSMgdGhlc2UgZm9sbG93aW5nIGRvbWFpbnMgY29uc2lzdHMgaW4gZGV2aWNlKHMpIHRoYXQgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzCi0JCQkjIGUuZy4gQVJDLCBTUERJRiwgQVVYX0xJTkUKLQkJCSMKLQkJCWNvbmY6IFNlbGVjdGVkCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQXV4TGluZQotCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9kdG1mL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9lbmZvcmNlZF9hdWRpYmxlLnBmdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwNDYzMS4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X2VuZm9yY2VkX2F1ZGlibGUucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLXN1cERvbWFpbjogRGV2aWNlRm9yU3RyYXRlZ3kKLQotCXN1cERvbWFpbjogRW5mb3JjZWRBdWRpYmxlCi0KLQkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKLQkJCWNvbmY6IENhbGlicmF0aW9uCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQkjIG5vIGVuZm9yY2VkX2F1ZGlibGUgb24gcmVtb3RlIHN1Ym1peCAoZS5nLiBXRkQpCi0JCQkJCWhkbWlfYXJjID0gMAotCQkJCQlzcGRpZiA9IDAKLQkJCQkJYXV4X2xpbmUgPSAwCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJaXAgPSAwCi0JCQkJCWJ1cyA9IDAKLQkJCQkJZm0gPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBTcGVha2VyCi0JCQljb25mOiBTZWxlY3RlZAotCQkJCSMKLQkJCQkjIHN0cmF0ZWd5IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUgdXNlcyBzYW1lIHJvdXRpbmcgcG9saWN5IGFzIFNUUkFURUdZX1NPTklGSUNBVElPTgotCQkJCSMgZXhjZXB0OgotCQkJCSMgICAgLSB3aGVuIGluIGNhbGwgd2hlcmUgaXQgZG9lc24ndCBkZWZhdWx0IHRvIFNUUkFURUdZX1BIT05FIGJlaGF2aW9yCi0JCQkJIyAgICAtIGluIGNvdW50cmllcyB3aGVyZSBub3QgZW5mb3JjZWQgaW4gd2hpY2ggY2FzZSBpdCBmb2xsb3dzIFNUUkFURUdZX01FRElBCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCQkJCUFOWQotCQkJCQlGb3JjZVVzZUZvclN5c3RlbSBJcyBGb3JjZVN5c3RlbUVuZm9yY2VkCi0JCQkJCUFMTAotCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgUmVtb3RlU3VibWl4Ci0JCQkJCQlBTlkKLQkJCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEJsdWV0b290aEEyZHAKLQkJCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCQkjCi0JCQkJCSMgU3BlYWtlciBpcyBhbHNvIHRoZSBmYWxsYmFjayBkZXZpY2UgaWYgYW55IG9mIHRoZSBkZXZpY2UgZnJvbSBEZXZpY2UyIGRvbWFpbgotCQkJCQkjIGlzIHNlbGVjdGVkLgotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBSZW1vdGVTdWJtaXgKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkcGhvbmUKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgTGluZQotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5Ci0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkRldmljZQotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgSGRtaQotCQkJCQkJQU5ZCi0JCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQkJCQkJCQlGb3JjZVVzZUZvckRvY2sgSXNOb3QgRm9yY2VBbmFsb2dEb2NrCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCi0JCWRvbWFpbjogRGV2aWNlMgotCQkJY29uZjogUmVtb3RlU3VibWl4Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkcGhvbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBMaW5lCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMQotCi0JCQljb25mOiBXaXJlZEhlYWRzZXQKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogVXNiQWNjZXNzb3J5Ci0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL2VuZm9yY2VkX2F1ZGlibGUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDEKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogSGRtaQotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvZW5mb3JjZWRfYXVkaWJsZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMQotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBOb0RldmljZQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9lbmZvcmNlZF9hdWRpYmxlL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfbWVkaWEucGZ3IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9tZWRpYS5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkYjZhZTAuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9tZWRpYS5wZncKKysrIC9kZXYvbnVsbApAQCAtMSwzMzggKzAsMCBAQAotZG9tYWluR3JvdXA6IERldmljZUZvclN0cmF0ZWd5Ci0KLQlkb21haW5Hcm91cDogTWVkaWEKLQotCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcwotCQkJY29uZjogQ2FsaWJyYXRpb24KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlmbSA9IDAKLQkJCQkJc3BlYWtlcl9zYWZlID0gMAotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlpcCA9IDAKLQkJCQkJYnVzID0gMAotCQkJCQlzdHViID0gMAotCi0JCWRvbWFpbjogRGV2aWNlMgotCQkJY29uZjogUmVtb3RlU3VibWl4Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBSZW1vdGVTdWJtaXgKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDEKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZUJ0U2NvCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAxCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmUKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VCdFNjbwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VCdFNjbwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogRm9yY2VTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBJZiBoZG1pIHN5c3RlbSBhdWRpbyBtb2RlIGlzIG9uLCByZW1vdmUgc3BlYWtlciBvdXQgb2Ygb3V0cHV0IGxpc3QuCi0JCQkJIwotCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMQotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHBob25lCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBMaW5lCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBMaW5lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAxCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgV2lyZWRIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFVzYkFjY2Vzc29yeQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAxCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IERndGxEb2NrSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEF1eERpZ2l0YWwKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAxCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBBbmxnRG9ja0hlYWRzZXQKLQkJCQlGb3JjZVVzZUZvckRvY2sgSXMgRm9yY2VBbmFsb2dEb2NrCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBJZiBoZG1pIHN5c3RlbSBhdWRpbyBtb2RlIGlzIG9uLCByZW1vdmUgc3BlYWtlciBvdXQgb2Ygb3V0cHV0IGxpc3QuCi0JCQkJIwotCQkJCUZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIElzTm90IEZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlQnRTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAxCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogRGVmYXVsdAotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQlkb21haW46IEFyYwotCQkJIwotCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKLQkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQotCQkJIwotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWlBcmMKLQotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9oZG1pX2FyYyA9IDEKLQotCQkJY29uZjogTm90U2VsZWN0ZWQKLQkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svaGRtaV9hcmMgPSAwCi0KLQkJZG9tYWluOiBTcGRpZgotCQkJIwotCQkJIyB0aGVzZSBmb2xsb3dpbmcgZG9tYWlucyBjb25zaXN0cyBpbiBkZXZpY2UocykgdGhhdCBjYW4gY28tZXhpc3Qgd2l0aCBvdGhlcnMKLQkJCSMgZS5nLiBBUkMsIFNQRElGLCBBVVhfTElORQotCQkJIwotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZGlmCi0KLQkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svc3BkaWYgPSAxCi0KLQkJCWNvbmY6IE5vdFNlbGVjdGVkCi0JCQkJL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9tZWRpYS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrL3NwZGlmID0gMAotCi0JCWRvbWFpbjogQXV4TGluZQotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEF1eExpbmUKLQotCQkJCS9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvbWVkaWEvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzay9hdXhfbGluZSA9IDEKLQotCQkJY29uZjogTm90U2VsZWN0ZWQKLQkJCQkvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL21lZGlhL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2svYXV4X2xpbmUgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Bob25lLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcGhvbmUucGZ3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzcxYWQ5Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcGhvbmUucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsNDgzICswLDAgQEAKLXN1cERvbWFpbjogRGV2aWNlRm9yU3RyYXRlZ3kKLQotCXN1cERvbWFpbjogUGhvbmUKLQotCQlkb21haW46IFVucmVhY2hhYmxlRGV2aWNlcwotCQkJY29uZjogQ2FsaWJyYXRpb24KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQkjIG5vIHNvbmlmaWNhdGlvbiBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJaGRtaV9hcmMgPSAwCi0JCQkJCWF1eF9saW5lID0gMAotCQkJCQlzcGRpZiA9IDAKLQkJCQkJZm0gPSAwCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJaXAgPSAwCi0JCQkJCWJ1cyA9IDAKLQkJCQkJc3R1YiA9IDAKLQotCQlkb21haW46IERldmljZQotCQkJY29uZjogU2NvQ2Fya2l0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29DYXJraXQKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY29IZWFkc2V0Ci0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDEKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoU2NvCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDEKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhBMmRwCi0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZU5vbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBXaXJlZEhlYWRzZXQKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHNldAotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMQotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDEKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogVXNiRGV2aWNlCi0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBVc2JEZXZpY2UKLQkJCQlBTlkKLQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlTm9uZQotCQkJCQlBTEwKLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZVNwZWFrZXIKLQkJCQkJCSMKLQkJCQkJCSMgSW4gY2FzZSBvZiBGb3JjZSBTcGVha2VyLCBwcmlvcml0eSBiZXR3ZWVuIGRldmljZSBhbmQgYWNjZXNzb3J5IGFyZQotCQkJCQkJIyBpbnZlcnRlZCBjb21wYXJlZCB0byBGb3JjZSBOb25lIG9yIEJ0IFNjbwotCQkJCQkJIwotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBVc2JBY2Nlc3NvcnkKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDEKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBVc2JBY2Nlc3NvcnkKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9waG9uZS9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQloZG1pID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAxCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogRGd0bERvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgRmFsbGJhY2sgQlQgU2NvIGRldmljZXMgaW4gY2FzZSBvZiBGT1JDRV9CVF9TQ08KLQkJCQkjIG9yIEZPUkNFX05PTkUKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEhkbWkKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEhkbWkKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IEFubGdEb2NrSGVhZHNldAotCQkJCSMKLQkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCi0JCQkJIyBvciBGT1JDRV9OT05FCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQW5sZ0RvY2tIZWFkc2V0Ci0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMAotCi0JCQljb25mOiBFYXJwaWVjZQotCQkJCSMKLQkJCQkjIEZhbGxiYWNrIEJUIFNjbyBkZXZpY2VzIGluIGNhc2Ugb2YgRk9SQ0VfQlRfU0NPCi0JCQkJIyBvciBGT1JDRV9OT05FCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRWFycGllY2UKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDEKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0KLQkJCWNvbmY6IFNwZWFrZXIKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBCVCBTY28gZGV2aWNlcyBpbiBjYXNlIG9mIEZPUkNFX0JUX1NDTwotCQkJCSMgb3IgRk9SQ0VfTk9ORQotCQkJCSMKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcGhvbmUvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJaGRtaSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCXNwZWFrZXIgPSAxCi0KLQkJCWNvbmY6IERlZmF1bHQKLQkJCQkjCi0JCQkJIyBGYWxsYmFjayBvbiBkZWZhdWx0IG91dHB1dCBkZXZpY2Ugd2hpY2ggY2FuIGJlIHNwZWFrZXIgZm9yIGV4YW1wbGUKLQkJCQkjCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Bob25lL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlzcGVha2VyID0gMQotCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfcmVyb3V0aW5nLnBmdwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDRlNjJmNy4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3Jlcm91dGluZy5wZncKKysrIC9kZXYvbnVsbApAQCAtMSwzMDAgKzAsMCBAQAotZG9tYWluR3JvdXA6IERldmljZUZvclN0cmF0ZWd5Ci0KLQlkb21haW5Hcm91cDogUmVyb3V0aW5nCi0JCSMKLQkJIyBGYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5Ci0JCSMKLQkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKLQkJCWNvbmY6IENhbGlicmF0aW9uCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWhkbWlfYXJjID0gMAotCQkJCQlzcGRpZiA9IDAKLQkJCQkJYXV4X2xpbmUgPSAwCi0JCQkJCWZtID0gMAotCQkJCQlzcGVha2VyX3NhZmUgPSAwCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBEZXZpY2UyCi0JCQljb25mOiBSZW1vdGVTdWJtaXgKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFJlbW90ZVN1Ym1peAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZQotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZU5vQnRBMmRwCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMQotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRm9yY2VTcGVha2VyCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJcyBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHBob25lCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAxCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDEKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFVzYkFjY2Vzc29yeQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBVc2JEZXZpY2UKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3Jlcm91dGluZy9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlzcGVha2VyID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDEKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRGd0bERvY2tIZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBEZ3RsRG9ja0hlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEF1eERpZ2l0YWwKLQkJCQkjCi0JCQkJIyBSZXJvdXRpbmcgaXMgc2ltaWxhciB0byBtZWRpYSBhbmQgc29uaWZpY2F0aW9uIChleGVwdCBoZXJlOiBzb25pZmljYXRpb24gaXMgbm90IGFsbG93ZWQgb24gSERNSSkKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMQotCi0JCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAotCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9yZXJvdXRpbmcvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IERlZmF1bHQKLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvcmVyb3V0aW5nL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCXNwZWFrZXIgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbi5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbi5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwNzQwZDEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV9zb25pZmljYXRpb24ucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsNDkwICswLDAgQEAKLXN1cERvbWFpbjogRGV2aWNlRm9yU3RyYXRlZ3kKLQotCXN1cERvbWFpbjogU29uaWZpY2F0aW9uCi0KLQkJZG9tYWluOiBVbnJlYWNoYWJsZURldmljZXMKLQkJCWNvbmY6IENhbGlicmF0aW9uCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCSMgbm8gc29uaWZpY2F0aW9uIG9uIHJlbW90ZSBzdWJtaXggKGUuZy4gV0ZEKQotCQkJCQlyZW1vdGVfc3VibWl4ID0gMAotCQkJCQloZG1pX2FyYyA9IDAKLQkJCQkJc3BkaWYgPSAwCi0JCQkJCWZtID0gMAotCQkJCQlzcGVha2VyX3NhZmUgPSAwCi0JCQkJCWF1eF9saW5lID0gMAotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCBidXQgSERNSSBpcyBub3QgcmVhY2hhYmxlCi0JCQkJCSMKLQkJCQkJaGRtaSA9IDAKLQkJCQkJaXAgPSAwCi0JCQkJCWJ1cyA9IDAKLQkJCQkJc3R1YiA9IDAKLQotCQlkb21haW46IFNwZWFrZXIKLQotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIEVORk9SQ0VEX0FVRElCTEUgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkJIwotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlU3BlYWtlcgotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBMaW5lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDEKLQotCQkJY29uZjogTm90U2VsZWN0ZWQKLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJc3BlYWtlciA9IDAKLQotCQlkb21haW46IERldmljZTIKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBIZWFkcGhvbmVzCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwSGVhZHBob25lcwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhBMmRwU3BlYWtlcgotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFNjb0NhcmtpdAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0NhcmtpdAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAxCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogU2NvSGVhZHNldAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IFNjbwotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmb2xsb3dzIHBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjbwotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAxCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogV2lyZWRIZWFkcGhvbmUKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCi0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAxCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogTGluZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgTGluZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uIGZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkjIGJ1dCBMaW5lIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gV2lyZWRIZWFkc2V0IGluIHRoaXMgY2FzZS4KLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgV2lyZWRIZWFkc2V0Ci0JCQkJCSMKLQkJCQkJIyBTb25pZmljYXRpb24gZmFsbHMgdGhyb3VnaCBtZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDEKLQotCQkJY29uZjogV2lyZWRIZWFkc2V0Ci0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKLQkJCQlBTlkKLQkJCQkJIwotCQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJCSMKLQkJCQkJQUxMCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCUFMTAotCQkJCQkJIwotCQkJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJCQkjCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBVc2JEZXZpY2UKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkRldmljZQotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgRXhjbHVkZXMgVXNiQWNjZXNzb3J5Ci0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCUFMTAotCQkJCQkJIwotCQkJCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJCQkjCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDEKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBVc2JBY2Nlc3NvcnkKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFVzYkFjY2Vzc29yeQotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IFVTQiBBY2Nlc3Nvcnkgbm90IHJlYWNoYWJsZSBpbiBjYWxsLgotCQkJCSMKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IERndGxEb2NrSGVhZHNldAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIGZhbGxzIHRocm91Z2ggbWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb24gRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBpbiBjYWxsICh3aWRlbHkgc3BlYWtpbmcpCi0JCQkJIyBidXQgRGd0bERvY2tIZWFkc2V0IG5vdCByZWFjaGFibGUgaW4gY2FsbC4KLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDEKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCi0JCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvbiBmYWxscyB0aHJvdWdoIG1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAxCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCi0KLQkJCWNvbmY6IEVhcnBpZWNlCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uIEZvbGxvd3MgUGhvbmUgU3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbi9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMQotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCXRlbGVwaG9ueV90eCA9IDAKLQkJCQkJbGluZSA9IDAKLQotCQkJY29uZjogTm9uZQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb24vc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWxpbmUgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNjczYzRmLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL2RldmljZV9mb3Jfc3RyYXRlZ3lfc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsNTUzICswLDAgQEAKLWRvbWFpbkdyb3VwOiBEZXZpY2VGb3JTdHJhdGVneQotCi0JZG9tYWluR3JvdXA6IFNvbmlmaWNhdGlvblJlc3BlY3RmdWwKLQkJIwotCQkjIFNvbmlmaWNpYXRpb24gUmVzcGVjdGZ1bCBmb2xsb3dzOgotCQkjCS0gSWYgaW4gY2FsbDogU3RyYXRlZ3kgc29uaWZpY2F0aW9uICh0aGF0IGZvbGxvd3MgcGhvbmUgc3RyYXRlZ3kgaW4gY2FsbCBhbHNvLi4uKQotCQkjCS0gSWYgbm90IGluIGNhbGwgQU5EIGEgbXVzaWMgc3RyZWFtIGlzIGFjdGl2ZSByZW1vdGVseTogU3RyYXRlZ3kgc29uaWZpY2F0aW9uICh0aGF0Ci0JCSMgICAgIGZvbGxvd3MgZW5mb3JjZWQgYXVkaWJsZSwgd2hpY2ggZm9sbG93cyBtZWRpYSkKLQkJIwktIGlmIG5vdCBpbiBjYWxsIGFuZCBubyBtdXNpYyBzdHJlYW0gYWN0aXZlIHJlbW90ZWx5IGFuZCBtdXNpYyBzdHJlYW0gYWN0aXZlKTogc3RyYXRlZ3kKLQkJIyAgICAgbWVkaWEKLQkJIyAgIC0gT3RoZXJ3aXNlIGZvbGxvd3Mgc29uaWZpY2F0aW9uIGJ5IHJlcGxhY2luZyBzcGVha2VyIHdpdGggc3BlYWtlciBzYWZlIGlmIHNwZWFrZXIgaXMKLQkJIwkgIHNlbGVjdGVkLgotCQkjCi0JCSMgQ2FzZSBvZiBzdHJlYW0gYWN0aXZlIGhhbmRsZWQgcHJvZ3JhbW1hdGljYWxseQotCi0JCWRvbWFpbjogVW5yZWFjaGFibGVEZXZpY2VzCi0JCQljb25mOiBDYWxpYnJhdGlvbgotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXJlbW90ZV9zdWJtaXggPSAwCi0JCQkJCWhkbWlfYXJjID0gMAotCQkJCQlhdXhfbGluZSA9IDAKLQkJCQkJc3BkaWYgPSAwCi0JCQkJCWZtID0gMAotCQkJCQl0ZWxlcGhvbnlfdHggPSAwCi0JCQkJCWlwID0gMAotCQkJCQlidXMgPSAwCi0JCQkJCXN0dWIgPSAwCi0KLQkJZG9tYWluOiBTcGVha2VycwotCi0JCQljb25mOiBTcGVha2VyU2FmZQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlclNhZmUKLQkJCQkjCi0JCQkJIyBGb2xsb3dzIHNvbmlmaWNhdGlvbiBzdHJhdGVneSBpZiBub3QgaW4gY2FsbCBhbmQgcmVwbGFjZSBzcGVha2VyIGJ5IHNwZWFrZXIgc2FmZQotCQkJCSMgaWYgYW5kIG9ubHkgaWYgc3BlYWtlciBvbmx5IHNlbGVjdGVkCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDEKLQkJCQkJc3BlYWtlciA9IDAKLQotCQkJY29uZjogU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgU3BlYWtlcgotCQkJCUFOWQotCQkJCQkjCi0JCQkJCSMgRm9sbG93cyBzb25pZmljYXRpb24gc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgRm9sbG93cyBQaG9uZSBTdHJhdGVneSBpZiBjYWxsCi0JCQkJCQkjCi0JCQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VTcGVha2VyCi0JCQkJCQlBTlkKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIExpbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJc3BlYWtlciA9IDEKLQotCQkJY29uZjogTm9uZQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJc3BlYWtlciA9IDAKLQotCQlkb21haW46IERldmljZTIKLQkJCWNvbmY6IEJsdWV0b290aEEyZHAKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMQotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VOb0J0QTJkcAotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMQotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aEEyZHBTcGVha2VyCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlTm9CdEEyZHAKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aEEyZHBTcGVha2VyCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY29DYXJraXQKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXMgRm9yY2VCdFNjbwotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgQmx1ZXRvb3RoU2NvQ2Fya2l0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDEKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBCbHVldG9vdGhTY29IZWFkc2V0Ci0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkjCi0JCQkJQU5ZCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5Db21tdW5pY2F0aW9uCi0JCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzIEZvcmNlQnRTY28KLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEJsdWV0b290aFNjb0hlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAxCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IEJsdWV0b290aFNjbwotCQkJCSMKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBQaG9uZSBzdHJhdGVneSBpZiBpbiBjYWxsCi0JCQkJIwotCQkJCUFOWQotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ2FsbAotCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJcyBGb3JjZUJ0U2NvCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBCbHVldG9vdGhTY28KLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMQotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHBob25lCi0JCQkJQU5ZCi0JCQkJCUFMTAotCQkJCQkJIwotCQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCQkJIwotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKLQkJCQkJCSMKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFdpcmVkSGVhZHBob25lCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDEKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBMaW5lCi0JCQkJQU5ZCi0JCQkJCSMKLQkJCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCQkjIGJ1dCBMaW5lIGhhcyBhIGxvd2VyIHByaW9yaXR5IHRoYW4gV2lyZWRIZWFkc2V0IGluIHRoaXMgY2FzZS4KLQkJCQkJIwotCQkJCQkjCi0JCQkJCUFMTAotCQkJCQkJQU5ZCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJCQlUZWxlcGhvbnlNb2RlIElzIEluQ29tbXVuaWNhdGlvbgotCQkJCQkJRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBFeGNsdWRlcyBXaXJlZEhlYWRzZXQKLQkJCQkJIwotCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKLQkJCQkJIwotCQkJCQlBTEwKLQkJCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRwaG9uZQotCQkJCQkJRm9yY2VVc2VGb3JNZWRpYSBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIExpbmUKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMQotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFdpcmVkSGVhZHNldAotCQkJCUFOWQotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJCSMKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJQUxMCi0JCQkJCQkjCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJCQkjCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBXaXJlZEhlYWRzZXQKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDEKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCi0KLQkJCWNvbmY6IFVzYkRldmljZQotCQkJCUFOWQotCQkJCQlBTEwKLQkJCQkJCSMKLQkJCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwKLQkJCQkJCSMKLQkJCQkJCUFOWQotCQkJCQkJCVRlbGVwaG9ueU1vZGUgSXMgSW5DYWxsCi0JCQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiBJc05vdCBGb3JjZVNwZWFrZXIKLQkJCQkJQUxMCi0JCQkJCQkjCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgRm9sbG93cyBTb25pZmljYXRpb24gdGhhdCBmYWxscyB0aHJvdWdoIE1lZGlhIHN0cmF0ZWd5IGlmIG5vdCBpbiBjYWxsCi0JCQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJCQkjCi0JCQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ2FsbAotCQkJCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEV4Y2x1ZGVzIFVzYkFjY2Vzc29yeQotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiRGV2aWNlCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMQotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBVc2JBY2Nlc3NvcnkKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IFVzYkFjY2Vzc29yeSBub3QgcmVhY2hhYmxlIGluIGNhbGwuCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgVXNiQWNjZXNzb3J5Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMQotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBEZ3RsRG9ja0hlYWRzZXQKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IERndGxEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUF2YWlsYWJsZU91dHB1dERldmljZXMgSW5jbHVkZXMgRGd0bERvY2tIZWFkc2V0Ci0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMQotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMAotCi0JCQljb25mOiBBdXhEaWdpdGFsCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFBob25lIHN0cmF0ZWd5IGlmIGluIGNhbGwgKHdpZGVseSBzcGVha2luZykKLQkJCQkjIGJ1dCBIRE1JIG5vdCByZWFjaGFibGUgaW4gY2FsbC4KLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgU29uaWZpY2F0aW9uIHRoYXQgZmFsbHMgdGhyb3VnaCBNZWRpYSBzdHJhdGVneSBpZiBub3QgaW4gY2FsbAotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBmb2xsb3dzIG1lZGlhIGlmIG11c2ljIHN0cmVhbSBpcyBhY3RpdmUKLQkJCQkjCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNhbGwKLQkJCQlUZWxlcGhvbnlNb2RlIElzTm90IEluQ29tbXVuaWNhdGlvbgotCQkJCUZvcmNlVXNlRm9yTWVkaWEgSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBIZG1pCi0KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQllYXJwaWVjZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAwCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJbGluZSA9IDAKLQkJCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAotCQkJCQl1c2JfYWNjZXNzb3J5ID0gMAotCQkJCQl1c2JfZGV2aWNlID0gMAotCQkJCQloZG1pID0gMQotCi0JCQljb25mOiBBbmxnRG9ja0hlYWRzZXQKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbCAod2lkZWx5IHNwZWFraW5nKQotCQkJCSMgYnV0IEFubGdEb2NrSGVhZHNldCBub3QgcmVhY2hhYmxlIGluIGNhbGwuCi0JCQkJIwotCQkJCSMgU29uaWZpY2F0aW9uUmVzcGVjdGZ1bCBGb2xsb3dzIFNvbmlmaWNhdGlvbiB0aGF0IGZhbGxzIHRocm91Z2ggTWVkaWEgc3RyYXRlZ3kgaWYgbm90IGluIGNhbGwKLQkJCQkjIFNvbmlmaWNhdGlvblJlc3BlY3RmdWwgZm9sbG93cyBtZWRpYSBpZiBtdXNpYyBzdHJlYW0gaXMgYWN0aXZlCi0JCQkJIwotCQkJCVRlbGVwaG9ueU1vZGUgSXNOb3QgSW5DYWxsCi0JCQkJVGVsZXBob255TW9kZSBJc05vdCBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvck1lZGlhIElzTm90IEZvcmNlU3BlYWtlcgotCQkJCUZvcmNlVXNlRm9yRG9jayBJcyBGb3JjZUFuYWxvZ0RvY2sKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIEFubGdEb2NrSGVhZHNldAotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMQotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogRWFycGllY2UKLQkJCQkjCi0JCQkJIyBTb25pZmljYXRpb25SZXNwZWN0ZnVsIEZvbGxvd3MgUGhvbmUgc3RyYXRlZ3kgaWYgaW4gY2FsbAotCQkJCSMKLQkJCQlBTlkKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNhbGwKLQkJCQkJVGVsZXBob255TW9kZSBJcyBJbkNvbW11bmljYXRpb24KLQkJCQlGb3JjZVVzZUZvckNvbW11bmljYXRpb24gSXNOb3QgRm9yY2VTcGVha2VyCi0JCQkJQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBJbmNsdWRlcyBFYXJwaWVjZQotCi0JCQkJY29tcG9uZW50OiAvUG9saWN5L3BvbGljeS9zdHJhdGVnaWVzL3NvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJZWFycGllY2UgPSAxCi0JCQkJCWJsdWV0b290aF9zY28gPSAwCi0JCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwID0gMAotCQkJCQl3aXJlZF9oZWFkc2V0ID0gMAotCQkJCQl3aXJlZF9oZWFkcGhvbmUgPSAwCi0JCQkJCWxpbmUgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJaGRtaSA9IDAKLQotCQkJY29uZjogTm9uZQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy9zb25pZmljYXRpb25fcmVzcGVjdGZ1bC9zZWxlY3RlZF9vdXRwdXRfZGV2aWNlcy9tYXNrCi0JCQkJCWVhcnBpZWNlID0gMAotCQkJCQlibHVldG9vdGhfc2NvID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCi0JCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAotCQkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAotCQkJCQlibHVldG9vdGhfYTJkcCA9IDAKLQkJCQkJd2lyZWRfaGVhZHNldCA9IDAKLQkJCQkJd2lyZWRfaGVhZHBob25lID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCi0JCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCi0JCQkJCXVzYl9kZXZpY2UgPSAwCi0JCQkJCWhkbWkgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9kZXZpY2VfZm9yX3N0cmF0ZWd5X3RyYW5zbWl0dGVkX3Rocm91Z2hfc3BlYWtlci5wZncKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmOWMyMTEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3MvZGV2aWNlX2Zvcl9zdHJhdGVneV90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsNDMgKzAsMCBAQAotc3VwRG9tYWluOiBEZXZpY2VGb3JTdHJhdGVneQotCi0Jc3VwRG9tYWluOiBUcmFuc21pdHRlZFRocm91Z2hTcGVha2VyCi0JCWRvbWFpbjogVW5yZWFjaGVhYmxlRGV2aWNlcwotCQkJY29uZjogQ2FsaWJyYXRpb24KLQkJCQljb21wb25lbnQ6IC9Qb2xpY3kvcG9saWN5L3N0cmF0ZWdpZXMvdHJhbnNtaXR0ZWRfdGhyb3VnaF9zcGVha2VyL3NlbGVjdGVkX291dHB1dF9kZXZpY2VzL21hc2sKLQkJCQkJcmVtb3RlX3N1Ym1peCA9IDAKLQkJCQkJaGRtaV9hcmMgPSAwCi0JCQkJCXNwZGlmID0gMAotCQkJCQlhdXhfbGluZSA9IDAKLQkJCQkJZm0gPSAwCi0JCQkJCXNwZWFrZXJfc2FmZSA9IDAKLQkJCQkJZWFycGllY2UgPSAwCi0JCQkJCXdpcmVkX2hlYWRzZXQgPSAxCi0JCQkJCXdpcmVkX2hlYWRwaG9uZSA9IDAKLQkJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKLQkJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAotCQkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCi0JCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCi0JCQkJCWhkbWkgPSAwCi0JCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAotCQkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKLQkJCQkJdXNiX2FjY2Vzc29yeSA9IDAKLQkJCQkJdXNiX2RldmljZSA9IDAKLQkJCQkJdGVsZXBob255X3R4ID0gMAotCQkJCQlsaW5lID0gMAotCQkJCQlpcCA9IDAKLQkJCQkJYnVzID0gMAotCQkJCQlzdHViID0gMAotCi0JCWRvbWFpbjogU3BlYWtlcgotCQkJY29uZjogU2VsZWN0ZWQKLQkJCQlBdmFpbGFibGVPdXRwdXREZXZpY2VzIEluY2x1ZGVzIFNwZWFrZXIKLQotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMQotCi0JCQljb25mOiBOb3RTZWxlY3RlZAotCQkJCWNvbXBvbmVudDogL1BvbGljeS9wb2xpY3kvc3RyYXRlZ2llcy90cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIvc2VsZWN0ZWRfb3V0cHV0X2RldmljZXMvbWFzawotCQkJCQlzcGVha2VyID0gMAotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9zdHJhdGVneV9mb3Jfc3RyZWFtLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl9zdHJlYW0ucGZ3CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTQwYjlkLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl9zdHJlYW0ucGZ3CisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotZG9tYWluOiBTdHJhdGVneUZvclN0cmVhbQotCi0JY29uZjogQ2FsaWJyYXRpb24KLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy92b2ljZV9jYWxsL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBwaG9uZQotCQkjCi0JCSMgTk9URTogU1lTVEVNIHN0cmVhbSB1c2VzIE1FRElBIHN0cmF0ZWd5IGJlY2F1c2UgbXV0aW5nIG11c2ljIGFuZCBzd2l0Y2hpbmcgb3V0cHV0cwotCQkjIHdoaWxlIGtleSBjbGlja3MgYXJlIHBsYXllZCBwcm9kdWNlcyBhIHBvb3IgcmVzdWx0Ci0JCSMKLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9zeXN0ZW0vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IG1lZGlhCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmluZy9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gc29uaWZpY2F0aW9uCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvbXVzaWMvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IG1lZGlhCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYWxhcm0vYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IHNvbmlmaWNhdGlvbgotCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL25vdGlmaWNhdGlvbi9hcHBsaWNhYmxlX3N0cmF0ZWd5L3N0cmF0ZWd5ID0gc29uaWZpY2F0aW9uX3Jlc3BlY3RmdWwKLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9ibHVldG9vdGhfc2NvL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBwaG9uZQotCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL2VuZm9yY2VkX2F1ZGlibGUvYXBwbGljYWJsZV9zdHJhdGVneS9zdHJhdGVneSA9IGVuZm9yY2VkX2F1ZGlibGUKLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9kdG1mL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBkdG1mCi0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvdHRzL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSB0cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIKLQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9hY2Nlc3NpYmlsaXR5L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBhY2Nlc3NpYmlsaXR5Ci0JCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSByZXJvdXRpbmcKLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzL3N0cmF0ZWd5X2Zvcl91c2FnZS5wZncKaW5kZXggYjMxMTVlNy4uZmJlYTllMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3Mvc3RyYXRlZ3lfZm9yX3VzYWdlLnBmdworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy9zdHJhdGVneV9mb3JfdXNhZ2UucGZ3CkBAIC0yNCw3ICsyNCw3IEBACiAJCQkjIEluIGNhc2Ugb2YgUmluZyBvciBBbGFybSBzdHJlYW0gdHlwZSBhY3RpdmUsIHN3aXRjaGluZyB0byBzb25pZmljYXRpb24KIAkJCSMgQHRvZG86IGhhbmRsZSB0aGlzIGR5bmFtaWMgY2FzZS4gQXMgYSBXQSwgdXNpbmcgUmluZ3RvbmUgbW9kZS4uLgogCQkJIwotCQkJVGVsZXBob255TW9kZSBJcyBSaW5nVG9uZQorCQkJVGVsZXBob255TW9kZSBJcyBSaW5ndG9uZQogCiAJCQkvUG9saWN5L3BvbGljeS91c2FnZXMvYXNzaXN0YW5jZV9hY2Nlc3NpYmlsaXR5L2FwcGxpY2FibGVfc3RyYXRlZ3kvc3RyYXRlZ3kgPSBzb25pZmljYXRpb24KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3Mvdm9sdW1lcy5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy92b2x1bWVzLnBmdwppbmRleCA3ZGI0NTM3Li5jZjE4NTdlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy92b2x1bWVzLnBmdworKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5ncy92b2x1bWVzLnBmdwpAQCAtMTEsNiArMTEsNyBAQAogCQkJL1BvbGljeS9wb2xpY3kvc3RyZWFtcy9lbmZvcmNlZF9hdWRpYmxlL2FwcGxpY2FibGVfdm9sdW1lX3Byb2ZpbGUvdm9sdW1lX3Byb2ZpbGUgPSBlbmZvcmNlZF9hdWRpYmxlCiAJCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL3R0cy9hcHBsaWNhYmxlX3ZvbHVtZV9wcm9maWxlL3ZvbHVtZV9wcm9maWxlID0gdHRzCiAJCQkvUG9saWN5L3BvbGljeS9zdHJlYW1zL2FjY2Vzc2liaWxpdHkvYXBwbGljYWJsZV92b2x1bWVfcHJvZmlsZS92b2x1bWVfcHJvZmlsZSA9IGFjY2Vzc2liaWxpdHkKKwkJCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvYXNzaXN0YW50L2FwcGxpY2FibGVfdm9sdW1lX3Byb2ZpbGUvdm9sdW1lX3Byb2ZpbGUgPSBhc3Npc3RhbnQKIAkJCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcmVyb3V0aW5nL2FwcGxpY2FibGVfdm9sdW1lX3Byb2ZpbGUvdm9sdW1lX3Byb2ZpbGUgPSByZXJvdXRpbmcKIAkJCS9Qb2xpY3kvcG9saWN5L3N0cmVhbXMvcGF0Y2gvYXBwbGljYWJsZV92b2x1bWVfcHJvZmlsZS92b2x1bWVfcHJvZmlsZSA9IHBhdGNoCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzTm9JbnB1dC9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3NOb0lucHV0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFiY2I3MAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzTm9JbnB1dC9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyBJbXBvcnQgdGhpcyBuYW1lc3BhY2UgaW4gb3JkZXIgdG8gdXNlIEFPU1AgTm8gSW5wdXQgY29uZmlndXJhdGlvbiBleGFtcGxlCisKK3Nvb25nX25hbWVzcGFjZSB7CisgICAgaW1wb3J0czogWworICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvY29uZmlnL2V4YW1wbGUvcGhvbmUiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb25maWciLAorICAgIF0sCit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogInBhcmFtZXRlci1mcmFtZXdvcmsucG9saWN5IiwKKyAgICBmaWxlbmFtZV9mcm9tX3NyYzogdHJ1ZSwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjOiAiOmRvbWFpbmdlbmVyYXRvcnBvbGljeXJ1bGVfZ2VuIiwKKyAgICBzdWJfZGlyOiAicGFyYW1ldGVyLWZyYW1ld29yay9TZXR0aW5ncy9Qb2xpY3kiLAorICAgIHJlcXVpcmVkOiBbCisgICAgICAgICJQb2xpY3lDbGFzcy54bWwiLAorICAgICAgICAiUG9saWN5U3Vic3lzdGVtLnhtbCIsCisgICAgICAgICJQb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sIiwKKyAgICBdLAorfQorCitnZW5ydWxlIHsKKyAgICBuYW1lOiAiZG9tYWluZ2VuZXJhdG9ycG9saWN5cnVsZV9nZW4iLAorICAgIGRlZmF1bHRzOiBbImRvbWFpbmdlbmVyYXRvcnBvbGljeXJ1bGUiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICI6YXVkaW9fcG9saWN5X3Bmd190b3BsZXZlbCIsCisgICAgICAgICI6YXVkaW9fcG9saWN5X3Bmd19zdHJ1Y3R1cmVfZmlsZXMiLAorICAgICAgICAiOmF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzIiwKKyAgICAgICAgIjplZGRfZmlsZXMiLAorICAgIF0sCit9CitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJhdWRpb19wb2xpY3lfcGZ3X3RvcGxldmVsIiwKKyAgICBzcmNzOiBbIjpQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnVzZXJkZWJ1Zy54bWwiXSwKK30KK2ZpbGVncm91cCB7CisgICAgbmFtZTogImF1ZGlvX3BvbGljeV9wZndfc3RydWN0dXJlX2ZpbGVzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICI6UG9saWN5Q2xhc3MiLAorICAgICAgICAiOlBvbGljeVN1YnN5c3RlbSIsCisgICAgICAgICI6YnVpbGRjb21tb250eXBlc3N0cnVjdHVyZV9nZW4iLAorICAgIF0sCit9CitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJlZGRfZmlsZXMiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImRldmljZV9mb3JfaW5wdXRfc291cmNlLnBmdyIsCisgICAgICAgICI6dm9sdW1lcy5wZnciLAorICAgIF0sCit9CitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJQb2xpY3lTdWJzeXN0ZW0ueG1sIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjOiAiOlBvbGljeVN1YnN5c3RlbS1uby1zdHJhdGVneSIsCisgICAgc3ViX2RpcjogInBhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeSIsCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5nc05vT3V0cHV0L0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5nc05vT3V0cHV0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjcxNzJhNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzTm9PdXRwdXQvQW5kcm9pZC5icApAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gSW1wb3J0IHRoaXMgbmFtZXNwYWNlIGluIG9yZGVyIHRvIHVzZSBBT1NQIE5vIG91dHB1dCBjb25maWd1cmF0aW9uIGV4YW1wbGUKKworc29vbmdfbmFtZXNwYWNlIHsKKyAgICBpbXBvcnRzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9jb25maWcvZXhhbXBsZS9waG9uZSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2NvbmZpZyIsCisgICAgXSwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAicGFyYW1ldGVyLWZyYW1ld29yay5wb2xpY3kiLAorICAgIGZpbGVuYW1lX2Zyb21fc3JjOiB0cnVlLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmM6ICI6ZG9tYWluZ2VuZXJhdG9ycG9saWN5cnVsZV9nZW4iLAorICAgIHN1Yl9kaXI6ICJwYXJhbWV0ZXItZnJhbWV3b3JrL1NldHRpbmdzL1BvbGljeSIsCisgICAgcmVxdWlyZWQ6IFsKKyAgICAgICAgIlBvbGljeUNsYXNzLnhtbCIsCisgICAgICAgICJQb2xpY3lTdWJzeXN0ZW0ueG1sIiwKKyAgICAgICAgIlBvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwiLAorICAgIF0sCit9CitnZW5ydWxlIHsKKyAgICBuYW1lOiAiZG9tYWluZ2VuZXJhdG9ycG9saWN5cnVsZV9nZW4iLAorICAgIGRlZmF1bHRzOiBbImRvbWFpbmdlbmVyYXRvcnBvbGljeXJ1bGUiXSwKKyAgICBzcmNzOiBbCisgICAgICAgICI6YXVkaW9fcG9saWN5X3Bmd190b3BsZXZlbCIsCisgICAgICAgICI6YXVkaW9fcG9saWN5X3Bmd19zdHJ1Y3R1cmVfZmlsZXMiLAorICAgICAgICAiOmF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzIiwKKyAgICAgICAgIjplZGRfZmlsZXMiLAorICAgIF0sCit9CitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJhdWRpb19wb2xpY3lfcGZ3X3RvcGxldmVsIiwKKyAgICBzcmNzOiBbIjpQYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnVzZXJkZWJ1Zy54bWwiXSwKK30KK2ZpbGVncm91cCB7CisgICAgbmFtZTogImF1ZGlvX3BvbGljeV9wZndfc3RydWN0dXJlX2ZpbGVzIiwKKyAgICBzcmNzOiBbCisgICAgICAgICI6UG9saWN5Q2xhc3MiLAorICAgICAgICAiOlBvbGljeVN1YnN5c3RlbSIsCisgICAgICAgICI6YnVpbGRjb21tb250eXBlc3N0cnVjdHVyZV9nZW4iLAorICAgIF0sCit9CitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJlZGRfZmlsZXMiLAorICAgIHNyY3M6IFsKKyAgICAgICAgImRldmljZV9mb3Jfc3RyYXRlZ2llcy5wZnciLAorICAgICAgICAiOnZvbHVtZXMucGZ3IiwKKyAgICAgICAgIjpkZXZpY2VfZm9yX2lucHV0X3NvdXJjZS5wZnciLAorICAgIF0sCit9CitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJQb2xpY3lTdWJzeXN0ZW0ueG1sIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjOiAiOlBvbGljeVN1YnN5c3RlbS1uby1zdHJhdGVneSIsCisgICAgc3ViX2RpcjogInBhcmFtZXRlci1mcmFtZXdvcmsvU3RydWN0dXJlL1BvbGljeSIsCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5nc05vT3V0cHV0L2RldmljZV9mb3Jfc3RyYXRlZ2llcy5wZncgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TZXR0aW5nc05vT3V0cHV0L2RldmljZV9mb3Jfc3RyYXRlZ2llcy5wZncKaW5kZXggOTE3ZDRhNy4uZTI1OWMwMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU2V0dGluZ3NOb091dHB1dC9kZXZpY2VfZm9yX3N0cmF0ZWdpZXMucGZ3CisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1NldHRpbmdzTm9PdXRwdXQvZGV2aWNlX2Zvcl9zdHJhdGVnaWVzLnBmdwpAQCAtOSwxMSArOSwxMSBAQAogCQkJCWJsdWV0b290aF9zY28gPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCWJsdWV0b290aF9hMmRwID0gMD4KKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAogCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCiAJCQkJaGRtaSA9IDAKLQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKIAkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKIAkJCQl1c2JfYWNjZXNzb3J5ID0gMAogCQkJCXVzYl9kZXZpY2UgPSAwCkBAIC0zNywxMSArMzcsMTEgQEAKIAkJCQlibHVldG9vdGhfc2NvID0gMAogCQkJCWJsdWV0b290aF9zY29faGVhZHNldCA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2NhcmtpdCA9IDAKLQkJCQlibHVldG9vdGhfYTJkcCA9IDA+CisJCQkJYmx1ZXRvb3RoX2EyZHAgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9zcGVha2VyID0gMAogCQkJCWhkbWkgPSAwCi0JCQkJYW5nbF9kb2NrX2hlYWRzZXQgPSAwCisJCQkJYW5sZ19kb2NrX2hlYWRzZXQgPSAwCiAJCQkJZGd0bF9kb2NrX2hlYWRzZXQgPSAwCiAJCQkJdXNiX2FjY2Vzc29yeSA9IDAKIAkJCQl1c2JfZGV2aWNlID0gMApAQCAtNjUsMTEgKzY1LDExIEBACiAJCQkJYmx1ZXRvb3RoX3NjbyA9IDAKIAkJCQlibHVldG9vdGhfc2NvX2hlYWRzZXQgPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19jYXJraXQgPSAwCi0JCQkJYmx1ZXRvb3RoX2EyZHAgPSAwPgorCQkJCWJsdWV0b290aF9hMmRwID0gMAogCQkJCWJsdWV0b290aF9hMmRwX2hlYWRwaG9uZXMgPSAwCiAJCQkJYmx1ZXRvb3RoX2EyZHBfc3BlYWtlciA9IDAKIAkJCQloZG1pID0gMAotCQkJCWFuZ2xfZG9ja19oZWFkc2V0ID0gMAorCQkJCWFubGdfZG9ja19oZWFkc2V0ID0gMAogCQkJCWRndGxfZG9ja19oZWFkc2V0ID0gMAogCQkJCXVzYl9hY2Nlc3NvcnkgPSAwCiAJCQkJdXNiX2RldmljZSA9IDAKQEAgLTkzLDExICs5MywxMSBAQAogCQkJCWJsdWV0b290aF9zY28gPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCWJsdWV0b290aF9hMmRwID0gMD4KKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAogCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCiAJCQkJaGRtaSA9IDAKLQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKIAkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKIAkJCQl1c2JfYWNjZXNzb3J5ID0gMAogCQkJCXVzYl9kZXZpY2UgPSAwCkBAIC0xMjEsMTEgKzEyMSwxMSBAQAogCQkJCWJsdWV0b290aF9zY28gPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCWJsdWV0b290aF9hMmRwID0gMD4KKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAogCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCiAJCQkJaGRtaSA9IDAKLQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKIAkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKIAkJCQl1c2JfYWNjZXNzb3J5ID0gMAogCQkJCXVzYl9kZXZpY2UgPSAwCkBAIC0xNDksMTEgKzE0OSwxMSBAQAogCQkJCWJsdWV0b290aF9zY28gPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCWJsdWV0b290aF9hMmRwID0gMD4KKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAogCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCiAJCQkJaGRtaSA9IDAKLQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKIAkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKIAkJCQl1c2JfYWNjZXNzb3J5ID0gMAogCQkJCXVzYl9kZXZpY2UgPSAwCkBAIC0xNzcsMTEgKzE3NywxMSBAQAogCQkJCWJsdWV0b290aF9zY28gPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCWJsdWV0b290aF9hMmRwID0gMD4KKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAogCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCiAJCQkJaGRtaSA9IDAKLQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKIAkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKIAkJCQl1c2JfYWNjZXNzb3J5ID0gMAogCQkJCXVzYl9kZXZpY2UgPSAwCkBAIC0yMDUsMTEgKzIwNSwxMSBAQAogCQkJCWJsdWV0b290aF9zY28gPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCWJsdWV0b290aF9hMmRwID0gMD4KKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAogCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCiAJCQkJaGRtaSA9IDAKLQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKIAkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKIAkJCQl1c2JfYWNjZXNzb3J5ID0gMAogCQkJCXVzYl9kZXZpY2UgPSAwCkBAIC0yMzMsMTEgKzIzMywxMSBAQAogCQkJCWJsdWV0b290aF9zY28gPSAwCiAJCQkJYmx1ZXRvb3RoX3Njb19oZWFkc2V0ID0gMAogCQkJCWJsdWV0b290aF9zY29fY2Fya2l0ID0gMAotCQkJCWJsdWV0b290aF9hMmRwID0gMD4KKwkJCQlibHVldG9vdGhfYTJkcCA9IDAKIAkJCQlibHVldG9vdGhfYTJkcF9oZWFkcGhvbmVzID0gMAogCQkJCWJsdWV0b290aF9hMmRwX3NwZWFrZXIgPSAwCiAJCQkJaGRtaSA9IDAKLQkJCQlhbmdsX2RvY2tfaGVhZHNldCA9IDAKKwkJCQlhbmxnX2RvY2tfaGVhZHNldCA9IDAKIAkJCQlkZ3RsX2RvY2tfaGVhZHNldCA9IDAKIAkJCQl1c2JfYWNjZXNzb3J5ID0gMAogCQkJCXVzYl9kZXZpY2UgPSAwCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjFlNDRhLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08Q29tcG9uZW50VHlwZVNldCB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKLSAgICAgICAgICAgICAgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IlNjaGVtYXMvQ29tcG9uZW50VHlwZVNldC54c2QiPgotICAgIDwhLS0gT3V0cHV0IGRldmljZXMgZGVmaW5pdGlvbiBhcyBhIGJpdGZpZWxkIGZvciB0aGUgc3VwcG9ydGVkIGRldmljZXMgcGVyIG91dHB1dAotICAgIHByb2ZpbGUuIEl0IG11c3QgbWF0Y2ggd2l0aCB0aGUgb3V0cHV0IGRldmljZSBlbnVtIHBhcmFtZXRlci4KLSAgICAtLT4KLSAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iT3V0cHV0RGV2aWNlc01hc2siIERlc2NyaXB0aW9uPSIzMnRoIGJpdCBpcyBub3QgYWxsb3dlZCBhcyBkZWRpY2F0ZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIGlucHV0IGRldmljZXMgZGV0ZWN0aW9uIj4KLSAgICAgICAgPEJpdFBhcmFtZXRlckJsb2NrIE5hbWU9Im1hc2siIFNpemU9IjMyIj4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZWFycGllY2UiIFNpemU9IjEiIFBvcz0iMCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGVha2VyIiBTaXplPSIxIiBQb3M9IjEiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0id2lyZWRfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSIyIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRwaG9uZSIgU2l6ZT0iMSIgUG9zPSIzIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY28iIFNpemU9IjEiIFBvcz0iNCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iNSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfc2NvX2NhcmtpdCIgU2l6ZT0iMSIgUG9zPSI2Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwIiBTaXplPSIxIiBQb3M9IjciLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmx1ZXRvb3RoX2EyZHBfaGVhZHBob25lcyIgU2l6ZT0iMSIgUG9zPSI4Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9hMmRwX3NwZWFrZXIiIFNpemU9IjEiIFBvcz0iOSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIiBTaXplPSIxIiBQb3M9IjEwIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFuZ2xfZG9ja19oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjExIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRndGxfZG9ja19oZWFkc2V0IiBTaXplPSIxIiBQb3M9IjEyIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9hY2Nlc3NvcnkiIFNpemU9IjEiIFBvcz0iMTMiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idXNiX2RldmljZSIgU2l6ZT0iMSIgUG9zPSIxNCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4IiBTaXplPSIxIiBQb3M9IjE1Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InRlbGVwaG9ueV90eCIgU2l6ZT0iMSIgUG9zPSIxNiIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsaW5lIiBTaXplPSIxIiBQb3M9IjE3Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhkbWlfYXJjIiBTaXplPSIxIiBQb3M9IjE4Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZGlmIiBTaXplPSIxIiBQb3M9IjE5Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtIiBTaXplPSIxIiBQb3M9IjIwIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImF1eF9saW5lIiBTaXplPSIxIiBQb3M9IjIxIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InNwZWFrZXJfc2FmZSIgU2l6ZT0iMSIgUG9zPSIyMiIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJpcCIgU2l6ZT0iMSIgUG9zPSIyMyIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidXMiIFNpemU9IjEiIFBvcz0iMjQiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3R1YiIgU2l6ZT0iMSIgUG9zPSIzMCIvPgotICAgICAgICA8L0JpdFBhcmFtZXRlckJsb2NrPgotICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgIDwhLS0gSW5wdXQgZGV2aWNlcyBkZWZpbml0aW9uIGFzIGEgYml0ZmllbGQgZm9yIHRoZSBzdXBwb3J0ZWQgZGV2aWNlcyBwZXIgSW5wdXQKLSAgICBwcm9maWxlLiBJdCBtdXN0IG1hdGNoIHdpdGggdGhlIElucHV0IGRldmljZSBlbnVtIHBhcmFtZXRlci4KLSAgICAtLT4KLSAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dERldmljZXNNYXNrIj4KLSAgICAgICAgPEJpdFBhcmFtZXRlckJsb2NrIE5hbWU9Im1hc2siIFNpemU9IjMyIj4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iY29tbXVuaWNhdGlvbiIgU2l6ZT0iMSIgUG9zPSIwIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImFtYmllbnQiIFNpemU9IjEiIFBvcz0iMSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidWlsdGluX21pYyIgU2l6ZT0iMSIgUG9zPSIyIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImJsdWV0b290aF9zY29faGVhZHNldCIgU2l6ZT0iMSIgUG9zPSIzIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9IndpcmVkX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iNCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJoZG1pIiBTaXplPSIxIiBQb3M9IjUiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idGVsZXBob255X3J4IiBTaXplPSIxIiBQb3M9IjYiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYmFja19taWMiIFNpemU9IjEiIFBvcz0iNyIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJyZW1vdGVfc3VibWl4IiBTaXplPSIxIiBQb3M9IjgiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iYW5sZ19kb2NrX2hlYWRzZXQiIFNpemU9IjEiIFBvcz0iOSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJkZ3RsX2RvY2tfaGVhZHNldCIgU2l6ZT0iMSIgUG9zPSIxMCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1c2JfYWNjZXNzb3J5IiBTaXplPSIxIiBQb3M9IjExIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InVzYl9kZXZpY2UiIFNpemU9IjEiIFBvcz0iMTIiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZm1fdHVuZXIiIFNpemU9IjEiIFBvcz0iMTMiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idHZfdHVuZXIiIFNpemU9IjEiIFBvcz0iMTQiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibGluZSIgU2l6ZT0iMSIgUG9zPSIxNSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJzcGRpZiIgU2l6ZT0iMSIgUG9zPSIxNiIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJibHVldG9vdGhfYTJkcCIgU2l6ZT0iMSIgUG9zPSIxNyIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJsb29wYmFjayIgU2l6ZT0iMSIgUG9zPSIxOCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJpcCIgU2l6ZT0iMSIgUG9zPSIxOSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJidXMiIFNpemU9IjEiIFBvcz0iMjAiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3R1YiIgU2l6ZT0iMSIgUG9zPSIzMCIvPgotICAgICAgICA8L0JpdFBhcmFtZXRlckJsb2NrPgotICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgIDxDb21wb25lbnRUeXBlIE5hbWU9Ik91dHB1dEZsYWdzIgotICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJ0aGUgYXVkaW8gb3V0cHV0IGZsYWdzIHNlcnZlIHR3byBwdXJwb3NlczoKLSAgICAgICAgICAgICAgICAgICAgLSB3aGVuIGFuIEF1ZGlvVHJhY2sgaXMgY3JlYXRlZCB0aGV5IGluZGljYXRlIGEgd2lzaCB0byBiZSBjb25uZWN0ZWQgdG8gYW4KLSAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgc3RyZWFtIHdpdGggYXR0cmlidXRlcyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgZmxhZ3MuCi0gICAgICAgICAgICAgICAgICAgIC0gd2hlbiBwcmVzZW50IGluIGFuIG91dHB1dCBwcm9maWxlIGRlc2NyaXB0b3IgbGlzdGVkIGZvciBhIHBhcnRpY3VsYXIgYXVkaW8KLSAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZSBtb2R1bGUsIHRoZXkgaW5kaWNhdGUgdGhhdCBhbiBvdXRwdXQgc3RyZWFtIGNhbiBiZSBvcGVuZWQgdGhhdAotICAgICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzIHRoZSBhdHRyaWJ1dGVzIGluZGljYXRlZCBieSB0aGUgZmxhZ3MuCi0gICAgICAgICAgICAgICAgICAgIFRoZSBhdWRpbyBwb2xpY3kgbWFuYWdlciB3aWxsIHRyeSB0byBtYXRjaCB0aGUgZmxhZ3MgaW4gdGhlIHJlcXVlc3QKLSAgICAgICAgICAgICAgICAgICAgKHdoZW4gZ2V0T3VwdXQoKSBpcyBjYWxsZWQpIHRvIGFuIGF2YWlsYWJsZSBvdXRwdXQgc3RyZWFtLiI+Ci0gICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSIzMiI+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImRpcmVjdCIgU2l6ZT0iMSIgUG9zPSIwIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InByaW1hcnkiIFNpemU9IjEiIFBvcz0iMSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJmYXN0IiBTaXplPSIxIiBQb3M9IjIiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGVlcF9idWZmZXIiIFNpemU9IjEiIFBvcz0iMyIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJjb21wcmVzc19vZmZsb2FkIiBTaXplPSIxIiBQb3M9IjQiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ibm9uX2Jsb2NraW5nIiBTaXplPSIxIiBQb3M9IjUiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iaHdfYXZfc3luYyIgU2l6ZT0iMSIgUG9zPSI2Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InR0cyIgU2l6ZT0iMSIgUG9zPSI3Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJhdyIgU2l6ZT0iMSIgUG9zPSI4Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InN5bmMiIFNpemU9IjEiIFBvcz0iOSIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJpZWM5NThfbm9uYXVkaW8iIFNpemU9IjEiIFBvcz0iMTAiLz4KLSAgICAgICAgPC9CaXRQYXJhbWV0ZXJCbG9jaz4KLSAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dEZsYWdzIgotICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJUaGUgYXVkaW8gaW5wdXQgZmxhZ3MgYXJlIGFuYWxvZ291cyB0byBhdWRpbyBvdXRwdXQgZmxhZ3MuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN1cnJlbnRseSB0aGV5IGFyZSB1c2VkIG9ubHkgd2hlbiBhbiBBdWRpb1JlY29yZCBpcyBjcmVhdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBpbmRpY2F0ZSBhIHByZWZlcmVuY2UgdG8gYmUgY29ubmVjdGVkIHRvIGFuIGlucHV0IHN0cmVhbSB3aXRoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXMgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkIGZsYWdzLiI+Ci0gICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSIzMiI+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZhc3QiIFNpemU9IjEiIFBvcz0iMCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJod19ob3R3b3JkIiBTaXplPSIxIiBQb3M9IjIiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0icmF3IiBTaXplPSIxIiBQb3M9IjMiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0ic3luYyIgU2l6ZT0iMSIgUG9zPSI0Ii8+Ci0gICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+Ci0gICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXRTb3VyY2VzTWFzayIgRGVzY3JpcHRpb249IlRoZSBhdWRpbyBpbnB1dCBzb3VyY2UgaXMgYWxzbyBrbm93bgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcyB0aGUgdXNlIGNhc2UuIj4KLSAgICAgICAgPEJpdFBhcmFtZXRlckJsb2NrIE5hbWU9Im1hc2siIFNpemU9IjMyIj4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0iZGVmYXVsdCIgU2l6ZT0iMSIgUG9zPSIwIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9Im1pYyIgU2l6ZT0iMSIgUG9zPSIxIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InZvaWNlX3VwbGluayIgU2l6ZT0iMSIgUG9zPSIyIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InZvaWNlX2Rvd25saW5rIiBTaXplPSIxIiBQb3M9IjMiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idm9pY2VfY2FsbCIgU2l6ZT0iMSIgUG9zPSI0Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImNhbWNvcmRlciIgU2l6ZT0iMSIgUG9zPSI1Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InZvaWNlX3JlY29nbml0aW9uIiBTaXplPSIxIiBQb3M9IjYiLz4KLSAgICAgICAgICAgIDxCaXRQYXJhbWV0ZXIgTmFtZT0idm9pY2VfY29tbXVuaWNhdGlvbiIgU2l6ZT0iMSIgUG9zPSI3Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9InJlbW90ZV9zdWJtaXgiIFNpemU9IjEiIFBvcz0iOCIvPgotICAgICAgICAgICAgPEJpdFBhcmFtZXRlciBOYW1lPSJ1bnByb2Nlc3NlZCIgU2l6ZT0iMSIgUG9zPSI5Ii8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImZtX3R1bmVyIiBTaXplPSIxIiBQb3M9IjEwIi8+Ci0gICAgICAgICAgICA8Qml0UGFyYW1ldGVyIE5hbWU9ImhvdHdvcmQiIFNpemU9IjEiIFBvcz0iMTEiLz4KLSAgICAgICAgPC9CaXRQYXJhbWV0ZXJCbG9jaz4KLSAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICA8IS0tIFJvdXRpbmcgU3RyYXRlZ3kgZGVmaW5pdGlvbiBhcyBhbiBlbnVtZXJhdGlvbi4gTnVtZXJpY2FsIHZhbHVlIG11c3QgbWF0Y2ggdGhlIHZhbHVlCi0gICAgICAgICBvZiB0aGUgcm91dGluZyBzdHJhdGVneSBpbiBwb2xpY3kgaGVhZGVyIGZpbGUuIC0tPgotICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlN0cmF0ZWd5Ij4KLSAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0ic3RyYXRlZ3kiIFNpemU9IjMyIj4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0ibWVkaWEiIE51bWVyaWNhbD0iMCIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJwaG9uZSIgTnVtZXJpY2FsPSIxIi8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InNvbmlmaWNhdGlvbiIgTnVtZXJpY2FsPSIyIi8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InNvbmlmaWNhdGlvbl9yZXNwZWN0ZnVsIiBOdW1lcmljYWw9IjMiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0iZHRtZiIgTnVtZXJpY2FsPSI0Ii8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9ImVuZm9yY2VkX2F1ZGlibGUiIE51bWVyaWNhbD0iNSIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJ0cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIiIE51bWVyaWNhbD0iNiIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJhY2Nlc3NpYmlsaXR5IiBOdW1lcmljYWw9IjciLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0icmVyb3V0aW5nIiBOdW1lcmljYWw9IjgiLz4KLSAgICAgICAgPC9FbnVtUGFyYW1ldGVyPgotICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJBVEVHWSBDT01NT04gVFlQRVMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlN0cmF0ZWd5Q29uZmlnIiBNYXBwaW5nPSJTdHJhdGVneTonJTEnIj4KLSAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzZWxlY3RlZF9vdXRwdXRfZGV2aWNlcyIgVHlwZT0iT3V0cHV0RGV2aWNlc01hc2siLz4KLSAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSQVRFR1kgQ09NTU9OIFRZUEVTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkVBTSBDT01NT04gVFlQRVMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlZvbHVtZVByb2ZpbGVUeXBlIj4KLSAgICAgICAgPEVudW1QYXJhbWV0ZXIgTmFtZT0idm9sdW1lX3Byb2ZpbGUiIFNpemU9IjMyIj4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0idm9pY2VfY2FsbCIgTnVtZXJpY2FsPSIwIi8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InN5c3RlbSIgTnVtZXJpY2FsPSIxIi8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9InJpbmciIE51bWVyaWNhbD0iMiIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJtdXNpYyIgTnVtZXJpY2FsPSIzIi8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9ImFsYXJtIiBOdW1lcmljYWw9IjQiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0ibm90aWZpY2F0aW9uIiBOdW1lcmljYWw9IjUiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0iYmx1ZXRvb3RoX3NjbyIgTnVtZXJpY2FsPSI2Ii8+Ci0gICAgICAgICAgICA8VmFsdWVQYWlyIExpdGVyYWw9ImVuZm9yY2VkX2F1ZGlibGUiIE51bWVyaWNhbD0iNyIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJkdG1mIiBOdW1lcmljYWw9IjgiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0idHRzIiBOdW1lcmljYWw9IjkiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0iYWNjZXNzaWJpbGl0eSIgTnVtZXJpY2FsPSIxMCIvPgotICAgICAgICAgICAgPFZhbHVlUGFpciBMaXRlcmFsPSJyZXJvdXRpbmciIE51bWVyaWNhbD0iMTEiLz4KLSAgICAgICAgICAgIDxWYWx1ZVBhaXIgTGl0ZXJhbD0icGF0Y2giIE51bWVyaWNhbD0iMTIiLz4KLSAgICAgICAgPC9FbnVtUGFyYW1ldGVyPgotICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlN0cmVhbSI+Ci0gICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXBwbGljYWJsZV9zdHJhdGVneSIgVHlwZT0iU3RyYXRlZ3kiLz4KLSAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhcHBsaWNhYmxlX3ZvbHVtZV9wcm9maWxlIiBUeXBlPSJWb2x1bWVQcm9maWxlVHlwZSIKLSAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iVm9sdW1lIHByb2ZpbGUgZm9sbG93ZWQgYnkgYSBnaXZlbiBzdHJlYW0gdHlwZS4iLz4KLSAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIENPTU1PTiBUWVBFUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBVU0FHRSBDT01NT04gVFlQRVMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlVzYWdlIj4KLSAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhcHBsaWNhYmxlX3N0cmF0ZWd5IiBUeXBlPSJTdHJhdGVneSIgTWFwcGluZz0iVXNhZ2U6JyUxJyIvPgotICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBVU0FHRSBDT01NT04gVFlQRVMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIENPTU1PTiBUWVBFUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXRTb3VyY2UiPgotICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFwcGxpY2FibGVfaW5wdXRfZGV2aWNlIiBUeXBlPSJJbnB1dERldmljZXNNYXNrIgotICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IklucHV0U291cmNlOiclMSciIERlc2NyaXB0aW9uPSJTZWxlY3RlZCBJbnB1dCBkZXZpY2UiLz4KLSAgICA8L0NvbXBvbmVudFR5cGU+Ci0KLSAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIENPTU1PTiBUWVBFUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotPC9Db21wb25lbnRUeXBlU2V0PgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWQ5YzM1Ni4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPFN1YnN5c3RlbSB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKLSAgICAgICAgICAgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IlNjaGVtYXMvU3Vic3lzdGVtLnhzZCIKLSAgICAgICAgICAgTmFtZT0icG9saWN5IiBUeXBlPSJQb2xpY3kiPgotCi0gICAgPENvbXBvbmVudExpYnJhcnk+Ci0gICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBHTE9CQUwgQ09NUE9ORU5UUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotICAgICAgICA8IS0tIENvbW1vbiBUeXBlcyBkZWZpbnRpb24gLS0+Ci0gICAgICAgIDx4aTppbmNsdWRlIGhyZWY9IlBvbGljeVN1YnN5c3RlbS1Db21tb25UeXBlcy54bWwiLz4KLQotICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0xPQkFMIENPTVBPTkVOVFMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkFURUdZIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyYXRlZ2llcyIgRGVzY3JpcHRpb249IklkZW50aWZpZXIgbXVzdCBtYXRjaCB0aGUgZW51bSB2YWx1ZSB0byBtYWtlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBsaW5rIGJldHdlZW4gdGhlIFBvbGljeU1hbmFnZXIgYW5kIFBGVyI+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im1lZGlhIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIgTWFwcGluZz0iQW1lbmQxOk1lZGlhLElkZW50aWZpZXI6MCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJwaG9uZSIgVHlwZT0iU3RyYXRlZ3lDb25maWciIE1hcHBpbmc9IkFtZW5kMTpQaG9uZSxJZGVudGlmaWVyOjEiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ic29uaWZpY2F0aW9uIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6U29uaWZpY2F0aW9uLElkZW50aWZpZXI6MiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzb25pZmljYXRpb25fcmVzcGVjdGZ1bCIgVHlwZT0iU3RyYXRlZ3lDb25maWciCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpTb25pZmljYXRpb25SZXNwZWN0ZnVsLElkZW50aWZpZXI6MyIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJkdG1mIiBUeXBlPSJTdHJhdGVneUNvbmZpZyIgTWFwcGluZz0iQW1lbmQxOkR0bWYsSWRlbnRpZmllcjo0Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImVuZm9yY2VkX2F1ZGlibGUiIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6RW5mb3JjZWRBdWRpYmxlLElkZW50aWZpZXI6NSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ0cmFuc21pdHRlZF90aHJvdWdoX3NwZWFrZXIiIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6VHJhbnNtaXR0ZWRUaHJvdWdoU3BlYWtlcixJZGVudGlmaWVyOjYiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWNjZXNzaWJpbGl0eSIgVHlwZT0iU3RyYXRlZ3lDb25maWciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpBY2Nlc3NpYmlsaXR5LElkZW50aWZpZXI6NyIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyZXJvdXRpbmciIFR5cGU9IlN0cmF0ZWd5Q29uZmlnIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpSZXJvdXRpbmcsSWRlbnRpZmllcjo4Ii8+Ci0gICAgICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSQVRFR1kgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkVBTSBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlN0cmVhbXMiIERlc2NyaXB0aW9uPSJhc3NvY2lhdGVkIHRvIGF1ZGlvX3N0cmVhbV90eXBlX3QgZGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciBtYXBwaW5nIG11c3QgbWF0Y2ggdGhlIHZhbHVlIG9mIHRoZSBlbnVtIj4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY2FsbCIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJTdHJlYW06Vm9pY2VDYWxsLElkZW50aWZpZXI6MCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzeXN0ZW0iIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iU3RyZWFtOlN5c3RlbSxJZGVudGlmaWVyOjEiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmluZyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJTdHJlYW06UmluZyxJZGVudGlmaWVyOjIiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibXVzaWMiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iU3RyZWFtOk11c2ljLElkZW50aWZpZXI6MyIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhbGFybSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJTdHJlYW06QWxhcm0sSWRlbnRpZmllcjo0Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbiIgVHlwZT0iU3RyZWFtIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IlN0cmVhbTpOb3RpZmljYXRpb24sSWRlbnRpZmllcjo1Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImJsdWV0b290aF9zY28iIFR5cGU9IlN0cmVhbSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iU3RyZWFtOkJsdWV0b290aFNjbyxJZGVudGlmaWVyOjYiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZW5mb3JjZWRfYXVkaWJsZSIgVHlwZT0iU3RyZWFtIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJTdHJlYW06RW5mb3JjZUF1ZGlibGUsSWRlbnRpZmllcjo3IgotICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iU291bmRzIHRoYXQgY2Fubm90IGJlIG11dGVkIGJ5IHVzZXIgYW5kIG11c3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIHJvdXRlZCB0byBzcGVha2VyIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImR0bWYiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iU3RyZWFtOkR0bWYsSWRlbnRpZmllcjo4Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InR0cyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJTdHJlYW06VHRzLElkZW50aWZpZXI6OSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IlRyYW5zbWl0dGVkIFRocm91Z2ggU3BlYWtlci4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBsYXlzIG92ZXIgc3BlYWtlciBvbmx5LCBzaWxlbnQgb24gb3RoZXIgZGV2aWNlcyIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhY2Nlc3NpYmlsaXR5IiBUeXBlPSJTdHJlYW0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IlN0cmVhbTpBY2Nlc3NpYmlsaXR5LElkZW50aWZpZXI6MTAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJGb3IgYWNjZXNzaWJpbGl0eSB0YWxrIGJhY2sgcHJvbXB0cyIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyZXJvdXRpbmciIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iU3RyZWFtOlJlcm91dGluZyxJZGVudGlmaWVyOjExIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGR5bmFtaWMgcG9saWN5IG91dHB1dCBtaXhlcyIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJwYXRjaCIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJTdHJlYW06UGF0Y2gsSWRlbnRpZmllcjoxMiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkZvciBpbnRlcm5hbCBhdWRpbyBmbGluZ2VyIHRyYWNrcy4gRml4ZWQgdm9sdW1lIi8+Ci0gICAgICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBVU0FHRSBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IlVzYWdlcyIgRGVzY3JpcHRpb249ImFzc29jaWF0ZWQgdG8gYXVkaW9fdXNhZ2VfdCBkZWZpbml0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIG1hcHBpbmcgbXVzdCBtYXRjaCB0aGUgdmFsdWUgb2YgdGhlIGVudW0iPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ1bmtub3duIiBUeXBlPSJVc2FnZSIgTWFwcGluZz0iQW1lbmQxOlVua25vd24sSWRlbnRpZmllcjowIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im1lZGlhIiBUeXBlPSJVc2FnZSIgTWFwcGluZz0iQW1lbmQxOk1lZGlhLElkZW50aWZpZXI6MSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jb21tdW5pY2F0aW9uIiBUeXBlPSJVc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlZvaWNlQ29tbXVuaWNhdGlvbixJZGVudGlmaWVyOjIiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY29tbXVuaWNhdGlvbl9zaWduYWxsaW5nIiBUeXBlPSJVc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlZvaWNlQ29tbXVuaWNhdGlvblNpZ25hbGxpbmcsSWRlbnRpZmllcjozIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFsYXJtIiBUeXBlPSJVc2FnZSIgTWFwcGluZz0iQW1lbmQxOkFsYXJtLElkZW50aWZpZXI6NCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJub3RpZmljYXRpb24iIFR5cGU9IlVzYWdlIiBNYXBwaW5nPSJBbWVuZDE6Tm90aWZpY2F0aW9uLElkZW50aWZpZXI6NSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJub3RpZmljYXRpb25fdGVsZXBob255X3Jpbmd0b25lIiBUeXBlPSJVc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOk5vdGlmaWNhdGlvblRlbGVwaG9ueVJpbmd0b25lLElkZW50aWZpZXI6NiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJub3RpZmljYXRpb25fY29tbXVuaWNhdGlvbl9yZXF1ZXN0IiBUeXBlPSJVc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOk5vdGlmaWNhdGlvbkNvbW11bmljYXRpb25SZXF1ZXN0LElkZW50aWZpZXI6NyIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJub3RpZmljYXRpb25fY29tbXVuaWNhdGlvbl9pbnN0YW50IiBUeXBlPSJVc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOk5vdGlmaWNhdGlvbkNvbW11bmljYXRpb25JbnN0YW50LElkZW50aWZpZXI6OCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJub3RpZmljYXRpb25fY29tbXVuaWNhdGlvbl9kZWxheWVkIiBUeXBlPSJVc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOk5vdGlmaWNhdGlvbkNvbW11bmljYXRpb25EZWxhdGVkLElkZW50aWZpZXI6OSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJub3RpZmljYXRpb25fZXZlbnQiIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpOb3RpZmljYXRpb25FdmVudCxJZGVudGlmaWVyOjEwIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFzc2lzdGFuY2VfYWNjZXNzaWJpbGl0eSIgVHlwZT0iVXNhZ2UiCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpBc3Npc3RhbmNlQWNjZXNzaWJpbGl0eSxJZGVudGlmaWVyOjExIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFzc2lzdGFuY2VfbmF2aWdhdGlvbl9ndWlkYW5jZSIgVHlwZT0iVXNhZ2UiCi0gICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpBc3Npc3RhbmNlTmF2aWdhdGlvbkd1aWRhbmNlLElkZW50aWZpZXI6MTIiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXNzaXN0YW5jZV9zb25pZmljYXRpb24iIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6QXNzaXN0YW5jZVNvbmlmaWNhdGlvbixJZGVudGlmaWVyOjEzIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImdhbWUiIFR5cGU9IlVzYWdlIiBNYXBwaW5nPSJBbWVuZDE6Qmx1ZXRvb3RoU2NvLElkZW50aWZpZXI6MTQiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idmlydHVhbF9zb3VyY2UiIFR5cGU9IlVzYWdlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlZpcnR1YWxTb3VyY2UsSWRlbnRpZmllcjoxNSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhc3Npc3RhbnQiIFR5cGU9IlVzYWdlIiBNYXBwaW5nPSJBbWVuZDE6QXNzaXN0YW50LElkZW50aWZpZXI6MTYiLz4KLSAgICAgICAgPC9Db21wb25lbnRUeXBlPgotCi0gICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBVU0FHRSBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KLQotICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+Ci0KLSAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXRTb3VyY2VzIiBEZXNjcmlwdGlvbj0iYXNzb2NpYXRlZCB0byBhdWRpb19zb3VyY2VfdCBkZWZpbml0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIG1hcHBpbmcgbXVzdCBtYXRjaCB0aGUgdmFsdWUgb2YgdGhlIGVudW0iPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJkZWZhdWx0IiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iQW1lbmQxOkRlZmF1bHQsSWRlbnRpZmllcjowIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im1pYyIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9IkFtZW5kMTpNaWMsSWRlbnRpZmllcjoxIi8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX3VwbGluayIgVHlwZT0iSW5wdXRTb3VyY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlZvaWNlVXBsaW5rLElkZW50aWZpZXI6MiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9kb3dubGluayIgVHlwZT0iSW5wdXRTb3VyY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJBbWVuZDE6Vm9pY2VEb3dubGluayxJZGVudGlmaWVyOjMiLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY2FsbCIgVHlwZT0iSW5wdXRTb3VyY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpWb2ljZUNhbGwsSWRlbnRpZmllcjo0Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImNhbWNvcmRlciIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9IkFtZW5kMTpDYW1jb3JkZXIsSWRlbnRpZmllcjo1Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX3JlY29nbml0aW9uIiBUeXBlPSJJbnB1dFNvdXJjZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpWb2ljZVJlY29nbml0aW9uLElkZW50aWZpZXI6NiIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jb21tdW5pY2F0aW9uIiBUeXBlPSJJbnB1dFNvdXJjZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlZvaWNlQ29tbXVuaWNhdGlvbixJZGVudGlmaWVyOjciLz4KLSAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmVtb3RlX3N1Ym1peCIgVHlwZT0iSW5wdXRTb3VyY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9IkFtZW5kMTpSZW1vdGVTdWJtaXgsSWRlbnRpZmllcjo4Ii8+Ci0gICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InVucHJvY2Vzc2VkIiBUeXBlPSJJbnB1dFNvdXJjZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iQW1lbmQxOlVucHJvY2Vzc2VkLElkZW50aWZpZXI6OSIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJmbV90dW5lciIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9IkFtZW5kMTpGbVR1bmVyLElkZW50aWZpZXI6MTk5OCIvPgotICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJob3R3b3JkIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iQW1lbmQxOkhvdHdvcmQsSWRlbnRpZmllcjoxOTk5Ii8+Ci0gICAgICAgIDwvQ29tcG9uZW50VHlwZT4KLQotICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgotCi0gICAgPC9Db21wb25lbnRMaWJyYXJ5PgotCi0gICAgPEluc3RhbmNlRGVmaW5pdGlvbj4KLSAgICAgICAgPENvbXBvbmVudCBOYW1lPSJzdHJlYW1zIiBUeXBlPSJTdHJlYW1zIi8+Ci0gICAgICAgIDxDb21wb25lbnQgTmFtZT0ic3RyYXRlZ2llcyIgVHlwZT0iU3RyYXRlZ2llcyIvPgotICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImlucHV0X3NvdXJjZXMiIFR5cGU9IklucHV0U291cmNlcyIvPgotICAgICAgICA8Q29tcG9uZW50IE5hbWU9InVzYWdlcyIgVHlwZT0iVXNhZ2VzIi8+Ci0gICAgPC9JbnN0YW5jZURlZmluaXRpb24+Ci08L1N1YnN5c3RlbT4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL1N0cnVjdHVyZS9Qb2xpY3lDbGFzcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9jb21tb24vU3RydWN0dXJlL1BvbGljeUNsYXNzLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvU3RydWN0dXJlL1BvbGljeUNsYXNzLnhtbApyZW5hbWUgdG8gc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lDbGFzcy54bWwKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbC5pbiBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTlmMzdlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sLmluCkBAIC0wLDAgKzEsNjAgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8Q29tcG9uZW50VHlwZVNldCB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgorICAgICAgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKKyAgICAgICAgICAgICAgeHNpOm5vTmFtZXNwYWNlU2NoZW1hTG9jYXRpb249IlNjaGVtYXMvQ29tcG9uZW50VHlwZVNldC54c2QiPgorICAgIDwhLS0gT3V0cHV0IGRldmljZXMgZGVmaW5pdGlvbiBhcyBhIGJpdGZpZWxkIGZvciB0aGUgc3VwcG9ydGVkIGRldmljZXMgcGVyIG91dHB1dAorICAgIHByb2ZpbGUuIEl0IG11c3QgbWF0Y2ggd2l0aCB0aGUgb3V0cHV0IGRldmljZSBlbnVtIHBhcmFtZXRlci4KKyAgICAtLT4KKyAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgPCEtLSBBdXRvbWF0aWNhbGx5IGZpbGxlZCBmcm9tIGF1ZGlvLWJhc2UuaCBmaWxlIC0tPgorICAgIDxDb21wb25lbnRUeXBlIE5hbWU9Ik91dHB1dERldmljZXNNYXNrIiBEZXNjcmlwdGlvbj0iMzJ0aCBiaXQgaXMgbm90IGFsbG93ZWQgYXMgZGVkaWNhdGVkIGZvciBpbnB1dCBkZXZpY2VzIGRldGVjdGlvbiI+CisgICAgICAgIDxCaXRQYXJhbWV0ZXJCbG9jayBOYW1lPSJtYXNrIiBTaXplPSIzMiI+CisgICAgICAgIDwvQml0UGFyYW1ldGVyQmxvY2s+CisgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgPCEtLSBJbnB1dCBkZXZpY2VzIGRlZmluaXRpb24gYXMgYSBiaXRmaWVsZCBmb3IgdGhlIHN1cHBvcnRlZCBkZXZpY2VzIHBlciBJbnB1dAorICAgIHByb2ZpbGUuIEl0IG11c3QgbWF0Y2ggd2l0aCB0aGUgSW5wdXQgZGV2aWNlIGVudW0gcGFyYW1ldGVyLgorICAgIC0tPgorICAgIDwhLS0gQXV0b21hdGljYWxseSBmaWxsZWQgZnJvbSBhdWRpby1iYXNlLmggZmlsZSAtLT4KKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJJbnB1dERldmljZXNNYXNrIj4KKyAgICAgICAgPEJpdFBhcmFtZXRlckJsb2NrIE5hbWU9Im1hc2siIFNpemU9IjMyIj4KKyAgICAgICAgPC9CaXRQYXJhbWV0ZXJCbG9jaz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIENPTU1PTiBUWVBFUyBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorICAgIDwhLS0gQXV0b21hdGljYWxseSBmaWxsZWQgZnJvbSBhdWRpby1iYXNlLmggZmlsZS4gVm9sdW1lUHJvZmlsZVR5cGUgaXMgYXNzb2NpYXRlZCB0byBzdHJlYW0gdHlwZSAtLT4KKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJWb2x1bWVQcm9maWxlVHlwZSI+CisgICAgICAgIDxFbnVtUGFyYW1ldGVyIE5hbWU9InZvbHVtZV9wcm9maWxlIiBTaXplPSIzMiI+CisgICAgICAgIDwvRW51bVBhcmFtZXRlcj4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJlYW0iICBNYXBwaW5nPSJTdHJlYW0iPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFwcGxpY2FibGVfdm9sdW1lX3Byb2ZpbGUiIFR5cGU9IlZvbHVtZVByb2ZpbGVUeXBlIgorICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJWb2x1bWUgcHJvZmlsZSBmb2xsb3dlZCBieSBhIGdpdmVuIHN0cmVhbSB0eXBlLiIvPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gQ09NTU9OIFRZUEVTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBDT01NT04gVFlQRVMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0U291cmNlIj4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhcHBsaWNhYmxlX2lucHV0X2RldmljZSIgVHlwZT0iSW5wdXREZXZpY2VzTWFzayIKKyAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJJbnB1dFNvdXJjZSIgRGVzY3JpcHRpb249IlNlbGVjdGVkIElucHV0IGRldmljZSIvPgorICAgIDwvQ29tcG9uZW50VHlwZT4KKworICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlBVVCBTT1VSQ0UgQ09NTU9OIFRZUEVTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFBST0RVQ1QgU1RSQVRFR1kgQ09NTU9OIFRZUEVTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJQcm9kdWN0U3RyYXRlZ3kiIE1hcHBpbmc9IlByb2R1Y3RTdHJhdGVneSI+CisgICAgICAgIDxDb21wb25lbnQgTmFtZT0ic2VsZWN0ZWRfb3V0cHV0X2RldmljZXMiIFR5cGU9Ik91dHB1dERldmljZXNNYXNrIi8+CisgICAgICAgIDxTdHJpbmdQYXJhbWV0ZXIgTmFtZT0iZGV2aWNlX2FkZHJlc3MiIE1heExlbmd0aD0iMjU2IgorICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJpZiBhbnksIGRldmljZSBhZGRyZXNzIGFzc29jaWF0ZWQiLz4KKyAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgUFJPRFVDVCBTVFJBVEVHWSBDT01NT04gVFlQRVMgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKzwvQ29tcG9uZW50VHlwZVNldD4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLW5vLXN0cmF0ZWd5LnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL2NvbW1vbi9TdHJ1Y3R1cmUvUG9saWN5U3Vic3lzdGVtLW5vLXN0cmF0ZWd5LnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZDM0OWM4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0tbm8tc3RyYXRlZ3kueG1sCkBAIC0wLDAgKzEsNzQgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Cis8U3Vic3lzdGVtIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgorICAgICAgICAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iU2NoZW1hcy9TdWJzeXN0ZW0ueHNkIgorICAgICAgICAgICBOYW1lPSJwb2xpY3kiIFR5cGU9IlBvbGljeSI+CisKKyAgICA8Q29tcG9uZW50TGlicmFyeT4KKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisgICAgICAgIDwhLS0gQ29tbW9uIFR5cGVzIGRlZmludGlvbiAtLT4KKyAgICAgICAgPHhpOmluY2x1ZGUgaHJlZj0iUG9saWN5U3Vic3lzdGVtLUNvbW1vblR5cGVzLnhtbCIvPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBHTE9CQUwgQ09NUE9ORU5UUyBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgU1RSRUFNIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iU3RyZWFtcyIgRGVzY3JpcHRpb249ImFzc29jaWF0ZWQgdG8gYXVkaW9fc3RyZWFtX3R5cGVfdCBkZWZpbml0aW9uIj4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY2FsbCIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InN5c3RlbSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9TWVNURU0iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmluZyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9SSU5HIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im11c2ljIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX01VU0lDIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImFsYXJtIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0FMQVJNIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9Im5vdGlmaWNhdGlvbiIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYmx1ZXRvb3RoX3NjbyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImVuZm9yY2VkX2F1ZGlibGUiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSIKKyAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IlNvdW5kcyB0aGF0IGNhbm5vdCBiZSBtdXRlZCBieSB1c2VyIGFuZCBtdXN0IGJlIHJvdXRlZCB0byBzcGVha2VyIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImR0bWYiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fRFRNRiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ0dHMiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fVFRTIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iVHJhbnNtaXR0ZWQgVGhyb3VnaCBTcGVha2VyLiBQbGF5cyBvdmVyIHNwZWFrZXIgb25seSwgc2lsZW50IG9uIG90aGVyIGRldmljZXMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWNjZXNzaWJpbGl0eSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGFjY2Vzc2liaWxpdHkgdGFsayBiYWNrIHByb21wdHMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYXNzaXN0YW50IiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0FTU0lTVEFOVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249InVzZWQgYnkgYSB2aXJ0dWFsIGFzc2lzdGFudCBsaWtlIEdvb2dsZSBBc3Npc3RhbnQsIEJpeGJ5LCBldGMuIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJlcm91dGluZyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9SRVJPVVRJTkciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJGb3IgZHluYW1pYyBwb2xpY3kgb3V0cHV0IG1peGVzIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InBhdGNoIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1BBVENIIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iRm9yIGludGVybmFsIGF1ZGlvIGZsaW5nZXIgdHJhY2tzLiBGaXhlZCB2b2x1bWUiLz4KKyAgICAgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIElOUFVUIFNPVVJDRSBCRUdJTiAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgICAgIDxDb21wb25lbnRUeXBlIE5hbWU9IklucHV0U291cmNlcyIgRGVzY3JpcHRpb249ImFzc29jaWF0ZWQgdG8gYXVkaW9fc291cmNlX3QgZGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllciBtYXBwaW5nIG11c3QgbWF0Y2ggdGhlIHZhbHVlIG9mIHRoZSBlbnVtIj4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZGVmYXVsdCIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX0RFRkFVTFQiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibWljIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfTUlDIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX3VwbGluayIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2Rvd25saW5rIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NhbGwiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9DQUxMIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImNhbWNvcmRlciIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX0NBTUNPUkRFUiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9yZWNvZ25pdGlvbiIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jb21tdW5pY2F0aW9uIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyZW1vdGVfc3VibWl4IiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ1bnByb2Nlc3NlZCIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImZtX3R1bmVyIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfRk1fVFVORVIiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iaG90d29yZCIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX0hPVFdPUkQiLz4KKyAgICAgICAgPC9Db21wb25lbnRUeXBlPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBJTlBVVCBTT1VSQ0UgRU5EICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICA8L0NvbXBvbmVudExpYnJhcnk+CisKKyAgICA8SW5zdGFuY2VEZWZpbml0aW9uPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9InN0cmVhbXMiIFR5cGU9IlN0cmVhbXMiLz4KKyAgICAgICAgPENvbXBvbmVudCBOYW1lPSJpbnB1dF9zb3VyY2VzIiBUeXBlPSJJbnB1dFNvdXJjZXMiLz4KKyAgICA8L0luc3RhbmNlRGVmaW5pdGlvbj4KKzwvU3Vic3lzdGVtPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qb2xpY3lTdWJzeXN0ZW0ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYmI1N2EKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9jb21tb24vU3RydWN0dXJlL1BvbGljeVN1YnN5c3RlbS54bWwKQEAgLTAsMCArMSw5MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxTdWJzeXN0ZW0geG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKKyAgICAgICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiCisgICAgICAgICAgIHhzaTpub05hbWVzcGFjZVNjaGVtYUxvY2F0aW9uPSJTY2hlbWFzL1N1YnN5c3RlbS54c2QiCisgICAgICAgICAgIE5hbWU9InBvbGljeSIgVHlwZT0iUG9saWN5Ij4KKworICAgIDxDb21wb25lbnRMaWJyYXJ5PgorICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgR0xPQkFMIENPTVBPTkVOVFMgQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKyAgICAgICAgPCEtLSBDb21tb24gVHlwZXMgZGVmaW50aW9uIC0tPgorICAgICAgICA8eGk6aW5jbHVkZSBocmVmPSJQb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sIi8+CisgICAgICAgIDx4aTppbmNsdWRlIGhyZWY9IlByb2R1Y3RTdHJhdGVnaWVzLnhtbCIvPgorCisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIEdMT0JBTCBDT01QT05FTlRTIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorCisgICAgICAgIDwhLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyBTVFJFQU0gQkVHSU4gIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8Q29tcG9uZW50VHlwZSBOYW1lPSJTdHJlYW1zIiBEZXNjcmlwdGlvbj0iYXNzb2NpYXRlZCB0byBhdWRpb19zdHJlYW1fdHlwZV90IGRlZmluaXRpb24iPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJ2b2ljZV9jYWxsIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ic3lzdGVtIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1NZU1RFTSIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJyaW5nIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1JJTkciLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibXVzaWMiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fTVVTSUMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iYWxhcm0iIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fQUxBUk0iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0ibm90aWZpY2F0aW9uIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX05PVElGSUNBVElPTiIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJibHVldG9vdGhfc2NvIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZW5mb3JjZWRfYXVkaWJsZSIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFIgorICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0iU291bmRzIHRoYXQgY2Fubm90IGJlIG11dGVkIGJ5IHVzZXIgYW5kIG11c3QgYmUgcm91dGVkIHRvIHNwZWFrZXIiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iZHRtZiIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9EVE1GIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InR0cyIgVHlwZT0iU3RyZWFtIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NUUkVBTV9UVFMiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJUcmFuc21pdHRlZCBUaHJvdWdoIFNwZWFrZXIuIFBsYXlzIG92ZXIgc3BlYWtlciBvbmx5LCBzaWxlbnQgb24gb3RoZXIgZGV2aWNlcyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhY2Nlc3NpYmlsaXR5IiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJGb3IgYWNjZXNzaWJpbGl0eSB0YWxrIGJhY2sgcHJvbXB0cyIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJhc3Npc3RhbnQiIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fQVNTSVNUQU5UIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdGlvbj0idXNlZCBieSBhIHZpcnR1YWwgYXNzaXN0YW50IGxpa2UgR29vZ2xlIEFzc2lzdGFudCwgQml4YnksIGV0Yy4iLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icmVyb3V0aW5nIiBUeXBlPSJTdHJlYW0iIE1hcHBpbmc9Ik5hbWU6QVVESU9fU1RSRUFNX1JFUk9VVElORyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb249IkZvciBkeW5hbWljIHBvbGljeSBvdXRwdXQgbWl4ZXMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0icGF0Y2giIFR5cGU9IlN0cmVhbSIgTWFwcGluZz0iTmFtZTpBVURJT19TVFJFQU1fUEFUQ0giCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0aW9uPSJGb3IgaW50ZXJuYWwgYXVkaW8gZmxpbmdlciB0cmFja3MuIEZpeGVkIHZvbHVtZSIvPgorICAgICAgICA8L0NvbXBvbmVudFR5cGU+CisKKyAgICAgICAgPCEtLSMjIyMjIyMjIyMjIyMjIyMjIyMjIFNUUkVBTSBFTkQgIyMjIyMjIyMjIyMjIyMjIyMjIyMtLT4KKworICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIEJFR0lOICMjIyMjIyMjIyMjIyMjIyMjIyMjLS0+CisKKyAgICAgICAgPENvbXBvbmVudFR5cGUgTmFtZT0iSW5wdXRTb3VyY2VzIiBEZXNjcmlwdGlvbj0iYXNzb2NpYXRlZCB0byBhdWRpb19zb3VyY2VfdCBkZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyIG1hcHBpbmcgbXVzdCBtYXRjaCB0aGUgdmFsdWUgb2YgdGhlIGVudW0iPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJkZWZhdWx0IiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfREVGQVVMVCIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJtaWMiIFR5cGU9IklucHV0U291cmNlIiBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9NSUMiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfdXBsaW5rIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9VUExJTksiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfZG93bmxpbmsiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTksiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfY2FsbCIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX0NBTEwiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iY2FtY29yZGVyIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfQ0FNQ09SREVSIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX3JlY29nbml0aW9uIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InZvaWNlX2NvbW11bmljYXRpb24iIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InJlbW90ZV9zdWJtaXgiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9InVucHJvY2Vzc2VkIiBUeXBlPSJJbnB1dFNvdXJjZSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0idm9pY2VfcGVyZm9ybWFuY2UiIFR5cGU9IklucHV0U291cmNlIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBwaW5nPSJOYW1lOkFVRElPX1NPVVJDRV9WT0lDRV9QRVJGT1JNQU5DRSIvPgorICAgICAgICAgICAgPENvbXBvbmVudCBOYW1lPSJlY2hvX3JlZmVyZW5jZSIgVHlwZT0iSW5wdXRTb3VyY2UiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFIi8+CisgICAgICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImZtX3R1bmVyIiBUeXBlPSJJbnB1dFNvdXJjZSIgTWFwcGluZz0iTmFtZTpBVURJT19TT1VSQ0VfRk1fVFVORVIiLz4KKyAgICAgICAgICAgIDxDb21wb25lbnQgTmFtZT0iaG90d29yZCIgVHlwZT0iSW5wdXRTb3VyY2UiIE1hcHBpbmc9Ik5hbWU6QVVESU9fU09VUkNFX0hPVFdPUkQiLz4KKyAgICAgICAgPC9Db21wb25lbnRUeXBlPgorICAgICAgICA8IS0tIyMjIyMjIyMjIyMjIyMjIyMjIyMgSU5QVVQgU09VUkNFIEVORCAjIyMjIyMjIyMjIyMjIyMjIyMjIy0tPgorICAgIDwvQ29tcG9uZW50TGlicmFyeT4KKworICAgIDxJbnN0YW5jZURlZmluaXRpb24+CisgICAgICAgIDxDb21wb25lbnQgTmFtZT0ic3RyZWFtcyIgVHlwZT0iU3RyZWFtcyIvPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9ImlucHV0X3NvdXJjZXMiIFR5cGU9IklucHV0U291cmNlcyIvPgorICAgICAgICA8Q29tcG9uZW50IE5hbWU9InByb2R1Y3Rfc3RyYXRlZ2llcyIgVHlwZT0iUHJvZHVjdFN0cmF0ZWdpZXMiLz4KKyAgICA8L0luc3RhbmNlRGVmaW5pdGlvbj4KKzwvU3Vic3lzdGVtPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qcm9kdWN0U3RyYXRlZ2llcy54bWwuaW4gYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9leGFtcGxlcy9jb21tb24vU3RydWN0dXJlL1Byb2R1Y3RTdHJhdGVnaWVzLnhtbC5pbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzYwYjI1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvY29tbW9uL1N0cnVjdHVyZS9Qcm9kdWN0U3RyYXRlZ2llcy54bWwuaW4KQEAgLTAsMCArMSwyNSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzxDb21wb25lbnRUeXBlU2V0IHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCisgICAgICAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgorICAgICAgICAgICAgICB4c2k6bm9OYW1lc3BhY2VTY2hlbWFMb2NhdGlvbj0iU2NoZW1hcy9Db21wb25lbnRUeXBlU2V0LnhzZCI+CisKKyAgPCEtLSBhdXRvbWF0aWNhbGx5IHBvcHVsYXRlIHRoZSBzdHJhdGVneSBzdHJ1Y3R1cmUgcGx1Z2luIGZpbGUgZnJvbSBFbmdpbmUgQ29uZmlndXJhdGlvbiBYTUwgZmlsZQorICAgICAgICBDb21wb25lbnQgTmFtZT0ieHh4IiBUeXBlPSJQcm9kdWN0U3RyYXRlZ3kiLy0tPgorICA8Q29tcG9uZW50VHlwZSBOYW1lPSJQcm9kdWN0U3RyYXRlZ2llcyIgRGVzY3JpcHRpb249IiI+CisgIDwvQ29tcG9uZW50VHlwZT4KKworPC9Db21wb25lbnRUeXBlU2V0PgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvcG9saWN5X2NyaXRlcmlhLnR4dCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL2V4YW1wbGVzL3BvbGljeV9jcml0ZXJpYS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4MGNiZTEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvZXhhbXBsZXMvcG9saWN5X2NyaXRlcmlhLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLUV4Y2x1c2l2ZUNyaXRlcmlvbiBUZWxlcGhvbnlNb2RlICAgICAgICAgICAgICAgIDogICBOb3JtYWwgICAgICAgICAgUmluZ1RvbmUgICAgICAgICAgICAgICAgSW5DYWxsICAgICAgICAgICAgICBJbkNvbW11bmljYXRpb24KLUluY2x1c2l2ZUNyaXRlcmlvbiBBdmFpbGFibGVJbnB1dERldmljZXMgICAgICAgIDogICBDb21tdW5pY2F0aW9uIEFtYmllbnQgQnVpbHRpbk1pYyBCbHVldG9vdGhTY29IZWFkc2V0IFdpcmVkSGVhZHNldCBIZG1pIFRlbGVwaG9ueVJ4IEJhY2tNaWMgUmVtb3RlU3VibWl4IEFubGdEb2NrSGVhZHNldCBEZ3RsRG9ja0hlYWRzZXQgVXNiQWNjZXNzb3J5IFVzYkRldmljZSBGbVR1bmVyIFR2VHVuZXIgTGluZSBTcGRpZiBCbHVldG9vdGhBMmRwIExvb3BiYWNrIElwIEJ1cyBTdHViCi1JbmNsdXNpdmVDcml0ZXJpb24gQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyAgICAgICA6ICAgRWFycGllY2UgU3BlYWtlciBXaXJlZFNwZWFrZXIgV2lyZWRIZWFkc2V0IFdpcmVkSGVhZHBob25lIEJsdWV0b290aFNjbyBCbHVldG9vdGhTY29IZWFkc2V0IEJsdWV0b290aFNjb0NhcmtpdCBCbHVldG9vdGhBMmRwIEJsdWV0b290aEEyZHBIZWFkcGhvbmVzIEJsdWV0b290aEEyZHBTcGVha2VyIEhkbWkgQW5sZ0RvY2tIZWFkc2V0IERndGxEb2NrSGVhZHNldCBVc2JBY2Nlc3NvcnkgVXNiRGV2aWNlIFJlbW90ZVN1Ym1peCBUZWxlcGhvbnlUeCBMaW5lIEhkbWlBcmMgU3BkaWYgRm0gQXV4TGluZSBTcGVha2VyU2FmZSBJcCBCdXMgU3R1YgotRXhjbHVzaXZlQ3JpdGVyaW9uIEZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvbiAgICAgOiAgIEZvcmNlTm9uZSAgICAgICBGb3JjZVNwZWFrZXIgICAgICAgICAgICBGb3JjZUJ0U2NvCi1FeGNsdXNpdmVDcml0ZXJpb24gRm9yY2VVc2VGb3JNZWRpYSAgICAgICAgICAgICA6ICAgRm9yY2VOb25lICAgICAgIEZvcmNlU3BlYWtlcgkJCUZvcmNlSGVhZHBob25lcyAgICAgICAgIEZvcmNlQnRBMmRwICAgICAgICAgRm9yY2VXaXJlZEFjY2Vzc29yeSBGb3JjZUFuYWxvZ0RvY2sgRm9yY2VEaWdpdGFsRG9jayAgICBGb3JjZU5vQnRBMmRwICAgICAgIEZvcmNlU3lzdGVtRW5mb3JjZWQKLUV4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvclJlY29yZCAgICAgICAgICAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VCdFNjbyAgICAgICAgICAgICAgRm9yY2VXaXJlZEFjY2Vzc29yeQotRXhjbHVzaXZlQ3JpdGVyaW9uIEZvcmNlVXNlRm9yRG9jayAgICAgICAgICAgICAgOiAgIEZvcmNlTm9uZSAgICAgICBGb3JjZVdpcmVkQWNjZXNzb3J5ICAgICBGb3JjZUJ0Q2FyRG9jayAgICAgIEZvcmNlQnREZXNrRG9jayAgICAgRm9yY2VBbmFsb2dEb2NrIEZvcmNlRGlnaXRhbERvY2sKLUV4Y2x1c2l2ZUNyaXRlcmlvbiBGb3JjZVVzZUZvclN5c3RlbSAgICAgICAgICAgIDogICBGb3JjZU5vbmUgICAgICAgRm9yY2VTeXN0ZW1FbmZvcmNlZAotRXhjbHVzaXZlQ3JpdGVyaW9uIEZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvICAgOiAgIEZvcmNlTm9uZSAgICAgICBGb3JjZUhkbWlTeXN0ZW1FbmZvcmNlZAotRXhjbHVzaXZlQ3JpdGVyaW9uIEZvcmNlVXNlRm9yRW5jb2RlZFN1cnJvdW5kICAgOiAgIEZvcmNlTm9uZSAgICAgICBGb3JjZUVuY29kZWRTdXJyb3VuZE5ldmVyICAgRm9yY2VFbmNvZGVkU3Vycm91bmRBbHdheXMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjY4NWM2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMzYgQEAKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGlicG9saWN5LXN1YnN5c3RlbSIsCisgICAgc3JjczogWworICAgICAgICAiUG9saWN5U3Vic3lzdGVtQnVpbGRlci5jcHAiLAorICAgICAgICAiUG9saWN5U3Vic3lzdGVtLmNwcCIsCisgICAgICAgICJJbnB1dFNvdXJjZS5jcHAiLAorICAgICAgICAiU3RyZWFtLmNwcCIsCisgICAgICAgICJQcm9kdWN0U3RyYXRlZ3kuY3BwIiwKKyAgICBdLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1mdmlzaWJpbGl0eS1pbmxpbmVzLWhpZGRlbiIsCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICBdLAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJiYXNlX2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9wb2xpY3ljb21tb24iLAorICAgICAgICAibGliYXVkaW9jbGllbnRfaGVhZGVycyIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZV9pbnRlcmZhY2VfaGVhZGVycyIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYWJsZV9pbnRlcmZhY2VfaGVhZGVycyIsCisgICAgXSwKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYXVkaW9wb2xpY3ljb21wb25lbnRzIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lX2NvbW1vbiIsCisgICAgICAgICJsaWJwZndfdXRpbGl0eSIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmFibGUiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJwYXJhbWV0ZXIiCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1NTljZjEuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWlmbmVxICgkKFVTRV9DVVNUT01fUEFSQU1FVEVSX0ZSQU1FV09SSyksIHRydWUpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotTE9DQUxfU1JDX0ZJTEVTIDo9IFwKLSAgICBQb2xpY3lTdWJzeXN0ZW1CdWlsZGVyLmNwcCBcCi0gICAgUG9saWN5U3Vic3lzdGVtLmNwcCBcCi0gICAgU3RyYXRlZ3kuY3BwIFwKLSAgICBJbnB1dFNvdXJjZS5jcHAgXAotICAgIFN0cmVhbS5jcHAgXAotICAgIFVzYWdlLmNwcAotCi1MT0NBTF9DRkxBR1MgKz0gXAotICAgIC1XYWxsIFwKLSAgICAtV2Vycm9yIFwKLSAgICAtV2V4dHJhIFwKLSAgICAtZnZpc2liaWxpdHktaW5saW5lcy1oaWRkZW4gXAotICAgIC1mdmlzaWJpbGl0eT1oaWRkZW4KLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvaW50ZXJmYWNlIFwKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSBcCi0gICAgbGliYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmFibGUgIFwKLSAgICBsaWJwYXJhbWV0ZXIgXAotICAgIGxpYmxvZyBcCi0KLUxPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gbGlicGZ3X3V0aWxpdHkKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLUxPQ0FMX01PRFVMRSA6PSBsaWJwb2xpY3ktc3Vic3lzdGVtCi0KLWluY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKLQotZW5kaWYgIyBpZm5lcSAoJChVU0VfQ1VTVE9NX1BBUkFNRVRFUl9GUkFNRVdPUkspLCB0cnVlKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9JbnB1dFNvdXJjZS5jcHAKaW5kZXggZWFjNGVmZS4uZjkxZjhkNyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL0lucHV0U291cmNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vSW5wdXRTb3VyY2UuY3BwCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSAiSW5wdXRTb3VyY2UuaCIKICNpbmNsdWRlICJQb2xpY3lNYXBwaW5nS2V5cy5oIgogI2luY2x1ZGUgIlBvbGljeVN1YnN5c3RlbS5oIgorI2luY2x1ZGUgPG1lZGlhL1R5cGVDb252ZXJ0ZXIuaD4KIAogdXNpbmcgc3RkOjpzdHJpbmc7CiAKQEAgLTMzLDkgKzM0LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQtPmdldEJlbG9uZ2luZ1N1YnN5c3RlbSgpKSksCiAgICAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlKG1Qb2xpY3lTdWJzeXN0ZW0tPmdldFBvbGljeVBsdWdpbkludGVyZmFjZSgpKQogewotICAgIG1JZCA9IHN0YXRpY19jYXN0PGF1ZGlvX3NvdXJjZV90Pihjb250ZXh0LmdldEl0ZW1Bc0ludGVnZXIoTWFwcGluZ0tleUlkZW50aWZpZXIpKTsKKyAgICBzdGQ6OnN0cmluZyBuYW1lKGNvbnRleHQuZ2V0SXRlbShNYXBwaW5nS2V5TmFtZSkpOworCisgICAgaWYobm90IGFuZHJvaWQ6OlNvdXJjZVR5cGVDb252ZXJ0ZXI6OmZyb21TdHJpbmcobmFtZSwgbUlkKSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMKCJJbnZhbGlkIElucHV0IFNvdXJjZSBuYW1lOiAlcywgaW52YWxpZCBYTUwgc3RydWN0dXJlIGZpbGUiLCBuYW1lLmNfc3RyKCkpOworICAgIH0KICAgICAvLyBEZWNsYXJlcyB0aGUgc3RyYXRlZ3kgdG8gYXVkaW8gcG9saWN5IGVuZ2luZQotICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPmFkZElucHV0U291cmNlKGdldEZvcm1hdHRlZE1hcHBpbmdWYWx1ZSgpLCBtSWQpOworICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPmFkZElucHV0U291cmNlKG5hbWUsIG1JZCk7CiB9CiAKIGJvb2wgSW5wdXRTb3VyY2U6OnNlbmRUb0hXKHN0cmluZyAmIC8qZXJyb3IqLykKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5jcHAKaW5kZXggOThkMTBhOS4uOGJkN2Y2NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5jcHAKQEAgLTE3LDEwICsxNyw5IEBACiAjaW5jbHVkZSAiUG9saWN5U3Vic3lzdGVtLmgiCiAjaW5jbHVkZSAiU3Vic3lzdGVtT2JqZWN0RmFjdG9yeS5oIgogI2luY2x1ZGUgIlBvbGljeU1hcHBpbmdLZXlzLmgiCi0jaW5jbHVkZSAiU3RyYXRlZ3kuaCIKICNpbmNsdWRlICJTdHJlYW0uaCIKICNpbmNsdWRlICJJbnB1dFNvdXJjZS5oIgotI2luY2x1ZGUgIlVzYWdlLmgiCisjaW5jbHVkZSAiUHJvZHVjdFN0cmF0ZWd5LmgiCiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxBdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CkBAIC0zNiw5ICszNSw4IEBACiAKIAogY29uc3QgY2hhciAqY29uc3QgUG9saWN5U3Vic3lzdGVtOjptU3RyZWFtQ29tcG9uZW50TmFtZSA9ICJTdHJlYW0iOwotY29uc3QgY2hhciAqY29uc3QgUG9saWN5U3Vic3lzdGVtOjptU3RyYXRlZ3lDb21wb25lbnROYW1lID0gIlN0cmF0ZWd5IjsKIGNvbnN0IGNoYXIgKmNvbnN0IFBvbGljeVN1YnN5c3RlbTo6bUlucHV0U291cmNlQ29tcG9uZW50TmFtZSA9ICJJbnB1dFNvdXJjZSI7Ci1jb25zdCBjaGFyICpjb25zdCBQb2xpY3lTdWJzeXN0ZW06Om1Vc2FnZUNvbXBvbmVudE5hbWUgPSAiVXNhZ2UiOworY29uc3QgY2hhciAqY29uc3QgUG9saWN5U3Vic3lzdGVtOjptUHJvZHVjdFN0cmF0ZWd5Q29tcG9uZW50TmFtZSA9ICJQcm9kdWN0U3RyYXRlZ3kiOwogCiBQb2xpY3lTdWJzeXN0ZW06OlBvbGljeVN1YnN5c3RlbShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgY29yZTo6bG9nOjpMb2dnZXIgJmxvZ2dlcikKICAgICA6IENTdWJzeXN0ZW0obmFtZSwgbG9nZ2VyKSwKQEAgLTY1LDIyICs2MywxNiBAQAogICAgIGFkZFN1YnN5c3RlbU9iamVjdEZhY3RvcnkoCiAgICAgICAgIG5ldyBUU3Vic3lzdGVtT2JqZWN0RmFjdG9yeTxTdHJlYW0+KAogICAgICAgICAgICAgbVN0cmVhbUNvbXBvbmVudE5hbWUsCi0gICAgICAgICAgICAoMSA8PCBNYXBwaW5nS2V5SWRlbnRpZmllcikpCi0gICAgICAgICk7Ci0gICAgYWRkU3Vic3lzdGVtT2JqZWN0RmFjdG9yeSgKLSAgICAgICAgbmV3IFRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5PFN0cmF0ZWd5PigKLSAgICAgICAgICAgIG1TdHJhdGVneUNvbXBvbmVudE5hbWUsCi0gICAgICAgICAgICAoMSA8PCBNYXBwaW5nS2V5QW1lbmQxKSB8ICgxIDw8IE1hcHBpbmdLZXlJZGVudGlmaWVyKSkKLSAgICAgICAgKTsKLSAgICBhZGRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5KAotICAgICAgICBuZXcgVFN1YnN5c3RlbU9iamVjdEZhY3Rvcnk8VXNhZ2U+KAotICAgICAgICAgICAgbVVzYWdlQ29tcG9uZW50TmFtZSwKLSAgICAgICAgICAgICgxIDw8IE1hcHBpbmdLZXlBbWVuZDEpIHwgKDEgPDwgTWFwcGluZ0tleUlkZW50aWZpZXIpKQorICAgICAgICAgICAgKDEgPDwgTWFwcGluZ0tleU5hbWUpKQogICAgICAgICApOwogICAgIGFkZFN1YnN5c3RlbU9iamVjdEZhY3RvcnkoCiAgICAgICAgIG5ldyBUU3Vic3lzdGVtT2JqZWN0RmFjdG9yeTxJbnB1dFNvdXJjZT4oCiAgICAgICAgICAgICBtSW5wdXRTb3VyY2VDb21wb25lbnROYW1lLAotICAgICAgICAgICAgKDEgPDwgTWFwcGluZ0tleUFtZW5kMSkgfCAoMSA8PCBNYXBwaW5nS2V5SWRlbnRpZmllcikpCisgICAgICAgICAgICAoMSA8PCBNYXBwaW5nS2V5TmFtZSkpCisgICAgICAgICk7CisgICAgYWRkU3Vic3lzdGVtT2JqZWN0RmFjdG9yeSgKKyAgICAgICAgbmV3IFRTdWJzeXN0ZW1PYmplY3RGYWN0b3J5PFByb2R1Y3RTdHJhdGVneT4oCisgICAgICAgICAgICBtUHJvZHVjdFN0cmF0ZWd5Q29tcG9uZW50TmFtZSwgKDEgPDwgTWFwcGluZ0tleU5hbWUpKQogICAgICAgICApOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vUG9saWN5U3Vic3lzdGVtLmgKaW5kZXggODIyZWViOS4uOWJmMWMyMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1BvbGljeVN1YnN5c3RlbS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qb2xpY3lTdWJzeXN0ZW0uaApAQCAtNTMsNyArNTMsNiBAQAogICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtS2V5QW1lbmQzOyAvKio8IGFtZW5kMyBrZXkgbWFwcGluZyBzdHJpbmcuICovCiAKICAgICBzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgbVN0cmVhbUNvbXBvbmVudE5hbWU7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1TdHJhdGVneUNvbXBvbmVudE5hbWU7CiAgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1JbnB1dFNvdXJjZUNvbXBvbmVudE5hbWU7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1Vc2FnZUNvbXBvbmVudE5hbWU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IG1Qcm9kdWN0U3RyYXRlZ3lDb21wb25lbnROYW1lOwogfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWJkOTQ1NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuY3BwCkBAIC0wLDAgKzEsNjAgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiUHJvZHVjdFN0cmF0ZWd5LmgiCisjaW5jbHVkZSAiUG9saWN5TWFwcGluZ0tleXMuaCIKKyNpbmNsdWRlICJQb2xpY3lTdWJzeXN0ZW0uaCIKKwordXNpbmcgc3RkOjpzdHJpbmc7Cit1c2luZyBhbmRyb2lkOjpwcm9kdWN0X3N0cmF0ZWd5X3Q7CisKK1Byb2R1Y3RTdHJhdGVneTo6UHJvZHVjdFN0cmF0ZWd5KGNvbnN0IHN0cmluZyAmbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBDTWFwcGluZ0NvbnRleHQgJmNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgY29yZTo6bG9nOjpMb2dnZXImIGxvZ2dlcikKKyAgICA6IENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QoaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0tleUFtZW5kMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1hcHBpbmdLZXlBbWVuZEVuZCAtIE1hcHBpbmdLZXlBbWVuZDEgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCkKK3sKKyAgICBzdGQ6OnN0cmluZyBuYW1lKGNvbnRleHQuZ2V0SXRlbShNYXBwaW5nS2V5TmFtZSkpOworCisgICAgQUxPR19BU1NFUlQoaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICE9IG51bGxwdHIsICJJbnZhbGlkIENvbmZpZ3VyYWJsZSBFbGVtZW50Iik7CisgICAgbVBvbGljeVN1YnN5c3RlbSA9IHN0YXRpY19jYXN0PGNvbnN0IFBvbGljeVN1YnN5c3RlbSAqPigKKyAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQtPmdldEJlbG9uZ2luZ1N1YnN5c3RlbSgpKTsKKyAgICBBTE9HX0FTU0VSVChtUG9saWN5U3Vic3lzdGVtICE9IG51bGxwdHIsICJJbnZhbGlkIFBvbGljeSBTdWJzeXN0ZW0iKTsKKworICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgPSBtUG9saWN5U3Vic3lzdGVtLT5nZXRQb2xpY3lQbHVnaW5JbnRlcmZhY2UoKTsKKyAgICBBTE9HX0FTU0VSVChtUG9saWN5UGx1Z2luSW50ZXJmYWNlICE9IG51bGxwdHIsICJJbnZhbGlkIFBvbGljeSBQbHVnaW4gSW50ZXJmYWNlIik7CisKKyAgICBtSWQgPSBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5nZXRQcm9kdWN0U3RyYXRlZ3lCeU5hbWUobmFtZSk7CisKKyAgICBBTE9HX0FTU0VSVChtSWQgIT0gUFJPRFVDVF9TVFJBVEVHWV9JTlZBTElELCAiUHJvZHVjdCBTdHJhdGVneSAlcyBub3QgZm91bmQiLCBuYW1lLmNfc3RyKCkpOworCisgICAgQUxPR0UoIlByb2R1Y3QgU3RyYXRlZ3kgJXMgYWRkZWQiLCBuYW1lLmNfc3RyKCkpOworfQorCitib29sIFByb2R1Y3RTdHJhdGVneTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQoreworICAgIERldmljZSBkZXZpY2VQYXJhbXM7CisgICAgYmxhY2tib2FyZFJlYWQoJmRldmljZVBhcmFtcywgc2l6ZW9mKGRldmljZVBhcmFtcykpOworCisgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0RGV2aWNlVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kobUlkLCBkZXZpY2VQYXJhbXMuYXBwbGljYWJsZURldmljZSk7CisgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0RGV2aWNlQWRkcmVzc0ZvclByb2R1Y3RTdHJhdGVneShtSWQsIGRldmljZVBhcmFtcy5kZXZpY2VBZGRyZXNzKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Qcm9kdWN0U3RyYXRlZ3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDRmMDgyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1Byb2R1Y3RTdHJhdGVneS5oCkBAIC0wLDAgKzEsNTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjcHJhZ21hIG9uY2UKKworI2luY2x1ZGUgIkZvcm1hdHRlZFN1YnN5c3RlbU9iamVjdC5oIgorI2luY2x1ZGUgIkluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC5oIgorI2luY2x1ZGUgIk1hcHBpbmdDb250ZXh0LmgiCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaD4KKyNpbmNsdWRlIDxwb2xpY3kuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK2NsYXNzIFBvbGljeVN1YnN5c3RlbTsKKworY2xhc3MgUHJvZHVjdFN0cmF0ZWd5IDogcHVibGljIENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QKK3sKK3ByaXZhdGU6CisgICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IG1NYXhTdHJpbmdTaXplID0gMjU3OyAvKio8IG1heCBzdHJpbmcgc2l6ZSAocGx1cyB6ZXJvIHRlcm1pbmFsKS4gKi8KKworICAgIHN0cnVjdCBEZXZpY2UKKyAgICB7CisgICAgICAgIHVpbnQzMl90IGFwcGxpY2FibGVEZXZpY2U7IC8qKjwgYXBwbGljYWJsZSBkZXZpY2UgZm9yIHRoaXMgc3RyYXRlZ3kuICovCisgICAgICAgIGNoYXIgZGV2aWNlQWRkcmVzc1ttTWF4U3RyaW5nU2l6ZV07IC8qKjwgZGV2aWNlIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoaXMgc3RyYXRlZ3kuICovCisgICAgfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworcHVibGljOgorICAgIFByb2R1Y3RTdHJhdGVneShjb25zdCBzdGQ6OnN0cmluZyAmbWFwcGluZ1ZhbHVlLAorICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKKyAgICAgICAgICAgICBjb25zdCBDTWFwcGluZ0NvbnRleHQgJmNvbnRleHQsCisgICAgICAgICAgICAgY29yZTo6bG9nOjpMb2dnZXImIGxvZ2dlcik7CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIGJvb2wgc2VuZFRvSFcoc3RkOjpzdHJpbmcgJmVycm9yKTsKKworcHJpdmF0ZToKKyAgICBjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKm1Qb2xpY3lTdWJzeXN0ZW07IC8qKjwgUm91dGUgc3Vic3l0ZW0gcGx1Z2luLiAqLworCisgICAgYW5kcm9pZDo6cHJvZHVjdF9zdHJhdGVneV90IG1JZDsKKworICAgIC8qKgorICAgICAqIEludGVyZmFjZSB0byBjb21tdW5pY2F0ZSB3aXRoIEF1ZGlvIFBvbGljeSBFbmdpbmUuCisgICAgICovCisgICAgYW5kcm9pZDo6QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKm1Qb2xpY3lQbHVnaW5JbnRlcmZhY2U7Cit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmF0ZWd5LmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0NmMzYTguLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmF0ZWd5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSAiU3RyYXRlZ3kuaCIKLSNpbmNsdWRlICJQb2xpY3lNYXBwaW5nS2V5cy5oIgotI2luY2x1ZGUgIlBvbGljeVN1YnN5c3RlbS5oIgotCi11c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIGFuZHJvaWQ6OnJvdXRpbmdfc3RyYXRlZ3k7Ci0KLVN0cmF0ZWd5OjpTdHJhdGVneShjb25zdCBzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0LAotICAgICAgICAgICAgICAgICAgIGNvcmU6OmxvZzo6TG9nZ2VyJiBsb2dnZXIpCi0gICAgOiBDRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0KGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBwaW5nVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcHBpbmdLZXlBbWVuZDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNYXBwaW5nS2V5QW1lbmRFbmQgLSBNYXBwaW5nS2V5QW1lbmQxICsgMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQpLAotICAgICAgbVBvbGljeVN1YnN5c3RlbShzdGF0aWNfY2FzdDxjb25zdCBQb2xpY3lTdWJzeXN0ZW0gKj4oCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQtPmdldEJlbG9uZ2luZ1N1YnN5c3RlbSgpKSksCi0gICAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlKG1Qb2xpY3lTdWJzeXN0ZW0tPmdldFBvbGljeVBsdWdpbkludGVyZmFjZSgpKQotewotICAgIG1JZCA9IHN0YXRpY19jYXN0PHJvdXRpbmdfc3RyYXRlZ3k+KGNvbnRleHQuZ2V0SXRlbUFzSW50ZWdlcihNYXBwaW5nS2V5SWRlbnRpZmllcikpOwotCi0gICAgLy8gRGVjbGFyZXMgdGhlIHN0cmF0ZWd5IHRvIGF1ZGlvIHBvbGljeSBlbmdpbmUKLSAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5hZGRTdHJhdGVneShnZXRGb3JtYXR0ZWRNYXBwaW5nVmFsdWUoKSwgbUlkKTsKLX0KLQotYm9vbCBTdHJhdGVneTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQotewotICAgIHVpbnQzMl90IGFwcGxpY2FibGVPdXRwdXREZXZpY2U7Ci0gICAgYmxhY2tib2FyZFJlYWQoJmFwcGxpY2FibGVPdXRwdXREZXZpY2UsIHNpemVvZihhcHBsaWNhYmxlT3V0cHV0RGV2aWNlKSk7Ci0gICAgcmV0dXJuIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPnNldERldmljZUZvclN0cmF0ZWd5KG1JZCwgYXBwbGljYWJsZU91dHB1dERldmljZSk7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyYXRlZ3kuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDJiODJjLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJhdGVneS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0LmgiCi0jaW5jbHVkZSAiSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LmgiCi0jaW5jbHVkZSAiTWFwcGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlIDxBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oPgotI2luY2x1ZGUgPHN0cmluZz4KLQotY2xhc3MgUG9saWN5U3Vic3lzdGVtOwotCi1jbGFzcyBTdHJhdGVneSA6IHB1YmxpYyBDRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0Ci17Ci1wdWJsaWM6Ci0gICAgU3RyYXRlZ3koY29uc3Qgc3RkOjpzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKLSAgICAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCi0gICAgICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0LAotICAgICAgICAgICAgIGNvcmU6OmxvZzo6TG9nZ2VyJiBsb2dnZXIpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBib29sIHNlbmRUb0hXKHN0ZDo6c3RyaW5nICZlcnJvcik7Ci0KLXByaXZhdGU6Ci0gICAgY29uc3QgUG9saWN5U3Vic3lzdGVtICptUG9saWN5U3Vic3lzdGVtOyAvKio8IFJvdXRlIHN1YnN5dGVtIHBsdWdpbi4gKi8KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSB0byBjb21tdW5pY2F0ZSB3aXRoIEF1ZGlvIFBvbGljeSBFbmdpbmUuCi0gICAgICovCi0gICAgYW5kcm9pZDo6QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKm1Qb2xpY3lQbHVnaW5JbnRlcmZhY2U7Ci0KLSAgICBhbmRyb2lkOjpyb3V0aW5nX3N0cmF0ZWd5IG1JZDsgLyoqPCBzdHJhdGVneSBpZGVudGlmaWVyIHRvIGxpbmsgd2l0aCBhdWRpby5oLiovCi19OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyZWFtLmNwcAppbmRleCBjNjQyYTIzLi41MjMwZTBlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyZWFtLmNwcApAQCAtMTcsOSArMTcsOSBAQAogI2luY2x1ZGUgIlN0cmVhbS5oIgogI2luY2x1ZGUgIlBvbGljeU1hcHBpbmdLZXlzLmgiCiAjaW5jbHVkZSAiUG9saWN5U3Vic3lzdGVtLmgiCisjaW5jbHVkZSA8bWVkaWEvVHlwZUNvbnZlcnRlci5oPgogCiB1c2luZyBzdGQ6OnN0cmluZzsKLXVzaW5nIGFuZHJvaWQ6OnJvdXRpbmdfc3RyYXRlZ3k7CiAKIFN0cmVhbTo6U3RyZWFtKGNvbnN0IHN0cmluZyAmLyptYXBwaW5nVmFsdWUqLywKICAgICAgICAgICAgICAgIENJbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQgKmluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCwKQEAgLTI5LDEwICsyOSwxNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LT5nZXRCZWxvbmdpbmdTdWJzeXN0ZW0oKSkpLAogICAgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZShtUG9saWN5U3Vic3lzdGVtLT5nZXRQb2xpY3lQbHVnaW5JbnRlcmZhY2UoKSkKIHsKLSAgICBtSWQgPSBzdGF0aWNfY2FzdDxhdWRpb19zdHJlYW1fdHlwZV90Pihjb250ZXh0LmdldEl0ZW1Bc0ludGVnZXIoTWFwcGluZ0tleUlkZW50aWZpZXIpKTsKKyAgICBzdGQ6OnN0cmluZyBuYW1lKGNvbnRleHQuZ2V0SXRlbShNYXBwaW5nS2V5TmFtZSkpOworCisgICAgaWYgKG5vdCBhbmRyb2lkOjpTdHJlYW1UeXBlQ29udmVydGVyOjpmcm9tU3RyaW5nKG5hbWUsIG1JZCkpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTCgiSW52YWxpZCBTdHJlYW0gdHlwZSBuYW1lOiAlcywgaW52YWxpZCBYTUwgc3RydWN0dXJlIGZpbGUiLCBuYW1lLmNfc3RyKCkpOworICAgIH0KIAogICAgIC8vIERlY2xhcmVzIHRoZSBzdHJhdGVneSB0byBhdWRpbyBwb2xpY3kgZW5naW5lCi0gICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+YWRkU3RyZWFtKGdldEZvcm1hdHRlZE1hcHBpbmdWYWx1ZSgpLCBtSWQpOworICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPmFkZFN0cmVhbShuYW1lLCBtSWQpOwogfQogCiBib29sIFN0cmVhbTo6c2VuZFRvSFcoc3RyaW5nICYgLyplcnJvciovKQpAQCAtNDAsMTEgKzQ0LDggQEAKICAgICBBcHBsaWNhYmxlIHBhcmFtczsKICAgICBibGFja2JvYXJkUmVhZCgmcGFyYW1zLCBzaXplb2YocGFyYW1zKSk7CiAKLSAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5zZXRTdHJhdGVneUZvclN0cmVhbShtSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8cm91dGluZ19zdHJhdGVneT4ocGFyYW1zLnN0cmF0ZWd5KSk7Ci0KLSAgICBtUG9saWN5UGx1Z2luSW50ZXJmYWNlLT5zZXRWb2x1bWVQcm9maWxlRm9yU3RyZWFtKG1JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHBhcmFtcy52b2x1bWVQcm9maWxlKSk7CisgICAgbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0Vm9sdW1lUHJvZmlsZUZvclN0cmVhbSgKKyAgICAgICAgICAgICAgICBtSWQsIHN0YXRpY19jYXN0PGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHBhcmFtcy52b2x1bWVQcm9maWxlKSk7CiAKICAgICByZXR1cm4gdHJ1ZTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3BhcmFtZXRlci1mcmFtZXdvcmsvcGx1Z2luL1N0cmVhbS5oCmluZGV4IDRhODc1ZGIuLmUwY2UyZmEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9TdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vU3RyZWFtLmgKQEAgLTI5LDcgKzI5LDYgQEAKIHByaXZhdGU6CiAgICAgc3RydWN0IEFwcGxpY2FibGUKICAgICB7Ci0gICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5OyAvKio8IGFwcGxpY2FibGUgc3RyYXRlZ3kgZm9yIHRoaXMgc3RyZWFtLiAqLwogICAgICAgICB1aW50MzJfdCB2b2x1bWVQcm9maWxlOyAvKio8IGFwcGxpY2FibGUgc3RyYXRlZ3kgZm9yIHRoaXMgc3RyZWFtLiAqLwogICAgIH0gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Vc2FnZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuY3BwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODE5OWY4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Vc2FnZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgIlVzYWdlLmgiCi0jaW5jbHVkZSAiUG9saWN5TWFwcGluZ0tleXMuaCIKLSNpbmNsdWRlICJQb2xpY3lTdWJzeXN0ZW0uaCIKLQotdXNpbmcgc3RkOjpzdHJpbmc7Ci11c2luZyBhbmRyb2lkOjpyb3V0aW5nX3N0cmF0ZWd5OwotCi1Vc2FnZTo6VXNhZ2UoY29uc3Qgc3RyaW5nICZtYXBwaW5nVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgQ0luc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudCAqaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IENNYXBwaW5nQ29udGV4dCAmY29udGV4dCwgY29yZTo6bG9nOjpMb2dnZXIgJmxvZ2dlcikKLSAgICA6IENGb3JtYXR0ZWRTdWJzeXN0ZW1PYmplY3QoaW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcHBpbmdWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZ0tleUFtZW5kMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1hcHBpbmdLZXlBbWVuZEVuZCAtIE1hcHBpbmdLZXlBbWVuZDEgKyAxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCksCi0gICAgICBtUG9saWN5U3Vic3lzdGVtKHN0YXRpY19jYXN0PGNvbnN0IFBvbGljeVN1YnN5c3RlbSAqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGluc3RhbmNlQ29uZmlndXJhYmxlRWxlbWVudC0+Z2V0QmVsb25naW5nU3Vic3lzdGVtKCkpKSwKLSAgICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UobVBvbGljeVN1YnN5c3RlbS0+Z2V0UG9saWN5UGx1Z2luSW50ZXJmYWNlKCkpCi17Ci0gICAgbUlkID0gc3RhdGljX2Nhc3Q8YXVkaW9fdXNhZ2VfdD4oY29udGV4dC5nZXRJdGVtQXNJbnRlZ2VyKE1hcHBpbmdLZXlJZGVudGlmaWVyKSk7Ci0KLSAgICAvLyBEZWNsYXJlcyB0aGUgc3RyYXRlZ3kgdG8gYXVkaW8gcG9saWN5IGVuZ2luZQotICAgIG1Qb2xpY3lQbHVnaW5JbnRlcmZhY2UtPmFkZFVzYWdlKGdldEZvcm1hdHRlZE1hcHBpbmdWYWx1ZSgpLCBtSWQpOwotfQotCi1ib29sIFVzYWdlOjpzZW5kVG9IVyhzdHJpbmcgJiAvKmVycm9yKi8pCi17Ci0gICAgdWludDMyX3QgYXBwbGljYWJsZVN0cmF0ZWd5OwotICAgIGJsYWNrYm9hcmRSZWFkKCZhcHBsaWNhYmxlU3RyYXRlZ3ksIHNpemVvZihhcHBsaWNhYmxlU3RyYXRlZ3kpKTsKLSAgICByZXR1cm4gbVBvbGljeVBsdWdpbkludGVyZmFjZS0+c2V0U3RyYXRlZ3lGb3JVc2FnZShtSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8cm91dGluZ19zdHJhdGVneT4oYXBwbGljYWJsZVN0cmF0ZWd5KSk7Ci19CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvcGFyYW1ldGVyLWZyYW1ld29yay9wbHVnaW4vVXNhZ2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Vc2FnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NjAyMDRmLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9wYXJhbWV0ZXItZnJhbWV3b3JrL3BsdWdpbi9Vc2FnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNwcmFnbWEgb25jZQotCi0jaW5jbHVkZSAiRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0LmgiCi0jaW5jbHVkZSAiSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50LmgiCi0jaW5jbHVkZSAiTWFwcGluZ0NvbnRleHQuaCIKLSNpbmNsdWRlIDxBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZS5oPgotI2luY2x1ZGUgPHN0cmluZz4KLQotY2xhc3MgUG9saWN5U3Vic3lzdGVtOwotCi1jbGFzcyBVc2FnZSA6IHB1YmxpYyBDRm9ybWF0dGVkU3Vic3lzdGVtT2JqZWN0Ci17Ci1wdWJsaWM6Ci0gICAgVXNhZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJm1hcHBpbmdWYWx1ZSwKLSAgICAgICAgICBDSW5zdGFuY2VDb25maWd1cmFibGVFbGVtZW50ICppbnN0YW5jZUNvbmZpZ3VyYWJsZUVsZW1lbnQsCi0gICAgICAgICAgY29uc3QgQ01hcHBpbmdDb250ZXh0ICZjb250ZXh0LAotICAgICAgICAgIGNvcmU6OmxvZzo6TG9nZ2VyJiBsb2dnZXIpOwotCi1wcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBib29sIHNlbmRUb0hXKHN0ZDo6c3RyaW5nICZlcnJvcik7Ci0KLXByaXZhdGU6Ci0gICAgY29uc3QgUG9saWN5U3Vic3lzdGVtICptUG9saWN5U3Vic3lzdGVtOyAvKio8IFJvdXRlIHN1YnN5dGVtIHBsdWdpbi4gKi8KLQotICAgIC8qKgotICAgICAqIEludGVyZmFjZSB0byBjb21tdW5pY2F0ZSB3aXRoIEF1ZGlvIFBvbGljeSBFbmdpbmUuCi0gICAgICovCi0gICAgYW5kcm9pZDo6QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UgKm1Qb2xpY3lQbHVnaW5JbnRlcmZhY2U7Ci0KLSAgICBhdWRpb191c2FnZV90IG1JZDsgLyoqPCB1c2FnZSBpZGVudGlmaWVyIHRvIGxpbmsgd2l0aCBhdWRpby5oLiAqLwotfTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zZXBvbGljeS9hdWRpb3NlcnZlci50ZSBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zZXBvbGljeS9hdWRpb3NlcnZlci50ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDQxZDQyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NlcG9saWN5L2F1ZGlvc2VydmVyLnRlCkBAIC0wLDAgKzEsNCBAQAordXNlcmRlYnVnX29yX2VuZyhgCisgIGFsbG93IGF1ZGlvc2VydmVyIGF1ZGlvc2VydmVyX3NvY2tldDpkaXIgcndfZGlyX3Blcm1zOworICBhbGxvdyBhdWRpb3NlcnZlciBhdWRpb3NlcnZlcl9zb2NrZXQ6c29ja19maWxlIGNyZWF0ZV9maWxlX3Blcm1zOworJykKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zZXBvbGljeS9maWxlLnRlIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NlcG9saWN5L2ZpbGUudGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RiMTkzNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zZXBvbGljeS9maWxlLnRlCkBAIC0wLDAgKzEsMiBAQAorIyBQb2xpY3kgRW5naW5lIHJlbW90ZSBjb25uZWN0aW9uIGZvciBydW50aW1lIGRlYnVnIG9mIHBhcmFtZXRlciBmcmFtZXdvcmsKK3R5cGUgYXVkaW9zZXJ2ZXJfc29ja2V0LCBmaWxlX3R5cGUsIGNvcmVkb21haW5fc29ja2V0OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NlcG9saWN5L2ZpbGVfY29udGV4dHMgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc2Vwb2xpY3kvZmlsZV9jb250ZXh0cwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NTBmY2NlCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NlcG9saWN5L2ZpbGVfY29udGV4dHMKQEAgLTAsMCArMSBAQAorL2Rldi9zb2NrZXQvYXVkaW9zZXJ2ZXIoLy4qKT8gICAgdTpvYmplY3RfcjphdWRpb3NlcnZlcl9zb2NrZXQ6czAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvQ29sbGVjdGlvbi5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Db2xsZWN0aW9uLmgKaW5kZXggYjcyZGVkOC4uMDJiNDFjYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Db2xsZWN0aW9uLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Db2xsZWN0aW9uLmgKQEAgLTE4LDggKzE4LDYgQEAKIAogI2luY2x1ZGUgIkVsZW1lbnQuaCIKICNpbmNsdWRlICJTdHJlYW0uaCIKLSNpbmNsdWRlICJTdHJhdGVneS5oIgotI2luY2x1ZGUgIlVzYWdlLmgiCiAjaW5jbHVkZSAiSW5wdXRTb3VyY2UuaCIKICNpbmNsdWRlIDx1dGlscy9FcnJvcnMuaD4KICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KQEAgLTI4LDEwICsyNiw4IEBACiAjaW5jbHVkZSA8c3RkaW50Lmg+CiAjaW5jbHVkZSA8c3RyaW5nPgogCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CiAKIC8qKgogICogQ29sbGVjdGlvbiBvZiBwb2xpY3kgZWxlbWVudCBhcyBhIG1hcCBpbmRleGVkIHdpdGggYSB0aGVpciBVSUQgdHlwZS4KQEAgLTE0OSwxNSArMTQ1LDkgQEAKIHRlbXBsYXRlIDw+CiBzdHJ1Y3QgQ29sbGVjdGlvbjxzdGQ6OnN0cmluZz46OmNvbGxlY3Rpb25TdXBwb3J0ZWQge307CiB0ZW1wbGF0ZSA8Pgotc3RydWN0IENvbGxlY3Rpb248YXVkaW9fdXNhZ2VfdD46OmNvbGxlY3Rpb25TdXBwb3J0ZWQge307Ci10ZW1wbGF0ZSA8Pgogc3RydWN0IENvbGxlY3Rpb248YXVkaW9fc291cmNlX3Q+Ojpjb2xsZWN0aW9uU3VwcG9ydGVkIHt9OwotdGVtcGxhdGUgPD4KLXN0cnVjdCBDb2xsZWN0aW9uPHJvdXRpbmdfc3RyYXRlZ3k+Ojpjb2xsZWN0aW9uU3VwcG9ydGVkIHt9OwogCi10eXBlZGVmIENvbGxlY3Rpb248cm91dGluZ19zdHJhdGVneT4gU3RyYXRlZ3lDb2xsZWN0aW9uOwogdHlwZWRlZiBDb2xsZWN0aW9uPGF1ZGlvX3N0cmVhbV90eXBlX3Q+IFN0cmVhbUNvbGxlY3Rpb247Ci10eXBlZGVmIENvbGxlY3Rpb248YXVkaW9fdXNhZ2VfdD4gVXNhZ2VDb2xsZWN0aW9uOwogdHlwZWRlZiBDb2xsZWN0aW9uPGF1ZGlvX3NvdXJjZV90PiBJbnB1dFNvdXJjZUNvbGxlY3Rpb247CiAKIH0gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbGVtZW50LmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VsZW1lbnQuaAppbmRleCA1MmU3N2U1Li45Nzk1MGQ4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VsZW1lbnQuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VsZW1lbnQuaApAQCAtMjIsMTAgKzIyLDggQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgewogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5PgogY2xhc3MgRWxlbWVudApAQCAtNjQsNyArNjIsNyBAQAogCiAgICAgLyoqCiAgICAgICogQSBQb2xpY3kgZWxlbWVudCBtYXkgaW1wbGVtZW50IGdldHRlci9zZXR0ZXIgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCi0gICAgICogUHJvcGVydHkgbWF5IGJlIHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CisgICAgICogUHJvcGVydHkgbWF5IGJlIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CiAgICAgICogb3IgYSBzdHJpbmcuCiAgICAgICoKICAgICAgKiBAdHBhcmFtIFByb3BlcnR5IGZvciB3aGljaCB0aGlzIHBvbGljeSBlbGVtZW50IGhhcyBzZXR0ZXIgLyBnZXR0ZXIuCkBAIC03NSw3ICs3Myw3IEBACiAKICAgICAvKioKICAgICAgKiBBIFBvbGljeSBlbGVtZW50IG1heSBpbXBsZW1lbnQgZ2V0dGVyL3NldHRlciBmdW5jdGlvbiBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KLSAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgcm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKKyAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKICAgICAgKiBvciBhIHN0cmluZy4KICAgICAgKgogICAgICAqIEB0cGFyYW0gUHJvcGVydHkgZm9yIHdoaWNoIHRoaXMgcG9saWN5IGVsZW1lbnQgaGFzIHNldHRlciAvIGdldHRlci4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmNwcAppbmRleCAwZDE4ZmZhLi42ZDQyZmNmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuY3BwCkBAIC0yNSw5MiArMjUsNjcgQEAKICNlbmRpZgogCiAjaW5jbHVkZSAiRW5naW5lLmgiCi0jaW5jbHVkZSAiU3RyYXRlZ3kuaCIKICNpbmNsdWRlICJTdHJlYW0uaCIKICNpbmNsdWRlICJJbnB1dFNvdXJjZS5oIgotI2luY2x1ZGUgIlVzYWdlLmgiCisKKyNpbmNsdWRlIDxFbmdpbmVDb25maWcuaD4KICNpbmNsdWRlIDxwb2xpY3kuaD4KKyNpbmNsdWRlIDxBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oPgogI2luY2x1ZGUgPFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Db250YWluZXJzLmg+CisKKyNpbmNsdWRlIDxtZWRpYS9UeXBlQ29udmVydGVyLmg+CiAKIHVzaW5nIHN0ZDo6c3RyaW5nOwogdXNpbmcgc3RkOjptYXA7CiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17Ci10ZW1wbGF0ZSA8PgotU3RyYXRlZ3lDb2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248cm91dGluZ19zdHJhdGVneT4oKQotewotICAgIHJldHVybiBtU3RyYXRlZ3lDb2xsZWN0aW9uOwotfQorbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CisKIHRlbXBsYXRlIDw+CiBTdHJlYW1Db2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fc3RyZWFtX3R5cGVfdD4oKQogewogICAgIHJldHVybiBtU3RyZWFtQ29sbGVjdGlvbjsKIH0KIHRlbXBsYXRlIDw+Ci1Vc2FnZUNvbGxlY3Rpb24gJkVuZ2luZTo6Z2V0Q29sbGVjdGlvbjxhdWRpb191c2FnZV90PigpCi17Ci0gICAgcmV0dXJuIG1Vc2FnZUNvbGxlY3Rpb247Ci19Ci10ZW1wbGF0ZSA8PgogSW5wdXRTb3VyY2VDb2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fc291cmNlX3Q+KCkKIHsKICAgICByZXR1cm4gbUlucHV0U291cmNlQ29sbGVjdGlvbjsKIH0KIAogdGVtcGxhdGUgPD4KLWNvbnN0IFN0cmF0ZWd5Q29sbGVjdGlvbiAmRW5naW5lOjpnZXRDb2xsZWN0aW9uPHJvdXRpbmdfc3RyYXRlZ3k+KCkgY29uc3QKLXsKLSAgICByZXR1cm4gbVN0cmF0ZWd5Q29sbGVjdGlvbjsKLX0KLXRlbXBsYXRlIDw+CiBjb25zdCBTdHJlYW1Db2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fc3RyZWFtX3R5cGVfdD4oKSBjb25zdAogewogICAgIHJldHVybiBtU3RyZWFtQ29sbGVjdGlvbjsKIH0KIHRlbXBsYXRlIDw+Ci1jb25zdCBVc2FnZUNvbGxlY3Rpb24gJkVuZ2luZTo6Z2V0Q29sbGVjdGlvbjxhdWRpb191c2FnZV90PigpIGNvbnN0Ci17Ci0gICAgcmV0dXJuIG1Vc2FnZUNvbGxlY3Rpb247Ci19Ci10ZW1wbGF0ZSA8PgogY29uc3QgSW5wdXRTb3VyY2VDb2xsZWN0aW9uICZFbmdpbmU6OmdldENvbGxlY3Rpb248YXVkaW9fc291cmNlX3Q+KCkgY29uc3QKIHsKICAgICByZXR1cm4gbUlucHV0U291cmNlQ29sbGVjdGlvbjsKIH0KIAotRW5naW5lOjpFbmdpbmUoKQotICAgIDogbU1hbmFnZXJJbnRlcmZhY2UodGhpcyksCi0gICAgICBtUGx1Z2luSW50ZXJmYWNlKHRoaXMpLAotICAgICAgbVBvbGljeVBhcmFtZXRlck1ncihuZXcgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIoKSksCi0gICAgICBtQXBtT2JzZXJ2ZXIoTlVMTCkKK0VuZ2luZTo6RW5naW5lKCkgOiBtUG9saWN5UGFyYW1ldGVyTWdyKG5ldyBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcigpKQogeworICAgIHN0YXR1c190IGxvYWRSZXN1bHQgPSBsb2FkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWcoKTsKKyAgICBpZiAobG9hZFJlc3VsdCA8IDApIHsKKyAgICAgICAgQUxPR0UoIlBvbGljeSBFbmdpbmUgY29uZmlndXJhdGlvbiBpcyBpbnZhbGlkLiIpOworICAgIH0KIH0KIAogRW5naW5lOjp+RW5naW5lKCkKIHsKLSAgICBtU3RyYXRlZ3lDb2xsZWN0aW9uLmNsZWFyKCk7CiAgICAgbVN0cmVhbUNvbGxlY3Rpb24uY2xlYXIoKTsKICAgICBtSW5wdXRTb3VyY2VDb2xsZWN0aW9uLmNsZWFyKCk7Ci0gICAgbVVzYWdlQ29sbGVjdGlvbi5jbGVhcigpOwotfQotCi0KLXZvaWQgRW5naW5lOjpzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpCi17Ci0gICAgQUxPR19BU1NFUlQob2JzZXJ2ZXIgIT0gTlVMTCwgIkludmFsaWQgQXVkaW8gUG9saWN5IE1hbmFnZXIgb2JzZXJ2ZXIiKTsKLSAgICBtQXBtT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKIH0KIAogc3RhdHVzX3QgRW5naW5lOjppbml0Q2hlY2soKQogewotICAgIGlmIChtUG9saWN5UGFyYW1ldGVyTWdyID09IE5VTEwgfHwgbVBvbGljeVBhcmFtZXRlck1nci0+c3RhcnQoKSAhPSBOT19FUlJPUikgewotICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBzdGFydCBQb2xpY3kgUEZXIiwgX19GVU5DVElPTl9fKTsKKyAgICBzdGQ6OnN0cmluZyBlcnJvcjsKKyAgICBpZiAobVBvbGljeVBhcmFtZXRlck1nciA9PSBudWxscHRyIHx8IG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnN0YXJ0KGVycm9yKSAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiJXM6IGNvdWxkIG5vdCBzdGFydCBQb2xpY3kgUEZXOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyb3IuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gKG1BcG1PYnNlcnZlciAhPSBOVUxMKT8gTk9fRVJST1IgOiBOT19JTklUOworICAgIHJldHVybiBFbmdpbmVCYXNlOjppbml0Q2hlY2soKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KQEAgLTEzOCwxNCArMTEzLDEwOSBAQAogICAgIHJldHVybiBlbGVtZW50LT50ZW1wbGF0ZSBnZXQ8UHJvcGVydHk+KCk7CiB9CiAKLXJvdXRpbmdfc3RyYXRlZ3kgRW5naW5lOjpNYW5hZ2VySW50ZXJmYWNlSW1wbDo6Z2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKQorYm9vbCBFbmdpbmU6OnNldFZvbHVtZVByb2ZpbGVGb3JTdHJlYW0oY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmcHJvZmlsZSkKIHsKLSAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UHJvcGVydHlGb3JLZXk8cm91dGluZ19zdHJhdGVneSwgYXVkaW9fdXNhZ2VfdD4odXNhZ2UpOworICAgIGlmIChzZXRQcm9wZXJ0eUZvcktleTxhdWRpb19zdHJlYW1fdHlwZV90LCBhdWRpb19zdHJlYW1fdHlwZV90PihzdHJlYW0sIHByb2ZpbGUpKSB7CisgICAgICAgIHN3aXRjaFZvbHVtZUN1cnZlKHByb2ZpbGUsIHN0cmVhbSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBFbmdpbmU6Ok1hbmFnZXJJbnRlcmZhY2VJbXBsOjpnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KSBjb25zdAordGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5LCB0eXBlbmFtZSBLZXk+Citib29sIEVuZ2luZTo6c2V0UHJvcGVydHlGb3JLZXkoY29uc3QgUHJvcGVydHkgJnByb3BlcnR5LCBjb25zdCBLZXkgJmtleSkKIHsKLSAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cyA9IG1Qb2xpY3lFbmdpbmUtPm1BcG1PYnNlcnZlci0+Z2V0T3V0cHV0cygpOworICAgIEVsZW1lbnQ8S2V5PiAqZWxlbWVudCA9IGdldEZyb21Db2xsZWN0aW9uPEtleT4oa2V5KTsKKyAgICBpZiAoZWxlbWVudCA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCIlczogRWxlbWVudCBub3QgZm91bmQgd2l0aGluIGNvbGxlY3Rpb24iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBlbGVtZW50LT50ZW1wbGF0ZSBzZXQ8UHJvcGVydHk+KHByb3BlcnR5KSA9PSBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgRW5naW5lOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldFBob25lU3RhdGUobW9kZSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICByZXR1cm4gRW5naW5lQmFzZTo6c2V0UGhvbmVTdGF0ZShtb2RlKTsKK30KKworYXVkaW9fbW9kZV90IEVuZ2luZTo6Z2V0UGhvbmVTdGF0ZSgpIGNvbnN0Cit7CisgICAgcmV0dXJuIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPmdldFBob25lU3RhdGUoKTsKK30KKworc3RhdHVzX3QgRW5naW5lOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQoreworICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgcmV0dXJuIEVuZ2luZUJhc2U6OnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOworfQorCithdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IEVuZ2luZTo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdAoreworICAgIHJldHVybiBtUG9saWN5UGFyYW1ldGVyTWdyLT5nZXRGb3JjZVVzZSh1c2FnZSk7Cit9CisKK3N0YXR1c190IEVuZ2luZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSkKK3sKKyAgICBtUG9saWN5UGFyYW1ldGVyTWdyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICAgICAgZGV2aWNlLT50eXBlKCksIGRldmljZS0+YWRkcmVzcygpLmNfc3RyKCksIHN0YXRlKTsKKyAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UtPnR5cGUoKSkpIHsKKyAgICAgICAgLy8gRklYTUU6IFVzZSBEZXZpY2VUeXBlU2V0IHdoZW4gdGhlIGludGVyZmFjZSBpcyByZWFkeQorICAgICAgICByZXR1cm4gbVBvbGljeVBhcmFtZXRlck1nci0+c2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlVHlwZXNUb0JpdE1hc2soZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpLnR5cGVzKCkpKTsKKyAgICB9IGVsc2UgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UtPnR5cGUoKSkpIHsKKyAgICAgICAgLy8gRklYTUU6IFVzZSBEZXZpY2VUeXBlU2V0IHdoZW4gdGhlIGludGVyZmFjZSBpcyByZWFkeQorICAgICAgICByZXR1cm4gbVBvbGljeVBhcmFtZXRlck1nci0+c2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKAorICAgICAgICAgICAgICAgICAgICBkZXZpY2VUeXBlc1RvQml0TWFzayhnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKS50eXBlcygpKSk7CisgICAgfQorICAgIHJldHVybiBFbmdpbmVCYXNlOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSk7Cit9CisKK3N0YXR1c190IEVuZ2luZTo6bG9hZEF1ZGlvUG9saWN5RW5naW5lQ29uZmlnKCkKK3sKKyAgICBhdXRvIHJlc3VsdCA9IEVuZ2luZUJhc2U6OmxvYWRBdWRpb1BvbGljeUVuZ2luZUNvbmZpZygpOworCisgICAgLy8gQ3VzdG9tIFhNTCBQYXJzaW5nCisgICAgYXV0byBsb2FkQ3JpdGVyaWE9IFt0aGlzXShjb25zdCBhdXRvJiBjb25maWdDcml0ZXJpYSwgY29uc3QgYXV0byYgY29uZmlnQ3JpdGVyaW9uVHlwZXMpIHsKKyAgICAgICAgZm9yIChhdXRvJiBjcml0ZXJpb24gOiBjb25maWdDcml0ZXJpYSkgeworICAgICAgICAgICAgZW5naW5lQ29uZmlnOjpDcml0ZXJpb25UeXBlIGNyaXRlcmlvblR5cGU7CisgICAgICAgICAgICBmb3IgKGF1dG8gJmNvbmZpZ0NyaXRlcmlvblR5cGUgOiBjb25maWdDcml0ZXJpb25UeXBlcykgeworICAgICAgICAgICAgICAgIGlmIChjb25maWdDcml0ZXJpb25UeXBlLm5hbWUgPT0gY3JpdGVyaW9uLnR5cGVOYW1lKSB7CisgICAgICAgICAgICAgICAgICAgIGNyaXRlcmlvblR5cGUgPSBjb25maWdDcml0ZXJpb25UeXBlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBBTE9HX0FTU0VSVChub3QgY3JpdGVyaW9uVHlwZS5uYW1lLmVtcHR5KCksICJJbnZhbGlkIGNyaXRlcmlvbiB0eXBlIGZvciAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICBjcml0ZXJpb24ubmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPmFkZENyaXRlcmlvbihjcml0ZXJpb24ubmFtZSwgY3JpdGVyaW9uVHlwZS5pc0luY2x1c2l2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcml0ZXJpb25UeXBlLnZhbHVlUGFpcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uLmRlZmF1bHRMaXRlcmFsVmFsdWUpOworICAgICAgICB9CisgICAgfTsKKworICAgIGxvYWRDcml0ZXJpYShyZXN1bHQucGFyc2VkQ29uZmlnLT5jcml0ZXJpYSwgcmVzdWx0LnBhcnNlZENvbmZpZy0+Y3JpdGVyaW9uVHlwZXMpOworICAgIHJldHVybiByZXN1bHQubmJTa2lwcGVkRWxlbWVudCA9PSAwPyBOT19FUlJPUiA6IEJBRF9WQUxVRTsKK30KKworRGV2aWNlVmVjdG9yIEVuZ2luZTo6Z2V0RGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3QgcHMpIGNvbnN0Cit7CisgICAgY29uc3QgYXV0byBwcm9kdWN0U3RyYXRlZ2llcyA9IGdldFByb2R1Y3RTdHJhdGVnaWVzKCk7CisgICAgaWYgKHByb2R1Y3RTdHJhdGVnaWVzLmZpbmQocHMpID09IHByb2R1Y3RTdHJhdGVnaWVzLmVuZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJ5aW5nIHRvIGdldCBkZXZpY2Ugb24gaW52YWxpZCBzdHJhdGVneSAlZCIsIF9fRlVOQ1RJT05fXywgcHMpOworICAgICAgICByZXR1cm4ge307CisgICAgfQorICAgIGNvbnN0IERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOworICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0T3V0cHV0cygpOworICAgIERldmljZVR5cGVTZXQgYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGVzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOwogCiAgICAgLyoqIFRoaXMgaXMgdGhlIG9ubHkgY2FzZSBoYW5kbGVkIHByb2dyYW1tYXRpY2FsbHkgYmVjYXVzZSB0aGUgUEZXIGlzIHVuYWJsZSB0byBrbm93IHRoZQogICAgICAqIGFjdGl2aXR5IG9mIHN0cmVhbXMuCkBAIC0xNTcsOTEgKzIyNywxNjUgQEAKICAgICAgKgogICAgICAqIC1XaGVuIG1lZGlhIGlzIG5vdCBwbGF5aW5nIGFueW1vcmUsIGZhbGwgYmFjayBvbiB0aGUgc29uaWZpY2F0aW9uIGJlaGF2aW9yCiAgICAgICovCi0gICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMICYmCisgICAgRGV2aWNlVHlwZVNldCBkZXZpY2VUeXBlczsKKyAgICBpZiAocHMgPT0gZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04pICYmCiAgICAgICAgICAgICAhaXNfc3RhdGVfaW5fY2FsbChnZXRQaG9uZVN0YXRlKCkpICYmCi0gICAgICAgICAgICAhb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KEFVRElPX1NUUkVBTV9NVVNJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSAmJgotICAgICAgICAgICAgb3V0cHV0cy5pc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fTVVTSUMsIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSkgewotICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCByb3V0aW5nX3N0cmF0ZWd5PihTVFJBVEVHWV9NRURJQSk7Ci0gICAgfQotICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9BQ0NFU1NJQklMSVRZICYmCi0gICAgICAgIChvdXRwdXRzLmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9SSU5HKSB8fCBvdXRwdXRzLmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9BTEFSTSkpKSB7CisgICAgICAgICAgICAhb3V0cHV0cy5pc0FjdGl2ZVJlbW90ZWx5KHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9NVVNJQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKSAmJgorICAgICAgICAgICAgb3V0cHV0cy5pc0FjdGl2ZSh0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTVVTSUMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSkpIHsKKyAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5Rm9yTWVkaWEgPQorICAgICAgICAgICAgICAgIGdldFByb2R1Y3RTdHJhdGVneUZvclN0cmVhbShBVURJT19TVFJFQU1fTVVTSUMpOworICAgICAgICBkZXZpY2VUeXBlcyA9IHByb2R1Y3RTdHJhdGVnaWVzLmdldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5Rm9yTWVkaWEpOworICAgIH0gZWxzZSBpZiAocHMgPT0gZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKSAmJgorICAgICAgICAob3V0cHV0cy5pc0FjdGl2ZSh0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fUklORykpIHx8CisgICAgICAgICBvdXRwdXRzLmlzQWN0aXZlKHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9BTEFSTSkpKSkgewogICAgICAgICAgICAgLy8gZG8gbm90IHJvdXRlIGFjY2Vzc2liaWxpdHkgcHJvbXB0cyB0byBhIGRpZ2l0YWwgb3V0cHV0IGN1cnJlbnRseSBjb25maWd1cmVkIHdpdGggYQogICAgICAgICAgICAgLy8gY29tcHJlc3NlZCBmb3JtYXQgYXMgdGhleSB3b3VsZCBsaWtlbHkgbm90IGJlIG1peGVkIGFuZCBkcm9wcGVkLgogICAgICAgICAgICAgLy8gRGV2aWNlIEZvciBTb25pZmljYXRpb24gY29uZiBmaWxlIGhhcyBIRE1JLCBTUERJRiBhbmQgSERNSSBBUkMgdW5yZWFjaGVhYmxlLgotICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCByb3V0aW5nX3N0cmF0ZWd5PigKLSAgICAgICAgICAgICAgICAgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OKTsKKyAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5Tm90aWZpY2F0aW9uID0gZ2V0UHJvZHVjdFN0cmF0ZWd5Rm9yU3RyZWFtKEFVRElPX1NUUkVBTV9SSU5HKTsKKyAgICAgICAgZGV2aWNlVHlwZXMgPSBwcm9kdWN0U3RyYXRlZ2llcy5nZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneU5vdGlmaWNhdGlvbik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGV2aWNlVHlwZXMgPSBwcm9kdWN0U3RyYXRlZ2llcy5nZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcyk7CiAgICAgfQotICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIHJvdXRpbmdfc3RyYXRlZ3k+KHN0cmF0ZWd5KTsKLX0KLQotYm9vbCBFbmdpbmU6OlBsdWdpbkludGVyZmFjZUltcGw6OnNldFZvbHVtZVByb2ZpbGVGb3JTdHJlYW0oY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmcHJvZmlsZSkKLXsKLSAgICBpZiAobVBvbGljeUVuZ2luZS0+c2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlKSkgewotICAgICAgICBtUG9saWN5RW5naW5lLT5tQXBtT2JzZXJ2ZXItPmdldFZvbHVtZUN1cnZlcygpLnN3aXRjaFZvbHVtZUN1cnZlKHByb2ZpbGUsIHN0cmVhbSk7Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChkZXZpY2VUeXBlcy5lbXB0eSgpIHx8CisgICAgICAgICAgICBJbnRlcnNlY3Rpb24oZGV2aWNlVHlwZXMsIGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlcykuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGRlZmF1bHREZXZpY2UgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCk7CisgICAgICAgIEFMT0dfQVNTRVJUKGRlZmF1bHREZXZpY2UgIT0gbnVsbHB0ciwgIm5vIHZhbGlkIGRlZmF1bHQgZGV2aWNlIGRlZmluZWQiKTsKKyAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcihkZWZhdWx0RGV2aWNlKTsKICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotfQotCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eSwgdHlwZW5hbWUgS2V5PgotYm9vbCBFbmdpbmU6OnNldFByb3BlcnR5Rm9yS2V5KGNvbnN0IFByb3BlcnR5ICZwcm9wZXJ0eSwgY29uc3QgS2V5ICZrZXkpCi17Ci0gICAgRWxlbWVudDxLZXk+ICplbGVtZW50ID0gZ2V0RnJvbUNvbGxlY3Rpb248S2V5PihrZXkpOwotICAgIGlmIChlbGVtZW50ID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBFbGVtZW50IG5vdCBmb3VuZCB3aXRoaW4gY29sbGVjdGlvbiIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgaWYgKC8qZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcygqZGV2aWNlVHlwZXMuYmVnaW4oKSkqLyBpc1NpbmdsZURldmljZVR5cGUoCisgICAgICAgICAgICBkZXZpY2VUeXBlcywgQVVESU9fREVWSUNFX09VVF9CVVMpKSB7CisgICAgICAgIC8vIFdlIGRvIGV4cGVjdCBvbmx5IG9uZSBkZXZpY2UgZm9yIHRoZXNlIHR5cGVzIG9mIGRldmljZXMKKyAgICAgICAgLy8gQ3JpdGVyaW9uIGRldmljZSBhZGRyZXNzIGdhcmFudGVlIHRoaXMgb25lIGlzIGF2YWlsYWJsZQorICAgICAgICAvLyBJZiB0aGlzIGNyaXRlcmlvbiBpcyBub3Qgd2lzaGVkLCBuZWVkIHRvIGVuc3VyZSB0aGlzIGRldmljZSBpcyBhdmFpbGFibGUKKyAgICAgICAgY29uc3QgU3RyaW5nOCBhZGRyZXNzKHByb2R1Y3RTdHJhdGVnaWVzLmdldERldmljZUFkZHJlc3NGb3JQcm9kdWN0U3RyYXRlZ3kocHMpLmNfc3RyKCkpOworICAgICAgICBBTE9HVigiJXM6ZGV2aWNlICVzICVzICVkIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGR1bXBEZXZpY2VUeXBlcyhkZXZpY2VUeXBlcykuY19zdHIoKSwgYWRkcmVzcy5jX3N0cigpLCBwcyk7CisgICAgICAgIGF1dG8gYnVzRGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UoCisgICAgICAgICAgICAgICAgKmRldmljZVR5cGVzLmJlZ2luKCksIGFkZHJlc3MsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgaWYgKGJ1c0RldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6dW5hdmFpbGFibGUgZGV2aWNlICVzICVzLCBmYWxsYmFjayBvbiBkZWZhdWx0IiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICBkdW1wRGV2aWNlVHlwZXMoZGV2aWNlVHlwZXMpLmNfc3RyKCksIGFkZHJlc3MuY19zdHIoKSk7CisgICAgICAgICAgICBhdXRvIGRlZmF1bHREZXZpY2UgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCk7CisgICAgICAgICAgICBBTE9HX0FTU0VSVChkZWZhdWx0RGV2aWNlICE9IG51bGxwdHIsICJEZWZhdWx0IE91dHB1dCBEZXZpY2UgTk9UIGF2YWlsYWJsZSIpOworICAgICAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcihkZWZhdWx0RGV2aWNlKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKGJ1c0RldmljZSk7CiAgICAgfQotICAgIHJldHVybiBlbGVtZW50LT50ZW1wbGF0ZSBzZXQ8UHJvcGVydHk+KHByb3BlcnR5KSA9PSBOT19FUlJPUjsKKyAgICBBTE9HVigiJXM6ZGV2aWNlICVzICVkIiwgX19GVU5DVElPTl9fLCBkdW1wRGV2aWNlVHlwZXMoZGV2aWNlVHlwZXMpLmNfc3RyKCksIHBzKTsKKyAgICByZXR1cm4gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVzKGRldmljZVR5cGVzKTsKIH0KIAotc3RhdHVzX3QgRW5naW5lOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKQorRGV2aWNlVmVjdG9yIEVuZ2luZTo6Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnByZWZlcnJlZERldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKSBjb25zdAogewotICAgIHJldHVybiBtUG9saWN5UGFyYW1ldGVyTWdyLT5zZXRQaG9uZVN0YXRlKG1vZGUpOwotfQotCi1hdWRpb19tb2RlX3QgRW5naW5lOjpnZXRQaG9uZVN0YXRlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gbVBvbGljeVBhcmFtZXRlck1nci0+Z2V0UGhvbmVTdGF0ZSgpOwotfQotCi1zdGF0dXNfdCBFbmdpbmU6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCi17Ci0gICAgcmV0dXJuIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOwotfQotCi1hdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IEVuZ2luZTo6Z2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdAotewotICAgIHJldHVybiBtUG9saWN5UGFyYW1ldGVyTWdyLT5nZXRGb3JjZVVzZSh1c2FnZSk7Ci19Ci0KLXN0YXR1c190IEVuZ2luZTo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgLypzdGF0ZSovKQotewotICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldkRlc2MtPnR5cGUoKSkpIHsKLSAgICAgICAgcmV0dXJuIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldEF2YWlsYWJsZU91dHB1dERldmljZXMoCi0gICAgICAgICAgICAgICAgICAgIG1BcG1PYnNlcnZlci0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpLnR5cGVzKCkpOwotICAgIH0gZWxzZSBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldkRlc2MtPnR5cGUoKSkpIHsKLSAgICAgICAgcmV0dXJuIG1Qb2xpY3lQYXJhbWV0ZXJNZ3ItPnNldEF2YWlsYWJsZUlucHV0RGV2aWNlcygKLSAgICAgICAgICAgICAgICAgICAgbUFwbU9ic2VydmVyLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKS50eXBlcygpKTsKKyAgICAvLyBGaXJzdCBjaGVjayBmb3IgZXhwbGljdCByb3V0aW5nIGRldmljZQorICAgIGlmIChwcmVmZXJyZWREZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVigiJXMgZXhwbGljaXQgUm91dGluZyBvbiBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgcHJlZmVycmVkRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKHByZWZlcnJlZERldmljZSk7CiAgICAgfQotICAgIHJldHVybiBCQURfVFlQRTsKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworICAgIGNvbnN0IERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOworICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0T3V0cHV0cygpOworICAgIC8vCisgICAgLy8gQFRPRE86IHdoYXQgaXMgdGhlIHByaW9yaXR5IG9mIGV4cGxpY2l0IHJvdXRpbmc/IFNoYWxsIGl0IGJlIGNvbnNpZGVyZWQgZmlyc3QgYXMgaXQgdXNlZCB0bworICAgIC8vIGJlIGJ5IEFQTT8KKyAgICAvLworICAgIC8vIEhvbm9yIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMgb25seSBpZiBhbGwgYWN0aXZlIGNsaWVudHMgaGF2ZSBhIHByZWZlcnJlZCByb3V0ZSBpbiB3aGljaAorICAgIC8vIGNhc2UgdGhlIGxhc3QgYWN0aXZlIGNsaWVudCByb3V0ZSBpcyB1c2VkCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gZmluZFByZWZlcnJlZERldmljZShvdXRwdXRzLCBzdHJhdGVneSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IoZGV2aWNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gZnJvbUNhY2hlPyBtRGV2aWNlc0ZvclN0cmF0ZWdpZXMuYXQoc3RyYXRlZ3kpIDogZ2V0RGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneSk7Cit9CisKK0RldmljZVZlY3RvciBFbmdpbmU6OmdldE91dHB1dERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgZnJvbUNhY2hlKSBjb25zdAoreworICAgIGF1dG8gYXR0cmlidXRlcyA9IEVuZ2luZUJhc2U6OmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgcmV0dXJuIGdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIG51bGxwdHIsIGZyb21DYWNoZSk7Cit9CisKK3NwPERldmljZURlc2NyaXB0b3I+IEVuZ2luZTo6Z2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiAqbWl4KSBjb25zdAoreworICAgIGNvbnN0IGF1dG8gJnBvbGljeU1peGVzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uKCk7CisgICAgY29uc3QgYXV0byBhdmFpbGFibGVJbnB1dERldmljZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKTsKKyAgICBjb25zdCBhdXRvICZpbnB1dHMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRJbnB1dHMoKTsKKyAgICBzdGQ6OnN0cmluZyBhZGRyZXNzOworICAgIC8vCisgICAgLy8gRXhwbGljaXQgUm91dGluZyA/Pz8gd2hhdCBpcyB0aGUgcHJpb3JpdHkgb2YgZXhwbGljaXQgcm91dGluZz8gU2hhbGwgaXQgYmUgY29uc2lkZXJlZAorICAgIC8vIGZpcnN0IGFzIGl0IHVzZWQgdG8gYmUgYnkgQVBNPworICAgIC8vCisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIGFsbCBhY3RpdmUgY2xpZW50cyBoYXZlIGEgcHJlZmVycmVkIHJvdXRlIGluIHdoaWNoCisgICAgLy8gY2FzZSB0aGUgbGFzdCBhY3RpdmUgY2xpZW50IHJvdXRlIGlzIHVzZWQKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQorICAgICAgICAgICAgZmluZFByZWZlcnJlZERldmljZShpbnB1dHMsIGF0dHIuc291cmNlLCBhdmFpbGFibGVJbnB1dERldmljZXMpOworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZGV2aWNlOworICAgIH0KKworICAgIGRldmljZSA9IHBvbGljeU1peGVzLmdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGF0dHIuc291cmNlLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG1peCk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBkZXZpY2U7CisgICAgfQorCisgICAgYXVkaW9fZGV2aWNlc190IGRldmljZVR5cGUgPSBnZXRQcm9wZXJ0eUZvcktleTxhdWRpb19kZXZpY2VzX3QsIGF1ZGlvX3NvdXJjZV90PihhdHRyLnNvdXJjZSk7CisKKyAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoZGV2aWNlVHlwZSkpIHsKKyAgICAgICAgYWRkcmVzcyA9ICIwIjsKKyAgICAgICAgc3RkOjpzaXplX3QgcG9zOworICAgICAgICBzdGQ6OnN0cmluZyB0YWdzIHsgYXR0ci50YWdzIH07CisgICAgICAgIGlmICgocG9zID0gdGFncy5maW5kKCJhZGRyPSIpKSAhPSBzdGQ6OnN0cmluZzo6bnBvcykgeworICAgICAgICAgICAgYWRkcmVzcyA9IHRhZ3Muc3Vic3RyKHBvcyArIHN0ZDo6c3RybGVuKCJhZGRyPSIpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZShkZXZpY2VUeXBlLCBTdHJpbmc4KGFkZHJlc3MuY19zdHIoKSksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKK30KKwordm9pZCBFbmdpbmU6OnVwZGF0ZURldmljZVNlbGVjdGlvbkNhY2hlKCkKK3sKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBnZXRQcm9kdWN0U3RyYXRlZ2llcygpKSB7CisgICAgICAgIGNvbnN0IGF1dG8gJnN0cmF0ZWd5ID0gaXRlci5zZWNvbmQ7CisgICAgICAgIG1EZXZpY2VzRm9yU3RyYXRlZ2llc1tzdHJhdGVneS0+Z2V0SWQoKV0gPSBnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHN0cmF0ZWd5LT5nZXRJZCgpKTsKKyAgICB9Cit9CisKK3ZvaWQgRW5naW5lOjpzZXREZXZpY2VBZGRyZXNzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKQoreworICAgIGlmIChnZXRQcm9kdWN0U3RyYXRlZ2llcygpLmZpbmQoc3RyYXRlZ3kpID09IGdldFByb2R1Y3RTdHJhdGVnaWVzKCkuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcnlpbmcgdG8gc2V0IGFkZHJlc3MgJXMgb24gaW52YWxpZCBzdHJhdGVneSAlZCIsIF9fRlVOQ1RJT05fXywgYWRkcmVzcy5jX3N0cigpLAorICAgICAgICAgICAgICBzdHJhdGVneSk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZ2V0UHJvZHVjdFN0cmF0ZWdpZXMoKS5hdChzdHJhdGVneSktPnNldERldmljZUFkZHJlc3MoYWRkcmVzcyk7Cit9CisKK2Jvb2wgRW5naW5lOjpzZXREZXZpY2VUeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQoreworICAgIGlmIChnZXRQcm9kdWN0U3RyYXRlZ2llcygpLmZpbmQoc3RyYXRlZ3kpID09IGdldFByb2R1Y3RTdHJhdGVnaWVzKCkuZW5kKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzZXQgZGV2aWNlICVkIG9uIGludmFsaWQgc3RyYXRlZ3kgJWQiLCBfX0ZVTkNUSU9OX18sIGRldmljZXMsIHN0cmF0ZWd5KTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBGSVhNRTogc3RvcCB1c2luZyBkZXZpY2VUeXBlc0Zyb21CaXRNYXNrIHdoZW4gdGhlIGludGVyZmFjZSBpcyByZWFkeQorICAgIGdldFByb2R1Y3RTdHJhdGVnaWVzKCkuYXQoc3RyYXRlZ3kpLT5zZXREZXZpY2VUeXBlcyhkZXZpY2VUeXBlc0Zyb21CaXRNYXNrKGRldmljZXMpKTsKKyAgICByZXR1cm4gdHJ1ZTsKIH0KIAogdGVtcGxhdGUgPD4KLUF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZSAqRW5naW5lOjpxdWVyeUludGVyZmFjZSgpCitFbmdpbmVJbnRlcmZhY2UgKkVuZ2luZTo6cXVlcnlJbnRlcmZhY2UoKQogewotICAgIHJldHVybiAmbU1hbmFnZXJJbnRlcmZhY2U7CisgICAgcmV0dXJuIHRoaXM7CiB9CiAKIHRlbXBsYXRlIDw+CiBBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZSAqRW5naW5lOjpxdWVyeUludGVyZmFjZSgpCiB7Ci0gICAgcmV0dXJuICZtUGx1Z2luSW50ZXJmYWNlOworICAgIHJldHVybiB0aGlzOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0VuZ2luZS5oCmluZGV4IDMyOGQyM2QuLjNiMzcxZDggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lLmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmUuaApAQCAtMTYsMjIgKzE2LDIwIEBACiAKICNwcmFnbWEgb25jZQogCi0KLSNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KKyNpbmNsdWRlICJFbmdpbmVCYXNlLmgiCisjaW5jbHVkZSA8RW5naW5lSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UuaD4KICNpbmNsdWRlICJDb2xsZWN0aW9uLmgiCiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17CituYW1lc3BhY2UgYW5kcm9pZCB7CiBjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlcjsKIAotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CiAKIGNsYXNzIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOwogY2xhc3MgVm9sdW1lUHJvZmlsZTsKIAotY2xhc3MgRW5naW5lCitjbGFzcyBFbmdpbmUgOiBwdWJsaWMgRW5naW5lQmFzZSwgQXVkaW9Qb2xpY3lQbHVnaW5JbnRlcmZhY2UKIHsKIHB1YmxpYzoKICAgICBFbmdpbmUoKTsKQEAgLTQwLDEzMiArMzgsNjkgQEAKICAgICB0ZW1wbGF0ZSA8Y2xhc3MgUmVxdWVzdGVkSW50ZXJmYWNlPgogICAgIFJlcXVlc3RlZEludGVyZmFjZSAqcXVlcnlJbnRlcmZhY2UoKTsKIAotcHJpdmF0ZToKLSAgICAvLy8gSW50ZXJmYWNlIG1lbWJlcnMKLSAgICBjbGFzcyBNYW5hZ2VySW50ZXJmYWNlSW1wbCA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UKKyAgICAvLy8KKyAgICAvLy8gZnJvbSBFbmdpbmVCYXNlCisgICAgLy8vCisgICAgYW5kcm9pZDo6c3RhdHVzX3QgaW5pdENoZWNrKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKSBvdmVycmlkZTsKKworICAgIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKSBvdmVycmlkZTsKKworICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdCBvdmVycmlkZTsKKworICAgIGFuZHJvaWQ6OnN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpIG92ZXJyaWRlOworCisgICAgRGV2aWNlVmVjdG9yIGdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJnByZWZlcmVkRGV2aWNlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUgPSBmYWxzZSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBEZXZpY2VWZWN0b3IgZ2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSA9IGZhbHNlKSBjb25zdCBvdmVycmlkZTsKKworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldElucHV0RGV2aWNlRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwgc3A8QXVkaW9Qb2xpY3lNaXg+ICptaXggPSBudWxscHRyKSBjb25zdCBvdmVycmlkZTsKKworICAgIHZvaWQgdXBkYXRlRGV2aWNlU2VsZWN0aW9uQ2FjaGUoKSBvdmVycmlkZTsKKworICAgIC8vLworICAgIC8vLyBmcm9tIEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlCisgICAgLy8vCisgICAgc3RhdHVzX3QgYWRkU3RyZWFtKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgb3ZlcnJpZGUKICAgICB7Ci0gICAgcHVibGljOgotICAgICAgICBNYW5hZ2VySW50ZXJmYWNlSW1wbChFbmdpbmUgKnBvbGljeUVuZ2luZSkKLSAgICAgICAgICAgIDogbVBvbGljeUVuZ2luZShwb2xpY3lFbmdpbmUpIHt9Ci0KLSAgICAgICAgdmlydHVhbCBhbmRyb2lkOjpzdGF0dXNfdCBpbml0Q2hlY2soKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+aW5pdENoZWNrKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCB2b2lkIHNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcikKLSAgICAgICAgewotICAgICAgICAgICAgbVBvbGljeUVuZ2luZS0+c2V0T2JzZXJ2ZXIob2JzZXJ2ZXIpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCBhdWRpb19zb3VyY2VfdD4oaW5wdXRTb3VyY2UpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RhdGVneSkgY29uc3Q7Ci0gICAgICAgIHZpcnR1YWwgcm91dGluZ19zdHJhdGVneSBnZXRTdHJhdGVneUZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFByb3BlcnR5Rm9yS2V5PHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3Q+KHN0cmVhbSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldFBob25lU3RhdGUobW9kZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRQaG9uZVN0YXRlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5zZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0Rm9yY2VVc2UodXNhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYW5kcm9pZDo6c3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZEZXNjLCBzdGF0ZSk7Ci0gICAgICAgIH0KLQotICAgIHByaXZhdGU6Ci0gICAgICAgIEVuZ2luZSAqbVBvbGljeUVuZ2luZTsKLSAgICB9IG1NYW5hZ2VySW50ZXJmYWNlOwotCi0gICAgY2xhc3MgUGx1Z2luSW50ZXJmYWNlSW1wbCA6IHB1YmxpYyBBdWRpb1BvbGljeVBsdWdpbkludGVyZmFjZQorICAgICAgICByZXR1cm4gYWRkPGF1ZGlvX3N0cmVhbV90eXBlX3Q+KG5hbWUsIHN0cmVhbSk7CisgICAgfQorICAgIHN0YXR1c190IGFkZElucHV0U291cmNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb19zb3VyY2VfdCBzb3VyY2UpIG92ZXJyaWRlCiAgICAgewotICAgIHB1YmxpYzoKLSAgICAgICAgUGx1Z2luSW50ZXJmYWNlSW1wbChFbmdpbmUgKnBvbGljeUVuZ2luZSkKLSAgICAgICAgICAgIDogbVBvbGljeUVuZ2luZShwb2xpY3lFbmdpbmUpIHt9CisgICAgICAgIHJldHVybiBhZGQ8YXVkaW9fc291cmNlX3Q+KG5hbWUsIHNvdXJjZSk7CisgICAgfQorICAgIGJvb2wgc2V0Vm9sdW1lUHJvZmlsZUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnZvbHVtZVByb2ZpbGUpIG92ZXJyaWRlOwogCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyYXRlZ3koY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5hZGQ8cm91dGluZ19zdHJhdGVneT4obmFtZSwgc3RyYXRlZ3kpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkU3RyZWFtKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmFkZDxhdWRpb19zdHJlYW1fdHlwZV90PihuYW1lLCBzdHJlYW0pOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkVXNhZ2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3VzYWdlX3QgdXNhZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5hZGQ8YXVkaW9fdXNhZ2VfdD4obmFtZSwgdXNhZ2UpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgYWRkSW5wdXRTb3VyY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmFkZDxhdWRpb19zb3VyY2VfdD4obmFtZSwgc291cmNlKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2V0RGV2aWNlRm9yU3RyYXRlZ3koY29uc3Qgcm91dGluZ19zdHJhdGVneSAmc3RyYXRlZ3ksIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0UHJvcGVydHlGb3JLZXk8YXVkaW9fZGV2aWNlc190LCByb3V0aW5nX3N0cmF0ZWd5PihkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyYXRlZ3kpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYm9vbCBzZXRTdHJhdGVneUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0UHJvcGVydHlGb3JLZXk8cm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdD4oc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2V0Vm9sdW1lUHJvZmlsZUZvclN0cmVhbShjb25zdCBhdWRpb19zdHJlYW1fdHlwZV90ICZzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3QgJnZvbHVtZVByb2ZpbGUpOworICAgIGJvb2wgc2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoY29uc3QgYXVkaW9fc291cmNlX3QgJmlucHV0U291cmNlLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgcmV0dXJuIHNldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX2RldmljZXNfdCwgYXVkaW9fc291cmNlX3Q+KGRldmljZSwgaW5wdXRTb3VyY2UpOworICAgIH0KKyAgICB2b2lkIHNldERldmljZUFkZHJlc3NGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzKSBvdmVycmlkZTsKIAotICAgICAgICB2aXJ0dWFsIGJvb2wgc2V0U3RyYXRlZ3lGb3JVc2FnZShjb25zdCBhdWRpb191c2FnZV90ICZ1c2FnZSwgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldFByb3BlcnR5Rm9yS2V5PHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3VzYWdlX3Q+KHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzYWdlKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGJvb2wgc2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoY29uc3QgYXVkaW9fc291cmNlX3QgJmlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldFByb3BlcnR5Rm9yS2V5PGF1ZGlvX2RldmljZXNfdCwgYXVkaW9fc291cmNlX3Q+KGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dFNvdXJjZSk7Ci0gICAgICAgIH0KKyAgICBib29sIHNldERldmljZVR5cGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMpIG92ZXJyaWRlOwogCi0gICAgcHJpdmF0ZToKLSAgICAgICAgRW5naW5lICptUG9saWN5RW5naW5lOwotICAgIH0gbVBsdWdpbkludGVyZmFjZTsKKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3QgZ2V0UHJvZHVjdFN0cmF0ZWd5QnlOYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBvdmVycmlkZQorICAgIHsKKyAgICAgICAgcmV0dXJuIEVuZ2luZUJhc2U6OmdldFByb2R1Y3RTdHJhdGVneUJ5TmFtZShuYW1lKTsKKyAgICB9CiAKIHByaXZhdGU6CiAgICAgLyogQ29weSBmYWNpbGl0aWVzIGFyZSBwdXQgcHJpdmF0ZSB0byBkaXNhYmxlIGNvcHkuICovCiAgICAgRW5naW5lKGNvbnN0IEVuZ2luZSAmb2JqZWN0KTsKICAgICBFbmdpbmUgJm9wZXJhdG9yPShjb25zdCBFbmdpbmUgJm9iamVjdCk7CiAKLSAgICB2b2lkIHNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcik7Ci0KLSAgICBib29sIHNldFZvbHVtZVByb2ZpbGVGb3JTdHJlYW0oY29uc3QgYXVkaW9fc3RyZWFtX3R5cGVfdCAmc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfY2F0ZWdvcnkgZGV2aWNlQ2F0ZWdvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZvbHVtZUN1cnZlUG9pbnRzICZwb2ludHMpOwotCi0gICAgc3RhdHVzX3QgaW5pdENoZWNrKCk7Ci0gICAgc3RhdHVzX3Qgc2V0UGhvbmVTdGF0ZShhdWRpb19tb2RlX3QgbW9kZSk7Ci0gICAgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKSBjb25zdDsKLSAgICBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKLSAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkgY29uc3Q7Ci0gICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSk7Ci0gICAgU3RyYXRlZ3lDb2xsZWN0aW9uIG1TdHJhdGVneUNvbGxlY3Rpb247IC8qKjwgU3RyYXRlZ2llcyBpbmRleGVkIGJ5IHRoZWlyIGVudW0gaWQuICovCiAgICAgU3RyZWFtQ29sbGVjdGlvbiBtU3RyZWFtQ29sbGVjdGlvbjsgLyoqPCBTdHJlYW1zIGluZGV4ZWQgYnkgdGhlaXIgZW51bSBpZC4gICovCi0gICAgVXNhZ2VDb2xsZWN0aW9uIG1Vc2FnZUNvbGxlY3Rpb247IC8qKjwgVXNhZ2VzIGluZGV4ZWQgYnkgdGhlaXIgZW51bSBpZC4gKi8KICAgICBJbnB1dFNvdXJjZUNvbGxlY3Rpb24gbUlucHV0U291cmNlQ29sbGVjdGlvbjsgLyoqPCBJbnB1dCBzb3VyY2VzIGluZGV4ZWQgYnkgdGhlaXIgZW51bSBpZC4gKi8KIAogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXk+CkBAIC0xODYsMTIgKzEyMSwxNiBAQAogICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQcm9wZXJ0eSwgdHlwZW5hbWUgS2V5PgogICAgIGJvb2wgc2V0UHJvcGVydHlGb3JLZXkoY29uc3QgUHJvcGVydHkgJnByb3BlcnR5LCBjb25zdCBLZXkgJmtleSk7CiAKKyAgICBzdGF0dXNfdCBsb2FkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWcoKTsKKworICAgIERldmljZVZlY3RvciBnZXREZXZpY2VzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSkgY29uc3Q7CisKICAgICAvKioKICAgICAgKiBQb2xpY3kgUGFyYW1ldGVyIE1hbmFnZXIgaGlkZGVuIHRocm91Z2ggYSB3cmFwcGVyLgogICAgICAqLwogICAgIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyICptUG9saWN5UGFyYW1ldGVyTWdyOwogCi0gICAgQXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIgKm1BcG1PYnNlcnZlcjsKKyAgICBEZXZpY2VTdHJhdGVneU1hcCBtRGV2aWNlc0ZvclN0cmF0ZWdpZXM7CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvRW5naW5lSW5zdGFuY2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmVJbnN0YW5jZS5jcHAKaW5kZXggOWFhODliMi4uYjEyNzc5NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmVJbnN0YW5jZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9FbmdpbmVJbnN0YW5jZS5jcHAKQEAgLTE0LDE3ICsxNCwxNSBAQAogICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgKi8KIAotI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oPgorI2luY2x1ZGUgPEVuZ2luZUludGVyZmFjZS5oPgogI2luY2x1ZGUgPEF1ZGlvUG9saWN5UGx1Z2luSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oIgogI2luY2x1ZGUgIkVuZ2luZS5oIgogCiB1c2luZyBzdGQ6OnN0cmluZzsKIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgewogCiBFbmdpbmVJbnN0YW5jZTo6RW5naW5lSW5zdGFuY2UoKQogewpAQCAtNDcsOSArNDUsOSBAQAogfQogCiB0ZW1wbGF0ZSA8PgotQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlICpFbmdpbmVJbnN0YW5jZTo6cXVlcnlJbnRlcmZhY2UoKSBjb25zdAorRW5naW5lSW50ZXJmYWNlICpFbmdpbmVJbnN0YW5jZTo6cXVlcnlJbnRlcmZhY2UoKSBjb25zdAogewotICAgIHJldHVybiBnZXRFbmdpbmUoKS0+cXVlcnlJbnRlcmZhY2U8QXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlPigpOworICAgIHJldHVybiBnZXRFbmdpbmUoKS0+cXVlcnlJbnRlcmZhY2U8RW5naW5lSW50ZXJmYWNlPigpOwogfQogCiB0ZW1wbGF0ZSA8PgpAQCAtNTksNSArNTcsMTYgQEAKIH0KIAogfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CisKK2V4dGVybiAiQyIgRW5naW5lSW50ZXJmYWNlKiBjcmVhdGVFbmdpbmVJbnN0YW5jZSgpCit7CisgICAgcmV0dXJuIGF1ZGlvX3BvbGljeTo6RW5naW5lSW5zdGFuY2U6OmdldEluc3RhbmNlKCktPnF1ZXJ5SW50ZXJmYWNlPEVuZ2luZUludGVyZmFjZT4oKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIGRlc3Ryb3lFbmdpbmVJbnN0YW5jZShFbmdpbmVJbnRlcmZhY2UqKQoreworICAgIC8vIFRoZSBlbmdpbmUgaXMgYSBzaW5nbGV0b24uCit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcAppbmRleCBhZTM5ZmVmLi5hYTA2YWUzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmNwcApAQCAtMjAsMTcgKzIwLDE3IEBACiAKIHVzaW5nIHN0ZDo6c3RyaW5nOwogCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CisKIHN0YXR1c190IEVsZW1lbnQ8YXVkaW9fc291cmNlX3Q+OjpzZXRJZGVudGlmaWVyKGF1ZGlvX3NvdXJjZV90IGlkZW50aWZpZXIpCiB7Ci0gICAgaWYgKGlkZW50aWZpZXIgPiBBVURJT19TT1VSQ0VfTUFYICYmIGlkZW50aWZpZXIgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKKyAgICBpZiAoaWRlbnRpZmllciA+IEFVRElPX1NPVVJDRV9NQVggJiYgaWRlbnRpZmllciAhPSBBVURJT19TT1VSQ0VfSE9UV09SRAorICAgICAgICAmJiBpZGVudGlmaWVyICE9IEFVRElPX1NPVVJDRV9GTV9UVU5FUiAmJiBpZGVudGlmaWVyICE9IEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBtSWRlbnRpZmllciA9IGlkZW50aWZpZXI7Ci0gICAgQUxPR0QoIiVzOiBJbnB1dFNvdXJjZSAlcyBpZGVudGlmaWVyIDB4JVgiLCBfX0ZVTkNUSU9OX18sIGdldE5hbWUoKS5jX3N0cigpLCBpZGVudGlmaWVyKTsKKyAgICBBTE9HVigiJXM6IElucHV0U291cmNlICVzIGlkZW50aWZpZXIgMHglWCIsIF9fRlVOQ1RJT05fXywgZ2V0TmFtZSgpLmNfc3RyKCksIGlkZW50aWZpZXIpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApAQCAtNDYsMTUgKzQ2LDE4IEBACiB0ZW1wbGF0ZSA8Pgogc3RhdHVzX3QgRWxlbWVudDxhdWRpb19zb3VyY2VfdD46OnNldChhdWRpb19kZXZpY2VzX3QgZGV2aWNlcykKIHsKLSAgICBpZiAoZGV2aWNlcyAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICBkZXZpY2VzIHw9IEFVRElPX0RFVklDRV9CSVRfSU47CisgICAgaWYgKGRldmljZXMgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICAgICAgLy8gUmVzZXQKKyAgICAgICAgbUFwcGxpY2FibGVEZXZpY2VzID0gZGV2aWNlczsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KKyAgICBkZXZpY2VzIHw9IEFVRElPX0RFVklDRV9CSVRfSU47CiAgICAgaWYgKCFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlcykpIHsKICAgICAgICAgQUxPR0UoIiVzOiB0cnlpbmcgdG8gc2V0IGFuIGludmFsaWQgZGV2aWNlIDB4JVggZm9yIGlucHV0IHNvdXJjZSAlcyIsCiAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgZ2V0TmFtZSgpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBBTE9HRCgiJXM6IDB4JVggZm9yIGlucHV0IHNvdXJjZSAlcyIsIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgZ2V0TmFtZSgpLmNfc3RyKCkpOworICAgIEFMT0dWKCIlczogMHglWCBmb3IgaW5wdXQgc291cmNlICVzIiwgX19GVU5DVElPTl9fLCBkZXZpY2VzLCBnZXROYW1lKCkuY19zdHIoKSk7CiAgICAgbUFwcGxpY2FibGVEZXZpY2VzID0gZGV2aWNlczsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL0lucHV0U291cmNlLmgKaW5kZXggNmM0OThkYy4uZDY0YTYwYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9JbnB1dFNvdXJjZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvSW5wdXRTb3VyY2UuaApAQCAtMTgsMTAgKzE4LDggQEAKIAogI2luY2x1ZGUgIkVsZW1lbnQuaCIKIAotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBhdWRpb19wb2xpY3kgewogCiAvKioKICAqIFNwZWNpYWxpemF0aW9uIG9mIHBvbGljeSBiYXNlIGNsYXNzIGVsZW1lbnQgZm9yIGF1ZGlvX3NvdXJjZV90CkBAIC02MSw3ICs1OSw3IEBACiAKICAgICAvKioKICAgICAgKiBBIFBvbGljeSBlbGVtZW50IG1heSBpbXBsZW1lbnQgZ2V0dGVyL3NldHRlciBmdW5jdGlvbiBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KLSAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgcm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKKyAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKICAgICAgKiBvciBhIHN0cmluZy4KICAgICAgKi8KICAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHk+CkBAIC03NSwxMCArNzMsMTEgQEAKICAgICBFbGVtZW50KGNvbnN0IEVsZW1lbnQgJm9iamVjdCk7CiAgICAgRWxlbWVudCAmb3BlcmF0b3I9KGNvbnN0IEVsZW1lbnQgJm9iamVjdCk7CiAKLSAgICBzdGQ6OnN0cmluZyBtTmFtZTsgLyoqPCBVbmlxdWUgbGl0ZXJhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCi0gICAgYXVkaW9fc291cmNlX3QgbUlkZW50aWZpZXI7IC8qKjwgVW5pcXVlIG51bWVyaWNhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCi0KLSAgICBhdWRpb19kZXZpY2VzX3QgbUFwcGxpY2FibGVEZXZpY2VzOyAvKio8IEFwcGxpY2FibGUgaW5wdXQgZGV2aWNlIGZvciB0aGlzIGlucHV0IHNvdXJjZS4gKi8KKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtTmFtZTsgLyoqPCBVbmlxdWUgbGl0ZXJhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCisgICAgLyoqIFVuaXF1ZSBudW1lcmljYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQgKi8KKyAgICBhdWRpb19zb3VyY2VfdCBtSWRlbnRpZmllciA9IEFVRElPX1NPVVJDRV9ERUZBVUxUOworICAgIC8qKiBBcHBsaWNhYmxlIGlucHV0IGRldmljZSBmb3IgdGhpcyBpbnB1dCBzb3VyY2UuICovCisgICAgYXVkaW9fZGV2aWNlc190IG1BcHBsaWNhYmxlRGV2aWNlcyA9IEFVRElPX0RFVklDRV9OT05FOwogfTsKIAogdHlwZWRlZiBFbGVtZW50PGF1ZGlvX3NvdXJjZV90PiBJbnB1dFNvdXJjZTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyYXRlZ3kuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1Mzk5MTQuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUG9saWN5RW5naW5lL1N0cmF0ZWd5IgotCi0jaW5jbHVkZSAiU3RyYXRlZ3kuaCIKLQotdXNpbmcgc3RkOjpzdHJpbmc7Ci0KLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17Ci0KLXN0YXR1c190IEVsZW1lbnQ8cm91dGluZ19zdHJhdGVneT46OnNldElkZW50aWZpZXIocm91dGluZ19zdHJhdGVneSBpZGVudGlmaWVyKQotewotICAgIGlmIChpZGVudGlmaWVyID49IE5VTV9TVFJBVEVHSUVTKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIG1JZGVudGlmaWVyID0gaWRlbnRpZmllcjsKLSAgICBBTE9HRCgiJXM6IFN0cmF0ZWd5ICVzIGlkZW50aWZpZXIgMHglWCIsIF9fRlVOQ1RJT05fXywgZ2V0TmFtZSgpLmNfc3RyKCksIGlkZW50aWZpZXIpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotLyoqCi0gKiBTZXQgdGhlIGRldmljZSBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyYXRlZ3kuCi0gKiBJdCBjaGVja3MgaWYgdGhlIG91dHB1dCBkZXZpY2UgaXMgdmFsaWQuCi0gKgotICogQHBhcmFtW2luXSBkZXZpY2VzIHNlbGVjdGVkIGZvciB0aGUgZ2l2ZW4gc3RyYXRlZ3kuCi0gKgotICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgZGV2aWNlIGlzIGVpdGhlciB2YWxpZCBvciBub25lLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KLSAqLwotdGVtcGxhdGUgPD4KLXN0YXR1c190IEVsZW1lbnQ8cm91dGluZ19zdHJhdGVneT46OnNldDxhdWRpb19kZXZpY2VzX3Q+KGF1ZGlvX2RldmljZXNfdCBkZXZpY2VzKQotewotICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZXMoZGV2aWNlcykgfHwgZGV2aWNlcyA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICBBTE9HRSgiJXM6IHRyeWluZyB0byBzZXQgYW4gaW52YWxpZCBkZXZpY2UgMHglWCBmb3Igc3RyYXRlZ3kgJXMiLAotICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZXMsIGdldE5hbWUoKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgQUxPR0QoIiVzOiAweCVYIGZvciBzdHJhdGVneSAlcyIsIF9fRlVOQ1RJT05fXywgZGV2aWNlcywgZ2V0TmFtZSgpLmNfc3RyKCkpOwotICAgIG1BcHBsaWNhYmxlRGV2aWNlcyA9IGRldmljZXM7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi10ZW1wbGF0ZSA8PgotYXVkaW9fZGV2aWNlc190IEVsZW1lbnQ8cm91dGluZ19zdHJhdGVneT46OmdldDxhdWRpb19kZXZpY2VzX3Q+KCkgY29uc3QKLXsKLSAgICBBTE9HVigiJXM6IDB4JVggZm9yIHN0cmF0ZWd5ICVzIiwgX19GVU5DVElPTl9fLCBtQXBwbGljYWJsZURldmljZXMsIGdldE5hbWUoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gbUFwcGxpY2FibGVEZXZpY2VzOwotfQotCi19IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJhdGVneS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTU3ZDU1Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyYXRlZ3kuaAorKysgL2Rldi9udWxsCkBAIC0xLDg5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTUgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jcHJhZ21hIG9uY2UKLQotI2luY2x1ZGUgIkVsZW1lbnQuaCIKLSNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKLQotLyoqCi0gKiBAdHBhcmFtIGF1ZGlvX2RldmljZXNfdDogQXBwbGljYWJsZSBvdXRwdXQgZGV2aWNlKHMpIGZvciB0aGlzIHN0cmF0ZWd5LgotICovCi10ZW1wbGF0ZSA8PgotY2xhc3MgRWxlbWVudDxyb3V0aW5nX3N0cmF0ZWd5PgotewotcHVibGljOgotICAgIEVsZW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCi0gICAgICAgIDogbU5hbWUobmFtZSksCi0gICAgICAgICAgbUFwcGxpY2FibGVEZXZpY2VzKEFVRElPX0RFVklDRV9OT05FKQotICAgIHt9Ci0gICAgfkVsZW1lbnQoKSB7fQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBpZGVudGlmaWVyIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQKLSAgICAgKgotICAgICAqIEByZXR1cm5zIHN0cmluZyByZXByZXNlbnRpbmcgdGhlIG5hbWUgb2YgdGhpcyBwb2xpY3kgZWxlbWVudAotICAgICAqLwotICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gbU5hbWU7IH0KLQotICAgIC8qKgotICAgICogU2V0IHRoZSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBwb2xpY3kgZWxlbWVudC4KLSAgICAqCi0gICAgKiBAdHBhcmFtIEtleSB0eXBlIG9mIHRoZSB1bmlxdWUgaWRlbnRpZmllci4KLSAgICAqIEBwYXJhbVtpbl0gaWRlbnRpZmllciB0byBiZSBzZXQuCi0gICAgKgotICAgICogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgaWRlbnRpZmllciBpcyB2YWxpZCBhbmQgc2V0IGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCi0gICAgKi8KLSAgICBzdGF0dXNfdCBzZXRJZGVudGlmaWVyKHJvdXRpbmdfc3RyYXRlZ3kgaWRlbnRpZmllcik7Ci0KLSAgICAvKioKLSAgICAgKiBAcmV0dXJuIHRoZSB1bmlxdWUgaWRlbnRpZmllciBvZiB0aGlzIHBvbGljeSBlbGVtZW50LgotICAgICAqLwotICAgIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0SWRlbnRpZmllcigpIGNvbnN0IHsgcmV0dXJuIG1JZGVudGlmaWVyOyB9Ci0KLSAgICAvKioKLSAgICAgKiBBIFBvbGljeSBlbGVtZW50IG1heSBpbXBsZW1lbnQgZ2V0dGVyL3NldHRlciBmdW5jdGlvbiBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KLSAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgcm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKLSAgICAgKiBvciBhIHN0cmluZy4KLSAgICAgKi8KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHk+Ci0gICAgUHJvcGVydHkgZ2V0KCkgY29uc3Q7Ci0KLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJvcGVydHk+Ci0gICAgc3RhdHVzX3Qgc2V0KFByb3BlcnR5IHByb3BlcnR5KTsKLQotcHJpdmF0ZToKLSAgICAvKiBDb3B5IGZhY2lsaXRpZXMgYXJlIHB1dCBwcml2YXRlIHRvIGRpc2FibGUgY29weS4gKi8KLSAgICBFbGVtZW50KGNvbnN0IEVsZW1lbnQgJm9iamVjdCk7Ci0gICAgRWxlbWVudCAmb3BlcmF0b3I9KGNvbnN0IEVsZW1lbnQgJm9iamVjdCk7Ci0KLSAgICBzdGQ6OnN0cmluZyBtTmFtZTsgLyoqPCBVbmlxdWUgbGl0ZXJhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCi0gICAgcm91dGluZ19zdHJhdGVneSBtSWRlbnRpZmllcjsgLyoqPCBVbmlxdWUgbnVtZXJpY2FsIElkZW50aWZpZXIgb2YgYSBwb2xpY3kgYmFzZSBlbGVtZW50Ki8KLQotICAgIGF1ZGlvX2RldmljZXNfdCBtQXBwbGljYWJsZURldmljZXM7IC8qKjwgQXBwbGljYWJsZSBvdXRwdXQgZGV2aWNlKHMpIGZvciB0aGlzIHN0cmF0ZWd5LiAqLwotfTsKLQotdHlwZWRlZiBFbGVtZW50PHJvdXRpbmdfc3RyYXRlZ3k+IFN0cmF0ZWd5OwotCi19IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLX0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKLQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmVhbS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmVhbS5jcHAKaW5kZXggMGVkMzY0Zi4uZTY0YmE0YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmNwcApAQCAtMjEsMTAgKzIxLDggQEAKIAogdXNpbmcgc3RkOjpzdHJpbmc7CiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKIAogc3RhdHVzX3QgRWxlbWVudDxhdWRpb19zdHJlYW1fdHlwZV90Pjo6c2V0SWRlbnRpZmllcihhdWRpb19zdHJlYW1fdHlwZV90IGlkZW50aWZpZXIpCiB7CkBAIC0zMiwzNiArMzAsMTAgQEAKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgbUlkZW50aWZpZXIgPSBpZGVudGlmaWVyOwotICAgIEFMT0dEKCIlczogU3RyZWFtICVzIGlkZW50aWZpZXIgMHglWCIsIF9fRlVOQ1RJT05fXywgZ2V0TmFtZSgpLmNfc3RyKCksIGlkZW50aWZpZXIpOworICAgIEFMT0dWKCIlczogU3RyZWFtICVzIGlkZW50aWZpZXIgMHglWCIsIF9fRlVOQ1RJT05fXywgZ2V0TmFtZSgpLmNfc3RyKCksIGlkZW50aWZpZXIpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotLyoqCi0qIFNldCB0aGUgc3RyYXRlZ3kgdG8gZm9sbG93IGZvciB0aGlzIHN0cmVhbS4KLSogSXQgY2hlY2tzIGlmIHRoZSBzdHJhdGVneSBpcyB2YWxpZC4KLSoKLSogQHBhcmFtW2luXSBzdHJhdGVneSB0byBiZSBmb2xsb3dlZC4KLSoKLSogQHJldHVybiBOT19FUlJPUiBpZiB0aGUgc3RyYXRlZ3kgaXMgc2V0IGNvcnJlY3RseSwgZXJyb3IgY29kZSBvdGhlcndpc2UuCi0qLwotdGVtcGxhdGUgPD4KLXN0YXR1c190IEVsZW1lbnQ8YXVkaW9fc3RyZWFtX3R5cGVfdD46OnNldDxyb3V0aW5nX3N0cmF0ZWd5Pihyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQotewotICAgIGlmIChzdHJhdGVneSA+PSBOVU1fU1RSQVRFR0lFUykgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBtQXBwbGljYWJsZVN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0gICAgQUxPR0QoIiVzOiAweCVYIGZvciBTdHJlYW0gJXMiLCBfX0ZVTkNUSU9OX18sIHN0cmF0ZWd5LCBnZXROYW1lKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi10ZW1wbGF0ZSA8Pgotcm91dGluZ19zdHJhdGVneSBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+OjpnZXQ8cm91dGluZ19zdHJhdGVneT4oKSBjb25zdAotewotICAgIEFMT0dWKCIlczogMHglWCBmb3IgU3RyZWFtICVzIiwgX19GVU5DVElPTl9fLCBtQXBwbGljYWJsZVN0cmF0ZWd5LCBnZXROYW1lKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIG1BcHBsaWNhYmxlU3RyYXRlZ3k7Ci19Ci0KIHRlbXBsYXRlIDw+CiBzdGF0dXNfdCBFbGVtZW50PGF1ZGlvX3N0cmVhbV90eXBlX3Q+OjpzZXQ8YXVkaW9fc3RyZWFtX3R5cGVfdD4oYXVkaW9fc3RyZWFtX3R5cGVfdCB2b2x1bWVQcm9maWxlKQogewpAQCAtNjksNyArNDEsNyBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBtVm9sdW1lUHJvZmlsZSA9IHZvbHVtZVByb2ZpbGU7Ci0gICAgQUxPR0QoIiVzOiAweCVYIGZvciBTdHJlYW0gJXMiLCBfX0ZVTkNUSU9OX18sIG1Wb2x1bWVQcm9maWxlLCBnZXROYW1lKCkuY19zdHIoKSk7CisgICAgQUxPR1YoIiVzOiAweCVYIGZvciBTdHJlYW0gJXMiLCBfX0ZVTkNUSU9OX18sIG1Wb2x1bWVQcm9maWxlLCBnZXROYW1lKCkuY19zdHIoKSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmVhbS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9TdHJlYW0uaAppbmRleCA2OTAyMDAzLi5hNGZkZDM5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1N0cmVhbS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvU3RyZWFtLmgKQEAgLTE4LDIzICsxOCwyMCBAQAogCiAjaW5jbHVkZSAiRWxlbWVudC5oIgogI2luY2x1ZGUgIkVuZ2luZURlZmluaXRpb24uaCIKLSNpbmNsdWRlIDxSb3V0aW5nU3RyYXRlZ3kuaD4KICNpbmNsdWRlIDxtYXA+CiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKKwogLyoqCi0gKiBAdHBhcmFtIHJvdXRpbmdfc3RyYXRlZ3k6IEFwcGxpY2FibGUgc3RyYXRlZ3kgZm9yIHRoaXMgc3RyZWFtLgorICogQHRwYXJhbSBwcm9kdWN0X3N0cmF0ZWd5X3Q6IEFwcGxpY2FibGUgc3RyYXRlZ3kgZm9yIHRoaXMgc3RyZWFtLgogICovCiB0ZW1wbGF0ZSA8PgogY2xhc3MgRWxlbWVudDxhdWRpb19zdHJlYW1fdHlwZV90PgogewogcHVibGljOgogICAgIEVsZW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCi0gICAgICAgIDogbU5hbWUobmFtZSksCi0gICAgICAgICAgbUFwcGxpY2FibGVTdHJhdGVneShTVFJBVEVHWV9NRURJQSkKKyAgICAgICAgOiBtTmFtZShuYW1lKQogICAgIHt9CiAgICAgfkVsZW1lbnQoKSB7fQogCkBAIC02Miw3ICs1OSw3IEBACiAKICAgICAvKioKICAgICAgKiBBIFBvbGljeSBlbGVtZW50IG1heSBpbXBsZW1lbnQgZ2V0dGVyL3NldHRlciBmdW5jdGlvbiBmb3IgYSBnaXZlbiBwcm9wZXJ0eS4KLSAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgcm91dGluZ19zdHJhdGVneSwgYXVkaW9fc3RyZWFtX3R5cGVfdCwgYXVkaW9fdXNhZ2VfdCwgYXVkaW9fc291cmNlX3QKKyAgICAgKiBQcm9wZXJ0eSBtYXkgYmUgIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90CiAgICAgICogb3IgYSBzdHJpbmcuCiAgICAgICovCiAgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgpAQCAtNzksOCArNzYsNiBAQAogICAgIHN0ZDo6c3RyaW5nIG1OYW1lOyAvKio8IFVuaXF1ZSBsaXRlcmFsIElkZW50aWZpZXIgb2YgYSBwb2xpY3kgYmFzZSBlbGVtZW50Ki8KICAgICBhdWRpb19zdHJlYW1fdHlwZV90IG1JZGVudGlmaWVyOyAvKio8IFVuaXF1ZSBudW1lcmljYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLwogCi0gICAgcm91dGluZ19zdHJhdGVneSBtQXBwbGljYWJsZVN0cmF0ZWd5OyAvKio8IEFwcGxpY2FibGUgc3RyYXRlZ3kgZm9yIHRoaXMgc3RyZWFtLiAqLwotCiAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtVm9sdW1lUHJvZmlsZTsgLyoqPCBWb2x1bWUgUHJvZmlsZSBmb2xsb3dlZCBieSB0aGlzIHN0cmVhbS4gKi8KIH07CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvVXNhZ2UuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Vc2FnZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkMjA4MjguLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3NyYy9Vc2FnZS5jcHAKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2RlZmluZSBMT0dfVEFHICJBUE06OkF1ZGlvUG9saWN5RW5naW5lL1VzYWdlIgotCi0jaW5jbHVkZSAiVXNhZ2UuaCIKLQotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKLQotc3RhdHVzX3QgRWxlbWVudDxhdWRpb191c2FnZV90Pjo6c2V0SWRlbnRpZmllcihhdWRpb191c2FnZV90IGlkZW50aWZpZXIpCi17Ci0gICAgaWYgKGlkZW50aWZpZXIgPiBBVURJT19VU0FHRV9NQVgpIHsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgbUlkZW50aWZpZXIgPSBpZGVudGlmaWVyOwotICAgIEFMT0dEKCIlczogVXNhZ2UgJXMgaGFzIGlkZW50aWZpZXIgMHglWCIsIF9fRlVOQ1RJT05fXywgZ2V0TmFtZSgpLmNfc3RyKCksIGlkZW50aWZpZXIpOwotICAgIHJldHVybiBOT19FUlJPUjsKLX0KLQotdGVtcGxhdGUgPD4KLXN0YXR1c190IEVsZW1lbnQ8YXVkaW9fdXNhZ2VfdD46OnNldDxyb3V0aW5nX3N0cmF0ZWd5Pihyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KQotewotICAgIGlmIChzdHJhdGVneSA+PSBOVU1fU1RSQVRFR0lFUykgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBBTE9HRCgiJXM6ICVkIGZvciBVc2FnZSAlcyIsIF9fRlVOQ1RJT05fXywgc3RyYXRlZ3ksIGdldE5hbWUoKS5jX3N0cigpKTsKLSAgICBtQXBwbGljYWJsZVN0cmF0ZWd5ID0gc3RyYXRlZ3k7Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCi10ZW1wbGF0ZSA8Pgotcm91dGluZ19zdHJhdGVneSBFbGVtZW50PGF1ZGlvX3VzYWdlX3Q+OjpnZXQ8cm91dGluZ19zdHJhdGVneT4oKSBjb25zdAotewotICAgIEFMT0dEKCIlczogJWQgZm9yIFVzYWdlICVzIiwgX19GVU5DVElPTl9fLCBtQXBwbGljYWJsZVN0cmF0ZWd5LCBnZXROYW1lKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIG1BcHBsaWNhYmxlU3RyYXRlZ3k7Ci19Ci0KLX0gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvVXNhZ2UuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS9zcmMvVXNhZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY5ZTBlMC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvc3JjL1VzYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlICJFbGVtZW50LmgiCi0jaW5jbHVkZSA8Um91dGluZ1N0cmF0ZWd5Lmg+Ci0KLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17Ci0KLS8qKgotICogQHRwYXJhbSByb3V0aW5nX3N0cmF0ZWd5OiBBcHBsaWNhYmxlIHN0cmF0ZWd5IGZvciB0aGlzIHVzYWdlLgotICovCi10ZW1wbGF0ZSA8PgotY2xhc3MgRWxlbWVudDxhdWRpb191c2FnZV90PgotewotcHVibGljOgotICAgIEVsZW1lbnQoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpCi0gICAgICAgIDogbU5hbWUobmFtZSksCi0gICAgICAgICAgbUFwcGxpY2FibGVTdHJhdGVneShTVFJBVEVHWV9NRURJQSkKLSAgICB7fQotICAgIH5FbGVtZW50KCkge30KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgaWRlbnRpZmllciBvZiB0aGlzIHBvbGljeSBlbGVtZW50Ci0gICAgICoKLSAgICAgKiBAcmV0dXJucyBzdHJpbmcgcmVwcmVzZW50aW5nIHRoZSBuYW1lIG9mIHRoaXMgcG9saWN5IGVsZW1lbnQKLSAgICAgKi8KLSAgICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIG1OYW1lOyB9Ci0KLSAgICAvKioKLSAgICAqIFNldCB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcG9saWN5IGVsZW1lbnQuCi0gICAgKgotICAgICogQHRwYXJhbSBLZXkgdHlwZSBvZiB0aGUgdW5pcXVlIGlkZW50aWZpZXIuCi0gICAgKiBAcGFyYW1baW5dIGlkZW50aWZpZXIgdG8gYmUgc2V0LgotICAgICoKLSAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgdGhlIGlkZW50aWZpZXIgaXMgdmFsaWQgYW5kIHNldCBjb3JyZWN0bHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgotICAgICovCi0gICAgc3RhdHVzX3Qgc2V0SWRlbnRpZmllcihhdWRpb191c2FnZV90IGlkZW50aWZpZXIpOwotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0aGUgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhpcyBwb2xpY3kgZWxlbWVudC4KLSAgICAgKi8KLSAgICBhdWRpb191c2FnZV90IGdldElkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBtSWRlbnRpZmllcjsgfQotCi0gICAgLyoqCi0gICAgICogQSBQb2xpY3kgZWxlbWVudCBtYXkgaW1wbGVtZW50IGdldHRlci9zZXR0ZXIgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gcHJvcGVydHkuCi0gICAgICogUHJvcGVydHkgbWF5IGJlIHJvdXRpbmdfc3RyYXRlZ3ksIGF1ZGlvX3N0cmVhbV90eXBlX3QsIGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90Ci0gICAgICogb3IgYSBzdHJpbmcuCi0gICAgICovCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgotICAgIFByb3BlcnR5IGdldCgpIGNvbnN0OwotCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIFByb3BlcnR5PgotICAgIHN0YXR1c190IHNldChQcm9wZXJ0eSBwcm9wZXJ0eSk7Ci0KLXByaXZhdGU6Ci0gICAgLyogQ29weSBmYWNpbGl0aWVzIGFyZSBwdXQgcHJpdmF0ZSB0byBkaXNhYmxlIGNvcHkuICovCi0gICAgRWxlbWVudChjb25zdCBFbGVtZW50ICZvYmplY3QpOwotICAgIEVsZW1lbnQgJm9wZXJhdG9yPShjb25zdCBFbGVtZW50ICZvYmplY3QpOwotCi0gICAgc3RkOjpzdHJpbmcgbU5hbWU7IC8qKjwgVW5pcXVlIGxpdGVyYWwgSWRlbnRpZmllciBvZiBhIHBvbGljeSBiYXNlIGVsZW1lbnQqLwotICAgIGF1ZGlvX3VzYWdlX3QgbUlkZW50aWZpZXI7IC8qKjwgVW5pcXVlIG51bWVyaWNhbCBJZGVudGlmaWVyIG9mIGEgcG9saWN5IGJhc2UgZWxlbWVudCovCi0gICAgcm91dGluZ19zdHJhdGVneSBtQXBwbGljYWJsZVN0cmF0ZWd5OyAvKio8IEFwcGxpY2FibGUgc3RyYXRlZ3kgZm9yIHRoaXMgdXNhZ2UuICovCi19OwotCi10eXBlZGVmIEVsZW1lbnQ8YXVkaW9fdXNhZ2VfdD4gVXNhZ2U7Ci0KLX0gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2U0NzMyNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsMTYxIEBACisvLyBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3B5dGhvbl9kZWZhdWx0cyB7CisgICAgbmFtZTogInRvb2xzX2RlZmF1bHQiLAorICAgIHZlcnNpb246IHsKKyAgICAgICAgcHkyOiB7CisgICAgICAgICAgICBlbmFibGVkOiBmYWxzZSwKKyAgICAgICAgfSwKKyAgICAgICAgcHkzOiB7CisgICAgICAgICAgICBlbmFibGVkOiB0cnVlLAorICAgICAgICB9LAorICAgIH0sCit9CisKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vIFRvb2xzIGZvciBhdWRpbyBwb2xpY3kgZW5naW5lIGNyaXRlcmlvbiB0eXBlIGNvbmZpZ3VyYXRpb24gZmlsZQorLy8KK3B5dGhvbl9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImJ1aWxkUG9saWN5Q3JpdGVyaW9uVHlwZXMucHkiLAorICAgIG1haW46ICJidWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJidWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5IiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbInRvb2xzX2RlZmF1bHQiXSwKK30KKworZ2VucnVsZV9kZWZhdWx0cyB7CisgICAgbmFtZTogImJ1aWxkcG9saWN5Y3JpdGVyaW9udHlwZXNydWxlIiwKKyAgICB0b29sczogWyJidWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5Il0sCisgICAgY21kOiAiY3AgJChsb2NhdGlvbnMgOmF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2ZpbGVzKSAkKGdlbkRpcikvLiAmJiAiICsKKyAgICAgICAgICJjcCAkKGxvY2F0aW9uIDphdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl90b3BfZmlsZSkgJChnZW5EaXIpL2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCAmJiAiICsKKyAgICAgICAgICIkKGxvY2F0aW9uIGJ1aWxkUG9saWN5Q3JpdGVyaW9uVHlwZXMucHkpICIgKworICAgICAgICAgLy8gQHRvZG8gdXBkYXRlIGlmIDE0Mjg2NTkgaXMgbWVyZ2VkICItLWFuZHJvaWRhdWRpb2Jhc2VoZWFkZXIgJChsb2NhdGlvbiA6YW5kcm9pZF9hdWRpb19iYXNlX2hlYWRlcl9maWxlKSAiICsKKyAgICAgICAgICIgLS1hbmRyb2lkYXVkaW9iYXNlaGVhZGVyIHN5c3RlbS9tZWRpYS9hdWRpby9pbmNsdWRlL3N5c3RlbS9hdWRpby1iYXNlLmggIiArCisgICAgICAgICAiLS1hdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlICQoZ2VuRGlyKS9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwgIiArCisgICAgICAgICAiLS1jcml0ZXJpb250eXBlcyAkKGxvY2F0aW9uIDphdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlc190ZW1wbGF0ZSkgIiArCisgICAgICAgICAiLS1vdXRwdXRmaWxlICQob3V0KSIsCisgICAgc3JjczogWworICAgICAgICAvLyBUaGUgY29tbWVudGVkIGlucHV0cyBtdXN0IGJlIHByb3ZpZGVkIHRvIHVzZSB0aGlzIGdlbnJ1bGVfZGVmYXVsdHMKKyAgICAgICAgLy8gQHRvZG8gdW5jb21tZW50IGlmIDE0Mjg2NTkgaXMgbWVyZ2VkIjphbmRyb2lkX2F1ZGlvX2Jhc2VfaGVhZGVyX2ZpbGUiLAorICAgICAgICAiOmF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzX3RlbXBsYXRlIiwKKyAgICAgICAgLy8gIjphdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbl90b3BfZmlsZSIsCisgICAgICAgIC8vICI6YXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb25fZmlsZXMiLAorICAgIF0sCisgICAgb3V0OiBbImF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzLnhtbCJdLAorfQorCisvLyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisvLyBUb29scyBmb3IgYXVkaW8gcG9saWN5IGVuZ2luZSBwYXJhbWV0ZXIgZnJhbWV3b3JrIGNvbmZpZ3VyYWJsZSBkb21haW5zCisvLworcHl0aG9uX2JpbmFyeV9ob3N0IHsKKyAgICBuYW1lOiAiZG9tYWluR2VuZXJhdG9yUG9saWN5LnB5IiwKKyAgICBtYWluOiAiZG9tYWluR2VuZXJhdG9yUG9saWN5LnB5IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJkb21haW5HZW5lcmF0b3JQb2xpY3kucHkiLAorICAgIF0sCisgICAgZGVmYXVsdHM6IFsidG9vbHNfZGVmYXVsdCJdLAorICAgIGxpYnM6IFsKKyAgICAgICAgIkVkZFBhcnNlci5weSIsCisgICAgICAgICJob3N0Q29uZmlnLnB5IiwKKyAgICAgICAgIlBGV1NjcmlwdEdlbmVyYXRvci5weSIsCisgICAgXSwKKyAgICByZXF1aXJlZDogWworICAgICAgICAiZG9tYWluR2VuZXJhdG9yQ29ubmVjdG9yIiwKKyAgICBdLAorfQorCitnZW5ydWxlX2RlZmF1bHRzIHsKKyAgICBuYW1lOiAiZG9tYWluZ2VuZXJhdG9ycG9saWN5cnVsZSIsCisgICAgdG9vbHM6IFsKKyAgICAgICAgImRvbWFpbkdlbmVyYXRvclBvbGljeS5weSIsCisgICAgICAgICJkb21haW5HZW5lcmF0b3JDb25uZWN0b3IiLAorICAgIF0sCisgICAgY21kOiAibWtkaXIgLXAgJChnZW5EaXIpL1N0cnVjdHVyZS9Qb2xpY3kgJiYgIiArCisgICAgICAgICAiY3AgJChsb2NhdGlvbnMgOmF1ZGlvX3BvbGljeV9wZndfc3RydWN0dXJlX2ZpbGVzKSAkKGdlbkRpcikvU3RydWN0dXJlL1BvbGljeSAmJiAiICsKKyAgICAgICAgICJjcCAkKGxvY2F0aW9uIDphdWRpb19wb2xpY3lfcGZ3X3RvcGxldmVsKSAkKGdlbkRpcikvdG9wX2xldmVsICYmICIgKworICAgICAgICAgIiQobG9jYXRpb24gZG9tYWluR2VuZXJhdG9yUG9saWN5LnB5KSAiICsKKyAgICAgICAgICItLXZhbGlkYXRlICIgKworICAgICAgICAgIi0tZG9tYWluLWdlbmVyYXRvci10b29sICQobG9jYXRpb24gZG9tYWluR2VuZXJhdG9yQ29ubmVjdG9yKSAiICsKKyAgICAgICAgICItLXRvcGxldmVsLWNvbmZpZyAkKGdlbkRpcikvdG9wX2xldmVsICIgKworICAgICAgICAgIi0tY3JpdGVyaWEgJChsb2NhdGlvbiA6YXVkaW9fcG9saWN5X2VuZ2luZV9jcml0ZXJpYSkgIiArCisgICAgICAgICAiLS1jcml0ZXJpb250eXBlcyAkKGxvY2F0aW9uIDphdWRpb19wb2xpY3lfZW5naW5lX2NyaXRlcmlvbl90eXBlcykgIiArCisgICAgICAgICAiLS1hZGQtZWRkcyAkKGxvY2F0aW9ucyA6ZWRkX2ZpbGVzKSAiICsKKyAgICAgICAgICItLXNjaGVtYXMtZGlyIGV4dGVybmFsL3BhcmFtZXRlci1mcmFtZXdvcmsvdXBzdHJlYW0vc2NoZW1hcyAiICsKKyAgICAgICAgICIgPiAkKG91dCkiLAorICAgIHNyY3M6IFsKKyAgICAgICAgLy8gVGhlIGNvbW1lbnRlZCBpbnB1dHMgbXVzdCBiZSBwcm92aWRlZCB0byB1c2UgdGhpcyBnZW5ydWxlX2RlZmF1bHRzCisgICAgICAgIC8vICI6YXVkaW9fcG9saWN5X3Bmd190b3BsZXZlbCIsCisgICAgICAgIC8vICI6YXVkaW9fcG9saWN5X3Bmd19zdHJ1Y3R1cmVfZmlsZXMiLAorICAgICAgICAiOmF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaWEiLAorICAgICAgICAvLyAiOmF1ZGlvX3BvbGljeV9lbmdpbmVfY3JpdGVyaW9uX3R5cGVzIiwKKyAgICAgICAgLy8gIjplZGRfZmlsZXMiLAorICAgIF0sCisgICAgb3V0OiBbIlBvbGljeUNvbmZpZ3VyYWJsZURvbWFpbnMueG1sIl0sCit9CisKKy8vIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKy8vIFRvb2xzIGZvciBwb2xpY3kgcGFyYW1ldGVyLWZyYW1ld29yayBwcm9kdWN0IHN0cmF0ZWdpZXMgc3RydWN0dXJlIGZpbGUgZ2VuZXJhdGlvbgorLy8KK3B5dGhvbl9iaW5hcnlfaG9zdCB7CisgICAgbmFtZTogImJ1aWxkU3RyYXRlZ2llc1N0cnVjdHVyZUZpbGUucHkiLAorICAgIG1haW46ICJidWlsZFN0cmF0ZWdpZXNTdHJ1Y3R1cmVGaWxlLnB5IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJidWlsZFN0cmF0ZWdpZXNTdHJ1Y3R1cmVGaWxlLnB5IiwKKyAgICBdLAorICAgIGRlZmF1bHRzOiBbInRvb2xzX2RlZmF1bHQiXSwKK30KKworZ2VucnVsZV9kZWZhdWx0cyB7CisgICAgbmFtZTogImJ1aWxkc3RyYXRlZ2llc3N0cnVjdHVyZXJ1bGUiLAorICAgIHRvb2xzOiBbImJ1aWxkU3RyYXRlZ2llc1N0cnVjdHVyZUZpbGUucHkiXSwKKyAgICBjbWQ6ICJjcCAkKGxvY2F0aW9ucyA6YXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uX2ZpbGVzKSAkKGdlbkRpcikgJiYgbHMgLWwgJChnZW5EaXIpICYmIisKKyAgICAgICAgICIkKGxvY2F0aW9uIGJ1aWxkU3RyYXRlZ2llc1N0cnVjdHVyZUZpbGUucHkpICIgKworICAgICAgICAgIi0tYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmF0aW9uZmlsZSAkKGdlbkRpcikvYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbCAiKworICAgICAgICAgIi0tcHJvZHVjdHN0cmF0ZWdpZXNzdHJ1Y3R1cmVmaWxlICQobG9jYXRpb24gOnByb2R1Y3Rfc3RyYXRlZ2llc19zdHJ1Y3R1cmVfdGVtcGxhdGUpICIgKworICAgICAgICAgIi0tb3V0cHV0ZmlsZSAkKG91dCkiLAorICAgIHNyY3M6IFsKKyAgICAgICAgLy8gVGhlIGNvbW1lbnRlZCBpbnB1dHMgbXVzdCBiZSBwcm92aWRlZCB0byB1c2UgdGhpcyBnZW5ydWxlX2RlZmF1bHRzCisgICAgICAgIC8vICI6YXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uX2ZpbGVzIiwKKyAgICAgICAgIjpwcm9kdWN0X3N0cmF0ZWdpZXNfc3RydWN0dXJlX3RlbXBsYXRlIiwKKyAgICBdLAorICAgIG91dDogWyJQcm9kdWN0U3RyYXRlZ2llcy54bWwiXSwKK30KKworLy8jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworLy8gVG9vbHMgZm9yIHBvbGljeSBwYXJhbWV0ZXItZnJhbWV3b3JrIGNvbW1vbiB0eXBlIHN0cnVjdHVyZSBmaWxlIGdlbmVyYXRpb24KKy8vCitweXRob25fYmluYXJ5X2hvc3QgeworICAgIG5hbWU6ICJidWlsZENvbW1vblR5cGVzU3RydWN0dXJlRmlsZS5weSIsCisgICAgbWFpbjogImJ1aWxkQ29tbW9uVHlwZXNTdHJ1Y3R1cmVGaWxlLnB5IiwKKyAgICBzcmNzOiBbCisgICAgICAgICJidWlsZENvbW1vblR5cGVzU3RydWN0dXJlRmlsZS5weSIsCisgICAgXSwKKyAgICBkZWZhdWx0czogWyJ0b29sc19kZWZhdWx0Il0sCit9CisKK2dlbnJ1bGVfZGVmYXVsdHMgeworICAgIG5hbWU6ICJidWlsZGNvbW1vbnR5cGVzc3RydWN0dXJlcnVsZSIsCisgICAgdG9vbHM6IFsiYnVpbGRDb21tb25UeXBlc1N0cnVjdHVyZUZpbGUucHkiXSwKKyAgICBjbWQ6ICIkKGxvY2F0aW9uIGJ1aWxkQ29tbW9uVHlwZXNTdHJ1Y3R1cmVGaWxlLnB5KSAiICsKKyAgICAgICAgICItLWFuZHJvaWRhdWRpb2Jhc2VoZWFkZXIgJChsb2NhdGlvbiA6bGliYXVkaW9fc3lzdGVtX2F1ZGlvX2Jhc2UpICIgKworICAgICAgICAgIi0tY29tbW9udHlwZXNzdHJ1Y3R1cmUgJChsb2NhdGlvbiA6Y29tbW9uX3R5cGVzX3N0cnVjdHVyZV90ZW1wbGF0ZSkgIiArCisgICAgICAgICAiLS1vdXRwdXRmaWxlICQob3V0KSIsCisgICAgc3JjczogWworICAgICAgICAiOmNvbW1vbl90eXBlc19zdHJ1Y3R1cmVfdGVtcGxhdGUiLAorICAgICAgICAiOmxpYmF1ZGlvX3N5c3RlbV9hdWRpb19iYXNlIiwKKyAgICBdLAorICAgIG91dDogWyJQb2xpY3lTdWJzeXN0ZW0tQ29tbW9uVHlwZXMueG1sIl0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRDb21tb25UeXBlc1N0cnVjdHVyZUZpbGUucHkgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRDb21tb25UeXBlc1N0cnVjdHVyZUZpbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uOWE3ZmE4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZENvbW1vblR5cGVzU3RydWN0dXJlRmlsZS5weQpAQCAtMCwwICsxLDE4NCBAQAorIyEgL3Vzci9iaW4vcHl0aG9uMworIworIyBweWxpbnQ6IGRpc2FibGU9bGluZS10b28tbG9uZywgbWlzc2luZy1kb2NzdHJpbmcsIGxvZ2dpbmctZm9ybWF0LWludGVycG9sYXRpb24sIGludmFsaWQtbmFtZQorCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCByZQoraW1wb3J0IHN5cworaW1wb3J0IG9zCitpbXBvcnQgbG9nZ2luZworaW1wb3J0IHhtbC5ldHJlZS5FbGVtZW50VHJlZSBhcyBFVAorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKK2ltcG9ydCB4bWwuZG9tLm1pbmlkb20gYXMgTUlOSURPTQorCitkZWYgcGFyc2VBcmdzKCk6CisgICAgYXJncGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249IlBhcmFtZXRlci1GcmFtZXdvcmsgWE1MIFwKKyAgICAgICAgc3RydWN0dXJlIGZpbGUgZ2VuZXJhdG9yLlxuXAorICAgICAgICBFeGl0IHdpdGggdGhlIG51bWJlciBvZiAocmVjb3ZlcmFibGUgb3Igbm90KSBlcnJvciB0aGF0IG9jY3VyZWQuIikKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWFuZHJvaWRhdWRpb2Jhc2VoZWFkZXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iQW5kcm9pZCBBdWRpbyBCYXNlIEMgaGVhZGVyIGZpbGUsIE1hbmRhdG9yeS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YXZhcj0iQU5EUk9JRF9BVURJT19CQVNFX0hFQURFUiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tY29tbW9udHlwZXNzdHJ1Y3R1cmUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iU3RydWN0dXJlIFhNTCBiYXNlIGZpbGUuIE1hbmRhdG9yeS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YXZhcj0iU1RSVUNUVVJFX0ZJTEVfSU4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLW91dHB1dGZpbGUnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iU3RydWN0dXJlIFhNTCBmaWxlLiBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGF2YXI9IlNUUlVDVFVSRV9GSUxFX09VVCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCd3JyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tdmVyYm9zZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnKQorCisgICAgcmV0dXJuIGFyZ3BhcnNlci5wYXJzZV9hcmdzKCkKKworCitkZWYgZmluZEJpdFBvcyhkZWNpbWFsKToKKyAgICBwb3MgPSAwCisgICAgaSA9IDEKKyAgICB3aGlsZSBpICE9IGRlY2ltYWw6CisgICAgICAgIGkgPSBpIDw8IDEKKyAgICAgICAgcG9zID0gcG9zICsgMQorICAgICAgICBpZiBwb3MgPT0gMzI6CisgICAgICAgICAgICByZXR1cm4gLTEKKyAgICByZXR1cm4gcG9zCisKKworZGVmIGdlbmVyYXRlWG1sU3RydWN0dXJlRmlsZShjb21wb25lbnRUeXBlRGljdCwgc3RydWN0dXJlVHlwZXNGaWxlLCBvdXRwdXRGaWxlKToKKworICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIHN0cnVjdHVyZVR5cGVzRmlsZSB7fSIuZm9ybWF0KHN0cnVjdHVyZVR5cGVzRmlsZSkpCisgICAgY29tcG9uZW50X3R5cGVzX2luX3RyZWUgPSBFVC5wYXJzZShzdHJ1Y3R1cmVUeXBlc0ZpbGUpCisKKyAgICBjb21wb25lbnRfdHlwZXNfcm9vdCA9IGNvbXBvbmVudF90eXBlc19pbl90cmVlLmdldHJvb3QoKQorCisgICAgZm9yIGNvbXBvbmVudF90eXBlc19uYW1lLCB2YWx1ZXNfZGljdCBpbiBjb21wb25lbnRUeXBlRGljdC5pdGVtcygpOgorICAgICAgICBmb3IgY29tcG9uZW50X3R5cGUgaW4gY29tcG9uZW50X3R5cGVzX3Jvb3QuZmluZGFsbCgnQ29tcG9uZW50VHlwZScpOgorICAgICAgICAgICAgaWYgY29tcG9uZW50X3R5cGUuZ2V0KCdOYW1lJykgPT0gY29tcG9uZW50X3R5cGVzX25hbWU6CisgICAgICAgICAgICAgICAgYml0cGFyYW1ldGVyc19ub2RlID0gY29tcG9uZW50X3R5cGUuZmluZCgiQml0UGFyYW1ldGVyQmxvY2siKQorICAgICAgICAgICAgICAgIGlmIGJpdHBhcmFtZXRlcnNfbm9kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgb3JkZXJlZF92YWx1ZXMgPSBPcmRlcmVkRGljdChzb3J0ZWQodmFsdWVzX2RpY3QuaXRlbXMoKSwga2V5PWxhbWJkYSB4OiB4WzFdKSkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gb3JkZXJlZF92YWx1ZXMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUgPSBFVC5TdWJFbGVtZW50KGJpdHBhcmFtZXRlcnNfbm9kZSwgIkJpdFBhcmFtZXRlciIpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlLnNldCgnTmFtZScsIGtleSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUuc2V0KCdTaXplJywgIjEiKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ1BvcycsIHN0cihmaW5kQml0UG9zKHZhbHVlKSkpCisKKyAgICAgICAgICAgICAgICBlbnVtX3BhcmFtZXRlcl9ub2RlID0gY29tcG9uZW50X3R5cGUuZmluZCgiRW51bVBhcmFtZXRlciIpCisgICAgICAgICAgICAgICAgaWYgZW51bV9wYXJhbWV0ZXJfbm9kZSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgb3JkZXJlZF92YWx1ZXMgPSBPcmRlcmVkRGljdChzb3J0ZWQodmFsdWVzX2RpY3QuaXRlbXMoKSwga2V5PWxhbWJkYSB4OiB4WzFdKSkKKyAgICAgICAgICAgICAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gb3JkZXJlZF92YWx1ZXMuaXRlbXMoKToKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUgPSBFVC5TdWJFbGVtZW50KGVudW1fcGFyYW1ldGVyX25vZGUsICJWYWx1ZVBhaXIiKQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ0xpdGVyYWwnLCBrZXkpCisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlLnNldCgnTnVtZXJpY2FsJywgc3RyKHZhbHVlKSkKKworICAgIHhtbHN0ciA9IEVULnRvc3RyaW5nKGNvbXBvbmVudF90eXBlc19yb290LCBlbmNvZGluZz0ndXRmOCcsIG1ldGhvZD0neG1sJykKKyAgICByZXBhcnNlZCA9IE1JTklET00ucGFyc2VTdHJpbmcoeG1sc3RyKQorICAgIHByZXR0eVhtbFN0ciA9IHJlcGFyc2VkLnRvcHJldHR5eG1sKGluZGVudD0iICAgICIsIG5ld2w9J1xuJykKKyAgICBwcmV0dHlYbWxTdHIgPSBvcy5saW5lc2VwLmpvaW4oW3MgZm9yIHMgaW4gcHJldHR5WG1sU3RyLnNwbGl0bGluZXMoKSBpZiBzLnN0cmlwKCldKQorICAgIG91dHB1dEZpbGUud3JpdGUocHJldHR5WG1sU3RyKQorCisKK2RlZiBjYXBpdGFsaXplTGluZShsaW5lKToKKyAgICByZXR1cm4gJyAnLmpvaW4oKHcuY2FwaXRhbGl6ZSgpIGZvciB3IGluIGxpbmUuc3BsaXQoJyAnKSkpCisKK2RlZiBwYXJzZUFuZHJvaWRBdWRpb0ZpbGUoYW5kcm9pZGF1ZGlvYmFzZWhlYWRlckZpbGUpOgorICAgICMKKyAgICAjIEFkYXB0YXRpb24gdGFibGUgYmV0d2VlbiBBbmRyb2lkIEVudW1lcmF0aW9uIHByZWZpeCBhbmQgQXVkaW8gUEZXIENyaXRlcmlvbiB0eXBlIG5hbWVzCisgICAgIworICAgIGNvbXBvbmVudF90eXBlX21hcHBpbmdfdGFibGUgPSB7CisgICAgICAgICdBVURJT19TVFJFQU0nIDogIlZvbHVtZVByb2ZpbGVUeXBlIiwKKyAgICAgICAgJ0FVRElPX0RFVklDRV9PVVQnIDogIk91dHB1dERldmljZXNNYXNrIiwKKyAgICAgICAgJ0FVRElPX0RFVklDRV9JTicgOiAiSW5wdXREZXZpY2VzTWFzayJ9CisKKyAgICBhbGxfY29tcG9uZW50X3R5cGVzID0geworICAgICAgICAnVm9sdW1lUHJvZmlsZVR5cGUnIDoge30sCisgICAgICAgICdPdXRwdXREZXZpY2VzTWFzaycgOiB7fSwKKyAgICAgICAgJ0lucHV0RGV2aWNlc01hc2snIDoge30KKyAgICB9CisKKyAgICAjCisgICAgIyBfQ05ULCBfTUFYLCBfQUxMIGFuZCBfTk9ORSBhcmUgcHJvaGliaXRlZCB2YWx1ZXMgYXMgdGhlciBhcmUganVzdCBoZWxwZXJzIGZvciBlbnVtIHVzZXJzLgorICAgICMKKyAgICBpZ25vcmVkX3ZhbHVlcyA9IFsnQ05UJywgJ01BWCcsICdBTEwnLCAnTk9ORSddCisKKyAgICBjcml0ZXJpYV9wYXR0ZXJuID0gcmUuY29tcGlsZSgKKyAgICAgICAgciJccyooP1A8dHlwZT4oPzoiKyd8Jy5qb2luKGNvbXBvbmVudF90eXBlX21hcHBpbmdfdGFibGUua2V5cygpKSArICIpKV8iIFwKKyAgICAgICAgciIoP1A8bGl0ZXJhbD4oPyEiICsgJ3wnLmpvaW4oaWdub3JlZF92YWx1ZXMpICsgIilcdyopXHMqPVxzKiIgXAorICAgICAgICByIig/UDx2YWx1ZXM+KD86MFt4WF0pP1swLTlhLWZBLUZdKykiKQorCisgICAgbG9nZ2luZy5pbmZvKCJDaGVja2luZyBBbmRyb2lkIEhlYWRlciBmaWxlIHt9Ii5mb3JtYXQoYW5kcm9pZGF1ZGlvYmFzZWhlYWRlckZpbGUpKQorCisgICAgZm9yIGxpbmVfbnVtYmVyLCBsaW5lIGluIGVudW1lcmF0ZShhbmRyb2lkYXVkaW9iYXNlaGVhZGVyRmlsZSk6CisgICAgICAgIG1hdGNoID0gY3JpdGVyaWFfcGF0dGVybi5tYXRjaChsaW5lKQorICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgIGxvZ2dpbmcuZGVidWcoIlRoZSBmb2xsb3dpbmcgbGluZSBpcyBWQUxJRDoge306e31cbnt9Ii5mb3JtYXQoCisgICAgICAgICAgICAgICAgYW5kcm9pZGF1ZGlvYmFzZWhlYWRlckZpbGUubmFtZSwgbGluZV9udW1iZXIsIGxpbmUpKQorCisgICAgICAgICAgICBjb21wb25lbnRfdHlwZV9uYW1lID0gY29tcG9uZW50X3R5cGVfbWFwcGluZ190YWJsZVttYXRjaC5ncm91cGRpY3QoKVsndHlwZSddXQorICAgICAgICAgICAgY29tcG9uZW50X3R5cGVfbGl0ZXJhbCA9IG1hdGNoLmdyb3VwZGljdCgpWydsaXRlcmFsJ10ubG93ZXIoKQorCisgICAgICAgICAgICBjb21wb25lbnRfdHlwZV9udW1lcmljYWxfdmFsdWUgPSBtYXRjaC5ncm91cGRpY3QoKVsndmFsdWVzJ10KKworICAgICAgICAgICAgIyBmb3IgQVVESU9fREVWSUNFX0lOOiBuZWVkIHRvIHJlbW92ZSBzaWduIGJpdCAvIHJlbmFtZSBkZWZhdWx0IHRvIHN0dWIKKyAgICAgICAgICAgIGlmIGNvbXBvbmVudF90eXBlX25hbWUgPT0gIklucHV0RGV2aWNlc01hc2siOgorICAgICAgICAgICAgICAgIGNvbXBvbmVudF90eXBlX251bWVyaWNhbF92YWx1ZSA9IHN0cihpbnQoY29tcG9uZW50X3R5cGVfbnVtZXJpY2FsX3ZhbHVlLCAwKSAmIH4yMTQ3NDgzNjQ4KQorICAgICAgICAgICAgICAgIGlmIGNvbXBvbmVudF90eXBlX2xpdGVyYWwgPT0gImRlZmF1bHQiOgorICAgICAgICAgICAgICAgICAgICBjb21wb25lbnRfdHlwZV9saXRlcmFsID0gInN0dWIiCisKKyAgICAgICAgICAgIGlmIGNvbXBvbmVudF90eXBlX25hbWUgPT0gIk91dHB1dERldmljZXNNYXNrIjoKKyAgICAgICAgICAgICAgICBpZiBjb21wb25lbnRfdHlwZV9saXRlcmFsID09ICJkZWZhdWx0IjoKKyAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50X3R5cGVfbGl0ZXJhbCA9ICJzdHViIgorCisgICAgICAgICAgICAjIFJlbW92ZSBkdXBsaWNhdGVkIG51bWVyaWNhbCB2YWx1ZXMKKyAgICAgICAgICAgIGlmIGludChjb21wb25lbnRfdHlwZV9udW1lcmljYWxfdmFsdWUsIDApIGluIGFsbF9jb21wb25lbnRfdHlwZXNbY29tcG9uZW50X3R5cGVfbmFtZV0udmFsdWVzKCk6CisgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJUaGUgdmFsdWUge306e30gaXMgZHVwbGljYXRlZCBmb3IgY3JpdGVyaW9uIHt9LCBLRUVQSU5HIExBVEVTVCIuZm9ybWF0KGNvbXBvbmVudF90eXBlX251bWVyaWNhbF92YWx1ZSwgY29tcG9uZW50X3R5cGVfbGl0ZXJhbCwgY29tcG9uZW50X3R5cGVfbmFtZSkpCisgICAgICAgICAgICAgICAgZm9yIGtleSBpbiBsaXN0KGFsbF9jb21wb25lbnRfdHlwZXNbY29tcG9uZW50X3R5cGVfbmFtZV0pOgorICAgICAgICAgICAgICAgICAgICBpZiBhbGxfY29tcG9uZW50X3R5cGVzW2NvbXBvbmVudF90eXBlX25hbWVdW2tleV0gPT0gaW50KGNvbXBvbmVudF90eXBlX251bWVyaWNhbF92YWx1ZSwgMCk6CisgICAgICAgICAgICAgICAgICAgICAgICBkZWwgYWxsX2NvbXBvbmVudF90eXBlc1tjb21wb25lbnRfdHlwZV9uYW1lXVtrZXldCisKKyAgICAgICAgICAgIGFsbF9jb21wb25lbnRfdHlwZXNbY29tcG9uZW50X3R5cGVfbmFtZV1bY29tcG9uZW50X3R5cGVfbGl0ZXJhbF0gPSBpbnQoY29tcG9uZW50X3R5cGVfbnVtZXJpY2FsX3ZhbHVlLCAwKQorCisgICAgICAgICAgICBsb2dnaW5nLmRlYnVnKCJ0eXBlOnt9LCBsaXRlcmFsOnt9LCB2YWx1ZXM6e30uIi5mb3JtYXQoY29tcG9uZW50X3R5cGVfbmFtZSwgY29tcG9uZW50X3R5cGVfbGl0ZXJhbCwgY29tcG9uZW50X3R5cGVfbnVtZXJpY2FsX3ZhbHVlKSkKKworICAgICMgVHJhbnNmb3JtIGlucHV0IHNvdXJjZSBpbiBpbmNsdXNpdmUgY3JpdGVyaW9uCisgICAgc2hpZnQgPSBsZW4oYWxsX2NvbXBvbmVudF90eXBlc1snT3V0cHV0RGV2aWNlc01hc2snXSkKKyAgICBpZiBzaGlmdCA+IDMyOgorICAgICAgICBsb2dnaW5nLmNyaXRpY2FsKCJPdXRwdXREZXZpY2VzTWFzayBpbmNvbXBhdGlibGUgd2l0aCBjcml0ZXJpb24gcmVwcmVzZW50YXRpb24gb24gMzIgYml0cyIpCisgICAgICAgIGxvZ2dpbmcuaW5mbygiRVhJVCBPTiBGQUlMVVJFIikKKyAgICAgICAgZXhpdCgxKQorCisgICAgZm9yIGNvbXBvbmVudF90eXBlcyBpbiBhbGxfY29tcG9uZW50X3R5cGVzOgorICAgICAgICB2YWx1ZXMgPSAnLCcuam9pbigne306e30nLmZvcm1hdCh2YWx1ZSwga2V5KSBmb3Iga2V5LCB2YWx1ZSBpbiBhbGxfY29tcG9uZW50X3R5cGVzW2NvbXBvbmVudF90eXBlc10uaXRlbXMoKSkKKyAgICAgICAgbG9nZ2luZy5pbmZvKCJ7fTogPHt9PiIuZm9ybWF0KGNvbXBvbmVudF90eXBlcywgdmFsdWVzKSkKKworICAgIHJldHVybiBhbGxfY29tcG9uZW50X3R5cGVzCisKKworZGVmIG1haW4oKToKKyAgICBsb2dnaW5nLnJvb3Quc2V0TGV2ZWwobG9nZ2luZy5JTkZPKQorICAgIGFyZ3MgPSBwYXJzZUFyZ3MoKQorICAgIHJvdXRlX2NyaXRlcmlhID0gMAorCisgICAgYWxsX2NvbXBvbmVudF90eXBlcyA9IHBhcnNlQW5kcm9pZEF1ZGlvRmlsZShhcmdzLmFuZHJvaWRhdWRpb2Jhc2VoZWFkZXIpCisKKyAgICBnZW5lcmF0ZVhtbFN0cnVjdHVyZUZpbGUoYWxsX2NvbXBvbmVudF90eXBlcywgYXJncy5jb21tb250eXBlc3N0cnVjdHVyZSwgYXJncy5vdXRwdXRmaWxlKQorCisjIElmIHRoaXMgZmlsZSBpcyBkaXJlY3RseSBleGVjdXRlZAoraWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBzeXMuZXhpdChtYWluKCkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRQb2xpY3lDcml0ZXJpb25UeXBlcy5weSBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZFBvbGljeUNyaXRlcmlvblR5cGVzLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmI4YjYwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvYnVpbGRQb2xpY3lDcml0ZXJpb25UeXBlcy5weQpAQCAtMCwwICsxLDI1MSBAQAorIyEvdXNyL2Jpbi9weXRob24zCisKKyMKKyMgQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgcmUKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCB4bWwuZXRyZWUuRWxlbWVudFRyZWUgYXMgRVQKK2ltcG9ydCB4bWwuZXRyZWUuRWxlbWVudEluY2x1ZGUgYXMgRUkKK2ltcG9ydCB4bWwuZG9tLm1pbmlkb20gYXMgTUlOSURPTQorZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgT3JkZXJlZERpY3QKKworIworIyBIZWxwZXIgc2NyaXB0IHRoYXQgaGVscHMgdG8gZmVlZCBhdCBidWlsZCB0aW1lIHRoZSBYTUwgY3JpdGVyaW9uIHR5cGVzIGZpbGUgdXNlZCBieQorIyB0aGUgZW5naW5lY29uZmlndXJhYmxlIHRvIHN0YXJ0IHRoZSBwYXJhbWV0ZXItZnJhbWV3b3JrLgorIyBJdCBwcmV2ZW50cyB0byBmaWxsIHRoZW0gbWFudWFsbHkgYW5kIGF2b2lkIGRpdmVyZ2VuY2VzIHdpdGggYW5kcm9pZC4KKyMKKyMgVGhlIERldmljZSBUeXBlcyBjcml0ZXJpb24gdHlwZXMgYXJlIGZlZCBmcm9tIGF1ZGlvLWJhc2UuaCBmaWxlIHdpdGggdGhlIG9wdGlvbgorIyAgICAgICAgICAgLS1hbmRyb2lkYXVkaW9iYXNlaGVhZGVyIDxwYXRoL3RvL2FuZHJvaWQvYXVkaW8vYmFzZS9maWxlL2F1ZGlvLWJhc2UuaD4KKyMKKyMgVGhlIERldmljZSBBZGRyZXNzZXMgY3JpdGVyaW9uIHR5cGVzIGFyZSBmZWQgZnJvbSB0aGUgYXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZQorIyBpbiBvcmRlciB0byBkaXNjb3ZlciBhbGwgdGhlIGRldmljZXMgZm9yIHdoaWNoIHRoZSBhZGRyZXNzIG1hdHRlci4KKyMgICAgICAgICAgIC0tYXVkaW9wb2xpY3ljb25maWd1cmF0aW9uZmlsZSA8cGF0aC90by9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWw+CisjCisjIFRoZSByZWZlcmVuY2UgZmlsZSBvZiBjcml0ZXJpb24gdHlwZXMgbXVzdCBhbHNvIGJlIHNldCBhcyBhbiBpbnB1dCBvZiB0aGUgc2NyaXB0OgorIyAgICAgICAgICAgLS1jcml0ZXJpb250eXBlcyA8cGF0aC90by9jcml0ZXJpb24vZmlsZS9hdWRpb19jcml0ZXJpb25fdHlwZXMueG1sLmluPgorIworIyBBdCBsYXN0LCB0aGUgb3V0cHV0IG9mIHRoZSBzY3JpcHQgc2hhbGwgYmUgc2V0IGFsc286CisjICAgICAgICAgICAtLW91dHB1dGZpbGUgPHBhdGgvdG8vb3V0L3ZlbmRvci9ldGMvYXVkaW9fY3JpdGVyaW9uX3R5cGVzLnhtbD4KKyMKKworZGVmIHBhcnNlQXJncygpOgorICAgIGFyZ3BhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKGRlc2NyaXB0aW9uPSJQYXJhbWV0ZXItRnJhbWV3b3JrIFhNTCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW8gY3JpdGVyaW9uIHR5cGUgZmlsZSBnZW5lcmF0b3IuXG5cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhpdCB3aXRoIHRoZSBudW1iZXIgb2YgKHJlY292ZXJhYmxlIG9yIG5vdCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yIHRoYXQgb2NjdXJlZC4iKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tYW5kcm9pZGF1ZGlvYmFzZWhlYWRlcicsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJBbmRyb2lkIEF1ZGlvIEJhc2UgQyBoZWFkZXIgZmlsZSwgTWFuZGF0b3J5LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhdmFyPSJBTkRST0lEX0FVRElPX0JBU0VfSEVBREVSIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3InKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1hdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkFuZHJvaWQgQXVkaW8gUG9saWN5IENvbmZpZ3VyYXRpb24gZmlsZSwgTWFuZGF0b3J5LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhdmFyPSIoQVVESU9fUE9MSUNZX0NPTkZJR1VSQVRJT05fRklMRSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWNyaXRlcmlvbnR5cGVzJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9IkNyaXRlcmlvbiB0eXBlcyBYTUwgYmFzZSBmaWxlLCBpbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGNyaXRlcmlvbl90eXBlcz4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSIiIHR5cGU9PGluY2x1c2l2ZXxleGNsdXNpdmU+IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9PHZhbHVlMSx2YWx1ZTIsLi4uPi8+JyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQuIE1hbmRhdG9yeS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YXZhcj0iQ1JJVEVSSU9OX1RZUEVfRklMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tb3V0cHV0ZmlsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJDcml0ZXJpb24gdHlwZXMgb3V0cHV0ZmlsZSBmaWxlLiBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGF2YXI9IkNSSVRFUklPTl9UWVBFX09VVFBVVF9GSUxFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3cnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJib3NlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisKKyAgICByZXR1cm4gYXJncGFyc2VyLnBhcnNlX2FyZ3MoKQorCisKK2RlZiBnZW5lcmF0ZVhtbENyaXRlcmlvblR5cGVzRmlsZShjcml0ZXJpb25UeXBlcywgYWRkcmVzc0NyaXRlcmlhLCBjcml0ZXJpb25UeXBlc0ZpbGUsIG91dHB1dEZpbGUpOgorCisgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgY3JpdGVyaW9uVHlwZXNGaWxlIHt9Ii5mb3JtYXQoY3JpdGVyaW9uVHlwZXNGaWxlKSkKKyAgICBjcml0ZXJpb25fdHlwZXNfaW5fdHJlZSA9IEVULnBhcnNlKGNyaXRlcmlvblR5cGVzRmlsZSkKKworICAgIGNyaXRlcmlvbl90eXBlc19yb290ID0gY3JpdGVyaW9uX3R5cGVzX2luX3RyZWUuZ2V0cm9vdCgpCisKKyAgICBmb3IgY3JpdGVyaW9uX25hbWUsIHZhbHVlc19kaWN0IGluIGNyaXRlcmlvblR5cGVzLml0ZW1zKCk6CisgICAgICAgIGZvciBjcml0ZXJpb25fdHlwZSBpbiBjcml0ZXJpb25fdHlwZXNfcm9vdC5maW5kYWxsKCdjcml0ZXJpb25fdHlwZScpOgorICAgICAgICAgICAgaWYgY3JpdGVyaW9uX3R5cGUuZ2V0KCduYW1lJykgPT0gY3JpdGVyaW9uX25hbWU6CisgICAgICAgICAgICAgICAgdmFsdWVzX25vZGUgPSBFVC5TdWJFbGVtZW50KGNyaXRlcmlvbl90eXBlLCAidmFsdWVzIikKKyAgICAgICAgICAgICAgICBvcmRlcmVkX3ZhbHVlcyA9IE9yZGVyZWREaWN0KHNvcnRlZCh2YWx1ZXNfZGljdC5pdGVtcygpLCBrZXk9bGFtYmRhIHg6IHhbMV0pKQorICAgICAgICAgICAgICAgIGZvciBrZXksIHZhbHVlIGluIG9yZGVyZWRfdmFsdWVzLml0ZW1zKCk6CisgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUgPSBFVC5TdWJFbGVtZW50KHZhbHVlc19ub2RlLCAidmFsdWUiKQorICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlLnNldCgnbnVtZXJpY2FsJywgc3RyKHZhbHVlKSkKKyAgICAgICAgICAgICAgICAgICAgdmFsdWVfbm9kZS5zZXQoJ2xpdGVyYWwnLCBrZXkpCisKKyAgICBpZiBhZGRyZXNzQ3JpdGVyaWE6CisgICAgICAgIGZvciBjcml0ZXJpb25fbmFtZSwgdmFsdWVzX2xpc3QgaW4gYWRkcmVzc0NyaXRlcmlhLml0ZW1zKCk6CisgICAgICAgICAgICBmb3IgY3JpdGVyaW9uX3R5cGUgaW4gY3JpdGVyaW9uX3R5cGVzX3Jvb3QuZmluZGFsbCgnY3JpdGVyaW9uX3R5cGUnKToKKyAgICAgICAgICAgICAgICBpZiBjcml0ZXJpb25fdHlwZS5nZXQoJ25hbWUnKSA9PSBjcml0ZXJpb25fbmFtZToKKyAgICAgICAgICAgICAgICAgICAgaW5kZXggPSAwCisgICAgICAgICAgICAgICAgICAgIGV4aXN0aW5nX3ZhbHVlc19ub2RlID0gY3JpdGVyaW9uX3R5cGUuZmluZCgidmFsdWVzIikKKyAgICAgICAgICAgICAgICAgICAgaWYgZXhpc3RpbmdfdmFsdWVzX25vZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgZXhpc3RpbmdfdmFsdWUgaW4gZXhpc3RpbmdfdmFsdWVzX25vZGUuZmluZGFsbCgndmFsdWUnKToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBleGlzdGluZ192YWx1ZS5nZXQoJ251bWVyaWNhbCcpID09IHN0cigxIDw8IGluZGV4KToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXggKz0gMQorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX25vZGUgPSBleGlzdGluZ192YWx1ZXNfbm9kZQorICAgICAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzX25vZGUgPSBFVC5TdWJFbGVtZW50KGNyaXRlcmlvbl90eXBlLCAidmFsdWVzIikKKworICAgICAgICAgICAgICAgICAgICBmb3IgdmFsdWUgaW4gdmFsdWVzX2xpc3Q6CisgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV9ub2RlID0gRVQuU3ViRWxlbWVudCh2YWx1ZXNfbm9kZSwgInZhbHVlIiwgbGl0ZXJhbD12YWx1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX25vZGUuc2V0KCdudW1lcmljYWwnLCBzdHIoMSA8PCBpbmRleCkpCisgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxCisKKyAgICB4bWxzdHIgPSBFVC50b3N0cmluZyhjcml0ZXJpb25fdHlwZXNfcm9vdCwgZW5jb2Rpbmc9J3V0ZjgnLCBtZXRob2Q9J3htbCcpCisgICAgcmVwYXJzZWQgPSBNSU5JRE9NLnBhcnNlU3RyaW5nKHhtbHN0cikKKyAgICBwcmV0dHlYbWxTdHIgPSByZXBhcnNlZC50b3ByZXR0eXhtbChuZXdsPSdcclxuJykKKyAgICBwcmV0dHlYbWxTdHIgPSBvcy5saW5lc2VwLmpvaW4oW3MgZm9yIHMgaW4gcHJldHR5WG1sU3RyLnNwbGl0bGluZXMoKSBpZiBzLnN0cmlwKCldKQorICAgIG91dHB1dEZpbGUud3JpdGUocHJldHR5WG1sU3RyKQorCitkZWYgY2FwaXRhbGl6ZUxpbmUobGluZSk6CisgICAgcmV0dXJuICcgJy5qb2luKCh3LmNhcGl0YWxpemUoKSBmb3IgdyBpbiBsaW5lLnNwbGl0KCcgJykpKQorCisKKyMKKyMgUGFyc2UgdGhlIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUgYW5kIG91dHB1dCBhIGRpY3Rpb25hcnkgb2YgZGV2aWNlIGNyaXRlcmlhIGFkZHJlc3NlcworIworZGVmIHBhcnNlQW5kcm9pZEF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbkZpbGUoYXVkaW9wb2xpY3ljb25maWd1cmF0aW9uZmlsZSk6CisKKyAgICBsb2dnaW5nLmluZm8oIkNoZWNraW5nIEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUge30iLmZvcm1hdChhdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlKSkKKyAgICAjCisgICAgIyBleHRyYWN0IGFsbCBkZXZpY2VzIGFkZHJlc3NlcyBmcm9tIGF1ZGlvIHBvbGljeSBjb25maWd1cmF0aW9uIGZpbGUKKyAgICAjCisgICAgYWRkcmVzc19jcml0ZXJpYV9tYXBwaW5nX3RhYmxlID0geworICAgICAgICAnc2luaycgOiAiT3V0cHV0RGV2aWNlc0FkZHJlc3Nlc1R5cGUiLAorICAgICAgICAnc291cmNlJyA6ICJJbnB1dERldmljZXNBZGRyZXNzZXNUeXBlIn0KKworICAgIGFkZHJlc3NfY3JpdGVyaWEgPSB7CisgICAgICAgICdPdXRwdXREZXZpY2VzQWRkcmVzc2VzVHlwZScgOiBbXSwKKyAgICAgICAgJ0lucHV0RGV2aWNlc0FkZHJlc3Nlc1R5cGUnIDogW119CisKKyAgICBvbGRfd29ya2luZ19kaXIgPSBvcy5nZXRjd2QoKQorICAgIHByaW50KCJDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ICVzIiAlIG9sZF93b3JraW5nX2RpcikKKworICAgIG5ld19kaXIgPSBvcy5wYXRoLmpvaW4ob2xkX3dvcmtpbmdfZGlyLCBhdWRpb3BvbGljeWNvbmZpZ3VyYXRpb25maWxlLm5hbWUpCisKKyAgICBwb2xpY3lfaW5fdHJlZSA9IEVULnBhcnNlKGF1ZGlvcG9saWN5Y29uZmlndXJhdGlvbmZpbGUpCisgICAgb3MuY2hkaXIob3MucGF0aC5kaXJuYW1lKG9zLnBhdGgubm9ybXBhdGgobmV3X2RpcikpKQorCisgICAgcHJpbnQoIm5ldyB3b3JraW5nIGRpcmVjdG9yeSAlcyIgJSBvcy5nZXRjd2QoKSkKKworICAgIHBvbGljeV9yb290ID0gcG9saWN5X2luX3RyZWUuZ2V0cm9vdCgpCisgICAgRUkuaW5jbHVkZShwb2xpY3lfcm9vdCkKKworICAgIG9zLmNoZGlyKG9sZF93b3JraW5nX2RpcikKKworICAgIGZvciBkZXZpY2UgaW4gcG9saWN5X3Jvb3QuaXRlcignZGV2aWNlUG9ydCcpOgorICAgICAgICBmb3Iga2V5IGluIGFkZHJlc3NfY3JpdGVyaWFfbWFwcGluZ190YWJsZS5rZXlzKCk6CisgICAgICAgICAgICBpZiBkZXZpY2UuZ2V0KCdyb2xlJykgPT0ga2V5IGFuZCBkZXZpY2UuZ2V0KCdhZGRyZXNzJyk6CisgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJ7fTogPHt9PiIuZm9ybWF0KGtleSwgZGV2aWNlLmdldCgnYWRkcmVzcycpKSkKKyAgICAgICAgICAgICAgICBhZGRyZXNzX2NyaXRlcmlhW2FkZHJlc3NfY3JpdGVyaWFfbWFwcGluZ190YWJsZVtrZXldXS5hcHBlbmQoZGV2aWNlLmdldCgnYWRkcmVzcycpKQorCisgICAgZm9yIGNyaXRlcmlhIGluIGFkZHJlc3NfY3JpdGVyaWE6CisgICAgICAgIHZhbHVlcyA9ICcsJy5qb2luKGFkZHJlc3NfY3JpdGVyaWFbY3JpdGVyaWFdKQorICAgICAgICBsb2dnaW5nLmluZm8oInt9OiA8e30+Ii5mb3JtYXQoY3JpdGVyaWEsIHZhbHVlcykpCisKKyAgICByZXR1cm4gYWRkcmVzc19jcml0ZXJpYQorCisjCisjIFBhcnNlIHRoZSBhdWRpby1iYXNlLmggZmlsZSBhbmQgb3V0cHV0IGEgZGljdGlvbmFyeSBvZiBhbmRyb2lkIGRlcGVuZGVudCBjcml0ZXJpb24gdHlwZXM6CisjICAgLUFuZHJvaWQgTW9kZQorIyAgIC1PdXRwdXQgZGV2aWNlcyB0eXBlCisjICAgLUlucHV0IGRldmljZXMgdHlwZQorIworZGVmIHBhcnNlQW5kcm9pZEF1ZGlvRmlsZShhbmRyb2lkYXVkaW9iYXNlaGVhZGVyRmlsZSk6CisgICAgIworICAgICMgQWRhcHRhdGlvbiB0YWJsZSBiZXR3ZWVuIEFuZHJvaWQgRW51bWVyYXRpb24gcHJlZml4IGFuZCBBdWRpbyBQRlcgQ3JpdGVyaW9uIHR5cGUgbmFtZXMKKyAgICAjCisgICAgY3JpdGVyaW9uX21hcHBpbmdfdGFibGUgPSB7CisgICAgICAgICdBVURJT19NT0RFJyA6ICJBbmRyb2lkTW9kZVR5cGUiLAorICAgICAgICAnQVVESU9fREVWSUNFX09VVCcgOiAiT3V0cHV0RGV2aWNlc01hc2tUeXBlIiwKKyAgICAgICAgJ0FVRElPX0RFVklDRV9JTicgOiAiSW5wdXREZXZpY2VzTWFza1R5cGUifQorCisgICAgYWxsX2NyaXRlcmlhID0geworICAgICAgICAnQW5kcm9pZE1vZGVUeXBlJyA6IHt9LAorICAgICAgICAnT3V0cHV0RGV2aWNlc01hc2tUeXBlJyA6IHt9LAorICAgICAgICAnSW5wdXREZXZpY2VzTWFza1R5cGUnIDoge319CisKKyAgICAjCisgICAgIyBfQ05ULCBfTUFYLCBfQUxMIGFuZCBfTk9ORSBhcmUgcHJvaGliaXRlZCB2YWx1ZXMgYXMgdGhlciBhcmUganVzdCBoZWxwZXJzIGZvciBlbnVtIHVzZXJzLgorICAgICMKKyAgICBpZ25vcmVkX3ZhbHVlcyA9IFsnQ05UJywgJ01BWCcsICdBTEwnLCAnTk9ORSddCisKKyAgICBjcml0ZXJpYV9wYXR0ZXJuID0gcmUuY29tcGlsZSgKKyAgICAgICAgciJccyooP1A8dHlwZT4oPzoiKyd8Jy5qb2luKGNyaXRlcmlvbl9tYXBwaW5nX3RhYmxlLmtleXMoKSkgKyAiKSlfIiBcCisgICAgICAgIHIiKD9QPGxpdGVyYWw+KD8hIiArICd8Jy5qb2luKGlnbm9yZWRfdmFsdWVzKSArICIpXHcqKVxzKj1ccyoiIFwKKyAgICAgICAgciIoP1A8dmFsdWVzPig/OjBbeFhdKT9bMC05YS1mQS1GXSspIikKKworICAgIGxvZ2dpbmcuaW5mbygiQ2hlY2tpbmcgQW5kcm9pZCBIZWFkZXIgZmlsZSB7fSIuZm9ybWF0KGFuZHJvaWRhdWRpb2Jhc2VoZWFkZXJGaWxlKSkKKworICAgIGZvciBsaW5lX251bWJlciwgbGluZSBpbiBlbnVtZXJhdGUoYW5kcm9pZGF1ZGlvYmFzZWhlYWRlckZpbGUpOgorICAgICAgICBtYXRjaCA9IGNyaXRlcmlhX3BhdHRlcm4ubWF0Y2gobGluZSkKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICBsb2dnaW5nLmRlYnVnKCJUaGUgZm9sbG93aW5nIGxpbmUgaXMgVkFMSUQ6IHt9Ont9XG57fSIuZm9ybWF0KAorICAgICAgICAgICAgICAgIGFuZHJvaWRhdWRpb2Jhc2VoZWFkZXJGaWxlLm5hbWUsIGxpbmVfbnVtYmVyLCBsaW5lKSkKKworICAgICAgICAgICAgY3JpdGVyaW9uX25hbWUgPSBjcml0ZXJpb25fbWFwcGluZ190YWJsZVttYXRjaC5ncm91cGRpY3QoKVsndHlwZSddXQorICAgICAgICAgICAgbGl0ZXJhbCA9ICcnLmpvaW4oKHcuY2FwaXRhbGl6ZSgpIGZvciB3IGluIG1hdGNoLmdyb3VwZGljdCgpWydsaXRlcmFsJ10uc3BsaXQoJ18nKSkpCisgICAgICAgICAgICBudW1lcmljYWxfdmFsdWUgPSBtYXRjaC5ncm91cGRpY3QoKVsndmFsdWVzJ10KKworICAgICAgICAgICAgIyBmb3IgQVVESU9fREVWSUNFX0lOOiBuZWVkIHRvIHJlbW92ZSBzaWduIGJpdAorICAgICAgICAgICAgaWYgY3JpdGVyaW9uX25hbWUgPT0gIklucHV0RGV2aWNlc01hc2tUeXBlIjoKKyAgICAgICAgICAgICAgICBudW1lcmljYWxfdmFsdWUgPSBzdHIoaW50KG51bWVyaWNhbF92YWx1ZSwgMCkgJiB+MjE0NzQ4MzY0OCkKKworICAgICAgICAgICAgIyBSZW1vdmUgZHVwbGljYXRlZCBudW1lcmljYWwgdmFsdWVzCisgICAgICAgICAgICBpZiBpbnQobnVtZXJpY2FsX3ZhbHVlLCAwKSBpbiBhbGxfY3JpdGVyaWFbY3JpdGVyaW9uX25hbWVdLnZhbHVlcygpOgorICAgICAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiY3JpdGVyaW9uIHt9IGR1cGxpY2F0ZWQgdmFsdWVzOiIuZm9ybWF0KGNyaXRlcmlvbl9uYW1lKSkKKyAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oInt9Ont9Ii5mb3JtYXQobnVtZXJpY2FsX3ZhbHVlLCBsaXRlcmFsKSkKKyAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIktFRVBJTkcgTEFURVNUIikKKyAgICAgICAgICAgICAgICBmb3Iga2V5IGluIGxpc3QoYWxsX2NyaXRlcmlhW2NyaXRlcmlvbl9uYW1lXSk6CisgICAgICAgICAgICAgICAgICAgIGlmIGFsbF9jcml0ZXJpYVtjcml0ZXJpb25fbmFtZV1ba2V5XSA9PSBpbnQobnVtZXJpY2FsX3ZhbHVlLCAwKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbCBhbGxfY3JpdGVyaWFbY3JpdGVyaW9uX25hbWVdW2tleV0KKworICAgICAgICAgICAgYWxsX2NyaXRlcmlhW2NyaXRlcmlvbl9uYW1lXVtsaXRlcmFsXSA9IGludChudW1lcmljYWxfdmFsdWUsIDApCisKKyAgICAgICAgICAgIGxvZ2dpbmcuZGVidWcoInR5cGU6e30sIi5mb3JtYXQoY3JpdGVyaW9uX25hbWUpKQorICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygiaXRlcmFsOnt9LCIuZm9ybWF0KGxpdGVyYWwpKQorICAgICAgICAgICAgbG9nZ2luZy5kZWJ1ZygidmFsdWVzOnt9LiIuZm9ybWF0KG51bWVyaWNhbF92YWx1ZSkpCisKKyAgICByZXR1cm4gYWxsX2NyaXRlcmlhCisKKworZGVmIG1haW4oKToKKyAgICBsb2dnaW5nLnJvb3Quc2V0TGV2ZWwobG9nZ2luZy5JTkZPKQorICAgIGFyZ3MgPSBwYXJzZUFyZ3MoKQorCisgICAgYWxsX2NyaXRlcmlhID0gcGFyc2VBbmRyb2lkQXVkaW9GaWxlKGFyZ3MuYW5kcm9pZGF1ZGlvYmFzZWhlYWRlcikKKworICAgIGFkZHJlc3NfY3JpdGVyaWEgPSBwYXJzZUFuZHJvaWRBdWRpb1BvbGljeUNvbmZpZ3VyYXRpb25GaWxlKGFyZ3MuYXVkaW9wb2xpY3ljb25maWd1cmF0aW9uZmlsZSkKKworICAgIGNyaXRlcmlvbl90eXBlcyA9IGFyZ3MuY3JpdGVyaW9udHlwZXMKKworICAgIGdlbmVyYXRlWG1sQ3JpdGVyaW9uVHlwZXNGaWxlKGFsbF9jcml0ZXJpYSwgYWRkcmVzc19jcml0ZXJpYSwgY3JpdGVyaW9uX3R5cGVzLCBhcmdzLm91dHB1dGZpbGUpCisKKyMgSWYgdGhpcyBmaWxlIGlzIGRpcmVjdGx5IGV4ZWN1dGVkCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICAgIHN5cy5leGl0KG1haW4oKSkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZFN0cmF0ZWdpZXNTdHJ1Y3R1cmVGaWxlLnB5IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2J1aWxkU3RyYXRlZ2llc1N0cnVjdHVyZUZpbGUucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uZjY5ZDM0NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS90b29scy9idWlsZFN0cmF0ZWdpZXNTdHJ1Y3R1cmVGaWxlLnB5CkBAIC0wLDAgKzEsMTQwIEBACisjIS91c3IvYmluL3B5dGhvbjMKKworIworIyBDb3B5cmlnaHQgMjAxOSwgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIworCitpbXBvcnQgYXJncGFyc2UKK2ltcG9ydCBzeXMKK2ltcG9ydCBvcworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCB4bWwuZXRyZWUuRWxlbWVudFRyZWUgYXMgRVQKK2ltcG9ydCB4bWwuZXRyZWUuRWxlbWVudEluY2x1ZGUgYXMgRUkKK2ltcG9ydCB4bWwuZG9tLm1pbmlkb20gYXMgTUlOSURPTQorCisjCisjIEhlbHBlciBzY3JpcHQgdGhhdCBoZWxwcyB0byBmZWVkIGF0IGJ1aWxkIHRpbWUgdGhlIFhNTCBQcm9kdWN0IFN0cmF0ZWdpZXMgU3RydWN0dXJlIGZpbGUgZmlsZSB1c2VkCisjIGJ5IHRoZSBlbmdpbmVjb25maWd1cmFibGUgdG8gc3RhcnQgdGhlIHBhcmFtZXRlci1mcmFtZXdvcmsuCisjIEl0IHByZXZlbnRzIHRvIGZpbGwgdGhlbSBtYW51YWxseSBhbmQgYXZvaWQgZGl2ZXJnZW5jZXMgd2l0aCBhbmRyb2lkLgorIworIyBUaGUgUHJvZHVjdCBTdHJhdGVnaWVzIFN0cnVjdHVyZSBmaWxlIGlzIGZlZCBmcm9tIHRoZSBhdWRpbyBwb2xpY3kgZW5naW5lIGNvbmZpZ3VyYXRpb24gZmlsZQorIyBpbiBvcmRlciB0byBkaXNjb3ZlciBhbGwgdGhlIHN0cmF0ZWdpZXMgYXZhaWxhYmxlIGZvciB0aGUgY3VycmVudCBwbGF0Zm9ybS4KKyMgICAgICAgICAgIC0tYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmF0aW9uZmlsZSA8cGF0aC90by9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sPgorIworIyBUaGUgcmVmZXJlbmNlIGZpbGUgb2YgUHJvZHVjdFN0cmF0ZWdpZXMgc3RydWN0dXJlIG11c3QgYWxzbyBiZSBzZXQgYXMgYW4gaW5wdXQgb2YgdGhlIHNjcmlwdDoKKyMgICAgICAgICAgIC0tcHJvZHVjdHN0cmF0ZWdpZXNzdHJ1Y3R1cmVmaWxlIDxwYXRoL3RvL3N0cnVjdHVyZS9maWxlL1Byb2R1Y3RTdHJhdGVnaWVzLnhtbC5pbj4KKyMKKyMgQXQgbGFzdCwgdGhlIG91dHB1dCBvZiB0aGUgc2NyaXB0IHNoYWxsIGJlIHNldCBhbHNvOgorIyAgICAgICAgICAgLS1vdXRwdXRmaWxlIDxwYXRoL3RvL291dC88c3lzdGVtfHZlbmRvcnxvZG0+L2V0Yy9Qcm9kdWN0U3RyYXRlZ2llcy54bWw+CisjCisKK2RlZiBwYXJzZUFyZ3MoKToKKyAgICBhcmdwYXJzZXIgPSBhcmdwYXJzZS5Bcmd1bWVudFBhcnNlcihkZXNjcmlwdGlvbj0iUGFyYW1ldGVyLUZyYW1ld29yayBYTUwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Qgc3RyYXRlZ2llcyBzdHJ1Y3R1cmUgZmlsZSBnZW5lcmF0b3IuXG5cCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhpdCB3aXRoIHRoZSBudW1iZXIgb2YgKHJlY292ZXJhYmxlIG9yIG5vdCkgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yIHRoYXQgb2NjdXJlZC4iKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmF0aW9uZmlsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJBbmRyb2lkIEF1ZGlvIFBvbGljeSBFbmdpbmUgQ29uZmlndXJhdGlvbiBmaWxlLCBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGF2YXI9IihBVURJT19QT0xJQ1lfRU5HSU5FX0NPTkZJR1VSQVRJT05fRklMRSkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1hcmdwYXJzZS5GaWxlVHlwZSgncicpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWlyZWQ9VHJ1ZSkKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLXByb2R1Y3RzdHJhdGVnaWVzc3RydWN0dXJlZmlsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJQcm9kdWN0IFN0cmF0ZWdpZXMgU3RydWN0dXJlIFhNTCBiYXNlIGZpbGUsIE1hbmRhdG9yeS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YXZhcj0iU1RSQVRFR0lFU19TVFJVQ1RVUkVfRklMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tb3V0cHV0ZmlsZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJQcm9kdWN0IFN0cmF0ZWdpZXMgU3RydWN0dXJlIG91dHB1dCBmaWxlLCBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGF2YXI9IlNUUkFURUdJRVNfU1RSVUNUVVJFX09VVFBVVF9GSUxFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3cnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS12ZXJib3NlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScpCisKKyAgICByZXR1cm4gYXJncGFyc2VyLnBhcnNlX2FyZ3MoKQorCisKK2RlZiBnZW5lcmF0ZVhtbFN0cnVjdHVyZUZpbGUoc3RyYXRlZ2llcywgc3RyYXRlZ3lfc3RydWN0dXJlX2luX2ZpbGUsIG91dHB1dF9maWxlKToKKworICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIHN0cmF0ZWd5X3N0cnVjdHVyZV9pbl9maWxlIHt9Ii5mb3JtYXQoc3RyYXRlZ3lfc3RydWN0dXJlX2luX2ZpbGUpKQorICAgIHN0cmF0ZWdpZXNfaW5fdHJlZSA9IEVULnBhcnNlKHN0cmF0ZWd5X3N0cnVjdHVyZV9pbl9maWxlKQorCisgICAgc3RyYXRlZ2llc19yb290ID0gc3RyYXRlZ2llc19pbl90cmVlLmdldHJvb3QoKQorICAgIHN0cmF0ZWd5X2NvbXBvbmVudHMgPSBzdHJhdGVnaWVzX3Jvb3QuZmluZCgnQ29tcG9uZW50VHlwZScpCisKKyAgICBmb3Igc3RyYXRlZ3lfbmFtZSBpbiBzdHJhdGVnaWVzOgorICAgICAgICBjb250ZXh0X21hcHBpbmcgPSAiIi5qb2luKG1hcChzdHIsIFsiTmFtZToiLCBzdHJhdGVneV9uYW1lXSkpCisgICAgICAgIHN0cmF0ZWd5X3Bmd19uYW1lID0gc3RyYXRlZ3lfbmFtZS5yZXBsYWNlKCdTVFJBVEVHWV8nLCAnJykubG93ZXIoKQorICAgICAgICBFVC5TdWJFbGVtZW50KHN0cmF0ZWd5X2NvbXBvbmVudHMsICJDb21wb25lbnQiLAorICAgICAgICAgICAgICAgICAgICAgIE5hbWU9c3RyYXRlZ3lfcGZ3X25hbWUsIFR5cGU9IlByb2R1Y3RTdHJhdGVneSIsCisgICAgICAgICAgICAgICAgICAgICAgTWFwcGluZz1jb250ZXh0X21hcHBpbmcpCisKKyAgICB4bWxzdHIgPSBFVC50b3N0cmluZyhzdHJhdGVnaWVzX3Jvb3QsIGVuY29kaW5nPSd1dGY4JywgbWV0aG9kPSd4bWwnKQorICAgIHJlcGFyc2VkID0gTUlOSURPTS5wYXJzZVN0cmluZyh4bWxzdHIpCisgICAgcHJldHR5WG1sU3RyID0gcmVwYXJzZWQudG9wcmV0dHl4bWwobmV3bD0nXHJcbicpCisgICAgcHJldHR5WG1sU3RyID0gb3MubGluZXNlcC5qb2luKFtzIGZvciBzIGluIHByZXR0eVhtbFN0ci5zcGxpdGxpbmVzKCkgaWYgcy5zdHJpcCgpXSkKKyAgICBvdXRwdXRfZmlsZS53cml0ZShwcmV0dHlYbWxTdHIpCisKK2RlZiBjYXBpdGFsaXplTGluZShsaW5lKToKKyAgICByZXR1cm4gJyAnLmpvaW4oKHcuY2FwaXRhbGl6ZSgpIGZvciB3IGluIGxpbmUuc3BsaXQoJyAnKSkpCisKKworIworIyBQYXJzZSB0aGUgYXVkaW8gcG9saWN5IGNvbmZpZ3VyYXRpb24gZmlsZSBhbmQgb3V0cHV0IGEgZGljdGlvbmFyeSBvZiBkZXZpY2UgY3JpdGVyaWEgYWRkcmVzc2VzCisjCitkZWYgcGFyc2VBbmRyb2lkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWd1cmF0aW9uRmlsZShhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYXRpb25maWxlKToKKworICAgIGxvZ2dpbmcuaW5mbygiQ2hlY2tpbmcgQXVkaW8gUG9saWN5IEVuZ2luZSBDb25maWd1cmF0aW9uIGZpbGUge30iLmZvcm1hdCgKKyAgICAgICAgYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmF0aW9uZmlsZSkpCisgICAgIworICAgICMgZXh0cmFjdCBhbGwgcHJvZHVjdCBzdHJhdGVnaWVzIG5hbWUgZnJvbSBhdWRpbyBwb2xpY3kgZW5naW5lIGNvbmZpZ3VyYXRpb24gZmlsZQorICAgICMKKyAgICBzdHJhdGVneV9uYW1lcyA9IFtdCisKKyAgICBvbGRfd29ya2luZ19kaXIgPSBvcy5nZXRjd2QoKQorICAgIHByaW50KCJDdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ICVzIiAlIG9sZF93b3JraW5nX2RpcikKKworICAgIG5ld19kaXIgPSBvcy5wYXRoLmpvaW4ob2xkX3dvcmtpbmdfZGlyLCBhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYXRpb25maWxlLm5hbWUpCisKKyAgICBwb2xpY3lfZW5naW5lX2luX3RyZWUgPSBFVC5wYXJzZShhdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYXRpb25maWxlKQorICAgIG9zLmNoZGlyKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLm5vcm1wYXRoKG5ld19kaXIpKSkKKworICAgIHByaW50KCJuZXcgd29ya2luZyBkaXJlY3RvcnkgJXMiICUgb3MuZ2V0Y3dkKCkpCisKKyAgICBwb2xpY3lfZW5naW5lX3Jvb3QgPSBwb2xpY3lfZW5naW5lX2luX3RyZWUuZ2V0cm9vdCgpCisgICAgRUkuaW5jbHVkZShwb2xpY3lfZW5naW5lX3Jvb3QpCisKKyAgICBvcy5jaGRpcihvbGRfd29ya2luZ19kaXIpCisKKyAgICBmb3Igc3RyYXRlZ3kgaW4gcG9saWN5X2VuZ2luZV9yb290Lml0ZXIoJ1Byb2R1Y3RTdHJhdGVneScpOgorICAgICAgICBzdHJhdGVneV9uYW1lcy5hcHBlbmQoc3RyYXRlZ3kuZ2V0KCduYW1lJykpCisKKyAgICByZXR1cm4gc3RyYXRlZ3lfbmFtZXMKKworCitkZWYgbWFpbigpOgorICAgIGxvZ2dpbmcucm9vdC5zZXRMZXZlbChsb2dnaW5nLklORk8pCisgICAgYXJncyA9IHBhcnNlQXJncygpCisKKyAgICBzdHJhdGVnaWVzID0gcGFyc2VBbmRyb2lkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWd1cmF0aW9uRmlsZSgKKyAgICAgICAgYXJncy5hdWRpb3BvbGljeWVuZ2luZWNvbmZpZ3VyYXRpb25maWxlKQorCisgICAgcHJvZHVjdF9zdHJhdGVnaWVzX3N0cnVjdHVyZSA9IGFyZ3MucHJvZHVjdHN0cmF0ZWdpZXNzdHJ1Y3R1cmVmaWxlCisKKyAgICBnZW5lcmF0ZVhtbFN0cnVjdHVyZUZpbGUoc3RyYXRlZ2llcywgcHJvZHVjdF9zdHJhdGVnaWVzX3N0cnVjdHVyZSwgYXJncy5vdXRwdXRmaWxlKQorCisjIElmIHRoaXMgZmlsZSBpcyBkaXJlY3RseSBleGVjdXRlZAoraWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBzeXMuZXhpdChtYWluKCkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvdG9vbHMvZG9tYWluR2VuZXJhdG9yUG9saWN5LnB5IGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2RvbWFpbkdlbmVyYXRvclBvbGljeS5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5iMGM0YjY2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3Rvb2xzL2RvbWFpbkdlbmVyYXRvclBvbGljeS5weQpAQCAtMCwwICsxLDI3MSBAQAorIyEvdXNyL2Jpbi9weXRob24zCisKKyMKKyMgQ29weXJpZ2h0IDIwMTgsIFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKworaW1wb3J0IGFyZ3BhcnNlCitpbXBvcnQgc3lzCitpbXBvcnQgdGVtcGZpbGUKK2ltcG9ydCBvcworaW1wb3J0IGxvZ2dpbmcKK2ltcG9ydCBzdWJwcm9jZXNzCitpbXBvcnQgeG1sLmV0cmVlLkVsZW1lbnRUcmVlIGFzIEVUCisKK2ltcG9ydCBFZGRQYXJzZXIKK2Zyb20gUEZXU2NyaXB0R2VuZXJhdG9yIGltcG9ydCBQZndTY3JpcHRUcmFuc2xhdG9yCitpbXBvcnQgaG9zdENvbmZpZworCisjCisjIEluIG9yZGVyIHRvIGJ1aWxkIHRoZSBYTUwgU2V0dGluZ3MgZmlsZSBhdCBidWlsZCB0aW1lLCBhbiBpbnN0YW5jZSBvZiB0aGUgcGFyYW1ldGVyLWZyYW1ld29yaworIyBzaGFsbCBiZSBzdGFydGVkIGFuZCBmZWQgd2l0aCBhbGwgdGhlIGNyaXRlcmlvbiB0eXBlcy9jcml0ZXJpYSB0aGF0IHdpbGwgYmUgdXNlZCBieQorIyB0aGUgZW5naW5lY29uZmlndXJhYmxlLgorIyBUaGlzIHNjcmlwdHMgYWxsb3dzIGdlbmVyYXRlcyB0aGUgc2V0dGluZ3MgZnJvbSB0aGUgc2FtZSBhdWRpb19jcml0ZXJpb25fdHlwZXMueG1sIC8KKyMgYXVkaW9fY3JpdGVyaWEueG1sIGZpbGVzIHVzZWQgYXQgcnVuIHRpbWUgYnkgdGhlIGVuZ2luZWNvbmZpZ3VyYWJsZQorIworCitkZWYgcGFyc2VBcmdzKCk6CisgICAgYXJncGFyc2VyID0gYXJncGFyc2UuQXJndW1lbnRQYXJzZXIoZGVzY3JpcHRpb249IlBhcmFtZXRlci1GcmFtZXdvcmsgWE1MIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXR0aW5ncyBmaWxlIGdlbmVyYXRvci5cblwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGl0IHdpdGggdGhlIG51bWJlciBvZiAocmVjb3ZlcmFibGUgb3Igbm90KSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IgdGhhdCBvY2N1cmVkLiIpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1kb21haW4tZ2VuZXJhdG9yLXRvb2wnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iUGFyYW1ldGVyRnJhbWV3b3JrIGRvbWFpbiBnZW5lcmF0b3IgdG9vbC4gTWFuZGF0b3J5LiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhdmFyPSJQRldfRE9NQUlOX0dFTkVSQVRPUl9UT09MIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS10b3BsZXZlbC1jb25maWcnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iVG9wLWxldmVsIHBhcmFtZXRlci1mcmFtZXdvcmsgY29uZmlndXJhdGlvbiBmaWxlLiBNYW5kYXRvcnkuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGF2YXI9IlRPUExFVkVMX0NPTkZJR19GSUxFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVpcmVkPVRydWUpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS1jcml0ZXJpYScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJDcml0ZXJpYSBmaWxlLCBpbiBYTUwgZm9ybWF0OiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbiAnPGNyaXRlcmlhPiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjcml0ZXJpb24gbmFtZT0iIiB0eXBlPSIiLz4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvY3JpdGVyaWE+JyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQuIE1hbmRhdG9yeS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YXZhcj0iQ1JJVEVSSUFfRklMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1UcnVlKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tY3JpdGVyaW9udHlwZXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iQ3JpdGVyaW9uIHR5cGVzIFhNTCBmaWxlLCBpbiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAnPGNyaXRlcmlvbl90eXBlcz4gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxjcml0ZXJpb25fdHlwZSBuYW1lPSIiIHR5cGU9PGluY2x1c2l2ZXxleGNsdXNpdmU+IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzPTx2YWx1ZTEsdmFsdWUyLC4uLj4vPiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9jcml0ZXJpb25fdHlwZXM+JyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQuIE1hbmRhdG9yeS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0YXZhcj0iQ1JJVEVSSU9OX1RZUEVfRklMRSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPWFyZ3BhcnNlLkZpbGVUeXBlKCdyJyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1aXJlZD1GYWxzZSkKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWluaXRpYWwtc2V0dGluZ3MnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iSW5pdGlhbCBYTUwgc2V0dGluZ3MgZmlsZSAoY29udGFpbmluZyBhIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDb25maWd1cmFibGVEb21haW5zPiAgdGFnIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hcmdzPSc/JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGF2YXI9IlhNTF9TRVRUSU5HU19GSUxFIikKKyAgICBhcmdwYXJzZXIuYWRkX2FyZ3VtZW50KCctLWFkZC1kb21haW5zJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHA9Ikxpc3Qgb2Ygc2luZ2xlIGRvbWFpbiBmaWxlcyAoZWFjaCBjb250YWluaW5nIGEgc2luZ2xlIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDxDb25maWd1cmFibGVEb21haW4+IHRhZyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRhdmFyPSJYTUxfRE9NQUlOX0ZJTEUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFyZ3M9JyonLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdD0neG1sX2RvbWFpbl9maWxlcycsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PVtdKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tYWRkLWVkZHMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iTGlzdCBvZiBmaWxlcyBpbiBFREQgc3ludGF4IChha2EgXCIucGZ3XCIgZmlsZXMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ldGF2YXI9IkVERF9GSUxFIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9YXJncGFyc2UuRmlsZVR5cGUoJ3InKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hcmdzPScqJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0PSdlZGRfZmlsZXMnKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tc2NoZW1hcy1kaXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iRGlyZWN0b3J5IG9mIHBhcmFtZXRlci1mcmFtZXdvcmsgWE1MIFNjaGVtYXMgZm9yIGdlbmVyYXRpb24gXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PU5vbmUpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS10YXJnZXQtc2NoZW1hcy1kaXInLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscD0iSWdub3JlZC4gS2VwdCBmb3IgcmV0cm8tY29tcGF0aWJpbGl0eSIpCisgICAgYXJncGFyc2VyLmFkZF9hcmd1bWVudCgnLS12YWxpZGF0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwPSJWYWxpZGF0ZSB0aGUgc2V0dGluZ3MgYWdhaW5zdCBYTUwgc2NoZW1hcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnKQorICAgIGFyZ3BhcnNlci5hZGRfYXJndW1lbnQoJy0tdmVyYm9zZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnKQorCisgICAgcmV0dXJuIGFyZ3BhcnNlci5wYXJzZV9hcmdzKCkKKworIworIyBQYXJzZXMgYXVkaW9fY3JpdGVyaW9uX3R5cGVzLnhtbCAvIGF1ZGlvX2NyaXRlcmlhLnhtbCBmaWxlcyB1c2VkIGF0IHJ1biB0aW1lIGJ5IHRoZQorIyBlbmdpbmVjb25maWd1cmFibGUgYW5kIG91dHB1dHMgYSBkaWN0aW9ubmFyeSBvZiBjcml0ZXJpYS4KKyMgRm9yIGVhY2ggY3JpdGVyaWEsIHRoZSBuYW1lLCB0eXBlIChha2EgaW5jbHVzaXZlIChiaXRmaWVsZCkgb3IgZXhjbHVzaXZlIChlbnVtKSwgdGhlIHZhbHVlcworIyBhcmUgcHJvdmlkZWQuCisjCitkZWYgcGFyc2VDcml0ZXJpYUFuZENyaXRlcmlvblR5cGVzKGNyaXRlcmlhRmlsZSwgY3JpdGVyaW9uVHlwZXNGaWxlKToKKyAgICAjIFBhcnNlIGNyaXRlcmlhIGFuZCBjcml0ZXJpb24gdHlwZXMgWE1MIGZpbGVzCisgICAgIworICAgIGNyaXRlcmlhX3RyZWUgPSBFVC5wYXJzZShjcml0ZXJpYUZpbGUpCisgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgY3JpdGVyaWFGaWxlIHt9Ii5mb3JtYXQoY3JpdGVyaWFGaWxlKSkKKyAgICBjcml0ZXJpb25fdHlwZXNfdHJlZSA9IEVULnBhcnNlKGNyaXRlcmlvblR5cGVzRmlsZSkKKyAgICBsb2dnaW5nLmluZm8oIkltcG9ydGluZyBjcml0ZXJpb25UeXBlc0ZpbGUge30iLmZvcm1hdChjcml0ZXJpb25UeXBlc0ZpbGUpKQorCisgICAgY3JpdGVyaWFfcm9vdCA9IGNyaXRlcmlhX3RyZWUuZ2V0cm9vdCgpCisKKyAgICBhbGxfY3JpdGVyaWEgPSBbXQorICAgIGZvciBjcml0ZXJpb24gaW4gY3JpdGVyaWFfcm9vdC5maW5kYWxsKCdjcml0ZXJpb24nKToKKyAgICAgICAgY3JpdGVyaW9uX25hbWUgPSBjcml0ZXJpb24uZ2V0KCduYW1lJykKKyAgICAgICAgdHlwZV9uYW1lID0gY3JpdGVyaW9uLmdldCgndHlwZScpCisgICAgICAgIGxvZ2dpbmcuaW5mbygiSW1wb3J0aW5nIGNyaXRlcmlvbl9uYW1lIHt9Ii5mb3JtYXQoY3JpdGVyaW9uX25hbWUpKQorICAgICAgICBsb2dnaW5nLmluZm8oIkltcG9ydGluZyB0eXBlX25hbWUge30iLmZvcm1hdCh0eXBlX25hbWUpKQorCisgICAgICAgIGZvciBjcml0ZXJpb25fdHlwZXMgaW4gY3JpdGVyaW9uX3R5cGVzX3RyZWUuZmluZGFsbCgnY3JpdGVyaW9uX3R5cGUnKToKKyAgICAgICAgICAgIGNyaXRlcmlvbl90eXBlX25hbWUgPSBjcml0ZXJpb25fdHlwZXMuZ2V0KCduYW1lJykKKyAgICAgICAgICAgIGlmIGNyaXRlcmlvbl90eXBlX25hbWUgPT0gdHlwZV9uYW1lOgorICAgICAgICAgICAgICAgIGNyaXRlcmlvbl9pbmNsdXNpdmVuZXNzID0gY3JpdGVyaW9uX3R5cGVzLmdldCgndHlwZScpCisKKyAgICAgICAgICAgICAgICBjcml0ZXJpb25fdmFsdWVzID0gW10KKworICAgICAgICAgICAgICAgIHZhbHVlc19ub2RlID0gY3JpdGVyaW9uX3R5cGVzLmZpbmQoJ3ZhbHVlcycpCisgICAgICAgICAgICAgICAgaWYgdmFsdWVzX25vZGUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXNfbm9kZS5maW5kYWxsKCd2YWx1ZScpOgorICAgICAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uX3ZhbHVlcy5hcHBlbmQodmFsdWUuZ2V0KCdsaXRlcmFsJykpCisKKyAgICAgICAgICAgICAgICBpZiBsZW4oY3JpdGVyaW9uX3ZhbHVlcykgPT0gMDoKKyAgICAgICAgICAgICAgICAgICAgY3JpdGVyaW9uX3ZhbHVlcy5hcHBlbmQoJycpCisKKyAgICAgICAgICAgICAgICBsb2dnaW5nLmluZm8oIkltcG9ydGluZyBjcml0ZXJpb25fdHlwZV9uYW1lIHt9Ii5mb3JtYXQoY3JpdGVyaW9uX3R5cGVfbmFtZSkpCisgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgY3JpdGVyaW9uX2luY2x1c2l2ZW5lc3Mge30iLmZvcm1hdChjcml0ZXJpb25faW5jbHVzaXZlbmVzcykpCisgICAgICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJJbXBvcnRpbmcgY3JpdGVyaW9uX3ZhbHVlcyB7fSIuZm9ybWF0KGNyaXRlcmlvbl92YWx1ZXMpKQorCisgICAgICAgICAgICAgICAgYWxsX2NyaXRlcmlhLmFwcGVuZCh7CisgICAgICAgICAgICAgICAgICAgICJuYW1lIiA6IGNyaXRlcmlvbl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAiaW5jbHVzaXZlIiA6IGNyaXRlcmlvbl9pbmNsdXNpdmVuZXNzLAorICAgICAgICAgICAgICAgICAgICAidmFsdWVzIiA6IGNyaXRlcmlvbl92YWx1ZXN9KQorICAgICAgICAgICAgICAgIGJyZWFrCisKKyAgICByZXR1cm4gYWxsX2NyaXRlcmlhCisKKyMKKyMgUGFyc2VzIHRoZSBFZGQgZmlsZXMgKGFrYSAucGZ3IGV4dGVuc2lvbiBmaWxlKSwgd2hpY2ggaXMgYSBzaW1wbGlmaWVkIGxhbmd1YWdlIHRvIHdyaXRlIHRoZQorIyBwYXJhbWV0ZXIgZnJhbWV3b3JrIHNldHRpbmdzLgorIworZGVmIHBhcnNlRWRkKEVEREZpbGVzKToKKyAgICBwYXJzZWRfZWRkcyA9IFtdCisKKyAgICBmb3IgZWRkX2ZpbGUgaW4gRURERmlsZXM6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJvb3QgPSBFZGRQYXJzZXIuUGFyc2VyKCkucGFyc2UoZWRkX2ZpbGUpCisgICAgICAgIGV4Y2VwdCBFZGRQYXJzZXIuTXlTeW50YXhFcnJvciBhcyBleDoKKyAgICAgICAgICAgIGxvZ2dpbmcuY3JpdGljYWwoc3RyKGV4KSkKKyAgICAgICAgICAgIGxvZ2dpbmcuaW5mbygiRVhJVCBPTiBGQUlMVVJFIikKKyAgICAgICAgICAgIGV4aXQoMikKKworICAgICAgICB0cnk6CisgICAgICAgICAgICByb290LnByb3BhZ2F0ZSgpCisgICAgICAgIGV4Y2VwdCBFZGRQYXJzZXIuTXlQcm9wYWdhdGlvbkVycm9yIGFzIGV4OgorICAgICAgICAgICAgbG9nZ2luZy5jcml0aWNhbChzdHIoZXgpKQorICAgICAgICAgICAgbG9nZ2luZy5pbmZvKCJFWElUIE9OIEZBSUxVUkUiKQorICAgICAgICAgICAgZXhpdCgxKQorCisgICAgICAgIHBhcnNlZF9lZGRzLmFwcGVuZCgoZWRkX2ZpbGUubmFtZSwgcm9vdCkpCisgICAgcmV0dXJuIHBhcnNlZF9lZGRzCisKKyMKKyMgR2VuZXJhdGVzIGFsbCB0aGUgcmVxdWlyZWQgY29tbWFuZHMgdG8gYmUgc2VudCB0byB0aGUgaW5zdGFuY2Ugb2YgcGFyYW1ldGVyLWZyYW1ld29yayBsYXVuY2hlZAorIyBhdCBydW50aW1lIHRvIGdlbmVyYXRlIHRoZSBYTUwgU2V0dGluZ3MgZmlsZS4KKyMgSXQgdGFrZXMgYXMgaW5wdXQgdGhlIGNvbGxlY3Rpb24gb2YgY3JpdGVyaWEsIHRoZSBkb21haW5zIGFuZCB0aGUgc2ltcGxpZmllZCBzZXR0aW5ncyByZWFkIGZyb20KKyMgcGZ3LgorIworZGVmIGdlbmVyYXRlRG9tYWluQ29tbWFuZHMobG9nZ2VyLCBhbGxfY3JpdGVyaWEsIGluaXRpYWxfc2V0dGluZ3MsIHhtbF9kb21haW5fZmlsZXMsIHBhcnNlZF9lZGRzKToKKyAgICAjIGNyZWF0ZSBhbmQgaW5qZWN0IGFsbCB0aGUgY3JpdGVyaWEKKyAgICBsb2dnZXIuaW5mbygiQ3JlYXRpbmcgYWxsIGNyaXRlcmlhIikKKyAgICBmb3IgY3JpdGVyaW9uIGluIGFsbF9jcml0ZXJpYToKKyAgICAgICAgeWllbGQgWyJjcmVhdGVTZWxlY3Rpb25Dcml0ZXJpb24iLCBjcml0ZXJpb25bJ2luY2x1c2l2ZSddLAorICAgICAgICAgICAgICAgY3JpdGVyaW9uWyduYW1lJ11dICsgY3JpdGVyaW9uWyd2YWx1ZXMnXQorCisgICAgeWllbGQgWyJzdGFydCJdCisKKyAgICAjIEltcG9ydCBpbml0aWFsIHNldHRpbmdzIGZpbGUKKyAgICBpZiBpbml0aWFsX3NldHRpbmdzOgorICAgICAgICBsb2dnZXIuaW5mbygiSW1wb3J0aW5nIGluaXRpYWwgc2V0dGluZ3MgZmlsZSB7fSIuZm9ybWF0KGluaXRpYWxfc2V0dGluZ3MpKQorICAgICAgICB5aWVsZCBbImltcG9ydERvbWFpbnNXaXRoU2V0dGluZ3NYTUwiLCBpbml0aWFsX3NldHRpbmdzXQorCisgICAgIyBJbXBvcnQgZWFjaCBzdGFuZGFsb25lIGRvbWFpbiBmaWxlcworICAgIGZvciBkb21haW5fZmlsZSBpbiB4bWxfZG9tYWluX2ZpbGVzOgorICAgICAgICBsb2dnZXIuaW5mbygiSW1wb3J0aW5nIHNpbmdsZSBkb21haW4gZmlsZSB7fSIuZm9ybWF0KGRvbWFpbl9maWxlKSkKKyAgICAgICAgeWllbGQgWyJpbXBvcnREb21haW5XaXRoU2V0dGluZ3NYTUwiLCBkb21haW5fZmlsZV0KKworICAgICMgR2VuZXJhdGUgdGhlIHNjcmlwdCBmb3IgZWFjaCBFREQgZmlsZQorICAgIGZvciBmaWxlbmFtZSwgcGFyc2VkX2VkZCBpbiBwYXJzZWRfZWRkczoKKyAgICAgICAgbG9nZ2VyLmluZm8oIlRyYW5zbGF0aW5nIGFuZCBpbmplY3RpbmcgRUREIGZpbGUge30iLmZvcm1hdChmaWxlbmFtZSkpCisgICAgICAgIHRyYW5zbGF0b3IgPSBQZndTY3JpcHRUcmFuc2xhdG9yKCkKKyAgICAgICAgcGFyc2VkX2VkZC50cmFuc2xhdGUodHJhbnNsYXRvcikKKyAgICAgICAgZm9yIGNvbW1hbmQgaW4gdHJhbnNsYXRvci5nZXRTY3JpcHQoKToKKyAgICAgICAgICAgIHlpZWxkIGNvbW1hbmQKKworIworIyBFbnRyeSBwb2ludCBvZiB0aGUgZG9tYWluIGdlbmVyYXRvci4KKyMgICAgICAgLVBhcnNlcyBDcml0ZXJpb24gdHlwZXMgYW5kIGNyaXRlcmlhIGZpbGVzCisjICAgICAgIC1QYXJzZXMgc2V0dGluZ3Mgd3JpdHRlbiBpbiBzaW1wbGlmaWVkIHBmdyBsYW5ndWFnZS4KKyMgICAgICAgLUxhdW5jaGVzIGEgcGFyYW1ldGVyLWZyYW1ld29yaworIyAgICAgICAtVHJhbnNsYXRlcyB0aGUgc2V0dGluZ3MgaW50byBjb21tYW5kIHRoYXQgY2FuIGJlIGludGVycHJldGVkIGJ5IHBhcmFtZXRlci1mcmFtZXdvcmsuCisjICAgICAgIC1Vc2UgdGhlIGV4cG9ydHMgY29tbWFuZCBhbmQgb3V0cHV0IHRoZW0gaW4gWE1MIFNldHRpbmdzIGZpbGUuCisjCitkZWYgbWFpbigpOgorICAgIGxvZ2dpbmcucm9vdC5zZXRMZXZlbChsb2dnaW5nLklORk8pCisgICAgYXJncyA9IHBhcnNlQXJncygpCisKKyAgICBhbGxfY3JpdGVyaWEgPSBwYXJzZUNyaXRlcmlhQW5kQ3JpdGVyaW9uVHlwZXMoYXJncy5jcml0ZXJpYSwgYXJncy5jcml0ZXJpb250eXBlcykKKworICAgICMKKyAgICAjIEVERCBmaWxlcyAoYWthICIucGZ3IiBmaWxlcykKKyAgICAjCisgICAgcGFyc2VkX2VkZHMgPSBwYXJzZUVkZChhcmdzLmVkZF9maWxlcykKKworICAgICMgV2UgbmVlZCB0byBtb2RpZnkgdGhlIHRvcGxldmVsIGNvbmZpZ3VyYXRpb24gZmlsZSB0byBhY2NvdW50IGZvciBkaWZmZXJlbmNlcworICAgICMgYmV0d2VlbiBkZXZlbG9wbWVudCBzZXR1cCBhbmQgdGFyZ2V0IChpbnN0YWxsYXRpb24pIHNldHVwLCBpbiBwYXJ0aWN1bGFyLCB0aGUKKyAgICAjIFR1bmluZ013aXRoIG9kZSBtdXN0IGJlIGVuZm9yY2VkLCByZWdhcmRsZXNzIG9mIHdoYXQgd2lsbCBiZSBhbGxvd2VkIG9uIHRoZSB0YXJnZXQKKyAgICBmYWtlX3RvcGxldmVsX2NvbmZpZyA9IHRlbXBmaWxlLk5hbWVkVGVtcG9yYXJ5RmlsZShtb2RlPSd3JywgZGVsZXRlPUZhbHNlLCBzdWZmaXg9Ii54bWwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeD0iVE1QZG9tYWluR2VuZXJhdG9yUEZDb25maWdfIikKKworICAgIGluc3RhbGxfcGF0aCA9IG9zLnBhdGguZGlybmFtZShvcy5wYXRoLnJlYWxwYXRoKGFyZ3MudG9wbGV2ZWxfY29uZmlnKSkKKyAgICBob3N0Q29uZmlnLmNvbmZpZ3VyZShpbmZpbGU9YXJncy50b3BsZXZlbF9jb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgb3V0ZmlsZT1mYWtlX3RvcGxldmVsX2NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3RQYXRoPWluc3RhbGxfcGF0aCkKKyAgICBmYWtlX3RvcGxldmVsX2NvbmZpZy5jbG9zZSgpCisKKyAgICAjIENyZWF0ZSB0aGUgY29ubmVjdG9yLiBQaXBlIGl0cyBpbnB1dCB0byB1cyBpbiBvcmRlciB0byB3cml0ZSBjb21tYW5kczsKKyAgICAjIGNvbm5lY3QgaXRzIG91dHB1dCB0byBzdGRvdXQgaW4gb3JkZXIgdG8gaGF2ZSBpdCBkdW1wIHRoZSBkb21haW5zCisgICAgIyB0aGVyZTsgY29ubmVjdCBpdHMgZXJyb3Igb3V0cHV0IHRvIHN0ZGVyci4KKyAgICBjb25uZWN0b3IgPSBzdWJwcm9jZXNzLlBvcGVuKFthcmdzLmRvbWFpbl9nZW5lcmF0b3JfdG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWtlX3RvcGxldmVsX2NvbmZpZy5uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd2ZXJib3NlJyBpZiBhcmdzLnZlcmJvc2UgZWxzZSAnbm8tdmVyYm9zZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3ZhbGlkYXRlJyBpZiBhcmdzLnZhbGlkYXRlIGVsc2UgJ25vLXZhbGlkYXRlJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLnNjaGVtYXNfZGlyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zeXMuc3Rkb3V0LCBzdGRpbj1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zeXMuc3RkZXJyKQorCisgICAgaW5pdGlhbF9zZXR0aW5ncyA9IE5vbmUKKyAgICBpZiBhcmdzLmluaXRpYWxfc2V0dGluZ3M6CisgICAgICAgIGluaXRpYWxfc2V0dGluZ3MgPSBvcy5wYXRoLnJlYWxwYXRoKGFyZ3MuaW5pdGlhbF9zZXR0aW5ncykKKworICAgIGZvciBjb21tYW5kIGluIGdlbmVyYXRlRG9tYWluQ29tbWFuZHMobG9nZ2luZywgYWxsX2NyaXRlcmlhLCBpbml0aWFsX3NldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy54bWxfZG9tYWluX2ZpbGVzLCBwYXJzZWRfZWRkcyk6CisgICAgICAgIGNvbm5lY3Rvci5zdGRpbi53cml0ZSgnXDAnLmpvaW4oY29tbWFuZCkuZW5jb2RlKCd1dGYtOCcpKQorICAgICAgICBjb25uZWN0b3Iuc3RkaW4ud3JpdGUoIlxuIi5lbmNvZGUoJ3V0Zi04JykpCisKKyAgICAjIENsb3NpbmcgdGhlIGNvbm5lY3RvcidzIGlucHV0IHRyaWdnZXJzIHRoZSBkb21haW4gZ2VuZXJhdGlvbgorICAgIGNvbm5lY3Rvci5zdGRpbi5jbG9zZSgpCisgICAgY29ubmVjdG9yLndhaXQoKQorICAgIG9zLnJlbW92ZShmYWtlX3RvcGxldmVsX2NvbmZpZy5uYW1lKQorICAgIHJldHVybiBjb25uZWN0b3IucmV0dXJuY29kZQorCisjIElmIHRoaXMgZmlsZSBpcyBkaXJlY3RseSBleGVjdXRlZAoraWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKKyAgICBzeXMuZXhpdChtYWluKCkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDFlY2MwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvQW5kcm9pZC5icApAQCAtMCwwICsxLDIwIEBACitjY19saWJyYXJ5IHsKKyAgICBuYW1lOiAibGliYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmFibGVfcGZ3d3JhcHBlciIsCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyJpbmNsdWRlIl0sCisgICAgc3JjczogWyJQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAiXSwKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tbW9uIiwKKyAgICBdLAorICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYnBhcmFtZXRlciIsCisgICAgXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTI4YTM4Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIFdSQVBQRVIgTElCUkFSWQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgICAkKExPQ0FMX1BBVEgpL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2luY2x1ZGUgXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL2ludGVyZmFjZSBcCi0KLUxPQ0FMX1NSQ19GSUxFUzo9IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJwYXJhbWV0ZXIgXAotICAgIGxpYm1lZGlhX2hlbHBlcgotCi1MT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotCi1MT0NBTF9NT0RVTEU6PSBsaWJhdWRpb3BvbGljeXBmd3dyYXBwZXIKLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSAkKExPQ0FMX1BBVEgpL2luY2x1ZGUKLQotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yIC1XZXh0cmEKLQotaW5jbHVkZSAkKEJVSUxEX1NUQVRJQ19MSUJSQVJZKQotCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLSMgQ09ORklHVVJBVElPTiBGSUxFCi0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotIyBzcGVjaWZpYyBtYW5hZ2VtZW50IG9mIGF1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBhdWRpb19wb2xpY3lfY3JpdGVyaWEuY29uZgotTE9DQUxfTU9EVUxFX1RBR1MgOj0gb3B0aW9uYWwKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVF9FVEMpCi1MT0NBTF9TUkNfRklMRVMgOj0gY29uZmlnLyQoTE9DQUxfTU9EVUxFKQotaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuY3BwCmluZGV4IDliMDQ0MmUuLjYzOTkwYWMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5jcHAKQEAgLTE4LDcgKzE4LDYgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgIlBhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmgiCi0jaW5jbHVkZSAiYXVkaW9fcG9saWN5X2NyaXRlcmlhX2NvbmYuaCIKICNpbmNsdWRlIDxQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3Rvci5oPgogI2luY2x1ZGUgPFNlbGVjdGlvbkNyaXRlcmlvblR5cGVJbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UuaD4KQEAgLTU2LDM5ICs1NSw5NiBAQAogICAgIH0KIH07CiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17CituYW1lc3BhY2UgYW5kcm9pZCB7CiAKIHVzaW5nIHV0aWxpdGllczo6Y29udmVydFRvOwogCi1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKKwogY29uc3QgY2hhciAqY29uc3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6Om1Qb2xpY3lQZndEZWZhdWx0Q29uZkZpbGVOYW1lID0KICAgICAiL2V0Yy9wYXJhbWV0ZXItZnJhbWV3b3JrL1BhcmFtZXRlckZyYW1ld29ya0NvbmZpZ3VyYXRpb25Qb2xpY3kueG1sIjsKK2NvbnN0IGNoYXIgKmNvbnN0IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjptUG9saWN5UGZ3VmVuZG9yQ29uZkZpbGVOYW1lID0KKyAgICAiL3ZlbmRvci9ldGMvcGFyYW1ldGVyLWZyYW1ld29yay9QYXJhbWV0ZXJGcmFtZXdvcmtDb25maWd1cmF0aW9uUG9saWN5LnhtbCI7CisKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnSW5wdXREZXZpY2VDcml0ZXJpb25OYW1lID0gIkF2YWlsYWJsZUlucHV0RGV2aWNlcyI7CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ091dHB1dERldmljZUNyaXRlcmlvbk5hbWUgPSAiQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyI7CitzdGF0aWMgY29uc3QgY2hhciAqY29uc3QgZ1Bob25lU3RhdGVDcml0ZXJpb25OYW1lID0gIlRlbGVwaG9ueU1vZGUiOworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdPdXRwdXREZXZpY2VBZGRyZXNzQ3JpdGVyaW9uTmFtZSA9ICJBdmFpbGFibGVPdXRwdXREZXZpY2VzQWRkcmVzc2VzIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25zdCBnSW5wdXREZXZpY2VBZGRyZXNzQ3JpdGVyaW9uTmFtZSA9ICJBdmFpbGFibGVJbnB1dERldmljZXNBZGRyZXNzZXMiOworCisvKioKKyAqIE9yZGVyIE1VU1QgYmUgYWxpZ24gd2l0aCBkZWZpbnRpaW9uIG9mIGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB3aXRoaW4gYXVkaW9fcG9saWN5LmgKKyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdGb3JjZVVzZUNyaXRlcmlvblRhZ1tBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVF0gPQoreworICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dID0gICAgICAgICJGb3JjZVVzZUZvckNvbW11bmljYXRpb24iLAorICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSA9ICAgICAgICAgICAgICAgICJGb3JjZVVzZUZvck1lZGlhIiwKKyAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdID0gICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JSZWNvcmQiLAorICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0tdID0gICAgICAgICAgICAgICAgICJGb3JjZVVzZUZvckRvY2siLAorICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPSAgICAgICAgICAgICAgICJGb3JjZVVzZUZvclN5c3RlbSIsCisgICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU9dID0gICAgIkZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvIiwKKyAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9FTkNPREVEX1NVUlJPVU5EXSA9ICAgICAiRm9yY2VVc2VGb3JFbmNvZGVkU3Vycm91bmQiLAorICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1ZJQlJBVEVfUklOR0lOR10gPSAgICAgICJGb3JjZVVzZUZvclZpYnJhdGVSaW5naW5nIgorfTsKIAogdGVtcGxhdGUgPD4KIHN0cnVjdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6cGFyYW1ldGVyTWFuYWdlckVsZW1lbnRTdXBwb3J0ZWQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4ge307CiB0ZW1wbGF0ZSA8Pgogc3RydWN0IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpwYXJhbWV0ZXJNYW5hZ2VyRWxlbWVudFN1cHBvcnRlZDxJU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZT4ge307CiAKLVBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcigpCitQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6UGFyYW1ldGVyTWFuYWdlcldyYXBwZXIoYm9vbCBlbmFibGVTY2hlbWFWZXJpZmljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNjaGVtYVVyaSkKICAgICA6IG1QZndDb25uZWN0b3JMb2dnZXIobmV3IFBhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yTG9nZ2VyKQogewogICAgIC8vIENvbm5lY3RvcgotICAgIG1QZndDb25uZWN0b3IgPSBuZXcgQ1BhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yKG1Qb2xpY3lQZndEZWZhdWx0Q29uZkZpbGVOYW1lKTsKKyAgICBpZiAoYWNjZXNzKG1Qb2xpY3lQZndWZW5kb3JDb25mRmlsZU5hbWUsIFJfT0spID09IDApIHsKKyAgICAgICAgbVBmd0Nvbm5lY3RvciA9IG5ldyBDUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3IobVBvbGljeVBmd1ZlbmRvckNvbmZGaWxlTmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbVBmd0Nvbm5lY3RvciA9IG5ldyBDUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3IobVBvbGljeVBmd0RlZmF1bHRDb25mRmlsZU5hbWUpOworICAgIH0KIAogICAgIC8vIExvZ2dlcgogICAgIG1QZndDb25uZWN0b3ItPnNldExvZ2dlcihtUGZ3Q29ubmVjdG9yTG9nZ2VyKTsKIAotICAgIC8vIExvYWQgY3JpdGVyaWEgZmlsZQotICAgIGlmICgobG9hZEF1ZGlvUG9saWN5Q3JpdGVyaWFDb25maWcoZ0F1ZGlvUG9saWN5Q3JpdGVyaWFWZW5kb3JDb25mRmlsZVBhdGgpICE9IE5PX0VSUk9SKSAmJgotICAgICAgICAobG9hZEF1ZGlvUG9saWN5Q3JpdGVyaWFDb25maWcoZ0F1ZGlvUG9saWN5Q3JpdGVyaWFDb25mRmlsZVBhdGgpICE9IE5PX0VSUk9SKSkgewotICAgICAgICBBTE9HRSgiJXM6IE5laXRoZXIgdmVuZG9yIGNvbmYgZmlsZSAoJXMpIG5vciBzeXN0ZW0gY29uZiBmaWxlICglcykgY291bGQgYmUgZm91bmQiLAotICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGdBdWRpb1BvbGljeUNyaXRlcmlhVmVuZG9yQ29uZkZpbGVQYXRoLAotICAgICAgICAgICAgICBnQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZGaWxlUGF0aCk7CisgICAgLy8gU2NoZW1hIHZhbGlkYXRpb24KKyAgICBzdGQ6OnN0cmluZyBlcnJvcjsKKyAgICBib29sIHJldCA9IG1QZndDb25uZWN0b3ItPnNldFZhbGlkYXRlU2NoZW1hc09uU3RhcnQoZW5hYmxlU2NoZW1hVmVyaWZpY2F0aW9uLCBlcnJvcik7CisgICAgQUxPR0VfSUYoIXJldCwgIkZhaWxlZCB0byBhY3RpdmF0ZSBzY2hlbWEgdmFsaWRhdGlvbjogJXMiLCBlcnJvci5jX3N0cigpKTsKKyAgICBpZiAoZW5hYmxlU2NoZW1hVmVyaWZpY2F0aW9uICYmIHJldCAmJiAhc2NoZW1hVXJpLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR0UoIlNjaGVtYSB2ZXJpZmljYXRpb24gYWN0aXZhdGVkIHdpdGggc2NoZW1hIFVSSTogJXMiLCBzY2hlbWFVcmkuY19zdHIoKSk7CisgICAgICAgIG1QZndDb25uZWN0b3ItPnNldFNjaGVtYVVyaShzY2hlbWFVcmkpOwogICAgIH0KIH0KIAorc3RhdHVzX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmFkZENyaXRlcmlvbihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgYm9vbCBpc0luY2x1c2l2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVQYWlycyBwYWlycywgY29uc3Qgc3RkOjpzdHJpbmcgJmRlZmF1bHRWYWx1ZSkKK3sKKyAgICBBTE9HX0FTU0VSVChub3QgaXNTdGFydGVkKCksICJDYW5ub3QgYWRkIGEgY3JpdGVyaW9uIGlmIFBGVyBpcyBhbHJlYWR5IHN0YXJ0ZWQiKTsKKyAgICBhdXRvIGNyaXRlcmlvblR5cGUgPSBtUGZ3Q29ubmVjdG9yLT5jcmVhdGVTZWxlY3Rpb25Dcml0ZXJpb25UeXBlKGlzSW5jbHVzaXZlKTsKKworICAgIGZvciAoYXV0byBwYWlyIDogcGFpcnMpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgZXJyb3I7CisgICAgICAgIEFMT0dWKCIlczogQWRkaW5nIHBhaXIgJWQsJXMgZm9yIGNyaXRlcmlvblR5cGUgJXMiLCBfX0ZVTkNUSU9OX18sIHBhaXIuZmlyc3QsCisgICAgICAgICAgICAgIHBhaXIuc2Vjb25kLmNfc3RyKCksIG5hbWUuY19zdHIoKSk7CisgICAgICAgIGNyaXRlcmlvblR5cGUtPmFkZFZhbHVlUGFpcihwYWlyLmZpcnN0LCBwYWlyLnNlY29uZCwgZXJyb3IpOworICAgIH0KKyAgICBBTE9HX0FTU0VSVChtUG9saWN5Q3JpdGVyaWEuZmluZChuYW1lKSA9PSBtUG9saWN5Q3JpdGVyaWEuZW5kKCksCisgICAgICAgICAgICAgICAgIiVzOiBDcml0ZXJpb24gJXMgYWxyZWFkeSBhZGRlZCIsIF9fRlVOQ1RJT05fXywgbmFtZS5jX3N0cigpKTsKKworICAgIGF1dG8gY3JpdGVyaW9uID0gbVBmd0Nvbm5lY3Rvci0+Y3JlYXRlU2VsZWN0aW9uQ3JpdGVyaW9uKG5hbWUsIGNyaXRlcmlvblR5cGUpOworICAgIG1Qb2xpY3lDcml0ZXJpYVtuYW1lXSA9IGNyaXRlcmlvbjsKKworICAgIGlmIChub3QgZGVmYXVsdFZhbHVlLmVtcHR5KCkpIHsKKyAgICAgICAgaW50IG51bWVyaWNhbFZhbHVlID0gMDsKKyAgICAgICAgaWYgKG5vdCBjcml0ZXJpb25UeXBlLT5nZXROdW1lcmljYWxWYWx1ZShkZWZhdWx0VmFsdWUuY19zdHIoKSwgbnVtZXJpY2FsVmFsdWUpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM7IHRyeWluZyB0byBhcHBseSBpbnZhbGlkIGRlZmF1bHQgbGl0ZXJhbCB2YWx1ZSAoJXMpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlLmNfc3RyKCkpOworICAgICAgICB9CisgICAgICAgIGNyaXRlcmlvbi0+c2V0Q3JpdGVyaW9uU3RhdGUobnVtZXJpY2FsVmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjp+UGFyYW1ldGVyTWFuYWdlcldyYXBwZXIoKQogewogICAgIC8vIFVuc2V0IGxvZ2dlcgpAQCAtOTksMTEgKzE1NSwxMCBAQAogICAgIGRlbGV0ZSBtUGZ3Q29ubmVjdG9yOwogfQogCi1zdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6c3RhcnQoKQorc3RhdHVzX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnN0YXJ0KHN0ZDo6c3RyaW5nICZlcnJvcikKIHsKICAgICBBTE9HRCgiJXM6IGluIiwgX19GVU5DVElPTl9fKTsKICAgICAvLy8gU3RhcnQgUEZXCi0gICAgc3RkOjpzdHJpbmcgZXJyb3I7CiAgICAgaWYgKCFtUGZ3Q29ubmVjdG9yLT5zdGFydChlcnJvcikpIHsKICAgICAgICAgQUxPR0UoIiVzOiBQb2xpY3kgUEZXIHN0YXJ0IGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyb3IuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtMTEyLDExMiArMTY3LDYgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLQotdm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6YWRkQ3JpdGVyaW9uVHlwZShjb25zdCBzdHJpbmcgJnR5cGVOYW1lLCBib29sIGlzSW5jbHVzaXZlKQotewotICAgIEFMT0dfQVNTRVJUKG1Qb2xpY3lDcml0ZXJpb25UeXBlcy5maW5kKHR5cGVOYW1lKSA9PSBtUG9saWN5Q3JpdGVyaW9uVHlwZXMuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgIkNyaXRlcmlvblR5cGUgJXMgYWxyZWFkeSBhZGRlZCIsIHR5cGVOYW1lLmNfc3RyKCkpOwotICAgIEFMT0dEKCIlczogQWRkaW5nIG5ldyBjcml0ZXJpb25UeXBlICVzIiwgX19GVU5DVElPTl9fLCB0eXBlTmFtZS5jX3N0cigpKTsKLQotICAgIG1Qb2xpY3lDcml0ZXJpb25UeXBlc1t0eXBlTmFtZV0gPSBtUGZ3Q29ubmVjdG9yLT5jcmVhdGVTZWxlY3Rpb25Dcml0ZXJpb25UeXBlKGlzSW5jbHVzaXZlKTsKLX0KLQotdm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6YWRkQ3JpdGVyaW9uVHlwZVZhbHVlUGFpcigKLSAgICBjb25zdCBzdHJpbmcgJnR5cGVOYW1lLAotICAgIHVpbnQzMl90IG51bWVyaWNWYWx1ZSwKLSAgICBjb25zdCBzdHJpbmcgJmxpdGVyYWxWYWx1ZSkKLXsKLSAgICBBTE9HX0FTU0VSVChtUG9saWN5Q3JpdGVyaW9uVHlwZXMuZmluZCh0eXBlTmFtZSkgIT0gbVBvbGljeUNyaXRlcmlvblR5cGVzLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICJDcml0ZXJpb25UeXBlICVzIG5vdCBmb3VuZCIsIHR5cGVOYW1lLmNfc3RyKCkpOwotICAgIEFMT0dWKCIlczogQWRkaW5nIG5ldyB2YWx1ZSBwYWlyICglZCwlcykgZm9yIGNyaXRlcmlvblR5cGUgJXMiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgbnVtZXJpY1ZhbHVlLCBsaXRlcmFsVmFsdWUuY19zdHIoKSwgdHlwZU5hbWUuY19zdHIoKSk7Ci0gICAgSVNlbGVjdGlvbkNyaXRlcmlvblR5cGVJbnRlcmZhY2UgKmNyaXRlcmlvblR5cGUgPSBtUG9saWN5Q3JpdGVyaW9uVHlwZXNbdHlwZU5hbWVdOwotICAgIHN0ZDo6c3RyaW5nIGVycm9yOwotICAgIGNyaXRlcmlvblR5cGUtPmFkZFZhbHVlUGFpcihudW1lcmljVmFsdWUsIGxpdGVyYWxWYWx1ZSwgZXJyb3IpOwotfQotCi12b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpsb2FkQ3JpdGVyaW9uVHlwZShjbm9kZSAqcm9vdCwgYm9vbCBpc0luY2x1c2l2ZSkKLXsKLSAgICBBTE9HX0FTU0VSVChyb290ICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKLSAgICBjbm9kZSAqbm9kZTsKLSAgICBmb3IgKG5vZGUgPSByb290LT5maXJzdF9jaGlsZDsgbm9kZSAhPSBOVUxMOyBub2RlID0gbm9kZS0+bmV4dCkgewotCi0gICAgICAgIEFMT0dfQVNTRVJUKG5vZGUgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOwotICAgICAgICBjb25zdCBjaGFyICp0eXBlTmFtZSA9IG5vZGUtPm5hbWU7Ci0gICAgICAgIGNoYXIgKnZhbHVlTmFtZXMgPSBzdHJuZHVwKG5vZGUtPnZhbHVlLCBzdHJsZW4obm9kZS0+dmFsdWUpKTsKLQotICAgICAgICBhZGRDcml0ZXJpb25UeXBlKHR5cGVOYW1lLCBpc0luY2x1c2l2ZSk7Ci0KLSAgICAgICAgdWludDMyX3QgaW5kZXggPSAwOwotICAgICAgICBjaGFyICpjdHg7Ci0gICAgICAgIGNoYXIgKnZhbHVlTmFtZSA9IHN0cnRva19yKHZhbHVlTmFtZXMsICIsIiwgJmN0eCk7Ci0gICAgICAgIHdoaWxlICh2YWx1ZU5hbWUgIT0gTlVMTCkgewotICAgICAgICAgICAgaWYgKHN0cmxlbih2YWx1ZU5hbWUpICE9IDApIHsKLQotICAgICAgICAgICAgICAgIC8vIENvbmYgZmlsZSBtYXkgdXNlIG9yIG5vdCBwYWlyLCBpZiBubyBwYWlyLCB1c2UgaW5jcmVtZW50YWwgaW5kZXgsIGVsc2UKLSAgICAgICAgICAgICAgICAvLyB1c2UgcHJvdmlkZWQgaW5kZXguCi0gICAgICAgICAgICAgICAgaWYgKHN0cmNocih2YWx1ZU5hbWUsICc6JykgIT0gTlVMTCkgewotCi0gICAgICAgICAgICAgICAgICAgIGNoYXIgKmZpcnN0ID0gc3RydG9rKHZhbHVlTmFtZSwgIjoiKTsKLSAgICAgICAgICAgICAgICAgICAgY2hhciAqc2Vjb25kID0gc3RydG9rKE5VTEwsICI6Iik7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dfQVNTRVJUKChmaXJzdCAhPSBOVUxMKSAmJiAoc3RybGVuKGZpcnN0KSAhPSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2Vjb25kICE9IE5VTEwpICYmIChzdHJsZW4oc2Vjb25kKSAhPSAwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgdmFsdWUgcGFpciIpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmICghY29udmVydFRvPHN0cmluZywgdWludDMyX3Q+KGZpcnN0LCBpbmRleCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBpbmRleCglcykgZm91bmQiLCBfX0ZVTkNUSU9OX18sIGZpcnN0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBhZGRDcml0ZXJpb25UeXBlVmFsdWVQYWlyKHR5cGVOYW1lLCBpbmRleCwgc2Vjb25kKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHBmd0luZGV4ID0gaXNJbmNsdXNpdmUgPyAxIDw8IGluZGV4IDogaW5kZXg7Ci0gICAgICAgICAgICAgICAgICAgIGFkZENyaXRlcmlvblR5cGVWYWx1ZVBhaXIodHlwZU5hbWUsIHBmd0luZGV4LCB2YWx1ZU5hbWUpOwotICAgICAgICAgICAgICAgICAgICBpbmRleCArPSAxOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbHVlTmFtZSA9IHN0cnRva19yKE5VTEwsICIsIiwgJmN0eCk7Ci0gICAgICAgIH0KLSAgICAgICAgZnJlZSh2YWx1ZU5hbWVzKTsKLSAgICB9Ci19Ci0KLXZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmxvYWRJbmNsdXNpdmVDcml0ZXJpb25UeXBlKGNub2RlICpyb290KQotewotICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOwotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgZ0luY2x1c2l2ZUNyaXRlcmlvblR5cGVUYWcuY19zdHIoKSk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGxvYWRDcml0ZXJpb25UeXBlKG5vZGUsIHRydWUpOwotfQotCi12b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpsb2FkRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZShjbm9kZSAqcm9vdCkKLXsKLSAgICBBTE9HX0FTU0VSVChyb290ICE9IE5VTEwsICJlcnJvciBpbiBwYXJzaW5nIGZpbGUiKTsKLSAgICBjbm9kZSAqbm9kZSA9IGNvbmZpZ19maW5kKHJvb3QsIGdFeGNsdXNpdmVDcml0ZXJpb25UeXBlVGFnLmNfc3RyKCkpOwotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBsb2FkQ3JpdGVyaW9uVHlwZShub2RlLCBmYWxzZSk7Ci19Ci0KLXZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnBhcnNlQ2hpbGRyZW4oY25vZGUgKnJvb3QsIHN0cmluZyAmZGVmYXVsdFZhbHVlLCBzdHJpbmcgJnR5cGUpCi17Ci0gICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7Ci0gICAgY25vZGUgKm5vZGU7Ci0gICAgZm9yIChub2RlID0gcm9vdC0+Zmlyc3RfY2hpbGQ7IG5vZGUgIT0gTlVMTDsgbm9kZSA9IG5vZGUtPm5leHQpIHsKLSAgICAgICAgQUxPR19BU1NFUlQobm9kZSAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7Ci0KLSAgICAgICAgaWYgKHN0cmluZyhub2RlLT5uYW1lKSA9PSBnRGVmYXVsdFRhZykgewotICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gbm9kZS0+dmFsdWU7Ci0gICAgICAgIH0gZWxzZSBpZiAoc3RyaW5nKG5vZGUtPm5hbWUpID09IGdUeXBlVGFnKSB7Ci0gICAgICAgICAgICB0eXBlID0gbm9kZS0+dmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgQUxPR0UoIiVzOiBVbnJlY29nbml6ZWQgJXMgJXMgbm9kZSIsIF9fRlVOQ1RJT05fXywgbm9kZS0+bmFtZSwgbm9kZS0+dmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotfQotCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIFQgKlBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpnZXRFbGVtZW50KGNvbnN0IHN0cmluZyAmbmFtZSwgc3RkOjptYXA8c3RyaW5nLCBUICo+ICZlbGVtZW50c01hcCkKIHsKQEAgLTIzNiw5NyArMTg1LDYgQEAKICAgICByZXR1cm4gaXQgIT0gZWxlbWVudHNNYXAuZW5kKCkgPyBpdC0+c2Vjb25kIDogTlVMTDsKIH0KIAotdm9pZCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6bG9hZENyaXRlcmlhKGNub2RlICpyb290KQotewotICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOwotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgZ0NyaXRlcmlvblRhZy5jX3N0cigpKTsKLQotICAgIGlmIChub2RlID09IE5VTEwpIHsKLSAgICAgICAgQUxPR1coIiVzOiBubyBpbmNsdXNpdmUgY3JpdGVyaWEgZm91bmQiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm47Ci0gICAgfQotICAgIGZvciAobm9kZSA9IG5vZGUtPmZpcnN0X2NoaWxkOyBub2RlICE9IE5VTEw7IG5vZGUgPSBub2RlLT5uZXh0KSB7Ci0gICAgICAgIGxvYWRDcml0ZXJpb24obm9kZSk7Ci0gICAgfQotfQotCi12b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjphZGRDcml0ZXJpb24oY29uc3Qgc3RyaW5nICZuYW1lLCBjb25zdCBzdHJpbmcgJnR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nICZkZWZhdWx0TGl0ZXJhbFZhbHVlKQotewotICAgIEFMT0dfQVNTRVJUKG1Qb2xpY3lDcml0ZXJpYS5maW5kKG5hbWUpID09IG1Qb2xpY3lDcml0ZXJpYS5lbmQoKSwKLSAgICAgICAgICAgICAgICAiUm91dGUgQ3JpdGVyaW9uICVzIGFscmVhZHkgYWRkZWQiLCBuYW1lLmNfc3RyKCkpOwotCi0gICAgSVNlbGVjdGlvbkNyaXRlcmlvblR5cGVJbnRlcmZhY2UgKmNyaXRlcmlvblR5cGUgPQotICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uVHlwZUludGVyZmFjZT4odHlwZU5hbWUsIG1Qb2xpY3lDcml0ZXJpb25UeXBlcyk7Ci0KLSAgICBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlICpjcml0ZXJpb24gPQotICAgICAgICAgICAgbVBmd0Nvbm5lY3Rvci0+Y3JlYXRlU2VsZWN0aW9uQ3JpdGVyaW9uKG5hbWUsIGNyaXRlcmlvblR5cGUpOwotCi0gICAgbVBvbGljeUNyaXRlcmlhW25hbWVdID0gY3JpdGVyaW9uOwotICAgIGludCBudW1lcmljYWxWYWx1ZSA9IDA7Ci0gICAgaWYgKCFjcml0ZXJpb25UeXBlLT5nZXROdW1lcmljYWxWYWx1ZShkZWZhdWx0TGl0ZXJhbFZhbHVlLmNfc3RyKCksICBudW1lcmljYWxWYWx1ZSkpIHsKLSAgICAgICAgQUxPR0UoIiVzOyB0cnlpbmcgdG8gYXBwbHkgaW52YWxpZCBkZWZhdWx0IGxpdGVyYWwgdmFsdWUgKCVzKSIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgZGVmYXVsdExpdGVyYWxWYWx1ZS5jX3N0cigpKTsKLSAgICB9Ci0gICAgY3JpdGVyaW9uLT5zZXRDcml0ZXJpb25TdGF0ZShudW1lcmljYWxWYWx1ZSk7Ci19Ci0KLXZvaWQgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmxvYWRDcml0ZXJpb24oY25vZGUgKnJvb3QpCi17Ci0gICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiZXJyb3IgaW4gcGFyc2luZyBmaWxlIik7Ci0gICAgY29uc3QgY2hhciAqY3JpdGVyaW9uTmFtZSA9IHJvb3QtPm5hbWU7Ci0KLSAgICBBTE9HX0FTU0VSVChtUG9saWN5Q3JpdGVyaWEuZmluZChjcml0ZXJpb25OYW1lKSA9PSBtUG9saWN5Q3JpdGVyaWEuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgIkNyaXRlcmlvbiAlcyBhbHJlYWR5IGFkZGVkIiwgY3JpdGVyaW9uTmFtZSk7Ci0KLSAgICBzdHJpbmcgcGFyYW1LZXlOYW1lID0gIiI7Ci0gICAgc3RyaW5nIHBhdGggPSAiIjsKLSAgICBzdHJpbmcgdHlwZU5hbWUgPSAiIjsKLSAgICBzdHJpbmcgZGVmYXVsdFZhbHVlID0gIiI7Ci0KLSAgICBwYXJzZUNoaWxkcmVuKHJvb3QsIGRlZmF1bHRWYWx1ZSwgdHlwZU5hbWUpOwotCi0gICAgYWRkQ3JpdGVyaW9uKGNyaXRlcmlvbk5hbWUsIHR5cGVOYW1lLCBkZWZhdWx0VmFsdWUpOwotfQotCi12b2lkIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpsb2FkQ29uZmlnKGNub2RlICpyb290KQotewotICAgIEFMT0dfQVNTRVJUKHJvb3QgIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZSIpOwotICAgIGNub2RlICpub2RlID0gY29uZmlnX2ZpbmQocm9vdCwgZ1BvbGljeUNvbmZUYWcuY19zdHIoKSk7Ci0gICAgaWYgKG5vZGUgPT0gTlVMTCkgewotICAgICAgICBBTE9HVygiJXM6IENvdWxkIG5vdCBmaW5kIG5vZGUgZm9yIHBmdyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgQUxPR0QoIiVzOiBMb2FkaW5nIGNvbmYgZm9yIHBmdyIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgbG9hZEluY2x1c2l2ZUNyaXRlcmlvblR5cGUobm9kZSk7Ci0gICAgbG9hZEV4Y2x1c2l2ZUNyaXRlcmlvblR5cGUobm9kZSk7Ci0gICAgbG9hZENyaXRlcmlhKG5vZGUpOwotfQotCi0KLXN0YXR1c190IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpsb2FkQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZpZyhjb25zdCBjaGFyICpwYXRoKQotewotICAgIEFMT0dfQVNTRVJUKHBhdGggIT0gTlVMTCwgImVycm9yIGluIHBhcnNpbmcgZmlsZTogZW1wdHkgcGF0aCIpOwotICAgIGNub2RlICpyb290OwotICAgIGNoYXIgKmRhdGE7Ci0gICAgQUxPR0QoIiVzIiwgX19GVU5DVElPTl9fKTsKLSAgICBkYXRhID0gKGNoYXIgKilsb2FkX2ZpbGUocGF0aCwgTlVMTCk7Ci0gICAgaWYgKGRhdGEgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcm9vdCA9IGNvbmZpZ19ub2RlKCIiLCAiIik7Ci0gICAgQUxPR19BU1NFUlQocm9vdCAhPSBOVUxMLCAiVW5hYmxlIHRvIGFsbG9jYXRlIGEgY29uZmlndXJhdGlvbiBub2RlIik7Ci0gICAgY29uZmlnX2xvYWQocm9vdCwgZGF0YSk7Ci0KLSAgICBsb2FkQ29uZmlnKHJvb3QpOwotCi0gICAgY29uZmlnX2ZyZWUocm9vdCk7Ci0gICAgZnJlZShyb290KTsKLSAgICBmcmVlKGRhdGEpOwotICAgIEFMT0dEKCIlczogbG9hZGVkIiwgX19GVU5DVElPTl9fKTsKLSAgICByZXR1cm4gTk9fRVJST1I7Ci19Ci0KIGJvb2wgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmlzU3RhcnRlZCgpCiB7CiAgICAgcmV0dXJuIG1QZndDb25uZWN0b3IgJiYgbVBmd0Nvbm5lY3Rvci0+aXNTdGFydGVkKCk7CkBAIC0zMzUsOSArMTkzLDkgQEAKIHN0YXR1c190IFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKQogewogICAgIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiA9Ci0gICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGdQaG9uZVN0YXRlQ3JpdGVyaW9uVGFnLCBtUG9saWN5Q3JpdGVyaWEpOworICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnUGhvbmVTdGF0ZUNyaXRlcmlvbk5hbWUsIG1Qb2xpY3lDcml0ZXJpYSk7CiAgICAgaWYgKGNyaXRlcmlvbiA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ1Bob25lU3RhdGVDcml0ZXJpb25UYWcuY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ1Bob25lU3RhdGVDcml0ZXJpb25OYW1lKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgaWYgKCFpc1ZhbHVlVmFsaWRGb3JDcml0ZXJpb24oY3JpdGVyaW9uLCBzdGF0aWNfY2FzdDxpbnQ+KG1vZGUpKSkgewpAQCAtMzUxLDkgKzIwOSw5IEBACiBhdWRpb19tb2RlX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OmdldFBob25lU3RhdGUoKSBjb25zdAogewogICAgIGNvbnN0IElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiA9Ci0gICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGdQaG9uZVN0YXRlQ3JpdGVyaW9uVGFnLCBtUG9saWN5Q3JpdGVyaWEpOworICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnUGhvbmVTdGF0ZUNyaXRlcmlvbk5hbWUsIG1Qb2xpY3lDcml0ZXJpYSk7CiAgICAgaWYgKGNyaXRlcmlvbiA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ1Bob25lU3RhdGVDcml0ZXJpb25UYWcuY19zdHIoKSk7CisgICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ1Bob25lU3RhdGVDcml0ZXJpb25OYW1lKTsKICAgICAgICAgcmV0dXJuIEFVRElPX01PREVfTk9STUFMOwogICAgIH0KICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YXVkaW9fbW9kZV90Pihjcml0ZXJpb24tPmdldENyaXRlcmlvblN0YXRlKCkpOwpAQCAtMzcwLDcgKzIyOCw3IEBACiAgICAgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KICAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ0ZvcmNlVXNlQ3JpdGVyaW9uVGFnW3VzYWdlXSwgbVBvbGljeUNyaXRlcmlhKTsKICAgICBpZiAoY3JpdGVyaW9uID09IE5VTEwpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnRm9yY2VVc2VDcml0ZXJpb25UYWdbdXNhZ2VdLmNfc3RyKCkpOworICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdGb3JjZVVzZUNyaXRlcmlvblRhZ1t1c2FnZV0pOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBpZiAoIWlzVmFsdWVWYWxpZEZvckNyaXRlcmlvbihjcml0ZXJpb24sIHN0YXRpY19jYXN0PGludD4oY29uZmlnKSkpIHsKQEAgLTM5MCw3ICsyNDgsNyBAQAogICAgIGNvbnN0IElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiA9CiAgICAgICAgICAgICBnZXRFbGVtZW50PElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2U+KGdGb3JjZVVzZUNyaXRlcmlvblRhZ1t1c2FnZV0sIG1Qb2xpY3lDcml0ZXJpYSk7CiAgICAgaWYgKGNyaXRlcmlvbiA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ0ZvcmNlVXNlQ3JpdGVyaW9uVGFnW3VzYWdlXS5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnRm9yY2VVc2VDcml0ZXJpb25UYWdbdXNhZ2VdKTsKICAgICAgICAgcmV0dXJuIEFVRElPX1BPTElDWV9GT1JDRV9OT05FOwogICAgIH0KICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8YXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdD4oY3JpdGVyaW9uLT5nZXRDcml0ZXJpb25TdGF0ZSgpKTsKQEAgLTQwNCwxMiArMjYyLDQ2IEBACiAgICAgcmV0dXJuIGludGVyZmFjZS0+Z2V0TGl0ZXJhbFZhbHVlKHZhbHVlVG9DaGVjaywgbGl0ZXJhbFZhbHVlKTsKIH0KIAorc3RhdHVzX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nIGFkZHJlc3MsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSkKK3sKKyAgICBzdGQ6OnN0cmluZyBjcml0ZXJpb25OYW1lID0gYXVkaW9faXNfb3V0cHV0X2RldmljZSh0eXBlKSA/CisgICAgICAgICAgICAgICAgZ091dHB1dERldmljZUFkZHJlc3NDcml0ZXJpb25OYW1lIDogZ0lucHV0RGV2aWNlQWRkcmVzc0NyaXRlcmlvbk5hbWU7CisKKyAgICBBTE9HVigiJXM6IGRldmljZSB3aXRoIGFkZHJlc3MgJXMgJXMiLCBfX0ZVTkNUSU9OX18sIGFkZHJlc3MuY19zdHIoKSwKKyAgICAgICAgICBzdGF0ZSAhPSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRT8gImRpc2Nvbm5lY3RlZCIgOiAiY29ubmVjdGVkIik7CisgICAgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KKyAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oY3JpdGVyaW9uTmFtZSwgbVBvbGljeUNyaXRlcmlhKTsKKworICAgIGlmIChjcml0ZXJpb24gPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGNyaXRlcmlvbk5hbWUuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICBhdXRvIGNyaXRlcmlvblR5cGUgPSBjcml0ZXJpb24tPmdldENyaXRlcmlvblR5cGUoKTsKKyAgICBpbnQgZGV2aWNlQWRkcmVzc0lkOworICAgIGlmIChub3QgY3JpdGVyaW9uVHlwZS0+Z2V0TnVtZXJpY2FsVmFsdWUoYWRkcmVzcy5jX3N0cigpLCBkZXZpY2VBZGRyZXNzSWQpKSB7CisgICAgICAgIEFMT0dXKCIlczogdW5rbm93biBkZXZpY2UgYWRkcmVzcyByZXBvcnRlZCAoJXMpIGZvciBjcml0ZXJpb24gJXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIGFkZHJlc3MuY19zdHIoKSwgY3JpdGVyaW9uTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9UWVBFOworICAgIH0KKyAgICBpbnQgY3VycmVudFZhbHVlTWFzayA9IGNyaXRlcmlvbi0+Z2V0Q3JpdGVyaW9uU3RhdGUoKTsKKyAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpIHsKKyAgICAgICAgY3VycmVudFZhbHVlTWFzayB8PSBkZXZpY2VBZGRyZXNzSWQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjdXJyZW50VmFsdWVNYXNrICY9IH5kZXZpY2VBZGRyZXNzSWQ7CisgICAgfQorICAgIGNyaXRlcmlvbi0+c2V0Q3JpdGVyaW9uU3RhdGUoY3VycmVudFZhbHVlTWFzayk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiBzdGF0dXNfdCBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcjo6c2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKGF1ZGlvX2RldmljZXNfdCBpbnB1dERldmljZXMpCiB7CiAgICAgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KLSAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ0lucHV0RGV2aWNlQ3JpdGVyaW9uVGFnLCBtUG9saWN5Q3JpdGVyaWEpOworICAgICAgICAgICAgZ2V0RWxlbWVudDxJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlPihnSW5wdXREZXZpY2VDcml0ZXJpb25OYW1lLCBtUG9saWN5Q3JpdGVyaWEpOwogICAgIGlmIChjcml0ZXJpb24gPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IG5vIGNyaXRlcmlvbiBmb3VuZCBmb3IgJXMiLCBfX0ZVTkNUSU9OX18sIGdJbnB1dERldmljZUNyaXRlcmlvblRhZy5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnSW5wdXREZXZpY2VDcml0ZXJpb25OYW1lKTsKICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOwogICAgIH0KICAgICBjcml0ZXJpb24tPnNldENyaXRlcmlvblN0YXRlKGlucHV0RGV2aWNlcyAmIH5BVURJT19ERVZJQ0VfQklUX0lOKTsKQEAgLTQyMCw5ICszMTIsOSBAQAogc3RhdHVzX3QgUGFyYW1ldGVyTWFuYWdlcldyYXBwZXI6OnNldEF2YWlsYWJsZU91dHB1dERldmljZXMoYXVkaW9fZGV2aWNlc190IG91dHB1dERldmljZXMpCiB7CiAgICAgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqY3JpdGVyaW9uID0KLSAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ091dHB1dERldmljZUNyaXRlcmlvblRhZywgbVBvbGljeUNyaXRlcmlhKTsKKyAgICAgICAgICAgIGdldEVsZW1lbnQ8SVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZT4oZ091dHB1dERldmljZUNyaXRlcmlvbk5hbWUsIG1Qb2xpY3lDcml0ZXJpYSk7CiAgICAgaWYgKGNyaXRlcmlvbiA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCIlczogbm8gY3JpdGVyaW9uIGZvdW5kIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZ091dHB1dERldmljZUNyaXRlcmlvblRhZy5jX3N0cigpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBubyBjcml0ZXJpb24gZm91bmQgZm9yICVzIiwgX19GVU5DVElPTl9fLCBnT3V0cHV0RGV2aWNlQ3JpdGVyaW9uTmFtZSk7CiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9CiAgICAgY3JpdGVyaW9uLT5zZXRDcml0ZXJpb25TdGF0ZShvdXRwdXREZXZpY2VzKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2F1ZGlvX3BvbGljeV9jcml0ZXJpYV9jb25mLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9hdWRpb19wb2xpY3lfY3JpdGVyaWFfY29uZi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGZkMTc2Li4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2F1ZGlvX3BvbGljeV9jcml0ZXJpYV9jb25mLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gICAgICBEZWZpbml0aW9ucyBmb3IgYXVkaW8gcG9saWN5IGNyaXRlcmlhIGNvbmZpZ3VyYXRpb24gZmlsZSAoYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYpICAgLy8KLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vCi0vLyAgICAgIEBUT0RPOiBzY3JpcHRlZCBmcm9tIGF1ZGlvLmggJiBhdWRpb19wb2xpY3ksaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdBdWRpb1BvbGljeUNyaXRlcmlhQ29uZkZpbGVQYXRoID0KLSAgICAiL3N5c3RlbS9ldGMvYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYiOwotc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IGdBdWRpb1BvbGljeUNyaXRlcmlhVmVuZG9yQ29uZkZpbGVQYXRoID0KLSAgICAiL3ZlbmRvci9ldGMvYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYiOwotCi0vKioKLSAqIFBGVyBpbnN0YW5jZXMgdGFncwotICovCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdQb2xpY3lDb25mVGFnID0gIlBvbGljeSI7Ci1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdEZWZhdWx0VGFnID0gIkRlZmF1bHQiOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnVHlwZVRhZyA9ICJUeXBlIjsKLQotLyoqCi0gKiBQRlcgZWxlbWVudHMgdGFncwotICovCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdJbmNsdXNpdmVDcml0ZXJpb25UeXBlVGFnID0gIkluY2x1c2l2ZUNyaXRlcmlvblR5cGUiOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZVRhZyA9ICJFeGNsdXNpdmVDcml0ZXJpb25UeXBlIjsKLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyAmZ0NyaXRlcmlvblRhZyA9ICJDcml0ZXJpb24iOwotCi0vKioKLSAqIFBGVyBrbm93biBjcml0ZXJpb24gdGFncwotICovCi1zdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgJmdJbnB1dERldmljZUNyaXRlcmlvblRhZyA9ICJBdmFpbGFibGVJbnB1dERldmljZXMiOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnT3V0cHV0RGV2aWNlQ3JpdGVyaW9uVGFnID0gIkF2YWlsYWJsZU91dHB1dERldmljZXMiOwotc3RhdGljIGNvbnN0IHN0ZDo6c3RyaW5nICZnUGhvbmVTdGF0ZUNyaXRlcmlvblRhZyA9ICJUZWxlcGhvbnlNb2RlIjsKLQotLyoqCi0gKiBPcmRlciBNVVNUIGJlIGFsaWduIHdpdGggZGVmaW50aWlvbiBvZiBhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3Qgd2l0aGluIGF1ZGlvX3BvbGljeS5oCi0gKi8KLXN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBnRm9yY2VVc2VDcml0ZXJpb25UYWdbQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlRdID0KLXsKLSAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSA9ICAgICAgICAiRm9yY2VVc2VGb3JDb21tdW5pY2F0aW9uIiwKLSAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQV0gPSAgICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JNZWRpYSIsCi0gICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEXSA9ICAgICAgICAgICAgICAgIkZvcmNlVXNlRm9yUmVjb3JkIiwKLSAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLXSA9ICAgICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JEb2NrIiwKLSAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU1dID0gICAgICAgICAgICAgICAiRm9yY2VVc2VGb3JTeXN0ZW0iLAotICAgIFtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPXSA9ICAgICJGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpbyIsCi0gICAgW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORF0gPSAgICAgIkZvcmNlVXNlRm9yRW5jb2RlZFN1cnJvdW5kIiwKLSAgICBbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9WSUJSQVRFX1JJTkdJTkddID0gICAgICAiRm9yY2VVc2VGb3JWaWJyYXRlUmluZ2luZyIKLX07Ci0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9jb25maWcvYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9jb25maWcvYXVkaW9fcG9saWN5X2NyaXRlcmlhLmNvbmYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0M2Q1YTYuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvY29uZmlnL2F1ZGlvX3BvbGljeV9jcml0ZXJpYS5jb25mCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIwotIyBATk9URToKLSMgQXVkaW8gUG9saWN5IENyaXRlcmlhIGZpbGUgZXhhbXBsZSBmb3IgZ2VuZXJpYyBkZXZpY2UgYnVpbGQKLSMKLSMgQW55IHZlbmRvciBzaGFsbCBoYXZlIGl0cyBvd24gY29uZmlndXJhdGlvbiB3aXRoaW4gdGhlIGNvcnJlc3BvbmRpbmcgZGV2aWNlIGZvbGRlcgotIwotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0KLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBDcml0ZXJpb24gdHlwZSBFeGFtcGxlOgotIyBGb3IgZWFjaCBjcml0ZXJpb24sIGEgY291cGxlIG9mIG51bWVyaWNhbCwgbGl0ZXJhbCB2YWx1ZXMgbXVzdCBiZSBwcm92aWRlZCB0byB0aGUgUEZXLgotIyBUaGUgbnVtZXJpY2FsIHBhcnQgaXMgbm90IG1hbmRhdG9yeS4gSWYgbm90IGZpbGxlZCBieSB0aGUgdXNlciwgYSBkZWZhdWx0IG51bWVyaWNhbCB2YWx1ZSB3aWxsIGJlCi0jIGF1dG9tYXRpY2FsbHkgcHJvdmlkZWQgYnkgYXVkaW8gSEFMIHVzaW5nIHRoZSBmb2xsb3dpbmcgbG9naWM6Ci0jICAgLSBFeGNsdXNpdmUgY3JpdGVyaW9uOgotIyAgICAgICAgICAqIDAgLT4gZmlyc3QgbGl0ZXJhbCB2YWx1ZSwKLSMgICAgICAgICAgKiAxIC0+IHNlY29uZCBsaXRlcmFsIHZhbHVlLAotIyAgICAgICAgICAgICAgIC4uLgotIyAgICAgICAgICAqIE4gLT4gKE4rMSl0aCBsaXRlcmFsIHZhbHVlLgotIyAgIC0gSW5jbHVzaXZlIGNyaXRlcmlvbjoKLSMgICAgICAgICAgKiAxIDw8IDAgLT4gZmlyc3QgbGl0ZXJhbCB2YWx1ZSwKLSMgICAgICAgICAgKiAxIDw8IDEgLT4gc2Vjb25kIGxpdGVyYWwgdmFsdWUsCi0jICAgICAgICAgICAgICAgLi4uCi0jICAgICAgICAgICogMSA8PCBOIC0+IChOKzEpdGggbGl0ZXJhbCB2YWx1ZSwKLSMKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQb2xpY3kgewotIyAgICBJbmNsdXNpdmVDcml0ZXJpb25UeXBlfEV4Y2x1c2l2ZUNyaXRlcmlvblR5cGUgewotIyAgICAgICAgPENyaXRlcmlvbiBOYW1lPiAgW251bWVyaWNhbCB2YWx1ZSAxOl08bGl0ZXJhbCB2YWx1ZSAxPixbbnVtZXJpY2FsIHZhbHVlIDI6XTxsaXRlcmFsIHZhbHVlIDI+LDxsaXRlcmFsIHZhbHVlIDM+LC4uLgotIyAgICB9Ci0jIH0KLQotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCi0jIENyaXRlcmlvbjoKLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotIyBQb2xpY3kgewotIyAgICBDcml0ZXJpb24gewotIyAgICAgICAgPENyaXRlcmlvbiBOYW1lPiB7Ci0jICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIDxDcml0ZXJpb24gdHlwZSBuYW1lPgotIyAgICAgICAgICAgIERlZmF1bHQgICAgICAgICA8ZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY3JpdGVyaW9uPgotIyAgICAgICAgfQotIyAgICB9Ci0jIH0KLQotUG9saWN5IHsKLSAgICBJbmNsdXNpdmVDcml0ZXJpb25UeXBlIHsKLSAgICAgICAgIwotICAgICAgICAjIERPIE5PVCBDSEFOR0UgT1JERVIuIFRoaXMgZGVmaW5pdGlvbiBtdXN0IGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZgotICAgICAgICAjIEFVRElPX0RFVklDRV9PVVRfKiB3aXRoaW4gPHN5c3RlbS9hdWRpby5oPiBmaWxlIG9mIGFuZHJvaWQuCi0gICAgICAgICMKLSAgICAgICAgT3V0cHV0RGV2aWNlc01hc2tUeXBlICAgRWFycGllY2UsU3BlYWtlcixXaXJlZEhlYWRzZXQsV2lyZWRIZWFkcGhvbmUsQmx1ZXRvb3RoU2NvLEJsdWV0b290aFNjb0hlYWRzZXQsQmx1ZXRvb3RoU2NvQ2Fya2l0LEJsdWV0b290aEEyZHAsQmx1ZXRvb3RoQTJkcEhlYWRwaG9uZXMsQmx1ZXRvb3RoQTJkcFNwZWFrZXIsSGRtaSxBbmxnRG9ja0hlYWRzZXQsRGd0bERvY2tIZWFkc2V0LFVzYkFjY2Vzc29yeSxVc2JEZXZpY2UsUmVtb3RlU3VibWl4LFRlbGVwaG9ueVR4LExpbmUsSGRtaUFyYyxTcGRpZixGbSxBdXhMaW5lLFNwZWFrZXJTYWZlCi0gICAgICAgICMKLSAgICAgICAgIyBETyBOT1QgQ0hBTkdFIE9SREVSLiBUaGlzIGRlZmluaXRpb24gbXVzdCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YKLSAgICAgICAgIyBBVURJT19ERVZJQ0VfSU5fKiB3aXRoaW4gPHN5c3RlbS9hdWRpby5oPiBmaWxlIG9mIGFuZHJvaWQuCi0gICAgICAgICMgTm90ZSBhbHNvIHRoYXQgZGlyZWN0aW9uIGJpdCB3aWxsIGJlIGRlY2ltYXRlZCBieSBBdWRpb0hBTCBpbiBvcmRlciB0byBhbGxvdyB1c2luZyBhIG1hc2sKLSAgICAgICAgIyB3aXRoIHRoZSBjYXJkaW5hbGl0eSBvZiAxIGJldHdlZW4gYSBiaXQgYW5kIGFuIGlucHV0IGRldmljZS4KLSAgICAgICAgIwotICAgICAgICBJbnB1dERldmljZXNNYXNrVHlwZSAgICBDb21tdW5pY2F0aW9uLEFtYmllbnQsQnVpbHRpbk1pYyxCbHVldG9vdGhTY29IZWFkc2V0LFdpcmVkSGVhZHNldCxIZG1pLFRlbGVwaG9ueVJ4LEJhY2tNaWMsUmVtb3RlU3VibWl4LEFubGdEb2NrSGVhZHNldCxEZ3RsRG9ja0hlYWRzZXQsVXNiQWNjZXNzb3J5LFVzYkRldmljZSxGbVR1bmVyLFR2VHVuZSxMaW5lLFNwZGlmLEJsdWV0b290aEEyZHAsTG9vcGJhY2sKLSAgICB9Ci0gICAgRXhjbHVzaXZlQ3JpdGVyaW9uVHlwZSB7Ci0gICAgICAgICMKLSAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBhdWRpb19tb2RlX3QKLSAgICAgICAgIyBmcm9tIHN5c3RlbS9hdWRpby5oCi0gICAgICAgICMKLSAgICAgICAgQW5kcm9pZE1vZGVUeXBlICAgICAwOk5vcm1hbCwxOlJpbmdUb25lLDI6SW5DYWxsLDM6SW5Db21tdW5pY2F0aW9uCi0gICAgICAgICMKLSAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAotICAgICAgICAjCi0gICAgICAgIEZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvblR5cGUgICAgMDpGb3JjZU5vbmUsMTpGb3JjZVNwZWFrZXIsMzpGb3JjZUJ0U2NvCi0gICAgICAgICMKLSAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAotICAgICAgICAjCi0gICAgICAgIEZvcmNlVXNlRm9yTWVkaWFUeXBlICAgICAgICAgICAgMDpGb3JjZU5vbmUsMTpGb3JjZVNwZWFrZXIsMjpGb3JjZUhlYWRwaG9uZXMsNDpGb3JjZUJ0QTJkcCw1OkZvcmNlV2lyZWRBY2Nlc3NvcnksODpGb3JjZUFuYWxvZ0RvY2ssOTpGb3JjZURpZ2l0YWxEb2NrLDEwOkZvcmNlTm9CdEEyZHAKLSAgICAgICAgIwotICAgICAgICAjIFRoZSB2YWx1ZXMgb2YgdGhlIG1vZGUgTVVTVCBiZSBhbGlnbmVkIHdpdGggdGhlIGRlZmluaXRpb24gb2YgdGhlCi0gICAgICAgICMgYXVkaW9fcG9saWN5X2ZvcmNlZF9jb25maWdfdCBmcm9tIHN5c3RlbS9hdWRpby5oCi0gICAgICAgICMKLSAgICAgICAgRm9yY2VVc2VGb3JSZWNvcmRUeXBlICAgICAgICAgICAwOkZvcmNlTm9uZSwzOkZvcmNlQnRTY28sNTpGb3JjZVdpcmVkQWNjZXNzb3J5Ci0gICAgICAgICMKLSAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAotICAgICAgICAjCi0gICAgICAgIEZvcmNlVXNlRm9yRG9ja1R5cGUgICAgICAgICAgICAgMDpGb3JjZU5vbmUsNTpGb3JjZVdpcmVkQWNjZXNzb3J5LDY6Rm9yY2VCdENhckRvY2ssNzpGb3JjZUJ0RGVza0RvY2ssODpGb3JjZUFuYWxvZ0RvY2ssOTpGb3JjZURpZ2l0YWxEb2NrCi0gICAgICAgICMKLSAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW8uaAotICAgICAgICAjCi0gICAgICAgIEZvcmNlVXNlRm9yU3lzdGVtVHlwZSAgICAgICAgICAgMDpGb3JjZU5vbmUsMTE6Rm9yY2VTeXN0ZW1FbmZvcmNlZAotICAgICAgICAjCi0gICAgICAgICMgVGhlIHZhbHVlcyBvZiB0aGUgbW9kZSBNVVNUIGJlIGFsaWduZWQgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUKLSAgICAgICAgIyBhdWRpb19wb2xpY3lfZm9yY2VkX2NvbmZpZ190IGZyb20gc3lzdGVtL2F1ZGlvLmgKLSAgICAgICAgIwotICAgICAgICBGb3JjZVVzZUZvckhkbWlTeXN0ZW1BdWRpb1R5cGUgIDA6Rm9yY2VOb25lLDEyOkZvcmNlSGRtaVN5c3RlbUVuZm9yY2VkCi0gICAgICAgICMKLSAgICAgICAgIyBUaGUgdmFsdWVzIG9mIHRoZSBtb2RlIE1VU1QgYmUgYWxpZ25lZCB3aXRoIHRoZSBkZWZpbml0aW9uIG9mIHRoZQotICAgICAgICAjIGF1ZGlvX3BvbGljeV9mb3JjZWRfY29uZmlnX3QgZnJvbSBzeXN0ZW0vYXVkaW9fcG9saWN5LmgKLSAgICAgICAgIwotICAgICAgICBGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZFR5cGUgIDA6Rm9yY2VOb25lLDEzOkZvcmNlRW5jb2RlZFN1cnJvdW5kTmV2ZXIsMTQ6Rm9yY2VFbmNvZGVkU3Vycm91bmRBbHdheXMKLSAgICB9Ci0KLSAgICBDcml0ZXJpb24gewotICAgICAgICBBdmFpbGFibGVJbnB1dERldmljZXMgewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIElucHV0RGV2aWNlc01hc2tUeXBlCi0gICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgbm9uZQotICAgICAgICB9Ci0gICAgICAgIEF2YWlsYWJsZU91dHB1dERldmljZXMgewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIE91dHB1dERldmljZXNNYXNrVHlwZQotICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIG5vbmUKLSAgICAgICAgfQotICAgICAgICBUZWxlcGhvbnlNb2RlIHsKLSAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBBbmRyb2lkTW9kZVR5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBOb3JtYWwKLSAgICAgICAgfQotICAgICAgICBGb3JjZVVzZUZvckNvbW11bmljYXRpb24gewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEZvcmNlVXNlRm9yQ29tbXVuaWNhdGlvblR5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKLSAgICAgICAgfQotICAgICAgICBGb3JjZVVzZUZvck1lZGlhIHsKLSAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvck1lZGlhVHlwZQotICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIEZvcmNlTm9uZQotICAgICAgICB9Ci0gICAgICAgIEZvcmNlVXNlRm9yUmVjb3JkIHsKLSAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvclJlY29yZFR5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKLSAgICAgICAgfQotICAgICAgICBGb3JjZVVzZUZvckRvY2sgewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEZvcmNlVXNlRm9yRG9ja1R5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKLSAgICAgICAgfQotICAgICAgICBGb3JjZVVzZUZvclN5c3RlbSB7Ci0gICAgICAgICAgICBUeXBlICAgICAgICAgICAgRm9yY2VVc2VGb3JTeXN0ZW1UeXBlCi0gICAgICAgICAgICBEZWZhdWx0ICAgICAgICAgRm9yY2VOb25lCi0gICAgICAgIH0KLSAgICAgICAgRm9yY2VVc2VGb3JIZG1pU3lzdGVtQXVkaW8gewotICAgICAgICAgICAgVHlwZSAgICAgICAgICAgIEZvcmNlVXNlRm9ySGRtaVN5c3RlbUF1ZGlvVHlwZQotICAgICAgICAgICAgRGVmYXVsdCAgICAgICAgIEZvcmNlTm9uZQotICAgICAgICB9Ci0gICAgICAgIEZvcmNlVXNlRm9yRW5jb2RlZFN1cnJvdW5kIHsKLSAgICAgICAgICAgIFR5cGUgICAgICAgICAgICBGb3JjZVVzZUZvckVuY29kZWRTdXJyb3VuZFR5cGUKLSAgICAgICAgICAgIERlZmF1bHQgICAgICAgICBGb3JjZU5vbmUKLSAgICAgICAgfQotICAgIH0KLX0KLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvaW5jbHVkZS9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lY29uZmlndXJhYmxlL3dyYXBwZXIvaW5jbHVkZS9QYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlci5oCmluZGV4IDRjMWFjZmUuLjYyYjEyOWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWNvbmZpZ3VyYWJsZS93cmFwcGVyL2luY2x1ZGUvUGFyYW1ldGVyTWFuYWdlcldyYXBwZXIuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVjb25maWd1cmFibGUvd3JhcHBlci9pbmNsdWRlL1BhcmFtZXRlck1hbmFnZXJXcmFwcGVyLmgKQEAgLTIwLDYgKzIwLDcgQEAKICNpbmNsdWRlIDxzeXN0ZW0vYXVkaW9fcG9saWN5Lmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvUldMb2NrLmg+CisjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgogI2luY2x1ZGUgPGxpc3Q+CiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHN0cmluZz4KQEAgLTI3LDM5ICsyOCwzNCBAQAogCiBjbGFzcyBDUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3I7CiBjbGFzcyBJU2VsZWN0aW9uQ3JpdGVyaW9uSW50ZXJmYWNlOwotY2xhc3MgSVNlbGVjdGlvbkNyaXRlcmlvblR5cGVJbnRlcmZhY2U7CiBzdHJ1Y3QgY25vZGU7CiAKIGNsYXNzIFBhcmFtZXRlck1nclBsYXRmb3JtQ29ubmVjdG9yTG9nZ2VyOwogCi1uYW1lc3BhY2UgYW5kcm9pZAotewotbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQoteworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGF1ZGlvX3BvbGljeSB7CisKK3VzaW5nIFZhbHVlUGFpciA9IHN0ZDo6cGFpcjx1aW50MzJfdCwgc3RkOjpzdHJpbmc+OwordXNpbmcgVmFsdWVQYWlycyA9IHN0ZDo6dmVjdG9yPFZhbHVlUGFpcj47CiAKIGNsYXNzIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyCiB7CiBwcml2YXRlOgotICAgIHR5cGVkZWYgc3RkOjpwYWlyPGludCwgY29uc3QgY2hhciAqPiBDcml0ZXJpb25UeXBlVmFsdWVQYWlyOwotCi0gICAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgSVNlbGVjdGlvbkNyaXRlcmlvbkludGVyZmFjZSAqPiBDcml0ZXJpb25Db2xsZWN0aW9uOwotICAgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIElTZWxlY3Rpb25Dcml0ZXJpb25UeXBlSW50ZXJmYWNlICo+IENyaXRlcmlvblR5cGVDb2xsZWN0aW9uOwotICAgIHR5cGVkZWYgQ3JpdGVyaW9uQ29sbGVjdGlvbjo6aXRlcmF0b3IgQ3JpdGVyaW9uTWFwSXRlcmF0b3I7Ci0gICAgdHlwZWRlZiBDcml0ZXJpb25Db2xsZWN0aW9uOjpjb25zdF9pdGVyYXRvciBDcml0ZXJpb25NYXBDb25zdEl0ZXJhdG9yOwotICAgIHR5cGVkZWYgQ3JpdGVyaW9uVHlwZUNvbGxlY3Rpb246Oml0ZXJhdG9yIENyaXRlcmlvblR5cGVNYXBJdGVyYXRvcjsKLSAgICB0eXBlZGVmIENyaXRlcmlvblR5cGVDb2xsZWN0aW9uOjpjb25zdF9pdGVyYXRvciBDcml0ZXJpYVR5cGVNYXBDb25zdEl0ZXJhdG9yOworICAgIHVzaW5nIENyaXRlcmlhID0gc3RkOjptYXA8c3RkOjpzdHJpbmcsIElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKj47CiAKIHB1YmxpYzoKLSAgICBQYXJhbWV0ZXJNYW5hZ2VyV3JhcHBlcigpOworICAgIFBhcmFtZXRlck1hbmFnZXJXcmFwcGVyKGJvb2wgZW5hYmxlU2NoZW1hVmVyaWZpY2F0aW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNjaGVtYVVyaSA9IHt9KTsKICAgICB+UGFyYW1ldGVyTWFuYWdlcldyYXBwZXIoKTsKIAogICAgIC8qKgogICAgICAqIFN0YXJ0cyB0aGUgcGxhdGZvcm0gc3RhdGUgc2VydmljZS4KICAgICAgKiBJdCBzdGFydHMgdGhlIHBhcmFtZXRlciBmcmFtZXdvcmsgcG9saWN5IGluc3RhbmNlLgorICAgICAqIEBwYXJhbVtvdXRdIGNvbnRhaW5zIGh1bWFuIHJlYWRhYmxlIGVycm9yIGlmIHN0YXJ0cyBmYWlsZWQKICAgICAgKgotICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgc3VjY2VzcywgZXJyb3IgY29kZSBvdGhlcndpc2UuCisgICAgICogQHJldHVybiBOT19FUlJPUiBpZiBzdWNjZXNzLCBlcnJvciBjb2RlIG90aGVyd2lzZSwgYW5kIGVycm9yIGlzIHNldCB0byBodW1hbiByZWFkYWJsZSBzdHJpbmcuCiAgICAgICovCi0gICAgc3RhdHVzX3Qgc3RhcnQoKTsKKyAgICBzdGF0dXNfdCBzdGFydChzdGQ6OnN0cmluZyAmZXJyb3IpOwogCiAgICAgLyoqCiAgICAgICogVGhlIGZvbGxvd2luZyBBUEkgd3JhcCBwb2xpY3kgYWN0aW9uIHRvIGNyaXRlcmlhCkBAIC0xMjAsNiArMTE2LDI4IEBACiAgICAgICovCiAgICAgc3RhdHVzX3Qgc2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcyhhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlcyk7CiAKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlIHByb3BhZ2F0ZXMgYSBzdGF0ZSBldmVudCBvbiBhIGdpdmVuIGRldmljZShzKQorICAgICAqIEBwYXJhbSB0eXBlIGJpdCBtYXNrIG9mIHRoZSBkZXZpY2Ugd2hvc2Ugc3RhdGUgaGFzIGNoYW5nZWQKKyAgICAgKiBAcGFyYW0gYWRkcmVzcyBvZiB0aGUgZGV2aWNlIHdob3NlIHN0YXRlIGhhcyBjaGFuZ2VkCisgICAgICogQHBhcmFtIHN0YXRlIG5ldyBzdGF0ZSBvZiB0aGUgZ2l2ZW4gZGV2aWNlCisgICAgICogQHJldHVybiBOT19FUlJPUiBpZiBuZXcgc3RhdGUgY29ycmV0bHkgcHJvcGFnYXRlZCB0byBFbmdpbmUgUGFyYW1ldGVyLUZyYW1ld29yaywgZXJyb3IKKyAgICAgKiBjb2RlIG90aGVyd2lzZS4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IHR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nIGFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSk7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgYWRkQ3JpdGVyaW9uIHRvIHRoZSBwb2xpY3kgcGZ3CisgICAgICogQHBhcmFtIG5hbWUgb2YgdGhlIGNyaXRlcmlvbgorICAgICAqIEBwYXJhbSBpc0luY2x1c2l2ZSBpZiB0cnVlLCBpbmNsdXNpdmUsIGlmIGZhbHNlIGV4Y2x1c2l2ZSBjcml0ZXJpb24gdHlwZQorICAgICAqIEBwYXJhbSBwYWlycyBvZiBudW1lcmljYWwvbGl0ZXJhbCB2YWx1ZXMgb2YgdGhlIGNyaXRlcmlvbgorICAgICAqIEBwYXJhbSBkZWZhdWx0VmFsdWUgcHJvdmlkZWQgYXMgbGl0ZXJhbC4KKyAgICAgKiBAcmV0dXJuCisgICAgICovCisgICAgc3RhdHVzX3QgYWRkQ3JpdGVyaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLCBib29sIGlzSW5jbHVzaXZlLCBWYWx1ZVBhaXJzIHBhaXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmZGVmYXVsdFZhbHVlKTsKKwogcHJpdmF0ZToKICAgICAvKioKICAgICAgKiBBcHBseSB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgcGxhdGZvcm0gb24gdGhlIHBvbGljeSBwYXJhbWV0ZXIgbWFuYWdlci4KQEAgLTEzMyw5NiArMTUxLDcgQEAKICAgICAgKi8KICAgICB2b2lkIGFwcGx5UGxhdGZvcm1Db25maWd1cmF0aW9uKCk7CiAKLSAgICAvKioKLSAgICAgKiBMb2FkIHRoZSBjcml0ZXJpb24gY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSBwYXRoIENyaXRlcmlvbiBjb25mIGZpbGUgcGF0aC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gTk9fRVJST1IgaXMgcGFyc2luZyBzdWNjZXNzZnVsLCBlcnJvciBjb2RlIG90aGVyd2lzZS4KLSAgICAgKi8KLSAgICBzdGF0dXNfdCBsb2FkQXVkaW9Qb2xpY3lDcml0ZXJpYUNvbmZpZyhjb25zdCBjaGFyICpwYXRoKTsKLQotICAgIC8qKgotICAgICAqIEFkZCBhIGNyaXRlcmlvbiB0eXBlIHRvIEF1ZGlvUG9saWN5UGZ3LgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSB0eXBlTmFtZSBvZiB0aGUgUEZXIGNyaXRlcmlvbiB0eXBlLgotICAgICAqIEBwYXJhbVtpbl0gaXNJbmNsdXNpdmUgYXR0cmlidXRlIG9mIHRoZSBjcml0ZXJpb24gdHlwZS4KLSAgICAgKi8KLSAgICB2b2lkIGFkZENyaXRlcmlvblR5cGUoY29uc3Qgc3RkOjpzdHJpbmcgJnR5cGVOYW1lLCBib29sIGlzSW5jbHVzaXZlKTsKLQotICAgIC8qKgotICAgICAqIEFkZCBhIGNyaXRlcmlvbiB0eXBlIHZhbHVlIHBhaXIgdG8gQXVkaW9Qb2xpY3lQZncuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHR5cGVOYW1lIGNyaXRlcmlvbiB0eXBlIG5hbWUgdG8gd2hpY2ggdGhpcyB2YWx1ZSBwYWlyIGlzIGFkZGVkIHRvLgotICAgICAqIEBwYXJhbVtpbl0gbnVtZXJpYyBwYXJ0IG9mIHRoZSB2YWx1ZSBwYWlyLgotICAgICAqIEBwYXJhbVtpbl0gbGl0ZXJhbCBwYXJ0IG9mIHRoZSB2YWx1ZSBwYWlyLgotICAgICAqLwotICAgIHZvaWQgYWRkQ3JpdGVyaW9uVHlwZVZhbHVlUGFpcihjb25zdCBzdGQ6OnN0cmluZyAmdHlwZU5hbWUsIHVpbnQzMl90IG51bWVyaWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZsaXRlcmFsKTsKLQotICAgIC8qKgotICAgICAqIEFkZCBhIGNyaXRlcmlvbiB0byBBdWRpb1BvbGljeVBmdy4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gbmFtZSBvZiB0aGUgUEZXIGNyaXRlcmlvbi4KLSAgICAgKiBAcGFyYW1baW5dIHR5cGVOYW1lIGNyaXRlcmlvbiB0eXBlIG5hbWUgdG8gd2hpY2ggdGhpcyBjcml0ZXJpb24gaXMgYXNzb2NpYXRlZCB0by4KLSAgICAgKiBAcGFyYW1baW5dIGRlZmF1bHRMaXRlcmFsVmFsdWUgb2YgdGhlIFBGVyBjcml0ZXJpb24uCi0gICAgICovCi0gICAgdm9pZCBhZGRDcml0ZXJpb24oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnR5cGVOYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZkZWZhdWx0TGl0ZXJhbFZhbHVlKTsKLSAgICAvKioKLSAgICAgKiBQYXJzZSBhbmQgbG9hZCB0aGUgaW5jbHVzaXZlIGNyaXRlcmlvbiB0eXBlIGZyb20gY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSByb290IG5vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKi8KLSAgICB2b2lkIGxvYWRJbmNsdXNpdmVDcml0ZXJpb25UeXBlKGNub2RlICpyb290KTsKLQotICAgIC8qKgotICAgICAqIFBhcnNlIGFuZCBsb2FkIHRoZSBleGNsdXNpdmUgY3JpdGVyaW9uIHR5cGUgZnJvbSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqLwotICAgIHZvaWQgbG9hZEV4Y2x1c2l2ZUNyaXRlcmlvblR5cGUoY25vZGUgKnJvb3QpOwotCi0gICAgLyoqCi0gICAgICogUGFyc2UgYW5kIGxvYWQgdGhlIGNyaXRlcmlhIGZyb20gY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSByb290IG5vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKi8KLSAgICB2b2lkIGxvYWRDcml0ZXJpYShjbm9kZSAqcm9vdCk7Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhbmQgbG9hZCBhIGNyaXRlcmlvbiBmcm9tIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKgotICAgICAqIEBwYXJhbVtpbl0gcm9vdCBub2RlIG9mIHRoZSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICovCi0gICAgdm9pZCBsb2FkQ3JpdGVyaW9uKGNub2RlICpyb290KTsKLQotICAgIC8qKgotICAgICAqIFBhcnNlIGFuZCBsb2FkIHRoZSBjcml0ZXJpb24gdHlwZXMgZnJvbSBjb25maWd1cmF0aW9uIGZpbGUuCi0gICAgICoKLSAgICAgKiBAcGFyYW1baW5dIHJvb3Qgbm9kZSBvZiB0aGUgY29uZmlndXJhdGlvbiBmaWxlCi0gICAgICogQHBhcmFtW2luXSBpc0luY2x1c2l2ZSB0cnVlIGlmIGluY2x1c2l2ZSwgZmFsc2UgaXMgZXhjbHVzaXZlLgotICAgICAqLwotICAgIHZvaWQgbG9hZENyaXRlcmlvblR5cGUoY25vZGUgKnJvb3QsIGJvb2wgaXNJbmNsdXNpdmUpOwotCi0gICAgLyoqCi0gICAgICogTG9hZCB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSByb290IG5vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS4KLSAgICAgKi8KLSAgICB2b2lkIGxvYWRDb25maWcoY25vZGUgKnJvb3QpOwotCi0gICAgLyoqCi0gICAgICogUGFyc2UgYW5kIGxvYWQgdGhlIGNoaWRyZW4gbm9kZSBmcm9tIGEgZ2l2ZW4gcm9vdCBub2RlLgotICAgICAqCi0gICAgICogQHBhcmFtW2luXSByb290IG5vZGUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZQotICAgICAqIEBwYXJhbVtvdXRdIGRlZmF1bHRWYWx1ZSBvZiB0aGUgcGFyYW1ldGVyIG1hbmFnZXIgZWxlbWVudCB0byByZXRyaWV2ZS4KLSAgICAgKiBAcGFyYW1bb3V0XSB0eXBlIG9mIHRoZSBwYXJhbWV0ZXIgbWFuYWdlciBlbGVtZW50IHRvIHJldHJpZXZlLgotICAgICovCi0gICAgdm9pZCBwYXJzZUNoaWxkcmVuKGNub2RlICpyb290LCBzdGQ6OnN0cmluZyAmZGVmYXVsdFZhbHVlLCBzdGQ6OnN0cmluZyAmdHlwZSk7Ci0KLSAgICAvKioKKyAgICAgLyoqCiAgICAgICogUmV0cmlldmUgYW4gZWxlbWVudCBmcm9tIGEgbWFwIGJ5IGl0cyBuYW1lLgogICAgICAqCiAgICAgICogQHRwYXJhbSBUIHR5cGUgb2YgZWxlbWVudCB0byBzZWFyY2guCkBAIC0yNjYsOCArMTk1LDcgQEAKIAogICAgIGJvb2wgaXNWYWx1ZVZhbGlkRm9yQ3JpdGVyaW9uKElTZWxlY3Rpb25Dcml0ZXJpb25JbnRlcmZhY2UgKmNyaXRlcmlvbiwgaW50IHZhbHVlVG9DaGVjayk7CiAKLSAgICBDcml0ZXJpb25UeXBlQ29sbGVjdGlvbiBtUG9saWN5Q3JpdGVyaW9uVHlwZXM7IC8qKjwgUG9saWN5IENyaXRlcmlvbiBUeXBlIG1hcC4gKi8KLSAgICBDcml0ZXJpb25Db2xsZWN0aW9uIG1Qb2xpY3lDcml0ZXJpYTsgLyoqPCBQb2xpY3kgQ3JpdGVyaW9uIE1hcC4gKi8KKyAgICBDcml0ZXJpYSBtUG9saWN5Q3JpdGVyaWE7IC8qKjwgUG9saWN5IENyaXRlcmlvbiBNYXAuICovCiAKICAgICBDUGFyYW1ldGVyTWdyUGxhdGZvcm1Db25uZWN0b3IgKm1QZndDb25uZWN0b3I7IC8qKjwgUG9saWN5IFBhcmFtZXRlciBNYW5hZ2VyIGNvbm5lY3Rvci4gKi8KICAgICBQYXJhbWV0ZXJNZ3JQbGF0Zm9ybUNvbm5lY3RvckxvZ2dlciAqbVBmd0Nvbm5lY3RvckxvZ2dlcjsgLyoqPCBQb2xpY3kgUEZXIGxvZ2dlci4gKi8KQEAgLTI4NCw2ICsyMTIsNyBAQAogICAgIHN0cnVjdCBwYXJhbWV0ZXJNYW5hZ2VyRWxlbWVudFN1cHBvcnRlZDsKIAogICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtUG9saWN5UGZ3RGVmYXVsdENvbmZGaWxlTmFtZTsgLyoqPCBEZWZhdWx0IFBvbGljeSBQRlcgdG9wIGZpbGUgbmFtZS4qLworICAgIHN0YXRpYyBjb25zdCBjaGFyICpjb25zdCBtUG9saWN5UGZ3VmVuZG9yQ29uZkZpbGVOYW1lOyAvKio8IFZlbmRvciBQb2xpY3kgUEZXIHRvcCBmaWxlIG5hbWUuKi8KIH07CiAKIH0gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhZjQxNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQuYnAKQEAgLTAsMCArMSwzMiBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeWVuZ2luZWRlZmF1bHQiLAorICAgIHNyY3M6IFsKKyAgICAgICAgInNyYy9FbmdpbmUuY3BwIiwKKyAgICAgICAgInNyYy9FbmdpbmVJbnN0YW5jZS5jcHAiLAorICAgIF0sCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItZnZpc2liaWxpdHk9aGlkZGVuIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdleHRyYSIsCisgICAgXSwKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYmFzZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5Y29tbW9uIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzIiwKKyAgICBdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMiLAorICAgICAgICAibGliYXVkaW9wb2xpY3llbmdpbmVfY29tbW9uIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lX2NvbmZpZyIsCisgICAgXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5IiwKKyAgICAgICAgImxpYnhtbDIiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L0FuZHJvaWQubWsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzN2Q1YmIuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotTE9DQUxfUEFUSCA6PSAkKGNhbGwgbXktZGlyKQotCi0jIENvbXBvbmVudCBidWlsZAotIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLUxPQ0FMX1NSQ19GSUxFUyA6PSBcCi0gICAgc3JjL0VuZ2luZS5jcHAgXAotICAgIHNyYy9FbmdpbmVJbnN0YW5jZS5jcHAgXAotCi1hdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbiA6PSBcCi0gICAgJChMT0NBTF9QQVRIKS9pbmNsdWRlIFwKLSAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UKLQotTE9DQUxfQ0ZMQUdTICs9IFwKLSAgICAtV2FsbCBcCi0gICAgLVdlcnJvciBcCi0gICAgLVdleHRyYSBcCi0KLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSBcCi0gICAgJChhdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbikKLQotTE9DQUxfQ19JTkNMVURFUyA6PSBcCi0gICAgJChhdWRpb19wb2xpY3lfZW5naW5lX2luY2x1ZGVzX2NvbW1vbikgXAotICAgICQoVEFSR0VUX09VVF9IRUFERVJTKS9odyBcCi0gICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGZyYW1ld29ya3MtYXYpIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpIFwKLSAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYmlvbmljKSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9jb21tb24vaW5jbHVkZQotCi1MT0NBTF9NVUxUSUxJQiA6PSAkKEFVRElPU0VSVkVSX01VTFRJTElCKQotCi1MT0NBTF9NT0RVTEUgOj0gbGliYXVkaW9wb2xpY3llbmdpbmVkZWZhdWx0Ci1MT0NBTF9NT0RVTEVfVEFHUyA6PSBvcHRpb25hbAotCi1MT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IGxpYmJhc2VfaGVhZGVycwotCi1MT0NBTF9TVEFUSUNfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTICs9IFwKLSAgICBsaWJsb2cgXAotICAgIGxpYmN1dGlscyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYm1lZGlhX2hlbHBlcgotCi1pbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGJmY2FhMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvQW5kcm9pZC5icApAQCAtMCwwICsxLDQ2IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gSW1wb3J0IHRoaXMgbmFtZXNwYWNlIGluIG9yZGVyIHRvIHVzZSBBT1NQIFBob25lIHdpdGggRGVmYXVsdCBFbmdpbmUgY29uZmlndXJhdGlvbiBleGFtcGxlCisKK3Nvb25nX25hbWVzcGFjZSB7Cit9CisKK3ByZWJ1aWx0X2V0YyB7CisgICAgbmFtZTogImF1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmM6ICJwaG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX2NvbmZpZ3VyYXRpb24ueG1sIiwKKyAgICByZXF1aXJlZDogWworICAgICAgICAiOmF1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sIiwKKyAgICAgICAgIjphdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sIiwKKyAgICAgICAgIjphdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwiLAorICAgIF0sCit9CitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmM6ICJwaG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwiLAorfQorcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAiYXVkaW9fcG9saWN5X2VuZ2luZV9zdHJlYW1fdm9sdW1lcy54bWwiLAorICAgIHZlbmRvcjogdHJ1ZSwKKyAgICBzcmM6ICJwaG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbCIsCit9CitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJhdWRpb19wb2xpY3lfZW5naW5lX2RlZmF1bHRfc3RyZWFtX3ZvbHVtZXMueG1sIiwKKyAgICB2ZW5kb3I6IHRydWUsCisgICAgc3JjOiAicGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbCIsCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfY29uZmlndXJhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhMzNiNAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9jb25maWd1cmF0aW9uLnhtbApAQCAtMCwwICsxLDI0IEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgICAtLT4KKworPGNvbmZpZ3VyYXRpb24gdmVyc2lvbj0iMS4wIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+CisKKyAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwiLz4KKyAgICA8eGk6aW5jbHVkZSBocmVmPSJhdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbCIvPgorICAgIDx4aTppbmNsdWRlIGhyZWY9ImF1ZGlvX3BvbGljeV9lbmdpbmVfZGVmYXVsdF9zdHJlYW1fdm9sdW1lcy54bWwiLz4KKworPC9jb25maWd1cmF0aW9uPgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfZGVmYXVsdF9zdHJlYW1fdm9sdW1lcy54bWwgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfZGVmYXVsdF9zdHJlYW1fdm9sdW1lcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjFlNmRkNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9kZWZhdWx0X3N0cmVhbV92b2x1bWVzLnhtbApAQCAtMCwwICsxLDEzNiBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gRGVmYXVsdCBWb2x1bWUgVGFibGVzIGluY2x1ZGVkIGJ5IEF1ZGlvIFBvbGljeSBDb25maWd1cmF0aW9uIGZpbGUgLS0+Cis8IS0tIEZ1bGwgRGVmYXVsdCBWb2x1bWUgdGFibGUgZm9yIGFsbCBkZXZpY2UgY2F0ZWdvcnkgLS0+Cis8dm9sdW1lcz4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkZVTExfU0NBTEVfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIEZ1bGwgU2NhbGUgcmVmZXJlbmNlIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjAsMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJTSUxFTlRfVk9MVU1FX0NVUlZFIj4KKyAgICAgICAgPHBvaW50PjAsLTk2MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLC05NjAwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IFN5c3RlbSByZWZlcmVuY2UgVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtMjQwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4zMywtMTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42NiwtMTIwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsLTYwMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IE1lZGlhIHJlZmVyZW5jZSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tRGVmYXVsdCBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC00OTUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjMzLC0zMzUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjY2LC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tIERlZmF1bHQgaXMgU3BlYWtlciBNZWRpYSBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX1NQRUFLRVJfU1lTVEVNX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IGlzIFNwZWFrZXIgU3lzdGVtIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTQ2ODA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NDIsLTIwNzA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+ODUsLTU0MDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS1EZWZhdWx0IFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICAgICAgPHBvaW50PjEsLTQ5NTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MzMsLTMzNTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjYsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IGlzIEV4dCBNZWRpYSBTeXN0ZW0gVm9sdW1lIEN1cnZlIC0tPgorICAgICAgICA8cG9pbnQ+MSwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMjEwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsLTEwMDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBIZWFyaW5nIEFpZCBWb2x1bWUgQ3VydmUgLS0+CisgICAgICAgIDxwb2ludD4xLC0xMjcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtODAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgorICAgIDwhLS0gTm9uLW11dGFibGUgZGVmYXVsdCB2b2x1bWUgY3VydmVzOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KKyAgICA8IS0tICAgICAqIGZpcnN0IHBvaW50IGlzIGFsd2F5cyBmb3IgaW5kZXggMCAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+CisgICAgPCEtLSAgICAgKiBhdHRlbnVhdGlvbiBpcyBzbWFsbCBlbm91Z2ggdGhhdCBzdHJlYW0gY2FuIHN0aWxsIGJlIGhlYXJkIC0tPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9WT0xVTUVfQ1VSVkUiPgorICAgIDwhLS0gRGVmYXVsdCBub24tbXV0YWJsZSByZWZlcmVuY2UgVm9sdW1lIEN1cnZlIC0tPgorICAgIDwhLS0gICAgICAgIGJhc2VkIG9uIERFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIC0tPgorICAgICAgICA8cG9pbnQ+MCwtNTgwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4yMCwtNDAwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD42MCwtMTcwMDwvcG9pbnQ+CisgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX0hFQURTRVRfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tRGVmYXVsdCBub24tbXV0YWJsZSBWb2x1bWUgQ3VydmUgZm9yIGhlYWRzZXQgLS0+CisgICAgPCEtLSAgICBiYXNlZCBvbiBERUZBVUxUX0RFVklDRV9DQVRFR09SWV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTQ5NTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MzMsLTMzNTA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+NjYsLTE3MDA8L3BvaW50PgorICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgIDwvcmVmZXJlbmNlPgorICAgIDxyZWZlcmVuY2UgbmFtZT0iREVGQVVMVF9OT05fTVVUQUJMRV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IG5vbi1tdXRhYmxlIFNwZWFrZXIgVm9sdW1lIEN1cnZlIC0tPgorICAgIDwhLS0gICAgYmFzZWQgb24gREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfRUFSUElFQ0VfVk9MVU1FX0NVUlZFIj4KKyAgICA8IS0tRGVmYXVsdCBub24tbXV0YWJsZSBWb2x1bWUgQ3VydmUgLS0+CisgICAgPCEtLSAgICBiYXNlZCBvbiBERUZBVUxUX0RFVklDRV9DQVRFR09SWV9FQVJQSUVDRV9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC00OTUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjMzLC0zMzUwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjY2LC0xNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKyAgICA8cmVmZXJlbmNlIG5hbWU9IkRFRkFVTFRfTk9OX01VVEFCTEVfRVhUX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IG5vbi1tdXRhYmxlIEV4dCBNZWRpYSBTeXN0ZW0gVm9sdW1lIEN1cnZlIC0tPgorICAgIDwhLS0gICAgIGJhc2VkIG9uIERFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUgLS0+CisgICAgICAgIDxwb2ludD4wLC01ODAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC0yMTAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwtMTAwMDwvcG9pbnQ+CisgICAgPC9yZWZlcmVuY2U+CisgICAgPHJlZmVyZW5jZSBuYW1lPSJERUZBVUxUX05PTl9NVVRBQkxFX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSI+CisgICAgPCEtLSBEZWZhdWx0IG5vbi1tdXRhYmxlIEhlYXJpbmcgQWlkIFZvbHVtZSBDdXJ2ZSAtLT4KKyAgICA8IS0tICAgICBiYXNlZCBvbiBERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSAtLT4KKyAgICAgICAgPHBvaW50PjAsLTEyNzAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjIwLC04MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjYwLC00MDAwPC9wb2ludD4KKyAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICA8L3JlZmVyZW5jZT4KKzwvdm9sdW1lcz4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3Byb2R1Y3Rfc3RyYXRlZ2llcy54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTczODhkYQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvY29uZmlnL2V4YW1wbGUvcGhvbmUvYXVkaW9fcG9saWN5X2VuZ2luZV9wcm9kdWN0X3N0cmF0ZWdpZXMueG1sCkBAIC0wLDAgKzEsMTAxIEBACis8P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ieWVzIj8+Cis8IS0tIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisKKyAgICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgICAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAgICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisKKyAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKworICAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgICAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICAgICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgICAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICAgICAtLT4KKworPFByb2R1Y3RTdHJhdGVnaWVzPgorCisgICAgPCEtLSAiaGlkZGVuIHN0cmF0ZWdpZXMiIGxpa2UgVFRTLCBlbmZvcmNlZCBhdWRpYmxlOgorICAgICAgICAgICAgU2hhbGwgd2UgZXhwb3NlIHRoZW0gaGVyZSBvciBrZWVwIGl0IGhhcmQgY29kZWQgLS0+CisKKyAgICA8IS0tIFVzZWQgdG8gaWRlbnRpZnkgdGhlIHZvbHVtZSBvZiBhdWRpbyBzdHJlYW1zIGZvciBlbmZvcmNlZCBzeXN0ZW0gc291bmRzIGluIGNlcnRhaW4KKyAgICAgICAgIGNvdW50cmllcyAoZS5nLiBjYW1lcmEgaW4gSmFwYW4pCisgICAgICAgICBUaGlzIHN0cmF0ZWd5IHdpbGwgb25seSBoYXZlIGhpZ2hlciBwcmlvcml0eSB0aGFuIHBob25lIGlmIGZvcmNlIGZvciBzeXN0ZW0gaXMgc2V0IHRvCisgICAgICAgICBlbmZvcmNlZC4gLS0+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1BIT05FIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCIgdm9sdW1lR3JvdXA9InZvaWNlX2NhbGwiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPIiB2b2x1bWVHcm91cD0iYmx1ZXRvb3RoX3NjbyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPEZsYWdzIHZhbHVlPSJBVURJT19GTEFHX1NDTyIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9TT05JRklDQVRJT04iPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9SSU5HIiB2b2x1bWVHcm91cD0icmluZyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fVEVMRVBIT05ZX1JJTkdUT05FIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0FMQVJNIiB2b2x1bWVHcm91cD0iYWxhcm0iPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQUxBUk0iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUiIHZvbHVtZUdyb3VwPSJlbmZvcmNlZF9hdWRpYmxlIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8RmxhZ3MgdmFsdWU9IkFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPFByb2R1Y3RTdHJhdGVneSBuYW1lPSJTVFJBVEVHWV9BQ0NFU1NJQklMSVRZIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSIgdm9sdW1lR3JvdXA9ImFjY2Vzc2liaWxpdHkiPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgPC9BdHRyaWJ1dGVzR3JvdXA+CisgICAgPC9Qcm9kdWN0U3RyYXRlZ3k+CisKKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMIj4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OIiB2b2x1bWVHcm91cD0ibm90aWZpY2F0aW9uIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfTUVESUEiPgorICAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fTVVTSUMiIHZvbHVtZUdyb3VwPSJtdXNpYyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9NRURJQSIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9HQU1FIi8+IDwvQXR0cmlidXRlcz4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX0FTU0lTVEFOVCIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPFVzYWdlIHZhbHVlPSJBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UiLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+PC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICAgICAgPEF0dHJpYnV0ZXNHcm91cCBzdHJlYW1UeXBlPSJBVURJT19TVFJFQU1fQVNTSVNUQU5UIiB2b2x1bWVHcm91cD0iYXNzaXN0YW50Ij4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPgorICAgICAgICAgICAgICAgIDxDb250ZW50VHlwZSB2YWx1ZT0iQVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCIvPgorICAgICAgICAgICAgICAgIDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5UIi8+CisgICAgICAgICAgICA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgICAgICA8QXR0cmlidXRlc0dyb3VwIHN0cmVhbVR5cGU9IkFVRElPX1NUUkVBTV9TWVNURU0iIHZvbHVtZUdyb3VwPSJzeXN0ZW0iPgorICAgICAgICAgICAgPEF0dHJpYnV0ZXM+IDxVc2FnZSB2YWx1ZT0iQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04iLz4gPC9BdHRyaWJ1dGVzPgorICAgICAgICA8L0F0dHJpYnV0ZXNHcm91cD4KKyAgICA8L1Byb2R1Y3RTdHJhdGVneT4KKworICAgIDxQcm9kdWN0U3RyYXRlZ3kgbmFtZT0iU1RSQVRFR1lfRFRNRiI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX0RUTUYiIHZvbHVtZUdyb3VwPSJkdG1mIj4KKyAgICAgICAgICAgIDxBdHRyaWJ1dGVzPiA8VXNhZ2UgdmFsdWU9IkFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT05fU0lHTkFMTElORyIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCisgICAgPCEtLSBVc2VkIHRvIGlkZW50aWZ5IHRoZSB2b2x1bWUgb2YgYXVkaW8gc3RyZWFtcyBleGNsdXNpdmVseSB0cmFuc21pdHRlZCB0aHJvdWdoIHRoZSAgc3BlYWtlcgorICAgICAgICAgKFRUUykgb2YgdGhlIGRldmljZSAtLT4KKyAgICA8UHJvZHVjdFN0cmF0ZWd5IG5hbWU9IlNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUiI+CisgICAgICAgIDxBdHRyaWJ1dGVzR3JvdXAgc3RyZWFtVHlwZT0iQVVESU9fU1RSRUFNX1RUUyIgdm9sdW1lR3JvdXA9InR0cyI+CisgICAgICAgICAgICA8QXR0cmlidXRlcz4gPEZsYWdzIHZhbHVlPSJBVURJT19GTEFHX0JFQUNPTiIvPiA8L0F0dHJpYnV0ZXM+CisgICAgICAgIDwvQXR0cmlidXRlc0dyb3VwPgorICAgIDwvUHJvZHVjdFN0cmF0ZWd5PgorCis8L1Byb2R1Y3RTdHJhdGVnaWVzPgorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2NvbmZpZy9leGFtcGxlL3Bob25lL2F1ZGlvX3BvbGljeV9lbmdpbmVfc3RyZWFtX3ZvbHVtZXMueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWMzODk2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9jb25maWcvZXhhbXBsZS9waG9uZS9hdWRpb19wb2xpY3lfZW5naW5lX3N0cmVhbV92b2x1bWVzLnhtbApAQCAtMCwwICsxLDIyMSBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKzwhLS0gVm9sdW1lIHNlY3Rpb24gZGVmaW5lcyBhIHZvbHVtZSBjdXJ2ZSBmb3IgYSBnaXZlbiB1c2UgY2FzZSBhbmQgZGV2aWNlIGNhdGVnb3J5LgorSXQgY29udGFpbnMgYSBsaXN0IG9mIHBvaW50cyBvZiB0aGlzIGN1cnZlIGV4cHJlc3NpbmcgdGhlIGF0dGVudWF0aW9uIGluIE1pbGxpYmVscyBmb3IgYSBnaXZlbgordm9sdW1lIGluZGV4IGZyb20gMCB0byAxMDAuCis8dm9sdW1lIGRldmljZUNhdGVnb3J5PeKAneKAnT4KKzxwb2ludD4wLC05NjAwPC9wb2ludD4KKzxwb2ludD4xMDAsMDwvcG9pbnQ+Cis8L3ZvbHVtZT4KKy0tPgorCis8dm9sdW1lR3JvdXBzPgorICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+dm9pY2VfY2FsbDwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjE8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+NzwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC00MjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMjgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTE0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9TUEVBS0VSIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTYwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIj4KKyAgICAgICAgICAgIDxwb2ludD4wLC0yNzAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4zMywtMTgwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+NjYsLTkwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MTAwLDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5zeXN0ZW08L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtMzAwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0yMjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE4MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjEsLTUxMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjU3LC0yODAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD43MSwtMjUwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+ODUsLTIzMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwtMjEwMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8IS0tdm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLy0tPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5yaW5nPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfSEVBRFNFVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+bXVzaWM8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4PjI1PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9ERVZJQ0VfQ0FURUdPUllfU1BFQUtFUl9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FWFRfTUVESUEiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiAgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPmFsYXJtPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MTwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD43PC9pbmRleE1heD4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQURTRVQiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1NQRUFLRVJfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfRVhUX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiIHJlZj0iREVGQVVMVF9OT05fTVVUQUJMRV9IRUFSSU5HX0FJRF9WT0xVTUVfQ1VSVkUiLz4KKyAgICA8L3ZvbHVtZUdyb3VwPgorCisgICAgPHZvbHVtZUdyb3VwPgorICAgICAgICA8bmFtZT5ub3RpZmljYXRpb248L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9IRUFEU0VUX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1NZU1RFTV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0hFQURTRVRfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+Ymx1ZXRvb3RoX3NjbzwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtMjQwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTE2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC04MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjEwMCwwPC9wb2ludD4KKyAgICAgICAgPC92b2x1bWU+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSI+CisgICAgICAgICAgICA8cG9pbnQ+MCwtNDIwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI4MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0xNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsMDwvcG9pbnQ+CisgICAgICAgIDwvdm9sdW1lPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfTUVESUFfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPmVuZm9yY2VkX2F1ZGlibGU8L25hbWU+CisgICAgICAgIDxpbmRleE1pbj4wPC9pbmRleE1pbj4KKyAgICAgICAgPGluZGV4TWF4Pjc8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtMzAwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0yMjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE4MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjEsLTM0MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjcxLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTIwMDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPCEtLXZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8tLT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+ZHRtZjwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCI+CisgICAgICAgICAgICA8cG9pbnQ+MSwtMzAwMDwvcG9pbnQ+CisgICAgICAgICAgICA8cG9pbnQ+MzMsLTI2MDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjY2LC0yMjAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE4MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiPgorICAgICAgICAgICAgPHBvaW50PjEsLTQwMDA8L3BvaW50PgorICAgICAgICAgICAgPHBvaW50PjcxLC0yNDAwPC9wb2ludD4KKyAgICAgICAgICAgIDxwb2ludD4xMDAsLTE0MDA8L3BvaW50PgorICAgICAgICA8L3ZvbHVtZT4KKyAgICAgICAgPCEtLXZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iREVGQVVMVF9TWVNURU1fVk9MVU1FX0NVUlZFIi8tLT4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IkRFRkFVTFRfU1lTVEVNX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0hFQVJJTkdfQUlEIiByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+dHRzPC9uYW1lPgorICAgICAgICA8aW5kZXhNaW4+MDwvaW5kZXhNaW4+CisgICAgICAgIDxpbmRleE1heD4xNTwvaW5kZXhNYXg+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFEU0VUIiByZWY9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX1NQRUFLRVIiIHJlZj0iRlVMTF9TQ0FMRV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VBUlBJRUNFIiByZWY9IlNJTEVOVF9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJTSUxFTlRfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJTSUxFTlRfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworICAgIDx2b2x1bWVHcm91cD4KKyAgICAgICAgPG5hbWU+YWNjZXNzaWJpbGl0eTwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjE8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1NQRUFLRVJfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9FQVJQSUVDRSIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRVhUX01FRElBIiByZWY9IkRFRkFVTFRfTk9OX01VVEFCTEVfVk9MVU1FX0NVUlZFIi8+CisgICAgICAgIDx2b2x1bWUgZGV2aWNlQ2F0ZWdvcnk9IkRFVklDRV9DQVRFR09SWV9IRUFSSU5HX0FJRCIgcmVmPSJERUZBVUxUX05PTl9NVVRBQkxFX0hFQVJJTkdfQUlEX1ZPTFVNRV9DVVJWRSIvPgorICAgIDwvdm9sdW1lR3JvdXA+CisKKyAgICA8dm9sdW1lR3JvdXA+CisgICAgICAgIDxuYW1lPmFzc2lzdGFudDwvbmFtZT4KKyAgICAgICAgPGluZGV4TWluPjA8L2luZGV4TWluPgorICAgICAgICA8aW5kZXhNYXg+MTU8L2luZGV4TWF4PgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBRFNFVCIgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfU1BFQUtFUiIgcmVmPSJERUZBVUxUX0RFVklDRV9DQVRFR09SWV9TUEVBS0VSX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfRUFSUElFQ0UiIHJlZj0iREVGQVVMVF9NRURJQV9WT0xVTUVfQ1VSVkUiLz4KKyAgICAgICAgPHZvbHVtZSBkZXZpY2VDYXRlZ29yeT0iREVWSUNFX0NBVEVHT1JZX0VYVF9NRURJQSIgcmVmPSJERUZBVUxUX01FRElBX1ZPTFVNRV9DVVJWRSIvPgorICAgICAgICA8dm9sdW1lIGRldmljZUNhdGVnb3J5PSJERVZJQ0VfQ0FURUdPUllfSEVBUklOR19BSUQiICByZWY9IkRFRkFVTFRfSEVBUklOR19BSURfVk9MVU1FX0NVUlZFIi8+CisgICAgPC92b2x1bWVHcm91cD4KKworPC92b2x1bWVHcm91cHM+CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L2luY2x1ZGUvQXVkaW9Qb2xpY3lFbmdpbmVJbnN0YW5jZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTMyOWYwLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvaW5jbHVkZS9BdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE1IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI3ByYWdtYSBvbmNlCi0KLWNsYXNzIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZTsKLQotbmFtZXNwYWNlIGFuZHJvaWQKLXsKLW5hbWVzcGFjZSBhdWRpb19wb2xpY3kKLXsKLQotY2xhc3MgRW5naW5lOwotCi1jbGFzcyBFbmdpbmVJbnN0YW5jZQotewotcHJvdGVjdGVkOgotICAgIEVuZ2luZUluc3RhbmNlKCk7Ci0KLXB1YmxpYzoKLSAgICB2aXJ0dWFsIH5FbmdpbmVJbnN0YW5jZSgpOwotCi0gICAgLyoqCi0gICAgICogR2V0IEF1ZGlvIFBvbGljeSBFbmdpbmUgaW5zdGFuY2UuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHBvaW50ZXIgdG8gUm91dGUgTWFuYWdlciBJbnN0YW5jZSBvYmplY3QuCi0gICAgICovCi0gICAgc3RhdGljIEVuZ2luZUluc3RhbmNlICpnZXRJbnN0YW5jZSgpOwotCi0gICAgLyoqCi0gICAgICogSW50ZXJmYWNlIHF1ZXJ5LgotICAgICAqIFRoZSBmaXJzdCBjbGllbnQgb2YgYW4gaW50ZXJmYWNlIG9mIHRoZSBwb2xpY3kgZW5naW5lIHdpbGwgc3RhcnQgdGhlIHNpbmdsZXRvbi4KLSAgICAgKgotICAgICAqIEB0cGFyYW0gUmVxdWVzdGVkSW50ZXJmYWNlOiBpbnRlcmZhY2UgdGhhdCB0aGUgY2xpZW50IGlzIHdpc2hpbmcgdG8gcmV0cmlldmUuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIGludGVyZmFjZSBoYW5kbGUuCi0gICAgICovCi0gICAgdGVtcGxhdGUgPGNsYXNzIFJlcXVlc3RlZEludGVyZmFjZT4KLSAgICBSZXF1ZXN0ZWRJbnRlcmZhY2UgKnF1ZXJ5SW50ZXJmYWNlKCkgY29uc3Q7Ci0KLXByb3RlY3RlZDoKLSAgICAvKioKLSAgICAgKiBHZXQgQXVkaW8gUG9saWN5IEVuZ2luZSBpbnN0YW5jZS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gQXVkaW8gUG9saWN5IEVuZ2luZSBzaW5nbGV0b24uCi0gICAgICovCi0gICAgRW5naW5lICpnZXRFbmdpbmUoKSBjb25zdDsKLQotcHJpdmF0ZToKLSAgICAvKiBDb3B5IGZhY2lsaXRpZXMgYXJlIHB1dCBwcml2YXRlIHRvIGRpc2FibGUgY29weS4gKi8KLSAgICBFbmdpbmVJbnN0YW5jZShjb25zdCBFbmdpbmVJbnN0YW5jZSAmb2JqZWN0KTsKLSAgICBFbmdpbmVJbnN0YW5jZSAmb3BlcmF0b3I9KGNvbnN0IEVuZ2luZUluc3RhbmNlICZvYmplY3QpOwotfTsKLQotLyoqCi0gKiBMaW1pdCB0ZW1wbGF0ZSBpbnN0YW50YXRpb24gdG8gc3VwcG9ydGVkIHR5cGUgaW50ZXJmYWNlcy4KLSAqIENvbXBpbGUgdGltZSBlcnJvciB3aWxsIGNsYWltIGlmIGludmFsaWQgaW50ZXJmYWNlIGlzIHJlcXVlc3RlZC4KLSAqLwotdGVtcGxhdGUgPD4KLUF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZSAqRW5naW5lSW5zdGFuY2U6OnF1ZXJ5SW50ZXJmYWNlKCkgY29uc3Q7Ci0KLX0gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQotfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAKb2xkIG1vZGUgMTAwNjQ0Cm5ldyBtb2RlIDEwMDc1NQppbmRleCBlODZhZTVmLi40MWJiNGU0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmNwcApAQCAtMjcsOSArMjcsMTEgQEAKICNpbmNsdWRlICJFbmdpbmUuaCIKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VyT2JzZXJ2ZXIuaD4KLSNpbmNsdWRlIDxBdWRpb1BvcnQuaD4KKyNpbmNsdWRlIDxQb2xpY3lBdWRpb1BvcnQuaD4KICNpbmNsdWRlIDxJT1Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZS5oPgogI2luY2x1ZGUgPHBvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL0F1ZGlvQ29udGFpbmVycy5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzguaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIApAQCAtMzgsNjAgKzQwLDM3IEBACiBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CiB7CiAKK3N0cnVjdCBsZWdhY3lfc3RyYXRlZ3lfbWFwIHsgY29uc3QgY2hhciAqbmFtZTsgbGVnYWN5X3N0cmF0ZWd5IGlkOyB9Oworc3RhdGljIGNvbnN0IHN0ZDo6dmVjdG9yPGxlZ2FjeV9zdHJhdGVneV9tYXA+JiBnZXRMZWdhY3lTdHJhdGVneSgpIHsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8bGVnYWN5X3N0cmF0ZWd5X21hcD4gbGVnYWN5U3RyYXRlZ3kgPSB7CisgICAgICAgIHsgIlNUUkFURUdZX05PTkUiLCBTVFJBVEVHWV9OT05FIH0sCisgICAgICAgIHsgIlNUUkFURUdZX01FRElBIiwgU1RSQVRFR1lfTUVESUEgfSwKKyAgICAgICAgeyAiU1RSQVRFR1lfUEhPTkUiLCBTVFJBVEVHWV9QSE9ORSB9LAorICAgICAgICB7ICJTVFJBVEVHWV9TT05JRklDQVRJT04iLCBTVFJBVEVHWV9TT05JRklDQVRJT04gfSwKKyAgICAgICAgeyAiU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwiLCBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCB9LAorICAgICAgICB7ICJTVFJBVEVHWV9EVE1GIiwgU1RSQVRFR1lfRFRNRiB9LAorICAgICAgICB7ICJTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFIiwgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSB9LAorICAgICAgICB7ICJTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIiLCBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIgfSwKKyAgICAgICAgeyAiU1RSQVRFR1lfQUNDRVNTSUJJTElUWSIsIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgfSwKKyAgICAgICAgeyAiU1RSQVRFR1lfUkVST1VUSU5HIiwgU1RSQVRFR1lfUkVST1VUSU5HIH0sCisgICAgICAgIHsgIlNUUkFURUdZX1BBVENIIiwgU1RSQVRFR1lfUkVST1VUSU5HIH0sIC8vIGJvaWxlciB0byBtYW5hZ2Ugc3RyZWFtIHBhdGNoIHZvbHVtZQorICAgIH07CisgICAgcmV0dXJuIGxlZ2FjeVN0cmF0ZWd5OworfTsKKwogRW5naW5lOjpFbmdpbmUoKQotICAgIDogbU1hbmFnZXJJbnRlcmZhY2UodGhpcyksCi0gICAgICBtUGhvbmVTdGF0ZShBVURJT19NT0RFX05PUk1BTCksCi0gICAgICBtQXBtT2JzZXJ2ZXIoTlVMTCkKIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UOyBpKyspIHsKLSAgICAgICAgbUZvcmNlVXNlW2ldID0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkU7CisgICAgYXV0byByZXN1bHQgPSBFbmdpbmVCYXNlOjpsb2FkQXVkaW9Qb2xpY3lFbmdpbmVDb25maWcoKTsKKyAgICBBTE9HRV9JRihyZXN1bHQubmJTa2lwcGVkRWxlbWVudCAhPSAwLAorICAgICAgICAgICAgICJQb2xpY3kgRW5naW5lIGNvbmZpZ3VyYXRpb24gaXMgcGFydGlhbGx5IGludmFsaWQsIHNraXBwZWQgJXp1IGVsZW1lbnRzIiwKKyAgICAgICAgICAgICByZXN1bHQubmJTa2lwcGVkRWxlbWVudCk7CisKKyAgICBhdXRvIGxlZ2FjeVN0cmF0ZWd5ID0gZ2V0TGVnYWN5U3RyYXRlZ3koKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnN0cmF0ZWd5IDogbGVnYWN5U3RyYXRlZ3kpIHsKKyAgICAgICAgbUxlZ2FjeVN0cmF0ZWd5TWFwW2dldFByb2R1Y3RTdHJhdGVneUJ5TmFtZShzdHJhdGVneS5uYW1lKV0gPSBzdHJhdGVneS5pZDsKICAgICB9CiB9CiAKLUVuZ2luZTo6fkVuZ2luZSgpCi17Ci19Ci0KLXZvaWQgRW5naW5lOjpzZXRPYnNlcnZlcihBdWRpb1BvbGljeU1hbmFnZXJPYnNlcnZlciAqb2JzZXJ2ZXIpCi17Ci0gICAgQUxPR19BU1NFUlQob2JzZXJ2ZXIgIT0gTlVMTCwgIkludmFsaWQgQXVkaW8gUG9saWN5IE1hbmFnZXIgb2JzZXJ2ZXIiKTsKLSAgICBtQXBtT2JzZXJ2ZXIgPSBvYnNlcnZlcjsKLX0KLQotc3RhdHVzX3QgRW5naW5lOjppbml0Q2hlY2soKQotewotICAgIHJldHVybiAobUFwbU9ic2VydmVyICE9IE5VTEwpID8gIE5PX0VSUk9SIDogTk9fSU5JVDsKLX0KLQotc3RhdHVzX3QgRW5naW5lOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKLXsKLSAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIHN0YXRlICVkIiwgc3RhdGUpOwotCi0gICAgaWYgKHN0YXRlIDwgMCB8fCBzdGF0ZSA+PSBBVURJT19NT0RFX0NOVCkgewotICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIGludmFsaWQgc3RhdGUgJWQiLCBzdGF0ZSk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgaWYgKHN0YXRlID09IG1QaG9uZVN0YXRlICkgewotICAgICAgICBBTE9HVygic2V0UGhvbmVTdGF0ZSgpIHNldHRpbmcgc2FtZSBzdGF0ZSAlZCIsIHN0YXRlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICAvLyBzdG9yZSBwcmV2aW91cyBwaG9uZSBzdGF0ZSBmb3IgbWFuYWdlbWVudCBvZiBzb25pZmljYXRpb24gc3RyYXRlZ3kgYmVsb3cKLSAgICBpbnQgb2xkU3RhdGUgPSBtUGhvbmVTdGF0ZTsKLSAgICBtUGhvbmVTdGF0ZSA9IHN0YXRlOwotCi0gICAgaWYgKCFpc19zdGF0ZV9pbl9jYWxsKG9sZFN0YXRlKSAmJiBpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKSkgewotICAgICAgICBBTE9HVigiICBFbnRlcmluZyBjYWxsIGluIHNldFBob25lU3RhdGUoKSIpOwotICAgICAgICBtQXBtT2JzZXJ2ZXItPmdldFZvbHVtZUN1cnZlcygpLnN3aXRjaFZvbHVtZUN1cnZlKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9EVE1GKTsKLSAgICB9IGVsc2UgaWYgKGlzX3N0YXRlX2luX2NhbGwob2xkU3RhdGUpICYmICFpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKSkgewotICAgICAgICBBTE9HVigiICBFeGl0aW5nIGNhbGwgaW4gc2V0UGhvbmVTdGF0ZSgpIik7Ci0gICAgICAgIG1BcG1PYnNlcnZlci0+Z2V0Vm9sdW1lQ3VydmVzKCkucmVzdG9yZU9yaWdpblZvbHVtZUN1cnZlKEFVRElPX1NUUkVBTV9EVE1GKTsKLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOwotfQotCiBzdGF0dXNfdCBFbmdpbmU6OnNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpCiB7CiAgICAgc3dpdGNoKHVzYWdlKSB7CkBAIC0xMDEsNyArODAsNiBAQAogICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9DT01NVU5JQ0FUSU9OIiwgY29uZmlnKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBOgogICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9IRUFEUEhPTkVTICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfQTJEUCAmJgpAQCAtMTEyLDcgKzkwLDYgQEAKICAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfTUVESUEiLCBjb25maWcpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfUkVDT1JEOgogICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9XSVJFRF9BQ0NFU1NPUlkgJiYKQEAgLTEyMCw3ICs5Nyw2IEBACiAgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRk9SX1JFQ09SRCIsIGNvbmZpZyk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9ET0NLOgogICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmIGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfQ0FSX0RPQ0sgJiYKQEAgLTEzMCwyMSArMTA2LDE4IEBACiAgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0RJR0lUQUxfRE9DSykgewogICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9ET0NLIiwgY29uZmlnKTsKICAgICAgICAgfQotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNOgogICAgICAgICBpZiAoY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT05FICYmCiAgICAgICAgICAgICBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgewogICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEZPUl9TWVNURU0iLCBjb25maWcpOwogICAgICAgICB9Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJTzoKICAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgogICAgICAgICAgICAgY29uZmlnICE9IEFVRElPX1BPTElDWV9GT1JDRV9IRE1JX1NZU1RFTV9BVURJT19FTkZPUkNFRCkgewogICAgICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCBjb25maWcgJWQgZm9yIEhETUlfU1lTVEVNX0FVRElPIiwgY29uZmlnKTsKICAgICAgICAgfQotICAgICAgICBtRm9yY2VVc2VbdXNhZ2VdID0gY29uZmlnOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORDoKICAgICAgICAgaWYgKGNvbmZpZyAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfTk9ORSAmJgpAQCAtMTU0LDE0MyArMTI3LDU3IEBACiAgICAgICAgICAgICBBTE9HVygic2V0Rm9yY2VVc2UoKSBpbnZhbGlkIGNvbmZpZyAlZCBmb3IgRU5DT0RFRF9TVVJST1VORCIsIGNvbmZpZyk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9Ci0gICAgICAgIG1Gb3JjZVVzZVt1c2FnZV0gPSBjb25maWc7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9WSUJSQVRFX1JJTkdJTkc6CiAgICAgICAgIGlmIChjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTyAmJiBjb25maWcgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpIHsKICAgICAgICAgICAgIEFMT0dXKCJzZXRGb3JjZVVzZSgpIGludmFsaWQgY29uZmlnICVkIGZvciBGT1JfVklCUkFURV9SSU5HSU5HIiwgY29uZmlnKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KLSAgICAgICAgbUZvcmNlVXNlW3VzYWdlXSA9IGNvbmZpZzsKICAgICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgICAgQUxPR1coInNldEZvcmNlVXNlKCkgaW52YWxpZCB1c2FnZSAlZCIsIHVzYWdlKTsKICAgICAgICAgYnJlYWs7IC8vIFRPRE8gcmV0dXJuIEJBRF9WQUxVRT8KICAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJldHVybiBFbmdpbmVCYXNlOjpzZXRGb3JjZVVzZSh1c2FnZSwgY29uZmlnKTsKIH0KIAotcm91dGluZ19zdHJhdGVneSBFbmdpbmU6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQorRGV2aWNlVmVjdG9yIEVuZ2luZTo6Z2V0RGV2aWNlc0ZvclN0cmF0ZWd5SW50KGxlZ2FjeV9zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzKSBjb25zdAogewotICAgIC8vIHN0cmVhbSB0byBzdHJhdGVneSBtYXBwaW5nCi0gICAgc3dpdGNoIChzdHJlYW0pIHsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMOgotICAgIGNhc2UgQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ086Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9QSE9ORTsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9SSU5HOgotICAgIGNhc2UgQVVESU9fU1RSRUFNX0FMQVJNOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfU09OSUZJQ0FUSU9OOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX05PVElGSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMOwotICAgIGNhc2UgQVVESU9fU1RSRUFNX0RUTUY6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9EVE1GOwotICAgIGRlZmF1bHQ6Ci0gICAgICAgIEFMT0dFKCJ1bmtub3duIHN0cmVhbSB0eXBlICVkIiwgc3RyZWFtKTsKLSAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fU1lTVEVNOgotICAgICAgICAvLyBOT1RFOiBTWVNURU0gc3RyZWFtIHVzZXMgTUVESUEgc3RyYXRlZ3kgYmVjYXVzZSBtdXRpbmcgbXVzaWMgYW5kIHN3aXRjaGluZyBvdXRwdXRzCi0gICAgICAgIC8vIHdoaWxlIGtleSBjbGlja3MgYXJlIHBsYXllZCBwcm9kdWNlcyBhIHBvb3IgcmVzdWx0Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9NRURJQTsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRTsKLSAgICBjYXNlIEFVRElPX1NUUkVBTV9UVFM6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVI7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWToKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFk7Ci0gICAgY2FzZSBBVURJT19TVFJFQU1fUkVST1VUSU5HOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfUkVST1VUSU5HOwotICAgIH0KLX0KLQotcm91dGluZ19zdHJhdGVneSBFbmdpbmU6OmdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSkKLXsKLSAgICAvLyB1c2FnZSB0byBzdHJhdGVneSBtYXBwaW5nCi0gICAgc3dpdGNoICh1c2FnZSkgewotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9BQ0NFU1NJQklMSVRZOgotICAgICAgICByZXR1cm4gU1RSQVRFR1lfQUNDRVNTSUJJTElUWTsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfTUVESUE6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9HQU1FOgotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5UOgotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFOgotICAgIGNhc2UgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT046Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9NRURJQTsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTjoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1BIT05FOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OX1NJR05BTExJTkc6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9EVE1GOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9BTEFSTToKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkU6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9TT05JRklDQVRJT047Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTjoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX1JFUVVFU1Q6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5UOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVDoKLSAgICAgICAgcmV0dXJuIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBTVFJBVEVHWV9NRURJQTsKLSAgICB9Ci19Ci0KLWF1ZGlvX2RldmljZXNfdCBFbmdpbmU6OmdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpIGNvbnN0Ci17Ci0gICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZU91dHB1dERldmljZXMgPSBtQXBtT2JzZXJ2ZXItPmdldEF2YWlsYWJsZU91dHB1dERldmljZXMoKTsKLSAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzID0gbUFwbU9ic2VydmVyLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKTsKLQotICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gbUFwbU9ic2VydmVyLT5nZXRPdXRwdXRzKCk7Ci0KLSAgICByZXR1cm4gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQoc3RyYXRlZ3ksIGF2YWlsYWJsZU91dHB1dERldmljZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cywgKHVpbnQzMl90KUFVRElPX0RFVklDRV9OT05FKTsKLX0KLQotCi1hdWRpb19kZXZpY2VzX3QgRW5naW5lOjpnZXREZXZpY2VGb3JTdHJhdGVneUludChyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKLSAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZUlucHV0RGV2aWNlcywKLSAgICAgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMsCi0gICAgICAgIHVpbnQzMl90IG91dHB1dERldmljZVR5cGVzVG9JZ25vcmUpIGNvbnN0Ci17Ci0gICAgdWludDMyX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgdWludDMyX3QgYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgPQotICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgfm91dHB1dERldmljZVR5cGVzVG9JZ25vcmU7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CiAKICAgICBzd2l0Y2ggKHN0cmF0ZWd5KSB7CiAKICAgICBjYXNlIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUjoKLSAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgIGRldmljZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpOwogICAgICAgICBicmVhazsKIAogICAgIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUw6Ci0gICAgICAgIGlmIChpc0luQ2FsbCgpIHx8IG91dHB1dHMuaXNTdHJlYW1BY3RpdmVMb2NhbGx5KEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkgewotICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQoCi0gICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1NPTklGSUNBVElPTiwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKTsKKyAgICAgICAgaWYgKGlzSW5DYWxsKCkgfHwgb3V0cHV0cy5pc0FjdGl2ZUxvY2FsbHkodG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpKSkgeworICAgICAgICAgICAgZGV2aWNlcyA9IGdldERldmljZXNGb3JTdHJhdGVneUludCgKKyAgICAgICAgICAgICAgICAgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYm9vbCBtZWRpYV9hY3RpdmVfbG9jYWxseSA9Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNTdHJlYW1BY3RpdmVMb2NhbGx5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUxfQUZURVJfTVVTSUNfREVMQVkpCi0gICAgICAgICAgICAgICAgICAgIHx8IG91dHB1dHMuaXNTdHJlYW1BY3RpdmVMb2NhbGx5KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZLCBTT05JRklDQVRJT05fUkVTUEVDVEZVTF9BRlRFUl9NVVNJQ19ERUxBWSk7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuaXNBY3RpdmVMb2NhbGx5KHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9NVVNJQyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKQorICAgICAgICAgICAgICAgICAgICB8fCBvdXRwdXRzLmlzQWN0aXZlTG9jYWxseSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNPTklGSUNBVElPTl9SRVNQRUNURlVMX0FGVEVSX01VU0lDX0RFTEFZKTsKICAgICAgICAgICAgIC8vIHJvdXRpbmcgaXMgc2FtZSBhcyBtZWRpYSB3aXRob3V0IHRoZSAicmVtb3RlIiBkZXZpY2UKLSAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5SW50KFNUUkFURUdZX01FRElBLAorICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCkpOworICAgICAgICAgICAgZGV2aWNlcyA9IGdldERldmljZXNGb3JTdHJhdGVneUludChTVFJBVEVHWV9NRURJQSwKICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywKLSAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVggfCBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKTsKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzKTsKICAgICAgICAgICAgIC8vIGlmIG5vIG1lZGlhIGlzIHBsYXlpbmcgb24gdGhlIGRldmljZSwgY2hlY2sgZm9yIG1hbmRhdG9yeSB1c2Ugb2YgInNhZmUiIHNwZWFrZXIKICAgICAgICAgICAgIC8vIHdoZW4gbWVkaWEgd291bGQgaGF2ZSBwbGF5ZWQgb24gc3BlYWtlciwgYW5kIHRoZSBzYWZlIHNwZWFrZXIgcGF0aCBpcyBhdmFpbGFibGUKLSAgICAgICAgICAgIGlmICghbWVkaWFfYWN0aXZlX2xvY2FsbHkKLSAgICAgICAgICAgICAgICAgICAgJiYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikKLSAgICAgICAgICAgICAgICAgICAgJiYgKGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlIHw9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOwotICAgICAgICAgICAgICAgIGRldmljZSAmPSB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICAgICAgaWYgKCFtZWRpYV9hY3RpdmVfbG9jYWxseSkgeworICAgICAgICAgICAgICAgIGRldmljZXMucmVwbGFjZURldmljZXNCeVR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIsCisgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBicmVhazsKQEAgLTI5OCw5ICsxODUsOCBAQAogICAgIGNhc2UgU1RSQVRFR1lfRFRNRjoKICAgICAgICAgaWYgKCFpc0luQ2FsbCgpKSB7CiAgICAgICAgICAgICAvLyB3aGVuIG9mZiBjYWxsLCBEVE1GIHN0cmF0ZWd5IGZvbGxvd3MgdGhlIHNhbWUgcnVsZXMgYXMgTUVESUEgc3RyYXRlZ3kKLSAgICAgICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5SW50KAotICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9NRURJQSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKTsKKyAgICAgICAgICAgIGRldmljZXMgPSBnZXREZXZpY2VzRm9yU3RyYXRlZ3lJbnQoCisgICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX01FRElBLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgICAgLy8gd2hlbiBpbiBjYWxsLCBEVE1GIGFuZCBQSE9ORSBzdHJhdGVnaWVzIGZvbGxvdyB0aGUgc2FtZSBydWxlcwpAQCAtMzEyLDExMCArMTk4LDk5IEBACiAgICAgICAgIC8vICAgLSBjYW5ub3Qgcm91dGUgZnJvbSB2b2ljZSBjYWxsIFJYIE9SCiAgICAgICAgIC8vICAgLSBhdWRpbyBIQUwgdmVyc2lvbiBpcyA8IDMuMCBhbmQgVFggZGV2aWNlIGlzIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZQogICAgICAgICBpZiAoZ2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR4RGV2aWNlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04pOworICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHR4RGV2aWNlID0gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OKS0+dHlwZSgpOwogICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBwcmltYXJ5T3V0cHV0ID0gb3V0cHV0cy5nZXRQcmltYXJ5T3V0cHV0KCk7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxQcmltYXJ5SW5wdXREZXZpY2VzID0KLSAgICAgICAgICAgICAgICAgYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUocHJpbWFyeU91dHB1dC0+Z2V0TW9kdWxlSGFuZGxlKCkpOworICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsUHJpbWFyeUlucHV0RGV2aWNlcyA9CisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKHByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpKTsKIAogICAgICAgICAgICAgLy8gVE9ETzogZ2V0UHJpbWFyeU91dHB1dCByZXR1cm4gb25seSBkZXZpY2VzIGZyb20gZmlyc3QgbW9kdWxlIGluCiAgICAgICAgICAgICAvLyBhdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwsIGhlYXJpbmcgYWlkIGlzIG5vdCB0aGVyZSwgYnV0IGl0J3MKICAgICAgICAgICAgIC8vIGEgcHJpbWFyeSBkZXZpY2UKICAgICAgICAgICAgIC8vIEZJWE1FOiB0aGlzIGlzIG5vdCB0aGUgcmlnaHQgd2F5IG9mIHNvbHZpbmcgdGhpcyBwcm9ibGVtCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgYXZhaWxQcmltYXJ5T3V0cHV0RGV2aWNlcyA9Ci0gICAgICAgICAgICAgICAgKHByaW1hcnlPdXRwdXQtPnN1cHBvcnRlZERldmljZXMoKSB8IEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpICYKLSAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCk7CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxQcmltYXJ5T3V0cHV0RGV2aWNlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlcygKKyAgICAgICAgICAgICAgICAgICAgcHJpbWFyeU91dHB1dC0+c3VwcG9ydGVkRGV2aWNlcygpLnR5cGVzKCkpOworICAgICAgICAgICAgYXZhaWxQcmltYXJ5T3V0cHV0RGV2aWNlcy5hZGQoCisgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpKTsKIAotICAgICAgICAgICAgaWYgKCgoYXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJgotICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYICYgfkFVRElPX0RFVklDRV9CSVRfSU4pID09IDApIHx8Ci0gICAgICAgICAgICAgICAgICAgICgoKHR4RGV2aWNlICYgYXZhaWxQcmltYXJ5SW5wdXREZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHByaW1hcnlPdXRwdXQtPmdldEF1ZGlvUG9ydCgpLT5nZXRNb2R1bGVWZXJzaW9uTWFqb3IoKSA8IDMpKSkgewotICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlID0gYXZhaWxQcmltYXJ5T3V0cHV0RGV2aWNlczsKKyAgICAgICAgICAgIGlmICgoYXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZShBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KCIiKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpID09IG51bGxwdHIpIHx8CisgICAgICAgICAgICAgICAgICAgICgoYXZhaWxQcmltYXJ5SW5wdXREZXZpY2VzLmdldERldmljZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eERldmljZSwgU3RyaW5nOCgiIiksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSAhPSBudWxscHRyKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmltYXJ5T3V0cHV0LT5nZXRQb2xpY3lBdWRpb1BvcnQoKS0+Z2V0TW9kdWxlVmVyc2lvbk1ham9yKCkgPCAzKSkpIHsKKyAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gYXZhaWxQcmltYXJ5T3V0cHV0RGV2aWNlczsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyBmb3IgcGhvbmUgc3RyYXRlZ3ksIHdlIGZpcnN0IGNvbnNpZGVyIHRoZSBmb3JjZWQgdXNlIGFuZCB0aGVuIHRoZSBhdmFpbGFibGUgZGV2aWNlcyBieQogICAgICAgICAvLyBvcmRlciBvZiBwcmlvcml0eQotICAgICAgICBzd2l0Y2ggKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT05dKSB7CisgICAgICAgIHN3aXRjaCAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OKSkgewogICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ086CiAgICAgICAgICAgICBpZiAoIWlzSW5DYWxsKCkgfHwgc3RyYXRlZ3kgIT0gU1RSQVRFR1lfRFRNRikgewotICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVDsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgICAgICBkZXZpY2VzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fQ0FSS0lUKTsKKyAgICAgICAgICAgICAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpKSBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPOwotICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBkZXZpY2VzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXRGaXJzdERldmljZXNGcm9tVHlwZXMoeworICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ09fSEVBRFNFVCwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPfSk7CisgICAgICAgICAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpKSBicmVhazsKICAgICAgICAgICAgIC8vIGlmIFNDTyBkZXZpY2UgaXMgcmVxdWVzdGVkIGJ1dCBubyBTQ08gZGV2aWNlIGlzIGF2YWlsYWJsZSwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgY2FzZQogICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAKICAgICAgICAgZGVmYXVsdDogICAgLy8gRk9SQ0VfTk9ORQotICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEOwotICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICBkZXZpY2VzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9IRUFSSU5HX0FJRCk7CisgICAgICAgICAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpKSBicmVhazsKICAgICAgICAgICAgIC8vIHdoZW4gbm90IGluIGEgcGhvbmUgY2FsbCwgcGhvbmUgc3RyYXRlZ3kgc2hvdWxkIHJvdXRlIFNUUkVBTV9WT0lDRV9DQUxMIHRvIEEyRFAKICAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgotICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgorICAgICAgICAgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQTJkcFN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldEZpcnN0RGV2aWNlc0Zyb21UeXBlcyh7CisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQLAorICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTfSk7CisgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VzLmlzRW1wdHkoKSkgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FOwotICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFNFVDsKLSAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0xJTkU7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVDsKLSAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9ERVZJQ0U7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKKyAgICAgICAgICAgIGRldmljZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldEZpcnN0RGV2aWNlc0Zyb21UeXBlcyh7CisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FLCBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfTElORSwgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVCwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFfSk7CisgICAgICAgICAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpKSBicmVhazsKICAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSkgewotICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVDsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUw7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldEZpcnN0RGV2aWNlc0Zyb21UeXBlcyh7CisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlksIEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQsCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMLCBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUfSk7CisgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VzLmlzRW1wdHkoKSkgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfRUFSUElFQ0U7CisgICAgICAgICAgICBkZXZpY2VzID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSOgogICAgICAgICAgICAgLy8gd2hlbiBub3QgaW4gYSBwaG9uZSBjYWxsLCBwaG9uZSBzdHJhdGVneSBzaG91bGQgcm91dGUgU1RSRUFNX1ZPSUNFX0NBTEwgdG8KICAgICAgICAgICAgIC8vIEEyRFAgc3BlYWtlciB3aGVuIGZvcmNpbmcgdG8gc3BlYWtlciBvdXRwdXQKICAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSAmJgotICAgICAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgorICAgICAgICAgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApICYmCiAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQTJkcFN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX1NQRUFLRVI7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7CisgICAgICAgICAgICAgICAgZGV2aWNlcyA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9TUEVBS0VSKTsKKyAgICAgICAgICAgICAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpKSBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmICghaXNJbkNhbGwoKSkgewotICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9VU0JfQUNDRVNTT1JZOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9VU0JfREVWSUNFOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOwotICAgICAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVDsKLSAgICAgICAgICAgICAgICBpZiAoZGV2aWNlKSBicmVhazsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUw7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZSkgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUOwotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UpIGJyZWFrOworICAgICAgICAgICAgICAgIGRldmljZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldEZpcnN0RGV2aWNlc0Zyb21UeXBlcyh7CisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlksIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfREdUTF9ET0NLX0hFQURTRVQsIEFVRElPX0RFVklDRV9PVVRfQVVYX0RJR0lUQUwsCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0FOTEdfRE9DS19IRUFEU0VUfSk7CisgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2VzLmlzRW1wdHkoKSkgYnJlYWs7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKKyAgICAgICAgICAgIGRldmljZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICBicmVhazsKIAogICAgIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OOgogCi0gICAgICAgIC8vIElmIGluY2FsbCwganVzdCBzZWxlY3QgdGhlIFNUUkFURUdZX1BIT05FIGRldmljZTogVGhlIHJlc3Qgb2YgdGhlIGJlaGF2aW9yIGlzIGhhbmRsZWQgYnkKLSAgICAgICAgLy8gaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkuCi0gICAgICAgIGlmIChpc0luQ2FsbCgpIHx8IG91dHB1dHMuaXNTdHJlYW1BY3RpdmVMb2NhbGx5KEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkgewotICAgICAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQoCi0gICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1BIT05FLCBhdmFpbGFibGVPdXRwdXREZXZpY2VzLCBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZVR5cGVzVG9JZ25vcmUpOworICAgICAgICAvLyBJZiBpbmNhbGwsIGp1c3Qgc2VsZWN0IHRoZSBTVFJBVEVHWV9QSE9ORSBkZXZpY2UKKyAgICAgICAgaWYgKGlzSW5DYWxsKCkgfHwKKyAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQWN0aXZlTG9jYWxseSh0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkpKSB7CisgICAgICAgICAgICBkZXZpY2VzID0gZ2V0RGV2aWNlc0ZvclN0cmF0ZWd5SW50KAorICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9QSE9ORSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICAgIEZBTExUSFJPVUdIX0lOVEVOREVEOwpAQCAtNDI3LDQyICszMDIsMzggQEAKICAgICAgICAgLy8gICAtIGluIGNvdW50cmllcyB3aGVyZSBub3QgZW5mb3JjZWQgaW4gd2hpY2ggY2FzZSBpdCBmb2xsb3dzIFNUUkFURUdZX01FRElBCiAKICAgICAgICAgaWYgKChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHx8Ci0gICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTV0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkpIHsKLSAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkpIHsKKyAgICAgICAgICAgIGRldmljZXMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpOwogICAgICAgICB9CiAKICAgICAgICAgLy8gaWYgU0NPIGhlYWRzZXQgaXMgY29ubmVjdGVkIGFuZCB3ZSBhcmUgdG9sZCB0byB1c2UgaXQsIHBsYXkgcmluZ3RvbmUgb3ZlcgogICAgICAgICAvLyBzcGVha2VyIGFuZCBCVCBTQ08KLSAgICAgICAgaWYgKChhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX1NDTykgIT0gMCkgewotICAgICAgICAgICAgdWludDMyX3QgZGV2aWNlMiA9IEFVRElPX0RFVklDRV9OT05FOwotICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVDsKLSAgICAgICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTzsKLSAgICAgICAgICAgIH0KKyAgICAgICAgaWYgKCFhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZXMoZ2V0QXVkaW9EZXZpY2VPdXRBbGxTY29TZXQoKSkuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczI7CisgICAgICAgICAgICBkZXZpY2VzMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0Rmlyc3REZXZpY2VzRnJvbVR5cGVzKHsKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0NBUktJVCwgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfU0NPX0hFQURTRVQsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDT30pOwogICAgICAgICAgICAgLy8gVXNlIE9OTFkgQmx1ZXRvb3RoIFNDTyBvdXRwdXQgd2hlbiByaW5naW5nIGluIHZpYnJhdGlvbiBtb2RlCi0gICAgICAgICAgICBpZiAoISgobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKQorICAgICAgICAgICAgaWYgKCEoKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1lTVEVNX0VORk9SQ0VEKQogICAgICAgICAgICAgICAgICAgICAmJiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1ZJQlJBVEVfUklOR0lOR10KKyAgICAgICAgICAgICAgICBpZiAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9WSUJSQVRFX1JJTkdJTkcpCiAgICAgICAgICAgICAgICAgICAgICAgICA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChkZXZpY2UyICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UgPSBkZXZpY2UyOworICAgICAgICAgICAgICAgICAgICBpZiAoIWRldmljZXMyLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcyA9IGRldmljZXMyOwogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBVc2UgYm90aCBCbHVldG9vdGggU0NPIGFuZCBwaG9uZSBkZWZhdWx0IG91dHB1dCB3aGVuIHJpbmdpbmcgaW4gbm9ybWFsIG1vZGUKLSAgICAgICAgICAgIGlmIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB7Ci0gICAgICAgICAgICAgICAgaWYgKChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldmljZSB8PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRTsKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgICAgICBpZiAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OKSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLnJlcGxhY2VEZXZpY2VzQnlUeXBlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChkZXZpY2UyICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRldmljZSB8PSBkZXZpY2UyOworICAgICAgICAgICAgICAgIGlmICghZGV2aWNlczIuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGRldmljZXMuYWRkKGRldmljZXMyKTsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNDc2LDI1ICszNDcsMjAgQEAKICAgICAgICAgICAgIC8vIGNvbXByZXNzZWQgZm9ybWF0IGFzIHRoZXkgd291bGQgbGlrZWx5IG5vdCBiZSBtaXhlZCBhbmQgZHJvcHBlZC4KICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0cy5zaXplKCk7IGkrKykgewogICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlcyA9IGRlc2MtPmRldmljZSgpICYKLSAgICAgICAgICAgICAgICAgICAgKEFVRElPX0RFVklDRV9PVVRfSERNSSB8IEFVRElPX0RFVklDRV9PVVRfU1BESUYgfCBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDKTsKLSAgICAgICAgICAgICAgICBpZiAoZGVzYy0+aXNBY3RpdmUoKSAmJiAhYXVkaW9faXNfbGluZWFyX3BjbShkZXNjLT5tRm9ybWF0KSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcyAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSA9IGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIH5kZXZpY2VzOworICAgICAgICAgICAgICAgIGlmIChkZXNjLT5pc0FjdGl2ZSgpICYmICFhdWRpb19pc19saW5lYXJfcGNtKGRlc2MtPmdldEZvcm1hdCgpKSkgeworICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXNjLT5kZXZpY2VzKCkuZ2V0RGV2aWNlc0Zyb21UeXBlcyh7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9IRE1JLCBBVURJT19ERVZJQ0VfT1VUX1NQRElGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfSERNSV9BUkN9KSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyA9Ci0gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlKTsKLSAgICAgICAgICAgIGlmIChvdXRwdXRzLmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9SSU5HKSB8fAotICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9BTEFSTSkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZ2V0RGV2aWNlRm9yU3RyYXRlZ3lJbnQoCi0gICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1NPTklGSUNBVElPTiwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRzLmlzQWN0aXZlKHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9SSU5HKSkgfHwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cy5pc0FjdGl2ZSh0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQUxBUk0pKSkgeworICAgICAgICAgICAgICAgIHJldHVybiBnZXREZXZpY2VzRm9yU3RyYXRlZ3lJbnQoCisgICAgICAgICAgICAgICAgICAgIFNUUkFURUdZX1NPTklGSUNBVElPTiwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChpc0luQ2FsbCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGdldERldmljZUZvclN0cmF0ZWd5SW50KAotICAgICAgICAgICAgICAgICAgICAgICAgU1RSQVRFR1lfUEhPTkUsIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERldmljZVR5cGVzVG9JZ25vcmUpOworICAgICAgICAgICAgICAgIHJldHVybiBnZXREZXZpY2VzRm9yU3RyYXRlZ3lJbnQoCisgICAgICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9QSE9ORSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyBGb3Igb3RoZXIgY2FzZXMsIFNUUkFURUdZX0FDQ0VTU0lCSUxJVFkgYmVoYXZlcyBsaWtlIFNUUkFURUdZX01FRElBCkBAIC01MDMsMTI0ICszNjksMTE0IEBACiAgICAgLy8gRklYTUU6IFNUUkFURUdZX1JFUk9VVElORyBmb2xsb3cgU1RSQVRFR1lfTUVESUEgZm9yIG5vdwogICAgIGNhc2UgU1RSQVRFR1lfUkVST1VUSU5HOgogICAgIGNhc2UgU1RSQVRFR1lfTUVESUE6IHsKLSAgICAgICAgdWludDMyX3QgZGV2aWNlMiA9IEFVRElPX0RFVklDRV9OT05FOworICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczI7CiAgICAgICAgIGlmIChzdHJhdGVneSAhPSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHsKICAgICAgICAgICAgIC8vIG5vIHNvbmlmaWNhdGlvbiBvbiByZW1vdGUgc3VibWl4IChlLmcuIFdGRCkKLSAgICAgICAgICAgIGlmIChhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgiMCIpKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHJlbW90ZVN1Ym1peDsKKyAgICAgICAgICAgIGlmICgocmVtb3RlU3VibWl4ID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UoCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwgU3RyaW5nOCgiMCIpLAorICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCkpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VzMi5hZGQocmVtb3RlU3VibWl4KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBpZiAoaXNJbkNhbGwoKSAmJiAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfTUVESUEpKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneUludCgKLSAgICAgICAgICAgICAgICAgICAgU1RSQVRFR1lfUEhPTkUsIGF2YWlsYWJsZU91dHB1dERldmljZXMsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgb3V0cHV0cywKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGV2aWNlVHlwZXNUb0lnbm9yZSk7CisgICAgICAgICAgICBkZXZpY2VzID0gZ2V0RGV2aWNlc0ZvclN0cmF0ZWd5SW50KAorICAgICAgICAgICAgICAgICAgICBTVFJBVEVHWV9QSE9ORSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgYXZhaWxhYmxlSW5wdXREZXZpY2VzLCBvdXRwdXRzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEOworICAgICAgICAvLyBGSVhNRTogRmluZCBhIGJldHRlciBzb2x1dGlvbiB0byBwcmV2ZW50IHJvdXRpbmcgdG8gQlQgaGVhcmluZyBhaWQoYi8xMjI5MzEyNjEpLgorICAgICAgICBpZiAoKGRldmljZXMyLmlzRW1wdHkoKSkgJiYKKyAgICAgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgIT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PX0JUX0EyRFApKSB7CisgICAgICAgICAgICBkZXZpY2VzMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUQpOwogICAgICAgICB9Ci0gICAgICAgIGlmICgoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKLSAgICAgICAgICAgICAgICAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUFdICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgotICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQTJkcFN1cHBvcnRlZCgpKSB7Ci0gICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQOwotICAgICAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQX0hFQURQSE9ORVM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfU1BFQUtFUjsKKyAgICAgICAgaWYgKChkZXZpY2VzMi5pc0VtcHR5KCkpICYmCisgICAgICAgICAgICAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9NRURJQSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NQRUFLRVIpKSB7CisgICAgICAgICAgICBkZXZpY2VzMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZXMyLmlzRW1wdHkoKSAmJiAoZ2V0TGFzdFJlbW92YWJsZU1lZGlhRGV2aWNlcygpLnNpemUoKSA+IDApKSB7CisgICAgICAgICAgICBpZiAoKGdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUEpICE9IEFVRElPX1BPTElDWV9GT1JDRV9OT19CVF9BMkRQKSAmJgorICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmlzQTJkcFN1cHBvcnRlZCgpKSB7CisgICAgICAgICAgICAgICAgLy8gR2V0IHRoZSBsYXN0IGNvbm5lY3RlZCBkZXZpY2Ugb2Ygd2lyZWQgYW5kIGJsdWV0b290aCBhMmRwCisgICAgICAgICAgICAgICAgZGV2aWNlczIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldEZpcnN0RGV2aWNlc0Zyb21UeXBlcygKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldExhc3RSZW1vdmFibGVNZWRpYURldmljZXMoKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbGFzdCBjb25uZWN0ZWQgZGV2aWNlIG9mIHdpcmVkIGV4Y2VwdCBibHVldG9vdGggYTJkcAorICAgICAgICAgICAgICAgIGRldmljZXMyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXRGaXJzdERldmljZXNGcm9tVHlwZXMoCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRMYXN0UmVtb3ZhYmxlTWVkaWFEZXZpY2VzKEdST1VQX1dJUkVEKSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgaWYgKChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSAmJgotICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX01FRElBXSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfU1BFQUtFUikpIHsKLSAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUjsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfTElORTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEU0VUOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9IRUFEU0VUOwotICAgICAgICB9Ci0gICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1VTQl9BQ0NFU1NPUlk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfVVNCX0RFVklDRTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZGV2aWNlMiA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgZGV2aWNlMiA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9ER1RMX0RPQ0tfSEVBRFNFVDsKLSAgICAgICAgfQotICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmIChzdHJhdGVneSAhPSBTVFJBVEVHWV9TT05JRklDQVRJT04pKSB7CisgICAgICAgIGlmICgoZGV2aWNlczIuaXNFbXB0eSgpKSAmJiAoc3RyYXRlZ3kgIT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSkgewogICAgICAgICAgICAgLy8gbm8gc29uaWZpY2F0aW9uIG9uIGF1eCBkaWdpdGFsIChlLmcuIEhETUkpCi0gICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMOworICAgICAgICAgICAgZGV2aWNlczIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX0FVWF9ESUdJVEFMKTsKICAgICAgICAgfQotICAgICAgICBpZiAoKGRldmljZTIgPT0gQVVESU9fREVWSUNFX05PTkUpICYmCi0gICAgICAgICAgICAgICAgKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0tdID09IEFVRElPX1BPTElDWV9GT1JDRV9BTkFMT0dfRE9DSykpIHsKLSAgICAgICAgICAgIGRldmljZTIgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQ7CisgICAgICAgIGlmICgoZGV2aWNlczIuaXNFbXB0eSgpKSAmJgorICAgICAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0spID09IEFVRElPX1BPTElDWV9GT1JDRV9BTkFMT0dfRE9DSykpIHsKKyAgICAgICAgICAgIGRldmljZXMyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQU5MR19ET0NLX0hFQURTRVQpOwogICAgICAgICB9Ci0gICAgICAgIGlmIChkZXZpY2UyID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICBkZXZpY2UyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlc1R5cGUgJiBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgIGlmIChkZXZpY2VzMi5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIGRldmljZXMyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKTsKICAgICAgICAgfQotICAgICAgICBpbnQgZGV2aWNlMyA9IEFVRElPX0RFVklDRV9OT05FOworICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczM7CiAgICAgICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgewogICAgICAgICAgICAgLy8gQVJDLCBTUERJRiBhbmQgQVVYX0xJTkUgY2FuIGNvLWV4aXN0IHdpdGggb3RoZXJzLgotICAgICAgICAgICAgZGV2aWNlMyA9IGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9IRE1JX0FSQzsKLSAgICAgICAgICAgIGRldmljZTMgfD0gKGF2YWlsYWJsZU91dHB1dERldmljZXNUeXBlICYgQVVESU9fREVWSUNFX09VVF9TUERJRik7Ci0gICAgICAgICAgICBkZXZpY2UzIHw9IChhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfQVVYX0xJTkUpOworICAgICAgICAgICAgZGV2aWNlczMgPSBhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZXMoeworICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0hETUlfQVJDLCBBVURJT19ERVZJQ0VfT1VUX1NQRElGLCBBVURJT19ERVZJQ0VfT1VUX0FVWF9MSU5FfSk7CiAgICAgICAgIH0KIAotICAgICAgICBkZXZpY2UyIHw9IGRldmljZTM7CisgICAgICAgIGRldmljZXMyLmFkZChkZXZpY2VzMyk7CiAgICAgICAgIC8vIGRldmljZSBpcyBERVZJQ0VfT1VUX1NQRUFLRVIgaWYgd2UgY29tZSBmcm9tIGNhc2UgU1RSQVRFR1lfU09OSUZJQ0FUSU9OIG9yCiAgICAgICAgIC8vIFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUsIEFVRElPX0RFVklDRV9OT05FIG90aGVyd2lzZQotICAgICAgICBkZXZpY2UgfD0gZGV2aWNlMjsKKyAgICAgICAgZGV2aWNlcy5hZGQoZGV2aWNlczIpOwogCiAgICAgICAgIC8vIElmIGhkbWkgc3lzdGVtIGF1ZGlvIG1vZGUgaXMgb24sIHJlbW92ZSBzcGVha2VyIG91dCBvZiBvdXRwdXQgbGlzdC4KICAgICAgICAgaWYgKChzdHJhdGVneSA9PSBTVFJBVEVHWV9NRURJQSkgJiYKLSAgICAgICAgICAgIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9IRE1JX1NZU1RFTV9BVURJT10gPT0KKyAgICAgICAgICAgIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0hETUlfU1lTVEVNX0FVRElPKSA9PQogICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9IRE1JX1NZU1RFTV9BVURJT19FTkZPUkNFRCkpIHsKLSAgICAgICAgICAgIGRldmljZSAmPSB+QVVESU9fREVWSUNFX09VVF9TUEVBS0VSOworICAgICAgICAgICAgZGV2aWNlcy5yZW1vdmUoZGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSk7CiAgICAgICAgIH0KIAogICAgICAgICAvLyBmb3IgU1RSQVRFR1lfU09OSUZJQ0FUSU9OOgogICAgICAgICAvLyBpZiBTUEVBS0VSIHdhcyBzZWxlY3RlZCwgYW5kIFNQRUFLRVJfU0FGRSBpcyBhdmFpbGFibGUsIHVzZSBTUEVBS0VSX1NBRkUgaW5zdGVhZAotICAgICAgICBpZiAoKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgJiYKLSAgICAgICAgICAgICAgICAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSKSAmJgotICAgICAgICAgICAgICAgIChhdmFpbGFibGVPdXRwdXREZXZpY2VzVHlwZSAmIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFKSkgewotICAgICAgICAgICAgZGV2aWNlIHw9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOwotICAgICAgICAgICAgZGV2aWNlICY9IH5BVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7CisgICAgICAgIGlmIChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT04pIHsKKyAgICAgICAgICAgIGRldmljZXMucmVwbGFjZURldmljZXNCeVR5cGUoCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUiwKKyAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpKTsKICAgICAgICAgfQogICAgICAgICB9IGJyZWFrOwogCiAgICAgZGVmYXVsdDoKLSAgICAgICAgQUxPR1coImdldERldmljZUZvclN0cmF0ZWd5KCkgdW5rbm93biBzdHJhdGVneTogJWQiLCBzdHJhdGVneSk7CisgICAgICAgIEFMT0dXKCJnZXREZXZpY2VzRm9yU3RyYXRlZ3koKSB1bmtub3duIHN0cmF0ZWd5OiAlZCIsIHN0cmF0ZWd5KTsKICAgICAgICAgYnJlYWs7CiAgICAgfQogCi0gICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICBBTE9HVigiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBubyBkZXZpY2UgZm91bmQgZm9yIHN0cmF0ZWd5ICVkIiwgc3RyYXRlZ3kpOwotICAgICAgICBkZXZpY2UgPSBtQXBtT2JzZXJ2ZXItPmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+dHlwZSgpOwotICAgICAgICBBTE9HRV9JRihkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUsCi0gICAgICAgICAgICAgICAgICJnZXREZXZpY2VGb3JTdHJhdGVneSgpIG5vIGRlZmF1bHQgZGV2aWNlIGRlZmluZWQiKTsKKyAgICBpZiAoZGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgQUxPR1YoImdldERldmljZXNGb3JTdHJhdGVneSgpIG5vIGRldmljZSBmb3VuZCBmb3Igc3RyYXRlZ3kgJWQiLCBzdHJhdGVneSk7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRlZmF1bHRPdXRwdXREZXZpY2UgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCk7CisgICAgICAgIGlmIChkZWZhdWx0T3V0cHV0RGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRldmljZXMuYWRkKGRlZmF1bHRPdXRwdXREZXZpY2UpOworICAgICAgICB9CisgICAgICAgIEFMT0dFX0lGKGRldmljZXMuaXNFbXB0eSgpLAorICAgICAgICAgICAgICAgICAiZ2V0RGV2aWNlc0ZvclN0cmF0ZWd5KCkgbm8gZGVmYXVsdCBkZXZpY2UgZGVmaW5lZCIpOwogICAgIH0KLSAgICBBTE9HVlYoImdldERldmljZUZvclN0cmF0ZWd5KCkgc3RyYXRlZ3kgJWQsIGRldmljZSAleCIsIHN0cmF0ZWd5LCBkZXZpY2UpOwotICAgIHJldHVybiBkZXZpY2U7CisKKyAgICBBTE9HVlYoImdldERldmljZXMiCisgICAgICAgICAgICJGb3JTdHJhdGVneSgpIHN0cmF0ZWd5ICVkLCBkZXZpY2UgJXgiLCBzdHJhdGVneSwgZGV2aWNlcy50eXBlcygpKTsKKyAgICByZXR1cm4gZGV2aWNlczsKIH0KIAogCi1hdWRpb19kZXZpY2VzX3QgRW5naW5lOjpnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkgY29uc3QKK3NwPERldmljZURlc2NyaXB0b3I+IEVuZ2luZTo6Z2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpIGNvbnN0CiB7Ci0gICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gbUFwbU9ic2VydmVyLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7Ci0gICAgY29uc3QgRGV2aWNlVmVjdG9yICZhdmFpbGFibGVJbnB1dERldmljZXMgPSBtQXBtT2JzZXJ2ZXItPmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpOwotICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gbUFwbU9ic2VydmVyLT5nZXRPdXRwdXRzKCk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZURldmljZVR5cGVzID0gYXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkgJiB+QVVESU9fREVWSUNFX0JJVF9JTjsKLQotICAgIHVpbnQzMl90IGRldmljZSA9IEFVRElPX0RFVklDRV9OT05FOworICAgIGNvbnN0IERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOworICAgIGNvbnN0IERldmljZVZlY3RvciBhdmFpbGFibGVJbnB1dERldmljZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKTsKKyAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiAmb3V0cHV0cyA9IGdldEFwbU9ic2VydmVyKCktPmdldE91dHB1dHMoKTsKKyAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlRGV2aWNlcyA9IGF2YWlsYWJsZUlucHV0RGV2aWNlczsKKyAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IHByaW1hcnlPdXRwdXQgPSBvdXRwdXRzLmdldFByaW1hcnlPdXRwdXQoKTsKKyAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlUHJpbWFyeURldmljZXMgPSBhdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21Id01vZHVsZSgKKyAgICAgICAgICAgIHByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpKTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2U7CiAKICAgICAvLyB3aGVuIGEgY2FsbCBpcyBhY3RpdmUsIGZvcmNlIGRldmljZSBzZWxlY3Rpb24gdG8gbWF0Y2ggc291cmNlIFZPSUNFX0NPTU1VTklDQVRJT04KICAgICAvLyBmb3IgbW9zdCBvdGhlciBpbnB1dCBzb3VyY2VzIHRvIGF2b2lkIHJlcm91dGluZyBjYWxsIFRYIGF1ZGlvCkBAIC02MzIsNiArNDg4LDcgQEAKICAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVU5QUk9DRVNTRUQ6CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0hPVFdPUkQ6CiAgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX0NBTUNPUkRFUjoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0U6CiAgICAgICAgICAgICBpbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGRlZmF1bHQ6CkBAIC02NDAsNjkgKzQ5Nyw0OSBAQAogICAgIH0KIAogICAgIHN3aXRjaCAoaW5wdXRTb3VyY2UpIHsKLSAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTks6Ci0gICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCkgewotICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KICAgICBjYXNlIEFVRElPX1NPVVJDRV9ERUZBVUxUOgogICAgIGNhc2UgQVVESU9fU09VUkNFX01JQzoKLSAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX0EyRFApIHsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQOwotICAgIH0gZWxzZSBpZiAoKG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRF0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgJiYKLSAgICAgICAgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkpIHsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVDsKLSAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpIHsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQ7Ci0gICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVCkgewotICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQ7Ci0gICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFKSB7Ci0gICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFOwotICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDOwotICAgIH0KLSAgICBicmVhazsKKyAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlRGV2aWNlcy5nZXREZXZpY2UoCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9BMkRQLCBTdHJpbmc4KCIiKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIGJyZWFrOworICAgICAgICBpZiAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkQpID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHsKKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZURldmljZXMuZ2V0RGV2aWNlKAorICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VULCBTdHJpbmc4KCIiKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldEZpcnN0RXhpc3RpbmdEZXZpY2UoeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VULCBBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UsIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQ30pOworICAgICAgICBicmVhazsKIAogICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT046CiAgICAgICAgIC8vIEFsbG93IG9ubHkgdXNlIG9mIGRldmljZXMgb24gcHJpbWFyeSBpbnB1dCBpZiBpbiBjYWxsIGFuZCBIQUwgZG9lcyBub3Qgc3VwcG9ydCByb3V0aW5nCiAgICAgICAgIC8vIHRvIHZvaWNlIGNhbGwgcGF0aC4KICAgICAgICAgaWYgKChnZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSAmJgotICAgICAgICAgICAgICAgIChhdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCkgPT0gMCkgewotICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBwcmltYXJ5T3V0cHV0ID0gb3V0cHV0cy5nZXRQcmltYXJ5T3V0cHV0KCk7Ci0gICAgICAgICAgICBhdmFpbGFibGVEZXZpY2VUeXBlcyA9Ci0gICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbUh3TW9kdWxlKHByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpKQotICAgICAgICAgICAgICAgICAgICAmIH5BVURJT19ERVZJQ0VfQklUX0lOOworICAgICAgICAgICAgICAgIChhdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoIiIpLCBBVURJT19GT1JNQVRfREVGQVVMVCkpID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZURldmljZXMgPSBhdmFpbGFibGVQcmltYXJ5RGV2aWNlczsKICAgICAgICAgfQogCi0gICAgICAgIHN3aXRjaCAobUZvcmNlVXNlW0FVRElPX1BPTElDWV9GT1JDRV9GT1JfQ09NTVVOSUNBVElPTl0pIHsKKyAgICAgICAgc3dpdGNoIChnZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pKSB7CiAgICAgICAgIGNhc2UgQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTzoKICAgICAgICAgICAgIC8vIGlmIFNDTyBkZXZpY2UgaXMgcmVxdWVzdGVkIGJ1dCBubyBTQ08gZGV2aWNlIGlzIGF2YWlsYWJsZSwgZmFsbCBiYWNrIHRvIGRlZmF1bHQgY2FzZQotICAgICAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkgewotICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldERldmljZSgKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCwgU3RyaW5nOCgiIiksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgewogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgRkFMTFRIUk9VR0hfSU5URU5ERUQ7CiAKICAgICAgICAgZGVmYXVsdDogICAgLy8gRk9SQ0VfTk9ORQotICAgICAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVDsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQ7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMpIHsKLSAgICAgICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7Ci0gICAgICAgICAgICB9CisgICAgICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldEZpcnN0RXhpc3RpbmdEZXZpY2UoeworICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCwgQVVESU9fREVWSUNFX0lOX1VTQl9IRUFEU0VULAorICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSwgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDfSk7CiAgICAgICAgICAgICBicmVhazsKIAogICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9GT1JDRV9TUEVBS0VSOgotICAgICAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDOwotICAgICAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgewotICAgICAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQzsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZURldmljZXMuZ2V0Rmlyc3RFeGlzdGluZ0RldmljZSh7CisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9CQUNLX01JQywgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDfSk7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgICAgICBicmVhazsKQEAgLTcxMCw2NSArNTQ3LDE3NyBAQAogICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOgogICAgIGNhc2UgQVVESU9fU09VUkNFX1VOUFJPQ0VTU0VEOgogICAgIGNhc2UgQVVESU9fU09VUkNFX0hPVFdPUkQ6Ci0gICAgICAgIGlmIChtRm9yY2VVc2VbQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkRdID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08gJiYKLSAgICAgICAgICAgICAgICBhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQpIHsKLSAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9CTFVFVE9PVEhfU0NPX0hFQURTRVQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fV0lSRURfSEVBRFNFVCkgewotICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQ7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQpIHsKLSAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVDsKLSAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9VU0JfREVWSUNFKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRTsKLSAgICAgICAgfSBlbHNlIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQykgewotICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDOworICAgICAgICBpZiAoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKKyAgICAgICAgICAgIGF2YWlsYWJsZURldmljZXMgPSBhdmFpbGFibGVQcmltYXJ5RGV2aWNlczsKICAgICAgICAgfQorICAgICAgICBpZiAoZ2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9SRUNPUkQpID09IEFVRElPX1BPTElDWV9GT1JDRV9CVF9TQ08pIHsKKyAgICAgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZURldmljZXMuZ2V0RGV2aWNlKAorICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fQkxVRVRPT1RIX1NDT19IRUFEU0VULCBTdHJpbmc4KCIiKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldEZpcnN0RXhpc3RpbmdEZXZpY2UoeworICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9XSVJFRF9IRUFEU0VULCBBVURJT19ERVZJQ0VfSU5fVVNCX0hFQURTRVQsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0UsIEFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQ30pOwogICAgICAgICBicmVhazsKICAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6Ci0gICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9CQUNLX01JQykgewotICAgICAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDOwotICAgICAgICB9IGVsc2UgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUM7Ci0gICAgICAgIH0gZWxzZSBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSkgewotICAgICAgICAgICAgLy8gVGhpcyBpcyBzcGVjaWZpY2FsbHkgZm9yIGEgZGV2aWNlIHdpdGhvdXQgYnVpbHQtaW4gbWljCi0gICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRTsKLSAgICAgICAgfQorICAgICAgICAvLyBGb3IgYSBkZXZpY2Ugd2l0aG91dCBidWlsdC1pbiBtaWMsIGFkZGluZyB1c2IgZGV2aWNlCisgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZURldmljZXMuZ2V0Rmlyc3RFeGlzdGluZ0RldmljZSh7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX0JBQ0tfTUlDLCBBVURJT19ERVZJQ0VfSU5fQlVJTFRJTl9NSUMsCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1VTQl9ERVZJQ0V9KTsKICAgICAgICAgYnJlYWs7CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTks6CiAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDoKLSAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1ZPSUNFX0NBTEwpIHsKLSAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9WT0lDRV9DQUxMOwotICAgICAgICB9CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOgorICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldERldmljZSgKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVk9JQ0VfQ0FMTCwgU3RyaW5nOCgiIiksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfUEVSRk9STUFOQ0U6CisgICAgICAgIGRldmljZSA9IGF2YWlsYWJsZURldmljZXMuZ2V0Rmlyc3RFeGlzdGluZ0RldmljZSh7CisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1dJUkVEX0hFQURTRVQsIEFVRElPX0RFVklDRV9JTl9VU0JfSEVBRFNFVCwKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fVVNCX0RFVklDRSwgQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDfSk7CiAgICAgICAgIGJyZWFrOwogICAgIGNhc2UgQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVg6Ci0gICAgICAgIGlmIChhdmFpbGFibGVEZXZpY2VUeXBlcyAmIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYKSB7Ci0gICAgICAgICAgICBkZXZpY2UgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKLSAgICAgICAgfQorICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldERldmljZSgKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwgU3RyaW5nOCgiIiksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICAgICAgYnJlYWs7Ci0gICAgIGNhc2UgQVVESU9fU09VUkNFX0ZNX1RVTkVSOgotICAgICAgICBpZiAoYXZhaWxhYmxlRGV2aWNlVHlwZXMgJiBBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIpIHsKLSAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9GTV9UVU5FUjsKLSAgICAgICAgfQorICAgIGNhc2UgQVVESU9fU09VUkNFX0ZNX1RVTkVSOgorICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldERldmljZSgKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fRk1fVFVORVIsIFN0cmluZzgoIiIpLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgQVVESU9fU09VUkNFX0VDSE9fUkVGRVJFTkNFOgorICAgICAgICBkZXZpY2UgPSBhdmFpbGFibGVEZXZpY2VzLmdldERldmljZSgKKyAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fRUNIT19SRUZFUkVOQ0UsIFN0cmluZzgoIiIpLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICAgIEFMT0dXKCJnZXREZXZpY2VGb3JJbnB1dFNvdXJjZSgpIGludmFsaWQgaW5wdXQgc291cmNlICVkIiwgaW5wdXRTb3VyY2UpOwogICAgICAgICBicmVhazsKICAgICB9Ci0gICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgIGlmIChkZXZpY2UgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HVigiZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoKSBubyBkZXZpY2UgZm91bmQgZm9yIHNvdXJjZSAlZCIsIGlucHV0U291cmNlKTsKLSAgICAgICAgaWYgKGF2YWlsYWJsZURldmljZVR5cGVzICYgQVVESU9fREVWSUNFX0lOX1NUVUIpIHsKLSAgICAgICAgICAgIGRldmljZSA9IEFVRElPX0RFVklDRV9JTl9TVFVCOwotICAgICAgICB9Ci0gICAgICAgIEFMT0dFX0lGKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSwKKyAgICAgICAgZGV2aWNlID0gYXZhaWxhYmxlRGV2aWNlcy5nZXREZXZpY2UoCisgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1NUVUIsIFN0cmluZzgoIiIpLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgIEFMT0dFX0lGKGRldmljZSA9PSBudWxscHRyLAogICAgICAgICAgICAgICAgICAiZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoKSBubyBkZWZhdWx0IGRldmljZSBkZWZpbmVkIik7CiAgICAgfQotICAgIEFMT0dWKCJnZXREZXZpY2VGb3JJbnB1dFNvdXJjZSgpaW5wdXQgc291cmNlICVkLCBkZXZpY2UgJTA4eCIsIGlucHV0U291cmNlLCBkZXZpY2UpOworICAgIEFMT0dWX0lGKGRldmljZSAhPSBudWxscHRyLAorICAgICAgICAgICAgICJnZXREZXZpY2VGb3JJbnB1dFNvdXJjZSgpaW5wdXQgc291cmNlICVkLCBkZXZpY2UgJTA4eCIsCisgICAgICAgICAgICAgaW5wdXRTb3VyY2UsIGRldmljZS0+dHlwZSgpKTsKICAgICByZXR1cm4gZGV2aWNlOwogfQogCi10ZW1wbGF0ZSA8PgotQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlICpFbmdpbmU6OnF1ZXJ5SW50ZXJmYWNlKCkKK3ZvaWQgRW5naW5lOjp1cGRhdGVEZXZpY2VTZWxlY3Rpb25DYWNoZSgpCiB7Ci0gICAgcmV0dXJuICZtTWFuYWdlckludGVyZmFjZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJml0ZXIgOiBnZXRQcm9kdWN0U3RyYXRlZ2llcygpKSB7CisgICAgICAgIGNvbnN0IGF1dG8mIHN0cmF0ZWd5ID0gaXRlci5zZWNvbmQ7CisgICAgICAgIGF1dG8gZGV2aWNlcyA9IGdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3ktPmdldElkKCkpOworICAgICAgICBtRGV2aWNlc0ZvclN0cmF0ZWdpZXNbc3RyYXRlZ3ktPmdldElkKCldID0gZGV2aWNlczsKKyAgICAgICAgc3RyYXRlZ3ktPnNldERldmljZVR5cGVzKGRldmljZXMudHlwZXMoKSk7CisgICAgICAgIHN0cmF0ZWd5LT5zZXREZXZpY2VBZGRyZXNzKGRldmljZXMuZ2V0Rmlyc3RWYWxpZEFkZHJlc3MoKS5jX3N0cigpKTsKKyAgICB9Cit9CisKK0RldmljZVZlY3RvciBFbmdpbmU6OmdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBjb25zdCB7CisgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZU91dHB1dERldmljZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCk7CisKKyAgICAvLyBjaGVjayBpZiB0aGlzIHN0cmF0ZWd5IGhhcyBhIHByZWZlcnJlZCBkZXZpY2UgdGhhdCBpcyBhdmFpbGFibGUsCisgICAgLy8gaWYgeWVzLCBnaXZlIHByaW9yaXR5IHRvIGl0CisgICAgQXVkaW9EZXZpY2VUeXBlQWRkciBwcmVmZXJyZWRTdHJhdGVneURldmljZTsKKyAgICBjb25zdCBzdGF0dXNfdCBzdGF0dXMgPSBnZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgcHJlZmVycmVkU3RyYXRlZ3lEZXZpY2UpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gdGhlcmUgaXMgYSBwcmVmZXJyZWQgZGV2aWNlLCBpcyBpdCBhdmFpbGFibGU/CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHByZWZlcnJlZEF2YWlsYWJsZURldkRlc2NyID0gYXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UoCisgICAgICAgICAgICAgICAgcHJlZmVycmVkU3RyYXRlZ3lEZXZpY2UubVR5cGUsCisgICAgICAgICAgICAgICAgU3RyaW5nOChwcmVmZXJyZWRTdHJhdGVneURldmljZS5tQWRkcmVzcy5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgIGlmIChwcmVmZXJyZWRBdmFpbGFibGVEZXZEZXNjciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVlYoIiVzIHVzaW5nIHByZWYgZGV2aWNlIDB4JTA4eC8lcyBmb3Igc3RyYXRlZ3kgJXUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgcHJlZmVycmVkU3RyYXRlZ3lEZXZpY2UubVR5cGUsIHByZWZlcnJlZFN0cmF0ZWd5RGV2aWNlLm1BZGRyZXNzLCBzdHJhdGVneSk7CisgICAgICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKHByZWZlcnJlZEF2YWlsYWJsZURldkRlc2NyKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIERldmljZVZlY3RvciBhdmFpbGFibGVJbnB1dERldmljZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKTsKKyAgICBjb25zdCBTd0F1ZGlvT3V0cHV0Q29sbGVjdGlvbiYgb3V0cHV0cyA9IGdldEFwbU9ic2VydmVyKCktPmdldE91dHB1dHMoKTsKKyAgICBhdXRvIGxlZ2FjeVN0cmF0ZWd5ID0gbUxlZ2FjeVN0cmF0ZWd5TWFwLmZpbmQoc3RyYXRlZ3kpICE9IGVuZChtTGVnYWN5U3RyYXRlZ3lNYXApID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbUxlZ2FjeVN0cmF0ZWd5TWFwLmF0KHN0cmF0ZWd5KSA6IFNUUkFURUdZX05PTkU7CisgICAgcmV0dXJuIGdldERldmljZXNGb3JTdHJhdGVneUludChsZWdhY3lTdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZU91dHB1dERldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVJbnB1dERldmljZXMsIG91dHB1dHMpOworfQorCitEZXZpY2VWZWN0b3IgRW5naW5lOjpnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmcHJlZmVycmVkRGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUpIGNvbnN0Cit7CisgICAgLy8gRmlyc3QgY2hlY2sgZm9yIGV4cGxpY3Qgcm91dGluZyBkZXZpY2UKKyAgICBpZiAocHJlZmVycmVkRGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIiVzIGV4cGxpY2l0IFJvdXRpbmcgb24gZGV2aWNlICVzIiwgX19mdW5jX18sIHByZWZlcnJlZERldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERldmljZVZlY3RvcihwcmVmZXJyZWREZXZpY2UpOworICAgIH0KKyAgICBwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kgPSBnZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOworICAgIGNvbnN0IERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpOworICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0T3V0cHV0cygpOworICAgIC8vCisgICAgLy8gQFRPRE86IHdoYXQgaXMgdGhlIHByaW9yaXR5IG9mIGV4cGxpY2l0IHJvdXRpbmc/IFNoYWxsIGl0IGJlIGNvbnNpZGVyZWQgZmlyc3QgYXMgaXQgdXNlZCB0bworICAgIC8vIGJlIGJ5IEFQTT8KKyAgICAvLworICAgIC8vIEhvbm9yIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMgb25seSBpZiBhbGwgYWN0aXZlIGNsaWVudHMgaGF2ZSBhIHByZWZlcnJlZCByb3V0ZSBpbiB3aGljaAorICAgIC8vIGNhc2UgdGhlIGxhc3QgYWN0aXZlIGNsaWVudCByb3V0ZSBpcyB1c2VkCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gZmluZFByZWZlcnJlZERldmljZShvdXRwdXRzLCBzdHJhdGVneSwgYXZhaWxhYmxlT3V0cHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IoZGV2aWNlKTsKKyAgICB9CisKKyAgICByZXR1cm4gZnJvbUNhY2hlPyBtRGV2aWNlc0ZvclN0cmF0ZWdpZXMuYXQoc3RyYXRlZ3kpIDogZ2V0RGV2aWNlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneSk7Cit9CisKK0RldmljZVZlY3RvciBFbmdpbmU6OmdldE91dHB1dERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGJvb2wgZnJvbUNhY2hlKSBjb25zdAoreworICAgIGF1dG8gYXR0cmlidXRlcyA9IGdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgcmV0dXJuIGdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIG51bGxwdHIsIGZyb21DYWNoZSk7Cit9CisKK3NwPERldmljZURlc2NyaXB0b3I+IEVuZ2luZTo6Z2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiAqbWl4KSBjb25zdAoreworICAgIGNvbnN0IGF1dG8gJnBvbGljeU1peGVzID0gZ2V0QXBtT2JzZXJ2ZXIoKS0+Z2V0QXVkaW9Qb2xpY3lNaXhDb2xsZWN0aW9uKCk7CisgICAgY29uc3QgYXV0byBhdmFpbGFibGVJbnB1dERldmljZXMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKTsKKyAgICBjb25zdCBhdXRvICZpbnB1dHMgPSBnZXRBcG1PYnNlcnZlcigpLT5nZXRJbnB1dHMoKTsKKyAgICBzdGQ6OnN0cmluZyBhZGRyZXNzOworCisgICAgLy8KKyAgICAvLyBFeHBsaWNpdCBSb3V0aW5nID8/PyB3aGF0IGlzIHRoZSBwcmlvcml0eSBvZiBleHBsaWNpdCByb3V0aW5nPyBTaGFsbCBpdCBiZSBjb25zaWRlcmVkCisgICAgLy8gZmlyc3QgYXMgaXQgdXNlZCB0byBiZSBieSBBUE0/CisgICAgLy8KKyAgICAvLyBIb25vciBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3RzIG9ubHkgaWYgYWxsIGFjdGl2ZSBjbGllbnRzIGhhdmUgYSBwcmVmZXJyZWQgcm91dGUgaW4gd2hpY2gKKyAgICAvLyBjYXNlIHRoZSBsYXN0IGFjdGl2ZSBjbGllbnQgcm91dGUgaXMgdXNlZAorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9CisgICAgICAgICAgICBmaW5kUHJlZmVycmVkRGV2aWNlKGlucHV0cywgYXR0ci5zb3VyY2UsIGF2YWlsYWJsZUlucHV0RGV2aWNlcyk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBkZXZpY2U7CisgICAgfQorCisgICAgZGV2aWNlID0gcG9saWN5TWl4ZXMuZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoYXR0ci5zb3VyY2UsIGF2YWlsYWJsZUlucHV0RGV2aWNlcywgbWl4KTsKKyAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGRldmljZTsKKyAgICB9CisKKyAgICBkZXZpY2UgPSBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdHRyLnNvdXJjZSk7CisgICAgaWYgKGRldmljZSA9PSBudWxscHRyIHx8ICFhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShkZXZpY2UtPnR5cGUoKSkpIHsKKyAgICAgICAgLy8gUmV0dXJuIGltbWVkaWF0ZWx5IGlmIHRoZSBkZXZpY2UgaXMgbnVsbCBvciBpdCBpcyBub3QgYSByZW1vdGUgc3VibWl4IGRldmljZS4KKyAgICAgICAgcmV0dXJuIGRldmljZTsKKyAgICB9CisKKyAgICAvLyBGb3IgcmVtb3RlIHN1Ym1peCBkZXZpY2UsIHRyeSB0byBmaW5kIHRoZSBkZXZpY2UgYnkgYWRkcmVzcy4KKyAgICBhZGRyZXNzID0gIjAiOworICAgIHN0ZDo6c2l6ZV90IHBvczsKKyAgICBzdGQ6OnN0cmluZyB0YWdzIHsgYXR0ci50YWdzIH07CisgICAgaWYgKChwb3MgPSB0YWdzLmZpbmQoImFkZHI9IikpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgIGFkZHJlc3MgPSB0YWdzLnN1YnN0cihwb3MgKyBzdGQ6OnN0cmxlbigiYWRkcj0iKSk7CisgICAgfQorICAgIHJldHVybiBhdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlKGRldmljZS0+dHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoYWRkcmVzcy5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CiB9CiAKIH0gLy8gbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuaAppbmRleCAwNjE4NmMxLi40MzYwYzZmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmUuaApAQCAtMTYsOSArMTYsOCBAQAogCiAjcHJhZ21hIG9uY2UKIAotCi0jaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VySW50ZXJmYWNlLmgiCi0jaW5jbHVkZSA8QXVkaW9HYWluLmg+CisjaW5jbHVkZSAiRW5naW5lQmFzZS5oIgorI2luY2x1ZGUgIkVuZ2luZUludGVyZmFjZS5oIgogI2luY2x1ZGUgPHBvbGljeS5oPgogCiBuYW1lc3BhY2UgYW5kcm9pZApAQCAtMjksMTE0ICsyOCw2MyBAQAogbmFtZXNwYWNlIGF1ZGlvX3BvbGljeQogewogCi1jbGFzcyBFbmdpbmUKK2VudW0gbGVnYWN5X3N0cmF0ZWd5IHsKKyAgICBTVFJBVEVHWV9OT05FID0gLTEsCisgICAgU1RSQVRFR1lfTUVESUEsCisgICAgU1RSQVRFR1lfUEhPTkUsCisgICAgU1RSQVRFR1lfU09OSUZJQ0FUSU9OLAorICAgIFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMLAorICAgIFNUUkFURUdZX0RUTUYsCisgICAgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwKKyAgICBTVFJBVEVHWV9UUkFOU01JVFRFRF9USFJPVUdIX1NQRUFLRVIsCisgICAgU1RSQVRFR1lfQUNDRVNTSUJJTElUWSwKKyAgICBTVFJBVEVHWV9SRVJPVVRJTkcsCit9OworCitjbGFzcyBFbmdpbmUgOiBwdWJsaWMgRW5naW5lQmFzZQogewogcHVibGljOgogICAgIEVuZ2luZSgpOwotICAgIHZpcnR1YWwgfkVuZ2luZSgpOwotCi0gICAgdGVtcGxhdGUgPGNsYXNzIFJlcXVlc3RlZEludGVyZmFjZT4KLSAgICBSZXF1ZXN0ZWRJbnRlcmZhY2UgKnF1ZXJ5SW50ZXJmYWNlKCk7CisgICAgdmlydHVhbCB+RW5naW5lKCkgPSBkZWZhdWx0OwogCiBwcml2YXRlOgotICAgIC8vLyBJbnRlcmZhY2UgbWVtYmVycwotICAgIGNsYXNzIE1hbmFnZXJJbnRlcmZhY2VJbXBsIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZQotICAgIHsKLSAgICBwdWJsaWM6Ci0gICAgICAgIGV4cGxpY2l0IE1hbmFnZXJJbnRlcmZhY2VJbXBsKEVuZ2luZSAqcG9saWN5RW5naW5lKQotICAgICAgICAgICAgOiBtUG9saWN5RW5naW5lKHBvbGljeUVuZ2luZSkge30KKyAgICAvLy8KKyAgICAvLy8gZnJvbSBFbmdpbmVCYXNlLCBzbyBmcm9tIEVuZ2luZUludGVyZmFjZQorICAgIC8vLworICAgIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykgb3ZlcnJpZGU7CiAKLSAgICAgICAgdmlydHVhbCB2b2lkIHNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcikKLSAgICAgICAgewotICAgICAgICAgICAgbVBvbGljeUVuZ2luZS0+c2V0T2JzZXJ2ZXIob2JzZXJ2ZXIpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdENoZWNrKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmluaXRDaGVjaygpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvcklucHV0U291cmNlKGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlKSBjb25zdAotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHJvdXRpbmdfc3RyYXRlZ3kgZ2V0U3RyYXRlZ3lGb3JVc2FnZShhdWRpb191c2FnZV90IHVzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+Z2V0U3RyYXRlZ3lGb3JVc2FnZSh1c2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbVBvbGljeUVuZ2luZS0+c2V0UGhvbmVTdGF0ZShtb2RlKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX21vZGVfdCBnZXRQaG9uZVN0YXRlKCkgY29uc3QKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPmdldFBob25lU3RhdGUoKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGNvbmZpZykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG1Qb2xpY3lFbmdpbmUtPnNldEZvcmNlVXNlKHVzYWdlLCBjb25maWcpOwotICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBnZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UpIGNvbnN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtUG9saWN5RW5naW5lLT5nZXRGb3JjZVVzZSh1c2FnZSk7Ci0gICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gLypkZXZEZXNjKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCAvKnN0YXRlKi8pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICAgICAgfQotICAgIHByaXZhdGU6Ci0gICAgICAgIEVuZ2luZSAqbVBvbGljeUVuZ2luZTsKLSAgICB9IG1NYW5hZ2VySW50ZXJmYWNlOworICAgIERldmljZVZlY3RvciBnZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZwcmVmZXJlZERldmljZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlID0gZmFsc2UpIGNvbnN0IG92ZXJyaWRlOworCisgICAgRGV2aWNlVmVjdG9yIGdldE91dHB1dERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmcm9tQ2FjaGUgPSBmYWxzZSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIHNwPEF1ZGlvUG9saWN5TWl4PiAqbWl4ID0gbnVsbHB0cikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHVwZGF0ZURldmljZVNlbGVjdGlvbkNhY2hlKCkgb3ZlcnJpZGU7CiAKIHByaXZhdGU6CiAgICAgLyogQ29weSBmYWNpbGl0aWVzIGFyZSBwdXQgcHJpdmF0ZSB0byBkaXNhYmxlIGNvcHkuICovCiAgICAgRW5naW5lKGNvbnN0IEVuZ2luZSAmb2JqZWN0KTsKICAgICBFbmdpbmUgJm9wZXJhdG9yPShjb25zdCBFbmdpbmUgJm9iamVjdCk7CiAKLSAgICB2b2lkIHNldE9ic2VydmVyKEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICpvYnNlcnZlcik7Ci0KLSAgICBzdGF0dXNfdCBpbml0Q2hlY2soKTsKLQotICAgIGlubGluZSBib29sIGlzSW5DYWxsKCkgY29uc3QKLSAgICB7Ci0gICAgICAgIHJldHVybiBpc19zdGF0ZV9pbl9jYWxsKG1QaG9uZVN0YXRlKTsKLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBtb2RlKTsKLSAgICBhdWRpb19tb2RlX3QgZ2V0UGhvbmVTdGF0ZSgpIGNvbnN0Ci0gICAgewotICAgICAgICByZXR1cm4gbVBob25lU3RhdGU7Ci0gICAgfQotICAgIHN0YXR1c190IHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBjb25maWcpOwotICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKSBjb25zdAotICAgIHsKLSAgICAgICAgcmV0dXJuIG1Gb3JjZVVzZVt1c2FnZV07Ci0gICAgfQogICAgIHN0YXR1c190IHNldERlZmF1bHREZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSk7CiAKLSAgICByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5Rm9yVXNhZ2UoYXVkaW9fdXNhZ2VfdCB1c2FnZSk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpIGNvbnN0OwotICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneUludChyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZU91dHB1dERldmljZXMsCi0gICAgICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlSW5wdXREZXZpY2VzLAotICAgICAgICAgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gJm91dHB1dHMsCi0gICAgICAgICAgICB1aW50MzJfdCBvdXRwdXREZXZpY2VUeXBlc1RvSWdub3JlKSBjb25zdDsKLSAgICBhdWRpb19kZXZpY2VzX3QgZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpIGNvbnN0OwotICAgIGF1ZGlvX21vZGVfdCBtUGhvbmVTdGF0ZTsgIC8qKjwgY3VycmVudCBwaG9uZSBzdGF0ZS4gKi8KKyAgICBEZXZpY2VWZWN0b3IgZ2V0RGV2aWNlc0ZvclN0cmF0ZWd5SW50KGxlZ2FjeV9zdHJhdGVneSBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVPdXRwdXREZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVmVjdG9yIGF2YWlsYWJsZUlucHV0RGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uICZvdXRwdXRzKSBjb25zdDsKIAotICAgIC8qKiBjdXJyZW50IGZvcmNlZCB1c2UgY29uZmlndXJhdGlvbi4gKi8KLSAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IG1Gb3JjZVVzZVtBVURJT19QT0xJQ1lfRk9SQ0VfVVNFX0NOVF07CisgICAgRGV2aWNlVmVjdG9yIGdldERldmljZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KSBjb25zdDsKIAotICAgIEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyICptQXBtT2JzZXJ2ZXI7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UpIGNvbnN0OworCisgICAgRGV2aWNlU3RyYXRlZ3lNYXAgbURldmljZXNGb3JTdHJhdGVnaWVzOworCisgICAgc3RkOjptYXA8cHJvZHVjdF9zdHJhdGVneV90LCBsZWdhY3lfc3RyYXRlZ3k+IG1MZWdhY3lTdHJhdGVneU1hcDsKIH07CiB9IC8vIG5hbWVzcGFjZSBhdWRpb19wb2xpY3kKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZUluc3RhbmNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZWRlZmF1bHQvc3JjL0VuZ2luZUluc3RhbmNlLmNwcAppbmRleCAxN2U5ODMyLi5lZWIzNzU4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9lbmdpbmVkZWZhdWx0L3NyYy9FbmdpbmVJbnN0YW5jZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvZW5naW5lZGVmYXVsdC9zcmMvRW5naW5lSW5zdGFuY2UuY3BwCkBAIC0xNCw0MSArMTQsMjEgQEAKICAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICovCiAKLSNpbmNsdWRlIDxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UuaD4KLSNpbmNsdWRlICJBdWRpb1BvbGljeUVuZ2luZUluc3RhbmNlLmgiCisjaW5jbHVkZSA8RW5naW5lSW50ZXJmYWNlLmg+CiAjaW5jbHVkZSAiRW5naW5lLmgiCiAKLW5hbWVzcGFjZSBhbmRyb2lkCi17Ci1uYW1lc3BhY2UgYXVkaW9fcG9saWN5Ci17CituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgYXVkaW9fcG9saWN5IHsKIAotRW5naW5lSW5zdGFuY2U6OkVuZ2luZUluc3RhbmNlKCkKK2V4dGVybiAiQyIgRW5naW5lSW50ZXJmYWNlKiBjcmVhdGVFbmdpbmVJbnN0YW5jZSgpCiB7CisgICAgcmV0dXJuIG5ldyAoc3RkOjpub3Rocm93KSBFbmdpbmUoKTsKIH0KIAotRW5naW5lSW5zdGFuY2UgKkVuZ2luZUluc3RhbmNlOjpnZXRJbnN0YW5jZSgpCitleHRlcm4gIkMiIHZvaWQgZGVzdHJveUVuZ2luZUluc3RhbmNlKEVuZ2luZUludGVyZmFjZSAqZW5naW5lKQogewotICAgIHN0YXRpYyBFbmdpbmVJbnN0YW5jZSBpbnN0YW5jZTsKLSAgICByZXR1cm4gJmluc3RhbmNlOwotfQotCi1FbmdpbmVJbnN0YW5jZTo6fkVuZ2luZUluc3RhbmNlKCkKLXsKLX0KLQotRW5naW5lICpFbmdpbmVJbnN0YW5jZTo6Z2V0RW5naW5lKCkgY29uc3QKLXsKLSAgICBzdGF0aWMgRW5naW5lIGVuZ2luZTsKLSAgICByZXR1cm4gJmVuZ2luZTsKLX0KLQotdGVtcGxhdGUgPD4KLUF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZSAqRW5naW5lSW5zdGFuY2U6OnF1ZXJ5SW50ZXJmYWNlKCkgY29uc3QKLXsKLSAgICByZXR1cm4gZ2V0RW5naW5lKCktPnF1ZXJ5SW50ZXJmYWNlPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZT4oKTsKKyAgICBkZWxldGUgc3RhdGljX2Nhc3Q8RW5naW5lKj4oZW5naW5lKTsKIH0KIAogfSAvLyBuYW1lc3BhY2UgYXVkaW9fcG9saWN5CiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXIvQW5kcm9pZC5tawpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWU2Y2ZhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlci9BbmRyb2lkLm1rCkBAIC0wLDAgKzEsMzAgQEAKK0xPQ0FMX1BBVEg6PSAkKGNhbGwgbXktZGlyKQorCitpZm5lcSAoJChVU0VfQ1VTVE9NX0FVRElPX1BPTElDWSksIDEpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcAorCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0CisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cworCitMT0NBTF9DX0lOQ0xVREVTICs9IFwKKyAgICAkKGNhbGwgaW5jbHVkZS1wYXRoLWZvciwgYXVkaW8tdXRpbHMpCisKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVMgOj0gXAorICAgIGxpYmF1ZGlvcG9saWN5Y29tbW9uIFwKKyAgICBsaWJhdWRpb3BvbGljeWVuZ2luZV9pbnRlcmZhY2VfaGVhZGVycyBcCisgICAgbGliYXVkaW9wb2xpY3ltYW5hZ2VyX2ludGVyZmFjZV9oZWFkZXJzCisKK0xPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCisKK0xPQ0FMX01PRFVMRTo9IGxpYmF1ZGlvcG9saWN5bWFuYWdlcgorCitpbmNsdWRlICQoQlVJTERfU0hBUkVEX0xJQlJBUlkpCisKK2VuZGlmICNpZm5lcSAoJChVU0VfQ1VTVE9NX0FVRElPX1BPTElDWSksIDEpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyL0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyL0F1ZGlvUG9saWN5RmFjdG9yeS5jcHAKaW5kZXggM2VmYTFiMC4uNDc2YTFlYyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlci9BdWRpb1BvbGljeUZhY3RvcnkuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXIvQXVkaW9Qb2xpY3lGYWN0b3J5LmNwcApAQCAtMTQsMTQgKzE0LDIwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCi0jaW5jbHVkZSAibWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCisjaW5jbHVkZSA8QXVkaW9Qb2xpY3lNYW5hZ2VyLmg+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogZXh0ZXJuICJDIiBBdWRpb1BvbGljeUludGVyZmFjZSogY3JlYXRlQXVkaW9Qb2xpY3lNYW5hZ2VyKAogICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlKQogewotICAgIHJldHVybiBuZXcgQXVkaW9Qb2xpY3lNYW5hZ2VyKGNsaWVudEludGVyZmFjZSk7CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyICphcG0gPSBuZXcgQXVkaW9Qb2xpY3lNYW5hZ2VyKGNsaWVudEludGVyZmFjZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXBtLT5pbml0aWFsaXplKCk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBkZWxldGUgYXBtOworICAgICAgICBhcG0gPSBudWxscHRyOworICAgIH0KKyAgICByZXR1cm4gYXBtOwogfQogCiBleHRlcm4gIkMiIHZvaWQgZGVzdHJveUF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUludGVyZmFjZSAqaW50ZXJmYWNlKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQW5kcm9pZC5icCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0FuZHJvaWQuYnAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZhMGQxOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0FuZHJvaWQuYnAKQEAgLTAsMCArMSw0NCBAQAorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0IiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkF1ZGlvUG9saWN5TWFuYWdlci5jcHAiLAorICAgICAgICAiRW5naW5lTGlicmFyeS5jcHAiLAorICAgIF0sCisKKyAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb2ZvdW5kYXRpb24iLAorICAgICAgICAibGliY3V0aWxzIiwKKyAgICAgICAgImxpYmRsIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeSIsCisgICAgICAgICJsaWJzb3VuZHRyaWdnZXIiLAorICAgICAgICAibGlibWVkaWFfaGVscGVyIiwKKyAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCisgICAgICAgICJsaWJiaW5kZXIiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlieG1sMiIsCisgICAgICAgIC8vIFRoZSBkZWZhdWx0IGF1ZGlvIHBvbGljeSBlbmdpbmUgaXMgYWx3YXlzIHByZXNlbnQgaW4gdGhlIHN5c3RlbSBpbWFnZS4KKyAgICAgICAgLy8gbGliYXVkaW9wb2xpY3llbmdpbmVjb25maWd1cmFibGUgY2FuIGJlIGJ1aWx0IGluIGFkZGl0aW9uIGJ5IHNwZWNpZnlpbmcKKyAgICAgICAgLy8gYSBkZXBlbmRlbmN5IG9uIGl0IGluIHRoZSBkZXZpY2UgbWFrZWZpbGUuIFRoZXJlIHdpbGwgYmUgbm8gYnVpbGQgdGltZQorICAgICAgICAvLyBjb25mbGljdCB3aXRoIGxpYmF1ZGlvcG9saWN5ZW5naW5lZGVmYXVsdC4KKyAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lZGVmYXVsdCIsCisgICAgXSwKKworICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJhdWRpb3BvbGljeWNvbW1vbiIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZV9pbnRlcmZhY2VfaGVhZGVycyIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeW1hbmFnZXJfaW50ZXJmYWNlX2hlYWRlcnMiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWyJsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMiXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5jcHAKaW5kZXggZmQ0OTQ3My4uYTcyZGE4MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvQXVkaW9Qb2xpY3lNYW5hZ2VyLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuY3BwCkBAIC0zNiwyMyArMzYsMTkgQEAKICNkZWZpbmUgQVVESU9fUE9MSUNZX0JMVUVUT09USF9MRUdBQ1lfSEFMX1hNTF9DT05GSUdfRklMRV9OQU1FIFwKICAgICAgICAgImF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uX2JsdWV0b290aF9sZWdhY3lfaGFsLnhtbCIKIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogI2luY2x1ZGUgPG1hdGguaD4KLQotI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oPgotI2luY2x1ZGUgPEF1ZGlvUG9saWN5RW5naW5lSW5zdGFuY2UuaD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KKyNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgotI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5SGVscGVyLmg+CisjaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+CiAjaW5jbHVkZSA8c291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgotI2luY2x1ZGUgPGF1ZGlvX3BvbGljeV9jb25mLmg+CiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lNYW5hZ2VyLmgiCi0jaWZuZGVmIFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKLSNpbmNsdWRlIDxDb25maWdQYXJzaW5nVXRpbHMuaD4KLSNpbmNsdWRlIDxTdHJlYW1EZXNjcmlwdG9yLmg+Ci0jZW5kaWYKICNpbmNsdWRlIDxTZXJpYWxpemVyLmg+CiAjaW5jbHVkZSAiVHlwZUNvbnZlcnRlci5oIgogI2luY2x1ZGUgPHBvbGljeS5oPgpAQCAtNjcsMjUgKzYzLDM1IEBACiAvLyBtZWRpYSAvIG5vdGlmaWNhdGlvbiAvIHN5c3RlbSB2b2x1bWUuCiBjb25zdGV4cHIgZmxvYXQgSU5fQ0FMTF9FQVJQSUVDRV9IRUFEUk9PTV9EQiA9IDMuZjsKIAotI2RlZmluZSBBUlJBWV9TSVpFKGEpIChzaXplb2YoYSkgLyBzaXplb2YoKGEpWzBdKSkKLS8vIEFycmF5IG9mIGFsbCBzdXJyb3VuZCBmb3JtYXRzLgotc3RhdGljIGNvbnN0IGF1ZGlvX2Zvcm1hdF90IFNVUlJPVU5EX0ZPUk1BVFNbXSA9IHsKLSAgICBBVURJT19GT1JNQVRfQUMzLAotICAgIEFVRElPX0ZPUk1BVF9FX0FDMywKLSAgICBBVURJT19GT1JNQVRfRFRTLAotICAgIEFVRElPX0ZPUk1BVF9EVFNfSEQsCi0gICAgQVVESU9fRk9STUFUX0FBQ19MQywKLSAgICBBVURJT19GT1JNQVRfRE9MQllfVFJVRUhELAotICAgIEFVRElPX0ZPUk1BVF9FX0FDM19KT0MsCi19OwotLy8gQXJyYXkgb2YgYWxsIEFBQyBmb3JtYXRzLiBXaGVuIEFBQyBpcyBlbmFibGVkIGJ5IHVzZXJzLCBhbGwgQUFDIGZvcm1hdHMgc2hvdWxkIGJlIGVuYWJsZWQuCi1zdGF0aWMgY29uc3QgYXVkaW9fZm9ybWF0X3QgQUFDX0ZPUk1BVFNbXSA9IHsKLSAgICBBVURJT19GT1JNQVRfQUFDX0xDLAotICAgIEFVRElPX0ZPUk1BVF9BQUNfSEVfVjEsCi0gICAgQVVESU9fRk9STUFUX0FBQ19IRV9WMiwKLSAgICBBVURJT19GT1JNQVRfQUFDX0VMRCwKLSAgICBBVURJT19GT1JNQVRfQUFDX1hIRSwKLX07CisvLyBDb21wcmVzc2VkIGZvcm1hdHMgZm9yIE1TRCBtb2R1bGUsIG9yZGVyZWQgZnJvbSBtb3N0IHByZWZlcnJlZCB0byBsZWFzdCBwcmVmZXJyZWQuCitzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+IGNvbXByZXNzZWRGb3JtYXRzT3JkZXIgPSB7eworICAgICAgICBBVURJT19GT1JNQVRfTUFUXzJfMSwgQVVESU9fRk9STUFUX01BVF8yXzAsIEFVRElPX0ZPUk1BVF9FX0FDMywKKyAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQgfX07CisvLyBDaGFubmVsIG1hc2tzIGZvciBNU0QgbW9kdWxlLCAzRCA+IDJEID4gMUQgb3JkZXJpbmcgKG1vc3QgcHJlZmVycmVkIHRvIGxlYXN0IHByZWZlcnJlZCkuCitzdGF0aWMgY29uc3Qgc3RkOjp2ZWN0b3I8YXVkaW9fY2hhbm5lbF9tYXNrX3Q+IHN1cnJvdW5kQ2hhbm5lbE1hc2tzT3JkZXIgPSB7eworICAgICAgICBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQxUE9JTlQyLCBBVURJT19DSEFOTkVMX09VVF8zUE9JTlQwUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQxUE9JTlQyLCBBVURJT19DSEFOTkVMX09VVF8yUE9JTlQwUE9JTlQyLAorICAgICAgICBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8gfX07CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBvcGVyYXRvcj09IChjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJmxlZnQsIGNvbnN0IFNvcnRlZFZlY3RvcjxUPiAmcmlnaHQpCit7CisgICAgaWYgKGxlZnQuc2l6ZSgpICE9IHJpZ2h0LnNpemUoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGZvciAoc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCByaWdodC5zaXplKCk7IGluZGV4KyspIHsKKyAgICAgICAgaWYgKGxlZnRbaW5kZXhdICE9IHJpZ2h0W2luZGV4XSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2Jvb2wgb3BlcmF0b3IhPSAoY29uc3QgU29ydGVkVmVjdG9yPFQ+ICZsZWZ0LCBjb25zdCBTb3J0ZWRWZWN0b3I8VD4gJnJpZ2h0KQoreworICAgIHJldHVybiAhKGxlZnQgPT0gcmlnaHQpOworfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBBdWRpb1BvbGljeUludGVyZmFjZSBpbXBsZW1lbnRhdGlvbgpAQCAtOTQsNDMgKzEwMCw1MSBAQAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpCiB7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGRldmljZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGRldmljZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfbmFtZSwgZW5jb2RlZEZvcm1hdCk7CiAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmZGV2aWNlX2FkZHJlc3MpCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSkKIHsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbShkZXZpY2VfYWRkcmVzcyk7CisgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW0oU3RyaW5nOChkZXZpY2UtPmFkZHJlc3MoKS5jX3N0cigpKSk7CiAgICAgY29uc3QgU3RyaW5nOCBrZXkoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUgPwotICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyOjprZXlTdHJlYW1Db25uZWN0IDogQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbURpc2Nvbm5lY3QpOwotICAgIHBhcmFtLmFkZEludChrZXksIGRldmljZSk7CisgICAgICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXI6OmtleURldmljZUNvbm5lY3QgOiBBdWRpb1BhcmFtZXRlcjo6a2V5RGV2aWNlRGlzY29ubmVjdCk7CisgICAgcGFyYW0uYWRkSW50KGtleSwgZGV2aWNlLT50eXBlKCkpOwogICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKEFVRElPX0lPX0hBTkRMRV9OT05FLCBwYXJhbS50b1N0cmluZygpKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoYXVkaW9fZGV2aWNlc190IGRldmljZSwKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCkKIHsKLSAgICBBTE9HVigic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KCkgZGV2aWNlOiAweCVYLCBzdGF0ZSAlZCwgYWRkcmVzcyAlcyBuYW1lICVzIiwKLSAgICAgICAgICAgIGRldmljZSwgc3RhdGUsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7CisgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludCgpIGRldmljZTogMHglWCwgc3RhdGUgJWQsIGFkZHJlc3MgJXMgbmFtZSAlcyBmb3JtYXQgMHglWCIsCisgICAgICAgICAgICBkZXZpY2VUeXBlLCBzdGF0ZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0KTsKIAogICAgIC8vIGNvbm5lY3QvZGlzY29ubmVjdCBvbmx5IDEgZGV2aWNlIGF0IGEgdGltZQotICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlVHlwZSkgJiYgIWF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2VUeXBlKSkgcmV0dXJuIEJBRF9WQUxVRTsKIAotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQotICAgICAgICAgICAgbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKGRldmljZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPQorICAgICAgICAgICAgbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKGRldmljZVR5cGUsIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSwgZW5jb2RlZEZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSk7CisgICAgcmV0dXJuIGRldmljZSA/IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChkZXZpY2UsIHN0YXRlKSA6IElOVkFMSURfT1BFUkFUSU9OOworfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKQorewogICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlcwotICAgIGlmIChhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UtPnR5cGUoKSkpIHsKICAgICAgICAgU29ydGVkVmVjdG9yIDxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKIAotICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihkZXZEZXNjKTsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YoZGV2aWNlKTsKIAogICAgICAgICAvLyBzYXZlIGEgY29weSBvZiB0aGUgb3BlbmVkIG91dHB1dCBkZXNjcmlwdG9ycyBiZWZvcmUgYW55IG91dHB1dCBpcyBvcGVuZWQgb3IgY2xvc2VkCiAgICAgICAgIC8vIGJ5IGNoZWNrT3V0cHV0c0ZvckRldmljZSgpLiBUaGlzIHdpbGwgYmUgbmVlZGVkIGJ5IGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpCkBAIC0xNDAsMTE1ICsxNTQsMTMzIEBACiAgICAgICAgIC8vIGhhbmRsZSBvdXRwdXQgZGV2aWNlIGNvbm5lY3Rpb24KICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRTogewogICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIGFscmVhZHkgY29ubmVjdGVkOiAleCIsIGRldmljZSk7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzKCkgZGV2aWNlIGFscmVhZHkgY29ubmVjdGVkOiAlcyIsIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNvbm5lY3RpbmcgZGV2aWNlICV4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcygpIGNvbm5lY3RpbmcgZGV2aWNlICVzIGZvcm1hdCAleCIsCisgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSwgZGV2aWNlLT5nZXRFbmNvZGVkRm9ybWF0KCkpOwogCiAgICAgICAgICAgICAvLyByZWdpc3RlciBuZXcgZGV2aWNlIGFzIGF2YWlsYWJsZQotICAgICAgICAgICAgaW5kZXggPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5hZGQoZGV2RGVzYyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZvckRldmljZShkZXZpY2UpOwotICAgICAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRCgic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPmF0dGFjaChtb2R1bGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5hZGQoZGV2aWNlKSA8IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvLyBCZWZvcmUgY2hlY2tpbmcgb3V0cHV0cywgYnJvYWRjYXN0IGNvbm5lY3QgZXZlbnQgdG8gYWxsb3cgSEFMIHRvIHJldHJpZXZlIGR5bmFtaWMKICAgICAgICAgICAgIC8vIHBhcmFtZXRlcnMgb24gbmV3bHkgY29ubmVjdGVkIGRldmljZXMgKGluc3RlYWQgb2Ygb3BlbmluZyB0aGUgb3V0cHV0cy4uLikKLSAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlLCBkZXZEZXNjLT5tQWRkcmVzcyk7CisgICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSk7CiAKLSAgICAgICAgICAgIGlmIChjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2RGVzYywgc3RhdGUsIG91dHB1dHMsIGRldkRlc2MtPm1BZGRyZXNzKSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShkZXZEZXNjKTsKKyAgICAgICAgICAgIGlmIChjaGVja091dHB1dHNGb3JEZXZpY2UoZGV2aWNlLCBzdGF0ZSwgb3V0cHV0cykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5yZW1vdmUoZGV2aWNlKTsKIAotICAgICAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgICAgICBtSHdNb2R1bGVzLmNsZWFuVXBGb3JEZXZpY2UoZGV2aWNlKTsKKworICAgICAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBkZXZpY2UgYXZhaWxhYmlsaXR5IHRvIEVuZ2luZQotICAgICAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldkRlc2MsIHN0YXRlKTsKIAogICAgICAgICAgICAgLy8gb3V0cHV0cyBzaG91bGQgbmV2ZXIgYmUgZW1wdHkgaGVyZQogICAgICAgICAgICAgQUxPR19BU1NFUlQob3V0cHV0cy5zaXplKCkgIT0gMCwgInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpOiIKICAgICAgICAgICAgICAgICAgICAgImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHJldHVybmVkIG5vIG91dHB1dHMgYnV0IHN0YXR1cyBPSyIpOwotICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHJldHVybmVkICV6dSBvdXRwdXRzIiwKLSAgICAgICAgICAgICAgICAgIG91dHB1dHMuc2l6ZSgpKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcygpIGNoZWNrT3V0cHV0c0ZvckRldmljZSgpIHJldHVybmVkICV6dSBvdXRwdXRzIiwgX19mdW5jX18sIG91dHB1dHMuc2l6ZSgpKTsKIAogICAgICAgICAgICAgfSBicmVhazsKICAgICAgICAgLy8gaGFuZGxlIG91dHB1dCBkZXZpY2UgZGlzY29ubmVjdGlvbgogICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU6IHsKICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIG5vdCBjb25uZWN0ZWQ6ICV4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBkZXZpY2Ugbm90IGNvbm5lY3RlZDogJXMiLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRpc2Nvbm5lY3Rpbmcgb3V0cHV0IGRldmljZSAleCIsIGRldmljZSk7CisgICAgICAgICAgICBBTE9HVigiJXMoKSBkaXNjb25uZWN0aW5nIG91dHB1dCBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogCiAgICAgICAgICAgICAvLyBTZW5kIERpc2Nvbm5lY3QgdG8gSEFMcwotICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlKTsKIAogICAgICAgICAgICAgLy8gcmVtb3ZlIGRldmljZSBmcm9tIGF2YWlsYWJsZSBvdXRwdXQgZGV2aWNlcwotICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldkRlc2MpOworICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMucmVtb3ZlKGRldmljZSk7CiAKLSAgICAgICAgICAgIGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZEZXNjLCBzdGF0ZSwgb3V0cHV0cywgZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICAgICAgbU91dHB1dHMuY2xlYXJTZXNzaW9uUm91dGVzRm9yRGV2aWNlKGRldmljZSk7CiAKLSAgICAgICAgICAgIC8vIFByb3BhZ2F0ZSBkZXZpY2UgYXZhaWxhYmlsaXR5IHRvIEVuZ2luZQotICAgICAgICAgICAgbUVuZ2luZS0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldkRlc2MsIHN0YXRlKTsKKyAgICAgICAgICAgIGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZpY2UsIHN0YXRlLCBvdXRwdXRzKTsKKworICAgICAgICAgICAgLy8gUmVzZXQgYWN0aXZlIGRldmljZSBjb2RlYworICAgICAgICAgICAgZGV2aWNlLT5zZXRFbmNvZGVkRm9ybWF0KEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKwogICAgICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgc3RhdGU6ICV4Iiwgc3RhdGUpOworICAgICAgICAgICAgQUxPR0UoIiVzKCkgaW52YWxpZCBzdGF0ZTogJXgiLCBfX2Z1bmNfXywgc3RhdGUpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogCi0gICAgICAgIC8vIGNoZWNrQTJkcFN1c3BlbmQgbXVzdCBydW4gYmVmb3JlIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcyBzbyB0aGF0IEEyRFAKLSAgICAgICAgLy8gb3V0cHV0IGlzIHN1c3BlbmRlZCBiZWZvcmUgYW55IHRyYWNrcyBhcmUgbW92ZWQgdG8gaXQKLSAgICAgICAgY2hlY2tBMmRwU3VzcGVuZCgpOwotICAgICAgICBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKTsKLSAgICAgICAgLy8gb3V0cHV0cyBtdXN0IGJlIGNsb3NlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKSBpcyBleGVjdXRlZAotICAgICAgICBpZiAoIW91dHB1dHMuaXNFbXB0eSgpKSB7CisgICAgICAgIC8vIFByb3BhZ2F0ZSBkZXZpY2UgYXZhaWxhYmlsaXR5IHRvIEVuZ2luZQorICAgICAgICBzZXRFbmdpbmVEZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSk7CisKKyAgICAgICAgLy8gTm8gbmVlZCB0byBldmFsdWF0ZSBwbGF5YmFjayByb3V0aW5nIHdoZW4gY29ubmVjdGluZyBhIHJlbW90ZSBzdWJtaXgKKyAgICAgICAgLy8gb3V0cHV0IGRldmljZSB1c2VkIGJ5IGEgZHluYW1pYyBwb2xpY3kgb2YgdHlwZSByZWNvcmRlciBhcyBubworICAgICAgICAvLyBwbGF5YmFjayB1c2UgY2FzZSBpcyBhZmZlY3RlZC4KKyAgICAgICAgYm9vbCBkb0NoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcyA9IHRydWU7CisgICAgICAgIGlmIChkZXZpY2UtPnR5cGUoKSA9PSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVggJiYgZGV2aWNlLT5hZGRyZXNzKCkgIT0gIjAiKSB7CiAgICAgICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IG91dHB1dHMpIHsKICAgICAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgICAgICAgICAgLy8gY2xvc2UgdW51c2VkIG91dHB1dHMgYWZ0ZXIgZGV2aWNlIGRpc2Nvbm5lY3Rpb24gb3IgZGlyZWN0IG91dHB1dHMgdGhhdCBoYXZlIGJlZW4KLSAgICAgICAgICAgICAgICAvLyBvcGVuZWQgYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgdG8gcXVlcnkgZHluYW1pYyBwYXJhbWV0ZXJzCi0gICAgICAgICAgICAgICAgaWYgKChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKCgoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApKSkgewotICAgICAgICAgICAgICAgICAgICBjbG9zZU91dHB1dChvdXRwdXQpOworICAgICAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBkZXNjLT5tUG9saWN5TWl4LnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICBpZiAocG9saWN5TWl4ICE9IG51bGxwdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICYmIHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTCisgICAgICAgICAgICAgICAgICAgICAgICAmJiBkZXZpY2UtPmFkZHJlc3MoKSA9PSBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLnN0cmluZygpKSB7CisgICAgICAgICAgICAgICAgICAgIGRvQ2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIGNoZWNrIGFnYWluIGFmdGVyIGNsb3NpbmcgQTJEUCBvdXRwdXQgdG8gcmVzZXQgbUEyZHBTdXNwZW5kZWQgaWYgbmVlZGVkCi0gICAgICAgICAgICBjaGVja0EyZHBTdXNwZW5kKCk7CiAgICAgICAgIH0KIAotICAgICAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOwotICAgICAgICBpZiAobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpID09IEFVRElPX01PREVfSU5fQ0FMTCAmJiBoYXNQcmltYXJ5T3V0cHV0KCkpIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlKTsKKyAgICAgICAgYXV0byBjaGVja0Nsb3NlT3V0cHV0cyA9IFsmXSgpIHsKKyAgICAgICAgICAgIC8vIG91dHB1dHMgbXVzdCBiZSBjbG9zZWQgYWZ0ZXIgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCkgaXMgZXhlY3V0ZWQKKyAgICAgICAgICAgIGlmICghb3V0cHV0cy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IG91dHB1dHMpIHsKKyAgICAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAvLyBjbG9zZSB1bnVzZWQgb3V0cHV0cyBhZnRlciBkZXZpY2UgZGlzY29ubmVjdGlvbiBvciBkaXJlY3Qgb3V0cHV0cyB0aGF0IGhhdmUKKyAgICAgICAgICAgICAgICAgICAgLy8gYmVlbiBvcGVuZWQgYnkgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgdG8gcXVlcnkgZHluYW1pYyBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgICAgIGlmICgoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBjaGVjayBBMkRQIGFnYWluIGFmdGVyIGNsb3NpbmcgQTJEUCBvdXRwdXQgdG8gcmVzZXQgbUEyZHBTdXNwZW5kZWQgaWYgbmVlZGVkCisgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH07CisKKyAgICAgICAgaWYgKGRvQ2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKSB7CisgICAgICAgICAgICBjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoY2hlY2tDbG9zZU91dHB1dHMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hlY2tDbG9zZU91dHB1dHMoKTsKICAgICAgICAgfQorCisgICAgICAgIGlmIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMICYmIGhhc1ByaW1hcnlPdXRwdXQoKSkgeworICAgICAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZXMpOworICAgICAgICB9CisgICAgICAgIGNvbnN0IERldmljZVZlY3RvciBtc2RPdXREZXZpY2VzID0gZ2V0TXNkQXVkaW9PdXREZXZpY2VzKCk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKICAgICAgICAgICAgIGlmICgobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpICE9IEFVRElPX01PREVfSU5fQ0FMTCkgfHwgKGRlc2MgIT0gbVByaW1hcnlPdXRwdXQpKSB7Ci0gICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZSA9IGdldE5ld091dHB1dERldmljZShkZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgICAgIERldmljZVZlY3RvciBuZXdEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhkZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pOwogICAgICAgICAgICAgICAgIC8vIGRvIG5vdCBmb3JjZSBkZXZpY2UgY2hhbmdlIG9uIGR1cGxpY2F0ZWQgb3V0cHV0IGJlY2F1c2UgaWYgZGV2aWNlIGlzIDAsIGl0IHdpbGwKICAgICAgICAgICAgICAgICAvLyBhbHNvIGZvcmNlIGEgZGV2aWNlIDAgZm9yIHRoZSB0d28gb3V0cHV0cyBpdCBpcyBkdXBsaWNhdGVkIHRvIHdoaWNoIG1heSBvdmVycmlkZQogICAgICAgICAgICAgICAgIC8vIGEgdmFsaWQgZGV2aWNlIHNlbGVjdGlvbiBvbiB0aG9zZSBvdXRwdXRzLgotICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSAhZGVzYy0+aXNEdXBsaWNhdGVkKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpCisgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IChtc2RPdXREZXZpY2VzLmlzRW1wdHkoKSB8fCBtc2RPdXREZXZpY2VzICE9IGRlc2MtPmRldmljZXMoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICYmICFkZXNjLT5pc0R1cGxpY2F0ZWQoKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgKCFkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZS0+dHlwZSgpKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbHdheXMgZm9yY2Ugd2hlbiBkaXNjb25uZWN0aW5nIChhIG5vbi1kdXBsaWNhdGVkIGRldmljZSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgKHN0YXRlID09IEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpKTsKLSAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2UoZGVzYywgbmV3RGV2aWNlLCBmb3JjZSwgMCk7CisgICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhkZXNjLCBuZXdEZXZpY2VzLCBmb3JjZSwgMCk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgewotICAgICAgICAgICAgY2xlYW5VcEZvckRldmljZShkZXZEZXNjKTsKKyAgICAgICAgICAgIGNsZWFuVXBGb3JEZXZpY2UoZGV2aWNlKTsKICAgICAgICAgfQogCiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKQEAgLTI1NiwxMDEgKzI4OCwxMDUgQEAKICAgICB9ICAvLyBlbmQgaWYgaXMgb3V0cHV0IGRldmljZQogCiAgICAgLy8gaGFuZGxlIGlucHV0IGRldmljZXMKLSAgICBpZiAoYXVkaW9faXNfaW5wdXRfZGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgU29ydGVkVmVjdG9yIDxhdWRpb19pb19oYW5kbGVfdD4gaW5wdXRzOwotCi0gICAgICAgIHNzaXplX3QgaW5kZXggPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmluZGV4T2YoZGV2RGVzYyk7CisgICAgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZShkZXZpY2UtPnR5cGUoKSkpIHsKKyAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihkZXZpY2UpOwogICAgICAgICBzd2l0Y2ggKHN0YXRlKQogICAgICAgICB7CiAgICAgICAgIC8vIGhhbmRsZSBpbnB1dCBkZXZpY2UgY29ubmVjdGlvbgogICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFOiB7CiAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKSBkZXZpY2UgYWxyZWFkeSBjb25uZWN0ZWQ6ICVkIiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBkZXZpY2UgYWxyZWFkeSBjb25uZWN0ZWQ6ICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxId01vZHVsZT4gbW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGb3JEZXZpY2UoZGV2aWNlKTsKLSAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gTlVMTCkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoKTogY291bGQgbm90IGZpbmQgSFcgbW9kdWxlIGZvciBkZXZpY2UgJTA4eCIsCi0gICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisKKyAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmFkZChkZXZpY2UpIDwgMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIC8vIEJlZm9yZSBjaGVja2luZyBpbnRwdXRzLCBicm9hZGNhc3QgY29ubmVjdCBldmVudCB0byBhbGxvdyBIQUwgdG8gcmV0cmlldmUgZHluYW1pYwogICAgICAgICAgICAgLy8gcGFyYW1ldGVycyBvbiBuZXdseSBjb25uZWN0ZWQgZGV2aWNlcyAoaW5zdGVhZCBvZiBvcGVuaW5nIHRoZSBpbnB1dHMuLi4pCi0gICAgICAgICAgICBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwgZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUpOwogCi0gICAgICAgICAgICBpZiAoY2hlY2tJbnB1dHNGb3JEZXZpY2UoZGV2RGVzYywgc3RhdGUsIGlucHV0cywgZGV2RGVzYy0+bUFkZHJlc3MpICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+bUFkZHJlc3MpOworICAgICAgICAgICAgaWYgKGNoZWNrSW5wdXRzRm9yRGV2aWNlKGRldmljZSwgc3RhdGUpICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5yZW1vdmUoZGV2aWNlKTsKKworICAgICAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUpOworCisgICAgICAgICAgICAgICAgbUh3TW9kdWxlcy5jbGVhblVwRm9yRGV2aWNlKGRldmljZSk7CisKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGluZGV4ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5hZGQoZGV2RGVzYyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaW5kZXhdLT5hdHRhY2gobW9kdWxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUHJvcGFnYXRlIGRldmljZSBhdmFpbGFiaWxpdHkgdG8gRW5naW5lCi0gICAgICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2RGVzYywgc3RhdGUpOwogICAgICAgICB9IGJyZWFrOwogCiAgICAgICAgIC8vIGhhbmRsZSBpbnB1dCBkZXZpY2UgZGlzY29ubmVjdGlvbgogICAgICAgICBjYXNlIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEU6IHsKICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICBBTE9HVygic2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgZGV2aWNlIG5vdCBjb25uZWN0ZWQ6ICVkIiwgZGV2aWNlKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMoKSBkZXZpY2Ugbm90IGNvbm5lY3RlZDogJXMiLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgQUxPR1YoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGRpc2Nvbm5lY3RpbmcgaW5wdXQgZGV2aWNlICV4IiwgZGV2aWNlKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcygpIGRpc2Nvbm5lY3RpbmcgaW5wdXQgZGV2aWNlICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKIAogICAgICAgICAgICAgLy8gU2V0IERpc2Nvbm5lY3QgdG8gSEFMcwotICAgICAgICAgICAgYnJvYWRjYXN0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgc3RhdGUsIGRldkRlc2MtPm1BZGRyZXNzKTsKKyAgICAgICAgICAgIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIHN0YXRlKTsKIAotICAgICAgICAgICAgY2hlY2tJbnB1dHNGb3JEZXZpY2UoZGV2RGVzYywgc3RhdGUsIGlucHV0cywgZGV2RGVzYy0+bUFkZHJlc3MpOwotICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5yZW1vdmUoZGV2RGVzYyk7CisgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnJlbW92ZShkZXZpY2UpOwogCi0gICAgICAgICAgICAvLyBQcm9wYWdhdGUgZGV2aWNlIGF2YWlsYWJpbGl0eSB0byBFbmdpbmUKLSAgICAgICAgICAgIG1FbmdpbmUtPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZEZXNjLCBzdGF0ZSk7CisgICAgICAgICAgICBjaGVja0lucHV0c0ZvckRldmljZShkZXZpY2UsIHN0YXRlKTsKICAgICAgICAgfSBicmVhazsKIAogICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgQUxPR0UoInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgc3RhdGU6ICV4Iiwgc3RhdGUpOworICAgICAgICAgICAgQUxPR0UoIiVzKCkgaW52YWxpZCBzdGF0ZTogJXgiLCBfX2Z1bmNfXywgc3RhdGUpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogCi0gICAgICAgIGNsb3NlQWxsSW5wdXRzKCk7CisgICAgICAgIC8vIFByb3BhZ2F0ZSBkZXZpY2UgYXZhaWxhYmlsaXR5IHRvIEVuZ2luZQorICAgICAgICBzZXRFbmdpbmVEZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSk7CisKKyAgICAgICAgY2hlY2tDbG9zZUlucHV0cygpOwogICAgICAgICAvLyBBcyB0aGUgaW5wdXQgZGV2aWNlIGxpc3QgY2FuIGltcGFjdCB0aGUgb3V0cHV0IGRldmljZSBzZWxlY3Rpb24sIHVwZGF0ZQogICAgICAgICAvLyBnZXREZXZpY2VGb3JTdHJhdGVneSgpIGNhY2hlCiAgICAgICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CiAKICAgICAgICAgaWYgKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX0lOX0NBTEwgJiYgaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgICAgIHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZSk7CisgICAgICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgdXBkYXRlQ2FsbFJvdXRpbmcobmV3RGV2aWNlcyk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSkgewotICAgICAgICAgICAgY2xlYW5VcEZvckRldmljZShkZXZEZXNjKTsKKyAgICAgICAgICAgIGNsZWFuVXBGb3JEZXZpY2UoZGV2aWNlKTsKICAgICAgICAgfQogCiAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0gLy8gZW5kIGlmIGlzIGlucHV0IGRldmljZQogCi0gICAgQUxPR1coInNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIGludmFsaWQgZGV2aWNlOiAleCIsIGRldmljZSk7CisgICAgQUxPR1coIiVzKCkgaW52YWxpZCBkZXZpY2U6ICVzIiwgX19mdW5jX18sIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0RW5naW5lRGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKSB7CisKKyAgICAvLyB0aGUgRW5naW5lIGRvZXMgbm90IGhhdmUgdG8ga25vdyBhYm91dCByZW1vdGUgc3VibWl4IGRldmljZXMgdXNlZCBieSBkeW5hbWljIGF1ZGlvIHBvbGljaWVzCisgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGRldmljZS0+dHlwZSgpKSAmJiBkZXZpY2UtPmFkZHJlc3MoKSAhPSAiMCIpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSk7Cit9CisKKwogYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX2FkZHJlc3MpCiB7CiAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9Ci0gICAgICAgICAgICBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcywgIiIsCisgICAgICAgICAgICBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoZGV2aWNlLCBkZXZpY2VfYWRkcmVzcywgIiIsIEFVRElPX0ZPUk1BVF9ERUZBVUxULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qIGFsbG93VG9DcmVhdGUgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmxlbihkZXZpY2VfYWRkcmVzcykgIT0gMCkvKm1hdGNoQWRkcmVzcyovKTsKIAogICAgIGlmIChkZXZEZXNjID09IDApIHsKLSAgICAgICAgQUxPR1coImdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIHVuZGVjbGFyZWQgZGV2aWNlLCB0eXBlICUwOHgsIGFkZHJlc3M6ICVzIiwKKyAgICAgICAgQUxPR1YoImdldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpIHVuZGVjbGFyZWQgZGV2aWNlLCB0eXBlICUwOHgsIGFkZHJlc3M6ICVzIiwKICAgICAgICAgICAgICAgZGV2aWNlLCBkZXZpY2VfYWRkcmVzcyk7CiAgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOwogICAgIH0KQEAgLTM2Miw1NSArMzk4LDY0IEBACiAgICAgfSBlbHNlIGlmIChhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgewogICAgICAgICBkZXZpY2VWZWN0b3IgPSAmbUF2YWlsYWJsZUlucHV0RGV2aWNlczsKICAgICB9IGVsc2UgewotICAgICAgICBBTE9HVygiZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkgaW52YWxpZCBkZXZpY2UgdHlwZSAlMDh4IiwgZGV2aWNlKTsKKyAgICAgICAgQUxPR1coIiVzKCkgaW52YWxpZCBkZXZpY2UgdHlwZSAlMDh4IiwgX19mdW5jX18sIGRldmljZSk7CiAgICAgICAgIHJldHVybiBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFOwogICAgIH0KIAotICAgIHJldHVybiAoZGV2aWNlVmVjdG9yLT5nZXREZXZpY2UoZGV2aWNlLCBTdHJpbmc4KGRldmljZV9hZGRyZXNzKSkgIT0gMCkgPworICAgIHJldHVybiAoZGV2aWNlVmVjdG9yLT5nZXREZXZpY2UoCisgICAgICAgICAgICAgICAgZGV2aWNlLCBTdHJpbmc4KGRldmljZV9hZGRyZXNzKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpICE9IDApID8KICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFIDogQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpCiB7CiAgICAgc3RhdHVzX3Qgc3RhdHVzOwogICAgIFN0cmluZzggcmVwbHk7CiAgICAgQXVkaW9QYXJhbWV0ZXIgcGFyYW07CiAgICAgaW50IGlzUmVjb25maWdBMmRwU3VwcG9ydGVkID0gMDsKIAotICAgIEFMT0dWKCJoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoKCkgZGV2aWNlOiAweCVYLCBhZGRyZXNzICVzIG5hbWUgJXMiLAotICAgICAgICAgIGRldmljZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKKyAgICBBTE9HVigiaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKCgpIGRldmljZTogMHglWCwgYWRkcmVzcyAlcyBuYW1lICVzIGVuY29kZWRGb3JtYXQ6IDB4JVgiLAorICAgICAgICAgIGRldmljZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lLCBlbmNvZGVkRm9ybWF0KTsKIAogICAgIC8vIGNvbm5lY3QvZGlzY29ubmVjdCBvbmx5IDEgZGV2aWNlIGF0IGEgdGltZQogICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UpICYmICFhdWRpb19pc19pbnB1dF9kZXZpY2UoZGV2aWNlKSkgcmV0dXJuIEJBRF9WQUxVRTsKIAogICAgIC8vIENoZWNrIGlmIHRoZSBkZXZpY2UgaXMgY3VycmVudGx5IGNvbm5lY3RlZAotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPQotICAgICAgICAgICAgbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKGRldmljZSwgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihkZXZEZXNjKTsKLSAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKKyAgICBpZiAoZGV2aWNlTGlzdC5lbXB0eSgpKSB7CiAgICAgICAgIC8vIE5vdGhpbmcgdG8gZG86IGRldmljZSBpcyBub3QgY29ubmVjdGVkCiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9IGRldmljZUxpc3QuaXRlbUF0KDApOwogCiAgICAgLy8gRm9yIG9mZmxvYWRlZCBBMkRQLCBIdyBtb2R1bGVzIG1heSBoYXZlIHRoZSBjYXBhYmlsaXR5IHRvCi0gICAgLy8gY29uZmlndXJlIGNvZGVjcy4gQ2hlY2sgaWYgYW55IG9mIHRoZSBsb2FkZWQgaHcgbW9kdWxlcwotICAgIC8vIHN1cHBvcnRzIHRoaXMuCi0gICAgLy8gSWYgc3VwcG9ydGVkLCBzZW5kIGEgc2V0IHBhcmFtZXRlciB0byBjb25maWd1cmUgQTJEUCBjb2RlY3MKLSAgICAvLyBhbmQgcmV0dXJuLiBObyBuZWVkIHRvIHRvZ2dsZSBkZXZpY2Ugc3RhdGUuCi0gICAgaWYgKGRldmljZSAmIEFVRElPX0RFVklDRV9PVVRfQUxMX0EyRFApIHsKLSAgICAgICAgcmVwbHkgPSBtcENsaWVudEludGVyZmFjZS0+Z2V0UGFyYW1ldGVycygKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fSU9fSEFORExFX05PTkUsCi0gICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJlY29uZmlnQTJkcFN1cHBvcnRlZCkpOwotICAgICAgICBBdWRpb1BhcmFtZXRlciByZXBsaWVkUGFyYW1ldGVycyhyZXBseSk7Ci0gICAgICAgIHJlcGxpZWRQYXJhbWV0ZXJzLmdldEludCgKLSAgICAgICAgICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQpLCBpc1JlY29uZmlnQTJkcFN1cHBvcnRlZCk7Ci0gICAgICAgIGlmIChpc1JlY29uZmlnQTJkcFN1cHBvcnRlZCkgewotICAgICAgICAgICAgY29uc3QgU3RyaW5nOCBrZXkoQXVkaW9QYXJhbWV0ZXI6OmtleVJlY29uZmlnQTJkcCk7Ci0gICAgICAgICAgICBwYXJhbS5hZGQoa2V5LCBTdHJpbmc4KCJ0cnVlIikpOwotICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnNldFBhcmFtZXRlcnMoQVVESU9fSU9fSEFORExFX05PTkUsIHBhcmFtLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIC8vIGNvbmZpZ3VyZSBjb2RlY3MuCisgICAgLy8gSGFuZGxlIHR3byBzcGVjaWZpYyBjYXNlcyBieSBzZW5kaW5nIGEgc2V0IHBhcmFtZXRlciB0bworICAgIC8vIGNvbmZpZ3VyZSBBMkRQIGNvZGVjcy4gTm8gbmVlZCB0byB0b2dnbGUgZGV2aWNlIHN0YXRlLgorICAgIC8vIENhc2UgMTogQTJEUCBhY3RpdmUgZGV2aWNlIHN3aXRjaGVzIGZyb20gcHJpbWFyeSB0byBwcmltYXJ5CisgICAgLy8gbW9kdWxlCisgICAgLy8gQ2FzZSAyOiBBMkRQIGRldmljZSBjb25maWcgY2hhbmdlcyBvbiBwcmltYXJ5IG1vZHVsZS4KKyAgICBpZiAoYXVkaW9faXNfYTJkcF9vdXRfZGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgc3A8SHdNb2R1bGU+IG1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlVHlwZShkZXZpY2UsIGVuY29kZWRGb3JtYXQpOworICAgICAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgcHJpbWFyeUhhbmRsZSA9IG1QcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKTsKKyAgICAgICAgaWYgKGF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCkuY29udGFpbnMoZGV2RGVzYykgJiYKKyAgICAgICAgICAgKG1vZHVsZSAhPSAwICYmIG1vZHVsZS0+Z2V0SGFuZGxlKCkgPT0gcHJpbWFyeUhhbmRsZSkpIHsKKyAgICAgICAgICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JT19IQU5ETEVfTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVJlY29uZmlnQTJkcFN1cHBvcnRlZCkpOworICAgICAgICAgICAgQXVkaW9QYXJhbWV0ZXIgcmVwbGllZFBhcmFtZXRlcnMocmVwbHkpOworICAgICAgICAgICAgcmVwbGllZFBhcmFtZXRlcnMuZ2V0SW50KAorICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQpLCBpc1JlY29uZmlnQTJkcFN1cHBvcnRlZCk7CisgICAgICAgICAgICBpZiAoaXNSZWNvbmZpZ0EyZHBTdXBwb3J0ZWQpIHsKKyAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4IGtleShBdWRpb1BhcmFtZXRlcjo6a2V5UmVjb25maWdBMmRwKTsKKyAgICAgICAgICAgICAgICBwYXJhbS5hZGQoa2V5LCBTdHJpbmc4KCJ0cnVlIikpOworICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKEFVRElPX0lPX0hBTkRMRV9OT05FLCBwYXJhbS50b1N0cmluZygpKTsKKyAgICAgICAgICAgICAgICBkZXZEZXNjLT5zZXRFbmNvZGVkRm9ybWF0KGVuY29kZWRGb3JtYXQpOworICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtNDE4LDcgKzQ2Myw4IEBACiAgICAgLy8gVGhpcyB3aWxsIGZvcmNlIHJlYWRpbmcgYWdhaW4gdGhlIGRldmljZSBjb25maWd1cmF0aW9uCiAgICAgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX2FkZHJlc3MsIGRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5nZXRFbmNvZGVkRm9ybWF0KCkpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR1coImhhbmRsZURldmljZUNvbmZpZ0NoYW5nZSgpIGVycm9yIGRpc2FibGluZyBjb25uZWN0aW9uIHN0YXRlOiAlZCIsCiAgICAgICAgICAgICAgIHN0YXR1cyk7CkBAIC00MjcsNyArNDczLDcgQEAKIAogICAgIHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUsIGVuY29kZWRGb3JtYXQpOwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgQUxPR1coImhhbmRsZURldmljZUNvbmZpZ0NoYW5nZSgpIGVycm9yIGVuYWJsaW5nIGNvbm5lY3Rpb24gc3RhdGU6ICVkIiwKICAgICAgICAgICAgICAgc3RhdHVzKTsKQEAgLTQzNywxMjAgKzQ4MywxNjAgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlQ2FsbFJvdXRpbmcoYXVkaW9fZGV2aWNlc190IHJ4RGV2aWNlLCB1aW50MzJfdCBkZWxheU1zKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8YXVkaW9fZm9ybWF0X3Q+ICpmb3JtYXRzKQoreworICAgIEFMT0dWKCJnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKCkiKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IGZvcm1hdFNldDsKKyAgICBzcDxId01vZHVsZT4gcHJpbWFyeU1vZHVsZSA9CisgICAgICAgICAgICBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9QUklNQVJZKTsKKyAgICBpZiAocHJpbWFyeU1vZHVsZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcygpIHVuYWJsZSB0byBnZXQgcHJpbWFyeSBtb2R1bGUiLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBEZXZpY2VWZWN0b3IgZGVjbGFyZWREZXZpY2VzID0gcHJpbWFyeU1vZHVsZS0+Z2V0RGVjbGFyZWREZXZpY2VzKCkuZ2V0RGV2aWNlc0Zyb21UeXBlcygKKyAgICAgICAgICAgIGdldEF1ZGlvRGV2aWNlT3V0QWxsQTJkcFNldCgpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGRldmljZSA6IGRlY2xhcmVkRGV2aWNlcykgeworICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KGRldmljZS0+ZW5jb2RlZEZvcm1hdHMoKS5iZWdpbigpLCBkZXZpY2UtPmVuY29kZWRGb3JtYXRzKCkuZW5kKCkpOworICAgIH0KKyAgICBmb3JtYXRzLT5hc3NpZ24oZm9ybWF0U2V0LmJlZ2luKCksIGZvcm1hdFNldC5lbmQoKSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKwordWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVDYWxsUm91dGluZyhjb25zdCBEZXZpY2VWZWN0b3IgJnJ4RGV2aWNlcywgdWludDMyX3QgZGVsYXlNcykKIHsKICAgICBib29sIGNyZWF0ZVR4UGF0Y2ggPSBmYWxzZTsKKyAgICBib29sIGNyZWF0ZVJ4UGF0Y2ggPSBmYWxzZTsKICAgICB1aW50MzJfdCBtdXRlV2FpdE1zID0gMDsKIAotICAgIGlmKCFoYXNQcmltYXJ5T3V0cHV0KCkgfHwgbVByaW1hcnlPdXRwdXQtPmRldmljZSgpID09IEFVRElPX0RFVklDRV9PVVRfU1RVQikgeworICAgIGlmKCFoYXNQcmltYXJ5T3V0cHV0KCkgfHwKKyAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0LT5kZXZpY2VzKCkub25seUNvbnRhaW5zRGV2aWNlc1dpdGhUeXBlKEFVRElPX0RFVklDRV9PVVRfU1RVQikpIHsKICAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7CiAgICAgfQotICAgIGF1ZGlvX2RldmljZXNfdCB0eERldmljZSA9IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OKTsKLSAgICBBTE9HVigidXBkYXRlQ2FsbFJvdXRpbmcgZGV2aWNlIHJ4RGV2aWNlICUwOHggdHhEZXZpY2UgJTA4eCIsIHJ4RGV2aWNlLCB0eERldmljZSk7CisgICAgQUxPR19BU1NFUlQoIXJ4RGV2aWNlcy5pc0VtcHR5KCksICJ1cGRhdGVDYWxsUm91dGluZygpIG5vIHNlbGVjdGVkIG91dHB1dCBkZXZpY2UiKTsKKworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0geyAuc291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04gfTsKKyAgICBhdXRvIHR4U291cmNlRGV2aWNlID0gbUVuZ2luZS0+Z2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKGF0dHIpOworICAgIEFMT0dfQVNTRVJUKHR4U291cmNlRGV2aWNlICE9IDAsICJ1cGRhdGVDYWxsUm91dGluZygpIGlucHV0IHNlbGVjdGVkIGRldmljZSBub3QgYXZhaWxhYmxlIik7CisKKyAgICBBTE9HVigidXBkYXRlQ2FsbFJvdXRpbmcgZGV2aWNlIHJ4RGV2aWNlICVzIHR4RGV2aWNlICVzIiwKKyAgICAgICAgICByeERldmljZXMuaXRlbUF0KDApLT50b1N0cmluZygpLmNfc3RyKCksIHR4U291cmNlRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogCiAgICAgLy8gcmVsZWFzZSBleGlzdGluZyBSWCBwYXRjaCBpZiBhbnkKICAgICBpZiAobUNhbGxSeFBhdGNoICE9IDApIHsKLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKG1DYWxsUnhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICByZWxlYXNlQXVkaW9QYXRjaEludGVybmFsKG1DYWxsUnhQYXRjaC0+Z2V0SGFuZGxlKCkpOwogICAgICAgICBtQ2FsbFJ4UGF0Y2guY2xlYXIoKTsKICAgICB9CiAgICAgLy8gcmVsZWFzZSBUWCBwYXRjaCBpZiBhbnkKICAgICBpZiAobUNhbGxUeFBhdGNoICE9IDApIHsKLSAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKG1DYWxsVHhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICByZWxlYXNlQXVkaW9QYXRjaEludGVybmFsKG1DYWxsVHhQYXRjaC0+Z2V0SGFuZGxlKCkpOwogICAgICAgICBtQ2FsbFR4UGF0Y2guY2xlYXIoKTsKICAgICB9CiAKLSAgICAvLyBJZiB0aGUgUlggZGV2aWNlIGlzIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZSwgdGhlbiB1c2UgbGVnYWN5IHJvdXRpbmcgbWV0aG9kIGZvciB2b2ljZSBjYWxscwotICAgIC8vIHZpYSBzZXRPdXRwdXREZXZpY2UoKSBvbiBwcmltYXJ5IG91dHB1dC4KLSAgICAvLyBPdGhlcndpc2UsIGNyZWF0ZSB0d28gYXVkaW8gcGF0Y2hlcyBmb3IgVFggYW5kIFJYIHBhdGguCi0gICAgaWYgKGF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCkgJiByeERldmljZSkgewotICAgICAgICBtdXRlV2FpdE1zID0gc2V0T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCByeERldmljZSwgdHJ1ZSwgZGVsYXlNcyk7CisgICAgYXV0byB0ZWxlcGhvbnlSeE1vZHVsZSA9CisgICAgICAgIG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlVHlwZShBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgYXV0byB0ZWxlcGhvbnlUeE1vZHVsZSA9CisgICAgICAgIG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlVHlwZShBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgIC8vIHJldHJpZXZlIFJ4IFNvdXJjZSBhbmQgVHggU2luayBkZXZpY2UgZGVzY3JpcHRvcnMKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiByeFNvdXJjZURldmljZSA9CisgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlKEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IHR4U2lua0RldmljZSA9CisgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKKworICAgIC8vIFJYIGFuZCBUWCBUZWxlcGhvbnkgZGV2aWNlIGFyZSBkZWNsYXJlZCBieSBQcmltYXJ5IEF1ZGlvIEhBTAorICAgIGlmIChpc1ByaW1hcnlNb2R1bGUodGVsZXBob255UnhNb2R1bGUpICYmIGlzUHJpbWFyeU1vZHVsZSh0ZWxlcGhvbnlUeE1vZHVsZSkgJiYKKyAgICAgICAgICAgICh0ZWxlcGhvbnlSeE1vZHVsZS0+Z2V0SGFsVmVyc2lvbk1ham9yKCkgPj0gMykpIHsKKyAgICAgICAgaWYgKHJ4U291cmNlRGV2aWNlID09IDAgfHwgdHhTaW5rRGV2aWNlID09IDApIHsKKyAgICAgICAgICAgIC8vIFJYIC8gVFggVGVsZXBob255IGRldmljZShzKSBpcyhhcmUpIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlCisgICAgICAgICAgICBBTE9HRSgidXBkYXRlQ2FsbFJvdXRpbmcoKSBubyB0ZWxlcGhvbnkgVHggYW5kL29yIFJYIGRldmljZSIpOworICAgICAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7CisgICAgICAgIH0KKyAgICAgICAgLy8gY3JlYXRlQXVkaW9QYXRjaEludGVybmFsIG5vdyBzdXBwb3J0cyBib3RoIEhXIC8gU1cgYnJpZGdpbmcKKyAgICAgICAgY3JlYXRlUnhQYXRjaCA9IHRydWU7CisgICAgICAgIGNyZWF0ZVR4UGF0Y2ggPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIElmIHRoZSBSWCBkZXZpY2UgaXMgb24gdGhlIHByaW1hcnkgSFcgbW9kdWxlLCB0aGVuIHVzZSBsZWdhY3kgcm91dGluZyBtZXRob2QgZm9yCisgICAgICAgIC8vIHZvaWNlIGNhbGxzIHZpYSBzZXRPdXRwdXREZXZpY2UoKSBvbiBwcmltYXJ5IG91dHB1dC4KKyAgICAgICAgLy8gT3RoZXJ3aXNlLCBjcmVhdGUgdHdvIGF1ZGlvIHBhdGNoZXMgZm9yIFRYIGFuZCBSWCBwYXRoLgorICAgICAgICBjcmVhdGVSeFBhdGNoID0gIShhdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpLmNvbnRhaW5zKHJ4RGV2aWNlcy5pdGVtQXQoMCkpKSAmJgorICAgICAgICAgICAgICAgIChyeFNvdXJjZURldmljZSAhPSAwKTsKICAgICAgICAgLy8gSWYgdGhlIFRYIGRldmljZSBpcyBhbHNvIG9uIHRoZSBwcmltYXJ5IEhXIG1vZHVsZSwgc2V0T3V0cHV0RGV2aWNlKCkgd2lsbCB0YWtlIGNhcmUKICAgICAgICAgLy8gb2YgaXQgZHVlIHRvIGxlZ2FjeSBpbXBsZW1lbnRhdGlvbi4gSWYgbm90LCBjcmVhdGUgYSBwYXRjaC4KLSAgICAgICAgaWYgKChhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCkgJiB0eERldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKQotICAgICAgICAgICAgICAgID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICBjcmVhdGVUeFBhdGNoID0gdHJ1ZTsKLSAgICAgICAgfQorICAgICAgICBjcmVhdGVUeFBhdGNoID0gIShhdmFpbGFibGVQcmltYXJ5TW9kdWxlSW5wdXREZXZpY2VzKCkuY29udGFpbnModHhTb3VyY2VEZXZpY2UpKSAmJgorICAgICAgICAgICAgICAgICh0eFNpbmtEZXZpY2UgIT0gMCk7CisgICAgfQorICAgIC8vIFVzZSBsZWdhY3kgcm91dGluZyBtZXRob2QgZm9yIHZvaWNlIGNhbGxzIHZpYSBzZXRPdXRwdXREZXZpY2UoKSBvbiBwcmltYXJ5IG91dHB1dC4KKyAgICAvLyBPdGhlcndpc2UsIGNyZWF0ZSB0d28gYXVkaW8gcGF0Y2hlcyBmb3IgVFggYW5kIFJYIHBhdGguCisgICAgaWYgKCFjcmVhdGVSeFBhdGNoKSB7CisgICAgICAgIG11dGVXYWl0TXMgPSBzZXRPdXRwdXREZXZpY2VzKG1QcmltYXJ5T3V0cHV0LCByeERldmljZXMsIHRydWUsIGRlbGF5TXMpOwogICAgIH0gZWxzZSB7IC8vIGNyZWF0ZSBSWCBwYXRoIGF1ZGlvIHBhdGNoCi0gICAgICAgIG1DYWxsUnhQYXRjaCA9IGNyZWF0ZVRlbGVwaG9ueVBhdGNoKHRydWUgLyppc1J4Ki8sIHJ4RGV2aWNlLCBkZWxheU1zKTsKLSAgICAgICAgY3JlYXRlVHhQYXRjaCA9IHRydWU7CisgICAgICAgIG1DYWxsUnhQYXRjaCA9IGNyZWF0ZVRlbGVwaG9ueVBhdGNoKHRydWUgLyppc1J4Ki8sIHJ4RGV2aWNlcy5pdGVtQXQoMCksIGRlbGF5TXMpOworCisgICAgICAgIC8vIElmIHRoZSBUWCBkZXZpY2UgaXMgb24gdGhlIHByaW1hcnkgSFcgbW9kdWxlIGJ1dCBSWCBkZXZpY2UgaXMKKyAgICAgICAgLy8gb24gb3RoZXIgSFcgbW9kdWxlLCBTaW5rTWV0YURhdGEgb2YgdGVsZXBob255IGlucHV0IHNob3VsZCBoYW5kbGUgaXQKKyAgICAgICAgLy8gYXNzdW1pbmcgdGhlIGRldmljZSB1c2VzIGF1ZGlvIEhBTCBWNS4wIGFuZCBhYm92ZQogICAgIH0KICAgICBpZiAoY3JlYXRlVHhQYXRjaCkgeyAvLyBjcmVhdGUgVFggcGF0aCBhdWRpbyBwYXRjaAotICAgICAgICBtQ2FsbFR4UGF0Y2ggPSBjcmVhdGVUZWxlcGhvbnlQYXRjaChmYWxzZSAvKmlzUngqLywgdHhEZXZpY2UsIGRlbGF5TXMpOworICAgICAgICAvLyB0ZXJtaW5hdGUgYWN0aXZlIGNhcHR1cmUgaWYgb24gdGhlIHNhbWUgSFcgbW9kdWxlIGFzIHRoZSBjYWxsIFRYIHNvdXJjZSBkZXZpY2UKKyAgICAgICAgLy8gRklYTUU6IHdvdWxkIGJlIGJldHRlciB0byByZWZpbmUgdG8gb25seSBpbnB1dHMgd2hvc2UgcHJvZmlsZSBjb25uZWN0cyB0byB0aGUKKyAgICAgICAgLy8gY2FsbCBUWCBkZXZpY2UgYnV0IHRoaXMgaW5mb3JtYXRpb24gaXMgbm90IGluIHRoZSBhdWRpbyBwYXRjaCBhbmQgbG9naWMgaGVyZSBtdXN0IGJlCisgICAgICAgIC8vIHN5bW1ldHJpYyB0byB0aGUgb25lIGluIHN0YXJ0SW5wdXQoKQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdGl2ZURlc2MgOiBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpKSB7CisgICAgICAgICAgICBpZiAoYWN0aXZlRGVzYy0+aGFzU2FtZUh3TW9kdWxlQXModHhTb3VyY2VEZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgY2xvc2VBY3RpdmVDbGllbnRzKGFjdGl2ZURlc2MpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1DYWxsVHhQYXRjaCA9IGNyZWF0ZVRlbGVwaG9ueVBhdGNoKGZhbHNlIC8qaXNSeCovLCB0eFNvdXJjZURldmljZSwgZGVsYXlNcyk7CiAgICAgfQogCiAgICAgcmV0dXJuIG11dGVXYWl0TXM7CiB9CiAKIHNwPEF1ZGlvUGF0Y2g+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y3JlYXRlVGVsZXBob255UGF0Y2goCi0gICAgICAgIGJvb2wgaXNSeCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgdWludDMyX3QgZGVsYXlNcykgewotICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDsKLSAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7Ci0gICAgcGF0Y2gubnVtX3NpbmtzID0gMTsKKyAgICAgICAgYm9vbCBpc1J4LCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLCB1aW50MzJfdCBkZWxheU1zKSB7CisgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKIAotICAgIHNwPERldmljZURlc2NyaXB0b3I+IHR4U291cmNlRGV2aWNlRGVzYzsKKyAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgLy8gQFRPRE86IHN0aWxsIGlnbm9yaW5nIHRoZSBhZGRyZXNzLCBvciBub3QgZGVhbGluZyBwbGF0Zm9ybSB3aXRoIG11dGxpcGxlIHRlbGVwaG9ueSBkZXZpY2VzCiAgICAgaWYgKGlzUngpIHsKLSAgICAgICAgZmlsbEF1ZGlvUG9ydENvbmZpZ0ZvckRldmljZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgZGV2aWNlLCAmcGF0Y2guc2lua3NbMF0pOwotICAgICAgICBmaWxsQXVkaW9Qb3J0Q29uZmlnRm9yRGV2aWNlKAotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMsIEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgsICZwYXRjaC5zb3VyY2VzWzBdKTsKKyAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNpbmsoZGV2aWNlKS4KKyAgICAgICAgICAgICAgICBhZGRTb3VyY2UobUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2UoCisgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgsIFN0cmluZzgoKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpKTsKICAgICB9IGVsc2UgewotICAgICAgICB0eFNvdXJjZURldmljZURlc2MgPSBmaWxsQXVkaW9Qb3J0Q29uZmlnRm9yRGV2aWNlKAotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMsIGRldmljZSwgJnBhdGNoLnNvdXJjZXNbMF0pOwotICAgICAgICBmaWxsQXVkaW9Qb3J0Q29uZmlnRm9yRGV2aWNlKAotICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLCBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCwgJnBhdGNoLnNpbmtzWzBdKTsKKyAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShkZXZpY2UpLgorICAgICAgICAgICAgICAgIGFkZFNpbmsobUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlKAorICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCwgU3RyaW5nOCgpLCBBVURJT19GT1JNQVRfREVGQVVMVCkpOwogICAgIH0KIAotICAgIGF1ZGlvX2RldmljZXNfdCBvdXRwdXREZXZpY2UgPSBpc1J4ID8gZGV2aWNlIDogQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFg7Ci0gICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShvdXRwdXREZXZpY2UsIG1PdXRwdXRzKTsKLSAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgQVVESU9fRk9STUFUX0lOVkFMSUQpOwotICAgIC8vIHJlcXVlc3QgdG8gcmV1c2UgZXhpc3Rpbmcgb3V0cHV0IHN0cmVhbSBpZiBvbmUgaXMgYWxyZWFkeSBvcGVuZWQgdG8gcmVhY2ggdGhlIHRhcmdldCBkZXZpY2UKLSAgICBpZiAob3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwKLSAgICAgICAgICAgICAgICAiJXMoKSAlI3ggZGV2aWNlIG91dHB1dCAlZCBpcyBkdXBsaWNhdGVkIiwgX19mdW5jX18sIG91dHB1dERldmljZSwgb3V0cHV0KTsKLSAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMV0pOwotICAgICAgICBwYXRjaC5zb3VyY2VzWzFdLmV4dC5taXgudXNlY2FzZS5zdHJlYW0gPSBBVURJT19TVFJFQU1fUEFUQ0g7Ci0gICAgICAgIHBhdGNoLm51bV9zb3VyY2VzID0gMjsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOworICAgIHN0YXR1c190IHN0YXR1cyA9CisgICAgICAgICAgICBjcmVhdGVBdWRpb1BhdGNoSW50ZXJuYWwocGF0Y2hCdWlsZGVyLnBhdGNoKCksICZwYXRjaEhhbmRsZSwgbVVpZENhY2hlZCwgZGVsYXlNcyk7CisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShwYXRjaEhhbmRsZSk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCBpbmRleCA8IDApIHsKKyAgICAgICAgQUxPR1coIiVzKCkgZXJyb3IgJWQgY3JlYXRpbmcgJXMgYXVkaW8gcGF0Y2giLCBfX2Z1bmNfXywgc3RhdHVzLCBpc1J4ID8gIlJYIiA6ICJUWCIpOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKICAgICB9Ci0KLSAgICBpZiAoIWlzUngpIHsKLSAgICAgICAgLy8gdGVybWluYXRlIGFjdGl2ZSBjYXB0dXJlIGlmIG9uIHRoZSBzYW1lIEhXIG1vZHVsZSBhcyB0aGUgY2FsbCBUWCBzb3VyY2UgZGV2aWNlCi0gICAgICAgIC8vIEZJWE1FOiB3b3VsZCBiZSBiZXR0ZXIgdG8gcmVmaW5lIHRvIG9ubHkgaW5wdXRzIHdob3NlIHByb2ZpbGUgY29ubmVjdHMgdG8gdGhlCi0gICAgICAgIC8vIGNhbGwgVFggZGV2aWNlIGJ1dCB0aGlzIGluZm9ybWF0aW9uIGlzIG5vdCBpbiB0aGUgYXVkaW8gcGF0Y2ggYW5kIGxvZ2ljIGhlcmUgbXVzdCBiZQotICAgICAgICAvLyBzeW1tZXRyaWMgdG8gdGhlIG9uZSBpbiBzdGFydElucHV0KCkKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBhY3RpdmVEZXNjIDogbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKSkgewotICAgICAgICAgICAgaWYgKGFjdGl2ZURlc2MtPmhhc1NhbWVId01vZHVsZUFzKHR4U291cmNlRGV2aWNlRGVzYykpIHsKLSAgICAgICAgICAgICAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGFjdGl2ZVNlc3Npb25zID0KLSAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZURlc2MtPmdldEF1ZGlvU2Vzc2lvbnModHJ1ZSAvKmFjdGl2ZU9ubHkqLyk7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBhY3RpdmVTZXNzaW9ucy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYWN0aXZlU2Vzc2lvbiA9IGFjdGl2ZVNlc3Npb25zLmtleUF0KGopOwotICAgICAgICAgICAgICAgICAgICBzdG9wSW5wdXQoYWN0aXZlRGVzYy0+bUlvSGFuZGxlLCBhY3RpdmVTZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUlucHV0KGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSwgYWN0aXZlU2Vzc2lvbik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmFmUGF0Y2hIYW5kbGUsIGRlbGF5TXMpOwotICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwKLSAgICAgICAgICAgICIlcygpIGVycm9yICVkIGNyZWF0aW5nICVzIGF1ZGlvIHBhdGNoIiwgX19mdW5jX18sIHN0YXR1cywgaXNSeCA/ICJSWCIgOiAiVFgiKTsKLSAgICBzcDxBdWRpb1BhdGNoPiBhdWRpb1BhdGNoOwotICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgYXVkaW9QYXRjaCA9IG5ldyBBdWRpb1BhdGNoKCZwYXRjaCwgbVVpZENhY2hlZCk7Ci0gICAgICAgIGF1ZGlvUGF0Y2gtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICAgICAgYXVkaW9QYXRjaC0+bVVpZCA9IG1VaWRDYWNoZWQ7Ci0gICAgfQotICAgIHJldHVybiBhdWRpb1BhdGNoOworICAgIHJldHVybiBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwogfQogCi1zcDxEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UoCi0gICAgICAgIGNvbnN0IERldmljZVZlY3RvciYgZGV2aWNlcywgYXVkaW9fZGV2aWNlc190IGRldmljZSwgYXVkaW9fcG9ydF9jb25maWcgKmNvbmZpZykgewotICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gZGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICBBTE9HX0FTU0VSVCghZGV2aWNlTGlzdC5pc0VtcHR5KCksCi0gICAgICAgICAgICAiJXMoKSBzZWxlY3RlZCBkZXZpY2UgdHlwZSAlI3ggaXMgbm90IGluIGRldmljZXMgbGlzdCIsIF9fZnVuY19fLCBkZXZpY2UpOwotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPSBkZXZpY2VMaXN0Lml0ZW1BdCgwKTsKLSAgICBkZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZyhjb25maWcpOwotICAgIHJldHVybiBkZXZpY2VEZXNjOworYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzRGV2aWNlT2ZNb2R1bGUoCisgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBjb25zdCBjaGFyICptb2R1bGVJZCkgY29uc3QgeworICAgIHNwPEh3TW9kdWxlPiBtb2R1bGUgPSBtSHdNb2R1bGVzLmdldE1vZHVsZUZyb21OYW1lKG1vZHVsZUlkKTsKKyAgICBpZiAobW9kdWxlICE9IDApIHsKKyAgICAgICAgcmV0dXJuIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUobW9kdWxlLT5nZXRIYW5kbGUoKSkKKyAgICAgICAgICAgICAgICAuaW5kZXhPZihkZXZEZXNjKSAhPSBOQU1FX05PVF9GT1VORAorICAgICAgICAgICAgICAgIHx8IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21Id01vZHVsZShtb2R1bGUtPmdldEhhbmRsZSgpKQorICAgICAgICAgICAgICAgIC5pbmRleE9mKGRldkRlc2MpICE9IE5BTUVfTk9UX0ZPVU5EOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSkKQEAgLTU2NCwxNCArNjUwLDggQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICAvLy8gT3BlbnM6IGNhbiB0aGVzZSBsaW5lIGJlIGV4ZWN1dGVkIGFmdGVyIHRoZSBzd2l0Y2ggb2Ygdm9sdW1lIGN1cnZlcz8/PwotICAgIC8vIGlmIGxlYXZpbmcgY2FsbCBzdGF0ZSwgaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBhY3RpdmUgc3RyZWFtcwotICAgIC8vIHBlcnRhaW5pbmcgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHNlZSBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKQogICAgIGlmIChpc1N0YXRlSW5DYWxsKG9sZFN0YXRlKSkgewogICAgICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIGluIGNhbGwgc3RhdGUgbWFuYWdlbWVudDogbmV3IHN0YXRlIGlzICVkIiwgc3RhdGUpOwotICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCBmYWxzZSwgdHJ1ZSk7Ci0gICAgICAgIH0KLQogICAgICAgICAvLyBmb3JjZSByZWV2YWx1YXRpbmcgYWNjZXNzaWJpbGl0eSByb3V0aW5nIHdoZW4gY2FsbCBzdG9wcwogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSk7CiAgICAgfQpAQCAtNTg0LDkxICs2NjQsODAgQEAKICAgICAgICAgICAgICAgICAgIHx8IChpc19zdGF0ZV9pbl9jYWxsKHN0YXRlKSAmJiAoc3RhdGUgIT0gb2xkU3RhdGUpKSk7CiAKICAgICAvLyBjaGVjayBmb3IgZGV2aWNlIGFuZCBvdXRwdXQgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgbmV3IHBob25lIHN0YXRlCi0gICAgY2hlY2tBMmRwU3VzcGVuZCgpOwotICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwotICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisgICAgY2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKCk7CiAKICAgICBpbnQgZGVsYXlNcyA9IDA7CiAgICAgaWYgKGlzU3RhdGVJbkNhbGwoc3RhdGUpKSB7CiAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IHN5c3RlbVRpbWUoKTsKKyAgICAgICAgYXV0byBtdXNpY1N0cmF0ZWd5ID0gc3RyZWFtVG9TdHJhdGVneShBVURJT19TVFJFQU1fTVVTSUMpOworICAgICAgICBhdXRvIHNvbmlmaWNhdGlvblN0cmF0ZWd5ID0gc3RyZWFtVG9TdHJhdGVneShBVURJT19TVFJFQU1fQUxBUk0pOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CiAgICAgICAgICAgICAvLyBtdXRlIG1lZGlhIGFuZCBzb25pZmljYXRpb24gc3RyYXRlZ2llcyBhbmQgZGVsYXkgZGV2aWNlIHN3aXRjaCBieSB0aGUgbGFyZ2VzdAogICAgICAgICAgICAgLy8gbGF0ZW5jeSBvZiBhbnkgb3V0cHV0IHdoZXJlIGVpdGhlciBzdHJhdGVneSBpcyBhY3RpdmUuCiAgICAgICAgICAgICAvLyBUaGlzIGF2b2lkIHNlbmRpbmcgdGhlIHJpbmcgdG9uZSBvciBtdXNpYyB0YWlsIGludG8gdGhlIGVhcnBpZWNlIG9yIGhlYWRzZXQuCi0gICAgICAgICAgICBpZiAoKGlzU3RyYXRlZ3lBY3RpdmUoZGVzYywgU1RSQVRFR1lfTUVESUEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzVGltZSkgfHwKLSAgICAgICAgICAgICAgICAgaXNTdHJhdGVneUFjdGl2ZShkZXNjLCBTVFJBVEVHWV9TT05JRklDQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzVGltZSkpICYmCisgICAgICAgICAgICBpZiAoKGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUobXVzaWNTdHJhdGVneSwgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVksIHN5c1RpbWUpIHx8CisgICAgICAgICAgICAgICAgIGRlc2MtPmlzU3RyYXRlZ3lBY3RpdmUoc29uaWZpY2F0aW9uU3RyYXRlZ3ksIFNPTklGSUNBVElPTl9IRUFEU0VUX01VU0lDX0RFTEFZLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c1RpbWUpKSAmJgogICAgICAgICAgICAgICAgICAgICAoZGVsYXlNcyA8IChpbnQpZGVzYy0+bGF0ZW5jeSgpKjIpKSB7CiAgICAgICAgICAgICAgICAgZGVsYXlNcyA9IGRlc2MtPmxhdGVuY3koKSoyOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKFNUUkFURUdZX01FRElBLCB0cnVlLCBkZXNjKTsKLSAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9NRURJQSwgZmFsc2UsIGRlc2MsIE1VVEVfVElNRV9NUywKLSAgICAgICAgICAgICAgICBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgdHJ1ZSAvKmZyb21DYWNoZSovKSk7Ci0gICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCB0cnVlLCBkZXNjKTsKLSAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZhbHNlLCBkZXNjLCBNVVRFX1RJTUVfTVMsCi0gICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCB0cnVlIC8qZnJvbUNhY2hlKi8pKTsKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShtdXNpY1N0cmF0ZWd5LCB0cnVlLCBkZXNjKTsKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShtdXNpY1N0cmF0ZWd5LCBmYWxzZSwgZGVzYywgTVVURV9USU1FX01TLAorICAgICAgICAgICAgICAgIG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTUVESUEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIHRydWUgLypmcm9tQ2FjaGUqLykudHlwZXMoKSk7CisgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc29uaWZpY2F0aW9uU3RyYXRlZ3ksIHRydWUsIGRlc2MpOworICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHNvbmlmaWNhdGlvblN0cmF0ZWd5LCBmYWxzZSwgZGVzYywgTVVURV9USU1FX01TLAorICAgICAgICAgICAgICAgIG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfQUxBUk0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIHRydWUgLypmcm9tQ2FjaGUqLykudHlwZXMoKSk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgIC8vIE5vdGUgdGhhdCBkZXNwaXRlIHRoZSBmYWN0IHRoYXQgZ2V0TmV3T3V0cHV0RGV2aWNlKCkgaXMgY2FsbGVkIG9uIHRoZSBwcmltYXJ5IG91dHB1dCwKKyAgICAgICAgLy8gTm90ZSB0aGF0IGRlc3BpdGUgdGhlIGZhY3QgdGhhdCBnZXROZXdPdXRwdXREZXZpY2VzKCkgaXMgY2FsbGVkIG9uIHRoZSBwcmltYXJ5IG91dHB1dCwKICAgICAgICAgLy8gdGhlIGRldmljZSByZXR1cm5lZCBpcyBub3QgbmVjZXNzYXJpbHkgcmVhY2hhYmxlIHZpYSB0aGlzIG91dHB1dAotICAgICAgICBhdWRpb19kZXZpY2VzX3QgcnhEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICBEZXZpY2VWZWN0b3IgcnhEZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhtUHJpbWFyeU91dHB1dCwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CiAgICAgICAgIC8vIGZvcmNlIHJvdXRpbmcgY29tbWFuZCB0byBhdWRpbyBoYXJkd2FyZSB3aGVuIGVuZGluZyBjYWxsCiAgICAgICAgIC8vIGV2ZW4gaWYgbm8gZGV2aWNlIGNoYW5nZSBpcyBuZWVkZWQKLSAgICAgICAgaWYgKGlzU3RhdGVJbkNhbGwob2xkU3RhdGUpICYmIHJ4RGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICByeERldmljZSA9IG1QcmltYXJ5T3V0cHV0LT5kZXZpY2UoKTsKKyAgICAgICAgaWYgKGlzU3RhdGVJbkNhbGwob2xkU3RhdGUpICYmIHJ4RGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgIHJ4RGV2aWNlcyA9IG1QcmltYXJ5T3V0cHV0LT5kZXZpY2VzKCk7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DQUxMKSB7Ci0gICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhyeERldmljZSwgZGVsYXlNcyk7CisgICAgICAgICAgICB1cGRhdGVDYWxsUm91dGluZyhyeERldmljZXMsIGRlbGF5TXMpOwogICAgICAgICB9IGVsc2UgaWYgKG9sZFN0YXRlID09IEFVRElPX01PREVfSU5fQ0FMTCkgewogICAgICAgICAgICAgaWYgKG1DYWxsUnhQYXRjaCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKG1DYWxsUnhQYXRjaC0+bUFmUGF0Y2hIYW5kbGUsIDApOworICAgICAgICAgICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoSW50ZXJuYWwobUNhbGxSeFBhdGNoLT5nZXRIYW5kbGUoKSk7CiAgICAgICAgICAgICAgICAgbUNhbGxSeFBhdGNoLmNsZWFyKCk7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBpZiAobUNhbGxUeFBhdGNoICE9IDApIHsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gobUNhbGxUeFBhdGNoLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgICAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChtQ2FsbFR4UGF0Y2gtPmdldEhhbmRsZSgpKTsKICAgICAgICAgICAgICAgICBtQ2FsbFR4UGF0Y2guY2xlYXIoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldE91dHB1dERldmljZShtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2UsIGZvcmNlLCAwKTsKKyAgICAgICAgICAgIHNldE91dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIHJ4RGV2aWNlcywgZm9yY2UsIDApOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG1QcmltYXJ5T3V0cHV0LCByeERldmljZSwgZm9yY2UsIDApOworICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhtUHJpbWFyeU91dHB1dCwgcnhEZXZpY2VzLCBmb3JjZSwgMCk7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyByZWV2YWx1YXRlIHJvdXRpbmcgb24gYWxsIG91dHB1dHMgaW4gY2FzZSB0cmFja3MgaGF2ZSBiZWVuIHN0YXJ0ZWQgZHVyaW5nIHRoZSBjYWxsCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UoZGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKGRlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyk7CiAgICAgICAgIGlmIChzdGF0ZSAhPSBBVURJT19NT0RFX0lOX0NBTEwgfHwgZGVzYyAhPSBtUHJpbWFyeU91dHB1dCkgewotICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKGRlc2MsIG5ld0RldmljZSwgKG5ld0RldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSksIDAgLypkZWxheU1zKi8pOworICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhkZXNjLCBuZXdEZXZpY2VzLCAhbmV3RGV2aWNlcy5pc0VtcHR5KCksIDAgLypkZWxheU1zKi8pOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gaWYgZW50ZXJpbmcgaW4gY2FsbCBzdGF0ZSwgaGFuZGxlIHNwZWNpYWwgY2FzZSBvZiBhY3RpdmUgc3RyZWFtcwotICAgIC8vIHBlcnRhaW5pbmcgdG8gc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHNlZSBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKQogICAgIGlmIChpc1N0YXRlSW5DYWxsKHN0YXRlKSkgewogICAgICAgICBBTE9HVigic2V0UGhvbmVTdGF0ZSgpIGluIGNhbGwgc3RhdGUgbWFuYWdlbWVudDogbmV3IHN0YXRlIGlzICVkIiwgc3RhdGUpOwotICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtLCB0cnVlLCB0cnVlKTsKLSAgICAgICAgfQotCiAgICAgICAgIC8vIGZvcmNlIHJlZXZhbHVhdGluZyBhY2Nlc3NpYmlsaXR5IHJvdXRpbmcgd2hlbiBjYWxsIHN0YXJ0cwogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSk7CiAgICAgfQogCiAgICAgLy8gRmxhZyB0aGF0IHJpbmd0b25lIHZvbHVtZSBtdXN0IGJlIGxpbWl0ZWQgdG8gbXVzaWMgdm9sdW1lIHVudGlsIHdlIGV4aXQgTU9ERV9SSU5HVE9ORQotICAgIGlmIChzdGF0ZSA9PSBBVURJT19NT0RFX1JJTkdUT05FICYmCi0gICAgICAgIGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVkpKSB7Ci0gICAgICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgICBtTGltaXRSaW5ndG9uZVZvbHVtZSA9IGZhbHNlOwotICAgIH0KKyAgICBtTGltaXRSaW5ndG9uZVZvbHVtZSA9IChzdGF0ZSA9PSBBVURJT19NT0RFX1JJTkdUT05FICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX01VU0lDLCBTT05JRklDQVRJT05fSEVBRFNFVF9NVVNJQ19ERUxBWSkpOwogfQogCiBhdWRpb19tb2RlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRQaG9uZVN0YXRlKCkgewpAQCAtNjc2LDcgKzc0NSw3IEBACiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKQogewogICAgIEFMT0dWKCJzZXRGb3JjZVVzZSgpIHVzYWdlICVkLCBjb25maWcgJWQsIG1QaG9uZVN0YXRlICVkIiwgdXNhZ2UsIGNvbmZpZywgbUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpKTsKICAgICBpZiAoY29uZmlnID09IG1FbmdpbmUtPmdldEZvcmNlVXNlKHVzYWdlKSkgewpAQCAtNjkyLDM4ICs3NjEsMjcgQEAKICAgICAgICAgICAgICh1c2FnZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSk7CiAKICAgICAvLyBjaGVjayBmb3IgZGV2aWNlIGFuZCBvdXRwdXQgY2hhbmdlcyB0cmlnZ2VyZWQgYnkgbmV3IGZvcmNlIHVzYWdlCi0gICAgY2hlY2tBMmRwU3VzcGVuZCgpOwotICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOwotICAgIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCk7CisgICAgY2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKCk7CisKKyAgICAvLyBmb3JjZSBjbGllbnQgcmVjb25uZWN0aW9uIHRvIHJlZXZhbHVhdGUgZmxhZyBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQKKyAgICBpZiAodXNhZ2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pIHsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oQVVESU9fU1RSRUFNX1NZU1RFTSk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKTsKKyAgICB9CiAKICAgICAvL0ZJWE1FOiB3b3JrYXJvdW5kIGZvciB0cnVuY2F0ZWQgdG91Y2ggc291bmRzCiAgICAgLy8gdG8gYmUgcmVtb3ZlZCB3aGVuIHRoZSBwcm9ibGVtIGlzIGhhbmRsZWQgYnkgc3lzdGVtIFVJCiAgICAgdWludDMyX3QgZGVsYXlNcyA9IDA7Ci0gICAgdWludDMyX3Qgd2FpdE1zID0gMDsKICAgICBpZiAodXNhZ2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OKSB7CiAgICAgICAgIGRlbGF5TXMgPSBUT1VDSF9TT1VORF9GSVhFRF9ERUxBWV9NUzsKICAgICB9Ci0gICAgaWYgKG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSA9PSBBVURJT19NT0RFX0lOX0NBTEwgJiYgaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2UobVByaW1hcnlPdXRwdXQsIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIHdhaXRNcyA9IHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZSwgZGVsYXlNcyk7Ci0gICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgbmV3RGV2aWNlID0gZ2V0TmV3T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIGlmICgobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpICE9IEFVRElPX01PREVfSU5fQ0FMTCkgfHwgKG91dHB1dERlc2MgIT0gbVByaW1hcnlPdXRwdXQpKSB7Ci0gICAgICAgICAgICB3YWl0TXMgPSBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgbmV3RGV2aWNlLCAobmV3RGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoZm9yY2VWb2x1bWVSZWV2YWwgJiYgKG5ld0RldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkpIHsKLSAgICAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXREZXNjLCBuZXdEZXZpY2UsIHdhaXRNcywgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9CisKKyAgICB1cGRhdGVDYWxsQW5kT3V0cHV0Um91dGluZyhmb3JjZVZvbHVtZVJlZXZhbCwgZGVsYXlNcyk7CiAKICAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdGl2ZURlc2MgOiBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpKSB7Ci0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdJbnB1dERldmljZShhY3RpdmVEZXNjKTsKKyAgICAgICAgYXV0byBuZXdEZXZpY2UgPSBnZXROZXdJbnB1dERldmljZShhY3RpdmVEZXNjKTsKICAgICAgICAgLy8gRm9yY2UgbmV3IGlucHV0IHNlbGVjdGlvbiBpZiB0aGUgbmV3IGRldmljZSBjYW4gbm90IGJlIHJlYWNoZWQgdmlhIGN1cnJlbnQgaW5wdXQKLSAgICAgICAgaWYgKGFjdGl2ZURlc2MtPm1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkudHlwZXMoKSAmCi0gICAgICAgICAgICAgICAgKG5ld0RldmljZSAmIH5BVURJT19ERVZJQ0VfQklUX0lOKSkgeworICAgICAgICBpZiAoYWN0aXZlRGVzYy0+bVByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKS5jb250YWlucyhuZXdEZXZpY2UpKSB7CiAgICAgICAgICAgICBzZXRJbnB1dERldmljZShhY3RpdmVEZXNjLT5tSW9IYW5kbGUsIG5ld0RldmljZSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjbG9zZUlucHV0KGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSk7CkBAIC03MzYsMjggKzc5NCwzMSBAQAogICAgIEFMT0dWKCJzZXRTeXN0ZW1Qcm9wZXJ0eSgpIHByb3BlcnR5ICVzLCB2YWx1ZSAlcyIsIHByb3BlcnR5LCB2YWx1ZSk7CiB9CiAKLS8vIEZpbmQgYSBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgY29tcGF0aWJsZSB3aXRoIHRoZSBwYXJhbWV0ZXJzIHBhc3NlZCwgZXZlbiBpZiB0aGUgaW5wdXQgZmxhZ3MgZG8KLS8vIG5vdCBleHBsaWNpdGx5IHJlcXVlc3QgYSBkaXJlY3Qgb3V0cHV0Ci1zcDxJT1Byb2ZpbGU+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKQorLy8gRmluZCBhbiBvdXRwdXQgcHJvZmlsZSBjb21wYXRpYmxlIHdpdGggdGhlIHBhcmFtZXRlcnMgcGFzc2VkLiBXaGVuICJkaXJlY3RPbmx5IiBpcyBzZXQsIHJlc3RyaWN0CisvLyBzZWFyY2ggdG8gcHJvZmlsZXMgZm9yIGRpcmVjdCBvdXRwdXRzLgorc3A8SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFByb2ZpbGVGb3JPdXRwdXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3ImIGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzYW1wbGluZ1JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkaXJlY3RPbmx5KQogewotICAgIC8vIG9ubHkgcmV0YWluIGZsYWdzIHRoYXQgd2lsbCBkcml2ZSB0aGUgZGlyZWN0IG91dHB1dCBwcm9maWxlIHNlbGVjdGlvbgotICAgIC8vIGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkCi0gICAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtSZWxldmFudEZsYWdzID0KLSAgICAgICAgICAgIChBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DIHwgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCB8Ci0gICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCk7Ci0gICAgZmxhZ3MgPQotICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKChmbGFncyAmIGtSZWxldmFudEZsYWdzKSB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgaWYgKGRpcmVjdE9ubHkpIHsKKyAgICAgICAgLy8gb25seSByZXRhaW4gZmxhZ3MgdGhhdCB3aWxsIGRyaXZlIHRoZSBkaXJlY3Qgb3V0cHV0IHByb2ZpbGUgc2VsZWN0aW9uCisgICAgICAgIC8vIGlmIGV4cGxpY2l0bHkgcmVxdWVzdGVkCisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrUmVsZXZhbnRGbGFncyA9CisgICAgICAgICAgICAgICAgKEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMgfCBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEIHwKKyAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfVk9JUF9SWCB8IEFVRElPX09VVFBVVF9GTEFHX01NQVBfTk9JUlEpOworICAgICAgICBmbGFncyA9CisgICAgICAgICAgICAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpKChmbGFncyAmIGtSZWxldmFudEZsYWdzKSB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgfQogCiAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlOwogCiAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjdXJQcm9maWxlIDogaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkpIHsKLSAgICAgICAgICAgIGlmICghY3VyUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZpY2UsIFN0cmluZzgoIiIpLAorICAgICAgICAgICAgaWYgKCFjdXJQcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZSwgTlVMTCAvKnVwZGF0ZWRTYW1wbGluZ1JhdGUqLywKICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LCBOVUxMIC8qdXBkYXRlZEZvcm1hdCovLAogICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywgTlVMTCAvKnVwZGF0ZWRDaGFubmVsTWFzayovLApAQCAtNzY1LDEwICs4MjYsMTYgQEAKICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIC8vIHJlamVjdCBwcm9maWxlcyBub3QgY29ycmVzcG9uZGluZyB0byBhIGRldmljZSBjdXJyZW50bHkgYXZhaWxhYmxlCi0gICAgICAgICAgICBpZiAoKG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkgJiBjdXJQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpKSA9PSAwKSB7CisgICAgICAgICAgICBpZiAoIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNvbnRhaW5zQXRMZWFzdE9uZShjdXJQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCkpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBpZiBzZXZlcmFsIHByb2ZpbGVzIGFyZSBjb21wYXRpYmxlLCBnaXZlIHByaW9yaXR5IHRvIG9uZSB3aXRoIG9mZmxvYWQgY2FwYWJpbGl0eQorICAgICAgICAgICAgLy8gcmVqZWN0IHByb2ZpbGVzIGlmIGNvbm5lY3RlZCBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBjb2RlYworICAgICAgICAgICAgaWYgKCFjdXJQcm9maWxlLT5kZXZpY2VzU3VwcG9ydEVuY29kZWRGb3JtYXRzKGRldmljZXMudHlwZXMoKSkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghZGlyZWN0T25seSkgcmV0dXJuIGN1clByb2ZpbGU7CisgICAgICAgICAgICAvLyB3aGVuIHNlYXJjaGluZyBmb3IgZGlyZWN0IG91dHB1dHMsIGlmIHNldmVyYWwgcHJvZmlsZXMgYXJlIGNvbXBhdGlibGUsIGdpdmUgcHJpb3JpdHkKKyAgICAgICAgICAgIC8vIHRvIG9uZSB3aXRoIG9mZmxvYWQgY2FwYWJpbGl0eQogICAgICAgICAgICAgaWYgKHByb2ZpbGUgIT0gMCAmJiAoKGN1clByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FEKSA9PSAwKSkgewogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtNzgzLDggKzg1MCw3IEBACiAKIGF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogewotICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOwotICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKHN0cmVhbSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CiAKICAgICAvLyBOb3RlIHRoYXQgcmVsYXRlZCBtZXRob2QgZ2V0T3V0cHV0Rm9yQXR0cigpIHVzZXMgZ2V0T3V0cHV0Rm9yRGV2aWNlKCkgbm90IHNlbGVjdE91dHB1dCgpLgogICAgIC8vIFdlIHVzZSBzZWxlY3RPdXRwdXQoKSBoZXJlIHNpbmNlIHdlIGRvbid0IGhhdmUgdGhlIGRlc2lyZWQgQXVkaW9UcmFjayBzYW1wbGUgcmF0ZSwKQEAgLTc5MiwxMyArODU4LDE2MyBAQAogICAgIC8vIGdldE91dHB1dCgpIHNvbGVseSBvbiBhdWRpb19zdHJlYW1fdHlwZSBzdWNoIGFzIEF1ZGlvU3lzdGVtOjpnZXRPdXRwdXRGcmFtZUNvdW50KCkKICAgICAvLyBhbmQgQXVkaW9TeXN0ZW06OmdldE91dHB1dFNhbXBsaW5nUmF0ZSgpLgogCi0gICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShkZXZpY2UsIG1PdXRwdXRzKTsKLSAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgQVVESU9fRk9STUFUX0lOVkFMSUQpOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2VzKGRldmljZXMsIG1PdXRwdXRzKTsKKyAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cyk7CiAKLSAgICBBTE9HVigiZ2V0T3V0cHV0KCkgc3RyZWFtICVkIHNlbGVjdGVkIGRldmljZSAlMDh4LCBvdXRwdXQgJWQiLCBzdHJlYW0sIGRldmljZSwgb3V0cHV0KTsKKyAgICBBTE9HVigiZ2V0T3V0cHV0KCkgc3RyZWFtICVkIHNlbGVjdGVkIGRldmljZXMgJXMsIG91dHB1dCAlZCIsIHN0cmVhbSwKKyAgICAgICAgICBkZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwgb3V0cHV0KTsKICAgICByZXR1cm4gb3V0cHV0OwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEF1ZGlvQXR0cmlidXRlcyhhdWRpb19hdHRyaWJ1dGVzX3QgKmRzdEF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKnNyY0F0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHNyY1N0cmVhbSkKK3sKKyAgICBpZiAoc3JjQXR0ciAhPSBOVUxMKSB7CisgICAgICAgIGlmICghaXNWYWxpZEF0dHJpYnV0ZXMoc3JjQXR0cikpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlcyBpbnZhbGlkIGF0dHJpYnV0ZXM6IHVzYWdlPSVkIGNvbnRlbnQ9JWQgZmxhZ3M9MHgleCB0YWdzPVslc10iLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgICAgc3JjQXR0ci0+dXNhZ2UsIHNyY0F0dHItPmNvbnRlbnRfdHlwZSwgc3JjQXR0ci0+ZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIHNyY0F0dHItPnRhZ3MpOworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICAqZHN0QXR0ciA9ICpzcmNBdHRyOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzcmNTdHJlYW0gPCBBVURJT19TVFJFQU1fTUlOIHx8IHNyY1N0cmVhbSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiAgaW52YWxpZCBzdHJlYW0gdHlwZSIsIF9fZnVuY19fKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgKmRzdEF0dHIgPSBtRW5naW5lLT5nZXRBdHRyaWJ1dGVzRm9yU3RyZWFtVHlwZShzcmNTdHJlYW0pOworICAgIH0KKworICAgIC8vIE9ubHkgaG9ub3IgYXVkaWJpbGl0eSBlbmZvcmNlZCB3aGVuIHJlcXVpcmVkLiBUaGUgY2xpZW50IHdpbGwgYmUKKyAgICAvLyBmb3JjZWQgdG8gcmVjb25uZWN0IGlmIHRoZSBmb3JjZWQgdXNhZ2UgY2hhbmdlcy4KKyAgICBpZiAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pICE9IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKKyAgICAgICAgZHN0QXR0ci0+ZmxhZ3MgJj0gfkFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRDsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0T3V0cHV0Rm9yQXR0ckludCgKKyAgICAgICAgYXVkaW9fYXR0cmlidXRlc190ICpyZXN1bHRBdHRyLAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAorICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCisgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAorICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAorICAgICAgICBib29sICppc1JlcXVlc3RlZERldmljZUZvckV4Y2x1c2l2ZVVzZSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiAqc2Vjb25kYXJ5RGVzY3MpCit7CisgICAgRGV2aWNlVmVjdG9yIG91dHB1dERldmljZXM7CisgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCByZXF1ZXN0ZWRQb3J0SWQgPSAqc2VsZWN0ZWREZXZpY2VJZDsKKyAgICBEZXZpY2VWZWN0b3IgbXNkRGV2aWNlcyA9IGdldE1zZEF1ZGlvT3V0RGV2aWNlcygpOworICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IHJlcXVlc3RlZERldmljZSA9CisgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChyZXF1ZXN0ZWRQb3J0SWQpOworCisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9BdHRyaWJ1dGVzKHJlc3VsdEF0dHIsIGF0dHIsICpzdHJlYW0pOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgaWYgKGF1dG8gaXQgPSBtQWxsb3dlZENhcHR1cmVQb2xpY2llcy5maW5kKHVpZCk7IGl0ICE9IGVuZChtQWxsb3dlZENhcHR1cmVQb2xpY2llcykpIHsKKyAgICAgICAgcmVzdWx0QXR0ci0+ZmxhZ3MgfD0gaXQtPnNlY29uZDsKKyAgICB9CisgICAgKnN0cmVhbSA9IG1FbmdpbmUtPmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKCpyZXN1bHRBdHRyKTsKKworICAgIEFMT0dWKCIlcygpIGF0dHJpYnV0ZXM9JXMgc3RyZWFtPSVzIHNlc3Npb24gJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCIsIF9fZnVuY19fLAorICAgICAgICAgIHRvU3RyaW5nKCpyZXN1bHRBdHRyKS5jX3N0cigpLCB0b1N0cmluZygqc3RyZWFtKS5jX3N0cigpLCBzZXNzaW9uLCByZXF1ZXN0ZWRQb3J0SWQpOworCisgICAgLy8gVGhlIHByaW1hcnkgb3V0cHV0IGlzIHRoZSBleHBsaWNpdCByb3V0aW5nIChlZy4gc2V0UHJlZmVycmVkRGV2aWNlKSBpZiBzcGVjaWZpZWQsCisgICAgLy8gICAgICAgb3RoZXJ3aXNlLCBmYWxsYmFjayB0byB0aGUgZHluYW1pYyBwb2xpY2llcywgaWYgbm9uZSBtYXRjaCwgcXVlcnkgdGhlIGVuZ2luZS4KKyAgICAvLyBTZWNvbmRhcnkgb3V0cHV0cyBhcmUgYWx3YXlzIGZvdW5kIGJ5IGR5bmFtaWMgcG9saWNpZXMgYXMgdGhlIGVuZ2luZSBkbyBub3Qgc3VwcG9ydCB0aGVtCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHBvbGljeURlc2M7CisgICAgc3RhdHVzID0gbVBvbGljeU1peGVzLmdldE91dHB1dEZvckF0dHIoKnJlc3VsdEF0dHIsIHVpZCwgKmZsYWdzLCBwb2xpY3lEZXNjLCBzZWNvbmRhcnlEZXNjcyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKworICAgIC8vIEV4cGxpY2l0IHJvdXRpbmcgaXMgaGlnaGVyIHByaW9yaXR5IHRoZW4gYW55IGR5bmFtaWMgcG9saWN5IHByaW1hcnkgb3V0cHV0CisgICAgYm9vbCB1c2VQcmltYXJ5T3V0cHV0RnJvbVBvbGljeU1peGVzID0gcmVxdWVzdGVkRGV2aWNlID09IG51bGxwdHIgJiYgcG9saWN5RGVzYyAhPSBudWxscHRyOworCisgICAgLy8gRklYTUU6IGluIGNhc2Ugb2YgUkVOREVSIHBvbGljeSwgdGhlIG91dHB1dCBjYXBhYmlsaXRpZXMgc2hvdWxkIGJlIGNoZWNrZWQKKyAgICBpZiAoKHVzZVByaW1hcnlPdXRwdXRGcm9tUG9saWN5TWl4ZXMgfHwgIXNlY29uZGFyeURlc2NzLT5lbXB0eSgpKQorICAgICAgICAmJiAhYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkpIHsKKyAgICAgICAgQUxPR0QoIiVzOiByZWplY3RpbmcgcmVxdWVzdCBhcyBkeW5hbWljIGF1ZGlvIHBvbGljeSBvbmx5IHN1cHBvcnQgcGNtIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBpZiAodXNlUHJpbWFyeU91dHB1dEZyb21Qb2xpY3lNaXhlcykgeworICAgICAgICAqb3V0cHV0ID0gcG9saWN5RGVzYy0+bUlvSGFuZGxlOworICAgICAgICBzcDxBdWRpb1BvbGljeU1peD4gbWl4ID0gcG9saWN5RGVzYy0+bVBvbGljeU1peC5wcm9tb3RlKCk7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2MgPQorICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZShtaXgtPm1EZXZpY2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXgtPm1EZXZpY2VBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICpzZWxlY3RlZERldmljZUlkID0gZGV2aWNlRGVzYyAhPSAwID8gZGV2aWNlRGVzYy0+Z2V0SWQoKSA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgcmV0dXJucyBvdXRwdXQgJWQiLCAqb3V0cHV0KTsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKyAgICAvLyBWaXJ0dWFsIHNvdXJjZXMgbXVzdCBhbHdheXMgYmUgZHluYW1pY2FseSBvciBleHBsaWNpdGx5IHJvdXRlZAorICAgIGlmIChyZXN1bHRBdHRyLT51c2FnZSA9PSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSkgeworICAgICAgICBBTE9HVygiZ2V0T3V0cHV0Rm9yQXR0cigpIG5vIHBvbGljeSBtaXggZm91bmQgZm9yIHVzYWdlIEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIC8vIGV4cGxpY2l0IHJvdXRpbmcgbWFuYWdlZCBieSBnZXREZXZpY2VGb3JTdHJhdGVneSBpbiBBUE0gaXMgbm93IGhhbmRsZWQgYnkgZW5naW5lCisgICAgLy8gaW4gb3JkZXIgdG8gbGV0IHRoZSBjaG9pY2Ugb2YgdGhlIG9yZGVyIHRvIGZ1dHVyZSB2ZW5kb3IgZW5naW5lCisgICAgb3V0cHV0RGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKCpyZXN1bHRBdHRyLCByZXF1ZXN0ZWREZXZpY2UsIGZhbHNlKTsKKworICAgIGlmICgocmVzdWx0QXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0hXX0FWX1NZTkMpICE9IDApIHsKKyAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSgqZmxhZ3MgfCBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKTsKKyAgICB9CisKKyAgICAvLyBTZXQgaW5jYWxsIG11c2ljIG9ubHkgaWYgZGV2aWNlIHdhcyBleHBsaWNpdGx5IHNldCwgYW5kIGZhbGxiYWNrIHRvIHRoZSBkZXZpY2Ugd2hpY2ggaXMKKyAgICAvLyBjaG9zZW4gYnkgdGhlIGVuZ2luZSBpZiBub3QuCisgICAgLy8gRklYTUU6IHByb3ZpZGUgYSBtb3JlIGdlbmVyaWMgYXBwcm9hY2ggd2hpY2ggaXMgbm90IGRldmljZSBzcGVjaWZpYyBhbmQgbW92ZSB0aGlzIGJhY2sKKyAgICAvLyB0byBnZXRPdXRwdXRGb3JEZXZpY2UuCisgICAgLy8gVE9ETzogUmVtb3ZlIGNoZWNrIG9mIEFVRElPX1NUUkVBTV9NVVNJQyBvbmNlIG1pZ3JhdGlvbiBpcyBjb21wbGV0ZWQgb24gdGhlIGFwcCBzaWRlLgorICAgIGlmIChvdXRwdXREZXZpY2VzLm9ubHlDb250YWluc0RldmljZXNXaXRoVHlwZShBVURJT19ERVZJQ0VfT1VUX1RFTEVQSE9OWV9UWCkgJiYKKyAgICAgICAgKCpzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDICB8fCByZXN1bHRBdHRyLT51c2FnZSA9PSBBVURJT19VU0FHRV9WT0lDRV9DT01NVU5JQ0FUSU9OKSAmJgorICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGNvbmZpZy0+Zm9ybWF0KSAmJgorICAgICAgICBpc0luQ2FsbCgpKSB7CisgICAgICAgIGlmIChyZXF1ZXN0ZWRQb3J0SWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KUFVRElPX09VVFBVVF9GTEFHX0lOQ0FMTF9NVVNJQzsKKyAgICAgICAgICAgICppc1JlcXVlc3RlZERldmljZUZvckV4Y2x1c2l2ZVVzZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBBTE9HVigiJXMoKSBkZXZpY2UgJXMsIHNhbXBsaW5nIHJhdGUgJWQsIGZvcm1hdCAlI3gsIGNoYW5uZWwgbWFzayAlI3gsIGZsYWdzICUjeCBzdHJlYW0gJXMiLAorICAgICAgICAgIF9fZnVuY19fLCBvdXRwdXREZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsCisgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssICpmbGFncywgdG9TdHJpbmcoKnN0cmVhbSkuY19zdHIoKSk7CisKKyAgICAqb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CisgICAgaWYgKCFtc2REZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAqb3V0cHV0ID0gZ2V0T3V0cHV0Rm9yRGV2aWNlcyhtc2REZXZpY2VzLCBzZXNzaW9uLCAqc3RyZWFtLCBjb25maWcsIGZsYWdzKTsKKyAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gb3V0cHV0RGV2aWNlcy5pc0VtcHR5KCkgPyBudWxscHRyIDogb3V0cHV0RGV2aWNlcy5pdGVtQXQoMCk7CisgICAgICAgIGlmICgqb3V0cHV0ICE9IEFVRElPX0lPX0hBTkRMRV9OT05FICYmIHNldE1zZFBhdGNoKGRldmljZSkgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcygpIFVzaW5nIE1TRCBkZXZpY2VzICVzIGluc3RlYWQgb2YgZGV2aWNlcyAlcyIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbXNkRGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksIG91dHB1dERldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIG91dHB1dERldmljZXMgPSBtc2REZXZpY2VzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKm91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICB9CisgICAgfQorICAgIGlmICgqb3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7CisgICAgICAgICpvdXRwdXQgPSBnZXRPdXRwdXRGb3JEZXZpY2VzKG91dHB1dERldmljZXMsIHNlc3Npb24sICpzdHJlYW0sIGNvbmZpZywKKyAgICAgICAgICAgICAgICBmbGFncywgcmVzdWx0QXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX01VVEVfSEFQVElDKTsKKyAgICB9CisgICAgaWYgKCpvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgICpzZWxlY3RlZERldmljZUlkID0gZ2V0Rmlyc3REZXZpY2VJZChvdXRwdXREZXZpY2VzKTsKKworICAgIEFMT0dWKCIlcyByZXR1cm5zIG91dHB1dCAlZCBzZWxlY3RlZERldmljZUlkICVkIiwgX19mdW5jX18sICpvdXRwdXQsICpzZWxlY3RlZERldmljZUlkKTsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLApAQCAtODA3LDExMSArMTAyMyw3NCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpCiB7Ci0gICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXM7Ci0gICAgaWYgKGF0dHIgIT0gTlVMTCkgewotICAgICAgICBpZiAoIWlzVmFsaWRBdHRyaWJ1dGVzKGF0dHIpKSB7Ci0gICAgICAgICAgICBBTE9HRSgiZ2V0T3V0cHV0Rm9yQXR0cigpIGludmFsaWQgYXR0cmlidXRlczogdXNhZ2U9JWQgY29udGVudD0lZCBmbGFncz0weCV4IHRhZ3M9WyVzXSIsCi0gICAgICAgICAgICAgICAgICBhdHRyLT51c2FnZSwgYXR0ci0+Y29udGVudF90eXBlLCBhdHRyLT5mbGFncywKLSAgICAgICAgICAgICAgICAgIGF0dHItPnRhZ3MpOwotICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgfQotICAgICAgICBhdHRyaWJ1dGVzID0gKmF0dHI7Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKCpzdHJlYW0gPCBBVURJT19TVFJFQU1fTUlOIHx8ICpzdHJlYW0gPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKLSAgICAgICAgICAgIEFMT0dFKCJnZXRPdXRwdXRGb3JBdHRyKCk6ICBpbnZhbGlkIHN0cmVhbSB0eXBlIik7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIHN0cmVhbV90eXBlX3RvX2F1ZGlvX2F0dHJpYnV0ZXMoKnN0cmVhbSwgJmF0dHJpYnV0ZXMpOwotICAgIH0KLQotICAgIC8vIFRPRE86IGNoZWNrIGZvciBleGlzdGluZyBjbGllbnQgZm9yIHRoaXMgcG9ydCBJRAotICAgIGlmICgqcG9ydElkID09IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7Ci0gICAgfQotCi0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2M7Ci0gICAgaWYgKG1Qb2xpY3lNaXhlcy5nZXRPdXRwdXRGb3JBdHRyKGF0dHJpYnV0ZXMsIHVpZCwgZGVzYykgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR19BU1NFUlQoZGVzYyAhPSAwLCAiSW52YWxpZCBkZXNjIHJldHVybmVkIGJ5IGdldE91dHB1dEZvckF0dHIiKTsKLSAgICAgICAgaWYgKCFhdWRpb19oYXNfcHJvcG9ydGlvbmFsX2ZyYW1lcyhjb25maWctPmZvcm1hdCkpIHsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgKnN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmYXR0cmlidXRlcyk7Ci0gICAgICAgICpvdXRwdXQgPSBkZXNjLT5tSW9IYW5kbGU7Ci0gICAgICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgcmV0dXJucyBvdXRwdXQgJWQiLCAqb3V0cHV0KTsKLSAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwotICAgIH0KLSAgICBpZiAoYXR0cmlidXRlcy51c2FnZSA9PSBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSkgewotICAgICAgICBBTE9HVygiZ2V0T3V0cHV0Rm9yQXR0cigpIG5vIHBvbGljeSBtaXggZm91bmQgZm9yIHVzYWdlIEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFIik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotCi0gICAgQUxPR1YoImdldE91dHB1dEZvckF0dHIoKSB1c2FnZT0lZCwgY29udGVudD0lZCwgdGFnPSVzIGZsYWdzPSUwOHgiCi0gICAgICAgICAgICAiIHNlc3Npb24gJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCIsCi0gICAgICAgICAgICBhdHRyaWJ1dGVzLnVzYWdlLCBhdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSwgYXR0cmlidXRlcy50YWdzLCBhdHRyaWJ1dGVzLmZsYWdzLAotICAgICAgICAgICAgc2Vzc2lvbiwgKnNlbGVjdGVkRGV2aWNlSWQpOwotCi0gICAgKnN0cmVhbSA9IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludCgmYXR0cmlidXRlcyk7Ci0KLSAgICAvLyBFeHBsaWNpdCByb3V0aW5nPwotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2M7Ci0gICAgaWYgKCpzZWxlY3RlZERldmljZUlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgZGV2aWNlRGVzYyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZCgqc2VsZWN0ZWREZXZpY2VJZCk7Ci0gICAgfQotICAgIG1PdXRwdXRSb3V0ZXMuYWRkUm91dGUoc2Vzc2lvbiwgKnN0cmVhbSwgU2Vzc2lvblJvdXRlOjpTT1VSQ0VfVFlQRV9OQSwgZGV2aWNlRGVzYywgdWlkKTsKLQotICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSAocm91dGluZ19zdHJhdGVneSkgZ2V0U3RyYXRlZ3lGb3JBdHRyKCZhdHRyaWJ1dGVzKTsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwotCi0gICAgaWYgKChhdHRyaWJ1dGVzLmZsYWdzICYgQVVESU9fRkxBR19IV19BVl9TWU5DKSAhPSAwKSB7Ci0gICAgICAgICpmbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoKmZsYWdzIHwgQVVESU9fT1VUUFVUX0ZMQUdfSFdfQVZfU1lOQyk7Ci0gICAgfQotCi0gICAgLy8gU2V0IGluY2FsbCBtdXNpYyBvbmx5IGlmIGRldmljZSB3YXMgZXhwbGljaXRseSBzZXQsIGFuZCBmYWxsYmFjayB0byB0aGUgZGV2aWNlIHdoaWNoIGlzCi0gICAgLy8gY2hvc2VuIGJ5IHRoZSBlbmdpbmUgaWYgbm90LgotICAgIC8vIEZJWE1FOiBwcm92aWRlIGEgbW9yZSBnZW5lcmljIGFwcHJvYWNoIHdoaWNoIGlzIG5vdCBkZXZpY2Ugc3BlY2lmaWMgYW5kIG1vdmUgdGhpcyBiYWNrCi0gICAgLy8gdG8gZ2V0T3V0cHV0Rm9yRGV2aWNlLgotICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9URUxFUEhPTllfVFggJiYKLSAgICAgICAgKnN0cmVhbSA9PSBBVURJT19TVFJFQU1fTVVTSUMgJiYKLSAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkgJiYKLSAgICAgICAgaXNJbkNhbGwoKSkgewotICAgICAgICBpZiAoKnNlbGVjdGVkRGV2aWNlSWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KUFVRElPX09VVFBVVF9GTEFHX0lOQ0FMTF9NVVNJQzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRldmljZSA9IG1FbmdpbmUtPmdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JBdHRyKCkgZGV2aWNlIDB4JXgsIHNhbXBsaW5nIHJhdGUgJWQsIGZvcm1hdCAlI3gsIGNoYW5uZWwgbWFzayAlI3gsICIKLSAgICAgICAgICAiZmxhZ3MgJSN4IiwKLSAgICAgICAgICBkZXZpY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgKmZsYWdzKTsKLQotICAgICpvdXRwdXQgPSBnZXRPdXRwdXRGb3JEZXZpY2UoZGV2aWNlLCBzZXNzaW9uLCAqc3RyZWFtLCBjb25maWcsIGZsYWdzKTsKLSAgICBpZiAoKm91dHB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICBtT3V0cHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOworICAgIC8vIFRoZSBzdXBwbGllZCBwb3J0SWQgbXVzdCBiZSBBVURJT19QT1JUX0hBTkRMRV9OT05FCisgICAgaWYgKCpwb3J0SWQgIT0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORSkgewogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQorICAgIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgcmVxdWVzdGVkUG9ydElkID0gKnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgYXVkaW9fYXR0cmlidXRlc190IHJlc3VsdEF0dHI7CisgICAgYm9vbCBpc1JlcXVlc3RlZERldmljZUZvckV4Y2x1c2l2ZVVzZSA9IGZhbHNlOworICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gc2Vjb25kYXJ5T3V0cHV0RGVzY3M7CisgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gcmVxdWVzdGVkRGV2aWNlID0KKyAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChyZXF1ZXN0ZWRQb3J0SWQpOwogCi0gICAgRGV2aWNlVmVjdG9yIG91dHB1dERldmljZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICAqc2VsZWN0ZWREZXZpY2VJZCA9IG91dHB1dERldmljZXMuc2l6ZSgpID4gMCA/IG91dHB1dERldmljZXMuaXRlbUF0KDApLT5nZXRJZCgpCi0gICAgICAgICAgICA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgLy8gUHJldmVudCBmcm9tIHN0b3JpbmcgaW52YWxpZCByZXF1ZXN0ZWQgZGV2aWNlIGlkIGluIGNsaWVudHMKKyAgICBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IHNhbml0aXplZFJlcXVlc3RlZFBvcnRJZCA9CisgICAgICByZXF1ZXN0ZWREZXZpY2UgIT0gbnVsbHB0ciA/IHJlcXVlc3RlZFBvcnRJZCA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBzYW5pdGl6ZWRSZXF1ZXN0ZWRQb3J0SWQ7CiAKLSAgICBBTE9HVigiICBnZXRPdXRwdXRGb3JBdHRyKCkgcmV0dXJucyBvdXRwdXQgJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCIsICpvdXRwdXQsICpzZWxlY3RlZERldmljZUlkKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRPdXRwdXRGb3JBdHRySW50KCZyZXN1bHRBdHRyLCBvdXRwdXQsIHNlc3Npb24sIGF0dHIsIHN0cmVhbSwgdWlkLAorICAgICAgICAgICAgY29uZmlnLCBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgJmlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlLAorICAgICAgICAgICAgJnNlY29uZGFyeU91dHB1dERlc2NzKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPHdwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gd2Vha1NlY29uZGFyeU91dHB1dERlc2NzOworICAgIGZvciAoYXV0byYgc2Vjb25kYXJ5RGVzYyA6IHNlY29uZGFyeU91dHB1dERlc2NzKSB7CisgICAgICAgIHNlY29uZGFyeU91dHB1dHMtPnB1c2hfYmFjayhzZWNvbmRhcnlEZXNjLT5tSW9IYW5kbGUpOworICAgICAgICB3ZWFrU2Vjb25kYXJ5T3V0cHV0RGVzY3MucHVzaF9iYWNrKHNlY29uZGFyeURlc2MpOworICAgIH0KKworICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY2xpZW50Q29uZmlnID0gey5zYW1wbGVfcmF0ZSA9IGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgIC5jaGFubmVsX21hc2sgPSBjb25maWctPmNoYW5uZWxfbWFzaywKKyAgICAgICAgLmZvcm1hdCA9IGNvbmZpZy0+Zm9ybWF0LAorICAgIH07CisgICAgKnBvcnRJZCA9IFBvbGljeUF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7CisKKyAgICBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+IGNsaWVudERlc2MgPQorICAgICAgICBuZXcgVHJhY2tDbGllbnREZXNjcmlwdG9yKCpwb3J0SWQsIHVpZCwgc2Vzc2lvbiwgcmVzdWx0QXR0ciwgY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbml0aXplZFJlcXVlc3RlZFBvcnRJZCwgKnN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKHJlc3VsdEF0dHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvVm9sdW1lU291cmNlKHJlc3VsdEF0dHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpmbGFncywgaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKHdlYWtTZWNvbmRhcnlPdXRwdXREZXNjcykpOworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3IoKm91dHB1dCk7CisgICAgb3V0cHV0RGVzYy0+YWRkQ2xpZW50KGNsaWVudERlc2MpOworCisgICAgQUxPR1YoIiVzKCkgcmV0dXJucyBvdXRwdXQgJWQgcmVxdWVzdGVkUG9ydElkICVkIHNlbGVjdGVkRGV2aWNlSWQgJWQgZm9yIHBvcnQgSUQgJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAqb3V0cHV0LCByZXF1ZXN0ZWRQb3J0SWQsICpzZWxlY3RlZERldmljZUlkLCAqcG9ydElkKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRGb3JEZXZpY2UoCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dEZvckRldmljZXMoCisgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcywKICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCAqZmxhZ3MpCisgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKKyAgICAgICAgYm9vbCBmb3JjZU11dGluZ0hhcHRpYykKIHsKICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAKKyAgICAvLyBEaXNjYXJkIGhhcHRpYyBjaGFubmVsIG1hc2sgd2hlbiBmb3JjaW5nIG11dGluZyBoYXB0aWMgY2hhbm5lbHMuCisgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSBmb3JjZU11dGluZ0hhcHRpYworICAgICAgICAgICAgPyAoY29uZmlnLT5jaGFubmVsX21hc2sgJiB+QVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKSA6IGNvbmZpZy0+Y2hhbm5lbF9tYXNrOworCiAgICAgLy8gb3BlbiBhIGRpcmVjdCBvdXRwdXQgaWYgcmVxdWlyZWQgYnkgc3BlY2lmaWVkIHBhcmFtZXRlcnMKICAgICAvL2ZvcmNlIGRpcmVjdCBmbGFnIGlmIG9mZmxvYWQgZmxhZyBpcyBzZXQ6IG9mZmxvYWRpbmcgaW1wbGllcyBhIGRpcmVjdCBvdXRwdXQgc3RyZWFtCiAgICAgLy8gYW5kIGFsbCBjb21tb24gYmVoYXZpb3JzIGFyZSBkcml2ZW4gYnkgY2hlY2tpbmcgb25seSB0aGUgZGlyZWN0IGZsYWcKQEAgLTkzNCw3ICsxMTEzLDggQEAKICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9UVFMpIHsKICAgICAgICAgKmZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfVFRTOwogICAgIH0gZWxzZSBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMICYmCi0gICAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGNvbmZpZy0+Zm9ybWF0KSkgeworICAgICAgICAgICAgICAgYXVkaW9faXNfbGluZWFyX3BjbShjb25maWctPmZvcm1hdCkgJiYKKyAgICAgICAgICAgICAgICgqZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19JTkNBTExfTVVTSUMpID09IDApIHsKICAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KShBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYIHwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CiAgICAgICAgIEFMT0dWKCJTZXQgVm9JUCBhbmQgRGlyZWN0IG91dHB1dCBmbGFncyBmb3IgUENNIGZvcm1hdCIpOwpAQCAtOTQ3LDcgKzExMjcsNyBAQAogICAgIC8vIGFuZCBub3QgZXhwbGljaXRseSByZXF1ZXN0ZWQKICAgICBpZiAoKCgqZmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpID09IDApICYmCiAgICAgICAgICAgICBhdWRpb19pc19saW5lYXJfcGNtKGNvbmZpZy0+Zm9ybWF0KSAmJiBjb25maWctPnNhbXBsZV9yYXRlIDw9IFNBTVBMRV9SQVRFX0haX01BWCAmJgotICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNvbmZpZy0+Y2hhbm5lbF9tYXNrKSA8PSAyKSB7CisgICAgICAgICAgICBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soY2hhbm5lbE1hc2spIDw9IDIpIHsKICAgICAgICAgZ290byBub25fZGlyZWN0X291dHB1dDsKICAgICB9CiAKQEAgLTk2MCwxMSArMTE0MCwxMiBAQAogCiAgICAgaWYgKCgoKmZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfQ09NUFJFU1NfT0ZGTE9BRCkgPT0gMCkgfHwKICAgICAgICAgICAgICEobUVmZmVjdHMuaXNOb25PZmZsb2FkYWJsZUVmZmVjdEVuYWJsZWQoKSB8fCBtTWFzdGVyTW9ubykpIHsKLSAgICAgICAgcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5mb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KSpmbGFncyk7CisgICAgICAgIHByb2ZpbGUgPSBnZXRQcm9maWxlRm9yT3V0cHV0KGRldmljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KSpmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBkaXJlY3RPbmx5ICovKTsKICAgICB9CiAKICAgICBpZiAocHJvZmlsZSAhPSAwKSB7CkBAIC05NzQsMTIgKzExNTUsMTIgQEAKICAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgKHByb2ZpbGUgPT0gZGVzYy0+bVByb2ZpbGUpKSB7CiAgICAgICAgICAgICAgICAgLy8gcmV1c2UgZGlyZWN0IG91dHB1dCBpZiBjdXJyZW50bHkgb3BlbiBieSB0aGUgc2FtZSBjbGllbnQKICAgICAgICAgICAgICAgICAvLyBhbmQgY29uZmlndXJlZCB3aXRoIHNhbWUgcGFyYW1ldGVycwotICAgICAgICAgICAgICAgIGlmICgoY29uZmlnLT5zYW1wbGVfcmF0ZSA9PSBkZXNjLT5tU2FtcGxpbmdSYXRlKSAmJgotICAgICAgICAgICAgICAgICAgICAoY29uZmlnLT5mb3JtYXQgPT0gZGVzYy0+bUZvcm1hdCkgJiYKLSAgICAgICAgICAgICAgICAgICAgKGNvbmZpZy0+Y2hhbm5lbF9tYXNrID09IGRlc2MtPm1DaGFubmVsTWFzaykgJiYKKyAgICAgICAgICAgICAgICBpZiAoKGNvbmZpZy0+c2FtcGxlX3JhdGUgPT0gZGVzYy0+Z2V0U2FtcGxpbmdSYXRlKCkpICYmCisgICAgICAgICAgICAgICAgICAgIChjb25maWctPmZvcm1hdCA9PSBkZXNjLT5nZXRGb3JtYXQoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgKGNoYW5uZWxNYXNrID09IGRlc2MtPmdldENoYW5uZWxNYXNrKCkpICYmCiAgICAgICAgICAgICAgICAgICAgIChzZXNzaW9uID09IGRlc2MtPm1EaXJlY3RDbGllbnRTZXNzaW9uKSkgewogICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRGlyZWN0T3BlbkNvdW50Kys7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dJKCJnZXRPdXRwdXRGb3JEZXZpY2UoKSByZXVzaW5nIGRpcmVjdCBvdXRwdXQgJWQgZm9yIHNlc3Npb24gJWQiLAorICAgICAgICAgICAgICAgICAgICBBTE9HSSgiJXMgcmV1c2luZyBkaXJlY3Qgb3V0cHV0ICVkIGZvciBzZXNzaW9uICVkIiwgX19mdW5jX18sIAogICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMua2V5QXQoaSksIHNlc3Npb24pOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gbU91dHB1dHMua2V5QXQoaSk7CiAgICAgICAgICAgICAgICAgfQpAQCAtOTkzLDIxICsxMTc0LDM2IEBACiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0KICAgICAgICAgICAgICAgICBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwogCi0gICAgICAgIERldmljZVZlY3RvciBvdXRwdXREZXZpY2VzID0gbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGRldmljZSk7Ci0gICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG91dHB1dERldmljZXMuc2l6ZSgpID4gMCA/IG91dHB1dERldmljZXMuaXRlbUF0KDApLT5tQWRkcmVzcwotICAgICAgICAgICAgICAgIDogU3RyaW5nOCgiIik7CisgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IGdldEZpcnN0RGV2aWNlQWRkcmVzcyhkZXZpY2VzKTsKIAotICAgICAgICBzdGF0dXMgPSBvdXRwdXREZXNjLT5vcGVuKGNvbmZpZywgZGV2aWNlLCBhZGRyZXNzLCBzdHJlYW0sICpmbGFncywgJm91dHB1dCk7CisgICAgICAgIC8vIE1TRCBwYXRjaCBtYXkgYmUgdXNpbmcgdGhlIG9ubHkgb3V0cHV0IHN0cmVhbSB0aGF0IGNhbiBzZXJ2aWNlIHRoaXMgcmVxdWVzdC4gUmVsZWFzZQorICAgICAgICAvLyBNU0QgcGF0Y2ggdG8gcHJpb3JpdGl6ZSB0aGlzIHJlcXVlc3Qgb3ZlciBhbnkgYWN0aXZlIG91dHB1dCBvbiBNU0QuCisgICAgICAgIEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIG1zZFBhdGNoZXMgPSBnZXRNc2RQYXRjaGVzKCk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbXNkUGF0Y2hlcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgY29uc3QgYXV0byYgcGF0Y2ggPSBtc2RQYXRjaGVzW2ldOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBwYXRjaC0+bVBhdGNoLm51bV9zaW5rczsgKytqKSB7CisgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rID0gJnBhdGNoLT5tUGF0Y2guc2lua3Nbal07CisgICAgICAgICAgICAgICAgaWYgKHNpbmstPnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlcy5jb250YWluc0RldmljZVdpdGhUeXBlKHNpbmstPmV4dC5kZXZpY2UudHlwZSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChhZGRyZXNzLmlzRW1wdHkoKSB8fCBzdHJuY21wKHNpbmstPmV4dC5kZXZpY2UuYWRkcmVzcywgYWRkcmVzcy5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX01BWF9BRERSRVNTX0xFTikgPT0gMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgcmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2gtPmdldEhhbmRsZSgpLCBtVWlkQ2FjaGVkKTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gb3V0cHV0RGVzYy0+b3Blbihjb25maWcsIGRldmljZXMsIHN0cmVhbSwgKmZsYWdzLCAmb3V0cHV0KTsKIAogICAgICAgICAvLyBvbmx5IGFjY2VwdCBhbiBvdXRwdXQgd2l0aCB0aGUgcmVxdWVzdGVkIHBhcmFtZXRlcnMKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fAotICAgICAgICAgICAgKGNvbmZpZy0+c2FtcGxlX3JhdGUgIT0gMCAmJiBjb25maWctPnNhbXBsZV9yYXRlICE9IG91dHB1dERlc2MtPm1TYW1wbGluZ1JhdGUpIHx8Ci0gICAgICAgICAgICAoY29uZmlnLT5mb3JtYXQgIT0gQVVESU9fRk9STUFUX0RFRkFVTFQgJiYgY29uZmlnLT5mb3JtYXQgIT0gb3V0cHV0RGVzYy0+bUZvcm1hdCkgfHwKLSAgICAgICAgICAgIChjb25maWctPmNoYW5uZWxfbWFzayAhPSAwICYmIGNvbmZpZy0+Y2hhbm5lbF9tYXNrICE9IG91dHB1dERlc2MtPm1DaGFubmVsTWFzaykpIHsKLSAgICAgICAgICAgIEFMT0dWKCJnZXRPdXRwdXRGb3JEZXZpY2UoKSBmYWlsZWQgb3BlbmluZyBkaXJlY3Qgb3V0cHV0OiBvdXRwdXQgJWQgc2FtcGxlIHJhdGUgJWQgJWQsIgotICAgICAgICAgICAgICAgICAgICAiZm9ybWF0ICVkICVkLCBjaGFubmVsIG1hc2sgJTA0eCAlMDR4Iiwgb3V0cHV0LCBjb25maWctPnNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tU2FtcGxpbmdSYXRlLCBjb25maWctPmZvcm1hdCwgb3V0cHV0RGVzYy0+bUZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgY29uZmlnLT5jaGFubmVsX21hc2ssIG91dHB1dERlc2MtPm1DaGFubmVsTWFzayk7CisgICAgICAgICAgICAoY29uZmlnLT5zYW1wbGVfcmF0ZSAhPSAwICYmIGNvbmZpZy0+c2FtcGxlX3JhdGUgIT0gb3V0cHV0RGVzYy0+Z2V0U2FtcGxpbmdSYXRlKCkpIHx8CisgICAgICAgICAgICAoY29uZmlnLT5mb3JtYXQgIT0gQVVESU9fRk9STUFUX0RFRkFVTFQgJiYgY29uZmlnLT5mb3JtYXQgIT0gb3V0cHV0RGVzYy0+Z2V0Rm9ybWF0KCkpIHx8CisgICAgICAgICAgICAoY2hhbm5lbE1hc2sgIT0gMCAmJiBjaGFubmVsTWFzayAhPSBvdXRwdXREZXNjLT5nZXRDaGFubmVsTWFzaygpKSkgeworICAgICAgICAgICAgQUxPR1YoIiVzIGZhaWxlZCBvcGVuaW5nIGRpcmVjdCBvdXRwdXQ6IG91dHB1dCAlZCBzYW1wbGUgcmF0ZSAlZCAlZCwiIAorICAgICAgICAgICAgICAgICAgICAiZm9ybWF0ICVkICVkLCBjaGFubmVsIG1hc2sgJTA0eCAlMDR4IiwgX19mdW5jX18sIG91dHB1dCwgY29uZmlnLT5zYW1wbGVfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+Z2V0U2FtcGxpbmdSYXRlKCksIGNvbmZpZy0+Zm9ybWF0LCBvdXRwdXREZXNjLT5nZXRGb3JtYXQoKSwKKyAgICAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2ssIG91dHB1dERlc2MtPmdldENoYW5uZWxNYXNrKCkpOwogICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmNsb3NlKCk7CiAgICAgICAgICAgICB9CkBAIC0xMDE4LDE0ICsxMjE0LDEyIEBACiAgICAgICAgICAgICB9CiAgICAgICAgICAgICByZXR1cm4gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgIH0KLSAgICAgICAgb3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPSAwOwotICAgICAgICBvdXRwdXREZXNjLT5tU3RvcFRpbWVbc3RyZWFtXSA9IDA7CiAgICAgICAgIG91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQgPSAxOwogICAgICAgICBvdXRwdXREZXNjLT5tRGlyZWN0Q2xpZW50U2Vzc2lvbiA9IHNlc3Npb247CiAKICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7CiAgICAgICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKLSAgICAgICAgQUxPR1YoImdldE91dHB1dEZvckRldmljZSgpIHJldHVybnMgbmV3IGRpcmVjdCBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgICAgICBBTE9HVigiJXMgcmV0dXJucyBuZXcgZGlyZWN0IG91dHB1dCAlZCIsIF9fZnVuY19fLCBvdXRwdXQpOwogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgIHJldHVybiBvdXRwdXQ7CiAgICAgfQpAQCAtMTA0NiwxNTkgKzEyNDAsMzM2IEBACiAgICAgaWYgKGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpKSB7CiAgICAgICAgIC8vIGdldCB3aGljaCBvdXRwdXQgaXMgc3VpdGFibGUgZm9yIHRoZSBzcGVjaWZpZWQgc3RyZWFtLiBUaGUgYWN0dWFsCiAgICAgICAgIC8vIHJvdXRpbmcgY2hhbmdlIHdpbGwgaGFwcGVuIHdoZW4gc3RhcnRPdXRwdXQoKSB3aWxsIGJlIGNhbGxlZAotICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgbU91dHB1dHMpOworICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlcyhkZXZpY2VzLCBtT3V0cHV0cyk7CiAKICAgICAgICAgLy8gYXQgdGhpcyBzdGFnZSB3ZSBzaG91bGQgaWdub3JlIHRoZSBESVJFQ1QgZmxhZyBhcyBubyBkaXJlY3Qgb3V0cHV0IGNvdWxkIGJlIGZvdW5kIGVhcmxpZXIKICAgICAgICAgKmZsYWdzID0gKGF1ZGlvX291dHB1dF9mbGFnc190KSgqZmxhZ3MgJiB+QVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKLSAgICAgICAgb3V0cHV0ID0gc2VsZWN0T3V0cHV0KG91dHB1dHMsICpmbGFncywgY29uZmlnLT5mb3JtYXQpOworICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cywgKmZsYWdzLCBjb25maWctPmZvcm1hdCwgY2hhbm5lbE1hc2ssIGNvbmZpZy0+c2FtcGxlX3JhdGUpOwogICAgIH0KLSAgICBBTE9HV19JRigob3V0cHV0ID09IDApLCAiZ2V0T3V0cHV0Rm9yRGV2aWNlKCkgY291bGQgbm90IGZpbmQgb3V0cHV0IGZvciBzdHJlYW0gJWQsICIKKyAgICBBTE9HV19JRigob3V0cHV0ID09IDApLCAiZ2V0T3V0cHV0Rm9yRGV2aWNlcygpIGNvdWxkIG5vdCBmaW5kIG91dHB1dCBmb3Igc3RyZWFtICVkLCAiCiAgICAgICAgICAgICAic2FtcGxpbmcgcmF0ZSAlZCwgZm9ybWF0ICUjeCwgY2hhbm5lbHMgJSN4LCBmbGFncyAlI3giLAotICAgICAgICAgICAgc3RyZWFtLCBjb25maWctPnNhbXBsZV9yYXRlLCBjb25maWctPmZvcm1hdCwgY29uZmlnLT5jaGFubmVsX21hc2ssICpmbGFncyk7CisgICAgICAgICAgICBzdHJlYW0sIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjaGFubmVsTWFzaywgKmZsYWdzKTsKIAogICAgIHJldHVybiBvdXRwdXQ7CiB9CiAKLWF1ZGlvX2lvX2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2VsZWN0T3V0cHV0KGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0KQotewotICAgIC8vIHNlbGVjdCBvbmUgb3V0cHV0IGFtb25nIHNldmVyYWwgdGhhdCBwcm92aWRlIGEgcGF0aCB0byBhIHBhcnRpY3VsYXIgZGV2aWNlIG9yIHNldCBvZgotICAgIC8vIGRldmljZXMgKHRoZSBsaXN0IHdhcyBwcmV2aW91c2x5IGJ1aWxkIGJ5IGdldE91dHB1dHNGb3JEZXZpY2UoKSkuCi0gICAgLy8gVGhlIHByaW9yaXR5IGlzIGFzIGZvbGxvd3M6Ci0gICAgLy8gMTogdGhlIG91dHB1dCB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBvZiByZXF1ZXN0ZWQgcG9saWN5IGZsYWdzCi0gICAgLy8gMjogdGhlIG91dHB1dCB3aXRoIHRoZSBiaXQgZGVwdGggdGhlIGNsb3Nlc3QgdG8gdGhlIHJlcXVlc3RlZCBvbmUKLSAgICAvLyAzOiB0aGUgcHJpbWFyeSBvdXRwdXQKLSAgICAvLyA0OiB0aGUgZmlyc3Qgb3V0cHV0IGluIHRoZSBsaXN0CitzcDxEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE1zZEF1ZGlvSW5EZXZpY2UoKSBjb25zdCB7CisgICAgYXV0byBtc2RJbkRldmljZXMgPSBtSHdNb2R1bGVzLmdldEF2YWlsYWJsZURldmljZXNGcm9tTW9kdWxlTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyk7CisgICAgcmV0dXJuIG1zZEluRGV2aWNlcy5pc0VtcHR5KCk/IG51bGxwdHIgOiBtc2RJbkRldmljZXMuaXRlbUF0KDApOworfQogCi0gICAgaWYgKG91dHB1dHMuc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgIH0KLSAgICBpZiAob3V0cHV0cy5zaXplKCkgPT0gMSkgewotICAgICAgICByZXR1cm4gb3V0cHV0c1swXTsKLSAgICB9CitEZXZpY2VWZWN0b3IgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNc2RBdWRpb091dERldmljZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Id01vZHVsZXMuZ2V0QXZhaWxhYmxlRGV2aWNlc0Zyb21Nb2R1bGVOYW1lKEFVRElPX0hBUkRXQVJFX01PRFVMRV9JRF9NU0QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzKTsKK30KIAotICAgIGludCBtYXhDb21tb25GbGFncyA9IDA7Ci0gICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Rm9yRmxhZ3MgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXRGb3JQcmltYXJ5ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0Rm9yRm9ybWF0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgYXVkaW9fZm9ybWF0X3QgYmVzdEZvcm1hdCA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwotICAgIGF1ZGlvX2Zvcm1hdF90IGJlc3RGb3JtYXRGb3JGbGFncyA9IEFVRElPX0ZPUk1BVF9JTlZBTElEOwotCi0gICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgOiBvdXRwdXRzKSB7Ci0gICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewotICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gaWYgYSB2YWxpZCBmb3JtYXQgaXMgc3BlY2lmaWVkLCBza2lwIG91dHB1dCBpZiBub3QgY29tcGF0aWJsZQotICAgICAgICAgICAgaWYgKGZvcm1hdCAhPSBBVURJT19GT1JNQVRfSU5WQUxJRCkgewotICAgICAgICAgICAgICAgIGlmICghYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworY29uc3QgQXVkaW9QYXRjaENvbGxlY3Rpb24gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRNc2RQYXRjaGVzKCkgY29uc3QgeworICAgIEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIG1zZFBhdGNoZXM7CisgICAgc3A8SHdNb2R1bGU+IG1zZE1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCk7CisgICAgaWYgKG1zZE1vZHVsZSAhPSAwKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF1ZGlvUGF0Y2hlcy5zaXplKCk7ICsraSkgeworICAgICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2ggPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHBhdGNoLT5tUGF0Y2gubnVtX3NvdXJjZXM7ICsraikgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlID0gJnBhdGNoLT5tUGF0Y2guc291cmNlc1tqXTsKKyAgICAgICAgICAgICAgICBpZiAoc291cmNlLT50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZS0+ZXh0LmRldmljZS5od19tb2R1bGUgPT0gbXNkTW9kdWxlLT5nZXRIYW5kbGUoKSkgeworICAgICAgICAgICAgICAgICAgICBtc2RQYXRjaGVzLmFkZEF1ZGlvUGF0Y2gocGF0Y2gtPmdldEhhbmRsZSgpLCBwYXRjaCk7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChBdWRpb1BvcnQ6OmlzQmV0dGVyRm9ybWF0TWF0Y2goCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRm9ybWF0LCBiZXN0Rm9ybWF0LCBmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dEZvckZvcm1hdCA9IG91dHB1dDsKLSAgICAgICAgICAgICAgICAgICAgYmVzdEZvcm1hdCA9IG91dHB1dERlc2MtPm1Gb3JtYXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpbnQgY29tbW9uRmxhZ3MgPSBwb3Bjb3VudChvdXRwdXREZXNjLT5tUHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIGZsYWdzKTsKLSAgICAgICAgICAgIGlmIChjb21tb25GbGFncyA+PSBtYXhDb21tb25GbGFncykgewotICAgICAgICAgICAgICAgIGlmIChjb21tb25GbGFncyA9PSBtYXhDb21tb25GbGFncykgewotICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElECi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJiYgQXVkaW9Qb3J0Ojppc0JldHRlckZvcm1hdE1hdGNoKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bUZvcm1hdCwgYmVzdEZvcm1hdEZvckZsYWdzLCBmb3JtYXQpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRGb3JGbGFncyA9IG91dHB1dDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJlc3RGb3JtYXRGb3JGbGFncyA9IG91dHB1dERlc2MtPm1Gb3JtYXQ7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICBvdXRwdXRGb3JGbGFncyA9IG91dHB1dDsKLSAgICAgICAgICAgICAgICAgICAgbWF4Q29tbW9uRmxhZ3MgPSBjb21tb25GbGFnczsKLSAgICAgICAgICAgICAgICAgICAgYmVzdEZvcm1hdEZvckZsYWdzID0gb3V0cHV0RGVzYy0+bUZvcm1hdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQUxPR1YoInNlbGVjdE91dHB1dCgpIGNvbW1vbkZsYWdzIGZvciBvdXRwdXQgJWQsICUwNHgiLCBvdXRwdXQsIGNvbW1vbkZsYWdzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5tUHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlkpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRGb3JQcmltYXJ5ID0gb3V0cHV0OwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQotCi0gICAgaWYgKG91dHB1dEZvckZsYWdzICE9IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgIHJldHVybiBvdXRwdXRGb3JGbGFnczsKLSAgICB9Ci0gICAgaWYgKG91dHB1dEZvckZvcm1hdCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICByZXR1cm4gb3V0cHV0Rm9yRm9ybWF0OwotICAgIH0KLSAgICBpZiAob3V0cHV0Rm9yUHJpbWFyeSAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICByZXR1cm4gb3V0cHV0Rm9yUHJpbWFyeTsKLSAgICB9Ci0KLSAgICByZXR1cm4gb3V0cHV0c1swXTsKKyAgICByZXR1cm4gbXNkUGF0Y2hlczsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRCZXN0TXNkQXVkaW9Qcm9maWxlRm9yKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZvdXRwdXREZXZpY2UsCisgICAgICAgIGJvb2wgaHdBdlN5bmMsIGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2VDb25maWcsIGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rQ29uZmlnKSBjb25zdAogewotICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIG91dHB1dCAlZCwgc3RyZWFtICVkLCBzZXNzaW9uICVkIiwKLSAgICAgICAgICBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdGFydE91dHB1dCgpIHVua25vd24gb3V0cHV0ICVkIiwgb3V0cHV0KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBzcDxId01vZHVsZT4gbXNkTW9kdWxlID0gbUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKTsKKyAgICBpZiAobXNkTW9kdWxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgdW5hYmxlIHRvIGdldCBNU0QgbW9kdWxlIiwgX19mdW5jX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgc3A8SHdNb2R1bGU+IGRldmljZU1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRm9yRGV2aWNlKG91dHB1dERldmljZSwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgIGlmIChkZXZpY2VNb2R1bGUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMoKSB1bmFibGUgdG8gZ2V0IG1vZHVsZSBmb3IgJXMiLCBfX2Z1bmNfXywgb3V0cHV0RGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgY29uc3QgSW5wdXRQcm9maWxlQ29sbGVjdGlvbiAmaW5wdXRQcm9maWxlcyA9IG1zZE1vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpOworICAgIGlmIChpbnB1dFByb2ZpbGVzLmlzRW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXMoKSBubyBpbnB1dCBwcm9maWxlcyBmb3IgTVNEIG1vZHVsZSIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGNvbnN0IE91dHB1dFByb2ZpbGVDb2xsZWN0aW9uICZvdXRwdXRQcm9maWxlcyA9IGRldmljZU1vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKTsKKyAgICBpZiAob3V0cHV0UHJvZmlsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIEFMT0dFKCIlcygpIG5vIG91dHB1dCBwcm9maWxlcyBmb3IgZGV2aWNlICVzIiwgX19mdW5jX18sIG91dHB1dERldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEF1ZGlvUHJvZmlsZVZlY3RvciBtc2RQcm9maWxlczsKKyAgICAvLyBFYWNoIElPUHJvZmlsZSByZXByZXNlbnRzIGEgTWl4UG9ydCBmcm9tIGF1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbAorICAgIGZvciAoY29uc3QgYXV0byAmaW5Qcm9maWxlIDogaW5wdXRQcm9maWxlcykgeworICAgICAgICBpZiAoaHdBdlN5bmMgPT0gKChpblByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19JTlBVVF9GTEFHX0hXX0FWX1NZTkMpICE9IDApKSB7CisgICAgICAgICAgICBhcHBlbmRBdWRpb1Byb2ZpbGVzKG1zZFByb2ZpbGVzLCBpblByb2ZpbGUtPmdldEF1ZGlvUHJvZmlsZXMoKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgQXVkaW9Qcm9maWxlVmVjdG9yIGRldmljZVByb2ZpbGVzOworICAgIGZvciAoY29uc3QgYXV0byAmb3V0UHJvZmlsZSA6IG91dHB1dFByb2ZpbGVzKSB7CisgICAgICAgIGlmIChod0F2U3luYyA9PSAoKG91dFByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DKSAhPSAwKSkgeworICAgICAgICAgICAgYXBwZW5kQXVkaW9Qcm9maWxlcyhkZXZpY2VQcm9maWxlcywgb3V0UHJvZmlsZS0+Z2V0QXVkaW9Qcm9maWxlcygpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgYmVzdFNpbmtDb25maWc7CisgICAgc3RhdHVzX3QgcmVzdWx0ID0gZmluZEJlc3RNYXRjaGluZ091dHB1dENvbmZpZyhtc2RQcm9maWxlcywgZGV2aWNlUHJvZmlsZXMsCisgICAgICAgICAgICBjb21wcmVzc2VkRm9ybWF0c09yZGVyLCBzdXJyb3VuZENoYW5uZWxNYXNrc09yZGVyLCB0cnVlIC8qcHJlZmVySGlnaGVyU2FtcGxpbmdSYXRlcyovLAorICAgICAgICAgICAgYmVzdFNpbmtDb25maWcpOworICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR0QoIiVzKCkgbm8gbWF0Y2hpbmcgcHJvZmlsZXMgZm91bmQgZm9yIGRldmljZTogJXMsIGh3QXZTeW5jOiAlZCIsCisgICAgICAgICAgICAgICAgX19mdW5jX18sIG91dHB1dERldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBod0F2U3luYyk7CisgICAgICAgIHJldHVybiByZXN1bHQ7CisgICAgfQorICAgIHNpbmtDb25maWctPnNhbXBsZV9yYXRlID0gYmVzdFNpbmtDb25maWcuc2FtcGxlX3JhdGU7CisgICAgc2lua0NvbmZpZy0+Y2hhbm5lbF9tYXNrID0gYmVzdFNpbmtDb25maWcuY2hhbm5lbF9tYXNrOworICAgIHNpbmtDb25maWctPmZvcm1hdCA9IGJlc3RTaW5rQ29uZmlnLmZvcm1hdDsKKyAgICAvLyBGb3IgZW5jb2RlZCBzdHJlYW1zIGZvcmNlIGRpcmVjdCBmbGFnIHRvIHByZXZlbnQgZG93bnN0cmVhbSBtaXhpbmcuCisgICAgc2lua0NvbmZpZy0+ZmxhZ3Mub3V0cHV0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KAorICAgICAgICAgICAgc2lua0NvbmZpZy0+ZmxhZ3Mub3V0cHV0IHwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBpZiAoYXVkaW9faXNfaWVjNjE5MzdfY29tcGF0aWJsZShzaW5rQ29uZmlnLT5mb3JtYXQpKSB7CisgICAgICAgIC8vIEZvciBmb3JtYXRzIGNvbXBhdGlibGUgd2l0aCBJRUM2MTkzNyBlbmNhcHN1bGF0aW9uLCBhc3N1bWUgdGhhdAorICAgICAgICAvLyB0aGUgcmVjb3JkIHRocmVhZCBpbnB1dCBmcm9tIE1TRCBpcyBJRUM2MTkzNyBmcmFtZWQgKGZvciBwcm9wb3J0aW9uYWwgYnVmZmVyIHNpemluZykuCisgICAgICAgIC8vIEFkZCB0aGUgQVVESU9fT1VUUFVUX0ZMQUdfSUVDOTU4X05PTkFVRElPIGZsYWcgc28gZG93bnN0cmVhbSBIQUwgY2FuIGRpc3Rpbmd1aXNoIGJldHdlZW4KKyAgICAgICAgLy8gcmF3IGFuZCBJRUM2MTkzNyBmcmFtZWQgc3RyZWFtcy4KKyAgICAgICAgc2lua0NvbmZpZy0+ZmxhZ3Mub3V0cHV0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KAorICAgICAgICAgICAgICAgIHNpbmtDb25maWctPmZsYWdzLm91dHB1dCB8IEFVRElPX09VVFBVVF9GTEFHX0lFQzk1OF9OT05BVURJTyk7CisgICAgfQorICAgIHNvdXJjZUNvbmZpZy0+c2FtcGxlX3JhdGUgPSBiZXN0U2lua0NvbmZpZy5zYW1wbGVfcmF0ZTsKKyAgICAvLyBTcGVjaWZ5IGV4YWN0IGNoYW5uZWwgbWFzayB0byBwcmV2ZW50IGd1ZXNzaW5nIGJ5IGJpdCBjb3VudCBpbiBQYXRjaFBhbmVsLgorICAgIHNvdXJjZUNvbmZpZy0+Y2hhbm5lbF9tYXNrID0gYXVkaW9fY2hhbm5lbF9tYXNrX291dF90b19pbihiZXN0U2lua0NvbmZpZy5jaGFubmVsX21hc2spOworICAgIHNvdXJjZUNvbmZpZy0+Zm9ybWF0ID0gYmVzdFNpbmtDb25maWcuZm9ybWF0OworICAgIC8vIENvcHkgaW5wdXQgc3RyZWFtIGRpcmVjdGx5IHdpdGhvdXQgYW55IHByb2Nlc3NpbmcgKGUuZy4gcmVzYW1wbGluZykuCisgICAgc291cmNlQ29uZmlnLT5mbGFncy5pbnB1dCA9IHN0YXRpY19jYXN0PGF1ZGlvX2lucHV0X2ZsYWdzX3Q+KAorICAgICAgICAgICAgc291cmNlQ29uZmlnLT5mbGFncy5pbnB1dCB8IEFVRElPX0lOUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBpZiAoaHdBdlN5bmMpIHsKKyAgICAgICAgc2lua0NvbmZpZy0+ZmxhZ3Mub3V0cHV0ID0gc3RhdGljX2Nhc3Q8YXVkaW9fb3V0cHV0X2ZsYWdzX3Q+KAorICAgICAgICAgICAgICAgIHNpbmtDb25maWctPmZsYWdzLm91dHB1dCB8IEFVRElPX09VVFBVVF9GTEFHX0hXX0FWX1NZTkMpOworICAgICAgICBzb3VyY2VDb25maWctPmZsYWdzLmlucHV0ID0gc3RhdGljX2Nhc3Q8YXVkaW9faW5wdXRfZmxhZ3NfdD4oCisgICAgICAgICAgICAgICAgc291cmNlQ29uZmlnLT5mbGFncy5pbnB1dCB8IEFVRElPX0lOUFVUX0ZMQUdfSFdfQVZfU1lOQyk7CisgICAgfQorICAgIGNvbnN0IHVuc2lnbmVkIGludCBjb25maWdfbWFzayA9IEFVRElPX1BPUlRfQ09ORklHX1NBTVBMRV9SQVRFIHwKKyAgICAgICAgICAgIEFVRElPX1BPUlRfQ09ORklHX0NIQU5ORUxfTUFTSyB8IEFVRElPX1BPUlRfQ09ORklHX0ZPUk1BVCB8IEFVRElPX1BPUlRfQ09ORklHX0ZMQUdTOworICAgIHNpbmtDb25maWctPmNvbmZpZ19tYXNrIHw9IGNvbmZpZ19tYXNrOworICAgIHNvdXJjZUNvbmZpZy0+Y29uZmlnX21hc2sgfD0gY29uZmlnX21hc2s7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitQYXRjaEJ1aWxkZXIgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpidWlsZE1zZFBhdGNoKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZvdXRwdXREZXZpY2UpIGNvbnN0Cit7CisgICAgUGF0Y2hCdWlsZGVyIHBhdGNoQnVpbGRlcjsKKyAgICBwYXRjaEJ1aWxkZXIuYWRkU291cmNlKGdldE1zZEF1ZGlvSW5EZXZpY2UoKSkuYWRkU2luayhvdXRwdXREZXZpY2UpOworICAgIGF1ZGlvX3BvcnRfY29uZmlnIHNvdXJjZUNvbmZpZyA9IHBhdGNoQnVpbGRlci5wYXRjaCgpLT5zb3VyY2VzWzBdOworICAgIGF1ZGlvX3BvcnRfY29uZmlnIHNpbmtDb25maWcgPSBwYXRjaEJ1aWxkZXIucGF0Y2goKS0+c2lua3NbMF07CisgICAgLy8gVE9ETzogRmlndXJlIG91dCB3aGV0aGVyIE1TRCBtb2R1bGUgaGFzIEhXX0FWX1NZTkMgZmxhZyBzZXQgaW4gdGhlIEFQIGNvbmZpZyBmaWxlLgorICAgIC8vIEZvciBub3csIHdlIGp1c3QgZm9yY2VmdWxseSB0cnkgd2l0aCBId0F2U3luYyBmaXJzdC4KKyAgICBzdGF0dXNfdCByZXMgPSBnZXRCZXN0TXNkQXVkaW9Qcm9maWxlRm9yKG91dHB1dERldmljZSwgdHJ1ZSAvKmh3QXZTeW5jKi8sCisgICAgICAgICAgICAmc291cmNlQ29uZmlnLCAmc2lua0NvbmZpZykgPT0gTk9fRVJST1IgPyBOT19FUlJPUiA6CisgICAgICAgICAgICBnZXRCZXN0TXNkQXVkaW9Qcm9maWxlRm9yKAorICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXZpY2UsIGZhbHNlIC8qaHdBdlN5bmMqLywgJnNvdXJjZUNvbmZpZywgJnNpbmtDb25maWcpOworICAgIGlmIChyZXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gRm91bmQgYSBtYXRjaGluZyBwcm9maWxlIGZvciBlbmNvZGVkIGF1ZGlvLiBSZS1jcmVhdGUgUGF0Y2hCdWlsZGVyIHdpdGggdGhpcyBjb25maWcuCisgICAgICAgIHJldHVybiAoUGF0Y2hCdWlsZGVyKCkpLmFkZFNvdXJjZShzb3VyY2VDb25maWcpLmFkZFNpbmsoc2lua0NvbmZpZyk7CisgICAgfQorICAgIEFMT0dWKCIlcygpIG5vIG1hdGNoaW5nIHByb2ZpbGUgZm91bmQuIEZhbGwgdGhyb3VnaCB0byBkZWZhdWx0IFBDTSBwYXRjaCIKKyAgICAgICAgICAgICIgc3VwcG9ydGluZyBQQ00gZm9ybWF0IGNvbnZlcnNpb24uIiwgX19mdW5jX18pOworICAgIHJldHVybiBwYXRjaEJ1aWxkZXI7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0TXNkUGF0Y2goY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm91dHB1dERldmljZSkgeworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG91dHB1dERldmljZTsKKyAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gVXNlIG1lZGlhIHN0cmF0ZWd5IGZvciB1bnNwZWNpZmllZCBvdXRwdXQgZGV2aWNlLiBUaGlzIHNob3VsZCBvbmx5CisgICAgICAgIC8vIG9jY3VyIG9uIGNoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcygpLiBEZXZpY2UgY29ubmVjdGlvbiBldmVudHMgbWF5CisgICAgICAgIC8vIHRoZXJlZm9yZSBpbnZhbGlkYXRlIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMuCisgICAgICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICAgICAgICAgIGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTUVESUEpLCBudWxscHRyLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihkZXZpY2VzLmlzRW1wdHkoKSwgIm5vIG91dHB1ZGV2aWNlIHRvIHNldCBNc2QgUGF0Y2giKTsKKyAgICAgICAgZGV2aWNlID0gZGV2aWNlcy5pdGVtQXQoMCk7CisgICAgfQorICAgIEFMT0dWKCIlcygpIGZvciBkZXZpY2UgJXMiLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXIgPSBidWlsZE1zZFBhdGNoKGRldmljZSk7CisgICAgY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoKiBwYXRjaCA9IHBhdGNoQnVpbGRlci5wYXRjaCgpOworICAgIGNvbnN0IEF1ZGlvUGF0Y2hDb2xsZWN0aW9uIG1zZFBhdGNoZXMgPSBnZXRNc2RQYXRjaGVzKCk7CisgICAgaWYgKCFtc2RQYXRjaGVzLmlzRW1wdHkoKSkgeworICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1zZFBhdGNoZXMuc2l6ZSgpID4gMSwKKyAgICAgICAgICAgICAgICAiVGhlIGN1cnJlbnQgTVNEIHByb3RvdHlwZSBvbmx5IHN1cHBvcnRzIG9uZSBvdXRwdXQgcGF0Y2giKTsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gY3VycmVudFBhdGNoID0gbXNkUGF0Y2hlcy52YWx1ZUF0KDApOworICAgICAgICBpZiAoYXVkaW9fcGF0Y2hlc19hcmVfZXF1YWwoJmN1cnJlbnRQYXRjaC0+bVBhdGNoLCBwYXRjaCkpIHsKKyAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgfQorICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChjdXJyZW50UGF0Y2gtPmdldEhhbmRsZSgpLCBtVWlkQ2FjaGVkKTsKKyAgICB9CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5zdGFsbFBhdGNoKF9fZnVuY19fLCAtMSAvKmluZGV4Ki8sIG51bGxwdHIgLypwYXRjaEhhbmRsZSovLAorICAgICAgICAgICAgcGF0Y2gsIDAgLypkZWxheU1zKi8sIG1VaWRDYWNoZWQsIG51bGxwdHIgLypwYXRjaERlc2NQdHIqLyk7CisgICAgQUxPR0VfSUYoc3RhdHVzICE9IE5PX0VSUk9SLCAiJXMoKSBlcnJvciAlZCBjcmVhdGluZyBNU0QgYXVkaW8gcGF0Y2giLCBfX2Z1bmNfXywgc3RhdHVzKTsKKyAgICBBTE9HSV9JRihzdGF0dXMgPT0gTk9fRVJST1IsICIlcygpIFBhdGNoIGNyZWF0ZWQgZnJvbSBNU0RfSU4gdG8gIgorICAgICAgICAgICAiZGV2aWNlOiVzIChmb3JtYXQ6JSN4IGNoYW5uZWxzOiUjeCBzYW1wbGVyYXRlOiVkKSIsIF9fZnVuY19fLAorICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBwYXRjaC0+c291cmNlc1swXS5mb3JtYXQsCisgICAgICAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMF0uY2hhbm5lbF9tYXNrLCBwYXRjaC0+c291cmNlc1swXS5zYW1wbGVfcmF0ZSk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZWxlY3RPdXRwdXQoY29uc3QgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlKQoreworICAgIExPR19BTFdBWVNfRkFUQUxfSUYoIShmb3JtYXQgPT0gQVVESU9fRk9STUFUX0lOVkFMSUQgfHwgYXVkaW9faXNfbGluZWFyX3BjbShmb3JtYXQpKSwKKyAgICAgICAgIiVzIGNhbGxlZCB3aXRoIGZvcm1hdCAlI3giLCBfX2Z1bmNfXywgZm9ybWF0KTsKKworICAgIC8vIEZsYWdzIGRpc3F1YWxpZnlpbmcgYW4gb3V0cHV0OiB0aGUgbWF0Y2ggbXVzdCBoYXBwZW4gYmVmb3JlIGNhbGxpbmcgc2VsZWN0T3V0cHV0KCkKKyAgICBzdGF0aWMgY29uc3QgYXVkaW9fb3V0cHV0X2ZsYWdzX3Qga0V4Y2x1ZGVkRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpCisgICAgICAgIChBVURJT19PVVRQVVRfRkxBR19IV19BVl9TWU5DIHwgQVVESU9fT1VUUFVUX0ZMQUdfTU1BUF9OT0lSUSB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisKKyAgICAvLyBGbGFncyBleHByZXNzaW5nIGEgZnVuY3Rpb25hbCByZXF1ZXN0OiBtdXN0IGJlIGhvbm9yZWQgaW4gcHJpb3JpdHkgb3ZlcgorICAgIC8vIG90aGVyIGNyaXRlcmlhCisgICAgc3RhdGljIGNvbnN0IGF1ZGlvX291dHB1dF9mbGFnc190IGtGdW5jdGlvbmFsRmxhZ3MgPSAoYXVkaW9fb3V0cHV0X2ZsYWdzX3QpCisgICAgICAgIChBVURJT19PVVRQVVRfRkxBR19WT0lQX1JYIHwgQVVESU9fT1VUUFVUX0ZMQUdfSU5DQUxMX01VU0lDIHwKKyAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX1RUUyB8IEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVF9QQ00pOworICAgIC8vIEZsYWdzIGV4cHJlc3NpbmcgYSBwZXJmb3JtYW5jZSByZXF1ZXN0OiBoYXZlIGxvd2VyIHByaW9yaXR5IHRoYW4gc2VydmluZworICAgIC8vIHJlcXVlc3RlZCBzYW1wbGluZyByYXRlIG9yIGNoYW5uZWwgbWFzaworICAgIHN0YXRpYyBjb25zdCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBrUGVyZm9ybWFuY2VGbGFncyA9IChhdWRpb19vdXRwdXRfZmxhZ3NfdCkKKyAgICAgICAgKEFVRElPX09VVFBVVF9GTEFHX0ZBU1QgfCBBVURJT19PVVRQVVRfRkxBR19ERUVQX0JVRkZFUiB8CisgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19SQVcgfCBBVURJT19PVVRQVVRfRkxBR19TWU5DKTsKKworICAgIGNvbnN0IGF1ZGlvX291dHB1dF9mbGFnc190IGZ1bmN0aW9uYWxGbGFncyA9CisgICAgICAgIChhdWRpb19vdXRwdXRfZmxhZ3NfdCkoZmxhZ3MgJiBrRnVuY3Rpb25hbEZsYWdzKTsKKyAgICBjb25zdCBhdWRpb19vdXRwdXRfZmxhZ3NfdCBwZXJmb3JtYW5jZUZsYWdzID0KKyAgICAgICAgKGF1ZGlvX291dHB1dF9mbGFnc190KShmbGFncyAmIGtQZXJmb3JtYW5jZUZsYWdzKTsKKworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGJlc3RPdXRwdXQgPSAob3V0cHV0cy5zaXplKCkgPT0gMCkgPyBBVURJT19JT19IQU5ETEVfTk9ORSA6IG91dHB1dHNbMF07CisKKyAgICAvLyBzZWxlY3Qgb25lIG91dHB1dCBhbW9uZyBzZXZlcmFsIHRoYXQgcHJvdmlkZSBhIHBhdGggdG8gYSBwYXJ0aWN1bGFyIGRldmljZSBvciBzZXQgb2YKKyAgICAvLyBkZXZpY2VzICh0aGUgbGlzdCB3YXMgcHJldmlvdXNseSBidWlsZCBieSBnZXRPdXRwdXRzRm9yRGV2aWNlcygpKS4KKyAgICAvLyBUaGUgcHJpb3JpdHkgaXMgYXMgZm9sbG93czoKKyAgICAvLyAxOiB0aGUgb3V0cHV0IHN1cHBvcnRpbmcgaGFwdGljIHBsYXliYWNrIHdoZW4gcmVxdWVzdGluZyBoYXB0aWMgcGxheWJhY2sKKyAgICAvLyAyOiB0aGUgb3V0cHV0IHdpdGggdGhlIGhpZ2hlc3QgbnVtYmVyIG9mIHJlcXVlc3RlZCBmdW5jdGlvbmFsIGZsYWdzCisgICAgLy8gMzogdGhlIG91dHB1dCBzdXBwb3J0aW5nIHRoZSBleGFjdCBjaGFubmVsIG1hc2sKKyAgICAvLyA0OiB0aGUgb3V0cHV0IHdpdGggYSBoaWdoZXIgY2hhbm5lbCBjb3VudCB0aGFuIHJlcXVlc3RlZAorICAgIC8vIDU6IHRoZSBvdXRwdXQgd2l0aCBhIGhpZ2hlciBzYW1wbGluZyByYXRlIHRoYW4gcmVxdWVzdGVkCisgICAgLy8gNjogdGhlIG91dHB1dCB3aXRoIHRoZSBoaWdoZXN0IG51bWJlciBvZiByZXF1ZXN0ZWQgcGVyZm9ybWFuY2UgZmxhZ3MKKyAgICAvLyA3OiB0aGUgb3V0cHV0IHdpdGggdGhlIGJpdCBkZXB0aCB0aGUgY2xvc2VzdCB0byB0aGUgcmVxdWVzdGVkIG9uZQorICAgIC8vIDg6IHRoZSBwcmltYXJ5IG91dHB1dAorICAgIC8vIDk6IHRoZSBmaXJzdCBvdXRwdXQgaW4gdGhlIGxpc3QKKworICAgIC8vIG1hdGNoaW5nIGNyaXRlcmlhIHZhbHVlcyBpbiBwcmlvcml0eSBvcmRlciBmb3IgYmVzdCBtYXRjaGluZyBvdXRwdXQgc28gZmFyCisgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGJlc3RNYXRjaENyaXRlcmlhKDgsIDApOworCisgICAgY29uc3QgdWludDMyX3QgY2hhbm5lbENvdW50ID0gYXVkaW9fY2hhbm5lbF9jb3VudF9mcm9tX291dF9tYXNrKGNoYW5uZWxNYXNrKTsKKyAgICBjb25zdCB1aW50MzJfdCBoYXB0aWNDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soCisgICAgICAgIGNoYW5uZWxNYXNrICYgQVVESU9fQ0hBTk5FTF9IQVBUSUNfQUxMKTsKKworICAgIGZvciAoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0IDogb3V0cHV0cykgeworICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7CisgICAgICAgIC8vIG1hdGNoaW5nIGNyaXRlcmlhIHZhbHVlcyBpbiBwcmlvcml0eSBvcmRlciBmb3IgY3VycmVudCBvdXRwdXQKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IGN1cnJlbnRNYXRjaENyaXRlcmlhKDgsIDApOworCisgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChrRXhjbHVkZWRGbGFncyAmIG91dHB1dERlc2MtPm1GbGFncykgIT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiBoYXB0aWMgY2hhbm5lbCBpcyBzcGVjaWZpZWQsIHVzZSB0aGUgaGFwdGljIG91dHB1dCBpZiBwcmVzZW50LgorICAgICAgICAvLyBXaGVuIHVzaW5nIGhhcHRpYyBvdXRwdXQsIHNhbWUgYXVkaW8gZm9ybWF0IGFuZCBzYW1wbGUgcmF0ZSBhcmUgcmVxdWlyZWQuCisgICAgICAgIGNvbnN0IHVpbnQzMl90IG91dHB1dEhhcHRpY0NoYW5uZWxDb3VudCA9IGF1ZGlvX2NoYW5uZWxfY291bnRfZnJvbV9vdXRfbWFzaygKKyAgICAgICAgICAgIG91dHB1dERlc2MtPmdldENoYW5uZWxNYXNrKCkgJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpOworICAgICAgICBpZiAoKGhhcHRpY0NoYW5uZWxDb3VudCA9PSAwKSAhPSAob3V0cHV0SGFwdGljQ2hhbm5lbENvdW50ID09IDApKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAob3V0cHV0SGFwdGljQ2hhbm5lbENvdW50ID49IGhhcHRpY0NoYW5uZWxDb3VudAorICAgICAgICAgICAgJiYgZm9ybWF0ID09IG91dHB1dERlc2MtPmdldEZvcm1hdCgpCisgICAgICAgICAgICAmJiBzYW1wbGluZ1JhdGUgPT0gb3V0cHV0RGVzYy0+Z2V0U2FtcGxpbmdSYXRlKCkpIHsKKyAgICAgICAgICAgICAgICBjdXJyZW50TWF0Y2hDcml0ZXJpYVswXSA9IG91dHB1dEhhcHRpY0NoYW5uZWxDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZ1bmN0aW9uYWwgZmxhZ3MgbWF0Y2gKKyAgICAgICAgY3VycmVudE1hdGNoQ3JpdGVyaWFbMV0gPSBwb3Bjb3VudChvdXRwdXREZXNjLT5tRmxhZ3MgJiBmdW5jdGlvbmFsRmxhZ3MpOworCisgICAgICAgIC8vIGNoYW5uZWwgbWFzayBhbmQgY2hhbm5lbCBjb3VudCBtYXRjaAorICAgICAgICB1aW50MzJfdCBvdXRwdXRDaGFubmVsQ291bnQgPSBhdWRpb19jaGFubmVsX2NvdW50X2Zyb21fb3V0X21hc2soCisgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+Z2V0Q2hhbm5lbE1hc2soKSk7CisgICAgICAgIGlmIChjaGFubmVsTWFzayAhPSBBVURJT19DSEFOTkVMX05PTkUgJiYgY2hhbm5lbENvdW50ID4gMiAmJgorICAgICAgICAgICAgY2hhbm5lbENvdW50IDw9IG91dHB1dENoYW5uZWxDb3VudCkgeworICAgICAgICAgICAgaWYgKChhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKGNoYW5uZWxNYXNrKSA9PQorICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfZ2V0X3JlcHJlc2VudGF0aW9uKG91dHB1dERlc2MtPmdldENoYW5uZWxNYXNrKCkpKSAmJgorICAgICAgICAgICAgICAgICAgICAoKGNoYW5uZWxNYXNrICYgb3V0cHV0RGVzYy0+Z2V0Q2hhbm5lbE1hc2soKSkgPT0gY2hhbm5lbE1hc2spKSB7CisgICAgICAgICAgICAgICAgY3VycmVudE1hdGNoQ3JpdGVyaWFbMl0gPSBvdXRwdXRDaGFubmVsQ291bnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjdXJyZW50TWF0Y2hDcml0ZXJpYVszXSA9IG91dHB1dENoYW5uZWxDb3VudDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNhbXBsaW5nIHJhdGUgbWF0Y2gKKyAgICAgICAgaWYgKHNhbXBsaW5nUmF0ZSA+IFNBTVBMRV9SQVRFX0haX0RFRkFVTFQgJiYKKyAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUgPD0gb3V0cHV0RGVzYy0+Z2V0U2FtcGxpbmdSYXRlKCkpIHsKKyAgICAgICAgICAgIGN1cnJlbnRNYXRjaENyaXRlcmlhWzRdID0gb3V0cHV0RGVzYy0+Z2V0U2FtcGxpbmdSYXRlKCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwZXJmb3JtYW5jZSBmbGFncyBtYXRjaAorICAgICAgICBjdXJyZW50TWF0Y2hDcml0ZXJpYVs1XSA9IHBvcGNvdW50KG91dHB1dERlc2MtPm1GbGFncyAmIHBlcmZvcm1hbmNlRmxhZ3MpOworCisgICAgICAgIC8vIGZvcm1hdCBtYXRjaAorICAgICAgICBpZiAoZm9ybWF0ICE9IEFVRElPX0ZPUk1BVF9JTlZBTElEKSB7CisgICAgICAgICAgICBjdXJyZW50TWF0Y2hDcml0ZXJpYVs2XSA9CisgICAgICAgICAgICAgICAgUG9saWN5QXVkaW9Qb3J0OjprRm9ybWF0RGlzdGFuY2VNYXggLQorICAgICAgICAgICAgICAgIFBvbGljeUF1ZGlvUG9ydDo6Zm9ybWF0RGlzdGFuY2UoZm9ybWF0LCBvdXRwdXREZXNjLT5nZXRGb3JtYXQoKSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBwcmltYXJ5IG91dHB1dCBtYXRjaAorICAgICAgICBjdXJyZW50TWF0Y2hDcml0ZXJpYVs3XSA9IG91dHB1dERlc2MtPm1GbGFncyAmIEFVRElPX09VVFBVVF9GTEFHX1BSSU1BUlk7CisKKyAgICAgICAgLy8gY29tcGFyZSBtYXRjaCBjcml0ZXJpYSBieSBwcmlvcml0eSB0aGVuIHZhbHVlCisgICAgICAgIGlmIChzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKGJlc3RNYXRjaENyaXRlcmlhLmJlZ2luKCksIGJlc3RNYXRjaENyaXRlcmlhLmVuZCgpLAorICAgICAgICAgICAgICAgIGN1cnJlbnRNYXRjaENyaXRlcmlhLmJlZ2luKCksIGN1cnJlbnRNYXRjaENyaXRlcmlhLmVuZCgpKSkgeworICAgICAgICAgICAgYmVzdE1hdGNoQ3JpdGVyaWEgPSBjdXJyZW50TWF0Y2hDcml0ZXJpYTsKKyAgICAgICAgICAgIGJlc3RPdXRwdXQgPSBvdXRwdXQ7CisKKyAgICAgICAgICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHJlc3VsdDsKKyAgICAgICAgICAgIHN0ZDo6Y29weShiZXN0TWF0Y2hDcml0ZXJpYS5iZWdpbigpLCBiZXN0TWF0Y2hDcml0ZXJpYS5lbmQoKSwKKyAgICAgICAgICAgICAgICBzdGQ6Om9zdHJlYW1faXRlcmF0b3I8aW50PihyZXN1bHQsICIgIikpOworICAgICAgICAgICAgQUxPR1YoIiVzIG5ldyBiZXN0T3V0cHV0ICVkIGNyaXRlcmlhICVzIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgYmVzdE91dHB1dCwgcmVzdWx0LnN0cigpLmNfc3RyKCkpOworICAgICAgICB9CiAgICAgfQogCi0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKKyAgICByZXR1cm4gYmVzdE91dHB1dDsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKK3sKKyAgICBBTE9HVigiJXMgcG9ydElkICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOworCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy5nZXRPdXRwdXRGb3JDbGllbnQocG9ydElkKTsKKyAgICBpZiAob3V0cHV0RGVzYyA9PSAwKSB7CisgICAgICAgIEFMT0dXKCJzdGFydE91dHB1dCgpIG5vIG91dHB1dCBmb3IgY2xpZW50ICVkIiwgcG9ydElkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3A8VHJhY2tDbGllbnREZXNjcmlwdG9yPiBjbGllbnQgPSBvdXRwdXREZXNjLT5nZXRDbGllbnQocG9ydElkKTsKKworICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIG91dHB1dCAlZCwgc3RyZWFtICVkLCBzZXNzaW9uICVkIiwKKyAgICAgICAgICBvdXRwdXREZXNjLT5tSW9IYW5kbGUsIGNsaWVudC0+c3RyZWFtKCksIGNsaWVudC0+c2Vzc2lvbigpKTsKIAogICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dERlc2MtPnN0YXJ0KCk7CiAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KIAotICAgIC8vIFJvdXRpbmc/Ci0gICAgbU91dHB1dFJvdXRlcy5pbmNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOwotCi0gICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZTsKLSAgICBBdWRpb01peCAqcG9saWN5TWl4ID0gTlVMTDsKLSAgICBjb25zdCBjaGFyICphZGRyZXNzID0gTlVMTDsKLSAgICBpZiAob3V0cHV0RGVzYy0+bVBvbGljeU1peCAhPSBOVUxMKSB7Ci0gICAgICAgIHBvbGljeU1peCA9IG91dHB1dERlc2MtPm1Qb2xpY3lNaXg7Ci0gICAgICAgIGFkZHJlc3MgPSBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzLnN0cmluZygpOwotICAgICAgICBpZiAoKHBvbGljeU1peC0+bVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19SRU5ERVIpID09IE1JWF9ST1VURV9GTEFHX1JFTkRFUikgewotICAgICAgICAgICAgbmV3RGV2aWNlID0gcG9saWN5TWl4LT5tRGV2aWNlVHlwZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ld0RldmljZSA9IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDsKLSAgICAgICAgfQotICAgIH0gZWxzZSBpZiAobU91dHB1dFJvdXRlcy5nZXRBbmRDbGVhclJvdXRlQ2hhbmdlZChzZXNzaW9uKSkgewotICAgICAgICBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIGlmIChuZXdEZXZpY2UgIT0gb3V0cHV0RGVzYy0+ZGV2aWNlKCkpIHsKLSAgICAgICAgICAgIGNoZWNrU3RyYXRlZ3lSb3V0ZShnZXRTdHJhdGVneShzdHJlYW0pLCBvdXRwdXQpOwotICAgICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICAgbmV3RGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7Ci0gICAgfQotCi0gICAgdWludDMyX3QgZGVsYXlNcyA9IDA7Ci0KLSAgICBzdGF0dXMgPSBzdGFydFNvdXJjZShvdXRwdXREZXNjLCBzdHJlYW0sIG5ld0RldmljZSwgYWRkcmVzcywgJmRlbGF5TXMpOworICAgIHVpbnQzMl90IGRlbGF5TXM7CisgICAgc3RhdHVzID0gc3RhcnRTb3VyY2Uob3V0cHV0RGVzYywgY2xpZW50LCAmZGVsYXlNcyk7CiAKICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgIG1PdXRwdXRSb3V0ZXMuZGVjUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKICAgICAgICAgb3V0cHV0RGVzYy0+c3RvcCgpOwogICAgICAgICByZXR1cm4gc3RhdHVzOwogICAgIH0KLSAgICAvLyBBdXRvbWF0aWNhbGx5IGVuYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBpbnB1dCB3aGVuIG91dHB1dCBpcyBzdGFydGVkIG9uIGEgcmUgcm91dGluZyBtaXgKLSAgICAvLyBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUwotICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShuZXdEZXZpY2UpICYmIHBvbGljeU1peCAhPSBOVUxMICYmCi0gICAgICAgICAgICBwb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgewotICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAotICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgInJlbW90ZS1zdWJtaXgiKTsKLSAgICB9Ci0KICAgICBpZiAoZGVsYXlNcyAhPSAwKSB7CiAgICAgICAgIHVzbGVlcChkZWxheU1zICogMTAwMCk7CiAgICAgfQpAQCAtMTIwNiwxOSArMTU3NywyMiBAQAogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRTb3VyY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqZGVsYXlNcykKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRTb3VyY2UoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxUcmFja0NsaWVudERlc2NyaXB0b3I+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpkZWxheU1zKQogewogICAgIC8vIGNhbm5vdCBzdGFydCBwbGF5YmFjayBvZiBTVFJFQU1fVFRTIGlmIGFueSBvdGhlciBvdXRwdXQgaXMgYmVpbmcgdXNlZAogICAgIHVpbnQzMl90IGJlYWNvbk11dGVMYXRlbmN5ID0gMDsKIAogICAgICpkZWxheU1zID0gMDsKKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IGNsaWVudC0+c3RyZWFtKCk7CisgICAgYXV0byBjbGllbnRWb2xTcmMgPSBjbGllbnQtPnZvbHVtZVNvdXJjZSgpOworICAgIGF1dG8gY2xpZW50U3RyYXRlZ3kgPSBjbGllbnQtPnN0cmF0ZWd5KCk7CisgICAgYXV0byBjbGllbnRBdHRyID0gY2xpZW50LT5hdHRyaWJ1dGVzKCk7CiAgICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVFRTKSB7CiAgICAgICAgIEFMT0dWKCJcdCBmb3VuZCBCRUFDT04gc3RyZWFtIik7Ci0gICAgICAgIGlmICghbVR0c091dHB1dEF2YWlsYWJsZSAmJiBtT3V0cHV0cy5pc0FueU91dHB1dEFjdGl2ZShBVURJT19TVFJFQU1fVFRTIC8qc3RyZWFtVG9JZ25vcmUqLykpIHsKKyAgICAgICAgaWYgKCFtVHRzT3V0cHV0QXZhaWxhYmxlICYmIG1PdXRwdXRzLmlzQW55T3V0cHV0QWN0aXZlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1RUUykgLypzb3VyY2VUb0lnbm9yZSovKSkgewogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgYmVhY29uTXV0ZUxhdGVuY3kgPSBoYW5kbGVFdmVudEZvckJlYWNvbihTVEFSVElOR19CRUFDT04pOwpAQCAtMTIzMyw2ICsxNjA3LDIzIEBACiAgICAgYm9vbCBmb3JjZSA9ICFvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmCiAgICAgICAgICAgICAob3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSA9PSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSk7CiAKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlczsKKyAgICBzcDxBdWRpb1BvbGljeU1peD4gcG9saWN5TWl4ID0gb3V0cHV0RGVzYy0+bVBvbGljeU1peC5wcm9tb3RlKCk7CisgICAgY29uc3QgY2hhciAqYWRkcmVzcyA9IE5VTEw7CisgICAgaWYgKHBvbGljeU1peCAhPSBOVUxMKSB7CisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2VUeXBlOworICAgICAgICBhZGRyZXNzID0gcG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcy5zdHJpbmcoKTsKKyAgICAgICAgaWYgKChwb2xpY3lNaXgtPm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSA9PSBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spIHsKKyAgICAgICAgICAgIG5ld0RldmljZVR5cGUgPSBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBuZXdEZXZpY2VUeXBlID0gcG9saWN5TWl4LT5tRGV2aWNlVHlwZTsKKyAgICAgICAgfQorICAgICAgICBzcCBkZXZpY2UgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2UobmV3RGV2aWNlVHlwZSwgU3RyaW5nOChhZGRyZXNzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICBBTE9HX0FTU0VSVChkZXZpY2UsICIlczogbm8gZGV2aWNlIGZvdW5kIHQ9JXUsIGE9JXMiLCBfX2Z1bmNfXywgbmV3RGV2aWNlVHlwZSwgYWRkcmVzcyk7CisgICAgICAgIGRldmljZXMuYWRkKGRldmljZSk7CisgICAgfQorCiAgICAgLy8gcmVxdWlyZXNNdXRlQ2hlY2sgaXMgZmFsc2Ugd2hlbiB3ZSBjYW4gYnlwYXNzIG11dGUgc3RyYXRlZ3kuCiAgICAgLy8gSXQgY292ZXJzIGEgY29tbW9uIGNhc2Ugd2hlbiB0aGVyZSBpcyBubyBtYXRlcmlhbGx5IGFjdGl2ZSBhdWRpbwogICAgIC8vIGFuZCBtdXRpbmcgd291bGQgcmVzdWx0IGluIHVubmVjZXNzYXJ5IGRlbGF5IGFuZCBkcm9wcGVkIGF1ZGlvLgpAQCAtMTI0MiwzMSArMTYzMyw0NCBAQAogICAgIC8vIGluY3JlbWVudCB1c2FnZSBjb3VudCBmb3IgdGhpcyBzdHJlYW0gb24gdGhlIHJlcXVlc3RlZCBvdXRwdXQ6CiAgICAgLy8gTk9URSB0aGF0IHRoZSB1c2FnZSBjb3VudCBpcyB0aGUgc2FtZSBmb3IgZHVwbGljYXRlZCBvdXRwdXQgYW5kIGhhcmR3YXJlIG91dHB1dCB3aGljaCBpcwogICAgIC8vIG5lY2Vzc2FyeSBmb3IgYSBjb3JyZWN0IGNvbnRyb2wgb2YgaGFyZHdhcmUgb3V0cHV0IHJvdXRpbmcgYnkgc3RhcnRPdXRwdXQoKSBhbmQgc3RvcE91dHB1dCgpCi0gICAgb3V0cHV0RGVzYy0+Y2hhbmdlUmVmQ291bnQoc3RyZWFtLCAxKTsKKyAgICBvdXRwdXREZXNjLT5zZXRDbGllbnRBY3RpdmUoY2xpZW50LCB0cnVlKTsKIAotICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDKSB7CisgICAgaWYgKGNsaWVudC0+aGFzUHJlZmVycmVkRGV2aWNlKHRydWUpKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5jbGllbnRzTGlzdCh0cnVlIC8qYWN0aXZlT25seSovKS5zaXplKCkgPT0gMSAmJgorICAgICAgICAgICAgICAgIGNsaWVudC0+aXNQcmVmZXJyZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UoKSkgeworICAgICAgICAgICAgLy8gUHJlZmVycmVkIGRldmljZSBtYXkgYmUgZXhjbHVzaXZlLCB1c2Ugb25seSBpZiBubyBvdGhlciBhY3RpdmUgY2xpZW50cyBvbiB0aGlzIG91dHB1dAorICAgICAgICAgICAgZGV2aWNlcyA9IERldmljZVZlY3RvcigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChjbGllbnQtPnByZWZlcnJlZERldmljZUlkKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICB9CisgICAgICAgIGlmIChkZXZpY2VzICE9IG91dHB1dERlc2MtPmRldmljZXMoKSkgeworICAgICAgICAgICAgY2hlY2tTdHJhdGVneVJvdXRlKGNsaWVudFN0cmF0ZWd5LCBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGZvbGxvd3NTYW1lUm91dGluZyhjbGllbnRBdHRyLCBhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKSkpIHsKICAgICAgICAgc2VsZWN0T3V0cHV0Rm9yTXVzaWNFZmZlY3RzKCk7CiAgICAgfQogCi0gICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID09IDEgfHwgZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7CisgICAgaWYgKG91dHB1dERlc2MtPmdldEFjdGl2aXR5Q291bnQoY2xpZW50Vm9sU3JjKSA9PSAxIHx8ICFkZXZpY2VzLmlzRW1wdHkoKSkgewogICAgICAgICAvLyBzdGFydGluZyBhbiBvdXRwdXQgYmVpbmcgcmVyb3V0ZWQ/Ci0gICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKLSAgICAgICAgICAgIGRldmljZSA9IGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKKyAgICAgICAgaWYgKGRldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBkZXZpY2VzID0gZ2V0TmV3T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKICAgICAgICAgfQotCi0gICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOwotICAgICAgICBib29sIHNob3VsZFdhaXQgPSAoc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdHJhdGVneSA9PSBTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCkgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYmVhY29uTXV0ZUxhdGVuY3kgPiAwKTsKKyAgICAgICAgYm9vbCBzaG91bGRXYWl0ID0KKyAgICAgICAgICAgIChmb2xsb3dzU2FtZVJvdXRpbmcoY2xpZW50QXR0ciwgYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9BTEFSTSkpIHx8CisgICAgICAgICAgICAgZm9sbG93c1NhbWVSb3V0aW5nKGNsaWVudEF0dHIsIGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OKSkgfHwKKyAgICAgICAgICAgICAoYmVhY29uTXV0ZUxhdGVuY3kgPiAwKSk7CiAgICAgICAgIHVpbnQzMl90IHdhaXRNcyA9IGJlYWNvbk11dGVMYXRlbmN5OwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwogICAgICAgICAgICAgaWYgKGRlc2MgIT0gb3V0cHV0RGVzYykgewogICAgICAgICAgICAgICAgIC8vIEFuIG91dHB1dCBoYXMgYSBzaGFyZWQgZGV2aWNlIGlmCiAgICAgICAgICAgICAgICAgLy8gLSBtYW5hZ2VkIGJ5IHRoZSBzYW1lIGh3IG1vZHVsZQogICAgICAgICAgICAgICAgIC8vIC0gc3VwcG9ydHMgdGhlIGN1cnJlbnRseSBzZWxlY3RlZCBkZXZpY2UKICAgICAgICAgICAgICAgICBjb25zdCBib29sIHNoYXJlZERldmljZSA9IG91dHB1dERlc2MtPnNoYXJlc0h3TW9kdWxlV2l0aChkZXNjKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSAmIGRldmljZSkgIT0gQVVESU9fREVWSUNFX05PTkU7CisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIWRlc2MtPmZpbHRlclN1cHBvcnRlZERldmljZXMoZGV2aWNlcykuaXNFbXB0eSgpKTsKIAogICAgICAgICAgICAgICAgIC8vIGZvcmNlIGEgZGV2aWNlIGNoYW5nZSBpZiBhbnkgb3RoZXIgb3V0cHV0IGlzOgogICAgICAgICAgICAgICAgIC8vIC0gbWFuYWdlZCBieSB0aGUgc2FtZSBodyBtb2R1bGUKQEAgLTEyNzYsNyArMTY4MCw3IEBACiAgICAgICAgICAgICAgICAgLy8gSW4gdGhpcyBjYXNlLCB0aGUgYXVkaW8gSEFMIG11c3QgcmVjZWl2ZSB0aGUgbmV3IGRldmljZSBzZWxlY3Rpb24gc28gdGhhdCBpdCBjYW4KICAgICAgICAgICAgICAgICAvLyBjaGFuZ2UgdGhlIGRldmljZSBjdXJyZW50bHkgc2VsZWN0ZWQgYnkgdGhlIG90aGVyIG91dHB1dC4KICAgICAgICAgICAgICAgICBpZiAoc2hhcmVkRGV2aWNlICYmCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5kZXZpY2UoKSAhPSBkZXZpY2UgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmRldmljZXMoKSAhPSBkZXZpY2VzICYmCiAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5nZXRQYXRjaEhhbmRsZSgpICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7CiAgICAgICAgICAgICAgICAgICAgIGZvcmNlID0gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CkBAIC0xMjk5LDI1ICsxNzAzLDIxIEBACiAgICAgICAgIH0KIAogICAgICAgICBjb25zdCB1aW50MzJfdCBtdXRlV2FpdE1zID0KLSAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZGV2aWNlLCBmb3JjZSwgMCwgTlVMTCwgYWRkcmVzcywgcmVxdWlyZXNNdXRlQ2hlY2spOwotCi0gICAgICAgIC8vIGhhbmRsZSBzcGVjaWFsIGNhc2UgZm9yIHNvbmlmaWNhdGlvbiB3aGlsZSBpbiBjYWxsCi0gICAgICAgIGlmIChpc0luQ2FsbCgpKSB7Ci0gICAgICAgICAgICBoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oc3RyZWFtLCB0cnVlLCBmYWxzZSk7Ci0gICAgICAgIH0KKyAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIGRldmljZXMsIGZvcmNlLCAwLCBOVUxMLCByZXF1aXJlc011dGVDaGVjayk7CiAKICAgICAgICAgLy8gYXBwbHkgdm9sdW1lIHJ1bGVzIGZvciBjdXJyZW50IHN0cmVhbSBhbmQgZGV2aWNlIGlmIG5lY2Vzc2FyeQotICAgICAgICBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4KHN0cmVhbSwgb3V0cHV0RGVzYy0+ZGV2aWNlKCkpLAorICAgICAgICBhdXRvICZjdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXMoY2xpZW50LT5hdHRyaWJ1dGVzKCkpOworICAgICAgICBjaGVja0FuZFNldFZvbHVtZShjdXJ2ZXMsIGNsaWVudC0+dm9sdW1lU291cmNlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlcy5nZXRWb2x1bWVJbmRleChvdXRwdXREZXNjLT5kZXZpY2VzKCkudHlwZXMoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+ZGV2aWNlcygpLnR5cGVzKCkpOwogCiAgICAgICAgIC8vIHVwZGF0ZSB0aGUgb3V0cHV0cyBpZiBzdGFydGluZyBhbiBvdXRwdXQgd2l0aCBhIHN0cmVhbSB0aGF0IGNhbiBhZmZlY3Qgbm90aWZpY2F0aW9uCiAgICAgICAgIC8vIHJvdXRpbmcKICAgICAgICAgaGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShzdHJlYW0pOwogCiAgICAgICAgIC8vIGZvcmNlIHJlZXZhbHVhdGluZyBhY2Nlc3NpYmlsaXR5IHJvdXRpbmcgd2hlbiByaW5ndG9uZSBvciBhbGFybSBzdGFydHMKLSAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgeworICAgICAgICBpZiAoZm9sbG93c1NhbWVSb3V0aW5nKGNsaWVudEF0dHIsIGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfQUxBUk0pKSkgewogICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFkpOwogICAgICAgICB9CiAKQEAgLTEzMzUsNTcgKzE3MzUsNDAgQEAKICAgICB9CiAKICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFICYmCi0gICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgewotICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCB0cnVlLCBvdXRwdXREZXNjKTsKKyAgICAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKAorICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgeworICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyZWFtVG9TdHJhdGVneShBVURJT19TVFJFQU1fQUxBUk0pLCB0cnVlLCBvdXRwdXREZXNjKTsKICAgICB9CiAKLSAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFICYmCi0gICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkgewotICAgICAgICBzZXRTdHJhdGVneU11dGUoU1RSQVRFR1lfU09OSUZJQ0FUSU9OLCB0cnVlLCBvdXRwdXREZXNjKTsKKyAgICAvLyBBdXRvbWF0aWNhbGx5IGVuYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBpbnB1dCB3aGVuIG91dHB1dCBpcyBzdGFydGVkIG9uIGEgcmUgcm91dGluZyBtaXgKKyAgICAvLyBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUworICAgIGlmIChpc1NpbmdsZURldmljZVR5cGUoZGV2aWNlcy50eXBlcygpLCAmYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UpICYmCisgICAgICAgIHBvbGljeU1peCAhPSBOVUxMICYmIHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7CisgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdGUtc3VibWl4IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICB9CiAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIEFMT0dWKCJzdG9wT3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLCBvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkob3V0cHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdG9wT3V0cHV0KCkgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgIEFMT0dWKCIlcyBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisKKyAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLmdldE91dHB1dEZvckNsaWVudChwb3J0SWQpOworICAgIGlmIChvdXRwdXREZXNjID09IDApIHsKKyAgICAgICAgQUxPR1coInN0b3BPdXRwdXQoKSBubyBvdXRwdXQgZm9yIGNsaWVudCAlZCIsIHBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorICAgIHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4gY2xpZW50ID0gb3V0cHV0RGVzYy0+Z2V0Q2xpZW50KHBvcnRJZCk7CiAKLSAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaW5kZXgpOworICAgIEFMT0dWKCJzdG9wT3V0cHV0KCkgb3V0cHV0ICVkLCBzdHJlYW0gJWQsIHNlc3Npb24gJWQiLAorICAgICAgICAgIG91dHB1dERlc2MtPm1Jb0hhbmRsZSwgY2xpZW50LT5zdHJlYW0oKSwgY2xpZW50LT5zZXNzaW9uKCkpOwogCi0gICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID09IDEpIHsKLSAgICAgICAgLy8gQXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0b3BwZWQgb24gYQotICAgICAgICAvLyByZSByb3V0aW5nIG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUwotICAgICAgICBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2Uob3V0cHV0RGVzYy0+bURldmljZSkgJiYKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwgJiYKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tUG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9SRUNPUkRFUlMpIHsKLSAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICJyZW1vdGUtc3VibWl4Iik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBSb3V0aW5nPwotICAgIGJvb2wgZm9yY2VEZXZpY2VVcGRhdGUgPSBmYWxzZTsKLSAgICBpZiAob3V0cHV0RGVzYy0+bVJlZkNvdW50W3N0cmVhbV0gPiAwKSB7Ci0gICAgICAgIGludCBhY3Rpdml0eUNvdW50ID0gbU91dHB1dFJvdXRlcy5kZWNSb3V0ZUFjdGl2aXR5KHNlc3Npb24pOwotICAgICAgICBmb3JjZURldmljZVVwZGF0ZSA9IChtT3V0cHV0Um91dGVzLmhhc1JvdXRlKHNlc3Npb24pICYmIChhY3Rpdml0eUNvdW50ID09IDApKTsKLQotICAgICAgICBpZiAoZm9yY2VEZXZpY2VVcGRhdGUpIHsKLSAgICAgICAgICAgIGNoZWNrU3RyYXRlZ3lSb3V0ZShnZXRTdHJhdGVneShzdHJlYW0pLCBBVURJT19JT19IQU5ETEVfTk9ORSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0dXNfdCBzdGF0dXMgPSBzdG9wU291cmNlKG91dHB1dERlc2MsIHN0cmVhbSwgZm9yY2VEZXZpY2VVcGRhdGUpOworICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BTb3VyY2Uob3V0cHV0RGVzYywgY2xpZW50KTsKIAogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgKSB7CiAgICAgICAgIG91dHB1dERlc2MtPnN0b3AoKTsKQEAgLTEzOTMsNTIgKzE3NzYsNjcgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BTb3VyY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2VEZXZpY2VVcGRhdGUpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0b3BTb3VyY2UoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCkKIHsKICAgICAvLyBhbHdheXMgaGFuZGxlIHN0cmVhbSBzdG9wLCBjaGVjayB3aGljaCBzdHJlYW0gdHlwZSBpcyBzdG9wcGluZworICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gY2xpZW50LT5zdHJlYW0oKTsKKyAgICBhdXRvIGNsaWVudFZvbFNyYyA9IGNsaWVudC0+dm9sdW1lU291cmNlKCk7CisKICAgICBoYW5kbGVFdmVudEZvckJlYWNvbihzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1RUUyA/IFNUT1BQSU5HX0JFQUNPTiA6IFNUT1BQSU5HX09VVFBVVCk7CiAKLSAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlIGZvciBzb25pZmljYXRpb24gd2hpbGUgaW4gY2FsbAotICAgIGlmIChpc0luQ2FsbCgpKSB7Ci0gICAgICAgIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihzdHJlYW0sIGZhbHNlLCBmYWxzZSk7Ci0gICAgfQorICAgIGlmIChvdXRwdXREZXNjLT5nZXRBY3Rpdml0eUNvdW50KGNsaWVudFZvbFNyYykgPiAwKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5nZXRBY3Rpdml0eUNvdW50KGNsaWVudFZvbFNyYykgPT0gMSkgeworICAgICAgICAgICAgLy8gQXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IGlucHV0IHdoZW4gb3V0cHV0IGlzIHN0b3BwZWQgb24gYQorICAgICAgICAgICAgLy8gcmUgcm91dGluZyBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKKyAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBvdXRwdXREZXNjLT5tUG9saWN5TWl4LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChpc1NpbmdsZURldmljZVR5cGUoCisgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpLCAmYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UpICYmCisgICAgICAgICAgICAgICAgcG9saWN5TWl4ICE9IE5VTEwgJiYKKyAgICAgICAgICAgICAgICBwb2xpY3lNaXgtPm1NaXhUeXBlID09IE1JWF9UWVBFX1JFQ09SREVSUykgeworICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbW90ZS1zdWJtaXgiLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSA9IGZhbHNlOworICAgICAgICBpZiAoY2xpZW50LT5oYXNQcmVmZXJyZWREZXZpY2UodHJ1ZSkpIHsKKyAgICAgICAgICAgIGNoZWNrU3RyYXRlZ3lSb3V0ZShjbGllbnQtPnN0cmF0ZWd5KCksIEFVRElPX0lPX0hBTkRMRV9OT05FKTsKKyAgICAgICAgICAgIGZvcmNlRGV2aWNlVXBkYXRlID0gdHJ1ZTsKKyAgICAgICAgfQogCi0gICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dID4gMCkgewogICAgICAgICAvLyBkZWNyZW1lbnQgdXNhZ2UgY291bnQgb2YgdGhpcyBzdHJlYW0gb24gdGhlIG91dHB1dAotICAgICAgICBvdXRwdXREZXNjLT5jaGFuZ2VSZWZDb3VudChzdHJlYW0sIC0xKTsKKyAgICAgICAgb3V0cHV0RGVzYy0+c2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgZmFsc2UpOwogCiAgICAgICAgIC8vIHN0b3JlIHRpbWUgYXQgd2hpY2ggdGhlIHN0cmVhbSB3YXMgc3RvcHBlZCAtIHNlZSBpc1N0cmVhbUFjdGl2ZSgpCi0gICAgICAgIGlmIChvdXRwdXREZXNjLT5tUmVmQ291bnRbc3RyZWFtXSA9PSAwIHx8IGZvcmNlRGV2aWNlVXBkYXRlKSB7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT5tU3RvcFRpbWVbc3RyZWFtXSA9IHN5c3RlbVRpbWUoKTsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5nZXRBY3Rpdml0eUNvdW50KGNsaWVudFZvbFNyYykgPT0gMCB8fCBmb3JjZURldmljZVVwZGF0ZSkgeworICAgICAgICAgICAgb3V0cHV0RGVzYy0+c2V0U3RvcFRpbWUoY2xpZW50LCBzeXN0ZW1UaW1lKCkpOworICAgICAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOwogICAgICAgICAgICAgLy8gZGVsYXkgdGhlIGRldmljZSBzd2l0Y2ggYnkgdHdpY2UgdGhlIGxhdGVuY3kgYmVjYXVzZSBzdG9wT3V0cHV0KCkgaXMgZXhlY3V0ZWQgd2hlbgogICAgICAgICAgICAgLy8gdGhlIHRyYWNrIHN0b3AoKSBjb21tYW5kIGlzIHJlY2VpdmVkIGFuZCBhdCB0aGF0IHRpbWUgdGhlIGF1ZGlvIHRyYWNrIGJ1ZmZlciBjYW4KICAgICAgICAgICAgIC8vIHN0aWxsIGNvbnRhaW4gZGF0YSB0aGF0IG5lZWRzIHRvIGJlIGRyYWluZWQuIFRoZSBsYXRlbmN5IG9ubHkgY292ZXJzIHRoZSBhdWRpbyBIQUwKICAgICAgICAgICAgIC8vIGFuZCBrZXJuZWwgYnVmZmVycy4gQWxzbyB0aGUgbGF0ZW5jeSBkb2VzIG5vdCBhbHdheXMgaW5jbHVkZSBhZGRpdGlvbmFsIGRlbGF5IGluIHRoZQogICAgICAgICAgICAgLy8gYXVkaW8gcGF0aCAoYXVkaW8gRFNQLCBDT0RFQyAuLi4pCi0gICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgbmV3RGV2aWNlLCBmYWxzZSwgb3V0cHV0RGVzYy0+bGF0ZW5jeSgpKjIpOworICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCBuZXdEZXZpY2VzLCBmYWxzZSwgb3V0cHV0RGVzYy0+bGF0ZW5jeSgpKjIpOwogCiAgICAgICAgICAgICAvLyBmb3JjZSByZXN0b3JpbmcgdGhlIGRldmljZSBzZWxlY3Rpb24gb24gb3RoZXIgYWN0aXZlIG91dHB1dHMgaWYgaXQgZGlmZmVycyBmcm9tIHRoZQogICAgICAgICAgICAgLy8gb25lIGJlaW5nIHNlbGVjdGVkIGZvciB0aGlzIG91dHB1dAogICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcyA9IG91dHB1dERlc2MtPmxhdGVuY3koKSoyOwogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwogICAgICAgICAgICAgICAgIGlmIChkZXNjICE9IG91dHB1dERlc2MgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPmlzQWN0aXZlKCkgJiYKICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPnNoYXJlc0h3TW9kdWxlV2l0aChkZXNjKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgKG5ld0RldmljZSAhPSBkZXNjLT5kZXZpY2UoKSkpIHsKLSAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IG5ld0RldmljZTIgPSBnZXROZXdPdXRwdXREZXZpY2UoZGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBkZXNjLT5kZXZpY2UoKSAhPSBuZXdEZXZpY2UyOworICAgICAgICAgICAgICAgICAgICAgICAgKG5ld0RldmljZXMgIT0gZGVzYy0+ZGV2aWNlcygpKSkgeworICAgICAgICAgICAgICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlczIgPSBnZXROZXdPdXRwdXREZXZpY2VzKGRlc2MsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZGVzYy0+ZGV2aWNlcygpICE9IG5ld0RldmljZXMyOwogCi0gICAgICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShkZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3RGV2aWNlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7CisgICAgICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZXMoZGVzYywgbmV3RGV2aWNlczIsIGZvcmNlLCBkZWxheU1zKTsKKwogICAgICAgICAgICAgICAgICAgICAvLyByZS1hcHBseSBkZXZpY2Ugc3BlY2lmaWMgdm9sdW1lIGlmIG5vdCBkb25lIGJ5IHNldE91dHB1dERldmljZSgpCiAgICAgICAgICAgICAgICAgICAgIGlmICghZm9yY2UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhkZXNjLCBuZXdEZXZpY2UyLCBkZWxheU1zKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhkZXNjLCBuZXdEZXZpY2VzMi50eXBlcygpLCBkZWxheU1zKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KQEAgLTE0NDgsMTAgKzE4NDYsMTAgQEAKIAogICAgICAgICBpZiAoc3RyZWFtID09IEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFICYmCiAgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKLSAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShTVFJBVEVHWV9TT05JRklDQVRJT04sIGZhbHNlLCBvdXRwdXREZXNjKTsKKyAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzdHJlYW1Ub1N0cmF0ZWd5KEFVRElPX1NUUkVBTV9BTEFSTSksIGZhbHNlLCBvdXRwdXREZXNjKTsKICAgICAgICAgfQogCi0gICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX01VU0lDKSB7CisgICAgICAgIGlmIChmb2xsb3dzU2FtZVJvdXRpbmcoY2xpZW50LT5hdHRyaWJ1dGVzKCksIGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIoQVVESU9fVVNBR0VfTUVESUEpKSkgewogICAgICAgICAgICAgc2VsZWN0T3V0cHV0Rm9yTXVzaWNFZmZlY3RzKCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtMTQ2MSwzNyArMTg1OSw0NCBAQAogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gX191bnVzZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiBfX3VudXNlZCkKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0KCkgJWQiLCBvdXRwdXQpOwotICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KG91dHB1dCk7Ci0gICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICBBTE9HVygicmVsZWFzZU91dHB1dCgpIHJlbGVhc2luZyB1bmtub3duIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgQUxPR1YoIiVzIHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMuZ2V0T3V0cHV0Rm9yQ2xpZW50KHBvcnRJZCk7CisgICAgaWYgKG91dHB1dERlc2MgPT0gMCkgeworICAgICAgICAvLyBJZiBhbiBvdXRwdXQgZGVzY3JpcHRvciBpcyBjbG9zZWQgZHVlIHRvIGEgZGV2aWNlIHJvdXRpbmcgY2hhbmdlLAorICAgICAgICAvLyB0aGVuIHRoZXJlIGFyZSByYWNlIGNvbmRpdGlvbnMgd2l0aCByZWxlYXNlT3V0cHV0IGZyb20gdHJhY2tzCisgICAgICAgIC8vIHRoYXQgbWF5IGJlIGRlc3Ryb3llZCAod2l0aCBubyBQbGF5YmFja1RocmVhZCkgb3IgYSBQbGF5YmFja1RocmVhZAorICAgICAgICAvLyBkZXN0cm95ZWQgc2hvcnRseSB0aGVyZWFmdGVyLgorICAgICAgICAvLworICAgICAgICAvLyBIZXJlIHdlIGp1c3QgbG9nIGEgd2FybmluZywgaW5zdGVhZCBvZiBhIGZhdGFsIGVycm9yLgorICAgICAgICBBTE9HVygicmVsZWFzZU91dHB1dCgpIG5vIG91dHB1dCBmb3IgY2xpZW50ICVkIiwgcG9ydElkKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KIAotICAgIC8vIFJvdXRpbmcKLSAgICBtT3V0cHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOworICAgIEFMT0dWKCJyZWxlYXNlT3V0cHV0KCkgJWQiLCBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOwogCi0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGluZGV4KTsKLSAgICBpZiAoZGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7Ci0gICAgICAgIGlmIChkZXNjLT5tRGlyZWN0T3BlbkNvdW50IDw9IDApIHsKKyAgICBpZiAob3V0cHV0RGVzYy0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CisgICAgICAgIGlmIChvdXRwdXREZXNjLT5tRGlyZWN0T3BlbkNvdW50IDw9IDApIHsKICAgICAgICAgICAgIEFMT0dXKCJyZWxlYXNlT3V0cHV0KCkgaW52YWxpZCBvcGVuIGNvdW50ICVkIGZvciBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjLT5tRGlyZWN0T3BlbkNvdW50LCBvdXRwdXQpOworICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+bURpcmVjdE9wZW5Db3VudCwgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQotICAgICAgICBpZiAoLS1kZXNjLT5tRGlyZWN0T3BlbkNvdW50ID09IDApIHsKLSAgICAgICAgICAgIGNsb3NlT3V0cHV0KG91dHB1dCk7CisgICAgICAgIGlmICgtLW91dHB1dERlc2MtPm1EaXJlY3RPcGVuQ291bnQgPT0gMCkgeworICAgICAgICAgICAgY2xvc2VPdXRwdXQob3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgfQogICAgIH0KKyAgICAvLyBzdG9wT3V0cHV0KCkgbmVlZHMgdG8gYmUgc3VjY2Vzc2Z1bGx5IGNhbGxlZCBiZWZvcmUgcmVsZWFzZU91dHB1dCgpCisgICAgLy8gb3RoZXJ3aXNlIHRoZXJlIG1heSBiZSBpbmFjY3VyYXRlIHN0cmVhbSByZWZlcmVuY2UgY291bnRzLgorICAgIC8vIFRoaXMgaXMgY2hlY2tlZCBpbiBvdXRwdXREZXNjLT5yZW1vdmVDbGllbnQgYmVsb3cuCisgICAgb3V0cHV0RGVzYy0+cmVtb3ZlQ2xpZW50KHBvcnRJZCk7CiB9CiAKLQogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY29uZmlnLApAQCAtMTUwMCwyOCArMTkwNSwzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRfdHlwZV90ICppbnB1dFR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCiB7Ci0gICAgQUxPR1YoImdldElucHV0Rm9yQXR0cigpIHNvdXJjZSAlZCwgc2FtcGxpbmcgcmF0ZSAlZCwgZm9ybWF0ICUjeCwgY2hhbm5lbCBtYXNrICUjeCwiCi0gICAgICAgICAgICAic2Vzc2lvbiAlZCwgZmxhZ3MgJSN4IiwKLSAgICAgICAgICBhdHRyLT5zb3VyY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgc2Vzc2lvbiwgZmxhZ3MpOworICAgIEFMT0dWKCIlcygpIHNvdXJjZSAlZCwgc2FtcGxpbmcgcmF0ZSAlZCwgZm9ybWF0ICUjeCwgY2hhbm5lbCBtYXNrICUjeCwgc2Vzc2lvbiAlZCwgIgorICAgICAgICAgICJmbGFncyAlI3ggYXR0cmlidXRlcz0lcyIsIF9fZnVuY19fLCBhdHRyLT5zb3VyY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsCisgICAgICAgICAgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBzZXNzaW9uLCBmbGFncywgdG9TdHJpbmcoKmF0dHIpLmNfc3RyKCkpOwogCiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gTk9fRVJST1I7Ci0gICAgLy8gaGFuZGxlIGxlZ2FjeSByZW1vdGUgc3VibWl4IGNhc2Ugd2hlcmUgdGhlIGFkZHJlc3Mgd2FzIG5vdCBhbHdheXMgc3BlY2lmaWVkCi0gICAgU3RyaW5nOCBhZGRyZXNzID0gU3RyaW5nOCgiIik7CiAgICAgYXVkaW9fc291cmNlX3QgaGFsSW5wdXRTb3VyY2U7Ci0gICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UgPSBhdHRyLT5zb3VyY2U7Ci0gICAgQXVkaW9NaXggKnBvbGljeU1peCA9IE5VTEw7Ci0gICAgRGV2aWNlVmVjdG9yIGlucHV0RGV2aWNlczsKKyAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcyA9ICphdHRyOworICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXg7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOworICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2M7CisgICAgc3A8UmVjb3JkQ2xpZW50RGVzY3JpcHRvcj4gY2xpZW50RGVzYzsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHJlcXVlc3RlZERldmljZUlkID0gKnNlbGVjdGVkRGV2aWNlSWQ7CisgICAgYm9vbCBpc1NvdW5kVHJpZ2dlcjsKIAotICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfREVGQVVMVCkgewotICAgICAgICBpbnB1dFNvdXJjZSA9IEFVRElPX1NPVVJDRV9NSUM7CisgICAgLy8gVGhlIHN1cHBsaWVkIHBvcnRJZCBtdXN0IGJlIEFVRElPX1BPUlRfSEFORExFX05PTkUKKyAgICBpZiAoKnBvcnRJZCAhPSBBVURJT19QT1JUX0hBTkRMRV9OT05FKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBpZiAoYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUKSB7CisgICAgICAgIGF0dHJpYnV0ZXMuc291cmNlID0gQVVESU9fU09VUkNFX01JQzsKICAgICB9CiAKICAgICAvLyBFeHBsaWNpdCByb3V0aW5nPwotICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZURlc2M7Ci0gICAgaWYgKCpzZWxlY3RlZERldmljZUlkICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgZGV2aWNlRGVzYyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKCpzZWxlY3RlZERldmljZUlkKTsKLSAgICB9Ci0gICAgbUlucHV0Um91dGVzLmFkZFJvdXRlKHNlc3Npb24sIFNlc3Npb25Sb3V0ZTo6U1RSRUFNX1RZUEVfTkEsIGlucHV0U291cmNlLCBkZXZpY2VEZXNjLCB1aWQpOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IGV4cGxpY2l0Um91dGluZ0RldmljZSA9IAorICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VGcm9tSWQoKnNlbGVjdGVkRGV2aWNlSWQpOwogCiAgICAgLy8gc3BlY2lhbCBjYXNlIGZvciBtbWFwIGNhcHR1cmU6IGlmIGFuIGlucHV0IElPIGhhbmRsZSBpcyBzcGVjaWZpZWQsIHdlIHJldXNlIHRoaXMgaW5wdXQgaWYKICAgICAvLyBwb3NzaWJsZQpAQCAtMTUzNCw4ICsxOTQzLDggQEAKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgICAgIH0KICAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgIHNwPEF1ZGlvU2Vzc2lvbj4gYXVkaW9TZXNzaW9uID0gaW5wdXREZXNjLT5nZXRBdWRpb1Nlc3Npb24oc2Vzc2lvbik7Ci0gICAgICAgIGlmIChhdWRpb1Nlc3Npb24gPT0gMCkgeworICAgICAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50cyA9IGlucHV0RGVzYy0+Z2V0Q2xpZW50c0ZvclNlc3Npb24oc2Vzc2lvbik7CisgICAgICAgIGlmIChjbGllbnRzLnNpemUoKSA9PSAwKSB7CiAgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgKmlucHV0KTsKICAgICAgICAgICAgIHN0YXR1cyA9IEJBRF9WQUxVRTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC0xNTQ0LDc1ICsxOTUzLDgwIEBACiAgICAgICAgIC8vIFRoZSBzZWNvbmQgY2FsbCBpcyBmb3IgdGhlIGZpcnN0IGFjdGl2ZSBjbGllbnQgYW5kIHNldHMgdGhlIFVJRC4gQW55IGZ1cnRoZXIgY2FsbAogICAgICAgICAvLyBjb3JyZXNwb25kcyB0byBhIG5ldyBjbGllbnQgYW5kIGlzIG9ubHkgcGVybWl0dGVkIGZyb20gdGhlIHNhbWUgVUlELgogICAgICAgICAvLyBJZiB0aGUgZmlyc3QgVUlEIGlzIHNpbGVuY2VkLCBhbGxvdyBhIG5ldyBVSUQgY29ubmVjdGlvbiBhbmQgcmVwbGFjZSB3aXRoIG5ldyBVSUQKLSAgICAgICAgaWYgKGF1ZGlvU2Vzc2lvbi0+b3BlbkNvdW50KCkgPT0gMSkgewotICAgICAgICAgICAgYXVkaW9TZXNzaW9uLT5zZXRVaWQodWlkKTsKLSAgICAgICAgfSBlbHNlIGlmIChhdWRpb1Nlc3Npb24tPnVpZCgpICE9IHVpZCkgewotICAgICAgICAgICAgaWYgKCFhdWRpb1Nlc3Npb24tPmlzU2lsZW5jZWQoKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJnZXRJbnB1dEZvckF0dHIoKSBiYWQgdWlkICVkIGZvciBzZXNzaW9uICVkIHVpZCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgdWlkLCBzZXNzaW9uLCBhdWRpb1Nlc3Npb24tPnVpZCgpKTsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICBpZiAoY2xpZW50cy5zaXplKCkgPiAxKSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGNsaWVudHMpIHsKKyAgICAgICAgICAgICAgICAvLyBUaGUgY2xpZW50IG1hcCBpcyBvcmRlcmVkIGJ5IGtleSB2YWx1ZXMgKHBvcnRJZCkgYW5kIHBvcnRJZHMgYXJlIGFsbG9jYXRlZAorICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudGFseS4gU28gdGhlIGZpcnN0IGNsaWVudCBpbiB0aGlzIGxpc3QgaXMgdGhlIG9uZSBvcGVuZWQgYnkgYXVkaW8gZmxpbmdlcgorICAgICAgICAgICAgICAgIC8vIHdoZW4gdGhlIG1tYXAgc3RyZWFtIGlzIGNyZWF0ZWQgYW5kIHNob3VsZCBiZSBpZ25vcmVkIGFzIGl0IGRvZXMgbm90IGNvcnJlc3BvbmQKKyAgICAgICAgICAgICAgICAvLyB0byBhbiBhY3R1YWwgY2xpZW50CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudCA9PSAqY2xpZW50cy5jYmVnaW4oKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKHVpZCAhPSBjbGllbnQtPnVpZCgpICYmICFjbGllbnQtPmlzU2lsZW5jZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgYmFkIHVpZCAlZCBmb3IgY2xpZW50ICVkIHVpZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCwgY2xpZW50LT5wb3J0SWQoKSwgY2xpZW50LT51aWQoKSk7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbi0+c2V0VWlkKHVpZCk7Ci0gICAgICAgICAgICBhdWRpb1Nlc3Npb24tPnNldFNpbGVuY2VkKGZhbHNlKTsKICAgICAgICAgfQotICAgICAgICBhdWRpb1Nlc3Npb24tPmNoYW5nZU9wZW5Db3VudCgxKTsKICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9MRUdBQ1k7Ci0gICAgICAgIGlmICgqcG9ydElkID09IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICpwb3J0SWQgPSBBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOwotICAgICAgICB9Ci0gICAgICAgIGlucHV0RGV2aWNlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKGlucHV0RGVzYy0+bURldmljZSk7Ci0gICAgICAgICpzZWxlY3RlZERldmljZUlkID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5nZXRJZCgpCi0gICAgICAgICAgICAgICAgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOwotICAgICAgICBBTE9HSSgiJXMgcmV1c2luZyBNTUFQIGlucHV0ICVkIGZvciBzZXNzaW9uICVkIiwgX19GVU5DVElPTl9fLCAqaW5wdXQsIHNlc3Npb24pOworICAgICAgICBkZXZpY2UgPSBpbnB1dERlc2MtPmdldERldmljZSgpOwogCi0gICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgQUxPR0koIiVzIHJldXNpbmcgTU1BUCBpbnB1dCAlZCBmb3Igc2Vzc2lvbiAlZCIsIF9fRlVOQ1RJT05fXywgKmlucHV0LCBzZXNzaW9uKTsKKyAgICAgICAgZ290byBleGl0OwogICAgIH0KIAogICAgICppbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfSU5WQUxJRDsKIAotICAgIGhhbElucHV0U291cmNlID0gaW5wdXRTb3VyY2U7CisgICAgaGFsSW5wdXRTb3VyY2UgPSBhdHRyaWJ1dGVzLnNvdXJjZTsKIAotICAgIC8vIFRPRE86IGNoZWNrIGZvciBleGlzdGluZyBjbGllbnQgZm9yIHRoaXMgcG9ydCBJRAotICAgIGlmICgqcG9ydElkID09IEFVRElPX1BPUlRfSEFORExFX05PTkUpIHsKLSAgICAgICAgKnBvcnRJZCA9IEF1ZGlvUG9ydDo6Z2V0TmV4dFVuaXF1ZUlkKCk7Ci0gICAgfQotCi0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZTsKLQotICAgIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWCAmJgotICAgICAgICAgICAgc3RybmNtcChhdHRyLT50YWdzLCAiYWRkcj0iLCBzdHJsZW4oImFkZHI9IikpID09IDApIHsKLSAgICAgICAgc3RhdHVzID0gbVBvbGljeU1peGVzLmdldElucHV0TWl4Rm9yQXR0cigqYXR0ciwgJnBvbGljeU1peCk7CisgICAgaWYgKGF0dHJpYnV0ZXMuc291cmNlID09IEFVRElPX1NPVVJDRV9SRU1PVEVfU1VCTUlYICYmCisgICAgICAgICAgICBzdHJuY21wKGF0dHJpYnV0ZXMudGFncywgImFkZHI9Iiwgc3RybGVuKCJhZGRyPSIpKSA9PSAwKSB7CisgICAgICAgIHN0YXR1cyA9IG1Qb2xpY3lNaXhlcy5nZXRJbnB1dE1peEZvckF0dHIoYXR0cmlidXRlcywgJnBvbGljeU1peCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyBjb3VsZCBub3QgZmluZCBpbnB1dCBtaXggZm9yIGF0dHIgJXMiLAorICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgdG9TdHJpbmcoYXR0cmlidXRlcykuY19zdHIoKSk7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9Ci0gICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTUlYX0VYVF9QT0xJQ1lfUkVST1VURTsKLSAgICAgICAgZGV2aWNlID0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7Ci0gICAgICAgIGFkZHJlc3MgPSBTdHJpbmc4KGF0dHItPnRhZ3MgKyBzdHJsZW4oImFkZHI9IikpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUFuZE1peEZvcklucHV0U291cmNlKGlucHV0U291cmNlLCAmcG9saWN5TWl4KTsKLSAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yQXR0cigpIGNvdWxkIG5vdCBmaW5kIGRldmljZSBmb3Igc291cmNlICVkIiwgaW5wdXRTb3VyY2UpOworICAgICAgICBkZXZpY2UgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZShBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChhdHRyLT50YWdzICsgc3RybGVuKCJhZGRyPSIpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dXKCIlcyBjb3VsZCBub3QgZmluZCBpbiBSZW1vdGUgU3VibWl4IGRldmljZSBmb3Igc291cmNlICVkLCB0YWdzICVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGF0dHJpYnV0ZXMuc291cmNlLCBhdHRyaWJ1dGVzLnRhZ3MpOwogICAgICAgICAgICAgc3RhdHVzID0gQkFEX1ZBTFVFOwogICAgICAgICAgICAgZ290byBlcnJvcjsKICAgICAgICAgfQotICAgICAgICBpZiAocG9saWN5TWl4ICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGFkZHJlc3MgPSBwb2xpY3lNaXgtPm1EZXZpY2VBZGRyZXNzOwotICAgICAgICAgICAgaWYgKHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTKSB7Ci0gICAgICAgICAgICAgICAgLy8gdGhlcmUgaXMgYW4gZXh0ZXJuYWwgcG9saWN5LCBidXQgdGhpcyBpbnB1dCBpcyBhdHRhY2hlZCB0byBhIG1peCBvZiByZWNvcmRlcnMsCi0gICAgICAgICAgICAgICAgLy8gbWVhbmluZyBpdCByZWNlaXZlcyBhdWRpbyBpbmplY3RlZCBpbnRvIHRoZSBmcmFtZXdvcmssIHNvIHRoZSByZWNvcmRlciBkb2Vzbid0Ci0gICAgICAgICAgICAgICAgLy8ga25vdyBhYm91dCBpdCBhbmQgaXMgdGhlcmVmb3JlIGNvbnNpZGVyZWQgImxlZ2FjeSIKLSAgICAgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0xFR0FDWTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gcmVjb3JkaW5nIGEgbWl4IG9mIHBsYXllcnMgZGVmaW5lZCBieSBhbiBleHRlcm5hbCBwb2xpY3ksIHdlJ3JlIHJlcm91dGluZyBmb3IKLSAgICAgICAgICAgICAgICAvLyBhbiBleHRlcm5hbCBwb2xpY3kKLSAgICAgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX01JWF9FWFRfUE9MSUNZX1JFUk9VVEU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoYXVkaW9faXNfcmVtb3RlX3N1Ym1peF9kZXZpY2UoZGV2aWNlKSkgewotICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKKworICAgICAgICBpZiAoaXNfbWl4X2xvb3BiYWNrX3JlbmRlcihwb2xpY3lNaXgtPm1Sb3V0ZUZsYWdzKSkgeworICAgICAgICAgICAgKmlucHV0VHlwZSA9IEFQSV9JTlBVVF9NSVhfUFVCTElDX0NBUFRVUkVfUExBWUJBQ0s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX01JWF9FWFRfUE9MSUNZX1JFUk9VVEU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoZXhwbGljaXRSb3V0aW5nRGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGRldmljZSA9IGV4cGxpY2l0Um91dGluZ0RldmljZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFByZXZlbnQgZnJvbSBzdG9yaW5nIGludmFsaWQgcmVxdWVzdGVkIGRldmljZSBpZCBpbiBjbGllbnRzCisgICAgICAgICAgICByZXF1ZXN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgICAgICBkZXZpY2UgPSBtRW5naW5lLT5nZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgJnBvbGljeU1peCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JBdHRyKCkgY291bGQgbm90IGZpbmQgZGV2aWNlIGZvciBzb3VyY2UgJWQiLCBhdHRyaWJ1dGVzLnNvdXJjZSk7CisgICAgICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CisgICAgICAgICAgICBnb3RvIGVycm9yOworICAgICAgICB9CisgICAgICAgIGlmIChwb2xpY3lNaXgpIHsKKyAgICAgICAgICAgIEFMT0dfQVNTRVJUKHBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUkVDT1JERVJTLCAiSW52YWxpZCBNaXggVHlwZSIpOworICAgICAgICAgICAgLy8gdGhlcmUgaXMgYW4gZXh0ZXJuYWwgcG9saWN5LCBidXQgdGhpcyBpbnB1dCBpcyBhdHRhY2hlZCB0byBhIG1peCBvZiByZWNvcmRlcnMsCisgICAgICAgICAgICAvLyBtZWFuaW5nIGl0IHJlY2VpdmVzIGF1ZGlvIGluamVjdGVkIGludG8gdGhlIGZyYW1ld29yaywgc28gdGhlIHJlY29yZGVyIGRvZXNuJ3QKKyAgICAgICAgICAgIC8vIGtub3cgYWJvdXQgaXQgYW5kIGlzIHRoZXJlZm9yZSBjb25zaWRlcmVkICJsZWdhY3kiCisgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX0xFR0FDWTsKKyAgICAgICAgfSBlbHNlIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShkZXZpY2UtPnR5cGUoKSkpIHsKICAgICAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTUlYX0NBUFRVUkU7Ci0gICAgICAgIH0gZWxzZSBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9JTl9URUxFUEhPTllfUlgpIHsKKyAgICAgICAgfSBlbHNlIGlmIChkZXZpY2UtPnR5cGUoKSA9PSBBVURJT19ERVZJQ0VfSU5fVEVMRVBIT05ZX1JYKSB7CiAgICAgICAgICAgICAqaW5wdXRUeXBlID0gQVBJX0lOUFVUX1RFTEVQSE9OWV9SWDsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICppbnB1dFR5cGUgPSBBUElfSU5QVVRfTEVHQUNZOwpAQCAtMTYyMCw0MyArMjAzNCw0OSBAQAogCiAgICAgfQogCi0gICAgKmlucHV0ID0gZ2V0SW5wdXRGb3JEZXZpY2UoZGV2aWNlLCBhZGRyZXNzLCBzZXNzaW9uLCB1aWQsIGlucHV0U291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4KTsKKyAgICAqaW5wdXQgPSBnZXRJbnB1dEZvckRldmljZShkZXZpY2UsIHNlc3Npb24sIGF0dHJpYnV0ZXMsIGNvbmZpZywgZmxhZ3MsIHBvbGljeU1peCk7CiAgICAgaWYgKCppbnB1dCA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICBzdGF0dXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgZ290byBlcnJvcjsKICAgICB9CiAKLSAgICBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICpzZWxlY3RlZERldmljZUlkID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5nZXRJZCgpCi0gICAgICAgICAgICA6IEFVRElPX1BPUlRfSEFORExFX05PTkU7CitleGl0OgogCi0gICAgQUxPR1YoImdldElucHV0Rm9yQXR0cigpIHJldHVybnMgaW5wdXQgJWQgdHlwZSAlZCBzZWxlY3RlZERldmljZUlkICVkIiwKLSAgICAgICAgICAgICppbnB1dCwgKmlucHV0VHlwZSwgKnNlbGVjdGVkRGV2aWNlSWQpOworICAgICpzZWxlY3RlZERldmljZUlkID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5jb250YWlucyhkZXZpY2UpID8KKyAgICAgICAgICAgICAgICBkZXZpY2UtPmdldElkKCkgOiBBVURJT19QT1JUX0hBTkRMRV9OT05FOworCisgICAgaXNTb3VuZFRyaWdnZXIgPSBhdHRyaWJ1dGVzLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCAmJgorICAgICAgICBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uKSA+PSAwOworICAgICpwb3J0SWQgPSBQb2xpY3lBdWRpb1BvcnQ6OmdldE5leHRVbmlxdWVJZCgpOworCisgICAgY2xpZW50RGVzYyA9IG5ldyBSZWNvcmRDbGllbnREZXNjcmlwdG9yKCpwb3J0SWQsIHJpaWQsIHVpZCwgc2Vzc2lvbiwgYXR0cmlidXRlcywgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdGVkRGV2aWNlSWQsIGF0dHJpYnV0ZXMuc291cmNlLCBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTb3VuZFRyaWdnZXIpOworICAgIGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVGb3IoKmlucHV0KTsKKyAgICBpbnB1dERlc2MtPmFkZENsaWVudChjbGllbnREZXNjKTsKKworICAgIEFMT0dWKCJnZXRJbnB1dEZvckF0dHIoKSByZXR1cm5zIGlucHV0ICVkIHR5cGUgJWQgc2VsZWN0ZWREZXZpY2VJZCAlZCBmb3IgcG9ydCBJRCAlZCIsCisgICAgICAgICAgICAqaW5wdXQsICppbnB1dFR5cGUsICpzZWxlY3RlZERldmljZUlkLCAqcG9ydElkKTsKIAogICAgIHJldHVybiBOT19FUlJPUjsKIAogZXJyb3I6Ci0gICAgbUlucHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIAotYXVkaW9faW9faGFuZGxlX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRJbnB1dEZvckRldmljZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MsCithdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0Rm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGlucHV0U291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXggKnBvbGljeU1peCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Qb2xpY3lNaXg+ICZwb2xpY3lNaXgpCiB7CiAgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKLSAgICBhdWRpb19zb3VyY2VfdCBoYWxJbnB1dFNvdXJjZSA9IGlucHV0U291cmNlOworICAgIGF1ZGlvX3NvdXJjZV90IGhhbElucHV0U291cmNlID0gYXR0cmlidXRlcy5zb3VyY2U7CiAgICAgYm9vbCBpc1NvdW5kVHJpZ2dlciA9IGZhbHNlOwogCi0gICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CisgICAgaWYgKGF0dHJpYnV0ZXMuc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7CiAgICAgICAgIHNzaXplX3QgaW5kZXggPSBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuaW5kZXhPZktleShzZXNzaW9uKTsKICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKICAgICAgICAgICAgIGlucHV0ID0gbVNvdW5kVHJpZ2dlclNlc3Npb25zLnZhbHVlRm9yKHNlc3Npb24pOwpAQCAtMTY2Niw3ICsyMDg2LDcgQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGhhbElucHV0U291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOwogICAgICAgICB9Ci0gICAgfSBlbHNlIGlmIChpbnB1dFNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiAmJgorICAgIH0gZWxzZSBpZiAoYXR0cmlidXRlcy5zb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04gJiYKICAgICAgICAgICAgICAgIGF1ZGlvX2lzX2xpbmVhcl9wY20oY29uZmlnLT5mb3JtYXQpKSB7CiAgICAgICAgIGZsYWdzID0gKGF1ZGlvX2lucHV0X2ZsYWdzX3QpKGZsYWdzIHwgQVVESU9fSU5QVVRfRkxBR19WT0lQX1RYKTsKICAgICB9CkBAIC0xNjgxLDggKzIxMDEsNyBAQAogICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgcHJvZmlsZUZsYWdzID0gZmxhZ3M7CiAgICAgZm9yICg7OykgewogICAgICAgICBwcm9maWxlRm9ybWF0ID0gY29uZmlnLT5mb3JtYXQ7IC8vIHJlc2V0IGVhY2ggdGltZSB0aHJvdWdoIGxvb3AsIGluIGNhc2UgaXQgaXMgdXBkYXRlZAotICAgICAgICBwcm9maWxlID0gZ2V0SW5wdXRQcm9maWxlKGRldmljZSwgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlU2FtcGxpbmdSYXRlLCBwcm9maWxlRm9ybWF0LCBwcm9maWxlQ2hhbm5lbE1hc2ssCisgICAgICAgIHByb2ZpbGUgPSBnZXRJbnB1dFByb2ZpbGUoZGV2aWNlLCBwcm9maWxlU2FtcGxpbmdSYXRlLCBwcm9maWxlRm9ybWF0LCBwcm9maWxlQ2hhbm5lbE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZUZsYWdzKTsKICAgICAgICAgaWYgKHByb2ZpbGUgIT0gMCkgewogICAgICAgICAgICAgYnJlYWs7IC8vIHN1Y2Nlc3MKQEAgLTE2OTEsOSArMjExMCw5IEBACiAgICAgICAgIH0gZWxzZSBpZiAocHJvZmlsZUZsYWdzICE9IEFVRElPX0lOUFVUX0ZMQUdfTk9ORSkgewogICAgICAgICAgICAgcHJvZmlsZUZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FOyAvLyByZXRyeQogICAgICAgICB9IGVsc2UgeyAvLyBmYWlsCi0gICAgICAgICAgICBBTE9HVygiZ2V0SW5wdXRGb3JEZXZpY2UoKSBjb3VsZCBub3QgZmluZCBwcm9maWxlIGZvciBkZXZpY2UgMHglWCwgIgotICAgICAgICAgICAgICAgICAgInNhbXBsaW5nIHJhdGUgJXUsIGZvcm1hdCAlI3gsIGNoYW5uZWwgbWFzayAweCVYLCBmbGFncyAlI3giLAotICAgICAgICAgICAgICAgICAgICBkZXZpY2UsIGNvbmZpZy0+c2FtcGxlX3JhdGUsIGNvbmZpZy0+Zm9ybWF0LCBjb25maWctPmNoYW5uZWxfbWFzaywgZmxhZ3MpOworICAgICAgICAgICAgQUxPR1coIiVzIGNvdWxkIG5vdCBmaW5kIHByb2ZpbGUgZm9yIGRldmljZSAlcywgc2FtcGxpbmcgcmF0ZSAldSwgZm9ybWF0ICUjeCwgIgorICAgICAgICAgICAgICAgICAgImNoYW5uZWwgbWFzayAweCVYLCBmbGFncyAlI3giLCBfX2Z1bmNfXywgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIAorICAgICAgICAgICAgICAgICAgY29uZmlnLT5zYW1wbGVfcmF0ZSwgY29uZmlnLT5mb3JtYXQsIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLCBmbGFncyk7CiAgICAgICAgICAgICByZXR1cm4gaW5wdXQ7CiAgICAgICAgIH0KICAgICB9CkBAIC0xNzA4LDg2ICsyMTI3LDQyIEBACiAgICAgICAgIHJldHVybiBpbnB1dDsKICAgICB9CiAKLSAgICBzcDxBdWRpb1Nlc3Npb24+IGF1ZGlvU2Vzc2lvbiA9IG5ldyBBdWRpb1Nlc3Npb24oc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRTb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Zm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy0+Y2hhbm5lbF9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1NvdW5kVHJpZ2dlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4LCBtcENsaWVudEludGVyZmFjZSk7Ci0KLS8vIEZJWE1FOiBkaXNhYmxlIGNvbmN1cnJlbnQgY2FwdHVyZSB1bnRpbCBVSSBpcyByZWFkeQotI2lmIDAKLSAgICAvLyByZXVzZSBhbiBvcGVuIGlucHV0IGlmIHBvc3NpYmxlCi0gICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IHJldXNlZElucHV0RGVzYzsKLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIC8vIHJldXNlIGlucHV0IGlmOgotICAgICAgICAvLyAtIGl0IHNoYXJlcyB0aGUgc2FtZSBwcm9maWxlCi0gICAgICAgIC8vICAgICAgQU5ECi0gICAgICAgIC8vIC0gaXQgaXMgbm90IGEgcmVyb3V0ZSBzdWJtaXggaW5wdXQKLSAgICAgICAgLy8gICAgICBBTkQKLSAgICAgICAgLy8gLSBpdCBpczogbm90IHVzZWQgZm9yIHNvdW5kIHRyaWdnZXIKLSAgICAgICAgLy8gICAgICAgICAgICAgICAgT1IKLSAgICAgICAgLy8gICAgICAgICAgdXNlZCBmb3Igc291bmQgdHJpZ2dlciBhbmQgYWxsIGNsaWVudHMgdXNlIHRoZSBzYW1lIHNlc3Npb24gSUQKLSAgICAgICAgLy8KLSAgICAgICAgaWYgKChwcm9maWxlID09IGRlc2MtPm1Qcm9maWxlKSAmJgotICAgICAgICAgICAgKGlzU291bmRUcmlnZ2VyID09IGRlc2MtPmlzU291bmRUcmlnZ2VyKCkpICYmCi0gICAgICAgICAgICAhaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoZGV2aWNlKSkgewotCi0gICAgICAgICAgICBzcDxBdWRpb1Nlc3Npb24+IGFzID0gZGVzYy0+Z2V0QXVkaW9TZXNzaW9uKHNlc3Npb24pOwotICAgICAgICAgICAgaWYgKGFzICE9IDApIHsKLSAgICAgICAgICAgICAgICAvLyBkbyBub3QgYWxsb3cgdW5tYXRjaGluZyBwcm9wZXJ0aWVzIG9uIHNhbWUgc2Vzc2lvbgotICAgICAgICAgICAgICAgIGlmIChhcy0+bWF0Y2hlcyhhdWRpb1Nlc3Npb24pKSB7Ci0gICAgICAgICAgICAgICAgICAgIGFzLT5jaGFuZ2VPcGVuQ291bnQoMSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coImdldElucHV0Rm9yRGV2aWNlKCkgcmVjb3JkIHdpdGggZGlmZmVyZW50IGF0dHJpYnV0ZXMiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgZXhpc3RzIGZvciBzZXNzaW9uICVkIiwgc2Vzc2lvbik7CisgICAgaWYgKCFwcm9maWxlLT5jYW5PcGVuTmV3SW8oKSkgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyApIHsKKyAgICAgICAgICAgIHNwIDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZSAhPSBwcm9maWxlKSB7CisgICAgICAgICAgICAgICAgaSsrOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaWYgc291bmQgdHJpZ2dlciwgcmV1c2UgaW5wdXQgaWYgdXNlZCBieSBvdGhlciBzb3VuZCB0cmlnZ2VyIG9uIHNhbWUgc2Vzc2lvbgorICAgICAgICAgICAgLy8gZWxzZQorICAgICAgICAgICAgLy8gICAgcmV1c2UgaW5wdXQgaWYgYWN0aXZlIGNsaWVudCBhcHAgaXMgbm90IGluIElETEUgc3RhdGUKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50cyA9IGRlc2MtPmNsaWVudHNMaXN0KCk7CisgICAgICAgICAgICBib29sIGRvQ2xvc2UgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogY2xpZW50cykgeworICAgICAgICAgICAgICAgIGlmIChpc1NvdW5kVHJpZ2dlciAhPSBjbGllbnQtPmlzU291bmRUcmlnZ2VyKCkpIHsKICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIGlmIChpc1NvdW5kVHJpZ2dlcikgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIGlmIChjbGllbnQtPmlzU291bmRUcmlnZ2VyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNlc3Npb24gPT0gY2xpZW50LT5zZXNzaW9uKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXNjLT5tSW9IYW5kbGU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSgpICYmIGNsaWVudC0+YXBwU3RhdGUoKSAhPSBBUFBfU1RBVEVfSURMRSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzYy0+bUlvSGFuZGxlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkb0Nsb3NlID0gdHJ1ZTsKICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmV1c2UgdGhlIGFscmVhZHkgb3BlbmVkIGlucHV0IHN0cmVhbSBvbiB0aGlzIHByb2ZpbGUgaWY6Ci0gICAgICAgICAgICAvLyAtIHRoZSBuZXcgY2FwdHVyZSBzb3VyY2UgaXMgYmFja2dyb3VuZCBPUgotICAgICAgICAgICAgLy8gLSB0aGUgcGF0aCByZXF1ZXN0ZWQgY29uZmlndXJhdGlvbnMgbWF0Y2ggT1IKLSAgICAgICAgICAgIC8vIC0gdGhlIG5ldyBzb3VyY2UgcHJpb3JpdHkgaXMgbGVzcyB0aGFuIHRoZSBoaWdoZXN0IHNvdXJjZSBwcmlvcml0eSBvbiB0aGlzIGlucHV0Ci0gICAgICAgICAgICAvLyBJZiB0aGUgaW5wdXQgc3RyZWFtIGNhbm5vdCBiZSByZXVzZWQsIGNsb3NlIGl0IGJlZm9yZSBvcGVuaW5nIGEgbmV3IHN0cmVhbQotICAgICAgICAgICAgLy8gb24gdGhlIHNhbWUgcHJvZmlsZSBmb3IgdGhlIG5ldyBjbGllbnQgc28gdGhhdCB0aGUgcmVxdWVzdGVkIHBhdGggY29uZmlndXJhdGlvbgotICAgICAgICAgICAgLy8gY2FuIGJlIHNlbGVjdGVkLgotICAgICAgICAgICAgaWYgKCFpc0NvbmN1cnJlbnRTb3VyY2UoaW5wdXRTb3VyY2UpICYmCi0gICAgICAgICAgICAgICAgICAgICgoZGVzYy0+bVNhbXBsaW5nUmF0ZSAhPSBzYW1wbGluZ1JhdGUgfHwKLSAgICAgICAgICAgICAgICAgICAgZGVzYy0+bUNoYW5uZWxNYXNrICE9IGNvbmZpZy0+Y2hhbm5lbF9tYXNrIHx8Ci0gICAgICAgICAgICAgICAgICAgICFhdWRpb19mb3JtYXRzX21hdGNoKGRlc2MtPm1Gb3JtYXQsIGNvbmZpZy0+Zm9ybWF0KSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKHNvdXJjZV9wcmlvcml0eShkZXNjLT5nZXRIaWdoZXN0UHJpb3JpdHlTb3VyY2UoZmFsc2UgLyphY3RpdmVPbmx5Ki8pKSA8Ci0gICAgICAgICAgICAgICAgICAgICBzb3VyY2VfcHJpb3JpdHkoaW5wdXRTb3VyY2UpKSkpIHsKLSAgICAgICAgICAgICAgICByZXVzZWRJbnB1dERlc2MgPSBkZXNjOwotICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgaWYgKGRvQ2xvc2UpIHsKKyAgICAgICAgICAgICAgICBjbG9zZUlucHV0KGRlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRlc2MtPmFkZEF1ZGlvU2Vzc2lvbihzZXNzaW9uLCBhdWRpb1Nlc3Npb24pOwotICAgICAgICAgICAgICAgIEFMT0dWKCIlczogcmV1c2luZyBpbnB1dCAlZCIsIF9fRlVOQ1RJT05fXywgbUlucHV0cy5rZXlBdChpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG1JbnB1dHMua2V5QXQoaSk7CisgICAgICAgICAgICAgICAgaSsrOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCi0gICAgaWYgKHJldXNlZElucHV0RGVzYyAhPSAwKSB7Ci0gICAgICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gc2Vzc2lvbnMgPSByZXVzZWRJbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbnMoZmFsc2UgLyphY3RpdmVPbmx5Ki8pOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHNlc3Npb25zLnNpemUoKTsgaisrKSB7Ci0gICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgY3VycmVudFNlc3Npb24gPSBzZXNzaW9ucy5rZXlBdChqKTsKLSAgICAgICAgICAgIHN0b3BJbnB1dChyZXVzZWRJbnB1dERlc2MtPm1Jb0hhbmRsZSwgY3VycmVudFNlc3Npb24pOwotICAgICAgICAgICAgcmVsZWFzZUlucHV0KHJldXNlZElucHV0RGVzYy0+bUlvSGFuZGxlLCBjdXJyZW50U2Vzc2lvbik7Ci0gICAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmICghcHJvZmlsZS0+Y2FuT3Blbk5ld0lvKCkpIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgIH0KLQogICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwogCiAgICAgYXVkaW9fY29uZmlnX3QgbENvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKQEAgLTE3OTUsMTQgKzIxNzAsNyBAQAogICAgIGxDb25maWcuY2hhbm5lbF9tYXNrID0gcHJvZmlsZUNoYW5uZWxNYXNrOwogICAgIGxDb25maWcuZm9ybWF0ID0gcHJvZmlsZUZvcm1hdDsKIAotICAgIGlmIChhZGRyZXNzID09ICIiKSB7Ci0gICAgICAgIERldmljZVZlY3RvciBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShkZXZpY2UpOwotICAgICAgICAvLyB0aGUgaW5wdXRzIHZlY3RvciBtdXN0IGJlIG9mIHNpemUgPj0gMSwgYnV0IHdlIGRvbid0IHdhbnQgdG8gY3Jhc2ggaGVyZQotICAgICAgICBhZGRyZXNzID0gaW5wdXREZXZpY2VzLnNpemUoKSA+IDAgPyBpbnB1dERldmljZXMuaXRlbUF0KDApLT5tQWRkcmVzcyA6IFN0cmluZzgoIiIpOwotICAgIH0KLQotICAgIHN0YXR1c190IHN0YXR1cyA9IGlucHV0RGVzYy0+b3BlbigmbENvbmZpZywgZGV2aWNlLCBhZGRyZXNzLAotICAgICAgICAgICAgaGFsSW5wdXRTb3VyY2UsIHByb2ZpbGVGbGFncywgJmlucHV0KTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnB1dERlc2MtPm9wZW4oJmxDb25maWcsIGRldmljZSwgaGFsSW5wdXRTb3VyY2UsIHByb2ZpbGVGbGFncywgJmlucHV0KTsKIAogICAgIC8vIG9ubHkgYWNjZXB0IGlucHV0IHdpdGggdGhlIGV4YWN0IHJlcXVlc3RlZCBzZXQgb2YgcGFyYW1ldGVycwogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IgfHwgaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUgfHwKQEAgLTE4MTksNyArMjE4Nyw2IEBACiAgICAgfQogCiAgICAgaW5wdXREZXNjLT5tUG9saWN5TWl4ID0gcG9saWN5TWl4OwotICAgIGlucHV0RGVzYy0+YWRkQXVkaW9TZXNzaW9uKHNlc3Npb24sIGF1ZGlvU2Vzc2lvbik7CiAKICAgICBhZGRJbnB1dChpbnB1dCwgaW5wdXREZXNjKTsKICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CkBAIC0xODI3LDQyOCArMjE5NCwyNDQgQEAKICAgICByZXR1cm4gaW5wdXQ7CiB9CiAKLS8vc3RhdGljCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNDb25jdXJyZW50U291cmNlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICByZXR1cm4gKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgfHwKLSAgICAgICAgICAgIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSB8fAotICAgICAgICAgICAgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfRk1fVFVORVIpOwotfQorICAgIEFMT0dWKCIlcyBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAKLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppc0NvbmN1cmVudENhcHR1cmVBbGxvd2VkKGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXREZXNjLAotICAgICAgICBjb25zdCBzcDxBdWRpb1Nlc3Npb24+JiBhdWRpb1Nlc3Npb24pCi17Ci0gICAgLy8gRG8gbm90IGFsbG93IGNhcHR1cmUgaWYgYW4gYWN0aXZlIHZvaWNlIGNhbGwgaXMgdXNpbmcgYSBzb2Z0d2FyZSBwYXRjaCBhbmQKLSAgICAvLyB0aGUgY2FsbCBUWCBzb3VyY2UgZGV2aWNlIGlzIG9uIHRoZSBzYW1lIEhXIG1vZHVsZS4KLSAgICAvLyBGSVhNRTogd291bGQgYmUgYmV0dGVyIHRvIHJlZmluZSB0byBvbmx5IGlucHV0cyB3aG9zZSBwcm9maWxlIGNvbm5lY3RzIHRvIHRoZQotICAgIC8vIGNhbGwgVFggZGV2aWNlIGJ1dCB0aGlzIGluZm9ybWF0aW9uIGlzIG5vdCBpbiB0aGUgYXVkaW8gcGF0Y2gKLSAgICBpZiAobUNhbGxUeFBhdGNoICE9IDAgJiYKLSAgICAgICAgaW5wdXREZXNjLT5nZXRNb2R1bGVIYW5kbGUoKSA9PSBtQ2FsbFR4UGF0Y2gtPm1QYXRjaC5zb3VyY2VzWzBdLmV4dC5kZXZpY2UuaHdfbW9kdWxlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBzdGFydGluZyBjb25jdXJyZW50IGNhcHR1cmUgaXMgZW5hYmxlZCBpZjoKLSAgICAvLyAxKSBjYXB0dXJpbmcgZm9yIHJlLXJvdXRpbmcKLSAgICAvLyAyKSBjYXB0dXJpbmcgZm9yIEhPVFdPUkQgc291cmNlCi0gICAgLy8gMykgY2FwdHVyaW5nIGZvciBGTSBUVU5FUiBzb3VyY2UKLSAgICAvLyAzKSBBbGwgb3RoZXIgYWN0aXZlIGNhcHR1cmVzIGFyZSBlaXRoZXIgZm9yIHJlLXJvdXRpbmcgb3IgSE9UV09SRAotCi0gICAgaWYgKGlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkgfHwKLSAgICAgICAgICAgIGlzQ29uY3VycmVudFNvdXJjZShhdWRpb1Nlc3Npb24tPmlucHV0U291cmNlKCkpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGZvciAoY29uc3QgYXV0byYgYWN0aXZlSW5wdXQgOiBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpKSB7Ci0gICAgICAgIGlmICghaXNDb25jdXJyZW50U291cmNlKGFjdGl2ZUlucHV0LT5pbnB1dFNvdXJjZSh0cnVlKSkgJiYKLSAgICAgICAgICAgICAgICAhaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoYWN0aXZlSW5wdXQtPm1EZXZpY2UpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gRklYTUU6IHJlbW92ZSB3aGVuIGNvbmN1cnJlbnQgY2FwdHVyZSBpcyByZWFkeS4gVGhpcyBpcyBhIGhhY2sgdG8gd29yayBhcm91bmQgYnVnIGIvNjMwODM1MzcuCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6c291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSgpIHsKLSAgICBpZiAoIW1IYXNDb21wdXRlZFNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUpIHsKLSAgICAgICAgYm9vbCBzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlID0gZmFsc2U7Ci0gICAgICAgIHVuc2lnbmVkIGludCBudW1Nb2R1bGVzID0gMDsKLSAgICAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IqIG5Nb2R1bGVzID0gTlVMTDsKLQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBTb3VuZFRyaWdnZXI6Omxpc3RNb2R1bGVzKG5Nb2R1bGVzLCAmbnVtTW9kdWxlcyk7Ci0gICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgbnVtTW9kdWxlcyAhPSAwKSB7Ci0gICAgICAgICAgICBuTW9kdWxlcyA9IChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciopIGNhbGxvYygKLSAgICAgICAgICAgICAgICAgICAgbnVtTW9kdWxlcywgc2l6ZW9mKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yKSk7Ci0gICAgICAgICAgICBpZiAobk1vZHVsZXMgPT0gTlVMTCkgewotICAgICAgICAgICAgICAvLyBXZSBmYWlsZWQgdG8gbWFsbG9jIHRoZSBidWZmZXIsIHNvIGp1c3Qgc2F5IG5vIGZvciBub3csIGFuZCBob3BlIHRoYXQgd2UgaGF2ZSBtb3JlCi0gICAgICAgICAgICAgIC8vIHJhbSB0aGUgbmV4dCB0aW1lIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLgotICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIGFsbG9jYXRlIGJ1ZmZlciBmb3IgbW9kdWxlIGRlc2NyaXB0b3JzIik7Ci0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzID0gU291bmRUcmlnZ2VyOjpsaXN0TW9kdWxlcyhuTW9kdWxlcywgJm51bU1vZHVsZXMpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIHNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUgPSB0cnVlOwotICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtTW9kdWxlczsgKytpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUgJj0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBuTW9kdWxlc1tpXS5wcm9wZXJ0aWVzLmNvbmN1cnJlbnRfY2FwdHVyZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmcmVlKG5Nb2R1bGVzKTsKLSAgICAgICAgfQotICAgICAgICBtU291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSA9IHNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmU7Ci0gICAgICAgIG1IYXNDb21wdXRlZFNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmUgPSB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gbVNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmU7Ci19Ci0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdGFydElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uY3VycmVuY3lfdHlwZV9fbWFza190ICpjb25jdXJyZW5jeSkKLXsKLQotICAgIEFMT0dWKCJBdWRpb1BvbGljeU1hbmFnZXI6OnN0YXJ0SW5wdXQoaW5wdXQ6JWQsIHNlc3Npb246JWQsIHNpbGVuY2VkOiVkLCBjb25jdXJyZW5jeTolZCkiLAotICAgICAgICAgICAgaW5wdXQsIHNlc3Npb24sIHNpbGVuY2VkLCAqY29uY3VycmVuY3kpOwotCi0gICAgKmNvbmN1cnJlbmN5ID0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX05PTkU7Ci0KLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdGFydElucHV0KCkgdW5rbm93biBpbnB1dCAlZCIsIGlucHV0KTsKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy5nZXRJbnB1dEZvckNsaWVudChwb3J0SWQpOworICAgIGlmIChpbnB1dERlc2MgPT0gMCkgeworICAgICAgICBBTE9HVygiJXMgbm8gaW5wdXQgZm9yIGNsaWVudCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7Ci0KLSAgICBzcDxBdWRpb1Nlc3Npb24+IGF1ZGlvU2Vzc2lvbiA9IGlucHV0RGVzYy0+Z2V0QXVkaW9TZXNzaW9uKHNlc3Npb24pOwotICAgIGlmIChhdWRpb1Nlc3Npb24gPT0gMCkgewotICAgICAgICBBTE9HVygic3RhcnRJbnB1dCgpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sIGlucHV0KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLS8vIEZJWE1FOiBkaXNhYmxlIGNvbmN1cnJlbnQgY2FwdHVyZSB1bnRpbCBVSSBpcyByZWFkeQotI2lmIDAKLSAgICBpZiAoIWlzQ29uY3VyZW50Q2FwdHVyZUFsbG93ZWQoaW5wdXREZXNjLCBhdWRpb1Nlc3Npb24pKSB7Ci0gICAgICAgIEFMT0dXKCJzdGFydElucHV0KCVkKSBmYWlsZWQ6IG90aGVyIGlucHV0IGFscmVhZHkgc3RhcnRlZCIsIGlucHV0KTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IGlucHV0RGVzYy0+bUlvSGFuZGxlOworICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IGNsaWVudCA9IGlucHV0RGVzYy0+Z2V0Q2xpZW50KHBvcnRJZCk7CisgICAgaWYgKGNsaWVudC0+YWN0aXZlKCkpIHsKKyAgICAgICAgQUxPR1coIiVzIGlucHV0ICVkIGNsaWVudCAlZCBhbHJlYWR5IHN0YXJ0ZWQiLCBfX0ZVTkNUSU9OX18sIGlucHV0LCBjbGllbnQtPnBvcnRJZCgpKTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIGlmIChpc0luQ2FsbCgpKSB7Ci0gICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FMTDsKKyAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiA9IGNsaWVudC0+c2Vzc2lvbigpOworCisgICAgQUxPR1YoIiVzIGlucHV0OiVkLCBzZXNzaW9uOiVkKSIsIF9fRlVOQ1RJT05fXywgaW5wdXQsIHNlc3Npb24pOworCisgICAgVmVjdG9yPHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPj4gYWN0aXZlSW5wdXRzID0gbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKTsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IGlucHV0RGVzYy0+c3RhcnQoKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CiAgICAgfQotICAgIGlmIChtSW5wdXRzLmFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKCkgIT0gMCkgewotICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkU7Ci0gICAgfQotI2Vsc2UKLSAgICBpZiAoIWlzX3ZpcnR1YWxfaW5wdXRfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKLSAgICAgICAgaWYgKG1DYWxsVHhQYXRjaCAhPSAwICYmCi0gICAgICAgICAgICBpbnB1dERlc2MtPmdldE1vZHVsZUhhbmRsZSgpID09IG1DYWxsVHhQYXRjaC0+bVBhdGNoLnNvdXJjZXNbMF0uZXh0LmRldmljZS5od19tb2R1bGUpIHsKLSAgICAgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCVkKSBmYWlsZWQ6IGNhbGwgaW4gcHJvZ3Jlc3MiLCBpbnB1dCk7Ci0gICAgICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBTEw7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLQotICAgICAgICBWZWN0b3I8c3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+PiBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOwotCi0gICAgICAgIC8vIElmIGEgVUlEIGlzIGlkbGUgYW5kIHJlY29yZHMgc2lsZW5jZSBhbmQgYW5vdGhlciBub3Qgc2lsZW5jZWQgcmVjb3JkaW5nIHN0YXJ0cwotICAgICAgICAvLyBmcm9tIGFub3RoZXIgVUlEIChpZGxlIG9yIGFjdGl2ZSkgd2Ugc3RvcCB0aGUgY3VycmVudCBpZGxlIFVJRCByZWNvcmRpbmcgaW4KLSAgICAgICAgLy8gZmF2b3Igb2YgdGhlIG5ldyBvbmUgLSAiVGhlcmUgY2FuIGJlIG9ubHkgb25lIiBUTQotICAgICAgICBpZiAoIXNpbGVuY2VkKSB7Ci0gICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdGl2ZURlc2MgOiBhY3RpdmVJbnB1dHMpIHsKLSAgICAgICAgICAgICAgICBpZiAoKGF1ZGlvU2Vzc2lvbi0+ZmxhZ3MoKSAmIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSkgIT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlRGVzYy0+Z2V0SWQoKSA9PSBpbnB1dERlc2MtPmdldElkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIEF1ZGlvU2Vzc2lvbkNvbGxlY3Rpb24gYWN0aXZlU2Vzc2lvbnMgPSBhY3RpdmVEZXNjLT5nZXRBdWRpb1Nlc3Npb25zKAotICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKmFjdGl2ZU9ubHkqLyk7Ci0gICAgICAgICAgICAgICAgc3A8QXVkaW9TZXNzaW9uPiBhY3RpdmVTZXNzaW9uID0gYWN0aXZlU2Vzc2lvbnMudmFsdWVBdCgwKTsKLSAgICAgICAgICAgICAgICBpZiAoYWN0aXZlU2Vzc2lvbi0+aXNTaWxlbmNlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGFjdGl2ZUlucHV0ID0gYWN0aXZlRGVzYy0+bUlvSGFuZGxlOwotICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3QgYWN0aXZlU2Vzc2lvbklkID0gYWN0aXZlU2Vzc2lvbi0+c2Vzc2lvbigpOwotICAgICAgICAgICAgICAgICAgICBzdG9wSW5wdXQoYWN0aXZlSW5wdXQsIGFjdGl2ZVNlc3Npb25JZCk7Ci0gICAgICAgICAgICAgICAgICAgIHJlbGVhc2VJbnB1dChhY3RpdmVJbnB1dCwgYWN0aXZlU2Vzc2lvbklkKTsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoInN0YXJ0SW5wdXQoJWQpIHN0b3BwaW5nIHNpbGVuY2VkIGlucHV0ICVkIiwgaW5wdXQsIGFjdGl2ZUlucHV0KTsKLSAgICAgICAgICAgICAgICAgICAgYWN0aXZlSW5wdXRzID0gbUlucHV0cy5nZXRBY3RpdmVJbnB1dHMoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdGl2ZURlc2MgOiBhY3RpdmVJbnB1dHMpIHsKLSAgICAgICAgICAgIGlmICgoYXVkaW9TZXNzaW9uLT5mbGFncygpICYgQVVESU9fSU5QVVRfRkxBR19NTUFQX05PSVJRKSAhPSAwICYmCi0gICAgICAgICAgICAgICAgICAgIGFjdGl2ZURlc2MtPmdldElkKCkgPT0gaW5wdXREZXNjLT5nZXRJZCgpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IGFjdGl2ZVNvdXJjZSA9IGFjdGl2ZURlc2MtPmlucHV0U291cmNlKHRydWUpOwotICAgICAgICAgICAgaWYgKGF1ZGlvU2Vzc2lvbi0+aW5wdXRTb3VyY2UoKSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgewotICAgICAgICAgICAgICAgIGlmIChhY3RpdmVTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZURlc2MtPmhhc1ByZWVtcHRlZFNlc3Npb24oc2Vzc2lvbikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCJzdGFydElucHV0KCVkKSBmYWlsZWQgZm9yIEhPVFdPUkQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm90aGVyIGlucHV0ICVkIGFscmVhZHkgc3RhcnRlZCBmb3IgSE9UV09SRCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwgYWN0aXZlRGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfSE9UV09SRDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJzdGFydElucHV0KCVkKSBmYWlsZWQgZm9yIEhPVFdPUkQ6IG90aGVyIGlucHV0ICVkIGFscmVhZHkgc3RhcnRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBhY3RpdmVEZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBUFRVUkU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGlmIChhY3RpdmVTb3VyY2UgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1coInN0YXJ0SW5wdXQoJWQpIGZhaWxlZDogb3RoZXIgaW5wdXQgJWQgYWxyZWFkeSBzdGFydGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIGFjdGl2ZURlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgICAgICAgICAgICAgICAgICpjb25jdXJyZW5jeSB8PSBBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FQVFVSRTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIFdlIG9ubHkgbmVlZCB0byBjaGVjayBpZiB0aGUgc291bmQgdHJpZ2dlciBzZXNzaW9uIHN1cHBvcnRzIGNvbmN1cnJlbnQgY2FwdHVyZSBpZiB0aGUKLSAgICAgICAgLy8gaW5wdXQgaXMgYWxzbyBhIHNvdW5kIHRyaWdnZXIgaW5wdXQuIE90aGVyd2lzZSwgd2Ugc2hvdWxkIHByZWVtcHQgYW55IGhvdHdvcmQgc3RyZWFtCi0gICAgICAgIC8vIHRoYXQncyBydW5uaW5nLgotICAgICAgICBjb25zdCBib29sIGFsbG93Q29uY3VycmVudFdpdGhTb3VuZFRyaWdnZXIgPQotICAgICAgICAgICAgaW5wdXREZXNjLT5pc1NvdW5kVHJpZ2dlcigpID8gc291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZSgpIDogZmFsc2U7Ci0KLSAgICAgICAgLy8gaWYgY2FwdHVyZSBpcyBhbGxvd2VkLCBwcmVlbXB0IGN1cnJlbnRseSBhY3RpdmUgSE9UV09SRCBjYXB0dXJlcwotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGFjdGl2ZURlc2MgOiBhY3RpdmVJbnB1dHMpIHsKLSAgICAgICAgICAgIGlmIChhbGxvd0NvbmN1cnJlbnRXaXRoU291bmRUcmlnZ2VyICYmIGFjdGl2ZURlc2MtPmlzU291bmRUcmlnZ2VyKCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgYWN0aXZlU291cmNlID0gYWN0aXZlRGVzYy0+aW5wdXRTb3VyY2UodHJ1ZSk7Ci0gICAgICAgICAgICBpZiAoYWN0aXZlU291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSB7Ci0gICAgICAgICAgICAgICAgQXVkaW9TZXNzaW9uQ29sbGVjdGlvbiBhY3RpdmVTZXNzaW9ucyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBhY3RpdmVEZXNjLT5nZXRBdWRpb1Nlc3Npb25zKHRydWUgLyphY3RpdmVPbmx5Ki8pOwotICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhY3RpdmVTZXNzaW9uID0gYWN0aXZlU2Vzc2lvbnMua2V5QXQoMCk7Ci0gICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgYWN0aXZlSGFuZGxlID0gYWN0aXZlRGVzYy0+bUlvSGFuZGxlOwotICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19zZXNzaW9uX3Q+IHNlc3Npb25zID0gYWN0aXZlRGVzYy0+Z2V0UHJlZW1wdGVkU2Vzc2lvbnMoKTsKLSAgICAgICAgICAgICAgICAqY29uY3VycmVuY3kgfD0gQVBJX0lOUFVUX0NPTkNVUlJFTkNZX1BSRUVNUFQ7Ci0gICAgICAgICAgICAgICAgc2Vzc2lvbnMuYWRkKGFjdGl2ZVNlc3Npb24pOwotICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+c2V0UHJlZW1wdGVkU2Vzc2lvbnMoc2Vzc2lvbnMpOwotICAgICAgICAgICAgICAgIHN0b3BJbnB1dChhY3RpdmVIYW5kbGUsIGFjdGl2ZVNlc3Npb24pOwotICAgICAgICAgICAgICAgIHJlbGVhc2VJbnB1dChhY3RpdmVIYW5kbGUsIGFjdGl2ZVNlc3Npb24pOwotICAgICAgICAgICAgICAgIEFMT0dWKCJzdGFydElucHV0KCVkKSBmb3IgSE9UV09SRCBwcmVlbXB0aW5nIEhPVFdPUkQgaW5wdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBhY3RpdmVEZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotI2VuZGlmCi0KLSAgICAvLyBNYWtlIHN1cmUgd2Ugc3RhcnQgd2l0aCB0aGUgY29ycmVjdCBzaWxlbmNlIHN0YXRlCi0gICAgYXVkaW9TZXNzaW9uLT5zZXRTaWxlbmNlZChzaWxlbmNlZCk7CiAKICAgICAvLyBpbmNyZW1lbnQgYWN0aXZpdHkgY291bnQgYmVmb3JlIGNhbGxpbmcgZ2V0TmV3SW5wdXREZXZpY2UoKSBiZWxvdyBhcyBvbmx5IGFjdGl2ZSBzZXNzaW9ucwogICAgIC8vIGFyZSBjb25zaWRlcmVkIGZvciBkZXZpY2Ugc2VsZWN0aW9uCi0gICAgYXVkaW9TZXNzaW9uLT5jaGFuZ2VBY3RpdmVDb3VudCgxKTsKKyAgICBpbnB1dERlc2MtPnNldENsaWVudEFjdGl2ZShjbGllbnQsIHRydWUpOwogCi0gICAgLy8gUm91dGluZz8KLSAgICBtSW5wdXRSb3V0ZXMuaW5jUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKLQotICAgIGlmIChhdWRpb1Nlc3Npb24tPmFjdGl2ZUNvdW50KCkgPT0gMSB8fCBtSW5wdXRSb3V0ZXMuZ2V0QW5kQ2xlYXJSb3V0ZUNoYW5nZWQoc2Vzc2lvbikpIHsKLSAgICAgICAgLy8gaW5kaWNhdGUgYWN0aXZlIGNhcHR1cmUgdG8gc291bmQgdHJpZ2dlciBzZXJ2aWNlIGlmIHN0YXJ0aW5nIGNhcHR1cmUgZnJvbSBhIG1pYyBvbgotICAgICAgICAvLyBwcmltYXJ5IEhXIG1vZHVsZQotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXREZXNjKTsKLSAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXQsIGRldmljZSwgdHJ1ZSAvKiBmb3JjZSAqLyk7Ci0KLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5wdXREZXNjLT5zdGFydCgpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBtSW5wdXRSb3V0ZXMuZGVjUm91dGVBY3Rpdml0eShzZXNzaW9uKTsKLSAgICAgICAgICAgIGF1ZGlvU2Vzc2lvbi0+Y2hhbmdlQWN0aXZlQ291bnQoLTEpOwotICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChpbnB1dERlc2MtPmdldEF1ZGlvU2Vzc2lvbkNvdW50KHRydWUvKmFjdGl2ZU9ubHkqLykgPT0gMSkgewotICAgICAgICAgICAgLy8gaWYgaW5wdXQgbWFwcyB0byBhIGR5bmFtaWMgcG9saWN5IHdpdGggYW4gYWN0aXZpdHkgbGlzdGVuZXIsIG5vdGlmeSBvZiBzdGF0ZSBjaGFuZ2UKLSAgICAgICAgICAgIGlmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4ICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICYmICgoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uRHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bURldmljZUFkZHJlc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICBNSVhfU1RBVEVfTUlYSU5HKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByaW1hcnlJbnB1dERldmljZXMgPSBhdmFpbGFibGVQcmltYXJ5SW5wdXREZXZpY2VzKCk7Ci0gICAgICAgICAgICBpZiAoKChkZXZpY2UgJiBwcmltYXJ5SW5wdXREZXZpY2VzICYgfkFVRElPX0RFVklDRV9CSVRfSU4pICE9IDApICYmCi0gICAgICAgICAgICAgICAgICAgIG1JbnB1dHMuYWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMocHJpbWFyeUlucHV0RGV2aWNlcykgPT0gMSkgewotICAgICAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKHRydWUpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBhdXRvbWF0aWNhbGx5IGVuYWJsZSB0aGUgcmVtb3RlIHN1Ym1peCBvdXRwdXQgd2hlbiBpbnB1dCBpcyBzdGFydGVkIGlmIG5vdAotICAgICAgICAgICAgLy8gdXNlZCBieSBhIHBvbGljeSBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKLSAgICAgICAgICAgIC8vIEZvciByZW1vdGUgc3VibWl4IChhIHZpcnR1YWwgZGV2aWNlKSwgd2Ugb3BlbiBvbmx5IG9uZSBpbnB1dCBwZXIgY2FwdHVyZSByZXF1ZXN0LgotICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgewotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gIiIpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCAicmVtb3RlLXN1Ym1peCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgIC8vIGluZGljYXRlIGFjdGl2ZSBjYXB0dXJlIHRvIHNvdW5kIHRyaWdnZXIgc2VydmljZSBpZiBzdGFydGluZyBjYXB0dXJlIGZyb20gYSBtaWMgb24KKyAgICAvLyBwcmltYXJ5IEhXIG1vZHVsZQorICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IGdldE5ld0lucHV0RGV2aWNlKGlucHV0RGVzYyk7CisgICAgaWYgKGRldmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHN0YXR1cyA9IHNldElucHV0RGV2aWNlKGlucHV0LCBkZXZpY2UsIHRydWUgLyogZm9yY2UgKi8pOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dXKCIlcyBubyBuZXcgaW5wdXQgZGV2aWNlIGNhbiBiZSBmb3VuZCBmb3IgZGVzY3JpcHRvciAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpbnB1dERlc2MtPmdldElkKCkpOworICAgICAgICBzdGF0dXMgPSBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgQUxPR1YoIkF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRJbnB1dCgpIGlucHV0IHNvdXJjZSA9ICVkIiwgYXVkaW9TZXNzaW9uLT5pbnB1dFNvdXJjZSgpKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SICYmIGlucHV0RGVzYy0+YWN0aXZlQ291bnQoKSA9PSAxKSB7CisgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBpbnB1dERlc2MtPm1Qb2xpY3lNaXgucHJvbW90ZSgpOworICAgICAgICAvLyBpZiBpbnB1dCBtYXBzIHRvIGEgZHluYW1pYyBwb2xpY3kgd2l0aCBhbiBhY3Rpdml0eSBsaXN0ZW5lciwgbm90aWZ5IG9mIHN0YXRlIGNoYW5nZQorICAgICAgICBpZiAoKHBvbGljeU1peCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICYmICgocG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUocG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX01JWElORyk7CisgICAgICAgIH0KIAotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgRGV2aWNlVmVjdG9yIHByaW1hcnlJbnB1dERldmljZXMgPSBhdmFpbGFibGVQcmltYXJ5TW9kdWxlSW5wdXREZXZpY2VzKCk7CisgICAgICAgIGlmIChwcmltYXJ5SW5wdXREZXZpY2VzLmNvbnRhaW5zKGRldmljZSkgJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRzLmFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKHByaW1hcnlJbnB1dERldmljZXMpID09IDEpIHsKKyAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKHRydWUpOworICAgICAgICB9CisKKyAgICAgICAgLy8gYXV0b21hdGljYWxseSBlbmFibGUgdGhlIHJlbW90ZSBzdWJtaXggb3V0cHV0IHdoZW4gaW5wdXQgaXMgc3RhcnRlZCBpZiBub3QKKyAgICAgICAgLy8gdXNlZCBieSBhIHBvbGljeSBtaXggb2YgdHlwZSBNSVhfVFlQRV9SRUNPUkRFUlMKKyAgICAgICAgLy8gRm9yIHJlbW90ZSBzdWJtaXggKGEgdmlydHVhbCBkZXZpY2UpLCB3ZSBvcGVuIG9ubHkgb25lIGlucHV0IHBlciBjYXB0dXJlIHJlcXVlc3QuCisgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPmdldERldmljZVR5cGUoKSkpIHsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgoIiIpOworICAgICAgICAgICAgaWYgKHBvbGljeU1peCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgICAgICAgICAgYWRkcmVzcyA9IHBvbGljeU1peC0+bURldmljZUFkZHJlc3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWRkcmVzcyAhPSAiIikgeworICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsICJyZW1vdGUtc3VibWl4IiwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gUmVzdG9yZSBjbGllbnQgYWN0aXZpdHkgc3RhdGUuCisgICAgICAgIGlucHV0RGVzYy0+c2V0Q2xpZW50QWN0aXZlKGNsaWVudCwgZmFsc2UpOworICAgICAgICBpbnB1dERlc2MtPnN0b3AoKTsKKyAgICB9CisKKyAgICBBTE9HVigiJXMgaW5wdXQgJWQgc291cmNlID0gJWQgc3RhdHVzID0gJWQgZXhpdCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlucHV0LCBjbGllbnQtPnNvdXJjZSgpLCBzdGF0dXMpOworCisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzdG9wSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIEFMT0dWKCJzdG9wSW5wdXQoKSBpbnB1dCAlZCIsIGlucHV0KTsKLSAgICBzc2l6ZV90IGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlucHV0KTsKLSAgICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgICAgIEFMT0dXKCJzdG9wSW5wdXQoKSB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOworICAgIEFMT0dWKCIlcyBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy5nZXRJbnB1dEZvckNsaWVudChwb3J0SWQpOworICAgIGlmIChpbnB1dERlc2MgPT0gMCkgeworICAgICAgICBBTE9HVygiJXMgbm8gaW5wdXQgZm9yIGNsaWVudCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7Ci0KLSAgICBzcDxBdWRpb1Nlc3Npb24+IGF1ZGlvU2Vzc2lvbiA9IGlucHV0RGVzYy0+Z2V0QXVkaW9TZXNzaW9uKHNlc3Npb24pOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIHVua25vd24gc2Vzc2lvbiAlZCBvbiBpbnB1dCAlZCIsIHNlc3Npb24sIGlucHV0KTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0KLSAgICBpZiAoYXVkaW9TZXNzaW9uLT5hY3RpdmVDb3VudCgpID09IDApIHsKLSAgICAgICAgQUxPR1coInN0b3BJbnB1dCgpIGlucHV0ICVkIGFscmVhZHkgc3RvcHBlZCIsIGlucHV0KTsKKyAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IGlucHV0RGVzYy0+bUlvSGFuZGxlOworICAgIHNwPFJlY29yZENsaWVudERlc2NyaXB0b3I+IGNsaWVudCA9IGlucHV0RGVzYy0+Z2V0Q2xpZW50KHBvcnRJZCk7CisgICAgaWYgKCFjbGllbnQtPmFjdGl2ZSgpKSB7CisgICAgICAgIEFMT0dXKCIlcyBpbnB1dCAlZCBjbGllbnQgJWQgYWxyZWFkeSBzdG9wcGVkIiwgX19GVU5DVElPTl9fLCBpbnB1dCwgY2xpZW50LT5wb3J0SWQoKSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBhdWRpb1Nlc3Npb24tPmNoYW5nZUFjdGl2ZUNvdW50KC0xKTsKKyAgICBpbnB1dERlc2MtPnNldENsaWVudEFjdGl2ZShjbGllbnQsIGZhbHNlKTsKIAotICAgIC8vIFJvdXRpbmc/Ci0gICAgbUlucHV0Um91dGVzLmRlY1JvdXRlQWN0aXZpdHkoc2Vzc2lvbik7Ci0KLSAgICBpZiAoYXVkaW9TZXNzaW9uLT5hY3RpdmVDb3VudCgpID09IDApIHsKLSAgICAgICAgaW5wdXREZXNjLT5zdG9wKCk7Ci0gICAgICAgIGlmIChpbnB1dERlc2MtPmlzQWN0aXZlKCkpIHsKLSAgICAgICAgICAgIHNldElucHV0RGV2aWNlKGlucHV0LCBnZXROZXdJbnB1dERldmljZShpbnB1dERlc2MpLCBmYWxzZSAvKiBmb3JjZSAqLyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBpZiBpbnB1dCBtYXBzIHRvIGEgZHluYW1pYyBwb2xpY3kgd2l0aCBhbiBhY3Rpdml0eSBsaXN0ZW5lciwgbm90aWZ5IG9mIHN0YXRlIGNoYW5nZQotICAgICAgICAgICAgaWYgKChpbnB1dERlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCkKLSAgICAgICAgICAgICAgICAgICAgJiYgKChpbnB1dERlc2MtPm1Qb2xpY3lNaXgtPm1DYkZsYWdzICYgQXVkaW9NaXg6OmtDYkZsYWdOb3RpZnlBY3Rpdml0eSkgIT0gMCkpIHsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgIE1JWF9TVEFURV9JRExFKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gYXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IG91dHB1dCB3aGVuIGlucHV0IGlzIHN0b3BwZWQgaWYgbm90Ci0gICAgICAgICAgICAvLyB1c2VkIGJ5IGEgcG9saWN5IG1peCBvZiB0eXBlIE1JWF9UWVBFX1JFQ09SREVSUwotICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX3JlbW90ZV9zdWJtaXhfZGV2aWNlKGlucHV0RGVzYy0+bURldmljZSkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KCIiKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5wdXREZXNjLT5tUG9saWN5TWl4ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGlucHV0RGVzYy0+bVBvbGljeU1peC0+bU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgewotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzID0gaW5wdXREZXNjLT5tUG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGFkZHJlc3MgIT0gIiIpIHsKLSAgICAgICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLCAicmVtb3RlLXN1Ym1peCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGlucHV0RGVzYy0+bURldmljZTsKLSAgICAgICAgICAgIHJlc2V0SW5wdXREZXZpY2UoaW5wdXQpOwotCi0gICAgICAgICAgICAvLyBpbmRpY2F0ZSBpbmFjdGl2ZSBjYXB0dXJlIHRvIHNvdW5kIHRyaWdnZXIgc2VydmljZSBpZiBzdG9wcGluZyBjYXB0dXJlIGZyb20gYSBtaWMgb24KLSAgICAgICAgICAgIC8vIHByaW1hcnkgSFcgbW9kdWxlCi0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJpbWFyeUlucHV0RGV2aWNlcyA9IGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKTsKLSAgICAgICAgICAgIGlmICgoKGRldmljZSAmIHByaW1hcnlJbnB1dERldmljZXMgJiB+QVVESU9fREVWSUNFX0JJVF9JTikgIT0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgbUlucHV0cy5hY3RpdmVJbnB1dHNDb3VudE9uRGV2aWNlcyhwcmltYXJ5SW5wdXREZXZpY2VzKSA9PSAwKSB7Ci0gICAgICAgICAgICAgICAgU291bmRUcmlnZ2VyOjpzZXRDYXB0dXJlU3RhdGUoZmFsc2UpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXREZXNjLT5jbGVhclByZWVtcHRlZFNlc3Npb25zKCk7CisgICAgaW5wdXREZXNjLT5zdG9wKCk7CisgICAgaWYgKGlucHV0RGVzYy0+aXNBY3RpdmUoKSkgeworICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dCwgZ2V0TmV3SW5wdXREZXZpY2UoaW5wdXREZXNjKSwgZmFsc2UgLyogZm9yY2UgKi8pOworICAgIH0gZWxzZSB7CisgICAgICAgIHNwPEF1ZGlvUG9saWN5TWl4PiBwb2xpY3lNaXggPSBpbnB1dERlc2MtPm1Qb2xpY3lNaXgucHJvbW90ZSgpOworICAgICAgICAvLyBpZiBpbnB1dCBtYXBzIHRvIGEgZHluYW1pYyBwb2xpY3kgd2l0aCBhbiBhY3Rpdml0eSBsaXN0ZW5lciwgbm90aWZ5IG9mIHN0YXRlIGNoYW5nZQorICAgICAgICBpZiAoKHBvbGljeU1peCAhPSBOVUxMKQorICAgICAgICAgICAgICAgICYmICgocG9saWN5TWl4LT5tQ2JGbGFncyAmIEF1ZGlvTWl4OjprQ2JGbGFnTm90aWZ5QWN0aXZpdHkpICE9IDApKSB7CisgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUocG9saWN5TWl4LT5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgTUlYX1NUQVRFX0lETEUpOwogICAgICAgICB9CisKKyAgICAgICAgLy8gYXV0b21hdGljYWxseSBkaXNhYmxlIHRoZSByZW1vdGUgc3VibWl4IG91dHB1dCB3aGVuIGlucHV0IGlzIHN0b3BwZWQgaWYgbm90CisgICAgICAgIC8vIHVzZWQgYnkgYSBwb2xpY3kgbWl4IG9mIHR5cGUgTUlYX1RZUEVfUkVDT1JERVJTCisgICAgICAgIGlmIChhdWRpb19pc19yZW1vdGVfc3VibWl4X2RldmljZShpbnB1dERlc2MtPmdldERldmljZVR5cGUoKSkpIHsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IFN0cmluZzgoIiIpOworICAgICAgICAgICAgaWYgKHBvbGljeU1peCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYWRkcmVzcyA9IFN0cmluZzgoIjAiKTsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAocG9saWN5TWl4LT5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgICAgICAgICAgYWRkcmVzcyA9IHBvbGljeU1peC0+bURldmljZUFkZHJlc3M7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoYWRkcmVzcyAhPSAiIikgeworICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsICJyZW1vdGUtc3VibWl4IiwgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlc2V0SW5wdXREZXZpY2UoaW5wdXQpOworCisgICAgICAgIC8vIGluZGljYXRlIGluYWN0aXZlIGNhcHR1cmUgdG8gc291bmQgdHJpZ2dlciBzZXJ2aWNlIGlmIHN0b3BwaW5nIGNhcHR1cmUgZnJvbSBhIG1pYyBvbgorICAgICAgICAvLyBwcmltYXJ5IEhXIG1vZHVsZQorICAgICAgICBEZXZpY2VWZWN0b3IgcHJpbWFyeUlucHV0RGV2aWNlcyA9IGF2YWlsYWJsZVByaW1hcnlNb2R1bGVJbnB1dERldmljZXMoKTsKKyAgICAgICAgaWYgKHByaW1hcnlJbnB1dERldmljZXMuY29udGFpbnMoaW5wdXREZXNjLT5nZXREZXZpY2UoKSkgJiYKKyAgICAgICAgICAgICAgICBtSW5wdXRzLmFjdGl2ZUlucHV0c0NvdW50T25EZXZpY2VzKHByaW1hcnlJbnB1dERldmljZXMpID09IDApIHsKKyAgICAgICAgICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKKyAgICAgICAgfQorICAgICAgICBpbnB1dERlc2MtPmNsZWFyUHJlZW1wdGVkU2Vzc2lvbnMoKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6cmVsZWFzZUlucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpICVkIiwgaW5wdXQpOwotICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW5wdXQpOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgQUxPR1coInJlbGVhc2VJbnB1dCgpIHJlbGVhc2luZyB1bmtub3duIGlucHV0ICVkIiwgaW5wdXQpOworICAgIEFMT0dWKCIlcyBwb3J0SWQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CisKKyAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy5nZXRJbnB1dEZvckNsaWVudChwb3J0SWQpOworICAgIGlmIChpbnB1dERlc2MgPT0gMCkgeworICAgICAgICBBTE9HVygiJXMgbm8gaW5wdXQgZm9yIGNsaWVudCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBzcDxSZWNvcmRDbGllbnREZXNjcmlwdG9yPiBjbGllbnQgPSBpbnB1dERlc2MtPmdldENsaWVudChwb3J0SWQpOworICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0ID0gaW5wdXREZXNjLT5tSW9IYW5kbGU7CiAKLSAgICAvLyBSb3V0aW5nCi0gICAgbUlucHV0Um91dGVzLnJlbW92ZVJvdXRlKHNlc3Npb24pOworICAgIEFMT0dWKCIlcyAlZCIsIF9fRlVOQ1RJT05fXywgaW5wdXQpOwogCi0gICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpbmRleCk7Ci0gICAgQUxPR19BU1NFUlQoaW5wdXREZXNjICE9IDApOworICAgIGlucHV0RGVzYy0+cmVtb3ZlQ2xpZW50KHBvcnRJZCk7CiAKLSAgICBzcDxBdWRpb1Nlc3Npb24+IGF1ZGlvU2Vzc2lvbiA9IGlucHV0RGVzYy0+Z2V0QXVkaW9TZXNzaW9uKHNlc3Npb24pOwotICAgIGlmIChhdWRpb1Nlc3Npb24gPT0gMCkgewotICAgICAgICBBTE9HVygicmVsZWFzZUlucHV0KCkgdW5rbm93biBzZXNzaW9uICVkIG9uIGlucHV0ICVkIiwgc2Vzc2lvbiwgaW5wdXQpOwotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKGF1ZGlvU2Vzc2lvbi0+b3BlbkNvdW50KCkgPT0gMCkgewotICAgICAgICBBTE9HVygicmVsZWFzZUlucHV0KCkgaW52YWxpZCBvcGVuIGNvdW50ICVkIG9uIHNlc3Npb24gJWQiLAotICAgICAgICAgICAgICBhdWRpb1Nlc3Npb24tPm9wZW5Db3VudCgpLCBzZXNzaW9uKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChhdWRpb1Nlc3Npb24tPmNoYW5nZU9wZW5Db3VudCgtMSkgPT0gMCkgewotICAgICAgICBpbnB1dERlc2MtPnJlbW92ZUF1ZGlvU2Vzc2lvbihzZXNzaW9uKTsKLSAgICB9Ci0KLSAgICBpZiAoaW5wdXREZXNjLT5nZXRPcGVuUmVmQ291bnQoKSA+IDApIHsKLSAgICAgICAgQUxPR1YoInJlbGVhc2VJbnB1dCgpIGV4aXQgPiAwIik7CisgICAgaWYgKGlucHV0RGVzYy0+Z2V0Q2xpZW50Q291bnQoKSA+IDApIHsKKyAgICAgICAgQUxPR1YoIiVzKCVkKSAlenUgY2xpZW50cyByZW1haW5pbmciLCBfX2Z1bmNfXywgcG9ydElkLCBpbnB1dERlc2MtPmdldENsaWVudENvdW50KCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogCiAgICAgY2xvc2VJbnB1dChpbnB1dCk7CiAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpOwotICAgIEFMT0dWKCJyZWxlYXNlSW5wdXQoKSBleGl0Iik7CisgICAgQUxPR1YoIiVzIGV4aXQiLCBfX0ZVTkNUSU9OX18pOwogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VBbGxJbnB1dHMoKSB7Ci0gICAgYm9vbCBwYXRjaFJlbW92ZWQgPSBmYWxzZTsKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZUFjdGl2ZUNsaWVudHMoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dCkKK3sKKyAgICBSZWNvcmRDbGllbnRWZWN0b3IgY2xpZW50cyA9IGlucHV0LT5jbGllbnRzTGlzdCh0cnVlKTsKIAotICAgIGZvciAoc2l6ZV90IGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgewotICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0gbUlucHV0cy52YWx1ZUF0KGlucHV0X2luZGV4KTsKLSAgICAgICAgc3NpemVfdCBwYXRjaF9pbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwotICAgICAgICBpZiAocGF0Y2hfaW5kZXggPj0gMCkgewotICAgICAgICAgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KHBhdGNoX2luZGV4KTsKLSAgICAgICAgICAgICh2b2lkKSAvKnN0YXR1c190IHN0YXR1cyovIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKLSAgICAgICAgICAgIG1BdWRpb1BhdGNoZXMucmVtb3ZlSXRlbXNBdChwYXRjaF9pbmRleCk7Ci0gICAgICAgICAgICBwYXRjaFJlbW92ZWQgPSB0cnVlOworICAgIGZvciAoY29uc3QgYXV0byYgY2xpZW50IDogY2xpZW50cykgeworICAgICAgICBjbG9zZUNsaWVudChjbGllbnQtPnBvcnRJZCgpKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjbG9zZUNsaWVudChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKK3sKKyAgICBzdG9wSW5wdXQocG9ydElkKTsKKyAgICByZWxlYXNlSW5wdXQocG9ydElkKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrQ2xvc2VJbnB1dHMoKSB7CisgICAgLy8gQWZ0ZXIgY29ubmVjdGluZyBvciBkaXNjb25uZWN0aW5nIGFuIGlucHV0IGRldmljZSwgY2xvc2UgaW5wdXQgaWY6CisgICAgLy8gLSBpdCBoYXMgbm8gY2xpZW50ICh3YXMganVzdCBvcGVuZWQgdG8gY2hlY2sgcHJvZmlsZSkgIE9SCisgICAgLy8gLSBub25lIG9mIGl0cyBzdXBwb3J0ZWQgZGV2aWNlcyBhcmUgY29ubmVjdGVkIGFueW1vcmUgT1IKKyAgICAvLyAtIG9uZSBvZiBpdHMgY2xpZW50cyBjYW5ub3QgYmUgcm91dGVkIHRvIG9uZSBvZiBpdHMgc3VwcG9ydGVkCisgICAgLy8gZGV2aWNlcyBhbnltb3JlLiBPdGhlcndpc2UgdXBkYXRlIGRldmljZSBzZWxlY3Rpb24KKyAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gaW5wdXRzVG9DbG9zZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0ID0gbUlucHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoaW5wdXQtPmNsaWVudHNMaXN0KCkuc2l6ZSgpID09IDAKKyAgICAgICAgICAgICAgICB8fCAhbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5jb250YWluc0F0TGVhc3RPbmUoaW5wdXQtPnN1cHBvcnRlZERldmljZXMoKSkKKyAgICAgICAgICAgICAgICB8fCAoaW5wdXQtPmdldFBvbGljeUF1ZGlvUG9ydCgpLT5nZXRGbGFncygpCisgICAgICAgICAgICAgICAgICAgICAgICAmIEFVRElPX0lOUFVUX0ZMQUdfTU1BUF9OT0lSUSkgIT0gMCkgeworICAgICAgICAgICAgaW5wdXRzVG9DbG9zZS5wdXNoX2JhY2sobUlucHV0cy5rZXlBdChpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib29sIGNsb3NlID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IGlucHV0LT5jbGllbnRzTGlzdCgpKSB7CisgICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKGNsaWVudC0+YXR0cmlidXRlcygpKTsKKyAgICAgICAgICAgICAgICBpZiAoIWlucHV0LT5zdXBwb3J0ZWREZXZpY2VzKCkuY29udGFpbnMoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBjbG9zZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChjbG9zZSkgeworICAgICAgICAgICAgICAgIGlucHV0c1RvQ2xvc2UucHVzaF9iYWNrKG1JbnB1dHMua2V5QXQoaSkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dC0+bUlvSGFuZGxlLCBnZXROZXdJbnB1dERldmljZShpbnB1dCkpOworICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIGlucHV0RGVzYy0+Y2xvc2UoKTsKICAgICB9Ci0gICAgbUlucHV0Um91dGVzLmNsZWFyKCk7Ci0gICAgbUlucHV0cy5jbGVhcigpOwotICAgIFNvdW5kVHJpZ2dlcjo6c2V0Q2FwdHVyZVN0YXRlKGZhbHNlKTsKLSAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwogCi0gICAgaWYgKHBhdGNoUmVtb3ZlZCkgewotICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOworICAgIGZvciAoY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaGFuZGxlIDogaW5wdXRzVG9DbG9zZSkgeworICAgICAgICBBTE9HVigiJXMgY2xvc2luZyBpbnB1dCAlZCIsIF9fZnVuY19fLCBoYW5kbGUpOworICAgICAgICBjbG9zZUlucHV0KGhhbmRsZSk7CiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXhNYXgpCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgaW50IGluZGV4TWluLCBpbnQgaW5kZXhNYXgpCiB7CiAgICAgQUxPR1YoImluaXRTdHJlYW1Wb2x1bWUoKSBzdHJlYW0gJWQsIG1pbiAlZCwgbWF4ICVkIiwgc3RyZWFtICwgaW5kZXhNaW4sIGluZGV4TWF4KTsKLSAgICBtVm9sdW1lQ3VydmVzLT5pbml0U3RyZWFtVm9sdW1lKHN0cmVhbSwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICBpZiAoaW5kZXhNaW4gPCAwIHx8IGluZGV4TWF4IDwgMCkgeworICAgICAgICBBTE9HRSgiJXMgZm9yIHN0cmVhbSAlZDogaW52YWxpZCBtaW4gJWQgb3IgbWF4ICVkIiwgX19mdW5jX18sIHN0cmVhbSAsIGluZGV4TWluLCBpbmRleE1heCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZ2V0Vm9sdW1lQ3VydmVzKHN0cmVhbSkuaW5pdFZvbHVtZShpbmRleE1pbiwgaW5kZXhNYXgpOwogCiAgICAgLy8gaW5pdGlhbGl6ZSBvdGhlciBwcml2YXRlIHN0cmVhbSB2b2x1bWVzIHdoaWNoIGZvbGxvdyB0aGlzIG9uZQogICAgIGZvciAoaW50IGN1clN0cmVhbSA9IDA7IGN1clN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgY3VyU3RyZWFtKyspIHsKICAgICAgICAgaWYgKCFzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCAoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBtVm9sdW1lQ3VydmVzLT5pbml0U3RyZWFtVm9sdW1lKChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSwgaW5kZXhNaW4sIGluZGV4TWF4KTsKKyAgICAgICAgZ2V0Vm9sdW1lQ3VydmVzKChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSkuaW5pdFZvbHVtZShpbmRleE1pbiwgaW5kZXhNYXgpOwogICAgIH0KIH0KIApAQCAtMjI1NiwxMyArMjQzOSwxNjUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQogeworICAgIGF1dG8gYXR0cmlidXRlcyA9IG1FbmdpbmUtPmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgaWYgKGF0dHJpYnV0ZXMgPT0gQVVESU9fQVRUUklCVVRFU19JTklUSUFMSVpFUikgeworICAgICAgICBBTE9HVygiJXM6IG5vIGdyb3VwIGZvciBzdHJlYW0gJXMsIGJhaWxpbmcgb3V0IiwgX19mdW5jX18sIHRvU3RyaW5nKHN0cmVhbSkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisgICAgQUxPR1YoIiVzOiBzdHJlYW0gJXMgYXR0cmlidXRlcz0lcyIsIF9fZnVuY19fLAorICAgICAgICAgIHRvU3RyaW5nKHN0cmVhbSkuY19zdHIoKSwgdG9TdHJpbmcoYXR0cmlidXRlcykuY19zdHIoKSk7CisgICAgcmV0dXJuIHNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBpbmRleCwgZGV2aWNlKTsKK30KIAotICAgIC8vIFZPSUNFX0NBTEwgYW5kIEJMVUVUT09USF9TQ08gc3RyZWFtIGhhdmUgbWluVm9sdW1lSW5kZXggPiAwIGJ1dAotICAgIC8vIGNhbiBiZSBtdXRlZCBkaXJlY3RseSBieSBhbiBhcHAgdGhhdCBoYXMgTU9ESUZZX1BIT05FX1NUQVRFIHBlcm1pc3Npb24uCi0gICAgaWYgKCgoaW5kZXggPCBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleE1pbihzdHJlYW0pKSAmJgotICAgICAgICAgICAgISgoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIHx8IHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgJiYKLSAgICAgICAgICAgIGluZGV4ID09IDApKSB8fAotICAgICAgICAgICAgKGluZGV4ID4gbVZvbHVtZUN1cnZlcy0+Z2V0Vm9sdW1lSW5kZXhNYXgoc3RyZWFtKSkpIHsKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgLy8gaWYgZGV2aWNlIGlzIEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FLCByZXR1cm4gdm9sdW1lIGZvciBkZXZpY2Ugc2VsZWN0ZWQgZm9yIHRoaXMKKyAgICAvLyBzdHJlYW0gYnkgdGhlIGVuZ2luZS4KKyAgICBEZXZpY2VUeXBlU2V0IGRldmljZVR5cGVzID0ge2RldmljZX07CisgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSkgeworICAgICAgICBkZXZpY2VUeXBlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JTdHJlYW0oCisgICAgICAgICAgICAgICAgc3RyZWFtLCB0cnVlIC8qZnJvbUNhY2hlKi8pLnR5cGVzKCk7CisgICAgfQorICAgIHJldHVybiBnZXRWb2x1bWVJbmRleChnZXRWb2x1bWVDdXJ2ZXMoc3RyZWFtKSwgKmluZGV4LCBkZXZpY2VUeXBlcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCit7CisgICAgLy8gR2V0IFZvbHVtZSBncm91cCBtYXRjaGluZyB0aGUgQXVkaW8gQXR0cmlidXRlcworICAgIGF1dG8gZ3JvdXAgPSBtRW5naW5lLT5nZXRWb2x1bWVHcm91cEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcyk7CisgICAgaWYgKGdyb3VwID09IFZPTFVNRV9HUk9VUF9OT05FKSB7CisgICAgICAgIEFMT0dEKCIlczogbm8gZ3JvdXAgbWF0Y2hpbmcgd2l0aCAlcyIsIF9fRlVOQ1RJT05fXywgdG9TdHJpbmcoYXR0cmlidXRlcykuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIEFMT0dWKCIlczogZ3JvdXAgJWQgbWF0Y2hpbmcgd2l0aCAlcyIsIF9fRlVOQ1RJT05fXywgZ3JvdXAsIHRvU3RyaW5nKGF0dHJpYnV0ZXMpLmNfc3RyKCkpOworICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOworICAgIElWb2x1bWVDdXJ2ZXMgJmN1cnZlcyA9IGdldFZvbHVtZUN1cnZlcyhhdHRyaWJ1dGVzKTsKKyAgICBWb2x1bWVTb3VyY2UgdnMgPSB0b1ZvbHVtZVNvdXJjZShncm91cCk7CisgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5ID0gbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKworICAgIHN0YXR1cyA9IHNldFZvbHVtZUN1cnZlSW5kZXgoaW5kZXgsIGRldmljZSwgY3VydmVzKTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCIlcyBmYWlsZWQgdG8gc2V0IGN1cnZlIGluZGV4IGZvciBncm91cCAlZCBkZXZpY2UgMHglWCIsIF9fZnVuY19fLCBncm91cCwgZGV2aWNlKTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBEZXZpY2VUeXBlU2V0IGN1clNyY0RldmljZXM7CisgICAgYXV0byBjdXJDdXJ2QXR0cnMgPSBjdXJ2ZXMuZ2V0QXR0cmlidXRlcygpOworICAgIGlmICghY3VyQ3VydkF0dHJzLmVtcHR5KCkgJiYgY3VyQ3VydkF0dHJzLmZyb250KCkgIT0gZGVmYXVsdEF0dHIpIHsKKyAgICAgICAgYXV0byBhdHRyID0gY3VyQ3VydkF0dHJzLmZyb250KCk7CisgICAgICAgIGN1clNyY0RldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyLCBudWxscHRyLCBmYWxzZSkudHlwZXMoKTsKKyAgICB9IGVsc2UgaWYgKCFjdXJ2ZXMuZ2V0U3RyZWFtVHlwZXMoKS5lbXB0eSgpKSB7CisgICAgICAgIGF1dG8gc3RyZWFtID0gY3VydmVzLmdldFN0cmVhbVR5cGVzKCkuZnJvbnQoKTsKKyAgICAgICAgY3VyU3JjRGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JTdHJlYW0oc3RyZWFtLCBmYWxzZSkudHlwZXMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgc3JjICVkOiBubyB2YWxpZCBhdHRyaWJ1dGVzIG5vciBzdHJlYW0iLF9fZnVuY19fLCB2cyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIGF1ZGlvX2RldmljZXNfdCBjdXJTcmNEZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShjdXJTcmNEZXZpY2VzKTsKKyAgICByZXNldERldmljZVR5cGVzKGN1clNyY0RldmljZXMsIGN1clNyY0RldmljZSk7CisKKyAgICAvLyB1cGRhdGUgdm9sdW1lIG9uIGFsbCBvdXRwdXRzIGFuZCBzdHJlYW1zIG1hdGNoaW5nIHRoZSBmb2xsb3dpbmc6CisgICAgLy8gLSBUaGUgcmVxdWVzdGVkIHN0cmVhbSAob3IgYSBzdHJlYW0gbWF0Y2hpbmcgZm9yIHZvbHVtZSBjb250cm9sKSBpcyBhY3RpdmUgb24gdGhlIG91dHB1dAorICAgIC8vIC0gVGhlIGRldmljZSAob3IgZGV2aWNlcykgc2VsZWN0ZWQgYnkgdGhlIGVuZ2luZSBmb3IgdGhpcyBzdHJlYW0gaW5jbHVkZXMKKyAgICAvLyB0aGUgcmVxdWVzdGVkIGRldmljZQorICAgIC8vIC0gRm9yIG5vbiBkZWZhdWx0IHJlcXVlc3RlZCBkZXZpY2UsIGN1cnJlbnRseSBzZWxlY3RlZCBkZXZpY2Ugb24gdGhlIG91dHB1dCBpcyBlaXRoZXIgdGhlCisgICAgLy8gcmVxdWVzdGVkIGRldmljZSBvciBvbmUgb2YgdGhlIGRldmljZXMgc2VsZWN0ZWQgYnkgdGhlIGVuZ2luZSBmb3IgdGhpcyBzdHJlYW0KKyAgICAvLyAtIEZvciBkZWZhdWx0IHJlcXVlc3RlZCBkZXZpY2UgKEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FKSwgYXBwbHkgdm9sdW1lIG9ubHkgaWYKKyAgICAvLyBubyBzcGVjaWZpYyBkZXZpY2Ugdm9sdW1lIHZhbHVlIGV4aXN0cyBmb3IgY3VycmVudGx5IHNlbGVjdGVkIGRldmljZS4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgRGV2aWNlVHlwZVNldCBjdXJEZXZpY2VzID0gZGVzYy0+ZGV2aWNlcygpLnR5cGVzKCk7CisKKyAgICAgICAgaWYgKGN1ckRldmljZXMuZXJhc2UoQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpKSB7CisgICAgICAgICAgICBjdXJEZXZpY2VzLmluc2VydChBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpOworICAgICAgICB9CisgICAgICAgIGlmICghKGRlc2MtPmlzQWN0aXZlKHZzKSB8fCBpc0luQ2FsbCgpKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGRldmljZSAhPSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSAmJgorICAgICAgICAgICAgICAgIGN1ckRldmljZXMuZmluZChkZXZpY2UpID09IGN1ckRldmljZXMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGJvb2wgYXBwbHlWb2x1bWUgPSBmYWxzZTsKKyAgICAgICAgaWYgKGRldmljZSAhPSBBVURJT19ERVZJQ0VfT1VUX0RFRkFVTFRfRk9SX1ZPTFVNRSkgeworICAgICAgICAgICAgY3VyU3JjRGV2aWNlcy5pbnNlcnQoZGV2aWNlKTsKKyAgICAgICAgICAgIGFwcGx5Vm9sdW1lID0gKGN1clNyY0RldmljZXMuZmluZCgKKyAgICAgICAgICAgICAgICAgICAgVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoY3VyRGV2aWNlcykpICE9IGN1clNyY0RldmljZXMuZW5kKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYXBwbHlWb2x1bWUgPSAhY3VydmVzLmhhc1ZvbHVtZUluZGV4Rm9yRGV2aWNlKGN1clNyY0RldmljZSk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFhcHBseVZvbHVtZSkgeworICAgICAgICAgICAgY29udGludWU7IC8vIG5leHQgb3V0cHV0CisgICAgICAgIH0KKyAgICAgICAgLy8gSW50ZXIgLyBpbnRyYSB2b2x1bWUgZ3JvdXAgcHJpb3JpdHkgbWFuYWdlbWVudDogTG9vcCBvbiBzdHJhdGVnaWVzIGFycmFuZ2VkIGJ5IHByaW9yaXR5CisgICAgICAgIC8vIElmIGEgaGlnaGVyIHByaW9yaXR5IHN0cmF0ZWd5IGlzIGFjdGl2ZSwgYW5kIHRoZSBvdXRwdXQgaXMgcm91dGVkIHRvIGEgZGV2aWNlIHdpdGggYQorICAgICAgICAvLyBIVyBHYWluIG1hbmFnZW1lbnQsIGRvIG5vdCBjaGFuZ2UgdGhlIHZvbHVtZQorICAgICAgICBpZiAoZGVzYy0+dXNlSHdHYWluKCkpIHsKKyAgICAgICAgICAgIGFwcGx5Vm9sdW1lID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJnByb2R1Y3RTdHJhdGVneSA6IG1FbmdpbmUtPmdldE9yZGVyZWRQcm9kdWN0U3RyYXRlZ2llcygpKSB7CisgICAgICAgICAgICAgICAgYXV0byBhY3RpdmVDbGllbnRzID0gZGVzYy0+Y2xpZW50c0xpc3QodHJ1ZSAvKmFjdGl2ZU9ubHkqLywgcHJvZHVjdFN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlIC8qcHJlZmVycmVkRGV2aWNlKi8pOworICAgICAgICAgICAgICAgIGlmIChhY3RpdmVDbGllbnRzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJvb2wgaXNQcmVlbXB0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBib29sIGlzSGlnaGVyUHJpb3JpdHkgPSBwcm9kdWN0U3RyYXRlZ3kgPCBzdHJhdGVneTsKKyAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmNsaWVudCA6IGFjdGl2ZUNsaWVudHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzSGlnaGVyUHJpb3JpdHkgJiYgKGNsaWVudC0+dm9sdW1lU291cmNlKCkgIT0gdnMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IFN0cmF0ZWd5PSVkIChcbnJlcXVlc3RlcjpcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgZ3JvdXAgJWQsIHZvbHVtZUdyb3VwPSVkIGF0dHJpYnV0ZXM9JXMpXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGhpZ2hlciBwcmlvcml0eSBzb3VyY2UgYWN0aXZlOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiB2b2x1bWVHcm91cD0lZCBhdHRyaWJ1dGVzPSVzKSBcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgb24gb3V0cHV0ICV6dSwgYmFpbGluZyBvdXQiLCBfX2Z1bmNfXywgcHJvZHVjdFN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXAsIGdyb3VwLCB0b1N0cmluZyhhdHRyaWJ1dGVzKS5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT52b2x1bWVTb3VyY2UoKSwgdG9TdHJpbmcoY2xpZW50LT5hdHRyaWJ1dGVzKCkpLmNfc3RyKCksIGkpOworICAgICAgICAgICAgICAgICAgICAgICAgYXBwbHlWb2x1bWUgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzUHJlZW1wdGVkID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIEhvd2V2ZXIsIGNvbnRpbnVlIGZvciBsb29wIHRvIGVuc3VyZSBubyBoaWdoZXIgcHJpbyBjbGllbnRzIHJ1bm5pbmcgb24gb3V0cHV0CisgICAgICAgICAgICAgICAgICAgIGlmIChjbGllbnQtPnZvbHVtZVNvdXJjZSgpID09IHZzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcHBseVZvbHVtZSA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGlzUHJlZW1wdGVkIHx8IGFwcGx5Vm9sdW1lKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghYXBwbHlWb2x1bWUpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gbmV4dCBvdXRwdXQKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICAvL0ZJWE1FOiB3b3JrYXJvdW5kIGZvciB0cnVuY2F0ZWQgdG91Y2ggc291bmRzCisgICAgICAgIC8vIGRlbGF5ZWQgdm9sdW1lIGNoYW5nZSBmb3Igc3lzdGVtIHN0cmVhbSB0byBiZSByZW1vdmVkIHdoZW4gdGhlIHByb2JsZW0gaXMKKyAgICAgICAgLy8gaGFuZGxlZCBieSBzeXN0ZW0gVUkKKyAgICAgICAgc3RhdHVzX3Qgdm9sU3RhdHVzID0gY2hlY2tBbmRTZXRWb2x1bWUoCisgICAgICAgICAgICAgICAgICAgIGN1cnZlcywgdnMsIGluZGV4LCBkZXNjLCBjdXJEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAoKHZzID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9TWVNURU0pKT8KKyAgICAgICAgICAgICAgICAgICAgICAgICBUT1VDSF9TT1VORF9GSVhFRF9ERUxBWV9NUyA6IDApKTsKKyAgICAgICAgaWYgKHZvbFN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gdm9sU3RhdHVzOworICAgICAgICB9CisgICAgfQorICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKGdyb3VwLCAwIC8qZmxhZ3MqLyk7CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRWb2x1bWVDdXJ2ZUluZGV4KGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElWb2x1bWVDdXJ2ZXMgJnZvbHVtZUN1cnZlcykKK3sKKyAgICAvLyBWT0lDRV9DQUxMIHN0cmVhbSBoYXMgbWluVm9sdW1lSW5kZXggPiAwICBidXQgY2FuIGJlIG11dGVkIGRpcmVjdGx5IGJ5IGFuCisgICAgLy8gYXBwIHRoYXQgaGFzIE1PRElGWV9QSE9ORV9TVEFURSBwZXJtaXNzaW9uLgorICAgIGJvb2wgaGFzVm9pY2UgPSBoYXNWb2ljZVN0cmVhbSh2b2x1bWVDdXJ2ZXMuZ2V0U3RyZWFtVHlwZXMoKSk7CisgICAgaWYgKCgoaW5kZXggPCB2b2x1bWVDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXhNaW4oKSkgJiYgIShoYXNWb2ljZSAmJiBpbmRleCA9PSAwKSkgfHwKKyAgICAgICAgICAgIChpbmRleCA+IHZvbHVtZUN1cnZlcy5nZXRWb2x1bWVJbmRleE1heCgpKSkgeworICAgICAgICBBTE9HRCgiJXM6IHdyb25nIGluZGV4ICVkIG1pbj0lZCBtYXg9JWQiLCBfX0ZVTkNUSU9OX18sIGluZGV4LAorICAgICAgICAgICAgICB2b2x1bWVDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXhNaW4oKSwgdm9sdW1lQ3VydmVzLmdldFZvbHVtZUluZGV4TWF4KCkpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgewpAQCAtMjI3MCw5MCArMjYwNSw1MCBAQAogICAgIH0KIAogICAgIC8vIEZvcmNlIG1heCB2b2x1bWUgaWYgc3RyZWFtIGNhbm5vdCBiZSBtdXRlZAotICAgIGlmICghbVZvbHVtZUN1cnZlcy0+Y2FuQmVNdXRlZChzdHJlYW0pKSBpbmRleCA9IG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4TWF4KHN0cmVhbSk7CisgICAgaWYgKCF2b2x1bWVDdXJ2ZXMuY2FuQmVNdXRlZCgpKSBpbmRleCA9IHZvbHVtZUN1cnZlcy5nZXRWb2x1bWVJbmRleE1heCgpOwogCi0gICAgQUxPR1YoInNldFN0cmVhbVZvbHVtZUluZGV4KCkgc3RyZWFtICVkLCBkZXZpY2UgJTA4eCwgaW5kZXggJWQiLAotICAgICAgICAgIHN0cmVhbSwgZGV2aWNlLCBpbmRleCk7Ci0KLSAgICAvLyB1cGRhdGUgb3RoZXIgcHJpdmF0ZSBzdHJlYW0gdm9sdW1lcyB3aGljaCBmb2xsb3cgdGhpcyBvbmUKLSAgICBmb3IgKGludCBjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IGN1clN0cmVhbSsrKSB7Ci0gICAgICAgIGlmICghc3RyZWFtc01hdGNoRm9ydm9sdW1lKHN0cmVhbSwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgbVZvbHVtZUN1cnZlcy0+YWRkQ3VycmVudFZvbHVtZUluZGV4KChhdWRpb19zdHJlYW1fdHlwZV90KWN1clN0cmVhbSwgZGV2aWNlLCBpbmRleCk7Ci0gICAgfQotCi0gICAgLy8gdXBkYXRlIHZvbHVtZSBvbiBhbGwgb3V0cHV0cyBhbmQgc3RyZWFtcyBtYXRjaGluZyB0aGUgZm9sbG93aW5nOgotICAgIC8vIC0gVGhlIHJlcXVlc3RlZCBzdHJlYW0gKG9yIGEgc3RyZWFtIG1hdGNoaW5nIGZvciB2b2x1bWUgY29udHJvbCkgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQKLSAgICAvLyAtIFRoZSBkZXZpY2UgKG9yIGRldmljZXMpIHNlbGVjdGVkIGJ5IHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgc3RyZWFtIGluY2x1ZGVzCi0gICAgLy8gdGhlIHJlcXVlc3RlZCBkZXZpY2UKLSAgICAvLyAtIEZvciBub24gZGVmYXVsdCByZXF1ZXN0ZWQgZGV2aWNlLCBjdXJyZW50bHkgc2VsZWN0ZWQgZGV2aWNlIG9uIHRoZSBvdXRwdXQgaXMgZWl0aGVyIHRoZQotICAgIC8vIHJlcXVlc3RlZCBkZXZpY2Ugb3Igb25lIG9mIHRoZSBkZXZpY2VzIHNlbGVjdGVkIGJ5IHRoZSBzdHJhdGVneQotICAgIC8vIC0gRm9yIGRlZmF1bHQgcmVxdWVzdGVkIGRldmljZSAoQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUpLCBhcHBseSB2b2x1bWUgb25seSBpZgotICAgIC8vIG5vIHNwZWNpZmljIGRldmljZSB2b2x1bWUgdmFsdWUgZXhpc3RzIGZvciBjdXJyZW50bHkgc2VsZWN0ZWQgZGV2aWNlLgotICAgIHN0YXR1c190IHN0YXR1cyA9IE5PX0VSUk9SOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyRGV2aWNlID0gZGVzYy0+ZGV2aWNlKCk7Ci0gICAgICAgIGZvciAoaW50IGN1clN0cmVhbSA9IDA7IGN1clN0cmVhbSA8IEFVRElPX1NUUkVBTV9GT1JfUE9MSUNZX0NOVDsgY3VyU3RyZWFtKyspIHsKLSAgICAgICAgICAgIGlmICghc3RyZWFtc01hdGNoRm9ydm9sdW1lKHN0cmVhbSwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkgewotICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCEoZGVzYy0+aXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSB8fAotICAgICAgICAgICAgICAgICAgICAoaXNJbkNhbGwoKSAmJiAoY3VyU3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSkpKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGN1clN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKTsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBjdXJTdHJlYW1EZXZpY2UgPSBWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShnZXREZXZpY2VGb3JTdHJhdGVneSgKLSAgICAgICAgICAgICAgICAgICAgY3VyU3RyYXRlZ3ksIGZhbHNlIC8qZnJvbUNhY2hlKi8pKTsKLSAgICAgICAgICAgIGlmICgoZGV2aWNlICE9IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FKSAmJgotICAgICAgICAgICAgICAgICAgICAoKGN1clN0cmVhbURldmljZSAmIGRldmljZSkgPT0gMCkpIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJvb2wgYXBwbHlWb2x1bWU7Ci0gICAgICAgICAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FKSB7Ci0gICAgICAgICAgICAgICAgY3VyU3RyZWFtRGV2aWNlIHw9IGRldmljZTsKLSAgICAgICAgICAgICAgICBhcHBseVZvbHVtZSA9IChWb2x1bWU6OmdldERldmljZUZvclZvbHVtZShjdXJEZXZpY2UpICYgY3VyU3RyZWFtRGV2aWNlKSAhPSAwOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBhcHBseVZvbHVtZSA9ICFtVm9sdW1lQ3VydmVzLT5oYXNWb2x1bWVJbmRleEZvckRldmljZSgKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgY3VyU3RyZWFtRGV2aWNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGFwcGx5Vm9sdW1lKSB7Ci0gICAgICAgICAgICAgICAgLy9GSVhNRTogd29ya2Fyb3VuZCBmb3IgdHJ1bmNhdGVkIHRvdWNoIHNvdW5kcwotICAgICAgICAgICAgICAgIC8vIGRlbGF5ZWQgdm9sdW1lIGNoYW5nZSBmb3Igc3lzdGVtIHN0cmVhbSB0byBiZSByZW1vdmVkIHdoZW4gdGhlIHByb2JsZW0gaXMKLSAgICAgICAgICAgICAgICAvLyBoYW5kbGVkIGJ5IHN5c3RlbSBVSQotICAgICAgICAgICAgICAgIHN0YXR1c190IHZvbFN0YXR1cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBjaGVja0FuZFNldFZvbHVtZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0sIGluZGV4LCBkZXNjLCBjdXJEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fU1lTVEVNKSA/IFRPVUNIX1NPVU5EX0ZJWEVEX0RFTEFZX01TIDogMCk7Ci0gICAgICAgICAgICAgICAgaWYgKHZvbFN0YXR1cyAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSB2b2xTdGF0dXM7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzdGF0dXM7CisgICAgQUxPR1YoIiVzIGRldmljZSAlMDh4LCBpbmRleCAlZCIsIF9fRlVOQ1RJT05fXyAsIGRldmljZSwgaW5kZXgpOworICAgIHZvbHVtZUN1cnZlcy5hZGRDdXJyZW50Vm9sdW1lSW5kZXgoZGV2aWNlLCBpbmRleCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmVhbVZvbHVtZUluZGV4KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICppbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKIHsKLSAgICBpZiAoaW5kZXggPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBpZiAoIWF1ZGlvX2lzX291dHB1dF9kZXZpY2UoZGV2aWNlKSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICAvLyBpZiBkZXZpY2UgaXMgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUsIHJldHVybiB2b2x1bWUgZm9yIGRldmljZSBjb3JyZXNwb25kaW5nIHRvCi0gICAgLy8gdGhlIHN0cmF0ZWd5IHRoZSBzdHJlYW0gYmVsb25ncyB0by4KKyAgICAvLyBpZiBkZXZpY2UgaXMgQVVESU9fREVWSUNFX09VVF9ERUZBVUxUX0ZPUl9WT0xVTUUsIHJldHVybiB2b2x1bWUgZm9yIGRldmljZSBzZWxlY3RlZCBmb3IgdGhpcworICAgIC8vIHN0cmVhbSBieSB0aGUgZW5naW5lLgorICAgIERldmljZVR5cGVTZXQgZGV2aWNlVHlwZXMgPSB7ZGV2aWNlfTsKICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfREVGQVVMVF9GT1JfVk9MVU1FKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KGdldFN0cmF0ZWd5KHN0cmVhbSksIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIERldmljZVR5cGVTZXQgZGV2aWNlVHlwZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcygKKyAgICAgICAgICAgICAgICBhdHRyLCBudWxscHRyLCB0cnVlIC8qZnJvbUNhY2hlKi8pLnR5cGVzKCk7CiAgICAgfQotICAgIGRldmljZSA9IFZvbHVtZTo6Z2V0RGV2aWNlRm9yVm9sdW1lKGRldmljZSk7CisgICAgcmV0dXJuIGdldFZvbHVtZUluZGV4KGdldFZvbHVtZUN1cnZlcyhhdHRyKSwgaW5kZXgsIGRldmljZVR5cGVzKTsKK30KIAotICAgICppbmRleCA9ICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleChzdHJlYW0sIGRldmljZSk7Ci0gICAgQUxPR1YoImdldFN0cmVhbVZvbHVtZUluZGV4KCkgc3RyZWFtICVkIGRldmljZSAlMDh4IGluZGV4ICVkIiwgc3RyZWFtLCBkZXZpY2UsICppbmRleCk7CitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFZvbHVtZUluZGV4KGNvbnN0IElWb2x1bWVDdXJ2ZXMgJmN1cnZlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpIGNvbnN0Cit7CisgICAgaWYgKGlzU2luZ2xlRGV2aWNlVHlwZShkZXZpY2VUeXBlcywgYXVkaW9faXNfb3V0cHV0X2RldmljZSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaW5kZXggPSBjdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlVHlwZXMpOworICAgIEFMT0dWKCIlczogZGV2aWNlICVzIGluZGV4ICVkIiwgX19GVU5DVElPTl9fLCBkdW1wRGV2aWNlVHlwZXMoZGV2aWNlVHlwZXMpLmNfc3RyKCksIGluZGV4KTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TWluVm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgpCit7CisgICAgaW5kZXggPSBnZXRWb2x1bWVDdXJ2ZXMoYXR0cikuZ2V0Vm9sdW1lSW5kZXhNaW4oKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgpCit7CisgICAgaW5kZXggPSBnZXRWb2x1bWVDdXJ2ZXMoYXR0cikuZ2V0Vm9sdW1lSW5kZXhNYXgoKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKQEAgLTIzNjgsOSArMjY2Myw5IEBACiAgICAgLy8gMzogVGhlIHByaW1hcnkgb3V0cHV0CiAgICAgLy8gNDogdGhlIGZpcnN0IG91dHB1dCBpbiB0aGUgbGlzdAogCi0gICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSA9IGdldFN0cmF0ZWd5KEFVRElPX1NUUkVBTV9NVVNJQyk7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgbU91dHB1dHMpOworICAgIERldmljZVZlY3RvciBkZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoCisgICAgICAgICAgICAgICAgYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9NRURJQSksIG51bGxwdHIsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2VzKGRldmljZXMsIG1PdXRwdXRzKTsKIAogICAgIGlmIChvdXRwdXRzLnNpemUoKSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBBVURJT19JT19IQU5ETEVfTk9ORTsKQEAgLTIzODYsNyArMjY4MSw3IEBACiAKICAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgOiBvdXRwdXRzKSB7CiAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlRm9yKG91dHB1dCk7Ci0gICAgICAgICAgICBpZiAoYWN0aXZlT25seSAmJiAhZGVzYy0+aXNTdHJlYW1BY3RpdmUoQVVESU9fU1RSRUFNX01VU0lDKSkgeworICAgICAgICAgICAgaWYgKGFjdGl2ZU9ubHkgJiYgIWRlc2MtPmlzQWN0aXZlKHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9NVVNJQykpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBBTE9HVigic2VsZWN0T3V0cHV0Rm9yTXVzaWNFZmZlY3RzIGFjdGl2ZU9ubHkgJWQgb3V0cHV0ICVkIGZsYWdzIDB4JTA4eCIsCkBAIC0yNDE0LDYgKzI3MDksNyBAQAogICAgIH0KIAogICAgIGlmIChvdXRwdXQgIT0gbU11c2ljRWZmZWN0T3V0cHV0KSB7CisgICAgICAgIG1FZmZlY3RzLm1vdmVFZmZlY3RzKEFVRElPX1NFU1NJT05fT1VUUFVUX01JWCwgbU11c2ljRWZmZWN0T3V0cHV0LCBvdXRwdXQpOwogICAgICAgICBtcENsaWVudEludGVyZmFjZS0+bW92ZUVmZmVjdHMoQVVESU9fU0VTU0lPTl9PVVRQVVRfTUlYLCBtTXVzaWNFZmZlY3RPdXRwdXQsIG91dHB1dCk7CiAgICAgICAgIG1NdXNpY0VmZmVjdE91dHB1dCA9IG91dHB1dDsKICAgICB9CkBAIC0yNDMzLDMyICsyNzI5LDcyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaWQpCiB7Ci0gICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRzLmluZGV4T2ZLZXkoaW8pOwotICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgaW5kZXggPSBtSW5wdXRzLmluZGV4T2ZLZXkoaW8pOworICAgIGlmIChzZXNzaW9uICE9IEFVRElPX1NFU1NJT05fREVWSUNFKSB7CisgICAgICAgIHNzaXplX3QgaW5kZXggPSBtT3V0cHV0cy5pbmRleE9mS2V5KGlvKTsKICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgQUxPR1coInJlZ2lzdGVyRWZmZWN0KCkgdW5rbm93biBpbyAlZCIsIGlvKTsKLSAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIGluZGV4ID0gbUlucHV0cy5pbmRleE9mS2V5KGlvKTsKKyAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKKyAgICAgICAgICAgICAgICBBTE9HVygicmVnaXN0ZXJFZmZlY3QoKSB1bmtub3duIGlvICVkIiwgaW8pOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLSAgICByZXR1cm4gbUVmZmVjdHMucmVnaXN0ZXJFZmZlY3QoZGVzYywgaW8sIHN0cmF0ZWd5LCBzZXNzaW9uLCBpZCk7CisgICAgcmV0dXJuIG1FZmZlY3RzLnJlZ2lzdGVyRWZmZWN0KGRlc2MsIGlvLCBzZXNzaW9uLCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0cmF0ZWd5ID09IHN0cmVhbVRvU3RyYXRlZ3koQVVESU9fU1RSRUFNX01VU0lDKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJhdGVneSA9PSBQUk9EVUNUX1NUUkFURUdZX05PTkUpKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCkKK3sKKyAgICBpZiAobUVmZmVjdHMuZ2V0RWZmZWN0KGlkKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisgICAgaWYgKG1FZmZlY3RzLmlzRWZmZWN0RW5hYmxlZChpZCkpIHsKKyAgICAgICAgQUxPR1coIiVzIGVmZmVjdCAlZCBlbmFibGVkIiwgX19GVU5DVElPTl9fLCBpZCk7CisgICAgICAgIHNldEVmZmVjdEVuYWJsZWQoaWQsIGZhbHNlKTsKKyAgICB9CisgICAgcmV0dXJuIG1FZmZlY3RzLnVucmVnaXN0ZXJFZmZlY3QoaWQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xlYW5VcEVmZmVjdHNGb3JJbyhhdWRpb19pb19oYW5kbGVfdCBpbykKK3sKKyAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBlZmZlY3RzID0gbUVmZmVjdHMuZ2V0RWZmZWN0c0ZvcklvKGlvKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVmZmVjdHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgQUxPR1coIiVzIHJlbW92aW5nIHN0YWxlIGVmZmVjdCAlcywgaWQgJWQgb24gY2xvc2VkIElPICVkIiwKKyAgICAgICAgICAgICAgX19mdW5jX18sIGVmZmVjdHMudmFsdWVBdChpKS0+bURlc2MubmFtZSwgZWZmZWN0cy5rZXlBdChpKSwgaW8pOworICAgICAgICB1bnJlZ2lzdGVyRWZmZWN0KGVmZmVjdHMua2V5QXQoaSkpOworICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKQoreworICAgIHNwPEVmZmVjdERlc2NyaXB0b3I+IGVmZmVjdCA9IG1FZmZlY3RzLmdldEVmZmVjdChpZCk7CisgICAgaWYgKGVmZmVjdCA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtRWZmZWN0cy5zZXRFZmZlY3RFbmFibGVkKGlkLCBlbmFibGVkKTsKKyAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgIG1JbnB1dHMudHJhY2tFZmZlY3RFbmFibGVkKGVmZmVjdCwgZW5hYmxlZCk7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7Cit9CisKKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjptb3ZlRWZmZWN0c1RvSW8oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaWRzLCBhdWRpb19pb19oYW5kbGVfdCBpbykKK3sKKyAgIG1FZmZlY3RzLm1vdmVFZmZlY3RzKGlkcywgaW8pOworICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdHJlYW1BY3RpdmUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewotICAgIGJvb2wgYWN0aXZlID0gZmFsc2U7Ci0gICAgZm9yIChpbnQgY3VyU3RyZWFtID0gMDsgY3VyU3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UICYmICFhY3RpdmU7IGN1clN0cmVhbSsrKSB7Ci0gICAgICAgIGlmICghc3RyZWFtc01hdGNoRm9ydm9sdW1lKHN0cmVhbSwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgYWN0aXZlID0gbU91dHB1dHMuaXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtLCBpblBhc3RNcyk7Ci0gICAgfQotICAgIHJldHVybiBhY3RpdmU7CisgICAgcmV0dXJuIG1PdXRwdXRzLmlzQWN0aXZlKHRvVm9sdW1lU291cmNlKHN0cmVhbSksIGluUGFzdE1zKTsKIH0KIAogYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RyZWFtQWN0aXZlUmVtb3RlbHkoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIHVpbnQzMl90IGluUGFzdE1zKSBjb25zdAogewotICAgIHJldHVybiBtT3V0cHV0cy5pc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KHN0cmVhbSwgaW5QYXN0TXMpOworICAgIHJldHVybiBtT3V0cHV0cy5pc0FjdGl2ZVJlbW90ZWx5KHRvVm9sdW1lU291cmNlKHN0cmVhbSksIGluUGFzdE1zKTsKIH0KIAogYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU291cmNlQWN0aXZlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkgY29uc3QKQEAgLTI1MDMsNjcgKzI4MzksODYgQEAKICAgICBzcDxId01vZHVsZT4gclN1Ym1peE1vZHVsZTsKICAgICAvLyBleGFtaW5lIGVhY2ggbWl4J3Mgcm91dGUgdHlwZQogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbWl4ZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgLy8gd2Ugb25seSBzdXBwb3J0IE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSyBvciBNSVhfUk9VVEVfRkxBR19SRU5ERVIsIG5vdCB0aGUgY29tYmluYXRpb24KLSAgICAgICAgaWYgKChtaXhlc1tpXS5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX0FMTCkgPT0gTUlYX1JPVVRFX0ZMQUdfQUxMKSB7CisgICAgICAgIEF1ZGlvTWl4IG1peCA9IG1peGVzW2ldOworICAgICAgICAvLyBPbmx5IGNhcHR1cmUgb2YgcGxheWJhY2sgaXMgYWxsb3dlZCBpbiBMT09QX0JBQ0sgJiBSRU5ERVIgbW9kZQorICAgICAgICBpZiAoaXNfbWl4X2xvb3BiYWNrX3JlbmRlcihtaXgubVJvdXRlRmxhZ3MpICYmIG1peC5tTWl4VHlwZSAhPSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgICAgICBBTE9HRSgiVW5zdXBwb3J0ZWQgUG9saWN5IE1peCAlenUgb2YgJXp1OiAiCisgICAgICAgICAgICAgICAgICAiT25seSBjYXB0dXJlIG9mIHBsYXliYWNrIGlzIGFsbG93ZWQgaW4gTE9PUF9CQUNLICYgUkVOREVSIG1vZGUiLAorICAgICAgICAgICAgICAgICAgIGksIG1peGVzLnNpemUoKSk7CiAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9Ci0gICAgICAgIGlmICgobWl4ZXNbaV0ubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0spID09IE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgewotICAgICAgICAgICAgQUxPR1YoInJlZ2lzdGVyUG9saWN5TWl4ZXMoKSBtaXggJXp1IG9mICV6dSBpcyBMT09QX0JBQ0siLCBpLCBtaXhlcy5zaXplKCkpOworICAgICAgICAvLyBMT09QX0JBQ0sgYW5kIExPT1BfQkFDSyB8IFJFTkRFUiBoYXZlIHRoZSBzYW1lIHJlbW90ZSBzdWJtaXggYmFja2VuZCBhbmQgYXJlIGhhbmRsZWQKKyAgICAgICAgLy8gaW4gdGhlIHNhbWUgd2F5LgorICAgICAgICBpZiAoKG1peC5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSykgPT0gTUlYX1JPVVRFX0ZMQUdfTE9PUF9CQUNLKSB7CisgICAgICAgICAgICBBTE9HVigicmVnaXN0ZXJQb2xpY3lNaXhlcygpIG1peCAlenUgb2YgJXp1IGlzIExPT1BfQkFDSyAlZCIsIGksIG1peGVzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgIG1peC5tUm91dGVGbGFncyk7CiAgICAgICAgICAgICBpZiAoclN1Ym1peE1vZHVsZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgclN1Ym1peE1vZHVsZSA9IG1Id01vZHVsZXMuZ2V0TW9kdWxlRnJvbU5hbWUoCiAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUkVNT1RFX1NVQk1JWCk7CiAgICAgICAgICAgICAgICAgaWYgKHJTdWJtaXhNb2R1bGUgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICBBTE9HRSgiIFVuYWJsZSB0byBmaW5kIGF1ZGlvIG1vZHVsZSBmb3Igc3VibWl4LCBhYm9ydGluZyBtaXggJXp1IHJlZ2lzdHJhdGlvbiIsCisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJVbmFibGUgdG8gZmluZCBhdWRpbyBtb2R1bGUgZm9yIHN1Ym1peCwgYWJvcnRpbmcgbWl4ICV6dSByZWdpc3RyYXRpb24iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkpOwogICAgICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXhlc1tpXS5tRGV2aWNlQWRkcmVzczsKKyAgICAgICAgICAgIFN0cmluZzggYWRkcmVzcyA9IG1peC5tRGV2aWNlQWRkcmVzczsKKyAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlVG9NYWtlQXZhaWxhYmxlOworICAgICAgICAgICAgaWYgKG1peC5tTWl4VHlwZSA9PSBNSVhfVFlQRV9QTEFZRVJTKSB7CisgICAgICAgICAgICAgICAgbWl4Lm1EZXZpY2VUeXBlID0gQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYOworICAgICAgICAgICAgICAgIGRldmljZVR5cGVUb01ha2VBdmFpbGFibGUgPSBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgbWl4Lm1EZXZpY2VUeXBlID0gQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVg7CisgICAgICAgICAgICAgICAgZGV2aWNlVHlwZVRvTWFrZUF2YWlsYWJsZSA9IEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWDsKKyAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy5yZWdpc3Rlck1peChhZGRyZXNzLCBtaXhlc1tpXSwgMCAvKm91dHB1dCBkZXNjKi8pICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiBFcnJvciByZWdpc3RlcmluZyBtaXggJXp1IGZvciBhZGRyZXNzICVzIiwgaSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnJlZ2lzdGVyTWl4KG1peCwgMCAvKm91dHB1dCBkZXNjKi8pICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIkVycm9yIHJlZ2lzdGVyaW5nIG1peCAlenUgZm9yIGFkZHJlc3MgJXMiLCBpLCBhZGRyZXNzLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IG91dHB1dENvbmZpZyA9IG1peGVzW2ldLm1Gb3JtYXQ7Ci0gICAgICAgICAgICBhdWRpb19jb25maWdfdCBpbnB1dENvbmZpZyA9IG1peGVzW2ldLm1Gb3JtYXQ7CisgICAgICAgICAgICBhdWRpb19jb25maWdfdCBvdXRwdXRDb25maWcgPSBtaXgubUZvcm1hdDsKKyAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190IGlucHV0Q29uZmlnID0gbWl4Lm1Gb3JtYXQ7CiAgICAgICAgICAgICAvLyBOT1RFOiBhdWRpbyBmbGluZ2VyIG1peGVyIGRvZXMgbm90IHN1cHBvcnQgbW9ubyBvdXRwdXQ6IGNvbmZpZ3VyZSByZW1vdGUgc3VibWl4IEhBTCBpbgogICAgICAgICAgICAgLy8gc3RlcmVvIGFuZCBsZXQgYXVkaW8gZmxpbmdlciBkbyB0aGUgY2hhbm5lbCBjb252ZXJzaW9uIGlmIG5lZWRlZC4KICAgICAgICAgICAgIG91dHB1dENvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87CiAgICAgICAgICAgICBpbnB1dENvbmZpZy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX0lOX1NURVJFTzsKLSAgICAgICAgICAgIHJTdWJtaXhNb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUoYWRkcmVzcywgJm91dHB1dENvbmZpZywKKyAgICAgICAgICAgIHJTdWJtaXhNb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUoYWRkcmVzcy5jX3N0cigpLCAmb3V0cHV0Q29uZmlnLAogICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsIGFkZHJlc3MpOwotICAgICAgICAgICAgclN1Ym1peE1vZHVsZS0+YWRkSW5wdXRQcm9maWxlKGFkZHJlc3MsICZpbnB1dENvbmZpZywKKyAgICAgICAgICAgIHJTdWJtaXhNb2R1bGUtPmFkZElucHV0UHJvZmlsZShhZGRyZXNzLmNfc3RyKCksICZpbnB1dENvbmZpZywKICAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsIGFkZHJlc3MpOwogCi0gICAgICAgICAgICBpZiAobWl4ZXNbaV0ubU1peFR5cGUgPT0gTUlYX1RZUEVfUExBWUVSUykgewotICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiKTsKKyAgICAgICAgICAgIGlmICgocmVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGRldmljZVR5cGVUb01ha2VBdmFpbGFibGUsCisgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAorICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIsIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNldCByZW1vdGUgc3VibWl4IGRldmljZSBhdmFpbGFibGUsIHR5cGUgJXUsIGFkZHJlc3MgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgbWl4Lm1EZXZpY2VUeXBlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgobWl4ZXNbaV0ubVJvdXRlRmxhZ3MgJiBNSVhfUk9VVEVfRkxBR19SRU5ERVIpID09IE1JWF9ST1VURV9GTEFHX1JFTkRFUikgewotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gbWl4ZXNbaV0ubURldmljZUFkZHJlc3M7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gbWl4ZXNbaV0ubURldmljZVR5cGU7CisgICAgICAgIH0gZWxzZSBpZiAoKG1peC5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX1JFTkRFUikgPT0gTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSB7CisgICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBtaXgubURldmljZUFkZHJlc3M7CisgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgdHlwZSA9IG1peC5tRGV2aWNlVHlwZTsKICAgICAgICAgICAgIEFMT0dWKCIgcmVnaXN0ZXJQb2xpY3lNaXhlcygpIG1peCAlenUgb2YgJXp1IGlzIFJFTkRFUiwgZGV2PTB4JVggYWRkcj0lcyIsCi0gICAgICAgICAgICAgICAgICAgIGksIG1peGVzLnNpemUoKSwgZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgaSwgbWl4ZXMuc2l6ZSgpLCB0eXBlLCBhZGRyZXNzLnN0cmluZygpKTsKKworICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0gbUh3TW9kdWxlcy5nZXREZXZpY2VEZXNjcmlwdG9yKAorICAgICAgICAgICAgICAgICAgICBtaXgubURldmljZVR5cGUsIG1peC5tRGV2aWNlQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCgpLCBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KIAogICAgICAgICAgICAgYm9vbCBmb3VuZE91dHB1dCA9IGZhbHNlOwogICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDAgOyBqIDwgbU91dHB1dHMuc2l6ZSgpIDsgaisrKSB7CiAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGopOwotICAgICAgICAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUZvcihkZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKLSAgICAgICAgICAgICAgICBpZiAoKHBhdGNoICE9IDApICYmIChwYXRjaC0+bVBhdGNoLm51bV9zaW5rcyAhPSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBhdGNoLT5tUGF0Y2guc2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgKHBhdGNoLT5tUGF0Y2guc2lua3NbMF0uZXh0LmRldmljZS50eXBlID09IGRldmljZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICYmIChzdHJuY21wKHBhdGNoLT5tUGF0Y2guc2lua3NbMF0uZXh0LmRldmljZS5hZGRyZXNzLCBhZGRyZXNzLnN0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfTUFYX0FERFJFU1NfTEVOKSA9PSAwKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnJlZ2lzdGVyTWl4KGFkZHJlc3MsIG1peGVzW2ldLCBkZXNjKSAhPSBOT19FUlJPUikgeworCisgICAgICAgICAgICAgICAgaWYgKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKS5jb250YWlucyhkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMucmVnaXN0ZXJNaXgobWl4LCBkZXNjKSAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCByZWdpc3RlciBtaXggUkVOREVSLCAgZGV2PTB4JVggYWRkcj0lcyIsIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICAgICAgZm91bmRPdXRwdXQgPSB0cnVlOwpAQCAtMjU3NCwxMiArMjkyOSwxMiBAQAogCiAgICAgICAgICAgICBpZiAocmVzICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiBFcnJvciByZWdpc3RlcmluZyBtaXggJXp1IGZvciBkZXZpY2UgMHglWCBhZGRyICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGksIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpLCB0eXBlLCBhZGRyZXNzLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0gZWxzZSBpZiAoIWZvdW5kT3V0cHV0KSB7CiAgICAgICAgICAgICAgICAgQUxPR0UoIiBPdXRwdXQgbm90IGZvdW5kIGZvciBtaXggJXp1IGZvciBkZXZpY2UgMHglWCBhZGRyICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGksIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpLCB0eXBlLCBhZGRyZXNzLnN0cmluZygpKTsKICAgICAgICAgICAgICAgICByZXMgPSBJTlZBTElEX09QRVJBVElPTjsKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KQEAgLTI2MTEsMjggKzI5NjYsMjggQEAKIAogICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gbWl4Lm1EZXZpY2VBZGRyZXNzOwogCi0gICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnVucmVnaXN0ZXJNaXgoYWRkcmVzcykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMudW5yZWdpc3Rlck1peChtaXgpICE9IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgcmVzID0gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmIChnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgsIGFkZHJlc3Muc3RyaW5nKCkpID09Ci0gICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKSAgewotICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCi0gICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIpOworICAgICAgICAgICAgZm9yIChhdXRvIGRldmljZSA6IHtBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYfSkgeworICAgICAgICAgICAgICAgIGlmIChnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBhZGRyZXNzLnN0cmluZygpKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpICB7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChkZXZpY2UsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzLnN0cmluZygpLCAicmVtb3RlLXN1Ym1peCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJFcnJvciBtYWtpbmcgUmVtb3RlU3VibWl4IGRldmljZSB1bmF2YWlsYWJsZSBmb3IgbWl4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aXRoIHR5cGUgJWQsIGFkZHJlc3MgJXMiLCBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGdldERldmljZUNvbm5lY3Rpb25TdGF0ZShBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsIGFkZHJlc3Muc3RyaW5nKCkpID09Ci0gICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKSAgewotICAgICAgICAgICAgICAgIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCi0gICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAotICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSwgInJlbW90ZS1zdWJtaXgiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJTdWJtaXhNb2R1bGUtPnJlbW92ZU91dHB1dFByb2ZpbGUoYWRkcmVzcyk7Ci0gICAgICAgICAgICByU3VibWl4TW9kdWxlLT5yZW1vdmVJbnB1dFByb2ZpbGUoYWRkcmVzcyk7CisgICAgICAgICAgICByU3VibWl4TW9kdWxlLT5yZW1vdmVPdXRwdXRQcm9maWxlKGFkZHJlc3MuY19zdHIoKSk7CisgICAgICAgICAgICByU3VibWl4TW9kdWxlLT5yZW1vdmVJbnB1dFByb2ZpbGUoYWRkcmVzcy5jX3N0cigpKTsKIAotICAgICAgICB9IGlmICgobWl4Lm1Sb3V0ZUZsYWdzICYgTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSA9PSBNSVhfUk9VVEVfRkxBR19SRU5ERVIpIHsKLSAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMudW5yZWdpc3Rlck1peChtaXgubURldmljZUFkZHJlc3MpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIH0gZWxzZSBpZiAoKG1peC5tUm91dGVGbGFncyAmIE1JWF9ST1VURV9GTEFHX1JFTkRFUikgPT0gTUlYX1JPVVRFX0ZMQUdfUkVOREVSKSB7CisgICAgICAgICAgICBpZiAobVBvbGljeU1peGVzLnVucmVnaXN0ZXJNaXgobWl4KSAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQpAQCAtMjY0MSw1NyArMjk5NiwxODMgQEAKICAgICByZXR1cm4gcmVzOwogfQogCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZHVtcE1hbnVhbFN1cnJvdW5kRm9ybWF0cyhTdHJpbmc4ICpkc3QpIGNvbnN0Cit7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGNvbnN0ZXhwciBzaXplX3QgYXVkaW9Gb3JtYXRQcmVmaXhMZW4gPSBzaXplb2YoIkFVRElPX0ZPUk1BVF8iKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZtdCA6IG1NYW51YWxTdXJyb3VuZEZvcm1hdHMpIHsKKyAgICAgICAgaWYgKGkrKyAhPSAwKSBkc3QtPmFwcGVuZCgiLCAiKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgc2ZtdDsKKyAgICAgICAgRm9ybWF0Q29udmVydGVyOjp0b1N0cmluZyhmbXQsIHNmbXQpOworICAgICAgICBkc3QtPmFwcGVuZChzZm10LnNpemUoKSA+PSBhdWRpb0Zvcm1hdFByZWZpeExlbiA/CisgICAgICAgICAgICAgICAgc2ZtdC5jX3N0cigpICsgYXVkaW9Gb3JtYXRQcmVmaXhMZW4gLSAxIDogc2ZtdC5jX3N0cigpKTsKKyAgICB9Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsCisgICAgICAgIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcykgeworICAgIEFMT0dWKCIlcygpIHVpZD0lZCBudW0gZGV2aWNlcyAlenUiLCBfX0ZVTkNUSU9OX18sIHVpZCwgZGV2aWNlcy5zaXplKCkpOworICAgIC8vIHVpZC9kZXZpY2UgYWZmaW5pdHkgaXMgb25seSBmb3Igb3V0cHV0IGRldmljZXMKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgaWYgKCFhdWRpb19pc19vdXRwdXRfZGV2aWNlKGRldmljZXNbaV0ubVR5cGUpKSB7CisgICAgICAgICAgICBBTE9HRSgic2V0VWlkRGV2aWNlQWZmaW5pdGllcygpIGRldmljZT0lMDh4IGlzIE5PVCBhbiBvdXRwdXQgZGV2aWNlIiwKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlc1tpXS5tVHlwZSk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgfQorICAgIHN0YXR1c190IHJlcyA9ICBtUG9saWN5TWl4ZXMuc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWQsIGRldmljZXMpOworICAgIGlmIChyZXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgLy8gcmVldmFsdWF0ZSBvdXRwdXRzIGZvciBhbGwgZ2l2ZW4gZGV2aWNlcworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldkRlc2MgPSBtSHdNb2R1bGVzLmdldERldmljZURlc2NyaXB0b3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlc1tpXS5tVHlwZSwgZGV2aWNlc1tpXS5tQWRkcmVzcy5jX3N0cigpLCBTdHJpbmc4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RFRkFVTFQpOworICAgICAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzOworICAgICAgICAgICAgaWYgKGNoZWNrT3V0cHV0c0ZvckRldmljZShkZXZEZXNjLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0cykgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgic2V0VWlkRGV2aWNlQWZmaW5pdGllcygpIGVycm9yIGluIGNoZWNrT3V0cHV0c0ZvckRldmljZSBmb3IgZGV2aWNlPSUwOHgiCisgICAgICAgICAgICAgICAgICAgICAgICAiIGFkZHI9JXMiLCBkZXZpY2VzW2ldLm1UeXBlLCBkZXZpY2VzW2ldLm1BZGRyZXNzLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKSB7CisgICAgQUxPR1YoIiVzKCkgdWlkPSVkIiwgX19GVU5DVElPTl9fLCB1aWQpOworICAgIHN0YXR1c190IHJlcyA9IG1Qb2xpY3lNaXhlcy5yZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZCk7CisgICAgaWYgKHJlcyAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiJXMoKSBDb3VsZCBub3QgcmVtb3ZlIGFsbCBkZXZpY2UgYWZmaW5pdGllcyBmbyB1aWQgPSAlZCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHVpZCk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkgeworICAgIEFMT0dJKCIlcygpIHN0cmF0ZWd5PSVkIGRldmljZT0lMDh4IGFkZHI9JXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICBzdHJhdGVneSwgZGV2aWNlLm1UeXBlLCBkZXZpY2UubUFkZHJlc3MuY19zdHIoKSk7CisgICAgLy8gc3RyYXRlZ3kgcHJlZmVycmVkIGRldmljZSBpcyBvbmx5IGZvciBvdXRwdXQgZGV2aWNlcworICAgIGlmICghYXVkaW9faXNfb3V0cHV0X2RldmljZShkZXZpY2UubVR5cGUpKSB7CisgICAgICAgIEFMT0dFKCIlcygpIGRldmljZT0lMDh4IGlzIE5PVCBhbiBvdXRwdXQgZGV2aWNlIiwgX19GVU5DVElPTl9fLCBkZXZpY2UubVR5cGUpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1FbmdpbmUtPnNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBkZXZpY2UpOworICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgQUxPR1coIkVuZ2luZSBjb3VsZCBub3Qgc2V0IHByZWZlcnJlZCBkZXZpY2UgJTA4eCAlcyBmb3Igc3RyYXRlZ3kgJWQiLAorICAgICAgICAgICAgICAgIGRldmljZS5tVHlwZSwgZGV2aWNlLm1BZGRyZXNzLmNfc3RyKCksIHN0cmF0ZWd5KTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoKTsKKyAgICB1cGRhdGVDYWxsQW5kT3V0cHV0Um91dGluZygpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlQ2FsbEFuZE91dHB1dFJvdXRpbmcoYm9vbCBmb3JjZVZvbHVtZVJlZXZhbCwgdWludDMyX3QgZGVsYXlNcykKK3sKKyAgICB1aW50MzJfdCB3YWl0TXMgPSAwOworICAgIGlmIChtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCkgPT0gQVVESU9fTU9ERV9JTl9DQUxMICYmIGhhc1ByaW1hcnlPdXRwdXQoKSkgeworICAgICAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IGdldE5ld091dHB1dERldmljZXMobVByaW1hcnlPdXRwdXQsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIHdhaXRNcyA9IHVwZGF0ZUNhbGxSb3V0aW5nKG5ld0RldmljZXMsIGRlbGF5TXMpOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXMgPSBnZXROZXdPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIHRydWUgLypmcm9tQ2FjaGUqLyk7CisgICAgICAgIGlmICgobUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpICE9IEFVRElPX01PREVfSU5fQ0FMTCkgfHwgKG91dHB1dERlc2MgIT0gbVByaW1hcnlPdXRwdXQpKSB7CisgICAgICAgICAgICAvLyBBcyBkb25lIGluIHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSwgd2UgY291bGQgYWxzbyBmaXggZGVmYXVsdCBkZXZpY2UgaXNzdWUgYnkKKyAgICAgICAgICAgIC8vIHByZXZlbnRpbmcgdGhlIGZvcmNlIHJlLXJvdXRpbmcgaW4gY2FzZSBvZiBkZWZhdWx0IGRldiB0aGF0IGRpc3Rpbmd1aXNoZXMgb24gYWRkcmVzcy4KKyAgICAgICAgICAgIC8vIExldCdzIGdpdmUgYmFjayB0byBlbmdpbmUgZnVsbCBkZXZpY2UgY2hvaWNlIGRlY2lzaW9uIGhvd2V2ZXIuCisgICAgICAgICAgICB3YWl0TXMgPSBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIG5ld0RldmljZXMsICFuZXdEZXZpY2VzLmlzRW1wdHkoKSwgZGVsYXlNcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGZvcmNlVm9sdW1lUmVldmFsICYmICFuZXdEZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICAgICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dERlc2MsIG5ld0RldmljZXMudHlwZXMoKSwgd2FpdE1zLCB0cnVlKTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpyZW1vdmVQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3kpCit7CisgICAgQUxPR0koIiVzKCkgc3RyYXRlZ3k9JWQiLCBfX0ZVTkNUSU9OX18sIHN0cmF0ZWd5KTsKKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1FbmdpbmUtPnJlbW92ZVByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKKyAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dXKCJFbmdpbmUgY291bGQgbm90IHJlbW92ZSBwcmVmZXJyZWQgZGV2aWNlIGZvciBzdHJhdGVneSAlZCIsIHN0cmF0ZWd5KTsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisKKyAgICBjaGVja0ZvckRldmljZUFuZE91dHB1dENoYW5nZXMoKTsKKyAgICB1cGRhdGVDYWxsQW5kT3V0cHV0Um91dGluZygpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSkgeworICAgIHJldHVybiBtRW5naW5lLT5nZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZGV2aWNlKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmR1bXAoU3RyaW5nOCAqZHN0KSBjb25zdAoreworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCJcbkF1ZGlvUG9saWN5TWFuYWdlciBEdW1wOiAlcFxuIiwgdGhpcyk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBQcmltYXJ5IE91dHB1dDogJWRcbiIsCisgICAgICAgICAgICAgaGFzUHJpbWFyeU91dHB1dCgpID8gbVByaW1hcnlPdXRwdXQtPm1Jb0hhbmRsZSA6IEFVRElPX0lPX0hBTkRMRV9OT05FKTsKKyAgICBzdGQ6OnN0cmluZyBzdGF0ZUxpdGVyYWw7CisgICAgQXVkaW9Nb2RlQ29udmVydGVyOjp0b1N0cmluZyhtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCksIHN0YXRlTGl0ZXJhbCk7CisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBQaG9uZSBzdGF0ZTogJXNcbiIsIHN0YXRlTGl0ZXJhbC5jX3N0cigpKTsKKyAgICBjb25zdCBjaGFyKiBmb3JjZVVzZXNbQVVESU9fUE9MSUNZX0ZPUkNFX1VTRV9DTlRdID0geworICAgICAgICAiY29tbXVuaWNhdGlvbnMiLCAibWVkaWEiLCAicmVjb3JkIiwgImRvY2siLCAic3lzdGVtIiwKKyAgICAgICAgIkhETUkgc3lzdGVtIGF1ZGlvIiwgImVuY29kZWQgc3Vycm91bmQgb3V0cHV0IiwgInZpYnJhdGUgcmluZ2luZyIgfTsKKyAgICBmb3IgKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCBpID0gQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OOworICAgICAgICAgaSA8IEFVRElPX1BPTElDWV9GT1JDRV9VU0VfQ05UOyBpID0gKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCkoKGludClpICsgMSkpIHsKKyAgICAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBmb3JjZVVzZVZhbHVlID0gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoaSk7CisgICAgICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgRm9yY2UgdXNlIGZvciAlczogJWQiLCBmb3JjZVVzZXNbaV0sIGZvcmNlVXNlVmFsdWUpOworICAgICAgICBpZiAoaSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQgJiYKKyAgICAgICAgICAgICAgICBmb3JjZVVzZVZhbHVlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCkgeworICAgICAgICAgICAgZHN0LT5hcHBlbmQoIiAoTUFOVUFMOiAiKTsKKyAgICAgICAgICAgIGR1bXBNYW51YWxTdXJyb3VuZEZvcm1hdHMoZHN0KTsKKyAgICAgICAgICAgIGRzdC0+YXBwZW5kKCIpIik7CisgICAgICAgIH0KKyAgICAgICAgZHN0LT5hcHBlbmQoIlxuIik7CisgICAgfQorICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgVFRTIG91dHB1dCAlc2F2YWlsYWJsZVxuIiwgbVR0c091dHB1dEF2YWlsYWJsZSA/ICIiIDogIm5vdCAiKTsKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiIE1hc3RlciBtb25vOiAlc1xuIiwgbU1hc3Rlck1vbm8gPyAib24iIDogIm9mZiIpOworICAgIGRzdC0+YXBwZW5kRm9ybWF0KCIgQ29uZmlnIHNvdXJjZTogJXNcbiIsIG1Db25maWcuZ2V0U291cmNlKCkuY19zdHIoKSk7IC8vIGdldENvbmZpZyBub3QgY29uc3QKKyAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5kdW1wKGRzdCwgU3RyaW5nOCgiQXZhaWxhYmxlIG91dHB1dCIpKTsKKyAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmR1bXAoZHN0LCBTdHJpbmc4KCJBdmFpbGFibGUgaW5wdXQiKSk7CisgICAgbUh3TW9kdWxlc0FsbC5kdW1wKGRzdCk7CisgICAgbU91dHB1dHMuZHVtcChkc3QpOworICAgIG1JbnB1dHMuZHVtcChkc3QpOworICAgIG1FZmZlY3RzLmR1bXAoZHN0KTsKKyAgICBtQXVkaW9QYXRjaGVzLmR1bXAoZHN0KTsKKyAgICBtUG9saWN5TWl4ZXMuZHVtcChkc3QpOworICAgIG1BdWRpb1NvdXJjZXMuZHVtcChkc3QpOworCisgICAgZHN0LT5hcHBlbmRGb3JtYXQoIiBBbGxvd2VkQ2FwdHVyZVBvbGljaWVzOlxuIik7CisgICAgZm9yIChhdXRvJiBwb2xpY3kgOiBtQWxsb3dlZENhcHR1cmVQb2xpY2llcykgeworICAgICAgICBkc3QtPmFwcGVuZEZvcm1hdCgiICAgLSB1aWQ9JWQgZmxhZ19tYXNrPSUjeFxuIiwgcG9saWN5LmZpcnN0LCBwb2xpY3kuc2Vjb25kKTsKKyAgICB9CisKKyAgICBkc3QtPmFwcGVuZEZvcm1hdCgiXG5Qb2xpY3kgRW5naW5lIGR1bXA6XG4iKTsKKyAgICBtRW5naW5lLT5kdW1wKGRzdCk7Cit9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6ZHVtcChpbnQgZmQpCiB7Ci0gICAgY29uc3Qgc2l6ZV90IFNJWkUgPSAyNTY7Ci0gICAgY2hhciBidWZmZXJbU0laRV07CiAgICAgU3RyaW5nOCByZXN1bHQ7Ci0KLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICJcbkF1ZGlvUG9saWN5TWFuYWdlciBEdW1wOiAlcFxuIiwgdGhpcyk7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotCi0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFByaW1hcnkgT3V0cHV0OiAlZFxuIiwKLSAgICAgICAgICAgICBoYXNQcmltYXJ5T3V0cHV0KCkgPyBtUHJpbWFyeU91dHB1dC0+bUlvSGFuZGxlIDogQVVESU9fSU9fSEFORExFX05PTkUpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzdGQ6OnN0cmluZyBzdGF0ZUxpdGVyYWw7Ci0gICAgQXVkaW9Nb2RlQ29udmVydGVyOjp0b1N0cmluZyhtRW5naW5lLT5nZXRQaG9uZVN0YXRlKCksIHN0YXRlTGl0ZXJhbCk7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFBob25lIHN0YXRlOiAlc1xuIiwgc3RhdGVMaXRlcmFsLmNfc3RyKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBjb21tdW5pY2F0aW9ucyAlZFxuIiwKLSAgICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0NPTU1VTklDQVRJT04pKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgbWVkaWEgJWRcbiIsIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfTUVESUEpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgcmVjb3JkICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1JFQ09SRCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBkb2NrICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0RPQ0spKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3Igc3lzdGVtICVkXG4iLCBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKLSAgICBzbnByaW50ZihidWZmZXIsIFNJWkUsICIgRm9yY2UgdXNlIGZvciBoZG1pIHN5c3RlbSBhdWRpbyAlZFxuIiwKLSAgICAgICAgICAgIG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfSERNSV9TWVNURU1fQVVESU8pKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIEZvcmNlIHVzZSBmb3IgZW5jb2RlZCBzdXJyb3VuZCBvdXRwdXQgJWRcbiIsCi0gICAgICAgICAgICBtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0gICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiIFRUUyBvdXRwdXQgJXNcbiIsIG1UdHNPdXRwdXRBdmFpbGFibGUgPyAiYXZhaWxhYmxlIiA6ICJub3QgYXZhaWxhYmxlIik7Ci0gICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiBNYXN0ZXIgbW9ubzogJXNcbiIsIG1NYXN0ZXJNb25vID8gIm9uIiA6ICJvZmYiKTsKLSAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7Ci0KKyAgICBkdW1wKCZyZXN1bHQpOwogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KIAotICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmR1bXAoZmQsIFN0cmluZzgoIkF2YWlsYWJsZSBvdXRwdXQiKSk7Ci0gICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5kdW1wKGZkLCBTdHJpbmc4KCJBdmFpbGFibGUgaW5wdXQiKSk7Ci0gICAgbUh3TW9kdWxlc0FsbC5kdW1wKGZkKTsKLSAgICBtT3V0cHV0cy5kdW1wKGZkKTsKLSAgICBtSW5wdXRzLmR1bXAoZmQpOwotICAgIG1Wb2x1bWVDdXJ2ZXMtPmR1bXAoZmQpOwotICAgIG1FZmZlY3RzLmR1bXAoZmQpOwotICAgIG1BdWRpb1BhdGNoZXMuZHVtcChmZCk7Ci0gICAgbVBvbGljeU1peGVzLmR1bXAoZmQpOwotCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldEFsbG93ZWRDYXB0dXJlUG9saWN5KHVpZF90IHVpZCwgYXVkaW9fZmxhZ3NfbWFza190IGNhcHR1cmVQb2xpY3kpCit7CisgICAgbUFsbG93ZWRDYXB0dXJlUG9saWNpZXNbdWlkXSA9IGNhcHR1cmVQb2xpY3k7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCkBAIC0yNzEyLDEyICszMTkzLDkgQEAKICAgICB9CiAKICAgICAvLyBDaGVjayBpZiBvZmZsb2FkIGhhcyBiZWVuIGRpc2FibGVkCi0gICAgY2hhciBwcm9wVmFsdWVbUFJPUEVSVFlfVkFMVUVfTUFYXTsKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJhdWRpby5vZmZsb2FkLmRpc2FibGUiLCBwcm9wVmFsdWUsICIwIikpIHsKLSAgICAgICAgaWYgKGF0b2kocHJvcFZhbHVlKSAhPSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigib2ZmbG9hZCBkaXNhYmxlZCBieSBhdWRpby5vZmZsb2FkLmRpc2FibGU9JXMiLCBwcm9wVmFsdWUgKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQorICAgIGlmIChwcm9wZXJ0eV9nZXRfYm9vbCgiYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIiwgZmFsc2UgLyogZGVmYXVsdF92YWx1ZSAqLykpIHsKKyAgICAgICAgQUxPR1YoIm9mZmxvYWQgZGlzYWJsZWQgYnkgYXVkaW8ub2ZmbG9hZC5kaXNhYmxlIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKICAgICAvLyBDaGVjayBpZiBzdHJlYW0gdHlwZSBpcyBtdXNpYywgdGhlbiBvbmx5IGFsbG93IG9mZmxvYWQgYXMgb2Ygbm93LgpAQCAtMjczNiw5ICszMjE0LDEyIEBACiAgICAgfQogCiAgICAgLy9JZiBkdXJhdGlvbiBpcyBsZXNzIHRoYW4gbWluaW11bSB2YWx1ZSBkZWZpbmVkIGluIHByb3BlcnR5LCByZXR1cm4gZmFsc2UKLSAgICBpZiAocHJvcGVydHlfZ2V0KCJhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzIiwgcHJvcFZhbHVlLCBOVUxMKSkgewotICAgICAgICBpZiAob2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPCAoYXRvaShwcm9wVmFsdWUpICogMTAwMDAwMCApKSB7Ci0gICAgICAgICAgICBBTE9HVigiT2ZmbG9hZCBkZW5pZWQgYnkgZHVyYXRpb24gPCBhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzKD0lcykiLCBwcm9wVmFsdWUpOworICAgIGNvbnN0IGludCBtaW5fZHVyYXRpb25fc2VjcyA9IHByb3BlcnR5X2dldF9pbnQzMigKKyAgICAgICAgICAgICJhdWRpby5vZmZsb2FkLm1pbi5kdXJhdGlvbi5zZWNzIiwgLTEgLyogZGVmYXVsdF92YWx1ZSAqLyk7CisgICAgaWYgKG1pbl9kdXJhdGlvbl9zZWNzID49IDApIHsKKyAgICAgICAgaWYgKG9mZmxvYWRJbmZvLmR1cmF0aW9uX3VzIDwgbWluX2R1cmF0aW9uX3NlY3MgKiAxMDAwMDAwTEwpIHsKKyAgICAgICAgICAgIEFMT0dWKCJPZmZsb2FkIGRlbmllZCBieSBkdXJhdGlvbiA8IGF1ZGlvLm9mZmxvYWQubWluLmR1cmF0aW9uLnNlY3MoPSVkKSIsCisgICAgICAgICAgICAgICAgICAgIG1pbl9kdXJhdGlvbl9zZWNzKTsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAob2ZmbG9hZEluZm8uZHVyYXRpb25fdXMgPCBPRkZMT0FEX0RFRkFVTFRfTUlOX0RVUkFUSU9OX1NFQ1MgKiAxMDAwMDAwKSB7CkBAIC0yNzU4LDE1ICszMjM5LDM0IEBACiAKICAgICAvLyBTZWUgaWYgdGhlcmUgaXMgYSBwcm9maWxlIHRvIHN1cHBvcnQgdGhpcy4KICAgICAvLyBBVURJT19ERVZJQ0VfTk9ORQotICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JEaXJlY3RPdXRwdXQoQVVESU9fREVWSUNFX05PTkUgLyppZ25vcmUgZGV2aWNlICovLAorICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JPdXRwdXQoRGV2aWNlVmVjdG9yKCkgLyppZ25vcmUgZGV2aWNlICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mby5zYW1wbGVfcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZEluZm8uZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZsb2FkSW5mby5jaGFubmVsX21hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19PVVRQVVRfRkxBR19DT01QUkVTU19PRkZMT0FELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qIGRpcmVjdE9ubHkgKi8pOwogICAgIEFMT0dWKCJpc09mZmxvYWRTdXBwb3J0ZWQoKSBwcm9maWxlICVzZm91bmQiLCBwcm9maWxlICE9IDAgPyAiIiA6ICJOT1QgIik7CiAgICAgcmV0dXJuIChwcm9maWxlICE9IDApOwogfQogCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCYgYXR0cmlidXRlcykgeworICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG91dHB1dF9mbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkU7CisgICAgYXVkaW9fZmxhZ3NfdG9fYXVkaW9fb3V0cHV0X2ZsYWdzKGF0dHJpYnV0ZXMuZmxhZ3MsICZvdXRwdXRfZmxhZ3MpOworICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGdldFByb2ZpbGVGb3JPdXRwdXQoRGV2aWNlVmVjdG9yKCkgLyppZ25vcmUgZGV2aWNlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9mbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSAvKiBkaXJlY3RPbmx5ICovKTsKKyAgICBBTE9HVigiJXMoKSBwcm9maWxlICVzZm91bmQgd2l0aCBuYW1lOiAlcywgIgorICAgICAgICAic2FtcGxlIHJhdGU6ICV1LCBmb3JtYXQ6IDB4JXgsIGNoYW5uZWxfbWFzazogMHgleCwgb3V0cHV0IGZsYWdzOiAweCV4IiwKKyAgICAgICAgX19GVU5DVElPTl9fLCBwcm9maWxlICE9IDAgPyAiIiA6ICJOT1QgIiwKKyAgICAgICAgKHByb2ZpbGUgIT0gMCA/IHByb2ZpbGUtPmdldFRhZ05hbWUoKS5jX3N0cigpIDogIm51bGwiKSwKKyAgICAgICAgY29uZmlnLnNhbXBsZV9yYXRlLCBjb25maWcuZm9ybWF0LCBjb25maWcuY2hhbm5lbF9tYXNrLCBvdXRwdXRfZmxhZ3MpOworICAgIHJldHVybiAocHJvZmlsZSAhPSAwKTsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgKm51bV9wb3J0cywKQEAgLTI4NjQsMTkgKzMzNjQsMTggQEAKICAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjcmVhdGVBdWRpb1BhdGNoSW50ZXJuYWwoY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsIHVpbnQzMl90IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYykKIHsKLSAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIik7Ci0KKyAgICBBTE9HVigiJXMiLCBfX2Z1bmNfXyk7CiAgICAgaWYgKGhhbmRsZSA9PSBOVUxMIHx8IHBhdGNoID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBudW0gc291cmNlcyAlZCBudW0gc2lua3MgJWQiLCBwYXRjaC0+bnVtX3NvdXJjZXMsIHBhdGNoLT5udW1fc2lua3MpOworICAgIEFMT0dWKCIlcyBudW0gc291cmNlcyAlZCBudW0gc2lua3MgJWQiLCBfX2Z1bmNfXywgcGF0Y2gtPm51bV9zb3VyY2VzLCBwYXRjaC0+bnVtX3NpbmtzKTsKIAotICAgIGlmIChwYXRjaC0+bnVtX3NvdXJjZXMgPT0gMCB8fCBwYXRjaC0+bnVtX3NvdXJjZXMgPiBBVURJT19QQVRDSF9QT1JUU19NQVggfHwKLSAgICAgICAgICAgIHBhdGNoLT5udW1fc2lua3MgPT0gMCB8fCBwYXRjaC0+bnVtX3NpbmtzID4gQVVESU9fUEFUQ0hfUE9SVFNfTUFYKSB7CisgICAgaWYgKCFhdWRpb19wYXRjaF9pc192YWxpZChwYXRjaCkpIHsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgLy8gb25seSBvbmUgc291cmNlIHBlciBhdWRpbyBwYXRjaCBzdXBwb3J0ZWQgZm9yIG5vdwpAQCAtMjg5NiwyMiArMzM5NSwyMiBAQAogICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKICAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpoYW5kbGUpOwogCi0gICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2ggc291cmNlIGlkICVkIHJvbGUgJWQgdHlwZSAlZCIsIHBhdGNoLT5zb3VyY2VzWzBdLmlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5yb2xlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS50eXBlKTsKKyAgICBBTE9HVigiJXMgc291cmNlIGlkICVkIHJvbGUgJWQgdHlwZSAlZCIsIF9fZnVuY19fLCBwYXRjaC0+c291cmNlc1swXS5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5yb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUpOwogI2lmIExPR19OREVCVUcgPT0gMAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGF0Y2gtPm51bV9zaW5rczsgaSsrKSB7Ci0gICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoIHNpbmsgJXp1OiBpZCAlZCByb2xlICVkIHR5cGUgJWQiLCBpLCBwYXRjaC0+c2lua3NbaV0uaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLnJvbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzW2ldLnR5cGUpOworICAgICAgICBBTE9HVigiJXMgc2luayAlenU6IGlkICVkIHJvbGUgJWQgdHlwZSAlZCIsIF9fZnVuY19fICxpLCBwYXRjaC0+c2lua3NbaV0uaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1tpXS5yb2xlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c2lua3NbaV0udHlwZSk7CiAgICAgfQogI2VuZGlmCiAKICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIG1VaWRDYWNoZWQgJWQgcGF0Y2hEZXNjLT5tVWlkICVkIHVpZCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVWlkQ2FjaGVkLCBwYXRjaERlc2MtPm1VaWQsIHVpZCk7Ci0gICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgIT0gbVVpZENhY2hlZCAmJiB1aWQgIT0gcGF0Y2hEZXNjLT5tVWlkKSB7CisgICAgICAgIEFMT0dWKCIlcyBtVWlkQ2FjaGVkICVkIHBhdGNoRGVzYy0+bVVpZCAlZCB1aWQgJWQiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgbVVpZENhY2hlZCwgcGF0Y2hEZXNjLT5nZXRVaWQoKSwgdWlkKTsKKyAgICAgICAgaWYgKHBhdGNoRGVzYy0+Z2V0VWlkKCkgIT0gbVVpZENhY2hlZCAmJiB1aWQgIT0gcGF0Y2hEZXNjLT5nZXRVaWQoKSkgewogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKQEAgLTI5MjEsMTUgKzM0MjAsMTUgQEAKICAgICBpZiAocGF0Y2gtPnNvdXJjZXNbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfTUlYKSB7CiAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMuZ2V0T3V0cHV0RnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKICAgICAgICAgaWYgKG91dHB1dERlc2MgPT0gTlVMTCkgewotICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBvdXRwdXQgbm90IGZvdW5kIGZvciBpZCAlZCIsIHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBvdXRwdXQgbm90IGZvdW5kIGZvciBpZCAlZCIsIF9fZnVuY19fLCBwYXRjaC0+c291cmNlc1swXS5pZCk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAgICAgICAgIEFMT0dfQVNTRVJUKCFvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSwiZHVwbGljYXRlZCBvdXRwdXQgJWQgaW4gc291cmNlIGluIHBvcnRzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERlc2MtPm1Jb0hhbmRsZSk7CiAgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCkgewogICAgICAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVBhdGNoLnNvdXJjZXNbMF0uaWQgIT0gcGF0Y2gtPnNvdXJjZXNbMF0uaWQpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNvdXJjZSBpZCBkaWZmZXJzIGZvciBwYXRjaCBjdXJyZW50IGlkICVkIG5ldyBpZCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaC5zb3VyY2VzWzBdLmlkLCBwYXRjaC0+c291cmNlc1swXS5pZCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIHNvdXJjZSBpZCBkaWZmZXJzIGZvciBwYXRjaCBjdXJyZW50IGlkICVkIG5ldyBpZCAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIHBhdGNoRGVzYy0+bVBhdGNoLnNvdXJjZXNbMF0uaWQsIHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC0yOTM4LDE4ICszNDM3LDE3IEBACiAgICAgICAgICAgICAvLyBPbmx5IHN1cHBvcnQgbWl4IHRvIGRldmljZXMgY29ubmVjdGlvbgogICAgICAgICAgICAgLy8gVE9ETyBhZGQgc3VwcG9ydCBmb3IgbWl4IHRvIG1peCBjb25uZWN0aW9uCiAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc291cmNlIG1peCBidXQgc2luayBpcyBub3QgYSBkZXZpY2UiKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgc291cmNlIG1peCBidXQgc2luayBpcyBub3QgYSBkZXZpY2UiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9CiAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c2lua3NbaV0uaWQpOwogICAgICAgICAgICAgaWYgKGRldkRlc2MgPT0gMCkgewotICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgb3V0IGRldmljZSBub3QgZm91bmQgZm9yIGlkICVkIiwgcGF0Y2gtPnNpbmtzW2ldLmlkKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgb3V0IGRldmljZSBub3QgZm91bmQgZm9yIGlkICVkIiwgX19mdW5jX18sIHBhdGNoLT5zaW5rc1tpXS5pZCk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5tUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZEZXNjLT50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPm1BZGRyZXNzLAorICAgICAgICAgICAgaWYgKCFvdXRwdXREZXNjLT5tUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShEZXZpY2VWZWN0b3IoZGV2RGVzYyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zb3VyY2VzWzBdLnNhbXBsZV9yYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAgLy8gdXBkYXRlZFNhbXBsaW5nUmF0ZQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5mb3JtYXQsCkBAIC0yOTU3LDggKzM0NTUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRjaC0+c291cmNlc1swXS5jaGFubmVsX21hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAvLyB1cGRhdGVkQ2hhbm5lbE1hc2sKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSAvKkZJWE1FKi8pKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBwcm9maWxlIG5vdCBzdXBwb3J0ZWQgZm9yIGRldmljZSAlMDh4IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPnR5cGUoKSk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIHByb2ZpbGUgbm90IHN1cHBvcnRlZCBmb3IgZGV2aWNlICUwOHgiLCBfX2Z1bmNfXywgZGV2RGVzYy0+dHlwZSgpKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBkZXZpY2VzLmFkZChkZXZEZXNjKTsKQEAgLTI5NjgsMTkgKzM0NjUsMTkgQEAKICAgICAgICAgfQogCiAgICAgICAgIC8vIFRPRE86IHJlY29uZmlndXJlIG91dHB1dCBmb3JtYXQgYW5kIGNoYW5uZWxzIGhlcmUKLSAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXR0aW5nIGRldmljZSAlMDh4IG9uIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgIGRldmljZXMudHlwZXMoKSwgb3V0cHV0RGVzYy0+bUlvSGFuZGxlKTsKLSAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsIGRldmljZXMudHlwZXMoKSwgdHJ1ZSwgMCwgaGFuZGxlKTsKKyAgICAgICAgQUxPR1YoIiVzIHNldHRpbmcgZGV2aWNlICVzIG9uIG91dHB1dCAlZCIsCisgICAgICAgICAgICAgIF9fZnVuY19fLCBkdW1wRGV2aWNlVHlwZXMoZGV2aWNlcy50eXBlcygpKS5jX3N0cigpLCBvdXRwdXREZXNjLT5tSW9IYW5kbGUpOworICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsIGRldmljZXMsIHRydWUsIDAsIGhhbmRsZSk7CiAgICAgICAgIGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KCpoYW5kbGUpOwogICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICAgaWYgKHBhdGNoRGVzYyAhPSAwICYmIHBhdGNoRGVzYyAhPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1coImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXRPdXRwdXREZXZpY2UoKSBkaWQgbm90IHJldXNlIHRoZSBwYXRjaCBwcm92aWRlZCIpOworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBzZXRPdXRwdXREZXZpY2UoKSBkaWQgbm90IHJldXNlIHRoZSBwYXRjaCBwcm92aWRlZCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgICAgICBwYXRjaERlc2MtPm1VaWQgPSB1aWQ7Ci0gICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHN1Y2Nlc3MiKTsKKyAgICAgICAgICAgIHBhdGNoRGVzYy0+c2V0VWlkKHVpZCk7CisgICAgICAgICAgICBBTE9HVigiJXMgc3VjY2VzcyIsIF9fZnVuY19fKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0T3V0cHV0RGV2aWNlKCkgZmFpbGVkIHRvIGNyZWF0ZSBhIHBhdGNoIik7CisgICAgICAgICAgICBBTE9HVygiJXMgc2V0T3V0cHV0RGV2aWNlKCkgZmFpbGVkIHRvIGNyZWF0ZSBhIHBhdGNoIiwgX19mdW5jX18pOwogICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKQEAgLTI5OTksMTQgKzM0OTYsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0KKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9CiAgICAgICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKLSAgICAgICAgICAgIGlmIChkZXZEZXNjID09IDApIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2UgPT0gMCkgewogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlmICghaW5wdXREZXNjLT5tUHJvZmlsZS0+aXNDb21wYXRpYmxlUHJvZmlsZShkZXZEZXNjLT50eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+bUFkZHJlc3MsCisgICAgICAgICAgICBpZiAoIWlucHV0RGVzYy0+bVByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoRGV2aWNlVmVjdG9yKGRldmljZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0Y2gtPnNpbmtzWzBdLnNhbXBsZV9yYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIC8qdXBkYXRlZFNhbXBsZVJhdGUqLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoLT5zaW5rc1swXS5mb3JtYXQsCkBAIC0zMDIwLDE5ICszNTE2LDE5IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gVE9ETzogcmVjb25maWd1cmUgb3V0cHV0IGZvcm1hdCBhbmQgY2hhbm5lbHMgaGVyZQotICAgICAgICAgICAgQUxPR1YoImNyZWF0ZUF1ZGlvUGF0Y2goKSBzZXR0aW5nIGRldmljZSAlMDh4IG9uIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPnR5cGUoKSwgaW5wdXREZXNjLT5tSW9IYW5kbGUpOwotICAgICAgICAgICAgc2V0SW5wdXREZXZpY2UoaW5wdXREZXNjLT5tSW9IYW5kbGUsIGRldkRlc2MtPnR5cGUoKSwgdHJ1ZSwgaGFuZGxlKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBzZXR0aW5nIGRldmljZSAlcyBvbiBvdXRwdXQgJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgIGRldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpLCBpbnB1dERlc2MtPm1Jb0hhbmRsZSk7CisgICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dERlc2MtPm1Jb0hhbmRsZSwgZGV2aWNlLCB0cnVlLCBoYW5kbGUpOwogICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKmhhbmRsZSk7CiAgICAgICAgICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICAgICAgICAgIGlmIChwYXRjaERlc2MgIT0gMCAmJiBwYXRjaERlc2MgIT0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIHNldElucHV0RGV2aWNlKCkgZGlkIG5vdCByZXVzZSB0aGUgcGF0Y2ggcHJvdmlkZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1coIiVzIHNldElucHV0RGV2aWNlKCkgZGlkIG5vdCByZXVzZSB0aGUgcGF0Y2ggcHJvdmlkZWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tVWlkID0gdWlkOwotICAgICAgICAgICAgICAgIEFMT0dWKCJjcmVhdGVBdWRpb1BhdGNoKCkgc3VjY2VzcyIpOworICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+c2V0VWlkKHVpZCk7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzIHN1Y2Nlc3MiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dXKCJjcmVhdGVBdWRpb1BhdGNoKCkgc2V0SW5wdXREZXZpY2UoKSBmYWlsZWQgdG8gY3JlYXRlIGEgcGF0Y2giKTsKKyAgICAgICAgICAgICAgICBBTE9HVygiJXMgc2V0SW5wdXREZXZpY2UoKSBmYWlsZWQgdG8gY3JlYXRlIGEgcGF0Y2giLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKQEAgLTMwNDIsODMgKzM1MzgsMTA0IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlRGVzYyA9CisgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzcmNEZXZpY2UgPQogICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZUZyb21JZChwYXRjaC0+c291cmNlc1swXS5pZCk7Ci0gICAgICAgICAgICBpZiAoc3JjRGV2aWNlRGVzYyA9PSAwKSB7CisgICAgICAgICAgICBpZiAoc3JjRGV2aWNlID09IDApIHsKICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICAvL3VwZGF0ZSBzb3VyY2UgYW5kIHNpbmsgd2l0aCBvdXIgb3duIGRhdGEgYXMgdGhlIGRhdGEgcGFzc2VkIGluIHRoZSBwYXRjaCBtYXkKICAgICAgICAgICAgIC8vIGJlIGluY29tcGxldGUuCi0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggbmV3UGF0Y2ggPSAqcGF0Y2g7Ci0gICAgICAgICAgICBzcmNEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc291cmNlc1swXSwgJnBhdGNoLT5zb3VyY2VzWzBdKTsKKyAgICAgICAgICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CisgICAgICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyBzb3VyY2VQb3J0Q29uZmlnID0ge307CisgICAgICAgICAgICBzcmNEZXZpY2UtPnRvQXVkaW9Qb3J0Q29uZmlnKCZzb3VyY2VQb3J0Q29uZmlnLCAmcGF0Y2gtPnNvdXJjZXNbMF0pOworICAgICAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShzb3VyY2VQb3J0Q29uZmlnKTsKIAogICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBwYXRjaC0+bnVtX3NpbmtzOyBpKyspIHsKICAgICAgICAgICAgICAgICBpZiAocGF0Y2gtPnNpbmtzW2ldLnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHNvdXJjZSBkZXZpY2UgYnV0IG9uZSBzaW5rIGlzIG5vdCBhIGRldmljZSIpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXMgc291cmNlIGRldmljZSBidXQgb25lIHNpbmsgaXMgbm90IGEgZGV2aWNlIiwgX19mdW5jX18pOwogICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZURlc2MgPQorICAgICAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IHNpbmtEZXZpY2UgPQogICAgICAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlRnJvbUlkKHBhdGNoLT5zaW5rc1tpXS5pZCk7Ci0gICAgICAgICAgICAgICAgaWYgKHNpbmtEZXZpY2VEZXNjID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoc2lua0RldmljZSA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHNpbmtEZXZpY2VEZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc2lua3NbaV0sICZwYXRjaC0+c2lua3NbaV0pOworICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnIHNpbmtQb3J0Q29uZmlnID0ge307CisgICAgICAgICAgICAgICAgc2lua0RldmljZS0+dG9BdWRpb1BvcnRDb25maWcoJnNpbmtQb3J0Q29uZmlnLCAmcGF0Y2gtPnNpbmtzW2ldKTsKKyAgICAgICAgICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU2luayhzaW5rUG9ydENvbmZpZyk7CiAKICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgYSBzb2Z0d2FyZSBicmlkZ2UgaW4gUGF0Y2hQYW5lbCBpZjoKICAgICAgICAgICAgICAgICAvLyAtIHNvdXJjZSBhbmQgc2luayBkZXZpY2VzIGFyZSBvbiBkaWZmZXJlbnQgSFcgbW9kdWxlcyBPUgogICAgICAgICAgICAgICAgIC8vIC0gYXVkaW8gSEFMIHZlcnNpb24gaXMgPCAzLjAKLSAgICAgICAgICAgICAgICBpZiAoIXNyY0RldmljZURlc2MtPmhhc1NhbWVId01vZHVsZUFzKHNpbmtEZXZpY2VEZXNjKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgKHNyY0RldmljZURlc2MtPm1Nb2R1bGUtPmdldEhhbFZlcnNpb25NYWpvcigpIDwgMykpIHsKKyAgICAgICAgICAgICAgICAvLyAtIGF1ZGlvIEhBTCB2ZXJzaW9uIGlzID49IDMuMCBidXQgbm8gcm91dGUgaGFzIGJlZW4gZGVjbGFyZWQgYmV0d2VlbiBkZXZpY2VzCisgICAgICAgICAgICAgICAgLy8gLSBjYWxsZWQgZnJvbSBzdGFydEF1ZGlvU291cmNlIChha2Egc291cmNlRGVzYyAhPSBudWxscHRyKSBhbmQgc291cmNlIGRldmljZSBkb2VzCisgICAgICAgICAgICAgICAgLy8gICBub3QgaGF2ZSBhIGdhaW4gY29udHJvbGxlcgorICAgICAgICAgICAgICAgIGlmICghc3JjRGV2aWNlLT5oYXNTYW1lSHdNb2R1bGVBcyhzaW5rRGV2aWNlKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHNyY0RldmljZS0+Z2V0TW9kdWxlVmVyc2lvbk1ham9yKCkgPCAzKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIXNyY0RldmljZS0+Z2V0TW9kdWxlKCktPnN1cHBvcnRzUGF0Y2goc3JjRGV2aWNlLCBzaW5rRGV2aWNlKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgKHNvdXJjZURlc2MgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIHNyY0RldmljZS0+Z2V0QXVkaW9Qb3J0KCktPmdldEdhaW5zKCkuc2l6ZSgpID09IDApKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBvcnQgb25seSBvbmUgc2luayBkZXZpY2UgZm9yIG5vdyB0byBzaW1wbGlmeSBvdXRwdXQgc2VsZWN0aW9uIGxvZ2ljCiAgICAgICAgICAgICAgICAgICAgIGlmIChwYXRjaC0+bnVtX3NpbmtzID4gMSkgewogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2Uoc2lua0RldmljZURlc2MtPnR5cGUoKSwgbU91dHB1dHMpOwotICAgICAgICAgICAgICAgICAgICAvLyBpZiB0aGUgc2luayBkZXZpY2UgaXMgcmVhY2hhYmxlIHZpYSBhbiBvcGVuZWQgb3V0cHV0IHN0cmVhbSwgcmVxdWVzdCB0byBnbyB2aWEKLSAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBvdXRwdXQgc3RyZWFtIGJ5IGFkZGluZyBhIHNlY29uZCBzb3VyY2UgdG8gdGhlIHBhdGNoIGRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IHNlbGVjdE91dHB1dChvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9JTlZBTElEKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0R1cGxpY2F0ZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZURlc2MgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSBjYXJlIG9mIGR5bmFtaWMgcm91dGluZyBmb3IgU3dPdXRwdXQgc2VsZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSBzb3VyY2VEZXNjLT5hdHRyaWJ1dGVzKCk7CisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IHNvdXJjZURlc2MtPnN0cmVhbSgpOworICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fYXR0cmlidXRlc190IHJlc3VsdEF0dHI7CisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuc2FtcGxlX3JhdGUgPSBzb3VyY2VEZXNjLT5jb25maWcoKS5zYW1wbGVfcmF0ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5jaGFubmVsX21hc2sgPSBzb3VyY2VEZXNjLT5jb25maWcoKS5jaGFubmVsX21hc2s7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcuZm9ybWF0ID0gc291cmNlRGVzYy0+Y29uZmlnKCkuZm9ybWF0OworICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MgPSBBVURJT19PVVRQVVRfRkxBR19OT05FOworICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gc2Vjb25kYXJ5T3V0cHV0czsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dEZvckF0dHJJbnQoJnJlc3VsdEF0dHIsICZvdXRwdXQsIEFVRElPX1NFU1NJT05fTk9ORSwgJmF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHJlYW0sIHNvdXJjZURlc2MtPnVpZCgpLCAmY29uZmlnLCAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWxlY3RlZERldmljZUlkLCAmaXNSZXF1ZXN0ZWREZXZpY2VGb3JFeGNsdXNpdmVVc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzZWNvbmRhcnlPdXRwdXRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXMgbm8gb3V0cHV0IGZvciBkZXZpY2UgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2lua0RldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3UGF0Y2guc291cmNlc1sxXSwgJnBhdGNoLT5zb3VyY2VzWzBdKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IEFVRElPX1NUUkVBTV9QQVRDSDsKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ld1BhdGNoLm51bV9zb3VyY2VzID0gMjsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldE91dHB1dHNGb3JEZXZpY2VzKERldmljZVZlY3RvcihzaW5rRGV2aWNlKSwgbU91dHB1dHMpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIHNpbmsgZGV2aWNlIGlzIHJlYWNoYWJsZSB2aWEgYW4gb3BlbmVkIG91dHB1dCBzdHJlYW0sIHJlcXVlc3QgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvIHZpYSB0aGlzIG91dHB1dCBzdHJlYW0gYnkgYWRkaW5nIGEgc2Vjb25kIHNvdXJjZSB0byB0aGUgcGF0Y2gKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaXB0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBzZWxlY3RPdXRwdXQob3V0cHV0cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG91dHB1dERlc2MtPmlzRHVwbGljYXRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzIG91dHB1dCBmb3IgZGV2aWNlICVzIGlzIGR1cGxpY2F0ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc2lua0RldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyBzcmNNaXhQb3J0Q29uZmlnID0ge307CisgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmc3JjTWl4UG9ydENvbmZpZywgJnBhdGNoLT5zb3VyY2VzWzBdKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VEZXNjICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VEZXNjLT5zZXRTd091dHB1dChvdXRwdXREZXNjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciB2b2x1bWUgY29udHJvbCwgd2UgbWF5IG5lZWQgYSB2YWxpZCBzdHJlYW0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNyY01peFBvcnRDb25maWcuZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IHNvdXJjZURlc2MgIT0gbnVsbHB0ciA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VEZXNjLT5zdHJlYW0oKSA6IEFVRElPX1NUUkVBTV9QQVRDSDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGNoQnVpbGRlci5hZGRTb3VyY2Uoc3JjTWl4UG9ydENvbmZpZyk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBUT0RPOiBjaGVjayBmcm9tIHJvdXRpbmcgY2FwYWJpbGl0aWVzIGluIGNvbmZpZyBmaWxlIGFuZCBvdGhlciBjb25mbGljdGluZyBwYXRjaGVzCiAKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgYWZQYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKCZuZXdQYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCk7Ci0gICAgICAgICAgICBBTE9HVigiY3JlYXRlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgYWZQYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCkgewotICAgICAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBuZXcgQXVkaW9QYXRjaCgmbmV3UGF0Y2gsIHVpZCk7Ci0gICAgICAgICAgICAgICAgICAgIGFkZEF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tSGFuZGxlLCBwYXRjaERlc2MpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bVBhdGNoID0gbmV3UGF0Y2g7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUgPSBhZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgICAgICpoYW5kbGUgPSBwYXRjaERlc2MtPm1IYW5kbGU7Ci0gICAgICAgICAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY3JlYXRlQXVkaW9QYXRjaCgpIHBhdGNoIHBhbmVsIGNvdWxkIG5vdCBjb25uZWN0IGRldmljZSBwYXRjaCwgZXJyb3IgJWQiLAotICAgICAgICAgICAgICAgIHN0YXR1cyk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnN0YWxsUGF0Y2goCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgaW5kZXgsIGhhbmRsZSwgcGF0Y2hCdWlsZGVyLnBhdGNoKCksIGRlbGF5TXMsIHVpZCwgJnBhdGNoRGVzYyk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIiVzIHBhdGNoIHBhbmVsIGNvdWxkIG5vdCBjb25uZWN0IGRldmljZSBwYXRjaCwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7CkBAIC0zMTQxLDMxICszNjU4LDQyIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7Ci0gICAgQUxPR1YoInJlbGVhc2VBdWRpb1BhdGNoKCkgbVVpZENhY2hlZCAlZCBwYXRjaERlc2MtPm1VaWQgJWQgdWlkICVkIiwKLSAgICAgICAgICBtVWlkQ2FjaGVkLCBwYXRjaERlc2MtPm1VaWQsIHVpZCk7Ci0gICAgaWYgKHBhdGNoRGVzYy0+bVVpZCAhPSBtVWlkQ2FjaGVkICYmIHVpZCAhPSBwYXRjaERlc2MtPm1VaWQpIHsKKyAgICBBTE9HVigiJXMoKSBtVWlkQ2FjaGVkICVkIHBhdGNoRGVzYy0+bVVpZCAlZCB1aWQgJWQiLAorICAgICAgICAgIF9fZnVuY19fLCBtVWlkQ2FjaGVkLCBwYXRjaERlc2MtPmdldFVpZCgpLCB1aWQpOworICAgIGlmIChwYXRjaERlc2MtPmdldFVpZCgpICE9IG1VaWRDYWNoZWQgJiYgdWlkICE9IHBhdGNoRGVzYy0+Z2V0VWlkKCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KKyAgICByZXR1cm4gcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChoYW5kbGUpOworfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlbGVhc2VBdWRpb1BhdGNoSW50ZXJuYWwoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpCit7CisgICAgQUxPR1YoIiVzIHBhdGNoICVkIiwgX19mdW5jX18sIGhhbmRsZSk7CisgICAgaWYgKG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShoYW5kbGUpIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IG5vIHBhdGNoIGZvdW5kIHdpdGggaGFuZGxlPSVkIiwgX19mdW5jX18sIGhhbmRsZSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVGb3IoaGFuZGxlKTsKICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoID0gJnBhdGNoRGVzYy0+bVBhdGNoOwotICAgIHBhdGNoRGVzYy0+bVVpZCA9IG1VaWRDYWNoZWQ7CisgICAgcGF0Y2hEZXNjLT5zZXRVaWQobVVpZENhY2hlZCk7CiAgICAgaWYgKHBhdGNoLT5zb3VyY2VzWzBdLnR5cGUgPT0gQVVESU9fUE9SVF9UWVBFX01JWCkgewogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYyA9IG1PdXRwdXRzLmdldE91dHB1dEZyb21JZChwYXRjaC0+c291cmNlc1swXS5pZCk7CiAgICAgICAgIGlmIChvdXRwdXREZXNjID09IE5VTEwpIHsKLSAgICAgICAgICAgIEFMT0dWKCJyZWxlYXNlQXVkaW9QYXRjaCgpIG91dHB1dCBub3QgZm91bmQgZm9yIGlkICVkIiwgcGF0Y2gtPnNvdXJjZXNbMF0uaWQpOworICAgICAgICAgICAgQUxPR1YoIiVzIG91dHB1dCBub3QgZm91bmQgZm9yIGlkICVkIiwgX19mdW5jX18sIHBhdGNoLT5zb3VyY2VzWzBdLmlkKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KIAotICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld091dHB1dERldmljZShvdXRwdXREZXNjLCB0cnVlIC8qZnJvbUNhY2hlKi8pLAotICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgc2V0T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgIGdldE5ld091dHB1dERldmljZXMob3V0cHV0RGVzYywgdHJ1ZSAvKmZyb21DYWNoZSovKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7CiAgICAgfSBlbHNlIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKICAgICAgICAgaWYgKHBhdGNoLT5zaW5rc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKICAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLmdldElucHV0RnJvbUlkKHBhdGNoLT5zaW5rc1swXS5pZCk7CiAgICAgICAgICAgICBpZiAoaW5wdXREZXNjID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBpbnB1dCBub3QgZm91bmQgZm9yIGlkICVkIiwgcGF0Y2gtPnNpbmtzWzBdLmlkKTsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXMgaW5wdXQgbm90IGZvdW5kIGZvciBpZCAlZCIsIF9fZnVuY19fLCBwYXRjaC0+c2lua3NbMF0uaWQpOwogICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBzZXRJbnB1dERldmljZShpbnB1dERlc2MtPm1Jb0hhbmRsZSwKQEAgLTMxNzMsMTAgKzM3MDEsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKICAgICAgICAgfSBlbHNlIGlmIChwYXRjaC0+c2lua3NbMF0udHlwZSA9PSBBVURJT19QT1JUX1RZUEVfREVWSUNFKSB7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7Ci0gICAgICAgICAgICBBTE9HVigicmVsZWFzZUF1ZGlvUGF0Y2goKSBwYXRjaCBwYW5lbCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cywgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICByZW1vdmVBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPQorICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5nZXRBZkhhbmRsZSgpLCBkZWxheU1zKTsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBwYXRjaCBwYW5lbCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIsCisgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgc3RhdHVzLCBwYXRjaERlc2MtPmdldEFmSGFuZGxlKCkpOworICAgICAgICAgICAgcmVtb3ZlQXVkaW9QYXRjaChwYXRjaERlc2MtPmdldEhhbmRsZSgpKTsKICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CiAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgICAgICB9IGVsc2UgewpAQCAtMzI0OSwxMCArMzc3OCwxMCBAQAogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBiYWNrdXBDb25maWc7CisgICAgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnIGJhY2t1cENvbmZpZyA9IHt9OwogICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9ydENvbmZpZy0+YXBwbHlBdWRpb1BvcnRDb25maWcoY29uZmlnLCAmYmFja3VwQ29uZmlnKTsKICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBuZXdDb25maWc7CisgICAgICAgIHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyBuZXdDb25maWcgPSB7fTsKICAgICAgICAgYXVkaW9Qb3J0Q29uZmlnLT50b0F1ZGlvUG9ydENvbmZpZygmbmV3Q29uZmlnLCBjb25maWcpOwogICAgICAgICBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZuZXdDb25maWcsIDApOwogICAgIH0KQEAgLTMyNzQsMzcgKzM4MDMsMzcgQEAKIHsKICAgICBmb3IgKHNzaXplX3QgaSA9IChzc2l6ZV90KW1BdWRpb1BhdGNoZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pICB7CiAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKHBhdGNoRGVzYy0+bVVpZCA9PSB1aWQpIHsKKyAgICAgICAgaWYgKHBhdGNoRGVzYy0+Z2V0VWlkKCkgPT0gdWlkKSB7CiAgICAgICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChtQXVkaW9QYXRjaGVzLmtleUF0KGkpLCB1aWQpOwogICAgICAgICB9CiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tTdHJhdGVneVJvdXRlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91cHR1dFRvU2tpcCkKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja1N0cmF0ZWd5Um91dGUocHJvZHVjdF9zdHJhdGVneV90IHBzLCBhdWRpb19pb19oYW5kbGVfdCBvdXB0dXRUb1NraXApCiB7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKGRldmljZSwgbU91dHB1dHMpOworICAgIC8vIFRha2UgdGhlIGZpcnN0IGF0dHJpYnV0ZXMgZm9sbG93aW5nIHRoZSBwcm9kdWN0IHN0cmF0ZWd5IGFzIGl0IGlzIHVzZWQgdG8gcmV0cmlldmUgdGhlIHJvdXRlZAorICAgIC8vIGRldmljZS4gQWxsIGF0dHJpYnV0ZXMgd2loaW4gYSBzdHJhdGVneSBmb2xsb3dzIHRoZSBzYW1lICJyb3V0aW5nIHN0cmF0ZWd5IgorICAgIGF1dG8gYXR0cmlidXRlcyA9IG1FbmdpbmUtPmdldEFsbEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHMpLmZyb250KCk7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXMgPSBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBudWxscHRyLCBmYWxzZSk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBvdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZXMoZGV2aWNlcywgbU91dHB1dHMpOwogICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgbU91dHB1dHMuc2l6ZSgpOyBqKyspIHsKICAgICAgICAgaWYgKG1PdXRwdXRzLmtleUF0KGopID09IG91cHR1dFRvU2tpcCkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGopOwotICAgICAgICBpZiAoIWlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgKHJvdXRpbmdfc3RyYXRlZ3kpc3RyYXRlZ3kpKSB7CisgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNTdHJhdGVneUFjdGl2ZShwcykpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIC8vIElmIHRoZSBkZWZhdWx0IGRldmljZSBmb3IgdGhpcyBzdHJhdGVneSBpcyBvbiBhbm90aGVyIG91dHB1dCBtaXgsCiAgICAgICAgIC8vIGludmFsaWRhdGUgYWxsIHRyYWNrcyBpbiB0aGlzIHN0cmF0ZWd5IHRvIGZvcmNlIHJlIGNvbm5lY3Rpb24uCiAgICAgICAgIC8vIE90aGVyd2lzZSBzZWxlY3QgbmV3IGRldmljZSBvbiB0aGUgb3V0cHV0IG1peC4KICAgICAgICAgaWYgKG91dHB1dHMuaW5kZXhPZihtT3V0cHV0cy5rZXlBdChqKSkgPCAwKSB7Ci0gICAgICAgICAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGdldFN0cmF0ZWd5KChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSkgPT0gc3RyYXRlZ3kpIHsKLSAgICAgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKTsKLSAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKGF1dG8gc3RyZWFtIDogbUVuZ2luZS0+Z2V0U3RyZWFtVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHMpKSB7CisgICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPmludmFsaWRhdGVTdHJlYW0oc3RyZWFtKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXROZXdPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgICAgICBzZXRPdXRwdXREZXZpY2Uob3V0cHV0RGVzYywgbmV3RGV2aWNlLCBmYWxzZSk7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKAorICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYywgZ2V0TmV3T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLCBmYWxzZSAvKmZyb21DYWNoZSovKSwgZmFsc2UpOwogICAgICAgICB9CiAgICAgfQogfQpAQCAtMzMxMiwxMyArMzg0MSwxOCBAQAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsZWFyU2Vzc2lvblJvdXRlcyh1aWRfdCB1aWQpCiB7CiAgICAgLy8gcmVtb3ZlIG91dHB1dCByb3V0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdWlkCi0gICAgU29ydGVkVmVjdG9yPHJvdXRpbmdfc3RyYXRlZ3k+IGFmZmVjdGVkU3RyYXRlZ2llczsKLSAgICBmb3IgKHNzaXplX3QgaSA9IChzc2l6ZV90KW1PdXRwdXRSb3V0ZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pICB7Ci0gICAgICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBtT3V0cHV0Um91dGVzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChyb3V0ZS0+bVVpZCA9PSB1aWQpIHsKLSAgICAgICAgICAgIG1PdXRwdXRSb3V0ZXMucmVtb3ZlSXRlbXNBdChpKTsKLSAgICAgICAgICAgIGlmIChyb3V0ZS0+bURldmljZURlc2NyaXB0b3IgIT0gMCkgewotICAgICAgICAgICAgICAgIGFmZmVjdGVkU3RyYXRlZ2llcy5hZGQoZ2V0U3RyYXRlZ3kocm91dGUtPm1TdHJlYW1UeXBlKSk7CisgICAgc3RkOjp2ZWN0b3I8cHJvZHVjdF9zdHJhdGVneV90PiBhZmZlY3RlZFN0cmF0ZWdpZXM7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0cy5zaXplKCk7IGkrKykgeworICAgICAgICBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudCA6IG91dHB1dERlc2MtPmdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQtPmhhc1ByZWZlcnJlZERldmljZSgpICYmIGNsaWVudC0+dWlkKCkgPT0gdWlkKSB7CisgICAgICAgICAgICAgICAgY2xpZW50LT5zZXRQcmVmZXJyZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKyAgICAgICAgICAgICAgICBhdXRvIGNsaWVudFN0cmF0ZWd5ID0gY2xpZW50LT5zdHJhdGVneSgpOworICAgICAgICAgICAgICAgIGlmIChzdGQ6OmZpbmQoYmVnaW4oYWZmZWN0ZWRTdHJhdGVnaWVzKSwgZW5kKGFmZmVjdGVkU3RyYXRlZ2llcyksIGNsaWVudFN0cmF0ZWd5KSAhPQorICAgICAgICAgICAgICAgICAgICAgICAgZW5kKGFmZmVjdGVkU3RyYXRlZ2llcykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGFmZmVjdGVkU3RyYXRlZ2llcy5wdXNoX2JhY2soY2xpZW50LT5zdHJhdGVneSgpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KQEAgLTMzMjksMTIgKzM4NjMsMTIgQEAKIAogICAgIC8vIHJlbW92ZSBpbnB1dCByb3V0ZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgdWlkCiAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX3NvdXJjZV90PiBhZmZlY3RlZFNvdXJjZXM7Ci0gICAgZm9yIChzc2l6ZV90IGkgPSAoc3NpemVfdCltSW5wdXRSb3V0ZXMuc2l6ZSgpIC0gMTsgaSA+PSAwOyBpLS0pICB7Ci0gICAgICAgIHNwPFNlc3Npb25Sb3V0ZT4gcm91dGUgPSBtSW5wdXRSb3V0ZXMudmFsdWVBdChpKTsKLSAgICAgICAgaWYgKHJvdXRlLT5tVWlkID09IHVpZCkgewotICAgICAgICAgICAgbUlucHV0Um91dGVzLnJlbW92ZUl0ZW1zQXQoaSk7Ci0gICAgICAgICAgICBpZiAocm91dGUtPm1EZXZpY2VEZXNjcmlwdG9yICE9IDApIHsKLSAgICAgICAgICAgICAgICBhZmZlY3RlZFNvdXJjZXMuYWRkKHJvdXRlLT5tU291cmNlKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1JbnB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+IGlucHV0RGVzYyA9IG1JbnB1dHMudmFsdWVBdChpKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBjbGllbnQgOiBpbnB1dERlc2MtPmdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIGlmIChjbGllbnQtPmhhc1ByZWZlcnJlZERldmljZSgpICYmIGNsaWVudC0+dWlkKCkgPT0gdWlkKSB7CisgICAgICAgICAgICAgICAgY2xpZW50LT5zZXRQcmVmZXJyZWREZXZpY2VJZChBVURJT19QT1JUX0hBTkRMRV9OT05FKTsKKyAgICAgICAgICAgICAgICBhZmZlY3RlZFNvdXJjZXMuYWRkKGNsaWVudC0+c291cmNlKCkpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtMzM0Miw3ICszODc2LDcgQEAKICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGlucHV0c1RvQ2xvc2U7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChhZmZlY3RlZFNvdXJjZXMuaW5kZXhPZihpbnB1dERlc2MtPmlucHV0U291cmNlKCkpID49IDApIHsKKyAgICAgICAgaWYgKGFmZmVjdGVkU291cmNlcy5pbmRleE9mKGlucHV0RGVzYy0+c291cmNlKCkpID49IDApIHsKICAgICAgICAgICAgIGlucHV0c1RvQ2xvc2UuYWRkKGlucHV0RGVzYy0+bUlvSGFuZGxlKTsKICAgICAgICAgfQogICAgIH0KQEAgLTMzNTQsOCArMzg4OCw4IEBACiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xlYXJBdWRpb1NvdXJjZXModWlkX3QgdWlkKQogewogICAgIGZvciAoc3NpemVfdCBpID0gKHNzaXplX3QpbUF1ZGlvU291cmNlcy5zaXplKCkgLSAxOyBpID49IDA7IGktLSkgIHsKLSAgICAgICAgc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoc291cmNlRGVzYy0+bVVpZCA9PSB1aWQpIHsKKyAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKKyAgICAgICAgaWYgKHNvdXJjZURlc2MtPnVpZCgpID09IHVpZCkgewogICAgICAgICAgICAgc3RvcEF1ZGlvU291cmNlKG1BdWRpb1NvdXJjZXMua2V5QXQoaSkpOwogICAgICAgICB9CiAgICAgfQpAQCAtMzM2NywxNDQgKzM5MDEsMTM1IEBACiB7CiAgICAgKnNlc3Npb24gPSAoYXVkaW9fc2Vzc2lvbl90KW1wQ2xpZW50SW50ZXJmYWNlLT5uZXdBdWRpb1VuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfU0VTU0lPTik7CiAgICAgKmlvSGFuZGxlID0gKGF1ZGlvX2lvX2hhbmRsZV90KW1wQ2xpZW50SW50ZXJmYWNlLT5uZXdBdWRpb1VuaXF1ZUlkKEFVRElPX1VOSVFVRV9JRF9VU0VfSU5QVVQpOwotICAgICpkZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShBVURJT19TT1VSQ0VfSE9UV09SRCk7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSB7IC5zb3VyY2UgPSBBVURJT19TT1VSQ0VfSE9UV09SRCB9OworICAgICpkZXZpY2UgPSBtRW5naW5lLT5nZXRJbnB1dERldmljZUZvckF0dHJpYnV0ZXMoYXR0ciktPnR5cGUoKTsKIAogICAgIHJldHVybiBtU291bmRUcmlnZ2VyU2Vzc2lvbnMuYWNxdWlyZVNlc3Npb24oKnNlc3Npb24sICppb0hhbmRsZSk7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCiB7Ci0gICAgQUxPR1YoIiVzIHNvdXJjZSAlcCBhdHRyaWJ1dGVzICVwIGhhbmRsZSAlcCIsIF9fRlVOQ1RJT05fXywgc291cmNlLCBhdHRyaWJ1dGVzLCBoYW5kbGUpOwotICAgIGlmIChzb3VyY2UgPT0gTlVMTCB8fCBhdHRyaWJ1dGVzID09IE5VTEwgfHwgaGFuZGxlID09IE5VTEwpIHsKKyAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOworICAgICpwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworCisgICAgaWYgKHNvdXJjZSA9PSBOVUxMIHx8IGF0dHJpYnV0ZXMgPT0gTlVMTCB8fCBwb3J0SWQgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiJXMgaW52YWxpZCBhcmd1bWVudDogc291cmNlICVwIGF0dHJpYnV0ZXMgJXAgaGFuZGxlICVwIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzb3VyY2UsIGF0dHJpYnV0ZXMsIHBvcnRJZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgKmhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotCiAgICAgaWYgKHNvdXJjZS0+cm9sZSAhPSBBVURJT19QT1JUX1JPTEVfU09VUkNFIHx8CiAgICAgICAgICAgICBzb3VyY2UtPnR5cGUgIT0gQVVESU9fUE9SVF9UWVBFX0RFVklDRSkgewotICAgICAgICBBTE9HVigiJXMgSU5WQUxJRF9PUEVSQVRJT04gc291cmNlLT5yb2xlICVkIHNvdXJjZS0+dHlwZSAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlLT5yb2xlLCBzb3VyY2UtPnR5cGUpOworICAgICAgICBBTE9HVygiJXMgSU5WQUxJRF9PUEVSQVRJT04gc291cmNlLT5yb2xlICVkIHNvdXJjZS0+dHlwZSAlZCIsCisgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc291cmNlLT5yb2xlLCBzb3VyY2UtPnR5cGUpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlRGVzYyA9CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlID0KICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXMuZ2V0RGV2aWNlKHNvdXJjZS0+ZXh0LmRldmljZS50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoc291cmNlLT5leHQuZGV2aWNlLmFkZHJlc3MpKTsKLSAgICBpZiAoc3JjRGV2aWNlRGVzYyA9PSAwKSB7Ci0gICAgICAgIEFMT0dWKCIlcyBzb3VyY2UtPmV4dC5kZXZpY2UudHlwZSAlMDh4IG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgc291cmNlLT5leHQuZGV2aWNlLnR5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOChzb3VyY2UtPmV4dC5kZXZpY2UuYWRkcmVzcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CisgICAgaWYgKHNyY0RldmljZSA9PSAwKSB7CisgICAgICAgIEFMT0dXKCIlcyBzb3VyY2UtPmV4dC5kZXZpY2UudHlwZSAlMDh4IG5vdCBmb3VuZCIsIF9fRlVOQ1RJT05fXywgc291cmNlLT5leHQuZGV2aWNlLnR5cGUpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZURlc2MgPQotICAgICAgICAgICAgbmV3IEF1ZGlvU291cmNlRGVzY3JpcHRvcihzcmNEZXZpY2VEZXNjLCBhdHRyaWJ1dGVzLCB1aWQpOwogCi0gICAgc3RydWN0IGF1ZGlvX3BhdGNoIGR1bW15UGF0Y2g7Ci0gICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goJmR1bW15UGF0Y2gsIHVpZCk7Ci0gICAgc291cmNlRGVzYy0+bVBhdGNoRGVzYyA9IHBhdGNoRGVzYzsKKyAgICAqcG9ydElkID0gUG9saWN5QXVkaW9Qb3J0OjpnZXROZXh0VW5pcXVlSWQoKTsKKworICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZURlc2MgPQorICAgICAgICBuZXcgU291cmNlQ2xpZW50RGVzY3JpcHRvcigqcG9ydElkLCB1aWQsICphdHRyaWJ1dGVzLCAqc291cmNlLCBzcmNEZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1FbmdpbmUtPmdldFN0cmVhbVR5cGVGb3JBdHRyaWJ1dGVzKCphdHRyaWJ1dGVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcygqYXR0cmlidXRlcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvVm9sdW1lU291cmNlKCphdHRyaWJ1dGVzKSk7CiAKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBjb25uZWN0QXVkaW9Tb3VyY2Uoc291cmNlRGVzYyk7CiAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICBtQXVkaW9Tb3VyY2VzLmFkZChzb3VyY2VEZXNjLT5nZXRIYW5kbGUoKSwgc291cmNlRGVzYyk7Ci0gICAgICAgICpoYW5kbGUgPSBzb3VyY2VEZXNjLT5nZXRIYW5kbGUoKTsKKyAgICAgICAgbUF1ZGlvU291cmNlcy5hZGQoKnBvcnRJZCwgc291cmNlRGVzYyk7CiAgICAgfQogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYykKIHsKLSAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5nZXRIYW5kbGUoKSk7CisgICAgQUxPR1YoIiVzIGhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlRGVzYy0+cG9ydElkKCkpOwogCiAgICAgLy8gbWFrZSBzdXJlIHdlIG9ubHkgaGF2ZSBvbmUgcGF0Y2ggcGVyIHNvdXJjZS4KICAgICBkaXNjb25uZWN0QXVkaW9Tb3VyY2Uoc291cmNlRGVzYyk7CiAKLSAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5ID0gKHJvdXRpbmdfc3RyYXRlZ3kpIGdldFN0cmF0ZWd5Rm9yQXR0cigmc291cmNlRGVzYy0+bUF0dHJpYnV0ZXMpOwotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gc3RyZWFtVHlwZWZyb21BdHRyaWJ1dGVzSW50KCZzb3VyY2VEZXNjLT5tQXR0cmlidXRlcyk7Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlRGVzYyA9IHNvdXJjZURlc2MtPm1EZXZpY2U7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSBzb3VyY2VEZXNjLT5hdHRyaWJ1dGVzKCk7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3JjRGV2aWNlID0gc291cmNlRGVzYy0+c3JjRGV2aWNlKCk7CiAKLSAgICBhdWRpb19kZXZpY2VzX3Qgc2lua0RldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCB0cnVlKTsKLSAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBzaW5rRGV2aWNlRGVzYyA9Ci0gICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2Uoc2lua0RldmljZSwgU3RyaW5nOCgiIikpOwotCi0gICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2ggPSAmc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bVBhdGNoOwotCi0gICAgaWYgKHNyY0RldmljZURlc2MtPmdldEF1ZGlvUG9ydCgpLT5tTW9kdWxlLT5nZXRIYW5kbGUoKSA9PQotICAgICAgICAgICAgc2lua0RldmljZURlc2MtPmdldEF1ZGlvUG9ydCgpLT5tTW9kdWxlLT5nZXRIYW5kbGUoKSAmJgotICAgICAgICAgICAgc3JjRGV2aWNlRGVzYy0+Z2V0QXVkaW9Qb3J0KCktPm1Nb2R1bGUtPmdldEhhbFZlcnNpb25NYWpvcigpID49IDMgJiYKLSAgICAgICAgICAgIHNyY0RldmljZURlc2MtPmdldEF1ZGlvUG9ydCgpLT5tR2FpbnMuc2l6ZSgpID4gMCkgewotICAgICAgICBBTE9HVigiJXMgQVVESU9fREVWSUNFX0FQSV9WRVJTSU9OXzNfMCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIC8vICAgY3JlYXRlIHBhdGNoIGJldHdlZW4gc3JjIGRldmljZSBhbmQgb3V0cHV0IGRldmljZQotICAgICAgICAvLyAgIGNyZWF0ZSBId291dHB1dCBhbmQgYWRkIHRvIG1Id091dHB1dHMKLSAgICB9IGVsc2UgewotICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHMgPSBnZXRPdXRwdXRzRm9yRGV2aWNlKHNpbmtEZXZpY2UsIG1PdXRwdXRzKTsKLSAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0KLSAgICAgICAgICAgICAgICBzZWxlY3RPdXRwdXQob3V0cHV0cywgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgQVVESU9fRk9STUFUX0lOVkFMSUQpOwotICAgICAgICBpZiAob3V0cHV0ID09IEFVRElPX0lPX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICBBTE9HVigiJXMgbm8gb3V0cHV0IGZvciBkZXZpY2UgJTA4eCIsIF9fRlVOQ1RJT05fXywgc2lua0RldmljZSk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgICAgIH0KLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOwotICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IGlzIGR1cGxpY2F0ZWQiLCBfX0ZVTkNUSU9OX18sIHNpbmtEZXZpY2UpOwotICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwotICAgICAgICB9Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG91dHB1dERlc2MtPnN0YXJ0KCk7CisgICAgRGV2aWNlVmVjdG9yIHNpbmtEZXZpY2VzID0KKyAgICAgICAgICAgIG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMsIG51bGxwdHIsIHRydWUpOworICAgIEFMT0dfQVNTRVJUKCFzaW5rRGV2aWNlcy5pc0VtcHR5KCksICJjb25uZWN0QXVkaW9Tb3VyY2UoKTogbm8gZGV2aWNlIGZvdW5kIGZvciBhdHRyaWJ1dGVzIik7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc2lua0RldmljZSA9IHNpbmtEZXZpY2VzLml0ZW1BdCgwKTsKKyAgICBBTE9HX0FTU0VSVChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jb250YWlucyhzaW5rRGV2aWNlKSwgIiVzOiBEZXZpY2UgJXMgbm90IGF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzaW5rRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CisgICAgcGF0Y2hCdWlsZGVyLmFkZFNpbmsoc2lua0RldmljZSkuYWRkU291cmNlKHNyY0RldmljZSk7CisgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0KKyAgICAgICAgICAgIGNyZWF0ZUF1ZGlvUGF0Y2hJbnRlcm5hbChwYXRjaEJ1aWxkZXIucGF0Y2goKSwgJmhhbmRsZSwgbVVpZENhY2hlZCwgMCwgc291cmNlRGVzYyk7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiB8fCBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaGFuZGxlKSA8IDApIHsKKyAgICAgICAgQUxPR1coIiVzIHBhdGNoIHBhbmVsIGNvdWxkIG5vdCBjb25uZWN0IGRldmljZSBwYXRjaCwgZXJyb3IgJWQiLCBfX2Z1bmNfXywgc3RhdHVzKTsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKyAgICBzb3VyY2VEZXNjLT5zZXRQYXRjaEhhbmRsZShoYW5kbGUpOworICAgIC8vIFNXIEJyaWRnZT8gKEB0b2RvOiBIVyBicmlkZ2UsIGtlZXAgdHJhY2sgb2YgSHdPdXRwdXQgZm9yIGRldmljZSBzZWxlY3Rpb24gInJlY29uc2lkZXJhdGlvbiIpCisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHN3T3V0cHV0ID0gc291cmNlRGVzYy0+c3dPdXRwdXQoKS5wcm9tb3RlKCk7CisgICAgaWYgKHN3T3V0cHV0ICE9IDApIHsKKyAgICAgICAgc3RhdHVzID0gc3dPdXRwdXQtPnN0YXJ0KCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICBnb3RvIEZhaWx1cmVTb3VyY2VBZGRlZDsKICAgICAgICAgfQotCi0gICAgICAgIC8vIGNyZWF0ZSBhIHNwZWNpYWwgcGF0Y2ggd2l0aCBubyBzaW5rIGFuZCB0d28gc291cmNlczoKLSAgICAgICAgLy8gLSB0aGUgc2Vjb25kIHNvdXJjZSBpbmRpY2F0ZXMgdG8gUGF0Y2hQYW5lbCB0aHJvdWdoIHdoaWNoIG91dHB1dCBtaXggdGhpcyBwYXRjaCBzaG91bGQKLSAgICAgICAgLy8gYmUgY29ubmVjdGVkIGFzIHdlbGwgYXMgdGhlIHN0cmVhbSB0eXBlIGZvciB2b2x1bWUgY29udHJvbAotICAgICAgICAvLyAtIHRoZSBzaW5rIGlzIGRlZmluZWQgYnkgd2hhdGV2ZXIgb3V0cHV0IGRldmljZSBpcyBjdXJyZW50bHkgc2VsZWN0ZWQgZm9yIHRoZSBvdXRwdXQKLSAgICAgICAgLy8gdGhvdWdoIHdoaWNoIHRoaXMgcGF0Y2ggaXMgcm91dGVkLgotICAgICAgICBwYXRjaC0+bnVtX3NpbmtzID0gMDsKLSAgICAgICAgcGF0Y2gtPm51bV9zb3VyY2VzID0gMjsKLSAgICAgICAgc3JjRGV2aWNlRGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLT5zb3VyY2VzWzBdLCBOVUxMKTsKLSAgICAgICAgb3V0cHV0RGVzYy0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLT5zb3VyY2VzWzFdLCBOVUxMKTsKLSAgICAgICAgcGF0Y2gtPnNvdXJjZXNbMV0uZXh0Lm1peC51c2VjYXNlLnN0cmVhbSA9IHN0cmVhbTsKLSAgICAgICAgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2gocGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhZlBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgQUxPR1YoIiVzIHBhdGNoIHBhbmVsIHJldHVybmVkICVkIHBhdGNoSGFuZGxlICVkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUpOwotICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HVygiJXMgcGF0Y2ggcGFuZWwgY291bGQgbm90IGNvbm5lY3QgZGV2aWNlIHBhdGNoLCBlcnJvciAlZCIsCi0gICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0YXR1cyk7Ci0gICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgIGlmIChzd091dHB1dC0+Z2V0Q2xpZW50KHNvdXJjZURlc2MtPnBvcnRJZCgpKSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HVygiJXMgc291cmNlIHBvcnRJZCBoYXMgYWxyZWFkeSBiZWVuIGF0dGFjaGVkIHRvIG91dHB1dERlc2MiLCBfX2Z1bmNfXyk7CisgICAgICAgICAgICBnb3RvIEZhaWx1cmVSZWxlYXNlUGF0Y2g7CiAgICAgICAgIH0KKyAgICAgICAgc3dPdXRwdXQtPmFkZENsaWVudChzb3VyY2VEZXNjKTsKICAgICAgICAgdWludDMyX3QgZGVsYXlNcyA9IDA7Ci0gICAgICAgIHN0YXR1cyA9IHN0YXJ0U291cmNlKG91dHB1dERlc2MsIHN0cmVhbSwgc2lua0RldmljZSwgTlVMTCwgJmRlbGF5TXMpOwotCisgICAgICAgIHN0YXR1cyA9IHN0YXJ0U291cmNlKHN3T3V0cHV0LCBzb3VyY2VEZXNjLCAmZGVsYXlNcyk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7Ci0gICAgICAgICAgICByZXR1cm4gc3RhdHVzOworICAgICAgICAgICAgQUxPR1coIiVzIGZhaWxlZCB0byBzdGFydCBzb3VyY2UsIGVycm9yICVkIiwgX19GVU5DVElPTl9fLCBzdGF0dXMpOworICAgICAgICAgICAgZ290byBGYWlsdXJlU291cmNlQWN0aXZlOwogICAgICAgICB9Ci0gICAgICAgIHNvdXJjZURlc2MtPm1Td091dHB1dCA9IG91dHB1dERlc2M7CiAgICAgICAgIGlmIChkZWxheU1zICE9IDApIHsKICAgICAgICAgICAgIHVzbGVlcChkZWxheU1zICogMTAwMCk7CiAgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaHdPdXRwdXREZXNjID0gc291cmNlRGVzYy0+aHdPdXRwdXQoKS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChod091dHB1dERlc2MgIT0gMCkgeworICAgICAgICAgIC8vICAgY3JlYXRlIEh3b3V0cHV0IGFuZCBhZGQgdG8gbUh3T3V0cHV0cworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzIHNvdXJjZSBoYXMgbmVpdGhlciBTVyBub3IgSFcgb3V0cHV0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgfQogICAgIH0KLQotICAgIHNvdXJjZURlc2MtPm1QYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlID0gYWZQYXRjaEhhbmRsZTsKLSAgICBhZGRBdWRpb1BhdGNoKHNvdXJjZURlc2MtPm1QYXRjaERlc2MtPm1IYW5kbGUsIHNvdXJjZURlc2MtPm1QYXRjaERlc2MpOwotCiAgICAgcmV0dXJuIE5PX0VSUk9SOworCitGYWlsdXJlU291cmNlQWN0aXZlOgorICAgIHN3T3V0cHV0LT5zdG9wKCk7CisgICAgcmVsZWFzZU91dHB1dChzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CitGYWlsdXJlU291cmNlQWRkZWQ6CisgICAgc291cmNlRGVzYy0+c2V0U3dPdXRwdXQobnVsbHB0cik7CitGYWlsdXJlUmVsZWFzZVBhdGNoOgorICAgIHJlbGVhc2VBdWRpb1BhdGNoSW50ZXJuYWwoaGFuZGxlKTsKKyAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSBfX3VudXNlZCkKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewotICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVGb3IoaGFuZGxlKTsKLSAgICBBTE9HVigiJXMgaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLCBoYW5kbGUpOworICAgIHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlRm9yKHBvcnRJZCk7CisgICAgQUxPR1YoIiVzIHBvcnQgSUQgJWQiLCBfX0ZVTkNUSU9OX18sIHBvcnRJZCk7CiAgICAgaWYgKHNvdXJjZURlc2MgPT0gMCkgewotICAgICAgICBBTE9HVygiJXMgdW5rbm93biBzb3VyY2UgZm9yIGhhbmRsZSAlZCIsIF9fRlVOQ1RJT05fXywgaGFuZGxlKTsKKyAgICAgICAgQUxPR1coIiVzIHVua25vd24gc291cmNlIGZvciBwb3J0IElEICVkIiwgX19GVU5DVElPTl9fLCBwb3J0SWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkaXNjb25uZWN0QXVkaW9Tb3VyY2Uoc291cmNlRGVzYyk7CiAKLSAgICBtQXVkaW9Tb3VyY2VzLnJlbW92ZUl0ZW0oaGFuZGxlKTsKKyAgICBtQXVkaW9Tb3VyY2VzLnJlbW92ZUl0ZW0ocG9ydElkKTsKICAgICByZXR1cm4gc3RhdHVzOwogfQogCkBAIC0zNTQ5LDUxICs0MDc0LDcgQEAKIGZsb2F0IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U3RyZWFtVm9sdW1lREIoCiAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXgsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCiB7Ci0gICAgcmV0dXJuIGNvbXB1dGVWb2x1bWUoc3RyZWFtLCBpbmRleCwgZGV2aWNlKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdXBwb3J0ZWRGb3JtYXRzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1hdFZlY3RvciYgZm9ybWF0cykgewotICAgIGlmIChpb0hhbmRsZSA9PSBBVURJT19JT19IQU5ETEVfTk9ORSkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KLSAgICBTdHJpbmc4IHJlcGx5OwotICAgIHJlcGx5ID0gbXBDbGllbnRJbnRlcmZhY2UtPmdldFBhcmFtZXRlcnMoCi0gICAgICAgICAgICBpb0hhbmRsZSwgU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5U3RyZWFtU3VwcG9ydGVkRm9ybWF0cykpOwotICAgIEFMT0dWKCIlczogc3VwcG9ydGVkIGZvcm1hdHMgJXMiLCBfX0ZVTkNUSU9OX18sIHJlcGx5LnN0cmluZygpKTsKLSAgICBBdWRpb1BhcmFtZXRlciByZXBsaWVkUGFyYW1ldGVycyhyZXBseSk7Ci0gICAgaWYgKHJlcGxpZWRQYXJhbWV0ZXJzLmdldCgKLSAgICAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZEZvcm1hdHMpLCByZXBseSkgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gcmV0cmlldmUgZm9ybWF0LCBiYWlsaW5nIG91dCIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQotICAgIGZvciAoYXV0byBmb3JtYXQgOiBmb3JtYXRzRnJvbVN0cmluZyhyZXBseS5zdHJpbmcoKSkpIHsKLSAgICAgICAgLy8gT25seSBBVURJT19GT1JNQVRfQUFDX0xDIHdpbGwgYmUgdXNlZCBpbiBTZXR0aW5ncyBVSSBmb3IgYWxsIEFBQyBmb3JtYXRzLgotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChmb3JtYXQgPT0gQUFDX0ZPUk1BVFNbaV0pIHsKLSAgICAgICAgICAgICAgICBmb3JtYXQgPSBBVURJT19GT1JNQVRfQUFDX0xDOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJvb2wgZXhpc3QgPSBmYWxzZTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmb3JtYXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoZm9ybWF0ID09IGZvcm1hdHNbaV0pIHsKLSAgICAgICAgICAgICAgICBleGlzdCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYm9vbCBpc1N1cnJvdW5kRm9ybWF0ID0gZmFsc2U7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShTVVJST1VORF9GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoU1VSUk9VTkRfRk9STUFUU1tpXSA9PSBmb3JtYXQpIHsKLSAgICAgICAgICAgICAgICBpc1N1cnJvdW5kRm9ybWF0ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIWV4aXN0ICYmIGlzU3Vycm91bmRGb3JtYXQpIHsKLSAgICAgICAgICAgIGZvcm1hdHMuYWRkKGZvcm1hdCk7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5PX0VSUk9SOworICAgIHJldHVybiBjb21wdXRlVm9sdW1lKGdldFZvbHVtZUN1cnZlcyhzdHJlYW0pLCB0b1ZvbHVtZVNvdXJjZShzdHJlYW0pLCBpbmRleCwge2RldmljZX0pOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN1cnJvdW5kRm9ybWF0cyh1bnNpZ25lZCBpbnQgKm51bVN1cnJvdW5kRm9ybWF0cywKQEAgLTM2MDUsMjgxICs0MDg2LDIwMSBAQAogICAgICAgICAgICAgKHN1cnJvdW5kRm9ybWF0cyA9PSBOVUxMIHx8IHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgPT0gTlVMTCkpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIEFMT0dWKCJnZXRTdXJyb3VuZEZvcm1hdHMoKSBudW1TdXJyb3VuZEZvcm1hdHMgJWQgc3Vycm91bmRGb3JtYXRzICVwIHN1cnJvdW5kRm9ybWF0c0VuYWJsZWQgJXAiLAotICAgICAgICAgICAgKm51bVN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkKTsKLQotICAgIC8vIE9ubHkgcmV0dXJuIHZhbHVlIGlmIHRoZXJlIGlzIEhETUkgb3V0cHV0LgotICAgIGlmICgobUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSAmIEFVRElPX0RFVklDRV9PVVRfSERNSSkgPT0gMCkgewotICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047Ci0gICAgfQorICAgIEFMT0dWKCIlcygpIG51bVN1cnJvdW5kRm9ybWF0cyAlZCBzdXJyb3VuZEZvcm1hdHMgJXAgc3Vycm91bmRGb3JtYXRzRW5hYmxlZCAlcCByZXBvcnRlZCAlZCIsCisgICAgICAgICAgICBfX2Z1bmNfXywgKm51bVN1cnJvdW5kRm9ybWF0cywgc3Vycm91bmRGb3JtYXRzLCBzdXJyb3VuZEZvcm1hdHNFbmFibGVkLCByZXBvcnRlZCk7CiAKICAgICBzaXplX3QgZm9ybWF0c1dyaXR0ZW4gPSAwOwogICAgIHNpemVfdCBmb3JtYXRzTWF4ID0gKm51bVN1cnJvdW5kRm9ybWF0czsKLSAgICAqbnVtU3Vycm91bmRGb3JtYXRzID0gMDsKLSAgICBGb3JtYXRWZWN0b3IgZm9ybWF0czsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IGZvcm1hdHM7IC8vIFVzZXMgcHJpbWFyeSBzdXJyb3VuZCBmb3JtYXRzIG9ubHkKICAgICBpZiAocmVwb3J0ZWQpIHsKLSAgICAgICAgLy8gT25seSBnZXQgc3Vycm91bmQgZm9ybWF0cyB3aGljaCBhcmUgcmVwb3J0ZWQgYnkgZGV2aWNlLgotICAgICAgICAvLyBGaXJzdCBsaXN0IGFscmVhZHkgb3BlbiBvdXRwdXRzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQotICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX09VVF9IRE1JOwotICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IG91dHB1dHM7Ci0gICAgICAgIGJvb2wgcmVwb3J0ZWRGb3JtYXRGb3VuZCA9IGZhbHNlOwotICAgICAgICBzdGF0dXNfdCBzdGF0dXM7Ci0gICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSAmIGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChtT3V0cHV0cy5rZXlBdChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gT3BlbiBhbiBvdXRwdXQgdG8gcXVlcnkgZHluYW1pYyBwYXJhbWV0ZXJzLgotICAgICAgICBEZXZpY2VWZWN0b3IgaGRtaU91dHB1dERldmljZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoCi0gICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9IRE1JKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZG1pT3V0cHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaGRtaU91dHB1dERldmljZXNbaV0tPm1BZGRyZXNzOwotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpW2ldOwotICAgICAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShBVURJT19ERVZJQ0VfT1VUX0hETUkpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+c3VwcG9ydERldmljZUFkZHJlc3MoYWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBqOwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG91dHB1dHMuc2l6ZSgpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0cy5pdGVtQXQoaikpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgZGVzYy0+bVByb2ZpbGUgPT0gcHJvZmlsZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoaiAhPSBvdXRwdXRzLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IGdldFN1cHBvcnRlZEZvcm1hdHMob3V0cHV0cy5pdGVtQXQoaiksIGZvcm1hdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkRm9ybWF0Rm91bmQgfD0gKHN0YXR1cyA9PSBOT19FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHJvZmlsZS0+Y2FuT3Blbk5ld0lvKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVygiTWF4IE91dHB1dCBudW1iZXIgJXUgYWxyZWFkeSBvcGVuZWQgZm9yIHRoaXMgcHJvZmlsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+bWF4T3BlbkNvdW50LCBwcm9maWxlLT5nZXRUYWdOYW1lKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJvcGVuaW5nIG91dHB1dCBmb3IgZGV2aWNlICUwOHggd2l0aCBwYXJhbXMgJXMgcHJvZmlsZSAlcCBuYW1lICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSwgcHJvZmlsZS5nZXQoKSwgcHJvZmlsZS0+Z2V0TmFtZSgpLnN0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MgPSBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3IocHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOwotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKG51bGxwdHIsIGRldmljZSwgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX0RFRkFVTFQsIEFVRElPX09VVFBVVF9GTEFHX05PTkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZvdXRwdXQpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gZ2V0U3VwcG9ydGVkRm9ybWF0cyhvdXRwdXQsIGZvcm1hdHMpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydGVkRm9ybWF0Rm91bmQgfD0gKHN0YXR1cyA9PSBOT19FUlJPUik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+Y2xvc2UoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKKyAgICAgICAgLy8gUmV0dXJuIGZvcm1hdHMgZnJvbSBhbGwgZGV2aWNlIHByb2ZpbGVzIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVzb2x2ZWQgYnkKKyAgICAgICAgLy8gY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkuCisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldOworICAgICAgICAgICAgRm9ybWF0VmVjdG9yIHN1cHBvcnRlZEZvcm1hdHMgPQorICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmdldEF1ZGlvUG9ydCgpLT5nZXRBdWRpb1Byb2ZpbGVzKCkuZ2V0U3VwcG9ydGVkRm9ybWF0cygpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBzdXBwb3J0ZWRGb3JtYXRzLnNpemUoKTsgaisrKSB7CisgICAgICAgICAgICAgICAgaWYgKG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkuY291bnQoc3VwcG9ydGVkRm9ybWF0c1tqXSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLmluc2VydChzdXBwb3J0ZWRGb3JtYXRzW2pdKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBhaXIgOiBtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFpci5zZWNvbmQuY291bnQoc3VwcG9ydGVkRm9ybWF0c1tqXSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHMuaW5zZXJ0KHBhaXIuZmlyc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFyZXBvcnRlZEZvcm1hdEZvdW5kKSB7Ci0gICAgICAgICAgICByZXR1cm4gVU5LTk9XTl9FUlJPUjsKLSAgICAgICAgfQogICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShTVVJST1VORF9GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICBmb3JtYXRzLmFkZChTVVJST1VORF9GT1JNQVRTW2ldKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKSkgeworICAgICAgICAgICAgZm9ybWF0cy5pbnNlcnQocGFpci5maXJzdCk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmb3JtYXRzLnNpemUoKTsgaSsrKSB7CisgICAgKm51bVN1cnJvdW5kRm9ybWF0cyA9IGZvcm1hdHMuc2l6ZSgpOworICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZm9yY2VVc2UgPSBtRW5naW5lLT5nZXRGb3JjZVVzZSgKKyAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBmb3JtYXQ6IGZvcm1hdHMpIHsKICAgICAgICAgaWYgKGZvcm1hdHNXcml0dGVuIDwgZm9ybWF0c01heCkgewotICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzW2Zvcm1hdHNXcml0dGVuXSA9IGZvcm1hdHNbaV07Ci0gICAgICAgICAgICBib29sIGZvcm1hdEVuYWJsZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChmb3JtYXRzW2ldID09IEFVRElPX0ZPUk1BVF9BQUNfTEMpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBqKyspIHsKLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0RW5hYmxlZCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5maW5kKEFBQ19GT1JNQVRTW2ldKSAhPSBtU3Vycm91bmRGb3JtYXRzLmVuZCgpOworICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzW2Zvcm1hdHNXcml0dGVuXSA9IGZvcm1hdDsKKyAgICAgICAgICAgIGJvb2wgZm9ybWF0RW5hYmxlZCA9IHRydWU7CisgICAgICAgICAgICBzd2l0Y2ggKGZvcmNlVXNlKSB7CisgICAgICAgICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUw6CisgICAgICAgICAgICAgICAgICAgIGZvcm1hdEVuYWJsZWQgPSBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmNvdW50KGZvcm1hdCkgIT0gMDsKICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3JtYXRFbmFibGVkID0gbVN1cnJvdW5kRm9ybWF0cy5maW5kKGZvcm1hdHNbaV0pICE9IG1TdXJyb3VuZEZvcm1hdHMuZW5kKCk7CisgICAgICAgICAgICAgICAgY2FzZSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9ORVZFUjoKKyAgICAgICAgICAgICAgICAgICAgZm9ybWF0RW5hYmxlZCA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBkZWZhdWx0OiAvLyBBVVRPIG9yIEFMV0FZUyA9PiB0cnVlCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3Vycm91bmRGb3JtYXRzRW5hYmxlZFtmb3JtYXRzV3JpdHRlbisrXSA9IGZvcm1hdEVuYWJsZWQ7CiAgICAgICAgIH0KLSAgICAgICAgKCpudW1TdXJyb3VuZEZvcm1hdHMpKys7CiAgICAgfQogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCkKIHsKLSAgICAvLyBDaGVjayBpZiBhdWRpbyBmb3JtYXQgaXMgYSBzdXJyb3VuZCBmb3JtYXRzLgotICAgIGJvb2wgaXNTdXJyb3VuZEZvcm1hdCA9IGZhbHNlOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShTVVJST1VORF9GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBTVVJST1VORF9GT1JNQVRTW2ldKSB7Ci0gICAgICAgICAgICBpc1N1cnJvdW5kRm9ybWF0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGlmICghaXNTdXJyb3VuZEZvcm1hdCkgeworICAgIEFMT0dWKCIlcygpIGZvcm1hdCAweCVYIGVuYWJsZWQgJWQiLCBfX2Z1bmNfXywgYXVkaW9Gb3JtYXQsIGVuYWJsZWQpOworICAgIGNvbnN0IGF1dG8mIGZvcm1hdEl0ZXIgPSBtQ29uZmlnLmdldFN1cnJvdW5kRm9ybWF0cygpLmZpbmQoYXVkaW9Gb3JtYXQpOworICAgIGlmIChmb3JtYXRJdGVyID09IG1Db25maWcuZ2V0U3Vycm91bmRGb3JtYXRzKCkuZW5kKCkpIHsKKyAgICAgICAgQUxPR1coIiVzKCkgZm9ybWF0IDB4JVggaXMgbm90IGEga25vd24gc3Vycm91bmQgZm9ybWF0IiwgX19mdW5jX18sIGF1ZGlvRm9ybWF0KTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICAvLyBTaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiBNQU5VQUwuCi0gICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBmb3JjZVVzZSA9IG1FbmdpbmUtPmdldEZvcmNlVXNlKAotICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCk7Ci0gICAgaWYgKGZvcmNlVXNlICE9IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCkgeworICAgIGlmIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpICE9CisgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwpIHsKKyAgICAgICAgQUxPR1coIiVzKCkgbm90IGluIG1hbnVhbCBtb2RlIGZvciBzdXJyb3VuZCBzb3VuZCBmb3JtYXQgc2VsZWN0aW9uIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgaWYgKChtU3Vycm91bmRGb3JtYXRzLmZpbmQoYXVkaW9Gb3JtYXQpICE9IG1TdXJyb3VuZEZvcm1hdHMuZW5kKCkgJiYgZW5hYmxlZCkKLSAgICAgICAgICAgIHx8IChtU3Vycm91bmRGb3JtYXRzLmZpbmQoYXVkaW9Gb3JtYXQpID09IG1TdXJyb3VuZEZvcm1hdHMuZW5kKCkgJiYgIWVuYWJsZWQpKSB7CisgICAgaWYgKChtTWFudWFsU3Vycm91bmRGb3JtYXRzLmNvdW50KGF1ZGlvRm9ybWF0KSAhPSAwKSA9PSBlbmFibGVkKSB7CiAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9CiAKLSAgICAvLyBUaGUgb3BlcmF0aW9uIGlzIHZhbGlkIG9ubHkgd2hlbiB0aGVyZSBpcyBIRE1JIG91dHB1dCBhdmFpbGFibGUuCi0gICAgaWYgKChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX09VVF9IRE1JKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICB9Ci0KKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IHN1cnJvdW5kRm9ybWF0c0JhY2t1cChtTWFudWFsU3Vycm91bmRGb3JtYXRzKTsKICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICBpZiAoYXVkaW9Gb3JtYXQgPT0gQVVESU9fRk9STUFUX0FBQ19MQykgewotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKEFBQ19GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoQUFDX0ZPUk1BVFNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoYXVkaW9Gb3JtYXQpOworICAgICAgICBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmluc2VydChhdWRpb0Zvcm1hdCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgc3ViRm9ybWF0IDogZm9ybWF0SXRlci0+c2Vjb25kKSB7CisgICAgICAgICAgICBtTWFudWFsU3Vycm91bmRGb3JtYXRzLmluc2VydChzdWJGb3JtYXQpOwogICAgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9BQUNfTEMpIHsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgQVJSQVlfU0laRShBQUNfRk9STUFUUyk7IGkrKykgewotICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuZXJhc2UoQUFDX0ZPUk1BVFNbaV0pOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5lcmFzZShhdWRpb0Zvcm1hdCk7CisgICAgICAgIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuZXJhc2UoYXVkaW9Gb3JtYXQpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHN1YkZvcm1hdCA6IGZvcm1hdEl0ZXItPnNlY29uZCkgeworICAgICAgICAgICAgbU1hbnVhbFN1cnJvdW5kRm9ybWF0cy5lcmFzZShzdWJGb3JtYXQpOwogICAgICAgICB9CiAgICAgfQogCiAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2M7CiAgICAgYm9vbCBwcm9maWxlVXBkYXRlZCA9IGZhbHNlOwogICAgIERldmljZVZlY3RvciBoZG1pT3V0cHV0RGV2aWNlcyA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSgKLSAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfSERNSSk7CisgICAgICAgIEFVRElPX0RFVklDRV9PVVRfSERNSSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZG1pT3V0cHV0RGV2aWNlcy5zaXplKCk7IGkrKykgewogICAgICAgICAvLyBTaW11bGF0ZSByZWNvbm5lY3Rpb24gdG8gdXBkYXRlIGVuYWJsZWQgc3Vycm91bmQgc291bmQgZm9ybWF0cy4KLSAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gaGRtaU91dHB1dERldmljZXNbaV0tPm1BZGRyZXNzOwotICAgICAgICBTdHJpbmc4IG5hbWUgPSBoZG1pT3V0cHV0RGV2aWNlc1tpXS0+Z2V0TmFtZSgpOworICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KGhkbWlPdXRwdXREZXZpY2VzW2ldLT5hZGRyZXNzKCkuY19zdHIoKSk7CisgICAgICAgIHN0ZDo6c3RyaW5nIG5hbWUgPSBoZG1pT3V0cHV0RGV2aWNlc1tpXS0+Z2V0TmFtZSgpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBzZXREZXZpY2VDb25uZWN0aW9uU3RhdGVJbnQoQVVESU9fREVWSUNFX09VVF9IRE1JLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfT1VUX0hETUksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgIHByb2ZpbGVVcGRhdGVkIHw9IChzdGF0dXMgPT0gTk9fRVJST1IpOwogICAgIH0KKyAgICAvLyBGSVhNRTogV2h5IGRvaW5nIHRoaXMgZm9yIGlucHV0IEhETUkgZGV2aWNlcyBpZiB3ZSBkb24ndCBhdWdtZW50IHRoZWlyIHJlcG9ydGVkIGZvcm1hdHM/CiAgICAgRGV2aWNlVmVjdG9yIGhkbWlJbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZSgKICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fSERNSSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoZG1pSW5wdXREZXZpY2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIC8vIFNpbXVsYXRlIHJlY29ubmVjdGlvbiB0byB1cGRhdGUgZW5hYmxlZCBzdXJyb3VuZCBzb3VuZCBmb3JtYXRzLgotICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBoZG1pSW5wdXREZXZpY2VzW2ldLT5tQWRkcmVzczsKLSAgICAgICAgU3RyaW5nOCBuYW1lID0gaGRtaUlucHV0RGV2aWNlc1tpXS0+Z2V0TmFtZSgpOworICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBTdHJpbmc4KGhkbWlJbnB1dERldmljZXNbaV0tPmFkZHJlc3MoKS5jX3N0cigpKTsKKyAgICAgICAgc3RkOjpzdHJpbmcgbmFtZSA9IGhkbWlJbnB1dERldmljZXNbaV0tPmdldE5hbWUoKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KEFVRElPX0RFVklDRV9JTl9IRE1JLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9VTkFWQUlMQUJMRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19GT1JNQVRfREVGQVVMVCk7CiAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CiAgICAgICAgIHN0YXR1cyA9IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChBVURJT19ERVZJQ0VfSU5fSERNSSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9ERUZBVUxUKTsKICAgICAgICAgcHJvZmlsZVVwZGF0ZWQgfD0gKHN0YXR1cyA9PSBOT19FUlJPUik7CiAgICAgfQogCi0gICAgLy8gVW5kbyB0aGUgc3Vycm91bmQgZm9ybWF0cyBjaGFuZ2UgZHVlIHRvIG5vIGF1ZGlvIHByb2ZpbGVzIHVwZGF0ZWQuCiAgICAgaWYgKCFwcm9maWxlVXBkYXRlZCkgewotICAgICAgICBpZiAoZW5hYmxlZCkgewotICAgICAgICAgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9BQUNfTEMpIHsKLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IEFSUkFZX1NJWkUoQUFDX0ZPUk1BVFMpOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5lcmFzZShBQUNfRk9STUFUU1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBtU3Vycm91bmRGb3JtYXRzLmVyYXNlKGF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChhdWRpb0Zvcm1hdCA9PSBBVURJT19GT1JNQVRfQUFDX0xDKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBBUlJBWV9TSVpFKEFBQ19GT1JNQVRTKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KEFBQ19GT1JNQVRTW2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG1TdXJyb3VuZEZvcm1hdHMuaW5zZXJ0KGF1ZGlvRm9ybWF0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBBTE9HVygiJXMoKSBubyBhdWRpbyBwcm9maWxlcyB1cGRhdGVkLCB1bmRvaW5nIHN1cnJvdW5kIGZvcm1hdHMgY2hhbmdlIiwgX19mdW5jX18pOworICAgICAgICBtTWFudWFsU3Vycm91bmRGb3JtYXRzID0gc3RkOjptb3ZlKHN1cnJvdW5kRm9ybWF0c0JhY2t1cCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHByb2ZpbGVVcGRhdGVkID8gTk9fRVJST1IgOiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCkKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRBcHBTdGF0ZSh1aWRfdCB1aWQsIGFwcF9zdGF0ZV90IHN0YXRlKQogewotICAgIEFMT0dWKCJBdWRpb1BvbGljeU1hbmFnZXI6c2V0UmVjb3JkU2lsZW5jZWQodWlkOiVkLCBzaWxlbmNlZDolZCkiLCB1aWQsIHNpbGVuY2VkKTsKLQotICAgIFZlY3RvcjxzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gPiBhY3RpdmVJbnB1dHMgPSBtSW5wdXRzLmdldEFjdGl2ZUlucHV0cygpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0aXZlSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBhY3RpdmVEZXNjID0gYWN0aXZlSW5wdXRzW2ldOwotICAgICAgICBBdWRpb1Nlc3Npb25Db2xsZWN0aW9uIGFjdGl2ZVNlc3Npb25zID0gYWN0aXZlRGVzYy0+Z2V0QXVkaW9TZXNzaW9ucyh0cnVlKTsKLSAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBhY3RpdmVTZXNzaW9ucy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgc3A8QXVkaW9TZXNzaW9uPiBhY3RpdmVTZXNzaW9uID0gYWN0aXZlU2Vzc2lvbnMudmFsdWVBdChqKTsKLSAgICAgICAgICAgIGlmIChhY3RpdmVTZXNzaW9uLT51aWQoKSA9PSB1aWQpIHsKLSAgICAgICAgICAgICAgICBhY3RpdmVTZXNzaW9uLT5zZXRTaWxlbmNlZChzaWxlbmNlZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KKyAgICBBTE9HVigiJXModWlkOiVkLCBzdGF0ZTolZCkiLCBfX2Z1bmNfXywgdWlkLCBzdGF0ZSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1JbnB1dHMudmFsdWVBdChpKS0+c2V0QXBwU3RhdGUodWlkLCBzdGF0ZSk7CiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmRpc2Nvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKQorYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKQogewotICAgIEFMT0dWKCIlcyBoYW5kbGUgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPmdldEhhbmRsZSgpKTsKLQotICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVGb3Ioc291cmNlRGVzYy0+bVBhdGNoRGVzYy0+bUhhbmRsZSk7Ci0gICAgaWYgKHBhdGNoRGVzYyA9PSAwKSB7Ci0gICAgICAgIEFMT0dXKCIlcyBzb3VyY2UgaGFzIG5vIHBhdGNoIHdpdGggaGFuZGxlICVkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICBzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjLT5tSGFuZGxlKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9Ci0gICAgcmVtb3ZlQXVkaW9QYXRjaChzb3VyY2VEZXNjLT5tUGF0Y2hEZXNjLT5tSGFuZGxlKTsKLQotICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtID0gc3RyZWFtVHlwZWZyb21BdHRyaWJ1dGVzSW50KCZzb3VyY2VEZXNjLT5tQXR0cmlidXRlcyk7Ci0gICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHN3T3V0cHV0RGVzYyA9IHNvdXJjZURlc2MtPm1Td091dHB1dC5wcm9tb3RlKCk7Ci0gICAgaWYgKHN3T3V0cHV0RGVzYyAhPSAwKSB7Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BTb3VyY2Uoc3dPdXRwdXREZXNjLCBzdHJlYW0sIGZhbHNlKTsKLSAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgc3dPdXRwdXREZXNjLT5zdG9wKCk7CisgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKKyAgICAgICAgY29uc3QgT3V0cHV0UHJvZmlsZUNvbGxlY3Rpb24gJm91dHB1dFByb2ZpbGVzID0gaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byAmb3V0UHJvZmlsZSA6IG91dHB1dFByb2ZpbGVzKSB7CisgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCBhdWRpb1BvcnQ7CisgICAgICAgICAgICBvdXRQcm9maWxlLT50b0F1ZGlvUG9ydCgmYXVkaW9Qb3J0KTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXVkaW9Qb3J0Lm51bV9jaGFubmVsX21hc2tzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAoYXVkaW9Qb3J0LmNoYW5uZWxfbWFza3NbaV0gJiBBVURJT19DSEFOTkVMX0hBUFRJQ19BTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmRpc2Nvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiYgc291cmNlRGVzYykKK3sKKyAgICBBTE9HVigiJXMgcG9ydCBJZCAlZCIsIF9fRlVOQ1RJT05fXywgc291cmNlRGVzYy0+cG9ydElkKCkpOworICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBzd091dHB1dCA9IHNvdXJjZURlc2MtPnN3T3V0cHV0KCkucHJvbW90ZSgpOworICAgIGlmIChzd091dHB1dCAhPSAwKSB7CisgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHN0b3BTb3VyY2Uoc3dPdXRwdXQsIHNvdXJjZURlc2MpOworICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICBzd091dHB1dC0+c3RvcCgpOworICAgICAgICB9CisgICAgICAgIHJlbGVhc2VPdXRwdXQoc291cmNlRGVzYy0+cG9ydElkKCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIHNwPEh3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBod091dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5tSHdPdXRwdXQucHJvbW90ZSgpOworICAgICAgICBzcDxId0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gaHdPdXRwdXREZXNjID0gc291cmNlRGVzYy0+aHdPdXRwdXQoKS5wcm9tb3RlKCk7CiAgICAgICAgIGlmIChod091dHB1dERlc2MgIT0gMCkgewotICAgICAgICAgIC8vICAgcmVsZWFzZSBwYXRjaCBiZXR3ZWVuIHNyYyBkZXZpY2UgYW5kIG91dHB1dCBkZXZpY2UKICAgICAgICAgICAvLyAgIGNsb3NlIEh3b3V0cHV0IGFuZCByZW1vdmUgZnJvbSBtSHdPdXRwdXRzCiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBBTE9HVygiJXMgc291cmNlIGhhcyBuZWl0aGVyIFNXIG5vciBIVyBvdXRwdXQiLCBfX0ZVTkNUSU9OX18pOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBOT19FUlJPUjsKKyAgICByZXR1cm4gcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChzb3VyY2VEZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKIH0KIAotc3A8QXVkaW9Tb3VyY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFNvdXJjZUZvclN0cmF0ZWd5T25PdXRwdXQoCi0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSkKK3NwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0U291cmNlRm9yQXR0cmlidXRlc09uT3V0cHV0KAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cikKIHsKLSAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZTsKKyAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2U7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9Tb3VyY2VzLnNpemUoKTsgaSsrKSAgewotICAgICAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlQXQoaSk7Ci0gICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc291cmNlU3RyYXRlZ3kgPQotICAgICAgICAgICAgICAgIChyb3V0aW5nX3N0cmF0ZWd5KSBnZXRTdHJhdGVneUZvckF0dHIoJnNvdXJjZURlc2MtPm1BdHRyaWJ1dGVzKTsKLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5tU3dPdXRwdXQucHJvbW90ZSgpOwotICAgICAgICBpZiAoc291cmNlU3RyYXRlZ3kgPT0gc3RyYXRlZ3kgJiYgb3V0cHV0RGVzYyAhPSAwICYmIG91dHB1dERlc2MtPm1Jb0hhbmRsZSA9PSBvdXRwdXQpIHsKKyAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gc291cmNlRGVzYyA9IG1BdWRpb1NvdXJjZXMudmFsdWVBdChpKTsKKyAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBzb3VyY2VEZXNjLT5zd091dHB1dCgpLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGZvbGxvd3NTYW1lUm91dGluZyhhdHRyLCBzb3VyY2VEZXNjLT5hdHRyaWJ1dGVzKCkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYyAhPSAwICYmIG91dHB1dERlc2MtPm1Jb0hhbmRsZSA9PSBvdXRwdXQpIHsKICAgICAgICAgICAgIHNvdXJjZSA9IHNvdXJjZURlc2M7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQpAQCAtMzg5NSw3ICs0Mjk2LDYgQEAKICAgICByZXR1cm4gbUF1ZGlvUG9ydEdlbmVyYXRpb24rKzsKIH0KIAotI2lmZGVmIFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKIC8vIFRyZWJsaXplZCBhdWRpbyBwb2xpY3kgeG1sIGNvbmZpZyB3aWxsIGJlIGxvY2F0ZWQgaW4gL29kbS9ldGMgb3IgL3ZlbmRvci9ldGMuCiBzdGF0aWMgY29uc3QgY2hhciAqa0NvbmZpZ0xvY2F0aW9uTGlzdFtdID0KICAgICAgICAgeyIvb2RtL2V0YyIsICIvdmVuZG9yL2V0YyIsICIvc3lzdGVtL2V0YyJ9OwpAQCAtMzkyNCw0MyArNDMyNCwzMyBAQAogCiAgICAgZm9yIChjb25zdCBjaGFyKiBmaWxlTmFtZSA6IGZpbGVOYW1lcykgewogICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGtDb25maWdMb2NhdGlvbkxpc3RTaXplOyBpKyspIHsKLSAgICAgICAgICAgIFBvbGljeVNlcmlhbGl6ZXIgc2VyaWFsaXplcjsKICAgICAgICAgICAgIHNucHJpbnRmKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgc2l6ZW9mKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSksCiAgICAgICAgICAgICAgICAgICAgICAiJXMvJXMiLCBrQ29uZmlnTG9jYXRpb25MaXN0W2ldLCBmaWxlTmFtZSk7Ci0gICAgICAgICAgICByZXQgPSBzZXJpYWxpemVyLmRlc2VyaWFsaXplKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgY29uZmlnKTsKKyAgICAgICAgICAgIHJldCA9IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lGaWxlKGF1ZGlvUG9saWN5WG1sQ29uZmlnRmlsZSwgJmNvbmZpZyk7CiAgICAgICAgICAgICBpZiAocmV0ID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgY29uZmlnLnNldFNvdXJjZShhdWRpb1BvbGljeVhtbENvbmZpZ0ZpbGUpOwogICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIHJldDsKIH0KLSNlbmRpZgogCiBBdWRpb1BvbGljeU1hbmFnZXI6OkF1ZGlvUG9saWN5TWFuYWdlcihBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqY2xpZW50SW50ZXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKmZvclRlc3RpbmcqLykKICAgICA6Ci0gICAgbVVpZENhY2hlZChnZXR1aWQoKSksCisgICAgbVVpZENhY2hlZChBSURfQVVESU9TRVJWRVIpLCAvLyBubyBuZWVkIHRvIGNhbGwgZ2V0dWlkKCksIHRoZXJlJ3Mgb25seSBvbmUgb2YgdXMgcnVubmluZy4KICAgICBtcENsaWVudEludGVyZmFjZShjbGllbnRJbnRlcmZhY2UpLAogICAgIG1MaW1pdFJpbmd0b25lVm9sdW1lKGZhbHNlKSwgbUxhc3RWb2ljZVZvbHVtZSgtMS4wZiksCiAgICAgbUEyZHBTdXNwZW5kZWQoZmFsc2UpLAotI2lmZGVmIFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKLSAgICBtVm9sdW1lQ3VydmVzKG5ldyBWb2x1bWVDdXJ2ZXNDb2xsZWN0aW9uKCkpLAotICAgIG1Db25maWcobUh3TW9kdWxlc0FsbCwgbUF2YWlsYWJsZU91dHB1dERldmljZXMsIG1BdmFpbGFibGVJbnB1dERldmljZXMsCi0gICAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZSwgc3RhdGljX2Nhc3Q8Vm9sdW1lQ3VydmVzQ29sbGVjdGlvbio+KG1Wb2x1bWVDdXJ2ZXMuZ2V0KCkpKSwKLSNlbHNlCi0gICAgbVZvbHVtZUN1cnZlcyhuZXcgU3RyZWFtRGVzY3JpcHRvckNvbGxlY3Rpb24oKSksCi0gICAgbUNvbmZpZyhtSHdNb2R1bGVzQWxsLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcywgbUF2YWlsYWJsZUlucHV0RGV2aWNlcywKLSAgICAgICAgICAgIG1EZWZhdWx0T3V0cHV0RGV2aWNlKSwKLSNlbmRpZgorICAgIG1Db25maWcobUh3TW9kdWxlc0FsbCwgbU91dHB1dERldmljZXNBbGwsIG1JbnB1dERldmljZXNBbGwsIG1EZWZhdWx0T3V0cHV0RGV2aWNlKSwKICAgICBtQXVkaW9Qb3J0R2VuZXJhdGlvbigxKSwKICAgICBtQmVhY29uTXV0ZVJlZkNvdW50KDApLAogICAgIG1CZWFjb25QbGF5aW5nUmVmQ291bnQoMCksCiAgICAgbUJlYWNvbk11dGVkKGZhbHNlKSwKICAgICBtVHRzT3V0cHV0QXZhaWxhYmxlKGZhbHNlKSwKICAgICBtTWFzdGVyTW9ubyhmYWxzZSksCi0gICAgbU11c2ljRWZmZWN0T3V0cHV0KEFVRElPX0lPX0hBTkRMRV9OT05FKSwKLSAgICBtSGFzQ29tcHV0ZWRTb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlKGZhbHNlKQorICAgIG1NdXNpY0VmZmVjdE91dHB1dChBVURJT19JT19IQU5ETEVfTk9ORSkKIHsKIH0KIApAQCAtMzk2OCwzNSArNDM1OCwyOCBAQAogICAgICAgICA6IEF1ZGlvUG9saWN5TWFuYWdlcihjbGllbnRJbnRlcmZhY2UsIGZhbHNlIC8qZm9yVGVzdGluZyovKQogewogICAgIGxvYWRDb25maWcoKTsKLSAgICBpbml0aWFsaXplKCk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpsb2FkQ29uZmlnKCkgewotI2lmZGVmIFVTRV9YTUxfQVVESU9fUE9MSUNZX0NPTkYKICAgICBpZiAoZGVzZXJpYWxpemVBdWRpb1BvbGljeVhtbENvbmZpZyhnZXRDb25maWcoKSkgIT0gTk9fRVJST1IpIHsKLSNlbHNlCi0gICAgaWYgKChDb25maWdQYXJzaW5nVXRpbHM6OmxvYWRDb25maWcoQVVESU9fUE9MSUNZX1ZFTkRPUl9DT05GSUdfRklMRSwgZ2V0Q29uZmlnKCkpICE9IE5PX0VSUk9SKQotICAgICAgICAgICAmJiAoQ29uZmlnUGFyc2luZ1V0aWxzOjpsb2FkQ29uZmlnKEFVRElPX1BPTElDWV9DT05GSUdfRklMRSwgZ2V0Q29uZmlnKCkpICE9IE5PX0VSUk9SKSkgewotI2VuZGlmCiAgICAgICAgIEFMT0dFKCJjb3VsZCBub3QgbG9hZCBhdWRpbyBwb2xpY3kgY29uZmlndXJhdGlvbiBmaWxlLCBzZXR0aW5nIGRlZmF1bHRzIik7CiAgICAgICAgIGdldENvbmZpZygpLnNldERlZmF1bHQoKTsKICAgICB9CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5pdGlhbGl6ZSgpIHsKLSAgICBtVm9sdW1lQ3VydmVzLT5pbml0aWFsaXplVm9sdW1lQ3VydmVzKGdldENvbmZpZygpLmlzU3BlYWtlckRyY0VuYWJsZWQoKSk7Ci0KLSAgICAvLyBPbmNlIHBvbGljeSBjb25maWcgaGFzIGJlZW4gcGFyc2VkLCByZXRyaWV2ZSBhbiBpbnN0YW5jZSBvZiB0aGUgZW5naW5lIGFuZCBpbml0aWFsaXplIGl0LgotICAgIGF1ZGlvX3BvbGljeTo6RW5naW5lSW5zdGFuY2UgKmVuZ2luZUluc3RhbmNlID0gYXVkaW9fcG9saWN5OjpFbmdpbmVJbnN0YW5jZTo6Z2V0SW5zdGFuY2UoKTsKLSAgICBpZiAoIWVuZ2luZUluc3RhbmNlKSB7Ci0gICAgICAgIEFMT0dFKCIlczogIENvdWxkIG5vdCBnZXQgYW4gaW5zdGFuY2Ugb2YgcG9saWN5IGVuZ2luZSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIHJldHVybiBOT19JTklUOwotICAgIH0KLSAgICAvLyBSZXRyaWV2ZSB0aGUgUG9saWN5IE1hbmFnZXIgSW50ZXJmYWNlCi0gICAgbUVuZ2luZSA9IGVuZ2luZUluc3RhbmNlLT5xdWVyeUludGVyZmFjZTxBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2U+KCk7Ci0gICAgaWYgKG1FbmdpbmUgPT0gTlVMTCkgewotICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgUG9saWN5IEVuZ2luZSBJbnRlcmZhY2UiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB7CisgICAgICAgIGF1dG8gZW5nTGliID0gRW5naW5lTGlicmFyeTo6bG9hZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICJsaWJhdWRpb3BvbGljeWVuZ2luZSIgKyBnZXRDb25maWcoKS5nZXRFbmdpbmVMaWJyYXJ5TmFtZVN1ZmZpeCgpICsgIi5zbyIpOworICAgICAgICBpZiAoIWVuZ0xpYikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gbG9hZCB0aGUgZW5naW5lIGxpYnJhcnkiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgICAgIH0KKyAgICAgICAgbUVuZ2luZSA9IGVuZ0xpYi0+Y3JlYXRlRW5naW5lKCk7CisgICAgICAgIGlmIChtRW5naW5lID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGluc3RhbnRpYXRlIHRoZSBBUE0gZW5naW5lIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBOT19JTklUOworICAgICAgICB9CiAgICAgfQogICAgIG1FbmdpbmUtPnNldE9ic2VydmVyKHRoaXMpOwogICAgIHN0YXR1c190IHN0YXR1cyA9IG1FbmdpbmUtPmluaXRDaGVjaygpOwpAQCAtNDAwNSwxNzYgKzQzODgsMjMgQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKLSAgICAvLyBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcyBhbmQgbUF2YWlsYWJsZUlucHV0RGV2aWNlcyBub3cgY29udGFpbiBhbGwgYXR0YWNoZWQgZGV2aWNlcworICAgIC8vIGFmdGVyIHBhcnNpbmcgdGhlIGNvbmZpZywgbU91dHB1dERldmljZXNBbGwgYW5kIG1JbnB1dERldmljZXNBbGwgY29udGFpbiBhbGwga25vd24gZGV2aWNlczsKICAgICAvLyBvcGVuIGFsbCBvdXRwdXQgc3RyZWFtcyBuZWVkZWQgdG8gYWNjZXNzIGF0dGFjaGVkIGRldmljZXMKLSAgICBhdWRpb19kZXZpY2VzX3Qgb3V0cHV0RGV2aWNlVHlwZXMgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpOwotICAgIGF1ZGlvX2RldmljZXNfdCBpbnB1dERldmljZVR5cGVzID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgfkFVRElPX0RFVklDRV9CSVRfSU47Ci0gICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXNBbGwpIHsKLSAgICAgICAgaHdNb2R1bGUtPnNldEhhbmRsZShtcENsaWVudEludGVyZmFjZS0+bG9hZEh3TW9kdWxlKGh3TW9kdWxlLT5nZXROYW1lKCkpKTsKLSAgICAgICAgaWYgKGh3TW9kdWxlLT5nZXRIYW5kbGUoKSA9PSBBVURJT19NT0RVTEVfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgIEFMT0dXKCJjb3VsZCBub3Qgb3BlbiBIVyBtb2R1bGUgJXMiLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIG1Id01vZHVsZXMucHVzaF9iYWNrKGh3TW9kdWxlKTsKLSAgICAgICAgLy8gb3BlbiBhbGwgb3V0cHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzCi0gICAgICAgIC8vIGV4Y2VwdCBmb3IgZGlyZWN0IG91dHB1dCBzdHJlYW1zIHRoYXQgYXJlIG9ubHkgb3BlbmVkIHdoZW4gdGhleSBhcmUgYWN0dWFsbHkKLSAgICAgICAgLy8gcmVxdWlyZWQgYnkgYW4gYXBwLgotICAgICAgICAvLyBUaGlzIGFsc28gdmFsaWRhdGVzIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzIGxpc3QKLSAgICAgICAgZm9yIChjb25zdCBhdXRvJiBvdXRQcm9maWxlIDogaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkpIHsKLSAgICAgICAgICAgIGlmICghb3V0UHJvZmlsZS0+Y2FuT3Blbk5ld0lvKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiSW52YWxpZCBPdXRwdXQgcHJvZmlsZSBtYXggb3BlbiBjb3VudCAldSBmb3IgcHJvZmlsZSAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgb3V0UHJvZmlsZS0+bWF4T3BlbkNvdW50LCBvdXRQcm9maWxlLT5nZXRUYWdOYW1lKCkuY19zdHIoKSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIW91dFByb2ZpbGUtPmhhc1N1cHBvcnRlZERldmljZXMoKSkgewotICAgICAgICAgICAgICAgIEFMT0dXKCJPdXRwdXQgcHJvZmlsZSBjb250YWlucyBubyBkZXZpY2Ugb24gbW9kdWxlICVzIiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKG91dFByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19UVFMpICE9IDApIHsKLSAgICAgICAgICAgICAgICBtVHRzT3V0cHV0QXZhaWxhYmxlID0gdHJ1ZTsKLSAgICAgICAgICAgIH0KKyAgICBvbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZUludChudWxscHRyIC8qbmV3RGV2aWNlcyovKTsKIAotICAgICAgICAgICAgaWYgKChvdXRQcm9maWxlLT5nZXRGbGFncygpICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgcHJvZmlsZVR5cGUgPSBvdXRQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzVHlwZSgpOwotICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIG1EZWZhdWx0T3V0cHV0RGV2aWNlLT50eXBlKCkpICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUgPSBtRGVmYXVsdE91dHB1dERldmljZS0+dHlwZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAvLyBjaG9zZSBmaXJzdCBkZXZpY2UgcHJlc2VudCBpbiBwcm9maWxlJ3MgU3VwcG9ydGVkRGV2aWNlcyBhbHNvIHBhcnQgb2YKLSAgICAgICAgICAgICAgICAvLyBvdXRwdXREZXZpY2VUeXBlcwotICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlID0gb3V0UHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlRm9yVHlwZShvdXRwdXREZXZpY2VUeXBlcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKHByb2ZpbGVUeXBlICYgb3V0cHV0RGV2aWNlVHlwZXMpID09IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKG91dFByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZSk7Ci0gICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJnN1cHBvcnRlZERldmljZXMgPSBvdXRQcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VzKCk7Ci0gICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXNGb3JUeXBlID0gc3VwcG9ydGVkRGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUocHJvZmlsZVR5cGUpOwotICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzID0gZGV2aWNlc0ZvclR5cGUuc2l6ZSgpID4gMCA/IGRldmljZXNGb3JUeXBlLml0ZW1BdCgwKS0+bUFkZHJlc3MKLSAgICAgICAgICAgICAgICAgICAgOiBTdHJpbmc4KCIiKTsKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0RGVzYy0+b3BlbihudWxscHRyLCBwcm9maWxlVHlwZSwgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7Ci0KLSAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gb3V0cHV0IHN0cmVhbSBmb3IgZGV2aWNlICUwOHggb24gaHcgbW9kdWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5tRGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgIGh3TW9kdWxlLT5nZXROYW1lKCkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGRldiA6IHN1cHBvcnRlZERldmljZXMpIHsKLSAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCA9IG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmluZGV4T2YoZGV2KTsKLSAgICAgICAgICAgICAgICAgICAgLy8gZ2l2ZSBhIHZhbGlkIElEIHRvIGFuIGF0dGFjaGVkIGRldmljZSBvbmNlIGNvbmZpcm1lZCBpdCBpcyByZWFjaGFibGUKLSAgICAgICAgICAgICAgICAgICAgaWYgKGluZGV4ID49IDAgJiYgIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2luZGV4XS0+aXNBdHRhY2hlZCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpbmRleF0tPmF0dGFjaChod01vZHVsZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG1QcmltYXJ5T3V0cHV0ID09IDAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dFByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0ID0gb3V0cHV0RGVzYzsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7Ci0gICAgICAgICAgICAgICAgc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAvLyBvcGVuIGlucHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzIHRvIHZhbGlkYXRlCi0gICAgICAgIC8vIG1BdmFpbGFibGVJbnB1dERldmljZXMgbGlzdAotICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGluUHJvZmlsZSA6IGh3TW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCkpIHsKLSAgICAgICAgICAgIGlmICghaW5Qcm9maWxlLT5jYW5PcGVuTmV3SW8oKSkgewotICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIElucHV0IHByb2ZpbGUgbWF4IG9wZW4gY291bnQgJXUgZm9yIHByb2ZpbGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgIGluUHJvZmlsZS0+bWF4T3BlbkNvdW50LCBpblByb2ZpbGUtPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghaW5Qcm9maWxlLT5oYXNTdXBwb3J0ZWREZXZpY2VzKCkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiSW5wdXQgcHJvZmlsZSBjb250YWlucyBubyBkZXZpY2Ugb24gbW9kdWxlICVzIiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBjaG9zZSBmaXJzdCBkZXZpY2UgcHJlc2VudCBpbiBwcm9maWxlJ3MgU3VwcG9ydGVkRGV2aWNlcyBhbHNvIHBhcnQgb2YKLSAgICAgICAgICAgIC8vIGlucHV0RGV2aWNlVHlwZXMKLSAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcm9maWxlVHlwZSA9IGluUHJvZmlsZS0+Z2V0U3VwcG9ydGVkRGV2aWNlRm9yVHlwZShpbnB1dERldmljZVR5cGVzKTsKLQotICAgICAgICAgICAgaWYgKChwcm9maWxlVHlwZSAmIGlucHV0RGV2aWNlVHlwZXMpID09IDApIHsKLSAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPQotICAgICAgICAgICAgICAgICAgICBuZXcgQXVkaW9JbnB1dERlc2NyaXB0b3IoaW5Qcm9maWxlLCBtcENsaWVudEludGVyZmFjZSk7Ci0KLSAgICAgICAgICAgIERldmljZVZlY3RvciBpbnB1dERldmljZXMgPSBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShwcm9maWxlVHlwZSk7Ci0gICAgICAgICAgICAvLyAgIHRoZSBpbnB1dHMgdmVjdG9yIG11c3QgYmUgb2Ygc2l6ZSA+PSAxLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBjcmFzaCBoZXJlCi0gICAgICAgICAgICBTdHJpbmc4IGFkZHJlc3MgPSBpbnB1dERldmljZXMuc2l6ZSgpID4gMCA/IGlucHV0RGV2aWNlcy5pdGVtQXQoMCktPm1BZGRyZXNzCi0gICAgICAgICAgICAgICAgICAgIDogU3RyaW5nOCgiIik7Ci0gICAgICAgICAgICBBTE9HVigiICBmb3IgaW5wdXQgZGV2aWNlIDB4JXggdXNpbmcgYWRkcmVzcyAlcyIsIHByb2ZpbGVUeXBlLCBhZGRyZXNzLnN0cmluZygpKTsKLSAgICAgICAgICAgIEFMT0dFX0lGKGlucHV0RGV2aWNlcy5zaXplKCkgPT0gMCwgIklucHV0IGRldmljZSBsaXN0IGlzIGVtcHR5ISIpOwotCi0gICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5wdXREZXNjLT5vcGVuKG51bGxwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaW5wdXQpOwotCi0gICAgICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBkZXYgOiBpblByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKSkgewotICAgICAgICAgICAgICAgICAgICBzc2l6ZV90IGluZGV4ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5pbmRleE9mKGRldik7Ci0gICAgICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCi0gICAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZEZXNjID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpbmRleF07Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRldkRlc2MtPmlzQXR0YWNoZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmF0dGFjaChod01vZHVsZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KGluUHJvZmlsZSwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5wdXREZXNjLT5jbG9zZSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gaW5wdXQgc3RyZWFtIGZvciBkZXZpY2UgJTA4eCBvbiBodyBtb2R1bGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgIGh3TW9kdWxlLT5nZXROYW1lKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotICAgIC8vIG1ha2Ugc3VyZSBhbGwgYXR0YWNoZWQgZGV2aWNlcyBoYXZlIGJlZW4gYWxsb2NhdGVkIGEgdW5pcXVlIElECi0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuc2l6ZSgpOykgewotICAgICAgICBpZiAoIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzW2ldLT5pc0F0dGFjaGVkKCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJPdXRwdXQgZGV2aWNlICUwOHggdW5yZWFjaGFibGUiLCBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXS0+dHlwZSgpKTsKLSAgICAgICAgICAgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnJlbW92ZShtQXZhaWxhYmxlT3V0cHV0RGV2aWNlc1tpXSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBUaGUgZGV2aWNlIGlzIG5vdyB2YWxpZGF0ZWQgYW5kIGNhbiBiZSBhcHBlbmRlZCB0byB0aGUgYXZhaWxhYmxlIGRldmljZXMgb2YgdGhlIGVuZ2luZQotICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUobUF2YWlsYWJsZU91dHB1dERldmljZXNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSk7Ci0gICAgICAgIGkrKzsKLSAgICB9Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7KSB7Ci0gICAgICAgIGlmICghbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+aXNBdHRhY2hlZCgpKSB7Ci0gICAgICAgICAgICBBTE9HVygiSW5wdXQgZGV2aWNlICUwOHggdW5yZWFjaGFibGUiLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT50eXBlKCkpOwotICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5yZW1vdmUobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXSk7Ci0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBUaGUgZGV2aWNlIGlzIG5vdyB2YWxpZGF0ZWQgYW5kIGNhbiBiZSBhcHBlbmRlZCB0byB0aGUgYXZhaWxhYmxlIGRldmljZXMgb2YgdGhlIGVuZ2luZQotICAgICAgICBtRW5naW5lLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKTsKLSAgICAgICAgaSsrOwotICAgIH0KICAgICAvLyBtYWtlIHN1cmUgZGVmYXVsdCBkZXZpY2UgaXMgcmVhY2hhYmxlCi0gICAgaWYgKG1EZWZhdWx0T3V0cHV0RGV2aWNlID09IDAgfHwgbUF2YWlsYWJsZU91dHB1dERldmljZXMuaW5kZXhPZihtRGVmYXVsdE91dHB1dERldmljZSkgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJEZWZhdWx0IGRldmljZSAlMDh4IGlzIHVucmVhY2hhYmxlIiwgbURlZmF1bHRPdXRwdXREZXZpY2UtPnR5cGUoKSk7CisgICAgaWYgKG1EZWZhdWx0T3V0cHV0RGV2aWNlID09IDAgfHwgIW1BdmFpbGFibGVPdXRwdXREZXZpY2VzLmNvbnRhaW5zKG1EZWZhdWx0T3V0cHV0RGV2aWNlKSkgeworICAgICAgICBBTE9HRV9JRihtRGVmYXVsdE91dHB1dERldmljZSAhPSAwLCAiRGVmYXVsdCBkZXZpY2UgJXMgaXMgdW5yZWFjaGFibGUiLAorICAgICAgICAgICAgICAgICBtRGVmYXVsdE91dHB1dERldmljZS0+dG9TdHJpbmcoKS5jX3N0cigpKTsKICAgICAgICAgc3RhdHVzID0gTk9fSU5JVDsKICAgICB9CiAgICAgLy8gSWYgbWljcm9waG9uZXMgYWRkcmVzcyBpcyBlbXB0eSwgc2V0IGl0IGFjY29yZGluZyB0byBkZXZpY2UgdHlwZQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpICA8IG1BdmFpbGFibGVJbnB1dERldmljZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPm1BZGRyZXNzLmlzRW1wdHkoKSkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+YWRkcmVzcygpLmVtcHR5KCkpIHsKICAgICAgICAgICAgIGlmIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT50eXBlKCkgPT0gQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDKSB7Ci0gICAgICAgICAgICAgICAgbUF2YWlsYWJsZUlucHV0RGV2aWNlc1tpXS0+bUFkZHJlc3MgPSBTdHJpbmc4KEFVRElPX0JPVFRPTV9NSUNST1BIT05FX0FERFJFU1MpOworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnNldEFkZHJlc3MoQVVESU9fQk9UVE9NX01JQ1JPUEhPTkVfQUREUkVTUyk7CiAgICAgICAgICAgICB9IGVsc2UgaWYgKG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnR5cGUoKSA9PSBBVURJT19ERVZJQ0VfSU5fQkFDS19NSUMpIHsKLSAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzW2ldLT5tQWRkcmVzcyA9IFN0cmluZzgoQVVESU9fQkFDS19NSUNST1BIT05FX0FERFJFU1MpOworICAgICAgICAgICAgICAgIG1BdmFpbGFibGVJbnB1dERldmljZXNbaV0tPnNldEFkZHJlc3MoQVVESU9fQkFDS19NSUNST1BIT05FX0FERFJFU1MpOwogICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQpAQCAtNDIwNSw3ICs0NDM1LDcgQEAKICAgIG1JbnB1dHMuY2xlYXIoKTsKICAgIG1Id01vZHVsZXMuY2xlYXIoKTsKICAgIG1Id01vZHVsZXNBbGwuY2xlYXIoKTsKLSAgIG1TdXJyb3VuZEZvcm1hdHMuY2xlYXIoKTsKKyAgIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuY2xlYXIoKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbml0Q2hlY2soKQpAQCAtNDIxNSwxMSArNDQ0NSwxNTEgQEAKIAogLy8gLS0tCiAKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpvbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZSgpCit7CisgICAgRGV2aWNlVmVjdG9yIG5ld0RldmljZXM7CisgICAgb25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGVJbnQoJm5ld0RldmljZXMpOworICAgIGlmICghbmV3RGV2aWNlcy5lbXB0eSgpKSB7CisgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpvbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZUludChEZXZpY2VWZWN0b3IgKm5ld0RldmljZXMpCit7CisgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXNBbGwpIHsKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChtSHdNb2R1bGVzLmJlZ2luKCksIG1Id01vZHVsZXMuZW5kKCksIGh3TW9kdWxlKSAhPSBtSHdNb2R1bGVzLmVuZCgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBod01vZHVsZS0+c2V0SGFuZGxlKG1wQ2xpZW50SW50ZXJmYWNlLT5sb2FkSHdNb2R1bGUoaHdNb2R1bGUtPmdldE5hbWUoKSkpOworICAgICAgICBpZiAoaHdNb2R1bGUtPmdldEhhbmRsZSgpID09IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORSkgeworICAgICAgICAgICAgQUxPR1coImNvdWxkIG5vdCBvcGVuIEhXIG1vZHVsZSAlcyIsIGh3TW9kdWxlLT5nZXROYW1lKCkpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgbUh3TW9kdWxlcy5wdXNoX2JhY2soaHdNb2R1bGUpOworICAgICAgICAvLyBvcGVuIGFsbCBvdXRwdXQgc3RyZWFtcyBuZWVkZWQgdG8gYWNjZXNzIGF0dGFjaGVkIGRldmljZXMKKyAgICAgICAgLy8gZXhjZXB0IGZvciBkaXJlY3Qgb3V0cHV0IHN0cmVhbXMgdGhhdCBhcmUgb25seSBvcGVuZWQgd2hlbiB0aGV5IGFyZSBhY3R1YWxseQorICAgICAgICAvLyByZXF1aXJlZCBieSBhbiBhcHAuCisgICAgICAgIC8vIFRoaXMgYWxzbyB2YWxpZGF0ZXMgbUF2YWlsYWJsZU91dHB1dERldmljZXMgbGlzdAorICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIG91dFByb2ZpbGUgOiBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKSkgeworICAgICAgICAgICAgaWYgKCFvdXRQcm9maWxlLT5jYW5PcGVuTmV3SW8oKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIE91dHB1dCBwcm9maWxlIG1heCBvcGVuIGNvdW50ICV1IGZvciBwcm9maWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBvdXRQcm9maWxlLT5tYXhPcGVuQ291bnQsIG91dFByb2ZpbGUtPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghb3V0UHJvZmlsZS0+aGFzU3VwcG9ydGVkRGV2aWNlcygpKSB7CisgICAgICAgICAgICAgICAgQUxPR1coIk91dHB1dCBwcm9maWxlIGNvbnRhaW5zIG5vIGRldmljZSBvbiBtb2R1bGUgJXMiLCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgob3V0UHJvZmlsZS0+Z2V0RmxhZ3MoKSAmIEFVRElPX09VVFBVVF9GTEFHX1RUUykgIT0gMCkgeworICAgICAgICAgICAgICAgIG1UdHNPdXRwdXRBdmFpbGFibGUgPSB0cnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoKG91dFByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpICE9IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmc3VwcG9ydGVkRGV2aWNlcyA9IG91dFByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKTsKKyAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbFByb2ZpbGVEZXZpY2VzID0gc3VwcG9ydGVkRGV2aWNlcy5maWx0ZXIobU91dHB1dERldmljZXNBbGwpOworICAgICAgICAgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gc3VwcG9ydGVkRGV2aWNlID0gMDsKKyAgICAgICAgICAgIGlmIChzdXBwb3J0ZWREZXZpY2VzLmNvbnRhaW5zKG1EZWZhdWx0T3V0cHV0RGV2aWNlKSkgeworICAgICAgICAgICAgICAgIHN1cHBvcnRlZERldmljZSA9IG1EZWZhdWx0T3V0cHV0RGV2aWNlOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBjaG9vc2UgZmlyc3QgZGV2aWNlIHByZXNlbnQgaW4gcHJvZmlsZSdzIFN1cHBvcnRlZERldmljZXMgYWxzbyBwYXJ0IG9mCisgICAgICAgICAgICAgICAgLy8gbUF2YWlsYWJsZU91dHB1dERldmljZXMuCisgICAgICAgICAgICAgICAgaWYgKGF2YWlsUHJvZmlsZURldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzdXBwb3J0ZWREZXZpY2UgPSBhdmFpbFByb2ZpbGVEZXZpY2VzLml0ZW1BdCgwKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghbU91dHB1dERldmljZXNBbGwuY29udGFpbnMoc3VwcG9ydGVkRGV2aWNlKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBuZXcgU3dBdWRpb091dHB1dERlc2NyaXB0b3Iob3V0UHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlKTsKKyAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gb3V0cHV0RGVzYy0+b3BlbihudWxscHRyLCBEZXZpY2VWZWN0b3Ioc3VwcG9ydGVkRGV2aWNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZvdXRwdXQpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIEFMT0dXKCJDYW5ub3Qgb3BlbiBvdXRwdXQgc3RyZWFtIGZvciBkZXZpY2VzICVzIG9uIGh3IG1vZHVsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydGVkRGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCksIGh3TW9kdWxlLT5nZXROYW1lKCkpOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvICZkZXZpY2UgOiBhdmFpbFByb2ZpbGVEZXZpY2VzKSB7CisgICAgICAgICAgICAgICAgLy8gZ2l2ZSBhIHZhbGlkIElEIHRvIGFuIGF0dGFjaGVkIGRldmljZSBvbmNlIGNvbmZpcm1lZCBpdCBpcyByZWFjaGFibGUKKyAgICAgICAgICAgICAgICBpZiAoIWRldmljZS0+aXNBdHRhY2hlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGRldmljZS0+YXR0YWNoKGh3TW9kdWxlKTsKKyAgICAgICAgICAgICAgICAgICAgbUF2YWlsYWJsZU91dHB1dERldmljZXMuYWRkKGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChuZXdEZXZpY2VzKSBuZXdEZXZpY2VzLT5hZGQoZGV2aWNlKTsKKyAgICAgICAgICAgICAgICAgICAgc2V0RW5naW5lRGV2aWNlQ29ubmVjdGlvblN0YXRlKGRldmljZSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtUHJpbWFyeU91dHB1dCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgIG91dFByb2ZpbGUtPmdldEZsYWdzKCkgJiBBVURJT19PVVRQVVRfRkxBR19QUklNQVJZKSB7CisgICAgICAgICAgICAgICAgbVByaW1hcnlPdXRwdXQgPSBvdXRwdXREZXNjOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYWRkT3V0cHV0KG91dHB1dCwgb3V0cHV0RGVzYyk7CisgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVZlY3RvcihzdXBwb3J0ZWREZXZpY2UpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICAvLyBvcGVuIGlucHV0IHN0cmVhbXMgbmVlZGVkIHRvIGFjY2VzcyBhdHRhY2hlZCBkZXZpY2VzIHRvIHZhbGlkYXRlCisgICAgICAgIC8vIG1BdmFpbGFibGVJbnB1dERldmljZXMgbGlzdAorICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGluUHJvZmlsZSA6IGh3TW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKCkpIHsKKyAgICAgICAgICAgIGlmICghaW5Qcm9maWxlLT5jYW5PcGVuTmV3SW8oKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCJJbnZhbGlkIElucHV0IHByb2ZpbGUgbWF4IG9wZW4gY291bnQgJXUgZm9yIHByb2ZpbGUgJXMiLAorICAgICAgICAgICAgICAgICAgICAgIGluUHJvZmlsZS0+bWF4T3BlbkNvdW50LCBpblByb2ZpbGUtPmdldFRhZ05hbWUoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICghaW5Qcm9maWxlLT5oYXNTdXBwb3J0ZWREZXZpY2VzKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiSW5wdXQgcHJvZmlsZSBjb250YWlucyBubyBkZXZpY2Ugb24gbW9kdWxlICVzIiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBjaG9zZSBmaXJzdCBkZXZpY2UgcHJlc2VudCBpbiBwcm9maWxlJ3MgU3VwcG9ydGVkRGV2aWNlcyBhbHNvIHBhcnQgb2YKKyAgICAgICAgICAgIC8vIGF2YWlsYWJsZSBpbnB1dCBkZXZpY2VzCisgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJnN1cHBvcnRlZERldmljZXMgPSBpblByb2ZpbGUtPmdldFN1cHBvcnRlZERldmljZXMoKTsKKyAgICAgICAgICAgIERldmljZVZlY3RvciBhdmFpbFByb2ZpbGVEZXZpY2VzID0gc3VwcG9ydGVkRGV2aWNlcy5maWx0ZXIobUlucHV0RGV2aWNlc0FsbCk7CisgICAgICAgICAgICBpZiAoYXZhaWxQcm9maWxlRGV2aWNlcy5pc0VtcHR5KCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IElucHV0IGRldmljZSBsaXN0IGlzIGVtcHR5ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gaW5wdXREZXNjID0KKyAgICAgICAgICAgICAgICAgICAgbmV3IEF1ZGlvSW5wdXREZXNjcmlwdG9yKGluUHJvZmlsZSwgbXBDbGllbnRJbnRlcmZhY2UpOworCisgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gaW5wdXREZXNjLT5vcGVuKG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxQcm9maWxlRGV2aWNlcy5pdGVtQXQoMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX01JQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19JTlBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0KTsKKyAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBBTE9HVygiQ2Fubm90IG9wZW4gaW5wdXQgc3RyZWFtIGZvciBkZXZpY2UgJXMgb24gaHcgbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBhdmFpbFByb2ZpbGVEZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICBod01vZHVsZS0+Z2V0TmFtZSgpKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZGV2aWNlIDogYXZhaWxQcm9maWxlRGV2aWNlcykgeworICAgICAgICAgICAgICAgIC8vIGdpdmUgYSB2YWxpZCBJRCB0byBhbiBhdHRhY2hlZCBkZXZpY2Ugb25jZSBjb25maXJtZWQgaXQgaXMgcmVhY2hhYmxlCisgICAgICAgICAgICAgICAgaWYgKCFkZXZpY2UtPmlzQXR0YWNoZWQoKSkgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmF0dGFjaChod01vZHVsZSk7CisgICAgICAgICAgICAgICAgICAgIGRldmljZS0+aW1wb3J0QXVkaW9Qb3J0QW5kUGlja0F1ZGlvUHJvZmlsZShpblByb2ZpbGUsIHRydWUpOworICAgICAgICAgICAgICAgICAgICBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmFkZChkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICBpZiAobmV3RGV2aWNlcykgbmV3RGV2aWNlcy0+YWRkKGRldmljZSk7CisgICAgICAgICAgICAgICAgICAgIHNldEVuZ2luZURldmljZUNvbm5lY3Rpb25TdGF0ZShkZXZpY2UsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnB1dERlc2MtPmNsb3NlKCk7CisgICAgICAgIH0KKyAgICB9Cit9CisKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjphZGRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MpCiB7CiAgICAgbU91dHB1dHMuYWRkKG91dHB1dCwgb3V0cHV0RGVzYyk7Ci0gICAgYXBwbHlTdHJlYW1Wb2x1bWVzKG91dHB1dERlc2MsIEFVRElPX0RFVklDRV9OT05FLCAwIC8qIGRlbGF5TXMgKi8sIHRydWUgLyogZm9yY2UgKi8pOworICAgIGFwcGx5U3RyZWFtVm9sdW1lcyhvdXRwdXREZXNjLCBEZXZpY2VUeXBlU2V0KCksIDAgLyogZGVsYXlNcyAqLywgdHJ1ZSAvKiBmb3JjZSAqLyk7CiAgICAgdXBkYXRlTW9ubyhvdXRwdXQpOyAvLyB1cGRhdGUgbW9ubyBzdGF0dXMgd2hlbiBhZGRpbmcgdG8gb3V0cHV0IGxpc3QKICAgICBzZWxlY3RPdXRwdXRGb3JNdXNpY0VmZmVjdHMoKTsKICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwpAQCAtNDIzOCw0NCArNDYwOCwyOCBAQAogICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgZGVzYyAvKmluKi8sCi0gICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgLyppbiovLAotICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzIC8qaW4qLywKLSAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0cyAvKm91dCovKSB7Ci0gICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2RGVzYyA9Ci0gICAgICAgIGRlc2MtPm1Qcm9maWxlLT5nZXRTdXBwb3J0ZWREZXZpY2VCeUFkZHJlc3MoZGV2aWNlLCBhZGRyZXNzKTsKLSAgICBpZiAoZGV2RGVzYyAhPSAwKSB7Ci0gICAgICAgIEFMT0dWKCJmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKCk6IGFkZGluZyBvcGVuZWQgb3V0cHV0ICVkIG9uIHNhbWUgYWRkcmVzcyAlcyIsCi0gICAgICAgICAgICAgIGRlc2MtPm1Jb0hhbmRsZSwgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgIG91dHB1dHMuYWRkKGRlc2MtPm1Jb0hhbmRsZSk7Ci0gICAgfQotfQotCi1zdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tPdXRwdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBvdXRwdXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMpCiB7Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IGRldkRlc2MtPnR5cGUoKTsKKyAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSA9IGRldmljZS0+dHlwZSgpOworICAgIGNvbnN0IFN0cmluZzggJmFkZHJlc3MgPSBTdHJpbmc4KGRldmljZS0+YWRkcmVzcygpLmNfc3RyKCkpOwogICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjOwogCi0gICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKKyAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlVHlwZSkpIHsKICAgICAgICAgLy8gZXJhc2UgYWxsIGN1cnJlbnQgc2FtcGxlIHJhdGVzLCBmb3JtYXRzIGFuZCBjaGFubmVsIG1hc2tzCi0gICAgICAgIGRldkRlc2MtPmNsZWFyQXVkaW9Qcm9maWxlcygpOworICAgICAgICBkZXZpY2UtPmNsZWFyQXVkaW9Qcm9maWxlcygpOwogICAgIH0KIAogICAgIGlmIChzdGF0ZSA9PSBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0FWQUlMQUJMRSkgewogICAgICAgICAvLyBmaXJzdCBsaXN0IGFscmVhZHkgb3BlbiBvdXRwdXRzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgICAgICBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmICghZGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYgKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSAmIGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICBpZiAoIWRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBvcGVuZWQgb3V0cHV0ICVkIiwgbU91dHB1dHMua2V5QXQoaSkpOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChtT3V0cHV0cy5rZXlBdChpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiAgY2hlY2tpbmcgYWRkcmVzcyBtYXRjaCBkdWUgdG8gZGV2aWNlIDB4JXgiLCBkZXZpY2UpOwotICAgICAgICAgICAgICAgICAgICBmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKGRlc2MsIGRldmljZSwgYWRkcmVzcywgb3V0cHV0cyk7Ci0gICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiBkZXNjLT5zdXBwb3J0c0RldmljZShkZXZpY2UpCisgICAgICAgICAgICAgICAgICAgICYmIGRlc2MtPmRldmljZXNTdXBwb3J0RW5jb2RlZEZvcm1hdHMoe2RldmljZVR5cGV9KSkgeworICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG9wZW5lZCBvdXRwdXQgJWQgb24gZGV2aWNlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICBtT3V0cHV0cy5rZXlBdChpKSwgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICAvLyB0aGVuIGxvb2sgZm9yIG91dHB1dCBwcm9maWxlcyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKQEAgLTQyODMsMTMgKzQ2MzcsMTAgQEAKICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBod01vZHVsZSA6IG1Id01vZHVsZXMpIHsKICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaHdNb2R1bGUtPmdldE91dHB1dFByb2ZpbGVzKCkuc2l6ZSgpOyBqKyspIHsKICAgICAgICAgICAgICAgICBzcDxJT1Byb2ZpbGU+IHByb2ZpbGUgPSBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKVtqXTsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+c3VwcG9ydERldmljZUFkZHJlc3MoYWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChwcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlKSkgeworICAgICAgICAgICAgICAgICAgICBwcm9maWxlcy5hZGQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIHByb2ZpbGUgJXp1IGZyb20gbW9kdWxlICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaiwgaHdNb2R1bGUtPmdldE5hbWUoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9CkBAIC00Mjk3LDcgKzQ2NDgsNyBAQAogICAgICAgICBBTE9HVigiICBmb3VuZCAlenUgcHJvZmlsZXMsICV6dSBvdXRwdXRzIiwgcHJvZmlsZXMuc2l6ZSgpLCBvdXRwdXRzLnNpemUoKSk7CiAKICAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSAmJiBvdXRwdXRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBObyBvdXRwdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJTA0eCIsIGRldmljZSk7CisgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IE5vIG91dHB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAlMDR4IiwgZGV2aWNlVHlwZSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAKQEAgLTQzMTMsOCArNDY2NCw4IEBACiAgICAgICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSAmJiBkZXNjLT5tUHJvZmlsZSA9PSBwcm9maWxlKSB7CiAgICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoaW5nIHByb2ZpbGU6IHNhdmUgdGhlIHNhbXBsZSByYXRlcywgZm9ybWF0IGFuZCBjaGFubmVsIG1hc2tzIHN1cHBvcnRlZAogICAgICAgICAgICAgICAgICAgICAvLyBieSB0aGUgcHJvZmlsZSBpbiBvdXIgZGV2aWNlIGRlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRldkRlc2MtPmltcG9ydEF1ZGlvUG9ydChwcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmltcG9ydEF1ZGlvUG9ydEFuZFBpY2tBdWRpb1Byb2ZpbGUocHJvZmlsZSk7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgfQpAQCAtNDMzMCwxNiArNDY4MSwxNiBAQAogICAgICAgICAgICAgfQogCiAgICAgICAgICAgICBBTE9HVigib3BlbmluZyBvdXRwdXQgZm9yIGRldmljZSAlMDh4IHdpdGggcGFyYW1zICVzIHByb2ZpbGUgJXAgbmFtZSAlcyIsCi0gICAgICAgICAgICAgICAgICBkZXZpY2UsIGFkZHJlc3Muc3RyaW5nKCksIHByb2ZpbGUuZ2V0KCksIHByb2ZpbGUtPmdldE5hbWUoKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICBkZXZpY2VUeXBlLCBhZGRyZXNzLnN0cmluZygpLCBwcm9maWxlLmdldCgpLCBwcm9maWxlLT5nZXROYW1lKCkuY19zdHIoKSk7CiAgICAgICAgICAgICBkZXNjID0gbmV3IFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yKHByb2ZpbGUsIG1wQ2xpZW50SW50ZXJmYWNlKTsKICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzYy0+b3BlbihudWxscHRyLCBkZXZpY2UsIGFkZHJlc3MsCisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKG51bGxwdHIsIERldmljZVZlY3RvcihkZXZpY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TVFJFQU1fREVGQVVMVCwgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7CiAKICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAvLyBIZXJlIGlzIHdoZXJlIHRoZSBvdXRfc2V0X3BhcmFtZXRlcnMoKSBmb3IgY2FyZCAmIGRldmljZSBnZXRzIGNhbGxlZAogICAgICAgICAgICAgICAgIGlmICghYWRkcmVzcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlLCBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlVHlwZSwgYWRkcmVzcyk7CiAgICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zZXRQYXJhbWV0ZXJzKG91dHB1dCwgU3RyaW5nOChwYXJhbSkpOwogICAgICAgICAgICAgICAgICAgICBmcmVlKHBhcmFtKTsKICAgICAgICAgICAgICAgICB9CkBAIC00MzU4LDcgKzQ3MDksOCBAQAogICAgICAgICAgICAgICAgICAgICBjb25maWcub2ZmbG9hZF9pbmZvLmNoYW5uZWxfbWFzayA9IGNvbmZpZy5jaGFubmVsX21hc2s7CiAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy5vZmZsb2FkX2luZm8uZm9ybWF0ID0gY29uZmlnLmZvcm1hdDsKIAotICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXNjLT5vcGVuKCZjb25maWcsIGRldmljZSwgYWRkcmVzcywgQVVESU9fU1RSRUFNX0RFRkFVTFQsCisgICAgICAgICAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2MtPm9wZW4oJmNvbmZpZywgRGV2aWNlVmVjdG9yKGRldmljZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX0RFRkFVTFQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwgJm91dHB1dCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwpAQCAtNDM2NywxNCArNDcxOSwxNiBAQAogCiAgICAgICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBBVURJT19JT19IQU5ETEVfTk9ORSkgewogICAgICAgICAgICAgICAgICAgICBhZGRPdXRwdXQob3V0cHV0LCBkZXNjKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSAmJiBhZGRyZXNzICE9ICIwIikgeworICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2VUeXBlKSAmJiBhZGRyZXNzICE9ICIwIikgewogICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lNaXg+IHBvbGljeU1peDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtUG9saWN5TWl4ZXMuZ2V0QXVkaW9Qb2xpY3lNaXgoYWRkcmVzcywgcG9saWN5TWl4KSAhPSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjYW5ub3QgZmluZCBwb2xpY3kgZm9yIGFkZHJlc3MgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1Qb2xpY3lNaXhlcy5nZXRBdWRpb1BvbGljeU1peChkZXZpY2VUeXBlLCBhZGRyZXNzLCBwb2xpY3lNaXgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID09IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9saWN5TWl4LT5zZXRPdXRwdXQoZGVzYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYy0+bVBvbGljeU1peCA9IHBvbGljeU1peDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpIGNhbm5vdCBmaW5kIHBvbGljeSBmb3IgYWRkcmVzcyAlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVzcy5zdHJpbmcoKSk7CiAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBwb2xpY3lNaXgtPnNldE91dHB1dChkZXNjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2MtPm1Qb2xpY3lNaXggPSBwb2xpY3lNaXgtPmdldE1peCgpOwogCiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKChkZXNjLT5tRmxhZ3MgJiBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpID09IDApICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNQcmltYXJ5T3V0cHV0KCkpIHsKQEAgLTQ0MDYsMjggKzQ3NjAsMjggQEAKICAgICAgICAgICAgICAgICBvdXRwdXQgPSBBVURJT19JT19IQU5ETEVfTk9ORTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGlmIChvdXRwdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCkgY291bGQgbm90IG9wZW4gb3V0cHV0IGZvciBkZXZpY2UgJXgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBvdXRwdXQgZm9yIGRldmljZSAleCIsIGRldmljZVR5cGUpOwogICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJlbW92ZUF0KHByb2ZpbGVfaW5kZXgpOwogICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgtLTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgb3V0cHV0cy5hZGQob3V0cHV0KTsKICAgICAgICAgICAgICAgICAvLyBMb2FkIGRpZ2l0YWwgZm9ybWF0IGluZm8gb25seSBmb3IgZGlnaXRhbCBkZXZpY2VzCi0gICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOworICAgICAgICAgICAgICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2VUeXBlKSkgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2UtPmltcG9ydEF1ZGlvUG9ydEFuZFBpY2tBdWRpb1Byb2ZpbGUocHJvZmlsZSk7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IHNldE91dHB1dERldmljZShkZXY9MHgleCwgYWRkcj0lcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZSwgYWRkcmVzcy5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHNldE91dHB1dERldmljZShkZXNjLCBkZXZpY2UsIHRydWUvKmZvcmNlKi8sIDAvKmRlbGF5Ki8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTC8qcGF0Y2ggaGFuZGxlKi8sIGFkZHJlc3Muc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZVR5cGUpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogc2V0T3V0cHV0RGV2aWNlcyAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBzZXRPdXRwdXREZXZpY2VzKGRlc2MsIERldmljZVZlY3RvcihkZXZpY2UpLCB0cnVlLypmb3JjZSovLCAwLypkZWxheSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwvKnBhdGNoIGhhbmRsZSovKTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBhZGRpbmcgb3V0cHV0ICVkIiwgb3V0cHV0KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgIEFMT0dXKCJjaGVja091dHB1dHNGb3JEZXZpY2UoKTogTm8gb3V0cHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlICUwNHgiLCBkZXZpY2UpOworICAgICAgICAgICAgQUxPR1coImNoZWNrT3V0cHV0c0ZvckRldmljZSgpOiBObyBvdXRwdXQgYXZhaWxhYmxlIGZvciBkZXZpY2UgJTA0eCIsIGRldmljZVR5cGUpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7IC8vIERpc2Nvbm5lY3QKQEAgLTQ0MzYsMTAgKzQ3OTAsMTAgQEAKICAgICAgICAgICAgIGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwogICAgICAgICAgICAgaWYgKCFkZXNjLT5pc0R1cGxpY2F0ZWQoKSkgewogICAgICAgICAgICAgICAgIC8vIGV4YWN0IG1hdGNoIG9uIGRldmljZQotICAgICAgICAgICAgICAgIGlmIChkZXZpY2VfZGlzdGluZ3Vpc2hlc19vbl9hZGRyZXNzKGRldmljZSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgIChkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkgPT0gZGV2aWNlKSkgewotICAgICAgICAgICAgICAgICAgICBmaW5kSW9IYW5kbGVzQnlBZGRyZXNzKGRlc2MsIGRldmljZSwgYWRkcmVzcywgb3V0cHV0cyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmICghKGRlc2MtPnN1cHBvcnRlZERldmljZXMoKSAmIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzLnR5cGVzKCkpKSB7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZV9kaXN0aW5ndWlzaGVzX29uX2FkZHJlc3MoZGV2aWNlVHlwZSkgJiYgZGVzYy0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgJiYgZGVzYy0+ZGV2aWNlc1N1cHBvcnRFbmNvZGVkRm9ybWF0cyh7ZGV2aWNlVHlwZX0pKSB7CisgICAgICAgICAgICAgICAgICAgIG91dHB1dHMuYWRkKG1PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5jb250YWluc0F0TGVhc3RPbmUoZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6IGRpc2Nvbm5lY3RpbmcgYWRkaW5nIG91dHB1dCAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU91dHB1dHMua2V5QXQoaSkpOwogICAgICAgICAgICAgICAgICAgICBvdXRwdXRzLmFkZChtT3V0cHV0cy5rZXlBdChpKSk7CkBAIC00NDUwLDcgKzQ4MDQsNyBAQAogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgewogICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBod01vZHVsZS0+Z2V0T3V0cHV0UHJvZmlsZXMoKS5zaXplKCk7IGorKykgewogICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGh3TW9kdWxlLT5nZXRPdXRwdXRQcm9maWxlcygpW2pdOwotICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKKyAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydHNEZXZpY2UoZGV2aWNlKSkgewogICAgICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tPdXRwdXRzRm9yRGV2aWNlKCk6ICIKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2xlYXJpbmcgZGlyZWN0IG91dHB1dCBwcm9maWxlICV6dSBvbiBtb2R1bGUgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGosIGh3TW9kdWxlLT5nZXROYW1lKCkpOwpAQCAtNDQ2MiwzMCArNDgxNiwxOCBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0lucHV0c0ZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+JiBpbnB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MpCitzdGF0dXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrSW5wdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSkKIHsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gZGV2RGVzYy0+dHlwZSgpOwogICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBkZXNjOwogCi0gICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKKyAgICBpZiAoYXVkaW9fZGV2aWNlX2lzX2RpZ2l0YWwoZGV2aWNlLT50eXBlKCkpKSB7CiAgICAgICAgIC8vIGVyYXNlIGFsbCBjdXJyZW50IHNhbXBsZSByYXRlcywgZm9ybWF0cyBhbmQgY2hhbm5lbCBtYXNrcwotICAgICAgICBkZXZEZXNjLT5jbGVhckF1ZGlvUHJvZmlsZXMoKTsKKyAgICAgICAgZGV2aWNlLT5jbGVhckF1ZGlvUHJvZmlsZXMoKTsKICAgICB9CiAKICAgICBpZiAoc3RhdGUgPT0gQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUpIHsKLSAgICAgICAgLy8gZmlyc3QgbGlzdCBhbHJlYWR5IG9wZW4gaW5wdXRzIHRoYXQgY2FuIGJlIHJvdXRlZCB0byB0aGlzIGRldmljZQotICAgICAgICBmb3IgKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKLSAgICAgICAgICAgIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOwotICAgICAgICAgICAgaWYgKGRlc2MtPm1Qcm9maWxlLT5zdXBwb3J0RGV2aWNlKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIG9wZW5lZCBpbnB1dCAlZCIsIG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKLSAgICAgICAgICAgICAgIGlucHV0cy5hZGQobUlucHV0cy5rZXlBdChpbnB1dF9pbmRleCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8gdGhlbiBsb29rIGZvciBpbnB1dCBwcm9maWxlcyB0aGF0IGNhbiBiZSByb3V0ZWQgdG8gdGhpcyBkZXZpY2UKKyAgICAgICAgLy8gbG9vayBmb3IgaW5wdXQgcHJvZmlsZXMgdGhhdCBjYW4gYmUgcm91dGVkIHRvIHRoaXMgZGV2aWNlCiAgICAgICAgIFNvcnRlZFZlY3Rvcjwgc3A8SU9Qcm9maWxlPiA+IHByb2ZpbGVzOwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgewogICAgICAgICAgICAgZm9yIChzaXplX3QgcHJvZmlsZV9pbmRleCA9IDA7CkBAIC00NDkzLDE5ICs0ODM1LDE3IEBACiAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgrKykgewogICAgICAgICAgICAgICAgIHNwPElPUHJvZmlsZT4gcHJvZmlsZSA9IGh3TW9kdWxlLT5nZXRJbnB1dFByb2ZpbGVzKClbcHJvZmlsZV9pbmRleF07CiAKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZGV2aWNlX2Rpc3Rpbmd1aXNoZXNfb25fYWRkcmVzcyhkZXZpY2UpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZS0+c3VwcG9ydERldmljZUFkZHJlc3MoYWRkcmVzcykpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChwcm9maWxlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjaGVja0lucHV0c0ZvckRldmljZSgpOiBhZGRpbmcgcHJvZmlsZSAlenUgZnJvbSBtb2R1bGUgJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9maWxlX2luZGV4LCBod01vZHVsZS0+Z2V0TmFtZSgpKTsKLSAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChwcm9maWxlLT5zdXBwb3J0c0RldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVzLmFkZChwcm9maWxlKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGFkZGluZyBwcm9maWxlICV6dSBmcm9tIG1vZHVsZSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgsIGh3TW9kdWxlLT5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIGlmIChwcm9maWxlcy5pc0VtcHR5KCkgJiYgaW5wdXRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IE5vIGlucHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlIDB4JVgiLCBkZXZpY2UpOworICAgICAgICBpZiAocHJvZmlsZXMuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IE5vIGlucHV0IHByb2ZpbGUgYXZhaWxhYmxlIGZvciBkZXZpY2UgJXMiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBkZXZpY2UtPnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgICAgICB9CiAKQEAgLTQ1MjAsOCArNDg2MCw4IEBACiAgICAgICAgICAgICBmb3IgKGlucHV0X2luZGV4ID0gMDsgaW5wdXRfaW5kZXggPCBtSW5wdXRzLnNpemUoKTsgaW5wdXRfaW5kZXgrKykgewogICAgICAgICAgICAgICAgIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOwogICAgICAgICAgICAgICAgIGlmIChkZXNjLT5tUHJvZmlsZSA9PSBwcm9maWxlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2UpKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZXZEZXNjLT5pbXBvcnRBdWRpb1BvcnQocHJvZmlsZSk7CisgICAgICAgICAgICAgICAgICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2UtPnR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZS0+aW1wb3J0QXVkaW9Qb3J0QW5kUGlja0F1ZGlvUHJvZmlsZShwcm9maWxlKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICB9CkBAIC00NTQwLDE0ICs0ODgwLDE0IEBACiAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpbnB1dCA9IEFVRElPX0lPX0hBTkRMRV9OT05FOwogICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGVzYy0+b3BlbihudWxscHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0lOUFVUX0ZMQUdfTk9ORSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmlucHV0KTsKIAogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MgPSBTdHJpbmc4KGRldmljZS0+YWRkcmVzcygpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIGlmICghYWRkcmVzcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlLCBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqcGFyYW0gPSBhdWRpb19kZXZpY2VfYWRkcmVzc190b19wYXJhbWV0ZXIoZGV2aWNlLT50eXBlKCksIGFkZHJlc3MpOwogICAgICAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhpbnB1dCwgU3RyaW5nOChwYXJhbSkpOwogICAgICAgICAgICAgICAgICAgICBmcmVlKHBhcmFtKTsKICAgICAgICAgICAgICAgICB9CkBAIC00NTU4LDQ2ICs0ODk4LDM3IEBACiAgICAgICAgICAgICAgICAgICAgIGlucHV0ID0gQVVESU9fSU9fSEFORExFX05PTkU7CiAgICAgICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgaWYgKGlucHV0ICE9IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoaW5wdXQgIT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKICAgICAgICAgICAgICAgICAgICAgYWRkSW5wdXQoaW5wdXQsIGRlc2MpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gLy8gZW5kaWYgaW5wdXQgIT0gMAogCiAgICAgICAgICAgICBpZiAoaW5wdXQgPT0gQVVESU9fSU9fSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKSBjb3VsZCBub3Qgb3BlbiBpbnB1dCBmb3IgZGV2aWNlIDB4JVgiLCBkZXZpY2UpOworICAgICAgICAgICAgICAgIEFMT0dXKCIlcyBjb3VsZCBub3Qgb3BlbiBpbnB1dCBmb3IgZGV2aWNlICVzIiwgX19mdW5jX18sICAKKyAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgICAgIHByb2ZpbGVzLnJlbW92ZUF0KHByb2ZpbGVfaW5kZXgpOwogICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgtLTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5wdXRzLmFkZChpbnB1dCk7Ci0gICAgICAgICAgICAgICAgaWYgKGF1ZGlvX2RldmljZV9pc19kaWdpdGFsKGRldmljZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgZGV2RGVzYy0+aW1wb3J0QXVkaW9Qb3J0KHByb2ZpbGUpOworICAgICAgICAgICAgICAgIGlmIChhdWRpb19kZXZpY2VfaXNfZGlnaXRhbChkZXZpY2UtPnR5cGUoKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgZGV2aWNlLT5pbXBvcnRBdWRpb1BvcnRBbmRQaWNrQXVkaW9Qcm9maWxlKHByb2ZpbGUpOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogYWRkaW5nIGlucHV0ICVkIiwgaW5wdXQpOwogICAgICAgICAgICAgfQogICAgICAgICB9IC8vIGVuZCBzY2FuIHByb2ZpbGVzCiAKICAgICAgICAgaWYgKHByb2ZpbGVzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgQUxPR1coImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IE5vIGlucHV0IGF2YWlsYWJsZSBmb3IgZGV2aWNlIDB4JVgiLCBkZXZpY2UpOworICAgICAgICAgICAgQUxPR1coIiVzOiBObyBpbnB1dCBhdmFpbGFibGUgZm9yIGRldmljZSAlcyIsIF9fZnVuY19fLCAgZGV2aWNlLT50b1N0cmluZygpLmNfc3RyKCkpOwogICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIERpc2Nvbm5lY3QKLSAgICAgICAgLy8gY2hlY2sgaWYgb25lIG9wZW5lZCBpbnB1dCBpcyBub3QgbmVlZGVkIGFueSBtb3JlIGFmdGVyIGRpc2Nvbm5lY3Rpbmcgb25lIGRldmljZQotICAgICAgICBmb3IgKHNpemVfdCBpbnB1dF9pbmRleCA9IDA7IGlucHV0X2luZGV4IDwgbUlucHV0cy5zaXplKCk7IGlucHV0X2luZGV4KyspIHsKLSAgICAgICAgICAgIGRlc2MgPSBtSW5wdXRzLnZhbHVlQXQoaW5wdXRfaW5kZXgpOwotICAgICAgICAgICAgaWYgKCEoZGVzYy0+bVByb2ZpbGUtPnN1cHBvcnREZXZpY2UobUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpKSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiY2hlY2tJbnB1dHNGb3JEZXZpY2UoKTogZGlzY29ubmVjdGluZyBhZGRpbmcgaW5wdXQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgIG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKLSAgICAgICAgICAgICAgICBpbnB1dHMuYWRkKG1JbnB1dHMua2V5QXQoaW5wdXRfaW5kZXgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQogICAgICAgICAvLyBDbGVhciBhbnkgcHJvZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBkaXNjb25uZWN0ZWQgZGV2aWNlLgogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGh3TW9kdWxlIDogbUh3TW9kdWxlcykgewogICAgICAgICAgICAgZm9yIChzaXplX3QgcHJvZmlsZV9pbmRleCA9IDA7CiAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXggPCBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpLnNpemUoKTsKICAgICAgICAgICAgICAgICAgcHJvZmlsZV9pbmRleCsrKSB7CiAgICAgICAgICAgICAgICAgc3A8SU9Qcm9maWxlPiBwcm9maWxlID0gaHdNb2R1bGUtPmdldElucHV0UHJvZmlsZXMoKVtwcm9maWxlX2luZGV4XTsKLSAgICAgICAgICAgICAgICBpZiAocHJvZmlsZS0+c3VwcG9ydERldmljZShkZXZpY2UpKSB7CisgICAgICAgICAgICAgICAgaWYgKHByb2ZpbGUtPnN1cHBvcnRzRGV2aWNlKGRldmljZSkpIHsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoImNoZWNrSW5wdXRzRm9yRGV2aWNlKCk6IGNsZWFyaW5nIGRpcmVjdCBpbnB1dCBwcm9maWxlICV6dSBvbiBtb2R1bGUgJXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2ZpbGVfaW5kZXgsIGh3TW9kdWxlLT5nZXROYW1lKCkpOwogICAgICAgICAgICAgICAgICAgICBwcm9maWxlLT5jbGVhckF1ZGlvUHJvZmlsZXMoKTsKQEAgLTQ2MTQsMzggKzQ5NDUsMzIgQEAKIHsKICAgICBBTE9HVigiY2xvc2VPdXRwdXQoJWQpIiwgb3V0cHV0KTsKIAotICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICBpZiAob3V0cHV0RGVzYyA9PSBOVUxMKSB7CisgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGNsb3NpbmdPdXRwdXQgPSBtT3V0cHV0cy52YWx1ZUZvcihvdXRwdXQpOworICAgIGlmIChjbG9zaW5nT3V0cHV0ID09IE5VTEwpIHsKICAgICAgICAgQUxPR1coImNsb3NlT3V0cHV0KCkgdW5rbm93biBvdXRwdXQgJWQiLCBvdXRwdXQpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIG1Qb2xpY3lNaXhlcy5jbG9zZU91dHB1dChvdXRwdXREZXNjKTsKKyAgICBjb25zdCBib29sIGNsb3NpbmdPdXRwdXRXYXNBY3RpdmUgPSBjbG9zaW5nT3V0cHV0LT5pc0FjdGl2ZSgpOworICAgIG1Qb2xpY3lNaXhlcy5jbG9zZU91dHB1dChjbG9zaW5nT3V0cHV0KTsKIAogICAgIC8vIGxvb2sgZm9yIGR1cGxpY2F0ZWQgb3V0cHV0cyBjb25uZWN0ZWQgdG8gdGhlIG91dHB1dCBiZWluZyByZW1vdmVkLgogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGR1cE91dHB1dERlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAoZHVwT3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkgJiYKLSAgICAgICAgICAgICAgICAoZHVwT3V0cHV0RGVzYy0+bU91dHB1dDEgPT0gb3V0cHV0RGVzYyB8fAotICAgICAgICAgICAgICAgIGR1cE91dHB1dERlc2MtPm1PdXRwdXQyID09IG91dHB1dERlc2MpKSB7Ci0gICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gb3V0cHV0RGVzYzI7Ci0gICAgICAgICAgICBpZiAoZHVwT3V0cHV0RGVzYy0+bU91dHB1dDEgPT0gb3V0cHV0RGVzYykgewotICAgICAgICAgICAgICAgIG91dHB1dERlc2MyID0gZHVwT3V0cHV0RGVzYy0+bU91dHB1dDI7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIG91dHB1dERlc2MyID0gZHVwT3V0cHV0RGVzYy0+bU91dHB1dDE7Ci0gICAgICAgICAgICB9CisgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkdXBPdXRwdXQgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoZHVwT3V0cHV0LT5pc0R1cGxpY2F0ZWQoKSAmJgorICAgICAgICAgICAgICAgIChkdXBPdXRwdXQtPm1PdXRwdXQxID09IGNsb3NpbmdPdXRwdXQgfHwgZHVwT3V0cHV0LT5tT3V0cHV0MiA9PSBjbG9zaW5nT3V0cHV0KSkgeworICAgICAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IHJlbWFpbmluZ091dHB1dCA9CisgICAgICAgICAgICAgICAgZHVwT3V0cHV0LT5tT3V0cHV0MSA9PSBjbG9zaW5nT3V0cHV0ID8gZHVwT3V0cHV0LT5tT3V0cHV0MiA6IGR1cE91dHB1dC0+bU91dHB1dDE7CiAgICAgICAgICAgICAvLyBBcyBhbGwgYWN0aXZlIHRyYWNrcyBvbiBkdXBsaWNhdGVkIG91dHB1dCB3aWxsIGJlIGRlbGV0ZWQsCiAgICAgICAgICAgICAvLyBhbmQgYXMgdGhleSB3ZXJlIGFsc28gcmVmZXJlbmNlZCBvbiB0aGUgb3RoZXIgb3V0cHV0LCB0aGUgcmVmZXJlbmNlCiAgICAgICAgICAgICAvLyBjb3VudCBmb3IgdGhlaXIgc3RyZWFtIHR5cGUgbXVzdCBiZSBhZGp1c3RlZCBhY2NvcmRpbmdseSBvbgogICAgICAgICAgICAgLy8gdGhlIG90aGVyIG91dHB1dC4KLSAgICAgICAgICAgIGJvb2wgd2FzQWN0aXZlID0gb3V0cHV0RGVzYzItPmlzQWN0aXZlKCk7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IEFVRElPX1NUUkVBTV9DTlQ7IGorKykgewotICAgICAgICAgICAgICAgIGludCByZWZDb3VudCA9IGR1cE91dHB1dERlc2MtPm1SZWZDb3VudFtqXTsKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjMi0+Y2hhbmdlUmVmQ291bnQoKGF1ZGlvX3N0cmVhbV90eXBlX3QpaiwtcmVmQ291bnQpOwotICAgICAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgYm9vbCB3YXNBY3RpdmUgPSByZW1haW5pbmdPdXRwdXQtPmlzQWN0aXZlKCk7CisgICAgICAgICAgICAvLyBOb3RlOiBuby1vcCBvbiB0aGUgY2xvc2luZyBvdXRwdXQgd2hlcmUgYWxsIGNsaWVudHMgaGFzIGFscmVhZHkgYmVlbiBzZXQgaW5hY3RpdmUKKyAgICAgICAgICAgIGR1cE91dHB1dC0+c2V0QWxsQ2xpZW50c0luYWN0aXZlKCk7CiAgICAgICAgICAgICAvLyBzdG9wKCkgd2lsbCBiZSBhIG5vIG9wIGlmIHRoZSBvdXRwdXQgaXMgc3RpbGwgYWN0aXZlIGJ1dCBpcyBuZWVkZWQgaW4gY2FzZSBhbGwKICAgICAgICAgICAgIC8vIGFjdGl2ZSBzdHJlYW1zIHJlZmNvdW50cyB3aGVyZSBjbGVhcmVkIGFib3ZlCiAgICAgICAgICAgICBpZiAod2FzQWN0aXZlKSB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYzItPnN0b3AoKTsKKyAgICAgICAgICAgICAgICByZW1haW5pbmdPdXRwdXQtPnN0b3AoKTsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGR1cGxpY2F0ZWRPdXRwdXQgPSBtT3V0cHV0cy5rZXlBdChpKTsKICAgICAgICAgICAgIEFMT0dWKCJjbG9zZU91dHB1dCgpIGNsb3NpbmcgYWxzbyBkdXBsaWNhdGVkIG91dHB1dCAlZCIsIGR1cGxpY2F0ZWRPdXRwdXQpOwpAQCAtNDY1NywxOCArNDk4Miw0MCBAQAogCiAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKIAotICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7CisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShjbG9zaW5nT3V0cHV0LT5nZXRQYXRjaEhhbmRsZSgpKTsKICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICAodm9pZCkgLypzdGF0dXNfdCBzdGF0dXMqLyBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgICh2b2lkKSAvKnN0YXR1c190IHN0YXR1cyovIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5nZXRBZkhhbmRsZSgpLCAwKTsKICAgICAgICAgbUF1ZGlvUGF0Y2hlcy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKICAgICB9CiAKLSAgICBvdXRwdXREZXNjLT5jbG9zZSgpOworICAgIGlmIChjbG9zaW5nT3V0cHV0V2FzQWN0aXZlKSB7CisgICAgICAgIGNsb3NpbmdPdXRwdXQtPnN0b3AoKTsKKyAgICB9CisgICAgY2xvc2luZ091dHB1dC0+Y2xvc2UoKTsKIAogICAgIHJlbW92ZU91dHB1dChvdXRwdXQpOwogICAgIG1QcmV2aW91c091dHB1dHMgPSBtT3V0cHV0czsKKworICAgIC8vIE1TRCBwYXRjaGVzIG1heSBoYXZlIGJlZW4gcmVsZWFzZWQgdG8gc3VwcG9ydCBhIG5vbi1NU0QgZGlyZWN0IG91dHB1dC4gUmVzZXQgTVNEIHBhdGNoIGlmCisgICAgLy8gbm8gZGlyZWN0IG91dHB1dHMgYXJlIG9wZW4uCisgICAgaWYgKCFnZXRNc2RBdWRpb091dERldmljZXMoKS5pc0VtcHR5KCkpIHsKKyAgICAgICAgYm9vbCBkaXJlY3RPdXRwdXRPcGVuID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChtT3V0cHV0c1tpXS0+bUZsYWdzICYgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKSB7CisgICAgICAgICAgICAgICAgZGlyZWN0T3V0cHV0T3BlbiA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFkaXJlY3RPdXRwdXRPcGVuKSB7CisgICAgICAgICAgICBBTE9HVigibm8gZGlyZWN0IG91dHB1dHMgb3BlbiwgcmVzZXQgTVNEIHBhdGNoIik7CisgICAgICAgICAgICBzZXRNc2RQYXRjaCgpOworICAgICAgICB9CisgICAgfQorCisgICAgY2xlYW5VcEVmZmVjdHNGb3JJbyhvdXRwdXQpOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCkKQEAgLTQ2ODMsNjEgKzUwMzAsODIgQEAKIAogICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CiAKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBkZXZpY2UgPSBpbnB1dERlc2MtPmdldERldmljZSgpOwogICAgIHNzaXplX3QgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoaW5wdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKICAgICBpZiAoaW5kZXggPj0gMCkgewogICAgICAgICBzcDxBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICAodm9pZCkgLypzdGF0dXNfdCBzdGF0dXMqLyBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSwgMCk7CisgICAgICAgICh2b2lkKSAvKnN0YXR1c190IHN0YXR1cyovIG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaCgKKyAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5nZXRBZkhhbmRsZSgpLCAwKTsKICAgICAgICAgbUF1ZGlvUGF0Y2hlcy5yZW1vdmVJdGVtc0F0KGluZGV4KTsKICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKICAgICB9CiAKICAgICBpbnB1dERlc2MtPmNsb3NlKCk7CiAgICAgbUlucHV0cy5yZW1vdmVJdGVtKGlucHV0KTsKKworICAgIERldmljZVZlY3RvciBwcmltYXJ5SW5wdXREZXZpY2VzID0gYXZhaWxhYmxlUHJpbWFyeU1vZHVsZUlucHV0RGV2aWNlcygpOworICAgIGlmIChwcmltYXJ5SW5wdXREZXZpY2VzLmNvbnRhaW5zKGRldmljZSkgJiYKKyAgICAgICAgICAgIG1JbnB1dHMuYWN0aXZlSW5wdXRzQ291bnRPbkRldmljZXMocHJpbWFyeUlucHV0RGV2aWNlcykgPT0gMCkgeworICAgICAgICBTb3VuZFRyaWdnZXI6OnNldENhcHR1cmVTdGF0ZShmYWxzZSk7CisgICAgfQorCisgICAgY2xlYW5VcEVmZmVjdHNGb3JJbyhpbnB1dCk7CiB9CiAKLVNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRPdXRwdXRzRm9yRGV2aWNlKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24mIG9wZW5PdXRwdXRzKQorU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE91dHB1dHNGb3JEZXZpY2VzKAorICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yICZkZXZpY2VzLAorICAgICAgICAgICAgY29uc3QgU3dBdWRpb091dHB1dENvbGxlY3Rpb24mIG9wZW5PdXRwdXRzKQogewogICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gb3V0cHV0czsKIAotICAgIEFMT0dWVigiZ2V0T3V0cHV0c0ZvckRldmljZSgpIGRldmljZSAlMDR4IiwgZGV2aWNlKTsKKyAgICBBTE9HVlYoIiVzKCkgZGV2aWNlcyAlcyIsIF9fZnVuY19fLCBkZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBvcGVuT3V0cHV0cy5zaXplKCk7IGkrKykgewotICAgICAgICBBTE9HVlYoIm91dHB1dCAlenUgaXNEdXBsaWNhdGVkPSVkIGRldmljZT0lMDR4IiwKKyAgICAgICAgQUxPR1ZWKCJvdXRwdXQgJXp1IGlzRHVwbGljYXRlZD0lZCBkZXZpY2U9JXMiLAogICAgICAgICAgICAgICAgIGksIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPmlzRHVwbGljYXRlZCgpLAotICAgICAgICAgICAgICAgIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPnN1cHBvcnRlZERldmljZXMoKSk7Ci0gICAgICAgIGlmICgoZGV2aWNlICYgb3Blbk91dHB1dHMudmFsdWVBdChpKS0+c3VwcG9ydGVkRGV2aWNlcygpKSA9PSBkZXZpY2UpIHsKLSAgICAgICAgICAgIEFMT0dWVigiZ2V0T3V0cHV0c0ZvckRldmljZSgpIGZvdW5kIG91dHB1dCAlZCIsIG9wZW5PdXRwdXRzLmtleUF0KGkpKTsKKyAgICAgICAgICAgICAgICBvcGVuT3V0cHV0cy52YWx1ZUF0KGkpLT5zdXBwb3J0ZWREZXZpY2VzKCkudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgaWYgKG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPnN1cHBvcnRzQWxsRGV2aWNlcyhkZXZpY2VzKQorICAgICAgICAgICAgICAgICYmIG9wZW5PdXRwdXRzLnZhbHVlQXQoaSktPmRldmljZXNTdXBwb3J0RW5jb2RlZEZvcm1hdHMoZGV2aWNlcy50eXBlcygpKSkgeworICAgICAgICAgICAgQUxPR1ZWKCIlcygpIGZvdW5kIG91dHB1dCAlZCIsIF9fZnVuY19fLCBvcGVuT3V0cHV0cy5rZXlBdChpKSk7CiAgICAgICAgICAgICBvdXRwdXRzLmFkZChvcGVuT3V0cHV0cy5rZXlBdChpKSk7CiAgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIG91dHB1dHM7CiB9CiAKLWJvb2wgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp2ZWN0b3JzRXF1YWwoU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiYgb3V0cHV0czEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMyKQordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrRm9yRGV2aWNlQW5kT3V0cHV0Q2hhbmdlcyhzdGQ6OmZ1bmN0aW9uPGJvb2woKT4gb25PdXRwdXRzQ2hlY2tlZCkKIHsKLSAgICBpZiAob3V0cHV0czEuc2l6ZSgpICE9IG91dHB1dHMyLnNpemUoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gY2hlY2tBMmRwU3VzcGVuZCBtdXN0IHJ1biBiZWZvcmUgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzIHNvIHRoYXQgQTJEUAorICAgIC8vIG91dHB1dCBpcyBzdXNwZW5kZWQgYmVmb3JlIGFueSB0cmFja3MgYXJlIG1vdmVkIHRvIGl0CisgICAgY2hlY2tBMmRwU3VzcGVuZCgpOworICAgIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpOworICAgIGNoZWNrU2Vjb25kYXJ5T3V0cHV0cygpOworICAgIGlmIChvbk91dHB1dHNDaGVja2VkICE9IG51bGxwdHIgJiYgb25PdXRwdXRzQ2hlY2tlZCgpKSBjaGVja0EyZHBTdXNwZW5kKCk7CisgICAgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKTsKKyAgICBpZiAobUh3TW9kdWxlcy5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNEKSAhPSAwKSB7CisgICAgICAgIHNldE1zZFBhdGNoKCk7CiAgICAgfQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgb3V0cHV0czEuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgaWYgKG91dHB1dHMxW2ldICE9IG91dHB1dHMyW2ldKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dEZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3kpCitib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6Zm9sbG93c1NhbWVSb3V0aW5nKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmbEF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmckF0dHIpIGNvbnN0CiB7Ci0gICAgYXVkaW9fZGV2aWNlc190IG9sZERldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5LCB0cnVlIC8qZnJvbUNhY2hlKi8pOwotICAgIGF1ZGlvX2RldmljZXNfdCBuZXdEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShzdHJhdGVneSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzcmNPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZShvbGREZXZpY2UsIG1QcmV2aW91c091dHB1dHMpOwotICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gZHN0T3V0cHV0cyA9IGdldE91dHB1dHNGb3JEZXZpY2UobmV3RGV2aWNlLCBtT3V0cHV0cyk7CisgICAgcmV0dXJuIG1FbmdpbmUtPmdldFByb2R1Y3RTdHJhdGVneUZvckF0dHJpYnV0ZXMobEF0dHIpID09CisgICAgICAgICAgICBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKHJBdHRyKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrT3V0cHV0Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIpCit7CisgICAgYXV0byBwc0lkID0gbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhhdHRyKTsKKworICAgIERldmljZVZlY3RvciBvbGREZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0ciwgMCwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKKyAgICBEZXZpY2VWZWN0b3IgbmV3RGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JBdHRyaWJ1dGVzKGF0dHIsIDAsIGZhbHNlIC8qZnJvbUNhY2hlKi8pOworCisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBzcmNPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZXMob2xkRGV2aWNlcywgbVByZXZpb3VzT3V0cHV0cyk7CisgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBkc3RPdXRwdXRzID0gZ2V0T3V0cHV0c0ZvckRldmljZXMobmV3RGV2aWNlcywgbU91dHB1dHMpOwogCiAgICAgLy8gYWxzbyB0YWtlIGludG8gYWNjb3VudCBleHRlcm5hbCBwb2xpY3ktcmVsYXRlZCBjaGFuZ2VzOiBhZGQgYWxsIG91dHB1dHMgd2hpY2ggYXJlCiAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIHBvbGljaWVzIGluIHRoZSAiYmVmb3JlIiBhbmQgImFmdGVyIiBvdXRwdXQgdmVjdG9ycwotICAgIEFMT0dWVigiY2hlY2tPdXRwdXRGb3JTdHJhdGVneSgpOiBwb2xpY3kgcmVsYXRlZCBvdXRwdXRzIik7CisgICAgQUxPR1ZWKCIlcygpOiBwb2xpY3kgcmVsYXRlZCBvdXRwdXRzIiwgX19mdW5jX18pOwogICAgIGZvciAoc2l6ZV90IGkgPSAwIDsgaSA8IG1QcmV2aW91c091dHB1dHMuc2l6ZSgpIDsgaSsrKSB7CiAgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbVByZXZpb3VzT3V0cHV0cy52YWx1ZUF0KGkpOwogICAgICAgICBpZiAoZGVzYyAhPSAwICYmIGRlc2MtPm1Qb2xpY3lNaXggIT0gTlVMTCkgewpAQCAtNDc1Myw3ICs1MTIxLDcgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmICghdmVjdG9yc0VxdWFsKHNyY091dHB1dHMsZHN0T3V0cHV0cykpIHsKKyAgICBpZiAoc3JjT3V0cHV0cyAhPSBkc3RPdXRwdXRzKSB7CiAgICAgICAgIC8vIGdldCBtYXhpbXVtIGxhdGVuY3kgb2YgYWxsIHNvdXJjZSBvdXRwdXRzIHRvIGRldGVybWluZSB0aGUgbWluaW11bSBtdXRlIHRpbWUgZ3VhcmFudGVlaW5nCiAgICAgICAgIC8vIGF1ZGlvIGZyb20gaW52YWxpZGF0ZWQgdHJhY2tzIHdpbGwgYmUgcmVuZGVyZWQgd2hlbiB1bm11dGluZwogICAgICAgICB1aW50MzJfdCBtYXhMYXRlbmN5ID0gMDsKQEAgLTQ3NjMsNDggKzUxMzEsNjQgQEAKICAgICAgICAgICAgICAgICBtYXhMYXRlbmN5ID0gZGVzYy0+bGF0ZW5jeSgpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIEFMT0dWKCJjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgc3RyYXRlZ3kgJWQsIG1vdmluZyBmcm9tIG91dHB1dCAlZCB0byBvdXRwdXQgJWQiLAotICAgICAgICAgICAgICBzdHJhdGVneSwgc3JjT3V0cHV0c1swXSwgZHN0T3V0cHV0c1swXSk7CisgICAgICAgIEFMT0dWX0lGKCEoc3JjT3V0cHV0cy5pc0VtcHR5KCkgfHwgZHN0T3V0cHV0cy5pc0VtcHR5KCkpLAorICAgICAgICAgICAgICAiJXM6IHN0cmF0ZWd5ICVkLCBtb3ZpbmcgZnJvbSBvdXRwdXQgJXMgdG8gb3V0cHV0ICVzIiwgX19mdW5jX18sIHBzSWQsCisgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKHNyY091dHB1dHNbMF0pLmNfc3RyKCksCisgICAgICAgICAgICAgIHN0ZDo6dG9fc3RyaW5nKGRzdE91dHB1dHNbMF0pLmNfc3RyKCkpOwogICAgICAgICAvLyBtdXRlIHN0cmF0ZWd5IHdoaWxlIG1vdmluZyB0cmFja3MgZnJvbSBvbmUgb3V0cHV0IHRvIGFub3RoZXIKICAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBzcmNPdXQgOiBzcmNPdXRwdXRzKSB7CiAgICAgICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1QcmV2aW91c091dHB1dHMudmFsdWVGb3Ioc3JjT3V0KTsKLSAgICAgICAgICAgIGlmIChkZXNjICE9IDAgJiYgaXNTdHJhdGVneUFjdGl2ZShkZXNjLCBzdHJhdGVneSkpIHsKLSAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoc3RyYXRlZ3ksIHRydWUsIGRlc2MpOwotICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShzdHJhdGVneSwgZmFsc2UsIGRlc2MsIG1heExhdGVuY3kgKiBMQVRFTkNZX01VVEVfRkFDVE9SLCBuZXdEZXZpY2UpOworICAgICAgICAgICAgaWYgKGRlc2MgIT0gMCAmJiBkZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKHBzSWQpKSB7CisgICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKHBzSWQsIHRydWUsIGRlc2MpOworICAgICAgICAgICAgICAgIHNldFN0cmF0ZWd5TXV0ZShwc0lkLCBmYWxzZSwgZGVzYywgbWF4TGF0ZW5jeSAqIExBVEVOQ1lfTVVURV9GQUNUT1IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0RldmljZXMudHlwZXMoKSk7CiAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZSA9Ci0gICAgICAgICAgICAgICAgICAgIGdldFNvdXJjZUZvclN0cmF0ZWd5T25PdXRwdXQoc3JjT3V0LCBzdHJhdGVneSk7CisgICAgICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2UgPSBnZXRTb3VyY2VGb3JBdHRyaWJ1dGVzT25PdXRwdXQoc3JjT3V0LCBhdHRyKTsKICAgICAgICAgICAgIGlmIChzb3VyY2UgIT0gMCl7CiAgICAgICAgICAgICAgICAgY29ubmVjdEF1ZGlvU291cmNlKHNvdXJjZSk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAotICAgICAgICAvLyBNb3ZlIGVmZmVjdHMgYXNzb2NpYXRlZCB0byB0aGlzIHN0cmF0ZWd5IGZyb20gcHJldmlvdXMgb3V0cHV0IHRvIG5ldyBvdXRwdXQKLSAgICAgICAgaWYgKHN0cmF0ZWd5ID09IFNUUkFURUdZX01FRElBKSB7CisgICAgICAgIC8vIE1vdmUgZWZmZWN0cyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyZWFtIGZyb20gcHJldmlvdXMgb3V0cHV0IHRvIG5ldyBvdXRwdXQKKyAgICAgICAgaWYgKGZvbGxvd3NTYW1lUm91dGluZyhhdHRyLCBhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX01FRElBKSkpIHsKICAgICAgICAgICAgIHNlbGVjdE91dHB1dEZvck11c2ljRWZmZWN0cygpOwogICAgICAgICB9Ci0gICAgICAgIC8vIE1vdmUgdHJhY2tzIGFzc29jaWF0ZWQgdG8gdGhpcyBzdHJhdGVneSBmcm9tIHByZXZpb3VzIG91dHB1dCB0byBuZXcgb3V0cHV0Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpKSA9PSBzdHJhdGVneSkgewotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKChhdWRpb19zdHJlYW1fdHlwZV90KWkpOwotICAgICAgICAgICAgfQorICAgICAgICAvLyBNb3ZlIHRyYWNrcyBhc3NvY2lhdGVkIHRvIHRoaXMgc3RyZWFtIChhbmQgbGlua2VkKSBmcm9tIHByZXZpb3VzIG91dHB1dCB0byBuZXcgb3V0cHV0CisgICAgICAgIGZvciAoYXV0byBzdHJlYW0gOiAgbUVuZ2luZS0+Z2V0U3RyZWFtVHlwZXNGb3JQcm9kdWN0U3RyYXRlZ3kocHNJZCkpIHsKKyAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5pbnZhbGlkYXRlU3RyZWFtKHN0cmVhbSk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQogewotICAgIGlmIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX1NZU1RFTV9FTkZPUkNFRCkKLSAgICAgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9FTkZPUkNFRF9BVURJQkxFKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FKTsKLSAgICBpZiAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pICE9IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpCi0gICAgICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSk7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT04pOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpOwotICAgIGNoZWNrT3V0cHV0Rm9yU3RyYXRlZ3koU1RSQVRFR1lfQUNDRVNTSUJJTElUWSk7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSk7Ci0gICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9EVE1GKTsKLSAgICBjaGVja091dHB1dEZvclN0cmF0ZWd5KFNUUkFURUdZX1JFUk9VVElORyk7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJhdGVneSA6IG1FbmdpbmUtPmdldE9yZGVyZWRQcm9kdWN0U3RyYXRlZ2llcygpKSB7CisgICAgICAgIGF1dG8gYXR0cmlidXRlcyA9IG1FbmdpbmUtPmdldEFsbEF0dHJpYnV0ZXNGb3JQcm9kdWN0U3RyYXRlZ3koc3RyYXRlZ3kpLmZyb250KCk7CisgICAgICAgIGNoZWNrT3V0cHV0Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja1NlY29uZGFyeU91dHB1dHMoKSB7CisgICAgc3RkOjpzZXQ8YXVkaW9fc3RyZWFtX3R5cGVfdD4gc3RyZWFtc1RvSW52YWxpZGF0ZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1PdXRwdXRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzY3JpcHRvciA9IG1PdXRwdXRzW2ldOworICAgICAgICBmb3IgKGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCA6IG91dHB1dERlc2NyaXB0b3ItPmdldENsaWVudEl0ZXJhYmxlKCkpIHsKKyAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjOworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+PiBzZWNvbmRhcnlEZXNjczsKKyAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IG1Qb2xpY3lNaXhlcy5nZXRPdXRwdXRGb3JBdHRyKGNsaWVudC0+YXR0cmlidXRlcygpLCBjbGllbnQtPnVpZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5mbGFncygpLCBkZXNjLCAmc2Vjb25kYXJ5RGVzY3MpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBPSyB8fAorICAgICAgICAgICAgICAgICFzdGQ6OmVxdWFsKGNsaWVudC0+Z2V0U2Vjb25kYXJ5T3V0cHV0cygpLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xpZW50LT5nZXRTZWNvbmRhcnlPdXRwdXRzKCkuZW5kKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2Vjb25kYXJ5RGVzY3MuYmVnaW4oKSwgc2Vjb25kYXJ5RGVzY3MuZW5kKCkpKSB7CisgICAgICAgICAgICAgICAgc3RyZWFtc1RvSW52YWxpZGF0ZS5pbnNlcnQoY2xpZW50LT5zdHJlYW0oKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA6IHN0cmVhbXNUb0ludmFsaWRhdGUpIHsKKyAgICAgICAgQUxPR0QoIiVzIEludmFsaWRhdGUgc3RyZWFtICVkIGR1ZSB0byBzZWNvbmRhcnkgb3V0cHV0IGNoYW5nZSIsIF9fZnVuY19fLCBzdHJlYW0pOworICAgICAgICBtcENsaWVudEludGVyZmFjZS0+aW52YWxpZGF0ZVN0cmVhbShzdHJlYW0pOworICAgIH0KIH0KIAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNoZWNrQTJkcFN1c3BlbmQoKQpAQCAtNDgxNiw5ICs1MjAwLDggQEAKICAgICB9CiAKICAgICBib29sIGlzU2NvQ29ubmVjdGVkID0KLSAgICAgICAgICAgICgobUF2YWlsYWJsZUlucHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCAmCi0gICAgICAgICAgICAgICAgICAgIH5BVURJT19ERVZJQ0VfQklUX0lOKSAhPSAwKSB8fAotICAgICAgICAgICAgKChtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy50eXBlcygpICYgQVVESU9fREVWSUNFX09VVF9BTExfU0NPKSAhPSAwKTsKKyAgICAgICAgICAgIChtQXZhaWxhYmxlSW5wdXREZXZpY2VzLnR5cGVzKCkuY291bnQoQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCkgIT0gMCB8fAorICAgICAgICAgICAgICFJbnRlcnNlY3Rpb24obUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKSwgZ2V0QXVkaW9EZXZpY2VPdXRBbGxTY29TZXQoKSkuZW1wdHkoKSk7CiAKICAgICAvLyBpZiBzdXNwZW5kZWQsIHJlc3RvcmUgQTJEUCBvdXRwdXQgaWY6CiAgICAgLy8gICAgICAoKFNDTyBkZXZpY2UgaXMgTk9UIGNvbm5lY3RlZCkgfHwKQEAgLTQ4NTcsMTA4ICs1MjQwLDg4IEBACiAgICAgfQogfQogCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXROZXdPdXRwdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSkKK0RldmljZVZlY3RvciBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE5ld091dHB1dERldmljZXMoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSkKIHsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgRGV2aWNlVmVjdG9yIGRldmljZXM7CiAKICAgICBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGF0Y2hlcy5pbmRleE9mS2V5KG91dHB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwogICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgIT0gbVVpZENhY2hlZCkgewotICAgICAgICAgICAgQUxPR1YoImdldE5ld091dHB1dERldmljZSgpIGRldmljZSAlMDh4IGZvcmNlZCBieSBwYXRjaCAlZCIsCi0gICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5kZXZpY2UoKSwgb3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7Ci0gICAgICAgICAgICByZXR1cm4gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7CisgICAgICAgIGlmIChwYXRjaERlc2MtPmdldFVpZCgpICE9IG1VaWRDYWNoZWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlcyBkZXZpY2UgJXMgZm9yY2VkIGJ5IHBhdGNoICVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5kZXZpY2VzKCkudG9TdHJpbmcoKS5jX3N0cigpLCBvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKKyAgICAgICAgICAgIHJldHVybiAgb3V0cHV0RGVzYy0+ZGV2aWNlcygpOwogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gQ2hlY2sgaWYgYW4gZXhwbGljaXQgcm91dGluZyByZXF1ZXN0IGV4aXN0cyBmb3IgYW4gYWN0aXZlIHN0cmVhbSBvbiB0aGlzIG91dHB1dCBhbmQKLSAgICAvLyB1c2UgaXQgaW4gcHJpb3JpdHkgYmVmb3JlIGFueSBvdGhlciBydWxlCi0gICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBzdHJlYW0rKykgewotICAgICAgICBpZiAob3V0cHV0RGVzYy0+aXNTdHJlYW1BY3RpdmUoKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKSkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGZvcmNlZERldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgIG1PdXRwdXRSb3V0ZXMuZ2V0QWN0aXZlRGV2aWNlRm9yU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgbUF2YWlsYWJsZU91dHB1dERldmljZXMpOworICAgIC8vIEhvbm9yIGV4cGxpY2l0IHJvdXRpbmcgcmVxdWVzdHMgb25seSBpZiBubyBjbGllbnQgdXNpbmcgZGVmYXVsdCByb3V0aW5nIGlzIGFjdGl2ZSBvbiB0aGlzCisgICAgLy8gaW5wdXQ6IGEgc3BlY2lmaWMgYXBwIGNhbiBub3QgZm9yY2Ugcm91dGluZyBmb3Igb3RoZXIgYXBwcyBieSBzZXR0aW5nIGEgcHJlZmVycmVkIGRldmljZS4KKyAgICBib29sIGFjdGl2ZTsgLy8gdW51c2VkCisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlID0KKyAgICAgICAgZmluZFByZWZlcnJlZERldmljZShvdXRwdXREZXNjLCBQUk9EVUNUX1NUUkFURUdZX05PTkUsIGFjdGl2ZSwgbUF2YWlsYWJsZU91dHB1dERldmljZXMpOworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKGRldmljZSk7CisgICAgfQogCi0gICAgICAgICAgICBpZiAoZm9yY2VkRGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZvcmNlZERldmljZTsKLSAgICAgICAgICAgIH0KKyAgICAvLyBMZWdhY3kgRW5naW5lIGNhbm5vdCB0YWtlIGNhcmUgb2YgYnVzIGRldmljZXMgYW5kIG1peCwgc28gd2UgbmVlZCB0byBoYW5kbGUgdGhlIGNvbmZsaWN0CisgICAgLy8gb2Ygc2V0Rm9yY2VVc2UgLyBEZWZhdWx0IEJ1cyBkZXZpY2UgaGVyZQorICAgIGRldmljZSA9IG1Qb2xpY3lNaXhlcy5nZXREZXZpY2VBbmRNaXhGb3JPdXRwdXQob3V0cHV0RGVzYywgbUF2YWlsYWJsZU91dHB1dERldmljZXMpOworICAgIGlmIChkZXZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gRGV2aWNlVmVjdG9yKGRldmljZSk7CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvICZwcm9kdWN0U3RyYXRlZ3kgOiBtRW5naW5lLT5nZXRPcmRlcmVkUHJvZHVjdFN0cmF0ZWdpZXMoKSkgeworICAgICAgICBTdHJlYW1UeXBlVmVjdG9yIHN0cmVhbXMgPSBtRW5naW5lLT5nZXRTdHJlYW1UeXBlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0U3RyYXRlZ3kpOworICAgICAgICBhdXRvIGF0dHIgPSBtRW5naW5lLT5nZXRBbGxBdHRyaWJ1dGVzRm9yUHJvZHVjdFN0cmF0ZWd5KHByb2R1Y3RTdHJhdGVneSkuZnJvbnQoKTsKKworICAgICAgICBpZiAoKGhhc1ZvaWNlU3RyZWFtKHN0cmVhbXMpICYmCisgICAgICAgICAgICAgKGlzSW5DYWxsKCkgfHwgbU91dHB1dHMuaXNTdHJhdGVneUFjdGl2ZU9uU2FtZU1vZHVsZShwcm9kdWN0U3RyYXRlZ3ksIG91dHB1dERlc2MpKSAmJgorICAgICAgICAgICAgICFpc1N0cmVhbUFjdGl2ZShBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRSwgMCkpIHx8CisgICAgICAgICAgICAgKChoYXNTdHJlYW0oc3RyZWFtcywgQVVESU9fU1RSRUFNX0FMQVJNKSB8fCBoYXNTdHJlYW0oc3RyZWFtcywgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpKSAmJgorICAgICAgICAgICAgICAgIG1PdXRwdXRzLmlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUocHJvZHVjdFN0cmF0ZWd5LCBvdXRwdXREZXNjKSkgfHwKKyAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKHByb2R1Y3RTdHJhdGVneSkpIHsKKyAgICAgICAgICAgIC8vIFJldHJpZXZhbCBvZiBkZXZpY2VzIGZvciB2b2ljZSBETCBpcyBkb25lIG9uIHByaW1hcnkgb3V0cHV0IHByb2ZpbGUsIGNhbm5vdAorICAgICAgICAgICAgLy8gY2hlY2sgdGhlIHJvdXRlICh3b3VsZCBmb3JjZSBtb2RpZnlpbmcgY29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGlzIHByb2ZpbGUpCisgICAgICAgICAgICBkZXZpY2VzID0gbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0ciwgbnVsbHB0ciwgZnJvbUNhY2hlKTsKKyAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgfQotCi0gICAgLy8gY2hlY2sgdGhlIGZvbGxvd2luZyBieSBvcmRlciBvZiBwcmlvcml0eSB0byByZXF1ZXN0IGEgcm91dGluZyBjaGFuZ2UgaWYgbmVjZXNzYXJ5OgotICAgIC8vIDE6IHRoZSBzdHJhdGVneSBlbmZvcmNlZCBhdWRpYmxlIGlzIGFjdGl2ZSBhbmQgZW5mb3JjZWQgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IGVuZm9yY2VkIGF1ZGlibGUKLSAgICAvLyAyOiB3ZSBhcmUgaW4gY2FsbCBvciB0aGUgc3RyYXRlZ3kgcGhvbmUgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBwaG9uZQotICAgIC8vIDM6IHRoZSBzdHJhdGVneSBzb25pZmljYXRpb24gaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBzb25pZmljYXRpb24KLSAgICAvLyA0OiB0aGUgc3RyYXRlZ3kgZm9yIGVuZm9yY2VkIGF1ZGlibGUgaXMgYWN0aXZlIGJ1dCBub3QgZW5mb3JjZWQgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSB0aGUgZGV2aWNlIGZvciBzdHJhdGVneSBlbmZvcmNlZCBhdWRpYmxlCi0gICAgLy8gNTogdGhlIHN0cmF0ZWd5IGFjY2Vzc2liaWxpdHkgaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSBhY2Nlc3NpYmlsaXR5Ci0gICAgLy8gNjogdGhlIHN0cmF0ZWd5ICJyZXNwZWN0ZnVsIiBzb25pZmljYXRpb24gaXMgYWN0aXZlIG9uIHRoZSBvdXRwdXQ6Ci0gICAgLy8gICAgICB1c2UgZGV2aWNlIGZvciBzdHJhdGVneSAicmVzcGVjdGZ1bCIgc29uaWZpY2F0aW9uCi0gICAgLy8gNzogdGhlIHN0cmF0ZWd5IG1lZGlhIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgbWVkaWEKLSAgICAvLyA4OiB0aGUgc3RyYXRlZ3kgRFRNRiBpcyBhY3RpdmUgb24gdGhlIG91dHB1dDoKLSAgICAvLyAgICAgIHVzZSBkZXZpY2UgZm9yIHN0cmF0ZWd5IERUTUYKLSAgICAvLyA5OiB0aGUgc3RyYXRlZ3kgZm9yIGJlYWNvbiwgYS5rLmEuICJ0cmFuc21pdHRlZCB0aHJvdWdoIHNwZWFrZXIiIGlzIGFjdGl2ZSBvbiB0aGUgb3V0cHV0OgotICAgIC8vICAgICAgdXNlIGRldmljZSBmb3Igc3RyYXRlZ3kgdC10LXMKLQotICAgIC8vIEZJWE1FOiBleHRlbmQgdXNlIG9mIGlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUoKSB0byBhbGwgc3RyYXRlZ2llcwotICAgIC8vIHdpdGggYSByZWZpbmVkIHJ1bGUgY29uc2lkZXJpbmcgbXV0dWFsbHkgZXhjbHVzaXZlIGRldmljZXMgKHVzaW5nIHNhbWUgYmFja2VuZCkKLSAgICAvLyBhcyBvcHBvc2VkIHRvIGFsbCBzdHJlYW1zIG9uIHRoZSBzYW1lIGF1ZGlvIEhBTCBtb2R1bGUuCi0gICAgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkgJiYKLSAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9TWVNURU1fRU5GT1JDRUQpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzSW5DYWxsKCkgfHwKLSAgICAgICAgICAgICAgIGlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUob3V0cHV0RGVzYywgU1RSQVRFR1lfUEhPTkUpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1BIT05FLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9TT05JRklDQVRJT04pKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTiwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfQUNDRVNTSUJJTElUWSkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfQUNDRVNTSUJJTElUWSwgZnJvbUNhY2hlKTsKLSAgICB9IGVsc2UgaWYgKGlzU3RyYXRlZ3lBY3RpdmUob3V0cHV0RGVzYywgU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9NRURJQSkpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfTUVESUEsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX0RUTUYpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX0RUTUYsIGZyb21DYWNoZSk7Ci0gICAgfSBlbHNlIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIFNUUkFURUdZX1RSQU5TTUlUVEVEX1RIUk9VR0hfU1BFQUtFUikpIHsKLSAgICAgICAgZGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSLCBmcm9tQ2FjaGUpOwotICAgIH0gZWxzZSBpZiAoaXNTdHJhdGVneUFjdGl2ZShvdXRwdXREZXNjLCBTVFJBVEVHWV9SRVJPVVRJTkcpKSB7Ci0gICAgICAgIGRldmljZSA9IGdldERldmljZUZvclN0cmF0ZWd5KFNUUkFURUdZX1JFUk9VVElORywgZnJvbUNhY2hlKTsKLSAgICB9Ci0KLSAgICBBTE9HVigiZ2V0TmV3T3V0cHV0RGV2aWNlKCkgc2VsZWN0ZWQgZGV2aWNlICV4IiwgZGV2aWNlKTsKLSAgICByZXR1cm4gZGV2aWNlOworICAgIEFMT0dWKCIlcyBzZWxlY3RlZCBkZXZpY2VzICVzIiwgX19mdW5jX18sIGRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICByZXR1cm4gZGV2aWNlczsKIH0KIAotYXVkaW9fZGV2aWNlc190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0TmV3SW5wdXREZXZpY2UoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dERlc2MpCitzcDxEZXZpY2VEZXNjcmlwdG9yPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldE5ld0lucHV0RGV2aWNlKAorICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYykKIHsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gQVVESU9fREVWSUNFX05PTkU7CisgICAgc3A8RGV2aWNlRGVzY3JpcHRvcj4gZGV2aWNlOwogCiAgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwogICAgIGlmIChpbmRleCA+PSAwKSB7CiAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7Ci0gICAgICAgIGlmIChwYXRjaERlc2MtPm1VaWQgIT0gbVVpZENhY2hlZCkgewotICAgICAgICAgICAgQUxPR1YoImdldE5ld0lucHV0RGV2aWNlKCkgZGV2aWNlICUwOHggZm9yY2VkIGJ5IHBhdGNoICVkIiwKLSAgICAgICAgICAgICAgICAgIGlucHV0RGVzYy0+bURldmljZSwgaW5wdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKLSAgICAgICAgICAgIHJldHVybiBpbnB1dERlc2MtPm1EZXZpY2U7CisgICAgICAgIGlmIChwYXRjaERlc2MtPmdldFVpZCgpICE9IG1VaWRDYWNoZWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCJnZXROZXdJbnB1dERldmljZSgpIGRldmljZSAlcyBmb3JjZWQgYnkgcGF0Y2ggJWQiLAorICAgICAgICAgICAgICAgICAgaW5wdXREZXNjLT5nZXREZXZpY2UoKS0+dG9TdHJpbmcoKS5jX3N0cigpLCBpbnB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOworICAgICAgICAgICAgcmV0dXJuIGlucHV0RGVzYy0+Z2V0RGV2aWNlKCk7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBJZiB3ZSBhcmUgbm90IGluIGNhbGwgYW5kIG5vIGNsaWVudCBpcyBhY3RpdmUgb24gdGhpcyBpbnB1dCwgdGhpcyBtZXRob2RzIHJldHVybnMKLSAgICAvLyBBVURJT19ERVZJQ0VfTk9ORSwgY2F1c2luZyB0aGUgcGF0Y2ggb24gdGhlIGlucHV0IHN0cmVhbSB0byBiZSByZWxlYXNlZC4KLSAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSBpbnB1dERlc2MtPmdldEhpZ2hlc3RQcmlvcml0eVNvdXJjZSh0cnVlIC8qYWN0aXZlT25seSovKTsKLSAgICBpZiAoc291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUICYmIGlzSW5DYWxsKCkpIHsKLSAgICAgICAgc291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT047CisgICAgLy8gSG9ub3IgZXhwbGljaXQgcm91dGluZyByZXF1ZXN0cyBvbmx5IGlmIG5vIGNsaWVudCB1c2luZyBkZWZhdWx0IHJvdXRpbmcgaXMgYWN0aXZlIG9uIHRoaXMKKyAgICAvLyBpbnB1dDogYSBzcGVjaWZpYyBhcHAgY2FuIG5vdCBmb3JjZSByb3V0aW5nIGZvciBvdGhlciBhcHBzIGJ5IHNldHRpbmcgYSBwcmVmZXJyZWQgZGV2aWNlLgorICAgIGJvb2wgYWN0aXZlOworICAgIGRldmljZSA9IGZpbmRQcmVmZXJyZWREZXZpY2UoaW5wdXREZXNjLCBBVURJT19TT1VSQ0VfREVGQVVMVCwgYWN0aXZlLCBtQXZhaWxhYmxlSW5wdXREZXZpY2VzKTsKKyAgICBpZiAoZGV2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGRldmljZTsKICAgICB9Ci0gICAgaWYgKHNvdXJjZSAhPSBBVURJT19TT1VSQ0VfREVGQVVMVCkgewotICAgICAgICBkZXZpY2UgPSBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShzb3VyY2UpOworCisgICAgLy8gSWYgd2UgYXJlIG5vdCBpbiBjYWxsIGFuZCBubyBjbGllbnQgaXMgYWN0aXZlIG9uIHRoaXMgaW5wdXQsIHRoaXMgbWV0aG9kcyByZXR1cm5zCisgICAgLy8gYSBudWxsIHNwPD4sIGNhdXNpbmcgdGhlIHBhdGNoIG9uIHRoZSBpbnB1dCBzdHJlYW0gdG8gYmUgcmVsZWFzZWQuCisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSBpbnB1dERlc2MtPmdldEhpZ2hlc3RQcmlvcml0eUF0dHJpYnV0ZXMoKTsKKyAgICBpZiAoYXR0cmlidXRlcy5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0RFRkFVTFQgJiYgaXNJbkNhbGwoKSkgeworICAgICAgICBhdHRyaWJ1dGVzLnNvdXJjZSA9IEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OOworICAgIH0KKyAgICBpZiAoYXR0cmlidXRlcy5zb3VyY2UgIT0gQVVESU9fU09VUkNFX0RFRkFVTFQpIHsKKyAgICAgICAgZGV2aWNlID0gbUVuZ2luZS0+Z2V0SW5wdXREZXZpY2VGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpOwogICAgIH0KIAogICAgIHJldHVybiBkZXZpY2U7CkBAIC00OTY5LDY1ICs1MzMyLDUxIEBACiAgICAgcmV0dXJuIChzdHJlYW0xID09IHN0cmVhbTIpOwogfQogCi11aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7Ci0gICAgcmV0dXJuICh1aW50MzJfdClnZXRTdHJhdGVneShzdHJlYW0pOwotfQotCiBhdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VzRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSB7CiAgICAgLy8gQnkgY2hlY2tpbmcgdGhlIHJhbmdlIG9mIHN0cmVhbSBiZWZvcmUgY2FsbGluZyBnZXRTdHJhdGVneSwgd2UgYXZvaWQKLSAgICAvLyBnZXRTdHJhdGVneSdzIGJlaGF2aW9yIGZvciBpbnZhbGlkIHN0cmVhbXMuICBnZXRTdHJhdGVneSB3b3VsZCBkbyBhIEFMT0dFCi0gICAgLy8gYW5kIHRoZW4gcmV0dXJuIFNUUkFURUdZX01FRElBLCBidXQgd2Ugd2FudCB0byByZXR1cm4gdGhlIGVtcHR5IHNldC4KLSAgICBpZiAoc3RyZWFtIDwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpIDAgfHwgc3RyZWFtID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7CisgICAgLy8gZ2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbSdzIGJlaGF2aW9yIGZvciBpbnZhbGlkIHN0cmVhbXMuCisgICAgLy8gZW5naW5lJ3MgZ2V0T3V0cHV0RGV2aWNlc0ZvclN0cmVhbSB3b3VsZCBmYWxsYmFjayBvbiBpdHMgZGVmYXVsdCBiZWhhdmlvciAobW9zdCBwcm9iYWJseQorICAgIC8vIGRldmljZSBmb3IgbXVzaWMgc3RyZWFtKSwgYnV0IHdlIHdhbnQgdG8gcmV0dXJuIHRoZSBlbXB0eSBzZXQuCisgICAgaWYgKHN0cmVhbSA8IEFVRElPX1NUUkVBTV9NSU4gfHwgc3RyZWFtID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7CiAgICAgICAgIHJldHVybiBBVURJT19ERVZJQ0VfTk9ORTsKICAgICB9Ci0gICAgYXVkaW9fZGV2aWNlc190IGRldmljZXMgPSBBVURJT19ERVZJQ0VfTk9ORTsKLSAgICBmb3IgKGludCBjdXJTdHJlYW0gPSAwOyBjdXJTdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IGN1clN0cmVhbSsrKSB7Ci0gICAgICAgIGlmICghc3RyZWFtc01hdGNoRm9ydm9sdW1lKHN0cmVhbSwgKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKSkgeworICAgIERldmljZVZlY3RvciBhY3RpdmVEZXZpY2VzOworICAgIERldmljZVZlY3RvciBkZXZpY2VzOworICAgIGZvciAoYXVkaW9fc3RyZWFtX3R5cGVfdCBjdXJTdHJlYW0gPSBBVURJT19TVFJFQU1fTUlOOyBjdXJTdHJlYW0gPCBBVURJT19TVFJFQU1fUFVCTElDX0NOVDsKKyAgICAgICAgIGN1clN0cmVhbSA9IChhdWRpb19zdHJlYW1fdHlwZV90KSAoY3VyU3RyZWFtICsgMSkpIHsKKyAgICAgICAgaWYgKCFzdHJlYW1zTWF0Y2hGb3J2b2x1bWUoc3RyZWFtLCBjdXJTdHJlYW0pKSB7CiAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGN1clN0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpY3VyU3RyZWFtKTsKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGN1ckRldmljZXMgPQotICAgICAgICAgICAgICAgIGdldERldmljZUZvclN0cmF0ZWd5KChyb3V0aW5nX3N0cmF0ZWd5KWN1clN0cmF0ZWd5LCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgZm9yIChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQgOiBnZXRPdXRwdXRzRm9yRGV2aWNlKGN1ckRldmljZXMsIG1PdXRwdXRzKSkgeworICAgICAgICBEZXZpY2VWZWN0b3IgY3VyRGV2aWNlcyA9IG1FbmdpbmUtPmdldE91dHB1dERldmljZXNGb3JTdHJlYW0oY3VyU3RyZWFtLCBmYWxzZS8qZnJvbUNhY2hlKi8pOworICAgICAgICBkZXZpY2VzLm1lcmdlKGN1ckRldmljZXMpOworICAgICAgICBmb3IgKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA6IGdldE91dHB1dHNGb3JEZXZpY2VzKGN1ckRldmljZXMsIG1PdXRwdXRzKSkgewogICAgICAgICAgICAgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBvdXRwdXREZXNjID0gbU91dHB1dHMudmFsdWVGb3Iob3V0cHV0KTsKLSAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdCljdXJTdHJlYW0pKSB7Ci0gICAgICAgICAgICAgICAgY3VyRGV2aWNlcyB8PSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSh0b1ZvbHVtZVNvdXJjZShjdXJTdHJlYW0pKSkgeworICAgICAgICAgICAgICAgIGFjdGl2ZURldmljZXMubWVyZ2Uob3V0cHV0RGVzYy0+ZGV2aWNlcygpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBkZXZpY2VzIHw9IGN1ckRldmljZXM7CiAgICAgfQogCisgICAgLy8gRmF2b3IgZGV2aWNlcyBzZWxlY3RlZCBvbiBhY3RpdmUgc3RyZWFtcyBpZiBhbnkgdG8gcmVwb3J0IGNvcnJlY3QgZGV2aWNlIGluIGNhc2Ugb2YKKyAgICAvLyBleHBsaWNpdCBkZXZpY2Ugc2VsZWN0aW9uCisgICAgaWYgKCFhY3RpdmVEZXZpY2VzLmlzRW1wdHkoKSkgeworICAgICAgICBkZXZpY2VzID0gYWN0aXZlRGV2aWNlczsKKyAgICB9CiAgICAgLypGaWx0ZXIgU1BFQUtFUl9TQUZFIG91dCBvZiByZXN1bHRzLCBhcyBBdWRpb1NlcnZpY2UgZG9lc24ndCBrbm93IGFib3V0IGl0CiAgICAgICBhbmQgZG9lc24ndCByZWFsbHkgbmVlZCB0by4qLwotICAgIGlmIChkZXZpY2VzICYgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSX1NBRkUpIHsKLSAgICAgICAgZGV2aWNlcyB8PSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVI7Ci0gICAgICAgIGRldmljZXMgJj0gfkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUl9TQUZFOworICAgIERldmljZVZlY3RvciBzcGVha2VyU2FmZURldmljZXMgPSBkZXZpY2VzLmdldERldmljZXNGcm9tVHlwZShBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVJfU0FGRSk7CisgICAgaWYgKCFzcGVha2VyU2FmZURldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIGRldmljZXMubWVyZ2UobUF2YWlsYWJsZU91dHB1dERldmljZXMuZ2V0RGV2aWNlc0Zyb21UeXBlKEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikpOworICAgICAgICBkZXZpY2VzLnJlbW92ZShzcGVha2VyU2FmZURldmljZXMpOwogICAgIH0KLSAgICByZXR1cm4gZGV2aWNlczsKLX0KLQotcm91dGluZ19zdHJhdGVneSBBdWRpb1BvbGljeU1hbmFnZXI6OmdldFN0cmF0ZWd5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdAotewotICAgIEFMT0dfQVNTRVJUKHN0cmVhbSAhPSBBVURJT19TVFJFQU1fUEFUQ0gsImdldFN0cmF0ZWd5KCkgY2FsbGVkIGZvciBBVURJT19TVFJFQU1fUEFUQ0giKTsKLSAgICByZXR1cm4gbUVuZ2luZS0+Z2V0U3RyYXRlZ3lGb3JTdHJlYW0oc3RyZWFtKTsKLX0KLQotdWludDMyX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRTdHJhdGVneUZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyKSB7Ci0gICAgLy8gZmxhZ3MgdG8gc3RyYXRlZ3kgbWFwcGluZwotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0JFQUNPTikgPT0gQVVESU9fRkxBR19CRUFDT04pIHsKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfVFJBTlNNSVRURURfVEhST1VHSF9TUEVBS0VSOwotICAgIH0KLSAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19BVURJQklMSVRZX0VORk9SQ0VEKSA9PSBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpIHsKLSAgICAgICAgcmV0dXJuICh1aW50MzJfdCkgU1RSQVRFR1lfRU5GT1JDRURfQVVESUJMRTsKLSAgICB9Ci0gICAgLy8gdXNhZ2UgdG8gc3RyYXRlZ3kgbWFwcGluZwotICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4obUVuZ2luZS0+Z2V0U3RyYXRlZ3lGb3JVc2FnZShhdHRyLT51c2FnZSkpOworICAgIC8vIEZJWE1FOiB1c2UgRGV2aWNlVHlwZVNldCB3aGVuIEphdmEgbGF5ZXIgaXMgcmVhZHkgZm9yIGl0LgorICAgIHJldHVybiBkZXZpY2VUeXBlc1RvQml0TWFzayhkZXZpY2VzLnR5cGVzKCkpOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6aGFuZGxlTm90aWZpY2F0aW9uUm91dGluZ0ZvclN0cmVhbShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkgewogICAgIHN3aXRjaChzdHJlYW0pIHsKICAgICBjYXNlIEFVRElPX1NUUkVBTV9NVVNJQzoKLSAgICAgICAgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShTVFJBVEVHWV9TT05JRklDQVRJT05fUkVTUEVDVEZVTCk7CisgICAgICAgIGNoZWNrT3V0cHV0Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzX2luaXRpYWxpemVyKEFVRElPX1VTQUdFX05PVElGSUNBVElPTikpOwogICAgICAgICB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOwogICAgICAgICBicmVhazsKICAgICBkZWZhdWx0OgpAQCAtNTA3OCwxMSArNTQyNywxMCBAQAogICAgICAgICAvLyBtdXRlL3VubXV0ZSBBVURJT19TVFJFQU1fVFRTIG9uIGFsbCBvdXRwdXRzCiAgICAgICAgIEFMT0dWKCJcdCBtdXRpbmcgJWQiLCBtdXRlKTsKICAgICAgICAgdWludDMyX3QgbWF4TGF0ZW5jeSA9IDA7CisgICAgICAgIGF1dG8gdHRzVm9sdW1lU291cmNlID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1RUUyk7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgICAgIHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiBkZXNjID0gbU91dHB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgIHNldFN0cmVhbU11dGUoQVVESU9fU1RSRUFNX1RUUywgbXV0ZS8qb24qLywKLSAgICAgICAgICAgICAgICAgICAgZGVzYywKLSAgICAgICAgICAgICAgICAgICAgMCAvKmRlbGF5Ki8sIEFVRElPX0RFVklDRV9OT05FKTsKKyAgICAgICAgICAgIHNldFZvbHVtZVNvdXJjZU11dGUodHRzVm9sdW1lU291cmNlLCBtdXRlLypvbiovLCBkZXNjLCAwIC8qZGVsYXkqLywgRGV2aWNlVHlwZVNldCgpKTsKICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90IGxhdGVuY3kgPSBkZXNjLT5sYXRlbmN5KCkgKiAyOwogICAgICAgICAgICAgaWYgKGxhdGVuY3kgPiBtYXhMYXRlbmN5KSB7CiAgICAgICAgICAgICAgICAgbWF4TGF0ZW5jeSA9IGxhdGVuY3k7CkBAIC01MDk0LDQwICs1NDQyLDE0IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLWF1ZGlvX2RldmljZXNfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldERldmljZUZvclN0cmF0ZWd5KHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSkKLXsKLSAgICAvLyBDaGVjayBpZiBhbiBleHBsaWNpdCByb3V0aW5nIHJlcXVlc3QgZXhpc3RzIGZvciBhIHN0cmVhbSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlCi0gICAgLy8gc3BlY2lmaWVkIHN0cmF0ZWd5IGFuZCB1c2UgaXQgaW4gcHJpb3JpdHkgb3ZlciBkZWZhdWx0IHJvdXRpbmcgcnVsZXMuCi0gICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBzdHJlYW0rKykgewotICAgICAgICBpZiAoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3Qpc3RyZWFtKSA9PSBzdHJhdGVneSkgewotICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGZvcmNlZERldmljZSA9Ci0gICAgICAgICAgICAgICAgICAgIG1PdXRwdXRSb3V0ZXMuZ2V0QWN0aXZlRGV2aWNlRm9yU3RyZWFtKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgbUF2YWlsYWJsZU91dHB1dERldmljZXMpOwotICAgICAgICAgICAgaWYgKGZvcmNlZERldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmb3JjZWREZXZpY2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoZnJvbUNhY2hlKSB7Ci0gICAgICAgIEFMT0dWVigiZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKSBmcm9tIGNhY2hlIHN0cmF0ZWd5ICVkLCBkZXZpY2UgJXgiLAotICAgICAgICAgICAgICBzdHJhdGVneSwgbURldmljZUZvclN0cmF0ZWd5W3N0cmF0ZWd5XSk7Ci0gICAgICAgIHJldHVybiBtRGV2aWNlRm9yU3RyYXRlZ3lbc3RyYXRlZ3ldOwotICAgIH0KLSAgICByZXR1cm4gbUVuZ2luZS0+Z2V0RGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3kpOwotfQotCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlRGV2aWNlc0FuZE91dHB1dHMoKQogewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgewotICAgICAgICBtRGV2aWNlRm9yU3RyYXRlZ3lbaV0gPSBnZXREZXZpY2VGb3JTdHJhdGVneSgocm91dGluZ19zdHJhdGVneSlpLCBmYWxzZSAvKmZyb21DYWNoZSovKTsKLSAgICB9CisgICAgbUVuZ2luZS0+dXBkYXRlRGV2aWNlU2VsZWN0aW9uQ2FjaGUoKTsKICAgICBtUHJldmlvdXNPdXRwdXRzID0gbU91dHB1dHM7CiB9CiAKIHVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBwcmV2RGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmcHJldkRldmljZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcykKIHsKICAgICAvLyBtdXRlL3VubXV0ZSBzdHJhdGVnaWVzIHVzaW5nIGFuIGluY29tcGF0aWJsZSBkZXZpY2UgY29tYmluYXRpb24KQEAgLTUxMzgsMzQgKzU0NjAsMzYgQEAKICAgICB9CiAKICAgICB1aW50MzJfdCBtdXRlV2FpdE1zID0gMDsKLSAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gb3V0cHV0RGVzYy0+ZGV2aWNlKCk7Ci0gICAgYm9vbCBzaG91bGRNdXRlID0gb3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJiAocG9wY291bnQoZGV2aWNlKSA+PSAyKTsKKyAgICBEZXZpY2VWZWN0b3IgZGV2aWNlcyA9IG91dHB1dERlc2MtPmRldmljZXMoKTsKKyAgICBib29sIHNob3VsZE11dGUgPSBvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmIChkZXZpY2VzLnNpemUoKSA+PSAyKTsKIAotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgTlVNX1NUUkFURUdJRVM7IGkrKykgewotICAgICAgICBhdWRpb19kZXZpY2VzX3QgY3VyRGV2aWNlID0gZ2V0RGV2aWNlRm9yU3RyYXRlZ3koKHJvdXRpbmdfc3RyYXRlZ3kpaSwgZmFsc2UgLypmcm9tQ2FjaGUqLyk7Ci0gICAgICAgIGN1ckRldmljZSA9IGN1ckRldmljZSAmIG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKTsKLSAgICAgICAgYm9vbCBtdXRlID0gc2hvdWxkTXV0ZSAmJiAoY3VyRGV2aWNlICYgZGV2aWNlKSAmJiAoY3VyRGV2aWNlICE9IGRldmljZSk7CisgICAgYXV0byBwcm9kdWN0U3RyYXRlZ2llcyA9IG1FbmdpbmUtPmdldE9yZGVyZWRQcm9kdWN0U3RyYXRlZ2llcygpOworICAgIGZvciAoY29uc3QgYXV0byAmcHJvZHVjdFN0cmF0ZWd5IDogcHJvZHVjdFN0cmF0ZWdpZXMpIHsKKyAgICAgICAgYXV0byBhdHRyaWJ1dGVzID0gbUVuZ2luZS0+Z2V0QWxsQXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneShwcm9kdWN0U3RyYXRlZ3kpLmZyb250KCk7CisgICAgICAgIERldmljZVZlY3RvciBjdXJEZXZpY2VzID0KKyAgICAgICAgICAgICAgICBtRW5naW5lLT5nZXRPdXRwdXREZXZpY2VzRm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBudWxscHRyLCBmYWxzZS8qZnJvbUNhY2hlKi8pOworICAgICAgICBjdXJEZXZpY2VzID0gY3VyRGV2aWNlcy5maWx0ZXIob3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKTsKKyAgICAgICAgYm9vbCBtdXRlID0gc2hvdWxkTXV0ZSAmJiBjdXJEZXZpY2VzLmNvbnRhaW5zQXRMZWFzdE9uZShkZXZpY2VzKSAmJiBjdXJEZXZpY2VzICE9IGRldmljZXM7CiAgICAgICAgIGJvb2wgZG9NdXRlID0gZmFsc2U7CiAKLSAgICAgICAgaWYgKG11dGUgJiYgIW91dHB1dERlc2MtPm1TdHJhdGVneU11dGVkQnlEZXZpY2VbaV0pIHsKKyAgICAgICAgaWYgKG11dGUgJiYgIW91dHB1dERlc2MtPmlzU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlKHByb2R1Y3RTdHJhdGVneSkpIHsKICAgICAgICAgICAgIGRvTXV0ZSA9IHRydWU7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT5tU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldID0gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIGlmICghbXV0ZSAmJiBvdXRwdXREZXNjLT5tU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldKXsKKyAgICAgICAgICAgIG91dHB1dERlc2MtPnNldFN0cmF0ZWd5TXV0ZWRCeURldmljZShwcm9kdWN0U3RyYXRlZ3ksIHRydWUpOworICAgICAgICB9IGVsc2UgaWYgKCFtdXRlICYmIG91dHB1dERlc2MtPmlzU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlKHByb2R1Y3RTdHJhdGVneSkpIHsKICAgICAgICAgICAgIGRvTXV0ZSA9IHRydWU7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT5tU3RyYXRlZ3lNdXRlZEJ5RGV2aWNlW2ldID0gZmFsc2U7CisgICAgICAgICAgICBvdXRwdXREZXNjLT5zZXRTdHJhdGVneU11dGVkQnlEZXZpY2UocHJvZHVjdFN0cmF0ZWd5LCBmYWxzZSk7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGRvTXV0ZSkgewogICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBtT3V0cHV0cy5zaXplKCk7IGorKykgewogICAgICAgICAgICAgICAgIHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gZGVzYyA9IG1PdXRwdXRzLnZhbHVlQXQoaik7CiAgICAgICAgICAgICAgICAgLy8gc2tpcCBvdXRwdXQgaWYgaXQgZG9lcyBub3Qgc2hhcmUgYW55IGRldmljZSB3aXRoIGN1cnJlbnQgb3V0cHV0Ci0gICAgICAgICAgICAgICAgaWYgKChkZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkgJiBvdXRwdXREZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICA9PSBBVURJT19ERVZJQ0VfTk9ORSkgeworICAgICAgICAgICAgICAgIGlmICghZGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpLmNvbnRhaW5zQXRMZWFzdE9uZShvdXRwdXREZXNjLT5zdXBwb3J0ZWREZXZpY2VzKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBTE9HVlYoImNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoKSAlcyBzdHJhdGVneSAlenUgKGN1ckRldmljZSAlMDR4KSIsCi0gICAgICAgICAgICAgICAgICAgICAgbXV0ZSA/ICJtdXRpbmciIDogInVubXV0aW5nIiwgaSwgY3VyRGV2aWNlKTsKLSAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoKHJvdXRpbmdfc3RyYXRlZ3kpaSwgbXV0ZSwgZGVzYywgbXV0ZSA/IDAgOiBkZWxheU1zKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNTdHJhdGVneUFjdGl2ZShkZXNjLCAocm91dGluZ19zdHJhdGVneSlpKSkgeworICAgICAgICAgICAgICAgIEFMT0dWVigiJXMoKSAlcyAoY3VyRGV2aWNlICVzKSIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgICAgIG11dGUgPyAibXV0aW5nIiA6ICJ1bm11dGluZyIsIGN1ckRldmljZXMudG9TdHJpbmcoKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUocHJvZHVjdFN0cmF0ZWd5LCBtdXRlLCBkZXNjLCBtdXRlID8gMCA6IGRlbGF5TXMpOworICAgICAgICAgICAgICAgIGlmIChkZXNjLT5pc1N0cmF0ZWd5QWN0aXZlKHByb2R1Y3RTdHJhdGVneSkpIHsKICAgICAgICAgICAgICAgICAgICAgaWYgKG11dGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBzaG91bGQgbm90IG5lZWQgdG8gZG91YmxlIGxhdGVuY3kgaWYgdm9sdW1lIGNvdWxkIGJlIGFwcGxpZWQKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGltbWVkaWF0ZWx5IGJ5IHRoZSBhdWRpb2ZsaW5nZXIgbWl4ZXIuIFdlIG11c3QgYWNjb3VudCBmb3IgdGhlIGRlbGF5CkBAIC01MTgzLDIyICs1NTA3LDE5IEBACiAKICAgICAvLyB0ZW1wb3JhcnkgbXV0ZSBvdXRwdXQgaWYgZGV2aWNlIHNlbGVjdGlvbiBjaGFuZ2VzIHRvIGF2b2lkIHZvbHVtZSBidXJzdHMgZHVlIHRvCiAgICAgLy8gZGlmZmVyZW50IHBlciBkZXZpY2Ugdm9sdW1lcwotICAgIGlmIChvdXRwdXREZXNjLT5pc0FjdGl2ZSgpICYmIChkZXZpY2UgIT0gcHJldkRldmljZSkpIHsKKyAgICBpZiAob3V0cHV0RGVzYy0+aXNBY3RpdmUoKSAmJiAoZGV2aWNlcyAhPSBwcmV2RGV2aWNlcykpIHsKICAgICAgICAgdWludDMyX3QgdGVtcE11dGVXYWl0TXMgPSBvdXRwdXREZXNjLT5sYXRlbmN5KCkgKiAyOwogICAgICAgICAvLyB0ZW1wb3JhcnkgbXV0ZSBkdXJhdGlvbiBpcyBjb25zZXJ2YXRpdmVseSBzZXQgdG8gNCB0aW1lcyB0aGUgcmVwb3J0ZWQgbGF0ZW5jeQogICAgICAgICB1aW50MzJfdCB0ZW1wTXV0ZUR1cmF0aW9uTXMgPSBvdXRwdXREZXNjLT5sYXRlbmN5KCkgKiA0OwogICAgICAgICBpZiAobXV0ZVdhaXRNcyA8IHRlbXBNdXRlV2FpdE1zKSB7CiAgICAgICAgICAgICBtdXRlV2FpdE1zID0gdGVtcE11dGVXYWl0TXM7CiAgICAgICAgIH0KLQotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IE5VTV9TVFJBVEVHSUVTOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChpc1N0cmF0ZWd5QWN0aXZlKG91dHB1dERlc2MsIChyb3V0aW5nX3N0cmF0ZWd5KWkpKSB7Ci0gICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgd2UgZG8gbm90IHN0YXJ0IHRoZSB0ZW1wb3JhcnkgbXV0ZSBwZXJpb2QgdG9vIGVhcmx5IGluIGNhc2Ugb2YKLSAgICAgICAgICAgICAgICAvLyBkZWxheWVkIGRldmljZSBjaGFuZ2UKLSAgICAgICAgICAgICAgICBzZXRTdHJhdGVneU11dGUoKHJvdXRpbmdfc3RyYXRlZ3kpaSwgdHJ1ZSwgb3V0cHV0RGVzYywgZGVsYXlNcyk7Ci0gICAgICAgICAgICAgICAgc2V0U3RyYXRlZ3lNdXRlKChyb3V0aW5nX3N0cmF0ZWd5KWksIGZhbHNlLCBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zICsgdGVtcE11dGVEdXJhdGlvbk1zLCBkZXZpY2UpOwotICAgICAgICAgICAgfQorICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmFjdGl2ZVZzIDogb3V0cHV0RGVzYy0+Z2V0QWN0aXZlVm9sdW1lU291cmNlcygpKSB7CisgICAgICAgICAgICAvLyBtYWtlIHN1cmUgdGhhdCB3ZSBkbyBub3Qgc3RhcnQgdGhlIHRlbXBvcmFyeSBtdXRlIHBlcmlvZCB0b28gZWFybHkgaW4gY2FzZSBvZgorICAgICAgICAgICAgLy8gZGVsYXllZCBkZXZpY2UgY2hhbmdlCisgICAgICAgICAgICBzZXRWb2x1bWVTb3VyY2VNdXRlKGFjdGl2ZVZzLCB0cnVlLCBvdXRwdXREZXNjLCBkZWxheU1zKTsKKyAgICAgICAgICAgIHNldFZvbHVtZVNvdXJjZU11dGUoYWN0aXZlVnMsIGZhbHNlLCBvdXRwdXREZXNjLCBkZWxheU1zICsgdGVtcE11dGVEdXJhdGlvbk1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLnR5cGVzKCkpOwogICAgICAgICB9CiAgICAgfQogCkBAIC01MjExLDQ2ICs1NTMyLDQ2IEBACiAgICAgcmV0dXJuIDA7CiB9CiAKLXVpbnQzMl90IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0T3V0cHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVxdWlyZXNNdXRlQ2hlY2spCit1aW50MzJfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldE91dHB1dERldmljZXMoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHJlcXVpcmVzTXV0ZUNoZWNrKQogewotICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBkZXZpY2UgJTA0eCBkZWxheU1zICVkIiwgZGV2aWNlLCBkZWxheU1zKTsKLSAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKKyAgICBBTE9HVigiJXMgZGV2aWNlICVzIGRlbGF5TXMgJWQiLCBfX2Z1bmNfXywgZGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksIGRlbGF5TXMpOwogICAgIHVpbnQzMl90IG11dGVXYWl0TXM7CiAKICAgICBpZiAob3V0cHV0RGVzYy0+aXNEdXBsaWNhdGVkKCkpIHsKLSAgICAgICAgbXV0ZVdhaXRNcyA9IHNldE91dHB1dERldmljZShvdXRwdXREZXNjLT5zdWJPdXRwdXQxKCksIGRldmljZSwgZm9yY2UsIGRlbGF5TXMsCi0gICAgICAgICAgICAgICAgbnVsbHB0ciAvKiBwYXRjaEhhbmRsZSAqLywgbnVsbHB0ciAvKiBhZGRyZXNzICovLCByZXF1aXJlc011dGVDaGVjayk7Ci0gICAgICAgIG11dGVXYWl0TXMgKz0gc2V0T3V0cHV0RGV2aWNlKG91dHB1dERlc2MtPnN1Yk91dHB1dDIoKSwgZGV2aWNlLCBmb3JjZSwgZGVsYXlNcywKLSAgICAgICAgICAgICAgICBudWxscHRyIC8qIHBhdGNoSGFuZGxlICovLCBudWxscHRyIC8qIGFkZHJlc3MgKi8sIHJlcXVpcmVzTXV0ZUNoZWNrKTsKKyAgICAgICAgbXV0ZVdhaXRNcyA9IHNldE91dHB1dERldmljZXMob3V0cHV0RGVzYy0+c3ViT3V0cHV0MSgpLCBkZXZpY2VzLCBmb3JjZSwgZGVsYXlNcywKKyAgICAgICAgICAgICAgICBudWxscHRyIC8qIHBhdGNoSGFuZGxlICovLCByZXF1aXJlc011dGVDaGVjayk7CisgICAgICAgIG11dGVXYWl0TXMgKz0gc2V0T3V0cHV0RGV2aWNlcyhvdXRwdXREZXNjLT5zdWJPdXRwdXQyKCksIGRldmljZXMsIGZvcmNlLCBkZWxheU1zLAorICAgICAgICAgICAgICAgIG51bGxwdHIgLyogcGF0Y2hIYW5kbGUgKi8sIHJlcXVpcmVzTXV0ZUNoZWNrKTsKICAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7CiAgICAgfQotICAgIC8vIG5vIG5lZWQgdG8gcHJvY2VlZCBpZiBuZXcgZGV2aWNlIGlzIG5vdCBBVURJT19ERVZJQ0VfTk9ORSBhbmQgbm90IHN1cHBvcnRlZCBieSBjdXJyZW50Ci0gICAgLy8gb3V0cHV0IHByb2ZpbGUKLSAgICBpZiAoKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgJiYKLSAgICAgICAgICAgICgoZGV2aWNlICYgb3V0cHV0RGVzYy0+c3VwcG9ydGVkRGV2aWNlcygpKSA9PSBBVURJT19ERVZJQ0VfTk9ORSkpIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQogCiAgICAgLy8gZmlsdGVyIGRldmljZXMgYWNjb3JkaW5nIHRvIG91dHB1dCBzZWxlY3RlZAotICAgIGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpKGRldmljZSAmIG91dHB1dERlc2MtPnN1cHBvcnRlZERldmljZXMoKSk7CisgICAgRGV2aWNlVmVjdG9yIGZpbHRlcmVkRGV2aWNlcyA9IG91dHB1dERlc2MtPmZpbHRlclN1cHBvcnRlZERldmljZXMoZGV2aWNlcyk7CisgICAgRGV2aWNlVmVjdG9yIHByZXZEZXZpY2VzID0gb3V0cHV0RGVzYy0+ZGV2aWNlcygpOwogCi0gICAgYXVkaW9fZGV2aWNlc190IHByZXZEZXZpY2UgPSBvdXRwdXREZXNjLT5tRGV2aWNlOworICAgIC8vIG5vIG5lZWQgdG8gcHJvY2VlZCBpZiBuZXcgZGV2aWNlIGlzIG5vdCBBVURJT19ERVZJQ0VfTk9ORSBhbmQgbm90IHN1cHBvcnRlZCBieSBjdXJyZW50CisgICAgLy8gb3V0cHV0IHByb2ZpbGUgb3IgaWYgbmV3IGRldmljZSBpcyBub3Qgc3VwcG9ydGVkIEFORCBwcmV2aW91cyBkZXZpY2UocykgaXMoYXJlKSBzdGlsbAorICAgIC8vIGF2YWlsYWJsZSAob3RoZXJ3aXNlIHJlc2V0IGRldmljZSBtdXN0IGJlIGRvbmUgb24gdGhlIG91dHB1dCkKKyAgICBpZiAoIWRldmljZXMuaXNFbXB0eSgpICYmIGZpbHRlcmVkRGV2aWNlcy5pc0VtcHR5KCkgJiYKKyAgICAgICAgICAgICFtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5maWx0ZXIocHJldkRldmljZXMpLmVtcHR5KCkpIHsKKyAgICAgICAgQUxPR1YoIiVzOiB1bnN1cHBvcnRlZCBkZXZpY2UgJXMgZm9yIG91dHB1dCIsIF9fZnVuY19fLCBkZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KIAotICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBwcmV2RGV2aWNlIDB4JTA0eCIsIHByZXZEZXZpY2UpOworICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2VzKCkgcHJldkRldmljZSAlcyIsIHByZXZEZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKLSAgICBpZiAoZGV2aWNlICE9IEFVRElPX0RFVklDRV9OT05FKSB7Ci0gICAgICAgIG91dHB1dERlc2MtPm1EZXZpY2UgPSBkZXZpY2U7CisgICAgaWYgKCFmaWx0ZXJlZERldmljZXMuaXNFbXB0eSgpKSB7CisgICAgICAgIG91dHB1dERlc2MtPnNldERldmljZXMoZmlsdGVyZWREZXZpY2VzKTsKICAgICB9CiAKICAgICAvLyBpZiB0aGUgb3V0cHV0cyBhcmUgbm90IG1hdGVyaWFsbHkgYWN0aXZlLCB0aGVyZSBpcyBubyBuZWVkIHRvIG11dGUuCiAgICAgaWYgKHJlcXVpcmVzTXV0ZUNoZWNrKSB7Ci0gICAgICAgIG11dGVXYWl0TXMgPSBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKG91dHB1dERlc2MsIHByZXZEZXZpY2UsIGRlbGF5TXMpOworICAgICAgICBtdXRlV2FpdE1zID0gY2hlY2tEZXZpY2VNdXRlU3RyYXRlZ2llcyhvdXRwdXREZXNjLCBwcmV2RGV2aWNlcywgZGVsYXlNcyk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgQUxPR1YoIiVzOiBzdXBwcmVzc2luZyBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzIiwgX19mdW5jX18pOwogICAgICAgICBtdXRlV2FpdE1zID0gMDsKQEAgLTUyNjEsODkgKzU1ODIsMzIgQEAKICAgICAvLyAgICAgIE9SIHRoZSByZXF1ZXN0ZWQgZGV2aWNlIGlzIHRoZSBzYW1lIGFzIGN1cnJlbnQgZGV2aWNlCiAgICAgLy8gIEFORCBmb3JjZSBpcyBub3Qgc3BlY2lmaWVkCiAgICAgLy8gIEFORCB0aGUgb3V0cHV0IGlzIGNvbm5lY3RlZCBieSBhIHZhbGlkIGF1ZGlvIHBhdGNoLgotICAgIC8vIERvaW5nIHRoaXMgY2hlY2sgaGVyZSBhbGxvd3MgdGhlIGNhbGxlciB0byBjYWxsIHNldE91dHB1dERldmljZSgpIHdpdGhvdXQgY29uZGl0aW9ucwotICAgIGlmICgoZGV2aWNlID09IEFVRElPX0RFVklDRV9OT05FIHx8IGRldmljZSA9PSBwcmV2RGV2aWNlKSAmJgotICAgICAgICAhZm9yY2UgJiYKLSAgICAgICAgb3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSAhPSAwKSB7Ci0gICAgICAgIEFMT0dWKCJzZXRPdXRwdXREZXZpY2UoKSBzZXR0aW5nIHNhbWUgZGV2aWNlIDB4JTA0eCBvciBudWxsIGRldmljZSIsIGRldmljZSk7CisgICAgLy8gRG9pbmcgdGhpcyBjaGVjayBoZXJlIGFsbG93cyB0aGUgY2FsbGVyIHRvIGNhbGwgc2V0T3V0cHV0RGV2aWNlcygpIHdpdGhvdXQgY29uZGl0aW9ucworICAgIGlmICgoZmlsdGVyZWREZXZpY2VzLmlzRW1wdHkoKSB8fCBmaWx0ZXJlZERldmljZXMgPT0gcHJldkRldmljZXMpICYmCisgICAgICAgICAgICAhZm9yY2UgJiYgb3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSAhPSAwKSB7CisgICAgICAgIEFMT0dWKCIlcyBzZXR0aW5nIHNhbWUgZGV2aWNlICVzIG9yIG51bGwgZGV2aWNlLCBmb3JjZT0lZCwgcGF0Y2ggaGFuZGxlPSVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgIGZpbHRlcmVkRGV2aWNlcy50b1N0cmluZygpLmNfc3RyKCksIGZvcmNlLCBvdXRwdXREZXNjLT5nZXRQYXRjaEhhbmRsZSgpKTsKICAgICAgICAgcmV0dXJuIG11dGVXYWl0TXM7CiAgICAgfQogCi0gICAgQUxPR1YoInNldE91dHB1dERldmljZSgpIGNoYW5naW5nIGRldmljZSIpOworICAgIEFMT0dWKCIlcyBjaGFuZ2luZyBkZXZpY2UgdG8gJXMiLCBfX2Z1bmNfXywgZmlsdGVyZWREZXZpY2VzLnRvU3RyaW5nKCkuY19zdHIoKSk7CiAKICAgICAvLyBkbyB0aGUgcm91dGluZwotICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX05PTkUpIHsKKyAgICBpZiAoZmlsdGVyZWREZXZpY2VzLmlzRW1wdHkoKSkgewogICAgICAgICByZXNldE91dHB1dERldmljZShvdXRwdXREZXNjLCBkZWxheU1zLCBOVUxMKTsKICAgICB9IGVsc2UgewotICAgICAgICBEZXZpY2VWZWN0b3IgZGV2aWNlTGlzdDsKLSAgICAgICAgaWYgKChhZGRyZXNzID09IE5VTEwpIHx8IChzdHJsZW4oYWRkcmVzcykgPT0gMCkpIHsKLSAgICAgICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRldmljZUxpc3QgPSBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGVBZGRyKGRldmljZSwgU3RyaW5nOChhZGRyZXNzKSk7CisgICAgICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CisgICAgICAgIHBhdGNoQnVpbGRlci5hZGRTb3VyY2Uob3V0cHV0RGVzYyk7CisgICAgICAgIEFMT0dfQVNTRVJUKGZpbHRlcmVkRGV2aWNlcy5zaXplKCkgPD0gQVVESU9fUEFUQ0hfUE9SVFNfTUFYLCAiVG9vIG1hbnkgc2luayBwb3J0cyIpOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8gJmZpbHRlcmVkRGV2aWNlIDogZmlsdGVyZWREZXZpY2VzKSB7CisgICAgICAgICAgICBwYXRjaEJ1aWxkZXIuYWRkU2luayhmaWx0ZXJlZERldmljZSk7CiAgICAgICAgIH0KIAotICAgICAgICBpZiAoIWRldmljZUxpc3QuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcGF0Y2ggcGF0Y2g7Ci0gICAgICAgICAgICBvdXRwdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc291cmNlc1swXSk7Ci0gICAgICAgICAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7Ci0gICAgICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAwOwotICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXZpY2VMaXN0LnNpemUoKSAmJiBpIDwgQVVESU9fUEFUQ0hfUE9SVFNfTUFYOyBpKyspIHsKLSAgICAgICAgICAgICAgICBkZXZpY2VMaXN0Lml0ZW1BdChpKS0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNpbmtzW2ldKTsKLSAgICAgICAgICAgICAgICBwYXRjaC5udW1fc2lua3MrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNzaXplX3QgaW5kZXg7Ci0gICAgICAgICAgICBpZiAocGF0Y2hIYW5kbGUgJiYgKnBhdGNoSGFuZGxlICE9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FKSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkoKnBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgaW5kZXggPSBtQXVkaW9QYXRjaGVzLmluZGV4T2ZLZXkob3V0cHV0RGVzYy0+Z2V0UGF0Y2hIYW5kbGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzcDwgQXVkaW9QYXRjaD4gcGF0Y2hEZXNjOwotICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgYWZQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgICAgICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwotICAgICAgICAgICAgICAgIGFmUGF0Y2hIYW5kbGUgPSBwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlNcyk7Ci0gICAgICAgICAgICBBTE9HVigic2V0T3V0cHV0RGV2aWNlKCkgY3JlYXRlQXVkaW9QYXRjaCByZXR1cm5lZCAlZCBwYXRjaEhhbmRsZSAlZCIKLSAgICAgICAgICAgICAgICAgICAgIm51bV9zb3VyY2VzICVkIG51bV9zaW5rcyAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUsIHBhdGNoLm51bV9zb3VyY2VzLCBwYXRjaC5udW1fc2lua3MpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goJnBhdGNoLCBtVWlkQ2FjaGVkKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBwYXRjaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgb3V0cHV0RGVzYy0+c2V0UGF0Y2hIYW5kbGUocGF0Y2hEZXNjLT5tSGFuZGxlKTsKLSAgICAgICAgICAgICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwotICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBpbmZvcm0gYWxsIGlucHV0IGFzIHdlbGwKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtSW5wdXRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4gIGlucHV0RGVzY3JpcHRvciA9IG1JbnB1dHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgIGlmICghaXNfdmlydHVhbF9pbnB1dF9kZXZpY2UoaW5wdXREZXNjcmlwdG9yLT5tRGV2aWNlKSkgewotICAgICAgICAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIGlucHV0Q21kID0gQXVkaW9QYXJhbWV0ZXIoKTsKLSAgICAgICAgICAgICAgICBBTE9HVigiJXM6IGluZm9ybSBpbnB1dCAlZCBvZiBkZXZpY2U6JWQiLCBfX2Z1bmNfXywKLSAgICAgICAgICAgICAgICAgICAgICBpbnB1dERlc2NyaXB0b3ItPm1Jb0hhbmRsZSwgZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBpbnB1dENtZC5hZGRJbnQoU3RyaW5nOChBdWRpb1BhcmFtZXRlcjo6a2V5Um91dGluZyksZGV2aWNlKTsKLSAgICAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhpbnB1dERlc2NyaXB0b3ItPm1Jb0hhbmRsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dENtZC50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGF5TXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGluc3RhbGxQYXRjaChfX2Z1bmNfXywgcGF0Y2hIYW5kbGUsIG91dHB1dERlc2MuZ2V0KCksIHBhdGNoQnVpbGRlci5wYXRjaCgpLCBkZWxheU1zKTsKICAgICB9CiAKICAgICAvLyB1cGRhdGUgc3RyZWFtIHZvbHVtZXMgYWNjb3JkaW5nIHRvIG5ldyBkZXZpY2UKLSAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0RGVzYywgZGV2aWNlLCBkZWxheU1zKTsKKyAgICBhcHBseVN0cmVhbVZvbHVtZXMob3V0cHV0RGVzYywgZmlsdGVyZWREZXZpY2VzLnR5cGVzKCksIGRlbGF5TXMpOwogCiAgICAgcmV0dXJuIG11dGVXYWl0TXM7CiB9CkBAIC01MzYyLDczICs1NjI2LDQwIEBACiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYyA9IG1BdWRpb1BhdGNoZXMudmFsdWVBdChpbmRleCk7Ci0gICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPnJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUFmUGF0Y2hIYW5kbGUsIGRlbGF5TXMpOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPmdldEFmSGFuZGxlKCksIGRlbGF5TXMpOwogICAgIEFMT0dWKCJyZXNldE91dHB1dERldmljZSgpIHJlbGVhc2VBdWRpb1BhdGNoIHJldHVybmVkICVkIiwgc3RhdHVzKTsKICAgICBvdXRwdXREZXNjLT5zZXRQYXRjaEhhbmRsZShBVURJT19QQVRDSF9IQU5ETEVfTk9ORSk7Ci0gICAgcmVtb3ZlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUpOworICAgIHJlbW92ZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5nZXRIYW5kbGUoKSk7CiAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKICAgICBtcENsaWVudEludGVyZmFjZS0+b25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6c2V0SW5wdXREZXZpY2UoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSkKIHsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBOT19FUlJPUjsKIAogICAgIHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiBpbnB1dERlc2MgPSBtSW5wdXRzLnZhbHVlRm9yKGlucHV0KTsKLSAgICBpZiAoKGRldmljZSAhPSBBVURJT19ERVZJQ0VfTk9ORSkgJiYgKChkZXZpY2UgIT0gaW5wdXREZXNjLT5tRGV2aWNlKSB8fCBmb3JjZSkpIHsKLSAgICAgICAgaW5wdXREZXNjLT5tRGV2aWNlID0gZGV2aWNlOworICAgIGlmICgoZGV2aWNlICE9IG51bGxwdHIpICYmICgoZGV2aWNlICE9IGlucHV0RGVzYy0+Z2V0RGV2aWNlKCkpIHx8IGZvcmNlKSkgeworICAgICAgICBpbnB1dERlc2MtPnNldERldmljZShkZXZpY2UpOwogCi0gICAgICAgIERldmljZVZlY3RvciBkZXZpY2VMaXN0ID0gbUF2YWlsYWJsZUlucHV0RGV2aWNlcy5nZXREZXZpY2VzRnJvbVR5cGUoZGV2aWNlKTsKLSAgICAgICAgaWYgKCFkZXZpY2VMaXN0LmlzRW1wdHkoKSkgewotICAgICAgICAgICAgc3RydWN0IGF1ZGlvX3BhdGNoIHBhdGNoOwotICAgICAgICAgICAgaW5wdXREZXNjLT50b0F1ZGlvUG9ydENvbmZpZygmcGF0Y2guc2lua3NbMF0pOworICAgICAgICBpZiAobUF2YWlsYWJsZUlucHV0RGV2aWNlcy5jb250YWlucyhkZXZpY2UpKSB7CisgICAgICAgICAgICBQYXRjaEJ1aWxkZXIgcGF0Y2hCdWlsZGVyOworICAgICAgICAgICAgcGF0Y2hCdWlsZGVyLmFkZFNpbmsoaW5wdXREZXNjLAogICAgICAgICAgICAgLy8gQVVESU9fU09VUkNFX0hPVFdPUkQgaXMgZm9yIGludGVybmFsIHVzZSBvbmx5OgogICAgICAgICAgICAgLy8gaGFuZGxlZCBhcyBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04gYnkgdGhlIGF1ZGlvIEhBTAotICAgICAgICAgICAgaWYgKHBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYKLSAgICAgICAgICAgICAgICAgICAgIWlucHV0RGVzYy0+aXNTb3VuZFRyaWdnZXIoKSkgewotICAgICAgICAgICAgICAgIHBhdGNoLnNpbmtzWzBdLmV4dC5taXgudXNlY2FzZS5zb3VyY2UgPSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT047Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBwYXRjaC5udW1fc2lua3MgPSAxOworICAgICAgICAgICAgICAgICAgICBbaW5wdXREZXNjXShjb25zdCBQYXRjaEJ1aWxkZXI6Om1peF91c2VjYXNlX3QmIHVzZWNhc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gdXNlY2FzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuc291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEICYmICFpbnB1dERlc2MtPmlzU291bmRUcmlnZ2VyKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuc291cmNlID0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsgfSkuCiAgICAgICAgICAgICAvL29ubHkgb25lIGlucHV0IGRldmljZSBmb3Igbm93Ci0gICAgICAgICAgICBkZXZpY2VMaXN0Lml0ZW1BdCgwKS0+dG9BdWRpb1BvcnRDb25maWcoJnBhdGNoLnNvdXJjZXNbMF0pOwotICAgICAgICAgICAgcGF0Y2gubnVtX3NvdXJjZXMgPSAxOwotICAgICAgICAgICAgc3NpemVfdCBpbmRleDsKLSAgICAgICAgICAgIGlmIChwYXRjaEhhbmRsZSAmJiAqcGF0Y2hIYW5kbGUgIT0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUpIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgqcGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleShpbnB1dERlc2MtPmdldFBhdGNoSGFuZGxlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc3A8IEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKLSAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbUF1ZGlvUGF0Y2hlcy52YWx1ZUF0KGluZGV4KTsKLSAgICAgICAgICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbXBDbGllbnRJbnRlcmZhY2UtPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFmUGF0Y2hIYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwKTsKLSAgICAgICAgICAgIEFMT0dWKCJzZXRJbnB1dERldmljZSgpIGNyZWF0ZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMsIGFmUGF0Y2hIYW5kbGUpOwotICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2goJnBhdGNoLCBtVWlkQ2FjaGVkKTsKLSAgICAgICAgICAgICAgICAgICAgYWRkQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYyk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tUGF0Y2ggPSBwYXRjaDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcGF0Y2hEZXNjLT5tQWZQYXRjaEhhbmRsZSA9IGFmUGF0Y2hIYW5kbGU7Ci0gICAgICAgICAgICAgICAgaWYgKHBhdGNoSGFuZGxlKSB7Ci0gICAgICAgICAgICAgICAgICAgICpwYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+bUhhbmRsZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaW5wdXREZXNjLT5zZXRQYXRjaEhhbmRsZShwYXRjaERlc2MtPm1IYW5kbGUpOwotICAgICAgICAgICAgICAgIG5leHRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7Ci0gICAgICAgICAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgYWRkU291cmNlKGRldmljZSk7CisgICAgICAgICAgICBzdGF0dXMgPSBpbnN0YWxsUGF0Y2goX19mdW5jX18sIHBhdGNoSGFuZGxlLCBpbnB1dERlc2MuZ2V0KCksIHBhdGNoQnVpbGRlci5wYXRjaCgpLCAwKTsKICAgICAgICAgfQogICAgIH0KICAgICByZXR1cm4gc3RhdHVzOwpAQCAtNTQ0OCwxNyArNTY3OSwxNiBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIHNwPCBBdWRpb1BhdGNoPiBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOwotICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5yZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1BZlBhdGNoSGFuZGxlLCAwKTsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBtcENsaWVudEludGVyZmFjZS0+cmVsZWFzZUF1ZGlvUGF0Y2gocGF0Y2hEZXNjLT5nZXRBZkhhbmRsZSgpLCAwKTsKICAgICBBTE9HVigicmVzZXRJbnB1dERldmljZSgpIHJlbGVhc2VBdWRpb1BhdGNoIHJldHVybmVkICVkIiwgc3RhdHVzKTsKICAgICBpbnB1dERlc2MtPnNldFBhdGNoSGFuZGxlKEFVRElPX1BBVENIX0hBTkRMRV9OT05FKTsKLSAgICByZW1vdmVBdWRpb1BhdGNoKHBhdGNoRGVzYy0+bUhhbmRsZSk7CisgICAgcmVtb3ZlQXVkaW9QYXRjaChwYXRjaERlc2MtPmdldEhhbmRsZSgpKTsKICAgICBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwogICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5vbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotc3A8SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0UHJvZmlsZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorc3A8SU9Qcm9maWxlPiBBdWRpb1BvbGljeU1hbmFnZXI6OmdldElucHV0UHJvZmlsZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCYgc2FtcGxpbmdSYXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCYgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCYgY2hhbm5lbE1hc2ssCkBAIC01NDc4LDcgKzU3MDgsNyBAQAogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHByb2ZpbGUgOiBod01vZHVsZS0+Z2V0SW5wdXRQcm9maWxlcygpKSB7CiAgICAgICAgICAgICAvLyBwcm9maWxlLT5sb2coKTsKICAgICAgICAgICAgIC8vdXBkYXRlZEZvcm1hdCA9IGZvcm1hdDsKLSAgICAgICAgICAgIGlmIChwcm9maWxlLT5pc0NvbXBhdGlibGVQcm9maWxlKGRldmljZSwgYWRkcmVzcywgc2FtcGxpbmdSYXRlLAorICAgICAgICAgICAgaWYgKHByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoRGV2aWNlVmVjdG9yKGRldmljZSksIHNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzYW1wbGluZ1JhdGUgIC8qdXBkYXRlZFNhbXBsaW5nUmF0ZSovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZvcm1hdCwgICAgICAgLyp1cGRhdGVkRm9ybWF0Ki8KQEAgLTU0ODksNyArNTcxOSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlIC8qZXhhY3RNYXRjaFJlcXVpcmVkRm9ySW5wdXRGbGFncyovKSkgewogICAgICAgICAgICAgICAgIHJldHVybiBwcm9maWxlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGZpcnN0SW5leGFjdCA9PSBudWxscHRyICYmIHByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoZGV2aWNlLCBhZGRyZXNzLAorICAgICAgICAgICAgaWYgKGZpcnN0SW5leGFjdCA9PSBudWxscHRyICYmIHByb2ZpbGUtPmlzQ29tcGF0aWJsZVByb2ZpbGUoRGV2aWNlVmVjdG9yKGRldmljZSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXBkYXRlZFNhbXBsaW5nUmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwKQEAgLTU1MTMsODMgKzU3NDMsNjMgQEAKICAgICByZXR1cm4gTlVMTDsKIH0KIAotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvTWl4ICoqcG9saWN5TWl4KQotewotICAgIGF1ZGlvX2RldmljZXNfdCBhdmFpbGFibGVEZXZpY2VUeXBlcyA9IG1BdmFpbGFibGVJbnB1dERldmljZXMudHlwZXMoKSAmIH5BVURJT19ERVZJQ0VfQklUX0lOOwotICAgIGF1ZGlvX2RldmljZXNfdCBzZWxlY3RlZERldmljZUZyb21NaXggPQotICAgICAgICAgICBtUG9saWN5TWl4ZXMuZ2V0RGV2aWNlQW5kTWl4Rm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UsIGF2YWlsYWJsZURldmljZVR5cGVzLCBwb2xpY3lNaXgpOwotCi0gICAgaWYgKHNlbGVjdGVkRGV2aWNlRnJvbU1peCAhPSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICByZXR1cm4gc2VsZWN0ZWREZXZpY2VGcm9tTWl4OwotICAgIH0KLSAgICByZXR1cm4gZ2V0RGV2aWNlRm9ySW5wdXRTb3VyY2UoaW5wdXRTb3VyY2UpOwotfQotCi1hdWRpb19kZXZpY2VzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSkKLXsKLSAgICAvLyBSb3V0aW5nCi0gICAgLy8gU2NhbiB0aGUgd2hvbGUgUm91dGVNYXAgdG8gc2VlIGlmIHdlIGhhdmUgYW4gZXhwbGljaXQgcm91dGU6Ci0gICAgLy8gaWYgdGhlIGlucHV0IHNvdXJjZSBpbiB0aGUgUm91dGVNYXAgaXMgdGhlIHNhbWUgYXMgdGhlIGFyZ3VtZW50IGFib3ZlLAotICAgIC8vIGFuZCBhY3Rpdml0eSBjb3VudCBpcyBub24temVybyBhbmQgdGhlIGRldmljZSBpbiB0aGUgcm91dGUgZGVzY3JpcHRvciBpcyBhdmFpbGFibGUKLSAgICAvLyB0aGVuIHNlbGVjdCB0aGlzIGRldmljZS4KLSAgICBmb3IgKHNpemVfdCByb3V0ZUluZGV4ID0gMDsgcm91dGVJbmRleCA8IG1JbnB1dFJvdXRlcy5zaXplKCk7IHJvdXRlSW5kZXgrKykgewotICAgICAgICAgc3A8U2Vzc2lvblJvdXRlPiByb3V0ZSA9IG1JbnB1dFJvdXRlcy52YWx1ZUF0KHJvdXRlSW5kZXgpOwotICAgICAgICAgaWYgKChpbnB1dFNvdXJjZSA9PSByb3V0ZS0+bVNvdXJjZSkgJiYgcm91dGUtPmlzQWN0aXZlT3JDaGFuZ2VkKCkgJiYKLSAgICAgICAgICAgICAgICAgKG1BdmFpbGFibGVJbnB1dERldmljZXMuaW5kZXhPZihyb3V0ZS0+bURldmljZURlc2NyaXB0b3IpID49IDApKSB7Ci0gICAgICAgICAgICAgcmV0dXJuIHJvdXRlLT5tRGV2aWNlRGVzY3JpcHRvci0+dHlwZSgpOwotICAgICAgICAgfQotICAgICB9Ci0KLSAgICAgcmV0dXJuIG1FbmdpbmUtPmdldERldmljZUZvcklucHV0U291cmNlKGlucHV0U291cmNlKTsKLX0KLQotZmxvYXQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb21wdXRlVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorZmxvYXQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjb21wdXRlVm9sdW1lKElWb2x1bWVDdXJ2ZXMgJmN1cnZlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWb2x1bWVTb3VyY2Ugdm9sdW1lU291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzKQogewotICAgIGZsb2F0IHZvbHVtZURCID0gbVZvbHVtZUN1cnZlcy0+dm9sSW5kZXhUb0RiKHN0cmVhbSwgVm9sdW1lOjpnZXREZXZpY2VDYXRlZ29yeShkZXZpY2UpLCBpbmRleCk7CisgICAgZmxvYXQgdm9sdW1lRGIgPSBjdXJ2ZXMudm9sSW5kZXhUb0RiKFZvbHVtZTo6Z2V0RGV2aWNlQ2F0ZWdvcnkoZGV2aWNlVHlwZXMpLCBpbmRleCk7CiAKICAgICAvLyBoYW5kbGUgdGhlIGNhc2Ugb2YgYWNjZXNzaWJpbGl0eSBhY3RpdmUgd2hpbGUgYSByaW5ndG9uZSBpcyBwbGF5aW5nOiBpZiB0aGUgcmluZ3RvbmUgaXMgbXVjaAogICAgIC8vIGxvdWRlciB0aGFuIHRoZSBhY2Nlc3NpYmlsaXR5IHByb21wdCwgdGhlIHByb21wdCBjYW5ub3QgYmUgaGVhcmQsIHRodXMgbWFza2luZyB0aGUgdG91Y2gKICAgICAvLyBleHBsb3JhdGlvbiBvZiB0aGUgZGlhbGVyIFVJLiBJbiB0aGlzIHNpdHVhdGlvbiwgYnJpbmcgdGhlIGFjY2Vzc2liaWxpdHkgdm9sdW1lIGNsb3NlciB0bwogICAgIC8vIHRoZSByaW5ndG9uZSB2b2x1bWUKLSAgICBpZiAoKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWSkKLSAgICAgICAgICAgICYmIChBVURJT19NT0RFX1JJTkdUT05FID09IG1FbmdpbmUtPmdldFBob25lU3RhdGUoKSkKLSAgICAgICAgICAgICYmIGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9SSU5HLCAwKSkgewotICAgICAgICBjb25zdCBmbG9hdCByaW5nVm9sdW1lREIgPSBjb21wdXRlVm9sdW1lKEFVRElPX1NUUkVBTV9SSU5HLCBpbmRleCwgZGV2aWNlKTsKLSAgICAgICAgcmV0dXJuIHJpbmdWb2x1bWVEQiAtIDQgPiB2b2x1bWVEQiA/IHJpbmdWb2x1bWVEQiAtIDQgOiB2b2x1bWVEQjsKKyAgICBjb25zdCBhdXRvIGNhbGxWb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCk7CisgICAgY29uc3QgYXV0byByaW5nVm9sdW1lU3JjID0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1JJTkcpOworICAgIGNvbnN0IGF1dG8gbXVzaWNWb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fTVVTSUMpOworICAgIGNvbnN0IGF1dG8gYWxhcm1Wb2x1bWVTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQUxBUk0pOworICAgIGNvbnN0IGF1dG8gYTExeVZvbHVtZVNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9BQ0NFU1NJQklMSVRZKTsKKworICAgIGlmICh2b2x1bWVTb3VyY2UgPT0gYTExeVZvbHVtZVNyYworICAgICAgICAgICAgJiYgKEFVRElPX01PREVfUklOR1RPTkUgPT0gbUVuZ2luZS0+Z2V0UGhvbmVTdGF0ZSgpKSAmJgorICAgICAgICAgICAgbU91dHB1dHMuaXNBY3RpdmUocmluZ1ZvbHVtZVNyYywgMCkpIHsKKyAgICAgICAgYXV0byAmcmluZ0N1cnZlcyA9IGdldFZvbHVtZUN1cnZlcyhBVURJT19TVFJFQU1fUklORyk7CisgICAgICAgIGNvbnN0IGZsb2F0IHJpbmdWb2x1bWVEYiA9IGNvbXB1dGVWb2x1bWUocmluZ0N1cnZlcywgcmluZ1ZvbHVtZVNyYywgaW5kZXgsIGRldmljZVR5cGVzKTsKKyAgICAgICAgcmV0dXJuIHJpbmdWb2x1bWVEYiAtIDQgPiB2b2x1bWVEYiA/IHJpbmdWb2x1bWVEYiAtIDQgOiB2b2x1bWVEYjsKICAgICB9CiAKLSAgICAvLyBpbi1jYWxsOiBhbHdheXMgY2FwIGVhcnBpZWNlIHZvbHVtZSBieSB2b2ljZSB2b2x1bWUgKyBzb21lIGxvdyBoZWFkcm9vbQotICAgIGlmICgoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSAmJiAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSkgJiYKLSAgICAgICAgICAgIChpc0luQ2FsbCgpIHx8IG1PdXRwdXRzLmlzU3RyZWFtQWN0aXZlTG9jYWxseShBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCkpKSB7Ci0gICAgICAgIHN3aXRjaCAoc3RyZWFtKSB7Ci0gICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX1NZU1RFTToKLSAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fUklORzoKLSAgICAgICAgY2FzZSBBVURJT19TVFJFQU1fTVVTSUM6Ci0gICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0FMQVJNOgotICAgICAgICBjYXNlIEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT046Ci0gICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU6Ci0gICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0RUTUY6Ci0gICAgICAgIGNhc2UgQVVESU9fU1RSRUFNX0FDQ0VTU0lCSUxJVFk6IHsKLSAgICAgICAgICAgIGludCB2b2ljZVZvbHVtZUluZGV4ID0KLSAgICAgICAgICAgICAgICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleChBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCwgQVVESU9fREVWSUNFX09VVF9FQVJQSUVDRSk7Ci0gICAgICAgICAgICBjb25zdCBmbG9hdCBtYXhWb2ljZVZvbERiID0KLSAgICAgICAgICAgICAgICBjb21wdXRlVm9sdW1lKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCB2b2ljZVZvbHVtZUluZGV4LCBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFKQorICAgIC8vIGluLWNhbGw6IGFsd2F5cyBjYXAgdm9sdW1lIGJ5IHZvaWNlIHZvbHVtZSArIHNvbWUgbG93IGhlYWRyb29tCisgICAgaWYgKCh2b2x1bWVTb3VyY2UgIT0gY2FsbFZvbHVtZVNyYyAmJiAoaXNJbkNhbGwoKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1PdXRwdXRzLmlzQWN0aXZlTG9jYWxseShjYWxsVm9sdW1lU3JjKSkpICYmCisgICAgICAgICAgICAodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9TWVNURU0pIHx8CisgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHJpbmdWb2x1bWVTcmMgfHwgdm9sdW1lU291cmNlID09IG11c2ljVm9sdW1lU3JjIHx8CisgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IGFsYXJtVm9sdW1lU3JjIHx8CisgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04pIHx8CisgICAgICAgICAgICAgdm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSB8fAorICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSA9PSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fRFRNRikgfHwKKyAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gYTExeVZvbHVtZVNyYykpIHsKKyAgICAgICAgYXV0byAmdm9pY2VDdXJ2ZXMgPSBnZXRWb2x1bWVDdXJ2ZXMoY2FsbFZvbHVtZVNyYyk7CisgICAgICAgIGludCB2b2ljZVZvbHVtZUluZGV4ID0gdm9pY2VDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlVHlwZXMpOworICAgICAgICBjb25zdCBmbG9hdCBtYXhWb2ljZVZvbERiID0KKyAgICAgICAgICAgICAgICBjb21wdXRlVm9sdW1lKHZvaWNlQ3VydmVzLCBjYWxsVm9sdW1lU3JjLCB2b2ljZVZvbHVtZUluZGV4LCBkZXZpY2VUeXBlcykKICAgICAgICAgICAgICAgICArIElOX0NBTExfRUFSUElFQ0VfSEVBRFJPT01fREI7Ci0gICAgICAgICAgICBpZiAodm9sdW1lREIgPiBtYXhWb2ljZVZvbERiKSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNvbXB1dGVWb2x1bWUoKSBzdHJlYW0gJWQgYXQgdm9sPSVmIG92ZXJyaWRlbiBieSBzdHJlYW0gJWQgYXQgdm9sPSVmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbSwgdm9sdW1lREIsIEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMLCBtYXhWb2ljZVZvbERiKTsKLSAgICAgICAgICAgICAgICB2b2x1bWVEQiA9IG1heFZvaWNlVm9sRGI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIEZJWE1FOiBXb3JrYXJvdW5kIGZvciBjYWxsIHNjcmVlbmluZyBhcHBsaWNhdGlvbnMgdW50aWwgYSBwcm9wZXIgYXVkaW8gbW9kZSBpcyBkZWZpbmVkCisgICAgICAgIC8vIHRvIHN1cHBvcnQgdGhpcyBzY2VuYXJpbyA6IEV4ZW1wdCB0aGUgUklORyBzdHJlYW0gZnJvbSB0aGUgYXVkaW8gY2FwIGlmIHRoZSBhdWRpbyB3YXMKKyAgICAgICAgLy8gcHJvZ3JhbW1hdGljYWxseSBtdXRlZC4KKyAgICAgICAgLy8gVk9JQ0VfQ0FMTCBzdHJlYW0gaGFzIG1pblZvbHVtZUluZGV4ID4gMCA6IFVzZXJzIGNhbm5vdCBzZXQgdGhlIHZvbHVtZSBvZiB2b2ljZSBjYWxscyB0bworICAgICAgICAvLyAwLiBXZSBkb24ndCB3YW50IHRvIGNhcCB2b2x1bWUgd2hlbiB0aGUgc3lzdGVtIGhhcyBwcm9ncmFtbWF0aWNhbGx5IG11dGVkIHRoZSB2b2ljZSBjYWxsCisgICAgICAgIC8vIHN0cmVhbS4gU2VlIHNldFZvbHVtZUN1cnZlSW5kZXgoKSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgYm9vbCBleGVtcHRGcm9tQ2FwcGluZyA9CisgICAgICAgICAgICAgICAgKCh2b2x1bWVTb3VyY2UgPT0gcmluZ1ZvbHVtZVNyYykgfHwgKHZvbHVtZVNvdXJjZSA9PSBhMTF5Vm9sdW1lU3JjKSkKKyAgICAgICAgICAgICAgICAmJiAodm9pY2VWb2x1bWVJbmRleCA9PSAwKTsKKyAgICAgICAgQUxPR1ZfSUYoZXhlbXB0RnJvbUNhcHBpbmcsICIlcyB2b2x1bWUgc291cmNlICVkIGF0IHZvbD0lZiBub3QgY2FwcGVkIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSwgdm9sdW1lRGIpOworICAgICAgICBpZiAoKHZvbHVtZURiID4gbWF4Vm9pY2VWb2xEYikgJiYgIWV4ZW1wdEZyb21DYXBwaW5nKSB7CisgICAgICAgICAgICBBTE9HVigiJXMgdm9sdW1lIHNvdXJjZSAlZCBhdCB2b2w9JWYgb3ZlcnJpZGVuIGJ5IHZvbHVtZSBncm91cCAlZCBhdCB2b2w9JWYiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgICAgIHZvbHVtZVNvdXJjZSwgdm9sdW1lRGIsIGNhbGxWb2x1bWVTcmMsIG1heFZvaWNlVm9sRGIpOworICAgICAgICAgICAgdm9sdW1lRGIgPSBtYXhWb2ljZVZvbERiOwogICAgICAgICB9CiAgICAgfQotCiAgICAgLy8gaWYgYSBoZWFkc2V0IGlzIGNvbm5lY3RlZCwgYXBwbHkgdGhlIGZvbGxvd2luZyBydWxlcyB0byByaW5nIHRvbmVzIGFuZCBub3RpZmljYXRpb25zCiAgICAgLy8gdG8gYXZvaWQgc291bmQgbGV2ZWwgYnVyc3RzIGluIHVzZXIncyBlYXJzOgogICAgIC8vIC0gYWx3YXlzIGF0dGVudWF0ZSBub3RpZmljYXRpb25zIHZvbHVtZSBieSA2ZEIKQEAgLTU1OTcsMjgzICs1ODA3LDIyMSBAQAogICAgIC8vIHNwZWFrZXIgaXMgcGFydCBvZiB0aGUgc2VsZWN0IGRldmljZXMKICAgICAvLyAtIGlmIG11c2ljIGlzIHBsYXlpbmcsIGFsd2F5cyBsaW1pdCB0aGUgdm9sdW1lIHRvIGN1cnJlbnQgbXVzaWMgdm9sdW1lLAogICAgIC8vIHdpdGggYSBtaW5pbXVtIHRocmVzaG9sZCBhdCAtMzZkQiBzbyB0aGF0IG5vdGlmaWNhdGlvbiBpcyBhbHdheXMgcGVyY2VpdmVkLgotICAgIGNvbnN0IHJvdXRpbmdfc3RyYXRlZ3kgc3RyZWFtX3N0cmF0ZWd5ID0gZ2V0U3RyYXRlZ3koc3RyZWFtKTsKLSAgICBpZiAoKGRldmljZSAmIChBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9BMkRQIHwKLSAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUyB8Ci0gICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQgfAotICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9XSVJFRF9IRUFEUEhPTkUgfAotICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9VU0JfSEVBRFNFVCB8Ci0gICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0hFQVJJTkdfQUlEKSkgJiYKLSAgICAgICAgKChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OKQotICAgICAgICAgICAgICAgIHx8IChzdHJlYW1fc3RyYXRlZ3kgPT0gU1RSQVRFR1lfU09OSUZJQ0FUSU9OX1JFU1BFQ1RGVUwpCi0gICAgICAgICAgICAgICAgfHwgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fU1lTVEVNKQotICAgICAgICAgICAgICAgIHx8ICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX0VORk9SQ0VEX0FVRElCTEUpICYmCi0gICAgICAgICAgICAgICAgICAgIChtRW5naW5lLT5nZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX1NZU1RFTSkgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX05PTkUpKSkgJiYKLSAgICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmNhbkJlTXV0ZWQoc3RyZWFtKSkgeworICAgIGlmICghSW50ZXJzZWN0aW9uKGRldmljZVR5cGVzLAorICAgICAgICAgICAge0FVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFAsIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUywKKyAgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1dJUkVEX0hFQURTRVQsIEFVRElPX0RFVklDRV9PVVRfV0lSRURfSEVBRFBIT05FLAorICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfVVNCX0hFQURTRVQsIEFVRElPX0RFVklDRV9PVVRfSEVBUklOR19BSUR9KS5lbXB0eSgpICYmCisgICAgICAgICAgICAoKHZvbHVtZVNvdXJjZSA9PSBhbGFybVZvbHVtZVNyYyB8fAorICAgICAgICAgICAgICB2b2x1bWVTb3VyY2UgPT0gcmluZ1ZvbHVtZVNyYykgfHwKKyAgICAgICAgICAgICAodm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9OT1RJRklDQVRJT04pKSB8fAorICAgICAgICAgICAgICh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX1NZU1RFTSkpIHx8CisgICAgICAgICAgICAgKCh2b2x1bWVTb3VyY2UgPT0gdG9Wb2x1bWVTb3VyY2UoQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpKSAmJgorICAgICAgICAgICAgICAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSkpICYmCisgICAgICAgICAgICBjdXJ2ZXMuY2FuQmVNdXRlZCgpKSB7CisKICAgICAgICAgLy8gd2hlbiB0aGUgcGhvbmUgaXMgcmluZ2luZyB3ZSBtdXN0IGNvbnNpZGVyIHRoYXQgbXVzaWMgY291bGQgaGF2ZSBiZWVuIHBhdXNlZCBqdXN0IGJlZm9yZQogICAgICAgICAvLyBieSB0aGUgbXVzaWMgYXBwbGljYXRpb24gYW5kIGJlaGF2ZSBhcyBpZiBtdXNpYyB3YXMgYWN0aXZlIGlmIHRoZSBsYXN0IG11c2ljIHRyYWNrIHdhcwogICAgICAgICAvLyBqdXN0IHN0b3BwZWQKICAgICAgICAgaWYgKGlzU3RyZWFtQWN0aXZlKEFVRElPX1NUUkVBTV9NVVNJQywgU09OSUZJQ0FUSU9OX0hFQURTRVRfTVVTSUNfREVMQVkpIHx8CiAgICAgICAgICAgICAgICAgbUxpbWl0UmluZ3RvbmVWb2x1bWUpIHsKLSAgICAgICAgICAgIHZvbHVtZURCICs9IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9GQUNUT1JfREI7Ci0gICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgbXVzaWNEZXZpY2UgPSBnZXREZXZpY2VGb3JTdHJhdGVneShTVFJBVEVHWV9NRURJQSwgdHJ1ZSAvKmZyb21DYWNoZSovKTsKLSAgICAgICAgICAgIGZsb2F0IG11c2ljVm9sREIgPSBjb21wdXRlVm9sdW1lKEFVRElPX1NUUkVBTV9NVVNJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4KEFVRElPX1NUUkVBTV9NVVNJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljRGV2aWNlKSwKKyAgICAgICAgICAgIHZvbHVtZURiICs9IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9GQUNUT1JfREI7CisgICAgICAgICAgICBEZXZpY2VUeXBlU2V0IG11c2ljRGV2aWNlID0KKyAgICAgICAgICAgICAgICAgICAgbUVuZ2luZS0+Z2V0T3V0cHV0RGV2aWNlc0ZvckF0dHJpYnV0ZXMoYXR0cmlidXRlc19pbml0aWFsaXplcihBVURJT19VU0FHRV9NRURJQSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIHRydWUgLypmcm9tQ2FjaGUqLykudHlwZXMoKTsKKyAgICAgICAgICAgIGF1dG8gJm11c2ljQ3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzKEFVRElPX1NUUkVBTV9NVVNJQyk7CisgICAgICAgICAgICBmbG9hdCBtdXNpY1ZvbERiID0gY29tcHV0ZVZvbHVtZShtdXNpY0N1cnZlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljVm9sdW1lU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzaWNDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXgobXVzaWNEZXZpY2UpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVzaWNEZXZpY2UpOwotICAgICAgICAgICAgZmxvYXQgbWluVm9sREIgPSAobXVzaWNWb2xEQiA+IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9NSU5fREIpID8KLSAgICAgICAgICAgICAgICAgICAgbXVzaWNWb2xEQiA6IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9NSU5fREI7Ci0gICAgICAgICAgICBpZiAodm9sdW1lREIgPiBtaW5Wb2xEQikgewotICAgICAgICAgICAgICAgIHZvbHVtZURCID0gbWluVm9sREI7Ci0gICAgICAgICAgICAgICAgQUxPR1YoImNvbXB1dGVWb2x1bWUgbGltaXRpbmcgdm9sdW1lIHRvICVmIG11c2ljVm9sICVmIiwgbWluVm9sREIsIG11c2ljVm9sREIpOworICAgICAgICAgICAgZmxvYXQgbWluVm9sRGIgPSAobXVzaWNWb2xEYiA+IFNPTklGSUNBVElPTl9IRUFEU0VUX1ZPTFVNRV9NSU5fREIpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljVm9sRGIgOiBTT05JRklDQVRJT05fSEVBRFNFVF9WT0xVTUVfTUlOX0RCOworICAgICAgICAgICAgaWYgKHZvbHVtZURiID4gbWluVm9sRGIpIHsKKyAgICAgICAgICAgICAgICB2b2x1bWVEYiA9IG1pblZvbERiOworICAgICAgICAgICAgICAgIEFMT0dWKCJjb21wdXRlVm9sdW1lIGxpbWl0aW5nIHZvbHVtZSB0byAlZiBtdXNpY1ZvbCAlZiIsIG1pblZvbERiLCBtdXNpY1ZvbERiKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZXZpY2UgJiAoQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCB8Ci0gICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX0EyRFBfSEVBRFBIT05FUykpIHsKKyAgICAgICAgICAgIGlmICghSW50ZXJzZWN0aW9uKGRldmljZVR5cGVzLCB7QVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUCwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9CTFVFVE9PVEhfQTJEUF9IRUFEUEhPTkVTfSkuZW1wdHkoKSkgewogICAgICAgICAgICAgICAgIC8vIG9uIEEyRFAsIGFsc28gZW5zdXJlIG5vdGlmaWNhdGlvbiB2b2x1bWUgaXMgbm90IHRvbyBsb3cgY29tcGFyZWQgdG8gbWVkaWEgd2hlbgogICAgICAgICAgICAgICAgIC8vIGludGVuZGVkIHRvIGJlIHBsYXllZAotICAgICAgICAgICAgICAgIGlmICgodm9sdW1lREIgPiAtOTYuMGYpICYmCi0gICAgICAgICAgICAgICAgICAgICAgICAobXVzaWNWb2xEQiAtIFNPTklGSUNBVElPTl9BMkRQX01BWF9NRURJQV9ESUZGX0RCID4gdm9sdW1lREIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJjb21wdXRlVm9sdW1lIGluY3JlYXNpbmcgdm9sdW1lIGZvciBzdHJlYW09JWQgZGV2aWNlPTB4JVggZnJvbSAlZiB0byAlZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtLCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lREIsIG11c2ljVm9sREIgLSBTT05JRklDQVRJT05fQTJEUF9NQVhfTUVESUFfRElGRl9EQik7Ci0gICAgICAgICAgICAgICAgICAgIHZvbHVtZURCID0gbXVzaWNWb2xEQiAtIFNPTklGSUNBVElPTl9BMkRQX01BWF9NRURJQV9ESUZGX0RCOworICAgICAgICAgICAgICAgIGlmICgodm9sdW1lRGIgPiAtOTYuMGYpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAobXVzaWNWb2xEYiAtIFNPTklGSUNBVElPTl9BMkRQX01BWF9NRURJQV9ESUZGX0RCID4gdm9sdW1lRGIpKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlcyBpbmNyZWFzaW5nIHZvbHVtZSBmb3Igdm9sdW1lIHNvdXJjZT0lZCBkZXZpY2U9JXMgZnJvbSAlZiB0byAlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCB2b2x1bWVTb3VyY2UsIGR1bXBEZXZpY2VUeXBlcyhkZXZpY2VUeXBlcykuY19zdHIoKSwgdm9sdW1lRGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIG11c2ljVm9sRGIgLSBTT05JRklDQVRJT05fQTJEUF9NQVhfTUVESUFfRElGRl9EQik7CisgICAgICAgICAgICAgICAgICAgIHZvbHVtZURiID0gbXVzaWNWb2xEYiAtIFNPTklGSUNBVElPTl9BMkRQX01BWF9NRURJQV9ESUZGX0RCOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICgoVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlKSAhPSBBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIpIHx8Ci0gICAgICAgICAgICAgICAgc3RyZWFtX3N0cmF0ZWd5ICE9IFNUUkFURUdZX1NPTklGSUNBVElPTikgewotICAgICAgICAgICAgdm9sdW1lREIgKz0gU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX0ZBQ1RPUl9EQjsKKyAgICAgICAgfSBlbHNlIGlmICgoVm9sdW1lOjpnZXREZXZpY2VGb3JWb2x1bWUoZGV2aWNlVHlwZXMpICE9IEFVRElPX0RFVklDRV9PVVRfU1BFQUtFUikgfHwKKyAgICAgICAgICAgICAgICAgICAoISh2b2x1bWVTb3VyY2UgPT0gYWxhcm1Wb2x1bWVTcmMgfHwgdm9sdW1lU291cmNlID09IHJpbmdWb2x1bWVTcmMpKSkgeworICAgICAgICAgICAgdm9sdW1lRGIgKz0gU09OSUZJQ0FUSU9OX0hFQURTRVRfVk9MVU1FX0ZBQ1RPUl9EQjsKICAgICAgICAgfQogICAgIH0KIAotICAgIHJldHVybiB2b2x1bWVEQjsKKyAgICByZXR1cm4gdm9sdW1lRGI7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6Y2hlY2tBbmRTZXRWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSkKK2ludCBBdWRpb1BvbGljeU1hbmFnZXI6OnJlc2NhbGVWb2x1bWVJbmRleChpbnQgc3JjSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIGZyb21Wb2x1bWVTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHRvVm9sdW1lU291cmNlKQogewotICAgIC8vIGRvIG5vdCBjaGFuZ2UgYWN0dWFsIHN0cmVhbSB2b2x1bWUgaWYgdGhlIHN0cmVhbSBpcyBtdXRlZAotICAgIGlmIChvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0gIT0gMCkgewotICAgICAgICBBTE9HVlYoImNoZWNrQW5kU2V0Vm9sdW1lKCkgc3RyZWFtICVkIG11dGVkIGNvdW50ICVkIiwKLSAgICAgICAgICAgICAgc3RyZWFtLCBvdXRwdXREZXNjLT5tTXV0ZUNvdW50W3N0cmVhbV0pOworICAgIGlmIChmcm9tVm9sdW1lU291cmNlID09IHRvVm9sdW1lU291cmNlKSB7CisgICAgICAgIHJldHVybiBzcmNJbmRleDsKKyAgICB9CisgICAgYXV0byAmc3JjQ3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzKGZyb21Wb2x1bWVTb3VyY2UpOworICAgIGF1dG8gJmRzdEN1cnZlcyA9IGdldFZvbHVtZUN1cnZlcyh0b1ZvbHVtZVNvdXJjZSk7CisgICAgZmxvYXQgbWluU3JjID0gKGZsb2F0KXNyY0N1cnZlcy5nZXRWb2x1bWVJbmRleE1pbigpOworICAgIGZsb2F0IG1heFNyYyA9IChmbG9hdClzcmNDdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXhNYXgoKTsKKyAgICBmbG9hdCBtaW5Ec3QgPSAoZmxvYXQpZHN0Q3VydmVzLmdldFZvbHVtZUluZGV4TWluKCk7CisgICAgZmxvYXQgbWF4RHN0ID0gKGZsb2F0KWRzdEN1cnZlcy5nZXRWb2x1bWVJbmRleE1heCgpOworCisgICAgLy8gcHJlc2VydmUgbXV0ZSByZXF1ZXN0IG9yIGNvcnJlY3QgcmFuZ2UKKyAgICBpZiAoc3JjSW5kZXggPCBtaW5TcmMpIHsKKyAgICAgICAgaWYgKHNyY0luZGV4ID09IDApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHNyY0luZGV4ID0gbWluU3JjOworICAgIH0gZWxzZSBpZiAoc3JjSW5kZXggPiBtYXhTcmMpIHsKKyAgICAgICAgc3JjSW5kZXggPSBtYXhTcmM7CisgICAgfQorICAgIHJldHVybiAoaW50KShtaW5Ec3QgKyAoKHNyY0luZGV4IC0gbWluU3JjKSAqIChtYXhEc3QgLSBtaW5Ec3QpKSAvIChtYXhTcmMgLSBtaW5TcmMpKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpjaGVja0FuZFNldFZvbHVtZShJVm9sdW1lQ3VydmVzICZjdXJ2ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVHlwZVNldCBkZXZpY2VUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCit7CisgICAgLy8gZG8gbm90IGNoYW5nZSBhY3R1YWwgYXR0cmlidXRlcyB2b2x1bWUgaWYgdGhlIGF0dHJpYnV0ZXMgaXMgbXV0ZWQKKyAgICBpZiAob3V0cHV0RGVzYy0+aXNNdXRlZCh2b2x1bWVTb3VyY2UpKSB7CisgICAgICAgIEFMT0dWVigiJXM6IHZvbHVtZSBzb3VyY2UgJWQgbXV0ZWQgY291bnQgJWQgYWN0aXZlPSVkIiwgX19mdW5jX18sIHZvbHVtZVNvdXJjZSwKKyAgICAgICAgICAgICAgIG91dHB1dERlc2MtPmdldE11dGVDb3VudCh2b2x1bWVTb3VyY2UpLCBvdXRwdXREZXNjLT5pc0FjdGl2ZSh2b2x1bWVTb3VyY2UpKTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KKyAgICBWb2x1bWVTb3VyY2UgY2FsbFZvbFNyYyA9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKTsKKyAgICBWb2x1bWVTb3VyY2UgYnRTY29Wb2xTcmMgPSB0b1ZvbHVtZVNvdXJjZShBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyk7CisgICAgYm9vbCBpc1ZvaWNlVm9sU3JjID0gY2FsbFZvbFNyYyA9PSB2b2x1bWVTb3VyY2U7CisgICAgYm9vbCBpc0J0U2NvVm9sU3JjID0gYnRTY29Wb2xTcmMgPT0gdm9sdW1lU291cmNlOworCiAgICAgYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBmb3JjZVVzZUZvckNvbW0gPQogICAgICAgICAgICAgbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9DT01NVU5JQ0FUSU9OKTsKICAgICAvLyBkbyBub3QgY2hhbmdlIGluIGNhbGwgdm9sdW1lIGlmIGJsdWV0b290aCBpcyBjb25uZWN0ZWQgYW5kIHZpY2UgdmVyc2EKLSAgICBpZiAoKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCAmJiBmb3JjZVVzZUZvckNvbW0gPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykgfHwKLSAgICAgICAgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTyAmJiBmb3JjZVVzZUZvckNvbW0gIT0gQVVESU9fUE9MSUNZX0ZPUkNFX0JUX1NDTykpIHsKLSAgICAgICAgQUxPR1YoImNoZWNrQW5kU2V0Vm9sdW1lKCkgY2Fubm90IHNldCBzdHJlYW0gJWQgdm9sdW1lIHdpdGggZm9yY2UgdXNlID0gJWQgZm9yIGNvbW0iLAotICAgICAgICAgICAgIHN0cmVhbSwgZm9yY2VVc2VGb3JDb21tKTsKKyAgICAvLyBpZiBzY28gYW5kIGNhbGwgZm9sbG93IHNhbWUgY3VydmVzLCBieXBhc3MgZm9yY2VVc2VGb3JDb21tCisgICAgaWYgKChjYWxsVm9sU3JjICE9IGJ0U2NvVm9sU3JjKSAmJgorICAgICAgICAgICAgKChpc1ZvaWNlVm9sU3JjICYmIGZvcmNlVXNlRm9yQ29tbSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSB8fAorICAgICAgICAgICAgIChpc0J0U2NvVm9sU3JjICYmIGZvcmNlVXNlRm9yQ29tbSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfQlRfU0NPKSkpIHsKKyAgICAgICAgQUxPR1YoIiVzIGNhbm5vdCBzZXQgdm9sdW1lIGdyb3VwICVkIHZvbHVtZSB3aXRoIGZvcmNlIHVzZSA9ICVkIGZvciBjb21tIiwgX19mdW5jX18sCisgICAgICAgICAgICAgdm9sdW1lU291cmNlLCBmb3JjZVVzZUZvckNvbW0pOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotCi0gICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKKyAgICBpZiAoZGV2aWNlVHlwZXMuZW1wdHkoKSkgeworICAgICAgICBkZXZpY2VUeXBlcyA9IG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpOwogICAgIH0KIAotICAgIGZsb2F0IHZvbHVtZURiID0gY29tcHV0ZVZvbHVtZShzdHJlYW0sIGluZGV4LCBkZXZpY2UpOwotICAgIGlmIChvdXRwdXREZXNjLT5pc0ZpeGVkVm9sdW1lKGRldmljZSkgfHwKKyAgICBmbG9hdCB2b2x1bWVEYiA9IGNvbXB1dGVWb2x1bWUoY3VydmVzLCB2b2x1bWVTb3VyY2UsIGluZGV4LCBkZXZpY2VUeXBlcyk7CisgICAgaWYgKG91dHB1dERlc2MtPmlzRml4ZWRWb2x1bWUoZGV2aWNlVHlwZXMpIHx8CiAgICAgICAgICAgICAvLyBGb3JjZSBWb0lQIHZvbHVtZSB0byBtYXggZm9yIGJsdWV0b290aCBTQ08KLSAgICAgICAgICAgICgoc3RyZWFtID09IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMIHx8IHN0cmVhbSA9PSBBVURJT19TVFJFQU1fQkxVRVRPT1RIX1NDTykgJiYKLSAgICAgICAgICAgICAoZGV2aWNlICYgQVVESU9fREVWSUNFX09VVF9BTExfU0NPKSAhPSAwKSkgeworCisgICAgICAgICAgICAoKGlzVm9pY2VWb2xTcmMgfHwgaXNCdFNjb1ZvbFNyYykgJiYKKyAgICAgICAgICAgICAgICAgICAgaXNTaW5nbGVEZXZpY2VUeXBlKGRldmljZVR5cGVzLCBhdWRpb19pc19ibHVldG9vdGhfb3V0X3Njb19kZXZpY2UpKSkgewogICAgICAgICB2b2x1bWVEYiA9IDAuMGY7CiAgICAgfQorICAgIG91dHB1dERlc2MtPnNldFZvbHVtZSgKKyAgICAgICAgICAgIHZvbHVtZURiLCB2b2x1bWVTb3VyY2UsIGN1cnZlcy5nZXRTdHJlYW1UeXBlcygpLCBkZXZpY2VUeXBlcywgZGVsYXlNcywgZm9yY2UpOwogCi0gICAgb3V0cHV0RGVzYy0+c2V0Vm9sdW1lKHZvbHVtZURiLCBzdHJlYW0sIGRldmljZSwgZGVsYXlNcywgZm9yY2UpOwotCi0gICAgaWYgKHN0cmVhbSA9PSBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTCB8fAotICAgICAgICBzdHJlYW0gPT0gQVVESU9fU1RSRUFNX0JMVUVUT09USF9TQ08pIHsKKyAgICBpZiAoaXNWb2ljZVZvbFNyYyB8fCBpc0J0U2NvVm9sU3JjKSB7CiAgICAgICAgIGZsb2F0IHZvaWNlVm9sdW1lOwotICAgICAgICAvLyBGb3JjZSB2b2ljZSB2b2x1bWUgdG8gbWF4IGZvciBibHVldG9vdGggU0NPIGFzIHZvbHVtZSBpcyBtYW5hZ2VkIGJ5IHRoZSBoZWFkc2V0Ci0gICAgICAgIGlmIChzdHJlYW0gPT0gQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpIHsKLSAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gKGZsb2F0KWluZGV4LyhmbG9hdCltVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleE1heChzdHJlYW0pOworICAgICAgICAvLyBGb3JjZSB2b2ljZSB2b2x1bWUgdG8gbWF4IG9yIG11dGUgZm9yIEJsdWV0b290aCBTQ08gYXMgb3RoZXIgYXR0ZW51YXRpb25zIGFyZSBtYW5hZ2VkIGJ5IHRoZSBoZWFkc2V0CisgICAgICAgIGlmIChpc1ZvaWNlVm9sU3JjKSB7CisgICAgICAgICAgICB2b2ljZVZvbHVtZSA9IChmbG9hdClpbmRleC8oZmxvYXQpY3VydmVzLmdldFZvbHVtZUluZGV4TWF4KCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2b2ljZVZvbHVtZSA9IDEuMDsKKyAgICAgICAgICAgIHZvaWNlVm9sdW1lID0gaW5kZXggPT0gMCA/IDAuMCA6IDEuMDsKICAgICAgICAgfQotCiAgICAgICAgIGlmICh2b2ljZVZvbHVtZSAhPSBtTGFzdFZvaWNlVm9sdW1lKSB7CiAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0Vm9pY2VWb2x1bWUodm9pY2VWb2x1bWUsIGRlbGF5TXMpOwogICAgICAgICAgICAgbUxhc3RWb2ljZVZvbHVtZSA9IHZvaWNlVm9sdW1lOwogICAgICAgICB9CiAgICAgfQotCiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6YXBwbHlTdHJlYW1Wb2x1bWVzKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VUeXBlU2V0JiBkZXZpY2VUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UpCiB7Ci0gICAgQUxPR1ZWKCJhcHBseVN0cmVhbVZvbHVtZXMoKSBmb3IgZGV2aWNlICUwOHgiLCBkZXZpY2UpOwotCi0gICAgZm9yIChpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBzdHJlYW0rKykgewotICAgICAgICBjaGVja0FuZFNldFZvbHVtZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1Wb2x1bWVDdXJ2ZXMtPmdldFZvbHVtZUluZGV4KChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgZGV2aWNlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JjZSk7CisgICAgQUxPR1ZWKCJhcHBseVN0cmVhbVZvbHVtZXMoKSBmb3IgZGV2aWNlICVzIiwgZHVtcERldmljZVR5cGVzKGRldmljZVR5cGVzKS5jX3N0cigpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJnZvbHVtZUdyb3VwIDogbUVuZ2luZS0+Z2V0Vm9sdW1lR3JvdXBzKCkpIHsKKyAgICAgICAgYXV0byAmY3VydmVzID0gZ2V0Vm9sdW1lQ3VydmVzKHRvVm9sdW1lU291cmNlKHZvbHVtZUdyb3VwKSk7CisgICAgICAgIGNoZWNrQW5kU2V0Vm9sdW1lKGN1cnZlcywgdG9Wb2x1bWVTb3VyY2Uodm9sdW1lR3JvdXApLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJ2ZXMuZ2V0Vm9sdW1lSW5kZXgoZGV2aWNlVHlwZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLCBkZXZpY2VUeXBlcywgZGVsYXlNcywgZm9yY2UpOwogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN0cmF0ZWd5TXV0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN0cmF0ZWd5TXV0ZShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VUeXBlU2V0IGRldmljZVR5cGVzKQoreworICAgIHN0ZDo6dmVjdG9yPFZvbHVtZVNvdXJjZT4gc291cmNlc1RvTXV0ZTsKKyAgICBmb3IgKGF1dG8gYXR0cmlidXRlczogbUVuZ2luZS0+Z2V0QWxsQXR0cmlidXRlc0ZvclByb2R1Y3RTdHJhdGVneShzdHJhdGVneSkpIHsKKyAgICAgICAgQUxPR1ZWKCIlcygpIGF0dHJpYnV0ZXMgJXMsIG11dGUgJWQsIG91dHB1dCBJRCAlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgdG9TdHJpbmcoYXR0cmlidXRlcykuY19zdHIoKSwgb24sIG91dHB1dERlc2MtPmdldElkKCkpOworICAgICAgICBWb2x1bWVTb3VyY2Ugc291cmNlID0gdG9Wb2x1bWVTb3VyY2UoYXR0cmlidXRlcyk7CisgICAgICAgIGlmIChzdGQ6OmZpbmQoYmVnaW4oc291cmNlc1RvTXV0ZSksIGVuZChzb3VyY2VzVG9NdXRlKSwgc291cmNlKSA9PSBlbmQoc291cmNlc1RvTXV0ZSkpIHsKKyAgICAgICAgICAgIHNvdXJjZXNUb011dGUucHVzaF9iYWNrKHNvdXJjZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZm9yIChhdXRvIHNvdXJjZSA6IHNvdXJjZXNUb011dGUpIHsKKyAgICAgICAgc2V0Vm9sdW1lU291cmNlTXV0ZShzb3VyY2UsIG9uLCBvdXRwdXREZXNjLCBkZWxheU1zLCBkZXZpY2VUeXBlcyk7CisgICAgfQorCit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpzZXRWb2x1bWVTb3VyY2VNdXRlKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIG9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVR5cGVTZXQgZGV2aWNlVHlwZXMpCiB7Ci0gICAgQUxPR1ZWKCJzZXRTdHJhdGVneU11dGUoKSBzdHJhdGVneSAlZCwgbXV0ZSAlZCwgb3V0cHV0IElEICVkIiwKLSAgICAgICAgICAgc3RyYXRlZ3ksIG9uLCBvdXRwdXREZXNjLT5nZXRJZCgpKTsKLSAgICBmb3IgKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCBBVURJT19TVFJFQU1fRk9SX1BPTElDWV9DTlQ7IHN0cmVhbSsrKSB7Ci0gICAgICAgIGlmIChnZXRTdHJhdGVneSgoYXVkaW9fc3RyZWFtX3R5cGVfdClzdHJlYW0pID09IHN0cmF0ZWd5KSB7Ci0gICAgICAgICAgICBzZXRTdHJlYW1NdXRlKChhdWRpb19zdHJlYW1fdHlwZV90KXN0cmVhbSwgb24sIG91dHB1dERlc2MsIGRlbGF5TXMsIGRldmljZSk7Ci0gICAgICAgIH0KKyAgICBpZiAoZGV2aWNlVHlwZXMuZW1wdHkoKSkgeworICAgICAgICBkZXZpY2VUeXBlcyA9IG91dHB1dERlc2MtPmRldmljZXMoKS50eXBlcygpOwogICAgIH0KLX0KLQotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OnNldFN0cmVhbU11dGUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpCi17Ci0gICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfTk9ORSkgewotICAgICAgICBkZXZpY2UgPSBvdXRwdXREZXNjLT5kZXZpY2UoKTsKLSAgICB9Ci0KLSAgICBBTE9HVlYoInNldFN0cmVhbU11dGUoKSBzdHJlYW0gJWQsIG11dGUgJWQsIG1NdXRlQ291bnQgJWQgZGV2aWNlICUwNHgiLAotICAgICAgICAgIHN0cmVhbSwgb24sIG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSwgZGV2aWNlKTsKLQorICAgIGF1dG8gJmN1cnZlcyA9IGdldFZvbHVtZUN1cnZlcyh2b2x1bWVTb3VyY2UpOwogICAgIGlmIChvbikgewotICAgICAgICBpZiAob3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dID09IDApIHsKLSAgICAgICAgICAgIGlmIChtVm9sdW1lQ3VydmVzLT5jYW5CZU11dGVkKHN0cmVhbSkgJiYKLSAgICAgICAgICAgICAgICAgICAgKChzdHJlYW0gIT0gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEUpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAobUVuZ2luZS0+Z2V0Rm9yY2VVc2UoQVVESU9fUE9MSUNZX0ZPUkNFX0ZPUl9TWVNURU0pID09IEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSkpIHsKLSAgICAgICAgICAgICAgICBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sIDAsIG91dHB1dERlc2MsIGRldmljZSwgZGVsYXlNcyk7CisgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNNdXRlZCh2b2x1bWVTb3VyY2UpKSB7CisgICAgICAgICAgICBpZiAoY3VydmVzLmNhbkJlTXV0ZWQoKSAmJgorICAgICAgICAgICAgICAgICAgICAodm9sdW1lU291cmNlICE9IHRvVm9sdW1lU291cmNlKEFVRElPX1NUUkVBTV9FTkZPUkNFRF9BVURJQkxFKSB8fAorICAgICAgICAgICAgICAgICAgICAgKG1FbmdpbmUtPmdldEZvcmNlVXNlKEFVRElPX1BPTElDWV9GT1JDRV9GT1JfU1lTVEVNKSA9PQorICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9OT05FKSkpIHsKKyAgICAgICAgICAgICAgICBjaGVja0FuZFNldFZvbHVtZShjdXJ2ZXMsIHZvbHVtZVNvdXJjZSwgMCwgb3V0cHV0RGVzYywgZGV2aWNlVHlwZXMsIGRlbGF5TXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIC8vIGluY3JlbWVudCBtTXV0ZUNvdW50IGFmdGVyIGNhbGxpbmcgY2hlY2tBbmRTZXRWb2x1bWUoKSBzbyB0aGF0IHZvbHVtZSBjaGFuZ2UgaXMgbm90IGlnbm9yZWQKLSAgICAgICAgb3V0cHV0RGVzYy0+bU11dGVDb3VudFtzdHJlYW1dKys7CisgICAgICAgIC8vIGluY3JlbWVudCBtTXV0ZUNvdW50IGFmdGVyIGNhbGxpbmcgY2hlY2tBbmRTZXRWb2x1bWUoKSBzbyB0aGF0IHZvbHVtZSBjaGFuZ2UgaXMgbm90CisgICAgICAgIC8vIGlnbm9yZWQKKyAgICAgICAgb3V0cHV0RGVzYy0+aW5jTXV0ZUNvdW50KHZvbHVtZVNvdXJjZSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSA9PSAwKSB7Ci0gICAgICAgICAgICBBTE9HVigic2V0U3RyZWFtTXV0ZSgpIHVubXV0aW5nIG5vbiBtdXRlZCBzdHJlYW0hIik7CisgICAgICAgIGlmICghb3V0cHV0RGVzYy0+aXNNdXRlZCh2b2x1bWVTb3VyY2UpKSB7CisgICAgICAgICAgICBBTE9HVigiJXMgdW5tdXRpbmcgbm9uIG11dGVkIGF0dHJpYnV0ZXMhIiwgX19mdW5jX18pOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGlmICgtLW91dHB1dERlc2MtPm1NdXRlQ291bnRbc3RyZWFtXSA9PSAwKSB7Ci0gICAgICAgICAgICBjaGVja0FuZFNldFZvbHVtZShzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtVm9sdW1lQ3VydmVzLT5nZXRWb2x1bWVJbmRleChzdHJlYW0sIGRldmljZSksCisgICAgICAgIGlmIChvdXRwdXREZXNjLT5kZWNNdXRlQ291bnQodm9sdW1lU291cmNlKSA9PSAwKSB7CisgICAgICAgICAgICBjaGVja0FuZFNldFZvbHVtZShjdXJ2ZXMsIHZvbHVtZVNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnZlcy5nZXRWb2x1bWVJbmRleChkZXZpY2VUeXBlcyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlVHlwZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxheU1zKTsKICAgICAgICAgfQogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RhcnRpbmcsIGJvb2wgc3RhdGVDaGFuZ2UpCi17Ci0gICAgaWYoIWhhc1ByaW1hcnlPdXRwdXQoKSkgewotICAgICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gaWYgdGhlIHN0cmVhbSBwZXJ0YWlucyB0byBzb25pZmljYXRpb24gc3RyYXRlZ3kgYW5kIHdlIGFyZSBpbiBjYWxsIHdlIG11c3QKLSAgICAvLyBtdXRlIHRoZSBzdHJlYW0gaWYgaXQgaXMgbG93IHZpc2liaWxpdHkuIElmIGl0IGlzIGhpZ2ggdmlzaWJpbGl0eSwgd2UgbXVzdCBwbGF5IGEgdG9uZQotICAgIC8vIGluIHRoZSBkZXZpY2UgdXNlZCBmb3IgcGhvbmUgc3RyYXRlZ3kgYW5kIHBsYXkgdGhlIHRvbmUgaWYgdGhlIHNlbGVjdGVkIGRldmljZSBkb2VzIG5vdAotICAgIC8vIGludGVyZmVyZSB3aXRoIHRoZSBkZXZpY2UgdXNlZCBmb3IgcGhvbmUgc3RyYXRlZ3kKLSAgICAvLyBpZiBzdGF0ZUNoYW5nZSBpcyB0cnVlLCB3ZSBhcmUgY2FsbGVkIGZyb20gc2V0UGhvbmVTdGF0ZSgpIGFuZCB3ZSBtdXN0IG11dGUgb3IgdW5tdXRlIGFzCi0gICAgLy8gbWFueSB0aW1lcyBhcyB0aGVyZSBhcmUgYWN0aXZlIHRyYWNrcyBvbiB0aGUgb3V0cHV0Ci0gICAgY29uc3Qgcm91dGluZ19zdHJhdGVneSBzdHJlYW1fc3RyYXRlZ3kgPSBnZXRTdHJhdGVneShzdHJlYW0pOwotICAgIGlmICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTikgfHwKLSAgICAgICAgICAgICgoc3RyZWFtX3N0cmF0ZWd5ID09IFNUUkFURUdZX1NPTklGSUNBVElPTl9SRVNQRUNURlVMKSkpIHsKLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IG91dHB1dERlc2MgPSBtUHJpbWFyeU91dHB1dDsKLSAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIHN0cmVhbSAlZCBzdGFydGluZyAlZCBkZXZpY2UgJXggc3RhdGVDaGFuZ2UgJWQiLAotICAgICAgICAgICAgICAgIHN0cmVhbSwgc3RhcnRpbmcsIG91dHB1dERlc2MtPm1EZXZpY2UsIHN0YXRlQ2hhbmdlKTsKLSAgICAgICAgaWYgKG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dKSB7Ci0gICAgICAgICAgICBpbnQgbXV0ZUNvdW50ID0gMTsKLSAgICAgICAgICAgIGlmIChzdGF0ZUNoYW5nZSkgewotICAgICAgICAgICAgICAgIG11dGVDb3VudCA9IG91dHB1dERlc2MtPm1SZWZDb3VudFtzdHJlYW1dOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGF1ZGlvX2lzX2xvd192aXNpYmlsaXR5KHN0cmVhbSkpIHsKLSAgICAgICAgICAgICAgICBBTE9HVigiaGFuZGxlSW5jYWxsU29uaWZpY2F0aW9uKCkgbG93IHZpc2liaWxpdHksIG11dGVDb3VudCAlZCIsIG11dGVDb3VudCk7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdXRlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBzZXRTdHJlYW1NdXRlKHN0cmVhbSwgc3RhcnRpbmcsIG1QcmltYXJ5T3V0cHV0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dWKCJoYW5kbGVJbmNhbGxTb25pZmljYXRpb24oKSBoaWdoIHZpc2liaWxpdHkiKTsKLSAgICAgICAgICAgICAgICBpZiAob3V0cHV0RGVzYy0+ZGV2aWNlKCkgJgotICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGV2aWNlRm9yU3RyYXRlZ3koU1RSQVRFR1lfUEhPTkUsIHRydWUgLypmcm9tQ2FjaGUqLykpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR1YoImhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbigpIGhpZ2ggdmlzaWJpbGl0eSBtdXRlZCwgbXV0ZUNvdW50ICVkIiwgbXV0ZUNvdW50KTsKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtdXRlQ291bnQ7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgc2V0U3RyZWFtTXV0ZShzdHJlYW0sIHN0YXJ0aW5nLCBtUHJpbWFyeU91dHB1dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHN0YXJ0aW5nKSB7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zdGFydFRvbmUoQVVESU9fUE9MSUNZX1RPTkVfSU5fQ0FMTF9OT1RJRklDQVRJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIG1wQ2xpZW50SW50ZXJmYWNlLT5zdG9wVG9uZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KLQotYXVkaW9fc3RyZWFtX3R5cGVfdCBBdWRpb1BvbGljeU1hbmFnZXI6OnN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpCi17Ci0gICAgLy8gZmxhZ3MgdG8gc3RyZWFtIHR5cGUgbWFwcGluZwotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX0FVRElCSUxJVFlfRU5GT1JDRUQpID09IEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCkgewotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0VORk9SQ0VEX0FVRElCTEU7Ci0gICAgfQotICAgIGlmICgoYXR0ci0+ZmxhZ3MgJiBBVURJT19GTEFHX1NDTykgPT0gQVVESU9fRkxBR19TQ08pIHsKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPOwotICAgIH0KLSAgICBpZiAoKGF0dHItPmZsYWdzICYgQVVESU9fRkxBR19CRUFDT04pID09IEFVRElPX0ZMQUdfQkVBQ09OKSB7Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVFRTOwotICAgIH0KLQotICAgIC8vIHVzYWdlIHRvIHN0cmVhbSB0eXBlIG1hcHBpbmcKLSAgICBzd2l0Y2ggKGF0dHItPnVzYWdlKSB7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9NRURJQToKLSAgICBjYXNlIEFVRElPX1VTQUdFX0dBTUU6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTlQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0U6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgY2FzZSBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFk6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fQUNDRVNTSUJJTElUWTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX1NZU1RFTTsKLSAgICBjYXNlIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT046Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fVk9JQ0VfQ0FMTDsKLQotICAgIGNhc2UgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0RUTUY7Ci0KLSAgICBjYXNlIEFVRElPX1VTQUdFX0FMQVJNOgotICAgICAgICByZXR1cm4gQVVESU9fU1RSRUFNX0FMQVJNOwotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORToKLSAgICAgICAgcmV0dXJuIEFVRElPX1NUUkVBTV9SSU5HOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT046Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNUOgotICAgIGNhc2UgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fSU5TVEFOVDoKLSAgICBjYXNlIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQ6Ci0gICAgY2FzZSBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fRVZFTlQ6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTk9USUZJQ0FUSU9OOwotCi0gICAgY2FzZSBBVURJT19VU0FHRV9VTktOT1dOOgotICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBBVURJT19TVFJFQU1fTVVTSUM7Ci0gICAgfQotfQotCiBib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNWYWxpZEF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICpwYWEpCiB7Ci0gICAgLy8gaGFzIGZsYWdzIHRoYXQgbWFwIHRvIGEgc3RyYXRlZ3k/CisgICAgLy8gaGFzIGZsYWdzIHRoYXQgbWFwIHRvIGEgc3RyZWFtIHR5cGU/CiAgICAgaWYgKChwYWEtPmZsYWdzICYgKEFVRElPX0ZMQUdfQVVESUJJTElUWV9FTkZPUkNFRCB8IEFVRElPX0ZMQUdfU0NPIHwgQVVESU9fRkxBR19CRUFDT04pKSAhPSAwKSB7CiAgICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KQEAgLTU5MDQsMzcgKzYwNTIsNiBAQAogICAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIEF1ZGlvUG9saWN5TWFuYWdlcjo6aXNTdHJhdGVneUFjdGl2ZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91dGluZ19zdHJhdGVneSBzdHJhdGVneSwgdWludDMyX3QgaW5QYXN0TXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHN5c1RpbWUpIGNvbnN0Ci17Ci0gICAgaWYgKChzeXNUaW1lID09IDApICYmIChpblBhc3RNcyAhPSAwKSkgewotICAgICAgICBzeXNUaW1lID0gc3lzdGVtVGltZSgpOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IChpbnQpQVVESU9fU1RSRUFNX0ZPUl9QT0xJQ1lfQ05UOyBpKyspIHsKLSAgICAgICAgaWYgKCgoZ2V0U3RyYXRlZ3koKGF1ZGlvX3N0cmVhbV90eXBlX3QpaSkgPT0gc3RyYXRlZ3kpIHx8Ci0gICAgICAgICAgICAgICAgKE5VTV9TVFJBVEVHSUVTID09IHN0cmF0ZWd5KSkgJiYKLSAgICAgICAgICAgICAgICBvdXRwdXREZXNjLT5pc1N0cmVhbUFjdGl2ZSgoYXVkaW9fc3RyZWFtX3R5cGVfdClpLCBpblBhc3RNcywgc3lzVGltZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBBdWRpb1BvbGljeU1hbmFnZXI6OmlzU3RyYXRlZ3lBY3RpdmVPblNhbWVNb2R1bGUoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksIHVpbnQzMl90IGluUGFzdE1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCBzeXNUaW1lKSBjb25zdAotewotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+IGRlc2MgPSBtT3V0cHV0cy52YWx1ZUF0KGkpOwotICAgICAgICBpZiAob3V0cHV0RGVzYy0+c2hhcmVzSHdNb2R1bGVXaXRoKGRlc2MpCi0gICAgICAgICAgICAmJiBpc1N0cmF0ZWd5QWN0aXZlKGRlc2MsIHN0cmF0ZWd5LCBpblBhc3RNcywgc3lzVGltZSkpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLX0KLQogYXVkaW9fcG9saWN5X2ZvcmNlZF9jZmdfdCBBdWRpb1BvbGljeU1hbmFnZXI6OmdldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSkKIHsKICAgICByZXR1cm4gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UodXNhZ2UpOwpAQCAtNTk1MywxMCArNjA3MCwxMCBAQAogdm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6OmNsZWFuVXBGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldmljZURlc2MpCiB7CiAgICAgZm9yIChzc2l6ZV90IGkgPSAoc3NpemVfdCltQXVkaW9Tb3VyY2VzLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSAgewotICAgICAgICBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+IHNvdXJjZURlc2MgPSBtQXVkaW9Tb3VyY2VzLnZhbHVlQXQoaSk7Ci0gICAgICAgIGlmIChzb3VyY2VEZXNjLT5tRGV2aWNlLT5lcXVhbHMoZGV2aWNlRGVzYykpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyByZWxlYXNpbmcgYXVkaW8gc291cmNlICVkIiwgX19GVU5DVElPTl9fLCBzb3VyY2VEZXNjLT5nZXRIYW5kbGUoKSk7Ci0gICAgICAgICAgICBzdG9wQXVkaW9Tb3VyY2Uoc291cmNlRGVzYy0+Z2V0SGFuZGxlKCkpOworICAgICAgICBzcDxTb3VyY2VDbGllbnREZXNjcmlwdG9yPiBzb3VyY2VEZXNjID0gbUF1ZGlvU291cmNlcy52YWx1ZUF0KGkpOworICAgICAgICBpZiAoc291cmNlRGVzYy0+c3JjRGV2aWNlKCktPmVxdWFscyhkZXZpY2VEZXNjKSkgeworICAgICAgICAgICAgQUxPR1YoIiVzIHJlbGVhc2luZyBhdWRpbyBzb3VyY2UgJWQiLCBfX0ZVTkNUSU9OX18sIHNvdXJjZURlc2MtPnBvcnRJZCgpKTsKKyAgICAgICAgICAgIHN0b3BBdWRpb1NvdXJjZShzb3VyY2VEZXNjLT5wb3J0SWQoKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTU5NzgsMTQ2ICs2MDk1LDg0IEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgaWYgKHJlbGVhc2UpIHsKLSAgICAgICAgICAgIEFMT0dWKCIlcyByZWxlYXNpbmcgcGF0Y2ggJXUiLCBfX0ZVTkNUSU9OX18sIHBhdGNoRGVzYy0+bUhhbmRsZSk7Ci0gICAgICAgICAgICByZWxlYXNlQXVkaW9QYXRjaChwYXRjaERlc2MtPm1IYW5kbGUsIHBhdGNoRGVzYy0+bVVpZCk7CisgICAgICAgICAgICBBTE9HVigiJXMgcmVsZWFzaW5nIHBhdGNoICV1IiwgX19GVU5DVElPTl9fLCBwYXRjaERlc2MtPmdldEhhbmRsZSgpKTsKKyAgICAgICAgICAgIHJlbGVhc2VBdWRpb1BhdGNoKHBhdGNoRGVzYy0+Z2V0SGFuZGxlKCksIHBhdGNoRGVzYy0+Z2V0VWlkKCkpOwogICAgICAgICB9CiAgICAgfQorCisgICAgbUlucHV0cy5jbGVhclNlc3Npb25Sb3V0ZXNGb3JEZXZpY2UoZGV2aWNlRGVzYyk7CisKKyAgICBtSHdNb2R1bGVzLmNsZWFuVXBGb3JEZXZpY2UoZGV2aWNlRGVzYyk7CiB9CiAKLS8vIE1vZGlmeSB0aGUgbGlzdCBvZiBzdXJyb3VuZCBzb3VuZCBmb3JtYXRzIHN1cHBvcnRlZC4KLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpmaWx0ZXJTdXJyb3VuZEZvcm1hdHMoRm9ybWF0VmVjdG9yICpmb3JtYXRzUHRyKSB7Ci0gICAgRm9ybWF0VmVjdG9yICZmb3JtYXRzID0gKmZvcm1hdHNQdHI7Ci0gICAgLy8gVE9ETyBTZXQgdGhpcyBiYXNlZCBvbiBDb25maWcgcHJvcGVydGllcy4KLSAgICBjb25zdCBib29sIGFsd2F5c0ZvcmNlQUMzID0gdHJ1ZTsKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjptb2RpZnlTdXJyb3VuZEZvcm1hdHMoCisgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBGb3JtYXRWZWN0b3IgKmZvcm1hdHNQdHIpIHsKKyAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IGVuZm9yY2VkU3Vycm91bmQoCisgICAgICAgICAgICBkZXZEZXNjLT5lbmNvZGVkRm9ybWF0cygpLmJlZ2luKCksIGRldkRlc2MtPmVuY29kZWRGb3JtYXRzKCkuZW5kKCkpOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gYWxsU3Vycm91bmQ7ICAvLyBBIGZsYXQgc2V0IG9mIGFsbCBrbm93biBzdXJyb3VuZCBmb3JtYXRzCisgICAgZm9yIChjb25zdCBhdXRvJiBwYWlyIDogbUNvbmZpZy5nZXRTdXJyb3VuZEZvcm1hdHMoKSkgeworICAgICAgICBhbGxTdXJyb3VuZC5pbnNlcnQocGFpci5maXJzdCk7CisgICAgICAgIGZvciAoY29uc3QgYXV0byYgc3ViZm9ybWF0IDogcGFpci5zZWNvbmQpIGFsbFN1cnJvdW5kLmluc2VydChzdWJmb3JtYXQpOworICAgIH0KIAogICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZm9yY2VVc2UgPSBtRW5naW5lLT5nZXRGb3JjZVVzZSgKICAgICAgICAgICAgIEFVRElPX1BPTElDWV9GT1JDRV9GT1JfRU5DT0RFRF9TVVJST1VORCk7CiAgICAgQUxPR0QoIiVzOiBmb3JjZWQgdXNlID0gJWQiLCBfX0ZVTkNUSU9OX18sIGZvcmNlVXNlKTsKKyAgICAvLyBUaGlzIGlzIHRoZSByZXN1bHRpbmcgc2V0IG9mIGZvcm1hdHMgZGVwZW5kaW5nIG9uIHRoZSBzdXJyb3VuZCBtb2RlOgorICAgIC8vICAgJ2FsbCBzdXJyb3VuZCcgPSBhbGxTdXJyb3VuZAorICAgIC8vICAgJ2VuZm9yY2VkIHN1cnJvdW5kJyA9IGVuZm9yY2VkU3Vycm91bmQgW21heSBpbmNsdWRlIElFQzY5MTM3IHdoaWNoIGlzbid0IHJhdyBzdXJyb3VuZCBmbXRdCisgICAgLy8gICAnbm9uLXN1cnJvdW5kJyA9IG5vdCBpbiAnYWxsIHN1cnJvdW5kJyBhbmQgbm90IGluICdlbmZvcmNlZCBzdXJyb3VuZCcKKyAgICAvLyAgICdtYW51YWwgc3Vycm91bmQnID0gbU1hbnVhbFN1cnJvdW5kRm9ybWF0cworICAgIC8vIEFVVE86ICAgZm9ybWF0cyB2ICdlbmZvcmNlZCBzdXJyb3VuZCcKKyAgICAvLyBBTFdBWVM6IGZvcm1hdHMgdiAnYWxsIHN1cnJvdW5kJyB2ICdlbmZvcmNlZCBzdXJyb3VuZCcKKyAgICAvLyBORVZFUjogIGZvcm1hdHMgXiAnbm9uLXN1cnJvdW5kJworICAgIC8vIE1BTlVBTDogZm9ybWF0cyBeICgnbm9uLXN1cnJvdW5kJyB2ICdtYW51YWwgc3Vycm91bmQnIHYgKElFQzY5MTM3IF4gJ2VuZm9yY2VkIHN1cnJvdW5kJykpCiAKLSAgICAvLyBJZiBNQU5VQUwsIGtlZXAgdGhlIHN1cHBvcnRlZCBzdXJyb3VuZCBzb3VuZCBmb3JtYXRzIGFzIGN1cnJlbnQgZW5hYmxlZCBvbmVzLgorICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gZm9ybWF0U2V0OworICAgIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9NQU5VQUwKKyAgICAgICAgICAgIHx8IGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX05FVkVSKSB7CisgICAgICAgIC8vIGZvcm1hdFNldCBpcyAoZm9ybWF0cyBeICdub24tc3Vycm91bmQnKQorICAgICAgICBmb3IgKGF1dG8gZm9ybWF0SXRlciA9IGZvcm1hdHNQdHItPmJlZ2luKCk7IGZvcm1hdEl0ZXIgIT0gZm9ybWF0c1B0ci0+ZW5kKCk7ICsrZm9ybWF0SXRlcikgeworICAgICAgICAgICAgaWYgKGFsbFN1cnJvdW5kLmNvdW50KCpmb3JtYXRJdGVyKSA9PSAwICYmIGVuZm9yY2VkU3Vycm91bmQuY291bnQoKmZvcm1hdEl0ZXIpID09IDApIHsKKyAgICAgICAgICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KCpmb3JtYXRJdGVyKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGZvcm1hdFNldC5pbnNlcnQoZm9ybWF0c1B0ci0+YmVnaW4oKSwgZm9ybWF0c1B0ci0+ZW5kKCkpOworICAgIH0KKyAgICBmb3JtYXRzUHRyLT5jbGVhcigpOyAgLy8gUmUtZmlsbGVkIGZyb20gdGhlIGZvcm1hdFNldCBhdCB0aGUgZW5kLgorCiAgICAgaWYgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX01BTlVBTCkgewotICAgICAgICBmb3JtYXRzLmNsZWFyKCk7Ci0gICAgICAgIGZvciAoYXV0byBpdCA9IG1TdXJyb3VuZEZvcm1hdHMuYmVnaW4oKTsgaXQgIT0gbVN1cnJvdW5kRm9ybWF0cy5lbmQoKTsgaXQrKykgewotICAgICAgICAgICAgZm9ybWF0cy5hZGQoKml0KTsKKyAgICAgICAgZm9ybWF0U2V0Lmluc2VydChtTWFudWFsU3Vycm91bmRGb3JtYXRzLmJlZ2luKCksIG1NYW51YWxTdXJyb3VuZEZvcm1hdHMuZW5kKCkpOworICAgICAgICAvLyBFbmFibGUgSUVDNjE5Mzcgd2hlbiBpbiBNQU5VQUwgbW9kZSBpZiBpdCdzIGVuZm9yY2VkIGZvciB0aGlzIGRldmljZS4KKyAgICAgICAgaWYgKGVuZm9yY2VkU3Vycm91bmQuY291bnQoQVVESU9fRk9STUFUX0lFQzYxOTM3KSAhPSAwKSB7CisgICAgICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KEFVRElPX0ZPUk1BVF9JRUM2MTkzNyk7CiAgICAgICAgIH0KLSAgICAgICAgLy8gQWx3YXlzIGVuYWJsZSBJRUM2MTkzNyB3aGVuIGluIE1BTlVBTCBtb2RlLgotICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfSUVDNjE5MzcpOwotICAgIH0gZWxzZSB7IC8vIE5FVkVSLCBBVVRPIG9yIEFMV0FZUwotICAgICAgICAvLyBBbmFseXplIG9yaWdpbmFsIHN1cHBvcnQgZm9yIHZhcmlvdXMgZm9ybWF0cy4KLSAgICAgICAgYm9vbCBzdXBwb3J0c0FDMyA9IGZhbHNlOwotICAgICAgICBib29sIHN1cHBvcnRzT3RoZXJTdXJyb3VuZCA9IGZhbHNlOwotICAgICAgICBib29sIHN1cHBvcnRzSUVDNjE5MzcgPSBmYWxzZTsKLSAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5jbGVhcigpOwotICAgICAgICBmb3IgKHNzaXplX3QgZm9ybWF0SW5kZXggPSAwOyBmb3JtYXRJbmRleCA8IChzc2l6ZV90KWZvcm1hdHMuc2l6ZSgpOyBmb3JtYXRJbmRleCsrKSB7Ci0gICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBmb3JtYXRzW2Zvcm1hdEluZGV4XTsKLSAgICAgICAgICAgIHN3aXRjaCAoZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfQUMzOgotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0c0FDMyA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0VfQUMzOgotICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUUzoKLSAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFNfSEQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIElmIEFMV0FZUywgcmVtb3ZlIGFsbCBvdGhlciBzdXJyb3VuZCBmb3JtYXRzIGhlcmUKLSAgICAgICAgICAgICAgICAgICAgLy8gc2luY2Ugd2Ugd2lsbCBhZGQgdGhlbSBsYXRlci4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGZvcmNlVXNlID09IEFVRElPX1BPTElDWV9GT1JDRV9FTkNPREVEX1NVUlJPVU5EX0FMV0FZUykgewotICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0cy5yZW1vdmVBdChmb3JtYXRJbmRleCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRJbmRleC0tOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHN1cHBvcnRzT3RoZXJTdXJyb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0lFQzYxOTM3OgotICAgICAgICAgICAgICAgICAgICBzdXBwb3J0c0lFQzYxOTM3ID0gdHJ1ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9CisgICAgfSBlbHNlIGlmIChmb3JjZVVzZSAhPSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9ORVZFUikgeyAvLyBBVVRPIG9yIEFMV0FZUworICAgICAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTKSB7CisgICAgICAgICAgICBmb3JtYXRTZXQuaW5zZXJ0KGFsbFN1cnJvdW5kLmJlZ2luKCksIGFsbFN1cnJvdW5kLmVuZCgpKTsKICAgICAgICAgfQotCi0gICAgICAgIC8vIE1vZGlmeSBmb3JtYXRzIGJhc2VkIG9uIHN1cnJvdW5kIHByZWZlcmVuY2VzLgotICAgICAgICAvLyBJZiBORVZFUiwgcmVtb3ZlIHN1cHBvcnQgZm9yIHN1cnJvdW5kIGZvcm1hdHMuCi0gICAgICAgIGlmIChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9ORVZFUikgewotICAgICAgICAgICAgaWYgKHN1cHBvcnRzQUMzIHx8IHN1cHBvcnRzT3RoZXJTdXJyb3VuZCB8fCBzdXBwb3J0c0lFQzYxOTM3KSB7Ci0gICAgICAgICAgICAgICAgLy8gUmVtb3ZlIHN1cnJvdW5kIHNvdW5kIHJlbGF0ZWQgZm9ybWF0cy4KLSAgICAgICAgICAgICAgICBmb3IgKHNpemVfdCBmb3JtYXRJbmRleCA9IDA7IGZvcm1hdEluZGV4IDwgZm9ybWF0cy5zaXplKCk7ICkgewotICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBmb3JtYXRzW2Zvcm1hdEluZGV4XTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGZvcm1hdCkgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfQUMzOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRV9BQzM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFM6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9EVFNfSEQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9JRUM2MTkzNzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRzLnJlbW92ZUF0KGZvcm1hdEluZGV4KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0SW5kZXgrKzsgLy8ga2VlcCBpdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN1cHBvcnRzQUMzID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydHNPdGhlclN1cnJvdW5kID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgc3VwcG9ydHNJRUM2MTkzNyA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgeyAvLyBBVVRPIG9yIEFMV0FZUwotICAgICAgICAgICAgLy8gTW9zdCBUVnMgc3VwcG9ydCBBQzMgZXZlbiBpZiB0aGV5IGRvIG5vdCByZXBvcnQgaXQgaW4gdGhlIEVESUQuCi0gICAgICAgICAgICBpZiAoKGFsd2F5c0ZvcmNlQUMzIHx8IChmb3JjZVVzZSA9PSBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpKQotICAgICAgICAgICAgICAgICAgICAmJiAhc3VwcG9ydHNBQzMpIHsKLSAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfQUMzKTsKLSAgICAgICAgICAgICAgICBzdXBwb3J0c0FDMyA9IHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIElmIEFMV0FZUywgYWRkIHN1cHBvcnQgZm9yIHJhdyBzdXJyb3VuZCBmb3JtYXRzIGlmIGFsbCBhcmUgbWlzc2luZy4KLSAgICAgICAgICAgIC8vIFRoaXMgYXNzdW1lcyB0aGF0IGlmIGFueSBvZiB0aGVzZSBmb3JtYXRzIGFyZSByZXBvcnRlZCBieSB0aGUgSEFMCi0gICAgICAgICAgICAvLyB0aGVuIHRoZSByZXBvcnQgaXMgdmFsaWQgYW5kIHNob3VsZCBub3QgYmUgbW9kaWZpZWQuCi0gICAgICAgICAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfQUxXQVlTKSB7Ci0gICAgICAgICAgICAgICAgZm9ybWF0cy5hZGQoQVVESU9fRk9STUFUX0VfQUMzKTsKLSAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfRFRTKTsKLSAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfRFRTX0hEKTsKLSAgICAgICAgICAgICAgICBzdXBwb3J0c090aGVyU3Vycm91bmQgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBZGQgc3VwcG9ydCBmb3IgSUVDNjE5MzcgaWYgYW55IHJhdyBzdXJyb3VuZCBzdXBwb3J0ZWQuCi0gICAgICAgICAgICAvLyBUaGUgSEFMIGNvdWxkIGRvIHRoaXMgYnV0IGFkZCBpdCBoZXJlLCBqdXN0IGluIGNhc2UuCi0gICAgICAgICAgICBpZiAoKHN1cHBvcnRzQUMzIHx8IHN1cHBvcnRzT3RoZXJTdXJyb3VuZCkgJiYgIXN1cHBvcnRzSUVDNjE5MzcpIHsKLSAgICAgICAgICAgICAgICBmb3JtYXRzLmFkZChBVURJT19GT1JNQVRfSUVDNjE5MzcpOwotICAgICAgICAgICAgICAgIHN1cHBvcnRzSUVDNjE5MzcgPSB0cnVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBBZGQgcmVwb3J0ZWQgc3Vycm91bmQgc291bmQgZm9ybWF0cyB0byBlbmFibGVkIHN1cnJvdW5kIGZvcm1hdHMuCi0gICAgICAgICAgICBmb3IgKHNpemVfdCBmb3JtYXRJbmRleCA9IDA7IGZvcm1hdEluZGV4IDwgZm9ybWF0cy5zaXplKCk7IGZvcm1hdEluZGV4KyspIHsKLSAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBmb3JtYXRzW2Zvcm1hdEluZGV4XTsKLSAgICAgICAgICAgICAgICBzd2l0Y2goZm9ybWF0KSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0FDMzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRV9BQzM6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RUUzoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRFRTX0hEOgotICAgICAgICAgICAgICAgICAgICBjYXNlIEFVRElPX0ZPUk1BVF9BQUNfTEM6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQVVESU9fRk9STUFUX0RPTEJZX1RSVUVIRDoKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBBVURJT19GT1JNQVRfRV9BQzNfSk9DOgotICAgICAgICAgICAgICAgICAgICAgICAgbVN1cnJvdW5kRm9ybWF0cy5pbnNlcnQoZm9ybWF0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9CisgICAgICAgIGZvcm1hdFNldC5pbnNlcnQoZW5mb3JjZWRTdXJyb3VuZC5iZWdpbigpLCBlbmZvcmNlZFN1cnJvdW5kLmVuZCgpKTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvJiBmb3JtYXQgOiBmb3JtYXRTZXQpIHsKKyAgICAgICAgZm9ybWF0c1B0ci0+cHVzaF9iYWNrKGZvcm1hdCk7CiAgICAgfQogfQogCi0vLyBNb2RpZnkgdGhlIGxpc3Qgb2YgY2hhbm5lbCBtYXNrcyBzdXBwb3J0ZWQuCi12b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6ZmlsdGVyU3Vycm91bmRDaGFubmVsTWFza3MoQ2hhbm5lbHNWZWN0b3IgKmNoYW5uZWxNYXNrc1B0cikgewotICAgIENoYW5uZWxzVmVjdG9yICZjaGFubmVsTWFza3MgPSAqY2hhbm5lbE1hc2tzUHRyOwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXI6Om1vZGlmeVN1cnJvdW5kQ2hhbm5lbE1hc2tzKENoYW5uZWxNYXNrU2V0ICpjaGFubmVsTWFza3NQdHIpIHsKKyAgICBDaGFubmVsTWFza1NldCAmY2hhbm5lbE1hc2tzID0gKmNoYW5uZWxNYXNrc1B0cjsKICAgICBhdWRpb19wb2xpY3lfZm9yY2VkX2NmZ190IGZvcmNlVXNlID0gbUVuZ2luZS0+Z2V0Rm9yY2VVc2UoCiAgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQpOwogCiAgICAgLy8gSWYgTkVWRVIsIHRoZW4gcmVtb3ZlIHN1cHBvcnQgZm9yIGNoYW5uZWxNYXNrcyA+IHN0ZXJlby4KICAgICBpZiAoZm9yY2VVc2UgPT0gQVVESU9fUE9MSUNZX0ZPUkNFX0VOQ09ERURfU1VSUk9VTkRfTkVWRVIpIHsKLSAgICAgICAgZm9yIChzaXplX3QgbWFza0luZGV4ID0gMDsgbWFza0luZGV4IDwgY2hhbm5lbE1hc2tzLnNpemUoKTsgKSB7Ci0gICAgICAgICAgICBhdWRpb19jaGFubmVsX21hc2tfdCBjaGFubmVsTWFzayA9IGNoYW5uZWxNYXNrc1ttYXNrSW5kZXhdOworICAgICAgICBmb3IgKGF1dG8gaXQgPSBjaGFubmVsTWFza3MuYmVnaW4oKTsgaXQgIT0gY2hhbm5lbE1hc2tzLmVuZCgpOykgeworICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2sgPSAqaXQ7CiAgICAgICAgICAgICBpZiAoY2hhbm5lbE1hc2sgJiB+QVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPKSB7CiAgICAgICAgICAgICAgICAgQUxPR0koIiVzOiBmb3JjZSBORVZFUiwgc28gcmVtb3ZlIGNoYW5uZWxNYXNrIDB4JTA4eCIsIF9fRlVOQ1RJT05fXywgY2hhbm5lbE1hc2spOwotICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcy5yZW1vdmVBdChtYXNrSW5kZXgpOworICAgICAgICAgICAgICAgIGl0ID0gY2hhbm5lbE1hc2tzLmVyYXNlKGl0KTsKICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgbWFza0luZGV4Kys7CisgICAgICAgICAgICAgICAgKytpdDsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIC8vIElmIEFMV0FZUyBvciBNQU5VQUwsIHRoZW4gbWFrZSBzdXJlIHdlIGF0IGxlYXN0IHN1cHBvcnQgNS4xCkBAIC02MTMzLDE3ICs2MTg4LDE4IEBACiAgICAgICAgIH0KICAgICAgICAgLy8gSWYgbm90IHRoZW4gYWRkIDUuMSBzdXBwb3J0LgogICAgICAgICBpZiAoIXN1cHBvcnRzNWRvdDEpIHsKLSAgICAgICAgICAgIGNoYW5uZWxNYXNrcy5hZGQoQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSk7Ci0gICAgICAgICAgICBBTE9HSSgiJXM6IGZvcmNlIEFMV0FZUywgc28gYWRkaW5nIGNoYW5uZWxNYXNrIGZvciA1LjEgc3Vycm91bmQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgY2hhbm5lbE1hc2tzLmluc2VydChBVURJT19DSEFOTkVMX09VVF81UE9JTlQxKTsKKyAgICAgICAgICAgIEFMT0dJKCIlczogZm9yY2UgTUFOVUFMIG9yIEFMV0FZUywgc28gYWRkaW5nIGNoYW5uZWxNYXNrIGZvciA1LjEgc3Vycm91bmQiLCBfX2Z1bmNfXyk7CiAgICAgICAgIH0KICAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyOjp1cGRhdGVBdWRpb1Byb2ZpbGVzKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlcjo6dXBkYXRlQXVkaW9Qcm9maWxlcyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qcm9maWxlVmVjdG9yICZwcm9maWxlcykKIHsKICAgICBTdHJpbmc4IHJlcGx5OworICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgPSBkZXZEZXNjLT50eXBlKCk7CiAKICAgICAvLyBGb3JtYXQgTVVTVCBiZSBjaGVja2VkIGZpcnN0IHRvIHVwZGF0ZSB0aGUgbGlzdCBvZiBBdWRpb1Byb2ZpbGUKICAgICBpZiAocHJvZmlsZXMuaGFzRHluYW1pY0Zvcm1hdCgpKSB7CkBAIC02MTU3LDE1ICs2MjEzLDE2IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgRm9ybWF0VmVjdG9yIGZvcm1hdHMgPSBmb3JtYXRzRnJvbVN0cmluZyhyZXBseS5zdHJpbmcoKSk7Ci0gICAgICAgIGlmIChkZXZpY2UgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JKSB7Ci0gICAgICAgICAgICBmaWx0ZXJTdXJyb3VuZEZvcm1hdHMoJmZvcm1hdHMpOworICAgICAgICBpZiAoZGV2aWNlID09IEFVRElPX0RFVklDRV9PVVRfSERNSQorICAgICAgICAgICAgICAgIHx8IGlzRGV2aWNlT2ZNb2R1bGUoZGV2RGVzYywgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkpIHsKKyAgICAgICAgICAgIG1vZGlmeVN1cnJvdW5kRm9ybWF0cyhkZXZEZXNjLCAmZm9ybWF0cyk7CiAgICAgICAgIH0KLSAgICAgICAgcHJvZmlsZXMuc2V0Rm9ybWF0cyhmb3JtYXRzKTsKKyAgICAgICAgYWRkUHJvZmlsZXNGb3JGb3JtYXRzKHByb2ZpbGVzLCBmb3JtYXRzKTsKICAgICB9CiAKICAgICBmb3IgKGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCA6IHByb2ZpbGVzLmdldFN1cHBvcnRlZEZvcm1hdHMoKSkgewotICAgICAgICBDaGFubmVsc1ZlY3RvciBjaGFubmVsTWFza3M7Ci0gICAgICAgIFNhbXBsZVJhdGVWZWN0b3Igc2FtcGxpbmdSYXRlczsKKyAgICAgICAgQ2hhbm5lbE1hc2tTZXQgY2hhbm5lbE1hc2tzOworICAgICAgICBTYW1wbGVSYXRlU2V0IHNhbXBsaW5nUmF0ZXM7CiAgICAgICAgIEF1ZGlvUGFyYW1ldGVyIHJlcXVlc3RlZFBhcmFtZXRlcnM7CiAgICAgICAgIHJlcXVlc3RlZFBhcmFtZXRlcnMuYWRkSW50KFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleUZvcm1hdCksIGZvcm1hdCk7CiAKQEAgLTYxOTAsMTMgKzYyNDcsNjkgQEAKICAgICAgICAgICAgIGlmIChyZXBsaWVkUGFyYW1ldGVycy5nZXQoCiAgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoQXVkaW9QYXJhbWV0ZXI6OmtleVN0cmVhbVN1cHBvcnRlZENoYW5uZWxzKSwgcmVwbHkpID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAgICAgY2hhbm5lbE1hc2tzID0gY2hhbm5lbE1hc2tzRnJvbVN0cmluZyhyZXBseS5zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0hETUkpIHsKLSAgICAgICAgICAgICAgICAgICAgZmlsdGVyU3Vycm91bmRDaGFubmVsTWFza3MoJmNoYW5uZWxNYXNrcyk7CisgICAgICAgICAgICAgICAgaWYgKGRldmljZSA9PSBBVURJT19ERVZJQ0VfT1VUX0hETUkKKyAgICAgICAgICAgICAgICAgICAgICAgIHx8IGlzRGV2aWNlT2ZNb2R1bGUoZGV2RGVzYywgQVVESU9fSEFSRFdBUkVfTU9EVUxFX0lEX01TRCkpIHsKKyAgICAgICAgICAgICAgICAgICAgbW9kaWZ5U3Vycm91bmRDaGFubmVsTWFza3MoJmNoYW5uZWxNYXNrcyk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIHByb2ZpbGVzLmFkZFByb2ZpbGVGcm9tSGFsKG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0LCBjaGFubmVsTWFza3MsIHNhbXBsaW5nUmF0ZXMpKTsKKyAgICAgICAgYWRkRHluYW1pY0F1ZGlvUHJvZmlsZUFuZFNvcnQoCisgICAgICAgICAgICAgICAgcHJvZmlsZXMsIG5ldyBBdWRpb1Byb2ZpbGUoZm9ybWF0LCBjaGFubmVsTWFza3MsIHNhbXBsaW5nUmF0ZXMpKTsKICAgICB9CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlcjo6aW5zdGFsbFBhdGNoKGNvbnN0IGNoYXIgKmNhbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvSU9EZXNjcmlwdG9ySW50ZXJmYWNlICppb0Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpCit7CisgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1BhdGNoZXMuaW5kZXhPZktleSgKKyAgICAgICAgICAgIHBhdGNoSGFuZGxlICYmICpwYXRjaEhhbmRsZSAhPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORSA/CisgICAgICAgICAgICAqcGF0Y2hIYW5kbGUgOiBpb0Rlc2NyaXB0b3ItPmdldFBhdGNoSGFuZGxlKCkpOworICAgIHNwPEF1ZGlvUGF0Y2g+IHBhdGNoRGVzYzsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBpbnN0YWxsUGF0Y2goCisgICAgICAgICAgICBjYWxsZXIsIGluZGV4LCBwYXRjaEhhbmRsZSwgcGF0Y2gsIGRlbGF5TXMsIG1VaWRDYWNoZWQsICZwYXRjaERlc2MpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaW9EZXNjcmlwdG9yLT5zZXRQYXRjaEhhbmRsZShwYXRjaERlc2MtPmdldEhhbmRsZSgpKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lNYW5hZ2VyOjppbnN0YWxsUGF0Y2goY29uc3QgY2hhciAqY2FsbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3NpemVfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+ICpwYXRjaERlc2NQdHIpCit7CisgICAgc3A8QXVkaW9QYXRjaD4gcGF0Y2hEZXNjOworICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGFmUGF0Y2hIYW5kbGUgPSBBVURJT19QQVRDSF9IQU5ETEVfTk9ORTsKKyAgICBpZiAoaW5kZXggPj0gMCkgeworICAgICAgICBwYXRjaERlc2MgPSBtQXVkaW9QYXRjaGVzLnZhbHVlQXQoaW5kZXgpOworICAgICAgICBhZlBhdGNoSGFuZGxlID0gcGF0Y2hEZXNjLT5nZXRBZkhhbmRsZSgpOworICAgIH0KKworICAgIHN0YXR1c190IHN0YXR1cyA9IG1wQ2xpZW50SW50ZXJmYWNlLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoLCAmYWZQYXRjaEhhbmRsZSwgZGVsYXlNcyk7CisgICAgQUxPR1YoIiVzKCkgQUY6OmNyZWF0ZUF1ZGlvUGF0Y2ggcmV0dXJuZWQgJWQgcGF0Y2hIYW5kbGUgJWQgbnVtX3NvdXJjZXMgJWQgbnVtX3NpbmtzICVkIiwKKyAgICAgICAgICAgIGNhbGxlciwgc3RhdHVzLCBhZlBhdGNoSGFuZGxlLCBwYXRjaC0+bnVtX3NvdXJjZXMsIHBhdGNoLT5udW1fc2lua3MpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICAgICAgcGF0Y2hEZXNjID0gbmV3IEF1ZGlvUGF0Y2gocGF0Y2gsIHVpZCk7CisgICAgICAgICAgICBhZGRBdWRpb1BhdGNoKHBhdGNoRGVzYy0+Z2V0SGFuZGxlKCksIHBhdGNoRGVzYyk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwYXRjaERlc2MtPm1QYXRjaCA9ICpwYXRjaDsKKyAgICAgICAgfQorICAgICAgICBwYXRjaERlc2MtPnNldEFmSGFuZGxlKGFmUGF0Y2hIYW5kbGUpOworICAgICAgICBpZiAocGF0Y2hIYW5kbGUpIHsKKyAgICAgICAgICAgICpwYXRjaEhhbmRsZSA9IHBhdGNoRGVzYy0+Z2V0SGFuZGxlKCk7CisgICAgICAgIH0KKyAgICAgICAgbmV4dEF1ZGlvUG9ydEdlbmVyYXRpb24oKTsKKyAgICAgICAgbXBDbGllbnRJbnRlcmZhY2UtPm9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKKyAgICB9CisgICAgaWYgKHBhdGNoRGVzY1B0cikgKnBhdGNoRGVzY1B0ciA9IHBhdGNoRGVzYzsKKyAgICByZXR1cm4gc3RhdHVzOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCmluZGV4IDQ4ZTA0NzIuLjllYjlhMWQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0F1ZGlvUG9saWN5TWFuYWdlci5oCkBAIC0xNyw2ICsxNyw3IEBACiAjcHJhZ21hIG9uY2UKIAogI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPG1lbW9yeT4KICNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgogCkBAIC0zMCwxMyArMzEsMTMgQEAKICNpbmNsdWRlIDx1dGlscy9Tb3J0ZWRWZWN0b3IuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb1BhcmFtZXRlci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUG9saWN5Lmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qcm9maWxlLmg+CisjaW5jbHVkZSA8bWVkaWEvUGF0Y2hCdWlsZGVyLmg+CiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaCIKIAotI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlckludGVyZmFjZS5oPgogI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyLmg+Ci0jaW5jbHVkZSA8QXVkaW9HYWluLmg+CiAjaW5jbHVkZSA8QXVkaW9Qb2xpY3lDb25maWcuaD4KLSNpbmNsdWRlIDxBdWRpb1BvcnQuaD4KKyNpbmNsdWRlIDxQb2xpY3lBdWRpb1BvcnQuaD4KICNpbmNsdWRlIDxBdWRpb1BhdGNoLmg+CiAjaW5jbHVkZSA8RGV2aWNlRGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPElPUHJvZmlsZS5oPgpAQCAtNDYsOCArNDcsOCBAQAogI2luY2x1ZGUgPEF1ZGlvUG9saWN5TWl4Lmg+CiAjaW5jbHVkZSA8RWZmZWN0RGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPFNvdW5kVHJpZ2dlclNlc3Npb24uaD4KLSNpbmNsdWRlIDxTZXNzaW9uUm91dGUuaD4KLSNpbmNsdWRlIDxWb2x1bWVDdXJ2ZS5oPgorI2luY2x1ZGUgIkVuZ2luZUxpYnJhcnkuaCIKKyNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtOTUsMTIgKzk2LDE0IEBACiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KTsKICAgICAgICAgdmlydHVhbCBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgZ2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KTsKICAgICAgICAgdmlydHVhbCB2b2lkIHNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKTsKICAgICAgICAgdmlydHVhbCB2b2lkIHNldEZvcmNlVXNlKGF1ZGlvX3BvbGljeV9mb3JjZV91c2VfdCB1c2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKQEAgLTEwOSwyNiArMTEyLDIyIEBACiAgICAgICAgIHZpcnR1YWwgdm9pZCBzZXRTeXN0ZW1Qcm9wZXJ0eShjb25zdCBjaGFyKiBwcm9wZXJ0eSwgY29uc3QgY2hhciogdmFsdWUpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRDaGVjaygpOwogICAgICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90ICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgKmZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgICAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgICAgIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4gKnNlY29uZGFyeU91dHB1dHMpIG92ZXJyaWRlOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldElucHV0Rm9yQXR0cihjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY29uZmlnLApAQCAtMTM4LDIwICsxMzcsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKTsKIAogICAgICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0YXJ0cyBiZWluZyB1c2VkLgotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0SW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2lsZW5jZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25jdXJyZW5jeV90eXBlX19tYXNrX3QgKmNvbmN1cnJlbmN5KTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKIAogICAgICAgICAvLyBpbmRpY2F0ZXMgdG8gdGhlIGF1ZGlvIHBvbGljeSBtYW5hZ2VyIHRoYXQgdGhlIGlucHV0IHN0b3BzIGJlaW5nIHVzZWQuCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9faW9faGFuZGxlX3QgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgICAgICB2aXJ0dWFsIHZvaWQgY2xvc2VBbGxJbnB1dHMoKTsKLSAgICAgICAgdmlydHVhbCB2b2lkIGluaXRTdHJlYW1Wb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4TWluLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleE1heCk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcElucHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICAgICAgdmlydHVhbCB2b2lkIHJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgICAgIHZpcnR1YWwgdm9pZCBjaGVja0Nsb3NlSW5wdXRzKCk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgaW5pdFN0cmVhbVZvbHVtZTogZXZlbiBpZiB0aGUgZW5naW5lIHZvbHVtZSBmaWxlcyBwcm92aWRlcyBtaW4gYW5kIG1heCwga2VlcCB0aGlzCisgICAgICAgICAqIGFwaSBmb3IgY29tcGF0aWJpbGl0eSByZWFzb24uCisgICAgICAgICAqIEF1ZGlvU2VydmVyIHdpbGwgZ2V0IHRoZSBtaW4gYW5kIG1heCBhbmQgbWF5IG92ZXJ3cml0ZSB0aGVtIGlmOgorICAgICAgICAgKiAgICAgIC11c2luZyBwcm9wZXJ0eSAoaGlnaGVzdCBwcmlvcml0eSkKKyAgICAgICAgICogICAgICAtbm90IGRlZmluZWQgKC0xIGJ5IGNvbnZlbnRpb24pLCBjYXNlIHdoZW4gc3RpbGwgdXNpbmcgYXBtIHZvbHVtZSB0YWJsZXMgWE1MIGZpbGVzCisgICAgICAgICAqIEBwYXJhbSBzdHJlYW0gdG8gYmUgY29uc2lkZXJlZAorICAgICAgICAgKiBAcGFyYW0gaW5kZXhNaW4gdG8gc2V0CisgICAgICAgICAqIEBwYXJhbSBpbmRleE1heCB0byBzZXQKKyAgICAgICAgICovCisgICAgICAgIHZpcnR1YWwgdm9pZCBpbml0U3RyZWFtVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBpbnQgaW5kZXhNaW4sIGludCBpbmRleE1heCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0U3RyZWFtVm9sdW1lSW5kZXgoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwpAQCAtMTU5LDEwICsxNjEsMzMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOwogCisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLCBpbnQgJmluZGV4KTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsIGludCAmaW5kZXgpOworCisgICAgICAgIHN0YXR1c190IHNldFZvbHVtZUN1cnZlSW5kZXgoaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVZvbHVtZUN1cnZlcyAmdm9sdW1lQ3VydmVzKTsKKworICAgICAgICBzdGF0dXNfdCBnZXRWb2x1bWVJbmRleChjb25zdCBJVm9sdW1lQ3VydmVzICZjdXJ2ZXMsIGludCAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzKSBjb25zdDsKKwogICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQotICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICAgICAgLy8gcmV0dXJuIHRoZSBzdHJhdGVneSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBhdWRpbyBhdHRyaWJ1dGVzCi0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cik7CisgICAgICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdHJlYW1Ub1N0cmF0ZWd5KHN0cmVhbSk7CisgICAgICAgIH0KKyAgICAgICAgcHJvZHVjdF9zdHJhdGVneV90IHN0cmVhbVRvU3RyYXRlZ3koYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGF1dG8gYXR0cmlidXRlcyA9IG1FbmdpbmUtPmdldEF0dHJpYnV0ZXNGb3JTdHJlYW1UeXBlKHN0cmVhbSk7CisgICAgICAgICAgICByZXR1cm4gbUVuZ2luZS0+Z2V0UHJvZHVjdFN0cmF0ZWd5Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzKTsKKyAgICAgICAgfQogCiAgICAgICAgIC8vIHJldHVybiB0aGUgZW5hYmxlZCBvdXRwdXQgZGV2aWNlcyBmb3IgdGhlIGdpdmVuIHN0cmVhbSB0eXBlCiAgICAgICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwpAQCAtMTczLDE0ICsxOTgsOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN0cmF0ZWd5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCk7Ci0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgdW5yZWdpc3RlckVmZmVjdChpbnQgaWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtRWZmZWN0cy51bnJlZ2lzdGVyRWZmZWN0KGlkKTsKLSAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldEVmZmVjdEVuYWJsZWQoaW50IGlkLCBib29sIGVuYWJsZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBtRWZmZWN0cy5zZXRFZmZlY3RFbmFibGVkKGlkLCBlbmFibGVkKTsKLSAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJFZmZlY3QoaW50IGlkKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKTsKKyAgICAgICAgc3RhdHVzX3QgbW92ZUVmZmVjdHNUb0lvKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGlkcywgYXVkaW9faW9faGFuZGxlX3QgaW8pIG92ZXJyaWRlOwogCiAgICAgICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMgPSAwKSBjb25zdDsKICAgICAgICAgLy8gcmV0dXJuIHdoZXRoZXIgYSBzdHJlYW0gaXMgcGxheWluZyByZW1vdGVseSwgb3ZlcnJpZGUgdG8gY2hhbmdlIHRoZSBkZWZpbml0aW9uIG9mCkBAIC0xOTMsMTAgKzIxMywxOCBAQAogCiAgICAgICAgIHZpcnR1YWwgYm9vbCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0OwogCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQpOworICAgICAgICAvLyBoZWxwZXJzIGZvciBkdW1wKGludCBmZCkKKyAgICAgICAgdm9pZCBkdW1wTWFudWFsU3Vycm91bmRGb3JtYXRzKFN0cmluZzggKmRzdCkgY29uc3Q7CisgICAgICAgIHZvaWQgZHVtcChTdHJpbmc4ICpkc3QpIGNvbnN0OwogCisgICAgICAgIHN0YXR1c190IGR1bXAoaW50IGZkKSBvdmVycmlkZTsKKworICAgICAgICBzdGF0dXNfdCBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aWRfdCB1aWQsIGF1ZGlvX2ZsYWdzX21hc2tfdCBjYXB0dXJlUG9saWN5KSBvdmVycmlkZTsKICAgICAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCYgb2ZmbG9hZEluZm8pOwogCisgICAgICAgIHZpcnR1YWwgYm9vbCBpc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpOworCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUG9ydHMoYXVkaW9fcG9ydF9yb2xlX3Qgcm9sZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLApAQCAtMjA1LDcgKzIzMywxMCBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEF1ZGlvUG9ydChzdHJ1Y3QgYXVkaW9fcG9ydCAqcG9ydCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpIHsKKyAgICAgICAgICAgIHJldHVybiBjcmVhdGVBdWRpb1BhdGNoSW50ZXJuYWwocGF0Y2gsIGhhbmRsZSwgdWlkKTsKKyAgICAgICAgfQorCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvUGF0Y2hlcyh1bnNpZ25lZCBpbnQgKm51bV9wYXRjaGVzLApAQCAtMjI2LDEyICsyNTcsMjEgQEAKIAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyUG9saWN5TWl4ZXMoY29uc3QgVmVjdG9yPEF1ZGlvTWl4PiYgbWl4ZXMpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHVucmVnaXN0ZXJQb2xpY3lNaXhlcyhWZWN0b3I8QXVkaW9NaXg+IG1peGVzKTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHByb2R1Y3Rfc3RyYXRlZ3lfdCBzdHJhdGVneSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGV2aWNlVHlwZUFkZHIgJmRldmljZSk7CisgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KTsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpOwogCiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRBdWRpb1NvdXJjZShjb25zdCBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgKnNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpOwotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUpOworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0b3BBdWRpb1NvdXJjZShhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAKICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubyk7CiAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWFzdGVyTW9ubyhib29sICptb25vKTsKQEAgLTI0NCwxMCArMjg0LDQwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcmVwb3J0ZWQpOwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKTsKIAotICAgICAgICAvLyByZXR1cm4gdGhlIHN0cmF0ZWd5IGNvcnJlc3BvbmRpbmcgdG8gYSBnaXZlbiBzdHJlYW0gdHlwZQotICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IGdldFN0cmF0ZWd5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSBjb25zdDsKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpOwogCi0gICAgICAgIHZpcnR1YWwgdm9pZCBzZXRSZWNvcmRTaWxlbmNlZCh1aWRfdCB1aWQsIGJvb2wgc2lsZW5jZWQpOworICAgICAgICB2aXJ0dWFsIHZvaWQgc2V0QXBwU3RhdGUodWlkX3QgdWlkLCBhcHBfc3RhdGVfdCBzdGF0ZSk7CisKKyAgICAgICAgdmlydHVhbCBib29sIGlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RBdWRpb1Byb2R1Y3RTdHJhdGVnaWVzKEF1ZGlvUHJvZHVjdFN0cmF0ZWd5VmVjdG9yICZzdHJhdGVnaWVzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbUVuZ2luZS0+bGlzdEF1ZGlvUHJvZHVjdFN0cmF0ZWdpZXMoc3RyYXRlZ2llcyk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFByb2R1Y3RTdHJhdGVneUZyb21BdWRpb0F0dHJpYnV0ZXMoY29uc3QgQXVkaW9BdHRyaWJ1dGVzICZhYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5KQorICAgICAgICB7CisgICAgICAgICAgICBwcm9kdWN0U3RyYXRlZ3kgPSBtRW5naW5lLT5nZXRQcm9kdWN0U3RyYXRlZ3lGb3JBdHRyaWJ1dGVzKGFhLmdldEF0dHJpYnV0ZXMoKSk7CisgICAgICAgICAgICByZXR1cm4gcHJvZHVjdFN0cmF0ZWd5ICE9IFBST0RVQ1RfU1RSQVRFR1lfTk9ORSA/IE5PX0VSUk9SIDogQkFEX1ZBTFVFOworICAgICAgICB9CisKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Wb2x1bWVHcm91cHMoQXVkaW9Wb2x1bWVHcm91cFZlY3RvciAmZ3JvdXBzKQorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbUVuZ2luZS0+bGlzdEF1ZGlvVm9sdW1lR3JvdXBzKGdyb3Vwcyk7CisgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCAmdm9sdW1lR3JvdXApCisgICAgICAgIHsKKyAgICAgICAgICAgIHZvbHVtZUdyb3VwID0gbUVuZ2luZS0+Z2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGFhLmdldEF0dHJpYnV0ZXMoKSk7CisgICAgICAgICAgICByZXR1cm4gdm9sdW1lR3JvdXAgIT0gVk9MVU1FX0dST1VQX05PTkUgPyBOT19FUlJPUiA6IEJBRF9WQUxVRTsKKyAgICAgICAgfQorCisgICAgICAgIHZvaWQgb25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGUoKSBvdmVycmlkZTsKKworICAgICAgICBzdGF0dXNfdCBpbml0aWFsaXplKCk7CiAKIHByb3RlY3RlZDoKICAgICAgICAgLy8gQSBjb25zdHJ1Y3RvciB0aGF0IGFsbG93cyBtb3JlIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgaW5pdGlhbGl6YXRpb24gcHJvY2VzcywKQEAgLTI2Myw3ICszMzMsNiBAQAogICAgICAgICAvLyAgIC0gaW5pdGlhbGl6ZS4KICAgICAgICAgQXVkaW9Qb2xpY3lDb25maWcmIGdldENvbmZpZygpIHsgcmV0dXJuIG1Db25maWc7IH0KICAgICAgICAgdm9pZCBsb2FkQ29uZmlnKCk7Ci0gICAgICAgIHN0YXR1c190IGluaXRpYWxpemUoKTsKIAogICAgICAgICAvLyBGcm9tIEF1ZGlvUG9saWN5TWFuYWdlck9ic2VydmVyCiAgICAgICAgIHZpcnR1YWwgY29uc3QgQXVkaW9QYXRjaENvbGxlY3Rpb24gJmdldEF1ZGlvUGF0Y2hlcygpIGNvbnN0CkBAIC0yODYsMTAwICszNTUsMTMxIEBACiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBtSW5wdXRzOwogICAgICAgICB9Ci0gICAgICAgIHZpcnR1YWwgY29uc3QgRGV2aWNlVmVjdG9yICZnZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzKCkgY29uc3QKKyAgICAgICAgdmlydHVhbCBjb25zdCBEZXZpY2VWZWN0b3IgZ2V0QXZhaWxhYmxlT3V0cHV0RGV2aWNlcygpIGNvbnN0CiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlczsKICAgICAgICAgfQotICAgICAgICB2aXJ0dWFsIGNvbnN0IERldmljZVZlY3RvciAmZ2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCkgY29uc3QKKyAgICAgICAgdmlydHVhbCBjb25zdCBEZXZpY2VWZWN0b3IgZ2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKCkgY29uc3QKICAgICAgICAgeworICAgICAgICAgICAgLy8gbGVnYWN5IGFuZCBub24tbGVnYWN5IHJlbW90ZS1zdWJtaXggYXJlIG1hbmFnZWQgYnkgdGhlIGVuZ2luZSwgZG8gbm90IGZpbHRlcgogICAgICAgICAgICAgcmV0dXJuIG1BdmFpbGFibGVJbnB1dERldmljZXM7CiAgICAgICAgIH0KLSAgICAgICAgdmlydHVhbCBJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbiAmZ2V0Vm9sdW1lQ3VydmVzKCkgeyByZXR1cm4gKm1Wb2x1bWVDdXJ2ZXM7IH0KICAgICAgICAgdmlydHVhbCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZ2V0RGVmYXVsdE91dHB1dERldmljZSgpIGNvbnN0CiAgICAgICAgIHsKICAgICAgICAgICAgIHJldHVybiBtRGVmYXVsdE91dHB1dERldmljZTsKICAgICAgICAgfQogCisgICAgICAgIHN0ZDo6dmVjdG9yPHZvbHVtZV9ncm91cF90PiBnZXRWb2x1bWVHcm91cHMoKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gbUVuZ2luZS0+Z2V0Vm9sdW1lR3JvdXBzKCk7CisgICAgICAgIH0KKworICAgICAgICBWb2x1bWVTb3VyY2UgdG9Wb2x1bWVTb3VyY2Uodm9sdW1lX2dyb3VwX3Qgdm9sdW1lR3JvdXApIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxWb2x1bWVTb3VyY2U+KHZvbHVtZUdyb3VwKTsKKyAgICAgICAgfQorICAgICAgICBWb2x1bWVTb3VyY2UgdG9Wb2x1bWVTb3VyY2UoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzKSBjb25zdAorICAgICAgICB7CisgICAgICAgICAgICByZXR1cm4gdG9Wb2x1bWVTb3VyY2UobUVuZ2luZS0+Z2V0Vm9sdW1lR3JvdXBGb3JBdHRyaWJ1dGVzKGF0dHJpYnV0ZXMpKTsKKyAgICAgICAgfQorICAgICAgICBWb2x1bWVTb3VyY2UgdG9Wb2x1bWVTb3VyY2UoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiB0b1ZvbHVtZVNvdXJjZShtRW5naW5lLT5nZXRWb2x1bWVHcm91cEZvclN0cmVhbVR5cGUoc3RyZWFtKSk7CisgICAgICAgIH0KKyAgICAgICAgSVZvbHVtZUN1cnZlcyAmZ2V0Vm9sdW1lQ3VydmVzKFZvbHVtZVNvdXJjZSB2b2x1bWVTb3VyY2UpCisgICAgICAgIHsKKyAgICAgICAgICBhdXRvICpjdXJ2ZXMgPSBtRW5naW5lLT5nZXRWb2x1bWVDdXJ2ZXNGb3JWb2x1bWVHcm91cCgKKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9sdW1lX2dyb3VwX3Q+KHZvbHVtZVNvdXJjZSkpOworICAgICAgICAgIEFMT0dfQVNTRVJUKGN1cnZlcyAhPSBudWxscHRyLCAiTm8gY3VydmVzIGZvciB2b2x1bWUgc291cmNlICVkIiwgdm9sdW1lU291cmNlKTsKKyAgICAgICAgICByZXR1cm4gKmN1cnZlczsKKyAgICAgICAgfQorICAgICAgICBJVm9sdW1lQ3VydmVzICZnZXRWb2x1bWVDdXJ2ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyKQorICAgICAgICB7CisgICAgICAgICAgICBhdXRvICpjdXJ2ZXMgPSBtRW5naW5lLT5nZXRWb2x1bWVDdXJ2ZXNGb3JBdHRyaWJ1dGVzKGF0dHIpOworICAgICAgICAgICAgQUxPR19BU1NFUlQoY3VydmVzICE9IG51bGxwdHIsICJObyBjdXJ2ZXMgZm9yIGF0dHJpYnV0ZXMgJXMiLCB0b1N0cmluZyhhdHRyKS5jX3N0cigpKTsKKyAgICAgICAgICAgIHJldHVybiAqY3VydmVzOworICAgICAgICB9CisgICAgICAgIElWb2x1bWVDdXJ2ZXMgJmdldFZvbHVtZUN1cnZlcyhhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSkKKyAgICAgICAgeworICAgICAgICAgICAgYXV0byAqY3VydmVzID0gbUVuZ2luZS0+Z2V0Vm9sdW1lQ3VydmVzRm9yU3RyZWFtVHlwZShzdHJlYW0pOworICAgICAgICAgICAgQUxPR19BU1NFUlQoY3VydmVzICE9IG51bGxwdHIsICJObyBjdXJ2ZXMgZm9yIHN0cmVhbSAlcyIsIHRvU3RyaW5nKHN0cmVhbSkuY19zdHIoKSk7CisgICAgICAgICAgICByZXR1cm4gKmN1cnZlczsKKyAgICAgICAgfQorCiAgICAgICAgIHZvaWQgYWRkT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjKTsKICAgICAgICAgdm9pZCByZW1vdmVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KTsKICAgICAgICAgdm9pZCBhZGRJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwgY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dERlc2MpOwogCi0gICAgICAgIC8vIHJldHVybiBhcHByb3ByaWF0ZSBkZXZpY2UgZm9yIHN0cmVhbXMgaGFuZGxlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmF0ZWd5IGFjY29yZGluZyB0byBjdXJyZW50Ci0gICAgICAgIC8vIHBob25lIHN0YXRlLCBjb25uZWN0ZWQgZGV2aWNlcy4uLgotICAgICAgICAvLyBpZiBmcm9tQ2FjaGUgaXMgdHJ1ZSwgdGhlIGRldmljZSBpcyByZXR1cm5lZCBmcm9tIG1EZXZpY2VGb3JTdHJhdGVneVtdLAotICAgICAgICAvLyBvdGhlcndpc2UgaXQgaXMgZGV0ZXJtaW5lIGJ5IGN1cnJlbnQgc3RhdGUKLSAgICAgICAgLy8gKGRldmljZSBjb25uZWN0ZWQscGhvbmUgc3RhdGUsIGZvcmNlIHVzZSwgYTJkcCBvdXRwdXQuLi4pCi0gICAgICAgIC8vIFRoaXMgYWxsb3dzIHRvOgotICAgICAgICAvLyAgMSBzcGVlZCB1cCBwcm9jZXNzIHdoZW4gdGhlIHN0YXRlIGlzIHN0YWJsZSAod2hlbiBzdGFydGluZyBvciBzdG9wcGluZyBhbiBvdXRwdXQpCi0gICAgICAgIC8vICAyIGFjY2VzcyB0byBlaXRoZXIgY3VycmVudCBkZXZpY2Ugc2VsZWN0aW9uIChmcm9tQ2FjaGUgPT0gdHJ1ZSkgb3IKLSAgICAgICAgLy8gImZ1dHVyZSIgZGV2aWNlIHNlbGVjdGlvbiAoZnJvbUNhY2hlID09IGZhbHNlKSB3aGVuIGNhbGxlZCBmcm9tIGEgY29udGV4dAotICAgICAgICAvLyAgd2hlcmUgY29uZGl0aW9ucyBhcmUgY2hhbmdpbmcgKHNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgpLCBzZXRQaG9uZVN0YXRlKCkuLi4pIEFORAotICAgICAgICAvLyAgYmVmb3JlIHVwZGF0ZURldmljZXNBbmRPdXRwdXRzKCkgaXMgY2FsbGVkLgotICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSk7Ci0KLSAgICAgICAgYm9vbCBpc1N0cmF0ZWd5QWN0aXZlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsIHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpblBhc3RNcyA9IDAsIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OwotCi0gICAgICAgIGJvb2wgaXNTdHJhdGVneUFjdGl2ZU9uU2FtZU1vZHVsZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LCB1aW50MzJfdCBpblBhc3RNcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3Qgc3lzVGltZSA9IDApIGNvbnN0OwotCiAgICAgICAgIC8vIGNoYW5nZSB0aGUgcm91dGUgb2YgdGhlIHNwZWNpZmllZCBvdXRwdXQuIFJldHVybnMgdGhlIG51bWJlciBvZiBtcyB3ZSBoYXZlIHNsZXB0IHRvCiAgICAgICAgIC8vIGFsbG93IG5ldyByb3V0aW5nIHRvIHRha2UgZWZmZWN0IGluIGNlcnRhaW4gY2FzZXMuCi0gICAgICAgIHZpcnR1YWwgdWludDMyX3Qgc2V0T3V0cHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZm9yY2UgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzID0gbnVsbHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXF1aXJlc011dGVDaGVjayA9IHRydWUpOworICAgICAgICB1aW50MzJfdCBzZXRPdXRwdXREZXZpY2VzKGNvbnN0IHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvcmNlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXF1aXJlc011dGVDaGVjayA9IHRydWUpOwogICAgICAgICBzdGF0dXNfdCByZXNldE91dHB1dERldmljZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSA9IE5VTEwpOwogICAgICAgICBzdGF0dXNfdCBzZXRJbnB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IGZhbHNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMKTsKICAgICAgICAgc3RhdHVzX3QgcmVzZXRJbnB1dERldmljZShhdWRpb19pb19oYW5kbGVfdCBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqcGF0Y2hIYW5kbGUgPSBOVUxMKTsKIAotICAgICAgICAvLyBzZWxlY3QgaW5wdXQgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8gcmVxdWVzdGVkIGF1ZGlvIHNvdXJjZQotICAgICAgICB2aXJ0dWFsIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSk7Ci0KICAgICAgICAgLy8gY29tcHV0ZSB0aGUgYWN0dWFsIHZvbHVtZSBmb3IgYSBnaXZlbiBzdHJlYW0gYWNjb3JkaW5nIHRvIHRoZSByZXF1ZXN0ZWQgaW5kZXggYW5kIGEgcGFydGljdWxhcgogICAgICAgICAvLyBkZXZpY2UKLSAgICAgICAgdmlydHVhbCBmbG9hdCBjb21wdXRlVm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAorICAgICAgICB2aXJ0dWFsIGZsb2F0IGNvbXB1dGVWb2x1bWUoSVZvbHVtZUN1cnZlcyAmY3VydmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVHlwZVNldCYgZGV2aWNlVHlwZXMpOwogCisgICAgICAgIC8vIHJlc2NhbGUgdm9sdW1lIGluZGV4IGZyb20gc3JjU3RyZWFtIHdpdGhpbiByYW5nZSBvZiBkc3RTdHJlYW0KKyAgICAgICAgaW50IHJlc2NhbGVWb2x1bWVJbmRleChpbnQgc3JjSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIGZyb21Wb2x1bWVTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHRvVm9sdW1lU291cmNlKTsKICAgICAgICAgLy8gY2hlY2sgdGhhdCB2b2x1bWUgY2hhbmdlIGlzIHBlcm1pdHRlZCwgY29tcHV0ZSBhbmQgc2VuZCBuZXcgdm9sdW1lIHRvIGF1ZGlvIGhhcmR3YXJlCi0gICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2hlY2tBbmRTZXRWb2x1bWUoYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sIGludCBpbmRleCwKKyAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBjaGVja0FuZFNldFZvbHVtZShJVm9sdW1lQ3VydmVzICZjdXJ2ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwgaW50IGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXZpY2VUeXBlU2V0IGRldmljZVR5cGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwgYm9vbCBmb3JjZSA9IGZhbHNlKTsKIAogICAgICAgICAvLyBhcHBseSBhbGwgc3RyZWFtIHZvbHVtZXMgdG8gdGhlIHNwZWNpZmllZCBvdXRwdXQgYW5kIGRldmljZQogICAgICAgICB2b2lkIGFwcGx5U3RyZWFtVm9sdW1lcyhjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBpbnQgZGVsYXlNcyA9IDAsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVR5cGVTZXQmIGRldmljZVR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CiAKLSAgICAgICAgLy8gTXV0ZSBvciB1bm11dGUgYWxsIHN0cmVhbXMgaGFuZGxlZCBieSB0aGUgc3BlY2lmaWVkIHN0cmF0ZWd5IG9uIHRoZSBzcGVjaWZpZWQgb3V0cHV0Ci0gICAgICAgIHZvaWQgc2V0U3RyYXRlZ3lNdXRlKHJvdXRpbmdfc3RyYXRlZ3kgc3RyYXRlZ3ksCisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgc2V0U3RyYXRlZ3lNdXRlIE11dGUgb3IgdW5tdXRlIGFsbCBhY3RpdmUgY2xpZW50cyBvbiB0aGUgY29uc2lkZXJlZCBvdXRwdXQKKyAgICAgICAgICogZm9sbG93aW5nIHRoZSBnaXZlbiBzdHJhdGVneS4KKyAgICAgICAgICogQHBhcmFtIHN0cmF0ZWd5IHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgICAgICogQHBhcmFtIG9uIHRydWUgZm9yIG11dGUsIGZhbHNlIGZvciB1bm11dGUKKyAgICAgICAgICogQHBhcmFtIG91dHB1dERlc2MgdG8gYmUgY29uc2lkZXJlZAorICAgICAgICAgKiBAcGFyYW0gZGVsYXlNcworICAgICAgICAgKiBAcGFyYW0gZGV2aWNlCisgICAgICAgICAqLworICAgICAgICB2b2lkIHNldFN0cmF0ZWd5TXV0ZShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zID0gMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSA9IChhdWRpb19kZXZpY2VzX3QpMCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERldmljZVR5cGVTZXQgZGV2aWNlVHlwZXMgPSBEZXZpY2VUeXBlU2V0KCkpOwogCi0gICAgICAgIC8vIE11dGUgb3IgdW5tdXRlIHRoZSBzdHJlYW0gb24gdGhlIHNwZWNpZmllZCBvdXRwdXQKLSAgICAgICAgdm9pZCBzZXRTdHJlYW1NdXRlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlID0gKGF1ZGlvX2RldmljZXNfdCkwKTsKLQotICAgICAgICAvLyBoYW5kbGUgc3BlY2lhbCBjYXNlcyBmb3Igc29uaWZpY2F0aW9uIHN0cmF0ZWd5IHdoaWxlIGluIGNhbGw6IG11dGUgc3RyZWFtcyBvciByZXBsYWNlIGJ5Ci0gICAgICAgIC8vIGEgc3BlY2lhbCB0b25lIGluIHRoZSBkZXZpY2UgdXNlZCBmb3IgY29tbXVuaWNhdGlvbgotICAgICAgICB2b2lkIGhhbmRsZUluY2FsbFNvbmlmaWNhdGlvbihhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgYm9vbCBzdGFydGluZywgYm9vbCBzdGF0ZUNoYW5nZSk7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgc2V0Vm9sdW1lU291cmNlTXV0ZSBNdXRlIG9yIHVubXV0ZSB0aGUgdm9sdW1lIHNvdXJjZSBvbiB0aGUgc3BlY2lmaWVkIG91dHB1dAorICAgICAgICAgKiBAcGFyYW0gdm9sdW1lU291cmNlIHRvIGJlIG11dGVkL3VubXV0ZSAobWF5IGhvc3QgbGVnYWN5IHN0cmVhbXMgb3IgYnkgZXh0ZW5zaW9uIHNldCBvZgorICAgICAgICAgKiBhdWRpbyBhdHRyaWJ1dGVzKQorICAgICAgICAgKiBAcGFyYW0gb24gdHJ1ZSB0byBtdXRlLCBmYWxzZSB0byB1bXV0ZQorICAgICAgICAgKiBAcGFyYW0gb3V0cHV0RGVzYyBvbiB3aGljaCB0aGUgY2xpZW50IGZvbGxvd2luZyB0aGUgdm9sdW1lIGdyb3VwIHNoYWxsIGJlIG11dGVkL3VtdXRlZAorICAgICAgICAgKiBAcGFyYW0gZGVsYXlNcworICAgICAgICAgKiBAcGFyYW0gZGV2aWNlCisgICAgICAgICAqLworICAgICAgICB2b2lkIHNldFZvbHVtZVNvdXJjZU11dGUoVm9sdW1lU291cmNlIHZvbHVtZVNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGV2aWNlVHlwZVNldCBkZXZpY2VUeXBlcyA9IERldmljZVR5cGVTZXQoKSk7CiAKICAgICAgICAgYXVkaW9fbW9kZV90IGdldFBob25lU3RhdGUoKTsKIApAQCAtMzk0LDE1ICs0OTQsMTIgQEAKICAgICAgICAgLy8gd2hlbiBhIGRldmljZSBpcyBkaXNjb25uZWN0ZWQsIGNoZWNrcyBpZiBhbiBvdXRwdXQgaXMgbm90IHVzZWQgYW55IG1vcmUgYW5kCiAgICAgICAgIC8vIHJldHVybnMgaXRzIGhhbmRsZSBpZiBhbnkuCiAgICAgICAgIC8vIHRyYW5zZmVycyB0aGUgYXVkaW8gdHJhY2tzIGFuZCBlZmZlY3RzIGZyb20gb25lIG91dHB1dCB0aHJlYWQgdG8gYW5vdGhlciBhY2NvcmRpbmdseS4KLSAgICAgICAgc3RhdHVzX3QgY2hlY2tPdXRwdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLAorICAgICAgICBzdGF0dXNfdCBjaGVja091dHB1dHNGb3JEZXZpY2UoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4mIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMpOwogCi0gICAgICAgIHN0YXR1c190IGNoZWNrSW5wdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIGlucHV0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcyk7CisgICAgICAgIHN0YXR1c190IGNoZWNrSW5wdXRzRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSk7CiAKICAgICAgICAgLy8gY2xvc2UgYW4gb3V0cHV0IGFuZCBpdHMgY29tcGFuaW9uIGR1cGxpY2F0aW5nIG91dHB1dC4KICAgICAgICAgdm9pZCBjbG9zZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQpOwpAQCAtNDEwLDE1ICs1MDcsNDEgQEAKICAgICAgICAgLy8gY2xvc2UgYW4gaW5wdXQuCiAgICAgICAgIHZvaWQgY2xvc2VJbnB1dChhdWRpb19pb19oYW5kbGVfdCBpbnB1dCk7CiAKLSAgICAgICAgLy8gY2hlY2tzIGFuZCBpZiBuZWNlc3NhcnkgY2hhbmdlcyBvdXRwdXRzIHVzZWQgZm9yIGFsbCBzdHJhdGVnaWVzLgotICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgb3V0cHV0IGNob2ljZSBmb3IgYSBnaXZlbiBzdHJhdGVneQotICAgICAgICAvLyBjaGFuZ2VzOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLi4uCi0gICAgICAgIC8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpCi0gICAgICAgIHZvaWQgY2hlY2tPdXRwdXRGb3JTdHJhdGVneShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KTsKKyAgICAgICAgLy8gcnVucyBhbGwgdGhlIGNoZWNrcyByZXF1aXJlZCBmb3IgYWNjb21tb2RhdGluZyBjaGFuZ2VzIGluIGRldmljZXMgYW5kIG91dHB1dHMKKyAgICAgICAgLy8gaWYgJ29uT3V0cHV0c0NoZWNrZWQnIGNhbGxiYWNrIGlzIHByb3ZpZGVkLCBpdCBpcyBleGVjdXRlZCBhZnRlciB0aGUgb3V0cHV0cworICAgICAgICAvLyBjaGVjayB2aWEgJ2NoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcycuIElmIHRoZSBjYWxsYmFjayByZXR1cm5zICd0cnVlJywKKyAgICAgICAgLy8gQTJEUCBzdXNwZW5kIHN0YXR1cyBpcyByZWNoZWNrZWQuCisgICAgICAgIHZvaWQgY2hlY2tGb3JEZXZpY2VBbmRPdXRwdXRDaGFuZ2VzKHN0ZDo6ZnVuY3Rpb248Ym9vbCgpPiBvbk91dHB1dHNDaGVja2VkID0gbnVsbHB0cik7CiAKLSAgICAgICAgLy8gU2FtZSBhcyBjaGVja091dHB1dEZvclN0cmF0ZWd5KCkgYnV0IGZvciBhIGFsbCBzdHJhdGVnaWVzIGluIG9yZGVyIG9mIHByaW9yaXR5CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgdXBkYXRlcyByb3V0aW5nIGZvciBhbGwgb3V0cHV0cyAoaW5jbHVkaW5nIGNhbGwgaWYgY2FsbCBpbiBwcm9ncmVzcykuCisgICAgICAgICAqIEBwYXJhbSBkZWxheU1zIGRlbGF5IGZvciB1bm11dGluZyBpZiByZXF1aXJlZAorICAgICAgICAgKi8KKyAgICAgICAgdm9pZCB1cGRhdGVDYWxsQW5kT3V0cHV0Um91dGluZyhib29sIGZvcmNlVm9sdW1lUmVldmFsID0gdHJ1ZSwgdWludDMyX3QgZGVsYXlNcyA9IDApOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgY2hlY2tPdXRwdXRGb3JBdHRyaWJ1dGVzIGNoZWNrcyBhbmQgaWYgbmVjZXNzYXJ5IGNoYW5nZXMgb3V0cHV0cyB1c2VkIGZvciB0aGUKKyAgICAgICAgICogZ2l2ZW4gYXVkaW8gYXR0cmlidXRlcy4KKyAgICAgICAgICogbXVzdCBiZSBjYWxsZWQgZXZlcnkgdGltZSBhIGNvbmRpdGlvbiB0aGF0IGFmZmVjdHMgdGhlIG91dHB1dCBjaG9pY2UgZm9yIGEgZ2l2ZW4KKyAgICAgICAgICogYXR0cmlidXRlcyBjaGFuZ2VzOiBjb25uZWN0ZWQgZGV2aWNlLCBwaG9uZSBzdGF0ZSwgZm9yY2UgdXNlLi4uCisgICAgICAgICAqIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpCisgICAgICAgICAqIEBwYXJhbSBhdHRyIHRvIGJlIGNvbnNpZGVyZWQKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgY2hlY2tPdXRwdXRGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cik7CisKKyAgICAgICAgYm9vbCBmb2xsb3dzU2FtZVJvdXRpbmcoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZsQXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZyQXR0cikgY29uc3Q7CisKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMgU2FtZSBhcyBAc2VlIGNoZWNrT3V0cHV0Rm9yQXR0cmlidXRlcygpCisgICAgICAgICAqICAgICAgYnV0IGZvciBhIGFsbCBwcm9kdWN0IHN0cmF0ZWdpZXMgaW4gb3JkZXIgb2YgcHJpb3JpdHkKKyAgICAgICAgICovCiAgICAgICAgIHZvaWQgY2hlY2tPdXRwdXRGb3JBbGxTdHJhdGVnaWVzKCk7CiAKKyAgICAgICAgLy8gU2FtZSBhcyBjaGVja091dHB1dEZvclN0cmF0ZWd5IGJ1dCBmb3Igc2Vjb25kYXJ5IG91dHB1dHMuIE1ha2Ugc3VyZSBpZiBhIHNlY29uZGFyeQorICAgICAgICAvLyBvdXRwdXQgY29uZGl0aW9uIGNoYW5nZXMsIHRoZSB0cmFjayBpcyBwcm9wZXJseSByZXJvdXRlZAorICAgICAgICB2b2lkIGNoZWNrU2Vjb25kYXJ5T3V0cHV0cygpOworCiAgICAgICAgIC8vIG1hbmFnZXMgQTJEUCBvdXRwdXQgc3VzcGVuZC9yZXN0b3JlIGFjY29yZGluZyB0byBwaG9uZSBzdGF0ZSBhbmQgQlQgU0NPIHVzYWdlCiAgICAgICAgIHZvaWQgY2hlY2tBMmRwU3VzcGVuZCgpOwogCkBAIC00MjYsMTggKzU0OSwyMSBAQAogICAgICAgICAvLyBtdXN0IGJlIGNhbGxlZCBldmVyeSB0aW1lIGEgY29uZGl0aW9uIHRoYXQgYWZmZWN0cyB0aGUgZGV2aWNlIGNob2ljZSBmb3IgYSBnaXZlbiBvdXRwdXQgaXMKICAgICAgICAgLy8gY2hhbmdlZDogY29ubmVjdGVkIGRldmljZSwgcGhvbmUgc3RhdGUsIGZvcmNlIHVzZSwgb3V0cHV0IHN0YXJ0LCBvdXRwdXQgc3RvcC4uCiAgICAgICAgIC8vIHNlZSBnZXREZXZpY2VGb3JTdHJhdGVneSgpIGZvciB0aGUgdXNlIG9mIGZyb21DYWNoZSBwYXJhbWV0ZXIKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGdldE5ld091dHB1dERldmljZShjb25zdCBzcDxBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZnJvbUNhY2hlKTsKKyAgICAgICAgRGV2aWNlVmVjdG9yIGdldE5ld091dHB1dERldmljZXMoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZyb21DYWNoZSk7CiAKLSAgICAgICAgLy8gdXBkYXRlcyBjYWNoZSBvZiBkZXZpY2UgdXNlZCBieSBhbGwgc3RyYXRlZ2llcyAobURldmljZUZvclN0cmF0ZWd5W10pCi0gICAgICAgIC8vIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBkZXZpY2UgY2hvaWNlIGZvciBhIGdpdmVuIHN0cmF0ZWd5IGlzCi0gICAgICAgIC8vIGNoYW5nZWQ6IGNvbm5lY3RlZCBkZXZpY2UsIHBob25lIHN0YXRlLCBmb3JjZSB1c2UuLi4KLSAgICAgICAgLy8gY2FjaGVkIHZhbHVlcyBhcmUgdXNlZCBieSBnZXREZXZpY2VGb3JTdHJhdGVneSgpIGlmIHBhcmFtZXRlciBmcm9tQ2FjaGUgaXMgdHJ1ZS4KLSAgICAgICAgIC8vIE11c3QgYmUgY2FsbGVkIGFmdGVyIGNoZWNrT3V0cHV0Rm9yQWxsU3RyYXRlZ2llcygpCisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgdXBkYXRlRGV2aWNlc0FuZE91dHB1dHM6IHVwZGF0ZXMgY2FjaGUgb2YgZGV2aWNlcyBvZiB0aGUgZW5naW5lCisgICAgICAgICAqIG11c3QgYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgYSBjb25kaXRpb24gdGhhdCBhZmZlY3RzIHRoZSBkZXZpY2UgY2hvaWNlIGlzIGNoYW5nZWQ6CisgICAgICAgICAqIGNvbm5lY3RlZCBkZXZpY2UsIHBob25lIHN0YXRlLCBmb3JjZSB1c2UuLi4KKyAgICAgICAgICogY2FjaGVkIHZhbHVlcyBhcmUgdXNlZCBieSBnZXRPdXRwdXREZXZpY2VzRm9yU3RyZWFtKCkvZ2V0RGV2aWNlc0ZvckF0dHJpYnV0ZXMgaWYKKyAgICAgICAgICogcGFyYW1ldGVyIGZyb21DYWNoZSBpcyB0cnVlLgorICAgICAgICAgKiBNdXN0IGJlIGNhbGxlZCBhZnRlciBjaGVja091dHB1dEZvckFsbFN0cmF0ZWdpZXMoKQorICAgICAgICAgKi8KICAgICAgICAgdm9pZCB1cGRhdGVEZXZpY2VzQW5kT3V0cHV0cygpOwogCiAgICAgICAgIC8vIHNlbGVjdHMgdGhlIG1vc3QgYXBwcm9wcmlhdGUgZGV2aWNlIG9uIGlucHV0IGZvciBjdXJyZW50IHN0YXRlCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXROZXdJbnB1dERldmljZShjb25zdCBzcDxBdWRpb0lucHV0RGVzY3JpcHRvcj4mIGlucHV0RGVzYyk7CisgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGdldE5ld0lucHV0RGV2aWNlKGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXREZXNjKTsKIAogICAgICAgICB2aXJ0dWFsIHVpbnQzMl90IGdldE1heEVmZmVjdHNDcHVMb2FkKCkKICAgICAgICAgewpAQCAtNDQ5LDM0ICs1NzUsNTAgQEAKICAgICAgICAgICAgIHJldHVybiBtRWZmZWN0cy5nZXRNYXhFZmZlY3RzTWVtb3J5KCk7CiAgICAgICAgIH0KIAotICAgICAgICBTb3J0ZWRWZWN0b3I8YXVkaW9faW9faGFuZGxlX3Q+IGdldE91dHB1dHNGb3JEZXZpY2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uJiBvcGVuT3V0cHV0cyk7Ci0gICAgICAgIGJvb2wgdmVjdG9yc0VxdWFsKFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMyKTsKKyAgICAgICAgU29ydGVkVmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiBnZXRPdXRwdXRzRm9yRGV2aWNlcygKKyAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMsIGNvbnN0IFN3QXVkaW9PdXRwdXRDb2xsZWN0aW9uJiBvcGVuT3V0cHV0cyk7CiAKLSAgICAgICAgLy8gbXV0ZS91bm11dGUgc3RyYXRlZ2llcyB1c2luZyBhbiBpbmNvbXBhdGlibGUgZGV2aWNlIGNvbWJpbmF0aW9uCi0gICAgICAgIC8vIGlmIG11dGluZywgd2FpdCBmb3IgdGhlIGF1ZGlvIGluIHBjbSBidWZmZXIgdG8gYmUgZHJhaW5lZCBiZWZvcmUgcHJvY2VlZGluZwotICAgICAgICAvLyBpZiB1bm11dGluZywgdW5tdXRlIG9ubHkgYWZ0ZXIgdGhlIHNwZWNpZmllZCBkZWxheQotICAgICAgICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgbXMgd2FpdGVkCi0gICAgICAgIHZpcnR1YWwgdWludDMyX3QgIGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMoY29uc3Qgc3A8QXVkaW9PdXRwdXREZXNjcmlwdG9yPiYgb3V0cHV0RGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IHByZXZEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGRlbGF5TXMpOworICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIGNoZWNrRGV2aWNlTXV0ZVN0cmF0ZWdpZXMgbXV0ZS91bm11dGUgc3RyYXRlZ2llcworICAgICAgICAgKiAgICAgIHVzaW5nIGFuIGluY29tcGF0aWJsZSBkZXZpY2UgY29tYmluYXRpb24uCisgICAgICAgICAqICAgICAgaWYgbXV0aW5nLCB3YWl0IGZvciB0aGUgYXVkaW8gaW4gcGNtIGJ1ZmZlciB0byBiZSBkcmFpbmVkIGJlZm9yZSBwcm9jZWVkaW5nCisgICAgICAgICAqICAgICAgaWYgdW5tdXRpbmcsIHVubXV0ZSBvbmx5IGFmdGVyIHRoZSBzcGVjaWZpZWQgZGVsYXkKKyAgICAgICAgICogQHBhcmFtIG91dHB1dERlc2MKKyAgICAgICAgICogQHBhcmFtIHByZXZEZXZpY2UKKyAgICAgICAgICogQHBhcmFtIGRlbGF5TXMKKyAgICAgICAgICogQHJldHVybiB0aGUgbnVtYmVyIG9mIG1zIHdhaXRlZAorICAgICAgICAgKi8KKyAgICAgICAgdmlydHVhbCB1aW50MzJfdCBjaGVja0RldmljZU11dGVTdHJhdGVnaWVzKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXZpY2VWZWN0b3IgJnByZXZEZXZpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZGVsYXlNcyk7CiAKICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgc2VsZWN0T3V0cHV0KGNvbnN0IFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncyA9IEFVRElPX09VVFBVVF9GTEFHX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQgPSBBVURJT19GT1JNQVRfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrID0gQVVESU9fQ0hBTk5FTF9OT05FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc2FtcGxpbmdSYXRlID0gMCk7CiAgICAgICAgIC8vIHNhbXBsaW5nUmF0ZSwgZm9ybWF0LCBjaGFubmVsTWFzayBhcmUgaW4vb3V0IGFuZCBzbyBtYXkgYmUgbW9kaWZpZWQKLSAgICAgICAgc3A8SU9Qcm9maWxlPiBnZXRJbnB1dFByb2ZpbGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgc3A8SU9Qcm9maWxlPiBnZXRJbnB1dFByb2ZpbGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJiBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90JiBzYW1wbGluZ1JhdGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90JiBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190JiBjaGFubmVsTWFzaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncyk7Ci0gICAgICAgIHNwPElPUHJvZmlsZT4gZ2V0UHJvZmlsZUZvckRpcmVjdE91dHB1dChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY2hhbm5lbF9tYXNrX3QgY2hhbm5lbE1hc2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpOworICAgICAgICAvKioKKyAgICAgICAgICogQGJyaWVmIGdldFByb2ZpbGVGb3JPdXRwdXQKKyAgICAgICAgICogQHBhcmFtIGRldmljZXMgdmVjdG9yIG9mIGRlc2NyaXB0b3JzLCBtYXkgYmUgZW1wdHkgaWYgaWdub3JpbmcgdGhlIGRldmljZSBpcyByZXF1aXJlZAorICAgICAgICAgKiBAcGFyYW0gc2FtcGxpbmdSYXRlCisgICAgICAgICAqIEBwYXJhbSBmb3JtYXQKKyAgICAgICAgICogQHBhcmFtIGNoYW5uZWxNYXNrCisgICAgICAgICAqIEBwYXJhbSBmbGFncworICAgICAgICAgKiBAcGFyYW0gZGlyZWN0T25seQorICAgICAgICAgKiBAcmV0dXJuIElPUHJvZmlsZSB0byBiZSB1c2VkIGlmIGZvdW5kLCBudWxscHRyIG90aGVyd2lzZQorICAgICAgICAgKi8KKyAgICAgICAgc3A8SU9Qcm9maWxlPiBnZXRQcm9maWxlRm9yT3V0cHV0KGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHNhbXBsaW5nUmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NoYW5uZWxfbWFza190IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRpcmVjdE9ubHkpOwogCiAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IHNlbGVjdE91dHB1dEZvck11c2ljRWZmZWN0cygpOwogCkBAIC00ODksNjIgKzYzMSw4NCBAQAogICAgICAgICAgICAgcmV0dXJuIG1BdWRpb1BhdGNoZXMucmVtb3ZlQXVkaW9QYXRjaChoYW5kbGUpOwogICAgICAgICB9CiAKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZVByaW1hcnlPdXRwdXREZXZpY2VzKCkgY29uc3QKKyAgICAgICAgYm9vbCBpc1ByaW1hcnlNb2R1bGUoY29uc3Qgc3A8SHdNb2R1bGU+ICZtb2R1bGUpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChtb2R1bGUgPT0gMCB8fCAhaGFzUHJpbWFyeU91dHB1dCgpKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIG1vZHVsZS0+Z2V0SGFuZGxlKCkgPT0gbVByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpOworICAgICAgICB9CisgICAgICAgIERldmljZVZlY3RvciBhdmFpbGFibGVQcmltYXJ5T3V0cHV0RGV2aWNlcygpIGNvbnN0CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICghaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOworICAgICAgICAgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtUHJpbWFyeU91dHB1dC0+c3VwcG9ydGVkRGV2aWNlcygpICYgbUF2YWlsYWJsZU91dHB1dERldmljZXMudHlwZXMoKTsKKyAgICAgICAgICAgIHJldHVybiBtQXZhaWxhYmxlT3V0cHV0RGV2aWNlcy5maWx0ZXIobVByaW1hcnlPdXRwdXQtPnN1cHBvcnRlZERldmljZXMoKSk7CiAgICAgICAgIH0KLSAgICAgICAgYXVkaW9fZGV2aWNlc190IGF2YWlsYWJsZVByaW1hcnlJbnB1dERldmljZXMoKSBjb25zdAorICAgICAgICBEZXZpY2VWZWN0b3IgYXZhaWxhYmxlUHJpbWFyeU1vZHVsZUlucHV0RGV2aWNlcygpIGNvbnN0CiAgICAgICAgIHsKICAgICAgICAgICAgIGlmICghaGFzUHJpbWFyeU91dHB1dCgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFVRElPX0RFVklDRV9OT05FOworICAgICAgICAgICAgICAgIHJldHVybiBEZXZpY2VWZWN0b3IoKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUobVByaW1hcnlPdXRwdXQtPmdldE1vZHVsZUhhbmRsZSgpKTsKKyAgICAgICAgICAgIHJldHVybiBtQXZhaWxhYmxlSW5wdXREZXZpY2VzLmdldERldmljZXNGcm9tSHdNb2R1bGUoCisgICAgICAgICAgICAgICAgICAgIG1QcmltYXJ5T3V0cHV0LT5nZXRNb2R1bGVIYW5kbGUoKSk7CisgICAgICAgIH0KKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBnZXRGaXJzdERldmljZUlkIG9mIHRoZSBEZXZpY2UgVmVjdG9yCisgICAgICAgICAqIEByZXR1cm4gaWYgdGhlIGNvbGxlY3Rpb24gaXMgbm90IGVtcHR5LCBpdCByZXR1cm5zIHRoZSBmaXJzdCBkZXZpY2UgSWQsCisgICAgICAgICAqICAgICAgICAgb3RoZXJ3aXNlIEFVRElPX1BPUlRfSEFORExFX05PTkUKKyAgICAgICAgICovCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZ2V0Rmlyc3REZXZpY2VJZChjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoZGV2aWNlcy5zaXplKCkgPiAwKSA/IGRldmljZXMuaXRlbUF0KDApLT5nZXRJZCgpIDogQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgfQorICAgICAgICBTdHJpbmc4IGdldEZpcnN0RGV2aWNlQWRkcmVzcyhjb25zdCBEZXZpY2VWZWN0b3IgJmRldmljZXMpIGNvbnN0CisgICAgICAgIHsKKyAgICAgICAgICAgIHJldHVybiAoZGV2aWNlcy5zaXplKCkgPiAwKSA/CisgICAgICAgICAgICAgICAgICAgIFN0cmluZzgoZGV2aWNlcy5pdGVtQXQoMCktPmFkZHJlc3MoKS5jX3N0cigpKSA6IFN0cmluZzgoIiIpOwogICAgICAgICB9CiAKLSAgICAgICAgdWludDMyX3QgdXBkYXRlQ2FsbFJvdXRpbmcoYXVkaW9fZGV2aWNlc190IHJ4RGV2aWNlLCB1aW50MzJfdCBkZWxheU1zID0gMCk7Ci0gICAgICAgIHNwPEF1ZGlvUGF0Y2g+IGNyZWF0ZVRlbGVwaG9ueVBhdGNoKGJvb2wgaXNSeCwgYXVkaW9fZGV2aWNlc190IGRldmljZSwgdWludDMyX3QgZGVsYXlNcyk7Ci0gICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IGZpbGxBdWRpb1BvcnRDb25maWdGb3JEZXZpY2UoCi0gICAgICAgICAgICAgICAgY29uc3QgRGV2aWNlVmVjdG9yJiBkZXZpY2VzLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnKTsKKyAgICAgICAgdWludDMyX3QgdXBkYXRlQ2FsbFJvdXRpbmcoY29uc3QgRGV2aWNlVmVjdG9yICZyeERldmljZXMsIHVpbnQzMl90IGRlbGF5TXMgPSAwKTsKKyAgICAgICAgc3A8QXVkaW9QYXRjaD4gY3JlYXRlVGVsZXBob255UGF0Y2goYm9vbCBpc1J4LCBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBkZWxheU1zKTsKKyAgICAgICAgYm9vbCBpc0RldmljZU9mTW9kdWxlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBjb25zdCBjaGFyICptb2R1bGVJZCkgY29uc3Q7CiAKLSAgICAgICAgLy8gaWYgYXJndW1lbnQgImRldmljZSIgaXMgZGlmZmVyZW50IGZyb20gQVVESU9fREVWSUNFX05PTkUsICBzdGFydFNvdXJjZSgpIHdpbGwgZm9yY2UKLSAgICAgICAgLy8gdGhlIHJlLWV2YWx1YXRpb24gb2YgdGhlIG91dHB1dCBkZXZpY2UuCi0gICAgICAgIHN0YXR1c190IHN0YXJ0U291cmNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICphZGRyZXNzLAorICAgICAgICBzdGF0dXNfdCBzdGFydFNvdXJjZShjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmRlbGF5TXMpOwotICAgICAgICBzdGF0dXNfdCBzdG9wU291cmNlKGNvbnN0IHNwPEF1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIG91dHB1dERlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZURldmljZVVwZGF0ZSk7CisgICAgICAgIHN0YXR1c190IHN0b3BTb3VyY2UoY29uc3Qgc3A8U3dBdWRpb091dHB1dERlc2NyaXB0b3I+JiBvdXRwdXREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFRyYWNrQ2xpZW50RGVzY3JpcHRvcj4mIGNsaWVudCk7CiAKICAgICAgICAgdm9pZCBjbGVhckF1ZGlvUGF0Y2hlcyh1aWRfdCB1aWQpOwogICAgICAgICB2b2lkIGNsZWFyU2Vzc2lvblJvdXRlcyh1aWRfdCB1aWQpOwotICAgICAgICB2b2lkIGNoZWNrU3RyYXRlZ3lSb3V0ZShyb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5LCBhdWRpb19pb19oYW5kbGVfdCBvdXB0dXRUb1NraXApOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgY2hlY2tTdHJhdGVneVJvdXRlOiB3aGVuIGFuIG91dHB1dCBpcyBiZWVpbmcgcmVyb3V0ZWQsIHJlY29uc2lkZXIgZWFjaCBvdXRwdXQKKyAgICAgICAgICogdGhhdCBtYXkgaG9zdCBhIHN0cmF0ZWd5IHBsYXlpbmcgb24gdGhlIGNvbnNpZGVyZWQgb3V0cHV0LgorICAgICAgICAgKiBAcGFyYW0gcHMgcHJvZHVjdCBzdHJhdGVneSB0aGF0IGluaXRpYXRlZCB0aGUgcmVyb3V0aW5nCisgICAgICAgICAqIEBwYXJhbSBvdXB0dXRUb1NraXAgb3V0cHV0IHRoYXQgaW5pdGlhdGVkIHRoZSByZXJvdXRpbmcKKyAgICAgICAgICovCisgICAgICAgIHZvaWQgY2hlY2tTdHJhdGVneVJvdXRlKHByb2R1Y3Rfc3RyYXRlZ3lfdCBwcywgYXVkaW9faW9faGFuZGxlX3Qgb3VwdHV0VG9Ta2lwKTsKIAogICAgICAgICBzdGF0dXNfdCBoYXNQcmltYXJ5T3V0cHV0KCkgY29uc3QgeyByZXR1cm4gbVByaW1hcnlPdXRwdXQgIT0gMDsgfQogCi0gICAgICAgIHN0YXR1c190IGNvbm5lY3RBdWRpb1NvdXJjZShjb25zdCBzcDxBdWRpb1NvdXJjZURlc2NyaXB0b3I+JiBzb3VyY2VEZXNjKTsKLSAgICAgICAgc3RhdHVzX3QgZGlzY29ubmVjdEF1ZGlvU291cmNlKGNvbnN0IHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOworICAgICAgICBzdGF0dXNfdCBjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOworICAgICAgICBzdGF0dXNfdCBkaXNjb25uZWN0QXVkaW9Tb3VyY2UoY29uc3Qgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4mIHNvdXJjZURlc2MpOwogCi0gICAgICAgIHNwPEF1ZGlvU291cmNlRGVzY3JpcHRvcj4gZ2V0U291cmNlRm9yU3RyYXRlZ3lPbk91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3V0aW5nX3N0cmF0ZWd5IHN0cmF0ZWd5KTsKKyAgICAgICAgc3A8U291cmNlQ2xpZW50RGVzY3JpcHRvcj4gZ2V0U291cmNlRm9yQXR0cmlidXRlc09uT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cik7CiAKICAgICAgICAgdm9pZCBjbGVhblVwRm9yRGV2aWNlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZpY2VEZXNjKTsKIAogICAgICAgICB2b2lkIGNsZWFyQXVkaW9Tb3VyY2VzKHVpZF90IHVpZCk7CiAKLSAgICAgICAgc3RhdGljIGJvb2wgaXNDb25jdXJyZW50U291cmNlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7Ci0KLSAgICAgICAgYm9vbCBpc0NvbmN1cmVudENhcHR1cmVBbGxvd2VkKGNvbnN0IHNwPEF1ZGlvSW5wdXREZXNjcmlwdG9yPiYgaW5wdXREZXNjLAotICAgICAgICAgICAgICAgIGNvbnN0IHNwPEF1ZGlvU2Vzc2lvbj4mIGF1ZGlvU2Vzc2lvbik7Ci0KICAgICAgICAgc3RhdGljIGJvb2wgc3RyZWFtc01hdGNoRm9ydm9sdW1lKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtMik7CiAKLSAgICAgICAgdWlkX3QgbVVpZENhY2hlZDsKKyAgICAgICAgdm9pZCBjbG9zZUFjdGl2ZUNsaWVudHMoY29uc3Qgc3A8QXVkaW9JbnB1dERlc2NyaXB0b3I+JiBpbnB1dCk7CisgICAgICAgIHZvaWQgY2xvc2VDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworCisgICAgICAgIGNvbnN0IHVpZF90IG1VaWRDYWNoZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFJRF9BVURJT1NFUlZFUgogICAgICAgICBBdWRpb1BvbGljeUNsaWVudEludGVyZmFjZSAqbXBDbGllbnRJbnRlcmZhY2U7ICAvLyBhdWRpbyBwb2xpY3kgY2xpZW50IGludGVyZmFjZQogICAgICAgICBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4gbVByaW1hcnlPdXRwdXQ7ICAgICAvLyBwcmltYXJ5IG91dHB1dCBkZXNjcmlwdG9yCiAgICAgICAgIC8vIGxpc3Qgb2YgZGVzY3JpcHRvcnMgZm9yIG91dHB1dHMgY3VycmVudGx5IG9wZW5lZApAQCAtNTU1LDIzICs3MTksMjEgQEAKICAgICAgICAgU3dBdWRpb091dHB1dENvbGxlY3Rpb24gbVByZXZpb3VzT3V0cHV0czsKICAgICAgICAgQXVkaW9JbnB1dENvbGxlY3Rpb24gbUlucHV0czsgICAgIC8vIGxpc3Qgb2YgaW5wdXQgZGVzY3JpcHRvcnMKIAorICAgICAgICBEZXZpY2VWZWN0b3IgIG1PdXRwdXREZXZpY2VzQWxsOyAvLyBhbGwgb3V0cHV0IGRldmljZXMgZnJvbSB0aGUgY29uZmlnCisgICAgICAgIERldmljZVZlY3RvciAgbUlucHV0RGV2aWNlc0FsbDsgIC8vIGFsbCBpbnB1dCBkZXZpY2VzIGZyb20gdGhlIGNvbmZpZwogICAgICAgICBEZXZpY2VWZWN0b3IgIG1BdmFpbGFibGVPdXRwdXREZXZpY2VzOyAvLyBhbGwgYXZhaWxhYmxlIG91dHB1dCBkZXZpY2VzCiAgICAgICAgIERldmljZVZlY3RvciAgbUF2YWlsYWJsZUlucHV0RGV2aWNlczsgIC8vIGFsbCBhdmFpbGFibGUgaW5wdXQgZGV2aWNlcwogCi0gICAgICAgIFNlc3Npb25Sb3V0ZU1hcCBtT3V0cHV0Um91dGVzID0gU2Vzc2lvblJvdXRlTWFwKFNlc3Npb25Sb3V0ZU1hcDo6TUFQVFlQRV9PVVRQVVQpOwotICAgICAgICBTZXNzaW9uUm91dGVNYXAgbUlucHV0Um91dGVzID0gU2Vzc2lvblJvdXRlTWFwKFNlc3Npb25Sb3V0ZU1hcDo6TUFQVFlQRV9JTlBVVCk7Ci0KICAgICAgICAgYm9vbCAgICBtTGltaXRSaW5ndG9uZVZvbHVtZTsgICAgICAgIC8vIGxpbWl0IHJpbmd0b25lIHZvbHVtZSB0byBtdXNpYyB2b2x1bWUgaWYgaGVhZHNldCBjb25uZWN0ZWQKLSAgICAgICAgYXVkaW9fZGV2aWNlc190IG1EZXZpY2VGb3JTdHJhdGVneVtOVU1fU1RSQVRFR0lFU107CisKICAgICAgICAgZmxvYXQgICBtTGFzdFZvaWNlVm9sdW1lOyAgICAgICAgICAgIC8vIGxhc3Qgdm9pY2Ugdm9sdW1lIHZhbHVlIHNlbnQgdG8gYXVkaW8gSEFMCiAgICAgICAgIGJvb2wgICAgbUEyZHBTdXNwZW5kZWQ7ICAvLyB0cnVlIGlmIEEyRFAgb3V0cHV0IGlzIHN1c3BlbmRlZAogCi0gICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJVm9sdW1lQ3VydmVzQ29sbGVjdGlvbj4gbVZvbHVtZUN1cnZlczsgLy8gVm9sdW1lIEN1cnZlcyBwZXIgdXNlIGNhc2UgYW5kIGRldmljZSBjYXRlZ29yeQogICAgICAgICBFZmZlY3REZXNjcmlwdG9yQ29sbGVjdGlvbiBtRWZmZWN0czsgIC8vIGxpc3Qgb2YgcmVnaXN0ZXJlZCBhdWRpbyBlZmZlY3RzCiAgICAgICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1EZWZhdWx0T3V0cHV0RGV2aWNlOyAvLyBvdXRwdXQgZGV2aWNlIHNlbGVjdGVkIGJ5IGRlZmF1bHQgYXQgYm9vdCB0aW1lCi0gICAgICAgIEh3TW9kdWxlQ29sbGVjdGlvbiBtSHdNb2R1bGVzOyAvLyBjb250YWlucyBvbmx5IG1vZHVsZXMgdGhhdCBoYXZlIGJlZW4gbG9hZGVkIHN1Y2Nlc3NmdWxseQotICAgICAgICBId01vZHVsZUNvbGxlY3Rpb24gbUh3TW9kdWxlc0FsbDsgLy8gbm9ybWFsbHkgbm90IG5lZWRlZCwgdXNlZCBkdXJpbmcgY29uc3RydWN0aW9uIGFuZCBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGR1bXBzCisgICAgICAgIEh3TW9kdWxlQ29sbGVjdGlvbiBtSHdNb2R1bGVzOyAvLyBjb250YWlucyBtb2R1bGVzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCBzdWNjZXNzZnVsbHkKKyAgICAgICAgSHdNb2R1bGVDb2xsZWN0aW9uIG1Id01vZHVsZXNBbGw7IC8vIGNvbnRhaW5zIGFsbCBtb2R1bGVzIGRlY2xhcmVkIGluIHRoZSBjb25maWcKKwogICAgICAgICBBdWRpb1BvbGljeUNvbmZpZyBtQ29uZmlnOwogCiAgICAgICAgIHN0ZDo6YXRvbWljPHVpbnQzMl90PiBtQXVkaW9Qb3J0R2VuZXJhdGlvbjsKQEAgLTU4NCw3ICs3NDYsNyBAQAogICAgICAgICBzcDxBdWRpb1BhdGNoPiBtQ2FsbFJ4UGF0Y2g7CiAKICAgICAgICAgSHdBdWRpb091dHB1dENvbGxlY3Rpb24gbUh3T3V0cHV0czsKLSAgICAgICAgQXVkaW9Tb3VyY2VDb2xsZWN0aW9uIG1BdWRpb1NvdXJjZXM7CisgICAgICAgIFNvdXJjZUNsaWVudENvbGxlY3Rpb24gbUF1ZGlvU291cmNlczsKIAogICAgICAgICAvLyBmb3Igc3VwcG9ydGluZyAiYmVhY29uIiBzdHJlYW1zLCBpLmUuIHN0cmVhbXMgdGhhdCBvbmx5IHBsYXkgb24gc3BlYWtlciwgYW5kIG5ldmVyCiAgICAgICAgIC8vIHdoZW4gc29tZXRoaW5nIG90aGVyIHRoYW4gU1RSRUFNX1RUUyAoYS5rLmEuICJUcmFuc21pdHRlZCBUaHJvdWdoIFNwZWFrZXIiKSBpcyBwbGF5aW5nCkBAIC02MDYsMTkgKzc2OCwzMyBAQAogICAgICAgICB1aW50MzJfdCBuZXh0QXVkaW9Qb3J0R2VuZXJhdGlvbigpOwogCiAgICAgICAgIC8vIEF1ZGlvIFBvbGljeSBFbmdpbmUgSW50ZXJmYWNlLgotICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJJbnRlcmZhY2UgKm1FbmdpbmU7CisgICAgICAgIEVuZ2luZUluc3RhbmNlIG1FbmdpbmU7CiAKLSAgICAgICAgLy8gU3Vycm91bmQgZm9ybWF0cyB0aGF0IGFyZSBlbmFibGVkLgotICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8YXVkaW9fZm9ybWF0X3Q+IG1TdXJyb3VuZEZvcm1hdHM7CisgICAgICAgIC8vIFN1cnJvdW5kIGZvcm1hdHMgdGhhdCBhcmUgZW5hYmxlZCBtYW51YWxseS4gVGFrZW4gaW50byBhY2NvdW50IHdoZW4KKyAgICAgICAgLy8gImVuY29kZWQgc3Vycm91bmQiIGlzIGZvcmNlZCBpbnRvICJtYW51YWwiIG1vZGUuCisgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19mb3JtYXRfdD4gbU1hbnVhbFN1cnJvdW5kRm9ybWF0czsKKworICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIGF1ZGlvX2ZsYWdzX21hc2tfdD4gbUFsbG93ZWRDYXB0dXJlUG9saWNpZXM7CiBwcml2YXRlOgotICAgICAgICAvLyBBZGQgb3IgcmVtb3ZlIEFDMyBEVFMgZW5jb2RpbmdzIGJhc2VkIG9uIHVzZXIgcHJlZmVyZW5jZXMuCi0gICAgICAgIHZvaWQgZmlsdGVyU3Vycm91bmRGb3JtYXRzKEZvcm1hdFZlY3RvciAqZm9ybWF0c1B0cik7Ci0gICAgICAgIHZvaWQgZmlsdGVyU3Vycm91bmRDaGFubmVsTWFza3MoQ2hhbm5lbHNWZWN0b3IgKmNoYW5uZWxNYXNrc1B0cik7CisgICAgICAgIHZvaWQgb25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGVJbnQoRGV2aWNlVmVjdG9yICpuZXdEZXZpY2VzKTsKIAotICAgICAgICBzdGF0dXNfdCBnZXRTdXBwb3J0ZWRGb3JtYXRzKGF1ZGlvX2lvX2hhbmRsZV90IGlvSGFuZGxlLCBGb3JtYXRWZWN0b3ImIGZvcm1hdHMpOworICAgICAgICAvLyBBZGQgb3IgcmVtb3ZlIEFDMyBEVFMgZW5jb2RpbmdzIGJhc2VkIG9uIHVzZXIgcHJlZmVyZW5jZXMuCisgICAgICAgIHZvaWQgbW9kaWZ5U3Vycm91bmRGb3JtYXRzKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+JiBkZXZEZXNjLCBGb3JtYXRWZWN0b3IgKmZvcm1hdHNQdHIpOworICAgICAgICB2b2lkIG1vZGlmeVN1cnJvdW5kQ2hhbm5lbE1hc2tzKENoYW5uZWxNYXNrU2V0ICpjaGFubmVsTWFza3NQdHIpOworCisgICAgICAgIC8vIFN1cHBvcnQgZm9yIE11bHRpLVN0cmVhbSBEZWNvZGVyIChNU0QpIG1vZHVsZQorICAgICAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBnZXRNc2RBdWRpb0luRGV2aWNlKCkgY29uc3Q7CisgICAgICAgIERldmljZVZlY3RvciBnZXRNc2RBdWRpb091dERldmljZXMoKSBjb25zdDsKKyAgICAgICAgY29uc3QgQXVkaW9QYXRjaENvbGxlY3Rpb24gZ2V0TXNkUGF0Y2hlcygpIGNvbnN0OworICAgICAgICBzdGF0dXNfdCBnZXRCZXN0TXNkQXVkaW9Qcm9maWxlRm9yKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZvdXRwdXREZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBod0F2U3luYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfY29uZmlnICpzaW5rQ29uZmlnKSBjb25zdDsKKyAgICAgICAgUGF0Y2hCdWlsZGVyIGJ1aWxkTXNkUGF0Y2goY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJm91dHB1dERldmljZSkgY29uc3Q7CisgICAgICAgIHN0YXR1c190IHNldE1zZFBhdGNoKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZvdXRwdXREZXZpY2UgPSBudWxscHRyKTsKIAogICAgICAgICAvLyBJZiBhbnksIHJlc29sdmUgYW55ICJkeW5hbWljIiBmaWVsZHMgb2YgYW4gQXVkaW8gUHJvZmlsZXMgY29sbGVjdGlvbgotICAgICAgICB2b2lkIHVwZGF0ZUF1ZGlvUHJvZmlsZXMoYXVkaW9fZGV2aWNlc190IGRldmljZSwgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCisgICAgICAgIHZvaWQgdXBkYXRlQXVkaW9Qcm9maWxlcyhjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiYgZGV2RGVzYywgYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgQXVkaW9Qcm9maWxlVmVjdG9yICZwcm9maWxlcyk7CiAKICAgICAgICAgLy8gTm90aWZ5IHRoZSBwb2xpY3kgY2xpZW50IG9mIGFueSBjaGFuZ2Ugb2YgZGV2aWNlIHN0YXRlIHdpdGggQVVESU9fSU9fSEFORExFX05PTkUsCkBAIC02MjYsNDIgKzgwMiw1OCBAQAogICAgICAgICAvLyBJdCBjYW4gZ2l2ZSBhIGNoYW5jZSB0byBIQUwgaW1wbGVtZW50ZXIgdG8gcmV0cmlldmUgZHluYW1pYyBjYXBhYmlsaXRpZXMgYXNzb2NpYXRlZAogICAgICAgICAvLyB0byB0aGlzIGRldmljZSBmb3IgZXhhbXBsZS4KICAgICAgICAgLy8gVE9ETyBhdm9pZCBvcGVuaW5nIHN0cmVhbSB0byByZXRyaWV2ZSBjYXBhYmlsaXRpZXMgb2YgYSBwcm9maWxlLgotICAgICAgICB2b2lkIGJyb2FkY2FzdERldmljZUNvbm5lY3Rpb25TdGF0ZShhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzggJmRldmljZV9hZGRyZXNzKTsKKyAgICAgICAgdm9pZCBicm9hZGNhc3REZXZpY2VDb25uZWN0aW9uU3RhdGUoY29uc3Qgc3A8RGV2aWNlRGVzY3JpcHRvcj4gJmRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKTsKIAogICAgICAgICAvLyB1cGRhdGVzIGRldmljZSBjYWNoaW5nIGFuZCBvdXRwdXQgZm9yIHN0cmVhbXMgdGhhdCBjYW4gaW5mbHVlbmNlIHRoZQogICAgICAgICAvLyAgICByb3V0aW5nIG9mIG5vdGlmaWNhdGlvbnMKICAgICAgICAgdm9pZCBoYW5kbGVOb3RpZmljYXRpb25Sb3V0aW5nRm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICAgICAgLy8gZmluZCB0aGUgb3V0cHV0cyBvbiBhIGdpdmVuIG91dHB1dCBkZXNjcmlwdG9yIHRoYXQgaGF2ZSB0aGUgZ2l2ZW4gYWRkcmVzcy4KLSAgICAgICAgLy8gdG8gYmUgY2FsbGVkIG9uIGFuIEF1ZGlvT3V0cHV0RGVzY3JpcHRvciB3aG9zZSBzdXBwb3J0ZWQgZGV2aWNlcyAoYXMgZGVmaW5lZAotICAgICAgICAvLyAgIGluIG1Qcm9maWxlLT5tU3VwcG9ydGVkRGV2aWNlcykgbWF0Y2hlcyB0aGUgZGV2aWNlIHdob3NlIGFkZHJlc3MgaXMgdG8gYmUgbWF0Y2hlZC4KLSAgICAgICAgLy8gc2VlIGRldmljZURpc3Rpbmd1aXNoZXNPbkFkZHJlc3MoYXVkaW9fZGV2aWNlc190KSBmb3Igd2hldGhlciB0aGUgZGV2aWNlIHR5cGUgaXMgb25lCi0gICAgICAgIC8vICAgd2hlcmUgYWRkcmVzc2VzIGFyZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gb25lIGNvbm5lY3RlZCBkZXZpY2UgYW5kIGFub3RoZXIuCi0gICAgICAgIHZvaWQgZmluZElvSGFuZGxlc0J5QWRkcmVzcyhjb25zdCBzcDxTd0F1ZGlvT3V0cHV0RGVzY3JpcHRvcj4mIGRlc2MgLyppbiovLAotICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBkZXZpY2UgLyppbiovLAotICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzgmIGFkZHJlc3MgLyppbiovLAotICAgICAgICAgICAgICAgIFNvcnRlZFZlY3RvcjxhdWRpb19pb19oYW5kbGVfdD4mIG91dHB1dHMgLypvdXQqLyk7CiAgICAgICAgIHVpbnQzMl90IGN1ckF1ZGlvUG9ydEdlbmVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtQXVkaW9Qb3J0R2VuZXJhdGlvbjsgfQorICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QsIGdldCBhdWRpb19hdHRyaWJ1dGVzX3QgZnJvbSBlaXRoZXIgYSBzb3VyY2UgYXVkaW9fYXR0cmlidXRlc190CisgICAgICAgIC8vIG9yIGF1ZGlvX3N0cmVhbV90eXBlX3QsIHJlc3BlY3RpdmVseS4KKyAgICAgICAgc3RhdHVzX3QgZ2V0QXVkaW9BdHRyaWJ1dGVzKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqZHN0QXR0ciwKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKnNyY0F0dHIsCisgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzcmNTdHJlYW0pOworICAgICAgICAvLyBpbnRlcm5hbCBtZXRob2QsIGNhbGxlZCBieSBnZXRPdXRwdXRGb3JBdHRyKCkgYW5kIGNvbm5lY3RBdWRpb1NvdXJjZS4KKyAgICAgICAgc3RhdHVzX3QgZ2V0T3V0cHV0Rm9yQXR0ckludChhdWRpb19hdHRyaWJ1dGVzX3QgKnJlc3VsdEF0dHIsCisgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIsCisgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAorICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKKyAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgICAgIGJvb2wgKmlzUmVxdWVzdGVkRGV2aWNlRm9yRXhjbHVzaXZlVXNlLAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNwPFN3QXVkaW9PdXRwdXREZXNjcmlwdG9yPj4gKnNlY29uZGFyeURlc2NzKTsKICAgICAgICAgLy8gaW50ZXJuYWwgbWV0aG9kIHRvIHJldHVybiB0aGUgb3V0cHV0IGhhbmRsZSBmb3IgdGhlIGdpdmVuIGRldmljZSBhbmQgZm9ybWF0Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dEZvckRldmljZSgKLSAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAorICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRPdXRwdXRGb3JEZXZpY2VzKAorICAgICAgICAgICAgICAgIGNvbnN0IERldmljZVZlY3RvciAmZGV2aWNlcywKICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbiwKICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncyk7Ci0gICAgICAgIC8vIGludGVybmFsIG1ldGhvZCB0byByZXR1cm4gdGhlIGlucHV0IGhhbmRsZSBmb3IgdGhlIGdpdmVuIGRldmljZSBhbmQgZm9ybWF0Ci0gICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGdldElucHV0Rm9yRGV2aWNlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCi0gICAgICAgICAgICAgICAgU3RyaW5nOCBhZGRyZXNzLAorICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190ICpmbGFncywKKyAgICAgICAgICAgICAgICBib29sIGZvcmNlTXV0aW5nSGFwdGljID0gZmFsc2UpOworCisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgZ2V0SW5wdXRGb3JEZXZpY2Ugc2VsZWN0cyBhbiBpbnB1dCBoYW5kbGUgZm9yIGEgZ2l2ZW4gaW5wdXQgZGV2aWNlIGFuZAorICAgICAgICAgKiByZXF1ZXN0ZXIgY29udGV4dAorICAgICAgICAgKiBAcGFyYW0gZGV2aWNlIHRvIGJlIHVzZWQgYnkgcmVxdWVzdGVyLCBzZWxlY3RlZCBieSBwb2xpY3kgbWl4IHJ1bGVzIG9yIGVuZ2luZQorICAgICAgICAgKiBAcGFyYW0gc2Vzc2lvbiByZXF1ZXN0ZXIgc2Vzc2lvbiBpZAorICAgICAgICAgKiBAcGFyYW0gdWlkIHJlcXVlc3RlciB1aWQKKyAgICAgICAgICogQHBhcmFtIGF0dHJpYnV0ZXMgcmVxdWVzdGVyIGF1ZGlvIGF0dHJpYnV0ZXMgKGUuZy4gaW5wdXQgc291cmNlIGFuZCB0YWdzIG1hdHRlcikKKyAgICAgICAgICogQHBhcmFtIGNvbmZpZyByZXF1ZXN0ZXIgYXVkaW8gY29uZmlndXJhdGlvbiAoZS5nLiBzYW1wbGUgcmF0ZSwgZm9ybWF0LCBjaGFubmVsIG1hc2spLgorICAgICAgICAgKiBAcGFyYW0gZmxhZ3MgcmVxdWVzdGVyIGlucHV0IGZsYWdzCisgICAgICAgICAqIEBwYXJhbSBwb2xpY3lNaXggbWF5IGJlIG51bGwsIHBvbGljeSBydWxlcyB0byBiZSBmb2xsb3dlZCBieSB0aGUgcmVxdWVzdGVyCisgICAgICAgICAqIEByZXR1cm4gaW5wdXQgaW8gaGFuZGxlIGFrYSB1bmlxdWUgaW5wdXQgaWRlbnRpZmllciBzZWxlY3RlZCBmb3IgdGhpcyBkZXZpY2UuCisgICAgICAgICAqLworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBnZXRJbnB1dEZvckRldmljZShjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yPiAmZGV2aWNlLAogICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAotICAgICAgICAgICAgICAgIHVpZF90IHVpZCwKLSAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKKyAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY29uZmlnLAogICAgICAgICAgICAgICAgIGF1ZGlvX2lucHV0X2ZsYWdzX3QgZmxhZ3MsCi0gICAgICAgICAgICAgICAgQXVkaW9NaXggKnBvbGljeU1peCk7CisgICAgICAgICAgICAgICAgY29uc3Qgc3A8QXVkaW9Qb2xpY3lNaXg+ICZwb2xpY3lNaXgpOwogCi0gICAgICAgIC8vIGludGVybmFsIGZ1bmN0aW9uIHRvIGRlcml2ZSBhIHN0cmVhbSB0eXBlIHZhbHVlIGZyb20gYXVkaW8gYXR0cmlidXRlcwotICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbVR5cGVmcm9tQXR0cmlidXRlc0ludChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHIpOwogICAgICAgICAvLyBldmVudCBpcyBvbmUgb2YgU1RBUlRJTkdfT1VUUFVULCBTVEFSVElOR19CRUFDT04sIFNUT1BQSU5HX09VVFBVVCwgU1RPUFBJTkdfQkVBQ09OCiAgICAgICAgIC8vIHJldHVybnMgMCBpZiBubyBtdXRlL3VubXV0ZSBldmVudCBoYXBwZW5lZCwgdGhlIGxhcmdlc3QgbGF0ZW5jeSBvZiB0aGUgZGV2aWNlIHdoZXJlCiAgICAgICAgIC8vICAgdGhlIG11dGUvdW5tdXRlIGhhcHBlbmVkCkBAIC02NjksMjUgKzg2MSw2MCBAQAogICAgICAgICB1aW50MzJfdCBzZXRCZWFjb25NdXRlKGJvb2wgbXV0ZSk7CiAgICAgICAgIGJvb2wgICAgIGlzVmFsaWRBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqcGFhKTsKIAotICAgICAgICAvLyBzZWxlY3QgaW5wdXQgZGV2aWNlIGNvcnJlc3BvbmRpbmcgdG8gcmVxdWVzdGVkIGF1ZGlvIHNvdXJjZSBhbmQgcmV0dXJuIGFzc29jaWF0ZWQgcG9saWN5Ci0gICAgICAgIC8vIG1peCBpZiBhbnkuIENhbGxzIGdldERldmljZUZvcklucHV0U291cmNlKCkuCi0gICAgICAgIGF1ZGlvX2RldmljZXNfdCBnZXREZXZpY2VBbmRNaXhGb3JJbnB1dFNvdXJjZShhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9NaXggKipwb2xpY3lNaXggPSBOVUxMKTsKLQogICAgICAgICAvLyBDYWxsZWQgYnkgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKCkuCi0gICAgICAgIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChhdWRpb19kZXZpY2VzX3QgZGV2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgIHN0YXR1c190IHNldERldmljZUNvbm5lY3Rpb25TdGF0ZUludChhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KTsKKyAgICAgICAgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlSW50KGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+ICZkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3Qgc3RhdGUpOworCisgICAgICAgIHZvaWQgc2V0RW5naW5lRGV2aWNlQ29ubmVjdGlvblN0YXRlKGNvbnN0IHNwPERldmljZURlc2NyaXB0b3I+IGRldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlKTsKKwogICAgICAgICB2b2lkIHVwZGF0ZU1vbm8oYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0KSB7CiAgICAgICAgICAgICBBdWRpb1BhcmFtZXRlciBwYXJhbTsKICAgICAgICAgICAgIHBhcmFtLmFkZEludChTdHJpbmc4KEF1ZGlvUGFyYW1ldGVyOjprZXlNb25vT3V0cHV0KSwgKGludCltTWFzdGVyTW9ubyk7CiAgICAgICAgICAgICBtcENsaWVudEludGVyZmFjZS0+c2V0UGFyYW1ldGVycyhvdXRwdXQsIHBhcmFtLnRvU3RyaW5nKCkpOwogICAgICAgICB9CiAKLSAgICAgICAgYm9vbCBzb3VuZFRyaWdnZXJTdXBwb3J0c0NvbmN1cnJlbnRDYXB0dXJlKCk7Ci0gICAgICAgIGJvb2wgbVNvdW5kVHJpZ2dlclN1cHBvcnRzQ29uY3VycmVudENhcHR1cmU7Ci0gICAgICAgIGJvb2wgbUhhc0NvbXB1dGVkU291bmRUcmlnZ2VyU3VwcG9ydHNDb25jdXJyZW50Q2FwdHVyZTsKKyAgICAgICAgLyoqCisgICAgICAgICAqIEBicmllZiBjcmVhdGVBdWRpb1BhdGNoSW50ZXJuYWwgaW50ZXJuYWwgZnVuY3Rpb24gdG8gbWFuYWdlIGF1ZGlvIHBhdGNoIGNyZWF0aW9uCisgICAgICAgICAqIEBwYXJhbVtpbl0gcGF0Y2ggc3RydWN0dXJlIGNvbnRhaW5pbmcgc2luayBhbmQgc291cmNlIHBvcnRzIGNvbmZpZ3VyYXRpb24KKyAgICAgICAgICogQHBhcmFtW291dF0gaGFuZGxlIHBhdGNoIGhhbmRsZSB0byBiZSBwcm92aWRlZCBpZiBwYXRjaCBpbnN0YWxsZWQgY29ycmVjdGx5CisgICAgICAgICAqIEBwYXJhbVtpbl0gdWlkIG9mIHRoZSBjbGllbnQKKyAgICAgICAgICogQHBhcmFtW2luXSBkZWxheU1zIGlmIHJlcXVpcmVkCisgICAgICAgICAqIEBwYXJhbVtpbl0gc291cmNlRGVzYyBbb3B0aW9uYWxdIGluIGNhc2Ugb2YgZXh0ZXJuYWwgc291cmNlLCBzb3VyY2UgY2xpZW50IHRvIGJlCisgICAgICAgICAqIGNvbmZpZ3VyZWQgYnkgdGhlIHBhdGNoLCBpLmUuIGFzc2lnbmluZyBhbiBPdXRwdXQgKEhXIG9yIFNXKQorICAgICAgICAgKiBAcmV0dXJuIE5PX0VSUk9SIGlmIHBhdGNoIGluc3RhbGxlZCBjb3JyZWNsdHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaEludGVybmFsKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLCB1aW50MzJfdCBkZWxheU1zID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPFNvdXJjZUNsaWVudERlc2NyaXB0b3I+JiBzb3VyY2VEZXNjID0gbnVsbHB0cik7CisgICAgICAgIC8qKgorICAgICAgICAgKiBAYnJpZWYgcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbCBpbnRlcm5hbCBmdW5jdGlvbiB0byByZW1vdmUgYW4gYXVkaW8gcGF0Y2gKKyAgICAgICAgICogQHBhcmFtW2luXSBoYW5kbGUgb2YgdGhlIHBhdGNoIHRvIGJlIHJlbW92ZWQKKyAgICAgICAgICogQHBhcmFtW2luXSBkZWxheU1zIGlmIHJlcXVpcmVkCisgICAgICAgICAqIEByZXR1cm4gTk9fRVJST1IgaWYgcGF0Y2ggcmVtb3ZlZCBjb3JyZWNsdHksIGVycm9yIGNvZGUgb3RoZXJ3aXNlLgorICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2hJbnRlcm5hbChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsIHVpbnQzMl90IGRlbGF5TXMgPSAwKTsKKworICAgICAgICBzdGF0dXNfdCBpbnN0YWxsUGF0Y2goY29uc3QgY2hhciAqY2FsbGVyLAorICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICBBdWRpb0lPRGVzY3JpcHRvckludGVyZmFjZSAqaW9EZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOworICAgICAgICBzdGF0dXNfdCBpbnN0YWxsUGF0Y2goY29uc3QgY2hhciAqY2FsbGVyLAorICAgICAgICAgICAgICAgIHNzaXplX3QgaW5kZXgsCisgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKnBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCisgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMsCisgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgIHNwPEF1ZGlvUGF0Y2g+ICpwYXRjaERlc2NQdHIpOworCisgICAgICAgIHZvaWQgY2xlYW5VcEVmZmVjdHNGb3JJbyhhdWRpb19pb19oYW5kbGVfdCBpbyk7CiB9OwogCiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvRW5naW5lTGlicmFyeS5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9tYW5hZ2VyZGVmYXVsdC9FbmdpbmVMaWJyYXJ5LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZjY5OWFhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvRW5naW5lTGlicmFyeS5jcHAKQEAgLTAsMCArMSw3OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJBUE1fRW5naW5lTG9hZGVyIgorCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkVuZ2luZUxpYnJhcnkuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzdGF0aWMKK3N0ZDo6c2hhcmVkX3B0cjxFbmdpbmVMaWJyYXJ5PiBFbmdpbmVMaWJyYXJ5Ojpsb2FkKHN0ZDo6c3RyaW5nIGxpYnJhcnlQYXRoKQoreworICAgIHN0ZDo6c2hhcmVkX3B0cjxFbmdpbmVMaWJyYXJ5PiBlbmdMaWIobmV3IEVuZ2luZUxpYnJhcnkoKSk7CisgICAgcmV0dXJuIGVuZ0xpYi0+aW5pdChzdGQ6Om1vdmUobGlicmFyeVBhdGgpKSA/IGVuZ0xpYiA6IG51bGxwdHI7Cit9CisKK0VuZ2luZUxpYnJhcnk6On5FbmdpbmVMaWJyYXJ5KCkKK3sKKyAgICBjbG9zZSgpOworfQorCitib29sIEVuZ2luZUxpYnJhcnk6OmluaXQoc3RkOjpzdHJpbmcgbGlicmFyeVBhdGgpCit7CisgICAgbUxpYnJhcnlIYW5kbGUgPSBkbG9wZW4obGlicmFyeVBhdGguY19zdHIoKSwgMCk7CisgICAgaWYgKG1MaWJyYXJ5SGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkNvdWxkIG5vdCBkbG9wZW4gJXM6ICVzIiwgbGlicmFyeVBhdGguY19zdHIoKSwgZGxlcnJvcigpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtQ3JlYXRlRW5naW5lSW5zdGFuY2UgPSAoRW5naW5lSW50ZXJmYWNlKiAoKikoKSlkbHN5bShtTGlicmFyeUhhbmRsZSwgImNyZWF0ZUVuZ2luZUluc3RhbmNlIik7CisgICAgbURlc3Ryb3lFbmdpbmVJbnN0YW5jZSA9ICh2b2lkICgqKShFbmdpbmVJbnRlcmZhY2UqKSlkbHN5bSgKKyAgICAgICAgICAgIG1MaWJyYXJ5SGFuZGxlLCAiZGVzdHJveUVuZ2luZUluc3RhbmNlIik7CisgICAgaWYgKG1DcmVhdGVFbmdpbmVJbnN0YW5jZSA9PSBudWxscHRyIHx8IG1EZXN0cm95RW5naW5lSW5zdGFuY2UgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQ291bGQgbm90IGZpbmQgZW5naW5lIGludGVyZmFjZSBmdW5jdGlvbnMgaW4gJXMiLCBsaWJyYXJ5UGF0aC5jX3N0cigpKTsKKyAgICAgICAgY2xvc2UoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBBTE9HRCgiTG9hZGVkIGVuZ2luZSBmcm9tICVzIiwgbGlicmFyeVBhdGguY19zdHIoKSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK0VuZ2luZUluc3RhbmNlIEVuZ2luZUxpYnJhcnk6OmNyZWF0ZUVuZ2luZSgpCit7CisgICAgaWYgKG1DcmVhdGVFbmdpbmVJbnN0YW5jZSA9PSBudWxscHRyIHx8IG1EZXN0cm95RW5naW5lSW5zdGFuY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gRW5naW5lSW5zdGFuY2UoKTsKKyAgICB9CisgICAgcmV0dXJuIEVuZ2luZUluc3RhbmNlKG1DcmVhdGVFbmdpbmVJbnN0YW5jZSgpLAorICAgICAgICAgICAgW2xpYiA9IHNoYXJlZF9mcm9tX3RoaXMoKSwgZGVzdHJveSA9IG1EZXN0cm95RW5naW5lSW5zdGFuY2VdIChFbmdpbmVJbnRlcmZhY2UqIGUpIHsKKyAgICAgICAgICAgICAgICBkZXN0cm95KGUpOworICAgICAgICAgICAgfSk7Cit9CisKK3ZvaWQgRW5naW5lTGlicmFyeTo6Y2xvc2UoKQoreworICAgIGlmIChtTGlicmFyeUhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgIGRsY2xvc2UobUxpYnJhcnlIYW5kbGUpOworICAgIH0KKyAgICBtTGlicmFyeUhhbmRsZSA9IG51bGxwdHI7CisgICAgbUNyZWF0ZUVuZ2luZUluc3RhbmNlID0gbnVsbHB0cjsKKyAgICBtRGVzdHJveUVuZ2luZUluc3RhbmNlID0gbnVsbHB0cjsKK30KKworfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0VuZ2luZUxpYnJhcnkuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L21hbmFnZXJkZWZhdWx0L0VuZ2luZUxpYnJhcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTQzOTE2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvbWFuYWdlcmRlZmF1bHQvRW5naW5lTGlicmFyeS5oCkBAIC0wLDAgKzEsNTEgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNwcmFnbWEgb25jZQorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSA8RW5naW5lSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKwordXNpbmcgRW5naW5lSW5zdGFuY2UgPSBzdGQ6OnVuaXF1ZV9wdHI8RW5naW5lSW50ZXJmYWNlLCBzdGQ6OmZ1bmN0aW9uPHZvaWQgKEVuZ2luZUludGVyZmFjZSopPj47CisKK2NsYXNzIEVuZ2luZUxpYnJhcnkgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxFbmdpbmVMaWJyYXJ5PiB7CitwdWJsaWM6CisgICAgc3RhdGljIHN0ZDo6c2hhcmVkX3B0cjxFbmdpbmVMaWJyYXJ5PiBsb2FkKHN0ZDo6c3RyaW5nIGxpYnJhcnlQYXRoKTsKKyAgICB+RW5naW5lTGlicmFyeSgpOworCisgICAgRW5naW5lTGlicmFyeShjb25zdCBFbmdpbmVMaWJyYXJ5JikgPSBkZWxldGU7CisgICAgRW5naW5lTGlicmFyeShFbmdpbmVMaWJyYXJ5JiYpID0gZGVsZXRlOworICAgIEVuZ2luZUxpYnJhcnkmIG9wZXJhdG9yPShjb25zdCBFbmdpbmVMaWJyYXJ5JikgPSBkZWxldGU7CisgICAgRW5naW5lTGlicmFyeSYgb3BlcmF0b3I9KEVuZ2luZUxpYnJhcnkmJikgPSBkZWxldGU7CisKKyAgICBFbmdpbmVJbnN0YW5jZSBjcmVhdGVFbmdpbmUoKTsKKworcHJpdmF0ZToKKyAgICBFbmdpbmVMaWJyYXJ5KCkgPSBkZWZhdWx0OworICAgIGJvb2wgaW5pdChzdGQ6OnN0cmluZyBsaWJyYXJ5UGF0aCk7CisgICAgdm9pZCBjbG9zZSgpOworCisgICAgdm9pZCAqbUxpYnJhcnlIYW5kbGUgPSBudWxscHRyOworICAgIEVuZ2luZUludGVyZmFjZSogKCptQ3JlYXRlRW5naW5lSW5zdGFuY2UpKCkgPSBudWxscHRyOworICAgIHZvaWQgKCptRGVzdHJveUVuZ2luZUluc3RhbmNlKShFbmdpbmVJbnRlcmZhY2UqKSA9IG51bGxwdHI7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BbmRyb2lkLm1rCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZjNlYWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTAsMCArMSw0OCBAQAorTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCisKK2luY2x1ZGUgJChDTEVBUl9WQVJTKQorCitMT0NBTF9TUkNfRklMRVM6PSBcCisgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBcCisgICAgQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcCBcCisgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcCBcCisgICAgQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAorCitMT0NBTF9DX0lOQ0xVREVTIDo9IFwKKyAgICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvZmxpbmdlciBcCisgICAgJChjYWxsIGluY2x1ZGUtcGF0aC1mb3IsIGF1ZGlvLXV0aWxzKQorCitMT0NBTF9IRUFERVJfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJhdWRpb3BvbGljeWNvbW1vbiBcCisgICAgbGliYXVkaW9wb2xpY3llbmdpbmVfaW50ZXJmYWNlX2hlYWRlcnMgXAorICAgIGxpYmF1ZGlvcG9saWN5bWFuYWdlcl9pbnRlcmZhY2VfaGVhZGVycworCitMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKKyAgICBsaWJjdXRpbHMgXAorICAgIGxpYnV0aWxzIFwKKyAgICBsaWJsb2cgXAorICAgIGxpYmJpbmRlciBcCisgICAgbGliYXVkaW9jbGllbnQgXAorICAgIGxpYmF1ZGlvdXRpbHMgXAorICAgIGxpYmF1ZGlvZm91bmRhdGlvbiBcCisgICAgbGliaGFyZHdhcmVfbGVnYWN5IFwKKyAgICBsaWJhdWRpb3BvbGljeW1hbmFnZXIgXAorICAgIGxpYm1lZGlhX2hlbHBlciBcCisgICAgbGlibWVkaWFtZXRyaWNzIFwKKyAgICBsaWJtZWRpYXV0aWxzIFwKKyAgICBsaWJlZmZlY3RzY29uZmlnIFwKKyAgICBsaWJzZW5zb3Jwcml2YWN5CisKK0xPQ0FMX0VYUE9SVF9TSEFSRURfTElCUkFSWV9IRUFERVJTIDo9IFwKKyAgICBsaWJzZW5zb3Jwcml2YWN5CisKK0xPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAorICAgIGxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cworCitMT0NBTF9NT0RVTEU6PSBsaWJhdWRpb3BvbGljeXNlcnZpY2UKKworTE9DQUxfQ0ZMQUdTICs9IC1mdmlzaWJpbGl0eT1oaWRkZW4KK0xPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCisKK2luY2x1ZGUgJChCVUlMRF9TSEFSRURfTElCUkFSWSkKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUNsaWVudEltcGwuY3BwCmluZGV4IGIwNjRmOGMuLjZkZTBjODAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lDbGllbnRJbXBsLmNwcAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5Q2xpZW50SW1wbC5jcHAKQEAgLTM5LDggKzM5LDcgQEAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6Om9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBhZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxEZXZpY2VEZXNjcmlwdG9yQmFzZT4mIGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmxhdGVuY3lNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MpCiB7CkBAIC00OSw3ICs0OCw3IEBACiAgICAgICAgIEFMT0dXKCIlczogY291bGQgbm90IGdldCBBdWRpb0ZsaW5nZXIiLCBfX2Z1bmNfXyk7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9Ci0gICAgcmV0dXJuIGFmLT5vcGVuT3V0cHV0KG1vZHVsZSwgb3V0cHV0LCBjb25maWcsIGRldmljZXMsIGFkZHJlc3MsIGxhdGVuY3lNcywgZmxhZ3MpOworICAgIHJldHVybiBhZi0+b3Blbk91dHB1dChtb2R1bGUsIG91dHB1dCwgY29uZmlnLCBkZXZpY2UsIGxhdGVuY3lNcywgZmxhZ3MpOwogfQogCiBhdWRpb19pb19oYW5kbGVfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpvcGVuRHVwbGljYXRlT3V0cHV0KApAQCAtMTU1LDE3ICsxNTQsNiBAQAogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Qb2xpY3lDbGllbnQ6OnN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCi0gICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdGFydFRvbmUodG9uZSwgc3RyZWFtKTsKLX0KLQotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6c3RvcFRvbmUoKQotewotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zdG9wVG9uZSgpOwotfQotCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzZXRWb2ljZVZvbHVtZShmbG9hdCB2b2x1bWUsIGludCBkZWxheV9tcykKIHsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5U2VydmljZS0+c2V0Vm9pY2VWb2x1bWUodm9sdW1lLCBkZWxheV9tcyk7CkBAIC0xODMsNiArMTcxLDEzIEBACiAgICAgcmV0dXJuIGFmLT5tb3ZlRWZmZWN0cyhzZXNzaW9uLCBzcmNfb3V0cHV0LCBkc3Rfb3V0cHV0KTsKIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpzZXRFZmZlY3RTdXNwZW5kZWQoaW50IGVmZmVjdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmRlZCkKK3sKKyAgICBtQXVkaW9Qb2xpY3lTZXJ2aWNlLT5zZXRFZmZlY3RTdXNwZW5kZWQoZWZmZWN0SWQsIHNlc3Npb25JZCwgc3VzcGVuZGVkKTsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6Y3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxheU1zKQpAQCAtMjIwLDEyICsyMTUsMjMgQEAKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCi0gICAgICAgIGludCBldmVudCwgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKQogewogICAgIG1BdWRpb1BvbGljeVNlcnZpY2UtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgY2xpZW50SW5mbywKLSAgICAgICAgICAgIGNsaWVudENvbmZpZywgZGV2aWNlQ29uZmlnLCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICBjbGllbnRDb25maWcsIGNsaWVudEVmZmVjdHMsIGRldmljZUNvbmZpZywgZWZmZWN0cywgcGF0Y2hIYW5kbGUsIHNvdXJjZSk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb1BvbGljeUNsaWVudDo6b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MpCit7CisgICAgbUF1ZGlvUG9saWN5U2VydmljZS0+b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZChncm91cCwgZmxhZ3MpOwogfQogCiBhdWRpb191bmlxdWVfaWRfdCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvUG9saWN5Q2xpZW50OjpuZXdBdWRpb1VuaXF1ZUlkKGF1ZGlvX3VuaXF1ZV9pZF91c2VfdCB1c2UpCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5jcHAKaW5kZXggNGExY2FiNC4uNzM4YTI3OSAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmNwcApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9FZmZlY3QuaD4KICNpbmNsdWRlIDxtZWRpYS9FZmZlY3RzQ29uZmlnLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX2VmZmVjdHMvYXVkaW9fZWZmZWN0c19jb25mLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CkBAIC0zMSw3ICszMiw2IEBACiAjaW5jbHVkZSA8Y3V0aWxzL2NvbmZpZ191dGlscy5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5RWZmZWN0cy5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCkBAIC00Miw3ICs0MiwxMCBAQAogQXVkaW9Qb2xpY3lFZmZlY3RzOjpBdWRpb1BvbGljeUVmZmVjdHMoKQogewogICAgIHN0YXR1c190IGxvYWRSZXN1bHQgPSBsb2FkQXVkaW9FZmZlY3RYbWxDb25maWcoKTsKLSAgICBpZiAobG9hZFJlc3VsdCA8IDApIHsKKyAgICBpZiAobG9hZFJlc3VsdCA9PSBOT19FUlJPUikgeworICAgICAgICBtRGVmYXVsdERldmljZUVmZmVjdEZ1dHVyZSA9IHN0ZDo6YXN5bmMoCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGF1bmNoOjphc3luYywgJkF1ZGlvUG9saWN5RWZmZWN0czo6aW5pdERlZmF1bHREZXZpY2VFZmZlY3RzLCB0aGlzKTsKKyAgICB9IGVsc2UgaWYgKGxvYWRSZXN1bHQgPCAwKSB7CiAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gbG9hZCBYTUwgZWZmZWN0IGNvbmZpZ3VyYXRpb24sIGZhbGxiYWNrIHRvIC5jb25mIik7CiAgICAgICAgIC8vIGxvYWQgYXV0b21hdGljIGF1ZGlvIGVmZmVjdCBtb2R1bGVzCiAgICAgICAgIGlmIChhY2Nlc3MoQVVESU9fRUZGRUNUX1ZFTkRPUl9DT05GSUdfRklMRSwgUl9PSykgPT0gMCkgewpAQCAtMzE3LDYgKzMyMCwyMDEgQEAKICAgICByZXR1cm4gc3RhdHVzOwogfQogCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OmFkZFNvdXJjZURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCkKK3sKKyAgICBpZiAodXVpZCA9PSBOVUxMIHx8IHR5cGUgPT0gTlVMTCkgeworICAgICAgICBBTE9HRSgiYWRkU291cmNlRGVmYXVsdEVmZmVjdCgpOiBOdWxsIHV1aWQgb3IgdHlwZSB1dWlkIHBvaW50ZXIiKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBIT1RXT1JELCBGTV9UVU5FUiBhbmQgRUNIT19SRUZFUkVOQ0UgYXJlIHNwZWNpYWwgY2FzZSBzb3VyY2VzID4gTUFYLgorICAgIGlmIChzb3VyY2UgPCBBVURJT19TT1VSQ0VfREVGQVVMVCB8fAorICAgICAgICAgICAgKHNvdXJjZSA+IEFVRElPX1NPVVJDRV9NQVggJiYKKyAgICAgICAgICAgICBzb3VyY2UgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYKKyAgICAgICAgICAgICBzb3VyY2UgIT0gQVVESU9fU09VUkNFX0ZNX1RVTkVSICYmCisgICAgICAgICAgICAgc291cmNlICE9IEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRSkpIHsKKyAgICAgICAgQUxPR0UoImFkZFNvdXJjZURlZmF1bHRFZmZlY3QoKTogVW5zdXBwb3J0ZWQgc291cmNlIHR5cGUgJWQiLCBzb3VyY2UpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIENoZWNrIHRoYXQgfHV1aWR8IG9yIHx0eXBlfCBjb3JyZXNwb25kcyB0byBhbiBlZmZlY3Qgb24gdGhlIHN5c3RlbS4KKyAgICBlZmZlY3RfZGVzY3JpcHRvcl90IGRlc2NyaXB0b3IgPSB7fTsKKyAgICBzdGF0dXNfdCByZXMgPSBBdWRpb0VmZmVjdDo6Z2V0RWZmZWN0RGVzY3JpcHRvcigKKyAgICAgICAgICAgIHV1aWQsIHR5cGUsIEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0MsICZkZXNjcmlwdG9yKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KCk6IEZhaWxlZCB0byBmaW5kIGVmZmVjdCBkZXNjcmlwdG9yIG1hdGNoaW5nIHV1aWQvdHlwZS4iKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBPbmx5IHByZS1wcm9jZXNzaW5nIGVmZmVjdHMgY2FuIGJlIGFkZGVkIGR5bmFtaWNhbGx5IGFzIHNvdXJjZSBkZWZhdWx0cy4KKyAgICBpZiAoKGRlc2NyaXB0b3IuZmxhZ3MgJiBFRkZFQ1RfRkxBR19UWVBFX01BU0spICE9IEVGRkVDVF9GTEFHX1RZUEVfUFJFX1BST0MpIHsKKyAgICAgICAgQUxPR0UoImFkZFNvdXJjZURlZmF1bHRFZmZlY3QoKTogRGVzaXJlZCBlZmZlY3QgY2Fubm90IGJlIGF0dGFjaGVkICIKKyAgICAgICAgICAgICAgImFzIGEgc291cmNlIGRlZmF1bHQgZWZmZWN0LiIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAvLyBGaW5kIHRoZSBFZmZlY3REZXNjVmVjdG9yIGZvciB0aGUgZ2l2ZW4gc291cmNlIHR5cGUsIG9yIGNyZWF0ZSBhIG5ldyBvbmUgaWYgbmVjZXNzYXJ5LgorICAgIHNzaXplX3QgaW5kZXggPSBtSW5wdXRTb3VyY2VzLmluZGV4T2ZLZXkoc291cmNlKTsKKyAgICBFZmZlY3REZXNjVmVjdG9yICpkZXNjID0gTlVMTDsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIC8vIE5vIGVmZmVjdHMgZm9yIHRoaXMgc291cmNlIHR5cGUgeWV0LgorICAgICAgICBkZXNjID0gbmV3IEVmZmVjdERlc2NWZWN0b3IoKTsKKyAgICAgICAgbUlucHV0U291cmNlcy5hZGQoc291cmNlLCBkZXNjKTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXNjID0gbUlucHV0U291cmNlcy52YWx1ZUF0KGluZGV4KTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgYSBuZXcgZWZmZWN0IGFuZCBhZGQgaXQgdG8gdGhlIHZlY3Rvci4KKyAgICByZXMgPSBBdWRpb0VmZmVjdDo6bmV3RWZmZWN0VW5pcXVlSWQoaWQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoImFkZFNvdXJjZURlZmF1bHRFZmZlY3QoKTogZmFpbGVkIHRvIGdldCBuZXcgdW5pcXVlIGlkLiIpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBFZmZlY3REZXNjICplZmZlY3QgPSBuZXcgRWZmZWN0RGVzYygKKyAgICAgICAgICAgIGRlc2NyaXB0b3IubmFtZSwgKnR5cGUsIG9wUGFja2FnZU5hbWUsICp1dWlkLCBwcmlvcml0eSwgKmlkKTsKKyAgICBkZXNjLT5tRWZmZWN0cy5hZGQoZWZmZWN0KTsKKyAgICAvLyBUT0RPKGIvNzE4MTM2OTcpOiBTdXBwb3J0IHNldHRpbmcgcGFyYW1zIGFzIHdlbGwuCisKKyAgICAvLyBUT0RPKGIvNzE4MTQzMDApOiBSZXRyb2FjdGl2ZWx5IGF0dGFjaCB0byBhbnkgZXhpc3Rpbmcgc291cmNlcyBvZiB0aGUgZ2l2ZW4gdHlwZS4KKyAgICAvLyBUaGlzIHJlcXVpcmVzIHRyYWNraW5nIHRoZSBzb3VyY2UgdHlwZSBvZiBlYWNoIHNlc3Npb24gaWQgaW4gYWRkaXRpb24gdG8gd2hhdCBpcworICAgIC8vIGFscmVhZHkgYmVpbmcgdHJhY2tlZC4KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lFZmZlY3RzOjphZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZWZmZWN0X3V1aWRfdCAqdXVpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VzYWdlX3QgdXNhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQoreworICAgIGlmICh1dWlkID09IE5VTEwgfHwgdHlwZSA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dFKCJhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCk6IE51bGwgdXVpZCBvciB0eXBlIHV1aWQgcG9pbnRlciIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSA9IEF1ZGlvU3lzdGVtOjphdHRyaWJ1dGVzVG9TdHJlYW1UeXBlKGF0dHJpYnV0ZXNfaW5pdGlhbGl6ZXIodXNhZ2UpKTsKKworICAgIGlmIChzdHJlYW0gPCBBVURJT19TVFJFQU1fTUlOIHx8IHN0cmVhbSA+PSBBVURJT19TVFJFQU1fUFVCTElDX0NOVCkgeworICAgICAgICBBTE9HRSgiYWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgpOiBVbnN1cHBvcnRlZCBzdHJlYW0gdHlwZSAlZCIsIHN0cmVhbSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gQ2hlY2sgdGhhdCB8dXVpZHwgb3IgfHR5cGV8IGNvcnJlc3BvbmRzIHRvIGFuIGVmZmVjdCBvbiB0aGUgc3lzdGVtLgorICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgZGVzY3JpcHRvciA9IHt9OworICAgIHN0YXR1c190IHJlcyA9IEF1ZGlvRWZmZWN0OjpnZXRFZmZlY3REZXNjcmlwdG9yKAorICAgICAgICAgICAgdXVpZCwgdHlwZSwgRUZGRUNUX0ZMQUdfVFlQRV9JTlNFUlQsICZkZXNjcmlwdG9yKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCJhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KCk6IEZhaWxlZCB0byBmaW5kIGVmZmVjdCBkZXNjcmlwdG9yIG1hdGNoaW5nIHV1aWQvdHlwZS4iKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICAvLyBPbmx5IGluc2VydCBlZmZlY3RzIGNhbiBiZSBhZGRlZCBkeW5hbWljYWxseSBhcyBzdHJlYW0gZGVmYXVsdHMuCisgICAgaWYgKChkZXNjcmlwdG9yLmZsYWdzICYgRUZGRUNUX0ZMQUdfVFlQRV9NQVNLKSAhPSBFRkZFQ1RfRkxBR19UWVBFX0lOU0VSVCkgeworICAgICAgICBBTE9HRSgiYWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgpOiBEZXNpcmVkIGVmZmVjdCBjYW5ub3QgYmUgYXR0YWNoZWQgIgorICAgICAgICAgICAgICAiYXMgYSBzdHJlYW0gZGVmYXVsdCBlZmZlY3QuIik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKworICAgIC8vIEZpbmQgdGhlIEVmZmVjdERlc2NWZWN0b3IgZm9yIHRoZSBnaXZlbiBzdHJlYW0gdHlwZSwgb3IgY3JlYXRlIGEgbmV3IG9uZSBpZiBuZWNlc3NhcnkuCisgICAgc3NpemVfdCBpbmRleCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtKTsKKyAgICBFZmZlY3REZXNjVmVjdG9yICpkZXNjID0gTlVMTDsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIC8vIE5vIGVmZmVjdHMgZm9yIHRoaXMgc3RyZWFtIHR5cGUgeWV0LgorICAgICAgICBkZXNjID0gbmV3IEVmZmVjdERlc2NWZWN0b3IoKTsKKyAgICAgICAgbU91dHB1dFN0cmVhbXMuYWRkKHN0cmVhbSwgZGVzYyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGVzYyA9IG1PdXRwdXRTdHJlYW1zLnZhbHVlQXQoaW5kZXgpOworICAgIH0KKworICAgIC8vIENyZWF0ZSBhIG5ldyBlZmZlY3QgYW5kIGFkZCBpdCB0byB0aGUgdmVjdG9yLgorICAgIHJlcyA9IEF1ZGlvRWZmZWN0OjpuZXdFZmZlY3RVbmlxdWVJZChpZCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiYWRkU3RyZWFtRGVmYXVsdEVmZmVjdCgpOiBmYWlsZWQgdG8gZ2V0IG5ldyB1bmlxdWUgaWQuIik7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIEVmZmVjdERlc2MgKmVmZmVjdCA9IG5ldyBFZmZlY3REZXNjKAorICAgICAgICAgICAgZGVzY3JpcHRvci5uYW1lLCAqdHlwZSwgb3BQYWNrYWdlTmFtZSwgKnV1aWQsIHByaW9yaXR5LCAqaWQpOworICAgIGRlc2MtPm1FZmZlY3RzLmFkZChlZmZlY3QpOworICAgIC8vIFRPRE8oYi83MTgxMzY5Nyk6IFN1cHBvcnQgc2V0dGluZyBwYXJhbXMgYXMgd2VsbC4KKworICAgIC8vIFRPRE8oYi83MTgxNDMwMCk6IFJldHJvYWN0aXZlbHkgYXR0YWNoIHRvIGFueSBleGlzdGluZyBzdHJlYW1zIG9mIHRoZSBnaXZlbiB0eXBlLgorICAgIC8vIFRoaXMgcmVxdWlyZXMgdHJhY2tpbmcgdGhlIHN0cmVhbSB0eXBlIG9mIGVhY2ggc2Vzc2lvbiBpZCBpbiBhZGRpdGlvbiB0byB3aGF0IGlzCisgICAgLy8gYWxyZWFkeSBiZWluZyB0cmFja2VkLgorCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OnJlbW92ZVNvdXJjZURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCit7CisgICAgaWYgKGlkID09IEFVRElPX1VOSVFVRV9JRF9BTExPQ0FURSkgeworICAgICAgICAvLyBBTExPQ0FURSBpcyBub3QgYSB1bmlxdWUgaWRlbnRpZmllciwgYnV0IHJhdGhlciBhIHJlc2VydmVkIHZhbHVlIGluZGljYXRpbmcKKyAgICAgICAgLy8gYSByZWFsIGlkIGhhcyBub3QgYmVlbiBhc3NpZ25lZC4gRm9yIGRlZmF1bHQgZWZmZWN0cywgdGhpcyB2YWx1ZSBpcyBvbmx5IHVzZWQKKyAgICAgICAgLy8gYnkgc3lzdGVtLW93bmVkIGRlZmF1bHRzIGZyb20gdGhlIGxvYWRlZCBjb25maWcsIHdoaWNoIGNhbm5vdCBiZSByZW1vdmVkLgorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAvLyBDaGVjayBlYWNoIHNvdXJjZSB0eXBlLgorICAgIHNpemVfdCBudW1Tb3VyY2VzID0gbUlucHV0U291cmNlcy5zaXplKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBudW1Tb3VyY2VzOyArK2kpIHsKKyAgICAgICAgLy8gQ2hlY2sgZWFjaCBlZmZlY3QgZm9yIGVhY2ggc291cmNlLgorICAgICAgICBFZmZlY3REZXNjVmVjdG9yKiBkZXNjVmVjdG9yID0gbUlucHV0U291cmNlc1tpXTsKKyAgICAgICAgZm9yIChhdXRvIGRlc2MgPSBkZXNjVmVjdG9yLT5tRWZmZWN0cy5iZWdpbigpOyBkZXNjICE9IGRlc2NWZWN0b3ItPm1FZmZlY3RzLmVuZCgpOyArK2Rlc2MpIHsKKyAgICAgICAgICAgIGlmICgoKmRlc2MpLT5tSWQgPT0gaWQpIHsKKyAgICAgICAgICAgICAgICAvLyBGb3VuZCBpdCEKKyAgICAgICAgICAgICAgICAvLyBUT0RPKGIvNzE4MTQzMDApOiBSZW1vdmUgZnJvbSBhbnkgc291cmNlcyB0aGUgZWZmZWN0IHdhcyBhdHRhY2hlZCB0by4KKyAgICAgICAgICAgICAgICBkZXNjVmVjdG9yLT5tRWZmZWN0cy5lcmFzZShkZXNjKTsKKyAgICAgICAgICAgICAgICAvLyBIYW5kbGVzIGFyZSB1bmlxdWU7IHRoZXJlIGNhbiBvbmx5IGJlIG9uZSBtYXRjaCwgc28gcmV0dXJuIGVhcmx5LgorICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEVmZmVjdCB3YXNuJ3QgZm91bmQsIHNvIGl0J3MgYmVlbiB0cml2aWFsbHkgcmVtb3ZlZCBzdWNjZXNzZnVsbHkuCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeUVmZmVjdHM6OnJlbW92ZVN0cmVhbURlZmF1bHRFZmZlY3QoYXVkaW9fdW5pcXVlX2lkX3QgaWQpCit7CisgICAgaWYgKGlkID09IEFVRElPX1VOSVFVRV9JRF9BTExPQ0FURSkgeworICAgICAgICAvLyBBTExPQ0FURSBpcyBub3QgYSB1bmlxdWUgaWRlbnRpZmllciwgYnV0IHJhdGhlciBhIHJlc2VydmVkIHZhbHVlIGluZGljYXRpbmcKKyAgICAgICAgLy8gYSByZWFsIGlkIGhhcyBub3QgYmVlbiBhc3NpZ25lZC4gRm9yIGRlZmF1bHQgZWZmZWN0cywgdGhpcyB2YWx1ZSBpcyBvbmx5IHVzZWQKKyAgICAgICAgLy8gYnkgc3lzdGVtLW93bmVkIGRlZmF1bHRzIGZyb20gdGhlIGxvYWRlZCBjb25maWcsIHdoaWNoIGNhbm5vdCBiZSByZW1vdmVkLgorICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisKKyAgICAvLyBDaGVjayBlYWNoIHN0cmVhbSB0eXBlLgorICAgIHNpemVfdCBudW1TdHJlYW1zID0gbU91dHB1dFN0cmVhbXMuc2l6ZSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbnVtU3RyZWFtczsgKytpKSB7CisgICAgICAgIC8vIENoZWNrIGVhY2ggZWZmZWN0IGZvciBlYWNoIHN0cmVhbS4KKyAgICAgICAgRWZmZWN0RGVzY1ZlY3RvciogZGVzY1ZlY3RvciA9IG1PdXRwdXRTdHJlYW1zW2ldOworICAgICAgICBmb3IgKGF1dG8gZGVzYyA9IGRlc2NWZWN0b3ItPm1FZmZlY3RzLmJlZ2luKCk7IGRlc2MgIT0gZGVzY1ZlY3Rvci0+bUVmZmVjdHMuZW5kKCk7ICsrZGVzYykgeworICAgICAgICAgICAgaWYgKCgqZGVzYyktPm1JZCA9PSBpZCkgeworICAgICAgICAgICAgICAgIC8vIEZvdW5kIGl0IQorICAgICAgICAgICAgICAgIC8vIFRPRE8oYi83MTgxNDMwMCk6IFJlbW92ZSBmcm9tIGFueSBzdHJlYW1zIHRoZSBlZmZlY3Qgd2FzIGF0dGFjaGVkIHRvLgorICAgICAgICAgICAgICAgIGRlc2NWZWN0b3ItPm1FZmZlY3RzLmVyYXNlKGRlc2MpOworICAgICAgICAgICAgICAgIC8vIEhhbmRsZXMgYXJlIHVuaXF1ZTsgdGhlcmUgY2FuIG9ubHkgYmUgb25lIG1hdGNoLCBzbyByZXR1cm4gZWFybHkuCisgICAgICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gRWZmZWN0IHdhc24ndCBmb3VuZCwgc28gaXQncyBiZWVuIHRyaXZpYWxseSByZW1vdmVkIHN1Y2Nlc3NmdWxseS4KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CiAKIHZvaWQgQXVkaW9Qb2xpY3lFZmZlY3RzOjpFZmZlY3RWZWN0b3I6OnNldFByb2Nlc3NvckVuYWJsZWQoYm9vbCBlbmFibGVkKQogewpAQCAtMzM4LDcgKzUzNiw4IEBACiAgICAgQ0FNQ09SREVSX1NSQ19UQUcsCiAgICAgVk9JQ0VfUkVDX1NSQ19UQUcsCiAgICAgVk9JQ0VfQ09NTV9TUkNfVEFHLAotICAgIFVOUFJPQ0VTU0VEX1NSQ19UQUcKKyAgICBVTlBST0NFU1NFRF9TUkNfVEFHLAorICAgIFZPSUNFX1BFUkZPUk1BTkNFX1NSQ19UQUcKIH07CiAKIC8vIHJldHVybnMgdGhlIGF1ZGlvX3NvdXJjZV90IGVudW0gY29ycmVzcG9uZGluZyB0byB0aGUgaW5wdXQgc291cmNlIG5hbWUgb3IKQEAgLTM2Niw3ICs1NjUsOCBAQAogICAgIEFVRElPX1NUUkVBTV9CTFVFVE9PVEhfU0NPX1RBRywKICAgICBBVURJT19TVFJFQU1fRU5GT1JDRURfQVVESUJMRV9UQUcsCiAgICAgQVVESU9fU1RSRUFNX0RUTUZfVEFHLAotICAgIEFVRElPX1NUUkVBTV9UVFNfVEFHCisgICAgQVVESU9fU1RSRUFNX1RUU19UQUcsCisgICAgQVVESU9fU1RSRUFNX0FTU0lTVEFOVF9UQUcKIH07CiAKIC8vIHJldHVybnMgdGhlIGF1ZGlvX3N0cmVhbV90IGVudW0gY29ycmVzcG9uZGluZyB0byB0aGUgb3V0cHV0IHN0cmVhbSBuYW1lIG9yCkBAIC03MTEsOCArOTExLDI0IEBACiAgICAgICAgICAgICBzdHJlYW1zLmFkZChzdHJlYW0udHlwZSwgZWZmZWN0RGVzY3MucmVsZWFzZSgpKTsKICAgICAgICAgfQogICAgIH07CisKKyAgICBhdXRvIGxvYWREZXZpY2VQcm9jZXNzaW5nQ2hhaW4gPSBbXShhdXRvICZwcm9jZXNzaW5nQ2hhaW4sIGF1dG8mIGRldmljZXNFZmZlY3RzKSB7CisgICAgICAgIGZvciAoYXV0byYgZGV2aWNlUHJvY2VzcyA6IHByb2Nlc3NpbmdDaGFpbikgeworCisgICAgICAgICAgICBhdXRvIGVmZmVjdERlc2NzID0gc3RkOjptYWtlX3VuaXF1ZTxFZmZlY3REZXNjVmVjdG9yPigpOworICAgICAgICAgICAgZm9yIChhdXRvJiBlZmZlY3QgOiBkZXZpY2VQcm9jZXNzLmVmZmVjdHMpIHsKKyAgICAgICAgICAgICAgICBlZmZlY3REZXNjcy0+bUVmZmVjdHMuYWRkKAorICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEVmZmVjdERlc2N7ZWZmZWN0LmdldCgpLm5hbWUuY19zdHIoKSwgZWZmZWN0LmdldCgpLnV1aWR9KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGF1dG8gZGV2aWNlRWZmZWN0cyA9IHN0ZDo6bWFrZV91bmlxdWU8RGV2aWNlRWZmZWN0cz4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoZWZmZWN0RGVzY3MpLCBkZXZpY2VQcm9jZXNzLnR5cGUsIGRldmljZVByb2Nlc3MuYWRkcmVzcyk7CisgICAgICAgICAgICBkZXZpY2VzRWZmZWN0cy5lbXBsYWNlKGRldmljZVByb2Nlc3MuYWRkcmVzcywgc3RkOjptb3ZlKGRldmljZUVmZmVjdHMpKTsKKyAgICAgICAgfQorICAgIH07CisKICAgICBsb2FkUHJvY2Vzc2luZ0NoYWluKHJlc3VsdC5wYXJzZWRDb25maWctPnByZXByb2Nlc3MsIG1JbnB1dFNvdXJjZXMpOwogICAgIGxvYWRQcm9jZXNzaW5nQ2hhaW4ocmVzdWx0LnBhcnNlZENvbmZpZy0+cG9zdHByb2Nlc3MsIG1PdXRwdXRTdHJlYW1zKTsKKyAgICBsb2FkRGV2aWNlUHJvY2Vzc2luZ0NoYWluKHJlc3VsdC5wYXJzZWRDb25maWctPmRldmljZXByb2Nlc3MsIG1EZXZpY2VFZmZlY3RzKTsKICAgICAvLyBDYXN0aW5nIGZyb20gc3NpemVfdCB0byBzdGF0dXNfdCBpcyBwcm9iYWJseSBzYWZlLCB0aGVyZSBzaG91bGQgbm90IGJlIG1vcmUgdGhhbiAyXjMxIGVycm9ycwogICAgIHJldHVybiByZXN1bHQubmJTa2lwcGVkRWxlbWVudDsKIH0KQEAgLTc0NSw1ICs5NjEsMzIgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lFZmZlY3RzOjppbml0RGVmYXVsdERldmljZUVmZmVjdHMoKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgZm9yIChjb25zdCBhdXRvJiBkZXZpY2VFZmZlY3RzSXRlciA6IG1EZXZpY2VFZmZlY3RzKSB7CisgICAgICAgIGNvbnN0IGF1dG8mIGRldmljZUVmZmVjdHMgPSAgZGV2aWNlRWZmZWN0c0l0ZXIuc2Vjb25kOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGVmZmVjdERlc2MgOiBkZXZpY2VFZmZlY3RzLT5tRWZmZWN0RGVzY3JpcHRvcnMtPm1FZmZlY3RzKSB7CisgICAgICAgICAgICBhdXRvIGZ4ID0gc3RkOjptYWtlX3VuaXF1ZTxBdWRpb0VmZmVjdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBFRkZFQ1RfVVVJRF9OVUxMLCBTdHJpbmcxNigiYW5kcm9pZCIpLCAmZWZmZWN0RGVzYy0+bVV1aWQsIDAsIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBBVURJT19TRVNTSU9OX0RFVklDRSwgQVVESU9fSU9fSEFORExFX05PTkUsCisgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRye2RldmljZUVmZmVjdHMtPmdldERldmljZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlRWZmZWN0cy0+Z2V0RGV2aWNlQWRkcmVzcygpfSk7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBmeC0+aW5pdENoZWNrKCk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlcygpOiBmYWlsZWQgdG8gY3JlYXRlIEZ4ICVzIG9uIHBvcnQgdHlwZT0lZCBhZGRyZXNzPSVzIiwgX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bU5hbWUsIGRldmljZUVmZmVjdHMtPmdldERldmljZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VFZmZlY3RzLT5nZXREZXZpY2VBZGRyZXNzKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgLy8gZnggZ29lcyBvdXQgb2Ygc2NvcGUgYW5kIHN0cm9uZyByZWYgb24gQXVkaW9FZmZlY3QgaXMgcmVsZWFzZWQKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZ4LT5zZXRFbmFibGVkKHRydWUpOworICAgICAgICAgICAgQUxPR1YoIiVzKCk6IGNyZWF0ZSBGeCAlcyBhZGRlZCBvbiBwb3J0IHR5cGU9JWQgYWRkcmVzcz0lcyIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgICAgZWZmZWN0RGVzYy0+bU5hbWUsIGRldmljZUVmZmVjdHMtPmdldERldmljZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgIGRldmljZUVmZmVjdHMtPmdldERldmljZUFkZHJlc3MoKS5jX3N0cigpKTsKKyAgICAgICAgICAgIGRldmljZUVmZmVjdHMtPm1FZmZlY3RzLnB1c2hfYmFjayhzdGQ6Om1vdmUoZngpKTsKKyAgICAgICAgfQorICAgIH0KK30KIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lFZmZlY3RzLmgKaW5kZXggNjIzMTgwZS4uODhiZTFhZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUVmZmVjdHMuaAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5RWZmZWN0cy5oCkBAIC0yNSw2ICsyNSw5IEBACiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3RocmVhZF9hbm5vdGF0aW9ucy5oPgorCisjaW5jbHVkZSA8ZnV0dXJlPgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTY0LDcgKzY3LDYgQEAKICAgICBzdGF0dXNfdCByZWxlYXNlSW5wdXRFZmZlY3RzKGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbik7CiAKLQogICAgIC8vIFJldHVybiBhIGxpc3Qgb2YgZWZmZWN0IGRlc2NyaXB0b3JzIGZvciBkZWZhdWx0IG91dHB1dCBlZmZlY3RzCiAgICAgLy8gYXNzb2NpYXRlZCB3aXRoIGF1ZGlvU2Vzc2lvbgogICAgIHN0YXR1c190IHF1ZXJ5RGVmYXVsdE91dHB1dFNlc3Npb25FZmZlY3RzKGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24sCkBAIC04MiwxOCArODQsNjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBhdWRpb1Nlc3Npb24pOwogCisgICAgLy8gQWRkIHRoZSBlZmZlY3QgdG8gdGhlIGxpc3Qgb2YgZGVmYXVsdCBlZmZlY3RzIGZvciBzb3VyY2VzIG9mIHR5cGUgfHNvdXJjZXwuCisgICAgc3RhdHVzX3QgYWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCk7CisKKyAgICAvLyBBZGQgdGhlIGVmZmVjdCB0byB0aGUgbGlzdCBvZiBkZWZhdWx0IGVmZmVjdHMgZm9yIHN0cmVhbXMgb2YgYSBnaXZlbiB1c2FnZS4KKyAgICBzdGF0dXNfdCBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCk7CisKKyAgICAvLyBSZW1vdmUgdGhlIGRlZmF1bHQgc291cmNlIGVmZmVjdCBmcm9tIHdoZXJldmVyIGl0J3MgYXR0YWNoZWQuCisgICAgc3RhdHVzX3QgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCk7CisKKyAgICAvLyBSZW1vdmUgdGhlIGRlZmF1bHQgc3RyZWFtIGVmZmVjdCBmcm9tIHdoZXJldmVyIGl0J3MgYXR0YWNoZWQuCisgICAgc3RhdHVzX3QgcmVtb3ZlU3RyZWFtRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCk7CisKIHByaXZhdGU6CisgICAgdm9pZCBpbml0RGVmYXVsdERldmljZUVmZmVjdHMoKTsKIAogICAgIC8vIGNsYXNzIHRvIHN0b3JlIHRoZSBkZXNjcmlwdGlvbiBvZiBhbiBlZmZlY3RzIGFuZCBpdHMgcGFyYW1ldGVycwogICAgIC8vIGFzIGRlZmluZWQgaW4gYXVkaW9fZWZmZWN0cy5jb25mCiAgICAgY2xhc3MgRWZmZWN0RGVzYyB7CiAgICAgcHVibGljOgotICAgICAgICBFZmZlY3REZXNjKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGVmZmVjdF91dWlkX3QmIHV1aWQpIDoKKyAgICAgICAgRWZmZWN0RGVzYyhjb25zdCBjaGFyICpuYW1lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QmIHR5cGVVdWlkLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QmIHV1aWQsCisgICAgICAgICAgICAgICAgICAgdWludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgaWQpIDoKICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lKHN0cmR1cChuYW1lKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBtVXVpZCh1dWlkKSB7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1UeXBlVXVpZCh0eXBlVXVpZCksCisgICAgICAgICAgICAgICAgICAgICAgICBtT3BQYWNrYWdlTmFtZShvcFBhY2thZ2VOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1VdWlkKHV1aWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbVByaW9yaXR5KHByaW9yaXR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1JZChpZCkgeyB9CisgICAgICAgIEVmZmVjdERlc2MoY29uc3QgY2hhciAqbmFtZSwgY29uc3QgZWZmZWN0X3V1aWRfdCYgdXVpZCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgRWZmZWN0RGVzYyhuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqRUZGRUNUX1VVSURfTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoIiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VTklRVUVfSURfQUxMT0NBVEUpIHsgfQogICAgICAgICBFZmZlY3REZXNjKGNvbnN0IEVmZmVjdERlc2MmIG9yaWcpIDoKICAgICAgICAgICAgICAgICAgICAgICAgIG1OYW1lKHN0cmR1cChvcmlnLm1OYW1lKSksCi0gICAgICAgICAgICAgICAgICAgICAgICBtVXVpZChvcmlnLm1VdWlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtVHlwZVV1aWQob3JpZy5tVHlwZVV1aWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgbU9wUGFja2FnZU5hbWUob3JpZy5tT3BQYWNrYWdlTmFtZSksCisgICAgICAgICAgICAgICAgICAgICAgICBtVXVpZChvcmlnLm1VdWlkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Qcmlvcml0eShvcmlnLm1Qcmlvcml0eSksCisgICAgICAgICAgICAgICAgICAgICAgICBtSWQob3JpZy5tSWQpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWVwIGNvcHkgbVBhcmFtcwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgb3JpZy5tUGFyYW1zLnNpemUoKTsgaysrKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9wYXJhbV90ICpvcmlnUGFyYW0gPSBvcmlnLm1QYXJhbXNba107CkBAIC0xMTYsNyArMTYxLDExIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgY2hhciAqbU5hbWU7CisgICAgICAgIGVmZmVjdF91dWlkX3QgbVR5cGVVdWlkOworICAgICAgICBTdHJpbmcxNiBtT3BQYWNrYWdlTmFtZTsKICAgICAgICAgZWZmZWN0X3V1aWRfdCBtVXVpZDsKKyAgICAgICAgaW50MzJfdCBtUHJpb3JpdHk7CisgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IG1JZDsKICAgICAgICAgVmVjdG9yIDxlZmZlY3RfcGFyYW1fdCAqPiBtUGFyYW1zOwogICAgIH07CiAKQEAgLTE0Nyw2ICsxOTYsMjggQEAKICAgICAgICAgVmVjdG9yPCBzcDxBdWRpb0VmZmVjdD4gPm1FZmZlY3RzOwogICAgIH07CiAKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgVGhlIERldmljZUVmZmVjdHMgY2xhc3Mgc3RvcmVzIHRoZSBlZmZlY3RzIGFzc29jaWF0ZWQgdG8gYSBnaXZlbiBEZXZpY2UgUG9ydC4KKyAgICAgKi8KKyAgICBjbGFzcyBEZXZpY2VFZmZlY3RzIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IERldmljZUVmZmVjdHMoc3RkOjp1bmlxdWVfcHRyPEVmZmVjdERlc2NWZWN0b3I+IGVmZmVjdERlc2NyaXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhZGRyZXNzKSA6CisgICAgICAgICAgICBtRWZmZWN0RGVzY3JpcHRvcnMoc3RkOjptb3ZlKGVmZmVjdERlc2NyaXB0b3JzKSksCisgICAgICAgICAgICBtRGV2aWNlVHlwZShkZXZpY2UpLCBtRGV2aWNlQWRkcmVzcyhhZGRyZXNzKSB7fQorICAgICAgICAvKnZpcnR1YWwqLyB+RGV2aWNlRWZmZWN0cygpID0gZGVmYXVsdDsKKworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8QXVkaW9FZmZlY3Q+PiBtRWZmZWN0czsKKyAgICAgICAgYXVkaW9fZGV2aWNlc190IGdldERldmljZVR5cGUoKSBjb25zdCB7IHJldHVybiBtRGV2aWNlVHlwZTsgfQorICAgICAgICBzdGQ6OnN0cmluZyBnZXREZXZpY2VBZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gbURldmljZUFkZHJlc3M7IH0KKyAgICAgICAgY29uc3Qgc3RkOjp1bmlxdWVfcHRyPEVmZmVjdERlc2NWZWN0b3I+IG1FZmZlY3REZXNjcmlwdG9yczsKKworICAgIHByaXZhdGU6CisgICAgICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCBtRGV2aWNlVHlwZTsKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgbURldmljZUFkZHJlc3M7CisKKyAgICB9OworCiAKICAgICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtJbnB1dFNvdXJjZU5hbWVzW0FVRElPX1NPVVJDRV9DTlQgLTFdOwogICAgIHN0YXRpYyBhdWRpb19zb3VyY2VfdCBpbnB1dFNvdXJjZU5hbWVUb0VudW0oY29uc3QgY2hhciAqbmFtZSk7CkBAIC0xODAsNiArMjUxLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgKnRvdFNpemUpOwogCiAgICAgLy8gcHJvdGVjdHMgYWNjZXNzIHRvIG1JbnB1dFNvdXJjZXMsIG1JbnB1dFNlc3Npb25zLCBtT3V0cHV0U3RyZWFtcywgbU91dHB1dFNlc3Npb25zCisgICAgLy8gbmV2ZXIgaG9sZCBBdWRpb1BvbGljeVNlcnZpY2U6Om1Mb2NrIHdoZW4gY2FsbGluZyBBdWRpb1BvbGljeUVmZmVjdHMgbWV0aG9kcyBhcworICAgIC8vIHRob3NlIGNhbiBjYWxsIGJhY2sgaW50byBBdWRpb1BvbGljeVNlcnZpY2UgbWV0aG9kcyBhbmQgdHJ5IHRvIGFjcXVpcmUgdGhlIG11dGV4CiAgICAgTXV0ZXggbUxvY2s7CiAgICAgLy8gQXV0b21hdGljIGlucHV0IGVmZmVjdHMgYXJlIGNvbmZpZ3VyZWQgcGVyIGF1ZGlvX3NvdXJjZV90CiAgICAgS2V5ZWRWZWN0b3I8IGF1ZGlvX3NvdXJjZV90LCBFZmZlY3REZXNjVmVjdG9yKiA+IG1JbnB1dFNvdXJjZXM7CkBAIC0xOTAsNiArMjYzLDE5IEBACiAgICAgS2V5ZWRWZWN0b3I8IGF1ZGlvX3N0cmVhbV90eXBlX3QsIEVmZmVjdERlc2NWZWN0b3IqID4gbU91dHB1dFN0cmVhbXM7CiAgICAgLy8gQXV0b21hdGljIG91dHB1dCBlZmZlY3RzIGFyZSB1bmlxdWUgZm9yIGF1ZGlvc2Vzc2lvbiBJRAogICAgIEtleWVkVmVjdG9yPCBhdWRpb19zZXNzaW9uX3QsIEVmZmVjdFZlY3RvciogPiBtT3V0cHV0U2Vzc2lvbnM7CisKKyAgICAvKioKKyAgICAgKiBAYnJpZWYgbURldmljZUVmZmVjdHMgbWFwIG9mIGRldmljZSBlZmZlY3RzIGluZGV4ZWQgYnkgdGhlIGRldmljZSBhZGRyZXNzCisgICAgICovCisgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dW5pcXVlX3B0cjxEZXZpY2VFZmZlY3RzPj4gbURldmljZUVmZmVjdHMgR1VBUkRFRF9CWShtTG9jayk7CisKKyAgICAvKioKKyAgICAgKiBEZXZpY2UgRWZmZWN0IGluaXRpYWxpemF0aW9uIG11c3QgYmUgYXN5bmNocm9ub3VzOiB0aGUgYXVkaW9fcG9saWN5IHNlcnZpY2UgcGFyc2VzIGFuZCBpbml0CisgICAgICogZWZmZWN0IG9uIGZpcnN0IHJlZmVyZW5jZS4gQXVkaW9GbGluZ2VyIHdpbGwgaGFuZGxlIGVmZmVjdCBjcmVhdGlvbiBhbmQgcmVnaXN0ZXIgdGhlc2UKKyAgICAgKiBlZmZlY3Qgb24gYXVkaW9fcG9saWN5IHNlcnZpY2UuCisgICAgICogV2UgbXVzdCBzdG9yZSB0aGUgcmVmZXJlbmNlIG9mIHRoZSBmdXJ0dXJlIGdhcmFudGVlIHJlYWwgYXN5bmNocm9ub3VzIG9wZXJhdGlvbi4KKyAgICAgKi8KKyAgICBzdGQ6OmZ1dHVyZTx2b2lkPiBtRGVmYXVsdERldmljZUVmZmVjdEZ1dHVyZTsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lJbnRlcmZhY2VJbXBsLmNwcAppbmRleCA3MzM3ZjA0Li4yMjdhZGM3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5SW50ZXJmYWNlSW1wbC5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeUludGVyZmFjZUltcGwuY3BwCkBAIC0xNywyMiArMTcsMzAgQEAKICNkZWZpbmUgTE9HX1RBRyAiQXVkaW9Qb2xpY3lJbnRlZmFjZUltcGwiCiAvLyNkZWZpbmUgTE9HX05ERUJVRyAwCiAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxtZWRpYS9NZWRpYUFuYWx5dGljc0l0ZW0uaD4KLQogI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKICNpbmNsdWRlICJUeXBlQ29udmVydGVyLmgiCisjaW5jbHVkZSA8bWVkaWEvTWVkaWFBbmFseXRpY3NJdGVtLmg+CisjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGUoKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHJldHVybjsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+b25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGUoKTsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CkBAIC00OSw3ICs1Nyw3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoZGV2aWNlLCBzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZV9hZGRyZXNzLCBkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VfYWRkcmVzcywgZGV2aWNlX25hbWUsIGVuY29kZWRGb3JtYXQpOwogfQogCiBhdWRpb19wb2xpY3lfZGV2X3N0YXRlX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCkBAIC02Niw3ICs3NCw4IEBACiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6aGFuZGxlRGV2aWNlQ29uZmlnQ2hhbmdlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGVuY29kZWRGb3JtYXQpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTc5LDcgKzg4LDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmhhbmRsZURldmljZUNvbmZpZ0NoYW5nZShkZXZpY2UsIGRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX25hbWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlX25hbWUsIGVuY29kZWRGb3JtYXQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFBob25lU3RhdGUoYXVkaW9fbW9kZV90IHN0YXRlKQpAQCAtMTY1LDcgKzE3NCw3IEBACiAgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dChzdHJlYW0pOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldE91dHB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRPdXRwdXRGb3JBdHRyKGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqb3V0cHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKQEAgLTE3NCw3ICsxODMsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgZmxhZ3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cykKIHsKICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwpAQCAtMTgzLDE2ICsxOTMsMjQgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCiAgICAgY29uc3QgdWlkX3QgY2FsbGluZ1VpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAoIWlzVHJ1c3RlZENhbGxpbmdVaWQoY2FsbGluZ1VpZCkgfHwgdWlkID09ICh1aWRfdCktMSkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkgfHwgdWlkID09ICh1aWRfdCktMSkgewogICAgICAgICBBTE9HV19JRih1aWQgIT0gKHVpZF90KS0xICYmIHVpZCAhPSBjYWxsaW5nVWlkLAogICAgICAgICAgICAgICAgICIlcyB1aWQgJWQgdHJpZWQgdG8gcGFzcyBpdHNlbGYgb2ZmIGFzICVkIiwgX19GVU5DVElPTl9fLCBjYWxsaW5nVWlkLCB1aWQpOwogICAgICAgICB1aWQgPSBjYWxsaW5nVWlkOwogICAgIH0KKyAgICBpZiAoIW1QYWNrYWdlTWFuYWdlci5hbGxvd1BsYXliYWNrQ2FwdHVyZSh1aWQpKSB7CisgICAgICAgIGF0dHItPmZsYWdzIHw9IEFVRElPX0ZMQUdfTk9fTUVESUFfUFJPSkVDVElPTjsKKyAgICB9CisgICAgaWYgKCgoYXR0ci0+ZmxhZ3MgJiAoQVVESU9fRkxBR19CWVBBU1NfSU5URVJSVVBUSU9OX1BPTElDWXxBVURJT19GTEFHX0JZUEFTU19NVVRFKSkgIT0gMCkKKyAgICAgICAgICAgICYmICFieXBhc3NJbnRlcnJ1cHRpb25Qb2xpY3lBbGxvd2VkKHBpZCwgdWlkKSkgeworICAgICAgICBhdHRyLT5mbGFncyAmPSB+KEFVRElPX0ZMQUdfQllQQVNTX0lOVEVSUlVQVElPTl9QT0xJQ1l8QVVESU9fRkxBR19CWVBBU1NfTVVURSk7CisgICAgfQogICAgIGF1ZGlvX291dHB1dF9mbGFnc190IG9yaWdpbmFsRmxhZ3MgPSBmbGFnczsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHN0YXR1c190IHJlc3VsdCA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dEZvckF0dHIoYXR0ciwgb3V0cHV0LCBzZXNzaW9uLCBzdHJlYW0sIHVpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZsYWdzLCBzZWxlY3RlZERldmljZUlkLCBwb3J0SWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeU91dHB1dHMpOwogCiAgICAgLy8gRklYTUU6IEludHJvZHVjZSBhIHdheSB0byBjaGVjayBmb3IgdGhlIHRoZSB0ZWxlcGhvbnkgZGV2aWNlIGJlZm9yZSBvcGVuaW5nIHRoZSBvdXRwdXQKICAgICBpZiAoKHJlc3VsdCA9PSBOT19FUlJPUikgJiYKQEAgLTIwMCwxMDUgKzIxOCwxMzQgQEAKICAgICAgICAgIW1vZGlmeVBob25lU3RhdGVBbGxvd2VkKHBpZCwgdWlkKSkgewogICAgICAgICAvLyBJZiB0aGUgYXBwIHRyaWVzIHRvIHBsYXkgbXVzaWMgdGhyb3VnaCB0aGUgdGVsZXBob255IGRldmljZSBhbmQgZG9lc24ndCBoYXZlIHBlcm1pc3Npb24KICAgICAgICAgLy8gdGhlIGZhbGxiYWNrIHRvIHRoZSBkZWZhdWx0IG91dHB1dCBkZXZpY2UuCi0gICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VPdXRwdXQoKm91dHB1dCwgKnN0cmVhbSwgc2Vzc2lvbik7CisgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VPdXRwdXQoKnBvcnRJZCk7CiAgICAgICAgIGZsYWdzID0gb3JpZ2luYWxGbGFnczsKICAgICAgICAgKnNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgICAgICAqcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKLSAgICAgICAgcmVzdWx0ID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0T3V0cHV0Rm9yQXR0cihhdHRyLCBvdXRwdXQsIHNlc3Npb24sIHN0cmVhbSwgdWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmxhZ3MsIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCk7CisgICAgICAgIHNlY29uZGFyeU91dHB1dHMtPmNsZWFyKCk7CisgICAgICAgIHJlc3VsdCA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE91dHB1dEZvckF0dHIoYXR0ciwgb3V0cHV0LCBzZXNzaW9uLCBzdHJlYW0sIHVpZCwgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwgcG9ydElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlY29uZGFyeU91dHB1dHMpOworICAgIH0KKworICAgIGlmIChyZXN1bHQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgc3AgPEF1ZGlvUGxheWJhY2tDbGllbnQ+IGNsaWVudCA9CisgICAgICAgICAgICBuZXcgQXVkaW9QbGF5YmFja0NsaWVudCgqYXR0ciwgKm91dHB1dCwgdWlkLCBwaWQsIHNlc3Npb24sICpzZWxlY3RlZERldmljZUlkLCAqc3RyZWFtKTsKKyAgICAgICAgbUF1ZGlvUGxheWJhY2tDbGllbnRzLmFkZCgqcG9ydElkLCBjbGllbnQpOwogICAgIH0KICAgICByZXR1cm4gcmVzdWx0OwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0T3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFBsYXliYWNrQ2xpZW50QW5kRWZmZWN0cyhhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9QbGF5YmFja0NsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPiYgZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29udGV4dCkKIHsKLSAgICBpZiAodWludDMyX3Qoc3RyZWFtKSA+PSBBVURJT19TVFJFQU1fQ05UKSB7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBjb25zdCBzc2l6ZV90IGluZGV4ID0gbUF1ZGlvUGxheWJhY2tDbGllbnRzLmluZGV4T2ZLZXkocG9ydElkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dFKCIlcyBBdWRpb1RyYWNrIGNsaWVudCBub3QgZm91bmQgZm9yIHBvcnRJZCAlZCIsIGNvbnRleHQsIHBvcnRJZCk7CisgICAgICAgIHJldHVybjsKICAgICB9CisgICAgY2xpZW50ID0gbUF1ZGlvUGxheWJhY2tDbGllbnRzLnZhbHVlQXQoaW5kZXgpOworICAgIGVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0T3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQorewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogICAgIEFMT0dWKCJzdGFydE91dHB1dCgpIik7CisgICAgc3A8QXVkaW9QbGF5YmFja0NsaWVudD4gY2xpZW50OwogICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7Ci0gICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICBhdWRpb1BvbGljeUVmZmVjdHMgPSBtQXVkaW9Qb2xpY3lFZmZlY3RzOwotICAgIH0KKworICAgIGdldFBsYXliYWNrQ2xpZW50QW5kRWZmZWN0cyhwb3J0SWQsIGNsaWVudCwgYXVkaW9Qb2xpY3lFZmZlY3RzLCBfX2Z1bmNfXyk7CisKICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKICAgICAgICAgLy8gY3JlYXRlIGF1ZGlvIHByb2Nlc3NvcnMgYWNjb3JkaW5nIHRvIHN0cmVhbQotICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPmFkZE91dHB1dFNlc3Npb25FZmZlY3RzKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRPdXRwdXRTZXNzaW9uRWZmZWN0cygKKyAgICAgICAgICAgIGNsaWVudC0+aW8sIGNsaWVudC0+c3RyZWFtLCBjbGllbnQtPnNlc3Npb24pOwogICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SICYmIHN0YXR1cyAhPSBBTFJFQURZX0VYSVNUUykgewotICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byBhZGQgZWZmZWN0cyBvbiBzZXNzaW9uICVkIiwgc2Vzc2lvbik7CisgICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIGFkZCBlZmZlY3RzIG9uIHNlc3Npb24gJWQiLCBjbGllbnQtPnNlc3Npb24pOwogICAgICAgICB9CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIHN0YXR1c190IHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPnN0YXJ0T3V0cHV0KHBvcnRJZCk7CisgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICBjbGllbnQtPmFjdGl2ZSA9IHRydWU7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7Ci0gICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX0NOVCkgewotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgIH0KICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBBTE9HVigic3RvcE91dHB1dCgpIik7Ci0gICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnN0b3BPdXRwdXRDb21tYW5kKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+c3RvcE91dHB1dENvbW1hbmQocG9ydElkKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKLXN0YXR1c190ICBBdWRpb1BvbGljeVNlcnZpY2U6OmRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3N0YXR1c190ICBBdWRpb1BvbGljeVNlcnZpY2U6OmRvU3RvcE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKLSAgICBBTE9HVigiZG9TdG9wT3V0cHV0IGZyb20gdGlkICVkIiwgZ2V0dGlkKCkpOworICAgIEFMT0dWKCJkb1N0b3BPdXRwdXQiKTsKKyAgICBzcDxBdWRpb1BsYXliYWNrQ2xpZW50PiBjbGllbnQ7CiAgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7Ci0gICAgfQorCisgICAgZ2V0UGxheWJhY2tDbGllbnRBbmRFZmZlY3RzKHBvcnRJZCwgY2xpZW50LCBhdWRpb1BvbGljeUVmZmVjdHMsIF9fZnVuY19fKTsKKwogICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgIT0gMCkgewogICAgICAgICAvLyByZWxlYXNlIGF1ZGlvIHByb2Nlc3NvcnMgZnJvbSB0aGUgc3RyZWFtCi0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZU91dHB1dFNlc3Npb25FZmZlY3RzKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZWxlYXNlT3V0cHV0U2Vzc2lvbkVmZmVjdHMoCisgICAgICAgICAgICBjbGllbnQtPmlvLCBjbGllbnQtPnN0cmVhbSwgY2xpZW50LT5zZXNzaW9uKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKLSAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIHNlc3Npb24gJWQiLCBzZXNzaW9uKTsKKyAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gcmVsZWFzZSBlZmZlY3RzIG9uIHNlc3Npb24gJWQiLCBjbGllbnQtPnNlc3Npb24pOwogICAgICAgICB9CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcE91dHB1dChvdXRwdXQsIHN0cmVhbSwgc2Vzc2lvbik7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcE91dHB1dChwb3J0SWQpOworICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgY2xpZW50LT5hY3RpdmUgPSBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXR1czsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZWxlYXNlT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBBTE9HVigicmVsZWFzZU91dHB1dCgpIik7Ci0gICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPnJlbGVhc2VPdXRwdXRDb21tYW5kKG91dHB1dCwgc3RyZWFtLCBzZXNzaW9uKTsKKyAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVsZWFzZU91dHB1dENvbW1hbmQocG9ydElkKTsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvUmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbikKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb1JlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgQUxPR1YoImRvUmVsZWFzZU91dHB1dCBmcm9tIHRpZCAlZCIsIGdldHRpZCgpKTsKKyAgICBzcDxBdWRpb1BsYXliYWNrQ2xpZW50PiBjbGllbnQ7CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPiBhdWRpb1BvbGljeUVmZmVjdHM7CisKKyAgICBnZXRQbGF5YmFja0NsaWVudEFuZEVmZmVjdHMocG9ydElkLCBjbGllbnQsIGF1ZGlvUG9saWN5RWZmZWN0cywgX19mdW5jX18pOworCisgICAgaWYgKGF1ZGlvUG9saWN5RWZmZWN0cyAhPSAwICYmIGNsaWVudC0+YWN0aXZlKSB7CisgICAgICAgIC8vIGNsZWFuIHVwIGVmZmVjdHMgaWYgb3V0cHV0IHdhcyBub3Qgc3RvcHBlZCBiZWZvcmUgYmVpbmcgcmVsZWFzZWQKKyAgICAgICAgYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZWxlYXNlT3V0cHV0U2Vzc2lvbkVmZmVjdHMoCisgICAgICAgICAgICBjbGllbnQtPmlvLCBjbGllbnQtPnN0cmVhbSwgY2xpZW50LT5zZXNzaW9uKTsKKyAgICB9CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtQXVkaW9QbGF5YmFja0NsaWVudHMucmVtb3ZlSXRlbShwb3J0SWQpOworCiAgICAgLy8gY2FsbGVkIGZyb20gaW50ZXJuYWwgdGhyZWFkOiBubyBuZWVkIHRvIGNsZWFyIGNhbGxlciBpZGVudGl0eQotICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VPdXRwdXQob3V0cHV0LCBzdHJlYW0sIHNlc3Npb24pOworICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VPdXRwdXQocG9ydElkKTsKIH0KIAogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QgcmlpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLApAQCAtMzEyLDE1ICszNTksMjMgQEAKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQogCisgICAgYXVkaW9fc291cmNlX3QgaW5wdXRTb3VyY2UgPSBhdHRyLT5zb3VyY2U7CisgICAgaWYgKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9ERUZBVUxUKSB7CisgICAgICAgIGlucHV0U291cmNlID0gQVVESU9fU09VUkNFX01JQzsKKyAgICB9CisKICAgICAvLyBhbHJlYWR5IGNoZWNrZWQgYnkgY2xpZW50LCBidXQgZG91YmxlLWNoZWNrIGluIGNhc2UgdGhlIGNsaWVudCB3cmFwcGVyIGlzIGJ5cGFzc2VkCi0gICAgaWYgKGF0dHItPnNvdXJjZSA8IEFVRElPX1NPVVJDRV9ERUZBVUxUICYmIGF0dHItPnNvdXJjZSA+PSBBVURJT19TT1VSQ0VfQ05UICYmCi0gICAgICAgICAgICBhdHRyLT5zb3VyY2UgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQgJiYgYXR0ci0+c291cmNlICE9IEFVRElPX1NPVVJDRV9GTV9UVU5FUikgeworICAgIGlmICgoaW5wdXRTb3VyY2UgPCBBVURJT19TT1VSQ0VfREVGQVVMVCkKKyAgICAgICAgICAgIHx8IChpbnB1dFNvdXJjZSA+PSBBVURJT19TT1VSQ0VfQ05UCisgICAgICAgICAgICAgICAgJiYgaW5wdXRTb3VyY2UgIT0gQVVESU9fU09VUkNFX0hPVFdPUkQKKyAgICAgICAgICAgICAgICAmJiBpbnB1dFNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRk1fVFVORVIKKyAgICAgICAgICAgICAgICAmJiBpbnB1dFNvdXJjZSAhPSBBVURJT19TT1VSQ0VfRUNIT19SRUZFUkVOQ0UpKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCiAgICAgYm9vbCB1cGRhdGVQaWQgPSAocGlkID09IC0xKTsKICAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotICAgIGlmICghaXNUcnVzdGVkQ2FsbGluZ1VpZChjYWxsaW5nVWlkKSkgeworICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoY2FsbGluZ1VpZCkpIHsKICAgICAgICAgQUxPR1dfSUYodWlkICE9ICh1aWRfdCktMSAmJiB1aWQgIT0gY2FsbGluZ1VpZCwKICAgICAgICAgICAgICAgICAiJXMgdWlkICVkIHRyaWVkIHRvIHBhc3MgaXRzZWxmIG9mZiBhcyAlZCIsIF9fRlVOQ1RJT05fXywgY2FsbGluZ1VpZCwgdWlkKTsKICAgICAgICAgdWlkID0gY2FsbGluZ1VpZDsKQEAgLTM0MiwxNCArMzk3LDE3IEBACiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKLSAgICBpZiAoKGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LIHx8Ci0gICAgICAgIGF0dHItPnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfRE9XTkxJTksgfHwKLSAgICAgICAgYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMKSAmJgotICAgICAgICAhY2FwdHVyZUF1ZGlvT3V0cHV0QWxsb3dlZChwaWQsIHVpZCkpIHsKKyAgICBib29sIGNhbkNhcHR1cmVPdXRwdXQgPSBjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZCwgdWlkKTsKKyAgICBpZiAoKGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9VUExJTksgfHwKKyAgICAgICAgaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX0RPV05MSU5LIHx8CisgICAgICAgIGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9WT0lDRV9DQUxMIHx8CisgICAgICAgIGlucHV0U291cmNlID09IEFVRElPX1NPVVJDRV9FQ0hPX1JFRkVSRU5DRSkgJiYKKyAgICAgICAgIWNhbkNhcHR1cmVPdXRwdXQpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KIAotICAgIGlmICgoYXR0ci0+c291cmNlID09IEFVRElPX1NPVVJDRV9IT1RXT1JEKSAmJiAhY2FwdHVyZUhvdHdvcmRBbGxvd2VkKHBpZCwgdWlkKSkgeworICAgIGJvb2wgY2FuQ2FwdHVyZUhvdHdvcmQgPSBjYXB0dXJlSG90d29yZEFsbG93ZWQob3BQYWNrYWdlTmFtZSwgcGlkLCB1aWQpOworICAgIGlmICgoaW5wdXRTb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmICFjYW5DYXB0dXJlSG90d29yZCkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIApAQCAtMzYyLDcgKzQyMCw3IEBACiAgICAgICAgIHsKICAgICAgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CiAgICAgICAgICAgICAvLyB0aGUgYXVkaW9faW5fYWNvdXN0aWNzX3QgcGFyYW1ldGVyIGlzIGlnbm9yZWQgYnkgZ2V0X2lucHV0KCkKLSAgICAgICAgICAgIHN0YXR1cyA9IG1BdWRpb1BvbGljeU1hbmFnZXItPmdldElucHV0Rm9yQXR0cihhdHRyLCBpbnB1dCwgc2Vzc2lvbiwgdWlkLAorICAgICAgICAgICAgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0SW5wdXRGb3JBdHRyKGF0dHIsIGlucHV0LCByaWlkLCBzZXNzaW9uLCB1aWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncywgc2VsZWN0ZWREZXZpY2VJZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnB1dFR5cGUsIHBvcnRJZCk7CkBAIC0zNzIsMTIgKzQzMCwxNSBAQAogICAgICAgICBpZiAoc3RhdHVzID09IE5PX0VSUk9SKSB7CiAgICAgICAgICAgICAvLyBlbmZvcmNlIHBlcm1pc3Npb24gKGlmIGFueSkgcmVxdWlyZWQgZm9yIGVhY2ggdHlwZSBvZiBpbnB1dAogICAgICAgICAgICAgc3dpdGNoIChpbnB1dFR5cGUpIHsKKyAgICAgICAgICAgIGNhc2UgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9NSVhfUFVCTElDX0NBUFRVUkVfUExBWUJBQ0s6CisgICAgICAgICAgICAgICAgLy8gdGhpcyB1c2UgY2FzZSBoYXMgYmVlbiB2YWxpZGF0ZWQgaW4gYXVkaW8gc2VydmljZSB3aXRoIGEgTWVkaWFQcm9qZWN0aW9uIHRva2VuLAorICAgICAgICAgICAgICAgIC8vIGFuZCBkb2Vzbid0IHJlbHkgb24gcmVndWxhciBwZXJtaXNzaW9ucwogICAgICAgICAgICAgY2FzZSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0xFR0FDWToKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIGNhc2UgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9URUxFUEhPTllfUlg6CiAgICAgICAgICAgICAgICAgLy8gRklYTUU6IHVzZSB0aGUgc2FtZSBwZXJtaXNzaW9uIGFzIGZvciByZW1vdGUgc3VibWl4IGZvciBub3cuCiAgICAgICAgICAgICBjYXNlIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfTUlYX0NBUFRVUkU6Ci0gICAgICAgICAgICAgICAgaWYgKCFjYXB0dXJlQXVkaW9PdXRwdXRBbGxvd2VkKHBpZCwgdWlkKSkgeworICAgICAgICAgICAgICAgIGlmICghY2FuQ2FwdHVyZU91dHB1dCkgewogICAgICAgICAgICAgICAgICAgICBBTE9HRSgiZ2V0SW5wdXRGb3JBdHRyKCkgcGVybWlzc2lvbiBkZW5pZWQ6IGNhcHR1cmUgbm90IGFsbG93ZWQiKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgICAgICAgICAgfQpAQCAtMzk4LDIzICs0NTksMjAgQEAKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgewogICAgICAgICAgICAgaWYgKHN0YXR1cyA9PSBQRVJNSVNTSU9OX0RFTklFRCkgewogICAgICAgICAgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZUlucHV0KCppbnB1dCwgc2Vzc2lvbik7CisgICAgICAgICAgICAgICAgbUF1ZGlvUG9saWN5TWFuYWdlci0+cmVsZWFzZUlucHV0KCpwb3J0SWQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICAgICAgfQogCi0gICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjbGllbnQgPQotICAgICAgICAgICAgICAgIG5ldyBBdWRpb1JlY29yZENsaWVudCgqYXR0ciwgKmlucHV0LCB1aWQsIHBpZCwgb3BQYWNrYWdlTmFtZSwgc2Vzc2lvbik7Ci0gICAgICAgIGNsaWVudC0+YWN0aXZlID0gZmFsc2U7Ci0gICAgICAgIGNsaWVudC0+aXNDb25jdXJyZW50ID0gZmFsc2U7Ci0gICAgICAgIGNsaWVudC0+aXNWaXJ0dWFsRGV2aWNlID0gZmFsc2U7IC8vVE9ETyA6IHVwZGF0ZSBmcm9tIEFQTS0+Z2V0SW5wdXRGb3JBdHRyKCkKLSAgICAgICAgY2xpZW50LT5kZXZpY2VJZCA9ICpzZWxlY3RlZERldmljZUlkOworICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gY2xpZW50ID0gbmV3IEF1ZGlvUmVjb3JkQ2xpZW50KCphdHRyLCAqaW5wdXQsIHVpZCwgcGlkLCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzZWxlY3RlZERldmljZUlkLCBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbkNhcHR1cmVPdXRwdXQsIGNhbkNhcHR1cmVIb3R3b3JkKTsKICAgICAgICAgbUF1ZGlvUmVjb3JkQ2xpZW50cy5hZGQoKnBvcnRJZCwgY2xpZW50KTsKICAgICB9CiAKICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKICAgICAgICAgLy8gY3JlYXRlIGF1ZGlvIHByZSBwcm9jZXNzb3JzIGFjY29yZGluZyB0byBpbnB1dCBzb3VyY2UKLSAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRJbnB1dEVmZmVjdHMoKmlucHV0LCBhdHRyLT5zb3VyY2UsIHNlc3Npb24pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPmFkZElucHV0RWZmZWN0cygqaW5wdXQsIGlucHV0U291cmNlLCBzZXNzaW9uKTsKICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUiAmJiBzdGF0dXMgIT0gQUxSRUFEWV9FWElTVFMpIHsKICAgICAgICAgICAgIEFMT0dXKCJGYWlsZWQgdG8gYWRkIGVmZmVjdHMgb24gaW5wdXQgJWQiLCAqaW5wdXQpOwogICAgICAgICB9CkBAIC00MjIsNDggKzQ4MCwxNyBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotLy8gdGhpcyBpcyByZXBsaWNhdGVkIGZyb20gZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJhdWRpb2NsaWVudC9BdWRpb1JlY29yZC5jcHAKLS8vIFhYWCAtLSBmaWd1cmUgb3V0IGhvdyB0byBwdXQgaXQgaW50byBhIGNvbW1vbiwgc2hhcmVkIGxvY2F0aW9uCi0KLXN0YXRpYyBzdGQ6OnN0cmluZyBhdWRpb1NvdXJjZVN0cmluZyhhdWRpb19zb3VyY2VfdCB2YWx1ZSkgewotICAgIHN0ZDo6c3RyaW5nIHNvdXJjZTsKLSAgICBpZiAoU291cmNlVHlwZUNvbnZlcnRlcjo6dG9TdHJpbmcodmFsdWUsIHNvdXJjZSkpIHsKLSAgICAgICAgcmV0dXJuIHNvdXJjZTsKLSAgICB9Ci0gICAgY2hhciByYXdidWZmZXJbMTZdOyAgLy8gcm9vbSBmb3IgIiVkIgotICAgIHNucHJpbnRmKHJhd2J1ZmZlciwgc2l6ZW9mKHJhd2J1ZmZlciksICIlZCIsIHZhbHVlKTsKLSAgICByZXR1cm4gcmF3YnVmZmVyOwotfQotCi1zdGF0aWMgc3RkOjpzdHJpbmcgYXVkaW9Db25jdXJyZW5jeVN0cmluZygKLSAgICAgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OmNvbmN1cnJlbmN5X3R5cGVfX21hc2tfdCBjb25jdXJyZW5jeSkKLXsKLSAgICBjaGFyIGJ1ZmZlcls2NF07IC8vIG92ZXJzaXplZAotICAgIGlmIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQUxMKSB7Ci0gICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICIlcyVzJXMlcyIsCi0gICAgICAgICAgICAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBTEwpPyAiLGNhbGwiOiIiLAotICAgICAgICAgICAgKGNvbmN1cnJlbmN5ICYgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OkFQSV9JTlBVVF9DT05DVVJSRU5DWV9DQVBUVVJFKT8gIixjYXB0dXJlIjoiIiwKLSAgICAgICAgICAgIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfSE9UV09SRCk/ICIsaG90d29yZCI6IiIsCi0gICAgICAgICAgICAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX1BSRUVNUFQpPyAiLHByZWVtcHQiOiIiKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzbnByaW50ZihidWZmZXIsIHNpemVvZihidWZmZXIpLCAiLG5vbmUiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gJmJ1ZmZlclsxXTsKLX0KLQogc3RkOjpzdHJpbmcgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKSB7Ci0gICAgc3RkOjpzdHJpbmcgdHlwZVN0cjsKICAgICBzdHJ1Y3QgYXVkaW9fcG9ydCBwb3J0ID0ge307CiAgICAgcG9ydC5pZCA9IHBvcnRJZDsKICAgICBzdGF0dXNfdCBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRBdWRpb1BvcnQoJnBvcnQpOwogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgcG9ydC50eXBlID09IEFVRElPX1BPUlRfVFlQRV9ERVZJQ0UpIHsKLSAgICAgICAgZGV2aWNlVG9TdHJpbmcocG9ydC5leHQuZGV2aWNlLnR5cGUsIHR5cGVTdHIpOworICAgICAgICByZXR1cm4gdG9TdHJpbmcocG9ydC5leHQuZGV2aWNlLnR5cGUpOwogICAgIH0KLSAgICByZXR1cm4gdHlwZVN0cjsKKyAgICByZXR1cm4ge307CiB9CiAKLXN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwgYm9vbCAqc2lsZW5jZWQpCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0SW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKQEAgLTQ4NiwyNyArNTEzLDI1IEBACiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CiAKLSAgICAvLyBJZiBVSUQgaW5hY3RpdmUgaXQgcmVjb3JkcyBzaWxlbmNlIHVudGlsIGJlY29taW5nIGFjdGl2ZQotICAgICpzaWxlbmNlZCA9ICFtVWlkUG9saWN5LT5pc1VpZEFjdGl2ZShjbGllbnQtPnVpZCkgJiYgIWNsaWVudC0+aXNWaXJ0dWFsRGV2aWNlOwotCiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBBdWRpb1BvbGljeUludGVyZmFjZTo6Y29uY3VycmVuY3lfdHlwZV9fbWFza190IGNvbmN1cnJlbmN5ID0KLSAgICAgICAgICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfTk9ORTsKKworICAgIGNsaWVudC0+YWN0aXZlID0gdHJ1ZTsKKyAgICBjbGllbnQtPnN0YXJ0VGltZU5zID0gc3lzdGVtVGltZSgpOworICAgIHVwZGF0ZVVpZFN0YXRlc19sKCk7CiAKICAgICBzdGF0dXNfdCBzdGF0dXM7CiAgICAgewogICAgICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgICAgICBzdGF0dXMgPSBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydElucHV0KAotICAgICAgICAgICAgICAgICAgICBjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24sICpzaWxlbmNlZCwgJmNvbmN1cnJlbmN5KTsKKyAgICAgICAgc3RhdHVzID0gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRJbnB1dChwb3J0SWQpOwogCiAgICAgfQogCiAgICAgLy8gaW5jbHVkaW5nIHN1Y2Nlc3NlcyBnZXRzIHZlcnkgdmVyYm9zZQorICAgIC8vIGJ1dCBvbmNlIHdlIGN1dCBvdmVyIHRvIHdlc3R3b3JsZCwgbG9nIHRoZW0gYWxsLgogICAgIGlmIChzdGF0dXMgIT0gTk9fRVJST1IpIHsKIAogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5W10gPSAiYXVkaW9wb2xpY3kiOwogCi0gICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9Qb2xpY3lSZWFzb25bXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnJlYXNvbiI7CiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9Qb2xpY3lTdGF0dXNbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnN0YXR1cyI7CiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9Qb2xpY3lScXN0U3JjW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5ycXN0LnNyYyI7CiAgICAgICAgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9Qb2xpY3lScXN0UGtnW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5ycXN0LnBrZyI7CkBAIC01MjAsNDIgKzU0NSw0MyBAQAogICAgICAgICBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvUG9saWN5QWN0aXZlRGV2aWNlW10gPQogICAgICAgICAgICAgICAgICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LmFjdGl2ZS5kZXZpY2UiOwogCi0gICAgICAgIE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSA9IG5ldyBNZWRpYUFuYWx5dGljc0l0ZW0oa0F1ZGlvUG9saWN5KTsKKyAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICppdGVtID0gTWVkaWFBbmFseXRpY3NJdGVtOjpjcmVhdGUoa0F1ZGlvUG9saWN5KTsKICAgICAgICAgaWYgKGl0ZW0gIT0gTlVMTCkgewogCi0gICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJlYXNvbiwgYXVkaW9Db25jdXJyZW5jeVN0cmluZyhjb25jdXJyZW5jeSkuY19zdHIoKSk7CiAgICAgICAgICAgICBpdGVtLT5zZXRJbnQzMihrQXVkaW9Qb2xpY3lTdGF0dXMsIHN0YXR1cyk7CiAKICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5UnFzdFNyYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9Tb3VyY2VTdHJpbmcoY2xpZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSkuY19zdHIoKSk7Ci0gICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJxc3RQa2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKFN0cmluZzgoY2xpZW50LT5vcFBhY2thZ2VOYW1lKS5zdHJpbmcoKSkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvU3RyaW5nKGNsaWVudC0+YXR0cmlidXRlcy5zb3VyY2UpLmNfc3RyKCkpOwogICAgICAgICAgICAgaXRlbS0+c2V0SW50MzIoa0F1ZGlvUG9saWN5UnFzdFNlc3Npb24sIGNsaWVudC0+c2Vzc2lvbik7Ci0KKyAgICAgICAgICAgIGlmIChjbGllbnQtPm9wUGFja2FnZU5hbWUuc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJxc3RQa2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyhTdHJpbmc4KGNsaWVudC0+b3BQYWNrYWdlTmFtZSkuc3RyaW5nKCkpLmNfc3RyKCkpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeVJxc3RQa2csIHN0ZDo6dG9fc3RyaW5nKGNsaWVudC0+dWlkKS5jX3N0cigpKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoCiAgICAgICAgICAgICAgICAgICAgIGtBdWRpb1BvbGljeVJxc3REZXZpY2UsIGdldERldmljZVR5cGVTdHJGb3JQb3J0SWQoY2xpZW50LT5kZXZpY2VJZCkuY19zdHIoKSk7CiAKLSAgICAgICAgICAgIC8vIGZpZ3VyZSBvdXQgd2hvIGlzIGFjdGl2ZQotICAgICAgICAgICAgLy8gTkI6IG1pZ2h0IHRoZSBvdGhlciBwYXJ0eSBoYXZlIGdpdmVuIHVwIHRoZSBtaWNyb3Bob25lIHNpbmNlIHRoZW4/IGhvdyBzdXJlLgotICAgICAgICAgICAgLy8gcGVyaGFwcyBjb3VsZCBoYXZlIGdpdmVuIHVwIG9uIGl0LgotICAgICAgICAgICAgLy8gd2UgaG9sZCBtTG9jaywgc28gcGVyaGFwcyB3ZSdyZSBzYWZlIGZvciB0aGlzIGxvb3BpbmcKLSAgICAgICAgICAgIGlmIChjb25jdXJyZW5jeSAhPSBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX05PTkUpIHsKLSAgICAgICAgICAgICAgICBpbnQgY291bnQgPSBtQXVkaW9SZWNvcmRDbGllbnRzLnNpemUoKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaTxjb3VudCA7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBpZiAocG9ydElkID09IG1BdWRpb1JlY29yZENsaWVudHMua2V5QXQoaSkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBvdGhlciA9IG1BdWRpb1JlY29yZENsaWVudHMudmFsdWVBdChpKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG90aGVyLT5hY3RpdmUpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIGtlZXBzIHRoZSBsYXN0IG9mIHRoZSBjbGllbnRzIG1hcmtlZCBhY3RpdmUKLSAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0tPnNldENTdHJpbmcoa0F1ZGlvUG9saWN5QWN0aXZlU3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb1NvdXJjZVN0cmluZyhvdGhlci0+YXR0cmlidXRlcy5zb3VyY2UpLmNfc3RyKCkpOworICAgICAgICAgICAgaW50IGNvdW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy5zaXplKCk7CisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50IDsgaSsrKSB7CisgICAgICAgICAgICAgICAgaWYgKHBvcnRJZCA9PSBtQXVkaW9SZWNvcmRDbGllbnRzLmtleUF0KGkpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gb3RoZXIgPSBtQXVkaW9SZWNvcmRDbGllbnRzLnZhbHVlQXQoaSk7CisgICAgICAgICAgICAgICAgaWYgKG90aGVyLT5hY3RpdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8ga2VlcHMgdGhlIGxhc3Qgb2YgdGhlIGNsaWVudHMgbWFya2VkIGFjdGl2ZQorICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeUFjdGl2ZVNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b1N0cmluZyhvdGhlci0+YXR0cmlidXRlcy5zb3VyY2UpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRJbnQzMihrQXVkaW9Qb2xpY3lBY3RpdmVTZXNzaW9uLCBvdGhlci0+c2Vzc2lvbik7CisgICAgICAgICAgICAgICAgICAgIGlmIChvdGhlci0+b3BQYWNrYWdlTmFtZS5zaXplKCkgIT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lBY3RpdmVQa2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoU3RyaW5nOChvdGhlci0+b3BQYWNrYWdlTmFtZSkuc3RyaW5nKCkpLmNfc3RyKCkpOwotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0SW50MzIoa0F1ZGlvUG9saWN5QWN0aXZlU2Vzc2lvbiwgb3RoZXItPnNlc3Npb24pOwotICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lBY3RpdmVEZXZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERldmljZVR5cGVTdHJGb3JQb3J0SWQob3RoZXItPmRldmljZUlkKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcoU3RyaW5nOChvdGhlci0+b3BQYWNrYWdlTmFtZSkuc3RyaW5nKCkpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS0+c2V0Q1N0cmluZyhrQXVkaW9Qb2xpY3lScXN0UGtnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnRvX3N0cmluZyhvdGhlci0+dWlkKS5jX3N0cigpKTsKICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpdGVtLT5zZXRDU3RyaW5nKGtBdWRpb1BvbGljeUFjdGl2ZURldmljZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXREZXZpY2VUeXBlU3RyRm9yUG9ydElkKG90aGVyLT5kZXZpY2VJZCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgaXRlbS0+c2VsZnJlY29yZCgpOwpAQCAtNTY0LDIwICs1OTAsMTAgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IpIHsKLSAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihjb25jdXJyZW5jeSAmIH5BdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0FMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RhcnRJbnB1dCgpOiBpbnZhbGlkIGNvbmN1cnJlbmN5IHR5cGUgJWQiLCAoaW50KWNvbmN1cnJlbmN5KTsKLQotICAgICAgICAvLyBlbmZvcmNlIHBlcm1pc3Npb24gKGlmIGFueSkgcmVxdWlyZWQgZm9yIGVhY2ggdHlwZSBvZiBjb25jdXJyZW5jeQotICAgICAgICBpZiAoY29uY3VycmVuY3kgJiBBdWRpb1BvbGljeUludGVyZmFjZTo6QVBJX0lOUFVUX0NPTkNVUlJFTkNZX0NBTEwpIHsKLSAgICAgICAgICAgIC8vVE9ETzogY2hlY2sgaW5jYWxsIGNhcHR1cmUgcGVybWlzc2lvbgotICAgICAgICB9Ci0gICAgICAgIGlmIChjb25jdXJyZW5jeSAmIEF1ZGlvUG9saWN5SW50ZXJmYWNlOjpBUElfSU5QVVRfQ09OQ1VSUkVOQ1lfQ0FQVFVSRSkgewotICAgICAgICAgICAgLy9UT0RPOiBjaGVjayBjb25jdXJyZW50IGNhcHR1cmUgcGVybWlzc2lvbgotICAgICAgICB9Ci0KLSAgICAgICAgY2xpZW50LT5hY3RpdmUgPSB0cnVlOwotICAgIH0gZWxzZSB7CisgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICBjbGllbnQtPmFjdGl2ZSA9IGZhbHNlOworICAgICAgICBjbGllbnQtPnN0YXJ0VGltZU5zID0gMDsKKyAgICAgICAgdXBkYXRlVWlkU3RhdGVzX2woKTsKICAgICAgICAgZmluaXNoUmVjb3JkaW5nKGNsaWVudC0+b3BQYWNrYWdlTmFtZSwgY2xpZW50LT51aWQpOwogICAgIH0KIApAQCAtNTg5LDYgKzYwNSw3IEBACiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CisKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogCiAgICAgc3NpemVfdCBpbmRleCA9IG1BdWRpb1JlY29yZENsaWVudHMuaW5kZXhPZktleShwb3J0SWQpOwpAQCAtNTk4LDExICs2MTUsMTQgQEAKICAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gY2xpZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50cy52YWx1ZUF0KGluZGV4KTsKIAogICAgIGNsaWVudC0+YWN0aXZlID0gZmFsc2U7CisgICAgY2xpZW50LT5zdGFydFRpbWVOcyA9IDA7CisKKyAgICB1cGRhdGVVaWRTdGF0ZXNfbCgpOwogCiAgICAgLy8gZmluaXNoIHRoZSByZWNvcmRpbmcgYXBwIG9wCiAgICAgZmluaXNoUmVjb3JkaW5nKGNsaWVudC0+b3BQYWNrYWdlTmFtZSwgY2xpZW50LT51aWQpOwogICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BJbnB1dChjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24pOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdG9wSW5wdXQocG9ydElkKTsKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbGVhc2VJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKQEAgLTYyMCw2ICs2NDAsMTQgQEAKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQogICAgICAgICBjbGllbnQgPSBtQXVkaW9SZWNvcmRDbGllbnRzLnZhbHVlQXQoaW5kZXgpOworCisgICAgICAgIGlmIChjbGllbnQtPmFjdGl2ZSkgeworICAgICAgICAgICAgQUxPR1coIiVzIHJlbGVhc2luZyBhY3RpdmUgY2xpZW50IHBvcnRJZCAlZCIsIF9fRlVOQ1RJT05fXywgcG9ydElkKTsKKyAgICAgICAgICAgIGNsaWVudC0+YWN0aXZlID0gZmFsc2U7CisgICAgICAgICAgICBjbGllbnQtPnN0YXJ0VGltZU5zID0gMDsKKyAgICAgICAgICAgIHVwZGF0ZVVpZFN0YXRlc19sKCk7CisgICAgICAgIH0KKwogICAgICAgICBtQXVkaW9SZWNvcmRDbGllbnRzLnJlbW92ZUl0ZW0ocG9ydElkKTsKICAgICB9CiAgICAgaWYgKGNsaWVudCA9PSAwKSB7CkBAIC02MjcsMTUgKzY1NSwxNSBAQAogICAgIH0KICAgICBpZiAoYXVkaW9Qb2xpY3lFZmZlY3RzICE9IDApIHsKICAgICAgICAgLy8gcmVsZWFzZSBhdWRpbyBwcm9jZXNzb3JzIGZyb20gdGhlIGlucHV0Ci0gICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGF1ZGlvUG9saWN5RWZmZWN0cy0+cmVsZWFzZUlucHV0RWZmZWN0cyhjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24pOworICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdWRpb1BvbGljeUVmZmVjdHMtPnJlbGVhc2VJbnB1dEVmZmVjdHMoY2xpZW50LT5pbywgY2xpZW50LT5zZXNzaW9uKTsKICAgICAgICAgaWYoc3RhdHVzICE9IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBBTE9HVygiRmFpbGVkIHRvIHJlbGVhc2UgZWZmZWN0cyBvbiBpbnB1dCAlZCIsIGNsaWVudC0+aW5wdXQpOworICAgICAgICAgICAgQUxPR1coIkZhaWxlZCB0byByZWxlYXNlIGVmZmVjdHMgb24gaW5wdXQgJWQiLCBjbGllbnQtPmlvKTsKICAgICAgICAgfQogICAgIH0KICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbGVhc2VJbnB1dChjbGllbnQtPmlucHV0LCBjbGllbnQtPnNlc3Npb24pOworICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlSW5wdXQocG9ydElkKTsKICAgICB9CiB9CiAKQEAgLTY5NSwxNCArNzIzLDYyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIGlmICghc2V0dGluZ3NBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBpbmRleCwgZGV2aWNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCwgYXVkaW9fZGV2aWNlc190IGRldmljZSkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldFZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBpbmRleCwgZGV2aWNlKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZpbmRleCkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmdldE1pblZvbHVtZUluZGV4Rm9yQXR0cmlidXRlcyhhdHRyaWJ1dGVzLCBpbmRleCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRNYXhWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoYXR0cmlidXRlcywgaW5kZXgpOworfQorCiB1aW50MzJfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldFN0cmF0ZWd5Rm9yU3RyZWFtKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQogewogICAgIGlmICh1aW50MzJfdChzdHJlYW0pID49IEFVRElPX1NUUkVBTV9QVUJMSUNfQ05UKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gUFJPRFVDVF9TVFJBVEVHWV9OT05FOwogICAgIH0KICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gUFJPRFVDVF9TVFJBVEVHWV9OT05FOwogICAgIH0KKyAgICAvLyBETyBOT1QgTE9DSywgbWF5IGJlIGNhbGxlZCBmcm9tIEF1ZGlvRmxpbmdlciB3aXRoIGxvY2sgaGVsZCwgcmVhY2hpbmcgZGVhZGxvY2sKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRTdHJhdGVneUZvclN0cmVhbShzdHJlYW0pOwogfQpAQCAtNzQyLDcgKzgxOCw3IEBACiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1FZmZlY3RzTG9jayk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWdpc3RlckVmZmVjdChkZXNjLCBpbywgc3RyYXRlZ3ksIHNlc3Npb24sIGlkKTsKIH0KQEAgLTc1Miw3ICs4MjgsNyBAQAogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtRWZmZWN0c0xvY2spOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+dW5yZWdpc3RlckVmZmVjdChpZCk7CiB9CkBAIC03NjIsMTEgKzgzOCwyMSBAQAogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQotICAgIE11dGV4OjpBdXRvbG9jayBfbChtRWZmZWN0c0xvY2spOworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0RWZmZWN0RW5hYmxlZChpZCwgZW5hYmxlZCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6bW92ZUVmZmVjdHNUb0lvKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIGlkcywgYXVkaW9faW9faGFuZGxlX3QgaW8pCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5tb3ZlRWZmZWN0c1RvSW8oaWRzLCBpbyk7Cit9CisKIGJvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc1N0cmVhbUFjdGl2ZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwgdWludDMyX3QgaW5QYXN0TXMpIGNvbnN0CiB7CiAgICAgaWYgKHVpbnQzMl90KHN0cmVhbSkgPj0gQVVESU9fU1RSRUFNX1BVQkxJQ19DTlQpIHsKQEAgLTgwMywyNyArODg5LDExNCBAQAogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc1NvdXJjZUFjdGl2ZShzb3VyY2UpOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnF1ZXJ5RGVmYXVsdFByZVByb2Nlc3NpbmcoYXVkaW9fc2Vzc2lvbl90IGF1ZGlvU2Vzc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlZmZlY3RfZGVzY3JpcHRvcl90ICpkZXNjcmlwdG9ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqY291bnQpCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmdldEF1ZGlvUG9saWN5RWZmZWN0cyhzcDxBdWRpb1BvbGljeUVmZmVjdHM+JiBhdWRpb1BvbGljeUVmZmVjdHMpCiB7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewotICAgICAgICAqY291bnQgPSAwOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIGF1ZGlvUG9saWN5RWZmZWN0cyA9IG1BdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgfQogICAgIGlmIChhdWRpb1BvbGljeUVmZmVjdHMgPT0gMCkgewotICAgICAgICAqY291bnQgPSAwOwogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCkKK3sKKyAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+YXVkaW9Qb2xpY3lFZmZlY3RzOworICAgIHN0YXR1c190IHN0YXR1cyA9IGdldEF1ZGlvUG9saWN5RWZmZWN0cyhhdWRpb1BvbGljeUVmZmVjdHMpOworICAgIGlmIChzdGF0dXMgIT0gT0spIHsKKyAgICAgICAgKmNvdW50ID0gMDsKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CiAgICAgcmV0dXJuIGF1ZGlvUG9saWN5RWZmZWN0cy0+cXVlcnlEZWZhdWx0SW5wdXRFZmZlY3RzKAogICAgICAgICAgICAgKGF1ZGlvX3Nlc3Npb25fdClhdWRpb1Nlc3Npb24sIGRlc2NyaXB0b3JzLCBjb3VudCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6YWRkU291cmNlRGVmYXVsdEVmZmVjdChjb25zdCBlZmZlY3RfdXVpZF90ICp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVmZmVjdF91dWlkX3QgKnV1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBwcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdW5pcXVlX2lkX3QqIGlkKQoreworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAoIW1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5hZGRTb3VyY2VEZWZhdWx0RWZmZWN0KAorICAgICAgICAgICAgdHlwZSwgb3BQYWNrYWdlTmFtZSwgdXVpZCwgcHJpb3JpdHksIHNvdXJjZSwgaWQpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoY29uc3QgZWZmZWN0X3V1aWRfdCAqdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpCit7CisgICAgc3A8QXVkaW9Qb2xpY3lFZmZlY3RzPmF1ZGlvUG9saWN5RWZmZWN0czsKKyAgICBzdGF0dXNfdCBzdGF0dXMgPSBnZXRBdWRpb1BvbGljeUVmZmVjdHMoYXVkaW9Qb2xpY3lFZmZlY3RzKTsKKyAgICBpZiAoc3RhdHVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorICAgIGlmICghbW9kaWZ5RGVmYXVsdEF1ZGlvRWZmZWN0c0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBhdWRpb1BvbGljeUVmZmVjdHMtPmFkZFN0cmVhbURlZmF1bHRFZmZlY3QoCisgICAgICAgICAgICB0eXBlLCBvcFBhY2thZ2VOYW1lLCB1dWlkLCBwcmlvcml0eSwgdXNhZ2UsIGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQoreworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAoIW1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZW1vdmVTb3VyY2VEZWZhdWx0RWZmZWN0KGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKQoreworICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz5hdWRpb1BvbGljeUVmZmVjdHM7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKGF1ZGlvUG9saWN5RWZmZWN0cyk7CisgICAgaWYgKHN0YXR1cyAhPSBPSykgeworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0KKyAgICBpZiAoIW1vZGlmeURlZmF1bHRBdWRpb0VmZmVjdHNBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKyAgICByZXR1cm4gYXVkaW9Qb2xpY3lFZmZlY3RzLT5yZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aWRfdCB1aWQsIGF1ZGlvX2ZsYWdzX21hc2tfdCBjYXB0dXJlUG9saWN5KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIEFMT0dWKCIlcygpIG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHVpbnRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIGlmICh1aWQgIT0gY2FsbGluZ1VpZCkgeworICAgICAgICBBTE9HRCgiJXMoKSB1aWQgaW52YWxpZCAlZCAhPSAlZCIsIF9fZnVuY19fLCB1aWQsIGNhbGxpbmdVaWQpOworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aWQsIGNhcHR1cmVQb2xpY3kpOworfQorCiBib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNPZmZsb2FkU3VwcG9ydGVkKGNvbnN0IGF1ZGlvX29mZmxvYWRfaW5mb190JiBpbmZvKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKQEAgLTgzMSwxMiArMTAwNCwyMSBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIF9sZShtRWZmZWN0c0xvY2spOyAvLyBpc09mZmxvYWRTdXBwb3J0ZWQgcXVlcmllcyBmb3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm9uLW9mZmxvYWRhYmxlIGVmZmVjdHMKICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwogICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5pc09mZmxvYWRTdXBwb3J0ZWQoaW5mbyk7CiB9CiAKK2Jvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjppc0RpcmVjdE91dHB1dFN1cHBvcnRlZChjb25zdCBhdWRpb19jb25maWdfYmFzZV90JiBjb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190JiBhdHRyaWJ1dGVzKSB7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVigibUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+aXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uZmlnLCBhdHRyaWJ1dGVzKTsKK30KKworCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1BvcnRzKGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfdHlwZV90IHR5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCAqbnVtX3BvcnRzLApAQCAtOTQwLDkgKzExMjIsMjIgQEAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVnaXN0ZXJQb2xpY3lNaXhlcyhjb25zdCBWZWN0b3I8QXVkaW9NaXg+JiBtaXhlcywgYm9vbCByZWdpc3RyYXRpb24pCiB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICBpZighbW9kaWZ5QXVkaW9Sb3V0aW5nQWxsb3dlZCgpKSB7CisKKyAgICAvLyBsb29wYmFja3xyZW5kZXIgb25seSBuZWVkIGEgTWVkaWFQcm9qZWN0aW9uIChjaGVja2VkIGluIGNhbGxlciBBdWRpb1NlcnZpY2UuamF2YSkKKyAgICBib29sIG5lZWRNb2RpZnlBdWRpb1JvdXRpbmcgPSBzdGQ6OmFueV9vZihtaXhlcy5iZWdpbigpLCBtaXhlcy5lbmQoKSwgW10oYXV0byYgbWl4KSB7CisgICAgICAgICAgICByZXR1cm4gIWlzX21peF9sb29wYmFja19yZW5kZXIobWl4Lm1Sb3V0ZUZsYWdzKTsgfSk7CisgICAgaWYgKG5lZWRNb2RpZnlBdWRpb1JvdXRpbmcgJiYgIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQorCisgICAgYm9vbCBuZWVkQ2FwdHVyZU1lZGlhT3V0cHV0ID0gc3RkOjphbnlfb2YobWl4ZXMuYmVnaW4oKSwgbWl4ZXMuZW5kKCksIFtdKGF1dG8mIG1peCkgeworICAgICAgICAgICAgcmV0dXJuIG1peC5tQWxsb3dQcml2aWxlZ2VkUGxheWJhY2tDYXB0dXJlOyB9KTsKKyAgICBjb25zdCB1aWRfdCBjYWxsaW5nVWlkID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOworICAgIGNvbnN0IHBpZF90IGNhbGxpbmdQaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgaWYgKG5lZWRDYXB0dXJlTWVkaWFPdXRwdXQgJiYgIWNhcHR1cmVNZWRpYU91dHB1dEFsbG93ZWQoY2FsbGluZ1BpZCwgY2FsbGluZ1VpZCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KKwogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKICAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CiAgICAgfQpAQCAtOTU0LDI3ICsxMTQ5LDUzIEBACiAgICAgfQogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnN0YXJ0QXVkaW9Tb3VyY2UoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpzb3VyY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpCi17CitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkLAorICAgICAgICBjb25zdCBWZWN0b3I8QXVkaW9EZXZpY2VUeXBlQWRkcj4mIGRldmljZXMpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIGlmKCFtb2RpZnlBdWRpb1JvdXRpbmdBbGxvd2VkKCkpIHsKKyAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOworICAgIH0KICAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KICAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOwotICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zdGFydEF1ZGlvU291cmNlKHNvdXJjZSwgYXR0cmlidXRlcywgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldFVpZERldmljZUFmZmluaXRpZXModWlkLCBkZXZpY2VzKTsKIH0KIAotc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlKQorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVVaWREZXZpY2VBZmZpbml0aWVzKHVpZF90IHVpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgaWYoIW1vZGlmeUF1ZGlvUm91dGluZ0FsbG93ZWQoKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICAvLyBzdGFydEF1ZGlvU291cmNlIHNob3VsZCBiZSBjcmVhdGVkIGFzIHRoZSBjYWxsaW5nIHVpZAorICAgIGNvbnN0IHVpZF90IGNhbGxpbmdVaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RhcnRBdWRpb1NvdXJjZShzb3VyY2UsIGF0dHJpYnV0ZXMsIHBvcnRJZCwgY2FsbGluZ1VpZCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKQogewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CiAgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKLSAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c3RvcEF1ZGlvU291cmNlKGhhbmRsZSk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnN0b3BBdWRpb1NvdXJjZShwb3J0SWQpOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldE1hc3Rlck1vbm8oYm9vbCBtb25vKQpAQCAtMTAyNiw2ICsxMjQ3LDE3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdXJyb3VuZEZvcm1hdHNFbmFibGVkLCByZXBvcnRlZCk7CiB9CiAKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0SHdPZmZsb2FkRW5jb2RpbmdGb3JtYXRzU3VwcG9ydGVkRm9yQTJEUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxhdWRpb19mb3JtYXRfdD4gKmZvcm1hdHMpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBBdXRvQ2FsbGVyQ2xlYXIgYWNjOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKGZvcm1hdHMpOworfQorCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFN1cnJvdW5kRm9ybWF0RW5hYmxlZChhdWRpb19mb3JtYXRfdCBhdWRpb0Zvcm1hdCwgYm9vbCBlbmFibGVkKQogewogICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKQEAgLTEwMzYsNCArMTI2OCwxMDMgQEAKICAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0U3Vycm91bmRGb3JtYXRFbmFibGVkKGF1ZGlvRm9ybWF0LCBlbmFibGVkKTsKIH0KIAorc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbVVpZFBvbGljeS0+c2V0QXNzaXN0YW50VWlkKHVpZCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKQoreworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgbVVpZFBvbGljeS0+c2V0QTExeVVpZHModWlkcyk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICBBTE9HVygiJXMsIG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPmlzSGFwdGljUGxheWJhY2tTdXBwb3J0ZWQoKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcykKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5saXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhzdHJhdGVnaWVzKTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKAorICAgICAgICBjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLCBwcm9kdWN0X3N0cmF0ZWd5X3QgJnByb2R1Y3RTdHJhdGVneSkKK3sKKyAgICBpZiAobUF1ZGlvUG9saWN5TWFuYWdlciA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHJldHVybiBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5nZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGFhLCBwcm9kdWN0U3RyYXRlZ3kpOworfQorCitzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6Omxpc3RBdWRpb1ZvbHVtZUdyb3VwcyhBdWRpb1ZvbHVtZUdyb3VwVmVjdG9yICZncm91cHMpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+bGlzdEF1ZGlvVm9sdW1lR3JvdXBzKGdyb3Vwcyk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6Z2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2x1bWVfZ3JvdXBfdCAmdm9sdW1lR3JvdXApCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0Vm9sdW1lR3JvdXBGcm9tQXVkaW9BdHRyaWJ1dGVzKGFhLCB2b2x1bWVHcm91cCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6c2V0UnR0RW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBtVWlkUG9saWN5LT5zZXRSdHRFbmFibGVkKGVuYWJsZWQpOworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+c2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGRldmljZSk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyID09IE5VTEwpIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgcmV0dXJuIG1BdWRpb1BvbGljeU1hbmFnZXItPnJlbW92ZVByZWZlcnJlZERldmljZUZvclN0cmF0ZWd5KHN0cmF0ZWd5KTsKK30KKworc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpnZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpCit7CisgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICByZXR1cm4gbUF1ZGlvUG9saWN5TWFuYWdlci0+Z2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3koc3RyYXRlZ3ksIGRldmljZSk7Cit9CisKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmNwcAppbmRleCBmM2NkZGMzLi5jNDEzOWQzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuY3BwCkBAIC0yMiwzNiArMjIsMzMgQEAKICNkZWZpbmUgX19TVERJTlRfTElNSVRTCiAjZGVmaW5lIF9fU1REQ19MSU1JVF9NQUNST1MKICNpbmNsdWRlIDxzdGRpbnQuaD4KLQogI2luY2x1ZGUgPHN5cy90aW1lLmg+CisKKyNpbmNsdWRlIDxhdWRpb191dGlscy9jbG9jay5oPgogI2luY2x1ZGUgPGJpbmRlci9JU2VydmljZU1hbmFnZXIuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLSNpbmNsdWRlIDxjdXRpbHMvbXVsdGl1c2VyLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KLSNpbmNsdWRlIDxiaW5kZXIvQWN0aXZpdHlNYW5hZ2VyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25Db250cm9sbGVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lSZXN1bHRSZWNlaXZlci5oPgogI2luY2x1ZGUgPHV0aWxzL1N0cmluZzE2Lmg+CiAjaW5jbHVkZSA8dXRpbHMvdGhyZWFkcy5oPgogI2luY2x1ZGUgIkF1ZGlvUG9saWN5U2VydmljZS5oIgotI2luY2x1ZGUgIlNlcnZpY2VVdGlsaXRpZXMuaCIKICNpbmNsdWRlIDxoYXJkd2FyZV9sZWdhY3kvcG93ZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9BdWRpb0VmZmVjdC5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvUGFyYW1ldGVyLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CisjaW5jbHVkZSA8c2Vuc29ycHJpdmFjeS9TZW5zb3JQcml2YWN5TWFuYWdlci5oPgogCiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvLmg+CiAjaW5jbHVkZSA8c3lzdGVtL2F1ZGlvX3BvbGljeS5oPgogCi0jaW5jbHVkZSA8cHJpdmF0ZS9hbmRyb2lkX2ZpbGVzeXN0ZW1fY29uZmlnLmg+Ci0KIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogc3RhdGljIGNvbnN0IGNoYXIga0RlYWRsb2NrZWRTdHJpbmdbXSA9ICJBdWRpb1BvbGljeVNlcnZpY2UgbWF5IGJlIGRlYWRsb2NrZWRcbiI7CiBzdGF0aWMgY29uc3QgY2hhciBrQ21kRGVhZGxvY2tlZFN0cmluZ1tdID0gIkF1ZGlvUG9saWN5U2VydmljZSBjb21tYW5kIHRocmVhZCBtYXkgYmUgZGVhZGxvY2tlZFxuIjsKIAotc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tSZXRyaWVzID0gNTA7Ci1zdGF0aWMgY29uc3QgaW50IGtEdW1wTG9ja1NsZWVwVXMgPSAyMDAwMDsKK3N0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrVGltZW91dE5zID0gMSAqIE5BTk9TX1BFUl9TRUNPTkQ7CiAKIHN0YXRpYyBjb25zdCBuc2Vjc190IGtBdWRpb0NvbW1hbmRUaW1lb3V0TnMgPSBzZWNvbmRzKDMpOyAvLyAzIHNlY29uZHMKIApAQCAtNzAsOCArNjcsNiBAQAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKIAotICAgICAgICAvLyBzdGFydCB0b25lIHBsYXliYWNrIHRocmVhZAotICAgICAgICBtVG9uZVBsYXliYWNrVGhyZWFkID0gbmV3IEF1ZGlvQ29tbWFuZFRocmVhZChTdHJpbmc4KCJBcG1Ub25lIiksIHRoaXMpOwogICAgICAgICAvLyBzdGFydCBhdWRpbyBjb21tYW5kcyB0aHJlYWQKICAgICAgICAgbUF1ZGlvQ29tbWFuZFRocmVhZCA9IG5ldyBBdWRpb0NvbW1hbmRUaHJlYWQoU3RyaW5nOCgiQXBtQXVkaW8iKSwgdGhpcyk7CiAgICAgICAgIC8vIHN0YXJ0IG91dHB1dCBhY3Rpdml0eSBjb21tYW5kIHRocmVhZApAQCAtODksMTEgKzg0LDEzIEBACiAKICAgICBtVWlkUG9saWN5ID0gbmV3IFVpZFBvbGljeSh0aGlzKTsKICAgICBtVWlkUG9saWN5LT5yZWdpc3RlclNlbGYoKTsKKworICAgIG1TZW5zb3JQcml2YWN5UG9saWN5ID0gbmV3IFNlbnNvclByaXZhY3lQb2xpY3kodGhpcyk7CisgICAgbVNlbnNvclByaXZhY3lQb2xpY3ktPnJlZ2lzdGVyU2VsZigpOwogfQogCiBBdWRpb1BvbGljeVNlcnZpY2U6On5BdWRpb1BvbGljeVNlcnZpY2UoKQogewotICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPmV4aXQoKTsKICAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5leGl0KCk7CiAgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPmV4aXQoKTsKIApAQCAtMTA1LDYgKzEwMiw5IEBACiAKICAgICBtVWlkUG9saWN5LT51bnJlZ2lzdGVyU2VsZigpOwogICAgIG1VaWRQb2xpY3kuY2xlYXIoKTsKKworICAgIG1TZW5zb3JQcml2YWN5UG9saWN5LT51bnJlZ2lzdGVyU2VsZigpOworICAgIG1TZW5zb3JQcml2YWN5UG9saWN5LmNsZWFyKCk7CiB9CiAKIC8vIEEgbm90aWZpY2F0aW9uIGNsaWVudCBpcyBhbHdheXMgcmVnaXN0ZXJlZCBieSBBdWRpb1N5c3RlbSB3aGVuIHRoZSBjbGllbnQgcHJvY2VzcwpAQCAtMTE4LDEzICsxMTgsMTcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKIAogICAgIHVpZF90IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKLSAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMuaW5kZXhPZktleSh1aWQpIDwgMCkgeworICAgIHBpZF90IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQ2NF90IHRva2VuID0gKChpbnQ2NF90KXVpZDw8MzIpIHwgcGlkOworCisgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkodG9rZW4pIDwgMCkgewogICAgICAgICBzcDxOb3RpZmljYXRpb25DbGllbnQ+IG5vdGlmaWNhdGlvbkNsaWVudCA9IG5ldyBOb3RpZmljYXRpb25DbGllbnQodGhpcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZCk7Ci0gICAgICAgIEFMT0dWKCJyZWdpc3RlckNsaWVudCgpIGNsaWVudCAlcCwgdWlkICVkIiwgY2xpZW50LmdldCgpLCB1aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkKTsKKyAgICAgICAgQUxPR1YoInJlZ2lzdGVyQ2xpZW50KCkgY2xpZW50ICVwLCB1aWQgJWQgcGlkICVkIiwgY2xpZW50LmdldCgpLCB1aWQsIHBpZCk7CiAKLSAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMuYWRkKHVpZCwgbm90aWZpY2F0aW9uQ2xpZW50KTsKKyAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHMuYWRkKHRva2VuLCBub3RpZmljYXRpb25DbGllbnQpOwogCiAgICAgICAgIHNwPElCaW5kZXI+IGJpbmRlciA9IElJbnRlcmZhY2U6OmFzQmluZGVyKGNsaWVudCk7CiAgICAgICAgIGJpbmRlci0+bGlua1RvRGVhdGgobm90aWZpY2F0aW9uQ2xpZW50KTsKQEAgLTEzNiwyMiArMTQwLDQ3IEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Ob3RpZmljYXRpb25DbGllbnRzTG9jayk7CiAKICAgICB1aWRfdCB1aWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Ci0gICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmluZGV4T2ZLZXkodWlkKSA8IDApIHsKKyAgICBwaWRfdCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgaW50NjRfdCB0b2tlbiA9ICgoaW50NjRfdCl1aWQ8PDMyKSB8IHBpZDsKKworICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHRva2VuKSA8IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUZvcih1aWQpLT5zZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGVuYWJsZWQpOworICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlRm9yKHRva2VuKS0+c2V0QXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChlbmFibGVkKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCkKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKKworICAgIHVpZF90IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICBwaWRfdCBwaWQgPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7CisgICAgaW50NjRfdCB0b2tlbiA9ICgoaW50NjRfdCl1aWQ8PDMyKSB8IHBpZDsKKworICAgIGlmIChtTm90aWZpY2F0aW9uQ2xpZW50cy5pbmRleE9mS2V5KHRva2VuKSA8IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy52YWx1ZUZvcih0b2tlbiktPnNldEF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGVuYWJsZWQpOwogfQogCiAvLyByZW1vdmVOb3RpZmljYXRpb25DbGllbnQoKSBpcyBjYWxsZWQgd2hlbiB0aGUgY2xpZW50IHByb2Nlc3MgZGllcy4KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpyZW1vdmVOb3RpZmljYXRpb25DbGllbnQodWlkX3QgdWlkKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCh1aWRfdCB1aWQsIHBpZF90IHBpZCkKIHsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTm90aWZpY2F0aW9uQ2xpZW50c0xvY2spOwotICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50cy5yZW1vdmVJdGVtKHVpZCk7CisgICAgICAgIGludDY0X3QgdG9rZW4gPSAoKGludDY0X3QpdWlkPDwzMikgfCBwaWQ7CisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnJlbW92ZUl0ZW0odG9rZW4pOwogICAgIH0KICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7CisgICAgICAgIGJvb2wgaGFzU2FtZVVpZCA9IGZhbHNlOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgICAgICBpZiAobU5vdGlmaWNhdGlvbkNsaWVudHMudmFsdWVBdChpKS0+dWlkKCkgPT0gdWlkKSB7CisgICAgICAgICAgICAgICAgaGFzU2FtZVVpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIgJiYgIWhhc1NhbWVVaWQpIHsKICAgICAgICAgICAgIC8vIGNhbGxlZCBmcm9tIGJpbmRlciBkZWF0aCBub3RpZmljYXRpb246IG5vIG5lZWQgdG8gY2xlYXIgY2FsbGVyIGlkZW50aXR5CiAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5yZWxlYXNlUmVzb3VyY2VzRm9yVWlkKHVpZCk7CiAgICAgICAgIH0KQEAgLTE4NCw2ICsyMTMsMTkgQEAKICAgICB9CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpCit7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPmNoYW5nZUF1ZGlvVm9sdW1lR3JvdXBDb21tYW5kKGdyb3VwLCBmbGFncyk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpkb09uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncykKK3sKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPm9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQoZ3JvdXAsIGZsYWdzKTsKKyAgICB9Cit9CisKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSkKIHsKICAgICBBTE9HVigiQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZSglcywgJWQpIiwKQEAgLTE5OSwyMiArMjQxLDM0IEBACiAgICAgfQogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6b25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKLSAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLCBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSkKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKIHsKICAgICBtT3V0cHV0Q29tbWFuZFRocmVhZC0+cmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZUNvbW1hbmQoZXZlbnQsIGNsaWVudEluZm8sCi0gICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgY2xpZW50Q29uZmlnLCBjbGllbnRFZmZlY3RzLCBkZXZpY2VDb25maWcsIGVmZmVjdHMsIHBhdGNoSGFuZGxlLCBzb3VyY2UpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6ZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAotICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKIHsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrKTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Ob3RpZmljYXRpb25DbGllbnRzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIG1Ob3RpZmljYXRpb25DbGllbnRzLnZhbHVlQXQoaSktPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgIGNsaWVudENvbmZpZywgY2xpZW50RWZmZWN0cywgZGV2aWNlQ29uZmlnLCBlZmZlY3RzLCBwYXRjaEhhbmRsZSwgc291cmNlKTsKICAgICB9CiB9CiAKQEAgLTIzOSw5ICsyOTMsMTAgQEAKIAogQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Ok5vdGlmaWNhdGlvbkNsaWVudChjb25zdCBzcDxBdWRpb1BvbGljeVNlcnZpY2U+JiBzZXJ2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQpCi0gICAgOiBtU2VydmljZShzZXJ2aWNlKSwgbVVpZCh1aWQpLCBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50KGNsaWVudCksCi0gICAgICBtQXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZChmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaWRfdCBwaWQpCisgICAgOiBtU2VydmljZShzZXJ2aWNlKSwgbVVpZCh1aWQpLCBtUGlkKHBpZCksIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQoY2xpZW50KSwKKyAgICAgIG1BdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGZhbHNlKSwgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKGZhbHNlKQogewogfQogCkBAIC0yNTQsNyArMzA5LDcgQEAKICAgICBzcDxOb3RpZmljYXRpb25DbGllbnQ+IGtlZXAodGhpcyk7CiAgICAgc3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOwogICAgIGlmIChzZXJ2aWNlICE9IDApIHsKLSAgICAgICAgc2VydmljZS0+cmVtb3ZlTm90aWZpY2F0aW9uQ2xpZW50KG1VaWQpOworICAgICAgICBzZXJ2aWNlLT5yZW1vdmVOb3RpZmljYXRpb25DbGllbnQobVVpZCwgbVBpZCk7CiAgICAgfQogfQogCkBAIC0yNzIsMjIgKzMyNywzNiBAQAogICAgIH0KIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25BdWRpb1ZvbHVtZUdyb3VwQ2hhbmdlZCh2b2x1bWVfZ3JvdXBfdCBncm91cCwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkKSB7CisgICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQoZ3JvdXAsIGZsYWdzKTsKKyAgICB9Cit9CisKKwogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6Ok5vdGlmaWNhdGlvbkNsaWVudDo6b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoCiAgICAgICAgIGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKQogewotICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgbXVsdGl1c2VyX2dldF9hcHBfaWQobVVpZCkgPCBBSURfQVBQX1NUQVJUKSB7CisgICAgaWYgKG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQgIT0gMCAmJiBpc1NlcnZpY2VVaWQobVVpZCkpIHsKICAgICAgICAgbUF1ZGlvUG9saWN5U2VydmljZUNsaWVudC0+b25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUocmVnSWQsIHN0YXRlKTsKICAgICB9CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpOb3RpZmljYXRpb25DbGllbnQ6Om9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKIHsKLSAgICBpZiAobUF1ZGlvUG9saWN5U2VydmljZUNsaWVudCAhPSAwICYmIG11bHRpdXNlcl9nZXRfYXBwX2lkKG1VaWQpIDwgQUlEX0FQUF9TVEFSVCkgeworICAgIGlmIChtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50ICE9IDAgJiYgaXNTZXJ2aWNlVWlkKG1VaWQpKSB7CiAgICAgICAgIG1BdWRpb1BvbGljeVNlcnZpY2VDbGllbnQtPm9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShldmVudCwgY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICBjbGllbnRDb25maWcsIGRldmljZUNvbmZpZywgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgIGNsaWVudENvbmZpZywgY2xpZW50RWZmZWN0cywgZGV2aWNlQ29uZmlnLCBlZmZlY3RzLCBwYXRjaEhhbmRsZSwgc291cmNlKTsKICAgICB9CiB9CiAKQEAgLTI5NiwyMyArMzY1LDIwIEBACiAgICAgbUF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQgPSBlbmFibGVkOwogfQogCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6Tm90aWZpY2F0aW9uQ2xpZW50OjpzZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpCit7CisgICAgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkID0gZW5hYmxlZDsKK30KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OmJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobykgewogICAgIEFMT0dXKCJiaW5kZXJEaWVkKCkgJXAsIGNhbGxpbmcgcGlkICVkIiwgd2hvLnVuc2FmZV9nZXQoKSwKICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSk7CiB9CiAKLXN0YXRpYyBib29sIHRyeUxvY2soTXV0ZXgmIG11dGV4KQorc3RhdGljIGJvb2wgZHVtcFRyeUxvY2soTXV0ZXgmIG11dGV4KQogewotICAgIGJvb2wgbG9ja2VkID0gZmFsc2U7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrRHVtcExvY2tSZXRyaWVzOyArK2kpIHsKLSAgICAgICAgaWYgKG11dGV4LnRyeUxvY2soKSA9PSBOT19FUlJPUikgewotICAgICAgICAgICAgbG9ja2VkID0gdHJ1ZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHVzbGVlcChrRHVtcExvY2tTbGVlcFVzKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxvY2tlZDsKKyAgICBzdGF0dXNfdCBlcnIgPSBtdXRleC50aW1lZExvY2soa0R1bXBMb2NrVGltZW91dE5zKTsKKyAgICByZXR1cm4gZXJyID09IE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmR1bXBJbnRlcm5hbHMoaW50IGZkKQpAQCAtMzI1LDI0ICszOTEsMjUzIEBACiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwogICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIkNvbW1hbmQgVGhyZWFkOiAlcFxuIiwgbUF1ZGlvQ29tbWFuZFRocmVhZC5nZXQoKSk7CiAgICAgcmVzdWx0LmFwcGVuZChidWZmZXIpOwotICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIlRvbmVzIFRocmVhZDogJXBcbiIsIG1Ub25lUGxheWJhY2tUaHJlYWQuZ2V0KCkpOwotICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFJlY29yZFNpbGVuY2VkKHVpZF90IHVpZCwgYm9vbCBzaWxlbmNlZCkKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjp1cGRhdGVVaWRTdGF0ZXMoKQogewotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgaWYgKG1BdWRpb1BvbGljeU1hbmFnZXIpIHsKLSAgICAgICAgICAgIEF1dG9DYWxsZXJDbGVhciBhY2M7Ci0gICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5zZXRSZWNvcmRTaWxlbmNlZCh1aWQsIHNpbGVuY2VkKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgIHVwZGF0ZVVpZFN0YXRlc19sKCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjp1cGRhdGVVaWRTdGF0ZXNfbCgpCit7CisvLyAgICBHbyBvdmVyIGFsbCBhY3RpdmUgY2xpZW50cyBhbmQgYWxsb3cgY2FwdHVyZSAoZG9lcyBub3QgZm9yY2Ugc2lsZW5jZSkgaW4gdGhlCisvLyAgICBmb2xsb3dpbmcgY2FzZXM6CisvLyAgICBBbm90aGVyIGNsaWVudCBpbiB0aGUgc2FtZSBVSUQgaGFzIGFscmVhZHkgYmVlbiBhbGxvd2VkIHRvIGNhcHR1cmUKKy8vICAgIE9SIFRoZSBjbGllbnQgaXMgdGhlIGFzc2lzdGFudAorLy8gICAgICAgIEFORCBhbiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgaXMgb24gVE9QIG9yIGEgUlRUIGNhbGwgaXMgYWN0aXZlCisvLyAgICAgICAgICAgICAgICBBTkQgdGhlIHNvdXJjZSBpcyBWT0lDRV9SRUNPR05JVElPTiBvciBIT1RXT1JECisvLyAgICAgICAgICAgIE9SIHVzZXMgVk9JQ0VfUkVDT0dOSVRJT04gQU5EIGlzIG9uIFRPUAorLy8gICAgICAgICAgICAgICAgT1IgdXNlcyBIT1RXT1JECisvLyAgICAgICAgICAgIEFORCB0aGVyZSBpcyBubyBhY3RpdmUgcHJpdmFjeSBzZW5zaXRpdmUgY2FwdHVyZSBvciBjYWxsCisvLyAgICAgICAgICAgICAgICBPUiBjbGllbnQgaGFzIENBUFRVUkVfQVVESU9fT1VUUFVUIHByaXZpbGVnZWQgcGVybWlzc2lvbgorLy8gICAgT1IgVGhlIGNsaWVudCBpcyBhbiBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UKKy8vICAgICAgICBBTkQgSXMgb24gVE9QCisvLyAgICAgICAgICAgICAgICBBTkQgdGhlIHNvdXJjZSBpcyBWT0lDRV9SRUNPR05JVElPTiBvciBIT1RXT1JECisvLyAgICAgICAgICAgIE9SIFRoZSBhc3Npc3RhbnQgaXMgbm90IG9uIFRPUAorLy8gICAgICAgICAgICAgICAgQU5EIHRoZXJlIGlzIG5vIGFjdGl2ZSBwcml2YWN5IHNlbnNpdGl2ZSBjYXB0dXJlIG9yIGNhbGwKKy8vICAgICAgICAgICAgICAgICAgICBPUiBjbGllbnQgaGFzIENBUFRVUkVfQVVESU9fT1VUUFVUIHByaXZpbGVnZWQgcGVybWlzc2lvbgorLy8gICAgICAgIEFORCBpcyBvbiBUT1AKKy8vICAgICAgICBBTkQgdGhlIHNvdXJjZSBpcyBWT0lDRV9SRUNPR05JVElPTiBvciBIT1RXT1JECisvLyAgICBPUiB0aGUgY2xpZW50IHNvdXJjZSBpcyB2aXJ0dWFsIChyZW1vdGUgc3VibWl4LCBjYWxsIGF1ZGlvIFRYIG9yIFJYLi4uKQorLy8gICAgT1IgQW55IGNsaWVudAorLy8gICAgICAgIEFORCBUaGUgYXNzaXN0YW50IGlzIG5vdCBvbiBUT1AKKy8vICAgICAgICBBTkQgaXMgb24gVE9QIG9yIGxhdGVzdCBzdGFydGVkCisvLyAgICAgICAgQU5EIHRoZXJlIGlzIG5vIGFjdGl2ZSBwcml2YWN5IHNlbnNpdGl2ZSBjYXB0dXJlIG9yIGNhbGwKKy8vICAgICAgICAgICAgT1IgY2xpZW50IGhhcyBDQVBUVVJFX0FVRElPX09VVFBVVCBwcml2aWxlZ2VkIHBlcm1pc3Npb24KKworICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiB0b3BBY3RpdmU7CisgICAgc3A8QXVkaW9SZWNvcmRDbGllbnQ+IGxhdGVzdEFjdGl2ZTsKKyAgICBzcDxBdWRpb1JlY29yZENsaWVudD4gbGF0ZXN0U2Vuc2l0aXZlQWN0aXZlOworCisgICAgbnNlY3NfdCB0b3BTdGFydE5zID0gMDsKKyAgICBuc2Vjc190IGxhdGVzdFN0YXJ0TnMgPSAwOworICAgIG5zZWNzX3QgbGF0ZXN0U2Vuc2l0aXZlU3RhcnROcyA9IDA7CisgICAgYm9vbCBpc0ExMXlPblRvcCA9IG1VaWRQb2xpY3ktPmlzQTExeU9uVG9wKCk7CisgICAgYm9vbCBpc0Fzc2lzdGFudE9uVG9wID0gZmFsc2U7CisgICAgYm9vbCBpc1NlbnNpdGl2ZUFjdGl2ZSA9IGZhbHNlOworICAgIGJvb2wgaXNJbkNhbGwgPSBtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEw7CisgICAgYm9vbCBydHRDYWxsQWN0aXZlID0KKyAgICAgICAgICAgIChtUGhvbmVTdGF0ZSA9PSBBVURJT19NT0RFX0lOX0NBTEwgfHwgbVBob25lU3RhdGUgPT0gQVVESU9fTU9ERV9JTl9DT01NVU5JQ0FUSU9OKQorICAgICAgICAgICAgJiYgbVVpZFBvbGljeS0+aXNSdHRFbmFibGVkKCk7CisKKyAgICAvLyBpZiBTZW5zb3IgUHJpdmFjeSBpcyBlbmFibGVkIHRoZW4gYWxsIHJlY29yZGluZ3Mgc2hvdWxkIGJlIHNpbGVuY2VkLgorICAgIGlmIChtU2Vuc29yUHJpdmFjeVBvbGljeS0+aXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpKSB7CisgICAgICAgIHNpbGVuY2VBbGxSZWNvcmRpbmdzX2woKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGZvciAoc2l6ZV90IGkgPTA7IGkgPCBtQXVkaW9SZWNvcmRDbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjdXJyZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50c1tpXTsKKyAgICAgICAgaWYgKCFjdXJyZW50LT5hY3RpdmUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CisKKyAgICAgICAgYXBwX3N0YXRlX3QgYXBwU3RhdGUgPSBhcG1TdGF0RnJvbUFtU3RhdGUobVVpZFBvbGljeS0+Z2V0VWlkU3RhdGUoY3VycmVudC0+dWlkKSk7CisgICAgICAgIC8vIGNsaWVudHMgd2hpY2ggYXBwIGlzIGluIElETEUgc3RhdGUgYXJlIG5vdCBlbGlnaWJsZSBmb3IgdG9wIGFjdGl2ZSBvcgorICAgICAgICAvLyBsYXRlc3QgYWN0aXZlCisgICAgICAgIGlmIChhcHBTdGF0ZSA9PSBBUFBfU1RBVEVfSURMRSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBib29sIGlzQXNzaXN0YW50ID0gbVVpZFBvbGljeS0+aXNBc3Npc3RhbnRVaWQoY3VycmVudC0+dWlkKTsKKyAgICAgICAgYm9vbCBpc0FjY2Vzc2liaWxpdHkgPSBtVWlkUG9saWN5LT5pc0ExMXlVaWQoY3VycmVudC0+dWlkKTsKKyAgICAgICAgaWYgKGFwcFN0YXRlID09IEFQUF9TVEFURV9UT1AgJiYgIWlzQWNjZXNzaWJpbGl0eSkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnN0YXJ0VGltZU5zID4gdG9wU3RhcnROcykgeworICAgICAgICAgICAgICAgIHRvcEFjdGl2ZSA9IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgdG9wU3RhcnROcyA9IGN1cnJlbnQtPnN0YXJ0VGltZU5zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGlzQXNzaXN0YW50KSB7CisgICAgICAgICAgICAgICAgaXNBc3Npc3RhbnRPblRvcCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gQXNzaXN0YW50IGNhcHR1cmluZyBmb3IgSE9UV09SRCBvciBBY2Nlc3NpYmlsaXR5IHNlcnZpY2VzIG5vdCBjb25zaWRlcmVkCisgICAgICAgIC8vIGZvciBsYXRlc3QgYWN0aXZlIHRvIGF2b2lkIG1hc2tpbmcgcmVndWxhciBjbGllbnRzIHN0YXJ0ZWQgYmVmb3JlCisgICAgICAgIGlmIChjdXJyZW50LT5zdGFydFRpbWVOcyA+IGxhdGVzdFN0YXJ0TnMKKyAgICAgICAgICAgICAgICAmJiAhKChjdXJyZW50LT5hdHRyaWJ1dGVzLnNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRAorICAgICAgICAgICAgICAgICAgICAgICAgfHwgaXNBMTF5T25Ub3AgfHwgcnR0Q2FsbEFjdGl2ZSkKKyAgICAgICAgICAgICAgICAgICAgJiYgaXNBc3Npc3RhbnQpCisgICAgICAgICAgICAgICAgJiYgIWlzQWNjZXNzaWJpbGl0eSkgeworICAgICAgICAgICAgbGF0ZXN0QWN0aXZlID0gY3VycmVudDsKKyAgICAgICAgICAgIGxhdGVzdFN0YXJ0TnMgPSBjdXJyZW50LT5zdGFydFRpbWVOczsKKyAgICAgICAgfQorICAgICAgICBpZiAoaXNQcml2YWN5U2Vuc2l0aXZlU291cmNlKGN1cnJlbnQtPmF0dHJpYnV0ZXMuc291cmNlKSkgeworICAgICAgICAgICAgaWYgKGN1cnJlbnQtPnN0YXJ0VGltZU5zID4gbGF0ZXN0U2Vuc2l0aXZlU3RhcnROcykgeworICAgICAgICAgICAgICAgIGxhdGVzdFNlbnNpdGl2ZUFjdGl2ZSA9IGN1cnJlbnQ7CisgICAgICAgICAgICAgICAgbGF0ZXN0U2Vuc2l0aXZlU3RhcnROcyA9IGN1cnJlbnQtPnN0YXJ0VGltZU5zOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXNTZW5zaXRpdmVBY3RpdmUgPSB0cnVlOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaWYgbm8gYWN0aXZlIGNsaWVudCB3aXRoIFVJIG9uIFRvcCwgY29uc2lkZXIgbGF0ZXN0IGFjdGl2ZSBhcyB0b3AKKyAgICBpZiAodG9wQWN0aXZlID09IG51bGxwdHIpIHsKKyAgICAgICAgdG9wQWN0aXZlID0gbGF0ZXN0QWN0aXZlOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHVpZF90PiBlbmFibGVkVWlkczsKKworICAgIGZvciAoc2l6ZV90IGkgPTA7IGkgPCBtQXVkaW9SZWNvcmRDbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjdXJyZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50c1tpXTsKKyAgICAgICAgaWYgKCFjdXJyZW50LT5hY3RpdmUpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8ga2VlcCBjYXB0dXJlIGFsbG93ZWQgaWYgYW5vdGhlciBjbGllbnQgd2l0aCB0aGUgc2FtZSBVSUQgaGFzIGFscmVhZHkKKyAgICAgICAgLy8gYmVlbiBhbGxvd2VkIHRvIGNhcHR1cmUKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChlbmFibGVkVWlkcy5iZWdpbigpLCBlbmFibGVkVWlkcy5lbmQoKSwgY3VycmVudC0+dWlkKQorICAgICAgICAgICAgICAgICE9IGVuYWJsZWRVaWRzLmVuZCgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IGN1cnJlbnQtPmF0dHJpYnV0ZXMuc291cmNlOworICAgICAgICBib29sIGlzVG9wT3JMYXRlc3RBY3RpdmUgPSB0b3BBY3RpdmUgPT0gbnVsbHB0ciA/IGZhbHNlIDogY3VycmVudC0+dWlkID09IHRvcEFjdGl2ZS0+dWlkOworICAgICAgICBib29sIGlzTGF0ZXN0U2Vuc2l0aXZlID0gbGF0ZXN0U2Vuc2l0aXZlQWN0aXZlID09IG51bGxwdHIgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgOiBjdXJyZW50LT51aWQgPT0gbGF0ZXN0U2Vuc2l0aXZlQWN0aXZlLT51aWQ7CisKKyAgICAgICAgLy8gQnkgZGVmYXVsdCBhbGxvdyBjYXB0dXJlIGlmOgorICAgICAgICAvLyAgICAgVGhlIGFzc2lzdGFudCBpcyBub3Qgb24gVE9QCisgICAgICAgIC8vICAgICBBTkQgaXMgb24gVE9QIG9yIGxhdGVzdCBzdGFydGVkCisgICAgICAgIC8vICAgICBBTkQgdGhlcmUgaXMgbm8gYWN0aXZlIHByaXZhY3kgc2Vuc2l0aXZlIGNhcHR1cmUgb3IgY2FsbAorICAgICAgICAvLyAgICAgICAgICAgICBPUiBjbGllbnQgaGFzIENBUFRVUkVfQVVESU9fT1VUUFVUIHByaXZpbGVnZWQgcGVybWlzc2lvbgorICAgICAgICBib29sIGFsbG93Q2FwdHVyZSA9ICFpc0Fzc2lzdGFudE9uVG9wCisgICAgICAgICAgICAgICAgJiYgKChpc1RvcE9yTGF0ZXN0QWN0aXZlICYmICFpc0xhdGVzdFNlbnNpdGl2ZSkgfHwgaXNMYXRlc3RTZW5zaXRpdmUpCisgICAgICAgICAgICAgICAgJiYgIShpc1NlbnNpdGl2ZUFjdGl2ZSAmJiAhKGlzTGF0ZXN0U2Vuc2l0aXZlIHx8IGN1cnJlbnQtPmNhbkNhcHR1cmVPdXRwdXQpKQorICAgICAgICAgICAgICAgICYmICEoaXNJbkNhbGwgJiYgIWN1cnJlbnQtPmNhbkNhcHR1cmVPdXRwdXQpOworCisgICAgICAgIGlmIChpc1ZpcnR1YWxTb3VyY2Uoc291cmNlKSkgeworICAgICAgICAgICAgLy8gQWxsb3cgY2FwdHVyZSBmb3IgdmlydHVhbCAocmVtb3RlIHN1Ym1peCwgY2FsbCBhdWRpbyBUWCBvciBSWC4uLikgc291cmNlcworICAgICAgICAgICAgYWxsb3dDYXB0dXJlID0gdHJ1ZTsKKyAgICAgICAgfSBlbHNlIGlmIChtVWlkUG9saWN5LT5pc0Fzc2lzdGFudFVpZChjdXJyZW50LT51aWQpKSB7CisgICAgICAgICAgICAvLyBGb3IgYXNzaXN0YW50IGFsbG93IGNhcHR1cmUgaWY6CisgICAgICAgICAgICAvLyAgICAgQW4gYWNjZXNzaWJpbGl0eSBzZXJ2aWNlIGlzIG9uIFRPUCBvciBhIFJUVCBjYWxsIGlzIGFjdGl2ZQorICAgICAgICAgICAgLy8gICAgICAgICAgICBBTkQgdGhlIHNvdXJjZSBpcyBWT0lDRV9SRUNPR05JVElPTiBvciBIT1RXT1JECisgICAgICAgICAgICAvLyAgICAgT1IgaXMgb24gVE9QIEFORCB1c2VzIFZPSUNFX1JFQ09HTklUSU9OCisgICAgICAgICAgICAvLyAgICAgICAgICAgIE9SIHVzZXMgSE9UV09SRAorICAgICAgICAgICAgLy8gICAgICAgICBBTkQgdGhlcmUgaXMgbm8gYWN0aXZlIHByaXZhY3kgc2Vuc2l0aXZlIGNhcHR1cmUgb3IgY2FsbAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgT1IgY2xpZW50IGhhcyBDQVBUVVJFX0FVRElPX09VVFBVVCBwcml2aWxlZ2VkIHBlcm1pc3Npb24KKyAgICAgICAgICAgIGlmIChpc0ExMXlPblRvcCB8fCBydHRDYWxsQWN0aXZlKSB7CisgICAgICAgICAgICAgICAgaWYgKHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCB8fCBzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OKSB7CisgICAgICAgICAgICAgICAgICAgIGFsbG93Q2FwdHVyZSA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoKChpc0Fzc2lzdGFudE9uVG9wICYmIHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04pIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2UgPT0gQVVESU9fU09VUkNFX0hPVFdPUkQpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoIShpc1NlbnNpdGl2ZUFjdGl2ZSB8fCBpc0luQ2FsbCkgfHwgY3VycmVudC0+Y2FuQ2FwdHVyZU91dHB1dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb3dDYXB0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAobVVpZFBvbGljeS0+aXNBMTF5VWlkKGN1cnJlbnQtPnVpZCkpIHsKKyAgICAgICAgICAgIC8vIEZvciBhY2Nlc3NpYmlsaXR5IHNlcnZpY2UgYWxsb3cgY2FwdHVyZSBpZjoKKyAgICAgICAgICAgIC8vICAgICBJcyBvbiBUT1AKKyAgICAgICAgICAgIC8vICAgICAgICAgIEFORCB0aGUgc291cmNlIGlzIFZPSUNFX1JFQ09HTklUSU9OIG9yIEhPVFdPUkQKKyAgICAgICAgICAgIC8vICAgICBPcgorICAgICAgICAgICAgLy8gICAgICAgICAgVGhlIGFzc2lzdGFudCBpcyBub3Qgb24gVE9QCisgICAgICAgICAgICAvLyAgICAgICAgICBBTkQgdGhlcmUgaXMgbm8gYWN0aXZlIHByaXZhY3kgc2Vuc2l0aXZlIGNhcHR1cmUgb3IgY2FsbAorICAgICAgICAgICAgLy8gICAgICAgICAgICAgT1IgY2xpZW50IGhhcyBDQVBUVVJFX0FVRElPX09VVFBVVCBwcml2aWxlZ2VkIHBlcm1pc3Npb24KKyAgICAgICAgICAgIGlmIChpc0ExMXlPblRvcCkgeworICAgICAgICAgICAgICAgIGlmIChzb3VyY2UgPT0gQVVESU9fU09VUkNFX1ZPSUNFX1JFQ09HTklUSU9OIHx8IHNvdXJjZSA9PSBBVURJT19TT1VSQ0VfSE9UV09SRCkgeworICAgICAgICAgICAgICAgICAgICBhbGxvd0NhcHR1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKCFpc0Fzc2lzdGFudE9uVG9wCisgICAgICAgICAgICAgICAgICAgICAgICAmJiAoIShpc1NlbnNpdGl2ZUFjdGl2ZSB8fCBpc0luQ2FsbCkgfHwgY3VycmVudC0+Y2FuQ2FwdHVyZU91dHB1dCkpIHsKKyAgICAgICAgICAgICAgICAgICAgYWxsb3dDYXB0dXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgc2V0QXBwU3RhdGVfbChjdXJyZW50LT51aWQsCisgICAgICAgICAgICAgICAgICAgICAgYWxsb3dDYXB0dXJlID8gYXBtU3RhdEZyb21BbVN0YXRlKG1VaWRQb2xpY3ktPmdldFVpZFN0YXRlKGN1cnJlbnQtPnVpZCkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBQX1NUQVRFX0lETEUpOworICAgICAgICBpZiAoYWxsb3dDYXB0dXJlKSB7CisgICAgICAgICAgICBlbmFibGVkVWlkcy5wdXNoX2JhY2soY3VycmVudC0+dWlkKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OnNpbGVuY2VBbGxSZWNvcmRpbmdzX2woKSB7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQXVkaW9SZWNvcmRDbGllbnRzLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHNwPEF1ZGlvUmVjb3JkQ2xpZW50PiBjdXJyZW50ID0gbUF1ZGlvUmVjb3JkQ2xpZW50c1tpXTsKKyAgICAgICAgaWYgKCFpc1ZpcnR1YWxTb3VyY2UoY3VycmVudC0+YXR0cmlidXRlcy5zb3VyY2UpKSB7CisgICAgICAgICAgICBzZXRBcHBTdGF0ZV9sKGN1cnJlbnQtPnVpZCwgQVBQX1NUQVRFX0lETEUpOworICAgICAgICB9CisgICAgfQorfQorCisvKiBzdGF0aWMgKi8KK2FwcF9zdGF0ZV90IEF1ZGlvUG9saWN5U2VydmljZTo6YXBtU3RhdEZyb21BbVN0YXRlKGludCBhbVN0YXRlKSB7CisKKyAgICBpZiAoYW1TdGF0ZSA9PSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTikgeworICAgICAgICByZXR1cm4gQVBQX1NUQVRFX0lETEU7CisgICAgfSBlbHNlIGlmIChhbVN0YXRlIDw9IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9UT1ApIHsKKyAgICAgIC8vIGluY2x1ZGUgcGVyc2lzdGVudCBzZXJ2aWNlcworICAgICAgcmV0dXJuIEFQUF9TVEFURV9UT1A7CisgICAgfQorICAgIHJldHVybiBBUFBfU1RBVEVfRk9SRUdST1VORDsKK30KKworLyogc3RhdGljICovCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6aXNQcml2YWN5U2Vuc2l0aXZlU291cmNlKGF1ZGlvX3NvdXJjZV90IHNvdXJjZSkKK3sKKyAgICBzd2l0Y2ggKHNvdXJjZSkgeworICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9DQU1DT1JERVI6CisgICAgICAgIGNhc2UgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT046CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKKy8qIHN0YXRpYyAqLworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OmlzVmlydHVhbFNvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpCit7CisgICAgc3dpdGNoIChzb3VyY2UpIHsKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfVVBMSU5LOgorICAgICAgICBjYXNlIEFVRElPX1NPVVJDRV9WT0lDRV9ET1dOTElOSzoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfVk9JQ0VfQ0FMTDoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfUkVNT1RFX1NVQk1JWDoKKyAgICAgICAgY2FzZSBBVURJT19TT1VSQ0VfRk1fVFVORVI6CisgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRBcHBTdGF0ZV9sKHVpZF90IHVpZCwgYXBwX3N0YXRlX3Qgc3RhdGUpCit7CisgICAgQXV0b0NhbGxlckNsZWFyIGFjYzsKKworICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7CisgICAgICAgIG1BdWRpb1BvbGljeU1hbmFnZXItPnNldEFwcFN0YXRlKHVpZCwgc3RhdGUpOwogICAgIH0KICAgICBzcDxJQXVkaW9GbGluZ2VyPiBhZiA9IEF1ZGlvU3lzdGVtOjpnZXRfYXVkaW9fZmxpbmdlcigpOwogICAgIGlmIChhZikgeworICAgICAgICBib29sIHNpbGVuY2VkID0gc3RhdGUgPT0gQVBQX1NUQVRFX0lETEU7CiAgICAgICAgIGFmLT5zZXRSZWNvcmRTaWxlbmNlZCh1aWQsIHNpbGVuY2VkKTsKICAgICB9CiB9CkBAIC0zNTIsNyArNjQ3LDcgQEAKICAgICBpZiAoIWR1bXBBbGxvd2VkKCkpIHsKICAgICAgICAgZHVtcFBlcm1pc3Npb25EZW5pYWwoZmQpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGJvb2wgbG9ja2VkID0gdHJ5TG9jayhtTG9jayk7CisgICAgICAgIGJvb2wgbG9ja2VkID0gZHVtcFRyeUxvY2sobUxvY2spOwogICAgICAgICBpZiAoIWxvY2tlZCkgewogICAgICAgICAgICAgU3RyaW5nOCByZXN1bHQoa0RlYWRsb2NrZWRTdHJpbmcpOwogICAgICAgICAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CkBAIC0zNjIsMTQgKzY1NywxMyBAQAogICAgICAgICBpZiAobUF1ZGlvQ29tbWFuZFRocmVhZCAhPSAwKSB7CiAgICAgICAgICAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5kdW1wKGZkKTsKICAgICAgICAgfQotICAgICAgICBpZiAobVRvbmVQbGF5YmFja1RocmVhZCAhPSAwKSB7Ci0gICAgICAgICAgICBtVG9uZVBsYXliYWNrVGhyZWFkLT5kdW1wKGZkKTsKLSAgICAgICAgfQogCiAgICAgICAgIGlmIChtQXVkaW9Qb2xpY3lNYW5hZ2VyKSB7CiAgICAgICAgICAgICBtQXVkaW9Qb2xpY3lNYW5hZ2VyLT5kdW1wKGZkKTsKICAgICAgICAgfQogCisgICAgICAgIG1QYWNrYWdlTWFuYWdlci5kdW1wKGZkKTsKKwogICAgICAgICBpZiAobG9ja2VkKSBtTG9jay51bmxvY2soKTsKICAgICB9CiAgICAgcmV0dXJuIE5PX0VSUk9SOwpAQCAtNDMxLDExICs3MjUsMTEgQEAKICAgICBpZiAoaW4gPT0gQkFEX1RZUEUgfHwgb3V0ID09IEJBRF9UWVBFIHx8IGVyciA9PSBCQURfVFlQRSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBpZiAoYXJncy5zaXplKCkgPT0gMyAmJiBhcmdzWzBdID09IFN0cmluZzE2KCJzZXQtdWlkLXN0YXRlIikpIHsKKyAgICBpZiAoYXJncy5zaXplKCkgPj0gMyAmJiBhcmdzWzBdID09IFN0cmluZzE2KCJzZXQtdWlkLXN0YXRlIikpIHsKICAgICAgICAgcmV0dXJuIGhhbmRsZVNldFVpZFN0YXRlKGFyZ3MsIGVycik7Ci0gICAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA9PSAyICYmIGFyZ3NbMF0gPT0gU3RyaW5nMTYoInJlc2V0LXVpZC1zdGF0ZSIpKSB7CisgICAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA+PSAyICYmIGFyZ3NbMF0gPT0gU3RyaW5nMTYoInJlc2V0LXVpZC1zdGF0ZSIpKSB7CiAgICAgICAgIHJldHVybiBoYW5kbGVSZXNldFVpZFN0YXRlKGFyZ3MsIGVycik7Ci0gICAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA9PSAyICYmIGFyZ3NbMF0gPT0gU3RyaW5nMTYoImdldC11aWQtc3RhdGUiKSkgeworICAgIH0gZWxzZSBpZiAoYXJncy5zaXplKCkgPj0gMiAmJiBhcmdzWzBdID09IFN0cmluZzE2KCJnZXQtdWlkLXN0YXRlIikpIHsKICAgICAgICAgcmV0dXJuIGhhbmRsZUdldFVpZFN0YXRlKGFyZ3MsIG91dCwgZXJyKTsKICAgICB9IGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID09IDEgJiYgYXJnc1swXSA9PSBTdHJpbmcxNigiaGVscCIpKSB7CiAgICAgICAgIHByaW50SGVscChvdXQpOwpAQCAtNDQ1LDE0ICs3MzksMzIgQEAKICAgICByZXR1cm4gQkFEX1ZBTFVFOwogfQogCi1zdGF0dXNfdCBBdWRpb1BvbGljeVNlcnZpY2U6OmhhbmRsZVNldFVpZFN0YXRlKFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGludCBlcnIpIHsKLSAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwYzsKLSAgICBpbnQgdWlkID0gcGMuZ2V0UGFja2FnZVVpZChhcmdzWzFdLCAwKTsKLSAgICBpZiAodWlkIDw9IDApIHsKLSAgICAgICAgQUxPR0UoIlVua25vd24gcGFja2FnZTogJyVzJyIsIFN0cmluZzgoYXJnc1sxXSkuc3RyaW5nKCkpOwotICAgICAgICBkcHJpbnRmKGVyciwgIlVua25vd24gcGFja2FnZTogJyVzJ1xuIiwgU3RyaW5nOChhcmdzWzFdKS5zdHJpbmcoKSk7CitzdGF0aWMgc3RhdHVzX3QgZ2V0VWlkRm9yUGFja2FnZShTdHJpbmcxNiBwYWNrYWdlTmFtZSwgaW50IHVzZXJJZCwgLyppbm91dCovdWlkX3QmIHVpZCwgaW50IGVycikgeworICAgIGlmICh1c2VySWQgPCAwKSB7CisgICAgICAgIEFMT0dFKCJJbnZhbGlkIHVzZXI6ICVkIiwgdXNlcklkKTsKKyAgICAgICAgZHByaW50ZihlcnIsICJJbnZhbGlkIHVzZXI6ICVkXG4iLCB1c2VySWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKworICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBjOworICAgIHVpZCA9IHBjLmdldFBhY2thZ2VVaWQocGFja2FnZU5hbWUsIDApOworICAgIGlmICh1aWQgPD0gMCkgeworICAgICAgICBBTE9HRSgiVW5rbm93biBwYWNrYWdlOiAnJXMnIiwgU3RyaW5nOChwYWNrYWdlTmFtZSkuc3RyaW5nKCkpOworICAgICAgICBkcHJpbnRmKGVyciwgIlVua25vd24gcGFja2FnZTogJyVzJ1xuIiwgU3RyaW5nOChwYWNrYWdlTmFtZSkuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHVpZCA9IG11bHRpdXNlcl9nZXRfdWlkKHVzZXJJZCwgdWlkKTsKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6aGFuZGxlU2V0VWlkU3RhdGUoVmVjdG9yPFN0cmluZzE2PiYgYXJncywgaW50IGVycikgeworICAgIC8vIFZhbGlkIGFyZy5zaXplKCkgaXMgMyBvciA1LCBhcmdzLnNpemUoKSBpcyA1IHdpdGggLS11c2VyIG9wdGlvbi4KKyAgICBpZiAoIShhcmdzLnNpemUoKSA9PSAzIHx8IGFyZ3Muc2l6ZSgpID09IDUpKSB7CisgICAgICAgIHByaW50SGVscChlcnIpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIGJvb2wgYWN0aXZlID0gZmFsc2U7CiAgICAgaWYgKGFyZ3NbMl0gPT0gU3RyaW5nMTYoImFjdGl2ZSIpKSB7CiAgICAgICAgIGFjdGl2ZSA9IHRydWU7CkBAIC00NjAsMzAgKzc3Miw1OSBAQAogICAgICAgICBBTE9HRSgiRXhwZWN0ZWQgYWN0aXZlIG9yIGlkbGUgYnV0IGdvdDogJyVzJyIsIFN0cmluZzgoYXJnc1syXSkuc3RyaW5nKCkpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKworICAgIGludCB1c2VySWQgPSAwOworICAgIGlmIChhcmdzLnNpemUoKSA+PSA1ICYmIGFyZ3NbM10gPT0gU3RyaW5nMTYoIi0tdXNlciIpKSB7CisgICAgICAgIHVzZXJJZCA9IGF0b2koU3RyaW5nOChhcmdzWzRdKSk7CisgICAgfQorCisgICAgdWlkX3QgdWlkOworICAgIGlmIChnZXRVaWRGb3JQYWNrYWdlKGFyZ3NbMV0sIHVzZXJJZCwgdWlkLCBlcnIpID09IEJBRF9WQUxVRSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIG1VaWRQb2xpY3ktPmFkZE92ZXJyaWRlVWlkKHVpZCwgYWN0aXZlKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6aGFuZGxlUmVzZXRVaWRTdGF0ZShWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBpbnQgZXJyKSB7Ci0gICAgUGVybWlzc2lvbkNvbnRyb2xsZXIgcGM7Ci0gICAgaW50IHVpZCA9IHBjLmdldFBhY2thZ2VVaWQoYXJnc1sxXSwgMCk7Ci0gICAgaWYgKHVpZCA8IDApIHsKLSAgICAgICAgQUxPR0UoIlVua25vd24gcGFja2FnZTogJyVzJyIsIFN0cmluZzgoYXJnc1sxXSkuc3RyaW5nKCkpOwotICAgICAgICBkcHJpbnRmKGVyciwgIlVua25vd24gcGFja2FnZTogJyVzJ1xuIiwgU3RyaW5nOChhcmdzWzFdKS5zdHJpbmcoKSk7CisgICAgLy8gVmFsaWQgYXJnLnNpemUoKSBpcyAyIG9yIDQsIGFyZ3Muc2l6ZSgpIGlzIDQgd2l0aCAtLXVzZXIgb3B0aW9uLgorICAgIGlmICghKGFyZ3Muc2l6ZSgpID09IDIgfHwgYXJncy5zaXplKCkgPT0gNCkpIHsKKyAgICAgICAgcHJpbnRIZWxwKGVycik7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQorCisgICAgaW50IHVzZXJJZCA9IDA7CisgICAgaWYgKGFyZ3Muc2l6ZSgpID49IDQgJiYgYXJnc1syXSA9PSBTdHJpbmcxNigiLS11c2VyIikpIHsKKyAgICAgICAgdXNlcklkID0gYXRvaShTdHJpbmc4KGFyZ3NbM10pKTsKKyAgICB9CisKKyAgICB1aWRfdCB1aWQ7CisgICAgaWYgKGdldFVpZEZvclBhY2thZ2UoYXJnc1sxXSwgdXNlcklkLCB1aWQsIGVycikgPT0gQkFEX1ZBTFVFKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCiAgICAgbVVpZFBvbGljeS0+cmVtb3ZlT3ZlcnJpZGVVaWQodWlkKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6aGFuZGxlR2V0VWlkU3RhdGUoVmVjdG9yPFN0cmluZzE2PiYgYXJncywgaW50IG91dCwgaW50IGVycikgewotICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBjOwotICAgIGludCB1aWQgPSBwYy5nZXRQYWNrYWdlVWlkKGFyZ3NbMV0sIDApOwotICAgIGlmICh1aWQgPCAwKSB7Ci0gICAgICAgIEFMT0dFKCJVbmtub3duIHBhY2thZ2U6ICclcyciLCBTdHJpbmc4KGFyZ3NbMV0pLnN0cmluZygpKTsKLSAgICAgICAgZHByaW50ZihlcnIsICJVbmtub3duIHBhY2thZ2U6ICclcydcbiIsIFN0cmluZzgoYXJnc1sxXSkuc3RyaW5nKCkpOworICAgIC8vIFZhbGlkIGFyZy5zaXplKCkgaXMgMiBvciA0LCBhcmdzLnNpemUoKSBpcyA0IHdpdGggLS11c2VyIG9wdGlvbi4KKyAgICBpZiAoIShhcmdzLnNpemUoKSA9PSAyIHx8IGFyZ3Muc2l6ZSgpID09IDQpKSB7CisgICAgICAgIHByaW50SGVscChlcnIpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KKworICAgIGludCB1c2VySWQgPSAwOworICAgIGlmIChhcmdzLnNpemUoKSA+PSA0ICYmIGFyZ3NbMl0gPT0gU3RyaW5nMTYoIi0tdXNlciIpKSB7CisgICAgICAgIHVzZXJJZCA9IGF0b2koU3RyaW5nOChhcmdzWzNdKSk7CisgICAgfQorCisgICAgdWlkX3QgdWlkOworICAgIGlmIChnZXRVaWRGb3JQYWNrYWdlKGFyZ3NbMV0sIHVzZXJJZCwgdWlkLCBlcnIpID09IEJBRF9WQUxVRSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKwogICAgIGlmIChtVWlkUG9saWN5LT5pc1VpZEFjdGl2ZSh1aWQpKSB7CiAgICAgICAgIHJldHVybiBkcHJpbnRmKG91dCwgImFjdGl2ZVxuIik7CiAgICAgfSBlbHNlIHsKQEAgLTQ5MywzNSArODM0LDM1IEBACiAKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6cHJpbnRIZWxwKGludCBvdXQpIHsKICAgICByZXR1cm4gZHByaW50ZihvdXQsICJBdWRpbyBwb2xpY3kgc2VydmljZSBjb21tYW5kczpcbiIKLSAgICAgICAgIiAgZ2V0LXVpZC1zdGF0ZSA8UEFDS0FHRT4gZ2V0cyB0aGUgdWlkIHN0YXRlXG4iCi0gICAgICAgICIgIHNldC11aWQtc3RhdGUgPFBBQ0tBR0U+IDxhY3RpdmV8aWRsZT4gb3ZlcnJpZGVzIHRoZSB1aWQgc3RhdGVcbiIKLSAgICAgICAgIiAgcmVzZXQtdWlkLXN0YXRlIDxQQUNLQUdFPiBjbGVhcnMgdGhlIHVpZCBzdGF0ZSBvdmVycmlkZVxuIgorICAgICAgICAiICBnZXQtdWlkLXN0YXRlIDxQQUNLQUdFPiBbLS11c2VyIFVTRVJfSURdIGdldHMgdGhlIHVpZCBzdGF0ZVxuIgorICAgICAgICAiICBzZXQtdWlkLXN0YXRlIDxQQUNLQUdFPiA8YWN0aXZlfGlkbGU+IFstLXVzZXIgVVNFUl9JRF0gb3ZlcnJpZGVzIHRoZSB1aWQgc3RhdGVcbiIKKyAgICAgICAgIiAgcmVzZXQtdWlkLXN0YXRlIDxQQUNLQUdFPiBbLS11c2VyIFVTRVJfSURdIGNsZWFycyB0aGUgdWlkIHN0YXRlIG92ZXJyaWRlXG4iCiAgICAgICAgICIgIGhlbHAgcHJpbnQgdGhpcyBtZXNzYWdlXG4iKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0gIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5IGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6cmVnaXN0ZXJTZWxmKCkgewotICAgIEFjdGl2aXR5TWFuYWdlciBhbTsKLSAgICBhbS5yZWdpc3RlclVpZE9ic2VydmVyKHRoaXMsIEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0dPTkUKKyAgICBzdGF0dXNfdCByZXMgPSBtQW0ubGlua1RvRGVhdGgodGhpcyk7CisgICAgbUFtLnJlZ2lzdGVyVWlkT2JzZXJ2ZXIodGhpcywgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfR09ORQogICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9JRExFCi0gICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0FDVElWRSwKKyAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfQUNUSVZFCisgICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX1BST0NTVEFURSwKICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOLAogICAgICAgICAgICAgU3RyaW5nMTYoImF1ZGlvc2VydmVyIikpOwotICAgIHN0YXR1c190IHJlcyA9IGFtLmxpbmtUb0RlYXRoKHRoaXMpOwogICAgIGlmICghcmVzKSB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIG1PYnNlcnZlclJlZ2lzdGVyZWQgPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAgIEFMT0dFKCJVaWRQb2xpY3k6OnJlZ2lzdGVyU2VsZiBsaW5rVG9EZWF0aCBmYWlsZWQ6ICVkIiwgcmVzKTsKLSAgICAgICAgYW0udW5yZWdpc3RlclVpZE9ic2VydmVyKHRoaXMpOworCisgICAgICAgIG1BbS51bnJlZ2lzdGVyVWlkT2JzZXJ2ZXIodGhpcyk7CiAgICAgfQogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1bnJlZ2lzdGVyU2VsZigpIHsKLSAgICBBY3Rpdml0eU1hbmFnZXIgYW07Ci0gICAgYW0udW5saW5rVG9EZWF0aCh0aGlzKTsKLSAgICBhbS51bnJlZ2lzdGVyVWlkT2JzZXJ2ZXIodGhpcyk7CisgICAgbUFtLnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgbUFtLnVucmVnaXN0ZXJVaWRPYnNlcnZlcih0aGlzKTsKICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwogICAgIG1PYnNlcnZlclJlZ2lzdGVyZWQgPSBmYWxzZTsKIH0KQEAgLTUzMiw4ICs4NzMsNyBAQAogICAgIG1PYnNlcnZlclJlZ2lzdGVyZWQgPSBmYWxzZTsKIH0KIAotYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6aXNVaWRBY3RpdmUodWlkX3QgdWlkKSB7Ci0gICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSByZXR1cm4gdHJ1ZTsKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmNoZWNrUmVnaXN0ZXJlZCgpIHsKICAgICBib29sIG5lZWRUb1JlcmVnaXN0ZXIgPSBmYWxzZTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CkBAIC01NDMsMTAzICs4ODMsMjEyIEBACiAgICAgICAgIC8vIExvb2tzIGxpa2UgQWN0aXZpdHlNYW5hZ2VyIGhhcyBkaWVkIHByZXZpb3VzbHksIGF0dGVtcHQgdG8gcmUtcmVnaXN0ZXIuCiAgICAgICAgIHJlZ2lzdGVyU2VsZigpOwogICAgIH0KK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6aXNVaWRBY3RpdmUodWlkX3QgdWlkKSB7CisgICAgaWYgKGlzU2VydmljZVVpZCh1aWQpKSByZXR1cm4gdHJ1ZTsKKyAgICBjaGVja1JlZ2lzdGVyZWQoKTsKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CiAgICAgICAgIGF1dG8gb3ZlcnJpZGVJdGVyID0gbU92ZXJyaWRlVWlkcy5maW5kKHVpZCk7CiAgICAgICAgIGlmIChvdmVycmlkZUl0ZXIgIT0gbU92ZXJyaWRlVWlkcy5lbmQoKSkgewotICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlSXRlci0+c2Vjb25kOworICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlSXRlci0+c2Vjb25kLmZpcnN0OwogICAgICAgICB9CiAgICAgICAgIC8vIEluIGFuIGFic2Vuc2Ugb2YgdGhlIEFjdGl2aXR5TWFuYWdlciwgYXNzdW1lIGV2ZXJ5dGhpbmcgdG8gYmUgYWN0aXZlLgogICAgICAgICBpZiAoIW1PYnNlcnZlclJlZ2lzdGVyZWQpIHJldHVybiB0cnVlOwogICAgICAgICBhdXRvIGNhY2hlSXRlciA9IG1DYWNoZWRVaWRzLmZpbmQodWlkKTsKICAgICAgICAgaWYgKGNhY2hlSXRlciAhPSBtQ2FjaGVkVWlkcy5lbmQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGNhY2hlSXRlci0+c2Vjb25kOworICAgICAgICAgICAgcmV0dXJuIGNhY2hlSXRlci0+c2Vjb25kLmZpcnN0OwogICAgICAgICB9CiAgICAgfQogICAgIEFjdGl2aXR5TWFuYWdlciBhbTsKICAgICBib29sIGFjdGl2ZSA9IGFtLmlzVWlkQWN0aXZlKHVpZCwgU3RyaW5nMTYoImF1ZGlvc2VydmVyIikpOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKLSAgICAgICAgbUNhY2hlZFVpZHMuaW5zZXJ0KHN0ZDo6cGFpcjx1aWRfdCwgYm9vbD4odWlkLCBhY3RpdmUpKTsKKyAgICAgICAgbUNhY2hlZFVpZHMuaW5zZXJ0KHN0ZDo6cGFpcjx1aWRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxib29sLCBpbnQ+Pih1aWQsIHN0ZDo6cGFpcjxib29sLCBpbnQ+KGFjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOKSkpOwogICAgIH0KICAgICByZXR1cm4gYWN0aXZlOwogfQogCitpbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmdldFVpZFN0YXRlKHVpZF90IHVpZCkgeworICAgIGlmIChpc1NlcnZpY2VVaWQodWlkKSkgeworICAgICAgICByZXR1cm4gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1RPUDsKKyAgICB9CisgICAgY2hlY2tSZWdpc3RlcmVkKCk7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOworICAgICAgICBhdXRvIG92ZXJyaWRlSXRlciA9IG1PdmVycmlkZVVpZHMuZmluZCh1aWQpOworICAgICAgICBpZiAob3ZlcnJpZGVJdGVyICE9IG1PdmVycmlkZVVpZHMuZW5kKCkpIHsKKyAgICAgICAgICAgIGlmIChvdmVycmlkZUl0ZXItPnNlY29uZC5maXJzdCkgeworICAgICAgICAgICAgICAgIGlmIChvdmVycmlkZUl0ZXItPnNlY29uZC5zZWNvbmQgIT0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04pIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG92ZXJyaWRlSXRlci0+c2Vjb25kLnNlY29uZDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBhdXRvIGNhY2hlSXRlciA9IG1DYWNoZWRVaWRzLmZpbmQodWlkKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNhY2hlSXRlciAhPSBtQ2FjaGVkVWlkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlSXRlci0+c2Vjb25kLnNlY29uZDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTjsKKyAgICAgICAgfQorICAgICAgICAvLyBJbiBhbiBhYnNlbnNlIG9mIHRoZSBBY3Rpdml0eU1hbmFnZXIsIGFzc3VtZSBldmVyeXRoaW5nIHRvIGJlIGFjdGl2ZS4KKyAgICAgICAgaWYgKCFtT2JzZXJ2ZXJSZWdpc3RlcmVkKSB7CisgICAgICAgICAgICByZXR1cm4gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1RPUDsKKyAgICAgICAgfQorICAgICAgICBhdXRvIGNhY2hlSXRlciA9IG1DYWNoZWRVaWRzLmZpbmQodWlkKTsKKyAgICAgICAgaWYgKGNhY2hlSXRlciAhPSBtQ2FjaGVkVWlkcy5lbmQoKSkgeworICAgICAgICAgICAgaWYgKGNhY2hlSXRlci0+c2Vjb25kLmZpcnN0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGNhY2hlSXRlci0+c2Vjb25kLnNlY29uZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEFjdGl2aXR5TWFuYWdlciBhbTsKKyAgICBib29sIGFjdGl2ZSA9IGFtLmlzVWlkQWN0aXZlKHVpZCwgU3RyaW5nMTYoImF1ZGlvc2VydmVyIikpOworICAgIGludCBzdGF0ZSA9IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOOworICAgIGlmIChhY3RpdmUpIHsKKyAgICAgICAgc3RhdGUgPSBhbS5nZXRVaWRQcm9jZXNzU3RhdGUodWlkLCBTdHJpbmcxNigiYXVkaW9zZXJ2ZXIiKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICAgICAgbUNhY2hlZFVpZHMuaW5zZXJ0KHN0ZDo6cGFpcjx1aWRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxib29sLCBpbnQ+Pih1aWQsIHN0ZDo6cGFpcjxib29sLCBpbnQ+KGFjdGl2ZSwgc3RhdGUpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHN0YXRlOworfQorCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpvblVpZEFjdGl2ZSh1aWRfdCB1aWQpIHsKLSAgICB1cGRhdGVVaWRDYWNoZSh1aWQsIHRydWUsIHRydWUpOworICAgIHVwZGF0ZVVpZCgmbUNhY2hlZFVpZHMsIHVpZCwgdHJ1ZSwgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04sIHRydWUpOwogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpvblVpZEdvbmUodWlkX3QgdWlkLCBfX3VudXNlZCBib29sIGRpc2FibGVkKSB7Ci0gICAgdXBkYXRlVWlkQ2FjaGUodWlkLCBmYWxzZSwgZmFsc2UpOworICAgIHVwZGF0ZVVpZCgmbUNhY2hlZFVpZHMsIHVpZCwgZmFsc2UsIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOLCBmYWxzZSk7CiB9CiAKIHZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om9uVWlkSWRsZSh1aWRfdCB1aWQsIF9fdW51c2VkIGJvb2wgZGlzYWJsZWQpIHsKLSAgICB1cGRhdGVVaWRDYWNoZSh1aWQsIGZhbHNlLCB0cnVlKTsKKyAgICB1cGRhdGVVaWQoJm1DYWNoZWRVaWRzLCB1aWQsIGZhbHNlLCBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTiwgdHJ1ZSk7CiB9CiAKLWJvb2wgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OmlzU2VydmljZVVpZCh1aWRfdCB1aWQpIGNvbnN0IHsKLSAgICByZXR1cm4gbXVsdGl1c2VyX2dldF9hcHBfaWQodWlkKSA8IEFJRF9BUFBfU1RBUlQ7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6Om5vdGlmeVNlcnZpY2UodWlkX3QgdWlkLCBib29sIGFjdGl2ZSkgewotICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKLSAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7Ci0gICAgICAgIHNlcnZpY2UtPnNldFJlY29yZFNpbGVuY2VkKHVpZCwgIWFjdGl2ZSk7Cit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5OjpvblVpZFN0YXRlQ2hhbmdlZCh1aWRfdCB1aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByb2NTdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgcHJvY1N0YXRlU2VxIF9fdW51c2VkKSB7CisgICAgaWYgKHByb2NTdGF0ZSAhPSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTikgeworICAgICAgICB1cGRhdGVVaWQoJm1DYWNoZWRVaWRzLCB1aWQsIHRydWUsIHByb2NTdGF0ZSwgdHJ1ZSk7CiAgICAgfQogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojp1cGRhdGVPdmVycmlkZVVpZCh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCkgewotICAgIGlmIChpc1NlcnZpY2VVaWQodWlkKSkgcmV0dXJuOwotICAgIGJvb2wgd2FzT3ZlcnJpZGRlbiA9IGZhbHNlLCB3YXNBY3RpdmUgPSBmYWxzZTsKLSAgICB7Ci0gICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgICAgIHVwZGF0ZVVpZExvY2tlZCgmbU92ZXJyaWRlVWlkcywgdWlkLCBhY3RpdmUsIGluc2VydCwgJndhc092ZXJyaWRkZW4sICZ3YXNBY3RpdmUpOwotICAgIH0KLSAgICBpZiAoIXdhc092ZXJyaWRkZW4gJiYgaW5zZXJ0KSB7Ci0gICAgICAgIG5vdGlmeVNlcnZpY2UodWlkLCBhY3RpdmUpOyAgLy8gU3RhcnRlZCB0byBvdmVycmlkZS4KLSAgICB9IGVsc2UgaWYgKHdhc092ZXJyaWRkZW4gJiYgIWluc2VydCkgewotICAgICAgICBub3RpZnlTZXJ2aWNlKHVpZCwgaXNVaWRBY3RpdmUodWlkKSk7ICAvLyBPdmVycmlkZSBjZWFzZWQsIG5vdGlmeSB3aXRoIGdyb3VuZCB0cnV0aC4KLSAgICB9IGVsc2UgaWYgKHdhc0FjdGl2ZSAhPSBhY3RpdmUpIHsKLSAgICAgICAgbm90aWZ5U2VydmljZSh1aWQsIGFjdGl2ZSk7ICAvLyBPdmVycmlkZSB1cGRhdGVkLgorICAgIHVwZGF0ZVVpZCgmbU92ZXJyaWRlVWlkcywgdWlkLCBhY3RpdmUsIEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOLCBpbnNlcnQpOworfQorCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6VWlkUG9saWN5Ojpub3RpZnlTZXJ2aWNlKCkgeworICAgIHNwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgIHNlcnZpY2UtPnVwZGF0ZVVpZFN0YXRlcygpOwogICAgIH0KIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6dXBkYXRlVWlkQ2FjaGUodWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQpIHsKLSAgICBpZiAoaXNTZXJ2aWNlVWlkKHVpZCkpIHJldHVybjsKLSAgICBib29sIHdhc0FjdGl2ZSA9IGZhbHNlOwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6dXBkYXRlVWlkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4gKnVpZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluc2VydCkgeworICAgIGlmIChpc1NlcnZpY2VVaWQodWlkKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGJvb2wgd2FzQWN0aXZlID0gaXNVaWRBY3RpdmUodWlkKTsKKyAgICBpbnQgcHJldmlvdXNTdGF0ZSA9IGdldFVpZFN0YXRlKHVpZCk7CiAgICAgewogICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgICAgICB1cGRhdGVVaWRMb2NrZWQoJm1DYWNoZWRVaWRzLCB1aWQsIGFjdGl2ZSwgaW5zZXJ0LCBudWxscHRyLCAmd2FzQWN0aXZlKTsKLSAgICAgICAgLy8gRG8gbm90IG5vdGlmeSBzZXJ2aWNlIGlmIGN1cnJlbnRseSBvdmVycmlkZGVuLgotICAgICAgICBpZiAobU92ZXJyaWRlVWlkcy5maW5kKHVpZCkgIT0gbU92ZXJyaWRlVWlkcy5lbmQoKSkgcmV0dXJuOworICAgICAgICB1cGRhdGVVaWRMb2NrZWQodWlkcywgdWlkLCBhY3RpdmUsIHN0YXRlLCBpbnNlcnQpOwogICAgIH0KLSAgICBib29sIG5vd0FjdGl2ZSA9IGFjdGl2ZSAmJiBpbnNlcnQ7Ci0gICAgaWYgKHdhc0FjdGl2ZSAhPSBub3dBY3RpdmUpIG5vdGlmeVNlcnZpY2UodWlkLCBub3dBY3RpdmUpOworICAgIGlmICh3YXNBY3RpdmUgIT0gaXNVaWRBY3RpdmUodWlkKSB8fCBzdGF0ZSAhPSBwcmV2aW91c1N0YXRlKSB7CisgICAgICAgIG5vdGlmeVNlcnZpY2UoKTsKKyAgICB9CiB9CiAKLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpVaWRQb2xpY3k6OnVwZGF0ZVVpZExvY2tlZChzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIGJvb2w+ICp1aWRzLAotICAgICAgICB1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCwgYm9vbCAqd2FzVGhlcmUsIGJvb2wgKndhc0FjdGl2ZSkgewordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6dXBkYXRlVWlkTG9ja2VkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4gKnVpZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluc2VydCkgewogICAgIGF1dG8gaXQgPSB1aWRzLT5maW5kKHVpZCk7CiAgICAgaWYgKGl0ICE9IHVpZHMtPmVuZCgpKSB7Ci0gICAgICAgIGlmICh3YXNUaGVyZSAhPSBudWxscHRyKSAqd2FzVGhlcmUgPSB0cnVlOwotICAgICAgICBpZiAod2FzQWN0aXZlICE9IG51bGxwdHIpICp3YXNBY3RpdmUgPSBpdC0+c2Vjb25kOwogICAgICAgICBpZiAoaW5zZXJ0KSB7Ci0gICAgICAgICAgICBpdC0+c2Vjb25kID0gYWN0aXZlOworICAgICAgICAgICAgaWYgKHN0YXRlID09IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOKSB7CisgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5maXJzdCA9IGFjdGl2ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChpdC0+c2Vjb25kLmZpcnN0KSB7CisgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5zZWNvbmQgPSBzdGF0ZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaXQtPnNlY29uZC5zZWNvbmQgPSBBY3Rpdml0eU1hbmFnZXI6OlBST0NFU1NfU1RBVEVfVU5LTk9XTjsKKyAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIHVpZHMtPmVyYXNlKGl0KTsKICAgICAgICAgfQotICAgIH0gZWxzZSBpZiAoaW5zZXJ0KSB7Ci0gICAgICAgIHVpZHMtPmluc2VydChzdGQ6OnBhaXI8dWlkX3QsIGJvb2w+KHVpZCwgYWN0aXZlKSk7CisgICAgfSBlbHNlIGlmIChpbnNlcnQgJiYgKHN0YXRlID09IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9VTktOT1dOKSkgeworICAgICAgICB1aWRzLT5pbnNlcnQoc3RkOjpwYWlyPHVpZF90LCBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4odWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8Ym9vbCwgaW50PihhY3RpdmUsIHN0YXRlKSkpOwogICAgIH0KIH0KIAorYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6aXNBMTF5T25Ub3AoKSB7CisgICAgZm9yIChjb25zdCBhdXRvICZ1aWQgOiBtQ2FjaGVkVWlkcykgeworICAgICAgICBzdGQ6OnZlY3Rvcjx1aWRfdD46Oml0ZXJhdG9yIGl0ID0gZmluZChtQTExeVVpZHMuYmVnaW4oKSwgbUExMXlVaWRzLmVuZCgpLCB1aWQuZmlyc3QpOworICAgICAgICBpZiAoaXQgPT0gbUExMXlVaWRzLmVuZCgpKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAodWlkLnNlY29uZC5zZWNvbmQgPj0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1RPUAorICAgICAgICAgICAgICAgICYmIHVpZC5zZWNvbmQuc2Vjb25kIDw9IEFjdGl2aXR5TWFuYWdlcjo6UFJPQ0VTU19TVEFURV9CT1VORF9GT1JFR1JPVU5EX1NFUlZJQ0UpIHsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBBdWRpb1BvbGljeVNlcnZpY2U6OlVpZFBvbGljeTo6aXNBMTF5VWlkKHVpZF90IHVpZCkKK3sKKyAgICBzdGQ6OnZlY3Rvcjx1aWRfdD46Oml0ZXJhdG9yIGl0ID0gZmluZChtQTExeVVpZHMuYmVnaW4oKSwgbUExMXlVaWRzLmVuZCgpLCB1aWQpOworICAgIHJldHVybiBpdCAhPSBtQTExeVVpZHMuZW5kKCk7Cit9CisKKy8vIC0tLS0tLS0tLS0tICBBdWRpb1BvbGljeVNlcnZpY2U6OlNlbnNvclByaXZhY3lTZXJ2aWNlIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0KK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5OjpyZWdpc3RlclNlbGYoKSB7CisgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgc3BtOworICAgIG1TZW5zb3JQcml2YWN5RW5hYmxlZCA9IHNwbS5pc1NlbnNvclByaXZhY3lFbmFibGVkKCk7CisgICAgc3BtLmFkZFNlbnNvclByaXZhY3lMaXN0ZW5lcih0aGlzKTsKK30KKwordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6OnVucmVnaXN0ZXJTZWxmKCkgeworICAgIFNlbnNvclByaXZhY3lNYW5hZ2VyIHNwbTsKKyAgICBzcG0ucmVtb3ZlU2Vuc29yUHJpdmFjeUxpc3RlbmVyKHRoaXMpOworfQorCitib29sIEF1ZGlvUG9saWN5U2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6aXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpIHsKKyAgICByZXR1cm4gbVNlbnNvclByaXZhY3lFbmFibGVkOworfQorCitiaW5kZXI6OlN0YXR1cyBBdWRpb1BvbGljeVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6Om9uU2Vuc29yUHJpdmFjeUNoYW5nZWQoYm9vbCBlbmFibGVkKSB7CisgICAgbVNlbnNvclByaXZhY3lFbmFibGVkID0gZW5hYmxlZDsKKyAgICBzcDxBdWRpb1BvbGljeVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgaWYgKHNlcnZpY2UgIT0gbnVsbHB0cikgeworICAgICAgICBzZXJ2aWNlLT51cGRhdGVVaWRTdGF0ZXMoKTsKKyAgICB9CisgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCiAvLyAtLS0tLS0tLS0tLSAgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLQogCiBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6QXVkaW9Db21tYW5kVGhyZWFkKFN0cmluZzggbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiYgc2VydmljZSkKICAgICA6IFRocmVhZChmYWxzZSksIG1OYW1lKG5hbWUpLCBtU2VydmljZShzZXJ2aWNlKQogewotICAgIG1wVG9uZUdlbmVyYXRvciA9IE5VTEw7CiB9CiAKIApAQCAtNjQ5LDcgKzEwOTgsNiBAQAogICAgICAgICByZWxlYXNlX3dha2VfbG9jayhtTmFtZS5zdHJpbmcoKSk7CiAgICAgfQogICAgIG1BdWRpb0NvbW1hbmRzLmNsZWFyKCk7Ci0gICAgZGVsZXRlIG1wVG9uZUdlbmVyYXRvcjsKIH0KIAogdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6b25GaXJzdFJlZigpCkBAIC02NzQsNjggKzExMjIsNTQgQEAKICAgICAgICAgICAgICAgICBtTGFzdENvbW1hbmQgPSBjb21tYW5kOwogCiAgICAgICAgICAgICAgICAgc3dpdGNoIChjb21tYW5kLT5tQ29tbWFuZCkgewotICAgICAgICAgICAgICAgIGNhc2UgU1RBUlRfVE9ORTogewotICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgVG9uZURhdGEgKmRhdGEgPSAoVG9uZURhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0YXJ0IHRvbmUgJWQgb24gc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tVHlwZSwgZGF0YS0+bVN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtcFRvbmVHZW5lcmF0b3I7Ci0gICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvciA9IG5ldyBUb25lR2VuZXJhdG9yKGRhdGEtPm1TdHJlYW0sIDEuMCk7Ci0gICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvci0+c3RhcnRUb25lKGRhdGEtPm1UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICAgICAgICAgICAgICB9YnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBTVE9QX1RPTkU6IHsKLSAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHN0b3AgdG9uZSIpOwotICAgICAgICAgICAgICAgICAgICBpZiAobXBUb25lR2VuZXJhdG9yICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1wVG9uZUdlbmVyYXRvci0+c3RvcFRvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtcFRvbmVHZW5lcmF0b3I7Ci0gICAgICAgICAgICAgICAgICAgICAgICBtcFRvbmVHZW5lcmF0b3IgPSBOVUxMOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKLSAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0VUX1ZPTFVNRTogewogICAgICAgICAgICAgICAgICAgICBWb2x1bWVEYXRhICpkYXRhID0gKFZvbHVtZURhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHNldCB2b2x1bWUgc3RyZWFtICVkLCBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sdW1lICVmLCBvdXRwdXQgJWQiLCBkYXRhLT5tU3RyZWFtLCBkYXRhLT5tVm9sdW1lLCBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IEF1ZGlvU3lzdGVtOjpzZXRTdHJlYW1Wb2x1bWUoZGF0YS0+bVN0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVZvbHVtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBTRVRfUEFSQU1FVEVSUzogewogICAgICAgICAgICAgICAgICAgICBQYXJhbWV0ZXJzRGF0YSAqZGF0YSA9IChQYXJhbWV0ZXJzRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHBhcmFtZXRlcnMgc3RyaW5nICVzLCBpbyAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUtleVZhbHVlUGFpcnMuc3RyaW5nKCksIGRhdGEtPm1JTyk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFBhcmFtZXRlcnMoZGF0YS0+bUlPLCBkYXRhLT5tS2V5VmFsdWVQYWlycyk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgU0VUX1ZPSUNFX1ZPTFVNRTogewogICAgICAgICAgICAgICAgICAgICBWb2ljZVZvbHVtZURhdGEgKmRhdGEgPSAoVm9pY2VWb2x1bWVEYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOwogICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzZXQgdm9pY2Ugdm9sdW1lIHZvbHVtZSAlZiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVZvbHVtZSk7CisgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gQXVkaW9TeXN0ZW06OnNldFZvaWNlVm9sdW1lKGRhdGEtPm1Wb2x1bWUpOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNUT1BfT1VUUFVUOiB7CiAgICAgICAgICAgICAgICAgICAgIFN0b3BPdXRwdXREYXRhICpkYXRhID0gKFN0b3BPdXRwdXREYXRhICopY29tbWFuZC0+bVBhcmFtLmdldCgpOwotICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBzdG9wIG91dHB1dCAlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bUlPKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc3RvcCBvdXRwdXQgcG9ydElkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tUG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgc3ZjID0gbVNlcnZpY2UucHJvbW90ZSgpOwogICAgICAgICAgICAgICAgICAgICBpZiAoc3ZjID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwotICAgICAgICAgICAgICAgICAgICBzdmMtPmRvU3RvcE91dHB1dChkYXRhLT5tSU8sIGRhdGEtPm1TdHJlYW0sIGRhdGEtPm1TZXNzaW9uKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb1N0b3BPdXRwdXQoZGF0YS0+bVBvcnRJZCk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgUkVMRUFTRV9PVVRQVVQ6IHsKICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZU91dHB1dERhdGEgKmRhdGEgPSAoUmVsZWFzZU91dHB1dERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCk7Ci0gICAgICAgICAgICAgICAgICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBwcm9jZXNzaW5nIHJlbGVhc2Ugb3V0cHV0ICVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLT5tSU8pOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyByZWxlYXNlIG91dHB1dCBwb3J0SWQgJWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1Qb3J0SWQpOwogICAgICAgICAgICAgICAgICAgICBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7CiAgICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7Ci0gICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9SZWxlYXNlT3V0cHV0KGRhdGEtPm1JTywgZGF0YS0+bVN0cmVhbSwgZGF0YS0+bVNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICBzdmMtPmRvUmVsZWFzZU91dHB1dChkYXRhLT5tUG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9YnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBDUkVBVEVfQVVESU9fUEFUQ0g6IHsKQEAgLTc0NSw3ICsxMTc5LDkgQEAKICAgICAgICAgICAgICAgICAgICAgaWYgKGFmID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBQRVJNSVNTSU9OX0RFTklFRDsKICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOwogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IGFmLT5jcmVhdGVBdWRpb1BhdGNoKCZkYXRhLT5tUGF0Y2gsICZkYXRhLT5tSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgUkVMRUFTRV9BVURJT19QQVRDSDogewpAQCAtNzU1LDcgKzExOTEsOSBAQAogICAgICAgICAgICAgICAgICAgICBpZiAoYWYgPT0gMCkgewogICAgICAgICAgICAgICAgICAgICAgICAgY29tbWFuZC0+bVN0YXR1cyA9IFBFUk1JU1NJT05fREVOSUVEOwogICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gYWYtPnJlbGVhc2VBdWRpb1BhdGNoKGRhdGEtPm1IYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICAgICAgICAgICAgICAgY2FzZSBVUERBVEVfQVVESU9QT1JUX0xJU1Q6IHsKQEAgLTc3OCw2ICsxMjE2LDE4IEBACiAgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9PbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfWJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgQ0hBTkdFRF9BVURJT1ZPTFVNRUdST1VQOiB7CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvVm9sdW1lR3JvdXBEYXRhICpkYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBdWRpb1ZvbHVtZUdyb3VwRGF0YSAqPihjb21tYW5kLT5tUGFyYW0uZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyB1cGRhdGUgYXVkaW8gdm9sdW1lIGdyb3VwIik7CisgICAgICAgICAgICAgICAgICAgIHN2YyA9IG1TZXJ2aWNlLnByb21vdGUoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHN2YyA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKKyAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQoZGF0YS0+bUdyb3VwLCBkYXRhLT5tRmxhZ3MpOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH1icmVhazsKICAgICAgICAgICAgICAgICBjYXNlIFNFVF9BVURJT1BPUlRfQ09ORklHOiB7CiAgICAgICAgICAgICAgICAgICAgIFNldEF1ZGlvUG9ydENvbmZpZ0RhdGEgKmRhdGEgPSAoU2V0QXVkaW9Qb3J0Q29uZmlnRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKICAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IHBvcnQgY29uZmlnIik7CkBAIC03ODUsNyArMTIzNSw5IEBACiAgICAgICAgICAgICAgICAgICAgIGlmIChhZiA9PSAwKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBjb21tYW5kLT5tU3RhdHVzID0gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbW1hbmQtPm1TdGF0dXMgPSBhZi0+c2V0QXVkaW9Qb3J0Q29uZmlnKCZkYXRhLT5tQ29uZmlnKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOwogICAgICAgICAgICAgICAgIGNhc2UgRFlOX1BPTElDWV9NSVhfU1RBVEVfVVBEQVRFOiB7CkBAIC04MTEsMTAgKzEyNjMsMzIgQEAKICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICBtTG9jay51bmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgc3ZjLT5kb09uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShkYXRhLT5tRXZlbnQsICZkYXRhLT5tQ2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+bUNsaWVudENvbmZpZywgJmRhdGEtPm1EZXZpY2VDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+bVBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGF0YS0+bUNsaWVudENvbmZpZywgZGF0YS0+bUNsaWVudEVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEtPm1EZXZpY2VDb25maWcsIGRhdGEtPm1FZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPm1QYXRjaEhhbmRsZSwgZGF0YS0+bVNvdXJjZSk7CiAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLmxvY2soKTsKICAgICAgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIFNFVF9FRkZFQ1RfU1VTUEVOREVEOiB7CisgICAgICAgICAgICAgICAgICAgIFNldEVmZmVjdFN1c3BlbmRlZERhdGEgKmRhdGEgPSAoU2V0RWZmZWN0U3VzcGVuZGVkRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIHByb2Nlc3Npbmcgc2V0IGVmZmVjdCBzdXNwZW5kZWQiKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8SUF1ZGlvRmxpbmdlcj4gYWYgPSBBdWRpb1N5c3RlbTo6Z2V0X2F1ZGlvX2ZsaW5nZXIoKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGFmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1Mb2NrLnVubG9jaygpOworICAgICAgICAgICAgICAgICAgICAgICAgYWYtPnNldEVmZmVjdFN1c3BlbmRlZChkYXRhLT5tRWZmZWN0SWQsIGRhdGEtPm1TZXNzaW9uSWQsIGRhdGEtPm1TdXNwZW5kZWQpOworICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2subG9jaygpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBBVURJT19NT0RVTEVTX1VQREFURTogeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiQXVkaW9Db21tYW5kVGhyZWFkKCkgcHJvY2Vzc2luZyBhdWRpbyBtb2R1bGVzIHVwZGF0ZSIpOworICAgICAgICAgICAgICAgICAgICBzdmMgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChzdmMgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIHN2Yy0+ZG9Pbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZSgpOworICAgICAgICAgICAgICAgICAgICBtTG9jay5sb2NrKCk7CisgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisKICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICBBTE9HVygiQXVkaW9Db21tYW5kVGhyZWFkKCkgdW5rbm93biBjb21tYW5kICVkIiwgY29tbWFuZC0+bUNvbW1hbmQpOwogICAgICAgICAgICAgICAgIH0KQEAgLTg3Miw3ICsxMzQ2LDcgQEAKICAgICByZXN1bHQuYXBwZW5kKGJ1ZmZlcik7CiAgICAgd3JpdGUoZmQsIHJlc3VsdC5zdHJpbmcoKSwgcmVzdWx0LnNpemUoKSk7CiAKLSAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobUxvY2spOworICAgIGJvb2wgbG9ja2VkID0gZHVtcFRyeUxvY2sobUxvY2spOwogICAgIGlmICghbG9ja2VkKSB7CiAgICAgICAgIFN0cmluZzggcmVzdWx0MihrQ21kRGVhZGxvY2tlZFN0cmluZyk7CiAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQyLnN0cmluZygpLCByZXN1bHQyLnNpemUoKSk7CkBAIC05MDAsMjcgKzEzNzQsNiBAQAogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIAotdm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgdHlwZSwKLSAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pCi17Ci0gICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwotICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU1RBUlRfVE9ORTsKLSAgICBzcDxUb25lRGF0YT4gZGF0YSA9IG5ldyBUb25lRGF0YSgpOwotICAgIGRhdGEtPm1UeXBlID0gdHlwZTsKLSAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOwotICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyB0b25lIHN0YXJ0IHR5cGUgJWQsIHN0cmVhbSAlZCIsIHR5cGUsIHN0cmVhbSk7Ci0gICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Ci19Ci0KLXZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnN0b3BUb25lQ29tbWFuZCgpCi17Ci0gICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwotICAgIGNvbW1hbmQtPm1Db21tYW5kID0gU1RPUF9UT05FOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgdG9uZSBzdG9wIik7Ci0gICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Ci19Ci0KIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjp2b2x1bWVDb21tYW5kKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LApAQCAtOTY3LDMzICsxNDIwLDQyIEBACiAgICAgcmV0dXJuIHNlbmRDb21tYW5kKGNvbW1hbmQsIGRlbGF5TXMpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzdG9wT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6c2V0RWZmZWN0U3VzcGVuZGVkQ29tbWFuZChpbnQgZWZmZWN0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3VzcGVuZGVkKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD4gY29tbWFuZCA9IG5ldyBBdWRpb0NvbW1hbmQoKTsKKyAgICBjb21tYW5kLT5tQ29tbWFuZCA9IFNFVF9FRkZFQ1RfU1VTUEVOREVEOworICAgIHNwPFNldEVmZmVjdFN1c3BlbmRlZERhdGE+IGRhdGEgPSBuZXcgU2V0RWZmZWN0U3VzcGVuZGVkRGF0YSgpOworICAgIGRhdGEtPm1FZmZlY3RJZCA9IGVmZmVjdElkOworICAgIGRhdGEtPm1TZXNzaW9uSWQgPSBzZXNzaW9uSWQ7CisgICAgZGF0YS0+bVN1c3BlbmRlZCA9IHN1c3BlbmRlZDsKKyAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgc2V0IHN1c3BlbmRlZCBlZmZlY3RJZCAlZCBzZXNzaW9uSWQgJWQgc3VzcGVuZGVkICVkIiwKKyAgICAgICAgZWZmZWN0SWQsIHNlc3Npb25JZCwgc3VzcGVuZGVkKTsKKyAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKK30KKworCit2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzdG9wT3V0cHV0Q29tbWFuZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCkKIHsKICAgICBzcDxBdWRpb0NvbW1hbmQ+IGNvbW1hbmQgPSBuZXcgQXVkaW9Db21tYW5kKCk7CiAgICAgY29tbWFuZC0+bUNvbW1hbmQgPSBTVE9QX09VVFBVVDsKICAgICBzcDxTdG9wT3V0cHV0RGF0YT4gZGF0YSA9IG5ldyBTdG9wT3V0cHV0RGF0YSgpOwotICAgIGRhdGEtPm1JTyA9IG91dHB1dDsKLSAgICBkYXRhLT5tU3RyZWFtID0gc3RyZWFtOwotICAgIGRhdGEtPm1TZXNzaW9uID0gc2Vzc2lvbjsKKyAgICBkYXRhLT5tUG9ydElkID0gcG9ydElkOwogICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7Ci0gICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzdG9wIG91dHB1dCAlZCIsIG91dHB1dCk7CisgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyBzdG9wIG91dHB1dCBwb3J0SWQgJWQiLCBwb3J0SWQpOwogICAgIHNlbmRDb21tYW5kKGNvbW1hbmQpOwogfQogCi12b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpyZWxlYXNlT3V0cHV0Q29tbWFuZChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKQordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6cmVsZWFzZU91dHB1dENvbW1hbmQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpCiB7CiAgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwogICAgIGNvbW1hbmQtPm1Db21tYW5kID0gUkVMRUFTRV9PVVRQVVQ7CiAgICAgc3A8UmVsZWFzZU91dHB1dERhdGE+IGRhdGEgPSBuZXcgUmVsZWFzZU91dHB1dERhdGEoKTsKLSAgICBkYXRhLT5tSU8gPSBvdXRwdXQ7Ci0gICAgZGF0YS0+bVN0cmVhbSA9IHN0cmVhbTsKLSAgICBkYXRhLT5tU2Vzc2lvbiA9IHNlc3Npb247CisgICAgZGF0YS0+bVBvcnRJZCA9IHBvcnRJZDsKICAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOwotICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgcmVsZWFzZSBvdXRwdXQgJWQiLCBvdXRwdXQpOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgcmVsZWFzZSBvdXRwdXQgcG9ydElkICVkIiwgcG9ydElkKTsKICAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKIH0KIApAQCAtMTA0OCw2ICsxNTEwLDE5IEBACiAgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OmNoYW5nZUF1ZGlvVm9sdW1lR3JvdXBDb21tYW5kKHZvbHVtZV9ncm91cF90IGdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzKQoreworICAgIHNwPEF1ZGlvQ29tbWFuZD5jb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gQ0hBTkdFRF9BVURJT1ZPTFVNRUdST1VQOworICAgIEF1ZGlvVm9sdW1lR3JvdXBEYXRhICpkYXRhPSBuZXcgQXVkaW9Wb2x1bWVHcm91cERhdGEoKTsKKyAgICBkYXRhLT5tR3JvdXAgPSBncm91cDsKKyAgICBkYXRhLT5tRmxhZ3MgPSBmbGFnczsKKyAgICBjb21tYW5kLT5tUGFyYW0gPSBkYXRhOworICAgIEFMT0dWKCJBdWRpb0NvbW1hbmRUaHJlYWQoKSBhZGRpbmcgYXVkaW8gdm9sdW1lIGdyb3VwIGNoYW5nZWQiKTsKKyAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKK30KKwogc3RhdHVzX3QgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpBdWRpb0NvbW1hbmRUaHJlYWQ6OnNldEF1ZGlvUG9ydENvbmZpZ0NvbW1hbmQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLCBpbnQgZGVsYXlNcykKIHsKQEAgLTEwNzYsOSArMTU1MSwxNCBAQAogfQogCiB2b2lkIEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpyZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlQ29tbWFuZCgKLSAgICAgICAgaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLCBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKQogewogICAgIHNwPEF1ZGlvQ29tbWFuZD5jb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOwogICAgIGNvbW1hbmQtPm1Db21tYW5kID0gUkVDT1JESU5HX0NPTkZJR1VSQVRJT05fVVBEQVRFOwpAQCAtMTA4NiwxNCArMTU2NiwyNCBAQAogICAgIGRhdGEtPm1FdmVudCA9IGV2ZW50OwogICAgIGRhdGEtPm1DbGllbnRJbmZvID0gKmNsaWVudEluZm87CiAgICAgZGF0YS0+bUNsaWVudENvbmZpZyA9ICpjbGllbnRDb25maWc7CisgICAgZGF0YS0+bUNsaWVudEVmZmVjdHMgPSBjbGllbnRFZmZlY3RzOwogICAgIGRhdGEtPm1EZXZpY2VDb25maWcgPSAqZGV2aWNlQ29uZmlnOworICAgIGRhdGEtPm1FZmZlY3RzID0gZWZmZWN0czsKICAgICBkYXRhLT5tUGF0Y2hIYW5kbGUgPSBwYXRjaEhhbmRsZTsKKyAgICBkYXRhLT5tU291cmNlID0gc291cmNlOwogICAgIGNvbW1hbmQtPm1QYXJhbSA9IGRhdGE7CiAgICAgQUxPR1YoIkF1ZGlvQ29tbWFuZFRocmVhZCgpIGFkZGluZyByZWNvcmRpbmcgY29uZmlndXJhdGlvbiB1cGRhdGUgZXZlbnQgJWQsIHNvdXJjZSAlZCB1aWQgJXUiLAogICAgICAgICAgICAgZXZlbnQsIGNsaWVudEluZm8tPnNvdXJjZSwgY2xpZW50SW5mby0+dWlkKTsKICAgICBzZW5kQ29tbWFuZChjb21tYW5kKTsKIH0KIAordm9pZCBBdWRpb1BvbGljeVNlcnZpY2U6OkF1ZGlvQ29tbWFuZFRocmVhZDo6YXVkaW9Nb2R1bGVzVXBkYXRlQ29tbWFuZCgpCit7CisgICAgc3A8QXVkaW9Db21tYW5kPiBjb21tYW5kID0gbmV3IEF1ZGlvQ29tbWFuZCgpOworICAgIGNvbW1hbmQtPm1Db21tYW5kID0gQVVESU9fTU9EVUxFU19VUERBVEU7CisgICAgc2VuZENvbW1hbmQoY29tbWFuZCk7Cit9CisKIHN0YXR1c190IEF1ZGlvUG9saWN5U2VydmljZTo6QXVkaW9Db21tYW5kVGhyZWFkOjpzZW5kQ29tbWFuZChzcDxBdWRpb0NvbW1hbmQ+JiBjb21tYW5kLCBpbnQgZGVsYXlNcykKIHsKICAgICB7CkBAIC0xMjEyLDYgKzE3MDIsNyBAQAogICAgICAgICAgICAgICAgIHBhdGNoID0gKChDcmVhdGVBdWRpb1BhdGNoRGF0YSAqKWNvbW1hbmQtPm1QYXJhbS5nZXQoKSktPm1QYXRjaDsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgaGFuZGxlID0gKChSZWxlYXNlQXVkaW9QYXRjaERhdGEgKiljb21tYW5kLT5tUGFyYW0uZ2V0KCkpLT5tSGFuZGxlOworICAgICAgICAgICAgICAgIG1lbXNldCgmcGF0Y2gsIDAsIHNpemVvZihwYXRjaCkpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlMjsKICAgICAgICAgICAgIHN0cnVjdCBhdWRpb19wYXRjaCBwYXRjaDI7CkBAIC0xMjU2LDggKzE3NDcsNiBAQAogCiAgICAgICAgIH0gYnJlYWs7CiAKLSAgICAgICAgY2FzZSBTVEFSVF9UT05FOgotICAgICAgICBjYXNlIFNUT1BfVE9ORToKICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xMzMwLDMyICsxODE5LDI0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsIGRlbGF5TXMpOwogfQogCi1pbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdGFydFRvbmUoYXVkaW9fcG9saWN5X3RvbmVfdCB0b25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKQotewotICAgIGlmICh0b25lICE9IEFVRElPX1BPTElDWV9UT05FX0lOX0NBTExfTk9USUZJQ0FUSU9OKSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydFRvbmU6IGlsbGVnYWwgdG9uZSByZXF1ZXN0ZWQgKCVkKSIsIHRvbmUpOwotICAgIH0KLSAgICBpZiAoc3RyZWFtICE9IEFVRElPX1NUUkVBTV9WT0lDRV9DQUxMKSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydFRvbmU6IGlsbGVnYWwgc3RyZWFtICglZCkgcmVxdWVzdGVkIGZvciB0b25lICVkIiwgc3RyZWFtLAotICAgICAgICAgICAgdG9uZSk7Ci0gICAgfQotICAgIG1Ub25lUGxheWJhY2tUaHJlYWQtPnN0YXJ0VG9uZUNvbW1hbmQoVG9uZUdlbmVyYXRvcjo6VE9ORV9TVVBfQ0FMTF9XQUlUSU5HLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU1RSRUFNX1ZPSUNFX0NBTEwpOwotICAgIHJldHVybiAwOwotfQotCi1pbnQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzdG9wVG9uZSgpCi17Ci0gICAgbVRvbmVQbGF5YmFja1RocmVhZC0+c3RvcFRvbmVDb21tYW5kKCk7Ci0gICAgcmV0dXJuIDA7Ci19Ci0KIGludCBBdWRpb1BvbGljeVNlcnZpY2U6OnNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMpCiB7CiAgICAgcmV0dXJuIChpbnQpbUF1ZGlvQ29tbWFuZFRocmVhZC0+dm9pY2VWb2x1bWVDb21tYW5kKHZvbHVtZSwgZGVsYXlNcyk7CiB9CiAKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpzZXRFZmZlY3RTdXNwZW5kZWQoaW50IGVmZmVjdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmRlZCkKK3sKKyAgICBtQXVkaW9Db21tYW5kVGhyZWFkLT5zZXRFZmZlY3RTdXNwZW5kZWRDb21tYW5kKGVmZmVjdElkLCBzZXNzaW9uSWQsIHN1c3BlbmRlZCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lTZXJ2aWNlOjpvbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZSgpCit7CisgICAgbU91dHB1dENvbW1hbmRUaHJlYWQtPmF1ZGlvTW9kdWxlc1VwZGF0ZUNvbW1hbmQoKTsKK30KKworCiBleHRlcm4gIkMiIHsKIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBhcHNfbG9hZF9od19tb2R1bGUodm9pZCAqc2VydmljZSBfX3VudXNlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOwpAQCAtMTQwNiw5ICsxODg3LDYgQEAKIGludCBhcHNfc2V0X3N0cmVhbV92b2x1bWUodm9pZCAqc2VydmljZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLCBhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5X21zKTsKLWludCBhcHNfc3RhcnRfdG9uZSh2b2lkICpzZXJ2aWNlLCBhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci1pbnQgYXBzX3N0b3BfdG9uZSh2b2lkICpzZXJ2aWNlKTsKIGludCBhcHNfc2V0X3ZvaWNlX3ZvbHVtZSh2b2lkICpzZXJ2aWNlLCBmbG9hdCB2b2x1bWUsIGludCBkZWxheV9tcyk7CiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvc2VydmljZS9BdWRpb1BvbGljeVNlcnZpY2UuaAppbmRleCA0MDdkN2E1Li4wMzcwNDM4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS9zZXJ2aWNlL0F1ZGlvUG9saWN5U2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3NlcnZpY2UvQXVkaW9Qb2xpY3lTZXJ2aWNlLmgKQEAgLTIzLDYgKzIzLDcgQEAKICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CiAjaW5jbHVkZSA8dXRpbHMvVmVjdG9yLmg+CiAjaW5jbHVkZSA8dXRpbHMvU29ydGVkVmVjdG9yLmg+CisjaW5jbHVkZSA8YmluZGVyL0FjdGl2aXR5TWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lVaWRPYnNlcnZlci5oPgogI2luY2x1ZGUgPHN5c3RlbS9hdWRpby5oPgpAQCAtMzEsMTUgKzMyLDE1IEBACiAjaW5jbHVkZSA8bWVkaWEvVG9uZUdlbmVyYXRvci5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvRWZmZWN0Lmg+CiAjaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3kuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlICJBdWRpb1BvbGljeUVmZmVjdHMuaCIKLSNpbmNsdWRlICJtYW5hZ2VyZGVmYXVsdC9BdWRpb1BvbGljeU1hbmFnZXIuaCIKKyNpbmNsdWRlIDxBdWRpb1BvbGljeUludGVyZmFjZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvQm5TZW5zb3JQcml2YWN5TGlzdGVuZXIuaD4KIAogI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAotdXNpbmcgbmFtZXNwYWNlIHN0ZDsKLQogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBjbGFzcyBBdWRpb1BvbGljeVNlcnZpY2UgOgpAQCAtNTksNDEgKzYwLDQwIEBACiAgICAgLy8gQm5BdWRpb1BvbGljeVNlcnZpY2UgKHNlZSBBdWRpb1BvbGljeUludGVyZmFjZSBmb3IgbWV0aG9kIGRlc2NyaXB0aW9ucykKICAgICAvLwogCisgICAgdm9pZCBvbk5ld0F1ZGlvTW9kdWxlc0F2YWlsYWJsZSgpIG92ZXJyaWRlOwogICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKGF1ZGlvX2RldmljZXNfdCBkZXZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9saWN5X2Rldl9zdGF0ZV90IHN0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9hZGRyZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmRldmljZV9uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBlbmNvZGVkRm9ybWF0KTsKICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9kZXZfc3RhdGVfdCBnZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBoYW5kbGVEZXZpY2VDb25maWdDaGFuZ2UoYXVkaW9fZGV2aWNlc190IGRldmljZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfYWRkcmVzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpkZXZpY2VfbmFtZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqZGV2aWNlX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZW5jb2RlZEZvcm1hdCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRQaG9uZVN0YXRlKGF1ZGlvX21vZGVfdCBzdGF0ZSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRGb3JjZVVzZShhdWRpb19wb2xpY3lfZm9yY2VfdXNlX3QgdXNhZ2UsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgY29uZmlnKTsKICAgICB2aXJ0dWFsIGF1ZGlvX3BvbGljeV9mb3JjZWRfY2ZnX3QgZ2V0Rm9yY2VVc2UoYXVkaW9fcG9saWN5X2ZvcmNlX3VzZV90IHVzYWdlKTsKICAgICB2aXJ0dWFsIGF1ZGlvX2lvX2hhbmRsZV90IGdldE91dHB1dChhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBnZXRPdXRwdXRGb3JBdHRyKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAqYXR0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ190ICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpwb3J0SWQpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7Ci0gICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgIHN0YXR1c190IGdldE91dHB1dEZvckF0dHIoYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCAqc3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX3QgKmNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2lvX2hhbmRsZV90PiAqc2Vjb25kYXJ5T3V0cHV0cykgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydE91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wT3V0cHV0KGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZU91dHB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEZvckF0dHIoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICphdHRyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICppbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCByaWlkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBpZF90IHBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aWRfdCB1aWQsCkBAIC0xMDIsOCArMTAyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQgPSBOVUxMLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCA9IE5VTEwpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqc2lsZW5jZWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRJbnB1dChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHZpcnR1YWwgdm9pZCByZWxlYXNlSW5wdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5pdFN0cmVhbVZvbHVtZShhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKQEAgLTExNiw2ICsxMTUsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRWb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190IGRldmljZSk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNaW5Wb2x1bWVJbmRleEZvckF0dHJpYnV0ZXMoY29uc3QgYXVkaW9fYXR0cmlidXRlc190ICZhdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmaW5kZXgpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0TWF4Vm9sdW1lSW5kZXhGb3JBdHRyaWJ1dGVzKGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJmluZGV4KTsKKwogICAgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3RyYXRlZ3lGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogICAgIHZpcnR1YWwgYXVkaW9fZGV2aWNlc190IGdldERldmljZXNGb3JTdHJlYW0oYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwogCkBAIC0xMjcsNiArMTM3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCB1bnJlZ2lzdGVyRWZmZWN0KGludCBpZCk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRFZmZlY3RFbmFibGVkKGludCBpZCwgYm9vbCBlbmFibGVkKTsKKyAgICBzdGF0dXNfdCBtb3ZlRWZmZWN0c1RvSW8oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgaWRzLCBhdWRpb19pb19oYW5kbGVfdCBpbykgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBib29sIGlzU3RyZWFtQWN0aXZlKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwogICAgIHZpcnR1YWwgYm9vbCBpc1N0cmVhbUFjdGl2ZVJlbW90ZWx5KGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCB1aW50MzJfdCBpblBhc3RNcyA9IDApIGNvbnN0OwogICAgIHZpcnR1YWwgYm9vbCBpc1NvdXJjZUFjdGl2ZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpIGNvbnN0OwpAQCAtMTM0LDYgKzE0NSwyMSBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVlcnlEZWZhdWx0UHJlUHJvY2Vzc2luZyhhdWRpb19zZXNzaW9uX3QgYXVkaW9TZXNzaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVmZmVjdF9kZXNjcmlwdG9yX3QgKmRlc2NyaXB0b3JzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpjb3VudCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTb3VyY2VEZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90KiBpZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBhZGRTdHJlYW1EZWZhdWx0RWZmZWN0KGNvbnN0IGVmZmVjdF91dWlkX3QgKnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBlZmZlY3RfdXVpZF90ICp1dWlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191c2FnZV90IHVzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb191bmlxdWVfaWRfdCogaWQpOworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlU291cmNlRGVmYXVsdEVmZmVjdChhdWRpb191bmlxdWVfaWRfdCBpZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCByZW1vdmVTdHJlYW1EZWZhdWx0RWZmZWN0KGF1ZGlvX3VuaXF1ZV9pZF90IGlkKTsKKwogICAgIHZpcnR1YWwgICAgIHN0YXR1c190ICAgIG9uVHJhbnNhY3QoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBhcmNlbCYgZGF0YSwKQEAgLTE1OSwxMCArMTg1LDExIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdm9sdW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVsYXlNcyA9IDApOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgdG9uZSwgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0pOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcFRvbmUoKTsKICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKTsKKyAgICBzdGF0dXNfdCBzZXRBbGxvd2VkQ2FwdHVyZVBvbGljeSh1aW50X3QgdWlkLCBhdWRpb19mbGFnc19tYXNrX3QgY2FwdHVyZVBvbGljeSkgb3ZlcnJpZGU7CiAgICAgdmlydHVhbCBib29sIGlzT2ZmbG9hZFN1cHBvcnRlZChjb25zdCBhdWRpb19vZmZsb2FkX2luZm9fdCAmY29uZmlnKTsKKyAgICB2aXJ0dWFsIGJvb2wgaXNEaXJlY3RPdXRwdXRTdXBwb3J0ZWQoY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCYgY29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QmIGF0dHJpYnV0ZXMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qb3J0cyhhdWRpb19wb3J0X3JvbGVfdCByb2xlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF90eXBlX3QgdHlwZSwKQEAgLTE4Miw2ICsyMDksOCBAQAogCiAgICAgdmlydHVhbCB2b2lkIHNldEF1ZGlvUG9ydENhbGxiYWNrc0VuYWJsZWQoYm9vbCBlbmFibGVkKTsKIAorICAgIHZpcnR1YWwgdm9pZCBzZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBhY3F1aXJlU291bmRUcmlnZ2VyU2Vzc2lvbihhdWRpb19zZXNzaW9uX3QgKnNlc3Npb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKmlvSGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCAqZGV2aWNlKTsKQEAgLTE5MiwxMCArMjIxLDIzIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJlZ2lzdGVyUG9saWN5TWl4ZXMoY29uc3QgVmVjdG9yPEF1ZGlvTWl4PiYgbWl4ZXMsIGJvb2wgcmVnaXN0cmF0aW9uKTsKIAorICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VWlkRGV2aWNlQWZmaW5pdGllcyh1aWRfdCB1aWQsIGNvbnN0IFZlY3RvcjxBdWRpb0RldmljZVR5cGVBZGRyPiYgZGV2aWNlcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHJlbW92ZVVpZERldmljZUFmZmluaXRpZXModWlkX3QgdWlkKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0UHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZXZpY2VUeXBlQWRkciAmZGV2aWNlKTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgcmVtb3ZlUHJlZmVycmVkRGV2aWNlRm9yU3RyYXRlZ3kocHJvZHVjdF9zdHJhdGVneV90IHN0cmF0ZWd5KTsKKworCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcmVmZXJyZWREZXZpY2VGb3JTdHJhdGVneShwcm9kdWN0X3N0cmF0ZWd5X3Qgc3RyYXRlZ3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdWRpb0RldmljZVR5cGVBZGRyICZkZXZpY2UpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzdGFydEF1ZGlvU291cmNlKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgKmF0dHJpYnV0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUpOwotICAgIHZpcnR1YWwgc3RhdHVzX3Qgc3RvcEF1ZGlvU291cmNlKGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wQXVkaW9Tb3VyY2UoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRNYXN0ZXJNb25vKGJvb2wgbW9ubyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRNYXN0ZXJNb25vKGJvb2wgKm1vbm8pOwpAQCAtMjA3LDE0ICsyNDksMjkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCAqc3Vycm91bmRGb3JtYXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKnN1cnJvdW5kRm9ybWF0c0VuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXBvcnRlZCk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRId09mZmxvYWRFbmNvZGluZ0Zvcm1hdHNTdXBwb3J0ZWRGb3JBMkRQKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGF1ZGlvX2Zvcm1hdF90PiAqZm9ybWF0cyk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRTdXJyb3VuZEZvcm1hdEVuYWJsZWQoYXVkaW9fZm9ybWF0X3QgYXVkaW9Gb3JtYXQsIGJvb2wgZW5hYmxlZCk7CiAKLSAgICAgICAgICAgIHN0YXR1c190IGRvU3RvcE91dHB1dChhdWRpb19pb19oYW5kbGVfdCBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOwotICAgICAgICAgICAgdm9pZCBkb1JlbGVhc2VPdXRwdXQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbik7CisgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRBc3Npc3RhbnRVaWQodWlkX3QgdWlkKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldEExMXlTZXJ2aWNlc1VpZHMoY29uc3Qgc3RkOjp2ZWN0b3I8dWlkX3Q+JiB1aWRzKTsKKworICAgIHZpcnR1YWwgYm9vbCAgICAgaXNIYXB0aWNQbGF5YmFja1N1cHBvcnRlZCgpOworCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0QXVkaW9Qcm9kdWN0U3RyYXRlZ2llcyhBdWRpb1Byb2R1Y3RTdHJhdGVneVZlY3RvciAmc3RyYXRlZ2llcyk7CisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRQcm9kdWN0U3RyYXRlZ3lGcm9tQXVkaW9BdHRyaWJ1dGVzKGNvbnN0IEF1ZGlvQXR0cmlidXRlcyAmYWEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2R1Y3Rfc3RyYXRlZ3lfdCAmcHJvZHVjdFN0cmF0ZWd5KTsKKworICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdEF1ZGlvVm9sdW1lR3JvdXBzKEF1ZGlvVm9sdW1lR3JvdXBWZWN0b3IgJmdyb3Vwcyk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFZvbHVtZUdyb3VwRnJvbUF1ZGlvQXR0cmlidXRlcyhjb25zdCBBdWRpb0F0dHJpYnV0ZXMgJmFhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvbHVtZV9ncm91cF90ICZ2b2x1bWVHcm91cCk7CisKKyAgICB2aXJ0dWFsIHN0YXR1c190IHNldFJ0dEVuYWJsZWQoYm9vbCBlbmFibGVkKTsKKworICAgICAgICAgICAgdm9pZCBkb09uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCk7CisgICAgICAgICAgICBzdGF0dXNfdCBkb1N0b3BPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOworICAgICAgICAgICAgdm9pZCBkb1JlbGVhc2VPdXRwdXQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCiAgICAgICAgICAgICBzdGF0dXNfdCBjbGllbnRDcmVhdGVBdWRpb1BhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90ICpoYW5kbGUsCkBAIC0yMjQsNyArMjgxLDcgQEAKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgY2xpZW50U2V0QXVkaW9Qb3J0Q29uZmlnKGNvbnN0IHN0cnVjdCBhdWRpb19wb3J0X2NvbmZpZyAqY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOwogCi0gICAgICAgICAgICB2b2lkIHJlbW92ZU5vdGlmaWNhdGlvbkNsaWVudCh1aWRfdCB1aWQpOworICAgICAgICAgICAgdm9pZCByZW1vdmVOb3RpZmljYXRpb25DbGllbnQodWlkX3QgdWlkLCBwaWRfdCBwaWQpOwogICAgICAgICAgICAgdm9pZCBvbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgICAgIHZvaWQgZG9PbkF1ZGlvUG9ydExpc3RVcGRhdGUoKTsKICAgICAgICAgICAgIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwpAQCAtMjMyLDEyICsyODksMjggQEAKIAogICAgICAgICAgICAgdm9pZCBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgICAgICB2b2lkIGRvT25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOwotICAgICAgICAgICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKLSAgICAgICAgICAgIHZvaWQgZG9PblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LCBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgIHZvaWQgb25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqY2xpZW50Q29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CisgICAgICAgICAgICB2b2lkIGRvT25SZWNvcmRpbmdDb25maWd1cmF0aW9uVXBkYXRlKGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3Qgc291cmNlKTsKKworICAgICAgICAgICAgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpOworICAgICAgICAgICAgdm9pZCBkb09uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncyk7CisgICAgICAgICAgICB2b2lkIHNldEVmZmVjdFN1c3BlbmRlZChpbnQgZWZmZWN0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kZWQpOwogCiBwcml2YXRlOgogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9Qb2xpY3lTZXJ2aWNlKCkgQU5EUk9JRF9BUEk7CkBAIC0yNDksNyArMzIyLDcgQEAKICAgICB2aXJ0dWFsIHN0YXR1c190IHNoZWxsQ29tbWFuZChpbnQgaW4sIGludCBvdXQsIGludCBlcnIsIFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiAgICAgLy8gU2V0cyB3aGV0aGVyIHRoZSBnaXZlbiBVSUQgcmVjb3JkcyBvbmx5IHNpbGVuY2UKLSAgICB2aXJ0dWFsIHZvaWQgc2V0UmVjb3JkU2lsZW5jZWQodWlkX3QgdWlkLCBib29sIHNpbGVuY2VkKTsKKyAgICB2aXJ0dWFsIHZvaWQgc2V0QXBwU3RhdGVfbCh1aWRfdCB1aWQsIGFwcF9zdGF0ZV90IHN0YXRlKTsKIAogICAgIC8vIE92ZXJyaWRlcyB0aGUgVUlEIHN0YXRlIGFzIGlmIGl0IGlzIGlkbGUKICAgICBzdGF0dXNfdCBoYW5kbGVTZXRVaWRTdGF0ZShWZWN0b3I8U3RyaW5nMTY+JiBhcmdzLCBpbnQgZXJyKTsKQEAgLTI2NSw2ICszMzgsMTggQEAKIAogICAgIHN0ZDo6c3RyaW5nIGdldERldmljZVR5cGVTdHJGb3JQb3J0SWQoYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQpOwogCisgICAgc3RhdHVzX3QgZ2V0QXVkaW9Qb2xpY3lFZmZlY3RzKHNwPEF1ZGlvUG9saWN5RWZmZWN0cz4mIGF1ZGlvUG9saWN5RWZmZWN0cyk7CisKKyAgICBhcHBfc3RhdGVfdCBhcG1TdGF0RnJvbUFtU3RhdGUoaW50IGFtU3RhdGUpOworCisgICAgdm9pZCB1cGRhdGVVaWRTdGF0ZXMoKTsKKyAgICB2b2lkIHVwZGF0ZVVpZFN0YXRlc19sKCk7CisKKyAgICB2b2lkIHNpbGVuY2VBbGxSZWNvcmRpbmdzX2woKTsKKworICAgIHN0YXRpYyBib29sIGlzUHJpdmFjeVNlbnNpdGl2ZVNvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpOworICAgIHN0YXRpYyBib29sIGlzVmlydHVhbFNvdXJjZShhdWRpb19zb3VyY2VfdCBzb3VyY2UpOworCiAgICAgLy8gSWYgcmVjb3JkaW5nIHdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBVSUQgaXMgYWxsb3dlZCB0byBkbyB0aGF0LiBJZiB0aGUgVUlEIGlzIGlkbGUKICAgICAvLyB0aGVuIGl0IGNhbm5vdCByZWNvcmQgYW5kIGdldHMgYnVmZmVycyB3aXRoIHplcm9zIC0gc2lsZW5jZS4gQXMgc29vbiBhcyB0aGUgVUlECiAgICAgLy8gdHJhbnNpdGlvbnMgdG8gYW4gYWN0aXZlIHN0YXRlIHdlIHdpbGwgc3RhcnQgcmVwb3J0aW5nIGJ1ZmZlcnMgd2l0aCBkYXRhLiBUaGlzIGFwcHJvYWNoCkBAIC0yNzQsNyArMzU5LDggQEAKICAgICBjbGFzcyBVaWRQb2xpY3kgOiBwdWJsaWMgQm5VaWRPYnNlcnZlciwgcHVibGljIHZpcnR1YWwgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgewogICAgIHB1YmxpYzoKICAgICAgICAgZXhwbGljaXQgVWlkUG9saWN5KHdwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSkKLSAgICAgICAgICAgICAgICA6IG1TZXJ2aWNlKHNlcnZpY2UpLCBtT2JzZXJ2ZXJSZWdpc3RlcmVkKGZhbHNlKSB7fQorICAgICAgICAgICAgICAgIDogbVNlcnZpY2Uoc2VydmljZSksIG1PYnNlcnZlclJlZ2lzdGVyZWQoZmFsc2UpLAorICAgICAgICAgICAgICAgICAgbUFzc2lzdGFudFVpZCgwKSwgbVJ0dEVuYWJsZWQoZmFsc2UpIHt9CiAKICAgICAgICAgdm9pZCByZWdpc3RlclNlbGYoKTsKICAgICAgICAgdm9pZCB1bnJlZ2lzdGVyU2VsZigpOwpAQCAtMjgzLDM0ICszNjksNjcgQEAKICAgICAgICAgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pIG92ZXJyaWRlOwogCiAgICAgICAgIGJvb2wgaXNVaWRBY3RpdmUodWlkX3QgdWlkKTsKKyAgICAgICAgaW50IGdldFVpZFN0YXRlKHVpZF90IHVpZCk7CisgICAgICAgIHZvaWQgc2V0QXNzaXN0YW50VWlkKHVpZF90IHVpZCkgeyBtQXNzaXN0YW50VWlkID0gdWlkOyB9CisgICAgICAgIGJvb2wgaXNBc3Npc3RhbnRVaWQodWlkX3QgdWlkKSB7IHJldHVybiB1aWQgPT0gbUFzc2lzdGFudFVpZDsgfQorICAgICAgICB2b2lkIHNldEExMXlVaWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHVpZF90PiYgdWlkcykgeyBtQTExeVVpZHMuY2xlYXIoKTsgbUExMXlVaWRzID0gdWlkczsgfQorICAgICAgICBib29sIGlzQTExeVVpZCh1aWRfdCB1aWQpOworICAgICAgICBib29sIGlzQTExeU9uVG9wKCk7CisgICAgICAgIHZvaWQgc2V0UnR0RW5hYmxlZChib29sIGVuYWJsZWQpIHsgbVJ0dEVuYWJsZWQgPSBlbmFibGVkOyB9CisgICAgICAgIGJvb2wgaXNSdHRFbmFibGVkKCkgeyByZXR1cm4gbVJ0dEVuYWJsZWQ7IH0KIAogICAgICAgICAvLyBCblVpZE9ic2VydmVyIGltcGxlbWVudGF0aW9uCiAgICAgICAgIHZvaWQgb25VaWRBY3RpdmUodWlkX3QgdWlkKSBvdmVycmlkZTsKICAgICAgICAgdm9pZCBvblVpZEdvbmUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKSBvdmVycmlkZTsKICAgICAgICAgdm9pZCBvblVpZElkbGUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKSBvdmVycmlkZTsKKyAgICAgICAgdm9pZCBvblVpZFN0YXRlQ2hhbmdlZCh1aWRfdCB1aWQsIGludDMyX3QgcHJvY1N0YXRlLCBpbnQ2NF90IHByb2NTdGF0ZVNlcSk7CiAKICAgICAgICAgdm9pZCBhZGRPdmVycmlkZVVpZCh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlKSB7IHVwZGF0ZU92ZXJyaWRlVWlkKHVpZCwgYWN0aXZlLCB0cnVlKTsgfQogICAgICAgICB2b2lkIHJlbW92ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCkgeyB1cGRhdGVPdmVycmlkZVVpZCh1aWQsIGZhbHNlLCBmYWxzZSk7IH0KIAotICAgIHByaXZhdGU6Ci0gICAgICAgIGJvb2wgaXNTZXJ2aWNlVWlkKHVpZF90IHVpZCkgY29uc3Q7Ci0gICAgICAgIHZvaWQgbm90aWZ5U2VydmljZSh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlKTsKKyAgICAgICAgdm9pZCB1cGRhdGVVaWQoc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBzdGQ6OnBhaXI8Ym9vbCwgaW50Pj4gKnVpZHMsCisgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGludCBzdGF0ZSwgYm9vbCBpbnNlcnQpOworCisgICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgbm90aWZ5U2VydmljZSgpOwogICAgICAgICB2b2lkIHVwZGF0ZU92ZXJyaWRlVWlkKHVpZF90IHVpZCwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KTsKLSAgICAgICAgdm9pZCB1cGRhdGVVaWRDYWNoZSh1aWRfdCB1aWQsIGJvb2wgYWN0aXZlLCBib29sIGluc2VydCk7Ci0gICAgICAgIHZvaWQgdXBkYXRlVWlkTG9ja2VkKHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgYm9vbD4gKnVpZHMsCi0gICAgICAgICAgICAgICAgdWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgYm9vbCBpbnNlcnQsIGJvb2wgKndhc1RoZXJlLCBib29sICp3YXNBY3RpdmUpOworICAgICAgICB2b2lkIHVwZGF0ZVVpZExvY2tlZChzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiAqdWlkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkLCBib29sIGFjdGl2ZSwgaW50IHN0YXRlLCBib29sIGluc2VydCk7CisgICAgICAgIHZvaWQgY2hlY2tSZWdpc3RlcmVkKCk7CiAKICAgICAgICAgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBtU2VydmljZTsKICAgICAgICAgTXV0ZXggbUxvY2s7CisgICAgICAgIEFjdGl2aXR5TWFuYWdlciBtQW07CiAgICAgICAgIGJvb2wgbU9ic2VydmVyUmVnaXN0ZXJlZDsKLSAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBib29sPiBtT3ZlcnJpZGVVaWRzOwotICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIGJvb2w+IG1DYWNoZWRVaWRzOworICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiBtT3ZlcnJpZGVVaWRzOworICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWlkX3QsIHN0ZDo6cGFpcjxib29sLCBpbnQ+PiBtQ2FjaGVkVWlkczsKKyAgICAgICAgdWlkX3QgbUFzc2lzdGFudFVpZDsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWlkX3Q+IG1BMTF5VWlkczsKKyAgICAgICAgYm9vbCBtUnR0RW5hYmxlZDsKICAgICB9OwogCi0gICAgLy8gVGhyZWFkIHVzZWQgZm9yIHRvbmUgcGxheWJhY2sgYW5kIHRvIHNlbmQgYXVkaW8gY29uZmlnIGNvbW1hbmRzIHRvIGF1ZGlvIGZsaW5nZXIKLSAgICAvLyBGb3IgdG9uZSBwbGF5YmFjaywgdXNpbmcgYSBzZXBhcmF0ZSB0aHJlYWQgaXMgbmVjZXNzYXJ5IHRvIGF2b2lkIGRlYWRsb2NrIHdpdGggbUxvY2sgYmVjYXVzZQotICAgIC8vIHN0YXJ0VG9uZSgpIGFuZCBzdG9wVG9uZSgpIGFyZSBub3JtYWxseSBjYWxsZWQgd2l0aCBtTG9jayBsb2NrZWQgYW5kIHJlcXVlc3RpbmcgYSB0b25lIHN0YXJ0Ci0gICAgLy8gb3Igc3RvcCB3aWxsIGNhdXNlIGNhbGxzIHRvIEF1ZGlvUG9saWN5U2VydmljZSBhbmQgYW4gYXR0ZW1wdCB0byBsb2NrIG1Mb2NrLgorICAgIC8vIElmIHNlbnNvciBwcml2YWN5IGlzIGVuYWJsZWQgdGhlbiBhbGwgYXBwcywgaW5jbHVkaW5nIHRob3NlIHRoYXQgYXJlIGFjdGl2ZSwgc2hvdWxkIGJlCisgICAgLy8gcHJldmVudGVkIGZyb20gcmVjb3JkaW5nLiBUaGlzIGlzIGhhbmRsZWQgc2ltaWxhciB0byBpZGxlIFVJRHMsIGFueSBhcHAgdGhhdCBhdHRlbXB0cworICAgIC8vIHRvIHJlY29yZCB3aGlsZSBzZW5zb3IgcHJpdmFjeSBpcyBlbmFibGVkIHdpbGwgcmVjZWl2ZSBidWZmZXJzIHdpdGggemVyb3MuIEFzIHNvb24gYXMKKyAgICAvLyBzZW5zb3IgcHJpdmFjeSBpcyBkaXNhYmxlZCBhY3RpdmUgYXBwcyB3aWxsIHJlY2VpdmUgdGhlIGV4cGVjdGVkIGRhdGEgd2hlbiByZWNvcmRpbmcuCisgICAgY2xhc3MgU2Vuc29yUHJpdmFjeVBvbGljeSA6IHB1YmxpYyBoYXJkd2FyZTo6Qm5TZW5zb3JQcml2YWN5TGlzdGVuZXIgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBleHBsaWNpdCBTZW5zb3JQcml2YWN5UG9saWN5KHdwPEF1ZGlvUG9saWN5U2VydmljZT4gc2VydmljZSkKKyAgICAgICAgICAgICAgICAgICAgOiBtU2VydmljZShzZXJ2aWNlKSB7fQorCisgICAgICAgICAgICB2b2lkIHJlZ2lzdGVyU2VsZigpOworICAgICAgICAgICAgdm9pZCB1bnJlZ2lzdGVyU2VsZigpOworCisgICAgICAgICAgICBib29sIGlzU2Vuc29yUHJpdmFjeUVuYWJsZWQoKTsKKworICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgb25TZW5zb3JQcml2YWN5Q2hhbmdlZChib29sIGVuYWJsZWQpOworCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB3cDxBdWRpb1BvbGljeVNlcnZpY2U+IG1TZXJ2aWNlOworICAgICAgICAgICAgc3RkOjphdG9taWNfYm9vbCBtU2Vuc29yUHJpdmFjeUVuYWJsZWQ7CisgICAgfTsKKworICAgIC8vIFRocmVhZCB1c2VkIHRvIHNlbmQgYXVkaW8gY29uZmlnIGNvbW1hbmRzIHRvIGF1ZGlvIGZsaW5nZXIKICAgICAvLyBGb3IgYXVkaW8gY29uZmlnIGNvbW1hbmRzLCBpdCBpcyBuZWNlc3NhcnkgYmVjYXVzZSBhdWRpbyBmbGluZ2VyIHJlcXVpcmVzIHRoYXQgdGhlIGNhbGxpbmcKICAgICAvLyBwcm9jZXNzICh1c2VyKSBoYXMgcGVybWlzc2lvbiB0byBtb2RpZnkgYXVkaW8gc2V0dGluZ3MuCiAgICAgY2xhc3MgQXVkaW9Db21tYW5kVGhyZWFkIDogcHVibGljIFRocmVhZCB7CkBAIC0zMTksOCArNDM4LDYgQEAKIAogICAgICAgICAvLyBjb21tYW5kcyBmb3IgdG9uZSBBdWRpb0NvbW1hbmQKICAgICAgICAgZW51bSB7Ci0gICAgICAgICAgICBTVEFSVF9UT05FLAotICAgICAgICAgICAgU1RPUF9UT05FLAogICAgICAgICAgICAgU0VUX1ZPTFVNRSwKICAgICAgICAgICAgIFNFVF9QQVJBTUVURVJTLAogICAgICAgICAgICAgU0VUX1ZPSUNFX1ZPTFVNRSwKQEAgLTMzMCw5ICs0NDcsMTIgQEAKICAgICAgICAgICAgIFJFTEVBU0VfQVVESU9fUEFUQ0gsCiAgICAgICAgICAgICBVUERBVEVfQVVESU9QT1JUX0xJU1QsCiAgICAgICAgICAgICBVUERBVEVfQVVESU9QQVRDSF9MSVNULAorICAgICAgICAgICAgQ0hBTkdFRF9BVURJT1ZPTFVNRUdST1VQLAogICAgICAgICAgICAgU0VUX0FVRElPUE9SVF9DT05GSUcsCiAgICAgICAgICAgICBEWU5fUE9MSUNZX01JWF9TVEFURV9VUERBVEUsCi0gICAgICAgICAgICBSRUNPUkRJTkdfQ09ORklHVVJBVElPTl9VUERBVEUKKyAgICAgICAgICAgIFJFQ09SRElOR19DT05GSUdVUkFUSU9OX1VQREFURSwKKyAgICAgICAgICAgIFNFVF9FRkZFQ1RfU1VTUEVOREVELAorICAgICAgICAgICAgQVVESU9fTU9EVUxFU19VUERBVEUsCiAgICAgICAgIH07CiAKICAgICAgICAgQXVkaW9Db21tYW5kVGhyZWFkIChTdHJpbmc4IG5hbWUsIGNvbnN0IHdwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UpOwpAQCAtMzQ1LDIwICs0NjUsMTMgQEAKICAgICAgICAgdmlydHVhbCAgICAgYm9vbCAgICAgICAgdGhyZWFkTG9vcCgpOwogCiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGV4aXQoKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgc3RhcnRUb25lQ29tbWFuZChUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3BUb25lQ29tbWFuZCgpOwogICAgICAgICAgICAgICAgICAgICBzdGF0dXNfdCAgICB2b2x1bWVDb21tYW5kKGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtLCBmbG9hdCB2b2x1bWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwgaW50IGRlbGF5TXMgPSAwKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgcGFyYW1ldGVyc0NvbW1hbmQoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmtleVZhbHVlUGFpcnMsIGludCBkZWxheU1zID0gMCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHZvaWNlVm9sdW1lQ29tbWFuZChmbG9hdCB2b2x1bWUsIGludCBkZWxheU1zID0gMCk7Ci0gICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHN0b3BPdXRwdXRDb21tYW5kKGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uKTsKLSAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVsZWFzZU91dHB1dENvbW1hbmQoYXVkaW9faW9faGFuZGxlX3Qgb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zdHJlYW1fdHlwZV90IHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBzdG9wT3V0cHV0Q29tbWFuZChhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHJlbGVhc2VPdXRwdXRDb21tYW5kKGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkKTsKICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgICAgc2VuZENvbW1hbmQoc3A8QXVkaW9Db21tYW5kPiYgY29tbWFuZCwgaW50IGRlbGF5TXMgPSAwKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgaW5zZXJ0Q29tbWFuZF9sKHNwPEF1ZGlvQ29tbWFuZD4mIGNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIGNyZWF0ZUF1ZGlvUGF0Y2hDb21tYW5kKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqcGF0Y2gsCkBAIC0zNjgsMTUgKzQ4MSwyNCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVBdWRpb1BvcnRMaXN0Q29tbWFuZCgpOwogICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICB1cGRhdGVBdWRpb1BhdGNoTGlzdENvbW1hbmQoKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgY2hhbmdlQXVkaW9Wb2x1bWVHcm91cENvbW1hbmQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncyk7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c190ICAgIHNldEF1ZGlvUG9ydENvbmZpZ0NvbW1hbmQoY29uc3Qgc3RydWN0IGF1ZGlvX3BvcnRfY29uZmlnICpjb25maWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlbGF5TXMpOwotICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBkeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGVDb21tYW5kKGNvbnN0IFN0cmluZzgmIHJlZ0lkLCBpbnQzMl90IHN0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgZHluYW1pY1BvbGljeU1peFN0YXRlVXBkYXRlQ29tbWFuZChjb25zdCBTdHJpbmc4JiByZWdJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHN0YXRlKTsKICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgICAgcmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZUNvbW1hbmQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fY29uZmlnX2Jhc2VfdCAqZGV2aWNlQ29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV2ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSk7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIHNldEVmZmVjdFN1c3BlbmRlZENvbW1hbmQoaW50IGVmZmVjdElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kZWQpOworICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICBhdWRpb01vZHVsZXNVcGRhdGVDb21tYW5kKCk7CiAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICAgIGluc2VydENvbW1hbmRfbChBdWRpb0NvbW1hbmQgKmNvbW1hbmQsIGludCBkZWxheU1zID0gMCk7CiAgICAgcHJpdmF0ZToKICAgICAgICAgY2xhc3MgQXVkaW9Db21tYW5kRGF0YTsKQEAgLTM5MCw3ICs1MTIsNyBAQAogCiAgICAgICAgICAgICB2b2lkIGR1bXAoY2hhciogYnVmZmVyLCBzaXplX3Qgc2l6ZSk7CiAKLSAgICAgICAgICAgIGludCBtQ29tbWFuZDsgICAvLyBTVEFSVF9UT05FLCBTVE9QX1RPTkUgLi4uCisgICAgICAgICAgICBpbnQgbUNvbW1hbmQ7ICAgLy8gU0VUX1ZPTFVNRSwgU0VUX1BBUkFNRVRFUlMuLi4KICAgICAgICAgICAgIG5zZWNzX3QgbVRpbWU7ICAvLyB0aW1lIHN0YW1wCiAgICAgICAgICAgICBNdXRleCBtTG9jazsgICAgLy8gbXV0ZXggYXNzb2NpYXRlZCB0byBtQ29uZAogICAgICAgICAgICAgQ29uZGl0aW9uIG1Db25kOyAvLyBjb25kaXRpb24gZm9yIHN0YXR1cyByZXR1cm4KQEAgLTQwNiwxMiArNTI4LDYgQEAKICAgICAgICAgICAgIEF1ZGlvQ29tbWFuZERhdGEoKSB7fQogICAgICAgICB9OwogCi0gICAgICAgIGNsYXNzIFRvbmVEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewotICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgICBUb25lR2VuZXJhdG9yOjp0b25lX3R5cGUgbVR5cGU7IC8vIHRvbmUgdHlwZSAoU1RBUlRfVE9ORSBvbmx5KQotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOyAgICAvLyBzdHJlYW0gdHlwZSAoU1RBUlRfVE9ORSBvbmx5KQotICAgICAgICB9OwotCiAgICAgICAgIGNsYXNzIFZvbHVtZURhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CiAgICAgICAgIHB1YmxpYzoKICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsKQEAgLTQzMiwxNiArNTQ4LDEyIEBACiAKICAgICAgICAgY2xhc3MgU3RvcE91dHB1dERhdGEgOiBwdWJsaWMgQXVkaW9Db21tYW5kRGF0YSB7CiAgICAgICAgIHB1YmxpYzoKLSAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1JTzsKLSAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgbVN0cmVhbTsKLSAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbjsKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbVBvcnRJZDsKICAgICAgICAgfTsKIAogICAgICAgICBjbGFzcyBSZWxlYXNlT3V0cHV0RGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKICAgICAgICAgcHVibGljOgotICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgbUlPOwotICAgICAgICAgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBtU3RyZWFtOwotICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IG1TZXNzaW9uOworICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUG9ydElkOwogICAgICAgICB9OwogCiAgICAgICAgIGNsYXNzIENyZWF0ZUF1ZGlvUGF0Y2hEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewpAQCAtNDU1LDYgKzU2NywxMiBAQAogICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbUhhbmRsZTsKICAgICAgICAgfTsKIAorICAgICAgICBjbGFzcyBBdWRpb1ZvbHVtZUdyb3VwRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgdm9sdW1lX2dyb3VwX3QgbUdyb3VwOworICAgICAgICAgICAgaW50IG1GbGFnczsKKyAgICAgICAgfTsKKwogICAgICAgICBjbGFzcyBTZXRBdWRpb1BvcnRDb25maWdEYXRhIDogcHVibGljIEF1ZGlvQ29tbWFuZERhdGEgewogICAgICAgICBwdWJsaWM6CiAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fcG9ydF9jb25maWcgbUNvbmZpZzsKQEAgLTQ3MSwxNCArNTg5LDIzIEBACiAgICAgICAgICAgICBpbnQgbUV2ZW50OwogICAgICAgICAgICAgcmVjb3JkX2NsaWVudF9pbmZvX3QgbUNsaWVudEluZm87CiAgICAgICAgICAgICBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UgbUNsaWVudENvbmZpZzsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGVmZmVjdF9kZXNjcmlwdG9yX3Q+IG1DbGllbnRFZmZlY3RzOwogICAgICAgICAgICAgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlIG1EZXZpY2VDb25maWc7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBtRWZmZWN0czsKICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IG1QYXRjaEhhbmRsZTsKKyAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IG1Tb3VyY2U7CisgICAgICAgIH07CisKKyAgICAgICAgY2xhc3MgU2V0RWZmZWN0U3VzcGVuZGVkRGF0YSA6IHB1YmxpYyBBdWRpb0NvbW1hbmREYXRhIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgaW50IG1FZmZlY3RJZDsKKyAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBtU2Vzc2lvbklkOworICAgICAgICAgICAgYm9vbCBtU3VzcGVuZGVkOwogICAgICAgICB9OwogCiAgICAgICAgIE11dGV4ICAgbUxvY2s7CiAgICAgICAgIENvbmRpdGlvbiBtV2FpdFdvcmtDVjsKICAgICAgICAgVmVjdG9yIDwgc3A8QXVkaW9Db21tYW5kPiA+IG1BdWRpb0NvbW1hbmRzOyAvLyBsaXN0IG9mIHBlbmRpbmcgY29tbWFuZHMKLSAgICAgICAgVG9uZUdlbmVyYXRvciAqbXBUb25lR2VuZXJhdG9yOyAgICAgLy8gdGhlIHRvbmUgZ2VuZXJhdG9yCiAgICAgICAgIHNwPEF1ZGlvQ29tbWFuZD4gbUxhc3RDb21tYW5kOyAgICAgIC8vIGxhc3QgcHJvY2Vzc2VkIGNvbW1hbmQgKHVzZWQgYnkgZHVtcCkKICAgICAgICAgU3RyaW5nOCBtTmFtZTsgICAgICAgICAgICAgICAgICAgICAgLy8gc3RyaW5nIHVzZWQgYnkgd2FrZSBsb2NrIGZvIGRlbGF5ZWQgY29tbWFuZHMKICAgICAgICAgd3A8QXVkaW9Qb2xpY3lTZXJ2aWNlPiBtU2VydmljZTsKQEAgLTUwOCw4ICs2MzUsNyBAQAogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90ICpvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICpkZXZpY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCYgYWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3JCYXNlPiYgZGV2aWNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKmxhdGVuY3lNcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzKTsKICAgICAgICAgLy8gY3JlYXRlcyBhIHNwZWNpYWwgb3V0cHV0IHRoYXQgaXMgZHVwbGljYXRlZCB0byB0aGUgdHdvIG91dHB1dHMgcGFzc2VkIGFzIGFyZ3VtZW50cy4gVGhlIGR1cGxpY2F0aW9uIGlzIHBlcmZvcm1lZCBieQpAQCAtNTUzLDExICs2NzksNiBAQAogICAgICAgICAvLyBmdW5jdGlvbiBlbmFibGluZyB0byByZWNlaXZlIHByb3ByaWV0YXJ5IGluZm9ybWF0aW9ucyBkaXJlY3RseSBmcm9tIGF1ZGlvIGhhcmR3YXJlIGludGVyZmFjZSB0byBhdWRpbyBwb2xpY3kgbWFuYWdlci4KICAgICAgICAgdmlydHVhbCBTdHJpbmc4IGdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgaW9IYW5kbGUsIGNvbnN0IFN0cmluZzgmIGtleXMpOwogCi0gICAgICAgIC8vIHJlcXVlc3QgdGhlIHBsYXliYWNrIG9mIGEgdG9uZSBvbiB0aGUgc3BlY2lmaWVkIHN0cmVhbTogdXNlZCBmb3IgaW5zdGFuY2UgdG8gcmVwbGFjZSBub3RpZmljYXRpb24gc291bmRzIHdoZW4gcGxheWluZwotICAgICAgICAvLyBvdmVyIGEgdGVsZXBob255IGRldmljZSBkdXJpbmcgYSBwaG9uZSBjYWxsLgotICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0VG9uZShhdWRpb19wb2xpY3lfdG9uZV90IHRvbmUsIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKTsKLSAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wVG9uZSgpOwotCiAgICAgICAgIC8vIHNldCBkb3duIGxpbmsgYXVkaW8gdm9sdW1lLgogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IHZvbHVtZSwgaW50IGRlbGF5TXMgPSAwKTsKIApAQCAtNTY2LDYgKzY4NywxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBzcmNPdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90IGRzdE91dHB1dCk7CiAKKyAgICAgICAgICAgICAgICB2b2lkIHNldEVmZmVjdFN1c3BlbmRlZChpbnQgZWZmZWN0SWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1c3BlbmRlZCkgb3ZlcnJpZGU7CisKICAgICAgICAgLyogQ3JlYXRlIGEgcGF0Y2ggYmV0d2VlbiBzZXZlcmFsIHNvdXJjZSBhbmQgc2luayBwb3J0cyAqLwogICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGNyZWF0ZUF1ZGlvUGF0Y2goY29uc3Qgc3RydWN0IGF1ZGlvX3BhdGNoICpwYXRjaCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCAqaGFuZGxlLApAQCAtNTgyLDkgKzcwNywxNSBAQAogICAgICAgICB2aXJ0dWFsIHZvaWQgb25BdWRpb1BhdGNoTGlzdFVwZGF0ZSgpOwogICAgICAgICB2aXJ0dWFsIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCByZWdJZCwgaW50MzJfdCBzdGF0ZSk7CiAgICAgICAgIHZpcnR1YWwgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVjb3JkX2NsaWVudF9pbmZvX3QgKmNsaWVudEluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpOworCisgICAgICAgIHZpcnR1YWwgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IGdyb3VwLCBpbnQgZmxhZ3MpOwogCiAgICAgICAgIHZpcnR1YWwgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdXNlX3QgdXNlKTsKIApAQCAtNTk3LDE4ICs3MjgsMjkgQEAKICAgICBwdWJsaWM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90aWZpY2F0aW9uQ2xpZW50KGNvbnN0IHNwPEF1ZGlvUG9saWN5U2VydmljZT4mIHNlcnZpY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiYgY2xpZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpZF90IHVpZCwgcGlkX3QgcGlkKTsKICAgICAgICAgdmlydHVhbCAgICAgICAgICAgICB+Tm90aWZpY2F0aW9uQ2xpZW50KCk7CiAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uQXVkaW9QYXRjaExpc3RVcGRhdGUoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoY29uc3QgU3RyaW5nOCYgcmVnSWQsIGludDMyX3Qgc3RhdGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBvbkR5bmFtaWNQb2xpY3lNaXhTdGF0ZVVwZGF0ZShjb25zdCBTdHJpbmc4JiByZWdJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBzdGF0ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uQXVkaW9Wb2x1bWVHcm91cENoYW5nZWQodm9sdW1lX2dyb3VwX3QgZ3JvdXAsIGludCBmbGFncyk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAgICAgIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXZlbnQsIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgcGF0Y2hIYW5kbGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBldmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCByZWNvcmRfY2xpZW50X2luZm9fdCAqY2xpZW50SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpjbGllbnRDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gY2xpZW50RWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19jb25maWdfYmFzZV90ICpkZXZpY2VDb25maWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8ZWZmZWN0X2Rlc2NyaXB0b3JfdD4gZWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBwYXRjaEhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCBzb3VyY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgICAgICBzZXRBdWRpb1BvcnRDYWxsYmFja3NFbmFibGVkKGJvb2wgZW5hYmxlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBzZXRBdWRpb1ZvbHVtZUdyb3VwQ2FsbGJhY2tzRW5hYmxlZChib29sIGVuYWJsZWQpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWlkX3QgdWlkKCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbVVpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgICAgICAvLyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudAogICAgICAgICAgICAgICAgIHZpcnR1YWwgICAgIHZvaWQgICAgICAgIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4mIHdobyk7CkBAIC02MTksMzYgKzc2MSw3MyBAQAogCiAgICAgICAgIGNvbnN0IHdwPEF1ZGlvUG9saWN5U2VydmljZT4gICAgICAgIG1TZXJ2aWNlOwogICAgICAgICBjb25zdCB1aWRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtVWlkOworICAgICAgICBjb25zdCBwaWRfdCAgICAgICAgICAgICAgICAgICAgICAgICBtUGlkOwogICAgICAgICBjb25zdCBzcDxJQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50PiBtQXVkaW9Qb2xpY3lTZXJ2aWNlQ2xpZW50OwogICAgICAgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgICAgICAgICBtQXVkaW9Qb3J0Q2FsbGJhY2tzRW5hYmxlZDsKKyAgICAgICAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgbUF1ZGlvVm9sdW1lR3JvdXBDYWxsYmFja3NFbmFibGVkOworICAgIH07CisKKyAgICBjbGFzcyBBdWRpb0NsaWVudCA6IHB1YmxpYyB2aXJ0dWFsIFJlZkJhc2UgeworICAgIHB1YmxpYzoKKyAgICAgICAgICAgICAgICBBdWRpb0NsaWVudChjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cmlidXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbywgdWlkX3QgdWlkLCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24sIGNvbnN0IGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwgaW8oaW8pLCB1aWQodWlkKSwgcGlkKHBpZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlc3Npb24oc2Vzc2lvbiksIGRldmljZUlkKGRldmljZUlkKSwgYWN0aXZlKGZhbHNlKSB7fQorICAgICAgICAgICAgICAgIH5BdWRpb0NsaWVudCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworCisgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzOyAvLyBzb3VyY2UsIGZsYWdzIC4uLgorICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbzsgICAgICAgICAgLy8gYXVkaW8gSEFMIHN0cmVhbSBJTyBoYW5kbGUKKyAgICAgICAgY29uc3QgdWlkX3QgdWlkOyAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBVSUQKKyAgICAgICAgY29uc3QgcGlkX3QgcGlkOyAgICAgICAgICAgICAgICAgICAgIC8vIGNsaWVudCBQSUQKKyAgICAgICAgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb247ICAgICAgIC8vIGF1ZGlvIHNlc3Npb24gSUQKKyAgICAgICAgY29uc3QgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsgIC8vIHNlbGVjdGVkIGlucHV0IGRldmljZSBwb3J0IElECisgICAgICAgICAgICAgIGJvb2wgYWN0aXZlOyAgICAgICAgICAgICAgICAgICAvLyBQbGF5YmFjay9DYXB0dXJlIGlzIGFjdGl2ZSBvciBpbmFjdGl2ZQogICAgIH07CiAKICAgICAvLyAtLS0gQXVkaW9SZWNvcmRDbGllbnQgLS0tCiAgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgZWFjaCByZWdpc3RlcmVkIEF1ZGlvUmVjb3JkIGNsaWVudAogICAgIC8vIChiZXR3ZWVuIGNhbGxzIHRvIGdldElucHV0Rm9yQXR0cigpIGFuZCByZWxlYXNlSW5wdXQoKSkKLSAgICBjbGFzcyBBdWRpb1JlY29yZENsaWVudCA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICBjbGFzcyBBdWRpb1JlY29yZENsaWVudCA6IHB1YmxpYyBBdWRpb0NsaWVudCB7CiAgICAgcHVibGljOgogICAgICAgICAgICAgICAgIEF1ZGlvUmVjb3JkQ2xpZW50KGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2lvX2hhbmRsZV90IGlucHV0LCB1aWRfdCB1aWQsIHBpZF90IHBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwgY29uc3QgYXVkaW9fc2Vzc2lvbl90IHNlc3Npb24pIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyhhdHRyaWJ1dGVzKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQoaW5wdXQpLCB1aWQodWlkKSwgcGlkKHBpZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSksIHNlc3Npb24oc2Vzc2lvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFjdGl2ZShmYWxzZSksIGlzQ29uY3VycmVudChmYWxzZSksIGlzVmlydHVhbERldmljZShmYWxzZSkge30KLSAgICAgICAgdmlydHVhbCB+QXVkaW9SZWNvcmRDbGllbnQoKSB7fQorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbywgdWlkX3QgdWlkLCBwaWRfdCBwaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBjb25zdCBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYW5DYXB0dXJlT3V0cHV0LCBib29sIGNhbkNhcHR1cmVIb3R3b3JkKSA6CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvQ2xpZW50KGF0dHJpYnV0ZXMsIGlvLCB1aWQsIHBpZCwgc2Vzc2lvbiwgZGV2aWNlSWQpLAorICAgICAgICAgICAgICAgICAgICBvcFBhY2thZ2VOYW1lKG9wUGFja2FnZU5hbWUpLCBzdGFydFRpbWVOcygwKSwKKyAgICAgICAgICAgICAgICAgICAgY2FuQ2FwdHVyZU91dHB1dChjYW5DYXB0dXJlT3V0cHV0KSwgY2FuQ2FwdHVyZUhvdHdvcmQoY2FuQ2FwdHVyZUhvdHdvcmQpIHt9CisgICAgICAgICAgICAgICAgfkF1ZGlvUmVjb3JkQ2xpZW50KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OwogCi0gICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyaWJ1dGVzOyAvLyBzb3VyY2UsIGZsYWdzIC4uLgotICAgICAgICBjb25zdCBhdWRpb19pb19oYW5kbGVfdCBpbnB1dDsgICAgICAgLy8gYXVkaW8gSEFMIGlucHV0IElPIGhhbmRsZQotICAgICAgICBjb25zdCB1aWRfdCB1aWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFVJRAotICAgICAgICBjb25zdCBwaWRfdCBwaWQ7ICAgICAgICAgICAgICAgICAgICAgLy8gY2xpZW50IFBJRAogICAgICAgICBjb25zdCBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lOyAgICAgICAgLy8gY2xpZW50IHBhY2thZ2UgbmFtZQotICAgICAgICBjb25zdCBhdWRpb19zZXNzaW9uX3Qgc2Vzc2lvbjsgICAgICAgLy8gYXVkaW8gc2Vzc2lvbiBJRAotICAgICAgICBib29sIGFjdGl2ZTsgICAgICAgICAgICAgICAgICAgLy8gQ2FwdHVyZSBpcyBhY3RpdmUgb3IgaW5hY3RpdmUKLSAgICAgICAgYm9vbCBpc0NvbmN1cnJlbnQ7ICAgICAgICAgICAgIC8vIGlzIGFsbG93ZWQgdG8gY29uY3VycmVudCBjYXB0dXJlCi0gICAgICAgIGJvb2wgaXNWaXJ0dWFsRGV2aWNlOyAgICAgICAgICAvLyB1c2VzIHZpcnR1YWwgZGV2aWNlOiB1cGRhdGVkIGJ5IEFQTTo6Z2V0SW5wdXRGb3JBdHRyKCkKLSAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBkZXZpY2VJZDsgIC8vIHNlbGVjdGVkIGlucHV0IGRldmljZSBwb3J0IElECisgICAgICAgIG5zZWNzX3Qgc3RhcnRUaW1lTnM7CisgICAgICAgIGNvbnN0IGJvb2wgY2FuQ2FwdHVyZU91dHB1dDsKKyAgICAgICAgY29uc3QgYm9vbCBjYW5DYXB0dXJlSG90d29yZDsKICAgICB9OwogCisgICAgLy8gLS0tIEF1ZGlvUGxheWJhY2tDbGllbnQgLS0tCisgICAgLy8gSW5mb3JtYXRpb24gYWJvdXQgZWFjaCByZWdpc3RlcmVkIEF1ZGlvVHJhY2sgY2xpZW50CisgICAgLy8gKGJldHdlZW4gY2FsbHMgdG8gZ2V0T3V0cHV0Rm9yQXR0cigpIGFuZCByZWxlYXNlT3V0cHV0KCkpCisgICAgY2xhc3MgQXVkaW9QbGF5YmFja0NsaWVudCA6IHB1YmxpYyBBdWRpb0NsaWVudCB7CisgICAgcHVibGljOgorICAgICAgICAgICAgICAgIEF1ZGlvUGxheWJhY2tDbGllbnQoY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYXVkaW9faW9faGFuZGxlX3QgaW8sIHVpZF90IHVpZCwgcGlkX3QgcGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uLCBhdWRpb19wb3J0X2hhbmRsZV90IGRldmljZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtKSA6CisgICAgICAgICAgICAgICAgICAgIEF1ZGlvQ2xpZW50KGF0dHJpYnV0ZXMsIGlvLCB1aWQsIHBpZCwgc2Vzc2lvbiwgZGV2aWNlSWQpLCBzdHJlYW0oc3RyZWFtKSB7fQorICAgICAgICAgICAgICAgIH5BdWRpb1BsYXliYWNrQ2xpZW50KCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgICAgICAgIGNvbnN0IGF1ZGlvX3N0cmVhbV90eXBlX3Qgc3RyZWFtOworICAgIH07CisKKyAgICB2b2lkIGdldFBsYXliYWNrQ2xpZW50QW5kRWZmZWN0cyhhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxBdWRpb1BsYXliYWNrQ2xpZW50PiYgY2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEF1ZGlvUG9saWN5RWZmZWN0cz4mIGVmZmVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqY29udGV4dCk7CisKKwogICAgIC8vIEEgY2xhc3MgYXV0b21hdGljYWxseSBjbGVhcmluZyBhbmQgcmVzdG9yaW5nIGJpbmRlciBjYWxsZXIgaWRlbnRpdHkgaW5zaWRlCiAgICAgLy8gYSBjb2RlIGJsb2NrIChzY29wZWQgdmFyaWFibGUpCiAgICAgLy8gRGVjbGFyZSBvbmUgc3lzdGVtYXRpY2FsbHkgYmVmb3JlIGNhbGxpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyIG1ldGhvZHMgc28gdGhhdCB0aGV5IGFyZQpAQCAtNjcxLDI2ICs4NTAsMzEgQEAKIAogICAgIG11dGFibGUgTXV0ZXggbUxvY2s7ICAgIC8vIHByZXZlbnRzIGNvbmN1cnJlbnQgYWNjZXNzIHRvIEF1ZGlvUG9saWN5IG1hbmFnZXIgZnVuY3Rpb25zIGNoYW5naW5nCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGV2aWNlIGNvbm5lY3Rpb24gc3RhdGUgIG9yIHJvdXRpbmcKLSAgICBtdXRhYmxlIE11dGV4IG1FZmZlY3RzTG9jazsgLy8gc2VyaWFsaXplIGFjY2VzcyB0byBFZmZlY3Qgc3RhdGUgd2l0aGluIEFQTS4KICAgICAvLyBOb3RlOiBsb2NrIGFjcXVpc2l0aW9uIG9yZGVyIGlzIGFsd2F5cyBtTG9jayA+IG1FZmZlY3RzTG9jazoKICAgICAvLyBtTG9jayBwcm90ZWN0cyBBdWRpb1BvbGljeU1hbmFnZXIgbWV0aG9kcyB0aGF0IGNhbiBjYWxsIGludG8gYXVkaW8gZmxpbmdlcgogICAgIC8vIGFuZCBwb3NzaWJseSBiYWNrIGluIHRvIGF1ZGlvIHBvbGljeSBzZXJ2aWNlIGFuZCBhY3F1aXJlIG1FZmZlY3RzTG9jay4KICAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1BdWRpb0NvbW1hbmRUaHJlYWQ7ICAgICAvLyBhdWRpbyBjb21tYW5kcyB0aHJlYWQKLSAgICBzcDxBdWRpb0NvbW1hbmRUaHJlYWQ+IG1Ub25lUGxheWJhY2tUaHJlYWQ7ICAgICAvLyB0b25lIHBsYXliYWNrIHRocmVhZAogICAgIHNwPEF1ZGlvQ29tbWFuZFRocmVhZD4gbU91dHB1dENvbW1hbmRUaHJlYWQ7ICAgIC8vIHByb2Nlc3Mgc3RvcCBhbmQgcmVsZWFzZSBvdXRwdXQKICAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5X2RldmljZSAqbXBBdWRpb1BvbGljeURldjsKICAgICBzdHJ1Y3QgYXVkaW9fcG9saWN5ICptcEF1ZGlvUG9saWN5OwogICAgIEF1ZGlvUG9saWN5SW50ZXJmYWNlICptQXVkaW9Qb2xpY3lNYW5hZ2VyOwogICAgIEF1ZGlvUG9saWN5Q2xpZW50ICptQXVkaW9Qb2xpY3lDbGllbnQ7CiAKLSAgICBEZWZhdWx0S2V5ZWRWZWN0b3I8IHVpZF90LCBzcDxOb3RpZmljYXRpb25DbGllbnQ+ID4gICAgbU5vdGlmaWNhdGlvbkNsaWVudHM7CisgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBpbnQ2NF90LCBzcDxOb3RpZmljYXRpb25DbGllbnQ+ID4gICAgbU5vdGlmaWNhdGlvbkNsaWVudHM7CiAgICAgTXV0ZXggbU5vdGlmaWNhdGlvbkNsaWVudHNMb2NrOyAgLy8gcHJvdGVjdHMgbU5vdGlmaWNhdGlvbkNsaWVudHMKICAgICAvLyBNYW5hZ2UgYWxsIGVmZmVjdHMgY29uZmlndXJlZCBpbiBhdWRpb19lZmZlY3RzLmNvbmYKKyAgICAvLyBuZXZlciBob2xkIEF1ZGlvUG9saWN5U2VydmljZTo6bUxvY2sgd2hlbiBjYWxsaW5nIEF1ZGlvUG9saWN5RWZmZWN0cyBtZXRob2RzIGFzCisgICAgLy8gdGhvc2UgY2FuIGNhbGwgYmFjayBpbnRvIEF1ZGlvUG9saWN5U2VydmljZSBtZXRob2RzIGFuZCB0cnkgdG8gYWNxdWlyZSB0aGUgbXV0ZXgKICAgICBzcDxBdWRpb1BvbGljeUVmZmVjdHM+IG1BdWRpb1BvbGljeUVmZmVjdHM7CiAgICAgYXVkaW9fbW9kZV90IG1QaG9uZVN0YXRlOwogCiAgICAgc3A8VWlkUG9saWN5PiBtVWlkUG9saWN5OworICAgIHNwPFNlbnNvclByaXZhY3lQb2xpY3k+IG1TZW5zb3JQcml2YWN5UG9saWN5OworCiAgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19wb3J0X2hhbmRsZV90LCBzcDxBdWRpb1JlY29yZENsaWVudD4gPiAgIG1BdWRpb1JlY29yZENsaWVudHM7CisgICAgRGVmYXVsdEtleWVkVmVjdG9yPCBhdWRpb19wb3J0X2hhbmRsZV90LCBzcDxBdWRpb1BsYXliYWNrQ2xpZW50PiA+ICAgbUF1ZGlvUGxheWJhY2tDbGllbnRzOworCisgICAgTWVkaWFQYWNrYWdlTWFuYWdlciBtUGFja2FnZU1hbmFnZXI7IC8vIFRvIGNoZWNrIGFsbG93UGxheWJhY2tDYXB0dXJlCiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLmJwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmRiMjQxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQW5kcm9pZC5icApAQCAtMCwwICsxLDcxIEBACitjY190ZXN0IHsKKyAgICBuYW1lOiAiYXVkaW9wb2xpY3lfdGVzdHMiLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5IiwKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKKyAgICAgICAgImxpYmF1ZGlvZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeSIsCisgICAgICAgICJsaWJhdWRpb3BvbGljeW1hbmFnZXJkZWZhdWx0IiwKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJ4bWwyIiwKKyAgICBdLAorCisgICAgc3RhdGljX2xpYnM6IFsibGliYXVkaW9wb2xpY3ljb21wb25lbnRzIl0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGliYXVkaW9wb2xpY3ljb21tb24iLAorICAgICAgICAibGliYXVkaW9wb2xpY3llbmdpbmVfaW50ZXJmYWNlX2hlYWRlcnMiLAorICAgICAgICAibGliYXVkaW9wb2xpY3ltYW5hZ2VyX2ludGVyZmFjZV9oZWFkZXJzIiwKKyAgICBdLAorCisgICAgc3JjczogWyJhdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwIl0sCisKKyAgICBkYXRhOiBbIjphdWRpb3BvbGljeXRlc3RfY29uZmlndXJhdGlvbl9maWxlcyIsXSwKKworICAgIGNmbGFnczogWworICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV2FsbCIsCisgICAgXSwKKworICAgIHRlc3Rfc3VpdGVzOiBbImRldmljZS10ZXN0cyJdLAorCit9CisKKworY2NfdGVzdCB7CisgICAgbmFtZTogImF1ZGlvX2hlYWx0aF90ZXN0cyIsCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXVkaW9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5bWFuYWdlcmRlZmF1bHQiLAorICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYm1lZGlhX2hlbHBlciIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIHN0YXRpY19saWJzOiBbImxpYmF1ZGlvcG9saWN5Y29tcG9uZW50cyJdLAorCisgICAgaGVhZGVyX2xpYnM6IFsKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5ZW5naW5lX2ludGVyZmFjZV9oZWFkZXJzIiwKKyAgICAgICAgImxpYmF1ZGlvcG9saWN5bWFuYWdlcl9pbnRlcmZhY2VfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNyY3M6IFsiYXVkaW9faGVhbHRoX3Rlc3RzLmNwcCJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2Vycm9yIiwKKyAgICAgICAgIi1XYWxsIiwKKyAgICBdLAorCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCisKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZmE5YWIxLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLWluY2x1ZGUgJChDTEVBUl9WQVJTKQotCi1MT0NBTF9DX0lOQ0xVREVTIDo9IFwKLSAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9hdWRpb3BvbGljeSBcCi0gIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9wb2xpY3kvY29tbW9uL2luY2x1ZGUgXAotICBmcmFtZXdvcmtzL2F2L3NlcnZpY2VzL2F1ZGlvcG9saWN5L2VuZ2luZS9pbnRlcmZhY2UgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgbGliYXVkaW9wb2xpY3ltYW5hZ2VyZGVmYXVsdCBcCi0gIGxpYmJhc2UgXAotICBsaWJsb2cgXAotICBsaWJtZWRpYV9oZWxwZXIgXAotICBsaWJ1dGlscyBcCi0KLUxPQ0FMX1NUQVRJQ19MSUJSQVJJRVMgOj0gXAotICBsaWJhdWRpb3BvbGljeWNvbXBvbmVudHMgXAotCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotICBhdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwIFwKLQotTE9DQUxfTU9EVUxFIDo9IGF1ZGlvcG9saWN5X3Rlc3RzCi0KLUxPQ0FMX01PRFVMRV9UQUdTIDo9IHRlc3RzCi0KLUxPQ0FMX0NGTEFHUyA6PSAtV2Vycm9yIC1XYWxsCi0KLUxPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCi0KLWluY2x1ZGUgJChCVUlMRF9OQVRJVkVfVEVTVCkKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQuaCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTcyMWVhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudC5oCkBAIC0wLDAgKzEsMTI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisKKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKyNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CisKKyNpbmNsdWRlICJBdWRpb1BvbGljeVRlc3RDbGllbnQuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50IDogcHVibGljIEF1ZGlvUG9saWN5VGVzdENsaWVudCB7CitwdWJsaWM6CisgICAgLy8gQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24KKyAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbG9hZEh3TW9kdWxlKGNvbnN0IGNoYXIqIG5hbWUpIG92ZXJyaWRlIHsKKyAgICAgICAgaWYgKCFtQWxsb3dlZE1vZHVsZU5hbWVzLmVtcHR5KCkgJiYgIW1BbGxvd2VkTW9kdWxlTmFtZXMuY291bnQobmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBBVURJT19NT0RVTEVfSEFORExFX05PTkU7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIG1OZXh0TW9kdWxlSGFuZGxlKys7CisgICAgfQorCisgICAgc3RhdHVzX3Qgb3Blbk91dHB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QgKm91dHB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICogLypjb25maWcqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3JCYXNlPiYgLypkZXZpY2UqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICogLypsYXRlbmN5TXMqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IC8qZmxhZ3MqLykgb3ZlcnJpZGUgeworICAgICAgICBpZiAobW9kdWxlID49IG1OZXh0TW9kdWxlSGFuZGxlKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE1vZHVsZSBoYW5kbGUgJWQgaGFzIG5vdCBiZWVuIGFsbG9jYXRlZCB5ZXQgKG5leHQgaXMgJWQpIiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtb2R1bGUsIG1OZXh0TW9kdWxlSGFuZGxlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgKm91dHB1dCA9IG1OZXh0SW9IYW5kbGUrKzsKKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG9wZW5EdXBsaWNhdGVPdXRwdXQoYXVkaW9faW9faGFuZGxlX3QgLypvdXRwdXQxKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAvKm91dHB1dDIqLykgb3ZlcnJpZGUgeworICAgICAgICBhdWRpb19pb19oYW5kbGVfdCBpZCA9IG1OZXh0SW9IYW5kbGUrKzsKKyAgICAgICAgcmV0dXJuIGlkOworICAgIH0KKworICAgIHN0YXR1c190IG9wZW5JbnB1dChhdWRpb19tb2R1bGVfaGFuZGxlX3QgbW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAqaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2NvbmZpZ190ICogLypjb25maWcqLywKKyAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190ICogLypkZXZpY2UqLywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nOCAmIC8qYWRkcmVzcyovLAorICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19zb3VyY2VfdCAvKnNvdXJjZSovLAorICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IC8qZmxhZ3MqLykgb3ZlcnJpZGUgeworICAgICAgICBpZiAobW9kdWxlID49IG1OZXh0TW9kdWxlSGFuZGxlKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE1vZHVsZSBoYW5kbGUgJWQgaGFzIG5vdCBiZWVuIGFsbG9jYXRlZCB5ZXQgKG5leHQgaXMgJWQpIiwKKyAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtb2R1bGUsIG1OZXh0TW9kdWxlSGFuZGxlKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgKmlucHV0ID0gbU5leHRJb0hhbmRsZSsrOworICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2ggKnBhdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeworICAgICAgICAqaGFuZGxlID0gbU5leHRQYXRjaEhhbmRsZSsrOworICAgICAgICBtQWN0aXZlUGF0Y2hlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoKmhhbmRsZSwgKnBhdGNoKSk7CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZWxlYXNlQXVkaW9QYXRjaChhdWRpb19wYXRjaF9oYW5kbGVfdCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qZGVsYXlNcyovKSBvdmVycmlkZSB7CisgICAgICAgIGlmIChtQWN0aXZlUGF0Y2hlcy5lcmFzZShoYW5kbGUpICE9IDEpIHsKKyAgICAgICAgICAgIGlmIChoYW5kbGUgPj0gbU5leHRQYXRjaEhhbmRsZSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogUGF0Y2ggaGFuZGxlICVkIGhhcyBub3QgYmVlbiBhbGxvY2F0ZWQgeWV0IChuZXh0IGlzICVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGhhbmRsZSwgbU5leHRQYXRjaEhhbmRsZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQXR0ZW1wdCB0byByZWxlYXNlIHBhdGNoICVkIHR3aWNlIiwgX19mdW5jX18sIGhhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOT19FUlJPUjsKKyAgICB9CisKKyAgICB2b2lkIG9uQXVkaW9Qb3J0TGlzdFVwZGF0ZSgpIG92ZXJyaWRlIHsKKyAgICAgICAgKyttQXVkaW9Qb3J0TGlzdFVwZGF0ZUNvdW50OworICAgIH0KKworICAgIC8vIEhlbHBlciBtZXRob2RzIGZvciB0ZXN0cworICAgIHNpemVfdCBnZXRBY3RpdmVQYXRjaGVzQ291bnQoKSBjb25zdCB7IHJldHVybiBtQWN0aXZlUGF0Y2hlcy5zaXplKCk7IH0KKworICAgIGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCAqZ2V0TGFzdEFkZGVkUGF0Y2goKSBjb25zdCB7CisgICAgICAgIGlmIChtQWN0aXZlUGF0Y2hlcy5lbXB0eSgpKSB7CisgICAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgICAgfQorICAgICAgICBhdXRvIGl0ID0gLS1tQWN0aXZlUGF0Y2hlcy5lbmQoKTsKKyAgICAgICAgcmV0dXJuICZpdC0+c2Vjb25kOworICAgIH07CisKKyAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgcGVla05leHRNb2R1bGVIYW5kbGUoKSBjb25zdCB7IHJldHVybiBtTmV4dE1vZHVsZUhhbmRsZTsgfQorCisgICAgdm9pZCBzd2FwQWxsb3dlZE1vZHVsZU5hbWVzKHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiYmIG5hbWVzID0ge30pIHsKKyAgICAgICAgbUFsbG93ZWRNb2R1bGVOYW1lcy5zd2FwKG5hbWVzKTsKKyAgICB9CisKKyAgICBzaXplX3QgZ2V0QXVkaW9Qb3J0TGlzdFVwZGF0ZUNvdW50KCkgY29uc3QgeyByZXR1cm4gbUF1ZGlvUG9ydExpc3RVcGRhdGVDb3VudDsgfQorCitwcml2YXRlOgorICAgIGF1ZGlvX21vZHVsZV9oYW5kbGVfdCBtTmV4dE1vZHVsZUhhbmRsZSA9IEFVRElPX01PRFVMRV9IQU5ETEVfTk9ORSArIDE7CisgICAgYXVkaW9faW9faGFuZGxlX3QgbU5leHRJb0hhbmRsZSA9IEFVRElPX0lPX0hBTkRMRV9OT05FICsgMTsKKyAgICBhdWRpb19wYXRjaF9oYW5kbGVfdCBtTmV4dFBhdGNoSGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkUgKyAxOworICAgIHN0ZDo6bWFwPGF1ZGlvX3BhdGNoX2hhbmRsZV90LCBzdHJ1Y3QgYXVkaW9fcGF0Y2g+IG1BY3RpdmVQYXRjaGVzOworICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiBtQWxsb3dlZE1vZHVsZU5hbWVzOworICAgIHNpemVfdCBtQXVkaW9Qb3J0TGlzdFVwZGF0ZUNvdW50ID0gMDsKK307CisKK30gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdENsaWVudC5oIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgKaW5kZXggZWI4MjIyYy4uYjkyYTJlNiAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgKQEAgLTMxLDggKzMxLDcgQEAKICAgICBzdGF0dXNfdCBvcGVuT3V0cHV0KGF1ZGlvX21vZHVsZV9oYW5kbGVfdCAvKm1vZHVsZSovLAogICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QqIC8qb3V0cHV0Ki8sCiAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCogLypjb25maWcqLywKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCogLypkZXZpY2VzKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKmFkZHJlc3MqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPERldmljZURlc2NyaXB0b3JCYXNlPiYgLypkZXZpY2UqLywKICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiAvKmxhdGVuY3lNcyovLAogICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgLypmbGFncyovKSBvdmVycmlkZSB7IHJldHVybiBOT19JTklUOyB9CiAgICAgYXVkaW9faW9faGFuZGxlX3Qgb3BlbkR1cGxpY2F0ZU91dHB1dChhdWRpb19pb19oYW5kbGVfdCAvKm91dHB1dDEqLywKQEAgLTYwLDkgKzU5LDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qZGVsYXlNcyovKSBvdmVycmlkZSB7IH0KICAgICBTdHJpbmc4IGdldFBhcmFtZXRlcnMoYXVkaW9faW9faGFuZGxlX3QgLyppb0hhbmRsZSovLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKmtleXMqLykgb3ZlcnJpZGUgeyByZXR1cm4gU3RyaW5nOCgpOyB9Ci0gICAgc3RhdHVzX3Qgc3RhcnRUb25lKGF1ZGlvX3BvbGljeV90b25lX3QgLyp0b25lKi8sCi0gICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3N0cmVhbV90eXBlX3QgLypzdHJlYW0qLykgb3ZlcnJpZGUgeyByZXR1cm4gTk9fSU5JVDsgfQotICAgIHN0YXR1c190IHN0b3BUb25lKCkgb3ZlcnJpZGUgeyByZXR1cm4gTk9fSU5JVDsgfQogICAgIHN0YXR1c190IHNldFZvaWNlVm9sdW1lKGZsb2F0IC8qdm9sdW1lKi8sIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeyByZXR1cm4gTk9fSU5JVDsgfQogICAgIHN0YXR1c190IG1vdmVFZmZlY3RzKGF1ZGlvX3Nlc3Npb25fdCAvKnNlc3Npb24qLywKICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19pb19oYW5kbGVfdCAvKnNyY091dHB1dCovLApAQCAtNzYsMTMgKzcyLDIwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgeyByZXR1cm4gTk9fSU5JVDsgfQogICAgIHZvaWQgb25BdWRpb1BvcnRMaXN0VXBkYXRlKCkgb3ZlcnJpZGUgeyB9CiAgICAgdm9pZCBvbkF1ZGlvUGF0Y2hMaXN0VXBkYXRlKCkgb3ZlcnJpZGUgeyB9CisgICAgdm9pZCBvbkF1ZGlvVm9sdW1lR3JvdXBDaGFuZ2VkKHZvbHVtZV9ncm91cF90IC8qZ3JvdXAqLywgaW50IC8qZmxhZ3MqLykgb3ZlcnJpZGUgeyB9CiAgICAgYXVkaW9fdW5pcXVlX2lkX3QgbmV3QXVkaW9VbmlxdWVJZChhdWRpb191bmlxdWVfaWRfdXNlX3QgLyp1c2UqLykgb3ZlcnJpZGUgeyByZXR1cm4gMDsgfQogICAgIHZvaWQgb25EeW5hbWljUG9saWN5TWl4U3RhdGVVcGRhdGUoU3RyaW5nOCAvKnJlZ0lkKi8sIGludDMyX3QgLypzdGF0ZSovKSBvdmVycmlkZSB7IH0KLSAgICB2b2lkIG9uUmVjb3JkaW5nQ29uZmlndXJhdGlvblVwZGF0ZShpbnQgLypldmVudCovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190KiAvKmNsaWVudEluZm8qLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fY29uZmlnX2Jhc2UqIC8qY2xpZW50Q29uZmlnKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IGF1ZGlvX2NvbmZpZ19iYXNlKiAvKmRldmljZUNvbmZpZyovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IC8qcGF0Y2hIYW5kbGUqLykgb3ZlcnJpZGUgeyB9CisgICAgdm9pZCBvblJlY29yZGluZ0NvbmZpZ3VyYXRpb25VcGRhdGUoaW50IGV2ZW50IF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlY29yZF9jbGllbnRfaW5mb190ICpjbGllbnRJbmZvIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmNsaWVudENvbmZpZyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBjbGllbnRFZmZlY3RzIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2NvbmZpZ19iYXNlX3QgKmRldmljZUNvbmZpZyBfX3VudXNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxlZmZlY3RfZGVzY3JpcHRvcl90PiBlZmZlY3RzIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IHBhdGNoSGFuZGxlIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3NvdXJjZV90IHNvdXJjZSBfX3VudXNlZCkgb3ZlcnJpZGUgeyB9CisgICAgdm9pZCBzZXRFZmZlY3RTdXNwZW5kZWQoaW50IGVmZmVjdElkIF9fdW51c2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3Nlc3Npb25fdCBzZXNzaW9uSWQgX191bnVzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdXNwZW5kZWQgX191bnVzZWQpIHt9CiB9OwogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RNYW5hZ2VyLmggYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9BdWRpb1BvbGljeVRlc3RNYW5hZ2VyLmgKaW5kZXggZmU1NDNhNi4uMzY0MGI2ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL0F1ZGlvUG9saWN5VGVzdE1hbmFnZXIuaApAQCAtMjQsNyArMjQsMTEgQEAKICAgICBleHBsaWNpdCBBdWRpb1BvbGljeVRlc3RNYW5hZ2VyKEF1ZGlvUG9saWN5Q2xpZW50SW50ZXJmYWNlICpjbGllbnRJbnRlcmZhY2UpCiAgICAgICAgICAgICA6IEF1ZGlvUG9saWN5TWFuYWdlcihjbGllbnRJbnRlcmZhY2UsIHRydWUgLypmb3JUZXN0aW5nKi8pIHsgfQogICAgIHVzaW5nIEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0Q29uZmlnOworICAgIHVzaW5nIEF1ZGlvUG9saWN5TWFuYWdlcjo6bG9hZENvbmZpZzsKICAgICB1c2luZyBBdWRpb1BvbGljeU1hbmFnZXI6OmluaXRpYWxpemU7CisgICAgdXNpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyOjpnZXRBdmFpbGFibGVPdXRwdXREZXZpY2VzOworICAgIHVzaW5nIEF1ZGlvUG9saWN5TWFuYWdlcjo6Z2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzOworICAgIHVpbnQzMl90IGdldEF1ZGlvUG9ydEdlbmVyYXRpb24oKSBjb25zdCB7IHJldHVybiBtQXVkaW9Qb3J0R2VuZXJhdGlvbjsgfQogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvX2hlYWx0aF90ZXN0cy5jcHAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb19oZWFsdGhfdGVzdHMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1YzY3YTEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb19oZWFsdGhfdGVzdHMuY3BwCkBAIC0wLDAgKzEsNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkF1ZGlvUG9saWN5X0Jvb3RfVGVzdCIKKworI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CisKKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSA8bWVkaWEvQXVkaW9TeXN0ZW0uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vYXVkaW8uaD4KKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgIkF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQuaCIKKyNpbmNsdWRlICJBdWRpb1BvbGljeVRlc3RNYW5hZ2VyLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCitURVNUKEF1ZGlvSGVhbHRoVGVzdCwgQXR0YWNoZWREZXZpY2VGb3VuZCkgeworICAgIHVuc2lnbmVkIGludCBudW1Qb3J0czsKKyAgICB1bnNpZ25lZCBpbnQgZ2VuZXJhdGlvbjE7CisgICAgdW5zaWduZWQgaW50IGdlbmVyYXRpb247CisgICAgc3RydWN0IGF1ZGlvX3BvcnQgKmF1ZGlvUG9ydHMgPSBOVUxMOworICAgIGludCBhdHRlbXB0cyA9IDEwOworICAgIGRvIHsKKyAgICAgICAgaWYgKGF0dGVtcHRzLS0gPCAwKSB7CisgICAgICAgICAgICBmcmVlKGF1ZGlvUG9ydHMpOworICAgICAgICAgICAgR1RFU1RfRkFJTCgpIDw8ICJRdWVyeSBhdWRpbyBwb3J0cyB0aW1lIG91dCI7CisgICAgICAgIH0KKyAgICAgICAgbnVtUG9ydHMgPSAwOworICAgICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIEF1ZGlvU3lzdGVtOjpsaXN0QXVkaW9Qb3J0cygKKyAgICAgICAgICAgICAgICBBVURJT19QT1JUX1JPTEVfTk9ORSwgQVVESU9fUE9SVF9UWVBFX0RFVklDRSwgJm51bVBvcnRzLCBOVUxMLCAmZ2VuZXJhdGlvbjEpKTsKKyAgICAgICAgaWYgKG51bVBvcnRzID09IDApIHsKKyAgICAgICAgICAgIGZyZWUoYXVkaW9Qb3J0cyk7CisgICAgICAgICAgICBHVEVTVF9GQUlMKCkgPDwgIk51bWJlciBvZiBhdWRpbyBwb3J0cyBzaG91bGQgbm90IGJlIHplcm8iOworICAgICAgICB9CisKKyAgICAgICAgYXVkaW9Qb3J0cyA9IChzdHJ1Y3QgYXVkaW9fcG9ydCAqKXJlYWxsb2MoYXVkaW9Qb3J0cywgbnVtUG9ydHMgKiBzaXplb2Yoc3RydWN0IGF1ZGlvX3BvcnQpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gQXVkaW9TeXN0ZW06Omxpc3RBdWRpb1BvcnRzKAorICAgICAgICAgICAgICAgIEFVRElPX1BPUlRfUk9MRV9OT05FLCBBVURJT19QT1JUX1RZUEVfREVWSUNFLCAmbnVtUG9ydHMsIGF1ZGlvUG9ydHMsICZnZW5lcmF0aW9uKTsKKyAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgZnJlZShhdWRpb1BvcnRzKTsKKyAgICAgICAgICAgIEdURVNUX0ZBSUwoKSA8PCAiUXVlcnkgYXVkaW8gcG9ydHMgZmFpbGVkIjsKKyAgICAgICAgfQorICAgIH0gd2hpbGUgKGdlbmVyYXRpb24xICE9IGdlbmVyYXRpb24pOworICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxhdWRpb19kZXZpY2VzX3Q+IGF0dGFjaGVkRGV2aWNlczsKKyAgICBmb3IgKGludCBpID0gMCA7IGkgPCBudW1Qb3J0czsgaSsrKSB7CisgICAgICAgIGF0dGFjaGVkRGV2aWNlcy5pbnNlcnQoYXVkaW9Qb3J0c1tpXS5leHQuZGV2aWNlLnR5cGUpOworICAgIH0KKyAgICBmcmVlKGF1ZGlvUG9ydHMpOworCisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudCBjbGllbnQ7CisgICAgQXVkaW9Qb2xpY3lUZXN0TWFuYWdlciBtYW5hZ2VyKCZjbGllbnQpOworICAgIG1hbmFnZXIubG9hZENvbmZpZygpOworICAgIEFTU0VSVF9ORSgiQXVkaW9Qb2xpY3lDb25maWc6OnNldERlZmF1bHQiLCBtYW5hZ2VyLmdldENvbmZpZygpLmdldFNvdXJjZSgpKTsKKworICAgIGZvciAoYXV0byBkZXNjIDogbWFuYWdlci5nZXRDb25maWcoKS5nZXRJbnB1dERldmljZXMoKSkgeworICAgICAgICBBU1NFUlRfTkUoYXR0YWNoZWREZXZpY2VzLmVuZCgpLCBhdHRhY2hlZERldmljZXMuZmluZChkZXNjLT50eXBlKCkpKTsKKyAgICB9CisgICAgZm9yIChhdXRvIGRlc2MgOiBtYW5hZ2VyLmdldENvbmZpZygpLmdldE91dHB1dERldmljZXMoKSkgeworICAgICAgICBBU1NFUlRfTkUoYXR0YWNoZWREZXZpY2VzLmVuZCgpLCBhdHRhY2hlZERldmljZXMuZmluZChkZXNjLT50eXBlKCkpKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvYXVkaW9wb2xpY3ltYW5hZ2VyX3Rlc3RzLmNwcAppbmRleCBhOTU5M2I4Li4wYmJiODZiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9hdWRpb3BvbGljeW1hbmFnZXJfdGVzdHMuY3BwCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL2F1ZGlvcG9saWN5bWFuYWdlcl90ZXN0cy5jcHAKQEAgLTE1LDE2ICsxNSwzOCBAQAogICovCiAKICNpbmNsdWRlIDxtZW1vcnk+Ci0jaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzeXMvd2FpdC5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgogCiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIAorI2RlZmluZSBMT0dfVEFHICJBUE1fVGVzdCIKKyNpbmNsdWRlIDxTZXJpYWxpemVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2ZpbGUuaD4KKyNpbmNsdWRlIDxtZWRpYS9BdWRpb1BvbGljeS5oPgorI2luY2x1ZGUgPG1lZGlhL1BhdGNoQnVpbGRlci5oPgorI2luY2x1ZGUgPG1lZGlhL1JlY29yZGluZ0FjdGl2aXR5VHJhY2tlci5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgorCisjaW5jbHVkZSAiQXVkaW9Qb2xpY3lJbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50LmgiCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lUZXN0Q2xpZW50LmgiCiAjaW5jbHVkZSAiQXVkaW9Qb2xpY3lUZXN0TWFuYWdlci5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAotVEVTVChBdWRpb1BvbGljeU1hbmFnZXJUZXN0SW5pdCwgRmFpbHVyZSkgeworVEVTVChBdWRpb1BvbGljeU1hbmFnZXJUZXN0SW5pdCwgRW5naW5lRmFpbHVyZSkgeworICAgIEF1ZGlvUG9saWN5VGVzdENsaWVudCBjbGllbnQ7CisgICAgQXVkaW9Qb2xpY3lUZXN0TWFuYWdlciBtYW5hZ2VyKCZjbGllbnQpOworICAgIG1hbmFnZXIuZ2V0Q29uZmlnKCkuc2V0RGVmYXVsdCgpOworICAgIG1hbmFnZXIuZ2V0Q29uZmlnKCkuc2V0RW5naW5lTGlicmFyeU5hbWVTdWZmaXgoIm5vbi1leGlzdGVudCIpOworICAgIEFTU0VSVF9FUShOT19JTklULCBtYW5hZ2VyLmluaXRpYWxpemUoKSk7CisgICAgQVNTRVJUX0VRKE5PX0lOSVQsIG1hbmFnZXIuaW5pdENoZWNrKCkpOworfQorCitURVNUKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RJbml0LCBDbGllbnRGYWlsdXJlKSB7CiAgICAgQXVkaW9Qb2xpY3lUZXN0Q2xpZW50IGNsaWVudDsKICAgICBBdWRpb1BvbGljeVRlc3RNYW5hZ2VyIG1hbmFnZXIoJmNsaWVudCk7CiAgICAgbWFuYWdlci5nZXRDb25maWcoKS5zZXREZWZhdWx0KCk7CkBAIC0zNSw4MSArNTcsNTUgQEAKIH0KIAogCi1jbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50IDogcHVibGljIEF1ZGlvUG9saWN5VGVzdENsaWVudCB7CitjbGFzcyBQYXRjaENvdW50Q2hlY2sgewogICBwdWJsaWM6Ci0gICAgLy8gQXVkaW9Qb2xpY3lDbGllbnRJbnRlcmZhY2UgaW1wbGVtZW50YXRpb24KLSAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbG9hZEh3TW9kdWxlKGNvbnN0IGNoYXIqIC8qbmFtZSovKSBvdmVycmlkZSB7Ci0gICAgICAgIHJldHVybiBtTmV4dE1vZHVsZUhhbmRsZSsrOwotICAgIH0KLQotICAgIHN0YXR1c190IG9wZW5PdXRwdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2lvX2hhbmRsZV90KiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCogLypjb25maWcqLywKLSAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2RldmljZXNfdCogLypkZXZpY2VzKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKmFkZHJlc3MqLywKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiAvKmxhdGVuY3lNcyovLAotICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fb3V0cHV0X2ZsYWdzX3QgLypmbGFncyovKSBvdmVycmlkZSB7Ci0gICAgICAgIGlmIChtb2R1bGUgPj0gbU5leHRNb2R1bGVIYW5kbGUpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogTW9kdWxlIGhhbmRsZSAlZCBoYXMgbm90IGJlZW4gYWxsb2NhdGVkIHlldCAobmV4dCBpcyAlZCkiLAotICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbW9kdWxlLCBtTmV4dE1vZHVsZUhhbmRsZSk7Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIGV4cGxpY2l0IFBhdGNoQ291bnRDaGVjayhBdWRpb1BvbGljeU1hbmFnZXJUZXN0Q2xpZW50ICpjbGllbnQpCisgICAgICAgICAgICA6IG1DbGllbnR7Y2xpZW50fSwKKyAgICAgICAgICAgICAgbUluaXRpYWxDb3VudHttQ2xpZW50LT5nZXRBY3RpdmVQYXRjaGVzQ291bnQoKX0ge30KKyAgICBpbnQgZGVsdGFGcm9tU25hcHNob3QoKSBjb25zdCB7CisgICAgICAgIHNpemVfdCBjdXJyZW50Q291bnQgPSBtQ2xpZW50LT5nZXRBY3RpdmVQYXRjaGVzQ291bnQoKTsKKyAgICAgICAgaWYgKG1Jbml0aWFsQ291bnQgPD0gY3VycmVudENvdW50KSB7CisgICAgICAgICAgICByZXR1cm4gY3VycmVudENvdW50IC0gbUluaXRpYWxDb3VudDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAtKHN0YXRpY19jYXN0PGludD4obUluaXRpYWxDb3VudCAtIGN1cnJlbnRDb3VudCkpOwogICAgICAgICB9Ci0gICAgICAgICpvdXRwdXQgPSBtTmV4dElvSGFuZGxlKys7Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICB9Ci0KLSAgICBzdGF0dXNfdCBvcGVuSW5wdXQoYXVkaW9fbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW9faGFuZGxlX3QqIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19jb25maWdfdCogLypjb25maWcqLywKLSAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fZGV2aWNlc190KiAvKmRldmljZSovLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiAvKmFkZHJlc3MqLywKLSAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fc291cmNlX3QgLypzb3VyY2UqLywKLSAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCAvKmZsYWdzKi8pIG92ZXJyaWRlIHsKLSAgICAgICAgaWYgKG1vZHVsZSA+PSBtTmV4dE1vZHVsZUhhbmRsZSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBNb2R1bGUgaGFuZGxlICVkIGhhcyBub3QgYmVlbiBhbGxvY2F0ZWQgeWV0IChuZXh0IGlzICVkKSIsCi0gICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCBtb2R1bGUsIG1OZXh0TW9kdWxlSGFuZGxlKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0KLSAgICAgICAgKmlucHV0ID0gbU5leHRJb0hhbmRsZSsrOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgY3JlYXRlQXVkaW9QYXRjaChjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2gqIC8qcGF0Y2gqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90KiBoYW5kbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypkZWxheU1zKi8pIG92ZXJyaWRlIHsKLSAgICAgICAgKmhhbmRsZSA9IG1OZXh0UGF0Y2hIYW5kbGUrKzsKLSAgICAgICAgbUFjdGl2ZVBhdGNoZXMuaW5zZXJ0KCpoYW5kbGUpOwotICAgICAgICByZXR1cm4gTk9fRVJST1I7Ci0gICAgfQotCi0gICAgc3RhdHVzX3QgcmVsZWFzZUF1ZGlvUGF0Y2goYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKmRlbGF5TXMqLykgb3ZlcnJpZGUgewotICAgICAgICBpZiAobUFjdGl2ZVBhdGNoZXMuZXJhc2UoaGFuZGxlKSAhPSAxKSB7Ci0gICAgICAgICAgICBpZiAoaGFuZGxlID49IG1OZXh0UGF0Y2hIYW5kbGUpIHsKLSAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFBhdGNoIGhhbmRsZSAlZCBoYXMgbm90IGJlZW4gYWxsb2NhdGVkIHlldCAobmV4dCBpcyAlZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIGhhbmRsZSwgbU5leHRQYXRjaEhhbmRsZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQXR0ZW1wdCB0byByZWxlYXNlIHBhdGNoICVkIHR3aWNlIiwgX19mdW5jX18sIGhhbmRsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBOT19FUlJPUjsKLSAgICB9Ci0KLSAgICAvLyBIZWxwZXIgbWV0aG9kcyBmb3IgdGVzdHMKLSAgICBzaXplX3QgZ2V0QWN0aXZlUGF0Y2hlc0NvdW50KCkgY29uc3QgeyByZXR1cm4gbUFjdGl2ZVBhdGNoZXMuc2l6ZSgpOyB9Ci0KICAgcHJpdmF0ZToKLSAgICBhdWRpb19tb2R1bGVfaGFuZGxlX3QgbU5leHRNb2R1bGVIYW5kbGUgPSBBVURJT19NT0RVTEVfSEFORExFX05PTkUgKyAxOwotICAgIGF1ZGlvX2lvX2hhbmRsZV90IG1OZXh0SW9IYW5kbGUgPSBBVURJT19JT19IQU5ETEVfTk9ORSArIDE7Ci0gICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgbU5leHRQYXRjaEhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FICsgMTsKLSAgICBzdGQ6OnNldDxhdWRpb19wYXRjaF9oYW5kbGVfdD4gbUFjdGl2ZVBhdGNoZXM7CisgICAgY29uc3QgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdENsaWVudCAqbUNsaWVudDsKKyAgICBjb25zdCBzaXplX3QgbUluaXRpYWxDb3VudDsKIH07CiAKIGNsYXNzIEF1ZGlvUG9saWN5TWFuYWdlclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CiAgIHByb3RlY3RlZDoKLSAgICB2aXJ0dWFsIHZvaWQgU2V0VXAoKTsKLSAgICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKTsKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgdm9pZCBTZXRVcE1hbmFnZXJDb25maWcoKTsKKworICAgIHZvaWQgZHVtcFRvTG9nKCk7CisgICAgLy8gV2hlbiBleHBsaWNpdGx5IHJvdXRpbmcgaXMgbmVlZGVkLCBzZWxlY3RlZERldmljZUlkIG5lZWQgdG8gYmUgc2V0IGFzIHRoZSB3YW50ZWQgcG9ydAorICAgIC8vIGlkLiBPdGhlcndpc2UsIHNlbGVjdGVkRGV2aWNlSWQgbmVlZCB0byBiZSBpbml0aWFsaXplZCBhcyBBVURJT19QT1JUX0hBTkRMRV9OT05FLgorICAgIHZvaWQgZ2V0T3V0cHV0Rm9yQXR0cigKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICBhdWRpb19mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICBpbnQgY2hhbm5lbE1hc2ssCisgICAgICAgICAgICBpbnQgc2FtcGxlUmF0ZSwKKyAgICAgICAgICAgIGF1ZGlvX291dHB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fT1VUUFVUX0ZMQUdfTk9ORSwKKyAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnBvcnRJZCA9IG51bGxwdHIsCisgICAgICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0ciA9IHt9KTsKKyAgICB2b2lkIGdldElucHV0Rm9yQXR0cigKKyAgICAgICAgICAgIGNvbnN0IGF1ZGlvX2F0dHJpYnV0ZXNfdCAmYXR0ciwKKyAgICAgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IHJpaWQsCisgICAgICAgICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICpzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICAgICAgaW50IGNoYW5uZWxNYXNrLAorICAgICAgICAgICAgaW50IHNhbXBsZVJhdGUsCisgICAgICAgICAgICBhdWRpb19pbnB1dF9mbGFnc190IGZsYWdzID0gQVVESU9fSU5QVVRfRkxBR19OT05FLAorICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkID0gbnVsbHB0cik7CisgICAgUGF0Y2hDb3VudENoZWNrIHNuYXBzaG90UGF0Y2hDb3VudCgpIHsgcmV0dXJuIFBhdGNoQ291bnRDaGVjayhtQ2xpZW50LmdldCgpKTsgfQorCisgICAgYm9vbCBmaW5kRGV2aWNlUG9ydChhdWRpb19wb3J0X3JvbGVfdCByb2xlLCBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZhZGRyZXNzLCBhdWRpb19wb3J0ICZmb3VuZFBvcnQpOworICAgIHN0YXRpYyBhdWRpb19wb3J0X2hhbmRsZV90IGdldERldmljZUlkRnJvbVBhdGNoKGNvbnN0IHN0cnVjdCBhdWRpb19wYXRjaCogcGF0Y2gpOwogCiAgICAgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQ+IG1DbGllbnQ7CiAgICAgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvUG9saWN5VGVzdE1hbmFnZXI+IG1NYW5hZ2VyOwpAQCAtMTE4LDcgKzExNCw3IEBACiB2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3Q6OlNldFVwKCkgewogICAgIG1DbGllbnQucmVzZXQobmV3IEF1ZGlvUG9saWN5TWFuYWdlclRlc3RDbGllbnQpOwogICAgIG1NYW5hZ2VyLnJlc2V0KG5ldyBBdWRpb1BvbGljeVRlc3RNYW5hZ2VyKG1DbGllbnQuZ2V0KCkpKTsKLSAgICBtTWFuYWdlci0+Z2V0Q29uZmlnKCkuc2V0RGVmYXVsdCgpOworICAgIFNldFVwTWFuYWdlckNvbmZpZygpOyAgLy8gU3ViY2xhc3NlcyBtYXkgd2FudCB0byBjdXN0b21pemUgdGhlIGNvbmZpZy4KICAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5pbml0aWFsaXplKCkpOwogICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmluaXRDaGVjaygpKTsKIH0KQEAgLTEyOCwxNCArMTI0LDE0MyBAQAogICAgIG1DbGllbnQucmVzZXQoKTsKIH0KIAordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpTZXRVcE1hbmFnZXJDb25maWcoKSB7CisgICAgbU1hbmFnZXItPmdldENvbmZpZygpLnNldERlZmF1bHQoKTsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpkdW1wVG9Mb2coKSB7CisgICAgaW50IHBpcGVmZFsyXTsKKyAgICBBU1NFUlRfTkUoLTEsIHBpcGUocGlwZWZkKSk7CisgICAgcGlkX3QgY3BpZCA9IGZvcmsoKTsKKyAgICBBU1NFUlRfTkUoLTEsIGNwaWQpOworICAgIGlmIChjcGlkID09IDApIHsKKyAgICAgICAgLy8gQ2hpbGQgcHJvY2VzcyByZWFkcyBmcm9tIHRoZSBwaXBlIGFuZCBsb2dzLgorICAgICAgICBjbG9zZShwaXBlZmRbMV0pOworICAgICAgICBzdGQ6OnN0cmluZyBsaW5lOworICAgICAgICBjaGFyIGJ1ZjsKKyAgICAgICAgd2hpbGUgKHJlYWQocGlwZWZkWzBdLCAmYnVmLCBzaXplb2YoYnVmKSkgPiAwKSB7CisgICAgICAgICAgICBpZiAoYnVmICE9ICdcbicpIHsKKyAgICAgICAgICAgICAgICBsaW5lICs9IGJ1ZjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0koIiVzIiwgbGluZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBsaW5lID0gIiI7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFsaW5lLmVtcHR5KCkpIEFMT0dJKCIlcyIsIGxpbmUuY19zdHIoKSk7CisgICAgICAgIGNsb3NlKHBpcGVmZFswXSk7CisgICAgICAgIF9leGl0KEVYSVRfU1VDQ0VTUyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gUGFyZW50IGRvZXMgdGhlIGR1bXAgYW5kIGNoZWNrcyB0aGUgc3RhdHVzIGNvZGUuCisgICAgICAgIGNsb3NlKHBpcGVmZFswXSk7CisgICAgICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPmR1bXAocGlwZWZkWzFdKSk7CisgICAgICAgIGNsb3NlKHBpcGVmZFsxXSk7CisgICAgICAgIHdhaXQoTlVMTCk7ICAvLyBXYWl0IGZvciB0aGUgY2hpbGQgdG8gZXhpdC4KKyAgICB9Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6Z2V0T3V0cHV0Rm9yQXR0cigKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgYXVkaW9fZm9ybWF0X3QgZm9ybWF0LAorICAgICAgICBpbnQgY2hhbm5lbE1hc2ssCisgICAgICAgIGludCBzYW1wbGVSYXRlLAorICAgICAgICBhdWRpb19vdXRwdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkLAorICAgICAgICBhdWRpb19hdHRyaWJ1dGVzX3QgYXR0cikgeworICAgIGF1ZGlvX2lvX2hhbmRsZV90IG91dHB1dCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgYXVkaW9fc3RyZWFtX3R5cGVfdCBzdHJlYW0gPSBBVURJT19TVFJFQU1fREVGQVVMVDsKKyAgICBhdWRpb19jb25maWdfdCBjb25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gc2FtcGxlUmF0ZTsKKyAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CisgICAgY29uZmlnLmZvcm1hdCA9IGZvcm1hdDsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGxvY2FsUG9ydElkOworICAgIGlmICghcG9ydElkKSBwb3J0SWQgPSAmbG9jYWxQb3J0SWQ7CisgICAgKnBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgQVNTRVJUX0VRKE9LLCBtTWFuYWdlci0+Z2V0T3V0cHV0Rm9yQXR0cigKKyAgICAgICAgICAgICAgICAgICAgJmF0dHIsICZvdXRwdXQsIEFVRElPX1NFU1NJT05fTk9ORSwgJnN0cmVhbSwgMCAvKnVpZCovLCAmY29uZmlnLCAmZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkRGV2aWNlSWQsIHBvcnRJZCwge30pKTsKKyAgICBBU1NFUlRfTkUoQVVESU9fUE9SVF9IQU5ETEVfTk9ORSwgKnBvcnRJZCk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdDo6Z2V0SW5wdXRGb3JBdHRyKAorICAgICAgICBjb25zdCBhdWRpb19hdHRyaWJ1dGVzX3QgJmF0dHIsCisgICAgICAgIGF1ZGlvX3VuaXF1ZV9pZF90IHJpaWQsCisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgIGF1ZGlvX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgaW50IGNoYW5uZWxNYXNrLAorICAgICAgICBpbnQgc2FtcGxlUmF0ZSwKKyAgICAgICAgYXVkaW9faW5wdXRfZmxhZ3NfdCBmbGFncywKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqcG9ydElkKSB7CisgICAgYXVkaW9faW9faGFuZGxlX3QgaW5wdXQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnID0gQVVESU9fQ09ORklHX0JBU0VfSU5JVElBTElaRVI7CisgICAgY29uZmlnLnNhbXBsZV9yYXRlID0gc2FtcGxlUmF0ZTsKKyAgICBjb25maWcuY2hhbm5lbF9tYXNrID0gY2hhbm5lbE1hc2s7CisgICAgY29uZmlnLmZvcm1hdCA9IGZvcm1hdDsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IGxvY2FsUG9ydElkOworICAgIGlmICghcG9ydElkKSBwb3J0SWQgPSAmbG9jYWxQb3J0SWQ7CisgICAgKnBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgQXVkaW9Qb2xpY3lJbnRlcmZhY2U6OmlucHV0X3R5cGVfdCBpbnB1dFR5cGU7CisgICAgQVNTRVJUX0VRKE9LLCBtTWFuYWdlci0+Z2V0SW5wdXRGb3JBdHRyKAorICAgICAgICAgICAgJmF0dHIsICZpbnB1dCwgcmlpZCwgQVVESU9fU0VTU0lPTl9OT05FLCAwIC8qdWlkKi8sICZjb25maWcsIGZsYWdzLAorICAgICAgICAgICAgc2VsZWN0ZWREZXZpY2VJZCwgJmlucHV0VHlwZSwgcG9ydElkKSk7CisgICAgQVNTRVJUX05FKEFVRElPX1BPUlRfSEFORExFX05PTkUsICpwb3J0SWQpOworfQorCitib29sIEF1ZGlvUG9saWN5TWFuYWdlclRlc3Q6OmZpbmREZXZpY2VQb3J0KGF1ZGlvX3BvcnRfcm9sZV90IHJvbGUsCisgICAgICAgIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmYWRkcmVzcywgYXVkaW9fcG9ydCAmZm91bmRQb3J0KSB7CisgICAgdWludDMyX3QgbnVtUG9ydHMgPSAwOworICAgIHVpbnQzMl90IGdlbmVyYXRpb24xOworICAgIHN0YXR1c190IHJldDsKKworICAgIHJldCA9IG1NYW5hZ2VyLT5saXN0QXVkaW9Qb3J0cyhyb2xlLCBBVURJT19QT1JUX1RZUEVfREVWSUNFLCAmbnVtUG9ydHMsIG51bGxwdHIsICZnZW5lcmF0aW9uMSk7CisgICAgRVhQRUNUX0VRKE5PX0VSUk9SLCByZXQpIDw8ICJtTWFuYWdlci0+bGlzdEF1ZGlvUG9ydHMgcmV0dXJuZWQgZXJyb3IiOworICAgIGlmIChIYXNGYWlsdXJlKCkpIHJldHVybiBmYWxzZTsKKworICAgIHVpbnQzMl90IGdlbmVyYXRpb24yOworICAgIHN0cnVjdCBhdWRpb19wb3J0IHBvcnRzW251bVBvcnRzXTsKKyAgICByZXQgPSBtTWFuYWdlci0+bGlzdEF1ZGlvUG9ydHMocm9sZSwgQVVESU9fUE9SVF9UWVBFX0RFVklDRSwgJm51bVBvcnRzLCBwb3J0cywgJmdlbmVyYXRpb24yKTsKKyAgICBFWFBFQ1RfRVEoTk9fRVJST1IsIHJldCkgPDwgIm1NYW5hZ2VyLT5saXN0QXVkaW9Qb3J0cyByZXR1cm5lZCBlcnJvciI7CisgICAgRVhQRUNUX0VRKGdlbmVyYXRpb24xLCBnZW5lcmF0aW9uMikgPDwgIkdlbmVyYXRpb25zIGNoYW5nZWQgZHVyaW5nIHBvcnRzIHJldHJpZXZhbCI7CisgICAgaWYgKEhhc0ZhaWx1cmUoKSkgcmV0dXJuIGZhbHNlOworCisgICAgZm9yIChjb25zdCBhdXRvICZwb3J0IDogcG9ydHMpIHsKKyAgICAgICAgaWYgKHBvcnQucm9sZSA9PSByb2xlICYmIHBvcnQuZXh0LmRldmljZS50eXBlID09IGRldmljZVR5cGUgJiYKKyAgICAgICAgICAgICAgICAoc3RybmNtcChwb3J0LmV4dC5kZXZpY2UuYWRkcmVzcywgYWRkcmVzcy5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX0RFVklDRV9NQVhfQUREUkVTU19MRU4pID09IDApKSB7CisgICAgICAgICAgICBmb3VuZFBvcnQgPSBwb3J0OworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCithdWRpb19wb3J0X2hhbmRsZV90IEF1ZGlvUG9saWN5TWFuYWdlclRlc3Q6OmdldERldmljZUlkRnJvbVBhdGNoKAorICAgICAgICBjb25zdCBzdHJ1Y3QgYXVkaW9fcGF0Y2gqIHBhdGNoKSB7CisgICAgLy8gVGhlIGxvZ2ljIGhlcmUgaXMgdGhlIHNhbWUgYXMgdGhlIG9uZSBpbiBBdWRpb0lvRGVzY3JpcHRvci4KKyAgICAvLyBOb3RlIHRoaXMgZnVuY3Rpb24gaXMgYWltIHRvIGdldCByb3V0ZWQgZGV2aWNlIGlkIGZvciB0ZXN0LgorICAgIC8vIEluIHRoYXQgY2FzZSwgZGV2aWNlIHRvIGRldmljZSBwYXRjaCBpcyBub3QgZXhwZWN0ZWQgaGVyZS4KKyAgICBpZiAocGF0Y2gtPm51bV9zb3VyY2VzICE9IDAgJiYgcGF0Y2gtPm51bV9zaW5rcyAhPSAwKSB7CisgICAgICAgIGlmIChwYXRjaC0+c291cmNlc1swXS50eXBlID09IEFVRElPX1BPUlRfVFlQRV9NSVgpIHsKKyAgICAgICAgICAgIHJldHVybiBwYXRjaC0+c2lua3NbMF0uaWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gcGF0Y2gtPnNvdXJjZXNbMF0uaWQ7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEFVRElPX1BPUlRfSEFORExFX05PTkU7Cit9CisKKwogVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3QsIEluaXRTdWNjZXNzKSB7CiAgICAgLy8gU2V0VXAgbXVzdCBmaW5pc2ggd2l0aCBubyBhc3NlcnRpb25zLgogfQogCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCwgRHVtcCkgeworICAgIGR1bXBUb0xvZygpOworfQorCiBURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdCwgQ3JlYXRlQXVkaW9QYXRjaEZhaWx1cmUpIHsKICAgICBhdWRpb19wYXRjaCBwYXRjaHt9OwogICAgIGF1ZGlvX3BhdGNoX2hhbmRsZV90IGhhbmRsZSA9IEFVRElPX1BBVENIX0hBTkRMRV9OT05FOwotICAgIGNvbnN0IHNpemVfdCBwYXRjaENvdW50QmVmb3JlID0gbUNsaWVudC0+Z2V0QWN0aXZlUGF0Y2hlc0NvdW50KCk7CisgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKICAgICBBU1NFUlRfRVEoQkFEX1ZBTFVFLCBtTWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaChudWxscHRyLCAmaGFuZGxlLCAwKSk7CiAgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCBudWxscHRyLCAwKSk7CiAgICAgQVNTRVJUX0VRKEJBRF9WQUxVRSwgbU1hbmFnZXItPmNyZWF0ZUF1ZGlvUGF0Y2goJnBhdGNoLCAmaGFuZGxlLCAwKSk7CkBAIC0xNjIsMzUgKzI4Nyw4MjggQEAKICAgICBBU1NFUlRfRVEoSU5WQUxJRF9PUEVSQVRJT04sIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKCZwYXRjaCwgJmhhbmRsZSwgMCkpOwogICAgIC8vIFZlcmlmeSB0aGF0IHRoZSBoYW5kbGUgaXMgbGVmdCB1bmNoYW5nZWQuCiAgICAgQVNTRVJUX0VRKEFVRElPX1BBVENIX0hBTkRMRV9OT05FLCBoYW5kbGUpOwotICAgIEFTU0VSVF9FUShwYXRjaENvdW50QmVmb3JlLCBtQ2xpZW50LT5nZXRBY3RpdmVQYXRjaGVzQ291bnQoKSk7CisgICAgQVNTRVJUX0VRKDAsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CiB9CiAKIFRFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0LCBDcmVhdGVBdWRpb1BhdGNoRnJvbU1peCkgewotICAgIGF1ZGlvX3BhdGNoIHBhdGNoe307CiAgICAgYXVkaW9fcGF0Y2hfaGFuZGxlX3QgaGFuZGxlID0gQVVESU9fUEFUQ0hfSEFORExFX05PTkU7CiAgICAgdWlkX3QgdWlkID0gNDI7Ci0gICAgY29uc3Qgc2l6ZV90IHBhdGNoQ291bnRCZWZvcmUgPSBtQ2xpZW50LT5nZXRBY3RpdmVQYXRjaGVzQ291bnQoKTsKLSAgICBwYXRjaC5udW1fc291cmNlcyA9IDE7Ci0gICAgewotICAgICAgICBhdXRvJiBzcmMgPSBwYXRjaC5zb3VyY2VzWzBdOwotICAgICAgICBzcmMucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7Ci0gICAgICAgIHNyYy50eXBlID0gQVVESU9fUE9SVF9UWVBFX01JWDsKLSAgICAgICAgc3JjLmlkID0gbU1hbmFnZXItPmdldENvbmZpZygpLmdldEF2YWlsYWJsZUlucHV0RGV2aWNlcygpWzBdLT5nZXRJZCgpOwotICAgICAgICAvLyBOb3RlOiB0aGVzZSBhcmUgdGhlIHBhcmFtZXRlcnMgb2YgdGhlIG91dHB1dCBkZXZpY2UuCi0gICAgICAgIHNyYy5zYW1wbGVfcmF0ZSA9IDQ0MTAwOwotICAgICAgICBzcmMuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7Ci0gICAgICAgIHNyYy5jaGFubmVsX21hc2sgPSBBVURJT19DSEFOTkVMX09VVF9TVEVSRU87Ci0gICAgfQotICAgIHBhdGNoLm51bV9zaW5rcyA9IDE7Ci0gICAgewotICAgICAgICBhdXRvJiBzaW5rID0gcGF0Y2guc2lua3NbMF07Ci0gICAgICAgIHNpbmsucm9sZSA9IEFVRElPX1BPUlRfUk9MRV9TSU5LOwotICAgICAgICBzaW5rLnR5cGUgPSBBVURJT19QT1JUX1RZUEVfREVWSUNFOwotICAgICAgICBzaW5rLmlkID0gbU1hbmFnZXItPmdldENvbmZpZygpLmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+Z2V0SWQoKTsKLSAgICB9Ci0gICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+Y3JlYXRlQXVkaW9QYXRjaCgmcGF0Y2gsICZoYW5kbGUsIHVpZCkpOworICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CisgICAgQVNTRVJUX0ZBTFNFKG1NYW5hZ2VyLT5nZXRBdmFpbGFibGVJbnB1dERldmljZXMoKS5pc0VtcHR5KCkpOworICAgIFBhdGNoQnVpbGRlciBwYXRjaEJ1aWxkZXI7CisgICAgcGF0Y2hCdWlsZGVyLmFkZFNvdXJjZShtTWFuYWdlci0+Z2V0QXZhaWxhYmxlSW5wdXREZXZpY2VzKClbMF0pLgorICAgICAgICAgICAgYWRkU2luayhtTWFuYWdlci0+Z2V0Q29uZmlnKCkuZ2V0RGVmYXVsdE91dHB1dERldmljZSgpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5jcmVhdGVBdWRpb1BhdGNoKHBhdGNoQnVpbGRlci5wYXRjaCgpLCAmaGFuZGxlLCB1aWQpKTsKICAgICBBU1NFUlRfTkUoQVVESU9fUEFUQ0hfSEFORExFX05PTkUsIGhhbmRsZSk7Ci0gICAgQVNTRVJUX0VRKHBhdGNoQ291bnRCZWZvcmUgKyAxLCBtQ2xpZW50LT5nZXRBY3RpdmVQYXRjaGVzQ291bnQoKSk7CisgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CiB9CiAKIC8vIFRPRE86IEFkZCBwYXRjaCBjcmVhdGlvbiB0ZXN0cyB0aGF0IGludm9sdmUgYWxyZWFkeSBleGlzdGluZyBwYXRjaAorCitjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlclRlc3QgeworICBwcm90ZWN0ZWQ6CisgICAgdm9pZCBTZXRVcE1hbmFnZXJDb25maWcoKSBvdmVycmlkZTsKKyAgICB2b2lkIFRlYXJEb3duKCkgb3ZlcnJpZGU7CisKKyAgICBzcDxEZXZpY2VEZXNjcmlwdG9yPiBtTXNkT3V0cHV0RGV2aWNlOworICAgIHNwPERldmljZURlc2NyaXB0b3I+IG1Nc2RJbnB1dERldmljZTsKK307CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZDo6U2V0VXBNYW5hZ2VyQ29uZmlnKCkgeworICAgIC8vIFRPRE86IENvbnNpZGVyIHVzaW5nIFNlcmlhbGl6ZXIgdG8gbG9hZCBwYXJ0IG9mIHRoZSBjb25maWcgZnJvbSBhIHN0cmluZy4KKyAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpTZXRVcE1hbmFnZXJDb25maWcoKTsKKyAgICBBdWRpb1BvbGljeUNvbmZpZyYgY29uZmlnID0gbU1hbmFnZXItPmdldENvbmZpZygpOworICAgIG1Nc2RPdXRwdXREZXZpY2UgPSBuZXcgRGV2aWNlRGVzY3JpcHRvcihBVURJT19ERVZJQ0VfT1VUX0JVUyk7CisgICAgc3A8QXVkaW9Qcm9maWxlPiBwY21PdXRwdXRQcm9maWxlID0gbmV3IEF1ZGlvUHJvZmlsZSgKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9QQ01fMTZfQklULCBBVURJT19DSEFOTkVMX09VVF9TVEVSRU8sIDQ4MDAwKTsKKyAgICBzcDxBdWRpb1Byb2ZpbGU+IGFjM091dHB1dFByb2ZpbGUgPSBuZXcgQXVkaW9Qcm9maWxlKAorICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDApOworICAgIG1Nc2RPdXRwdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShwY21PdXRwdXRQcm9maWxlKTsKKyAgICBtTXNkT3V0cHV0RGV2aWNlLT5hZGRBdWRpb1Byb2ZpbGUoYWMzT3V0cHV0UHJvZmlsZSk7CisgICAgbU1zZElucHV0RGV2aWNlID0gbmV3IERldmljZURlc2NyaXB0b3IoQVVESU9fREVWSUNFX0lOX0JVUyk7CisgICAgLy8gTWF0Y2ggb3V0cHV0IHByb2ZpbGUgZnJvbSBBdWRpb1BvbGljeUNvbmZpZzo6c2V0RGVmYXVsdC4KKyAgICBzcDxBdWRpb1Byb2ZpbGU+IHBjbUlucHV0UHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoCisgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8sIDQ0MTAwKTsKKyAgICBtTXNkSW5wdXREZXZpY2UtPmFkZEF1ZGlvUHJvZmlsZShwY21JbnB1dFByb2ZpbGUpOworICAgIGNvbmZpZy5hZGREZXZpY2UobU1zZE91dHB1dERldmljZSk7CisgICAgY29uZmlnLmFkZERldmljZShtTXNkSW5wdXREZXZpY2UpOworCisgICAgc3A8SHdNb2R1bGU+IG1zZE1vZHVsZSA9IG5ldyBId01vZHVsZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfTVNELCAyIC8qaGFsVmVyc2lvbk1ham9yKi8pOworICAgIEh3TW9kdWxlQ29sbGVjdGlvbiBtb2R1bGVzID0gY29uZmlnLmdldEh3TW9kdWxlcygpOworICAgIG1vZHVsZXMuYWRkKG1zZE1vZHVsZSk7CisgICAgY29uZmlnLnNldEh3TW9kdWxlcyhtb2R1bGVzKTsKKworICAgIHNwPE91dHB1dFByb2ZpbGU+IG1zZE91dHB1dFByb2ZpbGUgPSBuZXcgT3V0cHV0UHJvZmlsZSgibXNkIGlucHV0Iik7CisgICAgbXNkT3V0cHV0UHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKHBjbU91dHB1dFByb2ZpbGUpOworICAgIG1zZE91dHB1dFByb2ZpbGUtPmFkZFN1cHBvcnRlZERldmljZShtTXNkT3V0cHV0RGV2aWNlKTsKKyAgICBtc2RNb2R1bGUtPmFkZE91dHB1dFByb2ZpbGUobXNkT3V0cHV0UHJvZmlsZSk7CisgICAgc3A8T3V0cHV0UHJvZmlsZT4gbXNkQ29tcHJlc3NlZE91dHB1dFByb2ZpbGUgPSBuZXcgT3V0cHV0UHJvZmlsZSgibXNkIGNvbXByZXNzZWQgaW5wdXQiKTsKKyAgICBtc2RDb21wcmVzc2VkT3V0cHV0UHJvZmlsZS0+YWRkQXVkaW9Qcm9maWxlKGFjM091dHB1dFByb2ZpbGUpOworICAgIG1zZENvbXByZXNzZWRPdXRwdXRQcm9maWxlLT5zZXRGbGFncygKKyAgICAgICAgICAgIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCB8IEFVRElPX09VVFBVVF9GTEFHX0NPTVBSRVNTX09GRkxPQUQgfAorICAgICAgICAgICAgQVVESU9fT1VUUFVUX0ZMQUdfTk9OX0JMT0NLSU5HKTsKKyAgICBtc2RDb21wcmVzc2VkT3V0cHV0UHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKG1Nc2RPdXRwdXREZXZpY2UpOworICAgIG1zZE1vZHVsZS0+YWRkT3V0cHV0UHJvZmlsZShtc2RDb21wcmVzc2VkT3V0cHV0UHJvZmlsZSk7CisKKyAgICBzcDxJbnB1dFByb2ZpbGU+IG1zZElucHV0UHJvZmlsZSA9IG5ldyBJbnB1dFByb2ZpbGUoIm1zZCBvdXRwdXQiKTsKKyAgICBtc2RJbnB1dFByb2ZpbGUtPmFkZEF1ZGlvUHJvZmlsZShwY21JbnB1dFByb2ZpbGUpOworICAgIG1zZElucHV0UHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKG1Nc2RJbnB1dERldmljZSk7CisgICAgbXNkTW9kdWxlLT5hZGRJbnB1dFByb2ZpbGUobXNkSW5wdXRQcm9maWxlKTsKKworICAgIC8vIEFkZCBhIHByb2ZpbGUgd2l0aCBhbm90aGVyIGVuY29kaW5nIHRvIHRoZSBkZWZhdWx0IGRldmljZSB0byB0ZXN0IHJvdXRpbmcKKyAgICAvLyBvZiBzdHJlYW1zIHRoYXQgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgTVNELgorICAgIHNwPEF1ZGlvUHJvZmlsZT4gZHRzT3V0cHV0UHJvZmlsZSA9IG5ldyBBdWRpb1Byb2ZpbGUoCisgICAgICAgICAgICBBVURJT19GT1JNQVRfRFRTLCBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCA0ODAwMCk7CisgICAgY29uZmlnLmdldERlZmF1bHRPdXRwdXREZXZpY2UoKS0+YWRkQXVkaW9Qcm9maWxlKGR0c091dHB1dFByb2ZpbGUpOworICAgIHNwPE91dHB1dFByb2ZpbGU+IHByaW1hcnlFbmNvZGVkT3V0cHV0UHJvZmlsZSA9IG5ldyBPdXRwdXRQcm9maWxlKCJlbmNvZGVkIik7CisgICAgcHJpbWFyeUVuY29kZWRPdXRwdXRQcm9maWxlLT5hZGRBdWRpb1Byb2ZpbGUoZHRzT3V0cHV0UHJvZmlsZSk7CisgICAgcHJpbWFyeUVuY29kZWRPdXRwdXRQcm9maWxlLT5zZXRGbGFncyhBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIHByaW1hcnlFbmNvZGVkT3V0cHV0UHJvZmlsZS0+YWRkU3VwcG9ydGVkRGV2aWNlKGNvbmZpZy5nZXREZWZhdWx0T3V0cHV0RGV2aWNlKCkpOworICAgIGNvbmZpZy5nZXRId01vZHVsZXMoKS5nZXRNb2R1bGVGcm9tTmFtZShBVURJT19IQVJEV0FSRV9NT0RVTEVfSURfUFJJTUFSWSktPgorICAgICAgICAgICAgYWRkT3V0cHV0UHJvZmlsZShwcmltYXJ5RW5jb2RlZE91dHB1dFByb2ZpbGUpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2Q6OlRlYXJEb3duKCkgeworICAgIG1Nc2RPdXRwdXREZXZpY2UuY2xlYXIoKTsKKyAgICBtTXNkSW5wdXREZXZpY2UuY2xlYXIoKTsKKyAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0OjpUZWFyRG93bigpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgSW5pdFN1Y2Nlc3MpIHsKKyAgICBBU1NFUlRfVFJVRShtTXNkT3V0cHV0RGV2aWNlKTsKKyAgICBBU1NFUlRfVFJVRShtTXNkSW5wdXREZXZpY2UpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgRHVtcCkgeworICAgIGR1bXBUb0xvZygpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgUGF0Y2hDcmVhdGlvbk9uU2V0Rm9yY2VVc2UpIHsKKyAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOworICAgIG1NYW5hZ2VyLT5zZXRGb3JjZVVzZShBVURJT19QT0xJQ1lfRk9SQ0VfRk9SX0VOQ09ERURfU1VSUk9VTkQsCisgICAgICAgICAgICBBVURJT19QT0xJQ1lfRk9SQ0VfRU5DT0RFRF9TVVJST1VORF9BTFdBWVMpOworICAgIEFTU0VSVF9FUSgxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgR2V0T3V0cHV0Rm9yQXR0ckVuY29kZWRSb3V0ZXNUb01zZCkgeworICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgQVNTRVJUX0VRKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgIEFTU0VSVF9FUSgxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgR2V0T3V0cHV0Rm9yQXR0clBjbVJvdXRlc1RvTXNkKSB7CisgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLCA0ODAwMCk7CisgICAgQVNTRVJUX0VRKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgIEFTU0VSVF9FUSgxLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdE1zZCwgR2V0T3V0cHV0Rm9yQXR0ckVuY29kZWRQbHVzUGNtUm91dGVzVG9Nc2QpIHsKKyAgICBjb25zdCBQYXRjaENvdW50Q2hlY2sgcGF0Y2hDb3VudCA9IHNuYXBzaG90UGF0Y2hDb3VudCgpOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgZ2V0T3V0cHV0Rm9yQXR0cigmc2VsZWN0ZWREZXZpY2VJZCwKKyAgICAgICAgICAgIEFVRElPX0ZPUk1BVF9BQzMsIEFVRElPX0NIQU5ORUxfT1VUXzVQT0lOVDEsIDQ4MDAwLCBBVURJT19PVVRQVVRfRkxBR19ESVJFQ1QpOworICAgIEFTU0VSVF9FUShzZWxlY3RlZERldmljZUlkLCBtTXNkT3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKKyAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLAorICAgICAgICAgICAgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsIEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTywgNDgwMDApOworICAgIEFTU0VSVF9FUShzZWxlY3RlZERldmljZUlkLCBtTXNkT3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKKyAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RNc2QsIEdldE91dHB1dEZvckF0dHJVbnN1cHBvcnRlZEZvcm1hdEJ5cGFzc2VzTXNkKSB7CisgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHNlbGVjdGVkRGV2aWNlSWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICBBVURJT19GT1JNQVRfRFRTLCBBVURJT19DSEFOTkVMX09VVF81UE9JTlQxLCA0ODAwMCwgQVVESU9fT1VUUFVUX0ZMQUdfRElSRUNUKTsKKyAgICBBU1NFUlRfTkUoc2VsZWN0ZWREZXZpY2VJZCwgbU1zZE91dHB1dERldmljZS0+Z2V0SWQoKSk7CisgICAgQVNTRVJUX0VRKDAsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0TXNkLCBHZXRPdXRwdXRGb3JBdHRyRm9ybWF0U3dpdGNoaW5nKSB7CisgICAgLy8gU3dpdGNoIGJldHdlZW4gZm9ybWF0cyB0aGF0IGFyZSBzdXBwb3J0ZWQgYW5kIG5vdCBzdXBwb3J0ZWQgYnkgTVNELgorICAgIHsKKyAgICAgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQ7CisgICAgICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCwKKyAgICAgICAgICAgICAgICAmcG9ydElkKTsKKyAgICAgICAgQVNTRVJUX0VRKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgICAgICBBU1NFUlRfRVEoMSwgcGF0Y2hDb3VudC5kZWx0YUZyb21TbmFwc2hvdCgpKTsKKyAgICAgICAgbU1hbmFnZXItPnJlbGVhc2VPdXRwdXQocG9ydElkKTsKKyAgICAgICAgQVNTRVJUX0VRKDEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CisgICAgfQorICAgIHsKKyAgICAgICAgY29uc3QgUGF0Y2hDb3VudENoZWNrIHBhdGNoQ291bnQgPSBzbmFwc2hvdFBhdGNoQ291bnQoKTsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBzZWxlY3RlZERldmljZUlkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQ7CisgICAgICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0RUUywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCwKKyAgICAgICAgICAgICAgICAmcG9ydElkKTsKKyAgICAgICAgQVNTRVJUX05FKHNlbGVjdGVkRGV2aWNlSWQsIG1Nc2RPdXRwdXREZXZpY2UtPmdldElkKCkpOworICAgICAgICBBU1NFUlRfRVEoLTEsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CisgICAgICAgIG1NYW5hZ2VyLT5yZWxlYXNlT3V0cHV0KHBvcnRJZCk7CisgICAgICAgIEFTU0VSVF9FUSgwLCBwYXRjaENvdW50LmRlbHRhRnJvbVNuYXBzaG90KCkpOworICAgIH0KKyAgICB7CisgICAgICAgIGNvbnN0IFBhdGNoQ291bnRDaGVjayBwYXRjaENvdW50ID0gc25hcHNob3RQYXRjaENvdW50KCk7CisgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgICAgIGdldE91dHB1dEZvckF0dHIoJnNlbGVjdGVkRGV2aWNlSWQsCisgICAgICAgICAgICAgICAgQVVESU9fRk9STUFUX0FDMywgQVVESU9fQ0hBTk5FTF9PVVRfNVBPSU5UMSwgNDgwMDAsIEFVRElPX09VVFBVVF9GTEFHX0RJUkVDVCk7CisgICAgICAgIEFTU0VSVF9FUShzZWxlY3RlZERldmljZUlkLCBtTXNkT3V0cHV0RGV2aWNlLT5nZXRJZCgpKTsKKyAgICAgICAgQVNTRVJUX0VRKDAsIHBhdGNoQ291bnQuZGVsdGFGcm9tU25hcHNob3QoKSk7CisgICAgfQorfQorCitjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0V2l0aENvbmZpZ3VyYXRpb25GaWxlIDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlclRlc3QgeworcHJvdGVjdGVkOgorICAgIHZvaWQgU2V0VXBNYW5hZ2VyQ29uZmlnKCkgb3ZlcnJpZGU7CisgICAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRDb25maWdGaWxlKCkgeyByZXR1cm4gc0RlZmF1bHRDb25maWc7IH0KKworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBzRXhlY3V0YWJsZURpcjsKKyAgICBzdGF0aWMgY29uc3Qgc3RkOjpzdHJpbmcgc0RlZmF1bHRDb25maWc7Cit9OworCitjb25zdCBzdGQ6OnN0cmluZyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0V2l0aENvbmZpZ3VyYXRpb25GaWxlOjpzRXhlY3V0YWJsZURpciA9CisgICAgICAgIGJhc2U6OkdldEV4ZWN1dGFibGVEaXJlY3RvcnkoKSArICIvIjsKKworY29uc3Qgc3RkOjpzdHJpbmcgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdFdpdGhDb25maWd1cmF0aW9uRmlsZTo6c0RlZmF1bHRDb25maWcgPQorICAgICAgICBzRXhlY3V0YWJsZURpciArICJ0ZXN0X2F1ZGlvX3BvbGljeV9jb25maWd1cmF0aW9uLnhtbCI7CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdFdpdGhDb25maWd1cmF0aW9uRmlsZTo6U2V0VXBNYW5hZ2VyQ29uZmlnKCkgeworICAgIHN0YXR1c190IHN0YXR1cyA9IGRlc2VyaWFsaXplQXVkaW9Qb2xpY3lGaWxlKGdldENvbmZpZ0ZpbGUoKS5jX3N0cigpLCAmbU1hbmFnZXItPmdldENvbmZpZygpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHN0YXR1cyk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0V2l0aENvbmZpZ3VyYXRpb25GaWxlLCBJbml0U3VjY2VzcykgeworICAgIC8vIFNldFVwIG11c3QgZmluaXNoIHdpdGggbm8gYXNzZXJ0aW9ucy4KK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3RXaXRoQ29uZmlndXJhdGlvbkZpbGUsIER1bXApIHsKKyAgICBkdW1wVG9Mb2coKTsKK30KKwordXNpbmcgUG9saWN5TWl4VHVwbGUgPSBzdGQ6OnR1cGxlPGF1ZGlvX3VzYWdlX3QsIGF1ZGlvX3NvdXJjZV90LCB1aW50MzJfdD47CisKK2NsYXNzIEF1ZGlvUG9saWN5TWFuYWdlclRlc3REeW5hbWljUG9saWN5IDogcHVibGljIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RXaXRoQ29uZmlndXJhdGlvbkZpbGUgeworcHJvdGVjdGVkOgorICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IGFkZFBvbGljeU1peChpbnQgbWl4VHlwZSwgaW50IG1peEZsYWcsIGF1ZGlvX2RldmljZXNfdCBkZXZpY2VUeXBlLAorICAgICAgICAgICAgc3RkOjpzdHJpbmcgbWl4QWRkcmVzcywgY29uc3QgYXVkaW9fY29uZmlnX3QmIGF1ZGlvQ29uZmlnLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UG9saWN5TWl4VHVwbGU+JiBydWxlcyk7CisgICAgdm9pZCBjbGVhclBvbGljeU1peCgpOworCisgICAgVmVjdG9yPEF1ZGlvTWl4PiBtQXVkaW9NaXhlczsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBtTWl4QWRkcmVzcyA9ICJyZW1vdGVfc3VibWl4X21lZGlhIjsKK307CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdER5bmFtaWNQb2xpY3k6OlRlYXJEb3duKCkgeworICAgIG1NYW5hZ2VyLT51bnJlZ2lzdGVyUG9saWN5TWl4ZXMobUF1ZGlvTWl4ZXMpOworICAgIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RXaXRoQ29uZmlndXJhdGlvbkZpbGU6OlRlYXJEb3duKCk7Cit9CisKK3N0YXR1c190IEF1ZGlvUG9saWN5TWFuYWdlclRlc3REeW5hbWljUG9saWN5OjphZGRQb2xpY3lNaXgoaW50IG1peFR5cGUsIGludCBtaXhGbGFnLAorICAgICAgICBhdWRpb19kZXZpY2VzX3QgZGV2aWNlVHlwZSwgc3RkOjpzdHJpbmcgbWl4QWRkcmVzcywgY29uc3QgYXVkaW9fY29uZmlnX3QmIGF1ZGlvQ29uZmlnLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQb2xpY3lNaXhUdXBsZT4mIHJ1bGVzKSB7CisgICAgVmVjdG9yPEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24+IG15TWl4TWF0Y2hDcml0ZXJpYTsKKworICAgIGZvcihjb25zdCBhdXRvICZydWxlOiBydWxlcykgeworICAgICAgICBteU1peE1hdGNoQ3JpdGVyaWEuYWRkKEF1ZGlvTWl4TWF0Y2hDcml0ZXJpb24oCisgICAgICAgICAgICAgICAgc3RkOjpnZXQ8MD4ocnVsZSksIHN0ZDo6Z2V0PDE+KHJ1bGUpLCBzdGQ6OmdldDwyPihydWxlKSkpOworICAgIH0KKworICAgIEF1ZGlvTWl4IG15QXVkaW9NaXgobXlNaXhNYXRjaENyaXRlcmlhLCBtaXhUeXBlLCBhdWRpb0NvbmZpZywgbWl4RmxhZywKKyAgICAgICAgICAgIFN0cmluZzgobWl4QWRkcmVzcy5jX3N0cigpKSwgMCk7CisgICAgbXlBdWRpb01peC5tRGV2aWNlVHlwZSA9IGRldmljZVR5cGU7CisgICAgLy8gQ2xlYXIgbUF1ZGlvTWl4IGJlZm9yZSBhZGQgbmV3IG9uZSB0byBtYWtlIHN1cmUgd2UgZG9uJ3QgYWRkIGFscmVhZHkgZXhpc3QgbWl4ZXMuCisgICAgbUF1ZGlvTWl4ZXMuY2xlYXIoKTsKKyAgICBtQXVkaW9NaXhlcy5hZGQobXlBdWRpb01peCk7CisKKyAgICAvLyBBcyB0aGUgcG9saWN5IG1peGVzIHJlZ2lzdHJhdGlvbiBtYXkgZmFpbCBhdCBzb21lIGNhc2UsCisgICAgLy8gY2FsbGVyIG5lZWQgdG8gY2hlY2sgdGhlIHJldHVybmVkIHN0YXR1cy4KKyAgICBzdGF0dXNfdCByZXQgPSBtTWFuYWdlci0+cmVnaXN0ZXJQb2xpY3lNaXhlcyhtQXVkaW9NaXhlcyk7CisgICAgcmV0dXJuIHJldDsKK30KKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RHluYW1pY1BvbGljeTo6Y2xlYXJQb2xpY3lNaXgoKSB7CisgICAgaWYgKG1NYW5hZ2VyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU1hbmFnZXItPnVucmVnaXN0ZXJQb2xpY3lNaXhlcyhtQXVkaW9NaXhlcyk7CisgICAgfQorICAgIG1BdWRpb01peGVzLmNsZWFyKCk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0RHluYW1pY1BvbGljeSwgSW5pdFN1Y2Nlc3MpIHsKKyAgICAvLyBTZXRVcCBtdXN0IGZpbmlzaCB3aXRoIG5vIGFzc2VydGlvbnMKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3REeW5hbWljUG9saWN5LCBEdW1wKSB7CisgICAgZHVtcFRvTG9nKCk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0RHluYW1pY1BvbGljeSwgUmVnaXN0ZXJQb2xpY3lNaXhlcykgeworICAgIHN0YXR1c190IHJldDsKKyAgICBhdWRpb19jb25maWdfdCBhdWRpb0NvbmZpZyA9IEFVRElPX0NPTkZJR19JTklUSUFMSVpFUjsKKworICAgIC8vIE9ubHkgY2FwdHVyZSBvZiBwbGF5YmFjayBpcyBhbGxvd2VkIGluIExPT1BfQkFDSyAmUkVOREVSIG1vZGUKKyAgICByZXQgPSBhZGRQb2xpY3lNaXgoTUlYX1RZUEVfUkVDT1JERVJTLCBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0tfQU5EX1JFTkRFUiwKKyAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwgIiIsIGF1ZGlvQ29uZmlnLCBzdGQ6OnZlY3RvcjxQb2xpY3lNaXhUdXBsZT4oKSk7CisgICAgQVNTRVJUX0VRKElOVkFMSURfT1BFUkFUSU9OLCByZXQpOworCisgICAgLy8gRmFpbCBkdWUgdG8gdGhlIGRldmljZSBpcyBhbHJlYWR5IGNvbm5lY3RlZC4KKyAgICBjbGVhclBvbGljeU1peCgpOworICAgIHJldCA9IGFkZFBvbGljeU1peChNSVhfVFlQRV9QTEFZRVJTLCBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0ssCisgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsICIiLCBhdWRpb0NvbmZpZywgc3RkOjp2ZWN0b3I8UG9saWN5TWl4VHVwbGU+KCkpOworICAgIEFTU0VSVF9FUShJTlZBTElEX09QRVJBVElPTiwgcmV0KTsKKworICAgIC8vIFRoZSBmaXJzdCB0aW1lIHRvIHJlZ2lzdGVyIHBvbGljeSBtaXhlcyB3aXRoIHZhbGlkIHBhcmFtZXRlciBzaG91bGQgc3VjY2VlZC4KKyAgICBjbGVhclBvbGljeU1peCgpOworICAgIGF1ZGlvQ29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICBhdWRpb0NvbmZpZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBhdWRpb0NvbmZpZy5zYW1wbGVfcmF0ZSA9IDQ4MDAwOworICAgIHJldCA9IGFkZFBvbGljeU1peChNSVhfVFlQRV9QTEFZRVJTLCBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0ssCisgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsIG1NaXhBZGRyZXNzLCBhdWRpb0NvbmZpZywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFBvbGljeU1peFR1cGxlPigpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHJldCk7CisgICAgLy8gUmVnaXN0ZXJpbmcgdGhlIHNhbWUgcG9saWN5IG1peGVzIHNob3VsZCBmYWlsLgorICAgIHJldCA9IG1NYW5hZ2VyLT5yZWdpc3RlclBvbGljeU1peGVzKG1BdWRpb01peGVzKTsKKyAgICBBU1NFUlRfRVEoSU5WQUxJRF9PUEVSQVRJT04sIHJldCk7CisKKyAgICAvLyBSZWdpc3RyYXRpb24gc2hvdWxkIGZhaWwgZHVlIHRvIGRldmljZSBub3QgZm91bmQuCisgICAgLy8gTm90ZSB0aGF0IGVhcnBpZWNlIGlzIG5vdCBwcmVzZW50IGluIHRoZSB0ZXN0IGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICAvLyBUaGlzIHdpbGwgbmVlZCB0byBiZSB1cGRhdGVkIGlmIGVhcnBpZWNlIGlzIGFkZGVkIGluIHRoZSB0ZXN0IGNvbmZpZ3VyYXRpb24gZmlsZS4KKyAgICBjbGVhclBvbGljeU1peCgpOworICAgIHJldCA9IGFkZFBvbGljeU1peChNSVhfVFlQRV9QTEFZRVJTLCBNSVhfUk9VVEVfRkxBR19SRU5ERVIsCisgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX0VBUlBJRUNFLCAiIiwgYXVkaW9Db25maWcsIHN0ZDo6dmVjdG9yPFBvbGljeU1peFR1cGxlPigpKTsKKyAgICBBU1NFUlRfRVEoSU5WQUxJRF9PUEVSQVRJT04sIHJldCk7CisKKyAgICAvLyBSZWdpc3RyYXRpb24gc2hvdWxkIGZhaWwgZHVlIHRvIG91dHB1dCBub3QgZm91bmQuCisgICAgY2xlYXJQb2xpY3lNaXgoKTsKKyAgICByZXQgPSBhZGRQb2xpY3lNaXgoTUlYX1RZUEVfUExBWUVSUywgTUlYX1JPVVRFX0ZMQUdfUkVOREVSLAorICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYLCAiIiwgYXVkaW9Db25maWcsIHN0ZDo6dmVjdG9yPFBvbGljeU1peFR1cGxlPigpKTsKKyAgICBBU1NFUlRfRVEoSU5WQUxJRF9PUEVSQVRJT04sIHJldCk7CisKKyAgICAvLyBUaGUgZmlyc3QgdGltZSB0byByZWdpc3RlciB2YWxpZCBwb2xpY3kgbWl4ZXMgc2hvdWxkIHN1Y2NlZWQuCisgICAgY2xlYXJQb2xpY3lNaXgoKTsKKyAgICByZXQgPSBhZGRQb2xpY3lNaXgoTUlYX1RZUEVfUExBWUVSUywgTUlYX1JPVVRFX0ZMQUdfUkVOREVSLAorICAgICAgICAgICAgQVVESU9fREVWSUNFX09VVF9TUEVBS0VSLCAiIiwgYXVkaW9Db25maWcsIHN0ZDo6dmVjdG9yPFBvbGljeU1peFR1cGxlPigpKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIHJldCk7CisgICAgLy8gUmVnaXN0ZXJpbmcgdGhlIHNhbWUgcG9saWN5IG1peGVzIHNob3VsZCBmYWlsLgorICAgIHJldCA9IG1NYW5hZ2VyLT5yZWdpc3RlclBvbGljeU1peGVzKG1BdWRpb01peGVzKTsKKyAgICBBU1NFUlRfRVEoSU5WQUxJRF9PUEVSQVRJT04sIHJldCk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0RHluYW1pY1BvbGljeSwgVW5yZWdpc3RlclBvbGljeU1peGVzKSB7CisgICAgc3RhdHVzX3QgcmV0OworICAgIGF1ZGlvX2NvbmZpZ190IGF1ZGlvQ29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworCisgICAgYXVkaW9Db25maWcuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIGF1ZGlvQ29uZmlnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIGF1ZGlvQ29uZmlnLnNhbXBsZV9yYXRlID0gNDgwMDA7CisgICAgcmV0ID0gYWRkUG9saWN5TWl4KE1JWF9UWVBFX1BMQVlFUlMsIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSywKKyAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwgbU1peEFkZHJlc3MsIGF1ZGlvQ29uZmlnLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8UG9saWN5TWl4VHVwbGU+KCkpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgcmV0KTsKKworICAgIC8vIEFmdGVyIHN1Y2Nlc3NmdWxseSByZWdpc3RlcmluZyBwb2xpY3kgbWl4ZXMsIGl0IHNob3VsZCBiZSBhYmxlIHRvIHVucmVnaXN0ZXIuCisgICAgcmV0ID0gbU1hbmFnZXItPnVucmVnaXN0ZXJQb2xpY3lNaXhlcyhtQXVkaW9NaXhlcyk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCByZXQpOworCisgICAgLy8gQWZ0ZXIgdW5yZWdpc3RlcmluZyBwb2xpY3kgbWl4ZXMgc3VjY2Vzc2Z1bGx5LCBpdCBzaG91bGQgZmFpbCB1bnJlZ2lzdGVyaW5nCisgICAgLy8gdGhlIHNhbWUgcG9saWN5IG1peGVzIGFzIHRoZXkgYXJlIG5vdCByZWdpc3RlcmVkLgorICAgIHJldCA9IG1NYW5hZ2VyLT51bnJlZ2lzdGVyUG9saWN5TWl4ZXMobUF1ZGlvTWl4ZXMpOworICAgIEFTU0VSVF9FUShJTlZBTElEX09QRVJBVElPTiwgcmV0KTsKK30KKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdERQTm9SZW1vdGVTdWJtaXhNb2R1bGUgOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdER5bmFtaWNQb2xpY3kgeworcHJvdGVjdGVkOgorICAgIHN0ZDo6c3RyaW5nIGdldENvbmZpZ0ZpbGUoKSBvdmVycmlkZSB7IHJldHVybiBzUHJpbWFyeU9ubHlDb25maWc7IH0KKworICAgIHN0YXRpYyBjb25zdCBzdGQ6OnN0cmluZyBzUHJpbWFyeU9ubHlDb25maWc7Cit9OworCitjb25zdCBzdGQ6OnN0cmluZyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RFBOb1JlbW90ZVN1Ym1peE1vZHVsZTo6c1ByaW1hcnlPbmx5Q29uZmlnID0KKyAgICAgICAgc0V4ZWN1dGFibGVEaXIgKyAidGVzdF9hdWRpb19wb2xpY3lfcHJpbWFyeV9vbmx5X2NvbmZpZ3VyYXRpb24ueG1sIjsKKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3REUE5vUmVtb3RlU3VibWl4TW9kdWxlLCBJbml0U3VjY2VzcykgeworICAgIC8vIFNldFVwIG11c3QgZmluaXNoIHdpdGggbm8gYXNzZXJ0aW9ucy4KK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3REUE5vUmVtb3RlU3VibWl4TW9kdWxlLCBEdW1wKSB7CisgICAgZHVtcFRvTG9nKCk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0RFBOb1JlbW90ZVN1Ym1peE1vZHVsZSwgUmVnaXN0cmF0aW9uRmFpbHVyZSkgeworICAgIC8vIFJlZ2lzdHJhdGlvbi9VbnJlZ2lzdHJhdGlvbiBzaG91bGQgZmFpbCBkdWUgdG8gbW9kdWxlIGZvciByZW1vdGUgc3VibWl4IG5vdCBmb3VuZC4KKyAgICBzdGF0dXNfdCByZXQ7CisgICAgYXVkaW9fY29uZmlnX3QgYXVkaW9Db25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgYXVkaW9Db25maWcuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPOworICAgIGF1ZGlvQ29uZmlnLmZvcm1hdCA9IEFVRElPX0ZPUk1BVF9QQ01fMTZfQklUOworICAgIGF1ZGlvQ29uZmlnLnNhbXBsZV9yYXRlID0gNDgwMDA7CisgICAgcmV0ID0gYWRkUG9saWN5TWl4KE1JWF9UWVBFX1BMQVlFUlMsIE1JWF9ST1VURV9GTEFHX0xPT1BfQkFDSywKKyAgICAgICAgICAgIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwgIiIsIGF1ZGlvQ29uZmlnLCBzdGQ6OnZlY3RvcjxQb2xpY3lNaXhUdXBsZT4oKSk7CisgICAgQVNTRVJUX0VRKElOVkFMSURfT1BFUkFUSU9OLCByZXQpOworCisgICAgcmV0ID0gbU1hbmFnZXItPnVucmVnaXN0ZXJQb2xpY3lNaXhlcyhtQXVkaW9NaXhlcyk7CisgICAgQVNTRVJUX0VRKElOVkFMSURfT1BFUkFUSU9OLCByZXQpOworfQorCitjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RFBQbGF5YmFja1JlUm91dGluZyA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RHluYW1pY1BvbGljeSwKKyAgICAgICAgcHVibGljIHRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxhdWRpb19hdHRyaWJ1dGVzX3Q+IHsKK3Byb3RlY3RlZDoKKyAgICB2b2lkIFNldFVwKCkgb3ZlcnJpZGU7CisgICAgdm9pZCBUZWFyRG93bigpIG92ZXJyaWRlOworCisgICAgc3RkOjp1bmlxdWVfcHRyPFJlY29yZGluZ0FjdGl2aXR5VHJhY2tlcj4gbVRyYWNrZXI7CisKKyAgICBzdGQ6OnZlY3RvcjxQb2xpY3lNaXhUdXBsZT4gbVVzYWdlUnVsZXMgPSB7CisgICAgICAgICAgICB7QVVESU9fVVNBR0VfTUVESUEsIEFVRElPX1NPVVJDRV9ERUZBVUxULCBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRX0sCisgICAgICAgICAgICB7QVVESU9fVVNBR0VfQUxBUk0sIEFVRElPX1NPVVJDRV9ERUZBVUxULCBSVUxFX01BVENIX0FUVFJJQlVURV9VU0FHRX0KKyAgICB9OworCisgICAgc3RydWN0IGF1ZGlvX3BvcnQgbUluamVjdGlvblBvcnQ7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBtUG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKK307CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdERQUGxheWJhY2tSZVJvdXRpbmc6OlNldFVwKCkgeworICAgIEF1ZGlvUG9saWN5TWFuYWdlclRlc3REeW5hbWljUG9saWN5OjpTZXRVcCgpOworCisgICAgbVRyYWNrZXIucmVzZXQobmV3IFJlY29yZGluZ0FjdGl2aXR5VHJhY2tlcigpKTsKKworICAgIGF1ZGlvX2NvbmZpZ190IGF1ZGlvQ29uZmlnID0gQVVESU9fQ09ORklHX0lOSVRJQUxJWkVSOworICAgIGF1ZGlvQ29uZmlnLmNoYW5uZWxfbWFzayA9IEFVRElPX0NIQU5ORUxfT1VUX1NURVJFTzsKKyAgICBhdWRpb0NvbmZpZy5mb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKKyAgICBhdWRpb0NvbmZpZy5zYW1wbGVfcmF0ZSA9IDQ4MDAwOworICAgIHN0YXR1c190IHJldCA9IGFkZFBvbGljeU1peChNSVhfVFlQRV9QTEFZRVJTLCBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0ssCisgICAgICAgICAgICBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsIG1NaXhBZGRyZXNzLCBhdWRpb0NvbmZpZywgbVVzYWdlUnVsZXMpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgcmV0KTsKKworICAgIHN0cnVjdCBhdWRpb19wb3J0IGV4dHJhY3Rpb25Qb3J0OworICAgIEFTU0VSVF9UUlVFKGZpbmREZXZpY2VQb3J0KEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICBtTWl4QWRkcmVzcywgZXh0cmFjdGlvblBvcnQpKTsKKworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgYXVkaW9fc291cmNlX3Qgc291cmNlID0gQVVESU9fU09VUkNFX1JFTU9URV9TVUJNSVg7CisgICAgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSB7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sIHNvdXJjZSwgMCwgIiJ9OworICAgIHN0ZDo6c3RyaW5nIHRhZ3MgPSAiYWRkcj0iICsgbU1peEFkZHJlc3M7CisgICAgc3RybmNweShhdHRyLnRhZ3MsIHRhZ3MuY19zdHIoKSwgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gMSk7CisgICAgZ2V0SW5wdXRGb3JBdHRyKGF0dHIsIG1UcmFja2VyLT5nZXRSaWlkKCksICZzZWxlY3RlZERldmljZUlkLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPLCA0ODAwMCAvKnNhbXBsZVJhdGUqLywgQVVESU9fSU5QVVRfRkxBR19OT05FLCAmbVBvcnRJZCk7CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+c3RhcnRJbnB1dChtUG9ydElkKSk7CisgICAgQVNTRVJUX0VRKGV4dHJhY3Rpb25Qb3J0LmlkLCBzZWxlY3RlZERldmljZUlkKTsKKworICAgIEFTU0VSVF9UUlVFKGZpbmREZXZpY2VQb3J0KEFVRElPX1BPUlRfUk9MRV9TSU5LLCBBVURJT19ERVZJQ0VfT1VUX1JFTU9URV9TVUJNSVgsCisgICAgICAgICAgICAgICAgICAgIG1NaXhBZGRyZXNzLCBtSW5qZWN0aW9uUG9ydCkpOworfQorCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3REUFBsYXliYWNrUmVSb3V0aW5nOjpUZWFyRG93bigpIHsKKyAgICBtTWFuYWdlci0+c3RvcElucHV0KG1Qb3J0SWQpOworICAgIEF1ZGlvUG9saWN5TWFuYWdlclRlc3REeW5hbWljUG9saWN5OjpUZWFyRG93bigpOworfQorCitURVNUX0YoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdERQUGxheWJhY2tSZVJvdXRpbmcsIEluaXRTdWNjZXNzKSB7CisgICAgLy8gU2V0VXAgbXVzdCBmaW5pc2ggd2l0aCBubyBhc3NlcnRpb25zCit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0RFBQbGF5YmFja1JlUm91dGluZywgRHVtcCkgeworICAgIGR1bXBUb0xvZygpOworfQorCitURVNUX1AoQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdERQUGxheWJhY2tSZVJvdXRpbmcsIFBsYXliYWNrUmVSb3V0aW5nKSB7CisgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSBHZXRQYXJhbSgpOworICAgIGNvbnN0IGF1ZGlvX3VzYWdlX3QgdXNhZ2UgPSBhdHRyLnVzYWdlOworCisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwbGF5YmFja1JvdXRlZFBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBwb3J0SWQgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOworICAgIGdldE91dHB1dEZvckF0dHIoJnBsYXliYWNrUm91dGVkUG9ydElkLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAorICAgICAgICAgICAgNDgwMDAgLypzYW1wbGVSYXRlKi8sIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZwb3J0SWQsIGF0dHIpOworICAgIGlmIChzdGQ6OmZpbmRfaWYoYmVnaW4obVVzYWdlUnVsZXMpLCBlbmQobVVzYWdlUnVsZXMpLCBbJnVzYWdlXShjb25zdCBhdXRvICZ1c2FnZVJ1bGUpIHsKKyAgICAgICAgICAgIHJldHVybiAoc3RkOjpnZXQ8MD4odXNhZ2VSdWxlKSA9PSB1c2FnZSkgJiYKKyAgICAgICAgICAgIChzdGQ6OmdldDwyPih1c2FnZVJ1bGUpID09IFJVTEVfTUFUQ0hfQVRUUklCVVRFX1VTQUdFKTt9KSAhPSBlbmQobVVzYWdlUnVsZXMpIHx8CisgICAgICAgICAgICAoc3RybmNtcChhdHRyLnRhZ3MsICJhZGRyPSIsIHN0cmxlbigiYWRkcj0iKSkgPT0gMCAmJgorICAgICAgICAgICAgICAgICAgICBzdHJuY21wKGF0dHIudGFncyArIHN0cmxlbigiYWRkcj0iKSwgbU1peEFkZHJlc3MuY19zdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgQVVESU9fQVRUUklCVVRFU19UQUdTX01BWF9TSVpFIC0gc3RybGVuKCJhZGRyPSIpIC0gMSkgPT0gMCkpIHsKKyAgICAgICAgRVhQRUNUX0VRKG1JbmplY3Rpb25Qb3J0LmlkLCBwbGF5YmFja1JvdXRlZFBvcnRJZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgRVhQRUNUX05FKG1JbmplY3Rpb25Qb3J0LmlkLCBwbGF5YmFja1JvdXRlZFBvcnRJZCk7CisgICAgfQorfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUCgKKyAgICAgICAgUGxheWJhY2tSZXJvdXRpbmdVc2FnZU1hdGNoLAorICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RFBQbGF5YmFja1JlUm91dGluZywKKyAgICAgICAgdGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfTUVESUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsIEFVRElPX1VTQUdFX0FMQVJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0KKyAgICAgICAgICAgICAgICApCisgICAgICAgICk7CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKAorICAgICAgICBQbGF5YmFja1Jlcm91dGluZ0FkZHJlc3NQcmlvcml0eU1hdGNoLAorICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RFBQbGF5YmFja1JlUm91dGluZywKKyAgICAgICAgdGVzdGluZzo6VmFsdWVzKAorICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfTUVESUEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLCBBVURJT19VU0FHRV9BTEFSTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAorICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9URUxFUEhPTllfUklOR1RPTkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fUkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAorICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9JTlNUQU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0RFTEFZRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9FVkVOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAorICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9BU1NJU1RBTkNFX0FDQ0VTU0lCSUxJVFksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9OQVZJR0FUSU9OX0dVSURBTkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfU09OSUZJQ0FUSU9OLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLCBBVURJT19VU0FHRV9HQU1FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLCBBVURJT19VU0FHRV9WSVJUVUFMX1NPVVJDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAorICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfQVNTSVNUQU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX1NQRUVDSCwgQVVESU9fVVNBR0VfQVNTSVNUQU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0KKyAgICAgICAgICAgICAgICApCisgICAgICAgICk7CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKAorICAgICAgICBQbGF5YmFja1Jlcm91dGluZ1VuSGFuZGxlZFVzYWdlcywKKyAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdERQUGxheWJhY2tSZVJvdXRpbmcsCisgICAgICAgIHRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsIEFVRElPX1VTQUdFX1ZPSUNFX0NPTU1VTklDQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfVk9JQ0VfQ09NTVVOSUNBVElPTl9TSUdOQUxMSU5HLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLCBBVURJT19VU0FHRV9OT1RJRklDQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX1RFTEVQSE9OWV9SSU5HVE9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9OT1RJRklDQVRJT05fQ09NTVVOSUNBVElPTl9SRVFVRVNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX05PVElGSUNBVElPTl9DT01NVU5JQ0FUSU9OX0lOU1RBTlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0NPTU1VTklDQVRJT05fREVMQVlFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywgQVVESU9fVVNBR0VfTk9USUZJQ0FUSU9OX0VWRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9ERUZBVUxULCAwLCAiIn0sCisgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX01VU0lDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1VTQUdFX0FTU0lTVEFOQ0VfQUNDRVNTSUJJTElUWSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9NVVNJQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19VU0FHRV9BU1NJU1RBTkNFX05BVklHQVRJT05fR1VJREFOQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fVVNBR0VfQVNTSVNUQU5DRV9TT05JRklDQVRJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsIEFVRElPX1VTQUdFX0dBTUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifSwKKyAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfTVVTSUMsIEFVRElPX1VTQUdFX0FTU0lTVEFOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9TUEVFQ0gsIEFVRElPX1VTQUdFX0FTU0lTVEFOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfREVGQVVMVCwgMCwgIiJ9CisgICAgICAgICAgICAgICAgKQorICAgICAgICApOworCitjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RFBNaXhSZWNvcmRJbmplY3Rpb24gOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdER5bmFtaWNQb2xpY3ksCisgICAgICAgIHB1YmxpYyB0ZXN0aW5nOjpXaXRoUGFyYW1JbnRlcmZhY2U8YXVkaW9fYXR0cmlidXRlc190PiB7Citwcm90ZWN0ZWQ6CisgICAgdm9pZCBTZXRVcCgpIG92ZXJyaWRlOworICAgIHZvaWQgVGVhckRvd24oKSBvdmVycmlkZTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxSZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXI+IG1UcmFja2VyOworCisgICAgc3RkOjp2ZWN0b3I8UG9saWN5TWl4VHVwbGU+IG1Tb3VyY2VSdWxlcyA9IHsKKyAgICAgICAge0FVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9DQU1DT1JERVIsIFJVTEVfTUFUQ0hfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUfSwKKyAgICAgICAge0FVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9NSUMsIFJVTEVfTUFUQ0hfQVRUUklCVVRFX0NBUFRVUkVfUFJFU0VUfSwKKyAgICAgICAge0FVRElPX1VTQUdFX1VOS05PV04sIEFVRElPX1NPVVJDRV9WT0lDRV9DT01NVU5JQ0FUSU9OLCBSVUxFX01BVENIX0FUVFJJQlVURV9DQVBUVVJFX1BSRVNFVH0KKyAgICB9OworCisgICAgc3RydWN0IGF1ZGlvX3BvcnQgbUV4dHJhY3Rpb25Qb3J0OworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgbVBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7Cit9OworCit2b2lkIEF1ZGlvUG9saWN5TWFuYWdlclRlc3REUE1peFJlY29yZEluamVjdGlvbjo6U2V0VXAoKSB7CisgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdER5bmFtaWNQb2xpY3k6OlNldFVwKCk7CisKKyAgICBtVHJhY2tlci5yZXNldChuZXcgUmVjb3JkaW5nQWN0aXZpdHlUcmFja2VyKCkpOworCisgICAgYXVkaW9fY29uZmlnX3QgYXVkaW9Db25maWcgPSBBVURJT19DT05GSUdfSU5JVElBTElaRVI7CisgICAgYXVkaW9Db25maWcuY2hhbm5lbF9tYXNrID0gQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU87CisgICAgYXVkaW9Db25maWcuZm9ybWF0ID0gQVVESU9fRk9STUFUX1BDTV8xNl9CSVQ7CisgICAgYXVkaW9Db25maWcuc2FtcGxlX3JhdGUgPSA0ODAwMDsKKyAgICBzdGF0dXNfdCByZXQgPSBhZGRQb2xpY3lNaXgoTUlYX1RZUEVfUkVDT1JERVJTLCBNSVhfUk9VVEVfRkxBR19MT09QX0JBQ0ssCisgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwgbU1peEFkZHJlc3MsIGF1ZGlvQ29uZmlnLCBtU291cmNlUnVsZXMpOworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgcmV0KTsKKworICAgIHN0cnVjdCBhdWRpb19wb3J0IGluamVjdGlvblBvcnQ7CisgICAgQVNTRVJUX1RSVUUoZmluZERldmljZVBvcnQoQVVESU9fUE9SVF9ST0xFX1NJTkssIEFVRElPX0RFVklDRV9PVVRfUkVNT1RFX1NVQk1JWCwKKyAgICAgICAgICAgICAgICAgICAgbU1peEFkZHJlc3MsIGluamVjdGlvblBvcnQpKTsKKworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3Qgc2VsZWN0ZWREZXZpY2VJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgYXVkaW9fdXNhZ2VfdCB1c2FnZSA9IEFVRElPX1VTQUdFX1ZJUlRVQUxfU09VUkNFOworICAgIGF1ZGlvX2F0dHJpYnV0ZXNfdCBhdHRyID0ge0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCB1c2FnZSwgQVVESU9fU09VUkNFX0RFRkFVTFQsIDAsICIifTsKKyAgICBzdGQ6OnN0cmluZyB0YWdzID0gc3RkOjpzdHJpbmcoImFkZHI9IikgKyBtTWl4QWRkcmVzczsKKyAgICBzdHJuY3B5KGF0dHIudGFncywgdGFncy5jX3N0cigpLCBBVURJT19BVFRSSUJVVEVTX1RBR1NfTUFYX1NJWkUgLSAxKTsKKyAgICBnZXRPdXRwdXRGb3JBdHRyKCZzZWxlY3RlZERldmljZUlkLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAorICAgICAgICAgICAgNDgwMDAgLypzYW1wbGVSYXRlKi8sIEFVRElPX09VVFBVVF9GTEFHX05PTkUsICZtUG9ydElkLCBhdHRyKTsKKyAgICBBU1NFUlRfRVEoTk9fRVJST1IsIG1NYW5hZ2VyLT5zdGFydE91dHB1dChtUG9ydElkKSk7CisgICAgQVNTRVJUX0VRKGluamVjdGlvblBvcnQuaWQsIGdldERldmljZUlkRnJvbVBhdGNoKG1DbGllbnQtPmdldExhc3RBZGRlZFBhdGNoKCkpKTsKKworICAgIEFTU0VSVF9UUlVFKGZpbmREZXZpY2VQb3J0KEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLAorICAgICAgICAgICAgICAgICAgICBtTWl4QWRkcmVzcywgbUV4dHJhY3Rpb25Qb3J0KSk7Cit9CisKK3ZvaWQgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdERQTWl4UmVjb3JkSW5qZWN0aW9uOjpUZWFyRG93bigpIHsKKyAgICBtTWFuYWdlci0+c3RvcE91dHB1dChtUG9ydElkKTsKKyAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RHluYW1pY1BvbGljeTo6VGVhckRvd24oKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3REUE1peFJlY29yZEluamVjdGlvbiwgSW5pdFN1Y2Nlc3MpIHsKKyAgICAvLyBTZXRVcCBtdXNoIGZpbmlzaCB3aXRoIG5vIGFzc2VydGlvbnMuCit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJUZXN0RFBNaXhSZWNvcmRJbmplY3Rpb24sIER1bXApIHsKKyAgICBkdW1wVG9Mb2coKTsKK30KKworVEVTVF9QKEF1ZGlvUG9saWN5TWFuYWdlclRlc3REUE1peFJlY29yZEluamVjdGlvbiwgUmVjb3JkaW5nSW5qZWN0aW9uKSB7CisgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHIgPSBHZXRQYXJhbSgpOworICAgIGNvbnN0IGF1ZGlvX3NvdXJjZV90IHNvdXJjZSA9IGF0dHIuc291cmNlOworCisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCBjYXB0dXJlUm91dGVkUG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICBhdWRpb19wb3J0X2hhbmRsZV90IHBvcnRJZCA9IEFVRElPX1BPUlRfSEFORExFX05PTkU7CisgICAgZ2V0SW5wdXRGb3JBdHRyKGF0dHIsIG1UcmFja2VyLT5nZXRSaWlkKCksICZjYXB0dXJlUm91dGVkUG9ydElkLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwKKyAgICAgICAgICAgIEFVRElPX0NIQU5ORUxfSU5fU1RFUkVPLCA0ODAwMCAvKnNhbXBsZVJhdGUqLywgQVVESU9fSU5QVVRfRkxBR19OT05FLCAmcG9ydElkKTsKKyAgICBpZiAoc3RkOjpmaW5kX2lmKGJlZ2luKG1Tb3VyY2VSdWxlcyksIGVuZChtU291cmNlUnVsZXMpLCBbJnNvdXJjZV0oY29uc3QgYXV0byAmc291cmNlUnVsZSkgeworICAgICAgICAgICAgcmV0dXJuIChzdGQ6OmdldDwxPihzb3VyY2VSdWxlKSA9PSBzb3VyY2UpICYmCisgICAgICAgICAgICAoc3RkOjpnZXQ8Mj4oc291cmNlUnVsZSkgPT0gUlVMRV9NQVRDSF9BVFRSSUJVVEVfQ0FQVFVSRV9QUkVTRVQpO30pCisgICAgICAgICAgICAhPSBlbmQobVNvdXJjZVJ1bGVzKSkgeworICAgICAgICBFWFBFQ1RfRVEobUV4dHJhY3Rpb25Qb3J0LmlkLCBjYXB0dXJlUm91dGVkUG9ydElkKTsKKyAgICB9IGVsc2UgeworICAgICAgICBFWFBFQ1RfTkUobUV4dHJhY3Rpb25Qb3J0LmlkLCBjYXB0dXJlUm91dGVkUG9ydElkKTsKKyAgICB9Cit9CisKKy8vIE5vIGFkZHJlc3MgcHJpb3JpdHkgcnVsZSBmb3IgcmVtb3RlIHJlY29yZGluZywgYWRkcmVzcyBpcyBhICJkb24ndCBjYXJlIgorSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoCisgICAgICAgIFJlY29yZEluamVjdGlvblNvdXJjZU1hdGNoLAorICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RFBNaXhSZWNvcmRJbmplY3Rpb24sCisgICAgICAgIHRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfQ0FNQ09SREVSLCAwLCAiIn0sCisgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0NBTUNPUkRFUiwgMCwgImFkZHI9cmVtb3RlX3N1Ym1peF9tZWRpYSJ9LAorICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9NSUMsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifSwKKyAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfTUlDLCAwLCAiIn0sCisgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX1ZPSUNFX0NPTU1VTklDQVRJT04sIDAsICIifSwKKyAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfQ09NTVVOSUNBVElPTiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0KKyAgICAgICAgICAgICAgICApCisgICAgICAgICk7CisKKy8vIE5vIGFkZHJlc3MgcHJpb3JpdHkgcnVsZSBmb3IgcmVtb3RlIHJlY29yZGluZworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoCisgICAgICAgIFJlY29yZEluamVjdGlvblNvdXJjZU5vdE1hdGNoLAorICAgICAgICBBdWRpb1BvbGljeU1hbmFnZXJUZXN0RFBNaXhSZWNvcmRJbmplY3Rpb24sCisgICAgICAgIHRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfVk9JQ0VfUkVDT0dOSVRJT04sIDAsICIifSwKKyAgICAgICAgICAgICAgICAoYXVkaW9fYXR0cmlidXRlc190KXtBVURJT19DT05URU5UX1RZUEVfVU5LTk9XTiwgQVVESU9fVVNBR0VfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVURJT19TT1VSQ0VfSE9UV09SRCwgMCwgIiJ9LAorICAgICAgICAgICAgICAgIChhdWRpb19hdHRyaWJ1dGVzX3Qpe0FVRElPX0NPTlRFTlRfVFlQRV9VTktOT1dOLCBBVURJT19VU0FHRV9VTktOT1dOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFVRElPX1NPVVJDRV9WT0lDRV9SRUNPR05JVElPTiwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkcj1yZW1vdGVfc3VibWl4X21lZGlhIn0sCisgICAgICAgICAgICAgICAgKGF1ZGlvX2F0dHJpYnV0ZXNfdCl7QVVESU9fQ09OVEVOVF9UWVBFX1VOS05PV04sIEFVRElPX1VTQUdFX1VOS05PV04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVVESU9fU09VUkNFX0hPVFdPUkQsIDAsICJhZGRyPXJlbW90ZV9zdWJtaXhfbWVkaWEifQorICAgICAgICAgICAgICAgICkKKyAgICAgICAgKTsKKwordXNpbmcgRGV2aWNlQ29ubmVjdGlvblRlc3RQYXJhbXMgPQorICAgICAgICBzdGQ6OnR1cGxlPGF1ZGlvX2RldmljZXNfdCAvKnR5cGUqLywgc3RkOjpzdHJpbmcgLypuYW1lKi8sIHN0ZDo6c3RyaW5nIC8qYWRkcmVzcyovPjsKKworY2xhc3MgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdERldmljZUNvbm5lY3Rpb24gOiBwdWJsaWMgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdFdpdGhDb25maWd1cmF0aW9uRmlsZSwKKyAgICAgICAgcHVibGljIHRlc3Rpbmc6OldpdGhQYXJhbUludGVyZmFjZTxEZXZpY2VDb25uZWN0aW9uVGVzdFBhcmFtcz4geworfTsKKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3REZXZpY2VDb25uZWN0aW9uLCBJbml0U3VjY2VzcykgeworICAgIC8vIFNldFVwIG11c3QgZmluaXNoIHdpdGggbm8gYXNzZXJ0aW9ucy4KK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlclRlc3REZXZpY2VDb25uZWN0aW9uLCBEdW1wKSB7CisgICAgZHVtcFRvTG9nKCk7Cit9CisKK1RFU1RfUChBdWRpb1BvbGljeU1hbmFnZXJUZXN0RGV2aWNlQ29ubmVjdGlvbiwgU2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKSB7CisgICAgY29uc3QgYXVkaW9fZGV2aWNlc190IHR5cGUgPSBzdGQ6OmdldDwwPihHZXRQYXJhbSgpKTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyBuYW1lID0gc3RkOjpnZXQ8MT4oR2V0UGFyYW0oKSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgYWRkcmVzcyA9IHN0ZDo6Z2V0PDI+KEdldFBhcmFtKCkpOworCisgICAgaWYgKHR5cGUgPT0gQVVESU9fREVWSUNFX09VVF9IRE1JKSB7CisgICAgICAgIC8vIFNldCBkZXZpY2UgY29ubmVjdGlvbiBzdGF0ZSBmYWlsZWQgZHVlIHRvIG5vIGRldmljZSBkZXNjcmlwdG9yIGZvdW5kCisgICAgICAgIC8vIEZvciBIRE1JIGNhc2UsIGl0IGlzIGVhc2llciB0byBzaW11bGF0ZSBkZXZpY2UgZGVzY3JpcHRvciBub3QgZm91bmQgZXJyb3IKKyAgICAgICAgLy8gYnkgdXNpbmcgYSB1bmRlY2xhcmVkIGVuY29kZWQgZm9ybWF0LgorICAgICAgICBBU1NFUlRfRVEoSU5WQUxJRF9PUEVSQVRJT04sIG1NYW5hZ2VyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICAgICAgdHlwZSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCisgICAgICAgICAgICAgICAgYWRkcmVzcy5jX3N0cigpLCBuYW1lLmNfc3RyKCksIEFVRElPX0ZPUk1BVF9NQVRfMl8xKSk7CisgICAgfQorICAgIC8vIENvbm5lY3Qgd2l0aCB2YWxpZCBwYXJhbWV0ZXJzIHNob3VsZCBzdWNjZWVkCisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgdHlwZSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCisgICAgICAgICAgICBhZGRyZXNzLmNfc3RyKCksIG5hbWUuY19zdHIoKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpKTsKKyAgICAvLyBUcnkgdG8gY29ubmVjdCB3aXRoIHRoZSBzYW1lIGRldmljZSBhZ2FpbiBzaG91bGQgZmFpbAorICAgIEFTU0VSVF9FUShJTlZBTElEX09QRVJBVElPTiwgbU1hbmFnZXItPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKKyAgICAgICAgICAgIHR5cGUsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLAorICAgICAgICAgICAgYWRkcmVzcy5jX3N0cigpLCBuYW1lLmNfc3RyKCksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSk7CisgICAgLy8gRGlzY29ubmVjdCB0aGUgY29ubmVjdGVkIGRldmljZSBzaG91bGQgc3VjY2VlZAorICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKKyAgICAgICAgICAgIHR5cGUsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICBhZGRyZXNzLmNfc3RyKCksIG5hbWUuY19zdHIoKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpKTsKKyAgICAvLyBEaXNjb25uZWN0IGRldmljZSB0aGF0IGlzIG5vdCBjb25uZWN0ZWQgc2hvdWxkIGZhaWwKKyAgICBBU1NFUlRfRVEoSU5WQUxJRF9PUEVSQVRJT04sIG1NYW5hZ2VyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICB0eXBlLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLAorICAgICAgICAgICAgYWRkcmVzcy5jX3N0cigpLCBuYW1lLmNfc3RyKCksIEFVRElPX0ZPUk1BVF9ERUZBVUxUKSk7CisgICAgLy8gVHJ5IHRvIHNldCBkZXZpY2UgY29ubmVjdGlvbiBzdGF0ZSAgd2l0aCBhIGludmFsaWQgY29ubmVjdGlvbiBzdGF0ZSBzaG91bGQgZmFpbAorICAgIEFTU0VSVF9FUShCQURfVkFMVUUsIG1NYW5hZ2VyLT5zZXREZXZpY2VDb25uZWN0aW9uU3RhdGUoCisgICAgICAgICAgICB0eXBlLCBBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX0NOVCwKKyAgICAgICAgICAgICIiLCAiIiwgQVVESU9fRk9STUFUX0RFRkFVTFQpKTsKK30KKworVEVTVF9QKEF1ZGlvUG9saWN5TWFuYWdlclRlc3REZXZpY2VDb25uZWN0aW9uLCBFeHBsaWNpdGx5Um91dGluZ0FmdGVyQ29ubmVjdGlvbikgeworICAgIGNvbnN0IGF1ZGlvX2RldmljZXNfdCB0eXBlID0gc3RkOjpnZXQ8MD4oR2V0UGFyYW0oKSk7CisgICAgY29uc3Qgc3RkOjpzdHJpbmcgbmFtZSA9IHN0ZDo6Z2V0PDE+KEdldFBhcmFtKCkpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nIGFkZHJlc3MgPSBzdGQ6OmdldDwyPihHZXRQYXJhbSgpKTsKKworICAgIC8vIENvbm5lY3QgZGV2aWNlIHRvIGRvIGV4cGxpY2l0bHkgcm91dGluZyB0ZXN0CisgICAgQVNTRVJUX0VRKE5PX0VSUk9SLCBtTWFuYWdlci0+c2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgdHlwZSwgQVVESU9fUE9MSUNZX0RFVklDRV9TVEFURV9BVkFJTEFCTEUsCisgICAgICAgICAgICBhZGRyZXNzLmNfc3RyKCksIG5hbWUuY19zdHIoKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpKTsKKworICAgIGF1ZGlvX3BvcnQgZGV2aWNlUG9ydDsKKyAgICBjb25zdCBhdWRpb19wb3J0X3JvbGVfdCByb2xlID0gYXVkaW9faXNfb3V0cHV0X2RldmljZSh0eXBlKQorICAgICAgICAgICAgPyBBVURJT19QT1JUX1JPTEVfU0lOSyA6IEFVRElPX1BPUlRfUk9MRV9TT1VSQ0U7CisgICAgQVNTRVJUX1RSVUUoZmluZERldmljZVBvcnQocm9sZSwgdHlwZSwgYWRkcmVzcywgZGV2aWNlUG9ydCkpOworCisgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCByb3V0ZWRQb3J0SWQgPSBkZXZpY2VQb3J0LmlkOworICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgcG9ydElkID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKKyAgICAvLyBUcnkgc3RhcnQgaW5wdXQgb3Igb3V0cHV0IGFjY29yZGluZyB0byB0aGUgZGV2aWNlIHR5cGUKKyAgICBpZiAoYXVkaW9faXNfb3V0cHV0X2RldmljZXModHlwZSkpIHsKKyAgICAgICAgZ2V0T3V0cHV0Rm9yQXR0cigmcm91dGVkUG9ydElkLCBBVURJT19GT1JNQVRfUENNXzE2X0JJVCwgQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPLAorICAgICAgICAgICAgICAgIDQ4MDAwIC8qc2FtcGxlUmF0ZSovLCBBVURJT19PVVRQVVRfRkxBR19OT05FLCAmcG9ydElkKTsKKyAgICB9IGVsc2UgaWYgKGF1ZGlvX2lzX2lucHV0X2RldmljZSh0eXBlKSkgeworICAgICAgICBSZWNvcmRpbmdBY3Rpdml0eVRyYWNrZXIgdHJhY2tlcjsKKyAgICAgICAgZ2V0SW5wdXRGb3JBdHRyKHt9LCB0cmFja2VyLmdldFJpaWQoKSwgJnJvdXRlZFBvcnRJZCwgQVVESU9fRk9STUFUX1BDTV8xNl9CSVQsCisgICAgICAgICAgICAgICAgQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8sIDQ4MDAwIC8qc2FtcGxlUmF0ZSovLCBBVURJT19JTlBVVF9GTEFHX05PTkUsICZwb3J0SWQpOworICAgIH0KKyAgICBBU1NFUlRfRVEoZGV2aWNlUG9ydC5pZCwgcm91dGVkUG9ydElkKTsKKworICAgIEFTU0VSVF9FUShOT19FUlJPUiwgbU1hbmFnZXItPnNldERldmljZUNvbm5lY3Rpb25TdGF0ZSgKKyAgICAgICAgICAgIHR5cGUsIEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfVU5BVkFJTEFCTEUsCisgICAgICAgICAgICBhZGRyZXNzLmNfc3RyKCksIG5hbWUuY19zdHIoKSwgQVVESU9fRk9STUFUX0RFRkFVTFQpKTsKK30KKworSU5TVEFOVElBVEVfVEVTVF9DQVNFX1AoCisgICAgICAgIERldmljZUNvbm5lY3Rpb25TdGF0ZSwKKyAgICAgICAgQXVkaW9Qb2xpY3lNYW5hZ2VyVGVzdERldmljZUNvbm5lY3Rpb24sCisgICAgICAgIHRlc3Rpbmc6OlZhbHVlcygKKyAgICAgICAgICAgICAgICBEZXZpY2VDb25uZWN0aW9uVGVzdFBhcmFtcyh7QVVESU9fREVWSUNFX0lOX0hETUksICJ0ZXN0X2luX2hkbWkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXVkaW9fcG9saWN5X3Rlc3RfaW5faGRtaSJ9KSwKKyAgICAgICAgICAgICAgICBEZXZpY2VDb25uZWN0aW9uVGVzdFBhcmFtcyh7QVVESU9fREVWSUNFX09VVF9IRE1JLCAidGVzdF9vdXRfaGRtaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdWRpb19wb2xpY3lfdGVzdF9vdXRfaGRtaSJ9KSwKKyAgICAgICAgICAgICAgICBEZXZpY2VDb25uZWN0aW9uVGVzdFBhcmFtcyh7QVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCwgImJ0X2hmcF9pbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoZnBfY2xpZW50X2luIn0pLAorICAgICAgICAgICAgICAgIERldmljZUNvbm5lY3Rpb25UZXN0UGFyYW1zKHtBVURJT19ERVZJQ0VfT1VUX0JMVUVUT09USF9TQ08sICJidF9oZnBfb3V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhmcF9jbGllbnRfb3V0In0pCisgICAgICAgICAgICAgICAgKQorICAgICAgICApOworCitjbGFzcyBBdWRpb1BvbGljeU1hbmFnZXJEeW5hbWljSHdNb2R1bGVzVGVzdCA6IHB1YmxpYyBBdWRpb1BvbGljeU1hbmFnZXJUZXN0V2l0aENvbmZpZ3VyYXRpb25GaWxlIHsKK3Byb3RlY3RlZDoKKyAgICB2b2lkIFNldFVwTWFuYWdlckNvbmZpZygpIG92ZXJyaWRlOworfTsKKwordm9pZCBBdWRpb1BvbGljeU1hbmFnZXJEeW5hbWljSHdNb2R1bGVzVGVzdDo6U2V0VXBNYW5hZ2VyQ29uZmlnKCkgeworICAgIEF1ZGlvUG9saWN5TWFuYWdlclRlc3RXaXRoQ29uZmlndXJhdGlvbkZpbGU6OlNldFVwTWFuYWdlckNvbmZpZygpOworICAgIC8vIE9ubHkgYWxsb3cgc3VjY2Vzc2Z1bCBvcGVuaW5nIG9mICJwcmltYXJ5IiBodyBtb2R1bGUgZHVyaW5nIEFQTSBpbml0aWFsaXphdGlvbi4KKyAgICBtQ2xpZW50LT5zd2FwQWxsb3dlZE1vZHVsZU5hbWVzKHsicHJpbWFyeSJ9KTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlckR5bmFtaWNId01vZHVsZXNUZXN0LCBJbml0U3VjY2VzcykgeworICAgIC8vIFNldFVwIG11c3QgZmluaXNoIHdpdGggbm8gYXNzZXJ0aW9ucy4KK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlckR5bmFtaWNId01vZHVsZXNUZXN0LCBEeW5hbWljQWRkaXRpb24pIHsKKyAgICBjb25zdCBhdXRvIGhhbmRsZUJlZm9yZSA9IG1DbGllbnQtPnBlZWtOZXh0TW9kdWxlSGFuZGxlKCk7CisgICAgbU1hbmFnZXItPm9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCk7CisgICAgQVNTRVJUX0VRKGhhbmRsZUJlZm9yZSwgbUNsaWVudC0+cGVla05leHRNb2R1bGVIYW5kbGUoKSk7CisgICAgLy8gUmVzZXQgbW9kdWxlIGxvYWRpbmcgcmVzdHJpY3Rpb25zLgorICAgIG1DbGllbnQtPnN3YXBBbGxvd2VkTW9kdWxlTmFtZXMoKTsKKyAgICBtTWFuYWdlci0+b25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGUoKTsKKyAgICBjb25zdCBhdXRvIGhhbmRsZUFmdGVyID0gbUNsaWVudC0+cGVla05leHRNb2R1bGVIYW5kbGUoKTsKKyAgICBBU1NFUlRfR1QoaGFuZGxlQWZ0ZXIsIGhhbmRsZUJlZm9yZSk7CisgICAgbU1hbmFnZXItPm9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCk7CisgICAgQVNTRVJUX0VRKGhhbmRsZUFmdGVyLCBtQ2xpZW50LT5wZWVrTmV4dE1vZHVsZUhhbmRsZSgpKTsKK30KKworVEVTVF9GKEF1ZGlvUG9saWN5TWFuYWdlckR5bmFtaWNId01vZHVsZXNUZXN0LCBBZGRlZERldmljZUF2YWlsYWJsZSkgeworICAgIEFTU0VSVF9FUShBVURJT19QT0xJQ1lfREVWSUNFX1NUQVRFX1VOQVZBSUxBQkxFLCBtTWFuYWdlci0+Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwgIjAiKSk7CisgICAgbUNsaWVudC0+c3dhcEFsbG93ZWRNb2R1bGVOYW1lcyh7InByaW1hcnkiLCAicl9zdWJtaXgifSk7CisgICAgbU1hbmFnZXItPm9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCk7CisgICAgQVNTRVJUX0VRKEFVRElPX1BPTElDWV9ERVZJQ0VfU1RBVEVfQVZBSUxBQkxFLCBtTWFuYWdlci0+Z2V0RGV2aWNlQ29ubmVjdGlvblN0YXRlKAorICAgICAgICAgICAgICAgICAgICBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwgIjAiKSk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJEeW5hbWljSHdNb2R1bGVzVGVzdCwgTGlzdEFkZGVkQXVkaW9Qb3J0cykgeworICAgIHN0cnVjdCBhdWRpb19wb3J0IHBvcnQ7CisgICAgQVNTRVJUX0ZBTFNFKGZpbmREZXZpY2VQb3J0KEFVRElPX1BPUlRfUk9MRV9TT1VSQ0UsIEFVRElPX0RFVklDRV9JTl9SRU1PVEVfU1VCTUlYLCAiMCIsIHBvcnQpKTsKKyAgICBtQ2xpZW50LT5zd2FwQWxsb3dlZE1vZHVsZU5hbWVzKHsicHJpbWFyeSIsICJyX3N1Ym1peCJ9KTsKKyAgICBtTWFuYWdlci0+b25OZXdBdWRpb01vZHVsZXNBdmFpbGFibGUoKTsKKyAgICBBU1NFUlRfVFJVRShmaW5kRGV2aWNlUG9ydChBVURJT19QT1JUX1JPTEVfU09VUkNFLCBBVURJT19ERVZJQ0VfSU5fUkVNT1RFX1NVQk1JWCwgIjAiLCBwb3J0KSk7Cit9CisKK1RFU1RfRihBdWRpb1BvbGljeU1hbmFnZXJEeW5hbWljSHdNb2R1bGVzVGVzdCwgQ2xpZW50SXNVcGRhdGVkKSB7CisgICAgY29uc3Qgc2l6ZV90IHByZXZBdWRpb1BvcnRMaXN0VXBkYXRlQ291bnQgPSBtQ2xpZW50LT5nZXRBdWRpb1BvcnRMaXN0VXBkYXRlQ291bnQoKTsKKyAgICBjb25zdCB1aW50MzJfdCBwcmV2QXVkaW9Qb3J0R2VuZXJhdGlvbiA9IG1NYW5hZ2VyLT5nZXRBdWRpb1BvcnRHZW5lcmF0aW9uKCk7CisgICAgbUNsaWVudC0+c3dhcEFsbG93ZWRNb2R1bGVOYW1lcyh7InByaW1hcnkiLCAicl9zdWJtaXgifSk7CisgICAgbU1hbmFnZXItPm9uTmV3QXVkaW9Nb2R1bGVzQXZhaWxhYmxlKCk7CisgICAgRVhQRUNUX0dUKG1DbGllbnQtPmdldEF1ZGlvUG9ydExpc3RVcGRhdGVDb3VudCgpLCBwcmV2QXVkaW9Qb3J0TGlzdFVwZGF0ZUNvdW50KTsKKyAgICBFWFBFQ1RfR1QobU1hbmFnZXItPmdldEF1ZGlvUG9ydEdlbmVyYXRpb24oKSwgcHJldkF1ZGlvUG9ydEdlbmVyYXRpb24pOworfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvcmVzb3VyY2VzL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9yZXNvdXJjZXMvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MWY1ZWUxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvcmVzb3VyY2VzL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw3IEBACitmaWxlZ3JvdXAgeworICAgIG5hbWU6ICJhdWRpb3BvbGljeXRlc3RfY29uZmlndXJhdGlvbl9maWxlcyIsCisgICAgc3JjczogWworICAgICAgICAidGVzdF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwiLAorICAgICAgICAidGVzdF9hdWRpb19wb2xpY3lfcHJpbWFyeV9vbmx5X2NvbmZpZ3VyYXRpb24ueG1sIiwKKyAgICBdLAorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvcmVzb3VyY2VzL3Rlc3RfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sIGIvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvcmVzb3VyY2VzL3Rlc3RfYXVkaW9fcG9saWN5X2NvbmZpZ3VyYXRpb24ueG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3ZjBhYjkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9hdWRpb3BvbGljeS90ZXN0cy9yZXNvdXJjZXMvdGVzdF9hdWRpb19wb2xpY3lfY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSwxMTEgQEAKKzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJ5ZXMiPz4KKzwhLS0gQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKworICAgICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAgICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICAgICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKworICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorCisgICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAgICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgICAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAgICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCistLT4KKworPGF1ZGlvUG9saWN5Q29uZmlndXJhdGlvbiB2ZXJzaW9uPSIxLjAiIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIj4KKyAgICA8Z2xvYmFsQ29uZmlndXJhdGlvbiBzcGVha2VyX2RyY19lbmFibGVkPSJ0cnVlIi8+CisKKyAgICA8bW9kdWxlcz4KKyAgICAgICAgPCEtLSBQcmltYXJ5IG1vZHVsZSAtLT4KKyAgICAgICAgPG1vZHVsZSBuYW1lPSJwcmltYXJ5IiBoYWxWZXJzaW9uPSIyLjAiPgorICAgICAgICAgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgICAgICAgICA8aXRlbT5TcGVha2VyPC9pdGVtPgorICAgICAgICAgICAgICAgIDxpdGVtPkJ1aWx0LUluIE1pYzwvaXRlbT4KKyAgICAgICAgICAgIDwvYXR0YWNoZWREZXZpY2VzPgorICAgICAgICAgICAgPGRlZmF1bHRPdXRwdXREZXZpY2U+U3BlYWtlcjwvZGVmYXVsdE91dHB1dERldmljZT4KKyAgICAgICAgICAgIDxtaXhQb3J0cz4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJwcmltYXJ5IG91dHB1dCIgcm9sZT0ic291cmNlIiBmbGFncz0iQVVESU9fT1VUUFVUX0ZMQUdfUFJJTUFSWSI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9PVVRfU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9InByaW1hcnkgaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9Im1peHBvcnRfYnRfaGZwX291dHB1dCIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgICAgICAgICA8L21peFBvcnQ+CisgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0ibWl4cG9ydF9idF9oZnBfaW5wdXQiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjgwMDAsMTEwMjUsMTYwMDAsNDQxMDAsNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8sQVVESU9fQ0hBTk5FTF9JTl9NT05PIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICAgPC9taXhQb3J0cz4KKyAgICAgICAgICAgIDxkZXZpY2VQb3J0cz4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJTcGVha2VyIiB0eXBlPSJBVURJT19ERVZJQ0VfT1VUX1NQRUFLRVIiIHJvbGU9InNpbmsiPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCdWlsdC1JbiBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9CVUlMVElOX01JQyIgcm9sZT0ic291cmNlIj4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iSGRtaSIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9IRE1JIiByb2xlPSJzaW5rIj4KKyAgICAgICAgICAgICAgICA8L2RldmljZVBvcnQ+CisgICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iSGRtaS1JbiBNaWMiIHR5cGU9IkFVRElPX0RFVklDRV9JTl9IRE1JIiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJCVCBTQ08iIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfQkxVRVRPT1RIX1NDTyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPSJzaW5rIiBhZGRyZXNzPSJoZnBfY2xpZW50X291dCI+CisgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJUIFNDTyBIZWFkc2V0IE1pYyIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0JMVUVUT09USF9TQ09fSEVBRFNFVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb2xlPSJzb3VyY2UiIGFkZHJlc3M9ImhmcF9jbGllbnRfaW4iPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgIDwvZGV2aWNlUG9ydHM+CisgICAgICAgICAgICA8cm91dGVzPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IlNwZWFrZXIiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9InByaW1hcnkgb3V0cHV0Ii8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0icHJpbWFyeSBpbnB1dCIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0iQnVpbHQtSW4gTWljLEhkbWktSW4gTWljIi8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0iSGRtaSIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0icHJpbWFyeSBvdXRwdXQiLz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJCVCBTQ08iCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9Im1peHBvcnRfYnRfaGZwX291dHB1dCIvPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9Im1peHBvcnRfYnRfaGZwX2lucHV0IgorICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJCVCBTQ08gSGVhZHNldCBNaWMiLz4KKyAgICAgICAgICAgIDwvcm91dGVzPgorICAgICAgICA8L21vZHVsZT4KKworICAgICAgICA8IS0tIFJlbW90ZSBTdWJtaXggbW9kdWxlIC0tPgorICAgICAgICA8bW9kdWxlIG5hbWU9InJfc3VibWl4IiBoYWxWZXJzaW9uPSIyLjAiPgorICAgICAgICAgICAgPGF0dGFjaGVkRGV2aWNlcz4KKyAgICAgICAgICAgICAgICA8aXRlbT5SZW1vdGUgU3VibWl4IEluPC9pdGVtPgorICAgICAgICAgICAgPC9hdHRhY2hlZERldmljZXM+CisgICAgICAgICAgICA8bWl4UG9ydHM+CisgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0icl9zdWJtaXggb3V0cHV0IiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgICAgICAgICA8cHJvZmlsZSBuYW1lPSIiIGZvcm1hdD0iQVVESU9fRk9STUFUX1BDTV8xNl9CSVQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgICAgIDwvbWl4UG9ydD4KKyAgICAgICAgICAgICAgICA8bWl4UG9ydCBuYW1lPSJyX3N1Ym1peCBpbnB1dCIgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfSU5fU1RFUkVPIi8+CisgICAgICAgICAgICAgICAgPC9taXhQb3J0PgorICAgICAgICAgICA8L21peFBvcnRzPgorICAgICAgICAgICA8ZGV2aWNlUG9ydHM+CisgICAgICAgICAgICAgICA8ZGV2aWNlUG9ydCB0YWdOYW1lPSJSZW1vdGUgU3VibWl4IE91dCIgdHlwZT0iQVVESU9fREVWSUNFX09VVF9SRU1PVEVfU1VCTUlYIiAgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNhbXBsaW5nUmF0ZXM9IjQ4MDAwIiBjaGFubmVsTWFza3M9IkFVRElPX0NIQU5ORUxfT1VUX1NURVJFTyIvPgorICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgICAgPGRldmljZVBvcnQgdGFnTmFtZT0iUmVtb3RlIFN1Ym1peCBJbiIgdHlwZT0iQVVESU9fREVWSUNFX0lOX1JFTU9URV9TVUJNSVgiICByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX0lOX1NURVJFTyIvPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgIDwvZGV2aWNlUG9ydHM+CisgICAgICAgICAgICA8cm91dGVzPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IlJlbW90ZSBTdWJtaXggT3V0IgorICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VzPSJyX3N1Ym1peCBvdXRwdXQiLz4KKyAgICAgICAgICAgICAgICA8cm91dGUgdHlwZT0ibWl4IiBzaW5rPSJyX3N1Ym1peCBpbnB1dCIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0iUmVtb3RlIFN1Ym1peCBJbiIvPgorICAgICAgICAgICAgPC9yb3V0ZXM+CisgICAgICAgIDwvbW9kdWxlPgorICAgIDwvbW9kdWxlcz4KKzwvYXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uPgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvYXVkaW9wb2xpY3kvdGVzdHMvcmVzb3VyY2VzL3Rlc3RfYXVkaW9fcG9saWN5X3ByaW1hcnlfb25seV9jb25maWd1cmF0aW9uLnhtbCBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy90ZXN0X2F1ZGlvX3BvbGljeV9wcmltYXJ5X29ubHlfY29uZmlndXJhdGlvbi54bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRjMGFkYgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2F1ZGlvcG9saWN5L3Rlc3RzL3Jlc291cmNlcy90ZXN0X2F1ZGlvX3BvbGljeV9wcmltYXJ5X29ubHlfY29uZmlndXJhdGlvbi54bWwKQEAgLTAsMCArMSw1MyBAQAorPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9InllcyI/PgorPCEtLSBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorCisgICAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICAgICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgICAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorCisgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisKKyAgICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICAgICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAgICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICAgICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKy0tPgorCis8YXVkaW9Qb2xpY3lDb25maWd1cmF0aW9uIHZlcnNpb249IjEuMCIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPgorICAgIDxnbG9iYWxDb25maWd1cmF0aW9uIHNwZWFrZXJfZHJjX2VuYWJsZWQ9InRydWUiLz4KKworICAgIDxtb2R1bGVzPgorICAgICAgICA8IS0tIFByaW1hcnkgbW9kdWxlIC0tPgorICAgICAgICA8bW9kdWxlIG5hbWU9InByaW1hcnkiIGhhbFZlcnNpb249IjIuMCI+CisgICAgICAgICAgICA8YXR0YWNoZWREZXZpY2VzPgorICAgICAgICAgICAgICAgIDxpdGVtPlNwZWFrZXI8L2l0ZW0+CisgICAgICAgICAgICAgICAgPGl0ZW0+QnVpbHQtSW4gTWljPC9pdGVtPgorICAgICAgICAgICAgPC9hdHRhY2hlZERldmljZXM+CisgICAgICAgICAgICA8ZGVmYXVsdE91dHB1dERldmljZT5TcGVha2VyPC9kZWZhdWx0T3V0cHV0RGV2aWNlPgorICAgICAgICAgICAgPG1peFBvcnRzPgorICAgICAgICAgICAgICAgIDxtaXhQb3J0IG5hbWU9InByaW1hcnkgb3V0cHV0IiByb2xlPSJzb3VyY2UiIGZsYWdzPSJBVURJT19PVVRQVVRfRkxBR19QUklNQVJZIj4KKyAgICAgICAgICAgICAgICAgICAgPHByb2ZpbGUgbmFtZT0iIiBmb3JtYXQ9IkFVRElPX0ZPUk1BVF9QQ01fMTZfQklUIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzYW1wbGluZ1JhdGVzPSI0ODAwMCIgY2hhbm5lbE1hc2tzPSJBVURJT19DSEFOTkVMX09VVF9TVEVSRU8iLz4KKyAgICAgICAgICAgICAgICA8L21peFBvcnQ+CisgICAgICAgICAgICAgICAgPG1peFBvcnQgbmFtZT0icHJpbWFyeSBpbnB1dCIgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgICAgIDxwcm9maWxlIG5hbWU9IiIgZm9ybWF0PSJBVURJT19GT1JNQVRfUENNXzE2X0JJVCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxpbmdSYXRlcz0iNDgwMDAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYW5uZWxNYXNrcz0iQVVESU9fQ0hBTk5FTF9JTl9TVEVSRU8iLz4KKyAgICAgICAgICAgICAgICA8L21peFBvcnQ+CisgICAgICAgICAgICA8L21peFBvcnRzPgorICAgICAgICAgICAgPGRldmljZVBvcnRzPgorICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IlNwZWFrZXIiIHR5cGU9IkFVRElPX0RFVklDRV9PVVRfU1BFQUtFUiIgcm9sZT0ic2luayI+CisgICAgICAgICAgICAgICAgPC9kZXZpY2VQb3J0PgorICAgICAgICAgICAgICAgIDxkZXZpY2VQb3J0IHRhZ05hbWU9IkJ1aWx0LUluIE1pYyIgdHlwZT0iQVVESU9fREVWSUNFX0lOX0JVSUxUSU5fTUlDIiByb2xlPSJzb3VyY2UiPgorICAgICAgICAgICAgICAgIDwvZGV2aWNlUG9ydD4KKyAgICAgICAgICAgIDwvZGV2aWNlUG9ydHM+CisgICAgICAgICAgICA8cm91dGVzPgorICAgICAgICAgICAgICAgIDxyb3V0ZSB0eXBlPSJtaXgiIHNpbms9IlNwZWFrZXIiCisgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZXM9InByaW1hcnkgb3V0cHV0Ii8+CisgICAgICAgICAgICAgICAgPHJvdXRlIHR5cGU9Im1peCIgc2luaz0icHJpbWFyeSBpbnB1dCIKKyAgICAgICAgICAgICAgICAgICAgICAgc291cmNlcz0iQnVpbHQtSW4gTWljIi8+CisgICAgICAgICAgICA8L3JvdXRlcz4KKyAgICAgICAgPC9tb2R1bGU+CisgICAgPC9tb2R1bGVzPgorPC9hdWRpb1BvbGljeUNvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvT1dORVJTIGIvc2VydmljZXMvY2FtZXJhL09XTkVSUwppbmRleCAxOGFjZmVlLi5mNDhhOTVjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvT1dORVJTCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9PV05FUlMKQEAgLTEsNiArMSBAQAotY3ljaGVuQGdvb2dsZS5jb20KLWVwZWV2QGdvb2dsZS5jb20KLWV0YWx2YWxhQGdvb2dsZS5jb20KLXNodXpoZW53YW5nQGdvb2dsZS5jb20KLXlpbmNoaWF5ZWhAZ29vZ2xlLmNvbQotemhpanVuaGVAZ29vZ2xlLmNvbQoraW5jbHVkZSBwbGF0Zm9ybS9mcmFtZXdvcmtzL2F2Oi9jYW1lcmEvT1dORVJTCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLmJwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNzJhZmQyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5icApAQCAtMCwwICsxLDE4MSBAQAorLy8gQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8KKy8vIGxpYmNhbWVyYXNlcnZpY2UKKy8vCisKK2NjX2xpYnJhcnlfc2hhcmVkIHsKKyAgICBuYW1lOiAibGliY2FtZXJhc2VydmljZSIsCisKKyAgICAvLyBDYW1lcmEgc2VydmljZSBzb3VyY2UKKworICAgIHNyY3M6IFsKKyAgICAgICAgIkNhbWVyYVNlcnZpY2UuY3BwIiwKKyAgICAgICAgIkNhbWVyYUZsYXNobGlnaHQuY3BwIiwKKyAgICAgICAgImNvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAiLAorICAgICAgICAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuY3BwIiwKKyAgICAgICAgImNvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwIiwKKyAgICAgICAgImNvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwIiwKKyAgICAgICAgImFwaTEvQ2FtZXJhQ2xpZW50LmNwcCIsCisgICAgICAgICJhcGkxL0NhbWVyYTJDbGllbnQuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcCIsCisgICAgICAgICJhcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9KcGVnQ29tcHJlc3Nvci5jcHAiLAorICAgICAgICAiYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwIiwKKyAgICAgICAgImFwaTEvY2xpZW50Mi9ac2xQcm9jZXNzb3IuY3BwIiwKKyAgICAgICAgImFwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcCIsCisgICAgICAgICJhcGkyL0NvbXBvc2l0ZVN0cmVhbS5jcHAiLAorICAgICAgICAiYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5jcHAiLAorICAgICAgICAiYXBpMi9IZWljRW5jb2RlckluZm9NYW5hZ2VyLmNwcCIsCisgICAgICAgICJhcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM0RldmljZS5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcCIsCisgICAgICAgICJkZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwIiwKKyAgICAgICAgImRldmljZTMvU3RhdHVzVHJhY2tlci5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5jcHAiLAorICAgICAgICAiZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwIiwKKyAgICAgICAgImRldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAiLAorICAgICAgICAiZ3VpL1JpbmdCdWZmZXJDb25zdW1lci5jcHAiLAorICAgICAgICAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuY3BwIiwKKyAgICAgICAgImhpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5jcHAiLAorICAgICAgICAiaGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmNwcCIsCisgICAgICAgICJoaWRsL0NvbnZlcnQuY3BwIiwKKyAgICAgICAgImhpZGwvSGlkbENhbWVyYURldmljZVVzZXIuY3BwIiwKKyAgICAgICAgImhpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwIiwKKyAgICAgICAgInV0aWxzL0NhbWVyYVRyYWNlcy5jcHAiLAorICAgICAgICAidXRpbHMvQXV0b0NvbmRpdGlvbkxvY2suY3BwIiwKKyAgICAgICAgInV0aWxzL0V4aWZVdGlscy5jcHAiLAorICAgICAgICAidXRpbHMvVGFnTW9uaXRvci5jcHAiLAorICAgICAgICAidXRpbHMvTGF0ZW5jeUhpc3RvZ3JhbS5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFkcm1faGVhZGVycyIKKyAgICBdLAorCisgICAgc2hhcmVkX2xpYnM6IFsKKyAgICAgICAgImxpYmJhc2UiLAorICAgICAgICAibGliZGwiLAorICAgICAgICAibGliZXhpZiIsCisgICAgICAgICJsaWJ1aSIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGlidXRpbHNjYWxsc3RhY2siLAorICAgICAgICAibGlidXRpbHMiLAorICAgICAgICAibGliYmluZGVyIiwKKyAgICAgICAgImxpYmN1dGlscyIsCisgICAgICAgICJsaWJtZWRpYSIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKKyAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLAorICAgICAgICAibGliY2FtZXJhX21ldGFkYXRhIiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJndWkiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGliaGlkbGJhc2UiLAorICAgICAgICAibGlianBlZyIsCisgICAgICAgICJsaWJtZWRpYV9jb2RlY2xpc3QiLAorICAgICAgICAibGlibWVkaWFfb214IiwKKyAgICAgICAgImxpYm1lbXVucmVhY2hhYmxlIiwKKyAgICAgICAgImxpYnNlbnNvcnByaXZhY3kiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHQiLAorICAgICAgICAibGlic3RhZ2VmcmlnaHRfZm91bmRhdGlvbiIsCisgICAgICAgICJsaWJ5dXYiLAorICAgICAgICAiYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2UuY29tbW9uQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5zZXJ2aWNlQDIuMCIsCisgICAgICAgICJhbmRyb2lkLmZyYW1ld29ya3MuY2FtZXJhc2VydmljZS5kZXZpY2VAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMyIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40IiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmRldmljZUAzLjUiLAorICAgIF0sCisKKyAgICBzdGF0aWNfbGliczogWworICAgICAgICAibGliYmluZGVydGhyZWFkc3RhdGV1dGlscyIsCisgICAgXSwKKworICAgIGV4cG9ydF9zaGFyZWRfbGliX2hlYWRlcnM6IFsKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjYW1lcmFfY2xpZW50IiwKKyAgICAgICAgImxpYmZtcSIsCisgICAgICAgICJsaWJzZW5zb3Jwcml2YWN5IiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbCisgICAgICAgICJzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSIsCisgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAorICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9uZGsiLAorICAgICAgICAiZXh0ZXJuYWwvZHluYW1pY19kZXB0aC9pbmNsdWRlcyIsCisgICAgICAgICJleHRlcm5hbC9keW5hbWljX2RlcHRoL2ludGVybmFsIiwKKyAgICBdLAorCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXh0cmEiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgICAgICItV25vLWlnbm9yZWQtcXVhbGlmaWVycyIsCisgICAgXSwKKworfQorCitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYmRlcHRocGhvdG8iLAorCisgICAgc3JjczogWworICAgICAgICAidXRpbHMvRXhpZlV0aWxzLmNwcCIsCisgICAgICAgICJjb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliaW1hZ2VfaW8iLAorICAgICAgICAibGliZHluYW1pY19kZXB0aCIsCisgICAgICAgICJsaWJ4bWwyIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJ1dGlsc2NhbGxzdGFjayIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGlianBlZyIsCisgICAgICAgICJsaWJtZW11bnJlYWNoYWJsZSIsCisgICAgICAgICJsaWJleGlmIiwKKyAgICAgICAgImxpYmNhbWVyYV9jbGllbnQiLAorICAgIF0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsKKyAgICAgICAgImV4dGVybmFsL2R5bmFtaWNfZGVwdGgvaW5jbHVkZXMiLAorICAgICAgICAiZXh0ZXJuYWwvZHluYW1pY19kZXB0aC9pbnRlcm5hbCIsCisgICAgXSwKKworICAgIGV4cG9ydF9pbmNsdWRlX2RpcnM6IFsiLiJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2V4dHJhIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVduby1pZ25vcmVkLXF1YWxpZmllcnMiLAorICAgIF0sCisKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9BbmRyb2lkLm1rCmluZGV4IDk2MjYxYWIuLjRjZmVjZmQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQW5kcm9pZC5tawpAQCAtMTQsOTEgKzE0LDkgQEAKIAogTE9DQUxfUEFUSDo9ICQoY2FsbCBteS1kaXIpCiAKLSMKLSMgbGliY2FtZXJhc2VydmljZQotIwotCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKIAotIyBDYW1lcmEgc2VydmljZSBzb3VyY2UKLQotTE9DQUxfU1JDX0ZJTEVTIDo9ICBcCi0gICAgQ2FtZXJhU2VydmljZS5jcHAgXAotICAgIENhbWVyYUZsYXNobGlnaHQuY3BwIFwKLSAgICBjb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwIFwKLSAgICBjb21tb24vQ2FtZXJhRGV2aWNlQmFzZS5jcHAgXAotICAgIGNvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwIFwKLSAgICBjb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmNwcCBcCi0gICAgYXBpMS9DYW1lcmFDbGllbnQuY3BwIFwKLSAgICBhcGkxL0NhbWVyYTJDbGllbnQuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9TdHJlYW1pbmdQcm9jZXNzb3IuY3BwIFwKLSAgICBhcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9DYWxsYmFja1Byb2Nlc3Nvci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9KcGVnQ29tcHJlc3Nvci5jcHAgXAotICAgIGFwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcCBcCi0gICAgYXBpMS9jbGllbnQyL1pzbFByb2Nlc3Nvci5jcHAgXAotICAgIGFwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcCBcCi0gICAgZGV2aWNlMS9DYW1lcmFIYXJkd2FyZUludGVyZmFjZS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM0RldmljZS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAgXAotICAgIGRldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwIFwKLSAgICBkZXZpY2UzL1N0YXR1c1RyYWNrZXIuY3BwIFwKLSAgICBkZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcCBcCi0gICAgZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwIFwKLSAgICBkZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwIFwKLSAgICBndWkvUmluZ0J1ZmZlckNvbnN1bWVyLmNwcCBcCi0gICAgdXRpbHMvQ2FtZXJhVHJhY2VzLmNwcCBcCi0gICAgdXRpbHMvQXV0b0NvbmRpdGlvbkxvY2suY3BwIFwKLSAgICB1dGlscy9UYWdNb25pdG9yLmNwcCBcCi0gICAgdXRpbHMvTGF0ZW5jeUhpc3RvZ3JhbS5jcHAKLQotTE9DQUxfU0hBUkVEX0xJQlJBUklFUzo9IFwKLSAgICBsaWJ1aSBcCi0gICAgbGlibG9nIFwKLSAgICBsaWJ1dGlsc2NhbGxzdGFjayBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmJpbmRlciBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJtZWRpYSBcCi0gICAgbGlibWVkaWF1dGlscyBcCi0gICAgbGliY2FtZXJhX2NsaWVudCBcCi0gICAgbGliY2FtZXJhX21ldGFkYXRhIFwKLSAgICBsaWJmbXEgXAotICAgIGxpYmd1aSBcCi0gICAgbGliaGFyZHdhcmUgXAotICAgIGxpYmhpZGxiYXNlIFwKLSAgICBsaWJoaWRsdHJhbnNwb3J0IFwKLSAgICBsaWJqcGVnIFwKLSAgICBsaWJtZW11bnJlYWNoYWJsZSBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuY29tbW9uQDEuMCBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40IFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4zIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy40Ci0KLUxPQ0FMX0VYUE9SVF9TSEFSRURfTElCUkFSWV9IRUFERVJTIDo9IGxpYmJpbmRlciBsaWJjYW1lcmFfY2xpZW50IGxpYmZtcQotCi1MT0NBTF9DX0lOQ0xVREVTICs9IFwKLSAgICBzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSBcCi0gICAgZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9vcGVubWF4Ci0KLUxPQ0FMX0VYUE9SVF9DX0lOQ0xVREVfRElSUyA6PSBcCi0gICAgZnJhbWV3b3Jrcy9hdi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZQotCi1MT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yCi0KLUxPQ0FMX01PRFVMRTo9IGxpYmNhbWVyYXNlcnZpY2UKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi0jIEJ1aWxkIHRlc3RzIHRvbworIyBCdWlsZCB0ZXN0cwogCiBpbmNsdWRlICQoTE9DQUxfUEFUSCkvdGVzdHMvQW5kcm9pZC5tawogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCmluZGV4IDhhNzUyYjEuLjU5NWMzZTggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuY3BwCkBAIC0zMyw2ICszMyw3IEBACiAKICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbWFjcm9zLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3BhcnNlaW50Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGJpbmRlci9BY3Rpdml0eU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvQXBwT3BzTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgpAQCAtNDIsMTEgKzQzLDE1IEBACiAjaW5jbHVkZSA8YmluZGVyL1Blcm1pc3Npb25Db250cm9sbGVyLmg+CiAjaW5jbHVkZSA8YmluZGVyL1Byb2Nlc3NJbmZvU2VydmljZS5oPgogI2luY2x1ZGUgPGJpbmRlci9JUmVzdWx0UmVjZWl2ZXIuaD4KKyNpbmNsdWRlIDxiaW5kZXJ0aHJlYWRzdGF0ZS9DYWxsZXJVdGlscy5oPgogI2luY2x1ZGUgPGN1dGlscy9hdG9taWMuaD4KICNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGN1dGlscy9taXNjLmg+CiAjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgorI2luY2x1ZGUgImhpZGwvSGlkbENhbWVyYVNlcnZpY2UuaCIKKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDxtZW11bnJlYWNoYWJsZS9tZW11bnJlYWNoYWJsZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CiAjaW5jbHVkZSA8bWVkaWEvSU1lZGlhSFRUUFNlcnZpY2UuaD4KQEAgLTY5LDYgKzc0LDcgQEAKICNpbmNsdWRlICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgogI2luY2x1ZGUgInV0aWxzL0NhbWVyYVRyYWNlcy5oIgogI2luY2x1ZGUgInV0aWxzL1RhZ01vbml0b3IuaCIKKyNpbmNsdWRlICJ1dGlscy9DYW1lcmFUaHJlYWRTdGF0ZS5oIgogCiBuYW1lc3BhY2UgewogICAgIGNvbnN0IGNoYXIqIGtQZXJtaXNzaW9uU2VydmljZU5hbWUgPSAicGVybWlzc2lvbiI7CkBAIC03Niw3ICs4Miw5IEBACiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAordXNpbmcgYmFzZTo6U3RyaW5nUHJpbnRmOwogdXNpbmcgYmluZGVyOjpTdGF0dXM7Cit1c2luZyBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SGlkbENhbWVyYVNlcnZpY2U7CiB1c2luZyBoYXJkd2FyZTo6SUNhbWVyYTsKIHVzaW5nIGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50OwogdXNpbmcgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlUHJveHk7CkBAIC0xMTEsNiArMTE5LDE0IEBACiAKIHN0YXRpYyBjb25zdCBTdHJpbmcxNiBzTWFuYWdlQ2FtZXJhUGVybWlzc2lvbigiYW5kcm9pZC5wZXJtaXNzaW9uLk1BTkFHRV9DQU1FUkEiKTsKIAorLy8gTWF0Y2hlcyB3aXRoIFBFUkNFUFRJQkxFX0FQUF9BREogaW4gUHJvY2Vzc0xpc3QuamF2YQorc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IGtWZW5kb3JDbGllbnRTY29yZSA9IDIwMDsKKy8vIE1hdGNoZXMgd2l0aCBQUk9DRVNTX1NUQVRFX1BFUlNJU1RFTlRfVUkgaW4gQWN0aXZpdHlNYW5hZ2VyLmphdmEKK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBrVmVuZG9yQ2xpZW50U3RhdGUgPSAxOworCitNdXRleCBDYW1lcmFTZXJ2aWNlOjpzUHJveHlNdXRleDsKK3NwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZVByb3h5PiBDYW1lcmFTZXJ2aWNlOjpzQ2FtZXJhU2VydmljZVByb3h5OworCiBDYW1lcmFTZXJ2aWNlOjpDYW1lcmFTZXJ2aWNlKCkgOgogICAgICAgICBtRXZlbnRMb2coREVGQVVMVF9FVkVOVF9MT0dfTEVOR1RIKSwKICAgICAgICAgbU51bWJlck9mQ2FtZXJhcygwKSwKQEAgLTEzNywxMCArMTUzLDIwIEBACiAgICAgICAgIG1Jbml0aWFsaXplZCA9IHRydWU7CiAgICAgfQogCi0gICAgQ2FtZXJhU2VydmljZTo6cGluZ0NhbWVyYVNlcnZpY2VQcm94eSgpOwotCiAgICAgbVVpZFBvbGljeSA9IG5ldyBVaWRQb2xpY3kodGhpcyk7CiAgICAgbVVpZFBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CisgICAgbVNlbnNvclByaXZhY3lQb2xpY3kgPSBuZXcgU2Vuc29yUHJpdmFjeVBvbGljeSh0aGlzKTsKKyAgICBtU2Vuc29yUHJpdmFjeVBvbGljeS0+cmVnaXN0ZXJTZWxmKCk7CisgICAgc3A8SGlkbENhbWVyYVNlcnZpY2U+IGhjcyA9IEhpZGxDYW1lcmFTZXJ2aWNlOjpnZXRJbnN0YW5jZSh0aGlzKTsKKyAgICBpZiAoaGNzLT5yZWdpc3RlckFzU2VydmljZSgpICE9IGFuZHJvaWQ6Ok9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIGRlZmF1bHQgYW5kcm9pZC5mcmFtZXdvcmtzLmNhbWVyYXNlcnZpY2Uuc2VydmljZUAxLjAiLAorICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgIH0KKworICAgIC8vIFRoaXMgbmVlZHMgdG8gYmUgbGFzdCBjYWxsIGluIHRoaXMgZnVuY3Rpb24sIHNvIHRoYXQgaXQncyBhcyBjbG9zZSB0bworICAgIC8vIFNlcnZpY2VNYW5hZ2VyOjphZGRTZXJ2aWNlKCkgYXMgcG9zc2libGUuCisgICAgQ2FtZXJhU2VydmljZTo6cGluZ0NhbWVyYVNlcnZpY2VQcm94eSgpOworICAgIEFMT0dJKCJDYW1lcmFTZXJ2aWNlIHBpbmdlZCBjYW1lcmFzZXJ2aWNlIHByb3h5Iik7CiB9CiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmVudW1lcmF0ZVByb3ZpZGVycygpIHsKQEAgLTE5MCwxOCArMjE2LDIwIEBACiB9CiAKIHNwPElDYW1lcmFTZXJ2aWNlUHJveHk+IENhbWVyYVNlcnZpY2U6OmdldENhbWVyYVNlcnZpY2VQcm94eSgpIHsKLSAgICBzcDxJQ2FtZXJhU2VydmljZVByb3h5PiBwcm94eUJpbmRlciA9IG51bGxwdHI7CiAjaWZuZGVmIF9fQlJJTExPX18KLSAgICBzcDxJU2VydmljZU1hbmFnZXI+IHNtID0gZGVmYXVsdFNlcnZpY2VNYW5hZ2VyKCk7Ci0gICAgLy8gVXNlIGNoZWNrU2VydmljZSBiZWNhdXNlIGNhbWVyYXNlcnZlciBub3JtYWxseSBzdGFydHMgYmVmb3JlIHRoZQotICAgIC8vIHN5c3RlbSBzZXJ2ZXIgYW5kIHRoZSBwcm94eSBzZXJ2aWNlLiBTbyB0aGUgbG9uZyB0aW1lb3V0IHRoYXQgZ2V0U2VydmljZQotICAgIC8vIGhhcyBiZWZvcmUgZ2l2aW5nIHVwIGlzIGluYXBwcm9wcmlhdGUuCi0gICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmNoZWNrU2VydmljZShTdHJpbmcxNigibWVkaWEuY2FtZXJhLnByb3h5IikpOwotICAgIGlmIChiaW5kZXIgIT0gbnVsbHB0cikgewotICAgICAgICBwcm94eUJpbmRlciA9IGludGVyZmFjZV9jYXN0PElDYW1lcmFTZXJ2aWNlUHJveHk+KGJpbmRlcik7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKHNQcm94eU11dGV4KTsKKyAgICBpZiAoc0NhbWVyYVNlcnZpY2VQcm94eSA9PSBudWxscHRyKSB7CisgICAgICAgIHNwPElTZXJ2aWNlTWFuYWdlcj4gc20gPSBkZWZhdWx0U2VydmljZU1hbmFnZXIoKTsKKyAgICAgICAgLy8gVXNlIGNoZWNrU2VydmljZSBiZWNhdXNlIGNhbWVyYXNlcnZlciBub3JtYWxseSBzdGFydHMgYmVmb3JlIHRoZQorICAgICAgICAvLyBzeXN0ZW0gc2VydmVyIGFuZCB0aGUgcHJveHkgc2VydmljZS4gU28gdGhlIGxvbmcgdGltZW91dCB0aGF0IGdldFNlcnZpY2UKKyAgICAgICAgLy8gaGFzIGJlZm9yZSBnaXZpbmcgdXAgaXMgaW5hcHByb3ByaWF0ZS4KKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gc20tPmNoZWNrU2VydmljZShTdHJpbmcxNigibWVkaWEuY2FtZXJhLnByb3h5IikpOworICAgICAgICBpZiAoYmluZGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNDYW1lcmFTZXJ2aWNlUHJveHkgPSBpbnRlcmZhY2VfY2FzdDxJQ2FtZXJhU2VydmljZVByb3h5PihiaW5kZXIpOworICAgICAgICB9CiAgICAgfQogI2VuZGlmCi0gICAgcmV0dXJuIHByb3h5QmluZGVyOworICAgIHJldHVybiBzQ2FtZXJhU2VydmljZVByb3h5OwogfQogCiB2b2lkIENhbWVyYVNlcnZpY2U6OnBpbmdDYW1lcmFTZXJ2aWNlUHJveHkoKSB7CkBAIC0yMTQsMTkgKzI0MiwyOSBAQAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMaXN0ZW5lckxvY2spOwogCiAgICAgZm9yIChhdXRvJiBpIDogbUxpc3RlbmVyTGlzdCkgewotICAgICAgICBpLT5vblRvcmNoU3RhdHVzQ2hhbmdlZChtYXBUb0ludGVyZmFjZShzdGF0dXMpLCBTdHJpbmcxNntjYW1lcmFJZH0pOworICAgICAgICBpLnNlY29uZC0+Z2V0TGlzdGVuZXIoKS0+b25Ub3JjaFN0YXR1c0NoYW5nZWQobWFwVG9JbnRlcmZhY2Uoc3RhdHVzKSwgU3RyaW5nMTZ7Y2FtZXJhSWR9KTsKICAgICB9CiB9CiAKIENhbWVyYVNlcnZpY2U6On5DYW1lcmFTZXJ2aWNlKCkgewogICAgIFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNsZWFyR2xvYmFsVmVuZG9yVGFnRGVzY3JpcHRvcigpOwogICAgIG1VaWRQb2xpY3ktPnVucmVnaXN0ZXJTZWxmKCk7CisgICAgbVNlbnNvclByaXZhY3lQb2xpY3ktPnVucmVnaXN0ZXJTZWxmKCk7CiB9CiAKIHZvaWQgQ2FtZXJhU2VydmljZTo6b25OZXdQcm92aWRlclJlZ2lzdGVyZWQoKSB7CiAgICAgZW51bWVyYXRlUHJvdmlkZXJzKCk7CiB9CiAKK2Jvb2wgQ2FtZXJhU2VydmljZTo6aXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkKSB7CisgICAgYXV0byBzdGF0ZSA9IGdldENhbWVyYVN0YXRlKGNhbWVyYUlkKTsKKyAgICBpZiAoc3RhdGUgIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gc3RhdGUtPmlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYSgpOworICAgIH0KKyAgICAvLyBIaWRkZW4gcGh5c2ljYWwgY2FtZXJhIGlkcyB3b24ndCBoYXZlIENhbWVyYVN0YXRlCisgICAgcmV0dXJuIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYShjYW1lcmFJZC5jX3N0cigpKTsKK30KKwogdm9pZCBDYW1lcmFTZXJ2aWNlOjp1cGRhdGVDYW1lcmFOdW1BbmRJZHMoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVNlcnZpY2VMb2NrKTsKICAgICBtTnVtYmVyT2ZDYW1lcmFzID0gbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+Z2V0Q2FtZXJhQ291bnQoKTsKQEAgLTI0Miw2ICsyODAsOCBAQAogICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHF1ZXJ5IGRldmljZSByZXNvdXJjZSBjb3N0OiAlcyAoJWQpIiwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgIHJldHVybjsKICAgICB9CisgICAgYm9vbCBpc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEgPQorICAgICAgICAgICAgbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+aXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhKGlkLnN0cmluZygpKTsKICAgICBzdGQ6OnNldDxTdHJpbmc4PiBjb25mbGljdGluZzsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvc3QuY29uZmxpY3RpbmdEZXZpY2VzLnNpemUoKTsgaSsrKSB7CiAgICAgICAgIGNvbmZsaWN0aW5nLmVtcGxhY2UoU3RyaW5nOChjb3N0LmNvbmZsaWN0aW5nRGV2aWNlc1tpXS5jX3N0cigpKSk7CkBAIC0yNTAsNyArMjkwLDggQEAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1DYW1lcmFTdGF0ZXNMb2NrKTsKICAgICAgICAgbUNhbWVyYVN0YXRlcy5lbXBsYWNlKGlkLCBzdGQ6Om1ha2Vfc2hhcmVkPENhbWVyYVN0YXRlPihpZCwgY29zdC5yZXNvdXJjZUNvc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RpbmcpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25mbGljdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEpKTsKICAgICB9CiAKICAgICBpZiAobUZsYXNobGlnaHQtPmhhc0ZsYXNoVW5pdChpZCkpIHsKQEAgLTMzNyw3ICszNzgsNyBAQAogICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRCwKICAgICAgICAgICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhc3t9KTsKICAgICAgICAgICAgIC8vIEVuc3VyZSBub3QgaW4gYmluZGVyIFJQQyBzbyBjbGllbnQgZGlzY29ubmVjdCBQSUQgY2hlY2tzIHdvcmsgY29ycmVjdGx5Ci0gICAgICAgICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKGdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWQoKSwKKyAgICAgICAgICAgIExPR19BTFdBWVNfRkFUQUxfSUYoQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWQoKSwKICAgICAgICAgICAgICAgICAgICAgIm9uRGV2aWNlU3RhdHVzQ2hhbmdlZCBtdXN0IGJlIGNhbGxlZCBmcm9tIHRoZSBjYW1lcmEgc2VydmljZSBwcm9jZXNzISIpOwogICAgICAgICAgICAgY2xpZW50VG9EaXNjb25uZWN0LT5kaXNjb25uZWN0KCk7CiAgICAgICAgIH0KQEAgLTQ4OCw4ICs1MjksMTYgQEAKICAgICAgICAgICAgICAgICAiQ2FtZXJhIHN1YnN5c3RlbSBpcyBub3QgYXZhaWxhYmxlIik7OwogICAgIH0KIAotICAgIFN0YXR1cyByZXR7fTsKKyAgICBpZiAoc2hvdWxkUmVqZWN0SGlkZGVuQ2FtZXJhQ29ubmVjdGlvbihTdHJpbmc4KGNhbWVyYUlkKSkpIHsKKyAgICAgICAgQUxPR1coIkF0dGVtcHRpbmcgdG8gcmV0cmlldmUgY2hhcmFjdGVyaXN0aWNzIGZvciBzeXN0ZW0tb25seSBjYW1lcmEgaWQgJXMsIHJlamVjdGVkIiwKKyAgICAgICAgICAgICAgU3RyaW5nOChjYW1lcmFJZCkuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9ESVNDT05ORUNURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJObyBjYW1lcmEgZGV2aWNlIHdpdGggSUQgXCIlc1wiIGN1cnJlbnRseSBhdmFpbGFibGUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSk7CiAKKyAgICB9CisKKyAgICBTdGF0dXMgcmV0e307CiAgICAgc3RhdHVzX3QgcmVzID0gbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAogICAgICAgICAgICAgU3RyaW5nOChjYW1lcmFJZCkuc3RyaW5nKCksIGNhbWVyYUluZm8pOwogICAgIGlmIChyZXMgIT0gT0spIHsKQEAgLTQ5OCwxNyArNTQ3LDM3IEBACiAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgfQogCisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nVWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiB0YWdzUmVtb3ZlZDsKKyAgICAvLyBJZiBpdCdzIG5vdCBjYWxsaW5nIGZyb20gY2FtZXJhc2VydmVyLCBjaGVjayB0aGUgcGVybWlzc2lvbi4KKyAgICBpZiAoKGNhbGxpbmdQaWQgIT0gZ2V0cGlkKCkpICYmCisgICAgICAgICAgICAhY2hlY2tQZXJtaXNzaW9uKFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBIiksIGNhbGxpbmdQaWQsIGNhbGxpbmdVaWQpKSB7CisgICAgICAgIHJlcyA9IGNhbWVyYUluZm8tPnJlbW92ZVBlcm1pc3Npb25FbnRyaWVzKAorICAgICAgICAgICAgICAgIG1DYW1lcmFQcm92aWRlck1hbmFnZXItPmdldFByb3ZpZGVyVGFnSWRMb2NrZWQoU3RyaW5nOChjYW1lcmFJZCkuc3RyaW5nKCkpLAorICAgICAgICAgICAgICAgICZ0YWdzUmVtb3ZlZCk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIGNhbWVyYUluZm8tPmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgIkZhaWxlZCB0byByZW1vdmUgY2FtZXJhIgorICAgICAgICAgICAgICAgICAgICAiIGNoYXJhY3RlcmlzdGljcyBuZWVkaW5nIGNhbWVyYSBwZXJtaXNzaW9uIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIXRhZ3NSZW1vdmVkLmVtcHR5KCkpIHsKKyAgICAgICAgcmVzID0gY2FtZXJhSW5mby0+dXBkYXRlKEFORFJPSURfUkVRVUVTVF9DSEFSQUNURVJJU1RJQ19LRVlTX05FRURJTkdfUEVSTUlTU0lPTiwKKyAgICAgICAgICAgICAgICB0YWdzUmVtb3ZlZC5kYXRhKCksIHRhZ3NSZW1vdmVkLnNpemUoKSk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIGNhbWVyYUluZm8tPmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgIkZhaWxlZCB0byBpbnNlcnQgY2FtZXJhICIKKyAgICAgICAgICAgICAgICAgICAgImtleXMgbmVlZGluZyBwZXJtaXNzaW9uIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLCBTdHJpbmc4KGNhbWVyYUlkKS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisKICAgICByZXR1cm4gcmV0OwogfQogCi1pbnQgQ2FtZXJhU2VydmljZTo6Z2V0Q2FsbGluZ1BpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotfQotCi1pbnQgQ2FtZXJhU2VydmljZTo6Z2V0Q2FsbGluZ1VpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpOwotfQotCiBTdHJpbmc4IENhbWVyYVNlcnZpY2U6OmdldEZvcm1hdHRlZEN1cnJlbnRUaW1lKCkgewogICAgIHRpbWVfdCBub3cgPSB0aW1lKG51bGxwdHIpOwogICAgIGNoYXIgZm9ybWF0dGVkVGltZVs2NF07CkBAIC01ODksNyArNjU4LDcgQEAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjptYWtlQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxJSW50ZXJmYWNlPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBmYWNpbmcsIGludCBjbGllbnRQaWQsIHVpZF90IGNsaWVudFVpZCwgaW50IHNlcnZpY2VQaWQsCi0gICAgICAgIGJvb2wgbGVnYWN5TW9kZSwgaW50IGhhbFZlcnNpb24sIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKKyAgICAgICAgaW50IGhhbFZlcnNpb24sIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKICAgICAgICAgLypvdXQqL3NwPEJhc2ljQ2xpZW50PiogY2xpZW50KSB7CiAKICAgICBpZiAoaGFsVmVyc2lvbiA8IDAgfHwgaGFsVmVyc2lvbiA9PSBkZXZpY2VWZXJzaW9uKSB7CkBAIC02MDEsNyArNjcwLDcgQEAKICAgICAgICAgICAgICAgICBzcDxJQ2FtZXJhQ2xpZW50PiB0bXAgPSBzdGF0aWNfY2FzdDxJQ2FtZXJhQ2xpZW50Kj4oY2FtZXJhQ2IuZ2V0KCkpOwogICAgICAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBhcGkxQ2FtZXJhSWQsIGZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBnZXRwaWQoKSwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBnZXRwaWQoKSk7CiAgICAgICAgICAgICB9IGVsc2UgeyAvLyBDYW1lcmEyIEFQSSByb3V0ZQogICAgICAgICAgICAgICAgIEFMT0dXKCJDYW1lcmEgdXNpbmcgb2xkIEhBTCB2ZXJzaW9uOiAlZCIsIGRldmljZVZlcnNpb24pOwogICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0RFUFJFQ0FURURfSEFMLApAQCAtNjE0LDEyICs2ODMsMTMgQEAKICAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM18yOgogICAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM6CiAgICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfNDoKKyAgICAgICAgICBjYXNlIENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181OgogICAgICAgICAgICAgaWYgKGVmZmVjdGl2ZUFwaUxldmVsID09IEFQSV8xKSB7IC8vIENhbWVyYTEgQVBJIHJvdXRlCiAgICAgICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKICAgICAgICAgICAgICAgICAqY2xpZW50ID0gbmV3IENhbWVyYTJDbGllbnQoY2FtZXJhU2VydmljZSwgdG1wLCBwYWNrYWdlTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBhcGkxQ2FtZXJhSWQsCiAgICAgICAgICAgICAgICAgICAgICAgICBmYWNpbmcsIGNsaWVudFBpZCwgY2xpZW50VWlkLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZVBpZCwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkKTsKICAgICAgICAgICAgIH0gZWxzZSB7IC8vIENhbWVyYTIgQVBJIHJvdXRlCiAgICAgICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHRtcCA9CiAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcyo+KGNhbWVyYUNiLmdldCgpKTsKQEAgLTY0Myw3ICs3MTMsNyBAQAogICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD4gdG1wID0gc3RhdGljX2Nhc3Q8SUNhbWVyYUNsaWVudCo+KGNhbWVyYUNiLmdldCgpKTsKICAgICAgICAgICAgICpjbGllbnQgPSBuZXcgQ2FtZXJhQ2xpZW50KGNhbWVyYVNlcnZpY2UsIHRtcCwgcGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgICAgIGFwaTFDYW1lcmFJZCwgZmFjaW5nLCBjbGllbnRQaWQsIGNsaWVudFVpZCwKLSAgICAgICAgICAgICAgICAgICAgc2VydmljZVBpZCwgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICAgICAgICAgIHNlcnZpY2VQaWQpOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgLy8gT3RoZXIgY29tYmluYXRpb25zIChlLmcuIEhBTDMueCBvcGVuIGFzIEhBTDIueCkgYXJlIG5vdCBzdXBwb3J0ZWQgeWV0LgogICAgICAgICAgICAgQUxPR0UoIkludmFsaWQgY2FtZXJhIEhBTCB2ZXJzaW9uICV4OiBIQUwgJXggZGV2aWNlIGNhbiBvbmx5IGJlIgpAQCAtNzMyLDcgKzgwMiw3IEBACiB9CiAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjppbml0aWFsaXplU2hpbU1ldGFkYXRhKGludCBjYW1lcmFJZCkgewotICAgIGludCB1aWQgPSBnZXRDYWxsaW5nVWlkKCk7CisgICAgaW50IHVpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAKICAgICBTdHJpbmcxNiBpbnRlcm5hbFBhY2thZ2VOYW1lKCJjYW1lcmFzZXJ2ZXIiKTsKICAgICBTdHJpbmc4IGlkID0gU3RyaW5nODo6Zm9ybWF0KCIlZCIsIGNhbWVyYUlkKTsKQEAgLTc0Miw4ICs4MTIsNyBAQAogICAgICAgICAgICAgc3A8SUNhbWVyYUNsaWVudD57bnVsbHB0cn0sIGlkLCBjYW1lcmFJZCwKICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCksCiAgICAgICAgICAgICBpbnRlcm5hbFBhY2thZ2VOYW1lLCB1aWQsIFVTRV9DQUxMSU5HX1BJRCwKLSAgICAgICAgICAgIEFQSV8xLCAvKmxlZ2FjeU1vZGUqLyBmYWxzZSwgLypzaGltVXBkYXRlT25seSovIHRydWUsCi0gICAgICAgICAgICAvKm91dCovIHRtcCkKKyAgICAgICAgICAgIEFQSV8xLCAvKnNoaW1VcGRhdGVPbmx5Ki8gdHJ1ZSwgLypvdXQqLyB0bXApCiAgICAgICAgICAgICApLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGluaXRpYWxpemluZyBzaGltIG1ldGFkYXRhOiAlcyIsIF9fRlVOQ1RJT05fXywgcmV0LnRvU3RyaW5nOCgpLnN0cmluZygpKTsKICAgICB9CkBAIC03ODIsOSArODUxLDkgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIGludDY0X3QgdG9rZW4gPSBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5jbGVhckNhbGxpbmdJZGVudGl0eSgpOworICAgIGludDY0X3QgdG9rZW4gPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKICAgICByZXQgPSBpbml0aWFsaXplU2hpbU1ldGFkYXRhKGNhbWVyYUlkKTsKLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CiAgICAgICAgIC8vIEVycm9yIGFscmVhZHkgbG9nZ2VkIGJ5IGNhbGxlZQogICAgICAgICByZXR1cm4gcmV0OwpAQCAtODI0LDYgKzg5MywyNSBAQAogICAgIH0KIH0KIAorc3RhdGljIHN0YXR1c190IGdldFVpZEZvclBhY2thZ2UoU3RyaW5nMTYgcGFja2FnZU5hbWUsIGludCB1c2VySWQsIC8qaW5vdXQqL3VpZF90JiB1aWQsIGludCBlcnIpIHsKKyAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwYzsKKyAgICB1aWQgPSBwYy5nZXRQYWNrYWdlVWlkKHBhY2thZ2VOYW1lLCAwKTsKKyAgICBpZiAodWlkIDw9IDApIHsKKyAgICAgICAgQUxPR0UoIlVua25vd24gcGFja2FnZTogJyVzJyIsIFN0cmluZzgocGFja2FnZU5hbWUpLnN0cmluZygpKTsKKyAgICAgICAgZHByaW50ZihlcnIsICJVbmtub3duIHBhY2thZ2U6ICclcydcbiIsIFN0cmluZzgocGFja2FnZU5hbWUpLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAodXNlcklkIDwgMCkgeworICAgICAgICBBTE9HRSgiSW52YWxpZCB1c2VyOiAlZCIsIHVzZXJJZCk7CisgICAgICAgIGRwcmludGYoZXJyLCAiSW52YWxpZCB1c2VyOiAlZFxuIiwgdXNlcklkKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICB1aWQgPSBtdWx0aXVzZXJfZ2V0X3VpZCh1c2VySWQsIHVpZCk7CisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6dmFsaWRhdGVDb25uZWN0TG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjbGllbnROYW1lOCwgLyppbm91dCovaW50JiBjbGllbnRVaWQsIC8qaW5vdXQqL2ludCYgY2xpZW50UGlkLAogICAgICAgICAvKm91dCovaW50JiBvcmlnaW5hbENsaWVudFBpZCkgY29uc3QgewpAQCAtODQxLDcgKzkyOSw3IEBACiAgICAgfQogI2VuZGlmICAvLyBfX0JSSUxMT19fCiAKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAKICAgICBpZiAoIW1Jbml0aWFsaXplZCkgewogICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChjYW1lcmEgSEFMIG1vZHVsZSBub3QgbG9hZGVkKSIsCkBAIC04NzUsOCArOTYzLDggQEAKIFN0YXR1cyBDYW1lcmFTZXJ2aWNlOjp2YWxpZGF0ZUNsaWVudFBlcm1pc3Npb25zTG9ja2VkKGNvbnN0IFN0cmluZzgmIGNhbWVyYUlkLAogICAgICAgICBjb25zdCBTdHJpbmc4JiBjbGllbnROYW1lOCwgaW50JiBjbGllbnRVaWQsIGludCYgY2xpZW50UGlkLAogICAgICAgICAvKm91dCovaW50JiBvcmlnaW5hbENsaWVudFBpZCkgY29uc3QgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOwotICAgIGludCBjYWxsaW5nVWlkID0gZ2V0Q2FsbGluZ1VpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1VpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCk7CiAKICAgICAvLyBDaGVjayBpZiB3ZSBjYW4gdHJ1c3QgY2xpZW50VWlkCiAgICAgaWYgKGNsaWVudFVpZCA9PSBVU0VfQ0FMTElOR19VSUQpIHsKQEAgLTkxNSwxMSArMTAwMywyMiBAQAogCiAgICAgLy8gTWFrZSBzdXJlIHRoZSBVSUQgaXMgaW4gYW4gYWN0aXZlIHN0YXRlIHRvIHVzZSB0aGUgY2FtZXJhCiAgICAgaWYgKCFtVWlkUG9saWN5LT5pc1VpZEFjdGl2ZShjYWxsaW5nVWlkLCBTdHJpbmcxNihjbGllbnROYW1lOCkpKSB7CisgICAgICAgIGludDMyX3QgcHJvY1N0YXRlID0gbVVpZFBvbGljeS0+Z2V0UHJvY1N0YXRlKGNhbGxpbmdVaWQpOwogICAgICAgICBBTE9HRSgiQWNjZXNzIERlbmlhbDogY2FuJ3QgdXNlIHRoZSBjYW1lcmEgZnJvbSBhbiBpZGxlIFVJRCBwaWQ9JWQsIHVpZD0lZCIsCiAgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCk7CiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0RJU0FCTEVELAotICAgICAgICAgICAgICAgICJDYWxsZXIgXCIlc1wiIChQSUQgJWQsIFVJRCAlZCkgY2Fubm90IG9wZW4gY2FtZXJhIFwiJXNcIiBmcm9tIGJhY2tncm91bmQiLAotICAgICAgICAgICAgICAgIGNsaWVudE5hbWU4LnN0cmluZygpLCBjbGllbnRVaWQsIGNsaWVudFBpZCwgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgICJDYWxsZXIgXCIlc1wiIChQSUQgJWQsIFVJRCAlZCkgY2Fubm90IG9wZW4gY2FtZXJhIFwiJXNcIiBmcm9tIGJhY2tncm91bmQgKCIKKyAgICAgICAgICAgICAgICAiY2FsbGluZyBVSUQgJWQgcHJvYyBzdGF0ZSAlIiBQUklkMzIgIikiLAorICAgICAgICAgICAgICAgIGNsaWVudE5hbWU4LnN0cmluZygpLCBjbGllbnRVaWQsIGNsaWVudFBpZCwgY2FtZXJhSWQuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgY2FsbGluZ1VpZCwgcHJvY1N0YXRlKTsKKyAgICB9CisKKyAgICAvLyBJZiBzZW5zb3IgcHJpdmFjeSBpcyBlbmFibGVkIHRoZW4gcHJldmVudCBhY2Nlc3MgdG8gdGhlIGNhbWVyYQorICAgIGlmIChtU2Vuc29yUHJpdmFjeVBvbGljeS0+aXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpKSB7CisgICAgICAgIEFMT0dFKCJBY2Nlc3MgRGVuaWFsOiBjYW5ub3QgdXNlIHRoZSBjYW1lcmEgd2hlbiBzZW5zb3IgcHJpdmFjeSBpcyBlbmFibGVkIik7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0RJU0FCTEVELAorICAgICAgICAgICAgICAgICJDYWxsZXIgXCIlc1wiIChQSUQgJWQsIFVJRCAlZCkgY2Fubm90IG9wZW4gY2FtZXJhIFwiJXNcIiB3aGVuIHNlbnNvciBwcml2YWN5ICIKKyAgICAgICAgICAgICAgICAiaXMgZW5hYmxlZCIsIGNsaWVudE5hbWU4LnN0cmluZygpLCBjbGllbnRVaWQsIGNsaWVudFBpZCwgY2FtZXJhSWQuc3RyaW5nKCkpOwogICAgIH0KIAogICAgIC8vIE9ubHkgdXNlIHBhc3NlZCBpbiBjbGllbnRQaWQgdG8gY2hlY2sgcGVybWlzc2lvbi4gVXNlIGNhbGxpbmcgUElEIGFzIHRoZSBjbGllbnQgUElEIHRoYXQncwpAQCAtOTMwLDggKzEwMjksOSBAQAogICAgIHVzZXJpZF90IGNsaWVudFVzZXJJZCA9IG11bHRpdXNlcl9nZXRfdXNlcl9pZChjbGllbnRVaWQpOwogCiAgICAgLy8gT25seSBhbGxvdyBjbGllbnRzIHdobyBhcmUgYmVpbmcgdXNlZCBieSB0aGUgY3VycmVudCBmb3JlZ3JvdW5kIGRldmljZSB1c2VyLCB1bmxlc3MgY2FsbGluZwotICAgIC8vIGZyb20gb3VyIG93biBwcm9jZXNzLgotICAgIGlmIChjYWxsaW5nUGlkICE9IGdldHBpZCgpICYmIChtQWxsb3dlZFVzZXJzLmZpbmQoY2xpZW50VXNlcklkKSA9PSBtQWxsb3dlZFVzZXJzLmVuZCgpKSkgeworICAgIC8vIGZyb20gb3VyIG93biBwcm9jZXNzIE9SIHRoZSBjYWxsZXIgaXMgdXNpbmcgdGhlIGNhbWVyYXNlcnZlcidzIEhJREwgaW50ZXJmYWNlLgorICAgIGlmIChnZXRDdXJyZW50U2VydmluZ0NhbGwoKSAhPSBCaW5kZXJDYWxsVHlwZTo6SFdCSU5ERVIgJiYgY2FsbGluZ1BpZCAhPSBnZXRwaWQoKSAmJgorICAgICAgICAgICAgKG1BbGxvd2VkVXNlcnMuZmluZChjbGllbnRVc2VySWQpID09IG1BbGxvd2VkVXNlcnMuZW5kKCkpKSB7CiAgICAgICAgIEFMT0dFKCJDYW1lcmFTZXJ2aWNlOjpjb25uZWN0IFggKFBJRCAlZCkgcmVqZWN0ZWQgKGNhbm5vdCBjb25uZWN0IGZyb20gIgogICAgICAgICAgICAgICAgICJkZXZpY2UgdXNlciAlZCwgY3VycmVudGx5IGFsbG93ZWQgZGV2aWNlIHVzZXJzOiAlcykiLCBjYWxsaW5nUGlkLCBjbGllbnRVc2VySWQsCiAgICAgICAgICAgICAgICAgdG9TdHJpbmcobUFsbG93ZWRVc2Vycykuc3RyaW5nKCkpOwpAQCAtOTQ1LDcgKzEwNDUsNyBAQAogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpjaGVja0lmRGV2aWNlSXNVc2FibGUoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQpIGNvbnN0IHsKICAgICBhdXRvIGNhbWVyYVN0YXRlID0gZ2V0Q2FtZXJhU3RhdGUoY2FtZXJhSWQpOwotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBpZiAoY2FtZXJhU3RhdGUgPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HRSgiQ2FtZXJhU2VydmljZTo6Y29ubmVjdCBYIChQSUQgJWQpIHJlamVjdGVkIChpbnZhbGlkIGNhbWVyYSBJRCAlcykiLCBjYWxsaW5nUGlkLAogICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKQEAgLTEwNTAsNyArMTE1MCw4IEBACiAgICAgICAgIHN0ZDo6bWFwPGludCxyZXNvdXJjZV9wb2xpY3k6OkNsaWVudFByaW9yaXR5PiBwaWRUb1ByaW9yaXR5TWFwOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG93bmVyUGlkcy5zaXplKCkgLSAxOyBpKyspIHsKICAgICAgICAgICAgIHBpZFRvUHJpb3JpdHlNYXAuZW1wbGFjZShvd25lclBpZHNbaV0sCi0gICAgICAgICAgICAgICAgICAgIHJlc291cmNlX3BvbGljeTo6Q2xpZW50UHJpb3JpdHkocHJpb3JpdHlTY29yZXNbaV0sIHN0YXRlc1tpXSkpOworICAgICAgICAgICAgICAgICAgICByZXNvdXJjZV9wb2xpY3k6OkNsaWVudFByaW9yaXR5KHByaW9yaXR5U2NvcmVzW2ldLCBzdGF0ZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaXNWZW5kb3JDbGllbnQgd29uJ3QgZ2V0IGNvcGllZCBvdmVyKi8gZmFsc2UpKTsKICAgICAgICAgfQogICAgICAgICBtQWN0aXZlQ2xpZW50TWFuYWdlci51cGRhdGVQcmlvcml0aWVzKHBpZFRvUHJpb3JpdHlNYXApOwogCkBAIC0xMDcxLDYgKzExNzIsOCBAQAogICAgICAgICAgICAgICAgIGNsaWVudFBpZCwKICAgICAgICAgICAgICAgICBzdGF0ZXNbc3RhdGVzLnNpemUoKSAtIDFdKTsKIAorICAgICAgICByZXNvdXJjZV9wb2xpY3k6OkNsaWVudFByaW9yaXR5IGNsaWVudFByaW9yaXR5ID0gY2xpZW50RGVzY3JpcHRvci0+Z2V0UHJpb3JpdHkoKTsKKwogICAgICAgICAvLyBGaW5kIGNsaWVudHMgdGhhdCB3b3VsZCBiZSBldmljdGVkCiAgICAgICAgIGF1dG8gZXZpY3RlZCA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLndvdWxkRXZpY3QoY2xpZW50RGVzY3JpcHRvcik7CiAKQEAgLTEwODgsOCArMTE5MSw3IEBACiAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiJXMgOiBERU5JRUQgY29ubmVjdCBkZXZpY2UgJXMgY2xpZW50IGZvciBwYWNrYWdlICVzICIKICAgICAgICAgICAgICAgICAgICAgIihQSUQgJWQsIHNjb3JlICVkIHN0YXRlICVkKSBkdWUgdG8gZXZpY3Rpb24gcG9saWN5IiwgY3VyVGltZS5zdHJpbmcoKSwKICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCksIHBhY2thZ2VOYW1lLnN0cmluZygpLCBjbGllbnRQaWQsCi0gICAgICAgICAgICAgICAgICAgIHByaW9yaXR5U2NvcmVzW3ByaW9yaXR5U2NvcmVzLnNpemUoKSAtIDFdLAotICAgICAgICAgICAgICAgICAgICBzdGF0ZXNbc3RhdGVzLnNpemUoKSAtIDFdKTsKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50UHJpb3JpdHkuZ2V0U2NvcmUoKSwgY2xpZW50UHJpb3JpdHkuZ2V0U3RhdGUoKSk7CiAKICAgICAgICAgICAgIGZvciAoYXV0byYgaSA6IGluY29tcGF0aWJsZUNsaWVudHMpIHsKICAgICAgICAgICAgICAgICBtc2cuYXBwZW5kRm9ybWF0KCJcbiAgIC0gQmxvY2tlZCBieSBleGlzdGluZyBkZXZpY2UgJXMgY2xpZW50IGZvciBwYWNrYWdlICVzIgpAQCAtMTEzNCw5ICsxMjM2LDggQEAKICAgICAgICAgICAgICAgICAgICAgaS0+Z2V0S2V5KCkuc3RyaW5nKCksIFN0cmluZzh7Y2xpZW50U3AtPmdldFBhY2thZ2VOYW1lKCl9LnN0cmluZygpLAogICAgICAgICAgICAgICAgICAgICBpLT5nZXRPd25lcklkKCksIGktPmdldFByaW9yaXR5KCkuZ2V0U2NvcmUoKSwKICAgICAgICAgICAgICAgICAgICAgaS0+Z2V0UHJpb3JpdHkoKS5nZXRTdGF0ZSgpLCBjYW1lcmFJZC5zdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUuc3RyaW5nKCksIGNsaWVudFBpZCwKLSAgICAgICAgICAgICAgICAgICAgcHJpb3JpdHlTY29yZXNbcHJpb3JpdHlTY29yZXMuc2l6ZSgpIC0gMV0sCi0gICAgICAgICAgICAgICAgICAgIHN0YXRlc1tzdGF0ZXMuc2l6ZSgpIC0gMV0pKTsKKyAgICAgICAgICAgICAgICAgICAgcGFja2FnZU5hbWUuc3RyaW5nKCksIGNsaWVudFBpZCwgY2xpZW50UHJpb3JpdHkuZ2V0U2NvcmUoKSwKKyAgICAgICAgICAgICAgICAgICAgY2xpZW50UHJpb3JpdHkuZ2V0U3RhdGUoKSkpOwogCiAgICAgICAgICAgICAvLyBOb3RpZnkgdGhlIGNsaWVudCBvZiBkaXNjb25uZWN0aW9uCiAgICAgICAgICAgICBjbGllbnRTcC0+bm90aWZ5RXJyb3IoaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQsCkBAIC0xMTQ5LDcgKzEyNTAsNyBAQAogICAgIG1TZXJ2aWNlTG9jay51bmxvY2soKTsKIAogICAgIC8vIENsZWFyIGNhbGxlciBpZGVudGl0eSB0ZW1wb3JhcmlseSBzbyBjbGllbnQgZGlzY29ubmVjdCBQSUQgY2hlY2tzIHdvcmsgY29ycmVjdGx5Ci0gICAgaW50NjRfdCB0b2tlbiA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CisgICAgaW50NjRfdCB0b2tlbiA9IENhbWVyYVRocmVhZFN0YXRlOjpjbGVhckNhbGxpbmdJZGVudGl0eSgpOwogCiAgICAgLy8gRGVzdHJveSBldmljdGVkIGNsaWVudHMKICAgICBmb3IgKGF1dG8mIGkgOiBldmljdGVkQ2xpZW50cykgewpAQCAtMTE1Nyw3ICsxMjU4LDcgQEAKICAgICAgICAgaS0+Z2V0VmFsdWUoKS0+ZGlzY29ubmVjdCgpOyAvLyBDbGllbnRzIHdpbGwgcmVtb3ZlIHRoZW1zZWx2ZXMgZnJvbSB0aGUgYWN0aXZlIGNsaWVudCBsaXN0CiAgICAgfQogCi0gICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CisgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOwogCiAgICAgZm9yIChjb25zdCBhdXRvJiBpIDogZXZpY3RlZENsaWVudHMpIHsKICAgICAgICAgQUxPR1YoIiVzOiBXYWl0aW5nIGZvciBkaXNjb25uZWN0IHRvIGNvbXBsZXRlIGZvciBjbGllbnQgZm9yIGRldmljZSAlcyAoUElEICUiIFBSSWQzMiAiKSIsCkBAIC0xMjA3LDExICsxMzA4LDEwIEBACiAgICAgc3A8Q2xpZW50PiBjbGllbnQgPSBudWxscHRyOwogICAgIHJldCA9IGNvbm5lY3RIZWxwZXI8SUNhbWVyYUNsaWVudCxDbGllbnQ+KGNhbWVyYUNsaWVudCwgaWQsIGFwaTFDYW1lcmFJZCwKICAgICAgICAgICAgIENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQsIGNsaWVudFBhY2thZ2VOYW1lLCBjbGllbnRVaWQsIGNsaWVudFBpZCwgQVBJXzEsCi0gICAgICAgICAgICAvKmxlZ2FjeU1vZGUqLyBmYWxzZSwgLypzaGltVXBkYXRlT25seSovIGZhbHNlLAotICAgICAgICAgICAgLypvdXQqL2NsaWVudCk7CisgICAgICAgICAgICAvKnNoaW1VcGRhdGVPbmx5Ki8gZmFsc2UsIC8qb3V0Ki9jbGllbnQpOwogCiAgICAgaWYoIXJldC5pc09rKCkpIHsKLSAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIGdldENhbGxpbmdQaWQoKSwgU3RyaW5nOChjbGllbnRQYWNrYWdlTmFtZSksCisgICAgICAgIGxvZ1JlamVjdGVkKGlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKICAgICAgICAgICAgICAgICByZXQudG9TdHJpbmc4KCkpOwogICAgICAgICByZXR1cm4gcmV0OwogICAgIH0KQEAgLTEyMzQsMTIgKzEzMzQsMTEgQEAKICAgICBTdGF0dXMgcmV0ID0gU3RhdHVzOjpvaygpOwogICAgIHNwPENsaWVudD4gY2xpZW50ID0gbnVsbHB0cjsKICAgICByZXQgPSBjb25uZWN0SGVscGVyPElDYW1lcmFDbGllbnQsQ2xpZW50PihjYW1lcmFDbGllbnQsIGlkLCBhcGkxQ2FtZXJhSWQsIGhhbFZlcnNpb24sCi0gICAgICAgICAgICBjbGllbnRQYWNrYWdlTmFtZSwgY2xpZW50VWlkLCBVU0VfQ0FMTElOR19QSUQsIEFQSV8xLAotICAgICAgICAgICAgLypsZWdhY3lNb2RlKi8gdHJ1ZSwgLypzaGltVXBkYXRlT25seSovIGZhbHNlLAorICAgICAgICAgICAgY2xpZW50UGFja2FnZU5hbWUsIGNsaWVudFVpZCwgVVNFX0NBTExJTkdfUElELCBBUElfMSwgLypzaGltVXBkYXRlT25seSovIGZhbHNlLAogICAgICAgICAgICAgLypvdXQqL2NsaWVudCk7CiAKICAgICBpZighcmV0LmlzT2soKSkgewotICAgICAgICBsb2dSZWplY3RlZChpZCwgZ2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKKyAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWUpLAogICAgICAgICAgICAgICAgIHJldC50b1N0cmluZzgoKSk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQpAQCAtMTI0OCw2ICsxMzQ3LDE4IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAorYm9vbCBDYW1lcmFTZXJ2aWNlOjpzaG91bGRSZWplY3RIaWRkZW5DYW1lcmFDb25uZWN0aW9uKGNvbnN0IFN0cmluZzggJiBjYW1lcmFJZCkgeworICAgIC8vIElmIHRoZSB0aHJlYWQgc2VydmluZyB0aGlzIGNhbGwgaXMgbm90IGEgaHdiaW5kZXIgdGhyZWFkIGFuZCB0aGUgY2FsbGVyCisgICAgLy8gaXNuJ3QgdGhlIGNhbWVyYXNlcnZlciBpdHNlbGYsIGFuZCB0aGUgY2FtZXJhIGlkIGJlaW5nIHJlcXVlc3RlZCBpcyB0byBiZQorICAgIC8vIHB1YmxpY2FsbHkgaGlkZGVuLCB3ZSBzaG91bGQgcmVqZWN0IHRoZSBjb25uZWN0aW9uLgorICAgIGlmIChnZXRDdXJyZW50U2VydmluZ0NhbGwoKSAhPSBCaW5kZXJDYWxsVHlwZTo6SFdCSU5ERVIgJiYKKyAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgIT0gZ2V0cGlkKCkgJiYKKyAgICAgICAgICAgIGlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYShjYW1lcmFJZCkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKwogU3RhdHVzIENhbWVyYVNlcnZpY2U6OmNvbm5lY3REZXZpY2UoCiAgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiYgY2FtZXJhQ2IsCiAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBjYW1lcmFJZCwKQEAgLTEyNjAsMTUgKzEzNzEsMjAgQEAKICAgICBTdGF0dXMgcmV0ID0gU3RhdHVzOjpvaygpOwogICAgIFN0cmluZzggaWQgPSBTdHJpbmc4KGNhbWVyYUlkKTsKICAgICBzcDxDYW1lcmFEZXZpY2VDbGllbnQ+IGNsaWVudCA9IG51bGxwdHI7CisgICAgU3RyaW5nMTYgY2xpZW50UGFja2FnZU5hbWVBZGogPSBjbGllbnRQYWNrYWdlTmFtZTsKKworICAgIGlmIChnZXRDdXJyZW50U2VydmluZ0NhbGwoKSA9PSBCaW5kZXJDYWxsVHlwZTo6SFdCSU5ERVIpIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgdmVuZG9yQ2xpZW50ID0KKyAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoInZlbmRvci5jbGllbnQucGlkPCVkPiIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOworICAgICAgICBjbGllbnRQYWNrYWdlTmFtZUFkaiA9IFN0cmluZzE2KHZlbmRvckNsaWVudC5jX3N0cigpKTsKKyAgICB9CiAgICAgcmV0ID0gY29ubmVjdEhlbHBlcjxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcyxDYW1lcmFEZXZpY2VDbGllbnQ+KGNhbWVyYUNiLCBpZCwKICAgICAgICAgICAgIC8qYXBpMUNhbWVyYUlkKi8tMSwKLSAgICAgICAgICAgIENBTUVSQV9IQUxfQVBJX1ZFUlNJT05fVU5TUEVDSUZJRUQsIGNsaWVudFBhY2thZ2VOYW1lLAotICAgICAgICAgICAgY2xpZW50VWlkLCBVU0VfQ0FMTElOR19QSUQsIEFQSV8yLAotICAgICAgICAgICAgLypsZWdhY3lNb2RlKi8gZmFsc2UsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwKLSAgICAgICAgICAgIC8qb3V0Ki9jbGllbnQpOworICAgICAgICAgICAgQ0FNRVJBX0hBTF9BUElfVkVSU0lPTl9VTlNQRUNJRklFRCwgY2xpZW50UGFja2FnZU5hbWVBZGosCisgICAgICAgICAgICBjbGllbnRVaWQsIFVTRV9DQUxMSU5HX1BJRCwgQVBJXzIsIC8qc2hpbVVwZGF0ZU9ubHkqLyBmYWxzZSwgLypvdXQqL2NsaWVudCk7CiAKICAgICBpZighcmV0LmlzT2soKSkgewotICAgICAgICBsb2dSZWplY3RlZChpZCwgZ2V0Q2FsbGluZ1BpZCgpLCBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKSwKKyAgICAgICAgbG9nUmVqZWN0ZWQoaWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIFN0cmluZzgoY2xpZW50UGFja2FnZU5hbWVBZGopLAogICAgICAgICAgICAgICAgIHJldC50b1N0cmluZzgoKSk7CiAgICAgICAgIHJldHVybiByZXQ7CiAgICAgfQpAQCAtMTI4MCw3ICsxMzk2LDcgQEAKIHRlbXBsYXRlPGNsYXNzIENBTExCQUNLLCBjbGFzcyBDTElFTlQ+CiBTdGF0dXMgQ2FtZXJhU2VydmljZTo6Y29ubmVjdEhlbHBlcihjb25zdCBzcDxDQUxMQkFDSz4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgaW50IGFwaTFDYW1lcmFJZCwgaW50IGhhbFZlcnNpb24sIGNvbnN0IFN0cmluZzE2JiBjbGllbnRQYWNrYWdlTmFtZSwgaW50IGNsaWVudFVpZCwKLSAgICAgICAgaW50IGNsaWVudFBpZCwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgbGVnYWN5TW9kZSwgYm9vbCBzaGltVXBkYXRlT25seSwKKyAgICAgICAgaW50IGNsaWVudFBpZCwgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgc2hpbVVwZGF0ZU9ubHksCiAgICAgICAgIC8qb3V0Ki9zcDxDTElFTlQ+JiBkZXZpY2UpIHsKICAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKIApAQCAtMTI5Myw2ICsxNDA5LDE0IEBACiAgICAgICAgICAgICAoaGFsVmVyc2lvbiA9PSAtMSkgPyAiZGVmYXVsdCIgOiBzdGQ6OnRvX3N0cmluZyhoYWxWZXJzaW9uKS5jX3N0cigpLAogICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihlZmZlY3RpdmVBcGlMZXZlbCkpOwogCisgICAgaWYgKHNob3VsZFJlamVjdEhpZGRlbkNhbWVyYUNvbm5lY3Rpb24oY2FtZXJhSWQpKSB7CisgICAgICAgIEFMT0dXKCJBdHRlbXB0aW5nIHRvIGNvbm5lY3QgdG8gc3lzdGVtLW9ubHkgY2FtZXJhIGlkICVzLCBjb25uZWN0aW9uIHJlamVjdGVkIiwKKyAgICAgICAgICAgICAgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1JfRk1UKEVSUk9SX0RJU0NPTk5FQ1RFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5vIGNhbWVyYSBkZXZpY2Ugd2l0aCBJRCBcIiVzXCIgY3VycmVudGx5IGF2YWlsYWJsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbWVyYUlkLnN0cmluZygpKTsKKworICAgIH0KICAgICBzcDxDTElFTlQ+IGNsaWVudCA9IG51bGxwdHI7CiAgICAgewogICAgICAgICAvLyBBY3F1aXJlIG1TZXJ2aWNlTG9jayBhbmQgcHJldmVudCBvdGhlciBjbGllbnRzIGZyb20gY29ubmVjdGluZwpAQCAtMTM2NSw3ICsxNDg5LDcgQEAKICAgICAgICAgc3A8QmFzaWNDbGllbnQ+IHRtcCA9IG51bGxwdHI7CiAgICAgICAgIGlmKCEocmV0ID0gbWFrZUNsaWVudCh0aGlzLCBjYW1lcmFDYiwgY2xpZW50UGFja2FnZU5hbWUsCiAgICAgICAgICAgICAgICAgY2FtZXJhSWQsIGFwaTFDYW1lcmFJZCwgZmFjaW5nLAotICAgICAgICAgICAgICAgIGNsaWVudFBpZCwgY2xpZW50VWlkLCBnZXRwaWQoKSwgbGVnYWN5TW9kZSwKKyAgICAgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwgZ2V0cGlkKCksCiAgICAgICAgICAgICAgICAgaGFsVmVyc2lvbiwgZGV2aWNlVmVyc2lvbiwgZWZmZWN0aXZlQXBpTGV2ZWwsCiAgICAgICAgICAgICAgICAgLypvdXQqLyZ0bXApKS5pc09rKCkpIHsKICAgICAgICAgICAgIHJldHVybiByZXQ7CkBAIC0xNDQ5LDcgKzE1NzMsNyBAQAogICAgIH0KIAogICAgIFN0cmluZzggaWQgPSBTdHJpbmc4KGNhbWVyYUlkLnN0cmluZygpKTsKLSAgICBpbnQgdWlkID0gZ2V0Q2FsbGluZ1VpZCgpOworICAgIGludCB1aWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpOwogCiAgICAgLy8gdmVyaWZ5IGlkIGlzIHZhbGlkLgogICAgIGF1dG8gc3RhdGUgPSBnZXRDYW1lcmFTdGF0ZShpZCk7CkBAIC0xNTUxLDEyICsxNjc1LDE3IEBACiAgICAgICAgIH0KICAgICB9CiAKKyAgICBpbnQgY2xpZW50UGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKKyAgICBjb25zdCBjaGFyICppZF9jc3RyID0gaWQuY19zdHIoKTsKKyAgICBjb25zdCBjaGFyICp0b3JjaFN0YXRlID0gZW5hYmxlZCA/ICJvbiIgOiAib2ZmIjsKKyAgICBBTE9HSSgiVG9yY2ggZm9yIGNhbWVyYSBpZCAlcyB0dXJuZWQgJXMgZm9yIGNsaWVudCBQSUQgJWQiLCBpZF9jc3RyLCB0b3JjaFN0YXRlLCBjbGllbnRQaWQpOworICAgIGxvZ1RvcmNoRXZlbnQoaWRfY3N0ciwgdG9yY2hTdGF0ZSAsIGNsaWVudFBpZCk7CiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAogU3RhdHVzIENhbWVyYVNlcnZpY2U6Om5vdGlmeVN5c3RlbUV2ZW50KGludDMyX3QgZXZlbnRJZCwKICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MzJfdD4mIGFyZ3MpIHsKLSAgICBjb25zdCBpbnQgcGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCBwaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIGNvbnN0IGludCBzZWxmUGlkID0gZ2V0cGlkKCk7CiAKICAgICAvLyBQZXJtaXNzaW9uIGNoZWNrcwpAQCAtMTU2NSw3ICsxNjk0LDcgQEAKICAgICAgICAgLy8gcGVybWlzc2lvbnMgdG8gbm90aWZ5IHRoZSBjYW1lcmEgc2VydmljZSBhYm91dCBzeXN0ZW0gZXZlbnRzCiAgICAgICAgIGlmICghY2hlY2tDYWxsaW5nUGVybWlzc2lvbigKICAgICAgICAgICAgICAgICBTdHJpbmcxNigiYW5kcm9pZC5wZXJtaXNzaW9uLkNBTUVSQV9TRU5EX1NZU1RFTV9FVkVOVFMiKSkpIHsKLSAgICAgICAgICAgIGNvbnN0IGludCB1aWQgPSBnZXRDYWxsaW5nVWlkKCk7CisgICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKICAgICAgICAgICAgIEFMT0dFKCJQZXJtaXNzaW9uIERlbmlhbDogY2Fubm90IHNlbmQgdXBkYXRlcyB0byBjYW1lcmEgc2VydmljZSBhYm91dCBzeXN0ZW0iCiAgICAgICAgICAgICAgICAgICAgICIgZXZlbnRzIGZyb20gcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7CiAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SX0ZNVChFUlJPUl9QRVJNSVNTSU9OX0RFTklFRCwKQEAgLTE1NzgsOSArMTcwNywxMCBAQAogCiAgICAgc3dpdGNoKGV2ZW50SWQpIHsKICAgICAgICAgY2FzZSBJQ2FtZXJhU2VydmljZTo6RVZFTlRfVVNFUl9TV0lUQ0hFRDogewotICAgICAgICAgICAgLy8gVHJ5IHRvIHJlZ2lzdGVyIGZvciBVSUQgcG9saWN5IHVwZGF0ZXMsIGluIGNhc2Ugd2UncmUgcmVjb3ZlcmluZworICAgICAgICAgICAgLy8gVHJ5IHRvIHJlZ2lzdGVyIGZvciBVSUQgYW5kIHNlbnNvciBwcml2YWN5IHBvbGljeSB1cGRhdGVzLCBpbiBjYXNlIHdlJ3JlIHJlY292ZXJpbmcKICAgICAgICAgICAgIC8vIGZyb20gYSBzeXN0ZW0gc2VydmVyIGNyYXNoCiAgICAgICAgICAgICBtVWlkUG9saWN5LT5yZWdpc3RlclNlbGYoKTsKKyAgICAgICAgICAgIG1TZW5zb3JQcml2YWN5UG9saWN5LT5yZWdpc3RlclNlbGYoKTsKICAgICAgICAgICAgIGRvVXNlclN3aXRjaCgvKm5ld1VzZXJJZHMqLyBhcmdzKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0xNTk0LDkgKzE3MjQsNzIgQEAKICAgICByZXR1cm4gU3RhdHVzOjpvaygpOwogfQogCit2b2lkIENhbWVyYVNlcnZpY2U6Om5vdGlmeU1vbml0b3JlZFVpZHMoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xpc3RlbmVyTG9jayk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbUxpc3RlbmVyTGlzdCkgeworICAgICAgICBhdXRvIHJldCA9IGl0LnNlY29uZC0+Z2V0TGlzdGVuZXIoKS0+b25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCgpOworICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHRyaWdnZXIgcGVybWlzc2lvbiBjYWxsYmFjazogJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHJldC5leGNlcHRpb25Db2RlKCkpOworICAgICAgICB9CisgICAgfQorfQorCitTdGF0dXMgQ2FtZXJhU2VydmljZTo6bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoaW50NjRfdCBuZXdTdGF0ZSkgeworICAgIGNvbnN0IGludCBwaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOworICAgIGNvbnN0IGludCBzZWxmUGlkID0gZ2V0cGlkKCk7CisKKyAgICAvLyBQZXJtaXNzaW9uIGNoZWNrcworICAgIGlmIChwaWQgIT0gc2VsZlBpZCkgeworICAgICAgICAvLyBFbnN1cmUgd2UncmUgYmVpbmcgY2FsbGVkIGJ5IHN5c3RlbV9zZXJ2ZXIsIG9yIHNpbWlsYXIgcHJvY2VzcyB3aXRoCisgICAgICAgIC8vIHBlcm1pc3Npb25zIHRvIG5vdGlmeSB0aGUgY2FtZXJhIHNlcnZpY2UgYWJvdXQgc3lzdGVtIGV2ZW50cworICAgICAgICBpZiAoIWNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oCisgICAgICAgICAgICAgICAgU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5DQU1FUkFfU0VORF9TWVNURU1fRVZFTlRTIikpKSB7CisgICAgICAgICAgICBjb25zdCBpbnQgdWlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdVaWQoKTsKKyAgICAgICAgICAgIEFMT0dFKCJQZXJtaXNzaW9uIERlbmlhbDogY2Fubm90IHNlbmQgdXBkYXRlcyB0byBjYW1lcmEgc2VydmljZSBhYm91dCBkZXZpY2UiCisgICAgICAgICAgICAgICAgICAgICIgc3RhdGUgY2hhbmdlcyBmcm9tIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOworICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUl9GTVQoRVJST1JfUEVSTUlTU0lPTl9ERU5JRUQsCisgICAgICAgICAgICAgICAgICAgICJObyBwZXJtaXNzaW9uIHRvIHNlbmQgdXBkYXRlcyB0byBjYW1lcmEgc2VydmljZSBhYm91dCBkZXZpY2Ugc3RhdGUiCisgICAgICAgICAgICAgICAgICAgICIgY2hhbmdlcyBmcm9tIHBpZD0lZCwgdWlkPSVkIiwgcGlkLCB1aWQpOworICAgICAgICB9CisgICAgfQorCisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZTsKKyAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxEZXZpY2VTdGF0ZT4gbmV3RGV2aWNlU3RhdGV7fTsKKyAgICBpZiAobmV3U3RhdGUgJiBJQ2FtZXJhU2VydmljZTo6REVWSUNFX1NUQVRFX0JBQ0tfQ09WRVJFRCkgeworICAgICAgICBuZXdEZXZpY2VTdGF0ZSB8PSBEZXZpY2VTdGF0ZTo6QkFDS19DT1ZFUkVEOworICAgIH0KKyAgICBpZiAobmV3U3RhdGUgJiBJQ2FtZXJhU2VydmljZTo6REVWSUNFX1NUQVRFX0ZST05UX0NPVkVSRUQpIHsKKyAgICAgICAgbmV3RGV2aWNlU3RhdGUgfD0gRGV2aWNlU3RhdGU6OkZST05UX0NPVkVSRUQ7CisgICAgfQorICAgIGlmIChuZXdTdGF0ZSAmIElDYW1lcmFTZXJ2aWNlOjpERVZJQ0VfU1RBVEVfRk9MREVEKSB7CisgICAgICAgIG5ld0RldmljZVN0YXRlIHw9IERldmljZVN0YXRlOjpGT0xERUQ7CisgICAgfQorICAgIC8vIE9ubHkgbWFwIHZlbmRvciBiaXRzIGRpcmVjdGx5CisgICAgdWludDY0X3QgdmVuZG9yQml0cyA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihuZXdTdGF0ZSkgJiAweEZGRkZGRkZGMDAwMDAwMDBsOworICAgIG5ld0RldmljZVN0YXRlIHw9IHZlbmRvckJpdHM7CisKKyAgICBBTE9HVigiJXM6IE5ldyBkZXZpY2Ugc3RhdGUgMHglIiBQUkl4NjQsIF9fRlVOQ1RJT05fXywgbmV3RGV2aWNlU3RhdGUpOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1TZXJ2aWNlTG9jayk7CisgICAgbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UobmV3RGV2aWNlU3RhdGUpOworCisgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKK30KKwogU3RhdHVzIENhbWVyYVNlcnZpY2U6OmFkZExpc3RlbmVyKGNvbnN0IHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBsaXN0ZW5lciwKICAgICAgICAgLypvdXQqLwogICAgICAgICBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RhdHVzPiAqY2FtZXJhU3RhdHVzZXMpIHsKKyAgICByZXR1cm4gYWRkTGlzdGVuZXJIZWxwZXIobGlzdGVuZXIsIGNhbWVyYVN0YXR1c2VzKTsKK30KKworU3RhdHVzIENhbWVyYVNlcnZpY2U6OmFkZExpc3RlbmVySGVscGVyKGNvbnN0IHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+JiBsaXN0ZW5lciwKKyAgICAgICAgLypvdXQqLworICAgICAgICBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RhdHVzPiAqY2FtZXJhU3RhdHVzZXMsCisgICAgICAgIGJvb2wgaXNWZW5kb3JMaXN0ZW5lcikgeworCiAgICAgQVRSQUNFX0NBTEwoKTsKIAogICAgIEFMT0dWKCIlczogQWRkIGxpc3RlbmVyICVwIiwgX19GVU5DVElPTl9fLCBsaXN0ZW5lci5nZXQoKSk7CkBAIC0xNjEwLDE1ICsxODAzLDI1IEBACiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1TdGF0dXNMaXN0ZW5lckxvY2spOwotICAgICAgICBmb3IgKGF1dG8mIGl0IDogbUxpc3RlbmVyTGlzdCkgewotICAgICAgICAgICAgaWYgKElJbnRlcmZhY2U6OmFzQmluZGVyKGl0KSA9PSBJSW50ZXJmYWNlOjphc0JpbmRlcihsaXN0ZW5lcikpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IG1MaXN0ZW5lckxpc3QpIHsKKyAgICAgICAgICAgIGlmIChJSW50ZXJmYWNlOjphc0JpbmRlcihpdC5zZWNvbmQtPmdldExpc3RlbmVyKCkpID09IElJbnRlcmZhY2U6OmFzQmluZGVyKGxpc3RlbmVyKSkgewogICAgICAgICAgICAgICAgIEFMT0dXKCIlczogVHJpZWQgdG8gYWRkIGxpc3RlbmVyICVwIHdoaWNoIHdhcyBhbHJlYWR5IHN1YnNjcmliZWQiLAogICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbGlzdGVuZXIuZ2V0KCkpOwogICAgICAgICAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoRVJST1JfQUxSRUFEWV9FWElTVFMsICJMaXN0ZW5lciBhbHJlYWR5IHJlZ2lzdGVyZWQiKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQogCi0gICAgICAgIG1MaXN0ZW5lckxpc3QucHVzaF9iYWNrKGxpc3RlbmVyKTsKKyAgICAgICAgYXV0byBjbGllbnRVaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpOworICAgICAgICBzcDxTZXJ2aWNlTGlzdGVuZXI+IHNlcnZpY2VMaXN0ZW5lciA9IG5ldyBTZXJ2aWNlTGlzdGVuZXIodGhpcywgbGlzdGVuZXIsIGNsaWVudFVpZCk7CisgICAgICAgIGF1dG8gcmV0ID0gc2VydmljZUxpc3RlbmVyLT5pbml0aWFsaXplKCk7CisgICAgICAgIGlmIChyZXQgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJGYWlsZWQgdG8gaW5pdGlhbGl6ZSBzZXJ2aWNlIGxpc3RlbmVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJldCksIHJldCk7CisgICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgICAgICB9CisgICAgICAgIG1MaXN0ZW5lckxpc3QuZW1wbGFjZV9iYWNrKGlzVmVuZG9yTGlzdGVuZXIsIHNlcnZpY2VMaXN0ZW5lcik7CisgICAgICAgIG1VaWRQb2xpY3ktPnJlZ2lzdGVyTW9uaXRvclVpZChjbGllbnRVaWQpOwogICAgIH0KIAogICAgIC8qIENvbGxlY3QgY3VycmVudCBkZXZpY2VzIGFuZCBzdGF0dXMgKi8KQEAgLTE2MjksNiArMTgzMiwyMSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgLy8gUmVtb3ZlIHRoZSBjYW1lcmEgc3RhdHVzZXMgdGhhdCBzaG91bGQgYmUgaGlkZGVuIGZyb20gdGhlIGNsaWVudCwgd2UgZG8KKyAgICAvLyB0aGlzIGFmdGVyIGNvbGxlY3RpbmcgdGhlIHN0YXRlcyBpbiBvcmRlciB0byBhdm9pZCBob2xkaW5nCisgICAgLy8gbUNhbWVyYVN0YXRlc0xvY2sgYW5kIG1JbnRlcmZhY2VMb2NrIChoZWxkIGluCisgICAgLy8gaXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhKCkpIGF0IHRoZSBzYW1lIHRpbWUuCisgICAgY2FtZXJhU3RhdHVzZXMtPmVyYXNlKHN0ZDo6cmVtb3ZlX2lmKGNhbWVyYVN0YXR1c2VzLT5iZWdpbigpLCBjYW1lcmFTdGF0dXNlcy0+ZW5kKCksCisgICAgICAgICAgICAgICAgW3RoaXMsICZpc1ZlbmRvckxpc3RlbmVyXShjb25zdCBoYXJkd2FyZTo6Q2FtZXJhU3RhdHVzJiBzKSB7CisgICAgICAgICAgICAgICAgICAgIGJvb2wgcmV0ID0gIWlzVmVuZG9yTGlzdGVuZXIgJiYgaXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhKHMuY2FtZXJhSWQpOworICAgICAgICAgICAgICAgICAgICBpZiAocmV0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HVigiQ2Fubm90IGFkZCBwdWJsaWMgbGlzdGVuZXIgZm9yIGhpZGRlbiBzeXN0ZW0tb25seSAlcyBmb3IgcGlkICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcy5jYW1lcmFJZC5jX3N0cigpLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OworICAgICAgICAgICAgICAgIH0pLAorICAgICAgICAgICAgICAgIGNhbWVyYVN0YXR1c2VzLT5lbmQoKSk7CisKICAgICAvKgogICAgICAqIEltbWVkaWF0ZWx5IHNpZ25hbCBjdXJyZW50IHRvcmNoIHN0YXR1cyB0byB0aGlzIGxpc3RlbmVyIG9ubHkKICAgICAgKiBUaGlzIG1heSBiZSBhIHN1YnNldCBvZiBhbGwgdGhlIGRldmljZXMsIHNvIGRvbid0IGluY2x1ZGUgaXQgaW4gdGhlIHJlc3BvbnNlIGRpcmVjdGx5CkBAIC0xNjU5LDcgKzE4NzcsOSBAQAogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobVN0YXR1c0xpc3RlbmVyTG9jayk7CiAgICAgICAgIGZvciAoYXV0byBpdCA9IG1MaXN0ZW5lckxpc3QuYmVnaW4oKTsgaXQgIT0gbUxpc3RlbmVyTGlzdC5lbmQoKTsgaXQrKykgewotICAgICAgICAgICAgaWYgKElJbnRlcmZhY2U6OmFzQmluZGVyKCppdCkgPT0gSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKSB7CisgICAgICAgICAgICBpZiAoSUludGVyZmFjZTo6YXNCaW5kZXIoaXQtPnNlY29uZC0+Z2V0TGlzdGVuZXIoKSkgPT0gSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpKSB7CisgICAgICAgICAgICAgICAgbVVpZFBvbGljeS0+dW5yZWdpc3Rlck1vbml0b3JVaWQoaXQtPnNlY29uZC0+Z2V0TGlzdGVuZXJVaWQoKSk7CisgICAgICAgICAgICAgICAgSUludGVyZmFjZTo6YXNCaW5kZXIobGlzdGVuZXIpLT51bmxpbmtUb0RlYXRoKGl0LT5zZWNvbmQpOwogICAgICAgICAgICAgICAgIG1MaXN0ZW5lckxpc3QuZXJhc2UoaXQpOwogICAgICAgICAgICAgICAgIHJldHVybiBTdGF0dXM6Om9rKCk7CiAgICAgICAgICAgICB9CkBAIC0xNzE3LDcgKzE5MzcsNyBAQAogICAgIH0KIAogICAgIGludCBkZXZpY2VWZXJzaW9uID0gZ2V0RGV2aWNlVmVyc2lvbihpZCk7Ci0gICAgc3dpdGNoKGRldmljZVZlcnNpb24pIHsKKyAgICBzd2l0Y2ggKGRldmljZVZlcnNpb24pIHsKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzFfMDoKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMDoKICAgICAgICAgY2FzZSBDQU1FUkFfREVWSUNFX0FQSV9WRVJTSU9OXzNfMToKQEAgLTE3MzQsNiArMTk1NCw3IEBACiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzI6CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzM6CiAgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzQ6CisgICAgICAgIGNhc2UgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzU6CiAgICAgICAgICAgICBBTE9HVigiJXM6IENhbWVyYSBpZCAlcyB1c2VzIEhBTDMuMiBvciBuZXdlciwgc3VwcG9ydHMgYXBpMS9hcGkyIGRpcmVjdGx5IiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CiAgICAgICAgICAgICAqaXNTdXBwb3J0ZWQgPSB0cnVlOwpAQCAtMTc1NCw2ICsxOTc1LDE4IEBACiAgICAgcmV0dXJuIFN0YXR1czo6b2soKTsKIH0KIAorU3RhdHVzIENhbWVyYVNlcnZpY2U6OmlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLAorICAgICAgICAvKm91dCovIGJvb2wgKmlzU3VwcG9ydGVkKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKworICAgIGNvbnN0IFN0cmluZzggaWQgPSBTdHJpbmc4KGNhbWVyYUlkKTsKKworICAgIEFMT0dWKCIlczogZm9yIGNhbWVyYSBJRCA9ICVzIiwgX19GVU5DVElPTl9fLCBpZC5zdHJpbmcoKSk7CisgICAgKmlzU3VwcG9ydGVkID0gbUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+aXNIaWRkZW5QaHlzaWNhbENhbWVyYShpZC5zdHJpbmcoKSk7CisKKyAgICByZXR1cm4gU3RhdHVzOjpvaygpOworfQorCiB2b2lkIENhbWVyYVNlcnZpY2U6OnJlbW92ZUJ5Q2xpZW50KGNvbnN0IEJhc2ljQ2xpZW50KiBjbGllbnQpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU2VydmljZUxvY2spOwogICAgIGZvciAoYXV0byYgaSA6IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpKSB7CkBAIC0xOTAxLDEzICsyMTM0LDEzIEBACiAgICAgbVNlcnZpY2VMb2NrLnVubG9jaygpOwogCiAgICAgLy8gQ2xlYXIgY2FsbGVyIGlkZW50aXR5IHRlbXBvcmFyaWx5IHNvIGNsaWVudCBkaXNjb25uZWN0IFBJRCBjaGVja3Mgd29yayBjb3JyZWN0bHkKLSAgICBpbnQ2NF90IHRva2VuID0gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICBpbnQ2NF90IHRva2VuID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7CiAKICAgICBmb3IgKGF1dG8mIGkgOiBldmljdGVkKSB7CiAgICAgICAgIGktPmRpc2Nvbm5lY3QoKTsKICAgICB9CiAKLSAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5yZXN0b3JlQ2FsbGluZ0lkZW50aXR5KHRva2VuKTsKKyAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6cmVzdG9yZUNhbGxpbmdJZGVudGl0eSh0b2tlbik7CiAKICAgICAvLyBSZWFjcXVpcmUgbVNlcnZpY2VMb2NrCiAgICAgbVNlcnZpY2VMb2NrLmxvY2soKTsKQEAgLTE5NDAsNiArMjE3MywxMiBAQAogICAgICAgICAgICAgY2FtZXJhSWQsIGNsaWVudFBhY2thZ2UsIGNsaWVudFBpZCwgcmVhc29uKSk7CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6bG9nVG9yY2hFdmVudChjb25zdCBjaGFyKiBjYW1lcmFJZCwgY29uc3QgY2hhciAqdG9yY2hTdGF0ZSwgaW50IGNsaWVudFBpZCkgeworICAgIC8vIExvZyB0b3JjaCBldmVudAorICAgIGxvZ0V2ZW50KFN0cmluZzg6OmZvcm1hdCgiVG9yY2ggZm9yIGNhbWVyYSBpZCAlcyB0dXJuZWQgJXMgZm9yIGNsaWVudCBQSUQgJWQiLCBjYW1lcmFJZCwKKyAgICAgICAgICAgIHRvcmNoU3RhdGUsIGNsaWVudFBpZCkpOworfQorCiB2b2lkIENhbWVyYVNlcnZpY2U6OmxvZ1VzZXJTd2l0Y2goY29uc3Qgc3RkOjpzZXQ8dXNlcmlkX3Q+JiBvbGRVc2VySWRzLAogICAgICAgICBjb25zdCBzdGQ6OnNldDx1c2VyaWRfdD4mIG5ld1VzZXJJZHMpIHsKICAgICBTdHJpbmc4IG5ld1VzZXJzID0gdG9TdHJpbmcobmV3VXNlcklkcyk7CkBAIC0xOTc1LDcgKzIyMTQsNiBAQAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6b25UcmFuc2FjdCh1aW50MzJfdCBjb2RlLCBjb25zdCBQYXJjZWwmIGRhdGEsIFBhcmNlbCogcmVwbHksCiAgICAgICAgIHVpbnQzMl90IGZsYWdzKSB7CiAKLQogICAgIC8vIFBlcm1pc3Npb24gY2hlY2tzCiAgICAgc3dpdGNoIChjb2RlKSB7CiAgICAgICAgIGNhc2UgU0hFTExfQ09NTUFORF9UUkFOU0FDVElPTjogewpAQCAtMjA5OCw3ICsyMzM2LDcgQEAKICAgICAgICAgICAgICAgICBzZXJ2aWNlUGlkKSwKICAgICAgICAgbUNhbWVyYUlkKGFwaTFDYW1lcmFJZCkKIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiQ2xpZW50OjpDbGllbnQgRSAocGlkICVkLCBpZCAlZCkiLCBjYWxsaW5nUGlkLCBtQ2FtZXJhSWQpOwogCiAgICAgbVJlbW90ZUNhbGxiYWNrID0gY2FtZXJhQ2xpZW50OwpAQCAtMjE2OCw2ICsyNDA2LDkgQEAKICAgICAgICAgfQogICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWUgPSBwYWNrYWdlc1swXTsKICAgICB9CisgICAgaWYgKGdldEN1cnJlbnRTZXJ2aW5nQ2FsbCgpICE9IEJpbmRlckNhbGxUeXBlOjpIV0JJTkRFUikgeworICAgICAgICBtQXBwT3BzTWFuYWdlciA9IHN0ZDo6bWFrZV91bmlxdWU8QXBwT3BzTWFuYWdlcj4oKTsKKyAgICB9CiB9CiAKIENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50Ojp+QmFzaWNDbGllbnQoKSB7CkBAIC0yMTgzLDggKzI0MjQsOSBAQAogICAgIG1EaXNjb25uZWN0ZWQgPSB0cnVlOwogCiAgICAgc0NhbWVyYVNlcnZpY2UtPnJlbW92ZUJ5Q2xpZW50KHRoaXMpOwotICAgIHNDYW1lcmFTZXJ2aWNlLT5sb2dEaXNjb25uZWN0ZWQobUNhbWVyYUlkU3RyLCBtQ2xpZW50UGlkLAotICAgICAgICAgICAgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpKTsKKyAgICBzQ2FtZXJhU2VydmljZS0+bG9nRGlzY29ubmVjdGVkKG1DYW1lcmFJZFN0ciwgbUNsaWVudFBpZCwgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpKTsKKyAgICBzQ2FtZXJhU2VydmljZS0+bUNhbWVyYVByb3ZpZGVyTWFuYWdlci0+cmVtb3ZlUmVmKENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6RGV2aWNlTW9kZTo6Q0FNRVJBLAorICAgICAgICAgICAgbUNhbWVyYUlkU3RyLmNfc3RyKCkpOwogCiAgICAgc3A8SUJpbmRlcj4gcmVtb3RlID0gZ2V0UmVtb3RlKCk7CiAgICAgaWYgKHJlbW90ZSAhPSBudWxscHRyKSB7CkBAIC0yMjA3LDcgKzI0NDksNyBAQAogICAgIC8vIE5vIGR1bXBpbmcgb2YgY2xpZW50cyBkaXJlY3RseSBvdmVyIEJpbmRlciwKICAgICAvLyBtdXN0IGdvIHRocm91Z2ggQ2FtZXJhU2VydmljZTo6ZHVtcAogICAgIGFuZHJvaWRfZXJyb3JXcml0ZVdpdGhJbmZvTG9nKFNOX0VWRU5UX0xPR19JRCwgIjI2MjY1NDAzIiwKLSAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSwgTlVMTCwgMCk7CisgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpLCBOVUxMLCAwKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTIyMzIsMzEgKzI0NzQsMzEgQEAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpzdGFydENhbWVyYU9wcygpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCi0gICAgaW50MzJfdCByZXM7Ci0gICAgLy8gTm90aWZ5IGFwcCBvcHMgdGhhdCB0aGUgY2FtZXJhIGlzIG5vdCBhdmFpbGFibGUKLSAgICBtT3BzQ2FsbGJhY2sgPSBuZXcgT3BzQ2FsbGJhY2sodGhpcyk7Ci0KICAgICB7CiAgICAgICAgIEFMT0dWKCIlczogU3RhcnQgY2FtZXJhIG9wcywgcGFja2FnZSBuYW1lID0gJXMsIGNsaWVudCBVSUQgPSAlZCIsCiAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpLCBtQ2xpZW50VWlkKTsKICAgICB9CisgICAgaWYgKG1BcHBPcHNNYW5hZ2VyICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gTm90aWZ5IGFwcCBvcHMgdGhhdCB0aGUgY2FtZXJhIGlzIG5vdCBhdmFpbGFibGUKKyAgICAgICAgbU9wc0NhbGxiYWNrID0gbmV3IE9wc0NhbGxiYWNrKHRoaXMpOworICAgICAgICBpbnQzMl90IHJlczsKKyAgICAgICAgbUFwcE9wc01hbmFnZXItPnN0YXJ0V2F0Y2hpbmdNb2RlKEFwcE9wc01hbmFnZXI6Ok9QX0NBTUVSQSwKKyAgICAgICAgICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWUsIG1PcHNDYWxsYmFjayk7CisgICAgICAgIHJlcyA9IG1BcHBPcHNNYW5hZ2VyLT5zdGFydE9wTm9UaHJvdyhBcHBPcHNNYW5hZ2VyOjpPUF9DQU1FUkEsCisgICAgICAgICAgICAgICAgbUNsaWVudFVpZCwgbUNsaWVudFBhY2thZ2VOYW1lLCAvKnN0YXJ0SWZNb2RlRGVmYXVsdCovIGZhbHNlKTsKIAotICAgIG1BcHBPcHNNYW5hZ2VyLnN0YXJ0V2F0Y2hpbmdNb2RlKEFwcE9wc01hbmFnZXI6Ok9QX0NBTUVSQSwKLSAgICAgICAgICAgIG1DbGllbnRQYWNrYWdlTmFtZSwgbU9wc0NhbGxiYWNrKTsKLSAgICByZXMgPSBtQXBwT3BzTWFuYWdlci5zdGFydE9wTm9UaHJvdyhBcHBPcHNNYW5hZ2VyOjpPUF9DQU1FUkEsCi0gICAgICAgICAgICBtQ2xpZW50VWlkLCBtQ2xpZW50UGFja2FnZU5hbWUsIC8qc3RhcnRJZk1vZGVEZWZhdWx0Ki8gZmFsc2UpOworICAgICAgICBpZiAocmVzID09IEFwcE9wc01hbmFnZXI6Ok1PREVfRVJST1JFRCkgeworICAgICAgICAgICAgQUxPR0koIkNhbWVyYSAlczogQWNjZXNzIGZvciBcIiVzXCIgaGFzIGJlZW4gcmV2b2tlZCIsCisgICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgU3RyaW5nOChtQ2xpZW50UGFja2FnZU5hbWUpLnN0cmluZygpKTsKKyAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKKyAgICAgICAgfQogCi0gICAgaWYgKHJlcyA9PSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0VSUk9SRUQpIHsKLSAgICAgICAgQUxPR0koIkNhbWVyYSAlczogQWNjZXNzIGZvciBcIiVzXCIgaGFzIGJlZW4gcmV2b2tlZCIsCi0gICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCkpOwotICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7Ci0gICAgfQotCi0gICAgaWYgKHJlcyA9PSBBcHBPcHNNYW5hZ2VyOjpNT0RFX0lHTk9SRUQpIHsKLSAgICAgICAgQUxPR0koIkNhbWVyYSAlczogQWNjZXNzIGZvciBcIiVzXCIgaGFzIGJlZW4gcmVzdHJpY3RlZCIsCi0gICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCkpOwotICAgICAgICAvLyBSZXR1cm4gdGhlIHNhbWUgZXJyb3IgYXMgZm9yIGRldmljZSBwb2xpY3kgbWFuYWdlciByZWplY3Rpb24KLSAgICAgICAgcmV0dXJuIC1FQUNDRVM7CisgICAgICAgIGlmIChyZXMgPT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9JR05PUkVEKSB7CisgICAgICAgICAgICBBTE9HSSgiQ2FtZXJhICVzOiBBY2Nlc3MgZm9yIFwiJXNcIiBoYXMgYmVlbiByZXN0cmljdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBTdHJpbmc4KG1DbGllbnRQYWNrYWdlTmFtZSkuc3RyaW5nKCkpOworICAgICAgICAgICAgLy8gUmV0dXJuIHRoZSBzYW1lIGVycm9yIGFzIGZvciBkZXZpY2UgcG9saWN5IG1hbmFnZXIgcmVqZWN0aW9uCisgICAgICAgICAgICByZXR1cm4gLUVBQ0NFUzsKKyAgICAgICAgfQogICAgIH0KIAogICAgIG1PcHNBY3RpdmUgPSB0cnVlOwpAQCAtMjI3Miw2ICsyNTE0LDggQEAKICAgICBzQ2FtZXJhU2VydmljZS0+dXBkYXRlUHJveHlEZXZpY2VTdGF0ZShJQ2FtZXJhU2VydmljZVByb3h5OjpDQU1FUkFfU1RBVEVfT1BFTiwKICAgICAgICAgICAgIG1DYW1lcmFJZFN0ciwgbUNhbWVyYUZhY2luZywgbUNsaWVudFBhY2thZ2VOYW1lLCBhcGlMZXZlbCk7CiAKKyAgICBzQ2FtZXJhU2VydmljZS0+bVVpZFBvbGljeS0+cmVnaXN0ZXJNb25pdG9yVWlkKG1DbGllbnRVaWQpOworCiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0yMjgxLDEwICsyNTI1LDExIEBACiAgICAgLy8gQ2hlY2sgaWYgc3RhcnRDYW1lcmFPcHMgc3VjY2VlZGVkLCBhbmQgaWYgc28sIGZpbmlzaCB0aGUgY2FtZXJhIG9wCiAgICAgaWYgKG1PcHNBY3RpdmUpIHsKICAgICAgICAgLy8gTm90aWZ5IGFwcCBvcHMgdGhhdCB0aGUgY2FtZXJhIGlzIGF2YWlsYWJsZSBhZ2FpbgotICAgICAgICBtQXBwT3BzTWFuYWdlci5maW5pc2hPcChBcHBPcHNNYW5hZ2VyOjpPUF9DQU1FUkEsIG1DbGllbnRVaWQsCi0gICAgICAgICAgICAgICAgbUNsaWVudFBhY2thZ2VOYW1lKTsKLSAgICAgICAgbU9wc0FjdGl2ZSA9IGZhbHNlOwotCisgICAgICAgIGlmIChtQXBwT3BzTWFuYWdlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtQXBwT3BzTWFuYWdlci0+ZmluaXNoT3AoQXBwT3BzTWFuYWdlcjo6T1BfQ0FNRVJBLCBtQ2xpZW50VWlkLAorICAgICAgICAgICAgICAgICAgICBtQ2xpZW50UGFja2FnZU5hbWUpOworICAgICAgICAgICAgbU9wc0FjdGl2ZSA9IGZhbHNlOworICAgICAgICB9CiAgICAgICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gYSBjbGllbnQgZGlzY29ubmVjdHMuIFRoaXMgc2hvdWxkCiAgICAgICAgIC8vIHJlbGVhc2UgdGhlIGNhbWVyYSwgYnV0IGFjdHVhbGx5IG9ubHkgaWYgaXQgd2FzIGluIGEgcHJvcGVyCiAgICAgICAgIC8vIGZ1bmN0aW9uYWwgc3RhdGUsIGkuZS4gd2l0aCBzdGF0dXMgTk9UX0FWQUlMQUJMRQpAQCAtMjMwNCwyNyArMjU0OSwyOCBAQAogICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ciwgbUNhbWVyYUZhY2luZywgbUNsaWVudFBhY2thZ2VOYW1lLCBhcGlMZXZlbCk7CiAgICAgfQogICAgIC8vIEFsd2F5cyBzdG9wIHdhdGNoaW5nLCBldmVuIGlmIG5vIGNhbWVyYSBvcCBpcyBhY3RpdmUKLSAgICBpZiAobU9wc0NhbGxiYWNrICE9IE5VTEwpIHsKLSAgICAgICAgbUFwcE9wc01hbmFnZXIuc3RvcFdhdGNoaW5nTW9kZShtT3BzQ2FsbGJhY2spOworICAgIGlmIChtT3BzQ2FsbGJhY2sgIT0gbnVsbHB0ciAmJiBtQXBwT3BzTWFuYWdlciAhPSBudWxscHRyKSB7CisgICAgICAgIG1BcHBPcHNNYW5hZ2VyLT5zdG9wV2F0Y2hpbmdNb2RlKG1PcHNDYWxsYmFjayk7CiAgICAgfQogICAgIG1PcHNDYWxsYmFjay5jbGVhcigpOwogCisgICAgc0NhbWVyYVNlcnZpY2UtPm1VaWRQb2xpY3ktPnVucmVnaXN0ZXJNb25pdG9yVWlkKG1DbGllbnRVaWQpOworCiAgICAgcmV0dXJuIE9LOwogfQogCi12b2lkIENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpvcENoYW5nZWQoaW50MzJfdCBvcCwgY29uc3QgU3RyaW5nMTYmIHBhY2thZ2VOYW1lKSB7Cit2b2lkIENhbWVyYVNlcnZpY2U6OkJhc2ljQ2xpZW50OjpvcENoYW5nZWQoaW50MzJfdCBvcCwgY29uc3QgU3RyaW5nMTYmKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKLQotICAgIFN0cmluZzggbmFtZShwYWNrYWdlTmFtZSk7Ci0gICAgU3RyaW5nOCBteU5hbWUobUNsaWVudFBhY2thZ2VOYW1lKTsKLQorICAgIGlmIChtQXBwT3BzTWFuYWdlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CiAgICAgaWYgKG9wICE9IEFwcE9wc01hbmFnZXI6Ok9QX0NBTUVSQSkgewogICAgICAgICBBTE9HVygiVW5leHBlY3RlZCBhcHAgb3BzIG5vdGlmaWNhdGlvbiByZWNlaXZlZDogJWQiLCBvcCk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAKICAgICBpbnQzMl90IHJlczsKLSAgICByZXMgPSBtQXBwT3BzTWFuYWdlci5jaGVja09wKEFwcE9wc01hbmFnZXI6Ok9QX0NBTUVSQSwKKyAgICByZXMgPSBtQXBwT3BzTWFuYWdlci0+Y2hlY2tPcChBcHBPcHNNYW5hZ2VyOjpPUF9DQU1FUkEsCiAgICAgICAgICAgICBtQ2xpZW50VWlkLCBtQ2xpZW50UGFja2FnZU5hbWUpOwogICAgIEFMT0dWKCJjaGVja09wIHJldHVybnM6ICVkLCAlcyAiLCByZXMsCiAgICAgICAgICAgICByZXMgPT0gQXBwT3BzTWFuYWdlcjo6TU9ERV9BTExPV0VEID8gIkFMTE9XRUQiIDoKQEAgLTIzMzQsNyArMjU4MCw3IEBACiAKICAgICBpZiAocmVzICE9IEFwcE9wc01hbmFnZXI6Ok1PREVfQUxMT1dFRCkgewogICAgICAgICBBTE9HSSgiQ2FtZXJhICVzOiBBY2Nlc3MgZm9yIFwiJXNcIiByZXZva2VkIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLAotICAgICAgICAgICAgICAgIG15TmFtZS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgIFN0cmluZzgobUNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSk7CiAgICAgICAgIGJsb2NrKCk7CiAgICAgfQogfQpAQCAtMjM0NCw3ICsyNTkwLDcgQEAKIAogICAgIC8vIFJlc2V0IHRoZSBjbGllbnQgUElEIHRvIGFsbG93IHNlcnZlci1pbml0aWF0ZWQgZGlzY29ubmVjdCwKICAgICAvLyBhbmQgdG8gcHJldmVudCBmdXJ0aGVyIGNhbGxzIGJ5IGNsaWVudC4KLSAgICBtQ2xpZW50UGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIG1DbGllbnRQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzOyAvLyBhIGR1bW15IHJlc3VsdCAoaW52YWxpZCkKICAgICBub3RpZnlFcnJvcihoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RJU0FCTEVELCByZXN1bHRFeHRyYXMpOwogICAgIGRpc2Nvbm5lY3QoKTsKQEAgLTIzOTUsMTQgKzI2NDEsMTMgQEAKIHZvaWQgQ2FtZXJhU2VydmljZTo6VWlkUG9saWN5OjpyZWdpc3RlclNlbGYoKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VaWRMb2NrKTsKIAotICAgIEFjdGl2aXR5TWFuYWdlciBhbTsKICAgICBpZiAobVJlZ2lzdGVyZWQpIHJldHVybjsKLSAgICBhbS5yZWdpc3RlclVpZE9ic2VydmVyKHRoaXMsIEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0dPTkUKKyAgICBzdGF0dXNfdCByZXMgPSBtQW0ubGlua1RvRGVhdGgodGhpcyk7CisgICAgbUFtLnJlZ2lzdGVyVWlkT2JzZXJ2ZXIodGhpcywgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfR09ORQogICAgICAgICAgICAgfCBBY3Rpdml0eU1hbmFnZXI6OlVJRF9PQlNFUlZFUl9JRExFCi0gICAgICAgICAgICB8IEFjdGl2aXR5TWFuYWdlcjo6VUlEX09CU0VSVkVSX0FDVElWRSwKKyAgICAgICAgICAgIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfQUNUSVZFIHwgQWN0aXZpdHlNYW5hZ2VyOjpVSURfT0JTRVJWRVJfUFJPQ1NUQVRFLAogICAgICAgICAgICAgQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV04sCiAgICAgICAgICAgICBTdHJpbmcxNigiY2FtZXJhc2VydmVyIikpOwotICAgIHN0YXR1c190IHJlcyA9IGFtLmxpbmtUb0RlYXRoKHRoaXMpOwogICAgIGlmIChyZXMgPT0gT0spIHsKICAgICAgICAgbVJlZ2lzdGVyZWQgPSB0cnVlOwogICAgICAgICBBTE9HVigiVWlkUG9saWN5OiBSZWdpc3RlcmVkIHdpdGggQWN0aXZpdHlNYW5hZ2VyIik7CkBAIC0yNDEyLDkgKzI2NTcsOCBAQAogdm9pZCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6OnVucmVnaXN0ZXJTZWxmKCkgewogICAgIE11dGV4OjpBdXRvbG9jayBfbChtVWlkTG9jayk7CiAKLSAgICBBY3Rpdml0eU1hbmFnZXIgYW07Ci0gICAgYW0udW5yZWdpc3RlclVpZE9ic2VydmVyKHRoaXMpOwotICAgIGFtLnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgbUFtLnVucmVnaXN0ZXJVaWRPYnNlcnZlcih0aGlzKTsKKyAgICBtQW0udW5saW5rVG9EZWF0aCh0aGlzKTsKICAgICBtUmVnaXN0ZXJlZCA9IGZhbHNlOwogICAgIG1BY3RpdmVVaWRzLmNsZWFyKCk7CiAgICAgQUxPR1YoIlVpZFBvbGljeTogVW5yZWdpc3RlcmVkIHdpdGggQWN0aXZpdHlNYW5hZ2VyIik7CkBAIC0yNDQ1LDYgKzI2ODksNTEgQEAKICAgICB9CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6VWlkUG9saWN5OjpvblVpZFN0YXRlQ2hhbmdlZCh1aWRfdCB1aWQsIGludDMyX3QgcHJvY1N0YXRlLAorICAgICAgICBpbnQ2NF90IC8qcHJvY1N0YXRlU2VxKi8pIHsKKyAgICBib29sIHByb2NTdGF0ZUNoYW5nZSA9IGZhbHNlOworICAgIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VaWRMb2NrKTsKKyAgICAgICAgaWYgKChtTW9uaXRvcmVkVWlkcy5maW5kKHVpZCkgIT0gbU1vbml0b3JlZFVpZHMuZW5kKCkpICYmCisgICAgICAgICAgICAgICAgKG1Nb25pdG9yZWRVaWRzW3VpZF0uZmlyc3QgIT0gcHJvY1N0YXRlKSkgeworICAgICAgICAgICAgbU1vbml0b3JlZFVpZHNbdWlkXS5maXJzdCA9IHByb2NTdGF0ZTsKKyAgICAgICAgICAgIHByb2NTdGF0ZUNoYW5nZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocHJvY1N0YXRlQ2hhbmdlKSB7CisgICAgICAgIHNwPENhbWVyYVNlcnZpY2U+IHNlcnZpY2UgPSBtU2VydmljZS5wcm9tb3RlKCk7CisgICAgICAgIGlmIChzZXJ2aWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIHNlcnZpY2UtPm5vdGlmeU1vbml0b3JlZFVpZHMoKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6OnJlZ2lzdGVyTW9uaXRvclVpZCh1aWRfdCB1aWQpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVVpZExvY2spOworICAgIGF1dG8gaXQgPSBtTW9uaXRvcmVkVWlkcy5maW5kKHVpZCk7CisgICAgaWYgKGl0ICE9IG1Nb25pdG9yZWRVaWRzLmVuZCgpKSB7CisgICAgICAgIGl0LT5zZWNvbmQuc2Vjb25kKys7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbU1vbml0b3JlZFVpZHMuZW1wbGFjZSgKKyAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8dWlkX3QsIHN0ZDo6cGFpcjxpbnQzMl90LCBzaXplX3Q+PiAodWlkLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnBhaXI8aW50MzJfdCwgc2l6ZV90PiAoQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX05PTkVYSVNURU5ULCAxKSkpOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpVaWRQb2xpY3k6OnVucmVnaXN0ZXJNb25pdG9yVWlkKHVpZF90IHVpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtVWlkTG9jayk7CisgICAgYXV0byBpdCA9IG1Nb25pdG9yZWRVaWRzLmZpbmQodWlkKTsKKyAgICBpZiAoaXQgIT0gbU1vbml0b3JlZFVpZHMuZW5kKCkpIHsKKyAgICAgICAgaXQtPnNlY29uZC5zZWNvbmQtLTsKKyAgICAgICAgaWYgKGl0LT5zZWNvbmQuc2Vjb25kID09IDApIHsKKyAgICAgICAgICAgIG1Nb25pdG9yZWRVaWRzLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogVHJ5aW5nIHRvIHVucmVnaXN0ZXIgdWlkOiAlZCB3aGljaCBpcyBub3QgbW9uaXRvcmVkISIsIF9fRlVOQ1RJT05fXywgdWlkKTsKKyAgICB9Cit9CisKIGJvb2wgQ2FtZXJhU2VydmljZTo6VWlkUG9saWN5Ojppc1VpZEFjdGl2ZSh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1VaWRMb2NrKTsKICAgICByZXR1cm4gaXNVaWRBY3RpdmVMb2NrZWQodWlkLCBjYWxsaW5nUGFja2FnZSk7CkBAIC0yNTA3LDYgKzI3OTYsMTkgQEAKICAgICByZXR1cm4gYWN0aXZlOwogfQogCitpbnQzMl90IENhbWVyYVNlcnZpY2U6OlVpZFBvbGljeTo6Z2V0UHJvY1N0YXRlKHVpZF90IHVpZCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtVWlkTG9jayk7CisgICAgcmV0dXJuIGdldFByb2NTdGF0ZUxvY2tlZCh1aWQpOworfQorCitpbnQzMl90IENhbWVyYVNlcnZpY2U6OlVpZFBvbGljeTo6Z2V0UHJvY1N0YXRlTG9ja2VkKHVpZF90IHVpZCkgeworICAgIGludDMyX3QgcHJvY1N0YXRlID0gQWN0aXZpdHlNYW5hZ2VyOjpQUk9DRVNTX1NUQVRFX1VOS05PV047CisgICAgaWYgKG1Nb25pdG9yZWRVaWRzLmZpbmQodWlkKSAhPSBtTW9uaXRvcmVkVWlkcy5lbmQoKSkgeworICAgICAgICBwcm9jU3RhdGUgPSBtTW9uaXRvcmVkVWlkc1t1aWRdLmZpcnN0OworICAgIH0KKyAgICByZXR1cm4gcHJvY1N0YXRlOworfQorCiB2b2lkIENhbWVyYVNlcnZpY2U6OlVpZFBvbGljeTo6VWlkUG9saWN5OjphZGRPdmVycmlkZVVpZCh1aWRfdCB1aWQsCiAgICAgICAgIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlLCBib29sIGFjdGl2ZSkgewogICAgIHVwZGF0ZU92ZXJyaWRlVWlkKHVpZCwgY2FsbGluZ1BhY2thZ2UsIGFjdGl2ZSwgdHJ1ZSk7CkBAIC0yNTQ1LDEyICsyODQ3LDY0IEBACiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICAgICAgU2Vuc29yUHJpdmFjeVBvbGljeQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBDYW1lcmFTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5OjpyZWdpc3RlclNlbGYoKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1TZW5zb3JQcml2YWN5TG9jayk7CisgICAgaWYgKG1SZWdpc3RlcmVkKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgbVNwbS5hZGRTZW5zb3JQcml2YWN5TGlzdGVuZXIodGhpcyk7CisgICAgbVNlbnNvclByaXZhY3lFbmFibGVkID0gbVNwbS5pc1NlbnNvclByaXZhY3lFbmFibGVkKCk7CisgICAgc3RhdHVzX3QgcmVzID0gbVNwbS5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIG1SZWdpc3RlcmVkID0gdHJ1ZTsKKyAgICAgICAgQUxPR1YoIlNlbnNvclByaXZhY3lQb2xpY3k6IFJlZ2lzdGVyZWQgd2l0aCBTZW5zb3JQcml2YWN5TWFuYWdlciIpOworICAgIH0KK30KKwordm9pZCBDYW1lcmFTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5Ojp1bnJlZ2lzdGVyU2VsZigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlbnNvclByaXZhY3lMb2NrKTsKKyAgICBtU3BtLnJlbW92ZVNlbnNvclByaXZhY3lMaXN0ZW5lcih0aGlzKTsKKyAgICBtU3BtLnVubGlua1RvRGVhdGgodGhpcyk7CisgICAgbVJlZ2lzdGVyZWQgPSBmYWxzZTsKKyAgICBBTE9HVigiU2Vuc29yUHJpdmFjeVBvbGljeTogVW5yZWdpc3RlcmVkIHdpdGggU2Vuc29yUHJpdmFjeU1hbmFnZXIiKTsKK30KKworYm9vbCBDYW1lcmFTZXJ2aWNlOjpTZW5zb3JQcml2YWN5UG9saWN5Ojppc1NlbnNvclByaXZhY3lFbmFibGVkKCkgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vuc29yUHJpdmFjeUxvY2spOworICAgIHJldHVybiBtU2Vuc29yUHJpdmFjeUVuYWJsZWQ7Cit9CisKK2JpbmRlcjo6U3RhdHVzIENhbWVyYVNlcnZpY2U6OlNlbnNvclByaXZhY3lQb2xpY3k6Om9uU2Vuc29yUHJpdmFjeUNoYW5nZWQoYm9vbCBlbmFibGVkKSB7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgX2wobVNlbnNvclByaXZhY3lMb2NrKTsKKyAgICAgICAgbVNlbnNvclByaXZhY3lFbmFibGVkID0gZW5hYmxlZDsKKyAgICB9CisgICAgLy8gaWYgc2Vuc29yIHByaXZhY3kgaXMgZW5hYmxlZCB0aGVuIGJsb2NrIGFsbCBjbGllbnRzIGZyb20gYWNjZXNzaW5nIHRoZSBjYW1lcmEKKyAgICBpZiAoZW5hYmxlZCkgeworICAgICAgICBzcDxDYW1lcmFTZXJ2aWNlPiBzZXJ2aWNlID0gbVNlcnZpY2UucHJvbW90ZSgpOworICAgICAgICBpZiAoc2VydmljZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBzZXJ2aWNlLT5ibG9ja0FsbENsaWVudHMoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK3ZvaWQgQ2FtZXJhU2VydmljZTo6U2Vuc29yUHJpdmFjeVBvbGljeTo6YmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiYgLyp3aG8qLykgeworICAgIE11dGV4OjpBdXRvbG9jayBfbChtU2Vuc29yUHJpdmFjeUxvY2spOworICAgIEFMT0dWKCJTZW5zb3JQcml2YWN5UG9saWN5OiBTZW5zb3JQcml2YWN5TWFuYWdlciBoYXMgZGllZCIpOworICAgIG1SZWdpc3RlcmVkID0gZmFsc2U7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgICAgICAgICAgICAgQ2FtZXJhU3RhdGUKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogQ2FtZXJhU2VydmljZTo6Q2FtZXJhU3RhdGU6OkNhbWVyYVN0YXRlKGNvbnN0IFN0cmluZzgmIGlkLCBpbnQgY29zdCwKLSAgICAgICAgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIGNvbmZsaWN0aW5nKSA6IG1JZChpZCksCi0gICAgICAgIG1TdGF0dXMoU3RhdHVzSW50ZXJuYWw6Ok5PVF9QUkVTRU5UKSwgbUNvc3QoY29zdCksIG1Db25mbGljdGluZyhjb25mbGljdGluZykge30KKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIGNvbmZsaWN0aW5nLCBib29sIGlzSGlkZGVuKSA6IG1JZChpZCksCisgICAgICAgIG1TdGF0dXMoU3RhdHVzSW50ZXJuYWw6Ok5PVF9QUkVTRU5UKSwgbUNvc3QoY29zdCksIG1Db25mbGljdGluZyhjb25mbGljdGluZyksCisgICAgICAgIG1Jc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoaXNIaWRkZW4pIHt9CiAKIENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjp+Q2FtZXJhU3RhdGUoKSB7fQogCkBAIC0yNTc5LDYgKzI5MzMsMTAgQEAKICAgICByZXR1cm4gbUlkOwogfQogCitib29sIENhbWVyYVNlcnZpY2U6OkNhbWVyYVN0YXRlOjppc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1Jc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmE7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vICAgICAgICAgICAgICAgICAgQ2xpZW50RXZlbnRMaXN0ZW5lcgogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMjY3MSw4ICszMDI5LDEyIEBACiAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PFN0cmluZzg+JiBjb25mbGljdGluZ0tleXMsIGludDMyX3Qgc2NvcmUsIGludDMyX3Qgb3duZXJJZCwKICAgICAgICAgaW50MzJfdCBzdGF0ZSkgewogCisgICAgYm9vbCBpc1ZlbmRvckNsaWVudCA9IGdldEN1cnJlbnRTZXJ2aW5nQ2FsbCgpID09IEJpbmRlckNhbGxUeXBlOjpIV0JJTkRFUjsKKyAgICBpbnQzMl90IHNjb3JlX2FkaiA9IGlzVmVuZG9yQ2xpZW50ID8ga1ZlbmRvckNsaWVudFNjb3JlIDogc2NvcmU7CisgICAgaW50MzJfdCBzdGF0ZV9hZGogPSBpc1ZlbmRvckNsaWVudCA/IGtWZW5kb3JDbGllbnRTdGF0ZTogc3RhdGU7CisKICAgICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxyZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwgc3A8QmFzaWNDbGllbnQ+Pj4oCi0gICAgICAgICAgICBrZXksIHZhbHVlLCBjb3N0LCBjb25mbGljdGluZ0tleXMsIHNjb3JlLCBvd25lcklkLCBzdGF0ZSk7CisgICAgICAgICAgICBrZXksIHZhbHVlLCBjb3N0LCBjb25mbGljdGluZ0tleXMsIHNjb3JlX2Fkaiwgb3duZXJJZCwgc3RhdGVfYWRqLCBpc1ZlbmRvckNsaWVudCk7CiB9CiAKIENhbWVyYVNlcnZpY2U6OkRlc2NyaXB0b3JQdHIgQ2FtZXJhU2VydmljZTo6Q2FtZXJhQ2xpZW50TWFuYWdlcjo6bWFrZUNsaWVudERlc2NyaXB0b3IoCkBAIC0yNzA1LDggKzMwNjcsOCBAQAogCiAgICAgaWYgKGNoZWNrQ2FsbGluZ1Blcm1pc3Npb24oU3RyaW5nMTYoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIikpID09IGZhbHNlKSB7CiAgICAgICAgIGRwcmludGYoZmQsICJQZXJtaXNzaW9uIERlbmlhbDogY2FuJ3QgZHVtcCBDYW1lcmFTZXJ2aWNlIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCi0gICAgICAgICAgICAgICAgZ2V0Q2FsbGluZ1BpZCgpLAotICAgICAgICAgICAgICAgIGdldENhbGxpbmdVaWQoKSk7CisgICAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpKTsKICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgIH0KICAgICBib29sIGxvY2tlZCA9IHRyeUxvY2sobVNlcnZpY2VMb2NrKTsKQEAgLTI4NzksNyArMzI0MSw3IEBACiAgICAgICAqIGJpbmRlciBkcml2ZXIKICAgICAgICovCiAgICAgLy8gUElEIGhlcmUgaXMgYXBwcm94aW1hdGUgYW5kIGNhbiBiZSB3cm9uZy4KLSAgICBsb2dDbGllbnREaWVkKGdldENhbGxpbmdQaWQoKSwgU3RyaW5nOCgiQmluZGVyIGRpZWQgdW5leHBlY3RlZGx5IikpOworICAgIGxvZ0NsaWVudERpZWQoQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgU3RyaW5nOCgiQmluZGVyIGRpZWQgdW5leHBlY3RlZGx5IikpOwogCiAgICAgLy8gY2hlY2sgdG9yY2ggY2xpZW50CiAgICAgaGFuZGxlVG9yY2hDbGllbnRCaW5kZXJEaWVkKHdobyk7CkBAIC0yOTEwLDEwICszMjcyLDIyIEBACiAgICAgICAgICAgICAgICAgY2FtZXJhSWQuc3RyaW5nKCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQotCisgICAgYm9vbCBpc0hpZGRlbiA9IGlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYShjYW1lcmFJZCk7CisgICAgYm9vbCBzdXBwb3J0c0hBTDMgPSBmYWxzZTsKKyAgICAvLyBzdXBwb3J0c0NhbWVyYUFwaSBhbHNvIGhvbGRzIG1JbnRlcmZhY2VNdXRleCwgd2UgY2FuJ3QgY2FsbCBpdCBpbiB0aGUKKyAgICAvLyBISURMIG9uU3RhdHVzQ2hhbmdlZCB3cmFwcGVyIGNhbGwgKHdlJ2xsIGhvbGQgbVN0YXR1c0xpc3RlbmVyTG9jayBhbmQKKyAgICAvLyBtSW50ZXJmYWNlTXV0ZXggdG9nZXRoZXIsIHdoaWNoIGNhbiBsZWFkIHRvIGRlYWRsb2NrcykKKyAgICBiaW5kZXI6OlN0YXR1cyBzUmV0ID0KKyAgICAgICAgICAgIHN1cHBvcnRzQ2FtZXJhQXBpKFN0cmluZzE2KGNhbWVyYUlkKSwgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpBUElfVkVSU0lPTl8yLAorICAgICAgICAgICAgICAgICAgICAmc3VwcG9ydHNIQUwzKTsKKyAgICBpZiAoIXNSZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dXKCIlczogRmFpbGVkIHRvIGRldGVybWluZSBpZiBkZXZpY2Ugc3VwcG9ydHMgSEFMMyAlcywgc3VwcG9ydHNDYW1lcmFBcGkgY2FsbCBmYWlsZWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuc3RyaW5nKCkpOworICAgICAgICByZXR1cm47CisgICAgfQogICAgIC8vIFVwZGF0ZSB0aGUgc3RhdHVzIGZvciB0aGlzIGNhbWVyYSBzdGF0ZSwgdGhlbiBzZW5kIHRoZSBvblN0YXR1c0NoYW5nZWRDYWxsYmFja3MgdG8gZWFjaAogICAgIC8vIG9mIHRoZSBsaXN0ZW5lcnMgd2l0aCBib3RoIHRoZSBtU3RhdHVzU3RhdHVzIGFuZCBtU3RhdHVzTGlzdGVuZXJMb2NrIGhlbGQKLSAgICBzdGF0ZS0+dXBkYXRlU3RhdHVzKHN0YXR1cywgY2FtZXJhSWQsIHJlamVjdFNvdXJjZVN0YXRlcywgW3RoaXNdCisgICAgc3RhdGUtPnVwZGF0ZVN0YXR1cyhzdGF0dXMsIGNhbWVyYUlkLCByZWplY3RTb3VyY2VTdGF0ZXMsIFt0aGlzLCAmaXNIaWRkZW4sICZzdXBwb3J0c0hBTDNdCiAgICAgICAgICAgICAoY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsIFN0YXR1c0ludGVybmFsIHN0YXR1cykgewogCiAgICAgICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1c0ludGVybmFsOjpFTlVNRVJBVElORykgewpAQCAtMjkzNSw3ICszMzA5LDIwIEBACiAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtU3RhdHVzTGlzdGVuZXJMb2NrKTsKIAogICAgICAgICAgICAgZm9yIChhdXRvJiBsaXN0ZW5lciA6IG1MaXN0ZW5lckxpc3QpIHsKLSAgICAgICAgICAgICAgICBsaXN0ZW5lci0+b25TdGF0dXNDaGFuZ2VkKG1hcFRvSW50ZXJmYWNlKHN0YXR1cyksIFN0cmluZzE2KGNhbWVyYUlkKSk7CisgICAgICAgICAgICAgICAgYm9vbCBpc1ZlbmRvckxpc3RlbmVyID0gbGlzdGVuZXIuZmlyc3Q7CisgICAgICAgICAgICAgICAgaWYgKGlzVmVuZG9yTGlzdGVuZXIgJiYgIXN1cHBvcnRzSEFMMykgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiU2tpcHBpbmcgdmVuZG9yIGxpc3RlbmVyIGNhbWVyYSBkaXNjb3ZlcnkgY2FsbGJhY2sgZm9yICBIQUwxIGNhbWVyYSAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICghaXNWZW5kb3JMaXN0ZW5lciAmJiBpc0hpZGRlbikgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiU2tpcHBpbmcgY2FtZXJhIGRpc2NvdmVyeSBjYWxsYmFjayBmb3Igc3lzdGVtLW9ubHkgY2FtZXJhICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBsaXN0ZW5lci5zZWNvbmQtPmdldExpc3RlbmVyKCktPm9uU3RhdHVzQ2hhbmdlZChtYXBUb0ludGVyZmFjZShzdGF0dXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nMTYoY2FtZXJhSWQpKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSk7CiB9CkBAIC0zMDMwLDYgKzM0MTcsMTggQEAKICAgICB9CiB9CiAKK3ZvaWQgQ2FtZXJhU2VydmljZTo6YmxvY2tBbGxDbGllbnRzKCkgeworICAgIGNvbnN0IGF1dG8gY2xpZW50cyA9IG1BY3RpdmVDbGllbnRNYW5hZ2VyLmdldEFsbCgpOworICAgIGZvciAoYXV0byYgY3VycmVudCA6IGNsaWVudHMpIHsKKyAgICAgICAgaWYgKGN1cnJlbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgY29uc3QgYXV0byBiYXNpY0NsaWVudCA9IGN1cnJlbnQtPmdldFZhbHVlKCk7CisgICAgICAgICAgICBpZiAoYmFzaWNDbGllbnQuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIGJhc2ljQ2xpZW50LT5ibG9jaygpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCiAvLyBOT1RFOiBUaGlzIGlzIGEgcmVtb3RlIEFQSSAtIG1ha2Ugc3VyZSBhbGwgYXJncyBhcmUgdmFsaWRhdGVkCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpzaGVsbENvbW1hbmQoaW50IGluLCBpbnQgb3V0LCBpbnQgZXJyLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzKSB7CiAgICAgaWYgKCFjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNNYW5hZ2VDYW1lcmFQZXJtaXNzaW9uLCBudWxscHRyLCBudWxscHRyKSkgewpAQCAtMzAzOCwxMSArMzQzNywxMSBAQAogICAgIGlmIChpbiA9PSBCQURfVFlQRSB8fCBvdXQgPT0gQkFEX1RZUEUgfHwgZXJyID09IEJBRF9UWVBFKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIGlmIChhcmdzLnNpemUoKSA9PSAzICYmIGFyZ3NbMF0gPT0gU3RyaW5nMTYoInNldC11aWQtc3RhdGUiKSkgeworICAgIGlmIChhcmdzLnNpemUoKSA+PSAzICYmIGFyZ3NbMF0gPT0gU3RyaW5nMTYoInNldC11aWQtc3RhdGUiKSkgewogICAgICAgICByZXR1cm4gaGFuZGxlU2V0VWlkU3RhdGUoYXJncywgZXJyKTsKLSAgICB9IGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID09IDIgJiYgYXJnc1swXSA9PSBTdHJpbmcxNigicmVzZXQtdWlkLXN0YXRlIikpIHsKKyAgICB9IGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID49IDIgJiYgYXJnc1swXSA9PSBTdHJpbmcxNigicmVzZXQtdWlkLXN0YXRlIikpIHsKICAgICAgICAgcmV0dXJuIGhhbmRsZVJlc2V0VWlkU3RhdGUoYXJncywgZXJyKTsKLSAgICB9IGVsc2UgaWYgKGFyZ3Muc2l6ZSgpID09IDIgJiYgYXJnc1swXSA9PSBTdHJpbmcxNigiZ2V0LXVpZC1zdGF0ZSIpKSB7CisgICAgfSBlbHNlIGlmIChhcmdzLnNpemUoKSA+PSAyICYmIGFyZ3NbMF0gPT0gU3RyaW5nMTYoImdldC11aWQtc3RhdGUiKSkgewogICAgICAgICByZXR1cm4gaGFuZGxlR2V0VWlkU3RhdGUoYXJncywgb3V0LCBlcnIpOwogICAgIH0gZWxzZSBpZiAoYXJncy5zaXplKCkgPT0gMSAmJiBhcmdzWzBdID09IFN0cmluZzE2KCJoZWxwIikpIHsKICAgICAgICAgcHJpbnRIZWxwKG91dCk7CkBAIC0zMDUzLDEzICszNDUyLDggQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhU2VydmljZTo6aGFuZGxlU2V0VWlkU3RhdGUoY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncywgaW50IGVycikgewotICAgIFBlcm1pc3Npb25Db250cm9sbGVyIHBjOwotICAgIGludCB1aWQgPSBwYy5nZXRQYWNrYWdlVWlkKGFyZ3NbMV0sIDApOwotICAgIGlmICh1aWQgPD0gMCkgewotICAgICAgICBBTE9HRSgiVW5rbm93biBwYWNrYWdlOiAnJXMnIiwgU3RyaW5nOChhcmdzWzFdKS5zdHJpbmcoKSk7Ci0gICAgICAgIGRwcmludGYoZXJyLCAiVW5rbm93biBwYWNrYWdlOiAnJXMnXG4iLCBTdHJpbmc4KGFyZ3NbMV0pLnN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICB9CisgICAgU3RyaW5nMTYgcGFja2FnZU5hbWUgPSBhcmdzWzFdOworCiAgICAgYm9vbCBhY3RpdmUgPSBmYWxzZTsKICAgICBpZiAoYXJnc1syXSA9PSBTdHJpbmcxNigiYWN0aXZlIikpIHsKICAgICAgICAgYWN0aXZlID0gdHJ1ZTsKQEAgLTMwNjcsMzEgKzM0NjEsNTIgQEAKICAgICAgICAgQUxPR0UoIkV4cGVjdGVkIGFjdGl2ZSBvciBpZGxlIGJ1dCBnb3Q6ICclcyciLCBTdHJpbmc4KGFyZ3NbMl0pLnN0cmluZygpKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0gICAgbVVpZFBvbGljeS0+YWRkT3ZlcnJpZGVVaWQodWlkLCBhcmdzWzFdLCBhY3RpdmUpOworCisgICAgaW50IHVzZXJJZCA9IDA7CisgICAgaWYgKGFyZ3Muc2l6ZSgpID49IDUgJiYgYXJnc1szXSA9PSBTdHJpbmcxNigiLS11c2VyIikpIHsKKyAgICAgICAgdXNlcklkID0gYXRvaShTdHJpbmc4KGFyZ3NbNF0pKTsKKyAgICB9CisKKyAgICB1aWRfdCB1aWQ7CisgICAgaWYgKGdldFVpZEZvclBhY2thZ2UocGFja2FnZU5hbWUsIHVzZXJJZCwgdWlkLCBlcnIpID09IEJBRF9WQUxVRSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIG1VaWRQb2xpY3ktPmFkZE92ZXJyaWRlVWlkKHVpZCwgcGFja2FnZU5hbWUsIGFjdGl2ZSk7CiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpoYW5kbGVSZXNldFVpZFN0YXRlKGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGludCBlcnIpIHsKLSAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwYzsKLSAgICBpbnQgdWlkID0gcGMuZ2V0UGFja2FnZVVpZChhcmdzWzFdLCAwKTsKLSAgICBpZiAodWlkIDwgMCkgewotICAgICAgICBBTE9HRSgiVW5rbm93biBwYWNrYWdlOiAnJXMnIiwgU3RyaW5nOChhcmdzWzFdKS5zdHJpbmcoKSk7Ci0gICAgICAgIGRwcmludGYoZXJyLCAiVW5rbm93biBwYWNrYWdlOiAnJXMnXG4iLCBTdHJpbmc4KGFyZ3NbMV0pLnN0cmluZygpKTsKKyAgICBTdHJpbmcxNiBwYWNrYWdlTmFtZSA9IGFyZ3NbMV07CisKKyAgICBpbnQgdXNlcklkID0gMDsKKyAgICBpZiAoYXJncy5zaXplKCkgPj0gNCAmJiBhcmdzWzJdID09IFN0cmluZzE2KCItLXVzZXIiKSkgeworICAgICAgICB1c2VySWQgPSBhdG9pKFN0cmluZzgoYXJnc1szXSkpOworICAgIH0KKworICAgIHVpZF90IHVpZDsKKyAgICBpZiAoZ2V0VWlkRm9yUGFja2FnZShwYWNrYWdlTmFtZSwgdXNlcklkLCB1aWQsIGVycikgPT0gQkFEX1ZBTFVFKSB7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotICAgIG1VaWRQb2xpY3ktPnJlbW92ZU92ZXJyaWRlVWlkKHVpZCwgYXJnc1sxXSk7CisKKyAgICBtVWlkUG9saWN5LT5yZW1vdmVPdmVycmlkZVVpZCh1aWQsIHBhY2thZ2VOYW1lKTsKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKIHN0YXR1c190IENhbWVyYVNlcnZpY2U6OmhhbmRsZUdldFVpZFN0YXRlKGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MsIGludCBvdXQsIGludCBlcnIpIHsKLSAgICBQZXJtaXNzaW9uQ29udHJvbGxlciBwYzsKLSAgICBpbnQgdWlkID0gcGMuZ2V0UGFja2FnZVVpZChhcmdzWzFdLCAwKTsKLSAgICBpZiAodWlkIDw9IDApIHsKLSAgICAgICAgQUxPR0UoIlVua25vd24gcGFja2FnZTogJyVzJyIsIFN0cmluZzgoYXJnc1sxXSkuc3RyaW5nKCkpOwotICAgICAgICBkcHJpbnRmKGVyciwgIlVua25vd24gcGFja2FnZTogJyVzJ1xuIiwgU3RyaW5nOChhcmdzWzFdKS5zdHJpbmcoKSk7CisgICAgU3RyaW5nMTYgcGFja2FnZU5hbWUgPSBhcmdzWzFdOworCisgICAgaW50IHVzZXJJZCA9IDA7CisgICAgaWYgKGFyZ3Muc2l6ZSgpID49IDQgJiYgYXJnc1syXSA9PSBTdHJpbmcxNigiLS11c2VyIikpIHsKKyAgICAgICAgdXNlcklkID0gYXRvaShTdHJpbmc4KGFyZ3NbM10pKTsKKyAgICB9CisKKyAgICB1aWRfdCB1aWQ7CisgICAgaWYgKGdldFVpZEZvclBhY2thZ2UocGFja2FnZU5hbWUsIHVzZXJJZCwgdWlkLCBlcnIpID09IEJBRF9WQUxVRSkgewogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLSAgICBpZiAobVVpZFBvbGljeS0+aXNVaWRBY3RpdmUodWlkLCBhcmdzWzFdKSkgeworCisgICAgaWYgKG1VaWRQb2xpY3ktPmlzVWlkQWN0aXZlKHVpZCwgcGFja2FnZU5hbWUpKSB7CiAgICAgICAgIHJldHVybiBkcHJpbnRmKG91dCwgImFjdGl2ZVxuIik7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIGRwcmludGYob3V0LCAiaWRsZVxuIik7CkBAIC0zMTAwLDkgKzM1MTUsOSBAQAogCiBzdGF0dXNfdCBDYW1lcmFTZXJ2aWNlOjpwcmludEhlbHAoaW50IG91dCkgewogICAgIHJldHVybiBkcHJpbnRmKG91dCwgIkNhbWVyYSBzZXJ2aWNlIGNvbW1hbmRzOlxuIgotICAgICAgICAiICBnZXQtdWlkLXN0YXRlIDxQQUNLQUdFPiBnZXRzIHRoZSB1aWQgc3RhdGVcbiIKLSAgICAgICAgIiAgc2V0LXVpZC1zdGF0ZSA8UEFDS0FHRT4gPGFjdGl2ZXxpZGxlPiBvdmVycmlkZXMgdGhlIHVpZCBzdGF0ZVxuIgotICAgICAgICAiICByZXNldC11aWQtc3RhdGUgPFBBQ0tBR0U+IGNsZWFycyB0aGUgdWlkIHN0YXRlIG92ZXJyaWRlXG4iCisgICAgICAgICIgIGdldC11aWQtc3RhdGUgPFBBQ0tBR0U+IFstLXVzZXIgVVNFUl9JRF0gZ2V0cyB0aGUgdWlkIHN0YXRlXG4iCisgICAgICAgICIgIHNldC11aWQtc3RhdGUgPFBBQ0tBR0U+IDxhY3RpdmV8aWRsZT4gWy0tdXNlciBVU0VSX0lEXSBvdmVycmlkZXMgdGhlIHVpZCBzdGF0ZVxuIgorICAgICAgICAiICByZXNldC11aWQtc3RhdGUgPFBBQ0tBR0U+IFstLXVzZXIgVVNFUl9JRF0gY2xlYXJzIHRoZSB1aWQgc3RhdGUgb3ZlcnJpZGVcbiIKICAgICAgICAgIiAgaGVscCBwcmludCB0aGlzIG1lc3NhZ2VcbiIpOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9DYW1lcmFTZXJ2aWNlLmgKaW5kZXggOTkxYzc3MC4uNGUwNGYwZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvQ2FtZXJhU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL0NhbWVyYVNlcnZpY2UuaApAQCAtMTgsMTcgKzE4LDIwIEBACiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBU0VSVklDRV9ICiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0JuQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvQm5TZW5zb3JQcml2YWN5TGlzdGVuZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlUHJveHkuaD4KIAogI2luY2x1ZGUgPGN1dGlscy9tdWx0aXVzZXIuaD4KICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KICNpbmNsdWRlIDx1dGlscy9LZXllZFZlY3Rvci5oPgorI2luY2x1ZGUgPGJpbmRlci9BY3Rpdml0eU1hbmFnZXIuaD4KICNpbmNsdWRlIDxiaW5kZXIvQXBwT3BzTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9CaW5kZXJTZXJ2aWNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lBcHBPcHNDYWxsYmFjay5oPgogI2luY2x1ZGUgPGJpbmRlci9JVWlkT2JzZXJ2ZXIuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEuaD4KKyNpbmNsdWRlIDxzZW5zb3Jwcml2YWN5L1NlbnNvclByaXZhY3lNYW5hZ2VyLmg+CiAKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9jb21tb24vMS4wL3R5cGVzLmg+CiAKQEAgLTQ3LDYgKzUwLDcgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxvcHRpb25hbD4KICNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAjaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KQEAgLTE1MywxMiArMTU3LDE5IEBACiAgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyAgICBub3RpZnlTeXN0ZW1FdmVudChpbnQzMl90IGV2ZW50SWQsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQzMl90PiYgYXJncyk7CiAKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGludDY0X3QgbmV3U3RhdGUpOworCiAgICAgLy8gT0sgPSBzdXBwb3J0cyBhcGkgb2YgdGhhdCB2ZXJzaW9uLCAtRU9QTk9UU1VQUCA9IGRvZXMgbm90IHN1cHBvcnQKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIHN1cHBvcnRzQ2FtZXJhQXBpKAogICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNhbWVyYUlkLCBpbnQzMl90IGFwaVZlcnNpb24sCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CiAKKyAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzICAgIGlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoCisgICAgICAgICAgICBjb25zdCBTdHJpbmcxNiYgY2FtZXJhSWQsCisgICAgICAgICAgICAvKm91dCovCisgICAgICAgICAgICBib29sICppc1N1cHBvcnRlZCk7CisKICAgICAvLyBFeHRyYSBwZXJtaXNzaW9ucyBjaGVja3MKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJjZWwqIHJlcGx5LCB1aW50MzJfdCBmbGFncyk7CkBAIC0xNjcsNiArMTc4LDEzIEBACiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIHNoZWxsQ29tbWFuZChpbnQgaW4sIGludCBvdXQsIGludCBlcnIsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCisgICAgYmluZGVyOjpTdGF0dXMgICAgICBhZGRMaXN0ZW5lckhlbHBlcihjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgLypvdXQqLworICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OkNhbWVyYVN0YXR1cz4qIGNhbWVyYVN0YXR1c2VzLCBib29sIGlzVmVuZG9yID0gZmFsc2UpOworCisgICAgLy8gTW9uaXRvcmVkIFVJRHMgYXZhaWxhYmlsaXR5IG5vdGlmaWNhdGlvbgorICAgIHZvaWQgICAgICAgICAgICAgICAgbm90aWZ5TW9uaXRvcmVkVWlkcygpOworCiAgICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAgICAgLy8gQ2xpZW50IGZ1bmN0aW9uYWxpdHkKIApAQCAtMjc4LDcgKzI5Niw3IEBACiAgICAgICAgIHN0YXR1c190ICAgICAgICAgICAgICAgICAgICAgICAgZmluaXNoQ2FtZXJhT3BzKCk7CiAKICAgICBwcml2YXRlOgotICAgICAgICBBcHBPcHNNYW5hZ2VyICAgICAgICAgICAgICAgICAgIG1BcHBPcHNNYW5hZ2VyOworICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QXBwT3BzTWFuYWdlcj4gIG1BcHBPcHNNYW5hZ2VyID0gbnVsbHB0cjsKIAogICAgICAgICBjbGFzcyBPcHNDYWxsYmFjayA6IHB1YmxpYyBCbkFwcE9wc0NhbGxiYWNrIHsKICAgICAgICAgcHVibGljOgpAQCAtNDU1LDcgKzQ3Myw4IEBACiAgICAgICAgICAqIE1ha2UgYSBuZXcgQ2FtZXJhU3RhdGUgYW5kIHNldCB0aGUgSUQsIGNvc3QsIGFuZCBjb25mbGljdGluZyBkZXZpY2VzIHVzaW5nIHRoZSB2YWx1ZXMKICAgICAgICAgICogcmV0dXJuZWQgaW4gdGhlIEhBTCdzIGNhbWVyYV9pbmZvIHN0cnVjdCBmb3IgZWFjaCBkZXZpY2UuCiAgICAgICAgICAqLwotICAgICAgICBDYW1lcmFTdGF0ZShjb25zdCBTdHJpbmc4JiBpZCwgaW50IGNvc3QsIGNvbnN0IHN0ZDo6c2V0PFN0cmluZzg+JiBjb25mbGljdGluZyk7CisgICAgICAgIENhbWVyYVN0YXRlKGNvbnN0IFN0cmluZzgmIGlkLCBpbnQgY29zdCwgY29uc3Qgc3RkOjpzZXQ8U3RyaW5nOD4mIGNvbmZsaWN0aW5nLAorICAgICAgICAgICAgICAgIGJvb2wgaXNIaWRkZW4pOwogICAgICAgICB2aXJ0dWFsIH5DYW1lcmFTdGF0ZSgpOwogCiAgICAgICAgIC8qKgpAQCAtNTA3LDYgKzUyNiwxMSBAQAogICAgICAgICAgKi8KICAgICAgICAgU3RyaW5nOCBnZXRJZCgpIGNvbnN0OwogCisgICAgICAgIC8qKgorICAgICAgICAgKiBSZXR1cm4gaWYgdGhlIGNhbWVyYSBkZXZpY2UgaXMgYSBwdWJsaWNhbGx5IGhpZGRlbiBzZWN1cmUgY2FtZXJhCisgICAgICAgICAqLworICAgICAgICBib29sIGlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYSgpIGNvbnN0OworCiAgICAgcHJpdmF0ZToKICAgICAgICAgY29uc3QgU3RyaW5nOCBtSWQ7CiAgICAgICAgIFN0YXR1c0ludGVybmFsIG1TdGF0dXM7IC8vIHByb3RlY3RlZCBieSBtU3RhdHVzTG9jawpAQCAtNTE0LDYgKzUzOCw3IEBACiAgICAgICAgIHN0ZDo6c2V0PFN0cmluZzg+IG1Db25mbGljdGluZzsKICAgICAgICAgbXV0YWJsZSBNdXRleCBtU3RhdHVzTG9jazsKICAgICAgICAgQ2FtZXJhUGFyYW1ldGVycyBtU2hpbVBhcmFtczsKKyAgICAgICAgY29uc3QgYm9vbCBtSXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhOwogICAgIH07IC8vIGNsYXNzIENhbWVyYVN0YXRlCiAKICAgICAvLyBPYnNlcnZlciBmb3IgVUlEIGxpZmVjeWNsZSBlbmZvcmNpbmcgdGhhdCBVSURzIGluIGlkbGUKQEAgLTUyNywyOSArNTUyLDY2IEBACiAgICAgICAgIHZvaWQgdW5yZWdpc3RlclNlbGYoKTsKIAogICAgICAgICBib29sIGlzVWlkQWN0aXZlKHVpZF90IHVpZCwgU3RyaW5nMTYgY2FsbGluZ1BhY2thZ2UpOworICAgICAgICBpbnQzMl90IGdldFByb2NTdGF0ZSh1aWRfdCB1aWQpOwogCiAgICAgICAgIHZvaWQgb25VaWRHb25lKHVpZF90IHVpZCwgYm9vbCBkaXNhYmxlZCk7CiAgICAgICAgIHZvaWQgb25VaWRBY3RpdmUodWlkX3QgdWlkKTsKICAgICAgICAgdm9pZCBvblVpZElkbGUodWlkX3QgdWlkLCBib29sIGRpc2FibGVkKTsKKyAgICAgICAgdm9pZCBvblVpZFN0YXRlQ2hhbmdlZCh1aWRfdCB1aWQsIGludDMyX3QgcHJvY1N0YXRlLCBpbnQ2NF90IHByb2NTdGF0ZVNlcSk7CiAKICAgICAgICAgdm9pZCBhZGRPdmVycmlkZVVpZCh1aWRfdCB1aWQsIFN0cmluZzE2IGNhbGxpbmdQYWNrYWdlLCBib29sIGFjdGl2ZSk7CiAgICAgICAgIHZvaWQgcmVtb3ZlT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSk7CiAKKyAgICAgICAgdm9pZCByZWdpc3Rlck1vbml0b3JVaWQodWlkX3QgdWlkKTsKKyAgICAgICAgdm9pZCB1bnJlZ2lzdGVyTW9uaXRvclVpZCh1aWRfdCB1aWQpOworCiAgICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IGltcGxlbWVudGF0aW9uCiAgICAgICAgIHZpcnR1YWwgdm9pZCBiaW5kZXJEaWVkKGNvbnN0IHdwPElCaW5kZXI+ICZ3aG8pOwogICAgIHByaXZhdGU6CiAgICAgICAgIGJvb2wgaXNVaWRBY3RpdmVMb2NrZWQodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSk7CisgICAgICAgIGludDMyX3QgZ2V0UHJvY1N0YXRlTG9ja2VkKHVpZF90IHVpZCk7CiAgICAgICAgIHZvaWQgdXBkYXRlT3ZlcnJpZGVVaWQodWlkX3QgdWlkLCBTdHJpbmcxNiBjYWxsaW5nUGFja2FnZSwgYm9vbCBhY3RpdmUsIGJvb2wgaW5zZXJ0KTsKIAogICAgICAgICBNdXRleCBtVWlkTG9jazsKICAgICAgICAgYm9vbCBtUmVnaXN0ZXJlZDsKKyAgICAgICAgQWN0aXZpdHlNYW5hZ2VyIG1BbTsKICAgICAgICAgd3A8Q2FtZXJhU2VydmljZT4gbVNlcnZpY2U7CiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX3NldDx1aWRfdD4gbUFjdGl2ZVVpZHM7CisgICAgICAgIC8vIE1vbml0b3JlZCB1aWQgbWFwIHRvIGNhY2hlZCBwcm9jU3RhdGUgYW5kIHJlZkNvdW50IHBhaXIKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpZF90LCBzdGQ6OnBhaXI8aW50MzJfdCwgc2l6ZV90Pj4gbU1vbml0b3JlZFVpZHM7CiAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aWRfdCwgYm9vbD4gbU92ZXJyaWRlVWlkczsKICAgICB9OyAvLyBjbGFzcyBVaWRQb2xpY3kKIAorICAgIC8vIElmIHNlbnNvciBwcml2YWN5IGlzIGVuYWJsZWQgdGhlbiBhbGwgYXBwcywgaW5jbHVkaW5nIHRob3NlIHRoYXQgYXJlIGFjdGl2ZSwgc2hvdWxkIGJlCisgICAgLy8gcHJldmVudGVkIGZyb20gYWNjZXNzaW5nIHRoZSBjYW1lcmEuCisgICAgY2xhc3MgU2Vuc29yUHJpdmFjeVBvbGljeSA6IHB1YmxpYyBoYXJkd2FyZTo6Qm5TZW5zb3JQcml2YWN5TGlzdGVuZXIsCisgICAgICAgICAgICBwdWJsaWMgdmlydHVhbCBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CisgICAgICAgIHB1YmxpYzoKKyAgICAgICAgICAgIGV4cGxpY2l0IFNlbnNvclByaXZhY3lQb2xpY3kod3A8Q2FtZXJhU2VydmljZT4gc2VydmljZSkKKyAgICAgICAgICAgICAgICAgICAgOiBtU2VydmljZShzZXJ2aWNlKSwgbVNlbnNvclByaXZhY3lFbmFibGVkKGZhbHNlKSwgbVJlZ2lzdGVyZWQoZmFsc2UpIHt9CisKKyAgICAgICAgICAgIHZvaWQgcmVnaXN0ZXJTZWxmKCk7CisgICAgICAgICAgICB2b2lkIHVucmVnaXN0ZXJTZWxmKCk7CisKKyAgICAgICAgICAgIGJvb2wgaXNTZW5zb3JQcml2YWN5RW5hYmxlZCgpOworCisgICAgICAgICAgICBiaW5kZXI6OlN0YXR1cyBvblNlbnNvclByaXZhY3lDaGFuZ2VkKGJvb2wgZW5hYmxlZCk7CisKKyAgICAgICAgICAgIC8vIElCaW5kZXI6OkRlYXRoUmVjaXBpZW50IGltcGxlbWVudGF0aW9uCisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgYmluZGVyRGllZChjb25zdCB3cDxJQmluZGVyPiAmd2hvKTsKKworICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgU2Vuc29yUHJpdmFjeU1hbmFnZXIgbVNwbTsKKyAgICAgICAgICAgIHdwPENhbWVyYVNlcnZpY2U+IG1TZXJ2aWNlOworICAgICAgICAgICAgTXV0ZXggbVNlbnNvclByaXZhY3lMb2NrOworICAgICAgICAgICAgYm9vbCBtU2Vuc29yUHJpdmFjeUVuYWJsZWQ7CisgICAgICAgICAgICBib29sIG1SZWdpc3RlcmVkOworICAgIH07CisKICAgICBzcDxVaWRQb2xpY3k+IG1VaWRQb2xpY3k7CiAKKyAgICBzcDxTZW5zb3JQcml2YWN5UG9saWN5PiBtU2Vuc29yUHJpdmFjeVBvbGljeTsKKwogICAgIC8vIERlbGF5LWxvYWQgdGhlIENhbWVyYSBIQUwgbW9kdWxlCiAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKTsKIApAQCAtNTgxLDEyICs2NDMsMTcgQEAKICAgICAgICAgc3A8QmFzaWNDbGllbnQ+KiBjbGllbnQsCiAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxyZXNvdXJjZV9wb2xpY3k6OkNsaWVudERlc2NyaXB0b3I8U3RyaW5nOCwgc3A8QmFzaWNDbGllbnQ+Pj4qIHBhcnRpYWwpOwogCisgICAgLy8gU2hvdWxkIGFuIG9wZXJhdGlvbiBhdHRlbXB0IG9uIGEgY2FtZXJhSWQgYmUgcmVqZWN0ZWQsIGlmIHRoZSBjYW1lcmEgaWQgaXMKKyAgICAvLyBhZHZlcnRpc2VkIGFzIGEgcHVibGljYWxseSBoaWRkZW4gc2VjdXJlIGNhbWVyYSwgYnkgdGhlIGNhbWVyYSBIQUwgPworICAgIGJvb2wgc2hvdWxkUmVqZWN0SGlkZGVuQ2FtZXJhQ29ubmVjdGlvbihjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCk7CisKKyAgICBib29sIGlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYShjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCk7CisKICAgICAvLyBTaW5nbGUgaW1wbGVtZW50YXRpb24gc2hhcmVkIGJldHdlZW4gdGhlIHZhcmlvdXMgY29ubmVjdCBjYWxscwogICAgIHRlbXBsYXRlPGNsYXNzIENBTExCQUNLLCBjbGFzcyBDTElFTlQ+CiAgICAgYmluZGVyOjpTdGF0dXMgY29ubmVjdEhlbHBlcihjb25zdCBzcDxDQUxMQkFDSz4mIGNhbWVyYUNiLCBjb25zdCBTdHJpbmc4JiBjYW1lcmFJZCwKICAgICAgICAgICAgIGludCBhcGkxQ2FtZXJhSWQsIGludCBoYWxWZXJzaW9uLCBjb25zdCBTdHJpbmcxNiYgY2xpZW50UGFja2FnZU5hbWUsCi0gICAgICAgICAgICBpbnQgY2xpZW50VWlkLCBpbnQgY2xpZW50UGlkLAotICAgICAgICAgICAgYXBpTGV2ZWwgZWZmZWN0aXZlQXBpTGV2ZWwsIGJvb2wgbGVnYWN5TW9kZSwgYm9vbCBzaGltVXBkYXRlT25seSwKKyAgICAgICAgICAgIGludCBjbGllbnRVaWQsIGludCBjbGllbnRQaWQsIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLCBib29sIHNoaW1VcGRhdGVPbmx5LAogICAgICAgICAgICAgLypvdXQqL3NwPENMSUVOVD4mIGRldmljZSk7CiAKICAgICAvLyBMb2NrIGd1YXJkaW5nIGNhbWVyYSBzZXJ2aWNlIHN0YXRlCkBAIC02OTUsNiArNzYyLDExIEBACiAgICAgICAgICAgICBjb25zdCBjaGFyKiByZWFzb24pOwogCiAgICAgLyoqCisgICAgICogQWRkIGFuIGV2ZW50IGxvZyBtZXNzYWdlIHdoZW4gYSBjbGllbnQgY2FsbHMgc2V0VG9yY2hNb2RlIHN1Y2Nlc2Z1bGx5LgorICAgICAqLworICAgIHZvaWQgbG9nVG9yY2hFdmVudChjb25zdCBjaGFyKiBjYW1lcmFJZCwgY29uc3QgY2hhciAqdG9yY2hTdGF0ZSwgaW50IGNsaWVudFBpZCk7CisKKyAgICAvKioKICAgICAgKiBBZGQgYW4gZXZlbnQgbG9nIG1lc3NhZ2UgdGhhdCB0aGUgY3VycmVudCBkZXZpY2UgdXNlciBoYXMgYmVlbiBzd2l0Y2hlZC4KICAgICAgKi8KICAgICB2b2lkIGxvZ1VzZXJTd2l0Y2goY29uc3Qgc3RkOjpzZXQ8dXNlcmlkX3Q+JiBvbGRVc2VySWRzLApAQCAtNzQ3LDggKzgxOSwzNCBAQAogCiAgICAgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOwogCisgICAgY2xhc3MgU2VydmljZUxpc3RlbmVyIDogcHVibGljIHZpcnR1YWwgSUJpbmRlcjo6RGVhdGhSZWNpcGllbnQgeworICAgICAgICBwdWJsaWM6CisgICAgICAgICAgICBTZXJ2aWNlTGlzdGVuZXIoc3A8Q2FtZXJhU2VydmljZT4gcGFyZW50LCBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgIGludCB1aWQpIDogbVBhcmVudChwYXJlbnQpLCBtTGlzdGVuZXIobGlzdGVuZXIpLCBtTGlzdGVuZXJVaWQodWlkKSB7fQorCisgICAgICAgICAgICBzdGF0dXNfdCBpbml0aWFsaXplKCkgeworICAgICAgICAgICAgICAgIHJldHVybiBJSW50ZXJmYWNlOjphc0JpbmRlcihtTGlzdGVuZXIpLT5saW5rVG9EZWF0aCh0aGlzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdmlydHVhbCB2b2lkIGJpbmRlckRpZWQoY29uc3Qgd3A8SUJpbmRlcj4gJi8qd2hvKi8pIHsKKyAgICAgICAgICAgICAgICBhdXRvIHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChwYXJlbnQuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPnJlbW92ZUxpc3RlbmVyKG1MaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgZ2V0TGlzdGVuZXJVaWQoKSB7IHJldHVybiBtTGlzdGVuZXJVaWQ7IH0KKyAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBnZXRMaXN0ZW5lcigpIHsgcmV0dXJuIG1MaXN0ZW5lcjsgfQorCisgICAgICAgIHByaXZhdGU6CisgICAgICAgICAgICB3cDxDYW1lcmFTZXJ2aWNlPiBtUGFyZW50OworICAgICAgICAgICAgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IG1MaXN0ZW5lcjsKKyAgICAgICAgICAgIGludCBtTGlzdGVuZXJVaWQ7CisgICAgfTsKKwogICAgIC8vIEd1YXJkZWQgYnkgbVN0YXR1c0xpc3RlbmVyTXV0ZXgKLSAgICBzdGQ6OnZlY3RvcjxzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4+IG1MaXN0ZW5lckxpc3Q7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGJvb2wsIHNwPFNlcnZpY2VMaXN0ZW5lcj4+PiBtTGlzdGVuZXJMaXN0OworCiAgICAgTXV0ZXggICAgICAgbVN0YXR1c0xpc3RlbmVyTG9jazsKIAogICAgIC8qKgpAQCAtODIwLDYgKzkxOCw5IEBACiAgICAgLy8gQmxvY2tzIGFsbCBjbGllbnRzIGZyb20gdGhlIFVJRAogICAgIHZvaWQgYmxvY2tDbGllbnRzRm9yVWlkKHVpZF90IHVpZCk7CiAKKyAgICAvLyBCbG9ja3MgYWxsIGFjdGl2ZSBjbGllbnRzLgorICAgIHZvaWQgYmxvY2tBbGxDbGllbnRzKCk7CisKICAgICAvLyBPdmVycmlkZXMgdGhlIFVJRCBzdGF0ZSBhcyBpZiBpdCBpcyBpZGxlCiAgICAgc3RhdHVzX3QgaGFuZGxlU2V0VWlkU3RhdGUoY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncywgaW50IGVycik7CiAKQEAgLTgzMiwxMCArOTMzLDYgQEAKICAgICAvLyBQcmludHMgdGhlIHNoZWxsIGNvbW1hbmQgaGVscAogICAgIHN0YXR1c190IHByaW50SGVscChpbnQgb3V0KTsKIAotICAgIHN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1BpZCgpOwotCi0gICAgc3RhdGljIGludCBnZXRDYWxsaW5nVWlkKCk7Ci0KICAgICAvKioKICAgICAgKiBHZXQgdGhlIGN1cnJlbnQgc3lzdGVtIHRpbWUgYXMgYSBmb3JtYXR0ZWQgc3RyaW5nLgogICAgICAqLwpAQCAtODQ0LDcgKzk0MSw3IEBACiAgICAgc3RhdGljIGJpbmRlcjo6U3RhdHVzIG1ha2VDbGllbnQoY29uc3Qgc3A8Q2FtZXJhU2VydmljZT4mIGNhbWVyYVNlcnZpY2UsCiAgICAgICAgICAgICBjb25zdCBzcDxJSW50ZXJmYWNlPiYgY2FtZXJhQ2IsIGNvbnN0IFN0cmluZzE2JiBwYWNrYWdlTmFtZSwgY29uc3QgU3RyaW5nOCYgY2FtZXJhSWQsCiAgICAgICAgICAgICBpbnQgYXBpMUNhbWVyYUlkLCBpbnQgZmFjaW5nLCBpbnQgY2xpZW50UGlkLCB1aWRfdCBjbGllbnRVaWQsIGludCBzZXJ2aWNlUGlkLAotICAgICAgICAgICAgYm9vbCBsZWdhY3lNb2RlLCBpbnQgaGFsVmVyc2lvbiwgaW50IGRldmljZVZlcnNpb24sIGFwaUxldmVsIGVmZmVjdGl2ZUFwaUxldmVsLAorICAgICAgICAgICAgaW50IGhhbFZlcnNpb24sIGludCBkZXZpY2VWZXJzaW9uLCBhcGlMZXZlbCBlZmZlY3RpdmVBcGlMZXZlbCwKICAgICAgICAgICAgIC8qb3V0Ki9zcDxCYXNpY0NsaWVudD4qIGNsaWVudCk7CiAKICAgICBzdGF0dXNfdCBjaGVja0NhbWVyYUFjY2Vzcyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSk7CkBAIC04NTQsNiArOTUxLDExIEBACiAgICAgc3RhdGljIFN0YXR1c0ludGVybmFsIG1hcFRvSW50ZXJuYWwoaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXMgc3RhdHVzKTsKICAgICBzdGF0aWMgaW50MzJfdCBtYXBUb0ludGVyZmFjZShTdGF0dXNJbnRlcm5hbCBzdGF0dXMpOwogCisgICAgLy8gR3VhcmQgbUNhbWVyYVNlcnZpY2VQcm94eQorICAgIHN0YXRpYyBNdXRleCBzUHJveHlNdXRleDsKKyAgICAvLyBDYWNoZWQgaW50ZXJmYWNlIHRvIHRoZSBjYW1lcmEgc2VydmljZSBwcm94eSBpbiBzeXN0ZW0gc2VydmljZQorICAgIHN0YXRpYyBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eT4gc0NhbWVyYVNlcnZpY2VQcm94eTsKKwogICAgIHN0YXRpYyBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VQcm94eT4gZ2V0Q2FtZXJhU2VydmljZVByb3h5KCk7CiAgICAgc3RhdGljIHZvaWQgcGluZ0NhbWVyYVNlcnZpY2VQcm94eSgpOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9URVNUX01BUFBJTkcgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9URVNUX01BUFBJTkcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZkYWM2OAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL1RFU1RfTUFQUElORwpAQCAtMCwwICsxLDcgQEAKK3sKKyAgInByZXN1Ym1pdCI6IFsKKyAgICB7CisgICAgICAgIm5hbWUiOiAiY2FtZXJhc2VydmljZV90ZXN0IgorICAgIH0KKyAgXQorfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhMkNsaWVudC5jcHAKaW5kZXggOGJiMjRkNC4uYWM4NjU2MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuY3BwCkBAIC0zMyw2ICszMyw3IEBACiAjaW5jbHVkZSAiYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaCIKICNpbmNsdWRlICJhcGkxL2NsaWVudDIvQ2FsbGJhY2tQcm9jZXNzb3IuaCIKICNpbmNsdWRlICJhcGkxL2NsaWVudDIvWnNsUHJvY2Vzc29yLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCIKIAogI2RlZmluZSBBTE9HMSguLi4pIEFMT0dEX0lGKGdMb2dMZXZlbCA+PSAxLCBfX1ZBX0FSR1NfXyk7CiAjZGVmaW5lIEFMT0cyKC4uLikgQUxPR0RfSUYoZ0xvZ0xldmVsID49IDIsIF9fVkFfQVJHU19fKTsKQEAgLTQ0LDEwICs0NSw2IEBACiBuYW1lc3BhY2UgYW5kcm9pZCB7CiB1c2luZyBuYW1lc3BhY2UgY2FtZXJhMjsKIAotc3RhdGljIGludCBnZXRDYWxsaW5nUGlkKCkgewotICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci19Ci0KIC8vIEludGVyZmFjZSB1c2VkIGJ5IENhbWVyYVNlcnZpY2UKIAogQ2FtZXJhMkNsaWVudDo6Q2FtZXJhMkNsaWVudChjb25zdCBzcDxDYW1lcmFTZXJ2aWNlPiYgY2FtZXJhU2VydmljZSwKQEAgLTU4LDggKzU1LDcgQEAKICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgdWlkX3QgY2xpZW50VWlkLAotICAgICAgICBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgYm9vbCBsZWdhY3lNb2RlKToKKyAgICAgICAgaW50IHNlcnZpY2VQaWQpOgogICAgICAgICBDYW1lcmEyQ2xpZW50QmFzZShjYW1lcmFTZXJ2aWNlLCBjYW1lcmFDbGllbnQsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIGNhbWVyYURldmljZUlkLCBhcGkxQ2FtZXJhSWQsIGNhbWVyYUZhY2luZywKICAgICAgICAgICAgICAgICBjbGllbnRQaWQsIGNsaWVudFVpZCwgc2VydmljZVBpZCksCkBAIC02OSw4ICs2NSw2IEBACiAKICAgICBTaGFyZWRQYXJhbWV0ZXJzOjpMb2NrIGwobVBhcmFtZXRlcnMpOwogICAgIGwubVBhcmFtZXRlcnMuc3RhdGUgPSBQYXJhbWV0ZXJzOjpESVNDT05ORUNURUQ7Ci0KLSAgICBtTGVnYWN5TW9kZSA9IGxlZ2FjeU1vZGU7CiB9CiAKIHN0YXR1c190IENhbWVyYTJDbGllbnQ6OmluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLCBjb25zdCBTdHJpbmc4JiBtb25pdG9yVGFncykgewpAQCAtNDA1LDcgKzM5OSw3IEBACiAKICAgICBiaW5kZXI6OlN0YXR1cyByZXMgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICAvLyBBbGxvdyBib3RoIGNsaWVudCBhbmQgdGhlIGNhbWVyYXNlcnZlciB0byBkaXNjb25uZWN0IGF0IGFsbCB0aW1lcwotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBpZiAoY2FsbGluZ1BpZCAhPSBtQ2xpZW50UGlkICYmIGNhbGxpbmdQaWQgIT0gbVNlcnZpY2VQaWQpIHJldHVybiByZXM7CiAKICAgICBpZiAobURldmljZSA9PSAwKSByZXR1cm4gcmVzOwpAQCAtNDYwLDggKzQ1NCw2IEBACiAKICAgICBtRGV2aWNlLT5kaXNjb25uZWN0KCk7CiAKLSAgICBtRGV2aWNlLmNsZWFyKCk7Ci0KICAgICBDYW1lcmFTZXJ2aWNlOjpDbGllbnQ6OmRpc2Nvbm5lY3QoKTsKIAogICAgIHJldHVybiByZXM7CkBAIC00NzIsMTQgKzQ2NCwxNCBAQAogICAgIEFMT0dWKCIlczogRSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogCi0gICAgaWYgKG1DbGllbnRQaWQgIT0gMCAmJiBnZXRDYWxsaW5nUGlkKCkgIT0gbUNsaWVudFBpZCkgeworICAgIGlmIChtQ2xpZW50UGlkICE9IDAgJiYgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSAhPSBtQ2xpZW50UGlkKSB7CiAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBDb25uZWN0aW9uIGF0dGVtcHQgZnJvbSBwaWQgJWQ7ICIKICAgICAgICAgICAgICAgICAiY3VycmVudCBsb2NrZWQgdG8gcGlkICVkIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgIG1DYW1lcmFJZCwgZ2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKKyAgICAgICAgICAgICAgICBtQ2FtZXJhSWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIG1DbGllbnRQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgbUNsaWVudFBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAKICAgICBtUmVtb3RlQ2FsbGJhY2sgPSBjbGllbnQ7CiAgICAgbVNoYXJlZENhbWVyYUNhbGxiYWNrcyA9IGNsaWVudDsKQEAgLTQ5MiwxNiArNDg0LDE2IEBACiAgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IExvY2sgY2FsbCBmcm9tIHBpZCAlZDsgY3VycmVudCBjbGllbnQgcGlkICVkIiwKLSAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOworICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOwogCiAgICAgaWYgKG1DbGllbnRQaWQgPT0gMCkgewotICAgICAgICBtQ2xpZW50UGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgICAgICBtQ2xpZW50UGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIGlmIChtQ2xpZW50UGlkICE9IGdldENhbGxpbmdQaWQoKSkgeworICAgIGlmIChtQ2xpZW50UGlkICE9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpIHsKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJWQ6IExvY2sgY2FsbCBmcm9tIHBpZCAlZDsgY3VycmVudGx5IGxvY2tlZCB0byBwaWQgJWQiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBnZXRDYWxsaW5nUGlkKCksIG1DbGllbnRQaWQpOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBtQ2xpZW50UGlkKTsKICAgICAgICAgcmV0dXJuIEVCVVNZOwogICAgIH0KIApAQCAtNTEzLDkgKzUwNSw5IEBACiAgICAgQUxPR1YoIiVzOiBFIiwgX19GVU5DVElPTl9fKTsKICAgICBNdXRleDo6QXV0b2xvY2sgaWNsKG1CaW5kZXJTZXJpYWxpemF0aW9uTG9jayk7CiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IFVubG9jayBjYWxsIGZyb20gcGlkICVkOyBjdXJyZW50IGNsaWVudCBwaWQgJWQiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIGdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CiAKLSAgICBpZiAobUNsaWVudFBpZCA9PSBnZXRDYWxsaW5nUGlkKCkpIHsKKyAgICBpZiAobUNsaWVudFBpZCA9PSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKSB7CiAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChtUGFyYW1ldGVycyk7CiAgICAgICAgIGlmIChsLm1QYXJhbWV0ZXJzLnN0YXRlID09IFBhcmFtZXRlcnM6OlJFQ09SRCB8fAogICAgICAgICAgICAgICAgIGwubVBhcmFtZXRlcnMuc3RhdGUgPT0gUGFyYW1ldGVyczo6VklERU9fU05BUFNIT1QpIHsKQEAgLTUyOSw3ICs1MjEsNyBAQAogICAgIH0KIAogICAgIEFMT0dFKCIlczogQ2FtZXJhICVkOiBVbmxvY2sgY2FsbCBmcm9tIHBpZCAlZDsgY3VycmVudGx5IGxvY2tlZCB0byBwaWQgJWQiLAotICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQsIGdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgbUNsaWVudFBpZCk7CiAgICAgcmV0dXJuIEVCVVNZOwogfQogCkBAIC03NDAsNiArNzMyLDEwIEBACiAKICAgICBBTE9HVigiJXM6IHN0YXRlID09ICVkLCByZXN0YXJ0ID0gJWQiLCBfX0ZVTkNUSU9OX18sIHBhcmFtcy5zdGF0ZSwgcmVzdGFydCk7CiAKKyAgICBpZiAocGFyYW1zLnN0YXRlID09IFBhcmFtZXRlcnM6OkRJU0NPTk5FQ1RFRCkgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZCBoYXMgYmVlbiBkaXNjb25uZWN0ZWQuIiwgX19GVU5DVElPTl9fLCBtQ2FtZXJhSWQpOworICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgfQogICAgIGlmICggKHBhcmFtcy5zdGF0ZSA9PSBQYXJhbWV0ZXJzOjpQUkVWSUVXIHx8CiAgICAgICAgICAgICAgICAgICAgIHBhcmFtcy5zdGF0ZSA9PSBQYXJhbWV0ZXJzOjpSRUNPUkQgfHwKICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLnN0YXRlID09IFBhcmFtZXRlcnM6OlZJREVPX1NOQVBTSE9UKQpAQCAtMTQ0NywxMyArMTQ0MywxNCBAQAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhMkNsaWVudDo6dGFrZVBpY3R1cmUoaW50IG1zZ1R5cGUpIHsKK3N0YXR1c190IENhbWVyYTJDbGllbnQ6OnRha2VQaWN0dXJlKGludCAvKm1zZ1R5cGUqLykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogICAgIHN0YXR1c190IHJlczsKICAgICBpZiAoIChyZXMgPSBjaGVja1BpZChfX0ZVTkNUSU9OX18pICkgIT0gT0spIHJldHVybiByZXM7CiAKICAgICBpbnQgdGFrZVBpY3R1cmVDb3VudGVyOworICAgIGJvb2wgc2hvdWxkU3luY1dpdGhEZXZpY2UgPSB0cnVlOwogICAgIHsKICAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKICAgICAgICAgc3dpdGNoIChsLm1QYXJhbWV0ZXJzLnN0YXRlKSB7CkBAIC0xNTM5LDE0ICsxNTM2LDI1IEBACiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkKTsKICAgICAgICAgICAgIG1ac2xQcm9jZXNzb3ItPmNsZWFyWnNsUXVldWUoKTsKICAgICAgICAgfQorCisgICAgICAgIC8vIFdlIHNob3VsZCBhbHdheXMgc3luYyB3aXRoIHRoZSBkZXZpY2UgaW4gY2FzZSBmbGFzaCBpcyB0dXJuZWQgb24sCisgICAgICAgIC8vIHRoZSBjYW1lcmEgZGV2aWNlIHN1Z2dlc3RzIHRoYXQgZmxhc2ggaXMgbmVlZGVkIChBRSBzdGF0ZSBGTEFTSF9SRVFVSVJFRCkKKyAgICAgICAgLy8gb3Igd2UgYXJlIGluIHNvbWUgb3RoZXIgQUUgc3RhdGUgZGlmZmVyZW50IGZyb20gQ09OVkVSR0VEIHRoYXQgbWF5IG5lZWQKKyAgICAgICAgLy8gcHJlY2FwdHVyZSB0cmlnZ2VyLgorICAgICAgICBpZiAobC5tUGFyYW1ldGVycy5mbGFzaE1vZGUgIT0gUGFyYW1ldGVyczo6RkxBU0hfTU9ERV9PTiAmJgorICAgICAgICAgICAgICAgIChsLm1QYXJhbWV0ZXJzLmFlU3RhdGUgPT0gQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFX0NPTlZFUkdFRCkpIHsKKyAgICAgICAgICAgIHNob3VsZFN5bmNXaXRoRGV2aWNlICA9IGZhbHNlOworICAgICAgICB9CiAgICAgfQogCiAgICAgQVRSQUNFX0FTWU5DX0JFR0lOKGtUYWtlcGljdHVyZUxhYmVsLCB0YWtlUGljdHVyZUNvdW50ZXIpOwogCi0gICAgLy8gTmVlZCBIQUwgdG8gaGF2ZSBjb3JyZWN0IHNldHRpbmdzIGJlZm9yZSAocG9zc2libHkpIHRyaWdnZXJpbmcgcHJlY2FwdHVyZQotICAgIHN5bmNXaXRoRGV2aWNlKCk7CisgICAgLy8gTWFrZSBzdXJlIEhBTCBoYXMgY29ycmVjdCBzZXR0aW5ncyBpbiBjYXNlIHByZWNhcHR1cmUgdHJpZ2dlciBpcyBuZWVkZWQuCisgICAgaWYgKHNob3VsZFN5bmNXaXRoRGV2aWNlKSB7CisgICAgICAgIHN5bmNXaXRoRGV2aWNlKCk7CisgICAgfQogCi0gICAgcmVzID0gbUNhcHR1cmVTZXF1ZW5jZXItPnN0YXJ0Q2FwdHVyZShtc2dUeXBlKTsKKyAgICByZXMgPSBtQ2FwdHVyZVNlcXVlbmNlci0+c3RhcnRDYXB0dXJlKCk7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogVW5hYmxlIHRvIHN0YXJ0IGNhcHR1cmU6ICVzICglZCkiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTE1ODMsNyArMTU5MSw3IEBACiAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQiLCBfX0ZVTkNUSU9OX18sIG1DYW1lcmFJZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGljbChtQmluZGVyU2VyaWFsaXphdGlvbkxvY2spOwogICAgIC8vIFRoZSBjYW1lcmEgc2VydmljZSBjYW4gdW5jb25kaXRpb25hbGx5IGdldCB0aGUgcGFyYW1ldGVycyBhdCBhbGwgdGltZXMKLSAgICBpZiAoZ2V0Q2FsbGluZ1BpZCgpICE9IG1TZXJ2aWNlUGlkICYmIGNoZWNrUGlkKF9fRlVOQ1RJT05fXykgIT0gT0spIHJldHVybiBTdHJpbmc4KCk7CisgICAgaWYgKENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgIT0gbVNlcnZpY2VQaWQgJiYgY2hlY2tQaWQoX19GVU5DVElPTl9fKSAhPSBPSykgcmV0dXJuIFN0cmluZzgoKTsKIAogICAgIFNoYXJlZFBhcmFtZXRlcnM6OlJlYWRMb2NrIGwobVBhcmFtZXRlcnMpOwogCkBAIC0xNjY2LDI3ICsxNjc0LDYgQEAKICAgICAgICAgcmV0dXJuIE9LOwogICAgIH0KIAotICAgIC8vIHRoZSBjYW1lcmEyIGFwaSBsZWdhY3kgbW9kZSBjYW4gdW5jb25kaXRpb25hbGx5IGRpc2FibGUgdGhlIHNodXR0ZXIgc291bmQKLSAgICBpZiAobUxlZ2FjeU1vZGUpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBEaXNhYmxlIHNodXR0ZXIgc291bmQgaW4gbGVnYWN5IG1vZGUiLCBfX0ZVTkNUSU9OX18pOwotICAgICAgICBsLm1QYXJhbWV0ZXJzLnBsYXlTaHV0dGVyU291bmQgPSBmYWxzZTsKLSAgICAgICAgcmV0dXJuIE9LOwotICAgIH0KLQotICAgIC8vIERpc2FibGluZyBzaHV0dGVyIHNvdW5kIG1heSBub3QgYmUgYWxsb3dlZC4gSW4gdGhhdCBjYXNlIG9ubHkKLSAgICAvLyBhbGxvdyB0aGUgbWVkaWFzZXJ2ZXIgcHJvY2VzcyB0byBkaXNhYmxlIHRoZSBzb3VuZC4KLSAgICBjaGFyIHZhbHVlW1BST1BFUlRZX1ZBTFVFX01BWF07Ci0gICAgcHJvcGVydHlfZ2V0KCJyby5jYW1lcmEuc291bmQuZm9yY2VkIiwgdmFsdWUsICIwIik7Ci0gICAgaWYgKHN0cm5jbXAodmFsdWUsICIwIiwgMikgIT0gMCkgewotICAgICAgICAvLyBEaXNhYmxpbmcgc2h1dHRlciBzb3VuZCBpcyBub3QgYWxsb3dlZC4gRGVueSBpZiB0aGUgY3VycmVudAotICAgICAgICAvLyBwcm9jZXNzIGlzIG5vdCBtZWRpYXNlcnZlci4KLSAgICAgICAgaWYgKGdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWQoKSkgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkaXNhYmxlIHNodXR0ZXIgc291bmQuIFBlcm1pc3Npb24gZGVuaWVkIChwaWQgJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgZ2V0Q2FsbGluZ1BpZCgpKTsKLSAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgfQotICAgIH0KLQogICAgIGwubVBhcmFtZXRlcnMucGxheVNodXR0ZXJTb3VuZCA9IGZhbHNlOwogICAgIHJldHVybiBPSzsKIH0KQEAgLTE3ODQsNiArMTc3MSw3IEBACiAgICAgICAgIGNhc2UgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVI6CiAgICAgICAgICAgICBBTE9HVygiJXM6IFJlY2VpdmVkIHJlY292ZXJhYmxlIGVycm9yICVkIGZyb20gSEFMIC0gaWdub3JpbmcsIHJlcXVlc3RJZCAlIiBQUklkMzIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMucmVxdWVzdElkKTsKKyAgICAgICAgICAgIG1DYXB0dXJlU2VxdWVuY2VyLT5ub3RpZnlFcnJvcihlcnJvckNvZGUsIHJlc3VsdEV4dHJhcyk7CiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICBlcnIgPSBDQU1FUkFfRVJST1JfVU5LTk9XTjsKQEAgLTE5MzQsMTQgKzE5MjIsMTYgQEAKIHZvaWQgQ2FtZXJhMkNsaWVudDo6bm90aWZ5QXV0b0V4cG9zdXJlKHVpbnQ4X3QgbmV3U3RhdGUsIGludCB0cmlnZ2VySWQpIHsKICAgICBBTE9HVigiJXM6IEF1dG9leHBvc3VyZSBzdGF0ZSBub3cgJWQsIGxhc3QgdHJpZ2dlciAlZCIsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG5ld1N0YXRlLCB0cmlnZ2VySWQpOworICAgIHsKKyAgICAgICAgU2hhcmVkUGFyYW1ldGVyczo6TG9jayBsKG1QYXJhbWV0ZXJzKTsKKyAgICAgICAgLy8gVXBkYXRlIHN0YXRlCisgICAgICAgIGwubVBhcmFtZXRlcnMuYWVTdGF0ZSA9IG5ld1N0YXRlOworICAgIH0KICAgICBtQ2FwdHVyZVNlcXVlbmNlci0+bm90aWZ5QXV0b0V4cG9zdXJlKG5ld1N0YXRlLCB0cmlnZ2VySWQpOwogfQogCiB2b2lkIENhbWVyYTJDbGllbnQ6Om5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7Ci0gICAgKHZvaWQpcmVzdWx0RXh0cmFzOwotICAgICh2b2lkKXRpbWVzdGFtcDsKLQogICAgIEFMT0dWKCIlczogU2h1dHRlciBub3RpZmljYXRpb24gZm9yIHJlcXVlc3QgaWQgJSIgUFJJZDMyICIgYXQgdGltZSAlIiBQUklkNjQsCiAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdEV4dHJhcy5yZXF1ZXN0SWQsIHRpbWVzdGFtcCk7CiAgICAgbUNhcHR1cmVTZXF1ZW5jZXItPm5vdGlmeVNodXR0ZXIocmVzdWx0RXh0cmFzLCB0aW1lc3RhbXApOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmEyQ2xpZW50LmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaAppbmRleCA0NDkyOWMzLi5hOWVhMjcxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYTJDbGllbnQuaApAQCAtOTYsOCArOTYsNyBAQAogICAgICAgICAgICAgaW50IGNhbWVyYUZhY2luZywKICAgICAgICAgICAgIGludCBjbGllbnRQaWQsCiAgICAgICAgICAgICB1aWRfdCBjbGllbnRVaWQsCi0gICAgICAgICAgICBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgICAgIGJvb2wgbGVnYWN5TW9kZSk7CisgICAgICAgICAgICBpbnQgc2VydmljZVBpZCk7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmEyQ2xpZW50KCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmNwcAppbmRleCBmMTIwM2Y5Li5kNjVhYzdiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuY3BwCkBAIC0yNSwyNyArMjUsMjQgQEAKICNpbmNsdWRlICJhcGkxL0NhbWVyYUNsaWVudC5oIgogI2luY2x1ZGUgImRldmljZTEvQ2FtZXJhSGFyZHdhcmVJbnRlcmZhY2UuaCIKICNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCiAjZGVmaW5lIExPRzEoLi4uKSBBTE9HRF9JRihnTG9nTGV2ZWwgPj0gMSwgX19WQV9BUkdTX18pOwogI2RlZmluZSBMT0cyKC4uLikgQUxPR0RfSUYoZ0xvZ0xldmVsID49IDIsIF9fVkFfQVJHU19fKTsKIAotc3RhdGljIGludCBnZXRDYWxsaW5nUGlkKCkgewotICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCk7Ci19Ci0KIENhbWVyYUNsaWVudDo6Q2FtZXJhQ2xpZW50KGNvbnN0IHNwPENhbWVyYVNlcnZpY2U+JiBjYW1lcmFTZXJ2aWNlLAogICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6SUNhbWVyYUNsaWVudD4mIGNhbWVyYUNsaWVudCwKICAgICAgICAgY29uc3QgU3RyaW5nMTYmIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICBpbnQgY2FtZXJhSWQsIGludCBjYW1lcmFGYWNpbmcsCiAgICAgICAgIGludCBjbGllbnRQaWQsIGludCBjbGllbnRVaWQsCi0gICAgICAgIGludCBzZXJ2aWNlUGlkLCBib29sIGxlZ2FjeU1vZGUpOgorICAgICAgICBpbnQgc2VydmljZVBpZCk6CiAgICAgICAgIENsaWVudChjYW1lcmFTZXJ2aWNlLCBjYW1lcmFDbGllbnQsIGNsaWVudFBhY2thZ2VOYW1lLAogICAgICAgICAgICAgICAgIFN0cmluZzg6OmZvcm1hdCgiJWQiLCBjYW1lcmFJZCksIGNhbWVyYUlkLCBjYW1lcmFGYWNpbmcsIGNsaWVudFBpZCwKICAgICAgICAgICAgICAgICBjbGllbnRVaWQsIHNlcnZpY2VQaWQpCiB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoIkNhbWVyYUNsaWVudDo6Q2FtZXJhQ2xpZW50IEUgKHBpZCAlZCwgaWQgJWQpIiwgY2FsbGluZ1BpZCwgY2FtZXJhSWQpOwogCiAgICAgbUhhcmR3YXJlID0gTlVMTDsKQEAgLTU3LDE0ICs1NCwxMyBAQAogICAgIC8vIENhbGxiYWNrIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQKICAgICBtUHJldmlld0NhbGxiYWNrRmxhZyA9IENBTUVSQV9GUkFNRV9DQUxMQkFDS19GTEFHX05PT1A7CiAgICAgbU9yaWVudGF0aW9uID0gZ2V0T3JpZW50YXRpb24oMCwgbUNhbWVyYUZhY2luZyA9PSBDQU1FUkFfRkFDSU5HX0ZST05UKTsKLSAgICBtTGVnYWN5TW9kZSA9IGxlZ2FjeU1vZGU7CiAgICAgbVBsYXlTaHV0dGVyU291bmQgPSB0cnVlOwogICAgIExPRzEoIkNhbWVyYUNsaWVudDo6Q2FtZXJhQ2xpZW50IFggKHBpZCAlZCwgaWQgJWQpIiwgY2FsbGluZ1BpZCwgY2FtZXJhSWQpOwogfQogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLAogICAgICAgICBjb25zdCBTdHJpbmc4JiAvKm1vbml0b3JUYWdzKi8pIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgc3RhdHVzX3QgcmVzOwogCiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50Ojppbml0aWFsaXplIEUgKHBpZCAlZCwgaWQgJWQpIiwgY2FsbGluZ1BpZCwgbUNhbWVyYUlkKTsKQEAgLTEwNSw3ICsxMDEsNyBAQAogLy8gdGVhciBkb3duIHRoZSBjbGllbnQKIENhbWVyYUNsaWVudDo6fkNhbWVyYUNsaWVudCgpIHsKICAgICBtRGVzdHJ1Y3Rpb25TdGFydGVkID0gdHJ1ZTsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiQ2FtZXJhQ2xpZW50Ojp+Q2FtZXJhQ2xpZW50IEUgKHBpZCAlZCwgdGhpcyAlcCkiLCBjYWxsaW5nUGlkLCB0aGlzKTsKIAogICAgIGRpc2Nvbm5lY3QoKTsKQEAgLTE0OCw3ICsxNDQsNyBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmNoZWNrUGlkKCkgY29uc3QgewotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBpZiAoY2FsbGluZ1BpZCA9PSBtQ2xpZW50UGlkKSByZXR1cm4gTk9fRVJST1I7CiAKICAgICBBTE9HVygiYXR0ZW1wdCB0byB1c2UgYSBsb2NrZWQgY2FtZXJhIGZyb20gYSBkaWZmZXJlbnQgcHJvY2VzcyIKQEAgLTE1OCw3ICsxNTQsOCBAQAogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmNoZWNrUGlkQW5kSGFyZHdhcmUoKSBjb25zdCB7CiAgICAgaWYgKG1IYXJkd2FyZSA9PSAwKSB7Ci0gICAgICAgIEFMT0dFKCJhdHRlbXB0IHRvIHVzZSBhIGNhbWVyYSBhZnRlciBkaXNjb25uZWN0KCkgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgICAgICBBTE9HRSgiYXR0ZW1wdCB0byB1c2UgYSBjYW1lcmEgYWZ0ZXIgZGlzY29ubmVjdCgpIChwaWQgJWQpIiwKKyAgICAgICAgICAgICAgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWQoKTsKQEAgLTE2Nyw3ICsxNjQsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OmxvY2soKSB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoImxvY2sgKHBpZCAlZCkiLCBjYWxsaW5nUGlkKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAKQEAgLTE4Miw3ICsxNzksNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnVubG9jaygpIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgidW5sb2NrIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogCkBAIC0yMDQsNyArMjAxLDcgQEAKIAogLy8gY29ubmVjdCBhIG5ldyBjbGllbnQgdG8gdGhlIGNhbWVyYQogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50Ojpjb25uZWN0KGNvbnN0IHNwPGhhcmR3YXJlOjpJQ2FtZXJhQ2xpZW50PiYgY2xpZW50KSB7Ci0gICAgaW50IGNhbGxpbmdQaWQgPSBnZXRDYWxsaW5nUGlkKCk7CisgICAgaW50IGNhbGxpbmdQaWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpOwogICAgIExPRzEoImNvbm5lY3QgRSAocGlkICVkKSIsIGNhbGxpbmdQaWQpOwogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKIApAQCAtMjQwLDcgKzIzNyw3IEBACiB9CiAKIGJpbmRlcjo6U3RhdHVzIENhbWVyYUNsaWVudDo6ZGlzY29ubmVjdCgpIHsKLSAgICBpbnQgY2FsbGluZ1BpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBpbnQgY2FsbGluZ1BpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAgICAgTE9HMSgiZGlzY29ubmVjdCBFIChwaWQgJWQpIiwgY2FsbGluZ1BpZCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogCkBAIC0zMzQsNyArMzMxLDcgQEAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6c2V0UHJldmlld1RhcmdldCgKICAgICAgICAgY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGJ1ZmZlclByb2R1Y2VyKSB7CiAgICAgTE9HMSgic2V0UHJldmlld1RhcmdldCglcCkgKHBpZCAlZCkiLCBidWZmZXJQcm9kdWNlci5nZXQoKSwKLSAgICAgICAgICAgIGdldENhbGxpbmdQaWQoKSk7CisgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKIAogICAgIHNwPElCaW5kZXI+IGJpbmRlcjsKICAgICBzcDxBTmF0aXZlV2luZG93PiB3aW5kb3c7CkBAIC0zNTEsNyArMzQ4LDcgQEAKIC8vIHNldCB0aGUgcHJldmlldyBjYWxsYmFjayBmbGFnIHRvIGFmZmVjdCBob3cgdGhlIHJlY2VpdmVkIGZyYW1lcyBmcm9tCiAvLyBwcmV2aWV3IGFyZSBoYW5kbGVkLgogdm9pZCBDYW1lcmFDbGllbnQ6OnNldFByZXZpZXdDYWxsYmFja0ZsYWcoaW50IGNhbGxiYWNrX2ZsYWcpIHsKLSAgICBMT0cxKCJzZXRQcmV2aWV3Q2FsbGJhY2tGbGFnKCVkKSAocGlkICVkKSIsIGNhbGxiYWNrX2ZsYWcsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgic2V0UHJldmlld0NhbGxiYWNrRmxhZyglZCkgKHBpZCAlZCkiLCBjYWxsYmFja19mbGFnLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuOwogCkBAIC0zNzIsMTMgKzM2OSwxMyBAQAogCiAvLyBzdGFydCBwcmV2aWV3IG1vZGUKIHN0YXR1c190IENhbWVyYUNsaWVudDo6c3RhcnRQcmV2aWV3KCkgewotICAgIExPRzEoInN0YXJ0UHJldmlldyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgic3RhcnRQcmV2aWV3IChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgcmV0dXJuIHN0YXJ0Q2FtZXJhTW9kZShDQU1FUkFfUFJFVklFV19NT0RFKTsKIH0KIAogLy8gc3RhcnQgcmVjb3JkaW5nIG1vZGUKIHN0YXR1c190IENhbWVyYUNsaWVudDo6c3RhcnRSZWNvcmRpbmcoKSB7Ci0gICAgTE9HMSgic3RhcnRSZWNvcmRpbmcgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoInN0YXJ0UmVjb3JkaW5nIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAgICAgcmV0dXJuIHN0YXJ0Q2FtZXJhTW9kZShDQU1FUkFfUkVDT1JESU5HX01PREUpOwogfQogCkBAIC00NjEsNyArNDU4LDcgQEAKIAogLy8gc3RvcCBwcmV2aWV3IG1vZGUKIHZvaWQgQ2FtZXJhQ2xpZW50OjpzdG9wUHJldmlldygpIHsKLSAgICBMT0cxKCJzdG9wUHJldmlldyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgic3RvcFByZXZpZXcgKHBpZCAlZCkiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuOwogCkBAIC00NzcsNyArNDc0LDcgQEAKIAogLy8gc3RvcCByZWNvcmRpbmcgbW9kZQogdm9pZCBDYW1lcmFDbGllbnQ6OnN0b3BSZWNvcmRpbmcoKSB7Ci0gICAgTE9HMSgic3RvcFJlY29yZGluZyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgic3RvcFJlY29yZGluZyAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgIHsKICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47CkBAIC01MDMsNyArNTAwLDcgQEAKICAgICBpZiAoY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSByZXR1cm47CiAgICAgaWYgKG1lbSA9PSBudWxscHRyKSB7CiAgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZVdpdGhJbmZvTG9nKENhbWVyYVNlcnZpY2U6OlNOX0VWRU5UX0xPR19JRCwgIjI2MTY0MjcyIiwKLSAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCksIG51bGxwdHIsIDApOworICAgICAgICAgICAgICAgIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCksIG51bGxwdHIsIDApOwogICAgICAgICByZXR1cm47CiAgICAgfQogCkBAIC02MTUsNyArNjEyLDcgQEAKIH0KIAogYm9vbCBDYW1lcmFDbGllbnQ6OnByZXZpZXdFbmFibGVkKCkgewotICAgIExPRzEoInByZXZpZXdFbmFibGVkIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJwcmV2aWV3RW5hYmxlZCAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogCiAgICAgTXV0ZXg6OkF1dG9sb2NrIGxvY2sobUxvY2spOwogICAgIGlmIChjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybiBmYWxzZTsKQEAgLTYyMyw3ICs2MjAsNyBAQAogfQogCiBib29sIENhbWVyYUNsaWVudDo6cmVjb3JkaW5nRW5hYmxlZCgpIHsKLSAgICBMT0cxKCJyZWNvcmRpbmdFbmFibGVkIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJyZWNvcmRpbmdFbmFibGVkIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgaWYgKGNoZWNrUGlkQW5kSGFyZHdhcmUoKSAhPSBOT19FUlJPUikgcmV0dXJuIGZhbHNlOwpAQCAtNjMxLDcgKzYyOCw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6YXV0b0ZvY3VzKCkgewotICAgIExPRzEoImF1dG9Gb2N1cyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgiYXV0b0ZvY3VzIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwpAQCAtNjQxLDcgKzYzOCw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYUNsaWVudDo6Y2FuY2VsQXV0b0ZvY3VzKCkgewotICAgIExPRzEoImNhbmNlbEF1dG9Gb2N1cyAocGlkICVkKSIsIGdldENhbGxpbmdQaWQoKSk7CisgICAgTE9HMSgiY2FuY2VsQXV0b0ZvY3VzIChwaWQgJWQpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwpAQCAtNjUyLDcgKzY0OSw3IEBACiAKIC8vIHRha2UgYSBwaWN0dXJlIC0gaW1hZ2UgaXMgcmV0dXJuZWQgaW4gY2FsbGJhY2sKIHN0YXR1c190IENhbWVyYUNsaWVudDo6dGFrZVBpY3R1cmUoaW50IG1zZ1R5cGUpIHsKLSAgICBMT0cxKCJ0YWtlUGljdHVyZSAocGlkICVkKTogMHgleCIsIGdldENhbGxpbmdQaWQoKSwgbXNnVHlwZSk7CisgICAgTE9HMSgidGFrZVBpY3R1cmUgKHBpZCAlZCk6IDB4JXgiLCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLCBtc2dUeXBlKTsKIAogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICBzdGF0dXNfdCByZXN1bHQgPSBjaGVja1BpZEFuZEhhcmR3YXJlKCk7CkBAIC02ODEsNyArNjc4LDcgQEAKIAogLy8gc2V0IHByZXZpZXcvY2FwdHVyZSBwYXJhbWV0ZXJzIC0ga2V5L3ZhbHVlIHBhaXJzCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnNldFBhcmFtZXRlcnMoY29uc3QgU3RyaW5nOCYgcGFyYW1zKSB7Ci0gICAgTE9HMSgic2V0UGFyYW1ldGVycyAocGlkICVkKSAoJXMpIiwgZ2V0Q2FsbGluZ1BpZCgpLCBwYXJhbXMuc3RyaW5nKCkpOworICAgIExPRzEoInNldFBhcmFtZXRlcnMgKHBpZCAlZCkgKCVzKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCksIHBhcmFtcy5zdHJpbmcoKSk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwpAQCAtNjk2LDE2ICs2OTMsMTggQEAKIFN0cmluZzggQ2FtZXJhQ2xpZW50OjpnZXRQYXJhbWV0ZXJzKCkgY29uc3QgewogICAgIE11dGV4OjpBdXRvbG9jayBsb2NrKG1Mb2NrKTsKICAgICAvLyBUaGUgY2FtZXJhIHNlcnZpY2UgY2FuIHVuY29uZGl0aW9uYWxseSBnZXQgdGhlIHBhcmFtZXRlcnMgYXQgYWxsIHRpbWVzCi0gICAgaWYgKGdldENhbGxpbmdQaWQoKSAhPSBtU2VydmljZVBpZCAmJiBjaGVja1BpZEFuZEhhcmR3YXJlKCkgIT0gTk9fRVJST1IpIHJldHVybiBTdHJpbmc4KCk7CisgICAgaWYgKENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkgIT0gbVNlcnZpY2VQaWQgJiYgY2hlY2tQaWRBbmRIYXJkd2FyZSgpICE9IE5PX0VSUk9SKSB7CisgICAgICAgIHJldHVybiBTdHJpbmc4KCk7CisgICAgfQogCiAgICAgU3RyaW5nOCBwYXJhbXMobUhhcmR3YXJlLT5nZXRQYXJhbWV0ZXJzKCkuZmxhdHRlbigpKTsKLSAgICBMT0cxKCJnZXRQYXJhbWV0ZXJzIChwaWQgJWQpICglcykiLCBnZXRDYWxsaW5nUGlkKCksIHBhcmFtcy5zdHJpbmcoKSk7CisgICAgTE9HMSgiZ2V0UGFyYW1ldGVycyAocGlkICVkKSAoJXMpIiwgQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKSwgcGFyYW1zLnN0cmluZygpKTsKICAgICByZXR1cm4gcGFyYW1zOwogfQogCiAvLyBlbmFibGUgc2h1dHRlciBzb3VuZAogc3RhdHVzX3QgQ2FtZXJhQ2xpZW50OjplbmFibGVTaHV0dGVyU291bmQoYm9vbCBlbmFibGUpIHsKLSAgICBMT0cxKCJlbmFibGVTaHV0dGVyU291bmQgKHBpZCAlZCkiLCBnZXRDYWxsaW5nUGlkKCkpOworICAgIExPRzEoImVuYWJsZVNodXR0ZXJTb3VuZCAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogCiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwogICAgIGlmIChyZXN1bHQgIT0gTk9fRVJST1IpIHJldHVybiByZXN1bHQ7CkBAIC03MTUsMzIgKzcxNCwxMiBAQAogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQogCi0gICAgLy8gdGhlIGNhbWVyYTIgYXBpIGxlZ2FjeSBtb2RlIGNhbiB1bmNvbmRpdGlvbmFsbHkgZGlzYWJsZSB0aGUgc2h1dHRlciBzb3VuZAotICAgIGlmIChtTGVnYWN5TW9kZSkgewotICAgICAgICBBTE9HVigiJXM6IERpc2FibGUgc2h1dHRlciBzb3VuZCBpbiBsZWdhY3kgbW9kZSIsIF9fRlVOQ1RJT05fXyk7Ci0gICAgICAgIG1QbGF5U2h1dHRlclNvdW5kID0gZmFsc2U7Ci0gICAgICAgIHJldHVybiBPSzsKLSAgICB9Ci0KLSAgICAvLyBEaXNhYmxpbmcgc2h1dHRlciBzb3VuZCBtYXkgbm90IGJlIGFsbG93ZWQuIEluIHRoYXQgY2FzZSBvbmx5Ci0gICAgLy8gYWxsb3cgdGhlIG1lZGlhc2VydmVyIHByb2Nlc3MgdG8gZGlzYWJsZSB0aGUgc291bmQuCi0gICAgY2hhciB2YWx1ZVtQUk9QRVJUWV9WQUxVRV9NQVhdOwotICAgIHByb3BlcnR5X2dldCgicm8uY2FtZXJhLnNvdW5kLmZvcmNlZCIsIHZhbHVlLCAiMCIpOwotICAgIGlmIChzdHJjbXAodmFsdWUsICIwIikgIT0gMCkgewotICAgICAgICAvLyBEaXNhYmxpbmcgc2h1dHRlciBzb3VuZCBpcyBub3QgYWxsb3dlZC4gRGVueSBpZiB0aGUgY3VycmVudAotICAgICAgICAvLyBwcm9jZXNzIGlzIG5vdCBtZWRpYXNlcnZlci4KLSAgICAgICAgaWYgKGdldENhbGxpbmdQaWQoKSAhPSBnZXRwaWQoKSkgewotICAgICAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBkaXNhYmxlIHNodXR0ZXIgc291bmQuIFBlcm1pc3Npb24gZGVuaWVkIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKLSAgICAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKLSAgICAgICAgfQotICAgIH0KLQogICAgIG1QbGF5U2h1dHRlclNvdW5kID0gZmFsc2U7CiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBDYW1lcmFDbGllbnQ6OnNlbmRDb21tYW5kKGludDMyX3QgY21kLCBpbnQzMl90IGFyZzEsIGludDMyX3QgYXJnMikgewotICAgIExPRzEoInNlbmRDb21tYW5kIChwaWQgJWQpIiwgZ2V0Q2FsbGluZ1BpZCgpKTsKKyAgICBMT0cxKCJzZW5kQ29tbWFuZCAocGlkICVkKSIsIENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCkpOwogICAgIGludCBvcmllbnRhdGlvbjsKICAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CiAgICAgc3RhdHVzX3QgcmVzdWx0ID0gY2hlY2tQaWRBbmRIYXJkd2FyZSgpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvQ2FtZXJhQ2xpZW50LmgKaW5kZXggMTkxMDUzNi4uOTUzMGI2YyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9DYW1lcmFDbGllbnQuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL0NhbWVyYUNsaWVudC5oCkBAIC02OCw4ICs2OCw3IEBACiAgICAgICAgICAgICBpbnQgY2FtZXJhRmFjaW5nLAogICAgICAgICAgICAgaW50IGNsaWVudFBpZCwKICAgICAgICAgICAgIGludCBjbGllbnRVaWQsCi0gICAgICAgICAgICBpbnQgc2VydmljZVBpZCwKLSAgICAgICAgICAgIGJvb2wgbGVnYWN5TW9kZSA9IGZhbHNlKTsKKyAgICAgICAgICAgIGludCBzZXJ2aWNlUGlkKTsKICAgICB+Q2FtZXJhQ2xpZW50KCk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGluaXRpYWxpemUoc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtYW5hZ2VyLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuY3BwCmluZGV4IDcwMzQxYzUuLjg4Nzk5ZjkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5jcHAKQEAgLTUwLDggKzUwLDcgQEAKICAgICAgICAgbVN0YXRlVHJhbnNpdGlvbkNvdW50KDApLAogICAgICAgICBtVHJpZ2dlcklkKDApLAogICAgICAgICBtVGltZW91dENvdW50KDApLAotICAgICAgICBtQ2FwdHVyZUlkKENhbWVyYTJDbGllbnQ6OmtDYXB0dXJlUmVxdWVzdElkU3RhcnQpLAotICAgICAgICBtTXNnVHlwZSgwKSB7CisgICAgICAgIG1DYXB0dXJlSWQoQ2FtZXJhMkNsaWVudDo6a0NhcHR1cmVSZXF1ZXN0SWRTdGFydCkgewogICAgIEFMT0dWKCIlcyIsIF9fRlVOQ1RJT05fXyk7CiB9CiAKQEAgLTY0LDcgKzYzLDcgQEAKICAgICBtWnNsUHJvY2Vzc29yID0gcHJvY2Vzc29yOwogfQogCi1zdGF0dXNfdCBDYXB0dXJlU2VxdWVuY2VyOjpzdGFydENhcHR1cmUoaW50IG1zZ1R5cGUpIHsKK3N0YXR1c190IENhcHR1cmVTZXF1ZW5jZXI6OnN0YXJ0Q2FwdHVyZSgpIHsKICAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwpAQCAtNzMsNyArNzIsNiBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogICAgIGlmICghbVN0YXJ0Q2FwdHVyZSkgewotICAgICAgICBtTXNnVHlwZSA9IG1zZ1R5cGU7CiAgICAgICAgIG1TdGFydENhcHR1cmUgPSB0cnVlOwogICAgICAgICBtU3RhcnRDYXB0dXJlU2lnbmFsLnNpZ25hbCgpOwogICAgIH0KQEAgLTExOSw2ICsxMTcsMzEgQEAKICAgICB9CiB9CiAKK3ZvaWQgQ2FwdHVyZVNlcXVlbmNlcjo6bm90aWZ5RXJyb3IoaW50MzJfdCBlcnJvckNvZGUsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgYm9vbCBqcGVnQnVmZmVyTG9zdCA9IGZhbHNlOworICAgIGlmIChlcnJvckNvZGUgPT0gaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVIpIHsKKyAgICAgICAgc3A8Q2FtZXJhMkNsaWVudD4gY2xpZW50ID0gbUNsaWVudC5wcm9tb3RlKCk7CisgICAgICAgIGlmIChjbGllbnQgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGludCBjYXB0dXJlU3RyZWFtSWQgPSBjbGllbnQtPmdldENhcHR1cmVTdHJlYW1JZCgpOworICAgICAgICBpZiAoY2FwdHVyZVN0cmVhbUlkID09IHJlc3VsdEV4dHJhcy5lcnJvclN0cmVhbUlkKSB7CisgICAgICAgICAgICBqcGVnQnVmZmVyTG9zdCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKGVycm9yQ29kZSA9PQorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNUKSB7CisgICAgICAgIGlmIChyZXN1bHRFeHRyYXMucmVxdWVzdElkID09IG1TaHV0dGVyQ2FwdHVyZUlkKSB7CisgICAgICAgICAgICBqcGVnQnVmZmVyTG9zdCA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoanBlZ0J1ZmZlckxvc3QpIHsKKyAgICAgICAgc3A8TWVtb3J5QmFzZT4gZW1wdHlCdWZmZXI7CisgICAgICAgIG9uQ2FwdHVyZUF2YWlsYWJsZSgvKnRpbWVzdGFtcCovMCwgZW1wdHlCdWZmZXIsIC8qY2FwdHVyZUVycm9yKi90cnVlKTsKKyAgICB9Cit9CisKIHZvaWQgQ2FwdHVyZVNlcXVlbmNlcjo6b25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0KSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IE5ldyByZXN1bHQgYXZhaWxhYmxlLiIsIF9fRlVOQ1RJT05fXyk7CkBAIC0zODYsNyArNDA5LDcgQEAKIAogICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChjbGllbnQtPmdldFBhcmFtZXRlcnMoKSk7CiAgICAgLyogd2FybmluZzogdGhpcyBhbHNvIGxvY2tzIGEgU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzICovCi0gICAgc2h1dHRlck5vdGlmeUxvY2tlZChsLm1QYXJhbWV0ZXJzLCBjbGllbnQsIG1Nc2dUeXBlKTsKKyAgICBzaHV0dGVyTm90aWZ5TG9ja2VkKGwubVBhcmFtZXRlcnMsIGNsaWVudCk7CiAgICAgbVNodXR0ZXJOb3RpZmllZCA9IHRydWU7CiAgICAgbVRpbWVvdXRDb3VudCA9IGtNYXhUaW1lb3V0c0ZvckNhcHR1cmVFbmQ7CiAgICAgcmV0dXJuIFNUQU5EQVJEX0NBUFRVUkVfV0FJVDsKQEAgLTYwNiw3ICs2MjksNyBAQAogICAgICAgICBpZiAoIW1TaHV0dGVyTm90aWZpZWQpIHsKICAgICAgICAgICAgIFNoYXJlZFBhcmFtZXRlcnM6OkxvY2sgbChjbGllbnQtPmdldFBhcmFtZXRlcnMoKSk7CiAgICAgICAgICAgICAvKiB3YXJuaW5nOiB0aGlzIGFsc28gbG9ja3MgYSBTaGFyZWRDYW1lcmFDYWxsYmFja3MgKi8KLSAgICAgICAgICAgIHNodXR0ZXJOb3RpZnlMb2NrZWQobC5tUGFyYW1ldGVycywgY2xpZW50LCBtTXNnVHlwZSk7CisgICAgICAgICAgICBzaHV0dGVyTm90aWZ5TG9ja2VkKGwubVBhcmFtZXRlcnMsIGNsaWVudCk7CiAgICAgICAgICAgICBtU2h1dHRlck5vdGlmaWVkID0gdHJ1ZTsKICAgICAgICAgfQogICAgIH0gZWxzZSBpZiAobVRpbWVvdXRDb3VudCA8PSAwKSB7CkBAIC03MjMsMTIgKzc0NiwxMSBAQAogfQogCiAvKnN0YXRpYyovIHZvaWQgQ2FwdHVyZVNlcXVlbmNlcjo6c2h1dHRlck5vdGlmeUxvY2tlZChjb25zdCBQYXJhbWV0ZXJzICZwYXJhbXMsCi0gICAgICAgICAgICBjb25zdCBzcDxDYW1lcmEyQ2xpZW50PiYgY2xpZW50LCBpbnQgbXNnVHlwZSkgeworICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhMkNsaWVudD4mIGNsaWVudCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBpZiAocGFyYW1zLnN0YXRlID09IFBhcmFtZXRlcnM6OlNUSUxMX0NBUFRVUkUKLSAgICAgICAgJiYgcGFyYW1zLnBsYXlTaHV0dGVyU291bmQKLSAgICAgICAgJiYgKG1zZ1R5cGUgJiBDQU1FUkFfTVNHX1NIVVRURVIpKSB7CisgICAgICAgICYmIHBhcmFtcy5wbGF5U2h1dHRlclNvdW5kKSB7CiAgICAgICAgIGNsaWVudC0+Z2V0Q2FtZXJhU2VydmljZSgpLT5wbGF5U291bmQoQ2FtZXJhU2VydmljZTo6U09VTkRfU0hVVFRFUik7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0NhcHR1cmVTZXF1ZW5jZXIuaAppbmRleCBmMmUzNzUwLi43MjdkZDUzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvQ2FwdHVyZVNlcXVlbmNlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9DYXB0dXJlU2VxdWVuY2VyLmgKQEAgLTUxLDcgKzUxLDcgQEAKICAgICB2b2lkIHNldFpzbFByb2Nlc3Nvcihjb25zdCB3cDxac2xQcm9jZXNzb3I+JiBwcm9jZXNzb3IpOwogCiAgICAgLy8gQmVnaW4gc3RpbGwgaW1hZ2UgY2FwdHVyZQotICAgIHN0YXR1c190IHN0YXJ0Q2FwdHVyZShpbnQgbXNnVHlwZSk7CisgICAgc3RhdHVzX3Qgc3RhcnRDYXB0dXJlKCk7CiAKICAgICAvLyBXYWl0IHVudGlsIGN1cnJlbnQgaW1hZ2UgY2FwdHVyZSBjb21wbGV0ZXM7IHJldHVybnMgaW1tZWRpYXRlbHkgaWYgbm8KICAgICAvLyBjYXB0dXJlIGlzIGFjdGl2ZS4gUmV0dXJucyBUSU1FRF9PVVQgaWYgY2FwdHVyZSBkb2VzIG5vdCBjb21wbGV0ZSBkdXJpbmcKQEAgLTY1LDYgKzY1LDkgQEAKICAgICB2b2lkIG5vdGlmeVNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCk7CiAKKyAgICAvLyBOb3RpZmljYXRpb25zIGFib3V0IHNodXR0ZXIgKGNhcHR1cmUgc3RhcnQpCisgICAgdm9pZCBub3RpZnlFcnJvcihpbnQzMl90IGVycm9yQ29kZSwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKKwogICAgIC8vIE5vdGlmaWNhdGlvbiBmcm9tIHRoZSBmcmFtZSBwcm9jZXNzb3IKICAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bHRBdmFpbGFibGUoY29uc3QgQ2FwdHVyZVJlc3VsdCAmcmVzdWx0KTsKIApAQCAtMTQ1LDcgKzE0OCw2IEBACiAgICAgYm9vbCBtQWVJblByZWNhcHR1cmU7CiAKICAgICBpbnQzMl90IG1DYXB0dXJlSWQ7Ci0gICAgaW50IG1Nc2dUeXBlOwogCiAgICAgLy8gTWFpbiBpbnRlcm5hbCBtZXRob2RzCiAKQEAgLTE3Miw3ICsxNzQsNyBAQAogCiAgICAgLy8gRW1pdCBTaHV0dGVyL1JhdyBjYWxsYmFjayB0byBqYXZhLCBhbmQgbWF5YmUgcGxheSBhIHNodXR0ZXIgc291bmQKICAgICBzdGF0aWMgdm9pZCBzaHV0dGVyTm90aWZ5TG9ja2VkKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcywKLSAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+JiBjbGllbnQsIGludCBtc2dUeXBlKTsKKyAgICAgICAgICAgIGNvbnN0IHNwPENhbWVyYTJDbGllbnQ+JiBjbGllbnQpOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuY3BwCmluZGV4IDBjNzM4ZTcuLjY4M2U4NGQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9GcmFtZVByb2Nlc3Nvci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmNwcApAQCAtMzMsNyArMzMsMTAgQEAKICAgICBGcmFtZVByb2Nlc3NvckJhc2UoZGV2aWNlKSwKICAgICBtQ2xpZW50KGNsaWVudCksCiAgICAgbUxhc3RGcmFtZU51bWJlck9mRmFjZXMoMCksCi0gICAgbUxhc3QzQUZyYW1lTnVtYmVyKC0xKSB7CisgICAgbUxhc3QzQUZyYW1lTnVtYmVyKC0xKSwKKyAgICBtTGFzdEFFRnJhbWVOdW1iZXIoLTEpLAorICAgIG1MYXN0QUZyYW1lTnVtYmVyKC0xKSwKKyAgICBtTGFzdEFXQkZyYW1lTnVtYmVyKC0xKSB7CiAKICAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkID0gZGV2aWNlLnByb21vdGUoKTsKICAgICBtU3ludGhlc2l6ZTNBTm90aWZ5ID0gIShkLT53aWxsTm90aWZ5M0EoKSk7CkBAIC0yNjIsMjQgKzI2NSw3MyBAQAogICAgIGJvb2wgZ290QWxsU3RhdGVzID0gdHJ1ZTsKIAogICAgIC8vIFRPRE86IEFsc28gdXNlIEFFIG1vZGUsIEFFIHRyaWdnZXIgSUQKLSAgICBnb3RBbGxTdGF0ZXMgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfTU9ERSwKKyAgICBib29sIGdvdEFGU3RhdGUgPSB1cGRhdGVQZW5kaW5nU3RhdGU8dWludDhfdD4obWV0YWRhdGEsIEFORFJPSURfQ09OVFJPTF9BRl9NT0RFLAogICAgICAgICAgICAgJnBlbmRpbmdTdGF0ZS5hZk1vZGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX01PREUsCisgICAgYm9vbCBnb3RBV0JTdGF0ZSA9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFLAogICAgICAgICAgICAgJnBlbmRpbmdTdGF0ZS5hd2JNb2RlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFLAorICAgIGJvb2wgZ290QUVTdGF0ZSA9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFLAogICAgICAgICAgICAgJnBlbmRpbmdTdGF0ZS5hZVN0YXRlLCBmcmFtZU51bWJlciwgY2FtZXJhSWQpOwogCi0gICAgZ290QWxsU3RhdGVzICY9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FGX1NUQVRFLAorICAgIGdvdEFGU3RhdGUgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQUZfU1RBVEUsCiAgICAgICAgICAgICAmcGVuZGluZ1N0YXRlLmFmU3RhdGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKLSAgICBnb3RBbGxTdGF0ZXMgJj0gdXBkYXRlUGVuZGluZ1N0YXRlPHVpbnQ4X3Q+KG1ldGFkYXRhLCBBTkRST0lEX0NPTlRST0xfQVdCX1NUQVRFLAorICAgIGdvdEFXQlN0YXRlICY9IHVwZGF0ZVBlbmRpbmdTdGF0ZTx1aW50OF90PihtZXRhZGF0YSwgQU5EUk9JRF9DT05UUk9MX0FXQl9TVEFURSwKICAgICAgICAgICAgICZwZW5kaW5nU3RhdGUuYXdiU3RhdGUsIGZyYW1lTnVtYmVyLCBjYW1lcmFJZCk7CiAKICAgICBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQgPSBmcmFtZS5tUmVzdWx0RXh0cmFzLmFmVHJpZ2dlcklkOwogICAgIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCA9IGZyYW1lLm1SZXN1bHRFeHRyYXMucHJlY2FwdHVyZVRyaWdnZXJJZDsKIAorICAgIGlmIChnb3RBRVN0YXRlICYmIChmcmFtZU51bWJlciA+IG1MYXN0QUVGcmFtZU51bWJlcikpIHsKKyAgICAgICAgaWYgKHBlbmRpbmdTdGF0ZS5hZVN0YXRlICE9IG0zYVN0YXRlLmFlU3RhdGUgfHwKKyAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQgPiBtM2FTdGF0ZS5hZVRyaWdnZXJJZCkgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFFIHN0YXRlICVkLT4lZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFlU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZVN0YXRlKTsKKyAgICAgICAgICAgIGNsaWVudC0+bm90aWZ5QXV0b0V4cG9zdXJlKHBlbmRpbmdTdGF0ZS5hZVN0YXRlLCBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQpOworCisgICAgICAgICAgICBtM2FTdGF0ZS5hZVN0YXRlID0gcGVuZGluZ1N0YXRlLmFlU3RhdGU7CisgICAgICAgICAgICBtM2FTdGF0ZS5hZVRyaWdnZXJJZCA9IHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZDsKKyAgICAgICAgICAgIG1MYXN0QUVGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGdvdEFGU3RhdGUgJiYgKGZyYW1lTnVtYmVyID4gbUxhc3RBRnJhbWVOdW1iZXIpKSB7CisgICAgICAgIGlmIChwZW5kaW5nU3RhdGUuYWZTdGF0ZSAhPSBtM2FTdGF0ZS5hZlN0YXRlIHx8CisgICAgICAgICAgICAgICAgcGVuZGluZ1N0YXRlLmFmTW9kZSAhPSBtM2FTdGF0ZS5hZk1vZGUgfHwKKyAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQgIT0gbTNhU3RhdGUuYWZUcmlnZ2VySWQpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBRiBzdGF0ZSAlZC0+JWQuIEFGIG1vZGUgJWQtPiVkLiBUcmlnZ2VyICVkLT4lZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZlN0YXRlLAorICAgICAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZk1vZGUsIHBlbmRpbmdTdGF0ZS5hZk1vZGUsCisgICAgICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFmVHJpZ2dlcklkLCBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQpOworICAgICAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvRm9jdXMocGVuZGluZ1N0YXRlLmFmU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCk7CisKKyAgICAgICAgICAgIG0zYVN0YXRlLmFmU3RhdGUgPSBwZW5kaW5nU3RhdGUuYWZTdGF0ZTsKKyAgICAgICAgICAgIG0zYVN0YXRlLmFmTW9kZSA9IHBlbmRpbmdTdGF0ZS5hZk1vZGU7CisgICAgICAgICAgICBtM2FTdGF0ZS5hZlRyaWdnZXJJZCA9IHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZDsKKyAgICAgICAgICAgIG1MYXN0QUZyYW1lTnVtYmVyID0gZnJhbWVOdW1iZXI7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoZ290QVdCU3RhdGUgJiYgKGZyYW1lTnVtYmVyID4gbUxhc3RBV0JGcmFtZU51bWJlcikpIHsKKyAgICAgICAgaWYgKHBlbmRpbmdTdGF0ZS5hd2JTdGF0ZSAhPSBtM2FTdGF0ZS5hd2JTdGF0ZSB8fAorICAgICAgICAgICAgICAgIHBlbmRpbmdTdGF0ZS5hd2JNb2RlICE9IG0zYVN0YXRlLmF3Yk1vZGUpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBV0Igc3RhdGUgJWQtPiVkLiBBV0IgbW9kZSAlZC0+JWQiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hd2JTdGF0ZSwgcGVuZGluZ1N0YXRlLmF3YlN0YXRlLAorICAgICAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hd2JNb2RlLCBwZW5kaW5nU3RhdGUuYXdiTW9kZSk7CisgICAgICAgICAgICBjbGllbnQtPm5vdGlmeUF1dG9XaGl0ZWJhbGFuY2UocGVuZGluZ1N0YXRlLmF3YlN0YXRlLAorICAgICAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQpOworCisgICAgICAgICAgICBtM2FTdGF0ZS5hd2JNb2RlID0gcGVuZGluZ1N0YXRlLmF3Yk1vZGU7CisgICAgICAgICAgICBtM2FTdGF0ZS5hd2JTdGF0ZSA9IHBlbmRpbmdTdGF0ZS5hd2JTdGF0ZTsKKyAgICAgICAgICAgIG1MYXN0QVdCRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIGdvdEFsbFN0YXRlcyAmPSBnb3RBRVN0YXRlICYgZ290QUZTdGF0ZSAmIGdvdEFXQlN0YXRlOwogICAgIGlmICghZ290QWxsU3RhdGVzKSB7CiAgICAgICAgIC8vIElmIG5vdCBhbGwgc3RhdGVzIGFyZSByZWNlaXZlZCwgcHV0IHRoZSBwZW5kaW5nIHN0YXRlIHRvIG1QZW5kaW5nM0FTdGF0ZXMuCiAgICAgICAgIGlmIChpbmRleCA9PSBOQU1FX05PVF9GT1VORCkgewpAQCAtMjkwLDQwICszNDIsMTAgQEAKICAgICAgICAgcmV0dXJuIE5PVF9FTk9VR0hfREFUQTsKICAgICB9CiAKLSAgICAvLyBPbmNlIGFsbCAzQSBzdGF0ZXMgYXJlIHJlY2VpdmVkLCBub3RpZnkgdGhlIGNsaWVudCBhYm91dCAzQSBjaGFuZ2VzLgotICAgIGlmIChwZW5kaW5nU3RhdGUuYWVTdGF0ZSAhPSBtM2FTdGF0ZS5hZVN0YXRlIHx8Ci0gICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQgPiBtM2FTdGF0ZS5hZVRyaWdnZXJJZCkgewotICAgICAgICBBTE9HVigiJXM6IENhbWVyYSAlZDogQUUgc3RhdGUgJWQtPiVkIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmFlU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZVN0YXRlKTsKLSAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvRXhwb3N1cmUocGVuZGluZ1N0YXRlLmFlU3RhdGUsIHBlbmRpbmdTdGF0ZS5hZVRyaWdnZXJJZCk7Ci0gICAgfQotCi0gICAgaWYgKHBlbmRpbmdTdGF0ZS5hZlN0YXRlICE9IG0zYVN0YXRlLmFmU3RhdGUgfHwKLSAgICAgICAgcGVuZGluZ1N0YXRlLmFmTW9kZSAhPSBtM2FTdGF0ZS5hZk1vZGUgfHwKLSAgICAgICAgcGVuZGluZ1N0YXRlLmFmVHJpZ2dlcklkICE9IG0zYVN0YXRlLmFmVHJpZ2dlcklkKSB7Ci0gICAgICAgIEFMT0dWKCIlczogQ2FtZXJhICVkOiBBRiBzdGF0ZSAlZC0+JWQuIEFGIG1vZGUgJWQtPiVkLiBUcmlnZ2VyICVkLT4lZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZlN0YXRlLCBwZW5kaW5nU3RhdGUuYWZTdGF0ZSwKLSAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hZk1vZGUsIHBlbmRpbmdTdGF0ZS5hZk1vZGUsCi0gICAgICAgICAgICAgICAgbTNhU3RhdGUuYWZUcmlnZ2VySWQsIHBlbmRpbmdTdGF0ZS5hZlRyaWdnZXJJZCk7Ci0gICAgICAgIGNsaWVudC0+bm90aWZ5QXV0b0ZvY3VzKHBlbmRpbmdTdGF0ZS5hZlN0YXRlLCBwZW5kaW5nU3RhdGUuYWZUcmlnZ2VySWQpOwotICAgIH0KLSAgICBpZiAocGVuZGluZ1N0YXRlLmF3YlN0YXRlICE9IG0zYVN0YXRlLmF3YlN0YXRlIHx8Ci0gICAgICAgIHBlbmRpbmdTdGF0ZS5hd2JNb2RlICE9IG0zYVN0YXRlLmF3Yk1vZGUpIHsKLSAgICAgICAgQUxPR1YoIiVzOiBDYW1lcmEgJWQ6IEFXQiBzdGF0ZSAlZC0+JWQuIEFXQiBtb2RlICVkLT4lZCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYW1lcmFJZCwKLSAgICAgICAgICAgICAgICBtM2FTdGF0ZS5hd2JTdGF0ZSwgcGVuZGluZ1N0YXRlLmF3YlN0YXRlLAotICAgICAgICAgICAgICAgIG0zYVN0YXRlLmF3Yk1vZGUsIHBlbmRpbmdTdGF0ZS5hd2JNb2RlKTsKLSAgICAgICAgY2xpZW50LT5ub3RpZnlBdXRvV2hpdGViYWxhbmNlKHBlbmRpbmdTdGF0ZS5hd2JTdGF0ZSwKLSAgICAgICAgICAgICAgICBwZW5kaW5nU3RhdGUuYWVUcmlnZ2VySWQpOwotICAgIH0KLQogICAgIGlmIChpbmRleCAhPSBOQU1FX05PVF9GT1VORCkgewogICAgICAgICBtUGVuZGluZzNBU3RhdGVzLnJlbW92ZUl0ZW1zQXQoaW5kZXgpOwogICAgIH0KIAotICAgIG0zYVN0YXRlID0gcGVuZGluZ1N0YXRlOwogICAgIG1MYXN0M0FGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOwogCiAgICAgcmV0dXJuIE9LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0ZyYW1lUHJvY2Vzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaAppbmRleCA2MmE0ZTkxLi44MTgzYzEyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvRnJhbWVQcm9jZXNzb3IuaApAQCAtMTA0LDggKzEwNCw3IEBACiAgICAgLy8gVHJhY2sgbW9zdCByZWNlbnQgZnJhbWUgbnVtYmVyIGZvciB3aGljaCAzQSBub3RpZmljYXRpb25zIHdlcmUgc2VudCBmb3IuCiAgICAgLy8gVXNlZCB0byBmaWx0ZXIgYWdhaW5zdCBzZW5kaW5nIDNBIG5vdGlmaWNhdGlvbnMgZm9yIHRoZSBzYW1lIGZyYW1lCiAgICAgLy8gc2V2ZXJhbCB0aW1lcy4KLSAgICBpbnQzMl90IG1MYXN0M0FGcmFtZU51bWJlcjsKLQorICAgIGludDMyX3QgbUxhc3QzQUZyYW1lTnVtYmVyLCBtTGFzdEFFRnJhbWVOdW1iZXIsIG1MYXN0QUZyYW1lTnVtYmVyLCBtTGFzdEFXQkZyYW1lTnVtYmVyOwogICAgIC8vIEVtaXQgRmFjZURldGVjdGlvbiBldmVudCB0byBqYXZhIGlmIGZhY2VzIGNoYW5nZWQKICAgICB2b2lkIGNhbGxiYWNrRmFjZURldGVjdGlvbihjb25zdCBzcDxDYW1lcmEyQ2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9mcmFtZV9tZXRhZGF0YSAmbWV0YWRhdGEpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuY3BwCmluZGV4IGI3MDIwZmUuLmRkZmU1ZTMgMTAwNzU1Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5jcHAKQEAgLTYyLDI2ICs2Miw2IEBACiAgICAgfQogfQogCi12b2lkIEpwZWdQcm9jZXNzb3I6Om9uQnVmZmVyQWNxdWlyZWQoY29uc3QgQnVmZmVySW5mbyYgLypidWZmZXJJbmZvKi8pIHsKLSAgICAvLyBJbnRlbnRpb25hbGx5IGxlZnQgZW1wdHkKLX0KLQotdm9pZCBKcGVnUHJvY2Vzc29yOjpvbkJ1ZmZlclJlbGVhc2VkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pIHsKLSAgICBBTE9HVigiJXMiLCBfX0ZVTkNUSU9OX18pOwotICAgIGlmIChidWZmZXJJbmZvLm1FcnJvcikgewotICAgICAgICAvLyBPbmx5IGxvY2sgaW4gY2FzZSBvZiBlcnJvciwgc2luY2Ugd2UgZ2V0IG9uZSBvZiB0aGVzZSBmb3IgZWFjaAotICAgICAgICAvLyBvbkZyYW1lQXZhaWxhYmxlIGFzIHdlbGwsIGFuZCBzY2hlZHVsaW5nIG1heSBkZWxheSB0aGlzIGNhbGwgbGF0ZQotICAgICAgICAvLyBlbm91Z2ggdG8gcnVuIGludG8gbGF0ZXIgcHJldmlldyByZXN0YXJ0IG9wZXJhdGlvbnMsIGZvciBub24tZXJyb3IKLSAgICAgICAgLy8gY2FzZXMuCi0gICAgICAgIC8vIGIvMjk1MjQ2NTEKLSAgICAgICAgQUxPR1YoIiVzOiBKUEVHIGJ1ZmZlciBsb3N0IiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUlucHV0TXV0ZXgpOwotICAgICAgICBtQ2FwdHVyZURvbmUgPSB0cnVlOwotICAgICAgICBtQ2FwdHVyZVN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgICAgbUNhcHR1cmVEb25lU2lnbmFsLnNpZ25hbCgpOwotICAgIH0KLX0KLQogc3RhdHVzX3QgSnBlZ1Byb2Nlc3Nvcjo6dXBkYXRlU3RyZWFtKGNvbnN0IFBhcmFtZXRlcnMgJnBhcmFtcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKQEAgLTE3NiwxMyArMTU2LDYgQEAKICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0KLSAgICAgICAgcmVzID0gZGV2aWNlLT5hZGRCdWZmZXJMaXN0ZW5lckZvclN0cmVhbShtQ2FwdHVyZVN0cmVhbUlkLCB0aGlzKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlZDogQ2FuJ3QgYWRkIGJ1ZmZlciBsaXN0ZW5lcmk6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICAgIHJldHVybiByZXM7Ci0gICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIE9LOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9KcGVnUHJvY2Vzc29yLmgKaW5kZXggNzE4N2FkOS4uOTc3ZjExZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL0pwZWdQcm9jZXNzb3IuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5oCkBAIC0yNSw2ICsyNSw3IEBACiAjaW5jbHVkZSA8Z3VpL0NwdUNvbnN1bWVyLmg+CiAKICNpbmNsdWRlICJjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lci5oIgogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKQEAgLTQxLDggKzQyLDcgQEAKICAqIFN0aWxsIGltYWdlIGNhcHR1cmUgb3V0cHV0IGltYWdlIHByb2Nlc3NpbmcKICAqLwogY2xhc3MgSnBlZ1Byb2Nlc3NvcjoKLSAgICAgICAgICAgIHB1YmxpYyBUaHJlYWQsIHB1YmxpYyBDcHVDb25zdW1lcjo6RnJhbWVBdmFpbGFibGVMaXN0ZW5lciwKLSAgICAgICAgICAgIHB1YmxpYyBjYW1lcmEzOjpDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIgeworICAgICAgICAgICAgcHVibGljIFRocmVhZCwgcHVibGljIENwdUNvbnN1bWVyOjpGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIHsKICAgcHVibGljOgogICAgIEpwZWdQcm9jZXNzb3Ioc3A8Q2FtZXJhMkNsaWVudD4gY2xpZW50LCB3cDxDYXB0dXJlU2VxdWVuY2VyPiBzZXF1ZW5jZXIpOwogICAgIH5KcGVnUHJvY2Vzc29yKCk7CkBAIC01MCwxNSArNTAsMTQgQEAKICAgICAvLyBDcHVDb25zdW1lciBsaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgogICAgIHZvaWQgb25GcmFtZUF2YWlsYWJsZShjb25zdCBCdWZmZXJJdGVtJiBpdGVtKTsKIAotICAgIC8vIENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgotICAgIHZvaWQgb25CdWZmZXJBY3F1aXJlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSBvdmVycmlkZTsKLSAgICB2b2lkIG9uQnVmZmVyUmVsZWFzZWQoY29uc3QgQnVmZmVySW5mbyYgYnVmZmVySW5mbykgb3ZlcnJpZGU7Ci0KICAgICBzdGF0dXNfdCB1cGRhdGVTdHJlYW0oY29uc3QgUGFyYW1ldGVycyAmcGFyYW1zKTsKICAgICBzdGF0dXNfdCBkZWxldGVTdHJlYW0oKTsKICAgICBpbnQgZ2V0U3RyZWFtSWQoKSBjb25zdDsKIAogICAgIHZvaWQgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpIGNvbnN0OworCisgICAgc3RhdGljIHNpemVfdCBmaW5kSnBlZ1NpemUodWludDhfdCoganBlZ0J1ZmZlciwgc2l6ZV90IG1heFNpemUpOworCiAgIHByaXZhdGU6CiAgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga1dhaXREdXJhdGlvbiA9IDEwMDAwMDAwOyAvLyAxMCBtcwogICAgIHdwPENhbWVyYURldmljZUJhc2U+IG1EZXZpY2U7CkBAIC04Miw3ICs4MSw2IEBACiAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKIAogICAgIHN0YXR1c190IHByb2Nlc3NOZXdDYXB0dXJlKGJvb2wgY2FwdHVyZVN1Y2Nlc3MpOwotICAgIHNpemVfdCBmaW5kSnBlZ1NpemUodWludDhfdCoganBlZ0J1ZmZlciwgc2l6ZV90IG1heFNpemUpOwogCiB9OwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5jcHAKaW5kZXggMjhkMTg2YS4uMThhZGRiNSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmNwcApAQCAtNjksNyArNjksNyBAQAogICAgIHJlcyA9IGJ1aWxkUXVpcmtzKCk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKIAotICAgIGNvbnN0IFNpemUgTUFYX1BSRVZJRVdfU0laRSA9IHsgTUFYX1BSRVZJRVdfV0lEVEgsIE1BWF9QUkVWSUVXX0hFSUdIVCB9OworICAgIFNpemUgbWF4UHJldmlld1NpemUgPSB7IE1BWF9QUkVWSUVXX1dJRFRILCBNQVhfUFJFVklFV19IRUlHSFQgfTsKICAgICAvLyBUcmVhdCB0aGUgSC4yNjQgbWF4IHNpemUgYXMgdGhlIG1heCBzdXBwb3J0ZWQgdmlkZW8gc2l6ZS4KICAgICBNZWRpYVByb2ZpbGVzICp2aWRlb0VuY29kZXJQcm9maWxlcyA9IE1lZGlhUHJvZmlsZXM6OmdldEluc3RhbmNlKCk7CiAgICAgVmVjdG9yPHZpZGVvX2VuY29kZXI+IGVuY29kZXJzID0gdmlkZW9FbmNvZGVyUHJvZmlsZXMtPmdldFZpZGVvRW5jb2RlcnMoKTsKQEAgLTkwLDExICs5MCwxNiBAQAogICAgICAgICB9CiAgICAgfQogICAgIC8vIFRoaXMgaXMganVzdCBhbiB1cHBlciBib3VuZCBhbmQgbWF5IG5vdCBiZSBhbiBhY3R1YWxseSB2YWxpZCB2aWRlbyBzaXplCi0gICAgY29uc3QgU2l6ZSBWSURFT19TSVpFX1VQUEVSX0JPVU5EID0ge21heFZpZGVvV2lkdGgsIG1heFZpZGVvSGVpZ2h0fTsKKyAgICBTaXplIHZpZGVvU2l6ZVVwcGVyQm91bmQgPSB7bWF4VmlkZW9XaWR0aCwgbWF4VmlkZW9IZWlnaHR9OwogCi0gICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhNQVhfUFJFVklFV19TSVpFLCAmYXZhaWxhYmxlUHJldmlld1NpemVzKTsKKyAgICBpZiAoZmFzdEluZm8uc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzKSB7CisgICAgICAgIG1heFByZXZpZXdTaXplID0gZ2V0TWF4U2l6ZShnZXRQcmVmZXJyZWRQcmV2aWV3U2l6ZXMoKSk7CisgICAgICAgIHZpZGVvU2l6ZVVwcGVyQm91bmQgPSBnZXRNYXhTaXplKGdldFByZWZlcnJlZFZpZGVvU2l6ZXMoKSk7CisgICAgfQorCisgICAgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhtYXhQcmV2aWV3U2l6ZSwgJmF2YWlsYWJsZVByZXZpZXdTaXplcyk7CiAgICAgaWYgKHJlcyAhPSBPSykgcmV0dXJuIHJlczsKLSAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKFZJREVPX1NJWkVfVVBQRVJfQk9VTkQsICZhdmFpbGFibGVWaWRlb1NpemVzKTsKKyAgICByZXMgPSBnZXRGaWx0ZXJlZFNpemVzKHZpZGVvU2l6ZVVwcGVyQm91bmQsICZhdmFpbGFibGVWaWRlb1NpemVzKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogCiAgICAgLy8gU2VsZWN0IGluaXRpYWwgcHJldmlldyBhbmQgdmlkZW8gc2l6ZSB0aGF0J3MgdW5kZXIgdGhlIGluaXRpYWwgYm91bmQgYW5kCkBAIC0yOTYsOSArMzAxLDEzIEBACiAgICAgVmVjdG9yPFNpemU+IGF2YWlsYWJsZUpwZWdTaXplcyA9IGdldEF2YWlsYWJsZUpwZWdTaXplcygpOwogICAgIGlmICghYXZhaWxhYmxlSnBlZ1NpemVzLnNpemUoKSkgcmV0dXJuIE5PX0lOSVQ7CiAKLSAgICAvLyBUT0RPOiBQaWNrIG1heGltdW0KICAgICBwaWN0dXJlV2lkdGggPSBhdmFpbGFibGVKcGVnU2l6ZXNbMF0ud2lkdGg7CiAgICAgcGljdHVyZUhlaWdodCA9IGF2YWlsYWJsZUpwZWdTaXplc1swXS5oZWlnaHQ7CisgICAgaWYgKGZhc3RJbmZvLnN1cHBvcnRzUHJlZmVycmVkQ29uZmlncykgeworICAgICAgICBTaXplIHN1Z2dlc3RlZEpwZWdTaXplID0gZ2V0TWF4U2l6ZShnZXRQcmVmZXJyZWRKcGVnU2l6ZXMoKSk7CisgICAgICAgIHBpY3R1cmVXaWR0aCA9IHN1Z2dlc3RlZEpwZWdTaXplLndpZHRoOworICAgICAgICBwaWN0dXJlSGVpZ2h0ID0gc3VnZ2VzdGVkSnBlZ1NpemUuaGVpZ2h0OworICAgIH0KICAgICBwaWN0dXJlV2lkdGhMYXN0U2V0ID0gcGljdHVyZVdpZHRoOwogICAgIHBpY3R1cmVIZWlnaHRMYXN0U2V0ID0gcGljdHVyZUhlaWdodDsKICAgICBwaWN0dXJlU2l6ZU92ZXJyaWRlbiA9IGZhbHNlOwpAQCAtNzU3LDYgKzc2Niw3IEBACiAgICAgZm9jdXNTdGF0ZSA9IEFORFJPSURfQ09OVFJPTF9BRl9TVEFURV9JTkFDVElWRTsKICAgICBzaGFkb3dGb2N1c01vZGUgPSBGT0NVU19NT0RFX0lOVkFMSUQ7CiAKKyAgICBhZVN0YXRlID0gQU5EUk9JRF9DT05UUk9MX0FFX1NUQVRFX0lOQUNUSVZFOwogICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90IG1heDNhUmVnaW9ucyA9IHN0YXRpY0luZm8oQU5EUk9JRF9DT05UUk9MX01BWF9SRUdJT05TLAogICAgICAgICAgICAgUGFyYW1ldGVyczo6TlVNX1JFR0lPTiwgUGFyYW1ldGVyczo6TlVNX1JFR0lPTik7CiAgICAgaWYgKG1heDNhUmVnaW9ucy5jb3VudCAhPSBQYXJhbWV0ZXJzOjpOVU1fUkVHSU9OKSByZXR1cm4gTk9fSU5JVDsKQEAgLTEwMTAsNiArMTAyMCw5IEBACiAgICAgICAgIGFycmF5SGVpZ2h0ID0gYWN0aXZlQXJyYXlTaXplLmRhdGEuaTMyWzNdOwogICAgIH0gZWxzZSByZXR1cm4gTk9fSU5JVDsKIAorICAgIGZhc3RJbmZvLnN1cHBvcnRzUHJlZmVycmVkQ29uZmlncyA9CisgICAgICAgIGluZm8tPmV4aXN0cyhBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKwogICAgIC8vIFdlJ2xsIHNldCB0aGUgdGFyZ2V0IEZQUyByYW5nZSBmb3Igc3RpbGwgY2FwdHVyZXMgdG8gYmUgYXMgd2lkZQogICAgIC8vIGFzIHBvc3NpYmxlIHRvIGdpdmUgdGhlIEhBTCBtYXhpbXVtIGxhdGl0dWRlIGZvciBleHBvc3VyZSBzZWxlY3Rpb24KICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBhdmFpbGFibGVGcHNSYW5nZXMgPQpAQCAtMTAyMSw4ICsxMDM0LDExIEBACiAgICAgLy8gR2V0IHN1cHBvcnRlZCBwcmV2aWV3IGZwcyByYW5nZXMsIHVwIHRvIGRlZmF1bHQgbWF4aW11bS4KICAgICBWZWN0b3I8U2l6ZT4gc3VwcG9ydGVkUHJldmlld1NpemVzOwogICAgIFZlY3RvcjxGcHNSYW5nZT4gc3VwcG9ydGVkUHJldmlld0Zwc1JhbmdlczsKLSAgICBjb25zdCBTaXplIFBSRVZJRVdfU0laRV9CT1VORCA9IHsgTUFYX1BSRVZJRVdfV0lEVEgsIE1BWF9QUkVWSUVXX0hFSUdIVCB9OwotICAgIHN0YXR1c190IHJlcyA9IGdldEZpbHRlcmVkU2l6ZXMoUFJFVklFV19TSVpFX0JPVU5ELCAmc3VwcG9ydGVkUHJldmlld1NpemVzKTsKKyAgICBTaXplIHByZXZpZXdTaXplQm91bmQgPSB7IE1BWF9QUkVWSUVXX1dJRFRILCBNQVhfUFJFVklFV19IRUlHSFQgfTsKKyAgICBpZiAoZmFzdEluZm8uc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzKSB7CisgICAgICAgIHByZXZpZXdTaXplQm91bmQgPSBnZXRNYXhTaXplKGdldFByZWZlcnJlZFByZXZpZXdTaXplcygpKTsKKyAgICB9CisgICAgc3RhdHVzX3QgcmVzID0gZ2V0RmlsdGVyZWRTaXplcyhwcmV2aWV3U2l6ZUJvdW5kLCAmc3VwcG9ydGVkUHJldmlld1NpemVzKTsKICAgICBpZiAocmVzICE9IE9LKSByZXR1cm4gcmVzOwogICAgIGZvciAoc2l6ZV90IGk9MDsgaSA8IGF2YWlsYWJsZUZwc1Jhbmdlcy5jb3VudDsgaSArPSAyKSB7CiAgICAgICAgIGlmICghaXNGcHNTdXBwb3J0ZWQoc3VwcG9ydGVkUHJldmlld1NpemVzLApAQCAtMzEwNiw2ICszMTIyLDY3IEBACiAgICAgcmV0dXJuIGpwZWdTaXplczsKIH0KIAorVmVjdG9yPFBhcmFtZXRlcnM6OlN0cmVhbUNvbmZpZ3VyYXRpb24+IFBhcmFtZXRlcnM6OmdldFByZWZlcnJlZFN0cmVhbUNvbmZpZ3VyYXRpb25zKAorICAgICAgICBpbnQzMl90IHVzZWNhc2VJZCkgY29uc3QgeworICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fQ09ORklHVVJBVElPTl9TSVpFID0gNTsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX1dJRFRIX09GRlNFVCA9IDA7CisgICAgY29uc3Qgc2l6ZV90IFNUUkVBTV9IRUlHSFRfT0ZGU0VUID0gMTsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX0ZPUk1BVF9PRkZTRVQgPSAyOworICAgIGNvbnN0IHNpemVfdCBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUID0gMzsKKyAgICBjb25zdCBzaXplX3QgU1RSRUFNX1VTRUNBU0VfQklUTUFQX09GRlNFVCA9IDQ7CisgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IHNjczsKKworICAgIGlmIChmYXN0SW5mby5zdXBwb3J0c1ByZWZlcnJlZENvbmZpZ3MpIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgYXZhaWxhYmxlU3RyZWFtQ29uZmlncyA9IHN0YXRpY0luZm8oCisgICAgICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OUyk7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5jb3VudDsgaSs9IFNUUkVBTV9DT05GSUdVUkFUSU9OX1NJWkUpIHsKKyAgICAgICAgICAgIGludDMyX3Qgd2lkdGggPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fV0lEVEhfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDMyX3QgaGVpZ2h0ID0gYXZhaWxhYmxlU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpICsgU1RSRUFNX0hFSUdIVF9PRkZTRVRdOworICAgICAgICAgICAgaW50MzJfdCBmb3JtYXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fRk9STUFUX09GRlNFVF07CisgICAgICAgICAgICBpbnQzMl90IGlzSW5wdXQgPSBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fSVNfSU5QVVRfT0ZGU0VUXTsKKyAgICAgICAgICAgIGludDMyX3Qgc3VwcG9ydGVkVXNlY2FzZXMgPQorICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGVTdHJlYW1Db25maWdzLmRhdGEuaTMyW2kgKyBTVFJFQU1fVVNFQ0FTRV9CSVRNQVBfT0ZGU0VUXTsKKyAgICAgICAgICAgIGlmIChzdXBwb3J0ZWRVc2VjYXNlcyAmICgxIDw8IHVzZWNhc2VJZCkpIHsKKyAgICAgICAgICAgICAgICBTdHJlYW1Db25maWd1cmF0aW9uIHNjID0ge2Zvcm1hdCwgd2lkdGgsIGhlaWdodCwgaXNJbnB1dH07CisgICAgICAgICAgICAgICAgc2NzLmFkZChzYyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2NzOworfQorCitWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gUGFyYW1ldGVyczo6Z2V0UHJlZmVycmVkRmlsdGVyZWRTaXplcyhpbnQzMl90IHVzZWNhc2VJZCwKKyAgICAgICAgaW50MzJfdCBmb3JtYXQpIGNvbnN0IHsKKyAgICBWZWN0b3I8UGFyYW1ldGVyczo6U2l6ZT4gc2l6ZXM7CisgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IHNjcyA9IGdldFByZWZlcnJlZFN0cmVhbUNvbmZpZ3VyYXRpb25zKHVzZWNhc2VJZCk7CisgICAgZm9yIChjb25zdCBhdXRvICZpdCA6IHNjcykgeworICAgICAgICBpZiAoaXQuZm9ybWF0ID09IGZvcm1hdCkgeworICAgICAgICAgICAgc2l6ZXMuYWRkKHtpdC53aWR0aCwgaXQuaGVpZ2h0fSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gc2l6ZXM7Cit9CisKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBQYXJhbWV0ZXJzOjpnZXRQcmVmZXJyZWRKcGVnU2l6ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFByZWZlcnJlZEZpbHRlcmVkU2l6ZXMoCisgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfUkVDT01NRU5ERURfU1RSRUFNX0NPTkZJR1VSQVRJT05TX1NOQVBTSE9ULAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKTsKK30KKworVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IFBhcmFtZXRlcnM6OmdldFByZWZlcnJlZFByZXZpZXdTaXplcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UHJlZmVycmVkRmlsdGVyZWRTaXplcygKKyAgICAgICAgICAgIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9SRUNPTU1FTkRFRF9TVFJFQU1fQ09ORklHVVJBVElPTlNfUFJFVklFVywKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCk7Cit9CisKK1ZlY3RvcjxQYXJhbWV0ZXJzOjpTaXplPiBQYXJhbWV0ZXJzOjpnZXRQcmVmZXJyZWRWaWRlb1NpemVzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRQcmVmZXJyZWRGaWx0ZXJlZFNpemVzKAorICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1JFQ09NTUVOREVEX1NUUkVBTV9DT05GSUdVUkFUSU9OU19SRUNPUkQsCisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpOworfQorCiBQYXJhbWV0ZXJzOjpDcm9wUmVnaW9uIFBhcmFtZXRlcnM6OmNhbGN1bGF0ZUNyb3BSZWdpb24oYm9vbCBwcmV2aWV3T25seSkgY29uc3QgewogCiAgICAgZmxvYXQgem9vbUxlZnQsIHpvb21Ub3AsIHpvb21XaWR0aCwgem9vbUhlaWdodDsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkxL2NsaWVudDIvUGFyYW1ldGVycy5oCmluZGV4IDQyZTdhNDcuLjNhNzA5YzkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTEvY2xpZW50Mi9QYXJhbWV0ZXJzLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMS9jbGllbnQyL1BhcmFtZXRlcnMuaApAQCAtMTIyLDYgKzEyMiw3IEBACiAgICAgICAgIGludDMyX3QgaGlnaDsKICAgICB9OwogCisgICAgdWludDhfdCBhZVN0YXRlOyAvL2xhdGVzdCBBRSBzdGF0ZSBmcm9tIEhhbAogICAgIGludDMyX3QgZXhwb3N1cmVDb21wZW5zYXRpb247CiAgICAgYm9vbCBhdXRvRXhwb3N1cmVMb2NrOwogICAgIGJvb2wgYXV0b0V4cG9zdXJlTG9ja0F2YWlsYWJsZTsKQEAgLTI0Nyw2ICsyNDgsNyBAQAogICAgICAgICBib29sIHVzZUZsZXhpYmxlWXV2OwogICAgICAgICBTaXplIG1heEpwZWdTaXplOwogICAgICAgICBTaXplIG1heFpzbFNpemU7CisgICAgICAgIGJvb2wgc3VwcG9ydHNQcmVmZXJyZWRDb25maWdzOwogICAgIH0gZmFzdEluZm87CiAKICAgICAvLyBRdWlya3MgaW5mb3JtYXRpb247IHRoZXNlIGFyZSBzaG9ydC1saXZlZCBmbGFncyB0byBlbmFibGUgd29ya2Fyb3VuZHMgZm9yCkBAIC00MTcsNiArNDE5LDkgQEAKICAgICAvLyByZXR1cm5zIGFuIGVtcHR5IFZlY3RvciBpZiBkZXZpY2UgSEFMIHZlcnNpb24gZG9lcyBzdXBwb3J0IGl0CiAgICAgVmVjdG9yPFN0cmVhbUNvbmZpZ3VyYXRpb24+IGdldFN0cmVhbUNvbmZpZ3VyYXRpb25zKCk7CiAKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZXh0cmFjdCB0aGUgc3VnZ2VzdGVkIHN0cmVhbSBjb25maWd1cmF0aW9ucworICAgIFZlY3RvcjxTdHJlYW1Db25maWd1cmF0aW9uPiBnZXRQcmVmZXJyZWRTdHJlYW1Db25maWd1cmF0aW9ucyhpbnQzMl90IHVzZWNhc2VJZCkgY29uc3Q7CisKICAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IG1pbmltdW0gZnJhbWUgZHVyYXRpb24gZm9yIGEganBlZyBzaXplCiAgICAgLy8gcmV0dXJuIC0xIGlmIGlucHV0IGpwZWcgc2l6ZSBjYW5ub3QgYmUgZm91bmQgaW4gc3VwcG9ydGVkIHNpemUgbGlzdAogICAgIGludDY0X3QgZ2V0SnBlZ1N0cmVhbU1pbkZyYW1lRHVyYXRpb25OcyhQYXJhbWV0ZXJzOjpTaXplIHNpemUpOwpAQCAtNDM4LDYgKzQ0MywxNSBAQAogICAgIC8vIFRoZSBtYXhpbXVtIHNpemUgaXMgZGVmaW5lZCBieSBjb21wYXJpbmcgd2lkdGggZmlyc3QsIHdoZW4gd2lkdGggdGllcyBjb21wYXJpbmcgaGVpZ2h0LgogICAgIFNpemUgZ2V0TWF4U2l6ZShjb25zdCBWZWN0b3I8U2l6ZT4mIHNpemVzKTsKIAorICAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byBmaWx0ZXIgYW5kIHNvcnQgc3VnZ2VzdGVkIHNpemVzCisgICAgVmVjdG9yPFBhcmFtZXRlcnM6OlNpemU+IGdldFByZWZlcnJlZEZpbHRlcmVkU2l6ZXMoaW50MzJfdCB1c2VjYXNlSWQsIGludDMyX3QgZm9ybWF0KSBjb25zdDsKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdWdnZXN0ZWQganBlZyBzaXplcworICAgIFZlY3RvcjxTaXplPiBnZXRQcmVmZXJyZWRKcGVnU2l6ZXMoKSBjb25zdDsKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdWdnZXN0ZWQgcHJldmlldyBzaXplcworICAgIFZlY3RvcjxTaXplPiBnZXRQcmVmZXJyZWRQcmV2aWV3U2l6ZXMoKSBjb25zdDsKKyAgICAvLyBIZWxwZXIgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzdWdnZXN0ZWQgdmlkZW8gc2l6ZXMKKyAgICBWZWN0b3I8U2l6ZT4gZ2V0UHJlZmVycmVkVmlkZW9TaXplcygpIGNvbnN0OworCiAgICAgaW50IG1EZXZpY2VWZXJzaW9uOwogICAgIHVpbnQ4X3QgbURlZmF1bHRTY2VuZU1vZGU7CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuY3BwCmluZGV4IDU2N2IxNWYuLjM1ODdkYjMgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5jcHAKQEAgLTE5LDYgKzE5LDcgQEAKIC8vI2RlZmluZSBMT0dfTkRFQlVHIDAKIAogI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8dXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgogI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CkBAIC0yNiwxMCArMjcsMTUgQEAKICNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhVXRpbHMuaD4KIAogI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmgiCiAjaW5jbHVkZSAiYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaCIKIAogI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KIAorI2luY2x1ZGUgIkRlcHRoQ29tcG9zaXRlU3RyZWFtLmgiCisjaW5jbHVkZSAiSGVpY0NvbXBvc2l0ZVN0cmVhbS5oIgorCiAvLyBDb252ZW5pZW5jZSBtZXRob2RzIGZvciBjb25zdHJ1Y3RpbmcgYmluZGVyOjpTdGF0dXMgb2JqZWN0cyBmb3IgZXJyb3IgcmV0dXJucwogCiAjZGVmaW5lIFNUQVRVU19FUlJPUihlcnJvckNvZGUsIGVycm9yU3RyaW5nKSBcCkBAIC0xMjIsNiArMTI4LDcgQEAKICAgICAgICAgICAgICAgICBwaHlzaWNhbEtleXNFbnRyeS5kYXRhLmkzMiArIHBoeXNpY2FsS2V5c0VudHJ5LmNvdW50KTsKICAgICB9CiAKKyAgICBtUHJvdmlkZXJNYW5hZ2VyID0gcHJvdmlkZXJQdHI7CiAgICAgcmV0dXJuIE9LOwogfQogCkBAIC0xMzksNiArMTQ2LDcgQEAKIAogYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjppbnNlcnRHYnBMb2NrZWQoY29uc3Qgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4mIGdicCwKICAgICAgICAgU3VyZmFjZU1hcCogb3V0U3VyZmFjZU1hcCwgVmVjdG9yPGludDMyX3Q+KiBvdXRwdXRTdHJlYW1JZHMsIGludDMyX3QgKmN1cnJlbnRTdHJlYW1JZCkgeworICAgIGludCBjb21wb3NpdGVJZHg7CiAgICAgaW50IGlkeCA9IG1TdHJlYW1NYXAuaW5kZXhPZktleShJSW50ZXJmYWNlOjphc0JpbmRlcihnYnApKTsKIAogICAgIC8vIFRyeWluZyB0byBzdWJtaXQgcmVxdWVzdCB3aXRoIHN1cmZhY2UgdGhhdCB3YXNuJ3QgY3JlYXRlZApAQCAtMTQ4LDYgKzE1NiwxMSBAQAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAogICAgICAgICAgICAgICAgICJSZXF1ZXN0IHRhcmdldHMgU3VyZmFjZSB0aGF0IGlzIG5vdCBwYXJ0IG9mIGN1cnJlbnQgY2FwdHVyZSBzZXNzaW9uIik7CisgICAgfSBlbHNlIGlmICgoY29tcG9zaXRlSWR4ID0gbUNvbXBvc2l0ZVN0cmVhbU1hcC5pbmRleE9mS2V5KElJbnRlcmZhY2U6OmFzQmluZGVyKGdicCkpKQorICAgICAgICAgICAgIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGNvbXBvc2l0ZUlkeCktPmluc2VydEdicChvdXRTdXJmYWNlTWFwLCBvdXRwdXRTdHJlYW1JZHMsCisgICAgICAgICAgICAgICAgY3VycmVudFN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOwogICAgIH0KIAogICAgIGNvbnN0IFN0cmVhbVN1cmZhY2VJZCYgc3RyZWFtU3VyZmFjZUlkID0gbVN0cmVhbU1hcC52YWx1ZUF0KGlkeCk7CkBAIC00NjksNiArNDgyLDc5IEBACiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVELCAiQ2FtZXJhIGRldmljZSBubyBsb25nZXIgYWxpdmUiKTsKICAgICB9CiAKKyAgICByZXMgPSBjaGVja09wZXJhdGluZ01vZGVMb2NrZWQob3BlcmF0aW5nTW9kZSk7CisgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3RhdHVzX3QgZXJyID0gbURldmljZS0+Y29uZmlndXJlU3RyZWFtcyhzZXNzaW9uUGFyYW1zLCBvcGVyYXRpbmdNb2RlKTsKKyAgICBpZiAoZXJyID09IEJBRF9WQUxVRSkgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBVbnN1cHBvcnRlZCBzZXQgb2YgaW5wdXRzL291dHB1dHMgcHJvdmlkZWQiLAorICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOworICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IEVycm9yIGNvbmZpZ3VyaW5nIHN0cmVhbXM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKKyAgICB9IGVsc2UgeworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db21wb3NpdGVTdHJlYW1NYXAuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGVyciA9IG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChpKS0+Y29uZmlndXJlU3RyZWFtKCk7CisgICAgICAgICAgICBpZiAoZXJyICE9IE9LICkgeworICAgICAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IEVycm9yIGNvbmZpZ3VyaW5nIGNvbXBvc2l0ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAic3RyZWFtczogJXMgKCVkKSIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICByZXMgPSBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSU5WQUxJRF9PUEVSQVRJT04sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmNoZWNrU3VyZmFjZVR5cGVMb2NrZWQoc2l6ZV90IG51bUJ1ZmZlclByb2R1Y2VycywKKyAgICAgICAgYm9vbCBkZWZlcnJlZENvbnN1bWVyLCBpbnQgc3VyZmFjZVR5cGUpIGNvbnN0IHsKKyAgICBpZiAobnVtQnVmZmVyUHJvZHVjZXJzID4gTUFYX1NVUkZBQ0VTX1BFUl9TVFJFQU0pIHsKKyAgICAgICAgQUxPR0UoIiVzOiBHcmFwaGljQnVmZmVyUHJvZHVjZXIgY291bnQgJXp1IGZvciBzdHJlYW0gZXhjZWVkcyBsaW1pdCBvZiAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBudW1CdWZmZXJQcm9kdWNlcnMsIE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiU3VyZmFjZSBjb3VudCBpcyB0b28gaGlnaCIpOworICAgIH0gZWxzZSBpZiAoKG51bUJ1ZmZlclByb2R1Y2VycyA9PSAwKSAmJiAoIWRlZmVycmVkQ29uc3VtZXIpKSB7CisgICAgICAgIEFMT0dFKCIlczogTnVtYmVyIG9mIGNvbnN1bWVycyBjYW5ub3QgYmUgc21hbGxlciB0aGFuIDEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsICJObyB2YWxpZCBjb25zdW1lcnMuIik7CisgICAgfQorCisgICAgYm9vbCB2YWxpZFN1cmZhY2VUeXBlID0gKChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9WSUVXKSB8fAorICAgICAgICAgICAgKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1RFWFRVUkUpKTsKKworICAgIGlmIChkZWZlcnJlZENvbnN1bWVyICYmICF2YWxpZFN1cmZhY2VUeXBlKSB7CisgICAgICAgIEFMT0dFKCIlczogVGFyZ2V0IHN1cmZhY2UgaGFzIGludmFsaWQgc3VyZmFjZVR5cGUgPSAlZC4iLCBfX0ZVTkNUSU9OX18sIHN1cmZhY2VUeXBlKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiVGFyZ2V0IFN1cmZhY2UgaXMgaW52YWxpZCIpOworICAgIH0KKworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgQ2FtZXJhRGV2aWNlQ2xpZW50OjpjaGVja1BoeXNpY2FsQ2FtZXJhSWRMb2NrZWQoU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkKSB7CisgICAgaWYgKHBoeXNpY2FsQ2FtZXJhSWQuc2l6ZSgpID4gMCkgeworICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gcGh5c2ljYWxDYW1lcmFJZHM7CisgICAgICAgIGJvb2wgbG9naWNhbENhbWVyYSA9CisgICAgICAgICAgICBtUHJvdmlkZXJNYW5hZ2VyLT5pc0xvZ2ljYWxDYW1lcmEobUNhbWVyYUlkU3RyLnN0cmluZygpLCAmcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICBpZiAoIWxvZ2ljYWxDYW1lcmEgfHwKKyAgICAgICAgICAgICAgICBzdGQ6OmZpbmQocGh5c2ljYWxDYW1lcmFJZHMuYmVnaW4oKSwgcGh5c2ljYWxDYW1lcmFJZHMuZW5kKCksCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQuc3RyaW5nKCkpID09IHBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpKSB7CisgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiQ2FtZXJhICVzOiBDYW1lcmEgZG9lc24ndCBzdXBwb3J0IHBoeXNpY2FsQ2FtZXJhSWQgJXMuIiwKKyAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6Y2hlY2tPcGVyYXRpbmdNb2RlTG9ja2VkKGludCBvcGVyYXRpbmdNb2RlKSBjb25zdCB7CiAgICAgaWYgKG9wZXJhdGluZ01vZGUgPCAwKSB7CiAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAogICAgICAgICAgICAgIkNhbWVyYSAlczogSW52YWxpZCBvcGVyYXRpbmcgbW9kZSAlZCByZXF1ZXN0ZWQiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksIG9wZXJhdGluZ01vZGUpOwpAQCAtNDc3LDcgKzU2Myw2IEBACiAgICAgICAgICAgICAgICAgbXNnLnN0cmluZygpKTsKICAgICB9CiAKLSAgICAvLyBTYW5pdGl6ZSB0aGUgaGlnaCBzcGVlZCBzZXNzaW9uIGFnYWluc3QgbmVjZXNzYXJ5IGNhcGFiaWxpdHkgYml0LgogICAgIGJvb2wgaXNDb25zdHJhaW5lZEhpZ2hTcGVlZCA9IChvcGVyYXRpbmdNb2RlID09IElDYW1lcmFEZXZpY2VVc2VyOjpDT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREUpOwogICAgIGlmIChpc0NvbnN0cmFpbmVkSGlnaFNwZWVkKSB7CiAgICAgICAgIENhbWVyYU1ldGFkYXRhIHN0YXRpY0luZm8gPSBtRGV2aWNlLT5pbmZvKCk7CkBAIC01MDAsMTcgKzU4NSwyMDUgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHN0YXR1c190IGVyciA9IG1EZXZpY2UtPmNvbmZpZ3VyZVN0cmVhbXMoc2Vzc2lvblBhcmFtcywgb3BlcmF0aW5nTW9kZSk7Ci0gICAgaWYgKGVyciA9PSBCQURfVkFMVUUpIHsKLSAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogVW5zdXBwb3J0ZWQgc2V0IG9mIGlucHV0cy9vdXRwdXRzIHByb3ZpZGVkIiwKLSAgICAgICAgICAgICAgICBtQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKwordm9pZCBDYW1lcmFEZXZpY2VDbGllbnQ6Om1hcFN0cmVhbUluZm8oY29uc3QgT3V0cHV0U3RyZWFtSW5mbyAmc3RyZWFtSW5mbywKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIFN0cmluZzggcGh5c2ljYWxJZCwKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtICpzdHJlYW0gLypvdXQqLykgeworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3RyZWFtLT52M18yLnN0cmVhbVR5cGUgPSBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVR5cGU6Ok9VVFBVVDsKKyAgICBzdHJlYW0tPnYzXzIud2lkdGggPSBzdHJlYW1JbmZvLndpZHRoOworICAgIHN0cmVhbS0+djNfMi5oZWlnaHQgPSBzdHJlYW1JbmZvLmhlaWdodDsKKyAgICBzdHJlYW0tPnYzXzIuZm9ybWF0ID0gQ2FtZXJhM0RldmljZTo6bWFwVG9QaXhlbEZvcm1hdChzdHJlYW1JbmZvLmZvcm1hdCk7CisgICAgYXV0byB1ID0gc3RyZWFtSW5mby5jb25zdW1lclVzYWdlOworICAgIGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW06OmFwcGx5WlNMVXNhZ2VRdWlyayhzdHJlYW1JbmZvLmZvcm1hdCwgJnUpOworICAgIHN0cmVhbS0+djNfMi51c2FnZSA9IENhbWVyYTNEZXZpY2U6Om1hcFRvQ29uc3VtZXJVc2FnZSh1KTsKKyAgICBzdHJlYW0tPnYzXzIuZGF0YVNwYWNlID0gQ2FtZXJhM0RldmljZTo6bWFwVG9IaWRsRGF0YXNwYWNlKHN0cmVhbUluZm8uZGF0YVNwYWNlKTsKKyAgICBzdHJlYW0tPnYzXzIucm90YXRpb24gPSBDYW1lcmEzRGV2aWNlOjptYXBUb1N0cmVhbVJvdGF0aW9uKHJvdGF0aW9uKTsKKyAgICBzdHJlYW0tPnYzXzIuaWQgPSAtMTsgLy8gSW52YWxpZCBzdHJlYW0gaWQKKyAgICBzdHJlYW0tPnBoeXNpY2FsQ2FtZXJhSWQgPSBzdGQ6OnN0cmluZyhwaHlzaWNhbElkLnN0cmluZygpKTsKKyAgICBzdHJlYW0tPmJ1ZmZlclNpemUgPSAwOworfQorCitiaW5kZXI6OlN0YXR1cyBDYW1lcmFEZXZpY2VDbGllbnQ6OmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgIGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBzZXNzaW9uQ29uZmlndXJhdGlvbiwgYm9vbCAqc3RhdHVzIC8qb3V0Ki8pIHsKKyAgICBBVFJBQ0VfQ0FMTCgpOworCisgICAgYmluZGVyOjpTdGF0dXMgcmVzOworICAgIGlmICghKHJlcyA9IGNoZWNrUGlkU3RhdHVzKF9fRlVOQ1RJT05fXykpLmlzT2soKSkgcmV0dXJuIHJlczsKKworICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKKworICAgIGlmICghbURldmljZS5nZXQoKSkgeworICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRCwgIkNhbWVyYSBkZXZpY2Ugbm8gbG9uZ2VyIGFsaXZlIik7CisgICAgfQorCisgICAgYXV0byBvcGVyYXRpbmdNb2RlID0gc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0T3BlcmF0aW5nTW9kZSgpOworICAgIHJlcyA9IGNoZWNrT3BlcmF0aW5nTW9kZUxvY2tlZChvcGVyYXRpbmdNb2RlKTsKKyAgICBpZiAoIXJlcy5pc09rKCkpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAoc3RhdHVzID09IG51bGxwdHIpIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoICJDYW1lcmEgJXM6IEludmFsaWQgc3RhdHVzISIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSk7CiAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwotICAgIH0gZWxzZSBpZiAoZXJyICE9IE9LKSB7Ci0gICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IEVycm9yIGNvbmZpZ3VyaW5nIHN0cmVhbXM6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVycik7CisgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgbXNnLnN0cmluZygpKTsKKyAgICB9CisKKyAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gc3RyZWFtQ29uZmlndXJhdGlvbjsKKyAgICBhdXRvIHJldCA9IENhbWVyYTNEZXZpY2U6Om1hcFRvU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUoCisgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdD4gKG9wZXJhdGluZ01vZGUpLAorICAgICAgICAgICAgLypvdXQqLyAmc3RyZWFtQ29uZmlndXJhdGlvbi5vcGVyYXRpb25Nb2RlKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAorICAgICAgICAgICAgIkNhbWVyYSAlczogRmFpbGVkIG1hcHBpbmcgb3BlcmF0aW5nIG1vZGUgJWQgcmVxdWVzdGVkOiAlcyAoJWQpIiwgbUNhbWVyYUlkU3RyLnN0cmluZygpLAorICAgICAgICAgICAgb3BlcmF0aW5nTW9kZSwgc3RyZXJyb3IoLXJldCksIHJldCk7CiAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7Ci0gICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgIG1zZy5zdHJpbmcoKSk7CisgICAgfQorCisgICAgYm9vbCBpc0lucHV0VmFsaWQgPSAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRXaWR0aCgpID4gMCkgJiYKKyAgICAgICAgICAgIChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEhlaWdodCgpID4gMCkgJiYKKyAgICAgICAgICAgIChzZXNzaW9uQ29uZmlndXJhdGlvbi5nZXRJbnB1dEZvcm1hdCgpID4gMCk7CisgICAgYXV0byBvdXRwdXRDb25maWdzID0gc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0T3V0cHV0Q29uZmlndXJhdGlvbnMoKTsKKyAgICBzaXplX3Qgc3RyZWFtQ291bnQgPSBvdXRwdXRDb25maWdzLnNpemUoKTsKKyAgICBzdHJlYW1Db3VudCA9IGlzSW5wdXRWYWxpZCA/IHN0cmVhbUNvdW50ICsgMSA6IHN0cmVhbUNvdW50OworICAgIHN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtcy5yZXNpemUoc3RyZWFtQ291bnQpOworICAgIHNpemVfdCBzdHJlYW1JZHggPSAwOworICAgIGlmIChpc0lucHV0VmFsaWQpIHsKKyAgICAgICAgc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zW3N0cmVhbUlkeCsrXSA9IHt7LypzdHJlYW1JZCovMCwKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVR5cGU6OklOUFVULAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PiAoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRXaWR0aCgpKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4gKHNlc3Npb25Db25maWd1cmF0aW9uLmdldElucHV0SGVpZ2h0KCkpLAorICAgICAgICAgICAgICAgIENhbWVyYTNEZXZpY2U6Om1hcFRvUGl4ZWxGb3JtYXQoc2Vzc2lvbkNvbmZpZ3VyYXRpb24uZ2V0SW5wdXRGb3JtYXQoKSksCisgICAgICAgICAgICAgICAgLyp1c2FnZSovIDAsIEhBTF9EQVRBU1BBQ0VfVU5LTk9XTiwKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVJvdGF0aW9uOjpST1RBVElPTl8wfSwKKyAgICAgICAgICAgICAgICAvKnBoeXNpY2FsSWQqLyBudWxscHRyLCAvKmJ1ZmZlclNpemUqLzB9OworICAgIH0KKworICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiBvdXRwdXRDb25maWdzKSB7CisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+PiYgYnVmZmVyUHJvZHVjZXJzID0KKyAgICAgICAgICAgIGl0LmdldEdyYXBoaWNCdWZmZXJQcm9kdWNlcnMoKTsKKyAgICAgICAgYm9vbCBkZWZlcnJlZENvbnN1bWVyID0gaXQuaXNEZWZlcnJlZCgpOworICAgICAgICBTdHJpbmc4IHBoeXNpY2FsQ2FtZXJhSWQgPSBTdHJpbmc4KGl0LmdldFBoeXNpY2FsQ2FtZXJhSWQoKSk7CisgICAgICAgIHNpemVfdCBudW1CdWZmZXJQcm9kdWNlcnMgPSBidWZmZXJQcm9kdWNlcnMuc2l6ZSgpOworICAgICAgICBib29sIGlzU3RyZWFtSW5mb1ZhbGlkID0gZmFsc2U7CisgICAgICAgIE91dHB1dFN0cmVhbUluZm8gc3RyZWFtSW5mbzsKKworICAgICAgICByZXMgPSBjaGVja1N1cmZhY2VUeXBlTG9ja2VkKG51bUJ1ZmZlclByb2R1Y2VycywgZGVmZXJyZWRDb25zdW1lciwgaXQuZ2V0U3VyZmFjZVR5cGUoKSk7CisgICAgICAgIGlmICghcmVzLmlzT2soKSkgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIHJlcyA9IGNoZWNrUGh5c2ljYWxDYW1lcmFJZExvY2tlZChwaHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGRlZmVycmVkQ29uc3VtZXIpIHsKKyAgICAgICAgICAgIHN0cmVhbUluZm8ud2lkdGggPSBpdC5nZXRXaWR0aCgpOworICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQgPSBpdC5nZXRIZWlnaHQoKTsKKyAgICAgICAgICAgIHN0cmVhbUluZm8uZm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEOworICAgICAgICAgICAgc3RyZWFtSW5mby5kYXRhU3BhY2UgPSBhbmRyb2lkX2RhdGFzcGFjZV90OjpIQUxfREFUQVNQQUNFX1VOS05PV047CisgICAgICAgICAgICBhdXRvIHN1cmZhY2VUeXBlID0gaXQuZ2V0U3VyZmFjZVR5cGUoKTsKKyAgICAgICAgICAgIHN0cmVhbUluZm8uY29uc3VtZXJVc2FnZSA9IEdyYXBoaWNCdWZmZXI6OlVTQUdFX0hXX1RFWFRVUkU7CisgICAgICAgICAgICBpZiAoc3VyZmFjZVR5cGUgPT0gT3V0cHV0Q29uZmlndXJhdGlvbjo6U1VSRkFDRV9UWVBFX1NVUkZBQ0VfVklFVykgeworICAgICAgICAgICAgICAgIHN0cmVhbUluZm8uY29uc3VtZXJVc2FnZSB8PSBHcmFwaGljQnVmZmVyOjpVU0FHRV9IV19DT01QT1NFUjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hcFN0cmVhbUluZm8oc3RyZWFtSW5mbywgQ0FNRVJBM19TVFJFQU1fUk9UQVRJT05fMCwgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgICAgICAgICAgJnN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10pOworICAgICAgICAgICAgaXNTdHJlYW1JbmZvVmFsaWQgPSB0cnVlOworCisgICAgICAgICAgICBpZiAobnVtQnVmZmVyUHJvZHVjZXJzID09IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGZvciAoYXV0byYgYnVmZmVyUHJvZHVjZXIgOiBidWZmZXJQcm9kdWNlcnMpIHsKKyAgICAgICAgICAgIHNwPFN1cmZhY2U+IHN1cmZhY2U7CisgICAgICAgICAgICByZXMgPSBjcmVhdGVTdXJmYWNlRnJvbUdicChzdHJlYW1JbmZvLCBpc1N0cmVhbUluZm9WYWxpZCwgc3VyZmFjZSwgYnVmZmVyUHJvZHVjZXIsCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQpOworCisgICAgICAgICAgICBpZiAoIXJlcy5pc09rKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKworICAgICAgICAgICAgaWYgKCFpc1N0cmVhbUluZm9WYWxpZCkgeworICAgICAgICAgICAgICAgIGJvb2wgaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzOjpEZXB0aENvbXBvc2l0ZVN0cmVhbTo6aXNEZXB0aENvbXBvc2l0ZVN0cmVhbShzdXJmYWNlKTsKKyAgICAgICAgICAgICAgICBib29sIGlzSGVpY0NvbXBvc2l0ZVN0cmVhbSA9CisgICAgICAgICAgICAgICAgICAgICAgICBjYW1lcmEzOjpIZWljQ29tcG9zaXRlU3RyZWFtOjppc0hlaWNDb21wb3NpdGVTdHJlYW0oc3VyZmFjZSk7CisgICAgICAgICAgICAgICAgaWYgKGlzRGVwdGhDb21wb3NpdGVTdHJlYW0gfHwgaXNIZWljQ29tcG9zaXRlU3RyZWFtKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIFdlIG5lZWQgdG8gdGFrZSBpbiB0byBhY2NvdW50IHRoYXQgY29tcG9zaXRlIHN0cmVhbXMgY2FuIGhhdmUKKyAgICAgICAgICAgICAgICAgICAgLy8gYWRkaXRpb25hbCBpbnRlcm5hbCBjYW1lcmEgc3RyZWFtcy4KKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8T3V0cHV0U3RyZWFtSW5mbz4gY29tcG9zaXRlU3RyZWFtczsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzRGVwdGhDb21wb3NpdGVTdHJlYW0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IGNhbWVyYTM6OkRlcHRoQ29tcG9zaXRlU3RyZWFtOjpnZXRDb21wb3NpdGVTdHJlYW1JbmZvKHN0cmVhbUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2UtPmluZm8oKSwgJmNvbXBvc2l0ZVN0cmVhbXMpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gY2FtZXJhMzo6SGVpY0NvbXBvc2l0ZVN0cmVhbTo6Z2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhzdHJlYW1JbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1EZXZpY2UtPmluZm8oKSwgJmNvbXBvc2l0ZVN0cmVhbXMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhICVzOiBGYWlsZWQgYWRkaW5nIGNvbXBvc2l0ZSBzdHJlYW1zOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpLCBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gU1RBVFVTX0VSUk9SKENhbWVyYVNlcnZpY2U6OkVSUk9SX0lMTEVHQUxfQVJHVU1FTlQsIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAoY29tcG9zaXRlU3RyZWFtcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm8gaW50ZXJuYWwgc3RyZWFtcyBtZWFucyBjb21wb3NpdGUgc3RyZWFtIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3VwcG9ydGVkLgorICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXR1cyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGNvbXBvc2l0ZVN0cmVhbXMuc2l6ZSgpID4gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtQ291bnQgKz0gY29tcG9zaXRlU3RyZWFtcy5zaXplKCkgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShzdHJlYW1Db3VudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNvbXBvc2l0ZVN0cmVhbSA6IGNvbXBvc2l0ZVN0cmVhbXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcFN0cmVhbUluZm8oY29tcG9zaXRlU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90PiAoaXQuZ2V0Um90YXRpb24oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FtZXJhSWQsICZzdHJlYW1Db25maWd1cmF0aW9uLnN0cmVhbXNbc3RyZWFtSWR4KytdKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1hcFN0cmVhbUluZm8oc3RyZWFtSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90PiAoaXQuZ2V0Um90YXRpb24oKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCwgJnN0cmVhbUNvbmZpZ3VyYXRpb24uc3RyZWFtc1tzdHJlYW1JZHgrK10pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpc1N0cmVhbUluZm9WYWxpZCA9IHRydWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAqc3RhdHVzID0gZmFsc2U7CisgICAgcmV0ID0gbVByb3ZpZGVyTWFuYWdlci0+aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChtQ2FtZXJhSWRTdHIuc3RyaW5nKCksCisgICAgICAgICAgICBzdHJlYW1Db25maWd1cmF0aW9uLCBzdGF0dXMpOworICAgIHN3aXRjaCAocmV0KSB7CisgICAgICAgIGNhc2UgT0s6CisgICAgICAgICAgICAvLyBFeHBlY3RlZCwgZG8gbm90aGluZy4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIElOVkFMSURfT1BFUkFUSU9OOiB7CisgICAgICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAiQ2FtZXJhICVzOiBTZXNzaW9uIGNvbmZpZ3VyYXRpb24gcXVlcnkgbm90IHN1cHBvcnRlZCEiLAorICAgICAgICAgICAgICAgICAgICAgICAgbUNhbWVyYUlkU3RyLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICBBTE9HRCgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCggIkNhbWVyYSAlczogRXJyb3I6ICVzICglZCkiLCBtQ2FtZXJhSWRTdHIuc3RyaW5nKCksCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULAorICAgICAgICAgICAgICAgICAgICAgICAgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgIH0KICAgICB9CiAKICAgICByZXR1cm4gcmVzOwpAQCAtNTMyLDYgKzgwNSw3IEBACiAgICAgYm9vbCBpc0lucHV0ID0gZmFsc2U7CiAgICAgc3RkOjp2ZWN0b3I8c3A8SUJpbmRlcj4+IHN1cmZhY2VzOwogICAgIHNzaXplX3QgZEluZGV4ID0gTkFNRV9OT1RfRk9VTkQ7CisgICAgc3NpemVfdCBjb21wb3NpdGVJbmRleCAgPSBOQU1FX05PVF9GT1VORDsKIAogICAgIGlmIChtSW5wdXRTdHJlYW0uY29uZmlndXJlZCAmJiBtSW5wdXRTdHJlYW0uaWQgPT0gc3RyZWFtSWQpIHsKICAgICAgICAgaXNJbnB1dCA9IHRydWU7CkBAIC01NTEsNiArODI1LDEzIEBACiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIAorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db21wb3NpdGVTdHJlYW1NYXAuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgICAgIGlmIChzdHJlYW1JZCA9PSBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoaSktPmdldFN0cmVhbUlkKCkpIHsKKyAgICAgICAgICAgICAgICBjb21wb3NpdGVJbmRleCA9IGk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKwogICAgICAgICBpZiAoc3VyZmFjZXMuZW1wdHkoKSAmJiBkSW5kZXggPT0gTkFNRV9OT1RfRk9VTkQpIHsKICAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IEludmFsaWQgc3RyZWFtIElEICglZCkgc3BlY2lmaWVkLCBubyBzdWNoIgogICAgICAgICAgICAgICAgICAgICAiIHN0cmVhbSBjcmVhdGVkIHlldCIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZWFtSWQpOwpAQCAtNTgwLDYgKzg2MSwxOSBAQAogICAgICAgICAgICAgaWYgKGRJbmRleCAhPSBOQU1FX05PVF9GT1VORCkgewogICAgICAgICAgICAgICAgIG1EZWZlcnJlZFN0cmVhbXMucmVtb3ZlSXRlbXNBdChkSW5kZXgpOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoY29tcG9zaXRlSW5kZXggIT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCByZXQ7CisgICAgICAgICAgICAgICAgaWYgKChyZXQgPSBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoY29tcG9zaXRlSW5kZXgpLT5kZWxldGVTdHJlYW0oKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJDYW1lcmEgJXM6IFVuZXhwZWN0ZWQgZXJyb3IgJXMgKCVkKSB3aGVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVsZXRpbmcgY29tcG9zaXRlIHN0cmVhbSAlZCIsIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgc3RyZXJyb3IoLWVyciksIGVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgICAgIHJlcyA9IFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwgbXNnLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC5yZW1vdmVJdGVtc0F0KGNvbXBvc2l0ZUluZGV4KTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KIApAQCAtNjAzLDQxICs4OTcsMjMgQEAKICAgICBib29sIGRlZmVycmVkQ29uc3VtZXIgPSBvdXRwdXRDb25maWd1cmF0aW9uLmlzRGVmZXJyZWQoKTsKICAgICBib29sIGlzU2hhcmVkID0gb3V0cHV0Q29uZmlndXJhdGlvbi5pc1NoYXJlZCgpOwogICAgIFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCA9IFN0cmluZzgob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRQaHlzaWNhbENhbWVyYUlkKCkpOwotCi0gICAgaWYgKG51bUJ1ZmZlclByb2R1Y2VycyA+IE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKSB7Ci0gICAgICAgIEFMT0dFKCIlczogR3JhcGhpY0J1ZmZlclByb2R1Y2VyIGNvdW50ICV6dSBmb3Igc3RyZWFtIGV4Y2VlZHMgbGltaXQgb2YgJWQiLAotICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZmZlclByb2R1Y2Vycy5zaXplKCksIE1BWF9TVVJGQUNFU19QRVJfU1RSRUFNKTsKLSAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCAiU3VyZmFjZSBjb3VudCBpcyB0b28gaGlnaCIpOwotICAgIH0KICAgICBib29sIGRlZmVycmVkQ29uc3VtZXJPbmx5ID0gZGVmZXJyZWRDb25zdW1lciAmJiBudW1CdWZmZXJQcm9kdWNlcnMgPT0gMDsKLSAgICBpbnQgc3VyZmFjZVR5cGUgPSBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VUeXBlKCk7Ci0gICAgYm9vbCB2YWxpZFN1cmZhY2VUeXBlID0gKChzdXJmYWNlVHlwZSA9PSBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfU1VSRkFDRV9WSUVXKSB8fAotICAgICAgICAgICAgKHN1cmZhY2VUeXBlID09IE91dHB1dENvbmZpZ3VyYXRpb246OlNVUkZBQ0VfVFlQRV9TVVJGQUNFX1RFWFRVUkUpKTsKIAotICAgIGlmIChkZWZlcnJlZENvbnN1bWVyICYmICF2YWxpZFN1cmZhY2VUeXBlKSB7Ci0gICAgICAgIEFMT0dFKCIlczogVGFyZ2V0IHN1cmZhY2UgaXMgaW52YWxpZDogYnVmZmVyUHJvZHVjZXIgPSAlcCwgc3VyZmFjZVR5cGUgPSAlZC4iLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVyUHJvZHVjZXJzWzBdLmdldCgpLCBzdXJmYWNlVHlwZSk7Ci0gICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVCwgIlRhcmdldCBTdXJmYWNlIGlzIGludmFsaWQiKTsKKyAgICByZXMgPSBjaGVja1N1cmZhY2VUeXBlTG9ja2VkKG51bUJ1ZmZlclByb2R1Y2VycywgZGVmZXJyZWRDb25zdW1lciwKKyAgICAgICAgICAgIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVR5cGUoKSk7CisgICAgaWYgKCFyZXMuaXNPaygpKSB7CisgICAgICAgIHJldHVybiByZXM7CiAgICAgfQogCiAgICAgaWYgKCFtRGV2aWNlLmdldCgpKSB7CiAgICAgICAgIHJldHVybiBTVEFUVVNfRVJST1IoQ2FtZXJhU2VydmljZTo6RVJST1JfRElTQ09OTkVDVEVELCAiQ2FtZXJhIGRldmljZSBubyBsb25nZXIgYWxpdmUiKTsKICAgICB9CiAKLSAgICBpZiAocGh5c2ljYWxDYW1lcmFJZC5zaXplKCkgPiAwKSB7Ci0gICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbENhbWVyYUlkczsKLSAgICAgICAgc3RkOjpzdHJpbmcgcGh5c2ljYWxJZChwaHlzaWNhbENhbWVyYUlkLnN0cmluZygpKTsKLSAgICAgICAgYm9vbCBsb2dpY2FsQ2FtZXJhID0KLSAgICAgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzTG9naWNhbENhbWVyYShtRGV2aWNlLT5pbmZvKCksICZwaHlzaWNhbENhbWVyYUlkcyk7Ci0gICAgICAgIGlmICghbG9naWNhbENhbWVyYSB8fAotICAgICAgICAgICAgICAgIHN0ZDo6ZmluZChwaHlzaWNhbENhbWVyYUlkcy5iZWdpbigpLCBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSwgcGh5c2ljYWxJZCkgPT0KLSAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcy5lbmQoKSkgewotICAgICAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkNhbWVyYSAlczogQ2FtZXJhIGRvZXNuJ3Qgc3VwcG9ydCBwaHlzaWNhbENhbWVyYUlkICVzLiIsCi0gICAgICAgICAgICAgICAgICAgIG1DYW1lcmFJZFN0ci5zdHJpbmcoKSwgcGh5c2ljYWxDYW1lcmFJZC5zdHJpbmcoKSk7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOwotICAgICAgICAgICAgcmV0dXJuIFNUQVRVU19FUlJPUihDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5ULCBtc2cuc3RyaW5nKCkpOwotICAgICAgICB9CisgICAgcmVzID0gY2hlY2tQaHlzaWNhbENhbWVyYUlkTG9ja2VkKHBoeXNpY2FsQ2FtZXJhSWQpOworICAgIGlmICghcmVzLmlzT2soKSkgeworICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KKwogICAgIHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiBzdXJmYWNlczsKICAgICBzdGQ6OnZlY3RvcjxzcDxJQmluZGVyPj4gYmluZGVyczsKICAgICBzdGF0dXNfdCBlcnI7CkBAIC02NzcsMTEgKzk1MywzMiBAQAogCiAgICAgaW50IHN0cmVhbUlkID0gY2FtZXJhMzo6Q0FNRVJBM19TVFJFQU1fSURfSU5WQUxJRDsKICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHN1cmZhY2VJZHM7Ci0gICAgZXJyID0gbURldmljZS0+Y3JlYXRlU3RyZWFtKHN1cmZhY2VzLCBkZWZlcnJlZENvbnN1bWVyLCBzdHJlYW1JbmZvLndpZHRoLAotICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQsIHN0cmVhbUluZm8uZm9ybWF0LCBzdHJlYW1JbmZvLmRhdGFTcGFjZSwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Q+KG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0Um90YXRpb24oKSksCi0gICAgICAgICAgICAmc3RyZWFtSWQsIHBoeXNpY2FsQ2FtZXJhSWQsICZzdXJmYWNlSWRzLCBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VTZXRJRCgpLAotICAgICAgICAgICAgaXNTaGFyZWQpOworICAgIGJvb2wgaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSA9IGNhbWVyYTM6OkRlcHRoQ29tcG9zaXRlU3RyZWFtOjppc0RlcHRoQ29tcG9zaXRlU3RyZWFtKHN1cmZhY2VzWzBdKTsKKyAgICBib29sIGlzSGVpY0NvbXBpc2l0ZVN0cmVhbSA9IGNhbWVyYTM6OkhlaWNDb21wb3NpdGVTdHJlYW06OmlzSGVpY0NvbXBvc2l0ZVN0cmVhbShzdXJmYWNlc1swXSk7CisgICAgaWYgKGlzRGVwdGhDb21wb3NpdGVTdHJlYW0gfHwgaXNIZWljQ29tcGlzaXRlU3RyZWFtKSB7CisgICAgICAgIHNwPENvbXBvc2l0ZVN0cmVhbT4gY29tcG9zaXRlU3RyZWFtOworICAgICAgICBpZiAoaXNEZXB0aENvbXBvc2l0ZVN0cmVhbSkgeworICAgICAgICAgICAgY29tcG9zaXRlU3RyZWFtID0gbmV3IGNhbWVyYTM6OkRlcHRoQ29tcG9zaXRlU3RyZWFtKG1EZXZpY2UsIGdldFJlbW90ZUNhbGxiYWNrKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29tcG9zaXRlU3RyZWFtID0gbmV3IGNhbWVyYTM6OkhlaWNDb21wb3NpdGVTdHJlYW0obURldmljZSwgZ2V0UmVtb3RlQ2FsbGJhY2soKSk7CisgICAgICAgIH0KKworICAgICAgICBlcnIgPSBjb21wb3NpdGVTdHJlYW0tPmNyZWF0ZVN0cmVhbShzdXJmYWNlcywgZGVmZXJyZWRDb25zdW1lciwgc3RyZWFtSW5mby53aWR0aCwKKyAgICAgICAgICAgICAgICBzdHJlYW1JbmZvLmhlaWdodCwgc3RyZWFtSW5mby5mb3JtYXQsCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2FtZXJhM19zdHJlYW1fcm90YXRpb25fdD4ob3V0cHV0Q29uZmlndXJhdGlvbi5nZXRSb3RhdGlvbigpKSwKKyAgICAgICAgICAgICAgICAmc3RyZWFtSWQsIHBoeXNpY2FsQ2FtZXJhSWQsICZzdXJmYWNlSWRzLCBvdXRwdXRDb25maWd1cmF0aW9uLmdldFN1cmZhY2VTZXRJRCgpLAorICAgICAgICAgICAgICAgIGlzU2hhcmVkKTsKKyAgICAgICAgaWYgKGVyciA9PSBPSykgeworICAgICAgICAgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC5hZGQoSUludGVyZmFjZTo6YXNCaW5kZXIoc3VyZmFjZXNbMF0tPmdldElHcmFwaGljQnVmZmVyUHJvZHVjZXIoKSksCisgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZVN0cmVhbSk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBlcnIgPSBtRGV2aWNlLT5jcmVhdGVTdHJlYW0oc3VyZmFjZXMsIGRlZmVycmVkQ29uc3VtZXIsIHN0cmVhbUluZm8ud2lkdGgsCisgICAgICAgICAgICAgICAgc3RyZWFtSW5mby5oZWlnaHQsIHN0cmVhbUluZm8uZm9ybWF0LCBzdHJlYW1JbmZvLmRhdGFTcGFjZSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90PihvdXRwdXRDb25maWd1cmF0aW9uLmdldFJvdGF0aW9uKCkpLAorICAgICAgICAgICAgICAgICZzdHJlYW1JZCwgcGh5c2ljYWxDYW1lcmFJZCwgJnN1cmZhY2VJZHMsIG91dHB1dENvbmZpZ3VyYXRpb24uZ2V0U3VyZmFjZVNldElEKCksCisgICAgICAgICAgICAgICAgaXNTaGFyZWQpOworICAgIH0KIAogICAgIGlmIChlcnIgIT0gT0spIHsKICAgICAgICAgcmVzID0gU1RBVFVTX0VSUk9SX0ZNVChDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTiwKQEAgLTExNjMsNiArMTQ2MCw4IEBACiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IHN0cmVhbUNvbmZpZ3MgPQogICAgICAgICAgICAgKGRhdGFTcGFjZSA9PSBIQUxfREFUQVNQQUNFX0RFUFRIKSA/CiAgICAgICAgICAgICBpbmZvLmZpbmQoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfU1RSRUFNX0NPTkZJR1VSQVRJT05TKSA6CisgICAgICAgICAgICAoZGF0YVNwYWNlID09IHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihIQUxfREFUQVNQQUNFX0hFSUYpKSA/CisgICAgICAgICAgICBpbmZvLmZpbmQoQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX1NUUkVBTV9DT05GSUdVUkFUSU9OUykgOgogICAgICAgICAgICAgaW5mby5maW5kKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMpOwogCiAgICAgaW50MzJfdCBiZXN0V2lkdGggPSAtMTsKQEAgLTE2MTUsNyArMTkxNCwxNCBAQAogICAgIC8vIFRocmVhZCBzYWZlLiBEb24ndCBib3RoZXIgbG9ja2luZy4KICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gcmVtb3RlQ2IgPSBnZXRSZW1vdGVDYWxsYmFjaygpOwogCi0gICAgaWYgKHJlbW90ZUNiICE9IDApIHsKKyAgICAvLyBDb21wb3NpdGVzIGNhbiBoYXZlIG11bHRpcGxlIGludGVybmFsIHN0cmVhbXMuIEVycm9yIG5vdGlmaWNhdGlvbnMgY29taW5nIGZyb20gc3VjaCBpbnRlcm5hbAorICAgIC8vIHN0cmVhbXMgbWF5IG5lZWQgdG8gcmVtYWluIHdpdGhpbiBjYW1lcmEgc2VydmljZS4KKyAgICBib29sIHNraXBDbGllbnROb3RpZmljYXRpb24gPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1Db21wb3NpdGVTdHJlYW1NYXAuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgc2tpcENsaWVudE5vdGlmaWNhdGlvbiB8PSBtQ29tcG9zaXRlU3RyZWFtTWFwLnZhbHVlQXQoaSktPm9uRXJyb3IoZXJyb3JDb2RlLCByZXN1bHRFeHRyYXMpOworICAgIH0KKworICAgIGlmICgocmVtb3RlQ2IgIT0gMCkgJiYgKCFza2lwQ2xpZW50Tm90aWZpY2F0aW9uKSkgewogICAgICAgICByZW1vdGVDYi0+b25EZXZpY2VFcnJvcihlcnJvckNvZGUsIHJlc3VsdEV4dHJhcyk7CiAgICAgfQogfQpAQCAtMTY0OSw2ICsxOTU1LDEwIEBACiAgICAgICAgIHJlbW90ZUNiLT5vbkNhcHR1cmVTdGFydGVkKHJlc3VsdEV4dHJhcywgdGltZXN0YW1wKTsKICAgICB9CiAgICAgQ2FtZXJhMkNsaWVudEJhc2U6Om5vdGlmeVNodXR0ZXIocmVzdWx0RXh0cmFzLCB0aW1lc3RhbXApOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29tcG9zaXRlU3RyZWFtTWFwLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChpKS0+b25TaHV0dGVyKHJlc3VsdEV4dHJhcywgdGltZXN0YW1wKTsKKyAgICB9CiB9CiAKIHZvaWQgQ2FtZXJhRGV2aWNlQ2xpZW50Ojpub3RpZnlQcmVwYXJlZChpbnQgc3RyZWFtSWQpIHsKQEAgLTE2OTQsNiArMjAwNCwxNSBAQAogICAgICAgICB9CiAgICAgfQogCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29tcG9zaXRlU3RyZWFtTWFwLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGF1dG8gcmV0ID0gbUNvbXBvc2l0ZVN0cmVhbU1hcC52YWx1ZUF0KGkpLT5kZWxldGVJbnRlcm5hbFN0cmVhbXMoKTsKKyAgICAgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgcmVtb3ZpbmcgY29tcG9zaXRlIHN0cmVhbSAgJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJldCksIHJldCk7CisgICAgICAgIH0KKyAgICB9CisgICAgbUNvbXBvc2l0ZVN0cmVhbU1hcC5jbGVhcigpOworCiAgICAgQ2FtZXJhMkNsaWVudEJhc2U6OmRldGFjaERldmljZSgpOwogfQogCkBAIC0xNzA4LDYgKzIwMjcsMTAgQEAKICAgICAgICAgcmVtb3RlQ2ItPm9uUmVzdWx0UmVjZWl2ZWQocmVzdWx0Lm1NZXRhZGF0YSwgcmVzdWx0Lm1SZXN1bHRFeHRyYXMsCiAgICAgICAgICAgICAgICAgcmVzdWx0Lm1QaHlzaWNhbE1ldGFkYXRhcyk7CiAgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtQ29tcG9zaXRlU3RyZWFtTWFwLnNpemUoKTsgaSsrKSB7CisgICAgICAgIG1Db21wb3NpdGVTdHJlYW1NYXAudmFsdWVBdChpKS0+b25SZXN1bHRBdmFpbGFibGUocmVzdWx0KTsKKyAgICB9CiB9CiAKIGJpbmRlcjo6U3RhdHVzIENhbWVyYURldmljZUNsaWVudDo6Y2hlY2tQaWRTdGF0dXMoY29uc3QgY2hhciogY2hlY2tMb2NhdGlvbikgewpAQCAtMTcyNCw3ICsyMDQ3LDcgQEAKIC8vIFRPRE86IG1vdmUgdG8gQ2FtZXJhMkNsaWVudEJhc2UKIGJvb2wgQ2FtZXJhRGV2aWNlQ2xpZW50OjplbmZvcmNlUmVxdWVzdFBlcm1pc3Npb25zKENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSkgewogCi0gICAgY29uc3QgaW50IHBpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKTsKKyAgICBjb25zdCBpbnQgcGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBjb25zdCBpbnQgc2VsZlBpZCA9IGdldHBpZCgpOwogICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5OwogCkBAIC0xNzYzLDcgKzIwODYsNyBAQAogICAgICAgICBTdHJpbmcxNiBwZXJtaXNzaW9uU3RyaW5nID0KICAgICAgICAgICAgIFN0cmluZzE2KCJhbmRyb2lkLnBlcm1pc3Npb24uQ0FNRVJBX0RJU0FCTEVfVFJBTlNNSVRfTEVEIik7CiAgICAgICAgIGlmICghY2hlY2tDYWxsaW5nUGVybWlzc2lvbihwZXJtaXNzaW9uU3RyaW5nKSkgewotICAgICAgICAgICAgY29uc3QgaW50IHVpZCA9IElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKTsKKyAgICAgICAgICAgIGNvbnN0IGludCB1aWQgPSBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpOwogICAgICAgICAgICAgQUxPR0UoIlBlcm1pc3Npb24gRGVuaWFsOiAiCiAgICAgICAgICAgICAgICAgICAiY2FuJ3QgZGlzYWJsZSB0cmFuc21pdCBMRUQgcGlkPSVkLCB1aWQ9JWQiLCBwaWQsIHVpZCk7CiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9DYW1lcmFEZXZpY2VDbGllbnQuaAppbmRleCBjMzA1NjFkLi4xYzVhYmIwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NhbWVyYURldmljZUNsaWVudC5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ2FtZXJhRGV2aWNlQ2xpZW50LmgKQEAgLTIwLDEzICsyMCwxNiBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9CbkNhbWVyYURldmljZVVzZXIuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL091dHB1dENvbmZpZ3VyYXRpb24uaD4KKyNpbmNsdWRlIDxjYW1lcmEvY2FtZXJhMi9TZXNzaW9uQ29uZmlndXJhdGlvbi5oPgogI2luY2x1ZGUgPGNhbWVyYS9jYW1lcmEyL1N1Ym1pdEluZm8uaD4KIAogI2luY2x1ZGUgIkNhbWVyYVNlcnZpY2UuaCIKICNpbmNsdWRlICJjb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmgiCiAjaW5jbHVkZSAiY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmgiCisjaW5jbHVkZSAiQ29tcG9zaXRlU3RyZWFtLmgiCiAKIHVzaW5nIGFuZHJvaWQ6OmNhbWVyYTM6Ok91dHB1dFN0cmVhbUluZm87Cit1c2luZyBhbmRyb2lkOjpjYW1lcmEzOjpDb21wb3NpdGVTdHJlYW07CiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIApAQCAtODksNiArOTIsMTIgQEAKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGVuZENvbmZpZ3VyZShpbnQgb3BlcmF0aW5nTW9kZSwKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpDYW1lcmFNZXRhZGF0YU5hdGl2ZSYgc2Vzc2lvblBhcmFtcykgb3ZlcnJpZGU7CiAKKyAgICAvLyBWZXJpZnkgc3BlY2lmaWMgc2Vzc2lvbiBjb25maWd1cmF0aW9uLgorICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgICAgIGNvbnN0IFNlc3Npb25Db25maWd1cmF0aW9uJiBzZXNzaW9uQ29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIC8qb3V0Ki8KKyAgICAgICAgICAgIGJvb2wqIHN0cmVhbVN0YXR1cykgb3ZlcnJpZGU7CisKICAgICAvLyBSZXR1cm5zIC1FQlVTWSBpZiBkZXZpY2UgaXMgbm90IGlkbGUgb3IgaW4gZXJyb3Igc3RhdGUKICAgICB2aXJ0dWFsIGJpbmRlcjo6U3RhdHVzIGRlbGV0ZVN0cmVhbShpbnQgc3RyZWFtSWQpIG92ZXJyaWRlOwogCkBAIC0yMzAsNiArMjM5LDEzIEBACiAKICAgICAvKiogVXRpbGl0eSBtZW1iZXJzICovCiAgICAgYmluZGVyOjpTdGF0dXMgY2hlY2tQaWRTdGF0dXMoY29uc3QgY2hhciogY2hlY2tMb2NhdGlvbik7CisgICAgYmluZGVyOjpTdGF0dXMgY2hlY2tPcGVyYXRpbmdNb2RlTG9ja2VkKGludCBvcGVyYXRpbmdNb2RlKSBjb25zdDsKKyAgICBiaW5kZXI6OlN0YXR1cyBjaGVja1BoeXNpY2FsQ2FtZXJhSWRMb2NrZWQoU3RyaW5nOCBwaHlzaWNhbENhbWVyYUlkKTsKKyAgICBiaW5kZXI6OlN0YXR1cyBjaGVja1N1cmZhY2VUeXBlTG9ja2VkKHNpemVfdCBudW1CdWZmZXJQcm9kdWNlcnMsIGJvb2wgZGVmZXJyZWRDb25zdW1lciwKKyAgICAgICAgICAgIGludCBzdXJmYWNlVHlwZSkgY29uc3Q7CisgICAgc3RhdGljIHZvaWQgbWFwU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgU3RyaW5nOCBwaHlzaWNhbElkLAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW0gKnN0cmVhbSAvKm91dCovKTsKICAgICBib29sIGVuZm9yY2VSZXF1ZXN0UGVybWlzc2lvbnMoQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhKTsKIAogICAgIC8vIEZpbmQgdGhlIHNxdWFyZSBvZiB0aGUgZXVjbGlkZWFuIGRpc3RhbmNlIGJldHdlZW4gdHdvIHBvaW50cwpAQCAtMzAwLDcgKzMxNiwxMCBAQAogICAgIC8vIHN0cmVhbSBJRCAtPiBvdXRwdXRTdHJlYW1JbmZvIG1hcHBpbmcKICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50MzJfdCwgT3V0cHV0U3RyZWFtSW5mbz4gbVN0cmVhbUluZm9NYXA7CiAKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSA9IDI7CisgICAgS2V5ZWRWZWN0b3I8c3A8SUJpbmRlcj4sIHNwPENvbXBvc2l0ZVN0cmVhbT4+IG1Db21wb3NpdGVTdHJlYW1NYXA7CisKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBNQVhfU1VSRkFDRVNfUEVSX1NUUkVBTSA9IDQ7CisgICAgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBtUHJvdmlkZXJNYW5hZ2VyOwogfTsKIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ29tcG9zaXRlU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvQ29tcG9zaXRlU3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNTRlYWY5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9Db21wb3NpdGVTdHJlYW0uY3BwCkBAIC0wLDAgKzEsMjA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmEzLUNvbXBvc2l0ZVN0cmVhbSIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCisjaW5jbHVkZSAiQ2FtZXJhRGV2aWNlQ2xpZW50LmgiCisjaW5jbHVkZSAiQ29tcG9zaXRlU3RyZWFtLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworQ29tcG9zaXRlU3RyZWFtOjpDb21wb3NpdGVTdHJlYW0od3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlLAorICAgICAgICB3cDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gY2IpIDoKKyAgICAgICAgbURldmljZShkZXZpY2UpLAorICAgICAgICBtUmVtb3RlQ2FsbGJhY2soY2IpLAorICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMoMSksCisgICAgICAgIG1FcnJvclN0YXRlKGZhbHNlKSB7CisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gY2FtZXJhRGV2aWNlID0gZGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoY2FtZXJhRGV2aWNlLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgc3RhdGljSW5mbyA9IGNhbWVyYURldmljZS0+aW5mbygpOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeSA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX1JFUVVFU1RfUEFSVElBTF9SRVNVTFRfQ09VTlQpOworICAgICAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CisgICAgICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHMgPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdHVzX3QgQ29tcG9zaXRlU3RyZWFtOjpjcmVhdGVTdHJlYW0oY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCisgICAgICAgIGJvb2wgaGFzRGVmZXJyZWRDb25zdW1lciwgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICogaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKiBzdXJmYWNlSWRzLCBpbnQgc3RyZWFtU2V0SWQsIGJvb2wgaXNTaGFyZWQpIHsKKyAgICBpZiAoaGFzRGVmZXJyZWRDb25zdW1lcikgeworICAgICAgICBBTE9HRSgiJXM6IERlZmVycmVkIGNvbnN1bWVycyBub3Qgc3VwcG9ydGVkIGluIGNhc2Ugb2YgY29tcG9zaXRlIHN0cmVhbXMhIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGlmIChzdHJlYW1TZXRJZCAhPSBjYW1lcmEzOjpDQU1FUkEzX1NUUkVBTV9JRF9JTlZBTElEKSB7CisgICAgICAgIEFMT0dFKCIlczogU3VyZmFjZSBncm91cHMgbm90IHN1cHBvcnRlZCBpbiBjYXNlIG9mIGNvbXBvc2l0ZSBzdHJlYW1zISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoaXNTaGFyZWQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTaGFyZWQgc3VyZmFjZXMgbm90IHN1cHBvcnRlZCBpbiBjYXNlIG9mIGNvbXBvc2l0ZSBzdHJlYW1zISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICByZXR1cm4gY3JlYXRlSW50ZXJuYWxTdHJlYW1zKGNvbnN1bWVycywgaGFzRGVmZXJyZWRDb25zdW1lciwgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCByb3RhdGlvbiwgaWQsCisgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkLCBzdXJmYWNlSWRzLCBzdHJlYW1TZXRJZCwgaXNTaGFyZWQpOworfQorCitzdGF0dXNfdCBDb21wb3NpdGVTdHJlYW06OmRlbGV0ZVN0cmVhbSgpIHsKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgICAgIG1QZW5kaW5nQ2FwdHVyZVJlc3VsdHMuY2xlYXIoKTsKKyAgICAgICAgbUNhcHR1cmVSZXN1bHRzLmNsZWFyKCk7CisgICAgICAgIG1GcmFtZU51bWJlck1hcC5jbGVhcigpOworICAgICAgICBtRXJyb3JGcmFtZU51bWJlcnMuY2xlYXIoKTsKKyAgICB9CisKKyAgICByZXR1cm4gZGVsZXRlSW50ZXJuYWxTdHJlYW1zKCk7Cit9CisKK3ZvaWQgQ29tcG9zaXRlU3RyZWFtOjpvbkJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwgaW50IHN0cmVhbUlkLAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgLypzZXR0aW5ncyovKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICBpZiAoIW1FcnJvclN0YXRlICYmIChzdHJlYW1JZCA9PSBnZXRTdHJlYW1JZCgpKSkgeworICAgICAgICBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmVtcGxhY2UoZnJhbWVOdW1iZXIsIENhbWVyYU1ldGFkYXRhKCkpOworICAgIH0KK30KKwordm9pZCBDb21wb3NpdGVTdHJlYW06Om9uQnVmZmVyUmVsZWFzZWQoY29uc3QgQnVmZmVySW5mbyYgYnVmZmVySW5mbykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgaWYgKCFtRXJyb3JTdGF0ZSAmJiAhYnVmZmVySW5mby5tRXJyb3IpIHsKKyAgICAgICAgbUZyYW1lTnVtYmVyTWFwLmVtcGxhY2UoYnVmZmVySW5mby5tRnJhbWVOdW1iZXIsIGJ1ZmZlckluZm8ubVRpbWVzdGFtcCk7CisgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgIH0KK30KKwordm9pZCBDb21wb3NpdGVTdHJlYW06OmVyYXNlUmVzdWx0KGludDY0X3QgZnJhbWVOdW1iZXIpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworCisgICAgYXV0byBpdCA9IG1QZW5kaW5nQ2FwdHVyZVJlc3VsdHMuZmluZChmcmFtZU51bWJlcik7CisgICAgaWYgKGl0ID09IG1QZW5kaW5nQ2FwdHVyZVJlc3VsdHMuZW5kKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGl0ID0gbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5lcmFzZShpdCk7Cit9CisKK3ZvaWQgQ29tcG9zaXRlU3RyZWFtOjpvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0JiByZXN1bHQpIHsKKyAgICBib29sIHJlc3VsdEVycm9yID0gZmFsc2U7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworCisgICAgICAgIHVpbnQ2NF90IGZyYW1lTnVtYmVyID0gcmVzdWx0Lm1SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXI7CisgICAgICAgIGJvb2wgcmVzdWx0UmVhZHkgPSBmYWxzZTsKKyAgICAgICAgYXV0byBpdCA9IG1QZW5kaW5nQ2FwdHVyZVJlc3VsdHMuZmluZChmcmFtZU51bWJlcik7CisgICAgICAgIGlmIChpdCAhPSBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmVuZCgpKSB7CisgICAgICAgICAgICBpdC0+c2Vjb25kLmFwcGVuZChyZXN1bHQubU1ldGFkYXRhKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQubVJlc3VsdEV4dHJhcy5wYXJ0aWFsUmVzdWx0Q291bnQgPj0gbU51bVBhcnRpYWxSZXN1bHRzKSB7CisgICAgICAgICAgICAgICAgYXV0byBlbnRyeSA9IGl0LT5zZWNvbmQuZmluZChBTkRST0lEX1NFTlNPUl9USU1FU1RBTVApOworICAgICAgICAgICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgIGF1dG8gdHMgPSBlbnRyeS5kYXRhLmk2NFswXTsKKyAgICAgICAgICAgICAgICAgICAgbUNhcHR1cmVSZXN1bHRzLmVtcGxhY2UodHMsIHN0ZDo6bWFrZV90dXBsZShmcmFtZU51bWJlciwgaXQtPnNlY29uZCkpOworICAgICAgICAgICAgICAgICAgICByZXN1bHRSZWFkeSA9IHRydWU7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUaW1lc3RhbXAgbWV0YWRhdGEgZW50cnkgbWlzc2luZyBmb3IgZnJhbWVOdW1iZXI6ICUiIFBSSXU2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0RXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXN1bHRSZWFkeSkgeworICAgICAgICAgICAgbUlucHV0UmVhZHlDb25kaXRpb24uc2lnbmFsKCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAocmVzdWx0RXJyb3IpIHsKKyAgICAgICAgb25SZXN1bHRFcnJvcihyZXN1bHQubVJlc3VsdEV4dHJhcyk7CisgICAgfQorfQorCit2b2lkIENvbXBvc2l0ZVN0cmVhbTo6ZmxhZ0FuRXJyb3JGcmFtZU51bWJlcihpbnQ2NF90IGZyYW1lTnVtYmVyKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICBtRXJyb3JGcmFtZU51bWJlcnMuZW1wbGFjZShmcmFtZU51bWJlcik7CisgICAgbUlucHV0UmVhZHlDb25kaXRpb24uc2lnbmFsKCk7Cit9CisKK3N0YXR1c190IENvbXBvc2l0ZVN0cmVhbTo6cmVnaXN0ZXJDb21wb3NpdGVTdHJlYW1MaXN0ZW5lcihpbnQzMl90IHN0cmVhbUlkKSB7CisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKGRldmljZS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGF1dG8gcmV0ID0gZGV2aWNlLT5hZGRCdWZmZXJMaXN0ZW5lckZvclN0cmVhbShzdHJlYW1JZCwgdGhpcyk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZWdpc3RlciBjb21wb3NpdGUgc3RyZWFtIGxpc3RlbmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworYm9vbCBDb21wb3NpdGVTdHJlYW06Om9uRXJyb3IoaW50MzJfdCBlcnJvckNvZGUsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIGF1dG8gcmV0ID0gZmFsc2U7CisgICAgc3dpdGNoIChlcnJvckNvZGUpIHsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFU1VMVDoKKyAgICAgICAgICAgIG9uUmVzdWx0RXJyb3IocmVzdWx0RXh0cmFzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfQlVGRkVSOgorICAgICAgICAgICAgcmV0ID0gb25TdHJlYW1CdWZmZXJFcnJvcihyZXN1bHRFeHRyYXMpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVFVRVNUOgorICAgICAgICAgICAgLy8gSW52YWxpZCByZXF1ZXN0LCB0aGlzIHNob3VsZG4ndCBhZmZlY3QgY29tcG9zaXRlIHN0cmVhbXMuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5yZWNvdmVyYWJsZSBlcnJvcjogJWQgZGV0ZWN0ZWQhIiwgX19GVU5DVElPTl9fLCBlcnJvckNvZGUpOworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICAgICAgICAgIG1FcnJvclN0YXRlID0gdHJ1ZTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgQ29tcG9zaXRlU3RyZWFtOjpub3RpZnlFcnJvcihpbnQ2NF90IGZyYW1lTnVtYmVyKSB7CisgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IHJlbW90ZUNiID0KKyAgICAgICAgbVJlbW90ZUNhbGxiYWNrLnByb21vdGUoKTsKKworICAgIGlmICgoZnJhbWVOdW1iZXIgPj0gMCkgJiYgKHJlbW90ZUNiLmdldCgpICE9IG51bGxwdHIpKSB7CisgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzOworICAgICAgICBleHRyYXMuZXJyb3JTdHJlYW1JZCA9IGdldFN0cmVhbUlkKCk7CisgICAgICAgIGV4dHJhcy5mcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyOworICAgICAgICByZW1vdGVDYi0+b25EZXZpY2VFcnJvcigKKyAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUiwKKyAgICAgICAgICAgICAgICBleHRyYXMpOworICAgIH0KK30KKworfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0NvbXBvc2l0ZVN0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9Db21wb3NpdGVTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNDAxYTgyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9Db21wb3NpdGVTdHJlYW0uaApAQCAtMCwwICsxLDEzMCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0NPTVBPU0lURV9TVFJFQU1fSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfQ09NUE9TSVRFX1NUUkVBTV9ICisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CisjaW5jbHVkZSA8Y2FtZXJhL2NhbWVyYTIvT3V0cHV0Q29uZmlndXJhdGlvbi5oPgorI2luY2x1ZGUgPGd1aS9JUHJvZHVjZXJMaXN0ZW5lci5oPgorI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFEZXZpY2VCYXNlLmgiCisjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzU3RyZWFtSW50ZXJmYWNlLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ2FtZXJhRGV2aWNlQ2xpZW50OworY2xhc3MgQ2FtZXJhTWV0YWRhdGE7CitjbGFzcyBTdXJmYWNlOworCituYW1lc3BhY2UgY2FtZXJhMyB7CisKK2NsYXNzIENvbXBvc2l0ZVN0cmVhbSA6IHB1YmxpYyBjYW1lcmEzOjpDYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIgeworCitwdWJsaWM6CisgICAgQ29tcG9zaXRlU3RyZWFtKHdwPENhbWVyYURldmljZUJhc2U+IGRldmljZSwgd3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNiKTsKKyAgICB2aXJ0dWFsIH5Db21wb3NpdGVTdHJlYW0oKSB7fQorCisgICAgc3RhdHVzX3QgY3JlYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAorICAgICAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCk7CisKKyAgICBzdGF0dXNfdCBkZWxldGVTdHJlYW0oKTsKKworICAgIC8vIENyZWF0ZSBhbmQgcmVnaXN0ZXIgYWxsIGludGVybmFsIGNhbWVyYSBzdHJlYW1zLgorICAgIHZpcnR1YWwgc3RhdHVzX3QgY3JlYXRlSW50ZXJuYWxTdHJlYW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAorICAgICAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCkgPSAwOworCisgICAgLy8gUmVsZWFzZSBhbGwgaW50ZXJuYWwgc3RyZWFtcyBhbmQgY29ycmVzcG9uZGluZyByZXNvdXJjZXMuCisgICAgdmlydHVhbCBzdGF0dXNfdCBkZWxldGVJbnRlcm5hbFN0cmVhbXMoKSA9IDA7CisKKyAgICAvLyBTdHJlYW0gY29uZmlndXJhdGlvbiBjb21wbGV0ZWQuCisgICAgdmlydHVhbCBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW0oKSA9IDA7CisKKyAgICAvLyBJbnNlcnQgdGhlIGludGVybmFsIGNvbXBvc2l0ZSBzdHJlYW0gaWQgaW4gdGhlIHVzZXIgY2FwdHVyZSByZXF1ZXN0LgorICAgIHZpcnR1YWwgc3RhdHVzX3QgaW5zZXJ0R2JwKFN1cmZhY2VNYXAqIC8qb3V0Ki9vdXRTdXJmYWNlTWFwLAorICAgICAgICAgICAgVmVjdG9yPGludDMyX3Q+KiAvKm91dCovb3V0cHV0U3RyZWFtSWRzLCBpbnQzMl90KiAvKm91dCovY3VycmVudFN0cmVhbUlkKSA9IDA7CisKKyAgICAvLyBSZXR1cm4gY29tcG9zaXRlIHN0cmVhbSBpZC4KKyAgICB2aXJ0dWFsIGludCBnZXRTdHJlYW1JZCgpID0gMDsKKworICAgIC8vIE5vdGlmeSB3aGVuIHNodXR0ZXIgbm90aWZ5IGlzIHRyaWdnZXJlZAorICAgIHZpcnR1YWwgdm9pZCBvblNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgLypyZXN1bHRFeHRyYXMqLywgbnNlY3NfdCAvKnRpbWVzdGFtcCovKSB7fQorCisgICAgdm9pZCBvblJlc3VsdEF2YWlsYWJsZShjb25zdCBDYXB0dXJlUmVzdWx0JiByZXN1bHQpOworICAgIGJvb2wgb25FcnJvcihpbnQzMl90IGVycm9yQ29kZSwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKTsKKworICAgIC8vIENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbgorICAgIHZvaWQgb25CdWZmZXJBY3F1aXJlZChjb25zdCBCdWZmZXJJbmZvJiAvKmJ1ZmZlckluZm8qLykgb3ZlcnJpZGUgeyAvKkVtcHR5IGZvciBub3cgKi8gfQorICAgIHZvaWQgb25CdWZmZXJSZWxlYXNlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uQnVmZmVyUmVxdWVzdEZvckZyYW1lTnVtYmVyKHVpbnQ2NF90IGZyYW1lTnVtYmVyLCBpbnQgc3RyZWFtSWQsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgICAgc3RydWN0IFByb2R1Y2VyTGlzdGVuZXIgOiBwdWJsaWMgQm5Qcm9kdWNlckxpc3RlbmVyIHsKKyAgICAgICAgLy8gUHJvZHVjZXJMaXN0ZW5lciBpbXBlbWVudGF0aW9uCisgICAgICAgIHZvaWQgb25CdWZmZXJSZWxlYXNlZCgpIG92ZXJyaWRlIHsgLypObyBpbXBsLiBmb3Igbm93Ki8gfTsKKyAgICB9OworCisgICAgc3RhdHVzX3QgcmVnaXN0ZXJDb21wb3NpdGVTdHJlYW1MaXN0ZW5lcihpbnQzMl90IHN0cmVhbUlkKTsKKyAgICB2b2lkIGVyYXNlUmVzdWx0KGludDY0X3QgZnJhbWVOdW1iZXIpOworICAgIHZvaWQgZmxhZ0FuRXJyb3JGcmFtZU51bWJlcihpbnQ2NF90IGZyYW1lTnVtYmVyKTsKKyAgICB2b2lkIG5vdGlmeUVycm9yKGludDY0X3QgZnJhbWVOdW1iZXIpOworCisgICAgLy8gU3ViY2xhc3NlcyBzaG91bGQgY2hlY2sgZm9yIGJ1ZmZlciBlcnJvcnMgZnJvbSBpbnRlcm5hbCBzdHJlYW1zIGFuZCByZXR1cm4gJ3RydWUnIGluCisgICAgLy8gY2FzZSB0aGUgZXJyb3Igbm90aWZpY2F0aW9uIHNob3VsZCByZW1haW4gd2l0aGluIGNhbWVyYSBzZXJ2aWNlLgorICAgIHZpcnR1YWwgYm9vbCBvblN0cmVhbUJ1ZmZlckVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgPSAwOworCisgICAgLy8gU3ViY2xhc3NlcyBjYW4gZGVjaWRlIGhvdyB0byBoYW5kbGUgcmVzdWx0IGVycm9ycyBkZXBlbmRpbmcgb24gd2hldGhlciBvciBub3QgdGhlCisgICAgLy8gaW50ZXJuYWwgcHJvY2Vzc2luZyBuZWVkcyByZXN1bHQgZGF0YS4KKyAgICB2aXJ0dWFsIHZvaWQgb25SZXN1bHRFcnJvcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpID0gMDsKKworICAgIC8vIERldmljZSBhbmQvb3Igc2VydmljZSBpcyBpbiB1bnJlY292ZXJhYmxlIGVycm9yIHN0YXRlLgorICAgIC8vIENvbXBvc2l0ZSBzdHJlYW1zIHNob3VsZCBiZWhhdmUgYWNjb3JkaW5nbHkuCisgICAgdm9pZCBlbmFibGVFcnJvclN0YXRlKCk7CisKKyAgICB3cDxDYW1lcmFEZXZpY2VCYXNlPiAgIG1EZXZpY2U7CisgICAgd3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IG1SZW1vdGVDYWxsYmFjazsKKworICAgIG11dGFibGUgTXV0ZXggICAgICAgICAgbU11dGV4OworICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgbUlucHV0UmVhZHlDb25kaXRpb247CisgICAgaW50MzJfdCAgICAgICAgICAgICAgICBtTnVtUGFydGlhbFJlc3VsdHM7CisgICAgYm9vbCAgICAgICAgICAgICAgICAgICBtRXJyb3JTdGF0ZTsKKworICAgIC8vIEZyYW1lIG51bWJlciB0byBjYXB0dXJlIHJlc3VsdCBtYXAgb2YgcGFydGlhbCBwZW5kaW5nIHJlcXVlc3QgcmVzdWx0cy4KKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIENhbWVyYU1ldGFkYXRhPiBtUGVuZGluZ0NhcHR1cmVSZXN1bHRzOworCisgICAgLy8gVGltZXN0YW1wIHRvIGNhcHR1cmUgKGZyYW1lIG51bWJlciwgcmVzdWx0KSBtYXAgb2YgY29tcGxldGVkIHBlbmRpbmcgcmVxdWVzdCByZXN1bHRzLgorICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQ2NF90LCBzdGQ6OnR1cGxlPGludDY0X3QsIENhbWVyYU1ldGFkYXRhPj4gbUNhcHR1cmVSZXN1bHRzOworCisgICAgLy8gRnJhbWUgbnVtYmVyIHRvIHRpbWVzdGFtcCBtYXAKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50NjRfdCwgaW50NjRfdD4gbUZyYW1lTnVtYmVyTWFwOworCisgICAgLy8gS2VlcHMgYSBzZXQgYnVmZmVyL3Jlc3VsdCBmcmFtZSBudW1iZXJzIGZvciBhbnkgZXJyb3JzIGRldGVjdGVkIGR1cmluZyBwcm9jZXNzaW5nLgorICAgIHN0ZDo6c2V0PGludDY0X3Q+IG1FcnJvckZyYW1lTnVtYmVyczsKKworfTsKKworfTsgLy9uYW1lc3BhY2UgY2FtZXJhMworfTsgLy9uYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9EZXB0aENvbXBvc2l0ZVN0cmVhbS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI5MTAxNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uY3BwCkBAIC0wLDAgKzEsODI5IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmEzLURlcHRoQ29tcG9zaXRlU3RyZWFtIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlICJhcGkxL2NsaWVudDIvSnBlZ1Byb2Nlc3Nvci5oIgorI2luY2x1ZGUgImNvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaCIKKyNpbmNsdWRlICJkbGZjbi5oIgorI2luY2x1ZGUgPGd1aS9TdXJmYWNlLmg+CisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisjaW5jbHVkZSA8dXRpbHMvVHJhY2UuaD4KKworI2luY2x1ZGUgIkRlcHRoQ29tcG9zaXRlU3RyZWFtLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworRGVwdGhDb21wb3NpdGVTdHJlYW06OkRlcHRoQ29tcG9zaXRlU3RyZWFtKHdwPENhbWVyYURldmljZUJhc2U+IGRldmljZSwKKyAgICAgICAgd3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNiKSA6CisgICAgICAgIENvbXBvc2l0ZVN0cmVhbShkZXZpY2UsIGNiKSwKKyAgICAgICAgbUJsb2JTdHJlYW1JZCgtMSksCisgICAgICAgIG1CbG9iU3VyZmFjZUlkKC0xKSwKKyAgICAgICAgbURlcHRoU3RyZWFtSWQoLTEpLAorICAgICAgICBtRGVwdGhTdXJmYWNlSWQoLTEpLAorICAgICAgICBtQmxvYldpZHRoKDApLAorICAgICAgICBtQmxvYkhlaWdodCgwKSwKKyAgICAgICAgbURlcHRoQnVmZmVyQWNxdWlyZWQoZmFsc2UpLAorICAgICAgICBtQmxvYkJ1ZmZlckFjcXVpcmVkKGZhbHNlKSwKKyAgICAgICAgbVByb2R1Y2VyTGlzdGVuZXIobmV3IFByb2R1Y2VyTGlzdGVuZXIoKSksCisgICAgICAgIG1NYXhKcGVnU2l6ZSgtMSksCisgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmEoZmFsc2UpLAorICAgICAgICBtRGVwdGhQaG90b0xpYkhhbmRsZShudWxscHRyKSwKKyAgICAgICAgbURlcHRoUGhvdG9Qcm9jZXNzKG51bGxwdHIpIHsKKyAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBjYW1lcmFEZXZpY2UgPSBkZXZpY2UucHJvbW90ZSgpOworICAgIGlmIChjYW1lcmFEZXZpY2UuZ2V0KCkgIT0gbnVsbHB0cikgeworICAgICAgICBDYW1lcmFNZXRhZGF0YSBzdGF0aWNJbmZvID0gY2FtZXJhRGV2aWNlLT5pbmZvKCk7CisgICAgICAgIGF1dG8gZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9KUEVHX01BWF9TSVpFKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICAgICAgbU1heEpwZWdTaXplID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IE1heGltdW0ganBlZyBzaXplIGFic2VudCBmcm9tIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB9CisKKyAgICAgICAgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9MRU5TX0lOVFJJTlNJQ19DQUxJQlJBVElPTik7CisgICAgICAgIGlmIChlbnRyeS5jb3VudCA9PSA1KSB7CisgICAgICAgICAgICBtSW50cmluc2ljQ2FsaWJyYXRpb24ucmVzZXJ2ZSg1KTsKKyAgICAgICAgICAgIG1JbnRyaW5zaWNDYWxpYnJhdGlvbi5pbnNlcnQobUludHJpbnNpY0NhbGlicmF0aW9uLmVuZCgpLCBlbnRyeS5kYXRhLmYsCisgICAgICAgICAgICAgICAgICAgIGVudHJ5LmRhdGEuZiArIDUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzOiBJbnRyaW5zaWMgY2FsaWJyYXRpb24gYWJzZW50IGZyb20gY2FtZXJhIGNoYXJhY3RlcmlzdGljcyEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICB9CisKKyAgICAgICAgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9MRU5TX0RJU1RPUlRJT04pOworICAgICAgICBpZiAoZW50cnkuY291bnQgPT0gNSkgeworICAgICAgICAgICAgbUxlbnNEaXN0b3J0aW9uLnJlc2VydmUoNSk7CisgICAgICAgICAgICBtTGVuc0Rpc3RvcnRpb24uaW5zZXJ0KG1MZW5zRGlzdG9ydGlvbi5lbmQoKSwgZW50cnkuZGF0YS5mLCBlbnRyeS5kYXRhLmYgKyA1KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogTGVucyBkaXN0b3J0aW9uIGFic2VudCBmcm9tIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgfQorCisgICAgICAgIGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgKytpKSB7CisgICAgICAgICAgICB1aW50OF90IGNhcGFiaWxpdHkgPSBlbnRyeS5kYXRhLnU4W2ldOworICAgICAgICAgICAgaWYgKGNhcGFiaWxpdHkgPT0gQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVNfTE9HSUNBTF9NVUxUSV9DQU1FUkEpIHsKKyAgICAgICAgICAgICAgICBtSXNMb2dpY2FsQ2FtZXJhID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGdldFN1cHBvcnRlZERlcHRoU2l6ZXMoc3RhdGljSW5mbywgJm1TdXBwb3J0ZWREZXB0aFNpemVzKTsKKworICAgICAgICBtRGVwdGhQaG90b0xpYkhhbmRsZSA9IGRsb3BlbihjYW1lcmEzOjprRGVwdGhQaG90b0xpYnJhcnksIFJUTERfTk9XIHwgUlRMRF9MT0NBTCk7CisgICAgICAgIGlmIChtRGVwdGhQaG90b0xpYkhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICBtRGVwdGhQaG90b1Byb2Nlc3MgPSByZWludGVycHJldF9jYXN0PGNhbWVyYTM6OnByb2Nlc3NfZGVwdGhfcGhvdG9fZnJhbWU+ICgKKyAgICAgICAgICAgICAgICAgICAgZGxzeW0obURlcHRoUGhvdG9MaWJIYW5kbGUsIGNhbWVyYTM6OmtEZXB0aFBob3RvUHJvY2Vzc0Z1bmN0aW9uKSk7CisgICAgICAgICAgICBpZiAobURlcHRoUGhvdG9Qcm9jZXNzID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBsaW5rIHRvIGRlcHRoIHBob3RvIHByb2Nlc3MgZnVuY3Rpb246ICVzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgZGxlcnJvcigpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGxpbmsgdG8gZGVwdGggcGhvdG8gbGlicmFyeTogJXMiLCBfX0ZVTkNUSU9OX18sIGRsZXJyb3IoKSk7CisgICAgICAgIH0KKworICAgIH0KK30KKworRGVwdGhDb21wb3NpdGVTdHJlYW06On5EZXB0aENvbXBvc2l0ZVN0cmVhbSgpIHsKKyAgICBtQmxvYkNvbnN1bWVyLmNsZWFyKCksCisgICAgbUJsb2JTdXJmYWNlLmNsZWFyKCksCisgICAgbUJsb2JTdHJlYW1JZCA9IC0xOworICAgIG1CbG9iU3VyZmFjZUlkID0gLTE7CisgICAgbURlcHRoQ29uc3VtZXIuY2xlYXIoKTsKKyAgICBtRGVwdGhTdXJmYWNlLmNsZWFyKCk7CisgICAgbURlcHRoQ29uc3VtZXIgPSBudWxscHRyOworICAgIG1EZXB0aFN1cmZhY2UgPSBudWxscHRyOworICAgIGlmIChtRGVwdGhQaG90b0xpYkhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgIGRsY2xvc2UobURlcHRoUGhvdG9MaWJIYW5kbGUpOworICAgICAgICBtRGVwdGhQaG90b0xpYkhhbmRsZSA9IG51bGxwdHI7CisgICAgfQorICAgIG1EZXB0aFBob3RvUHJvY2VzcyA9IG51bGxwdHI7Cit9CisKK3ZvaWQgRGVwdGhDb21wb3NpdGVTdHJlYW06OmNvbXBpbGVQZW5kaW5nSW5wdXRMb2NrZWQoKSB7CisgICAgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciBpbWdCdWZmZXI7CisKKyAgICB3aGlsZSAoIW1JbnB1dEpwZWdCdWZmZXJzLmVtcHR5KCkgJiYgIW1CbG9iQnVmZmVyQWNxdWlyZWQpIHsKKyAgICAgICAgYXV0byBpdCA9IG1JbnB1dEpwZWdCdWZmZXJzLmJlZ2luKCk7CisgICAgICAgIGF1dG8gcmVzID0gbUJsb2JDb25zdW1lci0+bG9ja05leHRCdWZmZXIoJmltZ0J1ZmZlcik7CisgICAgICAgIGlmIChyZXMgPT0gTk9UX0VOT1VHSF9EQVRBKSB7CisgICAgICAgICAgICAvLyBDYW4gbm90IGxvY2sgYW55IG1vcmUgYnVmZmVycy4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBsb2NraW5nIGJsb2IgaW1hZ2UgYnVmZmVyOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbKml0XS5lcnJvciA9IHRydWU7CisgICAgICAgICAgICBtSW5wdXRKcGVnQnVmZmVycy5lcmFzZShpdCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqaXQgIT0gaW1nQnVmZmVyLnRpbWVzdGFtcCkgeworICAgICAgICAgICAgQUxPR1coIiVzOiBFeHBlY3RpbmcganBlZyBidWZmZXIgd2l0aCB0aW1lIHN0YW1wOiAlIiBQUklkNjQgIiByZWNlaXZlZCBidWZmZXIgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICJ0aW1lIHN0YW1wOiAlIiBQUklkNjQsIF9fRlVOQ1RJT05fXywgKml0LCBpbWdCdWZmZXIudGltZXN0YW1wKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgobVBlbmRpbmdJbnB1dEZyYW1lcy5maW5kKGltZ0J1ZmZlci50aW1lc3RhbXApICE9IG1QZW5kaW5nSW5wdXRGcmFtZXMuZW5kKCkpICYmCisgICAgICAgICAgICAgICAgKG1QZW5kaW5nSW5wdXRGcmFtZXNbaW1nQnVmZmVyLnRpbWVzdGFtcF0uZXJyb3IpKSB7CisgICAgICAgICAgICBtQmxvYkNvbnN1bWVyLT51bmxvY2tCdWZmZXIoaW1nQnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaW1nQnVmZmVyLnRpbWVzdGFtcF0uanBlZ0J1ZmZlciA9IGltZ0J1ZmZlcjsKKyAgICAgICAgICAgIG1CbG9iQnVmZmVyQWNxdWlyZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1JbnB1dEpwZWdCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW1JbnB1dERlcHRoQnVmZmVycy5lbXB0eSgpICYmICFtRGVwdGhCdWZmZXJBY3F1aXJlZCkgeworICAgICAgICBhdXRvIGl0ID0gbUlucHV0RGVwdGhCdWZmZXJzLmJlZ2luKCk7CisgICAgICAgIGF1dG8gcmVzID0gbURlcHRoQ29uc3VtZXItPmxvY2tOZXh0QnVmZmVyKCZpbWdCdWZmZXIpOworICAgICAgICBpZiAocmVzID09IE5PVF9FTk9VR0hfREFUQSkgeworICAgICAgICAgICAgLy8gQ2FuIG5vdCBsb2NrIGFueSBtb3JlIGJ1ZmZlcnMuCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgcmVjZWl2aW5nIGRlcHRoIGltYWdlIGJ1ZmZlcjogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzWyppdF0uZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgbUlucHV0RGVwdGhCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCppdCAhPSBpbWdCdWZmZXIudGltZXN0YW1wKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IEV4cGVjdGluZyBkZXB0aCBidWZmZXIgd2l0aCB0aW1lIHN0YW1wOiAlIiBQUklkNjQgIiByZWNlaXZlZCBidWZmZXIgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICJ0aW1lIHN0YW1wOiAlIiBQUklkNjQsIF9fRlVOQ1RJT05fXywgKml0LCBpbWdCdWZmZXIudGltZXN0YW1wKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgobVBlbmRpbmdJbnB1dEZyYW1lcy5maW5kKGltZ0J1ZmZlci50aW1lc3RhbXApICE9IG1QZW5kaW5nSW5wdXRGcmFtZXMuZW5kKCkpICYmCisgICAgICAgICAgICAgICAgKG1QZW5kaW5nSW5wdXRGcmFtZXNbaW1nQnVmZmVyLnRpbWVzdGFtcF0uZXJyb3IpKSB7CisgICAgICAgICAgICBtRGVwdGhDb25zdW1lci0+dW5sb2NrQnVmZmVyKGltZ0J1ZmZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2ltZ0J1ZmZlci50aW1lc3RhbXBdLmRlcHRoQnVmZmVyID0gaW1nQnVmZmVyOworICAgICAgICAgICAgbURlcHRoQnVmZmVyQWNxdWlyZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICAgIG1JbnB1dERlcHRoQnVmZmVycy5lcmFzZShpdCk7CisgICAgfQorCisgICAgd2hpbGUgKCFtQ2FwdHVyZVJlc3VsdHMuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGl0ID0gbUNhcHR1cmVSZXN1bHRzLmJlZ2luKCk7CisgICAgICAgIC8vIE5lZ2F0aXZlIHRpbWVzdGFtcCBpbmRpY2F0ZXMgdGhhdCBzb21ldGhpbmcgd2VudCB3cm9uZyBkdXJpbmcgdGhlIGNhcHR1cmUgcmVzdWx0CisgICAgICAgIC8vIGNvbGxlY3Rpb24gcHJvY2Vzcy4KKyAgICAgICAgaWYgKGl0LT5maXJzdCA+PSAwKSB7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2l0LT5maXJzdF0uZnJhbWVOdW1iZXIgPSBzdGQ6OmdldDwwPihpdC0+c2Vjb25kKTsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaXQtPmZpcnN0XS5yZXN1bHQgPSBzdGQ6OmdldDwxPihpdC0+c2Vjb25kKTsKKyAgICAgICAgfQorICAgICAgICBtQ2FwdHVyZVJlc3VsdHMuZXJhc2UoaXQpOworICAgIH0KKworICAgIHdoaWxlICghbUZyYW1lTnVtYmVyTWFwLmVtcHR5KCkpIHsKKyAgICAgICAgYXV0byBpdCA9IG1GcmFtZU51bWJlck1hcC5iZWdpbigpOworICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2l0LT5zZWNvbmRdLmZyYW1lTnVtYmVyID0gaXQtPmZpcnN0OworICAgICAgICBtRnJhbWVOdW1iZXJNYXAuZXJhc2UoaXQpOworICAgIH0KKworICAgIGF1dG8gaXQgPSBtRXJyb3JGcmFtZU51bWJlcnMuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbUVycm9yRnJhbWVOdW1iZXJzLmVuZCgpKSB7CisgICAgICAgIGJvb2wgZnJhbWVGb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKGF1dG8gJmlucHV0RnJhbWUgOiBtUGVuZGluZ0lucHV0RnJhbWVzKSB7CisgICAgICAgICAgICBpZiAoaW5wdXRGcmFtZS5zZWNvbmQuZnJhbWVOdW1iZXIgPT0gKml0KSB7CisgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5zZWNvbmQuZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIGZyYW1lRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZyYW1lRm91bmQpIHsKKyAgICAgICAgICAgIGl0ID0gbUVycm9yRnJhbWVOdW1iZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogTm90IGFibGUgdG8gZmluZCBmYWlsaW5nIGlucHV0IHdpdGggZnJhbWUgbnVtYmVyOiAlIiBQUklkNjQsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgKml0KTsKKyAgICAgICAgICAgIGl0Kys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgRGVwdGhDb21wb3NpdGVTdHJlYW06OmdldE5leHRSZWFkeUlucHV0TG9ja2VkKGludDY0X3QgKmN1cnJlbnRUcyAvKmlub3V0Ki8pIHsKKyAgICBpZiAoY3VycmVudFRzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgbmV3SW5wdXRBdmFpbGFibGUgPSBmYWxzZTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbVBlbmRpbmdJbnB1dEZyYW1lcykgeworICAgICAgICBpZiAoKCFpdC5zZWNvbmQuZXJyb3IpICYmIChpdC5zZWNvbmQuZGVwdGhCdWZmZXIuZGF0YSAhPSBudWxscHRyKSAmJgorICAgICAgICAgICAgICAgIChpdC5zZWNvbmQuanBlZ0J1ZmZlci5kYXRhICE9IG51bGxwdHIpICYmIChpdC5maXJzdCA8ICpjdXJyZW50VHMpKSB7CisgICAgICAgICAgICAqY3VycmVudFRzID0gaXQuZmlyc3Q7CisgICAgICAgICAgICBuZXdJbnB1dEF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbmV3SW5wdXRBdmFpbGFibGU7Cit9CisKK2ludDY0X3QgRGVwdGhDb21wb3NpdGVTdHJlYW06OmdldE5leHRGYWlsaW5nSW5wdXRMb2NrZWQoaW50NjRfdCAqY3VycmVudFRzIC8qaW5vdXQqLykgeworICAgIGludDY0X3QgcmV0ID0gLTE7CisgICAgaWYgKGN1cnJlbnRUcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvJiBpdCA6IG1QZW5kaW5nSW5wdXRGcmFtZXMpIHsKKyAgICAgICAgaWYgKGl0LnNlY29uZC5lcnJvciAmJiAhaXQuc2Vjb25kLmVycm9yTm90aWZpZWQgJiYgKGl0LmZpcnN0IDwgKmN1cnJlbnRUcykpIHsKKyAgICAgICAgICAgICpjdXJyZW50VHMgPSBpdC5maXJzdDsKKyAgICAgICAgICAgIHJldCA9IGl0LnNlY29uZC5mcmFtZU51bWJlcjsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IERlcHRoQ29tcG9zaXRlU3RyZWFtOjpwcm9jZXNzSW5wdXRGcmFtZShuc2Vjc190IHRzLCBjb25zdCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKSB7CisgICAgc3RhdHVzX3QgcmVzOworICAgIHNwPEFOYXRpdmVXaW5kb3c+IG91dHB1dEFOVyA9IG1PdXRwdXRTdXJmYWNlOworICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIgKmFuYjsKKyAgICBpbnQgZmVuY2VGZDsKKyAgICB2b2lkICpkc3RCdWZmZXI7CisKKyAgICBhdXRvIGpwZWdTaXplID0gYW5kcm9pZDo6Y2FtZXJhMjo6SnBlZ1Byb2Nlc3Nvcjo6ZmluZEpwZWdTaXplKGlucHV0RnJhbWUuanBlZ0J1ZmZlci5kYXRhLAorICAgICAgICAgICAgaW5wdXRGcmFtZS5qcGVnQnVmZmVyLndpZHRoKTsKKyAgICBpZiAoanBlZ1NpemUgPT0gMCkgeworICAgICAgICBBTE9HVygiJXM6IEZhaWxlZCB0byBmaW5kIGlucHV0IGpwZWcgc2l6ZSwgZGVmYXVsdCB0byB1c2luZyBlbnRpcmUgYnVmZmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGpwZWdTaXplID0gaW5wdXRGcmFtZS5qcGVnQnVmZmVyLndpZHRoOworICAgIH0KKworICAgIHNpemVfdCBtYXhEZXB0aEpwZWdTaXplOworICAgIGlmIChtTWF4SnBlZ1NpemUgPiAwKSB7CisgICAgICAgIG1heERlcHRoSnBlZ1NpemUgPSBtTWF4SnBlZ1NpemU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbWF4RGVwdGhKcGVnU2l6ZSA9IHN0ZDo6bWF4PHNpemVfdD4gKGpwZWdTaXplLAorICAgICAgICAgICAgICAgIGlucHV0RnJhbWUuZGVwdGhCdWZmZXIud2lkdGggKiBpbnB1dEZyYW1lLmRlcHRoQnVmZmVyLmhlaWdodCAqIDMgLyAyKTsKKyAgICB9CisgICAgdWludDhfdCBqcGVnUXVhbGl0eSA9IDEwMDsKKyAgICBhdXRvIGVudHJ5ID0gaW5wdXRGcmFtZS5yZXN1bHQuZmluZChBTkRST0lEX0pQRUdfUVVBTElUWSk7CisgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICBqcGVnUXVhbGl0eSA9IGVudHJ5LmRhdGEudThbMF07CisgICAgfQorCisgICAgLy8gVGhlIGZpbmFsIGRlcHRoIHBob3RvIHdpbGwgY29uc2lzdCBvZiB0aGUgbWFpbiBqcGVnIGJ1ZmZlciwgdGhlIGRlcHRoIG1hcCBidWZmZXIgKGFsc28gaW4KKyAgICAvLyBqcGVnIGZvcm1hdCkgYW5kIGNvbmZpZGVuY2UgbWFwIChqcGVnIGFzIHdlbGwpLiBBc3N1bWUgd29yc3QgY2FzZSB0aGF0IGFsbCAzIGpwZWcgbmVlZAorICAgIC8vIG1heCBqcGVnIHNpemUuCisgICAgc2l6ZV90IGZpbmFsSnBlZ0J1ZmZlclNpemUgPSBtYXhEZXB0aEpwZWdTaXplICogMzsKKworICAgIGlmICgocmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19kaW1lbnNpb25zKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBmaW5hbEpwZWdCdWZmZXJTaXplLCAxKSkKKyAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBzdHJlYW0gYnVmZmVyIGRpbWVuc2lvbnMiCisgICAgICAgICAgICAgICAgIiAlenV4JXUgZm9yIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywgZmluYWxKcGVnQnVmZmVyU2l6ZSwgMVUsIG1CbG9iU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHJlcyA9IG91dHB1dEFOVy0+ZGVxdWV1ZUJ1ZmZlcihtT3V0cHV0U3VyZmFjZS5nZXQoKSwgJmFuYiwgJmZlbmNlRmQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciByZXRyaWV2aW5nIG91dHB1dCBidWZmZXI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLAorICAgICAgICAgICAgICAgIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgc3A8R3JhcGhpY0J1ZmZlcj4gZ2IgPSBHcmFwaGljQnVmZmVyOjpmcm9tKGFuYik7CisgICAgcmVzID0gZ2ItPmxvY2tBc3luYyhHUkFMTE9DX1VTQUdFX1NXX1dSSVRFX09GVEVOLCAmZHN0QnVmZmVyLCBmZW5jZUZkKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3IgdHJ5aW5nIHRvIGxvY2sgb3V0cHV0IGJ1ZmZlciBmZW5jZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgb3V0cHV0QU5XLT5jYW5jZWxCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksIGFuYiwgLypmZW5jZSovIC0xKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAoKGdiLT5nZXRXaWR0aCgpIDwgZmluYWxKcGVnQnVmZmVyU2l6ZSkgfHwgKGdiLT5nZXRIZWlnaHQoKSAhPSAxKSkgeworICAgICAgICBBTE9HRSgiJXM6IEJsb2IgYnVmZmVyIHNpemUgbWlzbWF0Y2gsIGV4cGVjdGVkICVkeCVkIHJlY2VpdmVkICV6dXgldSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBnYi0+Z2V0V2lkdGgoKSwgZ2ItPmdldEhlaWdodCgpLCBmaW5hbEpwZWdCdWZmZXJTaXplLCAxVSk7CisgICAgICAgIG91dHB1dEFOVy0+Y2FuY2VsQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBhbmIsIC8qZmVuY2UqLyAtMSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgRGVwdGhQaG90b0lucHV0RnJhbWUgZGVwdGhQaG90bzsKKyAgICBkZXB0aFBob3RvLm1NYWluSnBlZ0J1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+IChpbnB1dEZyYW1lLmpwZWdCdWZmZXIuZGF0YSk7CisgICAgZGVwdGhQaG90by5tTWFpbkpwZWdXaWR0aCA9IG1CbG9iV2lkdGg7CisgICAgZGVwdGhQaG90by5tTWFpbkpwZWdIZWlnaHQgPSBtQmxvYkhlaWdodDsKKyAgICBkZXB0aFBob3RvLm1NYWluSnBlZ1NpemUgPSBqcGVnU2l6ZTsKKyAgICBkZXB0aFBob3RvLm1EZXB0aE1hcEJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDE2X3QqPiAoaW5wdXRGcmFtZS5kZXB0aEJ1ZmZlci5kYXRhKTsKKyAgICBkZXB0aFBob3RvLm1EZXB0aE1hcFdpZHRoID0gaW5wdXRGcmFtZS5kZXB0aEJ1ZmZlci53aWR0aDsKKyAgICBkZXB0aFBob3RvLm1EZXB0aE1hcEhlaWdodCA9IGlucHV0RnJhbWUuZGVwdGhCdWZmZXIuaGVpZ2h0OworICAgIGRlcHRoUGhvdG8ubURlcHRoTWFwU3RyaWRlID0gaW5wdXRGcmFtZS5kZXB0aEJ1ZmZlci5zdHJpZGU7CisgICAgZGVwdGhQaG90by5tSnBlZ1F1YWxpdHkgPSBqcGVnUXVhbGl0eTsKKyAgICBkZXB0aFBob3RvLm1Jc0xvZ2ljYWwgPSBtSXNMb2dpY2FsQ2FtZXJhOworICAgIGRlcHRoUGhvdG8ubU1heEpwZWdTaXplID0gbWF4RGVwdGhKcGVnU2l6ZTsKKyAgICAvLyBUaGUgY2FtZXJhIGludHJpbnNpYyBjYWxpYnJhdGlvbiBsYXlvdXQgaXMgYXMgZm9sbG93czoKKyAgICAvLyBbZm9jYWxMZW5ndGhYLCBmb2NhbExlbmd0aFksIG9wdGljYWxDZW50ZXJYLCBvcHRpY2FsQ2VudGVyWSwgc2tld10KKyAgICBpZiAobUludHJpbnNpY0NhbGlicmF0aW9uLnNpemUoKSA9PSA1KSB7CisgICAgICAgIG1lbWNweShkZXB0aFBob3RvLm1JbnRyaW5zaWNDYWxpYnJhdGlvbiwgbUludHJpbnNpY0NhbGlicmF0aW9uLmRhdGEoKSwKKyAgICAgICAgICAgICAgICBzaXplb2YoZGVwdGhQaG90by5tSW50cmluc2ljQ2FsaWJyYXRpb24pKTsKKyAgICAgICAgZGVwdGhQaG90by5tSXNJbnRyaW5zaWNDYWxpYnJhdGlvblZhbGlkID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXB0aFBob3RvLm1Jc0ludHJpbnNpY0NhbGlicmF0aW9uVmFsaWQgPSAwOworICAgIH0KKyAgICAvLyBUaGUgY2FtZXJhIGxlbnMgZGlzdG9ydGlvbiBjb250YWlucyB0aGUgZm9sbG93aW5nIGxlbnMgY29ycmVjdGlvbiBjb2VmZmljaWVudHMuCisgICAgLy8gW2thcHBhXzEsIGthcHBhXzIsIGthcHBhXzMga2FwcGFfNCwga2FwcGFfNV0KKyAgICBpZiAobUxlbnNEaXN0b3J0aW9uLnNpemUoKSA9PSA1KSB7CisgICAgICAgIG1lbWNweShkZXB0aFBob3RvLm1MZW5zRGlzdG9ydGlvbiwgbUxlbnNEaXN0b3J0aW9uLmRhdGEoKSwKKyAgICAgICAgICAgICAgICBzaXplb2YoZGVwdGhQaG90by5tTGVuc0Rpc3RvcnRpb24pKTsKKyAgICAgICAgZGVwdGhQaG90by5tSXNMZW5zRGlzdG9ydGlvblZhbGlkID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgICBkZXB0aFBob3RvLm1Jc0xlbnNEaXN0b3J0aW9uVmFsaWQgPSAwOworICAgIH0KKyAgICBlbnRyeSA9IGlucHV0RnJhbWUucmVzdWx0LmZpbmQoQU5EUk9JRF9KUEVHX09SSUVOVEFUSU9OKTsKKyAgICBpZiAoZW50cnkuY291bnQgPiAwKSB7CisgICAgICAgIC8vIFRoZSBjYW1lcmEganBlZyBvcmllbnRhdGlvbiB2YWx1ZXMgbXVzdCBiZSB3aXRoaW4gWzAsIDkwLCAxODAsIDI3MF0uCisgICAgICAgIHN3aXRjaCAoZW50cnkuZGF0YS5pMzJbMF0pIHsKKyAgICAgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICAgIGNhc2UgOTA6CisgICAgICAgICAgICBjYXNlIDE4MDoKKyAgICAgICAgICAgIGNhc2UgMjcwOgorICAgICAgICAgICAgICAgIGRlcHRoUGhvdG8ubU9yaWVudGF0aW9uID0gc3RhdGljX2Nhc3Q8RGVwdGhQaG90b09yaWVudGF0aW9uPiAoZW50cnkuZGF0YS5pMzJbMF0pOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQganBlZyBvcmllbnRhdGlvbiB2YWx1ZTogJWQsIGRlZmF1bHQgdG8gMCBkZWdyZWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZW50cnkuZGF0YS5pMzJbMF0pOworICAgICAgICB9CisgICAgfQorCisgICAgc2l6ZV90IGFjdHVhbEpwZWdTaXplID0gMDsKKyAgICByZXMgPSBtRGVwdGhQaG90b1Byb2Nlc3MoZGVwdGhQaG90bywgZmluYWxKcGVnQnVmZmVyU2l6ZSwgZHN0QnVmZmVyLCAmYWN0dWFsSnBlZ1NpemUpOworICAgIGlmIChyZXMgIT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IERlcHRoIHBob3RvIHByb2Nlc3NpbmcgZmFpbGVkOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgb3V0cHV0QU5XLT5jYW5jZWxCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksIGFuYiwgLypmZW5jZSovIC0xKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBzaXplX3QgZmluYWxKcGVnU2l6ZSA9IGFjdHVhbEpwZWdTaXplICsgc2l6ZW9mKHN0cnVjdCBjYW1lcmEzX2pwZWdfYmxvYik7CisgICAgaWYgKGZpbmFsSnBlZ1NpemUgPiBmaW5hbEpwZWdCdWZmZXJTaXplKSB7CisgICAgICAgIEFMT0dFKCIlczogRmluYWwganBlZyBidWZmZXIgbm90IGxhcmdlIGVub3VnaCBmb3IgdGhlIGpwZWcgYmxvYiBoZWFkZXIiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBvdXRwdXRBTlctPmNhbmNlbEJ1ZmZlcihtT3V0cHV0U3VyZmFjZS5nZXQoKSwgYW5iLCAvKmZlbmNlKi8gLTEpOworICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgIH0KKworICAgIHJlcyA9IG5hdGl2ZV93aW5kb3dfc2V0X2J1ZmZlcnNfdGltZXN0YW1wKG1PdXRwdXRTdXJmYWNlLmdldCgpLCB0cyk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRXJyb3Igc2V0dGluZyB0aW1lc3RhbXA6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgZ2V0U3RyZWFtSWQoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBGaW5hbCBqcGVnIHNpemU6ICV6dSIsIF9fZnVuY19fLCBmaW5hbEpwZWdTaXplKTsKKyAgICB1aW50OF90KiBoZWFkZXIgPSBzdGF0aWNfY2FzdDx1aW50OF90ICo+IChkc3RCdWZmZXIpICsKKyAgICAgICAgKGdiLT5nZXRXaWR0aCgpIC0gc2l6ZW9mKHN0cnVjdCBjYW1lcmEzX2pwZWdfYmxvYikpOworICAgIHN0cnVjdCBjYW1lcmEzX2pwZWdfYmxvYiAqYmxvYiA9IHJlaW50ZXJwcmV0X2Nhc3Q8c3RydWN0IGNhbWVyYTNfanBlZ19ibG9iKj4gKGhlYWRlcik7CisgICAgYmxvYi0+anBlZ19ibG9iX2lkID0gQ0FNRVJBM19KUEVHX0JMT0JfSUQ7CisgICAgYmxvYi0+anBlZ19zaXplID0gYWN0dWFsSnBlZ1NpemU7CisgICAgb3V0cHV0QU5XLT5xdWV1ZUJ1ZmZlcihtT3V0cHV0U3VyZmFjZS5nZXQoKSwgYW5iLCAvKmZlbmNlKi8gLTEpOworCisgICAgcmV0dXJuIHJlczsKK30KKwordm9pZCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6cmVsZWFzZUlucHV0RnJhbWVMb2NrZWQoSW5wdXRGcmFtZSAqaW5wdXRGcmFtZSAvKm91dCovKSB7CisgICAgaWYgKGlucHV0RnJhbWUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGlucHV0RnJhbWUtPmRlcHRoQnVmZmVyLmRhdGEgIT0gbnVsbHB0cikgeworICAgICAgICBtRGVwdGhDb25zdW1lci0+dW5sb2NrQnVmZmVyKGlucHV0RnJhbWUtPmRlcHRoQnVmZmVyKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+ZGVwdGhCdWZmZXIuZGF0YSA9IG51bGxwdHI7CisgICAgICAgIG1EZXB0aEJ1ZmZlckFjcXVpcmVkID0gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGlucHV0RnJhbWUtPmpwZWdCdWZmZXIuZGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgIG1CbG9iQ29uc3VtZXItPnVubG9ja0J1ZmZlcihpbnB1dEZyYW1lLT5qcGVnQnVmZmVyKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+anBlZ0J1ZmZlci5kYXRhID0gbnVsbHB0cjsKKyAgICAgICAgbUJsb2JCdWZmZXJBY3F1aXJlZCA9IGZhbHNlOworICAgIH0KKworICAgIGlmICgoaW5wdXRGcmFtZS0+ZXJyb3IgfHwgbUVycm9yU3RhdGUpICYmICFpbnB1dEZyYW1lLT5lcnJvck5vdGlmaWVkKSB7CisgICAgICAgIG5vdGlmeUVycm9yKGlucHV0RnJhbWUtPmZyYW1lTnVtYmVyKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+ZXJyb3JOb3RpZmllZCA9IHRydWU7CisgICAgfQorfQorCit2b2lkIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpyZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoaW50NjRfdCBjdXJyZW50VHMpIHsKKyAgICBhdXRvIGl0ID0gbVBlbmRpbmdJbnB1dEZyYW1lcy5iZWdpbigpOworICAgIHdoaWxlIChpdCAhPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVuZCgpKSB7CisgICAgICAgIGlmIChpdC0+Zmlyc3QgPD0gY3VycmVudFRzKSB7CisgICAgICAgICAgICByZWxlYXNlSW5wdXRGcmFtZUxvY2tlZCgmaXQtPnNlY29uZCk7CisgICAgICAgICAgICBpdCA9IG1QZW5kaW5nSW5wdXRGcmFtZXMuZXJhc2UoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaXQrKzsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6dGhyZWFkTG9vcCgpIHsKKyAgICBpbnQ2NF90IGN1cnJlbnRUcyA9IElOVDY0X01BWDsKKyAgICBib29sIG5ld0lucHV0QXZhaWxhYmxlID0gZmFsc2U7CisKKyAgICB7CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisKKyAgICAgICAgaWYgKG1FcnJvclN0YXRlKSB7CisgICAgICAgICAgICAvLyBJbiBjYXNlIHdlIGxhbmRlZCBpbiBlcnJvciBzdGF0ZSwgcmV0dXJuIGFueSBwZW5kaW5nIGJ1ZmZlcnMgYW5kCisgICAgICAgICAgICAvLyBoYWx0IGFsbCBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgICAgICAgICAgICBjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCk7CisgICAgICAgICAgICByZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoY3VycmVudFRzKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlICghbmV3SW5wdXRBdmFpbGFibGUpIHsKKyAgICAgICAgICAgIGNvbXBpbGVQZW5kaW5nSW5wdXRMb2NrZWQoKTsKKyAgICAgICAgICAgIG5ld0lucHV0QXZhaWxhYmxlID0gZ2V0TmV4dFJlYWR5SW5wdXRMb2NrZWQoJmN1cnJlbnRUcyk7CisgICAgICAgICAgICBpZiAoIW5ld0lucHV0QXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgYXV0byBmYWlsaW5nRnJhbWVOdW1iZXIgPSBnZXROZXh0RmFpbGluZ0lucHV0TG9ja2VkKCZjdXJyZW50VHMpOworICAgICAgICAgICAgICAgIGlmIChmYWlsaW5nRnJhbWVOdW1iZXIgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW5ub3QgZXJhc2UgJ21QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXScgYXQgdGhpcyBwb2ludCBiZWNhdXNlIGl0IGlzCisgICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlIGZvciB0d28gaW50ZXJuYWwgc3RyZWFtIGJ1ZmZlcnMgdG8gZmFpbC4gSW4gc3VjaCBzY2VuYXJpbyB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gY29tcG9zaXRlIHN0cmVhbSBzaG91bGQgbm90aWZ5IHRoZSBjbGllbnQgYWJvdXQgYSBzdHJlYW0gYnVmZmVyIGVycm9yIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgLy8gb25jZSBhbmQgdGhpcyBpbmZvcm1hdGlvbiBpcyBrZXB0IHdpdGhpbiAnZXJyb3JOb3RpZmllZCcuCisgICAgICAgICAgICAgICAgICAgIC8vIEFueSBwcmVzZW50IGZhaWxlZCBpbnB1dCBmcmFtZXMgd2lsbCBiZSByZW1vdmVkIG9uIGEgc3Vic2VxdWVudCBjYWxsIHRvCisgICAgICAgICAgICAgICAgICAgIC8vICdyZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoKScuCisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VJbnB1dEZyYW1lTG9ja2VkKCZtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10pOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHMgPSBJTlQ2NF9NQVg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXV0byByZXQgPSBtSW5wdXRSZWFkeUNvbmRpdGlvbi53YWl0UmVsYXRpdmUobU11dGV4LCBrV2FpdER1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRpbWVkIHdhaXQgb24gY29uZGl0aW9uIGZhaWxlZDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGF1dG8gcmVzID0gcHJvY2Vzc0lucHV0RnJhbWUoY3VycmVudFRzLCBtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10pOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCBwcm9jZXNzaW5nIGZyYW1lIHdpdGggdGltZXN0YW1wOiAlIiBQUkl1NjQgIjogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBjdXJyZW50VHMsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10uZXJyb3IgPSB0cnVlOworICAgIH0KKworICAgIHJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZChjdXJyZW50VHMpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRGVwdGhDb21wb3NpdGVTdHJlYW06OmlzRGVwdGhDb21wb3NpdGVTdHJlYW0oY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpIHsKKyAgICBBTmF0aXZlV2luZG93ICphbncgPSBzdXJmYWNlLmdldCgpOworICAgIHN0YXR1c190IGVycjsKKyAgICBpbnQgZm9ybWF0OworICAgIGlmICgoZXJyID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfRk9STUFULCAmZm9ybWF0KSkgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkZhaWxlZCB0byBxdWVyeSBTdXJmYWNlIGZvcm1hdDogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLAorICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQgZGF0YXNwYWNlOworICAgIGlmICgoZXJyID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfREVGQVVMVF9EQVRBU1BBQ0UsICZkYXRhc3BhY2UpKSAhPSBPSykgeworICAgICAgICBTdHJpbmc4IG1zZyA9IFN0cmluZzg6OmZvcm1hdCgiRmFpbGVkIHRvIHF1ZXJ5IFN1cmZhY2UgZGF0YXNwYWNlOiAlcyAoJWQpIiwgc3RyZXJyb3IoLWVyciksCisgICAgICAgICAgICAgICAgZXJyKTsKKyAgICAgICAgQUxPR0UoIiVzOiAlcyIsIF9fRlVOQ1RJT05fXywgbXNnLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmICgoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgJiYgKGRhdGFzcGFjZSA9PSBIQUxfREFUQVNQQUNFX0RZTkFNSUNfREVQVEgpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKK30KKworc3RhdHVzX3QgRGVwdGhDb21wb3NpdGVTdHJlYW06OmNyZWF0ZUludGVybmFsU3RyZWFtcyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycywKKyAgICAgICAgYm9vbCAvKmhhc0RlZmVycmVkQ29uc3VtZXIqLywgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKKyAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IC8qc3RyZWFtU2V0SWQqLywgYm9vbCAvKmlzU2hhcmVkKi8pIHsKKyAgICBpZiAobVN1cHBvcnRlZERlcHRoU2l6ZXMuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRoaXMgY2FtZXJhIGRldmljZSBkb2Vzbid0IHN1cHBvcnQgYW55IGRlcHRoIG1hcCBzdHJlYW1zISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICBzaXplX3QgZGVwdGhXaWR0aCwgZGVwdGhIZWlnaHQ7CisgICAgYXV0byByZXQgPSBnZXRNYXRjaGluZ0RlcHRoU2l6ZSh3aWR0aCwgaGVpZ2h0LCBtU3VwcG9ydGVkRGVwdGhTaXplcywgJmRlcHRoV2lkdGgsICZkZXB0aEhlaWdodCk7CisgICAgaWYgKHJldCAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIGFuIGFwcHJvcHJpYXRlIGRlcHRoIHN0cmVhbSBzaXplISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgc3A8Q2FtZXJhRGV2aWNlQmFzZT4gZGV2aWNlID0gbURldmljZS5wcm9tb3RlKCk7CisgICAgaWYgKCFkZXZpY2UuZ2V0KCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNhbWVyYSBkZXZpY2UhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3A8SUdyYXBoaWNCdWZmZXJQcm9kdWNlcj4gcHJvZHVjZXI7CisgICAgc3A8SUdyYXBoaWNCdWZmZXJDb25zdW1lcj4gY29uc3VtZXI7CisgICAgQnVmZmVyUXVldWU6OmNyZWF0ZUJ1ZmZlclF1ZXVlKCZwcm9kdWNlciwgJmNvbnN1bWVyKTsKKyAgICBtQmxvYkNvbnN1bWVyID0gbmV3IENwdUNvbnN1bWVyKGNvbnN1bWVyLCAvKm1heExvY2tlZEJ1ZmZlcnMqLzEsIC8qY29udHJvbGxlZEJ5QXBwKi8gdHJ1ZSk7CisgICAgbUJsb2JDb25zdW1lci0+c2V0RnJhbWVBdmFpbGFibGVMaXN0ZW5lcih0aGlzKTsKKyAgICBtQmxvYkNvbnN1bWVyLT5zZXROYW1lKFN0cmluZzgoIkNhbWVyYTMtSnBlZ0NvbXBvc2l0ZVN0cmVhbSIpKTsKKyAgICBtQmxvYlN1cmZhY2UgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CisKKyAgICByZXQgPSBkZXZpY2UtPmNyZWF0ZVN0cmVhbShtQmxvYlN1cmZhY2UsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwga0pwZWdEYXRhU3BhY2UsIHJvdGF0aW9uLAorICAgICAgICAgICAgaWQsIHBoeXNpY2FsQ2FtZXJhSWQsIHN1cmZhY2VJZHMpOworICAgIGlmIChyZXQgPT0gT0spIHsKKyAgICAgICAgbUJsb2JTdHJlYW1JZCA9ICppZDsKKyAgICAgICAgbUJsb2JTdXJmYWNlSWQgPSAoKnN1cmZhY2VJZHMpWzBdOworICAgICAgICBtT3V0cHV0U3VyZmFjZSA9IGNvbnN1bWVyc1swXTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIEJ1ZmZlclF1ZXVlOjpjcmVhdGVCdWZmZXJRdWV1ZSgmcHJvZHVjZXIsICZjb25zdW1lcik7CisgICAgbURlcHRoQ29uc3VtZXIgPSBuZXcgQ3B1Q29uc3VtZXIoY29uc3VtZXIsIC8qbWF4TG9ja2VkQnVmZmVycyovIDEsIC8qY29udHJvbGxlZEJ5QXBwKi8gdHJ1ZSk7CisgICAgbURlcHRoQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CisgICAgbURlcHRoQ29uc3VtZXItPnNldE5hbWUoU3RyaW5nOCgiQ2FtZXJhMy1EZXB0aENvbXBvc2l0ZVN0cmVhbSIpKTsKKyAgICBtRGVwdGhTdXJmYWNlID0gbmV3IFN1cmZhY2UocHJvZHVjZXIpOworICAgIHN0ZDo6dmVjdG9yPGludD4gZGVwdGhTdXJmYWNlSWQ7CisgICAgcmV0ID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obURlcHRoU3VyZmFjZSwgZGVwdGhXaWR0aCwgZGVwdGhIZWlnaHQsIGtEZXB0aE1hcFBpeGVsRm9ybWF0LAorICAgICAgICAgICAga0RlcHRoTWFwRGF0YVNwYWNlLCByb3RhdGlvbiwgJm1EZXB0aFN0cmVhbUlkLCBwaHlzaWNhbENhbWVyYUlkLCAmZGVwdGhTdXJmYWNlSWQpOworICAgIGlmIChyZXQgPT0gT0spIHsKKyAgICAgICAgbURlcHRoU3VyZmFjZUlkID0gZGVwdGhTdXJmYWNlSWRbMF07CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSByZWdpc3RlckNvbXBvc2l0ZVN0cmVhbUxpc3RlbmVyKGdldFN0cmVhbUlkKCkpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgYmxvYiBzdHJlYW0gbGlzdGVuZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJldDsKKyAgICB9CisKKyAgICByZXQgPSByZWdpc3RlckNvbXBvc2l0ZVN0cmVhbUxpc3RlbmVyKG1EZXB0aFN0cmVhbUlkKTsKKyAgICBpZiAocmV0ICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHJlZ2lzdGVyIGRlcHRoIHN0cmVhbSBsaXN0ZW5lciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIG1CbG9iV2lkdGggPSB3aWR0aDsKKyAgICBtQmxvYkhlaWdodCA9IGhlaWdodDsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IERlcHRoQ29tcG9zaXRlU3RyZWFtOjpjb25maWd1cmVTdHJlYW0oKSB7CisgICAgaWYgKGlzUnVubmluZygpKSB7CisgICAgICAgIC8vIFByb2Nlc3NpbmcgdGhyZWFkIGlzIGFscmVhZHkgcnVubmluZywgbm90aGluZyBtb3JlIHRvIGRvLgorICAgICAgICByZXR1cm4gTk9fRVJST1I7CisgICAgfQorCisgICAgaWYgKChtRGVwdGhQaG90b0xpYkhhbmRsZSA9PSBudWxscHRyKSB8fCAobURlcHRoUGhvdG9Qcm9jZXNzID09IG51bGxwdHIpKSB7CisgICAgICAgIEFMT0dFKCIlczogRGVwdGggcGhvdG8gbGlicmFyeSBpcyBub3QgcHJlc2VudCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpZiAobU91dHB1dFN1cmZhY2UuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IE5vIHZhbGlkIG91dHB1dCBzdXJmYWNlIHNldCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBhdXRvIHJlcyA9IG1PdXRwdXRTdXJmYWNlLT5jb25uZWN0KE5BVElWRV9XSU5ET1dfQVBJX0NBTUVSQSwgbVByb2R1Y2VyTGlzdGVuZXIpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29ubmVjdCB0byBuYXRpdmUgd2luZG93IGZvciBzdHJlYW0gJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUJsb2JTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKChyZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2Zvcm1hdChtT3V0cHV0U3VyZmFjZS5nZXQoKSwgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSkKKyAgICAgICAgICAgICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGNvbmZpZ3VyZSBzdHJlYW0gYnVmZmVyIGZvcm1hdCBmb3Igc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIG1CbG9iU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGludCBtYXhQcm9kdWNlckJ1ZmZlcnM7CisgICAgQU5hdGl2ZVdpbmRvdyAqYW53ID0gbUJsb2JTdXJmYWNlLmdldCgpOworICAgIGlmICgocmVzID0gYW53LT5xdWVyeShhbncsIE5BVElWRV9XSU5ET1dfTUlOX1VOREVRVUVVRURfQlVGRkVSUywgJm1heFByb2R1Y2VyQnVmZmVycykpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHF1ZXJ5IGNvbnN1bWVyIHVuZGVxdWV1ZWQiCisgICAgICAgICAgICAgICAgIiBidWZmZXIgY291bnQgZm9yIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywgbUJsb2JTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgQU5hdGl2ZVdpbmRvdyAqYW53Q29uc3VtZXIgPSBtT3V0cHV0U3VyZmFjZS5nZXQoKTsKKyAgICBpbnQgbWF4Q29uc3VtZXJCdWZmZXJzOworICAgIGlmICgocmVzID0gYW53Q29uc3VtZXItPnF1ZXJ5KGFud0NvbnN1bWVyLCBOQVRJVkVfV0lORE9XX01JTl9VTkRFUVVFVUVEX0JVRkZFUlMsCisgICAgICAgICAgICAgICAgICAgICZtYXhDb25zdW1lckJ1ZmZlcnMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBxdWVyeSBjb25zdW1lciB1bmRlcXVldWVkIgorICAgICAgICAgICAgICAgICIgYnVmZmVyIGNvdW50IGZvciBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sIG1CbG9iU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICgocmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyX2NvdW50KAorICAgICAgICAgICAgICAgICAgICBhbndDb25zdW1lciwgbWF4UHJvZHVjZXJCdWZmZXJzICsgbWF4Q29uc3VtZXJCdWZmZXJzKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gc2V0IGJ1ZmZlciBjb3VudCBmb3Igc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLCBtQmxvYlN0cmVhbUlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBydW4oIkRlcHRoQ29tcG9zaXRlU3RyZWFtUHJvYyIpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6ZGVsZXRlSW50ZXJuYWxTdHJlYW1zKCkgeworICAgIC8vIFRoZSAnQ2FtZXJhRGV2aWNlQ2xpZW50JyBwYXJlbnQgd2lsbCBkZWxldGUgdGhlIGJsb2Igc3RyZWFtCisgICAgcmVxdWVzdEV4aXQoKTsKKworICAgIGF1dG8gcmV0ID0gam9pbigpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gam9pbiB3aXRoIHRoZSBtYWluIHByb2Nlc3NpbmcgdGhyZWFkOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXQpLCByZXQpOworICAgIH0KKworICAgIHNwPENhbWVyYURldmljZUJhc2U+IGRldmljZSA9IG1EZXZpY2UucHJvbW90ZSgpOworICAgIGlmICghZGV2aWNlLmdldCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgZGV2aWNlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGlmIChtRGVwdGhTdHJlYW1JZCA+PSAwKSB7CisgICAgICAgIHJldCA9IGRldmljZS0+ZGVsZXRlU3RyZWFtKG1EZXB0aFN0cmVhbUlkKTsKKyAgICAgICAgbURlcHRoU3RyZWFtSWQgPSAtMTsKKyAgICB9CisKKyAgICBpZiAobU91dHB1dFN1cmZhY2UgIT0gbnVsbHB0cikgeworICAgICAgICBtT3V0cHV0U3VyZmFjZS0+ZGlzY29ubmVjdChOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEpOworICAgICAgICBtT3V0cHV0U3VyZmFjZS5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3ZvaWQgRGVwdGhDb21wb3NpdGVTdHJlYW06Om9uRnJhbWVBdmFpbGFibGUoY29uc3QgQnVmZmVySXRlbSYgaXRlbSkgeworICAgIGlmIChpdGVtLm1EYXRhU3BhY2UgPT0ga0pwZWdEYXRhU3BhY2UpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBKcGVnIGJ1ZmZlciB3aXRoIHRzOiAlIiBQUkl1NjQgIiBtcy4gYXJyaXZlZCEiLAorICAgICAgICAgICAgICAgIF9fZnVuY19fLCBuczJtcyhpdGVtLm1UaW1lc3RhbXApKTsKKworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgICAgICBpZiAoIW1FcnJvclN0YXRlKSB7CisgICAgICAgICAgICBtSW5wdXRKcGVnQnVmZmVycy5wdXNoX2JhY2soaXRlbS5tVGltZXN0YW1wKTsKKyAgICAgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpdGVtLm1EYXRhU3BhY2UgPT0ga0RlcHRoTWFwRGF0YVNwYWNlKSB7CisgICAgICAgIEFMT0dWKCIlczogRGVwdGggYnVmZmVyIHdpdGggdHM6ICUiIFBSSXU2NCAiIG1zLiBhcnJpdmVkISIsIF9fZnVuY19fLAorICAgICAgICAgICAgICAgIG5zMm1zKGl0ZW0ubVRpbWVzdGFtcCkpOworCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgICAgIGlmICghbUVycm9yU3RhdGUpIHsKKyAgICAgICAgICAgIG1JbnB1dERlcHRoQnVmZmVycy5wdXNoX2JhY2soaXRlbS5tVGltZXN0YW1wKTsKKyAgICAgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGRhdGEgc3BhY2U6IDB4JXgiLCBfX0ZVTkNUSU9OX18sIGl0ZW0ubURhdGFTcGFjZSk7CisgICAgfQorfQorCitzdGF0dXNfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6aW5zZXJ0R2JwKFN1cmZhY2VNYXAqIC8qb3V0Ki9vdXRTdXJmYWNlTWFwLAorICAgICAgICBWZWN0b3I8aW50MzJfdD4gKiAvKm91dCovb3V0cHV0U3RyZWFtSWRzLCBpbnQzMl90KiAvKm91dCovY3VycmVudFN0cmVhbUlkKSB7CisgICAgaWYgKG91dFN1cmZhY2VNYXAtPmZpbmQobURlcHRoU3RyZWFtSWQpID09IG91dFN1cmZhY2VNYXAtPmVuZCgpKSB7CisgICAgICAgICgqb3V0U3VyZmFjZU1hcClbbURlcHRoU3RyZWFtSWRdID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpOworICAgICAgICBvdXRwdXRTdHJlYW1JZHMtPnB1c2hfYmFjayhtRGVwdGhTdHJlYW1JZCk7CisgICAgfQorICAgICgqb3V0U3VyZmFjZU1hcClbbURlcHRoU3RyZWFtSWRdLnB1c2hfYmFjayhtRGVwdGhTdXJmYWNlSWQpOworCisgICAgaWYgKG91dFN1cmZhY2VNYXAtPmZpbmQobUJsb2JTdHJlYW1JZCkgPT0gb3V0U3VyZmFjZU1hcC0+ZW5kKCkpIHsKKyAgICAgICAgKCpvdXRTdXJmYWNlTWFwKVttQmxvYlN0cmVhbUlkXSA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtSWRzLT5wdXNoX2JhY2sobUJsb2JTdHJlYW1JZCk7CisgICAgfQorICAgICgqb3V0U3VyZmFjZU1hcClbbUJsb2JTdHJlYW1JZF0ucHVzaF9iYWNrKG1CbG9iU3VyZmFjZUlkKTsKKworICAgIGlmIChjdXJyZW50U3RyZWFtSWQgIT0gbnVsbHB0cikgeworICAgICAgICAqY3VycmVudFN0cmVhbUlkID0gbUJsb2JTdHJlYW1JZDsKKyAgICB9CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3ZvaWQgRGVwdGhDb21wb3NpdGVTdHJlYW06Om9uUmVzdWx0RXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSB7CisgICAgLy8gUHJvY2Vzc2luZyBjYW4gY29udGludWUgZXZlbiBpbiBjYXNlIG9mIHJlc3VsdCBlcnJvcnMuCisgICAgLy8gQXQgdGhlIG1vbWVudCBkZXB0aCBjb21wb3NpdGUgc3RyZWFtIHByb2Nlc3NpbmcgcmVsaWVzIG1haW5seSBvbiBzdGF0aWMgY2FtZXJhCisgICAgLy8gY2hhcmFjdGVyaXN0aWNzIGRhdGEuIFRoZSBhY3R1YWwgcmVzdWx0IGRhdGEgY2FuIGJlIHVzZWQgZm9yIHRoZSBqcGVnIHF1YWxpdHkgYnV0CisgICAgLy8gaW4gY2FzZSBpdCBpcyBhYnNlbnQgd2UgY2FuIGRlZmF1bHQgdG8gbWF4aW11bS4KKyAgICBlcmFzZVJlc3VsdChyZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworfQorCitib29sIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpvblN0cmVhbUJ1ZmZlckVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIGJvb2wgcmV0ID0gZmFsc2U7CisgICAgLy8gQnVmZmVyIGVycm9ycyBjb25jZXJuaW5nIGludGVybmFsIGNvbXBvc2l0ZSBzdHJlYW1zIHNob3VsZCBub3QgYmUgZGlyZWN0bHkgdmlzaWJsZSB0bworICAgIC8vIGNhbWVyYSBjbGllbnRzLiBUaGV5IG11c3Qgb25seSByZWNlaXZlIGEgc2luZ2xlIGJ1ZmZlciBlcnJvciB3aXRoIHRoZSBwdWJsaWMgY29tcG9zaXRlCisgICAgLy8gc3RyZWFtIGlkLgorICAgIGlmICgocmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQgPT0gbURlcHRoU3RyZWFtSWQpIHx8CisgICAgICAgICAgICAocmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQgPT0gbUJsb2JTdHJlYW1JZCkpIHsKKyAgICAgICAgZmxhZ0FuRXJyb3JGcmFtZU51bWJlcihyZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworICAgICAgICByZXQgPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IERlcHRoQ29tcG9zaXRlU3RyZWFtOjpnZXRNYXRjaGluZ0RlcHRoU2l6ZShzaXplX3Qgd2lkdGgsIHNpemVfdCBoZWlnaHQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgc3VwcG9yZWREZXB0aFNpemVzLAorICAgICAgICBzaXplX3QgKmRlcHRoV2lkdGggLypvdXQqLywgc2l6ZV90ICpkZXB0aEhlaWdodCAvKm91dCovKSB7CisgICAgaWYgKChkZXB0aFdpZHRoID09IG51bGxwdHIpIHx8IChkZXB0aEhlaWdodCA9PSBudWxscHRyKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGZsb2F0IGFyVG9sID0gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjprRGVwdGhBUlRvbGVyYW5jZTsKKyAgICAqZGVwdGhXaWR0aCA9ICpkZXB0aEhlaWdodCA9IDA7CisKKyAgICBmbG9hdCBhc3BlY3RSYXRpbyA9IHN0YXRpY19jYXN0PGZsb2F0PiAod2lkdGgpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+IChoZWlnaHQpOworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBzdXBwb3JlZERlcHRoU2l6ZXMpIHsKKyAgICAgICAgYXV0byBjdXJyZW50V2lkdGggPSBzdGQ6OmdldDwwPihpdCk7CisgICAgICAgIGF1dG8gY3VycmVudEhlaWdodCA9IHN0ZDo6Z2V0PDE+KGl0KTsKKyAgICAgICAgaWYgKChjdXJyZW50V2lkdGggPT0gd2lkdGgpICYmIChjdXJyZW50SGVpZ2h0ID09IGhlaWdodCkpIHsKKyAgICAgICAgICAgICpkZXB0aFdpZHRoID0gd2lkdGg7CisgICAgICAgICAgICAqZGVwdGhIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGZsb2F0IGN1cnJlbnRSYXRpbyA9IHN0YXRpY19jYXN0PGZsb2F0PiAoY3VycmVudFdpZHRoKSAvCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PiAoY3VycmVudEhlaWdodCk7CisgICAgICAgICAgICBhdXRvIGN1cnJlbnRTaXplID0gY3VycmVudFdpZHRoICogY3VycmVudEhlaWdodDsKKyAgICAgICAgICAgIGF1dG8gb2xkU2l6ZSA9ICgqZGVwdGhXaWR0aCkgKiAoKmRlcHRoSGVpZ2h0KTsKKyAgICAgICAgICAgIGlmICgoZmFicyhhc3BlY3RSYXRpbyAtIGN1cnJlbnRSYXRpbykgPD0gYXJUb2wpICYmIChjdXJyZW50U2l6ZSA+IG9sZFNpemUpKSB7CisgICAgICAgICAgICAgICAgKmRlcHRoV2lkdGggPSBjdXJyZW50V2lkdGg7CisgICAgICAgICAgICAgICAgKmRlcHRoSGVpZ2h0ID0gY3VycmVudEhlaWdodDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoKCpkZXB0aFdpZHRoID4gMCkgJiYgKCpkZXB0aEhlaWdodCA+IDApKSA/IE9LIDogQkFEX1ZBTFVFOworfQorCit2b2lkIERlcHRoQ29tcG9zaXRlU3RyZWFtOjpnZXRTdXBwb3J0ZWREZXB0aFNpemVzKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+KiBkZXB0aFNpemVzIC8qb3V0Ki8pIHsKKyAgICBpZiAoZGVwdGhTaXplcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGVudHJ5ID0gY2guZmluZChBTkRST0lEX0RFUFRIX0FWQUlMQUJMRV9ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgLy8gRGVwdGggc3RyZWFtIGRpbWVuc2lvbnMgaGF2ZSBmb3VyIGludDMyX3QgY29tcG9uZW50cworICAgICAgICAvLyAocGl4ZWxmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIHR5cGUpCisgICAgICAgIHNpemVfdCBlbnRyeUNvdW50ID0gZW50cnkuY291bnQgLyA0OworICAgICAgICBkZXB0aFNpemVzLT5yZXNlcnZlKGVudHJ5Q291bnQpOworICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGVudHJ5LmNvdW50OyBpICs9IDQpIHsKKyAgICAgICAgICAgIGlmICgoZW50cnkuZGF0YS5pMzJbaV0gPT0ga0RlcHRoTWFwUGl4ZWxGb3JtYXQpICYmCisgICAgICAgICAgICAgICAgICAgIChlbnRyeS5kYXRhLmkzMltpKzNdID09CisgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TX09VVFBVVCkpIHsKKyAgICAgICAgICAgICAgICBkZXB0aFNpemVzLT5wdXNoX2JhY2soc3RkOjptYWtlX3R1cGxlKGVudHJ5LmRhdGEuaTMyW2krMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkuZGF0YS5pMzJbaSsyXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCitzdGF0dXNfdCBEZXB0aENvbXBvc2l0ZVN0cmVhbTo6Z2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiogY29tcG9zaXRlT3V0cHV0IC8qb3V0Ki8pIHsKKyAgICBpZiAoY29tcG9zaXRlT3V0cHV0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gZGVwdGhTaXplczsKKyAgICBnZXRTdXBwb3J0ZWREZXB0aFNpemVzKGNoLCAmZGVwdGhTaXplcyk7CisgICAgaWYgKGRlcHRoU2l6ZXMuZW1wdHkoKSkgeworICAgICAgICBBTE9HRSgiJXM6IE5vIGRlcHRoIHN0cmVhbSBjb25maWd1cmF0aW9ucyBwcmVzZW50IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzaXplX3QgZGVwdGhXaWR0aCwgZGVwdGhIZWlnaHQ7CisgICAgYXV0byByZXQgPSBnZXRNYXRjaGluZ0RlcHRoU2l6ZShzdHJlYW1JbmZvLndpZHRoLCBzdHJlYW1JbmZvLmhlaWdodCwgZGVwdGhTaXplcywgJmRlcHRoV2lkdGgsCisgICAgICAgICAgICAmZGVwdGhIZWlnaHQpOworICAgIGlmIChyZXQgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBObyBtYXRjaGluZyBkZXB0aCBzdHJlYW0gc2l6ZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCisgICAgY29tcG9zaXRlT3V0cHV0LT5jbGVhcigpOworICAgIGNvbXBvc2l0ZU91dHB1dC0+aW5zZXJ0KGNvbXBvc2l0ZU91dHB1dC0+ZW5kKCksIDIsIHN0cmVhbUluZm8pOworCisgICAgLy8gSnBlZy9CbG9iIHN0cmVhbSBpbmZvCisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzBdLmRhdGFTcGFjZSA9IGtKcGVnRGF0YVNwYWNlOworICAgICgqY29tcG9zaXRlT3V0cHV0KVswXS5jb25zdW1lclVzYWdlID0gR1JBTExPQ19VU0FHRV9TV19SRUFEX09GVEVOOworCisgICAgLy8gRGVwdGggc3RyZWFtIGluZm8KKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0ud2lkdGggPSBkZXB0aFdpZHRoOworICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS5oZWlnaHQgPSBkZXB0aEhlaWdodDsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uZm9ybWF0ID0ga0RlcHRoTWFwUGl4ZWxGb3JtYXQ7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLmRhdGFTcGFjZSA9IGtEZXB0aE1hcERhdGFTcGFjZTsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uY29uc3VtZXJVc2FnZSA9IEdSQUxMT0NfVVNBR0VfU1dfUkVBRF9PRlRFTjsKKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKworfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0RlcHRoQ29tcG9zaXRlU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhhNzgyNgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvRGVwdGhDb21wb3NpdGVTdHJlYW0uaApAQCAtMCwwICsxLDE0NSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0RFUFRIX0NPTVBPU0lURV9TVFJFQU1fSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQTNfREVQVEhfQ09NUE9TSVRFX1NUUkVBTV9ICisKKyNpbmNsdWRlICJjb21tb24vRGVwdGhQaG90b1Byb2Nlc3Nvci5oIgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvaW1hZ2luZ19tb2RlbC5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvZGVwdGhfbWFwLmg+CisKKyNpbmNsdWRlIDxndWkvQ3B1Q29uc3VtZXIuaD4KKworI2luY2x1ZGUgIkNvbXBvc2l0ZVN0cmVhbS5oIgorCit1c2luZyBkeW5hbWljX2RlcHRoOjpEZXB0aE1hcDsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6Okl0ZW07Cit1c2luZyBkeW5hbWljX2RlcHRoOjpJbWFnaW5nTW9kZWw7CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworY2xhc3MgQ2FtZXJhRGV2aWNlQ2xpZW50OworY2xhc3MgQ2FtZXJhTWV0YWRhdGE7CitjbGFzcyBTdXJmYWNlOworCituYW1lc3BhY2UgY2FtZXJhMyB7CisKK2NsYXNzIERlcHRoQ29tcG9zaXRlU3RyZWFtIDogcHVibGljIENvbXBvc2l0ZVN0cmVhbSwgcHVibGljIFRocmVhZCwKKyAgICAgICAgcHVibGljIENwdUNvbnN1bWVyOjpGcmFtZUF2YWlsYWJsZUxpc3RlbmVyIHsKKworcHVibGljOgorICAgIERlcHRoQ29tcG9zaXRlU3RyZWFtKHdwPENhbWVyYURldmljZUJhc2U+IGRldmljZSwKKyAgICAgICAgICAgIHdwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYik7CisgICAgfkRlcHRoQ29tcG9zaXRlU3RyZWFtKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0aWMgYm9vbCBpc0RlcHRoQ29tcG9zaXRlU3RyZWFtKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKKworICAgIC8vIENvbXBvc2l0ZVN0cmVhbSBvdmVycmlkZXMKKyAgICBzdGF0dXNfdCBjcmVhdGVJbnRlcm5hbFN0cmVhbXMoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCisgICAgICAgICAgICBib29sIGhhc0RlZmVycmVkQ29uc3VtZXIsIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAqc3VyZmFjZUlkcywgaW50IHN0cmVhbVNldElkLCBib29sIGlzU2hhcmVkKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBkZWxldGVJbnRlcm5hbFN0cmVhbXMoKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBjb25maWd1cmVTdHJlYW0oKSBvdmVycmlkZTsKKyAgICBzdGF0dXNfdCBpbnNlcnRHYnAoU3VyZmFjZU1hcCogLypvdXQqL291dFN1cmZhY2VNYXAsIFZlY3RvcjxpbnQzMl90PiogLypvdXQqL291dHB1dFN0cmVhbUlkcywKKyAgICAgICAgICAgIGludDMyX3QqIC8qb3V0Ki9jdXJyZW50U3RyZWFtSWQpIG92ZXJyaWRlOworICAgIGludCBnZXRTdHJlYW1JZCgpIG92ZXJyaWRlIHsgcmV0dXJuIG1CbG9iU3RyZWFtSWQ7IH0KKworICAgIC8vIENwdUNvbnN1bWVyIGxpc3RlbmVyIGltcGxlbWVudGF0aW9uCisgICAgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIG92ZXJyaWRlOworCisgICAgLy8gUmV0dXJuIHN0cmVhbSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJuYWwgY2FtZXJhIHN0cmVhbXMKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiogY29tcG9zaXRlT3V0cHV0IC8qb3V0Ki8pOworCitwcm90ZWN0ZWQ6CisKKyAgICBib29sIHRocmVhZExvb3AoKSBvdmVycmlkZTsKKyAgICBib29sIG9uU3RyZWFtQnVmZmVyRXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSBvdmVycmlkZTsKKyAgICB2b2lkIG9uUmVzdWx0RXJyb3IoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgSW5wdXRGcmFtZSB7CisgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgZGVwdGhCdWZmZXI7CisgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIganBlZ0J1ZmZlcjsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgICAgICAgICAgICByZXN1bHQ7CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgZXJyb3I7CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOb3RpZmllZDsKKyAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcjsKKworICAgICAgICBJbnB1dEZyYW1lKCkgOiBlcnJvcihmYWxzZSksIGVycm9yTm90aWZpZWQoZmFsc2UpLCBmcmFtZU51bWJlcigtMSkgeyB9CisgICAgfTsKKworICAgIC8vIEhlbHBlciBtZXRob2RzCisgICAgc3RhdGljIHZvaWQgZ2V0U3VwcG9ydGVkRGVwdGhTaXplcyhjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4qIGRlcHRoU2l6ZXMgLypvdXQqLyk7CisgICAgc3RhdGljIHN0YXR1c190IGdldE1hdGNoaW5nRGVwdGhTaXplKHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgc3VwcG9yZWREZXB0aFNpemVzLAorICAgICAgICAgICAgc2l6ZV90ICpkZXB0aFdpZHRoIC8qb3V0Ki8sIHNpemVfdCAqZGVwdGhIZWlnaHQgLypvdXQqLyk7CisKKyAgICAvLyBEeW5hbWljIGRlcHRoIHByb2Nlc3NpbmcKKyAgICBzdGF0dXNfdCBlbmNvZGVHcmF5c2NhbGVKcGVnKHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCwgdWludDhfdCAqaW4sIHZvaWQgKm91dCwKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBtYXhPdXRTaXplLCB1aW50OF90IGpwZWdRdWFsaXR5LCBzaXplX3QgJmFjdHVhbFNpemUpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxEZXB0aE1hcD4gcHJvY2Vzc0RlcHRoTWFwRnJhbWUoY29uc3QgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciAmZGVwdGhNYXBCdWZmZXIsCisgICAgICAgICAgICBzaXplX3QgbWF4SnBlZ1NpemUsIHVpbnQ4X3QganBlZ1F1YWxpdHksCisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8SXRlbT4+KiBpdGVtcyAvKm91dCovKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW1hZ2luZ01vZGVsPiBnZXRJbWFnaW5nTW9kZWwoKTsKKyAgICBzdGF0dXNfdCBwcm9jZXNzSW5wdXRGcmFtZShuc2Vjc190IHRzLCBjb25zdCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKTsKKworICAgIC8vIEJ1ZmZlci9SZXN1bHRzIGhhbmRsaW5nCisgICAgdm9pZCBjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCk7CisgICAgdm9pZCByZWxlYXNlSW5wdXRGcmFtZUxvY2tlZChJbnB1dEZyYW1lICppbnB1dEZyYW1lIC8qb3V0Ki8pOworICAgIHZvaWQgcmVsZWFzZUlucHV0RnJhbWVzTG9ja2VkKGludDY0X3QgY3VycmVudFRzKTsKKworICAgIC8vIEZpbmQgZmlyc3QgY29tcGxldGUgYW5kIHZhbGlkIGZyYW1lIHdpdGggc21hbGxlc3QgdGltZXN0YW1wCisgICAgYm9vbCBnZXROZXh0UmVhZHlJbnB1dExvY2tlZChpbnQ2NF90ICpjdXJyZW50VHMgLyppbm91dCovKTsKKworICAgIC8vIEZpbmQgbmV4dCBmYWlsaW5nIGZyYW1lIG51bWJlciB3aXRoIHNtYWxsZXN0IHRpbWVzdGFtcCBhbmQgcmV0dXJuIHJlc3BlY3RpdmUgZnJhbWUgbnVtYmVyCisgICAgaW50NjRfdCBnZXROZXh0RmFpbGluZ0lucHV0TG9ja2VkKGludDY0X3QgKmN1cnJlbnRUcyAvKmlub3V0Ki8pOworCisgICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga1dhaXREdXJhdGlvbiA9IDEwMDAwMDAwOyAvLyAxMCBtcworICAgIHN0YXRpYyBjb25zdCBhdXRvIGtEZXB0aE1hcFBpeGVsRm9ybWF0ID0gSEFMX1BJWEVMX0ZPUk1BVF9ZMTY7CisgICAgc3RhdGljIGNvbnN0IGF1dG8ga0RlcHRoTWFwRGF0YVNwYWNlID0gSEFMX0RBVEFTUEFDRV9ERVBUSDsKKyAgICBzdGF0aWMgY29uc3QgYXV0byBrSnBlZ0RhdGFTcGFjZSA9IEhBTF9EQVRBU1BBQ0VfVjBfSkZJRjsKKworICAgIGludCAgICAgICAgICAgICAgICAgIG1CbG9iU3RyZWFtSWQsIG1CbG9iU3VyZmFjZUlkLCBtRGVwdGhTdHJlYW1JZCwgbURlcHRoU3VyZmFjZUlkOworICAgIHNpemVfdCAgICAgICAgICAgICAgIG1CbG9iV2lkdGgsIG1CbG9iSGVpZ2h0OworICAgIHNwPENwdUNvbnN1bWVyPiAgICAgIG1CbG9iQ29uc3VtZXIsIG1EZXB0aENvbnN1bWVyOworICAgIGJvb2wgICAgICAgICAgICAgICAgIG1EZXB0aEJ1ZmZlckFjcXVpcmVkLCBtQmxvYkJ1ZmZlckFjcXVpcmVkOworICAgIHNwPFN1cmZhY2U+ICAgICAgICAgIG1EZXB0aFN1cmZhY2UsIG1CbG9iU3VyZmFjZSwgbU91dHB1dFN1cmZhY2U7CisgICAgc3A8UHJvZHVjZXJMaXN0ZW5lcj4gbVByb2R1Y2VyTGlzdGVuZXI7CisKKyAgICBzc2l6ZV90ICAgICAgICAgICAgICBtTWF4SnBlZ1NpemU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+IG1TdXBwb3J0ZWREZXB0aFNpemVzOworICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAgIG1JbnRyaW5zaWNDYWxpYnJhdGlvbiwgbUxlbnNEaXN0b3J0aW9uOworICAgIGJvb2wgICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmE7CisgICAgdm9pZCogICAgICAgICAgICAgICAgbURlcHRoUGhvdG9MaWJIYW5kbGU7CisgICAgcHJvY2Vzc19kZXB0aF9waG90b19mcmFtZSBtRGVwdGhQaG90b1Byb2Nlc3M7CisKKyAgICAvLyBLZWVwIGFsbCBpbmNvbWluZyBEZXB0aCBidWZmZXIgdGltZXN0YW1wcyBwZW5kaW5nIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBtSW5wdXREZXB0aEJ1ZmZlcnM7CisKKyAgICAvLyBLZWVwIGFsbCBpbmNvbWluZyBKcGVnL0Jsb2IgYnVmZmVyIHRpbWVzdGFtcHMgcGVuZGluZyBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gbUlucHV0SnBlZ0J1ZmZlcnM7CisKKyAgICAvLyBNYXAgb2YgYWxsIGlucHV0IGZyYW1lcyBwZW5kaW5nIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50NjRfdCwgSW5wdXRGcmFtZT4gbVBlbmRpbmdJbnB1dEZyYW1lczsKK307CisKK307IC8vbmFtZXNwYWNlIGNhbWVyYTMKK307IC8vbmFtZXNwYWNlIGFuZHJvaWQKKworI2VuZGlmCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzkwZTMyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmNwcApAQCAtMCwwICsxLDE3NjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYTMtSGVpY0NvbXBvc2l0ZVN0cmVhbSIKKyNkZWZpbmUgQVRSQUNFX1RBRyBBVFJBQ0VfVEFHX0NBTUVSQQorLy8jZGVmaW5lIExPR19OREVCVUcgMAorCisjaW5jbHVkZSA8bGludXgvbWVtZmQuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKworI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjUvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaWJ5dXYuaD4KKyNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHV0aWxzL1RyYWNlLmg+CisKKyNpbmNsdWRlIDxtZWRpYWRybS9JQ3J5cHRvLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUJ1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vTWVkaWFEZWZzLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFDb2RlY0NvbnN0YW50cy5oPgorCisjaW5jbHVkZSAiY29tbW9uL0NhbWVyYURldmljZUJhc2UuaCIKKyNpbmNsdWRlICJ1dGlscy9FeGlmVXRpbHMuaCIKKyNpbmNsdWRlICJIZWljRW5jb2RlckluZm9NYW5hZ2VyLmgiCisjaW5jbHVkZSAiSGVpY0NvbXBvc2l0ZVN0cmVhbS5oIgorCit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkNhbWVyYUJsb2I7Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkNhbWVyYUJsb2JJZDsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCitIZWljQ29tcG9zaXRlU3RyZWFtOjpIZWljQ29tcG9zaXRlU3RyZWFtKHdwPENhbWVyYURldmljZUJhc2U+IGRldmljZSwKKyAgICAgICAgd3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M+IGNiKSA6CisgICAgICAgIENvbXBvc2l0ZVN0cmVhbShkZXZpY2UsIGNiKSwKKyAgICAgICAgbVVzZUhlaWMoZmFsc2UpLAorICAgICAgICBtTnVtT3V0cHV0VGlsZXMoMSksCisgICAgICAgIG1PdXRwdXRXaWR0aCgwKSwKKyAgICAgICAgbU91dHB1dEhlaWdodCgwKSwKKyAgICAgICAgbU1heEhlaWNCdWZmZXJTaXplKDApLAorICAgICAgICBtR3JpZFdpZHRoKEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmtHcmlkV2lkdGgpLAorICAgICAgICBtR3JpZEhlaWdodChIZWljRW5jb2RlckluZm9NYW5hZ2VyOjprR3JpZEhlaWdodCksCisgICAgICAgIG1HcmlkUm93cygxKSwKKyAgICAgICAgbUdyaWRDb2xzKDEpLAorICAgICAgICBtVXNlR3JpZChmYWxzZSksCisgICAgICAgIG1BcHBTZWdtZW50U3RyZWFtSWQoLTEpLAorICAgICAgICBtQXBwU2VnbWVudFN1cmZhY2VJZCgtMSksCisgICAgICAgIG1NYWluSW1hZ2VTdHJlYW1JZCgtMSksCisgICAgICAgIG1NYWluSW1hZ2VTdXJmYWNlSWQoLTEpLAorICAgICAgICBtWXV2QnVmZmVyQWNxdWlyZWQoZmFsc2UpLAorICAgICAgICBtUHJvZHVjZXJMaXN0ZW5lcihuZXcgUHJvZHVjZXJMaXN0ZW5lcigpKSwKKyAgICAgICAgbURlcXVldWVkT3V0cHV0QnVmZmVyQ250KDApLAorICAgICAgICBtTG9ja2VkQXBwU2VnbWVudEJ1ZmZlckNudCgwKSwKKyAgICAgICAgbUNvZGVjT3V0cHV0Q291bnRlcigwKSwKKyAgICAgICAgbUdyaWRUaW1lc3RhbXBVcygwKSB7Cit9CisKK0hlaWNDb21wb3NpdGVTdHJlYW06On5IZWljQ29tcG9zaXRlU3RyZWFtKCkgeworICAgIC8vIENhbGwgZGVpbml0Q29kZWMgaW4gY2FzZSBzdHJlYW0gaGFzbid0IGJlZW4gZGVsZXRlZCB5ZXQgdG8gYXZvaWQgYW55CisgICAgLy8gbWVtb3J5L3Jlc291cmNlIGxlYWsuCisgICAgZGVpbml0Q29kZWMoKTsKKworICAgIG1JbnB1dEFwcFNlZ21lbnRCdWZmZXJzLmNsZWFyKCk7CisgICAgbUNvZGVjT3V0cHV0QnVmZmVycy5jbGVhcigpOworCisgICAgbUFwcFNlZ21lbnRTdHJlYW1JZCA9IC0xOworICAgIG1BcHBTZWdtZW50U3VyZmFjZUlkID0gLTE7CisgICAgbUFwcFNlZ21lbnRDb25zdW1lci5jbGVhcigpOworICAgIG1BcHBTZWdtZW50U3VyZmFjZS5jbGVhcigpOworCisgICAgbU1haW5JbWFnZVN0cmVhbUlkID0gLTE7CisgICAgbU1haW5JbWFnZVN1cmZhY2VJZCA9IC0xOworICAgIG1NYWluSW1hZ2VDb25zdW1lci5jbGVhcigpOworICAgIG1NYWluSW1hZ2VTdXJmYWNlLmNsZWFyKCk7Cit9CisKK2Jvb2wgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6aXNIZWljQ29tcG9zaXRlU3RyZWFtKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKSB7CisgICAgQU5hdGl2ZVdpbmRvdyAqYW53ID0gc3VyZmFjZS5nZXQoKTsKKyAgICBzdGF0dXNfdCBlcnI7CisgICAgaW50IGZvcm1hdDsKKyAgICBpZiAoKGVyciA9IGFudy0+cXVlcnkoYW53LCBOQVRJVkVfV0lORE9XX0ZPUk1BVCwgJmZvcm1hdCkpICE9IE9LKSB7CisgICAgICAgIFN0cmluZzggbXNnID0gU3RyaW5nODo6Zm9ybWF0KCJGYWlsZWQgdG8gcXVlcnkgU3VyZmFjZSBmb3JtYXQ6ICVzICglZCkiLCBzdHJlcnJvcigtZXJyKSwKKyAgICAgICAgICAgICAgICBlcnIpOworICAgICAgICBBTE9HRSgiJXM6ICVzIiwgX19GVU5DVElPTl9fLCBtc2cuc3RyaW5nKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaW50IGRhdGFzcGFjZTsKKyAgICBpZiAoKGVyciA9IGFudy0+cXVlcnkoYW53LCBOQVRJVkVfV0lORE9XX0RFRkFVTFRfREFUQVNQQUNFLCAmZGF0YXNwYWNlKSkgIT0gT0spIHsKKyAgICAgICAgU3RyaW5nOCBtc2cgPSBTdHJpbmc4Ojpmb3JtYXQoIkZhaWxlZCB0byBxdWVyeSBTdXJmYWNlIGRhdGFzcGFjZTogJXMgKCVkKSIsIHN0cmVycm9yKC1lcnIpLAorICAgICAgICAgICAgICAgIGVycik7CisgICAgICAgIEFMT0dFKCIlczogJXMiLCBfX0ZVTkNUSU9OX18sIG1zZy5zdHJpbmcoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gKChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9CTE9CKSAmJiAoZGF0YXNwYWNlID09IEhBTF9EQVRBU1BBQ0VfSEVJRikpOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpjcmVhdGVJbnRlcm5hbFN0cmVhbXMoY29uc3Qgc3RkOjp2ZWN0b3I8c3A8U3VyZmFjZT4+JiBjb25zdW1lcnMsCisgICAgICAgIGJvb2wgLypoYXNEZWZlcnJlZENvbnN1bWVyKi8sIHVpbnQzMl90IHdpZHRoLCB1aW50MzJfdCBoZWlnaHQsIGludCBmb3JtYXQsCisgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sIGludCAqaWQsIGNvbnN0IFN0cmluZzgmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsIGludCAvKnN0cmVhbVNldElkKi8sIGJvb2wgLyppc1NoYXJlZCovKSB7CisKKyAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICBpZiAoIWRldmljZS5nZXQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgY2FtZXJhIGRldmljZSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzdGF0dXNfdCByZXMgPSBpbml0aWFsaXplQ29kZWMod2lkdGgsIGhlaWdodCwgZGV2aWNlKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGluaXRpYWxpemUgSEVJQy9IRVZDIGNvZGVjOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBzcDxJR3JhcGhpY0J1ZmZlclByb2R1Y2VyPiBwcm9kdWNlcjsKKyAgICBzcDxJR3JhcGhpY0J1ZmZlckNvbnN1bWVyPiBjb25zdW1lcjsKKyAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgIG1BcHBTZWdtZW50Q29uc3VtZXIgPSBuZXcgQ3B1Q29uc3VtZXIoY29uc3VtZXIsIGtNYXhBY3F1aXJlZEFwcFNlZ21lbnQpOworICAgIG1BcHBTZWdtZW50Q29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CisgICAgbUFwcFNlZ21lbnRDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEzLUhlaWNDb21wb3NpdGUtQXBwU2VnbWVudFN0cmVhbSIpKTsKKyAgICBtQXBwU2VnbWVudFN1cmZhY2UgPSBuZXcgU3VyZmFjZShwcm9kdWNlcik7CisKKyAgICBtU3RhdGljSW5mbyA9IGRldmljZS0+aW5mbygpOworCisgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obUFwcFNlZ21lbnRTdXJmYWNlLCBtQXBwU2VnbWVudE1heFNpemUsIDEsIGZvcm1hdCwKKyAgICAgICAgICAgIGtBcHBTZWdtZW50RGF0YVNwYWNlLCByb3RhdGlvbiwgJm1BcHBTZWdtZW50U3RyZWFtSWQsIHBoeXNpY2FsQ2FtZXJhSWQsIHN1cmZhY2VJZHMpOworICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgbUFwcFNlZ21lbnRTdXJmYWNlSWQgPSAoKnN1cmZhY2VJZHMpWzBdOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBKUEVHIEFwcCBzZWdtZW50IHN0cmVhbTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpZiAoIW1Vc2VHcmlkKSB7CisgICAgICAgIHJlcyA9IG1Db2RlYy0+Y3JlYXRlSW5wdXRTdXJmYWNlKCZwcm9kdWNlcik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBpbnB1dCBzdXJmYWNlIGZvciBIZWljIGNvZGVjOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBCdWZmZXJRdWV1ZTo6Y3JlYXRlQnVmZmVyUXVldWUoJnByb2R1Y2VyLCAmY29uc3VtZXIpOworICAgICAgICBtTWFpbkltYWdlQ29uc3VtZXIgPSBuZXcgQ3B1Q29uc3VtZXIoY29uc3VtZXIsIDEpOworICAgICAgICBtTWFpbkltYWdlQ29uc3VtZXItPnNldEZyYW1lQXZhaWxhYmxlTGlzdGVuZXIodGhpcyk7CisgICAgICAgIG1NYWluSW1hZ2VDb25zdW1lci0+c2V0TmFtZShTdHJpbmc4KCJDYW1lcmEzLUhlaWNDb21wb3NpdGUtSGV2Y0lucHV0WVVWU3RyZWFtIikpOworICAgIH0KKyAgICBtTWFpbkltYWdlU3VyZmFjZSA9IG5ldyBTdXJmYWNlKHByb2R1Y2VyKTsKKworICAgIHJlcyA9IG1Db2RlYy0+c3RhcnQoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHN0YXJ0IGNvZGVjOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGludD4gc291cmNlU3VyZmFjZUlkOworICAgIC8vVXNlIFlVVl84ODggZm9ybWF0IGlmIGZyYW1ld29yayB0aWxpbmcgaXMgbmVlZGVkLgorICAgIGludCBzcmNTdHJlYW1GbXQgPSBtVXNlR3JpZCA/IEhBTF9QSVhFTF9GT1JNQVRfWUNiQ3JfNDIwXzg4OCA6CisgICAgICAgICAgICBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQ7CisgICAgcmVzID0gZGV2aWNlLT5jcmVhdGVTdHJlYW0obU1haW5JbWFnZVN1cmZhY2UsIHdpZHRoLCBoZWlnaHQsIHNyY1N0cmVhbUZtdCwga0hlaWZEYXRhU3BhY2UsCisgICAgICAgICAgICByb3RhdGlvbiwgaWQsIHBoeXNpY2FsQ2FtZXJhSWQsICZzb3VyY2VTdXJmYWNlSWQpOworICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgbU1haW5JbWFnZVN1cmZhY2VJZCA9IHNvdXJjZVN1cmZhY2VJZFswXTsKKyAgICAgICAgbU1haW5JbWFnZVN0cmVhbUlkID0gKmlkOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBtYWluIGltYWdlIHN0cmVhbTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBtT3V0cHV0U3VyZmFjZSA9IGNvbnN1bWVyc1swXTsKKyAgICByZXMgPSByZWdpc3RlckNvbXBvc2l0ZVN0cmVhbUxpc3RlbmVyKGdldFN0cmVhbUlkKCkpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcmVnaXN0ZXIgSEFMIG1haW4gaW1hZ2Ugc3RyZWFtIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBpbml0Q29weVJvd0Z1bmN0aW9uKHdpZHRoKTsKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpkZWxldGVJbnRlcm5hbFN0cmVhbXMoKSB7CisgICAgcmVxdWVzdEV4aXQoKTsKKyAgICBhdXRvIHJlcyA9IGpvaW4oKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGpvaW4gd2l0aCB0aGUgbWFpbiBwcm9jZXNzaW5nIHRocmVhZDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICB9CisKKyAgICBkZWluaXRDb2RlYygpOworCisgICAgaWYgKG1BcHBTZWdtZW50U3RyZWFtSWQgPj0gMCkgeworICAgICAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UgPSBtRGV2aWNlLnByb21vdGUoKTsKKyAgICAgICAgaWYgKCFkZXZpY2UuZ2V0KCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjYW1lcmEgZGV2aWNlISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICAgICAgfQorCisgICAgICAgIHJlcyA9IGRldmljZS0+ZGVsZXRlU3RyZWFtKG1BcHBTZWdtZW50U3RyZWFtSWQpOworICAgICAgICBtQXBwU2VnbWVudFN0cmVhbUlkID0gLTE7CisgICAgfQorCisgICAgaWYgKG1PdXRwdXRTdXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgbU91dHB1dFN1cmZhY2UtPmRpc2Nvbm5lY3QoTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBKTsKKyAgICAgICAgbU91dHB1dFN1cmZhY2UuY2xlYXIoKTsKKyAgICB9CisgICAgcmV0dXJuIHJlczsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvbkJ1ZmZlclJlbGVhc2VkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworCisgICAgaWYgKGJ1ZmZlckluZm8ubUVycm9yKSByZXR1cm47CisKKyAgICBtQ29kZWNPdXRwdXRCdWZmZXJUaW1lc3RhbXBzLnB1c2goYnVmZmVySW5mby5tVGltZXN0YW1wKTsKKyAgICBBTE9HVigiJXM6IFslIiBQUklkNjQgIl06IEFkZGluZyBjb2RlY091dHB1dEJ1ZmZlclRpbWVzdGFtcCAoJXp1IHRpbWVzdGFtcHMgaW4gdG90YWwpIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVySW5mby5tVGltZXN0YW1wLCBtQ29kZWNPdXRwdXRCdWZmZXJUaW1lc3RhbXBzLnNpemUoKSk7Cit9CisKKy8vIFdlIG5lZWQgdG8gZ2V0IHRoZSBzZXR0aW5ncyBlYXJseSB0byBoYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGNvZGVjIG91dHB1dAorLy8gYXJyaXZlcyBlYXJsaWVyIHRoYW4gcmVzdWx0IG1ldGFkYXRhLgordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvbkJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwgaW50IHN0cmVhbUlkLAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpIHsKKyAgICBBVFJBQ0VfQVNZTkNfQkVHSU4oIkhFSUMgY2FwdHVyZSIsIGZyYW1lTnVtYmVyKTsKKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgaWYgKG1FcnJvclN0YXRlIHx8IChzdHJlYW1JZCAhPSBnZXRTdHJlYW1JZCgpKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbVBlbmRpbmdDYXB0dXJlUmVzdWx0cy5lbXBsYWNlKGZyYW1lTnVtYmVyLCBDYW1lcmFNZXRhZGF0YSgpKTsKKworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBlbnRyeTsKKworICAgIGludDMyX3Qgb3JpZW50YXRpb24gPSAwOworICAgIGVudHJ5ID0gc2V0dGluZ3MuZmluZChBTkRST0lEX0pQRUdfT1JJRU5UQVRJT04pOworICAgIGlmIChlbnRyeS5jb3VudCA9PSAxKSB7CisgICAgICAgIG9yaWVudGF0aW9uID0gZW50cnkuZGF0YS5pMzJbMF07CisgICAgfQorCisgICAgaW50MzJfdCBxdWFsaXR5ID0ga0RlZmF1bHRKcGVnUXVhbGl0eTsKKyAgICBlbnRyeSA9IHNldHRpbmdzLmZpbmQoQU5EUk9JRF9KUEVHX1FVQUxJVFkpOworICAgIGlmIChlbnRyeS5jb3VudCA9PSAxKSB7CisgICAgICAgIHF1YWxpdHkgPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICB9CisKKyAgICBtU2V0dGluZ3NCeUZyYW1lTnVtYmVyW2ZyYW1lTnVtYmVyXSA9IHN0ZDo6bWFrZV9wYWlyKG9yaWVudGF0aW9uLCBxdWFsaXR5KTsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIHsKKyAgICBpZiAoaXRlbS5tRGF0YVNwYWNlID09IHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihrQXBwU2VnbWVudERhdGFTcGFjZSkpIHsKKyAgICAgICAgQUxPR1YoIiVzOiBKUEVHIEFQUCBzZWdtZW50cyBidWZmZXIgd2l0aCB0czogJSIgUFJJdTY0ICIgbXMuIGFycml2ZWQhIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbnMybXMoaXRlbS5tVGltZXN0YW1wKSk7CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICAgICAgaWYgKCFtRXJyb3JTdGF0ZSkgeworICAgICAgICAgICAgbUlucHV0QXBwU2VnbWVudEJ1ZmZlcnMucHVzaF9iYWNrKGl0ZW0ubVRpbWVzdGFtcCk7CisgICAgICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSBpZiAoaXRlbS5tRGF0YVNwYWNlID09IGtIZWlmRGF0YVNwYWNlKSB7CisgICAgICAgIEFMT0dWKCIlczogWVVWXzg4OCBidWZmZXIgd2l0aCB0czogJSIgUFJJdTY0ICIgbXMuIGFycml2ZWQhIiwKKyAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbnMybXMoaXRlbS5tVGltZXN0YW1wKSk7CisKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKyAgICAgICAgaWYgKCFtVXNlR3JpZCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBZVVZfODg4IGludGVybmFsIHN0cmVhbSBpcyBvbmx5IHN1cHBvcnRlZCBmb3IgSEVWQyB0aWxpbmciLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICghbUVycm9yU3RhdGUpIHsKKyAgICAgICAgICAgIG1JbnB1dFl1dkJ1ZmZlcnMucHVzaF9iYWNrKGl0ZW0ubVRpbWVzdGFtcCk7CisgICAgICAgICAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBkYXRhIHNwYWNlOiAweCV4IiwgX19GVU5DVElPTl9fLCBpdGVtLm1EYXRhU3BhY2UpOworICAgIH0KK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Z2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiogY29tcG9zaXRlT3V0cHV0IC8qb3V0Ki8pIHsKKyAgICBpZiAoY29tcG9zaXRlT3V0cHV0ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjb21wb3NpdGVPdXRwdXQtPmNsZWFyKCk7CisKKyAgICBib29sIHVzZUdyaWQsIHVzZUhlaWM7CisgICAgYm9vbCBpc1NpemVTdXBwb3J0ZWQgPSBpc1NpemVTdXBwb3J0ZWRCeUhlaWZFbmNvZGVyKAorICAgICAgICAgICAgc3RyZWFtSW5mby53aWR0aCwgc3RyZWFtSW5mby5oZWlnaHQsICZ1c2VIZWljLCAmdXNlR3JpZCwgbnVsbHB0cik7CisgICAgaWYgKCFpc1NpemVTdXBwb3J0ZWQpIHsKKyAgICAgICAgLy8gU2l6ZSBpcyBub3Qgc3VwcG9ydGVkIGJ5IGVpdGhlciBlbmNvZGVyLgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgY29tcG9zaXRlT3V0cHV0LT5pbnNlcnQoY29tcG9zaXRlT3V0cHV0LT5lbmQoKSwgMiwgc3RyZWFtSW5mbyk7CisKKyAgICAvLyBKUEVHIEFQUFMgc2VnbWVudHMgQmxvYiBzdHJlYW0gaW5mbworICAgICgqY29tcG9zaXRlT3V0cHV0KVswXS53aWR0aCA9IGNhbGNBcHBTZWdtZW50TWF4U2l6ZShjaCk7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzBdLmhlaWdodCA9IDE7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzBdLmZvcm1hdCA9IEhBTF9QSVhFTF9GT1JNQVRfQkxPQjsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMF0uZGF0YVNwYWNlID0ga0FwcFNlZ21lbnREYXRhU3BhY2U7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzBdLmNvbnN1bWVyVXNhZ2UgPSBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU47CisKKyAgICAvLyBZVVYvSU1QTEVNRU5UQVRJT05fREVGSU5FRCBzdHJlYW0gaW5mbworICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS53aWR0aCA9IHN0cmVhbUluZm8ud2lkdGg7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLmhlaWdodCA9IHN0cmVhbUluZm8uaGVpZ2h0OworICAgICgqY29tcG9zaXRlT3V0cHV0KVsxXS5mb3JtYXQgPSB1c2VHcmlkID8gSEFMX1BJWEVMX0ZPUk1BVF9ZQ2JDcl80MjBfODg4IDoKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRDsKKyAgICAoKmNvbXBvc2l0ZU91dHB1dClbMV0uZGF0YVNwYWNlID0ga0hlaWZEYXRhU3BhY2U7CisgICAgKCpjb21wb3NpdGVPdXRwdXQpWzFdLmNvbnN1bWVyVXNhZ2UgPSB1c2VIZWljID8gR1JBTExPQ19VU0FHRV9IV19JTUFHRV9FTkNPREVSIDoKKyAgICAgICAgICAgIHVzZUdyaWQgPyBHUkFMTE9DX1VTQUdFX1NXX1JFQURfT0ZURU4gOiBHUkFMTE9DX1VTQUdFX0hXX1ZJREVPX0VOQ09ERVI7CisKKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK2Jvb2wgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6aXNTaXplU3VwcG9ydGVkQnlIZWlmRW5jb2RlcihpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgYm9vbCogdXNlSGVpYywgYm9vbCogdXNlR3JpZCwgaW50NjRfdCogc3RhbGwsIEFTdHJpbmcqIGhldmNOYW1lKSB7CisgICAgc3RhdGljIEhlaWNFbmNvZGVySW5mb01hbmFnZXImIGhlaWNNYW5hZ2VyID0gSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKKyAgICByZXR1cm4gaGVpY01hbmFnZXIuaXNTaXplU3VwcG9ydGVkKHdpZHRoLCBoZWlnaHQsIHVzZUhlaWMsIHVzZUdyaWQsIHN0YWxsLCBoZXZjTmFtZSk7Cit9CisKK2Jvb2wgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6aXNJbk1lbW9yeVRlbXBGaWxlU3VwcG9ydGVkKCkgeworICAgIGludCBtZW1mZCA9IHN5c2NhbGwoX19OUl9tZW1mZF9jcmVhdGUsICJIRUlGLXRyeS1tZW1mZCIsIE1GRF9DTE9FWEVDKTsKKyAgICBpZiAobWVtZmQgPT0gLTEpIHsKKyAgICAgICAgaWYgKGVycm5vICE9IEVOT1NZUykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIHRtcGZzIGZpbGUuIGVycm5vICVkIiwgX19GVU5DVElPTl9fLCBlcnJubyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjbG9zZShtZW1mZCk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25IZWljT3V0cHV0RnJhbWVBdmFpbGFibGUoCisgICAgICAgIGNvbnN0IENvZGVjT3V0cHV0QnVmZmVySW5mbyYgb3V0cHV0QnVmZmVySW5mbykgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisKKyAgICBBTE9HVigiJXM6IGluZGV4ICVkLCBvZmZzZXQgJWQsIHNpemUgJWQsIHRpbWUgJSIgUFJJZDY0ICIsIGZsYWdzIDB4JXgiLAorICAgICAgICAgICAgX19GVU5DVElPTl9fLCBvdXRwdXRCdWZmZXJJbmZvLmluZGV4LCBvdXRwdXRCdWZmZXJJbmZvLm9mZnNldCwKKyAgICAgICAgICAgIG91dHB1dEJ1ZmZlckluZm8uc2l6ZSwgb3V0cHV0QnVmZmVySW5mby50aW1lVXMsIG91dHB1dEJ1ZmZlckluZm8uZmxhZ3MpOworCisgICAgaWYgKCFtRXJyb3JTdGF0ZSkgeworICAgICAgICBpZiAoKG91dHB1dEJ1ZmZlckluZm8uc2l6ZSA+IDApICYmCisgICAgICAgICAgICAgICAgKChvdXRwdXRCdWZmZXJJbmZvLmZsYWdzICYgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfQ09ERUNDT05GSUcpID09IDApKSB7CisgICAgICAgICAgICBtQ29kZWNPdXRwdXRCdWZmZXJzLnB1c2hfYmFjayhvdXRwdXRCdWZmZXJJbmZvKTsKKyAgICAgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1YoIiVzOiBSZWxlYXNpbmcgb3V0cHV0IGJ1ZmZlcjogc2l6ZSAlZCBmbGFnczogMHgleCAiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVySW5mby5zaXplLCBvdXRwdXRCdWZmZXJJbmZvLmZsYWdzKTsKKyAgICAgICAgICAgIG1Db2RlYy0+cmVsZWFzZU91dHB1dEJ1ZmZlcihvdXRwdXRCdWZmZXJJbmZvLmluZGV4KTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIG1Db2RlYy0+cmVsZWFzZU91dHB1dEJ1ZmZlcihvdXRwdXRCdWZmZXJJbmZvLmluZGV4KTsKKyAgICB9Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25IZWljSW5wdXRGcmFtZUF2YWlsYWJsZShpbnQzMl90IGluZGV4KSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobU11dGV4KTsKKworICAgIGlmICghbVVzZUdyaWQpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb2RlYyBZVVYgaW5wdXQgbW9kZSBtdXN0IG9ubHkgYmUgdXNlZCBmb3IgSGV2YyB0aWxpbmcgbW9kZSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBtQ29kZWNJbnB1dEJ1ZmZlcnMucHVzaF9iYWNrKGluZGV4KTsKKyAgICBtSW5wdXRSZWFkeUNvbmRpdGlvbi5zaWduYWwoKTsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvbkhlaWNGb3JtYXRDaGFuZ2VkKHNwPEFNZXNzYWdlPiYgbmV3Rm9ybWF0KSB7CisgICAgaWYgKG5ld0Zvcm1hdCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogbmV3Rm9ybWF0IG11c3Qgbm90IGJlIG51bGwhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisKKyAgICBBU3RyaW5nIG1pbWU7CisgICAgQVN0cmluZyBtaW1lSGVpYyhNSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMpOworICAgIG5ld0Zvcm1hdC0+ZmluZFN0cmluZyhLRVlfTUlNRSwgJm1pbWUpOworICAgIGlmIChtaW1lICE9IG1pbWVIZWljKSB7CisgICAgICAgIC8vIEZvciBIRVZDIGNvZGVjLCBiZWxvdyBrZXlzIG5lZWQgdG8gYmUgZmlsbGVkIG91dCBvciBvdmVyd3JpdHRlbiBzbyB0aGF0IHRoZQorICAgICAgICAvLyBtdXhlciBjYW4gaGFuZGxlIHRoZW0gYXMgSEVJQyBvdXRwdXQgaW1hZ2UuCisgICAgICAgIG5ld0Zvcm1hdC0+c2V0U3RyaW5nKEtFWV9NSU1FLCBtaW1lSGVpYyk7CisgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX1dJRFRILCBtT3V0cHV0V2lkdGgpOworICAgICAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9IRUlHSFQsIG1PdXRwdXRIZWlnaHQpOworICAgICAgICBpZiAobVVzZUdyaWQpIHsKKyAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX1RJTEVfV0lEVEgsIG1HcmlkV2lkdGgpOworICAgICAgICAgICAgbmV3Rm9ybWF0LT5zZXRJbnQzMihLRVlfVElMRV9IRUlHSFQsIG1HcmlkSGVpZ2h0KTsKKyAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX0dSSURfUk9XUywgbUdyaWRSb3dzKTsKKyAgICAgICAgICAgIG5ld0Zvcm1hdC0+c2V0SW50MzIoS0VZX0dSSURfQ09MVU1OUywgbUdyaWRDb2xzKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBuZXdGb3JtYXQtPnNldEludDMyKEtFWV9JU19ERUZBVUxULCAxIC8qaXNQcmltYXJ5Ki8pOworCisgICAgaW50MzJfdCBncmlkUm93cywgZ3JpZENvbHM7CisgICAgaWYgKG5ld0Zvcm1hdC0+ZmluZEludDMyKEtFWV9HUklEX1JPV1MsICZncmlkUm93cykgJiYKKyAgICAgICAgICAgIG5ld0Zvcm1hdC0+ZmluZEludDMyKEtFWV9HUklEX0NPTFVNTlMsICZncmlkQ29scykpIHsKKyAgICAgICAgbU51bU91dHB1dFRpbGVzID0gZ3JpZFJvd3MgKiBncmlkQ29sczsKKyAgICB9IGVsc2UgeworICAgICAgICBtTnVtT3V0cHV0VGlsZXMgPSAxOworICAgIH0KKworICAgIG1Gb3JtYXQgPSBuZXdGb3JtYXQ7CisKKyAgICBBTE9HVigiJXM6IG1OdW1PdXRwdXRUaWxlcyBpcyAlenUiLCBfX0ZVTkNUSU9OX18sIG1OdW1PdXRwdXRUaWxlcyk7CisgICAgbUlucHV0UmVhZHlDb25kaXRpb24uc2lnbmFsKCk7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25IZWljQ29kZWNFcnJvcigpIHsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgIG1FcnJvclN0YXRlID0gdHJ1ZTsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Y29uZmlndXJlU3RyZWFtKCkgeworICAgIGlmIChpc1J1bm5pbmcoKSkgeworICAgICAgICAvLyBQcm9jZXNzaW5nIHRocmVhZCBpcyBhbHJlYWR5IHJ1bm5pbmcsIG5vdGhpbmcgbW9yZSB0byBkby4KKyAgICAgICAgcmV0dXJuIE5PX0VSUk9SOworICAgIH0KKworICAgIGlmIChtT3V0cHV0U3VyZmFjZS5nZXQoKSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogTm8gdmFsaWQgb3V0cHV0IHN1cmZhY2Ugc2V0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKworICAgIGF1dG8gcmVzID0gbU91dHB1dFN1cmZhY2UtPmNvbm5lY3QoTkFUSVZFX1dJTkRPV19BUElfQ0FNRVJBLCBtUHJvZHVjZXJMaXN0ZW5lcik7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25uZWN0IHRvIG5hdGl2ZSB3aW5kb3cgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtTWFpbkltYWdlU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIGlmICgocmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc19mb3JtYXQobU91dHB1dFN1cmZhY2UuZ2V0KCksIEhBTF9QSVhFTF9GT1JNQVRfQkxPQikpCisgICAgICAgICAgICAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25maWd1cmUgc3RyZWFtIGJ1ZmZlciBmb3JtYXQgZm9yIHN0cmVhbSAlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBtTWFpbkltYWdlU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIEFOYXRpdmVXaW5kb3cgKmFud0NvbnN1bWVyID0gbU91dHB1dFN1cmZhY2UuZ2V0KCk7CisgICAgaW50IG1heENvbnN1bWVyQnVmZmVyczsKKyAgICBpZiAoKHJlcyA9IGFud0NvbnN1bWVyLT5xdWVyeShhbndDb25zdW1lciwgTkFUSVZFX1dJTkRPV19NSU5fVU5ERVFVRVVFRF9CVUZGRVJTLAorICAgICAgICAgICAgICAgICAgICAmbWF4Q29uc3VtZXJCdWZmZXJzKSkgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gcXVlcnkgY29uc3VtZXIgdW5kZXF1ZXVlZCIKKyAgICAgICAgICAgICAgICAiIGJ1ZmZlciBjb3VudCBmb3Igc3RyZWFtICVkIiwgX19GVU5DVElPTl9fLCBtTWFpbkltYWdlU3RyZWFtSWQpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIENhbm5vdCB1c2UgU291cmNlU3VyZmFjZSBidWZmZXIgY291bnQgc2luY2UgaXQgY291bGQgYmUgY29kZWMncyA1MTIqNTEyIHRpbGUKKyAgICAvLyBidWZmZXIgY291bnQuCisgICAgaWYgKChyZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJfY291bnQoCisgICAgICAgICAgICAgICAgICAgIGFud0NvbnN1bWVyLCBrTWF4T3V0cHV0U3VyZmFjZVByb2R1Y2VyQ291bnQgKyBtYXhDb25zdW1lckJ1ZmZlcnMpKSAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBzZXQgYnVmZmVyIGNvdW50IGZvciBzdHJlYW0gJWQiLCBfX0ZVTkNUSU9OX18sIG1NYWluSW1hZ2VTdHJlYW1JZCk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgaWYgKChyZXMgPSBuYXRpdmVfd2luZG93X3NldF9idWZmZXJzX2RpbWVuc2lvbnMoYW53Q29uc3VtZXIsIG1NYXhIZWljQnVmZmVyU2l6ZSwgMSkpICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHNldCBidWZmZXIgZGltZW5zaW9uICV6dSB4IDEgZm9yIHN0cmVhbSAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtTWF4SGVpY0J1ZmZlclNpemUsIG1NYWluSW1hZ2VTdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcnVuKCJIZWljQ29tcG9zaXRlU3RyZWFtUHJvYyIpOworCisgICAgcmV0dXJuIE5PX0VSUk9SOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjppbnNlcnRHYnAoU3VyZmFjZU1hcCogLypvdXQqL291dFN1cmZhY2VNYXAsCisgICAgICAgIFZlY3RvcjxpbnQzMl90PiogLypvdXQqL291dHB1dFN0cmVhbUlkcywgaW50MzJfdCogLypvdXQqL2N1cnJlbnRTdHJlYW1JZCkgeworICAgIGlmIChvdXRTdXJmYWNlTWFwLT5maW5kKG1BcHBTZWdtZW50U3RyZWFtSWQpID09IG91dFN1cmZhY2VNYXAtPmVuZCgpKSB7CisgICAgICAgICgqb3V0U3VyZmFjZU1hcClbbUFwcFNlZ21lbnRTdHJlYW1JZF0gPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCk7CisgICAgICAgIG91dHB1dFN0cmVhbUlkcy0+cHVzaF9iYWNrKG1BcHBTZWdtZW50U3RyZWFtSWQpOworICAgIH0KKyAgICAoKm91dFN1cmZhY2VNYXApW21BcHBTZWdtZW50U3RyZWFtSWRdLnB1c2hfYmFjayhtQXBwU2VnbWVudFN1cmZhY2VJZCk7CisKKyAgICBpZiAob3V0U3VyZmFjZU1hcC0+ZmluZChtTWFpbkltYWdlU3RyZWFtSWQpID09IG91dFN1cmZhY2VNYXAtPmVuZCgpKSB7CisgICAgICAgICgqb3V0U3VyZmFjZU1hcClbbU1haW5JbWFnZVN0cmVhbUlkXSA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKTsKKyAgICAgICAgb3V0cHV0U3RyZWFtSWRzLT5wdXNoX2JhY2sobU1haW5JbWFnZVN0cmVhbUlkKTsKKyAgICB9CisgICAgKCpvdXRTdXJmYWNlTWFwKVttTWFpbkltYWdlU3RyZWFtSWRdLnB1c2hfYmFjayhtTWFpbkltYWdlU3VyZmFjZUlkKTsKKworICAgIGlmIChjdXJyZW50U3RyZWFtSWQgIT0gbnVsbHB0cikgeworICAgICAgICAqY3VycmVudFN0cmVhbUlkID0gbU1haW5JbWFnZVN0cmVhbUlkOworICAgIH0KKworICAgIHJldHVybiBOT19FUlJPUjsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvblNodXR0ZXIoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLCBuc2Vjc190IHRpbWVzdGFtcCkgeworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgaWYgKG1FcnJvclN0YXRlKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobVNldHRpbmdzQnlGcmFtZU51bWJlci5maW5kKHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcikgIT0gbVNldHRpbmdzQnlGcmFtZU51bWJlci5lbmQoKSkgeworICAgICAgICBBTE9HVigiJXM6IFslIiBQUklkNjQgIl06IGZyYW1lTnVtYmVyICUiIFBSSWQ2NCwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwgcmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKKyAgICAgICAgbUZyYW1lTnVtYmVyTWFwLmVtcGxhY2UocmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyLCB0aW1lc3RhbXApOworICAgICAgICBtU2V0dGluZ3NCeVRpbWVzdGFtcFt0aW1lc3RhbXBdID0gbVNldHRpbmdzQnlGcmFtZU51bWJlcltyZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXJdOworICAgICAgICBtU2V0dGluZ3NCeUZyYW1lTnVtYmVyLmVyYXNlKHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcik7CisgICAgICAgIG1JbnB1dFJlYWR5Q29uZGl0aW9uLnNpZ25hbCgpOworICAgIH0KK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCkgeworICAgIHdoaWxlICghbVNldHRpbmdzQnlUaW1lc3RhbXAuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGl0ID0gbVNldHRpbmdzQnlUaW1lc3RhbXAuYmVnaW4oKTsKKyAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpdC0+Zmlyc3RdLm9yaWVudGF0aW9uID0gaXQtPnNlY29uZC5maXJzdDsKKyAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpdC0+Zmlyc3RdLnF1YWxpdHkgPSBpdC0+c2Vjb25kLnNlY29uZDsKKyAgICAgICAgbVNldHRpbmdzQnlUaW1lc3RhbXAuZXJhc2UoaXQpOworICAgIH0KKworICAgIHdoaWxlICghbUlucHV0QXBwU2VnbWVudEJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBDcHVDb25zdW1lcjo6TG9ja2VkQnVmZmVyIGltZ0J1ZmZlcjsKKyAgICAgICAgYXV0byBpdCA9IG1JbnB1dEFwcFNlZ21lbnRCdWZmZXJzLmJlZ2luKCk7CisgICAgICAgIGF1dG8gcmVzID0gbUFwcFNlZ21lbnRDb25zdW1lci0+bG9ja05leHRCdWZmZXIoJmltZ0J1ZmZlcik7CisgICAgICAgIGlmIChyZXMgPT0gTk9UX0VOT1VHSF9EQVRBKSB7CisgICAgICAgICAgICAvLyBDYW4gbm90IGxvY2sgYW55IG1vcmUgYnVmZmVycy4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKChyZXMgIT0gT0spIHx8ICgqaXQgIT0gaW1nQnVmZmVyLnRpbWVzdGFtcCkpIHsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIGxvY2tpbmcgSlBFR19BUFBfU0VHTUVOVFMgaW1hZ2UgYnVmZmVyOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRXhwZWN0aW5nIEpQRUdfQVBQX1NFR01FTlRTIGJ1ZmZlciB3aXRoIHRpbWUgc3RhbXA6ICUiIFBSSWQ2NAorICAgICAgICAgICAgICAgICAgICAgICAgIiByZWNlaXZlZCBidWZmZXIgd2l0aCB0aW1lIHN0YW1wOiAlIiBQUklkNjQsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICppdCwgaW1nQnVmZmVyLnRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgbUFwcFNlZ21lbnRDb25zdW1lci0+dW5sb2NrQnVmZmVyKGltZ0J1ZmZlcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzWyppdF0uZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgbUlucHV0QXBwU2VnbWVudEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG1QZW5kaW5nSW5wdXRGcmFtZXMuZmluZChpbWdCdWZmZXIudGltZXN0YW1wKSAhPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVuZCgpKSAmJgorICAgICAgICAgICAgICAgIChtUGVuZGluZ0lucHV0RnJhbWVzW2ltZ0J1ZmZlci50aW1lc3RhbXBdLmVycm9yKSkgeworICAgICAgICAgICAgbUFwcFNlZ21lbnRDb25zdW1lci0+dW5sb2NrQnVmZmVyKGltZ0J1ZmZlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2ltZ0J1ZmZlci50aW1lc3RhbXBdLmFwcFNlZ21lbnRCdWZmZXIgPSBpbWdCdWZmZXI7CisgICAgICAgICAgICBtTG9ja2VkQXBwU2VnbWVudEJ1ZmZlckNudCsrOworICAgICAgICB9CisgICAgICAgIG1JbnB1dEFwcFNlZ21lbnRCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW1JbnB1dFl1dkJ1ZmZlcnMuZW1wdHkoKSAmJiAhbVl1dkJ1ZmZlckFjcXVpcmVkKSB7CisgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgaW1nQnVmZmVyOworICAgICAgICBhdXRvIGl0ID0gbUlucHV0WXV2QnVmZmVycy5iZWdpbigpOworICAgICAgICBhdXRvIHJlcyA9IG1NYWluSW1hZ2VDb25zdW1lci0+bG9ja05leHRCdWZmZXIoJmltZ0J1ZmZlcik7CisgICAgICAgIGlmIChyZXMgPT0gTk9UX0VOT1VHSF9EQVRBKSB7CisgICAgICAgICAgICAvLyBDYW4gbm90IGxvY2sgYW55IG1vcmUgYnVmZmVycy4KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBFcnJvciBsb2NraW5nIFlVVl84ODggaW1hZ2UgYnVmZmVyOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbKml0XS5lcnJvciA9IHRydWU7CisgICAgICAgICAgICBtSW5wdXRZdXZCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9IGVsc2UgaWYgKCppdCAhPSBpbWdCdWZmZXIudGltZXN0YW1wKSB7CisgICAgICAgICAgICBBTE9HVygiJXM6IEV4cGVjdGluZyBZVVZfODg4IGJ1ZmZlciB3aXRoIHRpbWUgc3RhbXA6ICUiIFBSSWQ2NCAiIHJlY2VpdmVkIGJ1ZmZlciB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgInRpbWUgc3RhbXA6ICUiIFBSSWQ2NCwgX19GVU5DVElPTl9fLCAqaXQsIGltZ0J1ZmZlci50aW1lc3RhbXApOworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1sqaXRdLmVycm9yID0gdHJ1ZTsKKyAgICAgICAgICAgIG1JbnB1dFl1dkJ1ZmZlcnMuZXJhc2UoaXQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKG1QZW5kaW5nSW5wdXRGcmFtZXMuZmluZChpbWdCdWZmZXIudGltZXN0YW1wKSAhPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVuZCgpKSAmJgorICAgICAgICAgICAgICAgIChtUGVuZGluZ0lucHV0RnJhbWVzW2ltZ0J1ZmZlci50aW1lc3RhbXBdLmVycm9yKSkgeworICAgICAgICAgICAgbU1haW5JbWFnZUNvbnN1bWVyLT51bmxvY2tCdWZmZXIoaW1nQnVmZmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaW1nQnVmZmVyLnRpbWVzdGFtcF0ueXV2QnVmZmVyID0gaW1nQnVmZmVyOworICAgICAgICAgICAgbVl1dkJ1ZmZlckFjcXVpcmVkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgICBtSW5wdXRZdXZCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICB3aGlsZSAoIW1Db2RlY091dHB1dEJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGl0ID0gbUNvZGVjT3V0cHV0QnVmZmVycy5iZWdpbigpOworICAgICAgICAvLyBCaXRzdHJlYW0gYnVmZmVyIHRpbWVzdGFtcCBkb2Vzbid0IG5lY2Vzc2FyaWx5IGRpcmVjdGx5IGNvcnJlbGF0ZSB3aXRoIGlucHV0CisgICAgICAgIC8vIGJ1ZmZlciB0aW1lc3RhbXAuIEFzc3VtZSBlbmNvZGVyIGlucHV0IHRvIG91dHB1dCBpcyBGSUZPLCB1c2UgYSBxdWV1ZQorICAgICAgICAvLyB0byBsb29rIHVwIHRpbWVzdGFtcC4KKyAgICAgICAgaW50NjRfdCBidWZmZXJUaW1lID0gLTE7CisgICAgICAgIGlmIChtQ29kZWNPdXRwdXRCdWZmZXJUaW1lc3RhbXBzLmVtcHR5KCkpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogRmFpbGVkIHRvIGZpbmQgYnVmZmVyIHRpbWVzdGFtcCBmb3IgY29kZWMgb3V0cHV0IGJ1ZmZlciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBEaXJlY3QgbWFwcGluZyBiZXR3ZWVuIGNhbWVyYSB0aW1lc3RhbXAgKGluIG5zKSBhbmQgY29kZWMgdGltZXN0YW1wIChpbiB1cykuCisgICAgICAgICAgICBidWZmZXJUaW1lID0gbUNvZGVjT3V0cHV0QnVmZmVyVGltZXN0YW1wcy5mcm9udCgpOworICAgICAgICAgICAgbUNvZGVjT3V0cHV0Q291bnRlcisrOworICAgICAgICAgICAgaWYgKG1Db2RlY091dHB1dENvdW50ZXIgPT0gbU51bU91dHB1dFRpbGVzKSB7CisgICAgICAgICAgICAgICAgbUNvZGVjT3V0cHV0QnVmZmVyVGltZXN0YW1wcy5wb3AoKTsKKyAgICAgICAgICAgICAgICBtQ29kZWNPdXRwdXRDb3VudGVyID0gMDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tidWZmZXJUaW1lXS5jb2RlY091dHB1dEJ1ZmZlcnMucHVzaF9iYWNrKCppdCk7CisgICAgICAgICAgICBBTE9HVigiJXM6IFslIiBQUklkNjQgIl06IFB1c2hpbmcgY29kZWNPdXRwdXRCdWZmZXJzICh0aW1lICUiIFBSSWQ2NCAiIHVzKSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVyVGltZSwgaXQtPnRpbWVVcyk7CisgICAgICAgIH0KKyAgICAgICAgbUNvZGVjT3V0cHV0QnVmZmVycy5lcmFzZShpdCk7CisgICAgfQorCisgICAgd2hpbGUgKCFtRnJhbWVOdW1iZXJNYXAuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGl0ID0gbUZyYW1lTnVtYmVyTWFwLmJlZ2luKCk7CisgICAgICAgIG1QZW5kaW5nSW5wdXRGcmFtZXNbaXQtPnNlY29uZF0uZnJhbWVOdW1iZXIgPSBpdC0+Zmlyc3Q7CisgICAgICAgIEFMT0dWKCIlczogWyUiIFBSSWQ2NCAiXTogZnJhbWVOdW1iZXIgaXMgJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sIGl0LT5zZWNvbmQsIGl0LT5maXJzdCk7CisgICAgICAgIG1GcmFtZU51bWJlck1hcC5lcmFzZShpdCk7CisgICAgfQorCisgICAgd2hpbGUgKCFtQ2FwdHVyZVJlc3VsdHMuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGl0ID0gbUNhcHR1cmVSZXN1bHRzLmJlZ2luKCk7CisgICAgICAgIC8vIE5lZ2F0aXZlIHRpbWVzdGFtcCBpbmRpY2F0ZXMgdGhhdCBzb21ldGhpbmcgd2VudCB3cm9uZyBkdXJpbmcgdGhlIGNhcHR1cmUgcmVzdWx0CisgICAgICAgIC8vIGNvbGxlY3Rpb24gcHJvY2Vzcy4KKyAgICAgICAgaWYgKGl0LT5maXJzdCA+PSAwKSB7CisgICAgICAgICAgICBpZiAobVBlbmRpbmdJbnB1dEZyYW1lc1tpdC0+Zmlyc3RdLmZyYW1lTnVtYmVyID09IHN0ZDo6Z2V0PDA+KGl0LT5zZWNvbmQpKSB7CisgICAgICAgICAgICAgICAgbVBlbmRpbmdJbnB1dEZyYW1lc1tpdC0+Zmlyc3RdLnJlc3VsdCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfdW5pcXVlPENhbWVyYU1ldGFkYXRhPihzdGQ6OmdldDwxPihpdC0+c2Vjb25kKSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FwdHVyZSByZXN1bHQgZnJhbWVOdW1iZXIvdGltZXN0YW1wIG1hcHBpbmcgY2hhbmdlZCBiZXR3ZWVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJzaHV0dGVyIGFuZCBjYXB0dXJlIHJlc3VsdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1DYXB0dXJlUmVzdWx0cy5lcmFzZShpdCk7CisgICAgfQorCisgICAgLy8gbUVycm9yRnJhbWVOdW1iZXJzIHN0b3JlcyBmcmFtZSBudW1iZXIgb2YgZHJvcHBlZCBidWZmZXJzLgorICAgIGF1dG8gaXQgPSBtRXJyb3JGcmFtZU51bWJlcnMuYmVnaW4oKTsKKyAgICB3aGlsZSAoaXQgIT0gbUVycm9yRnJhbWVOdW1iZXJzLmVuZCgpKSB7CisgICAgICAgIGJvb2wgZnJhbWVGb3VuZCA9IGZhbHNlOworICAgICAgICBmb3IgKGF1dG8gJmlucHV0RnJhbWUgOiBtUGVuZGluZ0lucHV0RnJhbWVzKSB7CisgICAgICAgICAgICBpZiAoaW5wdXRGcmFtZS5zZWNvbmQuZnJhbWVOdW1iZXIgPT0gKml0KSB7CisgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5zZWNvbmQuZXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgIGZyYW1lRm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKGZyYW1lRm91bmQpIHsKKyAgICAgICAgICAgIGl0ID0gbUVycm9yRnJhbWVOdW1iZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dXKCIlczogTm90IGFibGUgdG8gZmluZCBmYWlsaW5nIGlucHV0IHdpdGggZnJhbWUgbnVtYmVyOiAlIiBQUklkNjQsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgKml0KTsKKyAgICAgICAgICAgIGl0Kys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBEaXN0cmlidXRlIGNvZGVjIGlucHV0IGJ1ZmZlcnMgdG8gYmUgZmlsbGVkIG91dCBmcm9tIFlVViBvdXRwdXQKKyAgICBmb3IgKGF1dG8gaXQgPSBtUGVuZGluZ0lucHV0RnJhbWVzLmJlZ2luKCk7CisgICAgICAgICAgICBpdCAhPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVuZCgpICYmIG1Db2RlY0lucHV0QnVmZmVycy5zaXplKCkgPiAwOyBpdCsrKSB7CisgICAgICAgIElucHV0RnJhbWUmIGlucHV0RnJhbWUoaXQtPnNlY29uZCk7CisgICAgICAgIGlmIChpbnB1dEZyYW1lLmNvZGVjSW5wdXRDb3VudGVyIDwgbUdyaWRSb3dzICogbUdyaWRDb2xzKSB7CisgICAgICAgICAgICAvLyBBdmFpbGFibGUgaW5wdXQgdGlsZXMgdGhhdCBhcmUgcmVxdWlyZWQgZm9yIHRoZSBjdXJyZW50IGlucHV0CisgICAgICAgICAgICAvLyBpbWFnZS4KKyAgICAgICAgICAgIHNpemVfdCBuZXdJbnB1dFRpbGVzID0gc3RkOjptaW4obUNvZGVjSW5wdXRCdWZmZXJzLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgbUdyaWRSb3dzICogbUdyaWRDb2xzIC0gaW5wdXRGcmFtZS5jb2RlY0lucHV0Q291bnRlcik7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG5ld0lucHV0VGlsZXM7IGkrKykgeworICAgICAgICAgICAgICAgIENvZGVjSW5wdXRCdWZmZXJJbmZvIGlucHV0SW5mbyA9CisgICAgICAgICAgICAgICAgICAgICAgICB7IG1Db2RlY0lucHV0QnVmZmVyc1swXSwgbUdyaWRUaW1lc3RhbXBVcysrLCBpbnB1dEZyYW1lLmNvZGVjSW5wdXRDb3VudGVyIH07CisgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5jb2RlY0lucHV0QnVmZmVycy5wdXNoX2JhY2soaW5wdXRJbmZvKTsKKworICAgICAgICAgICAgICAgIG1Db2RlY0lucHV0QnVmZmVycy5lcmFzZShtQ29kZWNJbnB1dEJ1ZmZlcnMuYmVnaW4oKSk7CisgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5jb2RlY0lucHV0Q291bnRlcisrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Z2V0TmV4dFJlYWR5SW5wdXRMb2NrZWQoaW50NjRfdCAqY3VycmVudFRzIC8qb3V0Ki8pIHsKKyAgICBpZiAoY3VycmVudFRzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgbmV3SW5wdXRBdmFpbGFibGUgPSBmYWxzZTsKKyAgICBmb3IgKGF1dG8mIGl0IDogbVBlbmRpbmdJbnB1dEZyYW1lcykgeworICAgICAgICAvLyBOZXcgaW5wdXQgaXMgY29uc2lkZXJlZCB0byBiZSBhdmFpbGFibGUgb25seSBpZjoKKyAgICAgICAgLy8gMS4gaW5wdXQgYnVmZmVycyBhcmUgcmVhZHksIG9yCisgICAgICAgIC8vIDIuIEFwcCBzZWdtZW50IGFuZCBtdXhlciBpcyBjcmVhdGVkLCBvcgorICAgICAgICAvLyAzLiBBIGNvZGVjIG91dHB1dCB0aWxlIGlzIHJlYWR5LCBhbmQgYW4gb3V0cHV0IGJ1ZmZlciBpcyBhdmFpbGFibGUuCisgICAgICAgIC8vIFRoaXMgbWFrZXMgc3VyZSB0aGF0IG11eGVyIGdldHMgY3JlYXRlZCBvbmx5IHdoZW4gYW4gb3V0cHV0IHRpbGUgaXMKKyAgICAgICAgLy8gZ2VuZXJhdGVkLCBiZWNhdXNlIHJpZ2h0IG5vdyB3ZSBvbmx5IGhhbmRsZSAxIEhFSUMgb3V0cHV0IGJ1ZmZlciBhdCBhCisgICAgICAgIC8vIHRpbWUgKG1heCBkZXF1ZXVlZCBidWZmZXIgY291bnQgaXMgMSkuCisgICAgICAgIGJvb2wgYXBwU2VnbWVudFJlYWR5ID0gKGl0LnNlY29uZC5hcHBTZWdtZW50QnVmZmVyLmRhdGEgIT0gbnVsbHB0cikgJiYKKyAgICAgICAgICAgICAgICAhaXQuc2Vjb25kLmFwcFNlZ21lbnRXcml0dGVuICYmIGl0LnNlY29uZC5yZXN1bHQgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgICAgIGl0LnNlY29uZC5tdXhlciAhPSBudWxscHRyOworICAgICAgICBib29sIGNvZGVjT3V0cHV0UmVhZHkgPSAhaXQuc2Vjb25kLmNvZGVjT3V0cHV0QnVmZmVycy5lbXB0eSgpOworICAgICAgICBib29sIGNvZGVjSW5wdXRSZWFkeSA9IChpdC5zZWNvbmQueXV2QnVmZmVyLmRhdGEgIT0gbnVsbHB0cikgJiYKKyAgICAgICAgICAgICAgICAoIWl0LnNlY29uZC5jb2RlY0lucHV0QnVmZmVycy5lbXB0eSgpKTsKKyAgICAgICAgYm9vbCBoYXNPdXRwdXRCdWZmZXIgPSBpdC5zZWNvbmQubXV4ZXIgIT0gbnVsbHB0ciB8fAorICAgICAgICAgICAgICAgIChtRGVxdWV1ZWRPdXRwdXRCdWZmZXJDbnQgPCBrTWF4T3V0cHV0U3VyZmFjZVByb2R1Y2VyQ291bnQpOworICAgICAgICBpZiAoKCFpdC5zZWNvbmQuZXJyb3IpICYmCisgICAgICAgICAgICAgICAgKGl0LmZpcnN0IDwgKmN1cnJlbnRUcykgJiYKKyAgICAgICAgICAgICAgICAoYXBwU2VnbWVudFJlYWR5IHx8IChjb2RlY091dHB1dFJlYWR5ICYmIGhhc091dHB1dEJ1ZmZlcikgfHwgY29kZWNJbnB1dFJlYWR5KSkgeworICAgICAgICAgICAgKmN1cnJlbnRUcyA9IGl0LmZpcnN0OworICAgICAgICAgICAgaWYgKGl0LnNlY29uZC5mb3JtYXQgPT0gbnVsbHB0ciAmJiBtRm9ybWF0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBpdC5zZWNvbmQuZm9ybWF0ID0gbUZvcm1hdC0+ZHVwKCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXdJbnB1dEF2YWlsYWJsZSA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBuZXdJbnB1dEF2YWlsYWJsZTsKK30KKworaW50NjRfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpnZXROZXh0RmFpbGluZ0lucHV0TG9ja2VkKGludDY0X3QgKmN1cnJlbnRUcyAvKm91dCovKSB7CisgICAgaW50NjRfdCByZXMgPSAtMTsKKyAgICBpZiAoY3VycmVudFRzID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGl0IDogbVBlbmRpbmdJbnB1dEZyYW1lcykgeworICAgICAgICBpZiAoaXQuc2Vjb25kLmVycm9yICYmICFpdC5zZWNvbmQuZXJyb3JOb3RpZmllZCAmJiAoaXQuZmlyc3QgPCAqY3VycmVudFRzKSkgeworICAgICAgICAgICAgKmN1cnJlbnRUcyA9IGl0LmZpcnN0OworICAgICAgICAgICAgcmVzID0gaXQuc2Vjb25kLmZyYW1lTnVtYmVyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpwcm9jZXNzSW5wdXRGcmFtZShuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSkgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgc3RhdHVzX3QgcmVzID0gT0s7CisKKyAgICBib29sIGFwcFNlZ21lbnRSZWFkeSA9IGlucHV0RnJhbWUuYXBwU2VnbWVudEJ1ZmZlci5kYXRhICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgICFpbnB1dEZyYW1lLmFwcFNlZ21lbnRXcml0dGVuICYmIGlucHV0RnJhbWUucmVzdWx0ICE9IG51bGxwdHIgJiYKKyAgICAgICAgICAgIGlucHV0RnJhbWUubXV4ZXIgIT0gbnVsbHB0cjsKKyAgICBib29sIGNvZGVjT3V0cHV0UmVhZHkgPSBpbnB1dEZyYW1lLmNvZGVjT3V0cHV0QnVmZmVycy5zaXplKCkgPiAwOworICAgIGJvb2wgY29kZWNJbnB1dFJlYWR5ID0gaW5wdXRGcmFtZS55dXZCdWZmZXIuZGF0YSAhPSBudWxscHRyICYmCisgICAgICAgICAgICAhaW5wdXRGcmFtZS5jb2RlY0lucHV0QnVmZmVycy5lbXB0eSgpOworICAgIGJvb2wgaGFzT3V0cHV0QnVmZmVyID0gaW5wdXRGcmFtZS5tdXhlciAhPSBudWxscHRyIHx8CisgICAgICAgICAgICAobURlcXVldWVkT3V0cHV0QnVmZmVyQ250IDwga01heE91dHB1dFN1cmZhY2VQcm9kdWNlckNvdW50KTsKKworICAgIEFMT0dWKCIlczogWyUiIFBSSWQ2NCAiXTogYXBwU2VnbWVudFJlYWR5ICVkLCBjb2RlY091dHB1dFJlYWR5ICVkLCBjb2RlY0lucHV0UmVhZHkgJWQsIgorICAgICAgICAgICAgIiBkZXF1ZXVlZE91dHB1dEJ1ZmZlciAlZCIsIF9fRlVOQ1RJT05fXywgdGltZXN0YW1wLCBhcHBTZWdtZW50UmVhZHksCisgICAgICAgICAgICBjb2RlY091dHB1dFJlYWR5LCBjb2RlY0lucHV0UmVhZHksIG1EZXF1ZXVlZE91dHB1dEJ1ZmZlckNudCk7CisKKyAgICAvLyBIYW5kbGUgaW5wdXRzIGZvciBIZXZjIHRpbGluZworICAgIGlmIChjb2RlY0lucHV0UmVhZHkpIHsKKyAgICAgICAgcmVzID0gcHJvY2Vzc0NvZGVjSW5wdXRGcmFtZShpbnB1dEZyYW1lKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcHJvY2VzcyBjb2RlYyBpbnB1dCBmcmFtZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCEoY29kZWNPdXRwdXRSZWFkeSAmJiBoYXNPdXRwdXRCdWZmZXIpICYmICFhcHBTZWdtZW50UmVhZHkpIHsKKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIC8vIEluaXRpYWxpemUgYW5kIHN0YXJ0IG11eGVyIGlmIG5vdCB5ZXQgZG9uZSBzby4gSW4gdGhpcyBjYXNlLAorICAgIC8vIGNvZGVjT3V0cHV0UmVhZHkgbXVzdCBiZSB0cnVlLiBPdGhlcndpc2UsIGFwcFNlZ21lbnRSZWFkeSBpcyBndWFyYW50ZWVkCisgICAgLy8gdG8gYmUgZmFsc2UsIGFuZCB0aGUgZnVuY3Rpb24gbXVzdCBoYXZlIHJldHVybmVkIGVhcmx5LgorICAgIGlmIChpbnB1dEZyYW1lLm11eGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmVzID0gc3RhcnRNdXhlckZvcklucHV0RnJhbWUodGltZXN0YW1wLCBpbnB1dEZyYW1lKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIGFuZCBzdGFydCBtdXhlcjogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gV3JpdGUgSlBFRyBBUFAgc2VnbWVudHMgZGF0YSB0byB0aGUgbXV4ZXIuCisgICAgaWYgKGFwcFNlZ21lbnRSZWFkeSkgeworICAgICAgICByZXMgPSBwcm9jZXNzQXBwU2VnbWVudCh0aW1lc3RhbXAsIGlucHV0RnJhbWUpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBwcm9jZXNzIEpQRUcgQVBQIHNlZ21lbnRzOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBXcml0ZSBtZWRpYSBjb2RlYyBiaXRzdHJlYW0gYnVmZmVycyB0byBtdXhlci4KKyAgICB3aGlsZSAoIWlucHV0RnJhbWUuY29kZWNPdXRwdXRCdWZmZXJzLmVtcHR5KCkpIHsKKyAgICAgICAgcmVzID0gcHJvY2Vzc09uZUNvZGVjT3V0cHV0RnJhbWUodGltZXN0YW1wLCBpbnB1dEZyYW1lKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcHJvY2VzcyBjb2RlYyBvdXRwdXQgZnJhbWU6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChpbnB1dEZyYW1lLnBlbmRpbmdPdXRwdXRUaWxlcyA9PSAwKSB7CisgICAgICAgIGlmIChpbnB1dEZyYW1lLmFwcFNlZ21lbnRXcml0dGVuKSB7CisgICAgICAgICAgICByZXMgPSBwcm9jZXNzQ29tcGxldGVkSW5wdXRGcmFtZSh0aW1lc3RhbXAsIGlucHV0RnJhbWUpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHByb2Nlc3MgY29tcGxldGVkIGlucHV0IGZyYW1lOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChtTG9ja2VkQXBwU2VnbWVudEJ1ZmZlckNudCA9PSBrTWF4QWNxdWlyZWRBcHBTZWdtZW50KSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE91dC1vZi1vcmRlciBhcHAgc2VnbWVudCBidWZmZXJzIHJlYWNoZXMgbGltaXQgJXUiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIGtNYXhBY3F1aXJlZEFwcFNlZ21lbnQpOworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6c3RhcnRNdXhlckZvcklucHV0RnJhbWUobnNlY3NfdCB0aW1lc3RhbXAsIElucHV0RnJhbWUgJmlucHV0RnJhbWUpIHsKKyAgICBzcDxBTmF0aXZlV2luZG93PiBvdXRwdXRBTlcgPSBtT3V0cHV0U3VyZmFjZTsKKworICAgIGF1dG8gcmVzID0gb3V0cHV0QU5XLT5kZXF1ZXVlQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCAmaW5wdXRGcmFtZS5hbmIsICZpbnB1dEZyYW1lLmZlbmNlRmQpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFcnJvciByZXRyaWV2aW5nIG91dHB1dCBidWZmZXI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLAorICAgICAgICAgICAgICAgIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIG1EZXF1ZXVlZE91dHB1dEJ1ZmZlckNudCsrOworCisgICAgLy8gQ29tYmluZSBjdXJyZW50IHRocmVhZCBpZCwgc3RyZWFtIGlkIGFuZCB0aW1lc3RhbXAgdG8gdW5pcXVlbHkgaWRlbnRpZnkgaW1hZ2UuCisgICAgc3RkOjpvc3RyaW5nc3RyZWFtIHRlbXBPdXRwdXRGaWxlOworICAgIHRlbXBPdXRwdXRGaWxlIDw8ICJIRUlGLSIgPDwgcHRocmVhZF9zZWxmKCkgPDwgIi0iCisgICAgICAgICAgICA8PCBnZXRTdHJlYW1JZCgpIDw8ICItIiA8PCB0aW1lc3RhbXA7CisgICAgaW5wdXRGcmFtZS5maWxlRmQgPSBzeXNjYWxsKF9fTlJfbWVtZmRfY3JlYXRlLCB0ZW1wT3V0cHV0RmlsZS5zdHIoKS5jX3N0cigpLCBNRkRfQ0xPRVhFQyk7CisgICAgaWYgKGlucHV0RnJhbWUuZmlsZUZkIDwgMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjcmVhdGUgZmlsZSAlcy4gRXJyb3Igbm8gaXMgJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgdGVtcE91dHB1dEZpbGUuc3RyKCkuY19zdHIoKSwgZXJybm8pOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgaW5wdXRGcmFtZS5tdXhlciA9IG5ldyBNZWRpYU11eGVyKGlucHV0RnJhbWUuZmlsZUZkLCBNZWRpYU11eGVyOjpPVVRQVVRfRk9STUFUX0hFSUYpOworICAgIGlmIChpbnB1dEZyYW1lLm11eGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIE1lZGlhTXV4ZXIgZm9yIGZpbGUgZmQgJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaW5wdXRGcmFtZS5maWxlRmQpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICByZXMgPSBpbnB1dEZyYW1lLm11eGVyLT5zZXRPcmllbnRhdGlvbkhpbnQoaW5wdXRGcmFtZS5vcmllbnRhdGlvbik7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBzZXRPcmllbnRhdGlvbkhpbnQ6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIC8vIFNldCBlbmNvZGVyIHF1YWxpdHkKKyAgICB7CisgICAgICAgIHNwPEFNZXNzYWdlPiBxdWFsaXR5UGFyYW1zID0gbmV3IEFNZXNzYWdlOworICAgICAgICBxdWFsaXR5UGFyYW1zLT5zZXRJbnQzMihQQVJBTUVURVJfS0VZX1ZJREVPX0JJVFJBVEUsIGlucHV0RnJhbWUucXVhbGl0eSk7CisgICAgICAgIHJlcyA9IG1Db2RlYy0+c2V0UGFyYW1ldGVycyhxdWFsaXR5UGFyYW1zKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gc2V0IGNvZGVjIHF1YWxpdHk6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHNzaXplX3QgdHJhY2tJZCA9IGlucHV0RnJhbWUubXV4ZXItPmFkZFRyYWNrKGlucHV0RnJhbWUuZm9ybWF0KTsKKyAgICBpZiAodHJhY2tJZCA8IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gYWRkVHJhY2sgdG8gdGhlIG11eGVyOiAlemQiLCBfX0ZVTkNUSU9OX18sIHRyYWNrSWQpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICBpbnB1dEZyYW1lLnRyYWNrSW5kZXggPSB0cmFja0lkOworICAgIGlucHV0RnJhbWUucGVuZGluZ091dHB1dFRpbGVzID0gbU51bU91dHB1dFRpbGVzOworCisgICAgcmVzID0gaW5wdXRGcmFtZS5tdXhlci0+c3RhcnQoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHN0YXJ0IE1lZGlhTXV4ZXI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBbJSIgUFJJZDY0ICJdOiBNdXhlciBzdGFydGVkIGZvciBpbnB1dEZyYW1lIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgdGltZXN0YW1wKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OnByb2Nlc3NBcHBTZWdtZW50KG5zZWNzX3QgdGltZXN0YW1wLCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKSB7CisgICAgc2l6ZV90IGFwcDFTaXplID0gMDsKKyAgICBhdXRvIGFwcFNlZ21lbnRTaXplID0gZmluZEFwcFNlZ21lbnRzU2l6ZShpbnB1dEZyYW1lLmFwcFNlZ21lbnRCdWZmZXIuZGF0YSwKKyAgICAgICAgICAgIGlucHV0RnJhbWUuYXBwU2VnbWVudEJ1ZmZlci53aWR0aCAqIGlucHV0RnJhbWUuYXBwU2VnbWVudEJ1ZmZlci5oZWlnaHQsCisgICAgICAgICAgICAmYXBwMVNpemUpOworICAgIGlmIChhcHBTZWdtZW50U2l6ZSA9PSAwKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGZpbmQgSlBFRyBBUFAgc2VnbWVudCBzaXplIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorCisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZVdGlscz4gZXhpZlV0aWxzKEV4aWZVdGlsczo6Y3JlYXRlKCkpOworICAgIGF1dG8gZXhpZlJlcyA9IGV4aWZVdGlscy0+aW5pdGlhbGl6ZShpbnB1dEZyYW1lLmFwcFNlZ21lbnRCdWZmZXIuZGF0YSwgYXBwMVNpemUpOworICAgIGlmICghZXhpZlJlcykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBpbml0aWFsaXplIEV4aWZVdGlscyBvYmplY3QhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgZXhpZlJlcyA9IGV4aWZVdGlscy0+c2V0RnJvbU1ldGFkYXRhKCppbnB1dEZyYW1lLnJlc3VsdCwgbVN0YXRpY0luZm8sCisgICAgICAgICAgICBtT3V0cHV0V2lkdGgsIG1PdXRwdXRIZWlnaHQpOworICAgIGlmICghZXhpZlJlcykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBzZXQgRXhpZiB0YWdzIHVzaW5nIG1ldGFkYXRhIGFuZCBtYWluIGltYWdlIHNpemVzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgZXhpZlJlcyA9IGV4aWZVdGlscy0+c2V0T3JpZW50YXRpb24oaW5wdXRGcmFtZS5vcmllbnRhdGlvbik7CisgICAgaWYgKCFleGlmUmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogRXhpZlV0aWxzIGZhaWxlZCB0byBzZXQgb3JpZW50YXRpb24iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBleGlmUmVzID0gZXhpZlV0aWxzLT5nZW5lcmF0ZUFwcDEoKTsKKyAgICBpZiAoIWV4aWZSZXMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBFeGlmVXRpbHMgZmFpbGVkIHRvIGdlbmVyYXRlIEFQUDEgc2VnbWVudCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgdW5zaWduZWQgaW50IG5ld0FwcDFMZW5ndGggPSBleGlmVXRpbHMtPmdldEFwcDFMZW5ndGgoKTsKKyAgICBjb25zdCB1aW50OF90ICpuZXdBcHAxU2VnbWVudCA9IGV4aWZVdGlscy0+Z2V0QXBwMUJ1ZmZlcigpOworCisgICAgLy9Bc3NlbWJsZSB0aGUgQVBQMSBtYXJrZXIgYnVmZmVyIHJlcXVpcmVkIGJ5IE1lZGlhQ29kZWMKKyAgICB1aW50OF90IGtFeGlmQXBwMU1hcmtlcltdID0geydFJywgJ3gnLCAnaScsICdmJywgMHhGRiwgMHhFMSwgMHgwMCwgMHgwMH07CisgICAga0V4aWZBcHAxTWFya2VyWzZdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4obmV3QXBwMUxlbmd0aCA+PiA4KTsKKyAgICBrRXhpZkFwcDFNYXJrZXJbN10gPSBzdGF0aWNfY2FzdDx1aW50OF90PihuZXdBcHAxTGVuZ3RoICYgMHhGRik7CisgICAgc2l6ZV90IGFwcFNlZ21lbnRCdWZmZXJTaXplID0gc2l6ZW9mKGtFeGlmQXBwMU1hcmtlcikgKworICAgICAgICAgICAgYXBwU2VnbWVudFNpemUgLSBhcHAxU2l6ZSArIG5ld0FwcDFMZW5ndGg7CisgICAgdWludDhfdCogYXBwU2VnbWVudEJ1ZmZlciA9IG5ldyB1aW50OF90W2FwcFNlZ21lbnRCdWZmZXJTaXplXTsKKyAgICBtZW1jcHkoYXBwU2VnbWVudEJ1ZmZlciwga0V4aWZBcHAxTWFya2VyLCBzaXplb2Yoa0V4aWZBcHAxTWFya2VyKSk7CisgICAgbWVtY3B5KGFwcFNlZ21lbnRCdWZmZXIgKyBzaXplb2Yoa0V4aWZBcHAxTWFya2VyKSwgbmV3QXBwMVNlZ21lbnQsIG5ld0FwcDFMZW5ndGgpOworICAgIGlmIChhcHBTZWdtZW50U2l6ZSAtIGFwcDFTaXplID4gMCkgeworICAgICAgICBtZW1jcHkoYXBwU2VnbWVudEJ1ZmZlciArIHNpemVvZihrRXhpZkFwcDFNYXJrZXIpICsgbmV3QXBwMUxlbmd0aCwKKyAgICAgICAgICAgICAgICBpbnB1dEZyYW1lLmFwcFNlZ21lbnRCdWZmZXIuZGF0YSArIGFwcDFTaXplLCBhcHBTZWdtZW50U2l6ZSAtIGFwcDFTaXplKTsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBhQnVmZmVyID0gbmV3IEFCdWZmZXIoYXBwU2VnbWVudEJ1ZmZlciwgYXBwU2VnbWVudEJ1ZmZlclNpemUpOworICAgIGF1dG8gcmVzID0gaW5wdXRGcmFtZS5tdXhlci0+d3JpdGVTYW1wbGVEYXRhKGFCdWZmZXIsIGlucHV0RnJhbWUudHJhY2tJbmRleCwKKyAgICAgICAgICAgIHRpbWVzdGFtcCwgTWVkaWFDb2RlYzo6QlVGRkVSX0ZMQUdfTVVYRVJfREFUQSk7CisgICAgZGVsZXRlW10gYXBwU2VnbWVudEJ1ZmZlcjsKKworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgSlBFRyBBUFAgc2VnbWVudHMgdG8gbXV4ZXI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgQUxPR1YoIiVzOiBbJSIgUFJJZDY0ICJdOiBhcHBTZWdtZW50U2l6ZSBpcyAlenUsIHdpZHRoICVkLCBoZWlnaHQgJWQsIGFwcDFTaXplICV6dSIsCisgICAgICAgICAgX19GVU5DVElPTl9fLCB0aW1lc3RhbXAsIGFwcFNlZ21lbnRTaXplLCBpbnB1dEZyYW1lLmFwcFNlZ21lbnRCdWZmZXIud2lkdGgsCisgICAgICAgICAgaW5wdXRGcmFtZS5hcHBTZWdtZW50QnVmZmVyLmhlaWdodCwgYXBwMVNpemUpOworCisgICAgaW5wdXRGcmFtZS5hcHBTZWdtZW50V3JpdHRlbiA9IHRydWU7CisgICAgLy8gUmVsZWFzZSB0aGUgYnVmZmVyIG5vdyBzbyBhbnkgcGVuZGluZyBpbnB1dCBhcHAgc2VnbWVudHMgY2FuIGJlIHByb2Nlc3NlZAorICAgIG1BcHBTZWdtZW50Q29uc3VtZXItPnVubG9ja0J1ZmZlcihpbnB1dEZyYW1lLmFwcFNlZ21lbnRCdWZmZXIpOworICAgIGlucHV0RnJhbWUuYXBwU2VnbWVudEJ1ZmZlci5kYXRhID0gbnVsbHB0cjsKKyAgICBtTG9ja2VkQXBwU2VnbWVudEJ1ZmZlckNudC0tOworCisgICAgcmV0dXJuIE9LOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpwcm9jZXNzQ29kZWNJbnB1dEZyYW1lKElucHV0RnJhbWUgJmlucHV0RnJhbWUpIHsKKyAgICBmb3IgKGF1dG8mIGlucHV0QnVmZmVyIDogaW5wdXRGcmFtZS5jb2RlY0lucHV0QnVmZmVycykgeworICAgICAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXI7CisgICAgICAgIGF1dG8gcmVzID0gbUNvZGVjLT5nZXRJbnB1dEJ1ZmZlcihpbnB1dEJ1ZmZlci5pbmRleCwgJmJ1ZmZlcik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgZ2V0dGluZyBjb2RlYyBpbnB1dCBidWZmZXI6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENvcHkgb25lIHRpbGUgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24uCisgICAgICAgIHNpemVfdCB0aWxlWCA9IGlucHV0QnVmZmVyLnRpbGVJbmRleCAlIG1HcmlkQ29sczsKKyAgICAgICAgc2l6ZV90IHRpbGVZID0gaW5wdXRCdWZmZXIudGlsZUluZGV4IC8gbUdyaWRDb2xzOworICAgICAgICBzaXplX3QgdG9wID0gbUdyaWRIZWlnaHQgKiB0aWxlWTsKKyAgICAgICAgc2l6ZV90IGxlZnQgPSBtR3JpZFdpZHRoICogdGlsZVg7CisgICAgICAgIHNpemVfdCB3aWR0aCA9ICh0aWxlWCA9PSBzdGF0aWNfY2FzdDxzaXplX3Q+KG1HcmlkQ29scykgLSAxKSA/CisgICAgICAgICAgICAgICAgbU91dHB1dFdpZHRoIC0gdGlsZVggKiBtR3JpZFdpZHRoIDogbUdyaWRXaWR0aDsKKyAgICAgICAgc2l6ZV90IGhlaWdodCA9ICh0aWxlWSA9PSBzdGF0aWNfY2FzdDxzaXplX3Q+KG1HcmlkUm93cykgLSAxKSA/CisgICAgICAgICAgICAgICAgbU91dHB1dEhlaWdodCAtIHRpbGVZICogbUdyaWRIZWlnaHQgOiBtR3JpZEhlaWdodDsKKyAgICAgICAgQUxPR1YoIiVzOiBpbnB1dEJ1ZmZlciB0aWxlSW5kZXggWyV6dSwgJXp1XSwgdG9wICV6dSwgbGVmdCAlenUsIHdpZHRoICV6dSwgaGVpZ2h0ICV6dSwiCisgICAgICAgICAgICAgICAgIiB0aW1lVXMgJSIgUFJJZDY0LCBfX0ZVTkNUSU9OX18sIHRpbGVYLCB0aWxlWSwgdG9wLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIGlucHV0QnVmZmVyLnRpbWVVcyk7CisKKyAgICAgICAgcmVzID0gY29weU9uZVl1dlRpbGUoYnVmZmVyLCBpbnB1dEZyYW1lLnl1dkJ1ZmZlciwgdG9wLCBsZWZ0LCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY29weSBZVVYgdGlsZSAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKworICAgICAgICByZXMgPSBtQ29kZWMtPnF1ZXVlSW5wdXRCdWZmZXIoaW5wdXRCdWZmZXIuaW5kZXgsIDAsIGJ1ZmZlci0+Y2FwYWNpdHkoKSwKKyAgICAgICAgICAgICAgICBpbnB1dEJ1ZmZlci50aW1lVXMsIDAsIG51bGxwdHIgLyplcnJvckRldGFpbE1zZyovKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gcXVldWVJbnB1dEJ1ZmZlciB0byBDb2RlYzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICB9CisgICAgfQorCisgICAgaW5wdXRGcmFtZS5jb2RlY0lucHV0QnVmZmVycy5jbGVhcigpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6cHJvY2Vzc09uZUNvZGVjT3V0cHV0RnJhbWUobnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgIElucHV0RnJhbWUgJmlucHV0RnJhbWUpIHsKKyAgICBhdXRvIGl0ID0gaW5wdXRGcmFtZS5jb2RlY091dHB1dEJ1ZmZlcnMuYmVnaW4oKTsKKyAgICBzcDxNZWRpYUNvZGVjQnVmZmVyPiBidWZmZXI7CisgICAgc3RhdHVzX3QgcmVzID0gbUNvZGVjLT5nZXRPdXRwdXRCdWZmZXIoaXQtPmluZGV4LCAmYnVmZmVyKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3IgZ2V0dGluZyBIZWljIGNvZGVjIG91dHB1dCBidWZmZXIgYXQgaW5kZXggJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaXQtPmluZGV4LCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgaWYgKGJ1ZmZlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBIZWljIGNvZGVjIG91dHB1dCBidWZmZXIgYXQgaW5kZXggJWQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaXQtPmluZGV4KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzcDxBQnVmZmVyPiBhQnVmZmVyID0gbmV3IEFCdWZmZXIoYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+c2l6ZSgpKTsKKyAgICByZXMgPSBpbnB1dEZyYW1lLm11eGVyLT53cml0ZVNhbXBsZURhdGEoCisgICAgICAgICAgICBhQnVmZmVyLCBpbnB1dEZyYW1lLnRyYWNrSW5kZXgsIHRpbWVzdGFtcCwgMCAvKmZsYWdzKi8pOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gd3JpdGUgYnVmZmVyIGluZGV4ICVkIHRvIG11eGVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGl0LT5pbmRleCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgbUNvZGVjLT5yZWxlYXNlT3V0cHV0QnVmZmVyKGl0LT5pbmRleCk7CisgICAgaWYgKGlucHV0RnJhbWUucGVuZGluZ091dHB1dFRpbGVzID09IDApIHsKKyAgICAgICAgQUxPR1coIiVzOiBDb2RlYyBnZW5lcmF0ZWQgbW9yZSB0aWxlcyB0aGFuIGV4cGVjdGVkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5wdXRGcmFtZS5wZW5kaW5nT3V0cHV0VGlsZXMtLTsKKyAgICB9CisKKyAgICBpbnB1dEZyYW1lLmNvZGVjT3V0cHV0QnVmZmVycy5lcmFzZShpbnB1dEZyYW1lLmNvZGVjT3V0cHV0QnVmZmVycy5iZWdpbigpKTsKKworICAgIEFMT0dWKCIlczogWyUiIFBSSWQ2NCAiXTogT3V0cHV0IGJ1ZmZlciBpbmRleCAlZCIsCisgICAgICAgIF9fRlVOQ1RJT05fXywgdGltZXN0YW1wLCBpdC0+aW5kZXgpOworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6cHJvY2Vzc0NvbXBsZXRlZElucHV0RnJhbWUobnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgIElucHV0RnJhbWUgJmlucHV0RnJhbWUpIHsKKyAgICBzcDxBTmF0aXZlV2luZG93PiBvdXRwdXRBTlcgPSBtT3V0cHV0U3VyZmFjZTsKKyAgICBpbnB1dEZyYW1lLm11eGVyLT5zdG9wKCk7CisKKyAgICAvLyBDb3B5IHRoZSBjb250ZW50IG9mIHRoZSBmaWxlIHRvIG1lbW9yeS4KKyAgICBzcDxHcmFwaGljQnVmZmVyPiBnYiA9IEdyYXBoaWNCdWZmZXI6OmZyb20oaW5wdXRGcmFtZS5hbmIpOworICAgIHZvaWQqIGRzdEJ1ZmZlcjsKKyAgICBhdXRvIHJlcyA9IGdiLT5sb2NrQXN5bmMoR1JBTExPQ19VU0FHRV9TV19XUklURV9PRlRFTiwgJmRzdEJ1ZmZlciwgaW5wdXRGcmFtZS5mZW5jZUZkKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3IgdHJ5aW5nIHRvIGxvY2sgb3V0cHV0IGJ1ZmZlciBmZW5jZTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBvZmZfdCBmU2l6ZSA9IGxzZWVrKGlucHV0RnJhbWUuZmlsZUZkLCAwLCBTRUVLX0VORCk7CisgICAgaWYgKHN0YXRpY19jYXN0PHNpemVfdD4oZlNpemUpID4gbU1heEhlaWNCdWZmZXJTaXplIC0gc2l6ZW9mKENhbWVyYUJsb2IpKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3I6IE1lZGlhTXV4ZXIgb3V0cHV0IHNpemUgJWxkIGlzIGxhcmdlciB0aGFuIGJ1ZmZlciBzaXplciAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZlNpemUsIG1NYXhIZWljQnVmZmVyU2l6ZSAtIHNpemVvZihDYW1lcmFCbG9iKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgbHNlZWsoaW5wdXRGcmFtZS5maWxlRmQsIDAsIFNFRUtfU0VUKTsKKyAgICBzc2l6ZV90IGJ5dGVzUmVhZCA9IHJlYWQoaW5wdXRGcmFtZS5maWxlRmQsIGRzdEJ1ZmZlciwgZlNpemUpOworICAgIGlmIChieXRlc1JlYWQgPCBmU2l6ZSkgeworICAgICAgICBBTE9HRSgiJXM6IE9ubHkgJXpkIG9mICVsZCBieXRlcyByZWFkIiwgX19GVU5DVElPTl9fLCBieXRlc1JlYWQsIGZTaXplKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBjbG9zZShpbnB1dEZyYW1lLmZpbGVGZCk7CisgICAgaW5wdXRGcmFtZS5maWxlRmQgPSAtMTsKKworICAgIC8vIEZpbGwgaW4gSEVJQyBoZWFkZXIKKyAgICB1aW50OF90ICpoZWFkZXIgPSBzdGF0aWNfY2FzdDx1aW50OF90Kj4oZHN0QnVmZmVyKSArIG1NYXhIZWljQnVmZmVyU2l6ZSAtIHNpemVvZihDYW1lcmFCbG9iKTsKKyAgICBzdHJ1Y3QgQ2FtZXJhQmxvYiAqYmxvYkhlYWRlciA9IChzdHJ1Y3QgQ2FtZXJhQmxvYiAqKWhlYWRlcjsKKyAgICAvLyBNdXN0IGJlIGluIHN5bmMgd2l0aCBDQU1FUkEzX0hFSUNfQkxPQl9JRCBpbiBhbmRyb2lkX21lZGlhX1V0aWxzLmNwcAorICAgIGJsb2JIZWFkZXItPmJsb2JJZCA9IHN0YXRpY19jYXN0PENhbWVyYUJsb2JJZD4oMHgwMEZFKTsKKyAgICBibG9iSGVhZGVyLT5ibG9iU2l6ZSA9IGZTaXplOworCisgICAgcmVzID0gbmF0aXZlX3dpbmRvd19zZXRfYnVmZmVyc190aW1lc3RhbXAobU91dHB1dFN1cmZhY2UuZ2V0KCksIHRpbWVzdGFtcCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRXJyb3Igc2V0dGluZyB0aW1lc3RhbXA6ICVzICglZCkiLAorICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBnZXRTdHJlYW1JZCgpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXMgPSBvdXRwdXRBTlctPnF1ZXVlQnVmZmVyKG1PdXRwdXRTdXJmYWNlLmdldCgpLCBpbnB1dEZyYW1lLmFuYiwgLypmZW5jZSovIC0xKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHF1ZXVlQnVmZmVyIHRvIEhlaWMgc3RyZWFtOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKyAgICBpbnB1dEZyYW1lLmFuYiA9IG51bGxwdHI7CisgICAgbURlcXVldWVkT3V0cHV0QnVmZmVyQ250LS07CisKKyAgICBBTE9HVigiJXM6IFslIiBQUklkNjQgIl0iLCBfX0ZVTkNUSU9OX18sIHRpbWVzdGFtcCk7CisgICAgQVRSQUNFX0FTWU5DX0VORCgiSEVJQyBjYXB0dXJlIiwgaW5wdXRGcmFtZS5mcmFtZU51bWJlcik7CisgICAgcmV0dXJuIE9LOworfQorCisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6cmVsZWFzZUlucHV0RnJhbWVMb2NrZWQoSW5wdXRGcmFtZSAqaW5wdXRGcmFtZSAvKm91dCovKSB7CisgICAgaWYgKGlucHV0RnJhbWUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKGlucHV0RnJhbWUtPmFwcFNlZ21lbnRCdWZmZXIuZGF0YSAhPSBudWxscHRyKSB7CisgICAgICAgIG1BcHBTZWdtZW50Q29uc3VtZXItPnVubG9ja0J1ZmZlcihpbnB1dEZyYW1lLT5hcHBTZWdtZW50QnVmZmVyKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+YXBwU2VnbWVudEJ1ZmZlci5kYXRhID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICB3aGlsZSAoIWlucHV0RnJhbWUtPmNvZGVjT3V0cHV0QnVmZmVycy5lbXB0eSgpKSB7CisgICAgICAgIGF1dG8gaXQgPSBpbnB1dEZyYW1lLT5jb2RlY091dHB1dEJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgQUxPR1YoIiVzOiByZWxlYXNlT3V0cHV0QnVmZmVyIGluZGV4ICVkIiwgX19GVU5DVElPTl9fLCBpdC0+aW5kZXgpOworICAgICAgICBtQ29kZWMtPnJlbGVhc2VPdXRwdXRCdWZmZXIoaXQtPmluZGV4KTsKKyAgICAgICAgaW5wdXRGcmFtZS0+Y29kZWNPdXRwdXRCdWZmZXJzLmVyYXNlKGl0KTsKKyAgICB9CisKKyAgICBpZiAoaW5wdXRGcmFtZS0+eXV2QnVmZmVyLmRhdGEgIT0gbnVsbHB0cikgeworICAgICAgICBtTWFpbkltYWdlQ29uc3VtZXItPnVubG9ja0J1ZmZlcihpbnB1dEZyYW1lLT55dXZCdWZmZXIpOworICAgICAgICBpbnB1dEZyYW1lLT55dXZCdWZmZXIuZGF0YSA9IG51bGxwdHI7CisgICAgICAgIG1ZdXZCdWZmZXJBY3F1aXJlZCA9IGZhbHNlOworICAgIH0KKworICAgIHdoaWxlICghaW5wdXRGcmFtZS0+Y29kZWNJbnB1dEJ1ZmZlcnMuZW1wdHkoKSkgeworICAgICAgICBhdXRvIGl0ID0gaW5wdXRGcmFtZS0+Y29kZWNJbnB1dEJ1ZmZlcnMuYmVnaW4oKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+Y29kZWNJbnB1dEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgIH0KKworICAgIGlmICgoaW5wdXRGcmFtZS0+ZXJyb3IgfHwgbUVycm9yU3RhdGUpICYmICFpbnB1dEZyYW1lLT5lcnJvck5vdGlmaWVkKSB7CisgICAgICAgIG5vdGlmeUVycm9yKGlucHV0RnJhbWUtPmZyYW1lTnVtYmVyKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+ZXJyb3JOb3RpZmllZCA9IHRydWU7CisgICAgfQorCisgICAgaWYgKGlucHV0RnJhbWUtPmZpbGVGZCA+PSAwKSB7CisgICAgICAgIGNsb3NlKGlucHV0RnJhbWUtPmZpbGVGZCk7CisgICAgICAgIGlucHV0RnJhbWUtPmZpbGVGZCA9IC0xOworICAgIH0KKworICAgIGlmIChpbnB1dEZyYW1lLT5hbmIgIT0gbnVsbHB0cikgeworICAgICAgICBzcDxBTmF0aXZlV2luZG93PiBvdXRwdXRBTlcgPSBtT3V0cHV0U3VyZmFjZTsKKyAgICAgICAgb3V0cHV0QU5XLT5jYW5jZWxCdWZmZXIobU91dHB1dFN1cmZhY2UuZ2V0KCksIGlucHV0RnJhbWUtPmFuYiwgLypmZW5jZSovIC0xKTsKKyAgICAgICAgaW5wdXRGcmFtZS0+YW5iID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6cmVsZWFzZUlucHV0RnJhbWVzTG9ja2VkKCkgeworICAgIGF1dG8gaXQgPSBtUGVuZGluZ0lucHV0RnJhbWVzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0ICE9IG1QZW5kaW5nSW5wdXRGcmFtZXMuZW5kKCkpIHsKKyAgICAgICAgYXV0byYgaW5wdXRGcmFtZSA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmIChpbnB1dEZyYW1lLmVycm9yIHx8CisgICAgICAgICAgICAoaW5wdXRGcmFtZS5hcHBTZWdtZW50V3JpdHRlbiAmJiBpbnB1dEZyYW1lLnBlbmRpbmdPdXRwdXRUaWxlcyA9PSAwKSkgeworICAgICAgICAgICAgcmVsZWFzZUlucHV0RnJhbWVMb2NrZWQoJmlucHV0RnJhbWUpOworICAgICAgICAgICAgaXQgPSBtUGVuZGluZ0lucHV0RnJhbWVzLmVyYXNlKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGl0Kys7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXR1c190IEhlaWNDb21wb3NpdGVTdHJlYW06OmluaXRpYWxpemVDb2RlYyh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiYgY2FtZXJhRGV2aWNlKSB7CisgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKworICAgIGJvb2wgdXNlR3JpZCA9IGZhbHNlOworICAgIEFTdHJpbmcgaGV2Y05hbWU7CisgICAgYm9vbCBpc1NpemVTdXBwb3J0ZWQgPSBpc1NpemVTdXBwb3J0ZWRCeUhlaWZFbmNvZGVyKHdpZHRoLCBoZWlnaHQsCisgICAgICAgICAgICAmbVVzZUhlaWMsICZ1c2VHcmlkLCBudWxscHRyLCAmaGV2Y05hbWUpOworICAgIGlmICghaXNTaXplU3VwcG9ydGVkKSB7CisgICAgICAgIEFMT0dFKCIlczogRW5jb2RlciBkb2VzbnQnIHN1cHBvcnQgc2l6ZSAldSB4ICV1ISIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCB3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgTG9vcGVyIGZvciBNZWRpYUNvZGVjLgorICAgIGF1dG8gZGVzaXJlZE1pbWUgPSBtVXNlSGVpYyA/IE1JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyA6IE1JTUVUWVBFX1ZJREVPX0hFVkM7CisgICAgbUNvZGVjTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbUNvZGVjTG9vcGVyLT5zZXROYW1lKCJDYW1lcmEzLUhlaWNDb21wb3NpdGUtTWVkaWFDb2RlY0xvb3BlciIpOworICAgIHN0YXR1c190IHJlcyA9IG1Db2RlY0xvb3Blci0+c3RhcnQoCisgICAgICAgICAgICBmYWxzZSwgICAvLyBydW5PbkNhbGxpbmdUaHJlYWQKKyAgICAgICAgICAgIGZhbHNlLCAgICAvLyBjYW5DYWxsSmF2YQorICAgICAgICAgICAgUFJJT1JJVFlfQVVESU8pOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gc3RhcnQgY29kZWMgbG9vcGVyOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgSEVJQy9IRVZDIGNvZGVjLgorICAgIGlmIChtVXNlSGVpYykgeworICAgICAgICBtQ29kZWMgPSBNZWRpYUNvZGVjOjpDcmVhdGVCeVR5cGUobUNvZGVjTG9vcGVyLCBkZXNpcmVkTWltZSwgdHJ1ZSAvKmVuY29kZXIqLyk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgbUNvZGVjID0gTWVkaWFDb2RlYzo6Q3JlYXRlQnlDb21wb25lbnROYW1lKG1Db2RlY0xvb3BlciwgaGV2Y05hbWUpOworICAgIH0KKyAgICBpZiAobUNvZGVjID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gY3JlYXRlIGNvZGVjIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgZGVzaXJlZE1pbWUpOworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisKKyAgICAvLyBDcmVhdGUgTG9vcGVyIGFuZCBoYW5kbGVyIGZvciBDb2RlYyBjYWxsYmFjay4KKyAgICBtQ29kZWNDYWxsYmFja0hhbmRsZXIgPSBuZXcgQ29kZWNDYWxsYmFja0hhbmRsZXIodGhpcyk7CisgICAgaWYgKG1Db2RlY0NhbGxiYWNrSGFuZGxlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGNyZWF0ZSBjb2RlYyBjYWxsYmFjayBoYW5kbGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisgICAgbUNhbGxiYWNrTG9vcGVyID0gbmV3IEFMb29wZXI7CisgICAgbUNhbGxiYWNrTG9vcGVyLT5zZXROYW1lKCJDYW1lcmEzLUhlaWNDb21wb3NpdGUtTWVkaWFDb2RlY0NhbGxiYWNrTG9vcGVyIik7CisgICAgcmVzID0gbUNhbGxiYWNrTG9vcGVyLT5zdGFydCgKKyAgICAgICAgICAgIGZhbHNlLCAgIC8vIHJ1bk9uQ2FsbGluZ1RocmVhZAorICAgICAgICAgICAgZmFsc2UsICAgIC8vIGNhbkNhbGxKYXZhCisgICAgICAgICAgICBQUklPUklUWV9BVURJTyk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBzdGFydCBtZWRpYSBjYWxsYmFjayBsb29wZXI6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiBOT19JTklUOworICAgIH0KKyAgICBtQ2FsbGJhY2tMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtQ29kZWNDYWxsYmFja0hhbmRsZXIpOworCisgICAgbUFzeW5jTm90aWZ5ID0gbmV3IEFNZXNzYWdlKGtXaGF0Q2FsbGJhY2tOb3RpZnksIG1Db2RlY0NhbGxiYWNrSGFuZGxlcik7CisgICAgcmVzID0gbUNvZGVjLT5zZXRDYWxsYmFjayhtQXN5bmNOb3RpZnkpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gc2V0IE1lZGlhQ29kZWMgY2FsbGJhY2s6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIG91dHB1dCBmb3JtYXQgYW5kIGNvbmZpZ3VyZSB0aGUgQ29kZWMuCisgICAgc3A8QU1lc3NhZ2U+IG91dHB1dEZvcm1hdCA9IG5ldyBBTWVzc2FnZSgpOworICAgIG91dHB1dEZvcm1hdC0+c2V0U3RyaW5nKEtFWV9NSU1FLCBkZXNpcmVkTWltZSk7CisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQklUUkFURV9NT0RFLCBCSVRSQVRFX01PREVfQ1EpOworICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX1FVQUxJVFksIGtEZWZhdWx0SnBlZ1F1YWxpdHkpOworICAgIC8vIEFzayBjb2RlYyB0byBza2lwIHRpbWVzdGFtcCBjaGVjayBhbmQgZW5jb2RlIGFsbCBmcmFtZXMuCisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQ2NChLRVlfTUFYX1BUU19HQVBfVE9fRU5DT0RFUiwga05vRnJhbWVEcm9wTWF4UHRzR2FwKTsKKworICAgIGludDMyX3QgZ3JpZFdpZHRoLCBncmlkSGVpZ2h0LCBncmlkUm93cywgZ3JpZENvbHM7CisgICAgaWYgKHVzZUdyaWQgfHwgbVVzZUhlaWMpIHsKKyAgICAgICAgZ3JpZFdpZHRoID0gSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6a0dyaWRXaWR0aDsKKyAgICAgICAgZ3JpZEhlaWdodCA9IEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmtHcmlkSGVpZ2h0OworICAgICAgICBncmlkUm93cyA9IChoZWlnaHQgKyBncmlkSGVpZ2h0IC0gMSkvZ3JpZEhlaWdodDsKKyAgICAgICAgZ3JpZENvbHMgPSAod2lkdGggKyBncmlkV2lkdGggLSAxKS9ncmlkV2lkdGg7CisKKyAgICAgICAgaWYgKG1Vc2VIZWljKSB7CisgICAgICAgICAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9USUxFX1dJRFRILCBncmlkV2lkdGgpOworICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfVElMRV9IRUlHSFQsIGdyaWRIZWlnaHQpOworICAgICAgICAgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfR1JJRF9DT0xVTU5TLCBncmlkQ29scyk7CisgICAgICAgICAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9HUklEX1JPV1MsIGdyaWRSb3dzKTsKKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKyAgICAgICAgZ3JpZFdpZHRoID0gd2lkdGg7CisgICAgICAgIGdyaWRIZWlnaHQgPSBoZWlnaHQ7CisgICAgICAgIGdyaWRSb3dzID0gMTsKKyAgICAgICAgZ3JpZENvbHMgPSAxOworICAgIH0KKworICAgIG91dHB1dEZvcm1hdC0+c2V0SW50MzIoS0VZX1dJRFRILCAhdXNlR3JpZCA/IHdpZHRoIDogZ3JpZFdpZHRoKTsKKyAgICBvdXRwdXRGb3JtYXQtPnNldEludDMyKEtFWV9IRUlHSFQsICF1c2VHcmlkID8gaGVpZ2h0IDogZ3JpZEhlaWdodCk7CisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfSV9GUkFNRV9JTlRFUlZBTCwgMCk7CisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfQ09MT1JfRk9STUFULAorICAgICAgICAgICAgdXNlR3JpZCA/IENPTE9SX0Zvcm1hdFlVVjQyMEZsZXhpYmxlIDogQ09MT1JfRm9ybWF0U3VyZmFjZSk7CisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfRlJBTUVfUkFURSwgZ3JpZFJvd3MgKiBncmlkQ29scyk7CisgICAgLy8gVGhpcyBvbmx5IHNlcnZlcyBhcyBhIGhpbnQgdG8gZW5jb2RlciB3aGVuIGVuY29kaW5nIGlzIG5vdCByZWFsLXRpbWUuCisgICAgb3V0cHV0Rm9ybWF0LT5zZXRJbnQzMihLRVlfT1BFUkFUSU5HX1JBVEUsIHVzZUdyaWQgPyBrR3JpZE9wUmF0ZSA6IGtOb0dyaWRPcFJhdGUpOworCisgICAgcmVzID0gbUNvZGVjLT5jb25maWd1cmUob3V0cHV0Rm9ybWF0LCBudWxscHRyIC8qbmF0aXZlV2luZG93Ki8sCisgICAgICAgICAgICBudWxscHRyIC8qY3J5cHRvKi8sIENPTkZJR1VSRV9GTEFHX0VOQ09ERSk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBjb25maWd1cmUgY29kZWM6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgbUdyaWRXaWR0aCA9IGdyaWRXaWR0aDsKKyAgICBtR3JpZEhlaWdodCA9IGdyaWRIZWlnaHQ7CisgICAgbUdyaWRSb3dzID0gZ3JpZFJvd3M7CisgICAgbUdyaWRDb2xzID0gZ3JpZENvbHM7CisgICAgbVVzZUdyaWQgPSB1c2VHcmlkOworICAgIG1PdXRwdXRXaWR0aCA9IHdpZHRoOworICAgIG1PdXRwdXRIZWlnaHQgPSBoZWlnaHQ7CisgICAgbUFwcFNlZ21lbnRNYXhTaXplID0gY2FsY0FwcFNlZ21lbnRNYXhTaXplKGNhbWVyYURldmljZS0+aW5mbygpKTsKKyAgICBtTWF4SGVpY0J1ZmZlclNpemUgPSBtT3V0cHV0V2lkdGggKiBtT3V0cHV0SGVpZ2h0ICogMyAvIDIgKyBtQXBwU2VnbWVudE1heFNpemU7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6ZGVpbml0Q29kZWMoKSB7CisgICAgQUxPR1YoIiVzIiwgX19GVU5DVElPTl9fKTsKKyAgICBpZiAobUNvZGVjICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUNvZGVjLT5zdG9wKCk7CisgICAgICAgIG1Db2RlYy0+cmVsZWFzZSgpOworICAgICAgICBtQ29kZWMuY2xlYXIoKTsKKyAgICB9CisKKyAgICBpZiAobUNvZGVjTG9vcGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUNvZGVjTG9vcGVyLT5zdG9wKCk7CisgICAgICAgIG1Db2RlY0xvb3Blci5jbGVhcigpOworICAgIH0KKworICAgIGlmIChtQ2FsbGJhY2tMb29wZXIgIT0gbnVsbHB0cikgeworICAgICAgICBtQ2FsbGJhY2tMb29wZXItPnN0b3AoKTsKKyAgICAgICAgbUNhbGxiYWNrTG9vcGVyLmNsZWFyKCk7CisgICAgfQorCisgICAgbUFzeW5jTm90aWZ5LmNsZWFyKCk7CisgICAgbUZvcm1hdC5jbGVhcigpOworfQorCisvLyBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGNvbXBsZXRlIGxpc3Qgb2YgYXBwIHNlZ21lbnQsIDAgaW5kaWNhdGVzIGZhaWx1cmUKK3NpemVfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpmaW5kQXBwU2VnbWVudHNTaXplKGNvbnN0IHVpbnQ4X3QqIGFwcFNlZ21lbnRCdWZmZXIsCisgICAgICAgIHNpemVfdCBtYXhTaXplLCBzaXplX3QgKmFwcDFTZWdtZW50U2l6ZSkgeworICAgIGlmIChhcHBTZWdtZW50QnVmZmVyID09IG51bGxwdHIgfHwgYXBwMVNlZ21lbnRTaXplID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGlucHV0IGFwcFNlZ21lbnRCdWZmZXIgJXAsIGFwcDFTZWdtZW50U2l6ZSAlcCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBhcHBTZWdtZW50QnVmZmVyLCBhcHAxU2VnbWVudFNpemUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gMDsKKyAgICAvLyBGaXJzdCBjaGVjayBmb3IgRVhJRiB0cmFuc3BvcnQgaGVhZGVyIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlcgorICAgIGNvbnN0IHVpbnQ4X3QgKmhlYWRlciA9IGFwcFNlZ21lbnRCdWZmZXIgKyAobWF4U2l6ZSAtIHNpemVvZihzdHJ1Y3QgQ2FtZXJhQmxvYikpOworICAgIGNvbnN0IHN0cnVjdCBDYW1lcmFCbG9iICpibG9iID0gKGNvbnN0IHN0cnVjdCBDYW1lcmFCbG9iKikoaGVhZGVyKTsKKyAgICBpZiAoYmxvYi0+YmxvYklkICE9IENhbWVyYUJsb2JJZDo6SlBFR19BUFBfU0VHTUVOVFMpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEVYSUYgYmxvYklkICVodSIsIF9fRlVOQ1RJT05fXywgYmxvYi0+YmxvYklkKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgZXhwZWN0ZWRTaXplID0gYmxvYi0+YmxvYlNpemU7CisgICAgaWYgKGV4cGVjdGVkU2l6ZSA9PSAwIHx8IGV4cGVjdGVkU2l6ZSA+IG1heFNpemUgLSBzaXplb2Yoc3RydWN0IENhbWVyYUJsb2IpKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBibG9iU2l6ZSAlenUuIiwgX19GVU5DVElPTl9fLCBleHBlY3RlZFNpemUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICB1aW50MzJfdCB0b3RhbFNpemUgPSAwOworCisgICAgLy8gVmVyaWZ5IEFQUDEgbWFya2VyIChtYW5kYXRvcnkpCisgICAgdWludDhfdCBhcHAxTWFya2VyW10gPSB7MHhGRiwgMHhFMX07CisgICAgaWYgKG1lbWNtcChhcHBTZWdtZW50QnVmZmVyLCBhcHAxTWFya2VyLCBzaXplb2YoYXBwMU1hcmtlcikpKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBBUFAxIG1hcmtlcjogJXgsICV4IiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIGFwcFNlZ21lbnRCdWZmZXJbMF0sIGFwcFNlZ21lbnRCdWZmZXJbMV0pOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgdG90YWxTaXplICs9IHNpemVvZihhcHAxTWFya2VyKTsKKworICAgIHVpbnQxNl90IGFwcDFTaXplID0gKHN0YXRpY19jYXN0PHVpbnQxNl90PihhcHBTZWdtZW50QnVmZmVyW3RvdGFsU2l6ZV0pIDw8IDgpICsKKyAgICAgICAgICAgIGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplKzFdOworICAgIHRvdGFsU2l6ZSArPSBhcHAxU2l6ZTsKKworICAgIEFMT0dWKCIlczogRXhwZWN0ZWQgQVBQIHNlZ21lbnRzIHNpemUgJXp1LCBBUFAxIHNlZ21lbnQgc2l6ZSAldSIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGV4cGVjdGVkU2l6ZSwgYXBwMVNpemUpOworICAgIHdoaWxlICh0b3RhbFNpemUgPCBleHBlY3RlZFNpemUpIHsKKyAgICAgICAgaWYgKGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplXSAhPSAweEZGIHx8CisgICAgICAgICAgICAgICAgYXBwU2VnbWVudEJ1ZmZlclt0b3RhbFNpemUrMV0gPD0gMHhFMSB8fAorICAgICAgICAgICAgICAgIGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplKzFdID4gMHhFRikgeworICAgICAgICAgICAgLy8gSW52YWxpZCBBUFBuIG1hcmtlcgorICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEFQUG4gbWFya2VyOiAleCwgJXgiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplXSwgYXBwU2VnbWVudEJ1ZmZlclt0b3RhbFNpemUrMV0pOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgdG90YWxTaXplICs9IDI7CisKKyAgICAgICAgdWludDE2X3QgYXBwblNpemUgPSAoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplXSkgPDwgOCkgKworICAgICAgICAgICAgICAgIGFwcFNlZ21lbnRCdWZmZXJbdG90YWxTaXplKzFdOworICAgICAgICB0b3RhbFNpemUgKz0gYXBwblNpemU7CisgICAgfQorCisgICAgaWYgKHRvdGFsU2l6ZSAhPSBleHBlY3RlZFNpemUpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIEpQRUcgQVBQIHNlZ21lbnRzOiB0b3RhbFNpemUgJXUgdnMgZXhwZWN0ZWQgc2l6ZSAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgdG90YWxTaXplLCBleHBlY3RlZFNpemUpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAqYXBwMVNlZ21lbnRTaXplID0gYXBwMVNpemUgKyBzaXplb2YoYXBwMU1hcmtlcik7CisgICAgcmV0dXJuIGV4cGVjdGVkU2l6ZTsKK30KKworaW50NjRfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpmaW5kVGltZXN0YW1wSW5Oc0xvY2tlZChpbnQ2NF90IHRpbWVJblVzKSB7CisgICAgZm9yIChjb25zdCBhdXRvJiBmbiA6IG1GcmFtZU51bWJlck1hcCkgeworICAgICAgICBpZiAodGltZUluVXMgPT0gbnMydXMoZm4uc2Vjb25kKSkgeworICAgICAgICAgICAgcmV0dXJuIGZuLnNlY29uZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8mIGlucHV0RnJhbWUgOiBtUGVuZGluZ0lucHV0RnJhbWVzKSB7CisgICAgICAgIGlmICh0aW1lSW5VcyA9PSBuczJ1cyhpbnB1dEZyYW1lLmZpcnN0KSkgeworICAgICAgICAgICAgcmV0dXJuIGlucHV0RnJhbWUuZmlyc3Q7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworfQorCitzdGF0dXNfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpjb3B5T25lWXV2VGlsZShzcDxNZWRpYUNvZGVjQnVmZmVyPiYgY29kZWNCdWZmZXIsCisgICAgICAgIGNvbnN0IENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXImIHl1dkJ1ZmZlciwKKyAgICAgICAgc2l6ZV90IHRvcCwgc2l6ZV90IGxlZnQsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCkgeworICAgIEFUUkFDRV9DQUxMKCk7CisKKyAgICAvLyBHZXQgc3RyaWRlIGluZm9ybWF0aW9uIGZvciBjb2RlY0J1ZmZlcgorICAgIHNwPEFCdWZmZXI+IGltYWdlRGF0YTsKKyAgICBpZiAoIWNvZGVjQnVmZmVyLT5tZXRhKCktPmZpbmRCdWZmZXIoImltYWdlLWRhdGEiLCAmaW1hZ2VEYXRhKSkgeworICAgICAgICBBTE9HRSgiJXM6IENvZGVjIGlucHV0IGJ1ZmZlciBpcyBub3QgZm9yIGltYWdlIGRhdGEhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgaWYgKGltYWdlRGF0YS0+c2l6ZSgpICE9IHNpemVvZihNZWRpYUltYWdlMikpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIGNvZGVjIGlucHV0IGltYWdlIHNpemUgJXp1LCBleHBlY3RlZCAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaW1hZ2VEYXRhLT5zaXplKCksIHNpemVvZihNZWRpYUltYWdlMikpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICBNZWRpYUltYWdlMiogaW1hZ2VJbmZvID0gcmVpbnRlcnByZXRfY2FzdDxNZWRpYUltYWdlMio+KGltYWdlRGF0YS0+ZGF0YSgpKTsKKyAgICBpZiAoaW1hZ2VJbmZvLT5tVHlwZSAhPSBNZWRpYUltYWdlMjo6TUVESUFfSU1BR0VfVFlQRV9ZVVYgfHwKKyAgICAgICAgICAgIGltYWdlSW5mby0+bUJpdERlcHRoICE9IDggfHwKKyAgICAgICAgICAgIGltYWdlSW5mby0+bUJpdERlcHRoQWxsb2NhdGVkICE9IDggfHwKKyAgICAgICAgICAgIGltYWdlSW5mby0+bU51bVBsYW5lcyAhPSAzKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBjb2RlYyBpbnB1dCBpbWFnZSBpbmZvOiBtVHlwZSAlZCwgbUJpdERlcHRoICVkLCAiCisgICAgICAgICAgICAgICAgIm1CaXREZXB0aEFsbG9jYXRlZCAlZCwgbU51bVBsYW5lcyAlZCEiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tVHlwZSwgaW1hZ2VJbmZvLT5tQml0RGVwdGgsCisgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tQml0RGVwdGhBbGxvY2F0ZWQsIGltYWdlSW5mby0+bU51bVBsYW5lcyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQUxPR1YoIiVzOiB5dXZCdWZmZXIgY2hyb21hU3RlcCAlZCwgY2hyb21hU3RyaWRlICVkIiwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgeXV2QnVmZmVyLmNocm9tYVN0ZXAsIHl1dkJ1ZmZlci5jaHJvbWFTdHJpZGUpOworICAgIEFMT0dWKCIlczogVSBvZmZzZXQgJXUsIFYgb2Zmc2V0ICV1LCBVIHJvd0luYyAlZCwgViByb3dJbmMgJWQsIFUgY29sSW5jICVkLCBWIGNvbEluYyAlZCIsCisgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tT2Zmc2V0LAorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1PZmZzZXQsCisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubVJvd0luYywKKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tUm93SW5jLAorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1Db2xJbmMsCisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubUNvbEluYyk7CisKKyAgICAvLyBZCisgICAgZm9yIChhdXRvIHJvdyA9IHRvcDsgcm93IDwgdG9wK2hlaWdodDsgcm93KyspIHsKKyAgICAgICAgdWludDhfdCAqZHN0ID0gY29kZWNCdWZmZXItPmRhdGEoKSArIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpZXS5tT2Zmc2V0ICsKKyAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6WV0ubVJvd0luYyAqIChyb3cgLSB0b3ApOworICAgICAgICBtRm5Db3B5Um93KHl1dkJ1ZmZlci5kYXRhK3Jvdyp5dXZCdWZmZXIuc3RyaWRlK2xlZnQsIGRzdCwgd2lkdGgpOworICAgIH0KKworICAgIC8vIFUgaXMgQ2IsIFYgaXMgQ3IKKyAgICBib29sIGNvZGVjVVBsYW5lRmlyc3QgPSBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubU9mZnNldCA+CisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubU9mZnNldDsKKyAgICB1aW50MzJfdCBjb2RlY1V2T2Zmc2V0RGlmZiA9IGNvZGVjVVBsYW5lRmlyc3QgPworICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1PZmZzZXQgLSBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubU9mZnNldCA6CisgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubU9mZnNldCAtIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tT2Zmc2V0OworICAgIGJvb2wgaXNDb2RlY1V2U2VtaXBsYW5uYXIgPSAoY29kZWNVdk9mZnNldERpZmYgPT0gMSkgJiYKKyAgICAgICAgICAgIChpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubVJvd0luYyA9PQorICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1Sb3dJbmMpICYmCisgICAgICAgICAgICAoaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1Db2xJbmMgPT0gMikgJiYKKyAgICAgICAgICAgIChpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubUNvbEluYyA9PSAyKTsKKyAgICBib29sIGlzQ29kZWNVdlBsYW5uYXIgPQorICAgICAgICAgICAgKChjb2RlY1VQbGFuZUZpcnN0ICYmIGNvZGVjVXZPZmZzZXREaWZmID49CisgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tUm93SW5jICogaW1hZ2VJbmZvLT5tSGVpZ2h0LzIpIHx8CisgICAgICAgICAgICAoKCFjb2RlY1VQbGFuZUZpcnN0ICYmIGNvZGVjVXZPZmZzZXREaWZmID49CisgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tUm93SW5jICogaW1hZ2VJbmZvLT5tSGVpZ2h0LzIpKSkgJiYKKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tQ29sSW5jID09IDEgJiYKKyAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tQ29sSW5jID09IDE7CisgICAgYm9vbCBjYW1lcmFVUGxhbmVGaXJzdCA9IHl1dkJ1ZmZlci5kYXRhQ3IgPiB5dXZCdWZmZXIuZGF0YUNiOworCisgICAgaWYgKGlzQ29kZWNVdlNlbWlwbGFubmFyICYmIHl1dkJ1ZmZlci5jaHJvbWFTdGVwID09IDIgJiYKKyAgICAgICAgICAgIChjb2RlY1VQbGFuZUZpcnN0ID09IGNhbWVyYVVQbGFuZUZpcnN0KSkgeworICAgICAgICAvLyBVViBzZW1pcGxhbm5hcgorICAgICAgICAvLyBUaGUgY2hyb21lIHBsYW5lIGNvdWxkIGJlIGVpdGhlciBDYiBmaXJzdCwgb3IgQ3IgZmlyc3QuIFRha2UgdGhlCisgICAgICAgIC8vIHNtYWxsZXIgYWRkcmVzcy4KKyAgICAgICAgdWludDhfdCAqc3JjID0gc3RkOjptaW4oeXV2QnVmZmVyLmRhdGFDYiwgeXV2QnVmZmVyLmRhdGFDcik7CisgICAgICAgIE1lZGlhSW1hZ2UyOjpQbGFuZUluZGV4IGRzdFBsYW5lID0gY29kZWNVdk9mZnNldERpZmYgPiAwID8gTWVkaWFJbWFnZTI6OlUgOiBNZWRpYUltYWdlMjo6VjsKKyAgICAgICAgZm9yIChhdXRvIHJvdyA9IHRvcC8yOyByb3cgPCAodG9wK2hlaWdodCkvMjsgcm93KyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IGNvZGVjQnVmZmVyLT5kYXRhKCkgKyBpbWFnZUluZm8tPm1QbGFuZVtkc3RQbGFuZV0ubU9mZnNldCArCisgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW2RzdFBsYW5lXS5tUm93SW5jICogKHJvdyAtIHRvcC8yKTsKKyAgICAgICAgICAgIG1GbkNvcHlSb3coc3JjK3Jvdyp5dXZCdWZmZXIuY2hyb21hU3RyaWRlK2xlZnQsIGRzdCwgd2lkdGgpOworICAgICAgICB9CisgICAgfSBlbHNlIGlmIChpc0NvZGVjVXZQbGFubmFyICYmIHl1dkJ1ZmZlci5jaHJvbWFTdGVwID09IDEpIHsKKyAgICAgICAgLy8gVSBwbGFuZQorICAgICAgICBmb3IgKGF1dG8gcm93ID0gdG9wLzI7IHJvdyA8ICh0b3AraGVpZ2h0KS8yOyByb3crKykgeworICAgICAgICAgICAgdWludDhfdCAqZHN0ID0gY29kZWNCdWZmZXItPmRhdGEoKSArIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tT2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlVdLm1Sb3dJbmMgKiAocm93IC0gdG9wLzIpOworICAgICAgICAgICAgbUZuQ29weVJvdyh5dXZCdWZmZXIuZGF0YUNiK3Jvdyp5dXZCdWZmZXIuY2hyb21hU3RyaWRlK2xlZnQvMiwgZHN0LCB3aWR0aC8yKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFYgcGxhbmUKKyAgICAgICAgZm9yIChhdXRvIHJvdyA9IHRvcC8yOyByb3cgPCAodG9wK2hlaWdodCkvMjsgcm93KyspIHsKKyAgICAgICAgICAgIHVpbnQ4X3QgKmRzdCA9IGNvZGVjQnVmZmVyLT5kYXRhKCkgKyBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6Vl0ubU9mZnNldCArCisgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tUm93SW5jICogKHJvdyAtIHRvcC8yKTsKKyAgICAgICAgICAgIG1GbkNvcHlSb3coeXV2QnVmZmVyLmRhdGFDcityb3cqeXV2QnVmZmVyLmNocm9tYVN0cmlkZStsZWZ0LzIsIGRzdCwgd2lkdGgvMik7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICAvLyBDb252ZXJ0IGJldHdlZW4gc2VtaXBsYW5uYXIgYW5kIHBsYW5uYXIsIG9yIHdoZW4gVVYgb3JkZXJzIGFyZQorICAgICAgICAvLyBkaWZmZXJlbnQuCisgICAgICAgIHVpbnQ4X3QgKmRzdCA9IGNvZGVjQnVmZmVyLT5kYXRhKCk7CisgICAgICAgIGZvciAoYXV0byByb3cgPSB0b3AvMjsgcm93IDwgKHRvcCtoZWlnaHQpLzI7IHJvdysrKSB7CisgICAgICAgICAgICBmb3IgKGF1dG8gY29sID0gbGVmdC8yOyBjb2wgPCAobGVmdCt3aWR0aCkvMjsgY29sKyspIHsKKyAgICAgICAgICAgICAgICAvLyBVL0NiCisgICAgICAgICAgICAgICAgaW50MzJfdCBkc3RJbmRleCA9IGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tT2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpVXS5tUm93SW5jICogKHJvdyAtIHRvcC8yKSArCisgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZUluZm8tPm1QbGFuZVtNZWRpYUltYWdlMjo6VV0ubUNvbEluYyAqIChjb2wgLSBsZWZ0LzIpOworICAgICAgICAgICAgICAgIGludDMyX3Qgc3JjSW5kZXggPSByb3cgKiB5dXZCdWZmZXIuY2hyb21hU3RyaWRlICsgeXV2QnVmZmVyLmNocm9tYVN0ZXAgKiBjb2w7CisgICAgICAgICAgICAgICAgZHN0W2RzdEluZGV4XSA9IHl1dkJ1ZmZlci5kYXRhQ2Jbc3JjSW5kZXhdOworCisgICAgICAgICAgICAgICAgLy8gVi9DcgorICAgICAgICAgICAgICAgIGRzdEluZGV4ID0gaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1PZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgaW1hZ2VJbmZvLT5tUGxhbmVbTWVkaWFJbWFnZTI6OlZdLm1Sb3dJbmMgKiAocm93IC0gdG9wLzIpICsKKyAgICAgICAgICAgICAgICAgICAgICAgIGltYWdlSW5mby0+bVBsYW5lW01lZGlhSW1hZ2UyOjpWXS5tQ29sSW5jICogKGNvbCAtIGxlZnQvMik7CisgICAgICAgICAgICAgICAgc3JjSW5kZXggPSByb3cgKiB5dXZCdWZmZXIuY2hyb21hU3RyaWRlICsgeXV2QnVmZmVyLmNocm9tYVN0ZXAgKiBjb2w7CisgICAgICAgICAgICAgICAgZHN0W2RzdEluZGV4XSA9IHl1dkJ1ZmZlci5kYXRhQ3Jbc3JjSW5kZXhdOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjppbml0Q29weVJvd0Z1bmN0aW9uKGludDMyX3Qgd2lkdGgpCit7CisgICAgdXNpbmcgbmFtZXNwYWNlIGxpYnl1djsKKworICAgIG1GbkNvcHlSb3cgPSBDb3B5Um93X0M7CisjaWYgZGVmaW5lZChIQVNfQ09QWVJPV19TU0UyKQorICAgIGlmIChUZXN0Q3B1RmxhZyhrQ3B1SGFzU1NFMikpIHsKKyAgICAgICAgbUZuQ29weVJvdyA9IElTX0FMSUdORUQod2lkdGgsIDMyKSA/IENvcHlSb3dfU1NFMiA6IENvcHlSb3dfQW55X1NTRTI7CisgICAgfQorI2VuZGlmCisjaWYgZGVmaW5lZChIQVNfQ09QWVJPV19BVlgpCisgICAgaWYgKFRlc3RDcHVGbGFnKGtDcHVIYXNBVlgpKSB7CisgICAgICAgIG1GbkNvcHlSb3cgPSBJU19BTElHTkVEKHdpZHRoLCA2NCkgPyBDb3B5Um93X0FWWCA6IENvcHlSb3dfQW55X0FWWDsKKyAgICB9CisjZW5kaWYKKyNpZiBkZWZpbmVkKEhBU19DT1BZUk9XX0VSTVMpCisgICAgaWYgKFRlc3RDcHVGbGFnKGtDcHVIYXNFUk1TKSkgeworICAgICAgICBtRm5Db3B5Um93ID0gQ29weVJvd19FUk1TOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFTX0NPUFlST1dfTkVPTikKKyAgICBpZiAoVGVzdENwdUZsYWcoa0NwdUhhc05FT04pKSB7CisgICAgICAgIG1GbkNvcHlSb3cgPSBJU19BTElHTkVEKHdpZHRoLCAzMikgPyBDb3B5Um93X05FT04gOiBDb3B5Um93X0FueV9ORU9OOworICAgIH0KKyNlbmRpZgorI2lmIGRlZmluZWQoSEFTX0NPUFlST1dfTUlQUykKKyAgICBpZiAoVGVzdENwdUZsYWcoa0NwdUhhc01JUFMpKSB7CisgICAgICAgIG1GbkNvcHlSb3cgPSBDb3B5Um93X01JUFM7CisgICAgfQorI2VuZGlmCit9CisKK3NpemVfdCBIZWljQ29tcG9zaXRlU3RyZWFtOjpjYWxjQXBwU2VnbWVudE1heFNpemUoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGluZm8pIHsKKyAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeSA9IGluZm8uZmluZChBTkRST0lEX0hFSUNfSU5GT19NQVhfSlBFR19BUFBfU0VHTUVOVFNfQ09VTlQpOworICAgIHNpemVfdCBtYXhBcHBzU2VnbWVudCA9IDE7CisgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICBtYXhBcHBzU2VnbWVudCA9IGVudHJ5LmRhdGEudThbMF0gPCAxID8gMSA6CisgICAgICAgICAgICAgICAgZW50cnkuZGF0YS51OFswXSA+IDE2ID8gMTYgOiBlbnRyeS5kYXRhLnU4WzBdOworICAgIH0KKyAgICByZXR1cm4gbWF4QXBwc1NlZ21lbnQgKiAoMiArIDB4RkZGRikgKyBzaXplb2Yoc3RydWN0IENhbWVyYUJsb2IpOworfQorCitib29sIEhlaWNDb21wb3NpdGVTdHJlYW06OnRocmVhZExvb3AoKSB7CisgICAgaW50NjRfdCBjdXJyZW50VHMgPSBJTlQ2NF9NQVg7CisgICAgYm9vbCBuZXdJbnB1dEF2YWlsYWJsZSA9IGZhbHNlOworCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworICAgICAgICBpZiAobUVycm9yU3RhdGUpIHsKKyAgICAgICAgICAgIC8vIEluIGNhc2Ugd2UgbGFuZGVkIGluIGVycm9yIHN0YXRlLCByZXR1cm4gYW55IHBlbmRpbmcgYnVmZmVycyBhbmQKKyAgICAgICAgICAgIC8vIGhhbHQgYWxsIGZ1cnRoZXIgcHJvY2Vzc2luZy4KKyAgICAgICAgICAgIGNvbXBpbGVQZW5kaW5nSW5wdXRMb2NrZWQoKTsKKyAgICAgICAgICAgIHJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZCgpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisKKworICAgICAgICB3aGlsZSAoIW5ld0lucHV0QXZhaWxhYmxlKSB7CisgICAgICAgICAgICBjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCk7CisgICAgICAgICAgICBuZXdJbnB1dEF2YWlsYWJsZSA9IGdldE5leHRSZWFkeUlucHV0TG9ja2VkKCZjdXJyZW50VHMpOworCisgICAgICAgICAgICBpZiAoIW5ld0lucHV0QXZhaWxhYmxlKSB7CisgICAgICAgICAgICAgICAgYXV0byBmYWlsaW5nRnJhbWVOdW1iZXIgPSBnZXROZXh0RmFpbGluZ0lucHV0TG9ja2VkKCZjdXJyZW50VHMpOworICAgICAgICAgICAgICAgIGlmIChmYWlsaW5nRnJhbWVOdW1iZXIgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBjYW5ub3QgZXJhc2UgJ21QZW5kaW5nSW5wdXRGcmFtZXNbY3VycmVudFRzXScgYXQgdGhpcyBwb2ludCBiZWNhdXNlIGl0IGlzCisgICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmxlIGZvciB0d28gaW50ZXJuYWwgc3RyZWFtIGJ1ZmZlcnMgdG8gZmFpbC4gSW4gc3VjaCBzY2VuYXJpbyB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gY29tcG9zaXRlIHN0cmVhbSBzaG91bGQgbm90aWZ5IHRoZSBjbGllbnQgYWJvdXQgYSBzdHJlYW0gYnVmZmVyIGVycm9yIG9ubHkKKyAgICAgICAgICAgICAgICAgICAgLy8gb25jZSBhbmQgdGhpcyBpbmZvcm1hdGlvbiBpcyBrZXB0IHdpdGhpbiAnZXJyb3JOb3RpZmllZCcuCisgICAgICAgICAgICAgICAgICAgIC8vIEFueSBwcmVzZW50IGZhaWxlZCBpbnB1dCBmcmFtZXMgd2lsbCBiZSByZW1vdmVkIG9uIGEgc3Vic2VxdWVudCBjYWxsIHRvCisgICAgICAgICAgICAgICAgICAgIC8vICdyZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoKScuCisgICAgICAgICAgICAgICAgICAgIHJlbGVhc2VJbnB1dEZyYW1lTG9ja2VkKCZtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10pOworICAgICAgICAgICAgICAgICAgICBjdXJyZW50VHMgPSBJTlQ2NF9NQVg7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgYXV0byByZXQgPSBtSW5wdXRSZWFkeUNvbmRpdGlvbi53YWl0UmVsYXRpdmUobU11dGV4LCBrV2FpdER1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICBpZiAocmV0ID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHJldCAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRpbWVkIHdhaXQgb24gY29uZGl0aW9uIGZhaWxlZDogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmV0KSwgcmV0KTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGF1dG8gcmVzID0gcHJvY2Vzc0lucHV0RnJhbWUoY3VycmVudFRzLCBtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10pOworICAgIE11dGV4OjpBdXRvbG9jayBsKG1NdXRleCk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCBwcm9jZXNzaW5nIGZyYW1lIHdpdGggdGltZXN0YW1wOiAlIiBQUkl1NjQgIjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjdXJyZW50VHMsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICBtUGVuZGluZ0lucHV0RnJhbWVzW2N1cnJlbnRUc10uZXJyb3IgPSB0cnVlOworICAgIH0KKworICAgIHJlbGVhc2VJbnB1dEZyYW1lc0xvY2tlZCgpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6b25TdHJlYW1CdWZmZXJFcnJvcihjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIHsKKyAgICBib29sIHJlcyA9IGZhbHNlOworICAgIC8vIEJ1ZmZlciBlcnJvcnMgY29uY2VybmluZyBpbnRlcm5hbCBjb21wb3NpdGUgc3RyZWFtcyBzaG91bGQgbm90IGJlIGRpcmVjdGx5IHZpc2libGUgdG8KKyAgICAvLyBjYW1lcmEgY2xpZW50cy4gVGhleSBtdXN0IG9ubHkgcmVjZWl2ZSBhIHNpbmdsZSBidWZmZXIgZXJyb3Igd2l0aCB0aGUgcHVibGljIGNvbXBvc2l0ZQorICAgIC8vIHN0cmVhbSBpZC4KKyAgICBpZiAoKHJlc3VsdEV4dHJhcy5lcnJvclN0cmVhbUlkID09IG1BcHBTZWdtZW50U3RyZWFtSWQpIHx8CisgICAgICAgICAgICAocmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQgPT0gbU1haW5JbWFnZVN0cmVhbUlkKSkgeworICAgICAgICBmbGFnQW5FcnJvckZyYW1lTnVtYmVyKHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcik7CisgICAgICAgIHJlcyA9IHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKK30KKwordm9pZCBIZWljQ29tcG9zaXRlU3RyZWFtOjpvblJlc3VsdEVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIC8vIEZvciByZXN1bHQgZXJyb3IsIHNpbmNlIHRoZSBBUFBTX1NFR01FTlQgYnVmZmVyIGFscmVhZHkgY29udGFpbnMgRVhJRiwKKyAgICAvLyBzaW1wbHkgc2tpcCB1c2luZyB0aGUgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgdG8gb3ZlcnJpZGUgRVhJRi4KKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTXV0ZXgpOworCisgICAgaW50NjRfdCB0aW1lc3RhbXAgPSAtMTsKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGZuIDogbUZyYW1lTnVtYmVyTWFwKSB7CisgICAgICAgIGlmIChmbi5maXJzdCA9PSByZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgIHRpbWVzdGFtcCA9IGZuLnNlY29uZDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGlmICh0aW1lc3RhbXAgPT0gLTEpIHsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBpbnB1dEZyYW1lIDogbVBlbmRpbmdJbnB1dEZyYW1lcykgeworICAgICAgICAgICAgaWYgKGlucHV0RnJhbWUuc2Vjb25kLmZyYW1lTnVtYmVyID09IHJlc3VsdEV4dHJhcy5mcmFtZU51bWJlcikgeworICAgICAgICAgICAgICAgIHRpbWVzdGFtcCA9IGlucHV0RnJhbWUuZmlyc3Q7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAodGltZXN0YW1wID09IC0xKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGZpbmQgc2h1dHRlciB0aW1lc3RhbXAgZm9yIHJlc3VsdCBlcnJvciEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgbUNhcHR1cmVSZXN1bHRzLmVtcGxhY2UodGltZXN0YW1wLCBzdGQ6Om1ha2VfdHVwbGUocmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyLCBDYW1lcmFNZXRhZGF0YSgpKSk7CisgICAgbUlucHV0UmVhZHlDb25kaXRpb24uc2lnbmFsKCk7Cit9CisKK3ZvaWQgSGVpY0NvbXBvc2l0ZVN0cmVhbTo6Q29kZWNDYWxsYmFja0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3A8SGVpY0NvbXBvc2l0ZVN0cmVhbT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCA9PSBudWxscHRyKSByZXR1cm47CisKKyAgICBzd2l0Y2ggKG1zZy0+d2hhdCgpKSB7CisgICAgICAgIGNhc2Uga1doYXRDYWxsYmFja05vdGlmeTogeworICAgICAgICAgICAgIGludDMyX3QgY2JJRDsKKyAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJjYWxsYmFja0lEIiwgJmNiSUQpKSB7CisgICAgICAgICAgICAgICAgIEFMT0dFKCJrV2hhdENhbGxiYWNrTm90aWZ5OiBjYWxsYmFja0lEIGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICBBTE9HVigia1doYXRDYWxsYmFja05vdGlmeTogY2JJRCA9ICVkIiwgY2JJRCk7CisKKyAgICAgICAgICAgICBzd2l0Y2ggKGNiSUQpIHsKKyAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpDQl9JTlBVVF9BVkFJTEFCTEU6IHsKKyAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgaW5kZXg7CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJpbmRleCIsICZpbmRleCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfSU5QVVRfQVZBSUxBQkxFOiBpbmRleCBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+b25IZWljSW5wdXRGcmFtZUF2YWlsYWJsZShpbmRleCk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb2RlYzo6Q0JfT1VUUFVUX0FWQUlMQUJMRTogeworICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBpbmRleDsKKyAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBmbGFnczsKKworICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiaW5kZXgiLCAmaW5kZXgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX09VVFBVVF9BVkFJTEFCTEU6IGluZGV4IGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRTaXplKCJvZmZzZXQiLCAmb2Zmc2V0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9PVVRQVVRfQVZBSUxBQkxFOiBvZmZzZXQgaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZFNpemUoInNpemUiLCAmc2l6ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiQ0JfT1VUUFVUX0FWQUlMQUJMRTogc2l6ZSBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50NjQoInRpbWVVcyIsICZ0aW1lVXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX09VVFBVVF9BVkFJTEFCTEU6IHRpbWVVcyBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIGlmICghbXNnLT5maW5kSW50MzIoImZsYWdzIiwgJmZsYWdzKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9PVVRQVVRfQVZBSUxBQkxFOiBmbGFncyBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgQ29kZWNPdXRwdXRCdWZmZXJJbmZvIGJ1ZmZlckluZm8gPSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgKGludDMyX3Qpb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQzMl90KXNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICh1aW50MzJfdClmbGFnc307CisKKyAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+b25IZWljT3V0cHV0RnJhbWVBdmFpbGFibGUoYnVmZmVySW5mbyk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgIGNhc2UgTWVkaWFDb2RlYzo6Q0JfT1VUUFVUX0ZPUk1BVF9DSEFOR0VEOiB7CisgICAgICAgICAgICAgICAgICAgICBzcDxBTWVzc2FnZT4gZm9ybWF0OworICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRNZXNzYWdlKCJmb3JtYXQiLCAmZm9ybWF0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9PVVRQVVRfRk9STUFUX0NIQU5HRUQ6IGZvcm1hdCBpcyBleHBlY3RlZC4iKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIC8vIEhlcmUgZm9ybWF0IGlzIE1lZGlhQ29kZWMncyBpbnRlcm5hbCBjb3B5IG9mIG91dHB1dCBmb3JtYXQuCisgICAgICAgICAgICAgICAgICAgICAvLyBNYWtlIGEgY29weSBzaW5jZSBvbkhlaWNGb3JtYXRDaGFuZ2VkKCkgbWlnaHQgbW9kaWZ5IGl0LgorICAgICAgICAgICAgICAgICAgICAgc3A8QU1lc3NhZ2U+IGZvcm1hdENvcHk7CisgICAgICAgICAgICAgICAgICAgICBpZiAoZm9ybWF0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXRDb3B5ID0gZm9ybWF0LT5kdXAoKTsKKyAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+b25IZWljRm9ybWF0Q2hhbmdlZChmb3JtYXRDb3B5KTsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgY2FzZSBNZWRpYUNvZGVjOjpDQl9FUlJPUjogeworICAgICAgICAgICAgICAgICAgICAgc3RhdHVzX3QgZXJyOworICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBhY3Rpb25Db2RlOworICAgICAgICAgICAgICAgICAgICAgQVN0cmluZyBkZXRhaWw7CisgICAgICAgICAgICAgICAgICAgICBpZiAoIW1zZy0+ZmluZEludDMyKCJlcnIiLCAmZXJyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCJDQl9FUlJPUjogZXJyIGlzIGV4cGVjdGVkLiIpOworICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgaWYgKCFtc2ctPmZpbmRJbnQzMigiYWN0aW9uIiwgJmFjdGlvbkNvZGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNCX0VSUk9SOiBhY3Rpb24gaXMgZXhwZWN0ZWQuIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICBtc2ctPmZpbmRTdHJpbmcoImRldGFpbCIsICZkZXRhaWwpOworICAgICAgICAgICAgICAgICAgICAgQUxPR0UoIkNvZGVjIHJlcG9ydGVkIGVycm9yKDB4JXgpLCBhY3Rpb25Db2RlKCVkKSwgZGV0YWlsKCVzKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVyciwgYWN0aW9uQ29kZSwgZGV0YWlsLmNfc3RyKCkpOworCisgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm9uSGVpY0NvZGVjRXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgICAgICAgQUxPR0UoImtXaGF0Q2FsbGJhY2tOb3RpZnk6IGNhbGxiYWNrSUQoJWQpIGlzIHVuZXhwZWN0ZWQuIiwgY2JJRCk7CisgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgic2hvdWxkbid0IGJlIGhlcmUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKworfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0NvbXBvc2l0ZVN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZTdiODMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNDb21wb3NpdGVTdHJlYW0uaApAQCAtMCwwICsxLDI2MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0hFSUNfQ09NUE9TSVRFX1NUUkVBTV9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBM19IRUlDX0NPTVBPU0lURV9TVFJFQU1fSAorCisjaW5jbHVkZSA8cXVldWU+CisKKyNpbmNsdWRlIDxndWkvSVByb2R1Y2VyTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxndWkvQ3B1Q29uc3VtZXIuaD4KKworI2luY2x1ZGUgPG1lZGlhL2hhcmR3YXJlL1ZpZGVvQVBJLmg+CisjaW5jbHVkZSA8bWVkaWEvTWVkaWFDb2RlY0J1ZmZlci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQUxvb3Blci5oPgorI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L2ZvdW5kYXRpb24vQU1lc3NhZ2UuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9NZWRpYUNvZGVjLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFNdXhlci5oPgorCisjaW5jbHVkZSAiQ29tcG9zaXRlU3RyZWFtLmgiCisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworY2xhc3MgSGVpY0NvbXBvc2l0ZVN0cmVhbSA6IHB1YmxpYyBDb21wb3NpdGVTdHJlYW0sIHB1YmxpYyBUaHJlYWQsCisgICAgICAgIHB1YmxpYyBDcHVDb25zdW1lcjo6RnJhbWVBdmFpbGFibGVMaXN0ZW5lciB7CitwdWJsaWM6CisgICAgSGVpY0NvbXBvc2l0ZVN0cmVhbSh3cDxDYW1lcmFEZXZpY2VCYXNlPiBkZXZpY2UsCisgICAgICAgICAgICB3cDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrcz4gY2IpOworICAgIH5IZWljQ29tcG9zaXRlU3RyZWFtKCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0aWMgYm9vbCBpc0hlaWNDb21wb3NpdGVTdHJlYW0oY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpOworCisgICAgc3RhdHVzX3QgY3JlYXRlSW50ZXJuYWxTdHJlYW1zKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgY29uc3VtZXJzLAorICAgICAgICAgICAgYm9vbCBoYXNEZWZlcnJlZENvbnN1bWVyLCB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAorICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgaW50ICppZCwgY29uc3QgU3RyaW5nOCYgcGh5c2ljYWxDYW1lcmFJZCwKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gKnN1cmZhY2VJZHMsIGludCBzdHJlYW1TZXRJZCwgYm9vbCBpc1NoYXJlZCkgb3ZlcnJpZGU7CisKKyAgICBzdGF0dXNfdCBkZWxldGVJbnRlcm5hbFN0cmVhbXMoKSBvdmVycmlkZTsKKworICAgIHN0YXR1c190IGNvbmZpZ3VyZVN0cmVhbSgpIG92ZXJyaWRlOworCisgICAgc3RhdHVzX3QgaW5zZXJ0R2JwKFN1cmZhY2VNYXAqIC8qb3V0Ki9vdXRTdXJmYWNlTWFwLCBWZWN0b3I8aW50MzJfdD4qIC8qb3V0Ki9vdXRwdXRTdHJlYW1JZHMsCisgICAgICAgICAgICBpbnQzMl90KiAvKm91dCovY3VycmVudFN0cmVhbUlkKSBvdmVycmlkZTsKKworICAgIHZvaWQgb25TaHV0dGVyKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcywgbnNlY3NfdCB0aW1lc3RhbXApIG92ZXJyaWRlOworCisgICAgaW50IGdldFN0cmVhbUlkKCkgb3ZlcnJpZGUgeyByZXR1cm4gbU1haW5JbWFnZVN0cmVhbUlkOyB9CisKKyAgICAvLyBVc2Ugb25TaHV0dGVyIHRvIGtlZXAgdHJhY2sgb2YgZnJhbWUgbnVtYmVyIDwtPiB0aW1lc3RhbXAgbWFwcGluZy4KKyAgICB2b2lkIG9uQnVmZmVyUmVsZWFzZWQoY29uc3QgQnVmZmVySW5mbyYgYnVmZmVySW5mbykgb3ZlcnJpZGU7CisgICAgdm9pZCBvbkJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwgaW50IHN0cmVhbUlkLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKSBvdmVycmlkZTsKKworICAgIC8vIENwdUNvbnN1bWVyIGxpc3RlbmVyIGltcGxlbWVudGF0aW9uCisgICAgdm9pZCBvbkZyYW1lQXZhaWxhYmxlKGNvbnN0IEJ1ZmZlckl0ZW0mIGl0ZW0pIG92ZXJyaWRlOworCisgICAgLy8gUmV0dXJuIHN0cmVhbSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJuYWwgY2FtZXJhIHN0cmVhbXMKKyAgICBzdGF0aWMgc3RhdHVzX3QgZ2V0Q29tcG9zaXRlU3RyZWFtSW5mbyhjb25zdCBPdXRwdXRTdHJlYW1JbmZvICZzdHJlYW1JbmZvLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGNoLCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiogY29tcG9zaXRlT3V0cHV0IC8qb3V0Ki8pOworCisgICAgc3RhdGljIGJvb2wgaXNTaXplU3VwcG9ydGVkQnlIZWlmRW5jb2RlcihpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIGJvb2wqIHVzZUhlaWMsIGJvb2wqIHVzZUdyaWQsIGludDY0X3QqIHN0YWxsLCBBU3RyaW5nKiBoZXZjTmFtZSA9IG51bGxwdHIpOworICAgIHN0YXRpYyBib29sIGlzSW5NZW1vcnlUZW1wRmlsZVN1cHBvcnRlZCgpOworcHJvdGVjdGVkOgorCisgICAgYm9vbCB0aHJlYWRMb29wKCkgb3ZlcnJpZGU7CisgICAgYm9vbCBvblN0cmVhbUJ1ZmZlckVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CisgICAgdm9pZCBvblJlc3VsdEVycm9yKGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgICAgLy8KKyAgICAvLyBIRUlDL0hFVkMgQ29kZWMgcmVsYXRlZCBzdHJ1Y3R1cmVzLCB1dGlsaXR5IGZ1bmN0aW9ucywgYW5kIGNhbGxiYWNrcworICAgIC8vCisgICAgc3RydWN0IENvZGVjT3V0cHV0QnVmZmVySW5mbyB7CisgICAgICAgIGludDMyX3QgaW5kZXg7CisgICAgICAgIGludDMyX3Qgb2Zmc2V0OworICAgICAgICBpbnQzMl90IHNpemU7CisgICAgICAgIGludDY0X3QgdGltZVVzOworICAgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICB9OworCisgICAgc3RydWN0IENvZGVjSW5wdXRCdWZmZXJJbmZvIHsKKyAgICAgICAgaW50MzJfdCBpbmRleDsKKyAgICAgICAgaW50NjRfdCB0aW1lVXM7CisgICAgICAgIHNpemVfdCB0aWxlSW5kZXg7CisgICAgfTsKKworICAgIGNsYXNzIENvZGVjQ2FsbGJhY2tIYW5kbGVyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGV4cGxpY2l0IENvZGVjQ2FsbGJhY2tIYW5kbGVyKHdwPEhlaWNDb21wb3NpdGVTdHJlYW0+IHBhcmVudCkgeworICAgICAgICAgICAgbVBhcmVudCA9IHBhcmVudDsKKyAgICAgICAgfQorICAgICAgICB2aXJ0dWFsIHZvaWQgb25NZXNzYWdlUmVjZWl2ZWQoY29uc3Qgc3A8QU1lc3NhZ2U+ICZtc2cpOworICAgIHByaXZhdGU6CisgICAgICAgIHdwPEhlaWNDb21wb3NpdGVTdHJlYW0+IG1QYXJlbnQ7CisgICAgfTsKKworICAgIGVudW0geworICAgICAgICBrV2hhdENhbGxiYWNrTm90aWZ5LAorICAgIH07CisKKyAgICBib29sICAgICAgICAgICAgICBtVXNlSGVpYzsKKyAgICBzcDxNZWRpYUNvZGVjPiAgICBtQ29kZWM7CisgICAgc3A8QUxvb3Blcj4gICAgICAgbUNvZGVjTG9vcGVyLCBtQ2FsbGJhY2tMb29wZXI7CisgICAgc3A8Q29kZWNDYWxsYmFja0hhbmRsZXI+IG1Db2RlY0NhbGxiYWNrSGFuZGxlcjsKKyAgICBzcDxBTWVzc2FnZT4gICAgICBtQXN5bmNOb3RpZnk7CisgICAgc3A8QU1lc3NhZ2U+ICAgICAgbUZvcm1hdDsKKyAgICBzaXplX3QgICAgICAgICAgICBtTnVtT3V0cHV0VGlsZXM7CisKKyAgICBpbnQzMl90ICAgICAgICAgICBtT3V0cHV0V2lkdGgsIG1PdXRwdXRIZWlnaHQ7CisgICAgc2l6ZV90ICAgICAgICAgICAgbU1heEhlaWNCdWZmZXJTaXplOworICAgIGludDMyX3QgICAgICAgICAgIG1HcmlkV2lkdGgsIG1HcmlkSGVpZ2h0OworICAgIHNpemVfdCAgICAgICAgICAgIG1HcmlkUm93cywgbUdyaWRDb2xzOworICAgIGJvb2wgICAgICAgICAgICAgIG1Vc2VHcmlkOyAvLyBXaGV0aGVyIHRvIHVzZSBmcmFtZXdvcmsgWVVWIGZyYW1lIHRpbGluZy4KKworICAgIHN0YXRpYyBjb25zdCBpbnQ2NF90IGtOb0ZyYW1lRHJvcE1heFB0c0dhcCA9IC0xMDAwMDAwOworICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IGtOb0dyaWRPcFJhdGUgPSAzMDsKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrR3JpZE9wUmF0ZSA9IDEyMDsKKworICAgIHZvaWQgb25IZWljT3V0cHV0RnJhbWVBdmFpbGFibGUoY29uc3QgQ29kZWNPdXRwdXRCdWZmZXJJbmZvJiBidWZmZXJJbmZvKTsKKyAgICB2b2lkIG9uSGVpY0lucHV0RnJhbWVBdmFpbGFibGUoaW50MzJfdCBpbmRleCk7ICAvLyBPbmx5IGNhbGxlZCBmb3IgWVVWIGlucHV0IG1vZGUuCisgICAgdm9pZCBvbkhlaWNGb3JtYXRDaGFuZ2VkKHNwPEFNZXNzYWdlPiYgbmV3Rm9ybWF0KTsKKyAgICB2b2lkIG9uSGVpY0NvZGVjRXJyb3IoKTsKKworICAgIHN0YXR1c190IGluaXRpYWxpemVDb2RlYyh1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LAorICAgICAgICAgICAgY29uc3Qgc3A8Q2FtZXJhRGV2aWNlQmFzZT4mIGNhbWVyYURldmljZSk7CisgICAgdm9pZCBkZWluaXRDb2RlYygpOworCisgICAgLy8KKyAgICAvLyBDb21wb3NpdGUgc3RyZWFtIHJlbGF0ZWQgc3RydWN0dXJlcywgdXRpbGl0eSBmdW5jdGlvbnMgYW5kIGNhbGxiYWNrcy4KKyAgICAvLworICAgIHN0cnVjdCBJbnB1dEZyYW1lIHsKKyAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICBvcmllbnRhdGlvbjsKKyAgICAgICAgaW50MzJfdCAgICAgICAgICAgICAgICAgICBxdWFsaXR5OworCisgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgICAgICAgICAgYXBwU2VnbWVudEJ1ZmZlcjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Q29kZWNPdXRwdXRCdWZmZXJJbmZvPiBjb2RlY091dHB1dEJ1ZmZlcnM7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxDYW1lcmFNZXRhZGF0YT4gICAgcmVzdWx0OworCisgICAgICAgIC8vIEZpZWxkcyB0aGF0IGFyZSBvbmx5IGFwcGxpY2FibGUgdG8gSEVWQyB0aWxpbmcuCisgICAgICAgIENwdUNvbnN1bWVyOjpMb2NrZWRCdWZmZXIgICAgICAgICAgeXV2QnVmZmVyOworICAgICAgICBzdGQ6OnZlY3RvcjxDb2RlY0lucHV0QnVmZmVySW5mbz4gIGNvZGVjSW5wdXRCdWZmZXJzOworCisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgZXJyb3I7CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOb3RpZmllZDsKKyAgICAgICAgaW50NjRfdCAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlcjsKKworICAgICAgICBzcDxBTWVzc2FnZT4gICAgICAgICAgICAgIGZvcm1hdDsKKyAgICAgICAgc3A8TWVkaWFNdXhlcj4gICAgICAgICAgICBtdXhlcjsKKyAgICAgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICBmZW5jZUZkOworICAgICAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgIGZpbGVGZDsKKyAgICAgICAgc3NpemVfdCAgICAgICAgICAgICAgICAgICB0cmFja0luZGV4OworICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyICAgICAgICphbmI7CisKKyAgICAgICAgYm9vbCAgICAgICAgICAgICAgICAgICAgICBhcHBTZWdtZW50V3JpdHRlbjsKKyAgICAgICAgc2l6ZV90ICAgICAgICAgICAgICAgICAgICBwZW5kaW5nT3V0cHV0VGlsZXM7CisgICAgICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgY29kZWNJbnB1dENvdW50ZXI7CisKKyAgICAgICAgSW5wdXRGcmFtZSgpIDogb3JpZW50YXRpb24oMCksIHF1YWxpdHkoa0RlZmF1bHRKcGVnUXVhbGl0eSksIGVycm9yKGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JOb3RpZmllZChmYWxzZSksIGZyYW1lTnVtYmVyKC0xKSwgZmVuY2VGZCgtMSksIGZpbGVGZCgtMSksCisgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrSW5kZXgoLTEpLCBhbmIobnVsbHB0ciksIGFwcFNlZ21lbnRXcml0dGVuKGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcGVuZGluZ091dHB1dFRpbGVzKDApLCBjb2RlY0lucHV0Q291bnRlcigwKSB7IH0KKyAgICB9OworCisgICAgdm9pZCBjb21waWxlUGVuZGluZ0lucHV0TG9ja2VkKCk7CisgICAgLy8gRmluZCBmaXJzdCBjb21wbGV0ZSBhbmQgdmFsaWQgZnJhbWUgd2l0aCBzbWFsbGVzdCB0aW1lc3RhbXAKKyAgICBib29sIGdldE5leHRSZWFkeUlucHV0TG9ja2VkKGludDY0X3QgKmN1cnJlbnRUcyAvKm91dCovKTsKKyAgICAvLyBGaW5kIG5leHQgZmFpbGluZyBmcmFtZSBudW1iZXIgd2l0aCBzbWFsbGVzdCB0aW1lc3RhbXAgYW5kIHJldHVybiByZXNwZWN0aXZlIGZyYW1lIG51bWJlcgorICAgIGludDY0X3QgZ2V0TmV4dEZhaWxpbmdJbnB1dExvY2tlZChpbnQ2NF90ICpjdXJyZW50VHMgLypvdXQqLyk7CisKKyAgICBzdGF0dXNfdCBwcm9jZXNzSW5wdXRGcmFtZShuc2Vjc190IHRpbWVzdGFtcCwgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSk7CisgICAgc3RhdHVzX3QgcHJvY2Vzc0NvZGVjSW5wdXRGcmFtZShJbnB1dEZyYW1lICZpbnB1dEZyYW1lKTsKKyAgICBzdGF0dXNfdCBzdGFydE11eGVyRm9ySW5wdXRGcmFtZShuc2Vjc190IHRpbWVzdGFtcCwgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSk7CisgICAgc3RhdHVzX3QgcHJvY2Vzc0FwcFNlZ21lbnQobnNlY3NfdCB0aW1lc3RhbXAsIElucHV0RnJhbWUgJmlucHV0RnJhbWUpOworICAgIHN0YXR1c190IHByb2Nlc3NPbmVDb2RlY091dHB1dEZyYW1lKG5zZWNzX3QgdGltZXN0YW1wLCBJbnB1dEZyYW1lICZpbnB1dEZyYW1lKTsKKyAgICBzdGF0dXNfdCBwcm9jZXNzQ29tcGxldGVkSW5wdXRGcmFtZShuc2Vjc190IHRpbWVzdGFtcCwgSW5wdXRGcmFtZSAmaW5wdXRGcmFtZSk7CisKKyAgICB2b2lkIHJlbGVhc2VJbnB1dEZyYW1lTG9ja2VkKElucHV0RnJhbWUgKmlucHV0RnJhbWUgLypvdXQqLyk7CisgICAgdm9pZCByZWxlYXNlSW5wdXRGcmFtZXNMb2NrZWQoKTsKKworICAgIHNpemVfdCBmaW5kQXBwU2VnbWVudHNTaXplKGNvbnN0IHVpbnQ4X3QqIGFwcFNlZ21lbnRCdWZmZXIsIHNpemVfdCBtYXhTaXplLAorICAgICAgICAgICAgc2l6ZV90KiBhcHAxU2VnbWVudFNpemUpOworICAgIGludDY0X3QgZmluZFRpbWVzdGFtcEluTnNMb2NrZWQoaW50NjRfdCB0aW1lSW5Vcyk7CisgICAgc3RhdHVzX3QgY29weU9uZVl1dlRpbGUoc3A8TWVkaWFDb2RlY0J1ZmZlcj4mIGNvZGVjQnVmZmVyLAorICAgICAgICAgICAgY29uc3QgQ3B1Q29uc3VtZXI6OkxvY2tlZEJ1ZmZlciYgeXV2QnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90IHRvcCwgc2l6ZV90IGxlZnQsIHNpemVfdCB3aWR0aCwgc2l6ZV90IGhlaWdodCk7CisgICAgdm9pZCBpbml0Q29weVJvd0Z1bmN0aW9uKGludDMyX3Qgd2lkdGgpOworICAgIHN0YXRpYyBzaXplX3QgY2FsY0FwcFNlZ21lbnRNYXhTaXplKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBpbmZvKTsKKworICAgIHN0YXRpYyBjb25zdCBuc2Vjc190IGtXYWl0RHVyYXRpb24gPSAxMDAwMDAwMDsgLy8gMTAgbXMKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrRGVmYXVsdEpwZWdRdWFsaXR5ID0gOTk7CisgICAgc3RhdGljIGNvbnN0IGF1dG8ga0pwZWdEYXRhU3BhY2UgPSBIQUxfREFUQVNQQUNFX1YwX0pGSUY7CisgICAgc3RhdGljIGNvbnN0IGFuZHJvaWRfZGF0YXNwYWNlIGtBcHBTZWdtZW50RGF0YVNwYWNlID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGFuZHJvaWRfZGF0YXNwYWNlPihIQUxfREFUQVNQQUNFX0pQRUdfQVBQX1NFR01FTlRTKTsKKyAgICBzdGF0aWMgY29uc3QgYW5kcm9pZF9kYXRhc3BhY2Uga0hlaWZEYXRhU3BhY2UgPQorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KEhBTF9EQVRBU1BBQ0VfSEVJRik7CisgICAgLy8gVXNlIHRoZSBsaW1pdCBvZiBwaXBlbGluZSBkZXB0aCBpbiB0aGUgQVBJIHNlcGMgYXMgbWF4aW11bSBudW1iZXIgb2YgYWNxdWlyZWQKKyAgICAvLyBhcHAgc2VnbWVudCBidWZmZXJzLgorICAgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBrTWF4QWNxdWlyZWRBcHBTZWdtZW50ID0gODsKKworICAgIGludCAgICAgICAgICAgICAgIG1BcHBTZWdtZW50U3RyZWFtSWQsIG1BcHBTZWdtZW50U3VyZmFjZUlkOworICAgIHNwPENwdUNvbnN1bWVyPiAgIG1BcHBTZWdtZW50Q29uc3VtZXI7CisgICAgc3A8U3VyZmFjZT4gICAgICAgbUFwcFNlZ21lbnRTdXJmYWNlOworICAgIHNpemVfdCAgICAgICAgICAgIG1BcHBTZWdtZW50TWF4U2l6ZTsKKyAgICBDYW1lcmFNZXRhZGF0YSAgICBtU3RhdGljSW5mbzsKKworICAgIGludCAgICAgICAgICAgICAgIG1NYWluSW1hZ2VTdHJlYW1JZCwgbU1haW5JbWFnZVN1cmZhY2VJZDsKKyAgICBzcDxTdXJmYWNlPiAgICAgICBtTWFpbkltYWdlU3VyZmFjZTsKKyAgICBzcDxDcHVDb25zdW1lcj4gICBtTWFpbkltYWdlQ29uc3VtZXI7IC8vIE9ubHkgYXBwbGljYWJsZSBmb3IgSEVWQyBjb2RlYy4KKyAgICBib29sICAgICAgICAgICAgICBtWXV2QnVmZmVyQWNxdWlyZWQ7IC8vIE9ubHkgYXBwbGljYWJsZSB0byBIRVZDIGNvZGVjCisKKyAgICBzdGF0aWMgY29uc3QgaW50MzJfdCBrTWF4T3V0cHV0U3VyZmFjZVByb2R1Y2VyQ291bnQgPSAxOworICAgIHNwPFN1cmZhY2U+ICAgICAgIG1PdXRwdXRTdXJmYWNlOworICAgIHNwPFByb2R1Y2VyTGlzdGVuZXI+IG1Qcm9kdWNlckxpc3RlbmVyOworICAgIGludDMyX3QgICAgICAgICAgIG1EZXF1ZXVlZE91dHB1dEJ1ZmZlckNudDsKKworICAgIC8vIE1hcCBmcm9tIGZyYW1lIG51bWJlciB0byBKUEVHIHNldHRpbmcgb2Ygb3JpZW50YXRpb24rcXVhbGl0eQorICAgIHN0ZDo6bWFwPGludDY0X3QsIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4gbVNldHRpbmdzQnlGcmFtZU51bWJlcjsKKyAgICAvLyBNYXAgZnJvbSB0aW1lc3RhbXAgdG8gSlBFRyBzZXR0aW5nIG9mIG9yaWVudGF0aW9uK3F1YWxpdHkKKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+IG1TZXR0aW5nc0J5VGltZXN0YW1wOworCisgICAgLy8gS2VlcCBhbGwgaW5jb21pbmcgQVBQIHNlZ21lbnQgQmxvYiBidWZmZXIgcGVuZGluZyBmdXJ0aGVyIHByb2Nlc3NpbmcuCisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gbUlucHV0QXBwU2VnbWVudEJ1ZmZlcnM7CisgICAgaW50MzJfdCAgICAgICAgICAgbUxvY2tlZEFwcFNlZ21lbnRCdWZmZXJDbnQ7CisKKyAgICAvLyBLZWVwIGFsbCBpbmNvbWluZyBIRUlDIGJsb2IgYnVmZmVyIHBlbmRpbmcgZnVydGhlciBwcm9jZXNzaW5nLgorICAgIHN0ZDo6dmVjdG9yPENvZGVjT3V0cHV0QnVmZmVySW5mbz4gbUNvZGVjT3V0cHV0QnVmZmVyczsKKyAgICBzdGQ6OnF1ZXVlPGludDY0X3Q+IG1Db2RlY091dHB1dEJ1ZmZlclRpbWVzdGFtcHM7CisgICAgc2l6ZV90IG1Db2RlY091dHB1dENvdW50ZXI7CisKKyAgICAvLyBLZWVwIGFsbCBpbmNvbWluZyBZdXYgYnVmZmVyIHBlbmRpbmcgdGlsaW5nIGFuZCBlbmNvZGluZyAoZm9yIEhFVkMgWVVWIHRpbGluZyBvbmx5KQorICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IG1JbnB1dFl1dkJ1ZmZlcnM7CisgICAgLy8gS2VlcCBhbGwgY29kZWMgaW5wdXQgYnVmZmVycyByZWFkeSB0byBiZSBmaWxsZWQgb3V0IChmb3IgSEVWQyBZVVYgdGlsaW5nIG9ubHkpCisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gbUNvZGVjSW5wdXRCdWZmZXJzOworCisgICAgLy8gQXJ0aWZpY2lhbCBzdHJpY3RseSBpbmNyZW1lbnRhbCBZVVYgZ3JpZCB0aW1lc3RhbXAgdG8gbWFrZSBlbmNvZGVyIGhhcHB5LgorICAgIGludDY0X3QgbUdyaWRUaW1lc3RhbXBVczsKKworICAgIC8vIEluIG1vc3QgY29tbW9uIHVzZSBjYXNlLCBlbnRyaWVzIGFyZSBhY2Nlc3NlZCBpbiBvcmRlci4KKyAgICBzdGQ6Om1hcDxpbnQ2NF90LCBJbnB1dEZyYW1lPiBtUGVuZGluZ0lucHV0RnJhbWVzOworCisgICAgLy8gRnVuY3Rpb24gcG9pbnRlciBvZiBsaWJ5dXYgcm93IGNvcHkuCisgICAgdm9pZCAoKm1GbkNvcHlSb3cpKGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZHN0LCBpbnQgd2lkdGgpOworfTsKKworfTsgLy8gbmFtZXNwYWNlIGNhbWVyYTMKK307IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAvL0FORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBM19IRUlDX0NPTVBPU0lURV9TVFJFQU1fSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljRW5jb2RlckluZm9NYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0VuY29kZXJJbmZvTWFuYWdlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdjYzJiZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2FwaTIvSGVpY0VuY29kZXJJbmZvTWFuYWdlci5jcHAKQEAgLTAsMCArMSwzNDMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjZGVmaW5lIExPR19UQUcgIkhlaWNFbmNvZGVySW5mb01hbmFnZXIiCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHJlZ2V4PgorCisjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KKyNpbmNsdWRlIDxsb2cvbG9nX21haW4uaD4KKyNpbmNsdWRlIDxzeXN0ZW0vZ3JhcGhpY3MuaD4KKworI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhQ29kZWNMaXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9NZWRpYURlZnMuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FCdWZmZXIuaD4KKworI2luY2x1ZGUgIkhlaWNFbmNvZGVySW5mb01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCitIZWljRW5jb2RlckluZm9NYW5hZ2VyOjpIZWljRW5jb2RlckluZm9NYW5hZ2VyKCkgOgorICAgICAgICBtSXNJbml0ZWQoZmFsc2UpLAorICAgICAgICBtTWluU2l6ZUhlaWMoMCwgMCksCisgICAgICAgIG1NYXhTaXplSGVpYyhJTlQzMl9NQVgsIElOVDMyX01BWCksCisgICAgICAgIG1IYXNIRVZDKGZhbHNlKSwKKyAgICAgICAgbUhhc0hFSUMoZmFsc2UpLAorICAgICAgICBtRGlzYWJsZUdyaWQoZmFsc2UpIHsKKyAgICBpZiAoaW5pdGlhbGl6ZSgpID09IE9LKSB7CisgICAgICAgIG1Jc0luaXRlZCA9IHRydWU7CisgICAgfQorfQorCitIZWljRW5jb2RlckluZm9NYW5hZ2VyOjp+SGVpY0VuY29kZXJJbmZvTWFuYWdlcigpIHsKK30KKworYm9vbCBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjppc1NpemVTdXBwb3J0ZWQoaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQsIGJvb2wqIHVzZUhlaWMsCisgICAgICAgIGJvb2wqIHVzZUdyaWQsIGludDY0X3QqIHN0YWxsLCBBU3RyaW5nKiBoZXZjTmFtZSkgY29uc3QgeworICAgIGlmICh1c2VIZWljID09IG51bGxwdHIgfHwgdXNlR3JpZCA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCBwYXJhbWV0ZXJzOiB1c2VIZWljICVwLCB1c2VHcmlkICVwIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHVzZUhlaWMsIHVzZUdyaWQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghbUlzSW5pdGVkKSByZXR1cm4gZmFsc2U7CisKKyAgICBib29sIGNob29zZUhlaWMgPSBmYWxzZSwgZW5hYmxlR3JpZCA9IHRydWU7CisgICAgaWYgKG1IYXNIRUlDICYmIHdpZHRoID49IG1NaW5TaXplSGVpYy5maXJzdCAmJgorICAgICAgICAgICAgaGVpZ2h0ID49IG1NaW5TaXplSGVpYy5zZWNvbmQgJiYgd2lkdGggPD0gbU1heFNpemVIZWljLmZpcnN0ICYmCisgICAgICAgICAgICBoZWlnaHQgPD0gbU1heFNpemVIZWljLnNlY29uZCkgeworICAgICAgICBjaG9vc2VIZWljID0gdHJ1ZTsKKyAgICAgICAgZW5hYmxlR3JpZCA9IGZhbHNlOworICAgIH0gZWxzZSBpZiAobUhhc0hFVkMpIHsKKyAgICAgICAgYm9vbCBmdWxsU2l6ZVN1cHBvcnRlZEJ5SGV2YyA9ICh3aWR0aCA+PSBtTWluU2l6ZUhldmMuZmlyc3QgJiYKKyAgICAgICAgICAgICAgICBoZWlnaHQgPj0gbU1pblNpemVIZXZjLnNlY29uZCAmJgorICAgICAgICAgICAgICAgIHdpZHRoIDw9IG1NYXhTaXplSGV2Yy5maXJzdCAmJgorICAgICAgICAgICAgICAgIGhlaWdodCA8PSBtTWF4U2l6ZUhldmMuc2Vjb25kKTsKKyAgICAgICAgaWYgKGZ1bGxTaXplU3VwcG9ydGVkQnlIZXZjICYmIChtRGlzYWJsZUdyaWQgfHwKKyAgICAgICAgICAgICAgICAod2lkdGggPD0gMTkyMCAmJiBoZWlnaHQgPD0gMTA4MCkpKSB7CisgICAgICAgICAgICBlbmFibGVHcmlkID0gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGhldmNOYW1lICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICpoZXZjTmFtZSA9IG1IZXZjTmFtZTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIE5vIGVuY29kZXIgYXZhaWxhYmxlIGZvciB0aGUgcmVxdWVzdGVkIHNpemUuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoc3RhbGwgIT0gbnVsbHB0cikgeworICAgICAgICAvLyBGaW5kIHByZWZlcnJlZCBlbmNvZGVyIHdoaWNoIGFkdmVydGlzZQorICAgICAgICAvLyAibWVhc3VyZWQtZnJhbWUtcmF0ZS1XSURUSHhIRUlHSFQtcmFuZ2UiIGtleS4KKyAgICAgICAgY29uc3QgRnJhbWVSYXRlTWFwcyYgbWFwcyA9CisgICAgICAgICAgICAgICAgKGNob29zZUhlaWMgJiYgbUhlaWNGcmFtZVJhdGVNYXBzLnNpemUoKSA+IDApID8KKyAgICAgICAgICAgICAgICBtSGVpY0ZyYW1lUmF0ZU1hcHMgOiBtSGV2Y0ZyYW1lUmF0ZU1hcHM7CisgICAgICAgIGNvbnN0IGF1dG8mIGNsb3Nlc3RTaXplID0gZmluZENsb3Nlc3RTaXplKG1hcHMsIHdpZHRoLCBoZWlnaHQpOworICAgICAgICBpZiAoY2xvc2VzdFNpemUgPT0gbWFwcy5lbmQoKSkgeworICAgICAgICAgICAgLy8gVGhlICJtZWFzdXJlZC1mcmFtZS1yYXRlLVdJRFRIeEhFSUdIVC1yYW5nZSIga2V5IGlzIG9wdGlvbmFsLgorICAgICAgICAgICAgLy8gSGFyZGNvZGUgdG8gc29tZSBkZWZhdWx0IHZhbHVlICgzLjMzbXMgKiB0aWxlIGNvdW50KSBiYXNlZCBvbiByZXNvbHV0aW9uLgorICAgICAgICAgICAgKnN0YWxsID0gMzMzMzMzM0xMICogd2lkdGggKiBoZWlnaHQgLyAoa0dyaWRXaWR0aCAqIGtHcmlkSGVpZ2h0KTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGVyaXZlIHN0YWxsIGR1cmF0aW9ucyBiYXNlZCBvbiBhdmVyYWdlIGZwcyBvZiB0aGUgY2xvc2VzdCBzaXplLgorICAgICAgICBjb25zdGV4cHIgaW50NjRfdCBOU0VDX1BFUl9TRUMgPSAxMDAwMDAwMDAwTEw7CisgICAgICAgIGludDMyX3QgYXZnRnBzID0gKGNsb3Nlc3RTaXplLT5zZWNvbmQuZmlyc3QgKyBjbG9zZXN0U2l6ZS0+c2Vjb25kLnNlY29uZCkvMjsKKyAgICAgICAgZmxvYXQgcmF0aW8gPSAxLjBmICogd2lkdGggKiBoZWlnaHQgLworICAgICAgICAgICAgICAgIChjbG9zZXN0U2l6ZS0+Zmlyc3QuZmlyc3QgKiBjbG9zZXN0U2l6ZS0+Zmlyc3Quc2Vjb25kKTsKKyAgICAgICAgKnN0YWxsID0gcmF0aW8gKiBOU0VDX1BFUl9TRUMgLyBhdmdGcHM7CisgICAgfQorCisgICAgKnVzZUhlaWMgPSBjaG9vc2VIZWljOworICAgICp1c2VHcmlkID0gZW5hYmxlR3JpZDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdHVzX3QgSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6aW5pdGlhbGl6ZSgpIHsKKyAgICBtRGlzYWJsZUdyaWQgPSBwcm9wZXJ0eV9nZXRfYm9vbCgiY2FtZXJhLmhlaWMuZGlzYWJsZV9ncmlkIiwgZmFsc2UpOworICAgIHNwPElNZWRpYUNvZGVjTGlzdD4gY29kZWNzTGlzdCA9IE1lZGlhQ29kZWNMaXN0OjpnZXRJbnN0YW5jZSgpOworICAgIGlmIChjb2RlY3NMaXN0ID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gTm8gbWVkaWEgY29kZWMgYXZhaWxhYmxlLgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgc3A8QU1lc3NhZ2U+IGhlaWNEZXRhaWxzID0gZ2V0Q29kZWNEZXRhaWxzKGNvZGVjc0xpc3QsIE1FRElBX01JTUVUWVBFX0lNQUdFX0FORFJPSURfSEVJQyk7CisKKyAgICBpZiAoIWdldEhldmNDb2RlY0RldGFpbHMoY29kZWNzTGlzdCwgTUVESUFfTUlNRVRZUEVfVklERU9fSEVWQykpIHsKKyAgICAgICAgaWYgKGhlaWNEZXRhaWxzICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogRGV2aWNlIG11c3Qgc3VwcG9ydCBIRVZDIGNvZGVjIGlmIEhFSUMgY29kZWMgaXMgYXZhaWxhYmxlISIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisgICAgbUhhc0hFVkMgPSB0cnVlOworCisgICAgLy8gSEVJQyBzaXplIHJhbmdlCisgICAgaWYgKGhlaWNEZXRhaWxzICE9IG51bGxwdHIpIHsKKyAgICAgICAgYXV0byByZXMgPSBnZXRDb2RlY1NpemVSYW5nZShNRURJQV9NSU1FVFlQRV9JTUFHRV9BTkRST0lEX0hFSUMsCisgICAgICAgICAgICAgICAgaGVpY0RldGFpbHMsICZtTWluU2l6ZUhlaWMsICZtTWF4U2l6ZUhlaWMsICZtSGVpY0ZyYW1lUmF0ZU1hcHMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBnZXQgSEVJQyBjb2RlYyBzaXplIHJhbmdlOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKyAgICAgICAgbUhhc0hFSUMgPSB0cnVlOworICAgIH0KKworICAgIHJldHVybiBPSzsKK30KKworc3RhdHVzX3QgSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6Z2V0RnJhbWVSYXRlTWFwcyhzcDxBTWVzc2FnZT4gZGV0YWlscywgRnJhbWVSYXRlTWFwcyogbWFwcykgeworICAgIGlmIChkZXRhaWxzID09IG51bGxwdHIgfHwgbWFwcyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBpbnB1dDogZGV0YWlsczogJXAsIG1hcHM6ICVwIiwgX19GVU5DVElPTl9fLCBkZXRhaWxzLmdldCgpLCBtYXBzKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGRldGFpbHMtPmNvdW50RW50cmllcygpOyBpKyspIHsKKyAgICAgICAgQU1lc3NhZ2U6OlR5cGUgdHlwZTsKKyAgICAgICAgY29uc3QgY2hhciogZW50cnlOYW1lID0gZGV0YWlscy0+Z2V0RW50cnlOYW1lQXQoaSwgJnR5cGUpOworICAgICAgICBpZiAodHlwZSAhPSBBTWVzc2FnZTo6a1R5cGVTdHJpbmcpIGNvbnRpbnVlOworICAgICAgICBzdGQ6OnJlZ2V4IGZyYW1lUmF0ZU5hbWVQYXR0ZXJuKCJtZWFzdXJlZC1mcmFtZS1yYXRlLShbMC05XSspWyp4XShbMC05XSspLXJhbmdlIiwKKyAgICAgICAgICAgICAgICBzdGQ6OnJlZ2V4X2NvbnN0YW50czo6aWNhc2UpOworICAgICAgICBzdGQ6OmNtYXRjaCBzaXplTWF0Y2g7CisgICAgICAgIGlmIChzdGQ6OnJlZ2V4X21hdGNoKGVudHJ5TmFtZSwgc2l6ZU1hdGNoLCBmcmFtZVJhdGVOYW1lUGF0dGVybikgJiYKKyAgICAgICAgICAgICAgICBzaXplTWF0Y2guc2l6ZSgpID09IDMpIHsKKyAgICAgICAgICAgIEFNZXNzYWdlOjpJdGVtRGF0YSBpdGVtID0gZGV0YWlscy0+Z2V0RW50cnlBdChpKTsKKyAgICAgICAgICAgIEFTdHJpbmcgZnBzUmFuZ2VTdHI7CisgICAgICAgICAgICBpZiAoaXRlbS5maW5kKCZmcHNSYW5nZVN0cikpIHsKKyAgICAgICAgICAgICAgICBBTE9HVigiJXM6ICVzIiwgZW50cnlOYW1lLCBmcHNSYW5nZVN0ci5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBzdGQ6OnJlZ2V4IGZyYW1lUmF0ZVBhdHRlcm4oIihbMC05XSspLShbMC05XSspIik7CisgICAgICAgICAgICAgICAgc3RkOjpjbWF0Y2ggZnBzTWF0Y2g7CisgICAgICAgICAgICAgICAgaWYgKHN0ZDo6cmVnZXhfbWF0Y2goZnBzUmFuZ2VTdHIuY19zdHIoKSwgZnBzTWF0Y2gsIGZyYW1lUmF0ZVBhdHRlcm4pICYmCisgICAgICAgICAgICAgICAgICAgICAgICBmcHNNYXRjaC5zaXplKCkgPT0gMykgeworICAgICAgICAgICAgICAgICAgICBtYXBzLT5lbXBsYWNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKHN0b2koc2l6ZU1hdGNoWzFdKSwgc3RvaShzaXplTWF0Y2hbMl0pKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihzdG9pKGZwc01hdGNoWzFdKSwgc3RvaShmcHNNYXRjaFsyXSkpKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmdldENvZGVjU2l6ZVJhbmdlKAorICAgICAgICBjb25zdCBjaGFyKiBjb2RlY05hbWUsCisgICAgICAgIHNwPEFNZXNzYWdlPiBkZXRhaWxzLAorICAgICAgICBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4qIG1pblNpemUsCisgICAgICAgIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiogbWF4U2l6ZSwKKyAgICAgICAgRnJhbWVSYXRlTWFwcyogZnJhbWVSYXRlTWFwcykgeworICAgIGlmIChjb2RlY05hbWUgPT0gbnVsbHB0ciB8fCBtaW5TaXplID09IG51bGxwdHIgfHwgbWF4U2l6ZSA9PSBudWxscHRyIHx8CisgICAgICAgICAgICBkZXRhaWxzID09IG51bGxwdHIgfHwgZnJhbWVSYXRlTWFwcyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgQVN0cmluZyBzaXplUmFuZ2U7CisgICAgYXV0byBoYXNJdGVtID0gZGV0YWlscy0+ZmluZFN0cmluZygic2l6ZS1yYW5nZSIsICZzaXplUmFuZ2UpOworICAgIGlmICghaGFzSXRlbSkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBxdWVyeSBzaXplIHJhbmdlIGZvciBjb2RlYyAlcyIsIF9fRlVOQ1RJT05fXywgY29kZWNOYW1lKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgQUxPR1YoIiVzOiAlcyBjb2RlYydzIHNpemUgcmFuZ2UgaXMgJXMiLCBfX0ZVTkNUSU9OX18sIGNvZGVjTmFtZSwgc2l6ZVJhbmdlLmNfc3RyKCkpOworICAgIHN0ZDo6cmVnZXggcGF0dGVybigiKFswLTldKylbKnhdKFswLTldKyktKFswLTldKylbKnhdKFswLTldKykiKTsKKyAgICBzdGQ6OmNtYXRjaCBtYXRjaDsKKyAgICBpZiAoc3RkOjpyZWdleF9tYXRjaChzaXplUmFuZ2UuY19zdHIoKSwgbWF0Y2gsIHBhdHRlcm4pKSB7CisgICAgICAgIGlmIChtYXRjaC5zaXplKCkgPT0gNSkgeworICAgICAgICAgICAgbWluU2l6ZS0+Zmlyc3QgPSBzdG9pKG1hdGNoWzFdKTsKKyAgICAgICAgICAgIG1pblNpemUtPnNlY29uZCA9IHN0b2kobWF0Y2hbMl0pOworICAgICAgICAgICAgbWF4U2l6ZS0+Zmlyc3QgPSBzdG9pKG1hdGNoWzNdKTsKKyAgICAgICAgICAgIG1heFNpemUtPnNlY29uZCA9IHN0b2kobWF0Y2hbNF0pOworICAgICAgICAgICAgaWYgKG1pblNpemUtPmZpcnN0ID4gbWF4U2l6ZS0+Zmlyc3QgfHwKKyAgICAgICAgICAgICAgICAgICAgbWluU2l6ZS0+c2Vjb25kID4gbWF4U2l6ZS0+c2Vjb25kKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkICVzIGNvZGUgc2l6ZSByYW5nZTogJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjb2RlY05hbWUsIHNpemVSYW5nZS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGF1dG8gcmVzID0gZ2V0RnJhbWVSYXRlTWFwcyhkZXRhaWxzLCBmcmFtZVJhdGVNYXBzKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorCisgICAgcmV0dXJuIE9LOworfQorCitIZWljRW5jb2RlckluZm9NYW5hZ2VyOjpGcmFtZVJhdGVNYXBzOjpjb25zdF9pdGVyYXRvciBIZWljRW5jb2RlckluZm9NYW5hZ2VyOjpmaW5kQ2xvc2VzdFNpemUoCisgICAgICAgIGNvbnN0IEZyYW1lUmF0ZU1hcHMmIG1hcHMsIGludDMyX3Qgd2lkdGgsIGludDMyX3QgaGVpZ2h0KSBjb25zdCB7CisgICAgaW50MzJfdCBtaW5EaWZmID0gSU5UMzJfTUFYOworICAgIEZyYW1lUmF0ZU1hcHM6OmNvbnN0X2l0ZXJhdG9yIGNsb3Nlc3RJdGVyID0gbWFwcy5iZWdpbigpOworICAgIGZvciAoYXV0byBpdGVyID0gbWFwcy5iZWdpbigpOyBpdGVyICE9IG1hcHMuZW5kKCk7IGl0ZXIrKykgeworICAgICAgICAvLyBVc2UgYXJlYSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHNpemVzIHRvIGFwcHJveGltYXRlIHNpemUKKyAgICAgICAgLy8gZGlmZmVyZW5jZS4KKyAgICAgICAgaW50MzJfdCBkaWZmID0gYWJzKGl0ZXItPmZpcnN0LmZpcnN0ICogaXRlci0+Zmlyc3Quc2Vjb25kIC0gd2lkdGggKiBoZWlnaHQpOworICAgICAgICBpZiAoZGlmZiA8IG1pbkRpZmYpIHsKKyAgICAgICAgICAgIGNsb3Nlc3RJdGVyID0gaXRlcjsKKyAgICAgICAgICAgIG1pbkRpZmYgPSBkaWZmOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBjbG9zZXN0SXRlcjsKK30KKworc3A8QU1lc3NhZ2U+IEhlaWNFbmNvZGVySW5mb01hbmFnZXI6OmdldENvZGVjRGV0YWlscygKKyAgICAgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBjb2RlY3NMaXN0LCBjb25zdCBjaGFyKiBuYW1lKSB7CisgICAgc3NpemVfdCBpZHggPSBjb2RlY3NMaXN0LT5maW5kQ29kZWNCeVR5cGUobmFtZSwgdHJ1ZSAvKmVuY29kZXIqLyk7CisgICAgaWYgKGlkeCA8IDApIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm8+IGluZm8gPSBjb2RlY3NMaXN0LT5nZXRDb2RlY0luZm8oaWR4KTsKKyAgICBpZiAoaW5mbyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldCBjb2RlYyBpbmZvIGZvciAlcyIsIF9fRlVOQ1RJT05fXywgbmFtZSk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBjb25zdCBzcDxNZWRpYUNvZGVjSW5mbzo6Q2FwYWJpbGl0aWVzPiBjYXBzID0KKyAgICAgICAgICAgIGluZm8tPmdldENhcGFiaWxpdGllc0ZvcihuYW1lKTsKKyAgICBpZiAoY2FwcyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIGdldCBjYXBhYmlsaXRpZXMgZm9yIGNvZGVjICVzIiwgX19GVU5DVElPTl9fLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGNvbnN0IHNwPEFNZXNzYWdlPiBkZXRhaWxzID0gY2Fwcy0+Z2V0RGV0YWlscygpOworICAgIGlmIChkZXRhaWxzID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IGRldGFpbHMgZm9yIGNvZGVjICVzIiwgX19GVU5DVElPTl9fLCBuYW1lKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgcmV0dXJuIGRldGFpbHM7Cit9CisKK2Jvb2wgSGVpY0VuY29kZXJJbmZvTWFuYWdlcjo6Z2V0SGV2Y0NvZGVjRGV0YWlscygKKyAgICAgICAgc3A8SU1lZGlhQ29kZWNMaXN0PiBjb2RlY3NMaXN0LCBjb25zdCBjaGFyKiBtaW1lKSB7CisgICAgYm9vbCBmb3VuZCA9IGZhbHNlOworICAgIHNzaXplX3QgaWR4ID0gMDsKKyAgICB3aGlsZSAoKGlkeCA9IGNvZGVjc0xpc3QtPmZpbmRDb2RlY0J5VHlwZShtaW1lLCB0cnVlIC8qZW5jb2RlciovLCBpZHgpKSA+PSAwKSB7CisgICAgICAgIGNvbnN0IHNwPE1lZGlhQ29kZWNJbmZvPiBpbmZvID0gY29kZWNzTGlzdC0+Z2V0Q29kZWNJbmZvKGlkeCsrKTsKKyAgICAgICAgaWYgKGluZm8gPT0gbnVsbHB0cikgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0IGNvZGVjIGluZm8gZm9yICVzIiwgX19GVU5DVElPTl9fLCBtaW1lKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmlsdGVyIG91dCBzb2Z0d2FyZSBvbmVzIGFzIHRoZXkgbWF5IGJlIHRvbyBzbG93CisgICAgICAgIGlmICghKGluZm8tPmdldEF0dHJpYnV0ZXMoKSAmIE1lZGlhQ29kZWNJbmZvOjprRmxhZ0lzSGFyZHdhcmVBY2NlbGVyYXRlZCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgY29uc3Qgc3A8TWVkaWFDb2RlY0luZm86OkNhcGFiaWxpdGllcz4gY2FwcyA9CisgICAgICAgICAgICAgICAgaW5mby0+Z2V0Q2FwYWJpbGl0aWVzRm9yKG1pbWUpOworICAgICAgICBpZiAoY2FwcyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFslc10gRmFpbGVkIHRvIGdldCBjYXBhYmlsaXRpZXMiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIGluZm8tPmdldENvZGVjTmFtZSgpKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNvbnN0IHNwPEFNZXNzYWdlPiBkZXRhaWxzID0gY2Fwcy0+Z2V0RGV0YWlscygpOworICAgICAgICBpZiAoZGV0YWlscyA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFslc10gRmFpbGVkIHRvIGdldCBkZXRhaWxzIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBpbmZvLT5nZXRDb2RlY05hbWUoKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIENRIG1vZGUKKyAgICAgICAgQVN0cmluZyBiaXRyYXRlTW9kZXM7CisgICAgICAgIGF1dG8gaGFzSXRlbSA9IGRldGFpbHMtPmZpbmRTdHJpbmcoImZlYXR1cmUtYml0cmF0ZS1tb2RlcyIsICZiaXRyYXRlTW9kZXMpOworICAgICAgICBpZiAoIWhhc0l0ZW0pIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogWyVzXSBGYWlsZWQgdG8gcXVlcnkgYml0cmF0ZSBtb2RlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgaW5mby0+Z2V0Q29kZWNOYW1lKCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgQUxPR1YoIiVzOiBbJXNdIGZlYXR1cmUtYml0cmF0ZS1tb2RlcyB2YWx1ZSBpcyAlZCwgJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaW5mby0+Z2V0Q29kZWNOYW1lKCksIGhhc0l0ZW0sIGJpdHJhdGVNb2Rlcy5jX3N0cigpKTsKKyAgICAgICAgc3RkOjpyZWdleCBwYXR0ZXJuKCIoXnwsKUNRKCR8LCkiLCBzdGQ6OnJlZ2V4X2NvbnN0YW50czo6aWNhc2UpOworICAgICAgICBpZiAoIXN0ZDo6cmVnZXhfc2VhcmNoKGJpdHJhdGVNb2Rlcy5jX3N0cigpLCBwYXR0ZXJuKSkgeworICAgICAgICAgICAgY29udGludWU7IC8vIG1vdmUgb24gdG8gbmV4dCBlbmNvZGVyCisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4gbWluU2l6ZUhldmMsIG1heFNpemVIZXZjOworICAgICAgICBGcmFtZVJhdGVNYXBzIGhldmNGcmFtZVJhdGVNYXBzOworICAgICAgICBhdXRvIHJlcyA9IGdldENvZGVjU2l6ZVJhbmdlKE1FRElBX01JTUVUWVBFX1ZJREVPX0hFVkMsCisgICAgICAgICAgICAgICAgZGV0YWlscywgJm1pblNpemVIZXZjLCAmbWF4U2l6ZUhldmMsICZoZXZjRnJhbWVSYXRlTWFwcyk7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogWyVzXSBGYWlsZWQgdG8gZ2V0IHNpemUgcmFuZ2U6ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgIGluZm8tPmdldENvZGVjTmFtZSgpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGlmIChrR3JpZFdpZHRoIDwgbWluU2l6ZUhldmMuZmlyc3QKKyAgICAgICAgICAgICAgICB8fCBrR3JpZFdpZHRoID4gbWF4U2l6ZUhldmMuZmlyc3QKKyAgICAgICAgICAgICAgICB8fCBrR3JpZEhlaWdodCA8IG1pblNpemVIZXZjLnNlY29uZAorICAgICAgICAgICAgICAgIHx8IGtHcmlkSGVpZ2h0ID4gbWF4U2l6ZUhldmMuc2Vjb25kKSB7CisgICAgICAgICAgICBjb250aW51ZTsgLy8gbW92ZSBvbiB0byBuZXh0IGVuY29kZXIKKyAgICAgICAgfQorCisgICAgICAgIC8vIEZvdW5kOiBzYXZlIG5hbWUsIHNpemUsIGZyYW1lIHJhdGUKKyAgICAgICAgbUhldmNOYW1lID0gaW5mby0+Z2V0Q29kZWNOYW1lKCk7CisgICAgICAgIG1NaW5TaXplSGV2YyA9IG1pblNpemVIZXZjOworICAgICAgICBtTWF4U2l6ZUhldmMgPSBtYXhTaXplSGV2YzsKKyAgICAgICAgbUhldmNGcmFtZVJhdGVNYXBzID0gaGV2Y0ZyYW1lUmF0ZU1hcHM7CisKKyAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gZm91bmQ7Cit9CisKK30gLy9uYW1lc3BhY2UgY2FtZXJhMworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljRW5jb2RlckluZm9NYW5hZ2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9hcGkyL0hlaWNFbmNvZGVySW5mb01hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGVkYmEyCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvYXBpMi9IZWljRW5jb2RlckluZm9NYW5hZ2VyLmgKQEAgLTAsMCArMSw3OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9IRUlDRU5DT0RFUl9JTkZPX01BTkFHRVJfSAorI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0hFSUNFTkNPREVSX0lORk9fTUFOQUdFUl9ICisKKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CisjaW5jbHVkZSA8dXRpbHMvU3Ryb25nUG9pbnRlci5oPgorCisjaW5jbHVkZSA8bWVkaWEvSU1lZGlhQ29kZWNMaXN0Lmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKK2NsYXNzIEhlaWNFbmNvZGVySW5mb01hbmFnZXIgeworcHVibGljOgorICAgIHN0YXRpYyBIZWljRW5jb2RlckluZm9NYW5hZ2VyJiBnZXRJbnN0YW5jZSgpIHsKKyAgICAgICAgc3RhdGljIEhlaWNFbmNvZGVySW5mb01hbmFnZXIgaW5zdGFuY2U7CisgICAgICAgIHJldHVybiBpbnN0YW5jZTsKKyAgICB9CisKKyAgICBib29sIGlzU2l6ZVN1cHBvcnRlZChpbnQzMl90IHdpZHRoLCBpbnQzMl90IGhlaWdodCwKKyAgICAgICAgICAgIGJvb2wqIHVzZUhlaWMsIGJvb2wqIHVzZUdyaWQsIGludDY0X3QqIHN0YWxsLCBBU3RyaW5nKiBoZXZjTmFtZSkgY29uc3Q7CisKKyAgICBzdGF0aWMgY29uc3QgYXV0byBrR3JpZFdpZHRoID0gNTEyOworICAgIHN0YXRpYyBjb25zdCBhdXRvIGtHcmlkSGVpZ2h0ID0gNTEyOworcHJpdmF0ZToKKyAgICBzdHJ1Y3QgU2l6ZVBhaXJIYXNoIHsKKyAgICAgICAgc3RkOjpzaXplX3Qgb3BlcmF0b3IgKCkgKGNvbnN0IHN0ZDo6cGFpcjxpbnQzMl90LGludDMyX3Q+ICZwKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gcC5maXJzdCAqIDMxICsgcC5zZWNvbmQ7CisgICAgICAgIH0KKyAgICB9OworCisgICAgdHlwZWRlZiBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+LAorICAgICAgICAgICAgc3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+LCBTaXplUGFpckhhc2g+IEZyYW1lUmF0ZU1hcHM7CisKKyAgICBIZWljRW5jb2RlckluZm9NYW5hZ2VyKCk7CisgICAgdmlydHVhbCB+SGVpY0VuY29kZXJJbmZvTWFuYWdlcigpOworCisgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZSgpOworICAgIHN0YXR1c190IGdldEZyYW1lUmF0ZU1hcHMoc3A8QU1lc3NhZ2U+IGRldGFpbHMsIEZyYW1lUmF0ZU1hcHMqIG1hcHMpOworICAgIHN0YXR1c190IGdldENvZGVjU2l6ZVJhbmdlKGNvbnN0IGNoYXIqIGNvZGVjTmFtZSwgc3A8QU1lc3NhZ2U+IGRldGFpbHMsCisgICAgICAgICAgICBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4qIG1pblNpemUsIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiogbWF4U2l6ZSwKKyAgICAgICAgICAgIEZyYW1lUmF0ZU1hcHMqIGZyYW1lUmF0ZU1hcHMpOworICAgIEZyYW1lUmF0ZU1hcHM6OmNvbnN0X2l0ZXJhdG9yIGZpbmRDbG9zZXN0U2l6ZShjb25zdCBGcmFtZVJhdGVNYXBzJiBtYXBzLAorICAgICAgICAgICAgaW50MzJfdCB3aWR0aCwgaW50MzJfdCBoZWlnaHQpIGNvbnN0OworICAgIHNwPEFNZXNzYWdlPiBnZXRDb2RlY0RldGFpbHMoc3A8SU1lZGlhQ29kZWNMaXN0PiBjb2RlY3NMaXN0LCBjb25zdCBjaGFyKiBuYW1lKTsKKyAgICBib29sIGdldEhldmNDb2RlY0RldGFpbHMoc3A8SU1lZGlhQ29kZWNMaXN0PiBjb2RlY3NMaXN0LCBjb25zdCBjaGFyKiBtaW1lKTsKKworICAgIGJvb2wgbUlzSW5pdGVkOworICAgIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90PiBtTWluU2l6ZUhlaWMsIG1NYXhTaXplSGVpYzsKKyAgICBzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4gbU1pblNpemVIZXZjLCBtTWF4U2l6ZUhldmM7CisgICAgYm9vbCBtSGFzSEVWQywgbUhhc0hFSUM7CisgICAgQVN0cmluZyBtSGV2Y05hbWU7CisgICAgRnJhbWVSYXRlTWFwcyBtSGVpY0ZyYW1lUmF0ZU1hcHMsIG1IZXZjRnJhbWVSYXRlTWFwczsKKyAgICBib29sIG1EaXNhYmxlR3JpZDsKKworfTsKKworfSAvLyBuYW1lc3BhY2UgY2FtZXJhMworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9IRUlDRU5DT0RFUl9JTkZPX01BTkFHRVJfSApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5jcHAKaW5kZXggY2UwMDZhNy4uNzhmZWIzZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYTJDbGllbnRCYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuY3BwCkBAIC0zMiwxNCArMzIsMTEgQEAKICNpbmNsdWRlICJhcGkyL0NhbWVyYURldmljZUNsaWVudC5oIgogCiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogdXNpbmcgbmFtZXNwYWNlIGNhbWVyYTI7CiAKLXN0YXRpYyBpbnQgZ2V0Q2FsbGluZ1BpZCgpIHsKLSAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOwotfQotCiAvLyBJbnRlcmZhY2UgdXNlZCBieSBDYW1lcmFTZXJ2aWNlCiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUQ2xpZW50QmFzZT4KQEAgLTU3LDEzICs1NCwxMyBAQAogICAgICAgICAgICAgICAgIGNhbWVyYUlkLCBhcGkxQ2FtZXJhSWQsIGNhbWVyYUZhY2luZywgY2xpZW50UGlkLCBjbGllbnRVaWQsIHNlcnZpY2VQaWQpLAogICAgICAgICBtU2hhcmVkQ2FtZXJhQ2FsbGJhY2tzKHJlbW90ZUNhbGxiYWNrKSwKICAgICAgICAgbURldmljZVZlcnNpb24oY2FtZXJhU2VydmljZS0+Z2V0RGV2aWNlVmVyc2lvbihUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyKSksCisgICAgICAgIG1EZXZpY2UobmV3IENhbWVyYTNEZXZpY2UoY2FtZXJhSWQpKSwKICAgICAgICAgbURldmljZUFjdGl2ZShmYWxzZSksIG1BcGkxQ2FtZXJhSWQoYXBpMUNhbWVyYUlkKQogewogICAgIEFMT0dJKCJDYW1lcmEgJXM6IE9wZW5lZC4gQ2xpZW50OiAlcyAoUElEICVkLCBVSUQgJWQpIiwgY2FtZXJhSWQuc3RyaW5nKCksCiAgICAgICAgICAgICBTdHJpbmc4KGNsaWVudFBhY2thZ2VOYW1lKS5zdHJpbmcoKSwgY2xpZW50UGlkLCBjbGllbnRVaWQpOwogCiAgICAgbUluaXRpYWxDbGllbnRQaWQgPSBjbGllbnRQaWQ7Ci0gICAgbURldmljZSA9IG5ldyBDYW1lcmEzRGV2aWNlKGNhbWVyYUlkKTsKICAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKG1EZXZpY2UgPT0gMCwgIkRldmljZSBzaG91bGQgbmV2ZXIgYmUgTlVMTCBoZXJlLiIpOwogfQogCkBAIC03MSw3ICs2OCw3IEBACiBzdGF0dXNfdCBDYW1lcmEyQ2xpZW50QmFzZTxUQ2xpZW50QmFzZT46OmNoZWNrUGlkKGNvbnN0IGNoYXIqIGNoZWNrTG9jYXRpb24pCiAgICAgICAgIGNvbnN0IHsKIAotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBpZiAoY2FsbGluZ1BpZCA9PSBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCkgcmV0dXJuIE5PX0VSUk9SOwogCiAgICAgQUxPR0UoIiVzOiBhdHRlbXB0IHRvIHVzZSBhIGxvY2tlZCBjYW1lcmEgZnJvbSBhIGRpZmZlcmVudCBwcm9jZXNzIgpAQCAtMTg2LDcgKzE4Myw3IEBACiAKICAgICBiaW5kZXI6OlN0YXR1cyByZXMgPSBiaW5kZXI6OlN0YXR1czo6b2soKTsKICAgICAvLyBBbGxvdyBib3RoIGNsaWVudCBhbmQgdGhlIG1lZGlhIHNlcnZlciB0byBkaXNjb25uZWN0IGF0IGFsbCB0aW1lcwotICAgIGludCBjYWxsaW5nUGlkID0gZ2V0Q2FsbGluZ1BpZCgpOworICAgIGludCBjYWxsaW5nUGlkID0gQ2FtZXJhVGhyZWFkU3RhdGU6OmdldENhbGxpbmdQaWQoKTsKICAgICBpZiAoY2FsbGluZ1BpZCAhPSBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCAmJgogICAgICAgICBjYWxsaW5nUGlkICE9IFRDbGllbnRCYXNlOjptU2VydmljZVBpZCkgcmV0dXJuIHJlczsKIApAQCAtMjA2LDggKzIwMyw2IEBACiAgICAgaWYgKG1EZXZpY2UgPT0gMCkgcmV0dXJuOwogICAgIG1EZXZpY2UtPmRpc2Nvbm5lY3QoKTsKIAotICAgIG1EZXZpY2UuY2xlYXIoKTsKLQogICAgIEFMT0dWKCJDYW1lcmEgJXM6IERldGFjaCBjb21wbGV0ZSIsIFRDbGllbnRCYXNlOjptQ2FtZXJhSWRTdHIuc3RyaW5nKCkpOwogfQogCkBAIC0yMTksMTggKzIxNCwxOCBAQAogICAgIE11dGV4OjpBdXRvbG9jayBpY2wobUJpbmRlclNlcmlhbGl6YXRpb25Mb2NrKTsKIAogICAgIGlmIChUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCAhPSAwICYmCi0gICAgICAgIGdldENhbGxpbmdQaWQoKSAhPSBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCkgeworICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpICE9IFRDbGllbnRCYXNlOjptQ2xpZW50UGlkKSB7CiAKICAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgJXM6IENvbm5lY3Rpb24gYXR0ZW1wdCBmcm9tIHBpZCAlZDsgIgogICAgICAgICAgICAgICAgICJjdXJyZW50IGxvY2tlZCB0byBwaWQgJWQiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICBUQ2xpZW50QmFzZTo6bUNhbWVyYUlkU3RyLnN0cmluZygpLAotICAgICAgICAgICAgICAgIGdldENhbGxpbmdQaWQoKSwKKyAgICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgIFRDbGllbnRCYXNlOjptQ2xpZW50UGlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCA9IGdldENhbGxpbmdQaWQoKTsKKyAgICBUQ2xpZW50QmFzZTo6bUNsaWVudFBpZCA9IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nUGlkKCk7CiAKICAgICBUQ2xpZW50QmFzZTo6bVJlbW90ZUNhbGxiYWNrID0gY2xpZW50OwogICAgIG1TaGFyZWRDYW1lcmFDYWxsYmFja3MgPSBjbGllbnQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhMkNsaWVudEJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCmluZGV4IGU3NGZiZGYuLjY2OTM4NDcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmEyQ2xpZW50QmFzZS5oCkBAIC0xMzAsNyArMTMwLDEwIEBACiAgICAgLyoqIENhbWVyYURldmljZUJhc2UgaW5zdGFuY2Ugd3JhcHBpbmcgSEFMMysgZW50cnkgKi8KIAogICAgIGNvbnN0IGludCBtRGV2aWNlVmVyc2lvbjsKLSAgICBzcDxDYW1lcmFEZXZpY2VCYXNlPiAgbURldmljZTsKKworICAgIC8vIFNldCB0byBjb25zdCB0byBhdm9pZCBtRGV2aWNlIGJlaW5nIHVwZGF0ZWQgKHVwZGF0ZSBvZiBzcDw+IGlzIHJhY3kpIGR1cmluZworICAgIC8vIGR1bXBEZXZpY2UgKHdoaWNoIGlzIGltcG9ydGFudCB0byBiZSBsb2NrIGZyZWUgZm9yIGRlYnVnZ2luZyBwdXJwb3NlKQorICAgIGNvbnN0IHNwPENhbWVyYURldmljZUJhc2U+ICBtRGV2aWNlOwogCiAgICAgLyoqIFV0aWxpdHkgbWVtYmVycyAqLwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCmluZGV4IDBjZTQzMTguLmZkYjU2NTcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuY3BwCkBAIC0yMCwzMyArMjAsNTggQEAKIAogI2luY2x1ZGUgIkNhbWVyYVByb3ZpZGVyTWFuYWdlci5oIgogCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlLmg+CisKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8Y2hyb25vPgorI2luY2x1ZGUgImNvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmgiCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxmdXR1cmU+CiAjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmFfY29tbW9uLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oaWRsL21hbmFnZXIvMS4yL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGhpZGwvU2VydmljZU1hbmFnZW1lbnQuaD4KICNpbmNsdWRlIDxmdW5jdGlvbmFsPgogI2luY2x1ZGUgPGNhbWVyYV9tZXRhZGF0YV9oaWRkZW4uaD4KICNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvcGFyc2VpbnQuaD4KKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8aHdiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDx1dGlscy9UcmFjZS5oPgorCisjaW5jbHVkZSAiYXBpMi9IZWljQ29tcG9zaXRlU3RyZWFtLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTsKIHVzaW5nIG5hbWVzcGFjZSA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDsKK3VzaW5nIHN0ZDo6bGl0ZXJhbHM6OmNocm9ub19saXRlcmFsczo6b3BlcmF0b3IiInM7CiAKIG5hbWVzcGFjZSB7Ci0vLyBIYXJkY29kZWQgbmFtZSBmb3IgdGhlIHBhc3N0aHJvdWdoIEhBTCBpbXBsZW1lbnRhdGlvbiwgc2luY2UgaXQgY2FuJ3QgYmUgZGlzY292ZXJlZCB2aWEgdGhlCi0vLyBzZXJ2aWNlIG1hbmFnZXIKLWNvbnN0IHN0ZDo6c3RyaW5nIGtMZWdhY3lQcm92aWRlck5hbWUoImxlZ2FjeS8wIik7Ci1jb25zdCBzdGQ6OnN0cmluZyBrRXh0ZXJuYWxQcm92aWRlck5hbWUoImV4dGVybmFsLzAiKTsKLQorY29uc3QgYm9vbCBrRW5hYmxlTGF6eUhhbChwcm9wZXJ0eV9nZXRfYm9vbCgicm8uY2FtZXJhLmVuYWJsZUxhenlIYWwiLCBmYWxzZSkpOwogfSAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKK2NvbnN0IGZsb2F0IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6a0RlcHRoQVJUb2xlcmFuY2UgPSAuMWY7CisKIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6SGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eQogQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzSGFyZHdhcmVTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eXt9OwogCiBDYW1lcmFQcm92aWRlck1hbmFnZXI6On5DYW1lcmFQcm92aWRlck1hbmFnZXIoKSB7CiB9CiAKK2hhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6aGlkbF9zdHJpbmc+CitDYW1lcmFQcm92aWRlck1hbmFnZXI6OkhhcmR3YXJlU2VydmljZUludGVyYWN0aW9uUHJveHk6Omxpc3RTZXJ2aWNlcygpIHsKKyAgICBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmhpZGxfc3RyaW5nPiByZXQ7CisgICAgYXV0byBtYW5hZ2VyID0gaGFyZHdhcmU6OmRlZmF1bHRTZXJ2aWNlTWFuYWdlcjFfMigpOworICAgIGlmIChtYW5hZ2VyICE9IG51bGxwdHIpIHsKKyAgICAgICAgbWFuYWdlci0+bGlzdE1hbmlmZXN0QnlJbnRlcmZhY2UocHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcjo6ZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICBbJnJldF0oY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpoaWRsX3N0cmluZz4gJnJlZ2lzdGVyZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmVnaXN0ZXJlZDsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisgICAgcmV0dXJuIHJldDsKK30KKwogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppbml0aWFsaXplKHdwPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6U3RhdHVzTGlzdGVuZXI+IGxpc3RlbmVyLAogICAgICAgICBTZXJ2aWNlSW50ZXJhY3Rpb25Qcm94eSogcHJveHkpIHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwpAQCAtNTYsNiArODEsOCBAQAogICAgIH0KICAgICBtTGlzdGVuZXIgPSBsaXN0ZW5lcjsKICAgICBtU2VydmljZVByb3h5ID0gcHJveHk7CisgICAgbURldmljZVN0YXRlID0gc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPj4oCisgICAgICAgIHByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZTo6Tk9STUFMKTsKIAogICAgIC8vIFJlZ2lzdGVyaW5nIHdpbGwgdHJpZ2dlciBub3RpZmljYXRpb25zIGZvciBhbGwgYWxyZWFkeS1rbm93biBwcm92aWRlcnMKICAgICBib29sIHN1Y2Nlc3MgPSBtU2VydmljZVByb3h5LT5yZWdpc3RlckZvck5vdGlmaWNhdGlvbnMoCkBAIC02Nyw5ICs5NCwxMiBAQAogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgLy8gU2VlIGlmIHRoZXJlJ3MgYSBwYXNzdGhyb3VnaCBIQUwsIGJ1dCBsZXQncyBub3QgY29tcGxhaW4gaWYgdGhlcmUncyBub3QKLSAgICBhZGRQcm92aWRlckxvY2tlZChrTGVnYWN5UHJvdmlkZXJOYW1lLCAvKmV4cGVjdGVkKi8gZmFsc2UpOwotICAgIGFkZFByb3ZpZGVyTG9ja2VkKGtFeHRlcm5hbFByb3ZpZGVyTmFtZSwgLypleHBlY3RlZCovIGZhbHNlKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgaW5zdGFuY2UgOiBtU2VydmljZVByb3h5LT5saXN0U2VydmljZXMoKSkgeworICAgICAgICB0aGlzLT5hZGRQcm92aWRlckxvY2tlZChpbnN0YW5jZSk7CisgICAgfQorCisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOwogCiAgICAgcmV0dXJuIE9LOwogfQpAQCAtNzgsNyArMTA4LDEzIEBACiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKICAgICBpbnQgY291bnQgPSAwOwogICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7Ci0gICAgICAgIGNvdW50ICs9IHByb3ZpZGVyLT5tVW5pcXVlQ2FtZXJhSWRzLnNpemUoKTsKKyAgICAgICAgZm9yIChhdXRvJiBpZCA6IHByb3ZpZGVyLT5tVW5pcXVlQ2FtZXJhSWRzKSB7CisgICAgICAgICAgICAvLyBIaWRkZW4gc2VjdXJlIGNhbWVyYSBpZHMgYXJlIG5vdCB0byBiZSBleHBvc2VkIHRvIGNhbWVyYTEgYXBpLgorICAgICAgICAgICAgaWYgKGlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYUxvY2tlZChpZCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgIH0KICAgICB9CiAgICAgcmV0dXJuIGNvdW50OwogfQpAQCAtMTAxLDEwICsxMzcsMTQgQEAKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHByb3ZpZGVyRGV2aWNlSWRzID0gcHJvdmlkZXItPm1VbmlxdWVBUEkxQ29tcGF0aWJsZUNhbWVyYUlkczsKIAogICAgICAgICAvLyBBUEkxIGFwcCBkb2Vzbid0IGhhbmRsZSBsb2dpY2FsIGFuZCBwaHlzaWNhbCBjYW1lcmEgZGV2aWNlcyB3ZWxsLiBTbwotICAgICAgICAvLyBmb3IgZWFjaCBbbG9naWNhbCwgcGh5c2ljYWwxLCBwaHlzaWNhbDIsIC4uLl0gaWQgY29tYm8sIG9ubHkgdGFrZSB0aGUKLSAgICAgICAgLy8gZmlyc3QgaWQgYWR2ZXJ0aXNlZCBieSBIQUwsIGFuZCBmaWx0ZXIgb3V0IHRoZSByZXN0LgorICAgICAgICAvLyBmb3IgZWFjaCBjYW1lcmEgZmFjaW5nLCBvbmx5IHRha2UgdGhlIGZpcnN0IGlkIGFkdmVydGlzZWQgYnkgSEFMIGluCisgICAgICAgIC8vIGFsbCBbbG9naWNhbCwgcGh5c2ljYWwxLCBwaHlzaWNhbDIsIC4uLl0gaWQgY29tYm9zLCBhbmQgZmlsdGVyIG91dCB0aGUgcmVzdC4KICAgICAgICAgZmlsdGVyTG9naWNhbENhbWVyYUlkc0xvY2tlZChwcm92aWRlckRldmljZUlkcyk7Ci0KKyAgICAgICAgLy8gSGlkZGVuIHNlY3VyZSBjYW1lcmEgaWRzIGFyZSBub3QgdG8gYmUgZXhwb3NlZCB0byBjYW1lcmExIGFwaS4KKyAgICAgICAgcHJvdmlkZXJEZXZpY2VJZHMuZXJhc2Uoc3RkOjpyZW1vdmVfaWYocHJvdmlkZXJEZXZpY2VJZHMuYmVnaW4oKSwgcHJvdmlkZXJEZXZpY2VJZHMuZW5kKCksCisgICAgICAgICAgICAgICAgW3RoaXNdKGNvbnN0IHN0ZDo6c3RyaW5nJiBzKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLT5pc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmFMb2NrZWQocyk7fSksCisgICAgICAgICAgICAgICAgcHJvdmlkZXJEZXZpY2VJZHMuZW5kKCkpOwogICAgICAgICBkZXZpY2VJZHMuaW5zZXJ0KGRldmljZUlkcy5lbmQoKSwgcHJvdmlkZXJEZXZpY2VJZHMuYmVnaW4oKSwgcHJvdmlkZXJEZXZpY2VJZHMuZW5kKCkpOwogICAgIH0KIApAQCAtMTc0LDYgKzIxNCwxOSBAQAogICAgIHJldHVybiBkZXZpY2VJbmZvLT5nZXRDYW1lcmFJbmZvKGluZm8pOwogfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sCisgICAgICAgIGJvb2wgKnN0YXR1cyAvKm91dCovKSBjb25zdCB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKKworICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKKyAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKKyAgICB9CisKKyAgICByZXR1cm4gZGV2aWNlSW5mby0+aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZChjb25maWd1cmF0aW9uLCBzdGF0dXMpOworfQorCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjb25zdCBzdGQ6OnN0cmluZyAmaWQsCiAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwpAQCAtMjAzLDI2ICsyNTYsMTUgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLWJvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdXBwb3J0U2V0VG9yY2hNb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCkgeworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnN1cHBvcnRTZXRUb3JjaE1vZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmlkKSBjb25zdCB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUludGVyZmFjZU11dGV4KTsKLSAgICBib29sIHN1cHBvcnQgPSBmYWxzZTsKICAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgewogICAgICAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CiAgICAgICAgIGlmIChkZXZpY2VJbmZvICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgIGF1dG8gcmV0ID0gcHJvdmlkZXItPm1JbnRlcmZhY2UtPmlzU2V0VG9yY2hNb2RlU3VwcG9ydGVkKAotICAgICAgICAgICAgICAgIFsmc3VwcG9ydF0oYXV0byBzdGF0dXMsIGJvb2wgc3VwcG9ydGVkKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewotICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydCA9IHN1cHBvcnRlZDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0pOwotICAgICAgICAgICAgaWYgKCFyZXQuaXNPaygpKSB7Ci0gICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBjaGVja2luZyB0b3JjaCBtb2RlIHN1cHBvcnQgJyVzJzogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwcm92aWRlci0+bVByb3ZpZGVyTmFtZS5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgcmV0dXJuIHByb3ZpZGVyLT5tU2V0VG9yY2hNb2RlU3VwcG9ydGVkOwogICAgICAgICB9CiAgICAgfQotICAgIHJldHVybiBzdXBwb3J0OworICAgIHJldHVybiBmYWxzZTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzZXRUb3JjaE1vZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCBib29sIGVuYWJsZWQpIHsKQEAgLTIzMSw2ICsyNzMsMTUgQEAKICAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCk7CiAgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogCisgICAgLy8gUGFzcyB0aGUgY2FtZXJhIElEIHRvIHN0YXJ0IGludGVyZmFjZSBzbyB0aGF0IGl0IHdpbGwgc2F2ZSBpdCB0byB0aGUgbWFwIG9mIElDYW1lcmFQcm92aWRlcnMKKyAgICAvLyB0aGF0IGFyZSBjdXJyZW50bHkgaW4gdXNlLgorICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IGludGVyZmFjZSA9CisgICAgICAgICAgICBkZXZpY2VJbmZvLT5tUGFyZW50UHJvdmlkZXItPnN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBzYXZlUmVmKERldmljZU1vZGU6OlRPUkNILCBkZXZpY2VJbmZvLT5tSWQsIGludGVyZmFjZSk7CisKICAgICByZXR1cm4gZGV2aWNlSW5mby0+c2V0VG9yY2hNb2RlKGVuYWJsZWQpOwogfQogCkBAIC0yMzgsMzcgKzI4OSw3IEBACiAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlPiB0YWdDYWNoZSA9IG5ldyBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGUoKTsKIAogICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7Ci0gICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxWZW5kb3JUYWdTZWN0aW9uPiB2dHM7Ci0gICAgICAgIFN0YXR1cyBzdGF0dXM7Ci0gICAgICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgICAgICByZXQgPSBwcm92aWRlci0+bUludGVyZmFjZS0+Z2V0VmVuZG9yVGFncygKLSAgICAgICAgICAgIFsmXShhdXRvIHMsIGNvbnN0IGF1dG8mIHZlbmRvclRhZ1NlY3MpIHsKLSAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgICAgICAgICAgdnRzID0gdmVuZG9yVGFnU2VjczsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgZ2V0dGluZyB2ZW5kb3IgdGFncyBmcm9tIHByb3ZpZGVyICclcyc6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwcm92aWRlci0+bVByb3ZpZGVyTmFtZS5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3RhdHVzICE9IFN0YXR1czo6T0spIHsKLSAgICAgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFJlYWQgYWxsIHZlbmRvciB0YWcgZGVmaW5pdGlvbnMgaW50byBhIGRlc2NyaXB0b3IKLSAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gZGVzYzsKLSAgICAgICAgc3RhdHVzX3QgcmVzOwotICAgICAgICBpZiAoKHJlcyA9IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwodnRzLCAvKm91dCovZGVzYykpCi0gICAgICAgICAgICAgICAgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogQ291bGQgbm90IGdlbmVyYXRlIGRlc2NyaXB0b3IgZnJvbSB2ZW5kb3IgdGFnIG9wZXJhdGlvbnMsIgotICAgICAgICAgICAgICAgICAgInJlY2VpdmVkIGVycm9yICVzICglZCkuIENhbWVyYSBjbGllbnRzIHdpbGwgbm90IGJlIGFibGUgdG8gdXNlIgotICAgICAgICAgICAgICAgICAgInZlbmRvciB0YWdzIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcihyZXMpLCByZXMpOwotICAgICAgICAgICAgcmV0dXJuIHJlczsKLSAgICAgICAgfQotCi0gICAgICAgIHRhZ0NhY2hlLT5hZGRWZW5kb3JEZXNjcmlwdG9yKHByb3ZpZGVyLT5tUHJvdmlkZXJUYWdpZCwgZGVzYyk7CisgICAgICAgIHRhZ0NhY2hlLT5hZGRWZW5kb3JEZXNjcmlwdG9yKHByb3ZpZGVyLT5tUHJvdmlkZXJUYWdpZCwgcHJvdmlkZXItPm1WZW5kb3JUYWdEZXNjcmlwdG9yKTsKICAgICB9CiAKICAgICBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU6OnNldEFzR2xvYmFsVmVuZG9yVGFnQ2FjaGUodGFnQ2FjaGUpOwpAQCAtMjc2LDEwICsyOTcsMzAgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoCisgICAgICAgIGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPHByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbmV3U3RhdGUpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOworICAgIG1EZXZpY2VTdGF0ZSA9IG5ld1N0YXRlOworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7CisgICAgICAgIEFMT0dWKCIlczogTm90aWZ5aW5nICVzIGZvciBuZXcgc3RhdGUgMHglIiBQUkl4NjQsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBwcm92aWRlci0+bVByb3ZpZGVyTmFtZS5jX3N0cigpLCBuZXdTdGF0ZSk7CisgICAgICAgIHN0YXR1c190IHNpbmdsZVJlcyA9IHByb3ZpZGVyLT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShtRGV2aWNlU3RhdGUpOworICAgICAgICBpZiAoc2luZ2xlUmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBub3RpZnkgcHJvdmlkZXIgJXMgYWJvdXQgZGV2aWNlIHN0YXRlIGNoYW5nZSIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXItPm1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgICAgICByZXMgPSBzaW5nbGVSZXM7CisgICAgICAgICAgICAvLyBjb250aW51ZSB0byBkbyB0aGUgcmVzdCBvZiB0aGUgcHJvdmlkZXJzIGluc3RlYWQgb2YgcmV0dXJuaW5nIG5vdworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6b3BlblNlc3Npb24oY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAotICAgICAgICBjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICBjb25zdCBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAogICAgICAgICAvKm91dCovCi0gICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+ICpzZXNzaW9uKSB7CisgICAgICAgIHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+ICpzZXNzaW9uKSB7CiAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogCkBAIC0yODgsMTAgKzMyOSwyMiBAQAogICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBOQU1FX05PVF9GT1VORDsKIAogICAgIGF1dG8gKmRldmljZUluZm8zID0gc3RhdGljX2Nhc3Q8UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMyo+KGRldmljZUluZm8pOworICAgIGNvbnN0IHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyID0KKyAgICAgICAgICAgIGRldmljZUluZm8tPm1QYXJlbnRQcm92aWRlci0+c3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChwcm92aWRlciA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgc2F2ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkLCBwcm92aWRlcik7CiAKICAgICBTdGF0dXMgc3RhdHVzOwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIHJldCA9IGRldmljZUluZm8zLT5tSW50ZXJmYWNlLT5vcGVuKGNhbGxiYWNrLCBbJnN0YXR1cywgJnNlc3Npb25dCisgICAgYXV0byBpbnRlcmZhY2UgPSBkZXZpY2VJbmZvMy0+c3RhcnREZXZpY2VJbnRlcmZhY2U8CisgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OkludGVyZmFjZVQ+KCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisKKyAgICByZXQgPSBpbnRlcmZhY2UtPm9wZW4oY2FsbGJhY2ssIFsmc3RhdHVzLCAmc2Vzc2lvbl0KICAgICAgICAgICAgIChTdGF0dXMgcywgY29uc3Qgc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4mIGNhbWVyYVNlc3Npb24pIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwogICAgICAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gU3RhdHVzOjpPSykgewpAQCAtMjk5LDYgKzM1Miw3IEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfSk7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIHJlbW92ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkKTsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBvcGVuaW5nIGEgc2Vzc2lvbiBmb3IgY2FtZXJhIGRldmljZSAlczogJXMiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKQEAgLTMwNyw5ICszNjEsOSBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om9wZW5TZXNzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKLSAgICAgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKKyAgICAgICAgY29uc3Qgc3A8ZGV2aWNlOjpWMV8wOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2s+JiBjYWxsYmFjaywKICAgICAgICAgLypvdXQqLwotICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+ICpzZXNzaW9uKSB7CisgICAgICAgIHNwPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4gKnNlc3Npb24pIHsKIAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CiAKQEAgLTMxOCwyNCArMzcyLDkxIEBACiAgICAgaWYgKGRldmljZUluZm8gPT0gbnVsbHB0cikgcmV0dXJuIE5BTUVfTk9UX0ZPVU5EOwogCiAgICAgYXV0byAqZGV2aWNlSW5mbzEgPSBzdGF0aWNfY2FzdDxQcm92aWRlckluZm86OkRldmljZUluZm8xKj4oZGV2aWNlSW5mbyk7CisgICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIgPQorICAgICAgICAgICAgZGV2aWNlSW5mby0+bVBhcmVudFByb3ZpZGVyLT5zdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKHByb3ZpZGVyID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBzYXZlUmVmKERldmljZU1vZGU6OkNBTUVSQSwgaWQsIHByb3ZpZGVyKTsKIAotICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBkZXZpY2VJbmZvMS0+bUludGVyZmFjZS0+b3BlbihjYWxsYmFjayk7CisgICAgYXV0byBpbnRlcmZhY2UgPSBkZXZpY2VJbmZvMS0+c3RhcnREZXZpY2VJbnRlcmZhY2U8CisgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OkludGVyZmFjZVQ+KCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICB9CisgICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0YXR1cyA9IGludGVyZmFjZS0+b3BlbihjYWxsYmFjayk7CiAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CisgICAgICAgIHJlbW92ZVJlZihEZXZpY2VNb2RlOjpDQU1FUkEsIGlkKTsKICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBvcGVuaW5nIGEgc2Vzc2lvbiBmb3IgY2FtZXJhIGRldmljZSAlczogJXMiLAogICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKICAgICB9CiAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICpzZXNzaW9uID0gZGV2aWNlSW5mbzEtPm1JbnRlcmZhY2U7CisgICAgICAgICpzZXNzaW9uID0gaW50ZXJmYWNlOwogICAgIH0KICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CiB9CiAKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzYXZlUmVmKERldmljZU1vZGUgdXNhZ2VUeXBlLCBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQsCisgICAgICAgIHNwPHByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyKSB7CisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEFMT0dWKCJTYXZpbmcgY2FtZXJhIHByb3ZpZGVyICVzIGZvciBjYW1lcmEgZGV2aWNlICVzIiwgcHJvdmlkZXItPmRlc2NyaXB0b3IsIGNhbWVyYUlkLmNfc3RyKCkpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Qcm92aWRlckludGVyZmFjZU1hcExvY2spOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4+ICpwcmltYXJ5TWFwLCAqYWx0ZXJuYXRlTWFwOworICAgIGlmICh1c2FnZVR5cGUgPT0gRGV2aWNlTW9kZTo6VE9SQ0gpIHsKKyAgICAgICAgcHJpbWFyeU1hcCA9ICZtVG9yY2hQcm92aWRlckJ5Q2FtZXJhSWQ7CisgICAgICAgIGFsdGVybmF0ZU1hcCA9ICZtQ2FtZXJhUHJvdmlkZXJCeUNhbWVyYUlkOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW1hcnlNYXAgPSAmbUNhbWVyYVByb3ZpZGVyQnlDYW1lcmFJZDsKKyAgICAgICAgYWx0ZXJuYXRlTWFwID0gJm1Ub3JjaFByb3ZpZGVyQnlDYW1lcmFJZDsKKyAgICB9CisgICAgYXV0byBpZCA9IGNhbWVyYUlkLmNfc3RyKCk7CisgICAgKCpwcmltYXJ5TWFwKVtpZF0gPSBwcm92aWRlcjsKKyAgICBhdXRvIHNlYXJjaCA9IGFsdGVybmF0ZU1hcC0+ZmluZChpZCk7CisgICAgaWYgKHNlYXJjaCAhPSBhbHRlcm5hdGVNYXAtPmVuZCgpKSB7CisgICAgICAgIEFMT0dXKCIlczogQ2FtZXJhIGRldmljZSAlcyBpcyB1c2luZyBib3RoIHRvcmNoIG1vZGUgYW5kIGNhbWVyYSBtb2RlIHNpbXVsdGFuZW91c2x5LiAiCisgICAgICAgICAgICAgICAgIlRoYXQgc2hvdWxkIG5vdCBiZSBwb3NzaWJsZSIsIF9fRlVOQ1RJT05fXywgaWQpOworICAgIH0KKyAgICBBTE9HVigiJXM6IENhbWVyYSBkZXZpY2UgJXMgY29ubmVjdGVkIiwgX19GVU5DVElPTl9fLCBpZCk7Cit9CisKK3ZvaWQgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpyZW1vdmVSZWYoRGV2aWNlTW9kZSB1c2FnZVR5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCkgeworICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBTE9HVigiUmVtb3ZpbmcgY2FtZXJhIGRldmljZSAlcyIsIGNhbWVyYUlkLmNfc3RyKCkpOworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4+ICpwcm92aWRlck1hcDsKKyAgICBpZiAodXNhZ2VUeXBlID09IERldmljZU1vZGU6OlRPUkNIKSB7CisgICAgICAgIHByb3ZpZGVyTWFwID0gJm1Ub3JjaFByb3ZpZGVyQnlDYW1lcmFJZDsKKyAgICB9IGVsc2UgeworICAgICAgICBwcm92aWRlck1hcCA9ICZtQ2FtZXJhUHJvdmlkZXJCeUNhbWVyYUlkOworICAgIH0KKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUHJvdmlkZXJJbnRlcmZhY2VNYXBMb2NrKTsKKyAgICBhdXRvIHNlYXJjaCA9IHByb3ZpZGVyTWFwLT5maW5kKGNhbWVyYUlkLmNfc3RyKCkpOworICAgIGlmIChzZWFyY2ggIT0gcHJvdmlkZXJNYXAtPmVuZCgpKSB7CisgICAgICAgIC8vIERyb3AgdGhlIHJlZmVyZW5jZSB0byB0aGlzIElDYW1lcmFQcm92aWRlci4gVGhpcyBpcyBzYWZlIHRvIGRvIGltbWVkaWF0ZWx5ICh3aXRob3V0IGFuCisgICAgICAgIC8vIGFkZGVkIGRlbGF5KSBiZWNhdXNlIGh3c2VydmljZW1hbmFnZXIgZ3VhcmFudGVlcyB0byBob2xkIHRoZSByZWZlcmVuY2UgZm9yIGF0IGxlYXN0IGZpdmUKKyAgICAgICAgLy8gbW9yZSBzZWNvbmRzLiAgV2UgZGVwZW5kIG9uIHRoaXMgYmVoYXZpb3Igc28gdGhhdCBpZiB0aGUgcHJvdmlkZXIgaXMgdW5yZWZlcmVuY2VkIGFuZAorICAgICAgICAvLyB0aGVuIHJlZmVyZW5jZWQgYWdhaW4gcXVpY2tseSwgd2UgZG8gbm90IGxldCB0aGUgSEFMIGV4aXQgYW5kIHRoZW4gbmVlZCB0byBpbW1lZGlhdGVseQorICAgICAgICAvLyByZXN0YXJ0IGl0LiBBbiBleGFtcGxlIHdoZW4gdGhpcyBjb3VsZCBoYXBwZW4gaXMgc3dpdGNoaW5nIGZyb20gYSBmcm9udC1mYWNpbmcgdG8gYQorICAgICAgICAvLyByZWFyLWZhY2luZyBjYW1lcmEuIElmIHRoZSBIQUwgd2VyZSB0byBleGl0IGR1cmluZyB0aGUgY2FtZXJhIHN3aXRjaCwgdGhlIGNhbWVyYSBjb3VsZAorICAgICAgICAvLyBhcHBlYXIgamFua3kgdG8gdGhlIHVzZXIuCisgICAgICAgIHByb3ZpZGVyTWFwLT5lcmFzZShjYW1lcmFJZC5jX3N0cigpKTsKKyAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogQXNrZWQgdG8gcmVtb3ZlIHJlZmVyZW5jZSBmb3IgY2FtZXJhICVzLCBidXQgbm8gcmVmZXJlbmNlIHRvIGl0IHdhcyBmb3VuZC4gVGhpcyAiCisgICAgICAgICAgICAgICAgImNvdWxkIG1lYW4gcmVtb3ZlUmVmIHdhcyBjYWxsZWQgdHdpY2UgZm9yIHRoZSBzYW1lIGNhbWVyYSBJRC4iLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgfQorfQogCiBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6b25SZWdpc3RyYXRpb24oCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3N0cmluZyYgLypmcU5hbWUqLywKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfc3RyaW5nJiBuYW1lLAogICAgICAgICBib29sIC8qcHJlZXhpc3RpbmcqLykgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBwcm92aWRlckxvY2sobVByb3ZpZGVyTGlmZWN5Y2xlTG9jayk7CiAgICAgewogICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOwogCkBAIC0zNDcsNiArNDY4LDggQEAKICAgICAgICAgbGlzdGVuZXItPm9uTmV3UHJvdmlkZXJSZWdpc3RlcmVkKCk7CiAgICAgfQogCisgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Zmx1c2hDb21tYW5kcygpOworCiAgICAgcmV0dXJuIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4oKTsKIH0KIApAQCAtMzkyLDM4ICs1MTUsNjE5IEBACiAgICAgcmV0dXJuIHJldDsKIH0KIAotYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzTG9naWNhbENhbWVyYShjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbywKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBwaHlzaWNhbENhbWVyYUlkcykgewotICAgIGJvb2wgaXNMb2dpY2FsQ2FtID0gZmFsc2U7Ci0gICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZW50cnlDYXA7Cit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6cXVlcnlQaHlzaWNhbENhbWVyYUlkcygpIHsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnlfdCBlbnRyeUNhcDsKIAotICAgIGVudHJ5Q2FwID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICBlbnRyeUNhcCA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeUNhcC5jb3VudDsgKytpKSB7CiAgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5Q2FwLmRhdGEudThbaV07CiAgICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX0xPR0lDQUxfTVVMVElfQ0FNRVJBKSB7Ci0gICAgICAgICAgICBpc0xvZ2ljYWxDYW0gPSB0cnVlOworICAgICAgICAgICAgbUlzTG9naWNhbENhbWVyYSA9IHRydWU7CiAgICAgICAgICAgICBicmVhazsKICAgICAgICAgfQogICAgIH0KLSAgICBpZiAoIWlzTG9naWNhbENhbSkgewotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFtSXNMb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgIHJldHVybjsKICAgICB9CiAKLSAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlbnRyeUlkcyA9IHN0YXRpY0luZm8uZmluZChBTkRST0lEX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1BIWVNJQ0FMX0lEUyk7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnlJZHMgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoCisgICAgICAgICAgICBBTkRST0lEX0xPR0lDQUxfTVVMVElfQ0FNRVJBX1BIWVNJQ0FMX0lEUyk7CiAgICAgY29uc3QgdWludDhfdCogaWRzID0gZW50cnlJZHMuZGF0YS51ODsKICAgICBzaXplX3Qgc3RhcnQgPSAwOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZW50cnlJZHMuY291bnQ7ICsraSkgewogICAgICAgICBpZiAoaWRzW2ldID09ICdcMCcpIHsKICAgICAgICAgICAgIGlmIChzdGFydCAhPSBpKSB7Ci0gICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMtPnB1c2hfYmFjaygoY29uc3QgY2hhciopaWRzK3N0YXJ0KTsKKyAgICAgICAgICAgICAgICBtUGh5c2ljYWxJZHMucHVzaF9iYWNrKChjb25zdCBjaGFyKilpZHMrc3RhcnQpOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgc3RhcnQgPSBpKzE7CiAgICAgICAgIH0KICAgICB9Cit9CisKK2Jvb2wgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjppc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoKSB7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QgZW50cnlDYXA7CisgICAgZW50cnlDYXAgPSBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9DQVBBQklMSVRJRVMpOworICAgIGlmIChlbnRyeUNhcC5jb3VudCAhPSAxKSB7CisgICAgICAgIC8vIERvIE5PVCBoaWRlIHRoaXMgY2FtZXJhIGRldmljZSBpZiB0aGUgY2FwYWJpbGl0aWVzIHNwZWNpZnkgYW55dGhpbmcgbW9yZQorICAgICAgICAvLyB0aGFuIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1NFQ1VSRV9JTUFHRV9EQVRBLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBlbnRyeUNhcC5kYXRhLnU4WzBdID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX1NFQ1VSRV9JTUFHRV9EQVRBOworfQorCit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Z2V0U3VwcG9ydGVkU2l6ZXMoCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwgdWludDMyX3QgdGFnLCBhbmRyb2lkX3BpeGVsX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+ICpzaXplcy8qb3V0Ki8pIHsKKyAgICBpZiAoc2l6ZXMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgYXV0byBzY2FsZXJEaW1zID0gY2guZmluZCh0YWcpOworICAgIGlmIChzY2FsZXJEaW1zLmNvdW50ID4gMCkgeworICAgICAgICAvLyBTY2FsZXIgZW50cnkgY29udGFpbnMgNCBlbGVtZW50cyAoZm9ybWF0LCB3aWR0aCwgaGVpZ2h0LCB0eXBlKQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNjYWxlckRpbXMuY291bnQ7IGkgKz0gNCkgeworICAgICAgICAgICAgaWYgKChzY2FsZXJEaW1zLmRhdGEuaTMyW2ldID09IGZvcm1hdCkgJiYKKyAgICAgICAgICAgICAgICAgICAgKHNjYWxlckRpbXMuZGF0YS5pMzJbaSszXSA9PQorICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQpKSB7CisgICAgICAgICAgICAgICAgc2l6ZXMtPnB1c2hfYmFjayhzdGQ6Om1ha2VfdHVwbGUoc2NhbGVyRGltcy5kYXRhLmkzMltpKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlckRpbXMuZGF0YS5pMzJbaSsyXSkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Z2V0U3VwcG9ydGVkRHVyYXRpb25zKAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsIHVpbnQzMl90IHRhZywgYW5kcm9pZF9waXhlbF9mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgc2l6ZXMsCisgICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+ICpkdXJhdGlvbnMvKm91dCovKSB7CisgICAgaWYgKGR1cmF0aW9ucyA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGF2YWlsYWJsZUR1cmF0aW9ucyA9IGNoLmZpbmQodGFnKTsKKyAgICBpZiAoYXZhaWxhYmxlRHVyYXRpb25zLmNvdW50ID4gMCkgeworICAgICAgICAvLyBEdXJhdGlvbiBlbnRyeSBjb250YWlucyA0IGVsZW1lbnRzIChmb3JtYXQsIHdpZHRoLCBoZWlnaHQsIGR1cmF0aW9uKQorICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGF2YWlsYWJsZUR1cmF0aW9ucy5jb3VudDsgaSArPSA0KSB7CisgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNpemUgOiBzaXplcykgeworICAgICAgICAgICAgICAgIGludDY0X3Qgd2lkdGggPSBzdGQ6OmdldDwwPihzaXplKTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IGhlaWdodCA9IHN0ZDo6Z2V0PDE+KHNpemUpOworICAgICAgICAgICAgICAgIGlmICgoYXZhaWxhYmxlRHVyYXRpb25zLmRhdGEuaTY0W2ldID09IGZvcm1hdCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVEdXJhdGlvbnMuZGF0YS5pNjRbaSsxXSA9PSB3aWR0aCkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChhdmFpbGFibGVEdXJhdGlvbnMuZGF0YS5pNjRbaSsyXSA9PSBoZWlnaHQpKSB7CisgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9ucy0+cHVzaF9iYWNrKGF2YWlsYWJsZUR1cmF0aW9ucy5kYXRhLmk2NFtpKzNdKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9Cit2b2lkIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Z2V0U3VwcG9ydGVkRHluYW1pY0RlcHRoRHVyYXRpb25zKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ2NF90PiYgZGVwdGhEdXJhdGlvbnMsIGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+JiBibG9iRHVyYXRpb25zLAorICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiAqZHluYW1pY0RlcHRoRHVyYXRpb25zIC8qb3V0Ki8pIHsKKyAgICBpZiAoKGR5bmFtaWNEZXB0aER1cmF0aW9ucyA9PSBudWxscHRyKSB8fCAoZGVwdGhEdXJhdGlvbnMuc2l6ZSgpICE9IGJsb2JEdXJhdGlvbnMuc2l6ZSgpKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVW5mb3J0dW5hdGVseSB0aGVyZSBpcyBubyBkaXJlY3Qgd2F5IHRvIGNhbGN1bGF0ZSB0aGUgZHluYW1pYyBkZXB0aCBzdHJlYW0gZHVyYXRpb24uCisgICAgLy8gUHJvY2Vzc2luZyB0aW1lIG9uIGNhbWVyYSBzZXJ2aWNlIHNpZGUgY2FuIHZhcnkgZ3JlYXRseSBkZXBlbmRpbmcgb24gbXVsdGlwbGUKKyAgICAvLyB2YXJpYWJsZXMgd2hpY2ggYXJlIG5vdCB1bmRlciBvdXIgY29udHJvbC4gTWFrZSBhIGd1ZXNzdGltYXRlIGJ5IHRha2luZyB0aGUgbWF4aW11bQorICAgIC8vIGNvcnJlc3BvbmRpbmcgZHVyYXRpb24gdmFsdWUgZnJvbSBkZXB0aCBhbmQgYmxvYi4KKyAgICBhdXRvIGRlcHRoRHVyYXRpb24gPSBkZXB0aER1cmF0aW9ucy5iZWdpbigpOworICAgIGF1dG8gYmxvYkR1cmF0aW9uID0gYmxvYkR1cmF0aW9ucy5iZWdpbigpOworICAgIGR5bmFtaWNEZXB0aER1cmF0aW9ucy0+cmVzZXJ2ZShkZXB0aER1cmF0aW9ucy5zaXplKCkpOworICAgIHdoaWxlICgoZGVwdGhEdXJhdGlvbiAhPSBkZXB0aER1cmF0aW9ucy5lbmQoKSkgJiYgKGJsb2JEdXJhdGlvbiAhPSBibG9iRHVyYXRpb25zLmVuZCgpKSkgeworICAgICAgICBkeW5hbWljRGVwdGhEdXJhdGlvbnMtPnB1c2hfYmFjayhzdGQ6Om1heCgqZGVwdGhEdXJhdGlvbiwgKmJsb2JEdXJhdGlvbikpOworICAgICAgICBkZXB0aER1cmF0aW9uKys7IGJsb2JEdXJhdGlvbisrOworICAgIH0KK30KKwordm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmdldFN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4mIGJsb2JTaXplcywKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+JiBkZXB0aFNpemVzLAorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gKmR5bmFtaWNEZXB0aFNpemVzIC8qb3V0Ki8sCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiAqaW50ZXJuYWxEZXB0aFNpemVzIC8qb3V0Ki8pIHsKKyAgICBpZiAoZHluYW1pY0RlcHRoU2l6ZXMgPT0gbnVsbHB0ciB8fCBpbnRlcm5hbERlcHRoU2l6ZXMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gVGhlIGR5bmFtaWMgZGVwdGggc3BlYy4gZG9lcyBub3QgbWVudGlvbiBob3cgY2xvc2UgdGhlIEFSIHJhdGlvIHNob3VsZCBiZS4KKyAgICAvLyBUcnkgdXNpbmcgc29tZXRoaW5nIGFwcHJvcHJpYXRlLgorICAgIGZsb2F0IEFSVG9sZXJhbmNlID0ga0RlcHRoQVJUb2xlcmFuY2U7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIGJsb2JTaXplIDogYmxvYlNpemVzKSB7CisgICAgICAgIGZsb2F0IGpwZWdBUiA9IHN0YXRpY19jYXN0PGZsb2F0PiAoc3RkOjpnZXQ8MD4oYmxvYlNpemUpKSAvCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHN0ZDo6Z2V0PDE+KGJsb2JTaXplKSk7CisgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvJiBkZXB0aFNpemUgOiBkZXB0aFNpemVzKSB7CisgICAgICAgICAgICBpZiAoZGVwdGhTaXplID09IGJsb2JTaXplKSB7CisgICAgICAgICAgICAgICAgaW50ZXJuYWxEZXB0aFNpemVzLT5wdXNoX2JhY2soZGVwdGhTaXplKTsKKyAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGZsb2F0IGRlcHRoQVIgPSBzdGF0aWNfY2FzdDxmbG9hdD4gKHN0ZDo6Z2V0PDA+KGRlcHRoU2l6ZSkpIC8KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHN0ZDo6Z2V0PDE+KGRlcHRoU2l6ZSkpOworICAgICAgICAgICAgICAgIGlmIChzdGQ6OmZhYnMoanBlZ0FSIC0gZGVwdGhBUikgPD0gQVJUb2xlcmFuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWxEZXB0aFNpemVzLT5wdXNoX2JhY2soZGVwdGhTaXplKTsKKyAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAoZm91bmQpIHsKKyAgICAgICAgICAgIGR5bmFtaWNEZXB0aFNpemVzLT5wdXNoX2JhY2soYmxvYlNpemUpOworICAgICAgICB9CisgICAgfQorfQorCitib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6aXNEZXB0aFBob3RvTGlicmFyeVByZXNlbnQoKSB7CisgICAgc3RhdGljIGJvb2wgbGlicmFyeVByZXNlbnQgPSBmYWxzZTsKKyAgICBzdGF0aWMgYm9vbCBpbml0aWFsaXplZCA9IGZhbHNlOworICAgIGlmIChpbml0aWFsaXplZCkgeworICAgICAgICByZXR1cm4gbGlicmFyeVByZXNlbnQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIH0KKworICAgIHZvaWQqIGRlcHRoTGliSGFuZGxlID0gZGxvcGVuKGNhbWVyYTM6OmtEZXB0aFBob3RvTGlicmFyeSwgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKKyAgICBpZiAoZGVwdGhMaWJIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYXV0byBwcm9jZXNzRnVuYyA9IGRsc3ltKGRlcHRoTGliSGFuZGxlLCBjYW1lcmEzOjprRGVwdGhQaG90b1Byb2Nlc3NGdW5jdGlvbik7CisgICAgaWYgKHByb2Nlc3NGdW5jICE9IG51bGxwdHIpIHsKKyAgICAgICAgbGlicmFyeVByZXNlbnQgPSB0cnVlOworICAgIH0gZWxzZSB7CisgICAgICAgIGxpYnJhcnlQcmVzZW50ID0gZmFsc2U7CisgICAgfQorICAgIGRsY2xvc2UoZGVwdGhMaWJIYW5kbGUpOworCisgICAgcmV0dXJuIGxpYnJhcnlQcmVzZW50OworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmFkZER5bmFtaWNEZXB0aFRhZ3MoKSB7CisgICAgdWludDMyX3QgZGVwdGhFeGNsVGFnID0gQU5EUk9JRF9ERVBUSF9ERVBUSF9JU19FWENMVVNJVkU7CisgICAgdWludDMyX3QgZGVwdGhTaXplc1RhZyA9IEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUUkVBTV9DT05GSUdVUkFUSU9OUzsKKyAgICBhdXRvJiBjID0gbUNhbWVyYUNoYXJhY3RlcmlzdGljczsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4gc3VwcG9ydGVkQmxvYlNpemVzLCBzdXBwb3J0ZWREZXB0aFNpemVzLAorICAgICAgICAgICAgc3VwcG9ydGVkRHluYW1pY0RlcHRoU2l6ZXMsIGludGVybmFsRGVwdGhTaXplczsKKyAgICBhdXRvIGNoVGFncyA9IGMuZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTKTsKKyAgICBpZiAoY2hUYWdzLmNvdW50ID09IDApIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdXBwb3J0ZWQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBpcyBlbXB0eSEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGJvb2wgaXNEZXB0aEV4Y2x1c2l2ZVByZXNlbnQgPSBzdGQ6OmZpbmQoY2hUYWdzLmRhdGEuaTMyLCBjaFRhZ3MuZGF0YS5pMzIgKyBjaFRhZ3MuY291bnQsCisgICAgICAgICAgICBkZXB0aEV4Y2xUYWcpICE9IChjaFRhZ3MuZGF0YS5pMzIgKyBjaFRhZ3MuY291bnQpOworICAgIGJvb2wgaXNEZXB0aFNpemVQcmVzZW50ID0gc3RkOjpmaW5kKGNoVGFncy5kYXRhLmkzMiwgY2hUYWdzLmRhdGEuaTMyICsgY2hUYWdzLmNvdW50LAorICAgICAgICAgICAgZGVwdGhTaXplc1RhZykgIT0gKGNoVGFncy5kYXRhLmkzMiArIGNoVGFncy5jb3VudCk7CisgICAgaWYgKCEoaXNEZXB0aEV4Y2x1c2l2ZVByZXNlbnQgJiYgaXNEZXB0aFNpemVQcmVzZW50KSkgeworICAgICAgICAvLyBObyBkZXB0aCBzdXBwb3J0LCBub3RoaW5nIG1vcmUgdG8gZG8uCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBhdXRvIGRlcHRoRXhjbHVzaXZlRW50cnkgPSBjLmZpbmQoZGVwdGhFeGNsVGFnKTsKKyAgICBpZiAoZGVwdGhFeGNsdXNpdmVFbnRyeS5jb3VudCA+IDApIHsKKyAgICAgICAgaWYgKGRlcHRoRXhjbHVzaXZlRW50cnkuZGF0YS51OFswXSAhPSBBTkRST0lEX0RFUFRIX0RFUFRIX0lTX0VYQ0xVU0lWRV9GQUxTRSkgeworICAgICAgICAgICAgLy8gRGVwdGggc3VwcG9ydCBpcyBleGNsdXNpdmUsIG5vdGhpbmcgbW9yZSB0byBkby4KKyAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dFKCIlczogQWR2ZXJ0aXNlZCBkZXB0aCBleGNsdXNpdmUgdGFnIGJ1dCB2YWx1ZSBpcyBub3QgcHJlc2VudCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIGdldFN1cHBvcnRlZFNpemVzKGMsIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9TVFJFQU1fQ09ORklHVVJBVElPTlMsIEhBTF9QSVhFTF9GT1JNQVRfQkxPQiwKKyAgICAgICAgICAgICZzdXBwb3J0ZWRCbG9iU2l6ZXMpOworICAgIGdldFN1cHBvcnRlZFNpemVzKGMsIGRlcHRoU2l6ZXNUYWcsIEhBTF9QSVhFTF9GT1JNQVRfWTE2LCAmc3VwcG9ydGVkRGVwdGhTaXplcyk7CisgICAgaWYgKHN1cHBvcnRlZEJsb2JTaXplcy5lbXB0eSgpIHx8IHN1cHBvcnRlZERlcHRoU2l6ZXMuZW1wdHkoKSkgeworICAgICAgICAvLyBOb3RoaW5nIHRvIGRvIGluIHRoaXMgY2FzZS4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGdldFN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzKHN1cHBvcnRlZEJsb2JTaXplcywgc3VwcG9ydGVkRGVwdGhTaXplcywKKyAgICAgICAgICAgICZzdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcywgJmludGVybmFsRGVwdGhTaXplcyk7CisgICAgaWYgKHN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gTm90aGluZyBtb3JlIHRvIGRvLgorICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgaWYoIWlzRGVwdGhQaG90b0xpYnJhcnlQcmVzZW50KCkpIHsKKyAgICAgICAgLy8gRGVwdGggcGhvdG8gcHJvY2Vzc2luZyBsaWJyYXJ5IGlzIG5vdCBwcmVzZW50LCBub3RoaW5nIG1vcmUgdG8gZG8uCisgICAgICAgIHJldHVybiBPSzsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBkeW5hbWljRGVwdGhFbnRyaWVzOworICAgIGZvciAoY29uc3QgYXV0byYgaXQgOiBzdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcykgeworICAgICAgICBpbnQzMl90IGVudHJ5WzRdID0ge0hBTF9QSVhFTF9GT1JNQVRfQkxPQiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4gKHN0ZDo6Z2V0PDA+KGl0KSksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4gKHN0ZDo6Z2V0PDE+KGl0KSksCisgICAgICAgICAgICAgICAgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUUkVBTV9DT05GSUdVUkFUSU9OU19PVVRQVVQgfTsKKyAgICAgICAgZHluYW1pY0RlcHRoRW50cmllcy5pbnNlcnQoZHluYW1pY0RlcHRoRW50cmllcy5lbmQoKSwgZW50cnksIGVudHJ5ICsgNCk7CisgICAgfQorCisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gZGVwdGhNaW5EdXJhdGlvbnMsIGRlcHRoU3RhbGxEdXJhdGlvbnM7CisgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4gYmxvYk1pbkR1cmF0aW9ucywgYmxvYlN0YWxsRHVyYXRpb25zOworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9ucywgZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbnM7CisKKyAgICBnZXRTdXBwb3J0ZWREdXJhdGlvbnMoYywgQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUywKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWTE2LCBpbnRlcm5hbERlcHRoU2l6ZXMsICZkZXB0aE1pbkR1cmF0aW9ucyk7CisgICAgZ2V0U3VwcG9ydGVkRHVyYXRpb25zKGMsIEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TLAorICAgICAgICAgICAgSEFMX1BJWEVMX0ZPUk1BVF9CTE9CLCBzdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcywgJmJsb2JNaW5EdXJhdGlvbnMpOworICAgIGlmIChibG9iTWluRHVyYXRpb25zLmVtcHR5KCkgfHwgZGVwdGhNaW5EdXJhdGlvbnMuZW1wdHkoKSB8fAorICAgICAgICAgICAgKGRlcHRoTWluRHVyYXRpb25zLnNpemUoKSAhPSBibG9iTWluRHVyYXRpb25zLnNpemUoKSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIG51bWJlciBvZiBhdmFpbGFibGUgZGVwdGggbWluIGR1cmF0aW9ucyEgJXp1IHZzLiAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZGVwdGhNaW5EdXJhdGlvbnMuc2l6ZSgpLCBibG9iTWluRHVyYXRpb25zLnNpemUoKSk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgZ2V0U3VwcG9ydGVkRHVyYXRpb25zKGMsIEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RFUFRIX1NUQUxMX0RVUkFUSU9OUywKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfWTE2LCBpbnRlcm5hbERlcHRoU2l6ZXMsICZkZXB0aFN0YWxsRHVyYXRpb25zKTsKKyAgICBnZXRTdXBwb3J0ZWREdXJhdGlvbnMoYywgQU5EUk9JRF9TQ0FMRVJfQVZBSUxBQkxFX1NUQUxMX0RVUkFUSU9OUywKKyAgICAgICAgICAgIEhBTF9QSVhFTF9GT1JNQVRfQkxPQiwgc3VwcG9ydGVkRHluYW1pY0RlcHRoU2l6ZXMsICZibG9iU3RhbGxEdXJhdGlvbnMpOworICAgIGlmIChibG9iU3RhbGxEdXJhdGlvbnMuZW1wdHkoKSB8fCBkZXB0aFN0YWxsRHVyYXRpb25zLmVtcHR5KCkgfHwKKyAgICAgICAgICAgIChkZXB0aFN0YWxsRHVyYXRpb25zLnNpemUoKSAhPSBibG9iU3RhbGxEdXJhdGlvbnMuc2l6ZSgpKSkgeworICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgbnVtYmVyIG9mIGF2YWlsYWJsZSBkZXB0aCBzdGFsbCBkdXJhdGlvbnMhICV6dSB2cy4gJXp1IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRlcHRoU3RhbGxEdXJhdGlvbnMuc2l6ZSgpLCBibG9iU3RhbGxEdXJhdGlvbnMuc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBnZXRTdXBwb3J0ZWREeW5hbWljRGVwdGhEdXJhdGlvbnMoZGVwdGhNaW5EdXJhdGlvbnMsIGJsb2JNaW5EdXJhdGlvbnMsCisgICAgICAgICAgICAmZHluYW1pY0RlcHRoTWluRHVyYXRpb25zKTsKKyAgICBnZXRTdXBwb3J0ZWREeW5hbWljRGVwdGhEdXJhdGlvbnMoZGVwdGhTdGFsbER1cmF0aW9ucywgYmxvYlN0YWxsRHVyYXRpb25zLAorICAgICAgICAgICAgJmR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25zKTsKKyAgICBpZiAoZHluYW1pY0RlcHRoTWluRHVyYXRpb25zLmVtcHR5KCkgfHwgZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbnMuZW1wdHkoKSB8fAorICAgICAgICAgICAgKGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9ucy5zaXplKCkgIT0gZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbnMuc2l6ZSgpKSkgeworICAgICAgICBBTE9HRSgiJXM6IFVuZXhwZWN0ZWQgbnVtYmVyIG9mIGR5bmFtaWMgZGVwdGggc3RhbGwvbWluIGR1cmF0aW9ucyEgJXp1IHZzLiAlenUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZHluYW1pY0RlcHRoTWluRHVyYXRpb25zLnNpemUoKSwgZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbnMuc2l6ZSgpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBkeW5hbWljRGVwdGhNaW5EdXJhdGlvbkVudHJpZXM7CisgICAgYXV0byBpdER1cmF0aW9uID0gZHluYW1pY0RlcHRoTWluRHVyYXRpb25zLmJlZ2luKCk7CisgICAgYXV0byBpdFNpemUgPSBzdXBwb3J0ZWREeW5hbWljRGVwdGhTaXplcy5iZWdpbigpOworICAgIHdoaWxlIChpdER1cmF0aW9uICE9IGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9ucy5lbmQoKSkgeworICAgICAgICBpbnQ2NF90IGVudHJ5WzRdID0ge0hBTF9QSVhFTF9GT1JNQVRfQkxPQiwgc3RhdGljX2Nhc3Q8aW50MzJfdD4gKHN0ZDo6Z2V0PDA+KCppdFNpemUpKSwKKyAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQzMl90PiAoc3RkOjpnZXQ8MT4oKml0U2l6ZSkpLCAqaXREdXJhdGlvbn07CisgICAgICAgIGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9uRW50cmllcy5pbnNlcnQoZHluYW1pY0RlcHRoTWluRHVyYXRpb25FbnRyaWVzLmVuZCgpLCBlbnRyeSwKKyAgICAgICAgICAgICAgICBlbnRyeSArIDQpOworICAgICAgICBpdER1cmF0aW9uKys7IGl0U2l6ZSsrOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGR5bmFtaWNEZXB0aFN0YWxsRHVyYXRpb25FbnRyaWVzOworICAgIGl0RHVyYXRpb24gPSBkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9ucy5iZWdpbigpOworICAgIGl0U2l6ZSA9IHN1cHBvcnRlZER5bmFtaWNEZXB0aFNpemVzLmJlZ2luKCk7CisgICAgd2hpbGUgKGl0RHVyYXRpb24gIT0gZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbnMuZW5kKCkpIHsKKyAgICAgICAgaW50NjRfdCBlbnRyeVs0XSA9IHtIQUxfUElYRUxfRk9STUFUX0JMT0IsIHN0YXRpY19jYXN0PGludDMyX3Q+IChzdGQ6OmdldDwwPigqaXRTaXplKSksCisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzJfdD4gKHN0ZDo6Z2V0PDE+KCppdFNpemUpKSwgKml0RHVyYXRpb259OworICAgICAgICBkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9uRW50cmllcy5pbnNlcnQoZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbkVudHJpZXMuZW5kKCksIGVudHJ5LAorICAgICAgICAgICAgICAgIGVudHJ5ICsgNCk7CisgICAgICAgIGl0RHVyYXRpb24rKzsgaXRTaXplKys7CisgICAgfQorCisgICAgYy51cGRhdGUoQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMsCisgICAgICAgICAgICBkeW5hbWljRGVwdGhFbnRyaWVzLmRhdGEoKSwgZHluYW1pY0RlcHRoRW50cmllcy5zaXplKCkpOworICAgIGMudXBkYXRlKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfTUlOX0ZSQU1FX0RVUkFUSU9OUywKKyAgICAgICAgICAgIGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9uRW50cmllcy5kYXRhKCksIGR5bmFtaWNEZXB0aE1pbkR1cmF0aW9uRW50cmllcy5zaXplKCkpOworICAgIGMudXBkYXRlKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TLAorICAgICAgICAgICAgZHluYW1pY0RlcHRoU3RhbGxEdXJhdGlvbkVudHJpZXMuZGF0YSgpLCBkeW5hbWljRGVwdGhTdGFsbER1cmF0aW9uRW50cmllcy5zaXplKCkpOworCisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gc3VwcG9ydGVkQ2hUYWdzOworICAgIHN1cHBvcnRlZENoVGFncy5yZXNlcnZlKGNoVGFncy5jb3VudCArIDMpOworICAgIHN1cHBvcnRlZENoVGFncy5pbnNlcnQoc3VwcG9ydGVkQ2hUYWdzLmVuZCgpLCBjaFRhZ3MuZGF0YS5pMzIsCisgICAgICAgICAgICBjaFRhZ3MuZGF0YS5pMzIgKyBjaFRhZ3MuY291bnQpOworICAgIHN1cHBvcnRlZENoVGFncy5wdXNoX2JhY2soQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9TVFJFQU1fQ09ORklHVVJBVElPTlMpOworICAgIHN1cHBvcnRlZENoVGFncy5wdXNoX2JhY2soQU5EUk9JRF9ERVBUSF9BVkFJTEFCTEVfRFlOQU1JQ19ERVBUSF9NSU5fRlJBTUVfRFVSQVRJT05TKTsKKyAgICBzdXBwb3J0ZWRDaFRhZ3MucHVzaF9iYWNrKEFORFJPSURfREVQVEhfQVZBSUxBQkxFX0RZTkFNSUNfREVQVEhfU1RBTExfRFVSQVRJT05TKTsKKyAgICBjLnVwZGF0ZShBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTLCBzdXBwb3J0ZWRDaFRhZ3MuZGF0YSgpLAorICAgICAgICAgICAgc3VwcG9ydGVkQ2hUYWdzLnNpemUoKSk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6Zml4dXBNb25vY2hyb21lVGFncygpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBhdXRvJiBjID0gbUNhbWVyYUNoYXJhY3RlcmlzdGljczsKKworICAgIC8vIE92ZXJyaWRlIHN0YXRpYyBtZXRhZGF0YSBmb3IgTU9OT0NIUk9NRSBjYW1lcmEgd2l0aCBvbGRlciBkZXZpY2UgdmVyc2lvbgorICAgIGlmIChtVmVyc2lvbi5nZXRfbWFqb3IoKSA9PSAzICYmIG1WZXJzaW9uLmdldF9taW5vcigpIDwgNSkgeworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgY2FwID0gYy5maW5kKEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjYXAuY291bnQ7IGkrKykgeworICAgICAgICAgICAgaWYgKGNhcC5kYXRhLnU4W2ldID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01PTk9DSFJPTUUpIHsKKyAgICAgICAgICAgICAgICAvLyBBTkRST0lEX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVAorICAgICAgICAgICAgICAgIHVpbnQ4X3QgY2ZhID0gQU5EUk9JRF9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlRfTU9OTzsKKyAgICAgICAgICAgICAgICByZXMgPSBjLnVwZGF0ZShBTkRST0lEX1NFTlNPUl9JTkZPX0NPTE9SX0ZJTFRFUl9BUlJBTkdFTUVOVCwgJmNmYSwgMSk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB1cGRhdGUgQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHNLZXlzID0geworICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQxLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfUkVGRVJFTkNFX0lMTFVNSU5BTlQyLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfQ0FMSUJSQVRJT05fVFJBTlNGT1JNMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0NBTElCUkFUSU9OX1RSQU5TRk9STTIsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9DT0xPUl9UUkFOU0ZPUk0xLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfQ09MT1JfVFJBTlNGT1JNMiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0ZPUldBUkRfTUFUUklYMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0ZPUldBUkRfTUFUUklYMiwKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHJlcyA9IHJlbW92ZUF2YWlsYWJsZUtleXMoYywgc0tleXMsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NIQVJBQ1RFUklTVElDU19LRVlTKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHRvIHVwZGF0ZSBSRVFVRVNUX0FWQUlMQUJMRV9DSEFSQUNURVJJU1RJQ1NfS0VZUzogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUworICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiByZXFLZXlzID0geworICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX01PREUsCisgICAgICAgICAgICAgICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fVFJBTlNGT1JNLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0dBSU5TLAorICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgcmVzID0gcmVtb3ZlQXZhaWxhYmxlS2V5cyhjLCByZXFLZXlzLCBBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX1JFUVVFU1RfS0VZUyk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB1cGRhdGUgUkVRVUVTVF9BVkFJTEFCTEVfUkVRVUVTVF9LRVlTOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVMKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gcmVzS2V5cyA9IHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0dSRUVOX1NQTElULAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9TRU5TT1JfTkVVVFJBTF9DT0xPUl9QT0lOVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9NT0RFLAorICAgICAgICAgICAgICAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFORFJPSURfQ09MT1JfQ09SUkVDVElPTl9HQUlOUywKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgIHJlcyA9IHJlbW92ZUF2YWlsYWJsZUtleXMoYywgcmVzS2V5cywgQU5EUk9JRF9SRVFVRVNUX0FWQUlMQUJMRV9SRVNVTFRfS0VZUyk7CisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byB1cGRhdGUgUkVRVUVTVF9BVkFJTEFCTEVfUkVTVUxUX0tFWVM6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gQU5EUk9JRF9TRU5TT1JfQkxBQ0tfTEVWRUxfUEFUVEVSTgorICAgICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBibEVudHJ5ID0gYy5maW5kKEFORFJPSURfU0VOU09SX0JMQUNLX0xFVkVMX1BBVFRFUk4pOworICAgICAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAxOyBqIDwgYmxFbnRyeS5jb3VudDsgaisrKSB7CisgICAgICAgICAgICAgICAgICAgIGJsRW50cnkuZGF0YS5pMzJbal0gPSBibEVudHJ5LmRhdGEuaTMyWzBdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gcmVzOworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OnJlbW92ZUF2YWlsYWJsZUtleXMoCisgICAgICAgIENhbWVyYU1ldGFkYXRhJiBjLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGtleXMsIHVpbnQzMl90IGtleVRhZykgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGtleXNFbnRyeSA9IGMuZmluZChrZXlUYWcpOworICAgIGlmIChrZXlzRW50cnkuY291bnQgPT0gMCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBmaW5kIHRhZyAldTogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywga2V5VGFnLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4gdktleXM7CisgICAgdktleXMucmVzZXJ2ZShrZXlzRW50cnkuY291bnQpOworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga2V5c0VudHJ5LmNvdW50OyBpKyspIHsKKyAgICAgICAgaWYgKHN0ZDo6ZmluZChrZXlzLmJlZ2luKCksIGtleXMuZW5kKCksIGtleXNFbnRyeS5kYXRhLmkzMltpXSkgPT0ga2V5cy5lbmQoKSkgeworICAgICAgICAgICAgdktleXMucHVzaF9iYWNrKGtleXNFbnRyeS5kYXRhLmkzMltpXSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmVzID0gYy51cGRhdGUoa2V5VGFnLCB2S2V5cy5kYXRhKCksIHZLZXlzLnNpemUoKSk7CisgICAgcmV0dXJuIHJlczsKK30KKworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpmaWxsSGVpY1N0cmVhbUNvbWJpbmF0aW9ucygKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50MzJfdD4qIG91dHB1dHMsCisgICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+KiBkdXJhdGlvbnMsCisgICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+KiBzdGFsbER1cmF0aW9ucywKKyAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX2VudHJ5JiBoYWxTdHJlYW1Db25maWdzLAorICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfZW50cnkmIGhhbFN0cmVhbUR1cmF0aW9ucykgeworICAgIGlmIChvdXRwdXRzID09IG51bGxwdHIgfHwgZHVyYXRpb25zID09IG51bGxwdHIgfHwgc3RhbGxEdXJhdGlvbnMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0YXRpYyBib29sIHN1cHBvcnRJbk1lbW9yeVRlbXBGaWxlID0KKyAgICAgICAgICAgIGNhbWVyYTM6OkhlaWNDb21wb3NpdGVTdHJlYW06OmlzSW5NZW1vcnlUZW1wRmlsZVN1cHBvcnRlZCgpOworICAgIGlmICghc3VwcG9ydEluTWVtb3J5VGVtcEZpbGUpIHsKKyAgICAgICAgQUxPR0koIiVzOiBObyBIRUlDIHN1cHBvcnQgZHVlIHRvIGFic2VuY2Ugb2YgaW4gbWVtb3J5IHRlbXAgZmlsZSBzdXBwb3J0IiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gT0s7CisgICAgfQorCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxTdHJlYW1Db25maWdzLmNvdW50OyBpICs9IDQpIHsKKyAgICAgICAgaW50MzJfdCBmb3JtYXQgPSBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2ldOworICAgICAgICAvLyBPbmx5IElNUExFTUVOVEFUSU9OX0RFRklORUQgYW5kIFlVVl84ODggY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgSEVJQworICAgICAgICAvLyBpbWFnZS4KKyAgICAgICAgaWYgKGZvcm1hdCAhPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQgJiYKKyAgICAgICAgICAgICAgICBmb3JtYXQgIT0gSEFMX1BJWEVMX0ZPUk1BVF9ZQ0JDUl80MjBfODg4KSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgc2l6ZUF2YWlsID0gZmFsc2U7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgb3V0cHV0cy0+c2l6ZSgpOyBqKz0gNCkgeworICAgICAgICAgICAgaWYgKCgqb3V0cHV0cylbaisxXSA9PSBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMV0gJiYKKyAgICAgICAgICAgICAgICAgICAgKCpvdXRwdXRzKVtqKzJdID09IGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsyXSkgeworICAgICAgICAgICAgICAgIHNpemVBdmFpbCA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKHNpemVBdmFpbCkgY29udGludWU7CisKKyAgICAgICAgaW50NjRfdCBzdGFsbCA9IDA7CisgICAgICAgIGJvb2wgdXNlSGVpYywgdXNlR3JpZDsKKyAgICAgICAgaWYgKGNhbWVyYTM6OkhlaWNDb21wb3NpdGVTdHJlYW06OmlzU2l6ZVN1cHBvcnRlZEJ5SGVpZkVuY29kZXIoCisgICAgICAgICAgICAgICAgaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzFdLCBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMl0sCisgICAgICAgICAgICAgICAgJnVzZUhlaWMsICZ1c2VHcmlkLCAmc3RhbGwpKSB7CisgICAgICAgICAgICBpZiAodXNlR3JpZCAhPSAoZm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfWUNCQ1JfNDIwXzg4OCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSEVJQyBjb25maWd1cmF0aW9uCisgICAgICAgICAgICBpbnQzMl90IGNvbmZpZ1tdID0ge0hBTF9QSVhFTF9GT1JNQVRfQkxPQiwgaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzFdLAorICAgICAgICAgICAgICAgICAgICBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMl0sIDAgLyppc0lucHV0Ki99OworICAgICAgICAgICAgb3V0cHV0cy0+aW5zZXJ0KG91dHB1dHMtPmVuZCgpLCBjb25maWcsIGNvbmZpZyArIDQpOworCisgICAgICAgICAgICAvLyBIRUlDIG1pbkZyYW1lRHVyYXRpb24KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaGFsU3RyZWFtRHVyYXRpb25zLmNvdW50OyBqICs9IDQpIHsKKyAgICAgICAgICAgICAgICBpZiAoaGFsU3RyZWFtRHVyYXRpb25zLmRhdGEuaTY0W2pdID09IGZvcm1hdCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgaGFsU3RyZWFtRHVyYXRpb25zLmRhdGEuaTY0W2orMV0gPT0gaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzFdICYmCisgICAgICAgICAgICAgICAgICAgICAgICBoYWxTdHJlYW1EdXJhdGlvbnMuZGF0YS5pNjRbaisyXSA9PSBoYWxTdHJlYW1Db25maWdzLmRhdGEuaTMyW2krMl0pIHsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkdXJhdGlvbltdID0ge0hBTF9QSVhFTF9GT1JNQVRfQkxPQiwgaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsyXSwgaGFsU3RyZWFtRHVyYXRpb25zLmRhdGEuaTY0W2orM119OworICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbnMtPmluc2VydChkdXJhdGlvbnMtPmVuZCgpLCBkdXJhdGlvbiwgZHVyYXRpb24rNCk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSEVJQyBzdGFsbER1cmF0aW9uCisgICAgICAgICAgICBpbnQ2NF90IHN0YWxsRHVyYXRpb25bXSA9IHtIQUxfUElYRUxfRk9STUFUX0JMT0IsIGhhbFN0cmVhbUNvbmZpZ3MuZGF0YS5pMzJbaSsxXSwKKyAgICAgICAgICAgICAgICAgICAgaGFsU3RyZWFtQ29uZmlncy5kYXRhLmkzMltpKzJdLCBzdGFsbH07CisgICAgICAgICAgICBzdGFsbER1cmF0aW9ucy0+aW5zZXJ0KHN0YWxsRHVyYXRpb25zLT5lbmQoKSwgc3RhbGxEdXJhdGlvbiwgc3RhbGxEdXJhdGlvbis0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6ZGVyaXZlSGVpY1RhZ3MoKSB7CisgICAgYXV0byYgYyA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3M7CisKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgaGFsSGVpY1N1cHBvcnQgPSBjLmZpbmQoQU5EUk9JRF9IRUlDX0lORk9fU1VQUE9SVEVEKTsKKyAgICBpZiAoaGFsSGVpY1N1cHBvcnQuY291bnQgPiAxKSB7CisgICAgICAgIEFMT0dFKCIlczogSW52YWxpZCBlbnRyeSBjb3VudCAlenUgZm9yIEFORFJPSURfSEVJQ19JTkZPX1NVUFBPUlRFRCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBoYWxIZWljU3VwcG9ydC5jb3VudCk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfSBlbHNlIGlmIChoYWxIZWljU3VwcG9ydC5jb3VudCA9PSAwIHx8CisgICAgICAgICAgICBoYWxIZWljU3VwcG9ydC5kYXRhLnU4WzBdID09IEFORFJPSURfSEVJQ19JTkZPX1NVUFBPUlRFRF9GQUxTRSkgeworICAgICAgICAvLyBDYW1lcmEgSEFMIGRvZXNuJ3Qgc3VwcG9ydCBtYW5kYXRvcnkgc3RyZWFtIGNvbWJpbmF0aW9ucyBmb3IgSEVJQy4KKyAgICAgICAgcmV0dXJuIE9LOworICAgIH0KKworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBtYXhKcGVnQXBwc1NlZ21lbnRzID0KKyAgICAgICAgICAgIGMuZmluZChBTkRST0lEX0hFSUNfSU5GT19NQVhfSlBFR19BUFBfU0VHTUVOVFNfQ09VTlQpOworICAgIGlmIChtYXhKcGVnQXBwc1NlZ21lbnRzLmNvdW50ICE9IDEgfHwgbWF4SnBlZ0FwcHNTZWdtZW50cy5kYXRhLnU4WzBdID09IDAgfHwKKyAgICAgICAgICAgIG1heEpwZWdBcHBzU2VnbWVudHMuZGF0YS51OFswXSA+IDE2KSB7CisgICAgICAgIEFMT0dFKCIlczogQU5EUk9JRF9IRUlDX0lORk9fTUFYX0pQRUdfQVBQX1NFR01FTlRTX0NPVU5UIG11c3QgYmUgd2l0aGluIFsxLCAxNl0iLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gUG9wdWxhdGUgSEVJQyBvdXRwdXQgY29uZmlndXJhdGlvbnMgYW5kIGl0cyByZWxhdGVkIG1pbiBmcmFtZSBkdXJhdGlvbgorICAgIC8vIGFuZCBzdGFsbCBkdXJhdGlvbi4KKyAgICBzdGQ6OnZlY3RvcjxpbnQzMl90PiBoZWljT3V0cHV0czsKKyAgICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBoZWljRHVyYXRpb25zOworICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IGhlaWNTdGFsbER1cmF0aW9uczsKKworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBoYWxTdHJlYW1Db25maWdzID0KKyAgICAgICAgICAgIGMuZmluZChBTkRST0lEX1NDQUxFUl9BVkFJTEFCTEVfU1RSRUFNX0NPTkZJR1VSQVRJT05TKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgbWluRnJhbWVEdXJhdGlvbnMgPQorICAgICAgICAgICAgYy5maW5kKEFORFJPSURfU0NBTEVSX0FWQUlMQUJMRV9NSU5fRlJBTUVfRFVSQVRJT05TKTsKKworICAgIHN0YXR1c190IHJlcyA9IGZpbGxIZWljU3RyZWFtQ29tYmluYXRpb25zKCZoZWljT3V0cHV0cywgJmhlaWNEdXJhdGlvbnMsICZoZWljU3RhbGxEdXJhdGlvbnMsCisgICAgICAgICAgICBoYWxTdHJlYW1Db25maWdzLCBtaW5GcmFtZUR1cmF0aW9ucyk7CisgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBmaWxsIEhFSUMgc3RyZWFtIGNvbWJpbmF0aW9uczogJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICBjLnVwZGF0ZShBTkRST0lEX0hFSUNfQVZBSUxBQkxFX0hFSUNfU1RSRUFNX0NPTkZJR1VSQVRJT05TLAorICAgICAgICAgICBoZWljT3V0cHV0cy5kYXRhKCksIGhlaWNPdXRwdXRzLnNpemUoKSk7CisgICAgYy51cGRhdGUoQU5EUk9JRF9IRUlDX0FWQUlMQUJMRV9IRUlDX01JTl9GUkFNRV9EVVJBVElPTlMsCisgICAgICAgICAgICBoZWljRHVyYXRpb25zLmRhdGEoKSwgaGVpY0R1cmF0aW9ucy5zaXplKCkpOworICAgIGMudXBkYXRlKEFORFJPSURfSEVJQ19BVkFJTEFCTEVfSEVJQ19TVEFMTF9EVVJBVElPTlMsCisgICAgICAgICAgICBoZWljU3RhbGxEdXJhdGlvbnMuZGF0YSgpLCBoZWljU3RhbGxEdXJhdGlvbnMuc2l6ZSgpKTsKKworICAgIHJldHVybiBPSzsKK30KKworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzTG9naWNhbENhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgaWQsCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcGh5c2ljYWxDYW1lcmFJZHMpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOworCisgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQpOworICAgIGlmIChkZXZpY2VJbmZvID09IG51bGxwdHIpIHJldHVybiBmYWxzZTsKKworICAgIGlmIChkZXZpY2VJbmZvLT5tSXNMb2dpY2FsQ2FtZXJhICYmIHBoeXNpY2FsQ2FtZXJhSWRzICE9IG51bGxwdHIpIHsKKyAgICAgICAgKnBoeXNpY2FsQ2FtZXJhSWRzID0gZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzOworICAgIH0KKyAgICByZXR1cm4gZGV2aWNlSW5mby0+bUlzTG9naWNhbENhbWVyYTsKK30KKworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgaWQpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtSW50ZXJmYWNlTXV0ZXgpOworICAgIHJldHVybiBpc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmFMb2NrZWQoaWQpOworfQorCitib29sIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCkgY29uc3QgeworICAgIGF1dG8gZGV2aWNlSW5mbyA9IGZpbmREZXZpY2VJbmZvTG9ja2VkKGlkKTsKKyAgICBpZiAoZGV2aWNlSW5mbyAhPSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBkZXZpY2VJbmZvLT5tSXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhOworICAgIH0KKyAgICAvLyBJZiB0aGlzIGlzIGEgaGlkZGVuIHBoeXNpY2FsIGNhbWVyYSwgd2Ugc2hvdWxkIHJldHVybiB3aGF0IGtpbmQgb2YKKyAgICAvLyBjYW1lcmEgdGhlIGVuY2xvc2luZyBsb2dpY2FsIGNhbWVyYSBpcy4KKyAgICBhdXRvIGlzSGlkZGVuQW5kUGFyZW50ID0gaXNIaWRkZW5QaHlzaWNhbENhbWVyYUludGVybmFsKGlkKTsKKyAgICBpZiAoaXNIaWRkZW5BbmRQYXJlbnQuZmlyc3QpIHsKKyAgICAgICAgTE9HX0FMV0FZU19GQVRBTF9JRihpZCA9PSBpc0hpZGRlbkFuZFBhcmVudC5zZWNvbmQtPm1JZCwKKyAgICAgICAgICAgICAgICAiJXM6IGhpZGRlbiBwaHlzaWNhbCBjYW1lcmEgaWQgJXMgYW5kIGVuY2xvc2luZyBsb2dpY2FsIGNhbWVyYSBpZCAlcyBhcmUgdGhlIHNhbWUiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgaXNIaWRkZW5BbmRQYXJlbnQuc2Vjb25kLT5tSWQuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBpc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmFMb2NrZWQoaXNIaWRkZW5BbmRQYXJlbnQuc2Vjb25kLT5tSWQpOworICAgIH0KKyAgICAvLyBJbnZhbGlkIGNhbWVyYSBpZAogICAgIHJldHVybiB0cnVlOwogfQogCi1zdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmFkZFByb3ZpZGVyTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdQcm92aWRlciwgYm9vbCBleHBlY3RlZCkgeworYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmlzSGlkZGVuUGh5c2ljYWxDYW1lcmEoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKSBjb25zdCB7CisgICAgcmV0dXJuIGlzSGlkZGVuUGh5c2ljYWxDYW1lcmFJbnRlcm5hbChjYW1lcmFJZCkuZmlyc3Q7Cit9CisKK3N0ZDo6cGFpcjxib29sLCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbyAqPgorQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc0hpZGRlblBoeXNpY2FsQ2FtZXJhSW50ZXJuYWwoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKSBjb25zdCB7CisgICAgYXV0byBmYWxzZVJldCA9IHN0ZDo6bWFrZV9wYWlyKGZhbHNlLCBudWxscHRyKTsKKyAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgeworICAgICAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBwcm92aWRlci0+bURldmljZXMpIHsKKyAgICAgICAgICAgIGlmIChkZXZpY2VJbmZvLT5tSWQgPT0gY2FtZXJhSWQpIHsKKyAgICAgICAgICAgICAgICAvLyBjYW1lcmFJZCBpcyBmb3VuZCBpbiBwdWJsaWMgY2FtZXJhIElEcyBhZHZlcnRpc2VkIGJ5IHRoZQorICAgICAgICAgICAgICAgIC8vIHByb3ZpZGVyLgorICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZVJldDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGZvciAoYXV0byYgcHJvdmlkZXIgOiBtUHJvdmlkZXJzKSB7CisgICAgICAgIGZvciAoYXV0byYgZGV2aWNlSW5mbyA6IHByb3ZpZGVyLT5tRGV2aWNlcykgeworICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgaW5mbzsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IGRldmljZUluZm8tPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcygmaW5mbyk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIGZvciBpZCAlcyIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZUluZm8tPm1JZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2VSZXQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBwaHlzaWNhbElkczsKKyAgICAgICAgICAgIGlmIChkZXZpY2VJbmZvLT5tSXNMb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgICAgICAgICAgaWYgKHN0ZDo6ZmluZChkZXZpY2VJbmZvLT5tUGh5c2ljYWxJZHMuYmVnaW4oKSwgZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhSWQpICE9IGRldmljZUluZm8tPm1QaHlzaWNhbElkcy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZGV2aWNlVmVyc2lvbiA9IEhBUkRXQVJFX0RFVklDRV9BUElfVkVSU0lPTigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VJbmZvLT5tVmVyc2lvbi5nZXRfbWFqb3IoKSwgZGV2aWNlSW5mby0+bVZlcnNpb24uZ2V0X21pbm9yKCkpOworICAgICAgICAgICAgICAgICAgICBpZiAoZGV2aWNlVmVyc2lvbiA8IENBTUVSQV9ERVZJQ0VfQVBJX1ZFUlNJT05fM181KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFdyb25nIGRldmljZVZlcnNpb24gJXggZm9yIGhpZGRlblBoeXNpY2FsQ2FtZXJhSWQgJXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZVZlcnNpb24sIGNhbWVyYUlkLmNfc3RyKCkpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlUmV0OworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHRydWUsIGRldmljZUluZm8uZ2V0KCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlUmV0OworfQorCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmFkZFByb3ZpZGVyTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdQcm92aWRlcikgewogICAgIGZvciAoY29uc3QgYXV0byYgcHJvdmlkZXJJbmZvIDogbVByb3ZpZGVycykgewogICAgICAgICBpZiAocHJvdmlkZXJJbmZvLT5tUHJvdmlkZXJOYW1lID09IG5ld1Byb3ZpZGVyKSB7CiAgICAgICAgICAgICBBTE9HVygiJXM6IENhbWVyYSBwcm92aWRlciBIQUwgd2l0aCBuYW1lICclcycgYWxyZWFkeSByZWdpc3RlcmVkIiwgX19GVU5DVElPTl9fLApAQCAtNDM2LDE4ICsxMTQwLDEzIEBACiAgICAgaW50ZXJmYWNlID0gbVNlcnZpY2VQcm94eS0+Z2V0U2VydmljZShuZXdQcm92aWRlcik7CiAKICAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKLSAgICAgICAgaWYgKGV4cGVjdGVkKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSBwcm92aWRlciBIQUwgJyVzJyBpcyBub3QgYWN0dWFsbHkgYXZhaWxhYmxlIiwgX19GVU5DVElPTl9fLAotICAgICAgICAgICAgICAgICAgICBuZXdQcm92aWRlci5jX3N0cigpKTsKLSAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gT0s7Ci0gICAgICAgIH0KKyAgICAgICAgQUxPR0UoIiVzOiBDYW1lcmEgcHJvdmlkZXIgSEFMICclcycgaXMgbm90IGFjdHVhbGx5IGF2YWlsYWJsZSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICBuZXdQcm92aWRlci5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKLSAgICBzcDxQcm92aWRlckluZm8+IHByb3ZpZGVySW5mbyA9Ci0gICAgICAgICAgICBuZXcgUHJvdmlkZXJJbmZvKG5ld1Byb3ZpZGVyLCBpbnRlcmZhY2UsIHRoaXMpOwotICAgIHN0YXR1c190IHJlcyA9IHByb3ZpZGVySW5mby0+aW5pdGlhbGl6ZSgpOworICAgIHNwPFByb3ZpZGVySW5mbz4gcHJvdmlkZXJJbmZvID0gbmV3IFByb3ZpZGVySW5mbyhuZXdQcm92aWRlciwgdGhpcyk7CisgICAgc3RhdHVzX3QgcmVzID0gcHJvdmlkZXJJbmZvLT5pbml0aWFsaXplKGludGVyZmFjZSwgbURldmljZVN0YXRlKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIHJldHVybiByZXM7CiAgICAgfQpAQCAtNDU4LDYgKzExNTcsNyBAQAogfQogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OnJlbW92ZVByb3ZpZGVyKGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm92aWRlcikgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBwcm92aWRlckxvY2sobVByb3ZpZGVyTGlmZWN5Y2xlTG9jayk7CiAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBsb2NrKG1JbnRlcmZhY2VNdXRleCk7CiAgICAgc3RkOjp2ZWN0b3I8U3RyaW5nOD4gcmVtb3ZlZERldmljZUlkczsKICAgICBzdGF0dXNfdCByZXMgPSBOQU1FX05PVF9GT1VORDsKQEAgLTQ5OCwyNyArMTE5OCwzNiBAQAogCiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6UHJvdmlkZXJJbmZvKAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmcHJvdmlkZXJOYW1lLAotICAgICAgICBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiYgaW50ZXJmYWNlLAogICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXIgKm1hbmFnZXIpIDoKICAgICAgICAgbVByb3ZpZGVyTmFtZShwcm92aWRlck5hbWUpLAotICAgICAgICBtSW50ZXJmYWNlKGludGVyZmFjZSksCiAgICAgICAgIG1Qcm92aWRlclRhZ2lkKGdlbmVyYXRlVmVuZG9yVGFnSWQocHJvdmlkZXJOYW1lKSksCiAgICAgICAgIG1VbmlxdWVEZXZpY2VDb3VudCgwKSwKICAgICAgICAgbU1hbmFnZXIobWFuYWdlcikgewogICAgICh2b2lkKSBtTWFuYWdlcjsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmluaXRpYWxpemUoKSB7CitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6aW5pdGlhbGl6ZSgKKyAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4mIGludGVyZmFjZSwKKyAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPiBjdXJyZW50RGV2aWNlU3RhdGUpIHsKICAgICBzdGF0dXNfdCByZXMgPSBwYXJzZVByb3ZpZGVyTmFtZShtUHJvdmlkZXJOYW1lLCAmbVR5cGUsICZtSWQpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQUxPR0UoIiVzOiBJbnZhbGlkIHByb3ZpZGVyIG5hbWUsIGlnbm9yaW5nIiwgX19GVU5DVElPTl9fKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAgICAgQUxPR0koIkNvbm5lY3RpbmcgdG8gbmV3IGNhbWVyYSBwcm92aWRlcjogJXMsIGlzUmVtb3RlPyAlZCIsCi0gICAgICAgICAgICBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIG1JbnRlcmZhY2UtPmlzUmVtb3RlKCkpOworICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBpbnRlcmZhY2UtPmlzUmVtb3RlKCkpOworCisgICAgLy8gRGV0ZXJtaW5lIG1pbm9yIHZlcnNpb24KKyAgICBhdXRvIGNhc3RSZXN1bHQgPSBwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgIGlmIChjYXN0UmVzdWx0LmlzT2soKSkgeworICAgICAgICBtTWlub3JWZXJzaW9uID0gNTsKKyAgICB9IGVsc2UgeworICAgICAgICBtTWlub3JWZXJzaW9uID0gNDsKKyAgICB9CisKICAgICAvLyBjYW1lcmFEZXZpY2VTdGF0dXNDaGFuZ2UgY2FsbGJhY2tzIG1heSBiZSBjYWxsZWQgKGFuZCBjYXVzaW5nIG5ldyBkZXZpY2VzIGFkZGVkKQogICAgIC8vIGJlZm9yZSBzZXRDYWxsYmFjayByZXR1cm5zCi0gICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHN0YXR1cyA9IG1JbnRlcmZhY2UtPnNldENhbGxiYWNrKHRoaXMpOworICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBpbnRlcmZhY2UtPnNldENhbGxiYWNrKHRoaXMpOwogICAgIGlmICghc3RhdHVzLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIHNldHRpbmcgdXAgY2FsbGJhY2tzIHdpdGggY2FtZXJhIHByb3ZpZGVyICclcyc6ICVzIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CkBAIC01MzAsNyArMTIzOSw3IEBACiAgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKICAgICB9CiAKLSAgICBoYXJkd2FyZTo6UmV0dXJuPGJvb2w+IGxpbmtlZCA9IG1JbnRlcmZhY2UtPmxpbmtUb0RlYXRoKHRoaXMsIC8qY29va2llKi8gbUlkKTsKKyAgICBoYXJkd2FyZTo6UmV0dXJuPGJvb2w+IGxpbmtlZCA9IGludGVyZmFjZS0+bGlua1RvRGVhdGgodGhpcywgLypjb29raWUqLyBtSWQpOwogICAgIGlmICghbGlua2VkLmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIGxpbmtpbmcgdG8gY2FtZXJhIHByb3ZpZGVyICclcycgZGVhdGg6ICVzIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbGlua2VkLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CkBAIC01NDAsMTUgKzEyNDksNDIgQEAKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CiAgICAgfQogCisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICAvLyBTYXZlIEhBTCByZWZlcmVuY2UgaW5kZWZpbml0ZWx5CisgICAgICAgIG1TYXZlZEludGVyZmFjZSA9IGludGVyZmFjZTsKKyAgICB9IGVsc2UgeworICAgICAgICBtQWN0aXZlSW50ZXJmYWNlID0gaW50ZXJmYWNlOworICAgIH0KKworICAgIEFMT0dWKCIlczogU2V0dGluZyBkZXZpY2Ugc3RhdGUgZm9yICVzOiAweCUiIFBSSXg2NCwKKyAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtRGV2aWNlU3RhdGUpOworICAgIG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKGN1cnJlbnREZXZpY2VTdGF0ZSk7CisKKyAgICByZXMgPSBzZXRVcFZlbmRvclRhZ3MoKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIHNldCB1cCB2ZW5kb3IgdGFncyBmcm9tIHByb3ZpZGVyICclcyciLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKICAgICAvLyBHZXQgaW5pdGlhbCBsaXN0IG9mIGNhbWVyYSBkZXZpY2VzLCBpZiBhbnkKICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZGV2aWNlczsKLSAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldCA9IG1JbnRlcmZhY2UtPmdldENhbWVyYUlkTGlzdChbJnN0YXR1cywgJmRldmljZXNdKAorICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFJZExpc3QoWyZzdGF0dXMsIHRoaXMsICZkZXZpY2VzXSgKICAgICAgICAgICAgIFN0YXR1cyBpZFN0YXR1cywKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6aGlkbF9zdHJpbmc+JiBjYW1lcmFEZXZpY2VOYW1lcykgewogICAgICAgICBzdGF0dXMgPSBpZFN0YXR1czsKICAgICAgICAgaWYgKHN0YXR1cyA9PSBTdGF0dXM6Ok9LKSB7Ci0gICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNhbWVyYURldmljZU5hbWVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgZGV2aWNlcy5wdXNoX2JhY2soY2FtZXJhRGV2aWNlTmFtZXNbaV0pOworICAgICAgICAgICAgZm9yIChhdXRvJiBuYW1lIDogY2FtZXJhRGV2aWNlTmFtZXMpIHsKKyAgICAgICAgICAgICAgICB1aW50MTZfdCBtYWpvciwgbWlub3I7CisgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgdHlwZSwgaWQ7CisgICAgICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gcGFyc2VEZXZpY2VOYW1lKG5hbWUsICZtYWpvciwgJm1pbm9yLCAmdHlwZSwgJmlkKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogRXJyb3IgcGFyc2luZyBkZXZpY2VOYW1lOiAlczogJWQiLCBfX0ZVTkNUSU9OX18sIG5hbWUuY19zdHIoKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLnB1c2hfYmFjayhuYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgbVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzLnB1c2hfYmFjayhpZCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICB9IH0pOwogICAgIGlmICghcmV0LmlzT2soKSkgewpAQCAtNTYyLDExICsxMjk4LDI0IEBACiAgICAgICAgIHJldHVybiBtYXBUb1N0YXR1c1Qoc3RhdHVzKTsKICAgICB9CiAKKyAgICByZXQgPSBpbnRlcmZhY2UtPmlzU2V0VG9yY2hNb2RlU3VwcG9ydGVkKAorICAgICAgICBbdGhpc10oYXV0byBzdGF0dXMsIGJvb2wgc3VwcG9ydGVkKSB7CisgICAgICAgICAgICBpZiAoc3RhdHVzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICBtU2V0VG9yY2hNb2RlU3VwcG9ydGVkID0gc3VwcG9ydGVkOworICAgICAgICAgICAgfQorICAgICAgICB9KTsKKyAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvciBjaGVja2luZyB0b3JjaCBtb2RlIHN1cHBvcnQgJyVzJzogJXMiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKworICAgIG1Jc1JlbW90ZSA9IGludGVyZmFjZS0+aXNSZW1vdGUoKTsKKwogICAgIHNwPFN0YXR1c0xpc3RlbmVyPiBsaXN0ZW5lciA9IG1NYW5hZ2VyLT5nZXRTdGF0dXNMaXN0ZW5lcigpOwogICAgIGZvciAoYXV0byYgZGV2aWNlIDogZGV2aWNlcykgewogICAgICAgICBzdGQ6OnN0cmluZyBpZDsKLSAgICAgICAgc3RhdHVzX3QgcmVzID0gYWRkRGV2aWNlKGRldmljZSwKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1czo6UFJFU0VOVCwgJmlkKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gYWRkRGV2aWNlKGRldmljZSwgY29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQsICZpZCk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGVudW1lcmF0ZSBjYW1lcmEgZGV2aWNlICclcyc6ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGRldmljZS5jX3N0cigpLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKQEAgLTU4MSw2ICsxMzMwLDUzIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPgorQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBBTE9HVigiUmVxdWVzdCB0byBzdGFydCBjYW1lcmEgcHJvdmlkZXI6ICVzIiwgbVByb3ZpZGVyTmFtZS5jX3N0cigpKTsKKyAgICBpZiAobVNhdmVkSW50ZXJmYWNlICE9IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIG1TYXZlZEludGVyZmFjZTsKKyAgICB9CisgICAgaWYgKCFrRW5hYmxlTGF6eUhhbCkgeworICAgICAgICBBTE9HRSgiQmFkIHByb3ZpZGVyIHN0YXRlISBTaG91bGQgbm90IGJlIGhlcmUgb24gYSBub24tbGF6eSBIQUwhIik7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGF1dG8gaW50ZXJmYWNlID0gbUFjdGl2ZUludGVyZmFjZS5wcm9tb3RlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dJKCJDYW1lcmEgSEFMIHByb3ZpZGVyIG5lZWRzIHJlc3RhcnQsIGNhbGxpbmcgZ2V0U2VydmljZSglcykiLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgICAgICBpbnRlcmZhY2UgPSBtTWFuYWdlci0+bVNlcnZpY2VQcm94eS0+Z2V0U2VydmljZShtUHJvdmlkZXJOYW1lKTsKKyAgICAgICAgaW50ZXJmYWNlLT5zZXRDYWxsYmFjayh0aGlzKTsKKyAgICAgICAgaGFyZHdhcmU6OlJldHVybjxib29sPiBsaW5rZWQgPSBpbnRlcmZhY2UtPmxpbmtUb0RlYXRoKHRoaXMsIC8qY29va2llKi8gbUlkKTsKKyAgICAgICAgaWYgKCFsaW5rZWQuaXNPaygpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGluIGxpbmtpbmcgdG8gY2FtZXJhIHByb3ZpZGVyICclcycgZGVhdGg6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIGxpbmtlZC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgbU1hbmFnZXItPnJlbW92ZVByb3ZpZGVyKG1Qcm92aWRlck5hbWUpOworICAgICAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICAgIH0gZWxzZSBpZiAoIWxpbmtlZCkgeworICAgICAgICAgICAgQUxPR1coIiVzOiBVbmFibGUgdG8gbGluayB0byBwcm92aWRlciAnJXMnIGRlYXRoIG5vdGlmaWNhdGlvbnMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1Qcm92aWRlck5hbWUuY19zdHIoKSk7CisgICAgICAgIH0KKyAgICAgICAgLy8gU2VuZCBjdXJyZW50IGRldmljZSBzdGF0ZQorICAgICAgICBpZiAobU1pbm9yVmVyc2lvbiA+PSA1KSB7CisgICAgICAgICAgICBhdXRvIGNhc3RSZXN1bHQgPSBwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgICAgICAgICAgaWYgKGNhc3RSZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlXzJfNSA9IGNhc3RSZXN1bHQ7CisgICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZV8yXzUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBBTE9HVigiJXM6IEluaXRpYWwgZGV2aWNlIHN0YXRlIGZvciAlczogMHggJSIgUFJJeDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbVByb3ZpZGVyTmFtZS5jX3N0cigpLCBtRGV2aWNlU3RhdGUpOworICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfMl81LT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShtRGV2aWNlU3RhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG1BY3RpdmVJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIkNhbWVyYSBwcm92aWRlciAoJXMpIGFscmVhZHkgaW4gdXNlLiBSZS11c2luZyBpbnN0YW5jZS4iLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gaW50ZXJmYWNlOworfQorCiBjb25zdCBzdGQ6OnN0cmluZyYgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmdldFR5cGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1UeXBlOwogfQpAQCAtNjYxLDggKzE0NTcsMTAgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JikgY29uc3QgewotICAgIGRwcmludGYoZmQsICI9PSBDYW1lcmEgUHJvdmlkZXIgSEFMICVzICh2Mi40LCAlcykgc3RhdGljIGluZm86ICV6dSBkZXZpY2VzOiA9PVxuIiwKLSAgICAgICAgICAgIG1Qcm92aWRlck5hbWUuY19zdHIoKSwgbUludGVyZmFjZS0+aXNSZW1vdGUoKSA/ICJyZW1vdGUiIDogInBhc3N0aHJvdWdoIiwKKyAgICBkcHJpbnRmKGZkLCAiPT0gQ2FtZXJhIFByb3ZpZGVyIEhBTCAlcyAodjIuJWQsICVzKSBzdGF0aWMgaW5mbzogJXp1IGRldmljZXM6ID09XG4iLAorICAgICAgICAgICAgbVByb3ZpZGVyTmFtZS5jX3N0cigpLAorICAgICAgICAgICAgbU1pbm9yVmVyc2lvbiwKKyAgICAgICAgICAgIG1Jc1JlbW90ZSA/ICJyZW1vdGUiIDogInBhc3N0aHJvdWdoIiwKICAgICAgICAgICAgIG1EZXZpY2VzLnNpemUoKSk7CiAKICAgICBmb3IgKGF1dG8mIGRldmljZSA6IG1EZXZpY2VzKSB7CkBAIC03MDMsNiArMTUwMSwyNCBAQAogICAgICAgICAgICAgaW5mbzIuZHVtcChmZCwgLyp2ZXJib3NpdHkqLyAyLCAvKmluZGVudGF0aW9uKi8gNCk7CiAgICAgICAgIH0KIAorICAgICAgICAvLyBEdW1wIGNoYXJhY3RlcmlzdGljcyBvZiBub24tc3RhbmRhbG9uZSBwaHlzaWNhbCBjYW1lcmEKKyAgICAgICAgaWYgKGRldmljZS0+bUlzTG9naWNhbENhbWVyYSkgeworICAgICAgICAgICAgZm9yIChhdXRvJiBpZCA6IGRldmljZS0+bVBoeXNpY2FsSWRzKSB7CisgICAgICAgICAgICAgICAgLy8gU2tpcCBpZiBwaHlzaWNhbCBpZCBpcyBhbiBpbmRlcGVuZGVudCBjYW1lcmEKKyAgICAgICAgICAgICAgICBpZiAoc3RkOjpmaW5kKG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcy5iZWdpbigpLCBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHMuZW5kKCksIGlkKQorICAgICAgICAgICAgICAgICAgICAgICAgIT0gbVByb3ZpZGVyUHVibGljQ2FtZXJhSWRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhIHBoeXNpY2FsSW5mbzsKKyAgICAgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkZXZpY2UtPmdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGlkLCAmcGh5c2ljYWxJbmZvKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RhdHVzID09IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICIgIFBoeXNpY2FsIGNhbWVyYSAlcyBjaGFyYWN0ZXJpc3RpY3M6XG4iLCBpZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxJbmZvLmR1bXAoZmQsIC8qdmVyYm9zaXR5Ki8gMiwgLyppbmRlbnRhdGlvbiovIDQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCiAgICAgICAgIGRwcmludGYoZmQsICI9PSBDYW1lcmEgSEFMIGRldmljZSAlcyAodiVkLiVkKSBkdW1wU3RhdGU6ID09XG4iLCBkZXZpY2UtPm1OYW1lLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgZGV2aWNlLT5tVmVyc2lvbi5nZXRfbWFqb3IoKSwgZGV2aWNlLT5tVmVyc2lvbi5nZXRfbWlub3IoKSk7CiAgICAgICAgIHJlcyA9IGRldmljZS0+ZHVtcFN0YXRlKGZkKTsKQEAgLTc3Miw2ICsxNTg4LDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIHRvcmNoU3RhdHVzVG9TdHJpbmcobmV3U3RhdHVzKSk7CiAgICAgICAgICAgICAgICAgaWQgPSBkZXZpY2VJbmZvLT5tSWQ7CiAgICAgICAgICAgICAgICAga25vd24gPSB0cnVlOworICAgICAgICAgICAgICAgIGlmIChUb3JjaE1vZGVTdGF0dXM6OkFWQUlMQUJMRV9PTiAhPSBuZXdTdGF0dXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbU1hbmFnZXItPnJlbW92ZVJlZihEZXZpY2VNb2RlOjpUT1JDSCwgaWQpOworICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtODAwLDE1ICsxNjE5LDc1IEBACiAgICAgbU1hbmFnZXItPnJlbW92ZVByb3ZpZGVyKG1Qcm92aWRlck5hbWUpOwogfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c2V0VXBWZW5kb3JUYWdzKCkgeworICAgIGlmIChtVmVuZG9yVGFnRGVzY3JpcHRvciAhPSBudWxscHRyKQorICAgICAgICByZXR1cm4gT0s7CisKKyAgICBoYXJkd2FyZTo6aGlkbF92ZWM8VmVuZG9yVGFnU2VjdGlvbj4gdnRzOworICAgIFN0YXR1cyBzdGF0dXM7CisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7CisgICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlID0gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIHJldCA9IGludGVyZmFjZS0+Z2V0VmVuZG9yVGFncygKKyAgICAgICAgWyZdKGF1dG8gcywgY29uc3QgYXV0byYgdmVuZG9yVGFnU2VjcykgeworICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKKyAgICAgICAgICAgICAgICB2dHMgPSB2ZW5kb3JUYWdTZWNzOworICAgICAgICAgICAgfQorICAgIH0pOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgdmVuZG9yIHRhZ3MgZnJvbSBwcm92aWRlciAnJXMnOiAlcyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtUHJvdmlkZXJOYW1lLmNfc3RyKCksIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgeworICAgICAgICByZXR1cm4gbWFwVG9TdGF0dXNUKHN0YXR1cyk7CisgICAgfQorCisgICAgLy8gUmVhZCBhbGwgdmVuZG9yIHRhZyBkZWZpbml0aW9ucyBpbnRvIGEgZGVzY3JpcHRvcgorICAgIHN0YXR1c190IHJlczsKKyAgICBpZiAoKHJlcyA9IEhpZGxWZW5kb3JUYWdEZXNjcmlwdG9yOjpjcmVhdGVEZXNjcmlwdG9yRnJvbUhpZGwodnRzLCAvKm91dCovbVZlbmRvclRhZ0Rlc2NyaXB0b3IpKQorICAgICAgICAgICAgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgZ2VuZXJhdGUgZGVzY3JpcHRvciBmcm9tIHZlbmRvciB0YWcgb3BlcmF0aW9ucywiCisgICAgICAgICAgICAgICAgInJlY2VpdmVkIGVycm9yICVzICglZCkuIENhbWVyYSBjbGllbnRzIHdpbGwgbm90IGJlIGFibGUgdG8gdXNlIgorICAgICAgICAgICAgICAgICJ2ZW5kb3IgdGFncyIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IocmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSgKKyAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPiBuZXdEZXZpY2VTdGF0ZSkgeworICAgIG1EZXZpY2VTdGF0ZSA9IG5ld0RldmljZVN0YXRlOworICAgIGlmIChtTWlub3JWZXJzaW9uID49IDUpIHsKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIHByb3ZpZGVyIGlzIGN1cnJlbnRseSBhY3RpdmUgLSBub3QgZ29pbmcgdG8gc3RhcnQgaXQgdXAgZm9yIHRoaXMgbm90aWZpY2F0aW9uCisgICAgICAgIGF1dG8gaW50ZXJmYWNlID0gbVNhdmVkSW50ZXJmYWNlICE9IG51bGxwdHIgPyBtU2F2ZWRJbnRlcmZhY2UgOiBtQWN0aXZlSW50ZXJmYWNlLnByb21vdGUoKTsKKyAgICAgICAgaWYgKGludGVyZmFjZSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAvLyBTZW5kIGN1cnJlbnQgZGV2aWNlIHN0YXRlCisgICAgICAgICAgICBhdXRvIGNhc3RSZXN1bHQgPSBwcm92aWRlcjo6VjJfNTo6SUNhbWVyYVByb3ZpZGVyOjpjYXN0RnJvbShpbnRlcmZhY2UpOworICAgICAgICAgICAgaWYgKGNhc3RSZXN1bHQuaXNPaygpKSB7CisgICAgICAgICAgICAgICAgc3A8cHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlXzJfNSA9IGNhc3RSZXN1bHQ7CisgICAgICAgICAgICAgICAgaWYgKGludGVyZmFjZV8yXzUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfMl81LT5ub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZShtRGV2aWNlU3RhdGUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKIHRlbXBsYXRlPGNsYXNzIERldmljZUluZm9UPgogc3RkOjp1bmlxdWVfcHRyPENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvPgogICAgIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjppbml0aWFsaXplRGV2aWNlSW5mbygKICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLAotICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1pbm9yVmVyc2lvbikgY29uc3QgeworICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1pbm9yVmVyc2lvbikgewogICAgIFN0YXR1cyBzdGF0dXM7CiAKICAgICBhdXRvIGNhbWVyYUludGVyZmFjZSA9Ci0gICAgICAgICAgICBnZXREZXZpY2VJbnRlcmZhY2U8dHlwZW5hbWUgRGV2aWNlSW5mb1Q6OkludGVyZmFjZVQ+KG5hbWUpOworICAgICAgICAgICAgc3RhcnREZXZpY2VJbnRlcmZhY2U8dHlwZW5hbWUgRGV2aWNlSW5mb1Q6OkludGVyZmFjZVQ+KG5hbWUpOwogICAgIGlmIChjYW1lcmFJbnRlcmZhY2UgPT0gbnVsbHB0cikgcmV0dXJuIG51bGxwdHI7CiAKICAgICBDYW1lcmFSZXNvdXJjZUNvc3QgcmVzb3VyY2VDb3N0OwpAQCAtODM1LDEzICsxNzE0LDEzIEBACiAgICAgfQogCiAgICAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxEZXZpY2VJbmZvPigKLSAgICAgICAgbmV3IERldmljZUluZm9UKG5hbWUsIHRhZ0lkLCBpZCwgbWlub3JWZXJzaW9uLCByZXNvdXJjZUNvc3QsCi0gICAgICAgICAgICAgICAgY2FtZXJhSW50ZXJmYWNlKSk7CisgICAgICAgIG5ldyBEZXZpY2VJbmZvVChuYW1lLCB0YWdJZCwgaWQsIG1pbm9yVmVyc2lvbiwgcmVzb3VyY2VDb3N0LCB0aGlzLAorICAgICAgICAgICAgICAgIG1Qcm92aWRlclB1YmxpY0NhbWVyYUlkcywgY2FtZXJhSW50ZXJmYWNlKSk7CiB9CiAKIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+CiBzcDxJbnRlcmZhY2VUPgotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmdldERldmljZUludGVyZmFjZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgY29uc3QgeworQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnN0YXJ0RGV2aWNlSW50ZXJmYWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7CiAgICAgQUxPR0UoIiVzOiBEZXZpY2UgJXM6IFVua25vd24gSElETCBkZXZpY2UgSEFMIG1ham9yIHZlcnNpb24gJWQ6IiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgbmFtZS5jX3N0cigpLCBJbnRlcmZhY2VUOjp2ZXJzaW9uLmdldF9tYWpvcigpKTsKICAgICByZXR1cm4gbnVsbHB0cjsKQEAgLTg0OSwxMiArMTcyOCwxNiBAQAogCiB0ZW1wbGF0ZTw+CiBzcDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+Ci1DYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6Z2V0RGV2aWNlSW50ZXJmYWNlCi0gICAgICAgIDxkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBjb25zdCB7CitDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6c3RhcnREZXZpY2VJbnRlcmZhY2UKKyAgICAgICAgPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4oY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpIHsKICAgICBTdGF0dXMgc3RhdHVzOwogICAgIHNwPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4gY2FtZXJhSW50ZXJmYWNlOwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIHJldCA9IG1JbnRlcmZhY2UtPmdldENhbWVyYURldmljZUludGVyZmFjZV9WMV94KG5hbWUsIFsmc3RhdHVzLCAmY2FtZXJhSW50ZXJmYWNlXSgKKyAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBpbnRlcmZhY2UgPSBzdGFydFByb3ZpZGVySW50ZXJmYWNlKCk7CisgICAgaWYgKGludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYURldmljZUludGVyZmFjZV9WMV94KG5hbWUsIFsmc3RhdHVzLCAmY2FtZXJhSW50ZXJmYWNlXSgKICAgICAgICAgU3RhdHVzIHMsIHNwPGRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZT4gaW50ZXJmYWNlKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKICAgICAgICAgICAgICAgICBjYW1lcmFJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CkBAIC04NzQsMTIgKzE3NTcsMTYgQEAKIAogdGVtcGxhdGU8Pgogc3A8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPgotQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OmdldERldmljZUludGVyZmFjZQotICAgICAgICA8ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlPihjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSkgY29uc3QgeworQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OnN0YXJ0RGV2aWNlSW50ZXJmYWNlCisgICAgICAgIDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+KGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSB7CiAgICAgU3RhdHVzIHN0YXR1czsKICAgICBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+IGNhbWVyYUludGVyZmFjZTsKICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBtSW50ZXJmYWNlLT5nZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2VfVjNfeChuYW1lLCBbJnN0YXR1cywgJmNhbWVyYUludGVyZmFjZV0oCisgICAgY29uc3Qgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gaW50ZXJmYWNlID0gc3RhcnRQcm92aWRlckludGVyZmFjZSgpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFEZXZpY2VJbnRlcmZhY2VfVjNfeChuYW1lLCBbJnN0YXR1cywgJmNhbWVyYUludGVyZmFjZV0oCiAgICAgICAgIFN0YXR1cyBzLCBzcDxkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZSkgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CiAgICAgICAgICAgICAgICAgY2FtZXJhSW50ZXJmYWNlID0gaW50ZXJmYWNlOwpAQCAtOTAwLDYgKzE3ODcsMTggQEAKIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvOjp+RGV2aWNlSW5mbygpIHt9CiAKIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+CitzcDxJbnRlcmZhY2VUPiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzo6c3RhcnREZXZpY2VJbnRlcmZhY2UoKSB7CisgICAgc3A8SW50ZXJmYWNlVD4gZGV2aWNlOworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgaWYgKG1TYXZlZEludGVyZmFjZSA9PSBudWxscHRyKSB7CisgICAgICAgIGRldmljZSA9IG1QYXJlbnRQcm92aWRlci0+c3RhcnREZXZpY2VJbnRlcmZhY2U8SW50ZXJmYWNlVD4obU5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGRldmljZSA9IChJbnRlcmZhY2VUICopIG1TYXZlZEludGVyZmFjZS5nZXQoKTsKKyAgICB9CisgICAgcmV0dXJuIGRldmljZTsKK30KKwordGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvOjpzZXRUb3JjaE1vZGUoSW50ZXJmYWNlVCYgaW50ZXJmYWNlLAogICAgICAgICBib29sIGVuYWJsZWQpIHsKICAgICBTdGF0dXMgcyA9IGludGVyZmFjZS0+c2V0VG9yY2hNb2RlKGVuYWJsZWQgPyBUb3JjaE1vZGU6Ok9OIDogVG9yY2hNb2RlOjpPRkYpOwpAQCAtOTEwLDMwICsxODA5LDMxIEBACiAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLCBjb25zdCBzdGQ6OnN0cmluZyAmaWQsCiAgICAgICAgIHVpbnQxNl90IG1pbm9yVmVyc2lvbiwKICAgICAgICAgY29uc3QgQ2FtZXJhUmVzb3VyY2VDb3N0JiByZXNvdXJjZUNvc3QsCisgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gcGFyZW50UHJvdmlkZXIsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLAogICAgICAgICBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UpIDoKICAgICAgICAgRGV2aWNlSW5mbyhuYW1lLCB0YWdJZCwgaWQsIGhhcmR3YXJlOjpoaWRsX3ZlcnNpb257MSwgbWlub3JWZXJzaW9ufSwKLSAgICAgICAgICAgICAgICAgICByZXNvdXJjZUNvc3QpLAotICAgICAgICBtSW50ZXJmYWNlKGludGVyZmFjZSkgeworICAgICAgICAgICAgICAgICAgIHB1YmxpY0NhbWVyYUlkcywgcmVzb3VyY2VDb3N0LCBwYXJlbnRQcm92aWRlcikgewogICAgIC8vIEdldCBkZWZhdWx0IHBhcmFtZXRlcnMgYW5kIGluaXRpYWxpemUgZmxhc2ggdW5pdCBhdmFpbGFiaWxpdHkKICAgICAvLyBSZXF1aXJlcyBwb3dlcmluZyBvbiB0aGUgY2FtZXJhIGRldmljZQotICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBtSW50ZXJmYWNlLT5vcGVuKG51bGxwdHIpOworICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzdGF0dXMgPSBpbnRlcmZhY2UtPm9wZW4obnVsbHB0cik7CiAgICAgaWYgKCFzdGF0dXMuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3Igb3BlbmluZyBjYW1lcmEgZGV2aWNlICVzIHRvIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwogICAgICAgICByZXR1cm47CiAgICAgfQogICAgIGlmIChzdGF0dXMgIT0gU3RhdHVzOjpPSykgewogICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBvcGVuIGNhbWVyYSBkZXZpY2UgJXMgdG8gY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLCBfX0ZVTkNUSU9OX18sCi0gICAgICAgICAgICAgICAgbUlkLmNfc3RyKCksIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3RhdHVzVG9TdHJpbmcoc3RhdHVzKSk7CisgICAgICAgICAgICAgICAgaWQuY19zdHIoKSwgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdGF0dXNUb1N0cmluZyhzdGF0dXMpKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJldDsKLSAgICByZXQgPSBtSW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKFt0aGlzXShjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIHBhcm1zKSB7CisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRQYXJhbWV0ZXJzKFt0aGlzXShjb25zdCBoYXJkd2FyZTo6aGlkbF9zdHJpbmcmIHBhcm1zKSB7CiAgICAgICAgICAgICAgICAgbURlZmF1bHRQYXJhbWV0ZXJzLnVuZmxhdHRlbihTdHJpbmc4KHBhcm1zLmNfc3RyKCkpKTsKICAgICAgICAgICAgIH0pOwogICAgIGlmICghcmV0LmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIHJlYWRpbmcgY2FtZXJhIGRldmljZSAlcyBwYXJhbXMgdG8gY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgc3RhdHVzLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgY29uc3QgY2hhciAqZmxhc2hNb2RlID0KQEAgLTk0MiwyNyArMTg0Miw0MyBAQAogICAgICAgICBtSGFzRmxhc2hVbml0ID0gdHJ1ZTsKICAgICB9CiAKLSAgICByZXQgPSBtSW50ZXJmYWNlLT5jbG9zZSgpOworICAgIHN0YXR1c190IHJlcyA9IGNhY2hlQ2FtZXJhSW5mbyhpbnRlcmZhY2UpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBDb3VsZCBub3QgY2FjaGUgQ2FtZXJhSW5mbyIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICByZXQgPSBpbnRlcmZhY2UtPmNsb3NlKCk7CiAgICAgaWYgKCFyZXQuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3IgY2xvc2luZyBjYW1lcmEgZGV2aWNlICVzIGFmdGVyIGNoZWNrIGZvciBhIGZsYXNoIHVuaXQ6ICVzIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5jX3N0cigpLCBzdGF0dXMuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIHN0YXR1cy5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKworICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgLy8gU2F2ZSBIQUwgcmVmZXJlbmNlIGluZGVmaW5pdGVseQorICAgICAgICBtU2F2ZWRJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CiAgICAgfQogfQogCiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6On5EZXZpY2VJbmZvMSgpIHt9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6c2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgewotICAgIHJldHVybiBEZXZpY2VJbmZvOjpzZXRUb3JjaE1vZGUobUludGVyZmFjZSwgZW5hYmxlZCk7CisgICAgcmV0dXJuIHNldFRvcmNoTW9kZUZvckRldmljZTxJbnRlcmZhY2VUPihlbmFibGVkKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpnZXRDYW1lcmFJbmZvKAogICAgICAgICBoYXJkd2FyZTo6Q2FtZXJhSW5mbyAqaW5mbykgY29uc3QgewogICAgIGlmIChpbmZvID09IG51bGxwdHIpIHJldHVybiBCQURfVkFMVUU7CisgICAgKmluZm8gPSBtSW5mbzsKKyAgICByZXR1cm4gT0s7Cit9CiAKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMTo6Y2FjaGVDYW1lcmFJbmZvKAorICAgICAgICBzcDxDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OkludGVyZmFjZVQ+IGludGVyZmFjZSkgewogICAgIFN0YXR1cyBzdGF0dXM7CiAgICAgZGV2aWNlOjpWMV8wOjpDYW1lcmFJbmZvIGNJbmZvOwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmV0OwotICAgIHJldCA9IG1JbnRlcmZhY2UtPmdldENhbWVyYUluZm8oWyZzdGF0dXMsICZjSW5mb10oU3RhdHVzIHMsIGRldmljZTo6VjFfMDo6Q2FtZXJhSW5mbyBjYW1JbmZvKSB7CisgICAgcmV0ID0gaW50ZXJmYWNlLT5nZXRDYW1lcmFJbmZvKFsmc3RhdHVzLCAmY0luZm9dKFN0YXR1cyBzLCBkZXZpY2U6OlYxXzA6OkNhbWVyYUluZm8gY2FtSW5mbykgewogICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7CiAgICAgICAgICAgICAgICAgY0luZm8gPSBjYW1JbmZvOwogICAgICAgICAgICAgfSk7CkBAIC05NzcsMjcgKzE4OTMsMzEgQEAKIAogICAgIHN3aXRjaChjSW5mby5mYWNpbmcpIHsKICAgICAgICAgY2FzZSBkZXZpY2U6OlYxXzA6OkNhbWVyYUZhY2luZzo6QkFDSzoKLSAgICAgICAgICAgIGluZm8tPmZhY2luZyA9IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0JBQ0s7CisgICAgICAgICAgICBtSW5mby5mYWNpbmcgPSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19CQUNLOwogICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgZGV2aWNlOjpWMV8wOjpDYW1lcmFGYWNpbmc6OkVYVEVSTkFMOgogICAgICAgICAgICAgLy8gTWFwIGV4dGVybmFsIHRvIGZyb250IGZvciBsZWdhY3kgQVBJCiAgICAgICAgIGNhc2UgZGV2aWNlOjpWMV8wOjpDYW1lcmFGYWNpbmc6OkZST05UOgotICAgICAgICAgICAgaW5mby0+ZmFjaW5nID0gaGFyZHdhcmU6OkNBTUVSQV9GQUNJTkdfRlJPTlQ7CisgICAgICAgICAgICBtSW5mby5mYWNpbmcgPSBoYXJkd2FyZTo6Q0FNRVJBX0ZBQ0lOR19GUk9OVDsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgQUxPR1coIiVzOiBEZXZpY2UgJXM6IFVua25vd24gY2FtZXJhIGZhY2luZzogJWQiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZC5jX3N0cigpLCBjSW5mby5mYWNpbmcpOwotICAgICAgICAgICAgaW5mby0+ZmFjaW5nID0gaGFyZHdhcmU6OkNBTUVSQV9GQUNJTkdfQkFDSzsKKyAgICAgICAgICAgIG1JbmZvLmZhY2luZyA9IGhhcmR3YXJlOjpDQU1FUkFfRkFDSU5HX0JBQ0s7CiAgICAgfQotICAgIGluZm8tPm9yaWVudGF0aW9uID0gY0luZm8ub3JpZW50YXRpb247CisgICAgbUluZm8ub3JpZW50YXRpb24gPSBjSW5mby5vcmllbnRhdGlvbjsKIAogICAgIHJldHVybiBPSzsKIH0KIAotc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8xOjpkdW1wU3RhdGUoaW50IGZkKSBjb25zdCB7CitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzE6OmR1bXBTdGF0ZShpbnQgZmQpIHsKICAgICBuYXRpdmVfaGFuZGxlX3QqIGhhbmRsZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7CiAgICAgaGFuZGxlLT5kYXRhWzBdID0gZmQ7Ci0gICAgaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+IHMgPSBtSW50ZXJmYWNlLT5kdW1wU3RhdGUoaGFuZGxlKTsKKyAgICBjb25zdCBzcDxJbnRlcmZhY2VUPiBpbnRlcmZhY2UgPSBzdGFydERldmljZUludGVyZmFjZTxJbnRlcmZhY2VUPigpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGhhcmR3YXJlOjpSZXR1cm48U3RhdHVzPiBzID0gaW50ZXJmYWNlLT5kdW1wU3RhdGUoaGFuZGxlKTsKICAgICBuYXRpdmVfaGFuZGxlX2RlbGV0ZShoYW5kbGUpOwogICAgIGlmICghcy5pc09rKCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTAwOSwxNCArMTkyOSwxNSBAQAogICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAogICAgICAgICB1aW50MTZfdCBtaW5vclZlcnNpb24sCiAgICAgICAgIGNvbnN0IENhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAorICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywKICAgICAgICAgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKSA6CiAgICAgICAgIERldmljZUluZm8obmFtZSwgdGFnSWQsIGlkLCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uezMsIG1pbm9yVmVyc2lvbn0sCi0gICAgICAgICAgICAgICAgICAgcmVzb3VyY2VDb3N0KSwKLSAgICAgICAgbUludGVyZmFjZShpbnRlcmZhY2UpIHsKKyAgICAgICAgICAgICAgICAgICBwdWJsaWNDYW1lcmFJZHMsIHJlc291cmNlQ29zdCwgcGFyZW50UHJvdmlkZXIpIHsKICAgICAvLyBHZXQgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBhbmQgaW5pdGlhbGl6ZSBmbGFzaCB1bml0IGF2YWlsYWJpbGl0eQogICAgIFN0YXR1cyBzdGF0dXM7CiAgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXQ7Ci0gICAgcmV0ID0gbUludGVyZmFjZS0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKFsmc3RhdHVzLCB0aGlzXShTdGF0dXMgcywKKyAgICByZXQgPSBpbnRlcmZhY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhbJnN0YXR1cywgdGhpc10oU3RhdHVzIHMsCiAgICAgICAgICAgICAgICAgICAgIGRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEgbWV0YWRhdGEpIHsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwogICAgICAgICAgICAgICAgIGlmIChzID09IFN0YXR1czo6T0spIHsKQEAgLTEwMzUsMTUgKzE5NTYsMzUgQEAKICAgICAgICAgICAgIH0pOwogICAgIGlmICghcmV0LmlzT2soKSkgewogICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgY2FtZXJhIGNoYXJhY3RlcmlzdGljcyBmb3IgZGV2aWNlICVzIgotICAgICAgICAgICAgICAgICIgdG8gY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLCBfX0ZVTkNUSU9OX18sIG1JZC5jX3N0cigpLAorICAgICAgICAgICAgICAgICIgdG8gY2hlY2sgZm9yIGEgZmxhc2ggdW5pdDogJXMiLCBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CiAgICAgICAgIHJldHVybjsKICAgICB9CiAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CiAgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZvciBkZXZpY2UgJXM6ICVzICglZCkiLAotICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLmNfc3RyKCksIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3RhdHVzVG9TdHJpbmcoc3RhdHVzKSwgc3RhdHVzKTsKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6c3RhdHVzVG9TdHJpbmcoc3RhdHVzKSwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKworICAgIG1Jc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEgPSBpc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoKTsKKworICAgIHN0YXR1c190IHJlcyA9IGZpeHVwTW9ub2Nocm9tZVRhZ3MoKTsKKyAgICBpZiAoT0sgIT0gcmVzKSB7CisgICAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGZpeCB1cCBtb25vY2hyb21lIHRhZ3MgYmFzZWQgZm9yIG9sZGVyIEhBTCB2ZXJzaW9uOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGF1dG8gc3RhdCA9IGFkZER5bmFtaWNEZXB0aFRhZ3MoKTsKKyAgICBpZiAoT0sgIT0gc3RhdCkgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCBhcHBlbmRpbmcgZHluYW1pYyBkZXB0aCB0YWdzOiAlcyAoJWQpIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtc3RhdCksCisgICAgICAgICAgICAgICAgc3RhdCk7CisgICAgfQorICAgIHJlcyA9IGRlcml2ZUhlaWNUYWdzKCk7CisgICAgaWYgKE9LICE9IHJlcykgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBkZXJpdmUgSEVJQyB0YWdzIGJhc2VkIG9uIGNhbWVyYSBhbmQgbWVkaWEgY2FwYWJpbGl0aWVzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgIH0KKwogICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBmbGFzaEF2YWlsYWJsZSA9CiAgICAgICAgICAgICBtQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQoQU5EUk9JRF9GTEFTSF9JTkZPX0FWQUlMQUJMRSk7CiAgICAgaWYgKGZsYXNoQXZhaWxhYmxlLmNvdW50ID09IDEgJiYKQEAgLTEwNTIsMTIgKzE5OTMsNzEgQEAKICAgICB9IGVsc2UgewogICAgICAgICBtSGFzRmxhc2hVbml0ID0gZmFsc2U7CiAgICAgfQorCisgICAgcXVlcnlQaHlzaWNhbENhbWVyYUlkcygpOworCisgICAgLy8gR2V0IHBoeXNpY2FsIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MgaWYgYXBwbGljYWJsZQorICAgIGF1dG8gY2FzdFJlc3VsdCA9IGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZTo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICBpZiAoIWNhc3RSZXN1bHQuaXNPaygpKSB7CisgICAgICAgIEFMT0dWKCIlczogVW5hYmxlIHRvIGNvbnZlcnQgSUNhbWVyYURldmljZSBpbnN0YW5jZSB0byB2ZXJzaW9uIDMuNSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgc3A8ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlPiBpbnRlcmZhY2VfM181ID0gY2FzdFJlc3VsdDsKKyAgICBpZiAoaW50ZXJmYWNlXzNfNSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogQ29udmVydGVkIElDYW1lcmFEZXZpY2UgaW5zdGFuY2UgdG8gbnVsbHB0ciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAobUlzTG9naWNhbENhbWVyYSkgeworICAgICAgICBmb3IgKGF1dG8mIGlkIDogbVBoeXNpY2FsSWRzKSB7CisgICAgICAgICAgICBpZiAoc3RkOjpmaW5kKG1QdWJsaWNDYW1lcmFJZHMuYmVnaW4oKSwgbVB1YmxpY0NhbWVyYUlkcy5lbmQoKSwgaWQpICE9CisgICAgICAgICAgICAgICAgICAgIG1QdWJsaWNDYW1lcmFJZHMuZW5kKCkpIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIGhpZGxJZChpZCk7CisgICAgICAgICAgICByZXQgPSBpbnRlcmZhY2VfM181LT5nZXRQaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcyhoaWRsSWQsCisgICAgICAgICAgICAgICAgICAgIFsmc3RhdHVzLCAmaWQsIHRoaXNdKFN0YXR1cyBzLCBkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhIG1ldGFkYXRhKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICBpZiAocyA9PSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV90ICpidWZmZXIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPihtZXRhZGF0YS5kYXRhKCkpOworICAgICAgICAgICAgICAgICAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gbWV0YWRhdGEuc2l6ZSgpOworICAgICAgICAgICAgICAgICAgICBpbnQgcmVzID0gdmFsaWRhdGVfY2FtZXJhX21ldGFkYXRhX3N0cnVjdHVyZShidWZmZXIsICZleHBlY3RlZFNpemUpOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzID09IE9LIHx8IHJlcyA9PSBDQU1FUkFfTUVUQURBVEFfVkFMSURBVElPTl9TSElGVEVEKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl9pZChidWZmZXIsIG1Qcm92aWRlclRhZ2lkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljc1tpZF0gPSBidWZmZXI7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IE1hbGZvcm1lZCBjYW1lcmEgbWV0YWRhdGEgcmVjZWl2ZWQgZnJvbSBIQUwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gU3RhdHVzOjpJTlRFUk5BTF9FUlJPUjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0pOworCisgICAgICAgICAgICBpZiAoIXJldC5pc09rKCkpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yIGdldHRpbmcgcGh5c2ljYWwgY2FtZXJhICVzIGNoYXJhY3RlcmlzdGljcyBmb3IgJXM6ICVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgaWQuY19zdHIoKSwgaWQuY19zdHIoKSwgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBTdGF0dXM6Ok9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gZ2V0IHBoeXNpY2FsIGNhbWVyYSAlcyBjaGFyYWN0ZXJpc3RpY3MgZm9yIGRldmljZSAlczogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGlkLmNfc3RyKCksIG1JZC5jX3N0cigpLAorICAgICAgICAgICAgICAgICAgICAgICAgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzdGF0dXNUb1N0cmluZyhzdGF0dXMpLCBzdGF0dXMpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgha0VuYWJsZUxhenlIYWwpIHsKKyAgICAgICAgLy8gU2F2ZSBIQUwgcmVmZXJlbmNlIGluZGVmaW5pdGVseQorICAgICAgICBtU2F2ZWRJbnRlcmZhY2UgPSBpbnRlcmZhY2U7CisgICAgfQogfQogCiBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6On5EZXZpY2VJbmZvMygpIHt9CiAKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6c2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgewotICAgIHJldHVybiBEZXZpY2VJbmZvOjpzZXRUb3JjaE1vZGUobUludGVyZmFjZSwgZW5hYmxlZCk7CisgICAgcmV0dXJuIHNldFRvcmNoTW9kZUZvckRldmljZTxJbnRlcmZhY2VUPihlbmFibGVkKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpnZXRDYW1lcmFJbmZvKApAQCAtMTA5NCw2ICsyMDk0LDEzIEBACiAgICAgcmV0dXJuIE9LOwogfQogYm9vbCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmlzQVBJMUNvbXBhdGlibGUoKSBjb25zdCB7CisgICAgLy8gRG8gbm90IGFkdmVydGlzZSBOSVIgY2FtZXJhcyB0byBBUEkxIGNhbWVyYSBhcHAuCisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGNmYSA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZCgKKyAgICAgICAgICAgIEFORFJPSURfU0VOU09SX0lORk9fQ09MT1JfRklMVEVSX0FSUkFOR0VNRU5UKTsKKyAgICBpZiAoY2ZhLmNvdW50ID09IDEgJiYgY2ZhLmRhdGEudThbMF0gPT0gQU5EUk9JRF9TRU5TT1JfSU5GT19DT0xPUl9GSUxURVJfQVJSQU5HRU1FTlRfTklSKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKICAgICBib29sIGlzQmFja3dhcmRDb21wYXRpYmxlID0gZmFsc2U7CiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgY2FwcyA9IG1DYW1lcmFDaGFyYWN0ZXJpc3RpY3MuZmluZCgKICAgICAgICAgICAgIEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTKTsKQEAgLTExMDgsMTAgKzIxMTUsMTQgQEAKICAgICByZXR1cm4gaXNCYWNrd2FyZENvbXBhdGlibGU7CiB9CiAKLXN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6ZHVtcFN0YXRlKGludCBmZCkgY29uc3Qgeworc3RhdHVzX3QgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpkdW1wU3RhdGUoaW50IGZkKSB7CiAgICAgbmF0aXZlX2hhbmRsZV90KiBoYW5kbGUgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOwogICAgIGhhbmRsZS0+ZGF0YVswXSA9IGZkOwotICAgIGF1dG8gcmV0ID0gbUludGVyZmFjZS0+ZHVtcFN0YXRlKGhhbmRsZSk7CisgICAgY29uc3Qgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlID0gc3RhcnREZXZpY2VJbnRlcmZhY2U8SW50ZXJmYWNlVD4oKTsKKyAgICBpZiAoaW50ZXJmYWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgIH0KKyAgICBhdXRvIHJldCA9IGludGVyZmFjZS0+ZHVtcFN0YXRlKGhhbmRsZSk7CiAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKICAgICBpZiAoIXJldC5pc09rKCkpIHsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwpAQCAtMTEyNyw2ICsyMTM4LDYxIEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OlByb3ZpZGVySW5mbzo6RGV2aWNlSW5mbzM6OmdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGh5c2ljYWxDYW1lcmFJZCwgQ2FtZXJhTWV0YWRhdGEgKmNoYXJhY3RlcmlzdGljcykgY29uc3QgeworICAgIGlmIChjaGFyYWN0ZXJpc3RpY3MgPT0gbnVsbHB0cikgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICBpZiAobVBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzLmZpbmQocGh5c2ljYWxDYW1lcmFJZCkgPT0KKyAgICAgICAgICAgIG1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcy5lbmQoKSkgeworICAgICAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgfQorCisgICAgKmNoYXJhY3RlcmlzdGljcyA9IG1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljcy5hdChwaHlzaWNhbENhbWVyYUlkKTsKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvMzo6aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICZjb25maWd1cmF0aW9uLAorICAgICAgICBib29sICpzdGF0dXMgLypvdXQqLykgeworCisgICAgY29uc3Qgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpJbnRlcmZhY2VUPiBpbnRlcmZhY2UgPQorICAgICAgICAgICAgdGhpcy0+c3RhcnREZXZpY2VJbnRlcmZhY2U8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpQcm92aWRlckluZm86OkRldmljZUluZm8zOjpJbnRlcmZhY2VUPigpOworICAgIGlmIChpbnRlcmZhY2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gREVBRF9PQkpFQ1Q7CisgICAgfQorICAgIGF1dG8gY2FzdFJlc3VsdCA9IGRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZTo6Y2FzdEZyb20oaW50ZXJmYWNlKTsKKyAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2U+IGludGVyZmFjZV8zXzUgPSBjYXN0UmVzdWx0OworICAgIGlmIChpbnRlcmZhY2VfM181ID09IG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgIH0KKworICAgIHN0YXR1c190IHJlczsKKyAgICBTdGF0dXMgY2FsbFN0YXR1czsKKyAgICBhdXRvIHJldCA9ICBpbnRlcmZhY2VfM181LT5pc1N0cmVhbUNvbWJpbmF0aW9uU3VwcG9ydGVkKGNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICBbJmNhbGxTdGF0dXMsICZzdGF0dXNdIChTdGF0dXMgcywgYm9vbCBjb21iU3RhdHVzKSB7CisgICAgICAgICAgICAgICAgY2FsbFN0YXR1cyA9IHM7CisgICAgICAgICAgICAgICAgKnN0YXR1cyA9IGNvbWJTdGF0dXM7CisgICAgICAgICAgICB9KTsKKyAgICBpZiAocmV0LmlzT2soKSkgeworICAgICAgICBzd2l0Y2ggKGNhbGxTdGF0dXMpIHsKKyAgICAgICAgICAgIGNhc2UgU3RhdHVzOjpPSzoKKyAgICAgICAgICAgICAgICAvLyBFeHBlY3RlZCBjYXNlLCBkbyBub3RoaW5nLgorICAgICAgICAgICAgICAgIHJlcyA9IE9LOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBTdGF0dXM6Ok1FVEhPRF9OT1RfU1VQUE9SVEVEOgorICAgICAgICAgICAgICAgIHJlcyA9IElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFNlc3Npb24gY29uZmlndXJhdGlvbiBxdWVyeSBmYWlsZWQ6ICVkIiwgX19GVU5DVElPTl9fLCBjYWxsU3RhdHVzKTsKKyAgICAgICAgICAgICAgICByZXMgPSBVTktOT1dOX0VSUk9SOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGJpbmRlciBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICByZXMgPSBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKIHN0YXR1c190IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpwYXJzZVByb3ZpZGVyTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgc3RkOjpzdHJpbmcgKnR5cGUsIHVpbnQzMl90ICppZCkgewogICAgIC8vIEZvcm1hdCBtdXN0IGJlICI8dHlwZT4vPGlkPiIKQEAgLTEzNjksNyArMjQzNSw3IEBACiAKIAogc3RhdHVzX3QgSGlkbFZlbmRvclRhZ0Rlc2NyaXB0b3I6OmNyZWF0ZURlc2NyaXB0b3JGcm9tSGlkbCgKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6VmVuZG9yVGFnU2VjdGlvbj4mIHZ0cywKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGNvbW1vbjo6VjFfMDo6VmVuZG9yVGFnU2VjdGlvbj4mIHZ0cywKICAgICAgICAgLypvdXQqLwogICAgICAgICBzcDxWZW5kb3JUYWdEZXNjcmlwdG9yPiYgZGVzY3JpcHRvcikgewogCkBAIC0xMzk3LDcgKzI0NjMsNyBAQAogCiAgICAgaW50IGlkeCA9IDA7CiAgICAgZm9yIChzaXplX3QgcyA9IDA7IHMgPCB2dHMuc2l6ZSgpOyBzKyspIHsKLSAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpWZW5kb3JUYWdTZWN0aW9uJiBzZWN0aW9uID0gdnRzW3NdOworICAgICAgICBjb25zdCBjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24mIHNlY3Rpb24gPSB2dHNbc107CiAgICAgICAgIGNvbnN0IGNoYXIgKnNlY3Rpb25OYW1lID0gc2VjdGlvbi5zZWN0aW9uTmFtZS5jX3N0cigpOwogICAgICAgICBpZiAoc2VjdGlvbk5hbWUgPT0gTlVMTCkgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBubyBzZWN0aW9uIG5hbWUgZGVmaW5lZCBmb3IgdmVuZG9yIHRhZyBzZWN0aW9uICV6dS4iLCBfX0ZVTkNUSU9OX18sIHMpOwpAQCAtMTQ1OCw0OSArMjUyNCw2OSBAQAogCiBzdGF0dXNfdCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljc0xvY2tlZChjb25zdCBzdGQ6OnN0cmluZyAmaWQsCiAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IHsKLSAgICBhdXRvIGRldmljZUluZm8gPSBmaW5kRGV2aWNlSW5mb0xvY2tlZChpZCwgLyptaW5WZXJzaW9uKi8gezMsMH0sIC8qbWF4VmVyc2lvbiovIHs0LDB9KTsKLSAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7CisgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoaWQsIC8qbWluVmVyc2lvbiovIHszLDB9LCAvKm1heFZlcnNpb24qLyB7NSwwfSk7CisgICAgaWYgKGRldmljZUluZm8gIT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZGV2aWNlSW5mby0+Z2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNoYXJhY3RlcmlzdGljcyk7CisgICAgfQogCi0gICAgcmV0dXJuIGRldmljZUluZm8tPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjaGFyYWN0ZXJpc3RpY3MpOworICAgIC8vIEZpbmQgaGlkZGVuIHBoeXNpY2FsIGNhbWVyYSBjaGFyYWN0ZXJpc3RpY3MKKyAgICBmb3IgKGF1dG8mIHByb3ZpZGVyIDogbVByb3ZpZGVycykgeworICAgICAgICBmb3IgKGF1dG8mIGRldmljZUluZm8gOiBwcm92aWRlci0+bURldmljZXMpIHsKKyAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IGRldmljZUluZm8tPmdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGlkLCBjaGFyYWN0ZXJpc3RpY3MpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBOQU1FX05PVF9GT1VORCkgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOQU1FX05PVF9GT1VORDsKIH0KIAogdm9pZCBDYW1lcmFQcm92aWRlck1hbmFnZXI6OmZpbHRlckxvZ2ljYWxDYW1lcmFJZHNMb2NrZWQoCiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZGV2aWNlSWRzKSBjb25zdAogewotICAgIHN0ZDo6dW5vcmRlcmVkX3NldDxzdGQ6OnN0cmluZz4gcmVtb3ZlZElkczsKKyAgICAvLyBNYXAgYmV0d2VlbiBjYW1lcmEgZmFjaW5nIGFuZCBjYW1lcmEgSURzIHJlbGF0ZWQgdG8gbG9naWNhbCBjYW1lcmEuCisgICAgc3RkOjptYXA8aW50LCBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+PiBpZENvbWJvczsKIAorICAgIC8vIENvbGxlY3QgYWxsIGxvZ2ljYWwgYW5kIGl0cyB1bmRlcmx5aW5nIHBoeXNpY2FsIGNhbWVyYSBJRHMgZm9yIGVhY2gKKyAgICAvLyBmYWNpbmcuCiAgICAgZm9yIChhdXRvJiBkZXZpY2VJZCA6IGRldmljZUlkcykgewotICAgICAgICBDYW1lcmFNZXRhZGF0YSBpbmZvOwotICAgICAgICBzdGF0dXNfdCByZXMgPSBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3NMb2NrZWQoZGV2aWNlSWQsICZpbmZvKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzIGZvciBpZCAlcyIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgZGV2aWNlSWQuY19zdHIoKSk7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KKyAgICAgICAgYXV0byBkZXZpY2VJbmZvID0gZmluZERldmljZUluZm9Mb2NrZWQoZGV2aWNlSWQpOworICAgICAgICBpZiAoZGV2aWNlSW5mbyA9PSBudWxscHRyKSBjb250aW51ZTsKIAotICAgICAgICAvLyBpZENvbWJvIGNvbnRhaW5zIHRoZSBpZHMgb2YgYSBsb2dpY2FsIGNhbWVyYSBhbmQgaXRzIHBoeXNpY2FsIGNhbWVyYXMKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGlkQ29tYm87Ci0gICAgICAgIGJvb2wgbG9naWNhbENhbWVyYSA9IENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6aXNMb2dpY2FsQ2FtZXJhKGluZm8sICZpZENvbWJvKTsKLSAgICAgICAgaWYgKCFsb2dpY2FsQ2FtZXJhKSB7CisgICAgICAgIGlmICghZGV2aWNlSW5mby0+bUlzTG9naWNhbENhbWVyYSkgewogICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgaWRDb21iby5wdXNoX2JhY2soZGV2aWNlSWQpOwogCisgICAgICAgIC8vIGNvbWJvIGNvbnRhaW5zIHRoZSBpZHMgb2YgYSBsb2dpY2FsIGNhbWVyYSBhbmQgaXRzIHBoeXNpY2FsIGNhbWVyYXMKKyAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGNvbWJvID0gZGV2aWNlSW5mby0+bVBoeXNpY2FsSWRzOworICAgICAgICBjb21iby5wdXNoX2JhY2soZGV2aWNlSWQpOworCisgICAgICAgIGhhcmR3YXJlOjpDYW1lcmFJbmZvIGluZm87CisgICAgICAgIHN0YXR1c190IHJlcyA9IGRldmljZUluZm8tPmdldENhbWVyYUluZm8oJmluZm8pOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEVycm9yIHJlYWRpbmcgY2FtZXJhIGluZm86ICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWRDb21ib3NbaW5mby5mYWNpbmddLmluc2VydChjb21iby5iZWdpbigpLCBjb21iby5lbmQoKSk7CisgICAgfQorCisgICAgLy8gT25seSBleHBvc2Ugb25lIGNhbWVyYSBJRCBwZXIgZmFjaW5nIGZvciBhbGwgbG9naWNhbCBhbmQgdW5kZXJseWluZworICAgIC8vIHBoeXNpY2FsIGNhbWVyYSBJRHMuCisgICAgZm9yIChhdXRvJiByIDogaWRDb21ib3MpIHsKKyAgICAgICAgYXV0byYgcmVtb3ZlZElkcyA9IHIuc2Vjb25kOwogICAgICAgICBmb3IgKGF1dG8mIGlkIDogZGV2aWNlSWRzKSB7Ci0gICAgICAgICAgICBhdXRvIGZvdW5kSWQgPSBzdGQ6OmZpbmQoaWRDb21iby5iZWdpbigpLCBpZENvbWJvLmVuZCgpLCBpZCk7Ci0gICAgICAgICAgICBpZiAoZm91bmRJZCA9PSBpZENvbWJvLmVuZCgpKSB7CisgICAgICAgICAgICBhdXRvIGZvdW5kSWQgPSBzdGQ6OmZpbmQocmVtb3ZlZElkcy5iZWdpbigpLCByZW1vdmVkSWRzLmVuZCgpLCBpZCk7CisgICAgICAgICAgICBpZiAoZm91bmRJZCA9PSByZW1vdmVkSWRzLmVuZCgpKSB7CiAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICB9CiAKLSAgICAgICAgICAgIGlkQ29tYm8uZXJhc2UoZm91bmRJZCk7Ci0gICAgICAgICAgICByZW1vdmVkSWRzLmluc2VydChpZENvbWJvLmJlZ2luKCksIGlkQ29tYm8uZW5kKCkpOworICAgICAgICAgICAgcmVtb3ZlZElkcy5lcmFzZShmb3VuZElkKTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIGRldmljZUlkcy5lcmFzZShzdGQ6OnJlbW92ZV9pZihkZXZpY2VJZHMuYmVnaW4oKSwgZGV2aWNlSWRzLmVuZCgpLAorICAgICAgICAgICAgICAgIFsmcmVtb3ZlZElkc10oY29uc3Qgc3RkOjpzdHJpbmcmIHMpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gcmVtb3ZlZElkcy5maW5kKHMpICE9IHJlbW92ZWRJZHMuZW5kKCk7fSksCisgICAgICAgICAgICAgICAgZGV2aWNlSWRzLmVuZCgpKTsKICAgICB9Ci0KLSAgICBkZXZpY2VJZHMuZXJhc2Uoc3RkOjpyZW1vdmVfaWYoZGV2aWNlSWRzLmJlZ2luKCksIGRldmljZUlkcy5lbmQoKSwKLSAgICAgICAgICAgIFsmcmVtb3ZlZElkc10oY29uc3Qgc3RkOjpzdHJpbmcmIHMpIHtyZXR1cm4gcmVtb3ZlZElkcy5maW5kKHMpICE9IHJlbW92ZWRJZHMuZW5kKCk7fSksCi0gICAgICAgICAgICBkZXZpY2VJZHMuZW5kKCkpOwogfQogCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyLmgKaW5kZXggYjhiOGI4Yy4uOTU0YzBkOSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0NhbWVyYVByb3ZpZGVyTWFuYWdlci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9DYW1lcmFQcm92aWRlck1hbmFnZXIuaApAQCAtMTgsNiArMTgsNyBAQAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBX0NBTUVSQVBST1ZJREVSX0gKIAogI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgogI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPG11dGV4PgpAQCAtMjcsOCArMjgsOCBAQAogI2luY2x1ZGUgPGNhbWVyYS9DYW1lcmFCYXNlLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvY29tbW9uLzEuMC90eXBlcy5oPgotI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL3Byb3ZpZGVyLzIuNC9JQ2FtZXJhUHJvdmlkZXIuaD4KLS8vI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL3Byb3ZpZGVyLzIuNC9JQ2FtZXJhUHJvdmlkZXJDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9wcm92aWRlci8yLjUvSUNhbWVyYVByb3ZpZGVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNC9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGlkbC9tYW5hZ2VyLzEuMC9JU2VydmljZU5vdGlmaWNhdGlvbi5oPgogI2luY2x1ZGUgPGNhbWVyYS9WZW5kb3JUYWdEZXNjcmlwdG9yLmg+CiAKQEAgLTc3LDYgKzc4LDcgQEAKICAgICAgICAgICAgICAgICAmbm90aWZpY2F0aW9uKSA9IDA7CiAgICAgICAgIHZpcnR1YWwgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gZ2V0U2VydmljZSgKICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmc2VydmljZU5hbWUpID0gMDsKKyAgICAgICAgdmlydHVhbCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmhpZGxfc3RyaW5nPiBsaXN0U2VydmljZXMoKSA9IDA7CiAgICAgICAgIHZpcnR1YWwgflNlcnZpY2VJbnRlcmFjdGlvblByb3h5KCkge30KICAgICB9OwogCkBAIC05NCw2ICs5Niw4IEBACiAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNlcnZpY2VOYW1lKSBvdmVycmlkZSB7CiAgICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcjo6Z2V0U2VydmljZShzZXJ2aWNlTmFtZSk7CiAgICAgICAgIH0KKworICAgICAgICB2aXJ0dWFsIGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6aGlkbF9zdHJpbmc+IGxpc3RTZXJ2aWNlcygpIG92ZXJyaWRlOwogICAgIH07CiAKICAgICAvKioKQEAgLTExMCw2ICsxMTQsMTQgQEAKICAgICB9OwogCiAgICAgLyoqCisgICAgICogUmVwcmVzZW50cyB0aGUgbW9kZSBhIGNhbWVyYSBkZXZpY2UgaXMgY3VycmVudGx5IGluCisgICAgICovCisgICAgZW51bSBjbGFzcyBEZXZpY2VNb2RlIHsKKyAgICAgICAgVE9SQ0gsCisgICAgICAgIENBTUVSQQorICAgIH07CisKKyAgICAvKioKICAgICAgKiBJbml0aWFsaXplIHRoZSBtYW5hZ2VyIGFuZCBnaXZlIGl0IGEgc3RhdHVzIGxpc3RlbmVyOyBvcHRpb25hbGx5IGFjY2VwdHMgYSBzZXJ2aWNlCiAgICAgICogaW50ZXJhY3Rpb24gcHJveHkuCiAgICAgICoKQEAgLTE2Niw2ICsxNzgsMTMgQEAKICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0OwogCiAgICAgLyoqCisgICAgICogQ2hlY2sgZm9yIGRldmljZSBzdXBwb3J0IG9mIHNwZWNpZmljIHN0cmVhbSBjb21iaW5hdGlvbi4KKyAgICAgKi8KKyAgICBzdGF0dXNfdCBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKKyAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6U3RyZWFtQ29uZmlndXJhdGlvbiAmY29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgIGJvb2wgKnN0YXR1cyAvKm91dCovKSBjb25zdDsKKworICAgIC8qKgogICAgICAqIFJldHVybiB0aGUgaGlnaGVzdCBzdXBwb3J0ZWQgZGV2aWNlIGludGVyZmFjZSB2ZXJzaW9uIGZvciB0aGlzIElECiAgICAgICovCiAgICAgc3RhdHVzX3QgZ2V0SGlnaGVzdFN1cHBvcnRlZFZlcnNpb24oY29uc3Qgc3RkOjpzdHJpbmcgJmlkLApAQCAtMTc0LDcgKzE5Myw3IEBACiAgICAgLyoqCiAgICAgICogQ2hlY2sgaWYgYSBnaXZlbiBjYW1lcmEgZGV2aWNlIHN1cHBvcnQgc2V0VG9yY2hNb2RlIEFQSS4KICAgICAgKi8KLSAgICBib29sIHN1cHBvcnRTZXRUb3JjaE1vZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmlkKTsKKyAgICBib29sIHN1cHBvcnRTZXRUb3JjaE1vZGUoY29uc3Qgc3RkOjpzdHJpbmcgJmlkKSBjb25zdDsKIAogICAgIC8qKgogICAgICAqIFR1cm4gb24gb3Igb2ZmIHRoZSBmbGFzaGxpZ2h0IG9uIGEgZ2l2ZW4gY2FtZXJhIGRldmljZS4KQEAgLTE4OSw2ICsyMDgsMTIgQEAKICAgICBzdGF0dXNfdCBzZXRVcFZlbmRvclRhZ3MoKTsKIAogICAgIC8qKgorICAgICAqIEluZm9ybSByZWdpc3RlcmVkIHByb3ZpZGVycyBhYm91dCBhIGRldmljZSBzdGF0ZSBjaGFuZ2UsIHN1Y2ggYXMgZm9sZGluZyBvciB1bmZvbGRpbmcKKyAgICAgKi8KKyAgICBzdGF0dXNfdCBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSgKKyAgICAgICAgYW5kcm9pZDo6aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPiBuZXdTdGF0ZSk7CisKKyAgICAvKioKICAgICAgKiBPcGVuIGFuIGFjdGl2ZSBzZXNzaW9uIHRvIGEgY2FtZXJhIGRldmljZS4KICAgICAgKgogICAgICAqIFRoaXMgZnVsbHkgcG93ZXJzIG9uIHRoZSBjYW1lcmEgZGV2aWNlIGhhcmR3YXJlLCBhbmQgcmV0dXJucyBhIGhhbmRsZSB0byBhCkBAIC0yMDUsNiArMjMwLDE3IEBACiAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYxXzA6OklDYW1lcmFEZXZpY2U+ICpzZXNzaW9uKTsKIAogICAgIC8qKgorICAgICAqIFNhdmUgdGhlIElDYW1lcmFQcm92aWRlciB3aGlsZSBpdCBpcyBiZWluZyB1c2VkIGJ5IGEgY2FtZXJhIG9yIHRvcmNoIGNsaWVudAorICAgICAqLworICAgIHZvaWQgc2F2ZVJlZihEZXZpY2VNb2RlIHVzYWdlVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmNhbWVyYUlkLAorICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIpOworCisgICAgLyoqCisgICAgICogTm90aWZ5IHRoYXQgdGhlIGNhbWVyYSBvciB0b3JjaCBpcyBubyBsb25nZXIgYmVpbmcgdXNlZCBieSBhIGNhbWVyYSBjbGllbnQKKyAgICAgKi8KKyAgICB2b2lkIHJlbW92ZVJlZihEZXZpY2VNb2RlIHVzYWdlVHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcgJmNhbWVyYUlkKTsKKworICAgIC8qKgogICAgICAqIElTZXJ2aWNlTm90aWZpY2F0aW9uOjpvblJlZ2lzdHJhdGlvbgogICAgICAqIEludm9rZWQgYnkgdGhlIGhhcmR3YXJlIHNlcnZpY2UgbWFuYWdlciB3aGVuIGEgbmV3IGNhbWVyYSBwcm92aWRlciBpcyByZWdpc3RlcmVkCiAgICAgICovCkBAIC0yMzEsMTIgKzI2NywxNiBAQAogICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtYXhWZXJzaW9uID0gaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnsxMDAwLDB9KSBjb25zdDsKIAogICAgIC8qCi0gICAgICogQ2hlY2sgaWYgYSBjYW1lcmEgd2l0aCBzdGF0aWNJbmZvIGlzIGEgbG9naWNhbCBjYW1lcmEuIEFuZCBpZiB5ZXMsIHJldHVybgorICAgICAqIENoZWNrIGlmIGEgY2FtZXJhIGlzIGEgbG9naWNhbCBjYW1lcmEuIEFuZCBpZiB5ZXMsIHJldHVybgogICAgICAqIHRoZSBwaHlzaWNhbCBjYW1lcmEgaWRzLgogICAgICAqLwotICAgIHN0YXRpYyBib29sIGlzTG9naWNhbENhbWVyYShjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbywKLSAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogcGh5c2ljYWxDYW1lcmFJZHMpOworICAgIGJvb2wgaXNMb2dpY2FsQ2FtZXJhKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBwaHlzaWNhbENhbWVyYUlkcyk7CiAKKyAgICBib29sIGlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYShjb25zdCBzdGQ6OnN0cmluZyYgaWQpIGNvbnN0OworCisgICAgYm9vbCBpc0hpZGRlblBoeXNpY2FsQ2FtZXJhKGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCkgY29uc3Q7CisKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQga0RlcHRoQVJUb2xlcmFuY2U7CiBwcml2YXRlOgogICAgIC8vIEFsbCBwcml2YXRlIG1lbWJlcnMsIHVubGVzcyBvdGhlcndpc2Ugbm90ZWQsIGV4cGVjdCBtSW50ZXJmYWNlTXV0ZXggdG8gYmUgbG9ja2VkIGJlZm9yZSB1c2UKICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggbUludGVyZmFjZU11dGV4OwpAQCAtMjQ2LDIyICsyODYsNTcgQEAKICAgICB3cDxTdGF0dXNMaXN0ZW5lcj4gbUxpc3RlbmVyOwogICAgIFNlcnZpY2VJbnRlcmFjdGlvblByb3h5KiBtU2VydmljZVByb3h5OwogCisgICAgLy8gQ3VycmVudCBvdmVyYWxsIEFuZHJvaWQgZGV2aWNlIHBoeXNpY2FsIHN0YXR1cworICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl81OjpEZXZpY2VTdGF0ZT4gbURldmljZVN0YXRlOworCisgICAgLy8gbVByb3ZpZGVyTGlmZWN5Y2xlTG9jayBpcyBsb2NrZWQgZHVyaW5nIG9uUmVnaXN0cmF0aW9uIGFuZCByZW1vdmVQcm92aWRlcgorICAgIG11dGFibGUgc3RkOjptdXRleCBtUHJvdmlkZXJMaWZlY3ljbGVMb2NrOworCiAgICAgc3RhdGljIEhhcmR3YXJlU2VydmljZUludGVyYWN0aW9uUHJveHkgc0hhcmR3YXJlU2VydmljZUludGVyYWN0aW9uUHJveHk7CiAKKyAgICAvLyBNYXBwaW5nIGZyb20gQ2FtZXJhRGV2aWNlIElEcyB0byBDYW1lcmFQcm92aWRlcnMuIFRoaXMgbWFwIGlzIHVzZWQgdG8ga2VlcCB0aGUKKyAgICAvLyBJQ2FtZXJhUHJvdmlkZXIgYWxpdmUgd2hpbGUgaXQgaXMgaW4gdXNlIGJ5IHRoZSBjYW1lcmEgd2l0aCB0aGUgZ2l2ZW4gSUQgZm9yIGNhbWVyYQorICAgIC8vIGNhcGFiaWxpdGllcworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4+CisgICAgICAgICAgICBtQ2FtZXJhUHJvdmlkZXJCeUNhbWVyYUlkOworCisgICAgLy8gTWFwcGluZyBmcm9tIENhbWVyYURldmljZSBJRHMgdG8gQ2FtZXJhUHJvdmlkZXJzLiBUaGlzIG1hcCBpcyB1c2VkIHRvIGtlZXAgdGhlCisgICAgLy8gSUNhbWVyYVByb3ZpZGVyIGFsaXZlIHdoaWxlIGl0IGlzIGluIHVzZSBieSB0aGUgY2FtZXJhIHdpdGggdGhlIGdpdmVuIElEIGZvciB0b3JjaAorICAgIC8vIGNhcGFiaWxpdGllcworICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4+CisgICAgICAgICAgICBtVG9yY2hQcm92aWRlckJ5Q2FtZXJhSWQ7CisKKyAgICAvLyBMb2NrIGZvciBhY2Nlc3NpbmcgbUNhbWVyYVByb3ZpZGVyQnlDYW1lcmFJZCBhbmQgbVRvcmNoUHJvdmlkZXJCeUNhbWVyYUlkCisgICAgc3RkOjptdXRleCBtUHJvdmlkZXJJbnRlcmZhY2VNYXBMb2NrOworCiAgICAgc3RydWN0IFByb3ZpZGVySW5mbyA6CiAgICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyQ2FsbGJhY2ssCiAgICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6aGlkbF9kZWF0aF9yZWNpcGllbnQKICAgICB7CiAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1Qcm92aWRlck5hbWU7Ci0gICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IG1JbnRlcmZhY2U7CiAgICAgICAgIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IG1Qcm92aWRlclRhZ2lkOworICAgICAgICBpbnQgbU1pbm9yVmVyc2lvbjsKKyAgICAgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvcj4gbVZlbmRvclRhZ0Rlc2NyaXB0b3I7CisgICAgICAgIGJvb2wgbVNldFRvcmNoTW9kZVN1cHBvcnRlZDsKKyAgICAgICAgYm9vbCBtSXNSZW1vdGU7CisKKyAgICAgICAgLy8gQ3VycmVudCBvdmVyYWxsIEFuZHJvaWQgZGV2aWNlIHBoeXNpY2FsIHN0YXR1cworICAgICAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU+IG1EZXZpY2VTdGF0ZTsKKworICAgICAgICAvLyBUaGlzIHBvaW50ZXIgaXMgdXNlZCB0byBrZWVwIGEgcmVmZXJlbmNlIHRvIHRoZSBJQ2FtZXJhUHJvdmlkZXIgdGhhdCB3YXMgbGFzdCBhY2Nlc3NlZC4KKyAgICAgICAgd3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4gbUFjdGl2ZUludGVyZmFjZTsKKworICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBtU2F2ZWRJbnRlcmZhY2U7CiAKICAgICAgICAgUHJvdmlkZXJJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nICZwcm92aWRlck5hbWUsCi0gICAgICAgICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlcj4mIGludGVyZmFjZSwKICAgICAgICAgICAgICAgICBDYW1lcmFQcm92aWRlck1hbmFnZXIgKm1hbmFnZXIpOwogICAgICAgICB+UHJvdmlkZXJJbmZvKCk7CiAKLSAgICAgICAgc3RhdHVzX3QgaW5pdGlhbGl6ZSgpOworICAgICAgICBzdGF0dXNfdCBpbml0aWFsaXplKHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+JiBpbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPgorICAgICAgICAgICAgICAgICAgICBjdXJyZW50RGV2aWNlU3RhdGUpOworCisgICAgICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHN0YXJ0UHJvdmlkZXJJbnRlcmZhY2UoKTsKIAogICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZ2V0VHlwZSgpIGNvbnN0OwogCkBAIC0yODMsODQgKzM1OCwxNzMgQEAKICAgICAgICAgLy8gaGlkbF9kZWF0aF9yZWNpcGllbnQgaW50ZXJmYWNlIC0gdGhpcyBsb2NrcyB0aGUgcGFyZW50IG1JbnRlcmZhY2VNdXRleAogICAgICAgICB2aXJ0dWFsIHZvaWQgc2VydmljZURpZWQodWludDY0X3QgY29va2llLCBjb25zdCB3cDxoaWRsOjpiYXNlOjpWMV8wOjpJQmFzZT4mIHdobykgb3ZlcnJpZGU7CiAKKyAgICAgICAgLyoqCisgICAgICAgICAqIFNldHVwIHZlbmRvciB0YWdzIGZvciB0aGlzIHByb3ZpZGVyCisgICAgICAgICAqLworICAgICAgICBzdGF0dXNfdCBzZXRVcFZlbmRvclRhZ3MoKTsKKworICAgICAgICAvKioKKyAgICAgICAgICogTm90aWZ5IHByb3ZpZGVyIGFib3V0IHRvcC1sZXZlbCBkZXZpY2UgcGh5c2ljYWwgc3RhdGUgY2hhbmdlcworICAgICAgICAgKi8KKyAgICAgICAgc3RhdHVzX3Qgbm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoCisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8aGFyZHdhcmU6OmNhbWVyYTo6cHJvdmlkZXI6OlYyXzU6OkRldmljZVN0YXRlPgorICAgICAgICAgICAgICAgICAgICBuZXdEZXZpY2VTdGF0ZSk7CisKICAgICAgICAgLy8gQmFzaWMgZGV2aWNlIGluZm9ybWF0aW9uLCBjb21tb24gdG8gYWxsIGNhbWVyYSBkZXZpY2VzCiAgICAgICAgIHN0cnVjdCBEZXZpY2VJbmZvIHsKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIG1OYW1lOyAgLy8gRnVsbCBpbnN0YW5jZSBuYW1lCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyBtSWQ7ICAgIC8vIElEIHNlY3Rpb24gb2YgZnVsbCBuYW1lCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1WZXJzaW9uOwogICAgICAgICAgICAgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgbVByb3ZpZGVyVGFnaWQ7CisgICAgICAgICAgICBib29sIG1Jc0xvZ2ljYWxDYW1lcmE7CisgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gbVBoeXNpY2FsSWRzOworICAgICAgICAgICAgaGFyZHdhcmU6OkNhbWVyYUluZm8gbUluZm87CisgICAgICAgICAgICBzcDxJQmFzZT4gbVNhdmVkSW50ZXJmYWNlOworICAgICAgICAgICAgYm9vbCBtSXNQdWJsaWNhbGx5SGlkZGVuU2VjdXJlQ2FtZXJhID0gZmFsc2U7CiAKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhUmVzb3VyY2VDb3N0IG1SZXNvdXJjZUNvc3Q7CiAKICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6Q2FtZXJhRGV2aWNlU3RhdHVzIG1TdGF0dXM7CiAKKyAgICAgICAgICAgIHNwPFByb3ZpZGVySW5mbz4gbVBhcmVudFByb3ZpZGVyOworCiAgICAgICAgICAgICBib29sIGhhc0ZsYXNoVW5pdCgpIGNvbnN0IHsgcmV0dXJuIG1IYXNGbGFzaFVuaXQ7IH0KICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlKGJvb2wgZW5hYmxlZCkgPSAwOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFJbmZvKGhhcmR3YXJlOjpDYW1lcmFJbmZvICppbmZvKSBjb25zdCA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIGJvb2wgaXNBUEkxQ29tcGF0aWJsZSgpIGNvbnN0ID0gMDsKLSAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgY29uc3QgPSAwOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSA9IDA7CiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7CiAgICAgICAgICAgICAgICAgKHZvaWQpIGNoYXJhY3RlcmlzdGljczsKICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgICAgICAgICB9CisgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldFBoeXNpY2FsQ2FtZXJhQ2hhcmFjdGVyaXN0aWNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBwaHlzaWNhbENhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCB7CisgICAgICAgICAgICAgICAgKHZvaWQpIHBoeXNpY2FsQ2FtZXJhSWQ7CisgICAgICAgICAgICAgICAgKHZvaWQpIGNoYXJhY3RlcmlzdGljczsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgaXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpTdHJlYW1Db25maWd1cmF0aW9uICYvKmNvbmZpZ3VyYXRpb24qLywKKyAgICAgICAgICAgICAgICAgICAgYm9vbCAqIC8qc3RhdHVzKi8pIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRlbXBsYXRlPGNsYXNzIEludGVyZmFjZVQ+CisgICAgICAgICAgICBzcDxJbnRlcmZhY2VUPiBzdGFydERldmljZUludGVyZmFjZSgpOwogCiAgICAgICAgICAgICBEZXZpY2VJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLCBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uJiB2ZXJzaW9uLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0KSA6CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgcHVibGljQ2FtZXJhSWRzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAorICAgICAgICAgICAgICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyKSA6CiAgICAgICAgICAgICAgICAgICAgIG1OYW1lKG5hbWUpLCBtSWQoaWQpLCBtVmVyc2lvbih2ZXJzaW9uKSwgbVByb3ZpZGVyVGFnaWQodGFnSWQpLAotICAgICAgICAgICAgICAgICAgICBtUmVzb3VyY2VDb3N0KHJlc291cmNlQ29zdCksCisgICAgICAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWxDYW1lcmEoZmFsc2UpLCBtUmVzb3VyY2VDb3N0KHJlc291cmNlQ29zdCksCiAgICAgICAgICAgICAgICAgICAgIG1TdGF0dXMoaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFEZXZpY2VTdGF0dXM6OlBSRVNFTlQpLAotICAgICAgICAgICAgICAgICAgICBtSGFzRmxhc2hVbml0KGZhbHNlKSB7fQorICAgICAgICAgICAgICAgICAgICBtUGFyZW50UHJvdmlkZXIocGFyZW50UHJvdmlkZXIpLCBtSGFzRmxhc2hVbml0KGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgbVB1YmxpY0NhbWVyYUlkcyhwdWJsaWNDYW1lcmFJZHMpIHt9CiAgICAgICAgICAgICB2aXJ0dWFsIH5EZXZpY2VJbmZvKCk7CiAgICAgICAgIHByb3RlY3RlZDoKICAgICAgICAgICAgIGJvb2wgbUhhc0ZsYXNoVW5pdDsKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgbVB1YmxpY0NhbWVyYUlkczsKIAogICAgICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KICAgICAgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoSW50ZXJmYWNlVCYgaW50ZXJmYWNlLCBib29sIGVuYWJsZWQpOworCisgICAgICAgICAgICB0ZW1wbGF0ZTxjbGFzcyBJbnRlcmZhY2VUPgorICAgICAgICAgICAgc3RhdHVzX3Qgc2V0VG9yY2hNb2RlRm9yRGV2aWNlKGJvb2wgZW5hYmxlZCkgeworICAgICAgICAgICAgICAgIC8vIERvbid0IHNhdmUgdGhlIElDYW1lcmFQcm92aWRlciBpbnRlcmZhY2UgaGVyZSBiZWNhdXNlIHdlIGFzc3VtZSB0aGF0IHRoaXMgd2FzCisgICAgICAgICAgICAgICAgLy8gY2FsbGVkIGZyb20gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjpzZXRUb3JjaE1vZGUoKSwgd2hpY2ggZG9lcyBzYXZlIGl0LgorICAgICAgICAgICAgICAgIGNvbnN0IHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSA9IHN0YXJ0RGV2aWNlSW50ZXJmYWNlPEludGVyZmFjZVQ+KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIERldmljZUluZm86OnNldFRvcmNoTW9kZShpbnRlcmZhY2UsIGVuYWJsZWQpOworICAgICAgICAgICAgfQogICAgICAgICB9OwogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlSW5mbz4+IG1EZXZpY2VzOwogICAgICAgICBzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IG1VbmlxdWVDYW1lcmFJZHM7CiAgICAgICAgIGludCBtVW5pcXVlRGV2aWNlQ291bnQ7CiAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtVW5pcXVlQVBJMUNvbXBhdGlibGVDYW1lcmFJZHM7CisgICAgICAgIC8vIFRoZSBpbml0aWFsIHB1YmxpYyBjYW1lcmEgSURzIHB1Ymxpc2hlZCBieSB0aGUgY2FtZXJhIHByb3ZpZGVyLgorICAgICAgICAvLyBDdXJyZW50bHkgbG9naWNhbCBtdWx0aS1jYW1lcmEgaXMgbm90IHN1cHBvcnRlZCBmb3IgaG90LXBsdWcgY2FtZXJhLgorICAgICAgICAvLyBBbmQgd2UgdXNlIHRoaXMgbGlzdCB0byBrZWVwIHRyYWNrIG9mIGluaXRpYWwgcHVibGljIGNhbWVyYSBJRHMKKyAgICAgICAgLy8gYWR2ZXJ0aXNlZCBieSB0aGUgcHJvdmlkZXIsIGFuZCB0byBkaXN0aW5ndWlzaCBhZ2FpbnN0ICJoaWRkZW4iCisgICAgICAgIC8vIHBoeXNpY2FsIGNhbWVyYSBJRHMuCisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBtUHJvdmlkZXJQdWJsaWNDYW1lcmFJZHM7CiAKICAgICAgICAgLy8gSEFMdjEtc3BlY2lmaWMgY2FtZXJhIGZpZWxkcywgaW5jbHVkaW5nIHRoZSBhY3R1YWwgZGV2aWNlIGludGVyZmFjZQogICAgICAgICBzdHJ1Y3QgRGV2aWNlSW5mbzEgOiBwdWJsaWMgRGV2aWNlSW5mbyB7CiAgICAgICAgICAgICB0eXBlZGVmIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjFfMDo6SUNhbWVyYURldmljZSBJbnRlcmZhY2VUOwotICAgICAgICAgICAgY29uc3Qgc3A8SW50ZXJmYWNlVD4gbUludGVyZmFjZTsKIAogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzZXRUb3JjaE1vZGUoYm9vbCBlbmFibGVkKSBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhSW5mbyhoYXJkd2FyZTo6Q2FtZXJhSW5mbyAqaW5mbykgY29uc3Qgb3ZlcnJpZGU7CiAgICAgICAgICAgICAvL0luIGNhc2Ugb2YgRGV2aWNlMUluZm8gYXNzdW1lIHRoYXQgd2UgYXJlIGFsd2F5cyBBUEkxIGNvbXBhdGlibGUKICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBpc0FQSTFDb21wYXRpYmxlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQotICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcFN0YXRlKGludCBmZCkgb3ZlcnJpZGU7CiAgICAgICAgICAgICBEZXZpY2VJbmZvMShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgY29uc3QgbWV0YWRhdGFfdmVuZG9yX2lkX3QgdGFnSWQsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwgdWludDE2X3QgbWlub3JWZXJzaW9uLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYVJlc291cmNlQ29zdCYgcmVzb3VyY2VDb3N0LAorICAgICAgICAgICAgICAgICAgICBzcDxQcm92aWRlckluZm8+IHBhcmVudFByb3ZpZGVyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHB1YmxpY0NhbWVyYUlkcywKICAgICAgICAgICAgICAgICAgICAgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKTsKICAgICAgICAgICAgIHZpcnR1YWwgfkRldmljZUluZm8xKCk7CiAgICAgICAgIHByaXZhdGU6CiAgICAgICAgICAgICBDYW1lcmFQYXJhbWV0ZXJzMiBtRGVmYXVsdFBhcmFtZXRlcnM7CisgICAgICAgICAgICBzdGF0dXNfdCBjYWNoZUNhbWVyYUluZm8oc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKTsKICAgICAgICAgfTsKIAogICAgICAgICAvLyBIQUx2My1zcGVjaWZpYyBjYW1lcmEgZmllbGRzLCBpbmNsdWRpbmcgdGhlIGFjdHVhbCBkZXZpY2UgaW50ZXJmYWNlCiAgICAgICAgIHN0cnVjdCBEZXZpY2VJbmZvMyA6IHB1YmxpYyBEZXZpY2VJbmZvIHsKICAgICAgICAgICAgIHR5cGVkZWYgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpJQ2FtZXJhRGV2aWNlIEludGVyZmFjZVQ7Ci0gICAgICAgICAgICBjb25zdCBzcDxJbnRlcmZhY2VUPiBtSW50ZXJmYWNlOwogCiAgICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHNldFRvcmNoTW9kZShib29sIGVuYWJsZWQpIG92ZXJyaWRlOwogICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRDYW1lcmFJbmZvKGhhcmR3YXJlOjpDYW1lcmFJbmZvICppbmZvKSBjb25zdCBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBpc0FQSTFDb21wYXRpYmxlKCkgY29uc3Qgb3ZlcnJpZGU7Ci0gICAgICAgICAgICB2aXJ0dWFsIHN0YXR1c190IGR1bXBTdGF0ZShpbnQgZmQpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBkdW1wU3RhdGUoaW50IGZkKSBvdmVycmlkZTsKICAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzKAogICAgICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSAqY2hhcmFjdGVyaXN0aWNzKSBjb25zdCBvdmVycmlkZTsKKyAgICAgICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0UGh5c2ljYWxDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3Qgc3RkOjpzdHJpbmcmIHBoeXNpY2FsQ2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhICpjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0IG92ZXJyaWRlOworICAgICAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkKAorICAgICAgICAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlN0cmVhbUNvbmZpZ3VyYXRpb24gJmNvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgIGJvb2wgKnN0YXR1cyAvKm91dCovKQorICAgICAgICAgICAgICAgICAgICBvdmVycmlkZTsKIAogICAgICAgICAgICAgRGV2aWNlSW5mbzMoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGNvbnN0IG1ldGFkYXRhX3ZlbmRvcl9pZF90IHRhZ0lkLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmaWQsIHVpbnQxNl90IG1pbm9yVmVyc2lvbiwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFSZXNvdXJjZUNvc3QmIHJlc291cmNlQ29zdCwKLSAgICAgICAgICAgICAgICAgICAgc3A8SW50ZXJmYWNlVD4gaW50ZXJmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgc3A8UHJvdmlkZXJJbmZvPiBwYXJlbnRQcm92aWRlciwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBwdWJsaWNDYW1lcmFJZHMsIHNwPEludGVyZmFjZVQ+IGludGVyZmFjZSk7CiAgICAgICAgICAgICB2aXJ0dWFsIH5EZXZpY2VJbmZvMygpOwogICAgICAgICBwcml2YXRlOgogICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbUNhbWVyYUNoYXJhY3RlcmlzdGljczsKKyAgICAgICAgICAgIHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+IG1QaHlzaWNhbENhbWVyYUNoYXJhY3RlcmlzdGljczsKKyAgICAgICAgICAgIHZvaWQgcXVlcnlQaHlzaWNhbENhbWVyYUlkcygpOworICAgICAgICAgICAgYm9vbCBpc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmEoKTsKKyAgICAgICAgICAgIHN0YXR1c190IGZpeHVwTW9ub2Nocm9tZVRhZ3MoKTsKKyAgICAgICAgICAgIHN0YXR1c190IGFkZER5bmFtaWNEZXB0aFRhZ3MoKTsKKyAgICAgICAgICAgIHN0YXRpYyB2b2lkIGdldFN1cHBvcnRlZFNpemVzKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBjaCwgdWludDMyX3QgdGFnLAorICAgICAgICAgICAgICAgICAgICBhbmRyb2lkX3BpeGVsX2Zvcm1hdF90IGZvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+ICpzaXplcyAvKm91dCovKTsKKyAgICAgICAgICAgIHZvaWQgZ2V0U3VwcG9ydGVkRHVyYXRpb25zKCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgY2gsIHVpbnQzMl90IHRhZywKKyAgICAgICAgICAgICAgICAgICAgYW5kcm9pZF9waXhlbF9mb3JtYXRfdCBmb3JtYXQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+ICpkdXJhdGlvbnMvKm91dCovKTsKKyAgICAgICAgICAgIHZvaWQgZ2V0U3VwcG9ydGVkRHluYW1pY0RlcHRoRHVyYXRpb25zKGNvbnN0IHN0ZDo6dmVjdG9yPGludDY0X3Q+JiBkZXB0aER1cmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50NjRfdD4mIGJsb2JEdXJhdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGludDY0X3Q+ICpkeW5hbWljRGVwdGhEdXJhdGlvbnMgLypvdXQqLyk7CisgICAgICAgICAgICBzdGF0aWMgYm9vbCBpc0RlcHRoUGhvdG9MaWJyYXJ5UHJlc2VudCgpOworICAgICAgICAgICAgc3RhdGljIHZvaWQgZ2V0U3VwcG9ydGVkRHluYW1pY0RlcHRoU2l6ZXMoCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiYgYmxvYlNpemVzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPHNpemVfdCwgc2l6ZV90Pj4mIGRlcHRoU2l6ZXMsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dHVwbGU8c2l6ZV90LCBzaXplX3Q+PiAqZHluYW1pY0RlcHRoU2l6ZXMgLypvdXQqLywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp0dXBsZTxzaXplX3QsIHNpemVfdD4+ICppbnRlcm5hbERlcHRoU2l6ZXMgLypvdXQqLyk7CisgICAgICAgICAgICBzdGF0dXNfdCByZW1vdmVBdmFpbGFibGVLZXlzKENhbWVyYU1ldGFkYXRhJiBjLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGtleXMsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGtleVRhZyk7CisgICAgICAgICAgICBzdGF0dXNfdCBmaWxsSGVpY1N0cmVhbUNvbWJpbmF0aW9ucyhzdGQ6OnZlY3RvcjxpbnQzMl90Piogb3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4qIGR1cmF0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8aW50NjRfdD4qIHN0YWxsRHVyYXRpb25zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfZW50cnkmIGhhbFN0cmVhbUNvbmZpZ3MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV9lbnRyeSYgaGFsU3RyZWFtRHVyYXRpb25zKTsKKyAgICAgICAgICAgIHN0YXR1c190IGRlcml2ZUhlaWNUYWdzKCk7CiAgICAgICAgIH07CiAKICAgICBwcml2YXRlOgpAQCAtMzc4LDExICs1NDIsMTEgQEAKICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgRGV2aWNlSW5mb1Q+CiAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxEZXZpY2VJbmZvPiBpbml0aWFsaXplRGV2aWNlSW5mbyhjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwKICAgICAgICAgICAgICAgICBjb25zdCBtZXRhZGF0YV92ZW5kb3JfaWRfdCB0YWdJZCwgY29uc3Qgc3RkOjpzdHJpbmcgJmlkLAotICAgICAgICAgICAgICAgIHVpbnQxNl90IG1pbm9yVmVyc2lvbikgY29uc3Q7CisgICAgICAgICAgICAgICAgdWludDE2X3QgbWlub3JWZXJzaW9uKTsKIAogICAgICAgICAvLyBIZWxwZXIgZm9yIGluaXRpYWxpemVEZXZpY2VJbmZvIHRvIHVzZSB0aGUgcmlnaHQgQ2FtZXJhUHJvdmlkZXIgZ2V0IG1ldGhvZC4KICAgICAgICAgdGVtcGxhdGU8Y2xhc3MgSW50ZXJmYWNlVD4KLSAgICAgICAgc3A8SW50ZXJmYWNlVD4gZ2V0RGV2aWNlSW50ZXJmYWNlKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lKSBjb25zdDsKKyAgICAgICAgc3A8SW50ZXJmYWNlVD4gc3RhcnREZXZpY2VJbnRlcmZhY2UoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUpOwogCiAgICAgICAgIC8vIFBhcnNlIHByb3ZpZGVyIGluc3RhbmNlIG5hbWUgZm9yIHR5cGUgYW5kIGlkCiAgICAgICAgIHN0YXRpYyBzdGF0dXNfdCBwYXJzZVByb3ZpZGVyTmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKQEAgLTQwNyw3ICs1NzEsNyBAQAogICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtaW5WZXJzaW9uID0gaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnswLDB9LAogICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVyc2lvbiBtYXhWZXJzaW9uID0gaGFyZHdhcmU6OmhpZGxfdmVyc2lvbnsxMDAwLDB9KSBjb25zdDsKIAotICAgIHN0YXR1c190IGFkZFByb3ZpZGVyTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdQcm92aWRlciwgYm9vbCBleHBlY3RlZCA9IHRydWUpOworICAgIHN0YXR1c190IGFkZFByb3ZpZGVyTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nJiBuZXdQcm92aWRlcik7CiAKICAgICBzdGF0dXNfdCByZW1vdmVQcm92aWRlcihjb25zdCBzdGQ6OnN0cmluZyYgcHJvdmlkZXIpOwogICAgIHNwPFN0YXR1c0xpc3RlbmVyPiBnZXRTdGF0dXNMaXN0ZW5lcigpIGNvbnN0OwpAQCAtNDE2LDYgKzU4MCwxNCBAQAogCiAgICAgc3RkOjp2ZWN0b3I8c3A8UHJvdmlkZXJJbmZvPj4gbVByb3ZpZGVyczsKIAorICAgIHZvaWQgYWRkUHJvdmlkZXJUb01hcCgKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZjYW1lcmFJZCwKKyAgICAgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+IHByb3ZpZGVyLAorICAgICAgICAgICAgYm9vbCBpc1RvcmNoVXNhZ2UpOworICAgIHZvaWQgcmVtb3ZlQ2FtZXJhSWRGcm9tTWFwKAorICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIHNwPGhhcmR3YXJlOjpjYW1lcmE6OnByb3ZpZGVyOjpWMl80OjpJQ2FtZXJhUHJvdmlkZXI+PiAmbWFwLAorICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmY2FtZXJhSWQpOworCiAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGRldmljZVN0YXR1c1RvU3RyaW5nKAogICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OkNhbWVyYURldmljZVN0YXR1cyYpOwogICAgIHN0YXRpYyBjb25zdCBjaGFyKiB0b3JjaFN0YXR1c1RvU3RyaW5nKApAQCAtNDIzLDcgKzU5NSwxNSBAQAogCiAgICAgc3RhdHVzX3QgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzTG9ja2VkKGNvbnN0IHN0ZDo6c3RyaW5nICZpZCwKICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhKiBjaGFyYWN0ZXJpc3RpY3MpIGNvbnN0OworCisgICAgYm9vbCBpc1B1YmxpY2FsbHlIaWRkZW5TZWN1cmVDYW1lcmFMb2NrZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkKSBjb25zdDsKKwogICAgIHZvaWQgZmlsdGVyTG9naWNhbENhbWVyYUlkc0xvY2tlZChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGRldmljZUlkcykgY29uc3Q7CisKKyAgICBib29sIGlzUHVibGljYWxseUhpZGRlblNlY3VyZUNhbWVyYUxvY2tlZChjb25zdCBzdGQ6OnN0cmluZyYgaWQpOworCisgICAgc3RkOjpwYWlyPGJvb2wsIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6UHJvdmlkZXJJbmZvOjpEZXZpY2VJbmZvICo+CisgICAgICAgICAgICBpc0hpZGRlblBoeXNpY2FsQ2FtZXJhSW50ZXJuYWwoY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKSBjb25zdDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDU0MWQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuY3BwCkBAIC0wLDAgKzEsNTE1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmEzLURlcHRoUGhvdG9Qcm9jZXNzb3IiCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKy8vCisKKyNpbmNsdWRlICJEZXB0aFBob3RvUHJvY2Vzc29yLmgiCisKKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL2NhbWVyYS5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvY2FtZXJhcy5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvY29udGFpbmVyLmg+CisjaW5jbHVkZSA8ZHluYW1pY19kZXB0aC9kZXZpY2UuaD4KKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL2RpbWVuc2lvbi5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvZHluYW1pY19kZXB0aC5oPgorI2luY2x1ZGUgPGR5bmFtaWNfZGVwdGgvcG9pbnQuaD4KKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL3Bvc2UuaD4KKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL3Byb2ZpbGUuaD4KKyNpbmNsdWRlIDxkeW5hbWljX2RlcHRoL3Byb2ZpbGVzLmg+CisjaW5jbHVkZSA8anBlZ2xpYi5oPgorI2luY2x1ZGUgPGxpYmV4aWYvZXhpZi1kYXRhLmg+CisjaW5jbHVkZSA8bGliZXhpZi9leGlmLXN5c3RlbS5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHV0aWxzL0V4aWZVdGlscy5oPgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorI2luY2x1ZGUgPHhtcG1ldGEveG1wX2RhdGEuaD4KKyNpbmNsdWRlIDx4bXBtZXRhL3htcF93cml0ZXIuaD4KKwordXNpbmcgZHluYW1pY19kZXB0aDo6Q2FtZXJhOwordXNpbmcgZHluYW1pY19kZXB0aDo6Q2FtZXJhczsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkNhbWVyYVBhcmFtczsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkNvbnRhaW5lcjsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkRlcHRoRm9ybWF0OwordXNpbmcgZHluYW1pY19kZXB0aDo6RGVwdGhNYXA7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpEZXB0aE1hcFBhcmFtczsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkRlcHRoVW5pdHM7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpEZXZpY2U7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpEZXZpY2VQYXJhbXM7Cit1c2luZyBkeW5hbWljX2RlcHRoOjpEaW1lbnNpb247Cit1c2luZyBkeW5hbWljX2RlcHRoOjpJbWFnZTsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkltYWdpbmdNb2RlbDsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OkltYWdpbmdNb2RlbFBhcmFtczsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6Okl0ZW07Cit1c2luZyBkeW5hbWljX2RlcHRoOjpQb3NlOwordXNpbmcgZHluYW1pY19kZXB0aDo6UHJvZmlsZTsKK3VzaW5nIGR5bmFtaWNfZGVwdGg6OlByb2ZpbGVzOworCit0ZW1wbGF0ZTw+CitzdHJ1Y3Qgc3RkOjpkZWZhdWx0X2RlbGV0ZTxqcGVnX2NvbXByZXNzX3N0cnVjdD4geworICAgIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoanBlZ19jb21wcmVzc19zdHJ1Y3QqIGNpbmZvKSBjb25zdCB7CisgICAgICAgIGpwZWdfZGVzdHJveV9jb21wcmVzcyhjaW5mbyk7CisgICAgfQorfTsKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCisvLyBEZXB0aCBzYW1wbGVzIHdpdGggbG93IGNvbmZpZGVuY2UgY2FuIHNrZXcgdGhlCisvLyBuZWFyL2ZhciB2YWx1ZXMgYW5kIGltcGFjdCB0aGUgcmFuZ2UgaW52ZXJzZSBjb2RpbmcuCitzdGF0aWMgY29uc3QgZmxvYXQgQ09ORklERU5DRV9USFJFU0hPTEQgPSAuMTVmOworCitFeGlmT3JpZW50YXRpb24gZ2V0RXhpZk9yaWVudGF0aW9uKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmpwZWdCdWZmZXIsIHNpemVfdCBqcGVnQnVmZmVyU2l6ZSkgeworICAgIGlmICgoanBlZ0J1ZmZlciA9PSBudWxscHRyKSB8fCAoanBlZ0J1ZmZlclNpemUgPT0gMCkpIHsKKyAgICAgICAgcmV0dXJuIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVEOworICAgIH0KKworICAgIGF1dG8gZXhpZkRhdGEgPSBleGlmX2RhdGFfbmV3KCk7CisgICAgZXhpZl9kYXRhX2xvYWRfZGF0YShleGlmRGF0YSwganBlZ0J1ZmZlciwganBlZ0J1ZmZlclNpemUpOworICAgIEV4aWZFbnRyeSAqb3JpZW50YXRpb24gPSBleGlmX2NvbnRlbnRfZ2V0X2VudHJ5KGV4aWZEYXRhLT5pZmRbRVhJRl9JRkRfMF0sCisgICAgICAgICAgICBFWElGX1RBR19PUklFTlRBVElPTik7CisgICAgaWYgKChvcmllbnRhdGlvbiA9PSBudWxscHRyKSB8fCAob3JpZW50YXRpb24tPnNpemUgIT0gc2l6ZW9mKEV4aWZTaG9ydCkpKSB7CisgICAgICAgIEFMT0dWKCIlczogT3JpZW50YXRpb24gRVhJRiBlbnRyeSBpbnZhbGlkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGV4aWZfZGF0YV91bnJlZihleGlmRGF0YSk7CisgICAgICAgIHJldHVybiBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUzsKKyAgICB9CisKKyAgICBhdXRvIG9yaWVudGF0aW9uVmFsdWUgPSBleGlmX2dldF9zaG9ydChvcmllbnRhdGlvbi0+ZGF0YSwgZXhpZl9kYXRhX2dldF9ieXRlX29yZGVyKGV4aWZEYXRhKSk7CisgICAgRXhpZk9yaWVudGF0aW9uIHJldDsKKyAgICBzd2l0Y2ggKG9yaWVudGF0aW9uVmFsdWUpIHsKKyAgICAgICAgY2FzZSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUzoKKyAgICAgICAgY2FzZSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzkwX0RFR1JFRVM6CisgICAgICAgIGNhc2UgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8xODBfREVHUkVFUzoKKyAgICAgICAgY2FzZSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzI3MF9ERUdSRUVTOgorICAgICAgICAgICAgcmV0ID0gc3RhdGljX2Nhc3Q8RXhpZk9yaWVudGF0aW9uPiAob3JpZW50YXRpb25WYWx1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBFWElGIG9yaWVudGF0aW9uIHZhbHVlOiAlZCwgZGVmYXVsdGluZyB0byAwIGRlZ3JlZXMiLAorICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG9yaWVudGF0aW9uVmFsdWUpOworICAgICAgICAgICAgcmV0ID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVM7CisgICAgfQorCisgICAgZXhpZl9kYXRhX3VucmVmKGV4aWZEYXRhKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXR1c190IGVuY29kZUdyYXlzY2FsZUpwZWcoc2l6ZV90IHdpZHRoLCBzaXplX3QgaGVpZ2h0LCB1aW50OF90ICppbiwgdm9pZCAqb3V0LAorICAgICAgICBjb25zdCBzaXplX3QgbWF4T3V0U2l6ZSwgdWludDhfdCBqcGVnUXVhbGl0eSwgRXhpZk9yaWVudGF0aW9uIGV4aWZPcmllbnRhdGlvbiwKKyAgICAgICAgc2l6ZV90ICZhY3R1YWxTaXplKSB7CisgICAgc3RhdHVzX3QgcmV0OworICAgIC8vIGxpYmpwZWcgaXMgYSBDIGxpYnJhcnkgc28gd2UgdXNlIEMtc3R5bGUgImluaGVyaXRhbmNlIiBieQorICAgIC8vIHB1dHRpbmcgbGlianBlZydzIGpwZWdfZGVzdGluYXRpb25fbWdyIGZpcnN0IGluIG91ciBjdXN0b20KKyAgICAvLyBzdHJ1Y3QuIFRoaXMgYWxsb3dzIHVzIHRvIGNhc3QganBlZ19kZXN0aW5hdGlvbl9tZ3IqIHRvCisgICAgLy8gQ3VzdG9tSnBlZ0Rlc3RNZ3IqIHdoZW4gd2UgZ2V0IGl0IHBhc3NlZCB0byB1cyBpbiBhIGNhbGxiYWNrLgorICAgIHN0cnVjdCBDdXN0b21KcGVnRGVzdE1nciA6IHB1YmxpYyBqcGVnX2Rlc3RpbmF0aW9uX21nciB7CisgICAgICAgIEpPQ1RFVCAqbUJ1ZmZlcjsKKyAgICAgICAgc2l6ZV90IG1CdWZmZXJTaXplOworICAgICAgICBzaXplX3QgbUVuY29kZWRTaXplOworICAgICAgICBib29sIG1TdWNjZXNzOworICAgIH0gZG1ncjsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxqcGVnX2NvbXByZXNzX3N0cnVjdD4gY2luZm8gPSBzdGQ6Om1ha2VfdW5pcXVlPGpwZWdfY29tcHJlc3Nfc3RydWN0PigpOworICAgIGpwZWdfZXJyb3JfbWdyIGplcnI7CisKKyAgICAvLyBJbml0aWFsaXplIGVycm9yIGhhbmRsaW5nIHdpdGggc3RhbmRhcmQgY2FsbGJhY2tzLCBidXQKKyAgICAvLyB0aGVuIG92ZXJyaWRlIG91dHB1dF9tZXNzYWdlICh0byBwcmludCB0byBBTE9HKSBhbmQKKyAgICAvLyBlcnJvcl9leGl0IHRvIHNldCBhIGZsYWcgYW5kIHByaW50IGEgbWVzc2FnZSBpbnN0ZWFkCisgICAgLy8gb2Yga2lsbGluZyB0aGUgd2hvbGUgcHJvY2Vzcy4KKyAgICBjaW5mby0+ZXJyID0ganBlZ19zdGRfZXJyb3IoJmplcnIpOworCisgICAgY2luZm8tPmVyci0+b3V0cHV0X21lc3NhZ2UgPSBbXShqX2NvbW1vbl9wdHIgY2luZm8pIHsKKyAgICAgICAgY2hhciBidWZmZXJbSk1TR19MRU5HVEhfTUFYXTsKKworICAgICAgICAvKiBDcmVhdGUgdGhlIG1lc3NhZ2UgKi8KKyAgICAgICAgKCpjaW5mby0+ZXJyLT5mb3JtYXRfbWVzc2FnZSkoY2luZm8sIGJ1ZmZlcik7CisgICAgICAgIEFMT0dFKCJsaWJqcGVnIGVycm9yOiAlcyIsIGJ1ZmZlcik7CisgICAgfTsKKworICAgIGNpbmZvLT5lcnItPmVycm9yX2V4aXQgPSBbXShqX2NvbW1vbl9wdHIgY2luZm8pIHsKKyAgICAgICAgKCpjaW5mby0+ZXJyLT5vdXRwdXRfbWVzc2FnZSkoY2luZm8pOworICAgICAgICBpZihjaW5mby0+Y2xpZW50X2RhdGEpIHsKKyAgICAgICAgICAgIGF1dG8gJiBkbWdyID0gKnN0YXRpY19jYXN0PEN1c3RvbUpwZWdEZXN0TWdyKj4oY2luZm8tPmNsaWVudF9kYXRhKTsKKyAgICAgICAgICAgIGRtZ3IubVN1Y2Nlc3MgPSBmYWxzZTsKKyAgICAgICAgfQorICAgIH07CisKKyAgICAvLyBOb3cgdGhhdCB3ZSBpbml0aWFsaXplZCBzb21lIGNhbGxiYWNrcywgbGV0J3MgY3JlYXRlIG91ciBjb21wcmVzc29yCisgICAganBlZ19jcmVhdGVfY29tcHJlc3MoY2luZm8uZ2V0KCkpOworICAgIGRtZ3IubUJ1ZmZlciA9IHN0YXRpY19jYXN0PEpPQ1RFVCo+KG91dCk7CisgICAgZG1nci5tQnVmZmVyU2l6ZSA9IG1heE91dFNpemU7CisgICAgZG1nci5tRW5jb2RlZFNpemUgPSAwOworICAgIGRtZ3IubVN1Y2Nlc3MgPSB0cnVlOworICAgIGNpbmZvLT5jbGllbnRfZGF0YSA9IHN0YXRpY19jYXN0PHZvaWQqPigmZG1ncik7CisKKyAgICAvLyBUaGVzZSBsYW1iZGFzIGJlY29tZSBDLXN0eWxlIGZ1bmN0aW9uIHBvaW50ZXJzIGFuZCBhcyBwZXIgQysrMTEgc3BlYworICAgIC8vIG1heSBub3QgY2FwdHVyZSBhbnl0aGluZy4KKyAgICBkbWdyLmluaXRfZGVzdGluYXRpb24gPSBbXShqX2NvbXByZXNzX3B0ciBjaW5mbykgeworICAgICAgICBhdXRvICYgZG1nciA9IHN0YXRpY19jYXN0PEN1c3RvbUpwZWdEZXN0TWdyJj4oKmNpbmZvLT5kZXN0KTsKKyAgICAgICAgZG1nci5uZXh0X291dHB1dF9ieXRlID0gZG1nci5tQnVmZmVyOworICAgICAgICBkbWdyLmZyZWVfaW5fYnVmZmVyID0gZG1nci5tQnVmZmVyU2l6ZTsKKyAgICAgICAgQUxPR1YoIiVzOiVkIGpwZWcgc3RhcnQ6ICVwIFslenVdIiwKKyAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBfX0xJTkVfXywgZG1nci5tQnVmZmVyLCBkbWdyLm1CdWZmZXJTaXplKTsKKyAgICB9OworCisgICAgZG1nci5lbXB0eV9vdXRwdXRfYnVmZmVyID0gW10oal9jb21wcmVzc19wdHIgY2luZm8gX191bnVzZWQpIHsKKyAgICAgICAgQUxPR1YoIiVzOiVkIE91dCBvZiBidWZmZXIiLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsKKworICAgIGRtZ3IudGVybV9kZXN0aW5hdGlvbiA9IFtdKGpfY29tcHJlc3NfcHRyIGNpbmZvKSB7CisgICAgICAgIGF1dG8gJiBkbWdyID0gc3RhdGljX2Nhc3Q8Q3VzdG9tSnBlZ0Rlc3RNZ3ImPigqY2luZm8tPmRlc3QpOworICAgICAgICBkbWdyLm1FbmNvZGVkU2l6ZSA9IGRtZ3IubUJ1ZmZlclNpemUgLSBkbWdyLmZyZWVfaW5fYnVmZmVyOworICAgICAgICBBTE9HVigiJXM6JWQgRG9uZSB3aXRoIGpwZWc6ICV6dSIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18sIGRtZ3IubUVuY29kZWRTaXplKTsKKyAgICB9OworICAgIGNpbmZvLT5kZXN0ID0gc3RhdGljX2Nhc3Q8c3RydWN0IGpwZWdfZGVzdGluYXRpb25fbWdyKj4oJmRtZ3IpOworICAgIGNpbmZvLT5pbWFnZV93aWR0aCA9IHdpZHRoOworICAgIGNpbmZvLT5pbWFnZV9oZWlnaHQgPSBoZWlnaHQ7CisgICAgY2luZm8tPmlucHV0X2NvbXBvbmVudHMgPSAxOworICAgIGNpbmZvLT5pbl9jb2xvcl9zcGFjZSA9IEpDU19HUkFZU0NBTEU7CisKKyAgICAvLyBJbml0aWFsaXplIGRlZmF1bHRzIGFuZCB0aGVuIG92ZXJyaWRlIHdoYXQgd2Ugd2FudAorICAgIGpwZWdfc2V0X2RlZmF1bHRzKGNpbmZvLmdldCgpKTsKKworICAgIGpwZWdfc2V0X3F1YWxpdHkoY2luZm8uZ2V0KCksIGpwZWdRdWFsaXR5LCAxKTsKKyAgICBqcGVnX3NldF9jb2xvcnNwYWNlKGNpbmZvLmdldCgpLCBKQ1NfR1JBWVNDQUxFKTsKKyAgICBjaW5mby0+cmF3X2RhdGFfaW4gPSAwOworICAgIGNpbmZvLT5kY3RfbWV0aG9kID0gSkRDVF9JRkFTVDsKKworICAgIGNpbmZvLT5jb21wX2luZm9bMF0uaF9zYW1wX2ZhY3RvciA9IDE7CisgICAgY2luZm8tPmNvbXBfaW5mb1sxXS5oX3NhbXBfZmFjdG9yID0gMTsKKyAgICBjaW5mby0+Y29tcF9pbmZvWzJdLmhfc2FtcF9mYWN0b3IgPSAxOworICAgIGNpbmZvLT5jb21wX2luZm9bMF0udl9zYW1wX2ZhY3RvciA9IDE7CisgICAgY2luZm8tPmNvbXBfaW5mb1sxXS52X3NhbXBfZmFjdG9yID0gMTsKKyAgICBjaW5mby0+Y29tcF9pbmZvWzJdLnZfc2FtcF9mYWN0b3IgPSAxOworCisgICAganBlZ19zdGFydF9jb21wcmVzcyhjaW5mby5nZXQoKSwgVFJVRSk7CisKKyAgICBpZiAoZXhpZk9yaWVudGF0aW9uICE9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVEKSB7CisgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmVXRpbHM+IHV0aWxzKEV4aWZVdGlsczo6Y3JlYXRlKCkpOworICAgICAgICB1dGlscy0+aW5pdGlhbGl6ZUVtcHR5KCk7CisgICAgICAgIHV0aWxzLT5zZXRJbWFnZVdpZHRoKHdpZHRoKTsKKyAgICAgICAgdXRpbHMtPnNldEltYWdlSGVpZ2h0KGhlaWdodCk7CisgICAgICAgIHV0aWxzLT5zZXRPcmllbnRhdGlvblZhbHVlKGV4aWZPcmllbnRhdGlvbik7CisKKyAgICAgICAgaWYgKHV0aWxzLT5nZW5lcmF0ZUFwcDEoKSkgeworICAgICAgICAgICAgY29uc3QgdWludDhfdCogZXhpZkJ1ZmZlciA9IHV0aWxzLT5nZXRBcHAxQnVmZmVyKCk7CisgICAgICAgICAgICBzaXplX3QgZXhpZkJ1ZmZlclNpemUgPSB1dGlscy0+Z2V0QXBwMUxlbmd0aCgpOworICAgICAgICAgICAganBlZ193cml0ZV9tYXJrZXIoY2luZm8uZ2V0KCksIEpQRUdfQVBQMCArIDEsIHN0YXRpY19jYXN0PGNvbnN0IEpPQ1RFVCo+KGV4aWZCdWZmZXIpLAorICAgICAgICAgICAgICAgICAgICBleGlmQnVmZmVyU2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBnZW5lcmF0ZSBBcHAxIGJ1ZmZlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNpbmZvLT5pbWFnZV9oZWlnaHQ7IGkrKykgeworICAgICAgICBhdXRvIGN1cnJlbnRSb3cgID0gc3RhdGljX2Nhc3Q8SlNBTVBST1c+KGluICsgaSp3aWR0aCk7CisgICAgICAgIGpwZWdfd3JpdGVfc2NhbmxpbmVzKGNpbmZvLmdldCgpLCAmY3VycmVudFJvdywgLypudW1fbGluZXMqLzEpOworICAgIH0KKworICAgIGpwZWdfZmluaXNoX2NvbXByZXNzKGNpbmZvLmdldCgpKTsKKworICAgIGFjdHVhbFNpemUgPSBkbWdyLm1FbmNvZGVkU2l6ZTsKKyAgICBpZiAoZG1nci5tU3VjY2VzcykgeworICAgICAgICByZXQgPSBOT19FUlJPUjsKKyAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBVTktOT1dOX0VSUk9SOworICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKK2lubGluZSB2b2lkIHVucGFja0RlcHRoMTYodWludDE2X3QgdmFsdWUsIHN0ZDo6dmVjdG9yPGZsb2F0PiAqcG9pbnRzIC8qb3V0Ki8sCisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAqY29uZmlkZW5jZSAvKm91dCovLCBmbG9hdCAqbmVhciAvKm91dCovLCBmbG9hdCAqZmFyIC8qb3V0Ki8pIHsKKyAgICAvLyBBbmRyb2lkIGRlbnNlbHkgcGFja2VkIGRlcHRoIG1hcC4gVGhlIHVuaXRzIGZvciB0aGUgcmFuZ2UgYXJlIGluCisgICAgLy8gbWlsbGltZXRlcnMgYW5kIG5lZWQgdG8gYmUgc2NhbGVkIHRvIG1ldGVycy4KKyAgICAvLyBUaGUgY29uZmlkZW5jZSB2YWx1ZSBpcyBlbmNvZGVkIGluIHRoZSAzIG1vc3Qgc2lnbmlmaWNhbnQgYml0cy4KKyAgICAvLyBUaGUgY29uZmlkZW5jZSBkYXRhIG5lZWRzIHRvIGJlIGFkZGl0aW9uYWxseSBub3JtYWxpemVkIHdpdGgKKyAgICAvLyB2YWx1ZXMgMS4wZiwgMC4wZiByZXByZXNlbnRpbmcgbWF4aW11bSBhbmQgbWluaW11bSBjb25maWRlbmNlCisgICAgLy8gcmVzcGVjdGl2ZWx5LgorICAgIGF1dG8gcG9pbnQgPSBzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUgJiAweDFGRkYpIC8gMTAwMC5mOworICAgIHBvaW50cy0+cHVzaF9iYWNrKHBvaW50KTsKKworICAgIGF1dG8gY29uZiA9ICh2YWx1ZSA+PiAxMykgJiAweDc7CisgICAgZmxvYXQgbm9ybUNvbmZpZGVuY2UgPSAoY29uZiA9PSAwKSA/IDEuZiA6IChzdGF0aWNfY2FzdDxmbG9hdD4oY29uZikgLSAxKSAvIDcuZjsKKyAgICBjb25maWRlbmNlLT5wdXNoX2JhY2sobm9ybUNvbmZpZGVuY2UpOworICAgIGlmIChub3JtQ29uZmlkZW5jZSA8IENPTkZJREVOQ0VfVEhSRVNIT0xEKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoKm5lYXIgPiBwb2ludCkgeworICAgICAgICAqbmVhciA9IHBvaW50OworICAgIH0KKyAgICBpZiAoKmZhciA8IHBvaW50KSB7CisgICAgICAgICpmYXIgPSBwb2ludDsKKyAgICB9Cit9CisKKy8vIFRyaXZpYWwgY2FzZSwgcmVhZCBmb3J3YXJkIGZyb20gdG9wLGxlZnQgY29ybmVyLgordm9pZCByb3RhdGUwQW5kVW5wYWNrKERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWUsIHN0ZDo6dmVjdG9yPGZsb2F0PiAqcG9pbnRzIC8qb3V0Ki8sCisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAqY29uZmlkZW5jZSAvKm91dCovLCBmbG9hdCAqbmVhciAvKm91dCovLCBmbG9hdCAqZmFyIC8qb3V0Ki8pIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0OyBpKyspIHsKKyAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoOyBqKyspIHsKKyAgICAgICAgICAgIHVucGFja0RlcHRoMTYoaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXJbaSppbnB1dEZyYW1lLm1EZXB0aE1hcFN0cmlkZSArIGpdLCBwb2ludHMsCisgICAgICAgICAgICAgICAgICAgIGNvbmZpZGVuY2UsIG5lYXIsIGZhcik7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vIDkwIGRlZ3JlZXMgQ1cgcm90YXRpb24gY2FuIGJlIGFwcGxpZWQgYnkgc3RhcnRpbmcgdG8gcmVhZCBmcm9tIGJvdHRvbSwgbGVmdCBjb3JuZXIKKy8vIHRyYW5zcG9zaW5nIHJvd3MgYW5kIGNvbHVtbnMuCit2b2lkIHJvdGF0ZTkwQW5kVW5wYWNrKERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWUsIHN0ZDo6dmVjdG9yPGZsb2F0PiAqcG9pbnRzIC8qb3V0Ki8sCisgICAgICAgIHN0ZDo6dmVjdG9yPGZsb2F0PiAqY29uZmlkZW5jZSAvKm91dCovLCBmbG9hdCAqbmVhciAvKm91dCovLCBmbG9hdCAqZmFyIC8qb3V0Ki8pIHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGg7IGkrKykgeworICAgICAgICBmb3IgKHNzaXplX3QgaiA9IGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0LTE7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgICB1bnBhY2tEZXB0aDE2KGlucHV0RnJhbWUubURlcHRoTWFwQnVmZmVyW2oqaW5wdXRGcmFtZS5tRGVwdGhNYXBTdHJpZGUgKyBpXSwgcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgICAgICB9CisgICAgfQorfQorCisvLyAxODAgQ1cgZGVncmVlcyByb3RhdGlvbiBjYW4gYmUgYXBwbGllZCBieSBzdGFydGluZyB0byByZWFkIGJhY2t3YXJkcyBmcm9tIGJvdHRvbSwgcmlnaHQgY29ybmVyLgordm9pZCByb3RhdGUxODBBbmRVbnBhY2soRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZSwgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpwb2ludHMgLypvdXQqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpjb25maWRlbmNlIC8qb3V0Ki8sIGZsb2F0ICpuZWFyIC8qb3V0Ki8sIGZsb2F0ICpmYXIgLypvdXQqLykgeworICAgIGZvciAoc3NpemVfdCBpID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQtMTsgaSA+PSAwOyBpLS0pIHsKKyAgICAgICAgZm9yIChzc2l6ZV90IGogPSBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoLTE7IGogPj0gMDsgai0tKSB7CisgICAgICAgICAgICB1bnBhY2tEZXB0aDE2KGlucHV0RnJhbWUubURlcHRoTWFwQnVmZmVyW2kqaW5wdXRGcmFtZS5tRGVwdGhNYXBTdHJpZGUgKyBqXSwgcG9pbnRzLAorICAgICAgICAgICAgICAgICAgICBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgICAgICB9CisgICAgfQorfQorCisvLyAyNzAgZGVncmVlcyBDVyByb3RhdGlvbiBjYW4gYmUgYXBwbGllZCBieSBzdGFydGluZyB0byByZWFkIGZyb20gdG9wLCByaWdodCBjb3JuZXIKKy8vIHRyYW5zcG9zaW5nIHJvd3MgYW5kIGNvbHVtbnMuCit2b2lkIHJvdGF0ZTI3MEFuZFVucGFjayhEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lLCBzdGQ6OnZlY3RvcjxmbG9hdD4gKnBvaW50cyAvKm91dCovLAorICAgICAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gKmNvbmZpZGVuY2UgLypvdXQqLywgZmxvYXQgKm5lYXIgLypvdXQqLywgZmxvYXQgKmZhciAvKm91dCovKSB7CisgICAgZm9yIChzc2l6ZV90IGkgPSBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoLTE7IGkgPj0gMDsgaS0tKSB7CisgICAgICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQ7IGorKykgeworICAgICAgICAgICAgdW5wYWNrRGVwdGgxNihpbnB1dEZyYW1lLm1EZXB0aE1hcEJ1ZmZlcltqKmlucHV0RnJhbWUubURlcHRoTWFwU3RyaWRlICsgaV0sIHBvaW50cywKKyAgICAgICAgICAgICAgICAgICAgY29uZmlkZW5jZSwgbmVhciwgZmFyKTsKKyAgICAgICAgfQorICAgIH0KK30KKworYm9vbCByb3RhdGVBbmRVbnBhY2soRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZSwgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpwb2ludHMgLypvdXQqLywKKyAgICAgICAgc3RkOjp2ZWN0b3I8ZmxvYXQ+ICpjb25maWRlbmNlIC8qb3V0Ki8sIGZsb2F0ICpuZWFyIC8qb3V0Ki8sIGZsb2F0ICpmYXIgLypvdXQqLykgeworICAgIHN3aXRjaCAoaW5wdXRGcmFtZS5tT3JpZW50YXRpb24pIHsKKyAgICAgICAgY2FzZSBEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzBfREVHUkVFUzoKKyAgICAgICAgICAgIHJvdGF0ZTBBbmRVbnBhY2soaW5wdXRGcmFtZSwgcG9pbnRzLCBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNlIERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fOTBfREVHUkVFUzoKKyAgICAgICAgICAgIHJvdGF0ZTkwQW5kVW5wYWNrKGlucHV0RnJhbWUsIHBvaW50cywgY29uZmlkZW5jZSwgbmVhciwgZmFyKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBjYXNlIERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fMTgwX0RFR1JFRVM6CisgICAgICAgICAgICByb3RhdGUxODBBbmRVbnBhY2soaW5wdXRGcmFtZSwgcG9pbnRzLCBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNlIERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fMjcwX0RFR1JFRVM6CisgICAgICAgICAgICByb3RhdGUyNzBBbmRVbnBhY2soaW5wdXRGcmFtZSwgcG9pbnRzLCBjb25maWRlbmNlLCBuZWFyLCBmYXIpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiJXM6IFVuc3VwcG9ydGVkIGRlcHRoIHBob3RvIHJvdGF0aW9uOiAlZCwgZGVmYXVsdCB0byAwIiwgX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgICAgICBpbnB1dEZyYW1lLm1PcmllbnRhdGlvbik7CisgICAgICAgICAgICByb3RhdGUwQW5kVW5wYWNrKGlucHV0RnJhbWUsIHBvaW50cywgY29uZmlkZW5jZSwgbmVhciwgZmFyKTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxkeW5hbWljX2RlcHRoOjpEZXB0aE1hcD4gcHJvY2Vzc0RlcHRoTWFwRnJhbWUoRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZSwKKyAgICAgICAgRXhpZk9yaWVudGF0aW9uIGV4aWZPcmllbnRhdGlvbiwgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEl0ZW0+PiAqaXRlbXMgLypvdXQqLywKKyAgICAgICAgYm9vbCAqc3dpdGNoRGltZW5zaW9ucyAvKm91dCovKSB7CisgICAgaWYgKChpdGVtcyA9PSBudWxscHRyKSB8fCAoc3dpdGNoRGltZW5zaW9ucyA9PSBudWxscHRyKSkgeworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxmbG9hdD4gcG9pbnRzLCBjb25maWRlbmNlOworCisgICAgc2l6ZV90IHBvaW50Q291bnQgPSBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoICogaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQ7CisgICAgcG9pbnRzLnJlc2VydmUocG9pbnRDb3VudCk7CisgICAgY29uZmlkZW5jZS5yZXNlcnZlKHBvaW50Q291bnQpOworICAgIGZsb2F0IG5lYXIgPSBVSU5UMTZfTUFYOworICAgIGZsb2F0IGZhciA9IC4wZjsKKyAgICAqc3dpdGNoRGltZW5zaW9ucyA9IGZhbHNlOworICAgIC8vIFBoeXNpY2FsIHJvdGF0aW9uIG9mIGRlcHRoIGFuZCBjb25maWRlbmNlIG1hcHMgbWF5IGJlIG5lZWRlZCBpbiBjYXNlCisgICAgLy8gdGhlIEVYSUYgb3JpZW50YXRpb24gaXMgc2V0IHRvIDAgZGVncmVlcyBhbmQgdGhlIGRlcHRoIHBob3RvIG9yaWVudGF0aW9uCisgICAgLy8gKHNvdXJjZSBjb2xvciBpbWFnZSkgaGFzIHNvbWUgZGlmZmVyZW50IHZhbHVlLgorICAgIGlmIChleGlmT3JpZW50YXRpb24gPT0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8wX0RFR1JFRVMpIHsKKyAgICAgICAgKnN3aXRjaERpbWVuc2lvbnMgPSByb3RhdGVBbmRVbnBhY2soaW5wdXRGcmFtZSwgJnBvaW50cywgJmNvbmZpZGVuY2UsICZuZWFyLCAmZmFyKTsKKyAgICB9IGVsc2UgeworICAgICAgICByb3RhdGUwQW5kVW5wYWNrKGlucHV0RnJhbWUsICZwb2ludHMsICZjb25maWRlbmNlLCAmbmVhciwgJmZhcik7CisgICAgfQorCisgICAgc2l6ZV90IHdpZHRoID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aDsKKyAgICBzaXplX3QgaGVpZ2h0ID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQ7CisgICAgaWYgKCpzd2l0Y2hEaW1lbnNpb25zKSB7CisgICAgICAgIHdpZHRoID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQ7CisgICAgICAgIGhlaWdodCA9IGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGg7CisgICAgfQorCisgICAgaWYgKG5lYXIgPT0gZmFyKSB7CisgICAgICAgIEFMT0dFKCIlczogTmVhciBhbmQgZmFyIHJhbmdlIHZhbHVlcyBtdXN0IG5vdCBtYXRjaCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBwb2ludHNRdWFudGl6ZWQsIGNvbmZpZGVuY2VRdWFudGl6ZWQ7CisgICAgcG9pbnRzUXVhbnRpemVkLnJlc2VydmUocG9pbnRDb3VudCk7IGNvbmZpZGVuY2VRdWFudGl6ZWQucmVzZXJ2ZShwb2ludENvdW50KTsKKyAgICBhdXRvIHBvaW50SXQgPSBwb2ludHMuYmVnaW4oKTsKKyAgICBhdXRvIGNvbmZpZGVuY2VJdCA9IGNvbmZpZGVuY2UuYmVnaW4oKTsKKyAgICB3aGlsZSAoKHBvaW50SXQgIT0gcG9pbnRzLmVuZCgpKSAmJiAoY29uZmlkZW5jZUl0ICE9IGNvbmZpZGVuY2UuZW5kKCkpKSB7CisgICAgICAgIGF1dG8gcG9pbnQgPSAqcG9pbnRJdDsKKyAgICAgICAgaWYgKCgqY29uZmlkZW5jZUl0KSA8IENPTkZJREVOQ0VfVEhSRVNIT0xEKSB7CisgICAgICAgICAgICBwb2ludCA9IHN0ZDo6Y2xhbXAocG9pbnQsIG5lYXIsIGZhcik7CisgICAgICAgIH0KKyAgICAgICAgcG9pbnRzUXVhbnRpemVkLnB1c2hfYmFjayhmbG9vcmYoKChmYXIgKiAocG9pbnQgLSBuZWFyKSkgLworICAgICAgICAgICAgICAgIChwb2ludCAqIChmYXIgLSBuZWFyKSkpICogMjU1LjBmKSk7CisgICAgICAgIGNvbmZpZGVuY2VRdWFudGl6ZWQucHVzaF9iYWNrKGZsb29yZigqY29uZmlkZW5jZUl0ICogMjU1LjBmKSk7CisgICAgICAgIGNvbmZpZGVuY2VJdCsrOyBwb2ludEl0Kys7CisgICAgfQorCisgICAgRGVwdGhNYXBQYXJhbXMgZGVwdGhQYXJhbXMoRGVwdGhGb3JtYXQ6OmtSYW5nZUludmVyc2UsIG5lYXIsIGZhciwgRGVwdGhVbml0czo6a01ldGVycywKKyAgICAgICAgICAgICJhbmRyb2lkL2RlcHRobWFwIik7CisgICAgZGVwdGhQYXJhbXMuY29uZmlkZW5jZV91cmkgPSAiYW5kcm9pZC9jb25maWRlbmNlbWFwIjsKKyAgICBkZXB0aFBhcmFtcy5taW1lID0gImltYWdlL2pwZWciOworICAgIGRlcHRoUGFyYW1zLmRlcHRoX2ltYWdlX2RhdGEucmVzaXplKGlucHV0RnJhbWUubU1heEpwZWdTaXplKTsKKyAgICBkZXB0aFBhcmFtcy5jb25maWRlbmNlX2RhdGEucmVzaXplKGlucHV0RnJhbWUubU1heEpwZWdTaXplKTsKKyAgICBzaXplX3QgYWN0dWFsSnBlZ1NpemU7CisgICAgYXV0byByZXQgPSBlbmNvZGVHcmF5c2NhbGVKcGVnKHdpZHRoLCBoZWlnaHQsIHBvaW50c1F1YW50aXplZC5kYXRhKCksCisgICAgICAgICAgICBkZXB0aFBhcmFtcy5kZXB0aF9pbWFnZV9kYXRhLmRhdGEoKSwgaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUsCisgICAgICAgICAgICBpbnB1dEZyYW1lLm1KcGVnUXVhbGl0eSwgZXhpZk9yaWVudGF0aW9uLCBhY3R1YWxKcGVnU2l6ZSk7CisgICAgaWYgKHJldCAhPSBOT19FUlJPUikgeworICAgICAgICBBTE9HRSgiJXM6IERlcHRoIG1hcCBjb21wcmVzc2lvbiBmYWlsZWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGRlcHRoUGFyYW1zLmRlcHRoX2ltYWdlX2RhdGEucmVzaXplKGFjdHVhbEpwZWdTaXplKTsKKworICAgIHJldCA9IGVuY29kZUdyYXlzY2FsZUpwZWcod2lkdGgsIGhlaWdodCwgY29uZmlkZW5jZVF1YW50aXplZC5kYXRhKCksCisgICAgICAgICAgICBkZXB0aFBhcmFtcy5jb25maWRlbmNlX2RhdGEuZGF0YSgpLCBpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSwKKyAgICAgICAgICAgIGlucHV0RnJhbWUubUpwZWdRdWFsaXR5LCBleGlmT3JpZW50YXRpb24sIGFjdHVhbEpwZWdTaXplKTsKKyAgICBpZiAocmV0ICE9IE5PX0VSUk9SKSB7CisgICAgICAgIEFMT0dFKCIlczogQ29uZmlkZW5jZSBtYXAgY29tcHJlc3Npb24gZmFpbGVkISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKyAgICBkZXB0aFBhcmFtcy5jb25maWRlbmNlX2RhdGEucmVzaXplKGFjdHVhbEpwZWdTaXplKTsKKworICAgIHJldHVybiBEZXB0aE1hcDo6RnJvbURhdGEoZGVwdGhQYXJhbXMsIGl0ZW1zKTsKK30KKworZXh0ZXJuICJDIiBpbnQgcHJvY2Vzc0RlcHRoUGhvdG9GcmFtZShEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lLCBzaXplX3QgZGVwdGhQaG90b0J1ZmZlclNpemUsCisgICAgICAgIHZvaWQqIGRlcHRoUGhvdG9CdWZmZXIgLypvdXQqLywgc2l6ZV90KiBkZXB0aFBob3RvQWN0dWFsU2l6ZSAvKm91dCovKSB7CisgICAgaWYgKChpbnB1dEZyYW1lLm1NYWluSnBlZ0J1ZmZlciA9PSBudWxscHRyKSB8fCAoaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXIgPT0gbnVsbHB0cikgfHwKKyAgICAgICAgICAgIChkZXB0aFBob3RvQnVmZmVyID09IG51bGxwdHIpIHx8IChkZXB0aFBob3RvQWN0dWFsU2l6ZSA9PSBudWxscHRyKSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxJdGVtPj4gaXRlbXM7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPENhbWVyYT4+IGNhbWVyYUxpc3Q7CisgICAgYXV0byBpbWFnZSA9IEltYWdlOjpGcm9tRGF0YUZvclByaW1hcnlJbWFnZSgiaW1hZ2UvanBlZyIsICZpdGVtcyk7CisgICAgc3RkOjp1bmlxdWVfcHRyPENhbWVyYVBhcmFtcz4gY2FtZXJhUGFyYW1zKG5ldyBDYW1lcmFQYXJhbXMoc3RkOjptb3ZlKGltYWdlKSkpOworICAgIGlmIChjYW1lcmFQYXJhbXMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byBpbml0aWFsaXplIGNhbWVyYSBwYXJhbWV0ZXJzIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBFeGlmT3JpZW50YXRpb24gZXhpZk9yaWVudGF0aW9uID0gZ2V0RXhpZk9yaWVudGF0aW9uKAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4gKGlucHV0RnJhbWUubU1haW5KcGVnQnVmZmVyKSwKKyAgICAgICAgICAgIGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSk7CisgICAgYm9vbCBzd2l0Y2hEaW1lbnNpb25zOworICAgIGNhbWVyYVBhcmFtcy0+ZGVwdGhfbWFwID0gcHJvY2Vzc0RlcHRoTWFwRnJhbWUoaW5wdXRGcmFtZSwgZXhpZk9yaWVudGF0aW9uLCAmaXRlbXMsCisgICAgICAgICAgICAmc3dpdGNoRGltZW5zaW9ucyk7CisgICAgaWYgKGNhbWVyYVBhcmFtcy0+ZGVwdGhfbWFwID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBEZXB0aCBtYXAgcHJvY2Vzc2luZyBmYWlsZWQhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAvLyBJdCBpcyBub3QgcG9zc2libGUgdG8gZ2VuZXJhdGUgYW4gaW1hZ2luZyBtb2RlbCB3aXRob3V0IGludHJpbnNpYyBjYWxpYnJhdGlvbi4KKyAgICBpZiAoaW5wdXRGcmFtZS5tSXNJbnRyaW5zaWNDYWxpYnJhdGlvblZhbGlkKSB7CisgICAgICAgIC8vIFRoZSBjYW1lcmEgaW50cmluc2ljIGNhbGlicmF0aW9uIGxheW91dCBpcyBhcyBmb2xsb3dzOgorICAgICAgICAvLyBbZm9jYWxMZW5ndGhYLCBmb2NhbExlbmd0aFksIG9wdGljYWxDZW50ZXJYLCBvcHRpY2FsQ2VudGVyWSwgc2tld10KKyAgICAgICAgY29uc3QgZHluYW1pY19kZXB0aDo6UG9pbnQ8ZG91YmxlPiBmb2NhbExlbmd0aChpbnB1dEZyYW1lLm1JbnRyaW5zaWNDYWxpYnJhdGlvblswXSwKKyAgICAgICAgICAgICAgICBpbnB1dEZyYW1lLm1JbnRyaW5zaWNDYWxpYnJhdGlvblsxXSk7CisgICAgICAgIHNpemVfdCB3aWR0aCA9IGlucHV0RnJhbWUubU1haW5KcGVnV2lkdGg7CisgICAgICAgIHNpemVfdCBoZWlnaHQgPSBpbnB1dEZyYW1lLm1NYWluSnBlZ0hlaWdodDsKKyAgICAgICAgaWYgKHN3aXRjaERpbWVuc2lvbnMpIHsKKyAgICAgICAgICAgIHdpZHRoID0gaW5wdXRGcmFtZS5tTWFpbkpwZWdIZWlnaHQ7CisgICAgICAgICAgICBoZWlnaHQgPSBpbnB1dEZyYW1lLm1NYWluSnBlZ1dpZHRoOworICAgICAgICB9CisgICAgICAgIGNvbnN0IERpbWVuc2lvbiBpbWFnZVNpemUod2lkdGgsIGhlaWdodCk7CisgICAgICAgIEltYWdpbmdNb2RlbFBhcmFtcyBpbWFnaW5nUGFyYW1zKGZvY2FsTGVuZ3RoLCBpbWFnZVNpemUpOworICAgICAgICBpbWFnaW5nUGFyYW1zLnByaW5jaXBhbF9wb2ludC54ID0gaW5wdXRGcmFtZS5tSW50cmluc2ljQ2FsaWJyYXRpb25bMl07CisgICAgICAgIGltYWdpbmdQYXJhbXMucHJpbmNpcGFsX3BvaW50LnkgPSBpbnB1dEZyYW1lLm1JbnRyaW5zaWNDYWxpYnJhdGlvblszXTsKKyAgICAgICAgaW1hZ2luZ1BhcmFtcy5za2V3ID0gaW5wdXRGcmFtZS5tSW50cmluc2ljQ2FsaWJyYXRpb25bNF07CisKKyAgICAgICAgLy8gVGhlIGNhbWVyYSBsZW5zIGRpc3RvcnRpb24gY29udGFpbnMgdGhlIGZvbGxvd2luZyBsZW5zIGNvcnJlY3Rpb24gY29lZmZpY2llbnRzLgorICAgICAgICAvLyBba2FwcGFfMSwga2FwcGFfMiwga2FwcGFfMyBrYXBwYV80LCBrYXBwYV81XQorICAgICAgICBpZiAoaW5wdXRGcmFtZS5tSXNMZW5zRGlzdG9ydGlvblZhbGlkKSB7CisgICAgICAgICAgICAvLyBBY2NvcmRpbmcgdG8gc3BlY2lmaWNhdGlvbiB0aGUgbGVucyBkaXN0b3J0aW9uIGNvZWZmaWNpZW50cyBzaG91bGQgYmUgb3JkZXJlZAorICAgICAgICAgICAgLy8gYXMgWzEsIGthcHBhXzQsIGthcHBhXzEsIGthcHBhXzUsIGthcHBhXzIsIDAsIGthcHBhXzMsIDBdCisgICAgICAgICAgICBmbG9hdCBkaXN0b3J0aW9uRGF0YVtdID0gezEuZiwgaW5wdXRGcmFtZS5tTGVuc0Rpc3RvcnRpb25bM10sCisgICAgICAgICAgICAgICAgICAgIGlucHV0RnJhbWUubUxlbnNEaXN0b3J0aW9uWzBdLCBpbnB1dEZyYW1lLm1MZW5zRGlzdG9ydGlvbls0XSwKKyAgICAgICAgICAgICAgICAgICAgaW5wdXRGcmFtZS5tTGVuc0Rpc3RvcnRpb25bMV0sIDAuZiwgaW5wdXRGcmFtZS5tTGVuc0Rpc3RvcnRpb25bMl0sIDAuZn07CisgICAgICAgICAgICBhdXRvIGRpc3RvcnRpb25EYXRhTGVuZ3RoID0gc2l6ZW9mKGRpc3RvcnRpb25EYXRhKSAvIHNpemVvZihkaXN0b3J0aW9uRGF0YVswXSk7CisgICAgICAgICAgICBpbWFnaW5nUGFyYW1zLmRpc3RvcnRpb24ucmVzZXJ2ZShkaXN0b3J0aW9uRGF0YUxlbmd0aCk7CisgICAgICAgICAgICBpbWFnaW5nUGFyYW1zLmRpc3RvcnRpb24uaW5zZXJ0KGltYWdpbmdQYXJhbXMuZGlzdG9ydGlvbi5lbmQoKSwgZGlzdG9ydGlvbkRhdGEsCisgICAgICAgICAgICAgICAgICAgIGRpc3RvcnRpb25EYXRhICsgZGlzdG9ydGlvbkRhdGFMZW5ndGgpOworICAgICAgICB9CisKKyAgICAgICAgY2FtZXJhUGFyYW1zLT5pbWFnaW5nX21vZGVsID0gSW1hZ2luZ01vZGVsOjpGcm9tRGF0YShpbWFnaW5nUGFyYW1zKTsKKyAgICB9CisKKyAgICBpZiAoaW5wdXRGcmFtZS5tSXNMb2dpY2FsKSB7CisgICAgICAgIGNhbWVyYVBhcmFtcy0+dHJhaXQgPSBkeW5hbWljX2RlcHRoOjpDYW1lcmFUcmFpdDo6TE9HSUNBTDsKKyAgICB9IGVsc2UgeworICAgICAgICBjYW1lcmFQYXJhbXMtPnRyYWl0ID0gZHluYW1pY19kZXB0aDo6Q2FtZXJhVHJhaXQ6OlBIWVNJQ0FMOworICAgIH0KKworICAgIGNhbWVyYUxpc3QuZW1wbGFjZV9iYWNrKENhbWVyYTo6RnJvbURhdGEoc3RkOjptb3ZlKGNhbWVyYVBhcmFtcykpKTsKKworICAgIGF1dG8gZGV2aWNlUGFyYW1zID0gc3RkOjptYWtlX3VuaXF1ZTxEZXZpY2VQYXJhbXM+IChDYW1lcmFzOjpGcm9tQ2FtZXJhQXJyYXkoJmNhbWVyYUxpc3QpKTsKKyAgICBkZXZpY2VQYXJhbXMtPmNvbnRhaW5lciA9IENvbnRhaW5lcjo6RnJvbUl0ZW1zKCZpdGVtcyk7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFByb2ZpbGU+PiBwcm9maWxlTGlzdDsKKyAgICBwcm9maWxlTGlzdC5lbXBsYWNlX2JhY2soUHJvZmlsZTo6RnJvbURhdGEoIkRlcHRoUGhvdG8iLCB7MH0pKTsKKyAgICBkZXZpY2VQYXJhbXMtPnByb2ZpbGVzID0gUHJvZmlsZXM6OkZyb21Qcm9maWxlQXJyYXkoJnByb2ZpbGVMaXN0KTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RGV2aWNlPiBkZXZpY2UgPSBEZXZpY2U6OkZyb21EYXRhKHN0ZDo6bW92ZShkZXZpY2VQYXJhbXMpKTsKKyAgICBpZiAoZGV2aWNlID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gaW5pdGlhbGl6ZSBjYW1lcmEgZGV2aWNlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzdGQ6OmlzdHJpbmdzdHJlYW0gaW5wdXRKcGVnU3RyZWFtKAorICAgICAgICAgICAgc3RkOjpzdHJpbmcoaW5wdXRGcmFtZS5tTWFpbkpwZWdCdWZmZXIsIGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSkpOworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXRwdXRKcGVnU3RyZWFtOworICAgIGlmICghV3JpdGVJbWFnZUFuZE1ldGFkYXRhQW5kQ29udGFpbmVyKCZpbnB1dEpwZWdTdHJlYW0sIGRldmljZS5nZXQoKSwgJm91dHB1dEpwZWdTdHJlYW0pKSB7CisgICAgICAgIEFMT0dFKCIlczogRmFpbGVkIHdyaXRpbmcgZGVwdGggb3V0cHV0IiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICAqZGVwdGhQaG90b0FjdHVhbFNpemUgPSBzdGF0aWNfY2FzdDxzaXplX3Q+IChvdXRwdXRKcGVnU3RyZWFtLnRlbGxwKCkpOworICAgIGlmICgqZGVwdGhQaG90b0FjdHVhbFNpemUgPiBkZXB0aFBob3RvQnVmZmVyU2l6ZSkgeworICAgICAgICBBTE9HRSgiJXM6IERlcHRoIHBob3RvIG91dHB1dCBidWZmZXIgbm90IHN1ZmZpY2llbnQsIG5lZWRlZCAlenUgYWN0dWFsICV6dSIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgICAqZGVwdGhQaG90b0FjdHVhbFNpemUsIGRlcHRoUGhvdG9CdWZmZXJTaXplKTsKKyAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKKyAgICB9CisKKyAgICBtZW1jcHkoZGVwdGhQaG90b0J1ZmZlciwgb3V0cHV0SnBlZ1N0cmVhbS5zdHIoKS5jX3N0cigpLCAqZGVwdGhQaG90b0FjdHVhbFNpemUpOworCisgICAgcmV0dXJuIDA7Cit9CisKK307IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE1Y2E5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9EZXB0aFBob3RvUHJvY2Vzc29yLmgKQEAgLTAsMCArMSw3NiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9DQU1FUkEzX0RFUFRIX1BST0NFU1NPUl9ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfQ0FNRVJBM19ERVBUSF9QUk9DRVNTT1JfSAorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBjYW1lcmEzIHsKKworZW51bSBEZXB0aFBob3RvT3JpZW50YXRpb24geworICAgIERFUFRIX09SSUVOVEFUSU9OXzBfREVHUkVFUyAgID0gMCwKKyAgICBERVBUSF9PUklFTlRBVElPTl85MF9ERUdSRUVTICA9IDkwLAorICAgIERFUFRIX09SSUVOVEFUSU9OXzE4MF9ERUdSRUVTID0gMTgwLAorICAgIERFUFRIX09SSUVOVEFUSU9OXzI3MF9ERUdSRUVTID0gMjcwLAorfTsKKworc3RydWN0IERlcHRoUGhvdG9JbnB1dEZyYW1lIHsKKyAgICBjb25zdCBjaGFyKiAgICAgICAgICAgbU1haW5KcGVnQnVmZmVyOworICAgIHNpemVfdCAgICAgICAgICAgICAgICBtTWFpbkpwZWdTaXplOworICAgIHNpemVfdCAgICAgICAgICAgICAgICBtTWFpbkpwZWdXaWR0aCwgbU1haW5KcGVnSGVpZ2h0OworICAgIHVpbnQxNl90KiAgICAgICAgICAgICBtRGVwdGhNYXBCdWZmZXI7CisgICAgc2l6ZV90ICAgICAgICAgICAgICAgIG1EZXB0aE1hcFdpZHRoLCBtRGVwdGhNYXBIZWlnaHQsIG1EZXB0aE1hcFN0cmlkZTsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgbU1heEpwZWdTaXplOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBtSnBlZ1F1YWxpdHk7CisgICAgdWludDhfdCAgICAgICAgICAgICAgIG1Jc0xvZ2ljYWw7CisgICAgZmxvYXQgICAgICAgICAgICAgICAgIG1JbnRyaW5zaWNDYWxpYnJhdGlvbls1XTsKKyAgICB1aW50OF90ICAgICAgICAgICAgICAgbUlzSW50cmluc2ljQ2FsaWJyYXRpb25WYWxpZDsKKyAgICBmbG9hdCAgICAgICAgICAgICAgICAgbUxlbnNEaXN0b3J0aW9uWzVdOworICAgIHVpbnQ4X3QgICAgICAgICAgICAgICBtSXNMZW5zRGlzdG9ydGlvblZhbGlkOworICAgIERlcHRoUGhvdG9PcmllbnRhdGlvbiBtT3JpZW50YXRpb247CisKKyAgICBEZXB0aFBob3RvSW5wdXRGcmFtZSgpIDoKKyAgICAgICAgICAgIG1NYWluSnBlZ0J1ZmZlcihudWxscHRyKSwKKyAgICAgICAgICAgIG1NYWluSnBlZ1NpemUoMCksCisgICAgICAgICAgICBtTWFpbkpwZWdXaWR0aCgwKSwKKyAgICAgICAgICAgIG1NYWluSnBlZ0hlaWdodCgwKSwKKyAgICAgICAgICAgIG1EZXB0aE1hcEJ1ZmZlcihudWxscHRyKSwKKyAgICAgICAgICAgIG1EZXB0aE1hcFdpZHRoKDApLAorICAgICAgICAgICAgbURlcHRoTWFwSGVpZ2h0KDApLAorICAgICAgICAgICAgbURlcHRoTWFwU3RyaWRlKDApLAorICAgICAgICAgICAgbU1heEpwZWdTaXplKDApLAorICAgICAgICAgICAgbUpwZWdRdWFsaXR5KDEwMCksCisgICAgICAgICAgICBtSXNMb2dpY2FsKDApLAorICAgICAgICAgICAgbUludHJpbnNpY0NhbGlicmF0aW9uezAuZn0sCisgICAgICAgICAgICBtSXNJbnRyaW5zaWNDYWxpYnJhdGlvblZhbGlkKDApLAorICAgICAgICAgICAgbUxlbnNEaXN0b3J0aW9uezAuZn0sCisgICAgICAgICAgICBtSXNMZW5zRGlzdG9ydGlvblZhbGlkKDApLAorICAgICAgICAgICAgbU9yaWVudGF0aW9uKERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fMF9ERUdSRUVTKSB7fQorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmtEZXB0aFBob3RvTGlicmFyeSA9ICJsaWJkZXB0aHBob3RvLnNvIjsKK3N0YXRpYyBjb25zdCBjaGFyICprRGVwdGhQaG90b1Byb2Nlc3NGdW5jdGlvbiA9ICJwcm9jZXNzRGVwdGhQaG90b0ZyYW1lIjsKK3R5cGVkZWYgaW50ICgqcHJvY2Vzc19kZXB0aF9waG90b19mcmFtZSkgKERlcHRoUGhvdG9JbnB1dEZyYW1lIC8qaW5wdXRGcmFtZSovLAorICAgICAgICBzaXplX3QgLypkZXB0aFBob3RvQnVmZmVyU2l6ZSovLCB2b2lkKiAvKmRlcHRoUGhvdG9CdWZmZXIgb3V0Ki8sCisgICAgICAgIHNpemVfdCogLypkZXB0aFBob3RvQWN0dWFsU2l6ZSBvdXQqLyk7CisKK307IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9OyAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5jcHAKaW5kZXggNDFjOTUzYi4uM2Q1NmNkMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5jcHAKQEAgLTg5LDEyICs4OSwyNyBAQAogICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogCiAgICAgQ2FtZXJhTWV0YWRhdGEgbGFzdEZyYW1lOworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBDYW1lcmFNZXRhZGF0YT4gbGFzdFBoeXNpY2FsRnJhbWVzOwogICAgIHsKICAgICAgICAgLy8gRG9uJ3QgcmFjZSB3aGlsZSBkdW1waW5nIG1ldGFkYXRhCiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtTGFzdEZyYW1lTXV0ZXgpOwogICAgICAgICBsYXN0RnJhbWUgPSBDYW1lcmFNZXRhZGF0YShtTGFzdEZyYW1lKTsKKworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHBoeXNpY2FsRnJhbWUgOiBtTGFzdFBoeXNpY2FsRnJhbWVzKSB7CisgICAgICAgICAgICBsYXN0UGh5c2ljYWxGcmFtZXMuZW1wbGFjZShTdHJpbmc4KHBoeXNpY2FsRnJhbWUubVBoeXNpY2FsQ2FtZXJhSWQpLAorICAgICAgICAgICAgICAgICAgICBwaHlzaWNhbEZyYW1lLm1QaHlzaWNhbENhbWVyYU1ldGFkYXRhKTsKKyAgICAgICAgfQogICAgIH0KLSAgICBsYXN0RnJhbWUuZHVtcChmZCwgMiwgNik7CisgICAgbGFzdEZyYW1lLmR1bXAoZmQsIC8qdmVyYm9zaXR5Ki8yLCAvKmluZGVudGF0aW9uKi82KTsKKworICAgIGZvciAoY29uc3QgYXV0byYgcGh5c2ljYWxGcmFtZSA6IGxhc3RQaHlzaWNhbEZyYW1lcykgeworICAgICAgICByZXN1bHQgPSBTdHJpbmc4Ojpmb3JtYXQoIiAgIExhdGVzdCByZWNlaXZlZCBmcmFtZSBmb3IgcGh5c2ljYWwgY2FtZXJhICVzOlxuIiwKKyAgICAgICAgICAgICAgICBwaHlzaWNhbEZyYW1lLmZpcnN0LmNfc3RyKCkpOworICAgICAgICB3cml0ZShmZCwgcmVzdWx0LnN0cmluZygpLCByZXN1bHQuc2l6ZSgpKTsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEgbGFzdFBoeXNpY2FsTWV0YWRhdGEgPSBDYW1lcmFNZXRhZGF0YShwaHlzaWNhbEZyYW1lLnNlY29uZCk7CisgICAgICAgIGxhc3RQaHlzaWNhbE1ldGFkYXRhLnNvcnQoKTsKKyAgICAgICAgbGFzdFBoeXNpY2FsTWV0YWRhdGEuZHVtcChmZCwgLyp2ZXJib3NpdHkqLzIsIC8qaW5kZW50YXRpb24qLzYpOworICAgIH0KIH0KIAogYm9vbCBGcmFtZVByb2Nlc3NvckJhc2U6OnRocmVhZExvb3AoKSB7CkBAIC0xNDUsNiArMTYwLDggQEAKICAgICAgICAgaWYgKCFyZXN1bHQubU1ldGFkYXRhLmlzRW1wdHkoKSkgewogICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1MYXN0RnJhbWVNdXRleCk7CiAgICAgICAgICAgICBtTGFzdEZyYW1lLmFjcXVpcmUocmVzdWx0Lm1NZXRhZGF0YSk7CisKKyAgICAgICAgICAgIG1MYXN0UGh5c2ljYWxGcmFtZXMgPSBzdGQ6Om1vdmUocmVzdWx0Lm1QaHlzaWNhbE1ldGFkYXRhcyk7CiAgICAgICAgIH0KICAgICB9CiAgICAgaWYgKHJlcyAhPSBOT1RfRU5PVUdIX0RBVEEpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2NvbW1vbi9GcmFtZVByb2Nlc3NvckJhc2UuaAppbmRleCAwMDc2M2E0Li5hZTZkMTVkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9jb21tb24vRnJhbWVQcm9jZXNzb3JCYXNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvY29tbW9uL0ZyYW1lUHJvY2Vzc29yQmFzZS5oCkBAIC04Myw2ICs4Myw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxDYW1lcmFEZXZpY2VCYXNlPiAmZGV2aWNlKTsKIAogICAgIENhbWVyYU1ldGFkYXRhIG1MYXN0RnJhbWU7CisgICAgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gbUxhc3RQaHlzaWNhbEZyYW1lczsKKwogfTsKIAogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuY3BwCmluZGV4IDhjOGI5N2EuLmQ2YmY4M2UgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuY3BwCkBAIC0yMzcsNyArMjM3LDcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM0J1ZmZlck1hbmFnZXI6OmdldEJ1ZmZlckZvclN0cmVhbShpbnQgc3RyZWFtSWQsIGludCBzdHJlYW1TZXRJZCwKLSAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4qIGdiLCBpbnQqIGZlbmNlRmQpIHsKKyAgICAgICAgc3A8R3JhcGhpY0J1ZmZlcj4qIGdiLCBpbnQqIGZlbmNlRmQsIGJvb2wgbm9GcmVlQnVmZmVyQXRDb25zdW1lcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CkBAIC0yNTMsMTQgKzI1MywxOSBAQAogICAgIFN0cmVhbVNldCAmc3RyZWFtU2V0ID0gbVN0cmVhbVNldE1hcC5lZGl0VmFsdWVGb3Ioc3RyZWFtU2V0SWQpOwogICAgIEJ1ZmZlckNvdW50TWFwJiBoYW5kT3V0QnVmZmVyQ291bnRzID0gc3RyZWFtU2V0LmhhbmRvdXRCdWZmZXJDb3VudE1hcDsKICAgICBzaXplX3QmIGJ1ZmZlckNvdW50ID0gaGFuZE91dEJ1ZmZlckNvdW50cy5lZGl0VmFsdWVGb3Ioc3RyZWFtSWQpOworICAgIEJ1ZmZlckNvdW50TWFwJiBhdHRhY2hlZEJ1ZmZlckNvdW50cyA9IHN0cmVhbVNldC5hdHRhY2hlZEJ1ZmZlckNvdW50TWFwOworICAgIHNpemVfdCYgYXR0YWNoZWRCdWZmZXJDb3VudCA9IGF0dGFjaGVkQnVmZmVyQ291bnRzLmVkaXRWYWx1ZUZvcihzdHJlYW1JZCk7CisKKyAgICBpZiAobm9GcmVlQnVmZmVyQXRDb25zdW1lcikgeworICAgICAgICBhdHRhY2hlZEJ1ZmZlckNvdW50ID0gYnVmZmVyQ291bnQ7CisgICAgfQorCiAgICAgaWYgKGJ1ZmZlckNvdW50ID49IHN0cmVhbVNldC5tYXhBbGxvd2VkQnVmZmVyQ291bnQpIHsKICAgICAgICAgQUxPR0UoIiVzOiBidWZmZXJDb3VudCAoJXp1KSBleGNlZWRzIHRoZSBtYXggYWxsb3dlZCBidWZmZXIgY291bnQgKCV6dSkgb2YgdGhpcyBzdHJlYW0gc2V0IiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZmZlckNvdW50LCBzdHJlYW1TZXQubWF4QWxsb3dlZEJ1ZmZlckNvdW50KTsKICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOwogICAgIH0KIAotICAgIEJ1ZmZlckNvdW50TWFwJiBhdHRhY2hlZEJ1ZmZlckNvdW50cyA9IHN0cmVhbVNldC5hdHRhY2hlZEJ1ZmZlckNvdW50TWFwOwotICAgIHNpemVfdCYgYXR0YWNoZWRCdWZmZXJDb3VudCA9IGF0dGFjaGVkQnVmZmVyQ291bnRzLmVkaXRWYWx1ZUZvcihzdHJlYW1JZCk7CiAgICAgaWYgKGF0dGFjaGVkQnVmZmVyQ291bnQgPiBidWZmZXJDb3VudCkgewogICAgICAgICAvLyBXZSd2ZSBhbHJlYWR5IGF0dGFjaGVkIG1vcmUgYnVmZmVycyB0byB0aGlzIHN0cmVhbSB0aGFuIHdlIGN1cnJlbnRseSBoYXZlCiAgICAgICAgIC8vIG91dHN0YW5kaW5nLCBzbyBoYXZlIHRoZSBzdHJlYW0ganVzdCB1c2UgYW4gYWxyZWFkeS1hdHRhY2hlZCBidWZmZXIKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0J1ZmZlck1hbmFnZXIuaAppbmRleCAwMjUwNjJlLi5mMGRlMWMxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNCdWZmZXJNYW5hZ2VyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzQnVmZmVyTWFuYWdlci5oCkBAIC0xMTIsNiArMTEyLDEwIEBACiAgICAgICoKICAgICAgKiBBZnRlciB0aGlzIGNhbGwsIHRoZSBjbGllbnQgdGFrZXMgb3ZlciB0aGUgb3duZXJzaGlwIG9mIHRoaXMgYnVmZmVyIGlmIGl0IGlzIG5vdCBmcmVlZC4KICAgICAgKgorICAgICAqIFNvbWV0aW1lcyBmcmVlIGJ1ZmZlcnMgYXJlIGRpc2NhcmRlZCBmcm9tIGNvbnN1bWVyIHNpZGUgYW5kIHRoZSBkZXF1ZXVlQnVmZmVyIGNhbGwgcmV0dXJucworICAgICAqIFRJTUVEX09VVCwgaW4gdGhpcyBjYXNlIGNhbGxpbmcgZ2V0QnVmZmVyRm9yU3RyZWFtIGFnYWluIHdpdGggbm9GcmVlQnVmZmVyQXRDb25zdW1lciBzZXQgdG8KKyAgICAgKiB0cnVlIHdpbGwgbm90aWZ5IGJ1ZmZlciBtYW5hZ2VyIHRvIHVwZGF0ZSBpdHMgc3RhdGVzIGFuZCBhbHNvIHRyaWVzIHRvIGFsbG9jYXRlIGEgbmV3IGJ1ZmZlci4KKyAgICAgKgogICAgICAqIFJldHVybiB2YWx1ZXM6CiAgICAgICoKICAgICAgKiAgT0s6ICAgICAgICBHZXR0aW5nIGJ1ZmZlciBmb3IgdGhpcyBzdHJlYW0gd2FzIHN1Y2Nlc3NmdWwuCkBAIC0xMjIsNyArMTI2LDkgQEAKICAgICAgKiAgICAgICAgICAgICB0byB0aGlzIGJ1ZmZlciBtYW5hZ2VyIGJlZm9yZS4KICAgICAgKiAgTk9fTUVNT1JZOiBVbmFibGUgdG8gYWxsb2NhdGUgYSBidWZmZXIgZm9yIHRoaXMgc3RyZWFtIGF0IHRoaXMgdGltZS4KICAgICAgKi8KLSAgICBzdGF0dXNfdCBnZXRCdWZmZXJGb3JTdHJlYW0oaW50IHN0cmVhbUlkLCBpbnQgc3RyZWFtU2V0SWQsIHNwPEdyYXBoaWNCdWZmZXI+KiBnYiwgaW50KiBmZW5jZUZkKTsKKyAgICBzdGF0dXNfdCBnZXRCdWZmZXJGb3JTdHJlYW0oCisgICAgICAgICAgICBpbnQgc3RyZWFtSWQsIGludCBzdHJlYW1TZXRJZCwgc3A8R3JhcGhpY0J1ZmZlcj4qIGdiLCBpbnQqIGZlbmNlRmQsCisgICAgICAgICAgICBib29sIG5vRnJlZUJ1ZmZlckF0Q29uc3VtZXIgPSBmYWxzZSk7CiAKICAgICAvKioKICAgICAgKiBUaGlzIG1ldGhvZCBub3RpZmllcyB0aGUgbWFuYWdlciB0aGF0IGEgYnVmZmVyIGhhcyBiZWVuIHJlbGVhc2VkIGJ5IHRoZSBjb25zdW1lci4KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEZXZpY2UuY3BwCmluZGV4IGM3MWI1NDMuLmRmZTVlYjAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmNwcApAQCAtMjksNiArMjksOSBAQAogI2RlZmluZSBDTE9HRShmbXQsIC4uLikgQUxPR0UoIkNhbWVyYSAlczogJXM6ICIgZm10LCBtSWQuc3RyaW5nKCksIF9fRlVOQ1RJT05fXywgXAogICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXykKIAorI2RlZmluZSBDTE9HVyhmbXQsIC4uLikgQUxPR1coIkNhbWVyYSAlczogJXM6ICIgZm10LCBtSWQuc3RyaW5nKCksIF9fRlVOQ1RJT05fXywgXAorICAgICAgICAgICAgIyNfX1ZBX0FSR1NfXykKKwogLy8gQ29udmVuaWVuY2UgbWFjcm9zIGZvciB0cmFuc2l0aW9uaW5nIHRvIHRoZSBlcnJvciBzdGF0ZQogI2RlZmluZSBTRVRfRVJSKGZtdCwgLi4uKSBzZXRFcnJvclN0YXRlKCAgIFwKICAgICAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18sICAgICAgICAgICAgICBcCkBAIC01Niw2ICs1OSw5IEBACiAjaW5jbHVkZSAiZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaCIKICNpbmNsdWRlICJkZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaCIKICNpbmNsdWRlICJDYW1lcmFTZXJ2aWNlLmgiCisjaW5jbHVkZSAidXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCIKKworI2luY2x1ZGUgPHR1cGxlPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOwpAQCAtNzQsMTUgKzgwLDE2IEBACiAgICAgICAgIG1UaW1lc3RhbXBPZmZzZXQoMCksCiAgICAgICAgIG1OZXh0UmVzdWx0RnJhbWVOdW1iZXIoMCksCiAgICAgICAgIG1OZXh0UmVwcm9jZXNzUmVzdWx0RnJhbWVOdW1iZXIoMCksCisgICAgICAgIG1OZXh0WnNsU3RpbGxSZXN1bHRGcmFtZU51bWJlcigwKSwKICAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXIoMCksCiAgICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyKDApLAorICAgICAgICBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyKDApLAogICAgICAgICBtTGlzdGVuZXIoTlVMTCksCiAgICAgICAgIG1WZW5kb3JUYWdJZChDQU1FUkFfTUVUQURBVEFfSU5WQUxJRF9WRU5ET1JfSUQpLAotICAgICAgICBtTGFzdFRlbXBsYXRlSWQoLTEpCisgICAgICAgIG1MYXN0VGVtcGxhdGVJZCgtMSksCisgICAgICAgIG1OZWVkRml4dXBNb25vY2hyb21lVGFncyhmYWxzZSkKIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwotICAgIGNhbWVyYTNfY2FsbGJhY2tfb3BzOjpub3RpZnkgPSAmc05vdGlmeTsKLSAgICBjYW1lcmEzX2NhbGxiYWNrX29wczo6cHJvY2Vzc19jYXB0dXJlX3Jlc3VsdCA9ICZzUHJvY2Vzc0NhcHR1cmVSZXN1bHQ7CiAgICAgQUxPR1YoIiVzOiBDcmVhdGVkIGRldmljZSBmb3IgY2FtZXJhICVzIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOwogfQogCkBAIC05MCw3ICs5Nyw3IEBACiB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HVigiJXM6IFRlYXJpbmcgZG93biBmb3IgY2FtZXJhIGlkICVzIiwgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOwotICAgIGRpc2Nvbm5lY3QoKTsKKyAgICBkaXNjb25uZWN0SW1wbCgpOwogfQogCiBjb25zdCBTdHJpbmc4JiBDYW1lcmEzRGV2aWNlOjpnZXRJZCgpIGNvbnN0IHsKQEAgLTEyNywxNiArMTM0LDI3IEBACiAgICAgfQogCiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHBoeXNpY2FsQ2FtZXJhSWRzOwotICAgIGJvb2wgaXNMb2dpY2FsID0gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjppc0xvZ2ljYWxDYW1lcmEobURldmljZUluZm8sICZwaHlzaWNhbENhbWVyYUlkcyk7CisgICAgYm9vbCBpc0xvZ2ljYWwgPSBtYW5hZ2VyLT5pc0xvZ2ljYWxDYW1lcmEobUlkLnN0cmluZygpLCAmcGh5c2ljYWxDYW1lcmFJZHMpOwogICAgIGlmIChpc0xvZ2ljYWwpIHsKICAgICAgICAgZm9yIChhdXRvJiBwaHlzaWNhbElkIDogcGh5c2ljYWxDYW1lcmFJZHMpIHsKLSAgICAgICAgICAgIHJlcyA9IG1hbmFnZXItPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhwaHlzaWNhbElkLCAmbVBoeXNpY2FsRGV2aWNlSW5mb01hcFtwaHlzaWNhbElkXSk7CisgICAgICAgICAgICByZXMgPSBtYW5hZ2VyLT5nZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsSWQsICZtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdKTsKICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgICAgICBTRVRfRVJSX0woIkNvdWxkIG5vdCByZXRyaWV2ZSBjYW1lcmEgJXMgY2hhcmFjdGVyaXN0aWNzOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsSWQuY19zdHIoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAgICAgICAgICAgICAgICAgc2Vzc2lvbi0+Y2xvc2UoKTsKICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAoRGlzdG9ydGlvbk1hcHBlcjo6aXNEaXN0b3J0aW9uU3VwcG9ydGVkKG1QaHlzaWNhbERldmljZUluZm9NYXBbcGh5c2ljYWxJZF0pKSB7CisgICAgICAgICAgICAgICAgbURpc3RvcnRpb25NYXBwZXJzW3BoeXNpY2FsSWRdLnNldHVwU3RhdGljSW5mbyhtUGh5c2ljYWxEZXZpY2VJbmZvTWFwW3BoeXNpY2FsSWRdKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIFNFVF9FUlJfTCgiVW5hYmxlIHRvIHJlYWQgY2FtZXJhICVzJ3MgY2FsaWJyYXRpb24gZmllbGRzIGZvciBkaXN0b3J0aW9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29ycmVjdGlvbiIsIHBoeXNpY2FsSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHNlc3Npb24tPmNsb3NlKCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQogCkBAIC0xODEsNyArMTk5LDE0IEBACiAgICAgICAgICAgICB9KTsKICAgICB9CiAKLSAgICBtSW50ZXJmYWNlID0gbmV3IEhhbEludGVyZmFjZShzZXNzaW9uLCBxdWV1ZSk7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGJ1Zk1nck1vZGUgPQorICAgICAgICAgICAgbURldmljZUluZm8uZmluZChBTkRST0lEX0lORk9fU1VQUE9SVEVEX0JVRkZFUl9NQU5BR0VNRU5UX1ZFUlNJT04pOworICAgIGlmIChidWZNZ3JNb2RlLmNvdW50ID4gMCkgeworICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIgPSAoYnVmTWdyTW9kZS5kYXRhLnU4WzBdID09CisgICAgICAgICAgICBBTkRST0lEX0lORk9fU1VQUE9SVEVEX0JVRkZFUl9NQU5BR0VNRU5UX1ZFUlNJT05fSElETF9ERVZJQ0VfM181KTsKKyAgICB9CisKKyAgICBtSW50ZXJmYWNlID0gbmV3IEhhbEludGVyZmFjZShzZXNzaW9uLCBxdWV1ZSwgbVVzZUhhbEJ1Zk1hbmFnZXIpOwogICAgIHN0ZDo6c3RyaW5nIHByb3ZpZGVyVHlwZTsKICAgICBtVmVuZG9yVGFnSWQgPSBtYW5hZ2VyLT5nZXRQcm92aWRlclRhZ0lkTG9ja2VkKG1JZC5zdHJpbmcoKSk7CiAgICAgbVRhZ01vbml0b3IuaW5pdGlhbGl6ZShtVmVuZG9yVGFnSWQpOwpAQCAtMTg5LDYgKzIxNCwyOCBAQAogICAgICAgICBtVGFnTW9uaXRvci5wYXJzZVRhZ3NUb01vbml0b3IoU3RyaW5nOChtb25pdG9yVGFncykpOwogICAgIH0KIAorICAgIC8vIE1ldGFkYXRhIHRhZ3MgbmVlZHMgZml4dXAgZm9yIG1vbm9jaHJvbWUgY2FtZXJhIGRldmljZSB2ZXJzaW9uIGxlc3MKKyAgICAvLyB0aGFuIDMuNS4KKyAgICBoYXJkd2FyZTo6aGlkbF92ZXJzaW9uIG1heFZlcnNpb257MCwwfTsKKyAgICByZXMgPSBtYW5hZ2VyLT5nZXRIaWdoZXN0U3VwcG9ydGVkVmVyc2lvbihtSWQuc3RyaW5nKCksICZtYXhWZXJzaW9uKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIEFMT0dFKCIlczogRXJyb3IgaW4gZ2V0dGluZyBjYW1lcmEgZGV2aWNlIHZlcnNpb24gaWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJldHVybiByZXM7CisgICAgfQorICAgIGludCBkZXZpY2VWZXJzaW9uID0gSEFSRFdBUkVfREVWSUNFX0FQSV9WRVJTSU9OKAorICAgICAgICAgICAgbWF4VmVyc2lvbi5nZXRfbWFqb3IoKSwgbWF4VmVyc2lvbi5nZXRfbWlub3IoKSk7CisKKyAgICBib29sIGlzTW9ub2Nocm9tZSA9IGZhbHNlOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeV90IGVudHJ5ID0gbURldmljZUluZm8uZmluZChBTkRST0lEX1JFUVVFU1RfQVZBSUxBQkxFX0NBUEFCSUxJVElFUyk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlbnRyeS5jb3VudDsgaSsrKSB7CisgICAgICAgIHVpbnQ4X3QgY2FwYWJpbGl0eSA9IGVudHJ5LmRhdGEudThbaV07CisgICAgICAgIGlmIChjYXBhYmlsaXR5ID09IEFORFJPSURfUkVRVUVTVF9BVkFJTEFCTEVfQ0FQQUJJTElUSUVTX01PTk9DSFJPTUUpIHsKKyAgICAgICAgICAgIGlzTW9ub2Nocm9tZSA9IHRydWU7CisgICAgICAgIH0KKyAgICB9CisgICAgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzID0gKGlzTW9ub2Nocm9tZSAmJiBkZXZpY2VWZXJzaW9uIDwgQ0FNRVJBX0RFVklDRV9BUElfVkVSU0lPTl8zXzUpOworCiAgICAgcmV0dXJuIGluaXRpYWxpemVDb21tb25Mb2NrZWQoKTsKIH0KIApAQCAtMjA4LDYgKzI1NSwxNyBAQAogICAgIC8qKiBSZWdpc3RlciBpbi1mbGlnaHQgbWFwIHRvIHRoZSBzdGF0dXMgdHJhY2tlciAqLwogICAgIG1JbkZsaWdodFN0YXR1c0lkID0gbVN0YXR1c1RyYWNrZXItPmFkZENvbXBvbmVudCgpOwogCisgICAgaWYgKG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIHJlcyA9IG1SZXF1ZXN0QnVmZmVyU00uaW5pdGlhbGl6ZShtU3RhdHVzVHJhY2tlcik7CisgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgIFNFVF9FUlJfTCgiVW5hYmxlIHRvIHN0YXJ0IHJlcXVlc3QgYnVmZmVyIHN0YXRlIG1hY2hpbmU6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIG1JbnRlcmZhY2UtPmNsb3NlKCk7CisgICAgICAgICAgICBtU3RhdHVzVHJhY2tlci5jbGVhcigpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKwogICAgIC8qKiBDcmVhdGUgYnVmZmVyIG1hbmFnZXIgKi8KICAgICBtQnVmZmVyTWFuYWdlciA9IG5ldyBDYW1lcmEzQnVmZmVyTWFuYWdlcigpOwogCkBAIC0yMTcsOCArMjc1LDEwIEBACiAgICAgaWYgKHNlc3Npb25LZXlzRW50cnkuY291bnQgPiAwKSB7CiAgICAgICAgIHNlc3Npb25QYXJhbUtleXMuaW5zZXJ0QXJyYXlBdChzZXNzaW9uS2V5c0VudHJ5LmRhdGEuaTMyLCAwLCBzZXNzaW9uS2V5c0VudHJ5LmNvdW50KTsKICAgICB9CisKICAgICAvKiogU3RhcnQgdXAgcmVxdWVzdCBxdWV1ZSB0aHJlYWQgKi8KLSAgICBtUmVxdWVzdFRocmVhZCA9IG5ldyBSZXF1ZXN0VGhyZWFkKHRoaXMsIG1TdGF0dXNUcmFja2VyLCBtSW50ZXJmYWNlLCBzZXNzaW9uUGFyYW1LZXlzKTsKKyAgICBtUmVxdWVzdFRocmVhZCA9IG5ldyBSZXF1ZXN0VGhyZWFkKAorICAgICAgICAgICAgdGhpcywgbVN0YXR1c1RyYWNrZXIsIG1JbnRlcmZhY2UsIHNlc3Npb25QYXJhbUtleXMsIG1Vc2VIYWxCdWZNYW5hZ2VyKTsKICAgICByZXMgPSBtUmVxdWVzdFRocmVhZC0+cnVuKFN0cmluZzg6OmZvcm1hdCgiQzNEZXYtJXMtUmVxUXVldWUiLCBtSWQuc3RyaW5nKCkpLnN0cmluZygpKTsKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIFNFVF9FUlJfTCgiVW5hYmxlIHRvIHN0YXJ0IHJlcXVlc3QgcXVldWUgdGhyZWFkOiAlcyAoJWQpIiwKQEAgLTI2NCwxMTEgKzMyNCwxMTggQEAKICAgICB9CiAKICAgICBpZiAoRGlzdG9ydGlvbk1hcHBlcjo6aXNEaXN0b3J0aW9uU3VwcG9ydGVkKG1EZXZpY2VJbmZvKSkgewotICAgICAgICByZXMgPSBtRGlzdG9ydGlvbk1hcHBlci5zZXR1cFN0YXRpY0luZm8obURldmljZUluZm8pOworICAgICAgICByZXMgPSBtRGlzdG9ydGlvbk1hcHBlcnNbbUlkLmNfc3RyKCldLnNldHVwU3RhdGljSW5mbyhtRGV2aWNlSW5mbyk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIFNFVF9FUlJfTCgiVW5hYmxlIHRvIHJlYWQgbmVjZXNzYXJ5IGNhbGlicmF0aW9uIGZpZWxkcyBmb3IgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIik7CiAgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfQotCiAgICAgcmV0dXJuIE9LOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpkaXNjb25uZWN0KCkgewotICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKKyAgICByZXR1cm4gZGlzY29ubmVjdEltcGwoKTsKK30KIAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6ZGlzY29ubmVjdEltcGwoKSB7CisgICAgQVRSQUNFX0NBTEwoKTsKICAgICBBTE9HSSgiJXM6IEUiLCBfX0ZVTkNUSU9OX18pOwogCiAgICAgc3RhdHVzX3QgcmVzID0gT0s7CiAgICAgc3RkOjp2ZWN0b3I8d3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4+IHN0cmVhbXM7Ci0gICAgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uID0gZ2V0RXhwZWN0ZWRJbkZsaWdodER1cmF0aW9uKCk7CiAgICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7Ci0gICAgICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19VTklOSVRJQUxJWkVEKSByZXR1cm4gcmVzOworICAgICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOworICAgICAgICBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24gPSBnZXRFeHBlY3RlZEluRmxpZ2h0RHVyYXRpb24oKTsKKyAgICAgICAgeworICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICAgICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX1VOSU5JVElBTElaRUQpIHJldHVybiByZXM7CiAKLSAgICAgICAgaWYgKG1TdGF0dXMgPT0gU1RBVFVTX0FDVElWRSB8fAotICAgICAgICAgICAgICAgIChtU3RhdHVzID09IFNUQVRVU19FUlJPUiAmJiBtUmVxdWVzdFRocmVhZCAhPSBOVUxMKSkgewotICAgICAgICAgICAgcmVzID0gbVJlcXVlc3RUaHJlYWQtPmNsZWFyUmVwZWF0aW5nUmVxdWVzdHMoKTsKLSAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBTRVRfRVJSX0woIkNhbid0IHN0b3Agc3RyZWFtaW5nIik7Ci0gICAgICAgICAgICAgICAgLy8gQ29udGludWUgdG8gY2xvc2UgZGV2aWNlIGV2ZW4gaW4gY2FzZSBvZiBlcnJvcgotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICByZXMgPSB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soLyphY3RpdmUqLyBmYWxzZSwgbWF4RXhwZWN0ZWREdXJhdGlvbik7CisgICAgICAgICAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfQUNUSVZFIHx8CisgICAgICAgICAgICAgICAgICAgIChtU3RhdHVzID09IFNUQVRVU19FUlJPUiAmJiBtUmVxdWVzdFRocmVhZCAhPSBOVUxMKSkgeworICAgICAgICAgICAgICAgIHJlcyA9IG1SZXF1ZXN0VGhyZWFkLT5jbGVhclJlcGVhdGluZ1JlcXVlc3RzKCk7CiAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgICAgICAgICBTRVRfRVJSX0woIlRpbWVvdXQgd2FpdGluZyBmb3IgSEFMIHRvIGRyYWluICglICIgUFJJaTY0ICIgbnMpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhFeHBlY3RlZER1cmF0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgU0VUX0VSUl9MKCJDYW4ndCBzdG9wIHN0cmVhbWluZyIpOwogICAgICAgICAgICAgICAgICAgICAvLyBDb250aW51ZSB0byBjbG9zZSBkZXZpY2UgZXZlbiBpbiBjYXNlIG9mIGVycm9yCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcmVzID0gd2FpdFVudGlsU3RhdGVUaGVuUmVsb2NrKC8qYWN0aXZlKi8gZmFsc2UsIG1heEV4cGVjdGVkRHVyYXRpb24pOworICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTRVRfRVJSX0woIlRpbWVvdXQgd2FpdGluZyBmb3IgSEFMIHRvIGRyYWluICglICIgUFJJaTY0ICIgbnMpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBDb250aW51ZSB0byBjbG9zZSBkZXZpY2UgZXZlbiBpbiBjYXNlIG9mIGVycm9yCisgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KIAotICAgICAgICBpZiAobVN0YXR1cyA9PSBTVEFUVVNfRVJST1IpIHsKLSAgICAgICAgICAgIENMT0dFKCJTaHV0dGluZyBkb3duIGluIGFuIGVycm9yIHN0YXRlIik7Ci0gICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19FUlJPUikgeworICAgICAgICAgICAgICAgIENMT0dFKCJTaHV0dGluZyBkb3duIGluIGFuIGVycm9yIHN0YXRlIik7CisgICAgICAgICAgICB9CiAKLSAgICAgICAgaWYgKG1TdGF0dXNUcmFja2VyICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1TdGF0dXNUcmFja2VyLT5yZXF1ZXN0RXhpdCgpOwotICAgICAgICB9CisgICAgICAgICAgICBpZiAobVN0YXR1c1RyYWNrZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1TdGF0dXNUcmFja2VyLT5yZXF1ZXN0RXhpdCgpOworICAgICAgICAgICAgfQogCi0gICAgICAgIGlmIChtUmVxdWVzdFRocmVhZCAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBtUmVxdWVzdFRocmVhZC0+cmVxdWVzdEV4aXQoKTsKLSAgICAgICAgfQorICAgICAgICAgICAgaWYgKG1SZXF1ZXN0VGhyZWFkICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBtUmVxdWVzdFRocmVhZC0+cmVxdWVzdEV4aXQoKTsKKyAgICAgICAgICAgIH0KIAotICAgICAgICBzdHJlYW1zLnJlc2VydmUobU91dHB1dFN0cmVhbXMuc2l6ZSgpICsgKG1JbnB1dFN0cmVhbSAhPSBudWxscHRyID8gMSA6IDApKTsKLSAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2sobU91dHB1dFN0cmVhbXNbaV0pOwotICAgICAgICB9Ci0gICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbHB0cikgewotICAgICAgICAgICAgc3RyZWFtcy5wdXNoX2JhY2sobUlucHV0U3RyZWFtKTsKKyAgICAgICAgICAgIHN0cmVhbXMucmVzZXJ2ZShtT3V0cHV0U3RyZWFtcy5zaXplKCkgKyAobUlucHV0U3RyZWFtICE9IG51bGxwdHIgPyAxIDogMCkpOworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgIHN0cmVhbXMucHVzaF9iYWNrKG1PdXRwdXRTdHJlYW1zW2ldKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChtSW5wdXRTdHJlYW0gIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIHN0cmVhbXMucHVzaF9iYWNrKG1JbnB1dFN0cmVhbSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9Ci0KLSAgICAvLyBKb2luaW5nIGRvbmUgd2l0aG91dCBob2xkaW5nIG1Mb2NrLCBvdGhlcndpc2UgZGVhZGxvY2tzIG1heSBlbnN1ZQotICAgIC8vIGFzIHRoZSB0aHJlYWRzIHRyeSB0byBhY2Nlc3MgcGFyZW50IHN0YXRlCisgICAgLy8gSm9pbmluZyBkb25lIHdpdGhvdXQgaG9sZGluZyBtTG9jayBhbmQgbUludGVyZmFjZUxvY2ssIG90aGVyd2lzZSBkZWFkbG9ja3MgbWF5IGVuc3VlCisgICAgLy8gYXMgdGhlIHRocmVhZHMgdHJ5IHRvIGFjY2VzcyBwYXJlbnQgc3RhdGUgKGIvMTQzNTEzNTE4KQogICAgIGlmIChtUmVxdWVzdFRocmVhZCAhPSBOVUxMICYmIG1TdGF0dXMgIT0gU1RBVFVTX0VSUk9SKSB7CiAgICAgICAgIC8vIEhBTCBtYXkgYmUgaW4gYSBiYWQgc3RhdGUsIHNvIHdhaXRpbmcgZm9yIHJlcXVlc3QgdGhyZWFkCiAgICAgICAgIC8vICh3aGljaCBtYXkgYmUgc3R1Y2sgaW4gdGhlIEhBTCBwcm9jZXNzQ2FwdHVyZVJlcXVlc3QgY2FsbCkKICAgICAgICAgLy8gY291bGQgYmUgZGFuZ2Vyb3VzLgorICAgICAgICAvLyBnaXZlIHVwIG1JbnRlcmZhY2VMb2NrIGhlcmUgYW5kIHRoZW4gbG9jayBpdCBhZ2Fpbi4gQ291bGQgdGhpcyBsZWFkCisgICAgICAgIC8vIHRvIG90aGVyIGRlYWRsb2NrcwogICAgICAgICBtUmVxdWVzdFRocmVhZC0+am9pbigpOwogICAgIH0KLQotICAgIGlmIChtU3RhdHVzVHJhY2tlciAhPSBOVUxMKSB7Ci0gICAgICAgIG1TdGF0dXNUcmFja2VyLT5qb2luKCk7Ci0gICAgfQotCi0gICAgSGFsSW50ZXJmYWNlKiBpbnRlcmZhY2U7CiAgICAgewotICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7Ci0gICAgICAgIG1SZXF1ZXN0VGhyZWFkLmNsZWFyKCk7Ci0gICAgICAgIG1TdGF0dXNUcmFja2VyLmNsZWFyKCk7Ci0gICAgICAgIGludGVyZmFjZSA9IG1JbnRlcmZhY2UuZ2V0KCk7Ci0gICAgfQorICAgICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOworICAgICAgICBpZiAobVN0YXR1c1RyYWNrZXIgIT0gTlVMTCkgeworICAgICAgICAgICAgbVN0YXR1c1RyYWNrZXItPmpvaW4oKTsKKyAgICAgICAgfQogCi0gICAgLy8gQ2FsbCBjbG9zZSB3aXRob3V0IGludGVybmFsIG11dGV4IGhlbGQsIGFzIHRoZSBIQUwgY2xvc2UgbWF5IG5lZWQgdG8KLSAgICAvLyB3YWl0IG9uIGFzc29ydGVkIGNhbGxiYWNrcyxldGMsIHRvIGNvbXBsZXRlIGJlZm9yZSBpdCBjYW4gcmV0dXJuLgotICAgIGludGVyZmFjZS0+Y2xvc2UoKTsKKyAgICAgICAgSGFsSW50ZXJmYWNlKiBpbnRlcmZhY2U7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgICAgIG1SZXF1ZXN0VGhyZWFkLmNsZWFyKCk7CisgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgc3RMb2NrKG1UcmFja2VyTG9jayk7CisgICAgICAgICAgICBtU3RhdHVzVHJhY2tlci5jbGVhcigpOworICAgICAgICAgICAgaW50ZXJmYWNlID0gbUludGVyZmFjZS5nZXQoKTsKKyAgICAgICAgfQogCi0gICAgZmx1c2hJbmZsaWdodFJlcXVlc3RzKCk7CisgICAgICAgIC8vIENhbGwgY2xvc2Ugd2l0aG91dCBpbnRlcm5hbCBtdXRleCBoZWxkLCBhcyB0aGUgSEFMIGNsb3NlIG1heSBuZWVkIHRvCisgICAgICAgIC8vIHdhaXQgb24gYXNzb3J0ZWQgY2FsbGJhY2tzLGV0YywgdG8gY29tcGxldGUgYmVmb3JlIGl0IGNhbiByZXR1cm4uCisgICAgICAgIGludGVyZmFjZS0+Y2xvc2UoKTsKIAotICAgIHsKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwotICAgICAgICBtSW50ZXJmYWNlLT5jbGVhcigpOwotICAgICAgICBtT3V0cHV0U3RyZWFtcy5jbGVhcigpOwotICAgICAgICBtSW5wdXRTdHJlYW0uY2xlYXIoKTsKLSAgICAgICAgbURlbGV0ZWRTdHJlYW1zLmNsZWFyKCk7Ci0gICAgICAgIG1CdWZmZXJNYW5hZ2VyLmNsZWFyKCk7Ci0gICAgICAgIGludGVybmFsVXBkYXRlU3RhdHVzTG9ja2VkKFNUQVRVU19VTklOSVRJQUxJWkVEKTsKLSAgICB9CisgICAgICAgIGZsdXNoSW5mbGlnaHRSZXF1ZXN0cygpOwogCi0gICAgZm9yIChhdXRvJiB3ZWFrU3RyZWFtIDogc3RyZWFtcykgewotICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSB3ZWFrU3RyZWFtLnByb21vdGUoKTsKLSAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZCBsZWFrZWQhIHN0cm9uZyByZWZlcmVuY2UgKCVkKSEiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbS0+Z2V0SWQoKSwgc3RyZWFtLT5nZXRTdHJvbmdDb3VudCgpIC0gMSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgICAgIG1JbnRlcmZhY2UtPmNsZWFyKCk7CisgICAgICAgICAgICBtT3V0cHV0U3RyZWFtcy5jbGVhcigpOworICAgICAgICAgICAgbUlucHV0U3RyZWFtLmNsZWFyKCk7CisgICAgICAgICAgICBtRGVsZXRlZFN0cmVhbXMuY2xlYXIoKTsKKyAgICAgICAgICAgIG1CdWZmZXJNYW5hZ2VyLmNsZWFyKCk7CisgICAgICAgICAgICBpbnRlcm5hbFVwZGF0ZVN0YXR1c0xvY2tlZChTVEFUVVNfVU5JTklUSUFMSVpFRCk7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGF1dG8mIHdlYWtTdHJlYW0gOiBzdHJlYW1zKSB7CisgICAgICAgICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IHdlYWtTdHJlYW0ucHJvbW90ZSgpOworICAgICAgICAgICAgaWYgKHN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQgbGVha2VkISBzdHJvbmcgcmVmZXJlbmNlICglZCkhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtLT5nZXRJZCgpLCBzdHJlYW0tPmdldFN0cm9uZ0NvdW50KCkgLSAxKTsKKyAgICAgICAgICAgIH0KICAgICAgICAgfQogICAgIH0KLQogICAgIEFMT0dJKCIlczogWCIsIF9fRlVOQ1RJT05fXyk7CiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTgzOSwxNCArOTA2LDE0IEBACiAgICAgcmV0dXJuIE9LOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBpbnQ2NF90KiAvKmxhc3RGcmFtZU51bWJlciovKSB7CitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjYXB0dXJlKENhbWVyYU1ldGFkYXRhICZyZXF1ZXN0LCBpbnQ2NF90KiBsYXN0RnJhbWVOdW1iZXIpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogCiAgICAgTGlzdDxjb25zdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdD4gcmVxdWVzdHNMaXN0OwogICAgIHN0ZDo6bGlzdDxjb25zdCBTdXJmYWNlTWFwPiBzdXJmYWNlTWFwczsKICAgICBjb252ZXJ0VG9SZXF1ZXN0TGlzdChyZXF1ZXN0c0xpc3QsIHN1cmZhY2VNYXBzLCByZXF1ZXN0KTsKIAotICAgIHJldHVybiBjYXB0dXJlTGlzdChyZXF1ZXN0c0xpc3QsIHN1cmZhY2VNYXBzLCAvKmxhc3RGcmFtZU51bWJlciovTlVMTCk7CisgICAgcmV0dXJuIGNhcHR1cmVMaXN0KHJlcXVlc3RzTGlzdCwgc3VyZmFjZU1hcHMsIGxhc3RGcmFtZU51bWJlcik7CiB9CiAKIHZvaWQgQ2FtZXJhM0RldmljZTo6Y29udmVydFRvUmVxdWVzdExpc3QoTGlzdDxjb25zdCBQaHlzaWNhbENhbWVyYVNldHRpbmdzTGlzdD4mIHJlcXVlc3RzTGlzdCwKQEAgLTkxMyw2ICs5ODAsMjM2IEBACiAgICAgcmV0dXJuIHJlczsKIH0KIAoraGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzRGV2aWNlOjpyZXF1ZXN0U3RyZWFtQnVmZmVycygKKyAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6QnVmZmVyUmVxdWVzdD4mIGJ1ZlJlcXMsCisgICAgICAgIHJlcXVlc3RTdHJlYW1CdWZmZXJzX2NiIF9oaWRsX2NiKSB7CisgICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpCdWZmZXJSZXF1ZXN0U3RhdHVzOworICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6U3RyZWFtQnVmZmVyUmV0OworICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6U3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOworCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlcXVlc3RCdWZmZXJJbnRlcmZhY2VMb2NrKTsKKworICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxTdHJlYW1CdWZmZXJSZXQ+IGJ1ZlJldHM7CisgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlcyBkb2VzIG5vdCBzdXBwb3J0IEhBTCBidWZmZXIgbWFuYWdlbWVudCIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQuc3RyaW5nKCkpOworICAgICAgICBfaGlkbF9jYihCdWZmZXJSZXF1ZXN0U3RhdHVzOjpGQUlMRURfSUxMRUdBTF9BUkdVTUVOVFMsIGJ1ZlJldHMpOworICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICB9CisKKyAgICBTb3J0ZWRWZWN0b3I8aW50MzJfdD4gc3RyZWFtSWRzOworICAgIHNzaXplX3Qgc3ogPSBzdHJlYW1JZHMuc2V0Q2FwYWNpdHkoYnVmUmVxcy5zaXplKCkpOworICAgIGlmIChzeiA8IDAgfHwgc3RhdGljX2Nhc3Q8c2l6ZV90PihzeikgIT0gYnVmUmVxcy5zaXplKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBmYWlsZWQgdG8gYWxsb2NhdGUgbWVtb3J5IGZvciAlenUgYnVmZmVyIHJlcXVlc3RzIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGJ1ZlJlcXMuc2l6ZSgpKTsKKyAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTLCBidWZSZXRzKTsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgfQorCisgICAgaWYgKGJ1ZlJlcXMuc2l6ZSgpID4gbU91dHB1dFN0cmVhbXMuc2l6ZSgpKSB7CisgICAgICAgIEFMT0dFKCIlczogdG9vIG1hbnkgYnVmZmVyIHJlcXVlc3RzICglenUgPiAjIG9mIG91dHB1dCBzdHJlYW1zICV6dSkiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmUmVxcy5zaXplKCksIG1PdXRwdXRTdHJlYW1zLnNpemUoKSk7CisgICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUywgYnVmUmV0cyk7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOworICAgIH0KKworICAgIC8vIENoZWNrIGZvciByZXBlYXRlZCBzdHJlYW1JZAorICAgIGZvciAoY29uc3QgYXV0byYgYnVmUmVxIDogYnVmUmVxcykgeworICAgICAgICBpZiAoc3RyZWFtSWRzLmluZGV4T2YoYnVmUmVxLnN0cmVhbUlkKSAhPSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQgYXBwZWFyIG11bHRpcGxlIHRpbWVzIGluIGJ1ZmZlciByZXF1ZXN0cyIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmUmVxLnN0cmVhbUlkKTsKKyAgICAgICAgICAgIF9oaWRsX2NiKEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9JTExFR0FMX0FSR1VNRU5UUywgYnVmUmV0cyk7CisgICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgfQorICAgICAgICBzdHJlYW1JZHMuYWRkKGJ1ZlJlcS5zdHJlYW1JZCk7CisgICAgfQorCisgICAgaWYgKCFtUmVxdWVzdEJ1ZmZlclNNLnN0YXJ0UmVxdWVzdEJ1ZmZlcigpKSB7CisgICAgICAgIEFMT0dFKCIlczogcmVxdWVzdCBidWZmZXIgZGlzYWxsb3dlZCB3aGlsZSBjYW1lcmEgc2VydmljZSBpcyBjb25maWd1cmluZyIsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0NPTkZJR1VSSU5HLCBidWZSZXRzKTsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgfQorCisgICAgYnVmUmV0cy5yZXNpemUoYnVmUmVxcy5zaXplKCkpOworCisgICAgYm9vbCBhbGxSZXFzU3VjY2VlZHMgPSB0cnVlOworICAgIGJvb2wgb25lUmVxU3VjY2VlZHMgPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZlJlcXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgY29uc3QgYXV0byYgYnVmUmVxID0gYnVmUmVxc1tpXTsKKyAgICAgICAgYXV0byYgYnVmUmV0ID0gYnVmUmV0c1tpXTsKKyAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IGJ1ZlJlcS5zdHJlYW1JZDsKKyAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICAgICAgaWYgKG91dHB1dFN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE91dHB1dCBzdHJlYW0gaWQgJWQgbm90IGZvdW5kISIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfdmVjPFN0cmVhbUJ1ZmZlclJldD4gZW1wdHlCdWZSZXRzOworICAgICAgICAgICAgX2hpZGxfY2IoQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX0lMTEVHQUxfQVJHVU1FTlRTLCBlbXB0eUJ1ZlJldHMpOworICAgICAgICAgICAgbVJlcXVlc3RCdWZmZXJTTS5lbmRSZXF1ZXN0QnVmZmVyKCk7CisgICAgICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPmlzQWJhbmRvbmVkKCkpIHsKKyAgICAgICAgICAgIGJ1ZlJldC52YWwuZXJyb3IoU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpTVFJFQU1fRElTQ09OTkVDVEVEKTsKKyAgICAgICAgICAgIGFsbFJlcXNTdWNjZWVkcyA9IGZhbHNlOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBidWZSZXQuc3RyZWFtSWQgPSBzdHJlYW1JZDsKKyAgICAgICAgc2l6ZV90IGhhbmRPdXRCdWZmZXJDb3VudCA9IG91dHB1dFN0cmVhbS0+Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKTsKKyAgICAgICAgdWludDMyX3QgbnVtQnVmZmVyc1JlcXVlc3RlZCA9IGJ1ZlJlcS5udW1CdWZmZXJzUmVxdWVzdGVkOworICAgICAgICBzaXplX3QgdG90YWxIYW5kb3V0ID0gaGFuZE91dEJ1ZmZlckNvdW50ICsgbnVtQnVmZmVyc1JlcXVlc3RlZDsKKyAgICAgICAgdWludDMyX3QgbWF4QnVmZmVycyA9IG91dHB1dFN0cmVhbS0+YXNIYWxTdHJlYW0oKS0+bWF4X2J1ZmZlcnM7CisgICAgICAgIGlmICh0b3RhbEhhbmRvdXQgPiBtYXhCdWZmZXJzKSB7CisgICAgICAgICAgICAvLyBOb3QgYWJsZSB0byBhbGxvY2F0ZSBlbm91Z2ggYnVmZmVyLiBFeGl0IGVhcmx5IGZvciB0aGlzIHN0cmVhbQorICAgICAgICAgICAgQUxPR0UoIiVzOiByZXF1ZXN0IHRvbyBtdWNoIGJ1ZmZlcnMgZm9yIHN0cmVhbSAlZDogYXQgSEFMOiAlenUgKyByZXF1ZXN0aW5nOiAlZCIKKyAgICAgICAgICAgICAgICAgICAgIiA+IG1heDogJWQiLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBoYW5kT3V0QnVmZmVyQ291bnQsCisgICAgICAgICAgICAgICAgICAgIG51bUJ1ZmZlcnNSZXF1ZXN0ZWQsIG1heEJ1ZmZlcnMpOworICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6Ok1BWF9CVUZGRVJfRVhDRUVERUQpOworICAgICAgICAgICAgYWxsUmVxc1N1Y2NlZWRzID0gZmFsc2U7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxTdHJlYW1CdWZmZXI+IHRtcFJldEJ1ZmZlcnMobnVtQnVmZmVyc1JlcXVlc3RlZCk7CisgICAgICAgIGJvb2wgY3VycmVudFJlcVN1Y2NlZWRzID0gdHJ1ZTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhM19zdHJlYW1fYnVmZmVyX3Q+IHN0cmVhbUJ1ZmZlcnMobnVtQnVmZmVyc1JlcXVlc3RlZCk7CisgICAgICAgIHNpemVfdCBudW1BbGxvY2F0ZWRCdWZmZXJzID0gMDsKKyAgICAgICAgc2l6ZV90IG51bVB1c2hlZEluZmxpZ2h0QnVmZmVycyA9IDA7CisgICAgICAgIGZvciAoc2l6ZV90IGIgPSAwOyBiIDwgbnVtQnVmZmVyc1JlcXVlc3RlZDsgYisrKSB7CisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCYgc2IgPSBzdHJlYW1CdWZmZXJzW2JdOworICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBtZXRob2QgY2FuIHJ1biBjb25jdXJyZW50bHkgd2l0aCByZXF1ZXN0IHRocmVhZAorICAgICAgICAgICAgLy8gV2UgbmVlZCB0byB1cGRhdGUgdGhlIHdhaXQgZHVyYXRpb24gZXZlcnl0aW1lIHdlIGNhbGwgZ2V0YnVmZmVyCisgICAgICAgICAgICBuc2Vjc190IHdhaXREdXJhdGlvbiA9IGtCYXNlR2V0QnVmZmVyV2FpdCArIGdldEV4cGVjdGVkSW5GbGlnaHREdXJhdGlvbigpOworICAgICAgICAgICAgc3RhdHVzX3QgcmVzID0gb3V0cHV0U3RyZWFtLT5nZXRCdWZmZXIoJnNiLCB3YWl0RHVyYXRpb24pOworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gTk9fSU5JVCB8fCByZXMgPT0gREVBRF9PQkpFQ1QpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciBmb3Igc3RyZWFtICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6OlNUUkVBTV9ESVNDT05ORUNURUQpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FuJ3QgZ2V0IG91dHB1dCBidWZmZXIgZm9yIHN0cmVhbSAlZDogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gVElNRURfT1VUIHx8IHJlcyA9PSBOT19NRU1PUlkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlJldC52YWwuZXJyb3IoU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpOT19CVUZGRVJfQVZBSUxBQkxFKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZlJldC52YWwuZXJyb3IoU3RyZWFtQnVmZmVyUmVxdWVzdEVycm9yOjpVTktOT1dOX0VSUk9SKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBjdXJyZW50UmVxU3VjY2VlZHMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG51bUFsbG9jYXRlZEJ1ZmZlcnMrKzsKKworICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIgPSBzYi5idWZmZXI7CisgICAgICAgICAgICBhdXRvIHBhaXIgPSBtSW50ZXJmYWNlLT5nZXRCdWZmZXJJZCgqYnVmZmVyLCBzdHJlYW1JZCk7CisgICAgICAgICAgICBib29sIGlzTmV3QnVmZmVyID0gcGFpci5maXJzdDsKKyAgICAgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcklkID0gcGFpci5zZWNvbmQ7CisgICAgICAgICAgICBTdHJlYW1CdWZmZXImIGhCdWYgPSB0bXBSZXRCdWZmZXJzW2JdOworCisgICAgICAgICAgICBoQnVmLnN0cmVhbUlkID0gc3RyZWFtSWQ7CisgICAgICAgICAgICBoQnVmLmJ1ZmZlcklkID0gYnVmZmVySWQ7CisgICAgICAgICAgICBoQnVmLmJ1ZmZlciA9IChpc05ld0J1ZmZlcikgPyAqYnVmZmVyIDogbnVsbHB0cjsKKyAgICAgICAgICAgIGhCdWYuc3RhdHVzID0gQnVmZmVyU3RhdHVzOjpPSzsKKyAgICAgICAgICAgIGhCdWYucmVsZWFzZUZlbmNlID0gbnVsbHB0cjsKKworICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICphY3F1aXJlRmVuY2UgPSBudWxscHRyOworICAgICAgICAgICAgaWYgKHNiLmFjcXVpcmVfZmVuY2UgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICBhY3F1aXJlRmVuY2UgPSBuYXRpdmVfaGFuZGxlX2NyZWF0ZSgxLDApOworICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZS0+ZGF0YVswXSA9IHNiLmFjcXVpcmVfZmVuY2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoQnVmLmFjcXVpcmVGZW5jZS5zZXRUbyhhY3F1aXJlRmVuY2UsIC8qc2hvdWxkT3duKi90cnVlKTsKKyAgICAgICAgICAgIGhCdWYucmVsZWFzZUZlbmNlID0gbnVsbHB0cjsKKworICAgICAgICAgICAgcmVzID0gbUludGVyZmFjZS0+cHVzaEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcihidWZmZXJJZCwgYnVmZmVyLCBzdHJlYW1JZCk7CisgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBDYW4ndCBnZXQgcmVnaXN0ZXIgcmVxdWVzdCBidWZmZXJzIGZvciBzdHJlYW0gJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlYW1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgYnVmUmV0LnZhbC5lcnJvcihTdHJlYW1CdWZmZXJSZXF1ZXN0RXJyb3I6OlVOS05PV05fRVJST1IpOworICAgICAgICAgICAgICAgIGN1cnJlbnRSZXFTdWNjZWVkcyA9IGZhbHNlOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbnVtUHVzaGVkSW5mbGlnaHRCdWZmZXJzKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGN1cnJlbnRSZXFTdWNjZWVkcykgeworICAgICAgICAgICAgYnVmUmV0LnZhbC5idWZmZXJzKHN0ZDo6bW92ZSh0bXBSZXRCdWZmZXJzKSk7CisgICAgICAgICAgICBvbmVSZXFTdWNjZWVkcyA9IHRydWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBhbGxSZXFzU3VjY2VlZHMgPSBmYWxzZTsKKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGIgPSAwOyBiIDwgbnVtUHVzaGVkSW5mbGlnaHRCdWZmZXJzOyBiKyspIHsKKyAgICAgICAgICAgICAgICBTdHJlYW1CdWZmZXImIGhCdWYgPSB0bXBSZXRCdWZmZXJzW2JdOworICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogYnVmZmVyOworICAgICAgICAgICAgICAgIHN0YXR1c190IHJlcyA9IG1JbnRlcmZhY2UtPnBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcihoQnVmLmJ1ZmZlcklkLCAmYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIFNFVF9FUlIoIiVzOiBwb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIgZmFpbGVkIGZvciBzdHJlYW0gJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGZvciAoc2l6ZV90IGIgPSAwOyBiIDwgbnVtQWxsb2NhdGVkQnVmZmVyczsgYisrKSB7CisgICAgICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fYnVmZmVyX3QmIHNiID0gc3RyZWFtQnVmZmVyc1tiXTsKKyAgICAgICAgICAgICAgICBzYi5hY3F1aXJlX2ZlbmNlID0gLTE7CisgICAgICAgICAgICAgICAgc2Iuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycyhzdHJlYW1CdWZmZXJzLmRhdGEoKSwgbnVtQWxsb2NhdGVkQnVmZmVycywgMCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfaGlkbF9jYihhbGxSZXFzU3VjY2VlZHMgPyBCdWZmZXJSZXF1ZXN0U3RhdHVzOjpPSyA6CisgICAgICAgICAgICBvbmVSZXFTdWNjZWVkcyA/IEJ1ZmZlclJlcXVlc3RTdGF0dXM6OkZBSUxFRF9QQVJUSUFMIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVmZmVyUmVxdWVzdFN0YXR1czo6RkFJTEVEX1VOS05PV04sCisgICAgICAgICAgICBidWZSZXRzKTsKKyAgICBtUmVxdWVzdEJ1ZmZlclNNLmVuZFJlcXVlc3RCdWZmZXIoKTsKKyAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKK30KKworaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzRGV2aWNlOjpyZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpTdHJlYW1CdWZmZXI+JiBidWZmZXJzKSB7CisgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICBBTE9HRSgiJXM6IENhbWVyYSAlcyBkb2VzIG5vdCBzdXBwb3J0IEhBTCBidWZmZXIgbWFuYWdlcm1lbnQiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLnN0cmluZygpKTsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgfQorCisgICAgZm9yIChjb25zdCBhdXRvJiBidWYgOiBidWZmZXJzKSB7CisgICAgICAgIGlmIChidWYuYnVmZmVySWQgPT0gSGFsSW50ZXJmYWNlOjpCVUZGRVJfSURfTk9fQlVGRkVSKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCByZXR1cm4gYSBidWZmZXIgd2l0aG91dCBidWZmZXJJZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCogYnVmZmVyOworICAgICAgICBzdGF0dXNfdCByZXMgPSBtSW50ZXJmYWNlLT5wb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIoYnVmLmJ1ZmZlcklkLCAmYnVmZmVyKTsKKworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBmaW5kIGluLWZsaWdodCBidWZmZXIgJSIgUFJJdTY0ICIgZm9yIHN0cmVhbSAlZCIsCisgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmLmJ1ZmZlcklkLCBidWYuc3RyZWFtSWQpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCBzdHJlYW1CdWZmZXI7CisgICAgICAgIHN0cmVhbUJ1ZmZlci5idWZmZXIgPSBidWZmZXI7CisgICAgICAgIHN0cmVhbUJ1ZmZlci5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgIHN0cmVhbUJ1ZmZlci5hY3F1aXJlX2ZlbmNlID0gLTE7CisgICAgICAgIHN0cmVhbUJ1ZmZlci5yZWxlYXNlX2ZlbmNlID0gLTE7CisKKyAgICAgICAgaWYgKGJ1Zi5yZWxlYXNlRmVuY2UgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgc3RyZWFtQnVmZmVyLnJlbGVhc2VfZmVuY2UgPSAtMTsKKyAgICAgICAgfSBlbHNlIGlmIChidWYucmVsZWFzZUZlbmNlLT5udW1GZHMgPT0gMSkgeworICAgICAgICAgICAgc3RyZWFtQnVmZmVyLnJlbGVhc2VfZmVuY2UgPSBkdXAoYnVmLnJlbGVhc2VGZW5jZS0+ZGF0YVswXSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEludmFsaWQgcmVsZWFzZSBmZW5jZSwgZmQgY291bnQgaXMgJWQsIG5vdCAxIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBidWYucmVsZWFzZUZlbmNlLT5udW1GZHMpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoYnVmLnN0cmVhbUlkKTsKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IE91dHB1dCBzdHJlYW0gaWQgJWQgbm90IGZvdW5kISIsIF9fRlVOQ1RJT05fXywgYnVmLnN0cmVhbUlkKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHN0cmVhbUJ1ZmZlci5zdHJlYW0gPSBzdHJlYW0tPmFzSGFsU3RyZWFtKCk7CisgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMoJnN0cmVhbUJ1ZmZlciwgLypzaXplKi8xLCAvKnRpbWVzdGFtcCovIDApOworICAgIH0KKyAgICByZXR1cm4gaGFyZHdhcmU6OlZvaWQoKTsKK30KKwogaGFyZHdhcmU6OlJldHVybjx2b2lkPiBDYW1lcmEzRGV2aWNlOjpwcm9jZXNzQ2FwdHVyZVJlc3VsdF8zXzQoCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSB7CkBAIC0xMDE3LDcgKzEzMTQsNyBAQAogdm9pZCBDYW1lcmEzRGV2aWNlOjpwcm9jZXNzT25lQ2FwdHVyZVJlc3VsdExvY2tlZCgKICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVzdWx0JiByZXN1bHQsCiAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKLSAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OlBoeXNpY2FsQ2FtZXJhTWV0YWRhdGE+IHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGFzKSB7CisgICAgICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpQaHlzaWNhbENhbWVyYU1ldGFkYXRhPiBwaHlzaWNhbENhbWVyYU1ldGFkYXRhKSB7CiAgICAgY2FtZXJhM19jYXB0dXJlX3Jlc3VsdCByOwogICAgIHN0YXR1c190IHJlczsKICAgICByLmZyYW1lX251bWJlciA9IHJlc3VsdC5mcmFtZU51bWJlcjsKQEAgLTEwMzMsMjEgKzEzMzAsMjEgQEAKICAgICByLnJlc3VsdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2FtZXJhX21ldGFkYXRhX3QqPihyZXN1bHRNZXRhZGF0YS5kYXRhKCkpOwogCiAgICAgLy8gUmVhZCBhbmQgdmFsaWRhdGUgcGh5c2ljYWwgY2FtZXJhIG1ldGFkYXRhCi0gICAgc2l6ZV90IHBoeXNSZXN1bHRDb3VudCA9IHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGFzLnNpemUoKTsKKyAgICBzaXplX3QgcGh5c1Jlc3VsdENvdW50ID0gcGh5c2ljYWxDYW1lcmFNZXRhZGF0YS5zaXplKCk7CiAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgY2hhcio+IHBoeXNDYW1JZHMocGh5c1Jlc3VsdENvdW50KTsKICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqPiBwaHlDYW1NZXRhZGF0YXMocGh5c1Jlc3VsdENvdW50KTsKICAgICBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhbWVyYU1ldGFkYXRhPiBwaHlzUmVzdWx0TWV0YWRhdGE7CiAgICAgcGh5c1Jlc3VsdE1ldGFkYXRhLnJlc2l6ZShwaHlzUmVzdWx0Q291bnQpOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcGh5c2ljYWxDYW1lcmFNZXRhZGF0YXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgcmVzID0gcmVhZE9uZUNhbWVyYU1ldGFkYXRhTG9ja2VkKHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGFzW2ldLmZtcU1ldGFkYXRhU2l6ZSwKLSAgICAgICAgICAgICAgICBwaHlzUmVzdWx0TWV0YWRhdGFbaV0sIHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGFzW2ldLm1ldGFkYXRhKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgcmVzID0gcmVhZE9uZUNhbWVyYU1ldGFkYXRhTG9ja2VkKHBoeXNpY2FsQ2FtZXJhTWV0YWRhdGFbaV0uZm1xTWV0YWRhdGFTaXplLAorICAgICAgICAgICAgICAgIHBoeXNSZXN1bHRNZXRhZGF0YVtpXSwgcGh5c2ljYWxDYW1lcmFNZXRhZGF0YVtpXS5tZXRhZGF0YSk7CiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEZhaWxlZCB0byByZWFkIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIGZvciBjYW1lcmEgJXMiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFNZXRhZGF0YXNbaV0ucGh5c2ljYWxDYW1lcmFJZC5jX3N0cigpKTsKKyAgICAgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFNZXRhZGF0YVtpXS5waHlzaWNhbENhbWVyYUlkLmNfc3RyKCkpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIHBoeXNDYW1JZHNbaV0gPSBwaHlzaWNhbENhbWVyYU1ldGFkYXRhc1tpXS5waHlzaWNhbENhbWVyYUlkLmNfc3RyKCk7CisgICAgICAgIHBoeXNDYW1JZHNbaV0gPSBwaHlzaWNhbENhbWVyYU1ldGFkYXRhW2ldLnBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKTsKICAgICAgICAgcGh5Q2FtTWV0YWRhdGFzW2ldID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCo+KAogICAgICAgICAgICAgICAgIHBoeXNSZXN1bHRNZXRhZGF0YVtpXS5kYXRhKCkpOwogICAgIH0KQEAgLTEwNjEsMjcgKzEzNTgsNTEgQEAKICAgICAgICAgYXV0byYgYkRzdCA9IG91dHB1dEJ1ZmZlcnNbaV07CiAgICAgICAgIGNvbnN0IFN0cmVhbUJ1ZmZlciAmYlNyYyA9IHJlc3VsdC5vdXRwdXRCdWZmZXJzW2ldOwogCi0gICAgICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShiU3JjLnN0cmVhbUlkKTsKLSAgICAgICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoYlNyYy5zdHJlYW1JZCk7CisgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogQnVmZmVyICV6dTogSW52YWxpZCBvdXRwdXQgc3RyZWFtIGlkICVkIiwKICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCByZXN1bHQuZnJhbWVOdW1iZXIsIGksIGJTcmMuc3RyZWFtSWQpOwogICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICB9Ci0gICAgICAgIGJEc3Quc3RyZWFtID0gbU91dHB1dFN0cmVhbXMudmFsdWVBdChpZHgpLT5hc0hhbFN0cmVhbSgpOworICAgICAgICBiRHN0LnN0cmVhbSA9IHN0cmVhbS0+YXNIYWxTdHJlYW0oKTsKIAotICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlcjsKLSAgICAgICAgcmVzID0gbUludGVyZmFjZS0+cG9wSW5mbGlnaHRCdWZmZXIocmVzdWx0LmZyYW1lTnVtYmVyLCBiU3JjLnN0cmVhbUlkLCAmYnVmZmVyKTsKKyAgICAgICAgYm9vbCBub0J1ZmZlclJldHVybmVkID0gZmFsc2U7CisgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyID0gbnVsbHB0cjsKKyAgICAgICAgaWYgKG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAvLyBUaGlzIGlzIHN1c3BpY2lvdXMgbW9zdCBvZiB0aGUgdGltZSBidXQgY2FuIGJlIGNvcnJlY3QgZHVyaW5nIGZsdXNoIHdoZXJlIEhBTAorICAgICAgICAgICAgLy8gaGFzIHRvIHJldHVybiBjYXB0dXJlIHJlc3VsdCBiZWZvcmUgYSBidWZmZXIgaXMgcmVxdWVzdGVkCisgICAgICAgICAgICBpZiAoYlNyYy5idWZmZXJJZCA9PSBIYWxJbnRlcmZhY2U6OkJVRkZFUl9JRF9OT19CVUZGRVIpIHsKKyAgICAgICAgICAgICAgICBpZiAoYlNyYy5zdGF0dXMgPT0gQnVmZmVyU3RhdHVzOjpPSykgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IEZyYW1lICVkOiBCdWZmZXIgJXp1OiBObyBidWZmZXJJZCBmb3Igc3RyZWFtICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHJlc3VsdC5mcmFtZU51bWJlciwgaSwgYlNyYy5zdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgICAgIC8vIFN0aWxsIHByb2NlZWRzIHNvIG90aGVyIGJ1ZmZlcnMgY2FuIGJlIHJldHVybmVkCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG5vQnVmZmVyUmV0dXJuZWQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKG5vQnVmZmVyUmV0dXJuZWQpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBPSzsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcmVzID0gbUludGVyZmFjZS0+cG9wSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKGJTcmMuYnVmZmVySWQsICZidWZmZXIpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gbUludGVyZmFjZS0+cG9wSW5mbGlnaHRCdWZmZXIocmVzdWx0LmZyYW1lTnVtYmVyLCBiU3JjLnN0cmVhbUlkLCAmYnVmZmVyKTsKKyAgICAgICAgfQorCiAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogRnJhbWUgJWQ6IEJ1ZmZlciAlenU6IE5vIGluLWZsaWdodCBidWZmZXIgZm9yIHN0cmVhbSAlZCIsCiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgcmVzdWx0LmZyYW1lTnVtYmVyLCBpLCBiU3JjLnN0cmVhbUlkKTsKICAgICAgICAgICAgIHJldHVybjsKICAgICAgICAgfQorCiAgICAgICAgIGJEc3QuYnVmZmVyID0gYnVmZmVyOwogICAgICAgICBiRHN0LnN0YXR1cyA9IG1hcEhpZGxCdWZmZXJTdGF0dXMoYlNyYy5zdGF0dXMpOwogICAgICAgICBiRHN0LmFjcXVpcmVfZmVuY2UgPSAtMTsKICAgICAgICAgaWYgKGJTcmMucmVsZWFzZUZlbmNlID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIGJEc3QucmVsZWFzZV9mZW5jZSA9IC0xOwogICAgICAgICB9IGVsc2UgaWYgKGJTcmMucmVsZWFzZUZlbmNlLT5udW1GZHMgPT0gMSkgeworICAgICAgICAgICAgaWYgKG5vQnVmZmVyUmV0dXJuZWQpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGdvdCByZWxlYXNlRmVuY2Ugd2l0aG91dCBvdXRwdXQgYnVmZmVyISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBiRHN0LnJlbGVhc2VfZmVuY2UgPSBkdXAoYlNyYy5yZWxlYXNlRmVuY2UtPmRhdGFbMF0pOwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogSW52YWxpZCByZWxlYXNlIGZlbmNlIGZvciBidWZmZXIgJXp1LCBmZCBjb3VudCBpcyAlZCwgbm90IDEiLApAQCAtMTE1NywxMyArMTQ3OCwxMyBAQAogICAgICAgICAgICAgbS50eXBlID0gQ0FNRVJBM19NU0dfRVJST1I7CiAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZnJhbWVfbnVtYmVyID0gbXNnLm1zZy5lcnJvci5mcmFtZU51bWJlcjsKICAgICAgICAgICAgIGlmIChtc2cubXNnLmVycm9yLmVycm9yU3RyZWFtSWQgPj0gMCkgewotICAgICAgICAgICAgICAgIHNzaXplX3QgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShtc2cubXNnLmVycm9yLmVycm9yU3RyZWFtSWQpOwotICAgICAgICAgICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogSW52YWxpZCBlcnJvciBzdHJlYW0gaWQgJWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbS5tZXNzYWdlLmVycm9yLmZyYW1lX251bWJlciwgbXNnLm1zZy5lcnJvci5lcnJvclN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQobXNnLm1zZy5lcnJvci5lcnJvclN0cmVhbUlkKTsKKyAgICAgICAgICAgICAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBGcmFtZSAlZDogSW52YWxpZCBlcnJvciBzdHJlYW0gaWQgJWQiLCBfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbS5tZXNzYWdlLmVycm9yLmZyYW1lX251bWJlciwgbXNnLm1zZy5lcnJvci5lcnJvclN0cmVhbUlkKTsKICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtLm1lc3NhZ2UuZXJyb3IuZXJyb3Jfc3RyZWFtID0gbU91dHB1dFN0cmVhbXMudmFsdWVBdChpZHgpLT5hc0hhbFN0cmVhbSgpOworICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9zdHJlYW0gPSBzdHJlYW0tPmFzSGFsU3RyZWFtKCk7CiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIG0ubWVzc2FnZS5lcnJvci5lcnJvcl9zdHJlYW0gPSBudWxscHRyOwogICAgICAgICAgICAgfQpAQCAtMTM0NCw2ICsxNjY1LDU2IEBACiAgICAgcmV0dXJuIE9LOwogfQogCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpTdHJlYW1TZXQ6OmFkZCgKKyAgICAgICAgaW50IHN0cmVhbUlkLCBzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0pIHsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgYWRkIG51bGwgc3RyZWFtIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHJldHVybiBtRGF0YS5hZGQoc3RyZWFtSWQsIHN0cmVhbSk7Cit9CisKK3NzaXplX3QgQ2FtZXJhM0RldmljZTo6U3RyZWFtU2V0OjpyZW1vdmUoaW50IHN0cmVhbUlkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIHJldHVybiBtRGF0YS5yZW1vdmVJdGVtKHN0cmVhbUlkKTsKK30KKworc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4KK0NhbWVyYTNEZXZpY2U6OlN0cmVhbVNldDo6Z2V0KGludCBzdHJlYW1JZCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBzc2l6ZV90IGlkeCA9IG1EYXRhLmluZGV4T2ZLZXkoc3RyZWFtSWQpOworICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiBtRGF0YS5lZGl0VmFsdWVBdChpZHgpOworfQorCitzcDxjYW1lcmEzOjpDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPgorQ2FtZXJhM0RldmljZTo6U3RyZWFtU2V0OjpvcGVyYXRvcltdIChzaXplX3QgaW5kZXgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1EYXRhLmVkaXRWYWx1ZUF0KGluZGV4KTsKK30KKworc2l6ZV90IENhbWVyYTNEZXZpY2U6OlN0cmVhbVNldDo6c2l6ZSgpIGNvbnN0IHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgcmV0dXJuIG1EYXRhLnNpemUoKTsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpTdHJlYW1TZXQ6OmNsZWFyKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICByZXR1cm4gbURhdGEuY2xlYXIoKTsKK30KKworc3RkOjp2ZWN0b3I8aW50PiBDYW1lcmEzRGV2aWNlOjpTdHJlYW1TZXQ6OmdldFN0cmVhbUlkcygpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgc3RkOjp2ZWN0b3I8aW50PiBzdHJlYW1JZHMobURhdGEuc2l6ZSgpKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1EYXRhLnNpemUoKTsgaSsrKSB7CisgICAgICAgIHN0cmVhbUlkc1tpXSA9IG1EYXRhLmtleUF0KGkpOworICAgIH0KKyAgICByZXR1cm4gc3RyZWFtSWRzOworfQorCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpjcmVhdGVTdHJlYW0oc3A8U3VyZmFjZT4gY29uc3VtZXIsCiAgICAgICAgICAgICB1aW50MzJfdCB3aWR0aCwgdWludDMyX3QgaGVpZ2h0LCBpbnQgZm9ybWF0LAogICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLCBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uLCBpbnQgKmlkLApAQCAtMTQyMiwxOCArMTc5MywyMCBAQAogCiAgICAgaWYgKGZvcm1hdCA9PSBIQUxfUElYRUxfRk9STUFUX0JMT0IpIHsKICAgICAgICAgc3NpemVfdCBibG9iQnVmZmVyU2l6ZTsKLSAgICAgICAgaWYgKGRhdGFTcGFjZSAhPSBIQUxfREFUQVNQQUNFX0RFUFRIKSB7Ci0gICAgICAgICAgICBibG9iQnVmZmVyU2l6ZSA9IGdldEpwZWdCdWZmZXJTaXplKHdpZHRoLCBoZWlnaHQpOwotICAgICAgICAgICAgaWYgKGJsb2JCdWZmZXJTaXplIDw9IDApIHsKLSAgICAgICAgICAgICAgICBTRVRfRVJSX0woIkludmFsaWQganBlZyBidWZmZXIgc2l6ZSAlemQiLCBibG9iQnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGRhdGFTcGFjZSA9PSBIQUxfREFUQVNQQUNFX0RFUFRIKSB7CiAgICAgICAgICAgICBibG9iQnVmZmVyU2l6ZSA9IGdldFBvaW50Q2xvdWRCdWZmZXJTaXplKCk7CiAgICAgICAgICAgICBpZiAoYmxvYkJ1ZmZlclNpemUgPD0gMCkgewogICAgICAgICAgICAgICAgIFNFVF9FUlJfTCgiSW52YWxpZCBwb2ludCBjbG91ZCBidWZmZXIgc2l6ZSAlemQiLCBibG9iQnVmZmVyU2l6ZSk7CiAgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChkYXRhU3BhY2UgPT0gc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KEhBTF9EQVRBU1BBQ0VfSlBFR19BUFBfU0VHTUVOVFMpKSB7CisgICAgICAgICAgICBibG9iQnVmZmVyU2l6ZSA9IHdpZHRoICogaGVpZ2h0OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgYmxvYkJ1ZmZlclNpemUgPSBnZXRKcGVnQnVmZmVyU2l6ZSh3aWR0aCwgaGVpZ2h0KTsKKyAgICAgICAgICAgIGlmIChibG9iQnVmZmVyU2l6ZSA8PSAwKSB7CisgICAgICAgICAgICAgICAgU0VUX0VSUl9MKCJJbnZhbGlkIGpwZWcgYnVmZmVyIHNpemUgJXpkIiwgYmxvYkJ1ZmZlclNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXJzWzBdLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGJsb2JCdWZmZXJTaXplLCBmb3JtYXQsIGRhdGFTcGFjZSwgcm90YXRpb24sCkBAIC0xNDUwLDcgKzE4MjMsOCBAQAogICAgIH0gZWxzZSBpZiAoaXNTaGFyZWQpIHsKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwgY29uc3VtZXJzLAogICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgY29uc3VtZXJVc2FnZSwgZGF0YVNwYWNlLCByb3RhdGlvbiwKLSAgICAgICAgICAgICAgICBtVGltZXN0YW1wT2Zmc2V0LCBwaHlzaWNhbENhbWVyYUlkLCBzdHJlYW1TZXRJZCk7CisgICAgICAgICAgICAgICAgbVRpbWVzdGFtcE9mZnNldCwgcGh5c2ljYWxDYW1lcmFJZCwgc3RyZWFtU2V0SWQsCisgICAgICAgICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIpOwogICAgIH0gZWxzZSBpZiAoY29uc3VtZXJzLnNpemUoKSA9PSAwICYmIGhhc0RlZmVycmVkQ29uc3VtZXIpIHsKICAgICAgICAgbmV3U3RyZWFtID0gbmV3IENhbWVyYTNPdXRwdXRTdHJlYW0obU5leHRTdHJlYW1JZCwKICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIGNvbnN1bWVyVXNhZ2UsIGRhdGFTcGFjZSwgcm90YXRpb24sCkBAIC0xNTI3LDIwICsxOTAxLDIwIEBACiAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQogCi0gICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KGlkKTsKLSAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KGlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBpcyB1bmtub3duIiwgaWQpOwotICAgICAgICByZXR1cm4gaWR4OworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHN0cmVhbUluZm8tPndpZHRoICA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmdldFdpZHRoKCk7Ci0gICAgc3RyZWFtSW5mby0+aGVpZ2h0ID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0SGVpZ2h0KCk7Ci0gICAgc3RyZWFtSW5mby0+Zm9ybWF0ID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0Rm9ybWF0KCk7Ci0gICAgc3RyZWFtSW5mby0+ZGF0YVNwYWNlID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0RGF0YVNwYWNlKCk7Ci0gICAgc3RyZWFtSW5mby0+Zm9ybWF0T3ZlcnJpZGRlbiA9IG1PdXRwdXRTdHJlYW1zW2lkeF0tPmlzRm9ybWF0T3ZlcnJpZGRlbigpOwotICAgIHN0cmVhbUluZm8tPm9yaWdpbmFsRm9ybWF0ID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+Z2V0T3JpZ2luYWxGb3JtYXQoKTsKLSAgICBzdHJlYW1JbmZvLT5kYXRhU3BhY2VPdmVycmlkZGVuID0gbU91dHB1dFN0cmVhbXNbaWR4XS0+aXNEYXRhU3BhY2VPdmVycmlkZGVuKCk7Ci0gICAgc3RyZWFtSW5mby0+b3JpZ2luYWxEYXRhU3BhY2UgPSBtT3V0cHV0U3RyZWFtc1tpZHhdLT5nZXRPcmlnaW5hbERhdGFTcGFjZSgpOworICAgIHN0cmVhbUluZm8tPndpZHRoICA9IHN0cmVhbS0+Z2V0V2lkdGgoKTsKKyAgICBzdHJlYW1JbmZvLT5oZWlnaHQgPSBzdHJlYW0tPmdldEhlaWdodCgpOworICAgIHN0cmVhbUluZm8tPmZvcm1hdCA9IHN0cmVhbS0+Z2V0Rm9ybWF0KCk7CisgICAgc3RyZWFtSW5mby0+ZGF0YVNwYWNlID0gc3RyZWFtLT5nZXREYXRhU3BhY2UoKTsKKyAgICBzdHJlYW1JbmZvLT5mb3JtYXRPdmVycmlkZGVuID0gc3RyZWFtLT5pc0Zvcm1hdE92ZXJyaWRkZW4oKTsKKyAgICBzdHJlYW1JbmZvLT5vcmlnaW5hbEZvcm1hdCA9IHN0cmVhbS0+Z2V0T3JpZ2luYWxGb3JtYXQoKTsKKyAgICBzdHJlYW1JbmZvLT5kYXRhU3BhY2VPdmVycmlkZGVuID0gc3RyZWFtLT5pc0RhdGFTcGFjZU92ZXJyaWRkZW4oKTsKKyAgICBzdHJlYW1JbmZvLT5vcmlnaW5hbERhdGFTcGFjZSA9IHN0cmVhbS0+Z2V0T3JpZ2luYWxEYXRhU3BhY2UoKTsKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTE1NjcsMTQgKzE5NDEsMTIgQEAKICAgICAgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKICAgICB9CiAKLSAgICBzc2l6ZV90IGlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoaWQpOwotICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKLSAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBkb2VzIG5vdCBleGlzdCIsCi0gICAgICAgICAgICAgICAgaWQpOworICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChpZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLCBpZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQotCi0gICAgcmV0dXJuIG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KGlkeCktPnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOworICAgIHJldHVybiBzdHJlYW0tPnNldFRyYW5zZm9ybSh0cmFuc2Zvcm0pOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpkZWxldGVTdHJlYW0oaW50IGlkKSB7CkBAIC0xNTk5LDIxICsxOTcxLDIxIEBACiAgICAgfQogCiAgICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gZGVsZXRlZFN0cmVhbTsKLSAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoaWQpOworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChpZCk7CiAgICAgaWYgKG1JbnB1dFN0cmVhbSAhPSBOVUxMICYmIGlkID09IG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSkgewogICAgICAgICBkZWxldGVkU3RyZWFtID0gbUlucHV0U3RyZWFtOwogICAgICAgICBtSW5wdXRTdHJlYW0uY2xlYXIoKTsKICAgICB9IGVsc2UgewotICAgICAgICBpZiAob3V0cHV0U3RyZWFtSWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBkb2VzIG5vdCBleGlzdCIsIGlkKTsKICAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgICAgIH0KICAgICB9CiAKICAgICAvLyBEZWxldGUgb3V0cHV0IHN0cmVhbSBvciB0aGUgb3V0cHV0IHBhcnQgb2YgYSBiaS1kaXJlY3Rpb25hbCBzdHJlYW0uCi0gICAgaWYgKG91dHB1dFN0cmVhbUlkeCAhPSBOQU1FX05PVF9GT1VORCkgewotICAgICAgICBkZWxldGVkU3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQob3V0cHV0U3RyZWFtSWR4KTsKLSAgICAgICAgbU91dHB1dFN0cmVhbXMucmVtb3ZlSXRlbShpZCk7CisgICAgaWYgKHN0cmVhbSAhPSBudWxscHRyKSB7CisgICAgICAgIGRlbGV0ZWRTdHJlYW0gPSBzdHJlYW07CisgICAgICAgIG1PdXRwdXRTdHJlYW1zLnJlbW92ZShpZCk7CiAgICAgfQogCiAgICAgLy8gRnJlZSB1cCB0aGUgc3RyZWFtIGVuZHBvaW50IHNvIHRoYXQgaXQgY2FuIGJlIHVzZWQgYnkgc29tZSBvdGhlciBzdHJlYW0KQEAgLTE2OTYsNyArMjA2OCw3IEBACiAKICAgICBpZiAodGVtcGxhdGVJZCA8PSAwIHx8IHRlbXBsYXRlSWQgPj0gQ0FNRVJBM19URU1QTEFURV9DT1VOVCkgewogICAgICAgICBhbmRyb2lkX2Vycm9yV3JpdGVXaXRoSW5mb0xvZyhDYW1lcmFTZXJ2aWNlOjpTTl9FVkVOVF9MT0dfSUQsICIyNjg2NjExMCIsCi0gICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpLCBudWxscHRyLCAwKTsKKyAgICAgICAgICAgICAgICBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1VpZCgpLCBudWxscHRyLCAwKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9CiAKQEAgLTE4NTQsNiArMjIyNiwxNCBAQAogCiAgICAgbVN0YXR1c1dhaXRlcnMrKzsKIAorICAgIGlmICghYWN0aXZlICYmIG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgIGF1dG8gc3RyZWFtSWRzID0gbU91dHB1dFN0cmVhbXMuZ2V0U3RyZWFtSWRzKCk7CisgICAgICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19BQ1RJVkUpIHsKKyAgICAgICAgICAgIG1SZXF1ZXN0VGhyZWFkLT5zaWduYWxQaXBlbGluZURyYWluKHN0cmVhbUlkcyk7CisgICAgICAgIH0KKyAgICAgICAgbVJlcXVlc3RCdWZmZXJTTS5vbldhaXRVbnRpbElkbGUoKTsKKyAgICB9CisKICAgICBib29sIHN0YXRlU2VlbiA9IGZhbHNlOwogICAgIGRvIHsKICAgICAgICAgaWYgKGFjdGl2ZSA9PSAobVN0YXR1cyA9PSBTVEFUVVNfQUNUSVZFKSkgewpAQCAtMjAxMyw2ICsyMzkzLDEzIEBACiAKICAgICB7CiAgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKworICAgICAgICAvLyBiLzExNjUxNDEwNiAiZGlzY29ubmVjdCgpIiBjYW4gZ2V0IGNhbGxlZCB0d2ljZSBmb3IgdGhlIHNhbWUgZGV2aWNlLiBUaGUKKyAgICAgICAgLy8gY2FtZXJhIGRldmljZSB3aWxsIG5vdCBiZSBpbml0aWFsaXplZCBkdXJpbmcgdGhlIHNlY29uZCBydW4uCisgICAgICAgIGlmIChtU3RhdHVzID09IFNUQVRVU19VTklOSVRJQUxJWkVEKSB7CisgICAgICAgICAgICByZXR1cm4gT0s7CisgICAgICAgIH0KKwogICAgICAgICBtUmVxdWVzdFRocmVhZC0+Y2xlYXIoLypvdXQqL2ZyYW1lTnVtYmVyKTsKICAgICB9CiAKQEAgLTIwMjksMTUgKzI0MTYsMTIgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAotICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbTsKLSAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOwotICAgIGlmIChvdXRwdXRTdHJlYW1JZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0Iiwgc3RyZWFtSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KG91dHB1dFN0cmVhbUlkeCk7Ci0KICAgICBpZiAoc3RyZWFtLT5pc1VucHJlcGFyYWJsZSgpIHx8IHN0cmVhbS0+aGFzT3V0c3RhbmRpbmdCdWZmZXJzKCkgKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgaGFzIGFscmVhZHkgYmVlbiBhIHJlcXVlc3QgdGFyZ2V0Iiwgc3RyZWFtSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwpAQCAtMjA1NywxNSArMjQ0MSwxMiBAQAogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCi0gICAgc3A8Q2FtZXJhM1N0cmVhbUludGVyZmFjZT4gc3RyZWFtOwotICAgIHNzaXplX3Qgb3V0cHV0U3RyZWFtSWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7Ci0gICAgaWYgKG91dHB1dFN0cmVhbUlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIENMT0dFKCJTdHJlYW0gJWQgZG9lcyBub3QgZXhpc3QiLCBzdHJlYW1JZCk7CiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZWRpdFZhbHVlQXQob3V0cHV0U3RyZWFtSWR4KTsKLQogICAgIGlmIChzdHJlYW0tPmhhc091dHN0YW5kaW5nQnVmZmVycygpIHx8IG1SZXF1ZXN0VGhyZWFkLT5pc1N0cmVhbVBlbmRpbmcoc3RyZWFtKSkgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGlzIGEgdGFyZ2V0IG9mIGEgaW4tcHJvZ3Jlc3MgcmVxdWVzdCIsIHN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKQEAgLTIwODEsMTQgKzI0NjIsMTEgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgaWwobUludGVyZmFjZUxvY2spOwogICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKIAotICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbTsKLSAgICBzc2l6ZV90IG91dHB1dFN0cmVhbUlkeCA9IG1PdXRwdXRTdHJlYW1zLmluZGV4T2ZLZXkoc3RyZWFtSWQpOwotICAgIGlmIChvdXRwdXRTdHJlYW1JZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQoc3RyZWFtSWQpOworICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICBDTE9HRSgiU3RyZWFtICVkIGRvZXMgbm90IGV4aXN0Iiwgc3RyZWFtSWQpOwogICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KLQotICAgIHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KG91dHB1dFN0cmVhbUlkeCk7CiAgICAgc3RyZWFtLT5hZGRCdWZmZXJMaXN0ZW5lcihsaXN0ZW5lcik7CiAKICAgICByZXR1cm4gT0s7CkBAIC0yMTQ3LDEzICsyNTI1LDEyIEBACiAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CiAgICAgfQogCi0gICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbUlkKTsKLSAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBpcyB1bmtub3duIiwgc3RyZWFtSWQpOwotICAgICAgICByZXR1cm4gaWR4OworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAotICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zW2lkeF07CiAgICAgLy8gaXNDb25zdW1lckNvbmZpZ3VyYXRpb25EZWZlcnJlZCB3aWxsIGJlIG9mZiBhZnRlciBzZXRDb25zdW1lcnMKICAgICBib29sIGlzRGVmZXJyZWQgPSBzdHJlYW0tPmlzQ29uc3VtZXJDb25maWd1cmF0aW9uRGVmZXJyZWQoKTsKICAgICBzdGF0dXNfdCByZXMgPSBzdHJlYW0tPnNldENvbnN1bWVycyhjb25zdW1lcnMpOwpAQCAtMjIwMCwxMCArMjU3NywxMCBAQAogICAgIE11dGV4OjpBdXRvbG9jayBpbChtSW50ZXJmYWNlTG9jayk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCi0gICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbUlkKTsKLSAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gc3RyZWFtID0gbU91dHB1dFN0cmVhbXMuZ2V0KHN0cmVhbUlkKTsKKyAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBpcyB1bmtub3duIiwgc3RyZWFtSWQpOwotICAgICAgICByZXR1cm4gaWR4OworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIGZvciAoY29uc3QgYXV0byAmaXQgOiByZW1vdmVkU3VyZmFjZUlkcykgewpAQCAtMjIxMyw3ICsyNTkwLDYgQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zW2lkeF07CiAgICAgc3RhdHVzX3QgcmVzID0gc3RyZWFtLT51cGRhdGVTdHJlYW0obmV3U3VyZmFjZXMsIG91dHB1dEluZm8sIHJlbW92ZWRTdXJmYWNlSWRzLCBvdXRwdXRNYXApOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgQ0xPR0UoIlN0cmVhbSAlZCBmYWlsZWQgdG8gdXBkYXRlIHN0cmVhbSAoZXJyb3IgJWQgJXMpICIsCkBAIC0yMjMyLDEzICsyNjA4LDExIEBACiAgICAgTXV0ZXg6OkF1dG9sb2NrIGlsKG1JbnRlcmZhY2VMb2NrKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAKLSAgICBpbnQgaWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShzdHJlYW1JZCk7Ci0gICAgaWYgKGlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkIGlzIG5vdCBmb3VuZC4iLCBfX0ZVTkNUSU9OX18sIHN0cmVhbUlkKTsKICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICB9Ci0KLSAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChpZHgpOwogICAgIHJldHVybiBzdHJlYW0tPmRyb3BCdWZmZXJzKGRyb3BwaW5nKTsKIH0KIApAQCAtMjI4NiwxNSArMjY2MCwxMiBAQAogICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc3RyZWFtcy5jb3VudDsgaSsrKSB7Ci0gICAgICAgIGludCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbXMuZGF0YS5pMzJbaV0pOwotICAgICAgICBpZiAoaWR4ID09IE5BTUVfTk9UX0ZPVU5EKSB7CisgICAgICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1zLmRhdGEuaTMyW2ldKTsKKyAgICAgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CiAgICAgICAgICAgICBDTE9HRSgiUmVxdWVzdCByZWZlcmVuY2VzIHVua25vd24gc3RyZWFtICVkIiwKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtcy5kYXRhLnU4W2ldKTsKKyAgICAgICAgICAgICAgICAgICAgc3RyZWFtcy5kYXRhLmkzMltpXSk7CiAgICAgICAgICAgICByZXR1cm4gTlVMTDsKICAgICAgICAgfQotICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBzdHJlYW0gPQotICAgICAgICAgICAgICAgIG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KGlkeCk7Ci0KICAgICAgICAgLy8gSXQgaXMgaWxsZWdhbCB0byBpbmNsdWRlIGEgZGVmZXJyZWQgY29uc3VtZXIgb3V0cHV0IHN0cmVhbSBpbnRvIGEgcmVxdWVzdAogICAgICAgICBhdXRvIGl0ZXIgPSBzdXJmYWNlTWFwLmZpbmQoc3RyZWFtcy5kYXRhLmkzMltpXSk7CiAgICAgICAgIGlmIChpdGVyICE9IHN1cmZhY2VNYXAuZW5kKCkpIHsKQEAgLTIzMDYsNyArMjY3Nyw3IEBACiAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG5ld1JlcXVlc3QtPm1PdXRwdXRTdXJmYWNlc1tpXSA9IHN1cmZhY2VzOworICAgICAgICAgICAgbmV3UmVxdWVzdC0+bU91dHB1dFN1cmZhY2VzW3N0cmVhbXMuZGF0YS5pMzJbaV1dID0gc3VyZmFjZXM7CiAgICAgICAgIH0KIAogICAgICAgICBpZiAoc3RyZWFtLT5pc0NvbmZpZ3VyaW5nKCkpIHsKQEAgLTIzNDksNyArMjcyMCw3IEBACiAgICAgfQogCiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtT3V0cHV0U3RyZWFtcy5zaXplKCk7IGkrKykgewotICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChpKTsKKyAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0gbU91dHB1dFN0cmVhbXNbaV07CiAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPmlzQ29uZmlndXJpbmcoKSkgewogICAgICAgICAgICAgcmVzID0gb3V0cHV0U3RyZWFtLT5jYW5jZWxDb25maWd1cmF0aW9uKCk7CiAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC0yNDg0LDcgKzI4NTUsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgY2FtZXJhM19zdHJlYW1fdCAqb3V0cHV0U3RyZWFtOwotICAgICAgICBvdXRwdXRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5lZGl0VmFsdWVBdChpKS0+c3RhcnRDb25maWd1cmF0aW9uKCk7CisgICAgICAgIG91dHB1dFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zW2ldLT5zdGFydENvbmZpZ3VyYXRpb24oKTsKICAgICAgICAgaWYgKG91dHB1dFN0cmVhbSA9PSBOVUxMKSB7CiAgICAgICAgICAgICBDTE9HRSgiQ2FuJ3Qgc3RhcnQgb3V0cHV0IHN0cmVhbSBjb25maWd1cmF0aW9uIik7CiAgICAgICAgICAgICBjYW5jZWxTdHJlYW1zQ29uZmlndXJhdGlvbkxvY2tlZCgpOwpAQCAtMjQ5MiwxOSArMjg2MywyNyBAQAogICAgICAgICB9CiAgICAgICAgIHN0cmVhbXMuYWRkKG91dHB1dFN0cmVhbSk7CiAKLSAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQiAmJgotICAgICAgICAgICAgICAgIG91dHB1dFN0cmVhbS0+ZGF0YV9zcGFjZSA9PSBIQUxfREFUQVNQQUNFX1YwX0pGSUYpIHsKKyAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfQkxPQikgewogICAgICAgICAgICAgc2l6ZV90IGsgPSBpICsgKChtSW5wdXRTdHJlYW0gIT0gbnVsbHB0cikgPyAxIDogMCk7IC8vIElucHV0IHN0cmVhbSBpZiBwcmVzZW50IHNob3VsZAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsd2F5cyBvY2N1cHkgdGhlIGluaXRpYWwgZW50cnkuCi0gICAgICAgICAgICBidWZmZXJTaXplc1trXSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PigKLSAgICAgICAgICAgICAgICAgICAgZ2V0SnBlZ0J1ZmZlclNpemUob3V0cHV0U3RyZWFtLT53aWR0aCwgb3V0cHV0U3RyZWFtLT5oZWlnaHQpKTsKKyAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPmRhdGFfc3BhY2UgPT0gSEFMX0RBVEFTUEFDRV9WMF9KRklGKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZXNba10gPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRKcGVnQnVmZmVyU2l6ZShvdXRwdXRTdHJlYW0tPndpZHRoLCBvdXRwdXRTdHJlYW0tPmhlaWdodCkpOworICAgICAgICAgICAgfSBlbHNlIGlmIChvdXRwdXRTdHJlYW0tPmRhdGFfc3BhY2UgPT0KKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8YW5kcm9pZF9kYXRhc3BhY2U+KEhBTF9EQVRBU1BBQ0VfSlBFR19BUFBfU0VHTUVOVFMpKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZXNba10gPSBvdXRwdXRTdHJlYW0tPndpZHRoICogb3V0cHV0U3RyZWFtLT5oZWlnaHQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEFMT0dXKCIlczogQmxvYiBkYXRhU3BhY2UgJWQgbm90IHN1cHBvcnRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG91dHB1dFN0cmVhbS0+ZGF0YV9zcGFjZSk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiAKICAgICBjb25maWcuc3RyZWFtcyA9IHN0cmVhbXMuZWRpdEFycmF5KCk7CiAKICAgICAvLyBEbyB0aGUgSEFMIGNvbmZpZ3VyYXRpb247IHdpbGwgcG90ZW50aWFsbHkgdG91Y2ggc3RyZWFtCi0gICAgLy8gbWF4X2J1ZmZlcnMsIHVzYWdlLCBwcml2IGZpZWxkcy4KKyAgICAvLyBtYXhfYnVmZmVycywgdXNhZ2UsIGFuZCBwcml2IGZpZWxkcywgYXMgd2VsbCBhcyBkYXRhX3NwYWNlIGFuZCBmb3JtYXQKKyAgICAvLyBmaWVsZHMgZm9yIElNUExFTUVOVEFUSU9OX0RFRklORUQgZm9ybWF0cy4KIAogICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICpzZXNzaW9uQnVmZmVyID0gc2Vzc2lvblBhcmFtcy5nZXRBbmRMb2NrKCk7CiAgICAgcmVzID0gbUludGVyZmFjZS0+Y29uZmlndXJlU3RyZWFtcyhzZXNzaW9uQnVmZmVyLCAmY29uZmlnLCBidWZmZXJTaXplcyk7CkBAIC0yNTQ2LDggKzI5MjUsNyBAQAogICAgIH0KIAogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU91dHB1dFN0cmVhbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0KLSAgICAgICAgICAgIG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KGkpOworICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtc1tpXTsKICAgICAgICAgaWYgKG91dHB1dFN0cmVhbS0+aXNDb25maWd1cmluZygpICYmICFvdXRwdXRTdHJlYW0tPmlzQ29uc3VtZXJDb25maWd1cmF0aW9uRGVmZXJyZWQoKSkgewogICAgICAgICAgICAgYm9vbCBzdHJlYW1SZUNvbmZpZ3VyZWQgPSBmYWxzZTsKICAgICAgICAgICAgIHJlcyA9IG91dHB1dFN0cmVhbS0+ZmluaXNoQ29uZmlndXJhdGlvbigmc3RyZWFtUmVDb25maWd1cmVkKTsKQEAgLTI2MTQsNiArMjk5MiwxMCBAQAogICAgICAgICByZXR1cm4gcmM7CiAgICAgfQogCisgICAgaWYgKG1EdW1teVN0cmVhbUlkID09IE5PX1NUUkVBTSkgeworICAgICAgICBtUmVxdWVzdEJ1ZmZlclNNLm9uU3RyZWFtc0NvbmZpZ3VyZWQoKTsKKyAgICB9CisKICAgICByZXR1cm4gT0s7CiB9CiAKQEAgLTI2NTgsMTUgKzMwNDAsMTIgQEAKICAgICAvLyBPaywgaGF2ZSBhIGR1bW15IHN0cmVhbSBhbmQgdGhlcmUncyBhdCBsZWFzdCBvbmUgb3RoZXIgb3V0cHV0IHN0cmVhbSwKICAgICAvLyBzbyByZW1vdmUgdGhlIGR1bW15CiAKLSAgICBzcDxDYW1lcmEzU3RyZWFtSW50ZXJmYWNlPiBkZWxldGVkU3RyZWFtOwotICAgIHNzaXplX3Qgb3V0cHV0U3RyZWFtSWR4ID0gbU91dHB1dFN0cmVhbXMuaW5kZXhPZktleShtRHVtbXlTdHJlYW1JZCk7Ci0gICAgaWYgKG91dHB1dFN0cmVhbUlkeCA9PSBOQU1FX05PVF9GT1VORCkgeworICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IGRlbGV0ZWRTdHJlYW0gPSBtT3V0cHV0U3RyZWFtcy5nZXQobUR1bW15U3RyZWFtSWQpOworICAgIGlmIChkZWxldGVkU3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgU0VUX0VSUl9MKCJEdW1teSBzdHJlYW0gJWQgZG9lcyBub3QgYXBwZWFyIHRvIGV4aXN0IiwgbUR1bW15U3RyZWFtSWQpOwogICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CiAgICAgfQotCi0gICAgZGVsZXRlZFN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmVkaXRWYWx1ZUF0KG91dHB1dFN0cmVhbUlkeCk7Ci0gICAgbU91dHB1dFN0cmVhbXMucmVtb3ZlSXRlbXNBdChvdXRwdXRTdHJlYW1JZHgpOworICAgIG1PdXRwdXRTdHJlYW1zLnJlbW92ZShtRHVtbXlTdHJlYW1JZCk7CiAKICAgICAvLyBGcmVlIHVwIHRoZSBzdHJlYW0gZW5kcG9pbnQgc28gdGhhdCBpdCBjYW4gYmUgdXNlZCBieSBzb21lIG90aGVyIHN0cmVhbQogICAgIHJlcyA9IGRlbGV0ZWRTdHJlYW0tPmRpc2Nvbm5lY3QoKTsKQEAgLTI3NDAsMTggKzMxMTksMjEgQEAKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OnJlZ2lzdGVySW5GbGlnaHQodWludDMyX3QgZnJhbWVOdW1iZXIsCiAgICAgICAgIGludDMyX3QgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyByZXN1bHRFeHRyYXMsIGJvb2wgaGFzSW5wdXQsCiAgICAgICAgIGJvb2wgaGFzQXBwQ2FsbGJhY2ssIG5zZWNzX3QgbWF4RXhwZWN0ZWREdXJhdGlvbiwKLSAgICAgICAgc3RkOjpzZXQ8U3RyaW5nOD4mIHBoeXNpY2FsQ2FtZXJhSWRzKSB7CisgICAgICAgIHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkcywgYm9vbCBpc1N0aWxsQ2FwdHVyZSwKKyAgICAgICAgYm9vbCBpc1pzbENhcHR1cmUsIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtSW5GbGlnaHRMb2NrKTsKIAogICAgIHNzaXplX3QgcmVzOwogICAgIHJlcyA9IG1JbkZsaWdodE1hcC5hZGQoZnJhbWVOdW1iZXIsIEluRmxpZ2h0UmVxdWVzdChudW1CdWZmZXJzLCByZXN1bHRFeHRyYXMsIGhhc0lucHV0LAotICAgICAgICAgICAgaGFzQXBwQ2FsbGJhY2ssIG1heEV4cGVjdGVkRHVyYXRpb24sIHBoeXNpY2FsQ2FtZXJhSWRzKSk7CisgICAgICAgICAgICBoYXNBcHBDYWxsYmFjaywgbWF4RXhwZWN0ZWREdXJhdGlvbiwgcGh5c2ljYWxDYW1lcmFJZHMsIGlzU3RpbGxDYXB0dXJlLCBpc1pzbENhcHR1cmUsCisgICAgICAgICAgICBvdXRwdXRTdXJmYWNlcykpOwogICAgIGlmIChyZXMgPCAwKSByZXR1cm4gcmVzOwogCiAgICAgaWYgKG1JbkZsaWdodE1hcC5zaXplKCkgPT0gMSkgewotICAgICAgICAvLyBob2xkIG1Mb2NrIHRvIHByZXZlbnQgcmFjZSB3aXRoIGRpc2Nvbm5lY3QKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICAvLyBIb2xkIGEgc2VwYXJhdGUgZGVkaWNhdGVkIHRyYWNrZXIgbG9jayB0byBwcmV2ZW50IHJhY2Ugd2l0aCBkaXNjb25uZWN0IGFuZCBhbHNvCisgICAgICAgIC8vIGF2b2lkIGEgZGVhZGxvY2sgZHVyaW5nIHJlcHJvY2VzcyByZXF1ZXN0cy4KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVRyYWNrZXJMb2NrKTsKICAgICAgICAgaWYgKG1TdGF0dXNUcmFja2VyICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIG1TdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50QWN0aXZlKG1JbkZsaWdodFN0YXR1c0lkKTsKICAgICAgICAgfQpAQCAtMjc2MywxNiArMzE0NSw2OCBAQAogCiB2b2lkIENhbWVyYTNEZXZpY2U6OnJldHVybk91dHB1dEJ1ZmZlcnMoCiAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRCdWZmZXJzLCBzaXplX3QgbnVtQnVmZmVycywKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKKyAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgY29uc3QgU3VyZmFjZU1hcCYgb3V0cHV0U3VyZmFjZXMsCisgICAgICAgIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMgJmluUmVzdWx0RXh0cmFzKSB7CisKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG51bUJ1ZmZlcnM7IGkrKykKICAgICB7Ci0gICAgICAgIENhbWVyYTNTdHJlYW0gKnN0cmVhbSA9IENhbWVyYTNTdHJlYW06OmNhc3Qob3V0cHV0QnVmZmVyc1tpXS5zdHJlYW0pOwotICAgICAgICBzdGF0dXNfdCByZXMgPSBzdHJlYW0tPnJldHVybkJ1ZmZlcihvdXRwdXRCdWZmZXJzW2ldLCB0aW1lc3RhbXApOworICAgICAgICBpZiAob3V0cHV0QnVmZmVyc1tpXS5idWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgICAgIC8vIFdpdGggSEFMIGJ1ZmZlciBtYW5hZ2VtZW50IEFQSSwgSEFMIHNvbWV0aW1lcyB3aWxsIGhhdmUgdG8gcmV0dXJuIGJ1ZmZlcnMgdGhhdAorICAgICAgICAgICAgICAgIC8vIGhhcyBub3QgZ290IGEgb3V0cHV0IGJ1ZmZlciBoYW5kbGUgZmlsbGVkIHlldC4gVGhpcyBpcyB0aG91Z2ggaWxsZWdhbCBpZiBIQUwKKyAgICAgICAgICAgICAgICAvLyBidWZmZXIgbWFuYWdlbWVudCBBUEkgaXMgbm90IGJlaW5nIHVzZWQuCisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgcmV0dXJuIGEgbnVsbCBidWZmZXIhIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgQ2FtZXJhM1N0cmVhbUludGVyZmFjZSAqc3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChvdXRwdXRCdWZmZXJzW2ldLnN0cmVhbSk7CisgICAgICAgIGludCBzdHJlYW1JZCA9IHN0cmVhbS0+Z2V0SWQoKTsKKyAgICAgICAgY29uc3QgYXV0byYgaXQgPSBvdXRwdXRTdXJmYWNlcy5maW5kKHN0cmVhbUlkKTsKKyAgICAgICAgc3RhdHVzX3QgcmVzID0gT0s7CisgICAgICAgIGlmIChpdCAhPSBvdXRwdXRTdXJmYWNlcy5lbmQoKSkgeworICAgICAgICAgICAgcmVzID0gc3RyZWFtLT5yZXR1cm5CdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnNbaV0sIHRpbWVzdGFtcCwgdGltZXN0YW1wSW5jcmVhc2luZywgaXQtPnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgaW5SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmVzID0gc3RyZWFtLT5yZXR1cm5CdWZmZXIoCisgICAgICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnNbaV0sIHRpbWVzdGFtcCwgdGltZXN0YW1wSW5jcmVhc2luZywgc3RkOjp2ZWN0b3I8c2l6ZV90PiAoKSwKKyAgICAgICAgICAgICAgICAgICAgaW5SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIpOworICAgICAgICB9CisKICAgICAgICAgLy8gTm90ZTogc3RyZWFtIG1heSBiZSBkZWFsbG9jYXRlZCBhdCB0aGlzIHBvaW50LCBpZiB0aGlzIGJ1ZmZlciB3YXMKICAgICAgICAgLy8gdGhlIGxhc3QgcmVmZXJlbmNlIHRvIGl0LgotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiQ2FuJ3QgcmV0dXJuIGJ1ZmZlciB0byBpdHMgc3RyZWFtOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOT19JTklUIHx8IHJlcyA9PSBERUFEX09CSkVDVCkgeworICAgICAgICAgICAgQUxPR1YoIkNhbid0IHJldHVybiBidWZmZXIgdG8gaXRzIHN0cmVhbTogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIkNhbid0IHJldHVybiBidWZmZXIgdG8gaXRzIHN0cmVhbTogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gTG9uZyBwcm9jZXNzaW5nIGNvbnN1bWVycyBjYW4gY2F1c2UgcmV0dXJuQnVmZmVyIHRpbWVvdXQgZm9yIHNoYXJlZCBzdHJlYW0KKyAgICAgICAgLy8gSWYgdGhhdCBoYXBwZW5zLCBjYW5jZWwgdGhlIGJ1ZmZlciBhbmQgc2VuZCBhIGJ1ZmZlciBlcnJvciB0byBjbGllbnQKKyAgICAgICAgaWYgKGl0ICE9IG91dHB1dFN1cmZhY2VzLmVuZCgpICYmIHJlcyA9PSBUSU1FRF9PVVQgJiYKKyAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzW2ldLnN0YXR1cyA9PSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfT0spIHsKKyAgICAgICAgICAgIC8vIGNhbmNlbCB0aGUgYnVmZmVyCisgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCBzYiA9IG91dHB1dEJ1ZmZlcnNbaV07CisgICAgICAgICAgICBzYi5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1I7CisgICAgICAgICAgICBzdHJlYW0tPnJldHVybkJ1ZmZlcihzYiwgLyp0aW1lc3RhbXAqLzAsIHRpbWVzdGFtcEluY3JlYXNpbmcsIHN0ZDo6dmVjdG9yPHNpemVfdD4gKCksCisgICAgICAgICAgICAgICAgICAgIGluUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKKworICAgICAgICAgICAgLy8gbm90aWZ5IGNsaWVudCBidWZmZXIgZXJyb3IKKyAgICAgICAgICAgIHNwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcjsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtT3V0cHV0TG9jayk7CisgICAgICAgICAgICAgICAgbGlzdGVuZXIgPSBtTGlzdGVuZXIucHJvbW90ZSgpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAobGlzdGVuZXIgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgZXh0cmFzID0gaW5SZXN1bHRFeHRyYXM7CisgICAgICAgICAgICAgICAgZXh0cmFzLmVycm9yU3RyZWFtSWQgPSBzdHJlYW1JZDsKKyAgICAgICAgICAgICAgICBsaXN0ZW5lci0+bm90aWZ5RXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0JVRkZFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4dHJhcyk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KICAgICB9CiB9CkBAIC0yNzg0LDggKzMyMTgsMTAgQEAKIAogICAgIC8vIEluZGljYXRlIGlkbGUgaW5GbGlnaHRNYXAgdG8gdGhlIHN0YXR1cyB0cmFja2VyCiAgICAgaWYgKG1JbkZsaWdodE1hcC5zaXplKCkgPT0gMCkgewotICAgICAgICAvLyBob2xkIG1Mb2NrIHRvIHByZXZlbnQgcmFjZSB3aXRoIGRpc2Nvbm5lY3QKLSAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgICAgICBtUmVxdWVzdEJ1ZmZlclNNLm9uSW5mbGlnaHRNYXBFbXB0eSgpOworICAgICAgICAvLyBIb2xkIGEgc2VwYXJhdGUgZGVkaWNhdGVkIHRyYWNrZXIgbG9jayB0byBwcmV2ZW50IHJhY2Ugd2l0aCBkaXNjb25uZWN0IGFuZCBhbHNvCisgICAgICAgIC8vIGF2b2lkIGEgZGVhZGxvY2sgZHVyaW5nIHJlcHJvY2VzcyByZXF1ZXN0cy4KKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobVRyYWNrZXJMb2NrKTsKICAgICAgICAgaWYgKG1TdGF0dXNUcmFja2VyICE9IG51bGxwdHIpIHsKICAgICAgICAgICAgIG1TdGF0dXNUcmFja2VyLT5tYXJrQ29tcG9uZW50SWRsZShtSW5GbGlnaHRTdGF0dXNJZCwgRmVuY2U6Ok5PX0ZFTkNFKTsKICAgICAgICAgfQpAQCAtMjgxMCw2ICszMjQ2LDEwIEBACiAgICAgaWYgKHJlcXVlc3QubnVtQnVmZmVyc0xlZnQgPT0gMCAmJgogICAgICAgICAgICAgKHJlcXVlc3Quc2tpcFJlc3VsdE1ldGFkYXRhIHx8CiAgICAgICAgICAgICAocmVxdWVzdC5oYXZlUmVzdWx0TWV0YWRhdGEgJiYgc2h1dHRlclRpbWVzdGFtcCAhPSAwKSkpIHsKKyAgICAgICAgaWYgKHJlcXVlc3Quc3RpbGxDYXB0dXJlKSB7CisgICAgICAgICAgICBBVFJBQ0VfQVNZTkNfRU5EKCJzdGlsbCBjYXB0dXJlIiwgZnJhbWVOdW1iZXIpOworICAgICAgICB9CisKICAgICAgICAgQVRSQUNFX0FTWU5DX0VORCgiZnJhbWUgY2FwdHVyZSIsIGZyYW1lTnVtYmVyKTsKIAogICAgICAgICAvLyBTYW5pdHkgY2hlY2sgLSBpZiBzZW5zb3IgdGltZXN0YW1wIG1hdGNoZXMgc2h1dHRlciB0aW1lc3RhbXAgaW4gdGhlCkBAIC0yODI2LDIwICszMjY2LDI2IEBACiAgICAgICAgIGFzc2VydChyZXF1ZXN0LnJlcXVlc3RTdGF0dXMgIT0gT0sgfHwKICAgICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpID09IDApOwogICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXJyYXkoKSwKLSAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCAwKTsKKyAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCAwLCAvKnRpbWVzdGFtcEluY3JlYXNpbmcqL3RydWUsCisgICAgICAgICAgICByZXF1ZXN0Lm91dHB1dFN1cmZhY2VzLCByZXF1ZXN0LnJlc3VsdEV4dHJhcyk7CiAKICAgICAgICAgcmVtb3ZlSW5GbGlnaHRNYXBFbnRyeUxvY2tlZChpZHgpOwogICAgICAgICBBTE9HVlYoIiVzOiByZW1vdmVkIGZyYW1lICVkIGZyb20gSW5GbGlnaHRNYXAiLCBfX0ZVTkNUSU9OX18sIGZyYW1lTnVtYmVyKTsKICAgICAgfQogCi0gICAgLy8gU2FuaXR5IGNoZWNrIC0gaWYgd2UgaGF2ZSB0b28gbWFueSBpbi1mbGlnaHQgZnJhbWVzLCBzb21ldGhpbmcgaGFzCi0gICAgLy8gbGlrZWx5IGdvbmUgd3JvbmcKLSAgICBpZiAoIW1Jc0NvbnN0cmFpbmVkSGlnaFNwZWVkQ29uZmlndXJhdGlvbiAmJiBtSW5GbGlnaHRNYXAuc2l6ZSgpID4ga0luRmxpZ2h0V2FybkxpbWl0KSB7Ci0gICAgICAgIENMT0dFKCJJbi1mbGlnaHQgbGlzdCB0b28gbGFyZ2U6ICV6dSIsIG1JbkZsaWdodE1hcC5zaXplKCkpOwotICAgIH0gZWxzZSBpZiAobUlzQ29uc3RyYWluZWRIaWdoU3BlZWRDb25maWd1cmF0aW9uICYmIG1JbkZsaWdodE1hcC5zaXplKCkgPgotICAgICAgICAgICAga0luRmxpZ2h0V2FybkxpbWl0SGlnaFNwZWVkKSB7Ci0gICAgICAgIENMT0dFKCJJbi1mbGlnaHQgbGlzdCB0b28gbGFyZ2UgZm9yIGhpZ2ggc3BlZWQgY29uZmlndXJhdGlvbjogJXp1IiwKLSAgICAgICAgICAgICAgICBtSW5GbGlnaHRNYXAuc2l6ZSgpKTsKKyAgICAvLyBTYW5pdHkgY2hlY2sgLSBpZiB3ZSBoYXZlIHRvbyBtYW55IGluLWZsaWdodCBmcmFtZXMgd2l0aCBsb25nIHRvdGFsIGluZmxpZ2h0IGR1cmF0aW9uLAorICAgIC8vIHNvbWV0aGluZyBoYXMgbGlrZWx5IGdvbmUgd3JvbmcuIFRoaXMgbWlnaHQgc3RpbGwgYmUgbGVnaXQgb25seSBpZiBhcHBsaWNhdGlvbiBzZW5kIGluCisgICAgLy8gYSBsb25nIGJ1cnN0IG9mIGxvbmcgZXhwb3N1cmUgcmVxdWVzdHMuCisgICAgaWYgKG1FeHBlY3RlZEluZmxpZ2h0RHVyYXRpb24gPiBrTWluV2FybkluZmxpZ2h0RHVyYXRpb24pIHsKKyAgICAgICAgaWYgKCFtSXNDb25zdHJhaW5lZEhpZ2hTcGVlZENvbmZpZ3VyYXRpb24gJiYgbUluRmxpZ2h0TWFwLnNpemUoKSA+IGtJbkZsaWdodFdhcm5MaW1pdCkgeworICAgICAgICAgICAgQ0xPR1coIkluLWZsaWdodCBsaXN0IHRvbyBsYXJnZTogJXp1LCB0b3RhbCBpbmZsaWdodCBkdXJhdGlvbiAlIiBQUkl1NjQsCisgICAgICAgICAgICAgICAgICAgIG1JbkZsaWdodE1hcC5zaXplKCksIG1FeHBlY3RlZEluZmxpZ2h0RHVyYXRpb24pOworICAgICAgICB9IGVsc2UgaWYgKG1Jc0NvbnN0cmFpbmVkSGlnaFNwZWVkQ29uZmlndXJhdGlvbiAmJiBtSW5GbGlnaHRNYXAuc2l6ZSgpID4KKyAgICAgICAgICAgICAgICBrSW5GbGlnaHRXYXJuTGltaXRIaWdoU3BlZWQpIHsKKyAgICAgICAgICAgIENMT0dXKCJJbi1mbGlnaHQgbGlzdCB0b28gbGFyZ2UgZm9yIGhpZ2ggc3BlZWQgY29uZmlndXJhdGlvbjogJXp1LCIKKyAgICAgICAgICAgICAgICAgICAgInRvdGFsIGluZmxpZ2h0IGR1cmF0aW9uICUiIFBSSXU2NCwKKyAgICAgICAgICAgICAgICAgICAgbUluRmxpZ2h0TWFwLnNpemUoKSwgbUV4cGVjdGVkSW5mbGlnaHREdXJhdGlvbik7CisgICAgICAgIH0KICAgICB9CiB9CiAKQEAgLTI4NTAsNyArMzI5Niw5IEBACiAgICAgICAgIGZvciAoc2l6ZV90IGlkeCA9IDA7IGlkeCA8IG1JbkZsaWdodE1hcC5zaXplKCk7IGlkeCsrKSB7CiAgICAgICAgICAgICBjb25zdCBJbkZsaWdodFJlcXVlc3QgJnJlcXVlc3QgPSBtSW5GbGlnaHRNYXAudmFsdWVBdChpZHgpOwogICAgICAgICAgICAgcmV0dXJuT3V0cHV0QnVmZmVycyhyZXF1ZXN0LnBlbmRpbmdPdXRwdXRCdWZmZXJzLmFycmF5KCksCi0gICAgICAgICAgICAgICAgcmVxdWVzdC5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIDApOworICAgICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuc2l6ZSgpLCAwLAorICAgICAgICAgICAgICAgIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwgcmVxdWVzdC5vdXRwdXRTdXJmYWNlcywKKyAgICAgICAgICAgICAgICByZXF1ZXN0LnJlc3VsdEV4dHJhcyk7CiAgICAgICAgIH0KICAgICAgICAgbUluRmxpZ2h0TWFwLmNsZWFyKCk7CiAgICAgICAgIG1FeHBlY3RlZEluZmxpZ2h0RHVyYXRpb24gPSAwOwpAQCAtMjg2MCw3ICszMzA4LDE1IEBACiAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+PiBpbmZsaWdodEtleXM7CiAgICAgbUludGVyZmFjZS0+Z2V0SW5mbGlnaHRCdWZmZXJLZXlzKCZpbmZsaWdodEtleXMpOwogCi0gICAgaW50MzJfdCBpbnB1dFN0cmVhbUlkID0gKG1JbnB1dFN0cmVhbSAhPSBudWxscHRyKSA/IG1JbnB1dFN0cmVhbS0+Z2V0SWQoKSA6IC0xOworICAgIC8vIEluZmxpZ2h0IGJ1ZmZlcnMgZm9yIEhBTCBidWZmZXIgbWFuYWdlcgorICAgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBpbmZsaWdodFJlcXVlc3RCdWZmZXJLZXlzOworICAgIG1JbnRlcmZhY2UtPmdldEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcktleXMoJmluZmxpZ2h0UmVxdWVzdEJ1ZmZlcktleXMpOworCisgICAgLy8gKHN0cmVhbUlkLCBmcmFtZU51bWJlciwgYnVmZmVyX2hhbmRsZV90KikgdHVwbGUgZm9yIGFsbCBpbmZsaWdodCBidWZmZXJzLgorICAgIC8vIGZyYW1lTnVtYmVyIHdpbGwgYmUgLTEgZm9yIGJ1ZmZlcnMgZnJvbSBIQUwgYnVmZmVyIG1hbmFnZXIKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnR1cGxlPGludDMyX3QsIGludDMyX3QsIGJ1ZmZlcl9oYW5kbGVfdCo+PiBpbmZsaWdodEJ1ZmZlcnM7CisgICAgaW5mbGlnaHRCdWZmZXJzLnJlc2VydmUoaW5mbGlnaHRLZXlzLnNpemUoKSArIGluZmxpZ2h0UmVxdWVzdEJ1ZmZlcktleXMuc2l6ZSgpKTsKKwogICAgIGZvciAoYXV0byYgcGFpciA6IGluZmxpZ2h0S2V5cykgewogICAgICAgICBpbnQzMl90IGZyYW1lTnVtYmVyID0gcGFpci5maXJzdDsKICAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IHBhaXIuc2Vjb25kOwpAQCAtMjg3MSw2ICszMzI3LDI2IEBACiAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgZnJhbWVOdW1iZXIsIHN0cmVhbUlkKTsKICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9CisgICAgICAgIGluZmxpZ2h0QnVmZmVycy5wdXNoX2JhY2soc3RkOjptYWtlX3R1cGxlKHN0cmVhbUlkLCBmcmFtZU51bWJlciwgYnVmZmVyKSk7CisgICAgfQorCisgICAgZm9yIChhdXRvJiBidWZmZXJJZCA6IGluZmxpZ2h0UmVxdWVzdEJ1ZmZlcktleXMpIHsKKyAgICAgICAgaW50MzJfdCBzdHJlYW1JZCA9IC0xOworICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlciA9IG51bGxwdHI7CisgICAgICAgIHN0YXR1c190IHJlcyA9IG1JbnRlcmZhY2UtPnBvcEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcihidWZmZXJJZCwgJmJ1ZmZlciwgJnN0cmVhbUlkKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBjYW5ub3QgZmluZCBpbi1mbGlnaHQgYnVmZmVyICUiIFBSSXU2NCwgX19GVU5DVElPTl9fLCBidWZmZXJJZCk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpbmZsaWdodEJ1ZmZlcnMucHVzaF9iYWNrKHN0ZDo6bWFrZV90dXBsZShzdHJlYW1JZCwgLypmcmFtZU51bWJlciovLTEsIGJ1ZmZlcikpOworICAgIH0KKworICAgIGludDMyX3QgaW5wdXRTdHJlYW1JZCA9IChtSW5wdXRTdHJlYW0gIT0gbnVsbHB0cikgPyBtSW5wdXRTdHJlYW0tPmdldElkKCkgOiAtMTsKKyAgICBmb3IgKGF1dG8mIHR1cGxlIDogaW5mbGlnaHRCdWZmZXJzKSB7CisgICAgICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgICAgICBpbnQzMl90IHN0cmVhbUlkID0gc3RkOjpnZXQ8MD4odHVwbGUpOworICAgICAgICBpbnQzMl90IGZyYW1lTnVtYmVyID0gc3RkOjpnZXQ8MT4odHVwbGUpOworICAgICAgICBidWZmZXJfaGFuZGxlX3QqIGJ1ZmZlciA9IHN0ZDo6Z2V0PDI+KHR1cGxlKTsKIAogICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCBzdHJlYW1CdWZmZXI7CiAgICAgICAgIHN0cmVhbUJ1ZmZlci5idWZmZXIgPSBidWZmZXI7CkBAIC0yODg4LDcgKzMzNjQsOCBAQAogICAgICAgICAgICAgICAgIHN0cmVhbUJ1ZmZlci5zdHJlYW0gPSBoYWxTdHJlYW07CiAgICAgICAgICAgICAgICAgc3dpdGNoIChoYWxTdHJlYW0tPnN0cmVhbV90eXBlKSB7CiAgICAgICAgICAgICAgICAgICAgIGNhc2UgQ0FNRVJBM19TVFJFQU1fT1VUUFVUOgotICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gc3RyZWFtLT5yZXR1cm5CdWZmZXIoc3RyZWFtQnVmZmVyLCAvKnRpbWVzdGFtcCovIDApOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gc3RyZWFtLT5yZXR1cm5CdWZmZXIoc3RyZWFtQnVmZmVyLCAvKnRpbWVzdGFtcCovIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwgc3RkOjp2ZWN0b3I8c2l6ZV90PiAoKSwgZnJhbWVOdW1iZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FuJ3QgcmV0dXJuIG91dHB1dCBidWZmZXIgZm9yIGZyYW1lICVkIHRvIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgc3RyZWFtICVkOiAlcyAoJWQpIiwgIF9fRlVOQ1RJT05fXywKQEAgLTI5MjUsMTIgKzM0MDIsMTIgQEAKICAgICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgc3RyZWFtSWQsIHN0cmVycm9yKC1yZXMpLCByZXMpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc3NpemVfdCBpZHggPSBtT3V0cHV0U3RyZWFtcy5pbmRleE9mS2V5KHN0cmVhbUlkKTsKLSAgICAgICAgICAgIGlmIChpZHggPT0gTkFNRV9OT1RfRk9VTkQpIHsKKyAgICAgICAgICAgIHNwPENhbWVyYTNTdHJlYW1JbnRlcmZhY2U+IHN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLmdldChzdHJlYW1JZCk7CisgICAgICAgICAgICBpZiAoc3RyZWFtID09IG51bGxwdHIpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IE91dHB1dCBzdHJlYW0gaWQgJWQgbm90IGZvdW5kISIsIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOwogICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgc3RyZWFtQnVmZmVyLnN0cmVhbSA9IG1PdXRwdXRTdHJlYW1zLnZhbHVlQXQoaWR4KS0+YXNIYWxTdHJlYW0oKTsKKyAgICAgICAgICAgIHN0cmVhbUJ1ZmZlci5zdHJlYW0gPSBzdHJlYW0tPmFzSGFsU3RyZWFtKCk7CiAgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKCZzdHJlYW1CdWZmZXIsIC8qc2l6ZSovMSwgLyp0aW1lc3RhbXAqLyAwKTsKICAgICAgICAgfQogICAgIH0KQEAgLTI5NTYsNiArMzQzMywxNCBAQAogICAgICAgICByZXR1cm47CiAgICAgfQogCisgICAgLy8gVXBkYXRlIHZlbmRvciB0YWcgaWQgZm9yIHBoeXNpY2FsIG1ldGFkYXRhCisgICAgZm9yIChhdXRvJiBwaHlzaWNhbE1ldGFkYXRhIDogcmVzdWx0LT5tUGh5c2ljYWxNZXRhZGF0YXMpIHsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QgKnBtZXRhID0gY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCAqPigKKyAgICAgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhLm1QaHlzaWNhbENhbWVyYU1ldGFkYXRhLmdldEFuZExvY2soKSk7CisgICAgICAgIHNldF9jYW1lcmFfbWV0YWRhdGFfdmVuZG9yX2lkKHBtZXRhLCBtVmVuZG9yVGFnSWQpOworICAgICAgICBwaHlzaWNhbE1ldGFkYXRhLm1QaHlzaWNhbENhbWVyYU1ldGFkYXRhLnVubG9jayhwbWV0YSk7CisgICAgfQorCiAgICAgLy8gVmFsaWQgcmVzdWx0LCBpbnNlcnQgaW50byBxdWV1ZQogICAgIExpc3Q8Q2FwdHVyZVJlc3VsdD46Oml0ZXJhdG9yIHF1ZXVlZFJlc3VsdCA9CiAgICAgICAgICAgICBtUmVzdWx0UXVldWUuaW5zZXJ0KG1SZXN1bHRRdWV1ZS5lbmQoKSwgQ2FwdHVyZVJlc3VsdCgqcmVzdWx0KSk7CkBAIC0yOTc4LDYgKzM0NjMsMTMgQEAKICAgICBjYXB0dXJlUmVzdWx0Lm1SZXN1bHRFeHRyYXMgPSByZXN1bHRFeHRyYXM7CiAgICAgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEgPSBwYXJ0aWFsUmVzdWx0OwogCisgICAgLy8gRml4IHVwIHJlc3VsdCBtZXRhZGF0YSBmb3IgbW9ub2Nocm9tZSBjYW1lcmEuCisgICAgc3RhdHVzX3QgcmVzID0gZml4dXBNb25vY2hyb21lVGFncyhtRGV2aWNlSW5mbywgY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgU0VUX0VSUigiRmFpbGVkIHRvIG92ZXJyaWRlIHJlc3VsdCBtZXRhZGF0YTogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICByZXR1cm47CisgICAgfQorCiAgICAgaW5zZXJ0UmVzdWx0TG9ja2VkKCZjYXB0dXJlUmVzdWx0LCBmcmFtZU51bWJlcik7CiB9CiAKQEAgLTI5ODYsNyArMzQ3OCw3IEBACiAgICAgICAgIENhcHR1cmVSZXN1bHRFeHRyYXMgJnJlc3VsdEV4dHJhcywKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgJmNvbGxlY3RlZFBhcnRpYWxSZXN1bHQsCiAgICAgICAgIHVpbnQzMl90IGZyYW1lTnVtYmVyLAotICAgICAgICBib29sIHJlcHJvY2VzcywKKyAgICAgICAgYm9vbCByZXByb2Nlc3MsIGJvb2wgenNsU3RpbGxDYXB0dXJlLAogICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxNZXRhZGF0YXMpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIGlmIChwZW5kaW5nTWV0YWRhdGEuaXNFbXB0eSgpKQpAQCAtMzAwMyw2ICszNDk1LDE0IEBACiAgICAgICAgICAgICByZXR1cm47CiAgICAgICAgIH0KICAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlciA9IGZyYW1lTnVtYmVyICsgMTsKKyAgICB9IGVsc2UgaWYgKHpzbFN0aWxsQ2FwdHVyZSkgeworICAgICAgICBpZiAoZnJhbWVOdW1iZXIgPCBtTmV4dFpzbFN0aWxsUmVzdWx0RnJhbWVOdW1iZXIpIHsKKyAgICAgICAgICAgIFNFVF9FUlIoIk91dC1vZi1vcmRlciBaU0wgc3RpbGwgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgc3VibWl0dGVkISAiCisgICAgICAgICAgICAgICAgIihnb3QgZnJhbWUgbnVtYmVyICVkLCBleHBlY3RpbmcgJWQpIiwKKyAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgbU5leHRac2xTdGlsbFJlc3VsdEZyYW1lTnVtYmVyKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBtTmV4dFpzbFN0aWxsUmVzdWx0RnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlciArIDE7CiAgICAgfSBlbHNlIHsKICAgICAgICAgaWYgKGZyYW1lTnVtYmVyIDwgbU5leHRSZXN1bHRGcmFtZU51bWJlcikgewogICAgICAgICAgICAgU0VUX0VSUigiT3V0LW9mLW9yZGVyIGNhcHR1cmUgcmVzdWx0IG1ldGFkYXRhIHN1Ym1pdHRlZCEgIgpAQCAtMzA0MywxNSArMzU0Myw1MSBAQAogICAgIH0KIAogICAgIC8vIEZpeCB1cCBzb21lIHJlc3VsdCBtZXRhZGF0YSB0byBhY2NvdW50IGZvciBIQUwtbGV2ZWwgZGlzdG9ydGlvbiBjb3JyZWN0aW9uCi0gICAgc3RhdHVzX3QgcmVzID0gbURpc3RvcnRpb25NYXBwZXIuY29ycmVjdENhcHR1cmVSZXN1bHQoJmNhcHR1cmVSZXN1bHQubU1ldGFkYXRhKTsKKyAgICBzdGF0dXNfdCByZXMgPQorICAgICAgICAgICAgbURpc3RvcnRpb25NYXBwZXJzW21JZC5jX3N0cigpXS5jb3JyZWN0Q2FwdHVyZVJlc3VsdCgmY2FwdHVyZVJlc3VsdC5tTWV0YWRhdGEpOwogICAgIGlmIChyZXMgIT0gT0spIHsKICAgICAgICAgU0VUX0VSUigiVW5hYmxlIHRvIGNvcnJlY3QgY2FwdHVyZSByZXN1bHQgbWV0YWRhdGEgZm9yIGZyYW1lICVkOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgc3RyZXJyb3IocmVzKSwgcmVzKTsKICAgICAgICAgcmV0dXJuOwogICAgIH0KKyAgICBmb3IgKGF1dG8mIHBoeXNpY2FsTWV0YWRhdGEgOiBjYXB0dXJlUmVzdWx0Lm1QaHlzaWNhbE1ldGFkYXRhcykgeworICAgICAgICBTdHJpbmc4IGNhbWVyYUlkOChwaHlzaWNhbE1ldGFkYXRhLm1QaHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgaWYgKG1EaXN0b3J0aW9uTWFwcGVycy5maW5kKGNhbWVyYUlkOC5jX3N0cigpKSA9PSBtRGlzdG9ydGlvbk1hcHBlcnMuZW5kKCkpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHJlcyA9IG1EaXN0b3J0aW9uTWFwcGVyc1tjYW1lcmFJZDguY19zdHIoKV0uY29ycmVjdENhcHR1cmVSZXN1bHQoCisgICAgICAgICAgICAgICAgJnBoeXNpY2FsTWV0YWRhdGEubVBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBTRVRfRVJSKCJVbmFibGUgdG8gY29ycmVjdCBwaHlzaWNhbCBjYXB0dXJlIHJlc3VsdCBtZXRhZGF0YSBmb3IgZnJhbWUgJWQ6ICVzICglZCkiLAorICAgICAgICAgICAgICAgICAgICBmcmFtZU51bWJlciwgc3RyZXJyb3IocmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KIAorICAgIC8vIEZpeCB1cCByZXN1bHQgbWV0YWRhdGEgZm9yIG1vbm9jaHJvbWUgY2FtZXJhLgorICAgIHJlcyA9IGZpeHVwTW9ub2Nocm9tZVRhZ3MobURldmljZUluZm8sIGNhcHR1cmVSZXN1bHQubU1ldGFkYXRhKTsKKyAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgIFNFVF9FUlIoIkZhaWxlZCB0byBvdmVycmlkZSByZXN1bHQgbWV0YWRhdGE6ICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBmb3IgKGF1dG8mIHBoeXNpY2FsTWV0YWRhdGEgOiBjYXB0dXJlUmVzdWx0Lm1QaHlzaWNhbE1ldGFkYXRhcykgeworICAgICAgICBTdHJpbmc4IGNhbWVyYUlkOChwaHlzaWNhbE1ldGFkYXRhLm1QaHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgcmVzID0gZml4dXBNb25vY2hyb21lVGFncyhtUGh5c2ljYWxEZXZpY2VJbmZvTWFwLmF0KGNhbWVyYUlkOC5jX3N0cigpKSwKKyAgICAgICAgICAgICAgICBwaHlzaWNhbE1ldGFkYXRhLm1QaHlzaWNhbENhbWVyYU1ldGFkYXRhKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgU0VUX0VSUigiRmFpbGVkIHRvIG92ZXJyaWRlIHJlc3VsdCBtZXRhZGF0YTogJXMgKCVkKSIsIHN0cmVycm9yKC1yZXMpLCByZXMpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBDYW1lcmFNZXRhZGF0YT4gbW9uaXRvcmVkUGh5c2ljYWxNZXRhZGF0YTsKKyAgICBmb3IgKGF1dG8mIG0gOiBwaHlzaWNhbE1ldGFkYXRhcykgeworICAgICAgICBtb25pdG9yZWRQaHlzaWNhbE1ldGFkYXRhLmVtcGxhY2UoU3RyaW5nOChtLm1QaHlzaWNhbENhbWVyYUlkKS5zdHJpbmcoKSwKKyAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YShtLm1QaHlzaWNhbENhbWVyYU1ldGFkYXRhKSk7CisgICAgfQogICAgIG1UYWdNb25pdG9yLm1vbml0b3JNZXRhZGF0YShUYWdNb25pdG9yOjpSRVNVTFQsCi0gICAgICAgICAgICBmcmFtZU51bWJlciwgdGltZXN0YW1wLmRhdGEuaTY0WzBdLCBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSk7CisgICAgICAgICAgICBmcmFtZU51bWJlciwgdGltZXN0YW1wLmRhdGEuaTY0WzBdLCBjYXB0dXJlUmVzdWx0Lm1NZXRhZGF0YSwKKyAgICAgICAgICAgIG1vbml0b3JlZFBoeXNpY2FsTWV0YWRhdGEpOwogCiAgICAgaW5zZXJ0UmVzdWx0TG9ja2VkKCZjYXB0dXJlUmVzdWx0LCBmcmFtZU51bWJlcik7CiB9CkBAIC0zMjA2LDggKzM3NDIsMTAgQEAKICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXBwZW5kQXJyYXkocmVzdWx0LT5vdXRwdXRfYnVmZmVycywKICAgICAgICAgICAgICAgICByZXN1bHQtPm51bV9vdXRwdXRfYnVmZmVycyk7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcgPSAhKHJlcXVlc3QuenNsQ2FwdHVyZSB8fCByZXF1ZXN0Lmhhc0lucHV0QnVmZmVyKTsKICAgICAgICAgICAgIHJldHVybk91dHB1dEJ1ZmZlcnMocmVzdWx0LT5vdXRwdXRfYnVmZmVycywKLSAgICAgICAgICAgICAgICByZXN1bHQtPm51bV9vdXRwdXRfYnVmZmVycywgc2h1dHRlclRpbWVzdGFtcCk7CisgICAgICAgICAgICAgICAgcmVzdWx0LT5udW1fb3V0cHV0X2J1ZmZlcnMsIHNodXR0ZXJUaW1lc3RhbXAsIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgICAgICAgICAgcmVxdWVzdC5vdXRwdXRTdXJmYWNlcywgcmVxdWVzdC5yZXN1bHRFeHRyYXMpOwogICAgICAgICB9CiAKICAgICAgICAgaWYgKHJlc3VsdC0+cmVzdWx0ICE9IE5VTEwgJiYgIWlzUGFydGlhbFJlc3VsdCkgewpAQCAtMzIyMCwxMiArMzc1OCwxMyBAQAogICAgICAgICAgICAgaWYgKHNodXR0ZXJUaW1lc3RhbXAgPT0gMCkgewogICAgICAgICAgICAgICAgIHJlcXVlc3QucGVuZGluZ01ldGFkYXRhID0gcmVzdWx0LT5yZXN1bHQ7CiAgICAgICAgICAgICAgICAgcmVxdWVzdC5jb2xsZWN0ZWRQYXJ0aWFsUmVzdWx0ID0gY29sbGVjdGVkUGFydGlhbFJlc3VsdDsKLSAgICAgICAgICAgfSBlbHNlIGlmIChyZXF1ZXN0Lmhhc0NhbGxiYWNrKSB7CisgICAgICAgICAgICB9IGVsc2UgaWYgKHJlcXVlc3QuaGFzQ2FsbGJhY2spIHsKICAgICAgICAgICAgICAgICBDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKICAgICAgICAgICAgICAgICBtZXRhZGF0YSA9IHJlc3VsdC0+cmVzdWx0OwogICAgICAgICAgICAgICAgIHNlbmRDYXB0dXJlUmVzdWx0KG1ldGFkYXRhLCByZXF1ZXN0LnJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkUGFydGlhbFJlc3VsdCwgZnJhbWVOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVySW5SZXF1ZXN0LCByZXF1ZXN0LnBoeXNpY2FsTWV0YWRhdGFzKTsKKyAgICAgICAgICAgICAgICAgICAgaGFzSW5wdXRCdWZmZXJJblJlcXVlc3QsIHJlcXVlc3QuenNsQ2FwdHVyZSAmJiByZXF1ZXN0LnN0aWxsQ2FwdHVyZSwKKyAgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5waHlzaWNhbE1ldGFkYXRhcyk7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzMwNSwxMCArMzg0NCwxMiBAQAogICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9JTlZBTElEX0VSUk9SOwogCiAgICAgaW50IHN0cmVhbUlkID0gMDsKKyAgICBTdHJpbmcxNiBwaHlzaWNhbENhbWVyYUlkOwogICAgIGlmIChtc2cuZXJyb3Jfc3RyZWFtICE9IE5VTEwpIHsKICAgICAgICAgQ2FtZXJhM1N0cmVhbSAqc3RyZWFtID0KICAgICAgICAgICAgICAgICBDYW1lcmEzU3RyZWFtOjpjYXN0KG1zZy5lcnJvcl9zdHJlYW0pOwogICAgICAgICBzdHJlYW1JZCA9IHN0cmVhbS0+Z2V0SWQoKTsKKyAgICAgICAgcGh5c2ljYWxDYW1lcmFJZCA9IFN0cmluZzE2KHN0cmVhbS0+cGh5c2ljYWxDYW1lcmFJZCgpKTsKICAgICB9CiAgICAgQUxPR1YoIkNhbWVyYSAlczogJXM6IEhBTCBlcnJvciwgZnJhbWUgJWQsIHN0cmVhbSAlZDogJWQiLAogICAgICAgICAgICAgbUlkLnN0cmluZygpLCBfX0ZVTkNUSU9OX18sIG1zZy5mcmFtZV9udW1iZXIsCkBAIC0zMzMwLDE2ICszODcxLDM1IEBACiAgICAgICAgICAgICAgICAgICAgIEluRmxpZ2h0UmVxdWVzdCAmciA9IG1JbkZsaWdodE1hcC5lZGl0VmFsdWVBdChpZHgpOwogICAgICAgICAgICAgICAgICAgICByLnJlcXVlc3RTdGF0dXMgPSBtc2cuZXJyb3JfY29kZTsKICAgICAgICAgICAgICAgICAgICAgcmVzdWx0RXh0cmFzID0gci5yZXN1bHRFeHRyYXM7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFU1VMVCA9PSBlcnJvckNvZGUKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBsb2dpY2FsRGV2aWNlUmVzdWx0RXJyb3IgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfUkVTVUxUID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JDb2RlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocGh5c2ljYWxDYW1lcmFJZC5zaXplKCkgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nOCBjYW1lcmFJZChwaHlzaWNhbENhbWVyYUlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoci5waHlzaWNhbENhbWVyYUlkcy5maW5kKGNhbWVyYUlkKSA9PSByLnBoeXNpY2FsQ2FtZXJhSWRzLmVuZCgpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFMT0dFKCIlczogUmVwb3J0ZWQgcmVzdWx0IGZhaWx1cmUgZm9yIHBoeXNpY2FsIGNhbWVyYSBkZXZpY2U6ICVzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIHdoaWNoIGlzIG5vdCBwYXJ0IG9mIHRoZSByZXNwZWN0aXZlIHJlcXVlc3QhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGNhbWVyYUlkLnN0cmluZygpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcy5lcnJvclBoeXNpY2FsQ2FtZXJhSWQgPSBwaHlzaWNhbENhbWVyYUlkOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dpY2FsRGV2aWNlUmVzdWx0RXJyb3IgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ2ljYWxEZXZpY2VSZXN1bHRFcnJvcgogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8ICBoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1QgPT0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHIuc2tpcFJlc3VsdE1ldGFkYXRhID0gdHJ1ZTsKICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpZiAoaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9SRVNVTFQgPT0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvckNvZGUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxvZ2ljYWxEZXZpY2VSZXN1bHRFcnJvcikgewogICAgICAgICAgICAgICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiBtaXNzaW5nIHJlc3VsdCBjaGVjayB3aGV0aGVyIHRoZSBidWZmZXJzCiAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm5lZC4gSWYgdGhleSByZXR1cm5lZCwgdGhlbiByZW1vdmUgaW5mbGlnaHQKICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBzaG91bGQgd2UgY2FsbCB0aGlzIGZvciBFUlJPUl9DQU1FUkFfUkVRVUVTVCBhcyB3ZWxsPworICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgb3RoZXJ3aXNlIHdlIGFyZSBkZXBlbmRpbmcgb24gSEFMIHRvIHNlbmQgdGhlIGJ1ZmZlcnMgYmFjayBhZnRlcgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgY2FsbGluZyBub3RpZnlFcnJvci4gTm90IHN1cmUgaWYgdGhhdCdzIGluIHRoZSBzcGVjLgogICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlSW5GbGlnaHRSZXF1ZXN0SWZSZWFkeUxvY2tlZChpZHgpOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKQEAgLTMzODIsMTIgKzM5NDIsMjAgQEAKICAgICAgICAgICAgICAgICAvLyBUT0RPOiBuZWVkIHRvIHRyYWNrIGVycm9ycyBmb3IgdGlnaHRlciBib3VuZHMgb24gZXhwZWN0ZWQgZnJhbWUgbnVtYmVyLgogICAgICAgICAgICAgICAgIGlmIChyLmhhc0lucHV0QnVmZmVyKSB7CiAgICAgICAgICAgICAgICAgICAgIGlmIChtc2cuZnJhbWVfbnVtYmVyIDwgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9FUlIoIlNodXR0ZXIgbm90aWZpY2F0aW9uIG91dC1vZi1vcmRlci4gRXhwZWN0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICAgU0VUX0VSUigiUmVwcm9jZXNzIHNodXR0ZXIgbm90aWZpY2F0aW9uIG91dC1vZi1vcmRlci4gRXhwZWN0ZWQgIgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibm90aWZpY2F0aW9uIGZvciBmcmFtZSAlZCwgZ290IGZyYW1lICVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbU5leHRSZXByb2Nlc3NTaHV0dGVyRnJhbWVOdW1iZXIsIG1zZy5mcmFtZV9udW1iZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgIG1OZXh0UmVwcm9jZXNzU2h1dHRlckZyYW1lTnVtYmVyID0gbXNnLmZyYW1lX251bWJlciArIDE7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmIChyLnpzbENhcHR1cmUgJiYgci5zdGlsbENhcHR1cmUpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1zZy5mcmFtZV9udW1iZXIgPCBtTmV4dFpzbFN0aWxsU2h1dHRlckZyYW1lTnVtYmVyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBTRVRfRVJSKCJaU0wgc3RpbGwgY2FwdHVyZSBzaHV0dGVyIG5vdGlmaWNhdGlvbiBvdXQtb2Ytb3JkZXIuIEV4cGVjdGVkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5vdGlmaWNhdGlvbiBmb3IgZnJhbWUgJWQsIGdvdCBmcmFtZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIsIG1zZy5mcmFtZV9udW1iZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1OZXh0WnNsU3RpbGxTaHV0dGVyRnJhbWVOdW1iZXIgPSBtc2cuZnJhbWVfbnVtYmVyICsgMTsKICAgICAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgICAgICBpZiAobXNnLmZyYW1lX251bWJlciA8IG1OZXh0U2h1dHRlckZyYW1lTnVtYmVyKSB7CiAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfRVJSKCJTaHV0dGVyIG5vdGlmaWNhdGlvbiBvdXQtb2Ytb3JkZXIuIEV4cGVjdGVkICIKQEAgLTM0MTEsMTAgKzM5NzksMTMgQEAKICAgICAgICAgICAgICAgICAvLyBzZW5kIHBlbmRpbmcgcmVzdWx0IGFuZCBidWZmZXJzCiAgICAgICAgICAgICAgICAgc2VuZENhcHR1cmVSZXN1bHQoci5wZW5kaW5nTWV0YWRhdGEsIHIucmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgICAgICAgICByLmNvbGxlY3RlZFBhcnRpYWxSZXN1bHQsIG1zZy5mcmFtZV9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgIHIuaGFzSW5wdXRCdWZmZXIsIHIucGh5c2ljYWxNZXRhZGF0YXMpOworICAgICAgICAgICAgICAgICAgICByLmhhc0lucHV0QnVmZmVyLCByLnpzbENhcHR1cmUgJiYgci5zdGlsbENhcHR1cmUsCisgICAgICAgICAgICAgICAgICAgIHIucGh5c2ljYWxNZXRhZGF0YXMpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gIShyLnpzbENhcHR1cmUgfHwgci5oYXNJbnB1dEJ1ZmZlcik7CiAgICAgICAgICAgICByZXR1cm5PdXRwdXRCdWZmZXJzKHIucGVuZGluZ091dHB1dEJ1ZmZlcnMuYXJyYXkoKSwKLSAgICAgICAgICAgICAgICByLnBlbmRpbmdPdXRwdXRCdWZmZXJzLnNpemUoKSwgci5zaHV0dGVyVGltZXN0YW1wKTsKKyAgICAgICAgICAgICAgICAgICAgci5wZW5kaW5nT3V0cHV0QnVmZmVycy5zaXplKCksIHIuc2h1dHRlclRpbWVzdGFtcCwgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgICAgICAgICAgICAgci5vdXRwdXRTdXJmYWNlcywgci5yZXN1bHRFeHRyYXMpOwogICAgICAgICAgICAgci5wZW5kaW5nT3V0cHV0QnVmZmVycy5jbGVhcigpOwogCiAgICAgICAgICAgICByZW1vdmVJbkZsaWdodFJlcXVlc3RJZlJlYWR5TG9ja2VkKGlkeCk7CkBAIC0zNDQwLDggKzQwMTEsMTEgQEAKIAogCiB2b2lkIENhbWVyYTNEZXZpY2U6Om1vbml0b3JNZXRhZGF0YShUYWdNb25pdG9yOjpldmVudFNvdXJjZSBzb3VyY2UsCi0gICAgICAgIGludDY0X3QgZnJhbWVOdW1iZXIsIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEpIHsKLSAgICBtVGFnTW9uaXRvci5tb25pdG9yTWV0YWRhdGEoc291cmNlLCBmcmFtZU51bWJlciwgdGltZXN0YW1wLCBtZXRhZGF0YSk7CisgICAgICAgIGludDY0X3QgZnJhbWVOdW1iZXIsIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCisgICAgICAgIGNvbnN0IHN0ZDo6dW5vcmRlcmVkX21hcDxzdGQ6OnN0cmluZywgQ2FtZXJhTWV0YWRhdGE+JiBwaHlzaWNhbE1ldGFkYXRhKSB7CisKKyAgICBtVGFnTW9uaXRvci5tb25pdG9yTWV0YWRhdGEoc291cmNlLCBmcmFtZU51bWJlciwgdGltZXN0YW1wLCBtZXRhZGF0YSwKKyAgICAgICAgICAgIHBoeXNpY2FsTWV0YWRhdGEpOwogfQogCiAvKioKQEAgLTM0NTAsMTEgKzQwMjQsMTggQEAKIAogQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpIYWxJbnRlcmZhY2UoCiAgICAgICAgICAgICBzcDxJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gJnNlc3Npb24sCi0gICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlKSA6CisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlLAorICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKSA6CiAgICAgICAgIG1IaWRsU2Vzc2lvbihzZXNzaW9uKSwKLSAgICAgICAgbVJlcXVlc3RNZXRhZGF0YVF1ZXVlKHF1ZXVlKSB7CisgICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShxdWV1ZSksCisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKHVzZUhhbEJ1Zk1hbmFnZXIpLAorICAgICAgICBtSXNSZWNvbmZpZ3VyYXRpb25RdWVyeVN1cHBvcnRlZCh0cnVlKSB7CiAgICAgLy8gQ2hlY2sgd2l0aCBoYXJkd2FyZSBzZXJ2aWNlIG1hbmFnZXIgaWYgd2UgY2FuIGRvd25jYXN0IHRoZXNlIGludGVyZmFjZXMKICAgICAvLyBTb21ld2hhdCBleHBlbnNpdmUsIHNvIGNhY2hlIHRoZSByZXN1bHRzIGF0IHN0YXJ0dXAKKyAgICBhdXRvIGNhc3RSZXN1bHRfM181ID0gZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbjo6Y2FzdEZyb20obUhpZGxTZXNzaW9uKTsKKyAgICBpZiAoY2FzdFJlc3VsdF8zXzUuaXNPaygpKSB7CisgICAgICAgIG1IaWRsU2Vzc2lvbl8zXzUgPSBjYXN0UmVzdWx0XzNfNTsKKyAgICB9CiAgICAgYXV0byBjYXN0UmVzdWx0XzNfNCA9IGRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZVNlc3Npb246OmNhc3RGcm9tKG1IaWRsU2Vzc2lvbik7CiAgICAgaWYgKGNhc3RSZXN1bHRfM180LmlzT2soKSkgewogICAgICAgICBtSGlkbFNlc3Npb25fM180ID0gY2FzdFJlc3VsdF8zXzQ7CkBAIC0zNDY1LDI2ICs0MDQ2LDI0IEBACiAgICAgfQogfQogCi1DYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OkhhbEludGVyZmFjZSgpIHt9CitDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OkhhbEludGVyZmFjZSgpIDogbVVzZUhhbEJ1Zk1hbmFnZXIoZmFsc2UpIHt9CiAKIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6SGFsSW50ZXJmYWNlKGNvbnN0IEhhbEludGVyZmFjZSYgb3RoZXIpIDoKICAgICAgICAgbUhpZGxTZXNzaW9uKG90aGVyLm1IaWRsU2Vzc2lvbiksCi0gICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShvdGhlci5tUmVxdWVzdE1ldGFkYXRhUXVldWUpIHt9CisgICAgICAgIG1SZXF1ZXN0TWV0YWRhdGFRdWV1ZShvdGhlci5tUmVxdWVzdE1ldGFkYXRhUXVldWUpLAorICAgICAgICBtVXNlSGFsQnVmTWFuYWdlcihvdGhlci5tVXNlSGFsQnVmTWFuYWdlcikge30KIAogYm9vbCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnZhbGlkKCkgewogICAgIHJldHVybiAobUhpZGxTZXNzaW9uICE9IG51bGxwdHIpOwogfQogCiB2b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6Y2xlYXIoKSB7CisgICAgbUhpZGxTZXNzaW9uXzNfNS5jbGVhcigpOwogICAgIG1IaWRsU2Vzc2lvbl8zXzQuY2xlYXIoKTsKICAgICBtSGlkbFNlc3Npb25fM18zLmNsZWFyKCk7CiAgICAgbUhpZGxTZXNzaW9uLmNsZWFyKCk7CiB9CiAKLWJvb2wgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpzdXBwb3J0QmF0Y2hSZXF1ZXN0KCkgewotICAgIHJldHVybiBtSGlkbFNlc3Npb24gIT0gbnVsbHB0cjsKLX0KLQogc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpjb25zdHJ1Y3REZWZhdWx0UmVxdWVzdFNldHRpbmdzKAogICAgICAgICBjYW1lcmEzX3JlcXVlc3RfdGVtcGxhdGVfdCB0ZW1wbGF0ZUlkLAogICAgICAgICAvKm91dCovIGNhbWVyYV9tZXRhZGF0YV90ICoqcmVxdWVzdFRlbXBsYXRlKSB7CkBAIC0zNTUyLDYgKzQxMzEsNTIgQEAKICAgICByZXR1cm4gcmVzOwogfQogCitib29sIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6aXNSZWNvbmZpZ3VyYXRpb25SZXF1aXJlZChDYW1lcmFNZXRhZGF0YSYgb2xkU2Vzc2lvblBhcmFtcywKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGEmIG5ld1Nlc3Npb25QYXJhbXMpIHsKKyAgICAvLyBXZSBkbyByZWNvbmZpZ3VyYXRpb24gYnkgZGVmYXVsdDsKKyAgICBib29sIHJldCA9IHRydWU7CisgICAgaWYgKChtSGlkbFNlc3Npb25fM181ICE9IG51bGxwdHIpICYmIG1Jc1JlY29uZmlndXJhdGlvblF1ZXJ5U3VwcG9ydGVkKSB7CisgICAgICAgIGFuZHJvaWQ6OmhhcmR3YXJlOjpoaWRsX3ZlYzx1aW50OF90PiBvbGRQYXJhbXMsIG5ld1BhcmFtczsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QqIG9sZFNlc3Npb01ldGEgPSBjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90Kj4oCisgICAgICAgICAgICAgICAgb2xkU2Vzc2lvblBhcmFtcy5nZXRBbmRMb2NrKCkpOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogbmV3U2Vzc2lvTWV0YSA9IGNvbnN0X2Nhc3Q8Y2FtZXJhX21ldGFkYXRhX3QqPigKKyAgICAgICAgICAgICAgICBuZXdTZXNzaW9uUGFyYW1zLmdldEFuZExvY2soKSk7CisgICAgICAgIG9sZFBhcmFtcy5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG9sZFNlc3Npb01ldGEpLAorICAgICAgICAgICAgICAgIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShvbGRTZXNzaW9NZXRhKSk7CisgICAgICAgIG5ld1BhcmFtcy5zZXRUb0V4dGVybmFsKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCo+KG5ld1Nlc3Npb01ldGEpLAorICAgICAgICAgICAgICAgIGdldF9jYW1lcmFfbWV0YWRhdGFfc2l6ZShuZXdTZXNzaW9NZXRhKSk7CisgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmNvbW1vbjo6VjFfMDo6U3RhdHVzIGNhbGxTdGF0dXM7CisgICAgICAgIGJvb2wgcmVxdWlyZWQ7CisgICAgICAgIGF1dG8gaGlkbENiID0gWyZjYWxsU3RhdHVzLCAmcmVxdWlyZWRdIChoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1cyBzLAorICAgICAgICAgICAgICAgIGJvb2wgcmVxdWlyZWRGbGFnKSB7CisgICAgICAgICAgICBjYWxsU3RhdHVzID0gczsKKyAgICAgICAgICAgIHJlcXVpcmVkID0gcmVxdWlyZWRGbGFnOworICAgICAgICB9OworICAgICAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzUtPmlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQob2xkUGFyYW1zLCBuZXdQYXJhbXMsIGhpZGxDYik7CisgICAgICAgIG9sZFNlc3Npb25QYXJhbXMudW5sb2NrKG9sZFNlc3Npb01ldGEpOworICAgICAgICBuZXdTZXNzaW9uUGFyYW1zLnVubG9jayhuZXdTZXNzaW9NZXRhKTsKKyAgICAgICAgaWYgKGVyci5pc09rKCkpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoY2FsbFN0YXR1cykgeworICAgICAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpTdGF0dXM6Ok9LOgorICAgICAgICAgICAgICAgICAgICByZXQgPSByZXF1aXJlZDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBoYXJkd2FyZTo6Y2FtZXJhOjpjb21tb246OlYxXzA6OlN0YXR1czo6TUVUSE9EX05PVF9TVVBQT1JURUQ6CisgICAgICAgICAgICAgICAgICAgIG1Jc1JlY29uZmlndXJhdGlvblF1ZXJ5U3VwcG9ydGVkID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIHJldCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIEFMT0dWKCIlczogUmVjb25maWd1cmF0aW9uIHF1ZXJ5IGZhaWxlZDogJWQiLCBfX0ZVTkNUSU9OX18sIGNhbGxTdGF0dXMpOworICAgICAgICAgICAgICAgICAgICByZXQgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBVbmV4cGVjdGVkIGJpbmRlciBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgICAgICAgICAgcmV0ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKIHN0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6Y29uZmlndXJlU3RyZWFtcyhjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc2Vzc2lvblBhcmFtcywKICAgICAgICAgY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbiAqY29uZmlnLCBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4mIGJ1ZmZlclNpemVzKSB7CiAgICAgQVRSQUNFX05BTUUoIkNhbWVyYUhhbDo6Y29uZmlndXJlU3RyZWFtcyIpOwpAQCAtMzU4OSwxMCArNDIxNCwxOSBAQAogICAgICAgICBkc3QzXzIuc3RyZWFtVHlwZSA9IHN0cmVhbVR5cGU7CiAgICAgICAgIGRzdDNfMi53aWR0aCA9IHNyYy0+d2lkdGg7CiAgICAgICAgIGRzdDNfMi5oZWlnaHQgPSBzcmMtPmhlaWdodDsKLSAgICAgICAgZHN0M18yLmZvcm1hdCA9IG1hcFRvUGl4ZWxGb3JtYXQoc3JjLT5mb3JtYXQpOwogICAgICAgICBkc3QzXzIudXNhZ2UgPSBtYXBUb0NvbnN1bWVyVXNhZ2UoY2FtM3N0cmVhbS0+Z2V0VXNhZ2UoKSk7Ci0gICAgICAgIGRzdDNfMi5kYXRhU3BhY2UgPSBtYXBUb0hpZGxEYXRhc3BhY2Uoc3JjLT5kYXRhX3NwYWNlKTsKICAgICAgICAgZHN0M18yLnJvdGF0aW9uID0gbWFwVG9TdHJlYW1Sb3RhdGlvbigoY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCkgc3JjLT5yb3RhdGlvbik7CisgICAgICAgIC8vIEZvciBIaWRsU2Vzc2lvbiB2ZXJzaW9uIDMuNSBvciBuZXdlciwgdGhlIGZvcm1hdCBhbmQgZGF0YVNwYWNlIHNlbnQKKyAgICAgICAgLy8gdG8gSEFMIGFyZSBvcmlnaW5hbCwgbm90IHRoZSBvdmVycmlkZW4gb25lcy4KKyAgICAgICAgaWYgKG1IaWRsU2Vzc2lvbl8zXzUgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgZHN0M18yLmZvcm1hdCA9IG1hcFRvUGl4ZWxGb3JtYXQoY2FtM3N0cmVhbS0+aXNGb3JtYXRPdmVycmlkZGVuKCkgPworICAgICAgICAgICAgICAgICAgICBjYW0zc3RyZWFtLT5nZXRPcmlnaW5hbEZvcm1hdCgpIDogc3JjLT5mb3JtYXQpOworICAgICAgICAgICAgZHN0M18yLmRhdGFTcGFjZSA9IG1hcFRvSGlkbERhdGFzcGFjZShjYW0zc3RyZWFtLT5pc0RhdGFTcGFjZU92ZXJyaWRkZW4oKSA/CisgICAgICAgICAgICAgICAgICAgIGNhbTNzdHJlYW0tPmdldE9yaWdpbmFsRGF0YVNwYWNlKCkgOiBzcmMtPmRhdGFfc3BhY2UpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZHN0M18yLmZvcm1hdCA9IG1hcFRvUGl4ZWxGb3JtYXQoc3JjLT5mb3JtYXQpOworICAgICAgICAgICAgZHN0M18yLmRhdGFTcGFjZSA9IG1hcFRvSGlkbERhdGFzcGFjZShzcmMtPmRhdGFfc3BhY2UpOworICAgICAgICB9CiAgICAgICAgIGRzdDNfNC52M18yID0gZHN0M18yOwogICAgICAgICBkc3QzXzQuYnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemVzW2ldOwogICAgICAgICBpZiAoc3JjLT5waHlzaWNhbF9jYW1lcmFfaWQgIT0gbnVsbHB0cikgewpAQCAtMzYzMSwyNiArNDI2NSw0OCBAQAogCiAgICAgLy8gSW52b2tlIGNvbmZpZ3VyZVN0cmVhbXMKICAgICBkZXZpY2U6OlYzXzM6OkhhbFN0cmVhbUNvbmZpZ3VyYXRpb24gZmluYWxDb25maWd1cmF0aW9uOworICAgIGRldmljZTo6VjNfNDo6SGFsU3RyZWFtQ29uZmlndXJhdGlvbiBmaW5hbENvbmZpZ3VyYXRpb24zXzQ7CiAgICAgY29tbW9uOjpWMV8wOjpTdGF0dXMgc3RhdHVzOwogCi0gICAgLy8gU2VlIGlmIHdlIGhhdmUgdjMuNCBvciB2My4zIEhBTAotICAgIGlmIChtSGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKLSAgICAgICAgLy8gV2UgZG87IHVzZSB2My40IGZvciB0aGUgY2FsbAotICAgICAgICBBTE9HVigiJXM6IHYzLjQgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKLSAgICAgICAgZGV2aWNlOjpWM180OjpIYWxTdHJlYW1Db25maWd1cmF0aW9uIGZpbmFsQ29uZmlndXJhdGlvbjNfNDsKLSAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM180LT5jb25maWd1cmVTdHJlYW1zXzNfNChyZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180LAotICAgICAgICAgICAgWyZzdGF0dXMsICZmaW5hbENvbmZpZ3VyYXRpb24zXzRdCisgICAgYXV0byBjb25maWdTdHJlYW0zNENiID0gWyZzdGF0dXMsICZmaW5hbENvbmZpZ3VyYXRpb24zXzRdCiAgICAgICAgICAgICAoY29tbW9uOjpWMV8wOjpTdGF0dXMgcywgY29uc3QgZGV2aWNlOjpWM180OjpIYWxTdHJlYW1Db25maWd1cmF0aW9uJiBoYWxDb25maWd1cmF0aW9uKSB7CiAgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uM180ID0gaGFsQ29uZmlndXJhdGlvbjsKICAgICAgICAgICAgICAgICBzdGF0dXMgPSBzOwotICAgICAgICAgICAgfSk7Ci0gICAgICAgIGlmICghZXJyLmlzT2soKSkgewotICAgICAgICAgICAgQUxPR0UoIiVzOiBUcmFuc2FjdGlvbiBlcnJvcjogJXMiLCBfX0ZVTkNUSU9OX18sIGVyci5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOwotICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICAgICAgfTsKKworICAgIGF1dG8gcG9zdHByb2NDb25maWdTdHJlYW0zNCA9IFsmZmluYWxDb25maWd1cmF0aW9uLCAmZmluYWxDb25maWd1cmF0aW9uM180XQorICAgICAgICAgICAgKGhhcmR3YXJlOjpSZXR1cm48dm9pZD4mIGVycikgLT4gc3RhdHVzX3QgeworICAgICAgICAgICAgICAgIGlmICghZXJyLmlzT2soKSkgeworICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFRyYW5zYWN0aW9uIGVycm9yOiAlcyIsIF9fRlVOQ1RJT05fXywgZXJyLmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMucmVzaXplKGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zLnNpemUoKSk7CisgICAgICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCk7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXSA9IGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zW2ldLnYzXzM7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiBPSzsKKyAgICAgICAgICAgIH07CisKKyAgICAvLyBTZWUgd2hpY2ggdmVyc2lvbiBvZiBIQUwgd2UgaGF2ZQorICAgIGlmIChtSGlkbFNlc3Npb25fM181ICE9IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR1YoIiVzOiB2My41IGRldmljZSBmb3VuZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIGRldmljZTo6VjNfNTo6U3RyZWFtQ29uZmlndXJhdGlvbiByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181OworICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181LnYzXzQgPSByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180OworICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181LnN0cmVhbUNvbmZpZ0NvdW50ZXIgPSBtTmV4dFN0cmVhbUNvbmZpZ0NvdW50ZXIrKzsKKyAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM181LT5jb25maWd1cmVTdHJlYW1zXzNfNSgKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM181LCBjb25maWdTdHJlYW0zNENiKTsKKyAgICAgICAgcmVzID0gcG9zdHByb2NDb25maWdTdHJlYW0zNChlcnIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0gICAgICAgIGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnJlc2l6ZShmaW5hbENvbmZpZ3VyYXRpb24zXzQuc3RyZWFtcy5zaXplKCkpOwotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tpXSA9IGZpbmFsQ29uZmlndXJhdGlvbjNfNC5zdHJlYW1zW2ldLnYzXzM7CisgICAgfSBlbHNlIGlmIChtSGlkbFNlc3Npb25fM180ICE9IG51bGxwdHIpIHsKKyAgICAgICAgLy8gV2UgZG87IHVzZSB2My40IGZvciB0aGUgY2FsbAorICAgICAgICBBTE9HVigiJXM6IHYzLjQgZGV2aWNlIGZvdW5kIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgYXV0byBlcnIgPSBtSGlkbFNlc3Npb25fM180LT5jb25maWd1cmVTdHJlYW1zXzNfNCgKKyAgICAgICAgICAgICAgICByZXF1ZXN0ZWRDb25maWd1cmF0aW9uM180LCBjb25maWdTdHJlYW0zNENiKTsKKyAgICAgICAgcmVzID0gcG9zdHByb2NDb25maWdTdHJlYW0zNChlcnIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9CiAgICAgfSBlbHNlIGlmIChtSGlkbFNlc3Npb25fM18zICE9IG51bGxwdHIpIHsKICAgICAgICAgLy8gV2UgZG87IHVzZSB2My4zIGZvciB0aGUgY2FsbApAQCAtMzcwMCwxMiArNDM1NiwxMyBAQAogICAgICAgICAvLyBTdGFydCBzY2FuIGF0IGksIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgc3RyZWFtIG9yZGVyIG1hdGNoZXMKICAgICAgICAgc2l6ZV90IHJlYWxJZHggPSBpOwogICAgICAgICBib29sIGZvdW5kID0gZmFsc2U7Ci0gICAgICAgIGZvciAoc2l6ZV90IGlkeCA9IDA7IGlkeCA8IGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnNpemUoKTsgaWR4KyspIHsKKyAgICAgICAgc2l6ZV90IGhhbFN0cmVhbUNvdW50ID0gZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXMuc2l6ZSgpOworICAgICAgICBmb3IgKHNpemVfdCBpZHggPSAwOyBpZHggPCBoYWxTdHJlYW1Db3VudDsgaWR4KyspIHsKICAgICAgICAgICAgIGlmIChmaW5hbENvbmZpZ3VyYXRpb24uc3RyZWFtc1tyZWFsSWR4XS52M18yLmlkID09IHN0cmVhbUlkKSB7CiAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQotICAgICAgICAgICAgcmVhbElkeCA9IChyZWFsSWR4ID49IGZpbmFsQ29uZmlndXJhdGlvbi5zdHJlYW1zLnNpemUoKSkgPyAwIDogcmVhbElkeCArIDE7CisgICAgICAgICAgICByZWFsSWR4ID0gKHJlYWxJZHggPj0gaGFsU3RyZWFtQ291bnQgLSAxKSA/IDAgOiByZWFsSWR4ICsgMTsKICAgICAgICAgfQogICAgICAgICBpZiAoIWZvdW5kKSB7CiAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZCBub3QgZm91bmQgaW4gc3RyZWFtIGNvbmZpZ3VyYXRpb24gcmVzcG9uc2UgZnJvbSBIQUwiLApAQCAtMzcxNSwxMiArNDM3MiwxMiBAQAogICAgICAgICBkZXZpY2U6OlYzXzM6OkhhbFN0cmVhbSAmc3JjID0gZmluYWxDb25maWd1cmF0aW9uLnN0cmVhbXNbcmVhbElkeF07CiAKICAgICAgICAgQ2FtZXJhM1N0cmVhbSogZHN0U3RyZWFtID0gQ2FtZXJhM1N0cmVhbTo6Y2FzdChkc3QpOwotICAgICAgICBkc3RTdHJlYW0tPnNldEZvcm1hdE92ZXJyaWRlKGZhbHNlKTsKLSAgICAgICAgZHN0U3RyZWFtLT5zZXREYXRhU3BhY2VPdmVycmlkZShmYWxzZSk7CiAgICAgICAgIGludCBvdmVycmlkZUZvcm1hdCA9IG1hcFRvRnJhbWV3b3JrRm9ybWF0KHNyYy52M18yLm92ZXJyaWRlRm9ybWF0KTsKICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2Ugb3ZlcnJpZGVEYXRhU3BhY2UgPSBtYXBUb0ZyYW1ld29ya0RhdGFzcGFjZShzcmMub3ZlcnJpZGVEYXRhU3BhY2UpOwogCi0gICAgICAgIGlmIChkc3QtPmZvcm1hdCAhPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpIHsKKyAgICAgICAgaWYgKGRzdFN0cmVhbS0+Z2V0T3JpZ2luYWxGb3JtYXQoKSAhPSBIQUxfUElYRUxfRk9STUFUX0lNUExFTUVOVEFUSU9OX0RFRklORUQpIHsKKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0Rm9ybWF0T3ZlcnJpZGUoZmFsc2UpOworICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXREYXRhU3BhY2VPdmVycmlkZShmYWxzZSk7CiAgICAgICAgICAgICBpZiAoZHN0LT5mb3JtYXQgIT0gb3ZlcnJpZGVGb3JtYXQpIHsKICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogRm9ybWF0IG92ZXJyaWRlIG5vdCBhbGxvd2VkIGZvciBmb3JtYXQgMHgleCIsIF9fRlVOQ1RJT05fXywKICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmVhbUlkLCBkc3QtPmZvcm1hdCk7CkBAIC0zNzMwLDEwICs0Mzg3LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1JZCwgZHN0LT5mb3JtYXQpOwogICAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZHN0U3RyZWFtLT5zZXRGb3JtYXRPdmVycmlkZSgoZHN0LT5mb3JtYXQgIT0gb3ZlcnJpZGVGb3JtYXQpID8gdHJ1ZSA6IGZhbHNlKTsKLSAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0RGF0YVNwYWNlT3ZlcnJpZGUoKGRzdC0+ZGF0YV9zcGFjZSAhPSBvdmVycmlkZURhdGFTcGFjZSkgPyB0cnVlIDogZmFsc2UpOwotCisgICAgICAgICAgICBib29sIG5lZWRGb3JtYXRPdmVycmlkZSA9CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIuc3RyZWFtc1tpXS5mb3JtYXQgIT0gc3JjLnYzXzIub3ZlcnJpZGVGb3JtYXQ7CisgICAgICAgICAgICBib29sIG5lZWREYXRhc3BhY2VPdmVycmlkZSA9CisgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RlZENvbmZpZ3VyYXRpb24zXzIuc3RyZWFtc1tpXS5kYXRhU3BhY2UgIT0gc3JjLm92ZXJyaWRlRGF0YVNwYWNlOwogICAgICAgICAgICAgLy8gT3ZlcnJpZGUgYWxsb3dlZCB3aXRoIElNUExFTUVOVEFUSU9OX0RFRklORUQKKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0Rm9ybWF0T3ZlcnJpZGUobmVlZEZvcm1hdE92ZXJyaWRlKTsKKyAgICAgICAgICAgIGRzdFN0cmVhbS0+c2V0RGF0YVNwYWNlT3ZlcnJpZGUobmVlZERhdGFzcGFjZU92ZXJyaWRlKTsKICAgICAgICAgICAgIGRzdC0+Zm9ybWF0ID0gb3ZlcnJpZGVGb3JtYXQ7CiAgICAgICAgICAgICBkc3QtPmRhdGFfc3BhY2UgPSBvdmVycmlkZURhdGFTcGFjZTsKICAgICAgICAgfQpAQCAtMzc2MiwxNCArNDQyMiwxNSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKLXZvaWQgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjp3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0LAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjp3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KiByZXF1ZXN0LAogICAgICAgICAvKm91dCovZGV2aWNlOjpWM18yOjpDYXB0dXJlUmVxdWVzdCogY2FwdHVyZVJlcXVlc3QsCi0gICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiogaGFuZGxlc0NyZWF0ZWQpIHsKKyAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+KiBoYW5kbGVzQ3JlYXRlZCwKKyAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4qIGluZmxpZ2h0QnVmZmVycykgewogICAgIEFUUkFDRV9DQUxMKCk7Ci0gICAgaWYgKGNhcHR1cmVSZXF1ZXN0ID09IG51bGxwdHIgfHwgaGFuZGxlc0NyZWF0ZWQgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXM6IGNhcHR1cmVSZXF1ZXN0ICglcCkgYW5kIGhhbmRsZXNDcmVhdGVkICglcCkgbXVzdCBub3QgYmUgbnVsbCIsCi0gICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBjYXB0dXJlUmVxdWVzdCwgaGFuZGxlc0NyZWF0ZWQpOwotICAgICAgICByZXR1cm47CisgICAgaWYgKGNhcHR1cmVSZXF1ZXN0ID09IG51bGxwdHIgfHwgaGFuZGxlc0NyZWF0ZWQgPT0gbnVsbHB0ciB8fCBpbmZsaWdodEJ1ZmZlcnMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGNhcHR1cmVSZXF1ZXN0ICglcCksIGhhbmRsZXNDcmVhdGVkICglcCksIGFuZCBpbmZsaWdodEJ1ZmZlcnMoJXApICIKKyAgICAgICAgICAgICAgICAibXVzdCBub3QgYmUgbnVsbCIsIF9fRlVOQ1RJT05fXywgY2FwdHVyZVJlcXVlc3QsIGhhbmRsZXNDcmVhdGVkLCBpbmZsaWdodEJ1ZmZlcnMpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwogICAgIH0KIAogICAgIGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciA9IHJlcXVlc3QtPmZyYW1lX251bWJlcjsKQEAgLTM3OTgsOCArNDQ1OSw4IEBACiAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIucmVsZWFzZUZlbmNlID0gbnVsbHB0cjsKIAogICAgICAgICAgICAgcHVzaEluZmxpZ2h0QnVmZmVyTG9ja2VkKGNhcHR1cmVSZXF1ZXN0LT5mcmFtZU51bWJlciwgc3RyZWFtSWQsCi0gICAgICAgICAgICAgICAgICAgIHJlcXVlc3QtPmlucHV0X2J1ZmZlci0+YnVmZmVyLAotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5pbnB1dF9idWZmZXItPmFjcXVpcmVfZmVuY2UpOworICAgICAgICAgICAgICAgICAgICByZXF1ZXN0LT5pbnB1dF9idWZmZXItPmJ1ZmZlcik7CisgICAgICAgICAgICBpbmZsaWdodEJ1ZmZlcnMtPnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkKSk7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+aW5wdXRCdWZmZXIuc3RyZWFtSWQgPSAtMTsKICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5pbnB1dEJ1ZmZlci5idWZmZXJJZCA9IEJVRkZFUl9JRF9OT19CVUZGRVI7CkBAIC0zODEwLDI2ICs0NDcxLDU3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCAqc3JjID0gcmVxdWVzdC0+b3V0cHV0X2J1ZmZlcnMgKyBpOwogICAgICAgICAgICAgU3RyZWFtQnVmZmVyICZkc3QgPSBjYXB0dXJlUmVxdWVzdC0+b3V0cHV0QnVmZmVyc1tpXTsKICAgICAgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBDYW1lcmEzU3RyZWFtOjpjYXN0KHNyYy0+c3RyZWFtKS0+Z2V0SWQoKTsKLSAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCBidWYgPSAqKHNyYy0+YnVmZmVyKTsKLSAgICAgICAgICAgIGF1dG8gcGFpciA9IGdldEJ1ZmZlcklkKGJ1Ziwgc3RyZWFtSWQpOwotICAgICAgICAgICAgYm9vbCBpc05ld0J1ZmZlciA9IHBhaXIuZmlyc3Q7Ci0gICAgICAgICAgICBkc3Quc3RyZWFtSWQgPSBzdHJlYW1JZDsKLSAgICAgICAgICAgIGRzdC5idWZmZXJJZCA9IHBhaXIuc2Vjb25kOwotICAgICAgICAgICAgZHN0LmJ1ZmZlciA9IGlzTmV3QnVmZmVyID8gYnVmIDogbnVsbHB0cjsKLSAgICAgICAgICAgIGRzdC5zdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok9LOwotICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICphY3F1aXJlRmVuY2UgPSBudWxscHRyOwotICAgICAgICAgICAgaWYgKHNyYy0+YWNxdWlyZV9mZW5jZSAhPSAtMSkgewotICAgICAgICAgICAgICAgIGFjcXVpcmVGZW5jZSA9IG5hdGl2ZV9oYW5kbGVfY3JlYXRlKDEsMCk7Ci0gICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlLT5kYXRhWzBdID0gc3JjLT5hY3F1aXJlX2ZlbmNlOwotICAgICAgICAgICAgICAgIGhhbmRsZXNDcmVhdGVkLT5wdXNoX2JhY2soYWNxdWlyZUZlbmNlKTsKKyAgICAgICAgICAgIGlmIChzcmMtPmJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgYnVmZmVyX2hhbmRsZV90IGJ1ZiA9ICooc3JjLT5idWZmZXIpOworICAgICAgICAgICAgICAgIGF1dG8gcGFpciA9IGdldEJ1ZmZlcklkKGJ1Ziwgc3RyZWFtSWQpOworICAgICAgICAgICAgICAgIGJvb2wgaXNOZXdCdWZmZXIgPSBwYWlyLmZpcnN0OworICAgICAgICAgICAgICAgIGRzdC5idWZmZXJJZCA9IHBhaXIuc2Vjb25kOworICAgICAgICAgICAgICAgIGRzdC5idWZmZXIgPSBpc05ld0J1ZmZlciA/IGJ1ZiA6IG51bGxwdHI7CisgICAgICAgICAgICAgICAgbmF0aXZlX2hhbmRsZV90ICphY3F1aXJlRmVuY2UgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGlmIChzcmMtPmFjcXVpcmVfZmVuY2UgIT0gLTEpIHsKKyAgICAgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlID0gbmF0aXZlX2hhbmRsZV9jcmVhdGUoMSwwKTsKKyAgICAgICAgICAgICAgICAgICAgYWNxdWlyZUZlbmNlLT5kYXRhWzBdID0gc3JjLT5hY3F1aXJlX2ZlbmNlOworICAgICAgICAgICAgICAgICAgICBoYW5kbGVzQ3JlYXRlZC0+cHVzaF9iYWNrKGFjcXVpcmVGZW5jZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRzdC5hY3F1aXJlRmVuY2UgPSBhY3F1aXJlRmVuY2U7CisgICAgICAgICAgICB9IGVsc2UgaWYgKG1Vc2VIYWxCdWZNYW5hZ2VyKSB7CisgICAgICAgICAgICAgICAgLy8gSEFMIGJ1ZmZlciBtYW5hZ2VtZW50IHBhdGgKKyAgICAgICAgICAgICAgICBkc3QuYnVmZmVySWQgPSBCVUZGRVJfSURfTk9fQlVGRkVSOworICAgICAgICAgICAgICAgIGRzdC5idWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGRzdC5hY3F1aXJlRmVuY2UgPSBudWxscHRyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGNhbm5vdCBzZW5kIGEgbnVsbCBidWZmZXIgaW4gY2FwdHVyZSByZXF1ZXN0ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRzdC5hY3F1aXJlRmVuY2UgPSBhY3F1aXJlRmVuY2U7CisgICAgICAgICAgICBkc3Quc3RyZWFtSWQgPSBzdHJlYW1JZDsKKyAgICAgICAgICAgIGRzdC5zdGF0dXMgPSBCdWZmZXJTdGF0dXM6Ok9LOwogICAgICAgICAgICAgZHN0LnJlbGVhc2VGZW5jZSA9IG51bGxwdHI7CiAKLSAgICAgICAgICAgIHB1c2hJbmZsaWdodEJ1ZmZlckxvY2tlZChjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkLAotICAgICAgICAgICAgICAgICAgICBzcmMtPmJ1ZmZlciwgc3JjLT5hY3F1aXJlX2ZlbmNlKTsKKyAgICAgICAgICAgIC8vIE91dHB1dCBidWZmZXJzIGFyZSBlbXB0eSB3aGVuIHVzaW5nIEhBTCBidWZmZXIgbWFuYWdlcgorICAgICAgICAgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgICAgIHB1c2hJbmZsaWdodEJ1ZmZlckxvY2tlZChjYXB0dXJlUmVxdWVzdC0+ZnJhbWVOdW1iZXIsIHN0cmVhbUlkLCBzcmMtPmJ1ZmZlcik7CisgICAgICAgICAgICAgICAgaW5mbGlnaHRCdWZmZXJzLT5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoY2FwdHVyZVJlcXVlc3QtPmZyYW1lTnVtYmVyLCBzdHJlYW1JZCkpOworICAgICAgICAgICAgfQogICAgICAgICB9CiAgICAgfQorICAgIHJldHVybiBPSzsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmNsZWFudXBOYXRpdmVIYW5kbGVzKAorICAgICAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiAqaGFuZGxlcywgYm9vbCBjbG9zZUZkKSB7CisgICAgaWYgKGhhbmRsZXMgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChjbG9zZUZkKSB7CisgICAgICAgIGZvciAoYXV0byYgaGFuZGxlIDogKmhhbmRsZXMpIHsKKyAgICAgICAgICAgIG5hdGl2ZV9oYW5kbGVfY2xvc2UoaGFuZGxlKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBmb3IgKGF1dG8mIGhhbmRsZSA6ICpoYW5kbGVzKSB7CisgICAgICAgIG5hdGl2ZV9oYW5kbGVfZGVsZXRlKGhhbmRsZSk7CisgICAgfQorICAgIGhhbmRsZXMtPmNsZWFyKCk7CisgICAgcmV0dXJuOwogfQogCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnByb2Nlc3NCYXRjaENhcHR1cmVSZXF1ZXN0cygKQEAgLTM4NTIsMTMgKzQ1NDQsMjEgQEAKICAgICAgICAgY2FwdHVyZVJlcXVlc3RzLnJlc2l6ZShiYXRjaFNpemUpOwogICAgIH0KICAgICBzdGQ6OnZlY3RvcjxuYXRpdmVfaGFuZGxlX3QqPiBoYW5kbGVzQ3JlYXRlZDsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+IGluZmxpZ2h0QnVmZmVyczsKIAorICAgIHN0YXR1c190IHJlcyA9IE9LOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYmF0Y2hTaXplOyBpKyspIHsKICAgICAgICAgaWYgKGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICB3cmFwQXNIaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNfM180W2ldLnYzXzIsCi0gICAgICAgICAgICAgICAgICAgIC8qb3V0Ki8maGFuZGxlc0NyZWF0ZWQpOworICAgICAgICAgICAgcmVzID0gd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzXzNfNFtpXS52M18yLAorICAgICAgICAgICAgICAgICAgICAvKm91dCovJmhhbmRsZXNDcmVhdGVkLCAvKm91dCovJmluZmxpZ2h0QnVmZmVycyk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB3cmFwQXNIaWRsUmVxdWVzdChyZXF1ZXN0c1tpXSwgLypvdXQqLyZjYXB0dXJlUmVxdWVzdHNbaV0sIC8qb3V0Ki8maGFuZGxlc0NyZWF0ZWQpOworICAgICAgICAgICAgcmVzID0gd3JhcEFzSGlkbFJlcXVlc3QocmVxdWVzdHNbaV0sIC8qb3V0Ki8mY2FwdHVyZVJlcXVlc3RzW2ldLAorICAgICAgICAgICAgICAgICAgICAvKm91dCovJmhhbmRsZXNDcmVhdGVkLCAvKm91dCovJmluZmxpZ2h0QnVmZmVycyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcG9wSW5mbGlnaHRCdWZmZXJzKGluZmxpZ2h0QnVmZmVycyk7CisgICAgICAgICAgICBjbGVhbnVwTmF0aXZlSGFuZGxlcygmaGFuZGxlc0NyZWF0ZWQpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KIApAQCAtMzk0MCw0NiArNDY0MCw0MyBAQAogICAgIH0KIAogICAgIGhhcmR3YXJlOjpkZXRhaWxzOjpyZXR1cm5fc3RhdHVzIGVycjsKKyAgICBhdXRvIHJlc3VsdENhbGxiYWNrID0KKyAgICAgICAgWyZzdGF0dXMsICZudW1SZXF1ZXN0UHJvY2Vzc2VkXSAoYXV0byBzLCB1aW50MzJfdCBuKSB7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gczsKKyAgICAgICAgICAgICAgICAqbnVtUmVxdWVzdFByb2Nlc3NlZCA9IG47CisgICAgICAgIH07CiAgICAgaWYgKGhpZGxTZXNzaW9uXzNfNCAhPSBudWxscHRyKSB7CiAgICAgICAgIGVyciA9IGhpZGxTZXNzaW9uXzNfNC0+cHJvY2Vzc0NhcHR1cmVSZXF1ZXN0XzNfNChjYXB0dXJlUmVxdWVzdHNfM180LCBjYWNoZXNUb1JlbW92ZSwKLSAgICAgICAgICAgIFsmc3RhdHVzLCAmbnVtUmVxdWVzdFByb2Nlc3NlZF0gKGF1dG8gcywgdWludDMyX3QgbikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgKm51bVJlcXVlc3RQcm9jZXNzZWQgPSBuOwotICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRDYWxsYmFjayk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgZXJyID0gbUhpZGxTZXNzaW9uLT5wcm9jZXNzQ2FwdHVyZVJlcXVlc3QoY2FwdHVyZVJlcXVlc3RzLCBjYWNoZXNUb1JlbW92ZSwKLSAgICAgICAgICAgIFsmc3RhdHVzLCAmbnVtUmVxdWVzdFByb2Nlc3NlZF0gKGF1dG8gcywgdWludDMyX3QgbikgewotICAgICAgICAgICAgICAgIHN0YXR1cyA9IHM7Ci0gICAgICAgICAgICAgICAgKm51bVJlcXVlc3RQcm9jZXNzZWQgPSBuOwotICAgICAgICAgICAgfSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdENhbGxiYWNrKTsKICAgICB9CiAgICAgaWYgKCFlcnIuaXNPaygpKSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICBzdGF0dXMgPSBjb21tb246OlYxXzA6OlN0YXR1czo6Q0FNRVJBX0RJU0NPTk5FQ1RFRDsKICAgICB9CisKICAgICBpZiAoc3RhdHVzID09IGNvbW1vbjo6VjFfMDo6U3RhdHVzOjpPSyAmJiAqbnVtUmVxdWVzdFByb2Nlc3NlZCAhPSBiYXRjaFNpemUpIHsKICAgICAgICAgQUxPR0UoIiVzOiBwcm9jZXNzQ2FwdHVyZVJlcXVlc3QgcmV0dXJucyBPSyBidXQgcHJvY2Vzc2VkICVkLyV6dSByZXF1ZXN0cyIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCAqbnVtUmVxdWVzdFByb2Nlc3NlZCwgYmF0Y2hTaXplKTsKICAgICAgICAgc3RhdHVzID0gY29tbW9uOjpWMV8wOjpTdGF0dXM6OklOVEVSTkFMX0VSUk9SOwogICAgIH0KIAotICAgIGZvciAoYXV0byYgaGFuZGxlIDogaGFuZGxlc0NyZWF0ZWQpIHsKLSAgICAgICAgbmF0aXZlX2hhbmRsZV9kZWxldGUoaGFuZGxlKTsKKyAgICByZXMgPSBDYW1lcmFQcm92aWRlck1hbmFnZXI6Om1hcFRvU3RhdHVzVChzdGF0dXMpOworICAgIGlmIChyZXMgPT0gT0spIHsKKyAgICAgICAgaWYgKG1IaWRsU2Vzc2lvbi0+aXNSZW1vdGUoKSkgeworICAgICAgICAgICAgLy8gT25seSBjbG9zZSBhY3F1aXJlIGZlbmNlIEZEcyB3aGVuIHRoZSBISURMIHRyYW5zYWN0aW9uIHN1Y2NlZWRzIChzbyB0aGUgRkRzIGhhdmUgYmVlbgorICAgICAgICAgICAgLy8gc2VudCB0byBjYW1lcmEgSEFMIHByb2Nlc3NlcykKKyAgICAgICAgICAgIGNsZWFudXBOYXRpdmVIYW5kbGVzKCZoYW5kbGVzQ3JlYXRlZCwgLypjbG9zZUZkKi90cnVlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEluIHBhc3N0aHJvdWdoIG1vZGUgdGhlIEZEcyBhcmUgbm93IG93bmVkIGJ5IEhBTAorICAgICAgICAgICAgY2xlYW51cE5hdGl2ZUhhbmRsZXMoJmhhbmRsZXNDcmVhdGVkKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHBvcEluZmxpZ2h0QnVmZmVycyhpbmZsaWdodEJ1ZmZlcnMpOworICAgICAgICBjbGVhbnVwTmF0aXZlSGFuZGxlcygmaGFuZGxlc0NyZWF0ZWQpOwogICAgIH0KLSAgICByZXR1cm4gQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyOjptYXBUb1N0YXR1c1Qoc3RhdHVzKTsKLX0KLQotc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpwcm9jZXNzQ2FwdHVyZVJlcXVlc3QoCi0gICAgICAgIGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QgKnJlcXVlc3QpIHsKLSAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpwcm9jZXNzQ2FwdHVyZVJlcXVlc3QiKTsKLSAgICBpZiAoIXZhbGlkKCkpIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKLSAgICBzdGF0dXNfdCByZXMgPSBPSzsKLQotICAgIHVpbnQzMl90IG51bVJlcXVlc3RQcm9jZXNzZWQgPSAwOwotICAgIHN0ZDo6dmVjdG9yPGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QqPiByZXF1ZXN0cygxKTsKLSAgICByZXF1ZXN0c1swXSA9IHJlcXVlc3Q7Ci0gICAgcmVzID0gcHJvY2Vzc0JhdGNoQ2FwdHVyZVJlcXVlc3RzKHJlcXVlc3RzLCAmbnVtUmVxdWVzdFByb2Nlc3NlZCk7Ci0KICAgICByZXR1cm4gcmVzOwogfQogCkBAIC00MDIyLDYgKzQ3MTksMjAgQEAKICAgICByZXR1cm4gcmVzOwogfQogCit2b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6c2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpIHsKKyAgICBBVFJBQ0VfTkFNRSgiQ2FtZXJhSGFsOjpzaWduYWxQaXBlbGluZURyYWluIik7CisgICAgaWYgKCF2YWxpZCgpIHx8IG1IaWRsU2Vzc2lvbl8zXzUgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIG9uIGludmFsaWQgY2FtZXJhISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhdXRvIGVyciA9IG1IaWRsU2Vzc2lvbl8zXzUtPnNpZ25hbFN0cmVhbUZsdXNoKHN0cmVhbUlkcywgbU5leHRTdHJlYW1Db25maWdDb3VudGVyIC0gMSk7CisgICAgaWYgKCFlcnIuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlczogVHJhbnNhY3Rpb24gZXJyb3I6ICVzIiwgX19GVU5DVElPTl9fLCBlcnIuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KK30KKwogdm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmdldEluZmxpZ2h0QnVmZmVyS2V5cygKICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+Piogb3V0KSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUluZmxpZ2h0TG9jayk7CkBAIC00MDM2LDExICs0NzQ3LDIxIEBACiAgICAgcmV0dXJuOwogfQogCit2b2lkIENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6Z2V0SW5mbGlnaHRSZXF1ZXN0QnVmZmVyS2V5cygKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+KiBvdXQpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtUmVxdWVzdGVkQnVmZmVyc0xvY2spOworICAgIG91dC0+Y2xlYXIoKTsKKyAgICBvdXQtPnJlc2VydmUobVJlcXVlc3RlZEJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8mIHBhaXIgOiBtUmVxdWVzdGVkQnVmZmVycykgeworICAgICAgICBvdXQtPnB1c2hfYmFjayhwYWlyLmZpcnN0KTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnB1c2hJbmZsaWdodEJ1ZmZlckxvY2tlZCgKLSAgICAgICAgaW50MzJfdCBmcmFtZU51bWJlciwgaW50MzJfdCBzdHJlYW1JZCwgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIsIGludCBhY3F1aXJlRmVuY2UpIHsKKyAgICAgICAgaW50MzJfdCBmcmFtZU51bWJlciwgaW50MzJfdCBzdHJlYW1JZCwgYnVmZmVyX2hhbmRsZV90ICpidWZmZXIpIHsKICAgICB1aW50NjRfdCBrZXkgPSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oZnJhbWVOdW1iZXIpIDw8IDMyIHwgc3RhdGljX2Nhc3Q8dWludDY0X3Q+KHN0cmVhbUlkKTsKLSAgICBhdXRvIHBhaXIgPSBzdGQ6Om1ha2VfcGFpcihidWZmZXIsIGFjcXVpcmVGZW5jZSk7Ci0gICAgbUluZmxpZ2h0QnVmZmVyTWFwW2tleV0gPSBwYWlyOworICAgIG1JbmZsaWdodEJ1ZmZlck1hcFtrZXldID0gYnVmZmVyOwogICAgIHJldHVybiBPSzsKIH0KIApAQCAtNDA1MiwxNiArNDc3Myw1OCBAQAogICAgIHVpbnQ2NF90IGtleSA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PihmcmFtZU51bWJlcikgPDwgMzIgfCBzdGF0aWNfY2FzdDx1aW50NjRfdD4oc3RyZWFtSWQpOwogICAgIGF1dG8gaXQgPSBtSW5mbGlnaHRCdWZmZXJNYXAuZmluZChrZXkpOwogICAgIGlmIChpdCA9PSBtSW5mbGlnaHRCdWZmZXJNYXAuZW5kKCkpIHJldHVybiBOQU1FX05PVF9GT1VORDsKLSAgICBhdXRvIHBhaXIgPSBpdC0+c2Vjb25kOwotICAgICpidWZmZXIgPSBwYWlyLmZpcnN0OwotICAgIGludCBhY3F1aXJlRmVuY2UgPSBwYWlyLnNlY29uZDsKLSAgICBpZiAoYWNxdWlyZUZlbmNlID4gMCkgewotICAgICAgICA6OmNsb3NlKGFjcXVpcmVGZW5jZSk7CisgICAgaWYgKGJ1ZmZlciAhPSBudWxscHRyKSB7CisgICAgICAgICpidWZmZXIgPSBpdC0+c2Vjb25kOwogICAgIH0KICAgICBtSW5mbGlnaHRCdWZmZXJNYXAuZXJhc2UoaXQpOwogICAgIHJldHVybiBPSzsKIH0KIAordm9pZCBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OnBvcEluZmxpZ2h0QnVmZmVycygKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGludDMyX3QsIGludDMyX3Q+PiYgYnVmZmVycykgeworICAgIGZvciAoY29uc3QgYXV0byYgcGFpciA6IGJ1ZmZlcnMpIHsKKyAgICAgICAgaW50MzJfdCBmcmFtZU51bWJlciA9IHBhaXIuZmlyc3Q7CisgICAgICAgIGludDMyX3Qgc3RyZWFtSWQgPSBwYWlyLnNlY29uZDsKKyAgICAgICAgcG9wSW5mbGlnaHRCdWZmZXIoZnJhbWVOdW1iZXIsIHN0cmVhbUlkLCBudWxscHRyKTsKKyAgICB9Cit9CisKK3N0YXR1c190IENhbWVyYTNEZXZpY2U6OkhhbEludGVyZmFjZTo6cHVzaEluZmxpZ2h0UmVxdWVzdEJ1ZmZlcigKKyAgICAgICAgdWludDY0X3QgYnVmZmVySWQsIGJ1ZmZlcl9oYW5kbGVfdCogYnVmLCBpbnQzMl90IHN0cmVhbUlkKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVJlcXVlc3RlZEJ1ZmZlcnNMb2NrKTsKKyAgICBhdXRvIHBhaXIgPSBtUmVxdWVzdGVkQnVmZmVycy5pbnNlcnQoe2J1ZmZlcklkLCB7c3RyZWFtSWQsIGJ1Zn19KTsKKyAgICBpZiAoIXBhaXIuc2Vjb25kKSB7CisgICAgICAgIEFMT0dFKCIlczogYnVmSWQgJSIgUFJJdTY0ICIgaXMgYWxyZWFkeSBpbmZsaWdodCEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVySWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICByZXR1cm4gT0s7Cit9CisKKy8vIEZpbmQgYW5kIHBvcCBhIGJ1ZmZlcl9oYW5kbGVfdCBiYXNlZCBvbiBidWZmZXJJZAorc3RhdHVzX3QgQ2FtZXJhM0RldmljZTo6SGFsSW50ZXJmYWNlOjpwb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIoCisgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcklkLAorICAgICAgICAvKm91dCovIGJ1ZmZlcl9oYW5kbGVfdCoqIGJ1ZmZlciwKKyAgICAgICAgLypvcHRpb25hbCBvdXQqLyBpbnQzMl90KiBzdHJlYW1JZCkgeworICAgIGlmIChidWZmZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGJ1ZmZlciAoJXApIG11c3Qgbm90IGJlIG51bGwiLCBfX0ZVTkNUSU9OX18sIGJ1ZmZlcik7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1SZXF1ZXN0ZWRCdWZmZXJzTG9jayk7CisgICAgYXV0byBpdCA9IG1SZXF1ZXN0ZWRCdWZmZXJzLmZpbmQoYnVmZmVySWQpOworICAgIGlmIChpdCA9PSBtUmVxdWVzdGVkQnVmZmVycy5lbmQoKSkgeworICAgICAgICBBTE9HRSgiJXM6IGJ1ZklkICUiIFBSSXU2NCAiIGlzIG5vdCBpbmZsaWdodCEiLAorICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgYnVmZmVySWQpOworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKyAgICAqYnVmZmVyID0gaXQtPnNlY29uZC5zZWNvbmQ7CisgICAgaWYgKHN0cmVhbUlkICE9IG51bGxwdHIpIHsKKyAgICAgICAgKnN0cmVhbUlkID0gaXQtPnNlY29uZC5maXJzdDsKKyAgICB9CisgICAgbVJlcXVlc3RlZEJ1ZmZlcnMuZXJhc2UoaXQpOworICAgIHJldHVybiBPSzsKK30KKwogc3RkOjpwYWlyPGJvb2wsIHVpbnQ2NF90PiBDYW1lcmEzRGV2aWNlOjpIYWxJbnRlcmZhY2U6OmdldEJ1ZmZlcklkKAogICAgICAgICBjb25zdCBidWZmZXJfaGFuZGxlX3QmIGJ1ZiwgaW50IHN0cmVhbUlkKSB7CiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUJ1ZmZlcklkTWFwTG9jayk7CkBAIC00MTI2LDcgKzQ4ODksOCBAQAogCiBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpSZXF1ZXN0VGhyZWFkKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwKICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciwKLSAgICAgICAgc3A8SGFsSW50ZXJmYWNlPiBpbnRlcmZhY2UsIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cykgOgorICAgICAgICBzcDxIYWxJbnRlcmZhY2U+IGludGVyZmFjZSwgY29uc3QgVmVjdG9yPGludDMyX3Q+JiBzZXNzaW9uUGFyYW1LZXlzLAorICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIpIDoKICAgICAgICAgVGhyZWFkKC8qY2FuQ2FsbEphdmEqL2ZhbHNlKSwKICAgICAgICAgbVBhcmVudChwYXJlbnQpLAogICAgICAgICBtU3RhdHVzVHJhY2tlcihzdGF0dXNUcmFja2VyKSwKQEAgLTQxMzYsNiArNDkwMCw3IEBACiAgICAgICAgIG1SZWNvbmZpZ3VyZWQoZmFsc2UpLAogICAgICAgICBtRG9QYXVzZShmYWxzZSksCiAgICAgICAgIG1QYXVzZWQodHJ1ZSksCisgICAgICAgIG1Ob3RpZnlQaXBlbGluZURyYWluKGZhbHNlKSwKICAgICAgICAgbUZyYW1lTnVtYmVyKDApLAogICAgICAgICBtTGF0ZXN0UmVxdWVzdElkKE5BTUVfTk9UX0ZPVU5EKSwKICAgICAgICAgbUN1cnJlbnRBZlRyaWdnZXJJZCgwKSwKQEAgLTQxNDYsNyArNDkxMSw4IEBACiAgICAgICAgIG1Db25zdHJhaW5lZE1vZGUoZmFsc2UpLAogICAgICAgICBtUmVxdWVzdExhdGVuY3koa1JlcXVlc3RMYXRlbmN5QmluU2l6ZSksCiAgICAgICAgIG1TZXNzaW9uUGFyYW1LZXlzKHNlc3Npb25QYXJhbUtleXMpLAotICAgICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtcyhzZXNzaW9uUGFyYW1LZXlzLnNpemUoKSkgeworICAgICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtcyhzZXNzaW9uUGFyYW1LZXlzLnNpemUoKSksCisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKHVzZUhhbEJ1Zk1hbmFnZXIpIHsKICAgICBtU3RhdHVzSWQgPSBzdGF0dXNUcmFja2VyLT5hZGRDb21wb25lbnQoKTsKIH0KIApAQCAtNDQzNiwyOCArNTIwMiw3IEBACiAgICAgICAgIE5leHRSZXF1ZXN0JiBuZXh0UmVxdWVzdCA9IG1OZXh0UmVxdWVzdHMuZWRpdEl0ZW1BdChpKTsKICAgICAgICAgbmV4dFJlcXVlc3Quc3VibWl0dGVkID0gdHJ1ZTsKIAotCi0gICAgICAgIC8vIFVwZGF0ZSB0aGUgbGF0ZXN0IHJlcXVlc3Qgc2VudCB0byBIQUwKLSAgICAgICAgaWYgKG5leHRSZXF1ZXN0LmhhbFJlcXVlc3Quc2V0dGluZ3MgIT0gTlVMTCkgeyAvLyBEb24ndCB1cGRhdGUgaWYgdGhleSB3ZXJlIHVuY2hhbmdlZAotICAgICAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1MYXRlc3RSZXF1ZXN0TXV0ZXgpOwotCi0gICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogY2xvbmVkID0gY2xvbmVfY2FtZXJhX21ldGFkYXRhKG5leHRSZXF1ZXN0LmhhbFJlcXVlc3Quc2V0dGluZ3MpOwotICAgICAgICAgICAgbUxhdGVzdFJlcXVlc3QuYWNxdWlyZShjbG9uZWQpOwotCi0gICAgICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gTlVMTCkgewotICAgICAgICAgICAgICAgIHBhcmVudC0+bW9uaXRvck1ldGFkYXRhKFRhZ01vbml0b3I6OlJFUVVFU1QsCi0gICAgICAgICAgICAgICAgICAgICAgICBuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LmZyYW1lX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIDAsIG1MYXRlc3RSZXF1ZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnNldHRpbmdzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG5leHRSZXF1ZXN0LmNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhLnVubG9jaygKLSAgICAgICAgICAgICAgICAgICAgbmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5zZXR0aW5ncyk7Ci0gICAgICAgIH0KLQotICAgICAgICBjbGVhbnVwUGh5c2ljYWxTZXR0aW5ncyhuZXh0UmVxdWVzdC5jYXB0dXJlUmVxdWVzdCwgJm5leHRSZXF1ZXN0LmhhbFJlcXVlc3QpOworICAgICAgICB1cGRhdGVOZXh0UmVxdWVzdChuZXh0UmVxdWVzdCk7CiAKICAgICAgICAgaWYgKCF0cmlnZ2VyUmVtb3ZlRmFpbGVkKSB7CiAgICAgICAgICAgICAvLyBSZW1vdmUgYW55IHByZXZpb3VzbHkgcXVldWVkIHRyaWdnZXJzIChhZnRlciB1bmxvY2spCkBAIC00NDkwLDYyICs1MjM1LDYgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpzZW5kUmVxdWVzdHNPbmVCeU9uZSgpIHsKLSAgICBzdGF0dXNfdCByZXM7Ci0KLSAgICBmb3IgKGF1dG8mIG5leHRSZXF1ZXN0IDogbU5leHRSZXF1ZXN0cykgewotICAgICAgICAvLyBTdWJtaXQgcmVxdWVzdCBhbmQgYmxvY2sgdW50aWwgcmVhZHkgZm9yIG5leHQgb25lCi0gICAgICAgIEFUUkFDRV9BU1lOQ19CRUdJTigiZnJhbWUgY2FwdHVyZSIsIG5leHRSZXF1ZXN0LmhhbFJlcXVlc3QuZnJhbWVfbnVtYmVyKTsKLSAgICAgICAgcmVzID0gbUludGVyZmFjZS0+cHJvY2Vzc0NhcHR1cmVSZXF1ZXN0KCZuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0KTsKLQotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICAvLyBTaG91bGQgb25seSBnZXQgYSBmYWlsdXJlIGhlcmUgZm9yIG1hbGZvcm1lZCByZXF1ZXN0cyBvciBkZXZpY2UtbGV2ZWwKLSAgICAgICAgICAgIC8vIGVycm9ycywgc28gY29uc2lkZXIgYWxsIGVycm9ycyBmYXRhbC4gIEJhZCBtZXRhZGF0YSBmYWlsdXJlcyBzaG91bGQKLSAgICAgICAgICAgIC8vIGNvbWUgdGhyb3VnaCBub3RpZnkuCi0gICAgICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gc3VibWl0IGNhcHR1cmUgcmVxdWVzdCAlZCB0byBIQUwiCi0gICAgICAgICAgICAgICAgICAgICIgZGV2aWNlOiAlcyAoJWQpIiwgbmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5mcmFtZV9udW1iZXIsIHN0cmVycm9yKC1yZXMpLAotICAgICAgICAgICAgICAgICAgICByZXMpOwotICAgICAgICAgICAgY2xlYW5VcEZhaWxlZFJlcXVlc3RzKC8qc2VuZFJlcXVlc3RFcnJvciovIGZhbHNlKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIE1hcmsgdGhhdCB0aGUgcmVxdWVzdCBoYXMgYmUgc3VibWl0dGVkIHN1Y2Nlc3NmdWxseS4KLSAgICAgICAgbmV4dFJlcXVlc3Quc3VibWl0dGVkID0gdHJ1ZTsKLQotICAgICAgICAvLyBVcGRhdGUgdGhlIGxhdGVzdCByZXF1ZXN0IHNlbnQgdG8gSEFMCi0gICAgICAgIGlmIChuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnNldHRpbmdzICE9IE5VTEwpIHsgLy8gRG9uJ3QgdXBkYXRlIGlmIHRoZXkgd2VyZSB1bmNoYW5nZWQKLSAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtTGF0ZXN0UmVxdWVzdE11dGV4KTsKLQotICAgICAgICAgICAgY2FtZXJhX21ldGFkYXRhX3QqIGNsb25lZCA9IGNsb25lX2NhbWVyYV9tZXRhZGF0YShuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnNldHRpbmdzKTsKLSAgICAgICAgICAgIG1MYXRlc3RSZXF1ZXN0LmFjcXVpcmUoY2xvbmVkKTsKLQotICAgICAgICAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7Ci0gICAgICAgICAgICBpZiAocGFyZW50ICE9IE5VTEwpIHsKLSAgICAgICAgICAgICAgICBwYXJlbnQtPm1vbml0b3JNZXRhZGF0YShUYWdNb25pdG9yOjpSRVFVRVNULCBuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LmZyYW1lX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIDAsIG1MYXRlc3RSZXF1ZXN0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnNldHRpbmdzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG5leHRSZXF1ZXN0LmNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhLnVubG9jaygKLSAgICAgICAgICAgICAgICAgICAgbmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5zZXR0aW5ncyk7Ci0gICAgICAgIH0KLQotICAgICAgICBjbGVhbnVwUGh5c2ljYWxTZXR0aW5ncyhuZXh0UmVxdWVzdC5jYXB0dXJlUmVxdWVzdCwgJm5leHRSZXF1ZXN0LmhhbFJlcXVlc3QpOwotCi0gICAgICAgIC8vIFJlbW92ZSBhbnkgcHJldmlvdXNseSBxdWV1ZWQgdHJpZ2dlcnMgKGFmdGVyIHVubG9jaykKLSAgICAgICAgcmVzID0gcmVtb3ZlVHJpZ2dlcnMobVByZXZSZXF1ZXN0KTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgewotICAgICAgICAgICAgU0VUX0VSUigiUmVxdWVzdFRocmVhZDogVW5hYmxlIHRvIHJlbW92ZSB0cmlnZ2VycyAiCi0gICAgICAgICAgICAgICAgICAiKGNhcHR1cmUgcmVxdWVzdCAlZCwgSEFMIGRldmljZTogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICBuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LmZyYW1lX251bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICBjbGVhblVwRmFpbGVkUmVxdWVzdHMoLypzZW5kUmVxdWVzdEVycm9yKi8gZmFsc2UpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotfQotCiBuc2Vjc190IENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OmNhbGN1bGF0ZU1heEV4cGVjdGVkRHVyYXRpb24oY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJlcXVlc3QpIHsKICAgICBuc2Vjc190IG1heEV4cGVjdGVkRHVyYXRpb24gPSBrRGVmYXVsdEV4cGVjdGVkRHVyYXRpb247CiAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QgZSA9IGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeV90KCk7CkBAIC00NTkzLDEzICs1MjgyLDQ1IEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnVwZGF0ZU5leHRSZXF1ZXN0KE5leHRSZXF1ZXN0JiBuZXh0UmVxdWVzdCkgeworICAgIC8vIFVwZGF0ZSB0aGUgbGF0ZXN0IHJlcXVlc3Qgc2VudCB0byBIQUwKKyAgICBpZiAobmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5zZXR0aW5ncyAhPSBOVUxMKSB7IC8vIERvbid0IHVwZGF0ZSBpZiB0aGV5IHdlcmUgdW5jaGFuZ2VkCisgICAgICAgIE11dGV4OjpBdXRvbG9jayBhbChtTGF0ZXN0UmVxdWVzdE11dGV4KTsKKworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfdCogY2xvbmVkID0gY2xvbmVfY2FtZXJhX21ldGFkYXRhKG5leHRSZXF1ZXN0LmhhbFJlcXVlc3Quc2V0dGluZ3MpOworICAgICAgICBtTGF0ZXN0UmVxdWVzdC5hY3F1aXJlKGNsb25lZCk7CisKKyAgICAgICAgbUxhdGVzdFBoeXNpY2FsUmVxdWVzdC5jbGVhcigpOworICAgICAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgbmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5udW1fcGh5c2NhbV9zZXR0aW5nczsgaSsrKSB7CisgICAgICAgICAgICBjbG9uZWQgPSBjbG9uZV9jYW1lcmFfbWV0YWRhdGEobmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5waHlzY2FtX3NldHRpbmdzW2ldKTsKKyAgICAgICAgICAgIG1MYXRlc3RQaHlzaWNhbFJlcXVlc3QuZW1wbGFjZShuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnBoeXNjYW1faWRbaV0sCisgICAgICAgICAgICAgICAgICAgIENhbWVyYU1ldGFkYXRhKGNsb25lZCkpOworICAgICAgICB9CisKKyAgICAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgICAgIGlmIChwYXJlbnQgIT0gTlVMTCkgeworICAgICAgICAgICAgcGFyZW50LT5tb25pdG9yTWV0YWRhdGEoVGFnTW9uaXRvcjo6UkVRVUVTVCwKKyAgICAgICAgICAgICAgICAgICAgbmV4dFJlcXVlc3QuaGFsUmVxdWVzdC5mcmFtZV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgIDAsIG1MYXRlc3RSZXF1ZXN0LCBtTGF0ZXN0UGh5c2ljYWxSZXF1ZXN0KTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChuZXh0UmVxdWVzdC5oYWxSZXF1ZXN0LnNldHRpbmdzICE9IE5VTEwpIHsKKyAgICAgICAgbmV4dFJlcXVlc3QuY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEudW5sb2NrKAorICAgICAgICAgICAgICAgIG5leHRSZXF1ZXN0LmhhbFJlcXVlc3Quc2V0dGluZ3MpOworICAgIH0KKworICAgIGNsZWFudXBQaHlzaWNhbFNldHRpbmdzKG5leHRSZXF1ZXN0LmNhcHR1cmVSZXF1ZXN0LCAmbmV4dFJlcXVlc3QuaGFsUmVxdWVzdCk7Cit9CisKIGJvb2wgQ2FtZXJhM0RldmljZTo6UmVxdWVzdFRocmVhZDo6dXBkYXRlU2Vzc2lvblBhcmFtZXRlcnMoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBib29sIHVwZGF0ZXNEZXRlY3RlZCA9IGZhbHNlOwogCisgICAgQ2FtZXJhTWV0YWRhdGEgdXBkYXRlZFBhcmFtcyhtTGF0ZXN0U2Vzc2lvblBhcmFtcyk7CiAgICAgZm9yIChhdXRvIHRhZyA6IG1TZXNzaW9uUGFyYW1LZXlzKSB7CiAgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBlbnRyeSA9IHNldHRpbmdzLmZpbmQodGFnKTsKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGxhc3RFbnRyeSA9IG1MYXRlc3RTZXNzaW9uUGFyYW1zLmZpbmQodGFnKTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGxhc3RFbnRyeSA9IHVwZGF0ZWRQYXJhbXMuZmluZCh0YWcpOwogCiAgICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKICAgICAgICAgICAgIGJvb2wgaXNEaWZmZXJlbnQgPSBmYWxzZTsKQEAgLTQ2MjgsMjIgKzUzNDksMzQgQEAKICAgICAgICAgICAgICAgICBpZiAoIXNraXBIRlJUYXJnZXRGUFNVcGRhdGUodGFnLCBlbnRyeSwgbGFzdEVudHJ5KSkgewogICAgICAgICAgICAgICAgICAgICB1cGRhdGVzRGV0ZWN0ZWQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtcy51cGRhdGUoZW50cnkpOworICAgICAgICAgICAgICAgIHVwZGF0ZWRQYXJhbXMudXBkYXRlKGVudHJ5KTsKICAgICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIGlmIChsYXN0RW50cnkuY291bnQgPiAwKSB7CiAgICAgICAgICAgICAvLyBWYWx1ZSBoYXMgYmVlbiByZW1vdmVkCiAgICAgICAgICAgICBBTE9HVigiJXM6IFNlc3Npb24gcGFyYW1ldGVyIHRhZyBpZCAlZCByZW1vdmVkIiwgX19GVU5DVElPTl9fLCB0YWcpOwotICAgICAgICAgICAgbUxhdGVzdFNlc3Npb25QYXJhbXMuZXJhc2UodGFnKTsKKyAgICAgICAgICAgIHVwZGF0ZWRQYXJhbXMuZXJhc2UodGFnKTsKICAgICAgICAgICAgIHVwZGF0ZXNEZXRlY3RlZCA9IHRydWU7CiAgICAgICAgIH0KICAgICB9CiAKLSAgICByZXR1cm4gdXBkYXRlc0RldGVjdGVkOworICAgIGJvb2wgcmVjb25maWd1cmVSZXF1aXJlZDsKKyAgICBpZiAodXBkYXRlc0RldGVjdGVkKSB7CisgICAgICAgIHJlY29uZmlndXJlUmVxdWlyZWQgPSBtSW50ZXJmYWNlLT5pc1JlY29uZmlndXJhdGlvblJlcXVpcmVkKG1MYXRlc3RTZXNzaW9uUGFyYW1zLAorICAgICAgICAgICAgICAgIHVwZGF0ZWRQYXJhbXMpOworICAgICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtcyA9IHVwZGF0ZWRQYXJhbXM7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVjb25maWd1cmVSZXF1aXJlZCA9IGZhbHNlOworICAgIH0KKworICAgIHJldHVybiByZWNvbmZpZ3VyZVJlcXVpcmVkOwogfQogCiBib29sIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnRocmVhZExvb3AoKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKICAgICBzdGF0dXNfdCByZXM7CisgICAgLy8gQW55IGZ1bmN0aW9uIGNhbGxlZCBmcm9tIHRocmVhZExvb3AoKSBtdXN0IG5vdCBob2xkIG1JbnRlcmZhY2VMb2NrIHNpbmNlCisgICAgLy8gaXQgY291bGQgbGVhZCB0byBkZWFkbG9ja3MgKGRpc2Nvbm5lY3QoKSAtPiBob2xkIG1JbnRlcmZhY2VNdXRleCAtPiB3YWl0IGZvciByZXF1ZXN0IHRocmVhZAorICAgIC8vIHRvIGZpbmlzaCAtPiByZXF1ZXN0IHRocmVhZCB3YWl0cyBvbiBtSW50ZXJmYWNlTXV0ZXgpIGh0dHA6Ly9iLzE0MzUxMzUxOAogCiAgICAgLy8gSGFuZGxlIHBhdXNlZCBzdGF0ZS4KICAgICBpZiAod2FpdElmUGF1c2VkKCkpIHsKQEAgLTQ3NTEsMTMgKzU0ODQsMTUgQEAKICAgICBBTE9HVlYoIiVzOiAlZDogc3VibWl0dGluZyAlenUgcmVxdWVzdHMgaW4gYSBiYXRjaC4iLCBfX0ZVTkNUSU9OX18sIF9fTElORV9fLAogICAgICAgICAgICAgbU5leHRSZXF1ZXN0cy5zaXplKCkpOwogCisgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHBhcmVudCAhPSBudWxscHRyKSB7CisgICAgICAgIHBhcmVudC0+bVJlcXVlc3RCdWZmZXJTTS5vblN1Ym1pdHRpbmdSZXF1ZXN0KCk7CisgICAgfQorCiAgICAgYm9vbCBzdWJtaXRSZXF1ZXN0U3VjY2VzcyA9IGZhbHNlOwogICAgIG5zZWNzX3QgdFJlcXVlc3RTdGFydCA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfTU9OT1RPTklDKTsKLSAgICBpZiAobUludGVyZmFjZS0+c3VwcG9ydEJhdGNoUmVxdWVzdCgpKSB7Ci0gICAgICAgIHN1Ym1pdFJlcXVlc3RTdWNjZXNzID0gc2VuZFJlcXVlc3RzQmF0Y2goKTsKLSAgICB9IGVsc2UgewotICAgICAgICBzdWJtaXRSZXF1ZXN0U3VjY2VzcyA9IHNlbmRSZXF1ZXN0c09uZUJ5T25lKCk7Ci0gICAgfQorICAgIHN1Ym1pdFJlcXVlc3RTdWNjZXNzID0gc2VuZFJlcXVlc3RzQmF0Y2goKTsKKwogICAgIG5zZWNzX3QgdFJlcXVlc3RFbmQgPSBzeXN0ZW1UaW1lKFNZU1RFTV9USU1FX01PTk9UT05JQyk7CiAgICAgbVJlcXVlc3RMYXRlbmN5LmFkZCh0UmVxdWVzdFN0YXJ0LCB0UmVxdWVzdEVuZCk7CiAKQEAgLTQ3NzcsNiArNTUxMiw3IEBACiBzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0VGhyZWFkOjpwcmVwYXJlSGFsUmVxdWVzdHMoKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKIAorICAgIGJvb2wgYmF0Y2hlZFJlcXVlc3QgPSBtTmV4dFJlcXVlc3RzWzBdLmNhcHR1cmVSZXF1ZXN0LT5tQmF0Y2hTaXplID4gMTsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IG1OZXh0UmVxdWVzdHMuc2l6ZSgpOyBpKyspIHsKICAgICAgICAgYXV0byYgbmV4dFJlcXVlc3QgPSBtTmV4dFJlcXVlc3RzLmVkaXRJdGVtQXQoaSk7CiAgICAgICAgIHNwPENhcHR1cmVSZXF1ZXN0PiBjYXB0dXJlUmVxdWVzdCA9IG5leHRSZXF1ZXN0LmNhcHR1cmVSZXF1ZXN0OwpAQCAtNDgwMCw3ICs1NTM2LDEwIEBACiAgICAgICAgIG1QcmV2VHJpZ2dlcnMgPSB0cmlnZ2VyQ291bnQ7CiAKICAgICAgICAgLy8gSWYgdGhlIHJlcXVlc3QgaXMgdGhlIHNhbWUgYXMgbGFzdCwgb3Igd2UgaGFkIHRyaWdnZXJzIGxhc3QgdGltZQotICAgICAgICBib29sIG5ld1JlcXVlc3QgPSBtUHJldlJlcXVlc3QgIT0gY2FwdHVyZVJlcXVlc3QgfHwgdHJpZ2dlcnNNaXhlZEluOworICAgICAgICBib29sIG5ld1JlcXVlc3QgPSAobVByZXZSZXF1ZXN0ICE9IGNhcHR1cmVSZXF1ZXN0IHx8IHRyaWdnZXJzTWl4ZWRJbikgJiYKKyAgICAgICAgICAgICAgICAvLyBSZXF1ZXN0IHNldHRpbmdzIGFyZSBhbGwgdGhlIHNhbWUgd2l0aGluIG9uZSBiYXRjaCwgc28gb25seSB0cmVhdCB0aGUgZmlyc3QKKyAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IGluIGEgYmF0Y2ggYXMgbmV3CisgICAgICAgICAgICAgICAgIShiYXRjaGVkUmVxdWVzdCAmJiBpID4gMCk7CiAgICAgICAgIGlmIChuZXdSZXF1ZXN0KSB7CiAgICAgICAgICAgICAvKioKICAgICAgICAgICAgICAqIEhBTCB3b3JrYXJvdW5kOgpAQCAtNDgxOCwxMyArNTU1NywyMSBAQAogICAgICAgICAgICAgICAgIC8vIENvcnJlY3QgbWV0YWRhdGEgcmVnaW9ucyBmb3IgZGlzdG9ydGlvbiBjb3JyZWN0aW9uIGlmIGVuYWJsZWQKICAgICAgICAgICAgICAgICBzcDxDYW1lcmEzRGV2aWNlPiBwYXJlbnQgPSBtUGFyZW50LnByb21vdGUoKTsKICAgICAgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICAgICAgcmVzID0gcGFyZW50LT5tRGlzdG9ydGlvbk1hcHBlci5jb3JyZWN0Q2FwdHVyZVJlcXVlc3QoCi0gICAgICAgICAgICAgICAgICAgICAgICAmKGNhcHR1cmVSZXF1ZXN0LT5tU2V0dGluZ3NMaXN0LmJlZ2luKCktPm1ldGFkYXRhKSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFNFVF9FUlIoIlJlcXVlc3RUaHJlYWQ6IFVuYWJsZSB0byBjb3JyZWN0IGNhcHR1cmUgcmVxdWVzdHMgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9yIGxlbnMgZGlzdG9ydGlvbiBmb3IgcmVxdWVzdCAlZDogJXMgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFJlcXVlc3QtPmZyYW1lX251bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CisgICAgICAgICAgICAgICAgICAgIExpc3Q8UGh5c2ljYWxDYW1lcmFTZXR0aW5ncz46Oml0ZXJhdG9yIGl0OworICAgICAgICAgICAgICAgICAgICBmb3IgKGl0ID0gY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdCAhPSBjYXB0dXJlUmVxdWVzdC0+bVNldHRpbmdzTGlzdC5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudC0+bURpc3RvcnRpb25NYXBwZXJzLmZpbmQoaXQtPmNhbWVyYUlkKSA9PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnQtPm1EaXN0b3J0aW9uTWFwcGVycy5lbmQoKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gcGFyZW50LT5tRGlzdG9ydGlvbk1hcHBlcnNbaXQtPmNhbWVyYUlkXS5jb3JyZWN0Q2FwdHVyZVJlcXVlc3QoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihpdC0+bWV0YWRhdGEpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRVRfRVJSKCJSZXF1ZXN0VGhyZWFkOiBVbmFibGUgdG8gY29ycmVjdCBjYXB0dXJlIHJlcXVlc3RzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmb3IgbGVucyBkaXN0b3J0aW9uIGZvciByZXF1ZXN0ICVkOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbFJlcXVlc3QtPmZyYW1lX251bWJlciwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpAQCAtNDkwMSw4ICs1NjQ4LDExIEBACiAgICAgICAgIH0KICAgICAgICAgbnNlY3NfdCB3YWl0RHVyYXRpb24gPSBrQmFzZUdldEJ1ZmZlcldhaXQgKyBwYXJlbnQtPmdldEV4cGVjdGVkSW5GbGlnaHREdXJhdGlvbigpOwogCisgICAgICAgIFN1cmZhY2VNYXAgdW5pcXVlU3VyZmFjZUlkTWFwOwogICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5zaXplKCk7IGorKykgewotICAgICAgICAgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gb3V0cHV0U3RyZWFtID0gY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLmVkaXRJdGVtQXQoaik7CisgICAgICAgICAgICBzcDxDYW1lcmEzT3V0cHV0U3RyZWFtSW50ZXJmYWNlPiBvdXRwdXRTdHJlYW0gPQorICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN0cmVhbXMuZWRpdEl0ZW1BdChqKTsKKyAgICAgICAgICAgIGludCBzdHJlYW1JZCA9IG91dHB1dFN0cmVhbS0+Z2V0SWQoKTsKIAogICAgICAgICAgICAgLy8gUHJlcGFyZSB2aWRlbyBidWZmZXJzIGZvciBoaWdoIHNwZWVkIHJlY29yZGluZyBvbiB0aGUgZmlyc3QgdmlkZW8gcmVxdWVzdC4KICAgICAgICAgICAgIGlmIChtUHJlcGFyZVZpZGVvU3RyZWFtICYmIG91dHB1dFN0cmVhbS0+aXNWaWRlb1N0cmVhbSgpKSB7CkBAIC00OTIxLDE3ICs1NjcxLDYxIEBACiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogCi0gICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPmdldEJ1ZmZlcigmb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChqKSwKLSAgICAgICAgICAgICAgICAgICAgd2FpdER1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVxdWVzdC0+bU91dHB1dFN1cmZhY2VzW2pdKTsKLSAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgICAgICAvLyBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciBmcm9tIGdyYWxsb2MgcXVldWUgLSB0aGlzIGNvdWxkIGJlIGR1ZSB0bwotICAgICAgICAgICAgICAgIC8vIGFiYW5kb25lZCBxdWV1ZSBvciBvdGhlciBjb25zdW1lciBtaXNiZWhhdmlvciwgc28gbm90IGEgZmF0YWwKLSAgICAgICAgICAgICAgICAvLyBlcnJvcgotICAgICAgICAgICAgICAgIEFMT0dFKCJSZXF1ZXN0VGhyZWFkOiBDYW4ndCBnZXQgb3V0cHV0IGJ1ZmZlciwgc2tpcHBpbmcgcmVxdWVzdDoiCi0gICAgICAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHNpemVfdD4gdW5pcXVlU3VyZmFjZUlkczsKKyAgICAgICAgICAgIHJlcyA9IG91dHB1dFN0cmVhbS0+Z2V0VW5pcXVlU3VyZmFjZUlkcygKKyAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdXJmYWNlc1tzdHJlYW1JZF0sCisgICAgICAgICAgICAgICAgICAgICZ1bmlxdWVTdXJmYWNlSWRzKTsKKyAgICAgICAgICAgIC8vIElOVkFMSURfT1BFUkFUSU9OIGlzIG5vcm1hbCBvdXRwdXQgZm9yIHN0cmVhbXMgbm90IHN1cHBvcnRpbmcgc3VyZmFjZUlkcworICAgICAgICAgICAgaWYgKHJlcyAhPSBPSyAmJiByZXMgIT0gSU5WQUxJRF9PUEVSQVRJT04pIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IGZhaWxlZCB0byBxdWVyeSBzdHJlYW0gJWQgdW5pcXVlIHN1cmZhY2UgSURzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgc3RyZWFtSWQpOworICAgICAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgICAgICAgICAgdW5pcXVlU3VyZmFjZUlkTWFwLmluc2VydCh7c3RyZWFtSWQsIHN0ZDo6bW92ZSh1bmlxdWVTdXJmYWNlSWRzKX0pOworICAgICAgICAgICAgfQogCi0gICAgICAgICAgICAgICAgcmV0dXJuIFRJTUVEX09VVDsKKyAgICAgICAgICAgIGlmIChtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgICAgIGlmIChvdXRwdXRTdHJlYW0tPmlzQWJhbmRvbmVkKCkpIHsKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBzdHJlYW0gJWQgaXMgYWJhbmRvbmVkLCBza2lwcGluZyByZXF1ZXN0IiwgX19GVU5DVElPTl9fLCBzdHJlYW1JZCk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBUSU1FRF9PVVQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEhBTCB3aWxsIHJlcXVlc3QgYnVmZmVyIHRocm91Z2ggcmVxdWVzdFN0cmVhbUJ1ZmZlciBBUEkKKyAgICAgICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9idWZmZXJfdCYgYnVmZmVyID0gb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChqKTsKKyAgICAgICAgICAgICAgICBidWZmZXIuc3RyZWFtID0gb3V0cHV0U3RyZWFtLT5hc0hhbFN0cmVhbSgpOworICAgICAgICAgICAgICAgIGJ1ZmZlci5idWZmZXIgPSBudWxscHRyOworICAgICAgICAgICAgICAgIGJ1ZmZlci5zdGF0dXMgPSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfT0s7CisgICAgICAgICAgICAgICAgYnVmZmVyLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgICAgICAgICBidWZmZXIucmVsZWFzZV9mZW5jZSA9IC0xOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXMgPSBvdXRwdXRTdHJlYW0tPmdldEJ1ZmZlcigmb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChqKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHdhaXREdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3VyZmFjZXNbc3RyZWFtSWRdKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIENhbid0IGdldCBvdXRwdXQgYnVmZmVyIGZyb20gZ3JhbGxvYyBxdWV1ZSAtIHRoaXMgY291bGQgYmUgZHVlIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIGFiYW5kb25lZCBxdWV1ZSBvciBvdGhlciBjb25zdW1lciBtaXNiZWhhdmlvciwgc28gbm90IGEgZmF0YWwKKyAgICAgICAgICAgICAgICAgICAgLy8gZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgQUxPR1YoIlJlcXVlc3RUaHJlYWQ6IENhbid0IGdldCBvdXRwdXQgYnVmZmVyLCBza2lwcGluZyByZXF1ZXN0OiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKworICAgICAgICAgICAgICAgICAgICByZXR1cm4gVElNRURfT1VUOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIHNwPENhbWVyYTNEZXZpY2U+IHBhcmVudCA9IG1QYXJlbnQucHJvbW90ZSgpOworICAgICAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBzdHJlYW1DYW1lcmFJZCA9IG91dHB1dFN0cmVhbS0+Z2V0UGh5c2ljYWxDYW1lcmFJZCgpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHNldHRpbmdzIDogY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RyZWFtQ2FtZXJhSWQuaXNFbXB0eSgpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+Z2V0SWQoKSA9PSBzZXR0aW5ncy5jYW1lcmFJZC5jX3N0cigpKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1DYW1lcmFJZCA9PSBzZXR0aW5ncy5jYW1lcmFJZC5jX3N0cigpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0U3RyZWFtLT5maXJlQnVmZmVyUmVxdWVzdEZvckZyYW1lTnVtYmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1SZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXR0aW5ncy5tZXRhZGF0YSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAKICAgICAgICAgICAgIFN0cmluZzggcGh5c2ljYWxDYW1lcmFJZCA9IG91dHB1dFN0cmVhbS0+Z2V0UGh5c2ljYWxDYW1lcmFJZCgpOwpAQCAtNDk1MywxNSArNTc0NywzMiBAQAogICAgICAgICAvLyBwcmV2aWV3KSwgYW5kIHRoZSBjdXJyZW50IHJlcXVlc3QgaXMgbm90IHRoZSBsYXN0IG9uZSBpbiB0aGUgYmF0Y2gsCiAgICAgICAgIC8vIGRvIG5vdCBzZW5kIGNhbGxiYWNrIHRvIHRoZSBhcHAuCiAgICAgICAgIGJvb2wgaGFzQ2FsbGJhY2sgPSB0cnVlOwotICAgICAgICBpZiAobU5leHRSZXF1ZXN0c1swXS5jYXB0dXJlUmVxdWVzdC0+bUJhdGNoU2l6ZSA+IDEgJiYgaSAhPSBtTmV4dFJlcXVlc3RzLnNpemUoKS0xKSB7CisgICAgICAgIGlmIChiYXRjaGVkUmVxdWVzdCAmJiBpICE9IG1OZXh0UmVxdWVzdHMuc2l6ZSgpLTEpIHsKICAgICAgICAgICAgIGhhc0NhbGxiYWNrID0gZmFsc2U7CiAgICAgICAgIH0KKyAgICAgICAgYm9vbCBpc1N0aWxsQ2FwdHVyZSA9IGZhbHNlOworICAgICAgICBib29sIGlzWnNsQ2FwdHVyZSA9IGZhbHNlOworICAgICAgICBpZiAoIW1OZXh0UmVxdWVzdHNbMF0uY2FwdHVyZVJlcXVlc3QtPm1TZXR0aW5nc0xpc3QuYmVnaW4oKS0+bWV0YWRhdGEuaXNFbXB0eSgpKSB7CisgICAgICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCBlID0gY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5X3QoKTsKKyAgICAgICAgICAgIGZpbmRfY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5KGhhbFJlcXVlc3QtPnNldHRpbmdzLCBBTkRST0lEX0NPTlRST0xfQ0FQVFVSRV9JTlRFTlQsICZlKTsKKyAgICAgICAgICAgIGlmICgoZS5jb3VudCA+IDApICYmIChlLmRhdGEudThbMF0gPT0gQU5EUk9JRF9DT05UUk9MX0NBUFRVUkVfSU5URU5UX1NUSUxMX0NBUFRVUkUpKSB7CisgICAgICAgICAgICAgICAgaXNTdGlsbENhcHR1cmUgPSB0cnVlOworICAgICAgICAgICAgICAgIEFUUkFDRV9BU1lOQ19CRUdJTigic3RpbGwgY2FwdHVyZSIsIG1OZXh0UmVxdWVzdHNbaV0uaGFsUmVxdWVzdC5mcmFtZV9udW1iZXIpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaW5kX2NhbWVyYV9tZXRhZGF0YV9yb19lbnRyeShoYWxSZXF1ZXN0LT5zZXR0aW5ncywgQU5EUk9JRF9DT05UUk9MX0VOQUJMRV9aU0wsICZlKTsKKyAgICAgICAgICAgIGlmICgoZS5jb3VudCA+IDApICYmIChlLmRhdGEudThbMF0gPT0gQU5EUk9JRF9DT05UUk9MX0VOQUJMRV9aU0xfVFJVRSkpIHsKKyAgICAgICAgICAgICAgICBpc1pzbENhcHR1cmUgPSB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICAgIHJlcyA9IHBhcmVudC0+cmVnaXN0ZXJJbkZsaWdodChoYWxSZXF1ZXN0LT5mcmFtZV9udW1iZXIsCiAgICAgICAgICAgICAgICAgdG90YWxOdW1CdWZmZXJzLCBjYXB0dXJlUmVxdWVzdC0+bVJlc3VsdEV4dHJhcywKICAgICAgICAgICAgICAgICAvKmhhc0lucHV0Ki9oYWxSZXF1ZXN0LT5pbnB1dF9idWZmZXIgIT0gTlVMTCwKICAgICAgICAgICAgICAgICBoYXNDYWxsYmFjaywKICAgICAgICAgICAgICAgICBjYWxjdWxhdGVNYXhFeHBlY3RlZER1cmF0aW9uKGhhbFJlcXVlc3QtPnNldHRpbmdzKSwKLSAgICAgICAgICAgICAgICByZXF1ZXN0ZWRQaHlzaWNhbENhbWVyYXMpOworICAgICAgICAgICAgICAgIHJlcXVlc3RlZFBoeXNpY2FsQ2FtZXJhcywgaXNTdGlsbENhcHR1cmUsIGlzWnNsQ2FwdHVyZSwKKyAgICAgICAgICAgICAgICAobVVzZUhhbEJ1Zk1hbmFnZXIpID8gdW5pcXVlU3VyZmFjZUlkTWFwIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3VyZmFjZU1hcHt9KTsKICAgICAgICAgQUxPR1ZWKCIlczogcmVnaXN0ZXJlZCBpbiBmbGlnaHQgcmVxdWVzdElkID0gJSIgUFJJZDMyICIsIGZyYW1lTnVtYmVyID0gJSIgUFJJZDY0CiAgICAgICAgICAgICAgICAiLCBidXJzdElkID0gJSIgUFJJZDMyICIuIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sCkBAIC01MDM3LDcgKzU4NDgsNyBAQAogICAgICAgICAgICAgaWYgKHMuZmlyc3QgPT0gc3RyZWFtSWQpIHsKICAgICAgICAgICAgICAgICBjb25zdCBhdXRvICZpdCA9IHN0ZDo6ZmluZChzLnNlY29uZC5iZWdpbigpLCBzLnNlY29uZC5lbmQoKSwgc3VyZmFjZUlkKTsKICAgICAgICAgICAgICAgICBpZiAoaXQgIT0gcy5zZWNvbmQuZW5kKCkpIHsKLSAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTUwNDgsNyArNTg1OSw3IEBACiAgICAgICAgICAgICBpZiAocy5maXJzdCA9PSBzdHJlYW1JZCkgewogICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gJml0ID0gc3RkOjpmaW5kKHMuc2Vjb25kLmJlZ2luKCksIHMuc2Vjb25kLmVuZCgpLCBzdXJmYWNlSWQpOwogICAgICAgICAgICAgICAgIGlmIChpdCAhPSBzLnNlY29uZC5lbmQoKSkgewotICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtNTA1Nyw2ICs1ODY4LDIyIEBACiAgICAgcmV0dXJuIGZhbHNlOwogfQogCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RUaHJlYWQ6OnNpZ25hbFBpcGVsaW5lRHJhaW4oY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgc3RyZWFtSWRzKSB7CisgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICBBTE9HRSgiJXMgY2FsbGVkIGZvciBjYW1lcmEgZGV2aWNlIG5vdCBzdXBwb3J0aW5nIEhBTCBidWZmZXIgbWFuYWdlbWVudCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBNdXRleDo6QXV0b2xvY2sgcGwobVBhdXNlTG9jayk7CisgICAgaWYgKG1QYXVzZWQpIHsKKyAgICAgICAgbUludGVyZmFjZS0+c2lnbmFsUGlwZWxpbmVEcmFpbihzdHJlYW1JZHMpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIC8vIElmIHJlcXVlc3QgdGhyZWFkIGlzIHN0aWxsIGJ1c3ksIHdhaXQgdW50aWwgcGF1c2VkIHRoZW4gbm90aWZ5IEhBTAorICAgIG1Ob3RpZnlQaXBlbGluZURyYWluID0gdHJ1ZTsKKyAgICBtU3RyZWFtSWRzVG9CZURyYWluZWQgPSBzdHJlYW1JZHM7Cit9CisKIG5zZWNzX3QgQ2FtZXJhM0RldmljZTo6Z2V0RXhwZWN0ZWRJbkZsaWdodER1cmF0aW9uKCkgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGFsKG1JbkZsaWdodExvY2spOwpAQCAtNTExNCwxNiArNTk0MSwyMSBAQAogICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1JbnB1dFN0cmVhbS0+cmV0dXJuSW5wdXRCdWZmZXIoY2FwdHVyZVJlcXVlc3QtPm1JbnB1dEJ1ZmZlcik7CiAgICAgICAgIH0KIAotICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGhhbFJlcXVlc3QtPm51bV9vdXRwdXRfYnVmZmVyczsgaSsrKSB7Ci0gICAgICAgICAgICAvL0J1ZmZlcnMgdGhhdCBmYWlsZWQgcHJvY2Vzc2luZyBjb3VsZCBzdGlsbCBoYXZlCi0gICAgICAgICAgICAvL3ZhbGlkIGFjcXVpcmUgZmVuY2UuCi0gICAgICAgICAgICBpbnQgYWNxdWlyZUZlbmNlID0gKCpvdXRwdXRCdWZmZXJzKVtpXS5hY3F1aXJlX2ZlbmNlOwotICAgICAgICAgICAgaWYgKDAgPD0gYWNxdWlyZUZlbmNlKSB7Ci0gICAgICAgICAgICAgICAgY2xvc2UoYWNxdWlyZUZlbmNlKTsKLSAgICAgICAgICAgICAgICBvdXRwdXRCdWZmZXJzLT5lZGl0SXRlbUF0KGkpLmFjcXVpcmVfZmVuY2UgPSAtMTsKKyAgICAgICAgLy8gTm8gb3V0cHV0IGJ1ZmZlciBjYW4gYmUgcmV0dXJuZWQgd2hlbiB1c2luZyBIQUwgYnVmZmVyIG1hbmFnZXIKKyAgICAgICAgaWYgKCFtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBoYWxSZXF1ZXN0LT5udW1fb3V0cHV0X2J1ZmZlcnM7IGkrKykgeworICAgICAgICAgICAgICAgIC8vQnVmZmVycyB0aGF0IGZhaWxlZCBwcm9jZXNzaW5nIGNvdWxkIHN0aWxsIGhhdmUKKyAgICAgICAgICAgICAgICAvL3ZhbGlkIGFjcXVpcmUgZmVuY2UuCisgICAgICAgICAgICAgICAgaW50IGFjcXVpcmVGZW5jZSA9ICgqb3V0cHV0QnVmZmVycylbaV0uYWNxdWlyZV9mZW5jZTsKKyAgICAgICAgICAgICAgICBpZiAoMCA8PSBhY3F1aXJlRmVuY2UpIHsKKyAgICAgICAgICAgICAgICAgICAgY2xvc2UoYWNxdWlyZUZlbmNlKTsKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0QnVmZmVycy0+ZWRpdEl0ZW1BdChpKS5hY3F1aXJlX2ZlbmNlID0gLTE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnMtPmVkaXRJdGVtQXQoaSkuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOworICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tT3V0cHV0U3RyZWFtcy5lZGl0SXRlbUF0KGkpLT5yZXR1cm5CdWZmZXIoKCpvdXRwdXRCdWZmZXJzKVtpXSwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qdGltZXN0YW1wSW5jcmVhc2luZyovdHJ1ZSwgc3RkOjp2ZWN0b3I8c2l6ZV90PiAoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNhcHR1cmVSZXF1ZXN0LT5tUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyKTsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dHB1dEJ1ZmZlcnMtPmVkaXRJdGVtQXQoaSkuc3RhdHVzID0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SOwotICAgICAgICAgICAgY2FwdHVyZVJlcXVlc3QtPm1PdXRwdXRTdHJlYW1zLmVkaXRJdGVtQXQoaSktPnJldHVybkJ1ZmZlcigoKm91dHB1dEJ1ZmZlcnMpW2ldLCAwKTsKICAgICAgICAgfQogCiAgICAgICAgIGlmIChzZW5kUmVxdWVzdEVycm9yKSB7CkBAIC01MjI5LDExICs2MDYxLDIwIEBACiAgICAgICAgICAgICBpZiAobVBhdXNlZCA9PSBmYWxzZSkgewogICAgICAgICAgICAgICAgIEFMT0dWKCIlczogUmVxdWVzdFRocmVhZDogR29pbmcgaWRsZSIsIF9fRlVOQ1RJT05fXyk7CiAgICAgICAgICAgICAgICAgbVBhdXNlZCA9IHRydWU7CisgICAgICAgICAgICAgICAgaWYgKG1Ob3RpZnlQaXBlbGluZURyYWluKSB7CisgICAgICAgICAgICAgICAgICAgIG1JbnRlcmZhY2UtPnNpZ25hbFBpcGVsaW5lRHJhaW4obVN0cmVhbUlkc1RvQmVEcmFpbmVkKTsKKyAgICAgICAgICAgICAgICAgICAgbU5vdGlmeVBpcGVsaW5lRHJhaW4gPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgbVN0cmVhbUlkc1RvQmVEcmFpbmVkLmNsZWFyKCk7CisgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgIC8vIExldCB0aGUgdHJhY2tlciBrbm93CiAgICAgICAgICAgICAgICAgc3A8U3RhdHVzVHJhY2tlcj4gc3RhdHVzVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKICAgICAgICAgICAgICAgICBpZiAoc3RhdHVzVHJhY2tlciAhPSAwKSB7CiAgICAgICAgICAgICAgICAgICAgIHN0YXR1c1RyYWNrZXItPm1hcmtDb21wb25lbnRJZGxlKG1TdGF0dXNJZCwgRmVuY2U6Ok5PX0ZFTkNFKTsKICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgICAgICAgICAgICAgaWYgKHBhcmVudCAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+bVJlcXVlc3RCdWZmZXJTTS5vblJlcXVlc3RUaHJlYWRQYXVzZWQoKTsKKyAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICAvLyBTdG9wIHdhaXRpbmcgZm9yIG5vdyBhbmQgbGV0IHRocmVhZCBtYW5hZ2VtZW50IGhhcHBlbgogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CkBAIC01MzEzLDExICs2MTU0LDIwIEBACiAgICAgICAgIGlmIChtUGF1c2VkID09IGZhbHNlKSB7CiAgICAgICAgICAgICBtUGF1c2VkID0gdHJ1ZTsKICAgICAgICAgICAgIEFMT0dWKCIlczogUmVxdWVzdFRocmVhZDogUGF1c2VkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIGlmIChtTm90aWZ5UGlwZWxpbmVEcmFpbikgeworICAgICAgICAgICAgICAgIG1JbnRlcmZhY2UtPnNpZ25hbFBpcGVsaW5lRHJhaW4obVN0cmVhbUlkc1RvQmVEcmFpbmVkKTsKKyAgICAgICAgICAgICAgICBtTm90aWZ5UGlwZWxpbmVEcmFpbiA9IGZhbHNlOworICAgICAgICAgICAgICAgIG1TdHJlYW1JZHNUb0JlRHJhaW5lZC5jbGVhcigpOworICAgICAgICAgICAgfQogICAgICAgICAgICAgLy8gTGV0IHRoZSB0cmFja2VyIGtub3cKICAgICAgICAgICAgIHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIgPSBtU3RhdHVzVHJhY2tlci5wcm9tb3RlKCk7CiAgICAgICAgICAgICBpZiAoc3RhdHVzVHJhY2tlciAhPSAwKSB7CiAgICAgICAgICAgICAgICAgc3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudElkbGUobVN0YXR1c0lkLCBGZW5jZTo6Tk9fRkVOQ0UpOwogICAgICAgICAgICAgfQorICAgICAgICAgICAgc3A8Q2FtZXJhM0RldmljZT4gcGFyZW50ID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgICAgICAgICBpZiAocGFyZW50ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBwYXJlbnQtPm1SZXF1ZXN0QnVmZmVyU00ub25SZXF1ZXN0VGhyZWFkUGF1c2VkKCk7CisgICAgICAgICAgICB9CiAgICAgICAgIH0KIAogICAgICAgICByZXMgPSBtRG9QYXVzZVNpZ25hbC53YWl0UmVsYXRpdmUobVBhdXNlTG9jaywga1JlcXVlc3RUaW1lb3V0KTsKQEAgLTU3NzMsMjMgKzY2MjMsMTc0IEBACiAgICAgcmV0dXJuIHRydWU7CiB9CiAKLS8qKgotICogU3RhdGljIGNhbGxiYWNrIGZvcndhcmRpbmcgbWV0aG9kcyBmcm9tIEhBTCB0byBpbnN0YW5jZQotICovCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjppbml0aWFsaXplKAorICAgICAgICBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyKSB7CisgICAgaWYgKHN0YXR1c1RyYWNrZXIgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IHN0YXR1c1RyYWNrZXIgaXMgbnVsbCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQogCi12b2lkIENhbWVyYTNEZXZpY2U6OnNQcm9jZXNzQ2FwdHVyZVJlc3VsdChjb25zdCBjYW1lcmEzX2NhbGxiYWNrX29wcyAqY2IsCi0gICAgICAgIGNvbnN0IGNhbWVyYTNfY2FwdHVyZV9yZXN1bHQgKnJlc3VsdCkgewotICAgIENhbWVyYTNEZXZpY2UgKmQgPQotICAgICAgICAgICAgY29uc3RfY2FzdDxDYW1lcmEzRGV2aWNlKj4oc3RhdGljX2Nhc3Q8Y29uc3QgQ2FtZXJhM0RldmljZSo+KGNiKSk7Ci0KLSAgICBkLT5wcm9jZXNzQ2FwdHVyZVJlc3VsdChyZXN1bHQpOworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKKyAgICBtU3RhdHVzVHJhY2tlciA9IHN0YXR1c1RyYWNrZXI7CisgICAgbVJlcXVlc3RCdWZmZXJTdGF0dXNJZCA9IHN0YXR1c1RyYWNrZXItPmFkZENvbXBvbmVudCgpOworICAgIHJldHVybiBPSzsKIH0KIAotdm9pZCBDYW1lcmEzRGV2aWNlOjpzTm90aWZ5KGNvbnN0IGNhbWVyYTNfY2FsbGJhY2tfb3BzICpjYiwKLSAgICAgICAgY29uc3QgY2FtZXJhM19ub3RpZnlfbXNnICptc2cpIHsKLSAgICBDYW1lcmEzRGV2aWNlICpkID0KLSAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Q2FtZXJhM0RldmljZSo+KHN0YXRpY19jYXN0PGNvbnN0IENhbWVyYTNEZXZpY2UqPihjYikpOwotICAgIGQtPm5vdGlmeShtc2cpOworYm9vbCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpzdGFydFJlcXVlc3RCdWZmZXIoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmIChtU3RhdHVzID09IFJCX1NUQVRVU19SRUFEWSB8fCBtU3RhdHVzID09IFJCX1NUQVRVU19QRU5ESU5HX1NUT1ApIHsKKyAgICAgICAgbVJlcXVlc3RCdWZmZXJPbmdvaW5nID0gdHJ1ZTsKKyAgICAgICAgbm90aWZ5VHJhY2tlckxvY2tlZCgvKmFjdGl2ZSovdHJ1ZSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK3ZvaWQgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6ZW5kUmVxdWVzdEJ1ZmZlcigpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CisgICAgaWYgKCFtUmVxdWVzdEJ1ZmZlck9uZ29pbmcpIHsKKyAgICAgICAgQUxPR0UoIiVzIGNhbGxlZCB3aXRob3V0IGEgc3VjY2Vzc2Z1bCBzdGFydFJlcXVlc3RCdWZmZXIgY2FsbCBmaXJzdCEiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIG1SZXF1ZXN0QnVmZmVyT25nb2luZyA9IGZhbHNlOworICAgIGlmIChtU3RhdHVzID09IFJCX1NUQVRVU19QRU5ESU5HX1NUT1ApIHsKKyAgICAgICAgY2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKTsKKyAgICB9CisgICAgbm90aWZ5VHJhY2tlckxvY2tlZCgvKmFjdGl2ZSovZmFsc2UpOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om9uU3RyZWFtc0NvbmZpZ3VyZWQoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1TdGF0dXMgPSBSQl9TVEFUVVNfUkVBRFk7CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om9uU3VibWl0dGluZ1JlcXVlc3QoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1SZXF1ZXN0VGhyZWFkUGF1c2VkID0gZmFsc2U7CisgICAgLy8gaW5mbGlnaHQgbWFwIHJlZ2lzdGVyIGFjdHVhbGx5IGhhcHBlbnMgaW4gcHJlcGFyZUhhbFJlcXVlc3Qgbm93LCBidXQgaXQgaXMgY2xvc2UgZW5vdWdoCisgICAgLy8gYXBwcm94aW1hdGlvbi4KKyAgICBtSW5mbGlnaHRNYXBFbXB0eSA9IGZhbHNlOworICAgIGlmIChtU3RhdHVzID09IFJCX1NUQVRVU19TVE9QUEVEKSB7CisgICAgICAgIG1TdGF0dXMgPSBSQl9TVEFUVVNfUkVBRFk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpvblJlcXVlc3RUaHJlYWRQYXVzZWQoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1SZXF1ZXN0VGhyZWFkUGF1c2VkID0gdHJ1ZTsKKyAgICBpZiAobVN0YXR1cyA9PSBSQl9TVEFUVVNfUEVORElOR19TVE9QKSB7CisgICAgICAgIGNoZWNrU3dpdGNoVG9TdG9wTG9ja2VkKCk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpvbkluZmxpZ2h0TWFwRW1wdHkoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIG1JbmZsaWdodE1hcEVtcHR5ID0gdHJ1ZTsKKyAgICBpZiAobVN0YXR1cyA9PSBSQl9TVEFUVVNfUEVORElOR19TVE9QKSB7CisgICAgICAgIGNoZWNrU3dpdGNoVG9TdG9wTG9ja2VkKCk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBDYW1lcmEzRGV2aWNlOjpSZXF1ZXN0QnVmZmVyU3RhdGVNYWNoaW5lOjpvbldhaXRVbnRpbElkbGUoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobUxvY2spOworICAgIGlmICghY2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKSkgeworICAgICAgICBtU3RhdHVzID0gUkJfU1RBVFVTX1BFTkRJTkdfU1RPUDsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIENhbWVyYTNEZXZpY2U6OlJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmU6Om5vdGlmeVRyYWNrZXJMb2NrZWQoYm9vbCBhY3RpdmUpIHsKKyAgICBzcDxTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyID0gbVN0YXR1c1RyYWNrZXIucHJvbW90ZSgpOworICAgIGlmIChzdGF0dXNUcmFja2VyICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKGFjdGl2ZSkgeworICAgICAgICAgICAgc3RhdHVzVHJhY2tlci0+bWFya0NvbXBvbmVudEFjdGl2ZShtUmVxdWVzdEJ1ZmZlclN0YXR1c0lkKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHN0YXR1c1RyYWNrZXItPm1hcmtDb21wb25lbnRJZGxlKG1SZXF1ZXN0QnVmZmVyU3RhdHVzSWQsIEZlbmNlOjpOT19GRU5DRSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2Jvb2wgQ2FtZXJhM0RldmljZTo6UmVxdWVzdEJ1ZmZlclN0YXRlTWFjaGluZTo6Y2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKSB7CisgICAgaWYgKG1JbmZsaWdodE1hcEVtcHR5ICYmIG1SZXF1ZXN0VGhyZWFkUGF1c2VkICYmICFtUmVxdWVzdEJ1ZmZlck9uZ29pbmcpIHsKKyAgICAgICAgbVN0YXR1cyA9IFJCX1NUQVRVU19TVE9QUEVEOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0dXNfdCBDYW1lcmEzRGV2aWNlOjpmaXh1cE1vbm9jaHJvbWVUYWdzKGNvbnN0IENhbWVyYU1ldGFkYXRhJiBkZXZpY2VJbmZvLAorICAgICAgICBDYW1lcmFNZXRhZGF0YSYgcmVzdWx0TWV0YWRhdGEpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKyAgICBpZiAoIW1OZWVkRml4dXBNb25vY2hyb21lVGFncykgeworICAgICAgICByZXR1cm4gcmVzOworICAgIH0KKworICAgIC8vIFJlbW92ZSB0YWdzIHRoYXQgYXJlIG5vdCBhcHBsaWNhYmxlIHRvIG1vbm9jaHJvbWUgY2FtZXJhLgorICAgIGludDMyX3QgdGFnc1RvUmVtb3ZlW10gPSB7CisgICAgICAgICAgIEFORFJPSURfU0VOU09SX0dSRUVOX1NQTElULAorICAgICAgICAgICBBTkRST0lEX1NFTlNPUl9ORVVUUkFMX0NPTE9SX1BPSU5ULAorICAgICAgICAgICBBTkRST0lEX0NPTE9SX0NPUlJFQ1RJT05fTU9ERSwKKyAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX1RSQU5TRk9STSwKKyAgICAgICAgICAgQU5EUk9JRF9DT0xPUl9DT1JSRUNUSU9OX0dBSU5TLAorICAgIH07CisgICAgZm9yIChhdXRvIHRhZyA6IHRhZ3NUb1JlbW92ZSkgeworICAgICAgICByZXMgPSByZXN1bHRNZXRhZGF0YS5lcmFzZSh0YWcpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IEZhaWxlZCB0byByZW1vdmUgdGFnICVkIGZvciBtb25vY2hyb21lIGNhbWVyYSIsIF9fRlVOQ1RJT05fXywgdGFnKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBTkRST0lEX1NFTlNPUl9EWU5BTUlDX0JMQUNLX0xFVkVMCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGJsRW50cnkgPSByZXN1bHRNZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX0RZTkFNSUNfQkxBQ0tfTEVWRUwpOworICAgIGZvciAoc2l6ZV90IGkgPSAxOyBpIDwgYmxFbnRyeS5jb3VudDsgaSsrKSB7CisgICAgICAgIGJsRW50cnkuZGF0YS5mW2ldID0gYmxFbnRyeS5kYXRhLmZbMF07CisgICAgfQorCisgICAgLy8gQU5EUk9JRF9TRU5TT1JfTk9JU0VfUFJPRklMRQorICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSBucEVudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1NFTlNPUl9OT0lTRV9QUk9GSUxFKTsKKyAgICBpZiAobnBFbnRyeS5jb3VudCA+IDAgJiYgbnBFbnRyeS5jb3VudCAlIDIgPT0gMCkgeworICAgICAgICBkb3VibGUgbnBbXSA9IHtucEVudHJ5LmRhdGEuZFswXSwgbnBFbnRyeS5kYXRhLmRbMV19OworICAgICAgICByZXMgPSByZXN1bHRNZXRhZGF0YS51cGRhdGUoQU5EUk9JRF9TRU5TT1JfTk9JU0VfUFJPRklMRSwgbnAsIDIpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICAgQUxPR0UoIiVzOiBGYWlsZWQgdG8gdXBkYXRlIFNFTlNPUl9OT0lTRV9QUk9GSUxFOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIHJldHVybiByZXM7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBTkRST0lEX1NUQVRJU1RJQ1NfTEVOU19TSEFESU5HX01BUAorICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBsc1NpemVFbnRyeSA9IGRldmljZUluZm8uZmluZChBTkRST0lEX0xFTlNfSU5GT19TSEFESU5HX01BUF9TSVpFKTsKKyAgICBjYW1lcmFfbWV0YWRhdGFfZW50cnkgbHNFbnRyeSA9IHJlc3VsdE1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TVEFUSVNUSUNTX0xFTlNfU0hBRElOR19NQVApOworICAgIGlmIChsc1NpemVFbnRyeS5jb3VudCA9PSAyICYmIGxzRW50cnkuY291bnQgPiAwCisgICAgICAgICAgICAmJiAoaW50MzJfdClsc0VudHJ5LmNvdW50ID09IDQgKiBsc1NpemVFbnRyeS5kYXRhLmkzMlswXSAqIGxzU2l6ZUVudHJ5LmRhdGEuaTMyWzFdKSB7CisgICAgICAgIGZvciAoaW50MzJfdCBpID0gMDsgaSA8IGxzU2l6ZUVudHJ5LmRhdGEuaTMyWzBdICogbHNTaXplRW50cnkuZGF0YS5pMzJbMV07IGkrKykgeworICAgICAgICAgICAgbHNFbnRyeS5kYXRhLmZbNCppKzFdID0gbHNFbnRyeS5kYXRhLmZbNCppXTsKKyAgICAgICAgICAgIGxzRW50cnkuZGF0YS5mWzQqaSsyXSA9IGxzRW50cnkuZGF0YS5mWzQqaV07CisgICAgICAgICAgICBsc0VudHJ5LmRhdGEuZls0KmkrM10gPSBsc0VudHJ5LmRhdGEuZls0KmldOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gQU5EUk9JRF9UT05FTUFQX0NVUlZFX0JMVUUKKyAgICAvLyBBTkRST0lEX1RPTkVNQVBfQ1VSVkVfR1JFRU4KKyAgICAvLyBBTkRST0lEX1RPTkVNQVBfQ1VSVkVfUkVECisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHRjYkVudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1RPTkVNQVBfQ1VSVkVfQkxVRSk7CisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IHRjZ0VudHJ5ID0gcmVzdWx0TWV0YWRhdGEuZmluZChBTkRST0lEX1RPTkVNQVBfQ1VSVkVfR1JFRU4pOworICAgIGNhbWVyYV9tZXRhZGF0YV9lbnRyeSB0Y3JFbnRyeSA9IHJlc3VsdE1ldGFkYXRhLmZpbmQoQU5EUk9JRF9UT05FTUFQX0NVUlZFX1JFRCk7CisgICAgaWYgKHRjYkVudHJ5LmNvdW50ID4gMAorICAgICAgICAgICAgJiYgdGNiRW50cnkuY291bnQgPT0gdGNnRW50cnkuY291bnQKKyAgICAgICAgICAgICYmIHRjYkVudHJ5LmNvdW50ID09IHRjckVudHJ5LmNvdW50KSB7CisgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGNiRW50cnkuY291bnQ7IGkrKykgeworICAgICAgICAgICAgdGNiRW50cnkuZGF0YS5mW2ldID0gdGNyRW50cnkuZGF0YS5mW2ldOworICAgICAgICAgICAgdGNnRW50cnkuZGF0YS5mW2ldID0gdGNyRW50cnkuZGF0YS5mW2ldOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlczsKIH0KIAogfTsgLy8gbmFtZXNwYWNlIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0RldmljZS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKaW5kZXggNmQyMzc2MC4uOWIwNjQ4ZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRGV2aWNlLmgKQEAgLTMzLDEwICszMywxMSBAQAogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvSUNhbWVyYURldmljZVNlc3Npb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4zL0lDYW1lcmFEZXZpY2VTZXNzaW9uLmg+CiAjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNC9JQ2FtZXJhRGV2aWNlU2Vzc2lvbi5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjUvSUNhbWVyYURldmljZVNlc3Npb24uaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYS9kZXZpY2UvMy4yL0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjQvSUNhbWVyYURldmljZUNhbGxiYWNrLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuNS9JQ2FtZXJhRGV2aWNlQ2FsbGJhY2suaD4KICNpbmNsdWRlIDxmbXEvTWVzc2FnZVF1ZXVlLmg+Ci0jaW5jbHVkZSA8aGFyZHdhcmUvY2FtZXJhMy5oPgogCiAjaW5jbHVkZSA8Y2FtZXJhL0NhcHR1cmVSZXN1bHQuaD4KIApAQCAtNTAsMjAgKzUxLDYgQEAKIAogdXNpbmcgYW5kcm9pZDo6Y2FtZXJhMzo6T3V0cHV0U3RyZWFtSW5mbzsKIAotLyoqCi0gKiBGdW5jdGlvbiBwb2ludGVyIHR5cGVzIHdpdGggQyBjYWxsaW5nIGNvbnZlbnRpb24gdG8KLSAqIHVzZSBmb3IgSEFMIGNhbGxiYWNrIGZ1bmN0aW9ucy4KLSAqLwotZXh0ZXJuICJDIiB7Ci0gICAgdHlwZWRlZiB2b2lkIChjYWxsYmFja3NfcHJvY2Vzc19jYXB0dXJlX3Jlc3VsdF90KSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGNhbWVyYTNfY2FsbGJhY2tfb3BzICosCi0gICAgICAgIGNvbnN0IGNhbWVyYTNfY2FwdHVyZV9yZXN1bHRfdCAqKTsKLQotICAgIHR5cGVkZWYgdm9pZCAoY2FsbGJhY2tzX25vdGlmeV90KSgKLSAgICAgICAgY29uc3Qgc3RydWN0IGNhbWVyYTNfY2FsbGJhY2tfb3BzICosCi0gICAgICAgIGNvbnN0IGNhbWVyYTNfbm90aWZ5X21zZ190ICopOwotfQotCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKIG5hbWVzcGFjZSBjYW1lcmEzIHsKQEAgLTgwLDggKzY3LDcgQEAKICAqLwogY2xhc3MgQ2FtZXJhM0RldmljZSA6CiAgICAgICAgICAgICBwdWJsaWMgQ2FtZXJhRGV2aWNlQmFzZSwKLSAgICAgICAgICAgIHZpcnR1YWwgcHVibGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZUNhbGxiYWNrLAotICAgICAgICAgICAgcHJpdmF0ZSBjYW1lcmEzX2NhbGxiYWNrX29wcyB7CisgICAgICAgICAgICB2aXJ0dWFsIHB1YmxpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OklDYW1lcmFEZXZpY2VDYWxsYmFjayB7CiAgIHB1YmxpYzoKIAogICAgIGV4cGxpY2l0IENhbWVyYTNEZXZpY2UoY29uc3QgU3RyaW5nOCYgaWQpOwpAQCAtMjA4LDggKzE5NCwzMiBAQAogICAgICAqLwogICAgIHN0YXR1c190IGRyb3BTdHJlYW1CdWZmZXJzKGJvb2wgZHJvcHBpbmcsIGludCBzdHJlYW1JZCkgb3ZlcnJpZGU7CiAKKyAgICAvKioKKyAgICAgKiBIZWxwZXIgZnVuY3Rpb25zIHRvIG1hcCBiZXR3ZWVuIGZyYW1ld29yayBhbmQgSElETCB2YWx1ZXMKKyAgICAgKi8KKyAgICBzdGF0aWMgaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IG1hcFRvUGl4ZWxGb3JtYXQoaW50IGZyYW1ld29ya0Zvcm1hdCk7CisgICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6RGF0YXNwYWNlRmxhZ3MgbWFwVG9IaWRsRGF0YXNwYWNlKAorICAgICAgICAgICAgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlKTsKKyAgICBzdGF0aWMgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIG1hcFRvQ29uc3VtZXJVc2FnZSh1aW50NjRfdCB1c2FnZSk7CisgICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtUm90YXRpb24gbWFwVG9TdHJlYW1Sb3RhdGlvbigKKyAgICAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24pOworICAgIC8vIFJldHVybnMgYSBuZWdhdGl2ZSBlcnJvciBjb2RlIGlmIHRoZSBwYXNzZWQtaW4gb3BlcmF0aW9uIG1vZGUgaXMgbm90IHZhbGlkLgorICAgIHN0YXRpYyBzdGF0dXNfdCBtYXBUb1N0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKGNhbWVyYTNfc3RyZWFtX2NvbmZpZ3VyYXRpb25fbW9kZV90IG9wZXJhdGlvbk1vZGUsCisgICAgICAgICAgICAvKm91dCovIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6U3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgKm1vZGUpOworICAgIHN0YXRpYyBjYW1lcmEzX2J1ZmZlcl9zdGF0dXNfdCBtYXBIaWRsQnVmZmVyU3RhdHVzKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJTdGF0dXMgc3RhdHVzKTsKKyAgICBzdGF0aWMgaW50IG1hcFRvRnJhbWV3b3JrRm9ybWF0KGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBwaXhlbEZvcm1hdCk7CisgICAgc3RhdGljIGFuZHJvaWRfZGF0YXNwYWNlIG1hcFRvRnJhbWV3b3JrRGF0YXNwYWNlKAorICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpEYXRhc3BhY2VGbGFncyk7CisgICAgc3RhdGljIHVpbnQ2NF90IG1hcENvbnN1bWVyVG9GcmFtZXdvcmtVc2FnZSgKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyB1c2FnZSk7CisgICAgc3RhdGljIHVpbnQ2NF90IG1hcFByb2R1Y2VyVG9GcmFtZXdvcmtVc2FnZSgKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyB1c2FnZSk7CisKICAgcHJpdmF0ZToKIAorICAgIHN0YXR1c190IGRpc2Nvbm5lY3RJbXBsKCk7CisKICAgICAvLyBpbnRlcm5hbCB0eXBlZGVmcwogICAgIHVzaW5nIFJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTx1aW50OF90LCBoYXJkd2FyZTo6a1N5bmNocm9uaXplZFJlYWRXcml0ZT47CiAgICAgdXNpbmcgUmVzdWx0TWV0YWRhdGFRdWV1ZSAgPSBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlPjsKQEAgLTIxNyw2ICsyMjcsNyBAQAogICAgIHN0YXRpYyBjb25zdCBzaXplX3QgICAgICAgIGtEdW1wTG9ja0F0dGVtcHRzICA9IDEwOwogICAgIHN0YXRpYyBjb25zdCBzaXplX3QgICAgICAgIGtEdW1wU2xlZXBEdXJhdGlvbiA9IDEwMDAwMDsgLy8gMC4xMCBzZWMKICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCAgICAgICBrQWN0aXZlVGltZW91dCAgICAgPSA1MDAwMDAwMDA7ICAvLyA1MDAgbXMKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCAgICAgICBrTWluV2FybkluZmxpZ2h0RHVyYXRpb24gPSA1MDAwMDAwMDAwOyAvLyA1IHMKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90ICAgICAgICBrSW5GbGlnaHRXYXJuTGltaXQgPSAzMDsKICAgICBzdGF0aWMgY29uc3Qgc2l6ZV90ICAgICAgICBrSW5GbGlnaHRXYXJuTGltaXRIaWdoU3BlZWQgPSAyNTY7IC8vIGJhdGNoIHNpemUgMzIgKiBwaXBlIGRlcHRoIDgKICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCAgICAgICBrRGVmYXVsdEV4cGVjdGVkRHVyYXRpb24gPSAxMDAwMDAwMDA7IC8vIDEwMCBtcwpAQCAtMjMzLDcgKzI0NCw2IEBACiAKICAgICAvLyBBIGxvY2sgdG8gZW5mb3JjZSBzZXJpYWxpemF0aW9uIG9uIHRoZSBpbnB1dC9jb25maWd1cmUgc2lkZQogICAgIC8vIG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgotICAgIC8vIE9ubHkgbG9ja2VkIGJ5IHB1YmxpYyBtZXRob2RzIGluaGVyaXRlZCBmcm9tIENhbWVyYURldmljZUJhc2UuCiAgICAgLy8gTm90IGxvY2tlZCBieSBtZXRob2RzIGd1YXJkZWQgYnkgbU91dHB1dExvY2ssIHNpbmNlIHRoZXkgbWF5IGFjdAogICAgIC8vIGNvbmN1cnJlbnRseSB0byB0aGUgaW5wdXQvY29uZmlndXJlIHNpZGUgb2YgdGhlIGludGVyZmFjZS4KICAgICAvLyBNdXN0IGJlIGxvY2tlZCBiZWZvcmUgbUxvY2sgaWYgYm90aCB3aWxsIGJlIGxvY2tlZCBieSBhIG1ldGhvZApAQCAtMjY4LDcgKzI3OCw4IEBACiAgICAgY2xhc3MgSGFsSW50ZXJmYWNlIDogcHVibGljIGNhbWVyYTM6OkNhbWVyYTNTdHJlYW1CdWZmZXJGcmVlZExpc3RlbmVyIHsKICAgICAgIHB1YmxpYzoKICAgICAgICAgSGFsSW50ZXJmYWNlKHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb24+ICZzZXNzaW9uLAotICAgICAgICAgICAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBxdWV1ZSk7CisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8UmVxdWVzdE1ldGFkYXRhUXVldWU+IHF1ZXVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VIYWxCdWZNYW5hZ2VyKTsKICAgICAgICAgSGFsSW50ZXJmYWNlKGNvbnN0IEhhbEludGVyZmFjZSAmb3RoZXIpOwogICAgICAgICBIYWxJbnRlcmZhY2UoKTsKIApAQCAtMjc4LDkgKzI4OSw2IEBACiAgICAgICAgIC8vIFJlc2V0IHRoaXMgSGFsSW50ZXJmYWNlIG9iamVjdCAoZG9lcyBub3QgY2FsbCBjbG9zZSgpKQogICAgICAgICB2b2lkIGNsZWFyKCk7CiAKLSAgICAgICAgLy8gQ2hlY2sgaWYgSGFsSW50ZXJmYWNlIHN1cHBvcnQgc2VuZGluZyByZXF1ZXN0cyBpbiBiYXRjaAotICAgICAgICBib29sIHN1cHBvcnRCYXRjaFJlcXVlc3QoKTsKLQogICAgICAgICAvLyBDYWxscyBpbnRvIHRoZSBIQUwgaW50ZXJmYWNlCiAKICAgICAgICAgLy8gQ2FsbGVyIHRha2VzIG93bmVyc2hpcCBvZiByZXF1ZXN0VGVtcGxhdGUKQEAgLTI4OSw3ICsyOTcsMTEgQEAKICAgICAgICAgc3RhdHVzX3QgY29uZmlndXJlU3RyZWFtcyhjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc2Vzc2lvblBhcmFtcywKICAgICAgICAgICAgICAgICAvKmlub3V0Ki8gY2FtZXJhM19zdHJlYW1fY29uZmlndXJhdGlvbiAqY29uZmlnLAogICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQzMl90PiYgYnVmZmVyU2l6ZXMpOwotICAgICAgICBzdGF0dXNfdCBwcm9jZXNzQ2FwdHVyZVJlcXVlc3QoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCAqcmVxdWVzdCk7CisKKyAgICAgICAgLy8gV2hlbiB0aGUgY2FsbCBzdWNjZWVkcywgdGhlIG93bmVyc2hpcCBvZiBhY3F1aXJlIGZlbmNlcyBpbiByZXF1ZXN0cyBpcyB0cmFuc2ZlcnJlZCB0bworICAgICAgICAvLyBIYWxJbnRlcmZhY2UuIE1vcmUgc3BlY2lmaWNhbGx5LCB0aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiB3aWxsIHNlbmQgdGhlIGZlbmNlIHRvCisgICAgICAgIC8vIEhBTCBwcm9jZXNzIGFuZCBjbG9zZSB0aGUgRkQgaW4gY2FtZXJhc2VydmVyIHByb2Nlc3MuIFdoZW4gdGhlIGNhbGwgZmFpbHMsIHRoZSBvd25lcnNoaXAKKyAgICAgICAgLy8gb2YgdGhlIGFjcXVpcmUgZmVuY2Ugc3RpbGwgYmVsb25ncyB0byB0aGUgY2FsbGVyLgogICAgICAgICBzdGF0dXNfdCBwcm9jZXNzQmF0Y2hDYXB0dXJlUmVxdWVzdHMoCiAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCo+JiByZXF1ZXN0cywKICAgICAgICAgICAgICAgICAvKm91dCovdWludDMyX3QqIG51bVJlcXVlc3RQcm9jZXNzZWQpOwpAQCAtMjk3LDE2ICszMDksMzcgQEAKICAgICAgICAgc3RhdHVzX3QgZHVtcChpbnQgZmQpOwogICAgICAgICBzdGF0dXNfdCBjbG9zZSgpOwogCisgICAgICAgIHZvaWQgc2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpOworICAgICAgICBib29sIGlzUmVjb25maWd1cmF0aW9uUmVxdWlyZWQoQ2FtZXJhTWV0YWRhdGEmIG9sZFNlc3Npb25QYXJhbXMsCisgICAgICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEmIG5ld1Nlc3Npb25QYXJhbXMpOworCisgICAgICAgIC8vIG1ldGhvZCB0byBleHRyYWN0IGJ1ZmZlcidzIHVuaXF1ZSBJRAorICAgICAgICAvLyByZXR1cm4gcGFpciBvZiAobmV3bHlTZWVuQnVmZmVyPywgYnVmZmVySWQpCisgICAgICAgIHN0ZDo6cGFpcjxib29sLCB1aW50NjRfdD4gZ2V0QnVmZmVySWQoY29uc3QgYnVmZmVyX2hhbmRsZV90JiBidWYsIGludCBzdHJlYW1JZCk7CisKICAgICAgICAgLy8gRmluZCBhIGJ1ZmZlcl9oYW5kbGVfdCBiYXNlZCBvbiBmcmFtZSBudW1iZXIgYW5kIHN0cmVhbSBJRAogICAgICAgICBzdGF0dXNfdCBwb3BJbmZsaWdodEJ1ZmZlcihpbnQzMl90IGZyYW1lTnVtYmVyLCBpbnQzMl90IHN0cmVhbUlkLAogICAgICAgICAgICAgICAgIC8qb3V0Ki8gYnVmZmVyX2hhbmRsZV90ICoqYnVmZmVyKTsKIAorICAgICAgICAvLyBSZWdpc3RlciBhIGJ1ZklkIChzdHJlYW1JZCwgYnVmZmVyX2hhbmRsZV90KSB0byBpbmZsaWdodCByZXF1ZXN0IGJ1ZmZlcgorICAgICAgICBzdGF0dXNfdCBwdXNoSW5mbGlnaHRSZXF1ZXN0QnVmZmVyKAorICAgICAgICAgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcklkLCBidWZmZXJfaGFuZGxlX3QqIGJ1ZiwgaW50MzJfdCBzdHJlYW1JZCk7CisKKyAgICAgICAgLy8gRmluZCBhIGJ1ZmZlcl9oYW5kbGVfdCBiYXNlZCBvbiBidWZmZXJJZAorICAgICAgICBzdGF0dXNfdCBwb3BJbmZsaWdodFJlcXVlc3RCdWZmZXIodWludDY0X3QgYnVmZmVySWQsCisgICAgICAgICAgICAgICAgLypvdXQqLyBidWZmZXJfaGFuZGxlX3QqKiBidWZmZXIsCisgICAgICAgICAgICAgICAgLypvcHRpb25hbCBvdXQqLyBpbnQzMl90KiBzdHJlYW1JZCA9IG51bGxwdHIpOworCiAgICAgICAgIC8vIEdldCBhIHZlY3RvciBvZiAoZnJhbWVOdW1iZXIsIHN0cmVhbUlkKSBwYWlyIG9mIGN1cnJlbnRseSBpbmZsaWdodAogICAgICAgICAvLyBidWZmZXJzCiAgICAgICAgIHZvaWQgZ2V0SW5mbGlnaHRCdWZmZXJLZXlzKHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQzMl90Pj4qIG91dCk7CiAKKyAgICAgICAgLy8gR2V0IGEgdmVjdG9yIG9mIGJ1ZmZlcklkIG9mIGN1cnJlbnRseSBpbmZsaWdodCBidWZmZXJzCisgICAgICAgIHZvaWQgZ2V0SW5mbGlnaHRSZXF1ZXN0QnVmZmVyS2V5cyhzdGQ6OnZlY3Rvcjx1aW50NjRfdD4qIG91dCk7CisKICAgICAgICAgdm9pZCBvblN0cmVhbVJlQ29uZmlndXJlZChpbnQgc3RyZWFtSWQpOwogCisgICAgICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBCVUZGRVJfSURfTk9fQlVGRkVSID0gMDsKICAgICAgIHByaXZhdGU6CiAgICAgICAgIC8vIEFsd2F5cyB2YWxpZAogICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb247CkBAIC0zMTQsNiArMzQ3LDggQEAKICAgICAgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18zOjpJQ2FtZXJhRGV2aWNlU2Vzc2lvbj4gbUhpZGxTZXNzaW9uXzNfMzsKICAgICAgICAgLy8gVmFsaWQgaWYgSUNhbWVyYURldmljZVNlc3Npb24gaXMgQDMuNCBvciBuZXdlcgogICAgICAgICBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OklDYW1lcmFEZXZpY2VTZXNzaW9uPiBtSGlkbFNlc3Npb25fM180OworICAgICAgICAvLyBWYWxpZCBpZiBJQ2FtZXJhRGV2aWNlU2Vzc2lvbiBpcyBAMy41IG9yIG5ld2VyCisgICAgICAgIHNwPGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNTo6SUNhbWVyYURldmljZVNlc3Npb24+IG1IaWRsU2Vzc2lvbl8zXzU7CiAKICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPFJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBtUmVxdWVzdE1ldGFkYXRhUXVldWU7CiAKQEAgLTMyMSwxNSArMzU2LDIzIEBACiAKICAgICAgICAgLy8gVGhlIG91dHB1dCBISURMIHJlcXVlc3Qgc3RpbGwgZGVwZW5kcyBvbiBpbnB1dCBjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90CiAgICAgICAgIC8vIERvIG5vdCBmcmVlIGlucHV0IGNhbWVyYTNfY2FwdHVyZV9yZXF1ZXN0X3QgYmVmb3JlIG91dHB1dCBISURMIHJlcXVlc3QKLSAgICAgICAgdm9pZCB3cmFwQXNIaWRsUmVxdWVzdChjYW1lcmEzX2NhcHR1cmVfcmVxdWVzdF90KiBpbiwKKyAgICAgICAgc3RhdHVzX3Qgd3JhcEFzSGlkbFJlcXVlc3QoY2FtZXJhM19jYXB0dXJlX3JlcXVlc3RfdCogaW4sCiAgICAgICAgICAgICAgICAgLypvdXQqL2hhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FwdHVyZVJlcXVlc3QqIG91dCwKLSAgICAgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4qIGhhbmRsZXNDcmVhdGVkKTsKKyAgICAgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8bmF0aXZlX2hhbmRsZV90Kj4qIGhhbmRsZXNDcmVhdGVkLAorICAgICAgICAgICAgICAgIC8qb3V0Ki9zdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+KiBpbmZsaWdodEJ1ZmZlcnMpOwogCiAgICAgICAgIHN0YXR1c190IHB1c2hJbmZsaWdodEJ1ZmZlckxvY2tlZChpbnQzMl90IGZyYW1lTnVtYmVyLCBpbnQzMl90IHN0cmVhbUlkLAotICAgICAgICAgICAgICAgIGJ1ZmZlcl9oYW5kbGVfdCAqYnVmZmVyLCBpbnQgYWNxdWlyZUZlbmNlKTsKKyAgICAgICAgICAgICAgICBidWZmZXJfaGFuZGxlX3QgKmJ1ZmZlcik7CisKKyAgICAgICAgLy8gUG9wIGluZmxpZ2h0IGJ1ZmZlcnMgYmFzZWQgb24gcGFpcnMgb2YgKGZyYW1lTnVtYmVyLHN0cmVhbUlkKQorICAgICAgICB2b2lkIHBvcEluZmxpZ2h0QnVmZmVycyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50MzJfdCwgaW50MzJfdD4+JiBidWZmZXJzKTsKKwogICAgICAgICAvLyBDYWNoZSBvZiBidWZmZXIgaGFuZGxlcyBrZXllZCBvZmYgKGZyYW1lTnVtYmVyIDw8IDMyIHwgc3RyZWFtSWQpCi0gICAgICAgIC8vIHZhbHVlIGlzIGEgcGFpciBvZiAoYnVmZmVyX2hhbmRsZV90KiwgYWNxdWlyZV9mZW5jZSBGRCkKLSAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBzdGQ6OnBhaXI8YnVmZmVyX2hhbmRsZV90KiwgaW50Pj4gbUluZmxpZ2h0QnVmZmVyTWFwOworICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIGJ1ZmZlcl9oYW5kbGVfdCo+IG1JbmZsaWdodEJ1ZmZlck1hcDsKKworICAgICAgICAvLyBEZWxldGUgYW5kIG9wdGlvbmFsbHkgY2xvc2UgbmF0aXZlIGhhbmRsZXMgYW5kIGNsZWFyIHRoZSBpbnB1dCB2ZWN0b3IgYWZ0ZXJ3YXJkCisgICAgICAgIHN0YXRpYyB2b2lkIGNsZWFudXBOYXRpdmVIYW5kbGVzKAorICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPG5hdGl2ZV9oYW5kbGVfdCo+ICpoYW5kbGVzLCBib29sIGNsb3NlRmQgPSBmYWxzZSk7CiAKICAgICAgICAgc3RydWN0IEJ1ZmZlckhhc2hlciB7CiAgICAgICAgICAgICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBidWZmZXJfaGFuZGxlX3QmIGJ1ZikgY29uc3QgewpAQCAtMzY1LDE5ICs0MDgsMTkgQEAKICAgICAgICAgLy8gc3RyZWFtIElEIC0+IHBlciBzdHJlYW0gYnVmZmVyIElEIG1hcAogICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8aW50LCBCdWZmZXJJZE1hcD4gbUJ1ZmZlcklkTWFwczsKICAgICAgICAgdWludDY0X3QgbU5leHRCdWZmZXJJZCA9IDE7IC8vIDAgbWVhbnMgbm8gYnVmZmVyCi0gICAgICAgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBCVUZGRVJfSURfTk9fQlVGRkVSID0gMDsKLQotICAgICAgICAvLyBtZXRob2QgdG8gZXh0cmFjdCBidWZmZXIncyB1bmlxdWUgSUQKLSAgICAgICAgLy8gVE9ETzogd2Ugc2hvdWxkIHN3aXRjaCB0byB1c2UgZ3JhbGxvYyBtYXBwZXIncyBnZXRCYWNraW5nU3RvcmUgQVBJCi0gICAgICAgIC8vICAgICAgIG9uY2Ugd2UgcmFuIGluIGJpbmRlcml6ZWQgZ3JhbGxvYyBtb2RlLCBidXQgYmVmb3JlIHRoYXQgaXMgcmVhZHksCi0gICAgICAgIC8vICAgICAgIHdlIG5lZWQgdG8gcmVseSBvbiB0aGUgY29udmVudGlvbmFsIGJ1ZmZlciBxdWV1ZSBiZWhhdmlvciB3aGVyZQotICAgICAgICAvLyAgICAgICBidWZmZXJfaGFuZGxlX3QncyBGRCB3b24ndCBjaGFuZ2UuCi0gICAgICAgIC8vIHJldHVybiBwYWlyIG9mIChuZXdseVNlZW5CdWZmZXI/LCBidWZmZXJJZCkKLSAgICAgICAgc3RkOjpwYWlyPGJvb2wsIHVpbnQ2NF90PiBnZXRCdWZmZXJJZChjb25zdCBidWZmZXJfaGFuZGxlX3QmIGJ1ZiwgaW50IHN0cmVhbUlkKTsKIAogICAgICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJGcmVlZChpbnQgc3RyZWFtSWQsIGNvbnN0IG5hdGl2ZV9oYW5kbGVfdCogaGFuZGxlKSBvdmVycmlkZTsKIAogICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50LCB1aW50NjRfdD4+IG1GcmVlZEJ1ZmZlcnM7CisKKyAgICAgICAgLy8gQnVmZmVycyBnaXZlbiB0byBIQUwgdGhyb3VnaCByZXF1ZXN0U3RyZWFtQnVmZmVyIEFQSQorICAgICAgICBzdGQ6Om11dGV4IG1SZXF1ZXN0ZWRCdWZmZXJzTG9jazsKKyAgICAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQ2NF90LCBzdGQ6OnBhaXI8aW50MzJfdCwgYnVmZmVyX2hhbmRsZV90Kj4+IG1SZXF1ZXN0ZWRCdWZmZXJzOworCisgICAgICAgIHVpbnQzMl90IG1OZXh0U3RyZWFtQ29uZmlnQ291bnRlciA9IDE7CisKKyAgICAgICAgY29uc3QgYm9vbCBtVXNlSGFsQnVmTWFuYWdlcjsKKyAgICAgICAgYm9vbCBtSXNSZWNvbmZpZ3VyYXRpb25RdWVyeVN1cHBvcnRlZDsKICAgICB9OwogCiAgICAgc3A8SGFsSW50ZXJmYWNlPiBtSW50ZXJmYWNlOwpAQCAtNDEyLDkgKzQ1NSwyMiBAQAogICAgIC8vIFRyYWNraW5nIGNhdXNlIG9mIGZhdGFsIGVycm9ycyB3aGVuIGluIFNUQVRVU19FUlJPUgogICAgIFN0cmluZzggICAgICAgICAgICAgICAgICAgIG1FcnJvckNhdXNlOwogCi0gICAgLy8gTWFwcGluZyBvZiBzdHJlYW0gSURzIHRvIHN0cmVhbSBpbnN0YW5jZXMKLSAgICB0eXBlZGVmIEtleWVkVmVjdG9yPGludCwgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gPgotICAgICAgICAgICAgU3RyZWFtU2V0OworICAgIC8vIFN5bmNocm9uaXplZCBtYXBwaW5nIG9mIHN0cmVhbSBJRHMgdG8gc3RyZWFtIGluc3RhbmNlcworICAgIGNsYXNzIFN0cmVhbVNldCB7CisgICAgICBwdWJsaWM6CisgICAgICAgIHN0YXR1c190IGFkZChpbnQgc3RyZWFtSWQsIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+KTsKKyAgICAgICAgc3NpemVfdCByZW1vdmUoaW50IHN0cmVhbUlkKTsKKyAgICAgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZT4gZ2V0KGludCBzdHJlYW1JZCk7CisgICAgICAgIC8vIGdldCBieSAodW5kZXJseWluZykgdmVjdG9yIGluZGV4CisgICAgICAgIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+IG9wZXJhdG9yW10gKHNpemVfdCBpbmRleCk7CisgICAgICAgIHNpemVfdCBzaXplKCkgY29uc3Q7CisgICAgICAgIHN0ZDo6dmVjdG9yPGludD4gZ2V0U3RyZWFtSWRzKCk7CisgICAgICAgIHZvaWQgY2xlYXIoKTsKKworICAgICAgcHJpdmF0ZToKKyAgICAgICAgbXV0YWJsZSBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBLZXllZFZlY3RvcjxpbnQsIHNwPGNhbWVyYTM6OkNhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2U+PiBtRGF0YTsKKyAgICB9OwogCiAgICAgU3RyZWFtU2V0ICAgICAgICAgICAgICAgICAgbU91dHB1dFN0cmVhbXM7CiAgICAgc3A8Y2FtZXJhMzo6Q2FtZXJhM1N0cmVhbT4gbUlucHV0U3RyZWFtOwpAQCAtNDgzLDggKzUzOSw5IEBACiAKIAogICAgIC8qKgotICAgICAqIEltcGxlbWVudGF0aW9uIG9mIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6SUNhbWVyYURldmljZUNhbGxiYWNrCisgICAgICogSW1wbGVtZW50YXRpb24gb2YgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM181OjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sKICAgICAgKi8KKwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcHJvY2Vzc0NhcHR1cmVSZXN1bHRfM180KAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAogICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzQ6OkNhcHR1cmVSZXN1bHQ+JiByZXN1bHRzKSBvdmVycmlkZTsKQEAgLTQ5NSwxMSArNTUyLDIwIEBACiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8CiAgICAgICAgICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Tm90aWZ5TXNnPiYgbXNncykgb3ZlcnJpZGU7CiAKKyAgICBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IHJlcXVlc3RTdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzU6OkJ1ZmZlclJlcXVlc3Q+JiBidWZSZXFzLAorICAgICAgICAgICAgcmVxdWVzdFN0cmVhbUJ1ZmZlcnNfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgaGFyZHdhcmU6OlJldHVybjx2b2lkPiByZXR1cm5TdHJlYW1CdWZmZXJzKAorICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmhpZGxfdmVjPAorICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUJ1ZmZlcj4mIGJ1ZmZlcnMpIG92ZXJyaWRlOworCiAgICAgLy8gSGFuZGxlIG9uZSBjYXB0dXJlIHJlc3VsdC4gQXNzdW1lIHRoYXQgbVByb2Nlc3NDYXB0dXJlUmVzdWx0TG9jayBpcyBoZWxkLgogICAgIHZvaWQgcHJvY2Vzc09uZUNhcHR1cmVSZXN1bHRMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkNhcHR1cmVSZXN1bHQmIHJlc3VsdCwKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzwKLSAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfNDo6UGh5c2ljYWxDYW1lcmFNZXRhZGF0YT4gcGh5c2ljYWxDYW1lcmFNZXRhZGF0YXMpOworICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM180OjpQaHlzaWNhbENhbWVyYU1ldGFkYXRhPiBwaHlzaWNhbENhbWVyYU1ldGFkYXRhKTsKICAgICBzdGF0dXNfdCByZWFkT25lQ2FtZXJhTWV0YWRhdGFMb2NrZWQodWludDY0X3QgZm1xUmVzdWx0U2l6ZSwKICAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6Q2FtZXJhTWV0YWRhdGEmIHJlc3VsdE1ldGFkYXRhLAogICAgICAgICAgICAgY29uc3QgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpDYW1lcmFNZXRhZGF0YSYgcmVzdWx0KTsKQEAgLTY1NSwyNyArNzIxLDYgQEAKICAgICAgKi8KICAgICBzdGF0aWMgbnNlY3NfdCBnZXRNb25vVG9Cb290dGltZU9mZnNldCgpOwogCi0gICAgLyoqCi0gICAgICogSGVscGVyIGZ1bmN0aW9ucyB0byBtYXAgYmV0d2VlbiBmcmFtZXdvcmsgYW5kIEhJREwgdmFsdWVzCi0gICAgICovCi0gICAgc3RhdGljIGhhcmR3YXJlOjpncmFwaGljczo6Y29tbW9uOjpWMV8wOjpQaXhlbEZvcm1hdCBtYXBUb1BpeGVsRm9ybWF0KGludCBmcmFtZXdvcmtGb3JtYXQpOwotICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzIG1hcFRvSGlkbERhdGFzcGFjZSgKLSAgICAgICAgICAgIGFuZHJvaWRfZGF0YXNwYWNlIGRhdGFTcGFjZSk7Ci0gICAgc3RhdGljIGhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6QnVmZmVyVXNhZ2VGbGFncyBtYXBUb0NvbnN1bWVyVXNhZ2UodWludDY0X3QgdXNhZ2UpOwotICAgIHN0YXRpYyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbVJvdGF0aW9uIG1hcFRvU3RyZWFtUm90YXRpb24oCi0gICAgICAgICAgICBjYW1lcmEzX3N0cmVhbV9yb3RhdGlvbl90IHJvdGF0aW9uKTsKLSAgICAvLyBSZXR1cm5zIGEgbmVnYXRpdmUgZXJyb3IgY29kZSBpZiB0aGUgcGFzc2VkLWluIG9wZXJhdGlvbiBtb2RlIGlzIG5vdCB2YWxpZC4KLSAgICBzdGF0aWMgc3RhdHVzX3QgbWFwVG9TdHJlYW1Db25maWd1cmF0aW9uTW9kZShjYW1lcmEzX3N0cmVhbV9jb25maWd1cmF0aW9uX21vZGVfdCBvcGVyYXRpb25Nb2RlLAotICAgICAgICAgICAgLypvdXQqLyBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlICptb2RlKTsKLSAgICBzdGF0aWMgY2FtZXJhM19idWZmZXJfc3RhdHVzX3QgbWFwSGlkbEJ1ZmZlclN0YXR1cyhoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkJ1ZmZlclN0YXR1cyBzdGF0dXMpOwotICAgIHN0YXRpYyBpbnQgbWFwVG9GcmFtZXdvcmtGb3JtYXQoaGFyZHdhcmU6OmdyYXBoaWNzOjpjb21tb246OlYxXzA6OlBpeGVsRm9ybWF0IHBpeGVsRm9ybWF0KTsKLSAgICBzdGF0aWMgYW5kcm9pZF9kYXRhc3BhY2UgbWFwVG9GcmFtZXdvcmtEYXRhc3BhY2UoCi0gICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OkRhdGFzcGFjZUZsYWdzKTsKLSAgICBzdGF0aWMgdWludDY0X3QgbWFwQ29uc3VtZXJUb0ZyYW1ld29ya1VzYWdlKAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKLSAgICBzdGF0aWMgdWludDY0X3QgbWFwUHJvZHVjZXJUb0ZyYW1ld29ya1VzYWdlKAotICAgICAgICAgICAgaGFyZHdhcmU6OmNhbWVyYTo6ZGV2aWNlOjpWM18yOjpCdWZmZXJVc2FnZUZsYWdzIHVzYWdlKTsKLQogICAgIHN0cnVjdCBSZXF1ZXN0VHJpZ2dlciB7CiAgICAgICAgIC8vIE1ldGFkYXRhIHRhZyBudW1iZXIsIGUuZy4gYW5kcm9pZC5jb250cm9sLmFlUHJlY2FwdHVyZVRyaWdnZXIKICAgICAgICAgdWludDMyX3QgbWV0YWRhdGFUYWc7CkBAIC03MDIsNyArNzQ3LDkgQEAKIAogICAgICAgICBSZXF1ZXN0VGhyZWFkKHdwPENhbWVyYTNEZXZpY2U+IHBhcmVudCwKICAgICAgICAgICAgICAgICBzcDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBzdGF0dXNUcmFja2VyLAotICAgICAgICAgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLCBjb25zdCBWZWN0b3I8aW50MzJfdD4mIHNlc3Npb25QYXJhbUtleXMpOworICAgICAgICAgICAgICAgIHNwPEhhbEludGVyZmFjZT4gaW50ZXJmYWNlLAorICAgICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxpbnQzMl90PiYgc2Vzc2lvblBhcmFtS2V5cywKKyAgICAgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIpOwogICAgICAgICB+UmVxdWVzdFRocmVhZCgpOwogCiAgICAgICAgIHZvaWQgICAgIHNldE5vdGlmaWNhdGlvbkxpc3RlbmVyKHdwPE5vdGlmaWNhdGlvbkxpc3RlbmVyPiBsaXN0ZW5lcik7CkBAIC03OTAsNiArODM3LDggQEAKICAgICAgICAgICAgIG1SZXF1ZXN0TGF0ZW5jeS5kdW1wKGZkLCBuYW1lKTsKICAgICAgICAgfQogCisgICAgICAgIHZvaWQgc2lnbmFsUGlwZWxpbmVEcmFpbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBzdHJlYW1JZHMpOworCiAgICAgICBwcm90ZWN0ZWQ6CiAKICAgICAgICAgdmlydHVhbCBib29sIHRocmVhZExvb3AoKTsKQEAgLTg1NSw5ICs5MDQsNiBAQAogICAgICAgICAvLyBDbGVhciByZXBlYXRpbmcgcmVxdWVzdHMuIE11c3QgYmUgY2FsbGVkIHdpdGggbVJlcXVlc3RMb2NrIGhlbGQuCiAgICAgICAgIHN0YXR1c190IGNsZWFyUmVwZWF0aW5nUmVxdWVzdHNMb2NrZWQoLypvdXQqLyBpbnQ2NF90ICpsYXN0RnJhbWVOdW1iZXIgPSBOVUxMKTsKIAotICAgICAgICAvLyBzZW5kIHJlcXVlc3QgaW4gbU5leHRSZXF1ZXN0cyB0byBIQUwgb25lIGJ5IG9uZS4gUmV0dXJuIHRydWUgPSBzdWNzc2VzcwotICAgICAgICBib29sIHNlbmRSZXF1ZXN0c09uZUJ5T25lKCk7Ci0KICAgICAgICAgLy8gc2VuZCByZXF1ZXN0IGluIG1OZXh0UmVxdWVzdHMgdG8gSEFMIGluIGEgYmF0Y2guIFJldHVybiB0cnVlID0gc3Vjc3Nlc3MKICAgICAgICAgYm9vbCBzZW5kUmVxdWVzdHNCYXRjaCgpOwogCkBAIC04NzIsOCArOTE4LDggQEAKICAgICAgICAgYm9vbCBza2lwSEZSVGFyZ2V0RlBTVXBkYXRlKGludDMyX3QgdGFnLCBjb25zdCBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnlfdCYgbmV3RW50cnksCiAgICAgICAgICAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX2VudHJ5X3QmIGN1cnJlbnRFbnRyeSk7CiAKLSAgICAgICAgLy8gUmUtY29uZmlndXJlIGNhbWVyYSB1c2luZyB0aGUgbGF0ZXN0IHNlc3Npb24gcGFyYW1ldGVycy4KLSAgICAgICAgYm9vbCByZWNvbmZpZ3VyZUNhbWVyYSgpOworICAgICAgICAvLyBVcGRhdGUgbmV4dCByZXF1ZXN0IHNlbnQgdG8gSEFMCisgICAgICAgIHZvaWQgdXBkYXRlTmV4dFJlcXVlc3QoTmV4dFJlcXVlc3QmIG5leHRSZXF1ZXN0KTsKIAogICAgICAgICB3cDxDYW1lcmEzRGV2aWNlPiAgbVBhcmVudDsKICAgICAgICAgd3A8Y2FtZXJhMzo6U3RhdHVzVHJhY2tlcj4gIG1TdGF0dXNUcmFja2VyOwpAQCAtODk5LDEyICs5NDUsMTMgQEAKIAogICAgICAgICBib29sICAgICAgICAgICAgICAgbVJlY29uZmlndXJlZDsKIAotICAgICAgICAvLyBVc2VkIGJ5IHdhaXRJZlBhdXNlZCwgd2FpdEZvck5leHRSZXF1ZXN0LCBhbmQgd2FpdFVudGlsUGF1c2VkCisgICAgICAgIC8vIFVzZWQgYnkgd2FpdElmUGF1c2VkLCB3YWl0Rm9yTmV4dFJlcXVlc3QsIHdhaXRVbnRpbFBhdXNlZCwgYW5kIHNpZ25hbFBpcGVsaW5lRHJhaW4KICAgICAgICAgTXV0ZXggICAgICAgICAgICAgIG1QYXVzZUxvY2s7CiAgICAgICAgIGJvb2wgICAgICAgICAgICAgICBtRG9QYXVzZTsKICAgICAgICAgQ29uZGl0aW9uICAgICAgICAgIG1Eb1BhdXNlU2lnbmFsOwogICAgICAgICBib29sICAgICAgICAgICAgICAgbVBhdXNlZDsKLSAgICAgICAgQ29uZGl0aW9uICAgICAgICAgIG1QYXVzZWRTaWduYWw7CisgICAgICAgIGJvb2wgICAgICAgICAgICAgICBtTm90aWZ5UGlwZWxpbmVEcmFpbjsKKyAgICAgICAgc3RkOjp2ZWN0b3I8aW50PiAgIG1TdHJlYW1JZHNUb0JlRHJhaW5lZDsKIAogICAgICAgICBzcDxDYXB0dXJlUmVxdWVzdD4gbVByZXZSZXF1ZXN0OwogICAgICAgICBpbnQzMl90ICAgICAgICAgICAgbVByZXZUcmlnZ2VyczsKQEAgLTkxNiw2ICs5NjMsNyBAQAogICAgICAgICAvLyBhbmRyb2lkLnJlcXVlc3QuaWQgZm9yIGxhdGVzdCBwcm9jZXNzX2NhcHR1cmVfcmVxdWVzdAogICAgICAgICBpbnQzMl90ICAgICAgICAgICAgbUxhdGVzdFJlcXVlc3RJZDsKICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgICAgIG1MYXRlc3RSZXF1ZXN0OworICAgICAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiBtTGF0ZXN0UGh5c2ljYWxSZXF1ZXN0OwogCiAgICAgICAgIHR5cGVkZWYgS2V5ZWRWZWN0b3I8dWludDMyX3QvKnRhZyovLCBSZXF1ZXN0VHJpZ2dlcj4gVHJpZ2dlck1hcDsKICAgICAgICAgTXV0ZXggICAgICAgICAgICAgIG1UcmlnZ2VyTXV0ZXg7CkBAIC05MzcsNiArOTg1LDggQEAKIAogICAgICAgICBWZWN0b3I8aW50MzJfdD4gICAgbVNlc3Npb25QYXJhbUtleXM7CiAgICAgICAgIENhbWVyYU1ldGFkYXRhICAgICBtTGF0ZXN0U2Vzc2lvblBhcmFtczsKKworICAgICAgICBjb25zdCBib29sICAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXI7CiAgICAgfTsKICAgICBzcDxSZXF1ZXN0VGhyZWFkPiBtUmVxdWVzdFRocmVhZDsKIApAQCAtOTk3LDYgKzEwNDcsMTUgQEAKICAgICAgICAgLy8gTWFwIG9mIHBoeXNpY2FsQ2FtZXJhSWQgPC0+IE1ldGFkYXRhCiAgICAgICAgIHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IHBoeXNpY2FsTWV0YWRhdGFzOwogCisgICAgICAgIC8vIEluZGljYXRlcyBhIHN0aWxsIGNhcHR1cmUgcmVxdWVzdC4KKyAgICAgICAgYm9vbCBzdGlsbENhcHR1cmU7CisKKyAgICAgICAgLy8gSW5kaWNhdGVzIGEgWlNMIGNhcHR1cmUgcmVxdWVzdAorICAgICAgICBib29sIHpzbENhcHR1cmU7CisKKyAgICAgICAgLy8gV2hhdCBzaGFyZWQgc3VyZmFjZXMgYW4gb3V0cHV0IHNob3VsZCBnbyB0bworICAgICAgICBTdXJmYWNlTWFwIG91dHB1dFN1cmZhY2VzOworCiAgICAgICAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IgbmVlZGVkIGJ5IEtleWVkVmVjdG9yCiAgICAgICAgIEluRmxpZ2h0UmVxdWVzdCgpIDoKICAgICAgICAgICAgICAgICBzaHV0dGVyVGltZXN0YW1wKDApLApAQCAtMTAwNywxMiArMTA2NiwxNiBAQAogICAgICAgICAgICAgICAgIGhhc0lucHV0QnVmZmVyKGZhbHNlKSwKICAgICAgICAgICAgICAgICBoYXNDYWxsYmFjayh0cnVlKSwKICAgICAgICAgICAgICAgICBtYXhFeHBlY3RlZER1cmF0aW9uKGtEZWZhdWx0RXhwZWN0ZWREdXJhdGlvbiksCi0gICAgICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhKGZhbHNlKSB7CisgICAgICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKKyAgICAgICAgICAgICAgICBzdGlsbENhcHR1cmUoZmFsc2UpLAorICAgICAgICAgICAgICAgIHpzbENhcHR1cmUoZmFsc2UpIHsKICAgICAgICAgfQogCiAgICAgICAgIEluRmxpZ2h0UmVxdWVzdChpbnQgbnVtQnVmZmVycywgQ2FwdHVyZVJlc3VsdEV4dHJhcyBleHRyYXMsIGJvb2wgaGFzSW5wdXQsCiAgICAgICAgICAgICAgICAgYm9vbCBoYXNBcHBDYWxsYmFjaywgbnNlY3NfdCBtYXhEdXJhdGlvbiwKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZFNldCkgOgorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PFN0cmluZzg+JiBwaHlzaWNhbENhbWVyYUlkU2V0LCBib29sIGlzU3RpbGxDYXB0dXJlLAorICAgICAgICAgICAgICAgIGJvb2wgaXNac2xDYXB0dXJlLAorICAgICAgICAgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dFN1cmZhY2VzID0gU3VyZmFjZU1hcHt9KSA6CiAgICAgICAgICAgICAgICAgc2h1dHRlclRpbWVzdGFtcCgwKSwKICAgICAgICAgICAgICAgICBzZW5zb3JUaW1lc3RhbXAoMCksCiAgICAgICAgICAgICAgICAgcmVxdWVzdFN0YXR1cyhPSyksCkBAIC0xMDIzLDcgKzEwODYsMTAgQEAKICAgICAgICAgICAgICAgICBoYXNDYWxsYmFjayhoYXNBcHBDYWxsYmFjayksCiAgICAgICAgICAgICAgICAgbWF4RXhwZWN0ZWREdXJhdGlvbihtYXhEdXJhdGlvbiksCiAgICAgICAgICAgICAgICAgc2tpcFJlc3VsdE1ldGFkYXRhKGZhbHNlKSwKLSAgICAgICAgICAgICAgICBwaHlzaWNhbENhbWVyYUlkcyhwaHlzaWNhbENhbWVyYUlkU2V0KSB7CisgICAgICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFJZHMocGh5c2ljYWxDYW1lcmFJZFNldCksCisgICAgICAgICAgICAgICAgc3RpbGxDYXB0dXJlKGlzU3RpbGxDYXB0dXJlKSwKKyAgICAgICAgICAgICAgICB6c2xDYXB0dXJlKGlzWnNsQ2FwdHVyZSksCisgICAgICAgICAgICAgICAgb3V0cHV0U3VyZmFjZXMob3V0U3VyZmFjZXMpIHsKICAgICAgICAgfQogICAgIH07CiAKQEAgLTEwMzcsMTAgKzExMDMsMTEgQEAKICAgICBuc2Vjc190ICAgICAgICAgICAgICAgIG1FeHBlY3RlZEluZmxpZ2h0RHVyYXRpb24gPSAwOwogICAgIGludCAgICAgICAgICAgICAgICAgICAgbUluRmxpZ2h0U3RhdHVzSWQ7CiAKLQogICAgIHN0YXR1c190IHJlZ2lzdGVySW5GbGlnaHQodWludDMyX3QgZnJhbWVOdW1iZXIsCiAgICAgICAgICAgICBpbnQzMl90IG51bUJ1ZmZlcnMsIENhcHR1cmVSZXN1bHRFeHRyYXMgcmVzdWx0RXh0cmFzLCBib29sIGhhc0lucHV0LAotICAgICAgICAgICAgYm9vbCBjYWxsYmFjaywgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uLCBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZHMpOworICAgICAgICAgICAgYm9vbCBjYWxsYmFjaywgbnNlY3NfdCBtYXhFeHBlY3RlZER1cmF0aW9uLCBzdGQ6OnNldDxTdHJpbmc4PiYgcGh5c2ljYWxDYW1lcmFJZHMsCisgICAgICAgICAgICBib29sIGlzU3RpbGxDYXB0dXJlLCBib29sIGlzWnNsQ2FwdHVyZSwKKyAgICAgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzKTsKIAogICAgIC8qKgogICAgICAqIFJldHVybnMgdGhlIG1heGltdW0gZXhwZWN0ZWQgdGltZSBpdCdsbCB0YWtlIGZvciBhbGwgY3VycmVudGx5IGluLWZsaWdodApAQCAtMTEyNSwxMCArMTE5MiwxNCBAQAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgbU5leHRSZXN1bHRGcmFtZU51bWJlcjsKICAgICAvLyB0aGUgbWluaW1hbCBmcmFtZSBudW1iZXIgb2YgdGhlIG5leHQgcmVwcm9jZXNzIHJlc3VsdAogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgbU5leHRSZXByb2Nlc3NSZXN1bHRGcmFtZU51bWJlcjsKKyAgICAvLyB0aGUgbWluaW1hbCBmcmFtZSBudW1iZXIgb2YgdGhlIG5leHQgWlNMIHN0aWxsIGNhcHR1cmUgcmVzdWx0CisgICAgdWludDMyX3QgICAgICAgICAgICAgICBtTmV4dFpzbFN0aWxsUmVzdWx0RnJhbWVOdW1iZXI7CiAgICAgLy8gdGhlIG1pbmltYWwgZnJhbWUgbnVtYmVyIG9mIHRoZSBuZXh0IG5vbi1yZXByb2Nlc3Mgc2h1dHRlcgogICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgbU5leHRTaHV0dGVyRnJhbWVOdW1iZXI7CiAgICAgLy8gdGhlIG1pbmltYWwgZnJhbWUgbnVtYmVyIG9mIHRoZSBuZXh0IHJlcHJvY2VzcyBzaHV0dGVyCiAgICAgdWludDMyX3QgICAgICAgICAgICAgICBtTmV4dFJlcHJvY2Vzc1NodXR0ZXJGcmFtZU51bWJlcjsKKyAgICAvLyB0aGUgbWluaW1hbCBmcmFtZSBudW1iZXIgb2YgdGhlIG5leHQgWlNMIHN0aWxsIGNhcHR1cmUgc2h1dHRlcgorICAgIHVpbnQzMl90ICAgICAgICAgICAgICAgbU5leHRac2xTdGlsbFNodXR0ZXJGcmFtZU51bWJlcjsKICAgICBMaXN0PENhcHR1cmVSZXN1bHQ+ICAgbVJlc3VsdFF1ZXVlOwogICAgIENvbmRpdGlvbiAgICAgICAgICAgICAgbVJlc3VsdFNpZ25hbDsKICAgICB3cDxOb3RpZmljYXRpb25MaXN0ZW5lcj4gIG1MaXN0ZW5lcjsKQEAgLTExNTAsNyArMTIyMSwxMSBAQAogCiAgICAgLy8gaGVscGVyIGZ1bmN0aW9uIHRvIHJldHVybiB0aGUgb3V0cHV0IGJ1ZmZlcnMgdG8gdGhlIHN0cmVhbXMuCiAgICAgdm9pZCByZXR1cm5PdXRwdXRCdWZmZXJzKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlcl90ICpvdXRwdXRCdWZmZXJzLAotICAgICAgICAgICAgc2l6ZV90IG51bUJ1ZmZlcnMsIG5zZWNzX3QgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIHNpemVfdCBudW1CdWZmZXJzLCBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gdHJ1ZSwKKyAgICAgICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgYXJndW1lbnRzIGFyZSBvbmx5IG1lYW50IGZvciBzdXJmYWNlIHNoYXJpbmcgdXNlIGNhc2UKKyAgICAgICAgICAgIGNvbnN0IFN1cmZhY2VNYXAmIG91dHB1dFN1cmZhY2VzID0gU3VyZmFjZU1hcHt9LAorICAgICAgICAgICAgLy8gVXNlZCB0byBzZW5kIGJ1ZmZlciBlcnJvciBjYWxsYmFjayB3aGVuIGZhaWxpbmcgdG8gcmV0dXJuIGJ1ZmZlcgorICAgICAgICAgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzID0gQ2FwdHVyZVJlc3VsdEV4dHJhc3t9KTsKIAogICAgIC8vIFNlbmQgYSBwYXJ0aWFsIGNhcHR1cmUgcmVzdWx0LgogICAgIHZvaWQgc2VuZFBhcnRpYWxDYXB0dXJlUmVzdWx0KGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICogcGFydGlhbFJlc3VsdCwKQEAgLTExNjEsNyArMTIzNiw4IEBACiAgICAgdm9pZCBzZW5kQ2FwdHVyZVJlc3VsdChDYW1lcmFNZXRhZGF0YSAmcGVuZGluZ01ldGFkYXRhLAogICAgICAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmcmVzdWx0RXh0cmFzLAogICAgICAgICAgICAgQ2FtZXJhTWV0YWRhdGEgJmNvbGxlY3RlZFBhcnRpYWxSZXN1bHQsIHVpbnQzMl90IGZyYW1lTnVtYmVyLAotICAgICAgICAgICAgYm9vbCByZXByb2Nlc3MsIGNvbnN0IHN0ZDo6dmVjdG9yPFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+JiBwaHlzaWNhbE1ldGFkYXRhcyk7CisgICAgICAgICAgICBib29sIHJlcHJvY2VzcywgYm9vbCB6c2xTdGlsbENhcHR1cmUsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxNZXRhZGF0YXMpOwogCiAgICAgYm9vbCBpc0xhc3RGdWxsUmVzdWx0KGNvbnN0IEluRmxpZ2h0UmVxdWVzdCYgaW5GbGlnaHRSZXF1ZXN0KTsKIApAQCAtMTE4OCw4ICsxMjY0LDEwIEBACiAgICAgLyoqCiAgICAgICogRGlzdG9ydGlvbiBjb3JyZWN0aW9uIHN1cHBvcnQKICAgICAgKi8KLQotICAgIGNhbWVyYTM6OkRpc3RvcnRpb25NYXBwZXIgbURpc3RvcnRpb25NYXBwZXI7CisgICAgLy8gTWFwIGZyb20gY2FtZXJhIElEcyB0byBpdHMgY29ycmVzcG9uZGluZyBkaXN0b3J0aW9uIG1hcHBlci4gT25seSBjb250YWlucworICAgIC8vIDEgSUQgaWYgdGhlIGRldmljZSBpc24ndCBhIGxvZ2ljYWwgbXVsdGktY2FtZXJhLiBPdGhlcndpc2UgY29udGFpbnMgYm90aAorICAgIC8vIGxvZ2ljYWwgY2FtZXJhIGFuZCBpdHMgcGh5c2ljYWwgc3ViY2FtZXJhcy4KKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIGNhbWVyYTM6OkRpc3RvcnRpb25NYXBwZXI+IG1EaXN0b3J0aW9uTWFwcGVyczsKIAogICAgIC8vIERlYnVnIHRyYWNrZXIgZm9yIG1ldGFkYXRhIHRhZyB2YWx1ZSBjaGFuZ2VzCiAgICAgLy8gLSBFbmFibGVkIHdpdGggdGhlIC1tIDx0YWdsaXN0PiBvcHRpb24gdG8gZHVtcHN5cywgc3VjaCBhcwpAQCAtMTE5OSwyMCArMTI3Nyw5NiBAQAogICAgIFRhZ01vbml0b3IgbVRhZ01vbml0b3I7CiAKICAgICB2b2lkIG1vbml0b3JNZXRhZGF0YShUYWdNb25pdG9yOjpldmVudFNvdXJjZSBzb3VyY2UsIGludDY0X3QgZnJhbWVOdW1iZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhKTsKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiYgcGh5c2ljYWxNZXRhZGF0YSk7CiAKICAgICBtZXRhZGF0YV92ZW5kb3JfaWRfdCBtVmVuZG9yVGFnSWQ7CiAKICAgICAvLyBDYWNoZWQgbGFzdCByZXF1ZXN0ZWQgdGVtcGxhdGUgaWQKICAgICBpbnQgbUxhc3RUZW1wbGF0ZUlkOwogCi0gICAgLyoqCi0gICAgICogU3RhdGljIGNhbGxiYWNrIGZvcndhcmRpbmcgbWV0aG9kcyBmcm9tIEhBTCB0byBpbnN0YW5jZQotICAgICAqLwotICAgIHN0YXRpYyBjYWxsYmFja3NfcHJvY2Vzc19jYXB0dXJlX3Jlc3VsdF90IHNQcm9jZXNzQ2FwdHVyZVJlc3VsdDsKKyAgICAvLyBTeW5jaHJvbml6ZXMgYWNjZXNzIHRvIHN0YXR1cyB0cmFja2VyIGJldHdlZW4gaW5mbGlnaHQgdXBkYXRlcyBhbmQgZGlzY29ubmVjdC4KKyAgICAvLyBiLzc5OTcyODY1CisgICAgTXV0ZXggbVRyYWNrZXJMb2NrOwogCi0gICAgc3RhdGljIGNhbGxiYWNrc19ub3RpZnlfdCBzTm90aWZ5OworICAgIC8vIFdoZXRoZXIgSEFMIHJlcXVlc3QgYnVmZmVycyB0aHJvdWdoIHJlcXVlc3RTdHJlYW1CdWZmZXJzIEFQSQorICAgIGJvb2wgbVVzZUhhbEJ1Zk1hbmFnZXIgPSBmYWxzZTsKIAorICAgIC8vIExvY2sgdG8gZW5zdXJlIHJlcXVlc3RTdHJlYW1CdWZmZXJzKCkgY2FsbGJhY2tzIGFyZSBzZXJpYWxpemVkCisgICAgc3RkOjptdXRleCBtUmVxdWVzdEJ1ZmZlckludGVyZmFjZUxvY2s7CisKKyAgICAvLyBUaGUgc3RhdGUgbWFjaGluZSB0byBjb250cm9sIHdoZW4gcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgc2hvdWxkIGFsbG93CisgICAgLy8gSEFMIHRvIHJlcXVlc3QgYnVmZmVycy4KKyAgICBlbnVtIFJlcXVlc3RCdWZmZXJTdGF0ZSB7CisgICAgICAgIC8qKgorICAgICAgICAgKiBUaGlzIGlzIHRoZSBpbml0aWFsIHN0YXRlLgorICAgICAgICAgKiByZXF1ZXN0U3RyZWFtQnVmZmVycyBjYWxsIHdpbGwgcmV0dXJuIEZBSUxFRF9DT05GSUdVUklORyBpbiB0aGlzIHN0YXRlLgorICAgICAgICAgKiBXaWxsIHN3aXRjaCB0byBSQl9TVEFUVVNfUkVBRFkgYWZ0ZXIgYSBzdWNjZXNzZnVsIGNvbmZpZ3VyZVN0cmVhbXMgb3IKKyAgICAgICAgICogcHJvY2Vzc0NhcHR1cmVSZXF1ZXN0IGNhbGwuCisgICAgICAgICAqLworICAgICAgICBSQl9TVEFUVVNfU1RPUFBFRCwKKworICAgICAgICAvKioKKyAgICAgICAgICogcmVxdWVzdFN0cmVhbUJ1ZmZlcnMgY2FsbCB3aWxsIHByb2NlZWQgaW4gdGhpcyBzdGF0ZS4KKyAgICAgICAgICogV2hlbiBkZXZpY2UgaXMgYXNrZWQgdG8gc3RheSBpZGxlIHZpYSB3YWl0VW50aWxTdGF0ZVRoZW5SZWxvY2soKSBjYWxsOgorICAgICAgICAgKiAgICAgLSBTd2l0Y2ggdG8gUkJfU1RBVFVTX1NUT1BQRUQgaWYgdGhlcmUgaXMgbm8gaW5mbGlnaHQgcmVxdWVzdHMgYW5kCisgICAgICAgICAqICAgICAgIHJlcXVlc3QgdGhyZWFkIGlzIHBhdXNlZC4KKyAgICAgICAgICogICAgIC0gU3dpdGNoIHRvIFJCX1NUQVRVU19QRU5ESU5HX1NUT1Agb3RoZXJ3aXNlCisgICAgICAgICAqLworICAgICAgICBSQl9TVEFUVVNfUkVBRFksCisKKyAgICAgICAgLyoqCisgICAgICAgICAqIHJlcXVlc3RTdHJlYW1CdWZmZXJzIGNhbGwgd2lsbCBwcm9jZWVkIGluIHRoaXMgc3RhdGUuCisgICAgICAgICAqIFN3aXRjaCB0byBSQl9TVEFUVVNfU1RPUFBFRCB3aGVuIGFsbCBpbmZsaWdodCByZXF1ZXN0cyBhcmUgZnVsZmlsbGVkCisgICAgICAgICAqIGFuZCByZXF1ZXN0IHRocmVhZCBpcyBwYXVzZWQKKyAgICAgICAgICovCisgICAgICAgIFJCX1NUQVRVU19QRU5ESU5HX1NUT1AsCisgICAgfTsKKworICAgIGNsYXNzIFJlcXVlc3RCdWZmZXJTdGF0ZU1hY2hpbmUgeworICAgICAgcHVibGljOgorICAgICAgICBzdGF0dXNfdCBpbml0aWFsaXplKHNwPGNhbWVyYTM6OlN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIpOworCisgICAgICAgIC8vIFJldHVybiBpZiB0aGUgc3RhdGUgbWFjaGluZSBjdXJyZW50bHkgYWxsb3dzIGZvciByZXF1ZXN0QnVmZmVycworICAgICAgICAvLyBJZiB0aGUgc3RhdGUgYWxsb3dzIGZvciBpdCwgbVJlcXVlc3RCdWZmZXJPbmdvaW5nIHdpbGwgYmUgc2V0IHRvIHRydWUKKyAgICAgICAgLy8gYW5kIGNhbGxlciBtdXN0IGNhbGwgZW5kUmVxdWVzdEJ1ZmZlcigpIGxhdGVyIHRvIHVuc2V0IHRoZSBmbGFnCisgICAgICAgIGJvb2wgc3RhcnRSZXF1ZXN0QnVmZmVyKCk7CisgICAgICAgIHZvaWQgZW5kUmVxdWVzdEJ1ZmZlcigpOworCisgICAgICAgIC8vIEV2ZW50cyB0cmlnZ2VyZWQgYnkgYXBwbGljYXRpb24gQVBJIGNhbGwKKyAgICAgICAgdm9pZCBvblN0cmVhbXNDb25maWd1cmVkKCk7CisgICAgICAgIHZvaWQgb25XYWl0VW50aWxJZGxlKCk7CisKKyAgICAgICAgLy8gRXZlbnRzIHVzdWFsbHkgdHJpZ2dlcmVkIGJ5IGh3QmluZGVyIHByb2Nlc3NDYXB0dXJlUmVzdWx0IGNhbGxiYWNrIHRocmVhZAorICAgICAgICAvLyBCdXQgY2FuIGFsc28gYmUgdHJpZ2dlcmVkIG9uIHJlcXVlc3QgdGhyZWFkIGZvciBmYWlsZWQgcmVxdWVzdCwgb3Igb24KKyAgICAgICAgLy8gaHdiaW5kZXIgbm90aWZ5IGNhbGxiYWNrIHRocmVhZCBmb3Igc2h1dHRlci9lcnJvciBjYWxsYmFja3MKKyAgICAgICAgdm9pZCBvbkluZmxpZ2h0TWFwRW1wdHkoKTsKKworICAgICAgICAvLyBFdmVudHMgdHJpZ2dlcmVkIGJ5IFJlcXVlc3RUaHJlYWQKKyAgICAgICAgdm9pZCBvblN1Ym1pdHRpbmdSZXF1ZXN0KCk7CisgICAgICAgIHZvaWQgb25SZXF1ZXN0VGhyZWFkUGF1c2VkKCk7CisKKyAgICAgIHByaXZhdGU6CisgICAgICAgIHZvaWQgbm90aWZ5VHJhY2tlckxvY2tlZChib29sIGFjdGl2ZSk7CisKKyAgICAgICAgLy8gU3dpdGNoIHRvIFNUT1BQRUQgc3RhdGUgYW5kIHJldHVybiB0cnVlIGlmIGFsbCBjb25kaXRpb25zIGFsbG93cyBmb3IgaXQuCisgICAgICAgIC8vIE90aGVyd2lzZSBkbyBub3RoaW5nIGFuZCByZXR1cm4gZmFsc2UuCisgICAgICAgIGJvb2wgY2hlY2tTd2l0Y2hUb1N0b3BMb2NrZWQoKTsKKworICAgICAgICBzdGQ6Om11dGV4IG1Mb2NrOworICAgICAgICBSZXF1ZXN0QnVmZmVyU3RhdGUgbVN0YXR1cyA9IFJCX1NUQVRVU19TVE9QUEVEOworCisgICAgICAgIGJvb2wgbVJlcXVlc3RUaHJlYWRQYXVzZWQgPSB0cnVlOworICAgICAgICBib29sIG1JbmZsaWdodE1hcEVtcHR5ID0gdHJ1ZTsKKyAgICAgICAgYm9vbCBtUmVxdWVzdEJ1ZmZlck9uZ29pbmcgPSBmYWxzZTsKKworICAgICAgICB3cDxjYW1lcmEzOjpTdGF0dXNUcmFja2VyPiBtU3RhdHVzVHJhY2tlcjsKKyAgICAgICAgaW50ICBtUmVxdWVzdEJ1ZmZlclN0YXR1c0lkOworICAgIH0gbVJlcXVlc3RCdWZmZXJTTTsKKworICAgIC8vIEZpeCB1cCByZXN1bHQgbWV0YWRhdGEgZm9yIG1vbm9jaHJvbWUgY2FtZXJhLgorICAgIGJvb2wgbU5lZWRGaXh1cE1vbm9jaHJvbWVUYWdzOworICAgIHN0YXR1c190IGZpeHVwTW9ub2Nocm9tZVRhZ3MoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIGRldmljZUluZm8sIENhbWVyYU1ldGFkYXRhJiByZXN1bHRNZXRhZGF0YSk7CiB9OyAvLyBjbGFzcyBDYW1lcmEzRGV2aWNlCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5jcHAKaW5kZXggZmIxZmY3Ny4uYjYzNzE2MCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmNwcApAQCAtNDgsNyArNDgsNyBAQAogCiBzdGF0dXNfdCBDYW1lcmEzRHVtbXlTdHJlYW06OnJldHVybkJ1ZmZlckxvY2tlZCgKICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICYsCi0gICAgICAgIG5zZWNzX3QpIHsKKyAgICAgICAgbnNlY3NfdCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYpIHsKICAgICBBVFJBQ0VfQ0FMTCgpOwogICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBEdW1teSBzdHJlYW0gY2Fubm90IHJldHVybiBidWZmZXJzISIsIF9fRlVOQ1RJT05fXywgbUlkKTsKICAgICByZXR1cm4gSU5WQUxJRF9PUEVSQVRJT047CkBAIC01OCw2ICs1OCw3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJiwKICAgICAgICAgICAgIG5zZWNzX3QsCiAgICAgICAgICAgICBib29sLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4qKSB7CiAgICAgQVRSQUNFX0NBTEwoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNEdW1teVN0cmVhbS5oCmluZGV4IDQ2Mjc1NDguLjRiNjdlYTUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0R1bW15U3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzRHVtbXlTdHJlYW0uaApAQCAtODcsNiArODcsOSBAQAogICAgICAqLwogICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTdXJmYWNlSWQoY29uc3Qgc3A8U3VyZmFjZT4gJi8qc3VyZmFjZSovKSB7IHJldHVybiAwOyB9CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVuaXF1ZVN1cmZhY2VJZHMoY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYsCisgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c2l6ZV90PiopIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9OworCiAgICAgLyoqCiAgICAgICogVXBkYXRlIHRoZSBzdHJlYW0gb3V0cHV0IHN1cmZhY2VzLgogICAgICAqLwpAQCAtMTA0LDYgKzEwNyw3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KTsKIApAQCAtMTI4LDcgKzEzMiw3IEBACiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5CdWZmZXJMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IGNvbmZpZ3VyZVF1ZXVlTG9ja2VkKCk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuY3BwCmluZGV4IDNjMWU0M2QuLmVmMGQ5MTkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lPU3RyZWFtQmFzZS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmNwcApAQCAtODIsNiArODIsOSBAQAogICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgTWF4IHNpemU6ICV6dVxuIiwgbU1heFNpemUpOwogICAgIGxpbmVzLmFwcGVuZEZvcm1hdCgiICAgICAgQ29tYmluZWQgdXNhZ2U6ICUiIFBSSXU2NCAiLCBtYXggSEFMIGJ1ZmZlcnM6ICVkXG4iLAogICAgICAgICAgICAgbVVzYWdlIHwgY29uc3VtZXJVc2FnZSwgY2FtZXJhM19zdHJlYW06Om1heF9idWZmZXJzKTsKKyAgICBpZiAoc3RybGVuKGNhbWVyYTNfc3RyZWFtOjpwaHlzaWNhbF9jYW1lcmFfaWQpID4gMCkgeworICAgICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIFBoeXNpY2FsIGNhbWVyYSBpZDogJXNcbiIsIGNhbWVyYTNfc3RyZWFtOjpwaHlzaWNhbF9jYW1lcmFfaWQpOworICAgIH0KICAgICBsaW5lcy5hcHBlbmRGb3JtYXQoIiAgICAgIEZyYW1lcyBwcm9kdWNlZDogJWQsIGxhc3QgdGltZXN0YW1wOiAlIiBQUklkNjQgIiBuc1xuIiwKICAgICAgICAgICAgIG1GcmFtZUNvdW50LCBtTGFzdFRpbWVzdGFtcCk7CiAgICAgbGluZXMuYXBwZW5kRm9ybWF0KCIgICAgICBUb3RhbCBidWZmZXJzOiAlenUsIGN1cnJlbnRseSBkZXF1ZXVlZDogJXp1XG4iLApAQCAtMTE2LDcgKzExOSw3IEBACiAgICAgcmV0dXJuIG1Ub3RhbEJ1ZmZlckNvdW50OwogfQogCi1zaXplX3QgQ2FtZXJhM0lPU3RyZWFtQmFzZTo6Z2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgeworc2l6ZV90IENhbWVyYTNJT1N0cmVhbUJhc2U6OmdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpIGNvbnN0IHsKICAgICByZXR1cm4gbUhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudDsKIH0KIApAQCAtMjE5LDcgKzIyMiw4IEBACiBzdGF0dXNfdCBDYW1lcmEzSU9TdHJlYW1CYXNlOjpyZXR1cm5BbnlCdWZmZXJMb2NrZWQoCiAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKLSAgICAgICAgYm9vbCBvdXRwdXQpIHsKKyAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKSB7CiAgICAgc3RhdHVzX3QgcmVzOwogCiAgICAgLy8gcmV0dXJuQnVmZmVyIG1heSBiZSBjYWxsZWQgZnJvbSBhIHJhdyBwb2ludGVyLCBub3QgYSBzcDw+LCBhbmQgd2UnbGwgYmUKQEAgLTIzNSw3ICsyMzksNyBAQAogICAgIH0KIAogICAgIHNwPEZlbmNlPiByZWxlYXNlRmVuY2U7Ci0gICAgcmVzID0gcmV0dXJuQnVmZmVyQ2hlY2tlZExvY2tlZChidWZmZXIsIHRpbWVzdGFtcCwgb3V0cHV0LAorICAgIHJlcyA9IHJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoYnVmZmVyLCB0aW1lc3RhbXAsIG91dHB1dCwgc3VyZmFjZV9pZHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVsZWFzZUZlbmNlKTsKICAgICAvLyBSZXMgbWF5IGJlIGFuIGVycm9yLCBidXQgd2Ugc3RpbGwgd2FudCB0byBkZWNyZW1lbnQgb3VyIG93bmVkIGNvdW50CiAgICAgLy8gdG8gZW5hYmxlIGNsZWFuIHNodXRkb3duLiBTbyB3ZSdsbCBqdXN0IHJldHVybiB0aGUgZXJyb3IgYnV0IG90aGVyd2lzZQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSU9TdHJlYW1CYXNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaAppbmRleCAwYTMxZDQ0Li43NTBmNjRkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJT1N0cmVhbUJhc2UuaApAQCAtNjYsMTIgKzY2LDE0IEBACiAgICAgc3RhdHVzX3QgICAgICAgICByZXR1cm5BbnlCdWZmZXJMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAotICAgICAgICAgICAgYm9vbCBvdXRwdXQpOworICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlckNoZWNrZWRMb2NrZWQoCiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KSA9IDA7CiAKQEAgLTgyLDcgKzg0LDcgQEAKIAogICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0QnVmZmVyQ291bnRMb2NrZWQoKTsKIAotICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCk7CisgICAgdmlydHVhbCBzaXplX3QgICBnZXRIYW5kb3V0T3V0cHV0QnVmZmVyQ291bnRMb2NrZWQoKSBjb25zdDsKIAogICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dElucHV0QnVmZmVyQ291bnRMb2NrZWQoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uY3BwCmluZGV4IDAxN2Q3YmUuLmZjODM2ODQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5jcHAKQEAgLTk4LDYgKzk4LDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpIHsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM0lucHV0U3RyZWFtLmgKaW5kZXggMDczMjQ2NC4uOTdhNjI3YSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzSW5wdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNJbnB1dFN0cmVhbS5oCkBAIC02Miw2ICs2Miw3IEBACiAgICAgICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKICAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLAogICAgICAgICAgICAgYm9vbCBvdXRwdXQsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcywKICAgICAgICAgICAgIC8qb3V0Ki8KICAgICAgICAgICAgIHNwPEZlbmNlPiAqcmVsZWFzZUZlbmNlT3V0KTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbS5jcHAKaW5kZXggMmMwMjBhMi4uZTFkMzVlOCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uY3BwCkBAIC01NCw5ICs1NCw4IEBACiAgICAgICAgIG1TdGF0ZSA9IFNUQVRFX0VSUk9SOwogICAgIH0KIAotICAgIGlmIChzZXRJZCA+IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEKSB7Ci0gICAgICAgIG1CdWZmZXJSZWxlYXNlZExpc3RlbmVyID0gbmV3IEJ1ZmZlclJlbGVhc2VkTGlzdGVuZXIodGhpcyk7Ci0gICAgfQorICAgIGJvb2wgbmVlZHNSZWxlYXNlTm90aWZ5ID0gc2V0SWQgPiBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRDsKKyAgICBtQnVmZmVyUHJvZHVjZXJMaXN0ZW5lciA9IG5ldyBCdWZmZXJQcm9kdWNlckxpc3RlbmVyKHRoaXMsIG5lZWRzUmVsZWFzZU5vdGlmeSk7CiB9CiAKIENhbWVyYTNPdXRwdXRTdHJlYW06OkNhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLApAQCAtODcsOSArODYsOCBAQAogICAgICAgICBtU3RhdGUgPSBTVEFURV9FUlJPUjsKICAgICB9CiAKLSAgICBpZiAoc2V0SWQgPiBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCkgewotICAgICAgICBtQnVmZmVyUmVsZWFzZWRMaXN0ZW5lciA9IG5ldyBCdWZmZXJSZWxlYXNlZExpc3RlbmVyKHRoaXMpOwotICAgIH0KKyAgICBib29sIG5lZWRzUmVsZWFzZU5vdGlmeSA9IHNldElkID4gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQ7CisgICAgbUJ1ZmZlclByb2R1Y2VyTGlzdGVuZXIgPSBuZXcgQnVmZmVyUHJvZHVjZXJMaXN0ZW5lcih0aGlzLCBuZWVkc1JlbGVhc2VOb3RpZnkpOwogfQogCiBDYW1lcmEzT3V0cHV0U3RyZWFtOjpDYW1lcmEzT3V0cHV0U3RyZWFtKGludCBpZCwKQEAgLTEyNCwxMCArMTIyLDggQEAKICAgICB9CiAKICAgICBtQ29uc3VtZXJOYW1lID0gU3RyaW5nOCgiRGVmZXJyZWQiKTsKLSAgICBpZiAoc2V0SWQgPiBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCkgewotICAgICAgICBtQnVmZmVyUmVsZWFzZWRMaXN0ZW5lciA9IG5ldyBCdWZmZXJSZWxlYXNlZExpc3RlbmVyKHRoaXMpOwotICAgIH0KLQorICAgIGJvb2wgbmVlZHNSZWxlYXNlTm90aWZ5ID0gc2V0SWQgPiBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRDsKKyAgICBtQnVmZmVyUHJvZHVjZXJMaXN0ZW5lciA9IG5ldyBCdWZmZXJQcm9kdWNlckxpc3RlbmVyKHRoaXMsIG5lZWRzUmVsZWFzZU5vdGlmeSk7CiB9CiAKIENhbWVyYTNPdXRwdXRTdHJlYW06OkNhbWVyYTNPdXRwdXRTdHJlYW0oaW50IGlkLCBjYW1lcmEzX3N0cmVhbV90eXBlX3QgdHlwZSwKQEAgLTE1MSw5ICsxNDcsOCBAQAogICAgICAgICBtRHJvcEJ1ZmZlcnMoZmFsc2UpLAogICAgICAgICBtRGVxdWV1ZUJ1ZmZlckxhdGVuY3koa0RlcXVldWVMYXRlbmN5QmluU2l6ZSkgewogCi0gICAgaWYgKHNldElkID4gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQpIHsKLSAgICAgICAgbUJ1ZmZlclJlbGVhc2VkTGlzdGVuZXIgPSBuZXcgQnVmZmVyUmVsZWFzZWRMaXN0ZW5lcih0aGlzKTsKLSAgICB9CisgICAgYm9vbCBuZWVkc1JlbGVhc2VOb3RpZnkgPSBzZXRJZCA+IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEOworICAgIG1CdWZmZXJQcm9kdWNlckxpc3RlbmVyID0gbmV3IEJ1ZmZlclByb2R1Y2VyTGlzdGVuZXIodGhpcywgbmVlZHNSZWxlYXNlTm90aWZ5KTsKIAogICAgIC8vIFN1YmNsYXNzZXMgZXhwZWN0ZWQgdG8gaW5pdGlhbGl6ZSBtQ29uc3VtZXIgdGhlbXNlbHZlcwogfQpAQCAtMTg3LDE2ICsxODIsMTcgQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM091dHB1dFN0cmVhbTo6cXVldWVCdWZmZXJUb0NvbnN1bWVyKHNwPEFOYXRpdmVXaW5kb3c+JiBjb25zdW1lciwKLSAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSkgeworICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYpIHsKICAgICByZXR1cm4gY29uc3VtZXItPnF1ZXVlQnVmZmVyKGNvbnN1bWVyLmdldCgpLCBidWZmZXIsIGFud1JlbGVhc2VGZW5jZSk7CiB9CiAKIHN0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OnJldHVybkJ1ZmZlckxvY2tlZCgKICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSB7CisgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcykgewogICAgIEFUUkFDRV9DQUxMKCk7CiAKLSAgICBzdGF0dXNfdCByZXMgPSByZXR1cm5BbnlCdWZmZXJMb2NrZWQoYnVmZmVyLCB0aW1lc3RhbXAsIC8qb3V0cHV0Ki90cnVlKTsKKyAgICBzdGF0dXNfdCByZXMgPSByZXR1cm5BbnlCdWZmZXJMb2NrZWQoYnVmZmVyLCB0aW1lc3RhbXAsIC8qb3V0cHV0Ki90cnVlLCBzdXJmYWNlX2lkcyk7CiAKICAgICBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIHJldHVybiByZXM7CkBAIC0yMTIsNiArMjA4LDcgQEAKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAogICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCiAgICAgICAgICAgICBib29sIG91dHB1dCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLAogICAgICAgICAgICAgLypvdXQqLwogICAgICAgICAgICAgc3A8RmVuY2U+ICpyZWxlYXNlRmVuY2VPdXQpIHsKIApAQCAtMjMxLDI0ICsyMjgsMjcgQEAKICAgICAgKiBxdWV1ZUJ1ZmZlcgogICAgICAqLwogICAgIHNwPEFOYXRpdmVXaW5kb3c+IGN1cnJlbnRDb25zdW1lciA9IG1Db25zdW1lcjsKKyAgICBTdHJlYW1TdGF0ZSBzdGF0ZSA9IG1TdGF0ZTsKICAgICBtTG9jay51bmxvY2soKTsKIAogICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIgKmFud0J1ZmZlciA9IGNvbnRhaW5lcl9vZihidWZmZXIuYnVmZmVyLCBBTmF0aXZlV2luZG93QnVmZmVyLCBoYW5kbGUpOwogICAgIC8qKgogICAgICAqIFJldHVybiBidWZmZXIgYmFjayB0byBBTmF0aXZlV2luZG93CiAgICAgICovCi0gICAgaWYgKGJ1ZmZlci5zdGF0dXMgPT0gQ0FNRVJBM19CVUZGRVJfU1RBVFVTX0VSUk9SIHx8IG1Ecm9wQnVmZmVycykgeworICAgIGlmIChidWZmZXIuc3RhdHVzID09IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUiB8fCBtRHJvcEJ1ZmZlcnMgfHwgdGltZXN0YW1wID09IDApIHsKICAgICAgICAgLy8gQ2FuY2VsIGJ1ZmZlcgogICAgICAgICBpZiAobURyb3BCdWZmZXJzKSB7CiAgICAgICAgICAgICBBTE9HVigiJXM6IERyb3BwaW5nIGEgZnJhbWUgZm9yIHN0cmVhbSAlZC4iLCBfX0ZVTkNUSU9OX18sIG1JZCk7CisgICAgICAgIH0gZWxzZSBpZiAoYnVmZmVyLnN0YXR1cyA9PSBDQU1FUkEzX0JVRkZFUl9TVEFUVVNfRVJST1IpIHsKKyAgICAgICAgICAgIEFMT0dWKCIlczogQSBmcmFtZSBpcyBkcm9wcGVkIGZvciBzdHJlYW0gJWQgZHVlIHRvIGJ1ZmZlciBlcnJvci4iLCBfX0ZVTkNUSU9OX18sIG1JZCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBTE9HVygiJXM6IEEgZnJhbWUgaXMgZHJvcHBlZCBmb3Igc3RyZWFtICVkIGR1ZSB0byBidWZmZXIgZXJyb3IuIiwgX19GVU5DVElPTl9fLCBtSWQpOworICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IHRpbWVzdGFtcCBzaG91bGRuJ3QgYmUgMCIsIF9fRlVOQ1RJT05fXywgbUlkKTsKICAgICAgICAgfQogCiAgICAgICAgIHJlcyA9IGN1cnJlbnRDb25zdW1lci0+Y2FuY2VsQnVmZmVyKGN1cnJlbnRDb25zdW1lci5nZXQoKSwKICAgICAgICAgICAgICAgICBhbndCdWZmZXIsCiAgICAgICAgICAgICAgICAgYW53UmVsZWFzZUZlbmNlKTsKLSAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICBpZiAoc2hvdWxkTG9nRXJyb3IocmVzLCBzdGF0ZSkpIHsKICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBFcnJvciBjYW5jZWxsaW5nIGJ1ZmZlciB0byBuYXRpdmUgd2luZG93OiIKICAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgfQpAQCAtMjU2LDcgKzI1Niw3IEBACiAgICAgICAgIG5vdGlmeUJ1ZmZlclJlbGVhc2VkKGFud0J1ZmZlcik7CiAgICAgICAgIGlmIChtVXNlQnVmZmVyTWFuYWdlcikgewogICAgICAgICAgICAgLy8gUmV0dXJuIHRoaXMgYnVmZmVyIGJhY2sgdG8gYnVmZmVyIG1hbmFnZXIuCi0gICAgICAgICAgICBtQnVmZmVyUmVsZWFzZWRMaXN0ZW5lci0+b25CdWZmZXJSZWxlYXNlZCgpOworICAgICAgICAgICAgbUJ1ZmZlclByb2R1Y2VyTGlzdGVuZXItPm9uQnVmZmVyUmVsZWFzZWQoKTsKICAgICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAgIGlmIChtVHJhY2VGaXJzdEJ1ZmZlciAmJiAoc3RyZWFtX3R5cGUgPT0gQ0FNRVJBM19TVFJFQU1fT1VUUFVUKSkgewpAQCAtMjc5LDEwICsyNzksMTAgQEAKICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KIAotICAgICAgICByZXMgPSBxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoY3VycmVudENvbnN1bWVyLCBhbndCdWZmZXIsIGFud1JlbGVhc2VGZW5jZSk7Ci0gICAgICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBFcnJvciBxdWV1ZWluZyBidWZmZXIgdG8gbmF0aXZlIHdpbmRvdzogIgotICAgICAgICAgICAgICAgICAgIiVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIHJlcyA9IHF1ZXVlQnVmZmVyVG9Db25zdW1lcihjdXJyZW50Q29uc3VtZXIsIGFud0J1ZmZlciwgYW53UmVsZWFzZUZlbmNlLCBzdXJmYWNlX2lkcyk7CisgICAgICAgIGlmIChzaG91bGRMb2dFcnJvcihyZXMsIHN0YXRlKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IEVycm9yIHF1ZXVlaW5nIGJ1ZmZlciB0byBuYXRpdmUgd2luZG93OiIKKyAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKICAgICAgICAgfQogICAgIH0KICAgICBtTG9jay5sb2NrKCk7CkBAIC0zNTUsNyArMzU1LDE4IEBACiAgICAgLy8gU2V0IGRlcXVldWVCdWZmZXIvYXR0YWNoQnVmZmVyIHRpbWVvdXQgaWYgdGhlIGNvbnN1bWVyIGlzIG5vdCBodyBjb21wb3NlciBvciBodyB0ZXh0dXJlLgogICAgIC8vIFdlIG5lZWQgc2tpcCB0aGVzZSBjYXNlcyBhcyB0aW1lb3V0IHdpbGwgZGlzYWJsZSB0aGUgbm9uLWJsb2NraW5nIChhc3luYykgbW9kZS4KICAgICBpZiAoIShpc0NvbnN1bWVkQnlIV0NvbXBvc2VyKCkgfHwgaXNDb25zdW1lZEJ5SFdUZXh0dXJlKCkpKSB7Ci0gICAgICAgIG1Db25zdW1lci0+c2V0RGVxdWV1ZVRpbWVvdXQoa0RlcXVldWVCdWZmZXJUaW1lb3V0KTsKKyAgICAgICAgaWYgKG1Vc2VCdWZmZXJNYW5hZ2VyKSB7CisgICAgICAgICAgICAvLyBXaGVuIGJ1ZmZlciBtYW5hZ2VyIGlzIGhhbmRsaW5nIHRoZSBidWZmZXIsIHdlIHNob3VsZCBoYXZlIGF2YWlsYWJsZSBidWZmZXJzIGluCisgICAgICAgICAgICAvLyBidWZmZXIgcXVldWUgYmVmb3JlIHdlIGNhbGxzIGludG8gZGVxdWV1ZUJ1ZmZlciBiZWNhdXNlIGJ1ZmZlciBtYW5hZ2VyIGlzIHRyYWNraW5nCisgICAgICAgICAgICAvLyBmcmVlIGJ1ZmZlcnMuCisgICAgICAgICAgICAvLyBUaGVyZSBhcmUgaG93ZXZlciBzb21lIGNvbnN1bWVyIHNpZGUgZmVhdHVyZSAoSW1hZ2VSZWFkZXI6OmRpc2NhcmRGcmVlQnVmZmVycykgdGhhdAorICAgICAgICAgICAgLy8gY2FuIGRpc2NhcmQgZnJlZSBidWZmZXJzIHdpdGhvdXQgbm90aWZ5aW5nIGJ1ZmZlciBtYW5hZ2VyLiBXZSB3YW50IHRoZSB0aW1lb3V0IHRvCisgICAgICAgICAgICAvLyBoYXBwZW4gaW1tZWRpYXRlbHkgaGVyZSBzbyBidWZmZXIgbWFuYWdlciBjYW4gdHJ5IHRvIHVwZGF0ZSBpdHMgaW50ZXJuYWwgc3RhdGUgYW5kCisgICAgICAgICAgICAvLyB0cnkgdG8gYWxsb2NhdGUgYSBidWZmZXIgaW5zdGVhZCBvZiB3YWl0aW5nLgorICAgICAgICAgICAgbUNvbnN1bWVyLT5zZXREZXF1ZXVlVGltZW91dCgwKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1Db25zdW1lci0+c2V0RGVxdWV1ZVRpbWVvdXQoa0RlcXVldWVCdWZmZXJUaW1lb3V0KTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIHJldHVybiBPSzsKQEAgLTM3MSw4ICszODIsOCBAQAogICAgIC8vIENvbmZpZ3VyZSBjb25zdW1lci1zaWRlIEFOYXRpdmVXaW5kb3cgaW50ZXJmYWNlLiBUaGUgbGlzdGVuZXIgbWF5IGJlIHVzZWQKICAgICAvLyB0byBub3RpZnkgYnVmZmVyIG1hbmFnZXIgKGlmIGl0IGlzIHVzZWQpIG9mIHRoZSByZXR1cm5lZCBidWZmZXJzLgogICAgIHJlcyA9IG1Db25zdW1lci0+Y29ubmVjdChOQVRJVkVfV0lORE9XX0FQSV9DQU1FUkEsCi0gICAgICAgICAgICAvKmxpc3RlbmVyKi9tQnVmZmVyUmVsZWFzZWRMaXN0ZW5lciwKLSAgICAgICAgICAgIC8qcmVwb3J0QnVmZmVyUmVtb3ZhbCovdHJ1ZSk7CisgICAgICAgICAgICAvKnJlcG9ydEJ1ZmZlclJlbW92YWwqL3RydWUsCisgICAgICAgICAgICAvKmxpc3RlbmVyKi9tQnVmZmVyUHJvZHVjZXJMaXN0ZW5lcik7CiAgICAgaWYgKHJlcyAhPSBPSykgewogICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25uZWN0IHRvIG5hdGl2ZSB3aW5kb3cgZm9yIHN0cmVhbSAlZCIsCiAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQpOwpAQCAtNDc1LDggKzQ4NiwxMSBAQAogICAgICAqIHNldHMgdGhlIG1CdWZmZXJNYW5hZ2VyIGlmIGRldmljZSB2ZXJzaW9uIGlzID4gSEFMMy4yLCB3aGljaCBndWFyYW50ZWVzIHRoYXQgdGhlIGJ1ZmZlcgogICAgICAqIG1hbmFnZXIgc2V0dXAgaXMgc2tpcHBlZCBpbiBiZWxvdyBjb2RlLiBOb3RlIHRoYXQgSEFMMy4yIGlzIGFsc28gZXhjbHVkZWQgaGVyZSwgYXMgc29tZQogICAgICAqIEhBTDMuMiBkZXZpY2VzIG1heSBub3Qgc3VwcG9ydCB0aGUgZHluYW1pYyBidWZmZXIgcmVnaXN0ZXJhdGlvbi4KKyAgICAgKiBBbHNvIENhbWVyYTNCdWZmZXJNYW5hZ2VyIGRvZXMgbm90IHN1cHBvcnQgZGlzcGxheS90ZXh0dXJlIHN0cmVhbXMgYXMgdGhleSBoYXZlIGl0cyBvd24KKyAgICAgKiBidWZmZXIgbWFuYWdlbWVudCBsb2dpYy4KICAgICAgKi8KLSAgICBpZiAobUJ1ZmZlck1hbmFnZXIgIT0gMCAmJiBtU2V0SWQgPiBDQU1FUkEzX1NUUkVBTV9TRVRfSURfSU5WQUxJRCkgeworICAgIGlmIChtQnVmZmVyTWFuYWdlciAhPSAwICYmIG1TZXRJZCA+IENBTUVSQTNfU1RSRUFNX1NFVF9JRF9JTlZBTElEICYmCisgICAgICAgICAgICAhKGlzQ29uc3VtZWRCeUhXQ29tcG9zZXIoKSB8fCBpc0NvbnN1bWVkQnlIV1RleHR1cmUoKSkpIHsKICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSA9IDA7CiAgICAgICAgIGdldEVuZHBvaW50VXNhZ2UoJmNvbnN1bWVyVXNhZ2UpOwogICAgICAgICBTdHJlYW1JbmZvIHN0cmVhbUluZm8oCkBAIC01MTksOSArNTMzLDEyIEBACiAgICAgICAgICAgICAvLyBzdWNjZXNzZnVsIHJldHVybi4KICAgICAgICAgICAgICphbmIgPSBnYi5nZXQoKTsKICAgICAgICAgICAgIHJlcyA9IG1Db25zdW1lci0+YXR0YWNoQnVmZmVyKCphbmIpOwotICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgaWYgKHNob3VsZExvZ0Vycm9yKHJlcywgbVN0YXRlKSkgewogICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBhdHRhY2ggdGhlIG91dHB1dCBidWZmZXIgdG8gdGhpcyBzdXJmYWNlOiAlcyAoJWQpIiwKICAgICAgICAgICAgICAgICAgICAgICAgIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgICAgICAgICBjaGVja1JldEFuZFNldEFiYW5kb25lZExvY2tlZChyZXMpOwogICAgICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgICAgICB9CiAgICAgICAgICAgICBnb3RCdWZmZXJGcm9tTWFuYWdlciA9IHRydWU7CkBAIC01NTgsMzUgKzU3NSw4MiBAQAogICAgICAgICBtRGVxdWV1ZUJ1ZmZlckxhdGVuY3kuYWRkKGRlcXVldWVTdGFydCwgZGVxdWV1ZUVuZCk7CiAKICAgICAgICAgbUxvY2subG9jaygpOwotICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgZGVxdWV1ZSBuZXh0IG91dHB1dCBidWZmZXI6ICVzICglZCkiLAotICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CiAKLSAgICAgICAgICAgIC8vIE9ubHkgdHJhbnNpdGlvbiB0byBTVEFURV9BQkFORE9ORUQgZnJvbSBTVEFURV9DT05GSUdVUkVELiAoSWYgaXQgaXMgU1RBVEVfUFJFUEFSSU5HLAotICAgICAgICAgICAgLy8gbGV0IHByZXBhcmVOZXh0QnVmZmVyIGhhbmRsZSB0aGUgZXJyb3IuKQotICAgICAgICAgICAgaWYgKChyZXMgPT0gTk9fSU5JVCB8fCByZXMgPT0gREVBRF9PQkpFQ1QpICYmIG1TdGF0ZSA9PSBTVEFURV9DT05GSUdVUkVEKSB7Ci0gICAgICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQUJBTkRPTkVEOworICAgICAgICBpZiAobVVzZUJ1ZmZlck1hbmFnZXIgJiYgcmVzID09IFRJTUVEX09VVCkgeworICAgICAgICAgICAgY2hlY2tSZW1vdmVkQnVmZmVyc0xvY2tlZCgpOworCisgICAgICAgICAgICBzcDxHcmFwaGljQnVmZmVyPiBnYjsKKyAgICAgICAgICAgIHJlcyA9IG1CdWZmZXJNYW5hZ2VyLT5nZXRCdWZmZXJGb3JTdHJlYW0oCisgICAgICAgICAgICAgICAgICAgIGdldElkKCksIGdldFN0cmVhbVNldElkKCksICZnYiwgZmVuY2VGZCwgLypub0ZyZWVCdWZmZXIqL3RydWUpOworCisgICAgICAgICAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgICAgICAgICAgLy8gQXR0YWNoIHRoaXMgYnVmZmVyIHRvIHRoZSBidWZmZXJRdWV1ZTogdGhlIGJ1ZmZlciB3aWxsIGJlIGluIGRlcXVldWUgc3RhdGUgYWZ0ZXIKKyAgICAgICAgICAgICAgICAvLyBhIHN1Y2Nlc3NmdWwgcmV0dXJuLgorICAgICAgICAgICAgICAgICphbmIgPSBnYi5nZXQoKTsKKyAgICAgICAgICAgICAgICByZXMgPSBtQ29uc3VtZXItPmF0dGFjaEJ1ZmZlcigqYW5iKTsKKyAgICAgICAgICAgICAgICBnb3RCdWZmZXJGcm9tTWFuYWdlciA9IHRydWU7CisgICAgICAgICAgICAgICAgQUxPR1YoIlN0cmVhbSAlZDogQXR0YWNoZWQgbmV3IGJ1ZmZlciIsIGdldElkKCkpOworCisgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgICAgICAgICBpZiAoc2hvdWxkTG9nRXJyb3IocmVzLCBtU3RhdGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgYXR0YWNoIHRoZSBvdXRwdXQgYnVmZmVyIHRvIHRoaXMgc3VyZmFjZToiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgJXMgKCVkKSIsIF9fRlVOQ1RJT05fXywgbUlkLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjaGVja1JldEFuZFNldEFiYW5kb25lZExvY2tlZChyZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbid0IGdldCBuZXh0IG91dHB1dCBidWZmZXIgZnJvbSBidWZmZXIgbWFuYWdlcjoiCisgICAgICAgICAgICAgICAgICAgICAgICAiICVzICglZCkiLCBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgICAgIH0KLQorICAgICAgICB9IGVsc2UgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgaWYgKHNob3VsZExvZ0Vycm9yKHJlcywgbVN0YXRlKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogU3RyZWFtICVkOiBDYW4ndCBkZXF1ZXVlIG5leHQgb3V0cHV0IGJ1ZmZlcjogJXMgKCVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGVja1JldEFuZFNldEFiYW5kb25lZExvY2tlZChyZXMpOwogICAgICAgICAgICAgcmV0dXJuIHJlczsKICAgICAgICAgfQogICAgIH0KIAogICAgIGlmIChyZXMgPT0gT0spIHsKLSAgICAgICAgc3RkOjp2ZWN0b3I8c3A8R3JhcGhpY0J1ZmZlcj4+IHJlbW92ZWRCdWZmZXJzOwotICAgICAgICByZXMgPSBtQ29uc3VtZXItPmdldEFuZEZsdXNoUmVtb3ZlZEJ1ZmZlcnMoJnJlbW92ZWRCdWZmZXJzKTsKLSAgICAgICAgaWYgKHJlcyA9PSBPSykgewotICAgICAgICAgICAgb25CdWZmZXJzUmVtb3ZlZExvY2tlZChyZW1vdmVkQnVmZmVycyk7Ci0KLSAgICAgICAgICAgIGlmIChtVXNlQnVmZmVyTWFuYWdlciAmJiByZW1vdmVkQnVmZmVycy5zaXplKCkgPiAwKSB7Ci0gICAgICAgICAgICAgICAgbUJ1ZmZlck1hbmFnZXItPm9uQnVmZmVyc1JlbW92ZWQoZ2V0SWQoKSwgZ2V0U3RyZWFtU2V0SWQoKSwgcmVtb3ZlZEJ1ZmZlcnMuc2l6ZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQorICAgICAgICBjaGVja1JlbW92ZWRCdWZmZXJzTG9ja2VkKCk7CiAgICAgfQogCiAgICAgcmV0dXJuIHJlczsKIH0KIAordm9pZCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpjaGVja1JlbW92ZWRCdWZmZXJzTG9ja2VkKGJvb2wgbm90aWZ5QnVmZmVyTWFuYWdlcikgeworICAgIHN0ZDo6dmVjdG9yPHNwPEdyYXBoaWNCdWZmZXI+PiByZW1vdmVkQnVmZmVyczsKKyAgICBzdGF0dXNfdCByZXMgPSBtQ29uc3VtZXItPmdldEFuZEZsdXNoUmVtb3ZlZEJ1ZmZlcnMoJnJlbW92ZWRCdWZmZXJzKTsKKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIG9uQnVmZmVyc1JlbW92ZWRMb2NrZWQocmVtb3ZlZEJ1ZmZlcnMpOworCisgICAgICAgIGlmIChub3RpZnlCdWZmZXJNYW5hZ2VyICYmIG1Vc2VCdWZmZXJNYW5hZ2VyICYmIHJlbW92ZWRCdWZmZXJzLnNpemUoKSA+IDApIHsKKyAgICAgICAgICAgIG1CdWZmZXJNYW5hZ2VyLT5vbkJ1ZmZlcnNSZW1vdmVkKGdldElkKCksIGdldFN0cmVhbVNldElkKCksIHJlbW92ZWRCdWZmZXJzLnNpemUoKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgQ2FtZXJhM091dHB1dFN0cmVhbTo6Y2hlY2tSZXRBbmRTZXRBYmFuZG9uZWRMb2NrZWQoc3RhdHVzX3QgcmVzKSB7CisgICAgLy8gT25seSB0cmFuc2l0aW9uIHRvIFNUQVRFX0FCQU5ET05FRCBmcm9tIFNUQVRFX0NPTkZJR1VSRUQuIChJZiBpdCBpcworICAgIC8vIFNUQVRFX1BSRVBBUklORywgbGV0IHByZXBhcmVOZXh0QnVmZmVyIGhhbmRsZSB0aGUgZXJyb3IuKQorICAgIGlmICgocmVzID09IE5PX0lOSVQgfHwgcmVzID09IERFQURfT0JKRUNUKSAmJiBtU3RhdGUgPT0gU1RBVEVfQ09ORklHVVJFRCkgeworICAgICAgICBtU3RhdGUgPSBTVEFURV9BQkFORE9ORUQ7CisgICAgfQorfQorCitib29sIENhbWVyYTNPdXRwdXRTdHJlYW06OnNob3VsZExvZ0Vycm9yKHN0YXR1c190IHJlcywgU3RyZWFtU3RhdGUgc3RhdGUpIHsKKyAgICBpZiAocmVzID09IE9LKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKChyZXMgPT0gREVBRF9PQkpFQ1QgfHwgcmVzID09IE5PX0lOSVQpICYmIHN0YXRlID09IFNUQVRFX0FCQU5ET05FRCkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCiBzdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpkaXNjb25uZWN0TG9ja2VkKCkgewogICAgIHN0YXR1c190IHJlczsKIApAQCAtNjU5LDEyICs3MjMsMTEgQEAKICAgICByZXR1cm4gcmVzOwogfQogCi1zdGF0dXNfdCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpnZXRFbmRwb2ludFVzYWdlRm9yU3VyZmFjZSh1aW50NjRfdCAqdXNhZ2UsCi0gICAgICAgIGNvbnN0IHNwPFN1cmZhY2U+JiBzdXJmYWNlKSBjb25zdCB7Ci0gICAgc3RhdHVzX3QgcmVzOwotICAgIHVpbnQ2NF90IHUgPSAwOwordm9pZCBDYW1lcmEzT3V0cHV0U3RyZWFtOjphcHBseVpTTFVzYWdlUXVpcmsoaW50IGZvcm1hdCwgdWludDY0X3QgKmNvbnN1bWVyVXNhZ2UgLyppbm91dCovKSB7CisgICAgaWYgKGNvbnN1bWVyVXNhZ2UgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm47CisgICAgfQogCi0gICAgcmVzID0gbmF0aXZlX3dpbmRvd19nZXRfY29uc3VtZXJfdXNhZ2Uoc3RhdGljX2Nhc3Q8QU5hdGl2ZVdpbmRvdyo+KHN1cmZhY2UuZ2V0KCkpLCAmdSk7CiAgICAgLy8gSWYgYW4gb3BhcXVlIG91dHB1dCBzdHJlYW0ncyBlbmRwb2ludCBpcyBJbWFnZVJlYWRlciwgYWRkCiAgICAgLy8gR1JBTExPQ19VU0FHRV9IV19DQU1FUkFfWlNMIHRvIHRoZSB1c2FnZSBzbyBIQUwga25vd3MgaXQgd2lsbCBiZSB1c2VkCiAgICAgLy8gZm9yIHRoZSBaU0wgdXNlIGNhc2UuCkBAIC02NzMsMTIgKzczNiwyMCBAQAogICAgIC8vICAgICAyLiBHUkFMTE9DX1VTQUdFX0hXX1JFTkRFUgogICAgIC8vICAgICAzLiBHUkFMTE9DX1VTQUdFX0hXX0NPTVBPU0VSCiAgICAgLy8gICAgIDQuIEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUgotICAgIGlmIChjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0ID09IEhBTF9QSVhFTF9GT1JNQVRfSU1QTEVNRU5UQVRJT05fREVGSU5FRCAmJgotICAgICAgICAgICAgKHUgJiAoR1JBTExPQ19VU0FHRV9IV19URVhUVVJFIHwgR1JBTExPQ19VU0FHRV9IV19SRU5ERVIgfAorICAgIGlmIChmb3JtYXQgPT0gSEFMX1BJWEVMX0ZPUk1BVF9JTVBMRU1FTlRBVElPTl9ERUZJTkVEICYmCisgICAgICAgICAgICAoKmNvbnN1bWVyVXNhZ2UgJiAoR1JBTExPQ19VU0FHRV9IV19URVhUVVJFIHwgR1JBTExPQ19VU0FHRV9IV19SRU5ERVIgfAogICAgICAgICAgICAgR1JBTExPQ19VU0FHRV9IV19DT01QT1NFUiB8IEdSQUxMT0NfVVNBR0VfSFdfVklERU9fRU5DT0RFUikpID09IDApIHsKLSAgICAgICAgdSB8PSBHUkFMTE9DX1VTQUdFX0hXX0NBTUVSQV9aU0w7CisgICAgICAgICpjb25zdW1lclVzYWdlIHw9IEdSQUxMT0NfVVNBR0VfSFdfQ0FNRVJBX1pTTDsKICAgICB9Cit9CiAKK3N0YXR1c190IENhbWVyYTNPdXRwdXRTdHJlYW06OmdldEVuZHBvaW50VXNhZ2VGb3JTdXJmYWNlKHVpbnQ2NF90ICp1c2FnZSwKKyAgICAgICAgY29uc3Qgc3A8U3VyZmFjZT4mIHN1cmZhY2UpIGNvbnN0IHsKKyAgICBzdGF0dXNfdCByZXM7CisgICAgdWludDY0X3QgdSA9IDA7CisKKyAgICByZXMgPSBuYXRpdmVfd2luZG93X2dldF9jb25zdW1lcl91c2FnZShzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93Kj4oc3VyZmFjZS5nZXQoKSksICZ1KTsKKyAgICBhcHBseVpTTFVzYWdlUXVpcmsoY2FtZXJhM19zdHJlYW06OmZvcm1hdCwgJnUpOwogICAgICp1c2FnZSA9IHU7CiAgICAgcmV0dXJuIHJlczsKIH0KQEAgLTcxNCw3ICs3ODUsNyBAQAogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KIAotdm9pZCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpCdWZmZXJSZWxlYXNlZExpc3RlbmVyOjpvbkJ1ZmZlclJlbGVhc2VkKCkgewordm9pZCBDYW1lcmEzT3V0cHV0U3RyZWFtOjpCdWZmZXJQcm9kdWNlckxpc3RlbmVyOjpvbkJ1ZmZlclJlbGVhc2VkKCkgewogICAgIHNwPENhbWVyYTNPdXRwdXRTdHJlYW0+IHN0cmVhbSA9IG1QYXJlbnQucHJvbW90ZSgpOwogICAgIGlmIChzdHJlYW0gPT0gbnVsbHB0cikgewogICAgICAgICBBTE9HVigiJXM6IFBhcmVudCBjYW1lcmEzIG91dHB1dCBzdHJlYW0gd2FzIGRlc3Ryb3llZCIsIF9fRlVOQ1RJT05fXyk7CkBAIC03NDcsNiArODE4LDI1IEBACiAgICAgfQogfQogCit2b2lkIENhbWVyYTNPdXRwdXRTdHJlYW06OkJ1ZmZlclByb2R1Y2VyTGlzdGVuZXI6Om9uQnVmZmVyc0Rpc2NhcmRlZCgKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3A8R3JhcGhpY0J1ZmZlcj4+JiBidWZmZXJzKSB7CisgICAgc3A8Q2FtZXJhM091dHB1dFN0cmVhbT4gc3RyZWFtID0gbVBhcmVudC5wcm9tb3RlKCk7CisgICAgaWYgKHN0cmVhbSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dWKCIlczogUGFyZW50IGNhbWVyYTMgb3V0cHV0IHN0cmVhbSB3YXMgZGVzdHJveWVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChidWZmZXJzLnNpemUoKSA+IDApIHsKKyAgICAgICAgTXV0ZXg6OkF1dG9sb2NrIGwoc3RyZWFtLT5tTG9jayk7CisgICAgICAgIHN0cmVhbS0+b25CdWZmZXJzUmVtb3ZlZExvY2tlZChidWZmZXJzKTsKKyAgICAgICAgaWYgKHN0cmVhbS0+bVVzZUJ1ZmZlck1hbmFnZXIpIHsKKyAgICAgICAgICAgIHN0cmVhbS0+bUJ1ZmZlck1hbmFnZXItPm9uQnVmZmVyc1JlbW92ZWQoc3RyZWFtLT5nZXRJZCgpLAorICAgICAgICAgICAgICAgICAgICBzdHJlYW0tPmdldFN0cmVhbVNldElkKCksIGJ1ZmZlcnMuc2l6ZSgpKTsKKyAgICAgICAgfQorICAgICAgICBBTE9HVigiU3RyZWFtICVkOiAlenUgQnVmZmVycyBkaXNjYXJkZWQuIiwgc3RyZWFtLT5nZXRJZCgpLCBidWZmZXJzLnNpemUoKSk7CisgICAgfQorfQorCiB2b2lkIENhbWVyYTNPdXRwdXRTdHJlYW06Om9uQnVmZmVyc1JlbW92ZWRMb2NrZWQoCiAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNwPEdyYXBoaWNCdWZmZXI+PiYgcmVtb3ZlZEJ1ZmZlcnMpIHsKICAgICBzcDxDYW1lcmEzU3RyZWFtQnVmZmVyRnJlZWRMaXN0ZW5lcj4gY2FsbGJhY2sgPSBtQnVmZmVyRnJlZWRMaXN0ZW5lci5wcm9tb3RlKCk7CkBAIC03NzksNyArODY5LDkgQEAKICAgICAgICAgQUxPR1coIiVzOiB0aGUgcmVsZWFzZWQgYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gZnJlZWQgYnkgdGhlIGJ1ZmZlciBxdWV1ZSEiLCBfX0ZVTkNUSU9OX18pOwogICAgIH0gZWxzZSBpZiAocmVzICE9IE9LKSB7CiAgICAgICAgIC8vIFRyZWF0IG90aGVyIGVycm9ycyBhcyBhYmFuZG9ubWVudAotICAgICAgICBBTE9HRSgiJXM6IGRldGFjaCBuZXh0IGJ1ZmZlciBmYWlsZWQ6ICVzICglZCkuIiwgX19GVU5DVElPTl9fLCBzdHJlcnJvcigtcmVzKSwgcmVzKTsKKyAgICAgICAgaWYgKHNob3VsZExvZ0Vycm9yKHJlcywgbVN0YXRlKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBkZXRhY2ggbmV4dCBidWZmZXIgZmFpbGVkOiAlcyAoJWQpLiIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIH0KICAgICAgICAgbVN0YXRlID0gU1RBVEVfQUJBTkRPTkVEOwogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KQEAgLTc5MiwxMSArODg0LDggQEAKICAgICAgICAgfQogICAgIH0KIAotICAgIHN0ZDo6dmVjdG9yPHNwPEdyYXBoaWNCdWZmZXI+PiByZW1vdmVkQnVmZmVyczsKLSAgICByZXMgPSBtQ29uc3VtZXItPmdldEFuZEZsdXNoUmVtb3ZlZEJ1ZmZlcnMoJnJlbW92ZWRCdWZmZXJzKTsKLSAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgIG9uQnVmZmVyc1JlbW92ZWRMb2NrZWQocmVtb3ZlZEJ1ZmZlcnMpOwotICAgIH0KKyAgICAvLyBIZXJlIHdlIGFzc3VtZSBkZXRhY2hCdWZmZXIgaXMgY2FsbGVkIGJ5IGJ1ZmZlciBtYW5hZ2VyIHNvIGl0IGRvZXNuJ3QgbmVlZCB0byBiZSBub3RpZmllZAorICAgIGNoZWNrUmVtb3ZlZEJ1ZmZlcnNMb2NrZWQoLypub3RpZnlCdWZmZXJNYW5hZ2VyKi9mYWxzZSk7CiAgICAgcmV0dXJuIHJlczsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzT3V0cHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaAppbmRleCA2ZjM2ZjkyLi5iNGU0OWY5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW0uaApAQCAtMTQ2LDE4ICsxNDYsMjIgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IHNldENvbnN1bWVycyhjb25zdCBzdGQ6OnZlY3RvcjxzcDxTdXJmYWNlPj4mIGNvbnN1bWVycyk7CiAKLSAgICBjbGFzcyBCdWZmZXJSZWxlYXNlZExpc3RlbmVyIDogcHVibGljIEJuUHJvZHVjZXJMaXN0ZW5lciB7CisgICAgY2xhc3MgQnVmZmVyUHJvZHVjZXJMaXN0ZW5lciA6IHB1YmxpYyBTdXJmYWNlTGlzdGVuZXIgewogICAgICAgICBwdWJsaWM6Ci0gICAgICAgICAgQnVmZmVyUmVsZWFzZWRMaXN0ZW5lcih3cDxDYW1lcmEzT3V0cHV0U3RyZWFtPiBwYXJlbnQpIDogbVBhcmVudChwYXJlbnQpIHt9CisgICAgICAgICAgICBCdWZmZXJQcm9kdWNlckxpc3RlbmVyKHdwPENhbWVyYTNPdXRwdXRTdHJlYW0+IHBhcmVudCwgYm9vbCBuZWVkc1JlbGVhc2VOb3RpZnkpCisgICAgICAgICAgICAgICAgICAgIDogbVBhcmVudChwYXJlbnQpLCBtTmVlZHNSZWxlYXNlTm90aWZ5KG5lZWRzUmVsZWFzZU5vdGlmeSkge30KIAotICAgICAgICAgIC8qKgotICAgICAgICAgICogSW1wbGVtZW50YXRpb24gb2YgSVByb2R1Y2VyTGlzdGVuZXIsIHVzZWQgdG8gbm90aWZ5IHRoaXMgc3RyZWFtIHRoYXQgdGhlIGNvbnN1bWVyCi0gICAgICAgICAgKiBoYXMgcmV0dXJuZWQgYSBidWZmZXIgYW5kIGl0IGlzIHJlYWR5IHRvIHJldHVybiB0byBDYW1lcmEzQnVmZmVyTWFuYWdlciBmb3IgcmV1c2UuCi0gICAgICAgICAgKi8KLSAgICAgICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJSZWxlYXNlZCgpOworICAgICAgICAgICAgLyoqCisgICAgICAgICAgICAqIEltcGxlbWVudGF0aW9uIG9mIElQcm9kdWNlckxpc3RlbmVyLCB1c2VkIHRvIG5vdGlmeSB0aGlzIHN0cmVhbSB0aGF0IHRoZSBjb25zdW1lcgorICAgICAgICAgICAgKiBoYXMgcmV0dXJuZWQgYSBidWZmZXIgYW5kIGl0IGlzIHJlYWR5IHRvIHJldHVybiB0byBDYW1lcmEzQnVmZmVyTWFuYWdlciBmb3IgcmV1c2UuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgdmlydHVhbCB2b2lkIG9uQnVmZmVyUmVsZWFzZWQoKTsKKyAgICAgICAgICAgIHZpcnR1YWwgYm9vbCBuZWVkc1JlbGVhc2VOb3RpZnkoKSB7IHJldHVybiBtTmVlZHNSZWxlYXNlTm90aWZ5OyB9CisgICAgICAgICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJzRGlzY2FyZGVkKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPEdyYXBoaWNCdWZmZXI+PiYgYnVmZmVycyk7CiAKICAgICAgICAgcHJpdmF0ZToKLSAgICAgICAgICB3cDxDYW1lcmEzT3V0cHV0U3RyZWFtPiBtUGFyZW50OworICAgICAgICAgICAgd3A8Q2FtZXJhM091dHB1dFN0cmVhbT4gbVBhcmVudDsKKyAgICAgICAgICAgIGJvb2wgbU5lZWRzUmVsZWFzZU5vdGlmeTsKICAgICB9OwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBkZXRhY2hCdWZmZXIoc3A8R3JhcGhpY0J1ZmZlcj4qIGJ1ZmZlciwgaW50KiBmZW5jZUZkKTsKQEAgLTE5MCw2ICsxOTQsOSBAQAogICAgICAqLwogICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTdXJmYWNlSWQoY29uc3Qgc3A8U3VyZmFjZT4gJi8qc3VyZmFjZSovKSB7IHJldHVybiAwOyB9CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldFVuaXF1ZVN1cmZhY2VJZHMoY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYsCisgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c2l6ZV90PiopIHsgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOyB9OworCiAgICAgLyoqCiAgICAgICogVXBkYXRlIHRoZSBzdHJlYW0gb3V0cHV0IHN1cmZhY2VzLgogICAgICAqLwpAQCAtMTk4LDYgKzIwNSwxMSBAQAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiAmcmVtb3ZlZFN1cmZhY2VJZHMsCiAgICAgICAgICAgICBLZXllZFZlY3RvcjxzcDxTdXJmYWNlPiwgc2l6ZV90PiAqb3V0cHV0TWFwLypvdXQqLyk7CiAKKyAgICAvKioKKyAgICAgKiBBcHBseSBaU0wgcmVsYXRlZCBjb25zdW1lciB1c2FnZSBxdWlyay4KKyAgICAgKi8KKyAgICBzdGF0aWMgdm9pZCBhcHBseVpTTFVzYWdlUXVpcmsoaW50IGZvcm1hdCwgdWludDY0X3QgKmNvbnN1bWVyVXNhZ2UgLyppbm91dCovKTsKKwogICBwcm90ZWN0ZWQ6CiAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpbnQgaWQsIGNhbWVyYTNfc3RyZWFtX3R5cGVfdCB0eXBlLAogICAgICAgICAgICAgdWludDMyX3Qgd2lkdGgsIHVpbnQzMl90IGhlaWdodCwgaW50IGZvcm1hdCwKQEAgLTIxMyw2ICsyMjUsNyBAQAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCiAgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwKICAgICAgICAgICAgIGJvb2wgb3V0cHV0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMsCiAgICAgICAgICAgICAvKm91dCovCiAgICAgICAgICAgICBzcDxGZW5jZT4gKnJlbGVhc2VGZW5jZU91dCk7CiAKQEAgLTI1MywxMCArMjY2LDEwIEBACiAgICAgc3A8Q2FtZXJhM0J1ZmZlck1hbmFnZXI+IG1CdWZmZXJNYW5hZ2VyOwogCiAgICAgLyoqCi0gICAgICogQnVmZmVyIHJlbGVhc2VkIGxpc3RlbmVyLCB1c2VkIHRvIG5vdGlmeSB0aGUgYnVmZmVyIG1hbmFnZXIgdGhhdCBhIGJ1ZmZlciBpcyByZWxlYXNlZAotICAgICAqIGZyb20gY29uc3VtZXIgc2lkZS4KKyAgICAgKiBCdWZmZXIgcHJvZHVjZXIgbGlzdGVuZXIsIHVzZWQgdG8gaGFuZGxlIG5vdGlmaWNhdGlvbiB3aGVuIGEgYnVmZmVyIGlzIHJlbGVhc2VkCisgICAgICogZnJvbSBjb25zdW1lciBzaWRlLCBvciBhIHNldCBvZiBidWZmZXJzIGFyZSBkaXNjYXJkZWQgYnkgdGhlIGNvbnN1bWVyLgogICAgICAqLwotICAgIHNwPEJ1ZmZlclJlbGVhc2VkTGlzdGVuZXI+IG1CdWZmZXJSZWxlYXNlZExpc3RlbmVyOworICAgIHNwPEJ1ZmZlclByb2R1Y2VyTGlzdGVuZXI+IG1CdWZmZXJQcm9kdWNlckxpc3RlbmVyOwogCiAgICAgLyoqCiAgICAgICogRmxhZyBpbmRpY2F0aW5nIGlmIHRoZSBidWZmZXIgbWFuYWdlciBpcyB1c2VkIHRvIGFsbG9jYXRlIHRoZSBzdHJlYW0gYnVmZmVycwpAQCAtMjg1LDEwICsyOTgsMTEgQEAKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyTG9ja2VkKAogICAgICAgICAgICAgY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyICZidWZmZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCk7CisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpOwogCiAgICAgdmlydHVhbCBzdGF0dXNfdCBxdWV1ZUJ1ZmZlclRvQ29uc3VtZXIoc3A8QU5hdGl2ZVdpbmRvdz4mIGNvbnN1bWVyLAotICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlKTsKKyAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKIApAQCAtMjk5LDYgKzMxMywxNyBAQAogICAgICAqLwogICAgIHZvaWQgb25CdWZmZXJzUmVtb3ZlZExvY2tlZChjb25zdCBzdGQ6OnZlY3RvcjxzcDxHcmFwaGljQnVmZmVyPj4mKTsKICAgICBzdGF0dXNfdCBkZXRhY2hCdWZmZXJMb2NrZWQoc3A8R3JhcGhpY0J1ZmZlcj4qIGJ1ZmZlciwgaW50KiBmZW5jZUZkKTsKKyAgICAvLyBDYWxsIHRoaXMgYWZ0ZXIgZWFjaCBkZXF1ZXVlQnVmZmVyL2F0dGFjaEJ1ZmZlci9kZXRhY2hOZXh0QnVmZmVyIGNhbGwgdG8gZ2V0IHVwZGF0ZSBvbgorICAgIC8vIHJlbW92ZWQgYnVmZmVycy4gU2V0IG5vdGlmeUJ1ZmZlck1hbmFnZXIgdG8gZmFsc2Ugd2hlbiB0aGUgY2FsbCBpcyBpbml0aWF0ZWQgYnkgYnVmZmVyCisgICAgLy8gbWFuYWdlciBzbyBidWZmZXIgbWFuYWdlciBkb2Vzbid0IG5lZWQgdG8gYmUgbm90aWZpZWQuCisgICAgdm9pZCBjaGVja1JlbW92ZWRCdWZmZXJzTG9ja2VkKGJvb2wgbm90aWZ5QnVmZmVyTWFuYWdlciA9IHRydWUpOworCisgICAgLy8gQ2hlY2sgcmV0dXJuIHN0YXR1cyBvZiBJR0JQIGNhbGxzIGFuZCBzZXQgYWJhbmRvbmVkIHN0YXRlIGFjY29yZGluZ2x5CisgICAgdm9pZCBjaGVja1JldEFuZFNldEFiYW5kb25lZExvY2tlZChzdGF0dXNfdCByZXMpOworCisgICAgLy8gSWYgdGhlIHN0YXR1cyBpbmRpY2F0ZXMgYWJhbmRvbmRlZCBzdHJlYW0sIG9ubHkgbG9nIHdoZW4gc3RhdGUgaGFzbid0IGJlZW4gdXBkYXRlZCB0bworICAgIC8vIFNUQVRFX0FCQU5ET05FRAorICAgIHN0YXRpYyBib29sIHNob3VsZExvZ0Vycm9yKHN0YXR1c190IHJlcywgU3RyZWFtU3RhdGUgc3RhdGUpOwogCiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0RlcXVldWVMYXRlbmN5QmluU2l6ZSA9IDU7IC8vIGluIG1zCiAgICAgQ2FtZXJhTGF0ZW5jeUhpc3RvZ3JhbSBtRGVxdWV1ZUJ1ZmZlckxhdGVuY3k7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNPdXRwdXRTdHJlYW1JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oCmluZGV4IGE3MTFhNmQuLjJiZGU5NDkgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM091dHB1dFN0cmVhbUludGVyZmFjZS5oCkBAIC02Nyw2ICs2NywxOCBAQAogICAgIHZpcnR1YWwgc3NpemVfdCBnZXRTdXJmYWNlSWQoY29uc3Qgc3A8U3VyZmFjZT4gJnN1cmZhY2UpID0gMDsKIAogICAgIC8qKgorICAgICAqIFF1ZXJ5IHRoZSB1bmlxdWUgc3VyZmFjZSBJRHMgb2YgY3VycmVudCBzdXJmYWNlSWRzLgorICAgICAqIFdoZW4gcGFzc2luZyB1bmlxdWUgc3VyZmFjZSBJRHMgaW4gcmV0dXJuQnVmZmVyKCksIGlmIHRoZQorICAgICAqIHN1cmZhY2VJZCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cmVhbSwgdGhlIG91dHB1dCBjb3JyZXNwb25kaW5nIHRvCisgICAgICogdGhlIHVuaXF1ZSBzdXJmYWNlIElEIHdpbGwgYmUgaWdub3JlZCBhbmQgbm90IGRlbGl2ZXJlZCB0byBjbGllbnQuCisgICAgICoKKyAgICAgKiBSZXR1cm4gSU5WQUxJRF9PUEVSQVRJT04gaWYgYW5kIG9ubHkgaWYgdGhlIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0CisgICAgICogc3VyZmFjZSBzaGFyaW5nLgorICAgICAqLworICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0VW5pcXVlU3VyZmFjZUlkcyhjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlSWRzLAorICAgICAgICAgICAgLypvdXQqL3N0ZDo6dmVjdG9yPHNpemVfdD4qIG91dFVuaXF1ZUlkcykgPSAwOworCisgICAgLyoqCiAgICAgICogVXBkYXRlIHRoZSBzdHJlYW0gb3V0cHV0IHN1cmZhY2VzLgogICAgICAqLwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXBkYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiAmb3V0cHV0U3VyZmFjZXMsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmNwcAppbmRleCBmYjNjZTRjLi44NmI0NWNiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbS5jcHAKQEAgLTE0LDYgKzE0LDEwIEBACiAgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAqLwogCisjZGVmaW5lIExPR19UQUcgIkNhbWVyYTMtU2hhcmVkT3VTdHJtIgorI2RlZmluZSBBVFJBQ0VfVEFHIEFUUkFDRV9UQUdfQ0FNRVJBCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisKICNpbmNsdWRlICJDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmgiCiAKIG5hbWVzcGFjZSBhbmRyb2lkIHsKQEAgLTI4LDE2ICszMiwxNyBAQAogICAgICAgICB1aW50NjRfdCBjb25zdW1lclVzYWdlLCBhbmRyb2lkX2RhdGFzcGFjZSBkYXRhU3BhY2UsCiAgICAgICAgIGNhbWVyYTNfc3RyZWFtX3JvdGF0aW9uX3Qgcm90YXRpb24sCiAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wT2Zmc2V0LCBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICBpbnQgc2V0SWQpIDoKKyAgICAgICAgaW50IHNldElkLCBib29sIHVzZUhhbEJ1Zk1hbmFnZXIpIDoKICAgICAgICAgQ2FtZXJhM091dHB1dFN0cmVhbShpZCwgQ0FNRVJBM19TVFJFQU1fT1VUUFVULCB3aWR0aCwgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCwgZGF0YVNwYWNlLCByb3RhdGlvbiwgcGh5c2ljYWxDYW1lcmFJZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdW1lclVzYWdlLCB0aW1lc3RhbXBPZmZzZXQsIHNldElkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3VtZXJVc2FnZSwgdGltZXN0YW1wT2Zmc2V0LCBzZXRJZCksCisgICAgICAgIG1Vc2VIYWxCdWZNYW5hZ2VyKHVzZUhhbEJ1Zk1hbmFnZXIpIHsKICAgICBzaXplX3QgY29uc3VtZXJDb3VudCA9IHN0ZDo6bWluKHN1cmZhY2VzLnNpemUoKSwga01heE91dHB1dHMpOwogICAgIGlmIChzdXJmYWNlcy5zaXplKCkgPiBjb25zdW1lckNvdW50KSB7CiAgICAgICAgIEFMT0dFKCIlczogVHJ5aW5nIHRvIGFkZCBtb3JlIGNvbnN1bWVycyB0aGFuIHRoZSBtYXhpbXVtICIsIF9fZnVuY19fKTsKICAgICB9CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBjb25zdW1lckNvdW50OyBpKyspIHsKLSAgICAgICAgbVN1cmZhY2VzW2ldID0gc3VyZmFjZXNbaV07CisgICAgICAgIG1TdXJmYWNlVW5pcXVlSWRzW2ldID0gc3RkOjptYWtlX3BhaXIoc3VyZmFjZXNbaV0sIG1OZXh0VW5pcXVlU3VyZmFjZUlkKyspOwogICAgIH0KIH0KIApAQCAtNDgsMTUgKzUzLDE1IEBACiBzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpjb25uZWN0U3RyZWFtU3BsaXR0ZXJMb2NrZWQoKSB7CiAgICAgc3RhdHVzX3QgcmVzID0gT0s7CiAKLSAgICBtU3RyZWFtU3BsaXR0ZXIgPSBuZXcgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyKCk7CisgICAgbVN0cmVhbVNwbGl0dGVyID0gbmV3IENhbWVyYTNTdHJlYW1TcGxpdHRlcihtVXNlSGFsQnVmTWFuYWdlcik7CiAKLSAgICB1aW50NjRfdCB1c2FnZTsKKyAgICB1aW50NjRfdCB1c2FnZSA9IDA7CiAgICAgZ2V0RW5kcG9pbnRVc2FnZSgmdXNhZ2UpOwogCiAgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHNpemVfdCwgc3A8U3VyZmFjZT4+IGluaXRpYWxTdXJmYWNlczsKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhPdXRwdXRzOyBpKyspIHsKLSAgICAgICAgaWYgKG1TdXJmYWNlc1tpXSAhPSBudWxscHRyKSB7Ci0gICAgICAgICAgICBpbml0aWFsU3VyZmFjZXMuZW1wbGFjZShpLCBtU3VyZmFjZXNbaV0pOworICAgICAgICBpZiAobVN1cmZhY2VVbmlxdWVJZHNbaV0uZmlyc3QgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgaW5pdGlhbFN1cmZhY2VzLmVtcGxhY2UoaSwgbVN1cmZhY2VVbmlxdWVJZHNbaV0uZmlyc3QpOwogICAgICAgICB9CiAgICAgfQogCkBAIC03MSw2ICs3NiwzMSBAQAogICAgIHJldHVybiByZXM7CiB9CiAKK3N0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OmF0dGFjaEJ1ZmZlclRvU3BsaXR0ZXJMb2NrZWQoCisgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYiwKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKKyAgICBzdGF0dXNfdCByZXMgPSBPSzsKKworICAgIC8vIEF0dGFjaCB0aGUgYnVmZmVyIHRvIHRoZSBzcGxpdHRlciBvdXRwdXQgcXVldWVzLiBUaGlzIGNvdWxkIGJsb2NrIGlmCisgICAgLy8gdGhlIG91dHB1dCBxdWV1ZSBkb2Vzbid0IGhhdmUgYW55IGVtcHR5IHNsb3QuIFNvIHVubG9jayBkdXJpbmcgdGhlIGNvdXJzZQorICAgIC8vIG9mIGF0dGFjaEJ1ZmZlclRvT3V0cHV0cy4KKyAgICBzcDxDYW1lcmEzU3RyZWFtU3BsaXR0ZXI+IHNwbGl0dGVyID0gbVN0cmVhbVNwbGl0dGVyOworICAgIG1Mb2NrLnVubG9jaygpOworICAgIHJlcyA9IHNwbGl0dGVyLT5hdHRhY2hCdWZmZXJUb091dHB1dHMoYW5iLCBzdXJmYWNlX2lkcyk7CisgICAgbUxvY2subG9jaygpOworICAgIGlmIChyZXMgIT0gT0spIHsKKyAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbm5vdCBhdHRhY2ggc3RyZWFtIHNwbGl0dGVyIGJ1ZmZlciB0byBvdXRwdXRzOiAlcyAoJWQpIiwKKyAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgIC8vIE9ubHkgdHJhbnNpdGlvbiB0byBTVEFURV9BQkFORE9ORUQgZnJvbSBTVEFURV9DT05GSUdVUkVELiAoSWYgaXQgaXMgU1RBVEVfUFJFUEFSSU5HLAorICAgICAgICAvLyBsZXQgcHJlcGFyZU5leHRCdWZmZXIgaGFuZGxlIHRoZSBlcnJvci4pCisgICAgICAgIGlmIChyZXMgPT0gTk9fSU5JVCAmJiBtU3RhdGUgPT0gU1RBVEVfQ09ORklHVVJFRCkgeworICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQUJBTkRPTkVEOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKwogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6bm90aWZ5QnVmZmVyUmVsZWFzZWQoQU5hdGl2ZVdpbmRvd0J1ZmZlciAqYW53QnVmZmVyKSB7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogICAgIHN0YXR1c190IHJlcyA9IE9LOwpAQCAtODksNyArMTE5LDcgQEAKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogCi0gICAgcmV0dXJuIChtU3VyZmFjZXNbc3VyZmFjZV9pZF0gPT0gbnVsbHB0cik7CisgICAgcmV0dXJuIChtU3VyZmFjZVVuaXF1ZUlkc1tzdXJmYWNlX2lkXS5maXJzdCA9PSBudWxscHRyKTsKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6c2V0Q29uc3VtZXJzKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiYgc3VyZmFjZXMpIHsKQEAgLTExMiw3ICsxNDIsNyBAQAogICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgfQogCi0gICAgICAgIG1TdXJmYWNlc1tpZF0gPSBzdXJmYWNlOworICAgICAgICBtU3VyZmFjZVVuaXF1ZUlkc1tpZF0gPSBzdGQ6Om1ha2VfcGFpcihzdXJmYWNlLCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKIAogICAgICAgICAvLyBPbmx5IGNhbGwgYWRkT3V0cHV0IGlmIHRoZSBzcGxpdHRlciBoYXMgYmVlbiBjb25uZWN0ZWQuCiAgICAgICAgIGlmIChtU3RyZWFtU3BsaXR0ZXIgIT0gbnVsbHB0cikgewpAQCAtMTI4LDcgKzE1OCw3IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OmdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKLSAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpIHsKKyAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZUlkcykgewogICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGFuYjsKICAgICBpbnQgZmVuY2VGZCA9IC0xOwogCkBAIC0xMzgsMjMgKzE2OCwxMSBAQAogICAgICAgICByZXR1cm4gcmVzOwogICAgIH0KIAotICAgIC8vIEF0dGFjaCB0aGUgYnVmZmVyIHRvIHRoZSBzcGxpdHRlciBvdXRwdXQgcXVldWVzLiBUaGlzIGNvdWxkIGJsb2NrIGlmCi0gICAgLy8gdGhlIG91dHB1dCBxdWV1ZSBkb2Vzbid0IGhhdmUgYW55IGVtcHR5IHNsb3QuIFNvIHVubG9jayBkdXJpbmcgdGhlIGNvdXJzZQotICAgIC8vIG9mIGF0dGFjaEJ1ZmZlclRvT3V0cHV0cy4KLSAgICBzcDxDYW1lcmEzU3RyZWFtU3BsaXR0ZXI+IHNwbGl0dGVyID0gbVN0cmVhbVNwbGl0dGVyOwotICAgIG1Mb2NrLnVubG9jaygpOwotICAgIHJlcyA9IHNwbGl0dGVyLT5hdHRhY2hCdWZmZXJUb091dHB1dHMoYW5iLCBzdXJmYWNlX2lkcyk7Ci0gICAgbUxvY2subG9jaygpOwotICAgIGlmIChyZXMgIT0gT0spIHsKLSAgICAgICAgQUxPR0UoIiVzOiBTdHJlYW0gJWQ6IENhbm5vdCBhdHRhY2ggc3RyZWFtIHNwbGl0dGVyIGJ1ZmZlciB0byBvdXRwdXRzOiAlcyAoJWQpIiwKLSAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgc3RyZXJyb3IoLXJlcyksIHJlcyk7Ci0gICAgICAgIC8vIE9ubHkgdHJhbnNpdGlvbiB0byBTVEFURV9BQkFORE9ORUQgZnJvbSBTVEFURV9DT05GSUdVUkVELiAoSWYgaXQgaXMgU1RBVEVfUFJFUEFSSU5HLAotICAgICAgICAvLyBsZXQgcHJlcGFyZU5leHRCdWZmZXIgaGFuZGxlIHRoZSBlcnJvci4pCi0gICAgICAgIGlmIChyZXMgPT0gTk9fSU5JVCAmJiBtU3RhdGUgPT0gU1RBVEVfQ09ORklHVVJFRCkgewotICAgICAgICAgICAgbVN0YXRlID0gU1RBVEVfQUJBTkRPTkVEOworICAgIGlmICghbVVzZUhhbEJ1Zk1hbmFnZXIpIHsKKyAgICAgICAgcmVzID0gYXR0YWNoQnVmZmVyVG9TcGxpdHRlckxvY2tlZChhbmIsIHN1cmZhY2VJZHMpOworICAgICAgICBpZiAocmVzICE9IE9LKSB7CisgICAgICAgICAgICByZXR1cm4gcmVzOwogICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHJlczsKICAgICB9CiAKICAgICAvKioKQEAgLTE2OCw4ICsxODYsMzggQEAKIH0KIAogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6cXVldWVCdWZmZXJUb0NvbnN1bWVyKHNwPEFOYXRpdmVXaW5kb3c+JiBjb25zdW1lciwKLSAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSkgewotICAgIHN0YXR1c190IHJlcyA9IGNvbnN1bWVyLT5xdWV1ZUJ1ZmZlcihjb25zdW1lci5nZXQoKSwgYnVmZmVyLCBhbndSZWxlYXNlRmVuY2UpOworICAgICAgICAgICAgQU5hdGl2ZVdpbmRvd0J1ZmZlciogYnVmZmVyLCBpbnQgYW53UmVsZWFzZUZlbmNlLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgdW5pcXVlU3VyZmFjZUlkcykgeworICAgIHN0YXR1c190IHJlcyA9IE9LOworICAgIGlmIChtVXNlSGFsQnVmTWFuYWdlcikgeworICAgICAgICBpZiAodW5pcXVlU3VyZmFjZUlkcy5zaXplKCkgPT0gMCkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiB1bmlxdWVTdXJmYWNlSWRzIG11c3Qgbm90IGJlIGVtcHR5ISIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgICAgICB9CisgICAgICAgIE11dGV4OjpBdXRvbG9jayBsKG1Mb2NrKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8c2l6ZV90PiBzdXJmYWNlSWRzOworICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIHVuaXF1ZUlkIDogdW5pcXVlU3VyZmFjZUlkcykgeworICAgICAgICAgICAgYm9vbCB1bmlxdWVJZEZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGtNYXhPdXRwdXRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpZiAobVN1cmZhY2VVbmlxdWVJZHNbaV0uc2Vjb25kID09IHVuaXF1ZUlkKSB7CisgICAgICAgICAgICAgICAgICAgIHN1cmZhY2VJZHMucHVzaF9iYWNrKGkpOworICAgICAgICAgICAgICAgICAgICB1bmlxdWVJZEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCF1bmlxdWVJZEZvdW5kKSB7CisgICAgICAgICAgICAgICAgQUxPR1YoIiVzOiB1bmtub3duIHVuaXF1ZSBzdXJmYWNlIElEICV6dSBmb3Igc3RyZWFtICVkOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAib3V0cHV0IG1pZ2h0IGhhdmUgYmVlbiByZW1vdmVkLiIsCisgICAgICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIHVuaXF1ZUlkLCBtSWQpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJlcyA9IGF0dGFjaEJ1ZmZlclRvU3BsaXR0ZXJMb2NrZWQoYnVmZmVyLCBzdXJmYWNlSWRzKTsKKyAgICAgICAgaWYgKHJlcyAhPSBPSykgeworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9IGNvbnN1bWVyLT5xdWV1ZUJ1ZmZlcihjb25zdW1lci5nZXQoKSwgYnVmZmVyLCBhbndSZWxlYXNlRmVuY2UpOwogCiAgICAgLy8gQWZ0ZXIgcXVldWluZyBidWZmZXIgdG8gdGhlIGludGVybmFsIGNvbnN1bWVyIHF1ZXVlLCBjaGVjayB3aGV0aGVyIHRoZSBidWZmZXIgaXMKICAgICAvLyBzdWNjZXNzZnVsbHkgcXVldWVkIHRvIHRoZSBvdXRwdXQgcXVldWVzLgpAQCAtMjI4LDggKzI3Niw4IEBACiAgICAgICAgICp1c2FnZSA9IGdldFByZXNldENvbnN1bWVyVXNhZ2UoKTsKIAogICAgICAgICBmb3IgKHNpemVfdCBpZCA9IDA7IGlkIDwga01heE91dHB1dHM7IGlkKyspIHsKLSAgICAgICAgICAgIGlmIChtU3VyZmFjZXNbaWRdICE9IG51bGxwdHIpIHsKLSAgICAgICAgICAgICAgICByZXMgPSBnZXRFbmRwb2ludFVzYWdlRm9yU3VyZmFjZSgmdSwgbVN1cmZhY2VzW2lkXSk7CisgICAgICAgICAgICBpZiAobVN1cmZhY2VVbmlxdWVJZHNbaWRdLmZpcnN0ICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICByZXMgPSBnZXRFbmRwb2ludFVzYWdlRm9yU3VyZmFjZSgmdSwgbVN1cmZhY2VVbmlxdWVJZHNbaWRdLmZpcnN0KTsKICAgICAgICAgICAgICAgICAqdXNhZ2UgfD0gdTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMjQ1LDcgKzI5Myw3IEBACiBzc2l6ZV90IENhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW06OmdldE5leHRTdXJmYWNlSWRMb2NrZWQoKSB7CiAgICAgc3NpemVfdCBpZCA9IC0xOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heE91dHB1dHM7IGkrKykgewotICAgICAgICBpZiAobVN1cmZhY2VzW2ldID09IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1TdXJmYWNlVW5pcXVlSWRzW2ldLmZpcnN0ID09IG51bGxwdHIpIHsKICAgICAgICAgICAgIGlkID0gaTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNTgsNyArMzA2LDcgQEAKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgc3NpemVfdCBpZCA9IC0xOwogICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwga01heE91dHB1dHM7IGkrKykgewotICAgICAgICBpZiAobVN1cmZhY2VzW2ldID09IHN1cmZhY2UpIHsKKyAgICAgICAgaWYgKG1TdXJmYWNlVW5pcXVlSWRzW2ldLmZpcnN0ID09IHN1cmZhY2UpIHsKICAgICAgICAgICAgIGlkID0gaTsKICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CkBAIC0yNjcsNiArMzE1LDI2IEBACiAgICAgcmV0dXJuIGlkOwogfQogCitzdGF0dXNfdCBDYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtOjpnZXRVbmlxdWVTdXJmYWNlSWRzKAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlSWRzLAorICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c2l6ZV90Piogb3V0VW5pcXVlSWRzKSB7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworICAgIGlmIChvdXRVbmlxdWVJZHMgPT0gbnVsbHB0ciB8fCBzdXJmYWNlSWRzLnNpemUoKSA+IGtNYXhPdXRwdXRzKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgb3V0VW5pcXVlSWRzLT5jbGVhcigpOworICAgIG91dFVuaXF1ZUlkcy0+cmVzZXJ2ZShzdXJmYWNlSWRzLnNpemUoKSk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8mIHN1cmZhY2VJZCA6IHN1cmZhY2VJZHMpIHsKKyAgICAgICAgaWYgKHN1cmZhY2VJZCA+PSBrTWF4T3V0cHV0cykgeworICAgICAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICAgICAgfQorICAgICAgICBvdXRVbmlxdWVJZHMtPnB1c2hfYmFjayhtU3VyZmFjZVVuaXF1ZUlkc1tzdXJmYWNlSWRdLnNlY29uZCk7CisgICAgfQorICAgIHJldHVybiBPSzsKK30KKwogc3RhdHVzX3QgQ2FtZXJhM1NoYXJlZE91dHB1dFN0cmVhbTo6cmV2ZXJ0UGFydGlhbFVwZGF0ZUxvY2tlZCgKICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gJnJlbW92ZWRTdXJmYWNlcywKICAgICAgICAgY29uc3QgS2V5ZWRWZWN0b3I8c3A8U3VyZmFjZT4sIHNpemVfdD4gJmF0dGFjaGVkU3VyZmFjZXMpIHsKQEAgLTI4MCw3ICszNDgsNyBAQAogICAgICAgICAgICAgICAgIHJldHVybiBVTktOT1dOX0VSUk9SOwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1TdXJmYWNlc1tpbmRleF0gPSBudWxscHRyOworICAgICAgICBtU3VyZmFjZVVuaXF1ZUlkc1tpbmRleF0gPSBzdGQ6Om1ha2VfcGFpcihudWxscHRyLCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKICAgICB9CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlbW92ZWRTdXJmYWNlcy5zaXplKCk7IGkrKykgewpAQCAtMjkxLDcgKzM1OSw4IEBACiAgICAgICAgICAgICAgICAgcmV0dXJuIFVOS05PV05fRVJST1I7CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KLSAgICAgICAgbVN1cmZhY2VzW2luZGV4XSA9IHJlbW92ZWRTdXJmYWNlcy5rZXlBdChpKTsKKyAgICAgICAgbVN1cmZhY2VVbmlxdWVJZHNbaW5kZXhdID0gc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICAgcmVtb3ZlZFN1cmZhY2VzLmtleUF0KGkpLCBtTmV4dFVuaXF1ZVN1cmZhY2VJZCsrKTsKICAgICB9CiAKICAgICByZXR1cm4gcmV0OwpAQCAtMzQzLDggKzQxMiw4IEBACiAKICAgICAgICAgICAgIH0KICAgICAgICAgfQotICAgICAgICBtU3VyZmFjZXNbaXRdID0gbnVsbHB0cjsKLSAgICAgICAgcmVtb3ZlZFN1cmZhY2VzLmFkZChtU3VyZmFjZXNbaXRdLCBpdCk7CisgICAgICAgIHJlbW92ZWRTdXJmYWNlcy5hZGQobVN1cmZhY2VVbmlxdWVJZHNbaXRdLmZpcnN0LCBpdCk7CisgICAgICAgIG1TdXJmYWNlVW5pcXVlSWRzW2l0XSA9IHN0ZDo6bWFrZV9wYWlyKG51bGxwdHIsIG1OZXh0VW5pcXVlU3VyZmFjZUlkKyspOwogICAgIH0KIAogICAgIC8vTmV4dCBhZGQgdGhlIG5ldyBvdXRwdXRzCkBAIC0zNjksNyArNDM4LDcgQEAKICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwogICAgICAgICAgICAgfQogICAgICAgICB9Ci0gICAgICAgIG1TdXJmYWNlc1tzdXJmYWNlSWRdID0gaXQ7CisgICAgICAgIG1TdXJmYWNlVW5pcXVlSWRzW3N1cmZhY2VJZF0gPSBzdGQ6Om1ha2VfcGFpcihpdCwgbU5leHRVbmlxdWVTdXJmYWNlSWQrKyk7CiAgICAgICAgIG91dHB1dE1hcC0+YWRkKGl0LCBzdXJmYWNlSWQpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaAppbmRleCAwMmIxYzA5Li5iNWUzN2MyIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTaGFyZWRPdXRwdXRTdHJlYW0uaApAQCAtMTcsNiArMTcsNyBAQAogI2lmbmRlZiBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19TSEFSRURfT1VUUFVUX1NUUkVBTV9ICiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkEzX1NIQVJFRF9PVVRQVVRfU1RSRUFNX0gKIAorI2luY2x1ZGUgPGFycmF5PgogI2luY2x1ZGUgIkNhbWVyYTNTdHJlYW1TcGxpdHRlci5oIgogI2luY2x1ZGUgIkNhbWVyYTNPdXRwdXRTdHJlYW0uaCIKIApAQCAtMzcsNyArMzgsOCBAQAogICAgICAgICAgICAgdWludDY0X3QgY29uc3VtZXJVc2FnZSwgYW5kcm9pZF9kYXRhc3BhY2UgZGF0YVNwYWNlLAogICAgICAgICAgICAgY2FtZXJhM19zdHJlYW1fcm90YXRpb25fdCByb3RhdGlvbiwgbnNlY3NfdCB0aW1lc3RhbXBPZmZzZXQsCiAgICAgICAgICAgICBjb25zdCBTdHJpbmc4JiBwaHlzaWNhbENhbWVyYUlkLAotICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQpOworICAgICAgICAgICAgaW50IHNldElkID0gQ0FNRVJBM19TVFJFQU1fU0VUX0lEX0lOVkFMSUQsCisgICAgICAgICAgICBib29sIHVzZUhhbEJ1Zk1hbmFnZXIgPSBmYWxzZSk7CiAKICAgICB2aXJ0dWFsIH5DYW1lcmEzU2hhcmVkT3V0cHV0U3RyZWFtKCk7CiAKQEAgLTQ5LDYgKzUxLDE1IEBACiAKICAgICB2aXJ0dWFsIHNzaXplX3QgZ2V0U3VyZmFjZUlkKGNvbnN0IHNwPFN1cmZhY2U+ICZzdXJmYWNlKTsKIAorICAgIC8qKgorICAgICAqIFF1ZXJ5IHRoZSB1bmlxdWUgc3VyZmFjZSBJRHMgb2YgY3VycmVudCBzdXJmYWNlSWRzLgorICAgICAqIFdoZW4gcGFzc2luZyB1bmlxdWUgc3VyZmFjZSBJRHMgaW4gcmV0dXJuQnVmZmVyKCksIGlmIHRoZQorICAgICAqIHN1cmZhY2VJZCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIHN0cmVhbSwgdGhlIG91dHB1dCBjb3JyZXNwb25kaW5nIHRvCisgICAgICogdGhlIHVuaXF1ZSBzdXJmYWNlIElEIHdpbGwgYmUgaWdub3JlZCBhbmQgbm90IGRlbGl2ZXJlZCB0byBjbGllbnQuCisgICAgICovCisgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRVbmlxdWVTdXJmYWNlSWRzKGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VJZHMsCisgICAgICAgICAgICAvKm91dCovc3RkOjp2ZWN0b3I8c2l6ZV90Piogb3V0VW5pcXVlSWRzKSBvdmVycmlkZTsKKwogICAgIHZpcnR1YWwgc3RhdHVzX3QgdXBkYXRlU3RyZWFtKGNvbnN0IHN0ZDo6dmVjdG9yPHNwPFN1cmZhY2U+PiAmb3V0cHV0U3VyZmFjZXMsCiAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxPdXRwdXRTdHJlYW1JbmZvPiAmb3V0cHV0SW5mbywKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4gJnJlbW92ZWRTdXJmYWNlSWRzLApAQCAtNTgsOCArNjksMTcgQEAKIAogICAgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heE91dHB1dHMgPSA0OwogCi0gICAgLy8gTWFwIHN1cmZhY2VJZCAtPiBvdXRwdXQgc3VyZmFjZXMKLSAgICBzcDxTdXJmYWNlPiBtU3VyZmFjZXNba01heE91dHB1dHNdOworICAgIC8vIFdoZXRoZXIgSEFMIGlzIGluIGNvbnRyb2wgZm9yIGJ1ZmZlciBtYW5hZ2VtZW50LiBTdXJmYWNlIHNoYXJpbmcgYmVoYXZpb3IKKyAgICAvLyBkZXBlbmRzIG9uIHRoaXMgZmxhZy4KKyAgICBjb25zdCBib29sIG1Vc2VIYWxCdWZNYW5hZ2VyOworCisgICAgLy8gUGFpciBvZiBhbiBvdXRwdXQgU3VyZmFjZSBhbmQgaXRzIHVuaXF1ZSBJRAorICAgIHR5cGVkZWYgc3RkOjpwYWlyPHNwPFN1cmZhY2U+LCBzaXplX3Q+IFN1cmZhY2VVbmlxdWVJZDsKKworICAgIC8vIE1hcCBzdXJmYWNlSWQgLT4gKG91dHB1dCBzdXJmYWNlLCB1bmlxdWUgc3VyZmFjZSBJRCkKKyAgICBzdGQ6OmFycmF5PFN1cmZhY2VVbmlxdWVJZCwga01heE91dHB1dHM+IG1TdXJmYWNlVW5pcXVlSWRzOworCisgICAgc2l6ZV90IG1OZXh0VW5pcXVlU3VyZmFjZUlkID0gMDsKIAogICAgIHNzaXplX3QgZ2V0TmV4dFN1cmZhY2VJZExvY2tlZCgpOwogCkBAIC03OCwxMyArOTgsMjQgQEAKICAgICBzdGF0dXNfdCBjb25uZWN0U3RyZWFtU3BsaXR0ZXJMb2NrZWQoKTsKIAogICAgIC8qKgorICAgICAqIEF0dGFjaCB0aGUgb3V0cHV0IGJ1ZmZlciB0byBzdHJlYW0gc3BsaXR0ZXIuCisgICAgICogV2hlbiBjYW1lcmEgc2VydmljZSBpcyBkb2luZyBidWZmZXIgbWFuYWdlbWVudCwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQKKyAgICAgKiBiZWZvcmUgdGhlIGJ1ZmZlciBpcyBoYW5kZWQgb3V0IHRvIEhBTCBpbiByZXF1ZXN0IHRocmVhZC4KKyAgICAgKiBXaGVuIEhBTCBpcyBkb2luZyBidWZmZXIgbWFuYWdlbWVudCwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgd2hlbgorICAgICAqIHRoZSBidWZmZXIgaXMgcmV0dXJuZWQgZnJvbSBIQUwgaW4gaHdiaW5kZXIgY2FsbGJhY2sgdGhyZWFkLgorICAgICAqLworICAgIHN0YXR1c190IGF0dGFjaEJ1ZmZlclRvU3BsaXR0ZXJMb2NrZWQoQU5hdGl2ZVdpbmRvd0J1ZmZlciogYW5iLAorICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMpOworCisgICAgLyoqCiAgICAgICogSW50ZXJuYWwgQ2FtZXJhM1N0cmVhbSBpbnRlcmZhY2UKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IGdldEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlciwKICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgcXVldWVCdWZmZXJUb0NvbnN1bWVyKHNwPEFOYXRpdmVXaW5kb3c+JiBjb25zdW1lciwKLSAgICAgICAgICAgIEFOYXRpdmVXaW5kb3dCdWZmZXIqIGJ1ZmZlciwgaW50IGFud1JlbGVhc2VGZW5jZSk7CisgICAgICAgICAgICBBTmF0aXZlV2luZG93QnVmZmVyKiBidWZmZXIsIGludCBhbndSZWxlYXNlRmVuY2UsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiB1bmlxdWVTdXJmYWNlSWRzKTsKIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgY29uZmlndXJlUXVldWVMb2NrZWQoKTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5jcHAKaW5kZXggNjEwNjY3NC4uZmQ5YjRiMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW0uY3BwCkBAIC02MCwxNCArNjAsMTkgQEAKICAgICBtVXNhZ2UoMCksCiAgICAgbU9sZFVzYWdlKDApLAogICAgIG1PbGRNYXhCdWZmZXJzKDApLAorICAgIG1PbGRGb3JtYXQoLTEpLAorICAgIG1PbGREYXRhU3BhY2UoSEFMX0RBVEFTUEFDRV9VTktOT1dOKSwKICAgICBtUHJlcGFyZWQoZmFsc2UpLAogICAgIG1QcmVwYXJlQmxvY2tSZXF1ZXN0KHRydWUpLAogICAgIG1QcmVwYXJlZEJ1ZmZlcklkeCgwKSwKICAgICBtTGFzdE1heENvdW50KENhbWVyYTNTdHJlYW1JbnRlcmZhY2U6OkFMTE9DQVRFX1BJUEVMSU5FX01BWCksCiAgICAgbUJ1ZmZlckxpbWl0TGF0ZW5jeShrQnVmZmVyTGltaXRMYXRlbmN5QmluU2l6ZSksCiAgICAgbUZvcm1hdE92ZXJyaWRkZW4oZmFsc2UpLAotICAgIG1PcmlnaW5hbEZvcm1hdCgtMSksCi0gICAgbVBoeXNpY2FsQ2FtZXJhSWQocGh5c2ljYWxDYW1lcmFJZCkgeworICAgIG1PcmlnaW5hbEZvcm1hdChmb3JtYXQpLAorICAgIG1EYXRhU3BhY2VPdmVycmlkZGVuKGZhbHNlKSwKKyAgICBtT3JpZ2luYWxEYXRhU3BhY2UoSEFMX0RBVEFTUEFDRV9VTktOT1dOKSwKKyAgICBtUGh5c2ljYWxDYW1lcmFJZChwaHlzaWNhbENhbWVyYUlkKSwKKyAgICBtTGFzdFRpbWVzdGFtcCgwKSB7CiAKICAgICBjYW1lcmEzX3N0cmVhbTo6c3RyZWFtX3R5cGUgPSB0eXBlOwogICAgIGNhbWVyYTNfc3RyZWFtOjp3aWR0aCA9IHdpZHRoOwpAQCAtMTIwLDcgKzEyNSw2IEBACiAKIHZvaWQgQ2FtZXJhM1N0cmVhbTo6c2V0Rm9ybWF0T3ZlcnJpZGUoYm9vbCBmb3JtYXRPdmVycmlkZGVuKSB7CiAgICAgbUZvcm1hdE92ZXJyaWRkZW4gPSBmb3JtYXRPdmVycmlkZGVuOwotICAgIGlmIChmb3JtYXRPdmVycmlkZGVuKSBtT3JpZ2luYWxGb3JtYXQgPSBjYW1lcmEzX3N0cmVhbTo6Zm9ybWF0OwogfQogCiBib29sIENhbWVyYTNTdHJlYW06OmlzRm9ybWF0T3ZlcnJpZGRlbigpIGNvbnN0IHsKQEAgLTEzMyw3ICsxMzcsOSBAQAogCiB2b2lkIENhbWVyYTNTdHJlYW06OnNldERhdGFTcGFjZU92ZXJyaWRlKGJvb2wgZGF0YVNwYWNlT3ZlcnJpZGRlbikgewogICAgIG1EYXRhU3BhY2VPdmVycmlkZGVuID0gZGF0YVNwYWNlT3ZlcnJpZGRlbjsKLSAgICBpZiAoZGF0YVNwYWNlT3ZlcnJpZGRlbikgbU9yaWdpbmFsRGF0YVNwYWNlID0gY2FtZXJhM19zdHJlYW06OmRhdGFfc3BhY2U7CisgICAgaWYgKGRhdGFTcGFjZU92ZXJyaWRkZW4gJiYgbU9yaWdpbmFsRGF0YVNwYWNlID09IEhBTF9EQVRBU1BBQ0VfVU5LTk9XTikgeworICAgICAgICBtT3JpZ2luYWxEYXRhU3BhY2UgPSBjYW1lcmEzX3N0cmVhbTo6ZGF0YV9zcGFjZTsKKyAgICB9CiB9CiAKIGJvb2wgQ2FtZXJhM1N0cmVhbTo6aXNEYXRhU3BhY2VPdmVycmlkZGVuKCkgY29uc3QgewpAQCAtMjQ5LDYgKzI1NSw4IEBACiAKICAgICBtT2xkVXNhZ2UgPSBtVXNhZ2U7CiAgICAgbU9sZE1heEJ1ZmZlcnMgPSBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnM7CisgICAgbU9sZEZvcm1hdCA9IGNhbWVyYTNfc3RyZWFtOjpmb3JtYXQ7CisgICAgbU9sZERhdGFTcGFjZSA9IGNhbWVyYTNfc3RyZWFtOjpkYXRhX3NwYWNlOwogCiAgICAgcmVzID0gZ2V0RW5kcG9pbnRVc2FnZSgmbVVzYWdlKTsKICAgICBpZiAocmVzICE9IE9LKSB7CkBAIC0zMjMsNyArMzMxLDkgQEAKICAgICAvLyBzby4gQXMgZG9jdW1lbnRlZCBpbiBoYXJkd2FyZS9jYW1lcmEzLmg6Y29uZmlndXJlX3N0cmVhbXMoKS4KICAgICBpZiAobVN0YXRlID09IFNUQVRFX0lOX1JFQ09ORklHICYmCiAgICAgICAgICAgICBtT2xkVXNhZ2UgPT0gbVVzYWdlICYmCi0gICAgICAgICAgICBtT2xkTWF4QnVmZmVycyA9PSBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMgJiYgIW1EYXRhU3BhY2VPdmVycmlkZGVuKSB7CisgICAgICAgICAgICBtT2xkTWF4QnVmZmVycyA9PSBjYW1lcmEzX3N0cmVhbTo6bWF4X2J1ZmZlcnMgJiYKKyAgICAgICAgICAgIG1PbGREYXRhU3BhY2UgPT0gY2FtZXJhM19zdHJlYW06OmRhdGFfc3BhY2UgJiYKKyAgICAgICAgICAgIG1PbGRGb3JtYXQgPT0gY2FtZXJhM19zdHJlYW06OmZvcm1hdCkgewogICAgICAgICBtU3RhdGUgPSBTVEFURV9DT05GSUdVUkVEOwogICAgICAgICByZXR1cm4gT0s7CiAgICAgfQpAQCAtNTk0LDcgKzYwNCwxMSBAQAogICAgIGlmIChtU3RhdGUgIT0gU1RBVEVfQ09ORklHVVJFRCkgewogICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogQ2FuJ3QgZ2V0IGJ1ZmZlcnMgaWYgc3RyZWFtIGlzIG5vdCBpbiBDT05GSUdVUkVEIHN0YXRlICVkIiwKICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIG1JZCwgbVN0YXRlKTsKLSAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICBpZiAobVN0YXRlID09IFNUQVRFX0FCQU5ET05FRCkgeworICAgICAgICAgICAgcmV0dXJuIERFQURfT0JKRUNUOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIElOVkFMSURfT1BFUkFUSU9OOworICAgICAgICB9CiAgICAgfQogCiAgICAgLy8gV2FpdCBmb3IgbmV3IGJ1ZmZlciByZXR1cm5lZCBiYWNrIGlmIHdlIGFyZSBydW5uaW5nIGludG8gdGhlIGxpbWl0LgpAQCAtNjYxLDcgKzY3NSw4IEBACiB9CiAKIHN0YXR1c190IENhbWVyYTNTdHJlYW06OnJldHVybkJ1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApIHsKKyAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGJvb2wgdGltZXN0YW1wSW5jcmVhc2luZywKKyAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzLCB1aW50NjRfdCBmcmFtZU51bWJlcikgewogICAgIEFUUkFDRV9DQUxMKCk7CiAgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOwogCkBAIC02NzMsNiArNjg4LDE1IEBACiAKICAgICByZW1vdmVPdXRzdGFuZGluZ0J1ZmZlcihidWZmZXIpOwogCisgICAgLy8gQnVmZmVyIHN0YXR1cyBtYXkgYmUgY2hhbmdlZCwgc28gbWFrZSBhIGNvcHkgb2YgdGhlIHN0cmVhbV9idWZmZXIgc3RydWN0LgorICAgIGNhbWVyYTNfc3RyZWFtX2J1ZmZlciBiID0gYnVmZmVyOworICAgIGlmICh0aW1lc3RhbXBJbmNyZWFzaW5nICYmIHRpbWVzdGFtcCAhPSAwICYmIHRpbWVzdGFtcCA8PSBtTGFzdFRpbWVzdGFtcCkgeworICAgICAgICBBTE9HRSgiJXM6IFN0cmVhbSAlZDogdGltZXN0YW1wICUiIFBSSWQ2NCAiIGlzIG5vdCBpbmNyZWFzaW5nLiBQcmV2IHRpbWVzdGFtcCAlIiBQUklkNjQsCisgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBtSWQsIHRpbWVzdGFtcCwgbUxhc3RUaW1lc3RhbXApOworICAgICAgICBiLnN0YXR1cyA9IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUjsKKyAgICB9CisgICAgbUxhc3RUaW1lc3RhbXAgPSB0aW1lc3RhbXA7CisKICAgICAvKioKICAgICAgKiBUT0RPOiBDaGVjayB0aGF0IHRoZSBzdGF0ZSBpcyB2YWxpZCBmaXJzdC4KICAgICAgKgpAQCAtNjgxLDkgKzcwNSw5IEBACiAgICAgICoKICAgICAgKiBEbyB0aGlzIGZvciBnZXRCdWZmZXIgYXMgd2VsbC4KICAgICAgKi8KLSAgICBzdGF0dXNfdCByZXMgPSByZXR1cm5CdWZmZXJMb2NrZWQoYnVmZmVyLCB0aW1lc3RhbXApOworICAgIHN0YXR1c190IHJlcyA9IHJldHVybkJ1ZmZlckxvY2tlZChiLCB0aW1lc3RhbXAsIHN1cmZhY2VfaWRzKTsKICAgICBpZiAocmVzID09IE9LKSB7Ci0gICAgICAgIGZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoYnVmZmVyLCAvKmFjcXVpcmVkKi9mYWxzZSwgLypvdXRwdXQqL3RydWUpOworICAgICAgICBmaXJlQnVmZmVyTGlzdGVuZXJzTG9ja2VkKGIsIC8qYWNxdWlyZWQqL2ZhbHNlLCAvKm91dHB1dCovdHJ1ZSwgdGltZXN0YW1wLCBmcmFtZU51bWJlcik7CiAgICAgfQogCiAgICAgLy8gRXZlbiBpZiByZXR1cm5pbmcgdGhlIGJ1ZmZlciBmYWlsZWQsIHdlIHN0aWxsIHdhbnQgdG8gc2lnbmFsIHdob2V2ZXIgaXMgd2FpdGluZyBmb3IgdGhlCkBAIC03NTksOCArNzgzLDIyIEBACiAgICAgcmV0dXJuIGdldElucHV0QnVmZmVyUHJvZHVjZXJMb2NrZWQocHJvZHVjZXIpOwogfQogCit2b2lkIENhbWVyYTNTdHJlYW06OmZpcmVCdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIodWludDY0X3QgZnJhbWVOdW1iZXIsCisgICAgICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBzZXR0aW5ncykgeworICAgIEFUUkFDRV9DQUxMKCk7CisgICAgTXV0ZXg6OkF1dG9sb2NrIGwobUxvY2spOworCisgICAgZm9yIChhdXRvICZpdCA6IG1CdWZmZXJMaXN0ZW5lckxpc3QpIHsKKyAgICAgICAgc3A8Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyPiBsaXN0ZW5lciA9IGl0LnByb21vdGUoKTsKKyAgICAgICAgaWYgKGxpc3RlbmVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIGxpc3RlbmVyLT5vbkJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcihmcmFtZU51bWJlciwgZ2V0SWQoKSwgc2V0dGluZ3MpOworICAgICAgICB9CisgICAgfQorfQorCiB2b2lkIENhbWVyYTNTdHJlYW06OmZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoCi0gICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciYgYnVmZmVyLCBib29sIGFjcXVpcmVkLCBib29sIG91dHB1dCkgeworICAgICAgICBjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXImIGJ1ZmZlciwgYm9vbCBhY3F1aXJlZCwgYm9vbCBvdXRwdXQsIG5zZWNzX3QgdGltZXN0YW1wLAorICAgICAgICB1aW50NjRfdCBmcmFtZU51bWJlcikgewogICAgIExpc3Q8d3A8Q2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyPiA+OjppdGVyYXRvciBpdCwgZW5kOwogCiAgICAgLy8gVE9ETzogZmluaXNoIGltcGxlbWVudGluZwpAQCAtNzY5LDYgKzgwNyw4IEBACiAgICAgICAgIENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lcjo6QnVmZmVySW5mbygpOwogICAgIGluZm8ubU91dHB1dCA9IG91dHB1dDsKICAgICBpbmZvLm1FcnJvciA9IChidWZmZXIuc3RhdHVzID09IENBTUVSQTNfQlVGRkVSX1NUQVRVU19FUlJPUik7CisgICAgaW5mby5tRnJhbWVOdW1iZXIgPSBmcmFtZU51bWJlcjsKKyAgICBpbmZvLm1UaW1lc3RhbXAgPSB0aW1lc3RhbXA7CiAgICAgLy8gVE9ETzogcmVzdCBvZiBmaWVsZHMKIAogICAgIGZvciAoaXQgPSBtQnVmZmVyTGlzdGVuZXJMaXN0LmJlZ2luKCksIGVuZCA9IG1CdWZmZXJMaXN0ZW5lckxpc3QuZW5kKCk7CkBAIC03OTIsNiArODMyLDEyIEBACiAgICAgcmV0dXJuIGhhc091dHN0YW5kaW5nQnVmZmVyc0xvY2tlZCgpOwogfQogCitzaXplX3QgQ2FtZXJhM1N0cmVhbTo6Z2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSBjb25zdCB7CisgICAgQVRSQUNFX0NBTEwoKTsKKyAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CisgICAgcmV0dXJuIGdldEhhbmRvdXRPdXRwdXRCdWZmZXJDb3VudExvY2tlZCgpOworfQorCiBzdGF0dXNfdCBDYW1lcmEzU3RyZWFtOjpzZXRTdGF0dXNUcmFja2VyKHNwPFN0YXR1c1RyYWNrZXI+IHN0YXR1c1RyYWNrZXIpIHsKICAgICBNdXRleDo6QXV0b2xvY2sgbChtTG9jayk7CiAgICAgc3A8U3RhdHVzVHJhY2tlcj4gb2xkVHJhY2tlciA9IG1TdGF0dXNUcmFja2VyLnByb21vdGUoKTsKQEAgLTgzNCw3ICs4ODAsNyBAQAogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KIHN0YXR1c190IENhbWVyYTNTdHJlYW06OnJldHVybkJ1ZmZlckxvY2tlZChjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuc2Vjc190KSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnNlY3NfdCwgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYpIHsKICAgICBBTE9HRSgiJXM6IFRoaXMgdHlwZSBvZiBzdHJlYW0gZG9lcyBub3Qgc3VwcG9ydCBvdXRwdXQiLCBfX0ZVTkNUSU9OX18pOwogICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbS5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKaW5kZXggYmYyYWJkOC4uNjdhZmQwZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtLmgKQEAgLTMyNCwxMSArMzI0LDE4IEBACiAgICAgLyoqCiAgICAgICogUmV0dXJuIGEgYnVmZmVyIHRvIHRoZSBzdHJlYW0gYWZ0ZXIgdXNlIGJ5IHRoZSBIQUwuCiAgICAgICoKKyAgICAgKiBNdWx0aXBsZSBzdXJmYWNlcyBjb3VsZCBzaGFyZSB0aGUgc2FtZSBIQUwgc3RyZWFtLCBidXQgYSByZXF1ZXN0IG1heQorICAgICAqIGJlIG9ubHkgZm9yIGEgc3Vic2V0IG9mIHN1cmZhY2VzLiBJbiB0aGlzIGNhc2UsIHRoZQorICAgICAqIENhbWVyYTNTdHJlYW1JbnRlcmZhY2Ugb2JqZWN0IG5lZWRzIHRoZSBzdXJmYWNlIElEIGluZm9ybWF0aW9uIHRvIGF0dGFjaAorICAgICAqIGJ1ZmZlcnMgZm9yIHRob3NlIHN1cmZhY2VzLgorICAgICAqCiAgICAgICogVGhpcyBtZXRob2QgbWF5IG9ubHkgYmUgY2FsbGVkIGZvciBidWZmZXJzIHByb3ZpZGVkIGJ5IGdldEJ1ZmZlcigpLgogICAgICAqIEZvciBiaWRpcmVjdGlvbmFsIHN0cmVhbXMsIHRoaXMgbWV0aG9kIGFwcGxpZXMgdG8gdGhlIG91dHB1dC1zaWRlIGJ1ZmZlcnMKICAgICAgKi8KICAgICBzdGF0dXNfdCAgICAgICAgIHJldHVybkJ1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKTsKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBib29sIHRpbWVzdGFtcEluY3JlYXNpbmcsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSwKKyAgICAgICAgICAgIHVpbnQ2NF90IGZyYW1lTnVtYmVyID0gMCk7CiAKICAgICAvKioKICAgICAgKiBGaWxsIGluIHRoZSBjYW1lcmEzX3N0cmVhbV9idWZmZXIgd2l0aCB0aGUgbmV4dCB2YWxpZCBidWZmZXIgZm9yIHRoaXMKQEAgLTM2Miw2ICszNjksMTEgQEAKICAgICAgKi8KICAgICBib29sICAgICAgICAgICAgIGhhc091dHN0YW5kaW5nQnVmZmVycygpIGNvbnN0OwogCisgICAgLyoqCisgICAgICogR2V0IG51bWJlciBvZiBidWZmZXJzIGN1cnJlbnRseSBoYW5kZWQgb3V0IHRvIEhBTAorICAgICAqLworICAgIHNpemVfdCAgICAgICAgICAgZ2V0T3V0c3RhbmRpbmdCdWZmZXJzQ291bnQoKSBjb25zdDsKKwogICAgIGVudW0gewogICAgICAgICBUSU1FT1VUX05FVkVSID0gLTEKICAgICB9OwpAQCAtNDIxLDYgKzQzMywxMiBAQAogICAgICAqLwogICAgIHN0YXR1c190ICAgICAgICAgcmVzdG9yZUNvbmZpZ3VyZWRTdGF0ZSgpOwogCisgICAgLyoqCisgICAgICogTm90aWZ5IGJ1ZmZlciBzdHJlYW0gbGlzdGVuZXJzIGFib3V0IGluY29taW5nIHJlcXVlc3Qgd2l0aCBwYXJ0aWN1bGFyIGZyYW1lIG51bWJlci4KKyAgICAgKi8KKyAgICB2b2lkIGZpcmVCdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIodWludDY0X3QgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpIG92ZXJyaWRlOworCiAgIHByb3RlY3RlZDoKICAgICBjb25zdCBpbnQgbUlkOwogICAgIC8qKgpAQCAtNDQyLDcgKzQ2MCw3IEBACiAgICAgLy8gWmVybyBmb3IgZm9ybWF0cyB3aXRoIGZpeGVkIGJ1ZmZlciBzaXplIGZvciBnaXZlbiBkaW1lbnNpb25zLgogICAgIGNvbnN0IHNpemVfdCBtTWF4U2l6ZTsKIAotICAgIGVudW0geworICAgIGVudW0gU3RyZWFtU3RhdGUgewogICAgICAgICBTVEFURV9FUlJPUiwKICAgICAgICAgU1RBVEVfQ09OU1RSVUNURUQsCiAgICAgICAgIFNUQVRFX0lOX0NPTkZJRywKQEAgLTQ3NSw3ICs0OTMsOCBAQAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZ2V0QnVmZmVyTG9ja2VkKGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAqYnVmZmVyLAogICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c2l6ZV90PiYgc3VyZmFjZV9pZHMgPSBzdGQ6OnZlY3RvcjxzaXplX3Q+KCkpOwogICAgIHZpcnR1YWwgc3RhdHVzX3QgcmV0dXJuQnVmZmVyTG9ja2VkKGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyLAotICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXApOworICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzaXplX3Q+JiBzdXJmYWNlX2lkcyA9IHN0ZDo6dmVjdG9yPHNpemVfdD4oKSk7CiAgICAgdmlydHVhbCBzdGF0dXNfdCBnZXRJbnB1dEJ1ZmZlckxvY2tlZChjYW1lcmEzX3N0cmVhbV9idWZmZXIgKmJ1ZmZlcik7CiAgICAgdmlydHVhbCBzdGF0dXNfdCByZXR1cm5JbnB1dEJ1ZmZlckxvY2tlZCgKICAgICAgICAgICAgIGNvbnN0IGNhbWVyYTNfc3RyZWFtX2J1ZmZlciAmYnVmZmVyKTsKQEAgLTQ5Nyw3ICs1MTYsNyBAQAogICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0QnVmZmVyQ291bnRMb2NrZWQoKSA9IDA7CiAKICAgICAvLyBHZXQgaGFuZG91dCBvdXRwdXQgYnVmZmVyIGNvdW50LgotICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgPSAwOworICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dE91dHB1dEJ1ZmZlckNvdW50TG9ja2VkKCkgY29uc3QgPSAwOwogCiAgICAgLy8gR2V0IGhhbmRvdXQgaW5wdXQgYnVmZmVyIGNvdW50LgogICAgIHZpcnR1YWwgc2l6ZV90ICAgZ2V0SGFuZG91dElucHV0QnVmZmVyQ291bnRMb2NrZWQoKSA9IDA7CkBAIC01MjEsMTQgKzU0MCwxOCBAQAogICAgIHVpbnQ2NF90IG1Vc2FnZTsKIAogICBwcml2YXRlOgorICAgIC8vIFByZXZpb3VzbHkgY29uZmlndXJlZCBzdHJlYW0gcHJvcGVydGllcyAocG9zdCBIQUwgb3ZlcnJpZGUpCiAgICAgdWludDY0X3QgbU9sZFVzYWdlOwogICAgIHVpbnQzMl90IG1PbGRNYXhCdWZmZXJzOworICAgIGludCBtT2xkRm9ybWF0OworICAgIGFuZHJvaWRfZGF0YXNwYWNlIG1PbGREYXRhU3BhY2U7CisKICAgICBDb25kaXRpb24gbU91dHB1dEJ1ZmZlclJldHVybmVkU2lnbmFsOwogICAgIENvbmRpdGlvbiBtSW5wdXRCdWZmZXJSZXR1cm5lZFNpZ25hbDsKICAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrV2FpdEZvckJ1ZmZlckR1cmF0aW9uID0gMzAwMDAwMDAwMExMOyAvLyAzMDAwIG1zCiAKICAgICB2b2lkIGZpcmVCdWZmZXJMaXN0ZW5lcnNMb2NrZWQoY29uc3QgY2FtZXJhM19zdHJlYW1fYnVmZmVyJiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhY3F1aXJlZCwgYm9vbCBvdXRwdXQpOworICAgICAgICAgICAgYm9vbCBhY3F1aXJlZCwgYm9vbCBvdXRwdXQsIG5zZWNzX3QgdGltZXN0YW1wID0gMCwgdWludDY0X3QgZnJhbWVOdW1iZXIgPSAwKTsKICAgICBMaXN0PHdwPENhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lcj4gPiBtQnVmZmVyTGlzdGVuZXJMaXN0OwogCiAgICAgc3RhdHVzX3QgICAgICAgIGNhbmNlbFByZXBhcmVMb2NrZWQoKTsKQEAgLTU1OSwxNSArNTgyLDE2IEBACiAgICAgc3RhdGljIGNvbnN0IGludDMyX3Qga0J1ZmZlckxpbWl0TGF0ZW5jeUJpblNpemUgPSAzMzsgLy9pbiBtcwogICAgIENhbWVyYUxhdGVuY3lIaXN0b2dyYW0gbUJ1ZmZlckxpbWl0TGF0ZW5jeTsKIAotICAgIC8vS2VlcCB0cmFjayBvZiBvcmlnaW5hbCBmb3JtYXQgaW4gY2FzZSBpdCBnZXRzIG92ZXJyaWRkZW4KKyAgICAvL0tlZXAgdHJhY2sgb2Ygb3JpZ2luYWwgZm9ybWF0IHdoZW4gdGhlIHN0cmVhbSBpcyBjcmVhdGVkIGluIGNhc2UgaXQgZ2V0cyBvdmVycmlkZGVuCiAgICAgYm9vbCBtRm9ybWF0T3ZlcnJpZGRlbjsKLSAgICBpbnQgbU9yaWdpbmFsRm9ybWF0OworICAgIGNvbnN0IGludCBtT3JpZ2luYWxGb3JtYXQ7CiAKICAgICAvL0tlZXAgdHJhY2sgb2Ygb3JpZ2luYWwgZGF0YVNwYWNlIGluIGNhc2UgaXQgZ2V0cyBvdmVycmlkZGVuCiAgICAgYm9vbCBtRGF0YVNwYWNlT3ZlcnJpZGRlbjsKICAgICBhbmRyb2lkX2RhdGFzcGFjZSBtT3JpZ2luYWxEYXRhU3BhY2U7CiAKICAgICBTdHJpbmc4IG1QaHlzaWNhbENhbWVyYUlkOworICAgIG5zZWNzX3QgbUxhc3RUaW1lc3RhbXA7CiB9OyAvLyBjbGFzcyBDYW1lcmEzU3RyZWFtCiAKIH07IC8vIG5hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtQnVmZmVyTGlzdGVuZXIuaAppbmRleCAyZGIzMzNkLi5kMGFlZTI3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1CdWZmZXJMaXN0ZW5lci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyLmgKQEAgLTE3LDYgKzE3LDcgQEAKICNpZm5kZWYgQU5EUk9JRF9TRVJWRVJTX0NBTUVSQTNfU1RSRUFNQlVGRkVSTElTVEVORVJfSAogI2RlZmluZSBBTkRST0lEX1NFUlZFUlNfQ0FNRVJBM19TVFJFQU1CVUZGRVJMSVNURU5FUl9ICiAKKyNpbmNsdWRlIDxjYW1lcmEvQ2FtZXJhTWV0YWRhdGEuaD4KICNpbmNsdWRlIDxndWkvU3VyZmFjZS5oPgogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KIApAQCAtNDEsNiArNDIsOSBAQAogICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlckFjcXVpcmVkKGNvbnN0IEJ1ZmZlckluZm8mIGJ1ZmZlckluZm8pID0gMDsKICAgICAvLyBCdWZmZXIgd2FzIHJlbGVhc2VkIGJ5IHRoZSBIQUwKICAgICB2aXJ0dWFsIHZvaWQgb25CdWZmZXJSZWxlYXNlZChjb25zdCBCdWZmZXJJbmZvJiBidWZmZXJJbmZvKSA9IDA7CisgICAgLy8gTm90aWZ5IGFib3V0IGluY29taW5nIGJ1ZmZlciByZXF1ZXN0IGZyYW1lIG51bWJlcgorICAgIHZpcnR1YWwgdm9pZCBvbkJ1ZmZlclJlcXVlc3RGb3JGcmFtZU51bWJlcih1aW50NjRfdCBmcmFtZU51bWJlciwgaW50IHN0cmVhbUlkLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHNldHRpbmdzKSA9IDA7CiB9OwogCiB9OyAvL25hbWVzcGFjZSBjYW1lcmEzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1JbnRlcmZhY2UuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCmluZGV4IGJlNDU0NGMuLjczZjUwMWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbUludGVyZmFjZS5oCkBAIC0xOCw2ICsxOCw4IEBACiAjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkEzX1NUUkVBTV9JTlRFUkZBQ0VfSAogCiAjaW5jbHVkZSA8dXRpbHMvUmVmQmFzZS5oPgorCisjaW5jbHVkZSA8Y2FtZXJhL0NhbWVyYU1ldGFkYXRhLmg+CiAjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbUJ1ZmZlckxpc3RlbmVyLmgiCiAjaW5jbHVkZSAiQ2FtZXJhM1N0cmVhbUJ1ZmZlckZyZWVkTGlzdGVuZXIuaCIKIApAQCAtMjUwLDExICsyNTIsMTkgQEAKICAgICAvKioKICAgICAgKiBSZXR1cm4gYSBidWZmZXIgdG8gdGhlIHN0cmVhbSBhZnRlciB1c2UgYnkgdGhlIEhBTC4KICAgICAgKgorICAgICAqIE11bHRpcGxlIHN1cmZhY2VzIGNvdWxkIHNoYXJlIHRoZSBzYW1lIEhBTCBzdHJlYW0sIGJ1dCBhIHJlcXVlc3QgbWF5CisgICAgICogYmUgb25seSBmb3IgYSBzdWJzZXQgb2Ygc3VyZmFjZXMuIEluIHRoaXMgY2FzZSwgdGhlCisgICAgICogQ2FtZXJhM1N0cmVhbUludGVyZmFjZSBvYmplY3QgbmVlZHMgdGhlIHN1cmZhY2UgSUQgaW5mb3JtYXRpb24gdG8gYXR0YWNoCisgICAgICogYnVmZmVycyBmb3IgdGhvc2Ugc3VyZmFjZXMuIEZvciB0aGUgY2FzZSBvZiBzaW5nbGUgc3VyZmFjZSBmb3IgYSBIQUwKKyAgICAgKiBzdHJlYW0sIHN1cmZhY2VfaWRzIHBhcmFtZXRlciBoYXMgbm8gZWZmZWN0LgorICAgICAqCiAgICAgICogVGhpcyBtZXRob2QgbWF5IG9ubHkgYmUgY2FsbGVkIGZvciBidWZmZXJzIHByb3ZpZGVkIGJ5IGdldEJ1ZmZlcigpLgogICAgICAqIEZvciBiaWRpcmVjdGlvbmFsIHN0cmVhbXMsIHRoaXMgbWV0aG9kIGFwcGxpZXMgdG8gdGhlIG91dHB1dC1zaWRlIGJ1ZmZlcnMKICAgICAgKi8KICAgICB2aXJ0dWFsIHN0YXR1c190IHJldHVybkJ1ZmZlcihjb25zdCBjYW1lcmEzX3N0cmVhbV9idWZmZXIgJmJ1ZmZlciwKLSAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wKSA9IDA7CisgICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgYm9vbCB0aW1lc3RhbXBJbmNyZWFzaW5nID0gdHJ1ZSwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHNpemVfdD4mIHN1cmZhY2VfaWRzID0gc3RkOjp2ZWN0b3I8c2l6ZV90PigpLAorICAgICAgICAgICAgdWludDY0X3QgZnJhbWVOdW1iZXIgPSAwKSA9IDA7CiAKICAgICAvKioKICAgICAgKiBGaWxsIGluIHRoZSBjYW1lcmEzX3N0cmVhbV9idWZmZXIgd2l0aCB0aGUgbmV4dCB2YWxpZCBidWZmZXIgZm9yIHRoaXMKQEAgLTI5MSw2ICszMDEsMTEgQEAKICAgICAgKi8KICAgICB2aXJ0dWFsIGJvb2wgICAgIGhhc091dHN0YW5kaW5nQnVmZmVycygpIGNvbnN0ID0gMDsKIAorICAgIC8qKgorICAgICAqIEdldCBudW1iZXIgb2YgYnVmZmVycyBjdXJyZW50bHkgaGFuZGVkIG91dCB0byBIQUwKKyAgICAgKi8KKyAgICB2aXJ0dWFsIHNpemVfdCAgIGdldE91dHN0YW5kaW5nQnVmZmVyc0NvdW50KCkgY29uc3QgPSAwOworCiAgICAgZW51bSB7CiAgICAgICAgIFRJTUVPVVRfTkVWRVIgPSAtMQogICAgIH07CkBAIC0zMzEsNiArMzQ2LDEyIEBACiAgICAgICogQ2FtZXJhM1N0cmVhbS4KICAgICAgKi8KICAgICB2aXJ0dWFsIHZvaWQgc2V0QnVmZmVyRnJlZWRMaXN0ZW5lcih3cDxDYW1lcmEzU3RyZWFtQnVmZmVyRnJlZWRMaXN0ZW5lcj4gbGlzdGVuZXIpID0gMDsKKworICAgIC8qKgorICAgICAqIE5vdGlmeSBidWZmZXIgc3RyZWFtIGxpc3RlbmVycyBhYm91dCBpbmNvbWluZyByZXF1ZXN0IHdpdGggcGFydGljdWxhciBmcmFtZSBudW1iZXIuCisgICAgICovCisgICAgdmlydHVhbCB2b2lkIGZpcmVCdWZmZXJSZXF1ZXN0Rm9yRnJhbWVOdW1iZXIodWludDY0X3QgZnJhbWVOdW1iZXIsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc2V0dGluZ3MpID0gMDsKIH07CiAKIH0gLy8gbmFtZXNwYWNlIGNhbWVyYTMKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmNwcAppbmRleCBlY2I5ODBhLi4zMDg5MTgxIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuY3BwCkBAIC0xMzksNyArMTM5LDkgQEAKICAgICBtT3V0cHV0U2xvdHMuY2xlYXIoKTsKICAgICBtQ29uc3VtZXJCdWZmZXJDb3VudC5jbGVhcigpOwogCi0gICAgbUNvbnN1bWVyLT5jb25zdW1lckRpc2Nvbm5lY3QoKTsKKyAgICBpZiAobUNvbnN1bWVyLmdldCgpICE9IG51bGxwdHIpIHsKKyAgICAgICAgbUNvbnN1bWVyLT5jb25zdW1lckRpc2Nvbm5lY3QoKTsKKyAgICB9CiAKICAgICBpZiAobUJ1ZmZlcnMuc2l6ZSgpID4gMCkgewogICAgICAgICBTUF9MT0dXKCIlenUgYnVmZmVycyBzdGlsbCBiZWluZyB0cmFja2VkIiwgbUJ1ZmZlcnMuc2l6ZSgpKTsKQEAgLTE1Miw2ICsxNTQsOCBAQAogICAgIFNQX0xPR1YoIiVzOiBEaXNjb25uZWN0ZWQiLCBfX0ZVTkNUSU9OX18pOwogfQogCitDYW1lcmEzU3RyZWFtU3BsaXR0ZXI6OkNhbWVyYTNTdHJlYW1TcGxpdHRlcihib29sIHVzZUhhbEJ1Zk1hbmFnZXIpIDoKKyAgICAgICAgbVVzZUhhbEJ1Zk1hbmFnZXIodXNlSGFsQnVmTWFuYWdlcikge30KIAogQ2FtZXJhM1N0cmVhbVNwbGl0dGVyOjp+Q2FtZXJhM1N0cmVhbVNwbGl0dGVyKCkgewogICAgIGRpc2Nvbm5lY3QoKTsKQEAgLTI0MSw3ICsyNDUsOSBAQAogICAgIHVpbnQ2NF90IHVzYWdlID0gMDsKICAgICByZXMgPSBuYXRpdmVfd2luZG93X2dldF9jb25zdW1lcl91c2FnZShzdGF0aWNfY2FzdDxBTmF0aXZlV2luZG93Kj4ob3V0cHV0UXVldWUuZ2V0KCkpLCAmdXNhZ2UpOwogICAgIGlmICghKHVzYWdlICYgKEdSQUxMT0NfVVNBR0VfSFdfQ09NUE9TRVIgfCBHUkFMTE9DX1VTQUdFX0hXX1RFWFRVUkUpKSkgewotICAgICAgICBvdXRwdXRRdWV1ZS0+c2V0RGVxdWV1ZVRpbWVvdXQoa0RlcXVldWVCdWZmZXJUaW1lb3V0KTsKKyAgICAgICAgbnNlY3NfdCB0aW1lb3V0ID0gbVVzZUhhbEJ1Zk1hbmFnZXIgPworICAgICAgICAgICAgICAgIGtIYWxCdWZNZ3JEZXF1ZXVlQnVmZmVyVGltZW91dCA6IGtOb3JtYWxEZXF1ZXVlQnVmZmVyVGltZW91dDsKKyAgICAgICAgb3V0cHV0UXVldWUtPnNldERlcXVldWVUaW1lb3V0KHRpbWVvdXQpOwogICAgIH0KIAogICAgIHJlcyA9IGdicC0+YWxsb3dBbGxvY2F0aW9uKGZhbHNlKTsKQEAgLTQzNiw4ICs0NDIsOSBAQAogICAgICAgICByZXMgPSBnYnAtPmF0dGFjaEJ1ZmZlcigmc2xvdCwgZ2IpOwogICAgICAgICBtTXV0ZXgubG9jaygpOwogICAgICAgICBpZiAocmVzICE9IE9LKSB7Ci0gICAgICAgICAgICBTUF9MT0dFKCIlczogQ2Fubm90IGFjcXVpcmVCdWZmZXIgZnJvbSBHcmFwaGljQnVmZmVyUHJvZHVjZXIgJXA6ICVzICglZCkiLAorICAgICAgICAgICAgU1BfTE9HRSgiJXM6IENhbm5vdCBhdHRhY2hCdWZmZXIgZnJvbSBHcmFwaGljQnVmZmVyUHJvZHVjZXIgJXA6ICVzICglZCkiLAogICAgICAgICAgICAgICAgICAgICBfX0ZVTkNUSU9OX18sIGdicC5nZXQoKSwgc3RyZXJyb3IoLXJlcyksIHJlcyk7CisgICAgICAgICAgICAvLyBUT0RPOiBtaWdodCBuZWVkIHRvIGRldGFjaC9jbGVhbnVwIHRoZSBhbHJlYWR5IGF0dGFjaGVkIGJ1ZmZlcnMgYmVmb3JlIHJldHVybj8KICAgICAgICAgICAgIHJldHVybiByZXM7CiAgICAgICAgIH0KICAgICAgICAgaWYgKChzbG90IDwgMCkgfHwgKHNsb3QgPiBCdWZmZXJRdWV1ZTo6TlVNX0JVRkZFUl9TTE9UUykpIHsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0NhbWVyYTNTdHJlYW1TcGxpdHRlci5oCmluZGV4IDFlYWYyYmQuLjk2MGY3YWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvQ2FtZXJhM1N0cmVhbVNwbGl0dGVyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9DYW1lcmEzU3RyZWFtU3BsaXR0ZXIuaApAQCAtNDksNyArNDksNyBAQAogcHVibGljOgogCiAgICAgLy8gQ29uc3RydWN0b3IKLSAgICBDYW1lcmEzU3RyZWFtU3BsaXR0ZXIoKSA9IGRlZmF1bHQ7CisgICAgQ2FtZXJhM1N0cmVhbVNwbGl0dGVyKGJvb2wgdXNlSGFsQnVmTWFuYWdlciA9IGZhbHNlKTsKIAogICAgIC8vIENvbm5lY3QgdG8gdGhlIHN0cmVhbSBzcGxpdHRlciBieSBjcmVhdGluZyBidWZmZXIgcXVldWUgYW5kIGNvbm5lY3RpbmcgaXQKICAgICAvLyB3aXRoIG91dHB1dCBzdXJmYWNlcy4KQEAgLTIyNiw3ICsyMjYsMTAgQEAKICAgICBhbmRyb2lkOjpQaXhlbEZvcm1hdCBtRm9ybWF0ID0gYW5kcm9pZDo6UElYRUxfRk9STUFUX05PTkU7CiAgICAgdWludDY0X3QgbVByb2R1Y2VyVXNhZ2UgPSAwOwogCi0gICAgc3RhdGljIGNvbnN0IG5zZWNzX3Qga0RlcXVldWVCdWZmZXJUaW1lb3V0ICAgPSBzMm5zKDEpOyAvLyAxIHNlYworICAgIC8vIFRoZSBhdHRhY2hCdWZmZXIgY2FsbCB3aWxsIGhhcHBlbiBvbiBkaWZmZXJlbnQgdGhyZWFkIGFjY29yZGluZyB0byBtVXNlSGFsQnVmTWFuYWdlciBhbmQgaGF2ZQorICAgIC8vIGRpZmZlcmVudCB0aW1pbmcgY29uc3RyYWludC4KKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrTm9ybWFsRGVxdWV1ZUJ1ZmZlclRpbWVvdXQgICAgPSBzMm5zKDEpOyAgLy8gMSBzZWMKKyAgICBzdGF0aWMgY29uc3QgbnNlY3NfdCBrSGFsQnVmTWdyRGVxdWV1ZUJ1ZmZlclRpbWVvdXQgPSBtczJucygxKTsgLy8gMSBtc2VjCiAKICAgICBNdXRleCBtTXV0ZXg7CiAKQEAgLTI3Myw2ICsyNzYsOCBAQAogICAgIHNpemVfdCBtQWNxdWlyZWRJbnB1dEJ1ZmZlcnM7CiAKICAgICBTdHJpbmc4IG1Db25zdW1lck5hbWU7CisKKyAgICBjb25zdCBib29sIG1Vc2VIYWxCdWZNYW5hZ2VyOwogfTsKIAogfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2RldmljZTMvRGlzdG9ydGlvbk1hcHBlci5jcHAKaW5kZXggNGRhZmVmZC4uYWU3YWY4ZSAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvZGV2aWNlMy9EaXN0b3J0aW9uTWFwcGVyLmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9kZXZpY2UzL0Rpc3RvcnRpb25NYXBwZXIuY3BwCkBAIC0zMTIsOCArMzEyLDggQEAKICAgICAgICAgaW50MzJfdCBjb29yZHNbNF0gPSB7CiAgICAgICAgICAgICByZWN0c1tpXSwKICAgICAgICAgICAgIHJlY3RzW2kgKyAxXSwKLSAgICAgICAgICAgIHJlY3RzW2ldICsgcmVjdHNbaSArIDJdLAotICAgICAgICAgICAgcmVjdHNbaSArIDFdICsgcmVjdHNbaSArIDNdCisgICAgICAgICAgICByZWN0c1tpXSArIHJlY3RzW2kgKyAyXSAtIDEsCisgICAgICAgICAgICByZWN0c1tpICsgMV0gKyByZWN0c1tpICsgM10gLSAxCiAgICAgICAgIH07CiAKICAgICAgICAgbWFwUmF3VG9Db3JyZWN0ZWQoY29vcmRzLCAyLCBjbGFtcCwgc2ltcGxlKTsKQEAgLTMyMSw4ICszMjEsOCBAQAogICAgICAgICAvLyBNYXAgYmFjayB0byAobCwgdCwgd2lkdGgsIGhlaWdodCkKICAgICAgICAgcmVjdHNbaV0gPSBjb29yZHNbMF07CiAgICAgICAgIHJlY3RzW2kgKyAxXSA9IGNvb3Jkc1sxXTsKLSAgICAgICAgcmVjdHNbaSArIDJdID0gY29vcmRzWzJdIC0gY29vcmRzWzBdOwotICAgICAgICByZWN0c1tpICsgM10gPSBjb29yZHNbM10gLSBjb29yZHNbMV07CisgICAgICAgIHJlY3RzW2kgKyAyXSA9IGNvb3Jkc1syXSAtIGNvb3Jkc1swXSArIDE7CisgICAgICAgIHJlY3RzW2kgKyAzXSA9IGNvb3Jkc1szXSAtIGNvb3Jkc1sxXSArIDE7CiAgICAgfQogCiAgICAgcmV0dXJuIE9LOwpAQCAtNDAwLDggKzQwMCw4IEBACiAgICAgICAgIGludDMyX3QgY29vcmRzWzRdID0gewogICAgICAgICAgICAgcmVjdHNbaV0sCiAgICAgICAgICAgICByZWN0c1tpICsgMV0sCi0gICAgICAgICAgICByZWN0c1tpXSArIHJlY3RzW2kgKyAyXSwKLSAgICAgICAgICAgIHJlY3RzW2kgKyAxXSArIHJlY3RzW2kgKyAzXQorICAgICAgICAgICAgcmVjdHNbaV0gKyByZWN0c1tpICsgMl0gLSAxLAorICAgICAgICAgICAgcmVjdHNbaSArIDFdICsgcmVjdHNbaSArIDNdIC0gMQogICAgICAgICB9OwogCiAgICAgICAgIG1hcENvcnJlY3RlZFRvUmF3KGNvb3JkcywgMiwgY2xhbXAsIHNpbXBsZSk7CkBAIC00MDksOCArNDA5LDggQEAKICAgICAgICAgLy8gTWFwIGJhY2sgdG8gKGwsIHQsIHdpZHRoLCBoZWlnaHQpCiAgICAgICAgIHJlY3RzW2ldID0gY29vcmRzWzBdOwogICAgICAgICByZWN0c1tpICsgMV0gPSBjb29yZHNbMV07Ci0gICAgICAgIHJlY3RzW2kgKyAyXSA9IGNvb3Jkc1syXSAtIGNvb3Jkc1swXTsKLSAgICAgICAgcmVjdHNbaSArIDNdID0gY29vcmRzWzNdIC0gY29vcmRzWzFdOworICAgICAgICByZWN0c1tpICsgMl0gPSBjb29yZHNbMl0gLSBjb29yZHNbMF0gKyAxOworICAgICAgICByZWN0c1tpICsgM10gPSBjb29yZHNbM10gLSBjb29yZHNbMV0gKyAxOwogICAgIH0KIAogICAgIHJldHVybiBPSzsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwNjM1MDYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuY3BwCkBAIC0wLDAgKzEsMjA1IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKyNpbmNsdWRlIDxoYXJkd2FyZS9jYW1lcmEuaD4KKworI2luY2x1ZGUgPGhpZGwvQWlkbENhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGhpZGwvQ29udmVydC5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2UgZGV2aWNlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIEhDYXB0dXJlUmVzdWx0RXh0cmFzID0gYW5kcm9pZDo6ZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpDYXB0dXJlUmVzdWx0RXh0cmFzOwordXNpbmcgSFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gPSBhbmRyb2lkOjpmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87Cit1c2luZyBIQ2FtZXJhTWV0YWRhdGEgPSBhbmRyb2lkOjpmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhbWVyYU1ldGFkYXRhOworCitjb25zdCBjaGFyICpIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6OmtSZXN1bHRLZXkgPSAiQ2FwdHVyZVJlc3VsdCI7CisKK0gyQkNhbWVyYURldmljZUNhbGxiYWNrczo6SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzKGNvbnN0IHNwPEhhbEludGVyZmFjZT4mIGJhc2UpIDogQ0Jhc2UoYmFzZSkgeyB9CisKK2Jvb2wgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjppbml0aWFsaXplTG9vcGVyKCkgeworICAgIG1DYkxvb3BlciA9IG5ldyBBTG9vcGVyOworICAgIG1DYkxvb3Blci0+c2V0TmFtZSgiY3MtbG9vcGVyIik7CisgICAgc3RhdHVzX3QgZXJyID0gbUNiTG9vcGVyLT5zdGFydCgvKnJ1bk9uQ2FsbGluZ1RocmVhZCovIGZhbHNlLCAvKmNhbkNhbGxKYXZhKi8gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUklPUklUWV9ERUZBVUxUKTsKKyAgICBpZiAoZXJyICE9T0spIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBzdGFydCBjYW1lcmEgZGV2aWNlIGNhbGxiYWNrIGxvb3BlciIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1IYW5kbGVyID0gbmV3IENhbGxiYWNrSGFuZGxlcih0aGlzKTsKKyAgICBtQ2JMb29wZXItPnJlZ2lzdGVySGFuZGxlcihtSGFuZGxlcik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK0gyQkNhbWVyYURldmljZUNhbGxiYWNrczo6fkgyQkNhbWVyYURldmljZUNhbGxiYWNrcygpIHsKKyAgICBpZiAobUNiTG9vcGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgaWYgKG1IYW5kbGVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgICAgIG1DYkxvb3Blci0+dW5yZWdpc3RlckhhbmRsZXIobUhhbmRsZXItPmlkKCkpOworICAgICAgICB9CisgICAgICAgIG1DYkxvb3Blci0+c3RvcCgpOworICAgIH0KKyAgICBtQ2JMb29wZXIuY2xlYXIoKTsKKyAgICBtSGFuZGxlci5jbGVhcigpOworfQorCitiaW5kZXI6OlN0YXR1cyBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M6Om9uRGV2aWNlRXJyb3IoCisgICAgaW50MzJfdCBlcnJvckNvZGUsIGNvbnN0IENhcHR1cmVSZXN1bHRFeHRyYXMmIHJlc3VsdEV4dHJhcykgeworICAgIHVzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbDsKKyAgICBIQ2FwdHVyZVJlc3VsdEV4dHJhcyBoQ2FwdHVyZVJlc3VsdEV4dHJhcyA9IGNvbnZlcnRUb0hpZGwocmVzdWx0RXh0cmFzKTsKKyAgICBhdXRvIHJldCA9IG1CYXNlLT5vbkRldmljZUVycm9yKGNvbnZlcnRUb0hpZGwoZXJyb3JDb2RlKSwgaENhcHR1cmVSZXN1bHRFeHRyYXMpOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXMgT25EZXZpY2VFcnJvciBjYWxsYmFjayBmYWlsZWQgZHVlIHRvICVzIixfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6b25EZXZpY2VJZGxlKCkgeworICAgIGF1dG8gcmV0ID0gbUJhc2UtPm9uRGV2aWNlSWRsZSgpOworICAgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgICAgIEFMT0dFKCIlcyBPbkRldmljZUlkbGUgY2FsbGJhY2sgZmFpbGVkIGR1ZSB0byAlcyIsX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6b25DYXB0dXJlU3RhcnRlZCgKKyAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsIGludDY0X3QgdGltZXN0YW1wKSB7CisgICAgdXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsOworICAgIEhDYXB0dXJlUmVzdWx0RXh0cmFzIGhDYXB0dXJlUmVzdWx0RXh0cmFzID0gY29udmVydFRvSGlkbChyZXN1bHRFeHRyYXMpOworICAgIGF1dG8gcmV0ID0gbUJhc2UtPm9uQ2FwdHVyZVN0YXJ0ZWQoaENhcHR1cmVSZXN1bHRFeHRyYXMsIHRpbWVzdGFtcCk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlcyBPbkNhcHR1cmVDYWxsYmFjayBmYWlsZWQgZHVlIHRvICVzIixfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK3ZvaWQgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpjb252ZXJ0UmVzdWx0TWV0YWRhdGFUb0hpZGwoY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKnJhd01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGbXFTaXplT3JNZXRhZGF0YSAqaFJlc3VsdE1ldGFkYXRhKSB7CisgICAgLy8gRmlyc3QgdHJ5IHdyaXRpbmcgdG8gZm1xLgorICAgIHNpemVfdCBtZXRhZGF0YV9zaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJhd01ldGFkYXRhKTsKKyAgICBpZiAoKG1ldGFkYXRhX3NpemUgPiAwKSAmJgorICAgICAgICAobUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLT5hdmFpbGFibGVUb1dyaXRlKCkgPiAwKSkgeworICAgICAgICBpZiAobUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlLT53cml0ZSgodWludDhfdCAqKXJhd01ldGFkYXRhLCBtZXRhZGF0YV9zaXplKSkgeworICAgICAgICAgICAgaFJlc3VsdE1ldGFkYXRhLT5mbXFNZXRhZGF0YVNpemUobWV0YWRhdGFfc2l6ZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HVygiJXMgQ291bGRuJ3QgdXNlIGZtcSwgZmFsbGluZyBiYWNrIHRvIGh3YmluZGVyIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIEhDYW1lcmFNZXRhZGF0YSBtZXRhZGF0YTsKKyAgICAgICAgICAgIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbChyYXdNZXRhZGF0YSwgJm1ldGFkYXRhKTsKKyAgICAgICAgICAgIGhSZXN1bHRNZXRhZGF0YS0+bWV0YWRhdGEoc3RkOjptb3ZlKG1ldGFkYXRhKSk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpDYWxsYmFja0hhbmRsZXI6Om9uTWVzc2FnZVJlY2VpdmVkKGNvbnN0IHNwPEFNZXNzYWdlPiAmbXNnKSB7CisgICAgc3A8UmVmQmFzZT4gb2JqID0gbnVsbHB0cjsKKyAgICBzcDxSZXN1bHRXcmFwcGVyPiByZXN1bHRXcmFwcGVyID0gbnVsbHB0cjsKKyAgICBib29sIGZvdW5kID0gZmFsc2U7CisgICAgc3dpdGNoIChtc2ctPndoYXQoKSkgeworICAgICAgICBjYXNlIGtXaGF0UmVzdWx0UmVjZWl2ZWQ6CisgICAgICAgICAgICBmb3VuZCA9IG1zZy0+ZmluZE9iamVjdChrUmVzdWx0S2V5LCAmb2JqKTsKKyAgICAgICAgICAgIGlmICghZm91bmQgfHwgb2JqID09IG51bGxwdHIpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiQ2Fubm90IGZpbmQgcmVzdWx0IG9iamVjdCBpbiBjYWxsYmFjayBtZXNzYWdlIik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVzdWx0V3JhcHBlciA9IHN0YXRpY19jYXN0PFJlc3VsdFdyYXBwZXIgKj4ob2JqLmdldCgpKTsKKyAgICAgICAgICAgIHByb2Nlc3NSZXN1bHRNZXNzYWdlKHJlc3VsdFdyYXBwZXIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBBTE9HRSgiVW5rbm93biBjYWxsYmFjayBzZW50Iik7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6Q2FsbGJhY2tIYW5kbGVyOjpwcm9jZXNzUmVzdWx0TWVzc2FnZSgKKyAgICBzcDxSZXN1bHRXcmFwcGVyPiAmcmVzdWx0V3JhcHBlcikgeworICAgIHNwPEgyQkNhbWVyYURldmljZUNhbGxiYWNrcz4gY29udmVydGVyID0gbUNvbnZlcnRlci5wcm9tb3RlKCk7CisgICAgaWYgKGNvbnZlcnRlciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCJDYWxsYmFjayB3cmFwcGVyIGhhcyBkaWVkLCByZXN1bHQgY2FsbGJhY2sgY2Fubm90IGJlIG1hZGUiKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBDYW1lcmFNZXRhZGF0YU5hdGl2ZSAmcmVzdWx0ID0gcmVzdWx0V3JhcHBlci0+bVJlc3VsdDsKKyAgICBhdXRvIHJlc3VsdEV4dHJhcyA9IHJlc3VsdFdyYXBwZXItPm1SZXN1bHRFeHRyYXM7CisgICAgSENhcHR1cmVSZXN1bHRFeHRyYXMgaFJlc3VsdEV4dHJhcyA9CisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGwocmVzdWx0RXh0cmFzKTsKKworICAgIC8vIENvbnZlcnQgTWV0YWRhdGEgaW50byBIQ2FtZXJhTWV0YWRhdGE7CisgICAgRm1xU2l6ZU9yTWV0YWRhdGEgaFJlc3VsdDsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3TWV0YWRhdGEgPSByZXN1bHQuZ2V0QW5kTG9jaygpOworICAgIGNvbnZlcnRlci0+Y29udmVydFJlc3VsdE1ldGFkYXRhVG9IaWRsKHJhd01ldGFkYXRhLCAmaFJlc3VsdCk7CisgICAgcmVzdWx0LnVubG9jayhyYXdNZXRhZGF0YSk7CisgICAgYXV0byAmcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MgPSByZXN1bHRXcmFwcGVyLT5tUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3M7CisgICAgaGlkbF92ZWM8SFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcyA9CisgICAgICAgICAgICBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGwoCisgICAgICAgICAgICAgICAgICAgIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zLCBjb252ZXJ0ZXItPm1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSk7CisgICAgYXV0byByZXQgPSBjb252ZXJ0ZXItPm1CYXNlLT5vblJlc3VsdFJlY2VpdmVkKGhSZXN1bHQsIGhSZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcyk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgICAgQUxPR0UoIiVzIE9uUmVzdWx0UmVjZWl2ZWQgY2FsbGJhY2sgZmFpbGVkIGR1ZSB0byAlcyIsX19GVU5DVElPTl9fLAorICAgICAgICAgICAgICAgIHJldC5kZXNjcmlwdGlvbigpLmNfc3RyKCkpOworICAgIH0KK30KKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpvblJlc3VsdFJlY2VpdmVkKAorICAgIGNvbnN0IENhbWVyYU1ldGFkYXRhTmF0aXZlJiByZXN1bHQsCisgICAgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgIGNvbnN0IDo6c3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4mIHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zKSB7CisgICAgLy8gV3JhcCBDYW1lcmFNZXRhZGF0YSwgcmVzdWx0RXh0cmFzIGFuZCBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcyBpbiBvbgorICAgIC8vIHNwPFJlZkJhc2U+LWFibGUgc3RydWN0dXJlIGFuZCBwb3N0IGl0LgorICAgIHNwPFJlc3VsdFdyYXBwZXI+IHJlc3VsdFdyYXBwZXIgPSBuZXcgUmVzdWx0V3JhcHBlcihjb25zdF9jYXN0PENhbWVyYU1ldGFkYXRhTmF0aXZlICY+KHJlc3VsdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdEV4dHJhcywgcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpOworICAgIHNwPEFNZXNzYWdlPiBtc2cgPSBuZXcgQU1lc3NhZ2Uoa1doYXRSZXN1bHRSZWNlaXZlZCwgbUhhbmRsZXIpOworICAgIG1zZy0+c2V0T2JqZWN0KGtSZXN1bHRLZXksIHJlc3VsdFdyYXBwZXIpOworICAgIG1zZy0+cG9zdCgpOworICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpvblByZXBhcmVkKGludDMyX3Qgc3RyZWFtSWQpIHsKKyAgICAvLyBub3QgaW1wbGVtZW50ZWQKKyAgICAvLyBUbyBzaWxlbmNlIFd1bnVzZWQtcGFyYW1ldGVyLgorICAgICh2b2lkKSBzdHJlYW1JZDsKKyAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKK2JpbmRlcjo6U3RhdHVzIEgyQkNhbWVyYURldmljZUNhbGxiYWNrczo6b25SZXBlYXRpbmdSZXF1ZXN0RXJyb3IoCisgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIsCisgICAgaW50MzJfdCByZXBlYXRpbmdSZXF1ZXN0SWQpIHsKKyAgICBhdXRvIHJldCA9CisgICAgICAgIG1CYXNlLT5vblJlcGVhdGluZ1JlcXVlc3RFcnJvcihsYXN0RnJhbWVOdW1iZXIsIHJlcGVhdGluZ1JlcXVlc3RJZCk7CisgICAgaWYgKCFyZXQuaXNPaygpKSB7CisgICAgICAgIEFMT0dFKCIlcyBPblJlcGVhdGluZ1JlcXVlc3RFcm9yIGNhbGxiYWNrIGZhaWxlZCBkdWUgdG8gJXMiLF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgcmV0LmRlc2NyaXB0aW9uKCkuY19zdHIoKSk7CisgICAgfQorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpvblJlcXVlc3RRdWV1ZUVtcHR5KCkgeworICAgIC8vIG5vdCBpbXBsZW1lbnRlZAorICAgIHJldHVybiBiaW5kZXI6OlN0YXR1czo6b2soKTsKK30KKworfSAvLyBpbXBsZW1lbnRhdGlvbgorfSAvLyBWMl8wCit9IC8vIGRldmljZQorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmY1MjBhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRlJBTUVXT1JLU19BSURMX0NBTUVSQURFVklDRUNBTExCQUNLU19ICisjZGVmaW5lIEFORFJPSURfRlJBTUVXT1JLU19BSURMX0NBTUVSQURFVklDRUNBTExCQUNLU19ICisKKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDx0aHJlYWQ+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9jb21tb24vMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL0lDYW1lcmFEZXZpY2VDYWxsYmFjay5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvQm5DYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FMb29wZXIuaD4KKyNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9mb3VuZGF0aW9uL0FIYW5kbGVyLmg+CisjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvZm91bmRhdGlvbi9BTWVzc2FnZS5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisjaW5jbHVkZSA8Q2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGhpZGwvQ2FtZXJhSHlicmlkSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBkZXZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgY2FtZXJhaHlicmlkOjpIMkJDb252ZXJ0ZXI7Cit1c2luZyBIQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgPSBjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VDYWxsYmFjazsKK3VzaW5nIEhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvID0gY2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOwordXNpbmcgYW5kcm9pZDo6ZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpGbXFTaXplT3JNZXRhZGF0YTsKKwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OkJuQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpDYW1lcmFNZXRhZGF0YU5hdGl2ZTsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOwordXNpbmcgaGFyZHdhcmU6OmtTeW5jaHJvbml6ZWRSZWFkV3JpdGU7Cit1c2luZyBoYXJkd2FyZTo6TWVzc2FnZVF1ZXVlOwordXNpbmcgQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPSBNZXNzYWdlUXVldWU8dWludDhfdCwga1N5bmNocm9uaXplZFJlYWRXcml0ZT47CisKK3N0cnVjdCBIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MgOgorICAgIHB1YmxpYyBIMkJDb252ZXJ0ZXI8SENhbWVyYURldmljZUNhbGxiYWNrLCBJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLCBCbkNhbWVyYURldmljZUNhbGxiYWNrcz4geworICAgIEgyQkNhbWVyYURldmljZUNhbGxiYWNrcyhjb25zdCBzcDxIYWxJbnRlcmZhY2U+JiBiYXNlKTsKKworICAgIH5IMkJDYW1lcmFEZXZpY2VDYWxsYmFja3MoKTsKKworICAgIGJvb2wgaW5pdGlhbGl6ZUxvb3BlcigpOworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvbkRldmljZUVycm9yKGludDMyX3QgZXJyb3JDb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvbkRldmljZUlkbGUoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25DYXB0dXJlU3RhcnRlZChjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzJiByZXN1bHRFeHRyYXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdGltZXN0YW1wKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25SZXN1bHRSZWNlaXZlZCgKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGFOYXRpdmUmIHJlc3VsdCwgY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyYgcmVzdWx0RXh0cmFzLAorICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiYgcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblByZXBhcmVkKGludDMyX3Qgc3RyZWFtSWQpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBiaW5kZXI6OlN0YXR1cyBvblJlcGVhdGluZ1JlcXVlc3RFcnJvcihpbnQ2NF90IGxhc3RGcmFtZU51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgcmVwZWF0aW5nUmVxdWVzdElkKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25SZXF1ZXN0UXVldWVFbXB0eSgpIG92ZXJyaWRlOworCisgICAgdm9pZCBzZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZShzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+IG1ldGFkYXRhUXVldWUpIHsKKyAgICAgICAgbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gbWV0YWRhdGFRdWV1ZTsKKyAgICB9CisKKyBwcml2YXRlOgorICAgIC8vIFdyYXBwZXIgc3RydWN0IHNvIHRoYXQgcGFyYW1ldGVycyB0byBvblJlc3VsdFJlY2VpdmVkIGNhbGxiYWNrIG1heSBiZQorICAgIC8vIHNlbnQgdGhyb3VnaCBhbiBBTWVzc2FnZS4KKyAgICBzdHJ1Y3QgUmVzdWx0V3JhcHBlciA6IHB1YmxpYyBSZWZCYXNlIHsKKyAgICAgICAgQ2FtZXJhTWV0YWRhdGFOYXRpdmUgbVJlc3VsdDsKKyAgICAgICAgQ2FwdHVyZVJlc3VsdEV4dHJhcyBtUmVzdWx0RXh0cmFzOworICAgICAgICBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiBtUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3M7CisgICAgICAgIFJlc3VsdFdyYXBwZXIoQ2FtZXJhTWV0YWRhdGFOYXRpdmUgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzIHJlc3VsdEV4dHJhcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiAmcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpIDoKKyAgICAgIC8vIFRPRE86IG1ha2UgdGhpcyBzdGQ6Om1vdmFibGUKKyAgICAgIG1SZXN1bHQocmVzdWx0KSwgbVJlc3VsdEV4dHJhcyhyZXN1bHRFeHRyYXMpLCBtUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MocGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpIHsgfQorICAgIH07CisKKyAgICBzdHJ1Y3QgQ2FsbGJhY2tIYW5kbGVyIDogcHVibGljIEFIYW5kbGVyIHsKKyAgICAgICAgcHVibGljOgorICAgICAgICAgICAgdm9pZCBvbk1lc3NhZ2VSZWNlaXZlZChjb25zdCBzcDxBTWVzc2FnZT4gJm1zZykgb3ZlcnJpZGU7CisgICAgICAgICAgICBDYWxsYmFja0hhbmRsZXIoSDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzICpjb252ZXJ0ZXIpIDogbUNvbnZlcnRlcihjb252ZXJ0ZXIpIHsgfQorICAgICAgICBwcml2YXRlOgorICAgICAgICAgICAgdm9pZCBwcm9jZXNzUmVzdWx0TWVzc2FnZShzcDxSZXN1bHRXcmFwcGVyPiAmcmVzdWx0V3JhcHBlcik7CisgICAgICAgICAgICB3cDxIMkJDYW1lcmFEZXZpY2VDYWxsYmFja3M+IG1Db252ZXJ0ZXIgPSBudWxscHRyOworICAgICAgICAgICAgTXV0ZXggbU1ldGFkYXRhUXVldWVMb2NrOworICAgIH07CisKKyAgICB2b2lkIGNvbnZlcnRSZXN1bHRNZXRhZGF0YVRvSGlkbChjb25zdCBjYW1lcmFfbWV0YWRhdGEgKnJhd01ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZtcVNpemVPck1ldGFkYXRhICpyZXN1bHRNZXRhZGF0YSk7CisgICAgZW51bSB7CisgICAgICAgIGtXaGF0UmVzdWx0UmVjZWl2ZWQsCisgICAgfTsKKworICAgIHN0YXRpYyBjb25zdCBjaGFyICprUmVzdWx0S2V5OworCisgICAgc3RkOjpzaGFyZWRfcHRyPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPiBtQ2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUgPSBudWxscHRyOworICAgIHNwPENhbGxiYWNrSGFuZGxlcj4gbUhhbmRsZXIgPSBudWxscHRyOworICAgIHNwPEFMb29wZXI+IG1DYkxvb3BlciA9IG51bGxwdHI7Cit9OworCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gZGV2aWNlCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gZnJhbWV3b3JrcworfSAvLyBhbmRyb2lkCisjZW5kaWYgLy8gQU5EUk9JRF9GUkFNRVdPUktTX0FJRExfQ0FNRVJBREVWSUNFQ0FMTEJBQ0tTX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExMGVmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuY3BwCkBAIC0wLDAgKzEsNTQgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aGlkbC9BaWRsQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+CisjaW5jbHVkZSA8aGlkbC9Db252ZXJ0Lmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBzZXJ2aWNlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6Y29udmVydFRvSGlkbENhbWVyYURldmljZVN0YXR1czsKKworYmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpvblN0YXR1c0NoYW5nZWQoCisgICAgaW50MzJfdCBzdGF0dXMsIGNvbnN0IDo6YW5kcm9pZDo6U3RyaW5nMTYmIGNhbWVyYUlkKSB7CisgIEhDYW1lcmFEZXZpY2VTdGF0dXMgaENhbWVyYURldmljZVN0YXR1cyA9IGNvbnZlcnRUb0hpZGxDYW1lcmFEZXZpY2VTdGF0dXMoc3RhdHVzKTsKKyAgQ2FtZXJhU3RhdHVzQW5kSWQgY2FtZXJhU3RhdHVzQW5kSWQ7CisgIGNhbWVyYVN0YXR1c0FuZElkLmRldmljZVN0YXR1cyA9IGhDYW1lcmFEZXZpY2VTdGF0dXM7CisgIGNhbWVyYVN0YXR1c0FuZElkLmNhbWVyYUlkID0gU3RyaW5nOChjYW1lcmFJZCkuc3RyaW5nKCk7CisgIGF1dG8gcmV0ID0gbUJhc2UtPm9uU3RhdHVzQ2hhbmdlZChjYW1lcmFTdGF0dXNBbmRJZCk7CisgIGlmICghcmV0LmlzT2soKSkgeworICAgICAgQUxPR0UoIiVzIE9uU3RhdHVzQ2hhbmdlZCBjYWxsYmFjayBmYWlsZWQgZHVlIHRvICVzIixfX0ZVTkNUSU9OX18sCisgICAgICAgICAgICByZXQuZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgfQorICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Cit9CisKKzo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgSDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpvblRvcmNoU3RhdHVzQ2hhbmdlZCgKKyAgICBpbnQzMl90LCBjb25zdCA6OmFuZHJvaWQ6OlN0cmluZzE2JikgeworICAvLyBXZSBkb24ndCBpbXBsZW1lbnQgb25Ub3JjaFN0YXR1c0NoYW5nZWQKKyAgcmV0dXJuIGJpbmRlcjo6U3RhdHVzOjpvaygpOworfQorCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gY29tbW9uCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gZnJhbWV3b3JrcworfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQWlkbENhbWVyYVNlcnZpY2VMaXN0ZW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmNmJlNzkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaApAQCAtMCwwICsxLDY0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHRocmVhZD4KKworI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2NvbW1vbi8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvQm5DYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0JwQ2FtZXJhU2VydmljZUxpc3RlbmVyLmg+CisKKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorI2luY2x1ZGUgPGhpZGwvQ2FtZXJhSHlicmlkSW50ZXJmYWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBzZXJ2aWNlIHsKK25hbWVzcGFjZSBWMl8wIHsKK25hbWVzcGFjZSBpbXBsZW1lbnRhdGlvbiB7CisKK3VzaW5nIGhhcmR3YXJlOjpCbkNhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKK3VzaW5nIGhhcmR3YXJlOjpCcENhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKK3VzaW5nIGNhbWVyYWh5YnJpZDo6SDJCQ29udmVydGVyOwordXNpbmcgSENhbWVyYURldmljZVN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYURldmljZVN0YXR1czsKK3R5cGVkZWYgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lciBIQ2FtZXJhU2VydmljZUxpc3RlbmVyOworCitzdHJ1Y3QgSDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyIDoKKyAgICBwdWJsaWMgSDJCQ29udmVydGVyPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXIsIElDYW1lcmFTZXJ2aWNlTGlzdGVuZXIsIEJuQ2FtZXJhU2VydmljZUxpc3RlbmVyPiB7CisgICAgSDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyKGNvbnN0IHNwPEhhbEludGVyZmFjZT4mIGJhc2UpIDogQ0Jhc2UoYmFzZSkgeyB9CisKKyAgICB+SDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyKCkgeyB9CisKKyAgICB2aXJ0dWFsIDo6YW5kcm9pZDo6YmluZGVyOjpTdGF0dXMgb25TdGF0dXNDaGFuZ2VkKGludDMyX3Qgc3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgY2FtZXJhSWQpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmJpbmRlcjo6U3RhdHVzIG9uVG9yY2hTdGF0dXNDaGFuZ2VkKAorICAgICAgICBpbnQzMl90IHN0YXR1cywgY29uc3QgOjphbmRyb2lkOjpTdHJpbmcxNiYgY2FtZXJhSWQpIG92ZXJyaWRlOworICAgIHZpcnR1YWwgYmluZGVyOjpTdGF0dXMgb25DYW1lcmFBY2Nlc3NQcmlvcml0aWVzQ2hhbmdlZCgpIHsKKyAgICAgICAgLy8gVE9ETzogbm8gaW1wbGVtZW50YXRpb24geWV0LgorICAgICAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7CisgICAgfQorfTsKKworfSAvLyBpbXBsZW1lbnRhdGlvbgorfSAvLyBWMl8wCit9IC8vIHNlcnZpY2UKK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBmcmFtZXdvcmtzCit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ2FtZXJhSHlicmlkSW50ZXJmYWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NhbWVyYUh5YnJpZEludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhZjAxMTIKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NhbWVyYUh5YnJpZEludGVyZmFjZS5oCkBAIC0wLDAgKzEsMTM4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0NBTUVSQV9IWUJSSURJTlRFUkZBQ0VfSAorI2RlZmluZSBBTkRST0lEX0NBTUVSQV9IWUJSSURJTlRFUkZBQ0VfSAorCisjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG11dGV4PgorCisjaW5jbHVkZSA8YmluZGVyL1BhcmNlbC5oPgorI2luY2x1ZGUgPGhpZGwvSGlkbFN1cHBvcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYWh5YnJpZCB7Cit0eXBlZGVmIDo6YW5kcm9pZDo6aGlkbDo6YmFzZTo6VjFfMDo6SUJhc2UgSEludGVyZmFjZTsKKwordGVtcGxhdGUgPAorICAgICAgICB0eXBlbmFtZSBISU5URVJGQUNFLAorICAgICAgICB0eXBlbmFtZSBJTlRFUkZBQ0UsCisgICAgICAgIHR5cGVuYW1lIEJOSU5URVJGQUNFID4KK2NsYXNzIEgyQkNvbnZlcnRlciA6IHB1YmxpYyBCTklOVEVSRkFDRSB7CitwdWJsaWM6CisgICAgdHlwZWRlZiBIMkJDb252ZXJ0ZXI8SElOVEVSRkFDRSwgSU5URVJGQUNFLCBCTklOVEVSRkFDRT4gQ0Jhc2U7IC8vIENvbnZlcnRlciBCYXNlCisgICAgdHlwZWRlZiBJTlRFUkZBQ0UgQmFzZUludGVyZmFjZTsKKyAgICB0eXBlZGVmIEhJTlRFUkZBQ0UgSGFsSW50ZXJmYWNlOworCisgICAgSDJCQ29udmVydGVyKGNvbnN0IHNwPEhhbEludGVyZmFjZT4mIGJhc2UpIDogbUJhc2UoYmFzZSkge30KKyAgICB2aXJ0dWFsIHNwPEhhbEludGVyZmFjZT4gZ2V0SGFsSW50ZXJmYWNlKCkgeyByZXR1cm4gbUJhc2U7IH0KKyAgICB2aXJ0dWFsIHN0YXR1c190IGxpbmtUb0RlYXRoKAorICAgICAgICAgICAgY29uc3Qgc3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+JiByZWNpcGllbnQsCisgICAgICAgICAgICB2b2lkKiBjb29raWUgPSBudWxscHRyLAorICAgICAgICAgICAgdWludDMyX3QgZmxhZ3MgPSAwKTsKKyAgICB2aXJ0dWFsIHN0YXR1c190IHVubGlua1RvRGVhdGgoCisgICAgICAgICAgICBjb25zdCB3cDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4mIHJlY2lwaWVudCwKKyAgICAgICAgICAgIHZvaWQqIGNvb2tpZSA9IG51bGxwdHIsCisgICAgICAgICAgICB1aW50MzJfdCBmbGFncyA9IDAsCisgICAgICAgICAgICB3cDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4qIG91dFJlY2lwaWVudCA9IG51bGxwdHIpOworCitwcm90ZWN0ZWQ6CisgICAgc3A8SGFsSW50ZXJmYWNlPiBtQmFzZTsKKyAgICBzdHJ1Y3QgT2JpdHVhcnkgOiBwdWJsaWMgaGFyZHdhcmU6OmhpZGxfZGVhdGhfcmVjaXBpZW50IHsKKyAgICAgICAgd3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+IHJlY2lwaWVudDsKKyAgICAgICAgdm9pZCogY29va2llOworICAgICAgICB1aW50MzJfdCBmbGFnczsKKyAgICAgICAgd3A8SUJpbmRlcj4gd2hvOworICAgICAgICBPYml0dWFyeSgKKyAgICAgICAgICAgICAgICBjb25zdCB3cDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4mIHIsCisgICAgICAgICAgICAgICAgdm9pZCogYywgdWludDMyX3QgZiwKKyAgICAgICAgICAgICAgICBjb25zdCB3cDxJQmluZGVyPiYgdykgOgorICAgICAgICAgICAgcmVjaXBpZW50KHIpLCBjb29raWUoYyksIGZsYWdzKGYpLCB3aG8odykgeworICAgICAgICB9CisgICAgICAgIE9iaXR1YXJ5KGNvbnN0IE9iaXR1YXJ5JiBvKSA6CisgICAgICAgICAgICByZWNpcGllbnQoby5yZWNpcGllbnQpLAorICAgICAgICAgICAgY29va2llKG8uY29va2llKSwKKyAgICAgICAgICAgIGZsYWdzKG8uZmxhZ3MpLAorICAgICAgICAgICAgd2hvKG8ud2hvKSB7CisgICAgICAgIH0KKyAgICAgICAgT2JpdHVhcnkmIG9wZXJhdG9yPShjb25zdCBPYml0dWFyeSYgbykgeworICAgICAgICAgICAgcmVjaXBpZW50ID0gby5yZWNpcGllbnQ7CisgICAgICAgICAgICBjb29raWUgPSBvLmNvb2tpZTsKKyAgICAgICAgICAgIGZsYWdzID0gby5mbGFnczsKKyAgICAgICAgICAgIHdobyA9IG8ud2hvOworICAgICAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgICB9CisgICAgICAgIHZvaWQgc2VydmljZURpZWQodWludDY0X3QsIGNvbnN0IHdwPEhJbnRlcmZhY2U+Jikgb3ZlcnJpZGUgeworICAgICAgICAgICAgc3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+IGRyID0gcmVjaXBpZW50LnByb21vdGUoKTsKKyAgICAgICAgICAgIGlmIChkciAhPSBudWxscHRyKSB7CisgICAgICAgICAgICAgICAgZHItPmJpbmRlckRpZWQod2hvKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07CisgICAgc3RkOjptdXRleCBtT2JpdHVhcmllc0xvY2s7CisgICAgc3RkOjp2ZWN0b3I8c3A8T2JpdHVhcnk+ID4gbU9iaXR1YXJpZXM7Cit9OworCit0ZW1wbGF0ZSA8CisgICAgICAgIHR5cGVuYW1lIEhJTlRFUkZBQ0UsCisgICAgICAgIHR5cGVuYW1lIElOVEVSRkFDRSwKKyAgICAgICAgdHlwZW5hbWUgQk5JTlRFUkZBQ0U+CitzdGF0dXNfdCBIMkJDb252ZXJ0ZXI8SElOVEVSRkFDRSwgSU5URVJGQUNFLCBCTklOVEVSRkFDRT46OgorICAgICAgICBsaW5rVG9EZWF0aCgKKyAgICAgICAgY29uc3Qgc3A8SUJpbmRlcjo6RGVhdGhSZWNpcGllbnQ+JiByZWNpcGllbnQsCisgICAgICAgIHZvaWQqIGNvb2tpZSwgdWludDMyX3QgZmxhZ3MpIHsKKyAgICBMT0dfQUxXQVlTX0ZBVEFMX0lGKHJlY2lwaWVudCA9PSBudWxscHRyLAorICAgICAgICAgICAgImxpbmtUb0RlYXRoKCk6IHJlY2lwaWVudCBtdXN0IGJlIG5vbi1udWxscHRyIik7CisgICAgeworICAgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtT2JpdHVhcmllc0xvY2spOworICAgICAgICBtT2JpdHVhcmllcy5wdXNoX2JhY2sobmV3IE9iaXR1YXJ5KHJlY2lwaWVudCwgY29va2llLCBmbGFncywgdGhpcykpOworICAgICAgICBpZiAoIW1CYXNlLT5saW5rVG9EZWF0aChtT2JpdHVhcmllcy5iYWNrKCksIDApKSB7CisgICAgICAgICAgIHJldHVybiBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTk9fRVJST1I7Cit9CisKK3RlbXBsYXRlIDwKKyAgICAgICAgdHlwZW5hbWUgSElOVEVSRkFDRSwKKyAgICAgICAgdHlwZW5hbWUgSU5URVJGQUNFLAorICAgICAgICB0eXBlbmFtZSBCTklOVEVSRkFDRT4KK3N0YXR1c190IEgyQkNvbnZlcnRlcjxISU5URVJGQUNFLCBJTlRFUkZBQ0UsIEJOSU5URVJGQUNFPjo6CisgICAgICAgIHVubGlua1RvRGVhdGgoCisgICAgICAgIGNvbnN0IHdwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiYgcmVjaXBpZW50LAorICAgICAgICB2b2lkKiBjb29raWUsIHVpbnQzMl90IGZsYWdzLAorICAgICAgICB3cDxJQmluZGVyOjpEZWF0aFJlY2lwaWVudD4qIG91dFJlY2lwaWVudCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1PYml0dWFyaWVzTG9jayk7CisgICAgZm9yIChhdXRvIGkgPSBtT2JpdHVhcmllcy5iZWdpbigpOyBpICE9IG1PYml0dWFyaWVzLmVuZCgpOyArK2kpIHsKKyAgICAgICAgaWYgKChmbGFncyA9ICgqaSktPmZsYWdzKSAmJiAoCisgICAgICAgICAgICAgICAgKHJlY2lwaWVudCA9PSAoKmkpLT5yZWNpcGllbnQpIHx8CisgICAgICAgICAgICAgICAgKChyZWNpcGllbnQgPT0gbnVsbHB0cikgJiYgKGNvb2tpZSA9PSAoKmkpLT5jb29raWUpKSkpIHsKKyAgICAgICAgICAgIGlmIChvdXRSZWNpcGllbnQgIT0gbnVsbHB0cikgeworICAgICAgICAgICAgICAgICpvdXRSZWNpcGllbnQgPSAoKmkpLT5yZWNpcGllbnQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBib29sIHN1Y2Nlc3MgPSBtQmFzZS0+dW5saW5rVG9EZWF0aCgqaSk7CisgICAgICAgICAgICBtT2JpdHVhcmllcy5lcmFzZShpKTsKKyAgICAgICAgICAgIHJldHVybiBzdWNjZXNzID8gTk9fRVJST1IgOiBERUFEX09CSkVDVDsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTkFNRV9OT1RfRk9VTkQ7Cit9CisKK30gLy8gbmFtZXNwYWNlIGNhbWVyYWh5YnJpZAorfSAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgLy8gQU5EUk9JRF9DQU1FUkFfSFlCUklESU5URVJGQUNFX0gKKwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9Db252ZXJ0LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODY2YzNiNQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5jcHAKQEAgLTAsMCArMSwyODcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8aGlkbC9Db252ZXJ0Lmg+CisjaW5jbHVkZSA8Z3VpL2J1ZmZlcnF1ZXVlLzEuMC9IMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxjdXRpbHMvbmF0aXZlX2hhbmRsZS5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvQUltYWdlUmVhZGVyVXRpbHMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGhhcmR3YXJlIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSB1dGlscyB7CituYW1lc3BhY2UgY29udmVyc2lvbiB7CisKK3VzaW5nIGhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OnV0aWxzOjpIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBhaW1nOjpBSW1hZ2VSZWFkZXJfZ2V0SEdCUEZyb21IYW5kbGU7CisKKy8vIE5vdGU6IGV4aXN0aW5nIGRhdGEgaW4gZHN0IHdpbGwgYmUgZ29uZS4gQ2FsbGVyIHN0aWxsIG93bnMgdGhlIG1lbW9yeSBvZiBzcmMKK3ZvaWQgY29udmVydFRvSGlkbChjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc3JjLCBIQ2FtZXJhTWV0YWRhdGEqIGRzdCkgeworICAgIGlmIChzcmMgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HVygiJXM6YXR0ZW1wdCB0byBjb252ZXJ0IGVtcHR5IG1ldGFkYXRhIHRvIEhpZGwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNpemVfdCBzaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHNyYyk7CisgICAgZHN0LT5zZXRUb0V4dGVybmFsKCh1aW50OF90ICopIHNyYywgc2l6ZSk7CisgICAgcmV0dXJuOworfQorCitpbnQzMl90IGNvbnZlcnRGcm9tSGlkbChIU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgc3RyZWFtQ29uZmlndXJhdGlvbk1vZGUpIHsKKyAgICBzd2l0Y2ggKHN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlKSB7CisgICAgICAgIGNhc2UgSFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOjpDT05TVFJBSU5FRF9ISUdIX1NQRUVEX01PREU6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OkNPTlNUUkFJTkVEX0hJR0hfU1BFRURfTU9ERTsKKyAgICAgICAgY2FzZSBIU3RyZWFtQ29uZmlndXJhdGlvbk1vZGU6Ok5PUk1BTF9NT0RFOgorICAgICAgICAgICAgcmV0dXJuIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyOjpOT1JNQUxfTU9ERTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIC8vIFRPRE86IEZpeCB0aGlzCisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlZFTkRPUl9NT0RFX1NUQVJUOworICAgIH0KK30KKworaW50MzJfdCBjb252ZXJ0RnJvbUhpZGwoSFRlbXBsYXRlSWQgdGVtcGxhdGVJZCkgeworICAgIHN3aXRjaCh0ZW1wbGF0ZUlkKSB7CisgICAgICAgIGNhc2UgSFRlbXBsYXRlSWQ6OlBSRVZJRVc6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlRFTVBMQVRFX1BSRVZJRVc7CisgICAgICAgIGNhc2UgSFRlbXBsYXRlSWQ6OlNUSUxMX0NBUFRVUkU6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlRFTVBMQVRFX1NUSUxMX0NBUFRVUkU7CisgICAgICAgIGNhc2UgSFRlbXBsYXRlSWQ6OlJFQ09SRDoKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VEVNUExBVEVfUkVDT1JEOworICAgICAgICBjYXNlIEhUZW1wbGF0ZUlkOjpWSURFT19TTkFQU0hPVDoKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VEVNUExBVEVfVklERU9fU05BUFNIT1Q7CisgICAgICAgIGNhc2UgSFRlbXBsYXRlSWQ6OlpFUk9fU0hVVFRFUl9MQUc6CisgICAgICAgICAgICByZXR1cm4gY2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI6OlRFTVBMQVRFX1pFUk9fU0hVVFRFUl9MQUc7CisgICAgICAgIGNhc2UgSFRlbXBsYXRlSWQ6Ok1BTlVBTDoKKyAgICAgICAgICAgIHJldHVybiBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcjo6VEVNUExBVEVfTUFOVUFMOworICAgIH0KK30KKworaW50IGNvbnZlcnRGcm9tSGlkbChIT3V0cHV0Q29uZmlndXJhdGlvbjo6Um90YXRpb24gcm90YXRpb24pIHsKKyAgICBzd2l0Y2gocm90YXRpb24pIHsKKyAgICAgICAgY2FzZSBIT3V0cHV0Q29uZmlndXJhdGlvbjo6Um90YXRpb246OlIwOgorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGNhc2UgSE91dHB1dENvbmZpZ3VyYXRpb246OlJvdGF0aW9uOjpSOTA6CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgY2FzZSBIT3V0cHV0Q29uZmlndXJhdGlvbjo6Um90YXRpb246OlIxODA6CisgICAgICAgICAgICByZXR1cm4gMjsKKyAgICAgICAgY2FzZSBIT3V0cHV0Q29uZmlndXJhdGlvbjo6Um90YXRpb246OlIyNzA6CisgICAgICAgICAgICByZXR1cm4gMzsKKyAgICB9Cit9CisKK2hhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6Ok91dHB1dENvbmZpZ3VyYXRpb24gY29udmVydEZyb21IaWRsKAorICAgIGNvbnN0IEhPdXRwdXRDb25maWd1cmF0aW9uICZoT3V0cHV0Q29uZmlndXJhdGlvbikgeworICAgIHN0ZDo6dmVjdG9yPHNwPElHcmFwaGljQnVmZmVyUHJvZHVjZXI+PiBpR0JQczsKKyAgICBhdXRvICZ3aW5kb3dIYW5kbGVzID0gaE91dHB1dENvbmZpZ3VyYXRpb24ud2luZG93SGFuZGxlczsKKyAgICBpR0JQcy5yZXNlcnZlKHdpbmRvd0hhbmRsZXMuc2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8gJmhhbmRsZSA6IHdpbmRvd0hhbmRsZXMpIHsKKyAgICAgICAgaUdCUHMucHVzaF9iYWNrKG5ldyBIMkJHcmFwaGljQnVmZmVyUHJvZHVjZXIoQUltYWdlUmVhZGVyX2dldEhHQlBGcm9tSGFuZGxlKGhhbmRsZSkpKTsKKyAgICB9CisgICAgU3RyaW5nMTYgcGh5c2ljYWxDYW1lcmFJZDE2KGhPdXRwdXRDb25maWd1cmF0aW9uLnBoeXNpY2FsQ2FtZXJhSWQuY19zdHIoKSk7CisgICAgaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6T3V0cHV0Q29uZmlndXJhdGlvbiBvdXRwdXRDb25maWd1cmF0aW9uKAorICAgICAgICBpR0JQcywgY29udmVydEZyb21IaWRsKGhPdXRwdXRDb25maWd1cmF0aW9uLnJvdGF0aW9uKSwgcGh5c2ljYWxDYW1lcmFJZDE2LAorICAgICAgICBoT3V0cHV0Q29uZmlndXJhdGlvbi53aW5kb3dHcm91cElkLCBPdXRwdXRDb25maWd1cmF0aW9uOjpTVVJGQUNFX1RZUEVfVU5LTk9XTiwgMCwgMCwKKyAgICAgICAgKHdpbmRvd0hhbmRsZXMuc2l6ZSgpID4gMSkpOworICAgIHJldHVybiBvdXRwdXRDb25maWd1cmF0aW9uOworfQorCitoYXJkd2FyZTo6Y2FtZXJhMjo6cGFyYW1zOjpTZXNzaW9uQ29uZmlndXJhdGlvbiBjb252ZXJ0RnJvbUhpZGwoCisgICAgY29uc3QgSFNlc3Npb25Db25maWd1cmF0aW9uICZoU2Vzc2lvbkNvbmZpZ3VyYXRpb24pIHsKKyAgICBoYXJkd2FyZTo6Y2FtZXJhMjo6cGFyYW1zOjpTZXNzaW9uQ29uZmlndXJhdGlvbiBzZXNzaW9uQ29uZmlnKAorICAgICAgICAgICAgaFNlc3Npb25Db25maWd1cmF0aW9uLmlucHV0V2lkdGgsIGhTZXNzaW9uQ29uZmlndXJhdGlvbi5pbnB1dEhlaWdodCwKKyAgICAgICAgICAgIGhTZXNzaW9uQ29uZmlndXJhdGlvbi5pbnB1dEZvcm1hdCwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oaFNlc3Npb25Db25maWd1cmF0aW9uLm9wZXJhdGlvbk1vZGUpKTsKKworICAgIGZvciAoY29uc3QgYXV0byYgaENvbmZpZyA6IGhTZXNzaW9uQ29uZmlndXJhdGlvbi5vdXRwdXRTdHJlYW1zKSB7CisgICAgICAgIGhhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6Ok91dHB1dENvbmZpZ3VyYXRpb24gY29uZmlnID0gY29udmVydEZyb21IaWRsKGhDb25maWcpOworICAgICAgICBzZXNzaW9uQ29uZmlnLmFkZE91dHB1dENvbmZpZ3VyYXRpb24oY29uZmlnKTsKKyAgICB9CisKKyAgICByZXR1cm4gc2Vzc2lvbkNvbmZpZzsKK30KKworLy8gVGhlIGNhbWVyYSBtZXRhZGF0YSBoZXJlIGlzIGNsb25lZC4gU2luY2Ugd2UncmUgcmVhZGluZyBtZXRhZGF0YSBvdmVyCisvLyBod2JpbmRlciB3ZSB3b3VsZCBuZWVkIHRvIGNsb25lIGl0IGluIG9yZGVyIHRvIGF2b2lkIGFsaWdtZW50IGlzc3Vlcy4KK2Jvb2wgY29udmVydEZyb21IaWRsKGNvbnN0IEhDYW1lcmFNZXRhZGF0YSAmc3JjLCBDYW1lcmFNZXRhZGF0YSAqZHN0KSB7CisgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKmJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2FtZXJhX21ldGFkYXRhX3QqPihzcmMuZGF0YSgpKTsKKyAgICBzaXplX3QgZXhwZWN0ZWRTaXplID0gc3JjLnNpemUoKTsKKyAgICBpZiAoYnVmZmVyICE9IG51bGxwdHIpIHsKKyAgICAgICAgaW50IHJlcyA9IHZhbGlkYXRlX2NhbWVyYV9tZXRhZGF0YV9zdHJ1Y3R1cmUoYnVmZmVyLCAmZXhwZWN0ZWRTaXplKTsKKyAgICAgICAgaWYgKHJlcyA9PSBPSyB8fCByZXMgPT0gQ0FNRVJBX01FVEFEQVRBX1ZBTElEQVRJT05fU0hJRlRFRCkgeworICAgICAgICAgICAgKmRzdCA9IGJ1ZmZlcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogTWFsZm9ybWVkIGNhbWVyYSBtZXRhZGF0YSByZWNlaXZlZCBmcm9tIEhBTCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK0hDYW1lcmFEZXZpY2VTdGF0dXMgY29udmVydFRvSGlkbENhbWVyYURldmljZVN0YXR1cyhpbnQzMl90IHN0YXR1cykgeworICAgIEhDYW1lcmFEZXZpY2VTdGF0dXMgZGV2aWNlU3RhdHVzID0gSENhbWVyYURldmljZVN0YXR1czo6U1RBVFVTX1VOS05PV047CisgICAgc3dpdGNoKHN0YXR1cykgeworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfTk9UX1BSRVNFTlQ6CisgICAgICAgICAgICBkZXZpY2VTdGF0dXMgPSBIQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX1BSRVNFTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX1BSRVNFTlQ6CisgICAgICAgICAgICBkZXZpY2VTdGF0dXMgPSBIQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfUFJFU0VOVDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZUxpc3RlbmVyOjpTVEFUVVNfRU5VTUVSQVRJTkc6CisgICAgICAgICAgICBkZXZpY2VTdGF0dXMgPSBIQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfRU5VTUVSQVRJTkc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjo6U1RBVFVTX05PVF9BVkFJTEFCTEU6CisgICAgICAgICAgICBkZXZpY2VTdGF0dXMgPSBIQ2FtZXJhRGV2aWNlU3RhdHVzOjpTVEFUVVNfTk9UX0FWQUlMQUJMRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiBkZXZpY2VTdGF0dXM7Cit9CisKK0hDYXB0dXJlUmVzdWx0RXh0cmFzIGNvbnZlcnRUb0hpZGwoY29uc3QgQ2FwdHVyZVJlc3VsdEV4dHJhcyAmY2FwdHVyZVJlc3VsdEV4dHJhcykgeworICAgIEhDYXB0dXJlUmVzdWx0RXh0cmFzIGhDYXB0dXJlUmVzdWx0RXh0cmFzOworICAgIGhDYXB0dXJlUmVzdWx0RXh0cmFzLnJlcXVlc3RJZCA9IGNhcHR1cmVSZXN1bHRFeHRyYXMucmVxdWVzdElkOworICAgIGhDYXB0dXJlUmVzdWx0RXh0cmFzLmJ1cnN0SWQgPSBjYXB0dXJlUmVzdWx0RXh0cmFzLmJ1cnN0SWQ7CisgICAgaENhcHR1cmVSZXN1bHRFeHRyYXMuZnJhbWVOdW1iZXIgPSBjYXB0dXJlUmVzdWx0RXh0cmFzLmZyYW1lTnVtYmVyOworICAgIGhDYXB0dXJlUmVzdWx0RXh0cmFzLnBhcnRpYWxSZXN1bHRDb3VudCA9IGNhcHR1cmVSZXN1bHRFeHRyYXMucGFydGlhbFJlc3VsdENvdW50OworICAgIGhDYXB0dXJlUmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQgPSBjYXB0dXJlUmVzdWx0RXh0cmFzLmVycm9yU3RyZWFtSWQ7CisgICAgaENhcHR1cmVSZXN1bHRFeHRyYXMuZXJyb3JQaHlzaWNhbENhbWVyYUlkID0gaGlkbF9zdHJpbmcoU3RyaW5nOCgKKyAgICAgICAgICAgIGNhcHR1cmVSZXN1bHRFeHRyYXMuZXJyb3JQaHlzaWNhbENhbWVyYUlkKS5zdHJpbmcoKSk7CisgICAgcmV0dXJuIGhDYXB0dXJlUmVzdWx0RXh0cmFzOworfQorCitIRXJyb3JDb2RlIGNvbnZlcnRUb0hpZGwoaW50MzJfdCBlcnJvckNvZGUpIHsKKyAgICBzd2l0Y2goZXJyb3JDb2RlKSB7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfRElTQ09OTkVDVEVEOworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9ERVZJQ0UgOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9ERVZJQ0U7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1NFUlZJQ0U6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX1NFUlZJQ0U7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFUVVFU1Q6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX1JFUVVFU1Q7CisgICAgICAgIGNhc2UgY2FtZXJhMjo6SUNhbWVyYURldmljZUNhbGxiYWNrczo6RVJST1JfQ0FNRVJBX1JFU1VMVDoKKyAgICAgICAgICAgIHJldHVybiBIRXJyb3JDb2RlOjpDQU1FUkFfUkVTVUxUOworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9CVUZGRVI6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX0JVRkZFUjsKKyAgICAgICAgY2FzZSBjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOjpFUlJPUl9DQU1FUkFfRElTQUJMRUQ6CisgICAgICAgICAgICByZXR1cm4gSEVycm9yQ29kZTo6Q0FNRVJBX0RJU0FCTEVEOworICAgICAgICBjYXNlIGNhbWVyYTI6OklDYW1lcmFEZXZpY2VDYWxsYmFja3M6OkVSUk9SX0NBTUVSQV9JTlZBTElEX0VSUk9SOgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9JTlZBTElEX0VSUk9SOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgcmV0dXJuIEhFcnJvckNvZGU6OkNBTUVSQV9VTktOT1dOX0VSUk9SOworICAgIH0KK30KKwordm9pZCBjb252ZXJ0VG9IaWRsKGNvbnN0IHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+ICZzcmMsCisgICAgICAgICAgICAgICAgICAgaGlkbF92ZWM8SENhbWVyYVN0YXR1c0FuZElkPiogZHN0KSB7CisgICAgZHN0LT5yZXNpemUoc3JjLnNpemUoKSk7CisgICAgc2l6ZV90IGkgPSAwOworICAgIGZvciAoYXV0byAmc3RhdHVzQW5kSWQgOiBzcmMpIHsKKyAgICAgICAgYXV0byAmYSA9ICgqZHN0KVtpKytdOworICAgICAgICBhLmNhbWVyYUlkID0gc3RhdHVzQW5kSWQuY2FtZXJhSWQuY19zdHIoKTsKKyAgICAgICAgYS5kZXZpY2VTdGF0dXMgPSBjb252ZXJ0VG9IaWRsQ2FtZXJhRGV2aWNlU3RhdHVzKHN0YXR1c0FuZElkLnN0YXR1cyk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBjb252ZXJ0VG9IaWRsKAorICAgIGNvbnN0IGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6U3VibWl0SW5mbyAmc3VibWl0SW5mbywKKyAgICBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlN1Ym1pdEluZm8gKmhTdWJtaXRJbmZvKSB7CisgICAgaFN1Ym1pdEluZm8tPnJlcXVlc3RJZCA9IHN1Ym1pdEluZm8ubVJlcXVlc3RJZDsKKyAgICBoU3VibWl0SW5mby0+bGFzdEZyYW1lTnVtYmVyID0gc3VibWl0SW5mby5tTGFzdEZyYW1lTnVtYmVyOworfQorCitIU3RhdHVzIEIySFN0YXR1cyhjb25zdCBiaW5kZXI6OlN0YXR1cyAmYlN0YXR1cykgeworICAgIEhTdGF0dXMgc3RhdHVzID0gSFN0YXR1czo6Tk9fRVJST1I7CisgICAgaWYgKGJTdGF0dXMuaXNPaygpKSB7CisgICAgICAgIC8vIE5PIEVycm9yIGhlcmUKKyAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICB9CisgICAgc3dpdGNoKGJTdGF0dXMuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpIHsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0RJU0NPTk5FQ1RFRDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OkRJU0NPTk5FQ1RFRDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfQ0FNRVJBX0lOX1VTRToKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OkNBTUVSQV9JTl9VU0U7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX01BWF9DQU1FUkFTX0lOX1VTRToKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6Ok1BWF9DQU1FUkFTX0lOX1VTRTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGhhcmR3YXJlOjpJQ2FtZXJhU2VydmljZTo6RVJST1JfSUxMRUdBTF9BUkdVTUVOVDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkVSUk9SX0RFUFJFQ0FURURfSEFMOgorICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCByZWFjaCBoZXJlIHNpbmNlIHdlIGZpbHRlcmVkIGxlZ2FjeSBIQUxzIGVhcmxpZXIKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OkRFUFJFQ0FURURfSEFMOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9ESVNBQkxFRDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OkRJU0FCTEVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9QRVJNSVNTSU9OX0RFTklFRDoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OlBFUk1JU1NJT05fREVOSUVEOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTlZBTElEX09QRVJBVElPTjoKKyAgICAgICAgICAgIHN0YXR1cyA9IEhTdGF0dXM6OklOVkFMSURfT1BFUkFUSU9OOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBzdGF0dXMgPSBIU3RhdHVzOjpVTktOT1dOX0VSUk9SOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICByZXR1cm4gc3RhdHVzOworfQorCitIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyBjb252ZXJ0VG9IaWRsKAorICAgIGNvbnN0IFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gJnBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8sCisgICAgc3RkOjpzaGFyZWRfcHRyPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPiAmY2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUpIHsKKyAgICBIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbyBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbzsKKyAgICBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mby5waHlzaWNhbENhbWVyYUlkID0KKyAgICAgICAgU3RyaW5nOChwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLm1QaHlzaWNhbENhbWVyYUlkKS5zdHJpbmcoKTsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3TWV0YWRhdGEgPQorICAgICAgICBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLm1QaHlzaWNhbENhbWVyYU1ldGFkYXRhLmdldEFuZExvY2soKTsKKyAgICAvLyBUcnkgdXNpbmcgZm1xIGF0IGZpcnN0LgorICAgIHNpemVfdCBtZXRhZGF0YV9zaXplID0gZ2V0X2NhbWVyYV9tZXRhZGF0YV9zaXplKHJhd01ldGFkYXRhKTsKKyAgICBpZiAoKG1ldGFkYXRhX3NpemUgPiAwKSAmJiAoY2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUtPmF2YWlsYWJsZVRvV3JpdGUoKSA+IDApKSB7CisgICAgICAgIGlmIChjYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS0+d3JpdGUoKHVpbnQ4X3QgKilyYXdNZXRhZGF0YSwgbWV0YWRhdGFfc2l6ZSkpIHsKKyAgICAgICAgICAgIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLnBoeXNpY2FsQ2FtZXJhTWV0YWRhdGEuZm1xTWV0YWRhdGFTaXplKG1ldGFkYXRhX3NpemUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgQUxPR1coIiVzIENvdWxkbid0IHVzZSBmbXEsIGZhbGxpbmcgYmFjayB0byBod2JpbmRlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICBIQ2FtZXJhTWV0YWRhdGEgbWV0YWRhdGE7CisgICAgICAgICAgICBjb252ZXJ0VG9IaWRsKHJhd01ldGFkYXRhLCAmbWV0YWRhdGEpOworICAgICAgICAgICAgaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8ucGh5c2ljYWxDYW1lcmFNZXRhZGF0YS5tZXRhZGF0YShzdGQ6Om1vdmUobWV0YWRhdGEpKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvLm1QaHlzaWNhbENhbWVyYU1ldGFkYXRhLnVubG9jayhyYXdNZXRhZGF0YSk7CisgICAgcmV0dXJuIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOworfQorCitoaWRsX3ZlYzxIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gY29udmVydFRvSGlkbCgKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvPiAmcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MsCisgICAgc3RkOjpzaGFyZWRfcHRyPENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlPiAmY2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWUpIHsKKyAgICBoaWRsX3ZlYzxIUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zOworICAgIGhQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvcy5yZXNpemUocGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3Muc2l6ZSgpKTsKKyAgICBzaXplX3QgaSA9IDA7CisgICAgZm9yIChhdXRvICZwaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvIDogcGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3MpIHsKKyAgICAgICAgaFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zW2krK10gPSBjb252ZXJ0VG9IaWRsKHBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSk7CisgICAgfQorICAgIHJldHVybiBoUGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mb3M7Cit9CisKK30gLy9jb252ZXJzaW9uCit9IC8vIHV0aWxzCit9IC8vY2FtZXJhc2VydmljZQorfSAvLyBoYXJkd2FyZQorfSAvLyBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvQ29udmVydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5NjgzZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0NvbnZlcnQuaApAQCAtMCwwICsxLDEwMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ0FNRVJBU0VSVkVSX0NPTlZFUlRfSElETAorI2RlZmluZSBDQU1FUkFTRVJWRVJfQ09OVkVSVF9ISURMCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9zZXJ2aWNlLzIuMC9JQ2FtZXJhU2VydmljZS5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvSUNhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9jb21tb24vMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvY29tbW9uLzEuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhMi9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvZ3JhcGhpY3MvYnVmZmVycXVldWUvMS4wL0lHcmFwaGljQnVmZmVyUHJvZHVjZXIuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8Zm1xL01lc3NhZ2VRdWV1ZS5oPgorI2luY2x1ZGUgPGhhcmR3YXJlL2NhbWVyYS5oPgorI2luY2x1ZGUgPGhpZGwvTVFEZXNjcmlwdG9yLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBoYXJkd2FyZSB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2UgdXRpbHMgeworbmFtZXNwYWNlIGNvbnZlcnNpb24geworCit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6aW1wbDo6Q2FwdHVyZVJlc3VsdEV4dHJhczsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjppbXBsOjpQaHlzaWNhbENhcHR1cmVSZXN1bHRJbmZvOworCit1c2luZyBDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IE1lc3NhZ2VRdWV1ZTx1aW50OF90LCBrU3luY2hyb25pemVkUmVhZFdyaXRlPjsKK3VzaW5nIEhDYW1lcmFNZXRhZGF0YSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYU1ldGFkYXRhOwordXNpbmcgSENhbWVyYURldmljZVN0YXR1cyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYURldmljZVN0YXR1czsKK3VzaW5nIEhDYW1lcmFTdGF0dXNBbmRJZCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OkNhbWVyYVN0YXR1c0FuZElkOwordXNpbmcgSENhbWVyYURldmljZVVzZXIgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VVc2VyOwordXNpbmcgSENhcHR1cmVSZXN1bHRFeHRyYXMgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXN1bHRFeHRyYXM7Cit1c2luZyBIQ2FwdHVyZVJlcXVlc3QgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0OwordXNpbmcgSEVycm9yQ29kZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6RXJyb3JDb2RlOwordXNpbmcgSEdyYXBoaWNCdWZmZXJQcm9kdWNlciA9IGhhcmR3YXJlOjpncmFwaGljczo6YnVmZmVycXVldWU6OlYxXzA6OklHcmFwaGljQnVmZmVyUHJvZHVjZXI7Cit1c2luZyBIT3V0cHV0Q29uZmlndXJhdGlvbiA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6T3V0cHV0Q29uZmlndXJhdGlvbjsKK3VzaW5nIEhQaHlzaWNhbENhbWVyYVNldHRpbmdzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpQaHlzaWNhbENhbWVyYVNldHRpbmdzOwordXNpbmcgSFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm87Cit1c2luZyBIU2Vzc2lvbkNvbmZpZ3VyYXRpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlNlc3Npb25Db25maWd1cmF0aW9uOwordXNpbmcgSFN1Ym1pdEluZm8gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlN1Ym1pdEluZm87Cit1c2luZyBIU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpTdGF0dXM7Cit1c2luZyBIU3RyZWFtQ29uZmlndXJhdGlvbk1vZGUgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlOwordXNpbmcgSFRlbXBsYXRlSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlRlbXBsYXRlSWQ7CisKKy8vIE5vdGU6IGV4aXN0aW5nIGRhdGEgaW4gZHN0IHdpbGwgYmUgZ29uZS4gQ2FsbGVyIHN0aWxsIG93bnMgdGhlIG1lbW9yeSBvZiBzcmMKK3ZvaWQgY29udmVydFRvSGlkbChjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqc3JjLCBIQ2FtZXJhTWV0YWRhdGEqIGRzdCk7CisKK2ludDMyX3QgY29udmVydEZyb21IaWRsKEhTdHJlYW1Db25maWd1cmF0aW9uTW9kZSBzdHJlYW1Db25maWd1cmF0aW9uTW9kZSk7CisKK2ludDMyX3QgY29udmVydEZyb21IaWRsKEhUZW1wbGF0ZUlkIHRlbXBsYXRlSWQpOworCitib29sIGNvbnZlcnRGcm9tSGlkbChjb25zdCBIQ2FtZXJhTWV0YWRhdGEgJnNyYywgQ2FtZXJhTWV0YWRhdGEgKmRzdCk7CisKK2hhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6Ok91dHB1dENvbmZpZ3VyYXRpb24gY29udmVydEZyb21IaWRsKAorICAgIGNvbnN0IEhPdXRwdXRDb25maWd1cmF0aW9uICZoT3V0cHV0Q29uZmlndXJhdGlvbik7CisKK2hhcmR3YXJlOjpjYW1lcmEyOjpwYXJhbXM6OlNlc3Npb25Db25maWd1cmF0aW9uIGNvbnZlcnRGcm9tSGlkbCgKKyAgICBjb25zdCBIU2Vzc2lvbkNvbmZpZ3VyYXRpb24gJmhTZXNzaW9uQ29uZmlndXJhdGlvbik7CisKK0hDYW1lcmFEZXZpY2VTdGF0dXMgY29udmVydFRvSGlkbENhbWVyYURldmljZVN0YXR1cyhpbnQzMl90IHN0YXR1cyk7CisKK3ZvaWQgY29udmVydFRvSGlkbChjb25zdCBzdGQ6OnZlY3RvcjxoYXJkd2FyZTo6Q2FtZXJhU3RhdHVzPiAmc3JjLAorICAgICAgICAgICAgICAgICAgIGhpZGxfdmVjPEhDYW1lcmFTdGF0dXNBbmRJZD4qIGRzdCk7CisKK3ZvaWQgY29udmVydFRvSGlkbChjb25zdCBoYXJkd2FyZTo6Y2FtZXJhMjo6dXRpbHM6OlN1Ym1pdEluZm8gJnN1Ym1pdEluZm8sCisgICAgICAgICAgICAgICAgICAgSFN1Ym1pdEluZm8gKmhTdWJtaXRJbmZvKTsKKworSEVycm9yQ29kZSBjb252ZXJ0VG9IaWRsKGludDMyX3QgZXJyb3JDb2RlKTsKKworSENhcHR1cmVSZXN1bHRFeHRyYXMgY29udmVydFRvSGlkbChjb25zdCBDYXB0dXJlUmVzdWx0RXh0cmFzICZjYXB0dXJlUmVzdWx0RXh0cmFzKTsKKworaGlkbF92ZWM8SFBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm8+IGNvbnZlcnRUb0hpZGwoCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8UGh5c2ljYWxDYXB0dXJlUmVzdWx0SW5mbz4gJnBoeXNpY2FsQ2FwdHVyZVJlc3VsdEluZm9zLAorICAgIHN0ZDo6c2hhcmVkX3B0cjxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4gJmNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKTsKKworSFN0YXR1cyBCMkhTdGF0dXMoY29uc3QgYmluZGVyOjpTdGF0dXMgJmJTdGF0dXMpOworCit9IC8vIGNvbnZlcnNpb24KK30gLy8gdXRpbHMKK30gLy8gY2FtZXJhc2VydmljZQorfSAvLyBoYXJkd2FyZQorfSAvL2FuZHJvaWQKKworI2VuZGlmIC8vQ0FNRVJBU0VSVkVSX0NPTlZFUlRfVE9fSElETApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzVhZDI0Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5jcHAKQEAgLTAsMCArMSwyNzYgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9jYW1lcmEvZGV2aWNlLzMuMi90eXBlcy5oPgorI2luY2x1ZGUgPGN1dGlscy9wcm9wZXJ0aWVzLmg+CisjaW5jbHVkZSA8Z3VpL1N1cmZhY2UuaD4KKyNpbmNsdWRlIDxndWkvYnVmZmVycXVldWUvMS4wL0gyQkdyYXBoaWNCdWZmZXJQcm9kdWNlci5oPgorCisjaW5jbHVkZSA8aGlkbC9BaWRsQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzLmg+CisjaW5jbHVkZSA8aGlkbC9Db252ZXJ0Lmg+CisjaW5jbHVkZSA8aGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvY2FtZXJhL2RldmljZS8zLjIvdHlwZXMuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIGRldmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRUb0hpZGw7Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhc2VydmljZTo6dXRpbHM6OmNvbnZlcnNpb246OmNvbnZlcnRGcm9tSGlkbDsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmFzZXJ2aWNlOjp1dGlsczo6Y29udmVyc2lvbjo6QjJIU3RhdHVzOworCit1c2luZyBoYXJkd2FyZTo6Z3JhcGhpY3M6OmJ1ZmZlcnF1ZXVlOjpWMV8wOjp1dGlsczo6SDJCR3JhcGhpY0J1ZmZlclByb2R1Y2VyOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgaGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIGhhcmR3YXJlOjpWb2lkOwordXNpbmcgSFN1Ym1pdEluZm8gPSBkZXZpY2U6OlYyXzA6OlN1Ym1pdEluZm87Cit1c2luZyBoYXJkd2FyZTo6Y2FtZXJhMjo6cGFyYW1zOjpPdXRwdXRDb25maWd1cmF0aW9uOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYTI6OnBhcmFtczo6U2Vzc2lvbkNvbmZpZ3VyYXRpb247CisKK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBDQU1FUkFfUkVRVUVTVF9NRVRBREFUQV9RVUVVRV9TSVpFID0gMSA8PCAyMCAvKiAxIE1CICovOworc3RhdGljIGNvbnN0ZXhwciBpbnQzMl90IENBTUVSQV9SRVNVTFRfTUVUQURBVEFfUVVFVUVfU0laRSA9IDEgPDwgMjAgLyogMSBNQiAqLzsKKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpkaXNjb25uZWN0KCkgeworICAgIG1EZXZpY2VSZW1vdGUtPmRpc2Nvbm5lY3QoKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6SGlkbENhbWVyYURldmljZVVzZXIoCisgICAgY29uc3Qgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyPiAmZGV2aWNlUmVtb3RlKQorICA6IG1EZXZpY2VSZW1vdGUoZGV2aWNlUmVtb3RlKSB7CisgICAgbUluaXRTdWNjZXNzID0gaW5pdERldmljZSgpOworfQorCitib29sIEhpZGxDYW1lcmFEZXZpY2VVc2VyOjppbml0RGV2aWNlKCkgeworICAgIC8vIFRPRE86IEdldCByZXF1ZXN0IGFuZCByZXN1bHQgbWV0YWRhdGEgcXVldWUgc2l6ZSBmcm9tIGEgc3lzdGVtIHByb3BlcnR5LgorICAgIGludDMyX3QgcmVxRk1RU2l6ZSA9IENBTUVSQV9SRVFVRVNUX01FVEFEQVRBX1FVRVVFX1NJWkU7CisKKyAgICBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlID0KKyAgICAgICAgc3RkOjptYWtlX3VuaXF1ZTxDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWU+KHN0YXRpY19jYXN0PHNpemVfdD4ocmVxRk1RU2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBub24gYmxvY2tpbmcgKi8pOworICAgIGlmICghbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZS0+aXNWYWxpZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCByZXF1ZXN0IGZtcSIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQzMl90IHJlc0ZNUVNpemUgPSBDQU1FUkFfUkVTVUxUX01FVEFEQVRBX1FVRVVFX1NJWkU7CisgICAgbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0KKyAgICAgICAgc3RkOjptYWtlX3NoYXJlZDxDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZT4oc3RhdGljX2Nhc3Q8c2l6ZV90PihyZXNGTVFTaXplKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogbm9uIGJsb2NraW5nICovKTsKKyAgICBpZiAoIW1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS0+aXNWYWxpZCgpKSB7CisgICAgICAgIEFMT0dFKCIlczogaW52YWxpZCByZXN1bHQgZm1xIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpnZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUoCisgICAgZ2V0Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlX2NiIF9oaWRsX2NiKSB7CisgICAgaWYgKG1Jbml0U3VjY2VzcykgeworICAgICAgICBfaGlkbF9jYigqbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZS0+Z2V0RGVzYygpKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpnZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgKKyAgICBnZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZV9jYiBfaGlkbF9jYikgeworICAgIGlmIChtSW5pdFN1Y2Nlc3MpIHsKKyAgICAgICAgX2hpZGxfY2IoKm1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZS0+Z2V0RGVzYygpKTsKKyAgICB9CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworLyoqCisgKiBUbyBiZSB1c2VkIG9ubHkgYnkgc3VibWl0UmVxdWVzdExpc3QgaW1wbGVtZW50YXRpb24sIHNpbmNlIGl0IHJlcXVpcmVzCisgKiBjbGllbnRzIHRvIGNhbGwgdGhpcyBtZXRob2Qgc2VyaWFsbHksIGluY2FzZSBmbXEgaXMgdXNlZCB0byBzZW5kIG1ldGFkYXRhLgorICovCitib29sIEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpjb3B5UGh5c2ljYWxDYW1lcmFTZXR0aW5ncygKKyAgICBjb25zdCBoaWRsX3ZlYzxIUGh5c2ljYWxDYW1lcmFTZXR0aW5ncz4gJmhQaHlzaWNhbENhbWVyYVNldHRpbmdzLAorICAgIHN0ZDo6dmVjdG9yPENhcHR1cmVSZXF1ZXN0OjpQaHlzaWNhbENhbWVyYVNldHRpbmdzPiAqcGh5c2ljYWxDYW1lcmFTZXR0aW5ncykgeworICAgIGJvb2wgY29udmVydGVkID0gZmFsc2U7CisgICAgZm9yIChhdXRvICZlIDogaFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MpIHsKKyAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5ncy0+ZW1wbGFjZV9iYWNrKCk7CisgICAgICAgIENhcHR1cmVSZXF1ZXN0OjpQaHlzaWNhbENhbWVyYVNldHRpbmdzICZwaHlzaWNhbENhbWVyYVNldHRpbmcgPQorICAgICAgICAgICAgcGh5c2ljYWxDYW1lcmFTZXR0aW5ncy0+YmFjaygpOworICAgICAgICBwaHlzaWNhbENhbWVyYVNldHRpbmcuaWQgPSBlLmlkLmNfc3RyKCk7CisKKyAgICAgICAgLy8gUmVhZCB0aGUgc2V0dGluZ3MgZWl0aGVyIGZyb20gdGhlIGZtcSBvciBzdHJhaWdodGF3YXkgZnJvbSB0aGUKKyAgICAgICAgLy8gcmVxdWVzdC4gV2UgZG9uJ3QgbmVlZCBhbnkgc3luY2hyb25pemF0aW9uLCBzaW5jZSBzdWJtaXRSZXF1ZXN0TGlzdAorICAgICAgICAvLyBpcyBndWFyYW50ZWVkIHRvIGJlIGNhbGxlZCBzZXJpYWxseSBieSB0aGUgY2xpZW50IGlmIGl0IGRlY2lkZXMgdG8KKyAgICAgICAgLy8gdXNlIGZtcS4KKyAgICAgICAgaWYgKGUuc2V0dGluZ3MuZ2V0RGlzY3JpbWluYXRvcigpID09CisgICAgICAgICAgICBGbXFTaXplT3JNZXRhZGF0YTo6aGlkbF9kaXNjcmltaW5hdG9yOjpmbXFNZXRhZGF0YVNpemUpIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogR2V0IHNldHRpbmdzIGZyb20gdGhlIGZtcS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgSENhbWVyYU1ldGFkYXRhIHNldHRpbmdzRm1xOworICAgICAgICAgICAgc2V0dGluZ3NGbXEucmVzaXplKGUuc2V0dGluZ3MuZm1xTWV0YWRhdGFTaXplKCkpOworICAgICAgICAgICAgYm9vbCByZWFkID0gbUNhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZS0+cmVhZChzZXR0aW5nc0ZtcS5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUuc2V0dGluZ3MuZm1xTWV0YWRhdGFTaXplKCkpOworICAgICAgICAgICAgaWYgKCFyZWFkKSB7CisgICAgICAgICAgICAgICAgQUxPR0UoIiVzIGNhcHR1cmUgcmVxdWVzdCBzZXR0aW5ncyBjb3VsZCd0IGJlIHJlYWQgZnJvbSBmbXEgc2l6ZSIsCisgICAgICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICBjb252ZXJ0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgY29udmVydGVkID0gY29udmVydEZyb21IaWRsKHNldHRpbmdzRm1xLCAmcGh5c2ljYWxDYW1lcmFTZXR0aW5nLnNldHRpbmdzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qKgorICAgICAgICAgICAgICogVGhlIHNldHRpbmdzIG1ldGFkYXRhIGlzIGNvbnRhaW5lZCBpbiByZXF1ZXN0IHNldHRpbmdzIGZpZWxkLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBjb252ZXJ0ZWQgPQorICAgICAgICAgICAgICAgIGNvbnZlcnRGcm9tSGlkbChlLnNldHRpbmdzLm1ldGFkYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwaHlzaWNhbENhbWVyYVNldHRpbmcuc2V0dGluZ3MpOworICAgICAgICB9CisgICAgICAgIGlmICghY29udmVydGVkKSB7CisgICAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gY29udmVydCBwaHlzaWNhbENhbWVyYVNldHRpbmdzIGZyb20gSElETCB0byBBSURMLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpjb252ZXJ0UmVxdWVzdEZyb21IaWRsKGNvbnN0IEhDYXB0dXJlUmVxdWVzdCAmaFJlcXVlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhcHR1cmVSZXF1ZXN0ICpyZXF1ZXN0KSB7CisgICAgLy8gTm8gcmVwcm9jZXNzaW5nIHN1cHBvcnQuCisgICAgcmVxdWVzdC0+bUlzUmVwcm9jZXNzID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvICZzdHJlYW1BbmRXaW5kb3dJZCA6IGhSZXF1ZXN0LnN0cmVhbUFuZFdpbmRvd0lkcykgeworICAgICAgICByZXF1ZXN0LT5tU3RyZWFtSWR4TGlzdC5wdXNoX2JhY2soc3RyZWFtQW5kV2luZG93SWQuc3RyZWFtSWQpOworICAgICAgICByZXF1ZXN0LT5tU3VyZmFjZUlkeExpc3QucHVzaF9iYWNrKHN0cmVhbUFuZFdpbmRvd0lkLndpbmRvd0lkKTsKKyAgICB9CisgICAgcmV0dXJuIGNvcHlQaHlzaWNhbENhbWVyYVNldHRpbmdzKGhSZXF1ZXN0LnBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYocmVxdWVzdC0+bVBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MpKTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpzdWJtaXRSZXF1ZXN0TGlzdChjb25zdCBoaWRsX3ZlYzxIQ2FwdHVyZVJlcXVlc3Q+JiBoUmVxdWVzdExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyZWFtaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWJtaXRSZXF1ZXN0TGlzdF9jYiBfaGlkbF9jYikgeworICAgIGhhcmR3YXJlOjpjYW1lcmEyOjp1dGlsczo6U3VibWl0SW5mbyBzdWJtaXRJbmZvOworICAgIEhTdWJtaXRJbmZvIGhTdWJtaXRJbmZvOworICAgIC8qKgorICAgICAqIENyZWF0ZSBBSURMIENhcHR1cmVSZXF1ZXN0IGZyb20gcmVxdWVzdExpc3QgYW5kIGdyYXBoaWNCdWZmZXJQcm9kdWNlcnMuCisgICAgICovCisgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OmNhbWVyYTI6OkNhcHR1cmVSZXF1ZXN0PiByZXF1ZXN0czsKKyAgICBmb3IgKGF1dG8gJmhSZXF1ZXN0IDogaFJlcXVlc3RMaXN0KSB7CisgICAgICAgIHJlcXVlc3RzLmVtcGxhY2VfYmFjaygpOworICAgICAgICBhdXRvICZyZXF1ZXN0ID0gcmVxdWVzdHMuYmFjaygpOworICAgICAgICBpZiAoIWNvbnZlcnRSZXF1ZXN0RnJvbUhpZGwoaFJlcXVlc3QsICZyZXF1ZXN0KSkgeworICAgICAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVCwgaFN1Ym1pdEluZm8pOworICAgICAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBtRGV2aWNlUmVtb3RlLT5zdWJtaXRSZXF1ZXN0TGlzdChyZXF1ZXN0cywgc3RyZWFtaW5nLCAmc3VibWl0SW5mbyk7CisgICAgbVJlcXVlc3RJZCA9IHN1Ym1pdEluZm8ubVJlcXVlc3RJZDsKKyAgICBjb252ZXJ0VG9IaWRsKHN1Ym1pdEluZm8sICZoU3VibWl0SW5mbyk7CisgICAgX2hpZGxfY2IoSFN0YXR1czo6Tk9fRVJST1IsIGhTdWJtaXRJbmZvKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmNhbmNlbFJlcGVhdGluZ1JlcXVlc3QoY2FuY2VsUmVwZWF0aW5nUmVxdWVzdF9jYiBfaGlkbF9jYikgeworICAgIGludDY0X3QgbGFzdEZyYW1lTnVtYmVyID0gMDsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT5jYW5jZWxSZXF1ZXN0KG1SZXF1ZXN0SWQsICZsYXN0RnJhbWVOdW1iZXIpOworICAgIF9oaWRsX2NiKEIySFN0YXR1cyhyZXQpLCBsYXN0RnJhbWVOdW1iZXIpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxIU3RhdHVzPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6YmVnaW5Db25maWd1cmUoKSB7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+YmVnaW5Db25maWd1cmUoKTsKKyAgICByZXR1cm4gQjJIU3RhdHVzKHJldCk7Cit9CisKK1JldHVybjxIU3RhdHVzPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6ZW5kQ29uZmlndXJlKFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlIG9wZXJhdGluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3ZlYzx1aW50OF90PiYgc2Vzc2lvblBhcmFtcykgeworICAgIGFuZHJvaWQ6OkNhbWVyYU1ldGFkYXRhIGNhbWVyYU1ldGFkYXRhOworICAgIGlmICghY29udmVydEZyb21IaWRsKHNlc3Npb25QYXJhbXMsICZjYW1lcmFNZXRhZGF0YSkpIHsKKyAgICAgICAgcmV0dXJuIEhTdGF0dXM6OklMTEVHQUxfQVJHVU1FTlQ7CisgICAgfQorCisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+ZW5kQ29uZmlndXJlKGNvbnZlcnRGcm9tSGlkbChvcGVyYXRpbmdNb2RlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FtZXJhTWV0YWRhdGEpOworICAgIHJldHVybiBCMkhTdGF0dXMocmV0KTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpkZWxldGVTdHJlYW0oaW50MzJfdCBzdHJlYW1JZCkgeworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPmRlbGV0ZVN0cmVhbShzdHJlYW1JZCk7CisgICAgcmV0dXJuIEIySFN0YXR1cyhyZXQpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmNyZWF0ZVN0cmVhbShjb25zdCBIT3V0cHV0Q29uZmlndXJhdGlvbiYgaE91dHB1dENvbmZpZ3VyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVTdHJlYW1fY2IgaGlkbF9jYl8pIHsKKyAgICBPdXRwdXRDb25maWd1cmF0aW9uIG91dHB1dENvbmZpZ3VyYXRpb24gPQorICAgICAgICBjb252ZXJ0RnJvbUhpZGwoaE91dHB1dENvbmZpZ3VyYXRpb24pOworICAgIGludDMyX3QgbmV3U3RyZWFtSWQgPSAwOworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPmNyZWF0ZVN0cmVhbShvdXRwdXRDb25maWd1cmF0aW9uLCAmbmV3U3RyZWFtSWQpOworICAgIEhTdGF0dXMgc3RhdHVzID0gQjJIU3RhdHVzKHJldCk7CisgICAgaGlkbF9jYl8oc3RhdHVzLCBuZXdTdHJlYW1JZCk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjpjcmVhdGVEZWZhdWx0UmVxdWVzdChUZW1wbGF0ZUlkIHRlbXBsYXRlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZURlZmF1bHRSZXF1ZXN0X2NiIF9oaWRsX2NiKSB7CisgICAgYW5kcm9pZDo6Q2FtZXJhTWV0YWRhdGEgY2FtZXJhTWV0YWRhdGE7CisgICAgYmluZGVyOjpTdGF0dXMgcmV0ID0gbURldmljZVJlbW90ZS0+Y3JlYXRlRGVmYXVsdFJlcXVlc3QoY29udmVydEZyb21IaWRsKHRlbXBsYXRlSWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjYW1lcmFNZXRhZGF0YSk7CisgICAgSFN0YXR1cyBoU3RhdHVzID0gQjJIU3RhdHVzKHJldCk7CisgICAgSENhbWVyYU1ldGFkYXRhIGhpZGxNZXRhZGF0YTsKKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3TWV0YWRhdGEgPSBjYW1lcmFNZXRhZGF0YS5nZXRBbmRMb2NrKCk7CisgICAgY29udmVydFRvSGlkbChyYXdNZXRhZGF0YSwgJmhpZGxNZXRhZGF0YSk7CisgICAgX2hpZGxfY2IoaFN0YXR1cywgaGlkbE1ldGFkYXRhKTsKKyAgICBjYW1lcmFNZXRhZGF0YS51bmxvY2socmF3TWV0YWRhdGEpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxIU3RhdHVzPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6d2FpdFVudGlsSWRsZSgpIHsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT53YWl0VW50aWxJZGxlKCk7CisgICAgcmV0dXJuIEIySFN0YXR1cyhyZXQpOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYURldmljZVVzZXI6OmZsdXNoKGZsdXNoX2NiIF9oaWRsX2NiKSB7CisgICAgaW50NjRfdCBsYXN0RnJhbWVOdW1iZXIgPSAwOworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPmZsdXNoKCZsYXN0RnJhbWVOdW1iZXIpOworICAgIF9oaWRsX2NiKEIySFN0YXR1cyhyZXQpLGxhc3RGcmFtZU51bWJlcik7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPEhTdGF0dXM+IEhpZGxDYW1lcmFEZXZpY2VVc2VyOjp1cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKAorICAgIGludDMyX3Qgc3RyZWFtSWQsCisgICAgY29uc3QgSE91dHB1dENvbmZpZ3VyYXRpb24mIGhPdXRwdXRDb25maWd1cmF0aW9uKSB7CisgICAgT3V0cHV0Q29uZmlndXJhdGlvbiBvdXRwdXRDb25maWd1cmF0aW9uID0gY29udmVydEZyb21IaWRsKGhPdXRwdXRDb25maWd1cmF0aW9uKTsKKyAgICBiaW5kZXI6OlN0YXR1cyByZXQgPSBtRGV2aWNlUmVtb3RlLT51cGRhdGVPdXRwdXRDb25maWd1cmF0aW9uKHN0cmVhbUlkLCBvdXRwdXRDb25maWd1cmF0aW9uKTsKKyAgICByZXR1cm4gQjJIU3RhdHVzKHJldCk7Cit9CisKK1JldHVybjx2b2lkPiBIaWRsQ2FtZXJhRGV2aWNlVXNlcjo6aXNTZXNzaW9uQ29uZmlndXJhdGlvblN1cHBvcnRlZCgKKyAgICBjb25zdCBIU2Vzc2lvbkNvbmZpZ3VyYXRpb24mIGhTZXNzaW9uQ29uZmlndXJhdGlvbiwKKyAgICBpc1Nlc3Npb25Db25maWd1cmF0aW9uU3VwcG9ydGVkX2NiIF9oaWRsX2NiKSB7CisgICAgYm9vbCBzdXBwb3J0ZWQgPSBmYWxzZTsKKyAgICBTZXNzaW9uQ29uZmlndXJhdGlvbiBzZXNzaW9uQ29uZmlndXJhdGlvbiA9IGNvbnZlcnRGcm9tSGlkbChoU2Vzc2lvbkNvbmZpZ3VyYXRpb24pOworICAgIGJpbmRlcjo6U3RhdHVzIHJldCA9IG1EZXZpY2VSZW1vdGUtPmlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgICAgICBzZXNzaW9uQ29uZmlndXJhdGlvbiwgJnN1cHBvcnRlZCk7CisgICAgSFN0YXR1cyBzdGF0dXMgPSBCMkhTdGF0dXMocmV0KTsKKyAgICBfaGlkbF9jYihzdGF0dXMsIHN1cHBvcnRlZCk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworfSAvLyBpbXBsZW1lbnRhdGlvbgorfSAvLyBWMl8wCit9IC8vIGRldmljZQorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvaGlkbC9IaWRsQ2FtZXJhRGV2aWNlVXNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYTgwZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFEZXZpY2VVc2VyLmgKQEAgLTAsMCArMSwxMzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfRlJBTUVXT1JLU19DQU1FUkFERVZJQ0VVU0VSX1YyXzBfQ0FNRVJBREVWSUNFVVNFUl9ICisjZGVmaW5lIEFORFJPSURfRlJBTUVXT1JLU19DQU1FUkFERVZJQ0VVU0VSX1YyXzBfQ0FNRVJBREVWSUNFVVNFUl9ICisKKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvY29tbW9uLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL3R5cGVzLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvZGV2aWNlLzIuMC9JQ2FtZXJhRGV2aWNlVXNlci5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL2RldmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL2NhbWVyYTIvSUNhbWVyYURldmljZUNhbGxiYWNrcy5oPgorI2luY2x1ZGUgPGZtcS9NZXNzYWdlUXVldWUuaD4KKyNpbmNsdWRlIDxoaWRsL01RRGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGhpZGwvU3RhdHVzLmg+CisKKyNpbmNsdWRlIDxDYW1lcmFTZXJ2aWNlLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKK25hbWVzcGFjZSBmcmFtZXdvcmtzIHsKK25hbWVzcGFjZSBjYW1lcmFzZXJ2aWNlIHsKK25hbWVzcGFjZSBkZXZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTdHJlYW1Db25maWd1cmF0aW9uTW9kZTsKK3VzaW5nIGhhcmR3YXJlOjpjYW1lcmEyOjpDYXB0dXJlUmVxdWVzdDsKK3VzaW5nIGhhcmR3YXJlOjpoaWRsX3ZlYzsKK3VzaW5nIGhhcmR3YXJlOjprU3luY2hyb25pemVkUmVhZFdyaXRlOwordXNpbmcgaGFyZHdhcmU6Ok1lc3NhZ2VRdWV1ZTsKK3VzaW5nIGhhcmR3YXJlOjpNUURlc2NyaXB0b3JTeW5jOwordXNpbmcgaGFyZHdhcmU6OlJldHVybjsKK3VzaW5nIENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlID0gTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwordXNpbmcgQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gTWVzc2FnZVF1ZXVlPHVpbnQ4X3QsIGtTeW5jaHJvbml6ZWRSZWFkV3JpdGU+OwordXNpbmcgVGVtcGxhdGVJZCA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6VGVtcGxhdGVJZDsKKwordXNpbmcgSENhbWVyYURldmljZVVzZXIgPSBkZXZpY2U6OlYyXzA6OklDYW1lcmFEZXZpY2VVc2VyOwordXNpbmcgSENhbWVyYU1ldGFkYXRhID0gY2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBIQ2FwdHVyZVJlcXVlc3QgPSBkZXZpY2U6OlYyXzA6OkNhcHR1cmVSZXF1ZXN0OwordXNpbmcgSFNlc3Npb25Db25maWd1cmF0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpTZXNzaW9uQ29uZmlndXJhdGlvbjsKK3VzaW5nIEhPdXRwdXRDb25maWd1cmF0aW9uID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6ZGV2aWNlOjpWMl8wOjpPdXRwdXRDb25maWd1cmF0aW9uOwordXNpbmcgSFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3MgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpkZXZpY2U6OlYyXzA6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M7Cit1c2luZyBIU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpTdGF0dXM7CisKK3N0YXRpYyBjb25zdGV4cHIgaW50MzJfdCBSRVFVRVNUX0lEX05PTkUgPSAtMTsKKworc3RydWN0IEhpZGxDYW1lcmFEZXZpY2VVc2VyIGZpbmFsIDogcHVibGljIEhDYW1lcmFEZXZpY2VVc2VyIHsKKyAgICBIaWRsQ2FtZXJhRGV2aWNlVXNlcihjb25zdCBzcDxoYXJkd2FyZTo6Y2FtZXJhMjo6SUNhbWVyYURldmljZVVzZXI+ICZkZXZpY2VSZW1vdGUpOworCisgICAgfkhpZGxDYW1lcmFEZXZpY2VVc2VyKCkgeyB9CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBkaXNjb25uZWN0KCkgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBnZXRDYXB0dXJlUmVxdWVzdE1ldGFkYXRhUXVldWUoCisgICAgICAgIGdldENhcHR1cmVSZXF1ZXN0TWV0YWRhdGFRdWV1ZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjx2b2lkPiBnZXRDYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSgKKyAgICAgICAgZ2V0Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWVfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48dm9pZD4gc3VibWl0UmVxdWVzdExpc3QoY29uc3QgaGlkbF92ZWM8SENhcHR1cmVSZXF1ZXN0PiYgcmVxdWVzdExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzdHJlYW1pbmcsIHN1Ym1pdFJlcXVlc3RMaXN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNhbmNlbFJlcGVhdGluZ1JlcXVlc3QoY2FuY2VsUmVwZWF0aW5nUmVxdWVzdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICB2aXJ0dWFsIFJldHVybjxIU3RhdHVzPiBiZWdpbkNvbmZpZ3VyZSgpIG92ZXJyaWRlOworCisgICAgdmlydHVhbCBSZXR1cm48SFN0YXR1cz4gZW5kQ29uZmlndXJlKFN0cmVhbUNvbmZpZ3VyYXRpb25Nb2RlIG9wZXJhdGluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfdmVjPHVpbnQ4X3Q+JiBzZXNzaW9uUGFyYW1zKTsKKworICAgIHZpcnR1YWwgUmV0dXJuPEhTdGF0dXM+IGRlbGV0ZVN0cmVhbShpbnQzMl90IHN0cmVhbUlkKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGNyZWF0ZVN0cmVhbShjb25zdCBIT3V0cHV0Q29uZmlndXJhdGlvbiYgb3V0cHV0Q29uZmlndXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3JlYXRlU3RyZWFtX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBjcmVhdGVEZWZhdWx0UmVxdWVzdChUZW1wbGF0ZUlkIHRlbXBsYXRlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZURlZmF1bHRSZXF1ZXN0X2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPEhTdGF0dXM+IHdhaXRVbnRpbElkbGUoKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGZsdXNoKGZsdXNoX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPEhTdGF0dXM+IHVwZGF0ZU91dHB1dENvbmZpZ3VyYXRpb24oCisgICAgICAgIGludDMyX3Qgc3RyZWFtSWQsIGNvbnN0IEhPdXRwdXRDb25maWd1cmF0aW9uJiBvdXRwdXRDb25maWd1cmF0aW9uKSBvdmVycmlkZTsKKworICAgIHZpcnR1YWwgUmV0dXJuPHZvaWQ+IGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWQoCisgICAgICAgIGNvbnN0IEhTZXNzaW9uQ29uZmlndXJhdGlvbiYgc2Vzc2lvbkNvbmZpZ3VyYXRpb24sCisgICAgICAgIGlzU2Vzc2lvbkNvbmZpZ3VyYXRpb25TdXBwb3J0ZWRfY2IgX2hpZGxfY2IpIG92ZXJyaWRlOworCisgICAgYm9vbCBpbml0U3RhdHVzKCkgeyByZXR1cm4gbUluaXRTdWNjZXNzOyB9CisKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+IGdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKCkgeworICAgICAgICByZXR1cm4gbUNhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlOworICAgIH0KKworIHByaXZhdGU6CisgICAgYm9vbCBpbml0RGV2aWNlKCk7CisKKyAgICBib29sIGNvbnZlcnRSZXF1ZXN0RnJvbUhpZGwoY29uc3QgSENhcHR1cmVSZXF1ZXN0ICZoUmVxdWVzdCwgQ2FwdHVyZVJlcXVlc3QgKnJlcXVlc3QpOworCisgICAgYm9vbCBjb3B5UGh5c2ljYWxDYW1lcmFTZXR0aW5ncygKKyAgICAgICAgY29uc3QgaGlkbF92ZWM8SFBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+ICZoUGh5c2ljYWxDYW1lcmFTZXR0aW5ncywKKyAgICAgICAgc3RkOjp2ZWN0b3I8Q2FwdHVyZVJlcXVlc3Q6OlBoeXNpY2FsQ2FtZXJhU2V0dGluZ3M+ICpwaHlzaWNhbENhbWVyYVNldHRpbmdzKTsKKworICAgIGNvbnN0IHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlVXNlcj4gbURldmljZVJlbW90ZTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Q2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlPiBtQ2FwdHVyZVJlcXVlc3RNZXRhZGF0YVF1ZXVlID0gbnVsbHB0cjsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8Q2FwdHVyZVJlc3VsdE1ldGFkYXRhUXVldWU+IG1DYXB0dXJlUmVzdWx0TWV0YWRhdGFRdWV1ZSA9IG51bGxwdHI7CisgICAgYm9vbCBtSW5pdFN1Y2Nlc3MgPSBmYWxzZTsKKyAgICBpbnQzMl90IG1SZXF1ZXN0SWQgPSBSRVFVRVNUX0lEX05PTkU7Cit9OworCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gZGV2aWNlCit9IC8vIGNhbWVyYXNlcnZpY2UKK30gLy8gZnJhbWV3b3JrcworfSAvLyBhbmRyb2lkCisjZW5kaWYgLy8gQU5EUk9JRF9GUkFNRU9XT1JLU19DQU1FUkFERVZJQ0VVU0VSX1YyXzBfQ0FNRVJBREVWSUNFVVNFUl9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYWEwMzUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmNwcApAQCAtMCwwICsxLDI4MiBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxoaWRsL0NvbnZlcnQuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbENhbWVyYVNlcnZpY2UuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbENhbWVyYURldmljZVVzZXIuaD4KKyNpbmNsdWRlIDxoaWRsL0FpZGxDYW1lcmFEZXZpY2VDYWxsYmFja3MuaD4KKyNpbmNsdWRlIDxoaWRsL0FpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIuaD4KKworI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGZyYW1ld29ya3MgeworbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UgeworbmFtZXNwYWNlIHNlcnZpY2UgeworbmFtZXNwYWNlIFYyXzAgeworbmFtZXNwYWNlIGltcGxlbWVudGF0aW9uIHsKKwordXNpbmcgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6aW1wbGVtZW50YXRpb246OkhpZGxDYW1lcmFTZXJ2aWNlOwordXNpbmcgaGFyZHdhcmU6OmhpZGxfdmVjOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpjb252ZXJ0VG9IaWRsOwordXNpbmcgaGFyZHdhcmU6OmNhbWVyYXNlcnZpY2U6OnV0aWxzOjpjb252ZXJzaW9uOjpCMkhTdGF0dXM7Cit1c2luZyBoYXJkd2FyZTo6Vm9pZDsKKwordXNpbmcgZGV2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SDJCQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzOwordXNpbmcgZGV2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SGlkbENhbWVyYURldmljZVVzZXI7Cit1c2luZyBzZXJ2aWNlOjpWMl8wOjppbXBsZW1lbnRhdGlvbjo6SDJCQ2FtZXJhU2VydmljZUxpc3RlbmVyOwordXNpbmcgSENhbWVyYU1ldGFkYXRhVHlwZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6Q2FtZXJhTWV0YWRhdGFUeXBlOwordXNpbmcgSFZlbmRvclRhZyA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmNvbW1vbjo6VjJfMDo6VmVuZG9yVGFnOwordXNpbmcgSFZlbmRvclRhZ1NlY3Rpb24gPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpjb21tb246OlYyXzA6OlZlbmRvclRhZ1NlY3Rpb247Cit1c2luZyBIUHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zID0KKyAgICAgICAgZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpQcm92aWRlcklkQW5kVmVuZG9yVGFnU2VjdGlvbnM7CisKK3NwPEhpZGxDYW1lcmFTZXJ2aWNlPiBnSGlkbENhbWVyYVNlcnZpY2U7CisKK3NwPEhpZGxDYW1lcmFTZXJ2aWNlPiBIaWRsQ2FtZXJhU2VydmljZTo6Z2V0SW5zdGFuY2UoYW5kcm9pZDo6Q2FtZXJhU2VydmljZSAqY3MpIHsKKyAgICBnSGlkbENhbWVyYVNlcnZpY2UgPSBuZXcgSGlkbENhbWVyYVNlcnZpY2UoY3MpOworICAgIHJldHVybiBnSGlkbENhbWVyYVNlcnZpY2U7Cit9CisKK1JldHVybjx2b2lkPgorSGlkbENhbWVyYVNlcnZpY2U6OmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhjb25zdCBoaWRsX3N0cmluZyYgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldENhbWVyYUNoYXJhY3RlcmlzdGljc19jYiBfaGlkbF9jYikgeworICAgIGFuZHJvaWQ6OkNhbWVyYU1ldGFkYXRhIGNhbWVyYU1ldGFkYXRhOworICAgIEhTdGF0dXMgc3RhdHVzID0gSFN0YXR1czo6Tk9fRVJST1I7CisgICAgYmluZGVyOjpTdGF0dXMgc2VydmljZVJldCA9CisgICAgICAgIG1BaWRsSUNhbWVyYVNlcnZpY2UtPmdldENhbWVyYUNoYXJhY3RlcmlzdGljcyhTdHJpbmcxNihjYW1lcmFJZC5jX3N0cigpKSwgJmNhbWVyYU1ldGFkYXRhKTsKKyAgICBIQ2FtZXJhTWV0YWRhdGEgaGlkbE1ldGFkYXRhOworICAgIGlmICghc2VydmljZVJldC5pc09rKCkpIHsKKyAgICAgICAgc3dpdGNoKHNlcnZpY2VSZXQuc2VydmljZVNwZWNpZmljRXJyb3JDb2RlKCkpIHsKKyAgICAgICAgICAgIC8vIE5vIEVSUk9SX0NBTUVSQV9ESVNDT05ORUNURUQgc2luY2Ugd2UncmUgaW4gdGhlIHNhbWUgcHJvY2Vzcy4KKyAgICAgICAgICAgIGNhc2UgaGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlOjpFUlJPUl9JTExFR0FMX0FSR1VNRU5UOgorICAgICAgICAgICAgICAgIEFMT0dFKCIlczogQ2FtZXJhIElEICVzIGRvZXMgbm90IGV4aXN0ISIsIF9fRlVOQ1RJT05fXywgY2FtZXJhSWQuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgQUxPR0UoIkdldCBjYW1lcmEgY2hhcmFjdGVyaXN0aWNzIGZyb20gY2FtZXJhIHNlcnZpY2UgZmFpbGVkOiAlcyIsCisgICAgICAgICAgICAgICAgICAgICAgc2VydmljZVJldC50b1N0cmluZzgoKS5zdHJpbmcoKSk7CisgICAgICAgICAgICAgICAgc3RhdHVzID0gQjJIU3RhdHVzKHNlcnZpY2VSZXQpOworICAgICAgICAgIH0KKyAgICAgICAgX2hpZGxfY2Ioc3RhdHVzLCBoaWRsTWV0YWRhdGEpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBjb25zdCBjYW1lcmFfbWV0YWRhdGFfdCAqcmF3TWV0YWRhdGEgPSBjYW1lcmFNZXRhZGF0YS5nZXRBbmRMb2NrKCk7CisgICAgY29udmVydFRvSGlkbChyYXdNZXRhZGF0YSwgJmhpZGxNZXRhZGF0YSk7CisgICAgX2hpZGxfY2Ioc3RhdHVzLCBoaWRsTWV0YWRhdGEpOworICAgIGNhbWVyYU1ldGFkYXRhLnVubG9jayhyYXdNZXRhZGF0YSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFTZXJ2aWNlOjpjb25uZWN0RGV2aWNlKGNvbnN0IHNwPEhDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGhDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBoaWRsX3N0cmluZyYgY2FtZXJhSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29ubmVjdERldmljZV9jYiBfaGlkbF9jYikgeworICAgIC8vIEhlcmUsIHdlIGZpcnN0IGdldCBJQ2FtZXJhRGV2aWNlVXNlciBmcm9tIG1BaWRsSUNhbWVyYVNlcnZpY2UsIHRoZW4gc2F2ZQorICAgIC8vIHRoYXQgaW50ZXJmYWNlIGluIHRoZSBuZXdseSBjcmVhdGVkIEhpZGxDYW1lcmFEZXZpY2VVc2VyIGltcGwgY2xhc3MuCisgICAgaWYgKG1BaWRsSUNhbWVyYVNlcnZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpVTktOT1dOX0VSUk9SLCBudWxscHRyKTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgc3A8aGFyZHdhcmU6OmNhbWVyYTI6OklDYW1lcmFEZXZpY2VVc2VyPiBkZXZpY2VSZW1vdGUgPSBudWxscHRyOworICAgIC8vIENyZWF0ZSBhIGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2sgb2JqZWN0IHdoaWNoIGludGVybmFsbHkKKyAgICAvLyBjYWxscyBjYWxsYmFjayBmdW5jdGlvbnMgcGFzc2VkIHRocm91Z2ggaENhbGxiYWNrLgorICAgIHNwPEgyQkNhbWVyYURldmljZUNhbGxiYWNrcz4gaHlicmlkQ2FsbGJhY2tzID0gbmV3IEgyQkNhbWVyYURldmljZUNhbGxiYWNrcyhoQ2FsbGJhY2spOworICAgIGlmICghaHlicmlkQ2FsbGJhY2tzLT5pbml0aWFsaXplTG9vcGVyKCkpIHsKKyAgICAgICAgQUxPR0UoIlVuYWJsZSB0byBoYW5kbGUgY2FsbGJhY2tzIG9uIGRldmljZSwgY2Fubm90IGNvbm5lY3QiKTsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6VU5LTk9XTl9FUlJPUiwgbnVsbHB0cik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIHNwPGhhcmR3YXJlOjpjYW1lcmEyOjpJQ2FtZXJhRGV2aWNlQ2FsbGJhY2tzPiBjYWxsYmFja3MgPSBoeWJyaWRDYWxsYmFja3M7CisgICAgYmluZGVyOjpTdGF0dXMgc2VydmljZVJldCA9IG1BaWRsSUNhbWVyYVNlcnZpY2UtPmNvbm5lY3REZXZpY2UoCisgICAgICAgICAgICBjYWxsYmFja3MsIFN0cmluZzE2KGNhbWVyYUlkLmNfc3RyKCkpLCBTdHJpbmcxNigiIiksCisgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OlVTRV9DQUxMSU5HX1VJRCwgLypvdXQqLyZkZXZpY2VSZW1vdGUpOworICAgIEhTdGF0dXMgc3RhdHVzID0gSFN0YXR1czo6Tk9fRVJST1I7CisgICAgaWYgKCFzZXJ2aWNlUmV0LmlzT2soKSkgeworICAgICAgICBBTE9HRSgiJXM6IFVuYWJsZSB0byBjb25uZWN0IHRvIGNhbWVyYSBkZXZpY2UiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICBzdGF0dXMgPSBCMkhTdGF0dXMoc2VydmljZVJldCk7CisgICAgICAgIF9oaWRsX2NiKHN0YXR1cywgbnVsbHB0cik7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIC8vIE5vdyB3ZSBjcmVhdGUgYSBIaWRsQ2FtZXJhRGV2aWNlVXNlciBjbGFzcywgc3RvcmUgdGhlIGRldmljZVJlbW90ZSBpbiBpdCwKKyAgICAvLyBhbmQgcmV0dXJuIHRoYXQgYmFjay4gQWxsIGNhbGxzIG9uIHRoYXQgaW50ZXJmYWNlIHdpbGwgYmUgZm9yd2FyZGVkIHRvCisgICAgLy8gdGhlIEFJREwgaW50ZXJmYWNlLgorICAgIHNwPEhpZGxDYW1lcmFEZXZpY2VVc2VyPiBoRGV2aWNlUmVtb3RlID0gbmV3IEhpZGxDYW1lcmFEZXZpY2VVc2VyKGRldmljZVJlbW90ZSk7CisgICAgaWYgKCFoRGV2aWNlUmVtb3RlLT5pbml0U3RhdHVzKCkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBVbmFibGUgdG8gaW5pdGlhbGl6ZSBjYW1lcmEgZGV2aWNlIEhJREwgd3JhcHBlciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OlVOS05PV05fRVJST1IsIG51bGxwdHIpOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBoeWJyaWRDYWxsYmFja3MtPnNldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKGhEZXZpY2VSZW1vdGUtPmdldENhcHR1cmVSZXN1bHRNZXRhZGF0YVF1ZXVlKCkpOworICAgIF9oaWRsX2NiKHN0YXR1cywgaERldmljZVJlbW90ZSk7CisgICAgcmV0dXJuIFZvaWQoKTsKK30KKwordm9pZCBIaWRsQ2FtZXJhU2VydmljZTo6YWRkVG9MaXN0ZW5lckNhY2hlTG9ja2VkKHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGhMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gY3NMaXN0ZW5lcikgeworICAgICAgICBtTGlzdGVuZXJzLmVtcGxhY2VfYmFjayhzdGQ6Om1ha2VfcGFpcihoTGlzdGVuZXIsIGNzTGlzdGVuZXIpKTsKK30KKworc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+CitIaWRsQ2FtZXJhU2VydmljZTo6c2VhcmNoTGlzdGVuZXJDYWNoZUxvY2tlZChzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBoTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNob3VsZFJlbW92ZSkgeworICAgIC8vIEdvIHRocm91Z2ggdGhlIG1MaXN0ZW5lcnMgbGlzdCBhbmQgY29tcGFyZSB0aGUgbGlzdGVuZXIgd2l0aCB0aGUgSElETAorICAgIC8vIGxpc3RlbmVyIHJlZ2lzdGVyZWQuCisgICAgYXV0byBpdCA9IG1MaXN0ZW5lcnMuYmVnaW4oKTsKKyAgICBzcDxJQ2FtZXJhU2VydmljZUxpc3RlbmVyPiBjc0xpc3RlbmVyID0gbnVsbHB0cjsKKyAgICBmb3IgKDtpdCAhPSBtTGlzdGVuZXJzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIGlmIChoYXJkd2FyZTo6aW50ZXJmYWNlc0VxdWFsKGl0LT5maXJzdCwgaExpc3RlbmVyKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGl0ICE9IG1MaXN0ZW5lcnMuZW5kKCkpIHsKKyAgICAgICAgY3NMaXN0ZW5lciA9IGl0LT5zZWNvbmQ7CisgICAgICAgIGlmIChzaG91bGRSZW1vdmUpIHsKKyAgICAgICAgICBtTGlzdGVuZXJzLmVyYXNlKGl0KTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gY3NMaXN0ZW5lcjsKK30KKworUmV0dXJuPHZvaWQ+IEhpZGxDYW1lcmFTZXJ2aWNlOjphZGRMaXN0ZW5lcihjb25zdCBzcDxIQ2FtZXJhU2VydmljZUxpc3RlbmVyPiYgaENzTGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZExpc3RlbmVyX2NiIF9oaWRsX2NiKSB7CisgICAgaWYgKG1BaWRsSUNhbWVyYVNlcnZpY2UgPT0gbnVsbHB0cikgeworICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpVTktOT1dOX0VSUk9SLCB7fSk7CisgICAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIGlmIChoQ3NMaXN0ZW5lciA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcyBsaXN0ZW5lciBtdXN0IG5vdCBiZSBOVUxMIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVCwge30pOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKyAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gY3NMaXN0ZW5lciA9IG51bGxwdHI7CisgICAgLy8gQ2hlY2sgdGhlIGNhY2hlIGZvciBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgY2FsbGJhY2tzCisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTGlzdGVuZXJMaXN0TG9jayk7CisgICAgICAgIGNzTGlzdGVuZXIgPSBzZWFyY2hMaXN0ZW5lckNhY2hlTG9ja2VkKGhDc0xpc3RlbmVyKTsKKyAgICAgICAgaWYgKGNzTGlzdGVuZXIgPT0gbnVsbHB0cikgeworICAgICAgICAgICAgLy8gV3JhcCBhbiBoQ3NMaXN0ZW5lciB3aXRoIEFpZGxDYW1lcmFTZXJ2aWNlTGlzdGVuZXIgYW5kIHBhc3MgaXQgdG8KKyAgICAgICAgICAgIC8vIENhbWVyYVNlcnZpY2UuCisgICAgICAgICAgICBjc0xpc3RlbmVyID0gbmV3IEgyQkNhbWVyYVNlcnZpY2VMaXN0ZW5lcihoQ3NMaXN0ZW5lcik7CisgICAgICAgICAgICAvLyBBZGQgdG8gY2FjaGUKKyAgICAgICAgICAgIGFkZFRvTGlzdGVuZXJDYWNoZUxvY2tlZChoQ3NMaXN0ZW5lciwgY3NMaXN0ZW5lcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRyeWluZyB0byBhZGQgYSBsaXN0ZW5lciAlcCBhbHJlYWR5IHJlZ2lzdGVyZWQiLAorICAgICAgICAgICAgICAgICAgX19GVU5DVElPTl9fLCBoQ3NMaXN0ZW5lci5nZXQoKSk7CisgICAgICAgICAgICBfaGlkbF9jYihIU3RhdHVzOjpJTExFR0FMX0FSR1VNRU5ULCB7fSk7CisgICAgICAgICAgICByZXR1cm4gVm9pZCgpOworICAgICAgICB9CisgICAgfQorICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpDYW1lcmFTdGF0dXM+IGNhbWVyYVN0YXR1c0FuZElkc3t9OworICAgIGJpbmRlcjo6U3RhdHVzIHNlcnZpY2VSZXQgPQorICAgICAgICBtQWlkbElDYW1lcmFTZXJ2aWNlLT5hZGRMaXN0ZW5lckhlbHBlcihjc0xpc3RlbmVyLCAmY2FtZXJhU3RhdHVzQW5kSWRzLCB0cnVlKTsKKyAgICBIU3RhdHVzIHN0YXR1cyA9IEhTdGF0dXM6Ok5PX0VSUk9SOworICAgIGlmICghc2VydmljZVJldC5pc09rKCkpIHsKKyAgICAgIEFMT0dFKCIlczogVW5hYmxlIHRvIGFkZCBjYW1lcmEgZGV2aWNlIHN0YXR1cyBsaXN0ZW5lciIsIF9fRlVOQ1RJT05fXyk7CisgICAgICBzdGF0dXMgPSBCMkhTdGF0dXMoc2VydmljZVJldCk7CisgICAgICBfaGlkbF9jYihzdGF0dXMsIHt9KTsKKyAgICAgIHJldHVybiBWb2lkKCk7CisgICAgfQorICAgIGNhbWVyYVN0YXR1c0FuZElkcy5lcmFzZShzdGQ6OnJlbW92ZV9pZihjYW1lcmFTdGF0dXNBbmRJZHMuYmVnaW4oKSwgY2FtZXJhU3RhdHVzQW5kSWRzLmVuZCgpLAorICAgICAgICAgICAgW3RoaXNdKGNvbnN0IGhhcmR3YXJlOjpDYW1lcmFTdGF0dXMmIHMpIHsKKyAgICAgICAgICAgICAgYm9vbCBzdXBwb3J0c0hBTDMgPSBmYWxzZTsKKyAgICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgc1JldCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUFpZGxJQ2FtZXJhU2VydmljZS0+c3VwcG9ydHNDYW1lcmFBcGkoU3RyaW5nMTYocy5jYW1lcmFJZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2U6OkFQSV9WRVJTSU9OXzIsICZzdXBwb3J0c0hBTDMpOworICAgICAgICAgICAgICByZXR1cm4gIXNSZXQuaXNPaygpIHx8ICFzdXBwb3J0c0hBTDM7CisgICAgICAgICAgICB9KSwgY2FtZXJhU3RhdHVzQW5kSWRzLmVuZCgpKTsKKyAgICBoaWRsX3ZlYzxIQ2FtZXJhU3RhdHVzQW5kSWQ+IGhDYW1lcmFTdGF0dXNBbmRJZHM7CisgICAgLy9Db252ZXJ0IGNhbWVyYVN0YXR1c0FuZElkcyB0byBISURMIGFuZCBjYWxsIGNhbGxiYWNrCisgICAgY29udmVydFRvSGlkbChjYW1lcmFTdGF0dXNBbmRJZHMsICZoQ2FtZXJhU3RhdHVzQW5kSWRzKTsKKyAgICBfaGlkbF9jYihzdGF0dXMsIGhDYW1lcmFTdGF0dXNBbmRJZHMpOworICAgIHJldHVybiBWb2lkKCk7Cit9CisKK1JldHVybjxIU3RhdHVzPiBIaWRsQ2FtZXJhU2VydmljZTo6cmVtb3ZlTGlzdGVuZXIoY29uc3Qgc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGhDc0xpc3RlbmVyKSB7CisgICAgaWYgKGhDc0xpc3RlbmVyID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIiVzIGxpc3RlbmVyIG11c3Qgbm90IGJlIE5VTEwiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDsKKyAgICB9CisgICAgc3A8SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gY3NMaXN0ZW5lciA9IG51bGxwdHI7CisgICAgeworICAgICAgICBNdXRleDo6QXV0b2xvY2sgbChtTGlzdGVuZXJMaXN0TG9jayk7CisgICAgICAgIGNzTGlzdGVuZXIgPSBzZWFyY2hMaXN0ZW5lckNhY2hlTG9ja2VkKGhDc0xpc3RlbmVyLCAvKnJlbW92ZUlmRm91bmQqL3RydWUpOworICAgIH0KKyAgICBpZiAoY3NMaXN0ZW5lciAhPSBudWxscHRyKSB7CisgICAgICAgICAgbUFpZGxJQ2FtZXJhU2VydmljZS0+cmVtb3ZlTGlzdGVuZXIoY3NMaXN0ZW5lcik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR0UoIiVzIFJlbW92aW5nIHVucmVnaXN0ZXJlZCBsaXN0ZW5lciAlcCIsIF9fRlVOQ1RJT05fXywgaENzTGlzdGVuZXIuZ2V0KCkpOworICAgICAgICByZXR1cm4gSFN0YXR1czo6SUxMRUdBTF9BUkdVTUVOVDsKKyAgICB9CisgICAgcmV0dXJuIEhTdGF0dXM6Ok5PX0VSUk9SOworfQorCitSZXR1cm48dm9pZD4gSGlkbENhbWVyYVNlcnZpY2U6OmdldENhbWVyYVZlbmRvclRhZ1NlY3Rpb25zKGdldENhbWVyYVZlbmRvclRhZ1NlY3Rpb25zX2NiIF9oaWRsX2NiKSB7CisgICAgc3A8VmVuZG9yVGFnRGVzY3JpcHRvckNhY2hlPiBnQ2FjaGUgPSBWZW5kb3JUYWdEZXNjcmlwdG9yQ2FjaGU6OmdldEdsb2JhbFZlbmRvclRhZ0NhY2hlKCk7CisgICAgaWYgKGdDYWNoZSA9PSBudWxscHRyKSB7CisgICAgICAgIF9oaWRsX2NiKEhTdGF0dXM6OlVOS05PV05fRVJST1IsIHt9KTsKKyAgICAgICAgcmV0dXJuIFZvaWQoKTsKKyAgICB9CisgICAgY29uc3Qgc3RkOjp1bm9yZGVyZWRfbWFwPG1ldGFkYXRhX3ZlbmRvcl9pZF90LCBzcDxhbmRyb2lkOjpWZW5kb3JUYWdEZXNjcmlwdG9yPj4KKyAgICAgICAgICAgICZ2ZW5kb3JJZHNBbmRUYWdEZXNjcyA9IGdDYWNoZS0+Z2V0VmVuZG9ySWRzQW5kVGFnRGVzY3JpcHRvcnMoKTsKKyAgICBpZiAodmVuZG9ySWRzQW5kVGFnRGVzY3Muc2l6ZSgpID09IDApIHsKKyAgICAgICAgX2hpZGxfY2IoSFN0YXR1czo6VU5LTk9XTl9FUlJPUiwge30pOworICAgICAgICByZXR1cm4gVm9pZCgpOworICAgIH0KKworICAgIGhpZGxfdmVjPEhQcm92aWRlcklkQW5kVmVuZG9yVGFnU2VjdGlvbnM+IGhUYWdJZHNBbmRWZW5kb3JUYWdTZWN0aW9uczsKKyAgICBoVGFnSWRzQW5kVmVuZG9yVGFnU2VjdGlvbnMucmVzaXplKHZlbmRvcklkc0FuZFRhZ0Rlc2NzLnNpemUoKSk7CisgICAgc2l6ZV90IGogPSAwOworICAgIGZvciAoYXV0byAmdmVuZG9ySWRBbmRUYWdEZXNjcyA6IHZlbmRvcklkc0FuZFRhZ0Rlc2NzKSB7CisgICAgICAgIGhpZGxfdmVjPEhWZW5kb3JUYWdTZWN0aW9uPiBoVmVuZG9yVGFnU2VjdGlvbnM7CisgICAgICAgIHNwPFZlbmRvclRhZ0Rlc2NyaXB0b3I+IGRlc2MgPSB2ZW5kb3JJZEFuZFRhZ0Rlc2NzLnNlY29uZDsKKyAgICAgICAgY29uc3QgU29ydGVkVmVjdG9yPFN0cmluZzg+KiBzZWN0aW9uTmFtZXMgPSBkZXNjLT5nZXRBbGxTZWN0aW9uTmFtZXMoKTsKKyAgICAgICAgc2l6ZV90IG51bVNlY3Rpb25zID0gc2VjdGlvbk5hbWVzLT5zaXplKCk7CisgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPEhWZW5kb3JUYWc+PiB0YWdzQnlTZWN0aW9uKG51bVNlY3Rpb25zKTsKKyAgICAgICAgaW50IHRhZ0NvdW50ID0gZGVzYy0+Z2V0VGFnQ291bnQoKTsKKyAgICAgICAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IHRhZ3ModGFnQ291bnQpOworICAgICAgICBkZXNjLT5nZXRUYWdBcnJheSh0YWdzLmRhdGEoKSk7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFnQ291bnQ7IGkrKykgeworICAgICAgICAgICAgSFZlbmRvclRhZyB2dDsKKyAgICAgICAgICAgIHZ0LnRhZ0lkID0gdGFnc1tpXTsKKyAgICAgICAgICAgIHZ0LnRhZ05hbWUgPSBkZXNjLT5nZXRUYWdOYW1lKHRhZ3NbaV0pOworICAgICAgICAgICAgdnQudGFnVHlwZSA9IChIQ2FtZXJhTWV0YWRhdGFUeXBlKSBkZXNjLT5nZXRUYWdUeXBlKHRhZ3NbaV0pOworICAgICAgICAgICAgc3NpemVfdCBzZWN0aW9uSWR4ID0gZGVzYy0+Z2V0U2VjdGlvbkluZGV4KHRhZ3NbaV0pOworICAgICAgICAgICAgdGFnc0J5U2VjdGlvbltzZWN0aW9uSWR4XS5wdXNoX2JhY2sodnQpOworICAgICAgICB9CisgICAgICAgIGhWZW5kb3JUYWdTZWN0aW9ucy5yZXNpemUobnVtU2VjdGlvbnMpOworICAgICAgICBmb3IgKHNpemVfdCBzID0gMDsgcyA8IG51bVNlY3Rpb25zOyBzKyspIHsKKyAgICAgICAgICAgIGhWZW5kb3JUYWdTZWN0aW9uc1tzXS5zZWN0aW9uTmFtZSA9ICgqc2VjdGlvbk5hbWVzKVtzXS5zdHJpbmcoKTsKKyAgICAgICAgICAgIGhWZW5kb3JUYWdTZWN0aW9uc1tzXS50YWdzID0gdGFnc0J5U2VjdGlvbltzXTsKKyAgICAgICAgfQorICAgICAgICBIUHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zICZoUHJvdmlkZXJJZEFuZFZlbmRvclRhZ1NlY3Rpb25zID0KKyAgICAgICAgICAgICAgICBoVGFnSWRzQW5kVmVuZG9yVGFnU2VjdGlvbnNbal07CisgICAgICAgIGhQcm92aWRlcklkQW5kVmVuZG9yVGFnU2VjdGlvbnMucHJvdmlkZXJJZCA9IHZlbmRvcklkQW5kVGFnRGVzY3MuZmlyc3Q7CisgICAgICAgIGhQcm92aWRlcklkQW5kVmVuZG9yVGFnU2VjdGlvbnMudmVuZG9yVGFnU2VjdGlvbnMgPSBzdGQ6Om1vdmUoaFZlbmRvclRhZ1NlY3Rpb25zKTsKKyAgICAgICAgaisrOworICAgIH0KKyAgICBfaGlkbF9jYihIU3RhdHVzOjpOT19FUlJPUiwgaFRhZ0lkc0FuZFZlbmRvclRhZ1NlY3Rpb25zKTsKKyAgICByZXR1cm4gVm9pZCgpOworfQorCit9IC8vIGltcGxlbWVudGF0aW9uCit9IC8vIFYyXzAKK30gLy8gc2VydmljZQorfSAvLyBjYW1lcmFzZXJ2aWNlCit9IC8vIGZyYW1ld29ya3MKK30gLy8gYW5kcm9pZAorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS9oaWRsL0hpZGxDYW1lcmFTZXJ2aWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVhZDBiYwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL2hpZGwvSGlkbENhbWVyYVNlcnZpY2UuaApAQCAtMCwwICsxLDk4IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE4IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBBTkRST0lEX0ZSQU1FV09SS1NfQ0FNRVJBU0VSVklDRV9WMl8wX0NBTUVSQVNFUlZJQ0VfSAorI2RlZmluZSBBTkRST0lEX0ZSQU1FV09SS1NfQ0FNRVJBU0VSVklDRV9WMl8wX0NBTUVSQVNFUlZJQ0VfSAorCisjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dGhyZWFkPgorCisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2UvY29tbW9uLzIuMC90eXBlcy5oPgorI2luY2x1ZGUgPGFuZHJvaWQvZnJhbWV3b3Jrcy9jYW1lcmFzZXJ2aWNlL3NlcnZpY2UvMi4wL0lDYW1lcmFTZXJ2aWNlLmg+CisjaW5jbHVkZSA8YW5kcm9pZC9mcmFtZXdvcmtzL2NhbWVyYXNlcnZpY2Uvc2VydmljZS8yLjAvdHlwZXMuaD4KKyNpbmNsdWRlIDxhbmRyb2lkL2ZyYW1ld29ya3MvY2FtZXJhc2VydmljZS9kZXZpY2UvMi4wL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxoaWRsL1N0YXR1cy5oPgorCisjaW5jbHVkZSA8Q2FtZXJhU2VydmljZS5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgZnJhbWV3b3JrcyB7CituYW1lc3BhY2UgY2FtZXJhc2VydmljZSB7CituYW1lc3BhY2Ugc2VydmljZSB7CituYW1lc3BhY2UgVjJfMCB7CituYW1lc3BhY2UgaW1wbGVtZW50YXRpb24geworCit1c2luZyBoYXJkd2FyZTo6aGlkbF9zdHJpbmc7Cit1c2luZyBoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcjsKK3VzaW5nIGhhcmR3YXJlOjpSZXR1cm47CisKK3VzaW5nIEhDYW1lcmFEZXZpY2VDYWxsYmFjayA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OmRldmljZTo6VjJfMDo6SUNhbWVyYURldmljZUNhbGxiYWNrOwordXNpbmcgSENhbWVyYU1ldGFkYXRhID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6c2VydmljZTo6VjJfMDo6Q2FtZXJhTWV0YWRhdGE7Cit1c2luZyBIQ2FtZXJhU2VydmljZSA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OklDYW1lcmFTZXJ2aWNlOwordXNpbmcgSENhbWVyYVNlcnZpY2VMaXN0ZW5lciA9IGZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyXzA6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI7Cit1c2luZyBIU3RhdHVzID0gZnJhbWV3b3Jrczo6Y2FtZXJhc2VydmljZTo6Y29tbW9uOjpWMl8wOjpTdGF0dXM7Cit1c2luZyBIQ2FtZXJhU3RhdHVzQW5kSWQgPSBmcmFtZXdvcmtzOjpjYW1lcmFzZXJ2aWNlOjpzZXJ2aWNlOjpWMl8wOjpDYW1lcmFTdGF0dXNBbmRJZDsKKworc3RydWN0IEhpZGxDYW1lcmFTZXJ2aWNlIGZpbmFsIDogcHVibGljIEhDYW1lcmFTZXJ2aWNlIHsKKworICAgIH5IaWRsQ2FtZXJhU2VydmljZSgpIHsgfTsKKworICAgIC8vIE1ldGhvZHMgZnJvbSA6OmFuZHJvaWQ6OmZyYW1ld29ya3M6OmNhbWVyYXNlcnZpY2U6OnNlcnZpY2U6OlYyLjA6OklDYW1lcmFTZXJ2aWNlIGZvbGxvdy4KKworICAgIFJldHVybjx2b2lkPiBjb25uZWN0RGV2aWNlKGNvbnN0IHNwPEhDYW1lcmFEZXZpY2VDYWxsYmFjaz4mIGNhbGxiYWNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGhpZGxfc3RyaW5nJiBjYW1lcmFJZCwgY29ubmVjdERldmljZV9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48dm9pZD4gYWRkTGlzdGVuZXIoY29uc3Qgc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRMaXN0ZW5lcl9jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICBSZXR1cm48SFN0YXR1cz4gcmVtb3ZlTGlzdGVuZXIoY29uc3Qgc3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4mIGxpc3RlbmVyKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBnZXRDYW1lcmFDaGFyYWN0ZXJpc3RpY3MoY29uc3QgaGlkbF9zdHJpbmcmIGNhbWVyYUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q2FtZXJhQ2hhcmFjdGVyaXN0aWNzX2NiIF9oaWRsX2NiKSBvdmVycmlkZTsKKworICAgIFJldHVybjx2b2lkPiBnZXRDYW1lcmFWZW5kb3JUYWdTZWN0aW9ucyhnZXRDYW1lcmFWZW5kb3JUYWdTZWN0aW9uc19jYiBfaGlkbF9jYikgb3ZlcnJpZGU7CisKKyAgICAvLyBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlIGNhbWVyYXNlcnZlcnMgbWFpbiB0aHJlYWQgdG8KKyAgICAvLyBpbnN0YW50aWF0ZSB0aGUgaGlkbCBjYW1lcmFzZXJ2ZXIuCisgICAgc3RhdGljIHNwPEhpZGxDYW1lcmFTZXJ2aWNlPiBnZXRJbnN0YW5jZShhbmRyb2lkOjpDYW1lcmFTZXJ2aWNlICpjcyk7CisKK3ByaXZhdGU6CisgICAgSGlkbENhbWVyYVNlcnZpY2UoYW5kcm9pZDo6Q2FtZXJhU2VydmljZSAqY3MpIDogbUFpZGxJQ2FtZXJhU2VydmljZShjcykgeyB9OworCisgICAgc3A8aGFyZHdhcmU6OklDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IHNlYXJjaExpc3RlbmVyQ2FjaGVMb2NrZWQoCisgICAgICAgIHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGxpc3RlbmVyLCAvKnJlbW92ZUlmRm91bmQqLyBib29sIHNob3VsZFJlbW92ZSA9IGZhbHNlKTsKKworICAgIHZvaWQgYWRkVG9MaXN0ZW5lckNhY2hlTG9ja2VkKHNwPEhDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+IGhMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcDxoYXJkd2FyZTo6SUNhbWVyYVNlcnZpY2VMaXN0ZW5lcj4gY3NMaXN0ZW5lcik7CisKKyAgICBhbmRyb2lkOjpDYW1lcmFTZXJ2aWNlICpjb25zdCBtQWlkbElDYW1lcmFTZXJ2aWNlID0gbnVsbHB0cjsKKworICAgIE11dGV4IG1MaXN0ZW5lckxpc3RMb2NrOworCisgICAgdXNpbmcgSElMaXN0ZW5lcnMgPQorICAgICAgICBzdGQ6OnBhaXI8c3A8SENhbWVyYVNlcnZpY2VMaXN0ZW5lcj4sIHNwPElDYW1lcmFTZXJ2aWNlTGlzdGVuZXI+PjsKKyAgICBzdGQ6Omxpc3Q8SElMaXN0ZW5lcnM+IG1MaXN0ZW5lcnM7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaW1wbGVtZW50YXRpb24KK30gIC8vIG5hbWVzcGFjZSBWMl8wCit9ICAvLyBuYW1lc3BhY2Ugc2VydmljZQorfSAgLy8gbmFtZXNwYWNlIGNhbWVyYXNlcnZpY2UKK30gIC8vIG5hbWVzcGFjZSBmcmFtZXdvcmtzCit9ICAvLyBuYW1lc3BhY2UgYW5kcm9pZAorCisjZW5kaWYgIC8vIEFORFJPSURfRlJBTUVXT1JLU19DQU1FUkFTRVJWSUNFX1YyXzBfQ0FNRVJBU0VSVklDRV9ICmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQW5kcm9pZC5tawppbmRleCBmNzcwNjljLi5lYzVlODc2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0FuZHJvaWQubWsKQEAgLTIzLDIxICsyMywyNyBAQAogICAgIGxpYmNhbWVyYXNlcnZpY2UgXAogICAgIGxpYmhpZGxiYXNlIFwKICAgICBsaWJsb2cgXAotICAgIGxpYmhpZGx0cmFuc3BvcnQgXAogICAgIGxpYmNhbWVyYV9jbGllbnQgXAogICAgIGxpYmNhbWVyYV9tZXRhZGF0YSBcCiAgICAgbGlidXRpbHMgXAorICAgIGxpYmpwZWcgXAorICAgIGxpYmV4aWYgXAogICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLmNvbW1vbkAxLjAgXAogICAgIGFuZHJvaWQuaGFyZHdhcmUuY2FtZXJhLnByb3ZpZGVyQDIuNCBcCisgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi41IFwKICAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMS4wIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5kZXZpY2VAMy4yCisgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuMiBcCisgICAgYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEuZGV2aWNlQDMuNAogCiBMT0NBTF9DX0lOQ0xVREVTICs9IFwKICAgICBzeXN0ZW0vbWVkaWEvcHJpdmF0ZS9jYW1lcmEvaW5jbHVkZSBcCisgICAgZXh0ZXJuYWwvZHluYW1pY19kZXB0aC9pbmNsdWRlcyBcCisgICAgZXh0ZXJuYWwvZHluYW1pY19kZXB0aC9pbnRlcm5hbCBcCiAKIExPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2V4dHJhIC1XZXJyb3IKIAogTE9DQUxfTU9EVUxFOj0gY2FtZXJhc2VydmljZV90ZXN0CitMT0NBTF9DT01QQVRJQklMSVRZX1NVSVRFIDo9IGRldmljZS10ZXN0cwogTE9DQUxfTU9EVUxFX1RBR1MgOj0gdGVzdHMKIAogaW5jbHVkZSAkKEJVSUxEX05BVElWRV9URVNUKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcAppbmRleCBlZjkzZDlhLi43OGQ3MzdkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9DYW1lcmFQcm92aWRlck1hbmFnZXJUZXN0LmNwcApAQCAtMzMsNiArMzMsNyBAQAogdXNpbmcgYW5kcm9pZDo6aGFyZHdhcmU6OmNhbWVyYTo6Y29tbW9uOjpWMV8wOjpDYW1lcmFNZXRhZGF0YVR5cGU7CiB1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpkZXZpY2U6OlYzXzI6OklDYW1lcmFEZXZpY2VDYWxsYmFjazsKIHVzaW5nIGFuZHJvaWQ6OmhhcmR3YXJlOjpjYW1lcmE6OmRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZVNlc3Npb247Cit1c2luZyBhbmRyb2lkOjpoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNTo6RGV2aWNlU3RhdGU7CiAKIC8qKgogICogQmFzaWMgdGVzdCBpbXBsZW1lbnRhdGlvbiBvZiBhIGNhbWVyYSB2ZXIuIDMuMiBkZXZpY2UgaW50ZXJmYWNlCkBAIC04Nyw3ICs4OCw3IEBACiAvKioKICAqIEJhc2ljIHRlc3QgaW1wbGVtZW50YXRpb24gb2YgYSBjYW1lcmEgcHJvdmlkZXIKICAqLwotc3RydWN0IFRlc3RJQ2FtZXJhUHJvdmlkZXIgOiB2aXJ0dWFsIHB1YmxpYyBwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyIHsKK3N0cnVjdCBUZXN0SUNhbWVyYVByb3ZpZGVyIDogdmlydHVhbCBwdWJsaWMgcHJvdmlkZXI6OlYyXzU6OklDYW1lcmFQcm92aWRlciB7CiAgICAgc3A8cHJvdmlkZXI6OlYyXzQ6OklDYW1lcmFQcm92aWRlckNhbGxiYWNrPiBtQ2FsbGJhY2tzOwogICAgIHN0ZDo6dmVjdG9yPGhhcmR3YXJlOjpoaWRsX3N0cmluZz4gbURldmljZU5hbWVzOwogICAgIHNwPGRldmljZTo6VjNfMjo6SUNhbWVyYURldmljZT4gbURldmljZUludGVyZmFjZTsKQEAgLTEwMSw2ICsxMDIsNyBAQAogCiAgICAgdmlydHVhbCBoYXJkd2FyZTo6UmV0dXJuPFN0YXR1cz4gc2V0Q2FsbGJhY2soCiAgICAgICAgICAgICBjb25zdCBzcDxwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyQ2FsbGJhY2s+JiBjYWxsYmFja3MpIG92ZXJyaWRlIHsKKyAgICAgICAgbUNhbGxlZENvdW50ZXJbU0VUX0NBTExCQUNLXSsrOwogICAgICAgICBtQ2FsbGJhY2tzID0gY2FsbGJhY2tzOwogICAgICAgICByZXR1cm4gaGFyZHdhcmU6OlJldHVybjxTdGF0dXM+KFN0YXR1czo6T0spOwogICAgIH0KQEAgLTEwOCw2ICsxMTAsNyBAQAogICAgIHVzaW5nIGdldFZlbmRvclRhZ3NfY2IgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoU3RhdHVzIHN0YXR1cywKICAgICAgICAgICAgIGNvbnN0IGhhcmR3YXJlOjpoaWRsX3ZlYzxjb21tb246OlYxXzA6OlZlbmRvclRhZ1NlY3Rpb24+JiBzZWN0aW9ucyk+OwogICAgIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gZ2V0VmVuZG9yVGFncyhnZXRWZW5kb3JUYWdzX2NiIF9oaWRsX2NiKSBvdmVycmlkZSB7CisgICAgICAgIG1DYWxsZWRDb3VudGVyW0dFVF9WRU5ET1JfVEFHU10rKzsKICAgICAgICAgX2hpZGxfY2IoU3RhdHVzOjpPSywgbVZlbmRvclRhZ1NlY3Rpb25zKTsKICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CiAgICAgfQpAQCAtMTE3LDYgKzEyMCw3IEBACiAgICAgICAgICAgICAgYm9vbCBzdXBwb3J0KT47CiAgICAgdmlydHVhbCA6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gaXNTZXRUb3JjaE1vZGVTdXBwb3J0ZWQoCiAgICAgICAgICAgICBpc1NldFRvcmNoTW9kZVN1cHBvcnRlZF9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgeworICAgICAgICBtQ2FsbGVkQ291bnRlcltJU19TRVRfVE9SQ0hfTU9ERV9TVVBQT1JURURdKys7CiAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIGZhbHNlKTsKICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CiAgICAgfQpAQCAtMTI0LDYgKzEyOCw3IEBACiAgICAgdXNpbmcgZ2V0Q2FtZXJhSWRMaXN0X2NiID0gc3RkOjpmdW5jdGlvbjx2b2lkKFN0YXR1cyBzdGF0dXMsCiAgICAgICAgICAgICBjb25zdCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmhpZGxfc3RyaW5nPiYgY2FtZXJhRGV2aWNlTmFtZXMpPjsKICAgICB2aXJ0dWFsIGhhcmR3YXJlOjpSZXR1cm48dm9pZD4gZ2V0Q2FtZXJhSWRMaXN0KGdldENhbWVyYUlkTGlzdF9jYiBfaGlkbF9jYikgb3ZlcnJpZGUgeworICAgICAgICBtQ2FsbGVkQ291bnRlcltHRVRfQ0FNRVJBX0lEX0xJU1RdKys7CiAgICAgICAgIF9oaWRsX2NiKFN0YXR1czo6T0ssIG1EZXZpY2VOYW1lcyk7CiAgICAgICAgIHJldHVybiBoYXJkd2FyZTo6Vm9pZCgpOwogICAgIH0KQEAgLTE0OCw2ICsxNTMsMjUgQEAKICAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CiAgICAgfQogCisgICAgdmlydHVhbCBoYXJkd2FyZTo6UmV0dXJuPHZvaWQ+IG5vdGlmeURldmljZVN0YXRlQ2hhbmdlKAorICAgICAgICAgICAgaGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8RGV2aWNlU3RhdGU+IG5ld1N0YXRlKSBvdmVycmlkZSB7CisgICAgICAgIG1DYWxsZWRDb3VudGVyW05PVElGWV9ERVZJQ0VfU1RBVEVdKys7CisgICAgICAgIG1DdXJyZW50U3RhdGUgPSBuZXdTdGF0ZTsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpWb2lkKCk7CisgICAgfQorCisgICAgZW51bSBNZXRob2ROYW1lcyB7CisgICAgICAgIFNFVF9DQUxMQkFDSywKKyAgICAgICAgR0VUX1ZFTkRPUl9UQUdTLAorICAgICAgICBJU19TRVRfVE9SQ0hfTU9ERV9TVVBQT1JURUQsCisgICAgICAgIE5PVElGWV9ERVZJQ0VfU1RBVEUsCisgICAgICAgIEdFVF9DQU1FUkFfSURfTElTVCwKKworICAgICAgICBNRVRIT0RfTkFNRV9DT1VOVAorICAgIH07CisgICAgaW50IG1DYWxsZWRDb3VudGVyW01FVEhPRF9OQU1FX0NPVU5UXSB7MH07CisKKyAgICBoYXJkd2FyZTo6aGlkbF9iaXRmaWVsZDxEZXZpY2VTdGF0ZT4gbUN1cnJlbnRTdGF0ZSA9IDB4RkZGRkZGRkY7IC8vIFVubGlrZWx5IHRvIGJlIGEgcmVhbCBzdGF0ZQogfTsKIAogLyoqCkBAIC0xNjMsNyArMTg3LDcgQEAKICAgICAgICAgbVRlc3RDYW1lcmFQcm92aWRlciA9IHByb3ZpZGVyOwogICAgIH0KIAotICAgIHN0ZDo6c3RyaW5nIG1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWU7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWVzOwogCiAgICAgdmlydHVhbCB+VGVzdEludGVyYWN0aW9uUHJveHkoKSB7fQogCkBAIC0xNzcsMTAgKzIwMSwxNSBAQAogCiAgICAgdmlydHVhbCBzcDxoYXJkd2FyZTo6Y2FtZXJhOjpwcm92aWRlcjo6VjJfNDo6SUNhbWVyYVByb3ZpZGVyPiBnZXRTZXJ2aWNlKAogICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJnNlcnZpY2VOYW1lKSBvdmVycmlkZSB7Ci0gICAgICAgIG1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWUgPSBzZXJ2aWNlTmFtZTsKKyAgICAgICAgbUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXMucHVzaF9iYWNrKHNlcnZpY2VOYW1lKTsKICAgICAgICAgcmV0dXJuIG1UZXN0Q2FtZXJhUHJvdmlkZXI7CiAgICAgfQogCisgICAgdmlydHVhbCBoYXJkd2FyZTo6aGlkbF92ZWM8aGFyZHdhcmU6OmhpZGxfc3RyaW5nPiBsaXN0U2VydmljZXMoKSBvdmVycmlkZSB7CisgICAgICAgIGhhcmR3YXJlOjpoaWRsX3ZlYzxoYXJkd2FyZTo6aGlkbF9zdHJpbmc+IHJldCA9IHsidGVzdC8wIn07CisgICAgICAgIHJldHVybiByZXQ7CisgICAgfQorCiB9OwogCiBzdHJ1Y3QgVGVzdFN0YXR1c0xpc3RlbmVyIDogcHVibGljIENhbWVyYVByb3ZpZGVyTWFuYWdlcjo6U3RhdHVzTGlzdGVuZXIgewpAQCAtMjA3LDEyICsyMzYsMjMgQEAKICAgICAgICAgICAgIHZlbmRvclNlY3Rpb24pOwogICAgIHNlcnZpY2VQcm94eS5zZXRQcm92aWRlcihwcm92aWRlcik7CiAKKyAgICBpbnQgbnVtUHJvdmlkZXJzID0gc3RhdGljX2Nhc3Q8aW50PihzZXJ2aWNlUHJveHkubGlzdFNlcnZpY2VzKCkuc2l6ZSgpKTsKKwogICAgIHJlcyA9IHByb3ZpZGVyTWFuYWdlci0+aW5pdGlhbGl6ZShzdGF0dXNMaXN0ZW5lciwgJnNlcnZpY2VQcm94eSk7CiAgICAgQVNTRVJUX0VRKHJlcywgT0spIDw8ICJVbmFibGUgdG8gaW5pdGlhbGl6ZSBwcm92aWRlciBtYW5hZ2VyIjsKLQotICAgIGhhcmR3YXJlOjpoaWRsX3N0cmluZyBsZWdhY3lJbnN0YW5jZU5hbWUgPSAibGVnYWN5LzAiOwotICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZSwgbGVnYWN5SW5zdGFuY2VOYW1lKSA8PAotICAgICAgICAgICAgIkxlZ2FjeSBpbnN0YW5jZSBub3QgcmVxdWVzdGVkIGZyb20gc2VydmljZSBtYW5hZ2VyIjsKKyAgICAvLyBDaGVjayB0aGF0IGJvdGggImxlZ2FjeSIgYW5kICJleHRlcm5hbCIgcHJvdmlkZXJzIChyZWFsbHkgdGhlIHNhbWUgb2JqZWN0KSBhcmUgY2FsbGVkCisgICAgLy8gb25jZSBmb3IgYWxsIHRoZSBpbml0IG1ldGhvZHMKKyAgICBFWFBFQ1RfRVEocHJvdmlkZXItPm1DYWxsZWRDb3VudGVyW1Rlc3RJQ2FtZXJhUHJvdmlkZXI6OlNFVF9DQUxMQkFDS10sIG51bVByb3ZpZGVycykgPDwKKyAgICAgICAgICAgICJPbmx5IG9uZSBjYWxsIHRvIHNldENhbGxiYWNrIHBlciBwcm92aWRlciBleHBlY3RlZCBkdXJpbmcgaW5pdCI7CisgICAgRVhQRUNUX0VRKHByb3ZpZGVyLT5tQ2FsbGVkQ291bnRlcltUZXN0SUNhbWVyYVByb3ZpZGVyOjpHRVRfVkVORE9SX1RBR1NdLCBudW1Qcm92aWRlcnMpIDw8CisgICAgICAgICAgICAiT25seSBvbmUgY2FsbCB0byBnZXRWZW5kb3JUYWdzIHBlciBwcm92aWRlciBleHBlY3RlZCBkdXJpbmcgaW5pdCI7CisgICAgRVhQRUNUX0VRKHByb3ZpZGVyLT5tQ2FsbGVkQ291bnRlcltUZXN0SUNhbWVyYVByb3ZpZGVyOjpJU19TRVRfVE9SQ0hfTU9ERV9TVVBQT1JURURdLAorICAgICAgICAgICAgbnVtUHJvdmlkZXJzKSA8PAorICAgICAgICAgICAgIk9ubHkgb25lIGNhbGwgdG8gaXNTZXRUb3JjaE1vZGVTdXBwb3J0ZWQgcGVyIHByb3ZpZGVyIGV4cGVjdGVkIGR1cmluZyBpbml0IjsKKyAgICBFWFBFQ1RfRVEocHJvdmlkZXItPm1DYWxsZWRDb3VudGVyW1Rlc3RJQ2FtZXJhUHJvdmlkZXI6OkdFVF9DQU1FUkFfSURfTElTVF0sIG51bVByb3ZpZGVycykgPDwKKyAgICAgICAgICAgICJPbmx5IG9uZSBjYWxsIHRvIGdldENhbWVyYUlkTGlzdCBwZXIgcHJvdmlkZXIgZXhwZWN0ZWQgZHVyaW5nIGluaXQiOworICAgIEVYUEVDVF9FUShwcm92aWRlci0+bUNhbGxlZENvdW50ZXJbVGVzdElDYW1lcmFQcm92aWRlcjo6Tk9USUZZX0RFVklDRV9TVEFURV0sIG51bVByb3ZpZGVycykgPDwKKyAgICAgICAgICAgICJPbmx5IG9uZSBjYWxsIHRvIG5vdGlmeURldmljZVN0YXRlIHBlciBwcm92aWRlciBleHBlY3RlZCBkdXJpbmcgaW5pdCI7CiAKICAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgdGVzdFByb3ZpZGVyRnFJbnRlcmZhY2VOYW1lID0KICAgICAgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLmNhbWVyYS5wcm92aWRlckAyLjQ6OklDYW1lcmFQcm92aWRlciI7CkBAIC0yMjEsNyArMjYxLDcgQEAKICAgICAgICAgICAgIHRlc3RQcm92aWRlckZxSW50ZXJmYWNlTmFtZSwKICAgICAgICAgICAgIHRlc3RQcm92aWRlckluc3RhbmNlTmFtZSwgZmFsc2UpOwogCi0gICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lLCB0ZXN0UHJvdmlkZXJJbnN0YW5jZU5hbWUpIDw8CisgICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lcy5iYWNrKCksIHRlc3RQcm92aWRlckluc3RhbmNlTmFtZSkgPDwKICAgICAgICAgICAgICJJbmNvcnJlY3QgaW5zdGFuY2UgcmVxdWVzdGVkIGZyb20gc2VydmljZSBtYW5hZ2VyIjsKIH0KIApAQCAtMjU1LDcgKzI5NSw3IEBACiAgICAgICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5jYW1lcmEucHJvdmlkZXJAMi40OjpJQ2FtZXJhUHJvdmlkZXIiOwogICAgIHNlcnZpY2VQcm94eS5tTWFuYWdlck5vdGlmaWNhdGlvbkludGVyZmFjZS0+b25SZWdpc3RyYXRpb24oCiAgICAgICAgICAgICB0ZXN0UHJvdmlkZXJGcUludGVyZmFjZU5hbWUsIHRlc3RQcm92aWRlckluc3RhbmNlTmFtZSwgZmFsc2UpOwotICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZSwgdGVzdFByb3ZpZGVySW5zdGFuY2VOYW1lKSA8PAorICAgIEFTU0VSVF9FUShzZXJ2aWNlUHJveHkubUxhc3RSZXF1ZXN0ZWRTZXJ2aWNlTmFtZXMuYmFjaygpLCB0ZXN0UHJvdmlkZXJJbnN0YW5jZU5hbWUpIDw8CiAgICAgICAgICAgICAiSW5jb3JyZWN0IGluc3RhbmNlIHJlcXVlc3RlZCBmcm9tIHNlcnZpY2UgbWFuYWdlciI7CiAKICAgICBoYXJkd2FyZTo6aGlkbF9zdHJpbmcgc2VjdGlvbk5hbWVTZWNvbmQgPSAiU2Vjb25kVmVuZG9yVGVzdFNlY3Rpb24iOwpAQCAtMjczLDcgKzMxMyw3IEBACiAgICAgaGFyZHdhcmU6OmhpZGxfc3RyaW5nIHRlc3RQcm92aWRlclNlY29uZEluc3RhbmNlTmFtZSA9ICJ0ZXN0Mi8wIjsKICAgICBzZXJ2aWNlUHJveHkubU1hbmFnZXJOb3RpZmljYXRpb25JbnRlcmZhY2UtPm9uUmVnaXN0cmF0aW9uKAogICAgICAgICAgICAgdGVzdFByb3ZpZGVyRnFJbnRlcmZhY2VOYW1lLCB0ZXN0UHJvdmlkZXJTZWNvbmRJbnN0YW5jZU5hbWUsIGZhbHNlKTsKLSAgICBBU1NFUlRfRVEoc2VydmljZVByb3h5Lm1MYXN0UmVxdWVzdGVkU2VydmljZU5hbWUsCisgICAgQVNTRVJUX0VRKHNlcnZpY2VQcm94eS5tTGFzdFJlcXVlc3RlZFNlcnZpY2VOYW1lcy5iYWNrKCksCiAgICAgICAgICAgICAgIHRlc3RQcm92aWRlclNlY29uZEluc3RhbmNlTmFtZSkgPDwKICAgICAgICAgICAgICJJbmNvcnJlY3QgaW5zdGFuY2UgcmVxdWVzdGVkIGZyb20gc2VydmljZSBtYW5hZ2VyIjsKIApAQCAtMzY2LDMgKzQwNiwzNSBAQAogICAgIG1ldGFkYXRhQ29weS5kdW1wKDEsIDIpOwogICAgIHNlY29uZE1ldGFkYXRhLmR1bXAoMSwgMik7CiB9CisKK1RFU1QoQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyVGVzdCwgTm90aWZ5U3RhdGVDaGFuZ2VUZXN0KSB7CisgICAgc3RkOjp2ZWN0b3I8aGFyZHdhcmU6OmhpZGxfc3RyaW5nPiBkZXZpY2VOYW1lcyB7CisgICAgICAgICJkZXZpY2VAMy4yL3Rlc3QvMCIsCisgICAgICAgICJkZXZpY2VAMS4wL3Rlc3QvMCIsCisgICAgICAgICJkZXZpY2VAMy4yL3Rlc3QvMSJ9OworCisgICAgaGFyZHdhcmU6OmhpZGxfdmVjPGNvbW1vbjo6VjFfMDo6VmVuZG9yVGFnU2VjdGlvbj4gdmVuZG9yU2VjdGlvbjsKKyAgICBzdGF0dXNfdCByZXM7CisgICAgc3A8Q2FtZXJhUHJvdmlkZXJNYW5hZ2VyPiBwcm92aWRlck1hbmFnZXIgPSBuZXcgQ2FtZXJhUHJvdmlkZXJNYW5hZ2VyKCk7CisgICAgc3A8VGVzdFN0YXR1c0xpc3RlbmVyPiBzdGF0dXNMaXN0ZW5lciA9IG5ldyBUZXN0U3RhdHVzTGlzdGVuZXIoKTsKKyAgICBUZXN0SW50ZXJhY3Rpb25Qcm94eSBzZXJ2aWNlUHJveHk7CisgICAgc3A8VGVzdElDYW1lcmFQcm92aWRlcj4gcHJvdmlkZXIgPSAgbmV3IFRlc3RJQ2FtZXJhUHJvdmlkZXIoZGV2aWNlTmFtZXMsCisgICAgICAgICAgICB2ZW5kb3JTZWN0aW9uKTsKKyAgICBzZXJ2aWNlUHJveHkuc2V0UHJvdmlkZXIocHJvdmlkZXIpOworCisgICAgcmVzID0gcHJvdmlkZXJNYW5hZ2VyLT5pbml0aWFsaXplKHN0YXR1c0xpc3RlbmVyLCAmc2VydmljZVByb3h5KTsKKyAgICBBU1NFUlRfRVEocmVzLCBPSykgPDwgIlVuYWJsZSB0byBpbml0aWFsaXplIHByb3ZpZGVyIG1hbmFnZXIiOworCisgICAgQVNTRVJUX0VRKHByb3ZpZGVyLT5tQ3VycmVudFN0YXRlLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8RGV2aWNlU3RhdGU+PihEZXZpY2VTdGF0ZTo6Tk9STUFMKSkKKyAgICAgICAgICAgIDw8ICJJbml0aWFsIGRldmljZSBzdGF0ZSBub3Qgc2V0IjsKKworICAgIHJlcyA9IHByb3ZpZGVyTWFuYWdlci0+bm90aWZ5RGV2aWNlU3RhdGVDaGFuZ2UoCisgICAgICAgIHN0YXRpY19jYXN0PGhhcmR3YXJlOjpoaWRsX2JpdGZpZWxkPERldmljZVN0YXRlPj4oRGV2aWNlU3RhdGU6OkZPTERFRCkpOworCisgICAgQVNTRVJUX0VRKHJlcywgT0spIDw8ICJVbmFibGUgdG8gY2FsbCBub3RpZnlEZXZpY2VTdGF0ZUNoYW5nZSI7CisgICAgQVNTRVJUX0VRKHByb3ZpZGVyLT5tQ3VycmVudFN0YXRlLAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aGFyZHdhcmU6OmhpZGxfYml0ZmllbGQ8RGV2aWNlU3RhdGU+PihEZXZpY2VTdGF0ZTo6Rk9MREVEKSkKKyAgICAgICAgICAgIDw8ICJVbmFibGUgdG8gY2hhbmdlIGRldmljZSBzdGF0ZSI7CisKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0RlcHRoUHJvY2Vzc29yVGVzdC5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9EZXB0aFByb2Nlc3NvclRlc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNjI1MTQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9EZXB0aFByb2Nlc3NvclRlc3QuY3BwCkBAIC0wLDAgKzEsMzgyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiRGVwdGhQcm9jZXNzb3JUZXN0IgorCisjaW5jbHVkZSA8YXJyYXk+CisjaW5jbHVkZSA8cmFuZG9tPgorCisjaW5jbHVkZSA8ZGxmY24uaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorCisjaW5jbHVkZSAiLi4vY29tbW9uL0RlcHRoUGhvdG9Qcm9jZXNzb3IuaCIKKyNpbmNsdWRlICIuLi91dGlscy9FeGlmVXRpbHMuaCIKKyNpbmNsdWRlICJOVjEyQ29tcHJlc3Nvci5oIgorCit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOjpjYW1lcmEzOworCitzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZXN0QnVmZmVyV2lkdGggPSA2NDA7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtUZXN0QnVmZmVySGVpZ2h0ID0gNDgwOworc3RhdGljIGNvbnN0IHNpemVfdCBrVGVzdEJ1ZmZlck5WMTJTaXplICgoKChrVGVzdEJ1ZmZlcldpZHRoKSAqIChrVGVzdEJ1ZmZlckhlaWdodCkpICogMykgLyAyKTsKK3N0YXRpYyBjb25zdCBzaXplX3Qga1Rlc3RCdWZmZXJEZXB0aFNpemUgKGtUZXN0QnVmZmVyV2lkdGggKiBrVGVzdEJ1ZmZlckhlaWdodCk7CitzdGF0aWMgY29uc3Qgc2l6ZV90IGtTZWVkID0gMTIzNDsKKwordm9pZCBsaW5rVG9EZXB0aFBob3RvTGlicmFyeSh2b2lkICoqbGliSGFuZGxlIC8qb3V0Ki8sCisgICAgICAgIHByb2Nlc3NfZGVwdGhfcGhvdG9fZnJhbWUgKnByb2Nlc3NGcmFtZUZ1bmMgLypvdXQqLykgeworICAgIEFTU0VSVF9ORShsaWJIYW5kbGUsIG51bGxwdHIpOworICAgIEFTU0VSVF9ORShwcm9jZXNzRnJhbWVGdW5jLCBudWxscHRyKTsKKworICAgICpsaWJIYW5kbGUgPSBkbG9wZW4oa0RlcHRoUGhvdG9MaWJyYXJ5LCBSVExEX05PVyB8IFJUTERfTE9DQUwpOworICAgIGlmICgqbGliSGFuZGxlICE9IG51bGxwdHIpIHsKKyAgICAgICAgKnByb2Nlc3NGcmFtZUZ1bmMgPSByZWludGVycHJldF9jYXN0PGNhbWVyYTM6OnByb2Nlc3NfZGVwdGhfcGhvdG9fZnJhbWU+ICgKKyAgICAgICAgICAgICAgICBkbHN5bSgqbGliSGFuZGxlLCBrRGVwdGhQaG90b1Byb2Nlc3NGdW5jdGlvbikpOworICAgICAgICBBU1NFUlRfTkUoKnByb2Nlc3NGcmFtZUZ1bmMsIG51bGxwdHIpOworICAgIH0KK30KKwordm9pZCBnZW5lcmF0ZUNvbG9ySnBlZ0J1ZmZlcihpbnQganBlZ1F1YWxpdHksIEV4aWZPcmllbnRhdGlvbiBvcmllbnRhdGlvblZhbHVlLCBib29sIGluY2x1ZGVFeGlmLAorICAgICAgICBib29sIHN3aXRjaERpbWVuc2lvbnMsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+ICpjb2xvckpwZWdCdWZmZXIgLypvdXQqLykgeworICAgIEFTU0VSVF9ORShjb2xvckpwZWdCdWZmZXIsIG51bGxwdHIpOworCisgICAgc3RkOjphcnJheTx1aW50OF90LCBrVGVzdEJ1ZmZlck5WMTJTaXplPiBjb2xvclNvdXJjZUJ1ZmZlcjsKKyAgICBzdGQ6OmRlZmF1bHRfcmFuZG9tX2VuZ2luZSBnZW4oa1NlZWQpOworICAgIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGludD4gdW5pRGlzdCgwLCBVSU5UOF9NQVggLSAxKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvbG9yU291cmNlQnVmZmVyLnNpemUoKTsgaSsrKSB7CisgICAgICAgIGNvbG9yU291cmNlQnVmZmVyW2ldID0gdW5pRGlzdChnZW4pOworICAgIH0KKworICAgIHNpemVfdCB3aWR0aCA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgc2l6ZV90IGhlaWdodCA9IGtUZXN0QnVmZmVySGVpZ2h0OworICAgIGlmIChzd2l0Y2hEaW1lbnNpb25zKSB7CisgICAgICAgIHdpZHRoID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisgICAgICAgIGhlaWdodCA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgfQorCisgICAgTlYxMkNvbXByZXNzb3IganBlZ0NvbXByZXNzb3I7CisgICAgaWYgKGluY2x1ZGVFeGlmKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGpwZWdDb21wcmVzc29yLmNvbXByZXNzV2l0aEV4aWZPcmllbnRhdGlvbigKKyAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPiAoY29sb3JTb3VyY2VCdWZmZXIuZGF0YSgpKSwgd2lkdGgsIGhlaWdodCwKKyAgICAgICAgICAgICAgICBqcGVnUXVhbGl0eSwgb3JpZW50YXRpb25WYWx1ZSkpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFTU0VSVF9UUlVFKGpwZWdDb21wcmVzc29yLmNvbXByZXNzKAorICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+IChjb2xvclNvdXJjZUJ1ZmZlci5kYXRhKCkpLCB3aWR0aCwgaGVpZ2h0LAorICAgICAgICAgICAgICAgIGpwZWdRdWFsaXR5KSk7CisgICAgfQorCisgICAgKmNvbG9ySnBlZ0J1ZmZlciA9IHN0ZDo6bW92ZShqcGVnQ29tcHJlc3Nvci5nZXRDb21wcmVzc2VkRGF0YSgpKTsKKyAgICBBU1NFUlRfRkFMU0UoY29sb3JKcGVnQnVmZmVyLT5lbXB0eSgpKTsKK30KKwordm9pZCBnZW5lcmF0ZURlcHRoMTZCdWZmZXIoc3RkOjphcnJheTx1aW50MTZfdCwga1Rlc3RCdWZmZXJEZXB0aFNpemU+ICpkZXB0aDE2QnVmZmVyIC8qb3V0Ki8pIHsKKyAgICBBU1NFUlRfTkUoZGVwdGgxNkJ1ZmZlciwgbnVsbHB0cik7CisgICAgc3RkOjpkZWZhdWx0X3JhbmRvbV9lbmdpbmUgZ2VuKGtTZWVkKzEpOworICAgIHN0ZDo6dW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGludD4gdW5pRGlzdCgwLCBVSU5UMTZfTUFYIC0gMSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkZXB0aDE2QnVmZmVyLT5zaXplKCk7IGkrKykgeworICAgICAgICAoKmRlcHRoMTZCdWZmZXIpW2ldID0gdW5pRGlzdChnZW4pOworICAgIH0KK30KKworVEVTVChEZXB0aFByb2Nlc3NvclRlc3QsIExpbmtUb0xpYnJheSkgeworICAgIHZvaWQgKmxpYkhhbmRsZTsKKyAgICBwcm9jZXNzX2RlcHRoX3Bob3RvX2ZyYW1lIHByb2Nlc3NGdW5jOworICAgIGxpbmtUb0RlcHRoUGhvdG9MaWJyYXJ5KCZsaWJIYW5kbGUsICZwcm9jZXNzRnVuYyk7CisgICAgaWYgKGxpYkhhbmRsZSAhPSBudWxscHRyKSB7CisgICAgICAgIGRsY2xvc2UobGliSGFuZGxlKTsKKyAgICB9Cit9CisKK1RFU1QoRGVwdGhQcm9jZXNzb3JUZXN0LCBCYWRJbnB1dCkgeworICAgIHZvaWQgKmxpYkhhbmRsZTsKKyAgICBpbnQganBlZ1F1YWxpdHkgPSA5NTsKKworICAgIHByb2Nlc3NfZGVwdGhfcGhvdG9fZnJhbWUgcHJvY2Vzc0Z1bmM7CisgICAgbGlua1RvRGVwdGhQaG90b0xpYnJhcnkoJmxpYkhhbmRsZSwgJnByb2Nlc3NGdW5jKTsKKyAgICBpZiAobGliSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gRGVwdGggbGlicmFyeSBubyBwcmVzZW50LCBub3RoaW5nIG1vcmUgdG8gdGVzdC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIERlcHRoUGhvdG9JbnB1dEZyYW1lIGlucHV0RnJhbWU7CisgICAgLy8gV29yc3QgY2FzZSBib3RoIGRlcHRoIGFuZCBjb25maWRlbmNlIG1hcHMgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBtYWluIGNvbG9yIGltYWdlLgorICAgIGlucHV0RnJhbWUubU1heEpwZWdTaXplID0gaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplICogMzsKKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvbG9ySnBlZ0J1ZmZlcjsKKyAgICBnZW5lcmF0ZUNvbG9ySnBlZ0J1ZmZlcihqcGVnUXVhbGl0eSwgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQsCisgICAgICAgICAgICAvKmluY2x1ZGVFeGlmKi8gZmFsc2UsIC8qc3dpdGNoRGltZW5zaW9ucyovIGZhbHNlLCAmY29sb3JKcGVnQnVmZmVyKTsKKworICAgIHN0ZDo6YXJyYXk8dWludDE2X3QsIGtUZXN0QnVmZmVyRGVwdGhTaXplPiBkZXB0aDE2QnVmZmVyOworICAgIGdlbmVyYXRlRGVwdGgxNkJ1ZmZlcigmZGVwdGgxNkJ1ZmZlcik7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkZXB0aFBob3RvQnVmZmVyKGlucHV0RnJhbWUubU1heEpwZWdTaXplKTsKKyAgICBzaXplX3QgYWN0dWFsRGVwdGhQaG90b1NpemUgPSAwOworCisgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdXaWR0aCA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdIZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICBpbnB1dEZyYW1lLm1KcGVnUXVhbGl0eSA9IGpwZWdRdWFsaXR5OworICAgIEFTU0VSVF9ORShwcm9jZXNzRnVuYyhpbnB1dEZyYW1lLCBkZXB0aFBob3RvQnVmZmVyLnNpemUoKSwgZGVwdGhQaG90b0J1ZmZlci5kYXRhKCksCisgICAgICAgICAgICAgICAgJmFjdHVhbERlcHRoUGhvdG9TaXplKSwgMCk7CisKKyAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ0J1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+IChjb2xvckpwZWdCdWZmZXIuZGF0YSgpKTsKKyAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ1NpemUgPSBjb2xvckpwZWdCdWZmZXIuc2l6ZSgpOworICAgIEFTU0VSVF9ORShwcm9jZXNzRnVuYyhpbnB1dEZyYW1lLCBkZXB0aFBob3RvQnVmZmVyLnNpemUoKSwgZGVwdGhQaG90b0J1ZmZlci5kYXRhKCksCisgICAgICAgICAgICAgICAgJmFjdHVhbERlcHRoUGhvdG9TaXplKSwgMCk7CisKKyAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcEJ1ZmZlciA9IGRlcHRoMTZCdWZmZXIuZGF0YSgpOworICAgIGlucHV0RnJhbWUubURlcHRoTWFwV2lkdGggPSBpbnB1dEZyYW1lLm1EZXB0aE1hcFN0cmlkZSA9IGtUZXN0QnVmZmVyV2lkdGg7CisgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICBBU1NFUlRfTkUocHJvY2Vzc0Z1bmMoaW5wdXRGcmFtZSwgZGVwdGhQaG90b0J1ZmZlci5zaXplKCksIG51bGxwdHIsCisgICAgICAgICAgICAgICAgJmFjdHVhbERlcHRoUGhvdG9TaXplKSwgMCk7CisKKyAgICBBU1NFUlRfTkUocHJvY2Vzc0Z1bmMoaW5wdXRGcmFtZSwgZGVwdGhQaG90b0J1ZmZlci5zaXplKCksIGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpLCBudWxscHRyKSwKKyAgICAgICAgICAgIDApOworCisgICAgZGxjbG9zZShsaWJIYW5kbGUpOworfQorCitURVNUKERlcHRoUHJvY2Vzc29yVGVzdCwgQmFzaWNEZXB0aFBob3RvVmFsaWRhdGlvbikgeworICAgIHZvaWQgKmxpYkhhbmRsZTsKKyAgICBpbnQganBlZ1F1YWxpdHkgPSA5NTsKKworICAgIHByb2Nlc3NfZGVwdGhfcGhvdG9fZnJhbWUgcHJvY2Vzc0Z1bmM7CisgICAgbGlua1RvRGVwdGhQaG90b0xpYnJhcnkoJmxpYkhhbmRsZSwgJnByb2Nlc3NGdW5jKTsKKyAgICBpZiAobGliSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gRGVwdGggbGlicmFyeSBubyBwcmVzZW50LCBub3RoaW5nIG1vcmUgdG8gdGVzdC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvbG9ySnBlZ0J1ZmZlcjsKKyAgICBnZW5lcmF0ZUNvbG9ySnBlZ0J1ZmZlcihqcGVnUXVhbGl0eSwgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQsCisgICAgICAgICAgICAvKmluY2x1ZGVFeGlmKi8gZmFsc2UsIC8qc3dpdGNoRGltZW5zaW9ucyovIGZhbHNlLCAmY29sb3JKcGVnQnVmZmVyKTsKKworICAgIHN0ZDo6YXJyYXk8dWludDE2X3QsIGtUZXN0QnVmZmVyRGVwdGhTaXplPiBkZXB0aDE2QnVmZmVyOworICAgIGdlbmVyYXRlRGVwdGgxNkJ1ZmZlcigmZGVwdGgxNkJ1ZmZlcik7CisKKyAgICBEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lOworICAgIGlucHV0RnJhbWUubU1haW5KcGVnQnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4gKGNvbG9ySnBlZ0J1ZmZlci5kYXRhKCkpOworICAgIGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSA9IGNvbG9ySnBlZ0J1ZmZlci5zaXplKCk7CisgICAgLy8gV29yc3QgY2FzZSBib3RoIGRlcHRoIGFuZCBjb25maWRlbmNlIG1hcHMgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBtYWluIGNvbG9yIGltYWdlLgorICAgIGlucHV0RnJhbWUubU1heEpwZWdTaXplID0gaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplICogMzsKKyAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ1dpZHRoID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ0hlaWdodCA9IGtUZXN0QnVmZmVySGVpZ2h0OworICAgIGlucHV0RnJhbWUubUpwZWdRdWFsaXR5ID0ganBlZ1F1YWxpdHk7CisgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXIgPSBkZXB0aDE2QnVmZmVyLmRhdGEoKTsKKyAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBTdHJpZGUgPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgIGlucHV0RnJhbWUubURlcHRoTWFwSGVpZ2h0ID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBkZXB0aFBob3RvQnVmZmVyKGlucHV0RnJhbWUubU1heEpwZWdTaXplKTsKKyAgICBzaXplX3QgYWN0dWFsRGVwdGhQaG90b1NpemUgPSAwOworICAgIEFTU0VSVF9FUShwcm9jZXNzRnVuYyhpbnB1dEZyYW1lLCBkZXB0aFBob3RvQnVmZmVyLnNpemUoKSwgZGVwdGhQaG90b0J1ZmZlci5kYXRhKCksCisgICAgICAgICAgICAgICAgJmFjdHVhbERlcHRoUGhvdG9TaXplKSwgMCk7CisgICAgQVNTRVJUX1RSVUUoKGFjdHVhbERlcHRoUGhvdG9TaXplID4gMCkgJiYgKGRlcHRoUGhvdG9CdWZmZXIuc2l6ZSgpID49IGFjdHVhbERlcHRoUGhvdG9TaXplKSk7CisKKyAgICAvLyBUaGUgZmluYWwgZGVwdGggcGhvdG8gbXVzdCBjb25zaXN0IG9mIHRocmVlIGpwZWcgaW1hZ2VzOgorICAgIC8vICAtIHRoZSBtYWluIGNvbG9yIGltYWdlCisgICAgLy8gIC0gdGhlIGRlcHRoIG1hcCBpbWFnZQorICAgIC8vICAtIHRoZSBjb25maWRlbmNlIG1hcCBpbWFnZQorICAgIHNpemVfdCBtYWluSnBlZ1NpemUgPSAwOworICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6ZmluZEpwZWdTaXplKGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpLCBhY3R1YWxEZXB0aFBob3RvU2l6ZSwKKyAgICAgICAgICAgICAgICAmbWFpbkpwZWdTaXplKSwgT0spOworICAgIEFTU0VSVF9UUlVFKChtYWluSnBlZ1NpemUgPiAwKSAmJiAobWFpbkpwZWdTaXplIDwgYWN0dWFsRGVwdGhQaG90b1NpemUpKTsKKyAgICBzaXplX3QgZGVwdGhNYXBTaXplID0gMDsKKyAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmZpbmRKcGVnU2l6ZShkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSArIG1haW5KcGVnU2l6ZSwKKyAgICAgICAgICAgICAgICBhY3R1YWxEZXB0aFBob3RvU2l6ZSAtIG1haW5KcGVnU2l6ZSwgJmRlcHRoTWFwU2l6ZSksIE9LKTsKKyAgICBBU1NFUlRfVFJVRSgoZGVwdGhNYXBTaXplID4gMCkgJiYgKGRlcHRoTWFwU2l6ZSA8IChhY3R1YWxEZXB0aFBob3RvU2l6ZSAtIG1haW5KcGVnU2l6ZSkpKTsKKworICAgIGRsY2xvc2UobGliSGFuZGxlKTsKK30KKworVEVTVChEZXB0aFByb2Nlc3NvclRlc3QsIFRlc3REZXB0aFBob3RvRXhpZk9yaWVudGF0aW9uKSB7CisgICAgdm9pZCAqbGliSGFuZGxlOworICAgIGludCBqcGVnUXVhbGl0eSA9IDk1OworCisgICAgcHJvY2Vzc19kZXB0aF9waG90b19mcmFtZSBwcm9jZXNzRnVuYzsKKyAgICBsaW5rVG9EZXB0aFBob3RvTGlicmFyeSgmbGliSGFuZGxlLCAmcHJvY2Vzc0Z1bmMpOworICAgIGlmIChsaWJIYW5kbGUgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBEZXB0aCBsaWJyYXJ5IG5vIHByZXNlbnQsIG5vdGhpbmcgbW9yZSB0byB0ZXN0LgorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgRXhpZk9yaWVudGF0aW9uIGV4aWZPcmllbnRhdGlvbnNbXSA9IHsgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQsCisgICAgICAgICAgICBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUywgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl85MF9ERUdSRUVTLAorICAgICAgICAgICAgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8xODBfREVHUkVFUywgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8yNzBfREVHUkVFUyB9OworICAgIGZvciAoYXV0byBleGlmT3JpZW50YXRpb24gOiBleGlmT3JpZW50YXRpb25zKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvbG9ySnBlZ0J1ZmZlcjsKKyAgICAgICAgZ2VuZXJhdGVDb2xvckpwZWdCdWZmZXIoanBlZ1F1YWxpdHksIGV4aWZPcmllbnRhdGlvbiwgLyppbmNsdWRlRXhpZiovIHRydWUsCisgICAgICAgICAgICAgICAgLypzd2l0Y2hEaW1lbnNpb25zKi8gZmFsc2UsICZjb2xvckpwZWdCdWZmZXIpOworICAgICAgICBpZiAoZXhpZk9yaWVudGF0aW9uICE9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVEKSB7CisgICAgICAgICAgICBhdXRvIGpwZWdFeGlmT3JpZW50YXRpb24gPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRDsKKyAgICAgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6Z2V0RXhpZk9yaWVudGF0aW9uKGNvbG9ySnBlZ0J1ZmZlci5kYXRhKCksCisgICAgICAgICAgICAgICAgICAgIGNvbG9ySnBlZ0J1ZmZlci5zaXplKCksICZqcGVnRXhpZk9yaWVudGF0aW9uKSwgT0spOworICAgICAgICAgICAgQVNTRVJUX0VRKGV4aWZPcmllbnRhdGlvbiwganBlZ0V4aWZPcmllbnRhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OmFycmF5PHVpbnQxNl90LCBrVGVzdEJ1ZmZlckRlcHRoU2l6ZT4gZGVwdGgxNkJ1ZmZlcjsKKyAgICAgICAgZ2VuZXJhdGVEZXB0aDE2QnVmZmVyKCZkZXB0aDE2QnVmZmVyKTsKKworICAgICAgICBEZXB0aFBob3RvSW5wdXRGcmFtZSBpbnB1dEZyYW1lOworICAgICAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ0J1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+IChjb2xvckpwZWdCdWZmZXIuZGF0YSgpKTsKKyAgICAgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdTaXplID0gY29sb3JKcGVnQnVmZmVyLnNpemUoKTsKKyAgICAgICAgLy8gV29yc3QgY2FzZSBib3RoIGRlcHRoIGFuZCBjb25maWRlbmNlIG1hcHMgaGF2ZSB0aGUgc2FtZSBzaXplIGFzIHRoZSBtYWluIGNvbG9yIGltYWdlLgorICAgICAgICBpbnB1dEZyYW1lLm1NYXhKcGVnU2l6ZSA9IGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSAqIDM7CisgICAgICAgIGlucHV0RnJhbWUubU1haW5KcGVnV2lkdGggPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgICAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ0hlaWdodCA9IGtUZXN0QnVmZmVySGVpZ2h0OworICAgICAgICBpbnB1dEZyYW1lLm1KcGVnUXVhbGl0eSA9IGpwZWdRdWFsaXR5OworICAgICAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcEJ1ZmZlciA9IGRlcHRoMTZCdWZmZXIuZGF0YSgpOworICAgICAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcFdpZHRoID0gaW5wdXRGcmFtZS5tRGVwdGhNYXBTdHJpZGUgPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgICAgICBpbnB1dEZyYW1lLm1EZXB0aE1hcEhlaWdodCA9IGtUZXN0QnVmZmVySGVpZ2h0OworCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRlcHRoUGhvdG9CdWZmZXIoaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUpOworICAgICAgICBzaXplX3QgYWN0dWFsRGVwdGhQaG90b1NpemUgPSAwOworICAgICAgICBBU1NFUlRfRVEocHJvY2Vzc0Z1bmMoaW5wdXRGcmFtZSwgZGVwdGhQaG90b0J1ZmZlci5zaXplKCksIGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpLAorICAgICAgICAgICAgICAgICZhY3R1YWxEZXB0aFBob3RvU2l6ZSksIDApOworICAgICAgICBBU1NFUlRfVFJVRSgoYWN0dWFsRGVwdGhQaG90b1NpemUgPiAwKSAmJgorICAgICAgICAgICAgICAgIChkZXB0aFBob3RvQnVmZmVyLnNpemUoKSA+PSBhY3R1YWxEZXB0aFBob3RvU2l6ZSkpOworCisgICAgICAgIHNpemVfdCBtYWluSnBlZ1NpemUgPSAwOworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmZpbmRKcGVnU2l6ZShkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSwgYWN0dWFsRGVwdGhQaG90b1NpemUsCisgICAgICAgICAgICAgICAgJm1haW5KcGVnU2l6ZSksIE9LKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoKG1haW5KcGVnU2l6ZSA+IDApICYmIChtYWluSnBlZ1NpemUgPCBhY3R1YWxEZXB0aFBob3RvU2l6ZSkpOworICAgICAgICBzaXplX3QgZGVwdGhNYXBTaXplID0gMDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpmaW5kSnBlZ1NpemUoZGVwdGhQaG90b0J1ZmZlci5kYXRhKCkgKyBtYWluSnBlZ1NpemUsCisgICAgICAgICAgICAgICAgYWN0dWFsRGVwdGhQaG90b1NpemUgLSBtYWluSnBlZ1NpemUsICZkZXB0aE1hcFNpemUpLCBPSyk7CisgICAgICAgIEFTU0VSVF9UUlVFKChkZXB0aE1hcFNpemUgPiAwKSAmJiAoZGVwdGhNYXBTaXplIDwgKGFjdHVhbERlcHRoUGhvdG9TaXplIC0gbWFpbkpwZWdTaXplKSkpOworICAgICAgICBzaXplX3QgY29uZmlkZW5jZU1hcFNpemUgPSBhY3R1YWxEZXB0aFBob3RvU2l6ZSAtIChtYWluSnBlZ1NpemUgKyBkZXB0aE1hcFNpemUpOworCisgICAgICAgIC8vRGVwdGggYW5kIGNvbmZpZGVuY2UgaW1hZ2VzIG11c3QgaGF2ZSB0aGUgc2FtZSBFWElGIG9yaWVudGF0aW9uIGFzIHRoZSBzb3VyY2UKKyAgICAgICAgYXV0byBkZXB0aEpwZWdFeGlmT3JpZW50YXRpb24gPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpnZXRFeGlmT3JpZW50YXRpb24oZGVwdGhQaG90b0J1ZmZlci5kYXRhKCkgKyBtYWluSnBlZ1NpemUsCisgICAgICAgICAgICAgICAgZGVwdGhNYXBTaXplLCAmZGVwdGhKcGVnRXhpZk9yaWVudGF0aW9uKSwgT0spOworICAgICAgICBpZiAoZXhpZk9yaWVudGF0aW9uID09IE9SSUVOVEFUSU9OX1VOREVGSU5FRCkgeworICAgICAgICAgICAgLy8gSW4gY2FzZSBvZiB1bmRlZmluZWQgb3IgbWlzc2luZyBFWElGIG9yaWVudGF0aW9uLCBhbHdheXMgZXhwZWN0IDAgZGVncmVlcyBpbiB0aGUKKyAgICAgICAgICAgIC8vIGRlcHRoIG1hcC4KKyAgICAgICAgICAgIEFTU0VSVF9FUShkZXB0aEpwZWdFeGlmT3JpZW50YXRpb24sIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMF9ERUdSRUVTKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVF9FUShkZXB0aEpwZWdFeGlmT3JpZW50YXRpb24sIGV4aWZPcmllbnRhdGlvbik7CisgICAgICAgIH0KKworICAgICAgICBhdXRvIGNvbmZpZGVuY2VKcGVnRXhpZk9yaWVudGF0aW9uID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl9VTkRFRklORUQ7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6Z2V0RXhpZk9yaWVudGF0aW9uKAorICAgICAgICAgICAgICAgIGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpICsgbWFpbkpwZWdTaXplICsgZGVwdGhNYXBTaXplLAorICAgICAgICAgICAgICAgIGNvbmZpZGVuY2VNYXBTaXplLCAmY29uZmlkZW5jZUpwZWdFeGlmT3JpZW50YXRpb24pLCBPSyk7CisgICAgICAgIGlmIChleGlmT3JpZW50YXRpb24gPT0gT1JJRU5UQVRJT05fVU5ERUZJTkVEKSB7CisgICAgICAgICAgICAvLyBJbiBjYXNlIG9mIHVuZGVmaW5lZCBvciBtaXNzaW5nIEVYSUYgb3JpZW50YXRpb24sIGFsd2F5cyBleHBlY3QgMCBkZWdyZWVzIGluIHRoZQorICAgICAgICAgICAgLy8gY29uZmlkZW5jZSBtYXAuCisgICAgICAgICAgICBBU1NFUlRfRVEoY29uZmlkZW5jZUpwZWdFeGlmT3JpZW50YXRpb24sIEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fMF9ERUdSRUVTKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFTU0VSVF9FUShjb25maWRlbmNlSnBlZ0V4aWZPcmllbnRhdGlvbiwgZXhpZk9yaWVudGF0aW9uKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGRsY2xvc2UobGliSGFuZGxlKTsKK30KKworVEVTVChEZXB0aFByb2Nlc3NvclRlc3QsIFRlc3REZXBodFBob3RvUGh5c2ljYWxSb3RhdGlvbikgeworICAgIHZvaWQgKmxpYkhhbmRsZTsKKyAgICBpbnQganBlZ1F1YWxpdHkgPSA5NTsKKworICAgIHByb2Nlc3NfZGVwdGhfcGhvdG9fZnJhbWUgcHJvY2Vzc0Z1bmM7CisgICAgbGlua1RvRGVwdGhQaG90b0xpYnJhcnkoJmxpYkhhbmRsZSwgJnByb2Nlc3NGdW5jKTsKKyAgICBpZiAobGliSGFuZGxlID09IG51bGxwdHIpIHsKKyAgICAgICAgLy8gRGVwdGggbGlicmFyeSBubyBwcmVzZW50LCBub3RoaW5nIG1vcmUgdG8gdGVzdC4KKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEluIGNhc2Ugb2YgcGh5c2ljYWwgcm90YXRpb24sIHRoZSBFWElGIG9yaWVudGF0aW9uIG11c3QgYWx3YXlzIGJlIDAuCisgICAgYXV0byBleGlmT3JpZW50YXRpb24gPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUzsKKyAgICBEZXB0aFBob3RvT3JpZW50YXRpb24gZGVwdGhPcmllbnRhdGlvbnNbXSA9IHsKKyAgICAgICAgICAgIERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fMF9ERUdSRUVTLAorICAgICAgICAgICAgRGVwdGhQaG90b09yaWVudGF0aW9uOjpERVBUSF9PUklFTlRBVElPTl85MF9ERUdSRUVTLAorICAgICAgICAgICAgRGVwdGhQaG90b09yaWVudGF0aW9uOjpERVBUSF9PUklFTlRBVElPTl8xODBfREVHUkVFUywKKyAgICAgICAgICAgIERlcHRoUGhvdG9PcmllbnRhdGlvbjo6REVQVEhfT1JJRU5UQVRJT05fMjcwX0RFR1JFRVMgfTsKKyAgICBmb3IgKGF1dG8gZGVwdGhPcmllbnRhdGlvbiA6IGRlcHRoT3JpZW50YXRpb25zKSB7CisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvbG9ySnBlZ0J1ZmZlcjsKKyAgICAgICAgYm9vbCBzd2l0Y2hEaW1lbnNpb25zID0gZmFsc2U7CisgICAgICAgIHNpemVfdCBleHBlY3RlZFdpZHRoID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICAgICAgc2l6ZV90IGV4cGVjdGVkSGVpZ2h0ID0ga1Rlc3RCdWZmZXJIZWlnaHQ7CisgICAgICAgIGlmICgoZGVwdGhPcmllbnRhdGlvbiA9PSBEZXB0aFBob3RvT3JpZW50YXRpb246OkRFUFRIX09SSUVOVEFUSU9OXzkwX0RFR1JFRVMpIHx8CisgICAgICAgICAgICAgICAgKGRlcHRoT3JpZW50YXRpb24gPT0gRGVwdGhQaG90b09yaWVudGF0aW9uOjpERVBUSF9PUklFTlRBVElPTl8yNzBfREVHUkVFUykpIHsKKyAgICAgICAgICAgIHN3aXRjaERpbWVuc2lvbnMgPSB0cnVlOworICAgICAgICAgICAgZXhwZWN0ZWRXaWR0aCA9IGtUZXN0QnVmZmVySGVpZ2h0OworICAgICAgICAgICAgZXhwZWN0ZWRIZWlnaHQgPSBrVGVzdEJ1ZmZlcldpZHRoOworICAgICAgICB9CisgICAgICAgIGdlbmVyYXRlQ29sb3JKcGVnQnVmZmVyKGpwZWdRdWFsaXR5LCBleGlmT3JpZW50YXRpb24sIC8qaW5jbHVkZUV4aWYqLyB0cnVlLAorICAgICAgICAgICAgICAgIHN3aXRjaERpbWVuc2lvbnMsICZjb2xvckpwZWdCdWZmZXIpOworICAgICAgICBhdXRvIGpwZWdFeGlmT3JpZW50YXRpb24gPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpnZXRFeGlmT3JpZW50YXRpb24oY29sb3JKcGVnQnVmZmVyLmRhdGEoKSwgY29sb3JKcGVnQnVmZmVyLnNpemUoKSwKKyAgICAgICAgICAgICAgICAmanBlZ0V4aWZPcmllbnRhdGlvbiksIE9LKTsKKyAgICAgICAgQVNTRVJUX0VRKGV4aWZPcmllbnRhdGlvbiwganBlZ0V4aWZPcmllbnRhdGlvbik7CisKKyAgICAgICAgc3RkOjphcnJheTx1aW50MTZfdCwga1Rlc3RCdWZmZXJEZXB0aFNpemU+IGRlcHRoMTZCdWZmZXI7CisgICAgICAgIGdlbmVyYXRlRGVwdGgxNkJ1ZmZlcigmZGVwdGgxNkJ1ZmZlcik7CisKKyAgICAgICAgRGVwdGhQaG90b0lucHV0RnJhbWUgaW5wdXRGcmFtZTsKKyAgICAgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdCdWZmZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPiAoY29sb3JKcGVnQnVmZmVyLmRhdGEoKSk7CisgICAgICAgIGlucHV0RnJhbWUubU1haW5KcGVnU2l6ZSA9IGNvbG9ySnBlZ0J1ZmZlci5zaXplKCk7CisgICAgICAgIC8vIFdvcnN0IGNhc2UgYm90aCBkZXB0aCBhbmQgY29uZmlkZW5jZSBtYXBzIGhhdmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgbWFpbiBjb2xvciBpbWFnZS4KKyAgICAgICAgaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUgPSBpbnB1dEZyYW1lLm1NYWluSnBlZ1NpemUgKiAzOworICAgICAgICBpbnB1dEZyYW1lLm1NYWluSnBlZ1dpZHRoID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICAgICAgaW5wdXRGcmFtZS5tTWFpbkpwZWdIZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICAgICAgaW5wdXRGcmFtZS5tSnBlZ1F1YWxpdHkgPSBqcGVnUXVhbGl0eTsKKyAgICAgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBCdWZmZXIgPSBkZXB0aDE2QnVmZmVyLmRhdGEoKTsKKyAgICAgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBXaWR0aCA9IGlucHV0RnJhbWUubURlcHRoTWFwU3RyaWRlID0ga1Rlc3RCdWZmZXJXaWR0aDsKKyAgICAgICAgaW5wdXRGcmFtZS5tRGVwdGhNYXBIZWlnaHQgPSBrVGVzdEJ1ZmZlckhlaWdodDsKKyAgICAgICAgaW5wdXRGcmFtZS5tT3JpZW50YXRpb24gPSBkZXB0aE9yaWVudGF0aW9uOworCisgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRlcHRoUGhvdG9CdWZmZXIoaW5wdXRGcmFtZS5tTWF4SnBlZ1NpemUpOworICAgICAgICBzaXplX3QgYWN0dWFsRGVwdGhQaG90b1NpemUgPSAwOworICAgICAgICBBU1NFUlRfRVEocHJvY2Vzc0Z1bmMoaW5wdXRGcmFtZSwgZGVwdGhQaG90b0J1ZmZlci5zaXplKCksIGRlcHRoUGhvdG9CdWZmZXIuZGF0YSgpLAorICAgICAgICAgICAgICAgICZhY3R1YWxEZXB0aFBob3RvU2l6ZSksIDApOworICAgICAgICBBU1NFUlRfVFJVRSgoYWN0dWFsRGVwdGhQaG90b1NpemUgPiAwKSAmJgorICAgICAgICAgICAgICAgIChkZXB0aFBob3RvQnVmZmVyLnNpemUoKSA+PSBhY3R1YWxEZXB0aFBob3RvU2l6ZSkpOworCisgICAgICAgIHNpemVfdCBtYWluSnBlZ1NpemUgPSAwOworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmZpbmRKcGVnU2l6ZShkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSwgYWN0dWFsRGVwdGhQaG90b1NpemUsCisgICAgICAgICAgICAgICAgJm1haW5KcGVnU2l6ZSksIE9LKTsKKyAgICAgICAgQVNTRVJUX1RSVUUoKG1haW5KcGVnU2l6ZSA+IDApICYmIChtYWluSnBlZ1NpemUgPCBhY3R1YWxEZXB0aFBob3RvU2l6ZSkpOworICAgICAgICBzaXplX3QgZGVwdGhNYXBTaXplID0gMDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpmaW5kSnBlZ1NpemUoZGVwdGhQaG90b0J1ZmZlci5kYXRhKCkgKyBtYWluSnBlZ1NpemUsCisgICAgICAgICAgICAgICAgYWN0dWFsRGVwdGhQaG90b1NpemUgLSBtYWluSnBlZ1NpemUsICZkZXB0aE1hcFNpemUpLCBPSyk7CisgICAgICAgIEFTU0VSVF9UUlVFKChkZXB0aE1hcFNpemUgPiAwKSAmJiAoZGVwdGhNYXBTaXplIDwgKGFjdHVhbERlcHRoUGhvdG9TaXplIC0gbWFpbkpwZWdTaXplKSkpOworICAgICAgICBzaXplX3QgY29uZmlkZW5jZU1hcFNpemUgPSBhY3R1YWxEZXB0aFBob3RvU2l6ZSAtIChtYWluSnBlZ1NpemUgKyBkZXB0aE1hcFNpemUpOworCisgICAgICAgIC8vRGVwdGggYW5kIGNvbmZpZGVuY2UgaW1hZ2VzIG11c3QgaGF2ZSB0aGUgc2FtZSBFWElGIG9yaWVudGF0aW9uIGFzIHRoZSBzb3VyY2UKKyAgICAgICAgYXV0byBkZXB0aEpwZWdFeGlmT3JpZW50YXRpb24gPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OX1VOREVGSU5FRDsKKyAgICAgICAgQVNTRVJUX0VRKE5WMTJDb21wcmVzc29yOjpnZXRFeGlmT3JpZW50YXRpb24oZGVwdGhQaG90b0J1ZmZlci5kYXRhKCkgKyBtYWluSnBlZ1NpemUsCisgICAgICAgICAgICAgICAgZGVwdGhNYXBTaXplLCAmZGVwdGhKcGVnRXhpZk9yaWVudGF0aW9uKSwgT0spOworICAgICAgICBBU1NFUlRfRVEoZGVwdGhKcGVnRXhpZk9yaWVudGF0aW9uLCBleGlmT3JpZW50YXRpb24pOworICAgICAgICBzaXplX3QgZGVwdGhNYXBXaWR0aCwgZGVwdGhNYXBIZWlnaHQ7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6Z2V0SnBlZ0ltYWdlRGltZW5zaW9ucyhkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSArIG1haW5KcGVnU2l6ZSwKKyAgICAgICAgICAgICAgICBkZXB0aE1hcFNpemUsICZkZXB0aE1hcFdpZHRoLCAmZGVwdGhNYXBIZWlnaHQpLCBPSyk7CisgICAgICAgIEFTU0VSVF9FUShkZXB0aE1hcFdpZHRoLCBleHBlY3RlZFdpZHRoKTsKKyAgICAgICAgQVNTRVJUX0VRKGRlcHRoTWFwSGVpZ2h0LCBleHBlY3RlZEhlaWdodCk7CisKKyAgICAgICAgYXV0byBjb25maWRlbmNlSnBlZ0V4aWZPcmllbnRhdGlvbiA9IEV4aWZPcmllbnRhdGlvbjo6T1JJRU5UQVRJT05fVU5ERUZJTkVEOworICAgICAgICBBU1NFUlRfRVEoTlYxMkNvbXByZXNzb3I6OmdldEV4aWZPcmllbnRhdGlvbigKKyAgICAgICAgICAgICAgICBkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSArIG1haW5KcGVnU2l6ZSArIGRlcHRoTWFwU2l6ZSwgY29uZmlkZW5jZU1hcFNpemUsCisgICAgICAgICAgICAgICAgJmNvbmZpZGVuY2VKcGVnRXhpZk9yaWVudGF0aW9uKSwgT0spOworICAgICAgICBBU1NFUlRfRVEoY29uZmlkZW5jZUpwZWdFeGlmT3JpZW50YXRpb24sIGV4aWZPcmllbnRhdGlvbik7CisgICAgICAgIHNpemVfdCBjb25maWRlbmNlTWFwV2lkdGgsIGNvbmZpZGVuY2VNYXBIZWlnaHQ7CisgICAgICAgIEFTU0VSVF9FUShOVjEyQ29tcHJlc3Nvcjo6Z2V0SnBlZ0ltYWdlRGltZW5zaW9ucygKKyAgICAgICAgICAgICAgICBkZXB0aFBob3RvQnVmZmVyLmRhdGEoKSArIG1haW5KcGVnU2l6ZSArIGRlcHRoTWFwU2l6ZSwgY29uZmlkZW5jZU1hcFNpemUsCisgICAgICAgICAgICAgICAgJmNvbmZpZGVuY2VNYXBXaWR0aCwgJmNvbmZpZGVuY2VNYXBIZWlnaHQpLCBPSyk7CisgICAgICAgIEFTU0VSVF9FUShjb25maWRlbmNlTWFwV2lkdGgsIGV4cGVjdGVkV2lkdGgpOworICAgICAgICBBU1NFUlRfRVEoY29uZmlkZW5jZU1hcEhlaWdodCwgZXhwZWN0ZWRIZWlnaHQpOworICAgIH0KKworICAgIGRsY2xvc2UobGliSGFuZGxlKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0Rpc3RvcnRpb25NYXBwZXJUZXN0LmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL0Rpc3RvcnRpb25NYXBwZXJUZXN0LmNwcAppbmRleCAyYTY4OWM2Li41NDkzNWM5IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9EaXN0b3J0aW9uTWFwcGVyVGVzdC5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdGVzdHMvRGlzdG9ydGlvbk1hcHBlclRlc3QuY3BwCkBAIC0xNjcsNiArMTY3LDMwIEBACiAgICAgfQogfQogCitURVNUKERpc3RvcnRpb25NYXBwZXJUZXN0LCBDbGFtcENvbnNpc3RlbmN5KSB7CisgICAgc3RhdHVzX3QgcmVzOworCisgICAgc3RkOjphcnJheTxpbnQzMl90LCA0PiBhY3RpdmVBcnJheSA9IHswLCAwLCA0MDMyLCAzMDI0fTsKKyAgICBEaXN0b3J0aW9uTWFwcGVyIG07CisgICAgc2V0dXBUZXN0TWFwcGVyKCZtLCBpZGVudGl0eURpc3RvcnRpb24sIHRlc3RJQ2FsLCAvKmFjdGl2ZUFycmF5Ki8gYWN0aXZlQXJyYXkuZGF0YSgpLAorICAgICAgICAgICAgLypwcmVDb3JyZWN0aW9uQWN0aXZlQXJyYXkqLyBhY3RpdmVBcnJheS5kYXRhKCkpOworCisgICAgYXV0byByZWN0c09yaWcgPSBhY3RpdmVBcnJheTsKKyAgICByZXMgPSBtLm1hcENvcnJlY3RlZFJlY3RUb1JhdyhhY3RpdmVBcnJheS5kYXRhKCksIDEsIC8qY2xhbXAqL3RydWUsIC8qc2ltcGxlKi8gdHJ1ZSk7CisgICAgQVNTRVJUX0VRKHJlcywgT0spOworCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhY3RpdmVBcnJheS5zaXplKCk7IGkrKykgeworICAgICAgICBFWFBFQ1RfRVEoYWN0aXZlQXJyYXlbaV0sIHJlY3RzT3JpZ1tpXSk7CisgICAgfQorCisgICAgcmVzID0gbS5tYXBSYXdSZWN0VG9Db3JyZWN0ZWQoYWN0aXZlQXJyYXkuZGF0YSgpLCAxLCAvKmNsYW1wKi90cnVlLCAvKnNpbXBsZSovIHRydWUpOworICAgIEFTU0VSVF9FUShyZXMsIE9LKTsKKworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYWN0aXZlQXJyYXkuc2l6ZSgpOyBpKyspIHsKKyAgICAgICAgRVhQRUNUX0VRKGFjdGl2ZUFycmF5W2ldLCByZWN0c09yaWdbaV0pOworICAgIH0KK30KKwogVEVTVChEaXN0b3J0aW9uTWFwcGVyVGVzdCwgU2ltcGxlVHJhbnNmb3JtKSB7CiAgICAgc3RhdHVzX3QgcmVzOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9OVjEyQ29tcHJlc3Nvci5jcHAgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9OVjEyQ29tcHJlc3Nvci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE0MWExZgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL05WMTJDb21wcmVzc29yLmNwcApAQCAtMCwwICsxLDM3OSBAQAorLyoKKyogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAiVGVzdF9OVjEyQ29tcHJlc3NvciIKKworI2luY2x1ZGUgIk5WMTJDb21wcmVzc29yLmgiCisKKyNpbmNsdWRlIDxsaWJleGlmL2V4aWYtZGF0YS5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKwordXNpbmcgbmFtZXNwYWNlIGFuZHJvaWQ7Cit1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y2FtZXJhMzsKKworbmFtZXNwYWNlIHN0ZCB7Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IGRlZmF1bHRfZGVsZXRlPEV4aWZFbnRyeT4geworICAgIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoRXhpZkVudHJ5KiBlbnRyeSkgY29uc3QgeyBleGlmX2VudHJ5X3VucmVmKGVudHJ5KTsgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBkZWZhdWx0X2RlbGV0ZTxFeGlmRGF0YT4geworICAgIGlubGluZSB2b2lkIG9wZXJhdG9yKCkoRXhpZkRhdGEqIGRhdGEpIGNvbnN0IHsgZXhpZl9kYXRhX3VucmVmKGRhdGEpOyB9Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc3RkCisKK2Jvb2wgTlYxMkNvbXByZXNzb3I6OmNvbXByZXNzKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHF1YWxpdHkpIHsKKyAgICBpZiAoIWNvbmZpZ3VyZUNvbXByZXNzb3Iod2lkdGgsIGhlaWdodCwgcXVhbGl0eSkpIHsKKyAgICAgICAgLy8gdGhlIG1ldGhvZCB3aWxsIGhhdmUgbG9nZ2VkIGEgbW9yZSBkZXRhaWxlZCBlcnJvciBtZXNzYWdlIHRoYW4gd2UgY2FuCisgICAgICAgIC8vIHByb3ZpZGUgaGVyZSBzbyBqdXN0IHJldHVybi4KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHJldHVybiBjb21wcmVzc0RhdGEoZGF0YSwgLypleGlmRGF0YSovIG51bGxwdHIpOworfQorCitib29sIE5WMTJDb21wcmVzc29yOjpjb21wcmVzc1dpdGhFeGlmT3JpZW50YXRpb24oY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgICAgICBpbnQgcXVhbGl0eSwgYW5kcm9pZDo6Y2FtZXJhMzo6RXhpZk9yaWVudGF0aW9uIGV4aWZWYWx1ZSkgeworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRGF0YT4gZXhpZkRhdGEoZXhpZl9kYXRhX25ldygpKTsKKyAgICBpZiAoZXhpZkRhdGEuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZXhpZl9kYXRhX3NldF9vcHRpb24oZXhpZkRhdGEuZ2V0KCksIEVYSUZfREFUQV9PUFRJT05fRk9MTE9XX1NQRUNJRklDQVRJT04pOworICAgIGV4aWZfZGF0YV9zZXRfZGF0YV90eXBlKGV4aWZEYXRhLmdldCgpLCBFWElGX0RBVEFfVFlQRV9DT01QUkVTU0VEKTsKKyAgICBleGlmX2RhdGFfc2V0X2J5dGVfb3JkZXIoZXhpZkRhdGEuZ2V0KCksIEVYSUZfQllURV9PUkRFUl9JTlRFTCk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZXhpZkVudHJ5KGV4aWZfZW50cnlfbmV3KCkpOworICAgIGlmIChleGlmRW50cnkuZ2V0KCkgPT0gIG51bGxwdHIpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGV4aWZFbnRyeS0+dGFnID0gRVhJRl9UQUdfT1JJRU5UQVRJT047CisgICAgZXhpZl9jb250ZW50X2FkZF9lbnRyeShleGlmRGF0YS0+aWZkW0VYSUZfSUZEXzBdLCBleGlmRW50cnkuZ2V0KCkpOworICAgIGV4aWZfZW50cnlfaW5pdGlhbGl6ZShleGlmRW50cnkuZ2V0KCksIGV4aWZFbnRyeS0+dGFnKTsKKyAgICBleGlmX3NldF9zaG9ydChleGlmRW50cnktPmRhdGEsIEVYSUZfQllURV9PUkRFUl9JTlRFTCwgZXhpZlZhbHVlKTsKKworICAgIGlmICghY29uZmlndXJlQ29tcHJlc3Nvcih3aWR0aCwgaGVpZ2h0LCBxdWFsaXR5KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIGNvbXByZXNzRGF0YShkYXRhLCBleGlmRGF0YS5nZXQoKSk7Cit9CisKK2NvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBOVjEyQ29tcHJlc3Nvcjo6Z2V0Q29tcHJlc3NlZERhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1EZXN0TWFuYWdlci5tQnVmZmVyOworfQorCitib29sIE5WMTJDb21wcmVzc29yOjpjb25maWd1cmVDb21wcmVzc29yKGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHF1YWxpdHkpIHsKKyAgICBtQ29tcHJlc3NJbmZvLmVyciA9IGpwZWdfc3RkX2Vycm9yKCZtRXJyb3JNYW5hZ2VyKTsKKyAgICAvLyBOT1RFISBEQU5HRVIhIERvIG5vdCBjb25zdHJ1Y3QgYW55IG5vbi10cml2aWFsIG9iamVjdHMgYmVsb3cgc2V0am1wIQorICAgIC8vIFRoZSBjb21waWxlciB3aWxsIG5vdCBnZW5lcmF0ZSBjb2RlIHRvIGRlc3Ryb3kgdGhlbSBkdXJpbmcgdGhlIHJldHVybgorICAgIC8vIGJlbG93IHNvIHRoZXkgd2lsbCBsZWFrLiBBZGRpdGlvbmFsbHksIGRvIG5vdCBwbGFjZSBhbnkgY2FsbHMgdG8gbGlianBlZworICAgIC8vIHRoYXQgY2FuIGZhaWwgYWJvdmUgdGhpcyBsaW5lIG9yIGFueSBlcnJvciB3aWxsIGNhdXNlIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICBpZiAoc2V0am1wKG1FcnJvck1hbmFnZXIubUp1bXBCdWZmZXIpKSB7CisgICAgICAgIC8vIFRoaXMgaXMgd2hlcmUgdGhlIGVycm9yIGhhbmRsZXIgd2lsbCBqdW1wIGluIGNhc2Ugc2V0dXAgZmFpbHMKKyAgICAgICAgLy8gVGhlIGVycm9yIG1hbmFnZXIgd2lsbCBBTE9HIGFuIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGpwZWdfY3JlYXRlX2NvbXByZXNzKCZtQ29tcHJlc3NJbmZvKTsKKworICAgIG1Db21wcmVzc0luZm8uaW1hZ2Vfd2lkdGggPSB3aWR0aDsKKyAgICBtQ29tcHJlc3NJbmZvLmltYWdlX2hlaWdodCA9IGhlaWdodDsKKyAgICBtQ29tcHJlc3NJbmZvLmlucHV0X2NvbXBvbmVudHMgPSAzOworICAgIG1Db21wcmVzc0luZm8uaW5fY29sb3Jfc3BhY2UgPSBKQ1NfWUNiQ3I7CisgICAganBlZ19zZXRfZGVmYXVsdHMoJm1Db21wcmVzc0luZm8pOworCisgICAganBlZ19zZXRfcXVhbGl0eSgmbUNvbXByZXNzSW5mbywgcXVhbGl0eSwgVFJVRSk7CisgICAgLy8gSXQgbWF5IHNlZW0gd2VpcmQgdG8gc2V0IGNvbG9yIHNwYWNlIGhlcmUgYWdhaW4gYnV0IHRoaXMgd2lsbCBhbHNvIHNldAorICAgIC8vIG90aGVyIGZpZWxkcy4gVGhlc2UgZmllbGRzIG1pZ2h0IGJlIG92ZXJ3cml0dGVuIGJ5IGpwZWdfc2V0X2RlZmF1bHRzCisgICAganBlZ19zZXRfY29sb3JzcGFjZSgmbUNvbXByZXNzSW5mbywgSkNTX1lDYkNyKTsKKyAgICBtQ29tcHJlc3NJbmZvLnJhd19kYXRhX2luID0gVFJVRTsKKyAgICBtQ29tcHJlc3NJbmZvLmRjdF9tZXRob2QgPSBKRENUX0lGQVNUOworICAgIC8vIFNldCBzYW1wbGluZyBmYWN0b3JzCisgICAgbUNvbXByZXNzSW5mby5jb21wX2luZm9bMF0uaF9zYW1wX2ZhY3RvciA9IDI7CisgICAgbUNvbXByZXNzSW5mby5jb21wX2luZm9bMF0udl9zYW1wX2ZhY3RvciA9IDI7CisgICAgbUNvbXByZXNzSW5mby5jb21wX2luZm9bMV0uaF9zYW1wX2ZhY3RvciA9IDE7CisgICAgbUNvbXByZXNzSW5mby5jb21wX2luZm9bMV0udl9zYW1wX2ZhY3RvciA9IDE7CisgICAgbUNvbXByZXNzSW5mby5jb21wX2luZm9bMl0uaF9zYW1wX2ZhY3RvciA9IDE7CisgICAgbUNvbXByZXNzSW5mby5jb21wX2luZm9bMl0udl9zYW1wX2ZhY3RvciA9IDE7CisKKyAgICBtQ29tcHJlc3NJbmZvLmRlc3QgPSAmbURlc3RNYW5hZ2VyOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGRlaW50ZXJsZWF2ZShjb25zdCB1aW50OF90KiB2dVBsYW5hciwgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHVSb3dzLAorICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgdlJvd3MsIGludCByb3dJbmRleCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgc3RyaWRlKSB7CisgICAgaW50IG51bVJvd3MgPSAoaGVpZ2h0IC0gcm93SW5kZXgpIC8gMjsKKyAgICBpZiAobnVtUm93cyA+IDgpIG51bVJvd3MgPSA4OworICAgIGZvciAoaW50IHJvdyA9IDA7IHJvdyA8IG51bVJvd3M7ICsrcm93KSB7CisgICAgICAgIGludCBvZmZzZXQgPSAoKHJvd0luZGV4ID4+IDEpICsgcm93KSAqIHN0cmlkZTsKKyAgICAgICAgY29uc3QgdWludDhfdCogdnUgPSB2dVBsYW5hciArIG9mZnNldDsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAod2lkdGggPj4gMSk7ICsraSkgeworICAgICAgICAgICAgaW50IGluZGV4ID0gcm93ICogKHdpZHRoID4+IDEpICsgaTsKKyAgICAgICAgICAgIHVSb3dzW2luZGV4XSA9IHZ1WzFdOworICAgICAgICAgICAgdlJvd3NbaW5kZXhdID0gdnVbMF07CisgICAgICAgICAgICB2dSArPSAyOworICAgICAgICB9CisgICAgfQorfQorCitib29sIE5WMTJDb21wcmVzc29yOjpjb21wcmVzc0RhdGEoY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgRXhpZkRhdGEqIGV4aWZEYXRhKSB7CisgICAgY29uc3QgdWludDhfdCogeVsxNl07CisgICAgY29uc3QgdWludDhfdCogY2JbOF07CisgICAgY29uc3QgdWludDhfdCogY3JbOF07CisgICAgY29uc3QgdWludDhfdCoqIHBsYW5lc1szXSA9IHsgeSwgY2IsIGNyIH07CisKKyAgICBpbnQgaSwgb2Zmc2V0OworICAgIGludCB3aWR0aCA9IG1Db21wcmVzc0luZm8uaW1hZ2Vfd2lkdGg7CisgICAgaW50IGhlaWdodCA9IG1Db21wcmVzc0luZm8uaW1hZ2VfaGVpZ2h0OworICAgIGNvbnN0IHVpbnQ4X3QqIHlQbGFuYXIgPSBkYXRhOworICAgIGNvbnN0IHVpbnQ4X3QqIHZ1UGxhbmFyID0gZGF0YSArICh3aWR0aCAqIGhlaWdodCk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdVJvd3MoOCAqICh3aWR0aCA+PiAxKSk7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdlJvd3MoOCAqICh3aWR0aCA+PiAxKSk7CisKKyAgICAvLyBOT1RFISBEQU5HRVIhIERvIG5vdCBjb25zdHJ1Y3QgYW55IG5vbi10cml2aWFsIG9iamVjdHMgYmVsb3cgc2V0am1wIQorICAgIC8vIFRoZSBjb21waWxlciB3aWxsIG5vdCBnZW5lcmF0ZSBjb2RlIHRvIGRlc3Ryb3kgdGhlbSBkdXJpbmcgdGhlIHJldHVybgorICAgIC8vIGJlbG93IHNvIHRoZXkgd2lsbCBsZWFrLiBBZGRpdGlvbmFsbHksIGRvIG5vdCBwbGFjZSBhbnkgY2FsbHMgdG8gbGlianBlZworICAgIC8vIHRoYXQgY2FuIGZhaWwgYWJvdmUgdGhpcyBsaW5lIG9yIGFueSBlcnJvciB3aWxsIGNhdXNlIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICBpZiAoc2V0am1wKG1FcnJvck1hbmFnZXIubUp1bXBCdWZmZXIpKSB7CisgICAgICAgIC8vIFRoaXMgaXMgd2hlcmUgdGhlIGVycm9yIGhhbmRsZXIgd2lsbCBqdW1wIGluIGNhc2UgY29tcHJlc3Npb24gZmFpbHMKKyAgICAgICAgLy8gVGhlIGVycm9yIG1hbmFnZXIgd2lsbCBBTE9HIGFuIGFwcHJvcHJpYXRlIGVycm9yIG1lc3NhZ2UKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGpwZWdfc3RhcnRfY29tcHJlc3MoJm1Db21wcmVzc0luZm8sIFRSVUUpOworCisgICAgYXR0YWNoRXhpZkRhdGEoZXhpZkRhdGEpOworCisgICAgLy8gcHJvY2VzcyAxNiBsaW5lcyBvZiBZIGFuZCA4IGxpbmVzIG9mIFUvViBlYWNoIHRpbWUuCisgICAgd2hpbGUgKG1Db21wcmVzc0luZm8ubmV4dF9zY2FubGluZSA8IG1Db21wcmVzc0luZm8uaW1hZ2VfaGVpZ2h0KSB7CisgICAgICAgIC8vZGVpbnRlcmxlYXZlIHUgYW5kIHYKKyAgICAgICAgZGVpbnRlcmxlYXZlKHZ1UGxhbmFyLCB1Um93cywgdlJvd3MsIG1Db21wcmVzc0luZm8ubmV4dF9zY2FubGluZSwKKyAgICAgICAgICAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQsIHdpZHRoKTsKKworICAgICAgICAvLyBKcGVnIGxpYnJhcnkgaWdub3JlcyB0aGUgcm93cyB3aG9zZSBpbmRpY2VzIGFyZSBncmVhdGVyIHRoYW4gaGVpZ2h0LgorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgMTY7IGkrKykgeworICAgICAgICAgICAgLy8geSByb3cKKyAgICAgICAgICAgIHlbaV0gPSB5UGxhbmFyICsgKG1Db21wcmVzc0luZm8ubmV4dF9zY2FubGluZSArIGkpICogd2lkdGg7CisKKyAgICAgICAgICAgIC8vIGNvbnN0cnVjdCB1IHJvdyBhbmQgdiByb3cKKyAgICAgICAgICAgIGlmICgoaSAmIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBoZWlnaHQgYW5kIHdpZHRoIGFyZSBib3RoIGhhbHZlZCBiZWNhdXNlIG9mIGRvd25zYW1wbGluZworICAgICAgICAgICAgICAgIG9mZnNldCA9IChpID4+IDEpICogKHdpZHRoID4+IDEpOworICAgICAgICAgICAgICAgIGNiW2kvMl0gPSAmdVJvd3Nbb2Zmc2V0XTsKKyAgICAgICAgICAgICAgICBjcltpLzJdID0gJnZSb3dzW29mZnNldF07CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICBqcGVnX3dyaXRlX3Jhd19kYXRhKCZtQ29tcHJlc3NJbmZvLCBjb25zdF9jYXN0PEpTQU1QSU1BR0U+KHBsYW5lcyksIDE2KTsKKyAgICB9CisKKyAgICBqcGVnX2ZpbmlzaF9jb21wcmVzcygmbUNvbXByZXNzSW5mbyk7CisgICAganBlZ19kZXN0cm95X2NvbXByZXNzKCZtQ29tcHJlc3NJbmZvKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE5WMTJDb21wcmVzc29yOjphdHRhY2hFeGlmRGF0YShFeGlmRGF0YSogZXhpZkRhdGEpIHsKKyAgICBpZiAoZXhpZkRhdGEgPT0gbnVsbHB0cikgeworICAgICAgICAvLyBUaGlzIGlzIG5vdCBhbiBlcnJvciwgd2UgZG9uJ3QgcmVxdWlyZSBFWElGIGRhdGEKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gU2F2ZSB0aGUgRVhJRiBkYXRhIHRvIG1lbW9yeQorICAgIHVuc2lnbmVkIGNoYXIqIHJhd0RhdGEgPSBudWxscHRyOworICAgIHVuc2lnbmVkIGludCBzaXplID0gMDsKKyAgICBleGlmX2RhdGFfc2F2ZV9kYXRhKGV4aWZEYXRhLCAmcmF3RGF0YSwgJnNpemUpOworICAgIGlmIChyYXdEYXRhID09IG51bGxwdHIpIHsKKyAgICAgICAgQUxPR0UoIkZhaWxlZCB0byBjcmVhdGUgRVhJRiBkYXRhIGJsb2NrIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBqcGVnX3dyaXRlX21hcmtlcigmbUNvbXByZXNzSW5mbywgSlBFR19BUFAwICsgMSwgcmF3RGF0YSwgc2l6ZSk7CisgICAgZnJlZShyYXdEYXRhKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworTlYxMkNvbXByZXNzb3I6OkVycm9yTWFuYWdlcjo6RXJyb3JNYW5hZ2VyKCkgeworICAgIGVycm9yX2V4aXQgPSAmb25KcGVnRXJyb3I7Cit9CisKK3ZvaWQgTlYxMkNvbXByZXNzb3I6OkVycm9yTWFuYWdlcjo6b25KcGVnRXJyb3Ioal9jb21tb25fcHRyIGNpbmZvKSB7CisgICAgLy8gTk9URSEgRG8gbm90IGNvbnN0cnVjdCBhbnkgbm9uLXRyaXZpYWwgb2JqZWN0cyBpbiB0aGlzIG1ldGhvZCBhdCB0aGUgdG9wCisgICAgLy8gc2NvcGUuIFRoZWlyIGRlc3RydWN0b3JzIHdpbGwgbm90IGJlIGNhbGxlZC4gSWYgeW91IGRvIG5lZWQgc3VjaCBhbgorICAgIC8vIG9iamVjdCBjcmVhdGUgYSBsb2NhbCBzY29wZSB0aGF0IGRvZXMgbm90IGluY2x1ZGUgdGhlIGxvbmdqbXAgY2FsbCwKKyAgICAvLyB0aGF0IGVuc3VyZXMgdGhlIG9iamVjdCBpcyBkZXN0cm95ZWQgYmVmb3JlIGxvbmdqbXAgaXMgY2FsbGVkLgorICAgIEVycm9yTWFuYWdlciogZXJyb3JNYW5hZ2VyID0gcmVpbnRlcnByZXRfY2FzdDxFcnJvck1hbmFnZXIqPihjaW5mby0+ZXJyKTsKKworICAgIC8vIEZvcm1hdCBhbmQgbG9nIGVycm9yIG1lc3NhZ2UKKyAgICBjaGFyIGVycm9yTWVzc2FnZVtKTVNHX0xFTkdUSF9NQVhdOworICAgICgqZXJyb3JNYW5hZ2VyLT5mb3JtYXRfbWVzc2FnZSkoY2luZm8sIGVycm9yTWVzc2FnZSk7CisgICAgZXJyb3JNZXNzYWdlW3NpemVvZihlcnJvck1lc3NhZ2UpIC0gMV0gPSAnXDAnOworICAgIEFMT0dFKCJKUEVHIGNvbXByZXNzaW9uIGVycm9yOiAlcyIsIGVycm9yTWVzc2FnZSk7CisgICAganBlZ19kZXN0cm95KGNpbmZvKTsKKworICAgIC8vIEFuZCB0aHJvdWdoIHRoZSBsb29raW5nIGdsYXNzIHdlIGdvCisgICAgbG9uZ2ptcChlcnJvck1hbmFnZXItPm1KdW1wQnVmZmVyLCAxKTsKK30KKworTlYxMkNvbXByZXNzb3I6OkRlc3RpbmF0aW9uTWFuYWdlcjo6RGVzdGluYXRpb25NYW5hZ2VyKCkgeworICAgIGluaXRfZGVzdGluYXRpb24gPSAmaW5pdERlc3RpbmF0aW9uOworICAgIGVtcHR5X291dHB1dF9idWZmZXIgPSAmZW1wdHlPdXRwdXRCdWZmZXI7CisgICAgdGVybV9kZXN0aW5hdGlvbiA9ICZ0ZXJtRGVzdGluYXRpb247Cit9CisKK3ZvaWQgTlYxMkNvbXByZXNzb3I6OkRlc3RpbmF0aW9uTWFuYWdlcjo6aW5pdERlc3RpbmF0aW9uKGpfY29tcHJlc3NfcHRyIGNpbmZvKSB7CisgICAgYXV0byBtYW5hZ2VyID0gcmVpbnRlcnByZXRfY2FzdDxEZXN0aW5hdGlvbk1hbmFnZXIqPihjaW5mby0+ZGVzdCk7CisKKyAgICAvLyBTdGFydCBvdXQgd2l0aCBzb21lIGFyYml0cmFyeSBidXQgbm90IHRvbyBsYXJnZSBidWZmZXIgc2l6ZQorICAgIG1hbmFnZXItPm1CdWZmZXIucmVzaXplKDE2ICogMTAyNCk7CisgICAgbWFuYWdlci0+bmV4dF9vdXRwdXRfYnl0ZSA9ICZtYW5hZ2VyLT5tQnVmZmVyWzBdOworICAgIG1hbmFnZXItPmZyZWVfaW5fYnVmZmVyID0gbWFuYWdlci0+bUJ1ZmZlci5zaXplKCk7Cit9CisKK2Jvb2xlYW4gTlYxMkNvbXByZXNzb3I6OkRlc3RpbmF0aW9uTWFuYWdlcjo6ZW1wdHlPdXRwdXRCdWZmZXIoCisgICAgICAgIGpfY29tcHJlc3NfcHRyIGNpbmZvKSB7CisgICAgYXV0byBtYW5hZ2VyID0gcmVpbnRlcnByZXRfY2FzdDxEZXN0aW5hdGlvbk1hbmFnZXIqPihjaW5mby0+ZGVzdCk7CisKKyAgICAvLyBLZWVwIGRvdWJsaW5nIHRoZSBzaXplIG9mIHRoZSBidWZmZXIgZm9yIGEgdmVyeSBsb3csIGFtb3J0aXplZAorICAgIC8vIHBlcmZvcm1hbmNlIGNvc3Qgb2YgdGhlIGFsbG9jYXRpb25zCisgICAgc2l6ZV90IG9sZFNpemUgPSBtYW5hZ2VyLT5tQnVmZmVyLnNpemUoKTsKKyAgICBtYW5hZ2VyLT5tQnVmZmVyLnJlc2l6ZShvbGRTaXplICogMik7CisgICAgbWFuYWdlci0+bmV4dF9vdXRwdXRfYnl0ZSA9ICZtYW5hZ2VyLT5tQnVmZmVyW29sZFNpemVdOworICAgIG1hbmFnZXItPmZyZWVfaW5fYnVmZmVyID0gbWFuYWdlci0+bUJ1ZmZlci5zaXplKCkgLSBvbGRTaXplOworICAgIHJldHVybiBtYW5hZ2VyLT5mcmVlX2luX2J1ZmZlciAhPSAwOworfQorCit2b2lkIE5WMTJDb21wcmVzc29yOjpEZXN0aW5hdGlvbk1hbmFnZXI6OnRlcm1EZXN0aW5hdGlvbihqX2NvbXByZXNzX3B0ciBjaW5mbykgeworICAgIGF1dG8gbWFuYWdlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8RGVzdGluYXRpb25NYW5hZ2VyKj4oY2luZm8tPmRlc3QpOworCisgICAgLy8gUmVzaXplIGRvd24gdG8gdGhlIGV4YWN0IHNpemUgb2YgdGhlIG91dHB1dCwgdGhhdCBpcyByZW1vdmUgYXMgbWFueQorICAgIC8vIGJ5dGVzIGFzIHRoZXJlIGFyZSBsZWZ0IGluIHRoZSBidWZmZXIKKyAgICBtYW5hZ2VyLT5tQnVmZmVyLnJlc2l6ZShtYW5hZ2VyLT5tQnVmZmVyLnNpemUoKSAtIG1hbmFnZXItPmZyZWVfaW5fYnVmZmVyKTsKK30KKworc3RhdHVzX3QgTlYxMkNvbXByZXNzb3I6OmZpbmRKcGVnU2l6ZSh1aW50OF90ICpqcGVnQnVmZmVyLCBzaXplX3QgbWF4U2l6ZSwgc2l6ZV90ICpzaXplIC8qb3V0Ki8pIHsKKyAgICBpZiAoKHNpemUgPT0gbnVsbHB0cikgfHwgKGpwZWdCdWZmZXIgPT0gbnVsbHB0cikpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoY2hlY2tKcGVnU3RhcnQoanBlZ0J1ZmZlcikgPT0gMCkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIC8vIFJlYWQgSkZJRiBzZWdtZW50IG1hcmtlcnMsIHNraXAgb3ZlciBzZWdtZW50IGRhdGEKKyAgICAqc2l6ZSA9IGtNYXJrZXJMZW5ndGg7IC8vanVtcCB0byBTdGFydCBPZiBJbWFnZQorICAgIHdoaWxlICgqc2l6ZSA8PSBtYXhTaXplIC0ga01hcmtlckxlbmd0aCkgeworICAgICAgICBzZWdtZW50X3QgKnNlZ21lbnQgPSAoc2VnbWVudF90KikoanBlZ0J1ZmZlciArICpzaXplKTsKKyAgICAgICAgdWludDhfdCB0eXBlID0gY2hlY2tKcGVnTWFya2VyKHNlZ21lbnQtPm1hcmtlcik7CisgICAgICAgIGlmICh0eXBlID09IDApIHsgLy8gaW52YWxpZCBtYXJrZXIsIG5vIG1vcmUgc2VnbWVudHMsIGJlZ2luIEpQRUcgZGF0YQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHR5cGUgPT0ga0VuZE9mSW1hZ2UgfHwgKnNpemUgPiBtYXhTaXplIC0gc2l6ZW9mKHNlZ21lbnRfdCkpIHsKKyAgICAgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgICAgIH0KKworICAgICAgICBzaXplX3QgbGVuZ3RoID0gbnRvaHMoc2VnbWVudC0+bGVuZ3RoKTsKKyAgICAgICAgKnNpemUgKz0gbGVuZ3RoICsga01hcmtlckxlbmd0aDsKKyAgICB9CisKKyAgICAvLyBGaW5kIEVuZCBvZiBJbWFnZQorICAgIC8vIFNjYW4gSlBFRyBidWZmZXIgdW50aWwgRW5kIG9mIEltYWdlCisgICAgYm9vbCBmb3VuZEVuZCA9IGZhbHNlOworICAgIGZvciAoIDsgKnNpemUgPD0gbWF4U2l6ZSAtIGtNYXJrZXJMZW5ndGg7ICgqc2l6ZSkrKykgeworICAgICAgICBpZiAoY2hlY2tKcGVnRW5kKGpwZWdCdWZmZXIgKyAqc2l6ZSkpIHsKKyAgICAgICAgICAgIGZvdW5kRW5kID0gdHJ1ZTsKKyAgICAgICAgICAgICpzaXplICs9IGtNYXJrZXJMZW5ndGg7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICghZm91bmRFbmQpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAoKnNpemUgPiBtYXhTaXplKSB7CisgICAgICAgICpzaXplID0gbWF4U2l6ZTsKKyAgICB9CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE5WMTJDb21wcmVzc29yOjpnZXRKcGVnSW1hZ2VEaW1lbnNpb25zKHVpbnQ4X3QgKmpwZWdCdWZmZXIsCisgICAgICAgIHNpemVfdCBqcGVnQnVmZmVyU2l6ZSwgc2l6ZV90ICp3aWR0aCAvKm91dCovLCBzaXplX3QgKmhlaWdodCAvKm91dCovKSB7CisgICAgaWYgKChqcGVnQnVmZmVyID09IG51bGxwdHIpIHx8ICh3aWR0aCA9PSBudWxscHRyKSB8fCAoaGVpZ2h0ID09IG51bGxwdHIpIHx8CisgICAgICAgICAgICAoanBlZ0J1ZmZlclNpemUgPT0gMHUpKSB7CisgICAgICAgIHJldHVybiBCQURfVkFMVUU7CisgICAgfQorCisgICAgLy8gU2NhbiBKUEVHIGJ1ZmZlciB1bnRpbCBTdGFydCBvZiBGcmFtZQorICAgIGJvb2wgZm91bmRTT0YgPSBmYWxzZTsKKyAgICBzaXplX3QgY3VycmVudFBvczsKKyAgICBmb3IgKGN1cnJlbnRQb3MgPSAwOyBjdXJyZW50UG9zIDw9IGpwZWdCdWZmZXJTaXplIC0ga01hcmtlckxlbmd0aDsgY3VycmVudFBvcysrKSB7CisgICAgICAgIGlmIChjaGVja1N0YXJ0T2ZGcmFtZShqcGVnQnVmZmVyICsgY3VycmVudFBvcykpIHsKKyAgICAgICAgICAgIGZvdW5kU09GID0gdHJ1ZTsKKyAgICAgICAgICAgIGN1cnJlbnRQb3MgKz0ga01hcmtlckxlbmd0aDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKCFmb3VuZFNPRikgeworICAgICAgICBBTE9HRSgiJXM6IFN0YXJ0IG9mIEZyYW1lIG5vdCBmb3VuZCIsIF9fZnVuY19fKTsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBzb2ZfdCAqc3RhcnRPZkZyYW1lID0gcmVpbnRlcnByZXRfY2FzdDxzb2ZfdCAqPiAoanBlZ0J1ZmZlciArIGN1cnJlbnRQb3MpOworICAgICp3aWR0aCA9IG50b2hzKHN0YXJ0T2ZGcmFtZS0+d2lkdGgpOworICAgICpoZWlnaHQgPSBudG9ocyhzdGFydE9mRnJhbWUtPmhlaWdodCk7CisKKyAgICByZXR1cm4gT0s7Cit9CisKK3N0YXR1c190IE5WMTJDb21wcmVzc29yOjpnZXRFeGlmT3JpZW50YXRpb24odWludDhfdCAqanBlZ0J1ZmZlciwgc2l6ZV90IGpwZWdCdWZmZXJTaXplLAorICAgICAgICBFeGlmT3JpZW50YXRpb24gKmV4aWZWYWx1ZSAvKm91dCovKSB7CisgICAgaWYgKChqcGVnQnVmZmVyID09IG51bGxwdHIpIHx8IChleGlmVmFsdWUgPT0gbnVsbHB0cikgfHwgKGpwZWdCdWZmZXJTaXplID09IDB1KSkgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KKworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRGF0YT4gZXhpZkRhdGEoZXhpZl9kYXRhX25ldygpKTsKKyAgICBleGlmX2RhdGFfbG9hZF9kYXRhKGV4aWZEYXRhLmdldCgpLCBqcGVnQnVmZmVyLCBqcGVnQnVmZmVyU2l6ZSk7CisgICAgRXhpZkVudHJ5ICpvcmllbnRhdGlvbiA9IGV4aWZfY29udGVudF9nZXRfZW50cnkoZXhpZkRhdGEtPmlmZFtFWElGX0lGRF8wXSwKKyAgICAgICAgICAgIEVYSUZfVEFHX09SSUVOVEFUSU9OKTsKKyAgICBpZiAoKG9yaWVudGF0aW9uID09IG51bGxwdHIpIHx8IChvcmllbnRhdGlvbi0+c2l6ZSAhPSBzaXplb2YoRXhpZlNob3J0KSkpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBhdXRvIG9yaWVudGF0aW9uVmFsdWUgPSBleGlmX2dldF9zaG9ydChvcmllbnRhdGlvbi0+ZGF0YSwKKyAgICAgICAgICAgIGV4aWZfZGF0YV9nZXRfYnl0ZV9vcmRlcihleGlmRGF0YS5nZXQoKSkpOworICAgIHN0YXR1c190IHJldDsKKyAgICBzd2l0Y2ggKG9yaWVudGF0aW9uVmFsdWUpIHsKKyAgICAgICAgY2FzZSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUzoKKyAgICAgICAgY2FzZSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzkwX0RFR1JFRVM6CisgICAgICAgIGNhc2UgRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl8xODBfREVHUkVFUzoKKyAgICAgICAgY2FzZSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzI3MF9ERUdSRUVTOgorICAgICAgICAgICAgKmV4aWZWYWx1ZSA9IHN0YXRpY19jYXN0PEV4aWZPcmllbnRhdGlvbj4gKG9yaWVudGF0aW9uVmFsdWUpOworICAgICAgICAgICAgcmV0ID0gT0s7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEFMT0dFKCIlczogVW5leHBlY3RlZCBFWElGIG9yaWVudGF0aW9uIHZhbHVlOiAldSIsIF9fRlVOQ1RJT05fXywgb3JpZW50YXRpb25WYWx1ZSk7CisgICAgICAgICAgICByZXQgPSBCQURfVkFMVUU7CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3Rlc3RzL05WMTJDb21wcmVzc29yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9OVjEyQ29tcHJlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMjJkNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS90ZXN0cy9OVjEyQ29tcHJlc3Nvci5oCkBAIC0wLDAgKzEsMTM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBURVNUX0NBTUVSQV9KUEVHX1NUVUJfTlYxMl9DT01QUkVTU09SX0gKKyNkZWZpbmUgVEVTVF9DQU1FUkFfSlBFR19TVFVCX05WMTJfQ09NUFJFU1NPUl9ICisKKyNpbmNsdWRlIDxzZXRqbXAuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KK2V4dGVybiAiQyIgeworI2luY2x1ZGUgPGpwZWdsaWIuaD4KKyNpbmNsdWRlIDxqZXJyb3IuaD4KK30KKworI2luY2x1ZGUgPHV0aWxzL0Vycm9ycy5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIi4uL3V0aWxzL0V4aWZVdGlscy5oIgorCitzdHJ1Y3QgX0V4aWZEYXRhOwordHlwZWRlZiBfRXhpZkRhdGEgRXhpZkRhdGE7CisKK2NsYXNzIE5WMTJDb21wcmVzc29yIHsKK3B1YmxpYzoKKyAgICBOVjEyQ29tcHJlc3NvcigpIHt9CisKKyAgICAvKiBDb21wcmVzcyB8ZGF0YXwgd2hpY2ggcmVwcmVzZW50cyByYXcgTlYyMSBlbmNvZGVkIGRhdGEgb2YgZGltZW5zaW9ucworICAgICAqIHx3aWR0aHwgKiB8aGVpZ2h0fC4KKyAgICAgKi8KKyAgICBib29sIGNvbXByZXNzKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHF1YWxpdHkpOworICAgIGJvb2wgY29tcHJlc3NXaXRoRXhpZk9yaWVudGF0aW9uKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHF1YWxpdHksCisgICAgICAgICAgICBhbmRyb2lkOjpjYW1lcmEzOjpFeGlmT3JpZW50YXRpb24gZXhpZlZhbHVlKTsKKworICAgIC8qIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgY29tcHJlc3NlZCBkYXRhLCB0aGlzIHdpbGwgcmV0dXJuIGFuIGVtcHR5IHZlY3RvcgorICAgICAqIGlmIGNvbXByZXNzIGhhcyBub3QgYmVlbiBjYWxsZWQgeWV0CisgICAgICovCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQgY2hhcj4mIGdldENvbXByZXNzZWREYXRhKCkgY29uc3Q7CisKKyAgICAvLyBVdGlsaXR5IG1ldGhvZHMKKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZmluZEpwZWdTaXplKHVpbnQ4X3QgKmpwZWdCdWZmZXIsIHNpemVfdCBtYXhTaXplLAorICAgICAgICAgICAgc2l6ZV90ICpzaXplIC8qb3V0Ki8pOworCisgICAgc3RhdGljIGFuZHJvaWQ6OnN0YXR1c190IGdldEV4aWZPcmllbnRhdGlvbih1aW50OF90ICpqcGVnQnVmZmVyLAorICAgICAgICAgICAgc2l6ZV90IGpwZWdCdWZmZXJTaXplLCBhbmRyb2lkOjpjYW1lcmEzOjpFeGlmT3JpZW50YXRpb24gKmV4aWZWYWx1ZSAvKm91dCovKTsKKworICAgIC8qIEdldCBKcGVnIGltYWdlIGRpbWVuc2lvbnMgZnJvbSB0aGUgZmlyc3QgU3RhcnQgT2YgRnJhbWUuIFBsZWFzZSBub3RlIHRoYXQgZHVlIHRvIHRoZQorICAgICAqIHdheSB0aGUganBlZyBidWZmZXIgaXMgc2Nhbm5lZCBpZiB0aGUgaW1hZ2UgY29udGFpbnMgYSB0aHVtYm5haWwsIHRoZW4gdGhlIHNpemUgcmV0dXJuZWQKKyAgICAgKiB3aWxsIGJlIG9mIHRoZSB0aHVtYm5haWwgYW5kIG5vdCB0aGUgbWFpbiBpbWFnZS4KKyAgICAgKi8KKyAgICBzdGF0aWMgYW5kcm9pZDo6c3RhdHVzX3QgZ2V0SnBlZ0ltYWdlRGltZW5zaW9ucyh1aW50OF90ICpqcGVnQnVmZmVyLCBzaXplX3QganBlZ0J1ZmZlclNpemUsCisgICAgICAgICAgICBzaXplX3QgKndpZHRoIC8qb3V0Ki8sIHNpemVfdCAqaGVpZ2h0IC8qb3V0Ki8pOworCitwcml2YXRlOgorCisgICAgc3RydWN0IERlc3RpbmF0aW9uTWFuYWdlciA6IGpwZWdfZGVzdGluYXRpb25fbWdyIHsKKyAgICAgICAgRGVzdGluYXRpb25NYW5hZ2VyKCk7CisKKyAgICAgICAgc3RhdGljIHZvaWQgaW5pdERlc3RpbmF0aW9uKGpfY29tcHJlc3NfcHRyIGNpbmZvKTsKKyAgICAgICAgc3RhdGljIGJvb2xlYW4gZW1wdHlPdXRwdXRCdWZmZXIoal9jb21wcmVzc19wdHIgY2luZm8pOworICAgICAgICBzdGF0aWMgdm9pZCB0ZXJtRGVzdGluYXRpb24oal9jb21wcmVzc19wdHIgY2luZm8pOworCisgICAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkIGNoYXI+IG1CdWZmZXI7CisgICAgfTsKKworICAgIHN0cnVjdCBFcnJvck1hbmFnZXIgOiBqcGVnX2Vycm9yX21nciB7CisgICAgICAgIEVycm9yTWFuYWdlcigpOworCisgICAgICAgIHN0YXRpYyB2b2lkIG9uSnBlZ0Vycm9yKGpfY29tbW9uX3B0ciBjaW5mbyk7CisKKyAgICAgICAgam1wX2J1ZiBtSnVtcEJ1ZmZlcjsKKyAgICB9OworCisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWFya2VyTGVuZ3RoID0gMjsgLy8gbGVuZ3RoIG9mIGEgbWFya2VyCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga01hcmtlciA9IDB4RkY7IC8vIEZpcnN0IGJ5dGUgb2YgbWFya2VyCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga1N0YXJ0T2ZJbWFnZSA9IDB4RDg7IC8vIFN0YXJ0IG9mIEltYWdlCisgICAgc3RhdGljIGNvbnN0IHVpbnQ4X3Qga0VuZE9mSW1hZ2UgPSAweEQ5OyAvLyBFbmQgb2YgSW1hZ2UKKyAgICBzdGF0aWMgY29uc3QgdWludDhfdCBrU3RhcnRPZkZyYW1lID0gMHhDMDsgLy8gU3RhcnQgb2YgRnJhbWUKKworICAgIHN0cnVjdCBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKSBzZWdtZW50X3QgeworICAgICAgICB1aW50OF90IG1hcmtlcltrTWFya2VyTGVuZ3RoXTsKKyAgICAgICAgdWludDE2X3QgbGVuZ3RoOworICAgIH07CisKKyAgICBzdHJ1Y3QgX19hdHRyaWJ1dGVfXygocGFja2VkKSkgc29mX3QgeworICAgICAgICB1aW50MTZfdCBsZW5ndGg7CisgICAgICAgIHVpbnQ4X3QgcHJlY2lzaW9uOworICAgICAgICB1aW50MTZfdCBoZWlnaHQ7CisgICAgICAgIHVpbnQxNl90IHdpZHRoOworICAgIH07CisKKyAgICAvLyBjaGVjayBmb3Igc3RhcnQgb2YgaW1hZ2UgbWFya2VyCisgICAgc3RhdGljIGJvb2wgY2hlY2tTdGFydE9mRnJhbWUodWludDhfdCogYnVmKSB7CisgICAgICAgIHJldHVybiBidWZbMF0gPT0ga01hcmtlciAmJiBidWZbMV0gPT0ga1N0YXJ0T2ZGcmFtZTsKKyAgICB9CisKKyAgICAvLyBjaGVjayBmb3Igc3RhcnQgb2YgaW1hZ2UgbWFya2VyCisgICAgc3RhdGljIGJvb2wgY2hlY2tKcGVnU3RhcnQodWludDhfdCogYnVmKSB7CisgICAgICAgIHJldHVybiBidWZbMF0gPT0ga01hcmtlciAmJiBidWZbMV0gPT0ga1N0YXJ0T2ZJbWFnZTsKKyAgICB9CisKKyAgICAvLyBjaGVjayBmb3IgRW5kIG9mIEltYWdlIG1hcmtlcgorICAgIHN0YXRpYyBib29sIGNoZWNrSnBlZ0VuZCh1aW50OF90ICpidWYpIHsKKyAgICAgICAgcmV0dXJuIGJ1ZlswXSA9PSBrTWFya2VyICYmIGJ1ZlsxXSA9PSBrRW5kT2ZJbWFnZTsKKyAgICB9CisKKyAgICAvLyBjaGVjayBmb3IgYXJiaXRyYXJ5IG1hcmtlciwgcmV0dXJucyBtYXJrZXIgdHlwZSAoc2Vjb25kIGJ5dGUpCisgICAgLy8gcmV0dXJucyAwIGlmIG5vIG1hcmtlciBmb3VuZC4gTm90ZTogMHgwMCBpcyBub3QgYSB2YWxpZCBtYXJrZXIgdHlwZQorICAgIHN0YXRpYyB1aW50OF90IGNoZWNrSnBlZ01hcmtlcih1aW50OF90ICpidWYpIHsKKyAgICAgICAgcmV0dXJuIChidWZbMF0gPT0ga01hcmtlcikgPyBidWZbMV0gOiAwOworICAgIH0KKworICAgIGpwZWdfY29tcHJlc3Nfc3RydWN0IG1Db21wcmVzc0luZm87CisgICAgRGVzdGluYXRpb25NYW5hZ2VyIG1EZXN0TWFuYWdlcjsKKyAgICBFcnJvck1hbmFnZXIgbUVycm9yTWFuYWdlcjsKKworICAgIGJvb2wgY29uZmlndXJlQ29tcHJlc3NvcihpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBxdWFsaXR5KTsKKyAgICBib29sIGNvbXByZXNzRGF0YShjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLCBFeGlmRGF0YSogZXhpZkRhdGEpOworICAgIGJvb2wgYXR0YWNoRXhpZkRhdGEoRXhpZkRhdGEqIGV4aWZEYXRhKTsKK307CisKKyNlbmRpZiAgLy8gVEVTVF9DQU1FUkFfSlBFR19TVFVCX05WMTJfQ09NUFJFU1NPUl9ICisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzUyYjgwCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuY3BwCkBAIC0wLDAgKzEsNTUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiQ2FtZXJhVGhyZWFkU3RhdGUuaCIKKyNpbmNsdWRlIDxiaW5kZXIvSVBDVGhyZWFkU3RhdGUuaD4KKyNpbmNsdWRlIDxod2JpbmRlci9JUENUaHJlYWRTdGF0ZS5oPgorI2luY2x1ZGUgPGJpbmRlcnRocmVhZHN0YXRlL0NhbGxlclV0aWxzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKK25hbWVzcGFjZSBhbmRyb2lkIHsKKworaW50IENhbWVyYVRocmVhZFN0YXRlOjpnZXRDYWxsaW5nVWlkKCkgeworICAgIGlmIChnZXRDdXJyZW50U2VydmluZ0NhbGwoKSA9PSBCaW5kZXJDYWxsVHlwZTo6SFdCSU5ERVIpIHsKKyAgICAgICAgcmV0dXJuIGhhcmR3YXJlOjpJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7CisgICAgfQorICAgIHJldHVybiBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCk7Cit9CisKK2ludCBDYW1lcmFUaHJlYWRTdGF0ZTo6Z2V0Q2FsbGluZ1BpZCgpIHsKKyAgICBpZiAoZ2V0Q3VycmVudFNlcnZpbmdDYWxsKCkgPT0gQmluZGVyQ2FsbFR5cGU6OkhXQklOREVSKSB7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworICAgIH0KKyAgICByZXR1cm4gSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpOworfQorCitpbnQ2NF90IENhbWVyYVRocmVhZFN0YXRlOjpjbGVhckNhbGxpbmdJZGVudGl0eSgpIHsKKyAgICBpZiAoZ2V0Q3VycmVudFNlcnZpbmdDYWxsKCkgPT0gQmluZGVyQ2FsbFR5cGU6OkhXQklOREVSKSB7CisgICAgICAgIHJldHVybiBoYXJkd2FyZTo6SVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Y2xlYXJDYWxsaW5nSWRlbnRpdHkoKTsKKyAgICB9CisgICAgcmV0dXJuIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmNsZWFyQ2FsbGluZ0lkZW50aXR5KCk7Cit9CisKK3ZvaWQgQ2FtZXJhVGhyZWFkU3RhdGU6OnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaW50NjRfdCB0b2tlbikgeworICAgIGlmIChnZXRDdXJyZW50U2VydmluZ0NhbGwoKSA9PSBCaW5kZXJDYWxsVHlwZTo6SFdCSU5ERVIpIHsKKyAgICAgICAgaGFyZHdhcmU6OklQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIH0gZWxzZSB7CisgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPnJlc3RvcmVDYWxsaW5nSWRlbnRpdHkodG9rZW4pOworICAgIH0KKyAgICByZXR1cm47Cit9CisKK30gLy8gYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2FtZXJhVGhyZWFkU3RhdGUuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFhNzBkZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NhbWVyYVRocmVhZFN0YXRlLmgKQEAgLTAsMCArMSwzMSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworY2xhc3MgQ2FtZXJhVGhyZWFkU3RhdGUgeworcHVibGljOgorICBzdGF0aWMgaW50NjRfdCBjbGVhckNhbGxpbmdJZGVudGl0eSgpOworCisgIHN0YXRpYyB2b2lkIHJlc3RvcmVDYWxsaW5nSWRlbnRpdHkoaW50NjRfdCB0b2tlbik7CisKKyAgc3RhdGljIGludCBnZXRDYWxsaW5nVWlkKCk7CisKKyAgc3RhdGljIGludCBnZXRDYWxsaW5nUGlkKCk7Cit9OworCit9IC8vIGFuZHJvaWQKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NsaWVudE1hbmFnZXIuaCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0NsaWVudE1hbmFnZXIuaAppbmRleCBkNzEzNWYxLi4zNWQyNWJmIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9DbGllbnRNYW5hZ2VyLmgKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvQ2xpZW50TWFuYWdlci5oCkBAIC0zMywxMiArMzMsMzggQEAKIAogY2xhc3MgQ2xpZW50UHJpb3JpdHkgewogcHVibGljOgotICAgIENsaWVudFByaW9yaXR5KGludDMyX3Qgc2NvcmUsIGludDMyX3Qgc3RhdGUpIDoKLSAgICAgICAgbVNjb3JlKHNjb3JlKSwgbVN0YXRlKHN0YXRlKSB7fQorICAgIC8qKgorICAgICAqIENob29zaW5nIHRvIHNldCBtSXNWZW5kb3JDbGllbnQgdGhyb3VnaCBhIHBhcmFtZXRlciBpbnN0ZWFkIG9mIGNhbGxpbmcKKyAgICAgKiBnZXRDdXJyZW50U2VydmluZ0NhbGwoKSA9PSBCaW5kZXJDYWxsVHlwZTo6SFdCSU5ERVIgdG8gcHJvdGVjdCBhZ2FpbnN0IHRoZQorICAgICAqIGNhc2Ugd2hlcmUgdGhlIGNvbnN0cnVjdGlvbiBpcyBvZmZsb2FkZWQgdG8gYW5vdGhlciB0aHJlYWQgd2hpY2ggaXNuJ3QgYQorICAgICAqIGh3YmluZGVyIHRocmVhZC4KKyAgICAgKi8KKyAgICBDbGllbnRQcmlvcml0eShpbnQzMl90IHNjb3JlLCBpbnQzMl90IHN0YXRlLCBib29sIGlzVmVuZG9yQ2xpZW50KSA6CisgICAgICAgICAgICBtU2NvcmUoc2NvcmUpLCBtU3RhdGUoc3RhdGUpLCBtSXNWZW5kb3JDbGllbnQoaXNWZW5kb3JDbGllbnQpIHsgfQogCiAgICAgaW50MzJfdCBnZXRTY29yZSgpIGNvbnN0IHsgcmV0dXJuIG1TY29yZTsgfQogICAgIGludDMyX3QgZ2V0U3RhdGUoKSBjb25zdCB7IHJldHVybiBtU3RhdGU7IH0KIAorICAgIHZvaWQgc2V0U2NvcmUoaW50MzJfdCBzY29yZSkgeworICAgICAgICAvLyBGb3IgdmVuZG9yIGNsaWVudHMsIHRoZSBzY29yZSBpcyBzZXQgb25jZSBhbmQgZm9yIGFsbCBkdXJpbmcKKyAgICAgICAgLy8gY29uc3RydWN0aW9uLiBPdGhlcndpc2UsIGl0IGNhbiBnZXQgcmVzZXQgZWFjaCB0aW1lIGNhbWVyYXNlcnZlcgorICAgICAgICAvLyBxdWVyaWVzIEFjdGl2aXR5TWFuYWdlclNlcnZpY2UgZm9yIG9vbV9hZGogc2NvcmVzIC8gc3RhdGVzIC4KKyAgICAgICAgaWYgKCFtSXNWZW5kb3JDbGllbnQpIHsKKyAgICAgICAgICAgIG1TY29yZSA9IHNjb3JlOworICAgICAgICB9CisgICAgfQorCisgICAgdm9pZCBzZXRTdGF0ZShpbnQzMl90IHN0YXRlKSB7CisgICAgICAvLyBGb3IgdmVuZG9yIGNsaWVudHMsIHRoZSBzY29yZSBpcyBzZXQgb25jZSBhbmQgZm9yIGFsbCBkdXJpbmcKKyAgICAgIC8vIGNvbnN0cnVjdGlvbi4gT3RoZXJ3aXNlLCBpdCBjYW4gZ2V0IHJlc2V0IGVhY2ggdGltZSBjYW1lcmFzZXJ2ZXIKKyAgICAgIC8vIHF1ZXJpZXMgQWN0aXZpdHlNYW5hZ2VyU2VydmljZSBmb3Igb29tX2FkaiBzY29yZXMgLyBzdGF0ZXMKKyAgICAgIC8vIChBY3Rpdml0eU1hbmFnZXJTZXJ2aWNlIHJldHVybnMgYSB2ZW5kb3IgcHJvY2Vzcycgc3RhdGUgYXMKKyAgICAgIC8vIFBST0NFU1NfU1RBVEVfTk9ORVhJU1RFTlQuCisgICAgICBpZiAoIW1Jc1ZlbmRvckNsaWVudCkgeworICAgICAgICAgIG1TdGF0ZSA9IHN0YXRlOworICAgICAgfQorICAgIH0KKwogICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDbGllbnRQcmlvcml0eSYgcmhzKSBjb25zdCB7CiAgICAgICAgIHJldHVybiAodGhpcy0+bVNjb3JlID09IHJocy5tU2NvcmUpICYmICh0aGlzLT5tU3RhdGUgPT0gcmhzLm1TdGF0ZSk7CiAgICAgfQpAQCAtNjYsNiArOTIsNyBAQAogcHJpdmF0ZToKICAgICAgICAgaW50MzJfdCBtU2NvcmU7CiAgICAgICAgIGludDMyX3QgbVN0YXRlOworICAgICAgICBib29sIG1Jc1ZlbmRvckNsaWVudCA9IGZhbHNlOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTgyLDkgKzEwOSwxMCBAQAogY2xhc3MgQ2xpZW50RGVzY3JpcHRvciBmaW5hbCB7CiBwdWJsaWM6CiAgICAgQ2xpZW50RGVzY3JpcHRvcihjb25zdCBLRVkmIGtleSwgY29uc3QgVkFMVUUmIHZhbHVlLCBpbnQzMl90IGNvc3QsCi0gICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxLRVk+JiBjb25mbGljdGluZ0tleXMsIGludDMyX3Qgc2NvcmUsIGludDMyX3Qgb3duZXJJZCwgaW50MzJfdCBzdGF0ZSk7CisgICAgICAgICAgICBjb25zdCBzdGQ6OnNldDxLRVk+JiBjb25mbGljdGluZ0tleXMsIGludDMyX3Qgc2NvcmUsIGludDMyX3Qgb3duZXJJZCwgaW50MzJfdCBzdGF0ZSwKKyAgICAgICAgICAgIGJvb2wgaXNWZW5kb3JDbGllbnQpOwogICAgIENsaWVudERlc2NyaXB0b3IoS0VZJiYga2V5LCBWQUxVRSYmIHZhbHVlLCBpbnQzMl90IGNvc3QsIHN0ZDo6c2V0PEtFWT4mJiBjb25mbGljdGluZ0tleXMsCi0gICAgICAgICAgICBpbnQzMl90IHNjb3JlLCBpbnQzMl90IG93bmVySWQsIGludDMyX3Qgc3RhdGUpOworICAgICAgICAgICAgaW50MzJfdCBzY29yZSwgaW50MzJfdCBvd25lcklkLCBpbnQzMl90IHN0YXRlLCBib29sIGlzVmVuZG9yQ2xpZW50KTsKIAogICAgIH5DbGllbnREZXNjcmlwdG9yKCk7CiAKQEAgLTE0OCwxNyArMTc2LDE5IEBACiAKIHRlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUU+CiBDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+OjpDbGllbnREZXNjcmlwdG9yKGNvbnN0IEtFWSYga2V5LCBjb25zdCBWQUxVRSYgdmFsdWUsIGludDMyX3QgY29zdCwKLSAgICAgICAgY29uc3Qgc3RkOjpzZXQ8S0VZPiYgY29uZmxpY3RpbmdLZXlzLCBpbnQzMl90IHNjb3JlLCBpbnQzMl90IG93bmVySWQsIGludDMyX3Qgc3RhdGUpIDoKKyAgICAgICAgY29uc3Qgc3RkOjpzZXQ8S0VZPiYgY29uZmxpY3RpbmdLZXlzLCBpbnQzMl90IHNjb3JlLCBpbnQzMl90IG93bmVySWQsIGludDMyX3Qgc3RhdGUsCisgICAgICAgIGJvb2wgaXNWZW5kb3JDbGllbnQpIDoKICAgICAgICAgbUtleXtrZXl9LCBtVmFsdWV7dmFsdWV9LCBtQ29zdHtjb3N0fSwgbUNvbmZsaWN0aW5ne2NvbmZsaWN0aW5nS2V5c30sCi0gICAgICAgIG1Qcmlvcml0eShzY29yZSwgc3RhdGUpLAorICAgICAgICBtUHJpb3JpdHkoc2NvcmUsIHN0YXRlLCBpc1ZlbmRvckNsaWVudCksCiAgICAgICAgIG1Pd25lcklke293bmVySWR9IHt9CiAKIHRlbXBsYXRlPGNsYXNzIEtFWSwgY2xhc3MgVkFMVUU+CiBDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+OjpDbGllbnREZXNjcmlwdG9yKEtFWSYmIGtleSwgVkFMVUUmJiB2YWx1ZSwgaW50MzJfdCBjb3N0LAotICAgICAgICBzdGQ6OnNldDxLRVk+JiYgY29uZmxpY3RpbmdLZXlzLCBpbnQzMl90IHNjb3JlLCBpbnQzMl90IG93bmVySWQsIGludDMyX3Qgc3RhdGUpIDoKKyAgICAgICAgc3RkOjpzZXQ8S0VZPiYmIGNvbmZsaWN0aW5nS2V5cywgaW50MzJfdCBzY29yZSwgaW50MzJfdCBvd25lcklkLCBpbnQzMl90IHN0YXRlLAorICAgICAgICBib29sIGlzVmVuZG9yQ2xpZW50KSA6CiAgICAgICAgIG1LZXl7c3RkOjpmb3J3YXJkPEtFWT4oa2V5KX0sIG1WYWx1ZXtzdGQ6OmZvcndhcmQ8VkFMVUU+KHZhbHVlKX0sIG1Db3N0e2Nvc3R9LAogICAgICAgICBtQ29uZmxpY3Rpbmd7c3RkOjpmb3J3YXJkPHN0ZDo6c2V0PEtFWT4+KGNvbmZsaWN0aW5nS2V5cyl9LAotICAgICAgICBtUHJpb3JpdHkoc2NvcmUsIHN0YXRlKSwgbU93bmVySWR7b3duZXJJZH0ge30KKyAgICAgICAgbVByaW9yaXR5KHNjb3JlLCBzdGF0ZSwgaXNWZW5kb3JDbGllbnQpLCBtT3duZXJJZHtvd25lcklkfSB7fQogCiB0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFPgogQ2xpZW50RGVzY3JpcHRvcjxLRVksIFZBTFVFPjo6fkNsaWVudERlc2NyaXB0b3IoKSB7fQpAQCAtMjA0LDcgKzIzNCwxMyBAQAogCiB0ZW1wbGF0ZTxjbGFzcyBLRVksIGNsYXNzIFZBTFVFPgogdm9pZCBDbGllbnREZXNjcmlwdG9yPEtFWSwgVkFMVUU+OjpzZXRQcmlvcml0eShjb25zdCBDbGllbnRQcmlvcml0eSYgcHJpb3JpdHkpIHsKLSAgICBtUHJpb3JpdHkgPSBwcmlvcml0eTsKKyAgICAvLyBXZSBkb24ndCB1c2UgdGhlIHVzdWFsIGNvcHkgY29uc3RydWN0b3IgaGVyZSBzaW5jZSB3ZSB3YW50IHRvIHJlbWVtYmVyCisgICAgLy8gd2hldGhlciBhIGNsaWVudCBpcyBhIHZlbmRvciBjbGllbnQgb3Igbm90LiBUaGlzIGNvdWxkIGhhdmUgYmVlbiB3aXBlZAorICAgIC8vIG9mZiBpbiB0aGUgaW5jb21pbmcgcHJpb3JpdHkgYXJndW1lbnQgc2luY2UgYW4gQUlETCB0aHJlYWQgbWlnaHQgaGF2ZQorICAgIC8vIGNhbGxlZCBnZXRDdXJyZW50U2VydmluZ0NhbGwoKSA9PSBCaW5kZXJDYWxsVHlwZTo6SFdCSU5ERVIgYWZ0ZXIgcmVmcmVzaGluZworICAgIC8vIHByaW9yaXRpZXMgZm9yIG9sZCBjbGllbnRzIHRocm91Z2ggUHJvY2Vzc0luZm9TZXJ2aWNlOjpnZXRQcm9jZXNzU3RhdGVzU2NvcmVzRnJvbVBpZHMoKS4KKyAgICBtUHJpb3JpdHkuc2V0U2NvcmUocHJpb3JpdHkuZ2V0U2NvcmUoKSk7CisgICAgbVByaW9yaXR5LnNldFN0YXRlKHByaW9yaXR5LmdldFN0YXRlKCkpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvRXhpZlV0aWxzLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0V4aWZVdGlscy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBhZmRjMQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0V4aWZVdGlscy5jcHAKQEAgLTAsMCArMSwxMTA0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2RlZmluZSBMT0dfVEFHICJDYW1lcmFTZXJ2ZXJFeGlmVXRpbHMiCisjZGVmaW5lIEFUUkFDRV9UQUcgQVRSQUNFX1RBR19DQU1FUkEKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKworI2luY2x1ZGUgPGN1dGlscy9sb2cuaD4KKworI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJFeGlmVXRpbHMuaCIKKworZXh0ZXJuICJDIiB7CisjaW5jbHVkZSA8bGliZXhpZi9leGlmLWRhdGEuaD4KK30KKworbmFtZXNwYWNlIHN0ZCB7CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgZGVmYXVsdF9kZWxldGU8RXhpZkVudHJ5PiB7CisgICAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShFeGlmRW50cnkqIGVudHJ5KSBjb25zdCB7IGV4aWZfZW50cnlfdW5yZWYoZW50cnkpOyB9Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc3RkCisKKworbmFtZXNwYWNlIGFuZHJvaWQgeworbmFtZXNwYWNlIGNhbWVyYTMgeworCisKK2NsYXNzIEV4aWZVdGlsc0ltcGwgOiBwdWJsaWMgRXhpZlV0aWxzIHsKK3B1YmxpYzoKKyAgICBFeGlmVXRpbHNJbXBsKCk7CisKKyAgICB2aXJ0dWFsIH5FeGlmVXRpbHNJbXBsKCk7CisKKyAgICAvLyBJbml0aWFsaXplKCkgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4gVGhlIHNldHRpbmcgb2YgRXhpZiB0YWdzIHdpbGwgYmUKKyAgICAvLyBjbGVhcmVkLgorICAgIHZpcnR1YWwgYm9vbCBpbml0aWFsaXplKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFwcDFTZWdtZW50LCBzaXplX3QgYXBwMVNlZ21lbnRTaXplKTsKKyAgICB2aXJ0dWFsIGJvb2wgaW5pdGlhbGl6ZUVtcHR5KCk7CisKKyAgICAvLyBzZXQgYWxsIGtub3duIGZpZWxkcyBmcm9tIGEgbWV0YWRhdGEgc3RydWN0dXJlCisgICAgdmlydHVhbCBib29sIHNldEZyb21NZXRhZGF0YShjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCisgICAgICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbywKKyAgICAgICAgICAgIGNvbnN0IHNpemVfdCBpbWFnZVdpZHRoLAorICAgICAgICAgICAgY29uc3Qgc2l6ZV90IGltYWdlSGVpZ2h0KTsKKworICAgIC8vIHNldHMgdGhlIGxlbiBhcGVydHVyZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRBcGVydHVyZShmbG9hdCBhcGVydHVyZSk7CisKKyAgICAvLyBzZXRzIHRoZSBjb2xvciBzcGFjZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRDb2xvclNwYWNlKHVpbnQxNl90IGNvbG9yX3NwYWNlKTsKKworICAgIC8vIHNldHMgdGhlIGRhdGUgYW5kIHRpbWUgb2YgaW1hZ2UgbGFzdCBtb2RpZmllZC4gSXQgdGFrZXMgbG9jYWwgdGltZS4gVGhlCisgICAgLy8gbmFtZSBvZiB0aGUgdGFnIGlzIERhdGVUaW1lIGluIElGRDAuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RGF0ZVRpbWUoY29uc3Qgc3RydWN0IHRtJiB0KTsKKworICAgIC8vIHNldHMgdGhlIGRpZ2l0YWwgem9vbSByYXRpby4gSWYgdGhlIG51bWVyYXRvciBpcyAwLCBpdCBtZWFucyBkaWdpdGFsIHpvb20KKyAgICAvLyB3YXMgbm90IHVzZWQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RGlnaXRhbFpvb21SYXRpbygKKyAgICAgICAgICAgIHVpbnQzMl90IGNyb3Bfd2lkdGgsIHVpbnQzMl90IGNyb3BfaGVpZ2h0LAorICAgICAgICAgICAgdWludDMyX3Qgc2Vuc29yX3dpZHRoLCB1aW50MzJfdCBzZW5zb3JfaGVpZ2h0KTsKKworICAgIC8vIFNldHMgdGhlIGV4cG9zdXJlIGJpYXMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RXhwb3N1cmVCaWFzKGludDMyX3QgZXYsCisgICAgICAgICAgICB1aW50MzJfdCBldl9zdGVwX251bWVyYXRvciwgdWludDMyX3QgZXZfc3RlcF9kZW5vbWluYXRvcik7CisKKyAgICAvLyBzZXRzIHRoZSBleHBvc3VyZSBtb2RlIHNldCB3aGVuIHRoZSBpbWFnZSB3YXMgc2hvdC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRFeHBvc3VyZU1vZGUodWludDhfdCBleHBvc3VyZV9tb2RlKTsKKworICAgIC8vIHNldHMgdGhlIGV4cG9zdXJlIHRpbWUsIGdpdmVuIGluIHNlY29uZHMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RXhwb3N1cmVUaW1lKGZsb2F0IGV4cG9zdXJlX3RpbWUpOworCisgICAgLy8gc2V0cyB0aGUgc3RhdHVzIG9mIGZsYXNoLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEZsYXNoKHVpbnQ4X3QgZmxhc2hfYXZhaWxhYmxlLCB1aW50OF90IGZsYXNoX3N0YXRlLCB1aW50OF90IGFlX21vZGUpOworCisgICAgLy8gc2V0cyB0aGUgRiBudW1iZXIuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Rk51bWJlcihmbG9hdCBmX251bWJlcik7CisKKyAgICAvLyBzZXRzIHRoZSBmb2NhbCBsZW5ndGggb2YgbGVucyB1c2VkIHRvIHRha2UgdGhlIGltYWdlIGluIG1pbGxpbWV0ZXJzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEZvY2FsTGVuZ3RoKGZsb2F0IGZvY2FsX2xlbmd0aCk7CisKKyAgICAvLyBzZXRzIHRoZSBmb2NhbCBsZW5ndGggb2YgbGVucyBmb3IgMzVtbSBmaWxtIHVzZWQgdG8gdGFrZSB0aGUgaW1hZ2UgaW4gbWlsbGltZXRlcnMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Rm9jYWxMZW5ndGhJbjM1bW1GaWxtKGZsb2F0IGZvY2FsX2xlbmd0aCwKKyAgICAgICAgICAgIGZsb2F0IHNlbnNvcl9zaXplX3gsIGZsb2F0IHNlbnNvcl9zaXplX3kpOworCisgICAgLy8gc2V0cyB0aGUgYWx0aXR1ZGUgaW4gbWV0ZXJzLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc0FsdGl0dWRlKGRvdWJsZSBhbHRpdHVkZSk7CisKKyAgICAvLyBzZXRzIHRoZSBsYXRpdHVkZSB3aXRoIGRlZ3JlZXMgbWludXRlcyBzZWNvbmRzIGZvcm1hdC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRHcHNMYXRpdHVkZShkb3VibGUgbGF0aXR1ZGUpOworCisgICAgLy8gc2V0cyB0aGUgbG9uZ2l0dWRlIHdpdGggZGVncmVlcyBtaW51dGVzIHNlY29uZHMgZm9ybWF0LgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc0xvbmdpdHVkZShkb3VibGUgbG9uZ2l0dWRlKTsKKworICAgIC8vIHNldHMgR1BTIHByb2Nlc3NpbmcgbWV0aG9kLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc1Byb2Nlc3NpbmdNZXRob2QoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZCk7CisKKyAgICAvLyBzZXRzIEdQUyBkYXRlIHN0YW1wIGFuZCB0aW1lIHN0YW1wIChhdG9taWMgY2xvY2spLiBJdCB0YWtlcyBVVEMgdGltZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRHcHNUaW1lc3RhbXAoY29uc3Qgc3RydWN0IHRtJiB0KTsKKworICAgIC8vIHNldHMgdGhlIGxlbmd0aCAobnVtYmVyIG9mIHJvd3MpIG9mIG1haW4gaW1hZ2UuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0SW1hZ2VIZWlnaHQodWludDMyX3QgbGVuZ3RoKTsKKworICAgIC8vIHNldHMgdGhlIHdpZHRoIChudW1iZXIgb2YgY29sdW1lcykgb2YgbWFpbiBpbWFnZS4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRJbWFnZVdpZHRoKHVpbnQzMl90IHdpZHRoKTsKKworICAgIC8vIHNldHMgdGhlIElTTyBzcGVlZC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRJc29TcGVlZFJhdGluZyh1aW50MTZfdCBpc29fc3BlZWRfcmF0aW5ncyk7CisKKyAgICAvLyBzZXRzIHRoZSBzbWFsbGVzdCBGIG51bWJlciBvZiB0aGUgbGVucy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRNYXhBcGVydHVyZShmbG9hdCBhcGVydHVyZSk7CisKKyAgICAvLyBzZXRzIGltYWdlIG9yaWVudGF0aW9uLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldE9yaWVudGF0aW9uKHVpbnQxNl90IGRlZ3JlZXMpOworCisgICAgLy8gc2V0cyBpbWFnZSBvcmllbnRhdGlvbi4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRPcmllbnRhdGlvblZhbHVlKEV4aWZPcmllbnRhdGlvbiBvcmllbnRhdGlvblZhbHVlKTsKKworICAgIC8vIHNldHMgdGhlIHNodXR0ZXIgc3BlZWQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0U2h1dHRlclNwZWVkKGZsb2F0IGV4cG9zdXJlX3RpbWUpOworCisgICAgLy8gc2V0cyB0aGUgZGlzdGFuY2UgdG8gdGhlIHN1YmplY3QsIGdpdmVuIGluIG1ldGVycy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRTdWJqZWN0RGlzdGFuY2UoZmxvYXQgZGlvcHRlcnMpOworCisgICAgLy8gc2V0cyB0aGUgZnJhY3Rpb25zIG9mIHNlY29uZHMgZm9yIHRoZSA8RGF0ZVRpbWU+IHRhZy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRTdWJzZWNUaW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJzZWNfdGltZSk7CisKKyAgICAvLyBzZXRzIHRoZSB3aGl0ZSBiYWxhbmNlIG1vZGUgc2V0IHdoZW4gdGhlIGltYWdlIHdhcyBzaG90LgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldFdoaXRlQmFsYW5jZSh1aW50OF90IHdoaXRlX2JhbGFuY2UpOworCisgICAgLy8gR2VuZXJhdGVzIEFQUDEgc2VnbWVudC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIGdlbmVyYXRpbmcgQVBQMSBzZWdtZW50IGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBnZW5lcmF0ZUFwcDEoKTsKKworICAgIC8vIEdldHMgYnVmZmVyIG9mIEFQUDEgc2VnbWVudC4gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgb25seSBhZnRlciBjYWxsaW5nCisgICAgLy8gR2VuZXJhdGVBUFAxKCkuCisgICAgdmlydHVhbCBjb25zdCB1aW50OF90KiBnZXRBcHAxQnVmZmVyKCk7CisKKyAgICAvLyBHZXRzIGxlbmd0aCBvZiBBUFAxIHNlZ21lbnQuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgY2FsbGluZworICAgIC8vIEdlbmVyYXRlQVBQMSgpLgorICAgIHZpcnR1YWwgdW5zaWduZWQgaW50IGdldEFwcDFMZW5ndGgoKTsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gc2V0cyB0aGUgdmVyc2lvbiBvZiB0aGlzIHN0YW5kYXJkIHN1cHBvcnRlZC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRFeGlmVmVyc2lvbihjb25zdCBzdGQ6OnN0cmluZyYgZXhpZl92ZXJzaW9uKTsKKworICAgIC8vIFJlc2V0cyB0aGUgcG9pbnRlcnMgYW5kIG1lbW9yaWVzLgorICAgIHZpcnR1YWwgdm9pZCByZXNldCgpOworCisgICAgLy8gQWRkcyBhIHZhcmlhYmxlIGxlbmd0aCB0YWcgdG8gfGV4aWZfZGF0YV98LiBJdCB3aWxsIHJlbW92ZSB0aGUgb3JpZ2luYWwgb25lCisgICAgLy8gaWYgdGhlIHRhZyBleGlzdHMuCisgICAgLy8gUmV0dXJucyB0aGUgZW50cnkgb2YgdGhlIHRhZy4gVGhlIHJlZmVyZW5jZSBjb3VudCBvZiByZXR1cm5lZCBFeGlmRW50cnkgaXMKKyAgICAvLyB0d28uCisgICAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBhZGRWYXJpYWJsZUxlbmd0aEVudHJ5KEV4aWZJZmQgaWZkLAorICAgICAgICAgICAgRXhpZlRhZyB0YWcsIEV4aWZGb3JtYXQgZm9ybWF0LCB1aW50NjRfdCBjb21wb25lbnRzLCB1bnNpZ25lZCBpbnQgc2l6ZSk7CisKKyAgICAvLyBBZGRzIGEgZW50cnkgb2YgfHRhZ3wgaW4gfGV4aWZfZGF0YV98LiBJdCB3b24ndCByZW1vdmUgdGhlIG9yaWdpbmFsIG9uZSBpZgorICAgIC8vIHRoZSB0YWcgZXhpc3RzLgorICAgIC8vIFJldHVybnMgdGhlIGVudHJ5IG9mIHRoZSB0YWcuIEl0IGFkZHMgb25lIHJlZmVyZW5jZSBjb3VudCB0byByZXR1cm5lZAorICAgIC8vIEV4aWZFbnRyeS4KKyAgICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGFkZEVudHJ5KEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZyk7CisKKyAgICAvLyBIZWxwZSBmdW5jdGlvbnMgdG8gYWRkIGV4aWYgZGF0YSB3aXRoIGRpZmZlcmVudCB0eXBlcy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0U2hvcnQoRXhpZklmZCBpZmQsIEV4aWZUYWcgdGFnLCB1aW50MTZfdCB2YWx1ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZyk7CisKKyAgICB2aXJ0dWFsIGJvb2wgc2V0TG9uZyhFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcsIHVpbnQzMl90IHZhbHVlLCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKTsKKworICAgIHZpcnR1YWwgYm9vbCBzZXRSYXRpb25hbChFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcsIHVpbnQzMl90IG51bWVyYXRvciwKKyAgICAgICAgICAgIHVpbnQzMl90IGRlbm9taW5hdG9yLCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKTsKKworICAgIHZpcnR1YWwgYm9vbCBzZXRTUmF0aW9uYWwoRXhpZklmZCBpZmQsIEV4aWZUYWcgdGFnLCBpbnQzMl90IG51bWVyYXRvciwKKyAgICAgICAgICAgIGludDMyX3QgZGVub21pbmF0b3IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpOworCisgICAgdmlydHVhbCBib29sIHNldFN0cmluZyhFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcsIEV4aWZGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJ1ZmZlciwgY29uc3Qgc3RkOjpzdHJpbmcmIG1zZyk7CisKKyAgICBmbG9hdCBjb252ZXJ0VG9BcGV4KGZsb2F0IHZhbCkgeworICAgICAgICByZXR1cm4gMi4wZiAqIGxvZzJmKHZhbCk7CisgICAgfQorCisgICAgLy8gRGVzdHJveXMgdGhlIGJ1ZmZlciBvZiBBUFAxIHNlZ21lbnQgaWYgZXhpc3RzLgorICAgIHZpcnR1YWwgdm9pZCBkZXN0cm95QXBwMSgpOworCisgICAgLy8gVGhlIEV4aWYgZGF0YSAoQVBQMSkuIE93bmVkIGJ5IHRoaXMgY2xhc3MuCisgICAgRXhpZkRhdGEqIGV4aWZfZGF0YV87CisgICAgLy8gVGhlIHJhdyBkYXRhIG9mIEFQUDEgc2VnbWVudC4gSXQncyBhbGxvY2F0ZWQgYnkgRXhpZk1lbSBpbiB8ZXhpZl9kYXRhX3wgYnV0CisgICAgLy8gb3duZWQgYnkgdGhpcyBjbGFzcy4KKyAgICB1aW50OF90KiBhcHAxX2J1ZmZlcl87CisgICAgLy8gVGhlIGxlbmd0aCBvZiB8YXBwMV9idWZmZXJffC4KKyAgICB1bnNpZ25lZCBpbnQgYXBwMV9sZW5ndGhfOworCisgICAgLy8gSG93IHByZWNpc2UgdGhlIGZsb2F0LXRvLXJhdGlvbmFsIGNvbnZlcnNpb24gZm9yIEVYSUYgdGFncyB3b3VsZCBiZS4KKyAgICBjb25zdCBzdGF0aWMgaW50IGtSYXRpb25hbFByZWNpc2lvbiA9IDEwMDAwOworfTsKKworI2RlZmluZSBTRVRfU0hPUlQoaWZkLCB0YWcsIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHNldFNob3J0KGlmZCwgdGFnLCB2YWx1ZSwgI3RhZykgPT0gZmFsc2UpICAgXAorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCk7CisKKyNkZWZpbmUgU0VUX0xPTkcoaWZkLCB0YWcsIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChzZXRMb25nKGlmZCwgdGFnLCB2YWx1ZSwgI3RhZykgPT0gZmFsc2UpICAgIFwKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApOworCisjZGVmaW5lIFNFVF9SQVRJT05BTChpZmQsIHRhZywgbnVtZXJhdG9yLCBkZW5vbWluYXRvcikgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHNldFJhdGlvbmFsKGlmZCwgdGFnLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yLCAjdGFnKSA9PSBmYWxzZSkgICBcCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gd2hpbGUgKDApOworCisjZGVmaW5lIFNFVF9TUkFUSU9OQUwoaWZkLCB0YWcsIG51bWVyYXRvciwgZGVub21pbmF0b3IpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChzZXRTUmF0aW9uYWwoaWZkLCB0YWcsIG51bWVyYXRvciwgZGVub21pbmF0b3IsICN0YWcpID09IGZhbHNlKSAgICBcCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSB3aGlsZSAoMCk7CisKKyNkZWZpbmUgU0VUX1NUUklORyhpZmQsIHRhZywgZm9ybWF0LCBidWZmZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKHNldFN0cmluZyhpZmQsIHRhZywgZm9ybWF0LCBidWZmZXIsICN0YWcpID09IGZhbHNlKSAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKTsKKworLy8gVGhpcyBjb21lcyBmcm9tIHRoZSBFeGlmIFZlcnNpb24gMi4yIHN0YW5kYXJkIHRhYmxlIDYuCitjb25zdCBjaGFyIGdFeGlmQXNjaWlQcmVmaXhbXSA9IHsweDQxLCAweDUzLCAweDQzLCAweDQ5LCAweDQ5LCAweDAsIDB4MCwgMHgwfTsKKworc3RhdGljIHZvaWQgc2V0TGF0aXR1ZGVPckxvbmdpdHVkZURhdGEodW5zaWduZWQgY2hhciogZGF0YSwgZG91YmxlIG51bSkgeworICAgIC8vIFRha2UgdGhlIGludGVnZXIgcGFydCBvZiB8bnVtfC4KKyAgICBFeGlmTG9uZyBkZWdyZWVzID0gc3RhdGljX2Nhc3Q8RXhpZkxvbmc+KG51bSk7CisgICAgRXhpZkxvbmcgbWludXRlcyA9IHN0YXRpY19jYXN0PEV4aWZMb25nPig2MCAqIChudW0gLSBkZWdyZWVzKSk7CisgICAgRXhpZkxvbmcgbWljcm9zZWNvbmRzID0KKyAgICAgICAgICAgIHN0YXRpY19jYXN0PEV4aWZMb25nPigzNjAwMDAwMDAwdSAqIChudW0gLSBkZWdyZWVzIC0gbWludXRlcyAvIDYwLjApKTsKKyAgICBleGlmX3NldF9yYXRpb25hbChkYXRhLCBFWElGX0JZVEVfT1JERVJfSU5URUwsIHtkZWdyZWVzLCAxfSk7CisgICAgZXhpZl9zZXRfcmF0aW9uYWwoZGF0YSArIHNpemVvZihFeGlmUmF0aW9uYWwpLCBFWElGX0JZVEVfT1JERVJfSU5URUwsIHttaW51dGVzLCAxfSk7CisgICAgZXhpZl9zZXRfcmF0aW9uYWwoZGF0YSArIDIgKiBzaXplb2YoRXhpZlJhdGlvbmFsKSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLAorICAgICAgICAgICAge21pY3Jvc2Vjb25kcywgMTAwMDAwMH0pOworfQorCitFeGlmVXRpbHMgKkV4aWZVdGlsczo6Y3JlYXRlKCkgeworICAgIHJldHVybiBuZXcgRXhpZlV0aWxzSW1wbCgpOworfQorCitFeGlmVXRpbHM6On5FeGlmVXRpbHMoKSB7Cit9CisKK0V4aWZVdGlsc0ltcGw6OkV4aWZVdGlsc0ltcGwoKQorICAgICAgICA6IGV4aWZfZGF0YV8obnVsbHB0ciksIGFwcDFfYnVmZmVyXyhudWxscHRyKSwgYXBwMV9sZW5ndGhfKDApIHt9CisKK0V4aWZVdGlsc0ltcGw6On5FeGlmVXRpbHNJbXBsKCkgeworICAgIHJlc2V0KCk7Cit9CisKKworYm9vbCBFeGlmVXRpbHNJbXBsOjppbml0aWFsaXplKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmFwcDFTZWdtZW50LCBzaXplX3QgYXBwMVNlZ21lbnRTaXplKSB7CisgICAgcmVzZXQoKTsKKyAgICBleGlmX2RhdGFfID0gZXhpZl9kYXRhX25ld19mcm9tX2RhdGEoYXBwMVNlZ21lbnQsIGFwcDFTZWdtZW50U2l6ZSk7CisgICAgaWYgKGV4aWZfZGF0YV8gPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiJXM6IGFsbG9jYXRlIG1lbW9yeSBmb3IgZXhpZl9kYXRhXyBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIHNldCB0aGUgaW1hZ2Ugb3B0aW9ucy4KKyAgICBleGlmX2RhdGFfc2V0X29wdGlvbihleGlmX2RhdGFfLCBFWElGX0RBVEFfT1BUSU9OX0ZPTExPV19TUEVDSUZJQ0FUSU9OKTsKKyAgICBleGlmX2RhdGFfc2V0X2RhdGFfdHlwZShleGlmX2RhdGFfLCBFWElGX0RBVEFfVFlQRV9DT01QUkVTU0VEKTsKKyAgICBleGlmX2RhdGFfc2V0X2J5dGVfb3JkZXIoZXhpZl9kYXRhXywgRVhJRl9CWVRFX09SREVSX0lOVEVMKTsKKworICAgIC8vIHNldCBleGlmIHZlcnNpb24gdG8gMi4yLgorICAgIGlmICghc2V0RXhpZlZlcnNpb24oIjAyMjAiKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6aW5pdGlhbGl6ZUVtcHR5KCkgeworICAgIHJlc2V0KCk7CisgICAgZXhpZl9kYXRhXyA9IGV4aWZfZGF0YV9uZXcoKTsKKyAgICBpZiAoZXhpZl9kYXRhXyA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlczogYWxsb2NhdGUgbWVtb3J5IGZvciBleGlmX2RhdGFfIGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gc2V0IHRoZSBpbWFnZSBvcHRpb25zLgorICAgIGV4aWZfZGF0YV9zZXRfb3B0aW9uKGV4aWZfZGF0YV8sIEVYSUZfREFUQV9PUFRJT05fRk9MTE9XX1NQRUNJRklDQVRJT04pOworICAgIGV4aWZfZGF0YV9zZXRfZGF0YV90eXBlKGV4aWZfZGF0YV8sIEVYSUZfREFUQV9UWVBFX0NPTVBSRVNTRUQpOworICAgIGV4aWZfZGF0YV9zZXRfYnl0ZV9vcmRlcihleGlmX2RhdGFfLCBFWElGX0JZVEVfT1JERVJfSU5URUwpOworCisgICAgLy8gc2V0IGV4aWYgdmVyc2lvbiB0byAyLjIuCisgICAgaWYgKCFzZXRFeGlmVmVyc2lvbigiMDIyMCIpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRBcGVydHVyZShmbG9hdCBhcGVydHVyZSkgeworICAgIGZsb2F0IGFwZXhWYWx1ZSA9IGNvbnZlcnRUb0FwZXgoYXBlcnR1cmUpOworICAgIFNFVF9SQVRJT05BTChFWElGX0lGRF9FWElGLCBFWElGX1RBR19BUEVSVFVSRV9WQUxVRSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGQ6OnJvdW5kKGFwZXhWYWx1ZSAqIGtSYXRpb25hbFByZWNpc2lvbikpLAorICAgICAgICAgICAga1JhdGlvbmFsUHJlY2lzaW9uKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRDb2xvclNwYWNlKHVpbnQxNl90IGNvbG9yX3NwYWNlKSB7CisgICAgU0VUX1NIT1JUKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0NPTE9SX1NQQUNFLCBjb2xvcl9zcGFjZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0RGF0ZVRpbWUoY29uc3Qgc3RydWN0IHRtJiB0KSB7CisgICAgLy8gVGhlIGxlbmd0aCBpcyAyMCBieXRlcyBpbmNsdWRpbmcgTlVMTCBmb3IgdGVybWluYXRpb24gaW4gRXhpZiBzdGFuZGFyZC4KKyAgICBjaGFyIHN0clsyMF07CisgICAgaW50IHJlc3VsdCA9IHNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICIlMDRpOiUwMmk6JTAyaSAlMDJpOiUwMmk6JTAyaSIsCisgICAgICAgICAgICB0LnRtX3llYXIgKyAxOTAwLCB0LnRtX21vbiArIDEsIHQudG1fbWRheSwgdC50bV9ob3VyLCB0LnRtX21pbiwgdC50bV9zZWMpOworICAgIGlmIChyZXN1bHQgIT0gc2l6ZW9mKHN0cikgLSAxKSB7CisgICAgICAgIEFMT0dXKCIlczogSW5wdXQgdGltZSBpcyBpbnZhbGlkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBidWZmZXIoc3RyKTsKKyAgICBTRVRfU1RSSU5HKEVYSUZfSUZEXzAsIEVYSUZfVEFHX0RBVEVfVElNRSwgRVhJRl9GT1JNQVRfQVNDSUksIGJ1ZmZlcik7CisgICAgU0VUX1NUUklORyhFWElGX0lGRF9FWElGLCBFWElGX1RBR19EQVRFX1RJTUVfT1JJR0lOQUwsIEVYSUZfRk9STUFUX0FTQ0lJLCBidWZmZXIpOworICAgIFNFVF9TVFJJTkcoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfREFURV9USU1FX0RJR0lUSVpFRCwgRVhJRl9GT1JNQVRfQVNDSUksIGJ1ZmZlcik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0RGlnaXRhbFpvb21SYXRpbygKKyAgICAgICAgdWludDMyX3QgY3JvcF93aWR0aCwgdWludDMyX3QgY3JvcF9oZWlnaHQsCisgICAgICAgIHVpbnQzMl90IHNlbnNvcl93aWR0aCwgdWludDMyX3Qgc2Vuc29yX2hlaWdodCkgeworICAgIGZsb2F0IHpvb21SYXRpb1ggPSAoY3JvcF93aWR0aCA9PSAwKSA/IDEuMCA6IDEuMCAqIHNlbnNvcl93aWR0aCAvIGNyb3Bfd2lkdGg7CisgICAgZmxvYXQgem9vbVJhdGlvWSA9IChjcm9wX2hlaWdodCA9PSAwKSA/IDEuMCA6IDEuMCAqIHNlbnNvcl9oZWlnaHQgLyBjcm9wX2hlaWdodDsKKyAgICBmbG9hdCB6b29tUmF0aW8gPSBzdGQ6Om1heCh6b29tUmF0aW9YLCB6b29tUmF0aW9ZKTsKKyAgICBjb25zdCBzdGF0aWMgZmxvYXQgbm9ab29tVGhyZXNob2xkID0gMS4wMmY7CisKKyAgICBpZiAoem9vbVJhdGlvIDw9IG5vWm9vbVRocmVzaG9sZCkgeworICAgICAgICBTRVRfUkFUSU9OQUwoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfRElHSVRBTF9aT09NX1JBVElPLCAwLCAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICBTRVRfUkFUSU9OQUwoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfRElHSVRBTF9aT09NX1JBVElPLAorICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGQ6OnJvdW5kKHpvb21SYXRpbyAqIGtSYXRpb25hbFByZWNpc2lvbikpLAorICAgICAgICAgICAgICAgIGtSYXRpb25hbFByZWNpc2lvbik7CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEV4cG9zdXJlTW9kZSh1aW50OF90IGV4cG9zdXJlX21vZGUpIHsKKyAgICB1aW50MTZfdCBleHBvc3VyZU1vZGUgPSAoZXhwb3N1cmVfbW9kZSA9PSBBTkRST0lEX0NPTlRST0xfQUVfTU9ERV9PRkYpID8gMSA6IDA7CisgICAgU0VUX1NIT1JUKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0VYUE9TVVJFX01PREUsIGV4cG9zdXJlTW9kZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0RXhwb3N1cmVUaW1lKGZsb2F0IGV4cG9zdXJlX3RpbWUpIHsKKyAgICBTRVRfUkFUSU9OQUwoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfRVhQT1NVUkVfVElNRSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzdGQ6OnJvdW5kKGV4cG9zdXJlX3RpbWUgKiBrUmF0aW9uYWxQcmVjaXNpb24pKSwKKyAgICAgICAgICAgIGtSYXRpb25hbFByZWNpc2lvbik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0Rmxhc2godWludDhfdCBmbGFzaF9hdmFpbGFibGUsIHVpbnQ4X3QgZmxhc2hfc3RhdGUsIHVpbnQ4X3QgYWVfbW9kZSkgeworICAgIC8vIEVYSUZfVEFHX0ZMQVNIIGJpdHMgbGF5b3V0IHBlciBFWElGIHN0YW5kYXJkOgorICAgIC8vIEJpdCAwOiAgICAwIC0gZGlkIG5vdCBmaXJlCisgICAgLy8gICAgICAgICAgIDEgLSBmaXJlZAorICAgIC8vIEJpdCAxLTI6ICBzdGF0dXMgb2YgcmV0dXJuIGxpZ2h0CisgICAgLy8gQml0IDMtNDogIDAgLSB1bmtub3duCisgICAgLy8gICAgICAgICAgIDEgLSBjb21wdWxzb3J5IGZsYXNoIGZpcmluZworICAgIC8vICAgICAgICAgICAyIC0gY29tcHVsc29yeSBmbGFzaCBzdXBwcmVzc2lvbgorICAgIC8vICAgICAgICAgICAzIC0gYXV0byBtb2RlCisgICAgLy8gQml0IDU6ICAgIDAgLSBmbGFzaCBmdW5jdGlvbiBwcmVzZW50CisgICAgLy8gICAgICAgICAgIDEgLSBubyBmbGFzaCBmdW5jdGlvbgorICAgIC8vIEJpdCA2OiAgICAwIC0gbm8gcmVkLWV5ZSByZWR1Y3Rpb24gbW9kZSBvciB1bmtub3duCisgICAgLy8gICAgICAgICAgIDEgLSByZWQtZXllIHJlZHVjdGlvbiBzdXBwb3J0ZWQKKyAgICB1aW50MTZfdCBmbGFzaCA9IDB4MjA7CisKKyAgICBpZiAoZmxhc2hfYXZhaWxhYmxlID09IEFORFJPSURfRkxBU0hfSU5GT19BVkFJTEFCTEVfVFJVRSkgeworICAgICAgICBmbGFzaCA9IDB4MDA7CisKKyAgICAgICAgaWYgKGZsYXNoX3N0YXRlID09IEFORFJPSURfRkxBU0hfU1RBVEVfRklSRUQpIHsKKyAgICAgICAgICAgIGZsYXNoIHw9IDB4MTsKKyAgICAgICAgfQorICAgICAgICBpZiAoYWVfbW9kZSA9PSBBTkRST0lEX0NPTlRST0xfQUVfTU9ERV9PTl9BVVRPX0ZMQVNIX1JFREVZRSkgeworICAgICAgICAgICAgZmxhc2ggfD0gMHg0MDsKKyAgICAgICAgfQorCisgICAgICAgIHVpbnQxNl90IGZsYXNoTW9kZSA9IDA7CisgICAgICAgIHN3aXRjaCAoYWVfbW9kZSkgeworICAgICAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUVfTU9ERV9PTl9BVVRPX0ZMQVNIOgorICAgICAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUVfTU9ERV9PTl9BVVRPX0ZMQVNIX1JFREVZRToKKyAgICAgICAgICAgICAgIGZsYXNoTW9kZSA9IDM7IC8vIEFVVE8KKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUVfTU9ERV9PTl9BTFdBWVNfRkxBU0g6CisgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09OX0VYVEVSTkFMX0ZMQVNIOgorICAgICAgICAgICAgICAgZmxhc2hNb2RlID0gMTsgLy8gT04KKyAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBBTkRST0lEX0NPTlRST0xfQUVfTU9ERV9PRkY6CisgICAgICAgICAgICBjYXNlIEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09OOgorICAgICAgICAgICAgICAgZmxhc2hNb2RlID0gMjsgLy8gT0ZGCisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICBmbGFzaE1vZGUgPSAwOyAvLyBVTktOT1dOCisgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBmbGFzaCB8PSAoZmxhc2hNb2RlIDw8IDMpOworICAgIH0KKyAgICBTRVRfU0hPUlQoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfRkxBU0gsIGZsYXNoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRGTnVtYmVyKGZsb2F0IGZfbnVtYmVyKSB7CisgICAgU0VUX1JBVElPTkFMKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0ZOVU1CRVIsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RkOjpyb3VuZChmX251bWJlciAqIGtSYXRpb25hbFByZWNpc2lvbikpLAorICAgICAgICAgICAga1JhdGlvbmFsUHJlY2lzaW9uKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRGb2NhbExlbmd0aChmbG9hdCBmb2NhbF9sZW5ndGgpIHsKKyAgICB1aW50MzJfdCBudW1lcmF0b3IgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RkOjpyb3VuZChmb2NhbF9sZW5ndGggKiBrUmF0aW9uYWxQcmVjaXNpb24pKTsKKyAgICBTRVRfUkFUSU9OQUwoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfRk9DQUxfTEVOR1RILCBudW1lcmF0b3IsIGtSYXRpb25hbFByZWNpc2lvbik7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0Rm9jYWxMZW5ndGhJbjM1bW1GaWxtKAorICAgICAgICBmbG9hdCBmb2NhbF9sZW5ndGgsIGZsb2F0IHNlbnNvcl9zaXplX3gsIGZsb2F0IHNlbnNvcl9zaXplX3kpIHsKKyAgICBzdGF0aWMgY29uc3QgZmxvYXQgZmlsbURpYWdvbmFsID0gNDMuMjc7IC8vIGRpYWdvbmFsIG9mIDM1bW0gZmlsbQorICAgIHN0YXRpYyBjb25zdCBmbG9hdCBtaW5TZW5zb3JEaWFnb25hbCA9IDAuMDE7CisgICAgZmxvYXQgc2Vuc29yRGlhZ29uYWwgPSBzdGQ6OnNxcnQoCisgICAgICAgICAgICBzZW5zb3Jfc2l6ZV94ICogc2Vuc29yX3NpemVfeCArIHNlbnNvcl9zaXplX3kgKiBzZW5zb3Jfc2l6ZV95KTsKKyAgICBzZW5zb3JEaWFnb25hbCA9IHN0ZDo6bWF4KHNlbnNvckRpYWdvbmFsLCBtaW5TZW5zb3JEaWFnb25hbCk7CisgICAgZmxvYXQgZm9jYWxMZW5ndGgzNW1tRmlsbSA9IHN0ZDo6cm91bmQoZm9jYWxfbGVuZ3RoICogZmlsbURpYWdvbmFsIC8gc2Vuc29yRGlhZ29uYWwpOworICAgIGZvY2FsTGVuZ3RoMzVtbUZpbG0gPSBzdGQ6Om1pbigxLjBmICogNjU1MzUsIGZvY2FsTGVuZ3RoMzVtbUZpbG0pOworCisgICAgU0VUX1NIT1JUKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0ZPQ0FMX0xFTkdUSF9JTl8zNU1NX0ZJTE0sCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MTZfdD4oZm9jYWxMZW5ndGgzNW1tRmlsbSkpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEdwc0FsdGl0dWRlKGRvdWJsZSBhbHRpdHVkZSkgeworICAgIEV4aWZUYWcgcmVmVGFnID0gc3RhdGljX2Nhc3Q8RXhpZlRhZz4oRVhJRl9UQUdfR1BTX0FMVElUVURFX1JFRik7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gcmVmRW50cnkgPQorICAgICAgICAgICAgYWRkVmFyaWFibGVMZW5ndGhFbnRyeShFWElGX0lGRF9HUFMsIHJlZlRhZywgRVhJRl9GT1JNQVRfQllURSwgMSwgMSk7CisgICAgaWYgKCFyZWZFbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyBHUFNBbHRpdHVkZVJlZiBleGlmIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGFsdGl0dWRlID49IDApIHsKKyAgICAgICAgKnJlZkVudHJ5LT5kYXRhID0gMDsKKyAgICB9IGVsc2UgeworICAgICAgICAqcmVmRW50cnktPmRhdGEgPSAxOworICAgICAgICBhbHRpdHVkZSAqPSAtMTsKKyAgICB9CisKKyAgICBFeGlmVGFnIHRhZyA9IHN0YXRpY19jYXN0PEV4aWZUYWc+KEVYSUZfVEFHX0dQU19BTFRJVFVERSk7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZW50cnkgPSBhZGRWYXJpYWJsZUxlbmd0aEVudHJ5KAorICAgICAgICAgICAgRVhJRl9JRkRfR1BTLCB0YWcsIEVYSUZfRk9STUFUX1JBVElPTkFMLCAxLCBzaXplb2YoRXhpZlJhdGlvbmFsKSk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBleGlmX2NvbnRlbnRfcmVtb3ZlX2VudHJ5KGV4aWZfZGF0YV8tPmlmZFtFWElGX0lGRF9HUFNdLCByZWZFbnRyeS5nZXQoKSk7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nIEdQU0FsdGl0dWRlIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBleGlmX3NldF9yYXRpb25hbChlbnRyeS0+ZGF0YSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLAorICAgICAgICAgICAge3N0YXRpY19jYXN0PEV4aWZMb25nPihhbHRpdHVkZSAqIDEwMDApLCAxMDAwfSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRHcHNMYXRpdHVkZShkb3VibGUgbGF0aXR1ZGUpIHsKKyAgICBjb25zdCBFeGlmVGFnIHJlZlRhZyA9IHN0YXRpY19jYXN0PEV4aWZUYWc+KEVYSUZfVEFHX0dQU19MQVRJVFVERV9SRUYpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IHJlZkVudHJ5ID0KKyAgICAgICAgICAgIGFkZFZhcmlhYmxlTGVuZ3RoRW50cnkoRVhJRl9JRkRfR1BTLCByZWZUYWcsIEVYSUZfRk9STUFUX0FTQ0lJLCAyLCAyKTsKKyAgICBpZiAoIXJlZkVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nIEdQU0xhdGl0dWRlUmVmIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAobGF0aXR1ZGUgPj0gMCkgeworICAgICAgICBtZW1jcHkocmVmRW50cnktPmRhdGEsICJOIiwgc2l6ZW9mKCJOIikpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShyZWZFbnRyeS0+ZGF0YSwgIlMiLCBzaXplb2YoIlMiKSk7CisgICAgICAgIGxhdGl0dWRlICo9IC0xOworICAgIH0KKworICAgIGNvbnN0IEV4aWZUYWcgdGFnID0gc3RhdGljX2Nhc3Q8RXhpZlRhZz4oRVhJRl9UQUdfR1BTX0xBVElUVURFKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBlbnRyeSA9IGFkZFZhcmlhYmxlTGVuZ3RoRW50cnkoCisgICAgICAgICAgICBFWElGX0lGRF9HUFMsIHRhZywgRVhJRl9GT1JNQVRfUkFUSU9OQUwsIDMsIDMgKiBzaXplb2YoRXhpZlJhdGlvbmFsKSk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBleGlmX2NvbnRlbnRfcmVtb3ZlX2VudHJ5KGV4aWZfZGF0YV8tPmlmZFtFWElGX0lGRF9HUFNdLCByZWZFbnRyeS5nZXQoKSk7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nIEdQU0xhdGl0dWRlIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzZXRMYXRpdHVkZU9yTG9uZ2l0dWRlRGF0YShlbnRyeS0+ZGF0YSwgbGF0aXR1ZGUpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0R3BzTG9uZ2l0dWRlKGRvdWJsZSBsb25naXR1ZGUpIHsKKyAgICBFeGlmVGFnIHJlZlRhZyA9IHN0YXRpY19jYXN0PEV4aWZUYWc+KEVYSUZfVEFHX0dQU19MT05HSVRVREVfUkVGKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiByZWZFbnRyeSA9CisgICAgICAgICAgICBhZGRWYXJpYWJsZUxlbmd0aEVudHJ5KEVYSUZfSUZEX0dQUywgcmVmVGFnLCBFWElGX0ZPUk1BVF9BU0NJSSwgMiwgMik7CisgICAgaWYgKCFyZWZFbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyBHUFNMb25naXR1ZGVSZWYgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChsb25naXR1ZGUgPj0gMCkgeworICAgICAgICBtZW1jcHkocmVmRW50cnktPmRhdGEsICJFIiwgc2l6ZW9mKCJFIikpOworICAgIH0gZWxzZSB7CisgICAgICAgIG1lbWNweShyZWZFbnRyeS0+ZGF0YSwgIlciLCBzaXplb2YoIlciKSk7CisgICAgICAgIGxvbmdpdHVkZSAqPSAtMTsKKyAgICB9CisKKyAgICBFeGlmVGFnIHRhZyA9IHN0YXRpY19jYXN0PEV4aWZUYWc+KEVYSUZfVEFHX0dQU19MT05HSVRVREUpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGVudHJ5ID0gYWRkVmFyaWFibGVMZW5ndGhFbnRyeSgKKyAgICAgICAgICAgIEVYSUZfSUZEX0dQUywgdGFnLCBFWElGX0ZPUk1BVF9SQVRJT05BTCwgMywgMyAqIHNpemVvZihFeGlmUmF0aW9uYWwpKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIGV4aWZfY29udGVudF9yZW1vdmVfZW50cnkoZXhpZl9kYXRhXy0+aWZkW0VYSUZfSUZEX0dQU10sIHJlZkVudHJ5LmdldCgpKTsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgR1BTTG9uZ2l0dWRlIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzZXRMYXRpdHVkZU9yTG9uZ2l0dWRlRGF0YShlbnRyeS0+ZGF0YSwgbG9uZ2l0dWRlKTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEdwc1Byb2Nlc3NpbmdNZXRob2QoY29uc3Qgc3RkOjpzdHJpbmcmIG1ldGhvZCkgeworICAgIHN0ZDo6c3RyaW5nIGJ1ZmZlciA9CisgICAgICAgICAgICBzdGQ6OnN0cmluZyhnRXhpZkFzY2lpUHJlZml4LCBzaXplb2YoZ0V4aWZBc2NpaVByZWZpeCkpICsgbWV0aG9kOworICAgIFNFVF9TVFJJTkcoRVhJRl9JRkRfR1BTLCBzdGF0aWNfY2FzdDxFeGlmVGFnPihFWElGX1RBR19HUFNfUFJPQ0VTU0lOR19NRVRIT0QpLAorICAgICAgICAgICAgRVhJRl9GT1JNQVRfVU5ERUZJTkVELCBidWZmZXIpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEdwc1RpbWVzdGFtcChjb25zdCBzdHJ1Y3QgdG0mIHQpIHsKKyAgICBjb25zdCBFeGlmVGFnIGRhdGVUYWcgPSBzdGF0aWNfY2FzdDxFeGlmVGFnPihFWElGX1RBR19HUFNfREFURV9TVEFNUCk7CisgICAgY29uc3Qgc2l6ZV90IGtHcHNEYXRlU3RhbXBTaXplID0gMTE7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZW50cnkgPSBhZGRWYXJpYWJsZUxlbmd0aEVudHJ5KEVYSUZfSUZEX0dQUywKKyAgICAgICAgICAgIGRhdGVUYWcsIEVYSUZfRk9STUFUX0FTQ0lJLCBrR3BzRGF0ZVN0YW1wU2l6ZSwga0dwc0RhdGVTdGFtcFNpemUpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgR1BTRGF0ZVN0YW1wIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbnQgcmVzdWx0ID0gc25wcmludGYocmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZW50cnktPmRhdGEpLCBrR3BzRGF0ZVN0YW1wU2l6ZSwKKyAgICAgICAgICAgICIlMDRpOiUwMmk6JTAyaSIsIHQudG1feWVhciArIDE5MDAsIHQudG1fbW9uICsgMSwgdC50bV9tZGF5KTsKKyAgICBpZiAocmVzdWx0ICE9IGtHcHNEYXRlU3RhbXBTaXplIC0gMSkgeworICAgICAgICBBTE9HVygiJXM6IElucHV0IHRpbWUgaXMgaW52YWxpZCIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBFeGlmVGFnIHRpbWVUYWcgPSBzdGF0aWNfY2FzdDxFeGlmVGFnPihFWElGX1RBR19HUFNfVElNRV9TVEFNUCk7CisgICAgZW50cnkgPSBhZGRWYXJpYWJsZUxlbmd0aEVudHJ5KEVYSUZfSUZEX0dQUywgdGltZVRhZywgRVhJRl9GT1JNQVRfUkFUSU9OQUwsIDMsCisgICAgICAgICAgICAzICogc2l6ZW9mKEV4aWZSYXRpb25hbCkpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBZGRpbmcgR1BTVGltZVN0YW1wIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBleGlmX3NldF9yYXRpb25hbChlbnRyeS0+ZGF0YSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLAorICAgICAgICAgICAge3N0YXRpY19jYXN0PEV4aWZMb25nPih0LnRtX2hvdXIpLCAxfSk7CisgICAgZXhpZl9zZXRfcmF0aW9uYWwoZW50cnktPmRhdGEgKyBzaXplb2YoRXhpZlJhdGlvbmFsKSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLAorICAgICAgICAgICAge3N0YXRpY19jYXN0PEV4aWZMb25nPih0LnRtX21pbiksIDF9KTsKKyAgICBleGlmX3NldF9yYXRpb25hbChlbnRyeS0+ZGF0YSArIDIgKiBzaXplb2YoRXhpZlJhdGlvbmFsKSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLAorICAgICAgICAgICAge3N0YXRpY19jYXN0PEV4aWZMb25nPih0LnRtX3NlYyksIDF9KTsKKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEltYWdlSGVpZ2h0KHVpbnQzMl90IGxlbmd0aCkgeworICAgIFNFVF9MT05HKEVYSUZfSUZEXzAsIEVYSUZfVEFHX0lNQUdFX0xFTkdUSCwgbGVuZ3RoKTsKKyAgICBTRVRfTE9ORyhFWElGX0lGRF9FWElGLCBFWElGX1RBR19QSVhFTF9ZX0RJTUVOU0lPTiwgbGVuZ3RoKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRJbWFnZVdpZHRoKHVpbnQzMl90IHdpZHRoKSB7CisgICAgU0VUX0xPTkcoRVhJRl9JRkRfMCwgRVhJRl9UQUdfSU1BR0VfV0lEVEgsIHdpZHRoKTsKKyAgICBTRVRfTE9ORyhFWElGX0lGRF9FWElGLCBFWElGX1RBR19QSVhFTF9YX0RJTUVOU0lPTiwgd2lkdGgpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldElzb1NwZWVkUmF0aW5nKHVpbnQxNl90IGlzb19zcGVlZF9yYXRpbmdzKSB7CisgICAgU0VUX1NIT1JUKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0lTT19TUEVFRF9SQVRJTkdTLCBpc29fc3BlZWRfcmF0aW5ncyk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0TWF4QXBlcnR1cmUoZmxvYXQgYXBlcnR1cmUpIHsKKyAgICBmbG9hdCBtYXhBcGVydHVyZSA9IGNvbnZlcnRUb0FwZXgoYXBlcnR1cmUpOworICAgIFNFVF9SQVRJT05BTChFWElGX0lGRF9FWElGLCBFWElGX1RBR19NQVhfQVBFUlRVUkVfVkFMVUUsCisgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50MzJfdD4oc3RkOjpyb3VuZChtYXhBcGVydHVyZSAqIGtSYXRpb25hbFByZWNpc2lvbikpLAorICAgICAgICAgICAga1JhdGlvbmFsUHJlY2lzaW9uKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRFeHBvc3VyZUJpYXMoaW50MzJfdCBldiwKKyAgICAgICAgdWludDMyX3QgZXZfc3RlcF9udW1lcmF0b3IsIHVpbnQzMl90IGV2X3N0ZXBfZGVub21pbmF0b3IpIHsKKyAgICBTRVRfUkFUSU9OQUwoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfRVhQT1NVUkVfQklBU19WQUxVRSwKKyAgICAgICAgICAgIGV2ICogZXZfc3RlcF9udW1lcmF0b3IsIGV2X3N0ZXBfZGVub21pbmF0b3IpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldE9yaWVudGF0aW9uKHVpbnQxNl90IGRlZ3JlZXMpIHsKKyAgICBFeGlmT3JpZW50YXRpb24gdmFsdWUgPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzBfREVHUkVFUzsKKyAgICBzd2l0Y2ggKGRlZ3JlZXMpIHsKKyAgICAgICAgY2FzZSA5MDoKKyAgICAgICAgICAgIHZhbHVlID0gRXhpZk9yaWVudGF0aW9uOjpPUklFTlRBVElPTl85MF9ERUdSRUVTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMTgwOgorICAgICAgICAgICAgdmFsdWUgPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzE4MF9ERUdSRUVTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjcwOgorICAgICAgICAgICAgdmFsdWUgPSBFeGlmT3JpZW50YXRpb246Ok9SSUVOVEFUSU9OXzI3MF9ERUdSRUVTOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIHNldE9yaWVudGF0aW9uVmFsdWUodmFsdWUpOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldE9yaWVudGF0aW9uVmFsdWUoRXhpZk9yaWVudGF0aW9uIG9yaWVudGF0aW9uVmFsdWUpIHsKKyAgICBTRVRfU0hPUlQoRVhJRl9JRkRfMCwgRVhJRl9UQUdfT1JJRU5UQVRJT04sIG9yaWVudGF0aW9uVmFsdWUpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldFNodXR0ZXJTcGVlZChmbG9hdCBleHBvc3VyZV90aW1lKSB7CisgICAgZmxvYXQgc2h1dHRlclNwZWVkID0gLWxvZzJmKGV4cG9zdXJlX3RpbWUpOworICAgIFNFVF9TUkFUSU9OQUwoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfU0hVVFRFUl9TUEVFRF9WQUxVRSwKKyAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQzMl90PihzaHV0dGVyU3BlZWQgKiBrUmF0aW9uYWxQcmVjaXNpb24pLCBrUmF0aW9uYWxQcmVjaXNpb24pOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldFN1YmplY3REaXN0YW5jZShmbG9hdCBkaW9wdGVycykgeworICAgIGNvbnN0IHN0YXRpYyBmbG9hdCBrSW5maW5pdHlEaW9wdGVycyA9IDEuMGUtNjsKKyAgICB1aW50MzJfdCBudW1lcmF0b3IsIGRlbm9taW5hdG9yOworICAgIHVpbnQxNl90IGRpc3RhbmNlUmFuZ2U7CisgICAgaWYgKGRpb3B0ZXJzID4ga0luZmluaXR5RGlvcHRlcnMpIHsKKyAgICAgICAgZmxvYXQgZm9jdXNEaXN0YW5jZSA9IDEuMGYgLyBkaW9wdGVyczsKKyAgICAgICAgbnVtZXJhdG9yID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KHN0ZDo6cm91bmQoZm9jdXNEaXN0YW5jZSAqIGtSYXRpb25hbFByZWNpc2lvbikpOworICAgICAgICBkZW5vbWluYXRvciA9IGtSYXRpb25hbFByZWNpc2lvbjsKKworICAgICAgICBpZiAoZm9jdXNEaXN0YW5jZSA8IDEuMGYpIHsKKyAgICAgICAgICAgIGRpc3RhbmNlUmFuZ2UgPSAxOyAvLyBNYWNybworICAgICAgICB9IGVsc2UgaWYgKGZvY3VzRGlzdGFuY2UgPCAzLjBmKSB7CisgICAgICAgICAgICBkaXN0YW5jZVJhbmdlID0gMjsgLy8gQ2xvc2UKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGRpc3RhbmNlUmFuZ2UgPSAzOyAvLyBEaXN0YW50CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBudW1lcmF0b3IgPSAweEZGRkZGRkZGOworICAgICAgICBkZW5vbWluYXRvciA9IDE7CisgICAgICAgIGRpc3RhbmNlUmFuZ2UgPSAzOyAvLyBEaXN0YW50CisgICAgfQorICAgIFNFVF9SQVRJT05BTChFWElGX0lGRF9FWElGLCBFWElGX1RBR19TVUJKRUNUX0RJU1RBTkNFLCBudW1lcmF0b3IsIGRlbm9taW5hdG9yKTsKKyAgICBTRVRfU0hPUlQoRVhJRl9JRkRfRVhJRiwgRVhJRl9UQUdfU1VCSkVDVF9ESVNUQU5DRV9SQU5HRSwgZGlzdGFuY2VSYW5nZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0U3Vic2VjVGltZShjb25zdCBzdGQ6OnN0cmluZyYgc3Vic2VjX3RpbWUpIHsKKyAgICBTRVRfU1RSSU5HKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX1NVQl9TRUNfVElNRSwgRVhJRl9GT1JNQVRfQVNDSUksIHN1YnNlY190aW1lKTsKKyAgICBTRVRfU1RSSU5HKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX1NVQl9TRUNfVElNRV9PUklHSU5BTCwgRVhJRl9GT1JNQVRfQVNDSUksIHN1YnNlY190aW1lKTsKKyAgICBTRVRfU1RSSU5HKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX1NVQl9TRUNfVElNRV9ESUdJVElaRUQsIEVYSUZfRk9STUFUX0FTQ0lJLCBzdWJzZWNfdGltZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0V2hpdGVCYWxhbmNlKHVpbnQ4X3Qgd2hpdGVfYmFsYW5jZSkgeworICAgIHVpbnQxNl90IHdoaXRlQmFsYW5jZSA9ICh3aGl0ZV9iYWxhbmNlID09IEFORFJPSURfQ09OVFJPTF9BV0JfTU9ERV9BVVRPKSA/IDAgOiAxOworICAgIFNFVF9TSE9SVChFWElGX0lGRF9FWElGLCBFWElGX1RBR19XSElURV9CQUxBTkNFLCB3aGl0ZUJhbGFuY2UpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OmdlbmVyYXRlQXBwMSgpIHsKKyAgICBkZXN0cm95QXBwMSgpOworICAgIC8vIFNhdmUgdGhlIHJlc3VsdCBpbnRvIHxhcHAxX2J1ZmZlcl98LgorICAgIGV4aWZfZGF0YV9zYXZlX2RhdGEoZXhpZl9kYXRhXywgJmFwcDFfYnVmZmVyXywgJmFwcDFfbGVuZ3RoXyk7CisgICAgaWYgKCFhcHAxX2xlbmd0aF8pIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGFwcDFfYnVmZmVyXyBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8qCisgICAgICogVGhlIEpQRUcgc2VnbWVudCBzaXplIGlzIDE2IGJpdHMgaW4gc3BlYy4gVGhlIHNpemUgb2YgQVBQMSBzZWdtZW50IHNob3VsZAorICAgICAqIGJlIHNtYWxsZXIgdGhhbiA2NTUzMyBiZWNhdXNlIHRoZXJlIGFyZSB0d28gYnl0ZXMgZm9yIHNlZ21lbnQgc2l6ZSBmaWVsZC4KKyAgICAgKi8KKyAgICBpZiAoYXBwMV9sZW5ndGhfID4gNjU1MzMpIHsKKyAgICAgICAgZGVzdHJveUFwcDEoKTsKKyAgICAgICAgQUxPR0UoIiVzOiBUaGUgc2l6ZSBvZiBBUFAxIHNlZ21lbnQgaXMgdG9vIGxhcmdlIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgdWludDhfdCogRXhpZlV0aWxzSW1wbDo6Z2V0QXBwMUJ1ZmZlcigpIHsKKyAgICByZXR1cm4gYXBwMV9idWZmZXJfOworfQorCit1bnNpZ25lZCBpbnQgRXhpZlV0aWxzSW1wbDo6Z2V0QXBwMUxlbmd0aCgpIHsKKyAgICByZXR1cm4gYXBwMV9sZW5ndGhfOworfQorCitib29sIEV4aWZVdGlsc0ltcGw6OnNldEV4aWZWZXJzaW9uKGNvbnN0IHN0ZDo6c3RyaW5nJiBleGlmX3ZlcnNpb24pIHsKKyAgICBTRVRfU1RSSU5HKEVYSUZfSUZEX0VYSUYsIEVYSUZfVEFHX0VYSUZfVkVSU0lPTiwgRVhJRl9GT1JNQVRfVU5ERUZJTkVELCBleGlmX3ZlcnNpb24pOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEV4aWZVdGlsc0ltcGw6OnJlc2V0KCkgeworICAgIGRlc3Ryb3lBcHAxKCk7CisgICAgaWYgKGV4aWZfZGF0YV8pIHsKKyAgICAgICAgLyoKKyAgICAgICAgICogU2luY2Ugd2UgZGVjaWRlZCB0byBpZ25vcmUgdGhlIG9yaWdpbmFsIEFQUDEsIHdlIGFyZSBzdXJlIHRoYXQgdGhlcmUgaXMKKyAgICAgICAgICogbm8gdGh1bWJuYWlsIGFsbG9jYXRlZCBieSBsaWJleGlmLiB8ZXhpZl9kYXRhXy0+ZGF0YXwgaXMgYWN0dWFsbHkKKyAgICAgICAgICogYWxsb2NhdGVkIGJ5IEpwZWdDb21wcmVzc29yLiBzZXRzIHxleGlmX2RhdGFfLT5kYXRhfCB0byBudWxscHRyIHRvCisgICAgICAgICAqIHByZXZlbnQgZXhpZl9kYXRhX3VucmVmKCkgZGVzdHJveSBpdCBpbmNvcnJlY3RseS4KKyAgICAgICAgICovCisgICAgICAgIGV4aWZfZGF0YV8tPmRhdGEgPSBudWxscHRyOworICAgICAgICBleGlmX2RhdGFfLT5zaXplID0gMDsKKyAgICAgICAgZXhpZl9kYXRhX3VucmVmKGV4aWZfZGF0YV8pOworICAgICAgICBleGlmX2RhdGFfID0gbnVsbHB0cjsKKyAgICB9Cit9CisKK3N0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IEV4aWZVdGlsc0ltcGw6OmFkZFZhcmlhYmxlTGVuZ3RoRW50cnkoRXhpZklmZCBpZmQsCisgICAgICAgIEV4aWZUYWcgdGFnLCBFeGlmRm9ybWF0IGZvcm1hdCwgdWludDY0X3QgY29tcG9uZW50cywgdW5zaWduZWQgaW50IHNpemUpIHsKKyAgICAvLyBSZW1vdmUgb2xkIGVudHJ5IGlmIGV4aXN0cy4KKyAgICBleGlmX2NvbnRlbnRfcmVtb3ZlX2VudHJ5KGV4aWZfZGF0YV8tPmlmZFtpZmRdLAorICAgICAgICAgICAgZXhpZl9jb250ZW50X2dldF9lbnRyeShleGlmX2RhdGFfLT5pZmRbaWZkXSwgdGFnKSk7CisgICAgRXhpZk1lbSogbWVtID0gZXhpZl9tZW1fbmV3X2RlZmF1bHQoKTsKKyAgICBpZiAoIW1lbSkgeworICAgICAgICBBTE9HRSgiJXM6IEFsbG9jYXRlIG1lbW9yeSBmb3IgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZW50cnkoZXhpZl9lbnRyeV9uZXdfbWVtKG1lbSkpOworICAgIGlmICghZW50cnkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZXhpZl9tZW1fdW5yZWYobWVtKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIHZvaWQqIHRtcEJ1ZmZlciA9IGV4aWZfbWVtX2FsbG9jKG1lbSwgc2l6ZSk7CisgICAgaWYgKCF0bXBCdWZmZXIpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBBbGxvY2F0ZSBtZW1vcnkgZm9yIGV4aWYgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgZXhpZl9tZW1fdW5yZWYobWVtKTsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgZW50cnktPmRhdGEgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyKj4odG1wQnVmZmVyKTsKKyAgICBlbnRyeS0+dGFnID0gdGFnOworICAgIGVudHJ5LT5mb3JtYXQgPSBmb3JtYXQ7CisgICAgZW50cnktPmNvbXBvbmVudHMgPSBjb21wb25lbnRzOworICAgIGVudHJ5LT5zaXplID0gc2l6ZTsKKworICAgIGV4aWZfY29udGVudF9hZGRfZW50cnkoZXhpZl9kYXRhXy0+aWZkW2lmZF0sIGVudHJ5LmdldCgpKTsKKyAgICBleGlmX21lbV91bnJlZihtZW0pOworCisgICAgcmV0dXJuIGVudHJ5OworfQorCitzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBFeGlmVXRpbHNJbXBsOjphZGRFbnRyeShFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBlbnRyeShleGlmX2NvbnRlbnRfZ2V0X2VudHJ5KGV4aWZfZGF0YV8tPmlmZFtpZmRdLCB0YWcpKTsKKyAgICBpZiAoZW50cnkpIHsKKyAgICAgICAgLy8gZXhpZl9jb250ZW50X2dldF9lbnRyeSgpIHdvbid0IHJlZiB0aGUgZW50cnksIHNvIHdlIHJlZiBoZXJlLgorICAgICAgICBleGlmX2VudHJ5X3JlZihlbnRyeS5nZXQoKSk7CisgICAgICAgIHJldHVybiBlbnRyeTsKKyAgICB9CisgICAgZW50cnkucmVzZXQoZXhpZl9lbnRyeV9uZXcoKSk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFsbG9jYXRlIG1lbW9yeSBmb3IgZXhpZiBlbnRyeSBmYWlsZWQiLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICB9CisgICAgZW50cnktPnRhZyA9IHRhZzsKKyAgICBleGlmX2NvbnRlbnRfYWRkX2VudHJ5KGV4aWZfZGF0YV8tPmlmZFtpZmRdLCBlbnRyeS5nZXQoKSk7CisgICAgZXhpZl9lbnRyeV9pbml0aWFsaXplKGVudHJ5LmdldCgpLCB0YWcpOworICAgIHJldHVybiBlbnRyeTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRTaG9ydChFeGlmSWZkIGlmZCwgRXhpZlRhZyB0YWcsIHVpbnQxNl90IHZhbHVlLCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZW50cnkgPSBhZGRFbnRyeShpZmQsIHRhZyk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyAnJXMnIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXywgbXNnLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGV4aWZfc2V0X3Nob3J0KGVudHJ5LT5kYXRhLCBFWElGX0JZVEVfT1JERVJfSU5URUwsIHZhbHVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRMb25nKEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZywgdWludDMyX3QgdmFsdWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBlbnRyeSA9IGFkZEVudHJ5KGlmZCwgdGFnKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nICclcycgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fLCBtc2cuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZXhpZl9zZXRfbG9uZyhlbnRyeS0+ZGF0YSwgRVhJRl9CWVRFX09SREVSX0lOVEVMLCB2YWx1ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0UmF0aW9uYWwoRXhpZklmZCBpZmQsIEV4aWZUYWcgdGFnLCB1aW50MzJfdCBudW1lcmF0b3IsCisgICAgICAgIHVpbnQzMl90IGRlbm9taW5hdG9yLCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEV4aWZFbnRyeT4gZW50cnkgPSBhZGRFbnRyeShpZmQsIHRhZyk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyAnJXMnIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXywgbXNnLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGV4aWZfc2V0X3JhdGlvbmFsKGVudHJ5LT5kYXRhLCBFWElGX0JZVEVfT1JERVJfSU5URUwsIHtudW1lcmF0b3IsIGRlbm9taW5hdG9yfSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0U1JhdGlvbmFsKEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZywgaW50MzJfdCBudW1lcmF0b3IsCisgICAgICAgIGludDMyX3QgZGVub21pbmF0b3IsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RXhpZkVudHJ5PiBlbnRyeSA9IGFkZEVudHJ5KGlmZCwgdGFnKTsKKyAgICBpZiAoIWVudHJ5KSB7CisgICAgICAgIEFMT0dFKCIlczogQWRkaW5nICclcycgZW50cnkgZmFpbGVkIiwgX19GVU5DVElPTl9fLCBtc2cuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZXhpZl9zZXRfc3JhdGlvbmFsKGVudHJ5LT5kYXRhLCBFWElGX0JZVEVfT1JERVJfSU5URUwsIHtudW1lcmF0b3IsIGRlbm9taW5hdG9yfSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgRXhpZlV0aWxzSW1wbDo6c2V0U3RyaW5nKEV4aWZJZmQgaWZkLCBFeGlmVGFnIHRhZywgRXhpZkZvcm1hdCBmb3JtYXQsCisgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBidWZmZXIsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtc2cpIHsKKyAgICBzaXplX3QgZW50cnlfc2l6ZSA9IGJ1ZmZlci5sZW5ndGgoKTsKKyAgICAvLyBTaW5jZSB0aGUgZXhpZiBmb3JtYXQgaXMgdW5kZWZpbmVkLCBOVUxMIHRlcm1pbmF0aW9uIGlzIG5vdCBuZWNlc3NhcnkuCisgICAgaWYgKGZvcm1hdCA9PSBFWElGX0ZPUk1BVF9BU0NJSSkgeworICAgICAgICBlbnRyeV9zaXplKys7CisgICAgfQorICAgIHN0ZDo6dW5pcXVlX3B0cjxFeGlmRW50cnk+IGVudHJ5ID0KKyAgICAgICAgICAgIGFkZFZhcmlhYmxlTGVuZ3RoRW50cnkoaWZkLCB0YWcsIGZvcm1hdCwgZW50cnlfc2l6ZSwgZW50cnlfc2l6ZSk7CisgICAgaWYgKCFlbnRyeSkgeworICAgICAgICBBTE9HRSgiJXM6IEFkZGluZyAnJXMnIGVudHJ5IGZhaWxlZCIsIF9fRlVOQ1RJT05fXywgbXNnLmNfc3RyKCkpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIG1lbWNweShlbnRyeS0+ZGF0YSwgYnVmZmVyLmNfc3RyKCksIGVudHJ5X3NpemUpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIEV4aWZVdGlsc0ltcGw6OmRlc3Ryb3lBcHAxKCkgeworICAgIC8qCisgICAgICogU2luY2UgdGhlcmUgaXMgbm8gQVBJIHRvIGFjY2VzcyBFeGlmTWVtIGluIEV4aWZEYXRhLT5wcml2LCB3ZSB1c2UgZnJlZQorICAgICAqIGhlcmUsIHdoaWNoIGlzIHRoZSBkZWZhdWx0IGZyZWUgZnVuY3Rpb24gaW4gbGliZXhpZi4gU2VlCisgICAgICogZXhpZl9kYXRhX3NhdmVfZGF0YSgpIGZvciBkZXRhaWwuCisgICAgICovCisgICAgZnJlZShhcHAxX2J1ZmZlcl8pOworICAgIGFwcDFfYnVmZmVyXyA9IG51bGxwdHI7CisgICAgYXBwMV9sZW5ndGhfID0gMDsKK30KKworYm9vbCBFeGlmVXRpbHNJbXBsOjpzZXRGcm9tTWV0YWRhdGEoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAorICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgc3RhdGljSW5mbywKKyAgICAgICAgY29uc3Qgc2l6ZV90IGltYWdlV2lkdGgsIGNvbnN0IHNpemVfdCBpbWFnZUhlaWdodCkgeworICAgIGlmICghc2V0SW1hZ2VXaWR0aChpbWFnZVdpZHRoKSB8fAorICAgICAgICAgICAgIXNldEltYWdlSGVpZ2h0KGltYWdlSGVpZ2h0KSkgeworICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgaW1hZ2UgcmVzb2x1dGlvbiBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0cnVjdCB0aW1lc3BlYyB0cDsKKyAgICBzdHJ1Y3QgdG0gdGltZV9pbmZvOworICAgIGJvb2wgdGltZV9hdmFpbGFibGUgPSBjbG9ja19nZXR0aW1lKENMT0NLX1JFQUxUSU1FLCAmdHApICE9IC0xOworICAgIGxvY2FsdGltZV9yKCZ0cC50dl9zZWMsICZ0aW1lX2luZm8pOworICAgIGlmICghc2V0RGF0ZVRpbWUodGltZV9pbmZvKSkgeworICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZGF0YSB0aW1lIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgZmxvYXQgZm9jYWxfbGVuZ3RoOworICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9MRU5TX0ZPQ0FMX0xFTkdUSCk7CisgICAgaWYgKGVudHJ5LmNvdW50KSB7CisgICAgICAgIGZvY2FsX2xlbmd0aCA9IGVudHJ5LmRhdGEuZlswXTsKKworICAgICAgICBpZiAoIXNldEZvY2FsTGVuZ3RoKGZvY2FsX2xlbmd0aCkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBmb2NhbCBsZW5ndGggZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgc2Vuc29yU2l6ZUVudHJ5ID0KKyAgICAgICAgICAgICAgICBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9TRU5TT1JfSU5GT19QSFlTSUNBTF9TSVpFKTsKKyAgICAgICAgaWYgKHNlbnNvclNpemVFbnRyeS5jb3VudCA9PSAyKSB7CisgICAgICAgICAgICBpZiAoIXNldEZvY2FsTGVuZ3RoSW4zNW1tRmlsbSgKKyAgICAgICAgICAgICAgICAgICAgZm9jYWxfbGVuZ3RoLCBzZW5zb3JTaXplRW50cnkuZGF0YS5mWzBdLCBzZW5zb3JTaXplRW50cnkuZGF0YS5mWzFdKSkgeworICAgICAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBmb2NhbCBsZW5ndGggaW4gMzVtbSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiJXM6IENhbm5vdCBmaW5kIGZvY2FsIGxlbmd0aCBpbiBtZXRhZGF0YS4iLCBfX0ZVTkNUSU9OX18pOworICAgIH0KKworICAgIGlmIChtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9TQ0FMRVJfQ1JPUF9SRUdJT04pICYmCisgICAgICAgICAgICBzdGF0aWNJbmZvLmV4aXN0cyhBTkRST0lEX1NFTlNPUl9JTkZPX0FDVElWRV9BUlJBWV9TSVpFKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9TQ0FMRVJfQ1JPUF9SRUdJT04pOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgYWN0aXZlQXJyYXlFbnRyeSA9CisgICAgICAgICAgICAgICAgc3RhdGljSW5mby5maW5kKEFORFJPSURfU0VOU09SX0lORk9fQUNUSVZFX0FSUkFZX1NJWkUpOworCisgICAgICAgIGlmICghc2V0RGlnaXRhbFpvb21SYXRpbyhlbnRyeS5kYXRhLmkzMlsyXSwgZW50cnkuZGF0YS5pMzJbM10sCisgICAgICAgICAgICAgICAgYWN0aXZlQXJyYXlFbnRyeS5kYXRhLmkzMlsyXSwgYWN0aXZlQXJyYXlFbnRyeS5kYXRhLmkzMlszXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBkaWdpdGFsIHpvb20gcmF0aW8gZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0YWRhdGEuZXhpc3RzKEFORFJPSURfSlBFR19HUFNfQ09PUkRJTkFURVMpKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0pQRUdfR1BTX0NPT1JESU5BVEVTKTsKKyAgICAgICAgaWYgKGVudHJ5LmNvdW50IDwgMykgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBHcHMgY29vcmRpbmF0ZXMgaW4gbWV0YWRhdGEgaXMgbm90IGNvbXBsZXRlLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzZXRHcHNMYXRpdHVkZShlbnRyeS5kYXRhLmRbMF0pKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZ3BzIGxhdGl0dWRlIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghc2V0R3BzTG9uZ2l0dWRlKGVudHJ5LmRhdGEuZFsxXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBncHMgbG9uZ2l0dWRlIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghc2V0R3BzQWx0aXR1ZGUoZW50cnkuZGF0YS5kWzJdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGdwcyBhbHRpdHVkZSBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9KUEVHX0dQU19QUk9DRVNTSU5HX01FVEhPRCkpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfSlBFR19HUFNfUFJPQ0VTU0lOR19NRVRIT0QpOworICAgICAgICBzdGQ6OnN0cmluZyBtZXRob2Rfc3RyKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGVudHJ5LmRhdGEudTgpKTsKKyAgICAgICAgaWYgKCFzZXRHcHNQcm9jZXNzaW5nTWV0aG9kKG1ldGhvZF9zdHIpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZ3BzIHByb2Nlc3NpbmcgbWV0aG9kIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKHRpbWVfYXZhaWxhYmxlICYmIG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX0pQRUdfR1BTX1RJTUVTVEFNUCkpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfSlBFR19HUFNfVElNRVNUQU1QKTsKKyAgICAgICAgdGltZV90IHRpbWVzdGFtcCA9IHN0YXRpY19jYXN0PHRpbWVfdD4oZW50cnkuZGF0YS5pNjRbMF0pOworICAgICAgICBpZiAoZ210aW1lX3IoJnRpbWVzdGFtcCwgJnRpbWVfaW5mbykpIHsKKyAgICAgICAgICAgIGlmICghc2V0R3BzVGltZXN0YW1wKHRpbWVfaW5mbykpIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZ3BzIHRpbWVzdGFtcCBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IFRpbWUgdHJhbmZvcm1hdGlvbiBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChzdGF0aWNJbmZvLmV4aXN0cyhBTkRST0lEX0NPTlRST0xfQUVfQ09NUEVOU0FUSU9OX1NURVApICYmCisgICAgICAgICAgICBtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9DT05UUk9MX0FFX0VYUE9TVVJFX0NPTVBFTlNBVElPTikpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfQ09OVFJPTF9BRV9FWFBPU1VSRV9DT01QRU5TQVRJT04pOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgc3RlcEVudHJ5ID0KKyAgICAgICAgICAgICAgICBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FFX0NPTVBFTlNBVElPTl9TVEVQKTsKKyAgICAgICAgaWYgKCFzZXRFeHBvc3VyZUJpYXMoZW50cnkuZGF0YS5pMzJbMF0sIHN0ZXBFbnRyeS5kYXRhLnJbMF0ubnVtZXJhdG9yLAorICAgICAgICAgICAgICAgIHN0ZXBFbnRyeS5kYXRhLnJbMF0uZGVub21pbmF0b3IpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgZXhwb3N1cmUgYmlhcyBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9KUEVHX09SSUVOVEFUSU9OKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9KUEVHX09SSUVOVEFUSU9OKTsKKyAgICAgICAgaWYgKCFzZXRPcmllbnRhdGlvbihlbnRyeS5kYXRhLmkzMlswXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBvcmllbnRhdGlvbiBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9TRU5TT1JfRVhQT1NVUkVfVElNRSkpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX0VYUE9TVVJFX1RJTUUpOworICAgICAgICBmbG9hdCBleHBvc3VyZV90aW1lID0gMS4wZiAqIGVudHJ5LmRhdGEuaTY0WzBdIC8gMWU5OworICAgICAgICBpZiAoIXNldEV4cG9zdXJlVGltZShleHBvc3VyZV90aW1lKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGV4cG9zdXJlIHRpbWUgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXNldFNodXR0ZXJTcGVlZChleHBvc3VyZV90aW1lKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIHNodXR0ZXIgc3BlZWQgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAobWV0YWRhdGEuZXhpc3RzKEFORFJPSURfTEVOU19GT0NVU19ESVNUQU5DRSkpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfTEVOU19GT0NVU19ESVNUQU5DRSk7CisgICAgICAgIGlmICghc2V0U3ViamVjdERpc3RhbmNlKGVudHJ5LmRhdGEuZlswXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBzdWJqZWN0IGRpc3RhbmNlIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX1NFTlNPUl9TRU5TSVRJVklUWSkpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfU0VOU09SX1NFTlNJVElWSVRZKTsKKyAgICAgICAgaW50MzJfdCBpc28gPSBlbnRyeS5kYXRhLmkzMlswXTsKKyAgICAgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IHBvc3RSYXdTZW5zRW50cnkgPQorICAgICAgICAgICAgICAgIG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9DT05UUk9MX1BPU1RfUkFXX1NFTlNJVElWSVRZX0JPT1NUKTsKKyAgICAgICAgaWYgKHBvc3RSYXdTZW5zRW50cnkuY291bnQgPiAwKSB7CisgICAgICAgICAgICBpc28gPSBpc28gKiBwb3N0UmF3U2Vuc0VudHJ5LmRhdGEuaTMyWzBdIC8gMTAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFzZXRJc29TcGVlZFJhdGluZyhzdGF0aWNfY2FzdDx1aW50MTZfdD4oaXNvKSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBpc28gcmF0aW5nIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX0xFTlNfQVBFUlRVUkUpKSB7CisgICAgICAgIGVudHJ5ID0gbWV0YWRhdGEuZmluZChBTkRST0lEX0xFTlNfQVBFUlRVUkUpOworICAgICAgICBpZiAoIXNldEZOdW1iZXIoZW50cnkuZGF0YS5mWzBdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIEYgbnVtYmVyIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGlmICghc2V0QXBlcnR1cmUoZW50cnkuZGF0YS5mWzBdKSkgeworICAgICAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGFwZXJ0dXJlIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIGNvbnN0IHVpbnQxNl90IGtTUkdCQ29sb3JTcGFjZSA9IDE7CisgICAgaWYgKCFzZXRDb2xvclNwYWNlKGtTUkdCQ29sb3JTcGFjZSkpIHsKKyAgICAgICAgQUxPR0UoIiVzOiBzZXR0aW5nIGNvbG9yIHNwYWNlIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHN0YXRpY0luZm8uZXhpc3RzKEFORFJPSURfTEVOU19JTkZPX0FWQUlMQUJMRV9BUEVSVFVSRVMpKSB7CisgICAgICAgIGVudHJ5ID0gc3RhdGljSW5mby5maW5kKEFORFJPSURfTEVOU19JTkZPX0FWQUlMQUJMRV9BUEVSVFVSRVMpOworICAgICAgICBpZiAoIXNldE1heEFwZXJ0dXJlKGVudHJ5LmRhdGEuZlswXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBtYXggYXBlcnR1cmUgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoc3RhdGljSW5mby5leGlzdHMoQU5EUk9JRF9GTEFTSF9JTkZPX0FWQUlMQUJMRSkpIHsKKyAgICAgICAgZW50cnkgPSBzdGF0aWNJbmZvLmZpbmQoQU5EUk9JRF9GTEFTSF9JTkZPX0FWQUlMQUJMRSk7CisgICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBmbGFzaFN0YXRlRW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfRkxBU0hfU1RBVEUpOworICAgICAgICBjYW1lcmFfbWV0YWRhdGFfcm9fZW50cnkgYWVNb2RlRW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfQ09OVFJPTF9BRV9NT0RFKTsKKyAgICAgICAgdWludDhfdCBmbGFzaFN0YXRlID0gZmxhc2hTdGF0ZUVudHJ5LmNvdW50ID4gMCA/CisgICAgICAgICAgICAgICAgZmxhc2hTdGF0ZUVudHJ5LmRhdGEudThbMF0gOiBBTkRST0lEX0ZMQVNIX1NUQVRFX1VOQVZBSUxBQkxFOworICAgICAgICB1aW50OF90IGFlTW9kZSA9IGFlTW9kZUVudHJ5LmNvdW50ID4gMCA/CisgICAgICAgICAgICAgICAgYWVNb2RlRW50cnkuZGF0YS51OFswXSA6IEFORFJPSURfQ09OVFJPTF9BRV9NT0RFX09GRjsKKworICAgICAgICBpZiAoIXNldEZsYXNoKGVudHJ5LmRhdGEudThbMF0sIGZsYXNoU3RhdGUsIGFlTW9kZSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBmbGFzaCBmYWlsZWQuIiwgX19GVU5DVElPTl9fKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChtZXRhZGF0YS5leGlzdHMoQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFKSkgeworICAgICAgICBlbnRyeSA9IG1ldGFkYXRhLmZpbmQoQU5EUk9JRF9DT05UUk9MX0FXQl9NT0RFKTsKKyAgICAgICAgaWYgKCFzZXRXaGl0ZUJhbGFuY2UoZW50cnkuZGF0YS51OFswXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyB3aGl0ZSBiYWxhbmNlIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1ldGFkYXRhLmV4aXN0cyhBTkRST0lEX0NPTlRST0xfQUVfTU9ERSkpIHsKKyAgICAgICAgZW50cnkgPSBtZXRhZGF0YS5maW5kKEFORFJPSURfQ09OVFJPTF9BRV9NT0RFKTsKKyAgICAgICAgaWYgKCFzZXRFeHBvc3VyZU1vZGUoZW50cnkuZGF0YS51OFswXSkpIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogc2V0dGluZyBleHBvc3VyZSBtb2RlIGZhaWxlZC4iLCBfX0ZVTkNUSU9OX18pOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGlmICh0aW1lX2F2YWlsYWJsZSkgeworICAgICAgICBjaGFyIHN0cls0XTsKKyAgICAgICAgaWYgKHNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICIlMDNsZCIsIHRwLnR2X25zZWMgLyAxMDAwMDAwKSA8IDApIHsKKyAgICAgICAgICAgIEFMT0dFKCIlczogU3Vic2VjIGlzIGludmFsaWQ6ICVsZCIsIF9fRlVOQ1RJT05fXywgdHAudHZfbnNlYyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFzZXRTdWJzZWNUaW1lKHN0ZDo6c3RyaW5nKHN0cikpKSB7CisgICAgICAgICAgICBBTE9HRSgiJXM6IHNldHRpbmcgc3Vic2VjIHRpbWUgZmFpbGVkLiIsIF9fRlVOQ1RJT05fXyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworfSAvLyBuYW1lc3BhY2UgY2FtZXJhMworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvRXhpZlV0aWxzLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9FeGlmVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMWQwMjA1Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvRXhpZlV0aWxzLmgKQEAgLTAsMCArMSwyMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIEFORFJPSURfU0VSVkVSU19DQU1FUkFfRVhJRl9VVElMU19ICisjZGVmaW5lIEFORFJPSURfU0VSVkVSU19DQU1FUkFfRVhJRl9VVElMU19ICisKKyNpbmNsdWRlICJDYW1lcmFNZXRhZGF0YS5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CituYW1lc3BhY2UgY2FtZXJhMyB7CisKKy8qCisgKiBPcmllbnRhdGlvbiB2YWx1ZToKKyAqICAxICAgICAgMiAgICAgIDMgICAgICA0ICAgICAgNSAgICAgICAgICA2ICAgICAgICAgIDcgICAgICAgICAgOAorICoKKyAqICA4ODg4ODggODg4ODg4ICAgICA4OCA4OCAgICAgODg4ODg4ODg4OCA4OCAgICAgICAgICAgICAgICAgODggODg4ODg4ODg4OAorICogIDg4ICAgICAgICAgODggICAgIDg4IDg4ICAgICA4OCAgODggICAgIDg4ICA4OCAgICAgICAgIDg4ICA4OCAgICAgODggIDg4CisgKiAgODg4OCAgICAgODg4OCAgIDg4ODggODg4OCAgIDg4ICAgICAgICAgODg4ODg4ODg4OCA4ODg4ODg4ODg4ICAgICAgICAgODgKKyAqICA4OCAgICAgICAgIDg4ICAgICA4OCA4OAorICogIDg4ICAgICAgICAgODggODg4ODg4IDg4ODg4OAorICovCitlbnVtIEV4aWZPcmllbnRhdGlvbiA6IHVpbnQxNl90IHsKKyAgICBPUklFTlRBVElPTl9VTkRFRklORUQgICA9IDB4MCwKKyAgICBPUklFTlRBVElPTl8wX0RFR1JFRVMgICA9IDB4MSwKKyAgICBPUklFTlRBVElPTl85MF9ERUdSRUVTICA9IDB4NiwKKyAgICBPUklFTlRBVElPTl8xODBfREVHUkVFUyA9IDB4MywKKyAgICBPUklFTlRBVElPTl8yNzBfREVHUkVFUyA9IDB4OCwKK307CisKKy8vIFRoaXMgaXMgYmFzZWQgb24gdGhlIGNhbWVyYSBISURMIHNoaW0gaW1wbGVtZW50YXRpb24sIHdoaWNoIHdhcyBpbiB0dXJuZWQKKy8vIGJhc2VkIG9uIG9yaWdpbmFsIENocm9tZU9TIEFSQyBpbXBsZW1lbnRhdGlvbiBvZiBhIFY0TDIgSEFMCisKKy8vIEV4aWZVdGlscyBjYW4gb3ZlcnJpZGUgQVBQMSBzZWdtZW50IHdpdGggdGFncyB3aGljaCBjYWxsZXIgc2V0LiBFeGlmVXRpbHMgY2FuCisvLyBhbHNvIGFkZCBhIHRodW1ibmFpbCBpbiB0aGUgQVBQMSBzZWdtZW50IGlmIHRodW1ibmFpbCBzaXplIGlzIHNwZWNpZmllZC4KKy8vIEV4aWZVdGlscyBjYW4gYmUgcmV1c2VkIHdpdGggZGlmZmVyZW50IGltYWdlcyBieSBjYWxsaW5nIGluaXRpYWxpemUoKS4KKy8vCisvLyBFeGFtcGxlIG9mIHVzaW5nIHRoaXMgY2xhc3MgOgorLy8gIHN0ZDo6dW5pcXVlX3B0cjxFeGlmVXRpbHM+IHV0aWxzKEV4aWZVdGlsczo6Q3JlYXRlKCkpOworLy8gIHV0aWxzLT5pbml0aWFsaXplKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGFwcDFTZWdtZW50LCBzaXplX3QgYXBwMVNlZ21lbnRTaXplKTsKKy8vICAuLi4KKy8vICAvLyBDYWxsIEV4aWZVdGlscyBmdW5jdGlvbnMgdG8gc2V0IEV4aWYgdGFncy4KKy8vICAuLi4KKy8vICB1dGlscy0+R2VuZXJhdGVBcHAxKCk7CisvLyAgdW5zaWduZWQgaW50IGFwcDFMZW5ndGggPSB1dGlscy0+R2V0QXBwMUxlbmd0aCgpOworLy8gIHVpbnQ4X3QqIGFwcDFCdWZmZXIgPSBuZXcgdWludDhfdFthcHAxTGVuZ3RoXTsKKy8vICBtZW1jcHkoYXBwMUJ1ZmZlciwgdXRpbHMtPkdldEFwcDFCdWZmZXIoKSwgYXBwMUxlbmd0aCk7CitjbGFzcyBFeGlmVXRpbHMgeworCitwdWJsaWM6CisgICAgdmlydHVhbCB+RXhpZlV0aWxzKCk7CisKKyAgICBzdGF0aWMgRXhpZlV0aWxzKiBjcmVhdGUoKTsKKworICAgIC8vIEluaXRpYWxpemUoKSBjYW4gYmUgY2FsbGVkIG11bHRpcGxlIHRpbWVzLiBUaGUgc2V0dGluZyBvZiBFeGlmIHRhZ3Mgd2lsbCBiZQorICAgIC8vIGNsZWFyZWQuCisgICAgdmlydHVhbCBib29sIGluaXRpYWxpemUoY29uc3QgdW5zaWduZWQgY2hhciAqYXBwMVNlZ21lbnQsIHNpemVfdCBhcHAxU2VnbWVudFNpemUpID0gMDsKKyAgICB2aXJ0dWFsIGJvb2wgaW5pdGlhbGl6ZUVtcHR5KCkgPSAwOworCisgICAgLy8gU2V0IGFsbCBrbm93biBmaWVsZHMgZnJvbSBhIG1ldGFkYXRhIHN0cnVjdHVyZQorICAgIHZpcnR1YWwgYm9vbCBzZXRGcm9tTWV0YWRhdGEoY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIHN0YXRpY0luZm8sCisgICAgICAgICAgICBjb25zdCBzaXplX3QgaW1hZ2VXaWR0aCwgY29uc3Qgc2l6ZV90IGltYWdlSGVpZ2h0KSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBsZW4gYXBlcnR1cmUuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0QXBlcnR1cmUoZmxvYXQgYXBlcnR1cmUpID0gMDsKKworICAgIC8vIHNldHMgdGhlIGNvbG9yIHNwYWNlLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldENvbG9yU3BhY2UodWludDE2X3QgY29sb3Jfc3BhY2UpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGRhdGUgYW5kIHRpbWUgb2YgaW1hZ2UgbGFzdCBtb2RpZmllZC4gSXQgdGFrZXMgbG9jYWwgdGltZS4gVGhlCisgICAgLy8gbmFtZSBvZiB0aGUgdGFnIGlzIERhdGVUaW1lIGluIElGRDAuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RGF0ZVRpbWUoY29uc3Qgc3RydWN0IHRtJiB0KSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBkaWdpdGFsIHpvb20gcmF0aW8uIElmIHRoZSBudW1lcmF0b3IgaXMgMCwgaXQgbWVhbnMgZGlnaXRhbCB6b29tCisgICAgLy8gd2FzIG5vdCB1c2VkLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldERpZ2l0YWxab29tUmF0aW8odWludDMyX3QgY3JvcF93aWR0aCwgdWludDMyX3QgY3JvcF9oZWlnaHQsCisgICAgICAgICAgICB1aW50MzJfdCBzZW5zb3Jfd2lkdGgsIHVpbnQzMl90IHNlbnNvcl9oZWlnaHQpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGV4cG9zdXJlIGJpYXMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RXhwb3N1cmVCaWFzKGludDMyX3QgZXYsCisgICAgICAgICAgICB1aW50MzJfdCBldl9zdGVwX251bWVyYXRvciwgdWludDMyX3QgZXZfc3RlcF9kZW5vbWluYXRvcikgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZXhwb3N1cmUgbW9kZSBzZXQgd2hlbiB0aGUgaW1hZ2Ugd2FzIHNob3QuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0RXhwb3N1cmVNb2RlKHVpbnQ4X3QgZXhwb3N1cmVfbW9kZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgZXhwb3N1cmUgdGltZSwgZ2l2ZW4gaW4gc2Vjb25kcy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRFeHBvc3VyZVRpbWUoZmxvYXQgZXhwb3N1cmVfdGltZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgc3RhdHVzIG9mIGZsYXNoLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEZsYXNoKHVpbnQ4X3QgZmxhc2hfYXZhaWxhYmxlLCB1aW50OF90IGZsYXNoX3N0YXRlLCB1aW50OF90IGFlX21vZGUpID0gMDsKKworICAgIC8vIFNldHMgdGhlIEYgbnVtYmVyLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEZOdW1iZXIoZmxvYXQgZl9udW1iZXIpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGZvY2FsIGxlbmd0aCBvZiBsZW5zIHVzZWQgdG8gdGFrZSB0aGUgaW1hZ2UgaW4gbWlsbGltZXRlcnMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Rm9jYWxMZW5ndGgoZmxvYXQgZm9jYWxfbGVuZ3RoKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBmb2NhbCBsZW5ndGggb2YgbGVucyBmb3IgMzVtbSBmaWxtIHVzZWQgdG8gdGFrZSB0aGUgaW1hZ2UgaW4gbWlsbGltZXRlcnMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0Rm9jYWxMZW5ndGhJbjM1bW1GaWxtKGZsb2F0IGZvY2FsX2xlbmd0aCwKKyAgICAgICAgICAgIGZsb2F0IHNlbnNvcl9zaXplX3gsIGZsb2F0IHNlbnNvcl9zaXplX3kpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGFsdGl0dWRlIGluIG1ldGVycy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRHcHNBbHRpdHVkZShkb3VibGUgYWx0aXR1ZGUpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGxhdGl0dWRlIHdpdGggZGVncmVlcyBtaW51dGVzIHNlY29uZHMgZm9ybWF0LgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc0xhdGl0dWRlKGRvdWJsZSBsYXRpdHVkZSkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgbG9uZ2l0dWRlIHdpdGggZGVncmVlcyBtaW51dGVzIHNlY29uZHMgZm9ybWF0LgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc0xvbmdpdHVkZShkb3VibGUgbG9uZ2l0dWRlKSA9IDA7CisKKyAgICAvLyBTZXRzIEdQUyBwcm9jZXNzaW5nIG1ldGhvZC4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRHcHNQcm9jZXNzaW5nTWV0aG9kKGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXRob2QpID0gMDsKKworICAgIC8vIFNldHMgR1BTIGRhdGUgc3RhbXAgYW5kIHRpbWUgc3RhbXAgKGF0b21pYyBjbG9jaykuIEl0IHRha2VzIFVUQyB0aW1lLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldEdwc1RpbWVzdGFtcChjb25zdCBzdHJ1Y3QgdG0mIHQpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGhlaWdodCAobnVtYmVyIG9mIHJvd3MpIG9mIG1haW4gaW1hZ2UuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0SW1hZ2VIZWlnaHQodWludDMyX3QgbGVuZ3RoKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSB3aWR0aCAobnVtYmVyIG9mIGNvbHVtbnMpIG9mIG1haW4gaW1hZ2UuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0SW1hZ2VXaWR0aCh1aW50MzJfdCB3aWR0aCkgPSAwOworCisgICAgLy8gU2V0cyB0aGUgSVNPIHNwZWVkLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldElzb1NwZWVkUmF0aW5nKHVpbnQxNl90IGlzb19zcGVlZF9yYXRpbmdzKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBzbWFsbGVzdCBGIG51bWJlciBvZiB0aGUgbGVucy4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRNYXhBcGVydHVyZShmbG9hdCBhcGVydHVyZSkgPSAwOworCisgICAgLy8gU2V0cyBpbWFnZSBvcmllbnRhdGlvbi4KKyAgICAvLyBSZXR1cm5zIGZhbHNlIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxzLgorICAgIHZpcnR1YWwgYm9vbCBzZXRPcmllbnRhdGlvbih1aW50MTZfdCBkZWdyZWVzKSA9IDA7CisKKyAgICAvLyBTZXRzIGltYWdlIG9yaWVudGF0aW9uLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldE9yaWVudGF0aW9uVmFsdWUoRXhpZk9yaWVudGF0aW9uIG9yaWVudGF0aW9uVmFsdWUpID0gMDsKKworICAgIC8vIFNldHMgdGhlIHNodXR0ZXIgc3BlZWQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0U2h1dHRlclNwZWVkKGZsb2F0IGV4cG9zdXJlX3RpbWUpID0gMDsKKworICAgIC8vIFNldHMgdGhlIGRpc3RhbmNlIHRvIHRoZSBzdWJqZWN0LCBnaXZlbiBpbiBtZXRlcnMuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgc2V0U3ViamVjdERpc3RhbmNlKGZsb2F0IGRpb3B0ZXJzKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSBmcmFjdGlvbnMgb2Ygc2Vjb25kcyBmb3IgdGhlIDxEYXRlVGltZT4gdGFnLgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldFN1YnNlY1RpbWUoY29uc3Qgc3RkOjpzdHJpbmcmIHN1YnNlY190aW1lKSA9IDA7CisKKyAgICAvLyBTZXRzIHRoZSB3aGl0ZSBiYWxhbmNlIG1vZGUgc2V0IHdoZW4gdGhlIGltYWdlIHdhcyBzaG90LgorICAgIC8vIFJldHVybnMgZmFsc2UgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHMuCisgICAgdmlydHVhbCBib29sIHNldFdoaXRlQmFsYW5jZSh1aW50OF90IHdoaXRlX2JsYW5hY2UpID0gMDsKKworICAgIC8vIEdlbmVyYXRlcyBBUFAxIHNlZ21lbnQuCisgICAgLy8gUmV0dXJucyBmYWxzZSBpZiBnZW5lcmF0aW5nIEFQUDEgc2VnbWVudCBmYWlscy4KKyAgICB2aXJ0dWFsIGJvb2wgZ2VuZXJhdGVBcHAxKCkgPSAwOworCisgICAgLy8gR2V0cyBidWZmZXIgb2YgQVBQMSBzZWdtZW50LiBUaGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZCBvbmx5IGFmdGVyIGNhbGxpbmcKKyAgICAvLyBHZW5lcmF0ZUFQUDEoKS4KKyAgICB2aXJ0dWFsIGNvbnN0IHVpbnQ4X3QqIGdldEFwcDFCdWZmZXIoKSA9IDA7CisKKyAgICAvLyBHZXRzIGxlbmd0aCBvZiBBUFAxIHNlZ21lbnQuIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIgY2FsbGluZworICAgIC8vIEdlbmVyYXRlQVBQMSgpLgorICAgIHZpcnR1YWwgdW5zaWduZWQgaW50IGdldEFwcDFMZW5ndGgoKSA9IDA7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjYW1lcmEzCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCisKKyNlbmRpZiAgLy8gQU5EUk9JRF9TRVJWRVJTX0NBTUVSQV9FWElGX1VUSUxTX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL0xhdGVuY3lIaXN0b2dyYW0uY3BwIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvTGF0ZW5jeUhpc3RvZ3JhbS5jcHAKaW5kZXggNTM4YmI2ZS4uZTJiZGM0MyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvTGF0ZW5jeUhpc3RvZ3JhbS5jcHAKKysrIGIvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvTGF0ZW5jeUhpc3RvZ3JhbS5jcHAKQEAgLTQ2LDcgKzQ2LDcgQEAKIH0KIAogdm9pZCBDYW1lcmFMYXRlbmN5SGlzdG9ncmFtOjpyZXNldCgpIHsKLSAgICBtQmlucy5jbGVhcigpOworICAgIG1lbXNldChtQmlucy5kYXRhKCksIDAsIG1CaW5zLnNpemUoKSAqIHNpemVvZihpbnQ2NF90KSk7CiAgICAgbVRvdGFsQ291bnQgPSAwOwogfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmNwcCBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuY3BwCmluZGV4IGMwYTM1M2YuLjQwMzdhNjYgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuY3BwCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuY3BwCkBAIC00OSw3ICs0OSw4IEBACiAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobU1vbml0b3JNdXRleCk7CiAKICAgICAvLyBFeHBhbmQgc2hvcnRoYW5kcwotICAgIGlmIChzc2l6ZV90IGlkeCA9IHRhZ05hbWVzLmZpbmQoIjNhIikgIT0gLTEpIHsKKyAgICBzc2l6ZV90IGlkeCA9IHRhZ05hbWVzLmZpbmQoIjNhIik7CisgICAgaWYgKGlkeCAhPSAtMSkgewogICAgICAgICBzc2l6ZV90IGVuZCA9IHRhZ05hbWVzLmZpbmQoIiwiLCBpZHgpOwogICAgICAgICBjaGFyKiBzdGFydCA9IHRhZ05hbWVzLmxvY2tCdWZmZXIodGFnTmFtZXMuc2l6ZSgpKTsKICAgICAgICAgc3RhcnRbaWR4XSA9ICdcMCc7CkBAIC05OSwxMCArMTAwLDEzIEBACiAgICAgbU1vbml0b3JpbmdFbmFibGVkID0gZmFsc2U7CiAgICAgbUxhc3RNb25pdG9yZWRSZXF1ZXN0VmFsdWVzLmNsZWFyKCk7CiAgICAgbUxhc3RNb25pdG9yZWRSZXN1bHRWYWx1ZXMuY2xlYXIoKTsKKyAgICBtTGFzdE1vbml0b3JlZFBoeXNpY2FsUmVxdWVzdEtleXMuY2xlYXIoKTsKKyAgICBtTGFzdE1vbml0b3JlZFBoeXNpY2FsUmVzdWx0S2V5cy5jbGVhcigpOwogfQogCiB2b2lkIFRhZ01vbml0b3I6Om1vbml0b3JNZXRhZGF0YShldmVudFNvdXJjZSBzb3VyY2UsIGludDY0X3QgZnJhbWVOdW1iZXIsIG5zZWNzX3QgdGltZXN0YW1wLAotICAgICAgICBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEpIHsKKyAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhLAorICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiYgcGh5c2ljYWxNZXRhZGF0YSkgewogICAgIGlmICghbU1vbml0b3JpbmdFbmFibGVkKSByZXR1cm47CiAKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTW9uaXRvck11dGV4KTsKQEAgLTExMSw2MiArMTE1LDc3IEBACiAgICAgICAgIHRpbWVzdGFtcCA9IHN5c3RlbVRpbWUoU1lTVEVNX1RJTUVfQk9PVFRJTUUpOwogICAgIH0KIAorICAgIHN0ZDo6c3RyaW5nIGVtcHR5SWQ7CiAgICAgZm9yIChhdXRvIHRhZyA6IG1Nb25pdG9yZWRUYWdMaXN0KSB7Ci0gICAgICAgIGNhbWVyYV9tZXRhZGF0YV9yb19lbnRyeSBlbnRyeSA9IG1ldGFkYXRhLmZpbmQodGFnKTsKLSAgICAgICAgQ2FtZXJhTWV0YWRhdGEgJmxhc3RWYWx1ZXMgPSAoc291cmNlID09IFJFUVVFU1QpID8KLSAgICAgICAgICAgICAgICBtTGFzdE1vbml0b3JlZFJlcXVlc3RWYWx1ZXMgOiBtTGFzdE1vbml0b3JlZFJlc3VsdFZhbHVlczsKLSAgICAgICAgaWYgKGxhc3RWYWx1ZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICBsYXN0VmFsdWVzID0gQ2FtZXJhTWV0YWRhdGEobU1vbml0b3JlZFRhZ0xpc3Quc2l6ZSgpKTsKLSAgICAgICAgICAgIGNvbnN0IGNhbWVyYV9tZXRhZGF0YV90ICptZXRhQnVmZmVyID0KLSAgICAgICAgICAgICAgICAgICAgbGFzdFZhbHVlcy5nZXRBbmRMb2NrKCk7Ci0gICAgICAgICAgICBzZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl9pZCgKLSAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxjYW1lcmFfbWV0YWRhdGFfdCAqPiAobWV0YUJ1ZmZlciksIG1WZW5kb3JUYWdJZCk7Ci0gICAgICAgICAgICBsYXN0VmFsdWVzLnVubG9jayhtZXRhQnVmZmVyKTsKKyAgICAgICAgbW9uaXRvclNpbmdsZU1ldGFkYXRhKHNvdXJjZSwgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCwgZW1wdHlJZCwgdGFnLCBtZXRhZGF0YSk7CisKKyAgICAgICAgZm9yIChhdXRvJiBtIDogcGh5c2ljYWxNZXRhZGF0YSkgeworICAgICAgICAgICAgbW9uaXRvclNpbmdsZU1ldGFkYXRhKHNvdXJjZSwgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCwgbS5maXJzdCwgdGFnLCBtLnNlY29uZCk7CiAgICAgICAgIH0KKyAgICB9Cit9CiAKLSAgICAgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGxhc3RFbnRyeSA9IGxhc3RWYWx1ZXMuZmluZCh0YWcpOwordm9pZCBUYWdNb25pdG9yOjptb25pdG9yU2luZ2xlTWV0YWRhdGEoZXZlbnRTb3VyY2Ugc291cmNlLCBpbnQ2NF90IGZyYW1lTnVtYmVyLCBuc2Vjc190IHRpbWVzdGFtcCwKKyAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkLCB1aW50MzJfdCB0YWcsIGNvbnN0IENhbWVyYU1ldGFkYXRhJiBtZXRhZGF0YSkgewogCi0gICAgICAgIGlmIChlbnRyeS5jb3VudCA+IDApIHsKLSAgICAgICAgICAgIGJvb2wgaXNEaWZmZXJlbnQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChsYXN0RW50cnkuY291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgLy8gSGF2ZSBhIGxhc3QgdmFsdWUsIGNvbXBhcmUgdG8gc2VlIGlmIGNoYW5nZWQKLSAgICAgICAgICAgICAgICBpZiAobGFzdEVudHJ5LnR5cGUgPT0gZW50cnkudHlwZSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEVudHJ5LmNvdW50ID09IGVudHJ5LmNvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNhbWUgdHlwZSBhbmQgY291bnQsIGNvbXBhcmUgdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlc1BlclZhbHVlID0gY2FtZXJhX21ldGFkYXRhX3R5cGVfc2l6ZVtsYXN0RW50cnkudHlwZV07Ci0gICAgICAgICAgICAgICAgICAgIHNpemVfdCBlbnRyeUJ5dGVzID0gYnl0ZXNQZXJWYWx1ZSAqIGxhc3RFbnRyeS5jb3VudDsKLSAgICAgICAgICAgICAgICAgICAgaW50IGNtcCA9IG1lbWNtcChlbnRyeS5kYXRhLnU4LCBsYXN0RW50cnkuZGF0YS51OCwgZW50cnlCeXRlcyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjbXAgIT0gMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgaXNEaWZmZXJlbnQgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ291bnQgb3IgdHlwZSBoYXMgY2hhbmdlZAorICAgIENhbWVyYU1ldGFkYXRhICZsYXN0VmFsdWVzID0gKHNvdXJjZSA9PSBSRVFVRVNUKSA/CisgICAgICAgICAgICAoY2FtZXJhSWQuZW1wdHkoKSA/IG1MYXN0TW9uaXRvcmVkUmVxdWVzdFZhbHVlcyA6CisgICAgICAgICAgICAgICAgICAgIG1MYXN0TW9uaXRvcmVkUGh5c2ljYWxSZXF1ZXN0S2V5c1tjYW1lcmFJZF0pIDoKKyAgICAgICAgICAgIChjYW1lcmFJZC5lbXB0eSgpID8gbUxhc3RNb25pdG9yZWRSZXN1bHRWYWx1ZXMgOgorICAgICAgICAgICAgICAgICAgICBtTGFzdE1vbml0b3JlZFBoeXNpY2FsUmVzdWx0S2V5c1tjYW1lcmFJZF0pOworCisgICAgY2FtZXJhX21ldGFkYXRhX3JvX2VudHJ5IGVudHJ5ID0gbWV0YWRhdGEuZmluZCh0YWcpOworICAgIGlmIChsYXN0VmFsdWVzLmlzRW1wdHkoKSkgeworICAgICAgICBsYXN0VmFsdWVzID0gQ2FtZXJhTWV0YWRhdGEobU1vbml0b3JlZFRhZ0xpc3Quc2l6ZSgpKTsKKyAgICAgICAgY29uc3QgY2FtZXJhX21ldGFkYXRhX3QgKm1ldGFCdWZmZXIgPQorICAgICAgICAgICAgICAgIGxhc3RWYWx1ZXMuZ2V0QW5kTG9jaygpOworICAgICAgICBzZXRfY2FtZXJhX21ldGFkYXRhX3ZlbmRvcl9pZCgKKyAgICAgICAgICAgICAgICBjb25zdF9jYXN0PGNhbWVyYV9tZXRhZGF0YV90ICo+IChtZXRhQnVmZmVyKSwgbVZlbmRvclRhZ0lkKTsKKyAgICAgICAgbGFzdFZhbHVlcy51bmxvY2sobWV0YUJ1ZmZlcik7CisgICAgfQorCisgICAgY2FtZXJhX21ldGFkYXRhX2VudHJ5IGxhc3RFbnRyeSA9IGxhc3RWYWx1ZXMuZmluZCh0YWcpOworCisgICAgaWYgKGVudHJ5LmNvdW50ID4gMCkgeworICAgICAgICBib29sIGlzRGlmZmVyZW50ID0gZmFsc2U7CisgICAgICAgIGlmIChsYXN0RW50cnkuY291bnQgPiAwKSB7CisgICAgICAgICAgICAvLyBIYXZlIGEgbGFzdCB2YWx1ZSwgY29tcGFyZSB0byBzZWUgaWYgY2hhbmdlZAorICAgICAgICAgICAgaWYgKGxhc3RFbnRyeS50eXBlID09IGVudHJ5LnR5cGUgJiYKKyAgICAgICAgICAgICAgICAgICAgbGFzdEVudHJ5LmNvdW50ID09IGVudHJ5LmNvdW50KSB7CisgICAgICAgICAgICAgICAgLy8gU2FtZSB0eXBlIGFuZCBjb3VudCwgY29tcGFyZSB2YWx1ZXMKKyAgICAgICAgICAgICAgICBzaXplX3QgYnl0ZXNQZXJWYWx1ZSA9IGNhbWVyYV9tZXRhZGF0YV90eXBlX3NpemVbbGFzdEVudHJ5LnR5cGVdOworICAgICAgICAgICAgICAgIHNpemVfdCBlbnRyeUJ5dGVzID0gYnl0ZXNQZXJWYWx1ZSAqIGxhc3RFbnRyeS5jb3VudDsKKyAgICAgICAgICAgICAgICBpbnQgY21wID0gbWVtY21wKGVudHJ5LmRhdGEudTgsIGxhc3RFbnRyeS5kYXRhLnU4LCBlbnRyeUJ5dGVzKTsKKyAgICAgICAgICAgICAgICBpZiAoY21wICE9IDApIHsKICAgICAgICAgICAgICAgICAgICAgaXNEaWZmZXJlbnQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gbGFzdCBlbnRyeSwgc28gYWx3YXlzIGNvbnNpZGVyIHRvIGJlIGRpZmZlcmVudAorICAgICAgICAgICAgICAgIC8vIENvdW50IG9yIHR5cGUgaGFzIGNoYW5nZWQKICAgICAgICAgICAgICAgICBpc0RpZmZlcmVudCA9IHRydWU7CiAgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBObyBsYXN0IGVudHJ5LCBzbyBhbHdheXMgY29uc2lkZXIgdG8gYmUgZGlmZmVyZW50CisgICAgICAgICAgICBpc0RpZmZlcmVudCA9IHRydWU7CisgICAgICAgIH0KIAotICAgICAgICAgICAgaWYgKGlzRGlmZmVyZW50KSB7Ci0gICAgICAgICAgICAgICAgQUxPR1YoIiVzOiBUYWcgJXMgY2hhbmdlZCIsIF9fRlVOQ1RJT05fXywKLSAgICAgICAgICAgICAgICAgICAgICBnZXRfbG9jYWxfY2FtZXJhX21ldGFkYXRhX3RhZ19uYW1lX3ZlbmRvcl9pZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZywgbVZlbmRvclRhZ0lkKSk7Ci0gICAgICAgICAgICAgICAgbGFzdFZhbHVlcy51cGRhdGUoZW50cnkpOwotICAgICAgICAgICAgICAgIG1Nb25pdG9yaW5nRXZlbnRzLmVtcGxhY2Uoc291cmNlLCBmcmFtZU51bWJlciwgdGltZXN0YW1wLCBlbnRyeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAobGFzdEVudHJ5LmNvdW50ID4gMCkgewotICAgICAgICAgICAgLy8gVmFsdWUgaGFzIGJlZW4gcmVtb3ZlZAotICAgICAgICAgICAgQUxPR1YoIiVzOiBUYWcgJXMgcmVtb3ZlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgaWYgKGlzRGlmZmVyZW50KSB7CisgICAgICAgICAgICBBTE9HVigiJXM6IFRhZyAlcyBjaGFuZ2VkIiwgX19GVU5DVElPTl9fLAogICAgICAgICAgICAgICAgICAgZ2V0X2xvY2FsX2NhbWVyYV9tZXRhZGF0YV90YWdfbmFtZV92ZW5kb3JfaWQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhZywgbVZlbmRvclRhZ0lkKSk7Ci0gICAgICAgICAgICBsYXN0VmFsdWVzLmVyYXNlKHRhZyk7Ci0gICAgICAgICAgICBlbnRyeS50YWcgPSB0YWc7Ci0gICAgICAgICAgICBlbnRyeS50eXBlID0gZ2V0X2xvY2FsX2NhbWVyYV9tZXRhZGF0YV90YWdfdHlwZV92ZW5kb3JfaWQodGFnLAotICAgICAgICAgICAgICAgICAgICBtVmVuZG9yVGFnSWQpOwotICAgICAgICAgICAgZW50cnkuY291bnQgPSAwOwotICAgICAgICAgICAgbU1vbml0b3JpbmdFdmVudHMuZW1wbGFjZShzb3VyY2UsIGZyYW1lTnVtYmVyLCB0aW1lc3RhbXAsIGVudHJ5KTsKKyAgICAgICAgICAgIGxhc3RWYWx1ZXMudXBkYXRlKGVudHJ5KTsKKyAgICAgICAgICAgIG1Nb25pdG9yaW5nRXZlbnRzLmVtcGxhY2Uoc291cmNlLCBmcmFtZU51bWJlciwgdGltZXN0YW1wLCBlbnRyeSwgY2FtZXJhSWQpOwogICAgICAgICB9CisgICAgfSBlbHNlIGlmIChsYXN0RW50cnkuY291bnQgPiAwKSB7CisgICAgICAgIC8vIFZhbHVlIGhhcyBiZWVuIHJlbW92ZWQKKyAgICAgICAgQUxPR1YoIiVzOiBUYWcgJXMgcmVtb3ZlZCIsIF9fRlVOQ1RJT05fXywKKyAgICAgICAgICAgICAgZ2V0X2xvY2FsX2NhbWVyYV9tZXRhZGF0YV90YWdfbmFtZV92ZW5kb3JfaWQoCisgICAgICAgICAgICAgICAgICAgICAgdGFnLCBtVmVuZG9yVGFnSWQpKTsKKyAgICAgICAgbGFzdFZhbHVlcy5lcmFzZSh0YWcpOworICAgICAgICBlbnRyeS50YWcgPSB0YWc7CisgICAgICAgIGVudHJ5LnR5cGUgPSBnZXRfbG9jYWxfY2FtZXJhX21ldGFkYXRhX3RhZ190eXBlX3ZlbmRvcl9pZCh0YWcsCisgICAgICAgICAgICAgICAgbVZlbmRvclRhZ0lkKTsKKyAgICAgICAgZW50cnkuY291bnQgPSAwOworICAgICAgICBtTW9uaXRvcmluZ0V2ZW50cy5lbXBsYWNlKHNvdXJjZSwgZnJhbWVOdW1iZXIsIHRpbWVzdGFtcCwgZW50cnksIGNhbWVyYUlkKTsKICAgICB9CiB9CiAKQEAgLTE4OSw4ICsyMDgsOSBAQAogICAgICAgICBkcHJpbnRmKGZkLCAiICAgICBNb25pdG9yZWQgdGFnIGV2ZW50IGxvZzpcbiIpOwogICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGV2ZW50IDogbU1vbml0b3JpbmdFdmVudHMpIHsKICAgICAgICAgICAgIGludCBpbmRlbnRhdGlvbiA9IChldmVudC5zb3VyY2UgPT0gUkVRVUVTVCkgPyAxNSA6IDMwOwotICAgICAgICAgICAgZHByaW50ZihmZCwgIiAgICAgICAgZiVkOiUiIFBSSWQ2NCAibnM6ICUqcyVzLiVzOiAiLAorICAgICAgICAgICAgZHByaW50ZihmZCwgIiAgICAgICAgZiVkOiUiIFBSSWQ2NCAibnM6JSpzJSpzJXMuJXM6ICIsCiAgICAgICAgICAgICAgICAgICAgIGV2ZW50LmZyYW1lTnVtYmVyLCBldmVudC50aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgIDIsIGV2ZW50LmNhbWVyYUlkLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgIGluZGVudGF0aW9uLAogICAgICAgICAgICAgICAgICAgICBldmVudC5zb3VyY2UgPT0gUkVRVUVTVCA/ICJSRVE6IiA6ICJSRVM6IiwKICAgICAgICAgICAgICAgICAgICAgZ2V0X2xvY2FsX2NhbWVyYV9tZXRhZGF0YV9zZWN0aW9uX25hbWVfdmVuZG9yX2lkKGV2ZW50LnRhZywKQEAgLTI5NSwxMyArMzE1LDE0IEBACiAKIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CiBUYWdNb25pdG9yOjpNb25pdG9yRXZlbnQ6Ok1vbml0b3JFdmVudChldmVudFNvdXJjZSBzcmMsIHVpbnQzMl90IGZyYW1lTnVtYmVyLCBuc2Vjc190IHRpbWVzdGFtcCwKLSAgICAgICAgY29uc3QgVCAmdmFsdWUpIDoKKyAgICAgICAgY29uc3QgVCAmdmFsdWUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCkgOgogICAgICAgICBzb3VyY2Uoc3JjKSwKICAgICAgICAgZnJhbWVOdW1iZXIoZnJhbWVOdW1iZXIpLAogICAgICAgICB0aW1lc3RhbXAodGltZXN0YW1wKSwKICAgICAgICAgdGFnKHZhbHVlLnRhZyksCiAgICAgICAgIHR5cGUodmFsdWUudHlwZSksCi0gICAgICAgIG5ld0RhdGEodmFsdWUuZGF0YS51OCwgdmFsdWUuZGF0YS51OCArIGNhbWVyYV9tZXRhZGF0YV90eXBlX3NpemVbdmFsdWUudHlwZV0gKiB2YWx1ZS5jb3VudCkgeworICAgICAgICBuZXdEYXRhKHZhbHVlLmRhdGEudTgsIHZhbHVlLmRhdGEudTggKyBjYW1lcmFfbWV0YWRhdGFfdHlwZV9zaXplW3ZhbHVlLnR5cGVdICogdmFsdWUuY291bnQpLAorICAgICAgICBjYW1lcmFJZChjYW1lcmFJZCkgewogfQogCiBUYWdNb25pdG9yOjpNb25pdG9yRXZlbnQ6On5Nb25pdG9yRXZlbnQoKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmggYi9zZXJ2aWNlcy9jYW1lcmEvbGliY2FtZXJhc2VydmljZS91dGlscy9UYWdNb25pdG9yLmgKaW5kZXggMmRlY2U2Mi4uMWI3YjAzMyAxMDA2NDQKLS0tIGEvc2VydmljZXMvY2FtZXJhL2xpYmNhbWVyYXNlcnZpY2UvdXRpbHMvVGFnTW9uaXRvci5oCisrKyBiL3NlcnZpY2VzL2NhbWVyYS9saWJjYW1lcmFzZXJ2aWNlL3V0aWxzL1RhZ01vbml0b3IuaApAQCAtMjAsNiArMjAsNyBAQAogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxhdG9taWM+CiAjaW5jbHVkZSA8bXV0ZXg+CisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KIAogI2luY2x1ZGUgPHV0aWxzL1JlZkJhc2UuaD4KICNpbmNsdWRlIDx1dGlscy9TdHJpbmc4Lmg+CkBAIC02Miw3ICs2Myw4IEBACiAKICAgICAvLyBTY2FuIHRocm91Z2ggdGhlIG1ldGFkYXRhIGFuZCB1cGRhdGUgdGhlIG1vbml0b3JpbmcgaW5mb3JtYXRpb24KICAgICB2b2lkIG1vbml0b3JNZXRhZGF0YShldmVudFNvdXJjZSBzb3VyY2UsIGludDY0X3QgZnJhbWVOdW1iZXIsCi0gICAgICAgICAgICBuc2Vjc190IHRpbWVzdGFtcCwgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhKTsKKyAgICAgICAgICAgIG5zZWNzX3QgdGltZXN0YW1wLCBjb25zdCBDYW1lcmFNZXRhZGF0YSYgbWV0YWRhdGEsCisgICAgICAgICAgICBjb25zdCBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiYgcGh5c2ljYWxNZXRhZGF0YSk7CiAKICAgICAvLyBEdW1wIGN1cnJlbnQgZXZlbnQgbG9nIHRvIHRoZSBwcm92aWRlZCBmZAogICAgIHZvaWQgZHVtcE1vbml0b3JlZE1ldGFkYXRhKGludCBmZCk7CkBAIC03Miw2ICs3NCwxMCBAQAogICAgIHN0YXRpYyB2b2lkIHByaW50RGF0YShpbnQgZmQsIGNvbnN0IHVpbnQ4X3QgKmRhdGFfcHRyLCB1aW50MzJfdCB0YWcsCiAgICAgICAgICAgICBpbnQgdHlwZSwgaW50IGNvdW50LCBpbnQgaW5kZW50YXRpb24pOwogCisgICAgdm9pZCBtb25pdG9yU2luZ2xlTWV0YWRhdGEoVGFnTW9uaXRvcjo6ZXZlbnRTb3VyY2Ugc291cmNlLCBpbnQ2NF90IGZyYW1lTnVtYmVyLAorICAgICAgICAgICAgbnNlY3NfdCB0aW1lc3RhbXAsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjYW1lcmFJZCwgdWludDMyX3QgdGFnLAorICAgICAgICAgICAgY29uc3QgQ2FtZXJhTWV0YWRhdGEmIG1ldGFkYXRhKTsKKwogICAgIHN0ZDo6YXRvbWljPGJvb2w+IG1Nb25pdG9yaW5nRW5hYmxlZDsKICAgICBzdGQ6Om11dGV4IG1Nb25pdG9yTXV0ZXg7CiAKQEAgLTgyLDYgKzg4LDkgQEAKICAgICBDYW1lcmFNZXRhZGF0YSBtTGFzdE1vbml0b3JlZFJlcXVlc3RWYWx1ZXM7CiAgICAgQ2FtZXJhTWV0YWRhdGEgbUxhc3RNb25pdG9yZWRSZXN1bHRWYWx1ZXM7CiAKKyAgICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpzdHJpbmcsIENhbWVyYU1ldGFkYXRhPiBtTGFzdE1vbml0b3JlZFBoeXNpY2FsUmVxdWVzdEtleXM7CisgICAgc3RkOjp1bm9yZGVyZWRfbWFwPHN0ZDo6c3RyaW5nLCBDYW1lcmFNZXRhZGF0YT4gbUxhc3RNb25pdG9yZWRQaHlzaWNhbFJlc3VsdEtleXM7CisKICAgICAvKioKICAgICAgKiBBIG1vbml0b3JpbmcgZXZlbnQKICAgICAgKiBTdG9yZXMgYSBuZXcgbWV0YWRhdGEgZmllbGQgdmFsdWUgYW5kIHRoZSB0aW1lc3RhbXAgYXQgd2hpY2ggaXQgY2hhbmdlZC4KQEAgLTkwLDcgKzk5LDcgQEAKICAgICBzdHJ1Y3QgTW9uaXRvckV2ZW50IHsKICAgICAgICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgICAgICAgTW9uaXRvckV2ZW50KGV2ZW50U291cmNlIHNyYywgdWludDMyX3QgZnJhbWVOdW1iZXIsIG5zZWNzX3QgdGltZXN0YW1wLAotICAgICAgICAgICAgICAgIGNvbnN0IFQgJm5ld1ZhbHVlKTsKKyAgICAgICAgICAgICAgICBjb25zdCBUICZuZXdWYWx1ZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGNhbWVyYUlkKTsKICAgICAgICAgfk1vbml0b3JFdmVudCgpOwogCiAgICAgICAgIGV2ZW50U291cmNlIHNvdXJjZTsKQEAgLTk5LDYgKzEwOCw3IEBACiAgICAgICAgIHVpbnQzMl90IHRhZzsKICAgICAgICAgdWludDhfdCB0eXBlOwogICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBuZXdEYXRhOworICAgICAgICBzdGQ6OnN0cmluZyBjYW1lcmFJZDsKICAgICB9OwogCiAgICAgLy8gQSByaW5nIGJ1ZmZlciBmb3IgdHJhY2tpbmcgdGhlIGxhc3Qga01heE1vbml0b3JFdmVudHMgbWV0YWRhdGEgY2hhbmdlcwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL0FuZHJvaWQuYnAKaW5kZXggYzkzYzEyMC4uYzI3YWNlZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvQW5kcm9pZC5icAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9BbmRyb2lkLmJwCkBAIC03LDggKzcsMjIgQEAKICAgICBzcmNzOiBbCiAgICAgICAgICJtYWluX21lZGlhbWV0cmljcy5jcHAiLAogICAgICAgICAiTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcCIsCisgICAgICAgICJpZmFjZV9zdGF0c2QuY3BwIiwKKyAgICAgICAgInN0YXRzZF9hdWRpb3BvbGljeS5jcHAiLAorICAgICAgICAic3RhdHNkX2F1ZGlvcmVjb3JkLmNwcCIsCisgICAgICAgICJzdGF0c2RfYXVkaW90aHJlYWQuY3BwIiwKKyAgICAgICAgInN0YXRzZF9hdWRpb3RyYWNrLmNwcCIsCisgICAgICAgICJzdGF0c2RfY29kZWMuY3BwIiwKKyAgICAgICAgInN0YXRzZF9kcm0uY3BwIiwKKyAgICAgICAgInN0YXRzZF9leHRyYWN0b3IuY3BwIiwKKyAgICAgICAgInN0YXRzZF9udXBsYXllci5jcHAiLAorICAgICAgICAic3RhdHNkX3JlY29yZGVyLmNwcCIsCiAgICAgXSwKIAorICAgIHByb3RvOiB7CisgICAgICAgIHR5cGU6ICJsaXRlIiwKKyAgICB9LAorCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmN1dGlscyIsCiAgICAgICAgICJsaWJsb2ciLApAQCAtMjEsMTcgKzM1LDIyIEBACiAgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm1lZGlhbWV0cmljcyIsCiAgICAgICAgICJsaWJzdGFnZWZyaWdodF9mb3VuZGF0aW9uIiwKKyAgICAgICAgImxpYnN0YXRzbG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYnByb3RvYnVmLWNwcC1saXRlIiwKICAgICBdLAogCi0gICAgc3RhdGljX2xpYnM6IFsibGlicmVnaXN0ZXJtc2V4dCJdLAorICAgIHN0YXRpY19saWJzOiBbCisgICAgICAgICJsaWJwbGF0Zm9ybXByb3RvcyIsCisgICAgICAgICJsaWJyZWdpc3Rlcm1zZXh0IiwKKyAgICBdLAogCiAgICAgaW5jbHVkZV9kaXJzOiBbCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L21lZGlhL2xpYnN0YWdlZnJpZ2h0L2luY2x1ZGUiLAogICAgICAgICAiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJzdGFnZWZyaWdodC9ydHNwIiwKICAgICAgICAgImZyYW1ld29ya3MvYXYvbWVkaWEvbGlic3RhZ2VmcmlnaHQvd2VibSIsCiAgICAgICAgICJmcmFtZXdvcmtzL2F2L2luY2x1ZGUvbWVkaWEiLAotICAgICAgICAiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlL2NhbWVyYSIsCisgICAgICAgICJmcmFtZXdvcmtzL2F2L2NhbWVyYS9pbmNsdWRlL2NhbWVyYSIsCiAgICAgICAgICJmcmFtZXdvcmtzL25hdGl2ZS9pbmNsdWRlL21lZGlhL29wZW5tYXgiLAogICAgICAgICAiZnJhbWV3b3Jrcy9uYXRpdmUvaW5jbHVkZS9tZWRpYS9oYXJkd2FyZSIsCiAgICAgICAgICJleHRlcm5hbC90cmVtb2xvL1RyZW1vbG8iLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5jcHAKaW5kZXggNGIwNTM5NS4uMGU3ZWRmZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuY3BwCkBAIC0yNiw2ICsyNiw3IEBACiAjaW5jbHVkZSA8c3lzL3N0YXQuaD4KICNpbmNsdWRlIDxzeXMvdGltZS5oPgogI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KIAogI2luY2x1ZGUgPHN0cmluZy5oPgpAQCAtNTAsNyArNTEsNiBAQAogI2luY2x1ZGUgPHV0aWxzL1RpbWVycy5oPgogI2luY2x1ZGUgPHV0aWxzL1ZlY3Rvci5oPgogCi0jaW5jbHVkZSA8bWVkaWEvQXVkaW9Qb2xpY3lIZWxwZXIuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFIVFRQU2VydmljZS5oPgogI2luY2x1ZGUgPG1lZGlhL0lSZW1vdGVEaXNwbGF5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvSVJlbW90ZURpc3BsYXlDbGllbnQuaD4KQEAgLTc2LDE1ICs3NiwyNCBAQAogCiBuYW1lc3BhY2UgYW5kcm9pZCB7CiAKLSAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6YmFzZTsKLSAgICB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDo6Y29udGVudDo6cG07Ci0KIC8vIGluZGl2aWR1YWwgcmVjb3JkcyBrZXB0IGluIG1lbW9yeTogYWdlIG9yIGNvdW50Ci0vLyBhZ2U6IDw9IDM2IGhvdXJzICgxLjUgZGF5cykKKy8vIGFnZTogPD0gMjggaG91cnMgKDEgMS82IGRheXMpCiAvLyBjb3VudDogaGFyZCBsaW1pdCBvZiAjIHJlY29yZHMKIC8vICgwIGZvciBlaXRoZXIgb2YgdGhlc2UgZGlzYWJsZXMgdGhhdCB0aHJlc2hvbGQpCi1zdGF0aWMgY29uc3QgbnNlY3NfdCBrTWF4UmVjb3JkQWdlTnMgPSAgMzYgKiAzNjAwICogKDEwMDAqMTAwMCoxMDAwbGwpOwotc3RhdGljIGNvbnN0IGludCBrTWF4UmVjb3JkcyAgICA9IDA7CisvLworc3RhdGljIGNvbnN0ZXhwciBuc2Vjc190IGtNYXhSZWNvcmRBZ2VOcyA9ICAyOCAqIDM2MDAgKiAoMTAwMCoxMDAwKjEwMDBsbCk7CisvLyAyMDE5LzY6IGF2ZXJhZ2UgZGFpbHkgcGVyIGRldmljZSBpcyBjdXJyZW50bHkgMzc1LWlzaDsKKy8vIHNldHRpbmcgdGhpcyB0byAyMDAwIGlzIGxhcmdlIGVub3VnaCB0byBjYXRjaCBtb3N0IGRldmljZXMKKy8vIHdlJ2xsIGxvc2Ugc29tZSBkYXRhIG9uIHZlcnkgdmVyeSBtZWRpYS1hY3RpdmUgZGV2aWNlcywgYnV0IG9ubHkgZm9yCisvLyB0aGUgZ21zIGNvbGxlY3Rpb247IHN0YXRzZCB3aWxsIGhhdmUgYWxyZWFkeSBjb3ZlcmVkIHRob3NlIGZvciB1cy4KKy8vIFRoaXMgYWxzbyByZXRhaW5zIGVub3VnaCBpbmZvcm1hdGlvbiB0byBoZWxwIHdpdGggYnVncmVwb3J0cworc3RhdGljIGNvbnN0ZXhwciBpbnQga01heFJlY29yZHMgICAgPSAyMDAwOworCisvLyBtYXggd2UgZXhwaXJlIGluIGEgc2luZ2xlIGNhbGwsIHRvIGNvbnN0cmFpbiBob3cgbG9uZyB3ZSBob2xkIHRoZQorLy8gbXV0ZXgsIHdoaWNoIGFsc28gY29uc3RyYWlucyBob3cgbG9uZyBhIGNsaWVudCBtaWdodCB3YWl0Lgorc3RhdGljIGNvbnN0ZXhwciBpbnQga01heEV4cGlyZWRBdE9uY2UgPSA1MDsKKworLy8gVE9ETzogbmVlZCB0byBsb29rIGF0IHR1bmluZyBrTWF4UmVjb3JkcyBhbmQgZnJpZW5kcyBmb3IgbG93LW1lbW9yeSBkZXZpY2VzCiAKIHN0YXRpYyBjb25zdCBjaGFyICprU2VydmljZU5hbWUgPSAibWVkaWEubWV0cmljcyI7CiAKQEAgLTk2LDYgKzEwNSw3IEBACiBNZWRpYUFuYWx5dGljc1NlcnZpY2U6Ok1lZGlhQW5hbHl0aWNzU2VydmljZSgpCiAgICAgICAgIDogbU1heFJlY29yZHMoa01heFJlY29yZHMpLAogICAgICAgICAgIG1NYXhSZWNvcmRBZ2VOcyhrTWF4UmVjb3JkQWdlTnMpLAorICAgICAgICAgIG1NYXhSZWNvcmRzRXhwaXJlZEF0T25jZShrTWF4RXhwaXJlZEF0T25jZSksCiAgICAgICAgICAgbUR1bXBQcm90byhNZWRpYUFuYWx5dGljc0l0ZW06OlBST1RPX1YxKSwKICAgICAgICAgICBtRHVtcFByb3RvRGVmYXVsdChNZWRpYUFuYWx5dGljc0l0ZW06OlBST1RPX1YxKSB7CiAKQEAgLTIwNSwyMSArMjE1LDI0IEBACiAKICAgICAvLyBYWFg6IGlmIHdlIGhhdmUgYSBzZXNzaW9uaWQgaW4gdGhlIG5ldyByZWNvcmQsIGxvb2sgdG8gbWFrZQogICAgIC8vIHN1cmUgaXQgZG9lc24ndCBhcHBlYXIgaW4gdGhlIGZpbmFsaXplZCBsaXN0LgotICAgIC8vIFhYWDogdGhpcyBpcyBmb3Igc2VjdXJpdHkgLyBET1MgcHJldmVudGlvbi4KLSAgICAvLyBtYXkgYWxzbyByZXF1aXJlIHRoYXQgd2UgcGVyc2lzdCB0aGUgdW5pcXVlIHNlc3Npb25JRHMKLSAgICAvLyBhY3Jvc3MgYm9vdHMgW2luc3RlYWQgb2Ygd2l0aGluIGEgc2luZ2xlIGJvb3RdCiAKICAgICBpZiAoaXRlbS0+Y291bnQoKSA9PSAwKSB7Ci0gICAgICAgIC8vIGRyb3AgZW1wdHkgcmVjb3JkcworICAgICAgICBBTE9HVigiZHJvcHBpbmcgZW1wdHkgcmVjb3JkLi4uIik7CiAgICAgICAgIGRlbGV0ZSBpdGVtOwogICAgICAgICBpdGVtID0gTlVMTDsKICAgICAgICAgcmV0dXJuIE1lZGlhQW5hbHl0aWNzSXRlbTo6U2Vzc2lvbklESW52YWxpZDsKICAgICB9CiAKICAgICAvLyBzYXZlIHRoZSBuZXcgcmVjb3JkCisgICAgLy8KKyAgICAvLyBzZW5kIGEgY29weSB0byBzdGF0c2QKKyAgICBkdW1wMlN0YXRzZChpdGVtKTsKKworICAgIC8vIGFuZCBrZWVwIG91ciBjb3B5IGZvciBkdW1wc3lzCiAgICAgTWVkaWFBbmFseXRpY3NJdGVtOjpTZXNzaW9uSURfdCBpZCA9IGl0ZW0tPmdldFNlc3Npb25JRCgpOwogICAgIHNhdmVJdGVtKGl0ZW0pOwogICAgIG1JdGVtc0ZpbmFsaXplZCsrOworCiAgICAgcmV0dXJuIGlkOwogfQogCkBAIC00MzIsMjMgKzQ0NSwyOSBAQAogLy8KIC8vIE91ciBDaGVhcCBpbi1jb3JlLCBub24tcGVyc2lzdGVudCByZWNvcmRzIG1hbmFnZW1lbnQuCiAKLS8vIGluc2VydCBhcHByb3ByaWF0ZWx5IGludG8gcXVldWUKLXZvaWQgTWVkaWFBbmFseXRpY3NTZXJ2aWNlOjpzYXZlSXRlbShNZWRpYUFuYWx5dGljc0l0ZW0gKiBpdGVtKQorCisvLyB3ZSBob2xkIG1Mb2NrIHdoZW4gd2UgZ2V0IGhlcmUKKy8vIGlmIGl0ZW0gIT0gTlVMTCwgaXQncyB0aGUgaXRlbSB3ZSBqdXN0IGluc2VydGVkCisvLyB0cnVlID09IG1vcmUgaXRlbXMgZWxpZ2libGUgdG8gYmUgcmVjb3ZlcmVkCitib29sIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6ZXhwaXJhdGlvbnNfbChNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pCiB7Ci0KLSAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIC8vIG11dGV4IGJldHdlZW4gaW5zZXJ0aW9uIGFuZCBkdW1waW5nIHRoZSBjb250ZW50cwotCi0gICAgLy8gd2Ugd2FudCB0byBkdW1wICdpbiBGSUZPIG9yZGVyJywgc28gaW5zZXJ0IGF0IHRoZSBlbmQKLSAgICBtSXRlbXMucHVzaF9iYWNrKGl0ZW0pOworICAgIGJvb2wgbW9yZSA9IGZhbHNlOworICAgIGludCBoYW5kbGVkID0gMDsKIAogICAgIC8vIGtlZXAgcmVtb3Zpbmcgb2xkIHJlY29yZHMgdGhlIGZyb250IHVudGlsIHdlJ3JlIGluLWJvdW5kcyAoY291bnQpCisgICAgLy8gc2luY2Ugd2UgaW52b2tlIHRoaXMgd2l0aCBlYWNoIGluc2VydGlvbiwgaXQgc2hvdWxkIGJlIDAvMSBpdGVyYXRpb25zLgogICAgIGlmIChtTWF4UmVjb3JkcyA+IDApIHsKICAgICAgICAgd2hpbGUgKG1JdGVtcy5zaXplKCkgPiAoc2l6ZV90KSBtTWF4UmVjb3JkcykgewogICAgICAgICAgICAgTWVkaWFBbmFseXRpY3NJdGVtICogb2l0ZW0gPSAqKG1JdGVtcy5iZWdpbigpKTsKICAgICAgICAgICAgIGlmIChvaXRlbSA9PSBpdGVtKSB7CiAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoaGFuZGxlZCA+PSBtTWF4UmVjb3Jkc0V4cGlyZWRBdE9uY2UpIHsKKyAgICAgICAgICAgICAgICAvLyB1bmxpa2VseSBpbiB0aGlzIGxvb3AKKyAgICAgICAgICAgICAgICBtb3JlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGhhbmRsZWQrKzsKICAgICAgICAgICAgIG1JdGVtcy5lcmFzZShtSXRlbXMuYmVnaW4oKSk7CiAgICAgICAgICAgICBkZWxldGUgb2l0ZW07CiAgICAgICAgICAgICBtSXRlbXNEaXNjYXJkZWQrKzsKQEAgLTQ1Niw4ICs0NzUsOCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8ga2VlcCByZW1vdmluZyBvbGQgcmVjb3JkcyB0aGUgZnJvbnQgdW50aWwgd2UncmUgaW4tYm91bmRzIChjb3VudCkKLSAgICAvLyBOQjogZXhwaXJlZCBlbnRyaWVzIGFyZW4ndCByZW1vdmVkIHVudGlsIHRoZSBuZXh0IGluc2VydGlvbiwgd2hpY2ggY291bGQgYmUgYSB3aGlsZQorICAgIC8vIGtlZXAgcmVtb3Zpbmcgb2xkIHJlY29yZHMgdGhlIGZyb250IHVudGlsIHdlJ3JlIGluLWJvdW5kcyAoYWdlKQorICAgIC8vIGxpbWl0ZWQgdG8gbU1heFJlY29yZHNFeHBpcmVkQXRPbmNlIGl0ZW1zIHBlciBpbnZvY2F0aW9uLgogICAgIGlmIChtTWF4UmVjb3JkQWdlTnMgPiAwKSB7CiAgICAgICAgIG5zZWNzX3Qgbm93ID0gc3lzdGVtVGltZShTWVNURU1fVElNRV9SRUFMVElNRSk7CiAgICAgICAgIHdoaWxlIChtSXRlbXMuc2l6ZSgpID4gMCkgewpAQCAtNDcxLDE4ICs0OTAsNzIgQEAKICAgICAgICAgICAgICAgICAvLyB0aGlzIChhbmQgdGhlIHJlc3QpIGFyZSByZWNlbnQgZW5vdWdoIHRvIGtlZXAKICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChoYW5kbGVkID49IG1NYXhSZWNvcmRzRXhwaXJlZEF0T25jZSkgeworICAgICAgICAgICAgICAgIC8vIHRoaXMgcmVwcmVzZW50cyAib25lIHRvbyBtYW55IjsgdGVsbCBjYWxsZXIgdGhlcmUgYXJlCisgICAgICAgICAgICAgICAgLy8gbW9yZSB0byBiZSByZWNsYWltZWQuCisgICAgICAgICAgICAgICAgbW9yZSA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBoYW5kbGVkKys7CiAgICAgICAgICAgICBtSXRlbXMuZXJhc2UobUl0ZW1zLmJlZ2luKCkpOwogICAgICAgICAgICAgZGVsZXRlIG9pdGVtOwogICAgICAgICAgICAgbUl0ZW1zRGlzY2FyZGVkKys7CiAgICAgICAgICAgICBtSXRlbXNEaXNjYXJkZWRFeHBpcmUrKzsKICAgICAgICAgfQogICAgIH0KKworICAgIC8vIHdlIG9ubHkgaW5kaWNhdGUgd2hldGhlciB0aGVyZSdzIG1vcmUgdG8gY2xlYW47CisgICAgLy8gY2FsbGVyIGNob29zZXMgd2hldGhlciB0byBzY2hlZHVsZSBmdXJ0aGVyIGNsZWFudXAuCisgICAgcmV0dXJuIG1vcmU7Cit9CisKKy8vIHByb2Nlc3MgZXhwaXJhdGlvbnMgaW4gYml0ZSBzaXplZCBjaHVua3MsIGFsbG93aW5nIG5ldyBpbnNlcnRpb25zIHRocm91Z2gKKy8vIHJ1bnMgaW4gYSBwdGhyZWFkIHNwZWNpZmljYWxseSBzdGFydGVkIGZvciB0aGlzICh3aGljaCB0aGVuIGV4aXRzKQorYm9vbCBNZWRpYUFuYWx5dGljc1NlcnZpY2U6OnByb2Nlc3NFeHBpcmF0aW9ucygpCit7CisgICAgYm9vbCBtb3JlOworICAgIGRvIHsKKyAgICAgICAgc2xlZXAoMSk7CisgICAgICAgIHsKKyAgICAgICAgICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgICAgICAgICBtb3JlID0gZXhwaXJhdGlvbnNfbChOVUxMKTsKKyAgICAgICAgICAgIGlmICghbW9yZSkgeworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSB3aGlsZSAobW9yZSk7CisgICAgcmV0dXJuIHRydWU7ICAgICAgICAvLyB2YWx1ZSBpcyBmb3Igc3RkOjpmdXR1cmUgdGhyZWFkIHN5bmNocm9uaXphdGlvbgorfQorCisvLyBpbnNlcnQgYXBwcm9wcmlhdGVseSBpbnRvIHF1ZXVlCit2b2lkIE1lZGlhQW5hbHl0aWNzU2VydmljZTo6c2F2ZUl0ZW0oTWVkaWFBbmFseXRpY3NJdGVtICogaXRlbSkKK3sKKworICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7CisgICAgLy8gbXV0ZXggYmV0d2VlbiBpbnNlcnRpb24gYW5kIGR1bXBpbmcgdGhlIGNvbnRlbnRzCisKKyAgICAvLyB3ZSB3YW50IHRvIGR1bXAgJ2luIEZJRk8gb3JkZXInLCBzbyBpbnNlcnQgYXQgdGhlIGVuZAorICAgIG1JdGVtcy5wdXNoX2JhY2soaXRlbSk7CisKKyAgICAvLyBjbGVhbiBvbGQgc3R1ZmYgZnJvbSB0aGUgcXVldWUKKyAgICBib29sIG1vcmUgPSBleHBpcmF0aW9uc19sKGl0ZW0pOworCisgICAgLy8gY29uc2lkZXIgc2NoZWR1bGluZyBzb21lIGFzeW5jaHJvbm91cyBjbGVhbmluZywgaWYgbm90IHJ1bm5pbmcKKyAgICBpZiAobW9yZSkgeworICAgICAgICBpZiAoIW1FeHBpcmVGdXR1cmUudmFsaWQoKQorICAgICAgICAgICAgfHwgbUV4cGlyZUZ1dHVyZS53YWl0X2ZvcihzdGQ6OmNocm9ubzo6c2Vjb25kcygwKSkgPT0gc3RkOjpmdXR1cmVfc3RhdHVzOjpyZWFkeSkgeworCisgICAgICAgICAgICBtRXhwaXJlRnV0dXJlID0gc3RkOjphc3luYyhzdGQ6OmxhdW5jaDo6YXN5bmMsIFt0aGlzXSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7cmV0dXJuIHRoaXMtPnByb2Nlc3NFeHBpcmF0aW9ucygpO30pOworICAgICAgICB9CisgICAgfQogfQogCiBzdGF0aWMgc3RkOjpzdHJpbmcgYWxsb3dlZEtleXNbXSA9CiB7CiAgICAgImF1ZGlvcG9saWN5IiwKICAgICAiYXVkaW9yZWNvcmQiLAorICAgICJhdWRpb3RocmVhZCIsCiAgICAgImF1ZGlvdHJhY2siLAogICAgICJjb2RlYyIsCiAgICAgImV4dHJhY3RvciIsCkBAIC01ODEsNyArNjU0LDggQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChiaW5kZXIgIT0gTlVMTCkgewotICAgICAgICAgICAgc3A8SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPiBwYWNrYWdlX21nciA9IGludGVyZmFjZV9jYXN0PElQYWNrYWdlTWFuYWdlck5hdGl2ZT4oYmluZGVyKTsKKyAgICAgICAgICAgIHNwPGNvbnRlbnQ6OnBtOjpJUGFja2FnZU1hbmFnZXJOYXRpdmU+IHBhY2thZ2VfbWdyID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxjb250ZW50OjpwbTo6SVBhY2thZ2VNYW5hZ2VyTmF0aXZlPihiaW5kZXIpOwogICAgICAgICAgICAgYmluZGVyOjpTdGF0dXMgc3RhdHVzOwogCiAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxpbnQ+IHVpZHM7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9NZWRpYUFuYWx5dGljc1NlcnZpY2UuaCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCmluZGV4IGIzYzkwMmEuLjZjOWNiYWEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL01lZGlhQW5hbHl0aWNzU2VydmljZS5oCkBAIC0yNiw2ICsyNiw4IEBACiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nOC5oPgogI2luY2x1ZGUgPHV0aWxzL0xpc3QuaD4KIAorI2luY2x1ZGUgPGZ1dHVyZT4KKwogI2luY2x1ZGUgPG1lZGlhL0lNZWRpYUFuYWx5dGljc1NlcnZpY2UuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNDQsNiArNDYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhQW5hbHl0aWNzU2VydmljZSgpOwogICAgIHZpcnR1YWwgICAgICAgICAgICAgICAgIH5NZWRpYUFuYWx5dGljc1NlcnZpY2UoKTsKIAorICAgIGJvb2wgcHJvY2Vzc0V4cGlyYXRpb25zKCk7CisKICBwcml2YXRlOgogICAgIE1lZGlhQW5hbHl0aWNzSXRlbTo6U2Vzc2lvbklEX3QgZ2VuZXJhdGVVbmlxdWVTZXNzaW9uSUQoKTsKIApAQCAtNjUsNiArNjksOCBAQAogICAgIGludDMyX3QgbU1heFJlY29yZHM7CiAgICAgLy8gYnkgdGltZSAobm9uZSBvbGRlciB0aGFuIHRoaXMgbG9uZyBhZ2FuCiAgICAgbnNlY3NfdCBtTWF4UmVjb3JkQWdlTnM7CisgICAgLy8gbWF4IHRvIGV4cGlyZSBwZXIgZXhwaXJhdGlvbnNfbCgpIGludm9jYXRpb24KKyAgICBpbnQzMl90IG1NYXhSZWNvcmRzRXhwaXJlZEF0T25jZTsKICAgICAvLwogICAgIC8vICMgb2Ygc2V0cyBvZiBzdW1tYXJpZXMKICAgICBpbnQzMl90IG1NYXhSZWNvcmRTZXRzOwpAQCAtNzksNiArODUsOSBAQAogICAgIExpc3Q8TWVkaWFBbmFseXRpY3NJdGVtICo+IG1JdGVtczsKICAgICB2b2lkIHNhdmVJdGVtKE1lZGlhQW5hbHl0aWNzSXRlbSAqKTsKIAorICAgIGJvb2wgZXhwaXJhdGlvbnNfbChNZWRpYUFuYWx5dGljc0l0ZW0gKik7CisgICAgc3RkOjpmdXR1cmU8Ym9vbD4gbUV4cGlyZUZ1dHVyZTsKKwogICAgIC8vIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgb3V0cHV0CiAgICAgaW50IG1EdW1wUHJvdG87CiAgICAgaW50IG1EdW1wUHJvdG9EZWZhdWx0OwpAQCAtMTAzLDYgKzExMiw5IEBACiAKIH07CiAKKy8vIGhvb2sgdG8gc2VuZCB0aGluZ3Mgb2ZmIHRvIHRoZSBzdGF0c2Qgc3Vic3lzdGVtCitleHRlcm4gYm9vbCBkdW1wMlN0YXRzZChNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pOworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIH07IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9pZmFjZV9zdGF0c2QuY3BwIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvaWZhY2Vfc3RhdHNkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODQ1ZjA2Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3MvaWZhY2Vfc3RhdHNkLmNwcApAQCAtMCwwICsxLDkyIEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJpZmFjZV9zdGF0c2QiCisjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxwd2QuaD4KKworI2luY2x1ZGUgIk1lZGlhQW5hbHl0aWNzU2VydmljZS5oIgorI2luY2x1ZGUgImlmYWNlX3N0YXRzZC5oIgorCisjaW5jbHVkZSA8c3RhdHNsb2cuaD4KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCisvLyBzZXQgb2Ygcm91dGluZXMgdGhhdCBjcmFjayBhIE1lZGlhQW5hbHl0aWNzSXRlbQorLy8gYW5kIHNlbmQgaXQgb2ZmIHRvIHN0YXRzZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBob29rcworLy8KKy8vIGVhY2ggTWVkaWFBbmFseXRpY3NJdGVtIHR5cGUgKGV4dHJhY3RvciwgY29kZWMsIG51cGxheWVyLCBldGMpCisvLyBoYXMgaXRzIG93biByb3V0aW5lIHRvIGhhbmRsZSB0aGlzLgorLy8KKworYm9vbCBlbmFibGVkX3N0YXRzZCA9IHRydWU7CisKK3N0cnVjdCBzdGF0c2RfaG9va3MgeworICAgIGNvbnN0IGNoYXIgKmtleTsKKyAgICBib29sICgqaGFuZGxlcikoTWVkaWFBbmFseXRpY3NJdGVtICopOworfTsKKworLy8ga2VlcCB0aGlzIHNvcnRlZCwgc28gd2UgY2FuIGRvIGJpbmFyeSBzZWFyY2hlcworc3RydWN0IHN0YXRzZF9ob29rcyAgc3RhdHNkX2hhbmRsZXJzW10gPQoreworICAgIHsgImF1ZGlvcG9saWN5Iiwgc3RhdHNkX2F1ZGlvcG9saWN5IH0sCisgICAgeyAiYXVkaW9yZWNvcmQiLCBzdGF0c2RfYXVkaW9yZWNvcmQgfSwKKyAgICB7ICJhdWRpb3RocmVhZCIsIHN0YXRzZF9hdWRpb3RocmVhZCB9LAorICAgIHsgImF1ZGlvdHJhY2siLCBzdGF0c2RfYXVkaW90cmFjayB9LAorICAgIHsgImNvZGVjIiwgc3RhdHNkX2NvZGVjfSwKKyAgICB7ICJkcm0udmVuZG9yLkdvb2dsZS5XaWRldmluZUNETSIsIHN0YXRzZF93aWRldmluZUNETSB9LAorICAgIHsgImV4dHJhY3RvciIsIHN0YXRzZF9leHRyYWN0b3IgfSwKKyAgICB7ICJtZWRpYWRybSIsIHN0YXRzZF9tZWRpYWRybSB9LAorICAgIHsgIm51cGxheWVyIiwgc3RhdHNkX251cGxheWVyIH0sCisgICAgeyAibnVwbGF5ZXIyIiwgc3RhdHNkX251cGxheWVyIH0sCisgICAgeyAicmVjb3JkZXIiLCBzdGF0c2RfcmVjb3JkZXIgfSwKK307CisKKworLy8gZ2l2ZSBtZSBhIHJlY29yZCwgaSdsbCBsb29rIGF0IHRoZSB0eXBlIGFuZCB1cGxvYWQgYXBwcm9wcmlhdGVseQorYm9vbCBkdW1wMlN0YXRzZChNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pIHsKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBnZXQgdGhlIGtleQorICAgIHN0ZDo6c3RyaW5nIGtleSA9IGl0ZW0tPmdldEtleSgpOworCisgICAgaWYgKCFlbmFibGVkX3N0YXRzZCkgeworICAgICAgICBBTE9HVigic3RhdHNkIGxvZ2dpbmcgZGlzYWJsZWQgZm9yIHJlY29yZCBrZXk9JXMiLCBrZXkuY19zdHIoKSk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpbnQgaTsKKyAgICBmb3IoaSA9IDA7aSA8IHNpemVvZihzdGF0c2RfaGFuZGxlcnMpIC8gc2l6ZW9mKHN0YXRzZF9oYW5kbGVyc1swXSkgOyBpKyspIHsKKyAgICAgICAgaWYgKGtleSA9PSBzdGF0c2RfaGFuZGxlcnNbaV0ua2V5KSB7CisgICAgICAgICAgICByZXR1cm4gKCpzdGF0c2RfaGFuZGxlcnNbaV0uaGFuZGxlcikoaXRlbSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9pZmFjZV9zdGF0c2QuaCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL2lmYWNlX3N0YXRzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4NWQzMDMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9pZmFjZV9zdGF0c2QuaApAQCAtMCwwICsxLDM0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitleHRlcm4gYm9vbCBlbmFibGVkX3N0YXRzZDsKKworLy8gY29tcG9uZW50IHNwZWNpZmljIGR1bXBlcnMKK2V4dGVybiBib29sIHN0YXRzZF9hdWRpb3BvbGljeShNZWRpYUFuYWx5dGljc0l0ZW0gKik7CitleHRlcm4gYm9vbCBzdGF0c2RfYXVkaW9yZWNvcmQoTWVkaWFBbmFseXRpY3NJdGVtICopOworZXh0ZXJuIGJvb2wgc3RhdHNkX2F1ZGlvdGhyZWFkKE1lZGlhQW5hbHl0aWNzSXRlbSAqKTsKK2V4dGVybiBib29sIHN0YXRzZF9hdWRpb3RyYWNrKE1lZGlhQW5hbHl0aWNzSXRlbSAqKTsKK2V4dGVybiBib29sIHN0YXRzZF9jb2RlYyhNZWRpYUFuYWx5dGljc0l0ZW0gKik7CitleHRlcm4gYm9vbCBzdGF0c2RfZXh0cmFjdG9yKE1lZGlhQW5hbHl0aWNzSXRlbSAqKTsKK2V4dGVybiBib29sIHN0YXRzZF9udXBsYXllcihNZWRpYUFuYWx5dGljc0l0ZW0gKik7CitleHRlcm4gYm9vbCBzdGF0c2RfcmVjb3JkZXIoTWVkaWFBbmFseXRpY3NJdGVtICopOworCitleHRlcm4gYm9vbCBzdGF0c2RfbWVkaWFkcm0oTWVkaWFBbmFseXRpY3NJdGVtICopOworZXh0ZXJuIGJvb2wgc3RhdHNkX3dpZGV2aW5lQ0RNKE1lZGlhQW5hbHl0aWNzSXRlbSAqKTsKKworfSAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3Mvc3RhdHNkX2F1ZGlvcG9saWN5LmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL3N0YXRzZF9hdWRpb3BvbGljeS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVjYjI3NAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL3N0YXRzZF9hdWRpb3BvbGljeS5jcHAKQEAgLTAsMCArMSwxMjUgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgInN0YXRzZF9hdWRpb3BvbGljeSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHN0YXRzbG9nLmg+CisKKyNpbmNsdWRlICJNZWRpYUFuYWx5dGljc1NlcnZpY2UuaCIKKyNpbmNsdWRlICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9wcm90by9hbmRyb2lkL3N0YXRzL21lZGlhbWV0cmljcy9tZWRpYW1ldHJpY3MucGIuaCIKKyNpbmNsdWRlICJpZmFjZV9zdGF0c2QuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitib29sIHN0YXRzZF9hdWRpb3BvbGljeShNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pCit7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgICAgLy8gdGhlc2UgZ28gaW50byB0aGUgc3RhdHNkIHdyYXBwZXIKKyAgICBuc2Vjc190IHRpbWVzdGFtcCA9IGl0ZW0tPmdldFRpbWVzdGFtcCgpOworICAgIHN0ZDo6c3RyaW5nIHBrZ05hbWUgPSBpdGVtLT5nZXRQa2dOYW1lKCk7CisgICAgaW50NjRfdCBwa2dWZXJzaW9uQ29kZSA9IGl0ZW0tPmdldFBrZ1ZlcnNpb25Db2RlKCk7CisgICAgaW50NjRfdCBtZWRpYUFwZXhWZXJzaW9uID0gMDsKKworCisgICAgLy8gdGhlIHJlc3QgaW50byBvdXIgb3duIHByb3RvCisgICAgLy8KKyAgICA6OmFuZHJvaWQ6OnN0YXRzOjptZWRpYW1ldHJpY3M6OkF1ZGlvUG9saWN5RGF0YSBtZXRyaWNzX3Byb3RvOworCisgICAgLy8gZmxlc2ggb3V0IHRoZSBwcm90b2J1ZiB3ZSdsbCBoYW5kIG9mZiB3aXRoIG91ciBkYXRhCisgICAgLy8KKyAgICAvL2ludDMyIGNoYXIga0F1ZGlvUG9saWN5U3RhdHVzW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5zdGF0dXMiOworICAgIGludDMyX3Qgc3RhdHVzID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnN0YXR1cyIsICZzdGF0dXMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3N0YXR1cyhzdGF0dXMpOworICAgIH0KKyAgICAvL3N0cmluZyBjaGFyIGtBdWRpb1BvbGljeVJxc3RTcmNbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnJxc3Quc3JjIjsKKyAgICBzdGQ6OnN0cmluZyBycXN0X3NyYzsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnJxc3Quc3JjIiwgJnJxc3Rfc3JjKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9yZXF1ZXN0X3NvdXJjZShzdGQ6Om1vdmUocnFzdF9zcmMpKTsKKyAgICB9CisgICAgLy9zdHJpbmcgY2hhciBrQXVkaW9Qb2xpY3lScXN0UGtnW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5ycXN0LnBrZyI7CisgICAgc3RkOjpzdHJpbmcgcnFzdF9wa2c7CisgICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5ycXN0LnBrZyIsICZycXN0X3BrZykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcmVxdWVzdF9wYWNrYWdlKHN0ZDo6bW92ZShycXN0X3BrZykpOworICAgIH0KKyAgICAvL2ludDMyIGNoYXIga0F1ZGlvUG9saWN5UnFzdFNlc3Npb25bXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LnJxc3Quc2Vzc2lvbiI7CisgICAgaW50MzJfdCBycXN0X3Nlc3Npb24gPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucnFzdC5zZXNzaW9uIiwgJnJxc3Rfc2Vzc2lvbikpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcmVxdWVzdF9zZXNzaW9uKHJxc3Rfc2Vzc2lvbik7CisgICAgfQorICAgIC8vc3RyaW5nIGNoYXIga0F1ZGlvUG9saWN5UnFzdERldmljZVtdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucnFzdC5kZXZpY2UiOworICAgIHN0ZDo6c3RyaW5nIHJxc3RfZGV2aWNlOworICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kucnFzdC5kZXZpY2UiLCAmcnFzdF9kZXZpY2UpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3JlcXVlc3RfZGV2aWNlKHN0ZDo6bW92ZShycXN0X2RldmljZSkpOworICAgIH0KKworICAgIC8vc3RyaW5nIGNoYXIga0F1ZGlvUG9saWN5QWN0aXZlU3JjW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5hY3RpdmUuc3JjIjsKKyAgICBzdGQ6OnN0cmluZyBhY3RpdmVfc3JjOworICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kuYWN0aXZlLnNyYyIsICZhY3RpdmVfc3JjKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hY3RpdmVfc291cmNlKHN0ZDo6bW92ZShhY3RpdmVfc3JjKSk7CisgICAgfQorICAgIC8vc3RyaW5nIGNoYXIga0F1ZGlvUG9saWN5QWN0aXZlUGtnW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5hY3RpdmUucGtnIjsKKyAgICBzdGQ6OnN0cmluZyBhY3RpdmVfcGtnOworICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kuYWN0aXZlLnBrZyIsICZhY3RpdmVfcGtnKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hY3RpdmVfcGFja2FnZShzdGQ6Om1vdmUoYWN0aXZlX3BrZykpOworICAgIH0KKyAgICAvL2ludDMyIGNoYXIga0F1ZGlvUG9saWN5QWN0aXZlU2Vzc2lvbltdID0gImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kuYWN0aXZlLnNlc3Npb24iOworICAgIGludDMyX3QgYWN0aXZlX3Nlc3Npb24gPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW9wb2xpY3kuYWN0aXZlLnNlc3Npb24iLCAmYWN0aXZlX3Nlc3Npb24pKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2FjdGl2ZV9zZXNzaW9uKGFjdGl2ZV9zZXNzaW9uKTsKKyAgICB9CisgICAgLy9zdHJpbmcgY2hhciBrQXVkaW9Qb2xpY3lBY3RpdmVEZXZpY2VbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvcG9saWN5LmFjdGl2ZS5kZXZpY2UiOworICAgIHN0ZDo6c3RyaW5nIGFjdGl2ZV9kZXZpY2U7CisgICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5hdWRpb3BvbGljeS5hY3RpdmUuZGV2aWNlIiwgJmFjdGl2ZV9kZXZpY2UpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2FjdGl2ZV9kZXZpY2Uoc3RkOjptb3ZlKGFjdGl2ZV9kZXZpY2UpKTsKKyAgICB9CisKKworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgICAgaWYgKCFtZXRyaWNzX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlcmlhbGl6ZSBhdWRpcG9saWN5IG1ldHJpY3MiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChlbmFibGVkX3N0YXRzZCkgeworICAgICAgICBhbmRyb2lkOjp1dGlsOjpCeXRlc0ZpZWxkIGJmX3NlcmlhbGl6ZWQoIHNlcmlhbGl6ZWQuY19zdHIoKSwgc2VyaWFsaXplZC5zaXplKCkpOworICAgICAgICAodm9pZClhbmRyb2lkOjp1dGlsOjpzdGF0c193cml0ZShhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfQVVESU9QT0xJQ1lfUkVQT1JURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwgcGtnTmFtZS5jX3N0cigpLCBwa2dWZXJzaW9uQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFBcGV4VmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZfc2VyaWFsaXplZCk7CisKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiTk9UIHNlbmRpbmc6IHByaXZhdGUgZGF0YSAobGVuPSV6dSkiLCBzdHJsZW4oc2VyaWFsaXplZC5jX3N0cigpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9zdGF0c2RfYXVkaW9yZWNvcmQuY3BwIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3Mvc3RhdHNkX2F1ZGlvcmVjb3JkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzdhNjJjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3Mvc3RhdHNkX2F1ZGlvcmVjb3JkLmNwcApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAic3RhdHNkX2F1ZGlvcmVjb3JkIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3RhdHNsb2cuaD4KKworI2luY2x1ZGUgIk1lZGlhQW5hbHl0aWNzU2VydmljZS5oIgorI2luY2x1ZGUgImZyYW1ld29ya3MvYmFzZS9jb3JlL3Byb3RvL2FuZHJvaWQvc3RhdHMvbWVkaWFtZXRyaWNzL21lZGlhbWV0cmljcy5wYi5oIgorI2luY2x1ZGUgImlmYWNlX3N0YXRzZC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgc3RhdHNkX2F1ZGlvcmVjb3JkKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSkKK3sKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgICAvLyB0aGVzZSBnbyBpbnRvIHRoZSBzdGF0c2Qgd3JhcHBlcgorICAgIG5zZWNzX3QgdGltZXN0YW1wID0gaXRlbS0+Z2V0VGltZXN0YW1wKCk7CisgICAgc3RkOjpzdHJpbmcgcGtnTmFtZSA9IGl0ZW0tPmdldFBrZ05hbWUoKTsKKyAgICBpbnQ2NF90IHBrZ1ZlcnNpb25Db2RlID0gaXRlbS0+Z2V0UGtnVmVyc2lvbkNvZGUoKTsKKyAgICBpbnQ2NF90IG1lZGlhQXBleFZlcnNpb24gPSAwOworCisKKyAgICAvLyB0aGUgcmVzdCBpbnRvIG91ciBvd24gcHJvdG8KKyAgICAvLworICAgIDo6YW5kcm9pZDo6c3RhdHM6Om1lZGlhbWV0cmljczo6QXVkaW9SZWNvcmREYXRhIG1ldHJpY3NfcHJvdG87CisKKyAgICAvLyBmbGVzaCBvdXQgdGhlIHByb3RvYnVmIHdlJ2xsIGhhbmQgb2ZmIHdpdGggb3VyIGRhdGEKKyAgICAvLworICAgIHN0ZDo6c3RyaW5nIGVuY29kaW5nOworICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuZW5jb2RpbmciLCAmZW5jb2RpbmcpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2VuY29kaW5nKHN0ZDo6bW92ZShlbmNvZGluZykpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHNvdXJjZTsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLnNvdXJjZSIsICZzb3VyY2UpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3NvdXJjZShzdGQ6Om1vdmUoc291cmNlKSk7CisgICAgfQorCisgICAgaW50MzJfdCBsYXRlbmN5ID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmxhdGVuY3kiLCAmbGF0ZW5jeSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfbGF0ZW5jeShsYXRlbmN5KTsKKyAgICB9CisKKyAgICBpbnQzMl90IHNhbXBsZXJhdGUgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuc2FtcGxlcmF0ZSIsICZzYW1wbGVyYXRlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9zYW1wbGVyYXRlKHNhbXBsZXJhdGUpOworICAgIH0KKworICAgIGludDMyX3QgY2hhbm5lbHMgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuY2hhbm5lbHMiLCAmY2hhbm5lbHMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NoYW5uZWxzKGNoYW5uZWxzKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IGNyZWF0ZWRNcyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5jcmVhdGVkTXMiLCAmY3JlYXRlZE1zKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jcmVhdGVkX21pbGxpcyhjcmVhdGVkTXMpOworICAgIH0KKworICAgIGludDY0X3QgZHVyYXRpb25NcyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5hdWRpb3JlY29yZC5kdXJhdGlvbk1zIiwgJmR1cmF0aW9uTXMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2R1cmF0aW9uX21pbGxpcyhkdXJhdGlvbk1zKTsKKyAgICB9CisKKyAgICBpbnQzMl90IGNvdW50ID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLm4iLCAmY291bnQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NvdW50KGNvdW50KTsKKyAgICB9CisKKyAgICBpbnQzMl90IGVycmNvZGUgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuZXJyY29kZSIsICZlcnJjb2RlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9lcnJvcl9jb2RlKGVycmNvZGUpOworICAgIH0gZWxzZSBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQubGFzdEVycm9yLmNvZGUiLCAmZXJyY29kZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZXJyb3JfY29kZShlcnJjb2RlKTsKKyAgICB9CisKKyAgICBzdGQ6OnN0cmluZyBlcnJmdW5jOworICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuZXJyZnVuYyIsICZlcnJmdW5jKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9lcnJvcl9mdW5jdGlvbihzdGQ6Om1vdmUoZXJyZnVuYykpOworICAgIH0gZWxzZSBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmxhc3RFcnJvci5hdCIsICZlcnJmdW5jKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9lcnJvcl9mdW5jdGlvbihzdGQ6Om1vdmUoZXJyZnVuYykpOworICAgIH0KKworICAgIC8vIHBvcnRJZCAoaW50MzIpCisgICAgaW50MzJfdCBwb3J0X2lkID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLnBvcnRJZCIsICZwb3J0X2lkKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9wb3J0X2lkKGNvdW50KTsKKyAgICB9CisgICAgLy8gZnJhbWVDb3VudCAoaW50MzIpCisgICAgaW50MzJfdCBmcmFtZUNvdW50ID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmZyYW1lQ291bnQiLCAmZnJhbWVDb3VudCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZnJhbWVfY291bnQoZnJhbWVDb3VudCk7CisgICAgfQorICAgIC8vIGF0dHJpYnV0ZXMgKHN0cmluZykKKyAgICBzdGQ6OnN0cmluZyBhdHRyaWJ1dGVzOworICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuYXR0cmlidXRlcyIsICZhdHRyaWJ1dGVzKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hdHRyaWJ1dGVzKHN0ZDo6bW92ZShhdHRyaWJ1dGVzKSk7CisgICAgfQorICAgIC8vIGNoYW5uZWxNYXNrIChpbnQ2NCkKKyAgICBpbnQ2NF90IGNoYW5uZWxNYXNrID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLmF1ZGlvcmVjb3JkLmNoYW5uZWxNYXNrIiwgJmNoYW5uZWxNYXNrKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jaGFubmVsX21hc2soY2hhbm5lbE1hc2spOworICAgIH0KKyAgICAvLyBzdGFydGNvdW50IChpbnQ2NCkKKyAgICBpbnQ2NF90IHN0YXJ0Y291bnQgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEuYXVkaW9yZWNvcmQuc3RhcnRjb3VudCIsICZzdGFydGNvdW50KSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9zdGFydF9jb3VudChzdGFydGNvdW50KTsKKyAgICB9CisKKworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgICAgaWYgKCFtZXRyaWNzX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlcmlhbGl6ZSBhdWRpb3JlY29yZCBtZXRyaWNzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZW5hYmxlZF9zdGF0c2QpIHsKKyAgICAgICAgYW5kcm9pZDo6dXRpbDo6Qnl0ZXNGaWVsZCBiZl9zZXJpYWxpemVkKCBzZXJpYWxpemVkLmNfc3RyKCksIHNlcmlhbGl6ZWQuc2l6ZSgpKTsKKyAgICAgICAgKHZvaWQpYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0FVRElPUkVDT1JEX1JFUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIHBrZ05hbWUuY19zdHIoKSwgcGtnVmVyc2lvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQXBleFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmX3NlcmlhbGl6ZWQpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIk5PVCBzZW5kaW5nOiBwcml2YXRlIGRhdGEgKGxlbj0lenUpIiwgc3RybGVuKHNlcmlhbGl6ZWQuY19zdHIoKSkpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3Mvc3RhdHNkX2F1ZGlvdGhyZWFkLmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL3N0YXRzZF9hdWRpb3RocmVhZC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlkNmIxNwotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL3N0YXRzZF9hdWRpb3RocmVhZC5jcHAKQEAgLTAsMCArMSwyMDcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgInN0YXRzZF9hdWRpb3RocmVhZCIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHN0YXRzbG9nLmg+CisKKyNpbmNsdWRlICJNZWRpYUFuYWx5dGljc1NlcnZpY2UuaCIKKyNpbmNsdWRlICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9wcm90by9hbmRyb2lkL3N0YXRzL21lZGlhbWV0cmljcy9tZWRpYW1ldHJpY3MucGIuaCIKKyNpbmNsdWRlICJpZmFjZV9zdGF0c2QuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitib29sIHN0YXRzZF9hdWRpb3RocmVhZChNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pCit7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgICAgLy8gdGhlc2UgZ28gaW50byB0aGUgc3RhdHNkIHdyYXBwZXIKKyAgICBuc2Vjc190IHRpbWVzdGFtcCA9IGl0ZW0tPmdldFRpbWVzdGFtcCgpOworICAgIHN0ZDo6c3RyaW5nIHBrZ05hbWUgPSBpdGVtLT5nZXRQa2dOYW1lKCk7CisgICAgaW50NjRfdCBwa2dWZXJzaW9uQ29kZSA9IGl0ZW0tPmdldFBrZ1ZlcnNpb25Db2RlKCk7CisgICAgaW50NjRfdCBtZWRpYUFwZXhWZXJzaW9uID0gMDsKKworCisgICAgLy8gdGhlIHJlc3QgaW50byBvdXIgb3duIHByb3RvCisgICAgLy8KKyAgICA6OmFuZHJvaWQ6OnN0YXRzOjptZWRpYW1ldHJpY3M6OkF1ZGlvVGhyZWFkRGF0YSBtZXRyaWNzX3Byb3RvOworCisjZGVmaW5lCU1NX1BSRUZJWCAiYW5kcm9pZC5tZWRpYS5hdWRpb3RocmVhZC4iCisKKyAgICAvLyBmbGVzaCBvdXQgdGhlIHByb3RvYnVmIHdlJ2xsIGhhbmQgb2ZmIHdpdGggb3VyIGRhdGEKKyAgICAvLworICAgIHN0ZDo6c3RyaW5nIG15dHlwZTsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKE1NX1BSRUZJWCAidHlwZSIsICZteXR5cGUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3R5cGUoc3RkOjptb3ZlKG15dHlwZSkpOworICAgIH0KKyAgICBpbnQzMl90IGZyYW1lY291bnQgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoTU1fUFJFRklYICJmcmFtZWNvdW50IiwgJmZyYW1lY291bnQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2ZyYW1lY291bnQoZnJhbWVjb3VudCk7CisgICAgfQorICAgIGludDMyX3Qgc2FtcGxlcmF0ZSA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMihNTV9QUkVGSVggInNhbXBsZXJhdGUiLCAmc2FtcGxlcmF0ZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfc2FtcGxlcmF0ZShzYW1wbGVyYXRlKTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgd29ya2hpc3Q7CisgICAgaWYgKGl0ZW0tPmdldFN0cmluZyhNTV9QUkVGSVggIndvcmtNcy5oaXN0IiwgJndvcmtoaXN0KSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF93b3JrX21pbGxpc19oaXN0KHN0ZDo6bW92ZSh3b3JraGlzdCkpOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBsYXRlbmN5aGlzdDsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKE1NX1BSRUZJWCAibGF0ZW5jeU1zLmhpc3QiLCAmbGF0ZW5jeWhpc3QpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2xhdGVuY3lfbWlsbGlzX2hpc3Qoc3RkOjptb3ZlKGxhdGVuY3loaXN0KSk7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIHdhcm11cGhpc3Q7CisgICAgaWYgKGl0ZW0tPmdldFN0cmluZyhNTV9QUkVGSVggIndhcm11cE1zLmhpc3QiLCAmd2FybXVwaGlzdCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfd2FybXVwX21pbGxpc19oaXN0KHN0ZDo6bW92ZSh3YXJtdXBoaXN0KSk7CisgICAgfQorICAgIGludDY0X3QgdW5kZXJydW5zID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KE1NX1BSRUZJWCAidW5kZXJydW5zIiwgJnVuZGVycnVucykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfdW5kZXJydW5zKHVuZGVycnVucyk7CisgICAgfQorICAgIGludDY0X3Qgb3ZlcnJ1bnMgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50NjQoTU1fUFJFRklYICJvdmVycnVucyIsICZvdmVycnVucykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfb3ZlcnJ1bnMob3ZlcnJ1bnMpOworICAgIH0KKyAgICBpbnQ2NF90IGFjdGl2ZU1zID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KE1NX1BSRUZJWCAiYWN0aXZlTXMiLCAmYWN0aXZlTXMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2FjdGl2ZV9taWxsaXMoYWN0aXZlTXMpOworICAgIH0KKyAgICBpbnQ2NF90IGR1cmF0aW9uTXMgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50NjQoTU1fUFJFRklYICJkdXJhdGlvbk1zIiwgJmR1cmF0aW9uTXMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2R1cmF0aW9uX21pbGxpcyhkdXJhdGlvbk1zKTsKKyAgICB9CisKKyAgICAvLyBpdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggImlkIiwgKGludDMyX3QpbUlkKTsgLy8gSU8gaGFuZGxlCisgICAgaW50MzJfdCBpZCA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMihNTV9QUkVGSVggImlkIiwgJmlkKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9pZChpZCk7CisgICAgfQorICAgIC8vIGl0ZW0tPnNldEludDMyKE1NX1BSRUZJWCAicG9ydElkIiwgKGludDMyX3QpbVBvcnRJZCk7CisgICAgaW50MzJfdCBwb3J0X2lkID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKE1NX1BSRUZJWCAicG9ydElkIiwgJmlkKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9wb3J0X2lkKHBvcnRfaWQpOworICAgIH0KKyAgICAvLyBpdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAidHlwZSIsIHRocmVhZFR5cGVUb1N0cmluZyhtVHlwZSkpOworICAgIHN0ZDo6c3RyaW5nIHR5cGU7CisgICAgaWYgKGl0ZW0tPmdldFN0cmluZyhNTV9QUkVGSVggInR5cGUiLCAmdHlwZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfdHlwZShzdGQ6Om1vdmUodHlwZSkpOworICAgIH0KKyAgICAvLyBpdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggInNhbXBsZVJhdGUiLCAoaW50MzJfdCltU2FtcGxlUmF0ZSk7CisgICAgaW50MzJfdCBzYW1wbGVfcmF0ZSA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMihNTV9QUkVGSVggInNhbXBsZVJhdGUiLCAmc2FtcGxlX3JhdGUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3NhbXBsZV9yYXRlKHNhbXBsZV9yYXRlKTsKKyAgICB9CisgICAgLy8gaXRlbS0+c2V0SW50NjQoTU1fUFJFRklYICJjaGFubmVsTWFzayIsIChpbnQ2NF90KW1DaGFubmVsTWFzayk7CisgICAgaW50MzJfdCBjaGFubmVsX21hc2sgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoTU1fUFJFRklYICJjaGFubmVsTWFzayIsICZjaGFubmVsX21hc2spKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NoYW5uZWxfbWFzayhjaGFubmVsX21hc2spOworICAgIH0KKyAgICAvLyBpdGVtLT5zZXRDU3RyaW5nKE1NX1BSRUZJWCAiZW5jb2RpbmciLCB0b1N0cmluZyhtRm9ybWF0KS5jX3N0cigpKTsKKyAgICBzdGQ6OnN0cmluZyBlbmNvZGluZzsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKE1NX1BSRUZJWCAiZW5jb2RpbmciLCAmZW5jb2RpbmcpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2VuY29kaW5nKHN0ZDo6bW92ZShlbmNvZGluZykpOworICAgIH0KKyAgICAvLyBpdGVtLT5zZXRJbnQzMihNTV9QUkVGSVggImZyYW1lQ291bnQiLCAoaW50MzJfdCltRnJhbWVDb3VudCk7CisgICAgaW50MzJfdCBmcmFtZV9jb3VudCA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMihNTV9QUkVGSVggImZyYW1lQ291bnQiLCAmZnJhbWVfY291bnQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2ZyYW1lX2NvdW50KGZyYW1lX2NvdW50KTsKKyAgICB9CisgICAgLy8gaXRlbS0+c2V0Q1N0cmluZyhNTV9QUkVGSVggIm91dERldmljZSIsIHRvU3RyaW5nKG1PdXREZXZpY2UpLmNfc3RyKCkpOworICAgIHN0ZDo6c3RyaW5nIG91dERldmljZTsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKE1NX1BSRUZJWCAib3V0RGV2aWNlIiwgJm91dERldmljZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfb3V0cHV0X2RldmljZShzdGQ6Om1vdmUob3V0RGV2aWNlKSk7CisgICAgfQorICAgIC8vIGl0ZW0tPnNldENTdHJpbmcoTU1fUFJFRklYICJpbkRldmljZSIsIHRvU3RyaW5nKG1JbkRldmljZSkuY19zdHIoKSk7CisgICAgc3RkOjpzdHJpbmcgaW5EZXZpY2U7CisgICAgaWYgKGl0ZW0tPmdldFN0cmluZyhNTV9QUkVGSVggImluRGV2aWNlIiwgJmluRGV2aWNlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9pbnB1dF9kZXZpY2Uoc3RkOjptb3ZlKGluRGV2aWNlKSk7CisgICAgfQorICAgIC8vIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggImlvSml0dGVyTXMubWVhbiIsIG1Jb0ppdHRlck1zLmdldE1lYW4oKSk7CisgICAgZG91YmxlIGlvaml0dGVyc19tc19tZWFuID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldERvdWJsZShNTV9QUkVGSVggImlvSml0dGVyTXMubWVhbiIsICZpb2ppdHRlcnNfbXNfbWVhbikpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfaW9faml0dGVyX21lYW5fbWlsbGlzKGlvaml0dGVyc19tc19tZWFuKTsKKyAgICB9CisgICAgLy8gaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAiaW9KaXR0ZXJNcy5zdGQiLCBtSW9KaXR0ZXJNcy5nZXRTdGREZXYoKSk7CisgICAgZG91YmxlIGlvaml0dGVyc19tc19zdGQgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0RG91YmxlKE1NX1BSRUZJWCAiaW9KaXR0ZXJNcy5zdGQiLCAmaW9qaXR0ZXJzX21zX3N0ZCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfaW9faml0dGVyX3N0ZGRldl9taWxsaXMoaW9qaXR0ZXJzX21zX3N0ZCk7CisgICAgfQorICAgIC8vIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggInByb2Nlc3NUaW1lTXMubWVhbiIsIG1Qcm9jZXNzVGltZU1zLmdldE1lYW4oKSk7CisgICAgZG91YmxlIHByb2Nlc3NfdGltZV9tc19tZWFuID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldERvdWJsZShNTV9QUkVGSVggInByb2Nlc3NUaW1lTXMubWVhbiIsICZwcm9jZXNzX3RpbWVfbXNfbWVhbikpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcHJvY2Vzc190aW1lX21lYW5fbWlsbGlzKHByb2Nlc3NfdGltZV9tc19tZWFuKTsKKyAgICB9CisgICAgLy8gaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAicHJvY2Vzc1RpbWVNcy5zdGQiLCBtUHJvY2Vzc1RpbWVNcy5nZXRTdGREZXYoKSk7CisgICAgZG91YmxlIHByb2Nlc3NfdGltZV9tc19zdGQgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0RG91YmxlKE1NX1BSRUZJWCAicHJvY2Vzc1RpbWVNcy5zdGQiLCAmcHJvY2Vzc190aW1lX21zX3N0ZCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcHJvY2Vzc190aW1lX3N0ZGRldl9taWxsaXMocHJvY2Vzc190aW1lX21zX3N0ZCk7CisgICAgfQorICAgIC8vIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggInRpbWVzdGFtcEppdHRlck1zLm1lYW4iLCB0c2ppdHRlci5nZXRNZWFuKCkpOworICAgIGRvdWJsZSB0aW1lc3RhbXBfaml0dGVyX21zX21lYW4gPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0RG91YmxlKE1NX1BSRUZJWCAidGltZXN0YW1wSml0dGVyTXMubWVhbiIsICZ0aW1lc3RhbXBfaml0dGVyX21zX21lYW4pKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3RpbWVzdGFtcF9qaXR0ZXJfbWVhbl9taWxsaXModGltZXN0YW1wX2ppdHRlcl9tc19tZWFuKTsKKyAgICB9CisgICAgLy8gaXRlbS0+c2V0RG91YmxlKE1NX1BSRUZJWCAidGltZXN0YW1wSml0dGVyTXMuc3RkIiwgdHNqaXR0ZXIuZ2V0U3RkRGV2KCkpOworICAgIGRvdWJsZSB0aW1lc3RhbXBfaml0dGVyX21zX3N0ZGRldiA9IC0xOworICAgIGlmIChpdGVtLT5nZXREb3VibGUoTU1fUFJFRklYICJ0aW1lc3RhbXBKaXR0ZXJNcy5zdGQiLCAmdGltZXN0YW1wX2ppdHRlcl9tc19zdGRkZXYpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3RpbWVzdGFtcF9qaXR0ZXJfc3RkZGV2X21pbGxpcyh0aW1lc3RhbXBfaml0dGVyX21zX3N0ZGRldik7CisgICAgfQorICAgIC8vIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggImxhdGVuY3lNcy5tZWFuIiwgbUxhdGVuY3lNcy5nZXRNZWFuKCkpOworICAgIGRvdWJsZSBsYXRlbmN5X21zX21lYW4gPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0RG91YmxlKE1NX1BSRUZJWCAibGF0ZW5jeU1zLm1lYW4iLCAmbGF0ZW5jeV9tc19tZWFuKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9sYXRlbmN5X21lYW5fbWlsbGlzKGxhdGVuY3lfbXNfbWVhbik7CisgICAgfQorICAgIC8vIGl0ZW0tPnNldERvdWJsZShNTV9QUkVGSVggImxhdGVuY3lNcy5zdGQiLCBtTGF0ZW5jeU1zLmdldFN0ZERldigpKTsKKyAgICBkb3VibGUgbGF0ZW5jeV9tc19zdGRkZXYgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0RG91YmxlKE1NX1BSRUZJWCAibGF0ZW5jeU1zLnN0ZCIsICZsYXRlbmN5X21zX3N0ZGRldikpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfbGF0ZW5jeV9zdGRkZXZfbWlsbGlzKGxhdGVuY3lfbXNfc3RkZGV2KTsKKyAgICB9CisKKworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgICAgaWYgKCFtZXRyaWNzX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlcmlhbGl6ZSBhdWRpb3RocmVhZCBtZXRyaWNzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZW5hYmxlZF9zdGF0c2QpIHsKKyAgICAgICAgYW5kcm9pZDo6dXRpbDo6Qnl0ZXNGaWVsZCBiZl9zZXJpYWxpemVkKCBzZXJpYWxpemVkLmNfc3RyKCksIHNlcmlhbGl6ZWQuc2l6ZSgpKTsKKyAgICAgICAgKHZvaWQpYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX0FVRElPVEhSRUFEX1JFUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIHBrZ05hbWUuY19zdHIoKSwgcGtnVmVyc2lvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQXBleFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmX3NlcmlhbGl6ZWQpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIk5PVCBzZW5kaW5nOiBwcml2YXRlIGRhdGEgKGxlbj0lenUpIiwgc3RybGVuKHNlcmlhbGl6ZWQuY19zdHIoKSkpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3Mvc3RhdHNkX2F1ZGlvdHJhY2suY3BwIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3Mvc3RhdHNkX2F1ZGlvdHJhY2suY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3Y2RhOTkKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9zdGF0c2RfYXVkaW90cmFjay5jcHAKQEAgLTAsMCArMSwxNDkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgInN0YXRzZF9hdWRpb3RyYWNrIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3RhdHNsb2cuaD4KKworI2luY2x1ZGUgIk1lZGlhQW5hbHl0aWNzU2VydmljZS5oIgorI2luY2x1ZGUgImZyYW1ld29ya3MvYmFzZS9jb3JlL3Byb3RvL2FuZHJvaWQvc3RhdHMvbWVkaWFtZXRyaWNzL21lZGlhbWV0cmljcy5wYi5oIgorI2luY2x1ZGUgImlmYWNlX3N0YXRzZC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgc3RhdHNkX2F1ZGlvdHJhY2soTWVkaWFBbmFseXRpY3NJdGVtICppdGVtKQoreworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICAgIC8vIHRoZXNlIGdvIGludG8gdGhlIHN0YXRzZCB3cmFwcGVyCisgICAgbnNlY3NfdCB0aW1lc3RhbXAgPSBpdGVtLT5nZXRUaW1lc3RhbXAoKTsKKyAgICBzdGQ6OnN0cmluZyBwa2dOYW1lID0gaXRlbS0+Z2V0UGtnTmFtZSgpOworICAgIGludDY0X3QgcGtnVmVyc2lvbkNvZGUgPSBpdGVtLT5nZXRQa2dWZXJzaW9uQ29kZSgpOworICAgIGludDY0X3QgbWVkaWFBcGV4VmVyc2lvbiA9IDA7CisKKworICAgIC8vIHRoZSByZXN0IGludG8gb3VyIG93biBwcm90bworICAgIC8vCisgICAgOjphbmRyb2lkOjpzdGF0czo6bWVkaWFtZXRyaWNzOjpBdWRpb1RyYWNrRGF0YSBtZXRyaWNzX3Byb3RvOworCisgICAgLy8gZmxlc2ggb3V0IHRoZSBwcm90b2J1ZiB3ZSdsbCBoYW5kIG9mZiB3aXRoIG91ciBkYXRhCisgICAgLy8KKworICAgIC8vIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1N0cmVhbVR5cGVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suc3RyZWFtdHlwZSI7CisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIHN0cmVhbVR5cGU7CisgICAgc3RkOjpzdHJpbmcgc3RyZWFtdHlwZTsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suc3RyZWFtdHlwZSIsICZzdHJlYW10eXBlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9zdHJlYW1fdHlwZShzdGQ6Om1vdmUoc3RyZWFtdHlwZSkpOworICAgIH0KKworICAgIC8vIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja0NvbnRlbnRUeXBlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnR5cGUiOworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBjb250ZW50VHlwZTsKKyAgICBzdGQ6OnN0cmluZyBjb250ZW50dHlwZTsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2sudHlwZSIsICZjb250ZW50dHlwZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfY29udGVudF90eXBlKHN0ZDo6bW92ZShjb250ZW50dHlwZSkpOworICAgIH0KKworICAgIC8vIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1VzYWdlW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnVzYWdlIjsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgdHJhY2tVc2FnZTsKKyAgICBzdGQ6OnN0cmluZyB0cmFja3VzYWdlOworICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay51c2FnZSIsICZ0cmFja3VzYWdlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF90cmFja191c2FnZShzdGQ6Om1vdmUodHJhY2t1c2FnZSkpOworICAgIH0KKworICAgIC8vIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1NhbXBsZVJhdGVbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suc2FtcGxlcmF0ZSI7CisgICAgLy8gb3B0aW9uYWwgaW50MzIgc2FtcGxlcmF0ZTsKKyAgICBpbnQzMl90IHNhbXBsZXJhdGUgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay5zYW1wbGVyYXRlIiwgJnNhbXBsZXJhdGUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3NhbXBsZV9yYXRlKHNhbXBsZXJhdGUpOworICAgIH0KKworICAgIC8vIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja0NoYW5uZWxNYXNrW10gPSAiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLmNoYW5uZWxtYXNrIjsKKyAgICAvLyBvcHRpb25hbCBpbnQ2NCBjaGFubmVsTWFzazsKKyAgICBpbnQ2NF90IGNoYW5uZWxNYXNrID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suY2hhbm5lbG1hc2siLCAmY2hhbm5lbE1hc2spKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NoYW5uZWxfbWFzayhjaGFubmVsTWFzayk7CisgICAgfQorCisgICAgLy8gTkI6IFRoZXNlIGFyZSBub3QgeWV0IGV4cG9zZWQgYXMgcHVibGljIEphdmEgQVBJIGNvbnN0YW50cy4KKyAgICAvLyBzdGF0aWMgY29uc3RleHByIGNoYXIga0F1ZGlvVHJhY2tVbmRlcnJ1bkZyYW1lc1tdID0gImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay51bmRlcnJ1bmZyYW1lcyI7CisgICAgLy8gb3B0aW9uYWwgaW50MzIgdW5kZXJydW5mcmFtZXM7CisgICAgaW50MzJfdCB1bmRlcnJ1bmZyYW1lcyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5hdWRpb3RyYWNrLnVuZGVycnVuZnJhbWVzIiwgJnVuZGVycnVuZnJhbWVzKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF91bmRlcnJ1bl9mcmFtZXModW5kZXJydW5mcmFtZXMpOworICAgIH0KKworICAgIC8vIHN0YXRpYyBjb25zdGV4cHIgY2hhciBrQXVkaW9UcmFja1N0YXJ0dXBHbGl0Y2hbXSA9ICJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suZ2xpdGNoLnN0YXJ0dXAiOworICAgIC8vIG9wdGlvbmFsIGludDMyIHN0YXJ0dXBnbGl0Y2g7CisgICAgaW50MzJfdCBzdGFydHVwZ2xpdGNoID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suZ2xpdGNoLnN0YXJ0dXAiLCAmc3RhcnR1cGdsaXRjaCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfc3RhcnR1cF9nbGl0Y2goc3RhcnR1cGdsaXRjaCk7CisgICAgfQorCisgICAgLy8gcG9ydElkIChpbnQzMikKKyAgICBpbnQzMl90IHBvcnRfaWQgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEuYXVkaW90cmFjay5wb3J0SWQiLCAmcG9ydF9pZCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcG9ydF9pZChwb3J0X2lkKTsKKyAgICB9CisgICAgLy8gZW5jb2RpbmcgKHN0cmluZykKKyAgICBzdGQ6OnN0cmluZyBlbmNvZGluZzsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suZW5jb2RpbmciLCAmZW5jb2RpbmcpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2VuY29kaW5nKHN0ZDo6bW92ZShlbmNvZGluZykpOworICAgIH0KKyAgICAvLyBmcmFtZUNvdW50IChpbnQzMikKKyAgICBpbnQzMl90IGZyYW1lX2NvdW50ID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suZnJhbWVDb3VudCIsICZmcmFtZV9jb3VudCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZnJhbWVfY291bnQoZnJhbWVfY291bnQpOworICAgIH0KKyAgICAvLyBhdHRyaWJ1dGVzIChzdHJpbmcpCisgICAgc3RkOjpzdHJpbmcgYXR0cmlidXRlczsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLmF1ZGlvdHJhY2suYXR0cmlidXRlcyIsICZhdHRyaWJ1dGVzKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hdHRyaWJ1dGVzKHN0ZDo6bW92ZShhdHRyaWJ1dGVzKSk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgICBpZiAoIW1ldHJpY3NfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2VyaWFsaXplIGF1ZGlvdHJhY2sgbWV0cmljcyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGVuYWJsZWRfc3RhdHNkKSB7CisgICAgICAgIGFuZHJvaWQ6OnV0aWw6OkJ5dGVzRmllbGQgYmZfc2VyaWFsaXplZCggc2VyaWFsaXplZC5jX3N0cigpLCBzZXJpYWxpemVkLnNpemUoKSk7CisgICAgICAgICh2b2lkKWFuZHJvaWQ6OnV0aWw6OnN0YXRzX3dyaXRlKGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19BVURJT1RSQUNLX1JFUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIHBrZ05hbWUuY19zdHIoKSwgcGtnVmVyc2lvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQXBleFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmX3NlcmlhbGl6ZWQpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIk5PVCBzZW5kaW5nOiBwcml2YXRlIGRhdGEgKGxlbj0lenUpIiwgc3RybGVuKHNlcmlhbGl6ZWQuY19zdHIoKSkpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3Mvc3RhdHNkX2NvZGVjLmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL3N0YXRzZF9jb2RlYy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmY4MmU1MAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL3N0YXRzZF9jb2RlYy5jcHAKQEAgLTAsMCArMSwxNzkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgInN0YXRzZF9jb2RlYyIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHN0YXRzbG9nLmg+CisKKyNpbmNsdWRlICJNZWRpYUFuYWx5dGljc1NlcnZpY2UuaCIKKyNpbmNsdWRlICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9wcm90by9hbmRyb2lkL3N0YXRzL21lZGlhbWV0cmljcy9tZWRpYW1ldHJpY3MucGIuaCIKKyNpbmNsdWRlICJpZmFjZV9zdGF0c2QuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitib29sIHN0YXRzZF9jb2RlYyhNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pCit7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgICAgLy8gdGhlc2UgZ28gaW50byB0aGUgc3RhdHNkIHdyYXBwZXIKKyAgICBuc2Vjc190IHRpbWVzdGFtcCA9IGl0ZW0tPmdldFRpbWVzdGFtcCgpOworICAgIHN0ZDo6c3RyaW5nIHBrZ05hbWUgPSBpdGVtLT5nZXRQa2dOYW1lKCk7CisgICAgaW50NjRfdCBwa2dWZXJzaW9uQ29kZSA9IGl0ZW0tPmdldFBrZ1ZlcnNpb25Db2RlKCk7CisgICAgaW50NjRfdCBtZWRpYUFwZXhWZXJzaW9uID0gMDsKKworCisgICAgLy8gdGhlIHJlc3QgaW50byBvdXIgb3duIHByb3RvCisgICAgLy8KKyAgICA6OmFuZHJvaWQ6OnN0YXRzOjptZWRpYW1ldHJpY3M6OkNvZGVjRGF0YSBtZXRyaWNzX3Byb3RvOworCisgICAgLy8gZmxlc2ggb3V0IHRoZSBwcm90b2J1ZiB3ZSdsbCBoYW5kIG9mZiB3aXRoIG91ciBkYXRhCisgICAgLy8KKyAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuY29kZWMgICBzdHJpbmcKKyAgICBzdGQ6OnN0cmluZyBjb2RlYzsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuY29kZWMiLCAmY29kZWMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NvZGVjKHN0ZDo6bW92ZShjb2RlYykpOworICAgIH0KKyAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubWltZSAgICBzdHJpbmcKKyAgICBzdGQ6OnN0cmluZyBtaW1lOworICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5taW1lIiwgJm1pbWUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X21pbWUoc3RkOjptb3ZlKG1pbWUpKTsKKyAgICB9CisgICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1vZGUgICAgc3RyaW5nCisgICAgc3RkOjpzdHJpbmcgbW9kZTsKKyAgICBpZiAoIGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1vZGUiLCAmbW9kZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfbW9kZShzdGQ6Om1vdmUobW9kZSkpOworICAgIH0KKyAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuZW5jb2RlciBpbnQzMgorICAgIGludDMyX3QgZW5jb2RlciA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5lbmNvZGVyIiwgJmVuY29kZXIpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2VuY29kZXIoZW5jb2Rlcik7CisgICAgfQorICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5zZWN1cmUgIGludDMyCisgICAgaW50MzJfdCBzZWN1cmUgPSAtMTsKKyAgICBpZiAoIGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuc2VjdXJlIiwgJnNlY3VyZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfc2VjdXJlKHNlY3VyZSk7CisgICAgfQorICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy53aWR0aCAgIGludDMyCisgICAgaW50MzJfdCB3aWR0aCA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy53aWR0aCIsICZ3aWR0aCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfd2lkdGgod2lkdGgpOworICAgIH0KKyAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMuaGVpZ2h0ICBpbnQzMgorICAgIGludDMyX3QgaGVpZ2h0ID0gLTE7CisgICAgaWYgKCBpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmhlaWdodCIsICZoZWlnaHQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2hlaWdodChoZWlnaHQpOworICAgIH0KKyAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucm90YXRpb24tZGVncmVlcyAgICAgICAgaW50MzIKKyAgICBpbnQzMl90IHJvdGF0aW9uID0gLTE7CisgICAgaWYgKCBpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLnJvdGF0aW9uLWRlZ3JlZXMiLCAmcm90YXRpb24pKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3JvdGF0aW9uKHJvdGF0aW9uKTsKKyAgICB9CisgICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmNyeXB0byAgaW50MzIgKGFsdGhvdWdoIG1pc3NpbmcgaWYgbm90IG5lZWRlZAorICAgIGludDMyX3QgY3J5cHRvID0gLTE7CisgICAgaWYgKCBpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmNyeXB0byIsICZjcnlwdG8pKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2NyeXB0byhjcnlwdG8pOworICAgIH0KKyAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMucHJvZmlsZSBpbnQzMgorICAgIGludDMyX3QgcHJvZmlsZSA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5wcm9maWxlIiwgJnByb2ZpbGUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3Byb2ZpbGUocHJvZmlsZSk7CisgICAgfQorICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sZXZlbCAgIGludDMyCisgICAgaW50MzJfdCBsZXZlbCA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sZXZlbCIsICZsZXZlbCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfbGV2ZWwobGV2ZWwpOworICAgIH0KKyAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubWF4d2lkdGggICAgICAgIGludDMyCisgICAgaW50MzJfdCBtYXh3aWR0aCA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5tYXh3aWR0aCIsICZtYXh3aWR0aCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfbWF4X3dpZHRoKG1heHdpZHRoKTsKKyAgICB9CisgICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1heGhlaWdodCAgICAgICBpbnQzMgorICAgIGludDMyX3QgbWF4aGVpZ2h0ID0gLTE7CisgICAgaWYgKCBpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLm1heGhlaWdodCIsICZtYXhoZWlnaHQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X21heF9oZWlnaHQobWF4aGVpZ2h0KTsKKyAgICB9CisgICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmVycmNvZGUgICAgICAgICBpbnQzMgorICAgIGludDMyX3QgZXJyY29kZSA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5lcnJjb2RlIiwgJmVycmNvZGUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2Vycm9yX2NvZGUoZXJyY29kZSk7CisgICAgfQorICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5lcnJzdGF0ZSAgICAgICAgc3RyaW5nCisgICAgc3RkOjpzdHJpbmcgZXJyc3RhdGU7CisgICAgaWYgKCBpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5lcnJzdGF0ZSIsICZlcnJzdGF0ZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZXJyb3Jfc3RhdGUoc3RkOjptb3ZlKGVycnN0YXRlKSk7CisgICAgfQorICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sYXRlbmN5Lm1heCAgaW50NjQKKyAgICBpbnQ2NF90IGxhdGVuY3lfbWF4ID0gLTE7CisgICAgaWYgKCBpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxhdGVuY3kubWF4IiwgJmxhdGVuY3lfbWF4KSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9sYXRlbmN5X21heChsYXRlbmN5X21heCk7CisgICAgfQorICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sYXRlbmN5Lm1pbiAgaW50NjQKKyAgICBpbnQ2NF90IGxhdGVuY3lfbWluID0gLTE7CisgICAgaWYgKCBpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxhdGVuY3kubWluIiwgJmxhdGVuY3lfbWluKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9sYXRlbmN5X21pbihsYXRlbmN5X21pbik7CisgICAgfQorICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sYXRlbmN5LmF2ZyAgaW50NjQKKyAgICBpbnQ2NF90IGxhdGVuY3lfYXZnID0gLTE7CisgICAgaWYgKCBpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxhdGVuY3kuYXZnIiwgJmxhdGVuY3lfYXZnKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9sYXRlbmN5X2F2ZyhsYXRlbmN5X2F2Zyk7CisgICAgfQorICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sYXRlbmN5Lm4gICAgaW50NjQKKyAgICBpbnQ2NF90IGxhdGVuY3lfY291bnQgPSAtMTsKKyAgICBpZiAoIGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhY29kZWMubGF0ZW5jeS5uIiwgJmxhdGVuY3lfY291bnQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2xhdGVuY3lfY291bnQobGF0ZW5jeV9jb3VudCk7CisgICAgfQorICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sYXRlbmN5LnVua25vd24gICAgaW50NjQKKyAgICBpbnQ2NF90IGxhdGVuY3lfdW5rbm93biA9IC0xOworICAgIGlmICggaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFjb2RlYy5sYXRlbmN5LnVua25vd24iLCAmbGF0ZW5jeV91bmtub3duKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9sYXRlbmN5X3Vua25vd24obGF0ZW5jeV91bmtub3duKTsKKyAgICB9CisgICAgLy8gYW5kcm9pZC5tZWRpYS5tZWRpYWNvZGVjLmxhdGVuY3kuaGlzdCAgICBOT1QgRU1JVFRFRAorCisgICAgc3RkOjpzdHJpbmcgc2VyaWFsaXplZDsKKyAgICBpZiAoIW1ldHJpY3NfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpKSB7CisgICAgICAgIEFMT0dFKCJGYWlsZWQgdG8gc2VyaWFsaXplIGNvZGVjIG1ldHJpY3MiKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGlmIChlbmFibGVkX3N0YXRzZCkgeworICAgICAgICBhbmRyb2lkOjp1dGlsOjpCeXRlc0ZpZWxkIGJmX3NlcmlhbGl6ZWQoIHNlcmlhbGl6ZWQuY19zdHIoKSwgc2VyaWFsaXplZC5zaXplKCkpOworICAgICAgICAodm9pZClhbmRyb2lkOjp1dGlsOjpzdGF0c193cml0ZShhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfQ09ERUNfUkVQT1JURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwgcGtnTmFtZS5jX3N0cigpLCBwa2dWZXJzaW9uQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFBcGV4VmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZfc2VyaWFsaXplZCk7CisKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiTk9UIHNlbmRpbmc6IHByaXZhdGUgZGF0YSAobGVuPSV6dSkiLCBzdHJsZW4oc2VyaWFsaXplZC5jX3N0cigpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9zdGF0c2RfZHJtLmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL3N0YXRzZF9kcm0uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMjQ4M2EKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9zdGF0c2RfZHJtLmNwcApAQCAtMCwwICsxLDEwNyBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAic3RhdHNkX2RybSIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPHB0aHJlYWQuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHB3ZC5oPgorCisjaW5jbHVkZSAiTWVkaWFBbmFseXRpY3NTZXJ2aWNlLmgiCisjaW5jbHVkZSAiaWZhY2Vfc3RhdHNkLmgiCisKKyNpbmNsdWRlIDxzdGF0c2xvZy5oPgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8vIG1lZGlhZHJtCitib29sIHN0YXRzZF9tZWRpYWRybShNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pCit7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgICAgbnNlY3NfdCB0aW1lc3RhbXAgPSBpdGVtLT5nZXRUaW1lc3RhbXAoKTsKKyAgICBzdGQ6OnN0cmluZyBwa2dOYW1lID0gaXRlbS0+Z2V0UGtnTmFtZSgpOworICAgIGludDY0X3QgcGtnVmVyc2lvbkNvZGUgPSBpdGVtLT5nZXRQa2dWZXJzaW9uQ29kZSgpOworICAgIGludDY0X3QgbWVkaWFBcGV4VmVyc2lvbiA9IDA7CisKKyAgICBjaGFyICp2ZW5kb3IgPSBOVUxMOworICAgICh2b2lkKSBpdGVtLT5nZXRDU3RyaW5nKCJ2ZW5kb3IiLCAmdmVuZG9yKTsKKyAgICBjaGFyICpkZXNjcmlwdGlvbiA9IE5VTEw7CisgICAgKHZvaWQpIGl0ZW0tPmdldENTdHJpbmcoImRlc2NyaXB0aW9uIiwgJmRlc2NyaXB0aW9uKTsKKyAgICBjaGFyICpzZXJpYWxpemVkX21ldHJpY3MgPSBOVUxMOworICAgICh2b2lkKSBpdGVtLT5nZXRDU3RyaW5nKCJzZXJpYWxpemVkX21ldHJpY3MiLCAmc2VyaWFsaXplZF9tZXRyaWNzKTsKKworICAgIGlmIChlbmFibGVkX3N0YXRzZCkgeworICAgICAgICBhbmRyb2lkOjp1dGlsOjpCeXRlc0ZpZWxkIGJmX3NlcmlhbGl6ZWQoc2VyaWFsaXplZF9tZXRyaWNzID8gc2VyaWFsaXplZF9tZXRyaWNzIDogTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRfbWV0cmljcyA/IHN0cmxlbihzZXJpYWxpemVkX21ldHJpY3MpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwKTsKKyAgICAgICAgYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX01FRElBRFJNX1JFUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIHBrZ05hbWUuY19zdHIoKSwgcGtnVmVyc2lvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQXBleFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlbmRvciwgZGVzY3JpcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmX3NlcmlhbGl6ZWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJOT1Qgc2VuZGluZzogbWVkaWFkcm0gcHJpdmF0ZSBkYXRhIChsZW49JXp1KSIsCisgICAgICAgICAgICAgIHNlcmlhbGl6ZWRfbWV0cmljcyA/IHN0cmxlbihzZXJpYWxpemVkX21ldHJpY3MpIDogMCk7CisgICAgfQorCisgICAgZnJlZSh2ZW5kb3IpOworICAgIGZyZWUoZGVzY3JpcHRpb24pOworICAgIGZyZWUoc2VyaWFsaXplZF9tZXRyaWNzKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLy8gd2lkZXZpbmVDRE0KK2Jvb2wgc3RhdHNkX3dpZGV2aW5lQ0RNKE1lZGlhQW5hbHl0aWNzSXRlbSAqaXRlbSkKK3sKKyAgICBpZiAoaXRlbSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CisKKyAgICBuc2Vjc190IHRpbWVzdGFtcCA9IGl0ZW0tPmdldFRpbWVzdGFtcCgpOworICAgIHN0ZDo6c3RyaW5nIHBrZ05hbWUgPSBpdGVtLT5nZXRQa2dOYW1lKCk7CisgICAgaW50NjRfdCBwa2dWZXJzaW9uQ29kZSA9IGl0ZW0tPmdldFBrZ1ZlcnNpb25Db2RlKCk7CisgICAgaW50NjRfdCBtZWRpYUFwZXhWZXJzaW9uID0gMDsKKworICAgIGNoYXIgKnNlcmlhbGl6ZWRfbWV0cmljcyA9IE5VTEw7CisgICAgKHZvaWQpIGl0ZW0tPmdldENTdHJpbmcoInNlcmlhbGl6ZWRfbWV0cmljcyIsICZzZXJpYWxpemVkX21ldHJpY3MpOworCisgICAgaWYgKGVuYWJsZWRfc3RhdHNkKSB7CisgICAgICAgIGFuZHJvaWQ6OnV0aWw6OkJ5dGVzRmllbGQgYmZfc2VyaWFsaXplZChzZXJpYWxpemVkX21ldHJpY3MgPyBzZXJpYWxpemVkX21ldHJpY3MgOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZF9tZXRyaWNzID8gc3RybGVuKHNlcmlhbGl6ZWRfbWV0cmljcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IDApOworICAgICAgICBhbmRyb2lkOjp1dGlsOjpzdGF0c193cml0ZShhbmRyb2lkOjp1dGlsOjpNRURJQU1FVFJJQ1NfRFJNX1dJREVWSU5FX1JFUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIHBrZ05hbWUuY19zdHIoKSwgcGtnVmVyc2lvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQXBleFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmX3NlcmlhbGl6ZWQpOworICAgIH0gZWxzZSB7CisgICAgICAgIEFMT0dWKCJOT1Qgc2VuZGluZzogd2lkZXZpbmUgcHJpdmF0ZSBkYXRhIChsZW49JXp1KSIsCisgICAgICAgICAgICAgIHNlcmlhbGl6ZWRfbWV0cmljcyA/IHN0cmxlbihzZXJpYWxpemVkX21ldHJpY3MpIDogMCk7CisgICAgfQorCisgICAgZnJlZShzZXJpYWxpemVkX21ldHJpY3MpOworICAgIHJldHVybiB0cnVlOworfQorCit9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9zdGF0c2RfZXh0cmFjdG9yLmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL3N0YXRzZF9leHRyYWN0b3IuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NDkzMGMKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9zdGF0c2RfZXh0cmFjdG9yLmNwcApAQCAtMCwwICsxLDk0IEBACisvKgorICogQ29weXJpZ2h0IChDKSAyMDE5IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8jZGVmaW5lIExPR19OREVCVUcgMAorI2RlZmluZSBMT0dfVEFHICJzdGF0c2RfZXh0cmFjdG9yIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3RhdHNsb2cuaD4KKworI2luY2x1ZGUgIk1lZGlhQW5hbHl0aWNzU2VydmljZS5oIgorI2luY2x1ZGUgImZyYW1ld29ya3MvYmFzZS9jb3JlL3Byb3RvL2FuZHJvaWQvc3RhdHMvbWVkaWFtZXRyaWNzL21lZGlhbWV0cmljcy5wYi5oIgorI2luY2x1ZGUgImlmYWNlX3N0YXRzZC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKK2Jvb2wgc3RhdHNkX2V4dHJhY3RvcihNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pCit7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgICAgLy8gdGhlc2UgZ28gaW50byB0aGUgc3RhdHNkIHdyYXBwZXIKKyAgICBuc2Vjc190IHRpbWVzdGFtcCA9IGl0ZW0tPmdldFRpbWVzdGFtcCgpOworICAgIHN0ZDo6c3RyaW5nIHBrZ05hbWUgPSBpdGVtLT5nZXRQa2dOYW1lKCk7CisgICAgaW50NjRfdCBwa2dWZXJzaW9uQ29kZSA9IGl0ZW0tPmdldFBrZ1ZlcnNpb25Db2RlKCk7CisgICAgaW50NjRfdCBtZWRpYUFwZXhWZXJzaW9uID0gMDsKKworCisgICAgLy8gdGhlIHJlc3QgaW50byBvdXIgb3duIHByb3RvCisgICAgLy8KKyAgICA6OmFuZHJvaWQ6OnN0YXRzOjptZWRpYW1ldHJpY3M6OkV4dHJhY3RvckRhdGEgbWV0cmljc19wcm90bzsKKworICAgIC8vIGZsZXNoIG91dCB0aGUgcHJvdG9idWYgd2UnbGwgaGFuZCBvZmYgd2l0aCBvdXIgZGF0YQorICAgIC8vCisKKyAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhZXh0cmFjdG9yLmZtdCAgICAgICAgIHN0cmluZworICAgIHN0ZDo6c3RyaW5nIGZtdDsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhZXh0cmFjdG9yLmZtdCIsICZmbXQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2Zvcm1hdChzdGQ6Om1vdmUoZm10KSk7CisgICAgfQorICAgIC8vIGFuZHJvaWQubWVkaWEubWVkaWFleHRyYWN0b3IubWltZSAgICAgICAgc3RyaW5nCisgICAgc3RkOjpzdHJpbmcgbWltZTsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhZXh0cmFjdG9yLm1pbWUiLCAmbWltZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfbWltZShzdGQ6Om1vdmUobWltZSkpOworICAgIH0KKyAgICAvLyBhbmRyb2lkLm1lZGlhLm1lZGlhZXh0cmFjdG9yLm50cmsgICAgICAgIGludDMyCisgICAgaW50MzJfdCBudHJrID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhZXh0cmFjdG9yLm50cmsiLCAmbnRyaykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfdHJhY2tzKG50cmspOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgICAgaWYgKCFtZXRyaWNzX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlcmlhbGl6ZSBleHRyYWN0b3IgbWV0cmljcyIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKGVuYWJsZWRfc3RhdHNkKSB7CisgICAgICAgIGFuZHJvaWQ6OnV0aWw6OkJ5dGVzRmllbGQgYmZfc2VyaWFsaXplZCggc2VyaWFsaXplZC5jX3N0cigpLCBzZXJpYWxpemVkLnNpemUoKSk7CisgICAgICAgICh2b2lkKWFuZHJvaWQ6OnV0aWw6OnN0YXRzX3dyaXRlKGFuZHJvaWQ6OnV0aWw6Ok1FRElBTUVUUklDU19FWFRSQUNUT1JfUkVQT1JURUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCwgcGtnTmFtZS5jX3N0cigpLCBwa2dWZXJzaW9uQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVkaWFBcGV4VmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmZfc2VyaWFsaXplZCk7CisKKyAgICB9IGVsc2UgeworICAgICAgICBBTE9HVigiTk9UIHNlbmRpbmc6IHByaXZhdGUgZGF0YSAobGVuPSV6dSkiLCBzdHJsZW4oc2VyaWFsaXplZC5jX3N0cigpKSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK307CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWFuYWx5dGljcy9zdGF0c2RfbnVwbGF5ZXIuY3BwIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3Mvc3RhdHNkX251cGxheWVyLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNmUwZjJjCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFhbmFseXRpY3Mvc3RhdHNkX251cGxheWVyLmNwcApAQCAtMCwwICsxLDE3MCBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxOSBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vI2RlZmluZSBMT0dfTkRFQlVHIDAKKyNkZWZpbmUgTE9HX1RBRyAic3RhdHNkX251cGxheWVyIgorI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgorCisjaW5jbHVkZSA8ZGlyZW50Lmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjaW5jbHVkZSA8cHdkLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8c3RhdHNsb2cuaD4KKworI2luY2x1ZGUgIk1lZGlhQW5hbHl0aWNzU2VydmljZS5oIgorI2luY2x1ZGUgImZyYW1ld29ya3MvYmFzZS9jb3JlL3Byb3RvL2FuZHJvaWQvc3RhdHMvbWVkaWFtZXRyaWNzL21lZGlhbWV0cmljcy5wYi5oIgorI2luY2x1ZGUgImlmYWNlX3N0YXRzZC5oIgorCituYW1lc3BhY2UgYW5kcm9pZCB7CisKKy8qCisgKiAgaGFuZGxlcyBudXBsYXllciBBTkQgbnVwbGF5ZXIyCisgKiAgY2hlY2tzIGZvciB0aGUgdW5pb24gb2Ygd2hhdCB0aGUgdHdvIHBsYXllcnMgZ2VuZXJhdGUKKyAqLworYm9vbCBzdGF0c2RfbnVwbGF5ZXIoTWVkaWFBbmFseXRpY3NJdGVtICppdGVtKQoreworICAgIGlmIChpdGVtID09IE5VTEwpIHJldHVybiBmYWxzZTsKKworICAgIC8vIHRoZXNlIGdvIGludG8gdGhlIHN0YXRzZCB3cmFwcGVyCisgICAgbnNlY3NfdCB0aW1lc3RhbXAgPSBpdGVtLT5nZXRUaW1lc3RhbXAoKTsKKyAgICBzdGQ6OnN0cmluZyBwa2dOYW1lID0gaXRlbS0+Z2V0UGtnTmFtZSgpOworICAgIGludDY0X3QgcGtnVmVyc2lvbkNvZGUgPSBpdGVtLT5nZXRQa2dWZXJzaW9uQ29kZSgpOworICAgIGludDY0X3QgbWVkaWFBcGV4VmVyc2lvbiA9IDA7CisKKworICAgIC8vIHRoZSByZXN0IGludG8gb3VyIG93biBwcm90bworICAgIC8vCisgICAgOjphbmRyb2lkOjpzdGF0czo6bWVkaWFtZXRyaWNzOjpOdVBsYXllckRhdGEgbWV0cmljc19wcm90bzsKKworICAgIC8vIGZsZXNoIG91dCB0aGUgcHJvdG9idWYgd2UnbGwgaGFuZCBvZmYgd2l0aCBvdXIgZGF0YQorICAgIC8vCisKKyAgICAvLyBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbnVwbGF5ZXIgYW5kIG51cGxheWVyMgorICAgIG1ldHJpY3NfcHJvdG8uc2V0X3doaWNocGxheWVyKGl0ZW0tPmdldEtleSgpLmNfc3RyKCkpOworCisgICAgc3RkOjpzdHJpbmcgdmlkZW9fbWltZTsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnZpZGVvLm1pbWUiLCAmdmlkZW9fbWltZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfdmlkZW9fbWltZShzdGQ6Om1vdmUodmlkZW9fbWltZSkpOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyB2aWRlb19jb2RlYzsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnZpZGVvLmNvZGVjIiwgJnZpZGVvX2NvZGVjKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF92aWRlb19jb2RlYyhzdGQ6Om1vdmUodmlkZW9fY29kZWMpKTsKKyAgICB9CisKKyAgICBpbnQzMl90IHdpZHRoID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLndpZHRoIiwgJndpZHRoKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF93aWR0aCh3aWR0aCk7CisgICAgfQorICAgIGludDMyX3QgaGVpZ2h0ID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmhlaWdodCIsICZoZWlnaHQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2hlaWdodChoZWlnaHQpOworICAgIH0KKworICAgIGludDY0X3QgZnJhbWVzID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmZyYW1lcyIsICZmcmFtZXMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2ZyYW1lcyhmcmFtZXMpOworICAgIH0KKyAgICBpbnQ2NF90IGZyYW1lc19kcm9wcGVkID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmRyb3BwZWQiLCAmZnJhbWVzX2Ryb3BwZWQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2ZyYW1lc19kcm9wcGVkKGZyYW1lc19kcm9wcGVkKTsKKyAgICB9CisgICAgaW50NjRfdCBmcmFtZXNfZHJvcHBlZF9zdGFydHVwID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnN0YXJ0dXBkcm9wcGVkIiwgJmZyYW1lc19kcm9wcGVkX3N0YXJ0dXApKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2ZyYW1lc19kcm9wcGVkX3N0YXJ0dXAoZnJhbWVzX2Ryb3BwZWRfc3RhcnR1cCk7CisgICAgfQorICAgIGRvdWJsZSBmcHMgPSAtMS4wOworICAgIGlmIChpdGVtLT5nZXREb3VibGUoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZnBzIiwgJmZwcykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZnJhbWVyYXRlKGZwcyk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgYXVkaW9fbWltZTsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmF1ZGlvLm1pbWUiLCAmYXVkaW9fbWltZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfYXVkaW9fbWltZShzdGQ6Om1vdmUoYXVkaW9fbWltZSkpOworICAgIH0KKyAgICBzdGQ6OnN0cmluZyBhdWRpb19jb2RlYzsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmF1ZGlvLmNvZGVjIiwgJmF1ZGlvX2NvZGVjKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hdWRpb19jb2RlYyhzdGQ6Om1vdmUoYXVkaW9fY29kZWMpKTsKKyAgICB9CisKKyAgICBpbnQ2NF90IGR1cmF0aW9uX21zID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmR1cmF0aW9uTXMiLCAmZHVyYXRpb25fbXMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2R1cmF0aW9uX21pbGxpcyhkdXJhdGlvbl9tcyk7CisgICAgfQorICAgIGludDY0X3QgcGxheWluZ19tcyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5wbGF5aW5nTXMiLCAmcGxheWluZ19tcykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcGxheWluZ19taWxsaXMocGxheWluZ19tcyk7CisgICAgfQorCisgICAgaW50MzJfdCBlcnIgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIuZXJyIiwgJmVycikpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZXJyb3IoZXJyKTsKKyAgICB9CisgICAgaW50MzJfdCBlcnJvcl9jb2RlID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmVycmNvZGUiLCAmZXJyb3JfY29kZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZXJyb3JfY29kZShlcnJvcl9jb2RlKTsKKyAgICB9CisgICAgc3RkOjpzdHJpbmcgZXJyb3Jfc3RhdGU7CisgICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5lcnJzdGF0ZSIsICZlcnJvcl9zdGF0ZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZXJyb3Jfc3RhdGUoc3RkOjptb3ZlKGVycm9yX3N0YXRlKSk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZGF0YV9zb3VyY2VfdHlwZTsKKyAgICBpZiAoaXRlbS0+Z2V0U3RyaW5nKCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLmRhdGFTb3VyY2UiLCAmZGF0YV9zb3VyY2VfdHlwZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfZGF0YV9zb3VyY2VfdHlwZShzdGQ6Om1vdmUoZGF0YV9zb3VyY2VfdHlwZSkpOworICAgIH0KKworICAgIGludDY0X3QgcmVidWZmZXJpbmdNcyA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQ2NCgiYW5kcm9pZC5tZWRpYS5tZWRpYXBsYXllci5yZWJ1ZmZlcmluZ01zIiwgJnJlYnVmZmVyaW5nTXMpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3JlYnVmZmVyaW5nX21pbGxpcyhyZWJ1ZmZlcmluZ01zKTsKKyAgICB9CisgICAgaW50MzJfdCByZWJ1ZmZlcnMgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFwbGF5ZXIucmVidWZmZXJzIiwgJnJlYnVmZmVycykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcmVidWZmZXJzKHJlYnVmZmVycyk7CisgICAgfQorICAgIGludDMyX3QgcmVidWZmZXJFeGl0ID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcGxheWVyLnJlYnVmZmVyRXhpdCIsICZyZWJ1ZmZlckV4aXQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3JlYnVmZmVyX2F0X2V4aXQocmVidWZmZXJFeGl0KTsKKyAgICB9CisKKworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgICAgaWYgKCFtZXRyaWNzX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlcmlhbGl6ZSBudXBsYXllciBtZXRyaWNzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZW5hYmxlZF9zdGF0c2QpIHsKKyAgICAgICAgYW5kcm9pZDo6dXRpbDo6Qnl0ZXNGaWVsZCBiZl9zZXJpYWxpemVkKCBzZXJpYWxpemVkLmNfc3RyKCksIHNlcmlhbGl6ZWQuc2l6ZSgpKTsKKyAgICAgICAgKHZvaWQpYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX05VUExBWUVSX1JFUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIHBrZ05hbWUuY19zdHIoKSwgcGtnVmVyc2lvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQXBleFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmX3NlcmlhbGl6ZWQpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIk5PVCBzZW5kaW5nOiBwcml2YXRlIGRhdGEgKGxlbj0lenUpIiwgc3RybGVuKHNlcmlhbGl6ZWQuY19zdHIoKSkpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFhbmFseXRpY3Mvc3RhdHNkX3JlY29yZGVyLmNwcCBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL3N0YXRzZF9yZWNvcmRlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDI4NmYwMAotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhYW5hbHl0aWNzL3N0YXRzZF9yZWNvcmRlci5jcHAKQEAgLTAsMCArMSwxODkgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgInN0YXRzZF9yZWNvcmRlciIKKyNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KKworI2luY2x1ZGUgPGRpcmVudC5oPgorI2luY2x1ZGUgPGludHR5cGVzLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2luY2x1ZGUgPHB3ZC5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8c3lzL3RpbWUuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHN0YXRzbG9nLmg+CisKKyNpbmNsdWRlICJNZWRpYUFuYWx5dGljc1NlcnZpY2UuaCIKKyNpbmNsdWRlICJmcmFtZXdvcmtzL2Jhc2UvY29yZS9wcm90by9hbmRyb2lkL3N0YXRzL21lZGlhbWV0cmljcy9tZWRpYW1ldHJpY3MucGIuaCIKKyNpbmNsdWRlICJpZmFjZV9zdGF0c2QuaCIKKworbmFtZXNwYWNlIGFuZHJvaWQgeworCitib29sIHN0YXRzZF9yZWNvcmRlcihNZWRpYUFuYWx5dGljc0l0ZW0gKml0ZW0pCit7CisgICAgaWYgKGl0ZW0gPT0gTlVMTCkgcmV0dXJuIGZhbHNlOworCisgICAgLy8gdGhlc2UgZ28gaW50byB0aGUgc3RhdHNkIHdyYXBwZXIKKyAgICBuc2Vjc190IHRpbWVzdGFtcCA9IGl0ZW0tPmdldFRpbWVzdGFtcCgpOworICAgIHN0ZDo6c3RyaW5nIHBrZ05hbWUgPSBpdGVtLT5nZXRQa2dOYW1lKCk7CisgICAgaW50NjRfdCBwa2dWZXJzaW9uQ29kZSA9IGl0ZW0tPmdldFBrZ1ZlcnNpb25Db2RlKCk7CisgICAgaW50NjRfdCBtZWRpYUFwZXhWZXJzaW9uID0gMDsKKworCisgICAgLy8gdGhlIHJlc3QgaW50byBvdXIgb3duIHByb3RvCisgICAgLy8KKyAgICA6OmFuZHJvaWQ6OnN0YXRzOjptZWRpYW1ldHJpY3M6OlJlY29yZGVyRGF0YSBtZXRyaWNzX3Byb3RvOworCisgICAgLy8gZmxlc2ggb3V0IHRoZSBwcm90b2J1ZiB3ZSdsbCBoYW5kIG9mZiB3aXRoIG91ciBkYXRhCisgICAgLy8KKworICAgIC8vIHN0cmluZyBrUmVjb3JkZXJBdWRpb01pbWUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmF1ZGlvLm1pbWUiOworICAgIHN0ZDo6c3RyaW5nIGF1ZGlvX21pbWU7CisgICAgaWYgKGl0ZW0tPmdldFN0cmluZygiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmF1ZGlvLm1pbWUiLCAmYXVkaW9fbWltZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfYXVkaW9fbWltZShzdGQ6Om1vdmUoYXVkaW9fbWltZSkpOworICAgIH0KKyAgICAvLyBzdHJpbmcga1JlY29yZGVyVmlkZW9NaW1lID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby5taW1lIjsKKyAgICBzdGQ6OnN0cmluZyB2aWRlb19taW1lOworICAgIGlmIChpdGVtLT5nZXRTdHJpbmcoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby5taW1lIiwgJnZpZGVvX21pbWUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3ZpZGVvX21pbWUoc3RkOjptb3ZlKHZpZGVvX21pbWUpKTsKKyAgICB9CisgICAgLy8gaW50MzIga1JlY29yZGVyVmlkZW9Qcm9maWxlID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby1lbmNvZGVyLXByb2ZpbGUiOworICAgIGludDMyX3QgdmlkZW9Qcm9maWxlID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIudmlkZW8tZW5jb2Rlci1wcm9maWxlIiwgJnZpZGVvUHJvZmlsZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfdmlkZW9fcHJvZmlsZSh2aWRlb1Byb2ZpbGUpOworICAgIH0KKyAgICAvLyBpbnQzMiBrUmVjb3JkZXJWaWRlb0xldmVsID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby1lbmNvZGVyLWxldmVsIjsKKyAgICBpbnQzMl90IHZpZGVvTGV2ZWwgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci52aWRlby1lbmNvZGVyLWxldmVsIiwgJnZpZGVvTGV2ZWwpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3ZpZGVvX2xldmVsKHZpZGVvTGV2ZWwpOworICAgIH0KKyAgICAvLyBpbnQzMiBrUmVjb3JkZXJXaWR0aCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIud2lkdGgiOworICAgIGludDMyX3Qgd2lkdGggPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci53aWR0aCIsICZ3aWR0aCkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfd2lkdGgod2lkdGgpOworICAgIH0KKyAgICAvLyBpbnQzMiBrUmVjb3JkZXJIZWlnaHQgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmhlaWdodCI7CisgICAgaW50MzJfdCBoZWlnaHQgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5oZWlnaHQiLCAmaGVpZ2h0KSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9oZWlnaHQoaGVpZ2h0KTsKKyAgICB9CisgICAgLy8gaW50MzIga1JlY29yZGVyUm90YXRpb24gPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnJvdGF0aW9uIjsKKyAgICBpbnQzMl90IHJvdGF0aW9uID0gLTE7ICAgICAgICAgICAgICAgICAgICAgIC8vIGRlZmF1bHQgdG8gMD8KKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5yb3RhdGlvbiIsICZyb3RhdGlvbikpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcm90YXRpb24ocm90YXRpb24pOworICAgIH0KKyAgICAvLyBpbnQzMiBrUmVjb3JkZXJGcmFtZVJhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmZyYW1lLXJhdGUiOworICAgIGludDMyX3QgZnJhbWVyYXRlID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuZnJhbWUtcmF0ZSIsICZmcmFtZXJhdGUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X2ZyYW1lcmF0ZShmcmFtZXJhdGUpOworICAgIH0KKworICAgIC8vIGludDMyIGtSZWNvcmRlckNhcHR1cmVGcHMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmNhcHR1cmUtZnBzIjsKKyAgICBpbnQzMl90IGNhcHR1cmVGcHMgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5jYXB0dXJlLWZwcyIsICZjYXB0dXJlRnBzKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jYXB0dXJlX2ZwcyhjYXB0dXJlRnBzKTsKKyAgICB9CisgICAgLy8gZG91YmxlIGtSZWNvcmRlckNhcHR1cmVGcHNFbmFibGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmNhcHR1cmUtZnBzZW5hYmxlIjsKKyAgICBkb3VibGUgY2FwdHVyZUZwc0VuYWJsZSA9IC0xOworICAgIGlmIChpdGVtLT5nZXREb3VibGUoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5jYXB0dXJlLWZwc2VuYWJsZSIsICZjYXB0dXJlRnBzRW5hYmxlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9jYXB0dXJlX2Zwc19lbmFibGUoY2FwdHVyZUZwc0VuYWJsZSk7CisgICAgfQorCisgICAgLy8gaW50NjQga1JlY29yZGVyRHVyYXRpb25NcyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuZHVyYXRpb25NcyI7CisgICAgaW50NjRfdCBkdXJhdGlvbk1zID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDY0KCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuZHVyYXRpb25NcyIsICZkdXJhdGlvbk1zKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9kdXJhdGlvbl9taWxsaXMoZHVyYXRpb25Ncyk7CisgICAgfQorICAgIC8vIGludDY0IGtSZWNvcmRlclBhdXNlZCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIucGF1c2VkTXMiOworICAgIGludDY0X3QgcGF1c2VkTXMgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50NjQoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5wYXVzZWRNcyIsICZwYXVzZWRNcykpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfcGF1c2VkX21pbGxpcyhwYXVzZWRNcyk7CisgICAgfQorICAgIC8vIGludDMyIGtSZWNvcmRlck51bVBhdXNlcyA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIuTlBhdXNlcyI7CisgICAgaW50MzJfdCBwYXVzZWRDb3VudCA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLk5QYXVzZXMiLCAmcGF1c2VkQ291bnQpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3BhdXNlZF9jb3VudChwYXVzZWRDb3VudCk7CisgICAgfQorCisgICAgLy8gaW50MzIga1JlY29yZGVyQXVkaW9CaXRyYXRlID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5hdWRpby1iaXRyYXRlIjsKKyAgICBpbnQzMl90IGF1ZGlvQml0cmF0ZSA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmF1ZGlvLWJpdHJhdGUiLCAmYXVkaW9CaXRyYXRlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hdWRpb19iaXRyYXRlKGF1ZGlvQml0cmF0ZSk7CisgICAgfQorICAgIC8vIGludDMyIGtSZWNvcmRlckF1ZGlvQ2hhbm5lbHMgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmF1ZGlvLWNoYW5uZWxzIjsKKyAgICBpbnQzMl90IGF1ZGlvQ2hhbm5lbHMgPSAtMTsKKyAgICBpZiAoaXRlbS0+Z2V0SW50MzIoImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5hdWRpby1jaGFubmVscyIsICZhdWRpb0NoYW5uZWxzKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hdWRpb19jaGFubmVscyhhdWRpb0NoYW5uZWxzKTsKKyAgICB9CisgICAgLy8gaW50MzIga1JlY29yZGVyQXVkaW9TYW1wbGVSYXRlID0gImFuZHJvaWQubWVkaWEubWVkaWFyZWNvcmRlci5hdWRpby1zYW1wbGVyYXRlIjsKKyAgICBpbnQzMl90IGF1ZGlvU2FtcGxlUmF0ZSA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmF1ZGlvLXNhbXBsZXJhdGUiLCAmYXVkaW9TYW1wbGVSYXRlKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9hdWRpb19zYW1wbGVyYXRlKGF1ZGlvU2FtcGxlUmF0ZSk7CisgICAgfQorCisgICAgLy8gaW50MzIga1JlY29yZGVyTW92aWVUaW1lc2NhbGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLm1vdmllLXRpbWVzY2FsZSI7CisgICAgaW50MzJfdCBtb3ZpZVRpbWVzY2FsZSA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLm1vdmllLXRpbWVzY2FsZSIsICZtb3ZpZVRpbWVzY2FsZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfbW92aWVfdGltZXNjYWxlKG1vdmllVGltZXNjYWxlKTsKKyAgICB9CisgICAgLy8gaW50MzIga1JlY29yZGVyQXVkaW9UaW1lc2NhbGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmF1ZGlvLXRpbWVzY2FsZSI7CisgICAgaW50MzJfdCBhdWRpb1RpbWVzY2FsZSA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLmF1ZGlvLXRpbWVzY2FsZSIsICZhdWRpb1RpbWVzY2FsZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfYXVkaW9fdGltZXNjYWxlKGF1ZGlvVGltZXNjYWxlKTsKKyAgICB9CisgICAgLy8gaW50MzIga1JlY29yZGVyVmlkZW9UaW1lc2NhbGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnZpZGVvLXRpbWVzY2FsZSI7CisgICAgaW50MzJfdCB2aWRlb1RpbWVzY2FsZSA9IC0xOworICAgIGlmIChpdGVtLT5nZXRJbnQzMigiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnZpZGVvLXRpbWVzY2FsZSIsICZ2aWRlb1RpbWVzY2FsZSkpIHsKKyAgICAgICAgbWV0cmljc19wcm90by5zZXRfdmlkZW9fdGltZXNjYWxlKHZpZGVvVGltZXNjYWxlKTsKKyAgICB9CisKKyAgICAvLyBpbnQzMiBrUmVjb3JkZXJWaWRlb0JpdHJhdGUgPSAiYW5kcm9pZC5tZWRpYS5tZWRpYXJlY29yZGVyLnZpZGVvLWJpdHJhdGUiOworICAgIGludDMyX3QgdmlkZW9CaXRSYXRlID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIudmlkZW8tYml0cmF0ZSIsICZ2aWRlb0JpdFJhdGUpKSB7CisgICAgICAgIG1ldHJpY3NfcHJvdG8uc2V0X3ZpZGVvX2JpdHJhdGUodmlkZW9CaXRSYXRlKTsKKyAgICB9CisgICAgLy8gaW50MzIga1JlY29yZGVyVmlkZW9JZnJhbWVJbnRlcnZhbCA9ICJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIudmlkZW8taWZyYW1lLWludGVydmFsIjsKKyAgICBpbnQzMl90IGlGcmFtZUludGVydmFsID0gLTE7CisgICAgaWYgKGl0ZW0tPmdldEludDMyKCJhbmRyb2lkLm1lZGlhLm1lZGlhcmVjb3JkZXIudmlkZW8taWZyYW1lLWludGVydmFsIiwgJmlGcmFtZUludGVydmFsKSkgeworICAgICAgICBtZXRyaWNzX3Byb3RvLnNldF9pZnJhbWVfaW50ZXJ2YWwoaUZyYW1lSW50ZXJ2YWwpOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIHNlcmlhbGl6ZWQ7CisgICAgaWYgKCFtZXRyaWNzX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCZzZXJpYWxpemVkKSkgeworICAgICAgICBBTE9HRSgiRmFpbGVkIHRvIHNlcmlhbGl6ZSByZWNvcmRlciBtZXRyaWNzIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoZW5hYmxlZF9zdGF0c2QpIHsKKyAgICAgICAgYW5kcm9pZDo6dXRpbDo6Qnl0ZXNGaWVsZCBiZl9zZXJpYWxpemVkKCBzZXJpYWxpemVkLmNfc3RyKCksIHNlcmlhbGl6ZWQuc2l6ZSgpKTsKKyAgICAgICAgKHZvaWQpYW5kcm9pZDo6dXRpbDo6c3RhdHNfd3JpdGUoYW5kcm9pZDo6dXRpbDo6TUVESUFNRVRSSUNTX1JFQ09SREVSX1JFUE9SVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIHBrZ05hbWUuY19zdHIoKSwgcGtnVmVyc2lvbkNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lZGlhQXBleFZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJmX3NlcmlhbGl6ZWQpOworCisgICAgfSBlbHNlIHsKKyAgICAgICAgQUxPR1YoIk5PVCBzZW5kaW5nOiBwcml2YXRlIGRhdGEgKGxlbj0lenUpIiwgc3RybGVuKHNlcmlhbGl6ZWQuY19zdHIoKSkpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCit9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzMTk0MjUKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw2MiBAQAorY2NfYmluYXJ5IHsKKyAgICBuYW1lOiAibWVkaWFzd2NvZGVjIiwKKyAgICB2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlLAorCisgICAgc3JjczogWworICAgICAgICAibWFpbl9zd2NvZGVjc2VydmljZS5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGliYXZzZXJ2aWNlc19taW5pamFpbCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmxvZyIsCisgICAgICAgICJsaWJtZWRpYV9jb2RlY3NlcnZpY2VyZWdpc3RyYW50IiwKKyAgICBdLAorCisgICAgdGFyZ2V0OiB7CisgICAgICAgIGFuZHJvaWQ6IHsKKyAgICAgICAgICAgIHByb2R1Y3RfdmFyaWFibGVzOiB7CisgICAgICAgICAgICAgICAgbWFsbG9jX25vdF9zdmVsdGU6IHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU2N1ZG8gaW5jcmVhc2VzIG1lbW9yeSBmb290cHJpbnQsIHNvIG9ubHkgZW5hYmxlIG9uCisgICAgICAgICAgICAgICAgICAgIC8vIG5vbi1zdmVsdGUgZGV2aWNlcy4KKyAgICAgICAgICAgICAgICAgICAgc2hhcmVkX2xpYnM6IFsibGliY19zY3VkbyJdLAorICAgICAgICAgICAgICAgIH0sCisgICAgICAgICAgICB9LAorICAgICAgICB9LAorICAgIH0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKKworICAgIGluaXRfcmM6IFsibWVkaWFzd2NvZGVjLnJjIl0sCisKKyAgICByZXF1aXJlZDogWyJtZWRpYXN3Y29kZWMucG9saWN5Il0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XZXJyb3IiLAorICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVduby1lcnJvcj1kZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIsCisgICAgXSwKK30KKworcHJlYnVpbHRfZXRjIHsKKyAgICBuYW1lOiAibWVkaWFzd2NvZGVjLnBvbGljeSIsCisgICAgc3ViX2RpcjogInNlY2NvbXBfcG9saWN5IiwKKyAgICBhcmNoOiB7CisgICAgICAgIGFybTogeworICAgICAgICAgICAgc3JjOiAic2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybS5wb2xpY3kiLAorICAgICAgICB9LAorICAgICAgICBhcm02NDogeworICAgICAgICAgICAgc3JjOiAic2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybTY0LnBvbGljeSIsCisgICAgICAgIH0sCisgICAgICAgIHg4NjogeworICAgICAgICAgICAgc3JjOiAic2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5IiwKKyAgICAgICAgfSwKKyAgICAgICAgeDg2XzY0OiB7CisgICAgICAgICAgICBzcmM6ICJzZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kiLAorICAgICAgICB9LAorICAgIH0sCisgICAgcmVxdWlyZWQ6IFsiY3Jhc2hfZHVtcC5wb2xpY3kiXSwKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5tayBiL3NlcnZpY2VzL21lZGlhY29kZWMvQW5kcm9pZC5tawppbmRleCBkYjVmMGZmLi5jZGQ5ZDBjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL0FuZHJvaWQubWsKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9BbmRyb2lkLm1rCkBAIC0yMiwyNSArMjIsMjQgQEAKICAgICBsaWJzdGFnZWZyaWdodF9zb2Z0X3ZvcmJpc2RlYyBcCiAgICAgbGlic3RhZ2VmcmlnaHRfc29mdF92cHhkZWMgXAogICAgIGxpYnN0YWdlZnJpZ2h0X3NvZnRfdnB4ZW5jIFwKKyAgICBsaWJzdGFnZWZyaWdodF9zb2Z0b214X3BsdWdpbiBcCiAKICMgc2VydmljZSBleGVjdXRhYmxlCiBpbmNsdWRlICQoQ0xFQVJfVkFSUykKICMgc2VjY29tcCBpcyBub3QgcmVxdWlyZWQgZm9yIGNvdmVyYWdlIGJ1aWxkLgogaWZuZXEgKCQoTkFUSVZFX0NPVkVSQUdFKSx0cnVlKQotTE9DQUxfUkVRVUlSRURfTU9EVUxFU19hcm0gOj0gY3Jhc2hfZHVtcC5wb2xpY3kgbWVkaWFjb2RlYy5wb2xpY3kKLUxPQ0FMX1JFUVVJUkVEX01PRFVMRVNfeDg2IDo9IGNyYXNoX2R1bXAucG9saWN5IG1lZGlhY29kZWMucG9saWN5CitMT0NBTF9SRVFVSVJFRF9NT0RVTEVTX2FybSA6PSBtZWRpYWNvZGVjLnBvbGljeQorTE9DQUxfUkVRVUlSRURfTU9EVUxFU194ODYgOj0gbWVkaWFjb2RlYy5wb2xpY3kKIGVuZGlmCiBMT0NBTF9TUkNfRklMRVMgOj0gbWFpbl9jb2RlY3NlcnZpY2UuY3BwCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IFwKLSAgICBsaWJtZWRpYV9vbXggXAogICAgIGxpYmJpbmRlciBcCiAgICAgbGlidXRpbHMgXAogICAgIGxpYmxvZyBcCiAgICAgbGliYmFzZSBcCi0gICAgbGliYXZzZXJ2aWNlc19taW5pamFpbF92ZW5kb3IgXAorICAgIGxpYmF2c2VydmljZXNfbWluaWphaWwgXAogICAgIGxpYmN1dGlscyBcCi0gICAgbGliaHdiaW5kZXIgXAotICAgIGxpYmhpZGx0cmFuc3BvcnQgXAorICAgIGxpYmhpZGxiYXNlIFwKICAgICBsaWJzdGFnZWZyaWdodF9vbXggXAogICAgIGxpYnN0YWdlZnJpZ2h0X3htbHBhcnNlciBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5tZWRpYS5vbXhAMS4wIFwKQEAgLTYzLDEyICs2MiwxNSBAQAogCiBpbmNsdWRlICQoQlVJTERfRVhFQ1VUQUJMRSkKIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKwogIyBzZXJ2aWNlIHNlY2NvbXAgcG9saWN5CiBpZmVxICgkKFRBUkdFVF9BUkNIKSwgJChmaWx0ZXIgJChUQVJHRVRfQVJDSCksIHg4NiB4ODZfNjQgYXJtIGFybTY0KSkKIGluY2x1ZGUgJChDTEVBUl9WQVJTKQogTE9DQUxfTU9EVUxFIDo9IG1lZGlhY29kZWMucG9saWN5CiBMT0NBTF9NT0RVTEVfQ0xBU1MgOj0gRVRDCiBMT0NBTF9NT0RVTEVfUEFUSCA6PSAkKFRBUkdFVF9PVVQpL2V0Yy9zZWNjb21wX3BvbGljeQorTE9DQUxfUkVRVUlSRURfTU9EVUxFUyA6PSBjcmFzaF9kdW1wLnBvbGljeQogIyBtZWRpYWNvZGVjIHJ1bnMgaW4gMzItYml0IGNvbWJhdGliaWxpdHkgbW9kZS4gRm9yIDY0IGJpdCBhcmNoaXRlY3R1cmVzLAogIyB1c2UgdGhlIDMyIGJpdCBwb2xpY3kKIGlmZGVmIFRBUkdFVF8yTkRfQVJDSApAQCAtODMsNCArODUsNyBAQAogaW5jbHVkZSAkKEJVSUxEX1BSRUJVSUxUKQogZW5kaWYKIAorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworCiBpbmNsdWRlICQoY2FsbCBhbGwtbWFrZWZpbGVzLXVuZGVyLCAkKExPQ0FMX1BBVEgpKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX2NvZGVjc2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcAppbmRleCA1MTYxOWY2Li42YTgyYjFiIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fY29kZWNzZXJ2aWNlLmNwcApAQCAtMjEsMTEgKzIxLDExIEBACiAjaW5jbHVkZSAibWluaWphaWwuaCIKIAogI2luY2x1ZGUgPGJpbmRlci9Qcm9jZXNzU3RhdGUuaD4KKyNpbmNsdWRlIDxjdXRpbHMvcHJvcGVydGllcy5oPgogI2luY2x1ZGUgPGhpZGwvSGlkbFRyYW5zcG9ydFN1cHBvcnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9vbXgvMS4wL09teC5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L29teC8xLjAvT214U3RvcmUuaD4KIAotI2luY2x1ZGUgPG1lZGlhL0NvZGVjU2VydmljZVJlZ2lzdHJhbnQuaD4KICNpbmNsdWRlIDxkbGZjbi5oPgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKQEAgLTQ4LDM3ICs0OCwyMiBAQAogCiAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6Y29uZmlndXJlUnBjVGhyZWFkcG9vbCg2NCwgZmFsc2UpOwogCi0gICAgLy8gUmVnaXN0cmF0aW9uIG9mIGN1c3RvbWl6ZWQgY29kZWMgc2VydmljZXMKLSAgICB2b2lkICpyZWdpc3RyYW50TGliID0gZGxvcGVuKAotICAgICAgICAgICAgImxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQuc28iLAotICAgICAgICAgICAgUlRMRF9OT1cgfCBSVExEX0xPQ0FMKTsKLSAgICBpZiAocmVnaXN0cmFudExpYikgewotICAgICAgICBSZWdpc3RlckNvZGVjU2VydmljZXNGdW5jIHJlZ2lzdGVyQ29kZWNTZXJ2aWNlcyA9Ci0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxSZWdpc3RlckNvZGVjU2VydmljZXNGdW5jPigKLSAgICAgICAgICAgICAgICBkbHN5bShyZWdpc3RyYW50TGliLCAiUmVnaXN0ZXJDb2RlY1NlcnZpY2VzIikpOwotICAgICAgICBpZiAocmVnaXN0ZXJDb2RlY1NlcnZpY2VzKSB7Ci0gICAgICAgICAgICByZWdpc3RlckNvZGVjU2VydmljZXMoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIExPRyhXQVJOSU5HKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIGFkZGl0aW9uYWwgc2VydmljZXMgIgotICAgICAgICAgICAgICAgICAgICAiLS0gY29ycnVwdGVkIGxpYnJhcnkuIjsKLSAgICAgICAgfQorICAgIC8vIERlZmF1bHQgY29kZWMgc2VydmljZXMKKyAgICB1c2luZyBuYW1lc3BhY2UgOjphbmRyb2lkOjpoYXJkd2FyZTo6bWVkaWE6Om9teDo6VjFfMDsKKyAgICBzcDxJT214PiBvbXggPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teCgpOworICAgIGlmIChvbXggPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgY3JlYXRlIElPbXggSEFMIHNlcnZpY2UuIjsKKyAgICB9IGVsc2UgaWYgKG9teC0+cmVnaXN0ZXJBc1NlcnZpY2UoKSAhPSBPSykgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgcmVnaXN0ZXIgSU9teCBIQUwgc2VydmljZS4iOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIERlZmF1bHQgY29kZWMgc2VydmljZXMKLSAgICAgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpvbXg6OlYxXzA7Ci0gICAgICAgIHNwPElPbXhTdG9yZT4gb214U3RvcmUgPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teFN0b3JlKCk7Ci0gICAgICAgIGlmIChvbXhTdG9yZSA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgY3JlYXRlIElPbXhTdG9yZSBIQUwgc2VydmljZS4iOwotICAgICAgICB9IGVsc2UgaWYgKG9teFN0b3JlLT5yZWdpc3RlckFzU2VydmljZSgpICE9IE9LKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgcmVnaXN0ZXIgSU9teFN0b3JlIEhBTCBzZXJ2aWNlLiI7Ci0gICAgICAgIH0KLSAgICAgICAgc3A8SU9teD4gb214ID0gbmV3IGltcGxlbWVudGF0aW9uOjpPbXgoKTsKLSAgICAgICAgaWYgKG9teCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgY3JlYXRlIElPbXggSEFMIHNlcnZpY2UuIjsKLSAgICAgICAgfSBlbHNlIGlmIChvbXgtPnJlZ2lzdGVyQXNTZXJ2aWNlKCkgIT0gT0spIHsKLSAgICAgICAgICAgIExPRyhFUlJPUikgPDwgIkNhbm5vdCByZWdpc3RlciBJT214IEhBTCBzZXJ2aWNlLiI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBMT0coSU5GTykgPDwgIklPbXggSEFMIHNlcnZpY2UgY3JlYXRlZC4iOwotICAgICAgICB9CisgICAgICAgIExPRyhJTkZPKSA8PCAiSU9teCBIQUwgc2VydmljZSBjcmVhdGVkLiI7CisgICAgfQorICAgIHNwPElPbXhTdG9yZT4gb214U3RvcmUgPSBuZXcgaW1wbGVtZW50YXRpb246Ok9teFN0b3JlKAorICAgICAgICAgICAgcHJvcGVydHlfZ2V0X2ludDY0KCJ2ZW5kb3IubWVkaWEub214IiwgMSkgPyBvbXggOiBudWxscHRyKTsKKyAgICBpZiAob214U3RvcmUgPT0gbnVsbHB0cikgeworICAgICAgICBMT0coRVJST1IpIDw8ICJDYW5ub3QgY3JlYXRlIElPbXhTdG9yZSBIQUwgc2VydmljZS4iOworICAgIH0gZWxzZSBpZiAob214U3RvcmUtPnJlZ2lzdGVyQXNTZXJ2aWNlKCkgIT0gT0spIHsKKyAgICAgICAgTE9HKEVSUk9SKSA8PCAiQ2Fubm90IHJlZ2lzdGVyIElPbXhTdG9yZSBIQUwgc2VydmljZS4iOwogICAgIH0KIAogICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmpvaW5ScGNUaHJlYWRwb29sKCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL21haW5fc3djb2RlY3NlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX3N3Y29kZWNzZXJ2aWNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTFiNzg4Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tYWluX3N3Y29kZWNzZXJ2aWNlLmNwcApAQCAtMCwwICsxLDQ4IEBACisvKgorKioKKyoqIENvcHlyaWdodCAyMDE4LCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0CisqKgorKiogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisqKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisqKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyoqCisqKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisqKgorKiogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorKiogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyoqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorKiogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisqLworCisjaW5jbHVkZSA8YW5kcm9pZC1iYXNlL2xvZ2dpbmcuaD4KKworLy8gZnJvbSBMT0NBTF9DX0lOQ0xVREVTCisjaW5jbHVkZSAibWluaWphaWwuaCIKKyNpbmNsdWRlIDxoaWRsL0hpZGxUcmFuc3BvcnRTdXBwb3J0Lmg+CisKK3VzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOworCisvLyBrU3lzdGVtU2VjY29tcFBvbGljeVBhdGggcG9pbnRzIHRvIHRoZSBwb2xpY3kgZm9yIHRoZSBzd2NvZGVjcyB0aGVtc2VsdmVzIGFuZAorLy8gaXMgcGFydCBvZiB0aGUgdXBkYXRlcy4ga1ZlbmRvclNlY2NvbXBQb2xpY3lQYXRoIHBvaW50cyB0byBhbnkgYWRkaXRpb25hbAorLy8gcG9saWNpZXMgdGhhdCB0aGUgdmVuZG9yIG1heSBuZWVkIGZvciB0aGUgZGV2aWNlLgorc3RhdGljIGNvbnN0IGNoYXIga1N5c3RlbVNlY2NvbXBQb2xpY3lQYXRoW10gPQorICAgICAgICAiL2FwZXgvY29tLmFuZHJvaWQubWVkaWEuc3djb2RlYy9ldGMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLnBvbGljeSI7CitzdGF0aWMgY29uc3QgY2hhciBrVmVuZG9yU2VjY29tcFBvbGljeVBhdGhbXSA9CisgICAgICAgICIvdmVuZG9yL2V0Yy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMucG9saWN5IjsKKworZXh0ZXJuICJDIiB2b2lkIFJlZ2lzdGVyQ29kZWNTZXJ2aWNlcygpOworCitpbnQgbWFpbihpbnQgYXJnYyBfX3VudXNlZCwgY2hhcioqIGFyZ3YpCit7CisgICAgTE9HKElORk8pIDw8ICJtZWRpYSBzd2NvZGVjIHNlcnZpY2Ugc3RhcnRpbmciOworICAgIHNpZ25hbChTSUdQSVBFLCBTSUdfSUdOKTsKKyAgICBTZXRVcE1pbmlqYWlsKGtTeXN0ZW1TZWNjb21wUG9saWN5UGF0aCwga1ZlbmRvclNlY2NvbXBQb2xpY3lQYXRoKTsKKyAgICBzdHJjcHkoYXJndlswXSwgIm1lZGlhLnN3Y29kZWMiKTsKKworICAgIDo6YW5kcm9pZDo6aGFyZHdhcmU6OmNvbmZpZ3VyZVJwY1RocmVhZHBvb2woNjQsIGZhbHNlKTsKKworICAgIFJlZ2lzdGVyQ29kZWNTZXJ2aWNlcygpOworCisgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6am9pblJwY1RocmVhZHBvb2woKTsKK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvbWVkaWFzd2NvZGVjLnJjIGIvc2VydmljZXMvbWVkaWFjb2RlYy9tZWRpYXN3Y29kZWMucmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzU0OTY2NgotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvbWVkaWFzd2NvZGVjLnJjCkBAIC0wLDAgKzEsNyBAQAorc2VydmljZSBtZWRpYS5zd2NvZGVjIC9zeXN0ZW0vYmluL21lZGlhc3djb2RlYworICAgIGNsYXNzIG1haW4KKyAgICB1c2VyIG1lZGlhY29kZWMKKyAgICBncm91cCBjYW1lcmEgZHJtcnBjIG1lZGlhZHJtCisgICAgdXBkYXRhYmxlCisgICAgaW9wcmlvIHJ0IDQKKyAgICB3cml0ZXBpZCAvZGV2L2NwdXNldC9mb3JlZ3JvdW5kL3Rhc2tzCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNWJjNGEKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQW5kcm9pZC5icApAQCAtMCwwICsxLDU1IEBACitjY19saWJyYXJ5X3NoYXJlZCB7CisgICAgbmFtZTogImxpYm1lZGlhX2NvZGVjc2VydmljZXJlZ2lzdHJhbnQiLAorICAgIHZlbmRvcl9hdmFpbGFibGU6IHRydWUsCisgICAgc3JjczogWworICAgICAgICAiQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAiLAorICAgIF0sCisKKyAgICBoZWFkZXJfbGliczogWworICAgICAgICAibGlibWVkaWFfaGVhZGVycyIsCisgICAgXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLm1lZGlhLmMyQDEuMCIsCisgICAgICAgICJsaWJiYXNlIiwKKyAgICAgICAgImxpYmNvZGVjMl9oaWRsQDEuMCIsCisgICAgICAgICJsaWJjb2RlYzJfdm5kayIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKKworICAgIC8vIENvZGVjcworICAgIHJ1bnRpbWVfbGliczogWworICAgICAgICAibGliY29kZWMyX3NvZnRfYXZjZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2F2Y2VuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hYWNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfYWFjZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2Ftcm5iZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2FtcndiZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2FtcndiZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2hldmNkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfaGV2Y2VuYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9nNzExYWxhd2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9nNzExbWxhd2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9tcGVnMmRlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9oMjYzZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2gyNjNlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfbXBlZzRkZWMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfbXBlZzRlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfbXAzZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3ZvcmJpc2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9vcHVzZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X29wdXNlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfdnA4ZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3ZwOWRlYyIsCisgICAgICAgIC8vICJsaWJjb2RlYzJfc29mdF9hdjFkZWNfYW9tIiwgIC8vIHJlcGxhY2VkIGJ5IHRoZSBnYXYxIGltcGxlbWVudGF0aW9uCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9hdjFkZWNfZ2F2MSIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF92cDhlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfdnA5ZW5jIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X3Jhd2RlYyIsCisgICAgICAgICJsaWJjb2RlYzJfc29mdF9mbGFjZGVjIiwKKyAgICAgICAgImxpYmNvZGVjMl9zb2Z0X2ZsYWNlbmMiLAorICAgICAgICAibGliY29kZWMyX3NvZnRfZ3NtZGVjIiwKKyAgICBdLAorfQorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3JlZ2lzdHJhbnQvQ29kZWNTZXJ2aWNlUmVnaXN0cmFudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA2ZWJlZQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvcmVnaXN0cmFudC9Db2RlY1NlcnZpY2VSZWdpc3RyYW50LmNwcApAQCAtMCwwICsxLDQ1IEBACisvKgorICogQ29weXJpZ2h0IDIwMTggVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisvLyNkZWZpbmUgTE9HX05ERUJVRyAwCisjZGVmaW5lIExPR19UQUcgIkNvZGVjU2VydmljZVJlZ2lzdHJhbnQiCisKKyNpbmNsdWRlIDxhbmRyb2lkLWJhc2UvbG9nZ2luZy5oPgorCisjaW5jbHVkZSA8QzJQbGF0Zm9ybVN1cHBvcnQuaD4KKyNpbmNsdWRlIDxjb2RlYzIvaGlkbC8xLjAvQ29tcG9uZW50U3RvcmUuaD4KKyNpbmNsdWRlIDxtZWRpYS9Db2RlY1NlcnZpY2VSZWdpc3RyYW50Lmg+CisKK2V4dGVybiAiQyIgdm9pZCBSZWdpc3RlckNvZGVjU2VydmljZXMoKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIDo6YW5kcm9pZDo6aGFyZHdhcmU6Om1lZGlhOjpjMjo6VjFfMDsKKyAgICBMT0coSU5GTykgPDwgIkNyZWF0aW5nIHNvZnR3YXJlIENvZGVjMiBzZXJ2aWNlLi4uIjsKKyAgICBhbmRyb2lkOjpzcDxJQ29tcG9uZW50U3RvcmU+IHN0b3JlID0KKyAgICAgICAgbmV3IHV0aWxzOjpDb21wb25lbnRTdG9yZSgKKyAgICAgICAgICAgICAgICBhbmRyb2lkOjpHZXRDb2RlYzJQbGF0Zm9ybUNvbXBvbmVudFN0b3JlKCkpOworICAgIGlmIChzdG9yZSA9PSBudWxscHRyKSB7CisgICAgICAgIExPRyhFUlJPUikgPDwKKyAgICAgICAgICAgICAgICAiQ2Fubm90IGNyZWF0ZSBzb2Z0d2FyZSBDb2RlYzIgc2VydmljZS4iOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChzdG9yZS0+cmVnaXN0ZXJBc1NlcnZpY2UoInNvZnR3YXJlIikgIT0gYW5kcm9pZDo6T0spIHsKKyAgICAgICAgICAgIExPRyhFUlJPUikgPDwKKyAgICAgICAgICAgICAgICAgICAgIkNhbm5vdCByZWdpc3RlciBzb2Z0d2FyZSBDb2RlYzIgc2VydmljZS4iOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgTE9HKElORk8pIDw8CisgICAgICAgICAgICAgICAgICAgICJTb2Z0d2FyZSBDb2RlYzIgc2VydmljZSBjcmVhdGVkLiI7CisgICAgICAgIH0KKyAgICB9Cit9CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy1hcm0ucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLWFybS5wb2xpY3kKaW5kZXggMzg3MGExMS4uNTE1NjRjYSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLWFybS5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLWFybS5wb2xpY3kKQEAgLTIzLDcgKzIzLDcgQEAKICMgb24gQVJNIGlzIHN0YXRpY2FsbHkgbG9hZGVkIGF0IDB4ZmZmZiAwMDAwLiBTZWUKICMgaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL2luZGV4LmpzcD90b3BpYz0vY29tLmFybS5kb2MuZGRpMDIxMWgvQmFiZmVlZ2EuaHRtbAogIyBmb3IgbW9yZSBkZXRhaWxzLgotbXJlbWFwOiBhcmczID09IDMKK21yZW1hcDogYXJnMyA9PSAzIHx8IGFyZzMgPT0gTVJFTUFQX01BWU1PVkUKIG11bm1hcDogMQogbXByb3RlY3Q6IDEKIG1hZHZpc2U6IDEKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFjb2RlYy14ODYucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kKaW5kZXggYjRmNWVlOS4uZDljNDA0NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYWNvZGVjLXg4Ni5wb2xpY3kKQEAgLTE4LDE0ICsxOCwyMCBAQAogb3BlbmF0OiAxCiBvcGVuOiAxCiBnZXR1aWQzMjogMQorZ2V0dWlkOiAxCitnZXRybGltaXQ6IDEKIHdyaXRldjogMQogaW9jdGw6IDEKIGNsb3NlOiAxCiBtbWFwMjogMQorbW1hcDogMQogZnN0YXQ2NDogMQorZnN0YXQ6IDEKIHN0YXQ2NDogMQorc3RhdGZzNjQ6IDEKIG1hZHZpc2U6IDEKIGZzdGF0YXQ2NDogMQorbmV3ZnN0YXRhdDogMQogZnV0ZXg6IDEKIG11bm1hcDogMQogZmFjY2Vzc2F0OiAxCkBAIC0zOSw5ICs0NSwxMSBAQAogZXhpdF9ncm91cDogMQogcnRfc2lncmV0dXJuOiAxCiB1Z2V0cmxpbWl0OiAxCityZWFkbGluazogMQogcmVhZGxpbmthdDogMQogX2xsc2VlazogMQogZnN0YXRmczY0OiAxCitmc3RhdGZzOiAxCiBwcmVhZDY0OiAxCiBtcmVtYXA6IDEKIGR1cDogMQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtLnBvbGljeSBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybS5wb2xpY3kKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcwNWNmOQotLS0gL2Rldi9udWxsCisrKyBiL3NlcnZpY2VzL21lZGlhY29kZWMvc2VjY29tcF9wb2xpY3kvbWVkaWFzd2NvZGVjLWFybS5wb2xpY3kKQEAgLTAsMCArMSw4NiBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworZnV0ZXg6IDEKKyMgaW9jdGwgY2FsbHMgYXJlIGZpbHRlcmVkIHZpYSB0aGUgc2VsaW51eCBwb2xpY3kuCitpb2N0bDogMQorc2NoZWRfeWllbGQ6IDEKK2Nsb3NlOiAxCitkdXA6IDEKK3Bwb2xsOiAxCittcHJvdGVjdDogYXJnMiBpbiB+UFJPVF9FWEVDIHx8IGFyZzIgaW4gflBST1RfV1JJVEUKK21tYXAyOiBhcmcyIGluIH5QUk9UX0VYRUMgfHwgYXJnMiBpbiB+UFJPVF9XUklURQorbWVtZmRfY3JlYXRlOiAxCitmdHJ1bmNhdGU6IDEKK2Z0cnVuY2F0ZTY0OiAxCisKKyMgbXJlbWFwOiBFbnN1cmUgfGZsYWdzfCBhcmUgKE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVEKSBUT0RPOiBPbmNlIG1pbmlqYWlsCisjIHBhcnNlciBzdXBwb3J0IGZvciAnPCcgaXMgaW4gdGhpcyBuZWVkcyB0byBiZSBtb2RpZmllZCB0byBhbHNvIHByZXZlbnQKKyMgfG9sZF9hZGRyZXNzfCBhbmQgfG5ld19hZGRyZXNzfCBmcm9tIHRvdWNoaW5nIHRoZSBleGNlcHRpb24gdmVjdG9yIHBhZ2UsIHdoaWNoCisjIG9uIEFSTSBpcyBzdGF0aWNhbGx5IGxvYWRlZCBhdCAweGZmZmYgMDAwMC4gU2VlCisjIGh0dHA6Ly9pbmZvY2VudGVyLmFybS5jb20vaGVscC9pbmRleC5qc3A/dG9waWM9L2NvbS5hcm0uZG9jLmRkaTAyMTFoL0JhYmZlZWdhLmh0bWwKKyMgZm9yIG1vcmUgZGV0YWlscy4KK21yZW1hcDogYXJnMyA9PSAzIHx8IGFyZzMgPT0gTVJFTUFQX01BWU1PVkUKK211bm1hcDogMQorcHJjdGw6IDEKK2dldHVpZDMyOiAxCit3cml0ZXY6IDEKK3NpZ2FsdHN0YWNrOiAxCitjbG9uZTogMQorZXhpdDogMQorbHNlZWs6IDEKK3J0X3NpZ3Byb2NtYXNrOiAxCitvcGVuYXQ6IDEKK29wZW46IDEKK2ZzdGF0NjQ6IDEKK3dyaXRlOiAxCituYW5vc2xlZXA6IDEKK3NldHByaW9yaXR5OiAxCitzZXRfdGlkX2FkZHJlc3M6IDEKK2dldGRlbnRzNjQ6IDEKK3JlYWRsaW5rYXQ6IDEKK3JlYWRsaW5rOiAxCityZWFkOiAxCitwcmVhZDY0OiAxCitmc3RhdGZzNjQ6IDEKK2dldHRpbWVvZmRheTogMQorZmFjY2Vzc2F0OiAxCitfbGxzZWVrOiAxCitmc3RhdGF0NjQ6IDEKK3VnZXRybGltaXQ6IDEKK2V4aXRfZ3JvdXA6IDEKK3Jlc3RhcnRfc3lzY2FsbDogMQorcnRfc2lncmV0dXJuOiAxCitnZXRyYW5kb206IDEKK21hZHZpc2U6IDEKKworIyBjcmFzaCBkdW1wIHBvbGljeSBhZGRpdGlvbnMKK3NpZ3JldHVybjogMQorY2xvY2tfZ2V0dGltZTogMQorZnV0ZXg6IDEKK2dldHBpZDogMQorZ2V0dGlkOiAxCitwaXBlMjogMQorcmVjdm1zZzogMQorcHJvY2Vzc192bV9yZWFkdjogMQordGdraWxsOiAxCitydF9zaWdhY3Rpb246IDEKK3J0X3Rnc2lncXVldWVpbmZvOiAxCisjcHJjdGw6IGFyZzAgPT0gUFJfR0VUX05PX05FV19QUklWUyB8fCBhcmcwID09IDB4NTM1NjRkNDEKKyNtcHJvdGVjdDogYXJnMiBpbiAweDF8MHgyCisjbW1hcDI6IGFyZzIgaW4gMHgxfDB4MgorZ2V0ZXVpZDMyOiAxCitnZXRnaWQzMjogMQorZ2V0ZWdpZDMyOiAxCitnZXRncm91cHMzMjogMQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtNjQucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMtYXJtNjQucG9saWN5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZmQyOGQKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy1hcm02NC5wb2xpY3kKQEAgLTAsMCArMSw4MSBAQAorIyBDb3B5cmlnaHQgKEMpIDIwMTkgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworZnV0ZXg6IDEKKyMgaW9jdGwgY2FsbHMgYXJlIGZpbHRlcmVkIHZpYSB0aGUgc2VsaW51eCBwb2xpY3kuCitpb2N0bDogMQorc2NoZWRfeWllbGQ6IDEKK2Nsb3NlOiAxCitkdXA6IDEKK3Bwb2xsOiAxCittcHJvdGVjdDogYXJnMiBpbiB+UFJPVF9FWEVDIHx8IGFyZzIgaW4gflBST1RfV1JJVEUKK21tYXA6IGFyZzIgaW4gflBST1RfRVhFQyB8fCBhcmcyIGluIH5QUk9UX1dSSVRFCitnZXR1aWQ6IDEKK2dldHJsaW1pdDogMQorZnN0YXQ6IDEKK25ld2ZzdGF0YXQ6IDEKK2ZzdGF0ZnM6IDEKK21lbWZkX2NyZWF0ZTogMQorZnRydW5jYXRlOiAxCisKKyMgbXJlbWFwOiBFbnN1cmUgfGZsYWdzfCBhcmUgKE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVEKSBUT0RPOiBPbmNlIG1pbmlqYWlsCisjIHBhcnNlciBzdXBwb3J0IGZvciAnPCcgaXMgaW4gdGhpcyBuZWVkcyB0byBiZSBtb2RpZmllZCB0byBhbHNvIHByZXZlbnQKKyMgfG9sZF9hZGRyZXNzfCBhbmQgfG5ld19hZGRyZXNzfCBmcm9tIHRvdWNoaW5nIHRoZSBleGNlcHRpb24gdmVjdG9yIHBhZ2UsIHdoaWNoCisjIG9uIEFSTSBpcyBzdGF0aWNhbGx5IGxvYWRlZCBhdCAweGZmZmYgMDAwMC4gU2VlCisjIGh0dHA6Ly9pbmZvY2VudGVyLmFybS5jb20vaGVscC9pbmRleC5qc3A/dG9waWM9L2NvbS5hcm0uZG9jLmRkaTAyMTFoL0JhYmZlZWdhLmh0bWwKKyMgZm9yIG1vcmUgZGV0YWlscy4KK21yZW1hcDogYXJnMyA9PSAzIHx8IGFyZzMgPT0gTVJFTUFQX01BWU1PVkUKK211bm1hcDogMQorcHJjdGw6IDEKK3dyaXRldjogMQorc2lnYWx0c3RhY2s6IDEKK2Nsb25lOiAxCitleGl0OiAxCitsc2VlazogMQorcnRfc2lncHJvY21hc2s6IDEKK29wZW5hdDogMQord3JpdGU6IDEKK25hbm9zbGVlcDogMQorc2V0cHJpb3JpdHk6IDEKK3NldF90aWRfYWRkcmVzczogMQorZ2V0ZGVudHM2NDogMQorcmVhZGxpbmthdDogMQorcmVhZDogMQorcHJlYWQ2NDogMQorZ2V0dGltZW9mZGF5OiAxCitmYWNjZXNzYXQ6IDEKK2V4aXRfZ3JvdXA6IDEKK3Jlc3RhcnRfc3lzY2FsbDogMQorcnRfc2lncmV0dXJuOiAxCitnZXRyYW5kb206IDEKK21hZHZpc2U6IDEKKworIyBjcmFzaCBkdW1wIHBvbGljeSBhZGRpdGlvbnMKK2Nsb2NrX2dldHRpbWU6IDEKK2dldHBpZDogMQorZ2V0dGlkOiAxCitwaXBlMjogMQorcmVjdm1zZzogMQorcHJvY2Vzc192bV9yZWFkdjogMQordGdraWxsOiAxCitydF9zaWdhY3Rpb246IDEKK3J0X3Rnc2lncXVldWVpbmZvOiAxCisjbXByb3RlY3Q6IGFyZzIgaW4gMHgxfDB4MgorbXVubWFwOiAxCisjbW1hcDogYXJnMiBpbiAweDF8MHgyCitnZXRldWlkOiAxCitnZXRnaWQ6IDEKK2dldGVnaWQ6IDEKK2dldGdyb3VwczogMQorCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy14ODYucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2LnBvbGljeQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hYjI1OTJhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2LnBvbGljeQpAQCAtMCwwICsxIEBACittZWRpYWNvZGVjLXg4Ni5wb2xpY3kKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWNvZGVjL3NlY2NvbXBfcG9saWN5L21lZGlhc3djb2RlYy14ODZfNjQucG9saWN5IGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2XzY0LnBvbGljeQpuZXcgZmlsZSBtb2RlIDEyMDAwMAppbmRleCAwMDAwMDAwLi5hYjI1OTJhCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFjb2RlYy9zZWNjb21wX3BvbGljeS9tZWRpYXN3Y29kZWMteDg2XzY0LnBvbGljeQpAQCAtMCwwICsxIEBACittZWRpYWNvZGVjLXg4Ni5wb2xpY3kKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rIGIvc2VydmljZXMvbWVkaWFkcm0vQW5kcm9pZC5tawppbmRleCBlODcwOTY1Li43MmQ0MmFlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWRybS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL21lZGlhZHJtL0FuZHJvaWQubWsKQEAgLTIwLDE2ICsyMCwyMSBAQAogICAgIE1lZGlhRHJtU2VydmljZS5jcHAgXAogICAgIG1haW5fbWVkaWFkcm1zZXJ2ZXIuY3BwCiAKK0xPQ0FMX0hFQURFUl9MSUJSQVJJRVM6PSBcCisgICAgbGlibWVkaWFfaGVhZGVycyBcCisgICAgbGlibWVkaWFkcm1faGVhZGVycworCiBMT0NBTF9TSEFSRURfTElCUkFSSUVTOj0gXAogICAgIGxpYmJpbmRlciBcCiAgICAgbGlibG9nIFwKKyAgICBsaWJtZWRpYSBcCiAgICAgbGlibWVkaWFkcm0gXAogICAgIGxpYnV0aWxzIFwKICAgICBsaWJoaWRsYmFzZSBcCiAgICAgbGliaGlkbG1lbW9yeSBcCi0gICAgbGliaGlkbHRyYW5zcG9ydCBcCiAgICAgYW5kcm9pZC5oYXJkd2FyZS5kcm1AMS4wIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEKKyAgICBhbmRyb2lkLmhhcmR3YXJlLmRybUAxLjEgXAorICAgIGFuZHJvaWQuaGFyZHdhcmUuZHJtQDEuMgogCiBMT0NBTF9DRkxBR1MgKz0gLVdhbGwgLVdleHRyYSAtV2Vycm9yCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5MDY1MDAKLS0tIC9kZXYvbnVsbAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLmJwCkBAIC0wLDAgKzEsNzIgQEAKKy8vIHNlcnZpY2UgbGlicmFyeQorY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJtZWRpYWV4dHJhY3RvcnNlcnZpY2UiLAorICAgIGNmbGFnczogWworICAgICAgICAiLVdhbGwiLAorICAgICAgICAiLVdlcnJvciIsCisgICAgXSwKKyAgICBzcmNzOiBbIk1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAiXSwKKworICAgIHNoYXJlZF9saWJzOiBbCisgICAgICAgICJsaWJkYXRhc291cmNlIiwKKyAgICAgICAgImxpYm1lZGlhIiwKKyAgICAgICAgImxpYnN0YWdlZnJpZ2h0IiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgXSwKK30KKworLy8gc2VydmljZSBleGVjdXRhYmxlCitjY19iaW5hcnkgeworICAgIG5hbWU6ICJtZWRpYWV4dHJhY3RvciIsCisKKyAgICBzcmNzOiBbIm1haW5fZXh0cmFjdG9yc2VydmljZS5jcHAiXSwKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibWVkaWEiLAorICAgICAgICAibGlibWVkaWFleHRyYWN0b3JzZXJ2aWNlIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJ1dGlscyIsCisgICAgICAgICJsaWJsb2ciLAorICAgICAgICAibGliYXZzZXJ2aWNlc19taW5pamFpbCIsCisgICAgXSwKKyAgICB0YXJnZXQ6IHsKKyAgICAgICAgYW5kcm9pZDogeworICAgICAgICAgICAgcHJvZHVjdF92YXJpYWJsZXM6IHsKKyAgICAgICAgICAgICAgICBtYWxsb2Nfbm90X3N2ZWx0ZTogeworICAgICAgICAgICAgICAgICAgICAvLyBTY3VkbyBpbmNyZWFzZXMgbWVtb3J5IGZvb3RwcmludCwgc28gb25seSBlbmFibGUgb24KKyAgICAgICAgICAgICAgICAgICAgLy8gbm9uLXN2ZWx0ZSBkZXZpY2VzLgorICAgICAgICAgICAgICAgICAgICBzaGFyZWRfbGliczogWyJsaWJjX3NjdWRvIl0sCisgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIH0sCisgICAgICAgIH0sCisgICAgfSwKKyAgICBpbml0X3JjOiBbIm1lZGlhZXh0cmFjdG9yLnJjIl0sCisKKyAgICBpbmNsdWRlX2RpcnM6IFsiZnJhbWV3b3Jrcy9hdi9tZWRpYS9saWJtZWRpYSJdLAorCisgICAgY2ZsYWdzOiBbCisgICAgICAgICItV2FsbCIsCisgICAgICAgICItV2Vycm9yIiwKKyAgICBdLAorfQorCitwcmVidWlsdF9ldGMgeworICAgIG5hbWU6ICJtZWRpYWV4dHJhY3Rvci5wb2xpY3kiLAorICAgIHN1Yl9kaXI6ICJzZWNjb21wX3BvbGljeSIsCisgICAgYXJjaDogeworICAgICAgICBhcm06IHsKKyAgICAgICAgICAgIHNyYzogInNlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLWFybS5wb2xpY3kiLAorICAgICAgICB9LAorICAgICAgICBhcm02NDogeworICAgICAgICAgICAgc3JjOiAic2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3ItYXJtNjQucG9saWN5IiwKKyAgICAgICAgfSwKKyAgICAgICAgeDg2OiB7CisgICAgICAgICAgICBzcmM6ICJzZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODYucG9saWN5IiwKKyAgICAgICAgfSwKKyAgICAgICAgeDg2XzY0OiB7CisgICAgICAgICAgICBzcmM6ICJzZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci14ODZfNjQucG9saWN5IiwKKyAgICAgICAgfSwKKyAgICB9LAorICAgIHJlcXVpcmVkOiBbImNyYXNoX2R1bXAucG9saWN5Il0sCit9CisKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQubWsgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZmEwNWMzLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL0FuZHJvaWQubWsKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi1MT0NBTF9QQVRIIDo9ICQoY2FsbCBteS1kaXIpCi0KLSMgc2VydmljZSBsaWJyYXJ5Ci1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX0NGTEFHUyA6PSAtV2FsbCAtV2Vycm9yCi1MT0NBTF9TUkNfRklMRVMgOj0gXAotICAgIE1lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAgXAotICAgIE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5jcHAgXAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTIDo9IGxpYm1lZGlhIGxpYnN0YWdlZnJpZ2h0IGxpYmJpbmRlciBsaWJ1dGlscyBsaWJsb2cKLUxPQ0FMX01PRFVMRTo9IGxpYm1lZGlhZXh0cmFjdG9yc2VydmljZQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQotCi0KLSMgc2VydmljZSBleGVjdXRhYmxlCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLSMgc2VjY29tcCBmaWx0ZXJzIGFyZSBkZWZpbmVkIGZvciB0aGUgZm9sbG93aW5nIGFyY2hpdGVjdHVyZXM6Ci1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTX2FybSA6PSBjcmFzaF9kdW1wLnBvbGljeSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKLUxPQ0FMX1JFUVVJUkVEX01PRFVMRVNfYXJtNjQgOj0gY3Jhc2hfZHVtcC5wb2xpY3kgbWVkaWFleHRyYWN0b3IucG9saWN5Ci1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTX3g4NiA6PSBjcmFzaF9kdW1wLnBvbGljeSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKLQotIyBleHRyYWN0b3IgbGlicmFyaWVzCi1MT0NBTF9SRVFVSVJFRF9NT0RVTEVTICs9IFwKLSAgICBsaWJhYWNleHRyYWN0b3IgXAotICAgIGxpYmFtcmV4dHJhY3RvciBcCi0gICAgbGliZmxhY2V4dHJhY3RvciBcCi0gICAgbGlibWlkaWV4dHJhY3RvciBcCi0gICAgbGlibWt2ZXh0cmFjdG9yIFwKLSAgICBsaWJtcDNleHRyYWN0b3IgXAotICAgIGxpYm1wNGV4dHJhY3RvciBcCi0gICAgbGlibXBlZzJleHRyYWN0b3IgXAotICAgIGxpYm9nZ2V4dHJhY3RvciBcCi0gICAgbGlid2F2ZXh0cmFjdG9yIFwKLQotTE9DQUxfU1JDX0ZJTEVTIDo9IG1haW5fZXh0cmFjdG9yc2VydmljZS5jcHAKLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgOj0gbGlibWVkaWEgbGlibWVkaWFleHRyYWN0b3JzZXJ2aWNlIGxpYmJpbmRlciBsaWJ1dGlscyBcCi0gICAgbGlibG9nIGxpYmJhc2UgbGliYW5kcm9pZGljdSBsaWJhdnNlcnZpY2VzX21pbmlqYWlsCi1MT0NBTF9NT0RVTEU6PSBtZWRpYWV4dHJhY3RvcgotTE9DQUxfSU5JVF9SQyA6PSBtZWRpYWV4dHJhY3Rvci5yYwotTE9DQUxfQ19JTkNMVURFUyA6PSBmcmFtZXdvcmtzL2F2L21lZGlhL2xpYm1lZGlhCi1MT0NBTF9DRkxBR1MgOj0gLVdhbGwgLVdlcnJvcgotaW5jbHVkZSAkKEJVSUxEX0VYRUNVVEFCTEUpCi0KLSMgc2VydmljZSBzZWNjb21wIGZpbHRlcgotaWZlcSAoJChUQVJHRVRfQVJDSCksICQoZmlsdGVyICQoVEFSR0VUX0FSQ0gpLCBhcm0gYXJtNjQgeDg2IHg4Nl82NCkpCi1pbmNsdWRlICQoQ0xFQVJfVkFSUykKLUxPQ0FMX01PRFVMRSA6PSBtZWRpYWV4dHJhY3Rvci5wb2xpY3kKLUxPQ0FMX01PRFVMRV9DTEFTUyA6PSBFVEMKLUxPQ0FMX01PRFVMRV9QQVRIIDo9ICQoVEFSR0VUX09VVCkvZXRjL3NlY2NvbXBfcG9saWN5Ci1MT0NBTF9TUkNfRklMRVMgOj0gc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3ItJChUQVJHRVRfQVJDSCkucG9saWN5Ci1pbmNsdWRlICQoQlVJTERfUFJFQlVJTFQpCi1lbmRpZgpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5jcHAKaW5kZXggZjBmNDRmNS4uNjIzOWZiMiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclNlcnZpY2UuY3BwCkBAIC0yMCw5ICsyMCw4IEBACiAKICNpbmNsdWRlIDx1dGlscy9WZWN0b3IuaD4KIAorI2luY2x1ZGUgPGRhdGFzb3VyY2UvRGF0YVNvdXJjZUZhY3RvcnkuaD4KICNpbmNsdWRlIDxtZWRpYS9EYXRhU291cmNlLmg+Ci0jaW5jbHVkZSA8bWVkaWEvTWVkaWFFeHRyYWN0b3IuaD4KLSNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9EYXRhU291cmNlRmFjdG9yeS5oPgogI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L0ludGVyZmFjZVV0aWxzLmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvTWVkaWFFeHRyYWN0b3JGYWN0b3J5Lmg+CiAjaW5jbHVkZSA8bWVkaWEvc3RhZ2VmcmlnaHQvUmVtb3RlRGF0YVNvdXJjZS5oPgpAQCAtMzAsNiArMjksMTEgQEAKIAogbmFtZXNwYWNlIGFuZHJvaWQgewogCitNZWRpYUV4dHJhY3RvclNlcnZpY2U6Ok1lZGlhRXh0cmFjdG9yU2VydmljZSgpCisgICAgICAgIDogQm5NZWRpYUV4dHJhY3RvclNlcnZpY2UoKSB7CisgICAgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpMb2FkRXh0cmFjdG9ycygpOworfQorCiBzcDxJTWVkaWFFeHRyYWN0b3I+IE1lZGlhRXh0cmFjdG9yU2VydmljZTo6bWFrZUV4dHJhY3RvcigKICAgICAgICAgY29uc3Qgc3A8SURhdGFTb3VyY2U+ICZyZW1vdGVTb3VyY2UsIGNvbnN0IGNoYXIgKm1pbWUpIHsKICAgICBBTE9HVigiQEBAIE1lZGlhRXh0cmFjdG9yU2VydmljZTo6bWFrZUV4dHJhY3RvciBmb3IgJXMiLCBtaW1lKTsKQEAgLTUxLDEwICs1NSwxNCBAQAogCiBzcDxJRGF0YVNvdXJjZT4gTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjptYWtlSURhdGFTb3VyY2UoaW50IGZkLCBpbnQ2NF90IG9mZnNldCwgaW50NjRfdCBsZW5ndGgpCiB7Ci0gICAgc3A8RGF0YVNvdXJjZT4gc291cmNlID0gRGF0YVNvdXJjZUZhY3Rvcnk6OkNyZWF0ZUZyb21GZChmZCwgb2Zmc2V0LCBsZW5ndGgpOworICAgIHNwPERhdGFTb3VyY2U+IHNvdXJjZSA9IERhdGFTb3VyY2VGYWN0b3J5OjpnZXRJbnN0YW5jZSgpLT5DcmVhdGVGcm9tRmQoZmQsIG9mZnNldCwgbGVuZ3RoKTsKICAgICByZXR1cm4gQ3JlYXRlSURhdGFTb3VyY2VGcm9tRGF0YVNvdXJjZShzb3VyY2UpOwogfQogCitzdGQ6OnVub3JkZXJlZF9zZXQ8c3RkOjpzdHJpbmc+IE1lZGlhRXh0cmFjdG9yU2VydmljZTo6Z2V0U3VwcG9ydGVkVHlwZXMoKSB7CisgICAgcmV0dXJuIE1lZGlhRXh0cmFjdG9yRmFjdG9yeTo6Z2V0U3VwcG9ydGVkVHlwZXMoKTsKK30KKwogc3RhdHVzX3QgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncykgewogICAgIHJldHVybiBNZWRpYUV4dHJhY3RvckZhY3Rvcnk6OmR1bXAoZmQsIGFyZ3MpIHx8IGR1bXBFeHRyYWN0b3JzKGZkLCBhcmdzKTsKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgKaW5kZXggOWRmM2VjZC4uYzljZWJjZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JTZXJ2aWNlLmgKQEAgLTI3LDcgKzI3LDcgQEAKIHsKICAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxNZWRpYUV4dHJhY3RvclNlcnZpY2U+OyAgICAvLyBmb3IgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCkKIHB1YmxpYzoKLSAgICBNZWRpYUV4dHJhY3RvclNlcnZpY2UoKSA6IEJuTWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCkgeyB9CisgICAgTWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCk7CiAgICAgdmlydHVhbCB+TWVkaWFFeHRyYWN0b3JTZXJ2aWNlKCkgeyB9CiAgICAgdmlydHVhbCB2b2lkIG9uRmlyc3RSZWYoKSB7IH0KIApAQCAtMzcsNiArMzcsOCBAQAogCiAgICAgdmlydHVhbCBzcDxJRGF0YVNvdXJjZT4gbWFrZUlEYXRhU291cmNlKGludCBmZCwgaW50NjRfdCBvZmZzZXQsIGludDY0X3QgbGVuZ3RoKTsKIAorICAgIHZpcnR1YWwgc3RkOjp1bm9yZGVyZWRfc2V0PHN0ZDo6c3RyaW5nPiBnZXRTdXBwb3J0ZWRUeXBlcygpOworCiAgICAgdmlydHVhbCBzdGF0dXNfdCAgICBkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyk7CiAKICAgICB2aXJ0dWFsIHN0YXR1c190ICAgIG9uVHJhbnNhY3QodWludDMyX3QgY29kZSwgY29uc3QgUGFyY2VsJiBkYXRhLCBQYXJjZWwqIHJlcGx5LApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL01lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5jcHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3M2E2OTguLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNkZWZpbmUgTE9HX1RBRyAiTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlIgotI2RlZmluZSBMT0dfTkRFQlVHIDAKLSNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KLQotI2luY2x1ZGUgPG1lZGlhL3N0YWdlZnJpZ2h0L01lZGlhRXh0cmFjdG9yRmFjdG9yeS5oPgotCi0jaW5jbHVkZSAiTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLW5hbWVzcGFjZSBtZWRpYSB7Ci0KLWJpbmRlcjo6U3RhdHVzIE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZTo6bG9hZFBsdWdpbnMoY29uc3QgOjpzdGQ6OnN0cmluZyYgYXBrUGF0aCkgewotICAgIEFMT0dWKCJsb2FkUGx1Z2lucyAlcyIsIGFwa1BhdGguY19zdHIoKSk7Ci0gICAgTWVkaWFFeHRyYWN0b3JGYWN0b3J5OjpMb2FkUGx1Z2lucyhhcGtQYXRoKTsKLSAgICByZXR1cm4gYmluZGVyOjpTdGF0dXM6Om9rKCk7Ci19Ci0KLX0gICAvLyBuYW1lc3BhY2UgbWVkaWEKLX0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDExNWY2ZC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxOCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9NRURJQV9FWFRSQUNUT1JfVVBEQVRFX1NFUlZJQ0VfSAotI2RlZmluZSBBTkRST0lEX01FRElBX0VYVFJBQ1RPUl9VUERBVEVfU0VSVklDRV9ICi0KLSNpbmNsdWRlIDxiaW5kZXIvQmluZGVyU2VydmljZS5oPgotI2luY2x1ZGUgPGFuZHJvaWQvbWVkaWEvQm5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UuaD4KLQotbmFtZXNwYWNlIGFuZHJvaWQgewotbmFtZXNwYWNlIG1lZGlhIHsKLQotY2xhc3MgTWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlCi0gICAgOiBwdWJsaWMgQmluZGVyU2VydmljZTxNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2U+LCBwdWJsaWMgQm5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UKLXsKLSAgICBmcmllbmQgY2xhc3MgQmluZGVyU2VydmljZTxNZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2U+OwotcHVibGljOgotICAgIE1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZSgpIDogQm5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UoKSB7IH0KLSAgICB2aXJ0dWFsIH5NZWRpYUV4dHJhY3RvclVwZGF0ZVNlcnZpY2UoKSB7IH0KLSAgICBzdGF0aWMgY29uc3QgY2hhciogZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAibWVkaWEuZXh0cmFjdG9yLnVwZGF0ZSI7IH0KLSAgICBiaW5kZXI6OlN0YXR1cyBsb2FkUGx1Z2lucyhjb25zdCA6OnN0ZDo6c3RyaW5nJiBhcGtQYXRoKTsKLX07Ci0KLX0gICAvLyBuYW1lc3BhY2UgbWVkaWEKLX0gICAvLyBuYW1lc3BhY2UgYW5kcm9pZAotCi0jZW5kaWYgIC8vIEFORFJPSURfTUVESUFfRVhUUkFDVE9SX1VQREFURV9TRVJWSUNFX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21haW5fZXh0cmFjdG9yc2VydmljZS5jcHAgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9tYWluX2V4dHJhY3RvcnNlcnZpY2UuY3BwCmluZGV4IDg2NTUxMzguLjNjNDEyNWIgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL21haW5fZXh0cmFjdG9yc2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3IvbWFpbl9leHRyYWN0b3JzZXJ2aWNlLmNwcApAQCAtMTUsNyArMTUsNiBAQAogKiogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAqLwogCi0jaW5jbHVkZSA8YWljdS9BSWN1Lmg+CiAjaW5jbHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzeXMvcHJjdGwuaD4KICNpbmNsdWRlIDxzeXMvd2FpdC5oPgpAQCAtMzEsMTQgKzMwLDEzIEBACiAKIC8vIGZyb20gTE9DQUxfQ19JTkNMVURFUwogI2luY2x1ZGUgIk1lZGlhRXh0cmFjdG9yU2VydmljZS5oIgotI2luY2x1ZGUgIk1lZGlhRXh0cmFjdG9yVXBkYXRlU2VydmljZS5oIgogI2luY2x1ZGUgIk1lZGlhVXRpbHMuaCIKICNpbmNsdWRlICJtaW5pamFpbC5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIAogc3RhdGljIGNvbnN0IGNoYXIga1N5c3RlbVNlY2NvbXBQb2xpY3lQYXRoW10gPQotICAgICAgICAiL3N5c3RlbS9ldGMvc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IucG9saWN5IjsKKyAgICAgICAgIi9hcGV4L2NvbS5hbmRyb2lkLm1lZGlhL2V0Yy9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci5wb2xpY3kiOwogc3RhdGljIGNvbnN0IGNoYXIga1ZlbmRvclNlY2NvbXBQb2xpY3lQYXRoW10gPQogICAgICAgICAiL3ZlbmRvci9ldGMvc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IucG9saWN5IjsKIApAQCAtNTksMTggKzU3LDExIEBACiAKICAgICBTZXRVcE1pbmlqYWlsKGtTeXN0ZW1TZWNjb21wUG9saWN5UGF0aCwga1ZlbmRvclNlY2NvbXBQb2xpY3lQYXRoKTsKIAotICAgIEFJY3VfaW5pdGlhbGl6ZUljdU9yRGllKCk7Ci0KICAgICBzdHJjcHkoYXJndlswXSwgIm1lZGlhLmV4dHJhY3RvciIpOwogICAgIHNwPFByb2Nlc3NTdGF0ZT4gcHJvYyhQcm9jZXNzU3RhdGU6OnNlbGYoKSk7CiAgICAgc3A8SVNlcnZpY2VNYW5hZ2VyPiBzbSA9IGRlZmF1bHRTZXJ2aWNlTWFuYWdlcigpOwogICAgIE1lZGlhRXh0cmFjdG9yU2VydmljZTo6aW5zdGFudGlhdGUoKTsKIAotICAgIHN0ZDo6c3RyaW5nIHZhbHVlID0gYmFzZTo6R2V0UHJvcGVydHkoInJvLmJ1aWxkLnR5cGUiLCAidW5rbm93biIpOwotICAgIGlmICh2YWx1ZSA9PSAidXNlcmRlYnVnIiB8fCB2YWx1ZSA9PSAiZW5nIikgewotICAgICAgICBtZWRpYTo6TWVkaWFFeHRyYWN0b3JVcGRhdGVTZXJ2aWNlOjppbnN0YW50aWF0ZSgpOwotICAgIH0KLQogICAgIFByb2Nlc3NTdGF0ZTo6c2VsZigpLT5zdGFydFRocmVhZFBvb2woKTsKICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5qb2luVGhyZWFkUG9vbCgpOwogfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3ItYXJtLnBvbGljeSBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLWFybS5wb2xpY3kKaW5kZXggOTY0YWNmNC4uYzYxMzkzZCAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3ItYXJtLnBvbGljeQorKysgYi9zZXJ2aWNlcy9tZWRpYWV4dHJhY3Rvci9zZWNjb21wX3BvbGljeS9tZWRpYWV4dHJhY3Rvci1hcm0ucG9saWN5CkBAIC00NSw2ICs0NSwxNCBAQAogIyBmb3IgZHluYW1pY2FsbHkgbG9hZGluZyBleHRyYWN0b3JzCiBwcmVhZDY0OiAxCiAKKyMgbXJlbWFwOiBFbnN1cmUgfGZsYWdzfCBhcmUgKE1SRU1BUF9NQVlNT1ZFIHwgTVJFTUFQX0ZJWEVEKSBUT0RPOiBPbmNlIG1pbmlqYWlsCisjIHBhcnNlciBzdXBwb3J0IGZvciAnPCcgaXMgaW4gdGhpcyBuZWVkcyB0byBiZSBtb2RpZmllZCB0byBhbHNvIHByZXZlbnQKKyMgfG9sZF9hZGRyZXNzfCBhbmQgfG5ld19hZGRyZXNzfCBmcm9tIHRvdWNoaW5nIHRoZSBleGNlcHRpb24gdmVjdG9yIHBhZ2UsIHdoaWNoCisjIG9uIEFSTSBpcyBzdGF0aWNhbGx5IGxvYWRlZCBhdCAweGZmZmYgMDAwMC4gU2VlCisjIGh0dHA6Ly9pbmZvY2VudGVyLmFybS5jb20vaGVscC9pbmRleC5qc3A/dG9waWM9L2NvbS5hcm0uZG9jLmRkaTAyMTFoL0JhYmZlZWdhLmh0bWwKKyMgZm9yIG1vcmUgZGV0YWlscy4KK21yZW1hcDogYXJnMyA9PSAzIHx8IGFyZzMgPT0gTVJFTUFQX01BWU1PVkUKKwogIyBmb3IgRmlsZVNvdXJjZQogcmVhZGxpbmthdDogMQogX2xsc2VlazogMQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IteDg2XzY0LnBvbGljeSBiL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Nl82NC5wb2xpY3kKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAzMjI5OWYzLi42MDdhMDNlCi0tLSBhL3NlcnZpY2VzL21lZGlhZXh0cmFjdG9yL3NlY2NvbXBfcG9saWN5L21lZGlhZXh0cmFjdG9yLXg4Nl82NC5wb2xpY3kKKysrIGIvc2VydmljZXMvbWVkaWFleHRyYWN0b3Ivc2VjY29tcF9wb2xpY3kvbWVkaWFleHRyYWN0b3IteDg2XzY0LnBvbGljeQpAQCAtMjIsNiArMjIsOCBAQAogZ2V0dWlkOiAxCiBzZXRwcmlvcml0eTogMQogc2lnYWx0c3RhY2s6IDEKK2ZzdGF0OiAxCitmc3RhdGZzOiAxCiBuZXdmc3RhdGF0OiAxCiByZXN0YXJ0X3N5c2NhbGw6IDEKIGV4aXQ6IDEKQEAgLTMxLDI4ICszMywyMSBAQAogc2NoZWRfc2V0c2NoZWR1bGVyOiAxCiBnZXRybGltaXQ6IDEKIG5hbm9zbGVlcDogMQorZ2V0cmFuZG9tOiAxCisKKyMgZm9yIGR5bmFtaWNhbGx5IGxvYWRpbmcgZXh0cmFjdG9ycworZ2V0ZGVudHM2NDogMQorcmVhZGxpbmthdDogMQorcHJlYWQ2NDogMQorbXJlbWFwOiAxCiAKICMgZm9yIEZpbGVTb3VyY2UKIHJlYWRsaW5rYXQ6IDEKIAotIyBmb3IgYXR0YWNoaW5nIHRvIGRlYnVnZ2VyZCBvbiBwcm9jZXNzIGNyYXNoCi10Z2tpbGw6IDEKLXNvY2tldDogYXJnMCA9PSAxCi1jb25uZWN0OiAxCi1mY250bDogMQotcnRfc2lncHJvY21hc2s6IDEKLXJ0X3NpZ2FjdGlvbjogMQotcnRfdGdzaWdxdWV1ZWluZm86IDEKLWdldGV1aWQ6IDEKLWdldGdpZDogMQotZ2V0ZWdpZDogMQotZ2V0Z3JvdXBzOiAxCi1nZXRkZW50czY0OiAxCi1waXBlMjogMQotcHBvbGw6IDEKLQogIyBSZXF1aXJlZCBieSBBZGRyZXNzU2FuaXRpemVyCiBnZXR0aWQ6IDEKIHNjaGVkX3lpZWxkOiAxCiBnZXRwaWQ6IDEKIGdldHRpZDogMQorCitAaW5jbHVkZSAvc3lzdGVtL2V0Yy9zZWNjb21wX3BvbGljeS9jcmFzaF9kdW1wLng4Nl82NC5wb2xpY3kKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9tZWRpYWxvZy9BbmRyb2lkLmJwCmluZGV4IDI5ZTZkZmMuLjc0YjYzZDUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhbG9nL0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFsb2cvQW5kcm9pZC5icApAQCAtNiwxMSArNiwxNSBAQAogICAgICAgICAiTWVkaWFMb2dTZXJ2aWNlLmNwcCIsCiAgICAgXSwKIAorICAgIGhlYWRlcl9saWJzOiBbCisgICAgICAgICJsaWJtZWRpYV9oZWFkZXJzIiwKKyAgICBdLAorCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAogICAgICAgICAibGliYmluZGVyIiwKICAgICAgICAgImxpYmxvZyIsCi0gICAgICAgICJsaWJuYmFpbyIsCisgICAgICAgICJsaWJtZWRpYXV0aWxzIiwKICAgICAgICAgImxpYm5ibG9nIiwKICAgICAgICAgImxpYnV0aWxzIiwKICAgICBdLApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcCBiL3NlcnZpY2VzL21lZGlhbG9nL01lZGlhTG9nU2VydmljZS5jcHAKaW5kZXggMWJlNTU0NC4uOTAyYWY2NiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmNwcAorKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuY3BwCkBAIC0yMCw4ICsyMCw5IEBACiAjaW5jbHVkZSA8c3lzL21tYW4uaD4KICNpbmNsdWRlIDx1dGlscy9Mb2cuaD4KICNpbmNsdWRlIDxiaW5kZXIvUGVybWlzc2lvbkNhY2hlLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTWVyZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KLSNpbmNsdWRlIDxwcml2YXRlL2FuZHJvaWRfZmlsZXN5c3RlbV9jb25maWcuaD4KKyNpbmNsdWRlIDxtZWRpYXV0aWxzL1NlcnZpY2VVdGlsaXRpZXMuaD4KICNpbmNsdWRlICJNZWRpYUxvZ1NlcnZpY2UuaCIKIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNTMsMjcgKzU0LDI4IEBACiAKIHZvaWQgTWVkaWFMb2dTZXJ2aWNlOjpyZWdpc3RlcldyaXRlcihjb25zdCBzcDxJTWVtb3J5PiYgc2hhcmVkLCBzaXplX3Qgc2l6ZSwgY29uc3QgY2hhciAqbmFtZSkKIHsKLSAgICBpZiAoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpICE9IEFJRF9BVURJT1NFUlZFUiB8fCBzaGFyZWQgPT0gMCB8fAorICAgIGlmICghaXNBdWRpb1NlcnZlck9yTWVkaWFTZXJ2ZXJVaWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSB8fCBzaGFyZWQgPT0gMCB8fAogICAgICAgICAgICAgc2l6ZSA8IGtNaW5TaXplIHx8IHNpemUgPiBrTWF4U2l6ZSB8fCBuYW1lID09IE5VTEwgfHwKICAgICAgICAgICAgIHNoYXJlZC0+c2l6ZSgpIDwgTkJMb2c6OlRpbWVsaW5lOjpzaGFyZWRTaXplKHNpemUpKSB7CiAgICAgICAgIHJldHVybjsKICAgICB9Ci0gICAgc3A8TkJMb2c6OlJlYWRlcj4gcmVhZGVyKG5ldyBOQkxvZzo6UmVhZGVyKHNoYXJlZCwgc2l6ZSkpOwotICAgIE5CTG9nOjpOYW1lZFJlYWRlciBuYW1lZFJlYWRlcihyZWFkZXIsIG5hbWUpOworICAgIHNwPE5CTG9nOjpSZWFkZXI+IHJlYWRlcihuZXcgTkJMb2c6OlJlYWRlcihzaGFyZWQsIHNpemUsIG5hbWUpKTsgLy8gUmVhZGVyIGhhbmRsZWQgYnkgbWVyZ2VyCisgICAgc3A8TkJMb2c6OkR1bXBSZWFkZXI+IGR1bXBSZWFkZXIobmV3IE5CTG9nOjpEdW1wUmVhZGVyKHNoYXJlZCwgc2l6ZSwgbmFtZSkpOyAvLyBmb3IgZHVtcHN5cwogICAgIE11dGV4OjpBdXRvbG9jayBfbChtTG9jayk7Ci0gICAgbU5hbWVkUmVhZGVycy5hZGQobmFtZWRSZWFkZXIpOwotICAgIG1NZXJnZXIuYWRkUmVhZGVyKG5hbWVkUmVhZGVyKTsKKyAgICBtRHVtcFJlYWRlcnMuYWRkKGR1bXBSZWFkZXIpOworICAgIG1NZXJnZXIuYWRkUmVhZGVyKHJlYWRlcik7CiB9CiAKIHZvaWQgTWVkaWFMb2dTZXJ2aWNlOjp1bnJlZ2lzdGVyV3JpdGVyKGNvbnN0IHNwPElNZW1vcnk+JiBzaGFyZWQpCiB7Ci0gICAgaWYgKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSAhPSBBSURfQVVESU9TRVJWRVIgfHwgc2hhcmVkID09IDApIHsKKyAgICBpZiAoIWlzQXVkaW9TZXJ2ZXJPck1lZGlhU2VydmVyVWlkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkgfHwgc2hhcmVkID09IDApIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBNdXRleDo6QXV0b2xvY2sgX2wobUxvY2spOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbU5hbWVkUmVhZGVycy5zaXplKCk7ICkgewotICAgICAgICBpZiAobU5hbWVkUmVhZGVyc1tpXS5yZWFkZXIoKS0+aXNJTWVtb3J5KHNoYXJlZCkpIHsKLSAgICAgICAgICAgIG1OYW1lZFJlYWRlcnMucmVtb3ZlQXQoaSk7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBtRHVtcFJlYWRlcnMuc2l6ZSgpOyApIHsKKyAgICAgICAgaWYgKG1EdW1wUmVhZGVyc1tpXS0+aXNJTWVtb3J5KHNoYXJlZCkpIHsKKyAgICAgICAgICAgIG1EdW1wUmVhZGVycy5yZW1vdmVBdChpKTsKKyAgICAgICAgICAgIC8vIFRPRE8gbU1lcmdlci5yZW1vdmVSZWFkZXJzKHNoYXJlZCkKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIGkrKzsKICAgICAgICAgfQpAQCAtOTUsMTAgKzk3LDggQEAKIAogc3RhdHVzX3QgTWVkaWFMb2dTZXJ2aWNlOjpkdW1wKGludCBmZCwgY29uc3QgVmVjdG9yPFN0cmluZzE2PiYgYXJncyBfX3VudXNlZCkKIHsKLSAgICAvLyBGSVhNRSBtZXJnZSB3aXRoIHNpbWlsYXIgYnV0IG5vdCBpZGVudGljYWwgY29kZSBhdCBzZXJ2aWNlcy9hdWRpb2ZsaW5nZXIvU2VydmljZVV0aWxpdGllcy5jcHAKLSAgICBzdGF0aWMgY29uc3QgU3RyaW5nMTYgc0R1bXAoImFuZHJvaWQucGVybWlzc2lvbi5EVU1QIik7Ci0gICAgaWYgKCEoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpID09IEFJRF9BVURJT1NFUlZFUiB8fAotICAgICAgICAgICAgUGVybWlzc2lvbkNhY2hlOjpjaGVja0NhbGxpbmdQZXJtaXNzaW9uKHNEdW1wKSkpIHsKKyAgICBpZiAoIShpc0F1ZGlvU2VydmVyT3JNZWRpYVNlcnZlclVpZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpCisgICAgICAgICAgICB8fCBkdW1wQWxsb3dlZCgpKSkgewogICAgICAgICBkcHJpbnRmKGZkLCAiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgbWVkaWEubG9nIGZyb20gcGlkPSVkLCB1aWQ9JWRcbiIsCiAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSk7CkBAIC0xMDgsNyArMTA4LDcgQEAKICAgICBpZiAoYXJncy5zaXplKCkgPiAwKSB7CiAgICAgICAgIGNvbnN0IFN0cmluZzggYXJnMChhcmdzWzBdKTsKICAgICAgICAgaWYgKCFzdHJjbXAoYXJnMC5zdHJpbmcoKSwgIi1yIikpIHsKLSAgICAgICAgICAgIC8vIG5lZWRlZCBiZWNhdXNlIG1OYW1lZFJlYWRlcnMgaXMgcHJvdGVjdGVkIGJ5IG1Mb2NrCisgICAgICAgICAgICAvLyBuZWVkZWQgYmVjYXVzZSBtUmVhZGVycyBpcyBwcm90ZWN0ZWQgYnkgbUxvY2sKICAgICAgICAgICAgIGJvb2wgbG9ja2VkID0gZHVtcFRyeUxvY2sobUxvY2spOwogCiAgICAgICAgICAgICAvLyBmYWlsZWQgdG8gbG9jayAtIE1lZGlhTG9nU2VydmljZSBpcyBwcm9iYWJseSBkZWFkbG9ja2VkCkBAIC0xMTksMjEgKzExOSwyMiBAQAogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgIEFMT0dXKCIlczoiLCByZXN1bHQuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBUT0RPIHNob3VsZCB3ZSBpbnN0ZWFkIHByb2NlZWQgdG8gbU1lcmdlUmVhZGVyLmR1bXA/IGRvZXMgaXQgbmVlZCBsb2NrPwogICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgICAgIH0KIAotICAgICAgICAgICAgZm9yIChjb25zdCBhdXRvJiBuYW1lZFJlYWRlciA6IG1OYW1lZFJlYWRlcnMpIHsKKyAgICAgICAgICAgIGZvciAoY29uc3QgYXV0byAmZHVtcFJlYWRlciA6IG1EdW1wUmVhZGVycykgewogICAgICAgICAgICAgICAgIGlmIChmZCA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgICAgIGRwcmludGYoZmQsICJcbiVzOlxuIiwgbmFtZWRSZWFkZXIubmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgZHByaW50ZihmZCwgIlxuJXM6XG4iLCBkdW1wUmVhZGVyLT5uYW1lKCkuY19zdHIoKSk7CisgICAgICAgICAgICAgICAgICAgIGR1bXBSZWFkZXItPmR1bXAoZmQsIDAgLyppbmRlbnQqLyk7CiAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgQUxPR0koIiVzOiIsIG5hbWVkUmVhZGVyLm5hbWUoKSk7CisgICAgICAgICAgICAgICAgICAgIEFMT0dJKCIlczoiLCBkdW1wUmVhZGVyLT5uYW1lKCkuY19zdHIoKSk7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQogICAgICAgICAgICAgbUxvY2sudW5sb2NrKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtTWVyZ2VSZWFkZXIuZHVtcChmZCwgYXJncyk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgbU1lcmdlUmVhZGVyLmR1bXAoZmQpOwogICAgIHJldHVybiBOT19FUlJPUjsKIH0KIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFsb2cvTWVkaWFMb2dTZXJ2aWNlLmggYi9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuaAppbmRleCBjOTQ1ZDFmLi4yMWRmODk4IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYWxvZy9NZWRpYUxvZ1NlcnZpY2UuaApAQCAtMTksNiArMTksNyBAQAogCiAjaW5jbHVkZSA8YmluZGVyL0JpbmRlclNlcnZpY2UuaD4KICNpbmNsdWRlIDxtZWRpYS9JTWVkaWFMb2dTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTWVyZ2VyLmg+CiAjaW5jbHVkZSA8bWVkaWEvbmJsb2cvTkJMb2cuaD4KIAogbmFtZXNwYWNlIGFuZHJvaWQgewpAQCAtNTUsNyArNTYsNyBAQAogCiAgICAgTXV0ZXggICAgICAgICAgICAgICBtTG9jazsKIAotICAgIFZlY3RvcjxOQkxvZzo6TmFtZWRSZWFkZXI+IG1OYW1lZFJlYWRlcnM7ICAgLy8gcHJvdGVjdGVkIGJ5IG1Mb2NrCisgICAgVmVjdG9yPHNwPE5CTG9nOjpEdW1wUmVhZGVyPj4gbUR1bXBSZWFkZXJzOyAgIC8vIHByb3RlY3RlZCBieSBtTG9jawogCiAgICAgLy8gRklYTUUgTmVlZCBjb21tZW50cyBvbiBhbGwgb2YgdGhlc2UsIGVzcGVjaWFsbHkgYWJvdXQgbG9ja2luZwogICAgIE5CTG9nOjpTaGFyZWQgKm1NZXJnZXJTaGFyZWQ7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvQW5kcm9pZC5icAppbmRleCAxYzYzZjY0Li5kNDY4NDA2IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL0FuZHJvaWQuYnAKQEAgLTE2LDggKzE2LDYgQEAKICAgICAgICAgImxpYmxvZyIsCiAgICAgXSwKIAotICAgIGNvbXBpbGVfbXVsdGlsaWI6ICIzMiIsCi0KICAgICBpbmNsdWRlX2RpcnM6IFsiZnJhbWV3b3Jrcy9hdi9pbmNsdWRlIl0sCiAKICAgICBjZmxhZ3M6IFsKQEAgLTI1LDQgKzIzLDYgQEAKICAgICAgICAgIi1XYWxsIiwKICAgICBdLAogCisgICAgZXhwb3J0X2luY2x1ZGVfZGlyczogWyIuIl0sCisKIH0KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuY3BwIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAKaW5kZXggMjhiZmQzZi4uNDVlZWEwZiAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5jcHAKQEAgLTIxLDggKzIxLDExIEBACiAKICNpbmNsdWRlIDxiaW5kZXIvSU1lZGlhUmVzb3VyY2VNb25pdG9yLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgorI2luY2x1ZGUgPGN1dGlscy9zY2hlZF9wb2xpY3kuaD4KICNpbmNsdWRlIDxkaXJlbnQuaD4KICNpbmNsdWRlIDxtZWRpYS9zdGFnZWZyaWdodC9Qcm9jZXNzSW5mby5oPgorI2luY2x1ZGUgPG1lZGlhdXRpbHMvQmF0dGVyeU5vdGlmaWVyLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TY2hlZHVsaW5nUG9saWN5U2VydmljZS5oPgogI2luY2x1ZGUgPHN0cmluZy5oPgogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CkBAIC0zMSw4ICszNCw3IEBACiAKICNpbmNsdWRlICJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgiCiAjaW5jbHVkZSAiU2VydmljZUxvZy5oIgotI2luY2x1ZGUgIm1lZGlhdXRpbHMvU2NoZWR1bGluZ1BvbGljeVNlcnZpY2UuaCIKLSNpbmNsdWRlIDxjdXRpbHMvc2NoZWRfcG9saWN5Lmg+CisKIG5hbWVzcGFjZSBhbmRyb2lkIHsKIAogbmFtZXNwYWNlIHsKQEAgLTY5LDkgKzcxLDkgQEAKICAgICByZXR1cm4gaXRlbXNTdHI7CiB9CiAKLXN0YXRpYyBib29sIGhhc1Jlc291cmNlVHlwZShNZWRpYVJlc291cmNlOjpUeXBlIHR5cGUsIGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiYgcmVzb3VyY2VzKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCByZXNvdXJjZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgaWYgKHJlc291cmNlc1tpXS5tVHlwZSA9PSB0eXBlKSB7CitzdGF0aWMgYm9vbCBoYXNSZXNvdXJjZVR5cGUoTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlLCBjb25zdCBSZXNvdXJjZUxpc3QmIHJlc291cmNlcykgeworICAgIGZvciAoYXV0byBpdCA9IHJlc291cmNlcy5iZWdpbigpOyBpdCAhPSByZXNvdXJjZXMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgaWYgKGl0LT5zZWNvbmQubVR5cGUgPT0gdHlwZSkgewogICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KICAgICB9CkBAIC0xMDEsMjAgKzEwMywyMiBAQAogfQogCiBzdGF0aWMgUmVzb3VyY2VJbmZvJiBnZXRSZXNvdXJjZUluZm9Gb3JFZGl0KAorICAgICAgICB1aWRfdCB1aWQsCiAgICAgICAgIGludDY0X3QgY2xpZW50SWQsCiAgICAgICAgIGNvbnN0IHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgIFJlc291cmNlSW5mb3MmIGluZm9zKSB7Ci0gICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAoaW5mb3NbaV0uY2xpZW50SWQgPT0gY2xpZW50SWQpIHsKLSAgICAgICAgICAgIHJldHVybiBpbmZvcy5lZGl0SXRlbUF0KGkpOwotICAgICAgICB9CisgICAgc3NpemVfdCBpbmRleCA9IGluZm9zLmluZGV4T2ZLZXkoY2xpZW50SWQpOworCisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBSZXNvdXJjZUluZm8gaW5mbzsKKyAgICAgICAgaW5mby51aWQgPSB1aWQ7CisgICAgICAgIGluZm8uY2xpZW50SWQgPSBjbGllbnRJZDsKKyAgICAgICAgaW5mby5jbGllbnQgPSBjbGllbnQ7CisKKyAgICAgICAgaW5kZXggPSBpbmZvcy5hZGQoY2xpZW50SWQsIGluZm8pOwogICAgIH0KLSAgICBSZXNvdXJjZUluZm8gaW5mbzsKLSAgICBpbmZvLmNsaWVudElkID0gY2xpZW50SWQ7Ci0gICAgaW5mby5jbGllbnQgPSBjbGllbnQ7Ci0gICAgaW5mby5jcHVCb29zdCA9IGZhbHNlOwotICAgIGluZm9zLnB1c2hfYmFjayhpbmZvKTsKLSAgICByZXR1cm4gaW5mb3MuZWRpdEl0ZW1BdChpbmZvcy5zaXplKCkgLSAxKTsKKworICAgIHJldHVybiBpbmZvcy5lZGl0VmFsdWVBdChpbmRleCk7CiB9CiAKIHN0YXRpYyB2b2lkIG5vdGlmeVJlc291cmNlR3JhbnRlZChpbnQgcGlkLCBjb25zdCBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gJnJlc291cmNlcykgewpAQCAtMTgxLDEwICsxODUsMTAgQEAKICAgICAgICAgICAgIHNucHJpbnRmKGJ1ZmZlciwgU0laRSwgIiAgICAgICAgTmFtZTogJXNcbiIsIGluZm9zW2pdLmNsaWVudC0+Z2V0TmFtZSgpLnN0cmluZygpKTsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKIAotICAgICAgICAgICAgVmVjdG9yPE1lZGlhUmVzb3VyY2U+IHJlc291cmNlcyA9IGluZm9zW2pdLnJlc291cmNlczsKKyAgICAgICAgICAgIGNvbnN0IFJlc291cmNlTGlzdCAmcmVzb3VyY2VzID0gaW5mb3Nbal0ucmVzb3VyY2VzOwogICAgICAgICAgICAgcmVzdWx0LmFwcGVuZCgiICAgICAgICBSZXNvdXJjZXM6XG4iKTsKLSAgICAgICAgICAgIGZvciAoc2l6ZV90IGsgPSAwOyBrIDwgcmVzb3VyY2VzLnNpemUoKTsgKytrKSB7Ci0gICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICAgICAgICVzXG4iLCByZXNvdXJjZXNba10udG9TdHJpbmcoKS5zdHJpbmcoKSk7CisgICAgICAgICAgICBmb3IgKGF1dG8gaXQgPSByZXNvdXJjZXMuYmVnaW4oKTsgaXQgIT0gcmVzb3VyY2VzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICAgICAgc25wcmludGYoYnVmZmVyLCBTSVpFLCAiICAgICAgICAgICVzXG4iLCBpdC0+c2Vjb25kLnRvU3RyaW5nKCkuc3RyaW5nKCkpOwogICAgICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoYnVmZmVyKTsKICAgICAgICAgICAgIH0KICAgICAgICAgfQpAQCAtMTk2LDE1ICsyMDAsNDUgQEAKICAgICByZXR1cm4gT0s7CiB9CiAKLVJlc291cmNlTWFuYWdlclNlcnZpY2U6OlJlc291cmNlTWFuYWdlclNlcnZpY2UoKQotICAgIDogUmVzb3VyY2VNYW5hZ2VyU2VydmljZShuZXcgUHJvY2Vzc0luZm8oKSkge30KK3N0cnVjdCBTeXN0ZW1DYWxsYmFja0ltcGwgOgorICAgICAgICBwdWJsaWMgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6U3lzdGVtQ2FsbGJhY2tJbnRlcmZhY2UgeworICAgIFN5c3RlbUNhbGxiYWNrSW1wbCgpIHt9CiAKLVJlc291cmNlTWFuYWdlclNlcnZpY2U6OlJlc291cmNlTWFuYWdlclNlcnZpY2Uoc3A8UHJvY2Vzc0luZm9JbnRlcmZhY2U+IHByb2Nlc3NJbmZvKQorICAgIHZpcnR1YWwgdm9pZCBub3RlU3RhcnRWaWRlbyhpbnQgdWlkKSBvdmVycmlkZSB7CisgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlU3RhcnRWaWRlbyh1aWQpOworICAgIH0KKyAgICB2aXJ0dWFsIHZvaWQgbm90ZVN0b3BWaWRlbyhpbnQgdWlkKSBvdmVycmlkZSB7CisgICAgICAgIEJhdHRlcnlOb3RpZmllcjo6Z2V0SW5zdGFuY2UoKS5ub3RlU3RvcFZpZGVvKHVpZCk7CisgICAgfQorICAgIHZpcnR1YWwgdm9pZCBub3RlUmVzZXRWaWRlbygpIG92ZXJyaWRlIHsKKyAgICAgICAgQmF0dGVyeU5vdGlmaWVyOjpnZXRJbnN0YW5jZSgpLm5vdGVSZXNldFZpZGVvKCk7CisgICAgfQorICAgIHZpcnR1YWwgYm9vbCByZXF1ZXN0Q3B1c2V0Qm9vc3QoCisgICAgICAgICAgICBib29sIGVuYWJsZSwgY29uc3Qgc3A8SUludGVyZmFjZT4gJmNsaWVudCkgb3ZlcnJpZGUgeworICAgICAgICByZXR1cm4gYW5kcm9pZDo6cmVxdWVzdENwdXNldEJvb3N0KGVuYWJsZSwgY2xpZW50KTsKKyAgICB9CisKK3Byb3RlY3RlZDoKKyAgICB2aXJ0dWFsIH5TeXN0ZW1DYWxsYmFja0ltcGwoKSB7fQorCitwcml2YXRlOgorICAgIERJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFN5c3RlbUNhbGxiYWNrSW1wbCk7Cit9OworCitSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKCkKKyAgICA6IFJlc291cmNlTWFuYWdlclNlcnZpY2UobmV3IFByb2Nlc3NJbmZvKCksIG5ldyBTeXN0ZW1DYWxsYmFja0ltcGwoKSkge30KKworUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6UmVzb3VyY2VNYW5hZ2VyU2VydmljZSgKKyAgICAgICAgY29uc3Qgc3A8UHJvY2Vzc0luZm9JbnRlcmZhY2U+ICZwcm9jZXNzSW5mbywKKyAgICAgICAgY29uc3Qgc3A8U3lzdGVtQ2FsbGJhY2tJbnRlcmZhY2U+ICZzeXN0ZW1SZXNvdXJjZSkKICAgICA6IG1Qcm9jZXNzSW5mbyhwcm9jZXNzSW5mbyksCisgICAgICBtU3lzdGVtQ0Ioc3lzdGVtUmVzb3VyY2UpLAogICAgICAgbVNlcnZpY2VMb2cobmV3IFNlcnZpY2VMb2coKSksCiAgICAgICBtU3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjcyh0cnVlKSwKICAgICAgIG1TdXBwb3J0c1NlY3VyZVdpdGhOb25TZWN1cmVDb2RlYyh0cnVlKSwKLSAgICAgIG1DcHVCb29zdENvdW50KDApIHt9CisgICAgICBtQ3B1Qm9vc3RDb3VudCgwKSB7CisgICAgbVN5c3RlbUNCLT5ub3RlUmVzZXRWaWRlbygpOworfQogCiBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjp+UmVzb3VyY2VNYW5hZ2VyU2VydmljZSgpIHt9CiAKQEAgLTIyNCw4ICsyNTgsNTMgQEAKICAgICB9CiB9CiAKK3ZvaWQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6b25GaXJzdEFkZGVkKAorICAgICAgICBjb25zdCBNZWRpYVJlc291cmNlJiByZXNvdXJjZSwgY29uc3QgUmVzb3VyY2VJbmZvJiBjbGllbnRJbmZvKSB7CisgICAgLy8gZmlyc3QgdGltZSBhZGRlZAorICAgIGlmIChyZXNvdXJjZS5tVHlwZSA9PSBNZWRpYVJlc291cmNlOjprQ3B1Qm9vc3QKKyAgICAgJiYgcmVzb3VyY2UubVN1YlR5cGUgPT0gTWVkaWFSZXNvdXJjZTo6a1Vuc3BlY2lmaWVkU3ViVHlwZSkgeworICAgICAgICAvLyBSZXF1ZXN0IGl0IG9uIGV2ZXJ5IG5ldyBpbnN0YW5jZSBvZiBrQ3B1Qm9vc3QsIGFzIHRoZSBtZWRpYS5jb2RlYworICAgICAgICAvLyBjb3VsZCBoYXZlIGRpZWQsIGlmIHdlIG9ubHkgZG8gaXQgdGhlIGZpcnN0IHRpbWUgc3Vic2VxdWVudCBpbnN0YW5jZXMKKyAgICAgICAgLy8gbmV2ZXIgZ2V0cyB0aGUgYm9vc3QuCisgICAgICAgIGlmIChtU3lzdGVtQ0ItPnJlcXVlc3RDcHVzZXRCb29zdCh0cnVlLCB0aGlzKSAhPSBPSykgeworICAgICAgICAgICAgQUxPR1coImNvdWxkbid0IHJlcXVlc3QgY3B1c2V0IGJvb3N0Iik7CisgICAgICAgIH0KKyAgICAgICAgbUNwdUJvb3N0Q291bnQrKzsKKyAgICB9IGVsc2UgaWYgKHJlc291cmNlLm1UeXBlID09IE1lZGlhUmVzb3VyY2U6OmtCYXR0ZXJ5CisgICAgICAgICAgICAmJiByZXNvdXJjZS5tU3ViVHlwZSA9PSBNZWRpYVJlc291cmNlOjprVmlkZW9Db2RlYykgeworICAgICAgICBtU3lzdGVtQ0ItPm5vdGVTdGFydFZpZGVvKGNsaWVudEluZm8udWlkKTsKKyAgICB9Cit9CisKK3ZvaWQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6b25MYXN0UmVtb3ZlZCgKKyAgICAgICAgY29uc3QgTWVkaWFSZXNvdXJjZSYgcmVzb3VyY2UsIGNvbnN0IFJlc291cmNlSW5mbyYgY2xpZW50SW5mbykgeworICAgIGlmIChyZXNvdXJjZS5tVHlwZSA9PSBNZWRpYVJlc291cmNlOjprQ3B1Qm9vc3QKKyAgICAgICAgICAgICYmIHJlc291cmNlLm1TdWJUeXBlID09IE1lZGlhUmVzb3VyY2U6OmtVbnNwZWNpZmllZFN1YlR5cGUKKyAgICAgICAgICAgICYmIG1DcHVCb29zdENvdW50ID4gMCkgeworICAgICAgICBpZiAoLS1tQ3B1Qm9vc3RDb3VudCA9PSAwKSB7CisgICAgICAgICAgICBtU3lzdGVtQ0ItPnJlcXVlc3RDcHVzZXRCb29zdChmYWxzZSwgdGhpcyk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgaWYgKHJlc291cmNlLm1UeXBlID09IE1lZGlhUmVzb3VyY2U6OmtCYXR0ZXJ5CisgICAgICAgICAgICAmJiByZXNvdXJjZS5tU3ViVHlwZSA9PSBNZWRpYVJlc291cmNlOjprVmlkZW9Db2RlYykgeworICAgICAgICBtU3lzdGVtQ0ItPm5vdGVTdG9wVmlkZW8oY2xpZW50SW5mby51aWQpOworICAgIH0KK30KKwordm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjptZXJnZVJlc291cmNlcygKKyAgICAgICAgTWVkaWFSZXNvdXJjZSYgcjEsIGNvbnN0IE1lZGlhUmVzb3VyY2UmIHIyKSB7CisgICAgaWYgKHIxLm1UeXBlID09IE1lZGlhUmVzb3VyY2U6OmtEcm1TZXNzaW9uKSB7CisgICAgICAgIC8vIFRoaXMgbWVhbnMgd2UgYXJlIHVzaW5nIGEgc2Vzc2lvbi4gRWFjaCBzZXNzaW9uJ3MgbVZhbHVlIGlzIGluaXRpYWxpemVkIHRvIFVJTlQ2NF9NQVguCisgICAgICAgIC8vIFRoZSBvZnRlbmVyIGEgc2Vzc2lvbiBpcyB1c2VkIHRoZSBsb3dlciBpdCdzIG1WYWx1ZS4gRHVyaW5nIHJlY2xhaW0gdGhlIHNlc3Npb24gd2l0aAorICAgICAgICAvLyB0aGUgaGlnaGVzdCBtVmFsdWUvbG93ZXN0IHVzYWdlIHdvdWxkIGJlIGNsb3NlZC4KKyAgICAgICAgcjEubVZhbHVlIC09IChyMS5tVmFsdWUgPT0gMCA/IDAgOiAxKTsKKyAgICB9IGVsc2UgeworICAgICAgICByMS5tVmFsdWUgKz0gcjIubVZhbHVlOworICAgIH0KK30KKwogdm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjphZGRSZXNvdXJjZSgKICAgICAgICAgaW50IHBpZCwKKyAgICAgICAgaW50IHVpZCwKICAgICAgICAgaW50NjRfdCBjbGllbnRJZCwKICAgICAgICAgY29uc3Qgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50LAogICAgICAgICBjb25zdCBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gJnJlc291cmNlcykgewpAQCAtMjM5LDMwICszMTgsNzAgQEAKICAgICAgICAgcmV0dXJuOwogICAgIH0KICAgICBSZXNvdXJjZUluZm9zJiBpbmZvcyA9IGdldFJlc291cmNlSW5mb3NGb3JFZGl0KHBpZCwgbU1hcCk7Ci0gICAgUmVzb3VyY2VJbmZvJiBpbmZvID0gZ2V0UmVzb3VyY2VJbmZvRm9yRWRpdChjbGllbnRJZCwgY2xpZW50LCBpbmZvcyk7Ci0gICAgLy8gVE9ETzogZG8gdGhlIG1lcmdlIGluc3RlYWQgb2YgYXBwZW5kLgotICAgIGluZm8ucmVzb3VyY2VzLmFwcGVuZFZlY3RvcihyZXNvdXJjZXMpOworICAgIFJlc291cmNlSW5mbyYgaW5mbyA9IGdldFJlc291cmNlSW5mb0ZvckVkaXQodWlkLCBjbGllbnRJZCwgY2xpZW50LCBpbmZvcyk7CiAKICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7ICsraSkgewotICAgICAgICBpZiAocmVzb3VyY2VzW2ldLm1UeXBlID09IE1lZGlhUmVzb3VyY2U6OmtDcHVCb29zdCAmJiAhaW5mby5jcHVCb29zdCkgewotICAgICAgICAgICAgaW5mby5jcHVCb29zdCA9IHRydWU7Ci0gICAgICAgICAgICAvLyBSZXF1ZXN0IGl0IG9uIGV2ZXJ5IG5ldyBpbnN0YW5jZSBvZiBrQ3B1Qm9vc3QsIGFzIHRoZSBtZWRpYS5jb2RlYwotICAgICAgICAgICAgLy8gY291bGQgaGF2ZSBkaWVkLCBpZiB3ZSBvbmx5IGRvIGl0IHRoZSBmaXJzdCB0aW1lIHN1YnNlcXVlbnQgaW5zdGFuY2VzCi0gICAgICAgICAgICAvLyBuZXZlciBnZXRzIHRoZSBib29zdC4KLSAgICAgICAgICAgIGlmIChyZXF1ZXN0Q3B1c2V0Qm9vc3QodHJ1ZSwgdGhpcykgIT0gT0spIHsKLSAgICAgICAgICAgICAgICBBTE9HVygiY291bGRuJ3QgcmVxdWVzdCBjcHVzZXQgYm9vc3QiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG1DcHVCb29zdENvdW50Kys7CisgICAgICAgIGNvbnN0IGF1dG8gJnJlcyA9IHJlc291cmNlc1tpXTsKKyAgICAgICAgY29uc3QgYXV0byByZXNUeXBlID0gc3RkOjp0dXBsZShyZXMubVR5cGUsIHJlcy5tU3ViVHlwZSwgcmVzLm1JZCk7CisgICAgICAgIGlmIChpbmZvLnJlc291cmNlcy5maW5kKHJlc1R5cGUpID09IGluZm8ucmVzb3VyY2VzLmVuZCgpKSB7CisgICAgICAgICAgICBvbkZpcnN0QWRkZWQocmVzLCBpbmZvKTsKKyAgICAgICAgICAgIGluZm8ucmVzb3VyY2VzW3Jlc1R5cGVdID0gcmVzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbWVyZ2VSZXNvdXJjZXMoaW5mby5yZXNvdXJjZXNbcmVzVHlwZV0sIHJlcyk7CiAgICAgICAgIH0KICAgICB9Ci0gICAgaWYgKGluZm8uZGVhdGhOb3RpZmllciA9PSBudWxscHRyKSB7CisgICAgaWYgKGluZm8uZGVhdGhOb3RpZmllciA9PSBudWxscHRyICYmIGNsaWVudCAhPSBudWxscHRyKSB7CiAgICAgICAgIGluZm8uZGVhdGhOb3RpZmllciA9IG5ldyBEZWF0aE5vdGlmaWVyKHRoaXMsIHBpZCwgY2xpZW50SWQpOwogICAgICAgICBJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnQpLT5saW5rVG9EZWF0aChpbmZvLmRlYXRoTm90aWZpZXIpOwogICAgIH0KICAgICBub3RpZnlSZXNvdXJjZUdyYW50ZWQocGlkLCByZXNvdXJjZXMpOwogfQogCi12b2lkIFJlc291cmNlTWFuYWdlclNlcnZpY2U6OnJlbW92ZVJlc291cmNlKGludCBwaWQsIGludDY0X3QgY2xpZW50SWQpIHsKK3ZvaWQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6cmVtb3ZlUmVzb3VyY2UoaW50IHBpZCwgaW50NjRfdCBjbGllbnRJZCwKKyAgICAgICAgY29uc3QgVmVjdG9yPE1lZGlhUmVzb3VyY2U+ICZyZXNvdXJjZXMpIHsKKyAgICBTdHJpbmc4IGxvZyA9IFN0cmluZzg6OmZvcm1hdCgicmVtb3ZlUmVzb3VyY2UocGlkICVkLCBjbGllbnRJZCAlbGxkLCByZXNvdXJjZXMgJXMpIiwKKyAgICAgICAgICAgIHBpZCwgKGxvbmcgbG9uZykgY2xpZW50SWQsIGdldFN0cmluZyhyZXNvdXJjZXMpLnN0cmluZygpKTsKKyAgICBtU2VydmljZUxvZy0+YWRkKGxvZyk7CisKKyAgICBNdXRleDo6QXV0b2xvY2sgbG9jayhtTG9jayk7CisgICAgaWYgKCFtUHJvY2Vzc0luZm8tPmlzVmFsaWRQaWQocGlkKSkgeworICAgICAgICBBTE9HRSgiUmVqZWN0ZWQgcmVtb3ZlUmVzb3VyY2UgY2FsbCB3aXRoIGludmFsaWQgcGlkLiIpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNzaXplX3QgaW5kZXggPSBtTWFwLmluZGV4T2ZLZXkocGlkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dWKCJyZW1vdmVSZXNvdXJjZTogZGlkbid0IGZpbmQgcGlkICVkIGZvciBjbGllbnRJZCAlbGxkIiwgcGlkLCAobG9uZyBsb25nKSBjbGllbnRJZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgUmVzb3VyY2VJbmZvcyAmaW5mb3MgPSBtTWFwLmVkaXRWYWx1ZUF0KGluZGV4KTsKKworICAgIGluZGV4ID0gaW5mb3MuaW5kZXhPZktleShjbGllbnRJZCk7CisgICAgaWYgKGluZGV4IDwgMCkgeworICAgICAgICBBTE9HVigicmVtb3ZlUmVzb3VyY2U6IGRpZG4ndCBmaW5kIGNsaWVudElkICVsbGQiLCAobG9uZyBsb25nKSBjbGllbnRJZCk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBSZXNvdXJjZUluZm8gJmluZm8gPSBpbmZvcy5lZGl0VmFsdWVBdChpbmRleCk7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7ICsraSkgeworICAgICAgICBjb25zdCBhdXRvICZyZXMgPSByZXNvdXJjZXNbaV07CisgICAgICAgIGNvbnN0IGF1dG8gcmVzVHlwZSA9IHN0ZDo6dHVwbGUocmVzLm1UeXBlLCByZXMubVN1YlR5cGUsIHJlcy5tSWQpOworICAgICAgICAvLyBpZ25vcmUgaWYgd2UgZG9uJ3QgaGF2ZSBpdAorICAgICAgICBpZiAoaW5mby5yZXNvdXJjZXMuZmluZChyZXNUeXBlKSAhPSBpbmZvLnJlc291cmNlcy5lbmQoKSkgeworICAgICAgICAgICAgTWVkaWFSZXNvdXJjZSAmcmVzb3VyY2UgPSBpbmZvLnJlc291cmNlc1tyZXNUeXBlXTsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZS5tVmFsdWUgPiByZXMubVZhbHVlKSB7CisgICAgICAgICAgICAgICAgcmVzb3VyY2UubVZhbHVlIC09IHJlcy5tVmFsdWU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIGRybSBzZXNzaW9ucyBhbHdheXMgdGFrZSB0aGlzIGJyYW5jaCBiZWNhdXNlIHJlcy5tVmFsdWUgaXMgc2V0CisgICAgICAgICAgICAgICAgLy8gdG8gVUlOVDY0X01BWAorICAgICAgICAgICAgICAgIG9uTGFzdFJlbW92ZWQocmVzLCBpbmZvKTsKKyAgICAgICAgICAgICAgICBpbmZvLnJlc291cmNlcy5lcmFzZShyZXNUeXBlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlOjpyZW1vdmVDbGllbnQoaW50IHBpZCwgaW50NjRfdCBjbGllbnRJZCkgewogICAgIHJlbW92ZVJlc291cmNlKHBpZCwgY2xpZW50SWQsIHRydWUpOwogfQogCkBAIC0yODIsMjQgKzQwMSwyMiBAQAogICAgICAgICBBTE9HVigicmVtb3ZlUmVzb3VyY2U6IGRpZG4ndCBmaW5kIHBpZCAlZCBmb3IgY2xpZW50SWQgJWxsZCIsIHBpZCwgKGxvbmcgbG9uZykgY2xpZW50SWQpOwogICAgICAgICByZXR1cm47CiAgICAgfQotICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKICAgICBSZXNvdXJjZUluZm9zICZpbmZvcyA9IG1NYXAuZWRpdFZhbHVlQXQoaW5kZXgpOwotICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgaW5mb3Muc2l6ZSgpOyArK2opIHsKLSAgICAgICAgaWYgKGluZm9zW2pdLmNsaWVudElkID09IGNsaWVudElkKSB7Ci0gICAgICAgICAgICBpZiAoaW5mb3Nbal0uY3B1Qm9vc3QgJiYgbUNwdUJvb3N0Q291bnQgPiAwKSB7Ci0gICAgICAgICAgICAgICAgaWYgKC0tbUNwdUJvb3N0Q291bnQgPT0gMCkgewotICAgICAgICAgICAgICAgICAgICByZXF1ZXN0Q3B1c2V0Qm9vc3QoZmFsc2UsIHRoaXMpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGluZm9zW2pdLmNsaWVudCktPnVubGlua1RvRGVhdGgoaW5mb3Nbal0uZGVhdGhOb3RpZmllcik7Ci0gICAgICAgICAgICBqID0gaW5mb3MucmVtb3ZlQXQoaik7Ci0gICAgICAgICAgICBmb3VuZCA9IHRydWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQorCisgICAgaW5kZXggPSBpbmZvcy5pbmRleE9mS2V5KGNsaWVudElkKTsKKyAgICBpZiAoaW5kZXggPCAwKSB7CisgICAgICAgIEFMT0dWKCJyZW1vdmVSZXNvdXJjZTogZGlkbid0IGZpbmQgY2xpZW50SWQgJWxsZCIsIChsb25nIGxvbmcpIGNsaWVudElkKTsKKyAgICAgICAgcmV0dXJuOwogICAgIH0KLSAgICBpZiAoIWZvdW5kKSB7Ci0gICAgICAgIEFMT0dWKCJkaWRuJ3QgZmluZCBjbGllbnQiKTsKKworICAgIGNvbnN0IFJlc291cmNlSW5mbyAmaW5mbyA9IGluZm9zW2luZGV4XTsKKyAgICBmb3IgKGF1dG8gaXQgPSBpbmZvLnJlc291cmNlcy5iZWdpbigpOyBpdCAhPSBpbmZvLnJlc291cmNlcy5lbmQoKTsgaXQrKykgeworICAgICAgICBvbkxhc3RSZW1vdmVkKGl0LT5zZWNvbmQsIGluZm8pOwogICAgIH0KKworICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKGluZm8uY2xpZW50KS0+dW5saW5rVG9EZWF0aChpbmZvLmRlYXRoTm90aWZpZXIpOworCisgICAgaW5mb3MucmVtb3ZlSXRlbXNBdChpbmRleCk7CiB9CiAKIHZvaWQgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6Z2V0Q2xpZW50Rm9yUmVzb3VyY2VfbCgKQEAgLTMyOSw2ICs0NDYsNyBAQAogICAgICAgICBjb25zdCBNZWRpYVJlc291cmNlICpzZWN1cmVDb2RlYyA9IE5VTEw7CiAgICAgICAgIGNvbnN0IE1lZGlhUmVzb3VyY2UgKm5vblNlY3VyZUNvZGVjID0gTlVMTDsKICAgICAgICAgY29uc3QgTWVkaWFSZXNvdXJjZSAqZ3JhcGhpY01lbW9yeSA9IE5VTEw7CisgICAgICAgIGNvbnN0IE1lZGlhUmVzb3VyY2UgKmRybVNlc3Npb24gPSBOVUxMOwogICAgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc291cmNlcy5zaXplKCk7ICsraSkgewogICAgICAgICAgICAgTWVkaWFSZXNvdXJjZTo6VHlwZSB0eXBlID0gcmVzb3VyY2VzW2ldLm1UeXBlOwogICAgICAgICAgICAgaWYgKHJlc291cmNlc1tpXS5tVHlwZSA9PSBNZWRpYVJlc291cmNlOjprU2VjdXJlQ29kZWMpIHsKQEAgLTMzNyw2ICs0NTUsOCBAQAogICAgICAgICAgICAgICAgIG5vblNlY3VyZUNvZGVjID0gJnJlc291cmNlc1tpXTsKICAgICAgICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBNZWRpYVJlc291cmNlOjprR3JhcGhpY01lbW9yeSkgewogICAgICAgICAgICAgICAgIGdyYXBoaWNNZW1vcnkgPSAmcmVzb3VyY2VzW2ldOworICAgICAgICAgICAgfSBlbHNlIGlmICh0eXBlID09IE1lZGlhUmVzb3VyY2U6OmtEcm1TZXNzaW9uKSB7CisgICAgICAgICAgICAgICAgZHJtU2Vzc2lvbiA9ICZyZXNvdXJjZXNbaV07CiAgICAgICAgICAgICB9CiAgICAgICAgIH0KIApAQCAtMzYwLDYgKzQ4MCwxMiBAQAogICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgIH0KICAgICAgICAgfQorICAgICAgICBpZiAoZHJtU2Vzc2lvbiAhPSBOVUxMKSB7CisgICAgICAgICAgICBnZXRDbGllbnRGb3JSZXNvdXJjZV9sKGNhbGxpbmdQaWQsIGRybVNlc3Npb24sICZjbGllbnRzKTsKKyAgICAgICAgICAgIGlmIChjbGllbnRzLnNpemUoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CiAKICAgICAgICAgaWYgKGNsaWVudHMuc2l6ZSgpID09IDApIHsKICAgICAgICAgICAgIC8vIGlmIG5vIHNlY3VyZS9ub24tc2VjdXJlIGNvZGVjIGNvbmZsaWN0LCBydW4gc2Vjb25kIHBhc3MgdG8gaGFuZGxlIG90aGVyIHJlc291cmNlcy4KQEAgLTQxMCw3ICs1MzYsNyBAQAogICAgICAgICAgICAgUmVzb3VyY2VJbmZvcyAmaW5mb3MgPSBtTWFwLmVkaXRWYWx1ZUF0KGkpOwogICAgICAgICAgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpbmZvcy5zaXplKCk7KSB7CiAgICAgICAgICAgICAgICAgaWYgKGluZm9zW2pdLmNsaWVudCA9PSBmYWlsZWRDbGllbnQpIHsKLSAgICAgICAgICAgICAgICAgICAgaiA9IGluZm9zLnJlbW92ZUF0KGopOworICAgICAgICAgICAgICAgICAgICBqID0gaW5mb3MucmVtb3ZlSXRlbXNBdChqKTsKICAgICAgICAgICAgICAgICAgICAgZm91bmQgPSB0cnVlOwogICAgICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgICsrajsKQEAgLTUzOCwxMSArNjY0LDEyIEBACiAgICAgdWludDY0X3QgbGFyZ2VzdFZhbHVlID0gMDsKICAgICBjb25zdCBSZXNvdXJjZUluZm9zICZpbmZvcyA9IG1NYXAudmFsdWVBdChpbmRleCk7CiAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBpbmZvcy5zaXplKCk7ICsraSkgewotICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzID0gaW5mb3NbaV0ucmVzb3VyY2VzOwotICAgICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IHJlc291cmNlcy5zaXplKCk7ICsraikgewotICAgICAgICAgICAgaWYgKHJlc291cmNlc1tqXS5tVHlwZSA9PSB0eXBlKSB7Ci0gICAgICAgICAgICAgICAgaWYgKHJlc291cmNlc1tqXS5tVmFsdWUgPiBsYXJnZXN0VmFsdWUpIHsKLSAgICAgICAgICAgICAgICAgICAgbGFyZ2VzdFZhbHVlID0gcmVzb3VyY2VzW2pdLm1WYWx1ZTsKKyAgICAgICAgY29uc3QgUmVzb3VyY2VMaXN0ICZyZXNvdXJjZXMgPSBpbmZvc1tpXS5yZXNvdXJjZXM7CisgICAgICAgIGZvciAoYXV0byBpdCA9IHJlc291cmNlcy5iZWdpbigpOyBpdCAhPSByZXNvdXJjZXMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgIGNvbnN0IE1lZGlhUmVzb3VyY2UgJnJlc291cmNlID0gaXQtPnNlY29uZDsKKyAgICAgICAgICAgIGlmIChyZXNvdXJjZS5tVHlwZSA9PSB0eXBlKSB7CisgICAgICAgICAgICAgICAgaWYgKHJlc291cmNlLm1WYWx1ZSA+IGxhcmdlc3RWYWx1ZSkgeworICAgICAgICAgICAgICAgICAgICBsYXJnZXN0VmFsdWUgPSByZXNvdXJjZS5tVmFsdWU7CiAgICAgICAgICAgICAgICAgICAgIGNsaWVudFRlbXAgPSBpbmZvc1tpXS5jbGllbnQ7CiAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvUmVzb3VyY2VNYW5hZ2VyU2VydmljZS5oCmluZGV4IDgyZDJhMGIuLjQ0ZDBjMjggMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1Jlc291cmNlTWFuYWdlclNlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlLmgKQEAgLTMzLDE1ICszMywxNyBAQAogY2xhc3MgU2VydmljZUxvZzsKIHN0cnVjdCBQcm9jZXNzSW5mb0ludGVyZmFjZTsKIAordHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnR1cGxlPE1lZGlhUmVzb3VyY2U6OlR5cGUsIE1lZGlhUmVzb3VyY2U6OlN1YlR5cGUsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiwgTWVkaWFSZXNvdXJjZT4gUmVzb3VyY2VMaXN0Owogc3RydWN0IFJlc291cmNlSW5mbyB7CiAgICAgaW50NjRfdCBjbGllbnRJZDsKKyAgICB1aWRfdCB1aWQ7CiAgICAgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50OwogICAgIHNwPElCaW5kZXI6OkRlYXRoUmVjaXBpZW50PiBkZWF0aE5vdGlmaWVyOwotICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXM7Ci0gICAgYm9vbCBjcHVCb29zdDsKKyAgICBSZXNvdXJjZUxpc3QgcmVzb3VyY2VzOwogfTsKIAotdHlwZWRlZiBWZWN0b3I8UmVzb3VyY2VJbmZvPiBSZXNvdXJjZUluZm9zOworLy8gVE9ETzogY29udmVydCB0aGVzZSB0byBzdGQ6Om1hcAordHlwZWRlZiBLZXllZFZlY3RvcjxpbnQ2NF90LCBSZXNvdXJjZUluZm8+IFJlc291cmNlSW5mb3M7CiB0eXBlZGVmIEtleWVkVmVjdG9yPGludCwgUmVzb3VyY2VJbmZvcz4gUGlkUmVzb3VyY2VJbmZvc01hcDsKIAogY2xhc3MgUmVzb3VyY2VNYW5hZ2VyU2VydmljZQpAQCAtNDksMjMgKzUxLDM3IEBACiAgICAgICBwdWJsaWMgQm5SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlCiB7CiBwdWJsaWM6CisgICAgc3RydWN0IFN5c3RlbUNhbGxiYWNrSW50ZXJmYWNlIDogcHVibGljIFJlZkJhc2UgeworICAgICAgICB2aXJ0dWFsIHZvaWQgbm90ZVN0YXJ0VmlkZW8oaW50IHVpZCkgPSAwOworICAgICAgICB2aXJ0dWFsIHZvaWQgbm90ZVN0b3BWaWRlbyhpbnQgdWlkKSA9IDA7CisgICAgICAgIHZpcnR1YWwgdm9pZCBub3RlUmVzZXRWaWRlbygpID0gMDsKKyAgICAgICAgdmlydHVhbCBib29sIHJlcXVlc3RDcHVzZXRCb29zdCgKKyAgICAgICAgICAgICAgICBib29sIGVuYWJsZSwgY29uc3Qgc3A8SUludGVyZmFjZT4gJmNsaWVudCkgPSAwOworICAgIH07CisKICAgICBzdGF0aWMgY2hhciBjb25zdCAqZ2V0U2VydmljZU5hbWUoKSB7IHJldHVybiAibWVkaWEucmVzb3VyY2VfbWFuYWdlciI7IH0KIAogICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCiAgICAgUmVzb3VyY2VNYW5hZ2VyU2VydmljZSgpOwotICAgIGV4cGxpY2l0IFJlc291cmNlTWFuYWdlclNlcnZpY2Uoc3A8UHJvY2Vzc0luZm9JbnRlcmZhY2U+IHByb2Nlc3NJbmZvKTsKKyAgICBleHBsaWNpdCBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKAorICAgICAgICAgICAgY29uc3Qgc3A8UHJvY2Vzc0luZm9JbnRlcmZhY2U+ICZwcm9jZXNzSW5mbywKKyAgICAgICAgICAgIGNvbnN0IHNwPFN5c3RlbUNhbGxiYWNrSW50ZXJmYWNlPiAmc3lzdGVtUmVzb3VyY2UpOwogCiAgICAgLy8gSVJlc291cmNlTWFuYWdlclNlcnZpY2UgaW50ZXJmYWNlCiAgICAgdmlydHVhbCB2b2lkIGNvbmZpZyhjb25zdCBWZWN0b3I8TWVkaWFSZXNvdXJjZVBvbGljeT4gJnBvbGljaWVzKTsKIAogICAgIHZpcnR1YWwgdm9pZCBhZGRSZXNvdXJjZSgKICAgICAgICAgICAgIGludCBwaWQsCisgICAgICAgICAgICBpbnQgdWlkLAogICAgICAgICAgICAgaW50NjRfdCBjbGllbnRJZCwKICAgICAgICAgICAgIGNvbnN0IHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudCwKICAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzKTsKIAotICAgIHZpcnR1YWwgdm9pZCByZW1vdmVSZXNvdXJjZShpbnQgcGlkLCBpbnQ2NF90IGNsaWVudElkKTsKKyAgICB2aXJ0dWFsIHZvaWQgcmVtb3ZlUmVzb3VyY2UoaW50IHBpZCwgaW50NjRfdCBjbGllbnRJZCwKKyAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzKTsKKworICAgIHZpcnR1YWwgdm9pZCByZW1vdmVDbGllbnQoaW50IHBpZCwgaW50NjRfdCBjbGllbnRJZCk7CiAKICAgICAvLyBUcmllcyB0byByZWNsYWltIHJlc291cmNlIGZyb20gcHJvY2Vzc2VzIHdpdGggbG93ZXIgcHJpb3JpdHkgdGhhbiB0aGUgY2FsbGluZyBwcm9jZXNzCiAgICAgLy8gYWNjb3JkaW5nIHRvIHRoZSByZXF1ZXN0ZWQgcmVzb3VyY2VzLgpAQCAtMTA3LDggKzEyMywxNSBAQAogICAgIHZvaWQgZ2V0Q2xpZW50Rm9yUmVzb3VyY2VfbCgKICAgICAgICAgaW50IGNhbGxpbmdQaWQsIGNvbnN0IE1lZGlhUmVzb3VyY2UgKnJlcywgVmVjdG9yPHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+PiAqY2xpZW50cyk7CiAKKyAgICB2b2lkIG9uRmlyc3RBZGRlZChjb25zdCBNZWRpYVJlc291cmNlJiByZXMsIGNvbnN0IFJlc291cmNlSW5mbyYgY2xpZW50SW5mbyk7CisgICAgdm9pZCBvbkxhc3RSZW1vdmVkKGNvbnN0IE1lZGlhUmVzb3VyY2UmIHJlcywgY29uc3QgUmVzb3VyY2VJbmZvJiBjbGllbnRJbmZvKTsKKworICAgIC8vIE1lcmdlIHIyIGludG8gcjEKKyAgICB2b2lkIG1lcmdlUmVzb3VyY2VzKE1lZGlhUmVzb3VyY2UmIHIxLCBjb25zdCBNZWRpYVJlc291cmNlJiByMik7CisKICAgICBtdXRhYmxlIE11dGV4IG1Mb2NrOwogICAgIHNwPFByb2Nlc3NJbmZvSW50ZXJmYWNlPiBtUHJvY2Vzc0luZm87CisgICAgc3A8U3lzdGVtQ2FsbGJhY2tJbnRlcmZhY2U+IG1TeXN0ZW1DQjsKICAgICBzcDxTZXJ2aWNlTG9nPiBtU2VydmljZUxvZzsKICAgICBQaWRSZXNvdXJjZUluZm9zTWFwIG1NYXA7CiAgICAgYm9vbCBtU3VwcG9ydHNNdWx0aXBsZVNlY3VyZUNvZGVjczsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1RFU1RfTUFQUElORyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL1RFU1RfTUFQUElORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MThiMTU5Ci0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvVEVTVF9NQVBQSU5HCkBAIC0wLDAgKzEsMTAgQEAKK3sKKyAgInByZXN1Ym1pdCI6IFsKKyAgICB7CisgICAgICAgIm5hbWUiOiAiUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0IgorICAgIH0sCisgICAgeworICAgICAgICJuYW1lIjogIlNlcnZpY2VMb2dfdGVzdCIKKyAgICB9CisgIF0KK30KZGlmZiAtLWdpdCBhL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvQW5kcm9pZC5icCBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvQW5kcm9pZC5icAppbmRleCA3MGU4ODMzLi41NDNjODdjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L0FuZHJvaWQuYnAKKysrIGIvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9BbmRyb2lkLmJwCkBAIC0yLDYgKzIsNyBAQAogY2NfdGVzdCB7CiAgICAgbmFtZTogIlJlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdCIsCiAgICAgc3JjczogWyJSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QuY3BwIl0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmJpbmRlciIsCiAgICAgICAgICJsaWJsb2ciLApAQCAtMjMsNiArMjQsNyBAQAogY2NfdGVzdCB7CiAgICAgbmFtZTogIlNlcnZpY2VMb2dfdGVzdCIsCiAgICAgc3JjczogWyJTZXJ2aWNlTG9nX3Rlc3QuY3BwIl0sCisgICAgdGVzdF9zdWl0ZXM6IFsiZGV2aWNlLXRlc3RzIl0sCiAgICAgc2hhcmVkX2xpYnM6IFsKICAgICAgICAgImxpYmxvZyIsCiAgICAgICAgICJsaWJtZWRpYSIsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdC5jcHAgYi9zZXJ2aWNlcy9tZWRpYXJlc291cmNlbWFuYWdlci90ZXN0L1Jlc291cmNlTWFuYWdlclNlcnZpY2VfdGVzdC5jcHAKaW5kZXggZWQwYjBlZi4uOWUxNDE1MSAxMDA2NDQKLS0tIGEvc2VydmljZXMvbWVkaWFyZXNvdXJjZW1hbmFnZXIvdGVzdC9SZXNvdXJjZU1hbmFnZXJTZXJ2aWNlX3Rlc3QuY3BwCisrKyBiL3NlcnZpY2VzL21lZGlhcmVzb3VyY2VtYW5hZ2VyL3Rlc3QvUmVzb3VyY2VNYW5hZ2VyU2VydmljZV90ZXN0LmNwcApAQCAtNTIsMTMgKzUyLDY5IEBACiAgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGVzdFByb2Nlc3NJbmZvKTsKIH07CiAKK3N0cnVjdCBUZXN0U3lzdGVtQ2FsbGJhY2sgOgorICAgICAgICBwdWJsaWMgUmVzb3VyY2VNYW5hZ2VyU2VydmljZTo6U3lzdGVtQ2FsbGJhY2tJbnRlcmZhY2UgeworICAgIFRlc3RTeXN0ZW1DYWxsYmFjaygpIDoKKyAgICAgICAgbUxhc3RFdmVudCh7RXZlbnRUeXBlOjpJTlZBTElELCAwfSksIG1FdmVudENvdW50KDApIHt9CisKKyAgICBlbnVtIEV2ZW50VHlwZSB7CisgICAgICAgIElOVkFMSUQgICAgICAgICAgPSAtMSwKKyAgICAgICAgVklERU9fT04gICAgICAgICA9IDAsCisgICAgICAgIFZJREVPX09GRiAgICAgICAgPSAxLAorICAgICAgICBWSURFT19SRVNFVCAgICAgID0gMiwKKyAgICAgICAgQ1BVU0VUX0VOQUJMRSAgICA9IDMsCisgICAgICAgIENQVVNFVF9ESVNBQkxFICAgPSA0LAorICAgIH07CisKKyAgICBzdHJ1Y3QgRXZlbnRFbnRyeSB7CisgICAgICAgIEV2ZW50VHlwZSB0eXBlOworICAgICAgICBpbnQgYXJnOworICAgIH07CisKKyAgICB2aXJ0dWFsIHZvaWQgbm90ZVN0YXJ0VmlkZW8oaW50IHVpZCkgb3ZlcnJpZGUgeworICAgICAgICBtTGFzdEV2ZW50ID0ge0V2ZW50VHlwZTo6VklERU9fT04sIHVpZH07CisgICAgICAgIG1FdmVudENvdW50Kys7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIG5vdGVTdG9wVmlkZW8oaW50IHVpZCkgb3ZlcnJpZGUgeworICAgICAgICBtTGFzdEV2ZW50ID0ge0V2ZW50VHlwZTo6VklERU9fT0ZGLCB1aWR9OworICAgICAgICBtRXZlbnRDb3VudCsrOworICAgIH0KKworICAgIHZpcnR1YWwgdm9pZCBub3RlUmVzZXRWaWRlbygpIG92ZXJyaWRlIHsKKyAgICAgICAgbUxhc3RFdmVudCA9IHtFdmVudFR5cGU6OlZJREVPX1JFU0VULCAwfTsKKyAgICAgICAgbUV2ZW50Q291bnQrKzsKKyAgICB9CisKKyAgICB2aXJ0dWFsIGJvb2wgcmVxdWVzdENwdXNldEJvb3N0KAorICAgICAgICAgICAgYm9vbCBlbmFibGUsIGNvbnN0IHNwPElJbnRlcmZhY2U+ICYvKmNsaWVudCovKSBvdmVycmlkZSB7CisgICAgICAgIG1MYXN0RXZlbnQgPSB7ZW5hYmxlID8gRXZlbnRUeXBlOjpDUFVTRVRfRU5BQkxFIDogRXZlbnRUeXBlOjpDUFVTRVRfRElTQUJMRSwgMH07CisgICAgICAgIG1FdmVudENvdW50Kys7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIHNpemVfdCBldmVudENvdW50KCkgeyByZXR1cm4gbUV2ZW50Q291bnQ7IH0KKyAgICBFdmVudFR5cGUgbGFzdEV2ZW50VHlwZSgpIHsgcmV0dXJuIG1MYXN0RXZlbnQudHlwZTsgfQorICAgIEV2ZW50RW50cnkgbGFzdEV2ZW50KCkgeyByZXR1cm4gbUxhc3RFdmVudDsgfQorCitwcm90ZWN0ZWQ6CisgICAgdmlydHVhbCB+VGVzdFN5c3RlbUNhbGxiYWNrKCkge30KKworcHJpdmF0ZToKKyAgICBFdmVudEVudHJ5IG1MYXN0RXZlbnQ7CisgICAgc2l6ZV90IG1FdmVudENvdW50OworCisgICAgRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGVzdFN5c3RlbUNhbGxiYWNrKTsKK307CisKKwogc3RydWN0IFRlc3RDbGllbnQgOiBwdWJsaWMgQm5SZXNvdXJjZU1hbmFnZXJDbGllbnQgewogICAgIFRlc3RDbGllbnQoaW50IHBpZCwgc3A8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gc2VydmljZSkKICAgICAgICAgOiBtUmVjbGFpbWVkKGZhbHNlKSwgbVBpZChwaWQpLCBtU2VydmljZShzZXJ2aWNlKSB7fQogCiAgICAgdmlydHVhbCBib29sIHJlY2xhaW1SZXNvdXJjZSgpIHsKICAgICAgICAgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50KHRoaXMpOwotICAgICAgICBtU2VydmljZS0+cmVtb3ZlUmVzb3VyY2UobVBpZCwgKGludDY0X3QpIGNsaWVudC5nZXQoKSk7CisgICAgICAgIG1TZXJ2aWNlLT5yZW1vdmVDbGllbnQobVBpZCwgKGludDY0X3QpIGNsaWVudC5nZXQoKSk7CiAgICAgICAgIG1SZWNsYWltZWQgPSB0cnVlOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CkBAIC04NiwxNiArMTQyLDI2IEBACiB9OwogCiBzdGF0aWMgY29uc3QgaW50IGtUZXN0UGlkMSA9IDMwOworc3RhdGljIGNvbnN0IGludCBrVGVzdFVpZDEgPSAxMDEwOworCiBzdGF0aWMgY29uc3QgaW50IGtUZXN0UGlkMiA9IDIwOworc3RhdGljIGNvbnN0IGludCBrVGVzdFVpZDIgPSAxMDExOwogCiBzdGF0aWMgY29uc3QgaW50IGtMb3dQcmlvcml0eVBpZCA9IDQwOwogc3RhdGljIGNvbnN0IGludCBrTWlkUHJpb3JpdHlQaWQgPSAyNTsKIHN0YXRpYyBjb25zdCBpbnQga0hpZ2hQcmlvcml0eVBpZCA9IDEwOwogCit1c2luZyBFdmVudFR5cGUgPSBUZXN0U3lzdGVtQ2FsbGJhY2s6OkV2ZW50VHlwZTsKK3VzaW5nIEV2ZW50RW50cnkgPSBUZXN0U3lzdGVtQ2FsbGJhY2s6OkV2ZW50RW50cnk7Citib29sIG9wZXJhdG9yPT0gKGNvbnN0IEV2ZW50RW50cnkmIGxocywgY29uc3QgRXZlbnRFbnRyeSYgcmhzKSB7CisgICAgcmV0dXJuIGxocy50eXBlID09IHJocy50eXBlICYmIGxocy5hcmcgPT0gcmhzLmFyZzsKK30KKwogY2xhc3MgUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKIHB1YmxpYzoKICAgICBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCgpCi0gICAgICAgIDogbVNlcnZpY2UobmV3IFJlc291cmNlTWFuYWdlclNlcnZpY2UobmV3IFRlc3RQcm9jZXNzSW5mbykpLAorICAgICAgICA6IG1TeXN0ZW1DQihuZXcgVGVzdFN5c3RlbUNhbGxiYWNrKCkpLAorICAgICAgICAgIG1TZXJ2aWNlKG5ldyBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlKG5ldyBUZXN0UHJvY2Vzc0luZm8sIG1TeXN0ZW1DQikpLAogICAgICAgICAgIG1UZXN0Q2xpZW50MShuZXcgVGVzdENsaWVudChrVGVzdFBpZDEsIG1TZXJ2aWNlKSksCiAgICAgICAgICAgbVRlc3RDbGllbnQyKG5ldyBUZXN0Q2xpZW50KGtUZXN0UGlkMiwgbVNlcnZpY2UpKSwKICAgICAgICAgICBtVGVzdENsaWVudDMobmV3IFRlc3RDbGllbnQoa1Rlc3RQaWQyLCBtU2VydmljZSkpIHsKQEAgLTEwMywyMCArMTY5LDIyIEBACiAKIHByb3RlY3RlZDoKICAgICBzdGF0aWMgYm9vbCBpc0VxdWFsUmVzb3VyY2VzKGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzMSwKLSAgICAgICAgICAgIGNvbnN0IFZlY3RvcjxNZWRpYVJlc291cmNlPiAmcmVzb3VyY2VzMikgewotICAgICAgICBpZiAocmVzb3VyY2VzMS5zaXplKCkgIT0gcmVzb3VyY2VzMi5zaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQorICAgICAgICAgICAgY29uc3QgUmVzb3VyY2VMaXN0ICZyZXNvdXJjZXMyKSB7CisgICAgICAgIC8vIGNvbnZlcnQgcmVzb3VyY2UxIHRvIFJlc291cmNlTGlzdAorICAgICAgICBSZXNvdXJjZUxpc3QgcjE7CiAgICAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmVzb3VyY2VzMS5zaXplKCk7ICsraSkgewotICAgICAgICAgICAgaWYgKHJlc291cmNlczFbaV0gIT0gcmVzb3VyY2VzMltpXSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnN0IGF1dG8gJnJlcyA9IHJlc291cmNlczFbaV07CisgICAgICAgICAgICBjb25zdCBhdXRvIHJlc1R5cGUgPSBzdGQ6OnR1cGxlKHJlcy5tVHlwZSwgcmVzLm1TdWJUeXBlLCByZXMubUlkKTsKKyAgICAgICAgICAgIHIxW3Jlc1R5cGVdID0gcmVzOwogICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOworICAgICAgICByZXR1cm4gcjEgPT0gcmVzb3VyY2VzMjsKICAgICB9CiAKLSAgICBzdGF0aWMgdm9pZCBleHBlY3RFcVJlc291cmNlSW5mbyhjb25zdCBSZXNvdXJjZUluZm8gJmluZm8sIHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IGNsaWVudCwKKyAgICBzdGF0aWMgdm9pZCBleHBlY3RFcVJlc291cmNlSW5mbyhjb25zdCBSZXNvdXJjZUluZm8gJmluZm8sCisgICAgICAgICAgICBpbnQgdWlkLAorICAgICAgICAgICAgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gY2xpZW50LAogICAgICAgICAgICAgY29uc3QgVmVjdG9yPE1lZGlhUmVzb3VyY2U+ICZyZXNvdXJjZXMpIHsKKyAgICAgICAgRVhQRUNUX0VRKHVpZCwgaW5mby51aWQpOwogICAgICAgICBFWFBFQ1RfRVEoY2xpZW50LCBpbmZvLmNsaWVudCk7CiAgICAgICAgIEVYUEVDVF9UUlVFKGlzRXF1YWxSZXNvdXJjZXMocmVzb3VyY2VzLCBpbmZvLnJlc291cmNlcykpOwogICAgIH0KQEAgLTE1MywyNCArMjIxLDI0IEBACiAgICAgICAgIC8vIGtUZXN0UGlkMSBtVGVzdENsaWVudDEKICAgICAgICAgVmVjdG9yPE1lZGlhUmVzb3VyY2U+IHJlc291cmNlczE7CiAgICAgICAgIHJlc291cmNlczEucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6a1NlY3VyZUNvZGVjLCAxKSk7Ci0gICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDEsIGdldElkKG1UZXN0Q2xpZW50MSksIG1UZXN0Q2xpZW50MSwgcmVzb3VyY2VzMSk7CisgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDEsIGtUZXN0VWlkMSwgZ2V0SWQobVRlc3RDbGllbnQxKSwgbVRlc3RDbGllbnQxLCByZXNvdXJjZXMxKTsKICAgICAgICAgcmVzb3VyY2VzMS5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjprR3JhcGhpY01lbW9yeSwgMjAwKSk7CiAgICAgICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXMxMTsKICAgICAgICAgcmVzb3VyY2VzMTEucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6a0dyYXBoaWNNZW1vcnksIDIwMCkpOwotICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa1Rlc3RQaWQxLCBnZXRJZChtVGVzdENsaWVudDEpLCBtVGVzdENsaWVudDEsIHJlc291cmNlczExKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMSwga1Rlc3RVaWQxLCBnZXRJZChtVGVzdENsaWVudDEpLCBtVGVzdENsaWVudDEsIHJlc291cmNlczExKTsKIAogICAgICAgICAvLyBrVGVzdFBpZDIgbVRlc3RDbGllbnQyCiAgICAgICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXMyOwogICAgICAgICByZXNvdXJjZXMyLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OmtOb25TZWN1cmVDb2RlYywgMSkpOwogICAgICAgICByZXNvdXJjZXMyLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OmtHcmFwaGljTWVtb3J5LCAzMDApKTsKLSAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQyKSwgbVRlc3RDbGllbnQyLCByZXNvdXJjZXMyKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwga1Rlc3RVaWQyLCBnZXRJZChtVGVzdENsaWVudDIpLCBtVGVzdENsaWVudDIsIHJlc291cmNlczIpOwogCiAgICAgICAgIC8vIGtUZXN0UGlkMiBtVGVzdENsaWVudDMKICAgICAgICAgVmVjdG9yPE1lZGlhUmVzb3VyY2U+IHJlc291cmNlczM7Ci0gICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MyksIG1UZXN0Q2xpZW50MywgcmVzb3VyY2VzMyk7CisgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDIsIGtUZXN0VWlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSwgbVRlc3RDbGllbnQzLCByZXNvdXJjZXMzKTsKICAgICAgICAgcmVzb3VyY2VzMy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjprU2VjdXJlQ29kZWMsIDEpKTsKICAgICAgICAgcmVzb3VyY2VzMy5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjprR3JhcGhpY01lbW9yeSwgMTAwKSk7Ci0gICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MyksIG1UZXN0Q2xpZW50MywgcmVzb3VyY2VzMyk7CisgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDIsIGtUZXN0VWlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSwgbVRlc3RDbGllbnQzLCByZXNvdXJjZXMzKTsKIAogICAgICAgICBjb25zdCBQaWRSZXNvdXJjZUluZm9zTWFwICZtYXAgPSBtU2VydmljZS0+bU1hcDsKICAgICAgICAgRVhQRUNUX0VRKDJ1LCBtYXAuc2l6ZSgpKTsKQEAgLTE3OCwxNCArMjQ2LDE0IEBACiAgICAgICAgIEFTU0VSVF9HRShpbmRleDEsIDApOwogICAgICAgICBjb25zdCBSZXNvdXJjZUluZm9zICZpbmZvczEgPSBtYXBbaW5kZXgxXTsKICAgICAgICAgRVhQRUNUX0VRKDF1LCBpbmZvczEuc2l6ZSgpKTsKLSAgICAgICAgZXhwZWN0RXFSZXNvdXJjZUluZm8oaW5mb3MxWzBdLCBtVGVzdENsaWVudDEsIHJlc291cmNlczEpOworICAgICAgICBleHBlY3RFcVJlc291cmNlSW5mbyhpbmZvczEudmFsdWVGb3IoZ2V0SWQobVRlc3RDbGllbnQxKSksIGtUZXN0VWlkMSwgbVRlc3RDbGllbnQxLCByZXNvdXJjZXMxKTsKIAogICAgICAgICBzc2l6ZV90IGluZGV4MiA9IG1hcC5pbmRleE9mS2V5KGtUZXN0UGlkMik7CiAgICAgICAgIEFTU0VSVF9HRShpbmRleDIsIDApOwogICAgICAgICBjb25zdCBSZXNvdXJjZUluZm9zICZpbmZvczIgPSBtYXBbaW5kZXgyXTsKICAgICAgICAgRVhQRUNUX0VRKDJ1LCBpbmZvczIuc2l6ZSgpKTsKLSAgICAgICAgZXhwZWN0RXFSZXNvdXJjZUluZm8oaW5mb3MyWzBdLCBtVGVzdENsaWVudDIsIHJlc291cmNlczIpOwotICAgICAgICBleHBlY3RFcVJlc291cmNlSW5mbyhpbmZvczJbMV0sIG1UZXN0Q2xpZW50MywgcmVzb3VyY2VzMyk7CisgICAgICAgIGV4cGVjdEVxUmVzb3VyY2VJbmZvKGluZm9zMi52YWx1ZUZvcihnZXRJZChtVGVzdENsaWVudDIpKSwga1Rlc3RVaWQyLCBtVGVzdENsaWVudDIsIHJlc291cmNlczIpOworICAgICAgICBleHBlY3RFcVJlc291cmNlSW5mbyhpbmZvczIudmFsdWVGb3IoZ2V0SWQobVRlc3RDbGllbnQzKSksIGtUZXN0VWlkMiwgbVRlc3RDbGllbnQzLCByZXNvdXJjZXMzKTsKICAgICB9CiAKICAgICB2b2lkIHRlc3RDb25maWcoKSB7CkBAIC0yMTksMTAgKzI4Nyw4NCBAQAogICAgICAgICBFWFBFQ1RfVFJVRShtU2VydmljZS0+bVN1cHBvcnRzU2VjdXJlV2l0aE5vblNlY3VyZUNvZGVjKTsKICAgICB9CiAKKyAgICB2b2lkIHRlc3RDb21iaW5lUmVzb3VyY2UoKSB7CisgICAgICAgIC8vIGtUZXN0UGlkMSBtVGVzdENsaWVudDEKKyAgICAgICAgVmVjdG9yPE1lZGlhUmVzb3VyY2U+IHJlc291cmNlczE7CisgICAgICAgIHJlc291cmNlczEucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6a1NlY3VyZUNvZGVjLCAxKSk7CisgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDEsIGtUZXN0VWlkMSwgZ2V0SWQobVRlc3RDbGllbnQxKSwgbVRlc3RDbGllbnQxLCByZXNvdXJjZXMxKTsKKworICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzMTE7CisgICAgICAgIHJlc291cmNlczExLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OmtHcmFwaGljTWVtb3J5LCAyMDApKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMSwga1Rlc3RVaWQxLCBnZXRJZChtVGVzdENsaWVudDEpLCBtVGVzdENsaWVudDEsIHJlc291cmNlczExKTsKKworICAgICAgICBjb25zdCBQaWRSZXNvdXJjZUluZm9zTWFwICZtYXAgPSBtU2VydmljZS0+bU1hcDsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBtYXAuc2l6ZSgpKTsKKyAgICAgICAgc3NpemVfdCBpbmRleDEgPSBtYXAuaW5kZXhPZktleShrVGVzdFBpZDEpOworICAgICAgICBBU1NFUlRfR0UoaW5kZXgxLCAwKTsKKyAgICAgICAgY29uc3QgUmVzb3VyY2VJbmZvcyAmaW5mb3MxID0gbWFwW2luZGV4MV07CisgICAgICAgIEVYUEVDVF9FUSgxdSwgaW5mb3MxLnNpemUoKSk7CisKKyAgICAgICAgLy8gdGVzdCBhZGRpbmcgZXhpc3RpbmcgdHlwZXMgdG8gY29tYmluZSB2YWx1ZXMKKyAgICAgICAgcmVzb3VyY2VzMS5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjprR3JhcGhpY01lbW9yeSwgMTAwKSk7CisgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDEsIGtUZXN0VWlkMSwgZ2V0SWQobVRlc3RDbGllbnQxKSwgbVRlc3RDbGllbnQxLCByZXNvdXJjZXMxKTsKKworICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gZXhwZWN0ZWQ7CisgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OmtTZWN1cmVDb2RlYywgMikpOworICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjprR3JhcGhpY01lbW9yeSwgMzAwKSk7CisgICAgICAgIGV4cGVjdEVxUmVzb3VyY2VJbmZvKGluZm9zMS52YWx1ZUZvcihnZXRJZChtVGVzdENsaWVudDEpKSwga1Rlc3RVaWQxLCBtVGVzdENsaWVudDEsIGV4cGVjdGVkKTsKKworICAgICAgICAvLyB0ZXN0IGFkZGluZyBuZXcgdHlwZXMgKGluY2x1ZGluZyB0eXBlcyB0aGF0IGRpZmZlcnMgb25seSBpbiBzdWJUeXBlKQorICAgICAgICByZXNvdXJjZXMxMS5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjprTm9uU2VjdXJlQ29kZWMsIDEpKTsKKyAgICAgICAgcmVzb3VyY2VzMTEucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6a1NlY3VyZUNvZGVjLCBNZWRpYVJlc291cmNlOjprVmlkZW9Db2RlYywgMSkpOworICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa1Rlc3RQaWQxLCBrVGVzdFVpZDEsIGdldElkKG1UZXN0Q2xpZW50MSksIG1UZXN0Q2xpZW50MSwgcmVzb3VyY2VzMTEpOworCisgICAgICAgIGV4cGVjdGVkLmNsZWFyKCk7CisgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OmtTZWN1cmVDb2RlYywgMikpOworICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjprTm9uU2VjdXJlQ29kZWMsIDEpKTsKKyAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6a1NlY3VyZUNvZGVjLCBNZWRpYVJlc291cmNlOjprVmlkZW9Db2RlYywgMSkpOworICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjprR3JhcGhpY01lbW9yeSwgNTAwKSk7CisgICAgICAgIGV4cGVjdEVxUmVzb3VyY2VJbmZvKGluZm9zMS52YWx1ZUZvcihnZXRJZChtVGVzdENsaWVudDEpKSwga1Rlc3RVaWQxLCBtVGVzdENsaWVudDEsIGV4cGVjdGVkKTsKKyAgICB9CisKICAgICB2b2lkIHRlc3RSZW1vdmVSZXNvdXJjZSgpIHsKKyAgICAgICAgLy8ga1Rlc3RQaWQxIG1UZXN0Q2xpZW50MQorICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzMTsKKyAgICAgICAgcmVzb3VyY2VzMS5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjprU2VjdXJlQ29kZWMsIDEpKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMSwga1Rlc3RVaWQxLCBnZXRJZChtVGVzdENsaWVudDEpLCBtVGVzdENsaWVudDEsIHJlc291cmNlczEpOworCisgICAgICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiByZXNvdXJjZXMxMTsKKyAgICAgICAgcmVzb3VyY2VzMTEucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6a0dyYXBoaWNNZW1vcnksIDIwMCkpOworICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa1Rlc3RQaWQxLCBrVGVzdFVpZDEsIGdldElkKG1UZXN0Q2xpZW50MSksIG1UZXN0Q2xpZW50MSwgcmVzb3VyY2VzMTEpOworCisgICAgICAgIGNvbnN0IFBpZFJlc291cmNlSW5mb3NNYXAgJm1hcCA9IG1TZXJ2aWNlLT5tTWFwOworICAgICAgICBFWFBFQ1RfRVEoMXUsIG1hcC5zaXplKCkpOworICAgICAgICBzc2l6ZV90IGluZGV4MSA9IG1hcC5pbmRleE9mS2V5KGtUZXN0UGlkMSk7CisgICAgICAgIEFTU0VSVF9HRShpbmRleDEsIDApOworICAgICAgICBjb25zdCBSZXNvdXJjZUluZm9zICZpbmZvczEgPSBtYXBbaW5kZXgxXTsKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBpbmZvczEuc2l6ZSgpKTsKKworICAgICAgICAvLyB0ZXN0IHBhcnRpYWwgcmVtb3ZhbAorICAgICAgICByZXNvdXJjZXMxMS5lZGl0SXRlbUF0KDApLm1WYWx1ZSA9IDEwMDsKKyAgICAgICAgbVNlcnZpY2UtPnJlbW92ZVJlc291cmNlKGtUZXN0UGlkMSwgZ2V0SWQobVRlc3RDbGllbnQxKSwgcmVzb3VyY2VzMTEpOworCisgICAgICAgIFZlY3RvcjxNZWRpYVJlc291cmNlPiBleHBlY3RlZDsKKyAgICAgICAgZXhwZWN0ZWQucHVzaF9iYWNrKE1lZGlhUmVzb3VyY2UoTWVkaWFSZXNvdXJjZTo6a1NlY3VyZUNvZGVjLCAxKSk7CisgICAgICAgIGV4cGVjdGVkLnB1c2hfYmFjayhNZWRpYVJlc291cmNlKE1lZGlhUmVzb3VyY2U6OmtHcmFwaGljTWVtb3J5LCAxMDApKTsKKyAgICAgICAgZXhwZWN0RXFSZXNvdXJjZUluZm8oaW5mb3MxLnZhbHVlRm9yKGdldElkKG1UZXN0Q2xpZW50MSkpLCBrVGVzdFVpZDEsIG1UZXN0Q2xpZW50MSwgZXhwZWN0ZWQpOworCisgICAgICAgIC8vIHRlc3QgY29tcGxldGUgcmVtb3ZhbCB3aXRoIG92ZXJzaG9vdCB2YWx1ZQorICAgICAgICByZXNvdXJjZXMxMS5lZGl0SXRlbUF0KDApLm1WYWx1ZSA9IDEwMDA7CisgICAgICAgIG1TZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShrVGVzdFBpZDEsIGdldElkKG1UZXN0Q2xpZW50MSksIHJlc291cmNlczExKTsKKworICAgICAgICBleHBlY3RlZC5jbGVhcigpOworICAgICAgICBleHBlY3RlZC5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjprU2VjdXJlQ29kZWMsIDEpKTsKKyAgICAgICAgZXhwZWN0RXFSZXNvdXJjZUluZm8oaW5mb3MxLnZhbHVlRm9yKGdldElkKG1UZXN0Q2xpZW50MSkpLCBrVGVzdFVpZDEsIG1UZXN0Q2xpZW50MSwgZXhwZWN0ZWQpOworICAgIH0KKworICAgIHZvaWQgdGVzdFJlbW92ZUNsaWVudCgpIHsKICAgICAgICAgYWRkUmVzb3VyY2UoKTsKIAotICAgICAgICBtU2VydmljZS0+cmVtb3ZlUmVzb3VyY2Uoa1Rlc3RQaWQyLCBnZXRJZChtVGVzdENsaWVudDIpKTsKKyAgICAgICAgbVNlcnZpY2UtPnJlbW92ZUNsaWVudChrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MikpOwogCiAgICAgICAgIGNvbnN0IFBpZFJlc291cmNlSW5mb3NNYXAgJm1hcCA9IG1TZXJ2aWNlLT5tTWFwOwogICAgICAgICBFWFBFQ1RfRVEoMnUsIG1hcC5zaXplKCkpOwpAQCAtMjMxLDYgKzM3Myw3IEBACiAgICAgICAgIEVYUEVDVF9FUSgxdSwgaW5mb3MxLnNpemUoKSk7CiAgICAgICAgIEVYUEVDVF9FUSgxdSwgaW5mb3MyLnNpemUoKSk7CiAgICAgICAgIC8vIG1UZXN0Q2xpZW50MiBoYXMgYmVlbiByZW1vdmVkLgorICAgICAgICAvLyAoT0sgdG8gdXNlIGluZm9zMlswXSBhcyB0aGVyZSBpcyBvbmx5IDEgZW50cnkpCiAgICAgICAgIEVYUEVDVF9FUShtVGVzdENsaWVudDMsIGluZm9zMlswXS5jbGllbnQpOwogICAgIH0KIApAQCAtMjQ2LDYgKzM4OSw3IEBACiAgICAgICAgIEVYUEVDVF9UUlVFKG1TZXJ2aWNlLT5nZXRBbGxDbGllbnRzX2woa0hpZ2hQcmlvcml0eVBpZCwgdHlwZSwgJmNsaWVudHMpKTsKIAogICAgICAgICBFWFBFQ1RfRVEoMnUsIGNsaWVudHMuc2l6ZSgpKTsKKyAgICAgICAgLy8gKE9LIHRvIHJlcXVpcmUgb3JkZXJpbmcgaW4gY2xpZW50c1tdLCBhcyB0aGUgcGlkIG1hcCBpcyBzb3J0ZWQpCiAgICAgICAgIEVYUEVDVF9FUShtVGVzdENsaWVudDMsIGNsaWVudHNbMF0pOwogICAgICAgICBFWFBFQ1RfRVEobVRlc3RDbGllbnQxLCBjbGllbnRzWzFdKTsKICAgICB9CkBAIC00MzgsNyArNTgyLDcgQEAKICAgICAgICAgICAgIHZlcmlmeUNsaWVudHModHJ1ZSAvKiBjMSAqLywgZmFsc2UgLyogYzIgKi8sIGZhbHNlIC8qIGMzICovKTsKIAogICAgICAgICAgICAgLy8gY2xlYW4gdXAgY2xpZW50IDMgd2hpY2ggc3RpbGwgbGVmdAotICAgICAgICAgICAgbVNlcnZpY2UtPnJlbW92ZVJlc291cmNlKGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSk7CisgICAgICAgICAgICBtU2VydmljZS0+cmVtb3ZlQ2xpZW50KGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQzKSk7CiAgICAgICAgIH0KICAgICB9CiAKQEAgLTQ5OCw2ICs2NDIsODQgQEAKICAgICAgICAgRVhQRUNUX1RSVUUobVNlcnZpY2UtPmlzQ2FsbGluZ1ByaW9yaXR5SGlnaGVyX2woOTksIDEwMCkpOwogICAgIH0KIAorICAgIHZvaWQgdGVzdEJhdHRlcnlTdGF0cygpIHsKKyAgICAgICAgLy8gcmVzZXQgc2hvdWxkIGFsd2F5cyBiZSBjYWxsZWQgd2hlbiBSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlIGlzIGNyZWF0ZWQgKHJlc3RhcnRlZCkKKyAgICAgICAgRVhQRUNUX0VRKDF1LCBtU3lzdGVtQ0ItPmV2ZW50Q291bnQoKSk7CisgICAgICAgIEVYUEVDVF9FUShFdmVudFR5cGU6OlZJREVPX1JFU0VULCBtU3lzdGVtQ0ItPmxhc3RFdmVudFR5cGUoKSk7CisKKyAgICAgICAgLy8gbmV3IGNsaWVudCByZXF1ZXN0IHNob3VsZCBjYXVzZSBWSURFT19PTgorICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzMTsKKyAgICAgICAgcmVzb3VyY2VzMS5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjprQmF0dGVyeSwgTWVkaWFSZXNvdXJjZTo6a1ZpZGVvQ29kZWMsIDEpKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMSwga1Rlc3RVaWQxLCBnZXRJZChtVGVzdENsaWVudDEpLCBtVGVzdENsaWVudDEsIHJlc291cmNlczEpOworICAgICAgICBFWFBFQ1RfRVEoMnUsIG1TeXN0ZW1DQi0+ZXZlbnRDb3VudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEV2ZW50RW50cnkoe0V2ZW50VHlwZTo6VklERU9fT04sIGtUZXN0VWlkMX0pLCBtU3lzdGVtQ0ItPmxhc3RFdmVudCgpKTsKKworICAgICAgICAvLyBlYWNoIGNsaWVudCBzaG91bGQgb25seSBjYXVzZSAxIFZJREVPX09OCisgICAgICAgIG1TZXJ2aWNlLT5hZGRSZXNvdXJjZShrVGVzdFBpZDEsIGtUZXN0VWlkMSwgZ2V0SWQobVRlc3RDbGllbnQxKSwgbVRlc3RDbGllbnQxLCByZXNvdXJjZXMxKTsKKyAgICAgICAgRVhQRUNUX0VRKDJ1LCBtU3lzdGVtQ0ItPmV2ZW50Q291bnQoKSk7CisKKyAgICAgICAgLy8gbmV3IGNsaWVudCByZXF1ZXN0IHNob3VsZCBjYXVzZSBWSURFT19PTgorICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzMjsKKyAgICAgICAgcmVzb3VyY2VzMi5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjprQmF0dGVyeSwgTWVkaWFSZXNvdXJjZTo6a1ZpZGVvQ29kZWMsIDIpKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwga1Rlc3RVaWQyLCBnZXRJZChtVGVzdENsaWVudDIpLCBtVGVzdENsaWVudDIsIHJlc291cmNlczIpOworICAgICAgICBFWFBFQ1RfRVEoM3UsIG1TeXN0ZW1DQi0+ZXZlbnRDb3VudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEV2ZW50RW50cnkoe0V2ZW50VHlwZTo6VklERU9fT04sIGtUZXN0VWlkMn0pLCBtU3lzdGVtQ0ItPmxhc3RFdmVudCgpKTsKKworICAgICAgICAvLyBwYXJ0aWFsbHkgcmVtb3ZlIG1UZXN0Q2xpZW50MSdzIHJlcXVlc3QsIHNob3VsZG4ndCBiZSBhbnkgVklERU9fT0ZGCisgICAgICAgIG1TZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShrVGVzdFBpZDEsIGdldElkKG1UZXN0Q2xpZW50MSksIHJlc291cmNlczEpOworICAgICAgICBFWFBFQ1RfRVEoM3UsIG1TeXN0ZW1DQi0+ZXZlbnRDb3VudCgpKTsKKworICAgICAgICAvLyByZW1vdmUgbVRlc3RDbGllbnQxJ3MgcmVxdWVzdCwgc2hvdWxkIGJlIFZJREVPX09GRiBmb3Iga1Rlc3RVaWQxCisgICAgICAgIC8vICh1c2UgcmVzb3VyY2UyIHRvIHRlc3QgcmVtb3ZpbmcgbW9yZSBpbnN0YW5jZXMgdGhhbiBwcmV2aW91c2x5IHJlcXVlc3RlZCkKKyAgICAgICAgbVNlcnZpY2UtPnJlbW92ZVJlc291cmNlKGtUZXN0UGlkMSwgZ2V0SWQobVRlc3RDbGllbnQxKSwgcmVzb3VyY2VzMik7CisgICAgICAgIEVYUEVDVF9FUSg0dSwgbVN5c3RlbUNCLT5ldmVudENvdW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoRXZlbnRFbnRyeSh7RXZlbnRUeXBlOjpWSURFT19PRkYsIGtUZXN0VWlkMX0pLCBtU3lzdGVtQ0ItPmxhc3RFdmVudCgpKTsKKworICAgICAgICAvLyByZW1vdmUgbVRlc3RDbGllbnQyLCBzaG91bGQgYmUgVklERU9fT0ZGIGZvciBrVGVzdFVpZDIKKyAgICAgICAgbVNlcnZpY2UtPnJlbW92ZUNsaWVudChrVGVzdFBpZDIsIGdldElkKG1UZXN0Q2xpZW50MikpOworICAgICAgICBFWFBFQ1RfRVEoNXUsIG1TeXN0ZW1DQi0+ZXZlbnRDb3VudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEV2ZW50RW50cnkoe0V2ZW50VHlwZTo6VklERU9fT0ZGLCBrVGVzdFVpZDJ9KSwgbVN5c3RlbUNCLT5sYXN0RXZlbnQoKSk7CisgICAgfQorCisgICAgdm9pZCB0ZXN0Q3B1c2V0Qm9vc3QoKSB7CisgICAgICAgIC8vIHJlc2V0IHNob3VsZCBhbHdheXMgYmUgY2FsbGVkIHdoZW4gUmVzb3VyY2VNYW5hZ2VyU2VydmljZSBpcyBjcmVhdGVkIChyZXN0YXJ0ZWQpCisgICAgICAgIEVYUEVDVF9FUSgxdSwgbVN5c3RlbUNCLT5ldmVudENvdW50KCkpOworICAgICAgICBFWFBFQ1RfRVEoRXZlbnRUeXBlOjpWSURFT19SRVNFVCwgbVN5c3RlbUNCLT5sYXN0RXZlbnRUeXBlKCkpOworCisgICAgICAgIC8vIG5ldyBjbGllbnQgcmVxdWVzdCBzaG91bGQgY2F1c2UgQ1BVU0VUX0VOQUJMRQorICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzMTsKKyAgICAgICAgcmVzb3VyY2VzMS5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjprQ3B1Qm9vc3QsIDEpKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMSwga1Rlc3RVaWQxLCBnZXRJZChtVGVzdENsaWVudDEpLCBtVGVzdENsaWVudDEsIHJlc291cmNlczEpOworICAgICAgICBFWFBFQ1RfRVEoMnUsIG1TeXN0ZW1DQi0+ZXZlbnRDb3VudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEV2ZW50VHlwZTo6Q1BVU0VUX0VOQUJMRSwgbVN5c3RlbUNCLT5sYXN0RXZlbnRUeXBlKCkpOworCisgICAgICAgIC8vIGVhY2ggY2xpZW50IHNob3VsZCBvbmx5IGNhdXNlIDEgQ1BVU0VUX0VOQUJMRQorICAgICAgICBtU2VydmljZS0+YWRkUmVzb3VyY2Uoa1Rlc3RQaWQxLCBrVGVzdFVpZDEsIGdldElkKG1UZXN0Q2xpZW50MSksIG1UZXN0Q2xpZW50MSwgcmVzb3VyY2VzMSk7CisgICAgICAgIEVYUEVDVF9FUSgydSwgbVN5c3RlbUNCLT5ldmVudENvdW50KCkpOworCisgICAgICAgIC8vIG5ldyBjbGllbnQgcmVxdWVzdCBzaG91bGQgY2F1c2UgQ1BVU0VUX0VOQUJMRQorICAgICAgICBWZWN0b3I8TWVkaWFSZXNvdXJjZT4gcmVzb3VyY2VzMjsKKyAgICAgICAgcmVzb3VyY2VzMi5wdXNoX2JhY2soTWVkaWFSZXNvdXJjZShNZWRpYVJlc291cmNlOjprQ3B1Qm9vc3QsIDIpKTsKKyAgICAgICAgbVNlcnZpY2UtPmFkZFJlc291cmNlKGtUZXN0UGlkMiwga1Rlc3RVaWQyLCBnZXRJZChtVGVzdENsaWVudDIpLCBtVGVzdENsaWVudDIsIHJlc291cmNlczIpOworICAgICAgICBFWFBFQ1RfRVEoM3UsIG1TeXN0ZW1DQi0+ZXZlbnRDb3VudCgpKTsKKyAgICAgICAgRVhQRUNUX0VRKEV2ZW50VHlwZTo6Q1BVU0VUX0VOQUJMRSwgbVN5c3RlbUNCLT5sYXN0RXZlbnRUeXBlKCkpOworCisgICAgICAgIC8vIHJlbW92ZSBtVGVzdENsaWVudDIgc2hvdWxkIG5vdCBjYXVzZSBDUFVTRVRfRElTQUJMRSwgbVRlc3RDbGllbnQxIHN0aWxsIGFjdGl2ZQorICAgICAgICBtU2VydmljZS0+cmVtb3ZlQ2xpZW50KGtUZXN0UGlkMiwgZ2V0SWQobVRlc3RDbGllbnQyKSk7CisgICAgICAgIEVYUEVDVF9FUSgzdSwgbVN5c3RlbUNCLT5ldmVudENvdW50KCkpOworCisgICAgICAgIC8vIHJlbW92ZSAxIGNwdWJvb3N0IGZyb20gbVRlc3RDbGllbnQxLCBzaG91bGQgbm90IGJlIENQVVNFVF9ESVNBQkxFIChzdGlsbCAxIGxlZnQpCisgICAgICAgIG1TZXJ2aWNlLT5yZW1vdmVSZXNvdXJjZShrVGVzdFBpZDEsIGdldElkKG1UZXN0Q2xpZW50MSksIHJlc291cmNlczEpOworICAgICAgICBFWFBFQ1RfRVEoM3UsIG1TeXN0ZW1DQi0+ZXZlbnRDb3VudCgpKTsKKworICAgICAgICAvLyByZW1vdmUgMiBjcHVib29zdCBmcm9tIG1UZXN0Q2xpZW50MSwgc2hvdWxkIGJlIENQVVNFVF9ESVNBQkxFCisgICAgICAgIC8vICh1c2UgcmVzb3VyY2UyIHRvIHRlc3QgcmVtb3ZpbmcgbW9yZSB0aGFuIHByZXZpb3VzbHkgcmVxdWVzdGVkKQorICAgICAgICBtU2VydmljZS0+cmVtb3ZlUmVzb3VyY2Uoa1Rlc3RQaWQxLCBnZXRJZChtVGVzdENsaWVudDEpLCByZXNvdXJjZXMyKTsKKyAgICAgICAgRVhQRUNUX0VRKDR1LCBtU3lzdGVtQ0ItPmV2ZW50Q291bnQoKSk7CisgICAgICAgIEVYUEVDVF9FUShFdmVudFR5cGU6OkNQVVNFVF9ESVNBQkxFLCBtU3lzdGVtQ0ItPmxhc3RFdmVudFR5cGUoKSk7CisgICAgfQorCisgICAgc3A8VGVzdFN5c3RlbUNhbGxiYWNrPiBtU3lzdGVtQ0I7CiAgICAgc3A8UmVzb3VyY2VNYW5hZ2VyU2VydmljZT4gbVNlcnZpY2U7CiAgICAgc3A8SVJlc291cmNlTWFuYWdlckNsaWVudD4gbVRlc3RDbGllbnQxOwogICAgIHNwPElSZXNvdXJjZU1hbmFnZXJDbGllbnQ+IG1UZXN0Q2xpZW50MjsKQEAgLTUxMiwxMCArNzM0LDE4IEBACiAgICAgYWRkUmVzb3VyY2UoKTsKIH0KIAorVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCBjb21iaW5lUmVzb3VyY2UpIHsKKyAgICB0ZXN0Q29tYmluZVJlc291cmNlKCk7Cit9CisKIFRFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgcmVtb3ZlUmVzb3VyY2UpIHsKICAgICB0ZXN0UmVtb3ZlUmVzb3VyY2UoKTsKIH0KIAorVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCByZW1vdmVDbGllbnQpIHsKKyAgICB0ZXN0UmVtb3ZlQ2xpZW50KCk7Cit9CisKIFRFU1RfRihSZXNvdXJjZU1hbmFnZXJTZXJ2aWNlVGVzdCwgcmVjbGFpbVJlc291cmNlKSB7CiAgICAgdGVzdFJlY2xhaW1SZXNvdXJjZVNlY3VyZSgpOwogICAgIHRlc3RSZWNsYWltUmVzb3VyY2VOb25TZWN1cmUoKTsKQEAgLTU0MSw0ICs3NzEsMTIgQEAKICAgICB0ZXN0SXNDYWxsaW5nUHJpb3JpdHlIaWdoZXIoKTsKIH0KIAorVEVTVF9GKFJlc291cmNlTWFuYWdlclNlcnZpY2VUZXN0LCB0ZXN0QmF0dGVyeVN0YXRzKSB7CisgICAgdGVzdEJhdHRlcnlTdGF0cygpOworfQorCitURVNUX0YoUmVzb3VyY2VNYW5hZ2VyU2VydmljZVRlc3QsIHRlc3RDcHVzZXRCb29zdCkgeworICAgIHRlc3RDcHVzZXRCb29zdCgpOworfQorCiB9IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9taW5pamFpbC9BbmRyb2lkLmJwIGIvc2VydmljZXMvbWluaWphaWwvQW5kcm9pZC5icAppbmRleCAwN2E5NGNjLi4wNzEzYTg3IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9taW5pamFpbC9BbmRyb2lkLmJwCisrKyBiL3NlcnZpY2VzL21pbmlqYWlsL0FuZHJvaWQuYnAKQEAgLTE3LDEwICsxNywxNCBAQAogY2NfbGlicmFyeV9zaGFyZWQgewogICAgIG5hbWU6ICJsaWJhdnNlcnZpY2VzX21pbmlqYWlsIiwKICAgICBkZWZhdWx0czogWyJsaWJhdnNlcnZpY2VzX21pbmlqYWlsX2RlZmF1bHRzIl0sCisgICAgdmVuZG9yX2F2YWlsYWJsZTogdHJ1ZSwKICAgICBleHBvcnRfaW5jbHVkZV9kaXJzOiBbIi4iXSwKIH0KIAotLy8gU21hbGwgbGlicmFyeSBmb3IgbWVkaWEuZXh0cmFjdG9yIGFuZCBtZWRpYS5jb2RlYyBzYW5kYm94aW5nLgorLy8gQnkgYWRkaW5nICJ2ZW5kb3JfYXZhaWxhYmxlOiB0cnVlIiB0byAibGliYXZzZXJ2aWNlc19taW5pamFpbCIsIHdlIGRvbid0CisvLyBuZWVkIHRvIGhhdmUgImxpYmF2c2VydmljZXNfbWluaWphaWxfdmVuZG9yIiBhbnkgbG9uZ2VyLgorLy8gImxpYmF2c2VydmljZXNfbWluaWphaWxfdmVuZG9yIiB3aWxsIGJlIHJlbW92ZWQsIG9uY2Ugd2UgcmVwbGFjZSBpdCB3aXRoCisvLyAibGliYXZzZXJ2aWNlc19taW5pamFpbCIgaW4gYWxsIHZlbmRvciBtb2R1bGVzLiAoYi8xNDYzMTM3MTApCiBjY19saWJyYXJ5X3NoYXJlZCB7CiAgICAgbmFtZTogImxpYmF2c2VydmljZXNfbWluaWphaWxfdmVuZG9yIiwKICAgICB2ZW5kb3I6IHRydWUsCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9DbGllbnRUcmFja2VyLmNwcCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NsaWVudFRyYWNrZXIuY3BwCmluZGV4IDcyNjRhOWIuLjZlMTQ0MzQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NsaWVudFRyYWNrZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NsaWVudFRyYWNrZXIuY3BwCkBAIC02NywxMiArNjcsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SUFBdWRpb0NsaWVudD4mIGNsaWVudCkgewogICAgIEFMT0dWKCJyZWdpc3RlckNsaWVudCgpLCBjYWxsaW5nIHBpZCA9ICVkLCBnZXRwaWQoKSA9ICVkXG4iLCBwaWQsIGdldHBpZCgpKTsKIAorICAgIGlmIChjbGllbnQuZ2V0KCkgPT0gbnVsbHB0cikgeworICAgICAgICBBTE9HRSgiQUF1ZGlvQ2xpZW50VHJhY2tlcjo6JXMoKSBjbGllbnQgaXMgTlVMTCEiLCBfX2Z1bmNfXyk7CisgICAgICAgIGFuZHJvaWRfZXJyb3JXcml0ZUxvZygweDUzNGU0NTU0LCAiMTE2MjMwNDUzIik7CisgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKKyAgICB9CisKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CiAgICAgaWYgKG1Ob3RpZmljYXRpb25DbGllbnRzLmNvdW50KHBpZCkgPT0gMCkgewotICAgICAgICBzcDxOb3RpZmljYXRpb25DbGllbnQ+IG5vdGlmaWNhdGlvbkNsaWVudCA9IG5ldyBOb3RpZmljYXRpb25DbGllbnQocGlkKTsKKyAgICAgICAgc3A8SUJpbmRlcj4gYmluZGVyID0gSUludGVyZmFjZTo6YXNCaW5kZXIoY2xpZW50KTsKKyAgICAgICAgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBub3RpZmljYXRpb25DbGllbnQgPSBuZXcgTm90aWZpY2F0aW9uQ2xpZW50KHBpZCwgYmluZGVyKTsKICAgICAgICAgbU5vdGlmaWNhdGlvbkNsaWVudHNbcGlkXSA9IG5vdGlmaWNhdGlvbkNsaWVudDsKIAotICAgICAgICBzcDxJQmluZGVyPiBiaW5kZXIgPSBJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnQpOwogICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBiaW5kZXItPmxpbmtUb0RlYXRoKG5vdGlmaWNhdGlvbkNsaWVudCk7CiAgICAgICAgIEFMT0dXX0lGKHN0YXR1cyAhPSBOT19FUlJPUiwgInJlZ2lzdGVyQ2xpZW50KCkgbGlua1RvRGVhdGggPSAlZFxuIiwgc3RhdHVzKTsKICAgICAgICAgcmV0dXJuIEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvUmVzdWx0KHN0YXR1cyk7CkBAIC0xMDEsMTMgKzEwNywxMyBAQAogYWF1ZGlvX3Jlc3VsdF90CiBBQXVkaW9DbGllbnRUcmFja2VyOjpyZWdpc3RlckNsaWVudFN0cmVhbShwaWRfdCBwaWQsIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtKSB7CiAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IEFBVURJT19PSzsKLSAgICBBTE9HVigicmVnaXN0ZXJDbGllbnRTdHJlYW0oJWQsICVwKVxuIiwgcGlkLCBzZXJ2aWNlU3RyZWFtLmdldCgpKTsKKyAgICBBTE9HVigicmVnaXN0ZXJDbGllbnRTdHJlYW0oJWQsKVxuIiwgcGlkKTsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9jayk7CiAgICAgc3A8Tm90aWZpY2F0aW9uQ2xpZW50PiBub3RpZmljYXRpb25DbGllbnQgPSBtTm90aWZpY2F0aW9uQ2xpZW50c1twaWRdOwogICAgIGlmIChub3RpZmljYXRpb25DbGllbnQgPT0gMCkgewogICAgICAgICAvLyBUaGlzIHdpbGwgZ2V0IGNhbGxlZCB0aGUgZmlyc3QgdGltZSB0aGUgYXVkaW8gc2VydmVyIHJlZ2lzdGVycyBhbiBpbnRlcm5hbCBzdHJlYW0uCiAgICAgICAgIEFMT0dWKCJyZWdpc3RlckNsaWVudFN0cmVhbSglZCwpIHVucmVjb2duaXplZCBwaWRcbiIsIHBpZCk7Ci0gICAgICAgIG5vdGlmaWNhdGlvbkNsaWVudCA9IG5ldyBOb3RpZmljYXRpb25DbGllbnQocGlkKTsKKyAgICAgICAgbm90aWZpY2F0aW9uQ2xpZW50ID0gbmV3IE5vdGlmaWNhdGlvbkNsaWVudChwaWQsIG51bGxwdHIpOwogICAgICAgICBtTm90aWZpY2F0aW9uQ2xpZW50c1twaWRdID0gbm90aWZpY2F0aW9uQ2xpZW50OwogICAgIH0KICAgICBub3RpZmljYXRpb25DbGllbnQtPnJlZ2lzdGVyQ2xpZW50U3RyZWFtKHNlcnZpY2VTdHJlYW0pOwpAQCAtMTE4LDI3ICsxMjQsMjMgQEAKIGFhdWRpb19yZXN1bHRfdAogQUF1ZGlvQ2xpZW50VHJhY2tlcjo6dW5yZWdpc3RlckNsaWVudFN0cmVhbShwaWRfdCBwaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPiBzZXJ2aWNlU3RyZWFtKSB7Ci0gICAgQUxPR1YoInVucmVnaXN0ZXJDbGllbnRTdHJlYW0oJWQsICVwKVxuIiwgcGlkLCBzZXJ2aWNlU3RyZWFtLmdldCgpKTsKKyAgICBBTE9HVigidW5yZWdpc3RlckNsaWVudFN0cmVhbSglZCwpXG4iLCBwaWQpOwogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrKTsKICAgICBhdXRvIGl0ID0gbU5vdGlmaWNhdGlvbkNsaWVudHMuZmluZChwaWQpOwogICAgIGlmIChpdCAhPSBtTm90aWZpY2F0aW9uQ2xpZW50cy5lbmQoKSkgewotICAgICAgICBBTE9HVigidW5yZWdpc3RlckNsaWVudFN0cmVhbSglZCwgJXApIGZvdW5kIE5vdGlmaWNhdGlvbkNsaWVudFxuIiwKLSAgICAgICAgICAgICAgcGlkLCBzZXJ2aWNlU3RyZWFtLmdldCgpKTsKKyAgICAgICAgQUxPR1YoInVucmVnaXN0ZXJDbGllbnRTdHJlYW0oJWQsKSBmb3VuZCBOb3RpZmljYXRpb25DbGllbnRcbiIsIHBpZCk7CiAgICAgICAgIGl0LT5zZWNvbmQtPnVucmVnaXN0ZXJDbGllbnRTdHJlYW0oc2VydmljZVN0cmVhbSk7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0UoInVucmVnaXN0ZXJDbGllbnRTdHJlYW0oJWQsICVwKSBtaXNzaW5nIE5vdGlmaWNhdGlvbkNsaWVudFxuIiwKLSAgICAgICAgICAgICAgcGlkLCBzZXJ2aWNlU3RyZWFtLmdldCgpKTsKKyAgICAgICAgQUxPR0UoInVucmVnaXN0ZXJDbGllbnRTdHJlYW0oJWQsKSBtaXNzaW5nIE5vdGlmaWNhdGlvbkNsaWVudFxuIiwgcGlkKTsKICAgICB9CiAgICAgcmV0dXJuIEFBVURJT19PSzsKIH0KIAotQUF1ZGlvQ2xpZW50VHJhY2tlcjo6Tm90aWZpY2F0aW9uQ2xpZW50OjpOb3RpZmljYXRpb25DbGllbnQocGlkX3QgcGlkKQotICAgICAgICA6IG1Qcm9jZXNzSWQocGlkKSB7Ci0gICAgLy9BTE9HRCgiTm90aWZpY2F0aW9uQ2xpZW50KCVkKSBjcmVhdGVkICVwXG4iLCBwaWQsIHRoaXMpOworQUF1ZGlvQ2xpZW50VHJhY2tlcjo6Tm90aWZpY2F0aW9uQ2xpZW50OjpOb3RpZmljYXRpb25DbGllbnQocGlkX3QgcGlkLCBjb25zdCBzcDxJQmluZGVyPiYgYmluZGVyKQorICAgICAgICA6IG1Qcm9jZXNzSWQocGlkKSwgbUJpbmRlcihiaW5kZXIpIHsKIH0KIAogQUF1ZGlvQ2xpZW50VHJhY2tlcjo6Tm90aWZpY2F0aW9uQ2xpZW50Ojp+Tm90aWZpY2F0aW9uQ2xpZW50KCkgewotICAgIC8vQUxPR0QoIn5Ob3RpZmljYXRpb25DbGllbnQoKSBkZXN0cm95ZWQgJXBcbiIsIHRoaXMpOwogfQogCiBpbnQzMl90IEFBdWRpb0NsaWVudFRyYWNrZXI6Ok5vdGlmaWNhdGlvbkNsaWVudDo6Z2V0U3RyZWFtQ291bnQoKSB7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9DbGllbnRUcmFja2VyLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9DbGllbnRUcmFja2VyLmgKaW5kZXggYWNjZjFhNy4uMDBmZjQ2NyAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvQ2xpZW50VHJhY2tlci5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0NsaWVudFRyYWNrZXIuaApAQCAtNzMsNyArNzMsNyBAQAogICAgICAqLwogICAgIGNsYXNzIE5vdGlmaWNhdGlvbkNsaWVudCA6IHB1YmxpYyBJQmluZGVyOjpEZWF0aFJlY2lwaWVudCB7CiAgICAgcHVibGljOgotICAgICAgICBOb3RpZmljYXRpb25DbGllbnQocGlkX3QgcGlkKTsKKyAgICAgICAgTm90aWZpY2F0aW9uQ2xpZW50KHBpZF90IHBpZCwgY29uc3QgYW5kcm9pZDo6c3A8SUJpbmRlcj4mIGJpbmRlcik7CiAgICAgICAgIHZpcnR1YWwgfk5vdGlmaWNhdGlvbkNsaWVudCgpOwogCiAgICAgICAgIGludDMyX3QgZ2V0U3RyZWFtQ291bnQoKTsKQEAgLTkxLDYgKzkxLDggQEAKICAgICAgICAgbXV0YWJsZSBzdGQ6Om11dGV4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CiAgICAgICAgIGNvbnN0IHBpZF90ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1Qcm9jZXNzSWQ7CiAgICAgICAgIHN0ZDo6c2V0PGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlPj4gIG1TdHJlYW1zOworICAgICAgICAvLyBob2xkIG9udG8gYmluZGVyIHRvIHJlY2VpdmUgZGVhdGggbm90aWZpY2F0aW9ucworICAgICAgICBhbmRyb2lkOjpzcDxJQmluZGVyPiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtQmluZGVyOwogICAgIH07CiAKICAgICBtdXRhYmxlIHN0ZDo6bXV0ZXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbUxvY2s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmNwcAppbmRleCBlMGRiMjYxLi5hMWZjMGVhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb0VuZHBvaW50TWFuYWdlci5jcHAKQEAgLTE0MCw5ICsxNDAsOCBAQAogfQogCiBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6b3BlbkVuZHBvaW50KEFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlKSB7Ci0gICAgaWYgKHNoYXJpbmdNb2RlID09IEFBVURJT19TSEFSSU5HX01PREVfRVhDTFVTSVZFKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0KSB7CisgICAgaWYgKHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkuZ2V0U2hhcmluZ01vZGUoKSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkgewogICAgICAgICByZXR1cm4gb3BlbkV4Y2x1c2l2ZUVuZHBvaW50KGF1ZGlvU2VydmljZSwgcmVxdWVzdCk7CiAgICAgfSBlbHNlIHsKICAgICAgICAgcmV0dXJuIG9wZW5TaGFyZWRFbmRwb2ludChhdWRpb1NlcnZpY2UsIHJlcXVlc3QpOwpAQCAtMTczLDcgKzE3Miw3IEBACiAKICAgICAgICAgYWF1ZGlvX3Jlc3VsdF90IHJlc3VsdCA9IGVuZHBvaW50LT5vcGVuKHJlcXVlc3QpOwogICAgICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewotICAgICAgICAgICAgQUxPR0UoIm9wZW5FeGNsdXNpdmVFbmRwb2ludCgpLCBvcGVuIGZhaWxlZCIpOworICAgICAgICAgICAgQUxPR1YoIm9wZW5FeGNsdXNpdmVFbmRwb2ludCgpLCBvcGVuIGZhaWxlZCIpOwogICAgICAgICAgICAgZW5kcG9pbnQuY2xlYXIoKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIG1FeGNsdXNpdmVTdHJlYW1zLnB1c2hfYmFjayhlbmRwb2ludE1NYXApOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvRW5kcG9pbnRNYW5hZ2VyLmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaAppbmRleCAxOTNiZGVlLi5iYTE3ODUzIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9FbmRwb2ludE1hbmFnZXIuaApAQCAtNTYsOCArNTYsNyBAQAogICAgICAqIEByZXR1cm4gZW5kcG9pbnQgb3IgbnVsbAogICAgICAqLwogICAgIGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gb3BlbkVuZHBvaW50KGFuZHJvaWQ6OkFBdWRpb1NlcnZpY2UgJmF1ZGlvU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWF1ZGlvX3NoYXJpbmdfbW9kZV90IHNoYXJpbmdNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpOwogCiAgICAgdm9pZCBjbG9zZUVuZHBvaW50KGFuZHJvaWQ6OnNwPEFBdWRpb1NlcnZpY2VFbmRwb2ludD4gc2VydmljZUVuZHBvaW50KTsKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvTWl4ZXIuY3BwCmluZGV4IGIwMzE4ODguLjFjMDNiN2YgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb01peGVyLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9NaXhlci5jcHAKQEAgLTk5LDcgKzk5LDcgQEAKICAgICAgICAgfQogICAgICAgICBwYXJ0SW5kZXgrKzsKICAgICB9Ci0gICAgZmlmby0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmFkdmFuY2VSZWFkSW5kZXgoZnJhbWVzRGVzaXJlZCk7CisgICAgZmlmby0+YWR2YW5jZVJlYWRJbmRleChmcmFtZXNEZXNpcmVkKTsKIAogI2lmIEFBVURJT19NSVhFUl9BVFJBQ0VfRU5BQkxFRAogICAgIEFUUkFDRV9FTkQoKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2UuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAKaW5kZXggMDE4MmEyNy4uZTZhODM3NSAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZS5jcHAKQEAgLTI0LDYgKzI0LDcgQEAKIAogI2luY2x1ZGUgPGFhdWRpby9BQXVkaW8uaD4KICNpbmNsdWRlIDxtZWRpYXV0aWxzL1NjaGVkdWxpbmdQb2xpY3lTZXJ2aWNlLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvU3RyaW5nMTYuaD4KIAogI2luY2x1ZGUgImJpbmRpbmcvQUF1ZGlvU2VydmljZU1lc3NhZ2UuaCIKQEAgLTMzLDcgKzM0LDYgQEAKICNpbmNsdWRlICJBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5oIgogI2luY2x1ZGUgIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQuaCIKICNpbmNsdWRlICJiaW5kaW5nL0lBQXVkaW9TZXJ2aWNlLmgiCi0jaW5jbHVkZSAiU2VydmljZVV0aWxpdGllcy5oIgogCiB1c2luZyBuYW1lc3BhY2UgYW5kcm9pZDsKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87CkBAIC0xMTgsMjEgKzExOCwyNCBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgLy8gaWYgU0hBUkVEIHJlcXVlc3RlZCBvciBpZiBFWENMVVNJVkUgZmFpbGVkCi0gICAgaWYgKHNoYXJpbmdNb2RlID09IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVECi0gICAgICAgICB8fCAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyICYmICFzaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQpKSB7CisgICAgLy8gVHJ5IFNIQVJFRCBpZiBTSEFSRUQgcmVxdWVzdGVkIG9yIGlmIEVYQ0xVU0lWRSBmYWlsZWQuCisgICAgaWYgKHNoYXJpbmdNb2RlID09IEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKSB7CiAgICAgICAgIHNlcnZpY2VTdHJlYW0gPSAgbmV3IEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQoKnRoaXMpOwogICAgICAgICByZXN1bHQgPSBzZXJ2aWNlU3RyZWFtLT5vcGVuKHJlcXVlc3QpOworICAgIH0gZWxzZSBpZiAoc2VydmljZVN0cmVhbS5nZXQoKSA9PSBudWxscHRyICYmICFzaGFyaW5nTW9kZU1hdGNoUmVxdWlyZWQpIHsKKyAgICAgICAgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0IG1vZGlmaWVkUmVxdWVzdCA9IHJlcXVlc3Q7CisgICAgICAgIC8vIE92ZXJ3cml0ZSB0aGUgb3JpZ2luYWwgRVhDTFVTSVZFIG1vZGUgd2l0aCBTSEFSRUQuCisgICAgICAgIG1vZGlmaWVkUmVxdWVzdC5nZXRDb25maWd1cmF0aW9uKCkuc2V0U2hhcmluZ01vZGUoQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpOworICAgICAgICBzZXJ2aWNlU3RyZWFtID0gIG5ldyBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkKCp0aGlzKTsKKyAgICAgICAgcmVzdWx0ID0gc2VydmljZVN0cmVhbS0+b3Blbihtb2RpZmllZFJlcXVlc3QpOwogICAgIH0KIAogICAgIGlmIChyZXN1bHQgIT0gQUFVRElPX09LKSB7CiAgICAgICAgIHNlcnZpY2VTdHJlYW0uY2xlYXIoKTsKLSAgICAgICAgQUxPR0UoIm9wZW5TdHJlYW0oKTogZmFpbGVkLCByZXR1cm4gJWQgPSAlcyIsCi0gICAgICAgICAgICAgIHJlc3VsdCwgQUF1ZGlvX2NvbnZlcnRSZXN1bHRUb1RleHQocmVzdWx0KSk7CiAgICAgICAgIHJldHVybiByZXN1bHQ7CiAgICAgfSBlbHNlIHsKICAgICAgICAgYWF1ZGlvX2hhbmRsZV90IGhhbmRsZSA9IG1TdHJlYW1UcmFja2VyLmFkZFN0cmVhbUZvckhhbmRsZShzZXJ2aWNlU3RyZWFtLmdldCgpKTsKLSAgICAgICAgQUxPR0QoIm9wZW5TdHJlYW0oKTogaGFuZGxlID0gMHglMDhYIiwgaGFuZGxlKTsKKyAgICAgICAgQUxPR1YoIm9wZW5TdHJlYW0oKTogaGFuZGxlID0gMHglMDhYIiwgaGFuZGxlKTsKICAgICAgICAgc2VydmljZVN0cmVhbS0+c2V0SGFuZGxlKGhhbmRsZSk7CiAgICAgICAgIHBpZF90IHBpZCA9IHJlcXVlc3QuZ2V0UHJvY2Vzc0lkKCk7CiAgICAgICAgIEFBdWRpb0NsaWVudFRyYWNrZXI6OmdldEluc3RhbmNlKCkucmVnaXN0ZXJDbGllbnRTdHJlYW0ocGlkLCBzZXJ2aWNlU3RyZWFtKTsKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuY3BwCmluZGV4IDY5MDY4ZjUuLjU1Mzc1NGUgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludC5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmNwcApAQCAtMzgsMTAgKzM4LDYgQEAKIHVzaW5nIG5hbWVzcGFjZSBhbmRyb2lkOyAgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKIHVzaW5nIG5hbWVzcGFjZSBhYXVkaW87ICAgLy8gVE9ETyBqdXN0IGltcG9ydCBuYW1lcyBuZWVkZWQKIAotQUF1ZGlvU2VydmljZUVuZHBvaW50Ojp+QUF1ZGlvU2VydmljZUVuZHBvaW50KCkgewotICAgIEFMT0dEKCIlcyglcCkgZGVzdHJveWVkIiwgX19mdW5jX18sIHRoaXMpOwotfQotCiBzdGQ6OnN0cmluZyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ6OmR1bXAoKSBjb25zdCB7CiAgICAgc3RkOjpzdHJpbmdzdHJlYW0gcmVzdWx0OwogCkBAIC01OSw2ICs1NSw3IEBACiAgICAgcmVzdWx0IDw8ICIgICAgRGV2aWNlIElkOiAgICAgICAgICAgICIgPDwgZ2V0RGV2aWNlSWQoKSA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIFNhbXBsZSBSYXRlOiAgICAgICAgICAiIDw8IGdldFNhbXBsZVJhdGUoKSA8PCAiXG4iOwogICAgIHJlc3VsdCA8PCAiICAgIENoYW5uZWwgQ291bnQ6ICAgICAgICAiIDw8IGdldFNhbXBsZXNQZXJGcmFtZSgpIDw8ICJcbiI7CisgICAgcmVzdWx0IDw8ICIgICAgRm9ybWF0OiAgICAgICAgICAgICAgICIgPDwgZ2V0Rm9ybWF0KCkgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBGcmFtZXMgUGVyIEJ1cnN0OiAgICAgIiA8PCBtRnJhbWVzUGVyQnVyc3QgPDwgIlxuIjsKICAgICByZXN1bHQgPDwgIiAgICBVc2FnZTogICAgICAgICAgICAgICAgIiA8PCBnZXRVc2FnZSgpIDw8ICJcbiI7CiAgICAgcmVzdWx0IDw8ICIgICAgQ29udGVudFR5cGU6ICAgICAgICAgICIgPDwgZ2V0Q29udGVudFR5cGUoKSA8PCAiXG4iOwpAQCAtOTMsNyArOTAsOCBAQAogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7CiAgICAgbUNvbm5lY3RlZC5zdG9yZShmYWxzZSk7CiAgICAgZm9yIChjb25zdCBhdXRvJiBzdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKLSAgICAgICAgQUxPR0QoImRpc2Nvbm5lY3RSZWdpc3RlcmVkU3RyZWFtcygpIHN0b3AgYW5kIGRpc2Nvbm5lY3QgJXAiLCBzdHJlYW0uZ2V0KCkpOworICAgICAgICBBTE9HRCgiZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zKCkgc3RvcCBhbmQgZGlzY29ubmVjdCBwb3J0ICVkIiwKKyAgICAgICAgICAgICAgc3RyZWFtLT5nZXRQb3J0SGFuZGxlKCkpOwogICAgICAgICBzdHJlYW0tPnN0b3AoKTsKICAgICAgICAgc3RyZWFtLT5kaXNjb25uZWN0KCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50LmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaAppbmRleCBhMTM0YTEzLi5hMmY2NmE1IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnQuaApAQCAtNDEsNyArNDEsNyBAQAogICAgICAgICAsIHB1YmxpYyBBQXVkaW9TdHJlYW1QYXJhbWV0ZXJzIHsKIHB1YmxpYzoKIAotICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VFbmRwb2ludCgpOworICAgIHZpcnR1YWwgfkFBdWRpb1NlcnZpY2VFbmRwb2ludCgpID0gZGVmYXVsdDsKIAogICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZHVtcCgpIGNvbnN0OwogCkBAIC02MSw3ICs2MSw3IEBACiAKICAgICB2aXJ0dWFsIGFhdWRpb19yZXN1bHRfdCBzdGFydENsaWVudChjb25zdCBhbmRyb2lkOjpBdWRpb0NsaWVudCYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgKmNsaWVudEhhbmRsZSkgewotICAgICAgICBBTE9HRCgiQUF1ZGlvU2VydmljZUVuZHBvaW50OjpzdGFydENsaWVudCglcCwgLi4uKSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEUiLCAmY2xpZW50KTsKKyAgICAgICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VFbmRwb2ludDo6c3RhcnRDbGllbnQoLi4uKSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEUiKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKICAgICB9CiAKQEAgLTEyMSw3ICsxMjEsNyBAQAogICAgIG11dGFibGUgc3RkOjptdXRleCAgICAgICBtTG9ja1N0cmVhbXM7CiAgICAgc3RkOjp2ZWN0b3I8YW5kcm9pZDo6c3A8QUF1ZGlvU2VydmljZVN0cmVhbUJhc2U+PiBtUmVnaXN0ZXJlZFN0cmVhbXM7CiAKLSAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY1RpbWVzdGFtcDsKKyAgICBTaW1wbGVEb3VibGVCdWZmZXI8VGltZXN0YW1wPiAgbUF0b21pY0VuZHBvaW50VGltZXN0YW1wOwogCiAgICAgYW5kcm9pZDo6QXVkaW9DbGllbnQgICAgIG1NbWFwQ2xpZW50OyAgIC8vIHNldCBpbiBvcGVuLCB1c2VkIGluIG9wZW4gYW5kIHN0YXJ0U3RyZWFtCiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludENhcHR1cmUuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKaW5kZXggY2M5NDJmNC4uMzdkMTA1YiAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKKysrIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50Q2FwdHVyZS5jcHAKQEAgLTgyLDggKzgyLDkgQEAKIAogICAgICAgICAgICAgc3RkOjpsb2NrX2d1YXJkIDxzdGQ6Om11dGV4PiBsb2NrKG1Mb2NrU3RyZWFtcyk7CiAgICAgICAgICAgICBmb3IgKGNvbnN0IGF1dG8mIGNsaWVudFN0cmVhbSA6IG1SZWdpc3RlcmVkU3RyZWFtcykgewotICAgICAgICAgICAgICAgIGlmIChjbGllbnRTdHJlYW0tPmlzUnVubmluZygpKSB7CisgICAgICAgICAgICAgICAgaWYgKGNsaWVudFN0cmVhbS0+aXNSdW5uaW5nKCkgJiYgIWNsaWVudFN0cmVhbS0+aXNTdXNwZW5kZWQoKSkgewogICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGNsaWVudEZyYW1lc1dyaXR0ZW4gPSAwOworCiAgICAgICAgICAgICAgICAgICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+IHN0cmVhbVNoYXJlZCA9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZCAqPihjbGllbnRTdHJlYW0uZ2V0KCkpOwogCkBAIC0xMDIsNyArMTAzLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJlYW1TaGFyZWQtPnNldFRpbWVzdGFtcFBvc2l0aW9uT2Zmc2V0KHBvc2l0aW9uT2Zmc2V0KTsKIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElzIHRoZSBidWZmZXIgdG9vIGZ1bGwgdG8gd3JpdGUgYSBidXJzdD8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlmby0+Z2V0Rmlmb0NvbnRyb2xsZXJCYXNlKCktPmdldEVtcHR5RnJhbWVzQXZhaWxhYmxlKCkgPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmaWZvLT5nZXRFbXB0eUZyYW1lc0F2YWlsYWJsZSgpIDwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldEZyYW1lc1BlckJ1cnN0KCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtU2hhcmVkLT5pbmNyZW1lbnRYUnVuQ291bnQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50TU1BUC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcAppbmRleCA1YTQyOWM5Li5iMDViYWE0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQLmNwcApAQCAtNzcsOSArNzcsNiBAQAogICAgIGF1ZGlvX2NvbmZpZ19iYXNlX3QgY29uZmlnOwogICAgIGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQ7CiAKLSAgICBpbnQzMl90IGJ1cnN0TWluTWljcm9zID0gQUF1ZGlvUHJvcGVydHlfZ2V0SGFyZHdhcmVCdXJzdE1pbk1pY3JvcygpOwotICAgIGludDMyX3QgYnVyc3RNaWNyb3MgPSAwOwotCiAgICAgY29weUZyb20ocmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKSk7CiAKICAgICBhYXVkaW9fZGlyZWN0aW9uX3QgZGlyZWN0aW9uID0gZ2V0RGlyZWN0aW9uKCk7CkBAIC05MywxNiArOTAsMTYgQEAKICAgICBjb25zdCBhdWRpb19zb3VyY2VfdCBzb3VyY2UgPSAoZGlyZWN0aW9uID09IEFBVURJT19ESVJFQ1RJT05fSU5QVVQpCiAgICAgICAgICAgICA/IEFBdWRpb0NvbnZlcnRfaW5wdXRQcmVzZXRUb0F1ZGlvU291cmNlKGdldElucHV0UHJlc2V0KCkpCiAgICAgICAgICAgICA6IEFVRElPX1NPVVJDRV9ERUZBVUxUOworICAgIGNvbnN0IGF1ZGlvX2ZsYWdzX21hc2tfdCBmbGFncyA9IEFVRElPX0ZMQUdfTE9XX0xBVEVOQ1kgfAorICAgICAgICAgICAgQUF1ZGlvQ29udmVydF9hbGxvd0NhcHR1cmVQb2xpY3lUb0F1ZGlvRmxhZ3NNYXNrKGdldEFsbG93ZWRDYXB0dXJlUG9saWN5KCkpOwogCiAgICAgY29uc3QgYXVkaW9fYXR0cmlidXRlc190IGF0dHJpYnV0ZXMgPSB7CiAgICAgICAgICAgICAuY29udGVudF90eXBlID0gY29udGVudFR5cGUsCiAgICAgICAgICAgICAudXNhZ2UgPSB1c2FnZSwKICAgICAgICAgICAgIC5zb3VyY2UgPSBzb3VyY2UsCi0gICAgICAgICAgICAuZmxhZ3MgPSBBVURJT19GTEFHX0xPV19MQVRFTkNZLAorICAgICAgICAgICAgLmZsYWdzID0gZmxhZ3MsCiAgICAgICAgICAgICAudGFncyA9ICIiCiAgICAgfTsKLSAgICBBTE9HRCgiJXMoJXApIE1NQVAgYXR0cmlidXRlcy51c2FnZSA9ICVkLCBjb250ZW50X3R5cGUgPSAlZCwgc291cmNlID0gJWQiLAotICAgICAgICAgIF9fZnVuY19fLCB0aGlzLCBhdHRyaWJ1dGVzLnVzYWdlLCBhdHRyaWJ1dGVzLmNvbnRlbnRfdHlwZSwgYXR0cmlidXRlcy5zb3VyY2UpOwogCiAgICAgbU1tYXBDbGllbnQuY2xpZW50VWlkID0gcmVxdWVzdC5nZXRVc2VySWQoKTsKICAgICBtTW1hcENsaWVudC5jbGllbnRQaWQgPSByZXF1ZXN0LmdldFByb2Nlc3NJZCgpOwpAQCAtMTExLDExICsxMDgsMTEgQEAKICAgICBtUmVxdWVzdGVkRGV2aWNlSWQgPSBkZXZpY2VJZCA9IGdldERldmljZUlkKCk7CiAKICAgICAvLyBGaWxsIGluIGNvbmZpZwotICAgIGFhdWRpb19mb3JtYXRfdCBhYXVkaW9Gb3JtYXQgPSBnZXRGb3JtYXQoKTsKLSAgICBpZiAoYWF1ZGlvRm9ybWF0ID09IEFBVURJT19VTlNQRUNJRklFRCB8fCBhYXVkaW9Gb3JtYXQgPT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgYWF1ZGlvRm9ybWF0ID0gQUFVRElPX0ZPUk1BVF9QQ01fSTE2OworICAgIGF1ZGlvX2Zvcm1hdF90IGF1ZGlvRm9ybWF0ID0gZ2V0Rm9ybWF0KCk7CisgICAgaWYgKGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9ERUZBVUxUIHx8IGF1ZGlvRm9ybWF0ID09IEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKKyAgICAgICAgYXVkaW9Gb3JtYXQgPSBBVURJT19GT1JNQVRfUENNXzE2X0JJVDsKICAgICB9Ci0gICAgY29uZmlnLmZvcm1hdCA9IEFBdWRpb0NvbnZlcnRfYWF1ZGlvVG9BbmRyb2lkRGF0YUZvcm1hdChhYXVkaW9Gb3JtYXQpOworICAgIGNvbmZpZy5mb3JtYXQgPSBhdWRpb0Zvcm1hdDsKIAogICAgIGludDMyX3QgYWF1ZGlvU2FtcGxlUmF0ZSA9IGdldFNhbXBsZVJhdGUoKTsKICAgICBpZiAoYWF1ZGlvU2FtcGxlUmF0ZSA9PSBBQVVESU9fVU5TUEVDSUZJRUQpIHsKQEAgLTE2MywxMiArMTYwLDE0IEBACiAgICAgQUxPR0QoIiVzKCkgbU1hcENsaWVudC51aWQgPSAlZCwgcGlkID0gJWQgPT4gcG9ydEhhbmRsZSA9ICVkXG4iLAogICAgICAgICAgIF9fZnVuY19fLCBtTW1hcENsaWVudC5jbGllbnRVaWQsICBtTW1hcENsaWVudC5jbGllbnRQaWQsIG1Qb3J0SGFuZGxlKTsKICAgICBpZiAoc3RhdHVzICE9IE9LKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpIG9wZW5NbWFwU3RyZWFtKCkgcmV0dXJuZWQgc3RhdHVzICVkIiwgIF9fZnVuY19fLCBzdGF0dXMpOworICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYgdGhlIHJlc291cmNlIGlzIGJ1c3kgb3IgdGhlIGNvbmZpZyBkb2VzCisgICAgICAgIC8vIG5vdCBtYXRjaCB0aGUgaGFyZHdhcmUuCisgICAgICAgIEFMT0dEKCIlcygpIC0gb3Blbk1tYXBTdHJlYW0oKSByZXR1cm5lZCBzdGF0dXMgJWQiLCAgX19mdW5jX18sIHN0YXR1cyk7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgfQogCiAgICAgaWYgKGRldmljZUlkID09IEFBVURJT19VTlNQRUNJRklFRCkgewotICAgICAgICBBTE9HVygiJXMoKSBvcGVuTW1hcFN0cmVhbSgpIGZhaWxlZCB0byBzZXQgZGV2aWNlSWQiLCBfX2Z1bmNfXyk7CisgICAgICAgIEFMT0dXKCIlcygpIC0gb3Blbk1tYXBTdHJlYW0oKSBmYWlsZWQgdG8gc2V0IGRldmljZUlkIiwgX19mdW5jX18pOwogICAgIH0KICAgICBzZXREZXZpY2VJZChkZXZpY2VJZCk7CiAKQEAgLTE5Niw5ICsxOTUsOSBAQAogICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgICAgIGdvdG8gZXJyb3I7CiAgICAgfSBlbHNlIHsKLSAgICAgICAgQUxPR0QoIiVzKCkgY3JlYXRlTW1hcEJ1ZmZlcigpIHJldHVybmVkID0gJWQsIGJ1ZmZlcl9zaXplID0gJWQsIGJ1cnN0X3NpemUgJWQiCisgICAgICAgIEFMT0dEKCIlcygpIGNyZWF0ZU1tYXBCdWZmZXIoKSBidWZmZXJfc2l6ZSA9ICVkIGZyLCBidXJzdF9zaXplICVkIGZyIgogICAgICAgICAgICAgICAgICAgICAgICIsIFNoYXJhYmxlIEZEOiAlcyIsCi0gICAgICAgICAgICAgIF9fZnVuY19fLCBzdGF0dXMsCisgICAgICAgICAgICAgIF9fZnVuY19fLAogICAgICAgICAgICAgICBtTW1hcEJ1ZmZlcmluZm8uYnVmZmVyX3NpemVfZnJhbWVzLAogICAgICAgICAgICAgICBtTW1hcEJ1ZmZlcmluZm8uYnVyc3Rfc2l6ZV9mcmFtZXMsCiAgICAgICAgICAgICAgIGlzQnVmZmVyU2hhcmVhYmxlID8gIlllcyIgOiAiTm8iKTsKQEAgLTIxMCw5ICsyMDksNiBAQAogICAgICAgICB1aWRfdCBhdWRpb1NlcnZpY2VVaWQgPSBnZXR1aWQoKTsKICAgICAgICAgaWYgKChtTW1hcENsaWVudC5jbGllbnRVaWQgIT0gYXVkaW9TZXJ2aWNlVWlkKSAmJgogICAgICAgICAgICAgZ2V0U2hhcmluZ01vZGUoKSA9PSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkgewotICAgICAgICAgICAgLy8gRmFsbGJhY2sgaXMgaGFuZGxlZCBieSBjYWxsZXIgYnV0IGluZGljYXRlIHdoYXQgaXMgcG9zc2libGUgaW4gY2FzZQotICAgICAgICAgICAgLy8gdGhpcyBpcyB1c2VkIGluIHRoZSBmdXR1cmUKLSAgICAgICAgICAgIHNldFNoYXJpbmdNb2RlKEFBVURJT19TSEFSSU5HX01PREVfU0hBUkVEKTsKICAgICAgICAgICAgIEFMT0dXKCIlcygpIC0gZXhjbHVzaXZlIEZEIGNhbm5vdCBiZSB1c2VkIGJ5IGNsaWVudCIsIF9fZnVuY19fKTsKICAgICAgICAgICAgIHJlc3VsdCA9IEFBVURJT19FUlJPUl9VTkFWQUlMQUJMRTsKICAgICAgICAgICAgIGdvdG8gZXJyb3I7CkBAIC0yMzMsMjYgKzIyOSwxNiBAQAogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KICAgICBtRnJhbWVzUGVyQnVyc3QgPSBtTW1hcEJ1ZmZlcmluZm8uYnVyc3Rfc2l6ZV9mcmFtZXM7Ci0gICAgc2V0Rm9ybWF0KEFBdWRpb0NvbnZlcnRfYW5kcm9pZFRvQUF1ZGlvRGF0YUZvcm1hdChjb25maWcuZm9ybWF0KSk7CisgICAgc2V0Rm9ybWF0KGNvbmZpZy5mb3JtYXQpOwogICAgIHNldFNhbXBsZVJhdGUoY29uZmlnLnNhbXBsZV9yYXRlKTsKIAotICAgIC8vIFNjYWxlIHVwIHRoZSBidXJzdCBzaXplIHRvIG1lZXQgdGhlIG1pbmltdW0gZXF1aXZhbGVudCBpbiBtaWNyb3NlY29uZHMuCi0gICAgLy8gVGhpcyBpcyB0byBhdm9pZCB3YWtpbmcgdGhlIENQVSB0b28gb2Z0ZW4gd2hlbiB0aGUgSFcgYnVyc3QgaXMgdmVyeSBzbWFsbAotICAgIC8vIG9yIGF0IGhpZ2ggc2FtcGxlIHJhdGVzLgotICAgIGRvIHsKLSAgICAgICAgaWYgKGJ1cnN0TWljcm9zID4gMCkgeyAgLy8gc2tpcCBmaXJzdCBsb29wCi0gICAgICAgICAgICBtRnJhbWVzUGVyQnVyc3QgKj0gMjsKLSAgICAgICAgfQotICAgICAgICBidXJzdE1pY3JvcyA9IG1GcmFtZXNQZXJCdXJzdCAqIHN0YXRpY19jYXN0PGludDY0X3Q+KDEwMDAwMDApIC8gZ2V0U2FtcGxlUmF0ZSgpOwotICAgIH0gd2hpbGUgKGJ1cnN0TWljcm9zIDwgYnVyc3RNaW5NaWNyb3MpOwotCi0gICAgQUxPR0QoIiVzKCkgb3JpZ2luYWwgYnVyc3QgPSAlZCwgbWluTWljcm9zID0gJWQsIHRvIGJ1cnN0ID0gJWRcbiIsCi0gICAgICAgICAgX19mdW5jX18sIG1NbWFwQnVmZmVyaW5mby5idXJzdF9zaXplX2ZyYW1lcywgYnVyc3RNaW5NaWNyb3MsIG1GcmFtZXNQZXJCdXJzdCk7Ci0KICAgICBBTE9HRCgiJXMoKSBhY3R1YWwgcmF0ZSA9ICVkLCBjaGFubmVscyA9ICVkIgogICAgICAgICAgICIsIGRldmljZUlkID0gJWQsIGNhcGFjaXR5ID0gJWRcbiIsCiAgICAgICAgICAgX19mdW5jX18sIGdldFNhbXBsZVJhdGUoKSwgZ2V0U2FtcGxlc1BlckZyYW1lKCksIGRldmljZUlkLCBnZXRCdWZmZXJDYXBhY2l0eSgpKTsKIAorICAgIEFMT0dEKCIlcygpIGZvcm1hdCA9IDB4JTA4eCwgZnJhbWUgc2l6ZSA9ICVkLCBidXJzdCBzaXplID0gJWQiLAorICAgICAgICAgIF9fZnVuY19fLCBnZXRGb3JtYXQoKSwgY2FsY3VsYXRlQnl0ZXNQZXJGcmFtZSgpLCBtRnJhbWVzUGVyQnVyc3QpOworCiAgICAgcmV0dXJuIHJlc3VsdDsKIAogZXJyb3I6CkBAIC0yNjIsNyArMjQ4LDYgQEAKIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OmNsb3NlKCkgewogICAgIGlmIChtTW1hcFN0cmVhbSAhPSAwKSB7Ci0gICAgICAgIEFMT0dEKCIlcygpIGNsZWFyKCkgZW5kcG9pbnQiLCBfX2Z1bmNfXyk7CiAgICAgICAgIC8vIE5lZWRzIHRvIGJlIGV4cGxpY2l0bHkgY2xlYXJlZCBvciBDVFMgd2lsbCBmYWlsIGJ1dCBpdCBpcyBub3QgY2xlYXIgd2h5LgogICAgICAgICBtTW1hcFN0cmVhbS5jbGVhcigpOwogICAgICAgICAvLyBBcHBhcmVudGx5IHRoZSBhYm92ZSBjbG9zZSBpcyBhc3luY2hyb25vdXMuIEFuIGF0dGVtcHQgdG8gb3BlbiBhIG5ldyBkZXZpY2UKQEAgLTI4NCw3ICsyNjksNyBAQAogICAgIExPR19BTFdBWVNfRkFUQUxfSUYodGVtcEhhbmRsZSAhPSBtUG9ydEhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICIlcygpIHBvcnQgaGFuZGxlIG5vdCBleHBlY3RlZCB0byBjaGFuZ2UgZnJvbSAlZCB0byAlZCIsCiAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgbVBvcnRIYW5kbGUsIHRlbXBIYW5kbGUpOwotICAgIEFMT0dWKCIlcyglcCkgbVBvcnRIYW5kbGUgPSAlZCIsIF9fZnVuY19fLCBzdHJlYW0uZ2V0KCksIG1Qb3J0SGFuZGxlKTsKKyAgICBBTE9HVigiJXMoKSBtUG9ydEhhbmRsZSA9ICVkIiwgX19mdW5jX18sIG1Qb3J0SGFuZGxlKTsKICAgICByZXR1cm4gcmVzdWx0OwogfQogCkBAIC0yOTksMjYgKzI4NCwyMCBAQAogICAgIG1GcmFtZXNUcmFuc2ZlcnJlZC5yb3VuZFVwNjQoZ2V0QnVmZmVyQ2FwYWNpdHkoKSk7CiAKICAgICAvLyBVc2UgdGhlIHBvcnQgaGFuZGxlIHRoYXQgd2FzIHByb3ZpZGVkIGJ5IG9wZW5NbWFwU3RyZWFtKCkuCi0gICAgQUxPR1YoIiVzKCVwKSBtUG9ydEhhbmRsZSA9ICVkIiwgX19mdW5jX18sIHN0cmVhbS5nZXQoKSwgbVBvcnRIYW5kbGUpOworICAgIEFMT0dWKCIlcygpIG1Qb3J0SGFuZGxlID0gJWQiLCBfX2Z1bmNfXywgbVBvcnRIYW5kbGUpOwogICAgIHJldHVybiBzdG9wQ2xpZW50KG1Qb3J0SGFuZGxlKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OnN0YXJ0Q2xpZW50KGNvbnN0IGFuZHJvaWQ6OkF1ZGlvQ2xpZW50JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fcG9ydF9oYW5kbGVfdCAqY2xpZW50SGFuZGxlKSB7CiAgICAgaWYgKG1NbWFwU3RyZWFtID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKLSAgICBBTE9HRCgiJXMoJXAodWlkPSVkLCBwaWQ9JWQpKSIsIF9fZnVuY19fLCAmY2xpZW50LCBjbGllbnQuY2xpZW50VWlkLCBjbGllbnQuY2xpZW50UGlkKTsKLSAgICBhdWRpb19wb3J0X2hhbmRsZV90IG9yaWdpbmFsSGFuZGxlID0gICpjbGllbnRIYW5kbGU7CiAgICAgc3RhdHVzX3Qgc3RhdHVzID0gbU1tYXBTdHJlYW0tPnN0YXJ0KGNsaWVudCwgY2xpZW50SGFuZGxlKTsKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKLSAgICBBTE9HRCgiJXMoKSAsIHBvcnRIYW5kbGUgJWQgPT4gJWQsIHJldHVybnMgJWQiLCBfX2Z1bmNfXywgb3JpZ2luYWxIYW5kbGUsICpjbGllbnRIYW5kbGUsIHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKKyAgICByZXR1cm4gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQoc3RhdHVzKTsKIH0KIAogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVA6OnN0b3BDbGllbnQoYXVkaW9fcG9ydF9oYW5kbGVfdCBjbGllbnRIYW5kbGUpIHsKLSAgICBBTE9HRCgiJXMocG9ydEhhbmRsZSA9ICVkKSwgY2FsbGVkIiwgX19mdW5jX18sIGNsaWVudEhhbmRsZSk7CiAgICAgaWYgKG1NbWFwU3RyZWFtID09IG51bGxwdHIpIHJldHVybiBBQVVESU9fRVJST1JfTlVMTDsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvQ29udmVydF9hbmRyb2lkVG9BQXVkaW9SZXN1bHQobU1tYXBTdHJlYW0tPnN0b3AoY2xpZW50SGFuZGxlKSk7Ci0gICAgQUxPR0QoIiVzKHBvcnRIYW5kbGUgPSAlZCksIHJldHVybnMgJWQiLCBfX2Z1bmNfXywgY2xpZW50SGFuZGxlLCByZXN1bHQpOwogICAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTM3MSw3ICszNTAsNyBAQAogICAgIC8vIFRPRE8gRG8gd2UgcmVhbGx5IG5lZWQgYSBkaWZmZXJlbnQgdm9sdW1lIGZvciBlYWNoIGNoYW5uZWw/CiAgICAgLy8gV2UgZ2V0IGNhbGxlZCB3aXRoIGFuIGFycmF5IGZpbGxlZCB3aXRoIGEgc2luZ2xlIHZhbHVlIQogICAgIGZsb2F0IHZvbHVtZSA9IHZhbHVlc1swXTsKLSAgICBBTE9HRCgiJXMoJXApIHZvbHVtZVswXSA9ICVmIiwgX19mdW5jX18sIHRoaXMsIHZvbHVtZSk7CisgICAgQUxPR0QoIiVzKCkgdm9sdW1lWzBdID0gJWYiLCBfX2Z1bmNfXywgdm9sdW1lKTsKICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhtTG9ja1N0cmVhbXMpOwogICAgIGZvcihjb25zdCBhdXRvJiBzdHJlYW0gOiBtUmVnaXN0ZXJlZFN0cmVhbXMpIHsKICAgICAgICAgc3RyZWFtLT5vblZvbHVtZUNoYW5nZWQodm9sdW1lKTsKQEAgLTM3OSw3ICszNTgsNyBAQAogfTsKIAogdm9pZCBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRNTUFQOjpvblJvdXRpbmdDaGFuZ2VkKGF1ZGlvX3BvcnRfaGFuZGxlX3QgZGV2aWNlSWQpIHsKLSAgICBBTE9HRCgiJXMoJXApIGNhbGxlZCB3aXRoIGRldiAlZCwgb2xkID0gJWQiLCBfX2Z1bmNfXywgdGhpcywgZGV2aWNlSWQsIGdldERldmljZUlkKCkpOworICAgIEFMT0dEKCIlcygpIGNhbGxlZCB3aXRoIGRldiAlZCwgb2xkID0gJWQiLCBfX2Z1bmNfXywgZGV2aWNlSWQsIGdldERldmljZUlkKCkpOwogICAgIGlmIChnZXREZXZpY2VJZCgpICE9IEFVRElPX1BPUlRfSEFORExFX05PTkUgICYmIGdldERldmljZUlkKCkgIT0gZGV2aWNlSWQpIHsKICAgICAgICAgZGlzY29ubmVjdFJlZ2lzdGVyZWRTdHJlYW1zKCk7CiAgICAgfQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcAppbmRleCBlYmJhMzJkLi5iZGE0YjkwIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmNwcApAQCAtNDMsMTQgKzQzLDkgQEAKIAogQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheTo6QUF1ZGlvU2VydmljZUVuZHBvaW50UGxheShBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpCiAgICAgICAgIDogbVN0cmVhbUludGVybmFsUGxheShhdWRpb1NlcnZpY2UsIHRydWUpIHsKLSAgICBBTE9HRCgiJXMoJXApIGNyZWF0ZWQiLCBfX2Z1bmNfXywgdGhpcyk7CiAgICAgbVN0cmVhbUludGVybmFsID0gJm1TdHJlYW1JbnRlcm5hbFBsYXk7CiB9CiAKLUFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXk6On5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KCkgewotICAgIEFMT0dEKCIlcyglcCkgZGVzdHJveWVkIiwgX19mdW5jX18sIHRoaXMpOwotfQotCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheTo6b3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIHsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkOjpvcGVuKHJlcXVlc3QpOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CkBAIC04OCw2ICs4MywxMCBAQAogICAgICAgICAgICAgICAgIGludDY0X3QgY2xpZW50RnJhbWVzUmVhZCA9IDA7CiAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd1VuZGVyZmxvdyA9IHRydWU7CiAKKyAgICAgICAgICAgICAgICBpZiAoY2xpZW50U3RyZWFtLT5pc1N1c3BlbmRlZCgpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBkZWFkIHN0cmVhbQorICAgICAgICAgICAgICAgIH0KKwogICAgICAgICAgICAgICAgIGFhdWRpb19zdHJlYW1fc3RhdGVfdCBzdGF0ZSA9IGNsaWVudFN0cmVhbS0+Z2V0U3RhdGUoKTsKICAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9TVE9QUElORykgewogICAgICAgICAgICAgICAgICAgICBhbGxvd1VuZGVyZmxvdyA9IGZhbHNlOyAvLyBqdXN0IHJlYWQgd2hhdCBpcyBhbHJlYWR5IGluIHRoZSBGSUZPCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmggYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5LmgKaW5kZXggYTBhMzgzYy4uOTgxZTQzMCAxMDA2NDQKLS0tIGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheS5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkuaApAQCAtMzksNyArMzksNiBAQAogY2xhc3MgQUF1ZGlvU2VydmljZUVuZHBvaW50UGxheSA6IHB1YmxpYyBBQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQgewogcHVibGljOgogICAgIGV4cGxpY2l0IEFBdWRpb1NlcnZpY2VFbmRwb2ludFBsYXkoYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAmYXVkaW9TZXJ2aWNlKTsKLSAgICB2aXJ0dWFsIH5BQXVkaW9TZXJ2aWNlRW5kcG9pbnRQbGF5KCk7CiAKICAgICBhYXVkaW9fcmVzdWx0X3Qgb3Blbihjb25zdCBhYXVkaW86OkFBdWRpb1N0cmVhbVJlcXVlc3QgJnJlcXVlc3QpIG92ZXJyaWRlOwogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZUVuZHBvaW50U2hhcmVkLmNwcAppbmRleCBmYzlmMTU1Li4wYTQxNWZkIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuY3BwCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5jcHAKQEAgLTc4LDYgKzc4LDcgQEAKICAgICBzZXRTYW1wbGVzUGVyRnJhbWUobVN0cmVhbUludGVybmFsLT5nZXRTYW1wbGVzUGVyRnJhbWUoKSk7CiAgICAgc2V0RGV2aWNlSWQobVN0cmVhbUludGVybmFsLT5nZXREZXZpY2VJZCgpKTsKICAgICBzZXRTZXNzaW9uSWQobVN0cmVhbUludGVybmFsLT5nZXRTZXNzaW9uSWQoKSk7CisgICAgc2V0Rm9ybWF0KEFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOyAvLyBmb3JjZSBmb3IgbWl4ZXIKICAgICBtRnJhbWVzUGVyQnVyc3QgPSBtU3RyZWFtSW50ZXJuYWwtPmdldEZyYW1lc1BlckJ1cnN0KCk7CiAKICAgICByZXR1cm4gcmVzdWx0OwpAQCAtMTgwLDggKzE4MSw4IEBACiAvLyBHZXQgdGltZXN0YW1wIHRoYXQgd2FzIHdyaXR0ZW4gYnkgdGhlIHJlYWwtdGltZSBzZXJ2aWNlIHRocmVhZCwgZWcuIG1peGVyLgogYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZDo6Z2V0RnJlZVJ1bm5pbmdQb3NpdGlvbihpbnQ2NF90ICpwb3NpdGlvbkZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgKnRpbWVOYW5vcykgewotICAgIGlmIChtQXRvbWljVGltZXN0YW1wLmlzVmFsaWQoKSkgewotICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1RpbWVzdGFtcC5yZWFkKCk7CisgICAgaWYgKG1BdG9taWNFbmRwb2ludFRpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKKyAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNFbmRwb2ludFRpbWVzdGFtcC5yZWFkKCk7CiAgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpOwogICAgICAgICAqdGltZU5hbm9zID0gdGltZXN0YW1wLmdldE5hbm9zZWNvbmRzKCk7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlRW5kcG9pbnRTaGFyZWQuaCBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCmluZGV4IGQ2NzE3MTAuLmJmYzE3NDQgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VFbmRwb2ludFNoYXJlZC5oCkBAIC01Miw4ICs1Miw3IEBACiAKICAgICBhYXVkaW9fcmVzdWx0X3QgZ2V0VGltZXN0YW1wKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLCBpbnQ2NF90ICp0aW1lTmFub3MpIG92ZXJyaWRlOwogCi0gICAgdmlydHVhbCB2b2lkICAgICAgICAgICAgKmNhbGxiYWNrTG9vcCgpID0gMDsKLQorICAgIHZpcnR1YWwgdm9pZCAgICpjYWxsYmFja0xvb3AoKSA9IDA7CiAKIHByb3RlY3RlZDoKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuY3BwCmluZGV4IDlhZjhhZjMuLjg4MGEzZDcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5jcHAKQEAgLTQzLDcgKzQzLDcgQEAKIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZShBQXVkaW9TZXJ2aWNlICZhdWRpb1NlcnZpY2UpCiAgICAgICAgIDogbVVwTWVzc2FnZVF1ZXVlKG51bGxwdHIpCiAgICAgICAgICwgbVRpbWVzdGFtcFRocmVhZCgiQUFUaW1lIikKLSAgICAgICAgLCBtQXRvbWljVGltZXN0YW1wKCkKKyAgICAgICAgLCBtQXRvbWljU3RyZWFtVGltZXN0YW1wKCkKICAgICAgICAgLCBtQXVkaW9TZXJ2aWNlKGF1ZGlvU2VydmljZSkgewogICAgIG1NbWFwQ2xpZW50LmNsaWVudFVpZCA9IC0xOwogICAgIG1NbWFwQ2xpZW50LmNsaWVudFBpZCA9IC0xOwpAQCAtNTEsNyArNTEsNiBAQAogfQogCiBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6fkFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlKCkgewotICAgIEFMT0dEKCJ+QUF1ZGlvU2VydmljZVN0cmVhbUJhc2UoKSBkZXN0cm95aW5nICVwIiwgdGhpcyk7CiAgICAgLy8gSWYgdGhlIHN0cmVhbSBpcyBkZWxldGVkIHdoZW4gT1BFTiBvciBpbiB1c2UgdGhlbiBhdWRpbyByZXNvdXJjZXMgd2lsbCBsZWFrLgogICAgIC8vIFRoaXMgd291bGQgaW5kaWNhdGUgYW4gaW50ZXJuYWwgZXJyb3IuIFNvIHdlIHdhbnQgdG8gZmluZCB0aGlzIEFTQVAuCiAgICAgTE9HX0FMV0FZU19GQVRBTF9JRighKGdldFN0YXRlKCkgPT0gQUFVRElPX1NUUkVBTV9TVEFURV9DTE9TRUQKQEAgLTgxLDggKzgwLDcgQEAKICAgICByZXR1cm4gcmVzdWx0LnN0cigpOwogfQogCi1hYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4oY29uc3QgYWF1ZGlvOjpBQXVkaW9TdHJlYW1SZXF1ZXN0ICZyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFhdWRpb19zaGFyaW5nX21vZGVfdCBzaGFyaW5nTW9kZSkgeworYWF1ZGlvX3Jlc3VsdF90IEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpvcGVuKGNvbnN0IGFhdWRpbzo6QUF1ZGlvU3RyZWFtUmVxdWVzdCAmcmVxdWVzdCkgewogICAgIEFBdWRpb0VuZHBvaW50TWFuYWdlciAmbUVuZHBvaW50TWFuYWdlciA9IEFBdWRpb0VuZHBvaW50TWFuYWdlcjo6Z2V0SW5zdGFuY2UoKTsKICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUFVRElPX09LOwogCkBAIC0xMDksMTAgKzEwNyw4IEBACiAgICAgICAgIC8vIHJlZmVyZW5jZWQgdW50aWwgdGhlIHNlcnZpY2UgcmV0dXJucyBhIGhhbmRsZSB0byB0aGUgY2xpZW50LgogICAgICAgICAvLyBTbyBvbmx5IG9uZSB0aHJlYWQgY2FuIG9wZW4gYSBzdHJlYW0uCiAgICAgICAgIG1TZXJ2aWNlRW5kcG9pbnQgPSBtRW5kcG9pbnRNYW5hZ2VyLm9wZW5FbmRwb2ludChtQXVkaW9TZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYXJpbmdNb2RlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QpOwogICAgICAgICBpZiAobVNlcnZpY2VFbmRwb2ludCA9PSBudWxscHRyKSB7Ci0gICAgICAgICAgICBBTE9HRSgiJXMoKSBvcGVuRW5kcG9pbnQoKSBmYWlsZWQiLCBfX2Z1bmNfXyk7CiAgICAgICAgICAgICByZXN1bHQgPSBBQVVESU9fRVJST1JfVU5BVkFJTEFCTEU7CiAgICAgICAgICAgICBnb3RvIGVycm9yOwogICAgICAgICB9CkBAIC0xODMsOSArMTc5LDEwIEBACiAgICAgfQogCiAgICAgc2V0Rmxvd2luZyhmYWxzZSk7CisgICAgc2V0U3VzcGVuZGVkKGZhbHNlKTsKIAogICAgIC8vIFN0YXJ0IHdpdGggZnJlc2ggcHJlc2VudGF0aW9uIHRpbWVzdGFtcHMuCi0gICAgbUF0b21pY1RpbWVzdGFtcC5jbGVhcigpOworICAgIG1BdG9taWNTdHJlYW1UaW1lc3RhbXAuY2xlYXIoKTsKIAogICAgIG1DbGllbnRIYW5kbGUgPSBBVURJT19QT1JUX0hBTkRMRV9OT05FOwogICAgIHJlc3VsdCA9IHN0YXJ0RGV2aWNlKCk7CkBAIC0yOTQsMTYgKzI5MSwyMCBAQAogfQogCiAvLyBpbXBsZW1lbnQgUnVubmFibGUsIHBlcmlvZGljYWxseSBzZW5kIHRpbWVzdGFtcHMgdG8gY2xpZW50CitfX2F0dHJpYnV0ZV9fKChub19zYW5pdGl6ZSgiaW50ZWdlciIpKSkKIHZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnJ1bigpIHsKICAgICBBTE9HRCgiJXMoKSAlcyBlbnRlcmluZyA+Pj4+Pj4+Pj4+Pj4+PiBUSU1FU1RBTVBTIiwgX19mdW5jX18sIGdldFR5cGVUZXh0KCkpOwogICAgIFRpbWVzdGFtcFNjaGVkdWxlciB0aW1lc3RhbXBTY2hlZHVsZXI7CiAgICAgdGltZXN0YW1wU2NoZWR1bGVyLnNldEJ1cnN0UGVyaW9kKG1GcmFtZXNQZXJCdXJzdCwgZ2V0U2FtcGxlUmF0ZSgpKTsKICAgICB0aW1lc3RhbXBTY2hlZHVsZXIuc3RhcnQoQXVkaW9DbG9jazo6Z2V0TmFub3NlY29uZHMoKSk7CiAgICAgaW50NjRfdCBuZXh0VGltZSA9IHRpbWVzdGFtcFNjaGVkdWxlci5uZXh0QWJzb2x1dGVUaW1lKCk7CisgICAgaW50MzJfdCBsb29wQ291bnQgPSAwOwogICAgIHdoaWxlKG1UaHJlYWRFbmFibGVkLmxvYWQoKSkgeworICAgICAgICBsb29wQ291bnQrKzsKICAgICAgICAgaWYgKEF1ZGlvQ2xvY2s6OmdldE5hbm9zZWNvbmRzKCkgPj0gbmV4dFRpbWUpIHsKICAgICAgICAgICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZW5kQ3VycmVudFRpbWVzdGFtcCgpOwogICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKKyAgICAgICAgICAgICAgICBBTE9HRSgiJXMoKSB0aW1lc3RhbXAgdGhyZWFkIGdvdCByZXN1bHQgPSAlZCIsIF9fZnVuY19fLCByZXN1bHQpOwogICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgfQogICAgICAgICAgICAgbmV4dFRpbWUgPSB0aW1lc3RhbXBTY2hlZHVsZXIubmV4dEFic29sdXRlVGltZSgpOwpAQCAtMzEzLDcgKzMxNCw4IEBACiAgICAgICAgICAgICBBdWRpb0Nsb2NrOjpzbGVlcFVudGlsTmFub1RpbWUobmV4dFRpbWUpOwogICAgICAgICB9CiAgICAgfQotICAgIEFMT0dEKCIlcygpICVzIGV4aXRpbmcgPDw8PDw8PDw8PDw8PDwgVElNRVNUQU1QUyIsIF9fZnVuY19fLCBnZXRUeXBlVGV4dCgpKTsKKyAgICBBTE9HRCgiJXMoKSAlcyBleGl0aW5nIGFmdGVyICVkIGxvb3BzIDw8PDw8PDw8PDw8PDw8IFRJTUVTVEFNUFMiLAorICAgICAgICAgIF9fZnVuY19fLCBnZXRUeXBlVGV4dCgpLCBsb29wQ291bnQpOwogfQogCiB2b2lkIEFBdWRpb1NlcnZpY2VTdHJlYW1CYXNlOjpkaXNjb25uZWN0KCkgewpAQCAtMzQxLDYgKzM0MywyMCBAQAogICAgIHJldHVybiB3cml0ZVVwTWVzc2FnZVF1ZXVlKCZjb21tYW5kKTsKIH0KIAorYm9vbCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6aXNVcE1lc3NhZ2VRdWV1ZUJ1c3koKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2sobVVwTWVzc2FnZVF1ZXVlTG9jayk7CisgICAgaWYgKG1VcE1lc3NhZ2VRdWV1ZSA9PSBudWxscHRyKSB7CisgICAgICAgIEFMT0dFKCIlcygpOiBtVXBNZXNzYWdlUXVldWUgbnVsbCEgLSBzdHJlYW0gbm90IG9wZW4iLCBfX2Z1bmNfXyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpbnQzMl90IGZyYW1lc0F2YWlsYWJsZSA9IG1VcE1lc3NhZ2VRdWV1ZS0+Z2V0Rmlmb0J1ZmZlcigpCisgICAgICAgIC0+Z2V0RnVsbEZyYW1lc0F2YWlsYWJsZSgpOworICAgIGludDMyX3QgY2FwYWNpdHkgPSBtVXBNZXNzYWdlUXVldWUtPmdldEZpZm9CdWZmZXIoKQorICAgICAgICAtPmdldEJ1ZmZlckNhcGFjaXR5SW5GcmFtZXMoKTsKKyAgICAvLyBJcyBpdCBoYWxmIGZ1bGwgb3IgbW9yZQorICAgIHJldHVybiBmcmFtZXNBdmFpbGFibGUgPj0gKGNhcGFjaXR5IC8gMik7Cit9CisKIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6d3JpdGVVcE1lc3NhZ2VRdWV1ZShBQXVkaW9TZXJ2aWNlTWVzc2FnZSAqY29tbWFuZCkgewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1VcE1lc3NhZ2VRdWV1ZUxvY2spOwogICAgIGlmIChtVXBNZXNzYWdlUXVldWUgPT0gbnVsbHB0cikgewpAQCAtMzQ5LDcgKzM2NSw5IEBACiAgICAgfQogICAgIGludDMyX3QgY291bnQgPSBtVXBNZXNzYWdlUXVldWUtPmdldEZpZm9CdWZmZXIoKS0+d3JpdGUoY29tbWFuZCwgMSk7CiAgICAgaWYgKGNvdW50ICE9IDEpIHsKLSAgICAgICAgQUxPR0UoIiVzKCk6IFF1ZXVlIGZ1bGwuIERpZCBjbGllbnQgZGllPyAlcyIsIF9fZnVuY19fLCBnZXRUeXBlVGV4dCgpKTsKKyAgICAgICAgQUxPR1coIiVzKCk6IFF1ZXVlIGZ1bGwuIERpZCBjbGllbnQgc3RvcD8gU3VzcGVuZGluZyBzdHJlYW0uIHdoYXQgPSAldSwgJXMiLAorICAgICAgICAgICAgICBfX2Z1bmNfXywgY29tbWFuZC0+d2hhdCwgZ2V0VHlwZVRleHQoKSk7CisgICAgICAgIHNldFN1c3BlbmRlZCh0cnVlKTsKICAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9XT1VMRF9CTE9DSzsKICAgICB9IGVsc2UgewogICAgICAgICByZXR1cm4gQUFVRElPX09LOwpAQCAtMzYyLDYgKzM4MCwxMyBAQAogCiBhYXVkaW9fcmVzdWx0X3QgQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6OnNlbmRDdXJyZW50VGltZXN0YW1wKCkgewogICAgIEFBdWRpb1NlcnZpY2VNZXNzYWdlIGNvbW1hbmQ7CisgICAgLy8gSXQgaXMgbm90IHdvcnRoIGZpbGxpbmcgdXAgdGhlIHF1ZXVlIHdpdGggdGltZXN0YW1wcy4KKyAgICAvLyBUaGF0IGNhbiBjYXVzZSB0aGUgc3RyZWFtIHRvIGdldCBzdXNwZW5kZWQuCisgICAgLy8gU28ganVzdCBkcm9wIHRoZSB0aW1lc3RhbXAgaWYgdGhlIHF1ZXVlIGlzIGdldHRpbmcgZnVsbC4KKyAgICBpZiAoaXNVcE1lc3NhZ2VRdWV1ZUJ1c3koKSkgeworICAgICAgICByZXR1cm4gQUFVRElPX09LOworICAgIH0KKwogICAgIC8vIFNlbmQgYSB0aW1lc3RhbXAgZm9yIHRoZSBjbG9jayBtb2RlbC4KICAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gZ2V0RnJlZVJ1bm5pbmdQb3NpdGlvbigmY29tbWFuZC50aW1lc3RhbXAucG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbW1hbmQudGltZXN0YW1wLnRpbWVzdGFtcCk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbUJhc2UuaAppbmRleCBhMTgxNWQwLi4wOTdiYzY0IDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZS5oCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1CYXNlLmgKQEAgLTIwNCw2ICsyMDQsMjAgQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBTZXQgZmFsc2Ugd2hlbiB0aGUgc3RyZWFtIHNob3VsZCBub3QgbG9uZ2VyIGJlIHByb2Nlc3NlZC4KKyAgICAgKiBUaGlzIG1heSBiZSBjYXVzZWQgYnkgYSBtZXNzYWdlIHF1ZXVlIG92ZXJmbG93LgorICAgICAqIFNldCB0cnVlIHdoZW4gc3RyZWFtIGlzIHN0YXJ0ZWQuCisgICAgICogQHBhcmFtIHN1c3BlbmRlZAorICAgICAqLworICAgIHZvaWQgc2V0U3VzcGVuZGVkKGJvb2wgc3VzcGVuZGVkKSB7CisgICAgICAgIG1TdXNwZW5kZWQgPSBzdXNwZW5kZWQ7CisgICAgfQorCisgICAgYm9vbCBpc1N1c3BlbmRlZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1TdXNwZW5kZWQ7CisgICAgfQorCisgICAgLyoqCiAgICAgICogQXRvbWljYWxseSBpbmNyZW1lbnQgdGhlIG51bWJlciBvZiBhY3RpdmUgcmVmZXJlbmNlcyB0byB0aGUgc3RyZWFtIGJ5IEFBdWRpb1NlcnZpY2UuCiAgICAgICoKICAgICAgKiBUaGlzIGlzIGNhbGxlZCB1bmRlciBhIGdsb2JhbCBsb2NrIGluIEFBdWRpb1N0cmVhbVRyYWNrZXIuCkBAIC0yODcsNyArMzAxLDcgQEAKICAgICAvLyBUT0RPIHJlbmFtZSBtQ2xpZW50SGFuZGxlIHRvIG1Qb3J0SGFuZGxlIHRvIGJlIG1vcmUgY29uc2lzdGVudCB3aXRoIEF1ZGlvRmxpbmdlci4KICAgICBhdWRpb19wb3J0X2hhbmRsZV90ICAgICBtQ2xpZW50SGFuZGxlID0gQVVESU9fUE9SVF9IQU5ETEVfTk9ORTsKIAotICAgIFNpbXBsZURvdWJsZUJ1ZmZlcjxUaW1lc3RhbXA+ICBtQXRvbWljVGltZXN0YW1wOworICAgIFNpbXBsZURvdWJsZUJ1ZmZlcjxUaW1lc3RhbXA+ICBtQXRvbWljU3RyZWFtVGltZXN0YW1wOwogCiAgICAgYW5kcm9pZDo6QUF1ZGlvU2VydmljZSAmbUF1ZGlvU2VydmljZTsKIApAQCAtMjk4LDEzICszMTIsMjQgQEAKICAgICBhbmRyb2lkOjp3cDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IG1TZXJ2aWNlRW5kcG9pbnRXZWFrOwogCiBwcml2YXRlOgorCisgICAgLyoqCisgICAgICogQHJldHVybiB0cnVlIGlmIHRoZSBxdWV1ZSBpcyBnZXR0aW5nIGZ1bGwuCisgICAgICovCisgICAgYm9vbCBpc1VwTWVzc2FnZVF1ZXVlQnVzeSgpOworCiAgICAgYWF1ZGlvX2hhbmRsZV90ICAgICAgICAgbUhhbmRsZSA9IC0xOwogICAgIGJvb2wgICAgICAgICAgICAgICAgICAgIG1GbG93aW5nID0gZmFsc2U7CiAKICAgICAvLyBUaGlzIGlzIG1vZGlmaWVkIHVuZGVyIGEgZ2xvYmFsIGxvY2sgaW4gQUF1ZGlvU3RyZWFtVHJhY2tlci4KICAgICBpbnQzMl90ICAgICAgICAgICAgICAgICBtQ2FsbGluZ0NvdW50ID0gMDsKIAorICAgIC8vIFRoaXMgaW5kaWNhdGVzIHRoYXQgYSBzdHJlYW0gdGhhdCBpcyBiZWluZyByZWZlcmVuY2VkIGJ5IGEgYmluZGVyIGNhbGwgbmVlZHMgdG8gY2xvc2VkLgogICAgIHN0ZDo6YXRvbWljPGJvb2w+ICAgICAgIG1DbG9zZU5lZWRlZHtmYWxzZX07CisKKyAgICAvLyBUaGlzIGluZGljYXRlIHRoYXQgYSBydW5uaW5nIHN0cmVhbSBzaG91bGQgbm90IGJlIHByb2Nlc3NlZCBiZWNhdXNlIG9mIGFuIGVycm9yLAorICAgIC8vIGZvciBleGFtcGxlIGEgZnVsbCBtZXNzYWdlIHF1ZXVlLiBOb3RlIHRoYXQgdGhpcyBhdG9taWMgaXMgdW5yZWxhdGVkIHRvIG1DbG9zZU5lZWRlZC4KKyAgICBzdGQ6OmF0b21pYzxib29sPiAgICAgICBtU3VzcGVuZGVke2ZhbHNlfTsKIH07CiAKIH0gLyogbmFtZXNwYWNlIGFhdWRpbyAqLwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbU1NQVAuY3BwCmluZGV4IGM4NDUzMDkuLjgzN2IwODAgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FBdWRpb1NlcnZpY2VTdHJlYW1NTUFQLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUC5jcHAKQEAgLTY0LDggKzY0LDEzIEBACiAKICAgICBzcDxBQXVkaW9TZXJ2aWNlU3RyZWFtTU1BUD4ga2VlcCh0aGlzKTsKIAotICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbihyZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSk7CisgICAgaWYgKHJlcXVlc3QuZ2V0Q29uc3RhbnRDb25maWd1cmF0aW9uKCkuZ2V0U2hhcmluZ01vZGUoKSAhPSBBQVVESU9fU0hBUklOR19NT0RFX0VYQ0xVU0lWRSkgeworICAgICAgICBBTE9HRSgiJXMoKSBzaGFyaW5nTW9kZSBtaXNtYXRjaCAlZCIsIF9fZnVuY19fLAorICAgICAgICAgICAgICByZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpLmdldFNoYXJpbmdNb2RlKCkpOworICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVEVSTkFMOworICAgIH0KKworICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBBQXVkaW9TZXJ2aWNlU3RyZWFtQmFzZTo6b3BlbihyZXF1ZXN0KTsKICAgICBpZiAocmVzdWx0ICE9IEFBVURJT19PSykgewogICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTE1Nyw3ICsxNjIsNyBAQAogICAgIGFhdWRpb19yZXN1bHRfdCByZXN1bHQgPSBzZXJ2aWNlRW5kcG9pbnRNTUFQLT5nZXRGcmVlUnVubmluZ1Bvc2l0aW9uKHBvc2l0aW9uRnJhbWVzLCB0aW1lTmFub3MpOwogICAgIGlmIChyZXN1bHQgPT0gQUFVRElPX09LKSB7CiAgICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAoKnBvc2l0aW9uRnJhbWVzLCAqdGltZU5hbm9zKTsKLSAgICAgICAgbUF0b21pY1RpbWVzdGFtcC53cml0ZSh0aW1lc3RhbXApOworICAgICAgICBtQXRvbWljU3RyZWFtVGltZXN0YW1wLndyaXRlKHRpbWVzdGFtcCk7CiAgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpOwogICAgICAgICAqdGltZU5hbm9zID0gdGltZXN0YW1wLmdldE5hbm9zZWNvbmRzKCk7CiAgICAgfSBlbHNlIGlmIChyZXN1bHQgIT0gQUFVRElPX0VSUk9SX1VOQVZBSUxBQkxFKSB7CkBAIC0xNzksOCArMTg0LDggQEAKICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFBdWRpb1NlcnZpY2VFbmRwb2ludE1NQVAgKj4oZW5kcG9pbnQuZ2V0KCkpOwogCiAgICAgLy8gVE9ETyBHZXQgcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBmcm9tIHRoZSBIQUwKLSAgICBpZiAobUF0b21pY1RpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKLSAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNUaW1lc3RhbXAucmVhZCgpOworICAgIGlmIChtQXRvbWljU3RyZWFtVGltZXN0YW1wLmlzVmFsaWQoKSkgeworICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1N0cmVhbVRpbWVzdGFtcC5yZWFkKCk7CiAgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpOwogICAgICAgICAqdGltZU5hbm9zID0gdGltZXN0YW1wLmdldE5hbm9zZWNvbmRzKCkgKyBzZXJ2aWNlRW5kcG9pbnRNTUFQLT5nZXRIYXJkd2FyZVRpbWVPZmZzZXROYW5vcygpOwogICAgICAgICByZXR1cm4gQUFVRElPX09LOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvb2JvZXNlcnZpY2UvQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZC5jcHAgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAppbmRleCAwNWM1NzM1Li4yY2E4NDdhIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcAorKysgYi9zZXJ2aWNlcy9vYm9lc2VydmljZS9BQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkLmNwcApAQCAtMTExLDcgKzExMSw3IEBACiAgICAgICAgICAgICAgIGNhcGFjaXR5SW5GcmFtZXMsIE1BWF9GUkFNRVNfUEVSX0JVRkZFUik7CiAgICAgICAgIHJldHVybiBBQVVESU9fRVJST1JfT1VUX09GX1JBTkdFOwogICAgIH0KLSAgICBBTE9HRCgiY2FsY3VsYXRlQnVmZmVyQ2FwYWNpdHkoKSByZXF1ZXN0ZWQgJWQgZnJhbWVzLCBhY3R1YWwgPSAlZCIsCisgICAgQUxPR1YoImNhbGN1bGF0ZUJ1ZmZlckNhcGFjaXR5KCkgcmVxdWVzdGVkICVkIGZyYW1lcywgYWN0dWFsID0gJWQiLAogICAgICAgICAgIHJlcXVlc3RlZENhcGFjaXR5RnJhbWVzLCBjYXBhY2l0eUluRnJhbWVzKTsKICAgICByZXR1cm4gY2FwYWNpdHlJbkZyYW1lczsKIH0KQEAgLTEyMCw5ICsxMjAsMTQgQEAKIAogICAgIHNwPEFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ+IGtlZXAodGhpcyk7CiAKLSAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4ocmVxdWVzdCwgQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpOworICAgIGlmIChyZXF1ZXN0LmdldENvbnN0YW50Q29uZmlndXJhdGlvbigpLmdldFNoYXJpbmdNb2RlKCkgIT0gQUFVRElPX1NIQVJJTkdfTU9ERV9TSEFSRUQpIHsKKyAgICAgICAgQUxPR0UoIiVzKCkgc2hhcmluZ01vZGUgbWlzbWF0Y2ggJWQiLCBfX2Z1bmNfXywKKyAgICAgICAgICAgICAgcmVxdWVzdC5nZXRDb25zdGFudENvbmZpZ3VyYXRpb24oKS5nZXRTaGFyaW5nTW9kZSgpKTsKKyAgICAgICAgcmV0dXJuIEFBVURJT19FUlJPUl9JTlRFUk5BTDsKKyAgICB9CisKKyAgICBhYXVkaW9fcmVzdWx0X3QgcmVzdWx0ID0gQUF1ZGlvU2VydmljZVN0cmVhbUJhc2U6Om9wZW4ocmVxdWVzdCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKLSAgICAgICAgQUxPR0UoIiVzKCkgcmV0dXJuZWQgJWQiLCBfX2Z1bmNfXywgcmVzdWx0KTsKICAgICAgICAgcmV0dXJuIHJlc3VsdDsKICAgICB9CiAKQEAgLTEzNiwxMCArMTQxLDEwIEBACiAKICAgICAvLyBJcyB0aGUgcmVxdWVzdCBjb21wYXRpYmxlIHdpdGggdGhlIHNoYXJlZCBlbmRwb2ludD8KICAgICBzZXRGb3JtYXQoY29uZmlndXJhdGlvbklucHV0LmdldEZvcm1hdCgpKTsKLSAgICBpZiAoZ2V0Rm9ybWF0KCkgPT0gQUFVRElPX0ZPUk1BVF9VTlNQRUNJRklFRCkgewotICAgICAgICBzZXRGb3JtYXQoQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpOwotICAgIH0gZWxzZSBpZiAoZ2V0Rm9ybWF0KCkgIT0gQUFVRElPX0ZPUk1BVF9QQ01fRkxPQVQpIHsKLSAgICAgICAgQUxPR0QoIiVzKCkgbUF1ZGlvRm9ybWF0ID0gJWQsIG5lZWQgRkxPQVQiLCBfX2Z1bmNfXywgZ2V0Rm9ybWF0KCkpOworICAgIGlmIChnZXRGb3JtYXQoKSA9PSBBVURJT19GT1JNQVRfREVGQVVMVCkgeworICAgICAgICBzZXRGb3JtYXQoQVVESU9fRk9STUFUX1BDTV9GTE9BVCk7CisgICAgfSBlbHNlIGlmIChnZXRGb3JtYXQoKSAhPSBBVURJT19GT1JNQVRfUENNX0ZMT0FUKSB7CisgICAgICAgIEFMT0dEKCIlcygpIGF1ZGlvX2Zvcm1hdF90IG1BdWRpb0Zvcm1hdCA9ICVkLCBuZWVkIEZMT0FUIiwgX19mdW5jX18sIGdldEZvcm1hdCgpKTsKICAgICAgICAgcmVzdWx0ID0gQUFVRElPX0VSUk9SX0lOVkFMSURfRk9STUFUOwogICAgICAgICBnb3RvIGVycm9yOwogICAgIH0KQEAgLTE4NSw5ICsxOTAsNiBAQAogICAgICAgICB9CiAgICAgfQogCi0gICAgQUxPR0QoIkFBdWRpb1NlcnZpY2VTdHJlYW1TaGFyZWQ6Om9wZW4oKSBhY3R1YWwgcmF0ZSA9ICVkLCBjaGFubmVscyA9ICVkLCBkZXZpY2VJZCA9ICVkIiwKLSAgICAgICAgICBnZXRTYW1wbGVSYXRlKCksIGdldFNhbXBsZXNQZXJGcmFtZSgpLCBlbmRwb2ludC0+Z2V0RGV2aWNlSWQoKSk7Ci0KICAgICByZXN1bHQgPSBlbmRwb2ludC0+cmVnaXN0ZXJTdHJlYW0oa2VlcCk7CiAgICAgaWYgKHJlc3VsdCAhPSBBQVVESU9fT0spIHsKICAgICAgICAgZ290byBlcnJvcjsKQEAgLTIyMiw3ICsyMjQsNyBAQAogewogICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBsb2NrKG1BdWRpb0RhdGFRdWV1ZUxvY2spOwogICAgIGlmIChtQXVkaW9EYXRhUXVldWUgPT0gbnVsbHB0cikgewotICAgICAgICBBTE9HRSgiJXMoKTogbVVwTWVzc2FnZVF1ZXVlIG51bGwhIC0gc3RyZWFtIG5vdCBvcGVuIiwgX19mdW5jX18pOworICAgICAgICBBTE9HVygiJXMoKTogbVVwTWVzc2FnZVF1ZXVlIG51bGwhIC0gc3RyZWFtIG5vdCBvcGVuIiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX05VTEw7CiAgICAgfQogICAgIC8vIEdhdGhlciBpbmZvcm1hdGlvbiBvbiB0aGUgZGF0YSBxdWV1ZS4KQEAgLTIzMywxNSArMjM1LDE1IEBACiB9CiAKIHZvaWQgQUF1ZGlvU2VydmljZVN0cmVhbVNoYXJlZDo6bWFya1RyYW5zZmVyVGltZShUaW1lc3RhbXAgJnRpbWVzdGFtcCkgewotICAgIG1BdG9taWNUaW1lc3RhbXAud3JpdGUodGltZXN0YW1wKTsKKyAgICBtQXRvbWljU3RyZWFtVGltZXN0YW1wLndyaXRlKHRpbWVzdGFtcCk7CiB9CiAKIC8vIEdldCB0aW1lc3RhbXAgdGhhdCB3YXMgd3JpdHRlbiBieSBtaXhlciBvciBkaXN0cmlidXRvci4KIGFhdWRpb19yZXN1bHRfdCBBQXVkaW9TZXJ2aWNlU3RyZWFtU2hhcmVkOjpnZXRGcmVlUnVubmluZ1Bvc2l0aW9uKGludDY0X3QgKnBvc2l0aW9uRnJhbWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAqdGltZU5hbm9zKSB7CiAgICAgLy8gVE9ETyBHZXQgcHJlc2VudGF0aW9uIHRpbWVzdGFtcCBmcm9tIHRoZSBIQUwKLSAgICBpZiAobUF0b21pY1RpbWVzdGFtcC5pc1ZhbGlkKCkpIHsKLSAgICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IG1BdG9taWNUaW1lc3RhbXAucmVhZCgpOworICAgIGlmIChtQXRvbWljU3RyZWFtVGltZXN0YW1wLmlzVmFsaWQoKSkgeworICAgICAgICBUaW1lc3RhbXAgdGltZXN0YW1wID0gbUF0b21pY1N0cmVhbVRpbWVzdGFtcC5yZWFkKCk7CiAgICAgICAgICpwb3NpdGlvbkZyYW1lcyA9IHRpbWVzdGFtcC5nZXRQb3NpdGlvbigpOwogICAgICAgICAqdGltZU5hbm9zID0gdGltZXN0YW1wLmdldE5hbm9zZWNvbmRzKCk7CiAgICAgICAgIHJldHVybiBBQVVESU9fT0s7CkBAIC0yNTcsNyArMjU5LDcgQEAKICAgICBpbnQ2NF90IHBvc2l0aW9uID0gMDsKICAgICBzcDxBQXVkaW9TZXJ2aWNlRW5kcG9pbnQ+IGVuZHBvaW50ID0gbVNlcnZpY2VFbmRwb2ludFdlYWsucHJvbW90ZSgpOwogICAgIGlmIChlbmRwb2ludCA9PSBudWxscHRyKSB7Ci0gICAgICAgIEFMT0dFKCIlcygpIGhhcyBubyBlbmRwb2ludCIsIF9fZnVuY19fKTsKKyAgICAgICAgQUxPR1coIiVzKCkgaGFzIG5vIGVuZHBvaW50IiwgX19mdW5jX18pOwogICAgICAgICByZXR1cm4gQUFVRElPX0VSUk9SX0lOVkFMSURfU1RBVEU7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLm1rIGIvc2VydmljZXMvb2JvZXNlcnZpY2UvQW5kcm9pZC5tawppbmRleCA5NDUyYTljLi45NmNjZWJjIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9vYm9lc2VydmljZS9BbmRyb2lkLm1rCisrKyBiL3NlcnZpY2VzL29ib2VzZXJ2aWNlL0FuZHJvaWQubWsKQEAgLTM5LDIwICszOSwxNyBAQAogICAgIFRpbWVzdGFtcFNjaGVkdWxlci5jcHAgXAogICAgIEFBdWRpb1RocmVhZC5jcHAKIAotTE9DQUxfTVVMVElMSUIgOj0gJChBVURJT1NFUlZFUl9NVUxUSUxJQikKLQogIyBMT0NBTF9DRkxBR1MgKz0gLWZ2aXNpYmlsaXR5PWhpZGRlbgogTE9DQUxfQ0ZMQUdTICs9IC1Xbm8tdW51c2VkLXBhcmFtZXRlcgogTE9DQUxfQ0ZMQUdTICs9IC1XYWxsIC1XZXJyb3IKIAogTE9DQUxfU0hBUkVEX0xJQlJBUklFUyA6PSAgXAotICAgIGxpYmFhdWRpbyBcCisgICAgbGliYWF1ZGlvX2ludGVybmFsIFwKICAgICBsaWJhdWRpb2ZsaW5nZXIgXAogICAgIGxpYmF1ZGlvY2xpZW50IFwKICAgICBsaWJiaW5kZXIgXAogICAgIGxpYmN1dGlscyBcCiAgICAgbGlibWVkaWF1dGlscyBcCi0gICAgbGlic2VydmljZXV0aWxpdHkgXAogICAgIGxpYnV0aWxzIFwKICAgICBsaWJsb2cKIApkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQuYnAgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5icApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYmJkNTkxCi0tLSAvZGV2L251bGwKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL0FuZHJvaWQuYnAKQEAgLTAsMCArMSw1MyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgVGhlIEFuZHJvaWQgT3BlbiBTb3VyY2UgUHJvamVjdAorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworY2NfbGlicmFyeV9zaGFyZWQgeworICAgIG5hbWU6ICJsaWJzb3VuZHRyaWdnZXJzZXJ2aWNlIiwKKworICAgIHNyY3M6IFsKKyAgICAgICAgIlNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAiLAorICAgICAgICAiU291bmRUcmlnZ2VySGFsSGlkbC5jcHAiLAorICAgIF0sCisKKyAgICBzaGFyZWRfbGliczogWworICAgICAgICAibGlibG9nIiwKKyAgICAgICAgImxpYnV0aWxzIiwKKyAgICAgICAgImxpYmJpbmRlciIsCisgICAgICAgICJsaWJjdXRpbHMiLAorICAgICAgICAibGliaGFyZHdhcmUiLAorICAgICAgICAibGlic291bmR0cmlnZ2VyIiwKKyAgICAgICAgImxpYmF1ZGlvY2xpZW50IiwKKyAgICAgICAgImxpYmF1ZGlvdXRpbHMiLAorICAgICAgICAibGlibWVkaWF1dGlscyIsCisKKyAgICAgICAgImxpYmhpZGxiYXNlIiwKKyAgICAgICAgImxpYmhpZGxtZW1vcnkiLAorICAgICAgICAibGliYmFzZSIsCisgICAgICAgICJsaWJhdWRpb2hhbCIsCisgICAgICAgICJsaWJhdWRpb2hhbF9kZWF0aGhhbmRsZXIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGFyZHdhcmUuc291bmR0cmlnZ2VyQDIuMSIsCisgICAgICAgICJhbmRyb2lkLmhhcmR3YXJlLnNvdW5kdHJpZ2dlckAyLjIiLAorICAgICAgICAiYW5kcm9pZC5oYXJkd2FyZS5hdWRpby5jb21tb25AMi4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5hbGxvY2F0b3JAMS4wIiwKKyAgICAgICAgImFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wIiwKKyAgICBdLAorCisgICAgaW5jbHVkZV9kaXJzOiBbImZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyIl0sCisKKyAgICBjZmxhZ3M6IFsKKyAgICAgICAgIi1XYWxsIiwKKyAgICAgICAgIi1XZXJyb3IiLAorICAgIF0sCit9CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvQW5kcm9pZC5tayBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDM2NjZlLi4wMDAwMDAwCi0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9BbmRyb2lkLm1rCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotIyBDb3B5cmlnaHQgMjAxNCBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0jCi0jIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0jIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1MT0NBTF9QQVRIOj0gJChjYWxsIG15LWRpcikKLQotaW5jbHVkZSAkKENMRUFSX1ZBUlMpCi0KLWlmZXEgKCQoU09VTkRfVFJJR0dFUl9VU0VfU1RVQl9NT0RVTEUpLCAxKQotICAgIGlmbmVxICgkKFVTRV9MRUdBQ1lfTE9DQUxfQVVESU9fSEFMKSwgdHJ1ZSkKLSAgICAgICAgJChlcnJvciBSZXF1aXJlcyBidWlsZGluZyB3aXRoIFVTRV9MRUdBQ1lfTE9DQUxfQVVESU9fSEFMPXRydWUpCi0gICAgZW5kaWYKLSAgICBMT0NBTF9DRkxBR1MgKz0gLURTT1VORF9UUklHR0VSX1VTRV9TVFVCX01PRFVMRQotZW5kaWYKLQotTE9DQUxfU1JDX0ZJTEVTOj0gICAgICAgICAgICAgICBcCi0gICAgU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcAotCi1MT0NBTF9TSEFSRURfTElCUkFSSUVTOj0gXAotICAgIGxpYmxvZyBcCi0gICAgbGlidXRpbHMgXAotICAgIGxpYmJpbmRlciBcCi0gICAgbGliY3V0aWxzIFwKLSAgICBsaWJoYXJkd2FyZSBcCi0gICAgbGlic291bmR0cmlnZ2VyIFwKLSAgICBsaWJhdWRpb2NsaWVudCBcCi0gICAgbGlic2VydmljZXV0aWxpdHkKLQotCi1pZmVxICgkKFVTRV9MRUdBQ1lfTE9DQUxfQVVESU9fSEFMKSx0cnVlKQotIyBsaWJoYXJkd2FyZSBjb25maWd1cmF0aW9uCi1MT0NBTF9TUkNfRklMRVMgKz0gICAgICAgICAgICAgICBcCi0gICAgU291bmRUcmlnZ2VySGFsTGVnYWN5LmNwcAotZWxzZQotIyBUcmVibGUgY29uZmlndXJhdGlvbgotTE9DQUxfU1JDX0ZJTEVTICs9ICAgICAgICAgICAgICAgXAotICAgIFNvdW5kVHJpZ2dlckhhbEhpZGwuY3BwCi0KLUxPQ0FMX1NIQVJFRF9MSUJSQVJJRVMgKz0gXAotICAgIGxpYmh3YmluZGVyIFwKLSAgICBsaWJoaWRsYmFzZSBcCi0gICAgbGliaGlkbG1lbW9yeSBcCi0gICAgbGliaGlkbHRyYW5zcG9ydCBcCi0gICAgbGliYmFzZSBcCi0gICAgbGliYXVkaW9oYWwgXAotICAgIGxpYmF1ZGlvaGFsX2RlYXRoaGFuZGxlciBcCi0gICAgYW5kcm9pZC5oYXJkd2FyZS5zb3VuZHRyaWdnZXJAMi4wIFwKLSAgICBhbmRyb2lkLmhhcmR3YXJlLnNvdW5kdHJpZ2dlckAyLjEgXAotICAgIGFuZHJvaWQuaGFyZHdhcmUuYXVkaW8uY29tbW9uQDIuMCBcCi0gICAgYW5kcm9pZC5oaWRsLmFsbG9jYXRvckAxLjAgXAotICAgIGFuZHJvaWQuaGlkbC5tZW1vcnlAMS4wCi1lbmRpZgotCi0KLUxPQ0FMX0NfSU5DTFVERVMgKz0gXAotICAgIGZyYW1ld29ya3MvYXYvc2VydmljZXMvYXVkaW9mbGluZ2VyCi0KLUxPQ0FMX01VTFRJTElCIDo9ICQoQVVESU9TRVJWRVJfTVVMVElMSUIpCi0KLUxPQ0FMX0NGTEFHUyArPSAtV2FsbCAtV2Vycm9yCi0KLUxPQ0FMX01PRFVMRTo9IGxpYnNvdW5kdHJpZ2dlcnNlcnZpY2UKLQotaW5jbHVkZSAkKEJVSUxEX1NIQVJFRF9MSUJSQVJZKQpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuY3BwIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuY3BwCmluZGV4IGFkZjI1MmUuLjY4ZDU0YzcgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmNwcAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5jcHAKQEAgLTE2OCwxOCArMTY4LDIzIEBACiAgICAgaW50IHJldDsKICAgICBTb3VuZE1vZGVsSGFuZGxlIGhhbEhhbmRsZTsKICAgICBzcDxWMl8xX0lTb3VuZFRyaWdnZXJIdz4gc291bmR0cmlnZ2VyXzJfMSA9IHRvU2VydmljZTJfMShzb3VuZHRyaWdnZXIpOworICAgIHNwPFYyXzJfSVNvdW5kVHJpZ2dlckh3PiBzb3VuZHRyaWdnZXJfMl8yID0gdG9TZXJ2aWNlMl8yKHNvdW5kdHJpZ2dlcik7CiAgICAgaWYgKHNvdW5kX21vZGVsLT50eXBlID09IFNPVU5EX01PREVMX1RZUEVfS0VZUEhSQVNFKSB7Ci0gICAgICAgIGlmICghc291bmR0cmlnZ2VyXzJfMSkgewotICAgICAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpQaHJhc2VTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7Ci0gICAgICAgICAgICBjb252ZXJ0UGhyYXNlU291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7Ci0gICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7Ci0gICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5sb2FkUGhyYXNlU291bmRNb2RlbCgKLSAgICAgICAgICAgICAgICAgICAgaGFsU291bmRNb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgdGhpcywgbW9kZWxJZCwgWyZdKGludDMyX3QgcmV0dmFsLCBhdXRvIHJlcykgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0dmFsOwotICAgICAgICAgICAgICAgICAgICAgICAgaGFsSGFuZGxlID0gcmVzOwotICAgICAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKHNvdW5kdHJpZ2dlcl8yXzIpIHsKKyAgICAgICAgICAgIFYyXzJfSVNvdW5kVHJpZ2dlckh3OjpQaHJhc2VTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7CisgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IGNvbnZlcnRQaHJhc2VTb3VuZE1vZGVsVG9IYWwoJmhhbFNvdW5kTW9kZWwsIHNvdW5kX21vZGVsKTsKKyAgICAgICAgICAgIGlmIChyZXN1bHQuZmlyc3QpIHsKKyAgICAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7CisgICAgICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlcl8yXzItPmxvYWRQaHJhc2VTb3VuZE1vZGVsXzJfMSgKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhbFNvdW5kTW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBtb2RlbElkLCBbJl0oaW50MzJfdCByZXR2YWwsIGF1dG8gcmVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbEhhbmRsZSA9IHJlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHNvdW5kdHJpZ2dlcl8yXzEpIHsKICAgICAgICAgICAgIFYyXzFfSVNvdW5kVHJpZ2dlckh3OjpQaHJhc2VTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7CiAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IGNvbnZlcnRQaHJhc2VTb3VuZE1vZGVsVG9IYWwoJmhhbFNvdW5kTW9kZWwsIHNvdW5kX21vZGVsKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQuZmlyc3QpIHsKQEAgLTE5MywxOCArMTk4LDMyIEBACiAgICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgICAgIHJldHVybiBOT19NRU1PUlk7CiAgICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgICBpZiAoIXNvdW5kdHJpZ2dlcl8yXzEpIHsKLSAgICAgICAgICAgIElTb3VuZFRyaWdnZXJIdzo6U291bmRNb2RlbCBoYWxTb3VuZE1vZGVsOwotICAgICAgICAgICAgY29udmVydFNvdW5kTW9kZWxUb0hhbCgmaGFsU291bmRNb2RlbCwgc291bmRfbW9kZWwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpQaHJhc2VTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7CisgICAgICAgICAgICBjb252ZXJ0UGhyYXNlU291bmRNb2RlbFRvSGFsKCZoYWxTb3VuZE1vZGVsLCBzb3VuZF9tb2RlbCk7CiAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7Ci0gICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5sb2FkU291bmRNb2RlbChoYWxTb3VuZE1vZGVsLAorICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlci0+bG9hZFBocmFzZVNvdW5kTW9kZWwoCisgICAgICAgICAgICAgICAgICAgIGhhbFNvdW5kTW9kZWwsCiAgICAgICAgICAgICAgICAgICAgIHRoaXMsIG1vZGVsSWQsIFsmXShpbnQzMl90IHJldHZhbCwgYXV0byByZXMpIHsKICAgICAgICAgICAgICAgICAgICAgICAgIHJldCA9IHJldHZhbDsKICAgICAgICAgICAgICAgICAgICAgICAgIGhhbEhhbmRsZSA9IHJlczsKICAgICAgICAgICAgICAgICAgICAgfSk7Ci0gICAgICAgIH0gZWxzZSB7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoc291bmR0cmlnZ2VyXzJfMikgeworICAgICAgICAgICAgVjJfMl9JU291bmRUcmlnZ2VySHc6OlNvdW5kTW9kZWwgaGFsU291bmRNb2RlbDsKKyAgICAgICAgICAgIGF1dG8gcmVzdWx0ID0gY29udmVydFNvdW5kTW9kZWxUb0hhbCgmaGFsU291bmRNb2RlbCwgc291bmRfbW9kZWwpOworICAgICAgICAgICAgaWYgKHJlc3VsdC5maXJzdCkgeworICAgICAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKKyAgICAgICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyXzJfMi0+bG9hZFNvdW5kTW9kZWxfMl8xKGhhbFNvdW5kTW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBtb2RlbElkLCBbJl0oaW50MzJfdCByZXR2YWwsIGF1dG8gcmVzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbEhhbmRsZSA9IHJlczsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKHNvdW5kdHJpZ2dlcl8yXzEpIHsKICAgICAgICAgICAgIFYyXzFfSVNvdW5kVHJpZ2dlckh3OjpTb3VuZE1vZGVsIGhhbFNvdW5kTW9kZWw7CiAgICAgICAgICAgICBhdXRvIHJlc3VsdCA9IGNvbnZlcnRTb3VuZE1vZGVsVG9IYWwoJmhhbFNvdW5kTW9kZWwsIHNvdW5kX21vZGVsKTsKICAgICAgICAgICAgIGlmIChyZXN1bHQuZmlyc3QpIHsKQEAgLTIxNyw2ICsyMzYsMTUgQEAKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgICAgcmV0dXJuIE5PX01FTU9SWTsKICAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIElTb3VuZFRyaWdnZXJIdzo6U291bmRNb2RlbCBoYWxTb3VuZE1vZGVsOworICAgICAgICAgICAgY29udmVydFNvdW5kTW9kZWxUb0hhbCgmaGFsU291bmRNb2RlbCwgc291bmRfbW9kZWwpOworICAgICAgICAgICAgQXV0b011dGV4IGxvY2sobUhhbExvY2spOworICAgICAgICAgICAgaGlkbFJldHVybiA9IHNvdW5kdHJpZ2dlci0+bG9hZFNvdW5kTW9kZWwoaGFsU291bmRNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgdGhpcywgbW9kZWxJZCwgWyZdKGludDMyX3QgcmV0dmFsLCBhdXRvIHJlcykgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gcmV0dmFsOworICAgICAgICAgICAgICAgICAgICAgICAgaGFsSGFuZGxlID0gcmVzOworICAgICAgICAgICAgICAgICAgICB9KTsKICAgICAgICAgfQogICAgIH0KIApAQCAtMjgyLDE2ICszMTAsMjAgQEAKICAgICBtb2RlbC0+bVJlY29nbml0aW9uQ29va2llID0gY29va2llOwogCiAgICAgc3A8VjJfMV9JU291bmRUcmlnZ2VySHc+IHNvdW5kdHJpZ2dlcl8yXzEgPSB0b1NlcnZpY2UyXzEoc291bmR0cmlnZ2VyKTsKKyAgICBzcDxWMl8yX0lTb3VuZFRyaWdnZXJIdz4gc291bmR0cmlnZ2VyXzJfMiA9IHRvU2VydmljZTJfMihzb3VuZHRyaWdnZXIpOwogICAgIFJldHVybjxpbnQzMl90PiBoaWRsUmV0dXJuKDApOwogCi0gICAgaWYgKCFzb3VuZHRyaWdnZXJfMl8xKSB7Ci0gICAgICAgIElTb3VuZFRyaWdnZXJIdzo6UmVjb2duaXRpb25Db25maWcgaGFsQ29uZmlnOwotICAgICAgICBjb252ZXJ0UmVjb2duaXRpb25Db25maWdUb0hhbCgmaGFsQ29uZmlnLCBjb25maWcpOwotICAgICAgICB7CisgICAgaWYgKHNvdW5kdHJpZ2dlcl8yXzIpIHsKKyAgICAgICAgVjJfMl9JU291bmRUcmlnZ2VySHc6OlJlY29nbml0aW9uQ29uZmlnIGhhbENvbmZpZzsKKyAgICAgICAgYXV0byByZXN1bHQgPSBjb252ZXJ0UmVjb2duaXRpb25Db25maWdUb0hhbCgmaGFsQ29uZmlnLCBjb25maWcpOworICAgICAgICBpZiAocmVzdWx0LmZpcnN0KSB7CiAgICAgICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7Ci0gICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyLT5zdGFydFJlY29nbml0aW9uKG1vZGVsLT5tSGFsSGFuZGxlLCBoYWxDb25maWcsIHRoaXMsIGhhbmRsZSk7CisgICAgICAgICAgICBoaWRsUmV0dXJuID0gc291bmR0cmlnZ2VyXzJfMi0+c3RhcnRSZWNvZ25pdGlvbl8yXzEoCisgICAgICAgICAgICAgICAgICAgIG1vZGVsLT5tSGFsSGFuZGxlLCBoYWxDb25maWcsIHRoaXMsIGhhbmRsZSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICB9Ci0gICAgfSBlbHNlIHsKKyAgICB9IGVsc2UgaWYgKHNvdW5kdHJpZ2dlcl8yXzEpIHsKICAgICAgICAgVjJfMV9JU291bmRUcmlnZ2VySHc6OlJlY29nbml0aW9uQ29uZmlnIGhhbENvbmZpZzsKICAgICAgICAgYXV0byByZXN1bHQgPSBjb252ZXJ0UmVjb2duaXRpb25Db25maWdUb0hhbCgmaGFsQ29uZmlnLCBjb25maWcpOwogICAgICAgICBpZiAocmVzdWx0LmZpcnN0KSB7CkBAIC0zMDEsNiArMzMzLDEzIEBACiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICByZXR1cm4gTk9fTUVNT1JZOwogICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgSVNvdW5kVHJpZ2dlckh3OjpSZWNvZ25pdGlvbkNvbmZpZyBoYWxDb25maWc7CisgICAgICAgIGNvbnZlcnRSZWNvZ25pdGlvbkNvbmZpZ1RvSGFsKCZoYWxDb25maWcsIGNvbmZpZyk7CisgICAgICAgIHsKKyAgICAgICAgICAgIEF1dG9NdXRleCBsb2NrKG1IYWxMb2NrKTsKKyAgICAgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXItPnN0YXJ0UmVjb2duaXRpb24obW9kZWwtPm1IYWxIYW5kbGUsIGhhbENvbmZpZywgdGhpcywgaGFuZGxlKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIGlmICghaGlkbFJldHVybi5pc09rKCkpIHsKQEAgLTM1Niw2ICszOTUsMzggQEAKICAgICByZXR1cm4gaGlkbFJldHVybjsKIH0KIAoraW50IFNvdW5kVHJpZ2dlckhhbEhpZGw6OmdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIHNwPElTb3VuZFRyaWdnZXJIdz4gc291bmR0cmlnZ2VyID0gZ2V0U2VydmljZSgpOworICAgIGlmIChzb3VuZHRyaWdnZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICBzcDxWMl8yX0lTb3VuZFRyaWdnZXJIdz4gc291bmR0cmlnZ2VyXzJfMiA9IHRvU2VydmljZTJfMihzb3VuZHRyaWdnZXIpOworICAgIGlmIChzb3VuZHRyaWdnZXJfMl8yID09IDApIHsKKyAgICAgICAgQUxPR0UoImdldE1vZGVsU3RhdGUgbm90IHN1cHBvcnRlZCIpOworICAgICAgICByZXR1cm4gLUVOT0RFVjsKKyAgICB9CisKKyAgICBzcDxTb3VuZE1vZGVsPiBtb2RlbCA9IGdldE1vZGVsKGhhbmRsZSk7CisgICAgaWYgKG1vZGVsID09IDApIHsKKyAgICAgICAgQUxPR0UoImdldE1vZGVsU3RhdGUgbW9kZWwgbm90IGZvdW5kIGZvciBoYW5kbGUgJXUiLCBoYW5kbGUpOworICAgICAgICByZXR1cm4gLUVJTlZBTDsKKyAgICB9CisKKyAgICBpbnQgcmV0ID0gTk9fRVJST1I7CisgICAgUmV0dXJuPGludDMyX3Q+IGhpZGxSZXR1cm4oMCk7CisgICAgeworICAgICAgICBBdXRvTXV0ZXggbG9jayhtSGFsTG9jayk7CisgICAgICAgIGhpZGxSZXR1cm4gPSBzb3VuZHRyaWdnZXJfMl8yLT5nZXRNb2RlbFN0YXRlKG1vZGVsLT5tSGFsSGFuZGxlKTsKKyAgICB9CisgICAgaWYgKCFoaWRsUmV0dXJuLmlzT2soKSkgeworICAgICAgICBBTE9HRSgiZ2V0TW9kZWxTdGF0ZSBlcnJvciAlcyIsIGhpZGxSZXR1cm4uZGVzY3JpcHRpb24oKS5jX3N0cigpKTsKKyAgICAgICAgcmV0ID0gRkFJTEVEX1RSQU5TQUNUSU9OOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCiBTb3VuZFRyaWdnZXJIYWxIaWRsOjpTb3VuZFRyaWdnZXJIYWxIaWRsKGNvbnN0IGNoYXIgKm1vZHVsZU5hbWUpCiAgICAgOiBtTW9kdWxlTmFtZShtb2R1bGVOYW1lKSwgbU5leHRVbmlxdWVJZCgxKQogewpAQCAtMzg4LDYgKzQ1OSwxMiBAQAogICAgIHJldHVybiBjYXN0UmVzdWx0XzJfMS5pc09rKCkgPyBzdGF0aWNfY2FzdDxzcDxWMl8xX0lTb3VuZFRyaWdnZXJIdz4+KGNhc3RSZXN1bHRfMl8xKSA6IG51bGxwdHI7CiB9CiAKK3NwPFYyXzJfSVNvdW5kVHJpZ2dlckh3PiBTb3VuZFRyaWdnZXJIYWxIaWRsOjp0b1NlcnZpY2UyXzIoY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckh3PiYgcykKK3sKKyAgICBhdXRvIGNhc3RSZXN1bHRfMl8yID0gVjJfMl9JU291bmRUcmlnZ2VySHc6OmNhc3RGcm9tKHMpOworICAgIHJldHVybiBjYXN0UmVzdWx0XzJfMi5pc09rKCkgPyBzdGF0aWNfY2FzdDxzcDxWMl8yX0lTb3VuZFRyaWdnZXJIdz4+KGNhc3RSZXN1bHRfMl8yKSA6IG51bGxwdHI7Cit9CisKIHNwPFNvdW5kVHJpZ2dlckhhbEhpZGw6OlNvdW5kTW9kZWw+IFNvdW5kVHJpZ2dlckhhbEhpZGw6OmdldE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKIHsKICAgICBBdXRvTXV0ZXggbG9jayhtTG9jayk7CmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5oIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEhpZGwuaAppbmRleCAwYjQ0YWUwLi5mYjllMzllIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSGlkbC5oCisrKyBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxIaWRsLmgKQEAgLTI3LDYgKzI3LDcgQEAKICNpbmNsdWRlICJTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UuaCIKICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3NvdW5kdHJpZ2dlci8yLjAvdHlwZXMuaD4KICNpbmNsdWRlIDxhbmRyb2lkL2hhcmR3YXJlL3NvdW5kdHJpZ2dlci8yLjEvSVNvdW5kVHJpZ2dlckh3Lmg+CisjaW5jbHVkZSA8YW5kcm9pZC9oYXJkd2FyZS9zb3VuZHRyaWdnZXIvMi4yL0lTb3VuZFRyaWdnZXJIdy5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyLzIuMC9JU291bmRUcmlnZ2VySHdDYWxsYmFjay5oPgogI2luY2x1ZGUgPGFuZHJvaWQvaGFyZHdhcmUvc291bmR0cmlnZ2VyLzIuMS9JU291bmRUcmlnZ2VySHdDYWxsYmFjay5oPgogCkBAIC00Niw2ICs0Nyw4IEBACiB1c2luZyBWMl8xX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrID0KICAgICAgICAgOjphbmRyb2lkOjpoYXJkd2FyZTo6c291bmR0cmlnZ2VyOjpWMl8xOjpJU291bmRUcmlnZ2VySHdDYWxsYmFjazsKIHVzaW5nIDo6YW5kcm9pZDo6aGlkbDo6bWVtb3J5OjpWMV8wOjpJTWVtb3J5OwordXNpbmcgVjJfMl9JU291bmRUcmlnZ2VySHcgPQorICAgICAgICA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpzb3VuZHRyaWdnZXI6OlYyXzI6OklTb3VuZFRyaWdnZXJIdzsKIAogY2xhc3MgU291bmRUcmlnZ2VySGFsSGlkbCA6IHB1YmxpYyBTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIHZpcnR1YWwgVjJfMV9JU291bmRUcmlnZ2VySHdDYWxsYmFjawpAQCAtOTIsNiArOTUsMTQgQEAKICAgICAgICAgICovCiAgICAgICAgIHZpcnR1YWwgaW50IHN0b3BBbGxSZWNvZ25pdGlvbnMoKTsKIAorICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBnaXZlbiBtb2RlbC4KKyAgICAgICAgICogUmV0dXJucyAwIG9yIGFuIGVycm9yIGNvZGUuIElmIHN1Y2Nlc3NmdWwgdGhlIHN0YXRlIHdpbGwgYmUgcmV0dXJuZWQgYXN5bmNocm9ub3VzbHkKKyAgICAgICAgICogdmlhIGEgcmVjb2duaXRpb24gZXZlbnQgaW4gdGhlIGNhbGxiYWNrIG1ldGhvZCB0aGF0IHdhcyByZWdpc3RlcmVkIGluIHRoZQorICAgICAgICAgKiBzdGFydFJlY29nbml0aW9uKCkgbWV0aG9kLgorICAgICAgICAgKiBPbmx5IHN1cHBvcnRlZCBmb3IgZGV2aWNlIGFwaSB2ZXJzaW9ucyBTT1VORF9UUklHR0VSX0RFVklDRV9BUElfVkVSU0lPTl8xXzIgb3IgYWJvdmUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIGludCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CisKICAgICAgICAgLy8gSVNvdW5kVHJpZ2dlckh3Q2FsbGJhY2sKICAgICAgICAgdmlydHVhbCA6OmFuZHJvaWQ6OmhhcmR3YXJlOjpSZXR1cm48dm9pZD4gcmVjb2duaXRpb25DYWxsYmFjaygKICAgICAgICAgICAgICAgICBjb25zdCBWMl8wX0lTb3VuZFRyaWdnZXJId0NhbGxiYWNrOjpSZWNvZ25pdGlvbkV2ZW50JiBldmVudCwgQ2FsbGJhY2tDb29raWUgY29va2llKTsKQEAgLTE4Miw2ICsxOTMsNyBAQAogICAgICAgICB1aW50MzJfdCBuZXh0VW5pcXVlSWQoKTsKICAgICAgICAgc3A8SVNvdW5kVHJpZ2dlckh3PiBnZXRTZXJ2aWNlKCk7CiAgICAgICAgIHNwPFYyXzFfSVNvdW5kVHJpZ2dlckh3PiB0b1NlcnZpY2UyXzEoY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckh3PiYgcyk7CisgICAgICAgIHNwPFYyXzJfSVNvdW5kVHJpZ2dlckh3PiB0b1NlcnZpY2UyXzIoY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckh3PiYgcyk7CiAgICAgICAgIHNwPFNvdW5kTW9kZWw+IGdldE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CiAgICAgICAgIHNwPFNvdW5kTW9kZWw+IHJlbW92ZU1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSk7CiAKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UuaCBiL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2UuaAppbmRleCBjMDgzMTk1Li4wMTgzZWNlIDEwMDY0NAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLmgKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbEludGVyZmFjZS5oCkBAIC03MSw2ICs3MSwxNCBAQAogICAgICAgICAgKi8KICAgICAgICAgdmlydHVhbCBpbnQgc3RvcEFsbFJlY29nbml0aW9ucygpID0gMDsKIAorICAgICAgICAvKiBHZXQgdGhlIGN1cnJlbnQgc3RhdGUgb2YgYSBnaXZlbiBtb2RlbC4KKyAgICAgICAgICogUmV0dXJucyAwIG9yIGFuIGVycm9yIGNvZGUuIElmIHN1Y2Nlc3NmdWwgdGhlIHN0YXRlIHdpbGwgYmUgcmV0dXJuZWQgYXN5bmNocm9ub3VzbHkKKyAgICAgICAgICogdmlhIGEgcmVjb2duaXRpb24gZXZlbnQgaW4gdGhlIGNhbGxiYWNrIG1ldGhvZCB0aGF0IHdhcyByZWdpc3RlcmVkIGluIHRoZQorICAgICAgICAgKiBzdGFydFJlY29nbml0aW9uKCkgbWV0aG9kLgorICAgICAgICAgKiBPbmx5IHN1cHBvcnRlZCBmb3IgZGV2aWNlIGFwaSB2ZXJzaW9ucyBTT1VORF9UUklHR0VSX0RFVklDRV9BUElfVkVSU0lPTl8xXzIgb3IgYWJvdmUuCisgICAgICAgICAqLworICAgICAgICB2aXJ0dWFsIGludCBnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkgPSAwOworCiBwcm90ZWN0ZWQ6CiAgICAgICAgIFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZSgpIHt9CiB9OwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbExlZ2FjeS5jcHAgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsTGVnYWN5LmNwcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI3ODgxOC4uMDAwMDAwMAotLS0gYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsTGVnYWN5LmNwcAorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChDKSAyMDE2IFRoZSBBbmRyb2lkIE9wZW4gU291cmNlIFByb2plY3QKLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgPHV0aWxzL0xvZy5oPgotI2luY2x1ZGUgIlNvdW5kVHJpZ2dlckhhbExlZ2FjeS5oIgotCi1uYW1lc3BhY2UgYW5kcm9pZCB7Ci0KLS8qIHN0YXRpYyAqLwotc3A8U291bmRUcmlnZ2VySGFsSW50ZXJmYWNlPiBTb3VuZFRyaWdnZXJIYWxJbnRlcmZhY2U6OmNvbm5lY3RNb2R1bGUoY29uc3QgY2hhciAqbW9kdWxlTmFtZSkKLXsKLSAgICByZXR1cm4gbmV3IFNvdW5kVHJpZ2dlckhhbExlZ2FjeShtb2R1bGVOYW1lKTsKLX0KLQotU291bmRUcmlnZ2VySGFsTGVnYWN5OjpTb3VuZFRyaWdnZXJIYWxMZWdhY3koY29uc3QgY2hhciAqbW9kdWxlTmFtZSkKLSAgICA6IG1Nb2R1bGVOYW1lKG1vZHVsZU5hbWUpLCBtSHdEZXZpY2UoTlVMTCkKLXsKLX0KLQotdm9pZCBTb3VuZFRyaWdnZXJIYWxMZWdhY3k6Om9uRmlyc3RSZWYoKQotewotICAgIGNvbnN0IGh3X21vZHVsZV90ICptb2Q7Ci0gICAgaW50IHJjOwotCi0gICAgaWYgKG1Nb2R1bGVOYW1lID09IE5VTEwpIHsKLSAgICAgICAgbU1vZHVsZU5hbWUgPSAicHJpbWFyeSI7Ci0gICAgfQotCi0gICAgcmMgPSBod19nZXRfbW9kdWxlX2J5X2NsYXNzKFNPVU5EX1RSSUdHRVJfSEFSRFdBUkVfTU9EVUxFX0lELCBtTW9kdWxlTmFtZSwgJm1vZCk7Ci0gICAgaWYgKHJjICE9IDApIHsKLSAgICAgICAgQUxPR0UoImNvdWxkbid0IGxvYWQgc291bmQgdHJpZ2dlciBtb2R1bGUgJXMuJXMgKCVzKSIsCi0gICAgICAgICAgICAgIFNPVU5EX1RSSUdHRVJfSEFSRFdBUkVfTU9EVUxFX0lELCBtTW9kdWxlTmFtZSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgcmMgPSBzb3VuZF90cmlnZ2VyX2h3X2RldmljZV9vcGVuKG1vZCwgJm1Id0RldmljZSk7Ci0gICAgaWYgKHJjICE9IDApIHsKLSAgICAgICAgQUxPR0UoImNvdWxkbid0IG9wZW4gc291bmQgdHJpZ2dlciBodyBkZXZpY2UgaW4gJXMuJXMgKCVzKSIsCi0gICAgICAgICAgICAgIFNPVU5EX1RSSUdHRVJfSEFSRFdBUkVfTU9EVUxFX0lELCBtTW9kdWxlTmFtZSwgc3RyZXJyb3IoLXJjKSk7Ci0gICAgICAgIG1Id0RldmljZSA9IE5VTEw7Ci0gICAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgaWYgKG1Id0RldmljZS0+Y29tbW9uLnZlcnNpb24gPCBTT1VORF9UUklHR0VSX0RFVklDRV9BUElfVkVSU0lPTl8xXzAgfHwKLSAgICAgICAgICAgIG1Id0RldmljZS0+Y29tbW9uLnZlcnNpb24gPiBTT1VORF9UUklHR0VSX0RFVklDRV9BUElfVkVSU0lPTl9DVVJSRU5UKSB7Ci0gICAgICAgIEFMT0dFKCJ3cm9uZyBzb3VuZCB0cmlnZ2VyIGh3IGRldmljZSB2ZXJzaW9uICUwNHgiLCBtSHdEZXZpY2UtPmNvbW1vbi52ZXJzaW9uKTsKLSAgICAgICAgcmV0dXJuOwotICAgIH0KLX0KLQotU291bmRUcmlnZ2VySGFsTGVnYWN5Ojp+U291bmRUcmlnZ2VySGFsTGVnYWN5KCkKLXsKLSAgICBpZiAobUh3RGV2aWNlICE9IE5VTEwpIHsKLSAgICAgICAgc291bmRfdHJpZ2dlcl9od19kZXZpY2VfY2xvc2UobUh3RGV2aWNlKTsKLSAgICB9Ci19Ci0KLWludCBTb3VuZFRyaWdnZXJIYWxMZWdhY3k6OmdldFByb3BlcnRpZXMoc3RydWN0IHNvdW5kX3RyaWdnZXJfcHJvcGVydGllcyAqcHJvcGVydGllcykKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSHdEZXZpY2UtPmdldF9wcm9wZXJ0aWVzKG1Id0RldmljZSwgcHJvcGVydGllcyk7Ci19Ci0KLWludCBTb3VuZFRyaWdnZXJIYWxMZWdhY3k6OmxvYWRTb3VuZE1vZGVsKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3NvdW5kX21vZGVsICpzb3VuZF9tb2RlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2NhbGxiYWNrX3QgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9oYW5kbGVfdCAqaGFuZGxlKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1Id0RldmljZS0+bG9hZF9zb3VuZF9tb2RlbChtSHdEZXZpY2UsIHNvdW5kX21vZGVsLCBjYWxsYmFjaywgY29va2llLCBoYW5kbGUpOwotfQotCi1pbnQgU291bmRUcmlnZ2VySGFsTGVnYWN5Ojp1bmxvYWRTb3VuZE1vZGVsKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKLXsKLSAgICBpZiAobUh3RGV2aWNlID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC1FTk9ERVY7Ci0gICAgfQotICAgIHJldHVybiBtSHdEZXZpY2UtPnVubG9hZF9zb3VuZF9tb2RlbChtSHdEZXZpY2UsIGhhbmRsZSk7Ci19Ci0KLWludCBTb3VuZFRyaWdnZXJIYWxMZWdhY3k6OnN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZyAqY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29nbml0aW9uX2NhbGxiYWNrX3QgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llKQotewotICAgIGlmIChtSHdEZXZpY2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLUVOT0RFVjsKLSAgICB9Ci0gICAgcmV0dXJuIG1Id0RldmljZS0+c3RhcnRfcmVjb2duaXRpb24obUh3RGV2aWNlLCBoYW5kbGUsIGNvbmZpZywgY2FsbGJhY2ssIGNvb2tpZSk7Ci19Ci0KLWludCBTb3VuZFRyaWdnZXJIYWxMZWdhY3k6OnN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICByZXR1cm4gbUh3RGV2aWNlLT5zdG9wX3JlY29nbml0aW9uKG1Id0RldmljZSwgaGFuZGxlKTsKLX0KLQotaW50IFNvdW5kVHJpZ2dlckhhbExlZ2FjeTo6c3RvcEFsbFJlY29nbml0aW9ucygpCi17Ci0gICAgaWYgKG1Id0RldmljZSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtRU5PREVWOwotICAgIH0KLSAgICBpZiAobUh3RGV2aWNlLT5jb21tb24udmVyc2lvbiA+PSBTT1VORF9UUklHR0VSX0RFVklDRV9BUElfVkVSU0lPTl8xXzEgJiYKLSAgICAgbUh3RGV2aWNlLT5zdG9wX2FsbF9yZWNvZ25pdGlvbnMpIHsKLSAgICAgICAgcmV0dXJuIG1Id0RldmljZS0+c3RvcF9hbGxfcmVjb2duaXRpb25zKG1Id0RldmljZSk7Ci0gICAgfQotICAgIHJldHVybiAtRU5PU1lTOwotfQotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCmRpZmYgLS1naXQgYS9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsTGVnYWN5LmggYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySGFsTGVnYWN5LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyNDg4ZGUuLjAwMDAwMDAKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckhhbExlZ2FjeS5oCisrKyAvZGV2L251bGwKQEAgLTEsODUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoQykgMjAxNiBUaGUgQW5kcm9pZCBPcGVuIFNvdXJjZSBQcm9qZWN0Ci0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQU5EUk9JRF9IQVJEV0FSRV9TT1VORFRSSUdHRVJfSEFMX0xFR0FDWV9ICi0jZGVmaW5lIEFORFJPSURfSEFSRFdBUkVfU09VTkRUUklHR0VSX0hBTF9MRUdBQ1lfSAotCi0jaW5jbHVkZSAiU291bmRUcmlnZ2VySGFsSW50ZXJmYWNlLmgiCi0KLW5hbWVzcGFjZSBhbmRyb2lkIHsKLQotY2xhc3MgU291bmRUcmlnZ2VySGFsTGVnYWN5IDogcHVibGljIFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZQotCi17Ci1wdWJsaWM6Ci0gICAgICAgIHZpcnR1YWwgICAgICAgICAgICAgflNvdW5kVHJpZ2dlckhhbExlZ2FjeSgpOwotCi0gICAgICAgIHZpcnR1YWwgaW50IGdldFByb3BlcnRpZXMoc3RydWN0IHNvdW5kX3RyaWdnZXJfcHJvcGVydGllcyAqcHJvcGVydGllcyk7Ci0KLSAgICAgICAgLyoKLSAgICAgICAgICogTG9hZCBhIHNvdW5kIG1vZGVsLiBPbmNlIGxvYWRlZCwgcmVjb2duaXRpb24gb2YgdGhpcyBtb2RlbCBjYW4gYmUgc3RhcnRlZCBhbmQgc3RvcHBlZC4KLSAgICAgICAgICogT25seSBvbmUgYWN0aXZlIHJlY29nbml0aW9uIHBlciBtb2RlbCBhdCBhIHRpbWUuIFRoZSBTb3VuZFRyaWdnZXIgc2VydmljZSB3aWxsIGhhbmRsZQotICAgICAgICAgKiBjb25jdXJyZW50IHJlY29nbml0aW9uIHJlcXVlc3RzIGJ5IGRpZmZlcmVudCB1c2Vycy9hcHBsaWNhdGlvbnMgb24gdGhlIHNhbWUgbW9kZWwuCi0gICAgICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIGEgdW5pcXVlIGhhbmRsZSB1c2VkIGJ5IG90aGVyIGZ1bmN0aW9ucyAodW5sb2FkX3NvdW5kX21vZGVsKCksCi0gICAgICAgICAqIHN0YXJ0X3JlY29nbml0aW9uKCksIGV0Yy4uLgotICAgICAgICAgKi8KLSAgICAgICAgdmlydHVhbCBpbnQgbG9hZFNvdW5kTW9kZWwoc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwgKnNvdW5kX21vZGVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZF9tb2RlbF9jYWxsYmFja190IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb29raWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90ICpoYW5kbGUpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIFVubG9hZCBhIHNvdW5kIG1vZGVsLiBBIHNvdW5kIG1vZGVsIGNhbiBiZSB1bmxvYWRlZCB0byBtYWtlIHJvb20gZm9yIGEgbmV3IG9uZSB0byBvdmVyY29tZQotICAgICAgICAgKiBpbXBsZW1lbnRhdGlvbiBsaW1pdGF0aW9ucy4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgaW50IHVubG9hZFNvdW5kTW9kZWwoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKLQotICAgICAgICAvKiBTdGFydCByZWNvZ25pdGlvbiBvbiBhIGdpdmVuIG1vZGVsLiBPbmx5IG9uZSByZWNvZ25pdGlvbiBhY3RpdmUgYXQgYSB0aW1lIHBlciBtb2RlbC4KLSAgICAgICAgICogT25jZSByZWNvZ25pdGlvbiBzdWNjZWVkcyBvZiBmYWlscywgdGhlIGNhbGxiYWNrIGlzIGNhbGxlZC4KLSAgICAgICAgICogVE9ETzogZ3JvdXAgcmVjb2duaXRpb24gY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzIGludG8gb25lIHN0cnVjdCBhbmQgYWRkIGtleSBwaHJhc2Ugb3B0aW9ucy4KLSAgICAgICAgICovCi0gICAgICAgIHZpcnR1YWwgaW50IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fY29uZmlnICpjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWNvZ25pdGlvbl9jYWxsYmFja190IGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29va2llKTsKLQotICAgICAgICAvKiBTdG9wIHJlY29nbml0aW9uIG9uIGEgZ2l2ZW4gbW9kZWwuCi0gICAgICAgICAqIFRoZSBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBoYXZlIHRvIGNhbGwgdGhlIGNhbGxiYWNrIHdoZW4gc3RvcHBlZCB2aWEgdGhpcyBtZXRob2QuCi0gICAgICAgICAqLwotICAgICAgICB2aXJ0dWFsIGludCBzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKLQotICAgICAgICAvKiBTdG9wIHJlY29nbml0aW9uIG9uIGFsbCBtb2RlbHMuCi0gICAgICAgICAqIE9ubHkgc3VwcG9ydGVkIGZvciBkZXZpY2UgYXBpIHZlcnNpb25zIFNPVU5EX1RSSUdHRVJfREVWSUNFX0FQSV9WRVJTSU9OXzFfMSBvciBhYm92ZS4KLSAgICAgICAgICogSWYgbm8gaW1wbGVtZW50YXRpb24gaXMgcHJvdmlkZWQsIHN0b3BfcmVjb2duaXRpb24gd2lsbCBiZSBjYWxsZWQgZm9yIGVhY2ggcnVubmluZyBtb2RlbC4KLSAgICAgICAgICovCi0gICAgICAgIGludCBzdG9wQWxsUmVjb2duaXRpb25zKCk7Ci0KLSAgICAgICAgLy8gUmVmQmFzZQotICAgICAgICB2aXJ0dWFsICAgICB2b2lkICAgICAgICBvbkZpcnN0UmVmKCk7Ci0KLXByaXZhdGU6Ci0KLSAgICAgICAgZnJpZW5kIGNsYXNzIFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZTsKLQotICAgICAgICBleHBsaWNpdCBTb3VuZFRyaWdnZXJIYWxMZWdhY3koY29uc3QgY2hhciAqbW9kdWxlTmFtZSA9IE5VTEwpOwotCi0gICAgICAgIGNvbnN0IGNoYXIgKm1Nb2R1bGVOYW1lOwotICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9od19kZXZpY2UqICAgICAgICBtSHdEZXZpY2U7Ci19OwotCi19IC8vIG5hbWVzcGFjZSBhbmRyb2lkCi0KLSNlbmRpZiAvLyBBTkRST0lEX0hBUkRXQVJFX1NPVU5EVFJJR0dFUl9IQUxfTEVHQUNZX0gKZGlmZiAtLWdpdCBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKaW5kZXggYTdkNmU4My4uMzc3ZDMwYiAxMDA2NDQKLS0tIGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKKysrIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKQEAgLTIyLDI1ICsyMiwyMiBAQAogI2luY2x1ZGUgPHN5cy90eXBlcy5oPgogI2luY2x1ZGUgPHB0aHJlYWQuaD4KIAorI2luY2x1ZGUgPGF1ZGlvX3V0aWxzL2Nsb2NrLmg+CiAjaW5jbHVkZSA8c3lzdGVtL3NvdW5kX3RyaWdnZXIuaD4KICNpbmNsdWRlIDxjdXRpbHMvYXRvbWljLmg+CiAjaW5jbHVkZSA8Y3V0aWxzL3Byb3BlcnRpZXMuaD4KICNpbmNsdWRlIDxoYXJkd2FyZS9oYXJkd2FyZS5oPgogI2luY2x1ZGUgPG1lZGlhL0F1ZGlvU3lzdGVtLmg+CisjaW5jbHVkZSA8bWVkaWF1dGlscy9TZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSA8dXRpbHMvRXJyb3JzLmg+CiAjaW5jbHVkZSA8dXRpbHMvTG9nLmg+CiAjaW5jbHVkZSA8YmluZGVyL0lTZXJ2aWNlTWFuYWdlci5oPgogI2luY2x1ZGUgPGJpbmRlci9NZW1vcnlCYXNlLmg+CiAjaW5jbHVkZSA8YmluZGVyL01lbW9yeUhlYXBCYXNlLmg+CiAjaW5jbHVkZSA8c3lzdGVtL3NvdW5kX3RyaWdnZXIuaD4KLSNpbmNsdWRlIDxTZXJ2aWNlVXRpbGl0aWVzLmg+CiAjaW5jbHVkZSAiU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgiCiAKLSNpZmRlZiBTT1VORF9UUklHR0VSX1VTRV9TVFVCX01PRFVMRQotI2RlZmluZSBIV19NT0RVTEVfUFJFRklYICJzdHViIgotI2Vsc2UKICNkZWZpbmUgSFdfTU9EVUxFX1BSRUZJWCAicHJpbWFyeSIKLSNlbmRpZgogbmFtZXNwYWNlIGFuZHJvaWQgewogCiBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OlNvdW5kVHJpZ2dlckh3U2VydmljZSgpCkBAIC04NSwxMSArODIsMTMgQEAKICAgICB9CiB9CiAKLXN0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6bGlzdE1vZHVsZXMoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMsCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Omxpc3RNb2R1bGVzKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpCiB7CiAgICAgQUxPR1YoImxpc3RNb2R1bGVzIik7Ci0gICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgcmV0dXJuIFBFUk1JU1NJT05fREVOSUVEOwogICAgIH0KQEAgLTEwNiwxMiArMTA1LDE0IEBACiAgICAgcmV0dXJuIE5PX0VSUk9SOwogfQogCi1zdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OmF0dGFjaChjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCitzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OmF0dGFjaChjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyPiYgbW9kdWxlSW50ZXJmYWNlKQogewogICAgIEFMT0dWKCJhdHRhY2ggbW9kdWxlICVkIiwgaGFuZGxlKTsKLSAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQob3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQpAQCAtMTI3LDcgKzEyOCw3IEBACiAgICAgfQogICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbU1vZHVsZXMudmFsdWVBdChpbmRleCk7CiAKLSAgICBzcDxNb2R1bGVDbGllbnQ+IG1vZHVsZUNsaWVudCA9IG1vZHVsZS0+YWRkQ2xpZW50KGNsaWVudCk7CisgICAgc3A8TW9kdWxlQ2xpZW50PiBtb2R1bGVDbGllbnQgPSBtb2R1bGUtPmFkZENsaWVudChjbGllbnQsIG9wUGFja2FnZU5hbWUpOwogICAgIGlmIChtb2R1bGVDbGllbnQgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9CkBAIC0xNTAsMjAgKzE1MSwxMiBAQAogfQogCiAKLXN0YXRpYyBjb25zdCBpbnQga0R1bXBMb2NrUmV0cmllcyA9IDUwOwotc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tTbGVlcCA9IDYwMDAwOworc3RhdGljIGNvbnN0IGludCBrRHVtcExvY2tUaW1lb3V0TnMgPSAxICogTkFOT1NfUEVSX1NFQ09ORDsKIAotc3RhdGljIGJvb2wgdHJ5TG9jayhNdXRleCYgbXV0ZXgpCitzdGF0aWMgYm9vbCBkdW1wVHJ5TG9jayhNdXRleCYgbXV0ZXgpCiB7Ci0gICAgYm9vbCBsb2NrZWQgPSBmYWxzZTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtEdW1wTG9ja1JldHJpZXM7ICsraSkgewotICAgICAgICBpZiAobXV0ZXgudHJ5TG9jaygpID09IE5PX0VSUk9SKSB7Ci0gICAgICAgICAgICBsb2NrZWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgdXNsZWVwKGtEdW1wTG9ja1NsZWVwKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxvY2tlZDsKKyAgICBzdGF0dXNfdCBlcnIgPSBtdXRleC50aW1lZExvY2soa0R1bXBMb2NrVGltZW91dE5zKTsKKyAgICByZXR1cm4gZXJyID09IE5PX0VSUk9SOwogfQogCiBzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6OmR1bXAoaW50IGZkLCBjb25zdCBWZWN0b3I8U3RyaW5nMTY+JiBhcmdzIF9fdW51c2VkKSB7CkBAIC0xNzIsNyArMTY1LDcgQEAKICAgICAgICAgcmVzdWx0LmFwcGVuZEZvcm1hdCgiUGVybWlzc2lvbiBEZW5pYWw6IGNhbid0IGR1bXAgU291bmRUcmlnZ2VySHdTZXJ2aWNlIik7CiAgICAgICAgIHdyaXRlKGZkLCByZXN1bHQuc3RyaW5nKCksIHJlc3VsdC5zaXplKCkpOwogICAgIH0gZWxzZSB7Ci0gICAgICAgIGJvb2wgbG9ja2VkID0gdHJ5TG9jayhtU2VydmljZUxvY2spOworICAgICAgICBib29sIGxvY2tlZCA9IGR1bXBUcnlMb2NrKG1TZXJ2aWNlTG9jayk7CiAgICAgICAgIC8vIGZhaWxlZCB0byBsb2NrIC0gU291bmRUcmlnZ2VySHdTZXJ2aWNlIGlzIHByb2JhYmx5IGRlYWRsb2NrZWQKICAgICAgICAgaWYgKCFsb2NrZWQpIHsKICAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoIlNvdW5kVHJpZ2dlckh3U2VydmljZSBtYXkgYmUgZGVhZGxvY2tlZFxuIik7CkBAIC00OTAsNyArNDgzLDggQEAKIH0KIAogc3A8U291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGVDbGllbnQ+Ci1Tb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6YWRkQ2xpZW50KGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQpCitTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZTo6YWRkQ2xpZW50KGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKQogewogICAgIEF1dG9NdXRleCBsb2NrKG1Mb2NrKTsKICAgICBzcDxNb2R1bGVDbGllbnQ+IG1vZHVsZUNsaWVudDsKQEAgLTUwMSw3ICs0OTUsNyBAQAogICAgICAgICAgICAgcmV0dXJuIG1vZHVsZUNsaWVudDsKICAgICAgICAgfQogICAgIH0KLSAgICBtb2R1bGVDbGllbnQgPSBuZXcgTW9kdWxlQ2xpZW50KHRoaXMsIGNsaWVudCk7CisgICAgbW9kdWxlQ2xpZW50ID0gbmV3IE1vZHVsZUNsaWVudCh0aGlzLCBjbGllbnQsIG9wUGFja2FnZU5hbWUpOwogCiAgICAgQUxPR1YoImFkZENsaWVudCgpIGNsaWVudCAlcCIsIG1vZHVsZUNsaWVudC5nZXQoKSk7CiAgICAgbU1vZHVsZUNsaWVudHMuYWRkKG1vZHVsZUNsaWVudCk7CkBAIC01NjIsMTAgKzU1Niw3IEBACiAgICAgaWYgKG1IYWxJbnRlcmZhY2UgPT0gMCkgewogICAgICAgICByZXR1cm4gTk9fSU5JVDsKICAgICB9Ci0gICAgaWYgKG1vZGVsTWVtb3J5ID09IDAgfHwgbW9kZWxNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJsb2FkU291bmRNb2RlbCgpIG1vZGVsTWVtb3J5IGlzIDAgb3IgaGFzIE5VTEwgcG9pbnRlcigpIik7Ci0gICAgICAgIHJldHVybiBCQURfVkFMVUU7Ci0gICAgfQorCiAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfc291bmRfbW9kZWwgKnNvdW5kX21vZGVsID0KICAgICAgICAgICAgIChzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9zb3VuZF9tb2RlbCAqKW1vZGVsTWVtb3J5LT5wb2ludGVyKCk7CiAKQEAgLTY1OSwxMSArNjUwLDYgQEAKICAgICBpZiAobUhhbEludGVyZmFjZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICBpZiAoZGF0YU1lbW9yeSA9PSAwIHx8IGRhdGFNZW1vcnktPnBvaW50ZXIoKSA9PSBOVUxMKSB7Ci0gICAgICAgIEFMT0dFKCJzdGFydFJlY29nbml0aW9uKCkgZGF0YU1lbW9yeSBpcyAwIG9yIGhhcyBOVUxMIHBvaW50ZXIoKSIpOwotICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOwotCi0gICAgfQogCiAgICAgc3RydWN0IHNvdW5kX3RyaWdnZXJfcmVjb2duaXRpb25fY29uZmlnICpjb25maWcgPQogICAgICAgICAgICAgKHN0cnVjdCBzb3VuZF90cmlnZ2VyX3JlY29nbml0aW9uX2NvbmZpZyAqKWRhdGFNZW1vcnktPnBvaW50ZXIoKTsKQEAgLTcyNSw2ICs3MTEsMjUgQEAKICAgICByZXR1cm4gTk9fRVJST1I7CiB9CiAKK3N0YXR1c190IFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpnZXRNb2RlbFN0YXRlKHNvdW5kX21vZGVsX2hhbmRsZV90IGhhbmRsZSkKK3sKKyAgICBBTE9HVigiZ2V0TW9kZWxTdGF0ZSgpIG1vZGVsIGhhbmRsZSAlZCIsIGhhbmRsZSk7CisgICAgaWYgKG1IYWxJbnRlcmZhY2UgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgQXV0b011dGV4IGxvY2sobUxvY2spOworICAgIHNwPE1vZGVsPiBtb2RlbCA9IGdldE1vZGVsKGhhbmRsZSk7CisgICAgaWYgKG1vZGVsID09IDApIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CisKKyAgICBpZiAobW9kZWwtPm1TdGF0ZSAhPSBNb2RlbDo6U1RBVEVfQUNUSVZFKSB7CisgICAgICAgIHJldHVybiBJTlZBTElEX09QRVJBVElPTjsKKyAgICB9CisKKyAgICByZXR1cm4gbUhhbEludGVyZmFjZS0+Z2V0TW9kZWxTdGF0ZShoYW5kbGUpOworfQorCiB2b2lkIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlOjpvbkNhbGxiYWNrRXZlbnQoY29uc3Qgc3A8Q2FsbGJhY2tFdmVudD4mIGV2ZW50KQogewogICAgIEFMT0dWKCJvbkNhbGxiYWNrRXZlbnQgdHlwZSAlZCIsIGV2ZW50LT5tVHlwZSk7CkBAIC05MTMsOCArOTE4LDkgQEAKICNkZWZpbmUgTE9HX1RBRyAiU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGVDbGllbnQiCiAKIFNvdW5kVHJpZ2dlckh3U2VydmljZTo6TW9kdWxlQ2xpZW50OjpNb2R1bGVDbGllbnQoY29uc3Qgc3A8TW9kdWxlPiYgbW9kdWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiYgY2xpZW50KQotIDogbU1vZHVsZShtb2R1bGUpLCBtQ2xpZW50KGNsaWVudCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpCisgOiBtTW9kdWxlKG1vZHVsZSksIG1DbGllbnQoY2xpZW50KSwgbU9wUGFja2FnZU5hbWUob3BQYWNrYWdlTmFtZSkKIHsKIH0KIApAQCAtOTM4LDcgKzk0NCw4IEBACiAKIHZvaWQgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmRldGFjaCgpIHsKICAgICBBTE9HVigiZGV0YWNoKCkiKTsKLSAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCisgICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQobU9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdVaWQoKSkpIHsKICAgICAgICAgcmV0dXJuOwogICAgIH0KQEAgLTk2MiwxMCArOTY5LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdW5kX21vZGVsX2hhbmRsZV90ICpoYW5kbGUpCiB7CiAgICAgQUxPR1YoImxvYWRTb3VuZE1vZGVsKCkgaGFuZGxlIik7Ci0gICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKG1PcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CisgICAgaWYgKGNoZWNrSU1lbW9yeShtb2RlbE1lbW9yeSkgIT0gTk9fRVJST1IpIHsKKyAgICAgICAgcmV0dXJuIEJBRF9WQUxVRTsKKyAgICB9CiAKICAgICBzcDxNb2R1bGU+IG1vZHVsZSA9IG1Nb2R1bGUucHJvbW90ZSgpOwogICAgIGlmIChtb2R1bGUgPT0gMCkgewpAQCAtOTc3LDcgKzk4OCw4IEBACiBzdGF0dXNfdCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6dW5sb2FkU291bmRNb2RlbChzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCiB7CiAgICAgQUxPR1YoInVubG9hZFNvdW5kTW9kZWwoKSBtb2RlbCBoYW5kbGUgJWQiLCBoYW5kbGUpOwotICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChtT3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgewogICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CiAgICAgfQpAQCAtOTkzLDEwICsxMDA1LDE0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSkKIHsKICAgICBBTE9HVigic3RhcnRSZWNvZ25pdGlvbigpIG1vZGVsIGhhbmRsZSAlZCIsIGhhbmRsZSk7Ci0gICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKG1PcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CisgICAgaWYgKGNoZWNrSU1lbW9yeShkYXRhTWVtb3J5KSAhPSBOT19FUlJPUikgeworICAgICAgICByZXR1cm4gQkFEX1ZBTFVFOworICAgIH0KIAogICAgIHNwPE1vZHVsZT4gbW9kdWxlID0gbU1vZHVsZS5wcm9tb3RlKCk7CiAgICAgaWYgKG1vZHVsZSA9PSAwKSB7CkBAIC0xMDA4LDcgKzEwMjQsOCBAQAogc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OnN0b3BSZWNvZ25pdGlvbihzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCiB7CiAgICAgQUxPR1YoInN0b3BSZWNvZ25pdGlvbigpIG1vZGVsIGhhbmRsZSAlZCIsIGhhbmRsZSk7Ci0gICAgaWYgKCFjYXB0dXJlSG90d29yZEFsbG93ZWQoSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1BpZCgpLAorICAgIGlmICghY2FwdHVyZUhvdHdvcmRBbGxvd2VkKG1PcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElQQ1RocmVhZFN0YXRlOjpzZWxmKCktPmdldENhbGxpbmdQaWQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nVWlkKCkpKSB7CiAgICAgICAgIHJldHVybiBQRVJNSVNTSU9OX0RFTklFRDsKICAgICB9CkBAIC0xMDIwLDYgKzEwMzcsMjIgQEAKICAgICByZXR1cm4gbW9kdWxlLT5zdG9wUmVjb2duaXRpb24oaGFuZGxlKTsKIH0KIAorc3RhdHVzX3QgU291bmRUcmlnZ2VySHdTZXJ2aWNlOjpNb2R1bGVDbGllbnQ6OmdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQoreworICAgIEFMT0dWKCJnZXRNb2RlbFN0YXRlKCkgbW9kZWwgaGFuZGxlICVkIiwgaGFuZGxlKTsKKyAgICBpZiAoIWNhcHR1cmVIb3R3b3JkQWxsb3dlZChtT3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJUENUaHJlYWRTdGF0ZTo6c2VsZigpLT5nZXRDYWxsaW5nUGlkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVBDVGhyZWFkU3RhdGU6OnNlbGYoKS0+Z2V0Q2FsbGluZ1VpZCgpKSkgeworICAgICAgICByZXR1cm4gUEVSTUlTU0lPTl9ERU5JRUQ7CisgICAgfQorCisgICAgc3A8TW9kdWxlPiBtb2R1bGUgPSBtTW9kdWxlLnByb21vdGUoKTsKKyAgICBpZiAobW9kdWxlID09IDApIHsKKyAgICAgICAgcmV0dXJuIE5PX0lOSVQ7CisgICAgfQorICAgIHJldHVybiBtb2R1bGUtPmdldE1vZGVsU3RhdGUoaGFuZGxlKTsKK30KKwogdm9pZCBTb3VuZFRyaWdnZXJId1NlcnZpY2U6Ok1vZHVsZUNsaWVudDo6c2V0Q2FwdHVyZVN0YXRlX2woYm9vbCBhY3RpdmUpCiB7CiAgICAgQUxPR1YoIk1vZHVsZUNsaWVudDo6c2V0Q2FwdHVyZVN0YXRlX2wgJWQiLCBhY3RpdmUpOwpkaWZmIC0tZ2l0IGEvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5oIGIvc2VydmljZXMvc291bmR0cmlnZ2VyL1NvdW5kVHJpZ2dlckh3U2VydmljZS5oCmluZGV4IDcwOGZjOTguLjQzYWQ2MTEgMTAwNjQ0Ci0tLSBhL3NlcnZpY2VzL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXJId1NlcnZpY2UuaAorKysgYi9zZXJ2aWNlcy9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VySHdTZXJ2aWNlLmgKQEAgLTQ3LDEwICs0NywxMiBAQAogICAgIHZpcnR1YWwgICAgICAgICAgICAgflNvdW5kVHJpZ2dlckh3U2VydmljZSgpOwogCiAgICAgLy8gSVNvdW5kVHJpZ2dlckh3U2VydmljZQotICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdE1vZHVsZXMoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMsCisgICAgdmlydHVhbCBzdGF0dXNfdCBsaXN0TW9kdWxlcyhjb25zdCBTdHJpbmcxNiYgb3BQYWNrYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm51bU1vZHVsZXMpOwogCi0gICAgdmlydHVhbCBzdGF0dXNfdCBhdHRhY2goY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgYXR0YWNoKGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IGhhbmRsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiYgY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwPElTb3VuZFRyaWdnZXI+JiBtb2R1bGUpOwogCkBAIC0xMjIsNiArMTI0LDcgQEAKICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSk7CiAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKIAogICAgICAgIHNwPFNvdW5kVHJpZ2dlckhhbEludGVyZmFjZT4gaGFsSW50ZXJmYWNlKCkgY29uc3QgeyByZXR1cm4gbUhhbEludGVyZmFjZTsgfQogICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yIGRlc2NyaXB0b3IoKSB7IHJldHVybiBtRGVzY3JpcHRvcjsgfQpAQCAtMTMyLDcgKzEzNSw4IEBACiAKICAgICAgICB2b2lkIHNldENhcHR1cmVTdGF0ZV9sKGJvb2wgYWN0aXZlKTsKIAotICAgICAgIHNwPE1vZHVsZUNsaWVudD4gYWRkQ2xpZW50KGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQpOworICAgICAgIHNwPE1vZHVsZUNsaWVudD4gYWRkQ2xpZW50KGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUpOwogCiAgICAgICAgdm9pZCBkZXRhY2goY29uc3Qgc3A8TW9kdWxlQ2xpZW50PiYgbW9kdWxlQ2xpZW50KTsKIApAQCAtMTU1LDcgKzE1OSw4IEBACiAgICAgcHVibGljOgogCiAgICAgICAgTW9kdWxlQ2xpZW50KGNvbnN0IHNwPE1vZHVsZT4mIG1vZHVsZSwKLSAgICAgICAgICAgICAgY29uc3Qgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4mIGNsaWVudCk7CisgICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQsCisgICAgICAgICAgICAgIGNvbnN0IFN0cmluZzE2JiBvcFBhY2thZ2VOYW1lKTsKIAogICAgICAgIHZpcnR1YWwgfk1vZHVsZUNsaWVudCgpOwogCkBAIC0xNjksNiArMTc0LDcgQEAKICAgICAgICB2aXJ0dWFsIHN0YXR1c190IHN0YXJ0UmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzcDxJTWVtb3J5PiYgZGF0YU1lbW9yeSk7CiAgICAgICAgdmlydHVhbCBzdGF0dXNfdCBzdG9wUmVjb2duaXRpb24oc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKKyAgICAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKTsKIAogICAgICAgIHZpcnR1YWwgc3RhdHVzX3QgZHVtcChpbnQgZmQsIGNvbnN0IFZlY3RvcjxTdHJpbmcxNj4mIGFyZ3MpOwogCkBAIC0xODgsNiArMTk0LDcgQEAKICAgICAgICAgbXV0YWJsZSBNdXRleCAgICAgICAgICAgICAgIG1Mb2NrOwogICAgICAgICB3cDxNb2R1bGU+ICAgICAgICAgICAgICAgICAgbU1vZHVsZTsKICAgICAgICAgc3A8SVNvdW5kVHJpZ2dlckNsaWVudD4gICAgIG1DbGllbnQ7CisgICAgICAgIGNvbnN0IFN0cmluZzE2ICAgICAgICAgICAgICBtT3BQYWNrYWdlTmFtZTsKICAgICB9OyAvLyBjbGFzcyBNb2R1bGVDbGllbnQKIAogICAgIGNsYXNzIENhbGxiYWNrVGhyZWFkIDogcHVibGljIFRocmVhZCB7CmRpZmYgLS1naXQgYS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5jcHAgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlci5jcHAKaW5kZXggMjUzMzJhNC4uZjViNGI1OSAxMDA2NDQKLS0tIGEvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXIuY3BwCisrKyBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VyLmNwcApAQCAtMzIsNiArMzIsNyBAQAogICAgIFVOTE9BRF9TT1VORF9NT0RFTCwKICAgICBTVEFSVF9SRUNPR05JVElPTiwKICAgICBTVE9QX1JFQ09HTklUSU9OLAorICAgIEdFVF9NT0RFTF9TVEFURSwKIH07CiAKIGNsYXNzIEJwU291bmRUcmlnZ2VyOiBwdWJsaWMgQnBJbnRlcmZhY2U8SVNvdW5kVHJpZ2dlcj4KQEAgLTExMyw2ICsxMTQsMTggQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKKyAgICB2aXJ0dWFsIHN0YXR1c190IGdldE1vZGVsU3RhdGUoc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlKQorICAgIHsKKyAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OworICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlcjo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZSgmaGFuZGxlLCBzaXplb2Yoc291bmRfbW9kZWxfaGFuZGxlX3QpKTsKKyAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEdFVF9NT0RFTF9TVEFURSwgZGF0YSwgJnJlcGx5KTsKKyAgICAgICAgaWYgKHN0YXR1cyA9PSBOT19FUlJPUikgeworICAgICAgICAgICAgc3RhdHVzID0gKHN0YXR1c190KXJlcGx5LnJlYWRJbnQzMigpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgfQorCiB9OwogCiBJTVBMRU1FTlRfTUVUQV9JTlRFUkZBQ0UoU291bmRUcmlnZ2VyLCAiYW5kcm9pZC5oYXJkd2FyZS5JU291bmRUcmlnZ2VyIik7CkBAIC0xNjksNiArMTgyLDE3IEBACiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgcmV0dXJuIE5PX0VSUk9SOwogICAgICAgICB9CisgICAgICAgIGNhc2UgR0VUX01PREVMX1NUQVRFOiB7CisgICAgICAgICAgICBDSEVDS19JTlRFUkZBQ0UoSVNvdW5kVHJpZ2dlciwgZGF0YSwgcmVwbHkpOworICAgICAgICAgICAgc291bmRfbW9kZWxfaGFuZGxlX3QgaGFuZGxlOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gVU5LTk9XTl9FUlJPUjsKKyAgICAgICAgICAgIHN0YXR1c190IHJldCA9IGRhdGEucmVhZCgmaGFuZGxlLCBzaXplb2Yoc291bmRfbW9kZWxfaGFuZGxlX3QpKTsKKyAgICAgICAgICAgIGlmIChyZXQgPT0gTk9fRVJST1IpIHsKKyAgICAgICAgICAgICAgICBzdGF0dXMgPSBnZXRNb2RlbFN0YXRlKGhhbmRsZSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgcmV0dXJuIEJCaW5kZXI6Om9uVHJhbnNhY3QoY29kZSwgZGF0YSwgcmVwbHksIGZsYWdzKTsKICAgICB9CmRpZmYgLS1naXQgYS9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAgYi9zb3VuZHRyaWdnZXIvSVNvdW5kVHJpZ2dlckh3U2VydmljZS5jcHAKaW5kZXggZDQ0ZjVjYi4uYmQxMDdiNCAxMDA2NDQKLS0tIGEvc291bmR0cmlnZ2VyL0lTb3VuZFRyaWdnZXJId1NlcnZpY2UuY3BwCisrKyBiL3NvdW5kdHJpZ2dlci9JU291bmRUcmlnZ2VySHdTZXJ2aWNlLmNwcApAQCAtNTAsNyArNTAsOCBAQAogICAgIHsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGxpc3RNb2R1bGVzKHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzLAorICAgIHZpcnR1YWwgc3RhdHVzX3QgbGlzdE1vZHVsZXMoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfZGVzY3JpcHRvciAqbW9kdWxlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpudW1Nb2R1bGVzKQogICAgIHsKICAgICAgICAgaWYgKG51bU1vZHVsZXMgPT0gTlVMTCB8fCAoKm51bU1vZHVsZXMgIT0gMCAmJiBtb2R1bGVzID09IE5VTEwpKSB7CkBAIC01OCw2ICs1OSw3IEBACiAgICAgICAgIH0KICAgICAgICAgUGFyY2VsIGRhdGEsIHJlcGx5OwogICAgICAgICBkYXRhLndyaXRlSW50ZXJmYWNlVG9rZW4oSVNvdW5kVHJpZ2dlckh3U2VydmljZTo6Z2V0SW50ZXJmYWNlRGVzY3JpcHRvcigpKTsKKyAgICAgICAgZGF0YS53cml0ZVN0cmluZzE2KG9wUGFja2FnZU5hbWUpOwogICAgICAgICB1bnNpZ25lZCBpbnQgbnVtTW9kdWxlc1JlcSA9IChtb2R1bGVzID09IE5VTEwpID8gMCA6ICpudW1Nb2R1bGVzOwogICAgICAgICBkYXRhLndyaXRlSW50MzIobnVtTW9kdWxlc1JlcSk7CiAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IHJlbW90ZSgpLT50cmFuc2FjdChMSVNUX01PRFVMRVMsIGRhdGEsICZyZXBseSk7CkBAIC03NywxMiArNzksMTQgQEAKICAgICAgICAgcmV0dXJuIHN0YXR1czsKICAgICB9CiAKLSAgICB2aXJ0dWFsIHN0YXR1c190IGF0dGFjaChjb25zdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBoYW5kbGUsCisgICAgdmlydHVhbCBzdGF0dXNfdCBhdHRhY2goY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QgaGFuZGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJDbGllbnQ+JiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3A8SVNvdW5kVHJpZ2dlcj4mIG1vZHVsZSkKICAgICB7CiAgICAgICAgIFBhcmNlbCBkYXRhLCByZXBseTsKICAgICAgICAgZGF0YS53cml0ZUludGVyZmFjZVRva2VuKElTb3VuZFRyaWdnZXJId1NlcnZpY2U6OmdldEludGVyZmFjZURlc2NyaXB0b3IoKSk7CisgICAgICAgIGRhdGEud3JpdGVTdHJpbmcxNihvcFBhY2thZ2VOYW1lKTsKICAgICAgICAgZGF0YS53cml0ZSgmaGFuZGxlLCBzaXplb2Yoc291bmRfdHJpZ2dlcl9tb2R1bGVfaGFuZGxlX3QpKTsKICAgICAgICAgZGF0YS53cml0ZVN0cm9uZ0JpbmRlcihJSW50ZXJmYWNlOjphc0JpbmRlcihjbGllbnQpKTsKICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gcmVtb3RlKCktPnRyYW5zYWN0KEFUVEFDSCwgZGF0YSwgJnJlcGx5KTsKQEAgLTEyMCw2ICsxMjQsMTEgQEAKICAgICBzd2l0Y2goY29kZSkgewogICAgICAgICBjYXNlIExJU1RfTU9EVUxFUzogewogICAgICAgICAgICAgQ0hFQ0tfSU5URVJGQUNFKElTb3VuZFRyaWdnZXJId1NlcnZpY2UsIGRhdGEsIHJlcGx5KTsKKyAgICAgICAgICAgIFN0cmluZzE2IG9wUGFja2FnZU5hbWU7CisgICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBkYXRhLnJlYWRTdHJpbmcxNigmb3BQYWNrYWdlTmFtZSk7CisgICAgICAgICAgICBpZiAoc3RhdHVzICE9IE5PX0VSUk9SKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIHN0YXR1czsKKyAgICAgICAgICAgIH0KICAgICAgICAgICAgIHVuc2lnbmVkIGludCBudW1Nb2R1bGVzUmVxID0gZGF0YS5yZWFkSW50MzIoKTsKICAgICAgICAgICAgIGlmIChudW1Nb2R1bGVzUmVxID4gTUFYX0lURU1TX1BFUl9MSVNUKSB7CiAgICAgICAgICAgICAgICAgbnVtTW9kdWxlc1JlcSA9IE1BWF9JVEVNU19QRVJfTElTVDsKQEAgLTEzMyw3ICsxNDIsNyBAQAogICAgICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKDApOwogICAgICAgICAgICAgICAgIHJldHVybiBOT19FUlJPUjsKICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0YXR1c190IHN0YXR1cyA9IGxpc3RNb2R1bGVzKG1vZHVsZXMsICZudW1Nb2R1bGVzKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IGxpc3RNb2R1bGVzKG9wUGFja2FnZU5hbWUsIG1vZHVsZXMsICZudW1Nb2R1bGVzKTsKICAgICAgICAgICAgIHJlcGx5LT53cml0ZUludDMyKHN0YXR1cyk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihudW1Nb2R1bGVzKTsKICAgICAgICAgICAgIEFMT0dWKCJMSVNUX01PRFVMRVMgc3RhdHVzICVkIGdvdCBudW1Nb2R1bGVzICVkIiwgc3RhdHVzLCBudW1Nb2R1bGVzKTsKQEAgLTE1MSwxMiArMTYwLDE3IEBACiAKICAgICAgICAgY2FzZSBBVFRBQ0g6IHsKICAgICAgICAgICAgIENIRUNLX0lOVEVSRkFDRShJU291bmRUcmlnZ2VySHdTZXJ2aWNlLCBkYXRhLCByZXBseSk7CisgICAgICAgICAgICBTdHJpbmcxNiBvcFBhY2thZ2VOYW1lOworICAgICAgICAgICAgc3RhdHVzX3Qgc3RhdHVzID0gZGF0YS5yZWFkU3RyaW5nMTYoJm9wUGFja2FnZU5hbWUpOworICAgICAgICAgICAgaWYgKHN0YXR1cyAhPSBOT19FUlJPUikgeworICAgICAgICAgICAgICAgIHJldHVybiBzdGF0dXM7CisgICAgICAgICAgICB9CiAgICAgICAgICAgICBzb3VuZF90cmlnZ2VyX21vZHVsZV9oYW5kbGVfdCBoYW5kbGU7CiAgICAgICAgICAgICBkYXRhLnJlYWQoJmhhbmRsZSwgc2l6ZW9mKHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90KSk7CiAgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyQ2xpZW50PiBjbGllbnQgPQogICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfY2FzdDxJU291bmRUcmlnZ2VyQ2xpZW50PihkYXRhLnJlYWRTdHJvbmdCaW5kZXIoKSk7CiAgICAgICAgICAgICBzcDxJU291bmRUcmlnZ2VyPiBtb2R1bGU7Ci0gICAgICAgICAgICBzdGF0dXNfdCBzdGF0dXMgPSBhdHRhY2goaGFuZGxlLCBjbGllbnQsIG1vZHVsZSk7CisgICAgICAgICAgICBzdGF0dXMgPSBhdHRhY2gob3BQYWNrYWdlTmFtZSwgaGFuZGxlLCBjbGllbnQsIG1vZHVsZSk7CiAgICAgICAgICAgICByZXBseS0+d3JpdGVJbnQzMihzdGF0dXMpOwogICAgICAgICAgICAgaWYgKG1vZHVsZSAhPSAwKSB7CiAgICAgICAgICAgICAgICAgcmVwbHktPndyaXRlSW50MzIoMSk7CmRpZmYgLS1naXQgYS9zb3VuZHRyaWdnZXIvU291bmRUcmlnZ2VyLmNwcCBiL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuY3BwCmluZGV4IDI4OWI3YjEuLjk3MDhlYTcgMTAwNjQ0Ci0tLSBhL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuY3BwCisrKyBiL3NvdW5kdHJpZ2dlci9Tb3VuZFRyaWdnZXIuY3BwCkBAIC04MCwxOSArODAsMjEgQEAKIH0KIAogLy8gU3RhdGljIG1ldGhvZHMKLXN0YXR1c190IFNvdW5kVHJpZ2dlcjo6bGlzdE1vZHVsZXMoc3RydWN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2Rlc2NyaXB0b3IgKm1vZHVsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykKK3N0YXR1c190IFNvdW5kVHJpZ2dlcjo6bGlzdE1vZHVsZXMoY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBzb3VuZF90cmlnZ2VyX21vZHVsZV9kZXNjcmlwdG9yICptb2R1bGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqbnVtTW9kdWxlcykKIHsKICAgICBBTE9HVigibGlzdE1vZHVsZXMoKSIpOwogICAgIGNvbnN0IHNwPElTb3VuZFRyaWdnZXJId1NlcnZpY2U+IHNlcnZpY2UgPSBnZXRTb3VuZFRyaWdnZXJId1NlcnZpY2UoKTsKICAgICBpZiAoc2VydmljZSA9PSAwKSB7CiAgICAgICAgIHJldHVybiBOT19JTklUOwogICAgIH0KLSAgICByZXR1cm4gc2VydmljZS0+bGlzdE1vZHVsZXMobW9kdWxlcywgbnVtTW9kdWxlcyk7CisgICAgcmV0dXJuIHNlcnZpY2UtPmxpc3RNb2R1bGVzKG9wUGFja2FnZU5hbWUsIG1vZHVsZXMsIG51bU1vZHVsZXMpOwogfQogCi1zcDxTb3VuZFRyaWdnZXI+IFNvdW5kVHJpZ2dlcjo6YXR0YWNoKGNvbnN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U291bmRUcmlnZ2VyQ2FsbGJhY2s+JiBjYWxsYmFjaykKK3NwPFNvdW5kVHJpZ2dlcj4gU291bmRUcmlnZ2VyOjphdHRhY2goY29uc3QgU3RyaW5nMTYmIG9wUGFja2FnZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNvdW5kX3RyaWdnZXJfbW9kdWxlX2hhbmRsZV90IG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3A8U291bmRUcmlnZ2VyQ2FsbGJhY2s+JiBjYWxsYmFjaykKIHsKICAgICBBTE9HVigiYXR0YWNoKCkiKTsKICAgICBzcDxTb3VuZFRyaWdnZXI+IHNvdW5kVHJpZ2dlcjsKQEAgLTEwMSw3ICsxMDMsOCBAQAogICAgICAgICByZXR1cm4gc291bmRUcmlnZ2VyOwogICAgIH0KICAgICBzb3VuZFRyaWdnZXIgPSBuZXcgU291bmRUcmlnZ2VyKG1vZHVsZSwgY2FsbGJhY2spOwotICAgIHN0YXR1c190IHN0YXR1cyA9IHNlcnZpY2UtPmF0dGFjaChtb2R1bGUsIHNvdW5kVHJpZ2dlciwgc291bmRUcmlnZ2VyLT5tSVNvdW5kVHJpZ2dlcik7CisgICAgc3RhdHVzX3Qgc3RhdHVzID0gc2VydmljZS0+YXR0YWNoKG9wUGFja2FnZU5hbWUsIG1vZHVsZSwgc291bmRUcmlnZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VuZFRyaWdnZXItPm1JU291bmRUcmlnZ2VyKTsKIAogICAgIGlmIChzdGF0dXMgPT0gTk9fRVJST1IgJiYgc291bmRUcmlnZ2VyLT5tSVNvdW5kVHJpZ2dlciAhPSAwKSB7CiAgICAgICAgIElJbnRlcmZhY2U6OmFzQmluZGVyKHNvdW5kVHJpZ2dlci0+bUlTb3VuZFRyaWdnZXIpLT5saW5rVG9EZWF0aChzb3VuZFRyaWdnZXIpOwpAQCAtMTg4LDYgKzE5MSwxNSBAQAogICAgIHJldHVybiBtSVNvdW5kVHJpZ2dlci0+c3RvcFJlY29nbml0aW9uKGhhbmRsZSk7CiB9CiAKK3N0YXR1c190IFNvdW5kVHJpZ2dlcjo6Z2V0TW9kZWxTdGF0ZShzb3VuZF9tb2RlbF9oYW5kbGVfdCBoYW5kbGUpCit7CisgICAgTXV0ZXg6OkF1dG9sb2NrIF9sKG1Mb2NrKTsKKyAgICBpZiAobUlTb3VuZFRyaWdnZXIgPT0gMCkgeworICAgICAgICByZXR1cm4gTk9fSU5JVDsKKyAgICB9CisgICAgcmV0dXJuIG1JU291bmRUcmlnZ2VyLT5nZXRNb2RlbFN0YXRlKGhhbmRsZSk7Cit9CisKIC8vIEJwU291bmRUcmlnZ2VyQ2xpZW50CiB2b2lkIFNvdW5kVHJpZ2dlcjo6b25SZWNvZ25pdGlvbkV2ZW50KGNvbnN0IHNwPElNZW1vcnk+JiBldmVudE1lbW9yeSkKIHsK